fldigi-4.2.05/0000775000175000017500000000000014611714004010041 500000000000000fldigi-4.2.05/src/0000775000175000017500000000000014611714005010631 500000000000000fldigi-4.2.05/src/dominoex/0000775000175000017500000000000014611714005012453 500000000000000fldigi-4.2.05/src/dominoex/dominoex.cxx0000664000175000017500000005225714611711171014755 00000000000000// ---------------------------------------------------------------------------- // // dominoex.cxx -- DominoEX modem // // Copyright (C) 2008-20012 // David Freese // Hamish Moffatt // John Phelps // // based on code in gmfsk // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "confdialog.h" #include "status.h" #include "dominoex.h" #include "trx.h" #include "fl_digi.h" #include "filters.h" #include "misc.h" #include "sound.h" #include "mfskvaricode.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_MODEM); static char dommsg[80]; static double s2nvals[500]; static int s2nptr = 0; static std::map mupsksec2pri; bool usingFEC = false; void dominoex::tx_init() { txstate = TX_STATE_PREAMBLE; txprevtone = 0; Mu_bitstate = 0; counter = 0; txphase = 0; strSecXmtText = progdefaults.secText; if (strSecXmtText.length() == 0) strSecXmtText = "fldigi " PACKAGE_VERSION " "; videoText(); } void dominoex::rx_init() { synccounter = 0; symcounter = 0; Mu_symcounter = 0; met1 = 0.0; met2 = 0.0; counter = 0; phase[0] = 0.0; for (int i = 0; i < MAXFFTS; i++) phase[i+1] = 0.0; put_MODEstatus(mode); put_sec_char(0); syncfilter->reset(); Mu_datashreg = 1; staticburst = false; sig = noise = 6; } void dominoex::reset_filters() { // fft filter at first IF frequency fft->create_filter( (FIRSTIF - 0.5 * progdefaults.DOMINOEX_BW * bandwidth) / samplerate, (FIRSTIF + 0.5 * progdefaults.DOMINOEX_BW * bandwidth)/ samplerate ); for (int i = 0; i < MAXFFTS; i++) { if (binsfft[i]) delete binsfft[i]; binsfft[i] = 0; } if (slowcpu) { extones = 4; paths = 3; } else { extones = NUMTONES / 2; paths = 5; } lotone = basetone - extones * doublespaced; hitone = basetone + NUMTONES * doublespaced + extones * doublespaced; numbins = hitone - lotone; for (int i = 0; i < paths; i++)//MAXFFTS; i++) binsfft[i] = new sfft (symlen, lotone, hitone); filter_reset = false; } void dominoex::restart() { filter_reset = true; } void dominoex::init() { if (mupsksec2pri.empty()) MuPsk_sec2pri_init(); modem::init(); // reset_filters(); rx_init(); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); set_scope_mode(Digiscope::DOMDATA); } void dominoex::MuPsk_sec2pri_init(void) { int chars[] = { 'A', 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, // À, Á, Â, Ã, Ä, Å 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, -1, // à, á, â, ã, ä, å 'B', 0xdf, -1, // ß 'C', 0xc7, 0xe7, 0xa9, -1, // Ç, ç, ©, 'D', 0xd0, 0xb0, -1, // Ð, ° 'E', 0xc6, 0xe6, 0xc8, 0xc9, 0xca, 0xcb, // Æ, æ, È, É, Ê, Ë 0xe8, 0xe9, 0xea, 0xeb, -1, // è, é, ê, ë 'F', 0x192, -1, // ƒ 'I', 0xcc, 0xcd, 0xce, 0xcf, 0xec, 0xed, // Ì, Í, Î, Ï, ì, í 0xee, 0xef, 0xa1, -1, // î, ï, ¡ 'L', 0xa3, -1, // £ 'N', 0xd1, 0xf1, -1, // Ñ, ñ 'O', 0xf4, 0xf6, 0xf2, 0xd6, 0xf3, 0xd3, // ô, ö, ò, Ö, ó, Ó 0xd4, 0xd2, 0xf5, 0xd5, -1, // Ô, Ò, õ, Õ 'R', 0xae, -1, // ® 'U', 0xd9, 0xda, 0xdb, 0xdc, 0xf9, 0xfa, // Ù, Ú, Û, Ü, ù, ú 0xfb, 0xfc, -1, // û, ü 'X', 0xd7, -1, // × 'Y', 0xff, 0xfd, 0xdd, -1, // ÿ, ý, Ý '0', 0xd8, -1, // Ø '1', 0xb9, -1, // ¹ '2', 0xb2, -1, // ² '3', 0xb3, -1, // ³ '?', 0xbf, -1, // ¿ '!', 0xa1, -1, // ¡ '<', 0xab, -1, // « '>', 0xbb, -1, // » '{', '(', -1, '}', ')', -1, '|', '\\' }; int c = chars[0]; for (size_t i = 1; i < sizeof(chars)/sizeof(*chars); i++) { if (chars[i] != -1) mupsksec2pri[chars[i]] = c; else c = chars[++i]; } } dominoex::~dominoex() { if (hilbert) delete hilbert; for (int i = 0; i < MAXFFTS; i++) { if (binsfft[i]) delete binsfft[i]; binsfft[i] = 0; } for (int i = 0; i < SCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; } if (syncfilter) delete syncfilter; if (pipe) delete [] pipe; if (fft) delete fft; if (MuPskRxinlv) delete MuPskRxinlv; if (MuPskTxinlv) delete MuPskTxinlv; if (MuPskDec) delete MuPskDec; if (MuPskEnc) delete MuPskEnc; } dominoex::dominoex(trx_mode md) { cap |= CAP_REV; mode = md; switch (mode) { // 11.025 kHz modes case MODE_DOMINOEX5: symlen = 2048; doublespaced = 2; samplerate = 11025; break; case MODE_DOMINOEX11: symlen = 1024; doublespaced = 1; samplerate = 11025; break; case MODE_DOMINOEX22: symlen = 512; doublespaced = 1; samplerate = 11025; break; // 8kHz modes case MODE_DOMINOEXMICRO: symlen = 4000; doublespaced = 1; samplerate = 8000; break; case MODE_DOMINOEX4: symlen = 2048; doublespaced = 2; samplerate = 8000; break; case MODE_DOMINOEX8: symlen = 1024; doublespaced = 2; samplerate = 8000; break; case MODE_DOMINOEX16: symlen = 512; doublespaced = 1; samplerate = 8000; break; // experimental case MODE_DOMINOEX44: symlen = 256; doublespaced = 2; samplerate = 11025; break; case MODE_DOMINOEX88: symlen = 128; doublespaced = 1; samplerate = 11025; break; default: // EX8 symlen = 1024; doublespaced = 2; samplerate = 8000; } tonespacing = 1.0 * samplerate * doublespaced / symlen; bandwidth = NUMTONES * tonespacing; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); // fft filter at first if frequency fft = new fftfilt( (FIRSTIF - 0.5 * progdefaults.DOMINOEX_BW * bandwidth) / samplerate, (FIRSTIF + 0.5 * progdefaults.DOMINOEX_BW * bandwidth)/ samplerate, 1024 ); basetone = (int)floor(BASEFREQ * symlen / samplerate + 0.5); slowcpu = progdefaults.slowcpu; for (int i = 0; i < MAXFFTS; i++) binsfft[i] = 0; reset_filters(); for (int i = 0; i < SCOPESIZE; i++) vidfilter[i] = new Cmovavg(16); syncfilter = new Cmovavg(16); twosym = 2 * symlen; pipe = new domrxpipe[twosym]; scopedata.alloc(SCOPESIZE); videodata.alloc(MAXFFTS * numbins); pipeptr = 0; symcounter = 0; Mu_symcounter = 0; metric = 0.0; for (int n = 0; n < 500; n++) { s2nvals[n] = -20; } fragmentsize = symlen; s2n = 0.0; prev1symbol = prev2symbol = 0; MuPskEnc = new encoder (NASA_K, POLY1, POLY2); MuPskDec = new viterbi (NASA_K, POLY1, POLY2); MuPskDec->settraceback (45); MuPskDec->setchunksize (1); MuPskTxinlv = new interleave (4, 4, INTERLEAVE_FWD); MuPskRxinlv = new interleave (4, 4, INTERLEAVE_REV); Mu_bitstate = 0; Mu_symbolpair[0] = Mu_symbolpair[1] = 0; Mu_datashreg = 1; // init(); } //===================================================================== // rx modules cmplx dominoex::mixer(int n, cmplx in) { cmplx z; double f; // first IF mixer (n == 0) plus // MAXFFTS mixers are supported each separated by tonespacing/paths // n == 1, 2, 3, 4 ... MAXFFTS if (n == 0) f = frequency - FIRSTIF; else f = FIRSTIF - BASEFREQ - bandwidth / 2.0 + tonespacing * (1.0 * (n - 1) / paths ); z = cmplx( cos(phase[n]), sin(phase[n])); z = z * in; phase[n] -= TWOPI * f / samplerate; if (phase[n] < 0) phase[n] += TWOPI; return z; } void dominoex::recvchar(int c) { if (!progStatus.sqlonoff || metric > progStatus.sldrSquelchValue) { if (c == -1) return; if (c & 0x100) put_sec_char(c & 0xFF); else put_rx_char(c & 0xFF); } } void dominoex::decodeDomino(int c) { int sym, ch; // If the new symbol is the start of a new character (MSB is low), complete the previous character if (!(c & 0x8)) { if (symcounter <= MAX_VARICODE_LEN) { sym = 0; for (int i = 0; i < symcounter; i++) sym |= symbolbuf[i] << (4 * i); ch = dominoex_varidec(sym); if (!progdefaults.DOMINOEX_FEC) if (!staticburst && !outofrange) recvchar(ch); } symcounter = 0; } // Add to the symbol buffer. Position 0 is the newest symbol. for (int i = MAX_VARICODE_LEN-1; i > 0; i--) symbolbuf[i] = symbolbuf[i-1]; symbolbuf[0] = c; // Increment the counter, but clamp at max+1 to avoid overflow symcounter++; if (symcounter > MAX_VARICODE_LEN + 1) symcounter = MAX_VARICODE_LEN + 1; } void dominoex::decodesymbol() { int c; double fdiff; // Decode the IFK+ sequence, which results in a single nibble fdiff = currsymbol - prev1symbol; if (reverse) fdiff = -fdiff; fdiff /= doublespaced; fdiff /= paths; // if (fabs(fdiff) > 17) // outofrange = true; // else outofrange = false; c = (int)floor(fdiff + .5) - 2; if (c < 0) c += NUMTONES; decodeDomino(c); decodeMuPskEX(c); } int dominoex::harddecode() { double x, max = 0.0; int symbol = 0; double avg = 0.0; bool cwi[paths * numbins]; double cwmag; for (int i = 0; i < paths * numbins; i++) avg += abs(pipe[pipeptr].vector[i]); avg /= (paths * numbins); if (avg < 1e-10) avg = 1e-10; int numtests = 10; int count = 0; for (int i = 0; i < paths * numbins; i++) { cwmag = 0.0; count = 0; for (int j = 1; j <= numtests; j++) { int p = pipeptr - j; if (p < 0) p += twosym; cwmag = abs(pipe[j].vector[i])/numtests; if (cwmag >= 50.0 * (1.0 - progdefaults.ThorCWI) * avg) count++; } cwi[i] = (count == numtests); } for (int i = 0; i < (paths * numbins); i++) { if (cwi[i] == false) { x = abs(pipe[pipeptr].vector[i]); avg += x; if (x > max) { max = x; symbol = i; } } } avg /= (paths * numbins); staticburst = (max / avg < 1.2); return symbol; } void dominoex::update_syncscope() { double max = 0, min = 1e6, range, mag; // dom waterfall memset(videodata, 0, (paths * numbins) * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (int i = 0; i < (paths * numbins); i++ ) { mag = abs(pipe[pipeptr].vector[i]); if (max < mag) max = mag; if (min > mag) min = mag; } range = max - min; for (int i = 0; i < (paths * numbins); i++ ) { if (range > 2) { mag = (abs(pipe[pipeptr].vector[i]) - min) / range + 0.0001; mag = 1 + 2 * log10(mag); if (mag < 0) mag = 0; } else mag = 0; videodata[(i + paths * numbins / 2)/2] = 255*mag; } } set_video(videodata, (paths * numbins), false); videodata.next(); // set_scope(scopedata, twosym); // 64 data points is sufficient to show the signal progression through the // convolution filter. memset(scopedata, 0, SCOPESIZE * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (unsigned int i = 0, j = 0; i < SCOPESIZE; i++) { j = (pipeptr + i * twosym / SCOPESIZE + 1) % (twosym); scopedata[i] = vidfilter[i]->run(abs(pipe[j].vector[prev1symbol])); } } set_scope(scopedata, SCOPESIZE); scopedata.next(); } void dominoex::synchronize() { // int syn = -1; double syn = -1; double val, max = 0.0; if (staticburst == true) return; if (currsymbol == prev1symbol) return; if (prev1symbol == prev2symbol) return; for (unsigned int i = 0, j = pipeptr; i < twosym; i++) { val = abs(pipe[j].vector[prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % twosym; } syn = syncfilter->run(syn); synccounter += (int) floor(1.0 * (syn - symlen) / NUMTONES + 0.5); update_syncscope(); } void dominoex::eval_s2n() { double s = abs(pipe[pipeptr].vector[currsymbol]); double n = (NUMTONES - 1 ) * abs(pipe[(pipeptr + symlen) % twosym].vector[currsymbol]); sig = decayavg( sig, s, abs( s - sig) > 4 ? 4 : 32); noise = decayavg( noise, n, 64); if (noise == 0) noise = sig / 1000.0; else s2n = 20*log10(sig / noise) - 6; // metric = 4 * s2n; // To partially offset the increase of noise by (THORNUMTONES -1) // in the noise calculation above, // add 15*log10(THORNUMTONES -1) = 18.4, and multiply by 6 metric = 6 * (s2n + 18.4); metric = metric < 0 ? 0 : metric > 100 ? 100 : metric; display_metric(metric); s2nvals[s2nptr] = s2n; ++s2nptr; if (s2nptr == 100) s2nptr = 0; double maxs2n = -20; for (int n = 0; n < 500; n++) { if (s2nvals[n] > maxs2n) maxs2n = s2nvals[n]; } if (maxs2n > -12) { if (metric >= progStatus.sldrSquelchValue) { snprintf(dommsg, sizeof(dommsg), "s/n %3.0f dB", maxs2n ); put_Status1(dommsg, 15, STATUS_CLEAR); } } } int dominoex::rx_process(const double *buf, int len) { cmplx zref, z, *zp; cmplx zarray[1]; int n; if (filter_reset) reset_filters(); if (slowcpu != progdefaults.slowcpu) { slowcpu = progdefaults.slowcpu; reset_filters(); } while (len) { // create analytic signal at first IF zref = cmplx( *buf, *buf ); buf++; hilbert->run(zref, zref); zref = mixer(0, zref); if (progdefaults.DOMINOEX_FILTER) { // filter using fft convolution n = fft->run(zref, &zp); } else { zarray[0] = zref; zp = zarray; n = 1; } if (n) { for (int i = 0; i < n; i++) { // process MAXFFTS sets of sliding FFTs spaced at 1/MAXFFTS bin intervals each of which // is a matched filter for the current symbol length for (int j = 0; j < paths; j++) { // shift in frequency to base band for the sliding DFTs z = mixer(j + 1, zp[i]); // copy current vector to the pipe interleaving the FFT vectors binsfft[j]->run(z, pipe[pipeptr].vector + j, paths ); } if (--synccounter <= 0) { synccounter = symlen; currsymbol = harddecode(); decodesymbol(); synchronize(); // update_syncscope(); eval_s2n(); prev2symbol = prev1symbol; prev1symbol = currsymbol; } pipeptr++; if (pipeptr >= twosym) pipeptr = 0; } } --len; } return 0; } //===================================================================== // dominoex tx modules int dominoex::get_secondary_char() { static unsigned int cptr = 0; char chr; if (cptr >= strSecXmtText.length()) cptr = 0; chr = strSecXmtText[cptr++]; put_sec_char( chr ); return chr; } void dominoex::sendtone(int tone, int duration) { double f, phaseincr; f = (tone + 0.5) * tonespacing + get_txfreq_woffset() - bandwidth / 2.0; phaseincr = TWOPI * f / samplerate; for (int j = 0; j < duration; j++) { for (int i = 0; i < symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, symlen); } } void dominoex::sendsymbol(int sym) { //static int first = 0; cmplx z; int tone; tone = (txprevtone + 2 + sym) % NUMTONES; txprevtone = tone; if (reverse) tone = (NUMTONES - 1) - tone; sendtone(tone, 1); } void dominoex::sendchar(unsigned char c, int secondary) { if (progdefaults.DOMINOEX_FEC) sendMuPskEX(c, secondary); else { unsigned char *code = dominoex_varienc(c, secondary); sendsymbol(code[0]); // Continuation nibbles all have the MSB set for (int sym = 1; sym < 3; sym++) { if (code[sym] & 0x8) sendsymbol(code[sym]); else break; } } if (!secondary) put_echo_char(c); } void dominoex::sendidle() { sendchar(0, 1); // } void dominoex::sendsecondary() { int c = get_secondary_char(); sendchar(c & 0xFF, 1); } void dominoex::flushtx() { // if (progdefaults.DOMINOEX_FEC) // MuPskFlushTx(); // else { // flush the varicode decoder at the receiver end for (int i = 0; i < 4; i++) sendidle(); // } } int dominoex::tx_process() { modem::tx_process(); int i; switch (txstate) { case TX_STATE_PREAMBLE: if (progdefaults.DOMINOEX_FEC) MuPskClearbits(); sendidle(); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r', 0); if (mode != MODE_DOMINOEXMICRO) { sendchar(2, 0); // STX sendchar('\r', 0); } txstate = TX_STATE_DATA; break; case TX_STATE_DATA: i = get_tx_char(); if (i == GET_TX_CHAR_NODATA) sendsecondary(); else if (i == GET_TX_CHAR_ETX) txstate = TX_STATE_END; else sendchar(i, 0); if (stopflag) txstate = TX_STATE_END; break; case TX_STATE_END: sendchar('\r', 0); if (mode != MODE_DOMINOEXMICRO) { sendchar(4, 0); // EOT sendchar('\r', 0); } txstate = TX_STATE_FLUSH; break; case TX_STATE_FLUSH: flushtx(); return -1; } return 0; } //============================================================================= // MultiPsk compatible FEC methods //============================================================================= //============================================================================= // Varicode support methods // MultiPsk varicode is based on a modified MFSK varicode table in which // Character substition is used for secondary text. The resulting table does // NOT contain the full ASCII character set as the primary. Many of the // control codes and characters above 0x80 are lost. //============================================================================= // Convert from Secondary to Primary character unsigned char dominoex::MuPskSec2Pri(int c) { if (c >= 'a' && c <= 'z') c -= 32; c = mupsksec2pri.find(c) != mupsksec2pri.end() ? mupsksec2pri[c] : c; if (c >= 'A' && c <= 'Z') c = c - 'A' + 127; else if (c >= '0' && c <= '9') c = c - '0' + 14; else if (c >= ' ' && c <= '"') c = c - ' ' + 1; else if (c == '_') c = 4; else if (c >= '$' && c <= '&') c = c - '$' + 5; else if (c >= '\'' && c <= '*') c = c - '\'' + 9; else if (c >= '+' && c <= '/') c = c - '+' + 24; else if (c >= ':' && c <= '<') c = c - ':' + 29; else if (c >= '=' && c <= '@') c = c - '=' + 153; else if (c >= '[' && c <= ']') c = c - '[' + 157; else c = '_'; return c; } // Convert Primary to Split Primary / Secondary character unsigned int dominoex::MuPskPriSecChar(unsigned int c) { if (c >= 127 && c < 153) c += ('A' - 127) + 0x100; else if (c >=14 && c < 24) c += ('0' - 14) + 0x100; else if (c >= 1 && c < 4) c += (' ' - 1) + 0x100; else if (c == 4) c = '_' + 0x100; else if (c >= 5 && c < 8) c += ('$' - 5) + 0x100; else if (c >= 9 && c < 13) c += ('\'' - 9) + 0x100; else if (c >= 24 && c < 29) c += ('+' - 24) + 0x100; else if (c >= 29 && c < 32) c += (':' - 29) + 0x100; else if (c >= 153 && c < 157) c += ('=' - 153) + 0x100; else if (c >= 157 && c < 160) c += ('[' - 157) + 0x100; return c; } //============================================================================= // Receive //============================================================================= void dominoex::decodeMuPskSymbol(unsigned char symbol) { int c, ch, met; Mu_symbolpair[0] = Mu_symbolpair[1]; Mu_symbolpair[1] = symbol; Mu_symcounter = Mu_symcounter ? 0 : 1; if (Mu_symcounter) return; c = MuPskDec->decode (Mu_symbolpair, &met); if (c == -1) return; if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) return; Mu_datashreg = (Mu_datashreg << 1) | !!c; if ((Mu_datashreg & 7) == 1) { ch = varidec(Mu_datashreg >> 1); if (progdefaults.DOMINOEX_FEC) recvchar(MuPskPriSecChar(ch)); Mu_datashreg = 1; } } void dominoex::decodeMuPskEX(int ch) { unsigned char symbols[4]; int c = ch; for (int i = 0; i < 4; i++) { if ((c & 1) == 1) symbols[3-i] = 255; else symbols[3-i] = 1;//-255; c = c / 2; } if (staticburst == true || outofrange == true) symbols[3] = symbols[2] = symbols[1] = symbols[0] = 0; MuPskRxinlv->symbols(symbols); for (int i = 0; i < 4; i++) decodeMuPskSymbol(symbols[i]); } //============================================================================= // Transmit //============================================================================= void dominoex::MuPskFlushTx() { // flush the varicode decoder at the other end // flush the convolutional encoder and interleaver sendsymbol(1); for (int i = 0; i < 107; i++) sendsymbol(0); Mu_bitstate = 0; } void dominoex::MuPskClearbits() { int data = MuPskEnc->encode(0); for (int k = 0; k < 100; k++) { for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); Mu_bitstate++; if (Mu_bitstate == 4) { MuPskTxinlv->bits(&bitshreg); Mu_bitstate = 0; bitshreg = 0; } } } } // Send MultiPsk FEC varicode with minimalist interleaver void dominoex::sendMuPskEX(unsigned char c, int secondary) { const char *code; if (secondary == 1) c = MuPskSec2Pri(c); else { if (c == 10) return; if ( (c >= 1 && c <= 7) || (c >= 9 && c <= 12) || (c >= 14 && c <= 31) || (c >= 127 && c <= 159)) c = '_'; } code = varienc(c); // if (secondary == 0) // LOG_DEBUG("char=%hhu, code=\"%s\"", c, code); while (*code) { int data = MuPskEnc->encode(*code++ - '0'); // LOG_DEBUG("data=%d", data; for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); Mu_bitstate++; if (Mu_bitstate == 4) { MuPskTxinlv->bits(&bitshreg); // LOG_DEBUG("bitshreg=%d", bitshreg); sendsymbol(bitshreg); // decodeMuPskEX(bitshreg); Mu_bitstate = 0; bitshreg = 0; } } } } fldigi-4.2.05/src/dominoex/dominovar.cxx0000664000175000017500000006133314532252172015127 00000000000000/* * dominovar.cxx -- DominoEX Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . */ #include #include "dominovar.h" static unsigned char varicode[][3] = { /* Primary alphabet */ { 1,15, 9}, { 1,15,10}, { 1,15,11}, { 1,15,12}, { 1,15,13}, { 1,15,14}, { 1,15,15}, { 2, 8, 8}, { 2,12, 0}, { 2, 8, 9}, { 2, 8,10}, { 2, 8,11}, { 2, 8,12}, { 2,13, 0}, { 2, 8,13}, { 2, 8,14}, { 2, 8,15}, { 2, 9, 8}, { 2, 9, 9}, { 2, 9,10}, { 2, 9,11}, { 2, 9,12}, { 2, 9,13}, { 2, 9,14}, { 2, 9,15}, { 2,10, 8}, { 2,10, 9}, { 2,10,10}, { 2,10,11}, { 2,10,12}, { 2,10,13}, { 2,10,14}, { 0, 0, 0}, { 7,11, 0}, { 0, 8,14}, { 0,10,11}, { 0, 9,10}, { 0, 9, 9}, { 0, 8,15}, { 7,10, 0}, { 0, 8,12}, { 0, 8,11}, { 0, 9,13}, { 0, 8, 8}, { 2,11, 0}, { 7,14, 0}, { 7,13, 0}, { 0, 8, 9}, { 3,15, 0}, { 4,10, 0}, { 4,15, 0}, { 5, 9, 0}, { 6, 8, 0}, { 5,12, 0}, { 5,14, 0}, { 6,12, 0}, { 6,11, 0}, { 6,14, 0}, { 0, 8,10}, { 0, 8,13}, { 0,10, 8}, { 7,15, 0}, { 0, 9,15}, { 7,12, 0}, { 0, 9, 8}, { 3, 9, 0}, { 4,14, 0}, { 3,12, 0}, { 3,14, 0}, { 3, 8, 0}, { 4,12, 0}, { 5, 8, 0}, { 5,10, 0}, { 3,10, 0}, { 7, 8, 0}, { 6,10, 0}, { 4,11, 0}, { 4, 8, 0}, { 4,13, 0}, { 3,11, 0}, { 4, 9, 0}, { 6,15, 0}, { 3,13, 0}, { 2,15, 0}, { 2,14, 0}, { 5,11, 0}, { 6,13, 0}, { 5,13, 0}, { 5,15, 0}, { 6, 9, 0}, { 7, 9, 0}, { 0,10,14}, { 0,10, 9}, { 0,10,15}, { 0,10,10}, { 0, 9,12}, { 0, 9,11}, { 4, 0, 0}, { 1,11, 0}, { 0,12, 0}, { 0,11, 0}, { 1, 0, 0}, { 0,15, 0}, { 1, 9, 0}, { 0,10, 0}, { 5, 0, 0}, { 2,10, 0}, { 1,14, 0}, { 0, 9, 0}, { 0,14, 0}, { 6, 0, 0}, { 3, 0, 0}, { 1, 8, 0}, { 2, 8, 0}, { 7, 0, 0}, { 0, 8, 0}, { 2, 0, 0}, { 0,13, 0}, { 1,13, 0}, { 1,12, 0}, { 1,15, 0}, { 1,10, 0}, { 2, 9, 0}, { 0,10,12}, { 0, 9,14}, { 0,10,13}, { 0,11, 8}, { 2,10,15}, { 2,11, 8}, { 2,11, 9}, { 2,11,10}, { 2,11,11}, { 2,11,12}, { 2,11,13}, { 2,11,14}, { 2,11,15}, { 2,12, 8}, { 2,12, 9}, { 2,12,10}, { 2,12,11}, { 2,12,12}, { 2,12,13}, { 2,12,14}, { 2,12,15}, { 2,13, 8}, { 2,13, 9}, { 2,13,10}, { 2,13,11}, { 2,13,12}, { 2,13,13}, { 2,13,14}, { 2,13,15}, { 2,14, 8}, { 2,14, 9}, { 2,14,10}, { 2,14,11}, { 2,14,12}, { 2,14,13}, { 2,14,14}, { 2,14,15}, { 0,11, 9}, { 0,11,10}, { 0,11,11}, { 0,11,12}, { 0,11,13}, { 0,11,14}, { 0,11,15}, { 0,12, 8}, { 0,12, 9}, { 0,12,10}, { 0,12,11}, { 0,12,12}, { 0,12,13}, { 0,12,14}, { 0,12,15}, { 0,13, 8}, { 0,13, 9}, { 0,13,10}, { 0,13,11}, { 0,13,12}, { 0,13,13}, { 0,13,14}, { 0,13,15}, { 0,14, 8}, { 0,14, 9}, { 0,14,10}, { 0,14,11}, { 0,14,12}, { 0,14,13}, { 0,14,14}, { 0,14,15}, { 0,15, 8}, { 0,15, 9}, { 0,15,10}, { 0,15,11}, { 0,15,12}, { 0,15,13}, { 0,15,14}, { 0,15,15}, { 1, 8, 8}, { 1, 8, 9}, { 1, 8,10}, { 1, 8,11}, { 1, 8,12}, { 1, 8,13}, { 1, 8,14}, { 1, 8,15}, { 1, 9, 8}, { 1, 9, 9}, { 1, 9,10}, { 1, 9,11}, { 1, 9,12}, { 1, 9,13}, { 1, 9,14}, { 1, 9,15}, { 1,10, 8}, { 1,10, 9}, { 1,10,10}, { 1,10,11}, { 1,10,12}, { 1,10,13}, { 1,10,14}, { 1,10,15}, { 1,11, 8}, { 1,11, 9}, { 1,11,10}, { 1,11,11}, { 1,11,12}, { 1,11,13}, { 1,11,14}, { 1,11,15}, { 1,12, 8}, { 1,12, 9}, { 1,12,10}, { 1,12,11}, { 1,12,12}, { 1,12,13}, { 1,12,14}, { 1,12,15}, { 1,13, 8}, { 1,13, 9}, { 1,13,10}, { 1,13,11}, { 1,13,12}, { 1,13,13}, { 1,13,14}, { 1,13,15}, { 1,14, 8}, { 1,14, 9}, { 1,14,10}, { 1,14,11}, { 1,14,12}, { 1,14,13}, { 1,14,14}, { 1,14,15}, { 1,15, 8}, /* Secondary alphabet */ { 6,15, 9}, { 6,15,10}, { 6,15,11}, { 6,15,12}, { 6,15,13}, { 6,15,14}, { 6,15,15}, { 7, 8, 8}, { 4,10,12}, { 7, 8, 9}, { 7, 8,10}, { 7, 8,11}, { 7, 8,12}, { 4,10,13}, { 7, 8,13}, { 7, 8,14}, { 7, 8,15}, { 7, 9, 8}, { 7, 9, 9}, { 7, 9,10}, { 7, 9,11}, { 7, 9,12}, { 7, 9,13}, { 7, 9,14}, { 7, 9,15}, { 7,10, 8}, { 7,10, 9}, { 7,10,10}, { 7,10,11}, { 7,10,12}, { 7,10,13}, { 7,10,14}, { 3, 8, 8}, { 4,15,11}, { 5, 8,14}, { 5,10,11}, { 5, 9,10}, { 5, 9, 9}, { 5, 8,15}, { 4,15,10}, { 5, 8,12}, { 5, 8,11}, { 5, 9,13}, { 5, 8, 8}, { 4,10,11}, { 4,15,14}, { 4,15,13}, { 5, 8, 9}, { 4,11,15}, { 4,12,10}, { 4,12,15}, { 4,13, 9}, { 4,14, 8}, { 4,13,12}, { 4,13,14}, { 4,14,12}, { 4,14,11}, { 4,14,14}, { 5, 8,10}, { 5, 8,13}, { 5,10, 8}, { 4,15,15}, { 5, 9,15}, { 4,15,12}, { 5, 9, 8}, { 4,11, 9}, { 4,12,14}, { 4,11,12}, { 4,11,14}, { 4,11, 8}, { 4,12,12}, { 4,13, 8}, { 4,13,10}, { 4,11,10}, { 4,15, 8}, { 4,14,10}, { 4,12,11}, { 4,12, 8}, { 4,12,13}, { 4,11,11}, { 4,12, 9}, { 4,14,15}, { 4,11,13}, { 4,10,15}, { 4,10,14}, { 4,13,11}, { 4,14,13}, { 4,13,13}, { 4,13,15}, { 4,14, 9}, { 4,15, 9}, { 5,10,14}, { 5,10, 9}, { 5,10,15}, { 5,10,10}, { 5, 9,12}, { 5, 9,11}, { 3, 8,12}, { 4, 9,11}, { 4, 8,12}, { 4, 8,11}, { 3, 8, 9}, { 4, 8,15}, { 4, 9, 9}, { 4, 8,10}, { 3, 8,13}, { 4,10,10}, { 4, 9,14}, { 4, 8, 9}, { 4, 8,14}, { 3, 8,14}, { 3, 8,11}, { 4, 9, 8}, { 4,10, 8}, { 3, 8,15}, { 4, 8, 8}, { 3, 8,10}, { 4, 8,13}, { 4, 9,13}, { 4, 9,12}, { 4, 9,15}, { 4, 9,10}, { 4,10, 9}, { 5,10,12}, { 5, 9,14}, { 5,10,12}, { 5,11, 8}, { 7,10,15}, { 7,11, 8}, { 7,11, 9}, { 7,11,10}, { 7,11,11}, { 7,11,12}, { 7,11,13}, { 7,11,14}, { 7,11,15}, { 7,12, 8}, { 7,12, 9}, { 7,12,10}, { 7,12,11}, { 7,12,12}, { 7,12,13}, { 7,12,14}, { 7,12,15}, { 7,13, 8}, { 7,13, 9}, { 7,13,10}, { 7,13,11}, { 7,13,12}, { 7,13,13}, { 7,13,14}, { 7,13,15}, { 7,14, 8}, { 7,14, 9}, { 7,14,10}, { 7,14,11}, { 7,14,12}, { 7,14,13}, { 7,14,14}, { 7,14,15}, { 5,11, 9}, { 5,11,10}, { 5,11,11}, { 5,11,12}, { 5,11,13}, { 5,11,14}, { 5,11,15}, { 5,12, 8}, { 5,12, 9}, { 5,12,10}, { 5,12,11}, { 5,12,12}, { 5,12,13}, { 5,12,14}, { 5,12,15}, { 5,13, 8}, { 5,13, 9}, { 5,13,10}, { 5,13,11}, { 5,13,12}, { 5,13,13}, { 5,13,14}, { 5,13,15}, { 5,14, 8}, { 5,14, 9}, { 5,14,10}, { 5,14,11}, { 5,14,12}, { 5,14,13}, { 5,14,14}, { 5,14,15}, { 5,15, 8}, { 5,15, 9}, { 5,15,10}, { 5,15,11}, { 5,15,12}, { 5,15,13}, { 5,15,14}, { 5,15,15}, { 6, 8, 8}, { 6, 8, 9}, { 6, 8,10}, { 6, 8,11}, { 6, 8,12}, { 6, 8,13}, { 6, 8,14}, { 6, 8,15}, { 6, 9, 8}, { 6, 9, 9}, { 6, 9,10}, { 6, 9,11}, { 6, 9,12}, { 6, 9,13}, { 6, 9,14}, { 6, 9,15}, { 6,10, 8}, { 6,10, 9}, { 6,10,10}, { 6,10,11}, { 6,10,12}, { 6,10,13}, { 6,10,14}, { 6,10,15}, { 6,11, 8}, { 6,11, 9}, { 6,11,10}, { 6,11,11}, { 6,11,12}, { 6,11,13}, { 6,11,14}, { 6,11,15}, { 6,12, 8}, { 6,12, 9}, { 6,12,10}, { 6,12,11}, { 6,12,12}, { 6,12,13}, { 6,12,14}, { 6,12,15}, { 6,13, 8}, { 6,13, 9}, { 6,13,10}, { 6,13,11}, { 6,13,12}, { 6,13,13}, { 6,13,14}, { 6,13,15}, { 6,14, 8}, { 6,14, 9}, { 6,14,10}, { 6,14,11}, { 6,14,12}, { 6,14,13}, { 6,14,14}, { 6,14,15}, { 6,15, 8}, }; /* * The same in a format more suitable for decoding. * The index is the varicode symbol, being 1-3 nibbles, with no padding * (ie a single-symbol character uses bits 3:0 only). The value is the * ASCII character. Since continuation nibbles are required to have the * MSB set, significant portions of the table are unused and should not * be reached. */ static signed int varidecode[] = { 32,101,116,111, 97,105,110,114,115,108,104,100, 99,117,109,102, -1, -1, -1, -1, -1, -1, -1, -1,112,103,121, 98,119,118,107,120, -1, -1, -1, -1, -1, -1, -1, -1,113,122,106, 44, 8, 13, 84, 83, -1, -1, -1, -1, -1, -1, -1, -1, 69, 65, 73, 79, 67, 82, 68, 48, -1, -1, -1, -1, -1, -1, -1, -1, 77, 80, 49, 76, 70, 78, 66, 50, -1, -1, -1, -1, -1, -1, -1, -1, 71, 51, 72, 85, 53, 87, 54, 88, -1, -1, -1, -1, -1, -1, -1, -1, 52, 89, 75, 56, 55, 86, 57, 81, -1, -1, -1, -1, -1, -1, -1, -1, 74, 90, 39, 33, 63, 46, 45, 61, -1, -1, -1, -1, -1, -1, -1, -1, 43, 47, 58, 41, 40, 59, 34, 38, -1, -1, -1, -1, -1, -1, -1, -1, 64, 37, 36, 96, 95, 42,124, 62, -1, -1, -1, -1, -1, -1, -1, -1, 60, 92, 94, 35,123,125, 91, 93, -1, -1, -1, -1, -1, -1, -1, -1,126,160,161,162,163,164,165,166, -1, -1, -1, -1, -1, -1, -1, -1,167,168,169,170,171,172,173,174, -1, -1, -1, -1, -1, -1, -1, -1,175,176,177,178,179,180,181,182, -1, -1, -1, -1, -1, -1, -1, -1,183,184,185,186,187,188,189,190, -1, -1, -1, -1, -1, -1, -1, -1,191,192,193,194,195,196,197,198, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,199,200,201,202,203,204,205,206, -1, -1, -1, -1, -1, -1, -1, -1,207,208,209,210,211,212,213,214, -1, -1, -1, -1, -1, -1, -1, -1,215,216,217,218,219,220,221,222, -1, -1, -1, -1, -1, -1, -1, -1,223,224,225,226,227,228,229,230, -1, -1, -1, -1, -1, -1, -1, -1,231,232,233,234,235,236,237,238, -1, -1, -1, -1, -1, -1, -1, -1,239,240,241,242,243,244,245,246, -1, -1, -1, -1, -1, -1, -1, -1,247,248,249,250,251,252,253,254, -1, -1, -1, -1, -1, -1, -1, -1,255, 0, 1, 2, 3, 4, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 9, 10, 11, 12, 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, -1, -1, -1, -1, 25, 26, 27, 28, 29, 30, 31,127, -1, -1, -1, -1, -1, -1, -1, -1,128,129,130,131,132,133,134,135, -1, -1, -1, -1, -1, -1, -1, -1,136,137,138,139,140,141,142,143, -1, -1, -1, -1, -1, -1, -1, -1,144,145,146,147,148,149,150,151, -1, -1, -1, -1, -1, -1, -1, -1,152,153,154,155,156,157,158,159, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,288,357,372,367,353,361,366,370, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,371,364,360,356,355,373,365,358, -1, -1, -1, -1, -1, -1, -1, -1,368,359,377,354,375,374,363,376, -1, -1, -1, -1, -1, -1, -1, -1,369,378,362,300,264,269,340,339, -1, -1, -1, -1, -1, -1, -1, -1,325,321,329,335,323,338,324,304, -1, -1, -1, -1, -1, -1, -1, -1,333,336,305,332,326,334,322,306, -1, -1, -1, -1, -1, -1, -1, -1,327,307,328,341,309,343,310,344, -1, -1, -1, -1, -1, -1, -1, -1,308,345,331,312,311,342,313,337, -1, -1, -1, -1, -1, -1, -1, -1,330,346,295,289,319,302,301,317, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,299,303,314,297,296,315,290,294, -1, -1, -1, -1, -1, -1, -1, -1,320,293,292,352,351,298,380,318, -1, -1, -1, -1, -1, -1, -1, -1,316,348,350,291,381, -1,347,349, -1, -1, -1, -1, -1, -1, -1, -1,382,416,417,418,419,420,421,422, -1, -1, -1, -1, -1, -1, -1, -1,423,424,425,426,427,428,429,430, -1, -1, -1, -1, -1, -1, -1, -1,431,432,433,434,435,436,437,438, -1, -1, -1, -1, -1, -1, -1, -1,439,440,441,442,443,444,445,446, -1, -1, -1, -1, -1, -1, -1, -1,447,448,449,450,451,452,453,454, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,455,456,457,458,459,460,461,462, -1, -1, -1, -1, -1, -1, -1, -1,463,464,465,466,467,468,469,470, -1, -1, -1, -1, -1, -1, -1, -1,471,472,473,474,475,476,477,478, -1, -1, -1, -1, -1, -1, -1, -1,479,480,481,482,483,484,485,486, -1, -1, -1, -1, -1, -1, -1, -1,487,488,489,490,491,492,493,494, -1, -1, -1, -1, -1, -1, -1, -1,495,496,497,498,499,500,501,502, -1, -1, -1, -1, -1, -1, -1, -1,503,504,505,506,507,508,509,510, -1, -1, -1, -1, -1, -1, -1, -1,511,256,257,258,259,260,261,262, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,263,265,266,267,268,270,271,272, -1, -1, -1, -1, -1, -1, -1, -1,273,274,275,276,277,278,279,280, -1, -1, -1, -1, -1, -1, -1, -1,281,282,283,284,285,286,287,383, -1, -1, -1, -1, -1, -1, -1, -1,384,385,386,387,388,389,390,391, -1, -1, -1, -1, -1, -1, -1, -1,392,393,394,395,396,397,398,399, -1, -1, -1, -1, -1, -1, -1, -1,400,401,402,403,404,405,406,407, -1, -1, -1, -1, -1, -1, -1, -1,408,409,410,411,412,413,414,415, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; #include unsigned char *dominoex_varienc(unsigned char c, int secondary) { return varicode[c + ((secondary) ? 256 : 0)]; } int dominoex_varidec(unsigned int symbol) { /* The caller is responsible for ensuring symbols are properly delineated. */ return varidecode[symbol & 0xFFF]; } fldigi-4.2.05/src/cw/0000775000175000017500000000000014611714005011242 500000000000000fldigi-4.2.05/src/cw/view_cw.cxx0000664000175000017500000002356214611711171013362 00000000000000// ---------------------------------------------------------------------------- // view_cw.cxx // // (c) 2014 Mauri Niininen, AG1LE // (c) 2017 Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // viewpsk is a multi channel psk decoder which allows the parallel processing // of the complete audio spectrum from 400 to 1150 Hz in equal 25 Hz // channels. Each channel is separately decoded and the decoded characters // passed to the user interface routines for presentation. The number of // channels can be up to and including 30. #include #include #include #include #include "cw.h" #include "view_cw.h" #include "pskeval.h" #include "pskcoeff.h" #include "pskvaricode.h" #include "misc.h" #include "configuration.h" #include "Viewer.h" #include "qrunner.h" #include "status.h" #include "waterfall.h" extern waterfall *wf; #define CH_SPACING 100 #define VCW_FFT_SIZE 2048 // must be a factor of 2 #define VCW_DEC_RATIO 16 #define VCW_SAMPLERATE 8000 // VKWPM conversion factor // # samples per dot = VKWPM / wpm // 30 samples @ 20 wpm // 15 samples @ 40 wpm //#define VKWPM 600 // ((12 * VCW_SAMPLERATE/10) / VCW_DEC_RATIO) #define VKWPM ((12 * VCW_SAMPLERATE/10) / VCW_DEC_RATIO) enum {READY, NOT_READY}; cMorse *CW_CHANNEL::morse = 0; CW_CHANNEL::CW_CHANNEL() { bitfilter.setLength(10); trackingfilter.setLength(16); if (!morse) morse = new cMorse; VCW_filter = new fftfilt ((CH_SPACING * 0.6) / VCW_SAMPLERATE, VCW_FFT_SIZE); smpl_ctr = dec_ctr = 0; phi1 = phi2 = 0; } CW_CHANNEL::~CW_CHANNEL() { if (morse) { delete morse; morse = 0; } delete VCW_filter; } void CW_CHANNEL::init(int _ch, double _freq) { ch_freq = _freq; ch = _ch; phase = 0.0; phase_increment = TWOPI * ch_freq / VCW_SAMPLERATE; agc_peak = 0.0; sig_avg = 0.5; timeout = 0; smpl_ctr = 0; dec_ctr = 0; space_sent = true; last_element = 0; curr_element = 0; bitfilter.reset(); two_dots = 2 * VKWPM / progdefaults.CWspeed; sync_parameters(); } void CW_CHANNEL::reset() { space_sent = true; last_element = 0; curr_element = 0; decode_str.clear(); two_dots = 2 * VKWPM / progdefaults.CWspeed; bitfilter.reset(); trackingfilter.reset(); } void CW_CHANNEL::update_tracking(int dur_1, int dur_2) { static int min_dot = (VKWPM / 60) / 2; static int max_dash = 6 * VKWPM / 10; if ((dur_1 > dur_2) && (dur_1 > 4 * dur_2)) return; if ((dur_2 > dur_1) && (dur_2 > 4 * dur_1)) return; if (dur_1 < min_dot || dur_2 < min_dot) return; if (dur_2 > max_dash || dur_2 > max_dash) return; two_dots = trackingfilter.run((dur_1 + dur_2) / 2); } inline int CW_CHANNEL::sample_count(unsigned int earlier, unsigned int later) { return (earlier >= later) ? 0 : (later - earlier); } void CW_CHANNEL::sync_parameters() { trackingfilter.reset(); } enum {KEYDOWN, KEYUP, POST_TONE, QUERY }; int CW_CHANNEL::decode_state(int cw_state) { switch (cw_state) { case KEYDOWN: { if (cw_receive_state == KEYDOWN) return NOT_READY; // first tone in idle state reset audio sample counter if (cw_receive_state == KEYUP) { smpl_ctr = 0; rx_rep_buf.clear(); } // save the timestamp cw_rr_start_timestamp = smpl_ctr; // Set state to indicate we are inside a tone. cw_receive_state = KEYDOWN; return NOT_READY; break; } case KEYUP: { // The receive state is expected to be inside a tone. if (cw_receive_state != KEYDOWN) return NOT_READY; // Save the current timestamp curr_element = sample_count( cw_rr_start_timestamp, smpl_ctr ); cw_rr_end_timestamp = smpl_ctr; // If the tone length is shorter than any noise cancelling // threshold that has been set, then ignore this tone. if (curr_element < two_dots / 10) { cw_receive_state = KEYUP; return NOT_READY; } // Set up to track speed on dot-dash or dash-dot pairs for this test to // work, we need a dot dash pair or a dash dot pair to validate timing // from and force the speed tracking in the right direction. if (last_element > 0) update_tracking( last_element, curr_element ); last_element = curr_element; // a dot is anything shorter than 2 dot times if (curr_element <= two_dots) { rx_rep_buf += '.'; } else { rx_rep_buf += '-'; } // We just added a representation to the receive buffer. // If it's full, then reset everything as it is probably noise if (rx_rep_buf.length() > MAX_MORSE_ELEMENTS) { cw_receive_state = KEYUP; rx_rep_buf.clear(); smpl_ctr = 0; // reset audio sample counter return NOT_READY; } // All is well. Move to the more normal after-tone state. cw_receive_state = POST_TONE; return NOT_READY; break; } case QUERY: { // this should be called quite often (faster than inter-character gap) It looks after timing // key up intervals and determining when a character, a word space, or an error char '*' should be returned. // READY is returned when there is a printable character. Nothing to do if we are in a tone if (cw_receive_state == KEYDOWN) return NOT_READY; // in this call we expect a pointer to a char to be valid if (cw_state == KEYDOWN || cw_state == KEYUP) { // else we had no place to put character... cw_receive_state = KEYUP; rx_rep_buf.clear(); // reset decoding pointer return NOT_READY; } // compute length of silence so far // sync_parameters(); curr_element = sample_count( cw_rr_end_timestamp, smpl_ctr ); // SHORT time since keyup... nothing to do yet if (curr_element < two_dots) return NOT_READY; // MEDIUM time since keyup... check for character space // one shot through this code via receive state logic if ((curr_element > two_dots) && (curr_element < 2 * two_dots) ) { // && cw_receive_state == POST_TONE) { std::string code = morse->rx_lookup(rx_rep_buf); if (code.empty()) { decode_str.clear(); cw_receive_state = KEYUP; rx_rep_buf.clear(); space_sent = false; return NOT_READY ; } decode_str = code; cw_receive_state = KEYUP; rx_rep_buf.clear(); space_sent = false; return READY; } // LONG time since keyup... check for a word space if ((curr_element > 2 * two_dots) && !space_sent) { decode_str = " "; space_sent = true; return READY; } break; } } return NOT_READY; } //bool record = false; //int rec_count = 0; void CW_CHANNEL::detect_tone() { norm_sig = 0; CWupper = 0; CWlower = 0; sig_avg = decayavg(sig_avg, value, 1000); if (value > sig_avg) { if (value > agc_peak) agc_peak = decayavg(agc_peak, value, 100); else agc_peak = decayavg(agc_peak, value, 1000); } if (!agc_peak) return; value /= agc_peak; norm_sig = sig_avg / agc_peak; // metric = 0.8 * metric; // metric += 0.2 * clamp(20*log10(sig_avg / noise_floor) , 0, 40); metric = clamp(20*log10(sig_avg / noise_floor) , 0, 40); CWupper = norm_sig + 0.1; CWlower = norm_sig - 0.1; if (metric > progStatus.VIEWER_cwsquelch ) { if ((value >= CWupper) && (cw_receive_state != KEYDOWN)) decode_state(KEYDOWN); if ((value < CWlower) && (cw_receive_state == KEYDOWN)) decode_state(KEYUP); if ((decode_state(QUERY) == READY) ) { for (size_t n = 0; n < decode_str.length(); n++) REQ(&viewaddchr, ch, (int)ch_freq, decode_str[n], (int)MODE_CW); timeout = progdefaults.VIEWERtimeout * VCW_SAMPLERATE / WF_BLOCKSIZE; decode_str.clear(); rx_rep_buf.clear(); } } } void CW_CHANNEL::rx_process(const double *buf, int len) { cmplx z, *zp; int n = 0; while (len-- > 0) { z = cmplx ( *buf * cos(phase), *buf * sin(phase) ); buf++; phase += phase_increment; if (phase > TWOPI) phase -= TWOPI; n = VCW_filter->run(z, &zp); if (n) { for (int i = 0; i < n; i++) { if (++dec_ctr < VCW_DEC_RATIO) continue; dec_ctr = 0; smpl_ctr++; value = bitfilter.run(abs(zp[i])); detect_tone(); } } } } //====================================================================== // view_cw //====================================================================== view_cw::view_cw() { for (int i = 0; i < VCW_MAXCH; i++) channel[i].reset(); viewmode = MODE_CW; } view_cw::~view_cw() { } void view_cw::init() { nchannels = progdefaults.VIEWERchannels; for (int i = 0; i < VCW_MAXCH; i++) { channel[i].init(i, 400.0 + CH_SPACING * i); } for (int i = 0; i < nchannels; i++) REQ(&viewclearchannel, i); } void view_cw::restart() { for (int i = 0; i < VCW_MAXCH; i++) { channel[i].space_sent = true; channel[i].last_element = 0; channel[i].curr_element = 0; channel[i].two_dots = 2 * VKWPM / progdefaults.CWspeed; } init(); } void view_cw::clearch(int n) { REQ( &viewclearchannel, n); REQ( &viewaddchr, n, (int)NULLFREQ, 0, viewmode); } void view_cw::clear() { for (int i = 0; i < VCW_MAXCH; i++) clearch(i); } int view_cw::rx_process(const double *buf, int len) { double nf = 1e8; if (nchannels != progdefaults.VIEWERchannels) init(); for (int n = 0; n < nchannels; n++) { channel[n].rx_process(buf, len); if (nf > channel[n].avg_signal() && channel[n].avg_signal() > 1e-3) nf = channel[n].avg_signal(); if (channel[n].timeout) if (! --channel[n].timeout) clearch(n); } if (nf <= 1e-3) nf = 1e-3; for (int n = 0; n < nchannels; n++) channel[n].set_noise_floor(nf); return 0; } int view_cw::get_freq(int n) { return (int)channel[n].ch_freq; } fldigi-4.2.05/src/cw/KYkeying.cxx0000664000175000017500000001022414611711171013440 00000000000000// ---------------------------------------------------------------------------- // KYkeying.cxx serial string CW interface to Elecraft transceivers // // Copyright (C) 2020 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "KYkeying.h" #include "configuration.h" #include "rigio.h" #include "threads.h" #include "debug.h" #include "rigsupport.h" #include "morse.h" #include "fl_digi.h" #if !HAVE_CLOCK_GETTIME # ifdef __APPLE__ # include # define CLOCK_REALTIME 0 # define CLOCK_MONOTONIC 6 # endif # if TIME_WITH_SYS_TIME # include # endif #endif int KYwpm = 0; bool use_KYkeyer = false; static std::string KYcmd = "KY ;"; static std::string KNWDcmd = "KY ;"; // 0123456789012345678901234567 // 0 1 2 static std::string cmd; static cMorse *KYmorse = 0; static char lastKYchar = 0; double KY_now() { static struct timespec tp; #if HAVE_CLOCK_GETTIME clock_gettime(CLOCK_MONOTONIC, &tp); #elif defined(__WIN32__) DWORD msec = GetTickCount(); tp.tv_sec = msec / 1000; tp.tv_nsec = (msec % 1000) * 1000000; #elif defined(__APPLE__) static mach_timebase_info_data_t info = { 0, 0 }; if (unlikely(info.denom == 0)) mach_timebase_info(&info); uint64_t t = mach_absolute_time() * info.numer / info.denom; tp.tv_sec = t / 1000000000; tp.tv_nsec = t % 1000000000; #endif return 1.0 * tp.tv_sec + tp.tv_nsec * 1e-9; } void KY_sleep(double secs) { static struct timespec tv = { 0, 1000000L}; static double end1 = 0; static double end2 = 0; static double t1 = 0; static double t2 = 0; static double t3 = 0; int loop1 = 0; int loop2 = 0; int n1 = secs*1e3; #ifdef __WIN32__ timeBeginPeriod(1); #endif t1 = KY_now(); end2 = t1 + secs - 0.0001; end1 = end2 - 0.005; t2 = KY_now(); while (t2 < end1 && (++loop1 < n1)) { nanosleep(&tv, NULL); t2 = KY_now(); } t3 = t2; while (t3 <= end2) { loop2++; t3 = KY_now(); } #ifdef __WIN32__ timeEndPeriod(1); #endif } void set_KYkeyer() { KYwpm = progdefaults.CWspeed; if (KYwpm < 8) KYwpm = 8; if (KYwpm > 100) KYwpm = 100; progdefaults.CWspeed = KYwpm; char cmd[10]; snprintf(cmd, sizeof(cmd), "KS%03d;", KYwpm); if (progdefaults.fldigi_client_to_flrig) { xmlrpc_priority(cmd); } else { guard_lock ser_guard( &rigCAT_mutex); rigio.WriteBuffer((unsigned char *)cmd, strlen(cmd)); } KY_sleep(0.050); } void KYkeyer_send_char(int c) { if (KYmorse == 0) KYmorse = new cMorse; if (KYwpm != progdefaults.CWspeed) { set_KYkeyer(); } if (c == GET_TX_CHAR_NODATA || c == 0x0d) { KY_sleep(0.050); return; } c = toupper(c); if (c < ' ') c = ' '; if (c > 'Z') c = ' '; float tc = 1.2 / progdefaults.CWspeed; if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed > progdefaults.CWfarnsworth)) tc = 1.2 / progdefaults.CWfarnsworth; if (c == ' ') { if (lastKYchar == ' ') tc *= 7; else tc *= 5; } else { tc *= KYmorse->tx_length(c); if (progdefaults.use_KNWDkeying) { cmd = KNWDcmd; cmd[3] = (char)c; } else { cmd = KYcmd; cmd[3] = (char)c; } if (progdefaults.fldigi_client_to_flrig) { xmlrpc_priority(cmd); } else if (progdefaults.chkUSERIGCATis) { guard_lock ser_guard( &rigCAT_mutex); rigio.WriteBuffer((unsigned char *)cmd.c_str(), cmd.length()); } } tc -= (progdefaults.CATkeying_compensation / (progdefaults.CWspeed * 6)) * 1e-3; KY_sleep(tc); lastKYchar = c; } fldigi-4.2.05/src/cw/morse.cxx0000664000175000017500000002044114611711171013035 00000000000000/* * morse.c -- morse code tables * * Copyright (C) 2017 * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #include #include #include #include "morse.h" #include "configuration.h" /* ---------------------------------------------------------------------- */ /* * Morse code characters table. This table allows lookup of the Morse * shape of a given alphanumeric character. Shapes are held as a string, * with "-' representing dash, and ".' representing dot. The table ends * with a NULL entry. * * This is the main table from which the other tables are computed. * * The Prosigns are also defined in the configuration.h file * The user can specify the character which substitutes for the prosign */ bool CW_table_changed = false; CWstruct cMorse::cw_table[] = { // Prosigns {1, "=", "", "-...-" }, // 0 {0, "~", "", ".-.-" }, // 1 {1, "<", "", ".-..." }, // 2 {1, ">", "", ".-.-." }, // 3 {1, "%", "", "...-.-" }, // 4 {1, "+", "", "-.--." }, // 5 {1, "&", "", "..-.-" }, // 6 {1, "{", "", "....--" }, // 7 {1, "}", "", "...-." }, // 8 // ASCII 7bit letters {1, "A", "A", ".-" }, {1, "B", "B", "-..." }, {1, "C", "C", "-.-." }, {1, "D", "D", "-.." }, {1, "E", "E", "." }, {1, "F", "F", "..-." }, {1, "G", "G", "--." }, {1, "H", "H", "...." }, {1, "I", "I", ".." }, {1, "J", "J", ".---" }, {1, "K", "K", "-.-" }, {1, "L", "L", ".-.." }, {1, "M", "M", "--" }, {1, "N", "N", "-." }, {1, "O", "O", "---" }, {1, "P", "P", ".--." }, {1, "Q", "Q", "--.-" }, {1, "R", "R", ".-." }, {1, "S", "S", "..." }, {1, "T", "T", "-" }, {1, "U", "U", "..-" }, {1, "V", "V", "...-" }, {1, "W", "W", ".--" }, {1, "X", "X", "-..-" }, {1, "Y", "Y", "-.--" }, {1, "Z", "Z", "--.." }, // {1, "a", "A", ".-" }, {1, "b", "B", "-..." }, {1, "c", "C", "-.-." }, {1, "d", "D", "-.." }, {1, "e", "E", "." }, {1, "f", "F", "..-." }, {1, "g", "G", "--." }, {1, "h", "H", "...." }, {1, "i", "I", ".." }, {1, "j", "J", ".---" }, {1, "k", "K", "-.-" }, {1, "l", "L", ".-.." }, {1, "m", "M", "--" }, {1, "n", "N", "-." }, {1, "o", "O", "---" }, {1, "p", "P", ".--." }, {1, "q", "Q", "--.-" }, {1, "r", "R", ".-." }, {1, "s", "S", "..." }, {1, "t", "T", "-" }, {1, "u", "U", "..-" }, {1, "v", "V", "...-" }, {1, "w", "W", ".--" }, {1, "x", "X", "-..-" }, {1, "y", "Y", "-.--" }, {1, "z", "Z", "--.." }, // Numerals {1, "0", "0", "-----" }, {1, "1", "1", ".----" }, {1, "2", "2", "..---" }, {1, "3", "3", "...--" }, {1, "4", "4", "....-" }, {1, "5", "5", "....." }, {1, "6", "6", "-...." }, {1, "7", "7", "--..." }, {1, "8", "8", "---.." }, {1, "9", "9", "----." }, // Punctuation {1, "\"", "\"", ".-..-." }, {1, "\'", "'", ".----." }, {1, "$", "$", "...-..-" }, {1, "(", "(", "-.--." }, {1, ")", ")", "-.--.-" }, {1, ",", ",", "--..--" }, {1, "-", "-", "-....-" }, {1, ".", ".", ".-.-.-" }, {1, "/", "/", "-..-." }, {1, ":", ":", "---..." }, {1, ";", ";", "-.-.-." }, {1, "?", "?", "..--.." }, {1, "_", "_", "..--.-" }, {1, "@", "@", ".--.-." }, {1, "!", "!", "-.-.--" }, // accented characters {1, "Ä", "Ä", ".-.-" }, // A umlaut {1, "ä", "Ä", ".-.-" }, // A umlaut {0, "Æ", "Æ", ".-.-" }, // A aelig {0, "æ", "Æ", ".-.-" }, // A aelig {0, "Å", "Å", ".--.-" }, // A ring {0, "å", "Å", ".--.-" }, // A ring {1, "Ç", "Ç", "-.-.." }, // C cedilla {1, "ç", "Ç", "-.-.." }, // C cedilla {0, "È", "È", ".-..-" }, // E grave {0, "è", "È", ".-..-" }, // E grave {1, "É", "É", "..-.." }, // E acute {1, "é", "É", "..-.." }, // E acute {0, "Ó", "Ó", "---." }, // O acute {0, "ó", "Ó", "---." }, // O acute {1, "Ö", "Ö", "---." }, // O umlaut {1, "ö", "Ö", "---." }, // O umlaut {0, "Ø", "Ø", "---." }, // O slash {0, "ø", "Ø", "---." }, // O slash {1, "Ñ", "Ñ", "--.--" }, // N tilde {1, "ñ", "Ñ", "--.--" }, // N tilde {1, "Ü", "Ü", "..--" }, // U umlaut {1, "ü", "Ü", "..--" }, // U umlaut {0, "Û", "Û", "..--" }, // U circ {0, "û", "Û", "..--" }, // U circ // array termination {0, "", "", ""} }; /* ---------------------------------------------------------------------- */ void cMorse::enable(std::string s, bool val) { for (int i = 0; cw_table[i].rpr.length(); i++) { if (cw_table[i].chr == s || cw_table[i].prt == s) { cw_table[i].enabled = val; return; } } } void cMorse::init() { // Update the char / prosign relationship if (progdefaults.CW_prosigns.length() == 9) { for (int i = 0; i < 9; i++) { cw_table[i].chr = progdefaults.CW_prosigns[i]; } } enable("", 1); enable("Ä", 0); enable("ä", 0); enable("Æ", 0); enable("æ", 0); enable("Å", 0); enable("å", 0); enable("Ç", 0); enable("ç", 0); enable("È", 0); enable("è", 0); enable("É", 0); enable("é", 0); enable("Ó", 0); enable("ó", 0); enable("Ö", 0); enable("ö", 0); enable("Ø", 0); enable("ø", 0); enable("Ñ", 0); enable("ñ", 0); enable("Ü", 0); enable("ü", 0); enable("Û", 0); enable("û", 0); if (progdefaults.A_umlaut) { enable("Ä", 1); enable("ä", 1); enable("", 0); } if (progdefaults.A_aelig) { enable("Æ", 1); enable("æ", 1); enable("", 0); } if (progdefaults.A_ring) { enable("Å", 1); enable("å", 1); } if (progdefaults.C_cedilla) { enable("Ç", 1); enable("ç", 1); } if (progdefaults.E_grave) { enable("È", 1); enable("è", 1); } if (progdefaults.E_acute) { enable("É", 1); enable("é", 1); } if (progdefaults.O_acute) { enable("Ó", 1); enable("ó", 1); } if (progdefaults.O_umlaut) { enable("Ö", 1); enable("ö", 1); } if (progdefaults.O_slash) { enable("Ø", 1); enable("ø", 1); } if (progdefaults.N_tilde) { enable("Ñ", 1); enable("ñ", 1); } if (progdefaults.U_umlaut) { enable("Ü", 1); enable("ü", 1); } if (progdefaults.U_circ) { enable("Û", 1); enable("û", 1); } enable ("\\", progdefaults.CW_backslash); enable ("\'", progdefaults.CW_apostrophe); enable ("\"", progdefaults.CW_quote); enable ("$", progdefaults.CW_dollar_sign); enable ("(", progdefaults.CW_open_paren); enable (")", progdefaults.CW_close_paren); enable (":", progdefaults.CW_colon); enable (";", progdefaults.CW_semi_colon); enable ("_", progdefaults.CW_underscore); enable ("@", progdefaults.CW_at_symbol); enable ("!", progdefaults.CW_exclamation); CW_table_changed = false; utf8.reserve(4); utf8.clear(); ptr = 0; toprint.clear(); } std::string cMorse::rx_lookup(std::string rx) { if (CW_table_changed) init(); for (int i = 0; cw_table[i].rpr.length(); i++) { if (rx == cw_table[i].rpr) { if (cw_table[i].enabled) { if (progdefaults.CW_prosign_display) return cw_table[i].chr; return cw_table[i].prt; } } } return ""; } std::string cMorse::tx_lookup(int c) { if (CW_table_changed) init(); toprint.clear(); c &= 0xFF; utf8 += c; if (((utf8[0] & 0xFF) > 0x7F) && (utf8.length() == 1)) { return ""; } for (int i = 0; cw_table[i].rpr.length(); i++) { if (utf8 == cw_table[i].chr) { if (!cw_table[i].enabled) { utf8.clear(); ptr = 0; return ""; } toprint = cw_table[i].prt; utf8.clear(); ptr = 0; return cw_table[i].rpr; } } utf8.clear(); ptr = 0; return ""; } /* Morse Code timing rules The length of a dot is 1 time unit. A dash is 3 time units. The space between symbols (dots and dashes) of the same letter is 1 time unit. The space between letters is 3 time units. The space between words is 7 time units. */ int cMorse::tx_length(int c) { if (c == ' ') return 4; std::string ms = tx_lookup(c); if (ms.empty()) return 0; int len = 0; for (size_t i = 0; i < ms.length(); i++) if (ms[i] == '.') len += 2; else len += 4; len += 2; return len; } /* ---------------------------------------------------------------------- */ fldigi-4.2.05/src/cw/YAESUkeying.cxx0000664000175000017500000000527014611711171014010 00000000000000// ---------------------------------------------------------------------------- // FTkeying.cxx serial string CW interface to Elecraft transceivers // // Copyright (C) 2020 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "YAESUkeying.h" #include "configuration.h" #include "rigio.h" #include "threads.h" #include "debug.h" #include "rigsupport.h" #include "morse.h" #include "fl_digi.h" #include "qrunner.h" int FTwpm = 0; bool use_FTkeyer = false; static cMorse *FTmorse = 0; static char lastFTchar = 0; void set_FTkeyer() { FTwpm = progdefaults.CWspeed; if (FTwpm < 4) FTwpm = 4; if (FTwpm > 60) FTwpm = 60; progdefaults.CWspeed = FTwpm; char cmd[10]; snprintf(cmd, sizeof(cmd), "KS%03d;", FTwpm); if (progdefaults.fldigi_client_to_flrig) { xmlrpc_priority(cmd); } else { guard_lock ser_guard( &rigCAT_mutex); rigio.WriteBuffer((unsigned char *)cmd, strlen(cmd)); } MilliSleep(50); } void FTkeyer_send_char(int c) { if (FTmorse == 0) FTmorse = new cMorse; if (FTwpm != progdefaults.CWspeed) { set_FTkeyer(); } if (c == GET_TX_CHAR_NODATA || c == 0x0d) { MilliSleep(50); return; } c = toupper(c); if (c < ' ') c = ' '; if (c > 'Z') c = ' '; float tc = 1200.0 / progdefaults.CWspeed; if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed > progdefaults.CWfarnsworth)) tc = 1200.0 / progdefaults.CWfarnsworth; if (c == ' ') { if (lastFTchar == ' ') tc *= 7; else tc *= 5; } else { tc *= FTmorse->tx_length(c); char cmd[20]; memset(cmd, 0, 20); snprintf(cmd, sizeof(cmd), "KM2%c;KY7;", (char)c); if (progdefaults.fldigi_client_to_flrig) { xmlrpc_priority(cmd); } else if (progdefaults.chkUSERIGCATis) { guard_lock ser_guard( &rigCAT_mutex); rigio.WriteBuffer((unsigned char *)cmd, strlen(cmd)); } } if (progdefaults.CATkeying_compensation / (progdefaults.CWspeed * 6) < tc) tc -= progdefaults.CATkeying_compensation / (progdefaults.CWspeed * 6); MilliSleep(tc); lastFTchar = c; } fldigi-4.2.05/src/cw/Nav.cxx0000664000175000017500000003447514611711171012450 00000000000000// ---------------------------------------------------------------------------- // Nav.cxx -- Interface to Arduino Nano Nav keyer // // Copyright (C) 2018 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "main.h" #include "fl_digi.h" #include "gettext.h" #include "rtty.h" #include "serial.h" #include "Nav.h" bool use_Nav = false; static int tty_mode = LETTERS; static Cserial Nav_serial; static Cserial Nav_config; //#define NAVDEBUG 1 static void print_string(std::string s) { #ifdef NAVDEBUG std::string fname = HomeDir; fname.append("nav_debug.txt"); std::ofstream dbgfile(fname.c_str(), std::ios::app); dbgfile << s; dbgfile.close(); #else LOG_INFO("%s", s.c_str()); #endif ReceiveText->add(s.c_str()); } static std::string Nav_config_string = "\ 11101111012"; static std::string config_params = "\ ||||||||||+-10 FSK stop bits - 1:1, 2:1.5, 3: 2 bits\n\ |||||||||+---9 FSK BAUD rate - 1: 45.45, 2: 75, 3: 100 baud\n\ ||||||||+----8 FSK PTT - 0: PTT disabled, 1: PTT enabled\n\ |||||||+-----7 FSK side tone - 0: no tone, 1: tone\n\ ||||||+------6 FSK polarity - 0: reverse, 1: normal polarity\n\ |||||+-------5 CAT LED behavior - 0: steady, 1: on-access poll\n\ ||||+--------4 LED brightness - 0: DIM, 1: normal brightness\n\ |||+---------3 WinKey PTT - 0: no PTT, 1: WinKey PTT\n\ ||+----------2 RF attenuator - 0: 20db atten', 1: no atten'\n\ |+-----------1 CH.2 attenuator - 0: 15db atten', 1: no atten'\n\ +------------0 CH.1 attenuator - 0: 15db atten', 1: no atten'\n"; void Nav_update_config_controls() { switch (Nav_config_string[0]) { // channel 1 attenuator default: case '1': sel_Nav_ch1->index(1); break; case '0': sel_Nav_ch1->index(0); break; } switch (Nav_config_string[1]) { // channel 2 attenuator default: case '1': sel_Nav_ch2->index(1); break; case '0': sel_Nav_ch2->index(0); break; } switch (Nav_config_string[2]) { // rf attenuator default: case '1': sel_Nav_rf_att->index(1); break; case '0': sel_Nav_rf_att->index(0); break; } switch (Nav_config_string[3]) { // Winkey PTT default: case '1': sel_Nav_wk_ptt->index(0); break; case '0': sel_Nav_wk_ptt->index(1); break; } switch (Nav_config_string[4]) { // LED default: case '1': sel_Nav_LED->index(1); break; case '0': sel_Nav_LED->index(0); break; } switch (Nav_config_string[5]) { // CAT LED default: case '1': sel_Nav_CAT_LED->index(1); break; case '0': sel_Nav_CAT_LED->index(0); break; } switch (Nav_config_string[6]) { // polarity default: case '0': sel_Nav_FSK_polarity->index(1); break; case '1': sel_Nav_FSK_polarity->index(0); break; } switch (Nav_config_string[7]) { // sidetone default: case '1': sel_Nav_FSK_sidetone->index(0); break; case '0': sel_Nav_FSK_sidetone->index(1); break; } switch (Nav_config_string[8]) { // PTT default: case '1': sel_Nav_FSK_ptt->index(0); break; case '0': sel_Nav_FSK_ptt->index(1); break; } switch (Nav_config_string[9]) { // baud default: case '1' : sel_Nav_FSK_baud->index(0); break; case '2' : sel_Nav_FSK_baud->index(1); break; case '3' : sel_Nav_FSK_baud->index(2); break; } switch (Nav_config_string[10]) { // stop bits default: case '1': sel_Nav_FSK_stopbits->index(0); break; case '2': sel_Nav_FSK_stopbits->index(1); break; case '3': sel_Nav_FSK_stopbits->index(2); break; } print_string(std::string(Nav_config_string).append("\n").append(config_params)); } void Nav_set_configuration() { std::string cmd = "KL"; cmd.append(Nav_config_string).append("\r\n"); Nav_config.WriteBuffer((unsigned char *)cmd.c_str(), cmd.length()); std::string resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("kl") != std::string::npos) { print_string(_("Config change accepted\n")); Nav_write_eeprom(); } else print_string(_("Config change NOT accepted\n")); } void Nav_get_configuration() { std::string cmd = "KM\r\n"; Nav_config.WriteBuffer((unsigned char *)cmd.c_str(), cmd.length()); std::string resp = Nav_read_string(Nav_config, 2000, "\n"); size_t p = resp.find("km"); if (p >= 11) { p -= 11; Nav_config_string = resp.substr(0, 11); Nav_update_config_controls(); } else { std::string err; err.assign(_("Nav_get_configuration: ")).append(resp).append("\n"); print_string(err); } } void Nav_write_eeprom() { std::string cmd = "KS\r\n"; Nav_config.WriteBuffer((unsigned char *)cmd.c_str(), cmd.length()); std::string resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("ks") == std::string::npos) { print_string(_("\nNavigator write to EEPROM failed!\n")); } else print_string(_("\nEEPROM write reported success\n")); } void Nav_restore_eeprom() { std::string cmd = "KR\r\n"; Nav_config.WriteBuffer((unsigned char *)cmd.c_str(), cmd.length()); std::string resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("kr") == std::string::npos) { print_string(_("\nEEPROM data failed!\n")); } else { print_string(_("\nEEPROM data restored\n")); Nav_get_configuration(); } } void Nav_set_channel_1_att(int v) { Nav_config_string[0] = (v ? '1' : '0'); Nav_set_configuration(); } void Nav_set_channel_2_att(int v) { Nav_config_string[1] = (v ? '1' : '0'); Nav_set_configuration(); } void Nav_set_rf_att(int v) { Nav_config_string[2] = (v ? '1' : '0'); Nav_set_configuration(); } extern void Nav_set_wk_ptt(int v) { Nav_config_string[3] = (v ? '1' : '0'); Nav_set_configuration(); } // "1" normal, "0" dim void Nav_set_led(int v) { Nav_config_string[4] = (v ? '1' : '0'); Nav_set_configuration(); } /* void led_dim(void *) { Nav_set_led(0); } void led_normal(void *) { Nav_set_led(1); } void blink_led() { char led = Nav_config_string[4]; if (led == '1') { led_dim(NULL); Fl::add_timeout(1.0, led_normal); } else { led_normal(NULL); Fl::add_timeout(1.0, led_dim); } } */ void Nav_set_cat_led(int v) { Nav_config_string[5] = (v ? '1' : '0'); Nav_set_configuration(); } void Nav_set_polarity(int v) { Nav_config_string[6] = (v ? '0' : '1'); Nav_set_configuration(); } void Nav_set_sidetone(int v) { Nav_config_string[7] = (v ? '0' : '1'); Nav_set_configuration(); } void Nav_set_ptt(int v) { Nav_config_string[8] = (v ? '0' : '1'); Nav_set_configuration(); } void Nav_set_baud(int v) { switch (v) { case 0: Nav_config_string[9] = '1'; break; // 45.45 baud case 1: Nav_config_string[9] = '2'; break; // 75.0 baud case 2: Nav_config_string[9] = '3'; break; // 100.0 baud } Nav_set_configuration(); } void Nav_set_stopbits(int v) { switch (v) { case 0: Nav_config_string[10] = '1'; break; case 1: Nav_config_string[10] = '2'; break; case 2: Nav_config_string[10] = '3'; break; } Nav_set_configuration(); } void Nav_PTT(int val) { } char Nav_read_byte(Cserial &serial, int msec) { std::string resp; resp.clear(); resp = Nav_serial_read(serial); int numtries = msec/100; while (resp.empty() && numtries) { MilliSleep(100); resp = Nav_serial_read(serial); numtries--; } if (resp.empty()) return 0; return resp[0]; } std::string Nav_read_string(Cserial &serial, int msec_wait, std::string find) { std::string resp; resp = Nav_serial_read(serial); int timer = msec_wait; if (timer < 100) msec_wait = timer = 100; if (!find.empty()) { while ((timer > 0) && (resp.find(find) == std::string::npos)) { MilliSleep(100); Fl::awake(); Fl::flush(); resp.append(Nav_serial_read(serial)); timer -= 100; } } else { while (timer) { MilliSleep(100); Fl::awake(); Fl::flush(); resp.append(Nav_serial_read(serial)); timer -= 100; } } if (resp.find("KR") != std::string::npos) { print_string(_("\nNavigator returned error code!\n")); } return resp; } void xmt_delay(int n) { double baudrate = 45.45; if (progdefaults.Nav_FSK_baud == 1) baudrate = 75.0; if (progdefaults.Nav_FSK_baud == 2) baudrate = 100.0; MilliSleep(n * 7500.0 / baudrate); // start + 5 data + 1.5 stop bits } static void send_char(int c) { if (c == LETTERS) { tty_mode = LETTERS; c = 0x1F; } else if (c == FIGURES) { tty_mode = FIGURES; c = 0x1B; } else c &= 0x1F; unsigned char cmd[2] = " "; cmd[0] = c; Nav_serial.WriteBuffer(cmd, 1); xmt_delay(1); } static std::string letters = "E\nA SIU\rDRJNFCKTZLWHYPQOBG MXV "; static std::string figures = "3\n- \a87\r$4\',!:(5\")2#6019?& ./; "; int baudot_enc(char data) { size_t c = std::string::npos; data = toupper(data); c = letters.find(data); if (c != std::string::npos) return (c + 1) | LETTERS; c = figures.find(data); if (c != std::string::npos) return (c + 1) | FIGURES; return -1; } void Nav_send_char(int c) { if (c == GET_TX_CHAR_NODATA) { send_char(LETTERS); return; } if (c == ' ' && tty_mode == FIGURES) send_char(LETTERS); c = baudot_enc(c & 0xFF); if ((tty_mode == LETTERS) && ((c & FIGURES) == FIGURES)) send_char(FIGURES); if ((tty_mode == FIGURES) && ((c & LETTERS) == LETTERS)) send_char(LETTERS); send_char(c); } std::string Nav_serial_read(Cserial &serial) { static char buffer[1025]; memset(buffer, '\0',1025); int rb = serial.ReadBuffer((unsigned char *)buffer, 1024); if (rb) return buffer; return ""; } // One time use of separate thread to read initial values void close_NavFSK() { Nav_serial.ClosePort(); use_Nav = false; print_string(_("Disconnected from Navigator FSK port\n")); progStatus.Nav_online = false; enable_rtty_quickchange(); } /* ===================================================================== Received from Clint, designer of Navigator The B channel of the 2nd FT2232C device is configured as an 8 bit FIFO, only the lower 5 bits are used. Actual FSK parameters are sent to the Navigator Configuration Port, consisting of output Polarity (Normal or Reverse), Sidetone (On or Off), FSK PTT (must be set to ON) Baud Rate (45.45, 75, 100) Stop Bits (1, 1.5, 2) From these settings (Baud rate, Stop bits, Data length (5) and Start bit (1) ) the character rate can be computed to determine when to send the next character to the FIFO (below). Data Channel - Baudot encoded FSK 5 bit characters are sent to the FSK FIFO device. The FIFO is 374 characters deep. The first two characters sent to the FIFO should be sent with no delay between the two characters. Subsequent characters should be sent at a rate determined by the parameters in the previous paragraph. The rate should be about 0.5% faster than the calculated rate to ensure that the buffer is not under run. When the last character is sent to the FIFO, the PTT signal should be dropped. The FSK Controller will maintain the PTT signal to the radio until the last bit of the last character has been transmitted. Output PTT will be dropped at that time. When the PTT drops to the radio, it will return to RX state. Baudot LTRS and FIGS bytes and USOS LTRS bytes are not handled by the Navigator The Navigator does not provide any state feedback to the controlling PC, i.e. state of the FIFO or the PTT signal lines, timing must be approximated in the controlling PC. Note: The FTDI part must provide a Busy Status to indicate when the FIFO is full. In the Windows implementation, there were two configuration items that were used: Open Port: SetCommState() function- the DCB was able to be configured as a 45 baud, 1.5 stop bit, no parity, 5 bit bytesize device. WriteFile() function: Windows buffer size set to 1 - this allowed the flow control to be done without having to time the data rate to avoid buffer under run. ======================================================================*/ bool open_NavFSK() { progStatus.Nav_online = false; Nav_serial.Device(progdefaults.Nav_FSK_port); Nav_serial.Baud(1200); Nav_serial.Timeout(200); Nav_serial.Retries(10); Nav_serial.Stopbits(1); if (!Nav_serial.OpenPort()) { std::string err = std::string(_("Could not open ")).append(progdefaults.Nav_FSK_port).append("\n"); print_string(err); return false; } use_Nav = true; progStatus.Nav_online = true; disable_rtty_quickchange(); print_string(_("Connected to Navigator FSK port\n")); return true; } void close_NavConfig() { Nav_config.ClosePort(); print_string(_("Disconnected from Navigator config port\n")); progStatus.Nav_config_online = false; } bool open_NavConfig() { #ifdef NAVDEBUG std::string info = "Navigator debug file: "; info.append(zdate()).append(" ").append(ztime()).append("\n"); print_string("========================================================\n"); print_string(info); #endif Nav_config.Device(progdefaults.Nav_config_port); Nav_config.Baud(1200); Nav_config.Timeout(200); Nav_config.Retries(10); Nav_config.Stopbits(1); if (!Nav_config.OpenPort()) { std::string err; err.assign(_("Could not open ")).append(progdefaults.Nav_config_port); print_string(err); return false; } std::string cmd = "KT\r\n"; std::string resp = ""; Nav_config.WriteBuffer((unsigned char *)(cmd.c_str()), cmd.length()); resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("kt") == std::string::npos) { Nav_config.WriteBuffer((unsigned char *)(cmd.c_str()), cmd.length()); resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("kt") == std::string::npos) { print_string(_("Navigator failed to respond to NOOP.\n")); close_NavConfig(); return false; } } cmd = "KQ\r\n"; Nav_config.WriteBuffer((unsigned char *)(cmd.c_str()), cmd.length()); resp = Nav_read_string(Nav_config, 2000, "\n"); if (resp.find("\n") == std::string::npos) { print_string(_("Navigator did not send Version string.\n")); close_NavConfig(); return false; } print_string(std::string("Navigator ").append(resp)); Nav_get_configuration(); // blink_led(); print_string(_("Connected to Navigator configuration port\n")); progStatus.Nav_config_online = true; return true; } fldigi-4.2.05/src/cw/ICOMkeying.cxx0000664000175000017500000000712214611711171013647 00000000000000// ---------------------------------------------------------------------------- // ICOMkeying.cxx serial string CW interface to Elecraft transceivers // // Copyright (C) 2020 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "ICOMkeying.h" #include "configuration.h" #include "rigio.h" #include "threads.h" #include "debug.h" #include "rigsupport.h" #include "morse.h" #include "fl_digi.h" #include "util.h" int ICOMwpm = 0; bool use_ICOMkeyer = false; static std::string ICOMcmd; static cMorse *ICOMmorse = 0; char lastICOMchar = 0; static std::string hexvals = "0123456789ABCDEF"; int CIVaddr(std::string s) { int val = 0; if (s.length() != 2) return 0; if (hexvals.find(s[0]) == std::string::npos) return 0; if (hexvals.find(s[1]) == std::string::npos) return 0; val = hexvals.find(s[0]) * 16 + hexvals.find(s[1]); return val; } std::string ICOMheader() { std::string s; s.assign("\xFE\xFE"); s += ((char)CIVaddr(progdefaults.ICOMcivaddr)); s.append("\xE0"); return s; } std::string hexstr(std::string s) { std::string hex; for (size_t i = 0; i < s.length(); i++) { hex.append(" x"); hex += hexvals[(s[i] & 0xFF) >> 4]; hex += hexvals[s[i] & 0xF]; } return hex; } void set_ICOMkeyer() { ICOMwpm = progdefaults.CWspeed; if (ICOMwpm < 6) ICOMwpm = 6; if (ICOMwpm > 48) ICOMwpm = 48; progdefaults.CWspeed = ICOMwpm; int hexwpm = (ICOMwpm - 6) * 6 + 2; ICOMcmd.assign(ICOMheader()); ICOMcmd.append("\x14\x0C"); ICOMcmd += (char)(hexwpm / 100); ICOMcmd += (char)(((hexwpm % 100) / 10) * 16 + (hexwpm % 10)); ICOMcmd += '\xFD'; if (progdefaults.fldigi_client_to_flrig) { xmlrpc_priority(hexstr(ICOMcmd)); } else { guard_lock ser_guard( &rigCAT_mutex); rigio.WriteBuffer((unsigned char *)ICOMcmd.c_str(), ICOMcmd.length()); } MilliSleep(100); } void ICOMkeyer_send_char(int c) { if (ICOMmorse == 0) ICOMmorse = new cMorse; if (ICOMwpm != progdefaults.CWspeed) { set_ICOMkeyer(); } if (c == GET_TX_CHAR_NODATA || c == 0x0d) { MilliSleep(50); return; } int set_time = 0; c = toupper(c); if (c < ' ') c = ' '; if (c > 'Z') c = ' '; int tc = 1200 / progdefaults.CWspeed; if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed > progdefaults.CWfarnsworth)) tc = 1200 / progdefaults.CWfarnsworth; if (c == ' ') { if (lastICOMchar == ' ') tc *= 7; else tc *= 5; } else { tc *= (ICOMmorse->tx_length(c)); ICOMcmd.assign(ICOMheader()); ICOMcmd.append("\x17"); ICOMcmd += (char)(c); ICOMcmd += '\xFD'; if (progdefaults.fldigi_client_to_flrig) { xmlrpc_priority(ICOMcmd); } else if (progdefaults.chkUSERIGCATis) { guard_lock ser_guard( &rigCAT_mutex); rigio.WriteBuffer((unsigned char *)ICOMcmd.c_str(), ICOMcmd.length()); } } tc -= progdefaults.CATkeying_compensation / (progdefaults.CWspeed * 6); tc = int(tc); if (set_time < tc) MilliSleep((int)(tc - set_time)); lastICOMchar = c; } fldigi-4.2.05/src/cw/cw.cxx0000664000175000017500000014400514611711171012324 00000000000000// ---------------------------------------------------------------------------- // cw.cxx -- morse code modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // (C) Mauri Niininen, AG1LE // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "timeops.h" #ifdef __MINGW32__ # include "compat.h" #endif #if !HAVE_CLOCK_GETTIME # ifdef __APPLE__ # include # endif #endif #include "digiscope.h" #include "waterfall.h" #include "fl_digi.h" #include "fftfilt.h" #include "serial.h" #include "ptt.h" #include "main.h" #include "cw.h" #include "misc.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "debug.h" #include "FTextRXTX.h" #include "modem.h" #include "qrunner.h" #include "winkeyer.h" #include "nanoIO.h" #include "KYkeying.h" #include "ICOMkeying.h" #include "YAESUkeying.h" #include "audio_alert.h" void start_cwio_thread(); void stop_cwio_thread(); #define XMT_FILT_LEN 256 #define QSK_DELAY_LEN 4*XMT_FILT_LEN #define CW_FFT_SIZE 2048 // must be a factor of 2 static double nano_d2d = 0; static int nano_wpm = 0; const cw::SOM_TABLE cw::som_table[] = { /* Prosigns */ {"-...-", {1.0, 0.33, 0.33, 0.33, 1.0, 0, 0} }, {".-.-", { 0.33, 1.0, 0.33, 1.0, 0, 0, 0} }, {".-...", { 0.33, 1.0, 0.33, 0.33, 0.33, 0, 0} }, {".-.-.", { 0.33, 1.0, 0.33, 1.0, 0.33, 0, 0} }, {"...-.-", { 0.33, 0.33, 0.33, 1.0, 0.33, 1.0, 0} }, {"-.--.", {1.0, 0.33, 1.0, 1.0, 0.33, 0, 0} }, {"..-.-", { 0.33, 0.33, 1.0, 0.33, 1.0, 0, 0} }, {"....--", { 0.33, 0.33, 0.33, 0.33, 1.0, 1.0, 0} }, {"...-.", { 0.33, 0.33, 0.33, 1.0, 0.33, 0, 0} }, /* ASCII 7bit letters */ {".-", { 0.33, 1.0, 0, 0, 0, 0, 0} }, {"-...", {1.0, 0.33, 0.33, 0.33, 0, 0, 0} }, {"-.-.", {1.0, 0.33, 1.0, 0.33, 0, 0, 0} }, {"-..", {1.0, 0.33, 0.33, 0, 0, 0, 0} }, {".", { 0.33, 0, 0, 0, 0, 0, 0} }, {"..-.", { 0.33, 0.33, 1.0, 0.33, 0, 0, 0} }, {"--.", {1.0, 1.0, 0.33, 0, 0, 0, 0} }, {"....", { 0.33, 0.33, 0.33, 0.33, 0, 0, 0} }, {"..", { 0.33, 0.33, 0, 0, 0, 0, 0} }, {".---", { 0.33, 1.0, 1.0, 1.0, 0, 0, 0} }, {"-.-", {1.0, 0.33, 1.0, 0, 0, 0, 0} }, {".-..", { 0.33, 1.0, 0.33, 0.33, 0, 0, 0} }, {"--", {1.0, 1.0, 0, 0, 0, 0, 0} }, {"-.", {1.0, 0.33, 0, 0, 0, 0, 0} }, {"---", {1.0, 1.0, 1.0, 0, 0, 0, 0} }, {".--.", { 0.33, 1.0, 1.0, 0.33, 0, 0, 0} }, {"--.-", {1.0, 1.0, 0.33, 1.0, 0, 0, 0} }, {".-.", { 0.33, 1.0, 0.33, 0, 0, 0, 0} }, {"...", { 0.33, 0.33, 0.33, 0, 0, 0, 0} }, {"-", {1.0, 0, 0, 0, 0, 0, 0} }, {"..-", { 0.33, 0.33, 1.0, 0, 0, 0, 0} }, {"...-", { 0.33, 0.33, 0.33, 1.0, 0, 0, 0} }, {".--", { 0.33, 1.0, 1.0, 0, 0, 0, 0} }, {"-..-", {1.0, 0.33, 0.33, 1.0, 0, 0, 0} }, {"-.--", {1.0, 0.33, 1.0, 1.0, 0, 0, 0} }, {"--..", {1.0, 1.0, 0.33, 0.33, 0, 0, 0} }, /* Numerals */ {"-----", {1.0, 1.0, 1.0, 1.0, 1.0, 0, 0} }, {".----", { 0.33, 1.0, 1.0, 1.0, 1.0, 0, 0} }, {"..---", { 0.33, 0.33, 1.0, 1.0, 1.0, 0, 0} }, {"...--", { 0.33, 0.33, 0.33, 1.0, 1.0, 0, 0} }, {"....-", { 0.33, 0.33, 0.33, 0.33, 1.0, 0, 0} }, {".....", { 0.33, 0.33, 0.33, 0.33, 0.33, 0, 0} }, {"-....", {1.0, 0.33, 0.33, 0.33, 0.33, 0, 0} }, {"--...", {1.0, 1.0, 0.33, 0.33, 0.33, 0, 0} }, {"---..", {1.0, 1.0, 1.0, 0.33, 0.33, 0, 0} }, {"----.", {1.0, 1.0, 1.0, 1.0, 0.33, 0, 0} }, /* Punctuation */ {".-..-.", { 0.33, 1.0, 0.33, 0.33, 1.0, 0.33, 0} }, {".----.", { 0.33, 1.0, 1.0, 1.0, 1.0, 0.33, 0} }, {"...-..-", { 0.33, 0.33, 0.33, 1.0, 0.33, 0.33, 1.0} }, {"-.---.", {1.0, 0.33, 1.0, 1.0, 0.33, 0, 0} }, {"-.--.-", {1.0, 0.33, 1.0, 1.0, 0.33, 1.0, 0} }, {"--..--", {1.0, 1.0, 0.33, 0.33, 1.0, 1.0, 0} }, {"-....-", {1.0, 0.33, 0.33, 0.33, 0.33, 1.0, 0} }, {".-.-.-", { 0.33, 1.0, 0.33, 1.0, 0.33, 1.0, 0} }, {"-..-.", {1.0, 0.33, 0.33, 1.0, 0.33, 0, 0} }, {"---...", {1.0, 1.0, 1.0, 0.33, 0.33, 0.33, 0} }, {"-.-.-.", {1.0, 0.33, 1.0, 0.33, 1.0, 0.33, 0} }, {"..--..", { 0.33, 0.33, 1.0, 1.0, 0.33, 0.33, 0} }, {"..--.-", { 0.33, 0.33, 1.0, 1.0, 0.33, 1.0, 0} }, {".--.-.", { 0.33, 1.0, 1.0, 0.33, 1.0, 0.33, 0} }, {"-.-.--", {1.0, 0.33, 1.0, 0.33, 1.0, 1.0, 0} }, {".-.-", {0.33, 1.0, 0.33, 1.0, 0, 0 , 0} }, // A umlaut, A aelig {".--.-", {0.33, 1.0, 1.0, 0.33, 1.0, 0, 0 } }, // A ring {"-.-..", {1.0, 0.33, 1.0, 0.33, 0.33, 0, 0} }, // C cedilla {".-..-", {0.33, 1.0, 0.33, 0.33, 1.0, 0, 0} }, // E grave {"..-..", {0.33, 0.33, 1.0, 0.33, 0.33, 0, 0} }, // E acute {"---.", {1.0, 1.0, 1.0, 0.33, 0, 0, 0} }, // O acute, O umlat, O slash {"--.--", {1.0, 1.0, 0.33, 1.0, 1.0, 0, 0} }, // N tilde {"..--", {0.33, 0.33, 1.0, 1.0, 0, 0, 0} }, // U umlaut, U circ {"", {0.0}} }; int cw::normalize(float *v, int n, int twodots) { if( n == 0 ) return 0 ; float max = v[0]; float min = v[0]; int j; /* find max and min values */ for (j=1; j max) max = vj; else if (vj < min) min = vj; } /* all values 0 - no need to normalize or decode */ if (max == 0.0) return 0; /* scale values between [0,1] -- if Max longer than 2 dots it was "dah" and should be 1.0, otherwise it was "dit" and should be 0.33 */ float ratio = (max > twodots) ? 1.0 : 0.33 ; ratio /= max ; for (j=0; j diffsf) break; } /* If distance is smaller than previous distances */ if (difference < diffsf) { winner = n; diffsf = difference; } } std::string sc; if (!som_table[winner].rpr.empty()) { sc = morse->rx_lookup(som_table[winner].rpr); if (sc.empty()) sc = (progdefaults.CW_noise == '*' ? "*" : progdefaults.CW_noise == '_' ? "_" : progdefaults.CW_noise == ' ' ? " " : ""); } else sc = (progdefaults.CW_noise == '*' ? "*" : progdefaults.CW_noise == '_' ? "_" : progdefaults.CW_noise == ' ' ? " " : ""); return sc; } void cw::tx_init() { phaseacc = 0; lastsym = 0; qskphase = 0; if (progdefaults.pretone) pretone(); symbols = 0; acc_symbols = 0; ovhd_symbols = 0; maxval = 0.0; } void cw::rx_init() { cw_receive_state = RS_IDLE; smpl_ctr = 0; cw_rr_current = 0; cw_ptr = 0; agc_peak = 0; set_scope_mode(Digiscope::SCOPE); update_Status(); usedefaultWPM = false; scope_clear = true; viewcw.restart(); } void cw::init() { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.CWsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); trackingfilter->reset(); two_dots = (long int)trackingfilter->run(2 * cw_send_dot_length); put_cwRcvWPM(cw_send_speed); memset(outbuf, 0, OUTBUFSIZE*sizeof(*outbuf)); memset(qskbuf, 0, OUTBUFSIZE*sizeof(*qskbuf)); morse->init(); use_paren = progdefaults.CW_use_paren; prosigns = progdefaults.CW_prosigns; rx_init(); stopflag = false; maxval = 0; if (use_nanoIO) set_nanoCW(); } cw::~cw() { if (cw_FFT_filter) delete cw_FFT_filter; if (bitfilter) delete bitfilter; if (trackingfilter) delete trackingfilter; stop_cwio_thread(); } cw::cw() : modem() { cap |= CAP_BW; mode = MODE_CW; freqlock = false; usedefaultWPM = false; frequency = progdefaults.CWsweetspot; tx_frequency = get_txfreq_woffset(); risetime = progdefaults.CWrisetime; QSKshape = progdefaults.QSKshape; cw_ptr = 0; clrcount = CLRCOUNT; samplerate = CW_SAMPLERATE; fragmentsize = CWMaxSymLen; wpm = cw_speed = progdefaults.CWspeed; bandwidth = progdefaults.CWbandwidth; cw_send_speed = cw_speed; cw_receive_speed = cw_speed; two_dots = 2 * KWPM / cw_speed; cw_noise_spike_threshold = two_dots / 4; cw_send_dot_length = KWPM / cw_send_speed; cw_send_dash_length = 3 * cw_send_dot_length; symbollen = (int)round(samplerate * 1.2 / progdefaults.CWspeed); // transmit char rate fsymlen = (int)round(samplerate * 1.2 / progdefaults.CWfarnsworth); // transmit word rate rx_rep_buf.clear(); // block of variables that get updated each time speed changes pipesize = (22 * samplerate * 12) / (progdefaults.CWspeed * 160); if (pipesize < 0) pipesize = 512; if (pipesize > MAX_PIPE_SIZE) pipesize = MAX_PIPE_SIZE; cwTrack = true; phaseacc = 0.0; FFTphase = 0.0; FFTvalue = 0.0; pipeptr = 0; clrcount = 0; upper_threshold = progdefaults.CWupper; lower_threshold = progdefaults.CWlower; for (int i = 0; i < MAX_PIPE_SIZE; clearpipe[i++] = 0.0); agc_peak = 1.0; in_replay = 0; use_matched_filter = progdefaults.CWmfilt; bandwidth = progdefaults.CWbandwidth; if (use_matched_filter) progdefaults.CWbandwidth = bandwidth = 5.0 * progdefaults.CWspeed / 1.2; cw_FFT_filter = new fftfilt(1.0 * progdefaults.CWbandwidth / samplerate, CW_FFT_SIZE); int bfv = symbollen / ( 2 * DEC_RATIO); if (bfv < 1) bfv = 1; bitfilter = new Cmovavg(bfv); trackingfilter = new Cmovavg(TRACKING_FILTER_SIZE); create_edges(); nano_wpm = progdefaults.CWspeed; nano_d2d = progdefaults.CWdash2dot; sync_parameters(); REQ(static_cast(&waterfall::Bandwidth), wf, (int)bandwidth); REQ(static_cast(&Fl_Value_Slider2::value), sldrCWbandwidth, (int)bandwidth); update_Status(); synchscope = 50; noise_floor = 1.0; sig_avg = 0.0; cal_wpm = 20; start_cwio_thread(); } // SHOULD ONLY BE CALLED FROM THE rx_processing loop void cw::reset_rx_filter() { if (use_matched_filter != progdefaults.CWmfilt || cw_speed != progdefaults.CWspeed || (bandwidth != progdefaults.CWbandwidth && !use_matched_filter)) { use_matched_filter = progdefaults.CWmfilt; cw_send_speed = cw_speed = progdefaults.CWspeed; if (use_matched_filter) progdefaults.CWbandwidth = bandwidth = 5.0 * progdefaults.CWspeed / 1.2; else bandwidth = progdefaults.CWbandwidth; cw_FFT_filter->create_lpf(1.0 * bandwidth / samplerate); FFTphase = 0; REQ(static_cast(&waterfall::Bandwidth), wf, (int)bandwidth); REQ(static_cast(&Fl_Value_Slider2::value), sldrCWbandwidth, (int)bandwidth); pipesize = (22 * samplerate * 12) / (progdefaults.CWspeed * 160); if (pipesize < 0) pipesize = 512; if (pipesize > MAX_PIPE_SIZE) pipesize = MAX_PIPE_SIZE; two_dots = 2 * KWPM / cw_speed; cw_noise_spike_threshold = two_dots / 4; cw_send_dot_length = KWPM / cw_send_speed; cw_send_dash_length = 3 * cw_send_dot_length; symbollen = (int)round(samplerate * 1.2 / progdefaults.CWspeed); fsymlen = (int)round(samplerate * 1.2 / progdefaults.CWfarnsworth); phaseacc = 0.0; FFTphase = 0.0; FFTvalue = 0.0; pipeptr = 0; clrcount = 0; smpl_ctr = 0; rx_rep_buf.clear(); int bfv = symbollen / ( 2 * DEC_RATIO); if (bfv < 1) bfv = 1; bitfilter->setLength(bfv); siglevel = 0; } } // sync_parameters() // Synchronize the dot, dash, end of element, end of character, and end // of word timings and ranges to new values of Morse speed, or receive tolerance. void cw::sync_transmit_parameters() { // wpm = usedefaultWPM ? progdefaults.defCWspeed : progdefaults.CWspeed; fwpm = progdefaults.CWfarnsworth; cw_send_dot_length = KWPM / progdefaults.CWspeed; cw_send_dash_length = 3 * cw_send_dot_length; nusymbollen = (int)round(samplerate * 1.2 / progdefaults.CWspeed); nufsymlen = (int)round(samplerate * 1.2 / fwpm); if (symbollen != nusymbollen || nufsymlen != fsymlen || risetime != progdefaults.CWrisetime || QSKshape != progdefaults.QSKshape) { risetime = progdefaults.CWrisetime; QSKshape = progdefaults.QSKshape; symbollen = nusymbollen; fsymlen = nufsymlen; create_edges(); } } void cw::sync_parameters() { sync_transmit_parameters(); if (use_nanoIO) { if (nano_wpm != progdefaults.CWspeed) { nano_wpm = progdefaults.CWspeed; set_nanoWPM(progdefaults.CWspeed); } if (nano_d2d != progdefaults.CWdash2dot) { nano_d2d = progdefaults.CWdash2dot; set_nano_dash2dot(progdefaults.CWdash2dot); } } // check if user changed the tracking or the cw default speed if ((cwTrack != progdefaults.CWtrack) || (cw_send_speed != progdefaults.CWspeed)) { trackingfilter->reset(); two_dots = 2 * cw_send_dot_length; put_cwRcvWPM(cw_send_speed); } cwTrack = progdefaults.CWtrack; cw_send_speed = progdefaults.CWspeed; // Receive parameters: lowerwpm = cw_send_speed - progdefaults.CWrange; upperwpm = cw_send_speed + progdefaults.CWrange; if (lowerwpm < progdefaults.CWlowerlimit) lowerwpm = progdefaults.CWlowerlimit; if (upperwpm > progdefaults.CWupperlimit) upperwpm = progdefaults.CWupperlimit; cw_lower_limit = 2 * KWPM / upperwpm; cw_upper_limit = 2 * KWPM / lowerwpm; if (cwTrack) cw_receive_speed = KWPM / (two_dots / 2); else { cw_receive_speed = cw_send_speed; two_dots = 2 * cw_send_dot_length; } if (cw_receive_speed > 0) cw_receive_dot_length = KWPM / cw_receive_speed; else cw_receive_dot_length = KWPM / 5; cw_receive_dash_length = 3 * cw_receive_dot_length; cw_noise_spike_threshold = cw_receive_dot_length / 2; } //======================================================================= // cw_update_tracking() //======================================================================= inline void cw::update_tracking(int dur_1, int dur_2) { static int min_dot = KWPM / 200; static int max_dash = 3 * KWPM / 5; if ((dur_1 > dur_2) && (dur_1 > 4 * dur_2)) return; if ((dur_2 > dur_1) && (dur_2 > 4 * dur_1)) return; if (dur_1 < min_dot || dur_2 < min_dot) return; if (dur_2 > max_dash || dur_2 > max_dash) return; two_dots = trackingfilter->run((dur_1 + dur_2) / 2); sync_parameters(); } void cw::update_Status() { put_MODEstatus("CW %s Rx %d", usedefaultWPM ? "*" : " ", cw_receive_speed); } //======================================================================= //update_syncscope() //Routine called to update the display on the sync scope display. //For CW this is an o scope pattern that shows the cw data streacwTrackm. //======================================================================= // void cw::update_syncscope() { if (pipesize < 0 || pipesize > MAX_PIPE_SIZE) return; for (int i = 0; i < pipesize; i++) scopedata[i] = 0.96*pipe[i]+0.02; set_scope_xaxis_1(siglevel); set_scope(scopedata, pipesize, true); scopedata.next(); // change buffers clrcount = CLRCOUNT; put_cwRcvWPM(cw_receive_speed); update_Status(); } void cw::clear_syncscope() { set_scope_xaxis_1(siglevel); set_scope(clearpipe, pipesize, false); clrcount = CLRCOUNT; } cmplx cw::mixer(cmplx in) { cmplx z (cos(phaseacc), sin(phaseacc)); z = z * in; phaseacc += TWOPI * frequency / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; return z; } //===================================================================== // cw_rxprocess() // Called with a block (size SCBLOCKSIZE samples) of audio. // //====================================================================== void cw::decode_stream(double value) { std::string sc; std::string somc; int attack = 0; int decay = 0; switch (progdefaults.cwrx_attack) { case 0: attack = 400; break;//100; break; case 1: default: attack = 200; break;//50; break; case 2: attack = 100;//25; } switch (progdefaults.cwrx_decay) { case 0: decay = 2000; break;//1000; break; case 1: default : decay = 1000; break;//500; break; case 2: decay = 500;//250; } sig_avg = decayavg(sig_avg, value, decay); if (value < sig_avg) { if (value < noise_floor) noise_floor = decayavg(noise_floor, value, attack); else noise_floor = decayavg(noise_floor, value, decay); } if (value > sig_avg) { if (value > agc_peak) agc_peak = decayavg(agc_peak, value, attack); else agc_peak = decayavg(agc_peak, value, decay); } float norm_noise = noise_floor / agc_peak; float norm_sig = sig_avg / agc_peak; siglevel = norm_sig; if (agc_peak) value /= agc_peak; else value = 0; metric = 0.8 * metric; if ((noise_floor > 1e-4) && (noise_floor < sig_avg)) metric += 0.2 * clamp(2.5 * (20*log10(sig_avg / noise_floor)) , 0, 100); float diff = (norm_sig - norm_noise); progdefaults.CWupper = norm_sig - 0.2 * diff; progdefaults.CWlower = norm_noise + 0.7 * diff; pipe[pipeptr] = value; if (++pipeptr == pipesize) pipeptr = 0; if (!progStatus.sqlonoff || metric > progStatus.sldrSquelchValue ) { // Power detection using hysterisis detector // upward trend means tone starting if ((value > progdefaults.CWupper) && (cw_receive_state != RS_IN_TONE)) { handle_event(CW_KEYDOWN_EVENT, sc); } // downward trend means tone stopping if ((value < progdefaults.CWlower) && (cw_receive_state == RS_IN_TONE)) { handle_event(CW_KEYUP_EVENT, sc); } } if (handle_event(CW_QUERY_EVENT, sc) == CW_SUCCESS) { update_syncscope(); synchscope = 100; if (progdefaults.CWuseSOMdecoding) { somc = find_winner(cw_buffer, two_dots); if (!somc.empty()) for (size_t n = 0; n < somc.length(); n++) put_rx_char( somc[n], somc[0] == '<' ? FTextBase::CTRL : FTextBase::RECV); cw_ptr = 0; memset(cw_buffer, 0, sizeof(cw_buffer)); } else { for (size_t n = 0; n < sc.length(); n++) put_rx_char( sc[n], sc[0] == '<' ? FTextBase::CTRL : FTextBase::RECV); } } else if (--synchscope == 0) { synchscope = 25; update_syncscope(); } } void cw::rx_FFTprocess(const double *buf, int len) { cmplx z, *zp; int n; while (len-- > 0) { z = cmplx ( *buf * cos(FFTphase), *buf * sin(FFTphase) ); FFTphase += TWOPI * frequency / samplerate; if (FFTphase > TWOPI) FFTphase -= TWOPI; buf++; n = cw_FFT_filter->run(z, &zp); // n = 0 or filterlen/2 if (!n) continue; for (int i = 0; i < n; i++) { // update the basic sample counter used for morse timing ++smpl_ctr; if (smpl_ctr % DEC_RATIO) continue; // decimate by DEC_RATIO // demodulate FFTvalue = abs(zp[i]); FFTvalue = bitfilter->run(FFTvalue); decode_stream(FFTvalue); } // for (i =0; i < n ... } //while (len-- > 0) } static bool cwprocessing = false; int cw::rx_process(const double *buf, int len) { if (use_paren != progdefaults.CW_use_paren || prosigns != progdefaults.CW_prosigns) { use_paren = progdefaults.CW_use_paren; prosigns = progdefaults.CW_prosigns; morse->init(); } if (cwprocessing) return 0; cwprocessing = true; reset_rx_filter(); rx_FFTprocess(buf, len); if (!clrcount--) clear_syncscope(); display_metric(metric); if ( (dlgViewer->visible() || progStatus.show_channels ) && !bHighSpeed && !bHistory ) viewcw.rx_process(buf, len); cwprocessing = false; return 0; } // ---------------------------------------------------------------------- // Compare two timestamps, and return the difference between them in usecs. inline int cw::usec_diff(unsigned int earlier, unsigned int later) { return (earlier >= later) ? 0 : (later - earlier); } //======================================================================= // handle_event() // high level cw decoder... gets called with keyup, keydown, reset and // query commands. // Keyup/down influences decoding logic. // Reset starts everything out fresh. // The query command returns CW_SUCCESS and the character that has // been decoded (may be '*',' ' or [a-z,0-9] or a few others) // If there is no data ready, CW_ERROR is returned. //======================================================================= int cw::handle_event(int cw_event, std::string &sc) { static int space_sent = true; // for word space logic static int last_element = 0; // length of last dot/dash int element_usec; // Time difference in usecs switch (cw_event) { case CW_RESET_EVENT: sync_parameters(); cw_receive_state = RS_IDLE; cw_rr_current = 0; // reset decoding pointer cw_ptr = 0; memset(cw_buffer, 0, sizeof(cw_buffer)); smpl_ctr = 0; // reset audio sample counter rx_rep_buf.clear(); break; case CW_KEYDOWN_EVENT: // A receive tone start can only happen while we // are idle, or in the middle of a character. if (cw_receive_state == RS_IN_TONE) return CW_ERROR; // first tone in idle state reset audio sample counter if (cw_receive_state == RS_IDLE) { smpl_ctr = 0; rx_rep_buf.clear(); cw_rr_current = 0; cw_ptr = 0; } // save the timestamp cw_rr_start_timestamp = smpl_ctr; // Set state to indicate we are inside a tone. old_cw_receive_state = cw_receive_state; cw_receive_state = RS_IN_TONE; return CW_ERROR; break; case CW_KEYUP_EVENT: // The receive state is expected to be inside a tone. if (cw_receive_state != RS_IN_TONE) return CW_ERROR; // Save the current timestamp cw_rr_end_timestamp = smpl_ctr; element_usec = usec_diff(cw_rr_start_timestamp, cw_rr_end_timestamp); // make sure our timing values are up to date sync_parameters(); // If the tone length is shorter than any noise cancelling // threshold that has been set, then ignore this tone. if (cw_noise_spike_threshold > 0 && element_usec < cw_noise_spike_threshold) { cw_receive_state = RS_IDLE; return CW_ERROR; } // Set up to track speed on dot-dash or dash-dot pairs for this test to work, we need a dot dash pair or a // dash dot pair to validate timing from and force the speed tracking in the right direction. This method // is fundamentally different than the method in the unix cw project. Great ideas come from staring at the // screen long enough!. Its kind of simple really ... when you have no idea how fast or slow the cw is... // the only way to get a threshold is by having both code elements and setting the threshold between them // knowing that one is supposed to be 3 times longer than the other. with straight key code... this gets // quite variable, but with most faster cw sent with electronic keyers, this is one relationship that is // quite reliable. Lawrence Glaister (ve7it@shaw.ca) if (last_element > 0) { // check for dot dash sequence (current should be 3 x last) if ((element_usec > 2 * last_element) && (element_usec < 4 * last_element)) { update_tracking(last_element, element_usec); } // check for dash dot sequence (last should be 3 x current) if ((last_element > 2 * element_usec) && (last_element < 4 * element_usec)) { update_tracking(element_usec, last_element); } } last_element = element_usec; // ok... do we have a dit or a dah? // a dot is anything shorter than 2 dot times if (element_usec <= two_dots) { rx_rep_buf += CW_DOT_REPRESENTATION; // printf("%d dit ", last_element/1000); // print dot length cw_buffer[cw_ptr++] = (float)last_element; } else { // a dash is anything longer than 2 dot times rx_rep_buf += CW_DASH_REPRESENTATION; cw_buffer[cw_ptr++] = (float)last_element; } // We just added a representation to the receive buffer. // If it's full, then reset everything as it probably noise if (rx_rep_buf.length() > MAX_MORSE_ELEMENTS) { cw_receive_state = RS_IDLE; cw_rr_current = 0; // reset decoding pointer cw_ptr = 0; smpl_ctr = 0; // reset audio sample counter return CW_ERROR; } else { // zero terminate representation // rx_rep_buf.clear(); cw_buffer[cw_ptr] = 0.0; } // All is well. Move to the more normal after-tone state. cw_receive_state = RS_AFTER_TONE; return CW_ERROR; break; case CW_QUERY_EVENT: // this should be called quite often (faster than inter-character gap) It looks after timing // key up intervals and determining when a character, a word space, or an error char '*' should be returned. // CW_SUCCESS is returned when there is a printable character. Nothing to do if we are in a tone if (cw_receive_state == RS_IN_TONE) return CW_ERROR; // compute length of silence so far sync_parameters(); element_usec = usec_diff(cw_rr_end_timestamp, smpl_ctr); // SHORT time since keyup... nothing to do yet if (element_usec < (2 * cw_receive_dot_length)) return CW_ERROR; // MEDIUM time since keyup... check for character space // one shot through this code via receive state logic // FARNSWOTH MOD HERE --> if (element_usec >= (2 * cw_receive_dot_length) && element_usec <= (4 * cw_receive_dot_length) && cw_receive_state == RS_AFTER_TONE) { // Look up the representation sc = morse->rx_lookup(rx_rep_buf); if (sc.empty()) { // invalid decode... let user see error sc = (progdefaults.CW_noise == '*' ? "*" : progdefaults.CW_noise == '_' ? "_" : progdefaults.CW_noise == ' ' ? " " : ""); } rx_rep_buf.clear(); cw_receive_state = RS_IDLE; cw_rr_current = 0; // reset decoding pointer space_sent = false; cw_ptr = 0; return CW_SUCCESS; } // LONG time since keyup... check for a word space // FARNSWOTH MOD HERE --> if ((element_usec > (4 * cw_receive_dot_length)) && !space_sent) { sc = " "; space_sent = true; return CW_SUCCESS; } // should never get here... catch all return CW_ERROR; break; } // should never get here... catch all return CW_ERROR; } //=========================================================================== // cw transmit routines // Define the amplitude envelop for key down events (32 samples long) // this is 1/2 cycle of a raised cosine //=========================================================================== double keyshape[CWKNUM]; double QSKkeyshape[CWKNUM]; void cw::create_edges() { for (int i = 0; i < CWKNUM; i++) keyshape[i] = 1.0; switch (QSKshape) { case 1: // blackman knum = (int)(risetime * CW_SAMPLERATE / 1000); if (knum >= symbollen) knum = symbollen; for (int i = 0; i < knum; i++) keyshape[i] = (0.42 - 0.50 * cos(M_PI * i/ knum) + 0.08 * cos(2 * M_PI * i / knum)); break; case 0: // hanning default: knum = (int)(risetime * CW_SAMPLERATE / 1000); if (knum >= symbollen) knum = symbollen; for (int i = 0; i < knum; i++) keyshape[i] = 0.5 * (1.0 - cos (M_PI * i / knum)); } for (int i = 0; i < CWKNUM; i++) QSKkeyshape[i] = 1.0; switch (QSKshape) { case 1: // blackman qnum = (int)(progdefaults.QSKrisetime * CW_SAMPLERATE / 1000); if (qnum >= symbollen) qnum = symbollen; for (int i = 0; i < qnum; i++) QSKkeyshape[i] = (0.42 - 0.50 * cos(M_PI * i/ qnum) + 0.08 * cos(2 * M_PI * i / qnum)); break; case 0: // hanning default: qnum = (int)(progdefaults.QSKrisetime * CW_SAMPLERATE / 1000); if (qnum >= symbollen) qnum = symbollen; for (int i = 0; i < qnum; i++) QSKkeyshape[i] = 0.5 * (1.0 - cos (M_PI * i / qnum)); } } inline double cw::nco(double freq) { phaseacc += 2.0 * M_PI * freq / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; return sin(phaseacc); } inline double cw::qsknco() { double amp; amp = sin(qskphase); qskphase += TWOPI * progdefaults.QSKfrequency / samplerate; if (qskphase > TWOPI) qskphase -= TWOPI; return amp; } //===================================================================== // send_symbol() // Sends a part of a morse character (one dot duration) of either // sound at the correct freq or silence. Rise and fall time is controlled // with a raised cosine shape. // // Left channel contains the shaped A2 CW waveform // Right channel contains a square wave signal that is used // to trigger a qsk switch. Right channel has pre and post timings for // proper switching of the qsk switch before and after the A2 element. // If the Pre + Post timing exceeds the interelement spacing then the // Pre and / or Post is only applied at the beginning and end of the // character. //======================================================================= bool first_char = true; enum {START, FIRST, MID, LAST, SPACE}; void cw::send_symbol(int bit, int len, int state) { double qsk_amp = progdefaults.QSK ? progdefaults.QSKamp : 0.0; sync_transmit_parameters(); acc_symbols += len; memset(outbuf, 0, OUTBUFSIZE*sizeof(*outbuf)); memset(qskbuf, 0, OUTBUFSIZE*sizeof(*qskbuf)); if (bit == 1) { // keydown tx_frequency = get_txfreq_woffset(); if (CW_KEYLINE_isopen || progdefaults.CW_KEYLINE_on_cat_port || progdefaults.CW_KEYLINE_on_ptt_port) tx_frequency = progdefaults.CWsweetspot; for (int n = 0; n < len; n++) { outbuf[n] = nco(tx_frequency); if (n < knum) outbuf[n] *= keyshape[n]; if (len - n < knum) outbuf[n] *= keyshape[len - n]; qskbuf[n] = qsk_amp * qsknco(); } } else { // keyup for (int n = 0; n < len; n++) { outbuf[n] = 0; if (progdefaults.QSK) { qskbuf[n] = 0; if (state == START || state == FIRST) { qskbuf[n] = 0; if (n > len - kpre) { qskbuf[n] = qsk_amp * qsknco(); if (n < len - kpre + qnum) qskbuf[n] *= QSKkeyshape[n - (len - kpre)]; } } else if (state == MID) { qskbuf[n] = qsk_amp * qsknco(); if (len > kpre + kpost) { if (n < kpost) qskbuf[n] *= QSKkeyshape[kpost - n]; else if (n > len - kpre) qskbuf[n] *= QSKkeyshape[n - (len - kpre)]; else qskbuf[n] = 0; } } else if (state == LAST) { qskbuf[n] = qsk_amp * qsknco(); if (n > kpost - qnum) qskbuf[n] *= QSKkeyshape[kpost - n]; if (n >= kpost) qskbuf[n] = 0; } else { // state == SPACE qskbuf[n] = 0; } } } } if (progdefaults.QSK) ModulateStereo(outbuf, qskbuf, len); else ModulateXmtr(outbuf, len); } //===================================================================== // send_ch() // sends a morse character and the space afterwards //======================================================================= void cw::send_ch(int ch) { std::string code; float kfactor = CW_SAMPLERATE / 1000.0; float tc = 1200.0 / progdefaults.CWspeed; float ta = 0.0; float tch = 3 * tc, twd = 4 * tc; if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed > progdefaults.CWfarnsworth)) { ta = 60000.0 / progdefaults.CWfarnsworth - 37200.0 / progdefaults.CWspeed; tch = 3 * ta / 19; twd = 4 * ta / 19; } if (progdefaults.CWusewordsworth && (progdefaults.CWspeed > progdefaults.CWwordsworth)) twd = 4800 / progdefaults.CWwordsworth; tc *= kfactor; tch *= kfactor; twd *= kfactor; sync_parameters(); if (progdefaults.CWpre < progdefaults.QSKrisetime) kpre = progdefaults.QSKrisetime * kfactor; else kpre = progdefaults.CWpre * kfactor; if (progdefaults.CWpost < progdefaults.QSKrisetime) kpost = progdefaults.QSKrisetime * kfactor; else kpost = progdefaults.CWpost * kfactor; if ((ch == ' ') || (ch == '\n')) { send_symbol(0, twd, SPACE); put_echo_char(progdefaults.rx_lowercase ? tolower(ch) : ch); return; } code = morse->tx_lookup(ch); //std::cout << (char)ch << "[" << code << "]"; std::cout.flush(); if (!code.length()) { return; } float w = (progdefaults.CWdash2dot + 1) / (progdefaults.CWdash2dot -1); int elements = code.length(); if (kpre) send_symbol( 0, (first_char ? kpre : (kpre < 3 * tc - kpost) ? kpre : 3 * tc ), (first_char ? START : FIRST)); for (int n = 0; n < elements; n++) { send_symbol(1, (code[n] == '-' ? (w + 1) : (w - 1)) * symbollen, MID); send_symbol(0, ((n < elements - 1) ? tc : (kpost + kpre < 3 * tc) ? tch - kpre: tch), (n < elements - 1 ? MID : LAST) ); } if (ch != -1) { std::string prtstr = morse->tx_print(); for (size_t n = 0; n < prtstr.length(); n++) put_echo_char( prtstr[n], prtstr[0] == '<' ? FTextBase::CTRL : FTextBase::XMIT); } } //===================================================================== // cw_txprocess() // Read characters from screen and send them out the sound card. // This is called repeatedly from a thread during tx. //======================================================================= int cw::tx_process() { int c = get_tx_char(); if (c == GET_TX_CHAR_NODATA) { if (stopflag) { stopflag = false; put_echo_char('\n'); first_char = true; return -1; } Fl::awake(); MilliSleep(50); return 0; } if (progdefaults.use_FLRIGkeying) { if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; put_echo_char('\n'); return -1; } flrig_cwio_send(c); put_echo_char(c); return 0; } if (progStatus.WK_online) { if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; put_echo_char('\n'); return -1; } if (WK_send_char(c)) { put_echo_char('\n'); return -1; // WinKeyer problem } return 0; } if (use_nanoIO) { if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; put_echo_char('\n'); return -1; } nano_send_char(c); put_echo_char(c); return 0; } if (progdefaults.use_ELCTkeying || progdefaults.use_KNWDkeying) { if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; put_echo_char('\n'); return -1; } KYkeyer_send_char(c); put_echo_char(c); return 0; } if (progdefaults.use_ICOMkeying) { if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; put_echo_char('\n'); return -1; } ICOMkeyer_send_char(c); put_echo_char(c); return 0; } if (progdefaults.use_YAESUkeying) { if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; put_echo_char('\n'); return -1; } FTkeyer_send_char(c); put_echo_char(c); return 0; } if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; put_echo_char('\n'); first_char = true; return -1; } acc_symbols = 0; if (CW_KEYLINE_isopen || progdefaults.CW_KEYLINE_on_cat_port || progdefaults.CW_KEYLINE_on_ptt_port) send_CW(c); // else { send_ch(c); first_char = false; // } char_samples = acc_symbols; return 0; } void cw::incWPM() { if (usedefaultWPM) return; if (progdefaults.CWspeed < progdefaults.CWupperlimit) { progdefaults.CWspeed++; sync_parameters(); set_CWwpm(); update_Status(); } } void cw::decWPM() { if (usedefaultWPM) return; if (progdefaults.CWspeed > progdefaults.CWlowerlimit) { progdefaults.CWspeed--; set_CWwpm(); sync_parameters(); update_Status(); } } void cw::toggleWPM() { usedefaultWPM = !usedefaultWPM; if (usedefaultWPM) { wpm = progdefaults.CWspeed; progdefaults.CWspeed = progdefaults.defCWspeed; } else { progdefaults.CWspeed = wpm; } sync_parameters(); update_Status(); } // --------------------------------------------------------------------- // CW output on DTR/RTS signal lines //---------------------------------------------------------------------- Cserial CW_KEYLINE_serial; bool CW_KEYLINE_isopen = false; int open_CW_KEYLINE() { CW_KEYLINE_serial.Device(progdefaults.CW_KEYLINE_serial_port_name); CW_KEYLINE_serial.Baud(progdefaults.BaudRate(9)); CW_KEYLINE_serial.RTS(false); CW_KEYLINE_serial.DTR(false); CW_KEYLINE_serial.RTSptt(false); CW_KEYLINE_serial.DTRptt(false); CW_KEYLINE_serial.RestoreTIO(true); CW_KEYLINE_serial.RTSCTS(false); CW_KEYLINE_serial.Stopbits(1); LOG_DEBUG("\n\ CW Keyline Serial port parameters:\n\ device : %s\n\ baudrate : %d\n\ stopbits : %d\n\ initial rts: %+d\n\ initial dtr: %+d\n\ restore tio: %c\n\ flowcontrol: %c\n", CW_KEYLINE_serial.Device().c_str(), CW_KEYLINE_serial.Baud(), CW_KEYLINE_serial.Stopbits(), (CW_KEYLINE_serial.RTS() ? +12 : -12), (CW_KEYLINE_serial.DTR() ? +12 : -12), (CW_KEYLINE_serial.RestoreTIO() ? 'T' : 'F'), (CW_KEYLINE_serial.RTSCTS() ? 'T' : 'F') ); if (CW_KEYLINE_serial.OpenPort() == false) { LOG_ERROR("Cannot open serial port %s", CW_KEYLINE_serial.Device().c_str()); CW_KEYLINE_isopen = false; return 0; } CW_KEYLINE_isopen = true; return 1; } void close_CW_KEYLINE() { CW_KEYLINE_serial.ClosePort(); CW_KEYLINE_isopen = false; } //---------------------------------------------------------------------- #include static pthread_t cwio_pthread; static pthread_cond_t cwio_cond; static pthread_mutex_t cwio_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t fifo_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t cwio_ptt_mutex = PTHREAD_MUTEX_INITIALIZER; static bool cwio_thread_running = false; static bool cwio_terminate_flag = false; static bool cwio_calibrate_flag = false; //---------------------------------------------------------------------- static int cwio_ch; static cMorse *cwio_morse = 0; static std::queue fifo; static std::string cwio_prosigns; //---------------------------------------------------------------------- // CW output using flrig cwio calls //---------------------------------------------------------------------- static char lastcwiochar = 0; void flrig_cwio_send(char c) { if (cwio_morse == 0) { cwio_morse = new cMorse; cwio_morse->init(); } std::string s = " "; s[0] = c; flrig_cwio_send_text(s); if (c == '[' || c == ']') return; int tc = 1200 / progdefaults.CWspeed; if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed > progdefaults.CWfarnsworth)) tc = 1200 / progdefaults.CWfarnsworth; if (c == ' ') { if (lastcwiochar == ' ') { tc *= 7; if (progdefaults.CWusewordsworth && (progdefaults.CWspeed > progdefaults.CWwordsworth)) tc *= 1.0 * progdefaults.CWspeed / progdefaults.CWwordsworth; if (progdefaults.CWusewordsworth && (progdefaults.CWspeed > progdefaults.CWwordsworth)) tc = 4800 / progdefaults.CWwordsworth; } else tc *= 5; } else tc *= (cwio_morse->tx_length(c)); lastcwiochar = c; MilliSleep(tc); } //---------------------------------------------------------------------- void cwio_key(int on) { if (CW_KEYLINE_isopen || progdefaults.CW_KEYLINE_on_cat_port || progdefaults.CW_KEYLINE_on_ptt_port) { Cserial *ser = &CW_KEYLINE_serial; if (progdefaults.CW_KEYLINE_on_cat_port) ser = &rigio; else if (progdefaults.CW_KEYLINE_on_ptt_port) ser = &push2talk->serPort; switch (progdefaults.CW_KEYLINE) { case 0: break; case 1: ser->SetRTS(on); break; case 2: ser->SetDTR(on); break; } } } void cwio_ptt(int on) { if (CW_KEYLINE_isopen || progdefaults.CW_KEYLINE_on_cat_port || progdefaults.CW_KEYLINE_on_ptt_port) { Cserial *ser = &CW_KEYLINE_serial; if (progdefaults.CW_KEYLINE_on_cat_port) ser = &rigio; else if (progdefaults.CW_KEYLINE_on_ptt_port) ser = &push2talk->serPort; switch (progdefaults.PTT_KEYLINE) { case 0: break; case 1: ser->SetRTS(on); break; case 2: ser->SetDTR(on); break; } } } /* #define cwio_bit(bit, len) {\ switch (progdefaults.CW_KEYLINE) {\ case 0: break;\ case 1: ser->SetRTS(bit); break;\ case 2: ser->SetDTR(bit); break;\ }\ MilliSleep(len);} */ // return accurate time of day in secs double cwio_now() { static struct timespec tp; #if HAVE_CLOCK_GETTIME clock_gettime(CLOCK_MONOTONIC, &tp); // return 1000.0 * tp.tv_sec + tp.tv_nsec * 1e-6; #elif defined(__WIN32__) DWORD msec = GetTickCount(); return 1.0 * msec; tp.tv_sec = msec / 1000; tp.tv_nsec = (msec % 1000) * 1000000; #elif defined(__APPLE__) static mach_timebase_info_data_t info = { 0, 0 }; if (unlikely(info.denom == 0)) mach_timebase_info(&info); uint64_t t = mach_absolute_time() * info.numer / info.denom; // return t * 1e-6; tp.tv_sec = t / 1000000000; tp.tv_nsec = t % 1000000000; #endif return 1.0 * tp.tv_sec + tp.tv_nsec * 1e-9; } // set DTR/RTS to bit value for msecs duration //#define CW_TTEST #ifdef CW_TTEST static FILE *cwio_test = 0; #endif void cwio_bit(int bit, double msecs) { //std::cout << bit << " : " << msecs << std::endl; #ifdef CW_TTEST if (!cwio_test) cwio_test = fopen("cwio_test.txt", "a"); #endif static double secs; static struct timespec tv = { 0, 1000000L}; static double end1 = 0; static double end2 = 0; static double t1 = 0; #ifdef CW_TTEST static double t2 = 0; #endif static double t3 = 0; static double t4 = 0; int loop1 = 0; int loop2 = 0; int n1 = msecs * 1e3; secs = msecs * 1e-3; #ifdef __WIN32__ timeBeginPeriod(1); #endif t1 = cwio_now(); end2 = t1 + secs - 0.00001; cwio_key(bit); #ifdef CW_TTEST t2 = t3 = cwio_now(); #else t3 = cwio_now(); #endif end1 = end2 - 0.005; while (t3 < end1 && (++loop1 < n1)) { nanosleep(&tv, NULL); t3 = cwio_now(); } t4 = t3; while (t4 <= end2) { loop2++; t4 = cwio_now(); } #ifdef __WIN32__ timeEndPeriod(1); #endif #ifdef CW_TTEST if (cwio_test) fprintf(cwio_test, "%d, %d, %d, %6f, %6f, %6f, %6f, %6f, %6f, %6f\n", bit, loop1, loop2, secs * 1e3, (t2 - t1)*1e3, (t3 - t1)*1e3, (t3 - end1) * 1e3, (t4 - t1)*1e3, (t4 - end2) * 1e3, (t4 - t1 - secs)*1e3); #endif } void send_cwio(int c) { if (c == GET_TX_CHAR_NODATA || c == 0x0d) { return; } float tc = 1200.0 / progdefaults.CWspeed; if (tc <= 0) tc = 1; float ta = 0.0; float tch = 3 * tc, twd = 4 * tc; // Cserial *ser = &CW_KEYLINE_serial; // if (progdefaults.CW_KEYLINE_on_cat_port) // ser = &rigio; // else if (progdefaults.CW_KEYLINE_on_ptt_port) // ser = &push2talk->serPort; if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed > progdefaults.CWfarnsworth)) { ta = 60000.0 / progdefaults.CWfarnsworth - 37200 / progdefaults.CWspeed; tch = 3 * ta / 19; twd = 4 * ta / 19; } if (progdefaults.CWusewordsworth && (progdefaults.CWspeed > progdefaults.CWwordsworth)) twd = 4800 / progdefaults.CWwordsworth; if (c == 0x0a) c = ' '; if (c == ' ') { cwio_bit(0, twd); return; } std::string code; code = cwio_morse->tx_lookup(c); if (!code.length()) { return; } double xcvr_corr = progdefaults.CWkeycomp; if (xcvr_corr < -tc / 2) xcvr_corr = - tc / 2; else if (xcvr_corr > tc / 2) xcvr_corr = tc / 2; guard_lock lk(&cwio_ptt_mutex); for (size_t n = 0; n < code.length(); n++) { if (code[n] == '.') { cwio_bit(1, tc + xcvr_corr); } else { cwio_bit(1, 3*tc + xcvr_corr); } if (n < code.length() -1) { cwio_bit(0, tc - xcvr_corr); } else { cwio_bit(0, tch - xcvr_corr); } } } unsigned long start_time = 0L; unsigned long end_time = 0L; int testwpm = 20; void cwio_calibrate_finished(void *) { double ratio = 60000.0 / (end_time - start_time); btn_cw_dtr_calibrate->value(0); static char result[100]; snprintf(result, sizeof(result), "Time: %0.4f secs, %%error: %0.2f", (end_time - start_time) / 1000.0, 100.0 * (1-ratio)); LOG_INFO("\n%s\n", result); cwio_test_result->value(result); cwio_test_result->redraw(); } void cwio_calibrate() { std::string paris = "PARIS "; bool farnsworth = progdefaults.CWusefarnsworth; bool wordsworth = progdefaults.CWusewordsworth; progdefaults.CWusefarnsworth = false; progdefaults.CWusewordsworth = false; guard_lock lk(&fifo_mutex); start_time = zmsec(); for (int i = 0; i < progdefaults.CWspeed; i++) for (size_t n = 0; n < paris.length(); n++) send_cwio(paris[n]); end_time = zmsec(); progdefaults.CWusefarnsworth = farnsworth; progdefaults.CWusewordsworth = wordsworth; Fl::awake(cwio_calibrate_finished); } static void * cwio_loop(void *args) { SET_THREAD_ID(CWIO_TID); cwio_thread_running = true; cwio_terminate_flag = false; while(1) { pthread_mutex_lock(&cwio_mutex); pthread_cond_wait(&cwio_cond, &cwio_mutex); pthread_mutex_unlock(&cwio_mutex); if (cwio_terminate_flag) break; if (cwio_calibrate_flag) { cwio_calibrate(); cwio_calibrate_flag = false; } while (!fifo.empty()) { { guard_lock lk(&fifo_mutex); cwio_ch = fifo.front(); fifo.pop(); } send_cwio(cwio_ch); } } return (void *)0; } void calibrate_cwio() { if (!cwio_thread_running) start_cwio_thread(); if (cwio_morse == 0) { cwio_morse = new cMorse; cwio_morse->init(); } cwio_calibrate_flag = true; pthread_cond_signal(&cwio_cond); } void stop_cwio_thread(void) { if(!cwio_thread_running) return; cwio_terminate_flag = true; pthread_cond_signal(&cwio_cond); MilliSleep(10); pthread_join(cwio_pthread, NULL); pthread_mutex_destroy(&cwio_mutex); pthread_cond_destroy(&cwio_cond); memset((void *) &cwio_pthread, 0, sizeof(cwio_pthread)); memset((void *) &cwio_mutex, 0, sizeof(cwio_mutex)); cwio_thread_running = false; cwio_terminate_flag = false; delete cwio_morse; cwio_morse = 0; } void start_cwio_thread(void) { if (cwio_thread_running) return; memset((void *) &cwio_pthread, 0, sizeof(cwio_pthread)); memset((void *) &cwio_mutex, 0, sizeof(cwio_mutex)); memset((void *) &cwio_cond, 0, sizeof(cwio_cond)); if(pthread_cond_init(&cwio_cond, NULL)) { LOG_ERROR("Alert thread create fail (pthread_cond_init)"); return; } if(pthread_mutex_init(&cwio_mutex, NULL)) { LOG_ERROR("AUDIO_ALERT thread create fail (pthread_mutex_init)"); return; } if (pthread_create(&cwio_pthread, NULL, cwio_loop, NULL) < 0) { pthread_mutex_destroy(&cwio_mutex); LOG_ERROR("AUDIO_ALERT thread create fail (pthread_create)"); } LOG_DEBUG("started audio cwio thread"); MilliSleep(10); // Give the CPU time to set 'cwio_thread_running' } void cw::send_CW(int c) { if (!cwio_thread_running) start_cwio_thread(); if (cwio_morse == 0) { cwio_morse = new cMorse; cwio_morse->init(); } if (cwio_prosigns != progdefaults.CW_prosigns) { cwio_prosigns = progdefaults.CW_prosigns; cwio_morse->init(); } guard_lock lk(&fifo_mutex); fifo.push(c); pthread_cond_signal(&cwio_cond); } unsigned long CAT_start_time = 0L; unsigned long CAT_end_time = 0L; void CAT_keying_calibrate_finished(void *) { out_CATkeying_compensation->value(progdefaults.CATkeying_compensation / 1000.0); char info[1000]; snprintf(info, sizeof(info), "Speed test: %.0f wpm : %0.2f secs", progdefaults.CWspeed, progdefaults.CATkeying_compensation / 1000.0); LOG_DEBUG("\n%s", info); } static pthread_t CW_keying_pthread; bool CW_CAT_thread_running = false; void *do_CAT_keying_calibrate(void *args) { CW_CAT_thread_running = true; LOG_DEBUG("%s", "CAT keying calibrate thread running"); bool tempcwTrack = active_modem->get_cwTrack(); progdefaults.CWtrack = false; active_modem->set_cwTrack(false); LOG_DEBUG("1"); progdefaults.CWspeed = cntCW_WPM->value(); active_modem->calWPM(progdefaults.CWspeed); sldrCWxmtWPM->value(progdefaults.CWspeed); cntr_nanoCW_WPM->value(progdefaults.CWspeed); LOG_DEBUG("2"); bool farnsworth = progdefaults.CWusefarnsworth; progdefaults.CWusefarnsworth = false; progdefaults.CATkeying_compensation = 0; LOG_DEBUG("3"); if (progStatus.WK_online) { WK_set_wpm(); WK_reset_timing(); } else if (progdefaults.use_KNWDkeying || progdefaults.use_ELCTkeying) set_KYkeyer(); else if (progdefaults.use_ICOMkeying) set_ICOMkeyer(); else if (progdefaults.use_YAESUkeying) set_FTkeyer(); LOG_DEBUG("4"); std::string paris = "PARIS "; CAT_start_time = zmsec(); LOG_DEBUG("5"); for (int i = 0; i < progdefaults.CWspeed; i++) { LOG_DEBUG("6"); for (size_t n = 0; n < paris.length(); n++) { LOG_DEBUG("7"); if (progdefaults.use_KNWDkeying || progdefaults.use_ELCTkeying) KYkeyer_send_char(paris[n]); else if (progdefaults.use_ICOMkeying) ICOMkeyer_send_char(paris[n]); else if (progdefaults.use_YAESUkeying) FTkeyer_send_char(paris[n]); else if (progStatus.WK_online) { WK_send_char(paris[n]); } Fl::awake(); } } CAT_end_time = zmsec(); progdefaults.CATkeying_compensation = (CAT_end_time - CAT_start_time - 60000); if (progStatus.WK_online) WK_set_comp(); progdefaults.CWusefarnsworth = farnsworth; Fl::awake(CAT_keying_calibrate_finished); CW_CAT_thread_running = false; progdefaults.CWtrack = tempcwTrack; active_modem->set_cwTrack(tempcwTrack); LOG_DEBUG("%s", "exiting calibration thread"); return NULL; } void CAT_keying_calibrate() { if (CW_CAT_thread_running) return; if (pthread_create(&CW_keying_pthread, NULL, do_CAT_keying_calibrate, NULL) < 0) { LOG_ERROR("CW CAT calibration thread create failed"); return; } LOG_DEBUG("started CW CAT calibration thread"); MilliSleep(10); } void CAT_keying_test_finished(void *) { int comp = (CAT_end_time - CAT_start_time - 60000); out_CATkeying_test_result->value(comp / 1000.0); } void *do_CAT_keying_test(void *args) { CW_CAT_thread_running = true; bool tempcwTrack = active_modem->get_cwTrack(); progdefaults.CWtrack = false; active_modem->set_cwTrack(false); progdefaults.CWspeed = cntCW_WPM->value(); sldrCWxmtWPM->value(progdefaults.CWspeed); cntr_nanoCW_WPM->value(progdefaults.CWspeed); progdefaults.CW_cal_speed = progdefaults.CWspeed; bool farnsworth = progdefaults.CWusefarnsworth; progdefaults.CWusefarnsworth = false; if (progStatus.WK_online) { WK_set_wpm(); } else if (progdefaults.use_KNWDkeying || progdefaults.use_ELCTkeying) set_KYkeyer(); else if (progdefaults.use_ICOMkeying) set_ICOMkeyer(); else if (progdefaults.use_YAESUkeying) set_FTkeyer(); std::string paris = "PARIS "; CAT_start_time = zmsec(); for (int i = 0; i < progdefaults.CW_cal_speed; i++) { for (size_t n = 0; n < paris.length(); n++) { if (progStatus.WK_online) { WK_send_char(paris[n]); } if (progdefaults.use_KNWDkeying || progdefaults.use_ELCTkeying) KYkeyer_send_char(paris[n]); else if (progdefaults.use_ICOMkeying) ICOMkeyer_send_char(paris[n]); else if (progdefaults.use_YAESUkeying) FTkeyer_send_char(paris[n]); Fl::awake(); } } CAT_end_time = zmsec(); progdefaults.CWusefarnsworth = farnsworth; Fl::awake(CAT_keying_test_finished); CW_CAT_thread_running = false; progdefaults.CWtrack = tempcwTrack; active_modem->set_cwTrack(tempcwTrack); return NULL; } void CAT_keying_test() { if (CW_CAT_thread_running) return; if (pthread_create(&CW_keying_pthread, NULL, do_CAT_keying_test, NULL) < 0) { LOG_ERROR("CW CAT calibration thread create failed"); return; } LOG_DEBUG("started CW CAT calibration thread"); MilliSleep(10); } fldigi-4.2.05/src/cw/nanoIO.cxx0000664000175000017500000004276714611711171013112 00000000000000// ---------------------------------------------------------------------------- // nanoIO.cxx -- Interface to Arduino Nano keyer // // Copyright (C) 2018 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "fl_digi.h" #include "nanoIO.h" #include "serial.h" #include "morse.h" #include "strutil.h" #define LOG_TINYFSK LOG_INFO Cserial nano_serial; bool use_nanoIO = false; bool nanoIO_isCW = false; static cMorse *nano_morse = 0; // use during debugging void sent(std::string s) { if (!grp_nanoio_debug->visible()) return; brws_nanoio_sent->add(s.c_str()); brws_nanoio_sent->redraw(); } void rcvd(std::string s) { if (!grp_nanoio_debug->visible()) return; if (s.empty()) brws_nanoio_rcvd->add("...nil"); else { size_t ptr = s.find("\ncmd:"); if (ptr != std::string::npos) s.erase(ptr, 1); if (s[s.length() - 1] == '\n') s.erase(s.length() -1); ptr = s.find("\n"); while (!s.empty()) { if (ptr == std::string::npos) { brws_nanoio_rcvd->add(std::string("@t").append(s).c_str()); break; } brws_nanoio_rcvd->add(std::string("@t").append(s.substr(0, ptr)).c_str()); brws_nanoio_sent->add("@t-"); s.erase(0, ptr+1); ptr = s.find("\n"); } } brws_nanoio_rcvd->redraw(); } // subtract two timeval values and return result in seconds double timeval_subtract (struct timeval &x, struct timeval &y) { double t1, t2; t1 = x.tv_sec + x.tv_usec * 1e-6; t2 = y.tv_sec + y.tv_usec * 1e-6; return t2 - t1; } void nano_display_io(std::string s, int style) { if (s.empty()) return; REQ(&FTextBase::addstr, txt_nano_io, s, style); REQ(&FTextBase::addstr, txt_nano_CW_io, s, style); } int nano_serial_write(char c) { if (!use_nanoIO) { return 1; } std::string buffer = " "; buffer[0] = c; REQ(sent, buffer); return nano_serial.WriteBuffer((unsigned char *)(buffer.c_str()), 1); } char nano_read_byte(int &msec) { unsigned char c = 0; int ret; int numtries = 0; timeval start = tmval(); timeval end = start; while (timeval_subtract(start, end) < msec) { ret = nano_serial.ReadByte(c); end = tmval(); if (ret && c > 0) break; if (++numtries % 50 == 0) Fl::awake(); } double dmsec = timeval_subtract(start, end) * 1000; msec = round(dmsec); static char szresp[50]; snprintf(szresp, sizeof(szresp), "'%c' [%0.2f]", c, dmsec); REQ(rcvd, szresp); return c; } std::string nano_read_string(int msec_wait, std::string find) { std::string resp; timeval start = tmval(); int timer = msec_wait; if (!find.empty()) { while (timer > 0 && (resp.find(find) == std::string::npos)) { resp.append(nano_serial_read()); MilliSleep(10); timer -= 10; } } else { while (timer > 0) { resp.append(nano_serial_read()); MilliSleep(10); timer -= 10; } } timeval end = tmval(); double diff = timeval_subtract(start, end); int msec = round(diff * 1000); static char szresp[1000]; snprintf(szresp, sizeof(szresp), "[%d msec] %s", msec, resp.c_str()); REQ(rcvd, szresp); return resp; } static bool calibrating = false; void nano_send_cw_char(int c) { if (c == GET_TX_CHAR_NODATA || c == 0x0d) { MilliSleep(50); return; } int msec = 0; float tc = 1200.0 / progdefaults.CWspeed; float ta = 0.0; float tch = 3 * tc, twd = 4 * tc; if (progdefaults.CWusefarnsworth && (progdefaults.CWspeed > progdefaults.CWfarnsworth)) { ta = 60000.0 / progdefaults.CWfarnsworth - 37200 / progdefaults.CWspeed; tch = 3 * ta / 19; twd = 4 * ta / 19; } if (nano_morse == 0) { MilliSleep(50); return; } if (c == '^' || c == '|') { nano_serial_write(c); msec = 50; nano_read_byte(msec); MilliSleep(50); return; } int len = 4; if (c == 0x0a) c = ' '; if (c == ' ') { len = 4; msec = len * tc + 10; nano_serial_write(c); nano_read_byte(msec); if (!calibrating && progdefaults.CWusefarnsworth && (progdefaults.CWspeed > progdefaults.CWfarnsworth)) MilliSleep(twd); } else { len = nano_morse->tx_length(c); if (len) { msec = len * tc + 10; nano_serial_write(c); nano_read_byte(msec); if (!calibrating && progdefaults.CWusefarnsworth && (progdefaults.CWspeed > progdefaults.CWfarnsworth)) MilliSleep(tch); } } return; } void nano_send_tty_char(int c) { int msec = 165; // msec for start + 5 data + 1.5 stop bits @ 45.45 if (progdefaults.nanoIO_baud == 50.0) msec = 150; if (progdefaults.nanoIO_baud == 75.0) msec = 100; if (progdefaults.nanoIO_baud == 100.0) msec = 75; if (c == GET_TX_CHAR_NODATA) { MilliSleep(msec); return; } nano_serial_write(c); msec += 20; c = nano_read_byte(msec); } void nano_send_char(int c) { if (nanoIO_isCW) nano_send_cw_char(c); else nano_send_tty_char(c); } static int setwpm = progdefaults.CWspeed; void save_nano_state() { if (!use_nanoIO) return; setwpm = progdefaults.CWspeed; } void restore_nano_state() { if (!use_nanoIO) return; progdefaults.CWspeed = setwpm; sldrCWxmtWPM->value(progdefaults.CWspeed); cntCW_WPM->value(progdefaults.CWspeed); calibrating = false; LOG_INFO("%f WPM", progdefaults.CWspeed); } void nanoIO_wpm_cal() { save_nano_state(); progdefaults.CWusefarnsworth = false; progdefaults.CWspeed = cntrWPMtest->value(); LOG_INFO("%f WPM", progdefaults.CWspeed); sldrCWxmtWPM->value(progdefaults.CWspeed); cntCW_WPM->value(progdefaults.CWspeed); nanoIO_isCW = true; set_nanoWPM(progdefaults.CWspeed); std::string s; for (int i = 0; i < progdefaults.CWspeed; i++) s.append("paris "); s.append("^r"); TransmitText->add_text(s); calibrating = true; start_tx(); } void nano_sendString (const std::string &s) { REQ(sent, s); nano_serial.WriteBuffer((unsigned char *)(s.c_str()), s.length()); return; } static timeval ptt_start; static double wpm_err = 0; void dispWPMtiming(void *) { corr_var_wpm->value(wpm_err + 60); int nucorr = progdefaults.usec_correc; nucorr += wpm_err * 1e6 / (cntrWPMtest->value() * 50); usec_correc->value(nucorr); } static bool nanoIO_busy = false; void nano_PTT(int val) { if (use_nanoIO) { nano_serial_write(val ? '[' : ']'); int msec = 100; nano_read_byte(msec); } if (val) { ptt_start = tmval(); nanoIO_busy = true; } else { timeval ptt_end = tmval(); double tdiff = timeval_subtract(ptt_start, ptt_end); if (calibrating) { wpm_err = tdiff - 60; Fl::awake(dispWPMtiming); restore_nano_state(); } else { ptt_start.tv_sec = 0; ptt_start.tv_usec = 0; nanoIO_busy = false; } } } void nano_cancel_transmit() { nano_serial_write('\\'); } void nano_mark_polarity(int v) { std::string cmd = "~"; cmd.append(v == 0 ? "1" : "0"); std::string resp; nano_sendString(cmd); resp = nano_serial_read(); nano_display_io(resp, FTextBase::ALTR); } void nano_MARK_is(int val) { progdefaults.nanoIO_polarity = val; chk_nanoIO_polarity->value(val); } void nano_set_baud(int bd) { std::string resp; std::string cmd = "~"; cmd.append(bd == 3 ? "9" : bd == 2 ? "7" : bd == 1 ? "5" : "4"); nano_sendString(cmd); resp = nano_serial_read(); nano_display_io(resp, FTextBase::ALTR); } void nano_baud_is(int val) { int index = 2; if (val == 45) index = 0; if (val == 50) index = 1; if (val == 100) index = 2; progdefaults.nanoIO_baud = index; sel_nanoIO_baud->index(index); } static int pot_min, pot_rng; static bool nanoIO_has_pot = false; void init_pot_min_max() { nanoIO_has_pot = true; btn_nanoIO_pot->activate(); nanoIO_use_pot(); cntr_nanoIO_min_wpm->activate(); cntr_nanoIO_rng_wpm->activate(); cntr_nanoIO_min_wpm->value(pot_min); cntr_nanoIO_rng_wpm->value(pot_rng); cntr_nanoIO_min_wpm->redraw(); cntr_nanoIO_rng_wpm->redraw(); } void disable_min_max() { btn_nanoIO_pot->deactivate(); cntr_nanoIO_min_wpm->deactivate(); cntr_nanoIO_rng_wpm->deactivate(); } // this function must be called from within the main UI thread // use REQ(nano_parse_config, s); void nano_parse_config(std::string s) { nano_display_io(s, FTextBase::ALTR); size_t p1 = 0; if (s.find("nanoIO") == std::string::npos) return; if (s.find("HIGH") != std::string::npos) nano_MARK_is(1); if (s.find("LOW") != std::string::npos) nano_MARK_is(0); if (s.find("45.45") != std::string::npos) nano_baud_is(45); if (s.find("50.0") != std::string::npos) nano_baud_is(50); if (s.find("75.0") != std::string::npos) nano_baud_is(75); if (s.find("100.0") != std::string::npos) nano_baud_is(100); if ((p1 = s.find("WPM")) != std::string::npos) { p1 += 4; int wpm = progdefaults.CWspeed; if (sscanf(s.substr(p1).c_str(), "%d", &wpm)) { progdefaults.CWspeed = wpm; LOG_INFO("%f WPM", progdefaults.CWspeed); cntCW_WPM->value(wpm); cntr_nanoCW_WPM->value(wpm); sldrCWxmtWPM->value(wpm); } } if ((p1 = s.find("/", p1)) != std::string::npos) { p1++; int wpm = progdefaults.CW_keyspeed; if (sscanf(s.substr(p1).c_str(), "%d", &wpm)) { progdefaults.CW_keyspeed = wpm; cntr_nanoCW_paddle_WPM->value(wpm); } } else { // ver 1.1.x if ((p1 = s.find("WPM", p1 + 4)) != std::string::npos) { p1++; int wpm = progdefaults.CW_keyspeed; if (sscanf(s.substr(p1).c_str(), "%d", &wpm)) { progdefaults.CW_keyspeed = wpm; cntr_nanoCW_paddle_WPM->value(wpm); } } } if ((p1 = s.find("dash/dot ")) != std::string::npos) { p1 += 9; float val = progdefaults.CWdash2dot; if (sscanf(s.substr(p1).c_str(), "%f", &val)) { progdefaults.CWdash2dot = val; cntCWdash2dot->value(val); cnt_nanoCWdash2dot->value(val); } } if ((p1 = s.find("PTT")) != std::string::npos) { if (s.find("NO", p1 + 4) != std::string::npos) progdefaults.disable_CW_PTT = true; else progdefaults.disable_CW_PTT = false; } else progdefaults.disable_CW_PTT = false; nanoIO_set_cw_ptt(); if ((p1 = s.find("Speed Pot")) != std::string::npos) { size_t p2 = s.find("ON", p1); int OK = 0; p2 = s.find("minimum", p1); if (p2 != std::string::npos) OK = sscanf(&s[p2 + 8], "%d", &pot_min); p2 = s.find("range", p1); if (p2 != std::string::npos) OK = sscanf(&s[p2 + 6], "%d", &pot_rng); if (OK) init_pot_min_max(); } else disable_min_max(); if ((p1 = s.find("corr usec")) != std::string::npos) { int corr; if (sscanf(s.substr(p1+9).c_str(), "%d", &corr)) { progdefaults.usec_correc = corr; usec_correc->value(corr); } } return; } int open_port(std::string PORT) { if (PORT.empty()) return false; REQ(sent, "reset"); nano_serial.Device(PORT); switch (progdefaults.nanoIO_serbaud) { case 0: nano_serial.Baud(1200); break; case 1: nano_serial.Baud(4800); break; case 2: nano_serial.Baud(9600); break; case 3: nano_serial.Baud(19200); break; case 4: nano_serial.Baud(38400); break; case 5: nano_serial.Baud(57600); break; case 6: nano_serial.Baud(115200); break; default: nano_serial.Baud(57600); } nano_serial.Timeout(10); nano_serial.Retries(5); nano_serial.Stopbits(1); use_nanoIO = false; if (!nano_serial.OpenPort()) { nano_display_io("\nCould not open serial port!", FTextBase::ALTR); LOG_ERROR("Could not open %s", progdefaults.nanoIO_serial_port_name.c_str()); return false; } use_nanoIO = true; nano_read_string(1500, "cmd:"); nano_display_io("Connected to nanoIO\n", FTextBase::RECV); return true; } std::string nano_serial_read() { static char buffer[4096]; memset(buffer, '\0',4096); int rb = nano_serial.ReadBuffer((unsigned char *)buffer, 4095); if (rb) return buffer; return ""; } void nano_serial_flush() { static char buffer[1025]; memset(buffer, 0, 1025); while (nano_serial.ReadBuffer((unsigned char *)buffer, 1024) ) ; } void no_cmd(void *) { nano_display_io("Could not read current configuration\n", FTextBase::ALTR); } void close_nanoIO() { nano_serial.ClosePort(); use_nanoIO = false; nano_display_io("Disconnected from nanoIO\n", FTextBase::RECV); if (nano_morse) { delete nano_morse; nano_morse = 0; } progStatus.nanoCW_online = false; progStatus.nanoFSK_online = false; nanoIO_isCW = false; enable_rtty_quickchange(); } bool open_nano() { if (use_nanoIO) return true; if (!open_port(progdefaults.nanoIO_serial_port_name)) return false; return true; } bool open_nanoIO() { std::string rsp; progStatus.nanoCW_online = false; progStatus.nanoFSK_online = false; if (open_nano()) { set_nanoIO(); nano_sendString("~?"); rsp = nano_read_string(1000, "PTT"); size_t p = rsp.find("~?"); if (p == std::string::npos) return false; rsp.erase(0, p + 3); if (rsp.find("eyer") != std::string::npos) REQ(nano_parse_config, rsp); progStatus.nanoFSK_online = true; nanoIO_isCW = false; disable_rtty_quickchange(); return true; } return false; } bool open_nanoCW() { if (nano_morse == 0) nano_morse = new cMorse; progStatus.nanoCW_online = false; progStatus.nanoFSK_online = false; std::string rsp; if (open_nano()) { set_nanoCW(); nano_sendString("~?"); rsp = nano_read_string(1000, "PTT"); size_t p = rsp.find("~?"); if (p == std::string::npos) return false; rsp.erase(0, p + 3); if (rsp.find("eyer") != std::string::npos) REQ(nano_parse_config, rsp); progStatus.nanoCW_online = true; return true; } return false; } void set_nanoIO() { if (progStatus.nanoFSK_online) return; std::string cmd = "~F"; std::string rsp; int count = 5; while (rsp.empty() && count--) { nano_sendString(cmd); rsp = nano_read_string(165*cmd.length(), cmd); } progStatus.nanoFSK_online = true; progStatus.nanoCW_online = false; nanoIO_isCW = false; } void set_nanoCW() { std::string cmd = "~C"; std::string rsp; int count = 5; while (rsp.empty() && count--) { nano_sendString(cmd); rsp = nano_read_string(165*cmd.length(), cmd); } if (rsp.find(cmd) != std::string::npos) { nanoIO_isCW = true; set_nanoWPM(progdefaults.CWspeed); set_nano_dash2dot(progdefaults.CWdash2dot); } setwpm = progdefaults.CWspeed; progStatus.nanoCW_online = true; progStatus.nanoFSK_online = false; nanoIO_isCW = true; } void set_nanoWPM(int wpm) { static char szwpm[10]; if (wpm > 60 || wpm < 5) return; snprintf(szwpm, sizeof(szwpm), "~S%ds", wpm); nano_sendString(szwpm); nano_read_string(165*strlen(szwpm), szwpm); } void nanoIO_correction() { progdefaults.usec_correc = usec_correc->value(); static char szcorr[15]; snprintf(szcorr, sizeof(szcorr), "~E%de", progdefaults.usec_correc); nano_sendString(szcorr); nano_read_string(165*strlen(szcorr), szcorr); } void set_nano_keyerWPM(int wpm) { static char szwpm[10]; if (wpm > 60 || wpm < 5) return; snprintf(szwpm, sizeof(szwpm), "~U%du", wpm); nano_sendString(szwpm); nano_read_string(165*strlen(szwpm), szwpm); } void set_nano_dash2dot(float wt) { static char szd2d[10]; if (wt < 2.5 || wt > 3.5) return; snprintf(szd2d, sizeof(szd2d), "~D%3dd", (int)(wt * 100) ); nano_sendString(szd2d); nano_read_string(165*strlen(szd2d), szd2d); } void nano_CW_query() { nano_serial_flush(); nano_sendString("~?"); std::string resp = nano_read_string(165*3, "PTT"); nano_display_io(resp, FTextBase::ALTR); REQ(nano_parse_config, resp); } void nano_help() { nano_serial_flush(); nano_sendString("~~"); std::string resp = nano_read_string(1000, "cmds"); nano_display_io(resp, FTextBase::ALTR); } void nano_CW_save() { nano_sendString("~W"); nano_read_string(165*2, "~W"); } void nanoCW_tune(int val) { if (val) { nano_sendString("~T"); nano_read_string(165*2, "~T"); } else { nano_sendString("]"); nano_read_string(165, "]"); } } void set_nanoIO_incr() { std::string s_incr = "~I"; s_incr += progdefaults.nanoIO_CW_incr; nano_sendString(s_incr); nano_read_string(165*2, s_incr); } void set_nanoIO_keyer(int indx) { std::string s; if (indx == 0) s = "~A"; if (indx == 1) s = "~B"; if (indx == 2) s = "~K"; nano_sendString(s); nano_read_string(165*s.length(), s); } void nanoIO_set_cw_ptt() { std::string s = "~X"; s += progdefaults.disable_CW_PTT ? '0' : '1'; nano_sendString(s); nano_read_string(165*s.length(), s); } void nanoIO_read_pot() { if (!use_nanoIO) return; if (!nanoIO_has_pot) return; if (!progdefaults.nanoIO_speed_pot) return; if (nanoIO_busy) return; // reread the current pot setting static char szval[10]; std::string rsp; snprintf(szval, sizeof(szval), "~P?"); nano_sendString(szval); rsp = nano_read_string(165*strlen(szval), szval); int val = 0; size_t p = rsp.find("wpm"); if (p != std::string::npos) { rsp.erase(0,p); if (sscanf(rsp.c_str(), "wpm %d", &val) == 1) { REQ(set_paddle_WPM, val); } } } void nanoIO_use_pot() { std::string s = "~P"; if (progdefaults.nanoIO_speed_pot) s += '1'; else s += '0'; nano_sendString(s); nano_read_string(165*s.length(), s); nanoIO_read_pot(); } void set_paddle_WPM (int wpm) { cntr_nanoCW_paddle_WPM->value(wpm); cntr_nanoCW_paddle_WPM->redraw(); } void set_nanoIO_min_max() { static char szval[10]; // set min value for potentiometer snprintf(szval, sizeof(szval), "~M%dm", (int)cntr_nanoIO_min_wpm->value()); nano_sendString(szval); nano_read_string(165*strlen(szval), szval); // set range value of potentiometer snprintf(szval, sizeof(szval), "~N%dn", (int)cntr_nanoIO_rng_wpm->value()); nano_sendString(szval); nano_read_string(165*strlen(szval), szval); nanoIO_read_pot(); } fldigi-4.2.05/src/cw/winkeyer.cxx0000664000175000017500000007217014611712135013554 00000000000000// ---------------------------------------------------------------------------- // winkeyer.cxx -- Interface to k1el WinKeyer hardware // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "fl_digi.h" #include "confdialog.h" #include "winkeyer.h" #include "status.h" #include "serial.h" #include "threads.h" #include "modem.h" #include "morse.h" #include "icons.h" #define LOG_WKEY LOG_INFO //---------------------------------------------------------------------- // WinKeyer general support //---------------------------------------------------------------------- Cserial WK_serial; pthread_t WK_serial_thread; pthread_mutex_t WK_buffer_mutex = PTHREAD_MUTEX_INITIALIZER; //====================================================================== // WinKey command sequences //====================================================================== // ADMIN MODE static const char ADMIN = '\x00'; //static const char CALIBRATE = '\x00'; static const char RESET = '\x01'; static const char HOST_OPEN = '\x02'; static const char HOST_CLOSE = '\x03'; static const char ECHO_TEST = '\x04'; //static const char PADDLE_A2D = '\x05'; //static const char SPEED_A2D = '\x06'; //static const char GET_VALUES = '\x07'; //static const char GET_CAL = '\x09'; //static const char WK1_MODE = '\x0A'; static const char WK2_MODE = '\x0B'; //static const char DUMP_EEPROM = '\x0C'; //static const char LOAD_EEPROM = '\x0D'; static const char FSK_MODE = '\x13'; //static const char *SEND_MSG_NBR = "\x0E"; // HOST MODE //static const char *SIDETONE = "\x01"; // N see table page 6 Interface Manual static const char *SET_WPM = "\x02"; // 5 .. N .. 99 in WPM //static const char *SET_WEIGHT = "\x03"; // 10 .. N .. 90 % //static const char *SET_PTT_LT = "\x04"; // A - lead time, B - tail time // both 0..250 in 10 msec steps // "0x04<01> = 10 msec lead, 1.6 sec tail static const char *SET_SPEED_POT = "\x05"; // A = min, B = range, C anything //static const char *PAUSE = "\x06"; // 1 = pause, 0 = release static const char *GET_SPEED_POT = "\x07"; // return values as per page 7/8 //static const char *BACKSPACE = "\x08"; //static const char *SET_PIN_CONFIG = "\x09"; // N as per tables page 8 static const char *CLEAR_BUFFER = "\x0A"; static const char *KEY_IMMEDIATE = "\x0B"; // 0 = keyup, 1 = keydown //static const char *HSCW = "\x0C"; // N = lpm / 100 //static const char *FARNS_WPM = "\x0D"; // 10 .. N .. 99 //static const char *SET_WK2_MODE = "\x0E"; // N as per table page 9 static const char *LOAD_DEFAULTS = "\x0F"; // A = MODE REGISTER B = SPEED IN WPM C = SIDETONE FREQ // D = WEIGHT E = LEAD-IN TIME F = TAIL TIME // G = MIN_WPM H = WPM RANGE I = 1ST EXTENSION // J = KEY COMPENSATION K = FARNSWORTH WPM L = PADDLE SETPOINT // M = DIT/DAH RATIO N = PIN_CONFIGURATION O = DONT CARE ==> zero //static const char *FIRST_EXT = "\x10"; // see page 10/11 //static const char *SET_KEY_COMP = "\x11"; // see page 11 static const char *NULL_CMD = "\x13\x13\x13"; //static const char *PADDLE_SW_PNT = "\x12"; // 10 .. N .. 90% //static const char *SOFT_PADDLE = "\x14"; // 0 - up, 1 - dit, 2 - dah, 3 - both //static const char *GET_STATUS = "\x15"; // request status byte, see page 12 //static const char *POINTER_CMD = "\x16"; // see page 12 //static const char *SET_DIT_DAH = "\x17"; // 33 .. N .. 66 N = ratio * 50 / 3 // BUFFERED COMMANDS //static const char *PTT_ON_OFF = "\x18"; // 1 = on 0 = off //static const char *KEY_BUFFERED = "\x19"; // 0 .. N .. 99 seconds //static const char *WAIT = "\x1A"; // 0 .. N .. 99 seconds //static const char *MERGE = "\x1B"; // merger CD into prosign, ie AR, SK etc //static const char *CHANGE_BFR_SPD = "\x1C"; // 5 .. N .. 99 //static const char *CHANGE_HSCW_SPD = "\x1D"; // N = lpm / 100 //static const char *CANCEL_BFR_SPD = "\x1E"; //static const char *BUFFER_NOP = "\x1F"; //====================================================================== // loop for serial i/o thread // runs continuously until program is closed // only accesses the serial port if it has been successfully opened //====================================================================== void WK_version_(int); void WK_echo_test(int); void WK_status_(int); void WK_speed_(int); void WK_echo_(int); void WK_eeprom_(int); bool WK_readByte(unsigned char &byte); int WK_readString(); int WK_sendString (std::string &s); void WK_clearSerialPort(); void WK_display_byte(int); bool WK_bypass_serial_thread_loop = true; bool WK_run_serial_thread = true; bool WK_PTT = false; int WK_powerlevel = 0; static std::string WK_str_out = ""; static bool WK_get_version = false; static bool WK_test_echo = false; static bool WK_host_is_up = false; static bool wk2_version = false; static bool read_EEPROM = false; static char eeprom_image[256]; static int eeprom_ptr = 0; static int wkeyer_ready = true; static cMorse *wkmorse = 0; static std::string hexstr(std::string &s) { static std::string hex; static char val[3]; hex.clear(); for (size_t i = 0; i < s.length(); i++) { snprintf(val, sizeof(val), "%02x", s[i] & 0xFF); hex.append(" 0x").append(val); } return hex; } static void upcase(std::string &s) { for (size_t n = 0; n < s.length(); n++) if (s[n] > ' ') s[n] = toupper(s[n]); } enum {NOTHING, WAIT_ECHO, WAIT_VERSION}; static void WK_send_command(std::string &cmd, int what = NOTHING) { int cnt = 101; while (cnt-- && !WK_str_out.empty()) MilliSleep(1); if (!WK_str_out.empty()) return; upcase(cmd); cnt = 101; WK_str_out = cmd; while (cnt-- && !WK_str_out.empty()) MilliSleep(1); switch (what) { case WAIT_ECHO : WK_test_echo = true; break; case WAIT_VERSION : WK_get_version = true; break; default: ; } } static bool WK_wait_for_char = false; static char lastchar = ' '; double WK_accum = 0; double WK_dcomp = 0; void WK_reset_timing() { WK_accum = 0; WK_dcomp = 0; } static bool comp_set = false; void WK_set_comp() { // progdefaults.CATkeying_compensation in milliseconds of error over 60 seconds // WK_dcomp is error for 1 dot interval WK_dcomp = progdefaults.CATkeying_compensation / (50.0 * progdefaults.CW_cal_speed); comp_set = true; } static int dispch; void dispbyte(void *) { ReceiveText->add(dispch, FTextBase::XMIT); } int WK_send_char(int c) { if (!comp_set) WK_set_comp(); if (!wkmorse) wkmorse = new cMorse; int ch = toupper(c); if (ch <= 0) { MilliSleep(10); Fl::awake(); return 0; } if (ch < ' ' || ch > 'Z') ch = ' '; if (ch == '0' && progStatus.WK_cut_zeronine) ch = 'T'; if (ch == '9' && progStatus.WK_cut_zeronine) ch = 'N'; double tc = 1200.0 / progdefaults.CWspeed; tc -= progdefaults.CATkeying_compensation / (50.0 * progdefaults.CW_cal_speed); if (lastchar == ' ' && ch == ' ') { tc *= 7; } else { tc *= wkmorse->tx_length(ch); } int tn = trunc(tc); WK_accum += (tc - tn); if (WK_accum >= 1.0) { WK_accum -= 1.0; tn += 1; } LOG_VERBOSE("tn: %d, tc: %6.2f, accum: %6.2f", tn, tc, WK_accum); lastchar = ch; dispch = ch; Fl::awake(dispbyte); if (ch != ' ') { static unsigned char szstr[2]; szstr[0] = ch; szstr[1] = 0; WK_serial.WriteBuffer(szstr, 1); } if (tn > 0) MilliSleep(tn); return 0; } void * WK_serial_thread_loop(void *d) { SET_THREAD_ID(WKEY_TID); unsigned char byte; for(;;) { if (!WK_run_serial_thread) break; MilliSleep(1);//5); if (WK_bypass_serial_thread_loop || !WK_serial.IsOpen()) goto WK_serial_bypass_loop; // process outgoing { guard_lock wklock(&WK_buffer_mutex); if (!WK_str_out.empty()) { WK_sendString(WK_str_out); WK_str_out.clear(); } } // receive WinKeyer response { if (WK_serial.ReadBuffer(&byte, 1) == 1) { if ((byte == 0xA5 || read_EEPROM)) WK_eeprom_(byte); else if ((byte & 0xC0) == 0xC0) WK_status_(byte); else if ((byte & 0xC0) == 0x80) WK_speed_(byte); else if (WK_test_echo) WK_echo_test(byte); else if (WK_get_version) WK_version_(byte); else if (WK_wait_for_char) WK_echo_(byte); } } WK_serial_bypass_loop: ; } return NULL; } void WK_display_byte(int ch) { ReceiveText->add(ch, FTextBase::XMIT); } void WK_display_chars(std::string s) { ReceiveText->add(s.c_str()); } void WK_echo_(int byte) { if (WK_wait_for_char) { if (byte == ' ' && lastchar == '\n') byte = lastchar; } REQ(WK_display_byte, byte); lastchar = byte; WK_wait_for_char = false; } void WK_echo_test(int byte) { if (byte != 'U') return; LOG_DEBUG("passed echo test"); WK_test_echo = false; } void WK_version_(int byte) { static char ver[200]; snprintf(ver, sizeof(ver), "\nConnected to Winkeyer h/w version %d\n", byte & 0xFF); WK_host_is_up = true; WK_get_version = false; REQ(WK_display_chars, ver); progStatus.WK_version = byte; } void WK_show_status_change(int byte) { box_WK_wait->color((byte & 0x10) == 0x10 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_wait->redraw(); box_WK_keydown->color((byte & 0x08) == 0x08 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_keydown->redraw(); box_WK_busy->color((byte & 0x04) == 0x04 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_busy->redraw(); box_WK_break_in->color((byte & 0x02) == 0x02 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_break_in->redraw(); box_WK_xoff->color((byte & 0x01) == 0x01 ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_WK_xoff->redraw(); } void WK_status_(int byte) { if ((byte & 0x04)== 0x04) wkeyer_ready = false; else wkeyer_ready = true; LOG_DEBUG("Wait %c, Keydown %c, Busy %c, Breakin %c, Xoff %c", byte & 0x10 ? 'T' : 'F', byte & 0x08 ? 'T' : 'F', byte & 0x04 ? 'T' : 'F', byte & 0x02 ? 'T' : 'F', byte & 0x01 ? 'T' : 'F'); REQ(WK_show_status_change, byte); } void WK_show_speed_change() { static char szwpm[8]; snprintf(szwpm, sizeof(szwpm), "%.0f", progdefaults.CWspeed); txt_WK_wpm->value(szwpm); txt_WK_wpm->redraw(); cntCW_WPM->value(progdefaults.CWspeed); cntCW_WPM->redraw(); sync_cw_parameters(); std::string cmd = SET_WPM; cmd += progdefaults.CWspeed; LOG_DEBUG("SET_WPM %.0f : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); } void WK_speed_(int byte) { if (!progStatus.WK_use_pot) return; int val = (byte & 0x3F) + progStatus.WK_min_wpm; progdefaults.CWspeed = progStatus.WK_speed_wpm = val; REQ(WK_show_speed_change); } void WK_set_wpm() { std::string cmd = SET_WPM; cmd += progdefaults.CWspeed; LOG_DEBUG("SET_WPM %.1f : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); } void WK_use_pot_changed() { progStatus.WK_use_pot = btn_WK_use_pot->value(); if (progStatus.WK_use_pot) { std::string cmd = GET_SPEED_POT; WK_send_command(cmd); LOG_DEBUG("GET_SPEED_POT : %s", hexstr(cmd).c_str()); } else { std::string cmd = SET_WPM; if (cntCW_WPM->value() > 55) cntCW_WPM->value(55); if (cntCW_WPM->value() < 5) cntCW_WPM->value(5); progdefaults.CWspeed = cntCW_WPM->value(); cmd += progdefaults.CWspeed; LOG_DEBUG("SET_WPM %.1f : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); } } void WK_eeprom_(int byte) { if (byte == 0xA5) { memset( eeprom_image, 0, 256); eeprom_ptr = 0; read_EEPROM = true; } if (eeprom_ptr < 256) eeprom_image[eeprom_ptr++] = byte; if (eeprom_ptr == 256) { read_EEPROM = false; LOG_DEBUG("\n%s", str2hex(eeprom_image, 256)); eeprom_ptr = 0; } } void load_defaults() { std::string cmd = LOAD_DEFAULTS; cmd += progStatus.WK_mode_register; cmd += progdefaults.CWspeed; cmd += progStatus.WK_sidetone; cmd += progStatus.WK_weight; cmd += progStatus.WK_lead_in_time; cmd += progStatus.WK_tail_time; cmd += progStatus.WK_min_wpm; cmd += progStatus.WK_rng_wpm; cmd += progStatus.WK_first_extension; cmd += progStatus.WK_key_compensation; cmd += progStatus.WK_farnsworth_wpm; cmd += progStatus.WK_paddle_setpoint; cmd += progStatus.WK_dit_dah_ratio; cmd += progStatus.WK_pin_configuration; cmd += progStatus.WK_dont_care; LOG_DEBUG("\n\ mode register .... %0x\n\ CW speed ......... %.1f\n\ side tone ........ %d\n\ weight ........... %d\n\ lead in time ..... %d\n\ tail time ........ %d\n\ min wpm .......... %d\n\ rng wpm .......... %d\n\ first ext ........ %d\n\ key comp ......... %d\n\ farnsworth wpm ... %d\n\ paddle setpoint .. %d\n\ dit dah ratio .... %d\n\ pin config ....... %d\n\ don't care ....... %d\n\ hex std::string ....... %s", progStatus.WK_mode_register, progdefaults.CWspeed, progStatus.WK_sidetone, progStatus.WK_weight, progStatus.WK_lead_in_time, progStatus.WK_tail_time, progStatus.WK_min_wpm, progStatus.WK_rng_wpm, progStatus.WK_first_extension, progStatus.WK_key_compensation, progStatus.WK_farnsworth_wpm, progStatus.WK_paddle_setpoint, progStatus.WK_dit_dah_ratio, progStatus.WK_pin_configuration, progStatus.WK_dont_care, hexstr(cmd).c_str()); WK_send_command(cmd); cmd = SET_SPEED_POT; cmd += progStatus.WK_min_wpm; cmd += progStatus.WK_rng_wpm; cmd += 0xFF; LOG_DEBUG("SET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); if (progStatus.WK_use_pot) { std::string cmd = GET_SPEED_POT; LOG_WKEY("GET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } else { std::string cmd = SET_WPM; cmd += progdefaults.CWspeed; LOG_DEBUG("SETWPM %.1f : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); } } void WKCW_init() { std::string cmd; if (wk2_version) { cmd = " "; cmd[0] = ADMIN; cmd[1] = WK2_MODE; LOG_DEBUG("WK2_MODE %s", hexstr(cmd).c_str()); WK_send_command(cmd); } btn_WK_use_pot->value(progStatus.WK_use_pot); load_defaults(); cmd = GET_SPEED_POT; LOG_DEBUG("GET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); cmd = SET_WPM; cmd += progdefaults.CWspeed; LOG_DEBUG("SET_WPM %.1f : %s", progdefaults.CWspeed, hexstr(cmd).c_str()); WK_send_command(cmd); cmd = SET_SPEED_POT; cmd += progStatus.WK_min_wpm; cmd += progStatus.WK_rng_wpm; cmd += 0xFF; LOG_DEBUG("SET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); cmd = GET_SPEED_POT; LOG_DEBUG("GET_SPEED_POT : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } void open_wkeyer() { int cnt = 0; std::string cmd = NULL_CMD; LOG_DEBUG("NULL_CMD : %s", hexstr(cmd).c_str()); WK_send_command(cmd); WK_clearSerialPort(); // This code only works for a real WinKeyer // fails for the K3NG Arduino sketch code as written to MORTTY if (btn_WK_serial_echo->value() && !btnK3NG->value()) { cmd = " "; cmd[0] = ADMIN; cmd[1] = ECHO_TEST; cmd += 'U'; LOG_DEBUG("ECHO_TEST : %s", hexstr(cmd).c_str()); WK_send_command(cmd, WAIT_ECHO); cnt = 5000; while (WK_test_echo == true && cnt) { MilliSleep(1); cnt--; } if (WK_test_echo) { debug::show(); LOG_ERROR("%s", "Winkeyer not responding"); WK_test_echo = false; WK_bypass_serial_thread_loop = true; WK_serial.ClosePort(); progStatus.WK_serial_port_name = "NONE"; select_WK_CommPort->value(progStatus.WK_serial_port_name.c_str()); return; } LOG_DEBUG("Echo response in %d msec", 5000 - cnt); } cmd = " "; cmd[0] = ADMIN; cmd[1] = HOST_OPEN; LOG_DEBUG("HOST_OPEN : %s", hexstr(cmd).c_str()); WK_send_command(cmd, WAIT_VERSION); cnt = 1000; while (WK_get_version == true && cnt) { MilliSleep(1); cnt--; } } void close_wkeyer() { std::string cmd = " "; cmd[0] = ADMIN; cmd[1] = RESET; LOG_DEBUG("WKEY RESET : %s", hexstr(cmd).c_str()); WK_send_command(cmd); cmd[0] = ADMIN; cmd[1] = HOST_CLOSE; LOG_DEBUG("HOST CLOSE : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } void WK_cancel_transmit() { std::string cmd = CLEAR_BUFFER; LOG_DEBUG("CLEAR_BUFFER : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } void WK_tune(bool on) { std::string cmd = KEY_IMMEDIATE; if (on) cmd += '\1'; else cmd += '\0'; LOG_DEBUG("KEY_IMMEDIATE : %s", hexstr(cmd).c_str()); WK_send_command(cmd); } //---------------------------------------------------------------------- // WinKeyer setup support //---------------------------------------------------------------------- void WK_change_btn_swap() { progStatus.WK_mode_register &=0xF7; progStatus.WK_mode_register |= btn_WK_swap->value() ? 0x08 : 0x00; LOG_DEBUG("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_auto_space() { progStatus.WK_mode_register &=0xFD; progStatus.WK_mode_register |= btn_WK_auto_space->value() ? 0x02 : 0x00; LOG_DEBUG("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_ct_space() { progStatus.WK_mode_register &= 0xFE; progStatus.WK_mode_register |= btn_WK_ct_space->value(); LOG_DEBUG("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_paddledog() { progStatus.WK_mode_register &=0x7F; progStatus.WK_mode_register |= btn_WK_paddledog->value() ? 0x80 : 0x00; LOG_DEBUG("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_cut_zeronine() { progStatus.WK_cut_zeronine = btn_WK_cut_zeronine->value(); } void WK_change_btn_paddle_echo() { progStatus.WK_mode_register &=0xBF; progStatus.WK_mode_register |= btn_WK_paddle_echo->value() ? 0x40 : 0x00; LOG_DEBUG("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_serial_echo() { progStatus.WK_mode_register &=0xFB; progStatus.WK_mode_register |= btn_WK_serial_echo->value() ? 0x04 : 0x00; LOG_DEBUG("mode reg: %2X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_sidetone_on() { progStatus.WK_sidetone = choice_WK_sidetone->index() + 1; progStatus.WK_sidetone |= (btn_WK_sidetone_on->value() ? 0x80 : 0x00); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_tone_on() { progStatus.WK_pin_configuration = (progStatus.WK_pin_configuration & 0xFD) | (btn_WK_tone_on->value() ? 2 : 0); if (progStatus.WK_online) load_defaults(); } void WK_change_btn_ptt_on() { progStatus.WK_pin_configuration = (progStatus.WK_pin_configuration & 0xFE) | (btn_WK_ptt_on->value() ? 1 : 0); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_min_wpm() { progStatus.WK_min_wpm = cntr_WK_min_wpm->value(); if (progStatus.WK_speed_wpm < progStatus.WK_min_wpm) { progStatus.WK_speed_wpm = progStatus.WK_min_wpm; cntCW_WPM->value(progStatus.WK_speed_wpm); } if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_rng_wpm() { progStatus.WK_rng_wpm = cntr_WK_rng_wpm->value(); if (progStatus.WK_speed_wpm > progStatus.WK_min_wpm + progStatus.WK_rng_wpm) { progStatus.WK_speed_wpm = progStatus.WK_min_wpm + progStatus.WK_rng_wpm; cntCW_WPM->value(progStatus.WK_speed_wpm); } if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_farnsworth() { progStatus.WK_farnsworth_wpm = cntr_WK_farnsworth->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_cmd_wpm() { progStatus.WK_cmd_wpm = cntr_WK_cmd_wpm->value(); } void WK_change_cntr_ratio() { progStatus.WK_dit_dah_ratio = (unsigned char)(cntr_WK_ratio->value() * 50 / 3); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_comp() { progStatus.WK_key_compensation = cntr_WK_comp->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_first_ext() { progStatus.WK_first_extension = cntr_WK_first_ext->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_sample() { progStatus.WK_paddle_setpoint = cntr_WK_sample->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_weight() { progStatus.WK_weight = cntr_WK_weight->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_leadin() { progStatus.WK_lead_in_time = cntr_WK_leadin->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_cntr_tail() { progStatus.WK_tail_time = cntr_WK_tail->value(); if (progStatus.WK_online) load_defaults(); } void WK_change_choice_keyer_mode() { int modebits = choice_WK_keyer_mode->index() << 4; progStatus.WK_mode_register = (progStatus.WK_mode_register & 0xCF) | modebits; LOG_DEBUG("mode reg: %02X", progStatus.WK_mode_register); if (progStatus.WK_online) load_defaults(); } void WK_change_choice_hang() { int hangbits = choice_WK_hang->index() << 4; progStatus.WK_pin_configuration = (progStatus.WK_pin_configuration & 0xCF) | hangbits; if (progStatus.WK_online) load_defaults(); } void WK_change_choice_sidetone() { progStatus.WK_sidetone = choice_WK_sidetone->index() + 1; progStatus.WK_sidetone |= (btn_WK_sidetone_on->value() ? 0x80 : 0x00); if (progStatus.WK_online) load_defaults(); } void WK_change_choice_output_pins() { int pinbits = (choice_WK_output_pins->index() + 1) << 2; progStatus.WK_pin_configuration = (progStatus.WK_pin_configuration & 0xF3) | pinbits; if (progStatus.WK_online) load_defaults(); } //---------------------------------------------------------------------- // serial support //---------------------------------------------------------------------- extern bool test; bool WK_start_wkey_serial() { WK_bypass_serial_thread_loop = true; WK_serial.ClosePort(); if (progStatus.WK_serial_port_name == "NONE") return false; WK_serial.Device(progStatus.WK_serial_port_name); WK_serial.Baud(1200); WK_serial.Stopbits(2); WK_serial.Retries(1); WK_serial.Timeout(100); // default is 50 msec WK_serial.RTSptt(false); WK_serial.DTRptt(false); WK_serial.RTSCTS(false); WK_serial.RTS(false); WK_serial.DTR(true); if (!WK_serial.OpenPort()) { LOG_ERROR("Cannot access %s", progStatus.WK_serial_port_name.c_str()); return false; } else { LOG_DEBUG("\n\ Serial port:\n\ Port : %s\n\ Baud : %d\n\ Stopbits : %d\n\ Timeout : %d\n\ DTR : %s\n\ RTS/CTS : %s", progStatus.WK_serial_port_name.c_str(), WK_serial.Baud(), WK_serial.Stopbits(), WK_serial.Timeout(), WK_serial.DTR() ? "true" : "false", WK_serial.RTSCTS() ? "true" : "false"); } MilliSleep(400); // to allow WK1 to wake up return true; } #define WK_RXBUFFSIZE 512 static unsigned char WK_replybuff[WK_RXBUFFSIZE+1]; static std::string WK_replystr; bool WK_readByte(unsigned char &byte) { unsigned char c; int ret = WK_serial.ReadBuffer(&c, 1); byte = c; return ret; } int WK_readString() { int numread = 0; size_t n; memset(WK_replybuff, 0, WK_RXBUFFSIZE + 1); while (numread < WK_RXBUFFSIZE) { if ((n = WK_serial.ReadBuffer(&WK_replybuff[numread], WK_RXBUFFSIZE - numread)) == 0) break; numread += n; } WK_replystr.append((const char *)WK_replybuff); return numread; } int WK_sendString (std::string &s) { if (WK_serial.IsOpen() == false) { LOG_DEBUG("command: %s", str2hex(s.data(), s.length())); return 0; } int numwrite = (int)s.length(); WK_serial.WriteBuffer((unsigned char *)s.c_str(), numwrite); if (isprint(s[0])) LOG_DEBUG("Sent %d: '%s' %s", numwrite, s.c_str(), str2hex(s.data(), s.length())); else LOG_DEBUG("Sent %d: %s", numwrite, str2hex(s.data(), s.length())); return numwrite; } void WK_clearSerialPort() { if (WK_serial.IsOpen() == false) return; WK_serial.FlushBuffer(); } static bool WK_thread_activated = false; void WK_exit() { if (!WK_thread_activated) return; if (progStatus.WK_online) WKCW_connect(false); WK_run_serial_thread = false; pthread_join(WK_serial_thread, NULL); } // ===================================================================== // Winkeyer 3.0 FSK interface support // ===================================================================== // progStatus configuration parameters: // // WKFSK_baud // WKFSK_stopbits // WKFSK_ptt // WKFSK_polarity // WKFSK_sidetone // WKFSK_auto_crlf // WKFSK_diddle // WKFSK_diddle_char // WKFSK_usos // WKFSK_monitor #define wait_one_char(baud, stopbits) (int)((6 + (stopbits))*1000.0 / (baud)) void WKFSK_send_char(int ch) { unsigned char c = toupper(ch); int n = (int)(5 * wait_one_char(45.45, 2)); if (c == 0 || c == '\n') { MilliSleep(10); Fl::awake(); return; } if (c == '\r') c = '}'; { guard_lock wklock(&WK_buffer_mutex); if (c == '[' || c == ']' || c == '}' || c == '{' || c < ' ') { LOG_DEBUG("%s", (c == '[' ? "[ - ptt ON" : c == ']' ? "] - ptt OFF" : c == '}' ? "} - CR/LF" : c == '{' ? "{ - left brace" : "Control code")); } else LOG_DEBUG("Sending %c, %x", c, c); if (progStatus.WKFSK_monitor) WK_wait_for_char = true; WK_str_out += c; } while (WK_wait_for_char) { MilliSleep(10); Fl::awake(); n -= 10; if (n <= 0 || active_modem->get_stopflag()) { WK_wait_for_char = false; LOG_DEBUG("%s", (n <= 0 ? "echo: NIL" : "xmt aborted") ); return; } } return; } void WKFSK_init() { std::string cmd = " "; LOG_DEBUG("mode %d", progStatus.WKFSK_mode); LOG_DEBUG("diddle %d", progStatus.WKFSK_diddle); LOG_DEBUG("ptt %d", progStatus.WKFSK_ptt); LOG_DEBUG("auto crlf %d", progStatus.WKFSK_auto_crlf); LOG_DEBUG("monitor %d", progStatus.WKFSK_monitor); LOG_DEBUG("polarity %d", progStatus.WKFSK_polarity); LOG_DEBUG("baud %d", progStatus.WKFSK_baud); LOG_DEBUG("stopbits %d", progStatus.WKFSK_stopbits); LOG_DEBUG("sidetone %d", progStatus.WKFSK_sidetone); LOG_DEBUG("diddle_char %d", progStatus.WKFSK_diddle_char); LOG_DEBUG("usos %d", progStatus.WKFSK_usos); cmd[0] = ADMIN; cmd[1] = FSK_MODE; cmd[2] = (progStatus.WKFSK_mode ? 0x80 : 0x00); cmd[2] |= (progStatus.WKFSK_diddle ? 0x40 : 0x00); cmd[2] |= (progStatus.WKFSK_ptt ? 0x20 : 0x00); cmd[2] |= (progStatus.WKFSK_auto_crlf ? 0x10 : 0x00); cmd[2] |= (progStatus.WKFSK_monitor ? 0x08 : 0x00); cmd[2] |= (progStatus.WKFSK_polarity ? 0x04 : 0x00); cmd[2] |= progStatus.WKFSK_baud; cmd[3] = (progStatus.WKFSK_sidetone ? 0x10 : 0x00); cmd[3] |= (progStatus.WKFSK_stopbits ? 0x08 : 0x00); cmd[3] |= (progStatus.WKFSK_diddle_char ? 0x04 : 0x00); cmd[3] |= progStatus.WKFSK_usos; WK_send_command(cmd); } void WKCW_connect(bool start) { LOG_DEBUG("WKCW_connect(%s)", (start ? "ON" : "OFF")); progStatus.WKFSK_mode = false; btn_WKFSK_connect->value(0); btn_WKCW_connect->value(0); if (!WK_thread_activated) { if (pthread_create(&WK_serial_thread, NULL, WK_serial_thread_loop, NULL)) { perror("pthread_create"); exit(EXIT_FAILURE); } WK_thread_activated = true; } if (!start) { close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); ReceiveText->add("\nWinKeyer disconnected\n"); progStatus.WK_online = false; return; } // shutdown and then reconnect if currently in FSK mode if (progStatus.WK_online) { close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); } if (WK_start_wkey_serial()) { WK_bypass_serial_thread_loop = false; open_wkeyer(); if (!WK_serial.IsOpen()) { progStatus.WK_online = false; return; } else { progStatus.WK_online = true; btn_WKCW_connect->value(1); } } else progStatus.WK_online = false; WKCW_init(); } void WKFSK_connect(bool start) { LOG_DEBUG("WKFSK_connect(%s)", (start ? "ON" : "OFF")); progStatus.WKFSK_mode = false; btn_WKFSK_connect->value(0); btn_WKCW_connect->value(0); if (!WK_thread_activated) { if (pthread_create(&WK_serial_thread, NULL, WK_serial_thread_loop, NULL)) { perror("pthread_create"); exit(EXIT_FAILURE); } WK_thread_activated = true; } if (!start) { close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); ReceiveText->add("\nWinKeyer disconnected\n"); progStatus.WK_online = false; return; } // shutdown and then reconnect if currently in CW mode if (progStatus.WK_online) { close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); } if (WK_start_wkey_serial()) { WK_bypass_serial_thread_loop = false; open_wkeyer(); if (!WK_serial.IsOpen()) { progStatus.WK_online = false; return; } else { progStatus.WK_online = true; } } else progStatus.WK_online = false; if (progStatus.WK_version < 31) { fl_alert2("Winkeyer version must be 31 or greater"); close_wkeyer(); MilliSleep(100); WK_bypass_serial_thread_loop = true; MilliSleep(50); WK_serial.ClosePort(); ReceiveText->add("\nWinKeyer disconnected\n"); progStatus.WK_online = false; progStatus.WKFSK_mode = false; return; } progStatus.WKFSK_mode = true; WKFSK_init(); btn_WKFSK_connect->value(1); } fldigi-4.2.05/src/synop-src/0000775000175000017500000000000014611714005012566 500000000000000fldigi-4.2.05/src/synop-src/Makefile0000664000175000017500000000343314532252172014155 00000000000000#---------------------------------------------------------------------------------- # Make File for synop_tools #---------------------------------------------------------------------------------- GCC = gcc CXX = g++ INCLUDE = -I../ -I../include -I../libtiniconv -I../irrxml OPTIM = -O2 -Wunused -fexceptions -Wno-deprecated CXXFLAGS = $(OPTIM) $(INCLUDE) \ -DLOCALEDIR=\"/usr/local/share/locale\" \ -DPKGDATADIR=\"/usr/local/share/data\" CFLAGS = $(CXXFLAGS) # libraries to link with: LIBS = -lpthread -ldl -lm -lrt # ---------------------------------------------------------------------------------- .SUFFIXES: .cxx .o all: synop_tool synop_tool.o: synop_tool.cxx $(CXX) $(CXXFLAGS) -c $< synop.o: synop.cxx $(CXX) $(CXXFLAGS) -c $< coordinate.o: ../misc/coordinate.cxx $(CXX) $(CXXFLAGS) -c $< kmlserver.o: ../misc/kmlserver.cxx $(CXX) $(CXXFLAGS) -c $< irrXML.o: ../irrxml/irrXML.cpp $(CXX) $(CXXFLAGS) -c $< re.o: ../misc/re.cxx $(CXX) $(CXXFLAGS) -c $< strutil.o: ../misc/strutil.cxx $(CXX) $(CXXFLAGS) -c $< timeops.o: ../misc/timeops.cxx $(CXX) $(CXXFLAGS) -c $< util.o: ../misc/util.cxx $(CXX) $(CXXFLAGS) -c $< threads.o: ../misc/threads.cxx $(CXX) $(CXXFLAGS) -c $< cmd_debug.o: cmd_debug.cxx $(CXX) $(CXXFLAGS) -c $< nls.o: ../misc/nls.cxx $(CXX) $(CXXFLAGS) -c $< locator.o: ../misc/locator.c $(GCC) $(CFLAGS) -c $< synop_tool: \ synop_tool.o synop.o coordinate.o kmlserver.o irrXML.o re.o strutil.o \ nls.o util.o cmd_debug.o threads.o timeops.o locator.o $(CXX) \ synop_tool.o synop.o coordinate.o kmlserver.o irrXML.o re.o strutil.o \ nls.o util.o cmd_debug.o threads.o timeops.o locator.o \ -o synop_tool $(LIBS) clean: $(RM) *.bak *~ *.o synop_tool #---------------------------------------------------------------------------------- fldigi-4.2.05/src/synop-src/README0000664000175000017500000000051614532252172013374 00000000000000The "makefile" in this directory can be used to create a linux only command line tool 'synop_tool.' The make file is not named "Makefile" to avoid it being excluded by the automake distribution scripts. DO NOT rename this file. You can simply invoke "make" from within this directory and "make" will act upon the makefile script. fldigi-4.2.05/src/synop-src/synop.cxx0000664000175000017500000063101714611711171014413 00000000000000// ---------------------------------------------------------------------------- // synop.cxx -- SYNOP decoding // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "re.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "synop.h" #include "kmlserver.h" #include "configuration.h" #include "fl_digi.h" #include "gettext.h" #include "debug.h" #include "field_def.h" #include "record_loader.h" #include "coordinate.h" #include "strutil.h" #include "FL/fl_ask.H" LOG_FILE_SOURCE(debug::LOG_SYNOP); // ---------------------------------------------------------------------------- // RTTY is 850 Hz shift, 75 baud, ITA2 Baudot code. // 3231.0 KAWN RTTY (Tune in LSB) // 7784.0 KAWN RTTY // 11120.0 KAWN RTTY (Tune in LSB) // 13530.0 KAWN RTTY // 19324.5 KAWN RTTY // 19530.0 KAWN RTTY (Usually "fox" marker) // ---------------------------------------------------------------------------- /// Writes a string range to the current print callback. static void disp_range( std::string::const_iterator b, std::string::const_iterator e, bool bold = false) { const char * first = &( *b ); const char * last = &( *e ); assert( first <= last ); size_t nb = last - first ; synop::ptr_callback->print( first, nb, bold ); }; // ---------------------------------------------------------------------------- /// Builds a time with Synop messages which just have event's day/hour/min. static time_t DayHourMin2Tm( int day, int hour, int min ) { // TODO: Check that time() is UTC too. time_t tmpTime = time(NULL); tm aTm = *gmtime(&tmpTime); // Maybe observation from previous month. if( day > aTm.tm_mday ) { aTm.tm_mon-- ; if( aTm.tm_mon < 0 ) { aTm.tm_mon = 11 ; aTm.tm_year-- ; } } aTm.tm_mday = day ; aTm.tm_hour = hour ; aTm.tm_min = min ; time_t my_time = mktime( & aTm ); if( my_time <= 0 ) throw std::runtime_error("Invalid time"); return my_time ; } /// Absolute time difference in number of days. static int diffTm( time_t tim1, time_t tim2 ) { if( (tim1 <= 0 ) || (tim2 <= 0 ) ) throw std::runtime_error("Invalid times"); double nbSecs = difftime( tim1, tim2 ); return fabs( 0.5 + nbSecs * ( 1.0 / ( 24 * 3600 ) ) ); } /// We could use any other time as long as it is clear. static std::string Tm2SynopTime( time_t tim ) { return KmlServer::Tm2Time( tim ); } // ---------------------------------------------------------------------------- /// Base class for displaying the key-value pairs read from Synop broadcast. class Serializer { /// It returns the previous value which can therefore be restored. Serializer * m_prevSerial ; /// This happens when switching temporarily to this serializer. static Serializer * m_srl ; public: /// It registers itself as a serializer. Serializer() { m_prevSerial = m_srl ; m_srl = this ; } /// It restores the previous serializer. virtual ~Serializer() { m_srl = m_prevSerial ; } virtual void StartSection( const std::string & section_name ) = 0 ; virtual void AddItem( const char * key, const char * value, const char * unit ) = 0; static Serializer * Instance(void) { if( m_srl == NULL ) throw std::runtime_error("Null m_srl"); return m_srl; } }; // Current serializer, that is, the object which prints Synop attributes. Serializer * Serializer::m_srl = NULL; // ---------------------------------------------------------------------------- static const char * Unit_hPa = "hPa"; static const char * Unit_degrees = "degrees"; static const char * Unit_hours = "hours"; static const char * Unit_minutes = "mn"; static const char * Unit_seconds = "seconds"; static const char * Unit_Celsius = "°C"; static const char * Unit_knots = "knots"; static const char * Unit_feet = "feet"; static const char * Unit_km = "km"; static const char * Unit_meters = "meters"; static const char * Unit_centimeters = "cm"; static const char * Unit_mm = "mm"; static const char * Unit_meters_second = "m/s"; // ---------------------------------------------------------------------------- /// Compile-time number of elements of a static array. #ifndef G_N_ELEMENTS #define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0]))) #endif /// For documentation only. Tells the WMO code table of an information. #define FM12CodeTable( arr, num, txt ) // ---------------------------------------------------------------------------- /// Used to select from lookup tables. template< class Key > struct choice { const Key m_key; const char * m_val; }; // Simple lookup. template< class Key, class Dflt > const char * choice_map( const choice< Key > * choices, size_t nb_choices, const Key & key, const Dflt & dflt ) { for( ; nb_choices; --nb_choices, ++choices ) { if( key == choices->m_key ) return choices->m_val ; } return dflt ; } // ---------------------------------------------------------------------------- // There are about 11000 records, so memory usage is an issue. class RecordWmoStation { /// Block Number :2 digits representing the WMO-assigned block. int m_block ; /// Station Number :3 digits representing the WMO-assigned station. int m_station ; /// ICAO Location Indicator :4 alphanumeric characters, /// not all stations in this file have an assigned location indicator. /// The value "----" is used for stations that do not have an assigned location indicator. char m_icao_indicator[5]; // TODO: Not used at the moment. /// Place Name :Common name of station location. std::string m_name ; // State :2 character abbreviation (included for stations located in the United States only). // Country Name :Country name is ISO short English form. // TODO: Consider replacing it with an ISO integer key. std::string m_country; // WMO Region :digits 1 through 6 representing the corresponding WMO region, 7 stands for the WMO Antarctic region. // Station Latitude or Latitude :DD-MM-SSH where DD is degrees, MM is minutes, SS is seconds // and H is N for northern hemisphere or S for southern hemisphere or // E for eastern hemisphere or W for western hemisphere. // The seconds value is omitted for those stations where the seconds value is unknown. CoordinateT::Pair m_station_coordinates ; /// Upper Air Latitude :DD-MM-SSH. /// Station Elevation (Ha) :The station elevation in meters. Value is omitted if unknown. int m_station_elevation ; /// Upper Air Elevation (Hp) :The upper air elevation in meters. Value is omitted if unknown. /// RBSN indicator :P if station is defined by the WMO as belonging to the Regional Basic Synoptic Network, omitted otherwise. /// Delimiter between values in a record. static const char m_delim = ';'; public: /// More information here: http://weather.noaa.gov/tg/site.shtml RecordWmoStation() : m_block(0) , m_station(0) {} int wmo_indicator() const { return m_block * 1000 + m_station; } const CoordinateT::Pair & station_coordinates() const { return m_station_coordinates; } int station_elevation(void) const { return m_station_elevation; } const std::string & country() const { return m_country; } /// This garantees an unique name. const std::string & station_name() const { return m_name; } void rename_station( const std::string & nam ) { LOG_VERBOSE("Renaming %s to %s", m_name.c_str(), nam.c_str() ); m_name = nam; } // http://weather.noaa.gov/data/nsd_bbsss.txt // 01;023;ENDU;Bardufoss;;Norway;6;69-04N;018-32E;;;7;79;P // Wrong record: // 71;113;CWZA;Agassiz Automated Reporting Station ;;Canada;;49-15N;121-46W;;;15;; friend std::istream & operator>>( std::istream & istrm, RecordWmoStation & rec ) { if( read_until_delim( m_delim, istrm, rec.m_block ) && read_until_delim( m_delim, istrm, rec.m_station ) && read_until_delim( m_delim, istrm, rec.m_icao_indicator ) && read_until_delim( m_delim, istrm, rec.m_name ) && read_until_delim( m_delim, istrm /* State */ ) && read_until_delim( m_delim, istrm, rec.m_country ) && read_until_delim( m_delim, istrm /* WMO region */ ) && read_until_delim( m_delim, istrm, rec.m_station_coordinates.latitude() ) && read_until_delim( m_delim, istrm, rec.m_station_coordinates.longitude() ) && read_until_delim( m_delim, istrm /* Upper air latitude */ ) && read_until_delim( m_delim, istrm /* Upper air longitude */ ) && read_until_delim( m_delim, istrm, rec.m_station_elevation, 0 ) && read_until_delim( m_delim, istrm /* Upper air elevation */ ) && read_until_delim( m_delim, istrm /* Rsbn indicator */ ) && ( rec.m_station_coordinates.latitude().is_lon() == false ) && ( rec.m_station_coordinates.longitude().is_lon() == true ) ) { strtrim( rec.m_name ); return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } friend std::ostream & operator<< ( std::ostream & ostrm, const RecordWmoStation & rec ) { ostrm << rec.m_name ; return ostrm; } }; // RecordWmoStation // ---------------------------------------------------------------------------- // srst2;29.683 N;94.033 W;0.7;Sabine Pass, TX;NDBC;NDBC Meteorological/Ocean;fixed // ssbn7;33.842 N;78.476 W;;Sunset Beach Nearshore Waves;CORMP;IOOS Partners;other // Adapted from http://www.ndbc.noaa.gov/ndbcmapstations.json // ftp://tgftp.nws.noaa.gov/data/observations/marine/stations/station_table.txt // # STATION_ID | OWNER | TTYPE | HULL | NAME | PAYLOAD | LOCATION | TIMEZONE | FORECAST | NOTE // # // 0y2w3|CG|Weather Station||Sturgeon Bay CG Station, WS||44.794 N 87.313 W (44°47'40" N 87°18'47" W)|C| | // 13001|PR|Atlas Buoy|PM-595|NE Extension||12.000 N 23.000 W (12°0'0" N 23°0'0" W)|| | /// This allows to find a buoy characteristics. class RecordBuoy { std::string m_id ; std::string m_owner ; /// "UW" : University of Washington etc... std::string m_type ; /// "Offshore Buoy", "6-meter NOMAD buoy" etc... std::string m_hull; /// "PM-599", "3D37" std::string m_name ; /// "Ecuador INOCAR", "150 NM East of Cape HATTERAS" std::string m_payload; /// "AMPS payload" CoordinateT::Pair m_location ; /// "32.501 N 79.099 W (32°30'2" N 79°5'58" W)" std::string m_timezone ; /// "E" std::string m_forecast; /// "FZUS52.KCHS FZNT22.KWBC" std::string m_note; /// "This buoy was removed ..." /// From the CVS file. static const char m_delim = '|'; public: /// Unique identifier in a catalog. const std::string & id() const { return m_id; } const CoordinateT::Pair & station_coordinates() const { return m_location; } /// The name coming from the file might not be unique. const std::string & buoy_name(void) const { return m_name;} /// Needed because buoy names are not unique void rename_buoy( const std::string & new_buoy_name ) { m_name = new_buoy_name ; } const std::string & owner(void) const { return m_owner;} const std::string & payload(void) const { return m_payload;} const std::string & note(void) const { return m_note;} /// TODO: Speedup by doing that once only. std::string title(void) const { std::string title = m_type ; if( ! m_name.empty() ) title += ":" + m_name ; if( ! m_payload.empty() ) title += ":" + m_payload ; if( ! m_owner.empty() ) title += ":" + m_owner ; return title ; } /// fixed, other, dart, buoy, oilrig, tao const std::string & type(void) const { return m_type;} friend std::istream & operator>>( std::istream & istrm, RecordBuoy & rec ) { if( read_until_delim( m_delim, istrm, rec.m_id ) && read_until_delim( m_delim, istrm, rec.m_owner ) && read_until_delim( m_delim, istrm, rec.m_type ) && read_until_delim( m_delim, istrm, rec.m_hull ) && read_until_delim( m_delim, istrm, rec.m_name ) && read_until_delim( m_delim, istrm, rec.m_payload ) && read_until_delim( m_delim, istrm, rec.m_location ) && read_until_delim( m_delim, istrm, rec.m_timezone ) && read_until_delim( m_delim, istrm, rec.m_forecast ) && read_until_delim( m_delim, istrm, rec.m_note ) ) { // std::cout << "id=" << rec.m_id << " name=" << rec.m_name << "\n"; return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } }; // RecordBuoy // ---------------------------------------------------------------------------- // http://www.metoffice.gov.uk/media/csv/e/7/ToR-Stats-SHIP.csv // June 2012,,,,,,,, // CTRY,CALLSIGN,NAME,Observations,N<30,N<60,N<120,N>360,Average (R-O) (mins) // , B2M1297, ,1,1,1,1,0,30 // , B2M1303, ,17,16,17,17,0,17.9 // , BATEU00, ,366,366,366,366,0,5 class RecordShip { std::string m_callsign; std::string m_country; std::string m_name ; static const char m_delim = ','; public: const std::string & callsign(void) const { return m_callsign; } const std::string & country(void) const { return m_country; } const std::string & name(void) const { return m_name; } friend std::istream & operator>>( std::istream & istrm, RecordShip & rec ) { if( read_until_delim( m_delim, istrm, rec.m_country ) && read_until_delim( m_delim, istrm, rec.m_callsign ) && read_until_delim( m_delim, istrm, rec.m_name ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) && read_until_delim( m_delim, istrm ) ) { strtrim( rec.m_country ); strtrim( rec.m_callsign ); strtrim( rec.m_name ); // std::cout << "id=" << rec.m_callsign << " name=" << rec.m_name << "\n"; strcapitalize( rec.m_name ); // std::cout << "id=" << rec.m_callsign << " name=" << rec.m_name << "\n"; return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } }; // RecordShip // ---------------------------------------------------------------------------- /** Huge file, but contains many information. There are many duplicates for each WMO indicator, it does not matter for us. ftp://ftp.jcommops.org/JCOMMOPS/GTS/wmo/wmo_list.txt GTS stands for Global Telecommunications System JCOMMOPS WMO-PLATFORM cross reference list as of 2012-09-08 for WMO number still allocated in the last 6 months (with WMO Ids that are numerical) WMO;TELECOM ID;TELECOM SYSTEM;PTFM NAME;PTFM FAMILY;PTFM TYPE;CONTACT NAME;EMAIL;PROGRAM;ROLE;AGENCY;COUNTRY;ALLOC_DATE;DEALLOC_DATE;ARGOS_PROG 10044;BSH:10044;METEOSAT;MB:10044;FIXED;METSTATION;;;GERMANY MB;Program Manager;KIEL UNIVERSITY;DEU;2001-01-01;3000-01-01; 10044;BSH:10044;METEOSAT;MB:10044;FIXED;METSTATION;;;GERMANY MB;Programme GTS Coordinator;KIEL UNIVERSITY;DEU;2001-01-01;3000-01-01; 11908;88671;ARGOS;ARGOS:88671;DB;SVPBD2;;;AOML-GDP;Programme GTS Coordinator;NOAA/AOML;USA;2011-07-19;3000-01-01; Apparently, special codes here: http://www.meds-sdmm.dfo-mpo.gc.ca/isdm-gdsi/international-internationale/j-comm/CODES/wmotable_e.htm */ /// JComm stands for Joint Commission on Oceanography and Marine Meteorology (J-COMM) class RecordJComm { std::string m_wmo ; // TODO: This could be an integer. std::string m_telecom_system ; std::string m_ptfm_name ; std::string m_ptfm_family ; std::string m_ptfm_type ; std::string m_program ; std::string m_agency ; std::string m_country ; static const char m_delim = ';'; public: /// TODO: This could be an integer. const std::string & wmo() const { return m_wmo; } const std::string & telecom_system() const { return m_telecom_system; } const std::string & ptfm_name() const { return m_ptfm_name; } const std::string & ptfm_family() const { return m_ptfm_family; } const std::string & ptfm_type() const { return m_ptfm_type; } const std::string & program() const { return m_program; } const std::string & agency() const { return m_agency; } const std::string & country() const { return m_country; } friend std::istream & operator>>( std::istream & istrm, RecordJComm & rec ) { if( read_until_delim( m_delim, istrm, rec.m_wmo ) && read_until_delim( m_delim, istrm /* Telecom Id */ ) && read_until_delim( m_delim, istrm, rec.m_telecom_system ) && read_until_delim( m_delim, istrm, rec.m_ptfm_name ) && read_until_delim( m_delim, istrm, rec.m_ptfm_family ) && read_until_delim( m_delim, istrm, rec.m_ptfm_type ) && read_until_delim( m_delim, istrm /* Contact Name */ ) && read_until_delim( m_delim, istrm /* Email */ ) && read_until_delim( m_delim, istrm, rec.m_program ) && read_until_delim( m_delim, istrm /* Role */ ) && read_until_delim( m_delim, istrm, rec.m_agency ) && read_until_delim( m_delim, istrm, rec.m_country ) && read_until_delim( m_delim, istrm /* Alloc Date */ ) && read_until_delim( m_delim, istrm /* Dealloc Date */ ) && read_until_delim( m_delim, istrm /* Argos Prog */ ) ) { return istrm ; } istrm.setstate(std::ios::badbit); return istrm ; } // Unfortunately the physical type of the station is embedded in the ptfm_name. // So we rearrange data, to have a decent icon name. Handles cases such as: // 42365;Ursa809;IRIDIUM;PLATFORM:42365;FIXED;FIXED // 62130;IRID:62130;IRIDIUM;OILPLAT:62130;MB;MB; // Very rough solution, quite OK for the moment. void SetJCommFields( std::string & kmlNam, std::string & iconNam ) const { if( ( strstr( m_ptfm_name.c_str(), "PLATFORM" ) ) || ( strstr( m_ptfm_name.c_str(), "OILPLAT" ) ) ) { kmlNam = agency() + ":(" + m_wmo + ")"; iconNam = "Oil Platform"; } else if( ( strstr( m_ptfm_name.c_str(), "BUOY" ) ) ) { kmlNam = agency() + ":(" + m_wmo + ")"; iconNam = "Buoy"; } else { kmlNam = ptfm_name() + "," + agency(); iconNam = telecom_system(); } strcapitalize(kmlNam); } }; // RecordJComm // ---------------------------------------------------------------------------- /// This wraps a record type and allows to load a cvs file and access it using a key. template< class Key, class Record, Key (Record::*Method)(void) const, class Terminal > class Catalog : public RecordLoader< Terminal > { /// The keying method might return a reference instead of a value. template< class Type > struct deref { typedef Type type ; }; template< class Type > struct deref< Type & > { typedef Type type ; }; /// If the return value of the indexing function is for example a reference /// to a const string, then KeyType is a string. template< class Type > struct deref< const Type & > { typedef Type type ; }; protected: typedef typename deref< Key >::type KeyType ; typedef std::map< KeyType, Record > CatalogType ; typedef typename CatalogType::iterator IteratorType ; CatalogType m_catalog ; bool FillAndTest() { int nbRec = this->LoadAndRegister(); if( nbRec < 0 ) { return false ; } else { LOG_VERBOSE("record=%s nb_recs=%d", typeid(Record).name(), nbRec ); return true ; } } public: void Clear() { m_catalog.clear(); } bool ReadRecord( std::istream & istrm ) { Record tmp ; istrm >> tmp ; if( istrm || istrm.eof() ) { m_catalog[ (tmp.*Method)() ] = tmp ; return true ; } return false; } /// Returns a station with wmo_indicator to zero if cannot find the right one. static const Record * FindFromKey( Key key ) { CatalogType & refCat = RecordLoader< Terminal >::InstCatalog().m_catalog; typename CatalogType::const_iterator it = refCat.find( key ); return ( it == refCat.end() ) ? NULL : &it->second ; } bool Fill() { return FillAndTest(); } }; // Catalog // ---------------------------------------------------------------------------- /// This contains all WMO stations records read from the file. class CatalogWmoStations : public Catalog< int, RecordWmoStation, &RecordWmoStation::wmo_indicator, CatalogWmoStations > { public: // After data loading, there is an extra step to ensure that names are unique. // 85;196;SLCP;Concepcion;;Bolivia;3;16-09S;062-01W;;;497;; // 85;682;SCIE;Concepcion;;Chile;3;36-46S;073-03W;;;12;;P // 86;134;SGCO;Concepcion;;Paraguay;3;23-25S;057-18W;;;74;74; bool Fill() { if( ! FillAndTest() ) return false ; typedef std::multimap< std::string, IteratorType > HashT ; HashT allNames ; // First take the names LOG_VERBOSE("Eliminating duplicates out of %d elements", static_cast(m_catalog.size())); for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) { RecordWmoStation & refWmo = it->second ; allNames.insert( allNames.end(), HashT::value_type( refWmo.station_name(), it ) ); } size_t nbDupl = 0 ; // Iterates on all names, take only the duplicates. for( HashT::iterator itH = allNames.begin(), itNextH = itH, enH = allNames.end(); itH != enH; itH = itNextH ) { LOG_VERBOSE("Name=%s", itH->first.c_str() ); size_t nbKeys = 1 ; for(;;) { ++itNextH; if( itNextH == enH ) break ; if( itNextH->first != itH->first ) break ; ++nbKeys; } LOG_VERBOSE("Name=%s nb=%d", itH->first.c_str(), static_cast(nbKeys) ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; ++nbDupl ; LOG_VERBOSE("%d: Name %s %d occurrences", static_cast(nbDupl), itH->first.c_str(), static_cast(nbKeys) ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; DiffNamesT differentNames ; // Check that all countries are different. for( HashT::iterator itSubH = itH; itSubH != itNextH; ++itSubH ) { RecordWmoStation & refWmo = itSubH->second->second ; LOG_VERBOSE("Trying %s", refWmo.station_name().c_str() ); // Appends the country. refWmo.rename_station( refWmo.station_name() + "," + refWmo.country() ); std::pair< DiffNamesT::iterator, bool > tmpPair = differentNames.insert( refWmo.station_name() ); if( tmpPair.second ) continue ; // Appends the WMO refWmo.rename_station( strformat( "%s,%05d", refWmo.station_name().c_str(), refWmo.wmo_indicator() ) ); tmpPair = differentNames.insert( refWmo.station_name() ); if( tmpPair.second ) continue ; LOG_ERROR("This should never happen because WMO indicator is unique"); return false ; } } if(nbDupl) { LOG_VERBOSE("Eliminated %d duplicates out of %d elements", (int)nbDupl, (int)m_catalog.size()); } return true ; } /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "http://weather.noaa.gov/data/nsd_bbsss.txt"; } const char * Description() const { return _("WMO stations"); } }; // CatalogWmoStations // ---------------------------------------------------------------------------- /// This contains all WMO stations records read from the file. /// Derived class necessary because names are not unique and must be revised. class CatalogBuoy : public Catalog< const std::string &, RecordBuoy, &RecordBuoy::id, CatalogBuoy > { public: /// After data loading, there is an extra step to ensure that names are unique. bool Fill() { if( ! FillAndTest() ) return false ; typedef std::multimap< std::string, IteratorType > HashT ; HashT allNames ; LOG_VERBOSE("Eliminating duplicates out of %d elements", static_cast(m_catalog.size())); /// First take the names for( IteratorType it = m_catalog.begin(), en = m_catalog.end(); it != en; ++it ) { RecordBuoy & refWmo = it->second ; allNames.insert( allNames.end(), HashT::value_type( refWmo.buoy_name(), it ) ); } size_t nbDupl = 0 ; /// Iterates on all names, take only the duplicates. for( HashT::iterator itH = allNames.begin(), itNextH = itH, enH = allNames.end(); itH != enH; itH = itNextH ) { LOG_VERBOSE("Name=%s", itH->first.c_str() ); size_t nbKeys = 1 ; for(;;) { ++itNextH; if( itNextH == enH ) break ; if( itNextH->first != itH->first ) break ; ++nbKeys; } LOG_VERBOSE("Name=%s nb=%d", itH->first.c_str(), static_cast(nbKeys) ); // If no duplicates, then try next one. if( nbKeys == 1 ) continue ; ++nbDupl ; LOG_VERBOSE("%d: Buoy name %s %d occurrences", static_cast(nbDupl), itH->first.c_str(), static_cast(nbKeys) ); // There should not be many elements, two or three duplicates, maximum five apparently. typedef std::set< std::string > DiffNamesT ; DiffNamesT differentNames ; // Check that all countries are different. for( HashT::iterator itSubH = itH; itSubH != itNextH; ++itSubH ) { RecordBuoy & refBuoy = itSubH->second->second ; // Appends the id if( refBuoy.buoy_name().empty() ) refBuoy.rename_buoy( refBuoy.id().c_str() ); else refBuoy.rename_buoy( strformat( "%s-%s", refBuoy.buoy_name().c_str(), refBuoy.id().c_str() ) ); std::pair< DiffNamesT::iterator, bool > tmpPair = differentNames.insert( refBuoy.buoy_name() ); LOG_VERBOSE("Buoy set to %s", refBuoy.buoy_name().c_str() ); if( tmpPair.second ) continue ; LOG_ERROR("This should never happen because buoy id is unique"); return false ; } } if(nbDupl) { LOG_VERBOSE("Eliminated %d duplicates out of %d elements", (int)nbDupl, (int)m_catalog.size()); } return true ; } /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "ftp://tgftp.nws.noaa.gov/data/observations/marine/stations/station_table.txt"; } const char * Description() const { return _("Weather buoys"); } }; // CatalogBuoy // ---------------------------------------------------------------------------- /// Known list of VOS weather ships, Volunteer Observing Ships. struct CatalogShip : public Catalog< const std::string &, RecordShip, &RecordShip::callsign, CatalogShip > { /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "http://www.metoffice.gov.uk/media/csv/e/7/ToR-Stats-SHIP.csv"; } const char * Description() const { return _("Weather ships"); } }; /// Another public-domain file, returns information given a WMO-like key. struct CatalogJComm : public Catalog< const std::string &, RecordJComm, &RecordJComm::wmo, CatalogJComm > { /// A static file with the same name is also installed in directory data. const char * Url(void) const { return "ftp://ftp.jcommops.org/JCOMMOPS/GTS/wmo/wmo_list.txt"; } const char * Description() const { return _("Argos & Iridium"); } }; // ---------------------------------------------------------------------------- // Returns true if properly initialised. // TODO: Have all the derived class link to the base class so the initialisation // can be done without having to enumerate the sub-classes. bool SynopDB::Init( const std::string & data_dir ) { try { return CatalogWmoStations::InstCatalog().Fill() && CatalogBuoy::InstCatalog().Fill () && CatalogShip::InstCatalog().Fill () && CatalogJComm::InstCatalog().Fill (); } catch( const std::exception & exc ) { fl_alert("Could not load SYNOP data files: Exception=%s", exc.what() ); return false ; } return true; } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::IndicatorToName( int wmo_indicator ) { const RecordWmoStation * ptrWmo = CatalogWmoStations::FindFromKey( wmo_indicator ); static const std::string empty_str ; return ( ptrWmo == NULL ) ? empty_str : ptrWmo->station_name(); } /// For testing purpose only in stand-alone program flsynop. const std::string SynopDB::IndicatorToCoordinates( int wmo_indicator ) { const RecordWmoStation * ptrWmo = CatalogWmoStations::FindFromKey( wmo_indicator ); if ( ptrWmo == NULL ) return "No coordinates"; std::stringstream strm ; strm << ptrWmo->station_coordinates() << " " ; strm << ptrWmo->station_coordinates().longitude().angle() << " " ; strm << ptrWmo->station_coordinates().latitude().angle() << " " ; return strm.str(); } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::BuoyToName( const char * buoy_id ) { const RecordBuoy * ptrBuoy = CatalogBuoy::FindFromKey( buoy_id ); static const std::string empty_str ; return ( ptrBuoy == NULL ) ? empty_str : ptrBuoy->buoy_name(); } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::ShipToName( const char * ship_id ) { const RecordShip * ptrShip = CatalogShip::FindFromKey( ship_id ); static const std::string empty_str ; return ( ptrShip == NULL ) ? empty_str : ptrShip->name(); } /// For testing purpose only in stand-alone program flsynop. const std::string & SynopDB::JCommToName( const char * wmo ) { const RecordJComm * ptrJComm = CatalogJComm::FindFromKey( wmo ); static const std::string empty_str ; return ( ptrJComm == NULL ) ? empty_str : ptrJComm->ptfm_name(); } // ---------------------------------------------------------------------------- /// Intrusive reference counter associated with RefCntPtr. template class WithRefCnt { size_t m_ref_cnt ; public: WithRefCnt() : m_ref_cnt(0) {}; template friend class RefCntPtr; }; /// Intrusive smart pointer with reference counting. template< class Obj > class RefCntPtr { /// This must derive from the class WithRefCnt. Obj * m_ptr ; public: RefCntPtr() : m_ptr(NULL) {} /// The reference counter is incremented. RefCntPtr( Obj * ptr ) : m_ptr(ptr) { if( ptr ) ++ptr->m_ref_cnt ; } /// Deletes the pointed object if reference count reaches zero. ~RefCntPtr() { if( m_ptr ) { --m_ptr->m_ref_cnt ; if( m_ptr->m_ref_cnt == 0 ) delete m_ptr ; } } /// The reference counter is incremented. RefCntPtr( const RefCntPtr & ptr ) : m_ptr( ptr.m_ptr ) { if( m_ptr ) ++m_ptr->m_ref_cnt ; } /// The reference counter is incremented. RefCntPtr & operator=( const RefCntPtr & ptr ) { if( this != &ptr ) { m_ptr = ptr.m_ptr ; if( m_ptr ) ++m_ptr->m_ref_cnt ; } return *this; } const Obj * operator->() const { return m_ptr;} Obj * operator->() { return m_ptr;} operator bool() const { return m_ptr; } }; // ---------------------------------------------------------------------------- /// Synop section number. enum section_t { SECTION_ZCZC_DLM=0, SECTION_HEAD_GRP, SECTION_IDENTLOC, // 000 SECTION_LAND_OBS, // 111 SECTION_SEA_SURF, // 222 SECTION_CLIM_DAT, // 333 SECTION_NATCLOUD, // 444 SECTION_NAT_CODE, // 555 SECTION_AUTO_DAT, SECTION_NNNN_DLM, SECTION_SECT_NBR }; static const char * SectionToString( section_t group_number ) { switch(group_number) { case SECTION_ZCZC_DLM : return _("Bulletin start"); case SECTION_HEAD_GRP : return _("Header"); case SECTION_IDENTLOC : return _("Identification and location"); case SECTION_LAND_OBS : return _("Land observations"); case SECTION_SEA_SURF : return _("Sea surface observations"); case SECTION_CLIM_DAT : return _("Climatological data"); case SECTION_NATCLOUD : return _("National data, clouds"); case SECTION_NAT_CODE : return _("National data"); case SECTION_AUTO_DAT : return _("Automatisch erzeugte Daten"); case SECTION_NNNN_DLM : return _("Bulletin end"); default : return _("Unknown Synop group"); } } /// [nextSec][predSec] : Indicates that section Next can be preceded by section Pred. static const char sectionTransitions[SECTION_SECT_NBR][SECTION_SECT_NBR] = { // ZCZC_DLM HEAD_GRP IDENTLOC LAND_OBS SEA_SURF CLIM_DAT NATCLOUD NAT_CODE AUTO_DAT NNNN_DLM { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // ZCZC_DLM { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // HEAD_GRP { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, // IDENTLOC { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, // LAND_OBS { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // SEA_SURF { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // CLIM_DAT { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 }, // NATCLOUD { 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 }, // NAT_CODE { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0 }, // AUTO_DAT { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } // NNNN_DLM }; // ---------------------------------------------------------------------------- /// Priority helps to classify regular expressions matching the same work. typedef double priority_t ; /// Minimum priorities sum to be accepted as a valid chain of tokens. static const priority_t MIN_PRIO = 2.0 ; /// This models a Synop token, that is, a group of (Most of time) five digits. class TokenProxy : public std::string, public WithRefCnt< TokenProxy > { public: typedef RefCntPtr< TokenProxy > Ptr ; /// List of pointers to TokenProxy, each of them associated to a token and its regex. class TokVec : public std::vector< Ptr > , public WithRefCnt< TokVec > { TokVec( const TokVec & ); TokVec & operator=(const TokVec &); /// For debugging, writes the regular expression. void DumpTotal(section_t group_number, bool kml_mode) const { // This information is not needed at the moment, // but it is not possible to discard it if the section is empty, because // we do not know that yet. Serializer * ptrSerial = Serializer::Instance(); if(kml_mode) { ptrSerial->StartSection( SectionToString(group_number) ); } for( size_t i = 0; i < size(); ++ i ) { TokenProxy & prox = *const_cast< TokenProxy *>( at(i).operator->() ); /// If set, this adds in the output which regular expression was detected. static const bool addRegexToOutput = false ; if( addRegexToOutput && ! kml_mode ) { ptrSerial->AddItem( "Regex", prox.RegexName(), prox.c_str() ); } if(kml_mode) { prox.DrawKml(); } else { prox.Print(); } } } public: typedef RefCntPtr< TokVec > Ptr ; private: /// Chains (sections) are linked so that any section can search the previous ones. TokVec::Ptr m_previous_container ; public: TokVec() {}; /// Used to find a preceding token containing a specific information in a previous tokens chain. TokVec::Ptr previous() const { return m_previous_container; } void previous(TokVec::Ptr prev) { m_previous_container = prev; } /// Debugging purpose: It outputs the concatenation of all regular expressions names. std::string MiniDump(section_t group_number,bool disp_all = false) const { std::stringstream strm ; for( size_t i = 0; i < size(); ++ i ) { TokenProxy & prox = *const_cast< TokenProxy *>( at(i).operator->() ); strm << prox.RegexName() ; if( disp_all ) { strm << "#" << static_cast(prox); } strm << '+'; } return strm.str(); } void DumpTokVec(bool test_mode, section_t group_number, bool kml_mode) const { if( test_mode ) { // Just displays the regular expression name, for debugging. std::string str( MiniDump(group_number) ); disp_range( str.begin(), str.end() ); } else { DumpTotal(group_number, kml_mode); } } }; private: /// The index of the regular expression that this token uses. int m_regex_idx; /// Pointer to the chain of TokenProxy. TokVec::Ptr m_container ; /// Offset in the input buffer which indicates the end of what is parsed. size_t m_offset_end ; virtual bool Parse( const char * str ) = 0 ; /* TODO: Output style. 10035 [Germany, 54ø32'N 009ø33'E SCHLESWIG] 11575 [manned] [cloud height:600-1000m] [visibility:25km] 42905 [cloud cover:4/8] [wind dir:290 deg, speed:5] 10066 [air temp:+6.6] 21022 [dew-point temp:-2.2] 30131 [pressure at station level:1013.1hPa] 40190 [pressure at sea level:1019.0hPa] 53014 [pressure:increasing rapidly] [change in 3h:1.4hPa] 69922 [precipitation:0.2mm during last 12 hours] 70181 [past wx: shower(s), cloud cover 1/2 of sky] [wx now: Clouds generally dissolving or becoming less developed] 84801 [cloud info] 333 [section 3] 10094 [maximum temp:+9.4] 20029 [minimum temp:+2.9] 55307 81823 [clouds:1/8 or less, cumulus, 690m] 83633 [clouds:3/8, stratocumulus, 990m] The method Append() will print the five-digits group. Later on, duplicate and consecutive groups will be suppressed. */ void ItemAdd( const char * key, const char * value, const char * unit ) const { Serializer::Instance()->AddItem( key, value, unit ); } virtual void Print() const = 0 ; virtual void DrawKml() const { Print() ; } TokenProxy & operator=(const TokenProxy & ); protected: void disp_arr(const char ** array,size_t arrsz,int idx,int offset,const char * title) const { /// It is a Synop convention that slashes mean no information. if( idx == '/' ) return ; size_t idx_array = idx - offset; char buffer[64]; const char * val; if( idx_array < arrsz ) val = array[idx_array]; else { snprintf( buffer, sizeof(buffer), _("Unknown index %d/%d/%d"), (int)idx, (int)idx_array, (int)arrsz ); val = buffer ; } Append( title, val ); } TokenProxy() : m_regex_idx(-1), m_offset_end(0) {} public: virtual ~TokenProxy() {} /// The boolean flag allows to search only in the current chain but also /// in the previous ones backward. This could be faster by restricting /// only to given section numbers. template< class TokenDerived > const TokenDerived * get_ptr(bool previous_chains) const ; template< class TokenDerived > static Ptr Generator( int rgx_idx, const std::string & wrd, size_t off ) { TokenProxy * ptr = new TokenDerived ; ptr->m_regex_idx = rgx_idx ; static_cast< std::string & >(*ptr) = wrd ; ptr->m_offset_end = off ; return Ptr(ptr); }; void Section( const char * key ) const { Serializer::Instance()->StartSection( key ); } static const bool tstDisp = false ; template< class Val > void Append( const char * key, const Val & val, const char * unit = NULL ) const { std::stringstream strm ; strm << val ; ItemAdd( key, strm.str().c_str(), unit ); } void Append( const char * key, const std::string & val, const char * unit = NULL ) const { ItemAdd( key, val.c_str(), unit ); } void Append( const char * key, const char * val, const char * unit = NULL ) const { ItemAdd( key, val, unit ); } void Append( const char * key, double val, const char * unit = NULL ) const { char buf[20]; snprintf( buf, sizeof(buf), "%.1lf", val ); ItemAdd( key, buf, unit ); } void Append( const char * key, int val, const char * unit = NULL ) const { char buf[12]; snprintf( buf, sizeof(buf), "%d", val ); ItemAdd( key, buf, unit ); } /// This ensures that each token points to the chain containing it. friend void PushItself( Ptr mySelf, TokVec::Ptr ptr ) { mySelf->m_container = ptr ; ptr->push_back( mySelf ); }; size_t offset_begin(void) const { assert( m_offset_end >= size() ); return m_offset_end - size(); } size_t offset_end(void) const { return m_offset_end; } const char * RegexName(void) const ; bool ParseItself(void) { return Parse( c_str() ); } /// It is dependent on the previous token. // TODO: This should be explicitely dependent on a preceding regex. virtual bool CanComeFirst(void) const { return true; } }; // TokenProxy typedef TokenProxy::Ptr (*ProxyGen)( int reg_idx, const std::string & wrd, size_t txt_offset); /// Stores the regular expression associated to a Synop code, /// plus a factory to create an object modelizing this code. class RegexT : public WithRefCnt< RegexT > { const char * m_str ; const char * m_name ; regex_t m_regex ; ProxyGen m_generator ; priority_t m_priority ; void treat_error(int stat) const { char errbuf[512]; size_t lenbuf = snprintf( errbuf, sizeof(errbuf), "%s:", m_str ); regerror(stat, &m_regex, errbuf + lenbuf, sizeof(errbuf) - lenbuf ); throw std::runtime_error(errbuf); } RegexT(); RegexT(const RegexT &); /// Token now just need an integer to point to their regular expression. /// It is therefore very fast to create/copy a token. typedef std::vector< const RegexT * > StorageT ; /// Where we store all created and compiled regexes, indexed with an integer. static StorageT & storage(void) { static StorageT s_storage ; return s_storage ; } public: RegexT( const char * reg, const char * name, ProxyGen gener, priority_t priority ) : m_str(reg) , m_name(name) , m_generator(gener) , m_priority(priority) { char tmpbuf[ 3 + strlen(m_str) ]; snprintf( tmpbuf, sizeof(tmpbuf), "^%s$", m_str ); int stat = regcomp( &m_regex, tmpbuf, REG_EXTENDED|REG_NOSUB); if(stat) treat_error(stat); } ~RegexT() { regfree( &m_regex ); } /// Returns the regular expression given its index. static const RegexT * Find(size_t idx ) { assert( idx < Nb() ); return storage()[ idx ]; } static size_t Nb(void) { return RegexT::storage().size(); } /// Given a regular expression patterns, creates and compile the regular expression and stores it with an integer. static int CreateRgx( const char * reg, const char * name, ProxyGen gener, priority_t priority ) { typedef std::map< const char *, int > Name2idxT ; static Name2idxT name2idx ; Name2idxT::iterator it = name2idx.find(name); if( it != name2idx.end() ) return it->second ; int new_idx = storage().size(); storage().push_back( new RegexT( reg, name, gener, priority ) ); // The name is later used for easier retrieval from a Synop token. name2idx[ name ] = new_idx ; return new_idx ; }; static TokenProxy::Ptr CreateTokenProxy( int reg_idx, const std::string & wrd, size_t txt_offset ) { return Find(reg_idx)->m_generator( reg_idx, wrd, txt_offset ); } const char * Name(void) const { return m_name; } static const char * Name(size_t idx) { return Find(idx)->m_name; } // If two different tokens, with different regular expressions, match for the // same word, the priority tells which one to take. Default value is one. static priority_t Priority( size_t idx ) { assert( idx < Nb() ); return storage()[ idx ]->m_priority; } bool Match( const std::string & str ) const { int stat = regexec( &m_regex, str.c_str(), 0, 0, 0 ); switch(stat) { case 0: //std::cout << "DEBUG: Matched [" << str << "] with [" << m_str << "] (" << m_name << ")\n"; return true ; case REG_NOMATCH: // std::cout << "DEBUG: NoMatch [" << str << "] with [" << m_str << "]\n"; return false ; default: break ; } treat_error(stat); return 0 ; // Will never be reached. } /// Stores the match result for each regular expression. class Context { // First bit to store whether we tried to match. Next bit for the result. std::vector m_flags ; /// TODO: Consider a compile-time size because we know the number of regular expressions. static size_t NbElts() { return RegexT::Nb(); }; public: Context() : m_flags( NbElts() * 2, false ) {} virtual ~Context() {} // This helps performance because the same regex appears in several chains. virtual bool Mtch( size_t reg_idx, const std::string & str ) { assert( m_flags.size() == NbElts() * 2 ); assert( m_flags.size() > 2 * reg_idx + 1 ); if( m_flags.at( 2 * reg_idx ) ) return m_flags[ 2 * reg_idx + 1 ]; m_flags[ 2 * reg_idx ] = true ; bool res = RegexT::Find(reg_idx)->Match( str ); m_flags[ 2 * reg_idx + 1 ] = res; return res; } }; }; // RegexT /// Loops in the tokens held by the container, for a precise type. template< class TokenDerived > const TokenDerived * TokenProxy::get_ptr(bool previous_chains) const { for( TokVec::Ptr curr_container = m_container ; curr_container ; curr_container = curr_container->previous() ) { for( TokVec::const_iterator it = curr_container->begin(), en = curr_container->end(); it != en ; ++it ) { const TokenDerived * ptr = dynamic_cast< const TokenDerived * >( it->operator->() ); if( ptr != NULL ) return ptr ; } if( ! previous_chains ) break ; } return NULL ; } const char * TokenProxy::RegexName(void) const { return RegexT::Name(m_regex_idx); }; /// Transforms a token nickname into a classname, intentionaly small to reduce symbol table size. #define CLASSTK(a) Tk_##a /// Each Synop group (aka Token° is associated to a regular expression, and a priority. #define GENTK_PRIORITY( TokDrv, Rgx, prio ) \ static int MakeRegex() { return RegexT::CreateRgx( Rgx, #TokDrv, TokenProxy::Generator< CLASSTK(TokDrv) >, prio ); } /// TODO: It is not necessary to add "=" or ";" at the end of the regular expressions. #define GENTK( TokDrv, Rgx ) GENTK_PRIORITY( TokDrv, Rgx, 1.0 ) /// Definition of a derived class associated to a five-digits group (Most of times) and a regular expression. /// Virtual inheritance because it might derive from another TokenProxy derived class. #define HEADTK(a) class CLASSTK(a) : virtual public TokenProxy /// For defining chains of tokens. Some tokens might be repeated, hence TKn. #define TKx(a) CLASSTK(a)::MakeRegex() /// If this token appears once and once only. #define TK1(a) {TKx(a),false} /// If this token can be repeated. #define TKn(a) {TKx(a),true} /// One element in a chain of token which forms a Synop line. struct TOKGEN { int m_rgx_idx; // Index to a regular expression. bool m_many; // If this token can be repeated or appears once only. }; // ---------------------------------------------------------------------------- /// Matches the usual message begin. HEADTK(ZCZC) { public: GENTK_PRIORITY( ZCZC, "ZCZC", MIN_PRIO ) bool Parse( const char * str ) { return 0 == strcmp( str, "ZCZC" ); } void Print() const { Section( "Bulletin preamble" ); } }; /// The id which might come after ZCZC. HEADTK(ZCZC_id) { int m_id ; public: GENTK( ZCZC_id, "[0-9]{2,4}" ) bool Parse( const char * str ) { return 1 == sscanf( str, "%d", &m_id ); } void Print() const { Append( _("Report number"), m_id ); } /// Can come only after ZCZC bool CanComeFirst(void) const { return false ; } }; /// Usual end of weather message. HEADTK(NNNN) { public: GENTK_PRIORITY( NNNN, "NNNN", MIN_PRIO ) bool Parse( const char * str ) { return 0 == strcmp( str, "NNNN" ); } void Print() const { Section( "Bulletin end" ); } }; /// Any coding will work if we store two chars in an integer. #define CHR2(x1,x2) (unsigned char)x1 * 256 + (unsigned char)x2 static const char * wx_code_to_txt( const char * strwx ) { int two_chars = CHR2(strwx[0],strwx[1]); switch( two_chars ) { case CHR2('S','H'): return _("Synoptic ship reports"); case CHR2('S','I'): return _("Intermediate synoptic reports"); case CHR2('S','M'): return _("Synoptic observations"); case CHR2('S','N'): return _("Non-standard synoptic hour"); default : return NULL; } } #undef CHR2 HEADTK(TTAAii) { char m_datatype[3]; char m_geographical[3] ; int m_number ; public: /** SH:Synoptic ship reports SI:Intermediate synoptic reports SM:Synoptic observations */ GENTK( TTAAii, "S[HIMN][A-Z0-9]{2}[0-9]{2}" ) bool Parse( const char * str ) { return 3 == sscanf( str, "%2s%2s%2d", m_datatype, m_geographical, &m_number ); } void Print() const { const char * dt_type = wx_code_to_txt(m_datatype); if(dt_type) { Append(_("Data type"), dt_type ); } else { std::stringstream strm ; strm << _("Unknown") << ':' << m_datatype << '.'; Append(_("WX data type"), strm.str() ); } Append(_("Geographical"), m_geographical ); const char * num = NULL ; switch( m_number ) { case 1 ... 19 : num = _("Inclusive for global distribution"); break; case 20 ... 39 : num = _("Inclusive for regional and interregional distribution"); break; case 40 ... 89 : num = _("Inclusive for national and bilaterally agreed distribution"); break; default : num = _("Reserved"); break; } Append(_("Number"), num ); } }; /// ICAO location. Found in document 7910. /// Or here: http://www.wmo.int/pages/prog/www/ois/Operational_Information/VolumeC1/CCCC_en.html /// http://weather.rap.ucar.edu/surface/stations.txt /// ftp://www.wmo.ch/wmo-ddbs/OperationalInfo/VolumeC1/To_WMO/ HEADTK(CCCC) { char m_icao[5]; public: GENTK( CCCC, "[A-Z]{4}" ) /// All these comparisons, because there might be confusion with other four-letters groups. bool Parse( const char * str ) { return 1 == sscanf( str, "%4s", m_icao ) && strcmp( m_icao, "AAXX" ) && strcmp( m_icao, "BBXX" ) && strcmp( m_icao, "OOXX" ) && strcmp( m_icao, "ZCZC" ) && strcmp( m_icao, "NNNN" ); } /// TODO: Lookup in wmo file. void Print() const { Append( _("ICAO indicator"), m_icao ); } }; static std::string hour_min( int hour, int min ) { char buf[10]; snprintf( buf, sizeof(buf), "%02d:%02d", hour, min ); return buf ; } HEADTK(YYGGgg) { /// Default date is today. time_t m_time; public: GENTK( YYGGgg, "[0-3][0-9][0-2][0-9][0-5][0-9]" ) bool Parse( const char * str ) { int day_of_month ; int UTC_observation_hour ; int UTC_observation_minute ; bool time_ok = ( 3 == sscanf( str, "%02d%02d%02d", &day_of_month, &UTC_observation_hour, &UTC_observation_minute ) ); time_ok = time_ok && ( day_of_month <= 31 ) && ( UTC_observation_hour <= 24 ) && ( UTC_observation_minute <= 59 ); if( ! time_ok ) return false ; m_time = DayHourMin2Tm( day_of_month, UTC_observation_hour, UTC_observation_minute ); return true ; } void Print() const { Append( _("UTC observation time"), Tm2SynopTime( m_time ) ); } /// Does not display anything because all the information is in the UTC time stamp. void DrawKml() const {} time_t ObservationTimeUTC() const { return m_time ; } }; /** BBB Forms The four forms of the BBB indicator group are: * RRx - Delayed (Retard) * CCx - Correction * AAx - Amendment * Pxx - Segment number * */ HEADTK(Numbered) { const char * m_format ; char m_number[3]; public: CLASSTK(Numbered)( const char * fmt ) : m_format(fmt) {}; void Print() const { Append( _("Segment number"), m_number ); } bool Parse( const char * str ) { return 1 == sscanf( str, m_format, m_number ); } const char * Number() const { return m_number ; } }; HEADTK(RRx), virtual CLASSTK(Numbered) { public: /** http://www.wmo.int/pages/prog/www/ois/Operational_Information/Publications/WMO_386/AHLsymbols/bbb_en.html "x=A for the first bulletin after the issuance of the initial bulletin; B, if another bulletin needs to be issued; and so on up to and including x = X; " This seems to be wrong, actually messages up to Y and Z are seen. GENTK( RRx, "RR[A-X]" ) */ GENTK( RRx, "RR[A-Z]" ) CLASSTK(RRx)() : CLASSTK(Numbered)( "RR%1s" ) {} }; HEADTK(CCx), virtual CLASSTK(Numbered) { public: GENTK( CCx, "CC[A-X]" ) CLASSTK(CCx)() : CLASSTK(Numbered)( "CC%1s" ) {} }; HEADTK(AAx), virtual CLASSTK(Numbered) { public: GENTK( AAx, "AA[A-X]" ) CLASSTK(AAx)() : CLASSTK(Numbered)( "AA%1s" ) {} }; /// Pxx is the segmentation BBB group as defined in the WMO document Guidelines For The Use Of The Indicator BBB HEADTK(Pxx), virtual CLASSTK(Numbered) { public: /// Details here: http://www.nws.noaa.gov/tg/bbb.php GENTK( Pxx, "P[A-Z]{2}" ) CLASSTK(Pxx)() : CLASSTK(Numbered)( "P%2s" ) {} }; /// ISMCS WMO STATION NUMBER LIST /// http://www.ncdc.noaa.gov/oa/climate/rcsg/cdrom/ismcs/alphanum.html /// http://www.weather.unisys.com/wxp/Appendices /// http://weather.unisys.com/wxp/Appendices/Formats/SYNOP.html /// 000 Group - Identification and Location /// /// IIiii The WMO number of the station. HEADTK(IIiii) { int m_wmo_indicator ; int m_region_number ; const char * m_region_name ; public: GENTK( IIiii, "[0-9]{5}" ) // GENTK( IIiii, "[0-9]{5}", MIN_PRIO ) /** The IIiii Structure The II or block number is allocated to the services within each Region by regional agreement. Station numbers iii corresponding to a common block number (II) except 89 are usually distributed so that the zone covered by a block number is divided into horizontal strips; e.g. one of several degrees of latitude. Where possible, station numbers within each strip increase from west to east and the first figure of the 3-figure station number increases from north to south. Station index numbers for station in the Antarctic are allocated by the Secretary-General in accordance with the following scheme: Each station has an international number 89xxy, where xx indicated the nearest 10 degree meridian which is numerically lower than the station longitude. For east longitudes, 50 is added; e.g. 89124 indicated a station between 120 degrees and 130 degrees west and 89654 indicates a station between longitudes 150 degrees and 160 degrees east. The figure "y" is allocated roughly according to the latitude of the station with "y" increasing towards the south. For station for which an international numbers are no longer available within the above scheme, the algorithm will be expanded by adding 20 to xx for west longitudes (range of index numbers 200-380) and 70 for east longitudes (range of index numbers 700-880) to provide new index numbers. Antarctic station which held numbers before the introduction of this scheme in 1957 retain their previously allocated index numbers. */ bool Parse( const char * str ) { // std::cout << "wmo=" << str << "\n"; /* Station index numbers consisting of one figure repeated five times, e.g. 55555, 77777, etc., or ending with 0000 or 9999, or duplicating special code indicators, e.g. 10001, 77744, 19191, 89998, etc., are not assigned to meteorological stations. We might check if the code exists or not. */ if( 1 != sscanf( str, "%d", &m_wmo_indicator ) ) return false ; m_region_name = ""; m_region_number = 0 ; // http://weather.noaa.gov/tg/site.shtml switch(m_wmo_indicator) { case 00000: case 11111: case 22222: case 33333: case 44444: case 55555: case 66666: case 77777: case 88888: case 99999: m_region_name = _("Unassigned"); return false ; default : break ; } /// More special codes. switch(m_wmo_indicator%10000) { case 0000: case 9999: return false ; default : break ; } switch(m_wmo_indicator) { case 60000 ... 69999: m_region_name = _("Africa"); m_region_number = 1 ; break; case 20000 ... 20099: case 20200 ... 21999: case 23000 ... 25999: case 28000 ... 32999: case 35000 ... 36999: case 38000 ... 39999: case 40350 ... 48599: case 48800 ... 49999: case 50000 ... 59999: m_region_name = _("Asia"); m_region_number = 2 ; break; case 80000 ... 88999: m_region_name = _("South America"); m_region_number = 3 ; break; case 70000 ... 79999: m_region_name = _("North and Central America"); m_region_number = 4 ; break; case 48600 ... 48799: case 90000 ... 98999: m_region_name = _("South-West Pacific"); m_region_number = 5 ; break; case 00000 ... 19999: case 20100 ... 20199: case 22000 ... 22999: case 26000 ... 27999: case 33000 ... 34999: case 37000 ... 37999: case 40000 ... 40349: m_region_name = _("Europe"); m_region_number = 6 ; break; case 89000 ... 89999: m_region_name = _("Antarctic"); m_region_number = 9 ; break; } /* NOT SURE THIS IS REALLY USEFUL <<<<<<<<<<<================== */ // std::cout << "region=" << m_region_name << "\n"; return true ; } /// Huge list: http://www.ncdc.noaa.gov/oa/climate/rcsg/cdrom/ismcs/alphanum.html int WmoIndicator(void) const { return m_wmo_indicator; } /// Official file: http://weather.noaa.gov/data/nsd_bbsss.txt void Print() const { std::stringstream strm ; strm << std::setfill('0') << std::setw(5) << m_wmo_indicator ; std::string wmo_str = strm.str(); Append( _("WMO Station"), wmo_str ); const RecordWmoStation * ptrWmo = CatalogWmoStations::FindFromKey( m_wmo_indicator ); if( ptrWmo ) Append( _("WMO station"), *ptrWmo ); else { Append( _("WMO station"), "WMO_" + wmo_str ); } } void DrawKml() const {} }; HEADTK(AAXX) { public: GENTK( AAXX, "AAXX" ) bool Parse( const char * str ) { return 0 == strcmp( str, "AAXX" ); } void Print() const { Section( _("Land station observation") ); } }; /// SHIP report. HEADTK(BBXX) { public: GENTK( BBXX, "BBXX" ) bool Parse( const char * str ) { return 0 == strcmp( str, "BBXX" ); } void Print() const { Section( _("Ship observation") ); } }; /// SYNOP MOBILE. HEADTK(OOXX) { public: GENTK( OOXX, "OOXX" ) bool Parse( const char * str ) { return 0 == strcmp( str, "OOXX" ); } void Print() const { Section( _("Mobile observation") ); } }; /// http://metaf2xml.sourceforge.net/parser.pm.html#trends HEADTK(MMMULaULo) { /// See decoding here: http://icoads.noaa.gov/Release_1/suppG.html int m_Marsden_square ; double m_latitude; double m_longitude; public: /// Lower priority because it should not be selected against any other chain beginning. GENTK_PRIORITY( MMMULaULo, "[0-9/]{5}", 0.5 ) /// TODO: Marsden square was not tested enough. bool Parse( const char * str ) { m_Marsden_square = -1; m_latitude = 0.0 ; m_longitude = 0.0 ; if( 0 == strncmp( str, "/////", 5 ) ) return true ; // Only slashes or no slash at all. if ( NULL != strchr( str, '/' ) ) return false ; char char_lat ; char char_lon ; if ( 3 != sscanf( str, "%3d%c%c", &m_Marsden_square, &char_lat, &char_lon ) ) return false; m_latitude = 90.0 - ( m_Marsden_square / 36.0 ) ; m_longitude = ( m_Marsden_square % 36 ) - 30.0 ; m_latitude += char_lat - '0' ; m_longitude += char_lon - '0' ; /// East longitude is positive, West is negative. return true; } void Print() const { /// Very approximate. if( m_Marsden_square > 0 ) { Append( _("Marsden latitude"), m_latitude ); Append( _("Marsden longitude"), m_longitude ); } else { Append( _("Coordinates"), _("Marsden square not defined") ); } } bool MarsdenValid(void) const { return m_Marsden_square >= 0; } double Latitude(void) const { assert( MarsdenValid() ); return m_latitude; } double Longitude(void) const { assert( MarsdenValid() ); return m_longitude; } bool CanComeFirst(void) const { return false ; } }; /// Position of the station (Marsden square, height) /// http://metaf2xml.sourceforge.net/parser.pm.html#trends /// h0h0h0h0im elevation of mobile land station, units of elevation, and elevation accuracy /// h0hoh0h0 elevation if meters or feet as indicated by im /// im indicator for units of elevation and confidence factor of accuracy HEADTK(h0h0h0h0im) { /// See decoding here: http://icoads.noaa.gov/Release_1/suppG.html int m_height ; char m_indicator ; public: GENTK( h0h0h0h0im, "[0-9/]{4}[1-8]" ) bool Parse( const char * str ) { m_height = 0; m_indicator = '0'; return ( 2 == sscanf( str, "%4d%c", &m_height, &m_indicator ) ); } void Print() const { const char * unit = ""; switch(m_indicator) { case '1' ... '4' : unit = Unit_meters; break; case '5' ... '8' : unit = Unit_feet; break; default: ; } Append( _("Height"), m_height, unit ); const char * indicators[] = { _("Not Used"), _("Excellent (within 3 meters)"), _("Good (within 10 meters)"), _("Fair (within 20 meters)"), _("Poor (more than 20 meters)"), _("Excellent (within 10 feet)"), _("Good (within 30 feet)"), _("Fair (within 60 feet)"), _("Poor (more than 60 feet)") }; disp_arr(indicators,G_N_ELEMENTS(indicators),m_indicator,'0',_("Precision")); } /// It is dependent on the previous token, MMMUL. bool CanComeFirst(void) const { return false ; } }; /// NIL HEADTK(NIL) { public: GENTK( NIL, "NIL[;=]?" ) bool Parse( const char * str ) { return 0 == strncmp( str, "NIL", 3 ); } void Print() const { Append( _("Token"), _("End of section") ); } void DrawKml() const {} }; /// Ship or Buoy Observations: IIIII The ship or buoy identifier HEADTK(IIIII) { static const size_t maxsz = 20 ; char m_ship_buoy_identifier[maxsz] ; public: GENTK( IIIII, "[A-Z0-9]{3,9}" ) /// We filter some identifiers. bool Parse( const char * str ) { // If this is a five-digits string, it cannot reasonably be an identifier. if( ( 5 == strlen( str ) ) && ( 5 == strspn( str, "0123456789" ) ) ) { return false ; } /// Due to parsing error, we might take the next group header (333 or 555) as a ship name. bool resu = ( 1 == sscanf( str, "%9s", m_ship_buoy_identifier ) ) && ( strcmp( m_ship_buoy_identifier, "333" ) ) && ( strcmp( m_ship_buoy_identifier, "555" ) ); if( resu ) { // Some ships are apparently anonymous, we give them an unique name. if( 0 == strcmp( "SHIP", m_ship_buoy_identifier ) ) { static int ship_counter = 0 ; ++ship_counter ; snprintf( m_ship_buoy_identifier, sizeof(m_ship_buoy_identifier), "SHIP_%d", ship_counter ); } } else { m_ship_buoy_identifier[0] = '\0'; } return resu; } void Print() const { Append( _("Ship/Buoy identifier"), m_ship_buoy_identifier ); } void DrawKml() const {} /// Information about buoys: /// http://www.ndbc.noaa.gov/marine_notice.shtml /// http://www.ndbc.noaa.gov/stndesc.shtml /// http://www.hpc.ncep.noaa.gov/html/stationplot_buoy.shtml const char * ShipIdentifier(void) const { return m_ship_buoy_identifier; } }; /// ff -- wind speed in units determined by wind type indicator (see above) static const choice< char > wind_speed_units[] = { { '0',_("m/s (Estimated)") }, { '1',_("m/s (Anemometer)") }, { '3',_("knots (Estimated)") }, { '4',_("knots (Anemometer)") } }; FM12CodeTable( wind_speed_units, 1855, _("Indicator for source and units of wind speed") ); /// Apparently one can also find YYGGggi: /// YY -- Monatstag (UTC) /// GG -- Beobachtungszeit (UTC) in vollen Stunden /// gg -- Beobachtungszeit in Minuten (wird nur bei Halbstundenterminen benutzt: gg = 30) /// iw -- Indikator für Windangaben: /// YYGGi /// YY -- The day of the month /// GG -- The hour of the observation (UTC) /// iw -- Wind type indicator /// For more safety, we could search today's date only, but testing is more difficult. HEADTK(YYGGi) { time_t m_time; char m_wind_type_indicator ; public: GENTK( YYGGi, "[0-3][0-9][0-2][0-9][0134]" ) bool Parse( const char * str ) { int day_of_month; int UTC_observation_hour; if ( 3 != sscanf( str, "%02d%02d%c", &day_of_month, &UTC_observation_hour, &m_wind_type_indicator ) ) return false ; if ( ( day_of_month > 31 ) || ( day_of_month < 1 ) || ( UTC_observation_hour > 24 ) || ( NULL == strchr( "0134", m_wind_type_indicator ) ) ) return false; // std::cout << __FUNCTION__ << ":" << UTC_observation_hour << " " << day_of_month << "\n"; m_time = DayHourMin2Tm( day_of_month, UTC_observation_hour, 0 ); return true; } void Print() const { Append( _("UTC observation time"), Tm2SynopTime( m_time ) ); // No need to display it twice because it will appear after the speed value. if( tstDisp ) { Append( _("Wind type indicator"), choice_map( wind_speed_units, G_N_ELEMENTS( wind_speed_units ), m_wind_type_indicator, _("Unknown speed unit type") ) ); } } /// Does not display anything because all the information is displayed later. void DrawKml() const {} time_t ObservationTimeUTC() const { return m_time ; } friend class CLASSTK(Nddff); }; /// 99LLL QLLLL /// LLL -- Latitude of observation to .1 degrees /// Q -- Quadrant of observation HEADTK(99LLL) { int m_latit_10deg ; public: GENTK( 99LLL, "99[0-9]{3}" ) bool Parse( const char * str ) { // The latitude starts at the third char, after "99". if ( 1 != sscanf( str + 2, "%d", &m_latit_10deg ) ) return false; // Latitudes are between 0 and 90 degrees. return ( m_latit_10deg <= 900 ); } void Print() const { Append( _("QLLLL token"), _("Present") ); } /// Does not display anything because all the information is displayed later as coordinates. void DrawKml() const {} /// It is dependent on the previous token. bool CanComeFirst(void) const { return false ; } friend class CLASSTK(QLLLL); }; /// LLLL -- Longitude of observation to .1 degrees HEADTK(QLLLL) { char m_quadrant ; int m_longit_10deg ; mutable bool m_calc_done ; mutable bool m_coordinates_ok ; mutable double m_Longitude ; mutable double m_Latitude ; /// Can be called only once this token is inserted in a group. void Calc(void) const { if( m_calc_done ) return ; m_calc_done = true ; const CLASSTK(99LLL) * ptr_99LLL = TokenProxy::get_ptr< CLASSTK(99LLL) >(false); if( ptr_99LLL ) { m_Longitude = 0.0; m_Latitude = 0.0; m_coordinates_ok = false ; } double lat = ptr_99LLL ? (double)ptr_99LLL->m_latit_10deg * 0.1 : 0.0 ; double lon = (double)m_longit_10deg * 0.1 ; m_coordinates_ok = true ; // East longitude and north latitude are positive. switch( m_quadrant ) { case '1': break ; // North-East case '3': lat = -lat; break ; // South-East case '5': lon = -lon; lat = -lat; break ; // South-West case '7': lon = -lon; break ; // North-West default : m_coordinates_ok = false; break; } m_Longitude = lon; m_Latitude = lat; } public: CLASSTK(QLLLL) () : m_calc_done(false), m_coordinates_ok(false) {} GENTK( QLLLL, "[1357][0-9]{4}" ) bool Parse( const char * str ) { // Check that longitude is smaller than 180 in tenth of degrees. return ( 2 == sscanf( str, "%c%d", &m_quadrant, &m_longit_10deg ) ) && ( m_longit_10deg <= 1800 ); } void Print() const { Calc(); if(m_coordinates_ok) { Append( _("Longitude"), m_Longitude ); Append( _("Latitude"), m_Latitude ); } else { Append( _("Coordinates"), _("Wrong coordinates format") ); } } /// Does not display anything because all the information is displayed as coordinates. void DrawKml() const {} bool CanComeFirst(void) const { return false ; } const bool CoordinatesOK() const { return m_coordinates_ok; } double Longitude() const { Calc(); assert( m_coordinates_ok ); return m_Longitude; } double Latitude () const { Calc(); assert( m_coordinates_ok ); return m_Latitude ; } }; static const char * cloud_bases[]= { _("0 to 50 m"), _("50 to 100 m"), _("100 to 200 m"), _("200 to 300 m"), _("300 to 600 m"), _("600 to 1000 m"), _("1000 to 1500 m"), _("1500 to 2000 m"), _("2000 to 2500 m"), _("above 2500 m"), _("unknown") }; FM12CodeTable( cloud_bases, 1600, _("Height above surface of the base of the lowest cloud seen") ); /// 111 Group - Land Observations /// Apparently there are differences between FM12 and FM13X which is more recent. /// iihVV HEADTK(iihVV) { char m_precipitation ; char m_station_type ; char m_cloud_base ; int m_visibility ; public: GENTK( iihVV, "[0-4][1-7][0-9/][0-9/]{2}" ) bool Parse( const char * str ) { // TODO; Frequently mismatched with "222//" . Should add a special case. int nbMtch = sscanf( str, "%c%c%c%d", &m_precipitation, &m_station_type, &m_cloud_base, &m_visibility ); // "46///" is a valid string. // std::cout << __FUNCTION__ << ":" << str << " " << nbMtch << "\n"; switch(nbMtch) { case 4 : return true ; case 3 : m_visibility = -1; // i.e. "missing" return 0 == strcmp( str + 3, "//" ); default: return false ; } } bool isAutomated(void) const { switch( m_station_type ) { default : return false ; case '4': case '5': case '6': case '7': return true; } } void Print() const { /// iR -- Precipitation indicator static const char * precipitations[] = { _("In groups 1 and 3"), _("In group 1 only"), _("In group 3 only"), _("Omitted, no precipitation"), _("Omitted, no observation") }; FM12CodeTable( precipitations, 1819, _("Indicator for inclusion or mossion of precipitation data") ); disp_arr(precipitations,G_N_ELEMENTS(precipitations),m_precipitation,'0',_("Precipitations")); /// ix -- Station type and present and past weather indicator. Tells if the group 7WW is included. static const char * station_types[] = { _("Manned station (With 7WW)"), _("Manned station. Not significant (No 7WW)"), _("Manned station. No observation (No 7WW)"), _("Automated station (With 7WW)"), _("Automated station. Not significant (No 7WW)"), _("Automated station. No observation (No 7WW)"), _("Automated station (With 7WW)") }; FM12CodeTable( stations_types, 1860, _("Indicator for type of station operation and for present and past weather data") ); disp_arr(station_types,G_N_ELEMENTS(station_types),m_station_type,'1',_("Station type")); /// h -- Cloud base of lowest cloud seen (meters above ground) disp_arr(cloud_bases,G_N_ELEMENTS(cloud_bases),m_cloud_base,'0',_("Cloud base")); /// VV -- Visibility const char *vis = _("Visibility"); switch( m_visibility ) { case 0 : Append( vis, _("Less than 0.1"), Unit_km ); break ; case 1 ...50 : Append( vis, m_visibility / 10, Unit_km ); break ; case 51 ...79 : Append( vis, m_visibility - 50, Unit_km ); break ; case 80 ...88 : Append( vis, 30 + 5 * ( m_visibility - 80 ), Unit_km ); break ; case 89 : Append( vis, _("Greater than 70"), Unit_km ); break; case 90 : Append( vis, _("Less than 0.05"), Unit_km ); break; case 91 : Append( vis, 0.05, Unit_km ); break; case 92 : Append( vis, 0.2, Unit_km ); break; case 93 : Append( vis, 0.5, Unit_km ); break; case 94 : Append( vis, 1, Unit_km ); break; case 95 : Append( vis, 2, Unit_km ); break; case 96 : Append( vis, 4, Unit_km ); break; case 97 : Append( vis, 10, Unit_km ); break; case 98 : Append( vis, 20, Unit_km ); break; case 99 : Append( vis, _("Greater than 50"), Unit_km ); break; default : Append( vis, _("Missing") ); break; } } }; /// TODO: Use these graphic symbols: http://www.hpc.ncep.noaa.gov/html/stationplot_buoy.shtml static const char * cloud_covers[]= { _("0 eighths (clear)"), _("1/8"), _("2/8"), _("3/8"), _("4/8"), _("5/8"), _("6/8"), _("7/8"), _("8/8 (overcast)"), _("Sky obscured"), _("No observation") }; FM12CodeTable( cloud_covers, 2700, _("Amount of cloud cover") ); /// Nddff HEADTK(Nddff) { char m_cloud_cover ; /// In ten of degrees. int m_wind_direction ; int m_wind_speed ; public: GENTK( Nddff, "[0-9/][0-9/]{2}[0-9/]{2}" ) bool Parse( const char * str ) { m_cloud_cover = '/'; m_wind_direction = 0; m_wind_speed = 0 ; // Can be "/////" or "8////" plus trailing characters. if ( 0 == strncmp( str + 1, "////", 4) ) return true ; return ( 3 == sscanf( str, "%c%2d%2d", &m_cloud_cover, &m_wind_direction, &m_wind_speed ) ) && ( ( m_wind_direction <= 36 ) || ( m_wind_direction == 99 ) ); } void Print() const { // N -- Total cloud cover disp_arr(cloud_covers,G_N_ELEMENTS(cloud_covers),m_cloud_cover,'0',_("Cloud cover")); // dd -- wind direction in 10s of degrees if( m_wind_direction == 99 ) Append( _("Wind direction"), _("Variable, all directions, confused, indeterminate direction") ); else if( m_wind_direction == 0 ) Append( _("Wind direction"), _("No motion or no waves") ); else Append( _("Wind direction"), m_wind_direction * 10 - 5 , Unit_degrees ); FM12CodeTable( xxx, 0877, _("True direction in tenth of degrees") ); // We search for this token not only in this section but in the previous ones. const CLASSTK(YYGGi) * ptr_YYGGi = TokenProxy::get_ptr< CLASSTK(YYGGi) >(true); const char * wind_speed_title = _("Wind speed"); if( ptr_YYGGi ) { Append( wind_speed_title, m_wind_speed, choice_map( wind_speed_units, G_N_ELEMENTS( wind_speed_units ), ptr_YYGGi->m_wind_type_indicator, _("Unknown speed unit type") ) ); } else { Append( wind_speed_title, m_wind_speed, _("No unit (YYGGi missing)") ); } } bool CanComeFirst(void) const { return false ; } }; /// 00fff (optional) HEADTK(00fff) { int m_wind_speed ; public: /// Lower priority than Nddff GENTK_PRIORITY( 00fff, "00[0-9]{3}", 0.5 ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "00%3d", &m_wind_speed ) ); } void Print() const { // fff -- wind speed if value greater than 100 Append( _("Wind speed"), m_wind_speed ); } }; /// Returns true if this temperature makes sense. static bool CheckCelsius( char sign, int temperature_tenth ) { switch( sign ) { case '1' : return temperature_tenth < 700 ; case '0' : return temperature_tenth < 600 ; case '/' : return true ; default : return false ; } } /// Prints the temperature or relative humidity. static void AppCelsius( const TokenProxy * ptrTok, const char * title, char sign, int temperature_tenth ) { if( title == NULL ) title = "No title"; switch( sign ) { case '1' : temperature_tenth = -temperature_tenth ; case '0' : ptrTok->Append( title, temperature_tenth * 0.10, Unit_Celsius ); break; case '9' : ptrTok->Append( _("Relative humidity"), (double)temperature_tenth * 0.10 , "%" ); break; case '/' : ptrTok->Append( title, _("Undefined") ); break; default : ptrTok->Append( title, _("Unexpected case") ); break; } } /// 1sTTT_air -- Temperature HEADTK(1sTTT_air) { char m_temperature_sign ; int m_temperature ; public: GENTK( 1sTTT_air, "1[01/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature_sign = '/'; m_temperature = 0; if( 0 == strncmp( str, "1////", 5 ) ) return true ; return ( 2 == sscanf( str, "1%c%3d", &m_temperature_sign, &m_temperature) ) && ( strchr( "01", m_temperature_sign ) != NULL ) && CheckCelsius( m_temperature_sign, m_temperature ); } /// s: sign of temperature (0=positive, 1=negative). TTT: Temperature in .1 C void Print() const { AppCelsius( this, _("Temperature"), m_temperature_sign, m_temperature ); } }; /// 2sTTT_dew -- Dewpoint HEADTK(2sTTT_dew) { char m_temperature_sign ; int m_temperature ; public: GENTK( 2sTTT_dew, "2[019/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature = 0; int nbMtch = sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature); switch( nbMtch) { case 0 : return false; case 1 : return 0 == strcmp( str + 1, "////" ); // Temperature check does not apply if humidity. case 2 : return ( m_temperature_sign == '9' ) || CheckCelsius( m_temperature_sign, m_temperature ); default: return false; } } /// TTT -- Dewpoint temperature in .1 C (if sign is 9, TTT is relative humidity) void Print() const { // s -- sign of temperature (0=positive, 1=negative, 9 = Relative humidity) AppCelsius( this, _("Dewpoint temperature"), m_temperature_sign, m_temperature ); } }; /// Station pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) static void thousands_omitted( const TokenProxy * ptrTok, const char * pressure, const char * title ) { char buf[7]; int idx = 0 ; if( pressure[0] == '0' ) buf[idx++] = '1' ; strcpy( buf + idx, pressure ); char *slashpos = strchr( buf, '/' ); if( slashpos != NULL ) *slashpos = '0' ; double tmpPres ; // Checks reasonable values for a pressure. if( ( 1 != sscanf( buf, "%lf", &tmpPres ) ) || ( tmpPres > 12000 ) || ( tmpPres < 7000 ) ) { ptrTok->Append( title, _("Inconsistent:") + std::string(pressure) ); } else { ptrTok->Append( title, (int)( tmpPres / 10.0 ), Unit_hPa ); } }; /// 3PPPP -- Station pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) HEADTK(3PPPP) { char m_station_pressure[5]; public: GENTK( 3PPPP, "3[0789/][0-9/]{3}" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "3%s", m_station_pressure ) ); } void Print() const { thousands_omitted( this, m_station_pressure, _("Station pressure") ); } }; /** 4PPPP -- Sea level pressure in 0.1 mb (thousandths digit omitted, last digit can be slash, then pressure in full mb) Can be as well 4ahhh http://metaf2xml.sourceforge.net/parser.pm.html : a3 Isobaric surface (CT 0264), hhh Geopotential of isobaric surface */ HEADTK(4PPPP) { bool m_4PPPP ; char m_sea_level_pressure[5]; char m_isobaric_surface ; int m_geopotential ; public: GENTK( 4PPPP, "4[0912378/][0-9/]{3}" ) bool Parse( const char * str ) { m_4PPPP = false; m_sea_level_pressure[0] = '\0'; m_isobaric_surface = '/'; m_geopotential = -1; switch( str[1] ) { case '0': case '9': m_4PPPP = true ; return ( 1 == sscanf( str, "4%s", m_sea_level_pressure ) ); case '1': case '2': case '3': case '7': case '8': m_4PPPP = false ; return ( 2 == sscanf( str, "4%c%3d", &m_isobaric_surface, &m_geopotential ) ); case '/': m_4PPPP = true ; return ( 0 == strcmp( str, "4////" ) ); default : return false ; } } void Print() const { if(m_4PPPP) { thousands_omitted( this, m_sea_level_pressure, _("Sea level pressure") ); } else { int iso_surf = 0 ; switch( m_isobaric_surface ) { case '1': iso_surf = 1000; break; // 100 meters. case '2': iso_surf = 925; break; // 800 meters. case '3': iso_surf = 500; break; // 5000 meters case '7': iso_surf = 700; break; // 3000 meters case '8': iso_surf = 850; break; // 1500 meters. default : break ; } FM12CodeTable( xxx, 0264, _("Standard Isobaric surface for which the geopotential is reported") ); Append( _("Isobaric surface"), iso_surf, Unit_hPa ); } } }; /// 4ahhh -- Geopotential of nearest mandatory pressure level HEADTK(4ahhh) { char m_mandatory_pressure_level ; char m_geopotential_height[4] ; public: GENTK( 4ahhh, "4[12579][0-9]{3}" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "4%c%s", &m_mandatory_pressure_level, m_geopotential_height ) ); } void Print() const { /// a3 -- mandatory pressure level static const choice< char > mandatory_pressure_levels[] = { { '1', "1000" }, { '2', "925" }, { '5', "500" }, { '7', "700" }, { '8', "850" } }; Append( _("Mandatory pressure level"), choice_map( mandatory_pressure_levels, G_N_ELEMENTS( mandatory_pressure_levels ), m_mandatory_pressure_level, _("Unknown mandatory pressure level") ), _("millibar") ); /// hhh -- geopotential height omitting thousandths digit thousands_omitted( this, m_geopotential_height, _("Geopotential height") ); } }; /// 5appp -- Pressure tendency over 3 hours HEADTK(5appp) { char m_pressure_tendency ; int m_pressure_change ; public: GENTK( 5appp, "5[0-8/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { // std::cout << "str=" << str << "\n"; int nbMtch = sscanf( str, "5%c%d", &m_pressure_tendency, &m_pressure_change ); switch( nbMtch ) { case 0 : return false; case 1 : return 0 == strcmp( str, "5////"); case 2 : return true; default: return false; } } /// Symbols associated to each value: http://www.hpc.ncep.noaa.gov/html/stationplot_buoy.shtml void Print() const { /// a -- characteristics of pressure tendency static const char * pressure_tendencies[] = { _("Increasing, then decreasing. Same or higher"), _("Increasing, then steady. Raises"), _("Increasing steadily. Raises"), _("Decreasing or steady, then increasing. Raises"), _("Steady. Resultant same"), _("Decreasing, then increasing. Lowers"), _("Decreasing, then steady. Lowers"), _("Decreasing steadily. Lowers"), _("Increasing or steady, then decreasing. Lowers") }; FM12CodeTable( pressure_tendencies, 0200, _("Characteristics of pressure tendency during three last hours") ); disp_arr(pressure_tendencies,G_N_ELEMENTS(pressure_tendencies),m_pressure_tendency,'0',_("Pressure tendency")); /// ppp -- 3 hour pressure change in 0.1 mb if( m_pressure_tendency == '/' ) { Append( _("Pressure change"), _("Not specified") ); } else { Append( _("Pressure change"), m_pressure_change / 10.0, Unit_hPa ); } } }; static void display_precipitation( const TokenProxy * ptrTok, char precipitation_duration ) { int nb_hours ; /// This could be replaced by a table like the other codes tables. switch( precipitation_duration ) { case '1': nb_hours = 6; break; case '2': nb_hours = 12; break; case '3': nb_hours = 18; break; case '4': nb_hours = 24; break; case '5': nb_hours = 1; break; case '6': nb_hours = 2; break; case '7': nb_hours = 3; break; case '8': nb_hours = 9; break; case '9': nb_hours = 15; break; case '/': nb_hours = 24; break; default : nb_hours = -1; break; } FM12CodeTable( xxx, 4019, _("Duration of period of precipitation") ); if( nb_hours < 0 ) ptrTok->Append( _("Precipitation duration"), _("Undetermined") ); else ptrTok->Append( _("Precipitation duration"), nb_hours, Unit_hours ); } /// 6RRRt -- Liquid precipitation HEADTK(6RRRt) { int m_precipitation_amount ; char m_precipitation_duration ; public: GENTK( 6RRRt, "6[0-9/]{3}[0-9/][;=]?" ) bool Parse( const char * str ) { m_precipitation_amount = -1 ; m_precipitation_duration = '0' ; return ( 2 == sscanf( str, "6%3d%c", &m_precipitation_amount, &m_precipitation_duration ) ) || ( 1 == sscanf( str, "6///%c", &m_precipitation_duration ) ) || ( 0 == strncmp( str, "60000", 5 ) ); } void Print() const { /// RRR -- Precipitation amount in mm const char * precip = _("Precipitation amount"); switch( m_precipitation_amount ) { case 0 ... 988 : Append( precip, m_precipitation_amount, Unit_mm );break; case 989 : Append( precip, _("989 mm or more") );break; case 990 : Append( precip, _("Traces") );break; case 991 ... 999 : Append( precip, ( m_precipitation_amount - 990 ) / 10.0, Unit_mm );break; default : Append( precip, m_precipitation_amount, _("Inconsistent") ); break; } FM12CodeTable( xxx, 3590, _("Amount of precipitation") ); /// t -- Duration over which precipitation amount measured display_precipitation( this, m_precipitation_duration ); } }; /// 7wwWW -- Present and past weather HEADTK(7wwWW) { int m_present_weather ; char m_past_weather_1 ; char m_past_weather_2 ; mutable bool m_calc_done ; mutable bool m_automated ; /// Can be called only once this token is inserted in a group. void Calc(void) const { if( m_calc_done ) return ; m_calc_done = true ; const CLASSTK(iihVV) * ptr_iihVV = TokenProxy::get_ptr< CLASSTK(iihVV) >(false); if( ptr_iihVV ) { m_automated = ptr_iihVV->isAutomated(); } else m_automated = false ; } void PrintPastWeather( char weather, const char * title ) const { static const char * past_weathers_manned[] = { _("Cloud covering less than half of sky"), _("Cloud covering more than half of sky during part of period and more than half during part of period"), _("Cloud covering more than half of sky"), _("Sandstorm, duststorm or blowing snow"), _("Fog, or thick haze"), _("Drizzle"), _("Rain"), _("Snow or mixed rain and snow"), _("Showers"), _("Thunderstorms") }; FM12CodeTable( past_weathers_manned, 4561, _("Past weather reported from a manned weather station") ); static const char * past_weathers_automated[] = { _("No significant weather"), _("Visibility reduced"), _("Blowing phenomena, visibility reduced"), _("Fog"), _("Precipitation"), _("Drizzle"), _("Rain"), _("Snow, or Ice pellets"), _("Showers or intermittent precipitation"), _("Thunderstorm") }; FM12CodeTable( past_weathers_automated, 4532, _("Past weather reported from an automated weather station") ); // http://fr.scribd.com/doc/86346935/Land-Synoptic-Code // http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf "Land Synoptic Code" if( m_automated ) { disp_arr(past_weathers_automated,G_N_ELEMENTS(past_weathers_automated),weather,'0',title); } else { disp_arr(past_weathers_manned,G_N_ELEMENTS(past_weathers_manned),weather,'0',title); } } public: CLASSTK(7wwWW) () : m_calc_done(false), m_automated(false) {} GENTK( 7wwWW, "7[0-9/]{2}[0-9/][0-9/]" ) bool Parse( const char * str ) { m_present_weather = '/' ; m_past_weather_1 = m_past_weather_2 = '/'; return ( 0 == strcmp( "7////", str ) ) || ( 2 == sscanf( str, "7//%c%c", &m_past_weather_1, &m_past_weather_2 ) ) || ( 3 == sscanf( str, "7%2d%c%c", &m_present_weather, &m_past_weather_1, &m_past_weather_2 ) ); } void Print() const { Calc(); /// ww -- Present weather static const char * present_weathers_manned[] = { _("Clear skies"), _("Clouds dissolving"), _("State of sky unchanged"), _("Clouds developing"), // Haze, smoke, dust or sand _("Visibility reduced by smoke"), _("Haze"), _("Widespread dust in suspension not raised by wind"), _("Dust or sand raised by wind"), _("Well developed dust or sand whirls"), _("Dust or sand storm within sight but not at station"), // Non-precipitation events _("Mist"), _("Patches of shallow fog"), _("Continuous shallow fog"), _("Lightning visible, no thunder heard"), _("Precipitation within sight but not hitting ground"), _("Distant precipitation but not falling at station"), _("Nearby precipitation but not falling at station"), _("Thunderstorm but no precipitation falling at station"), _("Squalls within sight but no precipitation falling at station"), _("Funnel clouds within sight"), // Precipitation within past hour but not at observation time _("Drizzle"), _("Rain"), _("Snow"), _("Rain and snow"), _("Freezing rain"), _("Rain showers"), _("Snow showers"), _("Hail showers"), _("Fog"), _("Thunderstorms"), // Duststorm, sandstorm, drifting or blowing snow _("Slight to moderate duststorm, decreasing in intensity"), _("Slight to moderate duststorm, no change"), _("Slight to moderate duststorm, increasing in intensity"), _("Severe duststorm, decreasing in intensity"), _("Severe duststorm, no change"), _("Severe duststorm, increasing in intensity"), _("Slight to moderate drifting snow, below eye level"), _("Heavy drifting snow, below eye level"), _("Slight to moderate drifting snow, above eye level"), _("Heavy drifting snow, above eye level"), // Fog or ice fog _("Fog at a distance"), _("Patches of fog"), _("Fog, sky visible, thinning"), _("Fog, sky not visible, thinning"), _("Fog, sky visible, no change"), _("Fog, sky not visible, no change"), _("Fog, sky visible, becoming thicker"), _("Fog, sky not visible, becoming thicker"), _("Fog, depositing rime, sky visible"), _("Fog, depositing rime, sky not visible"), // Drizzle _("Intermittent light drizzle"), _("Continuous light drizzle"), _("Intermittent moderate drizzle"), _("Continuous moderate drizzle"), _("Intermittent heavy drizzle"), _("Continuous heavy drizzle"), _("Light freezing drizzle"), _("Moderate to heavy freezing drizzle"), _("Light drizzle and rain"), _("Moderate to heavy drizzle and rain"), // Rain _("Intermittent light rain"), _("Continuous light rain"), _("Intermittent moderate rain"), _("Continuous moderate rain"), _("Intermittent heavy rain"), _("Continuous heavy rain"), _("Light freezing rain"), _("Moderate to heavy freezing rain"), _("Light rain and snow"), _("Moderate to heavy rain and snow"), // Snow _("Intermittent light snow"), _("Continuous light snow"), _("Intermittent moderate snow"), _("Continuous moderate snow"), _("Intermittent heavy snow"), _("Continuous heavy snow"), _("Diamond dust"), _("Snow grains"), _("Snow crystals"), _("Ice pellets"), // Showers _("Light rain showers"), _("Moderate to heavy rain showers"), _("Violent rain showers"), _("Light rain and snow showers"), _("Moderate to heavy rain and snow showers"), _("Light snow showers"), _("Moderate to heavy snow showers"), _("Light snow/ice pellet showers"), _("Moderate to heavy snow/ice pellet showers"), _("Light hail showers"), _("Moderate to heavy hail showers"), // Thunderstorms _("Thunderstorm in past hour, currently only light rain"), _("Thunderstorm in past hour, currently only moderate to heavy rain"), _("Thunderstorm in past hour, currently only light snow or rain/snow mix"), _("Thunderstorm in past hour, currently only moderate to heavy snow or rain/snow mix"), _("Light to moderate thunderstorm"), _("Light to moderate thunderstorm with hail"), _("Heavy thunderstorm"), _("Heavy thunderstorm with duststorm"), _("Heavy thunderstorm with hail") }; FM12CodeTable( present_weathers_manned, 4677, _("Present weather reported from a manned weather station") ); /// http://near-goos1.jodc.go.jp/rdmdb/format/JMA/wawa.html static const char * present_weathers_automated[] = { _("No significant weather observed"), _("Clouds generally dissolving or becoming less developed during the past hour"), _("State of sky on the whole unchanged during the past hour"), _("Clouds generally forming or developing during the past hour"), _("Haze or smoke, or dust in suspension in the air, visibility equal to, or greater than, 1 km"), _("Haze or smoke, or dust in suspension in the air, visibility less than 1 km"), _("Reserved"), _("Reserved"), _("Reserved"), _("Reserved"), _("Mist"), _("Diamond dust"), _("Distant lightning"), _("Reserved"), _("Reserved"), _("Reserved"), _("Reserved"), _("Squalls"), _("Reserved"), // Code figures 20–26 are used to report precipitation, fog (or ice fog) // or thunderstorm at the station during the preceding hour but not at the time of observation. _("Fog"), _("PRECIPITATION"), _("Drizzle (not freezing) or snow grains"), _("Rain (not freezing)"), _("Snow"), _("Freezing drizzle or freezing rain"), _("Thunderstorm (with or without precipitation)"), _("BLOWING OR DRIFTING SNOW OR SAND"), _("Blowing or drifting snow or sand, visibility equal to, or greater than, 1 km"), _("Blowing or drifting snow or sand, visibility less than 1 km"), _("FOG"), _("Fog or ice fog in patches"), _("Fog or ice fog, has become thinner during the past hour"), _("Fog or ice fog, no appreciable change during the past hour"), _("Fog or ice fog, has begun or become thicker during the past hour"), _("Fog, depositing rime"), _("Reserved"), _("Reserved"), _("Reserved"), _("Reserved"), _("PRECIPITATION"), _("Precipitation, slight or moderate"), _("Precipitation, heavy"), _("Liquid precipitation, slight or moderate"), _("Liquid precipitation, heavy"), _("Solid precipitation, slight or moderate"), _("Solid precipitation, heavy"), _("Freezing precipitation, slight or moderate"), _("Freezing precipitation, heavy"), _("Reserved"), _("DRIZZLE"), _("Drizzle, not freezing, slight"), _("Drizzle, not freezing, moderate"), _("Drizzle, not freezing, heavy"), _("Drizzle, freezing, slight"), _("Drizzle, freezing, moderate"), _("Drizzle, freezing, heavy"), _("Drizzle and rain, slight"), _("Drizzle and rain, moderate or heavy"), _("Reserved"), _("RAIN"), _("Rain, not freezing, slight"), _("Rain, not freezing, moderate"), _("Rain, not freezing, heavy"), _("Rain, freezing, slight"), _("Rain, freezing, moderate"), _("Rain, freezing, heavy"), _("Rain (or drizzle) and snow, slight"), _("Rain (or drizzle) and snow, moderate or heavy"), _("Reserved"), _("SNOW"), _("Snow, slight"), _("Snow, moderate"), _("Snow, heavy"), _("Ice pellets, slight"), _("Ice pellets, moderate"), _("Ice pellets, heavy"), _("Snow grains"), _("Ice crystals"), _("Reserved"), _("SHOWER(S) or INTERMITTENT PRECIPITATION"), _("Rain shower(s) or intermittent rain, slight"), _("Rain shower(s) or intermittent rain, moderate"), _("Rain shower(s) or intermittent rain, heavy"), _("Rain shower(s) or intermittent rain, violent"), _("Snow shower(s) or intermittent snow, slight"), _("Snow shower(s) or intermittent snow, moderate"), _("Snow shower(s) or intermittent snow, heavy"), _("Reserved"), _("Hail"), _("THUNDERSTORM"), _("Thunderstorm, slight or moderate, with no precipitation"), _("Thunderstorm, slight or moderate, with rain showers and/or snow showers"), _("Thunderstorm, slight or moderate, with hail"), _("Thunderstorm, heavy, with no precipitation"), _("Thunderstorm, heavy, with rain showers and/or snow showers"), _("Thunderstorm, heavy, with hail"), _("Reserved"), _("Reserved"), _("Tornado") }; FM12CodeTable( present_weathers_automated, 4680, _("Present weather reported from an automated weather station") ); // http://fr.scribd.com/doc/86346935/Land-Synoptic-Code if( m_automated ) { disp_arr(present_weathers_manned, G_N_ELEMENTS(present_weathers_manned), m_present_weather,0,_("Present weather - Manned")); PrintPastWeather( m_past_weather_1, _("Past weather type 1 - Manned")); PrintPastWeather( m_past_weather_2, _("Past weather type 2 - Automated")); } else { disp_arr(present_weathers_automated, G_N_ELEMENTS(present_weathers_automated), m_present_weather,0,_("Present weather - Automated")); PrintPastWeather( m_past_weather_1, _("Past weather type 1 - Automated")); PrintPastWeather( m_past_weather_2, _("Past weather type 2 - Automated")); } } }; /// 8NCCC -- Cloud type information HEADTK(8NCCC) { char m_low_clouds_amount ; char m_low_cloud_type ; char m_mid_cloud_type ; char m_high_cloud_type ; public: GENTK( 8NCCC, "8[0-9/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { return ( 4 == sscanf( str, "8%c%c%c%c", &m_low_clouds_amount, &m_low_cloud_type, &m_mid_cloud_type, &m_high_cloud_type ) ); } void Print() const { /// N -- Amount of low clouds covering sky, if no low clouds, the amount of the middle clouds const char * low_cloud_title = m_low_cloud_type != '0' ? _("Amount of low clouds") : _("Amount of middle clouds"); if( m_low_clouds_amount == '/' ) Append( low_cloud_title, _("Unspecified") ); else Append( low_cloud_title, m_low_clouds_amount - '0' ); /// CL -- Low cloud type static const choice< char > arr_low_clouds[] = { { '0', _("No low clouds") }, { '1', _("Cumulus humulis or fractus (no vertical development)") }, { '2', _("Cumulus mediocris or congestus (moderate vertical development)") }, { '3', _("Cumulonimbus calvus (no outlines nor anvil)") }, { '4', _("Stratocumulus cumulogenitus (formed by spreading of cumulus)") }, { '5', _("Stratocumulus") }, { '6', _("Stratus nebulosus (continuous sheet)") }, { '7', _("Stratus or cumulus fractus (bad weather)") }, { '8', _("Cumulus and stratocumulus (multilevel)") }, { '9', _("Cumulonimbus with anvil") }, { '/', _("Low clouds unobserved due to darkness or obscuration") } }; Append( _("Low clouds type"), choice_map( arr_low_clouds, G_N_ELEMENTS( arr_low_clouds ), m_low_cloud_type, _("unknown low clouds type") ) ); FM12CodeTable( arr_low_clouds, 0513, _("Clouds of the genera stratocumulus, stratus,cumulus, and cumulonimbus") ); /// CM -- Middle cloud type static const choice< char > arr_mid_clouds[] = { { '0', _("No middle clouds") }, { '1', _("Altostratus translucidous (mostly transparent)") }, { '2', _("Altostratus opacus or nimbostratus") }, { '3', _("Altocumulus translucidous (mostly transparent)") }, { '4', _("Patches of altocumulus (irregular, lenticular)") }, { '5', _("Bands of altocumulus") }, { '6', _("Altocumulus cumulogenitus (formed by spreading of cumulus)") }, { '7', _("Altocumulus (multilayers)") }, { '8', _("Altocumulus castellanus (having cumuliform tufts)") }, { '9', _("Altocumulus of a chaotic sky") }, { '/', _("Middle clouds unobserved due to darkness or obscuration ") }, }; Append( _("Middle clouds type"), choice_map( arr_mid_clouds, G_N_ELEMENTS( arr_mid_clouds ), m_mid_cloud_type, _("unknown middle clouds type") ) ); FM12CodeTable( arr_mid_clouds, 0515, _("Clouds of the genera altocumulus,altostratus, and nimbostratus") ); /// CH -- High cloud type static const choice< char > arr_high_clouds[] = { { '0', _("No high clouds") }, { '1', _("Cirrus fibratus (wispy)") }, { '2', _("Cirrus spissatus (dense in patches)") }, { '3', _("Cirrus spissatus cumulogenitus (formed out of anvil)") }, { '4', _("Cirrus unicus or fibratus (progressively invading sky)") }, { '5', _("Bands of cirrus or cirrostratus invading sky (less than 45 degree above horizon)") }, { '6', _("Bands of cirrus or cirrostratus invading sky (more than 45 degree above horizon)") }, { '7', _("Cirrostratus covering whole sky") }, { '8', _("Cirrostratus not covering sky but not invading") }, { '9', _("Cirrocumulus") }, { '/', _("High clouds unobserved due to darkness or obscuration") } }; Append( _("High clouds type"), choice_map( arr_high_clouds, G_N_ELEMENTS( arr_high_clouds ), m_high_cloud_type, _("unknown high clouds type") ) ); FM12CodeTable( arr_mid_clouds, 0509, _("Clouds of the genera cirrus,cirrocumulus, and cirrostratus") ); } }; /// 9GGgg -- Time of observation in hours and minutes HEADTK(9GGgg) { int m_hours; int m_minutes; public: GENTK( 9GGgg, "9[0-2][0-9][0-5][0-9][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "9%2d%2d", &m_hours, &m_minutes ) ); } void Print() const { Append( _("Observation time"), hour_min( m_hours, m_minutes ) ); } }; /// 222 Group - Sea Surface Observations /// /// 222Dv HEADTK(222Dv) { char m_ship_direction; char m_ship_average_speed; public: /// Not only it is selected before similar tokens, but also it can be kept at the end like two tokens together. GENTK_PRIORITY( 222Dv, "222[0-9/][0-9/][;=]?", MIN_PRIO ) // GENTK( 222Dv, "222[0-9/][0-9/][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "222%c%c", &m_ship_direction, &m_ship_average_speed ) ); } void Print() const { /// D -- direction of ship movement const char * ship_directions[] = { _("Calm"), _("North-East"), _("East"), _("South-East"), _("South"), _("South-West"), _("West"), _("North-West"), _("North"), _("Unknown") }; disp_arr(ship_directions,G_N_ELEMENTS(ship_directions),m_ship_direction,'0',_("Ship direction") ); /// * v -- ship's average speed const char * ship_average_speeds[] = { _("0 knots"), _("1 to 5 knots"), _("6 to 10 knots"), _("11 to 15 knots"), _("16 to 20 knots"), _("21 to 25 knots"), _("26 to 30 knots"), _("31 to 35 knots"), _("36 to 40 knots"), _("over 40 knots ") }; disp_arr(ship_average_speeds,G_N_ELEMENTS(ship_average_speeds),m_ship_average_speed,'0',_("Ship average speed") ); } }; /// 0sTTT -- Sea surface temperature HEADTK(0sTTT) { /// s -- sign of temperature (0=positive, 1=negative) char m_temperature_sign ; /// TTT -- Temperature in .1 C int m_temperature ; const char * m_temperature_type ; bool CheckParams() { switch(m_temperature_sign) { case '0': case '1': m_temperature_type = _("Intake measurement"); break; case '2': case '3': m_temperature_type = _("Bucket measurement"); break; case '4': case '5': m_temperature_type = _("Hull contact sensor"); break; case '6': case '7': m_temperature_type = _("Other"); break; default : m_temperature_type = _("Inconsistent"); break ; } switch(m_temperature_sign) { case '1': case '3': case '5': case '7': m_temperature_sign = '1' ; break ; case '0': case '2': case '4': case '6': m_temperature_sign = '0' ; break ; default : return false ; } return true ; } public: /// TODO: Group terminator (=;) is detected before and could be removed from regular expressions. GENTK( 0sTTT, "0[01234567/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature_sign = '/'; m_temperature = 999; m_temperature_type = NULL; if( 0 == strncmp( str, "0////", 5 ) ) return true ; return ( 2 == sscanf( str, "0%c%3d", &m_temperature_sign, &m_temperature ) ) && CheckParams() && CheckCelsius( m_temperature_sign, m_temperature ); } /// TTT -- Temperature in .1 C. s -- sign of temperature (0=positive, 1=negative) void Print() const { if( m_temperature_sign != '/' ) AppCelsius( this, _("Sea surface temperature"), m_temperature_sign, m_temperature ); else Append( _("Sea surface temperature"), _("Unspecified") ); if( m_temperature_type == NULL ) Append( _("Temperature type"), _("Unspecified") ); else Append( _("Temperature type"), m_temperature_type ); } }; /// 1PPHH -- Wave heights in 0.5 m increments HEADTK(1PPHH) { /// PP -- Period of waves in seconds int m_waves_period; /// HH -- Height of waves in 0.5 m increments int m_waves_height; public: GENTK( 1PPHH, "1[0-9/]{2}[0-9/]{2}" ) bool Parse( const char * str ) { m_waves_period = 0; m_waves_height = 0; return ( 0 == strncmp( str, "1////", 5 ) ) || ( 2 == sscanf( str, "1%2d%2d", &m_waves_period, &m_waves_height ) ); } void Print() const { Append( _("Waves period"), m_waves_period, Unit_seconds ); Append( _("Waves height"), 0.5 * m_waves_height, Unit_meters ); } }; /// http://www.top-wetter.de/themen/synopschluessel.htm says that 1PPHH is instrumented, /// that 2PPHH is not and 70HHH is not instrumented either. Figures should be close however. HEADTK(2PPHH) { int m_waves_period; int m_waves_height; public: /// 2PPHH -- Wave period and heights (instrumented) GENTK( 2PPHH, "2[0-9/]{2}[0-9/]{2}" ) bool Parse( const char * str ) { m_waves_period = -1; m_waves_height = -1; if( 0 == strcmp( str, "2////") ) return true; int nbMtch = sscanf( str, "2%2d%2d", &m_waves_period, &m_waves_height ); if(nbMtch != 2) return false ; /// Wave heights must be realistic, forty meters is too high.. if( m_waves_height > 80 ) return false ; return true; } void Print() const { if( m_waves_period >= 0 ) Append( _("Instrumented waves period"), m_waves_period, Unit_seconds ); if( m_waves_height >= 0 ) Append( _("Instrumented waves height"), 0.5 * m_waves_height, Unit_meters ); } }; /** Generally speaking: Any element not reported are normally reported with a slash. If an entire group of elements is not reported, skip the group completely (Do not report a group as ///// ) */ /// 3dddd -- Direction of swells (up to 2 swells) HEADTK(3dddd) { int m_wind_direction1 ; int m_wind_direction2 ; /// TODO: The direction should be smaller than 36. void wind_dir( const char * title, int dir ) const { if( dir >= 0 ) Append( title, dir * 10, Unit_degrees ); } public: GENTK( 3dddd, "3[0-9/]{4}" ) bool Parse( const char * str ) { m_wind_direction1 = -1; m_wind_direction2 = -1; if( 0 == strcmp( str, "3////") ) return true; return ( 2 == sscanf( str, "3%2d%2d", &m_wind_direction1, &m_wind_direction2 ) ) || ( 1 == sscanf( str, "3//%2d", &m_wind_direction2 ) ) || ( 1 == sscanf( str, "3%2d//", &m_wind_direction1 ) ); } void Print() const { wind_dir( _("Direction of primary swell waves"), m_wind_direction1 ); wind_dir( _("Direction of secondary swell waves"), m_wind_direction2 ); } }; /// 4PPHH -- Period and direction of first set of swells HEADTK(4PPHH) { int m_swell_waves_period ; int m_swell_waves_height ; public: GENTK( 4PPHH, "4[0-9/]{4}" ) bool Parse( const char * str ) { m_swell_waves_period = -1; m_swell_waves_height = -1; if( 0 == strcmp( str, "4////") ) return true; return ( 2 == sscanf( str, "4%2d%2d", &m_swell_waves_period, &m_swell_waves_height ) ) || ( 1 == sscanf( str, "4%2d//", &m_swell_waves_period ) ); } void Print() const { if( m_swell_waves_period >= 0 ) Append( _("Primary swell waves period"), m_swell_waves_period, Unit_seconds ); if( m_swell_waves_height >= 0 ) Append( _("Primary swell waves height"), 0.5 * m_swell_waves_height, Unit_meters ); } }; /// 5PPHH -- Period and direction of second set of swells HEADTK(5PPHH) { int m_swell_waves_period ; int m_swell_waves_height ; public: GENTK( 5PPHH, "5[0-9/]{4}" ) bool Parse( const char * str ) { m_swell_waves_period = -1; m_swell_waves_height = -1; if( 0 == strcmp( str, "5////") ) return true; int nbMtch = sscanf( str, "5%2d%2d", &m_swell_waves_period, &m_swell_waves_height ); if( nbMtch != 2 ) return false ; /// Realistic values only. Waves are not 40 meters high. if( m_swell_waves_height > 80 ) return false ; return true ; } void Print() const { if( m_swell_waves_period >= 0 ) Append( _("Secondary swell waves period"), m_swell_waves_period, Unit_seconds ); if( m_swell_waves_height >= 0 ) Append( _("Secondary swell waves height"), 0.5 * m_swell_waves_height, Unit_meters ); } }; /// 6IEER -- Ice accretion on ships HEADTK(6IEER) { char m_ice_accretion_code; int m_ice_accretion_thickness; char m_ice_accretion_rate; public: GENTK( 6IEER, "6[0-5/][0-9/]{2}[0-4/]" ) bool Parse( const char * str ) { m_ice_accretion_code = '_'; m_ice_accretion_thickness = -1; m_ice_accretion_rate = '_'; if( 0 == strcmp( str, "6////" ) ) return true; return ( 3 == sscanf( str, "6%c%2d%c", &m_ice_accretion_code, &m_ice_accretion_thickness, &m_ice_accretion_rate ) ); } void Print() const { static const char * ice_accretion_codes[] = { _("Not relevant"), // Should not happen, but it does. _("Icing from ocean spray"), _("Icing from fog"), _("Icing from spray and fog"), _("Icing from rain"), _("Icing from spray and rain") }; disp_arr(ice_accretion_codes,G_N_ELEMENTS(ice_accretion_codes),m_ice_accretion_code,'0',_("Ice accretion code") ); if( m_ice_accretion_thickness >= 0 ) Append( _("Ice accretion thickness"), m_ice_accretion_thickness, Unit_centimeters ); else Append( _("Ice accretion thickness"), _("Not relevant") ); static const char * ice_accretion_rates[] = { _("Ice not building up"), _("Ice building up slowly"), _("Ice building up rapidly"), _("Ice melting or breaking up slowly"), _("Ice melting or breaking up rapidly") }; disp_arr(ice_accretion_rates,G_N_ELEMENTS(ice_accretion_rates),m_ice_accretion_rate,'0',_("Ice accretion rate") ); } }; /// 70HHH -- Wave heights to 0.1 m (instrumented) HEADTK(70HHH) { int m_wave_height ; public: /// This group does not appear in NWSOH document. GENTK( 70HHH, "70[0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_wave_height = -1; return ( 0 == strncmp( str, "70///", 5 ) ) || ( 1 == sscanf( str, "70%3d", &m_wave_height ) ); } void Print() const { const char * txt = _("Wave height"); if( m_wave_height >= 0 ) Append( txt, m_wave_height * 0.1, Unit_meters ); else Append( txt, _("Undetermined"), Unit_meters ); } }; /// 8aTTT -- Wet bulb temperature HEADTK(8aTTT) { char m_wet_bulb_sign_type ; char m_temperature_sign ; int m_wet_bulb_temperature ; const char * m_title ; /// Called once we managed to extract the arguments. bool CheckParams() { switch( m_wet_bulb_sign_type ) { case '0': m_temperature_sign = '0'; m_title = _("Positive or zero measured"); break; case '1': m_temperature_sign = '1'; m_title = _("Negative measured"); break; case '2': m_temperature_sign = '1'; m_title = _("Iced bulb measured"); break; case '5': m_temperature_sign = '0'; m_title = _("Positive or zero computed"); break; case '6': m_temperature_sign = '1'; m_title = _("Negative computed"); break; case '7': m_temperature_sign = '1'; m_title = _("Iced bulb computed"); break; default : m_temperature_sign = '/'; m_title = _("Inconsistent"); return false; }; return true; } public: GENTK( 8aTTT, "8[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_wet_bulb_sign_type = '/'; m_temperature_sign = '/'; m_wet_bulb_temperature = 0 ; m_title = "Not specified"; if( 0 == strncmp( str, "8////", 5 ) ) return true; return ( 2 == sscanf( str, "8%c%3d", &m_wet_bulb_sign_type, &m_wet_bulb_temperature ) ) && CheckParams(); } void Print() const { static const std::string sep(":"); std::string title = _("Web bulb temperature") + sep + m_title ; AppCelsius( this, title.c_str(), m_temperature_sign, m_wet_bulb_temperature ); } }; /// Separator for ice detection. HEADTK(ICE) { public: // TODO: It is possible to have free text after the string ICE. GENTK( ICE, "ICE" ) bool Parse( const char * str ) { return 0 == strcmp( str, "ICE" ); } void Print() const { Append( _("Type"), "{ICE}" ); } bool CanComeFirst(void) const { return false ; } }; /// Appears only in NWSOH document. /// http://www.ndbc.noaa.gov/ice/sea_ice.shtml /// Data reported in Ships Synoptic Code, Group 2 ICE section (ciSibiDizi). HEADTK(cSbDz) { char m_sea_ice_arrangement; char m_sea_ice_development_stage; char m_ice_of_land_origin; char m_bearing_of_principle_ice_edge; char m_sea_ice_situation ; public: /// There might be four chars only ?? GENTK( cSbDz, "[0-9/]{4}[0-9/]?[;=]?" ) bool Parse( const char * str ) { return ( 5 == sscanf( str, "%c%c%c%c%c", &m_sea_ice_arrangement, &m_sea_ice_development_stage, &m_ice_of_land_origin, &m_bearing_of_principle_ice_edge, &m_sea_ice_situation ) ); } void Print() const { /// ci = Concentration or Arrangement of Sea Ice static const char * sea_ice_arrangements[] = { _("No sea ice in sight"), _("Ship in open lead more than 1 nautical mile wide, or ship in fast ice with no boundary beyond limit of visibility"), _("Sea ice present in concentrations less than 3/10 (3/8); open water or very open pack ice"), _("4/10 to 6/10 (3/8 to less than 6/8); open pack ice"), _("7/10 to 8/10 (6/8 to less than 7/8); close pack ice"), _("9/10 or more, but not 10/10 (7/8 to less than 8/8); very close pack ice"), _("Strips and patches of pack ice with open water between"), _("Strips and patches of close or very close pack ice with areas of lesser concentration between"), _("Fast ice with open water, very open or open pack ice to seaward of the ice boundary"), _("Fast ice with close or very close pack ice to seaward of the ice boundary") }; disp_arr(sea_ice_arrangements,G_N_ELEMENTS(sea_ice_arrangements),m_sea_ice_arrangement,'0', _("Concentration or arrangement of Sea Ice") ); /// Si = Sea Ice Stage of Development static const char * sea_ice_development_stages[] = { _("New ice only (frail ice, grease ice, slush ice, shuga)"), _("Nilas or ice rind, less than 10 cm thick"), _("Young ice (grey ice, grey-white ice), 10-30 cm thick"), _("Predominantly new and/or young ice with some first year ice"), _("Predominantly thin first-year ice with some new and/or young ice"), _("All thin first-year ice (30-70 cm thick)"), _("Predominantly medium first-year ice (70-120 cm thick) and thick first-year ice (more than 120 cm thick) with some thinner (younger) first-year ice"), _("All medium and first-year ice"), _("Predominantly medium and thick first-year ice with some old ice (usually more than 2 meters thick)"), _("Predominantly old ice") }; disp_arr(sea_ice_development_stages,G_N_ELEMENTS(sea_ice_development_stages),m_sea_ice_development_stage,'0', _("Sea Ice Stage of Development") ); /// bi = Ice of Land Origin static const char * ice_of_land_origins[] = { _("No ice of land origin"), _("1-5 icebergs, no growlers or bergy bits"), _("6-10 icebergs, no growlers or bergy bits"), _("11-20 icebergs, no growlers or bergy bits"), _("Up to and including 10 growlers and bergy bits - no icebergs"), _("More than 10 growlers and bergy bits - no icebergs"), _("1-5 icebergs with growlers and bergy bits"), _("6-10 icebergs with growlers and bergy bits"), _("11-20 icebergs with growlers and bergy bits"), _("More than 20 icebergs with growlers and bergy bits - a major hazard to navigation") }; disp_arr(ice_of_land_origins,G_N_ELEMENTS(ice_of_land_origins),m_ice_of_land_origin,'0', _("Ice of Land Origin") ); /// Di = Bearing of Principle Ice Edge static const char * bearing_of_principle_ice_edges[] = { _("Ship in shore or flaw lead"), _("Principle ice edge towards NE"), _("Principle ice edge towards E"), _("Principle ice edge towards SE"), _("Principle ice edge towards S"), _("Principle ice edge towards SW"), _("Principle ice edge towards W"), _("Principle ice edge towards NW"), _("Principle ice edge towards N"), _("Not determined (ship in ice)") }; disp_arr(bearing_of_principle_ice_edges,G_N_ELEMENTS(bearing_of_principle_ice_edges),m_bearing_of_principle_ice_edge,'0', _("Bearing of Principle Ice Edge") ); /// zi = Present Sea Ice Situation and Three Hour Trend static const char * sea_ice_situations[] = { _("Ship in open water with floating ice in sight"), _("Ship in easily penetrable ice; conditions improving"), _("Ship in easily penetrable ice; conditions not changing"), _("Ship in easily penetrable ice; conditions worsening"), _("Ship in ice difficult to penetrate; conditions improving"), _("Ship in ice difficult to penetrate; conditions not changing"), _("Ice forming and floes freezing together"), _("Ice under slight pressure"), _("Ice under moderate or severe pressure"), _("Ship beset") }; disp_arr(sea_ice_situations,G_N_ELEMENTS(sea_ice_situations),m_sea_ice_situation,'0', _("Present Sea Ice Situation and Three Hour Trend") ); } /// In fact, completely dependent on the previous token. THIS SHOULD BE ENFORCED. bool CanComeFirst(void) const { return false ; } }; /// 333 Group - Special / Climatological Data HEADTK(333) { public: GENTK( 333, "333" ) bool Parse( const char * str ) { return 0 == strcmp( str, "333" ); } void Print() const { Section( _("Special or climatological data") ); } }; /// 0.... -- Regionally developed data HEADTK(0____) { char m_not_decoded_yet[5] ; public: GENTK( 0____, "0[0-9A-Z/]{2}[0-9A-Z]{2}" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "0%4s", m_not_decoded_yet ) ); } void Print() const { Append( _("Regionally developed data"), m_not_decoded_yet ); } }; /// 1sTTT_max -- Maximum temperature over previous 24 hours HEADTK(1sTTT_max) { /// s -- sign of temperature (0=positive, 1=negative) char m_temperature_sign ; /// TTT -- Temperature in .1 C int m_temperature ; public: GENTK( 1sTTT_max, "1[01/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { m_temperature_sign = '/'; m_temperature = 0; if( 0 == strncmp( str, "1////", 5 ) ) return true ; return ( 2 == sscanf( str, "1%c%3d", &m_temperature_sign, &m_temperature) ) && ( strchr( "01", m_temperature_sign ) != NULL ) && CheckCelsius( m_temperature_sign, m_temperature ); } /// s -- sign of temperature (0=positive, 1=negative). TTT -- Temperature in .1 C void Print() const { AppCelsius( this, _("Maximum 24 hours temperature"), m_temperature_sign, m_temperature ); } }; /// 2sTTT_min -- Minimum temperature over previous 24 hours HEADTK(2sTTT_min) { /// s -- sign of temperature (0=positive, 1=negative) char m_temperature_sign ; /// TTT -- Temperature in .1 C int m_temperature ; public: /// 12- bzw. 15-stündige Minimumtemperatur (wird nur um 06, 09 und 18 UTC gemeldet) GENTK( 2sTTT_min, "2[01/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { int nbMtch = sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature); switch( nbMtch) { case 0 : return false; case 1 : return 0 == strcmp( str + 1, "////" ); case 2 : return CheckCelsius( m_temperature_sign, m_temperature ); default: return false; } } /// s -- sign of temperature (0=positive, 1=negative) /// TTT -- Minimum temperature over previous 24 hours in .1 C (if sign is 9, TTT is relative humidity) void Print() const { AppCelsius( this, _("Minimum temperature over previous 24 hours"), m_temperature_sign, m_temperature ); } }; /// Not sure of how it should be decoded. #ifdef DECODED_3Ejjj /// Can be 3EssTgTg : http://www.ogimet.com/docs/WMO306vol-II.pdf /// TgTg Ground (grass) minimum temperature of the preceding night, in whole degrees Celsius, its sign being given by sn. /// (3-group in Section 3 of FM 12) HEADTK(3Ejjj) { char m_ground_state ; int m_temperature ; bool m_valid_temperature ; public: GENTK( 3Ejjj, "3[0-9/][/01][/0-9]{2}[;=]?" ) // No regional decision has been made for the use of these letters so they will be encoded as solidi (///). bool Parse( const char * str ) { char char_sign, d1, d2 ; int r = sscanf( str, "3%c%c%c%c", &m_ground_state, &char_sign, &d1, &d2 ); if( r != 4 ) return false ; if( ( d1 == '/' ) ^ ( d2 == '/' ) ) return false ; if( ( d1 == '/' ) == ( d2 == '/' ) ) { m_valid_temperature = false ; return true ; } m_valid_temperature = true ; m_temperature = 10 * ( d1 - '0' ) + ( d2 - '0' ); if( char_sign == '1' ) m_temperature = -m_temperature ; return true ; } void Print() const { /// Code table 0901 E: State of the ground without snow or measurable ice cover static const char * ground_without_snow[] = { _("Surface of ground dry (without cracks and no appreciable amount of dust or loose sand)"), _("Surface of ground moist"), _("Surface of ground wet (standing water in small or large pools on surface)"), _("Flooded"), _("Surface of ground frozen"), _("Glaze on ground"), _("Loose dry dust or sand not covering ground completely"), _("Thin cover of loose dry dust or sand covering ground completely"), _("Moderate or thick cover of loose dry dust or sand covering ground completely"), _("Extremely dry with cracks") }; FM12CodeTable( ground_without_snow, 0901, _("State of the ground without snow or measurable ice cover") ); disp_arr(ground_without_snow,G_N_ELEMENTS(ground_without_snow),m_ground_state,'0',_("State of the ground without snow or measurable ice cover") ); if( m_valid_temperature ) { Append( _("Ground grass minimum temperature of preceding night"), m_temperature, Unit_Celsius ); } } }; #else /// 3Ejjj -- Regionally developed data HEADTK(3Ejjj) { char m_not_decoded_yet[5] ; public: /// TODO: See here: http://www.met.fu-berlin.de/~stefan/fm12.html#32 GENTK( 3Ejjj, "3[0-9A-Z/]{4}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "3%4s", m_not_decoded_yet ) ); } void Print() const { Append( _("Regionally developed data"), m_not_decoded_yet ); } }; #endif /// 4Esss -- Snow depth HEADTK(4Esss) { char m_snow_cover ; int m_snow_depth ; public: GENTK( 4Esss, "4[0-9/][0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "4%c%3d", &m_snow_cover, &m_snow_depth ) ); } // http://fr.scribd.com/doc/86346935/Land-Synoptic-Code void Print() const { /// E-prime -- State of ground with snow cover static const char *snow_covers[] = { _("Predominantly covered with ice"), _("Compact or wet snow covering less than half of ground"), _("Compact or wet snow covering more than half of ground but not completely covered"), _("Even layer of compact or wet snow covering entire ground"), _("Uneven layer of compact or wet snow covering entire ground"), _("Loose dry snow covering less than half of ground"), _("Loose dry snow covering more than half of ground but not completely covered"), _("Even layer of loose dry snow covering entire ground"), _("Uneven layer of loose dry snow covering entire ground"), _("Snow covering ground completely with deep drifts ") }; disp_arr(snow_covers,G_N_ELEMENTS(snow_covers),m_snow_cover,'0',_("State of ground with snow cover") ); FM12CodeTable( snow_covers, 0975, _("State of the ground with snow cover or measurable ice cover") ); /// sss -- snow depth in cm: Code table 3889 sss : Total depth of snow switch( m_snow_depth ) { case 0 : Append( _("Snow depth"), _("Not used") ); break; default : Append( _("Snow depth"), m_snow_depth, Unit_centimeters ); break; case 997 : Append( _("Snow depth"), _("Less than 0.5 cm") ); break; case 998 : Append( _("Snow depth"), _("Snow cover, not continuous") ); break; case 999 : Append( _("Snow depth"), _("Measurement impossible or inaccurate") ); break; } FM12CodeTable( , 3889, _("Total depth of snow") ); } }; /// 5jjjj -- Additional information HEADTK(5jjjj) { char m_not_decoded_yet[5] ; public: GENTK( 5jjjj, "5[012346789/][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "5%4s", m_not_decoded_yet ) ) || ( 0 == strncmp( str, "5////", 5 ) ); } void Print() const { Append( _("Additional information"), m_not_decoded_yet ); } }; /// 553SS -- Sonnenscheindauer der letzten ganzen bzw. halben* Stunde in 1/10 Stunden HEADTK(553SS) { int m_Sonnenscheindauer; public: GENTK( 553SS, "553[0-9/]{2}[;=]?" ) bool Parse( const char * str ) { m_Sonnenscheindauer = -1; return ( 0 == strncmp( str, "553//", 5 ) ) || ( 1 == sscanf( str, "553%2d", &m_Sonnenscheindauer ) ); } void Print() const { const char * txt = _("Sonnenscheindauer der letzten ganzen"); if( m_Sonnenscheindauer < 0 ) Append( txt, _("Undetermined"), Unit_hours ); else Append( txt, m_Sonnenscheindauer / 10.0, Unit_hours ); } }; /* Not sure: http://www.met.fu-berlin.de/~stefan/fm12.html#32 * 55SSS -- Sonnenscheindauer des Vortags in 1/10 Stunden (wird nur um 06 UTC gemeldet) * 553SS -- Sonnenscheindauer der letzten ganzen bzw. halben* Stunde in 1/10 Stunden */ /// 55jjj jjjjj -- Additional information (can be multiple groups) HEADTK(55jjj) { char m_not_decoded_yet[5] ; public: // Not sure it can really have four chars. GENTK( 55jjj, "55[012456789/][0-9/]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "55%3s", m_not_decoded_yet ) ); } void Print() const { Append( _("Undecoded extra information"), m_not_decoded_yet ); } }; /// Can be added several times after 55jjj HEADTK(jjjjj) { char m_not_decoded_yet[5] ; public: GENTK( jjjjj, "[0-9/]{5}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "%5s", m_not_decoded_yet ) ); } void Print() const { Append( _("Undecoded extra information"), m_not_decoded_yet ); } /// It is dependent on the previous token. bool CanComeFirst(void) const { return false ; } }; /// 2FFFF -- Summe der Globalstrahlung des Vortags in J/cm2 HEADTK(2FFFF) { int m_global_strahlung; public: GENTK( 2FFFF, "2[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_global_strahlung = -1; return ( 0 == strncmp( str, "2////", 5 ) ) || ( 1 == sscanf( str, "2%4d", &m_global_strahlung ) ); } void Print() const { /// Global Strahlung const char * txt = _("Global radiation"); if( m_global_strahlung >= 0 ) Append( txt, m_global_strahlung, "J/cm2" ); else Append( txt, _("Undetermined") ); } }; /// 3FFFF -- Diffuse Himmelsstrahlung der letzten ganzen bzw. halben* Stunde in kJ/m2 = 1/10 J/cm2 HEADTK(3FFFF) { int m_himmel_strahlung; public: GENTK( 3FFFF, "3[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_himmel_strahlung = -1; return ( 0 == strncmp( str, "3////", 5 ) ) || ( 1 == sscanf( str, "3%4d", &m_himmel_strahlung ) ); } /// Diffuse Himmelsstrahlung der letzten ganzen bzw. halben* Stunde void Print() const { Append( _("Diffuse sky radiation of last half hour"), m_himmel_strahlung, "kJ/m2" ); } }; /// 4FFFF -- Atmosphärische Wärmestrahlung der letzten ganzen bzw. halben* Stunde HEADTK(4FFFF) { int m_waerme_strahlung; public: GENTK( 4FFFF, "4[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "4%4d", &m_waerme_strahlung ) ); } /// Atmosphärische Wärmestrahlung der letzten ganzen bzw. halben* Stunde void Print() const { Append( _("Atmospheric thermal radiation of last half hour"), m_waerme_strahlung, "kJ/m2" ); } }; /// 6RRRtb -- Liquid precipitation typedef CLASSTK(6RRRt) CLASSTK(6RRRtb); /// 7RRRR -- 24 hour precipitation in mm HEADTK(7RRRR) { int m_24h_precipitations_mm ; public: GENTK( 7RRRR, "7[0-9]{4}=?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "7%4d", &m_24h_precipitations_mm ) ); } void Print() const { const char * precip = _("24 hours precipitations"); if( m_24h_precipitations_mm == 9999 ) Append( precip, _("None") ); else Append( precip, m_24h_precipitations_mm, Unit_mm ); } }; static const char * cloud_genuses[] = { _("Cirrus (Ci)"), _("Cirrocumulus (Cc)"), _("Cirrostratus (Cs)"), _("Altocumulus (Ac)"), _("Altostratus (As)"), _("Nimbostratus (Ns)"), _("Stratocumulus (Sc)"), _("Stratus (St)"), _("Cumulus (Cu)"), _("Cumulonimbus (Cb)") }; /// 8NChh -- Cloud layer data HEADTK(8NChh) { char m_cloud_cover ; char m_cloud_genus ; int m_cloud_base_height ; public: GENTK( 8NChh, "8[0-9/][0-9/][0-9/]{2}[;=]?" ) bool Parse( const char * str ) { m_cloud_cover = '0'; m_cloud_genus = '/'; m_cloud_base_height = 0 ; return ( 3 == sscanf( str, "8%c%c%2d", &m_cloud_cover, &m_cloud_genus, &m_cloud_base_height ) ) || ( 2 == sscanf( str, "8%c%c//", &m_cloud_cover, &m_cloud_genus ) ) || ( 0 == strncmp( str, "80///", 5 ) ); } void Print() const { // N -- cloud cover disp_arr(cloud_covers,G_N_ELEMENTS(cloud_covers),m_cloud_cover,'0',_("Cloud cover")); // C -- genus of cloud disp_arr(cloud_genuses,G_N_ELEMENTS(cloud_genuses),m_cloud_genus,'0',_("Cloud genus") ); // * hh -- height of cloud base const char * title = _("Cloud base height"); switch( m_cloud_base_height ) { case 0 : Append( title, _("Less than 30 meters") ); break; case 1 ... 50 : Append( title, m_cloud_base_height * 30, Unit_meters ); break; case 51 ... 56 : Append( title, 1500 + ( m_cloud_base_height - 50 ) * 50, Unit_meters ); break; case 57 ... 80 : Append( title, 1800 + ( m_cloud_base_height - 56 ) * 300, Unit_meters ); break; case 81 ... 88 : Append( title, 9000 + ( m_cloud_base_height - 80 ) * 1500, Unit_meters ); break; case 89 : Append( title, _("Greater than 21000 m") ); break; case 90 ... 99 : disp_arr(cloud_bases,G_N_ELEMENTS(cloud_bases),m_cloud_base_height,90,title ); break; default : break; } } }; /// 9SSss -- Supplementary information /// http://www.met.fu-berlin.de/~stefan/fm12.html#32 /// 9SPSPspsp -- Besondere Wettererscheinungen und zusätzliche Informationen (Gruppe kann mehrmals verschlüsselt werden) HEADTK(9SSss) { int m_figure ; int m_value ; public: GENTK( 9SSss, "9[0-9]{2}[0-9/]{2}[;=]?" ) bool Parse( const char * str ) { m_value = -1 ; return ( 2 == sscanf( str, "9%2d%2d", &m_figure, &m_value ) ) || ( 1 == sscanf( str, "9%2d//", &m_figure ) ); } // TODO: Description of decoding alone takes about 100 lines. // http://www.met.fu-berlin.de/~stefan/fm12.html#32 void Print() const { Append( _("Figure"), m_figure ); Append( _("Value"), m_value ); } }; /// 444 Group - National data, clouds. HEADTK(444) { public: GENTK( 444, "444" ) bool Parse( const char * str ) { return 0 == strcmp( str, "444" ); } void Print() const { Section( "National data, clouds" ); } }; /// NCHHC /// The coding can be more complicated, with several groups. /// http://www.top-wetter.de/themen/synopschluessel.htm#444 HEADTK(NCHHC) { char m_cloud_cover ; char m_cloud_genus ; int m_cloud_top_height ; char m_cloud_characteristics ; public: GENTK( NCHHC, "[0-9][0-9][0-9]{2}[0-9][;=]?" ) bool Parse( const char * str ) { m_cloud_cover = '0'; m_cloud_genus = '/'; m_cloud_top_height = 0 ; m_cloud_characteristics = '/'; return ( 4 == sscanf( str, "%c%c%2d%c", &m_cloud_cover, &m_cloud_genus, &m_cloud_top_height, &m_cloud_characteristics ) ); } void Print() const { // N -- cloud cover disp_arr(cloud_covers,G_N_ELEMENTS(cloud_covers),m_cloud_cover,'0',_("Cloud cover")); // C -- genus of cloud disp_arr(cloud_genuses,G_N_ELEMENTS(cloud_genuses),m_cloud_genus,'0',_("Cloud genus") ); // * hh -- height of cloud top Append( _("Cloud top height"), m_cloud_top_height * 100, Unit_meters ); static const char * cloud_characteristics[] = { _("Scattered clouds"), // Vereinzelte Wolken _("Flat, closed cloud cover"), // Flache, geschlossene Wolkendecke _("Shallow clouds with small apertures"), // Flache Wolkendecke mit kleinen Durchbrüchen _("Shallow clouds with large openings"), // Flache Wolkendecke mit großen Durchbrüchen _("Corrugated, solid cloud cover"), // Gewellte, geschlossene Wolkendecke _("Undulating clouds with small apertures"), // Gewellte Wolkendecke mit kleinen Durchbrüchen _("Undulating clouds with large openings"), // Gewellte Wolkendecke mit großen Durchbrüchen _("Closed billows clouds"), // Geschlossene Wogenwolkendecke _("Groups of waves of clouds"), // Gruppen von Wogenwolken _("Several layers of clouds at different altitudes") // Mehrere Wolkenschichten in verschiedenen Höhen }; disp_arr(cloud_characteristics,G_N_ELEMENTS(cloud_characteristics),m_cloud_characteristics,'0',_("Cloud characteristics") ); } }; /// 555 Group - National code group HEADTK(555) { public: GENTK( 555, "555" ) bool Parse( const char * str ) { return 0 == strcmp( str, "555" ); } void Print() const { Section( _("National code group") ); } }; /// 0sTTT_land -- Land surface temperature /// s -- sign of temperature (0=positive, 1=negative) /// TTT -- Temperature in .1 C HEADTK(0sTTT_land) { char m_temperature_sign ; int m_temperature ; public: // TODO: Do not know why, string finished by a semicolon. GENTK( 0sTTT_land, "0[01][0-9/]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "0%c%3d", &m_temperature_sign, &m_temperature ) ) && ( strchr( "01", m_temperature_sign ) != NULL ) && CheckCelsius( m_temperature_sign, m_temperature ); } void Print() const { // s -- sign of temperature (0=positive, 1=negative) // TTT -- Temperature in .1 C AppCelsius( this, _("Land temperature 5 cm over surface"), m_temperature_sign, m_temperature ); } }; /// 1RRRr -- Niederschlagsmenge in der letzten ganzen bzw. halben* Stunde HEADTK(1RRRr) { int m_precipitation_amount ; char m_precipitation_duration ; public: GENTK( 1RRRr, "1[0-9/]{3}[0-9/][;=]?" ) bool Parse( const char * str ) { m_precipitation_amount = -1 ; m_precipitation_duration = '0' ; return ( 2 == sscanf( str, "1%3d%c", &m_precipitation_amount, &m_precipitation_duration ) ); } void Print() const { // RRR -- Precipitation amount in mm : Niederschlagsmenge const char * precip_amount = _("Precipitation amount"); switch( m_precipitation_amount ) { default : Append( precip_amount, m_precipitation_amount / 10.0, Unit_mm );break; case 999 : Append( precip_amount, _("Not measurable") );break; } const char * precip_dur = _("Precipitation duration"); // t -- Duration over which precipitation amount measured switch( m_precipitation_duration ) { case '0' ... '9' : Append( precip_dur, 6 * ( m_precipitation_duration - '0' ), Unit_minutes ); break; default : Append( precip_dur, _("Undetermined") ); break; } } }; /// 2sTTT_avg -- Tagesmittel der Lufttemperatur des Vortages HEADTK(2sTTT_avg) { char m_temperature_sign ; int m_temperature ; public: GENTK( 2sTTT_avg, "2[01][0-9]{3}[;=]?" ) bool Parse( const char * str ) { int nbMtch = sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature); switch( nbMtch) { case 0 : return false; case 1 : return 0 == strcmp( str + 1, "////" ); case 2 : return CheckCelsius( m_temperature_sign, m_temperature ); default: return false; } } /// s: sign of temperature (0=positive, 1=negative, 9 = RH). TTT: Temperature in .1 C (if sign is 9, TTT is relative humidity) void Print() const { AppCelsius( this, _("Daily mean air temperature of the previous day"), m_temperature_sign, m_temperature ); } }; HEADTK(22fff) { int m_wind_speed_meter_second; public: GENTK( 22fff, "22[0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "22%3d", &m_wind_speed_meter_second ) ); } void Print() const { Append( _("Wind speed 10 minutes average"), m_wind_speed_meter_second / 10.0, Unit_meters_second ); } }; HEADTK(23SS) { int m_sun_shine_duration; public: GENTK( 23SS, "23[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "23%2d", &m_sun_shine_duration ) ); } void Print() const { Append( _("Total hours of sunshine duration"), m_sun_shine_duration, Unit_minutes ); } }; HEADTK(24Wt) { char m_precipitation_indicator; char m_precipitation_duration; public: GENTK( 24Wt, "24[01236789]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "24%c%c", &m_precipitation_indicator, &m_precipitation_duration ) ); } void Print() const { // WR -- Indikator zur Niederschlagsgruppe und Kennzeichnung der Niederschlagsform static const char * Niederschlagsgruppen[] = { _("Kein Niederschlag"), _("Nur abgesetzte Niederschläge"), _("Nur flüssige abgesetzte Niederschläge"), _("Nur feste abgesetzte Niederschläge"), _("Undefined"), _("Undefined"), _("Niederschlag in flüssiger Form"), _("Niederschlag in fester Form"), _("Niederschlag in flüssiger und fester Form"), _("Niederschlagsmessung ausgefallen") }; // TODO: TRANSLATION disp_arr(Niederschlagsgruppen,G_N_ELEMENTS(Niederschlagsgruppen),m_precipitation_indicator,'0',_("Precipitations group") ); // t -- Duration over which precipitation amount measured display_precipitation( this, m_precipitation_duration ); } }; /// 25wzwz -- zusätzliche Wettererscheinung (Gruppe kann bis zu 4-mal verschlüsselt werden): HEADTK(25ww) { int m_wetter_erscheinung; public: GENTK( 25ww, "25[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "25%2d", &m_wetter_erscheinung ) ); } void Print() const { static const choice< int > wettererscheinungen[] = { // Kondensstreifen { 1, _("Sich schnell auflösende Kondensstreifen (Lebensdauer < 1 Minute)") }, { 2, _("Sich langsam auflösende Kondensstreifen (Lebensdauer 1 bis 14 Minuten)") }, { 3, _("Beständige Kondensstreifen (Lebensdauer > 15 Minuten)") }, { 4, _("Aufgelöste, vollständig in Cirrusbewölkung übergegangene Kondensstreifen") }, // Reif { 5, _("Strahlungsreif") }, { 6, _("Advektionsreif") }, { 7, _("Rauhreif") }, { 8, _("Rauheis") }, { 9, _("Klareis") }, // Decken aus festen Niederschlägen (> 50 % des Erdbodens bedeckend) {15, _("Grieseldecke") }, {16, _("Eiskörnerdecke") }, {17, _("Graupeldecke") }, {18, _("Hageldecke") }, // Wettererscheinungen {23, _("Eiskörner in der letzten Stunde") }, {24, _("Glatteisbildung in der letzten Stunde") }, {31, _("Sandfegen (unter Augenhöhe)") }, {32, _("Sandtreiben (über Augenhöhe)") }, {33, _("Sandverwehungen > 5 cm") }, {36, _("Schneeverwehungen > 20 cm") }, {45, _("nässender Nebel") }, // Glätteerscheinungen {71, _("Reifglätte") }, {75, _("Schneeglätte") }, {76, _("Eisglätte (überfrierende Nässe)") }, {77, _("Glatteis (gefrierender Regen/Sprühregen)") }, {81, _("Gefrierender Schauerniederschlag") }, // sonstige Erscheinungen {99, _("Böenwalze") } }; Append( _("Zusätzliche Wettererscheinung"), choice_map( wettererscheinungen, G_N_ELEMENTS(wettererscheinungen), m_wetter_erscheinung, _("Undefined") ) ); // TODO: TRANSLATION } }; /// 26fff -- mittlere Windgeschwindigkeit der letzten Stunde in 1/10 m/s HEADTK(26fff) { int m_wind_speed_meter_second; public: GENTK( 26fff, "22[0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "26%3d", &m_wind_speed_meter_second ) ); } void Print() const { Append( _("Last hour average wind speed"), m_wind_speed_meter_second / 10.0, Unit_meters_second ); } }; /// 3LGLGLsLs -- Anzahl der registrierten Blitze in den letzten 30 Minuten /// LG LG -- Gesamtzahl der Blitze /// Ls Ls -- Anzahl der Blitze starker Intensität HEADTK(3LLLL) { int m_Gesamtzahl_der_Blitze; int m_Anzahl_der_Blitze_starker_Intensitaet; public: GENTK( 3LLLL, "3[0-9]{4}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "2%2d%2d", &m_Gesamtzahl_der_Blitze, &m_Anzahl_der_Blitze_starker_Intensitaet ) ); } void Print() const { Append( _("Number of flashes"), m_Gesamtzahl_der_Blitze ); Append( _("Number of high-intensity flashes"), m_Anzahl_der_Blitze_starker_Intensitaet ); } }; /* * 4RwRwwzwz -- Wasseräquivalent der Schneedecke und zusätzliche Wettererscheinungen Rw Rw -- Spezifisches Wasseräquivalent der Schneedecke in 1/10 mm/cm wz wz -- zusätzliche Wettererscheinung: Kondensstreifen 01 -- sich schnell auflösende Kondensstreifen 02 -- sich langsam auflösende Kondensstreifen 03 -- beständige Kondensstreifen 04 -- aufgelöste, in Cirrusbewölkung übergegangene Kondensstreifen Reif 05 -- Strahlungsreif 06 -- Advektionsreif 07 -- Rauhreif 08 -- Rauheis 09 -- Klareis Decken aus festen Niederschlägen (> 50 % des Erdbodens bedeckend) 15 -- Grieseldecke 16 -- Eiskörnerdecke 17 -- Graupeldecke 18 -- Hageldecke Wettererscheinungen 23 -- Eiskörner in der letzten Stunde 24 -- Glatteisbildung in der letzten Stunde 31 -- Sandfegen, unter Augenhöhe 32 -- Sandtreiben, über Augenhöhe 33 -- Sandverwehungen > 5 cm 36 -- Schneeverwehungen > 20 cm Glätteerscheinungen 71 -- Reifglätte 75 -- Schneeglätte 76 -- Eisglätte (überfrierende Nässe) 77 -- Glatteis (gefrierender Regen/Sprühregen) 81 -- gefrierender Schauerniederschlag sonstige Erscheinungen 99 -- Böenwalze * 5s's's'tR -- Neuschneehöhe Hinweis: Mit dieser Gruppe wird in der Regel um 06 UTC die 24-stündige und um 18 UTC die 12-stündige Neuschneehöhe gemeldet. s's's' -- Neuschneehöhe in cm (997 = < 0.5 cm, 998 = Flecken oder Reste, 999 = Angabe nicht möglich) tR -- Bezugszeitraum, über welche die Neuschneehöhe gemessen wurde: 0 -- nicht aufgeführter oder vor dem Termin endender Zeitraum 1 -- 6 Stunden 2 -- 12 Stunden 3 -- 18 Stunden 4 -- 24 Stunden 5 -- 1 Stunde bzw. 30 Minuten (bei Halbstundenterminen) 6 -- 2 Stunden 7 -- 3 Stunden 8 -- 9 Stunden 9 -- 15 Stunden / -- Sondermessung wegen Überschreitung des Schwellenwerts (> 5 cm bzw. 10 cm in < 12 Stunden) * 7h'h'ZD' -- Dunst, Talnebel und Wolken unterhalb des Stationsniveaus h'h' -- Höhe der Obergrenze der Erscheinung über NN Z -- Entwicklung von Dunst, Talnebel und Wolken unterhalb des Stationsniveaus D' -- Sektor des Hauptanteils der Bedeckung mit der Erscheinung * 8Ns/hshs -- automatisch ermittelte Höhe von Wolkenschichten (Gruppe kann mehrmals verschlüsselt werden) Ns -- Bedeckungsgrad der Wolkenschicht in Achteln hs hs -- Höhe der Wolkenuntergrenze: 00 -- < 30 m (< 100 ft) 01 -- 30 m (100 ft) 02 -- 60 m (200 ft) 03 -- 90 m (300 ft) ... 50 -- 1500 m (5000 ft) ====================== 56 -- 1800 m (6000 ft) 57 -- 2100 m (7000 ft) ... 80 -- 9000 m (30000 ft) ======================= 81 -- 10500 m (35000 ft) 82 -- 12000 m (40000 ft) ... 88 -- 21000 m (70000 ft) 89 -- höher als 21000 m (> 70000 ft) ==================================== 90 -- 0 bis 49 m (0 - 166 ft) 91 -- 50 bis 99 m (167 - 333 ft) 92 -- 100 bis 199 m (334 - 666 ft) 93 -- 200 bis 299 m (667 - 999 ft) 94 -- 300 bis 599 m (1000 - 1999 ft) 95 -- 600 bis 999 m (2000 - 3333 ft) 96 -- 1000 bis 1499 m (3334 - 4999 ft) 97 -- 1500 bis 1999 m (5000 - 6666 ft) 98 -- 2000 bis 2499 m (6667 - 8333 ft) 99 -- 2500 m oder höher (> 8334 ft) * 910ff -- Höchste Windspitze in den letzten 10 Minuten (wird immer gemeldet!) */ /// 911ff -- Höchste Windspitze in der letzten Stunde (wird immer gemeldet!) HEADTK(911ff) { int m_hoechste_windspitze_letzten_stunde; public: GENTK( 911ff, "911[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "911%2d", &m_hoechste_windspitze_letzten_stunde ) ); } void Print() const { Append( _("Last hour maximum wind speed"), m_hoechste_windspitze_letzten_stunde, Unit_meters_second ); } }; /// 912ff -- Höchstes 10-Minuten-Mittel der Windgeschwindigkeit in der letzten Stunde (wird immer gemeldet!) HEADTK(912ff) { int m_hoechste_10mn_wind_geschwindigkeit_letzten_stunde; public: GENTK( 912ff, "912[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "912%2d", &m_hoechste_10mn_wind_geschwindigkeit_letzten_stunde ) ); } void Print() const { Append( _("Last hour ten minutes average wind speed"), m_hoechste_10mn_wind_geschwindigkeit_letzten_stunde, Unit_meters_second ); } }; /* * PIC INp -- Wolkenbedeckung von Bergen (Gruppe kann bis zu 2-mal verschlüsselt werden) I -- Kennziffer und Richtung des Berges Np -- Bedeckungsgrad des Berges mit Wolken in Achteln * BOT hesnTTT -- Temperaturen im Erdboden (werden immer gemeldet!) he -- Meßtiefe: 0 -- 0 cm 1 -- 5 cm 2 -- 10 cm 3 -- 20 cm 4 -- 50 cm 5 -- 100 cm 6 -- 200 cm sn -- Vorzeichen der Erdbodentemperatur (0 = positiv, 1 = negativ) TTT -- Erdbodentemperatur der angegebenen Meßtiefe in 1/10 Grad Celsius * 80000 -- Kenngruppe für ergänzende klimatologische Meß- und Beobachtungsdaten für die Klimaroutinen * 1RRRRWR -- 6-stündiger Niederschlag Hinweis: Diese Gruppe wird zu den Hauptterminen (00, 06, 12, 18 UTC) gemeldet. RRRR -- Niederschlagsmenge in 1/10 mm (0000 = trocken, 9999 = < 0.05 mm) WR -- Indikator zur Niederschlagsgruppe und Kennzeichnung der Niederschlagsform: 0 -- kein Niederschlag 1 -- nur abgesetzte Niederschläge (flüssig und fest) 2 -- nur flüssige abgesetzte Niederschläge 3 -- nur feste abgesetzte Niederschläge 6 -- gefallener Niederschlag in flüssiger Form 7 -- gefallener Niederschlag in fester Form 8 -- gefallener Niederschlag in flüssiger und fester Form 9 -- Niederschlagsmessung ausgefallen * 2SSSS -- Tagessumme der Sonnenscheindauer des Vortags in Minuten (wird um 06 UTC gemeldet) * 3fkfkfk< -- Höchste Windspitze des Vortags (00 - 24 UTC) in 1/10 m/s (wird um 06 UTC gemeldet) * 4fxkfxkfxk -- Höchstes 10-Minuten-Mittel der Windgeschwindigkeit des Vortags (00 - 24 UTC) in 1/10 m/s (wird um 06 UTC gemeldet) * 5RwRw -- Spezifisches Wasseräquivalent der Schneedecke in 1/10 mm/cm (wird nur montags, mittwochs und freitags um 06 UTC gemeldet, wenn die Schneehöhe mindestens 5 cm beträgt) * 6VAVAVBVBV CVC -- Niederschläge und Wettererscheinungen des Vortags (werden um 06 UTC gemeldet) VAVA -- Gefallener Niederschlag des Vortags (00 - 24 UTC): 000 -- kein gefallener Niederschlag 001 -- Regen (Sprüh-/Nieselregen, Regen, Regentropfen) 002 -- gefrierender Regen (gefrierender Sprüh-/Nieselregen, gefrierender Regen) 004 -- Schnee (Schnee, Schneekristalle, Schneeflocken) 008 -- Graupel (Schneegriesel, Reifgraupel, Frostgraupel, Eiskörner) 016 -- Hagel Hinweis: Bei gleichzeitigem Auftreten mehrerer Niederschlagsarten werden die jeweiligen Schlüsselzahlen addiert, z. B.: Regen und Schnee und Graupel = 001 + 004 + 008 = 013 VBVB -- Abgesetzter oder abgelagerter Niederschlag des Vortags (00 - 24 UTC): 000 -- kein abgesetzter oder abgelagerter Niederschlag 001 -- Tau (Strahlungstau, Advektionstau, weißer Tau) 002 -- Reif (Strahlungsreif, Advektionsreif) 004 -- Rauhreif/Rauhfrost 008 -- Rauheis/Klareis 016 -- Glatteis/Eisglätte 032 -- Decke aus festen Niederschlägen (mindestens 50 % des Bodens bedeckend) Hinweis: Bei gleichzeitigem Auftreten mehrerer abgesetzter Niederschläge werden die jeweiligen Schlüsselzahlen addiert, z. B.: Tau und Reif sowie Schneedecke = 001 + 002 + 032 = 035 VCVC -- Sonstige Wettererscheinungen des Vortags (00 - 24 UTC): 000 -- keine sonstigen Wettererscheinungen 001 -- Nebel (Nebel, Nebeltreiben) 002 -- Gewitter (Nahgewitter, Ferngewitter) 004 -- starker Wind (Windstärke 6 und 7 im 10-Min.-Mittel) 008 -- stürmischer Wind (Windstärke > 8 im 10-Min.-Mittel) Hinweis: Bei gleichzeitigem Auftreten mehrerer Wettererscheinungen werden die jeweiligen Schlüsselzahlen addiert, z. B.: Gewitter und stürmischer Wind = 002 + 008 = 010 * 7snTxkTxkTxk -- Maximumtemperatur des Vortags (00 - 24 UTC) (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Txk Txk Txk -- Maximumtemperatur in 1/10 Grad Celsius * 8snTnkTnkTnk -- Minimumtemperatur des Vortags (00 - 24 UTC) (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Tnk Tnk Tnk -- Minimumtemperatur in 1/10 Grad Celsius * 9snTgTgTgsTg -- Minimumtemperatur des Vortags (00 - 24 UTC) 5 cm über dem Erdboden bzw. der Schneedecke (wird um 06 UTC gemeldet) sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) Tg Tg Tg -- Erdbodenminimumtemperatur in 1/10 Grad Celsius sTg -- Bedeckung des Temperaturmeßfühlers 5 cm über dem Erdboden mit Schnee oder Eis am Vortag (0 = nein, 1 = ja, / = Angabe nicht möglich) */ /// Abschnitt 6 - Automatisch erzeugte Daten HEADTK(666) { public: GENTK( 666, "666" ) bool Parse( const char * str ) { return 0 == strcmp( str, "666" ); } void Print() const { Section( _("Automatisch erzeugte Daten") ); } }; /// 1snTxTxTx -- Maximumtemperatur der letzten Stunde /// sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) /// Tx Tx Tx -- Maximumtemperatur in 1/10 Grad Celsius HEADTK(1snTxTxTx) { char m_temperature_sign ; int m_temperature; public: GENTK( 1snTxTxTx, "1[01][0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "1%c%3d", &m_temperature_sign, &m_temperature) ) && CheckCelsius( m_temperature_sign, m_temperature ); } void Print() const { AppCelsius( this, _("Last hour maximum temperature"), m_temperature_sign, m_temperature ); } }; /// 2snTnTnTn -- Minimumtemperatur der letzten Stunde /// sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) /// Tn Tn Tn -- Minimumtemperatur in 1/10 Grad Celsius HEADTK(2snTxTxTx) { char m_temperature_sign ; int m_temperature; public: GENTK( 2snTxTxTx, "2[01][0-9]{3}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "2%c%3d", &m_temperature_sign, &m_temperature) ) && CheckCelsius( m_temperature_sign, m_temperature ); } void Print() const { AppCelsius( this, _("Last hour minimum temperature"), m_temperature_sign, m_temperature ); } }; /// 3snTnTnTn -- Minimumtemperatur 5 cm über dem Erdboden bzw. der Schneedecke in der letzten Stunde /// sn -- Vorzeichen der Temperatur (0 = positiv, 1 = negativ) /// Tn Tn Tn -- Erdbodenminimumtemperatur in 1/10 Grad Celsius /// 6VMxVMxVMxVMx/ VMnVMnVMnVMn> -- automatisch gemessene maximale/minimale meteorologische Sichtweite (MOR) der letzten ganzen bzw. halben Stunde (nur bei Halbstundenterminen) in m /// 7VMVMVMVM -- automatisch gemessene meteorologische Sichtweite (MOR) in m HEADTK(7VVVV) { int m_MOR; public: GENTK( 7VVVV, "7[0-9/]{4}[;=]?" ) bool Parse( const char * str ) { m_MOR = -1; return ( 1 == sscanf( str, "7%4d", &m_MOR ) ) || ( 0 == strncmp( str, "7////", 5 ) ); } void Print() const { if(m_MOR >= 0) Append( _("MOR"), m_MOR, Unit_meters ); else Append( _("MOR"), _("Undetermined") ); } }; /* * 80000 -- Kenngruppe für automatisch erzeugte Niederschlagsdaten * 0RRRrx 1RRRrx 2RRRrx 3RRRrx 4RRRrx 5RRRrx 0, 1, 2, 3, 4, 5 (Gruppenkennziffer) -- Kennung der Zeitabschnitte der letzten Stunde: 0 -- 0. bis 9. Minute 1 -- 10. bis 19. Minute 2 -- 20. bis 29. Minute 3 -- 30. bis 39. Minute 4 -- 40. bis 49. Minute 5 -- 50. bis 59. Minute RRR -- 10-minütige Niederschlagshöhe in 1/10 mm rx -- Niederschlagsdauer im jeweiligen Zeitabschnitt in Minuten (0 = 10 Minuten bzw. kein Niederschlag gemessen) */ HEADTK(1VVff) { int m_visibility_metres; int m_gust_speed_knots; public: GENTK( 1VVff, "1[0-9/][0-9/]{3}" ) bool Parse( const char * str ) { m_visibility_metres = 0; m_gust_speed_knots = 0; if( 0 == strcmp( str, "1////" ) ) return true ; if( str[1] == '/' ) { return ( 1 == sscanf( str, "1/%3d", &m_gust_speed_knots ) ); } else { return ( 2 == sscanf( str, "1%2d%2d", &m_visibility_metres, &m_gust_speed_knots ) ); } } void Print() const { Append( _("Visibility"), m_visibility_metres, Unit_meters ); Append( _("Maximum gust speed in past 24 hours"), m_gust_speed_knots, Unit_knots ); } }; HEADTK(110ff) { int m_wind_speed_knots; public: GENTK( 110ff, "110[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "110%2d", &m_wind_speed_knots ) ); } void Print() const { Append( _("Wind speed at 10 meters"), m_wind_speed_knots, Unit_knots ); } }; HEADTK(220ff) { int m_wind_speed_knots; public: GENTK( 220ff, "220[0-9]{2}[;=]?" ) bool Parse( const char * str ) { return ( 1 == sscanf( str, "220%2d", &m_wind_speed_knots ) ); } void Print() const { Append( _("Wind speed at 20 meters"), m_wind_speed_knots, Unit_knots ); } }; HEADTK(3GGmm) { int m_end_measure_hour; int m_end_measure_minute; public: GENTK( 3GGmm, "3[0-2][0-9][0-5][0-9][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "3%2d%2d", &m_end_measure_hour, &m_end_measure_minute ) ) && ( m_end_measure_hour < 25 ); } void Print() const { Append( _("Time of peak wind since last observation"), hour_min( m_end_measure_hour, m_end_measure_minute ) ); } }; HEADTK(4ddff) { int m_peak_direction_degrees; int m_peak_speed_knots; public: GENTK( 4ddff, "4[0-9]{4}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "4%3d%3d", &m_peak_direction_degrees, &m_peak_speed_knots ) ); } void Print() const { Append( _("Direction"), 10.0 * m_peak_direction_degrees, Unit_degrees ); Append( _("Speed"), m_peak_speed_knots, Unit_knots ); } }; /// End time in hours and minutes of the latest 10-minute continuous wind measurements. HEADTK(6GGmm) { int m_end_measure_hour; int m_end_measure_minute; public: /// More details: http://atmo.tamu.edu/class/atmo251/BuoyCode.pdf GENTK( 6GGmm, "6[0-2][0-9][0-5][0-9][;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "6%2d%2d", &m_end_measure_hour, &m_end_measure_minute ) ) && ( m_end_measure_hour < 25 ); } void Print() const { Append( _("End time of latest 10-minute continuous wind measurement"), hour_min( m_end_measure_hour, m_end_measure_minute ) ); } }; /// 6 10-minute continuous wind measurements HEADTK(dddfff) { int m_direction_degrees; int m_speed_knots; public: GENTK( dddfff, "[0-9]{6}[;=]?" ) bool Parse( const char * str ) { return ( 2 == sscanf( str, "%3d%3d", &m_direction_degrees, &m_speed_knots ) ); } void Print() const { Append( _("Direction"), m_direction_degrees, _("degrees") ); Append( _("Speed"), m_speed_knots, _("knots") ); } }; // ---------------------------------------------------------------------------- /// Contains a Synop group and its length. struct synop_group { size_t m_usage_counter; // How many times did it match an input section. For debugging. section_t m_section ; size_t m_nb_toks ; const TOKGEN * m_tks ; synop_group( section_t g, size_t n, const TOKGEN * t ) : m_usage_counter(0), m_section(g), m_nb_toks(n), m_tks(t) {} friend std::ostream & operator<<( std::ostream & ostrm, const synop_group & syn ) { for( size_t i =0 ; i < syn.m_nb_toks; ++i ) { ostrm << RegexT::Name( syn.m_tks[i].m_rgx_idx ) << "-"; } return ostrm; } }; /// Contains all patterns of Synop sections. We hold a buffer of the last words and try to match /// it against all known patterns. static std::vector< synop_group > arrSynopGroups ; /// This defines a pattern which might mpatch a list of Synop tokens, i.e. a Synop section. #define TKLST(g, ... ) \ { \ static const TOKGEN hiddenTokGen[] = { __VA_ARGS__ }; \ arrSynopGroups.push_back( synop_group( g, G_N_ELEMENTS(hiddenTokGen), hiddenTokGen ) ); \ } static const void init_patterns(void) { static bool init = false ; if( init ) return ; init = true ; TKLST( SECTION_ZCZC_DLM,TK1(ZCZC),TK1(ZCZC_id) ); TKLST( SECTION_NNNN_DLM,TK1(NNNN) ); // http://www.nws.noaa.gov/tg/segment.html TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(RRx) ); TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(CCx) ); TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(AAx) ); TKLST( SECTION_HEAD_GRP,TK1(TTAAii),TK1(CCCC),TK1(YYGGgg),TK1(Pxx) ); TKLST( SECTION_IDENTLOC,TK1(IIiii),TK1(YYGGi),TK1(99LLL),TK1(QLLLL) ); // http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // TODO: NOT SURE IIiii should be added at the end. TKLST( SECTION_IDENTLOC,TK1(AAXX),TK1(YYGGi) ); // http://www.ominous-valve.com/wx_codes.txt // Can be followed by the callsign or the station id. TKLST( SECTION_IDENTLOC,TK1(BBXX),TK1(IIIII),TK1(YYGGi),TK1(99LLL),TK1(QLLLL) ); // IIIII is the callsign. // OOXX D....D YYGGiw 99LaLaLa QcLoLoLoLo MMMULaULo h0h0h0h0im TKLST( SECTION_IDENTLOC,TK1(OOXX),TK1(IIIII),TK1(YYGGi),TK1(99LLL),TK1(QLLLL),TK1(MMMULaULo),TK1(h0h0h0h0im) ); // According to http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // - 00fff is optional. // - 2sTTT_dew can be replaced by 29UUU // - 4PPPP can be replaced by 4a3hhh // - 7WWWW can be replaced by 7wwWW // - 9GGgg is optional TKLST( SECTION_LAND_OBS,TK1(iihVV),TK1(Nddff),TK1(00fff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(NIL) ); // 10 TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(8NCCC),TKn(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(7wwWW),TK1(9GGgg) ); // 61 TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(4PPPP),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(5appp) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(3PPPP),TK1(9GGgg) ); // http://allaboutweather.tripod.com/synopcode.htm TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(6RRRt),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(7wwWW),TK1(8NCCC),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); // 01078 11470 30310 11045 21077 5//// 69941 70182 82360 333 91114= // A: Publish: Error, no coordinates. kmlNam= descrTxt= m_nb_tokens=5:Land observations=6RRRt#69941+7wwWW#70182+8NCCC#82360+;Climatological data=333#333+9SSss#91114+; TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(7wwWW),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(4PPPP),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(5appp),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC) ); // 21 TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(6RRRt),TK1(7wwWW),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(2sTTT_dew),TK1(6RRRt),TK1(8NCCC) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(3PPPP),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(1sTTT_air),TK1(9GGgg) ); TKLST( SECTION_LAND_OBS,TK1(IIiii),TK1(iihVV),TK1(Nddff),TK1(4PPPP),TK1(5appp),TK1(9GGgg) ); // According to http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // - 0sTTT is optional. TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(1PPHH),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(3dddd),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(70HHH) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(2PPHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(3dddd),TK1(4PPHH) ); // 66 TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(0sTTT),TK1(8aTTT),TK1(ICE),TK1(cSbDz) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(1PPHH),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(5PPHH),TK1(6IEER),TK1(70HHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(1PPHH),TK1(70HHH) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(2PPHH),TK1(3dddd),TK1(4PPHH),TK1(8aTTT) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(2PPHH),TK1(70HHH) ); TKLST( SECTION_SEA_SURF,TK1(222Dv),TK1(ICE),TK1(cSbDz) ); // http://allaboutweather.tripod.com/synopcode.htm // 333 1snTxTxTx (at 1800 UTC) 2snTnTnTn (at 0600 UTC) 3EsnTgTg (at 0600 UTC) 4E'sss (at 0600 UTC) 8NsChshs 9SpSpspsp // - SECTION 5 // 555 1V'f'/V'f''f'' 2snTwTwTw iiirrr /// BEWARE: jjjjj COULD BE REPEATED ! Or only with 55jjj ?? // According to http://atmo.tamu.edu/class/atmo251/LandSynopticCode.pdf // - 0____ is optional. // - jjjjj is optional. TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(4Esss),TK1(5jjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(0____),TK1(55jjj),TK1(jjjjj),TK1(8NChh),TK1(9SSss) ); // http://www.top-wetter.de/themen/synopschluessel.htm // 333 0.... 1sTTT 2sTTT 3EsTT 4E'sss 55SSS 2FFFF 3FFFF 4FFFF 553SS 2FFFF 3FFFF 4FFFF 6RRRt 7RRRR 8NChh 9SSss TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(4FFFF),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(553SS),TK1(2FFFF),TK1(7RRRR),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR),TK1(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(6RRRtb),TK1(7RRRR),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(3Ejjj),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(4Esss),TK1(7RRRR) ); // 51 TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(553SS),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(6RRRtb),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(55jjj),TK1(jjjjj),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(6RRRtb),TK1(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(7RRRR),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(2sTTT_min),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(3Ejjj),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(553SS),TK1(2FFFF),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(55jjj),TK1(jjjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TKn(5jjjj),TKn(8NChh),TK1(9SSss) ); // 61 TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TKn(5jjjj),TK1(6RRRtb),TKn(8NChh),TK1(9SSss) ); // 63 TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(6RRRtb) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TKn(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(1sTTT_max),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(4Esss),TK1(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(5jjjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(3Ejjj),TK1(5jjjj),TK1(6RRRtb),TK1(7RRRR),TK1(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(4Esss),TK1(7RRRR),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(55jjj),TK1(jjjjj),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(553SS),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(2sTTT_min),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(3FFFF),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(4Esss),TK1(553SS),TK1(6RRRt),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(553SS),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(3FFFF),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(553SS),TK1(2FFFF),TK1(6RRRt),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(7RRRR),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(3Ejjj),TK1(55jjj),TK1(jjjjj),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(4Esss),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(553SS),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(4Esss),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TK1(6RRRt),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TK1(3FFFF),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TK1(6RRRt),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TK1(2FFFF),TKn(8NChh) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(553SS),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(5jjjj),TK1(6RRRtb) ); TKLST( SECTION_CLIM_DAT,TK1(333),TKn(5jjjj),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TK1(2sTTT_min),TK1(3Ejjj),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TK1(3Ejjj),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TK1(3Ejjj),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(55jjj),TK1(jjjjj),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(6RRRtb),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TK1(6RRRtb),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TKn(8NChh),TKn(9SSss) ); TKLST( SECTION_CLIM_DAT,TK1(333),TKn(9SSss) ); // http://www.top-wetter.de/themen/synopschluessel.htm#444 TKLST( SECTION_NATCLOUD,TK1(444),TK1(NCHHC) ); // NOT SURE AT ALL. // http://allaboutweather.tripod.com/synopcode.htm TKLST( SECTION_NAT_CODE,TK1(555),TK1(1VVff),TK1(2sTTT_avg),TK1(3Ejjj),TK1(4Esss),TKn(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(1VVff),TK1(2sTTT_avg),TK1(3Ejjj),TKn(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(1VVff),TKn(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(2sTTT_avg),TK1(5jjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(3Ejjj),TK1(4Esss),TK1(55jjj),TK1(jjjjj),TK1(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(3Ejjj),TKn(8NChh),TK1(9SSss) ); TKLST( SECTION_NAT_CODE,TK1(555),TK1(9SSss) ); // http://metaf2xml.sourceforge.net/parser.pm.html // AT: 1snTxTxTx 6RRR/ // 1snTxTxTx : maximum temperature on the previous day from 06:00 to 18:00 UTC // 6RRR/ : amount of precipitation on the previous day from 06:00 to 18:00 UTC // BE: 1snTxTxTx 2snTnTnTn // 1snTxTxTx : maximum temperature on the next day from 00:00 to 24:00 UTC // 2snTnTnTn : minimum temperature on the next day from 00:00 to 24:00 UTC // CA: 1ssss 2swswswsw 3dmdmfmfm 4fhftftfi // 1ssss : amount of snowfall, in tenths of a centimeter, for the 24-hour period ending at 06:00 UTC // 2swswswsw : amount of water equivalent, in tenths of a millimeter, for the 24-hour snowfall ending at 06:00 UTC // 3dmdmfmfm : maximum (mean or gust) wind speed, in knots, for the 24-hour period ending at 06:00 UTC and its direction // 4fhftftfi : together with the previous group, the hundreds digit of the maximum wind speed (in knots), // the time of occurrence of the maximum wind speed, and the speed range // of the maximum two-minute mean wind speed, for the 24-hour period ending at 06:00 UTC and its direction // US land: RECORD* 0ittDtDtD 1snTT snTxTxsnTnTn RECORD* 2R24R24R24R24 44snTwTw 9YYGG // RECORD : indicator for temperature record(s) // 0ittDtDtD : tide data // 1snTT snTxTxsnTnTn RECORD* 2R24R24R24R24 : city data: temperature, maximum and minimum temperature, // indicator for temperature record(s), precipitation last 24 hours // 44snTwTw : water temperature // 9YYGG : additional day and hour of observation (repeated from Section 0) // US sea: 11fff 22fff 3GGgg 4ddfmfm 6GGgg dddfff dddfff dddfff dddfff dddfff dddfff 8ddfmfm 9GGgg // 11fff 22fff : equivalent wind speeds at 10 and 20 meters // 3GGgg 4ddfmfm : maximum wind speed since the last observation and the time when it occurred // 6GGgg : end time of the latest 10-minute continuous wind measurements // 6 x dddfff : 6 10-minute continuous wind measurements // 8ddfmfm 9GGgg : highest 1-minute wind speed and the time when it occurred // CZ: 1dsdsfsfs 2fsmfsmfsxfsx 3UU// 5snT5T5T5 6snT10T10T10 7snT20T20T20 8snT50T50T50 9snT100T100T100 // 1dsdsfsfs : wind direction and speed from tower measurement // 2fsmfsmfsxfsx : maximum wind gust speed over 10 minute period and the period W1W2 // 3UU// : relative humidity // 5snT5T5T5 6snT10T10T10 7snT20T20T20 8snT50T50T50 9snT100T100T100 : soil temperature at the depths of 5, 10, 20, 50, and 100 cm // RU: 1EsnT'gT'g 2snTnTnTn 3EsnTgTg 4E'sss 52snT2T2 6RRRtR 7R24R24R24/ 88R24R24R24 // 1EsnT'gT'g : state of the ground without snow or measurable ice cover, temperature of the ground surface // 2snTnTnTn : minimum temperature last night // 3EsnTgTg : state of the ground without snow or measurable ice cover, minimum temperature of the ground surface last night // 4E'sss : state of the ground if covered with snow or ice, snow depth // 6RRRtR : amount of precipitation for given period // 7R24R24R24/ : amount of daily precipitation // 88R24R24R24 : amount of daily precipitation if 30 mm or more // http://atmo.tamu.edu/class/atmo251/BuoyCode.pdf // 6GGgg is also called 6GGmm TKLST( SECTION_NAT_CODE,TK1(555),TK1(6GGmm) ); // Or 6snT10T10T10 /// Applies to CMAN messages but apparently to others too. // 3GGgg 4ddfmfm: maximum wind speed since the last observation and the time when it occurred TKLST( SECTION_NAT_CODE,TK1(555),TK1(110ff),TK1(220ff),TK1(3GGmm),TK1(4ddff),TK1(6GGmm),TKn(dddfff) ); // http://www.top-wetter.de/themen/synopschluessel.htm #ifdef FULL_SYNOP_555 TKLST( SECTION_NAT_CODE,TK1(555),TK1(0sTTT_land),TK1(1RRRr),TK1(2sTTT_avg),TK1(22fff),TK1(23SS),TK1(24Wt),TKn(25ww),TK1(26fff),TK1(3LLLL),TK1(5ssst),TK1(7hhZD),TK1(8N_hh),TK1(910ff),TK1(911ff),TK1(912ff),TK1(PIC),TK1(IN),TK1(BOT),TK1(hsTTT) ); #else TKLST( SECTION_NAT_CODE,TK1(555),TK1(0sTTT_land),TK1(1RRRr),TK1(2sTTT_avg),TK1(911ff),TK1(912ff) ); #endif // TODO: Consider optional tokens. // manfred@met.fu-berlin.de Joerg Wichmann // http://www.top-wetter.de/themen/synopschluessel.htm // 666 1sTTT 2sTTT 3sTTT 6VVVV/VVVV 7VVVV TKLST( SECTION_AUTO_DAT,TK1(666),TK1(1snTxTxTx),TK1(2snTxTxTx),TK1(7VVVV) ); // http://www.top-wetter.de/themen/synopschluessel.htm // 80000 0RRRr 1RRRr 2RRRr 3RRRr 4RRRr 5RRRr }; #undef TK /// Actual implementation of the synop objet. Details are hidden. class synop_impl : public synop { /// All characters which are not flushed yet. std::string m_buf ; /// Words being read (Between spaces, tabs etc...) std::string m_current_word ; /// When disabled, chars pass through the object without change. bool m_enabled ; /// A chain of Synop tokens, which tries to match a group. class Chain { size_t m_idxGroup ; // Index of the Synop group. size_t m_idxTok ; // Index of the first Synop token in the group. size_t m_nxtTok ; // Index of the next Synop token in the group. priority_t m_sum_prios ; TokenProxy::TokVec::Ptr m_tokens ; Chain(); void PushElement(TokenProxy::Ptr tp) { if( ! m_tokens ) m_tokens = TokenProxy::TokVec::Ptr( new TokenProxy::TokVec ); PushItself( tp, m_tokens ); } public: /// TODO: Allocates m_tokens only if appending a first token is possible. Chain( int i, int j) : m_idxGroup(i), m_idxTok(j), m_nxtTok(j), m_sum_prios(0.0) {} const TokenProxy::TokVec::Ptr & Tokens() const { assert( m_tokens ); return m_tokens; } section_t section(void) const { return arrSynopGroups[m_idxGroup].m_section; } /// Beware that some elements might have been repeated. bool IsFinished(void) const { // TODO: Our synop_group element should be copied here. const synop_group * ptrSynopGroup = &arrSynopGroups[m_idxGroup]; if( m_nxtTok == m_idxTok ) return false ; size_t nbToks = ptrSynopGroup->m_nb_toks ; if( m_nxtTok > nbToks ) return true ; if( m_nxtTok < nbToks ) return false ; return ! ptrSynopGroup->m_tks[ m_nxtTok - 1 ].m_many; } /// Tries to add a new word at the end of a chain of tokens. TokenProxy::Ptr TryPush( RegexT::Context & rgxCtxt, const std::string & str, size_t txt_offset ) { if( IsFinished() ) return TokenProxy::Ptr(); const synop_group * ptrSynopGroup = &arrSynopGroups[m_idxGroup]; assert( m_nxtTok <= ptrSynopGroup->m_nb_toks ); if( m_nxtTok < ptrSynopGroup->m_nb_toks ) { const int reg_idx = ptrSynopGroup->m_tks[ m_nxtTok ].m_rgx_idx; if( rgxCtxt.Mtch( reg_idx, str ) ) { TokenProxy::Ptr tp = RegexT::CreateTokenProxy( reg_idx, str, txt_offset ); /// Maybe a token which must not be at the beginning of a sequence. if( ( m_nxtTok == m_idxTok ) && ( false == tp->CanComeFirst() ) ) { return TokenProxy::Ptr() ; } /// It must parse the current word and the priority must be high enough. if( tp->ParseItself() ) { PushElement( tp ); m_sum_prios += RegexT::Priority( reg_idx ); ++m_nxtTok ; /* std::cout << "DEBUG:" << __FUNCTION__ << " m_idxGroup=" << m_idxGroup << " m_idxTok=" << m_idxTok << " reg=" << reg.Name() << " str=" << str << " m_nxtTok=" << m_nxtTok << " priority=" << m_sum_prios << "\n" ; */ return tp ; } } } /// Maybe the previous pattern can be repeated if "m_many" flag ? if( m_nxtTok > m_idxTok ) { const TOKGEN & tokgen = ptrSynopGroup->m_tks[ m_nxtTok - 1 ]; int reg_idx = tokgen.m_rgx_idx; if( tokgen.m_many && rgxCtxt.Mtch( reg_idx, str ) ) { TokenProxy::Ptr tp = RegexT::CreateTokenProxy( reg_idx, str, txt_offset ); /// It must parse the current word and the priority must be high enough. if( tp->ParseItself() ) { PushElement( tp ); m_sum_prios += RegexT::Priority( reg_idx ); /* std::cout << "DEBUG:" << __FUNCTION__ << " REPET m_idxGroup=" << m_idxGroup << " m_idxTok=" << m_idxTok << " reg=" << reg.Name() << " str=" << str << " m_nxtTok=" << m_nxtTok << " m_idxTok=" << m_idxTok << " maxTks=" << ptrSynopGroup->m_nb_toks << " priority=" << m_sum_prios << "\n" ; */ return tp ; } } } /* * MAYBE THE TOKEN IS OPTIONAL. IF YES, RETRY WITH NEXT TOKEN. */ // Now if the match is not empty, we might tolerate one dummy string. if( m_nxtTok > m_idxTok + 2 ) { } // If the previous match is a dummy string, maybe this is because two tokens coalesced, // therefore we try the next token. return TokenProxy::Ptr(); } // Chain::TryPush // TODO: This is now simply the chain length, but we could refine the concept. priority_t sum_priorities(void) const { return m_sum_prios;} size_t text_begin() const { assert( ! m_tokens->empty() ); return m_tokens->front()->offset_begin(); } size_t text_end() const { assert( ! m_tokens->empty() ); return m_tokens->back()->offset_end(); } std::string test_display() const { return m_tokens->MiniDump(section(),true); } void display_chain( bool test_mode, bool kml_mode ) const { m_tokens->DumpTokVec( test_mode, section(), kml_mode ); } // This helps to check if a pattern was used or not. void increment_usage_counter(void) const { arrSynopGroups[m_idxGroup].m_usage_counter++; } typedef std::list< Chain > List ; // Adds our current object at the end of a list. Fast copy thanks to smart pointers. void ConcatToList( List & refList ) const { refList.push_back( *this ); List::iterator lastChain = refList.end(); --lastChain ; if( lastChain != refList.begin() ) { List::iterator prevChain = lastChain ; --prevChain ; lastChain->m_tokens->previous( prevChain->m_tokens ); } } }; // synop_impl::Chain Chain::List m_chains ; /// This represents the last successful chains which can be aggregated into a message. class Message : public Chain::List { // Debug purpose. std::string TstToStr(void) const { std::string res ; for( const_iterator it = begin(), en = end(); it != en; ++ it ) { res += SectionToString(it->section()); res +="=" + it->test_display() + ";"; } return res ; } /// Looks for a specific token in the tokens chain passed as an iterator. template< class TokClass > void SetIfNull( const TokClass * & refIter, const_iterator itChain ) const { const TokClass * tmpPtr = itChain->Tokens()->front()->template get_ptr< TokClass >(false); if( tmpPtr == NULL ) return ; if( refIter == NULL ) { refIter = tmpPtr ; return ; } /// In some circumstances, we might duplicate the header to split the message. LOG_WARN("Duplicate token=%s:%s, was:%s: m_nbTokens=%d:%s", typeid(TokClass).name(), tmpPtr->c_str(), refIter->c_str(), (int)m_nbTokens, TstToStr().c_str() ); refIter = tmpPtr ; // Take the closest (and last). } // Total number of tokens in the list of token chains. size_t m_nbTokens; /// Called when the end of a message is detected. void Publish(void) { const_iterator it0 = begin(); if(it0 == end() ) { LOG_DEBUG("No publish0 empty message"); return; } // Quick check if the message is very short. Beware, it it the total // number of tokens, not the number of sections. if(m_nbTokens <= 2 ) { LOG_DEBUG("No publish1 m_nbTokens=%d:%s", static_cast(m_nbTokens), TstToStr().c_str() ); return ; } // We eliminate this kind of message which is not SYNOP although the beginning is similar. // Other simple combinations might be eliminated but they are rarer. // ZCZC 603 // WWXX60 EDZW 201700 const_iterator it1 = it0; ++it1 ; if( ( it0->section() == SECTION_HEAD_GRP ) && ( it1 != end() ) && ( it1->section() == SECTION_IDENTLOC ) ) { if( m_nbTokens <= 3 ) { LOG_VERBOSE("No publish3 %s", TstToStr().c_str() ); return ; } // TODO: Store these for next run if their are missing. } if( it1 == end() ) { // For example, receiving only the following line makes no sense: // Climatological data=6RRRt#69907+8NChh#81822+9SSss#91113+9SSss#96480;+; if( it0->section() != SECTION_LAND_OBS ) { LOG_VERBOSE("No publish2 %s", TstToStr().c_str() ); return ; } // TODO: We should use the header SECTION_IDENTLOC of the previous message: // SMOS01 LOWM 190000 // AAXX 19001 // 11036 32565 73208 10000 21038 30065 40306 57008 8353/ 333 83629 // 86360 91013 91113 91209= // 11010 35561 /2504 11031 21043 39946 40345 57009= // 11120 36/17 /9901 11111 21112 39620 40386 57005= } /// This gets some crucial information from the tokens. const CLASSTK(QLLLL) * ptr_QLLLL = NULL; const CLASSTK(IIIII) * ptr_IIIII = NULL; const CLASSTK(IIiii) * ptr_IIiii = NULL; const CLASSTK(iihVV) * ptr_iihVV = NULL; const CLASSTK(MMMULaULo) * ptr_MMMULaULo = NULL; const CLASSTK(YYGGi) * ptr_YYGGi = NULL; const CLASSTK(YYGGgg) * ptr_YYGGgg = NULL; const CLASSTK(Numbered) * ptr_Numbered = NULL; // In all the chains of tokens , we try to grap some specific tokens. for ( const_iterator itChain = begin(), enChain = end(); itChain != enChain; ++itChain ) { assert( itChain->Tokens() ); SetIfNull< CLASSTK(QLLLL) >( ptr_QLLLL , itChain ); SetIfNull< CLASSTK(IIIII) >( ptr_IIIII , itChain ); SetIfNull< CLASSTK(IIiii) >( ptr_IIiii , itChain ); SetIfNull< CLASSTK(iihVV) >( ptr_iihVV , itChain ); SetIfNull< CLASSTK(MMMULaULo) >( ptr_MMMULaULo, itChain ); SetIfNull< CLASSTK(YYGGi) >( ptr_YYGGi , itChain ); SetIfNull< CLASSTK(YYGGgg) >( ptr_YYGGgg , itChain ); SetIfNull< CLASSTK(Numbered) >( ptr_Numbered , itChain ); } bool foundCoo = false ; CoordinateT::Pair newCoo ; double altitudeStation = 0.0; if( ptr_QLLLL ) { if(ptr_QLLLL->CoordinatesOK() ) { newCoo = CoordinateT::Pair( ptr_QLLLL->Longitude(), ptr_QLLLL->Latitude() ); foundCoo = true ; } } std::string kmlNam ; std::string iconNam ; std::string descrTxt ; std::string stationCountry ; bool foundIdentifier = false; /// It also indicates whether we could find the station name given the WMO indicator. if( ptr_IIiii ) { int wmoIndicInt = ptr_IIiii->WmoIndicator(); std::stringstream strmWmo ; strmWmo << std::setfill('0') << std::setw(5) << wmoIndicInt; std::string wmoIndicStr = strmWmo.str(); descrTxt = "WMO " + wmoIndicStr ; const RecordBuoy * ptrBuoy_Tok = CatalogBuoy::FindFromKey( wmoIndicStr ); const RecordWmoStation * ptrWmo_Tok = CatalogWmoStations::FindFromKey( wmoIndicInt ); /// We cannot rely on "isAutomated" to guess if it is a buoy or not. if( ptrWmo_Tok == NULL ) { if( ptrBuoy_Tok ) { foundIdentifier = true; CoordinateT::Pair tmpCoo = ptrBuoy_Tok->station_coordinates(); if(foundCoo) { double dist = tmpCoo.distance( newCoo ); if( dist > 100 ) { std::stringstream strm ; strm << "Coordinates accuracy issue with buoy: " << ptrBuoy_Tok->buoy_name() << " IIiii:" << newCoo << " Against:" << tmpCoo << " Dist:" << dist ; LOG_VERBOSE("%s", strm.str().c_str() ); } } else { foundCoo = true ; } // In both cases, we take the coordinates given by the WMO file. newCoo = tmpCoo ; altitudeStation = 0; kmlNam = ptrBuoy_Tok->title(); iconNam = ptrBuoy_Tok->type(); } else { const RecordJComm * ptrJComm_Tok = CatalogJComm::FindFromKey( wmoIndicStr ); if( ptrJComm_Tok ) { ptrJComm_Tok->SetJCommFields( kmlNam, iconNam ); if( stationCountry.empty() ) stationCountry = ptrJComm_Tok->country(); } else { kmlNam = "Automated station:" + wmoIndicStr ; iconNam = "automated"; } } } if( ptrBuoy_Tok == NULL ) { iconNam = "wmo"; if( ptrWmo_Tok ) { foundIdentifier = true; CoordinateT::Pair tmpCoo = ptrWmo_Tok->station_coordinates(); if( stationCountry.empty() ) stationCountry = ptrWmo_Tok->country(); if(foundCoo) { double dist = tmpCoo.distance( newCoo ); if( dist > 100 ) { std::stringstream strm ; strm << "Coordinates accuracy issue with WMO station: " << ptrWmo_Tok->station_name() << " IIiii:" << newCoo << " Against:" << tmpCoo << " Dist:" << dist ; LOG_VERBOSE("%s", strm.str().c_str() ); } } else { foundCoo = true ; } // In both cases, we take the coordinates given by the WMO file. newCoo = tmpCoo ; altitudeStation = ptrWmo_Tok->station_elevation(); kmlNam = ptrWmo_Tok->station_name(); } else { const RecordJComm * ptrJComm_Tok = CatalogJComm::FindFromKey( wmoIndicStr ); if( ptrJComm_Tok ) { ptrJComm_Tok->SetJCommFields( kmlNam, iconNam ); if( stationCountry.empty() ) stationCountry = ptrJComm_Tok->country(); } else { LOG_VERBOSE("Cannot find WMO station:%s", wmoIndicStr.c_str() ); kmlNam = "WMO:" + wmoIndicStr ; } } } if( ( ptrWmo_Tok != NULL ) && ( ptrBuoy_Tok != NULL ) ) { LOG_WARN("Conflit buoy/WMO"); } } std::string stationCallsign ; if( ptr_IIIII ) { std::string buoyNam ; const char * shipIdIIIII = ptr_IIIII->ShipIdentifier(); if( ! descrTxt.empty() ) descrTxt += ","; descrTxt += _("Ship "); descrTxt += shipIdIIIII; const RecordShip * ptrShip_Tok = CatalogShip::FindFromKey( shipIdIIIII ); if( ptrShip_Tok ) { stationCallsign = buoyNam = ptrShip_Tok->callsign(); if( ! ptrShip_Tok->name().empty() ) buoyNam += "," + ptrShip_Tok->name(); if( iconNam.empty() ) iconNam = "ship"; else iconNam += " ship"; if( stationCountry.empty() ) stationCountry = ptrShip_Tok->country(); } else { const RecordBuoy * ptrBuoy_Tok = CatalogBuoy::FindFromKey( shipIdIIIII ); if( ptrBuoy_Tok ) { buoyNam = ptrBuoy_Tok->title(); if( iconNam.empty() ) iconNam = "other buoy"; else iconNam += " buoy"; } } if( buoyNam.empty() ) { if( kmlNam.empty() ) { kmlNam = std::string("Ship:") + shipIdIIIII; if( iconNam.empty() ) iconNam = "ship"; else iconNam += " ship"; } else { LOG_WARN("Conflict between station %s and ship/buoy identifier %s", kmlNam.c_str(), shipIdIIIII ); } } else { if( kmlNam.empty() ) { kmlNam = buoyNam; } else { // Maybe the WMO station was there. if( foundIdentifier ) { LOG_WARN("Conflict between station %s and ship/buoy callsign %s identifier %s", kmlNam.c_str(), buoyNam.c_str(), shipIdIIIII ); } else { // We concatenate the information. Maybe this is not a conflict after all. if( foundIdentifier ) kmlNam += ",Ship:" + buoyNam ; else kmlNam = buoyNam ; } } } } if( ptr_MMMULaULo && ptr_MMMULaULo->MarsdenValid() ) { CoordinateT::Pair tmpCoo( ptr_MMMULaULo->Longitude(), ptr_MMMULaULo->Latitude() ); if(foundCoo) { double dist = tmpCoo.distance( newCoo ); if( dist > 100 ) { std::stringstream strm ; strm << "Coordinates accuracy issue with Marsden square. " << " Coordinates:"<< newCoo << " against:" << tmpCoo << " Dist:" << dist; LOG_WARN("%s", strm.str().c_str() ); } } else { foundCoo = true ; } newCoo = tmpCoo ; } // TODO: Adding time as fourth dimension: // http://earth.google.com/outreach/tutorial_time.html // TODO: Shame that we are losing this message because no coordinates. if( false == foundCoo ) { std::stringstream strm ; strm << "Error, no coordinates."; strm << " kmlNam=" << kmlNam ; strm << " descrTxt=" << descrTxt , strm << " m_nb_tokens=" << m_nbTokens << ":"; strm << TstToStr(); LOG_WARN("%s", strm.str().c_str() ); return ; } // If no time is defined, set current time. time_t tmObservation = 0 ; if( ptr_YYGGi ) { tmObservation = ptr_YYGGi->ObservationTimeUTC(); if( ptr_YYGGgg ) { time_t obsTmGGgg = ptr_YYGGgg->ObservationTimeUTC(); int days = diffTm( tmObservation, obsTmGGgg ); if(days > 1) { LOG_WARN( _("Unreliable observation time: %s and %s"), Tm2SynopTime( tmObservation ).c_str(), Tm2SynopTime( obsTmGGgg ).c_str() ); } } } else if( ptr_YYGGgg ) { tmObservation = ptr_YYGGgg->ObservationTimeUTC(); } // The name must be unique. if( kmlNam.empty() ) { std::stringstream strm ; strm << _("Station") << " " << newCoo; kmlNam = strm.str(); } if( iconNam.empty() ) iconNam = "Weather Station"; if( descrTxt.empty() ) descrTxt = _("Undetermined station"); if( synop::ptr_callback->log_adif() ) { // This builds an ADIF message. struct AdifSerializer : public Serializer, public std::string { void StartSection( const std::string & section_name ) { static_cast(*this) += section_name + ADIF_EOL; } // Will add a new line to a text message in the ADIF record. void AddItem( const char * key, const char * value, const char * unit ) { std::string & refStr = *this ; refStr += key ; refStr += "="; refStr += value ; if(unit) { refStr += " " ; refStr += unit ; } refStr += ADIF_EOL; } }; // synop_impl::Message::KmlSerializer AdifSerializer adifSerial ; /// Concatenate information from each chain. This is where the serializer kmlSerial is called. for ( const_iterator itChain = begin(), enChain = end(); itChain != enChain; ++itChain ) { itChain->display_chain(false, true); } /// For updating the logbook with received messages. QsoHelper qso(MODE_RTTY) ; if( ! stationCallsign.empty() ) qso.Push(CALL, stationCallsign ); if( ! stationCountry.empty() ) qso.Push(COUNTRY, stationCountry ); { std::stringstream strm ; strm << newCoo ; qso.Push(QTH, strm.str() ); } qso.Push(GRIDSQUARE, newCoo.locator() ); qso.Push(NAME, kmlNam ); /// If the header is clean, the message type is removed from the string. // In this context, this field cannot be used. qso.Push(XCHG1, iconNam ); // AAx, RRx, CCx, Pxx if( ptr_Numbered ) { qso.Push(SRX, ptr_Numbered->Number() ); } // Sequence of Chars and line-breaks, ASCII CR (code 13) + ASCII LF (code 10) qso.Push(NOTES, adifSerial ); } if( synop::ptr_callback->log_kml() ) { /// Writes messages to a list of key-value pairs, later displayed in KML. struct KmlSerializer : public Serializer, public KmlServer::CustomDataT { // TODO: Doubles the line width of the HTML table. void StartSection( const std::string & section_name ) { // m_freeText << section_name << "\n"; } // Will add a new line to a HTML table. void AddItem( const char * key, const char * value, const char * unit ) { std::string val = unit ? value + std::string(" ") + unit : std::string(value); Push( key, val ); } }; // synop_impl::Message::KmlSerializer KmlSerializer kmlSerial ; /// Concatenate information from each chain. This is where the serializer kmlSerial is called. for ( const_iterator itChain = begin(), enChain = end(); itChain != enChain; ++itChain ) { itChain->display_chain(false, true); } // Beware: Some WMO stations have the same name but are not mobile. KmlServer::GetInstance()->Broadcast( "Synop", tmObservation, newCoo, altitudeStation, kmlNam, iconNam, descrTxt, kmlSerial ); } } // synop_impl::Message::Publish public: ~Message() { Publish(); } /// Inconditionnaly cleans the content because too many chars could not be read. void MsgFlush() { // Should be called also after a given timeout. Publish(); Chain::List::clear(); m_nbTokens = 0; } /// When getting rid of the current message. // We might keep it or flush everything etc... void MsgFlushAndMove( const Chain & refChain ) { // Depending on the section of the last chain of the message, // and the section from this brand new chain, this decides to aggregate // the new section at the end of the message, otherwise create a new one, // and broadcast the current message. if( ! empty() ) { section_t new_sec = refChain.section(); section_t last_sec = Chain::List::back().section(); // To build messages, checks if a section can follow another one. if( 0 == sectionTransitions[new_sec][last_sec] ) { MsgFlush(); } } refChain.ConcatToList( *this ); m_nbTokens += refChain.Tokens()->size(); } }; // synop_impl::Message /// We add new chains of tokens, that is, sections, at the end of the message. Message m_current_message ; public: /// If margin is positive, this is the number of chars to be kept in the buffer for further decoding, /// because we are not sure at the moment of what they will be used for. /// If this is negative, this is the number of characters immediately after the decoded chain, /// which should be discarded: This is an end of section, '=' character. void decode_then_flush(int margin = 0 ) { // The margin is here only for display purpose. If the chars are immediately // displayed, there should not be anything in the buffer. size_t len_to_keep = margin > 0 ? margin : 0 ; Chain::List::const_iterator beg = m_chains.begin(), en = m_chains.end(); // Maybe we did not manage to decode anything. if( beg == en ) { // it might also be empty because we are in interleaved mode. if( m_buf.size() >= len_to_keep ) { disp_range( m_buf.begin(), m_buf.end() - len_to_keep ); m_buf.erase(m_buf.begin(), m_buf.end() - len_to_keep); } return ; } Chain::List::const_iterator best = beg ; priority_t best_priority = best->sum_priorities() ; // TODO: We should count the solutions of the same priority (More or less the length), // with a different beginning as ours. for( Chain::List::const_iterator it = beg; ++it != en ; ) { assert( it->Tokens() ); if( it->sum_priorities() > best_priority ) { best_priority = it->sum_priorities() ; best = it ; } }; assert( best != en ); m_current_message.MsgFlushAndMove(*best); // Maybe no chain is worth of interest. bool decoded_ok = best_priority >= MIN_PRIO ; // Counts the number of times this chain is selected. if( decoded_ok ) { best->increment_usage_counter(); } // If interleaved mode, chars are immediately printed. if( m_buf.empty() ) { if( decoded_ok ) { // This just displays the single chain in the output buffer. best->display_chain( GetTestMode(), false ); } } else { assert( len_to_keep <= m_buf.size() ); if( decoded_ok ) { // Not sure why we remove the last char. size_t txt_beg = best->text_begin(); size_t txt_end = best->text_end(); // There might have been a synchronization problem when changing params. if( (txt_beg > 0) && ( txt_beg - 1 <= m_buf.size() ) ) { disp_range( m_buf.begin(), m_buf.begin() + txt_beg - 1 ); } else { LOG_WARN("Bugcheck1: txt_beg=%d txt_end=%d margin=%d m_buf=%s", (int)txt_beg, (int)txt_end, (int)margin, m_buf.c_str() ); } // This just displays the single chain in the output buffer. best->display_chain( GetTestMode(), false ); if( (txt_beg > 0) && ( txt_beg - 1 + len_to_keep <= m_buf.size() ) ) { int to_discard = (margin < 0 ) ? - margin : 0 ; disp_range( m_buf.begin() + txt_end - 1 + to_discard , m_buf.end() - len_to_keep ); } else { LOG_WARN("Bugcheck2: txt_beg=%d txt_end=%d margin=%d m_buf=%s", (int)txt_beg, (int)txt_end, (int)margin, m_buf.c_str() ); } } else { disp_range( m_buf.begin(), m_buf.end() - len_to_keep ); } m_buf.erase(m_buf.begin(), m_buf.end() - len_to_keep); } m_chains.clear(); } // synop_impl::decode_then_flush private: // TODO: When starting a section, we should take first tokens of the same priority, in order to finish. /// Adds a new current word. tries all possible chains to which this word matches one token, even in the middle. size_t AddTokInit() { RegexT::Context rgxCtxt; // std::cout << __FUNCTION__ << "\n"; size_t nbInserts = 0 ; assert( m_chains.empty() ); const size_t buf_sz = m_buf.size(); // The same list can appear in several chains, this is intended. for( int i = 0, nbSynGrp = arrSynopGroups.size(); i < nbSynGrp; ++i ) { for( size_t j = 0, nbToks = arrSynopGroups[i].m_nb_toks; j < nbToks; ++j ) { Chain tmpChain( i, j ); if( tmpChain.TryPush( rgxCtxt, m_current_word, buf_sz ) ) { m_chains.push_back( tmpChain ); ++nbInserts; } } } // std::cout << "DEBUG:" << __FUNCTION__ << ":" << m_current_word << ":at:" << m_buf.size() << " m_buf=" << m_buf << " nbIns=" << nbInserts << " nbChains=" << m_chains.size() << "\n"; return nbInserts; } // synop_impl::AddTokInit /// Tries to add the last word to all possible token chains. size_t AddOtherTok() { class CtxtDerived : public RegexT::Context { struct BestStartTokenT { priority_t m_minPrio ; // Must be negative at startup. size_t m_newReg ; public: BestStartTokenT() : m_minPrio(-1.0), m_newReg(~0) {} void TstSwapPrio( priority_t newPrio, size_t newReg ) { if( m_minPrio < newPrio ) { m_minPrio = newPrio; m_newReg = newReg; } } }; /// This contains for each section the regex which matches the best // the current work, and starting a chain whose section immediately follow ours. BestStartTokenT m_bstStartToken[ SECTION_SECT_NBR ]; section_t m_currSection ; public: CtxtDerived() : m_currSection( static_cast(-1) ) {} void CmpSwapPriority( size_t newReg, section_t newSection ) { priority_t newPrio = RegexT::Priority( newReg ); /// This iterates on all sections which might immediately precede this one. for( size_t precedSec = 0; precedSec < SECTION_SECT_NBR; ++precedSec ) { // Does it make sense to have one section type following another ? if( 0 == sectionTransitions[newSection][precedSec] ) continue ; m_bstStartToken[ precedSec ].TstSwapPrio( newPrio, newReg ); } } /// Does the section comes just before ours ? void SetDistance( section_t predSection ) { m_currSection = predSection ; } // Called in two contexts: // When looking for a better beginning regex. // Or as a virtual in TryPush. virtual bool Mtch( size_t reg_idx, const std::string & str ) { if( m_bstStartToken[ m_currSection ].m_minPrio > RegexT::Priority( reg_idx ) ) { /* * We could add a condition on the length because of this: Expect [IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ Actual [IIIII+YYGGi+99LLL+QLLLL+ 41/96 222Dv+1PPHH+2PPHH+ 4PPPP+5appp+7wwWW+ */ /* std::cout << " prio=" << m_bstStartToken[ m_currSection ].m_minPrio << " str=" << str << " m_newReg:" << m_bstStartToken[ m_currSection ].m_newReg << " prioRgx=" << RegexT::Name(m_bstStartToken[ m_currSection ].m_newReg) << " currSec=" << SectionToString(m_currSection) << " against:" << RegexT::Name(reg_idx) << " reg_idx:" << reg_idx << " oldPrio:" << RegexT::Priority( reg_idx ) << "\n"; */ return false ; } return RegexT::Context::Mtch( reg_idx, str ); }; }; // CtxtDerived CtxtDerived rgxCtxtDerived; const size_t buf_sz = m_buf.size(); /// What happens if it matches the beginning if a chain // NOTE: We suppose that the beginning is never multiple ("Many"). for( int idxGrp = 0, nbSynGrp = arrSynopGroups.size(); idxGrp < nbSynGrp; ++idxGrp ) { const synop_group * ptrSynopGroup = &arrSynopGroups[idxGrp]; assert( ptrSynopGroup->m_nb_toks > 0 ); assert( ptrSynopGroup->m_tks[ 0 ].m_many == false ); const int reg_idx = ptrSynopGroup->m_tks[ 0 ].m_rgx_idx; if( rgxCtxtDerived.Mtch(reg_idx, m_current_word ) ) { TokenProxy::Ptr tp = RegexT::CreateTokenProxy( reg_idx, m_current_word, buf_sz ); if( tp->ParseItself() ) { rgxCtxtDerived.CmpSwapPriority( reg_idx, ptrSynopGroup->m_section ); } } } /// Contains the list of chains to which we could not add the current (and last) word. typedef std::list< Chain::List::iterator > ChainsNoInsrtsT ; ChainsNoInsrtsT chainsNoInsrts ; /// We try to add the new word to all potential solutions. size_t nbInserts = 0 ; for( Chain::List::iterator it = m_chains.begin(), en = m_chains.end(); it!= en; ++it ) { /* Beware: Maybe the current word matches an intermediate token which is also the beginning of another chain. In this case, it does not count. It should not be a problem because the priorities are identical. */ rgxCtxtDerived.SetDistance( it->section() ); if( it->TryPush( rgxCtxtDerived, m_current_word, buf_sz ) ) { ++nbInserts; } else { chainsNoInsrts.push_back( it ); } } if( nbInserts != 0 ) { /// Removes the chains which cannot possibly match the current suite of tokens. for( ChainsNoInsrtsT::iterator it = chainsNoInsrts.begin(), en = chainsNoInsrts.end(); it != en; ++it ) { m_chains.erase( *it ); } } return nbInserts; } // synop_impl::AddOtherTok public: synop_impl() { /// Display each decoded key/value/unit item, to a stream, for debug logging. struct SynopSerializer : public Serializer { void StartSection( const std::string & section_name ) { std::string str = section_name + "\n"; disp_range( str.begin(), str.end(), true ); } /// Print in bold chars or special color. void AddItem( const char * key, const char * value, const char * unit ) { std::stringstream strm ; strm << '\t' << key << '=' << value << ' ' << ( unit ? unit : "" ) << '\n'; std::string str = strm.str(); disp_range( str.begin(), str.end(), true ); } }; // synop_impl::SynopSerializer /// It registers automatically as the lowest level serializer. static SynopSerializer fldigiSerial ; init_patterns(); m_enabled = true ; } virtual ~synop_impl() {}; /// Called as a virtual. void init() { cleanup(); } void cleanup() { m_buf.clear(); m_current_word.clear(); m_chains.clear(); m_enabled = false ; } /// Adds a received character to the Synop decoding buffer. void add( char c) { if( ! m_enabled ) { cleanup(); m_enabled = true ; } static bool was_interleaved_before = false ; bool is_interleaved_now = synop::ptr_callback->interleaved(); // I if( is_interleaved_now ) { // Maybe has to display and flush the internal buffer. if( ! was_interleaved_before ) { // Of course it does not clears the current message. disp_range( m_buf.begin(), m_buf.begin() ); m_buf.clear(); } } was_interleaved_before = is_interleaved_now; bool noChains = m_chains.empty(); // No chance to terminate the current message, too many chars not parsed. if( noChains && ( m_buf.size() > 20 ) ) { m_current_message.MsgFlush(); } /// All delimiters are stored in the buffer, but the split loses them. if( ! is_interleaved_now ) { m_buf += c ; } else { std::string one_char( 1, c ); disp_range( one_char.begin(), one_char.end(), false ); } // Note that some chars are not part of Baudot (ITA2) charset and will never appear. switch(c) { case ';' : // Our RTTY decoder uses this for '='. c = '=' ; // TODO: Might as well remove '=' from all regular expressions. case '=' : case ' ' : case '\t' : // TODO: Frequently (But not always, this marks a section end). case '\n' : case '\r' : if( ! m_current_word.empty() ) { size_t nbInserts = 0 ; // The same list can appear in several chains, this is intended. if( noChains ) { nbInserts = AddTokInit(); } else { nbInserts = AddOtherTok(); } if( c == '=' ) { // -1, no display of '=', whose length is one. decode_then_flush(-1); } else if( nbInserts == 0 ) { if( noChains ) { /// There was no chains before. decode_then_flush(); } else { // If there was no insertion, because // the new word did not match any existing chain. // Then we will retry with this word // and update the buffer too. decode_then_flush( m_current_word.size() + 1 ); // If cannot match anything at first stage, // then no need to keep the buffer. if( 0 == AddTokInit() ) { decode_then_flush(); } // Otherwise we have started a new chain. } } m_current_word.clear(); } break ; default : if( m_current_word.size() > 10 ) { decode_then_flush(); m_current_word.clear(); } else { m_current_word += c ; } break ; } } /// When Synop decoding is not needed. void flush(bool finish_decoding) { if( finish_decoding ) { decode_then_flush(); flush(false); } else { disp_range(m_buf.begin(), m_buf.end() ); m_current_message.MsgFlush(); cleanup(); } } bool enabled(void) const { return m_enabled; } }; synop * synop::instance() { /// The destructor should not do any harm because we have no control on when it is called. static synop_impl g_synop ; return &g_synop ; }; /// Prints the number of times each regular expression is used, so the unused ones can be removed. void synop::regex_usage(void) { for( size_t idxGrp = 0; idxGrp < arrSynopGroups.size(); ++idxGrp ) { const synop_group * ptrSynopGroup = &arrSynopGroups[idxGrp]; if( ptrSynopGroup-> m_usage_counter > 0 ) continue ; std::cout << "DEBUG:" << "Unused:" << " idxGrp=" << idxGrp << ' ' << *ptrSynopGroup << '\n' ; } } /// This helps in debug mode: Only the regex name is displayed. bool synop::m_test_mode = false ; const synop_callback * synop::ptr_callback ; /* Useful links about decoding: http://www.kmlvalidator.com/home.htm http://www.ndbc.noaa.gov/station_page.php?station=MBLA1 http://www.ncdc.noaa.gov/homr/ http://www.ncdc.noaa.gov/oa/climate/surfaceinventories.html http://www.nodc.noaa.gov/BUOY/ http://www.nodc.noaa.gov/BUOY/all_buoy_info_latlon.txt http://www.sailwx.info/shiptrack/researchships.phtml http://www.meteo2.shom.fr/qctools/last-report-list_surfmar.htm http://weather.noaa.gov/pub/logs/shipstats/shipstat.out.201206301330.csv http://www.wmo.int/pages/prog/amp/mmop/buoy-ids.html http://www.aoml.noaa.gov/hrd/format/tempdrop_format.html http://www.ominous-valve.com/wx_codes.txt http://www.vos.noaa.gov/ObsHB-508/ObservingHandbook1_2010_508_compliant.pdf http://www.nws.noaa.gov/tg/head.html http://weather.unisys.com/noaaport/text_summary.php http://www.wmo.int/pages/prog/www/ois/Operational_Information/VolumeC1/CCCC_en.html // http://www.wmo.int/pages/prog%2Fwww/WMOCodes/Manual/Volume-I-selection/Sel2.pdf Other information: See Klingenfuss Thunder (corresponding in the SYNOP weather code to group 7, WW=17). */ fldigi-4.2.05/src/synop-src/synop_tool.cxx0000664000175000017500000015210614611711171015445 00000000000000// ---------------------------------------------------------------------------- // synop.cxx -- SYNOP decoding // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "synop.h" #include "kmlserver.h" #include "field_def.h" #define G_N_ELEMENTS(arr) sizeof(arr)/sizeof(*arr) // ---------------------------------------------------------------------------- static std::ostream * dbg_strm = &std::cout ; struct tst_callback : public synop_callback { // Callback for writing decoded synop messages. void print(const char * str, size_t nb, bool bold ) const { dbg_strm->write( str, nb ); } bool log_adif(void) const { return true ;} bool log_kml(void) const { return true ;} }; // ---------------------------------------------------------------------------- static void test_coordinates() { CoordinateT::Pair jn45op( "JN45op" ); if( (int)( jn45op.longitude().angle() * 100 ) != 920 ) { std::cout << "Bad longitude\n" ; exit(EXIT_FAILURE); } if( (int)( jn45op.latitude().angle() * 100 ) != 4564 ) { std::cout << "Bad latitude\n" ; exit(EXIT_FAILURE); } std::cout << "Coordinates OK\n"; } // ---------------------------------------------------------------------------- static const struct { int m_wmo_indicator ; const char * m_name ; } wmo_tests[] = { { 62722, "Aroma" }, { 95613, "Pemberton" }, { 41939, "Madaripur" }, { 71121, "Edmonton Namao Alta." } }; static const size_t wmo_tests_nb = G_N_ELEMENTS(wmo_tests); static void test_wmo(void) try { for( size_t i = 0; i < wmo_tests_nb; ++i ) { const std::string & wmo_name = SynopDB::IndicatorToName( wmo_tests[i].m_wmo_indicator ); std::cout << "wmo_name=" << wmo_name << "\n"; std::cout << SynopDB::IndicatorToCoordinates( wmo_tests[i].m_wmo_indicator ) << "\n"; if( wmo_name != wmo_tests[i].m_name ) { std::cout << wmo_name << '\n'; std::cout << wmo_tests[i].m_name << '\n'; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << wmo_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing wmo loading\n"; return ; } // ---------------------------------------------------------------------------- static const struct { const char * m_buoy_id ; const char * m_name ; } buoy_tests[] = { { "44022", "Execution Rocks" }, { "kcmb", "East Cameron 47JP (Apache Corp)" } }; static const size_t buoy_tests_nb = G_N_ELEMENTS(buoy_tests); static void test_buoy(void) try { for( size_t i = 0; i < buoy_tests_nb; ++i ) { const std::string & buoy_name = SynopDB::BuoyToName( buoy_tests[i].m_buoy_id ); std::cout << "buoy_name=" << buoy_name << "\n"; if( buoy_name != buoy_tests[i].m_name ) { std::cout << buoy_name << '\n'; std::cout << buoy_tests[i].m_name << '\n'; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << buoy_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing buoy loading\n"; return ; } // ---------------------------------------------------------------------------- static const struct { const char * m_ship_callsign ; const char * m_name ; } ship_tests[] = { { "3EPD8", "Trinity Arrow" }, { "WYP8657", "James R. Barker" } }; static const size_t ship_tests_nb = G_N_ELEMENTS(ship_tests); static void test_ship(void) try { for( size_t i = 0; i < ship_tests_nb; ++i ) { const std::string & ship_name = SynopDB::ShipToName( ship_tests[i].m_ship_callsign ); std::cout << "ship_name=" << ship_name << "\n"; if( ship_name != ship_tests[i].m_name ) { std::cout << ship_tests[i].m_ship_callsign << ".\n"; std::cout << ship_name << ".\n"; std::cout << ship_tests[i].m_name << ".\n"; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << ship_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing ship loading\n"; return ; } // ---------------------------------------------------------------------------- static const struct { const char * m_jcomm_callsign ; const char * m_name ; } jcomm_tests[] = { { "13002", "TAO21N23W" }, { "13590", "ARGOS:71125" } }; static const size_t jcomm_tests_nb = G_N_ELEMENTS(jcomm_tests); static void test_jcomm(void) try { for( size_t i = 0; i < jcomm_tests_nb; ++i ) { const std::string & jcomm_name = SynopDB::JCommToName( jcomm_tests[i].m_jcomm_callsign ); std::cout << "jcomm_name=" << jcomm_name << "\n"; if( jcomm_name != jcomm_tests[i].m_name ) { std::cout << jcomm_tests[i].m_jcomm_callsign << ".\n"; std::cout << jcomm_name << ".\n"; std::cout << jcomm_tests[i].m_name << ".\n"; std::cout << "ERROR\n"; exit(1) ; } } std::cout << "Tested " << jcomm_tests_nb << " records\n"; } catch(...) { std::cout << "Error when testing jcomm loading\n"; return ; } // ---------------------------------------------------------------------------- // Used in a special mode where the synop decoder just prints output the name of the tokens. struct synop_test { int m_expected_nb_msgs ; const char * m_input ; const char * m_output ; }; static const synop_test tests_arr_full[] = { { 1, "08495 12575 72512 10171 20128 30242 40250 57005 60002 83502 91750\n" " 333 10182 81622 83633 87072=\n", "Day of the month: 11 Observation time: 18 hr\n" "Weather station: 08495 LXGB GIBRALTAR (CIV/MIL) GI\n" "Latitude: 3609N Longitude: 00521W Elevation: 5 m\n" "Cloud base: 600 - 999 m (2000 - 3333 ft).\n" "Horizontal visibility: 25 km.\n" "Total cloud cover: 7/8ths or more, but not 8/8ths.\n" "Wind direction: 250.\n" "Wind speed: 12 knots, from anemometer.\n" "Air temperature: 17.1 C.\n" "Dewpoint temperature: 12.8 C.\n" "Sea level pressure: 1025.0 hPa.\n" "Pressure change over last 3 hours: -0.5 hPa, decreasing steadily.\n" "Present weather: not significant.\n" "Past weather: not significant.\n" "Low cloud type: stratocumulus other than stratocumulus cumulogenitus.\n" "Middle cloud type: no altocumulus, altostratus or nimbostratus.\n" "High cloud type: cirrus spissatus, or cirrus castellanus or cirrus floccus.\n" "Maximum temperature: 18.2 C.\n" }, { 1, "16597 32562 33113 10139 20097 30053 40140 53022 81130 333 10170 81826\n" " 83357 91132 91531 =\n", "Day of the month: 11 Observation time: 18 hr\n" "Weather station: 16597 LMML LUQA/MALTA ML\n" "Latitude: 3551N Longitude: 01429E Elevation: 91 m\n" "Cloud base: 600 - 999 m (2000 - 3333 ft).\n" "Horizontal visibility: 12 km.\n" "Total cloud cover: 3/8ths.\n" "Wind direction: 310.\n" "Wind speed: 13 knots, from anemometer.\n" "Air temperature: 13.9 C.\n" "Dewpoint temperature: 9.7 C.\n" "Sea level pressure: 1014.0 hPa.\n" "Pressure change over last 3 hours: 2.2 hPa, decreasing or steady, then increasing.\n" "Precipitation amount: 0.0 mm.\n" "Present weather: not significant.\n" "Past weather: not significant.\n" "Low cloud type: cumulus humulis or fractus (no vertical development).\n" "Middle cloud type: altocumulus translucidous at one level.\n" "High cloud type: no cirrus, cirrocumulus or cirrostratus.\n" "Maximum temperature: 17.0 C.\n" } }; static const size_t nb_tests_full = G_N_ELEMENTS(tests_arr_full); /* * TODO: Put apart the tests with errors. Ideally we should generate them starting from good patterns. */ static const synop_test tests_arr[] = { { 0, "a b c d\n\ne f\n", "a b c d\n\ne f\n" }, { 0, "a b 20123 99536 e f\n20123 99536\ng h\n", "a b YYGGi+99LLL+ e f\nYYGGi+99LLL+\ng h\n" }, { 0, "20123\txyz 20123 30101\nx", "20123\txyz IIiii+YYGGi+\nx" }, { 1, "a b 20123 99536 70307 d e f\n", "a b YYGGi+99LLL+QLLLL+ d e f\n" }, { 0, "0393) 32375 71902 10140 20081 30101 40125 57007 878//\n", "0393) iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" }, { 1, "AMOUK36 20184 99556 70051 46/// ///// 10114 20068 40134 54001;\n", "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" }, { 0, "81/1/ 222// 00156 2//// 3//// 4//// 5//// 6//// 80220 ICE /////;\n", "81/1/ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+6IEER+8aTTT+ICE+cSbDz+\n" }, { 1, "03075 15981 /1212 10086 20041 30090 40134 56007 60002 91750\n" "333 10099 82/68;\n\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+\n" "333+1sTTT_max+8NChh+\n\n" }, { 0, "333 69937 81/14 87/60;\n", "333+6RRRt+8NChh+8NChh+\n" }, { 0, "22273 ICE 52//2;\n", "222Dv+ICE+cSbDz+\n" }, { 1, "03204 12580 12505 10117 20064 30103 40123 57006 60002 81100 91750\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+9GGgg+\n" }, { 0, "333 21153 42021 70000 91105;\n", "333+2sTTT_min+4Esss+7RRRR+9SSss+\n" }, { 0, "333 21061 43094 70000 91102;\n", "333+2sTTT_min+4Esss+7RRRR+9SSss+\n" }, { 0, "10015 21014 30134 40152 52009 333 21006 91114;\n", "1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+9SSss+\n" }, { 1, "01102 46/// /1410 10058 20006 30069 40089 52006 333 20051 91116;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+9SSss+\n" }, { 0, "333 20085 91710;\n", "333+2sTTT_min+9SSss+\n" }, { 1, "SNCN19 CWAO 280023\n" "OOXX\n" "MRP43 27221 99181 70159 ///// 00101\n" "26/// /2504 10242 29081 30139 92200 333 60000=\n", "TTAAii+CCCC+YYGGgg+\n" "OOXX+IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" }, { 0, // Cannot find WMO station:72358 "ZCZC\n" "SM 190600\n" "AAXX 19064\n" "72358 14/// /1019 10244 29095 60071 7////\n" "333 10297 20236 3/025 55300 2//// 70082 91129 91219\n" "555 00245 1011/ 20255 91129 91219\n" "666 10245 20242 7////=\n" "NNNN\n", "ZCZC+\n" "SM 190600\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+6RRRt+7wwWW+\n" "333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+7RRRR+9SSss+9SSss+\n" "555+0sTTT_land+1RRRr+2sTTT_avg+911ff+912ff+\n" "666+1snTxTxTx+2snTxTxTx+7VVVV+\n" "NNNN+\n" }, { 1, "04202 NIL;\n" "04203 46/// /1510 11048 21067 30142 40160 52006;\n", "IIiii+NIL+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" }, { 1, "01482 46/// /0510 10059 20014 30021 40030 57005 333 20059 91115;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+9SSss+\n" }, { 1, "03091 15981 /1208 10090 20044 30053 40133 57007 60002 91750\n" "333 10107 55310 21294 8//99;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+\n" "333+1sTTT_max+553SS+2FFFF+8NChh+\n" }, { 1, "AAXX 15064\n\n" "06011 05584 50805 10064 20008 30136 40205 57012 6///2\n", "AAXX+YYGGi+\n\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+\n" }, { 1, "AAXX 27064\n\n" "04018 42584 62909 10061 20035 40224 52020 86500 555 3//11 8662.04048 4211 QWOQU QPPYU WPPYE\n", "AAXX+YYGGi+\n\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+8NCCC+ 555+3Ejjj+ 8662.04048 4211 QWOQU QPPYU WPPYE\n" }, { 1, "AAXX 26184\n\n" "04018 21245 82021 10080 20076 40173 58016 72052 886// 333 10107 20079 69918 555 3//22 88703;\n", "AAXX+YYGGi+\n\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+ 555+3Ejjj+8NChh+\n" }, { 1, "06060 01675 60809 10191 20126 30053 40115895000 69902 72162 82172\n\n" " 333 10228 20130 69907 82840 85358;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+ 40115895000 6RRRt+7wwWW+8NCCC+\n\n" " 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+ 85358;\n" }, { 1, "06070 05970 50506 10163 20104 30096 40126 57003 6///2\n\n" " 333 10201 20122 6///7 85/67;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+\n\n" " 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+\n" }, { 2, "BSH03 20001 99540 10081 46/// ///// 22200 00067 20501 70003;\n\n" "BSH05 20001 99549 10082 46/// ///// 22200 20601 70003;\n", "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+ 222Dv+0sTTT+2PPHH+70HHH+\n\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+ 222Dv+2PPHH+70HHH+\n" }, { 1, "13600 20123 99328 70293 46/// ///// 40331 52003\n" "222// 00200;\n", "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+4PPPP+5appp+\n" "222Dv+0sTTT+\n" }, { 1, "SMMJ01 LWOH 190000\n" "AAXX 1900\n" "13579 32998 03606 11106 21153 39397 40298 52004=\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX 1900\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" }, { 1, "SMML01 LMMM 190000\n" "AAXX 19004\n" "16597 32670 10403 10069 21015 30177 40268 52009 81500 333 81640 =\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+8NChh+ =\n" }, { 5, "SMOS01 LOWM 190000\n" "AAXX 19001\n" "11036 32565 73208 10000 21038 30065 40306 57008 8353/ 333 83629\n" "86360 91013 91113 91209=\n" "11010 35561 /2504 11031 21043 39946 40345 57009=\n" "11120 36/17 /9901 11111 21112 39620 40386 57005=\n" "11150 36429 /1802 11050 21055 39790 40363 57005=\n" "11240 36966 /1703 11031 21060 39870 40310 57004=\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+8NChh+8NChh+9SSss+9SSss+9SSss+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" }, { 1, "SNVD01 KWBC 190700\n" "BBXX\n" "S6IG 19071 99278 70923 41/9/ /2603 10193 20100 40160 50001 7////\n" "22234 04239=\n", "TTAAii+CCCC+YYGGgg+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+\n" "222Dv+0sTTT+\n" }, { 1, "AAXX 23004 47411 15/84 /3603 10144 20114 30043 40074 50000 60012 333 20126=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+ 333+2sTTT_min+\n" }, { 1, "AAXX 22184 47409 11/50 80501 10090 20086 30023 40076 57002 69951 78085 887//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" }, { 1, "SMDL40 EDZW 201800\n" "AAXX 20181\n" "10004 46/60 /0408 10124 20107 30077 40077 57015\n" "222// 00103\n" "333 10141 20106 55304;\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "222Dv+0sTTT+\n" "333+1sTTT_max+2sTTT_min+553SS+\n" }, { 1, "10147 12882 50605 10213 20111 30048 40065 58008 69902 81031\n" "333 10265 20152 30017 55304 20454 30310 41284 81358 84076;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+\n" "333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+3FFFF+4FFFF+8NChh+8NChh+\n" }, { 1, "10200 07961 20503 10204 20155 30065 40063 55009 69932 70060\n" "333 10215 20130 3/012 553// 2//// 3//// 69907 82/60;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+\n" "333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+3FFFF+6RRRt+8NChh+\n" }, { 1, "03302 15973 /0106 10133 20069 30105 40117 57002 60002 91750\n" "333 10143 55310 21364 8//99;\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+\n" "333+1sTTT_max+553SS+2FFFF+8NChh+\n" // "333+1sTTT_max+55jjj+jjjjj+8NChh+\n" }, { 0, "333 10188 91107;\n", "333+1sTTT_max+9SSss+\n" }, { 1, "AAXX 23061 15108 02298 62702 10135 20135 38165 48563 53002 60022 86500 333 10151 20131 30/// 60007 70022 95080 444 86154=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+2sTTT_min+3Ejjj+6RRRt+7RRRR+9SSss+ 444+NCHHC+\n" }, { 1, "AAXX 23051 15346 22997 03601 10237 20171 39879 40154 52011 333 60005 91002 91102 95090=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+6RRRt+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 23034 47090 32665 61407 10231 20206 30062 40083 57008 82501=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" }, { 1, "AAXX 23004 47155 32962 60903 10241 20175 30051 40093 57004 80001 333 20194 30034=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+2sTTT_min+3Ejjj+\n" }, { 1, "AAXX 22124 47090 12668 60000 10200 20189 30080 40101 51003 69912 86500 333 10227 31020 92020=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+3Ejjj+9SSss+\n" }, { 1, "AAXX 22124 47104 11650 62902 10193 20174 30008 40099 53003 69952 71022 85500 333 10247 30020=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+1sTTT_max+3Ejjj+\n" }, { 1, "AAXX 23004 47127 329// /0001 10248 20175 39959 40090 57009 333 20189 3/028=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+2sTTT_min+3Ejjj+\n" }, { 1, "AAXX 22181 26029 27/70 /0704 10155 20073 30150 40178 57008 70000 333 10167 20133 60007 91109 555 20133 50142= \n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+1sTTT_max+2sTTT_min+6RRRt+9SSss+ 555+2sTTT_avg+5jjjj+ \n" }, { 1, "AAXX 22151 26045 27/81 00505 10187 20068 30193 40195 56008 70000 80/// 333 10190 20104 60007 80/// 555 1/036 20104 3/010 50134=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+\n" }, { 1, "AAXX 22181 26058 27/84 00505 10176 20076 30175 40182 58007 70000 80/// 333 10199 20158 60007 80/// 91109 555 1/018 20158 3/018 50162 52018=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+9SSss+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+5jjjj+\n" }, { 1, "AAXX 22124 47407 11/60 82904 10150 20130 39900 40065 53006 69902 72582 886// 333 10188=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 23034 08055 NIL=\n", "AAXX+YYGGi+ IIiii+NIL+\n" }, { 1, "AAXX 23074 08045 46/// /2102 10139 20110 39933 40241 53003 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 555+6GGmm+\n" }, { 1, "AAXX 22184 08042 02680 23609 10161 20084 39815 40246 53003 60002 81508 333 10183 60007=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+6RRRt+\n" }, { 1, "AAXX 22184 08140 12970 33006 10260 21017 39231 48564 55001 60002 80001 333 10269=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 22124 08085 02580 23210 10221 20100 39696 40213 57005 60001 81101 333 60007=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+6RRRt+\n" }, { 1, "AAXX 22124 08130 12970 00406 10220 20070 39462 40213 58005 60001 333 50620=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+ 333+5jjjj+\n" }, { 1, "AAXX 23064 08141 12960 23504 10106 20077 39383 40240 52007 60002 80008 333 20103 30009 55141 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+55jjj+jjjjj+\n" }, { 1, "AAXX 23064 08160 12970 52812 10163 20102 39928 40232 53004 60002 80008 333 20157 55138 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+55jjj+jjjjj+\n" }, { 1, "AAXX 23064 08184 02980 20000 10204 20125 30068 40219 5//// 60002 80001 333 20152 3/015 55087 60007 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+55jjj+jjjjj+7RRRR+\n" }, { 1, "AAXX 22124 08202 02970 11104 10243 20044 39301 42842 58006 60001 80001 333 50880 60007=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+5jjjj+6RRRt+\n" }, { 1, "AAXX 22154 07330 22680 32612 10198 20110 30165 40237 52003 83100 333 60007 83840 90710 91121 93100 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+6RRRt+8NChh+9SSss+9SSss+9SSss+ 555+6GGmm+\n" }, { 1, "AAXX 23064 70174 32766 60000 10206 20044 39892 40131 56007 90553 333 10217 20067 555 92306=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+9GGgg+ 333+1sTTT_max+2sTTT_min+ 555+9SSss+\n" }, { 0, // Cannot find WMO station:91320 "AAXX 22124 91320 32474 80808 10283 20261 30122 40127 83101 333 562/9 58007 83815 85073 555 92212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+5jjjj+8NChh+8NChh+ 555+9SSss+\n" }, { 1, "AAXX 22214 47409 41/50 80102 10094 20091 30030 40083 51007 72588 887//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+\n" }, { 1, "AAXX 22184 08015 12560 80204 10146 20100 39854 40255 54000 60002 8277/ 333 10178=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 22181 26124 01/84 10504 10188 20047 30140 40169 57002 60002 70200 80008 333 10227 20178 60007 80/// 91110 555 1/023 20178 3/022 50160 52020=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+9SSss+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+5jjjj+\n" }, { 1, "AAXX 22091 26231 21/81 00605 10206 20078 30173 40187 57007 70200 333 10211 20060 60007 80/// 91008 91108 555 1/049 20060 3/005 50160= \n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+1sTTT_max+2sTTT_min+6RRRt+8NChh+9SSss+9SSss+ 555+1VVff+2sTTT_avg+3Ejjj+5jjjj+ \n" }, { 1, "AAXX 22154 64500 42460 42006 10275 20211 30108 40120 84500 333 58008 83611 84630=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+8NChh+8NChh+\n" }, { 1, "AAXX 22184 64550 32458 8//// 10248 20231 30//0 40//0 885// 333 10274 5//// 84610 88623=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+1sTTT_max+5jjjj+8NChh+8NChh+\n" }, { 1, "AAXX 22094 64550 42460 8//// 10250 20234 30//0 40//0 888// 333 5//// 84813 88626 94939 95839=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+8NChh+8NChh+9SSss+9SSss+\n" }, { 1, "AAXX 22134 61901 41580 71116 10189 20127 39699 40205 72582 878// 91250 333 58003 81822 87635 91026 90710 91133=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+7wwWW+8NCCC+9GGgg+ 333+5jjjj+8NChh+8NChh+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 27064 65222 11458 70000 10237 20234 3//// 4//// 60092 76066 86538 333 20233 5//// 86610=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+6RRRt+7wwWW+8NCCC+ 333+2sTTT_min+5jjjj+8NChh+\n" }, { 0, // Cannot find WMO station:65213 "AAXX 27094 65213 42460 72004 10265 20236 3//// 4//// 875// 333 5//// 87612=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+8NCCC+ 333+5jjjj+8NChh+\n" }, { 1, "AAXX 27094 91582 24570 /0810 10227 20178 30135 40170 50009 700// 333 69907 90710 91120 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+6RRRt+9SSss+9SSss+ 555+6GGmm+\n" }, { 1, "AAXX 27094 62318 32560 43110 10300 20231 40104 54000 84800=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+8NCCC+\n" }, { 1, "AAXX 22154 08015 41558 80306 10148 20094 39854 40255 52003 70522 8271/=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+\n" }, { 1, "AAXX 23064 08015 11550 52802 10122 20113 39848 40252 54000 60002 71022 82806 333 20118 30010 50144 55016 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+2sTTT_min+3Ejjj+5jjjj+55jjj+jjjjj+\n" }, { 1, "AAXX 22154 08001 42475 13207 10183 20109 30168 40248 55000 81541=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" }, { 1, "AAXX 22124 72654 15966 60000 10167 20150 39718 40175 53006 69931 91155 333 10278 20139 70003 555 92212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+9GGgg+ 333+1sTTT_max+2sTTT_min+7RRRR+ 555+9SSss+\n" }, { 1, "AAXX 22181 15015 02598 53502 10239 20169 39573 42804 52009 60002 84301 333 10269 20226 30042 60007 91003 91105=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+2sTTT_min+3Ejjj+6RRRt+9SSss+9SSss+\n" }, { 1, "AAXX 22184 08213 12770 23108 10273 21007 39056 48560 53001 60002 81041 333 10293=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+\n" }, { 1, "AAXX 22184 08215 12870 12210 10201 21023 38179 48556 53002 60002 80005 333 10230 95000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+9SSss+\n" }, { 1, "AAXX 23064 08231 12967 12401 10161 20130 39150 48569 53005 60002 80001 333 20161 30016 50904 55109 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+5jjjj+55jjj+jjjjj+\n" }, { 1, "AAXX 23064 08284 02470 12802 10216 20159 30154 40227 53013 60002 81600 333 20195 30019 50484 55082 60007 70000=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+2sTTT_min+3Ejjj+5jjjj+55jjj+jjjjj+7RRRR+\n" }, { 1, "AAXX 23061 10004 46/29 /2313 10143 20114 30153 40153 53011 222// 00140 333 10153 20137 55069 55308 91117 91214=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+1sTTT_max+2sTTT_min+55jjj+jjjjj+9SSss+9SSss+\n" }, { 1, "AAXX 23021 10004 46/60 /2213 10147 20124 30139 40139 53002 222// 00140 333 55300 91116 91213=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+553SS+9SSss+9SSss+\n" }, { 1, "AAXX 22091 10004 46/58 /2011 10145 20113 30110 40110 51013 222// 00137 333 20133 55306 91117 91213=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+2sTTT_min+553SS+9SSss+9SSss+\n" }, { 1, "AAXX 23061 10007 46/59 /2110 10138 20116 30158 40158 51008 222// 00130 333 10151 20133 55068 55300 91114 91211=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+1sTTT_max+2sTTT_min+55jjj+jjjjj+9SSss+9SSss+\n" }, { 1, "AAXX 22181 10007 46/57 /1903 10142 20113 30145 40145 51002 222// 00136 333 10147 20125 55301 91116 91212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 222Dv+0sTTT+ 333+1sTTT_max+2sTTT_min+553SS+9SSss+9SSss+\n" }, { 1, "AAXX 23081 10015 42560 72111 10145 20120 30162 40172 53010 81275 333 55307 21589 30922 81828 84366 85071 91113 91211=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+553SS+2FFFF+3FFFF+8NChh+8NChh+8NChh+9SSss+9SSss+\n" }, { 1, "AAXX 22151 10015 21580 52303 10156 20110 30138 40148 51008 72598 82972 333 55304 21373 30784 60017 82930 83075 91114 91211 96481=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+8NCCC+ 333+553SS+2FFFF+3FFFF+6RRRt+8NChh+8NChh+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 23081 10022 47466 82109 10149 20125 30161 40170 53009 72365 333 55301 20826 30718 85/16 87/21 88/30 91113=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+7wwWW+ 333+553SS+2FFFF+3FFFF+8NChh+8NChh+8NChh+9SSss+\n" }, { 1, "AAXX 22171 10022 45977 02105 10169 20109 30142 40151 50002 333 55307 21236 30490=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+553SS+2FFFF+3FFFF+\n" }, { 1, "AAXX 22081 10022 45571 52207 10161 20123 30116 40125 53018 333 55303 21177 30689 83/23 84/29 85/35=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+553SS+2FFFF+3FFFF+8NChh+8NChh+8NChh+\n" }, { 1, "AAXX 23064 07005 02475 22307 10128 20105 30143 40233 53013 60002 82201 333 10163 20107 31010 55053 60007 70012 82816 90710 91113 555 60005=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+ 333+1sTTT_max+2sTTT_min+3Ejjj+55jjj+jjjjj+7RRRR+8NChh+9SSss+9SSss+ 555+6GGmm+\n" }, { 1, "AAXX 27094 96315 41459 72207 10273 20236 40089 72582 83968 333 82816 81917 85277=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+7wwWW+8NCCC+ 333+8NChh+8NChh+8NChh+\n" }, { 1, "SNVD17 CWTO 261300 \n" "BBXX \n" "45142 26131 99427 70793 46/// /0006 10171 39936 40142 52008 \n" "22200 00202 10301 70003 333 91207 =\n", "TTAAii+CCCC+YYGGgg+ \n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+3PPPP+4PPPP+5appp+ \n" "222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+ =\n" }, { 2, "SNVD22 KWNB 261300 RRR\n" "BBXX\n" "46232 26131 99325 71174 46/// ///// 1//// 91330 22200 00190 10703\n" "20703 320// 41201 70015=\n" "46247 26131 99378 71228 46/// ///// 1//// 91321 22200 00139 10802\n" "20802 322// 41301 70012=\n", "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+9GGgg+ 222Dv+0sTTT+1PPHH+2PPHH+3dddd+4PPHH+70HHH+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+9GGgg+ 222Dv+0sTTT+1PPHH+2PPHH+3dddd+4PPHH+70HHH+\n" }, { 1, "641 \n" "SMVE01 KWBC 141800 RRA\n" "BBXX\n" "A8OK5 14183 99132 51250 41598 50816 10280 20229 40152 51014 70222\n" "83145 22214 04273 20302 316// 40504 5//// 80245=\n", "641 \n" "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+8aTTT+\n" }, { 1, "765 \n" "SMCA02 KWBC 141800\n" "AAXX 14184\n" "78255 42559 51603 10269 20148 39972 40136 52200 84502 333 10270\n" "20195 84620=\n" "78317 NIL=\n" "78318 NIL=\n", "765 \n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+ 333+1sTTT_max+2sTTT_min+8NChh+\n" "IIiii+NIL+\n" "IIiii+NIL+\n" }, { 2, "965 \n" "SMVD20 KWNB 141800\n" "BBXX\n" "44097 14181 99410 70711 46/// ///// 1//// 91731 22200 00040 11308\n" "21005 317// 41306 70042=\n" "572 \n" "SMJD50 OJAM 141800\n" "AAXX 14184\n" "40255 32960 00000 10252 20115 39382 40065 54002 333 10310=\n", "965 \n" "TTAAii+CCCC+YYGGgg+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+9GGgg+ 222Dv+0sTTT+1PPHH+2PPHH+3dddd+4PPHH+70HHH+\n" "572 \n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+1sTTT_max+\n" }, { 6, "SNVD01 KWBC 261300 RRK\n" "BBXX\n" "46036 26131 99484 71339 46/// /2103 10107 40103 57005 22200 00095\n" "11403 70013 333 91203=\n" "41024 26131 99338 70785 46/// /0510 10225 40094 53030 91300=\n" "44022 26131 99409 70737 46/// /3107 10178 20113 40067 91330 22200\n" "00199 333 91209 555 11072 22072=\n" "44140 26131 99429 70515 46/// ///// 1//// 4//// 5//// 22200 0////\n" "1//// 70/// 333 912//=\n" "PCHM 26134 99525 71298 41298 81617 10110 20100 40132 53001 7//22\n" "8/7// 22234 00120 20402 80105=\n" "PDAN 26134 99552 71314 41298 51909 10090 20045 40120 58020 7//11\n" "8/7// 22273 00080 2//// 30000 80070=\n", "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+ 222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+9GGgg+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+9GGgg+ 222Dv+0sTTT+ 333+9SSss+ 555+110ff+220ff+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+ 222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+8aTTT+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+8aTTT+\n" }, { 1, "AAXX 28091 11464 42470 53204 10168 20133 39196 42792 50005 83272\n" "333 83813 555 380//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+8NChh+ 555+3Ejjj+\n" }, { 1, "AAXX 28091 06490 45981 01408 10225 20146 39561 40097 58015\n" "333 91112 91209=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+9SSss+9SSss+\n" }, { 1, "AAXX 28091 06479 42970 41202 10257 20173 30028 40102 58016 83031\n" "333 83364 83072 91105 91203=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+8NChh+8NChh+9SSss+9SSss+\n" }, { 1, "AAXX 28064 71048 16/// /2511 10119 20091 60001\n" "333 10209 20088 70347\n" "555 32948 40133=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+6RRRt+\n" "333+1sTTT_max+2sTTT_min+7RRRR+\n" "555+3Ejjj+4Esss+\n" }, { 1, "AAXX 28094 71050 36/// /3003 10062 20031 39083 40136 58005\n" "333 60001=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+6RRRt+\n" }, { 1, "AAXX 28064 71079 11574 61403 10153 20131 39624 49887 58011 69981 78082 86100\n" "333 10278 20150 70104 90932\n" "555 10000 20000 31628 40231=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" "333+1sTTT_max+2sTTT_min+7RRRR+9SSss+\n" "555+1VVff+2sTTT_avg+3Ejjj+4Esss+\n" }, { 0, // Cannot find WMO station:27020 "AAXX 28061 27020 32698 72202 10158 20127 39885 40026 52009 69950 87500\n" "333 20099 876//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+8NCCC+\n" "333+2sTTT_min+8NChh+\n" }, { 1, "AAXX 28064 71133 17/// /2613 10151 20104 39343 40026 51025 69921 7//4/\n" "333 10170 20115 70012\n" "555 32833 40212=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+\n" "333+1sTTT_max+2sTTT_min+7RRRR+\n" "555+3Ejjj+4Esss+\n" }, { 0, // Cannot find WMO station:71547 "AAXX 28064 71547 16/// /2513 10129 20046 60001\n" "333 10184 20098 70000\n" "555 32428 40022=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+6RRRt+\n" "333+1sTTT_max+2sTTT_min+7RRRR+\n" "555+3Ejjj+4Esss+\n" }, { 3, "599 \n" "SNCN19 CWAO 141806\n" "OOXX\n" "ARP01 14161 99345 50585 ///// 00681\n" "26/// /0000 10114 29029 30044 91610 333 60000=\n" "ARP01 14161 99345 50585 ///// 00681\n" "26/// /0000 10114 29028 30044 91620 333 60000=\n" "ARP01 14161 99345 50585 ///// 00681\n" "26/// /0000 10115 29028 30043 91630 333 60000=\n", "599 \n" "TTAAii+CCCC+YYGGgg+\n" "OOXX+IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" "IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" "IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" }, { 1, "SMVA13 LFPW 280000\n" "BBXX\n" "BAREU65 28004 99202 70180 46/// ///// 40137 52005\n" "22283=\n", "TTAAii+CCCC+YYGGgg+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+4PPPP+5appp+\n" "222Dv+\n" }, { 2, "SNCN19 CWAO 280016\n" "OOXX\n" "ARP01 27221 99345 50585 ///// 00311\n" "26/// /0000 10070 29040 30084 92220 333 60000=\n" "ARP01 27221 99345 50585 ///// 00311\n" "26/// /0000 10070 29041 30087 92230 333 60000=\n", "TTAAii+CCCC+YYGGgg+\n" "OOXX+IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" "IIIII+YYGGi+99LLL+QLLLL+MMMULaULo+h0h0h0h0im+\n" "iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+9GGgg+ 333+6RRRt+\n" }, { 1, "AAXX 28091 11146 42/86 33201 10071 20018 37029 47148 53009 81202\n" "333 55310 818//=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+553SS+8NChh+\n" }, { 1, "AAXX 28061 11406 01465 39901 10182 20150 39593 40153 52003 60002 703// 83101\n" "333 20135 30009 50254 60005 70000 83813\n" "555 382// 50176 60175 70179 80170 90150=\n", "\n" }, { 1, "AAXX 23001 15090 02997 23001 10250 20177 30067 40154 52013 60001 81041 333 55300 10173 20000 3//// 55131 01487 22929 30369 60007 91005 91106=\n", "\n" }, { 1, "391\n" "SNVF01 KWBC 190700\n" "BBXX\n" "9VBL 19071 99514 10028 41/9/ /3009 10076 20023 40319 57012 7////\n" "22263 04074=\n", "391\n" "TTAAii+CCCC+YYGGgg+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+\n" "222Dv+0sTTT+\n" }, { 2, "439\n" "SNVD15 KWBC 190700\n" "BBXX\n" "41009 19071 99285 70802 46/// /2601 10205 40140 54000 90650 22200\n" "00251 10802 70011 333 91201 555 11007 22007=\n" "42002 19071 99259 70936 46/// /1602 10215 20136 40156 50000 90650\n" "22200 00244 10801 70007 333 91203 555 11021 22021 30602 41304\n" "60649 159018 136007 135016 139014 136023 132012=\n", "439\n" "TTAAii+CCCC+YYGGgg+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+9GGgg+ 222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+ 555+110ff+220ff+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+9GGgg+\n" "222Dv+0sTTT+1PPHH+70HHH+ 333+9SSss+ 555+110ff+220ff+3GGmm+4ddff+6GGmm+dddfff+dddfff+dddfff+dddfff+dddfff+dddfff+\n" }, { 1, "AAXX 22191 15420 22997 03401 10225 20204 30015 40121 52010 333 55300 0//// 20030 3//// 60005 91001 91101 99706=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+55jjj+jjjjj+2sTTT_min+3Ejjj+6RRRt+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 23001 15420 02997 03201 10189 20176 30028 40135 52007 60001 333 55300 0//// 20000 3//// 55129 0//// 22868 3//// 60007 91002 91102=\n", "\n" }, { 0, // Cannot find WMO station:11244 "AAXX 28091 11244 36/// /1402 10268 20170 39835 40140 57007\n" "333 55310=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+553SS+\n" }, { 1, "AAXX 23001 10015 01465 72110 10144 20119 30144 40154 54000 60021 72586 878// 333 31/// 55/// 21817 30776 55300 20000 30000 69927 83816 86631 91115 91213 96481=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+ 333+3Ejjj+55jjj+jjjjj+3FFFF+553SS+2FFFF+3FFFF+6RRRt+8NChh+8NChh+9SSss+9SSss+9SSss+\n" }, { 1, "AAXX 22181 10022 07780 82204 10158 20112 30148 40157 53008 60022 76160 333 10187 20133 3/012 55302 20414 30270 69907 85/50 87/58 88/62=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+ 333+1sTTT_max+2sTTT_min+3Ejjj+553SS+2FFFF+3FFFF+6RRRt+8NChh+8NChh+8NChh+\n" }, { 5, "SMSQ10 LZIB 190000\n" "AAXX 19001\n" "11816 32565 63603 10006 21030 30124 40294 57006 83830\n" "333 55002 82820 86360=\n" "11826 35/64 /3304 10002 21020 30086 40294 57006\n" "333 55000=\n" "11903 32970 71501 11019 21044 39874 40271 58006 87070\n" "333 55047 87360=\n" "11934 11658 82710 11023 21050 39412 42834 56004 69911 77077 8452/\n" "333 55031 84646 88458=\n" "11968 11335 80000 11063 21070 39978 40276 58003 69901 77172 8652/\n" "333 55000 83708 85638 88461=\n", "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+55jjj+jjjjj+8NChh+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+\n" "333+55jjj+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+8NCCC+\n" "333+55jjj+jjjjj+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" "333+55jjj+jjjjj+8NChh+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" "333+55jjj+jjjjj+8NChh+8NChh+\n" }, { 7, "SMVF01 EGRR 261200 RRE\n" "BBXX\n" "62107 26124 99501 70061 46/// /2515 10139 20139 40207 52008 22200\n" "00137 10702 70008=\n" "AMOUK12 26124 99533 70062 46/// ///// 10183 20144 40164 57017=\n" "AMOUK06 26124 99534 10017 46/// ///// 10143 20113 40214 54003=\n" "AMOUK03 26124 99513 10032 46/// ///// 10198 20129 40227 52007=\n" "AMOUK34 26124 99513 10032 46/// ///// 10203 20108 4//// 52005=\n" "63106 26124 99610 10017 46/// /3309 10106 40167 51009 22200=\n" "63105 26124 99610 10017 47/98 /3310 10132 20048 40167 51008 700// 22200=\n", "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+ 222Dv+0sTTT+1PPHH+70HHH+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+4PPPP+5appp+ 222Dv+\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ 222Dv+\n" }, { 1, "AAXX 23044 61901 461// /1319 10151 20148 39710 40224 58010 90350 333 87/02 91028 90710 91128 555 7/097=\n", "\n" }, { 3, "628 \n" "SMVC01 KWBC 141800 RRA\n" "BBXX\n" "MZBN2 14183 99530 50772 41497 82328 10075 20040 40110 54000 70288\n" "887// 22233 00090 20201 323// 40808 5//// 80060=\n" "NWS0020 14184 99008 50903 43/// /1103 10270 20250 40103 5////\n" "7//// 8//// 222// 04276 2//// 3//// 4//// 5//// 6//// 8//// ICE ////=\n" "NWS0029 14184 99039 50376 43/// /0711 10254 20227 40116 5////\n" "7//// 8//// 222// 04295 2//// 3//// 4//// 5//// 6//// 8//// ICE\n" "////=\n", "628 \n" "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX+IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+8aTTT+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+6IEER+8aTTT+ICE+cSbDz+\n" "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+8NCCC+ 222Dv+0sTTT+2PPHH+3dddd+4PPHH+5PPHH+6IEER+8aTTT+ICE+cSbDz+\n" }, { 1, "04018 42588 60507 10006 21025 40109 51002 81258 555 3//07 81830 83357 85363\n", "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+8NCCC+ 555+3Ejjj+8NChh+8NChh+8NChh+\n" }, { 1, "ZCZC 412\n" "SIGL26 EKMI 252100\n" "AAXX 25214\n" "04418 46/// /1914 11150 21169 57011\n" " 333 553// 21328 ;\n" "04425 NIL ;\n" // "02 NIL ;\n" "04436 46/// /0107 11158 21202 ;\n" "04464 46/// /1610 11137 21171\n" " 333 553// 21530 ;\n" "04485 46/// /2503 11152 21175 37398 52006\n" " 333 553// 21624 ;\n" "04488 46/// /2810 11067 21094 37452 52013\n" " 333 553// 21310 ;\n" "NNNN\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+NIL+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+5appp+\n" " 333+553SS+2FFFF+ ;\n" "NNNN+\n" }, { 1, "ZCZC 440\n" "SIGL26 EKMI 260300\n" "AAXX 26034\n" "04418 46/// /2615 11258 21285 57007\n" " 333 553// 20104 ;\n" "04425 NIL ;\n" "04432 NIL ;\n" "04436 NIL ;\n" "04464 46/// /1711 11236 21257 57128\n" " 333 553// 20011 ;\n" "04485 NIL ;\n" "NNNN\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+NIL+ ;\n" "IIiii+NIL+ ;\n" "IIiii+NIL+ ;\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+5appp+\n" " 333+553SS+2FFFF+ ;\n" "IIiii+NIL+ ;\n" "NNNN+\n" }, { 1, "ZCZC 506\n" "SMEN43 EDZW 261200 CCB\n" "AAXX 26121\n" "01001 11275 32514 10065 21022 30096 40108 57005 69911 70161 81641\n" " 222// 00004 333 91123;\n" "NNNN\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+CCx+\n" "AAXX+YYGGi+\n" "IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+6RRRt+7wwWW+8NCCC+\n" " 222Dv+0sTTT+ 333+9SSss+\n" "NNNN+\n" }, { 1,// Must check that one message only is created. "ZCZC 616\n" "SMVX41 EDZW 151800 RRC\n" "BBXX\n" "62119 05184\n", "ZCZC+ZCZC_id+\n" "TTAAii+CCCC+YYGGgg+RRx+\n" "BBXX\n" "IIiii+YYGGi+\n" }, { 1,// Must check that one message only is created. "ZCZC 619\n" "SMEN43 EDZW 15180 CCB\n" "AAXX 1518\n" "00271 17/82 0040 10870 20040 0116 4 16 57017 60002 700// 333\n" " 10180 91108;\n" "NNNN\n", "\n" }, { 1, "AAXX 22231 15420 22997 03200 10194 20178 30027 40134 52009 333 55300 0//// 20000 3//// 60005 91001 91102=\n", "AAXX+YYGGi+ IIiii+iihVV+Nddff+1sTTT_air+2sTTT_dew+3PPPP+4PPPP+5appp+ 333+55jjj+jjjjj+2sTTT_min+3Ejjj+6RRRt+9SSss+9SSss+\n" }, { 1, "62144 20184 99534 10017 47297 /3612 10086 20080 40104#580\n", "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+ 40104#580\n" }, { 1, "63057 20004 99592 100-#110)6 10084 20028 49967 51002 700// 22200 10605 70024;\n\n" "63110 20004 99595 10015 47697 /1122 10080 20031 49979 50000 700// 22200 10504 70021;\n", "IIiii+YYGGi+99LLL+ 100-#110)6 1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ 222Dv+1PPHH+70HHH+\n\n" "IIiii+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+ 222Dv+1PPHH+70HHH+\n" }, { 1, "DGEN 20004 99547 10078 41/96 22215 10085 20013 49950 54000 74100\n", "IIIII+YYGGi+99LLL+QLLLL+ iihVV+Nddff+1sTTT_air+2sTTT_dew+4PPPP+5appp+7wwWW+\n" } }; static const size_t nb_tests = G_N_ELEMENTS(tests_arr); // TODO: Test this command to detect unpublished messages: // egrep "No publish2" flsynop.log | more // ---------------------------------------------------------------------------- static void tstone( synop * ptr_synop, const synop_test * tst_arr, int tstnb ) { std::stringstream strm_tst ; dbg_strm = &strm_tst ; int nb_errors_parse = 0 ; int nb_errors_msg = 0 ; for(int i = 0; i < tstnb; ++i ) { strm_tst.str(std::string()); ptr_synop->cleanup(); KmlServer::GetInstance()->Reset(); for( const char * pc = tst_arr[i].m_input; *pc != '\0'; ++pc ) ptr_synop->add( *pc ); ptr_synop->flush(true); bool diff_parse = ( strm_tst.str() != tst_arr[i].m_output ); if(diff_parse) ++nb_errors_parse; bool diff_msg = ( KmlServer::GetInstance()->NbBroadcasts() != tst_arr[i].m_expected_nb_msgs ); if( diff_msg ) ++nb_errors_msg; if( diff_parse || diff_msg ) { std::cout << "Input [" << tst_arr[i].m_input << "]\n" ; } if( diff_parse ) { std::cout << "Expect [" << tst_arr[i].m_output << "]\n" ; std::cout << "Actual [" << strm_tst.str() << "]\n" ; } if( diff_msg ) { std::cout << "Expected messages :" << tst_arr[i].m_expected_nb_msgs << "\n" ; std::cout << "Actual :" << KmlServer::GetInstance()->NbBroadcasts() << "\n" ; } std::cout << "=============================================================\n"; } std::cout << "Nb tests=" << tstnb << " nb errors_parse=" << nb_errors_parse << " nb errors_msg=" << nb_errors_msg << '\n' ; } // ---------------------------------------------------------------------------- /* TODO: For testing detection on strings with errors, we will corrupt the existing strings, * and try to decode them with one or two insertions/deletions/changes. */ static void process_file( synop * ptr_synop, const char * namin ) { std::cout << "Processing:" << namin << "\n"; ptr_synop->cleanup(); std::ifstream filin( namin ); std::string namout = namin + std::string(".out"); std::ofstream filout( namout.c_str() ); dbg_strm = &filout ; char c; int nb = 0 ; while( filin.get(c) ) { ptr_synop->add( c ); ++nb ; } ptr_synop->flush(true); filin.close(); filout.close(); std::cout << "====== " << nb << " chars =======================================================\n"; } // ---------------------------------------------------------------------------- // // These stub definitions so we do not link with too much fldigi code. // static std::ofstream g_adif_file; QsoHelper::QsoHelper(int the_mode) : qso_rec( NULL ) { } QsoHelper::~QsoHelper() { g_adif_file << "========================================\n"; } void QsoHelper::Push( ADIF_FIELD_POS pos, const std::string & value ) { #define QSO_TITLE(n) case n : g_adif_file << #n ; break ; switch(pos) { QSO_TITLE(FREQ) QSO_TITLE(CALL) QSO_TITLE(MODE) QSO_TITLE(NAME) QSO_TITLE(QSO_DATE) QSO_TITLE(QSO_DATE_OFF) QSO_TITLE(TIME_OFF) QSO_TITLE(TIME_ON) QSO_TITLE(QTH) QSO_TITLE(RST_RCVD) QSO_TITLE(RST_SENT) QSO_TITLE(STATE) QSO_TITLE(VE_PROV) QSO_TITLE(NOTES) QSO_TITLE(QSLRDATE) QSO_TITLE(QSLSDATE) QSO_TITLE(GRIDSQUARE) QSO_TITLE(BAND) QSO_TITLE(CNTY) QSO_TITLE(COUNTRY) QSO_TITLE(CQZ) QSO_TITLE(DXCC) QSO_TITLE(IOTA) QSO_TITLE(ITUZ) QSO_TITLE(CONT) QSO_TITLE(MYXCHG) QSO_TITLE(XCHG1) QSO_TITLE(SRX) QSO_TITLE(STX) QSO_TITLE(TX_PWR) QSO_TITLE(EXPORT) default: g_adif_file << pos ; } g_adif_file << ":" << value << "\n"; #undef QSO_TITLE } // ---------------------------------------------------------------------------- // Test program: Text files containing synop samples are given on the command line. // Do we run a couple of internal self-test functions ? static bool internal_test = false ; static bool kml_balloon_as_matrix = false ; // If set, the output document, instead of having Synop messages, will get only // the regular expressions names. This helps for debugging and the output // is locale-independent. static bool regex_output_only = false ; // If set, at the end of the execution, prints all the regular expression // and the number of times each of them was used. static bool display_synop_usage = false ; // Where the CSV files for Synop decoding are loaded from. static std::string data_dir = "data/"; // Where the KML files are periodically written to. static std::string kml_dir = "kml/"; // Where the KML files are loaded from at startup. static std::string load_dir ; // Contains the output of all logged nformation. static std::string dbg_file = "FlSynop.log"; // This command must be executed each time KML files are saved to disk. static std::string exec_cmd = "echo Subprocess called; date"; static const char * g_adif_name = "adif.txt"; int main(int argC, char * argV[] ) try { int option_index = 0 ; opterr = 0; for(;;) { static const char shortopts[] = "b:k:l:d:utmrvwh"; static const struct option longopts[] = { { "data_dir", required_argument, 0, 'b' }, { "kml_dir", required_argument, 0, 'k' }, { "load_dir", required_argument, 0, 'l' }, { "dbg", required_argument, 0, 'd' }, { "usage", no_argument, 0, 'u' }, { "test", no_argument, 0, 't' }, { "matrix", no_argument, 0, 'm' }, { "regex", no_argument, 0, 'r' }, { "version", no_argument, 0, 'v' }, { "help", no_argument, 0, 'h' }, { NULL, 0, 0, 0 } }; int c = getopt_long(argC, (char * const *)argV, shortopts, longopts, &option_index); switch (c) { case -1: break; case 0: // handle options with non-0 flag here if (longopts[option_index].flag != 0) continue; printf ("option %s", longopts[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); continue; case 'b': data_dir = optarg; continue; case 'k': kml_dir = optarg; continue; case 'l': load_dir = optarg; continue; case 'd': dbg_file = optarg; continue; case 't': internal_test = true ; continue ; case 'm': kml_balloon_as_matrix = true; continue; case 'r': regex_output_only = true ; continue ; case 'u': display_synop_usage = true ; continue ; case 'v': std::cout << "version 1.0\n"; exit(EXIT_SUCCESS); case ':': default: std::cerr << "Unrecognized option\n"; exit(EXIT_FAILURE); case 'h': case '?': std::cout << "Valid options are:\n" ; for( size_t i = 0; longopts[i].name != NULL; ++i ) { std::cout << " " << longopts[i].name << "\n" ; } exit(EXIT_SUCCESS); } break; } g_adif_file.open( g_adif_name, std::ios_base::out ); /// Where the warning, informational and error messages are written. // debug::start(dbg_file.c_str()); /// Just for testing the loading. We load from one dir and save in another. if( ! load_dir.empty() ) { std::cout << "Loading from " << load_dir << "\n"; KmlServer::GetInstance()->InitParams( exec_cmd, load_dir ); } KmlServer::GetInstance()->InitParams( exec_cmd, kml_dir, 10000, 0, 120, kml_balloon_as_matrix ); if( ! load_dir.empty() ) { std::cout << "Loading tested: Destination=" << kml_dir << "\n"; exit(0); } // Must be done before any use of WMO stations data. // http://weather.noaa.gov/data/nsd_bbsss.txt std::cout << "Opening:" << data_dir << "\n"; if( ! SynopDB::Init(data_dir) ) { std::cerr << "Error opening:" << data_dir << ":" << strerror(errno) << "\n"; exit(EXIT_FAILURE); } // Serializer::SetSrl( & fldigiSerial ); if( internal_test ) { test_coordinates(); test_wmo(); test_buoy(); test_ship(); test_jcomm(); } synop::setup(); synop * ptr_synop = synop::instance(); if( internal_test ) { KmlServer::GetInstance()->Reset(); synop::SetTestMode(false); tstone( ptr_synop, tests_arr_full, nb_tests_full ); synop::SetTestMode(true); tstone( ptr_synop, tests_arr, nb_tests ); KmlServer::GetInstance()->Reset(); } synop::SetTestMode(regex_output_only); while (optind < argC) process_file( ptr_synop, argV[optind++] ); if( display_synop_usage ) { synop::regex_usage(); } KmlServer::Exit(); g_adif_file.close(); // std::cin.get(); return 0 ; } catch( const std::exception & exc ) { std::cout << "Exception:" << exc.what() << '\n'; exit(EXIT_FAILURE); } // ---------------------------------------------------------------------------- fldigi-4.2.05/src/mt63/0000775000175000017500000000000014611714005011422 500000000000000fldigi-4.2.05/src/mt63/morse.dat0000664000175000017500000000760514532252172013175 00000000000000// computer readable Morse code table // // For a given character you should pick up a 31-bit code from the table. // Bits should be taken starting from the LSB. // Bit equal 1 means carrier ON, bit 0 means carrier off // Each code includes one quiet dot at the start and two at the end. // The code should be read until the last '1', // but this last '1' must not be transmitted // const int MorseTableSize=128; long MorseTable[MorseTableSize] = { 0x00000004L , // 0x00 0x00000004L , // 0x01 0x00000004L , // 0x02 0x00000004L , // 0x03 0x00000004L , // 0x04 0x00000004L , // 0x05 0x00000004L , // 0x06 0x00000004L , // 0x07 0x00000004L , // 0x08 0x00000004L , // 0x09 0x00000004L , // 0x0A 0x00000004L , // 0x0B 0x00000004L , // 0x0C 0x00000004L , // 0x0D 0x00000004L , // 0x0E 0x00000004L , // 0x0F 0x00000004L , // 0x10 0x00000004L , // 0x11 0x00000004L , // 0x12 0x00000004L , // 0x13 0x00000004L , // 0x14 0x00000004L , // 0x15 0x00000004L , // 0x16 0x00000004L , // 0x17 0x00000004L , // 0x18 0x00000004L , // 0x19 0x00000004L , // 0x1A 0x00000004L , // 0x1B 0x00000004L , // 0x1C 0x00000004L , // 0x1D 0x00000004L , // 0x1E 0x00000004L , // 0x1F 0x00000004L , // 0x20 = ' ' 0x00000004L , // 0x21 = '!' 0x00000004L , // 0x22 = '"' 0x00000004L , // 0x23 = '#' 0x0013ABAAL , // 0x24 = '$' 0x00000004L , // 0x25 = '%' 0x00000004L , // 0x26 = '&' 0x004BBBBAL , // 0x27 = ''' 0x0004BBAEL , // 0x28 = '(' 0x004EBBAEL , // 0x29 = ')' 0x0004BABAL , // 0x2A = '*' 0x00012EBAL , // 0x2B = '+' 0x004EEAEEL , // 0x2C = ',' 0x0004EAAEL , // 0x2D = '-' 0x0013AEBAL , // 0x2E = '.' 0x00012EAEL , // 0x2F = '/' 0x004EEEEEL , // 0x30 = '0' 0x0013BBBAL , // 0x31 = '1' 0x0004EEEAL , // 0x32 = '2' 0x00013BAAL , // 0x33 = '3' 0x00004EAAL , // 0x34 = '4' 0x000012AAL , // 0x35 = '5' 0x00004AAEL , // 0x36 = '6' 0x00012AEEL , // 0x37 = '7' 0x0004AEEEL , // 0x38 = '8' 0x0012EEEEL , // 0x39 = '9' 0x0012AEEEL , // 0x3A = ':' 0x0012EBAEL , // 0x3B = ';' 0x00000004L , // 0x3C = '<' 0x00013AAEL , // 0x3D = '=' 0x00000004L , // 0x3E = '>' 0x0004AEEAL , // 0x3F = '?' 0x00000004L , // 0x40 = '@' 0x0000013AL , // 0x41 = 'A' 0x000012AEL , // 0x42 = 'B' 0x00004BAEL , // 0x43 = 'C' 0x000004AEL , // 0x44 = 'D' 0x00000012L , // 0x45 = 'E' 0x000012EAL , // 0x46 = 'F' 0x000012EEL , // 0x47 = 'G' 0x000004AAL , // 0x48 = 'H' 0x0000004AL , // 0x49 = 'I' 0x00013BBAL , // 0x4A = 'J' 0x000013AEL , // 0x4B = 'K' 0x000012BAL , // 0x4C = 'L' 0x000004EEL , // 0x4D = 'M' 0x0000012EL , // 0x4E = 'N' 0x00004EEEL , // 0x4F = 'O' 0x00004BBAL , // 0x50 = 'P' 0x00013AEEL , // 0x51 = 'Q' 0x000004BAL , // 0x52 = 'R' 0x0000012AL , // 0x53 = 'S' 0x0000004EL , // 0x54 = 'T' 0x000004EAL , // 0x55 = 'U' 0x000013AAL , // 0x56 = 'V' 0x000013BAL , // 0x57 = 'W' 0x00004EAEL , // 0x58 = 'X' 0x00013BAEL , // 0x59 = 'Y' 0x00004AEEL , // 0x5A = 'Z' 0x00000004L , // 0x5B = '[' 0x00000004L , // 0x5C = '\' 0x00000004L , // 0x5D = ']' 0x00000004L , // 0x5E = '^' 0x0013AEEAL , // 0x5F = '_' 0x00000004L , // 0x60 = '`' 0x0000013AL , // 0x61 = 'a' 0x000012AEL , // 0x62 = 'b' 0x00004BAEL , // 0x63 = 'c' 0x000004AEL , // 0x64 = 'd' 0x00000012L , // 0x65 = 'e' 0x000012EAL , // 0x66 = 'f' 0x000012EEL , // 0x67 = 'g' 0x000004AAL , // 0x68 = 'h' 0x0000004AL , // 0x69 = 'i' 0x00013BBAL , // 0x6A = 'j' 0x000013AEL , // 0x6B = 'k' 0x000012BAL , // 0x6C = 'l' 0x000004EEL , // 0x6D = 'm' 0x0000012EL , // 0x6E = 'n' 0x00004EEEL , // 0x6F = 'o' 0x00004BBAL , // 0x70 = 'p' 0x00013AEEL , // 0x71 = 'q' 0x000004BAL , // 0x72 = 'r' 0x0000012AL , // 0x73 = 's' 0x0000004EL , // 0x74 = 't' 0x000004EAL , // 0x75 = 'u' 0x000013AAL , // 0x76 = 'v' 0x000013BAL , // 0x77 = 'w' 0x00004EAEL , // 0x78 = 'x' 0x00013BAEL , // 0x79 = 'y' 0x00004AEEL , // 0x7A = 'z' 0x00000004L , // 0x7B = '{' 0x00000004L , // 0x7C = '|' 0x00000004L , // 0x7D = '}' 0x00000004L , // 0x7E = '~' 0x00000004L // 0x7F = '' } ; fldigi-4.2.05/src/mt63/mt63intl.dat0000664000175000017500000000246414532252172013526 00000000000000/* * mt63intl.dat -- interleave patterns * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // interleave pattern for the original MT63ASC (short interleave) int ShortIntlvPatt[64] = { 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7 } ; // interleave pattern for doubled interleave int LongIntlvPatt[64] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0 } ; fldigi-4.2.05/src/mt63/symbol.dat0000664000175000017500000003431314532252172013351 00000000000000/* * symbol.dat -- Symbol shape for the MT63 modem, taken directly * from the MT63ASC code for the EVM56K. * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ const int SymbolLen=512; // the shape's length const int SymbolSepar=200; // the distance in samples between symbols on a carrier const int DataCarrSepar=4; // carriers must be spaced by 4 FFT bins // (complex FFT length equals to SymbolLen) double SymbolShape[SymbolLen] = { -0.00000000 , // 0 +0.00000665 , // 1 +0.00002657 , // 2 +0.00005975 , // 3 +0.00010613 , // 4 +0.00016562 , // 5 +0.00023810 , // 6 +0.00032341 , // 7 +0.00042134 , // 8 +0.00053162 , // 9 +0.00065389 , // 10 +0.00078773 , // 11 +0.00093261 , // 12 +0.00108789 , // 13 +0.00125283 , // 14 +0.00142653 , // 15 +0.00160798 , // 16 +0.00179599 , // 17 +0.00198926 , // 18 +0.00218628 , // 19 +0.00238542 , // 20 +0.00258487 , // 21 +0.00278264 , // 22 +0.00297662 , // 23 +0.00316452 , // 24 +0.00334394 , // 25 +0.00351232 , // 26 +0.00366701 , // 27 +0.00380526 , // 28 +0.00392424 , // 29 +0.00402109 , // 30 +0.00409288 , // 31 +0.00413671 , // 32 +0.00414969 , // 33 +0.00412898 , // 34 +0.00407182 , // 35 +0.00397555 , // 36 +0.00383764 , // 37 +0.00365574 , // 38 +0.00342767 , // 39 +0.00315145 , // 40 +0.00282534 , // 41 +0.00244787 , // 42 +0.00201781 , // 43 +0.00153424 , // 44 +0.00099653 , // 45 +0.00040435 , // 46 -0.00024231 , // 47 -0.00094314 , // 48 -0.00169753 , // 49 -0.00250453 , // 50 -0.00336293 , // 51 -0.00427118 , // 52 -0.00522749 , // 53 -0.00622977 , // 54 -0.00727569 , // 55 -0.00836272 , // 56 -0.00948809 , // 57 -0.01064886 , // 58 -0.01184193 , // 59 -0.01306405 , // 60 -0.01431189 , // 61 -0.01558198 , // 62 -0.01687083 , // 63 -0.01817486 , // 64 -0.01949051 , // 65 -0.02081416 , // 66 -0.02214223 , // 67 -0.02347113 , // 68 -0.02479733 , // 69 -0.02611728 , // 70 -0.02742752 , // 71 -0.02872457 , // 72 -0.03000504 , // 73 -0.03126551 , // 74 -0.03250262 , // 75 -0.03371298 , // 76 -0.03489320 , // 77 -0.03603988 , // 78 -0.03714954 , // 79 -0.03821868 , // 80 -0.03924367 , // 81 -0.04022079 , // 82 -0.04114620 , // 83 -0.04201589 , // 84 -0.04282570 , // 85 -0.04357126 , // 86 -0.04424801 , // 87 -0.04485118 , // 88 -0.04537575 , // 89 -0.04581648 , // 90 -0.04616787 , // 91 -0.04642421 , // 92 -0.04657955 , // 93 -0.04662769 , // 94 -0.04656225 , // 95 -0.04637665 , // 96 -0.04606414 , // 97 -0.04561786 , // 98 -0.04503082 , // 99 -0.04429599 , // 100 -0.04340631 , // 101 -0.04235475 , // 102 -0.04113436 , // 103 -0.03973834 , // 104 -0.03816006 , // 105 -0.03639316 , // 106 -0.03443155 , // 107 -0.03226956 , // 108 -0.02990192 , // 109 -0.02732385 , // 110 -0.02453112 , // 111 -0.02152012 , // 112 -0.01828789 , // 113 -0.01483216 , // 114 -0.01115146 , // 115 -0.00724508 , // 116 -0.00311317 , // 117 +0.00124328 , // 118 +0.00582236 , // 119 +0.01062127 , // 120 +0.01563627 , // 121 +0.02086273 , // 122 +0.02629504 , // 123 +0.03192674 , // 124 +0.03775043 , // 125 +0.04375787 , // 126 +0.04993995 , // 127 +0.05628681 , // 128 +0.06278780 , // 129 +0.06943159 , // 130 +0.07620621 , // 131 +0.08309914 , // 132 +0.09009732 , // 133 +0.09718730 , // 134 +0.10435526 , // 135 +0.11158715 , // 136 +0.11886870 , // 137 +0.12618560 , // 138 +0.13352351 , // 139 +0.14086819 , // 140 +0.14820561 , // 141 +0.15552198 , // 142 +0.16280389 , // 143 +0.17003841 , // 144 +0.17721311 , // 145 +0.18431620 , // 146 +0.19133661 , // 147 +0.19826401 , // 148 +0.20508896 , // 149 +0.21180289 , // 150 +0.21839823 , // 151 +0.22486845 , // 152 +0.23120806 , // 153 +0.23741270 , // 154 +0.24347919 , // 155 +0.24940549 , // 156 +0.25519079 , // 157 +0.26083547 , // 158 +0.26634116 , // 159 +0.27171067 , // 160 +0.27694807 , // 161 +0.28205857 , // 162 +0.28704860 , // 163 +0.29192571 , // 164 +0.29669855 , // 165 +0.30137684 , // 166 +0.30597130 , // 167 +0.31049362 , // 168 +0.31495636 , // 169 +0.31937292 , // 170 +0.32375741 , // 171 +0.32812465 , // 172 +0.33249001 , // 173 +0.33686936 , // 174 +0.34127898 , // 175 +0.34573545 , // 176 +0.35025554 , // 177 +0.35485613 , // 178 +0.35955412 , // 179 +0.36436627 , // 180 +0.36930915 , // 181 +0.37439902 , // 182 +0.37965170 , // 183 +0.38508250 , // 184 +0.39070609 , // 185 +0.39653642 , // 186 +0.40258662 , // 187 +0.40886890 , // 188 +0.41539446 , // 189 +0.42217341 , // 190 +0.42921470 , // 191 +0.43652603 , // 192 +0.44411383 , // 193 +0.45198311 , // 194 +0.46013753 , // 195 +0.46857925 , // 196 +0.47730896 , // 197 +0.48632585 , // 198 +0.49562756 , // 199 +0.50521021 , // 200 +0.51506840 , // 201 +0.52519520 , // 202 +0.53558220 , // 203 +0.54621950 , // 204 +0.55709582 , // 205 +0.56819849 , // 206 +0.57951351 , // 207 +0.59102568 , // 208 +0.60271860 , // 209 +0.61457478 , // 210 +0.62657574 , // 211 +0.63870210 , // 212 +0.65093366 , // 213 +0.66324951 , // 214 +0.67562817 , // 215 +0.68804763 , // 216 +0.70048553 , // 217 +0.71291922 , // 218 +0.72532590 , // 219 +0.73768272 , // 220 +0.74996688 , // 221 +0.76215572 , // 222 +0.77422687 , // 223 +0.78615828 , // 224 +0.79792836 , // 225 +0.80951602 , // 226 +0.82090079 , // 227 +0.83206287 , // 228 +0.84298315 , // 229 +0.85364335 , // 230 +0.86402598 , // 231 +0.87411443 , // 232 +0.88389296 , // 233 +0.89334677 , // 234 +0.90246195 , // 235 +0.91122553 , // 236 +0.91962547 , // 237 +0.92765062 , // 238 +0.93529073 , // 239 +0.94253642 , // 240 +0.94937916 , // 241 +0.95581122 , // 242 +0.96182562 , // 243 +0.96741616 , // 244 +0.97257728 , // 245 +0.97730410 , // 246 +0.98159233 , // 247 +0.98543825 , // 248 +0.98883864 , // 249 +0.99179079 , // 250 +0.99429241 , // 251 +0.99634163 , // 252 +0.99793696 , // 253 +0.99907728 , // 254 +0.99976178 , // 255 +0.99999000 , // 256 +0.99976178 , // 257 +0.99907728 , // 258 +0.99793696 , // 259 +0.99634163 , // 260 +0.99429241 , // 261 +0.99179079 , // 262 +0.98883864 , // 263 +0.98543825 , // 264 +0.98159233 , // 265 +0.97730410 , // 266 +0.97257728 , // 267 +0.96741616 , // 268 +0.96182562 , // 269 +0.95581122 , // 270 +0.94937916 , // 271 +0.94253642 , // 272 +0.93529073 , // 273 +0.92765062 , // 274 +0.91962547 , // 275 +0.91122553 , // 276 +0.90246195 , // 277 +0.89334677 , // 278 +0.88389296 , // 279 +0.87411443 , // 280 +0.86402598 , // 281 +0.85364335 , // 282 +0.84298315 , // 283 +0.83206287 , // 284 +0.82090079 , // 285 +0.80951602 , // 286 +0.79792836 , // 287 +0.78615828 , // 288 +0.77422687 , // 289 +0.76215572 , // 290 +0.74996688 , // 291 +0.73768272 , // 292 +0.72532590 , // 293 +0.71291922 , // 294 +0.70048553 , // 295 +0.68804763 , // 296 +0.67562817 , // 297 +0.66324951 , // 298 +0.65093366 , // 299 +0.63870210 , // 300 +0.62657574 , // 301 +0.61457478 , // 302 +0.60271860 , // 303 +0.59102568 , // 304 +0.57951351 , // 305 +0.56819849 , // 306 +0.55709582 , // 307 +0.54621950 , // 308 +0.53558220 , // 309 +0.52519520 , // 310 +0.51506840 , // 311 +0.50521021 , // 312 +0.49562756 , // 313 +0.48632585 , // 314 +0.47730896 , // 315 +0.46857925 , // 316 +0.46013753 , // 317 +0.45198311 , // 318 +0.44411383 , // 319 +0.43652603 , // 320 +0.42921470 , // 321 +0.42217341 , // 322 +0.41539446 , // 323 +0.40886890 , // 324 +0.40258662 , // 325 +0.39653642 , // 326 +0.39070609 , // 327 +0.38508250 , // 328 +0.37965170 , // 329 +0.37439902 , // 330 +0.36930915 , // 331 +0.36436627 , // 332 +0.35955412 , // 333 +0.35485613 , // 334 +0.35025554 , // 335 +0.34573545 , // 336 +0.34127898 , // 337 +0.33686936 , // 338 +0.33249001 , // 339 +0.32812465 , // 340 +0.32375741 , // 341 +0.31937292 , // 342 +0.31495636 , // 343 +0.31049362 , // 344 +0.30597130 , // 345 +0.30137684 , // 346 +0.29669855 , // 347 +0.29192571 , // 348 +0.28704860 , // 349 +0.28205857 , // 350 +0.27694807 , // 351 +0.27171067 , // 352 +0.26634116 , // 353 +0.26083547 , // 354 +0.25519079 , // 355 +0.24940549 , // 356 +0.24347919 , // 357 +0.23741270 , // 358 +0.23120806 , // 359 +0.22486845 , // 360 +0.21839823 , // 361 +0.21180289 , // 362 +0.20508896 , // 363 +0.19826401 , // 364 +0.19133661 , // 365 +0.18431620 , // 366 +0.17721311 , // 367 +0.17003841 , // 368 +0.16280389 , // 369 +0.15552198 , // 370 +0.14820561 , // 371 +0.14086819 , // 372 +0.13352351 , // 373 +0.12618560 , // 374 +0.11886870 , // 375 +0.11158715 , // 376 +0.10435526 , // 377 +0.09718730 , // 378 +0.09009732 , // 379 +0.08309914 , // 380 +0.07620621 , // 381 +0.06943159 , // 382 +0.06278780 , // 383 +0.05628681 , // 384 +0.04993995 , // 385 +0.04375787 , // 386 +0.03775043 , // 387 +0.03192674 , // 388 +0.02629504 , // 389 +0.02086273 , // 390 +0.01563627 , // 391 +0.01062127 , // 392 +0.00582236 , // 393 +0.00124328 , // 394 -0.00311317 , // 395 -0.00724508 , // 396 -0.01115146 , // 397 -0.01483216 , // 398 -0.01828789 , // 399 -0.02152012 , // 400 -0.02453112 , // 401 -0.02732385 , // 402 -0.02990192 , // 403 -0.03226956 , // 404 -0.03443155 , // 405 -0.03639316 , // 406 -0.03816006 , // 407 -0.03973834 , // 408 -0.04113436 , // 409 -0.04235475 , // 410 -0.04340631 , // 411 -0.04429599 , // 412 -0.04503082 , // 413 -0.04561786 , // 414 -0.04606414 , // 415 -0.04637665 , // 416 -0.04656225 , // 417 -0.04662769 , // 418 -0.04657955 , // 419 -0.04642421 , // 420 -0.04616787 , // 421 -0.04581648 , // 422 -0.04537575 , // 423 -0.04485118 , // 424 -0.04424801 , // 425 -0.04357126 , // 426 -0.04282570 , // 427 -0.04201589 , // 428 -0.04114620 , // 429 -0.04022079 , // 430 -0.03924367 , // 431 -0.03821868 , // 432 -0.03714954 , // 433 -0.03603988 , // 434 -0.03489320 , // 435 -0.03371298 , // 436 -0.03250262 , // 437 -0.03126551 , // 438 -0.03000504 , // 439 -0.02872457 , // 440 -0.02742752 , // 441 -0.02611728 , // 442 -0.02479733 , // 443 -0.02347113 , // 444 -0.02214223 , // 445 -0.02081416 , // 446 -0.01949051 , // 447 -0.01817486 , // 448 -0.01687083 , // 449 -0.01558198 , // 450 -0.01431189 , // 451 -0.01306405 , // 452 -0.01184193 , // 453 -0.01064886 , // 454 -0.00948809 , // 455 -0.00836272 , // 456 -0.00727569 , // 457 -0.00622977 , // 458 -0.00522749 , // 459 -0.00427118 , // 460 -0.00336293 , // 461 -0.00250453 , // 462 -0.00169753 , // 463 -0.00094314 , // 464 -0.00024231 , // 465 +0.00040435 , // 466 +0.00099653 , // 467 +0.00153424 , // 468 +0.00201781 , // 469 +0.00244787 , // 470 +0.00282534 , // 471 +0.00315145 , // 472 +0.00342767 , // 473 +0.00365574 , // 474 +0.00383764 , // 475 +0.00397555 , // 476 +0.00407182 , // 477 +0.00412898 , // 478 +0.00414969 , // 479 +0.00413671 , // 480 +0.00409288 , // 481 +0.00402109 , // 482 +0.00392424 , // 483 +0.00380526 , // 484 +0.00366701 , // 485 +0.00351232 , // 486 +0.00334394 , // 487 +0.00316452 , // 488 +0.00297662 , // 489 +0.00278264 , // 490 +0.00258487 , // 491 +0.00238542 , // 492 +0.00218628 , // 493 +0.00198926 , // 494 +0.00179599 , // 495 +0.00160798 , // 496 +0.00142653 , // 497 +0.00125283 , // 498 +0.00108789 , // 499 +0.00093261 , // 500 +0.00078773 , // 501 +0.00065389 , // 502 +0.00053162 , // 503 +0.00042134 , // 504 +0.00032341 , // 505 +0.00023810 , // 506 +0.00016562 , // 507 +0.00010613 , // 508 +0.00005975 , // 509 +0.00002657 , // 510 +0.00000665 // 511 } ; fldigi-4.2.05/src/mt63/mt63.cxx0000664000175000017500000002212614611711171012663 00000000000000// ---------------------------------------------------------------------------- // mt63.cxx -- MT63 modem for fldigi // // Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC // Copyright (c) 2007-2011 Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "configuration.h" #include "fl_digi.h" #include "status.h" #include "mt63.h" //------------------------------------------------------------------------------ #include "threads.h" static pthread_mutex_t mt63_mutex = PTHREAD_MUTEX_INITIALIZER; //------------------------------------------------------------------------------ bool startflag = true; void mt63::tx_init() { guard_lock dsp_lock(&mt63_mutex); Tx->Preset(get_txfreq_woffset(), (int)bandwidth, Interleave == 64 ? 1 : 0); flush = Tx->DataInterleave; videoText(); startflag = true; } void mt63::rx_init() { guard_lock dsp_lock(&mt63_mutex); Rx->Preset( frequency, (int)bandwidth, Interleave == 64 ? 1 : 0, long_integral ? 32 : 16 ); InpLevel->Preset(64.0, 0.75); escape = 0; } int mt63::tx_process() { rx_flush(); // do not put above rx_flush() modem::tx_process(); guard_lock dsp_lock(&mt63_mutex); int c; if (startflag == true) { startflag = false; maxval = 0.0; if (progdefaults.mt63_usetones) { double w1 = 2.0 * M_PI * (get_txfreq_woffset() - bandwidth / 2.0) / samplerate; double w2 = 2.0 * M_PI * (get_txfreq_woffset() + 31.0 * bandwidth / 64.0) / samplerate; double phi1 = 0.0; double phi2 = 0.0; double buff[512]; int numsmpls = samplerate * progdefaults.mt63_tone_duration / 512; for (int i = 0; i < numsmpls; i++) { for (int j = 0; j < 512; j++) { buff[j] = TONE_AMP * (progdefaults.mt63_twotones ? 0.5 : 1.0) * cos(phi1) + TONE_AMP * (progdefaults.mt63_twotones ? 0.5 : 0.0) * cos(phi2); phi1 += w1; phi2 += w2; if (i == 0) buff[j] *= (1.0 - exp(-1.0 * j / 40.0)); if (i == progdefaults.mt63_tone_duration - 1) buff[j] *= (1.0 - exp(-1.0 * (samplerate - j) / 40.0)); } Fl::awake(); ModulateXmtr(buff, 512); } } for (int i = 0; i < Tx->DataInterleave; i++) { Tx->SendChar(0); Fl::awake(); } } c = get_tx_char(); if (c == GET_TX_CHAR_ETX) { stopflag = true; flush = Tx->DataInterleave; } if (c == GET_TX_CHAR_NODATA || stopflag == true) c = 0; if (stopflag) { stopflag = false; while (--flush) { Tx->SendChar(0); double buff[Tx->Comb.Output.Len]; for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) buff[i] = Tx->Comb.Output.Data[i] /= maxval; ModulateXmtr(buff,Tx->Comb.Output.Len); } Tx->SendJam(); maxval = 0.0; double buff[Tx->Comb.Output.Len]; for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) buff[i] = Tx->Comb.Output.Data[i] * 1.0 / maxval; ModulateXmtr(buff,Tx->Comb.Output.Len); return -1; /* we're done */ } if (c > 255 || (!progdefaults.mt63_8bit && c > 127)) c = '.'; int sendc = c; if (sendc > 127) { sendc &= 127; Tx->SendChar(127); double buff[Tx->Comb.Output.Len]; for (int i = 0; i < Tx->Comb.Output.Len; i++) if (fabs(Tx->Comb.Output.Data[i]) > maxval) maxval = fabs(Tx->Comb.Output.Data[i]); for (int i = 0; i < Tx->Comb.Output.Len; i++) buff[i] = Tx->Comb.Output.Data[i] * 1.0 / maxval; ModulateXmtr(buff,Tx->Comb.Output.Len); } Tx->SendChar(sendc); double buff[Tx->Comb.Output.Len]; int len = Tx->Comb.Output.Len; for (int i = 0; i < len; i++) { buff[i] = Tx->Comb.Output.Data[i]; if (maxval < fabs(buff[i])) maxval = fabs(buff[i]); } for (int i = 0; i < len; i++) { buff[i] *= 1.0 / maxval; } ModulateXmtr(buff,len); put_echo_char(c); return 0; } int mt63::rx_process(const double *buf, int len) { double snr; unsigned int c; int i; static char msg1[20]; static char msg2[20]; double f_offset; if (long_integral != progdefaults.mt63_rx_integration) { long_integral = progdefaults.mt63_rx_integration; restart(); } if (InpBuff->EnsureSpace(len) == -1) { fprintf(stderr, "mt63_rxprocess: buffer error\n"); return -1; } for (i = 0; i < len; i++) InpBuff->Data[i] = buf[i]; { // critical section guard_lock dsp_lock(&mt63_mutex); InpBuff->Len = len; InpLevel->Process(InpBuff); Rx->Process(InpBuff); snr = Rx->FEC_SNR(); if (progStatus.sqlonoff && snr < progStatus.sldrSquelchValue) { put_Status1(""); put_Status2(""); display_metric(0); return 0; } for (i = 0; i < Rx->Output.Len; i++) { c = Rx->Output.Data[i]; if (!progdefaults.mt63_8bit) { put_rx_char(c); continue; } if ((c < 8) && (escape == 0)) continue; if (c == 127) { escape = 1; continue; } if (escape) { c += 128; escape = 0; } put_rx_char(c); } f_offset = Rx->TotalFreqOffset(); } // end critical section if (snr > 99.9) snr = 99.9; display_metric(snr); double s2n = 10.0*log10( snr == 0 ? 0.001 : snr); snprintf(msg1, sizeof(msg1), "s/n %2d dB", (int)(floor(s2n))); put_Status1(msg1); snprintf(msg2, sizeof(msg2), "f/o %+4.1f Hz", f_offset); put_Status2(msg2, 5, STATUS_CLEAR); flushbuffer = true; return 0; } void mt63::rx_flush() { guard_lock dsp_lock(&mt63_mutex); unsigned int c; int len = 512; int dlen = 0; if (!flushbuffer) return; if (emptyBuff->EnsureSpace(len) == -1) { flushbuffer = false; return; } for (int j = 0; j < len; j++) emptyBuff->Data[j] = 0.0; emptyBuff->Len = len; InpLevel->Process(emptyBuff); Rx->Process(emptyBuff); dlen = Rx->Output.Len; while (Rx->SYNC_LockStatus()) { for (int i = 0; i < dlen; i++) { c = Rx->Output.Data[i]; if (!progdefaults.mt63_8bit) { put_rx_char(c); continue; } if ((c < 8) && (escape == 0)) continue; if (c == 127) { escape = 1; continue; } if (escape) { c += 128; escape = 0; } put_rx_char(c); } for (int j = 0; j < len; j++) emptyBuff->Data[j] = 0.0; emptyBuff->Len = len; InpLevel->Process(emptyBuff); Rx->Process(emptyBuff); dlen = Rx->Output.Len; } flushbuffer = false; return; } void mt63::restart() { int err; put_MODEstatus(mode); set_scope_mode(Digiscope::BLANK); { // critical section guard_lock dsp_lock(&mt63_mutex); err = Tx->Preset(get_txfreq_woffset(), (int)bandwidth, Interleave == 64 ? 1 : 0); if (err) fprintf(stderr, "mt63_txinit: init failed\n"); flush = Tx->DataInterleave; err = Rx->Preset( frequency, (int)bandwidth, Interleave == 64 ? 1 : 0, long_integral ? 32 : 16); } // end critical section if (err) fprintf(stderr, "mt63_rxinit: init failed\n"); InpLevel->Preset(64.0, 0.75); stopflag = false; } void mt63::init() { modem::init(); restart(); flushbuffer = false; maxval = 0.0; if (progdefaults.mt63_at500) { frequency = 500 + bandwidth / 2; modem::set_freq(frequency); } else if (progdefaults.mt63_centered) { frequency = 1500; modem::set_freq(frequency); } else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } mt63::mt63 (trx_mode mt63_mode) : modem() { mode = mt63_mode; switch (mode) { case MODE_MT63_500S: Interleave = 32; bandwidth = 500; break; case MODE_MT63_500L: Interleave = 64; bandwidth = 500; break; case MODE_MT63_1000S: Interleave = 32; bandwidth = 1000; break; case MODE_MT63_1000L: Interleave = 64; bandwidth = 1000; break; case MODE_MT63_2000S: Interleave = 32; bandwidth = 2000; break; case MODE_MT63_2000L: Interleave = 64; bandwidth = 2000; break; } long_integral = progdefaults.mt63_rx_integration; Tx = new MT63tx; Rx = new MT63rx; InpLevel = new dspLevelMonitor; InpBuff = new double_buff; emptyBuff = new double_buff; samplerate = 8000; fragmentsize = 1024; } mt63::~mt63() { guard_lock dsp_lock(&mt63_mutex); if (Tx) delete Tx; if (Rx) delete Rx; if (InpLevel) delete InpLevel; if (InpBuff) delete InpBuff; } // W1HKJ // user can select manual or fixed positioning of the MT63 encoder/decoder // progdefaults.mt63_at500 TRUE ==> fixed position void mt63::set_freq(double f) { if (progdefaults.mt63_at500) frequency = 500 + bandwidth / 2; else if (progdefaults.mt63_centered) frequency = 1500; else frequency = f; modem::set_freq(frequency); rx_init(); } fldigi-4.2.05/src/mt63/alias_2k.dat0000664000175000017500000001042414532252172013526 00000000000000/* * alias_2k.dat -- Anti-alias filter 2000 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=2500.0 // PassBandLow=375.0 PassBandUpp=2625.0 StopBandLow=0.0 StopBandUpp=3000.0 // => PeakInStopBand=-89.35 dB // Programmers's scale factor: 1.000000 // Programmers's comments: Anti-alias filter 2000 Hz bandwidth, decimation by 2 const int Alias_2k_Len=64; double Alias_2k_I[Alias_2k_Len] = { +0.00007244 , // 0 +0.00002831 , // 1 -0.00031179 , // 2 -0.00027704 , // 3 +0.00026218 , // 4 -0.00057780 , // 5 -0.00083336 , // 6 +0.00119188 , // 7 +0.00014945 , // 8 -0.00077327 , // 9 +0.00360739 , // 10 +0.00224833 , // 11 -0.00032116 , // 12 +0.00696821 , // 13 +0.00439713 , // 14 -0.00157675 , // 15 +0.00906983 , // 16 +0.00372045 , // 17 -0.00786599 , // 18 +0.00735339 , // 19 -0.00253048 , // 20 -0.02189728 , // 21 +0.00134354 , // 22 -0.01477966 , // 23 -0.04434362 , // 24 -0.00479913 , // 25 -0.03000591 , // 26 -0.07609801 , // 27 +0.00258946 , // 28 -0.04271980 , // 29 -0.14710769 , // 30 +0.14198817 , // 31 +0.42372962 , // 32 +0.14198817 , // 33 -0.14710769 , // 34 -0.04271980 , // 35 +0.00258946 , // 36 -0.07609801 , // 37 -0.03000591 , // 38 -0.00479913 , // 39 -0.04434362 , // 40 -0.01477966 , // 41 +0.00134354 , // 42 -0.02189728 , // 43 -0.00253048 , // 44 +0.00735339 , // 45 -0.00786599 , // 46 +0.00372045 , // 47 +0.00906983 , // 48 -0.00157675 , // 49 +0.00439713 , // 50 +0.00696821 , // 51 -0.00032116 , // 52 +0.00224833 , // 53 +0.00360739 , // 54 -0.00077327 , // 55 +0.00014945 , // 56 +0.00119188 , // 57 -0.00083336 , // 58 -0.00057780 , // 59 +0.00026218 , // 60 -0.00027704 , // 61 -0.00031179 , // 62 +0.00002831 // 63 } ; double Alias_2k_Q[Alias_2k_Len] = { -0.00000000 , // 0 -0.00015159 , // 1 -0.00014608 , // 2 +0.00036770 , // 3 +0.00010339 , // 4 -0.00031581 , // 5 +0.00128580 , // 6 +0.00120582 , // 7 -0.00051862 , // 8 +0.00225671 , // 9 +0.00226918 , // 10 -0.00216340 , // 11 +0.00181728 , // 12 +0.00176390 , // 13 -0.00692361 , // 14 -0.00105199 , // 15 -0.00081355 , // 16 -0.01498960 , // 17 -0.00512332 , // 18 -0.00331671 , // 19 -0.02395357 , // 20 -0.00602102 , // 21 -0.00049919 , // 22 -0.02943663 , // 23 +0.00351421 , // 24 +0.01576926 , // 25 -0.02737092 , // 26 +0.03572558 , // 27 +0.06272088 , // 28 -0.01659059 , // 29 +0.15254255 , // 30 +0.33394426 , // 31 -0.00000000 , // 32 -0.33394426 , // 33 -0.15254255 , // 34 +0.01659059 , // 35 -0.06272088 , // 36 -0.03572558 , // 37 +0.02737092 , // 38 -0.01576926 , // 39 -0.00351421 , // 40 +0.02943663 , // 41 +0.00049919 , // 42 +0.00602102 , // 43 +0.02395357 , // 44 +0.00331671 , // 45 +0.00512332 , // 46 +0.01498960 , // 47 +0.00081355 , // 48 +0.00105199 , // 49 +0.00692361 , // 50 -0.00176390 , // 51 -0.00181728 , // 52 +0.00216340 , // 53 -0.00226918 , // 54 -0.00225671 , // 55 +0.00051862 , // 56 -0.00120582 , // 57 -0.00128580 , // 58 +0.00031581 , // 59 -0.00010339 , // 60 -0.00036770 , // 61 +0.00014608 , // 62 +0.00015159 // 63 } ; fldigi-4.2.05/src/mt63/mt63base.cxx0000664000175000017500000011615214532252172013524 00000000000000/* * mt63base.cxx -- MT63 transmitter and receiver in C++ for LINUX * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2011 Dave Freese, W1HKJ * * base class for use by fldigi * modified from original * excluded CW_ID which is a part of the base modem class for fldigi * changed all floats to double and removed all float functions/methods * changed from int* to double* for all sound card buffer transfers * * Modified base class for rx and tx to allow variable center frequency * for baseband signal * * based on mt63 code by Pawel Jalocha * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #include #include // only for control printf's // #include #include #include "dsp.h" #include "mt63base.h" #include "symbol.dat" // symbol shape #include "mt63intl.dat" // interleave patterns // W1HKJ // fixed filter shapes replaced by maximally flat blackman3 filters // that are generated as required as signal center frequency is changed //#include "alias_k5.dat" // anti-alias filter shapes //#include "alias_1k.dat" // for 500, 1000 and 2000 Hz modes //#include "alias_2k.dat" // ========================================================================== // MT63 transmitter code MT63tx::MT63tx() { TxVect = NULL; dspPhaseCorr = NULL; } MT63tx::~MT63tx() { free(TxVect); free(dspPhaseCorr); } void MT63tx::Free(void) { free(TxVect); TxVect = NULL; free(dspPhaseCorr); dspPhaseCorr = NULL; Encoder.Free(); FFT.Free(); Window.Free(); Comb.Free(); WindowBuff.Free(); } // W1HKJ // added freq paramter to Preset int MT63tx::Preset(double freq, int BandWidth, int LongInterleave) { int i, p, step, incr, mask; // W1HKJ // values used to computer the blackman3 passband filter shape double hbw = 1.5*BandWidth / 2; double omega_low = (freq - hbw); double omega_high = (freq + hbw); if (omega_low < 100) omega_low = 100; if (omega_high > 4000) omega_high = 4000; omega_low *= (M_PI / 4000); omega_high *= (M_PI / 4000); mask = FFT.Size - 1; DataCarriers = 64; switch(BandWidth) { case 500: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 256 / 500 + .5); AliasFilterLen = 128; DecimateRatio = 8; break; case 1000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 128 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 4; break; case 2000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 64 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 2; break; default: return -1; } WindowLen = SymbolLen; TxWindow = SymbolShape; TxAmpl = 4.0 / DataCarriers; // for maximum undistorted output CarrMarkCode = 0x16918BBEL; CarrMarkAmpl = 0; if (LongInterleave) { DataInterleave = 64; InterleavePattern = LongIntlvPatt; } else { DataInterleave = 32; InterleavePattern = ShortIntlvPatt; } if (dspRedspAllocArray(&TxVect, DataCarriers)) goto Error; if (dspRedspAllocArray(&dspPhaseCorr, DataCarriers)) goto Error; if (WindowBuff.EnsureSpace(2 * WindowLen)) goto Error; WindowBuff.Len = 2 * WindowLen; if (Encoder.Preset(DataCarriers, DataInterleave, InterleavePattern, 1)) goto Error; if (FFT.Preset(WindowLen)) goto Error; if (Window.Preset(WindowLen, SymbolSepar / 2, TxWindow)) goto Error; // W1HKJ // Preset the combining instance, NULL pointers in lieu of fixed filter shapes // blackman3 filter provides flat passband and sufficient out-of-band rejection // to insure that all unwanted FFT components (periodic signal) are suppressed // by 70 dB or more if ( Comb.Preset( AliasFilterLen, NULL, NULL, DecimateRatio ) ) goto Error; // compute new combining filter shape Comb.ComputeShape(omega_low, omega_high, dspWindowBlackman3); // Preset the initial dspPhase for each data carrier. // Here we only compute indexes to the FFT twiddle factors // so the actual vector is FFT.Twiddle[TxVect[i]] for (step = 0, incr = 1, p = 0, i = 0; i < DataCarriers; i++) { TxVect[i] = p; step += incr; p = (p + step) & mask; } // compute dspPhase correction between successive FFTs separated by SymbolSepar // Like above we compute indexes to the FFT.Twiddle[] incr = (SymbolSepar * DataCarrSepar) & mask; for (p = (SymbolSepar * FirstDataCarr) & mask, i = 0; i < DataCarriers; i++) { dspPhaseCorr[i] = p; p = (p + incr) & mask; } return 0; Error: Free(); return -1; } // W1HKJ // SendTune and ProcessTxVect are both modified to allow the FirstDataCarr // to be other than WindowLen / 2 as in the original design // The peridocity of the FFT is taken advantage of by computing the positions // of the bit indices modulo FFT.size, i.e. r = FFT.BitRevIdx[c & (FFT.Size - 1)] int MT63tx::SendTune(bool twotones) { int i, c, r, mask; double Ampl; mask = FFT.Size - 1; Ampl = TxAmpl * sqrt(DataCarriers / 2); for (i = 0; i < DataCarriers; i++) TxVect[i] = (TxVect[i] + dspPhaseCorr[i]) & mask; for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im = WindowBuff.Data[i].re = 0.0; // W1HKJ // first tone at the lowest most MT63 carrier i = 0; c = FirstDataCarr; r = FFT.BitRevIdx[c & mask]; WindowBuff.Data[r].re = Ampl * FFT.Twiddle[TxVect[i]].re; WindowBuff.Data[r].im = (-Ampl) * FFT.Twiddle[TxVect[i]].im; // W1HKJ // 2nd tone at the highest most MT63 carrier + 1 // MT63 is specified as 500, 1000 and 2000 Hz wide signal format, but in // fact are narrower by one carrier spacing, i.e. 0 to N-1 carriers where // N = 64 if (twotones) { i = DataCarriers - 1; c = (FirstDataCarr + i * DataCarrSepar); r = WindowLen + FFT.BitRevIdx[c & mask]; WindowBuff.Data[r].re = Ampl * FFT.Twiddle[TxVect[i]].re; WindowBuff.Data[r].im = (-Ampl) * FFT.Twiddle[TxVect[i]].im; } // inverse FFT: WindowBuff is already scrambled FFT.CoreProc(WindowBuff.Data); FFT.CoreProc(WindowBuff.Data + WindowLen); // negate the imaginary part for the IFFT for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im *= (-1.0); // process the FFT values to produce a complex time domain vector Window.Process(&WindowBuff); // W1HKJ // convert the complex time domain vector to a real time domain signal // suitably filtered by the anti-alias filter used in the combiner Comb.Process(&Window.Output); return 0; } int MT63tx::SendChar(char ch) { int i,mask,flip; Encoder.Process(ch); // encode and interleave the character // print the character and the DataBlock being sent // printf("0x%02x [%c] => ", ch, ch>=' ' ? ch : '.'); // for (i=0; i only dspPhase correction if (Encoder.Output[i]) TxVect[i] = (TxVect[i] + dspPhaseCorr[i]) & mask; // data bit = 0 => dspPhase flip + dspPhase correction else TxVect[i] = (TxVect[i] + dspPhaseCorr[i] + flip) & mask; } ProcessTxVect(); return 0; } int MT63tx::SendJam(void) { int i,mask,left,right; int j = 0; mask = FFT.Size-1; left = FFT.Size / 4; right = 3 * (FFT.Size / 4); for (i = 0; i < DataCarriers; i++) { j = i & mask; if (rand() & 0x100) // turn left 90 degrees TxVect[j] = (TxVect[j] + dspPhaseCorr[j] + left) & mask; else // turn right 90 degrees TxVect[j] = (TxVect[j] + dspPhaseCorr[j] + right) & mask; } ProcessTxVect(); return 0; } // W1HKJ // principal change from original is modulo arithmetic used to creat // WindowBuff.Data vectors int MT63tx::ProcessTxVect(void) { int i, c, r, mask; mask = FFT.Size - 1; for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im = WindowBuff.Data[i].re = 0.0; for ( i = 0, c = FirstDataCarr; i < DataCarriers; i++, c += DataCarrSepar) { r = FFT.BitRevIdx[c & mask] + WindowLen * (i & 1); WindowBuff.Data[r].re = TxAmpl*FFT.Twiddle[TxVect[i]].re; WindowBuff.Data[r].im = (-TxAmpl)*FFT.Twiddle[TxVect[i]].im; } FFT.CoreProc(WindowBuff.Data); FFT.CoreProc(WindowBuff.Data + WindowLen); // negate the imaginary part for the IFFT for (i = 0; i < 2 * WindowLen; i++) WindowBuff.Data[i].im *= (-1.0); Window.Process(&WindowBuff); // W1HKJ // audio output to be sent out is in Comb.Output Comb.Process(&Window.Output); return 0; } int MT63tx::SendSilence(void) { Window.ProcessSilence(2); Comb.Process(&Window.Output); return 0; } // ========================================================================== // Character encoder and block interleave for the MT63 modem MT63encoder::MT63encoder() { IntlvPipe = NULL; WalshBuff = NULL; Output = NULL; IntlvPatt=NULL; } MT63encoder::~MT63encoder() { free(IntlvPipe); free(WalshBuff); free(Output); free(IntlvPatt); } void MT63encoder::Free() { free(IntlvPipe); free(WalshBuff); free(Output); free(IntlvPatt); IntlvPipe = NULL; WalshBuff = NULL; Output = NULL; IntlvPatt = NULL; } int MT63encoder::Preset(int Carriers, int Intlv, int *Pattern, int PreFill) { int i, p; if (!dspPowerOf2(Carriers)) goto Error; DataCarriers = Carriers; IntlvLen = Intlv; IntlvSize = IntlvLen * DataCarriers; if (IntlvLen) { if (dspRedspAllocArray(&IntlvPipe, IntlvSize)) goto Error; if (PreFill) for (i = 0; i < IntlvSize; i++) IntlvPipe[i] = rand() & 1; else dspClearArray(IntlvPipe,IntlvSize); if (dspRedspAllocArray(&IntlvPatt, DataCarriers)) goto Error; IntlvPtr = 0; } if (dspRedspAllocArray(&WalshBuff, DataCarriers)) goto Error; if (dspRedspAllocArray(&Output, DataCarriers)) goto Error; CodeMask = 2 * DataCarriers - 1; for (p = 0, i = 0; i < DataCarriers; i++) { IntlvPatt[i] = p * DataCarriers; p += Pattern[i]; if (p >= IntlvLen) p -= IntlvLen; } return 0; Error: Free(); return -1; } int MT63encoder::Process(char code) // encode an ASCII character "code" { int i, k; code &= CodeMask; for (i = 0; i < DataCarriers; i++) WalshBuff[i] = 0; if (code < DataCarriers) WalshBuff[(int)code] = 1.0; else WalshBuff[code-DataCarriers] = (-1.0); dspWalshInvTrans(WalshBuff, DataCarriers); if (IntlvLen) { for (i = 0; i < DataCarriers; i++) IntlvPipe[IntlvPtr + i] = (WalshBuff[i] < 0.0); for (i = 0; i < DataCarriers; i++) { k = IntlvPtr + IntlvPatt[i]; if (k >= IntlvSize) k -= IntlvSize; Output[i] = IntlvPipe[k+i]; } IntlvPtr += DataCarriers; if (IntlvPtr >= IntlvSize) IntlvPtr -= IntlvSize; } else for (i = 0; i < DataCarriers; i++) Output[i] = (WalshBuff[i] < 0.0); return 0; } // After encoding the "Output" array contains the bits to be transmitted // ========================================================================== // MT63 decoder and deinterleaver MT63decoder::MT63decoder() { IntlvPipe = NULL; IntlvPatt = NULL; WalshBuff = NULL; DecodeSnrMid = NULL; DecodeSnrOut = NULL; DecodePipe = NULL; } MT63decoder::~MT63decoder() { free(IntlvPipe); free(IntlvPatt); free(WalshBuff); free(DecodeSnrMid); free(DecodeSnrOut); free(DecodePipe); } void MT63decoder::Free() { free(IntlvPipe); IntlvPipe = NULL; free(IntlvPatt); IntlvPatt = NULL; free(WalshBuff); WalshBuff = NULL; free(DecodeSnrMid); free(DecodeSnrOut); DecodeSnrMid = NULL; DecodeSnrOut = NULL; free(DecodePipe); DecodePipe = NULL; } int MT63decoder::Preset(int Carriers, int Intlv, int *Pattern, int Margin, int Integ) { int i,p; if (!dspPowerOf2(Carriers)) goto Error; DataCarriers = Carriers; ScanLen = 2 * Margin + 1; ScanSize = DataCarriers + 2 * Margin; dspLowPass2Coeff(Integ,W1,W2,W5); DecodeLen = Integ / 2; DecodeSize = DecodeLen * ScanLen; if (dspRedspAllocArray(&DecodePipe, DecodeSize)) goto Error; dspClearArray(DecodePipe, DecodeSize); DecodePtr = 0; IntlvLen = Intlv; // printf("%d:",IntlvLen); if (dspRedspAllocArray(&IntlvPatt, DataCarriers)) goto Error; for (p = 0, i = 0; i < DataCarriers; i++) { IntlvPatt[i] = p * ScanSize; // printf(" %2d",p); p += Pattern[i]; if (p >= IntlvLen) p -= IntlvLen; } // printf("\n"); IntlvSize = (IntlvLen + 1) * ScanSize; if (dspRedspAllocArray(&IntlvPipe, IntlvSize)) goto Error; dspClearArray(IntlvPipe, IntlvSize); IntlvPtr = 0; if (dspRedspAllocArray(&WalshBuff, DataCarriers)) goto Error; if (dspRedspAllocArray(&DecodeSnrMid, ScanLen)) goto Error; if (dspRedspAllocArray(&DecodeSnrOut, ScanLen)) goto Error; dspClearArray(DecodeSnrMid, ScanLen); dspClearArray(DecodeSnrOut, ScanLen); SignalToNoise = 0.0; CarrOfs = 0; return 0; Error: Free(); return -1; } int MT63decoder::Process(double *data) { int s, i, k; double Min, Max, Sig, Noise, SNR; int MinPos,MaxPos,code; dspCopyArray(IntlvPipe + IntlvPtr, data, ScanSize); // printf("Decoder [%d/%d/%d]: \n",IntlvPtr,IntlvSize,ScanSize); for (s = 0; s < ScanLen; s++) { // printf(" %2d:",s); for (i = 0; i < DataCarriers; i++) { k = IntlvPtr - ScanSize - IntlvPatt[i]; if (k < 0) k += IntlvSize; if ((s & 1) && (i & 1)) { k += ScanSize; if (k >= IntlvSize) k-=IntlvSize; } WalshBuff[i] = IntlvPipe[k + s + i]; // printf(" %4d",k/ScanSize); } // printf("\n"); dspWalshTrans(WalshBuff, DataCarriers); Min = dspFindMin(WalshBuff, DataCarriers, MinPos); Max = dspFindMax(WalshBuff, DataCarriers, MaxPos); if (fabs(Max) > fabs(Min)) { code = MaxPos + DataCarriers; Sig = fabs(Max); WalshBuff[MaxPos] = 0.0; } else { code = MinPos; Sig = fabs(Min); WalshBuff[MinPos] = 0.0; } Noise = dspRMS(WalshBuff, DataCarriers); if (Noise > 0.0) SNR = Sig/Noise; else SNR = 0.0; dspLowPass2(SNR, DecodeSnrMid[s], DecodeSnrOut[s], W1, W2, W5); // printf("%2d: %02x => %c, %5.2f/%5.2f=>%5.2f <%5.2f>\n", // s,code,code<' ' ? '.' : (char)code, // Sig,Noise,SNR,DecodeSnrOut[s]); DecodePipe[DecodePtr+s]=code; } IntlvPtr += ScanSize; if (IntlvPtr >= IntlvSize) IntlvPtr = 0; DecodePtr += ScanLen; if (DecodePtr >= DecodeSize) DecodePtr = 0; Max = dspFindMax(DecodeSnrOut, ScanLen, MaxPos); Output = DecodePipe[DecodePtr + MaxPos]; SignalToNoise = Max; CarrOfs = MaxPos - (ScanLen - 1) / 2; /* code=Output; if ((code>=' ')||(code=='\n')||(code=='\r')) printf("%c",code); else if (code!='\0') printf("<%02X>",code); */ return 0; } // ========================================================================== // MT63 receiver code MT63rx::MT63rx() { int s; FFTbuff = NULL; FFTbuff2 = NULL; for (s = 0; s < 4; s++) SyncPipe[s] = NULL; SyncPhCorr = NULL; for (s = 0; s < 4; s++) { CorrelMid[s] = NULL; CorrelOut[s] = NULL; } dspPowerMid = NULL; dspPowerOut = NULL; for (s = 0; s < 4; s++) CorrelNorm[s] = NULL; for (s = 0; s < 4; s++) CorrelAver[s] = NULL; SymbFit = NULL; SymbPipe = NULL; FreqPipe = NULL; RefDataSlice = NULL; DataPipeLen = 0; DataPipe = NULL; DataPwrMid = NULL; DataPwrOut = NULL; DataSqrMid = NULL; DataSqrOut = NULL; DataVect = NULL; DatadspPhase = NULL; DatadspPhase2 = NULL; SpectradspPower = NULL; } MT63rx::~MT63rx() { int s; free(FFTbuff); free(FFTbuff2); for (s = 0; s < 4; s++) free(SyncPipe[s]); free(SyncPhCorr); for (s = 0; s < 4; s++) { free(CorrelMid[s]); free(CorrelOut[s]); } free(dspPowerMid); free(dspPowerOut); for (s = 0; s < 4; s++) free(CorrelNorm[s]); for (s = 0; s < 4; s++) free(CorrelAver[s]); free(SymbFit); free(SymbPipe); free(FreqPipe); free(RefDataSlice); dspFreeArray2D(DataPipe, DataPipeLen); // for (s=0; s 4000) omega_high = 4000; omega_low *= (M_PI / 4000); omega_high *= (M_PI/ 4000); switch(BandWidth) { case 500: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 256 / 500 + 0.5); AliasFilterLen = 128; DecimateRatio = 8; break; case 1000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 128 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 4; break; case 2000: FirstDataCarr = (int)floor((freq - BandWidth / 2.0) * 64 / 500 + 0.5); AliasFilterLen = 64; DecimateRatio = 2; break; default: return -1; } DataCarriers = 64; // 64 carriers WindowLen = SymbolLen; // the symbol length RxWindow = SymbolShape; // the symbol shape // RxWindow, WindowLen, SymbolSepar, DataCarrSepar are tuned one for another // to minimize inter-symbol interference (ISI) and one should not change // them independently or ISI will increase. CarrMarkCode = 0x16918BBEL; IntegLen = Integ; // sync. integration period SymbolDiv = 4; // don't change this ScanMargin = 8; // we look 8 data carriers up and down SyncStep = SymbolSepar/SymbolDiv; ProcdspDelay = IntegLen * SymbolSepar; TrackPipeLen = IntegLen; if (LongInterleave) { DataInterleave = 64; InterleavePattern = LongIntlvPatt; } else { DataInterleave = 32; InterleavePattern = ShortIntlvPatt; } DataScanMargin = 8; err = FFT.Preset(WindowLen); if (err) goto Error; if (dspRedspAllocArray(&FFTbuff, WindowLen)) goto Error; if (dspRedspAllocArray(&FFTbuff2, WindowLen)) goto Error; WindowLenMask = WindowLen - 1; // W1HKJ // InpSplit is the anti-aliasing filter that converts a real time domain // signal into a complex time domain signal with pre-filtering. // the black3man3 filter provides very sharp skirts with a flat // passband. err = InpSplit.Preset(AliasFilterLen, NULL, NULL, DecimateRatio); if (err) goto Error; err = InpSplit.ComputeShape(omega_low, omega_high, dspWindowBlackman3); if (err) goto Error; err = TestOfs.Preset(-0.25 * (2.0 * M_PI / WindowLen)); // for decoder tests only if (err) goto Error; err = ProcLine.Preset(ProcdspDelay + WindowLen + SymbolSepar); if (err) goto Error; SyncProcPtr = 0; ScanFirst = FirstDataCarr - ScanMargin * DataCarrSepar; // first FFT bin to scan if (ScanFirst < 0) ScanFirst += WindowLen; ScanLen = (DataCarriers + 2 * ScanMargin) * DataCarrSepar; // number of FFT bins to scan for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&SyncPipe[s], ScanLen)) goto Error; dspClearArray(SyncPipe[s], ScanLen); } SyncPtr = 0; if (dspRedspAllocArray(&SyncPhCorr, ScanLen)) goto Error; for (c = (ScanFirst * SymbolSepar) & WindowLenMask, i = 0; i < ScanLen; i++) { SyncPhCorr[i].re = FFT.Twiddle[c].re * FFT.Twiddle[c].re - FFT.Twiddle[c].im * FFT.Twiddle[c].im; SyncPhCorr[i].im = 2 * FFT.Twiddle[c].re * FFT.Twiddle[c].im; c = (c + SymbolSepar) & WindowLenMask; } for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&CorrelMid[s], ScanLen)) goto Error; dspClearArray(CorrelMid[s], ScanLen); if (dspRedspAllocArray(&CorrelOut[s], ScanLen)) goto Error; dspClearArray(CorrelOut[s], ScanLen); } dspLowPass2Coeff(IntegLen, W1, W2, W5); if (dspRedspAllocArray(&dspPowerMid, ScanLen)) goto Error; dspClearArray(dspPowerMid, ScanLen); if (dspRedspAllocArray(&dspPowerOut, ScanLen)) goto Error; dspClearArray(dspPowerOut, ScanLen); dspLowPass2Coeff(IntegLen * SymbolDiv, W1p, W2p, W5p); for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&CorrelNorm[s], ScanLen)) goto Error; } FitLen = 2 * ScanMargin * DataCarrSepar; for (s = 0; s < SymbolDiv; s++) { if (dspRedspAllocArray(&CorrelAver[s], FitLen)) goto Error; } if (dspRedspAllocArray(&SymbFit, FitLen)) goto Error; if (dspRedspAllocArray(&SymbPipe, TrackPipeLen)) goto Error; dspClearArray(SymbPipe, TrackPipeLen); if (dspRedspAllocArray(&FreqPipe, TrackPipeLen)) goto Error; dspClearArray(FreqPipe, TrackPipeLen); TrackPipePtr = 0; SymbFitPos = ScanMargin * DataCarrSepar; SyncLocked = 0; SyncSymbConf = 0.0; SyncFreqOfs = 0.0; SyncFreqDev = 0.0; SymbPtr = 0; SyncSymbShift = 0.0; SyncHoldThres = 1.5 * sqrt(1.0 / (IntegLen * DataCarriers)); SyncLockThres = 1.5 * SyncHoldThres; DataProcPtr = (-ProcdspDelay); DataScanLen = DataCarriers + 2 * DataScanMargin; DataScanFirst = FirstDataCarr - DataScanMargin * DataCarrSepar; if (dspRedspAllocArray(&RefDataSlice, DataScanLen)) goto Error; dspClearArray(RefDataSlice, DataScanLen); dspFreeArray2D(DataPipe, DataPipeLen); DataPipeLen = IntegLen / 2; dspLowPass2Coeff(IntegLen, dW1, dW2, dW5); if (dspAllocArray2D(&DataPipe, DataPipeLen, DataScanLen)) { DataPipeLen = 0; goto Error; } dspClearArray2D(DataPipe, DataPipeLen, DataScanLen); DataPipePtr = 0; if (dspRedspAllocArray(&DataPwrMid, DataScanLen)) goto Error; dspClearArray(DataPwrMid, DataScanLen); if (dspRedspAllocArray(&DataPwrOut, DataScanLen)) goto Error; dspClearArray(DataPwrOut, DataScanLen); if (dspRedspAllocArray(&DataSqrMid, DataScanLen)) goto Error; dspClearArray(DataSqrMid, DataScanLen); if (dspRedspAllocArray(&DataSqrOut, DataScanLen)) goto Error; dspClearArray(DataSqrOut, DataScanLen); if (dspRedspAllocArray(&DataVect, DataScanLen)) goto Error; if (dspRedspAllocArray(&DatadspPhase, DataScanLen)) goto Error; if (dspRedspAllocArray(&DatadspPhase2, DataScanLen)) goto Error; err = Decoder.Preset(DataCarriers, DataInterleave, InterleavePattern, DataScanMargin, IntegLen); if (err) goto Error; SpectraDisplay = Display; if (SpectraDisplay) { if (dspRedspAllocArray(&SpectradspPower, WindowLen)) goto Error; } return 0; Error: Free(); return -1; } int MT63rx::Process(double_buff *Input) { int s1,s2; // TestOfs.Omega+=(-0.005*(2.0*M_PI/512)); // simulate frequency drift Output.Len = 0; // W1HKJ // convert the real data input into a complex time domain signal, // anti-aliased using the blackman3 filter // subsequent rx signal processing takes advantage of the periodic nature // of the resultant FFT of the anti-aliased input signal. Actual decoding // is at baseband. InpSplit.Process(Input); ProcLine.Process(&InpSplit.Output); // TestOfs.Process(&InpSplit.Output); // ProcLine.Process(&TestOfs.Output); // printf("New input, Len=%d/%d\n",Input->Len,ProcLine.InpLen); while((SyncProcPtr+WindowLen) < ProcLine.InpLen) { SyncProcess(ProcLine.InpPtr + SyncProcPtr); // printf("SyncSymbConf=%5.2f, SyncLock=%d, SyncProcPtr=%d, SyncPtr=%d, SymbPtr=%d, SyncSymbShift=%5.1f, SyncFreqOfs=%5.2f =>", // SyncSymbConf,SyncLocked,SyncProcPtr,SyncPtr,SymbPtr,SyncSymbShift,SyncFreqOfs); if (SyncPtr == SymbPtr) { s1 = SyncProcPtr - ProcdspDelay + ((int)SyncSymbShift - SymbPtr * SyncStep); s2 = s1 + SymbolSepar / 2; // printf(" Sample at %d,%d (SyncProcPtr-%d), time diff.=%d\n",s1,s2,SyncProcPtr-s1,s1-DataProcPtr); DataProcess(ProcLine.InpPtr + s1, ProcLine.InpPtr + s2, SyncFreqOfs, s1 - DataProcPtr); DataProcPtr = s1; } // printf("\n"); SyncProcPtr += SyncStep; } SyncProcPtr -= ProcLine.InpLen; DataProcPtr -= ProcLine.InpLen; return 0; } void MT63rx::DoCorrelSum(dspCmpx *Correl1, dspCmpx *Correl2, dspCmpx *Aver) { dspCmpx sx; int i, s, d; s = 2 * DataCarrSepar; d = DataCarriers * DataCarrSepar; sx.re = sx.im = 0.0; for (i = 0; i < d; i+=s) { sx.re += Correl1[i].re; sx.im += Correl1[i].im; sx.re += Correl2[i].re; sx.im += Correl2[i].im; } Aver[0].re = sx.re / DataCarriers; Aver[0].im = sx.im / DataCarriers; for (i = 0; i < (FitLen-s); ) { sx.re -= Correl1[i].re; sx.im -= Correl1[i].im; sx.re -= Correl2[i].re; sx.im -= Correl2[i].im; sx.re += Correl1[i+d].re; sx.im -= Correl1[i+d].im; sx.re += Correl2[i+d].re; sx.im -= Correl2[i+d].im; i += s; Aver[i].re = sx.re / DataCarriers; Aver[i].im = sx.im / DataCarriers; } } void MT63rx::SyncProcess(dspCmpx *Slice) { int i, j, k, r, s, s2; double pI, pQ; dspCmpx Correl; dspCmpx *PrevSlice; double I, Q; double dI, dQ; double P,A; double w0, w1; double Fl, F0, Fu; dspCmpx SymbTime; double SymbConf, SymbShift, FreqOfs; double dspRMS; // int Loops; int Incl; SyncPtr = (SyncPtr + 1) & (SymbolDiv - 1); // increment the correlators pointer for (i = 0; i < WindowLen; i++) { r = FFT.BitRevIdx[i]; FFTbuff[r].re = Slice[i].re * RxWindow[i]; FFTbuff[r].im = Slice[i].im * RxWindow[i]; } FFT.CoreProc(FFTbuff); if (SpectraDisplay) { for ( i = 0, j = FirstDataCarr + (DataCarriers / 2) * DataCarrSepar - WindowLen / 2; (i < WindowLen) && ( j 0.0) { dI = (I * I - Q * Q) / A; dQ = (2 * I * Q) / A; } else { dI = dQ = 0.0; } dspLowPass2(P, dspPowerMid[i], dspPowerOut[i], W1p, W2p, W5p); pI = PrevSlice[i].re * SyncPhCorr[i].re - PrevSlice[i].im * SyncPhCorr[i].im; pQ = PrevSlice[i].re * SyncPhCorr[i].im + PrevSlice[i].im * SyncPhCorr[i].re; Correl.re = dQ * pQ + dI * pI; Correl.im = dQ * pI - dI * pQ; dspLowPass2(&Correl, CorrelMid[SyncPtr] + i, CorrelOut[SyncPtr] + i, W1, W2, W5); PrevSlice[i].re = dI; PrevSlice[i].im = dQ; } if (SyncPtr == (SymbPtr^2)) { for (s = 0; s < SymbolDiv; s++) { // normalize the correlations for (i = 0; i < ScanLen; i++) { if (dspPowerOut[i] > 0.0) { CorrelNorm[s][i].re = CorrelOut[s][i].re / dspPowerOut[i]; CorrelNorm[s][i].im = CorrelOut[s][i].im / dspPowerOut[i]; } else CorrelNorm[s][i].im = CorrelNorm[s][i].re = 0.0; } } /* // another way to normalize - a better one ? for (i=0; i0.0) { for (s=0; s 1) j -= (k - 1) * DataCarrSepar; else if (k < (-1)) j -= (k + 1) * DataCarrSepar; SymbFitPos = j; // printf(" => %2d",j); if (P > 0.0) { SymbConf = dspAmpl(SymbFit[j]) + 0.5 * (dspAmpl(SymbFit[j + 1]) + dspAmpl(SymbFit[j - 1])); SymbConf *= 0.5; I = SymbFit[j].re + 0.5 * (SymbFit[j - 1].re + SymbFit[j + 1].re); Q = SymbFit[j].im + 0.5 * (SymbFit[j - 1].im + SymbFit[j + 1].im); SymbTime.re = I; SymbTime.im = Q; SymbShift = (dspPhase(SymbTime) / (2 * M_PI)) * SymbolDiv; if (SymbShift < 0) SymbShift += SymbolDiv; // for (i=j-1; i<=j+1; i++) printf(" [%+5.2f,%+5.2f]",SymbFit[i].re,SymbFit[i].im); // make first estimation of FreqOfs // printf(" -> [%+5.2f,%+5.2f] =>",I,Q); // for (i=j-2; i<=j+2; i++) printf(" %+6.3f",I*SymbFit[i].re+Q*SymbFit[i].im); pI = dspScalProd(I, Q, SymbFit[j]) + 0.7 * dspScalProd(I, Q, SymbFit[j - 1]) + 0.7 * dspScalProd(I, Q, SymbFit[j + 1]); pQ = 0.7 * dspScalProd(I, Q, SymbFit[j + 1]) - 0.7 * dspScalProd(I, Q, SymbFit[j - 1]) + 0.5 * dspScalProd(I, Q, SymbFit[j + 2]) - 0.5 * dspScalProd(I, Q, SymbFit[j - 2]); FreqOfs = j + dspPhase(pI, pQ) / (2.0 * M_PI / 8); /* SYNC TEST */ // refine the FreqOfs i = (int)floor(FreqOfs + 0.5); s = (int)floor(SymbShift); s2 = (s + 1) & (SymbolDiv - 1); // printf(" [%5.2f,%2d,%d,%d] ",FreqOfs,i,s,s2); w0 = (s + 1 - SymbShift); w1 = (SymbShift - s); // printf(" [%4.2f,%4.2f] ",w0,w1); A = (0.5 * WindowLen) / SymbolSepar; I = w0 * CorrelAver[s][i].re + w1 * CorrelAver[s2][i].re; Q = w0 * CorrelAver[s][i].im + w1 * CorrelAver[s2][i].im; // printf(" [%5.2f,%2d] -> [%+5.2f,%+5.2f]",FreqOfs,i,I,Q); // FreqOfs=i+dspPhase(I,Q)/(2.0*M_PI)*0.5*A; // printf(" => %5.2f",FreqOfs); F0 = i + dspPhase(I, Q) / (2.0 * M_PI) * A - FreqOfs; Fl = F0 - A; Fu = F0 + A; if (fabs(Fl) < fabs(F0)) FreqOfs += (fabs(Fu) < fabs(Fl)) ? Fu : Fl; else FreqOfs += (fabs(Fu) < fabs(F0)) ? Fu : F0; // printf(" => (%5.2f,%5.2f,%5.2f) => %5.2f",Fl,F0,Fu,FreqOfs); } else { SymbTime.re = SymbTime.im = 0.0; SymbConf = 0.0; SymbShift = 0.0; FreqOfs = 0.0; } // here we have FreqOfs and SymbTime.re/im // printf("FreqOfs=%5.2f",FreqOfs); if (SyncLocked) { // flip the SymbTime if it doesn't agree with the dspAverage if (dspScalProd(SymbTime, AverSymb) < 0.0) { SymbTime.re = (-SymbTime.re); SymbTime.im = (-SymbTime.im); FreqOfs -= DataCarrSepar; } // reduce the freq. offset towards the dspAverage offset A = 2 * DataCarrSepar; k = (int)floor((FreqOfs - AverFreq) / A + 0.5); FreqOfs -= k * A; /* SYNC TEST */ A = (0.5 * WindowLen) / SymbolSepar; F0 = FreqOfs - AverFreq; // correct freq. auto-correlator wrap Fl = F0 - A; Fu = F0 + A; if (fabs(Fl) < fabs(F0)) FreqOfs += (fabs(Fu) < fabs(Fl)) ? A : -A; else FreqOfs += (fabs(Fu) < fabs(F0)) ? A : 0.0; // printf(" => (%5.2f,%5.2f,%5.2f) => %5.2f",Fl,F0,Fu,FreqOfs); } else { // of if (SyncLocked) // flip SymbTime if it doesn't agree with the previous if (dspScalProd(SymbTime, SymbPipe[TrackPipePtr]) < 0.0) { SymbTime.re = (-SymbTime.re); SymbTime.im = (-SymbTime.im); FreqOfs -= DataCarrSepar; } // reduce the FreqOfs towards zero A = 2 * DataCarrSepar; k = (int)floor(FreqOfs / A + 0.5); FreqOfs -= k * A; /* SYNC TEST */ F0 = FreqOfs - FreqPipe[TrackPipePtr]; Fl = F0 - A; Fu = F0 + A; if (fabs(Fl) < fabs(F0)) FreqOfs += (fabs(Fu) < fabs(Fl)) ? A : -A; else FreqOfs += (fabs(Fu) < fabs(F0)) ? A : 0.0; } // printf(" => [%+5.2f,%+5.2f], %5.2f",SymbTime.re,SymbTime.im,FreqOfs); TrackPipePtr += 1; if (TrackPipePtr >= TrackPipeLen) TrackPipePtr -= TrackPipeLen; SymbPipe[TrackPipePtr] = SymbTime; // put SymbTime and FreqOfs into pipes FreqPipe[TrackPipePtr] = FreqOfs; // for averaging // find dspAverage symbol time // Loops = dspSelFitAver( SymbPipe, TrackPipeLen, (double)3.0, 4, AverSymb, dspRMS, Incl); // printf(" AverSymb=[%+5.2f,%+5.2f], dspRMS=%5.3f/%2d", // AverSymb.re,AverSymb.im,dspRMS,Incl); // find dspAverage freq. offset // Loops = dspSelFitAver( FreqPipe, TrackPipeLen, (double)2.5, 4, AverFreq, dspRMS, Incl); SyncFreqDev = dspRMS; // printf(" AverFreq=%+5.2f, dspRMS=%5.3f/%2d",AverFreq,dspRMS,Incl); SymbConf = dspAmpl(AverSymb); SyncSymbConf = SymbConf; SyncFreqOfs = AverFreq; if (SymbConf > 0.0) { SymbShift = dspPhase(AverSymb) / (2 * M_PI) * SymbolSepar; if (SymbShift < 0.0) SymbShift += SymbolSepar; SymbPtr = (int)floor((dspPhase(AverSymb) / (2 * M_PI)) * SymbolDiv); if (SymbPtr < 0) SymbPtr += SymbolDiv; SyncSymbShift = SymbShift; } if (SyncLocked) { if ((SyncSymbConf < SyncHoldThres) || (SyncFreqDev > 0.250)) SyncLocked = 0; } else { if ((SyncSymbConf > SyncLockThres) && (SyncFreqDev < 0.125)) SyncLocked = 1; } SyncSymbConf *= 0.5; // printf(" => SyncLocked=%d, SyncSymbShift=%5.1f, SymbPtr=%d", // SyncLocked,SyncSymbShift,SymbPtr); // printf("\n"); } // enf of if (SyncPtr==(SymbPtr^2)) } void MT63rx::DataProcess(dspCmpx *EvenSlice, dspCmpx *OddSlice, double FreqOfs, int TimeDist) { int i, c, r; dspCmpx Freq, Phas; int incr, p; double I, Q, P; dspCmpx Dtmp; dspCmpx Ftmp; // double Aver,dspRMS; int Loops,Incl; // Here we pickup a symbol in the data history. The time/freq. synchronizer // told us where it is in time and at which frequency offset (FreqOfs) // TimeDist is the distance in samples from the symbol we analyzed // in the previous call to this routine // FreqOfs=0.0; // for DEBUG only ! // printf("DataProcess: FreqOfs=%5.3f, TimeDist=%d, Locked=%d\n", // FreqOfs,TimeDist,SyncLocked); P = (-2 * M_PI * FreqOfs) / WindowLen; // make ready for frequency correction Freq.re = cos(P); Freq.im = sin(P); Phas.re = 1.0; Phas.im = 0.0; for (i = 0; i < WindowLen; i++) { // prepare slices for the FFT r = FFT.BitRevIdx[i]; // multiply by window and pre-scramble // if (i==2*ScanMargin) // printf("%3d: [%5.2f,%5.2f] [%5.2f,%5.2f]\n", // i, dspPhase.re,dspPhase.im, EvenSlice[i].re,EvenSlice[i].im); CdspcmpxMultAxB(I, Q, EvenSlice[i], Phas); FFTbuff[r].re = I * RxWindow[i]; FFTbuff[r].im = Q * RxWindow[i]; CdspcmpxMultAxB(I, Q, OddSlice[i], Phas); FFTbuff2[r].re = I * RxWindow[i]; FFTbuff2[r].im = Q * RxWindow[i]; CdspcmpxMultAxB(Dtmp, Phas, Freq); Phas = Dtmp; } FFT.CoreProc(FFTbuff); FFT.CoreProc(FFTbuff2); /* printf("FFTbuff [%3d...]:",FirstDataCarr-16); for (i=FirstDataCarr-16; i<=FirstDataCarr+32; i++) printf(" %+3d/%4.2f",i-FirstDataCarr,dspAmpl(FFTbuff[i])); printf("\n"); printf("FFTbuff2[%3d...]:",FirstDataCarr-16); for (i=FirstDataCarr-16; i<=FirstDataCarr+32; i++) printf(" %+3d/%4.2f",i-FirstDataCarr,dspAmpl(FFTbuff2[i])); printf("\n"); */ // printf(" FreqOfs=%5.2f: ",FreqOfs); // printf("Symbol vectors:\n"); incr = (TimeDist * DataCarrSepar) & WindowLenMask; // correct FFT dspPhase shift p = (TimeDist * DataScanFirst) & WindowLenMask; // due to time shift by for (c = DataScanFirst, i = 0; i < DataScanLen; ) { // TimeDist // printf("%2d,%3d:",i,c); // printf(" [%6.3f,%6.3f] [%6.3f,%6.3f]", // FFTbuff[c].re,FFTbuff[c].im, // FFTbuff2[c+DataCarrSepar].re,FFTbuff2[c+DataCarrSepar].im); // printf(" [%6.3f,%6.3f]/[%6.3f,%6.3f]", // FFTbuff2[c].re,FFTbuff2[c].im, // FFTbuff[c+DataCarrSepar].re,FFTbuff[c+DataCarrSepar].im); // printf(" %5.3f/%5.3f",dspAmpl(FFTbuff[c]),dspAmpl(FFTbuff[c+DataCarrSepar])); // printf(" %5.3f/%5.3f",dspAmpl(FFTbuff2[c+DataCarrSepar]),dspAmpl(FFTbuff2[c])); // printf("\n"); Phas = FFT.Twiddle[p]; CdspcmpxMultAxB(Dtmp, RefDataSlice[i], Phas); CdspcmpxMultAxBs(DataVect[i], FFTbuff[c], Dtmp); // printf("%3d,%2d: [%8.5f,%8.5f] / %8.5f\n", // c,i,FFTbuff[c].re,FFTbuff[c].im,DataPwrOut[i]); dspLowPass2( dspPower(FFTbuff[c]), DataPwrMid[i], DataPwrOut[i], dW1, dW2, dW5); RefDataSlice[i++] = FFTbuff[c]; c = (c + DataCarrSepar) & WindowLenMask; p = (p + incr) & WindowLenMask; Phas = FFT.Twiddle[p]; CdspcmpxMultAxB(Dtmp, RefDataSlice[i], Phas); CdspcmpxMultAxBs(DataVect[i], FFTbuff2[c], Dtmp); // printf("%3d,%2d: [%8.5f,%8.5f] / %8.5f\n", // c,i,FFTbuff2[c].re,FFTbuff2[c].im,DataPwrOut[i]); dspLowPass2( dspPower(FFTbuff2[c]), DataPwrMid[i], DataPwrOut[i], dW1, dW2, dW5); RefDataSlice[i++] = FFTbuff2[c]; c = (c + DataCarrSepar) & WindowLenMask; p = (p + incr) & WindowLenMask; } P = (-TimeDist * 2 * M_PI * FreqOfs) / WindowLen; Freq.re = cos(P); Freq.im = sin(P); for (i = 0; i < DataScanLen; i++) { CdspcmpxMultAxB(Ftmp, DataVect[i], Freq); // dspLowPass2(dspPower(Ftmp),DataPwrMid[i],DataPwrOut[i],dW1,dW2,dW5); // CdspcmpxMultAxB(Dtmp,Ftmp,Ftmp); // Dtmp.re=Ftmp.re*Ftmp.re-Ftmp.im*Ftmp.im; Dtmp.im=2*Ftmp.re*Ftmp.im; // dspLowPass2(&Dtmp,DataSqrMid+i,DataSqrOut+i,dW1,dW2,dW5); DataVect[i] = DataPipe[DataPipePtr][i]; DataPipe[DataPipePtr][i] = Ftmp; } DataPipePtr += 1; if (DataPipePtr >= DataPipeLen) DataPipePtr = 0; for (i = 0; i < DataScanLen; i++) { if (DataPwrOut[i] > 0.0) { P = DataVect[i].re / DataPwrOut[i]; if (P > 1.0) P = 1.0; else if (P < (-1.0)) P = (-1.0); DatadspPhase[i] = P; } else DatadspPhase[i] = 0.0; } Decoder.Process(DatadspPhase); Output.EnsureSpace(Output.Len + 1); Output.Data[Output.Len] = Decoder.Output; Output.Len += 1; /* printf("Demodulator output vectors:\n"); for (i=0; i %8.5f\n", i,DataVect[i].re,DataVect[i].im,DataPwrOut[i], DatadspPhase[i]); } */ /* for (i=0; i0.0) P=dspPhase(DataVect[i]); else P=0.0; DatadspPhase[i]=P; P*=2; if (P>M_PI) P-=2*M_PI; else if (P<(-M_PI)) P+=2*M_PI; DatadspPhase2[i]=P; printf("%2d: %6.3f [%6.3f,%6.3f] [%8.5f,%8.5f], %5.2f, %5.2f", i, DataPwrOut[i], DataSqrOut[i].re,DataSqrOut[i].im, DataVect[i].re,DataVect[i].im, DatadspPhase[i],DatadspPhase2[i]); if (DataPwrOut[i]>0.0) printf(" %6.3f",dspAmpl(DataSqrOut[i])/DataPwrOut[i]); printf("\n"); } Loops=dspSelFitAver(DatadspPhase2,DataScanLen,(double)2.5,4,Aver,dspRMS,Incl); printf("Aver=%5.2f, dspRMS=%5.2f, Incl=%d\n",Aver,dspRMS,Incl); */ } int MT63rx::SYNC_LockStatus(void) { return SyncLocked; } double MT63rx::SYNC_Confidence(void) { return SyncSymbConf <= 1.0 ? SyncSymbConf : 1.0; } double MT63rx::SYNC_FreqOffset(void) { return SyncFreqOfs / DataCarrSepar; } double MT63rx::SYNC_FreqDevdspRMS(void) { return SyncFreqDev / DataCarrSepar; } double MT63rx::SYNC_TimeOffset(void) { return SyncSymbShift / SymbolSepar; } double MT63rx::FEC_SNR(void) { return Decoder.SignalToNoise; } int MT63rx::FEC_CarrOffset(void) { return Decoder.CarrOfs; } double MT63rx::TotalFreqOffset(void) { return ( SyncFreqOfs + DataCarrSepar * Decoder.CarrOfs) * (8000.0 / DecimateRatio) / WindowLen; } fldigi-4.2.05/src/mt63/alias_k5.dat0000664000175000017500000001642614532252172013541 00000000000000/* * alias_k5.dat -- Anti-alias filter 500 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=128 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1000.0 // PassBandLow=437.5 PassBandUpp=1062.5 StopBandLow=250.0 StopBandUpp=1250.0 // => PeakInStopBand=-86.20 dB // Programmers's scale factor: 4.000000 // Programmers's comments: Anti-alias filter 500 Hz bandwidth, decimation by 8 const int Alias_k5_Len=128; double Alias_k5_I[Alias_k5_Len] = { +0.00006549 , // 0 +0.00007616 , // 1 +0.00006321 , // 2 -0.00007051 , // 3 -0.00037947 , // 4 -0.00077842 , // 5 -0.00101934 , // 6 -0.00079747 , // 7 +0.00003634 , // 8 +0.00128166 , // 9 +0.00238256 , // 10 +0.00269672 , // 11 +0.00193090 , // 12 +0.00045168 , // 13 -0.00082397 , // 14 -0.00100872 , // 15 +0.00002675 , // 16 +0.00132515 , // 17 +0.00130571 , // 18 -0.00111559 , // 19 -0.00545495 , // 20 -0.00950601 , // 21 -0.01047729 , // 22 -0.00687776 , // 23 +0.00011406 , // 24 +0.00696202 , // 25 +0.00989474 , // 26 +0.00760013 , // 27 +0.00255231 , // 28 -0.00031461 , // 29 +0.00291281 , // 30 +0.01174794 , // 31 +0.02064676 , // 32 +0.02211535 , // 33 +0.01194783 , // 34 -0.00696440 , // 35 -0.02537662 , // 36 -0.03322892 , // 37 -0.02665276 , // 38 -0.01145836 , // 39 +0.00006418 , // 40 -0.00230763 , // 41 -0.01840573 , // 42 -0.03588720 , // 43 -0.03743444 , // 44 -0.01306806 , // 45 +0.03074821 , // 46 +0.07251687 , // 47 +0.08836159 , // 48 +0.06850261 , // 49 +0.02612053 , // 50 -0.00913110 , // 51 -0.01081820 , // 52 +0.02342696 , // 53 +0.06482083 , // 54 +0.06779523 , // 55 -0.00021458 , // 56 -0.13123843 , // 57 -0.27054300 , // 58 -0.33962227 , // 59 -0.27857291 , // 60 -0.08448838 , // 61 +0.17772565 , // 62 +0.40136534 , // 63 +0.48897105 , // 64 +0.40136534 , // 65 +0.17772565 , // 66 -0.08448838 , // 67 -0.27857291 , // 68 -0.33962227 , // 69 -0.27054300 , // 70 -0.13123843 , // 71 -0.00021458 , // 72 +0.06779523 , // 73 +0.06482083 , // 74 +0.02342696 , // 75 -0.01081820 , // 76 -0.00913110 , // 77 +0.02612053 , // 78 +0.06850261 , // 79 +0.08836159 , // 80 +0.07251687 , // 81 +0.03074821 , // 82 -0.01306806 , // 83 -0.03743444 , // 84 -0.03588720 , // 85 -0.01840573 , // 86 -0.00230763 , // 87 +0.00006418 , // 88 -0.01145836 , // 89 -0.02665276 , // 90 -0.03322892 , // 91 -0.02537662 , // 92 -0.00696440 , // 93 +0.01194783 , // 94 +0.02211535 , // 95 +0.02064676 , // 96 +0.01174794 , // 97 +0.00291281 , // 98 -0.00031461 , // 99 +0.00255231 , // 100 +0.00760013 , // 101 +0.00989474 , // 102 +0.00696202 , // 103 +0.00011406 , // 104 -0.00687776 , // 105 -0.01047729 , // 106 -0.00950601 , // 107 -0.00545495 , // 108 -0.00111559 , // 109 +0.00130571 , // 110 +0.00132515 , // 111 +0.00002675 , // 112 -0.00100872 , // 113 -0.00082397 , // 114 +0.00045168 , // 115 +0.00193090 , // 116 +0.00269672 , // 117 +0.00238256 , // 118 +0.00128166 , // 119 +0.00003634 , // 120 -0.00079747 , // 121 -0.00101934 , // 122 -0.00077842 , // 123 -0.00037947 , // 124 -0.00007051 , // 125 +0.00006321 , // 126 +0.00007616 // 127 } ; double Alias_k5_Q[Alias_k5_Len] = { -0.00000000 , // 0 -0.00005367 , // 1 -0.00016555 , // 2 -0.00031225 , // 3 -0.00036198 , // 4 -0.00013710 , // 5 +0.00044740 , // 6 +0.00124698 , // 7 +0.00186810 , // 8 +0.00184150 , // 9 +0.00093521 , // 10 -0.00058853 , // 11 -0.00200435 , // 12 -0.00252488 , // 13 -0.00187551 , // 14 -0.00063367 , // 15 +0.00001967 , // 16 -0.00088264 , // 17 -0.00319853 , // 18 -0.00540709 , // 19 -0.00536877 , // 20 -0.00180828 , // 21 +0.00444555 , // 22 +0.01048985 , // 23 +0.01293826 , // 24 +0.01021951 , // 25 +0.00399079 , // 26 -0.00159281 , // 27 -0.00262530 , // 28 +0.00149295 , // 29 +0.00697645 , // 30 +0.00777564 , // 31 -0.00010048 , // 32 -0.01493909 , // 33 -0.02926626 , // 34 -0.03410235 , // 35 -0.02512027 , // 36 -0.00643493 , // 37 +0.01119978 , // 38 +0.01734888 , // 39 +0.00962767 , // 40 -0.00347093 , // 41 -0.00757142 , // 42 +0.00724618 , // 43 +0.03765704 , // 44 +0.06671856 , // 45 +0.07363882 , // 46 +0.04816692 , // 47 -0.00023240 , // 48 -0.04602175 , // 49 -0.06349448 , // 50 -0.04533960 , // 51 -0.01075524 , // 52 +0.00463299 , // 53 -0.02695458 , // 54 -0.10175325 , // 55 -0.17821917 , // 56 -0.19595859 , // 57 -0.11176981 , // 58 +0.06782857 , // 59 +0.27891973 , // 60 +0.42579279 , // 61 +0.42868878 , // 62 +0.26809297 , // 63 -0.00000000 , // 64 -0.26809297 , // 65 -0.42868878 , // 66 -0.42579279 , // 67 -0.27891973 , // 68 -0.06782857 , // 69 +0.11176981 , // 70 +0.19595859 , // 71 +0.17821917 , // 72 +0.10175325 , // 73 +0.02695458 , // 74 -0.00463299 , // 75 +0.01075524 , // 76 +0.04533960 , // 77 +0.06349448 , // 78 +0.04602175 , // 79 +0.00023240 , // 80 -0.04816692 , // 81 -0.07363882 , // 82 -0.06671856 , // 83 -0.03765704 , // 84 -0.00724618 , // 85 +0.00757142 , // 86 +0.00347093 , // 87 -0.00962767 , // 88 -0.01734888 , // 89 -0.01119978 , // 90 +0.00643493 , // 91 +0.02512027 , // 92 +0.03410235 , // 93 +0.02926626 , // 94 +0.01493909 , // 95 +0.00010048 , // 96 -0.00777564 , // 97 -0.00697645 , // 98 -0.00149295 , // 99 +0.00262530 , // 100 +0.00159281 , // 101 -0.00399079 , // 102 -0.01021951 , // 103 -0.01293826 , // 104 -0.01048985 , // 105 -0.00444555 , // 106 +0.00180828 , // 107 +0.00536877 , // 108 +0.00540709 , // 109 +0.00319853 , // 110 +0.00088264 , // 111 -0.00001967 , // 112 +0.00063367 , // 113 +0.00187551 , // 114 +0.00252488 , // 115 +0.00200435 , // 116 +0.00058853 , // 117 -0.00093521 , // 118 -0.00184150 , // 119 -0.00186810 , // 120 -0.00124698 , // 121 -0.00044740 , // 122 +0.00013710 , // 123 +0.00036198 , // 124 +0.00031225 , // 125 +0.00016555 , // 126 +0.00005367 // 127 } ; fldigi-4.2.05/src/mt63/dsp.cxx0000664000175000017500000016661414532252172012676 00000000000000/* * dsp.cc -- various DSP algorithms * * based on mt63 code by Pawel Jalocha * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2011 Dave Freese, W1HKJ * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // Please note, that you should not rely on the correctness // of these routines. They generally work well, but you may find // differences in respect to the mathematical formulas: signs flipped, // orders swapped, etc. #include #include // only when we do some control printf's #include #include #include "dsp.h" // ---------------------------------------------------------------------------- double dspPower(double *X, int Len) { double Sum; for(Sum = 0.0; Len; Len--,X++) Sum += (*X)*(*X); return Sum; } double dspPower(double *I, double *Q, int Len) { double Sum; for(Sum = 0.0; Len; Len--,I++,Q++) Sum += (*I)*(*I) + (*Q)*(*Q); return Sum; } double dspPower(dspCmpx *X, int Len) { double Sum; for(Sum = 0.0; Len; Len--,X++) Sum += (X->re)*(X->re) + (X->im)*(X->im); return Sum; } // ---------------------------------------------------------------------------- // dspAverage, extremes, fitting double dspAverage(double *Data, int Len) { double Sum; int i; for(Sum = 0.0,i = 0; i < Len; i++) Sum += Data[i]; return Sum/Len; } int dspCountInRange(double *Data, int Len, double Low, double Upp) { int count, i; double D; for(count = i = 0; i Max) Max = Pwr; } return Max; } double dspFindMaxdspPower(dspCmpx *Data, int Len, int &MaxPos) { double Max, Pwr; int i, pos; Max = dspPower(Data[0]); pos = 0; for (i = 1; i < Len; i++) { Pwr = dspPower(Data[i]); if (Pwr > Max) { Max = Pwr; pos = i; } } MaxPos = pos; return Max; } double dspFitPoly1(double *Data, int Len, double &A, double &B) { double Sum; int i; A = (Data[Len-1] - Data[0])/(Len - 1); for (Sum = 0.0,i = 0; i < Len; i++) Sum += Data[i] - A*i; B = Sum/Len; for (Sum = 0.0, i = 0; i < Len; i++) Sum += dspPower(Data[i] - (A*i + B)); return sqrt(Sum/Len); } double dspFitPoly2(double *Data, int Len, double &A, double &B, double &C) { double Sum; int i; A = ((Data[Len - 1] - Data[Len - 2]) - (Data[1] - Data[0]))/(Len - 2)/2; B = (Data[Len - 1] - A*(Len - 1)*(Len - 1) - Data[0])/(Len - 1); for (Sum = 0.0, i = 0; i < Len; i++) Sum += Data[i] - (A*i*i + B*i); C = Sum/Len; for (Sum = 0.0, i = 0; i < Len; i++) Sum += dspPower(Data[i] - (A*i*i + B*i + C)); return sqrt(Sum/Len); } void dspFitPoly2(double Data[3], double &A, double &B, double &C) { C = Data[0]; A = (Data[0]- 2*Data[1] + Data[2])/2; B = (Data[1] - Data[0]) - A; } // ---------------------------------------------------------------------------- // various window shapes (for the FFT and FIR filters) // these functions are supposed to be called with the argument "dspPhase" // between -PI and +PI. Most (or even all) will return zero for input // euqal -PI or +PI. double WindowHamming(double dspPhase) { return cos(dspPhase/2); } // not exactly ... double dspWindowHanning(double dspPhase) { return (1.0 + cos(dspPhase))/2; } double WindowBlackman2(double dspPhase) // from Freq 5.1 FFT analyzer { return 0.42 + 0.5*cos(dspPhase) + 0.08*cos(2*dspPhase); } double dspWindowBlackman3(double dspPhase) // from the Motorola BBS { return 0.35875 + 0.48829*cos(dspPhase) + 0.14128*cos(2*dspPhase) + 0.01168*cos(3*dspPhase); } // ---------------------------------------------------------------------------- // FIR shape calculation for a flat response from FreqLow to FreqUpp void dspWinFirI( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift) { int i; double time, dspPhase, shape; // printf("dspWinFirI: %5.3f %5.3f %d\n",LowOmega,UppOmega,Len); for (i = 0; i < Len; i++) { time = i + (1.0 - shift) - (double)Len/2; dspPhase = 2*M_PI*time/Len; if (time == 0) shape = UppOmega - LowOmega; else shape = (sin(UppOmega*time) - sin(LowOmega*time))/time; // printf("%2d %5.1f %5.2f %7.4f %7.4f\n",i,time,dspPhase,shape,(*Window)(dspPhase)); Shape[i] = shape*(*Window)(dspPhase)/M_PI; } } void WinFirQ( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift) { int i; double time, dspPhase, shape; // printf("WinFirQ: %5.3f %5.3f %d\n",LowOmega,UppOmega,Len); for (i = 0; i < Len; i++) { time = i + (1.0 - shift) - (double)Len/2; dspPhase = 2*M_PI*time/Len; if (time == 0) shape=0.0; else shape = (-cos(UppOmega*time) + cos(LowOmega*time))/time; // printf("%2d %5.1f %5.2f %7.4f %7.4f\n",i,time,dspPhase,shape,(*Window)(dspPhase)); Shape[i] = (-shape)*(*Window)(dspPhase)/M_PI; } } // we put minus for the Q-part because the FIR shapes must be placed // in reverse order for simpler indexing // ---------------------------------------------------------------------------- // convert 16-bit signed or 8-bit unsigned into doubles void dspConvS16todouble(dspS16 *dspS16, double *dble, int Len, double Gain) { for (; Len; Len--) (*dble++) = (*dspS16++)*Gain; } int dspConvS16todouble(short int *dspS16, double_buff *dble, int Len, double Gain) { int err = dble->EnsureSpace(Len); if (err) return -1; dspConvS16todouble(dspS16, dble->Data, Len, Gain); dble->Len = Len; return 0; } void dspConvdoubleTodspS16(double *dble, dspS16 *dspS16, int Len, double Gain) { double out; for (; Len; Len--) { out = (*dble++)*Gain; if (out > 32767.0) out = 32767.0; else if (out < (-32767.0)) out = (-32767.0); (*dspS16++) = (short int)floor(out+0.5); } } // we could count the over/underflows ? void dspConvU8todouble(unsigned char *U8, double *dble, int Len, double Gain) { for (; Len; Len--) (*dble++) = ((int)(*U8++) - 128)*Gain; } int dspConvU8todouble(unsigned char *U8, double_buff *dble, int Len, double Gain) { int err = dble->EnsureSpace(Len); if (err) return -1; dspConvU8todouble(U8, dble->Data, Len, Gain); dble->Len = Len; return 0; } // ---------------------------------------------------------------------------- // other converts void dspConvCmpxTodspPower(dspCmpx *Inp, int Len, double *Out) { for (; Len; Len--) (*Out++) = dspPower(*Inp++); } int dspConvCmpxTodspPower(dspCmpx_buff *Input, double_buff *Output) { int err = Output->EnsureSpace(Input->Len); if (err) return err; dspConvCmpxTodspPower(Input->Data, Input->Len, Output->Data); Output->Len = Input->Len; return 0; } void dspConvCmpxTodspAmpl(dspCmpx *Inp, int Len, double *Out) { for (; Len; Len--) (*Out++) = sqrt(dspPower(*Inp++)); } int dspConvCmpxTodspAmpl(dspCmpx_buff *Input, double_buff *Output) { int err = Output->EnsureSpace(Input->Len); if(err) return err; dspConvCmpxTodspAmpl(Input->Data, Input->Len, Output->Data); Output->Len = Input->Len; return 0; } void dspConvCmpxTodspPhase(dspCmpx *Inp, int Len, double *Out) { for (; Len; Len--) (*Out++) = dspPhase(*Inp++); } int dspConvCmpxTodspPhase(dspCmpx_buff *Input, double_buff *Output) { int err = Output->EnsureSpace(Input->Len); if(err) return err; dspConvCmpxTodspPhase(Input->Data, Input->Len, Output->Data); Output->Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Pulse noise limiter dspPulseLimiter::dspPulseLimiter() { Tap = NULL; } dspPulseLimiter::~dspPulseLimiter() { free(Tap); } void dspPulseLimiter::Free(void) { free(Tap); Tap = NULL; } int dspPulseLimiter::Preset(int TapLen, double LimitThres) { Len = TapLen; Thres = LimitThres*LimitThres; if (dspRedspAllocArray(&Tap, Len)) return -1; dspClearArray(Tap, Len); Ptr = 0; PwrSum = 0.0; return 0; } int dspPulseLimiter::Process(double *Inp, int InpLen, double *Out) { int i, o; double Lim; for (i = 0; i < InpLen; i++) { PwrSum -= Tap[Ptr]*Tap[Ptr]; Tap[Ptr++] = Inp[i]; PwrSum += Inp[i]*Inp[i]; if (Ptr >= Len) Ptr -= Len; o = Ptr + (Len/2); if (o >= Len) o -= Len; Lim = Thres*PwrSum/Len; if (Tap[o]*Tap[o] <= Lim) Out[i] = Tap[o]; else { if (Tap[o] > 0.0) Out[i] = sqrt(Lim); else Out[i] = (-sqrt(Lim)); } } for (PwrSum = 0.0, i = 0; i < Len; i++) PwrSum += Tap[i]*Tap[i]; dspRMS = sqrt(PwrSum/Len); return 0; } int dspPulseLimiter::Process(double_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return -1; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Signal level monitor dspLevelMonitor::dspLevelMonitor() { } dspLevelMonitor::~dspLevelMonitor() { } int dspLevelMonitor::Preset(double Integ, double Range) { dspLowPass2Coeff(Integ, W1, W2, W5); MaxSqr = Range*Range; PwrMid = 0.0; PwrOut = 0.0; dspRMS = 0.0; OutOfRangeMid = 0.0; OutOfRange = 0.0; return 0; } int dspLevelMonitor::Process(double *Inp, int Len) { int i, Out; double Sqr, Sum; if (Len <= 0) return 0; for (Sum = 0.0, Out = 0,i = 0; i < Len; i++) { Sum += Sqr = Inp[i]*Inp[i]; Out += (Sqr > MaxSqr); } dspLowPass2(Sum/Len, PwrMid, PwrOut, W1, W2, W5); dspLowPass2((double)Out/Len, OutOfRangeMid, OutOfRange, W1, W2, W5); if (OutOfRange < 0.0) OutOfRange = 0.0; if (PwrOut <= 0.0) dspRMS = 0.0; else dspRMS = sqrt(PwrOut); return 0; } int dspLevelMonitor::Process(double_buff *Input) { return Process(Input->Data,Input->Len); } // ---------------------------------------------------------------------------- // Automatic Gain/Level Control for the Mixer dspMixerAutoLevel::dspMixerAutoLevel() { MinMS = 0.01; MaxMS = 0.05; IntegLen = 8000; PeakHold = 4000; MinHold = 800; MinLevel = 0; MaxLevel = 100; AdjStep = 1; Level = 75; Hold = (-IntegLen); AvedspRMS = 0.0; } int dspMixerAutoLevel::Process(double *Inp, int InpLen) { double MS = dspPower(Inp, InpLen) / IntegLen; double W = 1.0 - ((double)InpLen) / IntegLen; AvedspRMS = AvedspRMS*W + MS; Hold += InpLen; if (Hold < MinHold) return 0; if(AvedspRMS>MaxMS) { Level -= AdjStep; if (Level < MinLevel) Level = MinLevel; Hold=0; return 1; } if (Hold < PeakHold) return 0; if (AvedspRMS < MinMS) { Level += AdjStep; if (Level > MaxLevel) Level = MaxLevel; Hold = 0; return 1; } return 0; } // ---------------------------------------------------------------------------- void dspLowPass2(dspCmpx *Inp, dspCmpx *Mid, dspCmpx *Out, double W1, double W2, double W5) { double Sum, Diff; // printf("\n[dspLowPass2] %6.3f %6.3f %6.3f",Inp->re,Mid->re,Out->re); Sum = Mid->re + Out->re; Diff = Mid->re - Out->re; Mid->re += W2*Inp->re - W1*Sum; Out->re += W5*Diff; // printf(" => %6.3f %6.3f\n",Mid->re,Out->re); Sum = Mid->im + Out->im; Diff = Mid->im - Out->im; Mid->im += W2*Inp->im - W1*Sum; Out->im += W5*Diff; } // ---------------------------------------------------------------------------- // periodic low pass dspPeriodLowPass2::dspPeriodLowPass2() { TapMid = NULL; TapOut = NULL; } dspPeriodLowPass2::~dspPeriodLowPass2() { free(TapMid); free(TapOut); Output.Free(); } void dspPeriodLowPass2::Free(void) { free(TapMid); TapMid = NULL; free(TapOut); TapOut = NULL; } int dspPeriodLowPass2::Preset(int Period, double IntegLen) { int i; Len = Period; if (dspRedspAllocArray(&TapMid, Len)) goto Error; if (dspRedspAllocArray(&TapOut, Len)) goto Error; for (i = 0; i < Len; i++) { TapMid[i] = 0.0; TapOut[i] = 0.0; } TapPtr = 0; dspLowPass2Coeff(IntegLen, W1, W2, W5); return 0; Error: Free(); return -1; } int dspPeriodLowPass2::Process(double Inp, double &Out) { dspLowPass2(Inp, TapMid[TapPtr], TapOut[TapPtr], W1, W2, W5); Out = TapOut[TapPtr++]; if(TapPtr >= Len) TapPtr = 0; return 0; } int dspPeriodLowPass2::Process(double *Inp, int InpLen, double *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen-i, Len - TapPtr), i += batch; batch; batch--) { dspLowPass2(*Inp++, TapMid[TapPtr], TapOut[TapPtr], W1, W2, W5); (*Out++) = TapOut[TapPtr++]; } if (TapPtr >= Len) TapPtr = 0; } return 0; } int dspPeriodLowPass2::Process(double_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return -1; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Low pass "moving box" FIR filter // very unpure spectral response but complexity very low // and independent on the integration time dspBoxFilter::dspBoxFilter() { Tap = NULL; } dspBoxFilter::~dspBoxFilter() { free(Tap); } void dspBoxFilter::Free(void) { free(Tap); Tap = NULL; Output.Free(); } int dspBoxFilter::Preset(int BoxLen) { int i; if (dspRedspAllocArray(&Tap, BoxLen)) return -1; for (i = 0; i < BoxLen; i++) Tap[i] = 0; Len = BoxLen; TapPtr = 0; Sum = 0; return 0; } int dspBoxFilter::Process(double *Inp, int InpLen, double *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen-i, Len - TapPtr), i += batch; batch; batch--) { Sum -= Tap[TapPtr]; Out[i] = (Sum += Tap[TapPtr++] = Inp[i]); } if (TapPtr >= Len) TapPtr = 0; } for (Sum = 0, i = 0; i < Len; i++) Sum += Tap[i]; return InpLen; } void dspBoxFilter::Recalibrate() { int i; for (Sum = 0, i = 0; i < Len; i++) Sum += Tap[i]; } int dspBoxFilter::Process(double_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } dspCmpxBoxFilter::dspCmpxBoxFilter() { Tap = NULL; } dspCmpxBoxFilter::~dspCmpxBoxFilter() { free(Tap); } void dspCmpxBoxFilter::Free(void) { free(Tap); Tap = NULL; Output.Free(); } int dspCmpxBoxFilter::Preset(int BoxLen) { int i; if (dspRedspAllocArray(&Tap, BoxLen)) return -1; for (i = 0; i < BoxLen; i++) Tap[i].re = Tap[i].im = 0.0; Len = BoxLen; TapPtr = 0; Sum.re = 0.0; Sum.im = 0.0; return 0; } int dspCmpxBoxFilter::Process(dspCmpx *Inp, int InpLen, dspCmpx *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen-i, Len - TapPtr), i += batch; batch; batch--) { Sum.re -= Tap[TapPtr].re; Sum.im -= Tap[TapPtr].im; Tap[TapPtr] = Inp[i]; Sum.re += Inp[i].re; Sum.im += Inp[i].im; Out[i].re = Sum.re; Out[i].im = Sum.im; } if (TapPtr >= Len) TapPtr = 0; } for (Sum.re = Sum.im = 0.0, i = 0; i < Len; i++) { Sum.re += Tap[i].re; Sum.im += Tap[i].im; } return InpLen; } void dspCmpxBoxFilter::Recalibrate() { int i; for (Sum.re = Sum.im = 0.0, i = 0; i < Len; i++) { Sum.re += Tap[i].re; Sum.im += Tap[i].im; } } int dspCmpxBoxFilter::Process(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if(err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // FIR filter with a given shape dspFirFilter::dspFirFilter() { Tap = NULL; ExternShape = 1; } dspFirFilter::~dspFirFilter() { free(Tap); if (!ExternShape) free(Shape); } void dspFirFilter::Free(void) { free(Tap); Tap = NULL; if (!ExternShape) free(Shape); Shape = NULL; Output.Free(); } int dspFirFilter::Preset(int FilterLen, double *FilterShape) { int i; if (dspRedspAllocArray(&Tap, FilterLen)) return -1; for (i = 0; i < FilterLen; i++) Tap[i] = 0; Len = FilterLen; TapPtr = 0; if (!ExternShape) free(Shape); Shape = FilterShape; return 0; } int dspFirFilter::ComputeShape( double LowOmega, double UppOmega, double (*Window)(double)) { if (ExternShape) { Shape = NULL; ExternShape = 0; } if (dspRedspAllocArray(&Shape, Len)) return -1; dspWinFirI(LowOmega, UppOmega, Shape, Len, Window); return 0; } int dspFirFilter::Process(double *Inp, int InpLen, double *Out) { int i, s, t; double Sum; if(InpLenLen); if(err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // a pair of FIR filters. for quadrature split & decimate // the decimation rate must be an integer dspQuadrSplit::dspQuadrSplit() { ExternShape = 1; } dspQuadrSplit::~dspQuadrSplit() { if (!ExternShape) { free(ShapeI); free(ShapeQ); } } void dspQuadrSplit::Free(void) { Tap.Free(); if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = NULL; ShapeQ = NULL; Output.Free(); } int dspQuadrSplit::Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate) { Len = FilterLen; if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = FilterShape_I; ShapeQ = FilterShape_Q; ExternShape = 1; Tap.EnsureSpace(Len); Tap.Len = Len; dspClearArray(Tap.Data, Tap.Len); Rate = DecimateRate; return 0; } int dspQuadrSplit::ComputeShape(double LowOmega,double UppOmega, double (*Window)(double)) { if (ExternShape) { ShapeI = NULL; ShapeQ = NULL; ExternShape = 0; } if (dspRedspAllocArray(&ShapeI, Len)) return -1; if (dspRedspAllocArray(&ShapeQ, Len)) return -1; dspWinFirI(LowOmega, UppOmega, ShapeI, Len, Window); WinFirQ(LowOmega, UppOmega, ShapeQ, Len, Window); return 0; } int dspQuadrSplit::Process(double_buff *Input) { int err, i, s, t, o, l; double SumI, SumQ; double *Inp; dspCmpx *Out; int InpLen; InpLen = Input->Len; err = Tap.EnsureSpace(Tap.Len + InpLen); if (err) return err; dspCopyArray(Tap.Data+Tap.Len, Input->Data, InpLen); // printf("dspQuadrSplit: InpLen=%d, Tap.Len=%d",InpLen,Tap.Len); Tap.Len += InpLen; Inp = Tap.Data; // printf(" -> %d",Tap.Len); err = Output.EnsureSpace( InpLen / Rate + 2); if (err) return err; Out = Output.Data; for (l = Tap.Len-Len,o = 0, i = 0; i < l; i += Rate) { for (SumI = SumQ = 0.0, s = i,t = 0; t < Len; t++,s++) { SumI += Inp[s] * ShapeI[t]; SumQ += Inp[s] * ShapeQ[t]; } Out[o].re=SumI; Out[o++].im=SumQ; } Tap.Len -= i; dspMoveArray(Tap.Data,Tap.Data+i,Tap.Len); Output.Len = o; // printf(" => Tap.Len=%d\n",Tap.Len); return 0; } // ---------------------------------------------------------------------------- // reverse of dspQuadrSplit: interpolates and combines the I/Q // back into 'real' signal. dspQuadrComb::dspQuadrComb() { Tap = NULL; ExternShape = 1; } dspQuadrComb::~dspQuadrComb() { free(Tap); if (!ExternShape) { free(ShapeI); free(ShapeQ); } } void dspQuadrComb::Free(void) { free(Tap); Tap = NULL; if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = NULL; ShapeQ = NULL; Output.Free(); } int dspQuadrComb::Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate) { int i; Len = FilterLen; if (dspRedspAllocArray(&Tap, Len)) return -1; if (!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI = FilterShape_I; ShapeQ = FilterShape_Q; ExternShape = 1; for (i = 0; i < FilterLen; i++) Tap[i] = 0.0; TapPtr = 0; Rate = DecimateRate; return 0; } int dspQuadrComb::ComputeShape( double LowOmega,double UppOmega, double (*Window)(double)) { if (ExternShape) { ShapeI = NULL; ShapeQ = NULL; ExternShape = 0; } if (dspRedspAllocArray(&ShapeI, Len)) return -1; if (dspRedspAllocArray(&ShapeQ, Len)) return -1; dspWinFirI(LowOmega, UppOmega, ShapeI, Len, Window); WinFirQ(LowOmega, UppOmega, ShapeQ, Len, Window); return 0; } int dspQuadrComb::Process(dspCmpx_buff *Input) { int err, i, o, r, t, len; dspCmpx *Inp; double *Out; int InpLen; double I, Q; InpLen = Input->Len; err = Output.EnsureSpace(InpLen*Rate); if (err) return err; Inp = Input->Data; Out = Output.Data; Output.Len = InpLen*Rate; for(o=0,i=0; i= 2*M_PI) dspPhase -= 2*M_PI; } return InpLen; } int dspCmpxMixer::ProcessFast(dspCmpx *Inp, int InpLen, dspCmpx *Out) { int i; double dI, dQ, I, Q, nI, nQ, N; dI = cos(Omega); dQ = sin(Omega); I = cos(dspPhase); Q = sin(dspPhase); for (i = 0; i < InpLen; i++) { Out[i].re = I*Inp[i].re + Q*Inp[i].im; Out[i].im = I*Inp[i].im - Q*Inp[i].re; nI = I*dI - Q*dQ; nQ = Q*dI + I*dQ; I = nI; Q = nQ; } dspPhase += InpLen*Omega; N = floor(dspPhase/(2*M_PI)); dspPhase -= N*2*M_PI; return InpLen; } int dspCmpxMixer::Process(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } int dspCmpxMixer::ProcessFast(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if(err) return err; ProcessFast(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // FM demodulator (dspPhase rotation speed meter) dspFMdemod::dspFMdemod() { PrevdspPhase = 0.0; RefOmega = 0.0; } int dspFMdemod::Preset(double CenterOmega) { RefOmega = CenterOmega; return 0; } int dspFMdemod::Process(double *InpI, double *InpQ, int InpLen, double *Out) { int i; double dspPhase, dspPhaseDiff; for (i = 0; i < InpLen; i++) { if ((InpI[i] == 0.0) && (InpQ[i] == 0.0)) dspPhase = 0; else dspPhase = atan2(InpQ[i], InpI[i]); dspPhaseDiff = dspPhase - PrevdspPhase - RefOmega; if (dspPhaseDiff >= M_PI) dspPhaseDiff -= 2*M_PI; else if (dspPhaseDiff < (-M_PI)) dspPhaseDiff += 2*M_PI; Out[i] = dspPhaseDiff; PrevdspPhase = dspPhase; } return InpLen; } int dspFMdemod::Process(dspCmpx *Inp, int InpLen, double *Out) { int i; double dspPhase, dspPhaseDiff; for (i = 0; i < InpLen; i++) { if ((Inp[i].re == 0.0) && (Inp[i].im == 0.0)) dspPhase = PrevdspPhase; else dspPhase = atan2(Inp[i].im, Inp[i].re); dspPhaseDiff = dspPhase - PrevdspPhase - RefOmega; if (dspPhaseDiff >= M_PI) dspPhaseDiff -= 2*M_PI; else if (dspPhaseDiff < (-M_PI)) dspPhaseDiff += 2*M_PI; Out[i] = dspPhaseDiff; PrevdspPhase = dspPhase; } return InpLen; } int dspFMdemod::Process(dspCmpx_buff *Input) { int err = Output.EnsureSpace(Input->Len); if(err) return err; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // Rate converter - real input/output, linear interpolation // expect large error when high frequency components are present // thus the best place to convert rates is after a low pass filter // of a demodulator. // note: in fldigi these rate converters are not used. // libsamplerate is the preferred solution dspRateConvLin::dspRateConvLin() { PrevSample = 0; OutdspPhase = 0; OutStep = 1.0; } void dspRateConvLin::SetOutVsInp(double OutVsInp) { OutStep = 1.0 / OutVsInp; } void dspRateConvLin::SetInpVsOut(double InpVsOut) { OutStep = InpVsOut; } int dspRateConvLin::Process(double_buff *Input) { int err, i, o; double *Inp, *Out; int InpLen; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen/OutStep) + 2); if (err) return err; Out = Output.Data; for (o = 0; OutdspPhase < 0; ) { Out[o++] = Inp[0]*(1.0 + OutdspPhase) - OutdspPhase*PrevSample; OutdspPhase += OutStep; } for (i = 0; i < (InpLen-1); ) { if (OutdspPhase >= 1.0) { OutdspPhase -= 1.0; i++; } else { Out[o++] = Inp[i]*(1.0 - OutdspPhase) + Inp[i+1]*OutdspPhase; OutdspPhase += OutStep; } } Output.Len = o; PrevSample = Inp[i]; OutdspPhase -= 1.0; return 0; } // ---------------------------------------------------------------------------- // Rate converter - real input/output, quadratic interpolation // similar limits like for RateConv1 dspRateConvQuadr::dspRateConvQuadr() { int i; for (i = 0; i < 4; i++) Tap[i] = 0; OutStep = 1.0; OutdspPhase = 0; TapPtr = 0; } void dspRateConvQuadr::SetOutVsInp(double OutVsInp) { OutStep = 1.0 / OutVsInp; } void dspRateConvQuadr::SetInpVsOut(double InpVsOut) { OutStep = InpVsOut; } int dspRateConvQuadr::Process( double *Inp, int InpLen, double *Out, int MaxOutLen, int *OutLen) { int i, o, t; double Ref0, Ref1, Diff0, Diff1; for (o = i = 0; (i < InpLen) && (o < MaxOutLen); ) { if (OutdspPhase >= 1.0) { Tap[TapPtr] = (*Inp++); i++; TapPtr = (TapPtr + 1) & 3; OutdspPhase -= 1.0; } else { t = TapPtr; Diff0 = (Tap[t^2] - Tap[t]) / 2; Ref1 = Tap[t^2]; t = (t + 1) & 3; Diff1 = (Tap[t^2] - Tap[t]) / 2; Ref0 = Tap[t]; (*Out++) = Ref0 * (1.0 - OutdspPhase) + Ref1*OutdspPhase // linear piece -(Diff1-Diff0)*OutdspPhase*(1.0-OutdspPhase)/2; // quadr. piece o++; OutdspPhase += OutStep; } } (*OutLen) = o; return i; } int dspRateConvQuadr::Process(double_buff *Input) { int err, i, o, t; double Ref0, Ref1, Diff0, Diff1; double *Inp,*Out; int InpLen; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen / OutStep) + 2); if (err) return err; Out = Output.Data; for (o = i = 0; i < InpLen; ) { if (OutdspPhase >= 1.0) { Tap[TapPtr] = (*Inp++); i++; TapPtr = (TapPtr + 1) & 3; OutdspPhase -= 1.0; } else { t = TapPtr; Diff0 = (Tap[t^2] - Tap[t]) / 2; Ref1 = Tap[t^2]; t = (t + 1) & 3; Diff1 = (Tap[t^2] - Tap[t]) / 2; Ref0 = Tap[t]; (*Out++) = Ref0 * (1.0 - OutdspPhase) + Ref1*OutdspPhase // linear piece -(Diff1 - Diff0)*OutdspPhase*(1.0 - OutdspPhase)/2; // quadr. piece o++; OutdspPhase += OutStep; } } Output.Len = o; return 0; } // ---------------------------------------------------------------------------- // Rate converter, real input/output, // bandwidth-limited interpolation, several shifted FIR filters dspRateConvBL::dspRateConvBL() { Tap = NULL; Shape = NULL; ExternShape = 1; } dspRateConvBL::~dspRateConvBL() { Free(); } void dspRateConvBL::Free(void) { int s; free(Tap); Tap = NULL; if (ExternShape) return; if (Shape) { for (s = 0; s < ShapeNum; s++) free(Shape[s]); free(Shape); Shape = NULL; } } int dspRateConvBL::Preset(int FilterLen, double **FilterShape, int FilterShapeNum) { int i; Free(); Len = FilterLen; if (dspRedspAllocArray(&Tap, Len)) return -1; TapSize = Len; for (i = 0; i < Len; i++) Tap[i] = 0.0; Shape = FilterShape; ShapeNum = FilterShapeNum; ExternShape = 1; OutStep = 1.0; OutdspPhase = 0.0; return 0; } int dspRateConvBL::ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)) { int idx; if (ExternShape) { if (dspAllocArray(&Shape, ShapeNum)) return -1; for (idx = 0; idx < ShapeNum; idx++) { if (dspAllocArray(&Shape[idx], Len)) return -1; } ExternShape = 0; } for (idx = 0; idx < ShapeNum; idx++) dspWinFirI(LowOmega, UppOmega, Shape[idx], Len, Window, (double)idx/ShapeNum); return 0; } void dspRateConvBL::SetOutVsInp(double OutVsInp) { OutStep = 1.0 / OutVsInp; } void dspRateConvBL::SetInpVsOut(double InpVsOut) { OutStep = InpVsOut; } int dspRateConvBL::Process(double_buff *Input) { int i, o, idx, t, err; double *shape; double Sum; double *Inp, *Out; int InpLen; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if (err) return err; Out = Output.Data; if ((Len + InpLen) > TapSize) { Tap = (double*)realloc(Tap, (Len+InpLen)*sizeof(double)); if (Tap == NULL) return -1; TapSize = Len + InpLen; } memcpy(Tap + Len, Inp, InpLen*sizeof(double)); for(o=i=0; i= 1.0) { OutdspPhase -= 1.0; i++; } else { idx = (int)floor(OutdspPhase*ShapeNum); shape = Shape[idx]; for (Sum = 0.0, t = 0; t < Len; t++) Sum += Tap[i + t]*shape[t]; Out[o++] = Sum; OutdspPhase += OutStep; } } Output.Len = o; memmove(Tap, Tap + InpLen, Len*sizeof(double)); return 0; } int dspRateConvBL::ProcessLinI(double_buff *Input) { int i, o, idx, t, err; double *Inp, *Out; int InpLen; double Sum0, Sum1; double *shape; double d; Inp = Input->Data; InpLen = Input->Len; err = Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if (err) return err; Out = Output.Data; if ((Len + InpLen) > TapSize) { Tap = (double*)realloc(Tap, (Len + InpLen)*sizeof(double)); if (Tap == NULL) return -1; TapSize = Len + InpLen; } memcpy(Tap + Len, Inp, InpLen*sizeof(double)); for (o = i = 0; i < InpLen; ) { if (OutdspPhase >= 1.0) { OutdspPhase -= 1.0; i++; } else { idx = (int)floor(OutdspPhase*ShapeNum); d = OutdspPhase*ShapeNum - idx; shape = Shape[idx]; for (Sum0 = 0.0, t = 0; t < Len; t++) Sum0 += Tap[i+t]*shape[t]; idx += 1; if (idx >= ShapeNum) { idx = 0; i++; } shape = Shape[idx]; for (Sum1 = 0.0, t = 0; t < Len; t++) Sum1 += Tap[i + t]*shape[t]; if (idx == 0) i--; Out[o++] = (1.0 - d)*Sum0 + d*Sum1; OutdspPhase += OutStep; } } Output.Len = o; memmove(Tap, Tap + InpLen, Len*sizeof(double)); return 0; } // ---------------------------------------------------------------------------- // Sliding window (for FFT input) dspCmpxSlideWindow::dspCmpxSlideWindow() { Buff = NULL; Window = NULL; ExternWindow = 1; } dspCmpxSlideWindow::~dspCmpxSlideWindow() { free(Buff); if (!ExternWindow) free(Window); } void dspCmpxSlideWindow::Free(void) { free(Buff); Buff = NULL; if (!ExternWindow) free(Window); Window = NULL; } int dspCmpxSlideWindow::Preset(int WindowLen, int SlideDist, double *WindowShape) { int i; if (SlideDist > WindowLen) return -1; Len = WindowLen; Dist = SlideDist; if (dspRedspAllocArray(&Buff, Len)) return -1; for (i = 0; i < Len; i++) Buff[i].re = Buff[i].im = 0.0; Ptr = 0; if (!ExternWindow) free(Window); Window = WindowShape; ExternWindow = 1; return 0; } int dspCmpxSlideWindow::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } if (dspRedspAllocArray(&Window, Len)) return -1; for (idx = 0; idx < Len; idx++) Window[idx] = (*NewWindow)(2*M_PI*(idx - Len/2 + 0.5)/Len)*Scale; return 0; } int dspCmpxSlideWindow::Process(dspCmpx_buff *Input) { dspCmpx *Inp = Input->Data; int InpLen = Input->Len; int i, len, err; Output.Len = 0; while (InpLen > 0) { len = dspIntmin(Len - Ptr, InpLen); memcpy(Buff + Ptr, Inp, len*sizeof(dspCmpx)); Ptr += len; Inp += len; InpLen -= len; if (Ptr >= Len) { len = Output.Len; err = Output.EnsureSpace(len + Len); if(err) return err; if (Window == NULL) memcpy(Output.Data, Buff, Len*sizeof(dspCmpx)); else for (i = 0; i < Len; i++) { Output.Data[len + i].re = Buff[i].re*Window[i]; Output.Data[len + i].im = Buff[i].im*Window[i]; } Output.Len += Len; memmove(Buff, Buff + Dist, (Len - Dist)*sizeof(dspCmpx)); Ptr -= Dist; } } return 0; } // ---------------------------------------------------------------------------- // Overlaping window (for IFFT output) dspCmpxOverlapWindow::dspCmpxOverlapWindow() { Buff = NULL; Window = NULL; ExternWindow = 1; } dspCmpxOverlapWindow::~dspCmpxOverlapWindow() { free(Buff); if (!ExternWindow) free(Window); } void dspCmpxOverlapWindow::Free(void) { free(Buff); Buff=NULL; if (!ExternWindow) free(Window); Window = NULL; } int dspCmpxOverlapWindow::Preset(int WindowLen, int SlideDist, double *WindowShape) { int i; if (SlideDist > WindowLen) return -1; Len = WindowLen; Dist = SlideDist; if (dspRedspAllocArray(&Buff, Len)) return -1; for (i = 0; i < Len; i++) Buff[i].re = Buff[i].im = 0.0; if (!ExternWindow) free(Window); Window = WindowShape; ExternWindow = 1; return 0; } int dspCmpxOverlapWindow::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } if (dspRedspAllocArray(&Window, Len)) return -1; for (idx = 0; idx < Len; idx++) Window[idx] = (*NewWindow)(2*M_PI*(idx - Len/2 + 0.5)/Len)*Scale; return 0; } int dspCmpxOverlapWindow::Process(dspCmpx_buff *Input) { int i, err; Output.Len = 0; for (i = 0; i < Input->Len; i += Len) { err = Output.EnsureSpace(Output.Len + Dist); if (err) return err; Process(Input->Data + i, Output.Data + Output.Len); Output.Len += Dist; } return 0; } int dspCmpxOverlapWindow::Process(dspCmpx *Input) { int err; err = Output.EnsureSpace(Dist); if (err) return err; Process(Input, Output.Data); Output.Len = Dist; return 0; } void dspCmpxOverlapWindow::Process(dspCmpx *Inp, dspCmpx *Out) { int i; if(Window == NULL) { for (i = 0; i < Dist; i++) { Out[i].re = Buff[i].re + Inp[i].re; Out[i].im = Buff[i].im + Inp[i].im; } for ( ; i < Len - Dist; i++) { Buff[i - Dist].re = Buff[i].re + Inp[i].re; Buff[i - Dist].im = Buff[i].im + Inp[i].im; } for ( ; i < Len; i++) { Buff[i - Dist].re = Inp[i].re; Buff[i - Dist].im = Inp[i].im; } } else { for (i = 0; i < Dist; i++) { Out[i].re = Buff[i].re + Inp[i].re*Window[i]; Out[i].im = Buff[i].im + Inp[i].im*Window[i]; } for ( ; i < Len - Dist; i++) { Buff[i - Dist].re = Buff[i].re + Inp[i].re*Window[i]; Buff[i - Dist].im = Buff[i].im + Inp[i].im*Window[i]; } for ( ; i < Len; i++) { Buff[i - Dist].re = Inp[i].re*Window[i]; Buff[i - Dist].im = Inp[i].im*Window[i]; } } } int dspCmpxOverlapWindow::ProcessSilence(int Slides) { int err, slide; err = Output.EnsureSpace(Slides*Dist); if (err) return err; Output.Len = 0; for (slide = 0; slide < Slides; slide++) { memcpy(Output.Data + Output.Len, Buff, Dist*sizeof(dspCmpx)); memcpy(Buff, Buff + Dist, (Len - Dist)*sizeof(dspCmpx)); Output.Len += Dist; } return 0; } // ---------------------------------------------------------------------------- // FFT dspPhase corrector dspFFT_TimeShift::dspFFT_TimeShift() { FreqTable = NULL; } dspFFT_TimeShift::~dspFFT_TimeShift() { free(FreqTable); } void dspFFT_TimeShift::Free(void) { free(FreqTable); FreqTable = NULL; } int dspFFT_TimeShift::Preset(int FFTlen, int Backwards) { int i; double p; dspPhase = 0; Len = FFTlen; LenMask = FFTlen - 1; if ((LenMask^Len) != (2*Len - 1)) return -1; if (dspRedspAllocArray(&FreqTable, Len)) return -1; for (i = 0; i < Len; i++) { p = (2*M_PI*i)/Len; if (Backwards) p = (-p); FreqTable[i].re = cos(p); FreqTable[i].im = sin(p); } return 0; } int dspFFT_TimeShift::Process(dspCmpx *Data, int Time) { double nI, nQ; int i, p; dspPhase = (dspPhase + Time) & LenMask; for (p = i = 0; i < Len; i++) { nI = Data[i].re*FreqTable[i].re - Data[i].im*FreqTable[i].im; nQ = Data[i].re*FreqTable[i].im + Data[i].im*FreqTable[i].re; Data[i].re = nI; Data[i].im = nQ; p = (p + dspPhase) & LenMask; } return 0; } // ---------------------------------------------------------------------------- // bit synchronizer, the bit rate is the input rate divided by four dspDiffBitSync4::dspDiffBitSync4(int IntegBits) { int i; IntegLen = IntegBits; InpTapLen = 4*IntegLen + 8; InpTap = (double*)malloc(InpTapLen*sizeof(double)); for (i = 0; i < InpTapLen; i++) InpTap[i] = 0; InpTapPtr = 0; for (i = 0; i < 4; i++) { DiffInteg[i] = DiffInteg0[i] = 0.0; } DiffTapPtr = 0; BitPtr = 0; SyncdspPhase = 0.0; SyncDrift = SyncDrift0 = 0; SyncConfid = 0.0; dspLowPass2Coeff((double)IntegLen*2, W1, W2, W5); } dspDiffBitSync4::~dspDiffBitSync4() { free(InpTap); } void dspDiffBitSync4::Free() { free(InpTap); InpTap=NULL; } int dspDiffBitSync4::Process( double *Inp, int InpLen, double *BitOut, double *IbitOut, int MaxOutLen, int *OutLen) { int i, o, t, step; double diff; double Sum, SumI, SumQ, dspPhase; for (step = 0,o = i = 0; (i < InpLen) && (o < MaxOutLen); i++) { diff = (-InpTap[InpTapPtr++]); if (InpTapPtr >= InpTapLen) InpTapPtr = 0; diff += (InpTap[InpTapPtr] = (*Inp++)); DiffTapPtr = (DiffTapPtr + 1) & 3; dspLowPass2(diff*diff, DiffInteg0[DiffTapPtr], DiffInteg[DiffTapPtr], W1, W2, W5); if (DiffTapPtr == BitPtr) { for (Sum = 0, t = 0; t < 4; t++) Sum += DiffInteg[t]; t = DiffTapPtr; SumI = DiffInteg[t] - DiffInteg[t^2]; t = (t + 1) & 3; SumQ = DiffInteg[t] - DiffInteg[t^2]; if ((Sum == 0.0) || ((SyncConfid = (SumI*SumI + SumQ*SumQ)/(Sum*Sum)) == 0.0)) { (*BitOut++) = 0; (*IbitOut++) = 0; o++; continue; } dspPhase = atan2(-SumQ, -SumI)*(4/(2*M_PI)); dspLowPass2(dspPhase - SyncdspPhase, SyncDrift0, SyncDrift, W1, W2, W5); SyncdspPhase = dspPhase; if (dspPhase > 0.52) { step = 1; SyncdspPhase -= 1.0; } else if (dspPhase < (-0.52)) { step = (-1); SyncdspPhase += 1.0; } else step = 0; double Samp[5], bit, ibit, dx; int p; p = InpTapPtr - 4*IntegLen - 2; if (p < 0) p += InpTapLen; for (t = 0; t < 5; t++) { Samp[t] = InpTap[p++]; if (p >= InpTapLen) p = 0; } dx = dspPhase-0.5; // bit=Samp[2]+dx*(Samp[2]-Samp[1]); // linear interpolation bit = Samp[2]*(1.0 + dx) - Samp[1]*dx // or quadratic + ((Samp[3] - Samp[1]) - (Samp[2] - Samp[0]))/2*dx*(1.0 + dx)/2; ibit = Samp[4] + dx*(Samp[4] - Samp[3]); //linear interpolation is enough (*BitOut++) = bit; (*IbitOut++) = ibit; o++; } else if (DiffTapPtr == (BitPtr^2)) { BitPtr = (BitPtr + step) & 3; step = 0; } } (*OutLen) = o; return i; } double dspDiffBitSync4::GetSyncConfid() { return 4*SyncConfid; } double dspDiffBitSync4::GetSyncDriftRate() { return SyncDrift/4; } // ---------------------------------------------------------------------------- // bit slicer, SNR/Tune meter dspBitSlicer::dspBitSlicer(int IntegBits) { int i; TapLen = IntegLen = IntegBits; Tap = (double *)malloc(TapLen*sizeof(double)); for (i = 0; i < TapLen; i++) Tap[i] = 0; TapPtr = 0; for (i = 0; i < 2; i++) { Sum[i] = Sum0[i] = 0.0; SumSq[i] = SumSq0[i] = 0.0; TimeAsym = TimeAsym0 = 0.0; dspAmplAsym = dspAmplAsym0 = 0.0; Noise[i] = 0; } dspLowPass2Coeff((double)IntegLen*2, W1, W2, W5); PrevBit = PrevIBit = 0.0; OptimThres = 0.0; } dspBitSlicer::~dspBitSlicer() { free(Tap); } int dspBitSlicer::Process(double *Bits, double *IBits, int InpLen, double *OutBits) { int i, l; double Bit, soft; for (i = 0; i < InpLen; i++) { Bit = Bits[i]; l = Bit > 0; dspLowPass2(Bit, Sum0[l], Sum[l], W1, W2, W5); dspLowPass2(Bit*Bit, SumSq0[l], SumSq[l], W1, W2, W5); Noise[l] = sqrt(SumSq[l] - Sum[l]*Sum[l]); if (Noise[0] + Noise[1] <= 0) OptimThres = 0; else OptimThres = (Sum[0]*Noise[1] + Sum[1]*Noise[0]) / (Noise[0] + Noise[1]); soft = Tap[TapPtr] - OptimThres; // we could do a better soft-decision if (Bit*PrevBit < 0) { dspLowPass2(PrevIBit, dspAmplAsym0, dspAmplAsym, W1, W2, W5); if (Bit > 0) PrevIBit = (-PrevIBit); dspLowPass2(PrevIBit, TimeAsym0, TimeAsym, W1, W2, W5); } (*OutBits++) = soft; PrevBit = Bit; PrevIBit = IBits[i]; Tap[TapPtr] = Bit; TapPtr++; if (TapPtr >= TapLen) TapPtr = 0; } return InpLen; } double dspBitSlicer::GetSigToNoise() { return Noise[1]>0 ? (Sum[1]-OptimThres)/Noise[1] : 0.0; } double dspBitSlicer::GetdspAmplAsym() { double Sweep=Sum[1]-Sum[0]; return Sweep>0 ? 2*dspAmplAsym/Sweep : 0.0; } double dspBitSlicer::GetTimeAsym() { double Sweep=Sum[1]-Sum[0]; return Sweep>0 ? 2*TimeAsym/Sweep : 0.0; } // ---------------------------------------------------------------------------- // The decoder for the HDLC frames, // makes no AX.25 CRC check, only the length in bytes against MinLen and MaxLen // however it does not pass frames with non-complete bytes. dspHDLCdecoder::dspHDLCdecoder( int minlen, int maxlen, int diff, int invert, int chan, int (*handler)(int, char *, int)) { MinLen = minlen; MaxLen = maxlen; RxDiff = diff; RxInvert = invert; ChanId = chan; FrameHandler = handler; Buff = (char *)malloc(MaxLen); Len = (-1); PrevLev = 0; ShiftReg = 0; BitCount = 0; Count1s = 0; AllFrameCount = 0; BadFrameCount = 0; } dspHDLCdecoder::~dspHDLCdecoder() { free(Buff); } int dspHDLCdecoder::Process(double *Inp, int InpLen) { int i, lev, bit, Flag; for (i = 0; i < InpLen; i++) { lev = Inp[i] > 0; bit = (lev^(PrevLev & RxDiff))^RxInvert; PrevLev = lev; ShiftReg = (ShiftReg >> 1) | (bit << 7); BitCount += 1; Flag = 0; if (bit) Count1s += 1; else { if (Count1s >= 7) Len = (-1); else if (Count1s == 6) Flag = 1; else if (Count1s == 5) { ShiftReg <<= 1; BitCount -= 1; } Count1s = 0; } if (Flag) { if ((Len >= MinLen) && (BitCount == 8)) (*FrameHandler)(ChanId, Buff, Len); Len = 0; BitCount = 0; } else if (Len >= 0) { if (BitCount == 8) { if (Len < MaxLen) Buff[Len++] = (char)ShiftReg; else Len = (-1); BitCount = 0; } } } return InpLen; } // ---------------------------------------------------------------------------- // AX.25 CRC, adress decoding, etc. short unsigned int dspAX25CRCtable[256] = { 0U, 4489U, 8978U, 12955U, 17956U, 22445U, 25910U, 29887U, 35912U, 40385U, 44890U, 48851U, 51820U, 56293U, 59774U, 63735U, 4225U, 264U, 13203U, 8730U, 22181U, 18220U, 30135U, 25662U, 40137U, 36160U, 49115U, 44626U, 56045U, 52068U, 63999U, 59510U, 8450U, 12427U, 528U, 5017U, 26406U, 30383U, 17460U, 21949U, 44362U, 48323U, 36440U, 40913U, 60270U, 64231U, 51324U, 55797U, 12675U, 8202U, 4753U, 792U, 30631U, 26158U, 21685U, 17724U, 48587U, 44098U, 40665U, 36688U, 64495U, 60006U, 55549U, 51572U, 16900U, 21389U, 24854U, 28831U, 1056U, 5545U, 10034U, 14011U, 52812U, 57285U, 60766U, 64727U, 34920U, 39393U, 43898U, 47859U, 21125U, 17164U, 29079U, 24606U, 5281U, 1320U, 14259U, 9786U, 57037U, 53060U, 64991U, 60502U, 39145U, 35168U, 48123U, 43634U, 25350U, 29327U, 16404U, 20893U, 9506U, 13483U, 1584U, 6073U, 61262U, 65223U, 52316U, 56789U, 43370U, 47331U, 35448U, 39921U, 29575U, 25102U, 20629U, 16668U, 13731U, 9258U, 5809U, 1848U, 65487U, 60998U, 56541U, 52564U, 47595U, 43106U, 39673U, 35696U, 33800U, 38273U, 42778U, 46739U, 49708U, 54181U, 57662U, 61623U, 2112U, 6601U, 11090U, 15067U, 20068U, 24557U, 28022U, 31999U, 38025U, 34048U, 47003U, 42514U, 53933U, 49956U, 61887U, 57398U, 6337U, 2376U, 15315U, 10842U, 24293U, 20332U, 32247U, 27774U, 42250U, 46211U, 34328U, 38801U, 58158U, 62119U, 49212U, 53685U, 10562U, 14539U, 2640U, 7129U, 28518U, 32495U, 19572U, 24061U, 46475U, 41986U, 38553U, 34576U, 62383U, 57894U, 53437U, 49460U, 14787U, 10314U, 6865U, 2904U, 32743U, 28270U, 23797U, 19836U, 50700U, 55173U, 58654U, 62615U, 32808U, 37281U, 41786U, 45747U, 19012U, 23501U, 26966U, 30943U, 3168U, 7657U, 12146U, 16123U, 54925U, 50948U, 62879U, 58390U, 37033U, 33056U, 46011U, 41522U, 23237U, 19276U, 31191U, 26718U, 7393U, 3432U, 16371U, 11898U, 59150U, 63111U, 50204U, 54677U, 41258U, 45219U, 33336U, 37809U, 27462U, 31439U, 18516U, 23005U, 11618U, 15595U, 3696U, 8185U, 63375U, 58886U, 54429U, 50452U, 45483U, 40994U, 37561U, 33584U, 31687U, 27214U, 22741U, 18780U, 15843U, 11370U, 7921U, 3960U } ; short unsigned int dspAX25CRC(char *Data, int Len) { int i, idx; short unsigned int CRC; for (CRC = 0xFFFF, i = 0; i < Len; i++) { idx = (unsigned char)CRC^(unsigned char)Data[i]; CRC = (CRC>>8)^dspAX25CRCtable[idx]; } CRC ^= 0xFFFF; return CRC; } // ---------------------------------------------------------------------------- // radix-2 FFT // constructor dsp_r2FFT::dsp_r2FFT() { BitRevIdx = NULL; Twiddle = NULL; /* Window=NULL; */ } // destructor: free twiddles, bit-reverse lookup and window tables dsp_r2FFT::~dsp_r2FFT() { free(BitRevIdx); free(Twiddle); /* free(Window); */ } void dsp_r2FFT::Free(void) { free(BitRevIdx); BitRevIdx = NULL; free(Twiddle); Twiddle = NULL; } // .......................................................................... // a radix-2 FFT bufferfly inline void dsp_r2FFT::FFTbf(dspCmpx &x0, dspCmpx &x1, dspCmpx &W) { dspCmpx x1W; x1W.re = x1.re*W.re + x1.im*W.im; // x1W.re=x1.re*W.re-x1.im*W.im; x1W.im = (-x1.re*W.im) + x1.im*W.re; // x1W.im=x1.re*W.im+x1.im*W.re; x1.re = x0.re - x1W.re; x1.im = x0.im - x1W.im; x0.re = x0.re + x1W.re; x0.im = x0.im + x1W.im; } // 2-point FFT inline void dsp_r2FFT::FFT2(dspCmpx &x0, dspCmpx &x1) { dspCmpx x1W; x1W.re = x1.re; x1W.im = x1.im; x1.re = x0.re - x1.re; x1.im = x0.im - x1.im; x0.re += x1W.re; x0.im += x1W.im; } // 4-point FFT // beware: these depend on the convention for the twiddle factors ! inline void dsp_r2FFT::FFT4(dspCmpx &x0, dspCmpx &x1, dspCmpx &x2, dspCmpx &x3) { dspCmpx x1W; x1W.re = x2.re; x1W.im = x2.im; x2.re = x0.re - x1W.re; x2.im = x0.im - x1W.im; x0.re = x0.re + x1W.re; x0.im = x0.im + x1W.im; x1W.re = x3.im; x1W.im = (-x3.re); x3.re = x1.re - x1W.re; x3.im = x1.im - x1W.im; x1.re = x1.re + x1W.re; x1.im = x1.im + x1W.im; } // .......................................................................... // bit reverse (in place) the dspSequence (before the actuall FFT) void dsp_r2FFT::Scramble(dspCmpx x[]) { int idx, ridx; dspCmpx tmp; for (idx = 0; idx < Size; idx++) if ((ridx = BitRevIdx[idx]) > idx) { tmp = x[idx]; x[idx] = x[ridx]; x[ridx] = tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } // Preset for given processing size int dsp_r2FFT::Preset(int size) { int err, idx, ridx, mask, rmask; double dspPhase; if (!dspPowerOf2(size)) goto Error; Size = size; err = dspRedspAllocArray(&BitRevIdx, Size); if (err) goto Error; err = dspRedspAllocArray(&Twiddle, Size); if (err) goto Error; //printf("size, %d\n\n", size); //printf("idx,dspPhase,Twiddle.re,Twiddle.im\n"); for (idx = 0; idx < Size; idx++) { dspPhase = (2*M_PI*idx)/Size; Twiddle[idx].re = cos(dspPhase); Twiddle[idx].im = sin(dspPhase); //printf("%2d,%6.4f,%6.4f,%6.4f\n", idx,dspPhase,Twiddle[idx].re,Twiddle[idx].im); } //printf("\n\nidx,BitRevIdx\n"); for (ridx = 0, idx = 0; idx < Size; idx++) { for (ridx = 0, mask = Size/2, rmask = 1; mask; mask >>= 1, rmask <<= 1) { if (idx & mask) ridx |= rmask; } BitRevIdx[idx] = ridx; //printf("%d,%d\n",idx,ridx); } // free(Window); Window=NULL; WinInpScale=1.0/Size; WinOutScale=0.5; return 0; Error: Free(); return -1; } // .......................................................................... // radix-2 FFT: the first and the second pass are by hand // looks like there is no gain by separating the second pass // and even the first pass is in question ? void dsp_r2FFT::CoreProc(dspCmpx x[]) { int Groups, GroupHalfSize, Group, Bf, TwidIdx; int HalfSize = Size/2; for (Bf = 0; Bf < Size; Bf += 2) FFT2(x[Bf], x[Bf+1]); // first pass // for(Bf=0; Bf>= 1, GroupHalfSize <<= 1) for (Group = 0, Bf = 0; Group < Groups; Group++, Bf += GroupHalfSize) for (TwidIdx = 0; TwidIdx < HalfSize; TwidIdx += Groups, Bf++) { FFTbf(x[Bf], x[Bf + GroupHalfSize], Twiddle[TwidIdx]); /* printf("%2d %2d %2d\n",Bf,Bf+GroupHalfSize,TwidIdx); */ } } // .......................................................................... // separate the result of "two reals at one time" processing void dsp_r2FFT::SeparTwoReals(dspCmpx Buff[], dspCmpx Out0[], dspCmpx Out1[]) { int idx, HalfSize = Size/2; // for(idx=0; idxoutput dspDelay longer. dspSlideWinFFT::dspSlideWinFFT() { SlideBuff = NULL; FFTbuff = NULL; Window = NULL; ExternWindow = 1; } dspSlideWinFFT::~dspSlideWinFFT() { free(SlideBuff); free(FFTbuff); if (!ExternWindow) free(Window); } void dspSlideWinFFT::Free(void) { free(SlideBuff); SlideBuff = NULL; free(FFTbuff); FFTbuff = NULL; if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; Output.Free(); } int dspSlideWinFFT::Preset(int size, int step, double *window) { int err,i; Size = size; SizeMask = Size - 1; err = FFT.Preset(Size); if (err) goto Error; if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; err = dspRedspAllocArray(&FFTbuff, Size); if (err) goto Error; err = dspRedspAllocArray(&SlideBuff, Size); if (err) goto Error; for (i = 0; i < Size; i++) SlideBuff[i] = 0.0; SlidePtr = 0; Slide = 0; Dist = step; Left = Dist; return 0; Error: Free(); return -1; } int dspSlideWinFFT::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx, err; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } err = dspRedspAllocArray(&Window, Size); if (err) return -1; for (idx = 0; idx < Size; idx++) Window[idx] = Scale*(*NewWindow)(2*M_PI*(idx - Size/2 + 0.5)/Size); return 0; } int dspSlideWinFFT::Preset( int size, int step, double (*NewWindow)(double dspPhase), double Scale) { int err; err = Preset(size, step, (double *)NULL); if (err) return -1; err = SetWindow(NewWindow, Scale); if (err) { Free(); return -1; } return 0; } int dspSlideWinFFT::SetWindow(double *window) { if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; return 0; } int dspSlideWinFFT::Process(double_buff *Input) { int err, len, i, t; int InpLen; double *Inp; Inp = Input->Data; InpLen = Input->Len; Output.Len = 0; while (InpLen) { for (i = len = dspIntmin(InpLen, Left); i; i--) { SlideBuff[SlidePtr++] = (*Inp++); SlidePtr &= SizeMask; } InpLen -= len; Left -= len; if(Left==0) { Slide ^= 1; Left = Dist; if (Slide) { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++, i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; } else { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; FFT.Scramble(FFTbuff); FFT.CoreProc(FFTbuff); len = Output.Len; err = Output.EnsureSpace(len + Size); if (err) return -1; FFT.SeparTwoReals(FFTbuff, Output.Data + len, Output.Data + len + Size/2); Output.Len += Size; } } } return 0; } // ---------------------------------------------------------------------------- // Overlapping IFFT to convert sliced spectra into time-domain output // ---------------------------------------------------------------------------- // Sliding window FFT for spectral processing // input: real-valued signal // in the middle you are given a chance to process // the complex-valued Fourier Transform (SpectraProc() routine). // output: real-valued signal // If you don't touch the spectra in SpectralProc() // the output will be an exact copy (only dspDelayed) of the input. dspSlideWinFFTproc::dspSlideWinFFTproc() { SlideBuff = NULL; OvlapBuff = NULL; FFTbuff = NULL; Spectr[0] = NULL; Spectr[1] = NULL; Window = NULL; ExternWindow = 1; } dspSlideWinFFTproc::~dspSlideWinFFTproc() { free(SlideBuff); free(OvlapBuff); free(FFTbuff); free(Spectr[0]); free(Spectr[1]); if (!ExternWindow) free(Window); } void dspSlideWinFFTproc::Free(void) { int i; free(SlideBuff); SlideBuff=NULL; free(OvlapBuff); OvlapBuff=NULL; free(FFTbuff); FFTbuff = NULL; for (i = 0; i < 2; i++) { free(Spectr[0]); Spectr[0] = NULL; } if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; Output.Free(); } int dspSlideWinFFTproc::Preset( int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double *window) { int err, i; Size = size; SizeMask = Size - 1; err = FFT.Preset(Size); if (err) goto Error; if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; dspRedspAllocArray(&FFTbuff, Size); if (err) goto Error; for (i = 0; i < 2; i++) { err = dspRedspAllocArray(&Spectr[i], Size/2); if (err) goto Error; } err = dspRedspAllocArray(&SlideBuff, Size); if (err) goto Error; for (i = 0; i < Size; i++) SlideBuff[i] = 0.0; SlidePtr = 0; Slide = 0; Dist = step; Left = Dist; err = dspRedspAllocArray(&OvlapBuff, Size); if (err) goto Error; for (i = 0; i < Size; i++) OvlapBuff[i] = 0.0; OvlapPtr = 0; SpectraProc = proc; return 0; Error: Free(); return -1; } int dspSlideWinFFTproc::Preset(int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double (*NewWindow)(double dspPhase), double Scale) { int err; err = Preset(size, step, proc, (double *)NULL); if (err) return -1; err = SetWindow(NewWindow, Scale); if (err) { Free(); return -1; } return 0; } int dspSlideWinFFTproc::SetWindow(double *window) { if (!ExternWindow) { free(Window); ExternWindow = 1; } Window = window; return 0; } int dspSlideWinFFTproc::SetWindow(double (*NewWindow)(double dspPhase), double Scale) { int idx, err; if (NewWindow == NULL) { if (!ExternWindow) free(Window); Window = NULL; ExternWindow = 1; return 0; } if (ExternWindow) { Window = NULL; ExternWindow = 0; } err = dspRedspAllocArray(&Window, Size); if (err) return -1; if (Scale == 0.0) Scale = sqrt(0.5/Size); for (idx = 0; idx < Size; idx++) Window[idx] = Scale*(*NewWindow)(2*M_PI*(idx - Size/2 + 0.5)/Size); return 0; } int dspSlideWinFFTproc::Process(double_buff *Input) { int err, len, i, t; int InpLen; double *Inp, *Out; Inp = Input->Data; InpLen = Input->Len; Output.Len = 0; while (InpLen) { for (i = len = dspIntmin(InpLen, Left); i; i--) { SlideBuff[SlidePtr++] = (*Inp++); SlidePtr &= SizeMask; } InpLen -= len; Left -= len; if (Left == 0) { Slide ^= 1; Left = Dist; if (Slide) { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++,i++) FFTbuff[t].re = Window[t]*SlideBuff[i]; } else { for (t = 0, i = SlidePtr; i < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; for (i = 0; t < Size; t++,i++) FFTbuff[t].im = Window[t]*SlideBuff[i]; FFT.Scramble(FFTbuff); FFT.CoreProc(FFTbuff); FFT.SeparTwoReals(FFTbuff, Spectr[0], Spectr[1]); for (i = 0; i < 2; i++) (*SpectraProc)(Spectr[i], Size); FFT.JoinTwoReals(Spectr[0], Spectr[1], FFTbuff); FFT.Scramble(FFTbuff); FFT.CoreProc(FFTbuff); err = Output.EnsureSpace(Output.Len + 2*Dist); if (err) return -1; Out = Output.Data + Output.Len; for (t = 0, i = OvlapPtr; i < Size; t++,i++) OvlapBuff[i] += Window[t]*FFTbuff[t].re; for (i = 0; t < Size; t++, i++) OvlapBuff[i] += Window[t]*FFTbuff[t].re; for (i = 0; i < Dist; i++) { (*Out++) = OvlapBuff[OvlapPtr]; OvlapBuff[OvlapPtr++] = 0.0; OvlapPtr &= SizeMask; } for (t = 0, i = OvlapPtr; i < Size; t++,i++) OvlapBuff[i] -= Window[t]*FFTbuff[t].im; for (i = 0; t < Size; t++,i++) OvlapBuff[i] -= Window[t]*FFTbuff[t].im; for (i = 0; i < Dist; i++) { (*Out++) = OvlapBuff[OvlapPtr]; OvlapBuff[OvlapPtr++] = 0.0; OvlapPtr &= SizeMask; } Output.Len += 2*Dist; } } } return 0; } // ---------------------------------------------------------------------------- // Walsh (Hadamard ?) transform. void dspWalshTrans(double *Data, int Len) // Len must be 2^N { int step, ptr, ptr2; double bit1, bit2; for (step = 1; step < Len; step *= 2) { for (ptr = 0; ptr < Len; ptr += 2*step) { for (ptr2 = ptr; (ptr2 - ptr) < step; ptr2 += 1) { bit1 = Data[ptr2]; bit2 = Data[ptr2 + step]; // Data[ptr2]=(bit1+bit2); Data[ptr2+step]=(bit1-bit2); Data[ptr2] = (bit1 + bit2); Data[ptr2 + step] = (bit2 - bit1); } } } } void dspWalshInvTrans(double *Data, int Len) // Len must be 2^N { int step, ptr, ptr2; double bit1, bit2; for (step = Len/2; step; step /= 2) { for (ptr = 0; ptr < Len; ptr += 2*step) { for (ptr2 = ptr; (ptr2 - ptr) < step; ptr2 += 1) { bit1 = Data[ptr2]; bit2 = Data[ptr2 + step]; // Data[ptr2]=(bit1+bit2); Data[ptr2+step]=(bit1-bit2); Data[ptr2] = (bit1 - bit2); Data[ptr2 + step] = (bit1 + bit2); } } } } // ---------------------------------------------------------------------------- fldigi-4.2.05/src/mt63/alias_1k.dat0000664000175000017500000001042414532252172013525 00000000000000/* * alias_1k.dat -- Anti-alias filter 1000 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1500.0 // PassBandLow=375.0 PassBandUpp=1625.0 StopBandLow=0.0 StopBandUpp=2000.0 // => PeakInStopBand=-90.99 dB // Programmers's scale factor: 2.000000 // Programmers's comments: Anti-alias filter 1000 Hz bandwidth, decimation by 4 const int Alias_1k_Len=64; double Alias_1k_I[Alias_1k_Len] = { +0.00003605 , // 0 +0.00001835 , // 1 -0.00022227 , // 2 -0.00079785 , // 3 -0.00099442 , // 4 +0.00032296 , // 5 +0.00276603 , // 6 +0.00365685 , // 7 +0.00128973 , // 8 -0.00107943 , // 9 +0.00195568 , // 10 +0.00914871 , // 11 +0.01100689 , // 12 +0.00254789 , // 13 -0.00580382 , // 14 -0.00014844 , // 15 +0.01341757 , // 16 +0.01123057 , // 17 -0.01328109 , // 18 -0.03176715 , // 19 -0.01791993 , // 20 +0.00579429 , // 21 -0.00986091 , // 22 -0.06425601 , // 23 -0.08967807 , // 24 -0.04429128 , // 25 +0.00513920 , // 26 -0.04459511 , // 27 -0.16886923 , // 28 -0.19065374 , // 29 +0.01930718 , // 30 +0.34486939 , // 31 +0.50345887 , // 32 +0.34486939 , // 33 +0.01930718 , // 34 -0.19065374 , // 35 -0.16886923 , // 36 -0.04459511 , // 37 +0.00513920 , // 38 -0.04429128 , // 39 -0.08967807 , // 40 -0.06425601 , // 41 -0.00986091 , // 42 +0.00579429 , // 43 -0.01791993 , // 44 -0.03176715 , // 45 -0.01328109 , // 46 +0.01123057 , // 47 +0.01341757 , // 48 -0.00014844 , // 49 -0.00580382 , // 50 +0.00254789 , // 51 +0.01100689 , // 52 +0.00914871 , // 53 +0.00195568 , // 54 -0.00107943 , // 55 +0.00128973 , // 56 +0.00365685 , // 57 +0.00276603 , // 58 +0.00032296 , // 59 -0.00099442 , // 60 -0.00079785 , // 61 -0.00022227 , // 62 +0.00001835 // 63 } ; double Alias_1k_Q[Alias_1k_Len] = { -0.00000000 , // 0 -0.00009527 , // 1 -0.00023082 , // 2 +0.00005162 , // 3 +0.00123007 , // 4 +0.00255193 , // 5 +0.00207549 , // 6 -0.00064302 , // 7 -0.00244045 , // 8 +0.00005205 , // 9 +0.00410793 , // 10 +0.00211830 , // 11 -0.00729235 , // 12 -0.01359800 , // 13 -0.00757272 , // 14 +0.00172023 , // 15 -0.00460378 , // 16 -0.02559228 , // 17 -0.03408530 , // 18 -0.01416468 , // 19 +0.00731461 , // 20 -0.00712536 , // 21 -0.04328548 , // 22 -0.04099291 , // 23 +0.01821691 , // 24 +0.06428190 , // 25 +0.02790538 , // 26 -0.03602086 , // 27 +0.01583703 , // 28 +0.22015579 , // 29 +0.40003327 , // 30 +0.32856209 , // 31 -0.00000000 , // 32 -0.32856209 , // 33 -0.40003327 , // 34 -0.22015579 , // 35 -0.01583703 , // 36 +0.03602086 , // 37 -0.02790538 , // 38 -0.06428190 , // 39 -0.01821691 , // 40 +0.04099291 , // 41 +0.04328548 , // 42 +0.00712536 , // 43 -0.00731461 , // 44 +0.01416468 , // 45 +0.03408530 , // 46 +0.02559228 , // 47 +0.00460378 , // 48 -0.00172023 , // 49 +0.00757272 , // 50 +0.01359800 , // 51 +0.00729235 , // 52 -0.00211830 , // 53 -0.00410793 , // 54 -0.00005205 , // 55 +0.00244045 , // 56 +0.00064302 , // 57 -0.00207549 , // 58 -0.00255193 , // 59 -0.00123007 , // 60 -0.00005162 , // 61 +0.00023082 , // 62 +0.00009527 // 63 } ; fldigi-4.2.05/src/wwv/0000775000175000017500000000000014611714005011454 500000000000000fldigi-4.2.05/src/wwv/analysis.cxx0000664000175000017500000002003614611711171013745 00000000000000// ---------------------------------------------------------------------------- // anal.cxx -- anal modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Modified by J C Gibbons / N8OBJ - May 2019 // Added info.txt file option for control of header - Feb 2020 // Added analysis file output modifications // - Removed relative time from output file, added full ISO date/time stamp // - Added keeping present days data is the file already exist when program started // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "configuration.h" #include "analysis.h" #include "modem.h" #include "misc.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #include "waterfall.h" #include "main.h" #include "fl_digi.h" #include "timeops.h" #include "debug.h" // added for file support tasks 2-18-20 JC Gibbons N8OBJ #include #include static char msg1[80]; void anal::tx_init() { } void anal::rx_init() { phaseacc = 0; put_MODEstatus(mode); } void anal::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::RTTY); rxcorr = progdefaults.RX_corr; } anal::~anal() { delete bpfilt; delete ffilt; delete afilt; progdefaults.RX_corr = rxcorr; } // used for checking file exists function #define F_OK 0 void anal::createfilename() { // Function to find or create the working directory [if not exist yet] // also creates the filename that should be open for today's date [w and w/o full path] // Create embedded date YYMMDD for file creation naming time_t now = time(NULL); gmtime_r(&now, &File_Start_Date); // create the embedded filename date image as YYMMDD strftime((char*)FileDate,sizeof(FileDate),"%y%m%d", &File_Start_Date); // create the embedded file date image as YYYY-MM-DD strftime((char*)FileData,sizeof(FileData),"%Y-%m-%d", &File_Start_Date); // create the new analysis file name only OpenAnalalysisFile.assign("analysis_").append(FileDate).append(".csv"); // Full name with path // Added new file naming and storage by N8OBJ 5-7-19 analysisFilename.assign(AnalysisDir).append(OpenAnalalysisFile); } void anal::restart() { double fhi = ANAL_BW * 1.1 / samplerate; double flo = 0.0; if (bpfilt) bpfilt->create_filter(flo, fhi); else bpfilt = new fftfilt(flo, fhi, 2048); set_bandwidth(ANAL_BW); ffilt->reset(); afilt->reset(); elapsed = 0.0; fout = 0.0; wf_freq = frequency; if (clock_gettime(CLOCK_REALTIME, &start_time) == -1) { LOG_PERROR("clock_gettime"); abort(); } passno = 0; dspcnt = DSP_CNT; for (int i = 0; i < PIPE_LEN; i++) pipe[i] = 0; if (write_to_csv) stop_csv(); start_csv(); } anal::anal() { mode = MODE_ANALYSIS; samplerate = ANAL_SAMPLERATE; bpfilt = (fftfilt *)0; ffilt = new Cmovavg(FILT_LEN * samplerate); afilt = new Cmovavg(FILT_LEN * samplerate); createfilename(); cap &= ~CAP_TX; write_to_csv = false; restart(); } void anal::clear_syncscope() { set_scope(0, 0, false); } cmplx anal::mixer(cmplx in) { cmplx z = cmplx( cos(phaseacc), sin(phaseacc)) * in; phaseacc -= TWOPI * frequency / samplerate; if (phaseacc < 0) phaseacc += TWOPI; return z; } void anal::start_csv() { std::string InfoPathname(AnalysisDir); InfoPathname.append("info.txt"); createfilename(); //Open the data file for creation (write) operation //first check to see if already created if (fl_access(analysisFilename.c_str(), F_OK) == 0) { // file exists! - use it and keep adding to it // indicate in status line that file write in progress write_to_csv = true; //say to do writes to file } else { FILE *out = fl_fopen(analysisFilename.c_str(), "w"); //create new data file if (unlikely(!out)) { LOG_PERROR("fl_fopen"); return; } std::string InfoText; std::ifstream InfoTextFile( InfoPathname.c_str() ); if (InfoTextFile.is_open()) { // files exists, obtain info in text file getline (InfoTextFile, InfoText); InfoTextFile.close(); // since file exists, write out full ISO date as first element of todays header // along with the contents of info.txt for 1st line of header info fprintf(out, "%s, %s\n", FileData, InfoText.c_str()); } // Always write out the normal column header to the new .csv file fprintf(out, "UTC, Freq, Freq Err, Vpk, dBV(Vpk)\n"); fclose(out); write_to_csv = true; } } void anal::stop_csv() { write_to_csv = false; put_status(""); } void anal::writeFile() { if (!write_to_csv) return; time_t now = time(NULL); struct tm tm; // put check for date rollover here gmtime_r(&now, &tm); char DateNow [10]; // Create embedded date stamp in the YYMMDD format strftime((char*)DateNow,sizeof(DateNow),"%y%m%d", &tm); // printf("Date now is =%s\n",DateNow); //diag printout // check if date rolled over if (tm.tm_mday != File_Start_Date.tm_mday) { start_csv(); } FILE *out = fl_fopen(analysisFilename.c_str(), "a"); if (unlikely(!out)) { LOG_PERROR("fl_fopen"); return; } // N8OBJ 5-7-19 changed 8.3f to 8.6f (more decimal places on signal strength - show uV level) // Changed /added new .csv fields // header is: fprintf(out, "UTC,Freq,Freq Err,Vpk,dBV(Vpk)\n"); fprintf(out, "%02d:%02d:%02d, %13.3lf, %6.3f, %8.6f, %6.2f\n", tm.tm_hour, tm.tm_min, tm.tm_sec, (wf->rfcarrier() + (wf->USB() ? 1.0 : -1.0) * (frequency + fout) + progdefaults.RIT), fout + progdefaults.RIT, amp, 20.0 * log10( (amp == 0 ? 1e-6 : amp) ) ); fclose(out); char TimeNow[9]; snprintf( TimeNow, sizeof(TimeNow), "%02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec ); put_Status1( TimeNow, 5, STATUS_CLEAR); char StatusMsg [80]; sprintf( StatusMsg, "File: %s", OpenAnalalysisFile.c_str()); put_status(StatusMsg); } int anal::rx_process(const double *buf, int len) { cmplx z, *zp; double fin; int n = 0; if (wf_freq != frequency) { restart(); set_scope(pipe, PIPE_LEN, false); } for (int i = 0; i < len; i++) { // create analytic signal from sound card input samples z = cmplx( *buf, *buf ); buf++; // mix it with the audio carrier frequency to create a baseband signal z = mixer(z); // low pass filter using Windowed Sinc - Overlap-Add convolution filter n = bpfilt->run(z, &zp); if (n) { for (int j = 0; j < n; j++) { // measure phase difference between successive samples to determine // the frequency of the baseband signal (+anal_baud or -anal_baud) // see class cmplx definiton for operator % fin = arg( conj(prevsmpl) * zp[j] ) * samplerate / TWOPI; prevsmpl = zp[j]; // filter using moving average filter fout = ffilt->run(fin); amp = afilt->run(abs(zp[j])); } } //else prevsmpl = z; } if (passno++ > 10) { dspcnt -= (1.0 * n / samplerate); if (dspcnt <= 0) { for (int i = 0; i < PIPE_LEN -1; i++) pipe[i] = pipe[i+1]; double fdsp = fout / 4.0; if (fabs(fdsp) < 2.6) { elapsed += DSP_CNT - dspcnt; pipe[PIPE_LEN - 1] = fout / 4.0; set_scope(pipe, PIPE_LEN, false); if (wf->USB()) snprintf(msg1, sizeof(msg1), "%13.3lf", wf->rfcarrier() + frequency + fout + progdefaults.RIT); else snprintf(msg1, sizeof(msg1), "%13.3lf", wf->rfcarrier() - frequency - fout + progdefaults.RIT); put_Status2(msg1, 2.0); writeFile(); } // reset the display counter & the pipe pointer dspcnt = DSP_CNT; } } return 0; } //===================================================================== // anal transmit //===================================================================== int anal::tx_process() { return -1; } fldigi-4.2.05/src/wwv/wwv.cxx0000664000175000017500000001137414611711171012752 00000000000000// ---------------------------------------------------------------------------- // wwv.cxx -- wwv monitoring modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // // This modem is only used for reception of WWV "tick" signals to determine // the correction factor to be applied to the sound card oscillator. #include #include #include #include #include #include "wwv.h" #include "fl_digi.h" void wwv::tx_init() { phaseacc = 0; } void wwv::rx_init() { phaseacc = 0.0; smpl_ctr = 0; // sample counter for timing wwv rx agc = 0.0; // threshold for tick detection ticks = 0; calc = false; zoom = false; set_scope_mode(Digiscope::WWV); put_MODEstatus(mode); } void wwv::init() { modem::init(); rx_init(); } wwv::~wwv() { if (hilbert) delete hilbert; if (lpfilter) delete lpfilter; if (vidfilter) delete vidfilter; } wwv::wwv() : modem() { double lp; mode = MODE_WWV; frequency = 1000; bandwidth = 200; samplerate = 8000; // phase increment expected at the tick freq phaseincr = 2.0 * M_PI * frequency / samplerate; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); lp = 0.5 * bandwidth / samplerate; lpfilter = new C_FIR_filter(); lpfilter->init_lowpass (FIRLEN_1, DEC_1, lp); vidfilter = new Cmovavg(16); makeaudio(); } //======================================================================= //update_syncscope() //Routine called to update the display on the sync scope display. //For wwv this is video signal much like a FAX display //======================================================================= // void wwv::update_syncscope() { double max = 0, min = 1e6, range; for (int i = 0; i < 1000; i++ ) { if (max < buffer[i]) max = buffer[i]; if (min > buffer[i]) min = buffer[i]; } range = max - min; for (int i = 0; i < 1000; i++ ) { buffer[i] = 255*(buffer[i] - min) / range; } if (zoom) set_video(&buffer[400], 200); else set_video(buffer, 1000); buffer.next(); // change buffers } //===================================================================== // wwv_rxprocess() // Called with a block (512 samples) of audio. // Nominal sound card sampling rate is set to 8000 Hz //======================================================================= int wwv::rx_process(const double *buf, int len) { cmplx z, znco; while (len-- > 0) { z = cmplx ( *buf, *buf ); buf++; hilbert->run(z, z); znco = cmplx ( cos(phaseacc), sin(phaseacc) ); z = znco * z; phaseacc += phaseincr; if (phaseacc > TWOPI) phaseacc -= TWOPI; if (lpfilter->run ( z, z )) { buffer[smpl_ctr % 1000] = vidfilter->run( abs(z) ); if (++smpl_ctr >= 1000) { update_syncscope(); smpl_ctr = 0; } } } return 0; } void wwv::set1(int x, int y) { int zfactor = 500; if (zoom) zfactor = 100; smpl_ctr -= ((2*x - y) * zfactor) / y; if (smpl_ctr < 0) smpl_ctr += 1000; if (smpl_ctr > 1000) smpl_ctr -= 1000; } char strPPM[20]; void wwv::set2(int x, int y) { zoom = !zoom; } //====================================================================== // transmit time tick //====================================================================== void wwv::makeshape() { for (int i = 0; i < 32; i++) keyshape[i] = 0.5 * (1.0 - cos (M_PI * i / 32)); } double wwv::nco(double freq) { phaseacc += 2.0 * M_PI * freq / samplerate; if (phaseacc > M_PI) phaseacc -= 2.0 * M_PI; return sin(phaseacc); } void wwv::makeaudio() { phaseacc = 0.0; makeshape(); for (int i = 0; i < 400; i++) { audio[i] = (i < 200 ? nco(1000) : 0); quiet[i] = 0; } for (int i = 0; i < 32; i++) { audio[i] *= keyshape[i]; audio[199 - i] *= keyshape[i]; } } int wwv::tx_process() { static int cycle = 4; int c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; return -1; } if (--cycle == 0) { memcpy(play, audio, 400 * sizeof(double)); ModulateXmtr(play, 400); cycle = 4; } else ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); ModulateXmtr(quiet, 400); return 0; } fldigi-4.2.05/src/mfsk/0000775000175000017500000000000014611714005011571 500000000000000fldigi-4.2.05/src/mfsk/mfsk.cxx0000664000175000017500000006172614611711171013212 00000000000000// ---------------------------------------------------------------------------- // mfsk.cxx -- mfsk modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "mfsk.h" #include "modem.h" #include "misc.h" #include "main.h" #include "fl_digi.h" #include "configuration.h" #include "status.h" #include "trx.h" #include "ascii.h" #include "fileselect.h" #include "qrunner.h" #include "debug.h" #define SOFTPROFILE false // MFSKpic receive start delay value based on a viterbi length of 45 // 44 nulls at 8 samples per pixel // 88 nulls at 4 samples per pixel // 176 nulls at 2 samples per pixel struct TRACEPAIR { int trace; int delay; TRACEPAIR( int a, int b) { trace = a; delay = b;} }; TRACEPAIR tracepair(45, 352); // enable to limit within band signal sidebands // not really needed static bool xmt_filter = false; //============================================================================= static char mfskmsg[80]; static double s2nvals[100]; static int s2nptr = 0; //============================================================================= #include "mfsk-pic.cxx" void mfsk::tx_init() { txstate = TX_STATE_PREAMBLE; bitstate = 0; double factor = 1.5; double bw2 = factor*(numtones + 1) * samplerate / symlen / 2.0; double flo = (get_txfreq_woffset() - bw2);// / samplerate; if (flo <= 100) flo = 100; double fhi = (get_txfreq_woffset() + bw2);// / samplerate; if (fhi >= samplerate/2 - 100) fhi = samplerate/2 - 100; xmtfilt->init_bandpass (255, 1, flo/samplerate, fhi/samplerate); videoText(); } void mfsk::rx_init() { rxstate = RX_STATE_DATA; synccounter = 0; symcounter = 0; met1 = 0.0; met2 = 0.0; counter = 0; RXspp = 8; for (int i = 0; i < 2 * symlen; i++) { for (int j = 0; j < 32; j++) pipe[i].vector[j] = cmplx(0,0); } reset_afc(); memset(picheader, ' ', PICHEADER - 1); picheader[PICHEADER -1] = 0; put_MODEstatus(mode); syncfilter->reset(); staticburst = false; s2n = 0.0; s2n_valid = false; for (int n = 0; n < 100; n++) { s2nvals[n] = -20; } } void mfsk::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::SCOPE); // picture mode init setpicture_link(this); TXspp = txSPP; RXspp = 8; if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } void mfsk::shutdown() { } mfsk::~mfsk() { stopflag = true; int msecs = 200; while(--msecs && txstate != TX_STATE_PREAMBLE) MilliSleep(1); // do not destroy picTxWin or picRxWin as there may be pending updates // in the UI request queue if (picTxWin) picTxWin->hide(); activate_mfsk_image_item(false); if (bpfilt) delete bpfilt; if (xmtfilt) delete xmtfilt; if (rxinlv) delete rxinlv; if (txinlv) delete txinlv; if (dec2) delete dec2; if (dec1) delete dec1; if (enc) delete enc; if (pipe) delete [] pipe; if (hbfilt) delete hbfilt; if (binsfft) delete binsfft; for (int i = 0; i < SCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; } if (syncfilter) delete syncfilter; } mfsk::mfsk(trx_mode mfsk_mode) : modem() { cap |= CAP_AFC | CAP_REV; double bw, cf, flo, fhi; mode = mfsk_mode; depth = 10; // CAP_IMG is set in cap iff image transfer supported switch (mode) { case MODE_MFSK4: samplerate = 8000; symlen = 2048; symbits = 5; depth = 5; basetone = 256; numtones = 32; preamble = 107; // original mfsk modes break; case MODE_MFSK8: samplerate = 8000; symlen = 1024; symbits = 5; depth = 5; basetone = 128; numtones = 32; preamble = 107; // original mfsk modes break; case MODE_MFSK31: samplerate = 8000; symlen = 256; symbits = 3; depth = 10; basetone = 32; numtones = 8; preamble = 107; // original mfsk modes break; case MODE_MFSK32: samplerate = 8000; symlen = 256; symbits = 4; depth = 10; basetone = 32; numtones = 16; preamble = 107; // original mfsk modes cap |= CAP_IMG; break; case MODE_MFSK64: samplerate = 8000; symlen = 128; symbits = 4; depth = 10; basetone = 16; numtones = 16; preamble = 180; cap |= CAP_IMG; break; case MODE_MFSK128: samplerate = 8000; symlen = 64; symbits = 4; depth = 20; basetone = 8; numtones = 16; cap |= CAP_IMG; preamble = 214; break; case MODE_MFSK64L: samplerate = 8000; symlen = 128; symbits = 4; depth = 400; preamble = 2500; basetone = 16; numtones = 16; break; case MODE_MFSK128L: samplerate = 8000; symlen = 64; symbits = 4; depth = 800; preamble = 5000; basetone = 8; numtones = 16; break; case MODE_MFSK11: samplerate = 11025; symlen = 1024; symbits = 4; depth = 10; basetone = 93; numtones = 16; preamble = 107; break; case MODE_MFSK22: samplerate = 11025; symlen = 512; symbits = 4; depth = 10; basetone = 46; numtones = 16; preamble = 107; break; case MODE_MFSK16: default: samplerate = 8000; symlen = 512; symbits = 4; depth = 10; basetone = 64; numtones = 16; preamble = 107; cap |= CAP_IMG; break; } tonespacing = (double) samplerate / symlen; basefreq = 1.0 * samplerate * basetone / symlen; binsfft = new sfft (symlen, basetone, basetone + numtones ); hbfilt = new C_FIR_filter(); hbfilt->init_hilbert(37, 1); syncfilter = new Cmovavg(8); for (int i = 0; i < SCOPESIZE; i++) vidfilter[i] = new Cmovavg(16); pipe = new rxpipe[ 2 * symlen ]; enc = new encoder (NASA_K, POLY1, POLY2); dec1 = new viterbi (NASA_K, POLY1, POLY2); dec2 = new viterbi (NASA_K, POLY1, POLY2); dec1->settraceback (tracepair.trace); dec2->settraceback (tracepair.trace); dec1->setchunksize (1); dec2->setchunksize (1); txinlv = new interleave (symbits, depth, INTERLEAVE_FWD); rxinlv = new interleave (symbits, depth, INTERLEAVE_REV); bw = (numtones - 1) * tonespacing; cf = basefreq + bw / 2.0; flo = (cf - bw/2 - 2 * tonespacing) / samplerate; fhi = (cf + bw/2 + 2 * tonespacing) / samplerate; bpfilt = new C_FIR_filter(); bpfilt->init_bandpass (127, 1, flo, fhi); xmtfilt = new C_FIR_filter(); scopedata.alloc(symlen * 2); fragmentsize = symlen; bandwidth = (numtones - 1) * tonespacing; startpic = false; abortxmt = false; stopflag = false; bitshreg = 0; bitstate = 0; phaseacc = 0; pipeptr = 0; metric = 0; prev1symbol = prev2symbol = 0; symbolpair[0] = symbolpair[1] = 0; // picTxWin and picRxWin are created once to support all instances of mfsk if (!picTxWin) createTxViewer(); if (!picRxWin) createRxViewer(); activate_mfsk_image_item(true); afcmetric = 0.0; datashreg = 1; for (int i = 0; i < 128; i++) prepost[i] = 0; } //===================================================================== // receive processing //===================================================================== void mfsk::s2nreport(void) { modem::s2nreport(); s2n_valid = false; } bool mfsk::check_picture_header(char c) { char *p; if (c >= ' ' && c <= 'z') { memmove(picheader, picheader + 1, PICHEADER - 1); picheader[PICHEADER - 2] = c; } picW = 0; picH = 0; color = false; p = strstr(picheader, "Pic:"); if (p == NULL) return false; p += 4; if (*p == 0) return false; while ( *p && isdigit(*p)) picW = (picW * 10) + (*p++ - '0'); if (*p++ != 'x') return false; while ( *p && isdigit(*p)) picH = (picH * 10) + (*p++ - '0'); if (*p == 'C') { color = true; p++; } if (*p == ';') { if (picW == 0 || picH == 0 || picW > 4095 || picH > 4095) return false; RXspp = 8; return true; } if (*p == 'p') p++; else return false; if (!*p) return false; RXspp = 8; if (*p == '4') RXspp = 4; if (*p == '2') RXspp = 2; p++; if (!*p) return false; if (*p != ';') return false; if (picW == 0 || picH == 0 || picW > 4095 || picH > 4095) return false; return true; } void mfsk::recvpic(cmplx z) { int byte; picf += arg( conj(prevz) * z) * samplerate / TWOPI; prevz = z; if ((counter % RXspp) == 0) { picf = 256 * (picf / RXspp - basefreq) / bandwidth; byte = (int)CLAMP(picf, 0.0, 255.0); if (reverse) byte = 255 - byte; if (color) { pixelnbr = rgb + row + 3*col; REQ(updateRxPic, byte, pixelnbr); if (++col == picW) { col = 0; if (++rgb == 3) { rgb = 0; row += 3 * picW; } } } else { for (int i = 0; i < 3; i++) REQ(updateRxPic, byte, pixelnbr++); } picf = 0.0; int n = picW * picH * 3; if (pixelnbr % (picW * 3) == 0) { snprintf(mfskmsg, sizeof(mfskmsg), "Rx pic: %3.1f%%", (100.0f * pixelnbr) / n); put_status(mfskmsg); } } } void mfsk::recvchar(int c) { if (c == -1 || c == 0) return; put_rx_char(c); if (check_picture_header(c) == true) { counter = tracepair.delay; switch (mode) { case MODE_MFSK16: if (symbolbit == symbits) counter += symlen; break; case MODE_MFSK32: if (symbolbit == symbits) counter += symlen; break; case MODE_MFSK64: counter = 4956; if (symbolbit % 2 == 0) counter += symlen; break; case MODE_MFSK128: counter = 1824; if (symbolbit % 2 == 0) counter += symlen; break; case MODE_MFSK31: counter = 5216; if (symbolbit == symbits) counter += symlen; break; case MODE_MFSK4: case MODE_MFSK8: case MODE_MFSK11: case MODE_MFSK22: default: break; }; rxstate = RX_STATE_PICTURE_START; picturesize = RXspp * picW * picH * (color ? 3 : 1); pixelnbr = 0; col = 0; row = 0; rgb = 0; memset(picheader, ' ', PICHEADER - 1); picheader[PICHEADER -1] = 0; return; } else counter = 0; if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { if ((c == SOH) && !s2n_valid) { // starts collecting s2n from first SOH in stream (since start of RX) s2n_valid = true; s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } if (s2n_valid) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount++; if (c == EOT) s2nreport(); } } return; } void mfsk::recvbit(int bit) { int c; datashreg = (datashreg << 1) | !!bit; if ((datashreg & 7) == 1) { c = varidec(datashreg >> 1); recvchar(c); datashreg = 1; } } void mfsk::decodesymbol(unsigned char symbol) { int c, met; symbolpair[0] = symbolpair[1]; symbolpair[1] = symbol; symcounter = symcounter ? 0 : 1; // only modes with odd number of symbits need a vote if (symbits == 5 || symbits == 3) { // could use symbits % 2 == 0 if (symcounter) { if ((c = dec1->decode(symbolpair, &met)) == -1) return; met1 = decayavg(met1, met, 50);//32); if (met1 < met2) return; metric = met1; } else { if ((c = dec2->decode(symbolpair, &met)) == -1) return; met2 = decayavg(met2, met, 50);//32); if (met2 < met1) return; metric = met2; } } else { if (symcounter) return; if ((c = dec2->decode(symbolpair, &met)) == -1) return; met2 = decayavg(met2, met, 50);//32); metric = met2; } if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { // s2n reporting: re-calibrate s2n_metric = metric * 4.5 - 42; s2n_metric = CLAMP(s2n_metric, 0.0, 100.0); } // Re-scale the metric and update main window metric -= 60.0; metric *= 0.5; metric = CLAMP(metric, 0.0, 100.0); display_metric(metric); if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) return; recvbit(c); } void mfsk::softdecode(cmplx *bins) { double binmag, sum=0, avg=0, b[symbits]; unsigned char symbols[symbits]; int i, j, k, CWIsymbol; static int CWIcounter[MAX_SYMBOLS] = {0}; static const int CWI_MAXCOUNT=6; // this is the maximum number of repeated tones which is valid for the modem ( 0 excluded ) for (i = 0; i < symbits; i++) b[i] = 0.0; // Calculate the average signal, ignoring CWI tones for (i = 0; i < numtones; i++) { if ( CWIcounter[i] < CWI_MAXCOUNT ) sum += abs(bins[i]); } avg = sum / numtones; // avoid divide by zero later if ( sum < 1e-10 ) sum = 1e-10; // dynamic CWI avoidance: use harddecode() result (currsymbol) for CWI detection if (reverse) CWIsymbol = (numtones - 1) - currsymbol; else CWIsymbol = currsymbol; // Add or subtract the CWI counters based on harddecode result // avoiding tone #0 by starting at 1 for (i = 1; i < numtones ; i++) { if (reverse) k = (numtones - 1) - i; else k = i; if ( k == CWIsymbol) CWIcounter[k]++; else CWIcounter[k]--; // bounds-check the counts to keep the values sane if (CWIcounter[k] < 0) CWIcounter[k] = 0; if (CWIcounter[k] > CWI_MAXCOUNT) CWIcounter[k] = CWI_MAXCOUNT + 1; } // Grey decode and form soft decision samples for (i = 0; i < numtones; i++) { j = graydecode(i); if (reverse) k = (numtones - 1) - i; else k = i; // Avoid CWI. This never affects tone #0 if ( CWIcounter[k] > CWI_MAXCOUNT ) { binmag = avg; // soft-puncture to the average signal-level } else if ( CWIsymbol == k ) binmag = 2.0f * abs(bins[k]); // give harddecode() a vote in softdecode's decision. else binmag = abs(bins[k]); for (k = 0; k < symbits; k++) b[k] += (j & (1 << (symbits - k - 1))) ? binmag : -binmag; } #if SOFTPROFILE LOG_INFO("harddecode() symbol = %d", CWIsymbol ); #endif // shift to range 0...255 for (i = 0; i < symbits; i++) { unsigned char softbits; if (staticburst) softbits = 128; // puncturing else softbits = (unsigned char)clamp(128.0 + (b[i] / (sum) * 256.0), 0, 255); symbols[i] = softbits; #if SOFTPROFILE LOG_INFO("softbits = %3u", softbits); #endif } rxinlv->symbols(symbols); for (i = 0; i < symbits; i++) { symbolbit = i + 1; decodesymbol(symbols[i]); if (counter) return; } } cmplx mfsk::mixer(cmplx in, double f) { cmplx z; // Basetone is a nominal 1000 Hz f -= tonespacing * basetone + bandwidth / 2; z = in * cmplx( cos(phaseacc), sin(phaseacc) ); phaseacc -= TWOPI * f / samplerate; if (phaseacc < 0) phaseacc += TWOPI; return z; } // finds the tone bin with the largest signal level // assumes that will be the present tone received // with NO CW inteference int mfsk::harddecode(cmplx *in) { double x, max = 0.0, avg = 0.0; int i, symbol = 0; int burstcount = 0; for (int i = 0; i < numtones; i++) avg += abs(in[i]); avg /= numtones; if (avg < 1e-20) avg = 1e-20; for (i = 0; i < numtones; i++) { x = abs(in[i]); if ( x > max) { max = x; symbol = i; } if (x > 2.0 * avg) burstcount++; } staticburst = (burstcount == numtones); if (!staticburst) afcmetric = 0.95*afcmetric + 0.05 * (2 * max / avg); else afcmetric = 0.0; return symbol; } void mfsk::update_syncscope() { int j; int pipelen = 2 * symlen; memset(scopedata, 0, 2 * symlen * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) for (unsigned int i = 0; i < SCOPESIZE; i++) { j = (pipeptr + i * pipelen / SCOPESIZE + 1) % (pipelen); scopedata[i] = vidfilter[i]->run(abs(pipe[j].vector[prev1symbol])); } set_scope(scopedata, SCOPESIZE); scopedata.next(); // change buffers } void mfsk::synchronize() { int i, j; double syn = -1; double val, max = 0.0; if (currsymbol == prev1symbol) return; if (prev1symbol == prev2symbol) return; j = pipeptr; for (i = 0; i < 2 * symlen; i++) { val = abs(pipe[j].vector[prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % (2 * symlen); } syn = syncfilter->run(syn); synccounter += (int) floor((syn - symlen) / numtones + 0.5); update_syncscope(); } void mfsk::reset_afc() { freqerr = 0.0; syncfilter->reset(); return; } void mfsk::afc() { cmplx z; cmplx prevvector; double f, f1; double ts = tonespacing / 4; if (sigsearch) { reset_afc(); sigsearch = 0; } if (staticburst || !progStatus.afconoff) return; if (metric < progStatus.sldrSquelchValue) return; if (afcmetric < 3.0) return; if (currsymbol != prev1symbol) return; if (pipeptr == 0) prevvector = pipe[2*symlen - 1].vector[currsymbol]; else prevvector = pipe[pipeptr - 1].vector[currsymbol]; z = conj(prevvector) * currvector; f = arg(z) * samplerate / TWOPI; f1 = tonespacing * (basetone + currsymbol); if ( fabs(f1 - f) < ts) { freqerr = decayavg(freqerr, (f1 - f), 32); set_freq(frequency - freqerr); } } void mfsk::eval_s2n() { sig = abs(pipe[pipeptr].vector[currsymbol]); noise = (numtones -1) * abs(pipe[pipeptr].vector[prev2symbol]); if (noise > 0) s2n = decayavg ( s2n, sig / noise, 64 ); else s2n = -20; s2nvals[s2nptr] = s2n; ++s2nptr; if (s2nptr == 100) s2nptr = 0; double maxs2n = -20; for (int n = 0; n < 100; n++) { if (s2nvals[n] > maxs2n) maxs2n = s2nvals[n]; } if (20 * log10(maxs2n) >= -12) { snprintf(mfskmsg, sizeof(mfskmsg), "s/n %3.0f dB", 20.0 * log10(maxs2n)); put_Status1(mfskmsg, 15, STATUS_CLEAR); } } int mfsk::rx_process(const double *buf, int len) { cmplx z; cmplx* bins = 0; while (len-- > 0) { // create analytic signal... z = cmplx( *buf, *buf ); buf++; hbfilt->run ( z, z ); // shift in frequency to the base freq z = mixer(z, frequency); // bandpass filter around the shifted center frequency // with required bandwidth bpfilt->run ( z, z ); // copy current vector to the pipe binsfft->run (z, pipe[pipeptr].vector, 1); bins = pipe[pipeptr].vector; if (rxstate == RX_STATE_PICTURE_START) { if (--counter == 0) { counter = picturesize; rxstate = RX_STATE_PICTURE; REQ( showRxViewer, picW, picH ); } } if (rxstate == RX_STATE_PICTURE) { if (--counter == 0) { rxstate = RX_STATE_DATA; put_status(""); std::string autosave_dir = PicsDir; picRx->save_png(autosave_dir.c_str()); rx_init(); } else recvpic(z); continue; } // copy current vector to the pipe // binsfft->run (z, pipe[pipeptr].vector, 1); // bins = pipe[pipeptr].vector; if (--synccounter <= 0) { synccounter = symlen; currsymbol = harddecode(bins); currvector = bins[currsymbol]; softdecode(bins); // symbol sync synchronize(); // frequency tracking afc(); eval_s2n(); prev2symbol = prev1symbol; prev2vector = prev1vector; prev1symbol = currsymbol; prev1vector = currvector; } pipeptr = (pipeptr + 1) % (2 * symlen); } return 0; } //===================================================================== // transmit processing //===================================================================== void mfsk::transmit(double *buf, int len) { if (xmt_filter) for (int i = 0; i < len; i++) xmtfilt->Irun(buf[i], buf[i]); ModulateXmtr(buf, len); } void mfsk::sendsymbol(int sym) { double f, phaseincr; f = get_txfreq_woffset() - bandwidth / 2; sym = grayencode(sym & (numtones - 1)); if (reverse) sym = (numtones - 1) - sym; phaseincr = TWOPI * (f + sym*tonespacing) / samplerate; for (int i = 0; i < symlen; i++) { outbuf[i] = cos(phaseacc); phaseacc -= phaseincr; if (phaseacc < 0) phaseacc += TWOPI; } transmit (outbuf, symlen); } void mfsk::sendbit(int bit) { int data = enc->encode(bit); for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == symbits) { txinlv->bits(&bitshreg); sendsymbol(bitshreg); bitstate = 0; bitshreg = 0; } } } void mfsk::sendchar(unsigned char c) { const char *code = varienc(c); while (*code) sendbit(*code++ - '0'); put_echo_char(c); } void mfsk::sendidle() { sendchar(0); sendbit(1); // extended zero bit stream for (int i = 0; i < 32; i++) sendbit(0); } void mfsk::flushtx(int nbits) { // flush the varicode decoder at the other end sendbit(1); // flush the convolutional encoder and interleaver //VK2ETA high speed modes for (int i = 0; i < 107; i++) //W1HKJ for (int i = 0; i < preamble; i++) for (int i = 0; i < nbits; i++) sendbit(0); bitstate = 0; } void mfsk::sendpic(unsigned char *data, int len) { double *ptr; double f; int i, j; ptr = outbuf; for (i = 0; i < len; i++) { if (txstate == TX_STATE_PICTURE) REQ(updateTxPic, data[i]); if (reverse) f = get_txfreq_woffset() - bandwidth * (data[i] - 128) / 256.0; else f = get_txfreq_woffset() + bandwidth * (data[i] - 128) / 256.0; for (j = 0; j < TXspp; j++) { *ptr++ = cos(phaseacc); phaseacc += TWOPI * f / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; } } transmit (outbuf, TXspp * len); } // ----------------------------------------------------------------------------- // send prologue consisting of tracepair.delay 0's void mfsk::flush_xmt_filter(int n) { double f1 = get_txfreq_woffset() - bandwidth / 2.0; double f2 = get_txfreq_woffset() + bandwidth / 2.0; for (int i = 0; i < n; i++) { outbuf[i] = cos(phaseacc); phaseacc += TWOPI * (reverse ? f2 : f1) / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; } transmit (outbuf, tracepair.delay); } void mfsk::send_prologue() { flush_xmt_filter(tracepair.delay); } void mfsk::send_epilogue() { flush_xmt_filter(64); } static bool close_after_transmit = false; void mfsk::clearbits() { int data = enc->encode(0); for (int k = 0; k < preamble; k++) { for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == symbits) { txinlv->bits(&bitshreg); bitstate = 0; bitshreg = 0; } } } } int mfsk::tx_process() { // filter test set to 1 #if 0 double *ptr; double f; char msg[100]; for (int i = 100; i < 3900; i++) { ptr = outbuf; f = 1.0 * i; snprintf(msg, sizeof(msg), "freq: %.0f", f); put_status(msg); for (int j = 0; j < 32; j++) { *ptr++ = cos(phaseacc); phaseacc += TWOPI * f / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; } transmit (outbuf, 32); } return -1; #endif int xmtbyte; switch (txstate) { case TX_STATE_PREAMBLE: clearbits(); sig_start = true; if (mode != MODE_MFSK64L && mode != MODE_MFSK128L ) for (int i = 0; i < preamble / 3; i++) sendbit(0); txstate = TX_STATE_START; break; case TX_STATE_START: sig_start = true; sendchar('\r'); sendchar(2); // STX sendchar('\r'); txstate = TX_STATE_DATA; break; case TX_STATE_DATA: xmtbyte = get_tx_char(); if(active_modem->XMLRPC_CPS_TEST) { if(startpic) startpic = false; if(xmtbyte == 0x05) { sendchar(0x04); // 0x4 has the same symbol count as 0x5 break; } } if (xmtbyte == 0x05 || startpic == true) { put_status("Tx pic: start"); int len = (int)strlen(picheader); for (int i = 0; i < len; i++) sendchar(picheader[i]); flushtx(preamble); startpic = false; txstate = TX_STATE_PICTURE_START; } else if ( xmtbyte == GET_TX_CHAR_ETX || stopflag) txstate = TX_STATE_FLUSH; else if (xmtbyte == GET_TX_CHAR_NODATA) sendidle(); else sendchar(xmtbyte); break; case TX_STATE_FLUSH: sendchar('\r'); sendchar(4); // EOT sig_stop = true; sendchar('\r'); flushtx(preamble); rxstate = RX_STATE_DATA; txstate = TX_STATE_PREAMBLE; stopflag = false; return -1; case TX_STATE_PICTURE_START: send_prologue(); txstate = TX_STATE_PICTURE; break; case TX_STATE_PICTURE: int i = 0; int blocklen = 128; stop_deadman(); while (i < xmtbytes) { if (stopflag || abortxmt) break; if (i + blocklen < xmtbytes) sendpic( &xmtpicbuff[i], blocklen); else sendpic( &xmtpicbuff[i], xmtbytes - i); if ( (100 * i / xmtbytes) % 2 == 0) { snprintf(mfskmsg, sizeof(mfskmsg), "Tx pic: %3.1f%%", (100.0f * i) / xmtbytes); put_status(mfskmsg); } i += blocklen; } flushtx(preamble); start_deadman(); REQ_FLUSH(GET_THREAD_ID()); txstate = TX_STATE_DATA; put_status("Tx pic: done"); btnpicTxSendAbort->hide(); btnpicTxSPP->show(); btnpicTxSendColor->show(); btnpicTxSendGrey->show(); btnpicTxLoad->show(); btnpicTxClose->show(); if (close_after_transmit) picTxWin->hide(); close_after_transmit = false; abortxmt = false; rxstate = RX_STATE_DATA; memset(picheader, ' ', PICHEADER - 1); picheader[PICHEADER -1] = 0; break; } return 0; } void mfsk::send_color_image(std::string s) { if (load_image(s.c_str())) { close_after_transmit = true; pic_TxSendColor(); } } void mfsk::send_Grey_image(std::string s) { if (load_image(s.c_str())) { close_after_transmit = true; pic_TxSendGrey(); } } fldigi-4.2.05/src/mfsk/interleave.cxx0000664000175000017500000000466314532252172014410 00000000000000// ---------------------------------------------------------------------------- // interleave.cxx -- MFSK (de)interleaver // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "interleave.h" // ---------------------------------------------------------------------- interleave::interleave (int _size, int _depth, int dir) { size = _size; depth = _depth; direction = dir; len = size * size * depth; table = new unsigned char [len]; flush(); } interleave::~interleave () { delete [] table; } void interleave::init() { if(table) { len = size * size * depth; flush(); } } void interleave::symbols(unsigned char *psyms) { int i, j, k; for (k = 0; k < depth; k++) { for (i = 0; i < size; i++) for (j = 0; j < size - 1; j++) *tab(k, i, j) = *tab(k, i, j + 1); for (i = 0; i < size; i++) *tab(k, i, size - 1) = psyms[i]; for (i = 0; i < size; i++) { if (direction == INTERLEAVE_FWD) psyms[i] = *tab(k, i, size - i - 1); else psyms[i] = *tab(k, i, i); } } } void interleave::bits(unsigned int *pbits) { unsigned char syms[size]; int i; for (i = 0; i < size; i++) syms[i] = (*pbits >> (size - i - 1)) & 1; symbols(syms); for (*pbits = i = 0; i < size; i++) *pbits = (*pbits << 1) | syms[i]; } void interleave::flush(void) { // Fill entire RX interleaver with punctures or 0 depending on whether // Rx or Tx if (direction == INTERLEAVE_REV) memset(table, PUNCTURE, len); else memset(table, 0, len); } // ---------------------------------------------------------------------- fldigi-4.2.05/src/mfsk/mfskvaricode.cxx0000664000175000017500000002570314532252172014725 00000000000000// ---------------------------------------------------------------------------- // // MFSKvaricode.cxx -- MFSK Varicode // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "mfskvaricode.h" /* * The IZ8BLY MFSK Varicode as defined in * http://www.qsl.net/zl1bpu/MFSK/Varicode.html */ static const char *varicode[] = { "11101011100", /* 000 - */ "11101100000", /* 001 - */ "11101101000", /* 002 - */ "11101101100", /* 003 - */ "11101110000", /* 004 - */ "11101110100", /* 005 - */ "11101111000", /* 006 - */ "11101111100", /* 007 - */ "10101000", /* 008 - */ "11110000000", /* 009 - */ "11110100000", /* 010 - */ "11110101000", /* 011 - */ "11110101100", /* 012 - */ "10101100", /* 013 - */ "11110110000", /* 014 - */ "11110110100", /* 015 - */ "11110111000", /* 016 - */ "11110111100", /* 017 - */ "11111000000", /* 018 - */ "11111010000", /* 019 - */ "11111010100", /* 020 - */ "11111011000", /* 021 - */ "11111011100", /* 022 - */ "11111100000", /* 023 - */ "11111101000", /* 024 - */ "11111101100", /* 025 - */ "11111110000", /* 026 - */ "11111110100", /* 027 - */ "11111111000", /* 028 - */ "11111111100", /* 029 - */ "100000000000", /* 030 - */ "101000000000", /* 031 - */ "100", /* 032 - */ "111000000", /* 033 - ! */ "111111100", /* 034 - '"' */ "1011011000", /* 035 - # */ "1010101000", /* 036 - $ */ "1010100000", /* 037 - % */ "1000000000", /* 038 - & */ "110111100", /* 039 - ' */ "111110100", /* 040 - ( */ "111110000", /* 041 - ) */ "1010110100", /* 042 - * */ "111100000", /* 043 - + */ "10100000", /* 044 - , */ "111011000", /* 045 - - */ "111010100", /* 046 - . */ "111101000", /* 047 - / */ "11100000", /* 048 - 0 */ "11110000", /* 049 - 1 */ "101000000", /* 050 - 2 */ "101010100", /* 051 - 3 */ "101110100", /* 052 - 4 */ "101100000", /* 053 - 5 */ "101101100", /* 054 - 6 */ "110100000", /* 055 - 7 */ "110000000", /* 056 - 8 */ "110101100", /* 057 - 9 */ "111101100", /* 058 - : */ "111111000", /* 059 - ; */ "1011000000", /* 060 - < */ "111011100", /* 061 - = */ "1010111100", /* 062 - > */ "111010000", /* 063 - ? */ "1010000000", /* 064 - @ */ "10111100", /* 065 - A */ "100000000", /* 066 - B */ "11010100", /* 067 - C */ "11011100", /* 068 - D */ "10111000", /* 069 - E */ "11111000", /* 070 - F */ "101010000", /* 071 - G */ "101011000", /* 072 - H */ "11000000", /* 073 - I */ "110110100", /* 074 - J */ "101111100", /* 075 - K */ "11110100", /* 076 - L */ "11101000", /* 077 - M */ "11111100", /* 078 - N */ "11010000", /* 079 - O */ "11101100", /* 080 - P */ "110110000", /* 081 - Q */ "11011000", /* 082 - R */ "10110100", /* 083 - S */ "10110000", /* 084 - T */ "101011100", /* 085 - U */ "110101000", /* 086 - V */ "101101000", /* 087 - W */ "101110000", /* 088 - X */ "101111000", /* 089 - Y */ "110111000", /* 090 - Z */ "1011101000", /* 091 - [ */ "1011010000", /* 092 - \ */ "1011101100", /* 093 - ] */ "1011010100", /* 094 - ^ */ "1010110000", /* 095 - _ */ "1010101100", /* 096 - ` */ "10100", /* 097 - a */ "1100000", /* 098 - b */ "111000", /* 099 - c */ "110100", /* 100 - d */ "1000", /* 101 - e */ "1010000", /* 102 - f */ "1011000", /* 103 - g */ "110000", /* 104 - h */ "11000", /* 105 - i */ "10000000", /* 106 - j */ "1110000", /* 107 - k */ "101100", /* 108 - l */ "1000000", /* 109 - m */ "11100", /* 110 - n */ "10000", /* 111 - o */ "1010100", /* 112 - p */ "1111000", /* 113 - q */ "100000", /* 114 - r */ "101000", /* 115 - s */ "1100", /* 116 - t */ "111100", /* 117 - u */ "1101100", /* 118 - v */ "1101000", /* 119 - w */ "1110100", /* 120 - x */ "1011100", /* 121 - y */ "1111100", /* 122 - z */ "1011011100", /* 123 - { */ "1010111000", /* 124 - | */ "1011100000", /* 125 - } */ "1011110000", /* 126 - ~ */ "101010000000", /* 127 - */ "101010100000", /* 128 - */ "101010101000", /* 129 - */ "101010101100", /* 130 - */ "101010110000", /* 131 - */ "101010110100", /* 132 - */ "101010111000", /* 133 - */ "101010111100", /* 134 - */ "101011000000", /* 135 - */ "101011010000", /* 136 - */ "101011010100", /* 137 - */ "101011011000", /* 138 - */ "101011011100", /* 139 - */ "101011100000", /* 140 - */ "101011101000", /* 141 - */ "101011101100", /* 142 - */ "101011110000", /* 143 - */ "101011110100", /* 144 - */ "101011111000", /* 145 - */ "101011111100", /* 146 - */ "101100000000", /* 147 - */ "101101000000", /* 148 - */ "101101010000", /* 149 - */ "101101010100", /* 150 - */ "101101011000", /* 151 - */ "101101011100", /* 152 - */ "101101100000", /* 153 - */ "101101101000", /* 154 - */ "101101101100", /* 155 - */ "101101110000", /* 156 - */ "101101110100", /* 157 - */ "101101111000", /* 158 - */ "101101111100", /* 159 - */ "1011110100", /* 160 - */ "1011111000", /* 161 - */ "1011111100", /* 162 - */ "1100000000", /* 163 - */ "1101000000", /* 164 - */ "1101010000", /* 165 - */ "1101010100", /* 166 - */ "1101011000", /* 167 - */ "1101011100", /* 168 - */ "1101100000", /* 169 - */ "1101101000", /* 170 - */ "1101101100", /* 171 - */ "1101110000", /* 172 - */ "1101110100", /* 173 - */ "1101111000", /* 174 - */ "1101111100", /* 175 - */ "1110000000", /* 176 - */ "1110100000", /* 177 - */ "1110101000", /* 178 - */ "1110101100", /* 179 - */ "1110110000", /* 180 - */ "1110110100", /* 181 - */ "1110111000", /* 182 - */ "1110111100", /* 183 - */ "1111000000", /* 184 - */ "1111010000", /* 185 - */ "1111010100", /* 186 - */ "1111011000", /* 187 - */ "1111011100", /* 188 - */ "1111100000", /* 189 - */ "1111101000", /* 190 - */ "1111101100", /* 191 - */ "1111110000", /* 192 - */ "1111110100", /* 193 - */ "1111111000", /* 194 - */ "1111111100", /* 195 - */ "10000000000", /* 196 - */ "10100000000", /* 197 - */ "10101000000", /* 198 - */ "10101010000", /* 199 - */ "10101010100", /* 200 - */ "10101011000", /* 201 - */ "10101011100", /* 202 - */ "10101100000", /* 203 - */ "10101101000", /* 204 - */ "10101101100", /* 205 - */ "10101110000", /* 206 - */ "10101110100", /* 207 - */ "10101111000", /* 208 - */ "10101111100", /* 209 - */ "10110000000", /* 210 - */ "10110100000", /* 211 - */ "10110101000", /* 212 - */ "10110101100", /* 213 - */ "10110110000", /* 214 - */ "10110110100", /* 215 - */ "10110111000", /* 216 - */ "10110111100", /* 217 - */ "10111000000", /* 218 - */ "10111010000", /* 219 - */ "10111010100", /* 220 - */ "10111011000", /* 221 - */ "10111011100", /* 222 - */ "10111100000", /* 223 - */ "10111101000", /* 224 - */ "10111101100", /* 225 - */ "10111110000", /* 226 - */ "10111110100", /* 227 - */ "10111111000", /* 228 - */ "10111111100", /* 229 - */ "11000000000", /* 230 - */ "11010000000", /* 231 - */ "11010100000", /* 232 - */ "11010101000", /* 233 - */ "11010101100", /* 234 - */ "11010110000", /* 235 - */ "11010110100", /* 236 - */ "11010111000", /* 237 - */ "11010111100", /* 238 - */ "11011000000", /* 239 - */ "11011010000", /* 240 - */ "11011010100", /* 241 - */ "11011011000", /* 242 - */ "11011011100", /* 243 - */ "11011100000", /* 244 - */ "11011101000", /* 245 - */ "11011101100", /* 246 - */ "11011110000", /* 247 - */ "11011110100", /* 248 - */ "11011111000", /* 249 - */ "11011111100", /* 250 - */ "11100000000", /* 251 - */ "11101000000", /* 252 - n */ "11101010000", /* 253 - */ "11101010100", /* 254 - */ "11101011000" /* 255 - */ }; /* * The same in a format more suitable for decoding. */ static const unsigned int varidecode[] = { 0x75C, 0x760, 0x768, 0x76C, 0x770, 0x774, 0x778, 0x77C, 0x0A8, 0x780, 0x7A0, 0x7A8, 0x7AC, 0x0AC, 0x7B0, 0x7B4, 0x7B8, 0x7BC, 0x7C0, 0x7D0, 0x7D4, 0x7D8, 0x7DC, 0x7E0, 0x7E8, 0x7EC, 0x7F0, 0x7F4, 0x7F8, 0x7FC, 0x800, 0xA00, 0x004, 0x1C0, 0x1FC, 0x2D8, 0x2A8, 0x2A0, 0x200, 0x1BC, 0x1F4, 0x1F0, 0x2B4, 0x1E0, 0x0A0, 0x1D8, 0x1D4, 0x1E8, 0x0E0, 0x0F0, 0x140, 0x154, 0x174, 0x160, 0x16C, 0x1A0, 0x180, 0x1AC, 0x1EC, 0x1F8, 0x2C0, 0x1DC, 0x2BC, 0x1D0, 0x280, 0x0BC, 0x100, 0x0D4, 0x0DC, 0x0B8, 0x0F8, 0x150, 0x158, 0x0C0, 0x1B4, 0x17C, 0x0F4, 0x0E8, 0x0FC, 0x0D0, 0x0EC, 0x1B0, 0x0D8, 0x0B4, 0x0B0, 0x15C, 0x1A8, 0x168, 0x170, 0x178, 0x1B8, 0x2E8, 0x2D0, 0x2EC, 0x2D4, 0x2B0, 0x2AC, 0x014, 0x060, 0x038, 0x034, 0x008, 0x050, 0x058, 0x030, 0x018, 0x080, 0x070, 0x02C, 0x040, 0x01C, 0x010, 0x054, 0x078, 0x020, 0x028, 0x00C, 0x03C, 0x06C, 0x068, 0x074, 0x05C, 0x07C, 0x2DC, 0x2B8, 0x2E0, 0x2F0, 0xA80, 0xAA0, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xAE8, 0xAEC, 0xAF0, 0xAF4, 0xAF8, 0xAFC, 0xB00, 0xB40, 0xB50, 0xB54, 0xB58, 0xB5C, 0xB60, 0xB68, 0xB6C, 0xB70, 0xB74, 0xB78, 0xB7C, 0x2F4, 0x2F8, 0x2FC, 0x300, 0x340, 0x350, 0x354, 0x358, 0x35C, 0x360, 0x368, 0x36C, 0x370, 0x374, 0x378, 0x37C, 0x380, 0x3A0, 0x3A8, 0x3AC, 0x3B0, 0x3B4, 0x3B8, 0x3BC, 0x3C0, 0x3D0, 0x3D4, 0x3D8, 0x3DC, 0x3E0, 0x3E8, 0x3EC, 0x3F0, 0x3F4, 0x3F8, 0x3FC, 0x400, 0x500, 0x540, 0x550, 0x554, 0x558, 0x55C, 0x560, 0x568, 0x56C, 0x570, 0x574, 0x578, 0x57C, 0x580, 0x5A0, 0x5A8, 0x5AC, 0x5B0, 0x5B4, 0x5B8, 0x5BC, 0x5C0, 0x5D0, 0x5D4, 0x5D8, 0x5DC, 0x5E0, 0x5E8, 0x5EC, 0x5F0, 0x5F4, 0x5F8, 0x5FC, 0x600, 0x680, 0x6A0, 0x6A8, 0x6AC, 0x6B0, 0x6B4, 0x6B8, 0x6BC, 0x6C0, 0x6D0, 0x6D4, 0x6D8, 0x6DC, 0x6E0, 0x6E8, 0x6EC, 0x6F0, 0x6F4, 0x6F8, 0x6FC, 0x700, 0x740, 0x750, 0x754, 0x758 }; const char *varienc(int c) { if (c >= 0 && c < 256) return varicode[c]; return varicode[0]; } int varidec(unsigned int symbol) { int i; for (i = 0; i < 256; i++) if (symbol == varidecode[i]) return i; return -1; } fldigi-4.2.05/src/mfsk/mfsk-pic.cxx0000664000175000017500000002647414611711171013764 00000000000000// ---------------------------------------------------------------------------- // mfsk-pic.cxx -- mfsk support functions // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "gettext.h" Fl_Double_Window *picRxWin = (Fl_Double_Window *)0; picture *picRx = (picture *)0; Fl_Double_Window *picTxWin = (Fl_Double_Window *)0; picture *picTx = (picture *)0; picbox *picTxBox = 0; Fl_Button *btnpicTxSPP = (Fl_Button *)0; Fl_Button *btnpicTxSendColor = (Fl_Button *)0; Fl_Button *btnpicTxSendGrey = (Fl_Button *)0; Fl_Button *btnpicTxSendAbort = (Fl_Button *)0; Fl_Button *btnpicTxLoad = (Fl_Button *)0; Fl_Button *btnpicTxClose = (Fl_Button *)0; Fl_Shared_Image *TxImg = (Fl_Shared_Image *)0; unsigned char *xmtimg = (unsigned char *)0; unsigned char *xmtpicbuff = (unsigned char *)0; mfsk *serviceme = 0; int txSPP = 8; char txclr_tooltip[24]; char txgry_tooltip[24]; void updateRxPic(unsigned char data, int pos) { picRx->pixel(data, pos); } void createRxViewer() { picRxWin = new Fl_Double_Window(200, 140); picRxWin->xclass(PACKAGE_NAME); picRxWin->begin(); picRx = new picture(2, 2, 136, 104); picRxWin->end(); } void showRxViewer(int W, int H) { if (!picRxWin) createRxViewer(); int winW, winH; int picX, picY; winW = W < 136 ? 140 : W + 4; winH = H + 4; picX = (winW - W) / 2; picY = 2; picRxWin->size(winW, winH); picRx->resize(picX, picY, W, H); picRx->clear(); picRxWin->show(); } int load_image(const char *n) { if (serviceme != active_modem) { return 0; } int W, H, D; unsigned char *img_data; if (TxImg) { TxImg->release(); TxImg = 0; } TxImg = Fl_Shared_Image::get(n); if (!TxImg) return 0; if (TxImg->count() > 1) { TxImg->release(); TxImg = 0; return 0; } img_data = (unsigned char *)TxImg->data()[0]; W = TxImg->w(); H = TxImg->h(); D = TxImg->d(); if (xmtimg) delete [] xmtimg; xmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(xmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; xmtimg[j] = img_data[k]; xmtimg[j+1] = img_data[k+1]; xmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; xmtimg[j] = xmtimg[j+1] = xmtimg[j+2] = img_data[i]; } } else return 0; TxViewerResize(W, H); char* label = strdup(n); picTxWin->copy_label(basename(label)); free(label); picTxBox->label(0); // load the picture widget with the rgb image picTx->show(); picTx->clear(); picTxWin->redraw(); picTx->video(xmtimg, W * H * 3); if (print_time_left( (W * H * 3) * 0.000125 * serviceme->TXspp, txclr_tooltip, sizeof(txclr_tooltip), _("Time needed: ")) > 0) btnpicTxSendColor->tooltip(txclr_tooltip); btnpicTxSendColor->activate(); if (print_time_left( (W * H) * 0.000125 * serviceme->TXspp, txgry_tooltip, sizeof(txgry_tooltip), _("Time needed: ")) > 0) btnpicTxSendGrey->tooltip(txgry_tooltip); btnpicTxSendGrey->activate(); return 1; } void updateTxPic(unsigned char data) { if (serviceme != active_modem) return; if (serviceme->color) { serviceme->pixelnbr = serviceme->rgb + serviceme->row + 3*serviceme->col; picTx->pixel(data, serviceme->pixelnbr); if (++serviceme->col == TxImg->w()) { serviceme->col = 0; if (++serviceme->rgb == 3) { serviceme->rgb = 0; serviceme->row += 3 * TxImg->w(); } } } else { picTx->pixel( data, serviceme->pixelnbr++ ); picTx->pixel( data, serviceme->pixelnbr++ ); picTx->pixel( data, serviceme->pixelnbr++ ); } } void cb_picTxLoad(Fl_Widget *, void *) { const char *fn = FSEL::select(_("Load image file"), "Portable Network Graphics\t*.png\n" "Independent JPEG Group\t*.{jpg,jif,jpeg,jpe}\n" "Graphics Interchange Format\t*.gif", PicsDir.c_str()); if (!fn) return; if (!*fn) return; load_image(fn); } void cb_picTxClose( Fl_Widget *w, void *) { picTxWin->hide(); } void pic_TxSendColor() { int W, H, rowstart; W = TxImg->w(); H = TxImg->h(); if (xmtpicbuff) delete [] xmtpicbuff; xmtpicbuff = new unsigned char [W*H*3]; unsigned char *outbuf = xmtpicbuff; unsigned char *inbuf = xmtimg; int iy, ix, rgb; for (iy = 0; iy < H; iy++) { rowstart = iy * W * 3; for (rgb = 0; rgb < 3; rgb++) for (ix = 0; ix < W; ix++) outbuf[rowstart + rgb*W + ix] = inbuf[rowstart + rgb + ix*3]; } if (serviceme->TXspp == 8) snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%dC;", W, H); else snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%dCp%d;", W, H,serviceme->TXspp); serviceme->xmtbytes = W * H * 3; serviceme->color = true; serviceme->rgb = 0; serviceme->col = 0; serviceme->row = 0; serviceme->pixelnbr = 0; btnpicTxSPP->hide(); btnpicTxSendColor->hide(); btnpicTxSendGrey->hide(); btnpicTxLoad->hide(); btnpicTxClose->hide(); btnpicTxSendAbort->show(); picTx->clear(); if (!picTxWin->visible()) picTxWin->show(); // start the transmission start_tx(); serviceme->startpic = true; } void cb_picTxSendColor( Fl_Widget *w, void *) { if (serviceme != active_modem) return; pic_TxSendColor(); } void pic_TxSendGrey() { int W, H; W = TxImg->w(); H = TxImg->h(); if (xmtpicbuff) delete [] xmtpicbuff; xmtpicbuff = new unsigned char [W*H]; unsigned char *outbuf = xmtpicbuff; unsigned char *inbuf = xmtimg; for (int i = 0; i < W*H; i++) outbuf[i] = ( 31 * inbuf[i*3] + 61 * inbuf[i*3 + 1] + 8 * inbuf[i*3 + 2])/100; if (serviceme->TXspp == 8) snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%d;", W, H); else snprintf(serviceme->picheader, PICHEADER, "\nSending Pic:%dx%dp%d;", W, H,serviceme->TXspp); serviceme->xmtbytes = W * H; serviceme->color = false; serviceme->col = 0; serviceme->row = 0; serviceme->pixelnbr = 0; btnpicTxSPP->hide(); btnpicTxSendColor->hide(); btnpicTxSendGrey->hide(); btnpicTxLoad->hide(); btnpicTxClose->hide(); btnpicTxSendAbort->show(); picTx->clear(); // start the transmission if (!picTxWin->visible()) picTxWin->show(); start_tx(); serviceme->startpic = true; } void cb_picTxSendGrey( Fl_Widget *w, void *) { if (serviceme != active_modem) return; pic_TxSendGrey(); } void cb_picTxSendAbort( Fl_Widget *w, void *) { if (serviceme != active_modem) return; serviceme->abortxmt = true; // reload the picture widget with the rgb image picTx->video(xmtimg, TxImg->w() * TxImg->h() * 3); } void cb_picTxSPP( Fl_Widget *w, void *) { if (serviceme != active_modem) return; Fl_Button *b = (Fl_Button *)w; if (serviceme->TXspp == 8) serviceme->TXspp = 4; else if (serviceme->TXspp == 4) serviceme->TXspp = 2; else serviceme->TXspp = 8; if (serviceme->TXspp == 8) b->label("X1"); else if (serviceme->TXspp == 4) b->label("X2"); else b->label("X4"); b->redraw_label(); txSPP = serviceme->TXspp; if (TxImg == 0) return; if (TxImg->w() > 0 && TxImg->h() > 0) { if (print_time_left( (TxImg->w() * TxImg->h() * 3) * 0.000125 * serviceme->TXspp, txclr_tooltip, sizeof(txclr_tooltip), _("Time needed: ")) > 0) btnpicTxSendColor->tooltip(txclr_tooltip); if (print_time_left( (TxImg->w() * TxImg->h()) * 0.000125 * serviceme->TXspp, txgry_tooltip, sizeof(txgry_tooltip), _("Time needed: ")) > 0) btnpicTxSendGrey->tooltip(txgry_tooltip); } } void createTxViewer() { picTxWin = new Fl_Double_Window(290, 180, _("Send image")); picTxWin->xclass(PACKAGE_NAME); picTxWin->begin(); picTx = new picture (2, 2, 286, 150); picTx->hide(); picTxBox = new picbox(picTxWin->x(), picTxWin->y(), picTxWin->w(), picTxWin->h(), _("Load or drop an image file\nSupported types: PNG, JPEG, BMP")); picTxBox->labelfont(FL_HELVETICA_ITALIC); btnpicTxSPP = new Fl_Button(5, 180 - 26, 40, 24, "X1"); btnpicTxSPP->tooltip(_("Transfer speed, X1-normal")); btnpicTxSPP->callback( cb_picTxSPP, 0); btnpicTxSendColor = new Fl_Button(45, 180 - 26, 60, 24, "XmtClr"); btnpicTxSendColor->callback(cb_picTxSendColor, 0); btnpicTxSendGrey = new Fl_Button(105, 180 - 26, 60, 24, "XmtGry"); btnpicTxSendGrey->callback( cb_picTxSendGrey, 0); btnpicTxSendAbort = new Fl_Button(84, 180 - 26, 122, 24, "Abort Xmt"); btnpicTxSendAbort->callback(cb_picTxSendAbort, 0); btnpicTxLoad = new Fl_Button(165, 180 - 26, 60, 24, _("Load")); btnpicTxLoad->callback(cb_picTxLoad, 0); btnpicTxClose = new Fl_Button(225, 180 - 26, 60, 24, _("Close")); btnpicTxClose->callback(cb_picTxClose, 0); btnpicTxSendAbort->hide(); btnpicTxSendColor->deactivate(); btnpicTxSendGrey->deactivate(); picTxWin->end(); } void TxViewerResize(int W, int H) { int winW, winH; int picX, picY; winW = W < 286 ? 290 : W + 4; winH = H < 180 ? 210 : H + 30; picX = (winW - W) / 2; picY = (winH - 26 - H) / 2; picTxWin->size(winW, winH); picTx->resize(picX, picY, W, H); picTx->clear(); picTxBox->size(winW, winH); btnpicTxSPP->resize(winW/2 - 140, winH - 26, 40, 24); btnpicTxSendColor->resize(winW/2 - 100, winH - 26, 60, 24); btnpicTxSendGrey->resize(winW/2 - 40, winH - 26, 60, 24); btnpicTxSendAbort->resize(winW/2 - 61, winH - 26, 122, 24); btnpicTxLoad->resize(winW/2 + 20, winH - 26, 60, 24); btnpicTxClose->resize(winW/2 + 80, winH - 26, 60, 24); } void showTxViewer(int W, int H) { if (!picTxWin) createTxViewer(); int winW, winH; int picX, picY; winW = W < 288 ? 290 : W + 4; winH = H < 180 ? 180 : H + 30; picX = (winW - W) / 2; picY = (winH - 26 - H) / 2; picTxWin->size(winW, winH); picTx->resize(picX, picY, W, H); btnpicTxSPP->resize(winW/2 - 140, winH - 26, 40, 24); btnpicTxSendColor->resize(winW/2 - 100, winH - 26, 60, 24); btnpicTxSendGrey->resize(winW/2 - 40, winH - 26, 60, 24); btnpicTxSendAbort->resize(winW/2 - 61, winH - 26, 122, 24); btnpicTxLoad->resize(winW/2 + 20, winH - 26, 60, 24); btnpicTxClose->resize(winW/2 + 80, winH - 26, 60, 24); btnpicTxSPP->show(); btnpicTxSendColor->show(); btnpicTxSendGrey->show(); btnpicTxLoad->show(); btnpicTxClose->show(); btnpicTxSendAbort->hide(); picTxWin->show(); } void deleteTxViewer() { picTxWin->hide(); if (picTx) delete picTx; delete [] xmtimg; xmtimg = 0; delete [] xmtpicbuff; xmtpicbuff = 0; delete picTxWin; picTxWin = 0; serviceme = 0; } void deleteRxViewer() { picRxWin->hide(); if (picRx) { delete picRx; picRx = 0; } delete picRxWin; picRxWin = 0; serviceme = 0; } int print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix) { int time_min = (int)(time_sec / 60); time_sec -= time_min * 60; if (time_min) return snprintf(str, len, "%s %02dm %2.1fs%s", prefix, time_min, time_sec, suffix); else return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); } void setpicture_link(mfsk *me) { serviceme = me; } fldigi-4.2.05/src/trx/0000775000175000017500000000000014611714005011446 500000000000000fldigi-4.2.05/src/trx/test_signal.cxx0000664000175000017500000000213014611711171014423 00000000000000// ---------------------------------------------------------------------------- // test_signal.cxx // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "test_signal.h" Fl_Double_Window* test_signal_window = (Fl_Double_Window *)0; void show_testdialog(void) { if (!test_signal_window) test_signal_window = make_testdialog(); test_signal_window->show(); } fldigi-4.2.05/src/trx/nullmodem.cxx0000664000175000017500000000453214611711171014113 00000000000000// ---------------------------------------------------------------------------- // NULLMODEM.cxx -- NULLMODEM modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gMFSK source code // distribution. // gMFSK Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "nullmodem.h" #include "fl_digi.h" #include "ascii.h" #define null_bw 1 // a NULLMODEM and will be instantiated before the dynamic member wf, // digiscope, and fl_digi_main, the main dialog NULLMODEM:: NULLMODEM() : modem() { mode = MODE_NULL; samplerate = 8000; restart(); } NULLMODEM::~NULLMODEM() {}; void NULLMODEM::tx_init() { } void NULLMODEM::rx_init() { if (fl_digi_main) put_MODEstatus(mode); } void NULLMODEM::init() { modem::init(); rx_init(); if (digiscope) digiscope->mode(Digiscope::SCOPE); } void NULLMODEM::restart() { if (wf) set_bandwidth(null_bw); } //===================================================================== // receive processing //===================================================================== int NULLMODEM::rx_process(const double *buf, int len) { return 0; } //===================================================================== // transmit processing //===================================================================== int NULLMODEM::tx_process() { modem::tx_process(); MilliSleep(10); if (!fl_digi_main) { return 0; } int c = get_tx_char(); if (c == GET_TX_CHAR_ETX) { stopflag = false; return -1; } if ( stopflag ) { stopflag = false; return -1; } return 0; } fldigi-4.2.05/src/trx/modem.cxx0000664000175000017500000012057214611711171013223 00000000000000// ---------------------------------------------------------------------------- // modem.cxx - modem class - base for all modems // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "misc.h" #include "filters.h" #include "confdialog.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "main.h" #include "arq_io.h" #include "configuration.h" #include "waterfall.h" #include "qrunner.h" #include "macros.h" #include "testsigs.h" #include "test_signal.h" #include "status.h" #include "debug.h" #include "audio_alert.h" modem *null_modem = 0; modem *cw_modem = 0; modem *mfsk8_modem = 0; modem *mfsk16_modem = 0; modem *mfsk32_modem = 0; modem *mfsk4_modem = 0; modem *mfsk11_modem = 0; modem *mfsk22_modem = 0; modem *mfsk31_modem = 0; modem *mfsk64_modem = 0; modem *mfsk128_modem = 0; modem *mfsk64l_modem = 0; modem *mfsk128l_modem = 0; modem *wefax576_modem = 0; modem *wefax288_modem = 0; modem *navtex_modem = 0; modem *sitorb_modem = 0; modem *mt63_500S_modem = 0; modem *mt63_500L_modem = 0; modem *mt63_1000S_modem = 0; modem *mt63_1000L_modem = 0; modem *mt63_2000S_modem = 0; modem *mt63_2000L_modem = 0; modem *feld_modem = 0; modem *feld_slowmodem = 0; modem *feld_x5modem = 0; modem *feld_x9modem = 0; modem *feld_FMmodem = 0; modem *feld_FM105modem = 0; modem *feld_80modem = 0; modem *feld_CMTmodem = 0; modem *psk31_modem = 0; modem *psk63_modem = 0; modem *psk63f_modem = 0; modem *psk125_modem = 0; modem *psk250_modem = 0; modem *psk500_modem = 0; modem *psk1000_modem = 0; modem *qpsk31_modem = 0; modem *qpsk63_modem = 0; modem *qpsk125_modem = 0; modem *qpsk250_modem = 0; modem *qpsk500_modem = 0; modem *_8psk125_modem = 0; modem *_8psk250_modem = 0; modem *_8psk500_modem = 0; modem *_8psk1000_modem = 0; modem *_8psk1200_modem = 0; modem *_8psk125fl_modem = 0; modem *_8psk125f_modem = 0; modem *_8psk250fl_modem = 0; modem *_8psk250f_modem = 0; modem *_8psk500f_modem = 0; modem *_8psk1000f_modem = 0; modem *_8psk1200f_modem = 0; modem *ofdm_500f_modem = 0; modem *ofdm_750f_modem = 0; modem *ofdm_2000f_modem = 0; modem *ofdm_2000_modem = 0; modem *ofdm_3500_modem = 0; modem *psk125r_modem = 0; modem *psk250r_modem = 0; modem *psk500r_modem = 0; modem *psk1000r_modem = 0; modem *psk800_c2_modem = 0; modem *psk800r_c2_modem = 0; modem *psk1000_c2_modem = 0; modem *psk1000r_c2_modem = 0; modem *psk63r_c4_modem = 0; modem *psk63r_c5_modem = 0; modem *psk63r_c10_modem = 0; modem *psk63r_c20_modem = 0; modem *psk63r_c32_modem = 0; modem *psk125r_c4_modem = 0; modem *psk125r_c5_modem = 0; modem *psk125r_c10_modem = 0; modem *psk125_c12_modem = 0; modem *psk125r_c12_modem = 0; modem *psk125r_c16_modem = 0; modem *psk250r_c2_modem = 0; modem *psk250r_c3_modem = 0; modem *psk250r_c5_modem = 0; modem *psk250_c6_modem = 0; modem *psk250r_c6_modem = 0; modem *psk250r_c7_modem = 0; modem *psk500_c2_modem = 0; modem *psk500_c4_modem = 0; modem *psk500r_c2_modem = 0; modem *psk500r_c3_modem = 0; modem *psk500r_c4_modem = 0; modem *olivia_modem = 0; modem *olivia_4_125_modem = 0; modem *olivia_4_250_modem = 0; modem *olivia_4_500_modem = 0; modem *olivia_4_1000_modem = 0; modem *olivia_4_2000_modem = 0; modem *olivia_8_125_modem = 0; modem *olivia_8_250_modem = 0; modem *olivia_8_500_modem = 0; modem *olivia_8_1000_modem = 0; modem *olivia_8_2000_modem = 0; modem *olivia_16_500_modem = 0; modem *olivia_16_1000_modem = 0; modem *olivia_16_2000_modem = 0; modem *olivia_32_1000_modem = 0; modem *olivia_32_2000_modem = 0; modem *olivia_64_500_modem = 0; modem *olivia_64_1000_modem = 0; modem *olivia_64_2000_modem = 0; modem *contestia_modem = 0; modem *contestia_4_125_modem = 0; modem *contestia_4_250_modem = 0; modem *contestia_4_500_modem = 0; modem *contestia_4_1000_modem = 0; modem *contestia_4_2000_modem = 0; modem *contestia_8_125_modem = 0; modem *contestia_8_250_modem = 0; modem *contestia_8_500_modem = 0; modem *contestia_8_1000_modem = 0; modem *contestia_8_2000_modem = 0; modem *contestia_16_250_modem = 0; modem *contestia_16_500_modem = 0; modem *contestia_16_1000_modem = 0; modem *contestia_16_2000_modem = 0; modem *contestia_32_1000_modem = 0; modem *contestia_32_2000_modem = 0; modem *contestia_64_500_modem = 0; modem *contestia_64_1000_modem = 0; modem *contestia_64_2000_modem = 0; modem *rtty_modem = 0; modem *pkt_modem = 0; modem *thormicro_modem = 0; modem *thor4_modem = 0; modem *thor5_modem = 0; modem *thor8_modem = 0; modem *thor11_modem = 0; modem *thor16_modem = 0; modem *thor22_modem = 0; modem *thor32_modem = 0; modem *thor44_modem = 0; modem *thor56_modem = 0; modem *thor25x4_modem = 0; modem *thor50x1_modem = 0; modem *thor50x2_modem = 0; modem *thor100_modem = 0; modem *fsq_modem = 0; modem *ifkp_modem = 0; modem *dominoexmicro_modem = 0; modem *dominoex4_modem = 0; modem *dominoex5_modem = 0; modem *dominoex8_modem = 0; modem *dominoex11_modem = 0; modem *dominoex16_modem = 0; modem *dominoex22_modem = 0; modem *dominoex44_modem = 0; modem *dominoex88_modem = 0; modem *throb1_modem = 0; modem *throb2_modem = 0; modem *throb4_modem = 0; modem *throbx1_modem = 0; modem *throbx2_modem = 0; modem *throbx4_modem = 0; modem *wwv_modem = 0; modem *anal_modem = 0; modem *fmt_modem = 0; modem *ssb_modem = 0; double modem::frequency = 1000; double modem::tx_frequency = 1000; bool modem::freqlock = false; // For xml socket command unsigned long modem::tx_sample_count = 0; unsigned int modem::tx_sample_rate = 0; bool modem::XMLRPC_CPS_TEST = false; modem::modem() { scptr = 0; if (wf) frequency = tx_frequency = wf->Carrier(); else frequency = tx_frequency = 1000; morse = new cMorse; sigsearch = 0; if (wf) { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; } else reverse = false; historyON = false; cap = CAP_RX | CAP_TX; PTTphaseacc = 0.0; s2n_ncount = s2n_sum = s2n_sum2 = s2n_metric = 0.0; s2n_valid = false; bandwidth = 0.0; for (int i=0; iReverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; } void modem::set_freq(double freq) { frequency = CLAMP( freq, progdefaults.LowFreqCutoff + bandwidth / 2, progdefaults.HighFreqCutoff - bandwidth / 2); if (freqlock == false) tx_frequency = frequency; if (progdefaults.RxFilt_track_wf) center_rxfilt_at_track(); REQ(put_freq, frequency); } void modem::set_freqlock(bool on) { freqlock = on; set_freq(frequency); } double modem::get_txfreq(void) const { if (unlikely(!(cap & CAP_TX))) return 0; else if (mailserver && progdefaults.PSKmailSweetSpot) return progdefaults.PSKsweetspot; if (get_mode() == MODE_FSQ) return 1500; return tx_frequency; } double modem::get_txfreq_woffset(void) const { if (mailserver && progdefaults.PSKmailSweetSpot) return (progdefaults.PSKsweetspot - progdefaults.TxOffset); if (get_mode() == MODE_FSQ) return (1500 - progdefaults.TxOffset); if (test_signal_window && test_signal_window->visible() && btnOffsetOn->value()) return tx_frequency + ctrl_freq_offset->value(); return (tx_frequency - progdefaults.TxOffset); } void modem::set_bandwidth(double bw) { bandwidth = bw; put_Bandwidth((int)bandwidth); } void modem::set_reverse(bool on) { if (likely(wf)) reverse = on ^ (!wf->USB()); else reverse = false; } void modem::set_metric(double m) { metric = m; } extern void callback_set_metric(double metric); void modem::display_metric(double m) { set_metric(m); if (!progStatus.kpsql_enabled) REQ(callback_set_metric, m); } bool modem::get_cwTrack() { return cwTrack; } void modem::set_cwTrack(bool b) { cwTrack = b; } bool modem::get_cwLock() { return cwLock; } void modem::set_cwLock(bool b) { cwLock = b; } double modem::get_cwRcvWPM() { return cwRcvWPM; } double modem::get_cwXmtWPM() { return cwXmtWPM; } void modem::set_cwXmtWPM(double wpm) { cwXmtWPM = wpm; } void modem::set_samplerate(int smprate) { samplerate = smprate; } double modem::PTTnco() { double amp; // sine wave PTT signal amp = 0.9 * sin(PTTphaseacc); // square wave PTT signal // if (PTTphaseacc > M_PI) // amp = - 0.5; // else // amp = 0.5; PTTphaseacc += TWOPI * progdefaults.QSKfrequency / samplerate; if (PTTphaseacc > TWOPI) PTTphaseacc -= TWOPI; return amp; } double modem::sigmaN (double es_ovr_n0) { double sn_ratio, sigma; double mode_factor = 0.707; switch (mode) { case MODE_CW: mode_factor /= 0.44; break; case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5: case MODE_HELLX9: mode_factor /= 0.22; break; case MODE_MT63_500S: case MODE_MT63_1000S: case MODE_MT63_2000S : case MODE_MT63_500L: case MODE_MT63_1000L: case MODE_MT63_2000L : mode_factor *= 3.0; break; case MODE_PSK31: case MODE_PSK63: case MODE_PSK63F: case MODE_PSK125: case MODE_PSK250: case MODE_PSK500: case MODE_QPSK31: case MODE_QPSK63: case MODE_QPSK125: case MODE_QPSK250: case MODE_PSK125R: case MODE_PSK250R: case MODE_PSK500R: mode_factor = 400; break; case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: mode_factor *= 6.0; break; // case MODE_RTTY: // case MODE_OLIVIA: // case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: // case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: // case MODE_MFSK4: case MODE_MFSK11: case MODE_MFSK22: case MODE_MFSK31: // case MODE_MFSK64: case MODE_MFSK8: case MODE_MFSK16: case MODE_MFSK32: // case MODE_THOR4: case MODE_THOR5: case MODE_THOR8: // case MODE_THOR11:case MODE_THOR16: case MODE_THOR22: // case MODE_FSKH245: case MODE_FSKH105: case MODE_HELL80: default: break; } if (trx_state == STATE_TUNE) mode_factor = 0.707; sn_ratio = pow(10, ( es_ovr_n0 / 10) ); sigma = sqrt ( mode_factor / sn_ratio ); return sigma; } // A Rayleigh-distributed random variable R, with the probability // distribution // F(R) = 0 where R < 0 and // F(R) = 1 - exp(-R^2/2*sigma^2) where R >= 0, // is related to a pair of Gaussian variables C and D // through the transformation // C = R * cos(theta) and // D = R * sin(theta), // where theta is a uniformly distributed variable in the interval // 0 to 2 * Pi. double modem::gauss(double sigma) { double u, r; u = 1.0 * rand() / RAND_MAX; r = sigma * sqrt( 2.0 * log( 1.0 / (1.0 - u) ) ); u = 1.0 * rand() / RAND_MAX; return r * cos(2 * M_PI * u); } // given the desired Es/No, calculate the standard deviation of the // additive white gaussian noise (AWGN). The standard deviation of // the AWGN will be used to generate Gaussian random variables // simulating the noise that is added to the signal. // return signal + noise, limiting value to +/- 1.0 void modem::add_noise(double *buffer, int len) { double sigma = sigmaN(noiseDB->value()); double sn = 0; for (int n = 0; n < len; n++) { if (btnNoiseOn->value()) { sn = (buffer[n] + gauss(sigma)) / (1.0 + 3.0 * sigma); buffer[n] = clamp(sn, -1.0, 1.0); } } } void modem::s2nreport(void) { double s2n_avg = s2n_sum / s2n_ncount; double s2n_stddev = sqrt((s2n_sum2 / s2n_ncount) - (s2n_avg * s2n_avg)); pskmail_notify_s2n(s2n_ncount, s2n_avg, s2n_stddev); } // Averages a given [0-100] integer value over the last QUALITYDEPTH calls. // By default, returns ONLY values of: 100, 90, 75, 50, 25, 10, & 0 // Prevents erratic / jumpy / unreadable display in GUI int modem::get_quality(int mode) { /* Quality value meanings: * 100% - zero errors, perfect FEC metrics * 90% - zero errors, near-perfect FEC metrics * 75% - zero errors, medium FEC metrics * 50% - very-rare errors, weak FEC metrics * 25% - some errors * 10% - half errors * 0% - mostly errors */ // Average the quality[] array. int average = 0; for (int i=0; i 90) average = 100; else if (average > 80) average = 90; else if (average > 60) average = 75; else if (average > 40) average = 50; else if (average > 20) average = 25; else if (average > 9) average = 10; else average = 0; // Else just round to 0. return average; } int modem::update_quality(int value, int mode) { static int index=0; // Check the passed value, clamp if out of bounds if (value > 100) value = 100; else if (value < 0) value = 0; // Save the latest passed value to buffer for averaging quality[index++] = value; if ( QUALITYDEPTH == index) index = 0; return get_quality(mode); } bool disable_modem = false; #define SIGLIMIT 0.95 //double tx_mon_buffer[16384]; void modem::ModulateXmtr(double *buffer, int len) { if (unlikely(!TXscard)) return; if (disable_modem) return; tx_sample_count += len; if (audio_alert && progdefaults.enable_audio_alerts && progdefaults.mon_xmt_audio ) { audio_alert->monitor(buffer, len, samplerate, progdefaults.mon_tx_vol / 100.0 ); } if (sig_start) { int num = len / 2; for (int i = 0; i < num; i++) buffer[i] *= (0.5 * (1.0 - cos (M_PI * i / num))); sig_start = false; } if (sig_stop) { int num = len / 2; for (int i = 0; i < num; i++) buffer[len - i - 1] *= (0.5 * (1.0 - cos (M_PI * i / num))); sig_stop = false; } if (progdefaults.PTTrightchannel) { for (int i = 0; i < len; i++) PTTchannel[i] = PTTnco(); ModulateStereo( buffer, PTTchannel, len, false); return; } if (test_signal_window && test_signal_window->visible()) add_noise(buffer, len); if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, buffer, (size_t)len); double mult = pow(10, progStatus.txlevel / 20.0); if (mult > SIGLIMIT) mult = SIGLIMIT; for (int i = 0; i < len; i++) { buffer[i] *= mult; if (buffer[i] < -SIGLIMIT) buffer[i] = -SIGLIMIT; if (buffer[i] > SIGLIMIT) buffer[i] = SIGLIMIT; } try { unsigned n = 4; while (TXscard->Write(buffer, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } void modem::ModulateStereo(double *left, double *right, int len, bool sample_flag) { if (unlikely(!TXscard)) return; if (disable_modem) return; if(sample_flag) tx_sample_count += len; if (test_signal_window && test_signal_window->visible() && progdefaults.noise) add_noise(left, len); if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, left, (size_t)len); double mult = pow(10, progStatus.txlevel / 20.0); if (mult > SIGLIMIT) mult = SIGLIMIT; for (int i = 0; i < len; i++) { if (right[i] < -SIGLIMIT) right[i] = -SIGLIMIT; if (right[i] > SIGLIMIT) right[i] = SIGLIMIT; left[i] *= mult; if (left[i] < -SIGLIMIT) left[i] = -SIGLIMIT; if (left[i] > SIGLIMIT) left[i] = SIGLIMIT; } try { unsigned n = 4; while (TXscard->Write_stereo(left, right, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } //------------------------------------------------------------------------------ // tx process //------------------------------------------------------------------------------ int modem::tx_process () { if (!macro_video_text.empty()) { wfid_text(macro_video_text); macro_video_text.clear(); } if (play_audio) { disable_modem = true; TXscard->Audio(audio_filename); play_audio = false; disable_modem = false; } return 0; } //------------------------------------------------------------------------------ // modulate video signal //------------------------------------------------------------------------------ void modem::ModulateVideoStereo(double *left, double *right, int len, bool sample_flag) { if (unlikely(!TXscard)) return; if(sample_flag) tx_sample_count += len; if (test_signal_window && test_signal_window->visible() && progdefaults.noise) add_noise(left, len); if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, left, (size_t)len); double mult = SIGLIMIT * pow(10, progStatus.txlevel / 20.0); for (int i = 0; i < len; i++) { if (right[i] < -SIGLIMIT) right[i] = -SIGLIMIT; if (right[i] > SIGLIMIT) right[i] = SIGLIMIT; left[i] *= mult; if (left[i] < -SIGLIMIT) left[i] = -SIGLIMIT; if (left[i] > SIGLIMIT) left[i] = SIGLIMIT; } try { unsigned n = 4; while (TXscard->Write_stereo(left, right, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } void modem::ModulateVideo(double *buffer, int len) { if (unlikely(!TXscard)) return; tx_sample_count += len; if (progdefaults.PTTrightchannel) { for (int i = 0; i < len; i++) PTTchannel[i] = PTTnco(); ModulateVideoStereo( buffer, PTTchannel, len, false); return; } if (test_signal_window && test_signal_window->visible() && progdefaults.noise) add_noise(buffer, len); if (progdefaults.viewXmtSignal && !(PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST)) trx_xmit_wfall_queue(samplerate, buffer, (size_t)len); double mult = SIGLIMIT * pow(10, progStatus.txlevel / 20.0); for (int i = 0; i < len; i++) { buffer[i] *= mult; if (buffer[i] < -SIGLIMIT) buffer[i] = -SIGLIMIT; if (buffer[i] > SIGLIMIT) buffer[i] = SIGLIMIT; } try { unsigned n = 4; while (TXscard->Write(buffer, len) == 0 && --n); if (n == 0) throw SndException(-99, "Sound write failed"); } catch (const SndException& e) { if(e.error() < 0) { LOG_ERROR("%s", e.what()); throw; } return; } } //------------------------------------------------------------------------------ void modem::videoText() { if (trx_state == STATE_TUNE) return; if (progdefaults.pretone > 0.2) pretone(); if (progdefaults.sendtextid == true) { wfid_text(progdefaults.strTextid); } else if (progdefaults.macrotextid == true) { wfid_text(progdefaults.strTextid); progdefaults.macrotextid = false; } if (progdefaults.videoid_modes.test(mode) && (progdefaults.sendid || progdefaults.macroid)) { #define TLEN 20 char idtxt[TLEN] = ""; switch(mode_info[mode].mode) { case MODE_CONTESTIA: snprintf(idtxt, TLEN, "%s%d/%d", mode_info[mode].vid_name, 2*(1<(rtty::BAUD[progdefaults.rtty_baud]), rtty::BITS[progdefaults.rtty_bits]); break; case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: if (progdefaults.DOMINOEX_FEC) snprintf(idtxt, TLEN, "%s/FEC", mode_info[mode].vid_name); else strcpy(idtxt, mode_info[mode].vid_name); break; default: strcpy(idtxt, mode_info[mode].vid_name); break; } wfid_text(idtxt); progdefaults.macroid = false; } } // CW ID transmit routines //=========================================================================== // cw transmit routines to send a post amble message // Define the amplitude envelop for key down events // this is 1/2 cycle of a raised cosine //=========================================================================== void modem::cwid_makeshape() { for (int i = 0; i < 128; i++) cwid_keyshape[i] = 1.0; for (int i = 0; i < RT; i++) cwid_keyshape[i] = 0.5 * (1.0 - cos (M_PI * i / RT)); } double modem::cwid_nco(double freq) { cwid_phaseacc += 2.0 * M_PI * freq / samplerate; if (cwid_phaseacc > TWOPI) cwid_phaseacc -= TWOPI; return sin(cwid_phaseacc); } //===================================================================== // cwid_send_symbol() // Sends a part of a morse character (one dot duration) of either // sound at the correct freq or silence. Rise and fall time is controlled // with a raised cosine shape. // // Left channel contains the shaped A2 CW waveform //======================================================================= void modem::cwid_send_symbol(int bits) { double freq; int i, keydown, keyup, sample = 0, currsym = bits & 1; freq = get_txfreq_woffset() - progdefaults.TxOffset; if ((currsym == 1) && (cwid_lastsym == 0)) cwid_phaseacc = 0.0; keydown = cwid_symbollen - RT; keyup = cwid_symbollen - RT; if (currsym == 1) { for (i = 0; i < RT; i++, sample++) { if (cwid_lastsym == 0) outbuf[sample] = cwid_nco(freq) * cwid_keyshape[i]; else outbuf[sample] = cwid_nco(freq); } for (i = 0; i < keydown; i++, sample++) { outbuf[sample] = cwid_nco(freq); } } else { for (i = RT - 1; i >= 0; i--, sample++) { if (cwid_lastsym == 1) { outbuf[sample] = cwid_nco(freq) * cwid_keyshape[i]; } else { outbuf[sample] = 0.0; } } for (i = 0; i < keyup; i++, sample++) { outbuf[sample] = 0.0; } } ModulateXmtr(outbuf, cwid_symbollen); cwid_lastsym = currsym; } //===================================================================== // send_ch() // sends a morse character and the space afterwards //======================================================================= void modem::cwid_send_ch(int ch) { std::string code; // handle word space separately (7 dots spacing) // last char already had 2 elements of inter-character spacing if ((ch == ' ') || (ch == '\n')) { cwid_send_symbol(0); cwid_send_symbol(0); cwid_send_symbol(0); cwid_send_symbol(0); cwid_send_symbol(0); put_echo_char(ch); return; } // convert character code to a morse representation code = morse->tx_lookup(ch); //cw_tx_lookup(ch); if (!code.length()) return; // loop sending out binary bits of cw character for (size_t n = 0; n < code.length(); n++) { cwid_send_symbol(0); cwid_send_symbol(1); if (code[n] == '-') { cwid_send_symbol(1); cwid_send_symbol(1); } } cwid_send_symbol(0); cwid_send_symbol(0); } void modem::cwid_sendtext (const std::string& s) { cwid_symbollen = (int)(1.2 * samplerate / progdefaults.CWIDwpm); RT = (int) (samplerate * 6 / 1000.0); // 6 msec risetime for CW pulse cwid_makeshape(); cwid_lastsym = 0; for (unsigned int i = 0; i < s.length(); i++) { cwid_send_ch(s[i]); } } void modem::cwid() { if ((CW_EOT && progdefaults.cwid_modes.test(mode) && progdefaults.CWid == true) || progdefaults.macroCWid == true) { std::string tosend = " DE "; tosend += progdefaults.myCall; cwid_sendtext(tosend); progdefaults.macroCWid = false; CW_EOT = false; } } //===================================================================== // transmit processing of waterfall video id //===================================================================== static int NUMROWS; static int NUMCOLS; static int TONESPACING; static int IDSYMLEN; static int CHARSPACE; static bool useIDSMALL = true; #define MAXROWS 14 #define MAXIDSYMLEN 16384 #define MAXTONES 128 #define MAXCHARS 10 struct mfntchr { char c; int byte[MAXROWS]; }; extern mfntchr idch1[]; // original id font definition extern mfntchr idch2[]; // extended id font definition static int id_symbols[MAXCHARS]; static C_FIR_filter vidfilt; void modem::wfid_make_tones(int numchars) { double f, flo, fhi; int vwidth = (numchars*NUMCOLS + (numchars-1)*CHARSPACE - 1); f = get_txfreq_woffset() + TONESPACING * vwidth/2.0; fhi = f + TONESPACING; flo = fhi - (vwidth + 2) * TONESPACING; for (int i = 1; i <= NUMCOLS * numchars; i++) { wfid_w[i-1] = f * 2.0 * M_PI / samplerate; f -= TONESPACING; if ( (i > 0) && (i % NUMCOLS == 0) ) f -= TONESPACING * CHARSPACE; } vidfilt.init_bandpass( 1024, 1, flo/samplerate, fhi/samplerate) ; } void modem::wfid_send(int numchars) { int i, j, k; int sym; double val; for (i = 0; i < IDSYMLEN; i++) { val = 0.0; for (k = 0; k < numchars; k++) { sym = id_symbols[numchars - k - 1]; for (j = 0; j < NUMCOLS; j++) { if (sym & 1) val += sin(wfid_w[j + k * NUMCOLS] * i); sym = sym >> 1; } } // soft limit the signal - heuristic formulation val = (1.0 - exp(-fabs(val)/3.0)) * (val >= 0.0 ? 1 : -1); // band pass filter the soft limited signal vidfilt.Irun( val, val ); wfid_outbuf[i] = val; } ModulateVideo(wfid_outbuf, IDSYMLEN); } void modem::wfid_sendchars(std::string s) { int len = s.length(); int n[len]; int c; wfid_make_tones(s.length()); for (int i = 0; i < len; i++) { if (useIDSMALL) { c = toupper(s[i]); if (c > 'Z' || c < ' ') c = ' '; } else { c = s[i]; if (c > '~' || c < ' ') c = ' '; } n[i] = c - ' '; } // send rows from bottom to top so they appear to scroll down the waterfall correctly for (int row = 0; row < NUMROWS; row++) { for (int i = 0; i < len; i++) { if (useIDSMALL) id_symbols[i] = idch1[n[i]].byte[NUMROWS - 1 - row]; else id_symbols[i] = idch2[n[i]].byte[NUMROWS - 1 - row]; } wfid_send(len); if (stopflag) return; } } void modem::pretone() { int sr = get_samplerate(); int symlen = sr / 10; double phaseincr = 2.0 * M_PI * get_txfreq_woffset() / sr; double phase = 0.0; double outbuf[symlen]; for (int j = 0; j < symlen; j++) { outbuf[j] = (0.5 * (1.0 - cos (M_PI * j / symlen)))*sin(phase); phase += phaseincr; if (phase > TWOPI) phase -= TWOPI; } ModulateXmtr(outbuf, symlen); for (int i = 0; i < progdefaults.pretone * 10 - 2; i++) { for (int j = 0; j < symlen; j++) { outbuf[j] = sin(phase); phase += phaseincr; if (phase > TWOPI) phase -= TWOPI; } ModulateXmtr(outbuf, symlen); } for (int j = 0; j < symlen; j++) { outbuf[j] = (0.5 * (1.0 - cos (M_PI * (symlen - j) / symlen)))*sin(phase); phase += phaseincr; if (phase > TWOPI) phase -= TWOPI; } ModulateXmtr(outbuf, symlen); memset(outbuf, 0, symlen * sizeof(*outbuf)); ModulateXmtr(outbuf, symlen); } void modem::wfid_text(const std::string& s) { int len = s.length(); std::string video = "Video text: "; video += s; if (progdefaults.ID_SMALL) { NUMROWS = 7; NUMCOLS = 5; CHARSPACE = 2; vidwidth = progdefaults.videowidth; TONESPACING = 6; IDSYMLEN = 3072; useIDSMALL = true; } else { NUMROWS = 14; NUMCOLS = 8; CHARSPACE = 2; vidwidth = progdefaults.videowidth; TONESPACING = 8; IDSYMLEN = 2560; useIDSMALL = false; } if (progdefaults.vidlimit) { if ((vidwidth * TONESPACING * (NUMCOLS + CHARSPACE)) > 500) vidwidth = 500 / (TONESPACING * (NUMCOLS + CHARSPACE)); } if (progdefaults.vidmodelimit) { if ((vidwidth * TONESPACING * (NUMCOLS + CHARSPACE)) > get_bandwidth()) vidwidth = (int)ceil(get_bandwidth() / (TONESPACING * (NUMCOLS + CHARSPACE))); } put_status(video.c_str()); disable_modem = true; int numlines = 0; std::string tosend; while (numlines < len) numlines += vidwidth; numlines -= vidwidth; while (numlines >= 0) { tosend = s.substr(numlines, vidwidth); wfid_sendchars(tosend); numlines -= vidwidth; if (stopflag) break; } // blank lines for (int i = 0; i < vidwidth; i++) id_symbols[i] = 0; wfid_send(vidwidth); wfid_send(vidwidth); put_status(""); disable_modem = false; } double modem::wfid_outbuf[MAXIDSYMLEN]; double modem::wfid_w[MAXTONES]; mfntchr idch1[] = { { ' ', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }, }, { '!', { 0x00, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00, }, }, { '"', { 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, }, }, { '#', { 0x00, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x00, }, }, { '$', { 0x00, 0x0F, 0x14, 0x0E, 0x05, 0x1E, 0x00, }, }, { '%', { 0x00, 0x19, 0x02, 0x04, 0x08, 0x13, 0x00, }, }, { '&', { 0x00, 0x08, 0x1C, 0x0D, 0x12, 0x0F, 0x00, }, }, { '\'', { 0x00, 0x18, 0x08, 0x10, 0x00, 0x00, 0x00, }, }, { '(', { 0x00, 0x0C, 0x10, 0x10, 0x10, 0x0C, 0x00, }, }, { ')', { 0x00, 0x18, 0x04, 0x04, 0x04, 0x18, 0x00, }, }, { '*', { 0x00, 0x15, 0x0E, 0x1F, 0x0E, 0x15, 0x00, }, }, { '+', { 0x00, 0x00, 0x04, 0x1F, 0x04, 0x00, 0x00, }, }, { ',', { 0x00, 0x00, 0x00, 0x00, 0x18, 0x08, 0x00, }, }, { '-', { 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, }, }, { '.', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, }, }, { '/', { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x00, }, }, { '0', { 0x00, 0x0E, 0x13, 0x15, 0x19, 0x0E, 0x00, }, }, { '1', { 0x00, 0x0C, 0x14, 0x04, 0x04, 0x04, 0x00, }, }, { '2', { 0x00, 0x1C, 0x02, 0x04, 0x08, 0x1F, 0x00, }, }, { '3', { 0x00, 0x1E, 0x01, 0x06, 0x01, 0x1E, 0x00, }, }, { '4', { 0x00, 0x12, 0x12, 0x1F, 0x02, 0x02, 0x00, }, }, { '5', { 0x00, 0x1F, 0x10, 0x1E, 0x01, 0x1E, 0x00, }, }, { '6', { 0x00, 0x0E, 0x10, 0x1E, 0x11, 0x0E, 0x00, }, }, { '7', { 0x00, 0x1F, 0x01, 0x02, 0x04, 0x08, 0x00, }, }, { '8', { 0x00, 0x0E, 0x11, 0x0E, 0x11, 0x0E, 0x00, }, }, { '9', { 0x00, 0x0E, 0x11, 0x0F, 0x01, 0x0E, 0x00, }, }, { ':', { 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, }, }, { ';', { 0x00, 0x18, 0x00, 0x18, 0x08, 0x10, 0x00, }, }, { '<', { 0x00, 0x01, 0x06, 0x18, 0x06, 0x01, 0x00, }, }, { '=', { 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, }, }, { '>', { 0x00, 0x10, 0x0C, 0x03, 0x0C, 0x10, 0x00, }, }, { '?', { 0x00, 0x1C, 0x02, 0x04, 0x00, 0x04, 0x00, }, }, { '@', { 0x00, 0x0E, 0x11, 0x16, 0x10, 0x0F, 0x00, }, }, { 'A', { 0x00, 0x0E, 0x11, 0x1F, 0x11, 0x11, 0x00, }, }, { 'B', { 0x00, 0x1E, 0x09, 0x0E, 0x09, 0x1E, 0x00, }, }, { 'C', { 0x00, 0x0F, 0x10, 0x10, 0x10, 0x0F, 0x00, }, }, { 'D', { 0x00, 0x1E, 0x11, 0x11, 0x11, 0x1E, 0x00, }, }, { 'E', { 0x00, 0x1F, 0x10, 0x1C, 0x10, 0x1F, 0x00, }, }, { 'F', { 0x00, 0x1F, 0x10, 0x1C, 0x10, 0x10, 0x00, }, }, { 'G', { 0x00, 0x0F, 0x10, 0x13, 0x11, 0x0F, 0x00, }, }, { 'H', { 0x00, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x00, }, }, { 'I', { 0x00, 0x1C, 0x08, 0x08, 0x08, 0x1C, 0x00, }, }, { 'J', { 0x00, 0x01, 0x01, 0x01, 0x11, 0x0E, 0x00, }, }, { 'K', { 0x00, 0x11, 0x12, 0x1C, 0x12, 0x11, 0x00, }, }, { 'L', { 0x00, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x00, }, }, { 'M', { 0x00, 0x11, 0x1B, 0x15, 0x11, 0x11, 0x00, }, }, { 'N', { 0x00, 0x11, 0x19, 0x15, 0x13, 0x11, 0x00, }, }, { 'O', { 0x00, 0x0E, 0x11, 0x11, 0x11, 0x0E, 0x00, }, }, { 'P', { 0x00, 0x1E, 0x11, 0x1E, 0x10, 0x10, 0x00, }, }, { 'Q', { 0x00, 0x0E, 0x11, 0x11, 0x15, 0x0E, 0x01, }, }, { 'R', { 0x00, 0x1E, 0x11, 0x1E, 0x12, 0x11, 0x00, }, }, { 'S', { 0x00, 0x0F, 0x10, 0x0E, 0x01, 0x1E, 0x00, }, }, { 'T', { 0x00, 0x1F, 0x04, 0x04, 0x04, 0x04, 0x00, }, }, { 'U', { 0x00, 0x11, 0x11, 0x11, 0x11, 0x0E, 0x00, }, }, { 'V', { 0x00, 0x11, 0x12, 0x14, 0x18, 0x10, 0x00, }, }, { 'W', { 0x00, 0x11, 0x11, 0x15, 0x15, 0x0A, 0x00, }, }, { 'X', { 0x00, 0x11, 0x0A, 0x04, 0x0A, 0x11, 0x00, }, }, { 'Y', { 0x00, 0x11, 0x0A, 0x04, 0x04, 0x04, 0x00, }, }, { 'Z', { 0x00, 0x1F, 0x02, 0x04, 0x08, 0x1F, 0x00, }, }, }; mfntchr idch2[] = { {' ', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'!', { 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00 }, }, {'"', { 0x00, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'#', { 0x00, 0x50, 0x50, 0xF8, 0xF8, 0x50, 0x50, 0xF8, 0xF8, 0x50, 0x50, 0x00, 0x00, 0x00 }, }, {'$', { 0x00, 0x20, 0x20, 0x78, 0xF8, 0xA0, 0xF0, 0x78, 0x28, 0xF8, 0xF0, 0x20, 0x20, 0x00 }, }, {'%', { 0x00, 0x40, 0xE4, 0xE4, 0x4C, 0x18, 0x30, 0x60, 0xC8, 0x9C, 0x9C, 0x88, 0x00, 0x00 }, }, {'&', { 0x00, 0x30, 0x78, 0x48, 0x48, 0x70, 0xF4, 0x8C, 0x88, 0xFC, 0x74, 0x00, 0x00, 0x00 }, }, {'\'', { 0x00, 0x40, 0x40, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'(', { 0x00, 0x00, 0x20, 0x60, 0xC0, 0x80, 0x80, 0x80, 0x80, 0xC0, 0x60, 0x20, 0x00, 0x00 }, }, {')', { 0x00, 0x00, 0x80, 0xC0, 0x60, 0x20, 0x20, 0x20, 0x20, 0x60, 0xC0, 0x80, 0x00, 0x00 }, }, {'*', { 0x00, 0x00, 0x00, 0x10, 0x10, 0xFE, 0x7C, 0x38, 0x6C, 0x44, 0x00, 0x00, 0x00, 0x00 }, }, {'+', { 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00 }, }, {',', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x40, 0xC0, 0x80 }, }, {'-', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'.', { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00 }, }, {'/', { 0x00, 0x08, 0x08, 0x18, 0x10, 0x30, 0x20, 0x60, 0x40, 0xC0, 0x80, 0x80, 0x00, 0x00 }, }, {'0', { 0x00, 0x00, 0x78, 0xFC, 0x8C, 0x9C, 0xB4, 0xE4, 0xC4, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'1', { 0x00, 0x00, 0x10, 0x30, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00 }, }, {'2', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0xFC, 0x00, 0x00 }, }, {'3', { 0x00, 0x00, 0xFC, 0xFC, 0x04, 0x0C, 0x18, 0x1C, 0x04, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'4', { 0x00, 0x00, 0x38, 0x78, 0x48, 0xC8, 0x88, 0xFC, 0xFC, 0x08, 0x08, 0x08, 0x00, 0x00 }, }, {'5', { 0x00, 0x00, 0xFC, 0xFC, 0x80, 0x80, 0xF8, 0xFC, 0x04, 0x04, 0xFC, 0xF8, 0x00, 0x00 }, }, {'6', { 0x00, 0x00, 0x78, 0xF8, 0x80, 0x80, 0xF8, 0xFC, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'7', { 0x00, 0x00, 0xFC, 0xFC, 0x04, 0x04, 0x0C, 0x18, 0x30, 0x20, 0x20, 0x20, 0x00, 0x00 }, }, {'8', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0x78, 0xFC, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'9', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0xFC, 0x7C, 0x04, 0x04, 0x7C, 0x78, 0x00, 0x00 }, }, {':', { 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00 }, }, {';', { 0x00, 0x60, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0x20, 0x20, 0xE0, 0xC0, 0x00, 0x00 }, }, {'<', { 0x00, 0x00, 0x08, 0x18, 0x30, 0x60, 0xC0, 0xC0, 0x60, 0x30, 0x18, 0x08, 0x00, 0x00 }, }, {'=', { 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00 }, }, {'>', { 0x00, 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, 0x00 }, }, {'?', { 0x00, 0x00, 0x70, 0xF8, 0x88, 0x08, 0x18, 0x30, 0x20, 0x00, 0x20, 0x20, 0x00, 0x00 }, }, {'@', { 0x00, 0x00, 0x7C, 0xFE, 0x82, 0x82, 0xB2, 0xBE, 0xBC, 0x80, 0xFC, 0x7C, 0x00, 0x00 }, }, {'A', { 0x00, 0x00, 0x30, 0x78, 0xCC, 0x84, 0x84, 0xFC, 0xFC, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'B', { 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xF8, 0xF8, 0x84, 0x84, 0xFC, 0xF8, 0x00, 0x00 }, }, {'C', { 0x00, 0x00, 0x38, 0x7C, 0xC4, 0x80, 0x80, 0x80, 0x80, 0xC4, 0x7C, 0x38, 0x00, 0x00 }, }, {'D', { 0x00, 0x00, 0xF0, 0xF8, 0x8C, 0x84, 0x84, 0x84, 0x84, 0x8C, 0xF8, 0xF0, 0x00, 0x00 }, }, {'E', { 0x00, 0x00, 0xFC, 0xFC, 0x80, 0x80, 0xF0, 0xF0, 0x80, 0x80, 0xFC, 0xFC, 0x00, 0x00 }, }, {'F', { 0x00, 0x00, 0xFC, 0xFC, 0x80, 0x80, 0xF0, 0xF0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }, }, {'G', { 0x00, 0x00, 0x3C, 0x7C, 0xC0, 0x80, 0x8C, 0x8C, 0x84, 0xC4, 0x7C, 0x38, 0x00, 0x00 }, }, {'H', { 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0xFC, 0xFC, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'I', { 0x00, 0x00, 0xF8, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00 }, }, {'J', { 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'K', { 0x00, 0x00, 0x84, 0x84, 0x8C, 0x98, 0xF0, 0xF0, 0x98, 0x8C, 0x84, 0x84, 0x00, 0x00 }, }, {'L', { 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFC, 0xFC, 0x00, 0x00 }, }, {'M', { 0x00, 0x00, 0x82, 0xC6, 0xEE, 0xBA, 0x92, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00 }, }, {'N', { 0x00, 0x00, 0x84, 0xC4, 0xE4, 0xB4, 0x9C, 0x8C, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'O', { 0x00, 0x00, 0x30, 0x78, 0xCC, 0x84, 0x84, 0x84, 0x84, 0xCC, 0x78, 0x30, 0x00, 0x00 }, }, {'P', { 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xFC, 0xF8, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }, }, {'Q', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0x84, 0x84, 0x94, 0x94, 0xFC, 0x78, 0x08, 0x08 }, }, {'R', { 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xFC, 0xF8, 0x88, 0x8C, 0x84, 0x84, 0x00, 0x00 }, }, {'S', { 0x00, 0x00, 0x78, 0xFC, 0x84, 0x80, 0xF8, 0x7C, 0x04, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'T', { 0x00, 0x00, 0xF8, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00 }, }, {'U', { 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'V', { 0x00, 0x00, 0x82, 0x82, 0x82, 0xC6, 0x44, 0x6C, 0x28, 0x38, 0x10, 0x10, 0x00, 0x00 }, }, {'W', { 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x92, 0x92, 0x92, 0xFE, 0x6C, 0x00, 0x00 }, }, {'X', { 0x00, 0x00, 0x82, 0x82, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x82, 0x82, 0x00, 0x00 }, }, {'Y', { 0x00, 0x00, 0x82, 0x82, 0xC6, 0x6C, 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00 }, }, {'Z', { 0x00, 0x00, 0xFC, 0xFC, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0xFC, 0xFC, 0x00, 0x00 }, }, {'[', { 0x00, 0x00, 0xE0, 0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0xE0, 0x00, 0x00 }, }, {'\\', { 0x00, 0x80, 0x80, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x10, 0x18, 0x08, 0x08, 0x00, 0x00 }, }, {']', { 0x00, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xE0, 0xE0, 0x00, 0x00 }, }, {'^', { 0x00, 0x20, 0x20, 0x70, 0x50, 0xD8, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'_', { 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00 }, }, {'`', { 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }, {'a', { 0x00, 0x00, 0x00, 0x00, 0x78, 0x7C, 0x04, 0x7C, 0xFC, 0x84, 0xFC, 0x7C, 0x00, 0x00 }, }, {'b', { 0x00, 0x00, 0x80, 0x80, 0xB8, 0xFC, 0xC4, 0x84, 0x84, 0x84, 0xFC, 0xF8, 0x00, 0x00 }, }, {'c', { 0x00, 0x00, 0x00, 0x00, 0x78, 0xF8, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x78, 0x00, 0x00 }, }, {'d', { 0x00, 0x00, 0x04, 0x04, 0x74, 0xFC, 0x8C, 0x84, 0x84, 0x84, 0xFC, 0x7C, 0x00, 0x00 }, }, {'e', { 0x00, 0x00, 0x00, 0x00, 0x78, 0xFC, 0x84, 0xFC, 0xFC, 0x80, 0xF8, 0x78, 0x00, 0x00 }, }, {'f', { 0x00, 0x00, 0x3C, 0x7C, 0x40, 0x40, 0xF8, 0xF8, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00 }, }, {'g', { 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x04, 0x7C, 0x78, 0x00 }, }, {'h', { 0x00, 0x00, 0x80, 0x80, 0xB8, 0xFC, 0xC4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'i', { 0x00, 0x20, 0x20, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00 }, }, {'j', { 0x00, 0x08, 0x08, 0x00, 0x38, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF8, 0x70 }, }, {'k', { 0x00, 0x00, 0x80, 0x88, 0x98, 0xB0, 0xE0, 0xE0, 0xB0, 0x98, 0x88, 0x88, 0x00, 0x00 }, }, {'l', { 0x00, 0x00, 0xE0, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0xF8, 0x00, 0x00 }, }, {'m', { 0x00, 0x00, 0x00, 0x00, 0xEC, 0xFE, 0x92, 0x92, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00 }, }, {'n', { 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFC, 0xC4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00 }, }, {'o', { 0x00, 0x00, 0x00, 0x00, 0x78, 0xFC, 0x84, 0x84, 0x84, 0x84, 0xFC, 0x78, 0x00, 0x00 }, }, {'p', { 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0x84, 0x84, 0xC4, 0xFC, 0xB8, 0x80, 0x80, 0x80 }, }, {'q', { 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x04, 0x04, 0x04 }, }, {'r', { 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFC, 0xC4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00 }, }, {'s', { 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFC, 0x80, 0xF8, 0x7C, 0x04, 0xFC, 0xF8, 0x00, 0x00 }, }, {'t', { 0x00, 0x00, 0x40, 0x40, 0xF0, 0xF0, 0x40, 0x40, 0x40, 0x40, 0x78, 0x38, 0x00, 0x00 }, }, {'u', { 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x00, 0x00 }, }, {'v', { 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0xC6, 0x6C, 0x38, 0x10, 0x00, 0x00 }, }, {'w', { 0x00, 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x92, 0x92, 0x92, 0xFE, 0x6C, 0x00, 0x00 }, }, {'x', { 0x00, 0x00, 0x00, 0x00, 0x82, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x82, 0x00, 0x00 }, }, {'y', { 0x00, 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x8C, 0xFC, 0x74, 0x04, 0x7C, 0x78 }, }, {'z', { 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0xFC, 0x00, 0x00 }, }, {'{', { 0x00, 0x20, 0x60, 0x40, 0x40, 0x40, 0xC0, 0xC0, 0x40, 0x40, 0x40, 0x60, 0x20, 0x00 }, }, {'|', { 0x00, 0x80, 0x80, 0xC0, 0x40, 0x60, 0x20, 0x30, 0x10, 0x18, 0x08, 0x08, 0x00, 0x00 }, }, {'}', { 0x00, 0x80, 0xC0, 0x40, 0x40, 0x40, 0x60, 0x60, 0x40, 0x40, 0x40, 0xC0, 0x80, 0x00 }, }, {'~', { 0x00, 0x98, 0xFC, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }; fldigi-4.2.05/src/trx/trx.cxx0000664000175000017500000006656014611711171012745 00000000000000// ---------------------------------------------------------------------------- // trx.cxx -- Main transmit/receive control loop / thread // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "trx.h" #include "main.h" #include "fl_digi.h" #include "ascii.h" #include "misc.h" #include "configuration.h" #include "status.h" #include "squelch_status.h" #include "dtmf.h" #include "soundconf.h" #include "ringbuffer.h" #include "qrunner.h" #include "debug.h" #include "nullmodem.h" #include "macros.h" #include "rigsupport.h" #include "psm/psm.h" #include "icons.h" #include "fft-monitor.h" #include "audio_alert.h" extern fftmon *fft_modem; #include "spectrum_viewer.h" #if BENCHMARK_MODE # include "benchmark.h" #endif LOG_FILE_SOURCE(debug::LOG_MODEM); void trx_reset_loop(); void trx_start_modem_loop(); void trx_receive_loop(); void trx_transmit_loop(); void trx_tune_loop(); static void trx_signal_state(void); //#define DEBUG /* ---------------------------------------------------------------------- */ static sem_t* trx_sem; static pthread_t trx_thread; state_t trx_state; modem *active_modem = 0; cRsId *ReedSolomon = 0; cDTMF *dtmf = 0; SoundBase *RXscard = 0; bool RXsc_is_open = false; bool TXsc_is_open = false; SoundBase *TXscard = 0; static int current_RXsamplerate = 0; static int current_TXsamplerate = 0; static int _trx_tune; // Ringbuffer for the audio "history". A pointer into this buffer // is also passed to the waterfall signal drawing routines. #define NUMMEMBUFS 1024 static ringbuffer trxrb(ceil2(NUMMEMBUFS * SCBLOCKSIZE)); static float fbuf[SCBLOCKSIZE]; bool bHistory = false; bool bHighSpeed = false; static double hsbuff[SCBLOCKSIZE]; static bool trxrunning = false; extern bool trx_inhibit; bool rx_only = false; #include "tune.cxx" //============================================================================= // Draws the xmit data one WF_BLOCKSIZE-sized block at a time static void trx_xmit_wfall_draw(int samplerate) { ENSURE_THREAD(TRX_TID); ringbuffer::vector_type rv[2]; rv[0].buf = 0; rv[1].buf = 0; #define block_read_(vec_) \ while (vec_.len >= WF_BLOCKSIZE) { \ wf->sig_data(vec_.buf, WF_BLOCKSIZE); \ REQ(&waterfall::handle_sig_data, wf); \ vec_.len -= WF_BLOCKSIZE; \ vec_.buf += WF_BLOCKSIZE; \ trxrb.read_advance(WF_BLOCKSIZE); \ } trxrb.get_rv(rv); block_read_(rv[0]); // read blocks from the first vector if (rv[0].len + rv[1].len < WF_BLOCKSIZE) return; if (rv[0].len == 0) block_read_(rv[1]); #undef block_read_ // read non-contiguous data into tmp buffer so that we can // still draw it one block at a time if (unlikely(trxrb.read_space() >= WF_BLOCKSIZE)) { double buf[WF_BLOCKSIZE]; do { trxrb.read(buf, WF_BLOCKSIZE); wf->sig_data(buf, WF_BLOCKSIZE); REQ(&waterfall::handle_sig_data, wf); } while (trxrb.read_space() >= WF_BLOCKSIZE); } } // Called by trx_trx_transmit_loop() to handle data that may be left in the // ringbuffer when we stop transmitting. Will pad with zeroes to a multiple of // WF_BLOCKSIZE. static void trx_xmit_wfall_end(int samplerate) { ENSURE_THREAD(TRX_TID); size_t pad = WF_BLOCKSIZE - trxrb.read_space() % WF_BLOCKSIZE; if (pad == WF_BLOCKSIZE) // rb empty or multiple of WF_BLOCKSIZE return; ringbuffer::vector_type wv[2]; wv[0].buf = wv[1].buf = 0; trxrb.get_wv(wv, pad); assert(wv[0].len + wv[1].len == pad); if (likely(wv[0].len)) { // fill first vector, write rest to second vector memset(wv[0].buf, 0, wv[0].len * sizeof(*wv[0].buf)); if (pad > wv[0].len) memset(wv[1].buf, 0, (pad - wv[0].len) * sizeof(*wv[1].buf)); } else // all write space is in the second write vector memset(wv[1].buf, 0, pad * sizeof(*wv[1].buf)); trxrb.write_advance(pad); trx_xmit_wfall_draw(samplerate); } // Copy buf to the ringbuffer if it has enough space. Queue a waterfall // request whenever there are at least WF_BLOCKSIZE samples to draw. void trx_xmit_wfall_queue(int samplerate, const double* buf, size_t len) { ENSURE_THREAD(TRX_TID); if (fft_modem && spectrum_viewer->visible()) fft_modem->rx_process(buf, len); ringbuffer::vector_type wv[2]; wv[0].buf = wv[1].buf = 0; trxrb.get_wv(wv, len); if (unlikely(wv[0].len + wv[1].len < len)) // not enough space return; size_t n = MIN(wv[0].len, len); for (size_t i = 0; i < n; i++) wv[0].buf[i] = buf[i] * progdefaults.TxMonitorLevel; if (len > n) { // write the remainder to the second vector buf += n; n = len - n; for (size_t i = 0; i < n; i++) wv[1].buf[i] = buf[i] * progdefaults.TxMonitorLevel; } trxrb.write_advance(len); if (trxrb.read_space() >= WF_BLOCKSIZE) trx_xmit_wfall_draw(samplerate); } //============================================================================= void audio_select_failure(std::string errmsg) { progdefaults.btnAudioIOis = SND_IDX_NULL; // file i/o sound_update(progdefaults.btnAudioIOis); btnAudioIO[0]->value(0); btnAudioIO[1]->value(0); btnAudioIO[2]->value(0); btnAudioIO[3]->value(1); delete RXscard; RXscard = 0; fl_alert2("Could not open audio device: %s\nCheck for h/w connection, and restart fldigi", errmsg.c_str()); } void trx_trx_receive_loop() { size_t numread; assert(powerof2(SCBLOCKSIZE)); if (unlikely(!active_modem)) { MilliSleep(10); return; } #if BENCHMARK_MODE do_benchmark(); trx_state = STATE_ENDED; return; #endif if (!RXscard) { MilliSleep(10); return; } try { if (!progdefaults.is_full_duplex || !RXsc_is_open || current_RXsamplerate != active_modem->get_samplerate() ) { current_RXsamplerate = active_modem->get_samplerate(); if (RXscard) { RXscard->Close(O_RDONLY); RXscard->Open(O_RDONLY, current_RXsamplerate); REQ(sound_update, progdefaults.btnAudioIOis); RXsc_is_open = true; } } } catch (const SndException& e) { LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 5); if (RXscard) RXscard->Close(); RXsc_is_open = false; current_RXsamplerate = 0; if (progdefaults.btnAudioIOis == SND_IDX_PORT) { sound_close(); sound_init(); } REQ(audio_select_failure, e.what()); MilliSleep(100); return; } active_modem->rx_init(); ringbuffer::vector_type rbvec[2]; rbvec[0].buf = rbvec[1].buf = 0; if (RXscard) RXscard->flush(O_RDONLY); while (1) { try { numread = 0; if (current_RXsamplerate != active_modem->get_samplerate() ) { current_RXsamplerate = active_modem->get_samplerate(); if (RXscard) { RXscard->Close(O_RDONLY); RXscard->Open(O_RDONLY, current_RXsamplerate); REQ(sound_update, progdefaults.btnAudioIOis); RXsc_is_open = true; } } if (RXscard) { while (numread < SCBLOCKSIZE && trx_state == STATE_RX) numread += RXscard->Read(fbuf + numread, SCBLOCKSIZE - numread); } if (numread > SCBLOCKSIZE) { LOG_ERROR("numread error %lu", (unsigned long) numread); numread = SCBLOCKSIZE; } if (bHighSpeed) { for (size_t i = 0; i < numread; i++) hsbuff[i] = fbuf[i]; } else { if (trxrb.write_space() == 0) // diRXscard some old data trxrb.read_advance(SCBLOCKSIZE); size_t room = trxrb.get_wv(rbvec, numread); if (room < numread) { LOG_ERROR("trxrb.get_wv(rbvec) = %d, numread = %d", (int)room, (int)numread); } else { // convert to double and write to rb for (size_t i = 0; i < numread; i++) rbvec[0].buf[i] = fbuf[i]; } } } catch (const SndException& e) { if (RXscard) RXscard->Close(); RXsc_is_open = false; LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 5); MilliSleep(10); return; } if (trx_state != STATE_RX) break; if (bHighSpeed) { bool afc = progStatus.afconoff; progStatus.afconoff = false; QRUNNER_DROP(true); if (progdefaults.rsid) ReedSolomon->receive(fbuf, numread); else if (active_modem->get_mode() == MODE_OFDM_500F || active_modem->get_mode() == MODE_OFDM_750F) // || active_modem->get_mode() == MODE_OFDM_2000F) ReedSolomon->receive(fbuf, numread); // OFDM modes use RSID as AFC mechanism. Force RxRSID. active_modem->HistoryON(true); active_modem->rx_process(hsbuff, numread); QRUNNER_DROP(false); progStatus.afconoff = afc; active_modem->HistoryON(false); } else { trxrb.write_advance(numread); wf->sig_data(rbvec[0].buf, numread); if (!trx_inhibit) REQ(&waterfall::handle_sig_data, wf); if (!bHistory) { if (fft_modem && spectrum_viewer->visible()) fft_modem->rx_process(rbvec[0].buf, numread); active_modem->rx_process(rbvec[0].buf, numread); if (audio_alert && progdefaults.mon_xcvr_audio) { audio_alert->monitor( rbvec[0].buf, numread, current_RXsamplerate, (progdefaults.RxFilt_vol / (progdefaults.rxgain_x10 ? 10.0 : 100.0))); } if (progdefaults.rsid) ReedSolomon->receive(fbuf, numread); else if (active_modem->get_mode() == MODE_OFDM_500F || active_modem->get_mode() == MODE_OFDM_750F) // || active_modem->get_mode() == MODE_OFDM_2000F) ReedSolomon->receive(fbuf, numread); // OFDM modes use RSID as AFC mechanism. Force RxRSID. dtmf->receive(fbuf, numread); } else { bool afc = progStatus.afconoff; progStatus.afconoff = false; QRUNNER_DROP(true); active_modem->HistoryON(true); trxrb.get_rv(rbvec); if (rbvec[0].len) active_modem->rx_process(rbvec[0].buf, rbvec[0].len); if (rbvec[1].len) active_modem->rx_process(rbvec[1].buf, rbvec[1].len); QRUNNER_DROP(false); progStatus.afconoff = afc; bHistory = false; active_modem->HistoryON(false); } } } if (trx_state == STATE_RESTART) return; if (!progdefaults.is_full_duplex ) { if (RXscard) RXscard->Close(O_RDONLY); RXsc_is_open = false; } } //============================================================================= void trx_trx_transmit_loop() { if (rx_only) return; if (!TXscard) { MilliSleep(10); return; } if (active_modem) { try { if (current_TXsamplerate != active_modem->get_samplerate() || !TXsc_is_open) { current_TXsamplerate = active_modem->get_samplerate(); if (TXscard) { TXscard->Close(O_WRONLY); TXscard->Open(O_WRONLY, current_TXsamplerate); TXsc_is_open = true; } } } catch (const SndException& e) { LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 1); current_TXsamplerate = 0; MilliSleep(10); return; } if ((active_modem != ssb_modem) && (active_modem != anal_modem) && !active_modem->XMLRPC_CPS_TEST && !PERFORM_CPS_TEST ) { push2talk->set(true); REQ(&waterfall::set_XmtRcvBtn, wf, true); } active_modem->tx_init(); bool _txrsid = false; if ( ReedSolomon->assigned(active_modem->get_mode()) && (progdefaults.TransmitRSid || progStatus.n_rsids != 0)) _txrsid = true; else if (ReedSolomon->assigned(active_modem->get_mode()) && (active_modem->get_mode() == MODE_OFDM_500F || active_modem->get_mode() == MODE_OFDM_750F)) // || active_modem->get_mode() == MODE_OFDM_2000F) ) _txrsid = true; // RSID is used as header/preamble for OFDM modes. Make mandatory. if (_txrsid) { if (progStatus.n_rsids < 0) { for (int i = 0; i > progStatus.n_rsids; i--) { ReedSolomon->send(true); MilliSleep(200); } } else if ( progStatus.n_rsids > 0 ) { for (int i = 0; i < progStatus.n_rsids; i++) { ReedSolomon->send(true); MilliSleep(200); } MilliSleep(200); if (progStatus.n_rsids == 1) progStatus.n_rsids = 0; } else ReedSolomon->send(true); } if (progStatus.n_rsids >= 0) { active_modem->tx_sample_count = 0; active_modem->tx_sample_rate = active_modem->get_samplerate(); while (trx_state == STATE_TX) { try { if (!progdefaults.DTMFstr.empty()) dtmf->send(); if (active_modem->tx_process() < 0) { active_modem->cwid(); if (trx_state != STATE_ABORT) trx_state = STATE_RX; } } catch (const SndException& e) { if (TXscard) TXscard->Close(); TXsc_is_open = false; LOG_ERROR("%s", e.what()); put_status(e.what(), 5); current_TXsamplerate = 0; MilliSleep(10); return; } } } else if (trx_state != STATE_ABORT && trx_state != STATE_RESTART) trx_state = STATE_RX; if (ReedSolomon->assigned(active_modem->get_mode()) && progdefaults.rsid_eot_squelch && // test for RsID_EOT progdefaults.TransmitRSid && progStatus.n_rsids >= 0) ReedSolomon->send_eot(); if (ReedSolomon->assigned(active_modem->get_mode()) && progdefaults.TransmitRSid && progdefaults.rsid_post && progStatus.n_rsids >= 0) ReedSolomon->send(false); progStatus.n_rsids = 0; trx_xmit_wfall_end(current_TXsamplerate); if (TXscard) TXscard->flush(); if (trx_state == STATE_RX) { if (!progdefaults.is_full_duplex) { if (TXscard) TXscard->Close(O_WRONLY); TXsc_is_open = false; } } } else MilliSleep(10); push2talk->set(false); REQ(&waterfall::set_XmtRcvBtn, wf, false); psm_transmit_ended(PSM_STOP); if (progStatus.timer) REQ(startMacroTimer); WriteARQ(0x06); } //============================================================================= void trx_tune_loop() { if (rx_only) return; if (!TXscard) { MilliSleep(10); return; } if (active_modem) { try { if (!progdefaults.is_full_duplex || !TXsc_is_open || current_TXsamplerate != active_modem->get_samplerate() ) { current_TXsamplerate = active_modem->get_samplerate(); if (TXscard) TXscard->Close(O_WRONLY); if (TXscard) { TXscard->Open(O_WRONLY, current_TXsamplerate); TXsc_is_open = true; } } } catch (const SndException& e) { LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 1); MilliSleep(10); current_TXsamplerate = 0; return; } push2talk->set(true); active_modem->tx_init(); try { if (active_modem->get_mode() == MODE_CW && (use_nanoIO || progStatus.WK_online || progdefaults.CW_KEYLINE_on_cat_port || CW_KEYLINE_isopen)) { if (CW_KEYLINE_isopen || progdefaults.CW_KEYLINE_on_cat_port) active_modem->CW_KEYLINE(1); else if (use_nanoIO) nanoCW_tune(1); else WK_tune(1); cwio_ptt(1); cwio_key(1); REQ(&waterfall::set_XmtRcvBtn, wf, true); while (trx_state == STATE_TUNE) MilliSleep(10); if (CW_KEYLINE_isopen) active_modem->CW_KEYLINE(0); else if (use_nanoIO) nanoCW_tune(0); else WK_tune(0); cwio_key(0); cwio_ptt(0); } else { while (trx_state == STATE_TUNE) { if (_trx_tune == 0) { REQ(&waterfall::set_XmtRcvBtn, wf, true); xmttune::keydown(active_modem->get_txfreq_woffset(), TXscard); _trx_tune = 1; } else xmttune::tune(active_modem->get_txfreq_woffset(), TXscard); } xmttune::keyup(active_modem->get_txfreq_woffset(), TXscard); } } catch (const SndException& e) { if (TXscard) TXscard->Close(); TXsc_is_open = false; LOG_ERROR("%s. line: %i", e.what(), __LINE__); put_status(e.what(), 5); MilliSleep(10); current_TXsamplerate = 0; return; } if (TXscard) TXscard->flush(); if (trx_state == STATE_RX) { if (!progdefaults.is_full_duplex) { if (TXscard) TXscard->Close(O_WRONLY); TXsc_is_open = false; } } _trx_tune = 0; } else MilliSleep(10); push2talk->set(false); REQ(&waterfall::set_XmtRcvBtn, wf, false); } //============================================================================= void *trx_loop(void *args) { SET_THREAD_ID(TRX_TID); state_t old_state = STATE_NOOP; for (;;) { if (unlikely(old_state != trx_state)) { old_state = trx_state; if (trx_state == STATE_TX || trx_state == STATE_TUNE) trxrb.reset(); trx_signal_state(); } LOG_DEBUG("trx state %s", trx_state == STATE_ABORT ? "abort" : trx_state == STATE_ENDED ? "ended" : trx_state == STATE_RESTART ? "restart" : trx_state == STATE_NEW_MODEM ? "new modem" : trx_state == STATE_TX ? "tx" : trx_state == STATE_TUNE ? "tune" : trx_state == STATE_RX ? "rx" : "unknown"); switch (trx_state) { case STATE_ABORT: delete RXscard; RXscard = 0; delete TXscard; TXscard = 0; trx_state = STATE_ENDED; // fall through case STATE_ENDED: REQ(set_flrig_ptt, 0); stop_deadman(); return 0; case STATE_RESTART: REQ(set_flrig_ptt, 0); stop_deadman(); trx_reset_loop(); break; case STATE_NEW_MODEM: REQ(set_flrig_ptt, 0); trx_start_modem_loop(); break; case STATE_TX: REQ(set_flrig_ptt, 1); start_deadman(); trx_trx_transmit_loop(); break; case STATE_TUNE: REQ(set_flrig_ptt, 1); start_deadman(); trx_tune_loop(); break; case STATE_RX: REQ(set_flrig_ptt, 0); stop_deadman(); trx_trx_receive_loop(); break; default: LOG(debug::ERROR_LEVEL, debug::LOG_MODEM, "trx in bad state %d\n", trx_state); MilliSleep(100); } } } //============================================================================= static modem* new_modem; static int new_freq; void trx_start_modem_loop() { if (new_modem == active_modem) { if (new_freq > 0 && !progdefaults.retain_freq_lock) active_modem->set_freq(new_freq); else if (new_freq > 0 && (active_modem->get_mode() == MODE_OFDM_500F || active_modem->get_mode() == MODE_OFDM_750F)) // || active_modem->get_mode() == MODE_OFDM_2000F // || active_modem->get_mode() == MODE_OFDM_2000)) active_modem->set_freq(new_freq); // OFDM modes use RSID as AFC mechanism. Always allow QSY of Rx Frequency. active_modem->restart(); trx_state = STATE_RX; if (progdefaults.show_psm_btn && progStatus.kpsql_enabled && progStatus.psm_use_histogram) psm_reset_histogram(); return; } modem* old_modem = active_modem; new_modem->init(); active_modem = new_modem; if (new_freq > 0 && !progdefaults.retain_freq_lock) active_modem->set_freq(new_freq); else if (new_freq > 0 && (active_modem->get_mode() == MODE_OFDM_500F || active_modem->get_mode() == MODE_OFDM_750F)) // || active_modem->get_mode() == MODE_OFDM_2000F // || active_modem->get_mode() == MODE_OFDM_2000)) active_modem->set_freq(new_freq); // OFDM modes use RSID as AFC mechanism. Always allow QSY of Rx Frequency. trx_state = STATE_RX; REQ(&waterfall::opmode, wf); REQ(set599); modeband.band_mode_change(); if (old_modem) { *mode_info[old_modem->get_mode()].modem = 0; delete old_modem; } } //============================================================================= void trx_start_modem(modem* m, int f) { new_modem = m; new_freq = f; trx_state = STATE_NEW_MODEM; } //============================================================================= static std::string reset_loop_msg; void show_reset_loop_alert() { // if (btnAudioIO[0]) { btnAudioIO[0]->value(0); btnAudioIO[1]->value(0); btnAudioIO[2]->value(0); btnAudioIO[3]->value(1); fl_alert2("%s", reset_loop_msg.c_str()); // } } void trx_reset_loop() { if (RXscard) { RXscard->Close(); RXsc_is_open = false; delete RXscard; RXscard = 0; } if (TXscard) { TXscard->Close(); TXsc_is_open = false; delete TXscard; TXscard = 0; } switch (progdefaults.btnAudioIOis) { #if USE_OSS case SND_IDX_OSS: try { RXscard = new SoundOSS(scDevice[0].c_str()); if (!RXscard) break; RXscard->Open(O_RDONLY, current_RXsamplerate = 8000); RXsc_is_open = true; TXscard = new SoundOSS(scDevice[0].c_str()); if (!TXscard) break; TXscard->Open(O_WRONLY, current_TXsamplerate = 8000); TXsc_is_open = true; } catch (...) { reset_loop_msg = "OSS open failure"; progdefaults.btnAudioIOis = SND_IDX_NULL; // file i/o sound_update(progdefaults.btnAudioIOis); REQ(show_reset_loop_alert); } break; #endif #if USE_PORTAUDIO /// All of this very convoluted logic is needed to allow a Linux user /// to switch from PulseAudio to PortAudio. PulseAudio does not immediately /// release the sound card resources after closing the pulse audio object. case SND_IDX_PORT: { RXscard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); TXscard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); unsigned long tm1 = zmsec(); int RXret = 0, TXret = 0; int i; RXsc_is_open = false; TXsc_is_open = false; for (i = 0; i < 10; i++) { // try 10 times try { if (!RXret) RXret = RXscard->Open(O_RDONLY, current_RXsamplerate = 8000); if (progdefaults.is_full_duplex) { if (!TXret) TXret = TXscard->Open(O_WRONLY, current_TXsamplerate = 8000); } if (RXret) RXsc_is_open = true; if (TXret) TXsc_is_open = true; break; } catch (const SndException& e) { MilliSleep(50); Fl::awake(); } } unsigned long tm = zmsec() - tm1; if (tm < 0) tm = 0; if (i == 10) { if (RXscard) delete RXscard; if (TXscard) delete TXscard; RXscard = 0; TXscard = 0; LOG_PERROR("Port Audio device not available"); reset_loop_msg = "Port Audio device not available"; progdefaults.btnAudioIOis = SND_IDX_NULL; // file i/o sound_update(progdefaults.btnAudioIOis); REQ(show_reset_loop_alert); } else { LOG_INFO ("Port Audio device available after %0.1f seconds", tm / 1000.0 ); } break; } #endif #if USE_PULSEAUDIO case SND_IDX_PULSE: try { RXscard = new SoundPulse(scDevice[0].c_str()); if (!RXscard) break; RXscard->Open(O_RDONLY, current_RXsamplerate = 8000); RXsc_is_open = true; TXscard = new SoundPulse(scDevice[0].c_str()); if (!TXscard) break; // needed to open playback device in PaVolumeControl TXscard->Open(O_WRONLY, current_TXsamplerate = 8000); double buffer[1024]; for (int i = 0; i < 1024; buffer[i++] = 0); TXscard->Write_stereo(buffer, buffer, 1024); if (progdefaults.is_full_duplex) TXsc_is_open = true; else { TXscard->Close(); TXsc_is_open = false; } } catch (const SndException& e) { LOG_ERROR("%s", e.what()); if (RXscard) delete RXscard; if (TXscard) delete TXscard; RXscard = 0; TXscard = 0; reset_loop_msg = "Pulse Audio error:\n"; reset_loop_msg.append(e.what()); reset_loop_msg.append("\n\nIs the server running?\nClose fldigi and execute 'pulseaudio --start'"); progdefaults.btnAudioIOis = SND_IDX_NULL; // file i/o sound_update(progdefaults.btnAudioIOis); REQ(show_reset_loop_alert); } break; #endif case SND_IDX_NULL: RXscard = new SoundNull; TXscard = new SoundNull; current_RXsamplerate = current_TXsamplerate = 0; break; default: abort(); } trx_state = STATE_RX; } //============================================================================= void trx_reset(void) { trx_state = STATE_RESTART; } //============================================================================= void trx_start(void) { #if !BENCHMARK_MODE if (trxrunning) { LOG(debug::ERROR_LEVEL, debug::LOG_MODEM, "trx already running!"); return; } if (RXscard) { delete RXscard; RXscard = 0; } if (TXscard) { delete TXscard; TXscard = 0; } if (ReedSolomon) delete ReedSolomon; if (dtmf) delete dtmf; switch (progdefaults.btnAudioIOis) { #if USE_OSS case SND_IDX_OSS: RXscard = new SoundOSS(scDevice[0].c_str()); TXscard = new SoundOSS(scDevice[0].c_str()); break; #endif #if USE_PORTAUDIO case SND_IDX_PORT: RXscard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); TXscard = new SoundPort(scDevice[0].c_str(), scDevice[1].c_str()); break; #endif #if USE_PULSEAUDIO case SND_IDX_PULSE: try { RXscard = new SoundPulse(scDevice[0].c_str()); if (!RXscard) break; TXscard = new SoundPulse(scDevice[0].c_str()); if (!TXscard) break; // needed to open playback device in PaVolumeControl TXscard->Open(O_WRONLY, current_TXsamplerate = 8000); double buffer[1024]; for (int i = 0; i < 1024; buffer[i++] = 0); TXscard->Write_stereo(buffer, buffer, 1024); if (progdefaults.is_full_duplex) TXsc_is_open = true; else { TXscard->Close(); TXsc_is_open = false; } } catch (const SndException& e) { LOG_ERROR("%s", e.what()); if (RXscard) delete RXscard; if (TXscard) delete TXscard; RXscard = 0; TXscard = 0; reset_loop_msg = "Pulse Audio error:\n"; reset_loop_msg.append(e.what()); reset_loop_msg.append("\n\nIs the server running?"); progdefaults.btnAudioIOis = SND_IDX_NULL; // file i/o sound_update(progdefaults.btnAudioIOis); REQ(show_reset_loop_alert); } break; #endif case SND_IDX_NULL: RXscard = new SoundNull; TXscard = new SoundNull; break; default: abort(); } current_RXsamplerate = current_TXsamplerate = 0; ReedSolomon = new cRsId; dtmf = new cDTMF; #endif // !BENCHMARK_MODE #if USE_NAMED_SEMAPHORES char sname[32]; snprintf(sname, sizeof(sname), "trx-%u-%s", getpid(), PACKAGE_TARNAME); if ((trx_sem = sem_open(sname, O_CREAT | O_EXCL, 0600, 0)) == (sem_t*)SEM_FAILED) { LOG_PERROR("sem_open"); abort(); } # if HAVE_SEM_UNLINK if (sem_unlink(sname) == -1) { LOG_PERROR("sem_unlink"); abort(); } # endif #else trx_sem = new sem_t; if (sem_init(trx_sem, 0, 0) == -1) { LOG_PERROR("sem_init"); abort(); } #endif trx_state = STATE_RX; _trx_tune = 0; active_modem = 0; if (pthread_create(&trx_thread, NULL, trx_loop, NULL) < 0) { LOG(debug::ERROR_LEVEL, debug::LOG_MODEM, "pthread_create failed"); trxrunning = false; exit(1); } trxrunning = true; } //============================================================================= void trx_close() { LOG_INFO("%s", "closing trx thread"); int count = 1000; active_modem->set_stopflag(true); while (trx_state != STATE_RX && count--) MilliSleep(10); if (trx_state != STATE_RX) { LOG_INFO("%s", "trx_state != STATE_RX"); exit(1); } count = 1000; trx_state = STATE_ABORT; while (trx_state != STATE_ENDED && count--) MilliSleep(10); if (trx_state != STATE_ENDED) { LOG_INFO("%s", "trx_state != STATE_ENDED"); exit(2); } #if USE_NAMED_SEMAPHORES if (sem_close(trx_sem) == -1) LOG_PERROR("sem_close"); #else if (sem_destroy(trx_sem) == -1) LOG_PERROR("sem_destroy"); delete trx_sem; #endif if (RXscard) { delete RXscard; RXscard = 0; } LOG_INFO("%s", "trx thread closed"); } //============================================================================= void trx_transmit_psm(void) { trx_state = STATE_TX; }; void trx_transmit(void) { if (progdefaults.show_psm_btn && progStatus.kpsql_enabled && (!PERFORM_CPS_TEST || !active_modem->XMLRPC_CPS_TEST)) psm_transmit(); else trx_state = STATE_TX; } void trx_tune(void) { trx_state = STATE_TUNE; } void trx_receive(void) { trx_state = STATE_RX; } //============================================================================= void trx_wait_state(void) { ENSURE_NOT_THREAD(TRX_TID); sem_wait(trx_sem); } static void trx_signal_state(void) { ENSURE_THREAD(TRX_TID); sem_post(trx_sem); } fldigi-4.2.05/src/trx/tune.cxx0000664000175000017500000001146614611711171013076 00000000000000// ---------------------------------------------------------------------------- // tune.cxx -- create a single sinewave output with controlled start/end shape // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "sound.h" #include "confdialog.h" #include "test_signal.h" namespace xmttune { // use same wave shaping for tune key down / key up as for the CW tx_process // produces a 4 msec leading / trailing edge #define KNUM 32 // keydown wave shape double kdshape[KNUM] = { 0.00240750255310301, 0.00960708477768751, 0.02152941088003600, 0.03805966253618680, 0.05903864465505320, 0.08426431851158830, 0.11349374748686800, 0.14644543667658500, 0.18280204383628200, 0.22221343555548300, 0.26430005922814900, 0.30865659834558700, 0.35485587590940700, 0.40245296837259500, 0.45098949048925500, 0.49999800980765500, 0.54900654829266300, 0.59754312772456200, 0.64514031509964400, 0.69133972425796200, 0.73569643038517400, 0.77778325487450100, 0.81719487928327800, 0.85355174876454100, 0.88650372738152000, 0.91573347010241700, 0.94095947900139100, 0.96193881423287900, 0.97846943367117300, 0.99039213868324900, 0.99759210729604500, 0.99999999999295900 }; // keyup wave shape double kushape[KNUM] = { 0.99999999999295900, 0.99759210729604500, 0.99039213868324900, 0.97846943367117300, 0.96193881423287900, 0.94095947900139100, 0.91573347010241700, 0.88650372738152000, 0.85355174876454100, 0.81719487928327800, 0.77778325487450100, 0.73569643038517400, 0.69133972425796200, 0.64514031509964400, 0.59754312772456200, 0.54900654829266300, 0.49999800980765500, 0.45098949048925500, 0.40245296837259500, 0.35485587590940700, 0.30865659834558700, 0.26430005922814900, 0.22221343555548300, 0.18280204383628200, 0.14644543667658500, 0.11349374748686800, 0.08426431851158830, 0.05903864465505320, 0.03805966253618680, 0.02152941088003600, 0.00960708477768751, 0.00240750255310301 }; #define BUFLEN 512 double phaseacc = 0.0; double phaseincr = 0.0; double pttacc = 0.0; double outbuf[BUFLEN]; double pttbuf[BUFLEN]; //=========================================================================== inline double nco() { phaseacc += phaseincr; if (phaseacc > TWOPI) phaseacc -= TWOPI; return cos(phaseacc); } inline double pttnco() { pttacc += TWOPI * 1000 / active_modem->get_samplerate(); if (pttacc > TWOPI) pttacc -= TWOPI; return sin(pttacc); } //===================================================================== //===================================================================== void keydown(double freq, SoundBase *scard) { int i; phaseincr = 2.0 * M_PI * freq / active_modem->get_samplerate(); for (i = 0; i < KNUM; i++){ outbuf[i] = nco() * kdshape[i]; pttbuf[i] = pttnco(); } for (; i < BUFLEN; i++) { outbuf[i] = nco(); pttbuf[i] = pttnco(); } if ((active_modem == cw_modem) && progdefaults.QSK) { active_modem->ModulateStereo( outbuf, pttbuf, BUFLEN, false); } else { active_modem->ModulateXmtr(outbuf, BUFLEN); } } //===================================================================== void keyup(double freq, SoundBase *scard) { int i; phaseincr = 2.0 * M_PI * freq / active_modem->get_samplerate(); for (i = 0; i < KNUM; i++) { outbuf[i] = nco() * kushape[i]; pttbuf[i] = pttnco(); } for (; i < BUFLEN; i++) { outbuf[i] = 0.0; pttbuf[i] = pttnco(); } if ((active_modem == cw_modem) && progdefaults.QSK) { active_modem->ModulateStereo( outbuf, pttbuf, BUFLEN, false); } else { active_modem->ModulateXmtr(outbuf, BUFLEN); } } //===================================================================== void tune(double freq, SoundBase *scard) { int i; if (test_signal_window && test_signal_window->visible() && btnOffsetOn->value()) freq += ctrl_freq_offset->value(); phaseincr = 2.0 * M_PI * freq / active_modem->get_samplerate(); for (i = 0; i < BUFLEN; i++) { outbuf[i] = nco(); pttbuf[i] = pttnco(); } if ((active_modem == cw_modem) && progdefaults.QSK) { active_modem->ModulateStereo( outbuf, pttbuf, BUFLEN, false); } else { active_modem->ModulateXmtr(outbuf, BUFLEN); } } }; // namespace tune fldigi-4.2.05/src/dxcluster/0000775000175000017500000000000014611714005012646 500000000000000fldigi-4.2.05/src/dxcluster/DXClusterServers.cxx0000664000175000017500000010620614611711171016547 00000000000000std::string dxcc_servers = "\ \n\ \n\ \n\ \n\ DX Cluster Servers\n\ \n\ \n\

DX Cluster Servers

\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
CallDomain Name/
IP address
logincommentSoftware, Location, etc.
NC7J Skimmer + Spotsdxc.nc7j.com
(dynamically assigned)
call NC7J AR-Cluster (Syracuse, UT, DN31xb);\n\ Sysop: NG7M\n\ and W7CT; default is North American spots. Filters may be\n\ adjusted to enable and filter skimmer spots to your\n\ preference by connecting callsign; for details see \n\ \n\ NG7M Connection and Filter Guide
NC7J Direct CW Skimmerdxc.nc7j.com:7300
(dynamically assigned)
call Telnet access to NC7J's CW Skimmer (Syracuse, UT, DN31xb)
NC7J Direct RTTY Skimmerdxc.nc7j.com:7200
(dynamically assigned)
call Telnet access to NC7J's RTTY Skimmer (Syracuse, UT, DN31xb)
DL4RCK DigiMode Skimmerdl4rck.ham-radio-op.net:8000\n\
(dynamically assigned)
call Telnet access to DL4RCK's Digital Skimmer-Cluster
W1AAAdxusa.net:7300
\n\ 65.172.152.29:7300
call W1AAA DX Spider (Ledyard, CT), \n\ W1AN(Sysop)
K1AJk1aj.mine.nu:7300\n\
(dynamically assigned)
call K1AJ DXSpider (Boston MA)
NN1DK1RFI.com:7300\n\
(dynamically assigned)
call NN1D DXSpider Cluster (Swansea, MA)
K1EUk1eu.dynip.com
\n\  
call K1EU AR-Cluster (Scarborough, ME)
W1GQdx.w1gq.net\n\
(dynamically assigned)
call W1GQ AR-Cluster (Londonderry NH); Skimmer\n\ capable
W1NRdx.w1nr.net
\n\ 173.255.227.205
call W1NR DXSpider (Marlborough, MA); Yankee Clipper Contest Club spotting network; also accessible through \n\ \n\ Java applet (close applet using \"File\" drop-down menu); NTP\n\ server also available: timelord.w1nr.net
W1NR-8usdx.w1nr.net
\n\ 173.255.232.93
call W1NR DXSpider (Marlborough, MA); Yankee\n\ Clipper Contest Club spotting network; default filters set\n\ to only display spots from callsigns in zones 1-8
WW1R-9dxc.ww1r.com:7300
\n\ (dynamically assigned)
call  Dx-Spider (Newton, NC); Sysop: WW1R
K1TTTk1ttt.net:7373
\n\ (dynamically assigned)
call YCCC\n\ AR-Cluster (Peru, MA); Skimmer capable
WC2Ldxc.wc2l.com
\n\ (dynamically assigned)
call WC2L AR-Cluster (Niskayuna, NY); Web access; Skimmer\n\ capable
K2LSdxc.k2ls.com
\n\ (dynamically assigned)
call K2LS DXSpider (Greensboro, NC); spots from CQ\n\ Zones 1-8 (NA) only
AA2MFdxc.aa2mf.net
\n\ (dynamically assigned)
call AA2MF AR-Cluster (Staten Island, NY)
WB3FFVdxc.wb3ffv.us:7300
\n\ (static IP)
call WB3FFV DX-Spider (Abingdon, MD); reachable\n\ with either IPv4 or v6
W3LPLw3lpl.net:7373
\n\ (dynamically assigned)
call W3LPL AR-Cluster, version 6 (Glenwood, MD)
W3LPLdxc.w3lpl.net:7373
\n\ (dynamically assigned)
callCan include Skimmer spotsW3LPL AR-Cluster, version 6 (Glenwood, MD)
K3LRdx.k3lr.com
\n\ 75.185.154.114
call K3LR\n\ AR-Cluster, West Midddlesex, PA; (North Coast\n\ Contesters)
WD4IXDdxc.wd4ixd.net
\n\ (dynamically assigned)
call WD4IXD AR-Cluster (Clermont, FL); Sysop: WD4IXD
WC4Jdxc.wc4j.net
\n\ (dynamically assigned)
call WC4J AR-Cluster (Nokesville, VA)
W4MLdxc.w4ml.net
\n\ (dynamically assigned)
call W4ML AR-Cluster (Montpelier, VA (FM17du))
AI4OFskcc.matrixlist.com:7300
\n\ 208.111.3.150:7300
call AI4OF-SKCC DX-Spider (Orlando, FL); Sysop: AI4OF
K4ZRk4zr.no-ip.org:7300
\n\ (dynamically assigned)
call K4ZR DX Spider (Huntsville, AL); Sysop: AA4U
KY4XXdxc.ky4xx.com:7300
\n\ 198.73.30.100
call KY4XX DX Spider (Louisville, KY) - Kentucky\n\ DX Association; Sysop: N8ZFM
K5DX 
\n\ 75.148.198.113
call Texas DX\n\ Society AR-Cluster (Houston, TX); Sysop: WB5TUF
AE5Edxspots.com
\n\ 204.221.76.52
call AE5A\n\ CC-Cluster (Thief River Falls, MN); Skimmer capable
AB5Kdxc.ab5k.net
\n\ (dynamically assigned)
callWorldwide spotsAB5K AR-Cluster (Holland, TX); Skimmer\n\ capable
AB5K-2dxc-us.ab5k.net
\n\ (dynamically assigned)
callUS spots onlyAB5K AR-Cluster (Holland, TX); Skimmer\n\ capable
K5RLMusrdude.webhop.net:7300
\n\ (dynamically assigned)
call DXSpider (Charleston AR); K5RLM
N5UXTdxc.n5uxt.org
\n\ (dynamically assigned)
callRF access on 145.010N5UXT DX-Cluster (New Orleans, LA)
W6CUAw6cua.no-ip.org:7300
\n\ (dynamically assigned
call AR-Cluster (Castro Valley, CA)
K6EXOk6exo.dyndns.org:7300
\n\ (dynamically assigned
call DXSpider (Los Angeles, CA)
W6KKw6kk.zapto.org:7300
\n\ (dynamically assigned)
call DXSpider (Alta Loma, CA); Southern CA DX Club; USA\n\ and VE spots only
W6RFUucsbdx.ece.ucsb.edu:7300
\n\ 128.111.56.240:7300
call W6RFU DX Spider (Santa Barbara, CA); Sysop: N6WS; CQ Zones 1-5 spots\n\ only
N6WS-6n6ws.no-ip.org:7300
\n\ (dynamically assigned)
call DXSpider (Nipomo, CA); Sysop: N6WS; worldwide spots
K7EKwww.k7ek.net:9000
\n\ (dynamically assigned)
call K7EK DX Spider (Spanaway, WA CN87tb); Sysop:\n\ K7EK
N7ODn7od.pentux.net
\n\ (dynamically assigned)
call N7OD AR-Cluster (Hemet, CA); Sysop: N7OD
NL7Snl7s.net:8000call NL7S DX Spider (Wasilla, AK); Sysop: NL7S
N7XYn7xy.net:7300
\n\ (dynamically assigned)
call N7XY DXSpider (Bainbridge Island, WA); Sysop:\n\ N7XY
NK7Znk7z-cluster.ddns.net:7373
\n\ (dynamically assigned)
call NK7Z AR-Cluster (Eugene, OR); Sysop: NK7Z
N8NOEn8noe.us
\n\ (dynamically assigned)
call N8NOE AR DX Cluster, Waterford, MI
N8NOEn8noe.us:7373
\n\ (dynamically assigned)
call N8NOE AR CW SKimmer, Waterford, MI; Skimmer\n\ capable
W9AEKdx.svs.com:7300
\n\ (dynamically assigned)
call W9AEK DXSpider; Lisle, IL; Sysop: W9AEK
N9AIn9ai.no-ip.org
\n\ (dynamically assigned)
call N9AI AR-Cluster; Green Bay, WI; Sysop: N9AI
N9BCdxc.n9bc.com:7300
\n\ (dynamically assigned)
call N9BC DXSpider; Appleton, WI (EN54xl); Sysop:\n\ N9BC
W9BGw9bg.com
\n\ (dynamically assigned)
callNo SkimmerW9BG AR-Cluster; Madison DX Club, Madison, WI
W9BGw9bg.com:7373
\n\ (dynamically assigned)
callw/ SkimmerW9BG AR-Cluster; Madison DX Club, Madison,\n\ WI; Skimmer capable
NX9Gdxc.f2f.us:7300
\n\ (dynamically assigned)
callipv6 2607:f978:5:8001::1NX9G DXSpider, Bensenville, IL; Sysop: NX9G
N9KTn9kt.homenet.org:8000
\n\ (dynamically assigned)
call N9KT DXSpider, Indianapolis, IN; Sysop: N9KT
W9ODDw9odd.bien.mu.edu
\n\ 134.48.91.173
call K3GGN,\n\ Sysop; Marquette University, Milwaukee, WI,
KR9Ukr9u.net
\n\ (dynamically assigned)
call Fort\n\ Wayne DX Association; Fort Wayne, IN
W9ZRXdxc.w9zrx.net
\n\ (dynamically assigned)
call W9ZRX AR-Cluster, Westfield, IN
\n\ (Hoosier DX & Contest\n\ Club)
W0MWw0mw.dynip.com
\n\ (dynamically assigned)
call Kansas City (Olathe, KS) AR-Cluster
WA0ROIwa0roi.no-ip.com
\n\ (dynamically assigned)
call WA0ROI AR-Cluster (Sheldahl, IA)
K0WLk0wl.ddns.net:23
\n\ (dynamically assigned)
call K0WL AR-Cluster (Urbandale, IA (EN31dp))
DB0SPC-7db0spc.dynv6.net:8000
\n\ (dynamically assigned)
call DXSpider (Mainz); Sysop: DJ6RX
DB0SUE-7db0sue.de:8000
\n\ (dynamically assigned)
call DXSpider (Flensburg); Sysop: DK2ZZ
DL9GTBcluster.dl9gtb.de:8000
\n\ (dynamically assigned)
call DL9GTB\n\ AR Cluster (Nossendorf); Skimmer capable
EA4RCHdxfun.com:8000
\n\ (dynamically assigned)
call EA4RCH DX Spider (Madrid)
EA4UREeadx.org
\n\ 213.97.191.228
call Sysop: EA5BZ
EA7URC-5
\n\ ED7ZAB-5
dx.ea7urc.org:8000
\n\ 150.214.111.198:8000
call DX Spider; Sysop: EA7URC (Cordoba)
EI7MREei7mre.ath.cx:7300
\n\  
call DX Spider; Sysop: EI6IZ (Co Mayo -\n\ IO53hu)
GB7DXGgb7dxg.shacknet.nu:7300
\n\ (dynamically assigned)
call DXSpider Cluster (St Andrew's, Guernsey);\n\ Sysop: GU6EFB
GB7MBCgb7mbc.spoo.org:8000
\n\ (dynamically assigned)
call GB7MBC DXSpider Cluster (Morecambe,\n\ Lancashire); Sysop: G0VGS
GB7NHRgb7nhr.dydns.org:7300
\n\ (dynamically assigned)
call GB7NHR DXSpider Cluster (Nunsfield House ARG,\n\ Derby); Sysop: G8IYZ
HA6DXdx.hu:9000
\n\ (dynamically assigned)
call HA6DX
IK2DUW-6dx.arilimbiate.net:7300
\n\ (dynamically assigned)
call DxSpider (Limbiate MB); Sysop: IW2OHX IK2DUW
IQ4AX-6 
\n\ 195.43.189.178:8000
call DXSpider (ARI Modena); Sysop: IZ4EFN (Sysop)
IQ4AX-6 
\n\ 195.43.189.178:8000
call DXSpider (ARI Modena); Sysop: IZ4EFN (Sysop)
IK4ICZ-6ik4icz.dyndns.org:8000
\n\ (dynamically assigned)
call DX Spider (Ravenna); Sysop: IK4ICZ
IZ5IIN-6iz5iin.no-ip.biz:8000
\n\ (dynamically assigned)
call DX Spider (Santa Maria a Monte, Pisa); Sysop:\n\ IZ5IIN
IK5PWJ-6ik5pwj-6.dyndns.org:8000
\n\ (dynamically assigned)
call DX Spider (Monte Carlo, Lucca); Sysops: IK5PWJ and I5NOD
IK7IMO-6ik7imo.ddns.net:7000
\n\ (dynamically assigned)
call DXSpider Cavallino (LE)); Sysop: IK7IMO
IK7QLZ-6ik7qlz.dyndns.org:7000
\n\ (dynamically assigned)
call DXSpider (Taranto); Sysop: IK7QLZ
IK7UXWik7uxw.dyndns.org:7300
\n\ (dynamically assigned)
call DXSpider (Brindisi); Sysop: IK7UXW
IK8HJC-6ik8hjc.dyndns.org:8000
\n\ (dynamically assigned)
call DXSpider (Battipaglia, SA)
IK8VRN-6ik8vrn.dyndns.org:7000
\n\ (dynamically assigned)
call DXSpider (Marigliano, NA); Sysop: IK8VRN
IR5AG-6iz5fsa.duckdns.org:8000
\n\ (dynamically assigned)
call DX Spider Scandicci (FI); Sysop: IZ5FSA
IZ7AUH-6dx.iz7auh.net:8000
\n\ (dynamically assigned)
call DX Spider (Taranto); Sysop: IZ7AUH
IZ8MBW-6dx.iz8mbw.net:7300
\n\ (dynamically assigned)
call DX Spider (Napoli); Sysop: IZ8MBW
IT9ESI-6it9esi.ddns.net:7373
\n\ (dynamically assigned)
call IT9ESI-6 DXSpider (Gravina di Catania)
KP4JRSkp4jrs.dyndns.org
\n\ (dynamically assigned)
call DXSpider (Trujillo Alto); Sysop: KP4JRS
OH1RCFoh1ab.dy.fi:8000
\n\ 213.186.225.90:8000
call DXSpider (Pori); Sysops: OH1MRR OH1KH OH1QG
ON2VHF-3on2vhf-3.ddns.net:9001
\n\ (dynamically assigned)
call AR-Cluster (Marcinelle, JO20FJ); Sysop: ON2VHF
ON0DXKon0dxk.dyndns.org:8000
\n\ (dynamically assigned)
call DX-Spider (Kortrijk); Sysop: ON6HH
ON0LLV-5telnet://on0llv.ddns.net:7300
\n\ (dynamically assigned)
call DX-Spider (Houdeng-Goegnies, Hainaut,\n\ Belgium; Sysop: ON6LR
OZ5BBS-7oz5bbs.no-ip.org:8000
\n\ dynamically assigned
call OZ1LQH\n\ DXSpider (Odense)
PA1RBZpa1rbz.dyndns.org:9000
\n\ (dynamically assigned)
call PA1RBZ\n\ DXSpider (Ermelo)
PA4JJ-3 
\n\ 83.162.186.24.2:7388
call PA4JJ\n\ DXSpider (Emmen, Drente)
PI4CCdxc.pi4cc.nl:8000
\n\ (dynamically assigned)
call PI4CC\n\ DX-Cluster (Rotterdam); Sysop: PC2A
PI8DXCpi8dxc.mooo.com:41112
\n\ (dynamically assigned)
call DX Spider (Voorburg); Sysop: PA2R
RW3XAdx.feerc.ru:8000call RW3XA-8 DX-Cluster (Obninsk); Sysop: RW3XA
S50CLXbonaparte.infrax.si:41112
\n\ (dynamically assigned)
call S50CLX DX Spider (Cerkno, Slovenia); Sysop: S50CLX
SV2HRT-1sv2hrt.ath.cx:7300
\n\ (dynamically assigned)
call SV2HRT DXSpider; White Tower DX Team, Sysop:\n\ SV2HRT
TA2NC-2home.kayhan.name.tr:7300
\n\ (dynamically assigned)
call TA2NC DXSpider, Ankara, Turkey; Sysop: TA2NC
VE1DXIve1dxi.no-ip.com
\n\ (dynamically assigned)
call VE1DX\n\ WinCluster (Lake Echo, NS)
VA3NAdx.fireroute.com
\n\ (dynamically assigned)
call VA3NA\n\ Linux-PacketCluster (Toronto, ON)
VE6DXCdx.middlebrook.ca:8000
\n\ 64.59.129.23:8000
call VE6DXC DXSpider Cluster (Calgary, AB)
VE7CCdxc.ve7cc.net
\n\ (dynamically assigned)
call VE7CC CC-Cluster (Whonnock, BC); Skimmer\n\ capable
VE9EMOve9emo.gnb.ca
\n\ 205.174.162.164
call VE9EMO DXSpider, the New-Brunswick DX Cluster
VE9SCwww.ve9sc.com:6300
\n\ (dynamically assigned)
call VE9SC DX\n\ Spider (Moncton, NB)
VK7HDM-2ddmcomputers.com:7300
\n\ (dynamically assigned)
call VK7HDM\n\ DX Spider (Gagebrook, Hobart, Tasmania); Web access
YL7DXCdxc.ardi.lv:8000
\n\  
call YL7C DXSpider Cluster (Jelgava, Latvia);\n\ Sysop: YL2MD
YO8SAW-1yo8saw.netroute.ro:7300
\n\  
call YO8SAW\n\ DX Spider (Barlad, Romania)
YV6BTFyv6btf.no-ip.org:8000
\n\ (dynamically assigned)
call YV6BTF\n\ AR-Cluster (Barcelona); Skimmer capable
ZL2AQY-10olson.net.nz:9000
\n\ (dynamically assigned)
call DXSpider (Glenfield, Auckland); Sysop: ZL2AQY
ZL2ARN-10zl2arn.dyndns.org:7300
\n\ (dynamically assigned)
call DXSpider (Waikanae, Kapiti Coast); Sysop: ZL2ARN
\n\ \n\ "; fldigi-4.2.05/src/dxcluster/arc-help.cxx0000664000175000017500000002147114611711171015013 00000000000000std::string arc_commands = "\ \n\ \n\ \n\ \n\ AR Commands\n\ \n\ \n\
\n\

Overview of\n\ AR-Cluster User\n\ Commands

\n\

The\n\ following list is a summary of AR-Cluster commands.  The upper case part of the commands is\n\ required and the lower\n\ case part of the command is optional. \n\ Thus the command A/F is the same as the Announce/Full command.

\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
AnnounceAnnouncement to all locally users
Announce/FullAnnouncement to all users
ByeTerminate the connection to the cluster
CLEAR/QSLRemove a QSL route from the local QSL database
CONFErenceEnter a local conference
CONFErence/FullEnter a network wide conference
DBBuilt in database information
DEeleteDelete a mail message
DIrectroyList mail messages
DxEnter as DX spot
HelpCommand for help
ListList mail messages
QuitTerminate the connection to the cluster
ReadRead a mail message
REPlyReply to a mail message
SendSend a mail message
SEt/ANNouncementsTurn on announcements
SEt/BEepTurn on a beep for DX and Announcement spots
SEt/DX_AnnouncementsActivate DX spots
SEt/DXSqthTurn on the display of the spotter QTH
SEt/EMAILSet your Internet email address
SEt/FILTERSet the spot filters
SEt/HEreLet others know you are at your station
SEt/HOMenodeSet your home node
SEt/LOCAtionSet the location (lat/lon) of your station
SEt/LOGIN_announcementsShow user logins
SEt/NameSet your name
SEt/NOAnnouncementsTurn off announcements
SEt/NOBeepTurn off the beep for DX and Announcements
SEt/NODX_AnnouncementsTurn off DX announcements
SEt/NODXSqthTurn off the display of the spotter QTH
SEt/NOHereIndicate you are away from your station
SEt/NOLOGin_announcementsTurn off login announcements
SEt/NOTalkTurn off the display of talk messages
SEt/NOWWV_announcementsTurn off the display of WWV spots
SEt/NOWX_announcementsTurn off the display of weather announcements
Set/PHONESet your phone number
Set/QRASet the QRA for your station
Set/QSLAdd a QSL route to the local database
SEt/QTHSet your location (city, etc)
SEt/TAlkTurn on the display of talk messages
SEt/WWV_announcementsTurn on the display of WWV spots
SEt/WX_announcementsTurn on the display of weather announcements
SHow/ANnounceShow previous announcements
SHow/ARCHiveShow the files in the archive folder
SHow/BUCmasterShow callbook information for a specified callsign
SHow/BULLEtinsShow the files in the bulletins folder
SHow/CBAShow callbook information for a specified callsign
SHow/CLusterShow the configuration of the cluster
SHow/ConfigurationShow the users on the node
SHow/DxShow previous DX spots
SHow/Dx SQLQuery for past DX using SQL
SHow/EMAILShow a users Internet email address
SHow/FDxDisplay a formatted SH/DX command
SHow/FILEsShow the files in the files folder
SHow/FILTERShows the current DX spot filters
SHow/FITuDisplay a formatted SH/ITU
#Formatted\">SHow/FZOneDisplay a formatted SH/ZONE
SHow/GridShow the MaidenHead grid locator for a station
SHow/HAMShow callbook information for a specified callsign
SHow/HeadingShow the heading and distance to a station
SHow/HOMEnodeShow a users homenode
SHow/ITuShow past DX based on a ITU zone
SHow/LOCationShow the location (lat/lon) of a station
SHow/LOGShow the node logins for a call
SHow/MufShow the MUF for a country
SHow/NEedsShow the CTY needs for a station
SHow/NOdesDisplays a list of nodes in the network
SHow/PrefixShow the prefix information for a call
Show/QRAShow the station QRA
SHow/QslShow QSL information for a call
SHow/STationShow detail information for a call
SHow/SunShow the sunrise/sunset for a location
SHow/TAlkShow past talk messages
SHow/TImeShow the time
SHow/TIPShow a tip about using the cluster
Show/UPTimeShows the uptime for the node
SHow/UsersShow the users connected to the node
SHow/VersionShows the AR-Cluster software version
SHow/WWvShows past WWV information
SHow/WXShow past weather announcements
SHow/WXStationShow data from an optional weather station
SHow/ZoneShow past DX based on a CQ zone
TalkTalk to a station
Talk/TimestampTalk to a station with a timestamp
Type/ARChiveDisplay a file in the archive folder
Type/BULletinsDisplay a file in the bulletin folder
Type/FILesDisplay a file in the files folder
WwvSend a WWV spot to the cluster
WXMake a local weather announcement
WX/FullMake a weather announcement to the network
\n\
\n\ \n\ "; fldigi-4.2.05/src/dxcluster/dx_dialog.cxx0000664000175000017500000010660314611711171015253 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "gettext.h" #include "dx_dialog.h" #include "Fl_Text_Buffer_mod.H" static Fl_Text_Buffer_mod telnet_txt_buffer; static Fl_Text_Buffer_mod telnet_view_buffer; #include "configuration.h" #include "dx_cluster.h" Fl_Group *btn_select_host=(Fl_Group *)0; Fl_Input2 *inp_dxcc_host_url=(Fl_Input2 *)0; static void cb_inp_dxcc_host_url(Fl_Input2* o, void*) { progdefaults.dxcc_host_url=o->value(); progdefaults.changed = true; } Fl_Button *btn_show_host_tab=(Fl_Button *)0; static void cb_btn_show_host_tab(Fl_Button*, void*) { cluster_tabs->value(tabDXclusterConfig); cluster_tabs->redraw(); } Fl_Input2 *inp_dccc_host_port=(Fl_Input2 *)0; static void cb_inp_dccc_host_port(Fl_Input2* o, void*) { progdefaults.dxcc_host_port=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_dccc_login=(Fl_Input2 *)0; static void cb_inp_dccc_login(Fl_Input2* o, void*) { progdefaults.dxcc_login=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_dxcc_password=(Fl_Input2 *)0; static void cb_inp_dxcc_password(Fl_Input2* o, void*) { progdefaults.dxcc_password = o->value(); } Fl_Button *btnDXCLUSTERpasswordShow=(Fl_Button *)0; static void cb_btnDXCLUSTERpasswordShow(Fl_Button*, void*) { inp_dxcc_password->type(inp_dxcc_password->type() ^ FL_SECRET_INPUT); inp_dxcc_password->redraw(); } Fl_Check_Button *btn_dxcc_connect=(Fl_Check_Button *)0; static void cb_btn_dxcc_connect(Fl_Check_Button* o, void*) { progStatus.cluster_connected=o->value(); DXcluster_connect(o->value()); } Fl_Box *lbl_dxc_connected=(Fl_Box *)0; Fl_Check_Button *btn_dxc_auto_connect=(Fl_Check_Button *)0; static void cb_btn_dxc_auto_connect(Fl_Check_Button* o, void*) { progdefaults.dxc_auto_connect = o->value(); progdefaults.changed = true; } Fl_Tabs *cluster_tabs=(Fl_Tabs *)0; Fl_Group *tabDXclusterTelNetStream=(Fl_Group *)0; FTextView *brws_tcpip_stream=(FTextView *)0; Fl_Button *dxc_macro_1=(Fl_Button *)0; Fl_Button *dxc_macro_2=(Fl_Button *)0; Fl_Button *dxc_macro_3=(Fl_Button *)0; Fl_Button *dxc_macro_4=(Fl_Button *)0; Fl_Button *dxc_macro_5=(Fl_Button *)0; Fl_Button *dxc_macro_6=(Fl_Button *)0; Fl_Button *dxc_macro_7=(Fl_Button *)0; Fl_Button *dxc_macro_8=(Fl_Button *)0; Fl_Input2 *inp_dxcluster_cmd=(Fl_Input2 *)0; static void cb_inp_dxcluster_cmd(Fl_Input2*, void*) { DXcluster_submit(); } Fl_Button *btn_cluster_spot=(Fl_Button *)0; static void cb_btn_cluster_spot(Fl_Button*, void*) { send_DXcluster_spot(); } Fl_Button *btn_cluster_submit=(Fl_Button *)0; static void cb_btn_cluster_submit(Fl_Button*, void*) { DXcluster_submit(); } Fl_Group *tabDXclusterReports=(Fl_Group *)0; Fl_Browser *reports_header=(Fl_Browser *)0; Fl_Browser *brws_dx_cluster=(Fl_Browser *)0; static void cb_brws_dx_cluster(Fl_Browser*, void*) { DXcluster_select(); } Fl_Button *btn_dxc_cluster_clear=(Fl_Button *)0; static void cb_btn_dxc_cluster_clear(Fl_Button*, void*) { brws_dx_cluster->clear(); } Fl_Check_Button *brws_order=(Fl_Check_Button *)0; static void cb_brws_order(Fl_Check_Button* o, void*) { progdefaults.dxc_topline = o->value(); dxc_lines(); progdefaults.changed=true; } Fl_Button *btn_cluster_spot2=(Fl_Button *)0; static void cb_btn_cluster_spot2(Fl_Button*, void*) { send_DXcluster_spot(); } Fl_Group *tabDXclusterConfig=(Fl_Group *)0; Fl_Browser *brws_dxcluster_hosts=(Fl_Browser *)0; Fl_Button *btn_dxcluster_hosts_select=(Fl_Button *)0; Fl_Button *btn_dxcluster_hosts_add=(Fl_Button *)0; Fl_Button *btn_dxcluster_hosts_delete=(Fl_Button *)0; Fl_Button *btn_dxcluster_servers=(Fl_Button *)0; FTextEdit *ed_telnet_cmds=(FTextEdit *)0; Fl_Button *btn_dxcluster_hosts_load_setup=(Fl_Button *)0; Fl_Button *btn_dxcluster_hosts_save_setup=(Fl_Button *)0; Fl_Button *btn_dxcluster_hosts_send_setup=(Fl_Button *)0; Fl_Check_Button *btn_spot_when_logged=(Fl_Check_Button *)0; static void cb_btn_spot_when_logged(Fl_Check_Button* o, void*) { progdefaults.spot_when_logged = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_dxc_hertz=(Fl_Check_Button *)0; static void cb_btn_dxc_hertz(Fl_Check_Button* o, void*) { progdefaults.dxc_hertz = o->value(); progdefaults.changed = true; } Fl_Input *mlabel_1=(Fl_Input *)0; static void cb_mlabel_1(Fl_Input* o, void*) { progdefaults.dxcm_label_1=o->value(); dxc_macro_1->label(progdefaults.dxcm_label_1.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_1=(Fl_Input2 *)0; static void cb_mtext_1(Fl_Input2* o, void*) { progdefaults.dxcm_text_1=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_2=(Fl_Input *)0; static void cb_mlabel_2(Fl_Input* o, void*) { progdefaults.dxcm_label_2=o->value(); dxc_macro_2->label(progdefaults.dxcm_label_2.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_2=(Fl_Input2 *)0; static void cb_mtext_2(Fl_Input2* o, void*) { progdefaults.dxcm_text_2=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_3=(Fl_Input *)0; static void cb_mlabel_3(Fl_Input* o, void*) { progdefaults.dxcm_label_3=o->value(); dxc_macro_3->label(progdefaults.dxcm_label_3.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_3=(Fl_Input2 *)0; static void cb_mtext_3(Fl_Input2* o, void*) { progdefaults.dxcm_text_3=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_4=(Fl_Input *)0; static void cb_mlabel_4(Fl_Input* o, void*) { progdefaults.dxcm_label_4=o->value(); dxc_macro_4->label(progdefaults.dxcm_label_4.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_4=(Fl_Input2 *)0; static void cb_mtext_4(Fl_Input2* o, void*) { progdefaults.dxcm_text_4=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_5=(Fl_Input *)0; static void cb_mlabel_5(Fl_Input* o, void*) { progdefaults.dxcm_label_5=o->value(); dxc_macro_5->label(progdefaults.dxcm_label_5.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_5=(Fl_Input2 *)0; static void cb_mtext_5(Fl_Input2* o, void*) { progdefaults.dxcm_text_5=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_6=(Fl_Input *)0; static void cb_mlabel_6(Fl_Input* o, void*) { progdefaults.dxcm_label_6=o->value(); dxc_macro_6->label(progdefaults.dxcm_label_6.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_6=(Fl_Input2 *)0; static void cb_mtext_6(Fl_Input2* o, void*) { progdefaults.dxcm_text_6=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_7=(Fl_Input *)0; static void cb_mlabel_7(Fl_Input* o, void*) { progdefaults.dxcm_label_7=o->value(); dxc_macro_7->label(progdefaults.dxcm_label_7.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_7=(Fl_Input2 *)0; static void cb_mtext_7(Fl_Input2* o, void*) { progdefaults.dxcm_text_7=o->value(); progdefaults.changed=true; } Fl_Input *mlabel_8=(Fl_Input *)0; static void cb_mlabel_8(Fl_Input* o, void*) { progdefaults.dxcm_label_8=o->value(); dxc_macro_8->label(progdefaults.dxcm_label_8.c_str()); progdefaults.changed=true; } Fl_Input2 *mtext_8=(Fl_Input2 *)0; static void cb_mtext_8(Fl_Input2* o, void*) { progdefaults.dxcm_text_8=o->value(); progdefaults.changed=true; } Fl_Button *btn_dxcluster_ar_help=(Fl_Button *)0; Fl_Button *btn_dxcluster_cc_help=(Fl_Button *)0; Fl_Button *btn_dxcluster_dx_help=(Fl_Button *)0; Fl_Group *tabDXclusterHelp=(Fl_Group *)0; FTextView *brws_dxc_help=(FTextView *)0; Fl_Button *btn_dxc_help_query=(Fl_Button *)0; static void cb_btn_dxc_help_query(Fl_Button*, void*) { dxc_help_query(); } Fl_Input2 *inp_help_string=(Fl_Input2 *)0; static void cb_inp_help_string(Fl_Input2*, void*) { dxc_help_query(); } Fl_Button *btn_dxc_help_clear=(Fl_Button *)0; static void cb_btn_dxc_help_clear(Fl_Button*, void*) { dxc_help_clear(); } Fl_Double_Window* dxc_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(680, 400, _("DX Cluster Spotting")); w = o; if (w) {/* empty */} { btn_select_host = new Fl_Group(1, 2, 678, 50); btn_select_host->box(FL_ENGRAVED_BOX); { Fl_Input2* o = inp_dxcc_host_url = new Fl_Input2(6, 25, 256, 22, _("DX HOST hostname/IP")); inp_dxcc_host_url->tooltip(_("telnet server URL")); inp_dxcc_host_url->box(FL_DOWN_BOX); inp_dxcc_host_url->color(FL_BACKGROUND2_COLOR); inp_dxcc_host_url->selection_color(FL_SELECTION_COLOR); inp_dxcc_host_url->labeltype(FL_NORMAL_LABEL); inp_dxcc_host_url->labelfont(0); inp_dxcc_host_url->labelsize(14); inp_dxcc_host_url->labelcolor(FL_FOREGROUND_COLOR); inp_dxcc_host_url->callback((Fl_Callback*)cb_inp_dxcc_host_url); inp_dxcc_host_url->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_dxcc_host_url->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcc_host_url.c_str()); } // Fl_Input2* inp_dxcc_host_url { btn_show_host_tab = new Fl_Button(263, 25, 20, 22, _("@2>")); btn_show_host_tab->callback((Fl_Callback*)cb_btn_show_host_tab); } // Fl_Button* btn_show_host_tab { Fl_Input2* o = inp_dccc_host_port = new Fl_Input2(285, 25, 50, 22, _("Port")); inp_dccc_host_port->tooltip(_("telnet server port")); inp_dccc_host_port->box(FL_DOWN_BOX); inp_dccc_host_port->color(FL_BACKGROUND2_COLOR); inp_dccc_host_port->selection_color(FL_SELECTION_COLOR); inp_dccc_host_port->labeltype(FL_NORMAL_LABEL); inp_dccc_host_port->labelfont(0); inp_dccc_host_port->labelsize(14); inp_dccc_host_port->labelcolor(FL_FOREGROUND_COLOR); inp_dccc_host_port->callback((Fl_Callback*)cb_inp_dccc_host_port); inp_dccc_host_port->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_dccc_host_port->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcc_host_port.c_str()); } // Fl_Input2* inp_dccc_host_port { Fl_Input2* o = inp_dccc_login = new Fl_Input2(336, 25, 80, 22, _("Login as")); inp_dccc_login->tooltip(_("login call sign")); inp_dccc_login->box(FL_DOWN_BOX); inp_dccc_login->color(FL_BACKGROUND2_COLOR); inp_dccc_login->selection_color(FL_SELECTION_COLOR); inp_dccc_login->labeltype(FL_NORMAL_LABEL); inp_dccc_login->labelfont(0); inp_dccc_login->labelsize(14); inp_dccc_login->labelcolor(FL_FOREGROUND_COLOR); inp_dccc_login->callback((Fl_Callback*)cb_inp_dccc_login); inp_dccc_login->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_dccc_login->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcc_login.c_str()); } // Fl_Input2* inp_dccc_login { Fl_Input2* o = inp_dxcc_password = new Fl_Input2(420, 25, 80, 22, _("Password")); inp_dxcc_password->tooltip(_("Your login password")); inp_dxcc_password->box(FL_DOWN_BOX); inp_dxcc_password->color(FL_BACKGROUND2_COLOR); inp_dxcc_password->selection_color(FL_SELECTION_COLOR); inp_dxcc_password->labeltype(FL_NORMAL_LABEL); inp_dxcc_password->labelfont(0); inp_dxcc_password->labelsize(14); inp_dxcc_password->labelcolor(FL_FOREGROUND_COLOR); inp_dxcc_password->callback((Fl_Callback*)cb_inp_dxcc_password); inp_dxcc_password->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_dxcc_password->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcc_password.c_str()); o->type(FL_SECRET_INPUT); inp_dxcc_password->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_dxcc_password { btnDXCLUSTERpasswordShow = new Fl_Button(503, 25, 22, 22, _("?")); btnDXCLUSTERpasswordShow->tooltip(_("Show password in plain text")); btnDXCLUSTERpasswordShow->callback((Fl_Callback*)cb_btnDXCLUSTERpasswordShow); } // Fl_Button* btnDXCLUSTERpasswordShow { Fl_Check_Button* o = btn_dxcc_connect = new Fl_Check_Button(571, 10, 101, 15, _("Connect")); btn_dxcc_connect->tooltip(_("Connect / Disconnect")); btn_dxcc_connect->down_box(FL_DOWN_BOX); btn_dxcc_connect->callback((Fl_Callback*)cb_btn_dxcc_connect); o->value(progStatus.cluster_connected); } // Fl_Check_Button* btn_dxcc_connect { lbl_dxc_connected = new Fl_Box(540, 17, 20, 20); lbl_dxc_connected->tooltip(_("Connected State")); lbl_dxc_connected->box(FL_DIAMOND_DOWN_BOX); lbl_dxc_connected->color((Fl_Color)55); lbl_dxc_connected->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* lbl_dxc_connected { Fl_Check_Button* o = btn_dxc_auto_connect = new Fl_Check_Button(571, 31, 101, 15, _("Auto conn\'")); btn_dxc_auto_connect->tooltip(_("Connect to host when starting fldigi")); btn_dxc_auto_connect->down_box(FL_DOWN_BOX); btn_dxc_auto_connect->callback((Fl_Callback*)cb_btn_dxc_auto_connect); o->value(progdefaults.dxc_auto_connect); } // Fl_Check_Button* btn_dxc_auto_connect btn_select_host->end(); } // Fl_Group* btn_select_host { cluster_tabs = new Fl_Tabs(0, 55, 680, 340); { tabDXclusterTelNetStream = new Fl_Group(1, 80, 677, 314, _("TelNet stream")); { Fl_Group* o = new Fl_Group(2, 82, 676, 276); o->box(FL_ENGRAVED_FRAME); { brws_tcpip_stream = new FTextView(4, 85, 668, 240); brws_tcpip_stream->tooltip(_("Cluster server command strings")); brws_tcpip_stream->box(FL_DOWN_FRAME); brws_tcpip_stream->color(FL_BACKGROUND2_COLOR); brws_tcpip_stream->selection_color(FL_SELECTION_COLOR); brws_tcpip_stream->labeltype(FL_NORMAL_LABEL); brws_tcpip_stream->labelfont(0); brws_tcpip_stream->labelsize(13); brws_tcpip_stream->labelcolor(FL_FOREGROUND_COLOR); brws_tcpip_stream->textfont(13); brws_tcpip_stream->align(Fl_Align(FL_ALIGN_TOP)); brws_tcpip_stream->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(brws_tcpip_stream); } // FTextView* brws_tcpip_stream { Fl_Button* o = dxc_macro_1 = new Fl_Button(4, 331, 80, 22, _("m1")); dxc_macro_1->tooltip(_("DX cluster macro\\nLeft click execute\\nRight click edit")); dxc_macro_1->callback((Fl_Callback*)dxc_click_m1); o->label(progdefaults.dxcm_label_1.c_str()); } // Fl_Button* dxc_macro_1 { Fl_Button* o = dxc_macro_2 = new Fl_Button(88, 331, 80, 22, _("m2")); dxc_macro_2->callback((Fl_Callback*)dxc_click_m2); o->label(progdefaults.dxcm_label_2.c_str()); } // Fl_Button* dxc_macro_2 { Fl_Button* o = dxc_macro_3 = new Fl_Button(172, 331, 80, 22, _("m3")); dxc_macro_3->callback((Fl_Callback*)dxc_click_m3); o->label(progdefaults.dxcm_label_3.c_str()); } // Fl_Button* dxc_macro_3 { Fl_Button* o = dxc_macro_4 = new Fl_Button(256, 331, 80, 22, _("m4")); dxc_macro_4->callback((Fl_Callback*)dxc_click_m4); o->label(progdefaults.dxcm_label_4.c_str()); } // Fl_Button* dxc_macro_4 { Fl_Button* o = dxc_macro_5 = new Fl_Button(340, 331, 80, 22, _("m5")); dxc_macro_5->callback((Fl_Callback*)dxc_click_m5); o->label(progdefaults.dxcm_label_5.c_str()); } // Fl_Button* dxc_macro_5 { Fl_Button* o = dxc_macro_6 = new Fl_Button(424, 331, 80, 22, _("m6")); dxc_macro_6->callback((Fl_Callback*)dxc_click_m6); o->label(progdefaults.dxcm_label_6.c_str()); } // Fl_Button* dxc_macro_6 { Fl_Button* o = dxc_macro_7 = new Fl_Button(508, 331, 80, 22, _("m7")); dxc_macro_7->callback((Fl_Callback*)dxc_click_m7); o->label(progdefaults.dxcm_label_7.c_str()); } // Fl_Button* dxc_macro_7 { Fl_Button* o = dxc_macro_8 = new Fl_Button(592, 331, 80, 22, _("m8")); dxc_macro_8->tooltip(_("DX cluster macro\\nLeft click execute\\nRight click edit")); dxc_macro_8->callback((Fl_Callback*)dxc_click_m8); o->label(progdefaults.dxcm_label_8.c_str()); } // Fl_Button* dxc_macro_8 o->end(); } // Fl_Group* o { inp_dxcluster_cmd = new Fl_Input2(43, 364, 480, 22, _("Cmd:")); inp_dxcluster_cmd->tooltip(_("Command string")); inp_dxcluster_cmd->box(FL_DOWN_BOX); inp_dxcluster_cmd->color(FL_BACKGROUND2_COLOR); inp_dxcluster_cmd->selection_color(FL_SELECTION_COLOR); inp_dxcluster_cmd->labeltype(FL_NORMAL_LABEL); inp_dxcluster_cmd->labelfont(0); inp_dxcluster_cmd->labelsize(13); inp_dxcluster_cmd->labelcolor(FL_FOREGROUND_COLOR); inp_dxcluster_cmd->callback((Fl_Callback*)cb_inp_dxcluster_cmd); inp_dxcluster_cmd->align(Fl_Align(FL_ALIGN_LEFT)); inp_dxcluster_cmd->when(FL_WHEN_ENTER_KEY); } // Fl_Input2* inp_dxcluster_cmd { btn_cluster_spot = new Fl_Button(527, 364, 70, 22, _("Spot")); btn_cluster_spot->tooltip(_("Send SPOT string to server")); btn_cluster_spot->callback((Fl_Callback*)cb_btn_cluster_spot); } // Fl_Button* btn_cluster_spot { btn_cluster_submit = new Fl_Button(602, 364, 70, 22, _("Submit")); btn_cluster_submit->tooltip(_("Send command to server")); btn_cluster_submit->callback((Fl_Callback*)cb_btn_cluster_submit); } // Fl_Button* btn_cluster_submit tabDXclusterTelNetStream->end(); } // Fl_Group* tabDXclusterTelNetStream { tabDXclusterReports = new Fl_Group(1, 80, 673, 314, _("DX Reports")); tabDXclusterReports->hide(); { reports_header = new Fl_Browser(3, 84, 671, 20); reports_header->color(FL_LIGHT2); reports_header->textfont(4); reports_header->when(FL_WHEN_NEVER); } // Fl_Browser* reports_header { brws_dx_cluster = new Fl_Browser(3, 104, 671, 260); brws_dx_cluster->tooltip(_("Left Click to select SPOT")); brws_dx_cluster->type(2); brws_dx_cluster->textfont(4); brws_dx_cluster->callback((Fl_Callback*)cb_brws_dx_cluster); brws_dx_cluster->align(Fl_Align(FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE)); Fl_Group::current()->resizable(brws_dx_cluster); } // Fl_Browser* brws_dx_cluster { btn_dxc_cluster_clear = new Fl_Button(294, 366, 72, 22, _("Clear")); btn_dxc_cluster_clear->tooltip(_("Clear parsed data stream")); btn_dxc_cluster_clear->callback((Fl_Callback*)cb_btn_dxc_cluster_clear); } // Fl_Button* btn_dxc_cluster_clear { Fl_Check_Button* o = brws_order = new Fl_Check_Button(31, 371, 186, 15, _("New entries in first line")); brws_order->down_box(FL_DOWN_BOX); brws_order->callback((Fl_Callback*)cb_brws_order); brws_order->when(FL_WHEN_CHANGED); o->value(progdefaults.dxc_topline); } // Fl_Check_Button* brws_order { btn_cluster_spot2 = new Fl_Button(585, 368, 70, 22, _("Spot")); btn_cluster_spot2->tooltip(_("Send SPOT string to server")); btn_cluster_spot2->callback((Fl_Callback*)cb_btn_cluster_spot2); } // Fl_Button* btn_cluster_spot2 tabDXclusterReports->end(); } // Fl_Group* tabDXclusterReports { tabDXclusterConfig = new Fl_Group(0, 80, 676, 314, _("Config")); tabDXclusterConfig->tooltip(_("Initialization strings for telnet cluster host")); tabDXclusterConfig->hide(); { Fl_Group* o = new Fl_Group(0, 82, 676, 130); { Fl_Group* o = new Fl_Group(1, 82, 348, 124); { Fl_Browser* o = brws_dxcluster_hosts = new Fl_Browser(5, 100, 278, 100, _("Hosts")); brws_dxcluster_hosts->type(2); brws_dxcluster_hosts->textfont(4); brws_dxcluster_hosts->align(Fl_Align(FL_ALIGN_TOP)); Fl_Group::current()->resizable(brws_dxcluster_hosts); static int widths[]={o->w()*6/10, o->w()*2/10, o->w()*2/10, 0 }; o->column_widths(widths); o->column_char(':'); dxcluster_hosts_load(); } // Fl_Browser* brws_dxcluster_hosts { Fl_Group* o = new Fl_Group(286, 100, 61, 100); { btn_dxcluster_hosts_select = new Fl_Button(290, 106, 54, 19, _("Select")); btn_dxcluster_hosts_select->tooltip(_("Select highlighted DX cluster host")); btn_dxcluster_hosts_select->callback((Fl_Callback*)dxcluster_hosts_select); } // Fl_Button* btn_dxcluster_hosts_select { btn_dxcluster_hosts_add = new Fl_Button(290, 128, 54, 19, _("Add")); btn_dxcluster_hosts_add->tooltip(_("Add current DX cluster host")); btn_dxcluster_hosts_add->callback((Fl_Callback*)dxcluster_hosts_add); } // Fl_Button* btn_dxcluster_hosts_add { btn_dxcluster_hosts_delete = new Fl_Button(290, 151, 54, 19, _("Delete")); btn_dxcluster_hosts_delete->tooltip(_("Delete highlighted DX cluster host")); btn_dxcluster_hosts_delete->callback((Fl_Callback*)dxcluster_hosts_delete); } // Fl_Button* btn_dxcluster_hosts_delete { btn_dxcluster_servers = new Fl_Button(290, 174, 54, 19, _("Srvrs")); btn_dxcluster_servers->tooltip(_("Server List")); btn_dxcluster_servers->callback((Fl_Callback*)dxcluster_servers); } // Fl_Button* btn_dxcluster_servers { Fl_Group* o = new Fl_Group(290, 195, 54, 2); o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(350, 82, 325, 103); { ed_telnet_cmds = new FTextEdit(354, 100, 248, 80, _("Cluster Server Setup Cmds")); ed_telnet_cmds->tooltip(_("Cluster server command strings")); ed_telnet_cmds->box(FL_DOWN_FRAME); ed_telnet_cmds->color(FL_BACKGROUND2_COLOR); ed_telnet_cmds->selection_color(FL_SELECTION_COLOR); ed_telnet_cmds->labeltype(FL_NORMAL_LABEL); ed_telnet_cmds->labelfont(0); ed_telnet_cmds->labelsize(14); ed_telnet_cmds->labelcolor(FL_FOREGROUND_COLOR); ed_telnet_cmds->textfont(13); ed_telnet_cmds->align(Fl_Align(FL_ALIGN_TOP)); ed_telnet_cmds->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(ed_telnet_cmds); } // FTextEdit* ed_telnet_cmds { Fl_Group* o = new Fl_Group(606, 100, 59, 82); { btn_dxcluster_hosts_load_setup = new Fl_Button(610, 106, 54, 19, _("Load")); btn_dxcluster_hosts_load_setup->tooltip(_("Load Cluster Setup Commands")); btn_dxcluster_hosts_load_setup->callback((Fl_Callback*)dxcluster_hosts_load_setup); } // Fl_Button* btn_dxcluster_hosts_load_setup { btn_dxcluster_hosts_save_setup = new Fl_Button(610, 128, 54, 19, _("Save")); btn_dxcluster_hosts_save_setup->tooltip(_("Save Cluster Setup Commands")); btn_dxcluster_hosts_save_setup->callback((Fl_Callback*)dxcluster_hosts_save_setup); } // Fl_Button* btn_dxcluster_hosts_save_setup { btn_dxcluster_hosts_send_setup = new Fl_Button(610, 151, 54, 19, _("Send")); btn_dxcluster_hosts_send_setup->tooltip(_("Send Commands to Cluster Server")); btn_dxcluster_hosts_send_setup->callback((Fl_Callback*)dxcluster_hosts_send_setup); } // Fl_Button* btn_dxcluster_hosts_send_setup { Fl_Group* o = new Fl_Group(610, 174, 54, 2); o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_spot_when_logged = new Fl_Check_Button(354, 188, 146, 15, _("Spot when logged")); btn_spot_when_logged->tooltip(_("Create DX spot when logging contact")); btn_spot_when_logged->down_box(FL_DOWN_BOX); btn_spot_when_logged->callback((Fl_Callback*)cb_btn_spot_when_logged); o->value(progdefaults.spot_when_logged); } // Fl_Check_Button* btn_spot_when_logged { Fl_Check_Button* o = btn_dxc_hertz = new Fl_Check_Button(512, 188, 146, 15, _("Report [0..99 Hz]")); btn_dxc_hertz->tooltip(_("Add [0..99] Hz WF value to DX report notes")); btn_dxc_hertz->down_box(FL_DOWN_BOX); btn_dxc_hertz->callback((Fl_Callback*)cb_btn_dxc_hertz); o->value(progdefaults.dxc_hertz); } // Fl_Check_Button* btn_dxc_hertz o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 218, 676, 174); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Group* o = new Fl_Group(1, 218, 307, 170); { Fl_Input* o = mlabel_1 = new Fl_Input(5, 238, 80, 22, _("label 1")); mlabel_1->callback((Fl_Callback*)cb_mlabel_1); mlabel_1->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_1.c_str()); } // Fl_Input* mlabel_1 { Fl_Input2* o = mtext_1 = new Fl_Input2(87, 238, 220, 22, _("macro text")); mtext_1->box(FL_DOWN_BOX); mtext_1->color(FL_BACKGROUND2_COLOR); mtext_1->selection_color(FL_SELECTION_COLOR); mtext_1->labeltype(FL_NORMAL_LABEL); mtext_1->labelfont(0); mtext_1->labelsize(14); mtext_1->labelcolor(FL_FOREGROUND_COLOR); mtext_1->callback((Fl_Callback*)cb_mtext_1); mtext_1->align(Fl_Align(FL_ALIGN_TOP)); mtext_1->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_1.c_str()); } // Fl_Input2* mtext_1 { Fl_Input* o = mlabel_2 = new Fl_Input(5, 278, 80, 22, _("label 2")); mlabel_2->callback((Fl_Callback*)cb_mlabel_2); mlabel_2->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_2.c_str()); } // Fl_Input* mlabel_2 { Fl_Input2* o = mtext_2 = new Fl_Input2(87, 278, 220, 22); mtext_2->box(FL_DOWN_BOX); mtext_2->color(FL_BACKGROUND2_COLOR); mtext_2->selection_color(FL_SELECTION_COLOR); mtext_2->labeltype(FL_NORMAL_LABEL); mtext_2->labelfont(0); mtext_2->labelsize(14); mtext_2->labelcolor(FL_FOREGROUND_COLOR); mtext_2->callback((Fl_Callback*)cb_mtext_2); mtext_2->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_2->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_2.c_str()); } // Fl_Input2* mtext_2 { Fl_Input* o = mlabel_3 = new Fl_Input(5, 318, 80, 22, _("label 3")); mlabel_3->callback((Fl_Callback*)cb_mlabel_3); mlabel_3->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_3.c_str()); } // Fl_Input* mlabel_3 { Fl_Input2* o = mtext_3 = new Fl_Input2(87, 318, 220, 22); mtext_3->box(FL_DOWN_BOX); mtext_3->color(FL_BACKGROUND2_COLOR); mtext_3->selection_color(FL_SELECTION_COLOR); mtext_3->labeltype(FL_NORMAL_LABEL); mtext_3->labelfont(0); mtext_3->labelsize(14); mtext_3->labelcolor(FL_FOREGROUND_COLOR); mtext_3->callback((Fl_Callback*)cb_mtext_3); mtext_3->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_3->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_3.c_str()); } // Fl_Input2* mtext_3 { Fl_Input* o = mlabel_4 = new Fl_Input(5, 358, 80, 22, _("label 4")); mlabel_4->callback((Fl_Callback*)cb_mlabel_4); mlabel_4->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_4.c_str()); } // Fl_Input* mlabel_4 { Fl_Input2* o = mtext_4 = new Fl_Input2(87, 358, 220, 22); mtext_4->box(FL_DOWN_BOX); mtext_4->color(FL_BACKGROUND2_COLOR); mtext_4->selection_color(FL_SELECTION_COLOR); mtext_4->labeltype(FL_NORMAL_LABEL); mtext_4->labelfont(0); mtext_4->labelsize(14); mtext_4->labelcolor(FL_FOREGROUND_COLOR); mtext_4->callback((Fl_Callback*)cb_mtext_4); mtext_4->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_4->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_4.c_str()); } // Fl_Input2* mtext_4 o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(308, 218, 307, 170); { Fl_Input* o = mlabel_5 = new Fl_Input(310, 237, 80, 22, _("label 5")); mlabel_5->callback((Fl_Callback*)cb_mlabel_5); mlabel_5->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_5.c_str()); } // Fl_Input* mlabel_5 { Fl_Input2* o = mtext_5 = new Fl_Input2(391, 237, 220, 22, _("macro text")); mtext_5->box(FL_DOWN_BOX); mtext_5->color(FL_BACKGROUND2_COLOR); mtext_5->selection_color(FL_SELECTION_COLOR); mtext_5->labeltype(FL_NORMAL_LABEL); mtext_5->labelfont(0); mtext_5->labelsize(14); mtext_5->labelcolor(FL_FOREGROUND_COLOR); mtext_5->callback((Fl_Callback*)cb_mtext_5); mtext_5->align(Fl_Align(FL_ALIGN_TOP)); mtext_5->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_5.c_str()); } // Fl_Input2* mtext_5 { Fl_Input* o = mlabel_6 = new Fl_Input(310, 277, 80, 22, _("label 6")); mlabel_6->callback((Fl_Callback*)cb_mlabel_6); mlabel_6->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_6.c_str()); } // Fl_Input* mlabel_6 { Fl_Input2* o = mtext_6 = new Fl_Input2(391, 277, 220, 22); mtext_6->box(FL_DOWN_BOX); mtext_6->color(FL_BACKGROUND2_COLOR); mtext_6->selection_color(FL_SELECTION_COLOR); mtext_6->labeltype(FL_NORMAL_LABEL); mtext_6->labelfont(0); mtext_6->labelsize(14); mtext_6->labelcolor(FL_FOREGROUND_COLOR); mtext_6->callback((Fl_Callback*)cb_mtext_6); mtext_6->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_6->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_6.c_str()); } // Fl_Input2* mtext_6 { Fl_Input* o = mlabel_7 = new Fl_Input(310, 317, 80, 22, _("label 7")); mlabel_7->callback((Fl_Callback*)cb_mlabel_7); mlabel_7->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_7.c_str()); } // Fl_Input* mlabel_7 { Fl_Input2* o = mtext_7 = new Fl_Input2(391, 317, 220, 22); mtext_7->box(FL_DOWN_BOX); mtext_7->color(FL_BACKGROUND2_COLOR); mtext_7->selection_color(FL_SELECTION_COLOR); mtext_7->labeltype(FL_NORMAL_LABEL); mtext_7->labelfont(0); mtext_7->labelsize(14); mtext_7->labelcolor(FL_FOREGROUND_COLOR); mtext_7->callback((Fl_Callback*)cb_mtext_7); mtext_7->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_7->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_7.c_str()); } // Fl_Input2* mtext_7 { Fl_Input* o = mlabel_8 = new Fl_Input(310, 357, 80, 22, _("label 8")); mlabel_8->callback((Fl_Callback*)cb_mlabel_8); mlabel_8->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.dxcm_label_8.c_str()); } // Fl_Input* mlabel_8 { Fl_Input2* o = mtext_8 = new Fl_Input2(391, 357, 220, 22); mtext_8->box(FL_DOWN_BOX); mtext_8->color(FL_BACKGROUND2_COLOR); mtext_8->selection_color(FL_SELECTION_COLOR); mtext_8->labeltype(FL_NORMAL_LABEL); mtext_8->labelfont(0); mtext_8->labelsize(14); mtext_8->labelcolor(FL_FOREGROUND_COLOR); mtext_8->callback((Fl_Callback*)cb_mtext_8); mtext_8->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); mtext_8->when(FL_WHEN_RELEASE); o->value(progdefaults.dxcm_text_8.c_str()); } // Fl_Input2* mtext_8 o->end(); } // Fl_Group* o { btn_dxcluster_ar_help = new Fl_Button(618, 230, 56, 22, _("AR ?")); btn_dxcluster_ar_help->tooltip(_("AR Commands")); btn_dxcluster_ar_help->callback((Fl_Callback*)dxcluster_ar_help); } // Fl_Button* btn_dxcluster_ar_help { btn_dxcluster_cc_help = new Fl_Button(618, 272, 56, 22, _("CC ?")); btn_dxcluster_cc_help->tooltip(_("CC Commands")); btn_dxcluster_cc_help->callback((Fl_Callback*)dxcluster_cc_help); } // Fl_Button* btn_dxcluster_cc_help { btn_dxcluster_dx_help = new Fl_Button(618, 315, 56, 22, _("DX ?")); btn_dxcluster_dx_help->tooltip(_("Spider Commands")); btn_dxcluster_dx_help->callback((Fl_Callback*)dxcluster_dx_help); } // Fl_Button* btn_dxcluster_dx_help o->end(); } // Fl_Group* o tabDXclusterConfig->end(); } // Fl_Group* tabDXclusterConfig { tabDXclusterHelp = new Fl_Group(1, 80, 675, 314, _("Help")); tabDXclusterHelp->hide(); { brws_dxc_help = new FTextView(3, 84, 673, 281); brws_dxc_help->tooltip(_("Cluster server command strings")); brws_dxc_help->box(FL_DOWN_FRAME); brws_dxc_help->color(FL_BACKGROUND2_COLOR); brws_dxc_help->selection_color(FL_SELECTION_COLOR); brws_dxc_help->labeltype(FL_NORMAL_LABEL); brws_dxc_help->labelfont(0); brws_dxc_help->labelsize(13); brws_dxc_help->labelcolor(FL_FOREGROUND_COLOR); brws_dxc_help->textfont(13); brws_dxc_help->align(Fl_Align(FL_ALIGN_TOP)); brws_dxc_help->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(brws_dxc_help); } // FTextView* brws_dxc_help { btn_dxc_help_query = new Fl_Button(441, 368, 70, 22, _("Get Help")); btn_dxc_help_query->tooltip(_("Get WWV sunspot events")); btn_dxc_help_query->callback((Fl_Callback*)cb_btn_dxc_help_query); } // Fl_Button* btn_dxc_help_query { inp_help_string = new Fl_Input2(265, 368, 172, 22, _("Help on:")); inp_help_string->tooltip(_("Leave blank for general help\nEnter subject, e.g. DX")); inp_help_string->box(FL_DOWN_BOX); inp_help_string->color(FL_BACKGROUND2_COLOR); inp_help_string->selection_color(FL_SELECTION_COLOR); inp_help_string->labeltype(FL_NORMAL_LABEL); inp_help_string->labelfont(0); inp_help_string->labelsize(13); inp_help_string->labelcolor(FL_FOREGROUND_COLOR); inp_help_string->callback((Fl_Callback*)cb_inp_help_string); inp_help_string->align(Fl_Align(FL_ALIGN_LEFT)); inp_help_string->when(FL_WHEN_ENTER_KEY); } // Fl_Input2* inp_help_string { btn_dxc_help_clear = new Fl_Button(517, 368, 71, 22, _("Clear")); btn_dxc_help_clear->tooltip(_("Clear help panel")); btn_dxc_help_clear->callback((Fl_Callback*)cb_btn_dxc_help_clear); } // Fl_Button* btn_dxc_help_clear tabDXclusterHelp->end(); } // Fl_Group* tabDXclusterHelp cluster_tabs->end(); Fl_Group::current()->resizable(cluster_tabs); } // Fl_Tabs* cluster_tabs o->end(); } // Fl_Double_Window* o return w; } fldigi-4.2.05/src/dxcluster/dx_dialog.fl0000664000175000017500000004202214611711171015044 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0304 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include "Fl_Text_Buffer_mod.H"} {private local } decl {Fl_Text_Buffer_mod telnet_txt_buffer;} {private local } decl {Fl_Text_Buffer_mod telnet_view_buffer;} {private local } decl {\#include "configuration.h"} {private local } decl {\#include "dx_cluster.h"} {private local } Function {dxc_window()} {open } { Fl_Window {} { label {DX Cluster Spotting} open xywh {902 41 680 400} type Double resizable visible } { Fl_Group btn_select_host {open xywh {1 2 678 50} box ENGRAVED_BOX } { Fl_Input inp_dxcc_host_url { label {DX HOST hostname/IP} callback {progdefaults.dxcc_host_url=o->value(); progdefaults.changed = true;} tooltip {telnet server URL} xywh {6 25 256 22} align 5 code0 {\#include "flinput2.h"} code1 {o->value(progdefaults.dxcc_host_url.c_str());} class Fl_Input2 } Fl_Button btn_show_host_tab { label {@2>} callback {cluster_tabs->value(tabDXclusterConfig); cluster_tabs->redraw();} xywh {263 25 20 22} } Fl_Input inp_dccc_host_port { label Port callback {progdefaults.dxcc_host_port=o->value(); progdefaults.changed = true;} tooltip {telnet server port} xywh {285 25 50 22} align 5 code1 {o->value(progdefaults.dxcc_host_port.c_str());} class Fl_Input2 } Fl_Input inp_dccc_login { label {Login as} callback {progdefaults.dxcc_login=o->value(); progdefaults.changed = true;} tooltip {login call sign} xywh {336 25 80 22} align 5 code1 {o->value(progdefaults.dxcc_login.c_str());} class Fl_Input2 } Fl_Input inp_dxcc_password { label Password callback {progdefaults.dxcc_password = o->value();} tooltip {Your login password} xywh {420 25 80 22} align 5 code0 {o->value(progdefaults.dxcc_password.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {inp_dxcc_password->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnDXCLUSTERpasswordShow { label {?} callback {inp_dxcc_password->type(inp_dxcc_password->type() ^ FL_SECRET_INPUT); inp_dxcc_password->redraw();} tooltip {Show password in plain text} xywh {503 25 22 22} } Fl_Check_Button btn_dxcc_connect { label Connect callback {progStatus.cluster_connected=o->value(); DXcluster_connect(o->value());} tooltip {Connect / Disconnect} xywh {571 10 101 15} down_box DOWN_BOX code0 {o->value(progStatus.cluster_connected);} code1 {\#include "status.h"} } Fl_Box lbl_dxc_connected { tooltip {Connected State} xywh {540 17 20 20} box DIAMOND_DOWN_BOX color 55 align 8 } Fl_Check_Button btn_dxc_auto_connect { label {Auto conn'} callback {progdefaults.dxc_auto_connect = o->value(); progdefaults.changed = true;} tooltip {Connect to host when starting fldigi} xywh {571 31 101 15} down_box DOWN_BOX code0 {o->value(progdefaults.dxc_auto_connect);} } } Fl_Tabs cluster_tabs {open xywh {0 55 680 340} resizable } { Fl_Group tabDXclusterTelNetStream { label {TelNet stream} open selected xywh {1 80 677 314} } { Fl_Group {} {open xywh {2 82 676 276} box ENGRAVED_FRAME } { Fl_Text_Editor brws_tcpip_stream { tooltip {Cluster server command strings} xywh {4 85 668 240} labelsize 13 textfont 13 resizable code0 {\#include "FTextView.h"} class FTextView } Fl_Button dxc_macro_1 { label m1 callback dxc_click_m1 tooltip {DX cluster macro\\nLeft click execute\\nRight click edit} xywh {4 331 80 22} code0 {o->label(progdefaults.dxcm_label_1.c_str());} } Fl_Button dxc_macro_2 { label m2 callback dxc_click_m2 xywh {88 331 80 22} code0 {o->label(progdefaults.dxcm_label_2.c_str());} } Fl_Button dxc_macro_3 { label m3 callback dxc_click_m3 xywh {172 331 80 22} code0 {o->label(progdefaults.dxcm_label_3.c_str());} } Fl_Button dxc_macro_4 { label m4 callback dxc_click_m4 xywh {256 331 80 22} code0 {o->label(progdefaults.dxcm_label_4.c_str());} } Fl_Button dxc_macro_5 { label m5 callback dxc_click_m5 xywh {340 331 80 22} code0 {o->label(progdefaults.dxcm_label_5.c_str());} } Fl_Button dxc_macro_6 { label m6 callback dxc_click_m6 xywh {424 331 80 22} code0 {o->label(progdefaults.dxcm_label_6.c_str());} } Fl_Button dxc_macro_7 { label m7 callback dxc_click_m7 xywh {508 331 80 22} code0 {o->label(progdefaults.dxcm_label_7.c_str());} } Fl_Button dxc_macro_8 { label m8 callback dxc_click_m8 tooltip {DX cluster macro\\nLeft click execute\\nRight click edit} xywh {592 331 80 22} code0 {o->label(progdefaults.dxcm_label_8.c_str());} } } Fl_Input inp_dxcluster_cmd { label {Cmd:} callback {DXcluster_submit();} tooltip {Command string} xywh {43 364 480 22} labelsize 13 when 8 class Fl_Input2 } Fl_Button btn_cluster_spot { label Spot callback {send_DXcluster_spot();} tooltip {Send SPOT string to server} xywh {527 364 70 22} } Fl_Button btn_cluster_submit { label Submit callback {DXcluster_submit();} tooltip {Send command to server} xywh {602 364 70 22} } } Fl_Group tabDXclusterReports { label {DX Reports} open xywh {1 80 673 314} hide } { Fl_Browser reports_header { xywh {3 84 671 20} color 52 when 2 textfont 4 } Fl_Browser brws_dx_cluster { callback {DXcluster_select();} tooltip {Left Click to select SPOT} xywh {3 104 671 260} type Hold align 18 textfont 4 resizable } Fl_Button btn_dxc_cluster_clear { label Clear callback {brws_dx_cluster->clear();} tooltip {Clear parsed data stream} xywh {294 366 72 22} } Fl_Check_Button brws_order { label {New entries in first line} callback {progdefaults.dxc_topline = o->value(); dxc_lines(); progdefaults.changed=true;} xywh {31 371 186 15} down_box DOWN_BOX when 1 code0 {o->value(progdefaults.dxc_topline);} } Fl_Button btn_cluster_spot2 { label Spot callback {send_DXcluster_spot();} tooltip {Send SPOT string to server} xywh {585 368 70 22} } } Fl_Group tabDXclusterConfig { label Config open tooltip {Initialization strings for telnet cluster host} xywh {0 80 676 314} hide } { Fl_Group {} {open xywh {0 82 676 130} resizable } { Fl_Group {} {open xywh {1 82 348 124} } { Fl_Browser brws_dxcluster_hosts { label Hosts xywh {5 100 278 100} type Hold align 1 textfont 4 resizable code0 {static int widths[]={o->w()*6/10, o->w()*2/10, o->w()*2/10, 0 };} code1 {o->column_widths(widths);} code2 {o->column_char(':');} code3 {dxcluster_hosts_load();} } Fl_Group {} {open xywh {286 100 61 100} } { Fl_Button btn_dxcluster_hosts_select { label Select callback dxcluster_hosts_select tooltip {Select highlighted DX cluster host} xywh {290 106 54 19} } Fl_Button btn_dxcluster_hosts_add { label Add callback dxcluster_hosts_add tooltip {Add current DX cluster host} xywh {290 128 54 19} } Fl_Button btn_dxcluster_hosts_delete { label Delete callback dxcluster_hosts_delete tooltip {Delete highlighted DX cluster host} xywh {290 151 54 19} } Fl_Button btn_dxcluster_servers { label Srvrs callback dxcluster_servers tooltip {Server List} xywh {290 174 54 19} } Fl_Group {} {open xywh {290 195 54 2} resizable } {} } } Fl_Group {} {open xywh {350 82 325 103} } { Fl_Text_Editor ed_telnet_cmds { label {Cluster Server Setup Cmds} tooltip {Cluster server command strings} xywh {354 100 248 80} textfont 13 resizable class FTextEdit } Fl_Group {} {open xywh {606 100 59 82} } { Fl_Button btn_dxcluster_hosts_load_setup { label Load callback dxcluster_hosts_load_setup tooltip {Load Cluster Setup Commands} xywh {610 106 54 19} } Fl_Button btn_dxcluster_hosts_save_setup { label Save callback dxcluster_hosts_save_setup tooltip {Save Cluster Setup Commands} xywh {610 128 54 19} } Fl_Button btn_dxcluster_hosts_send_setup { label Send callback dxcluster_hosts_send_setup tooltip {Send Commands to Cluster Server} xywh {610 151 54 19} } Fl_Group {} {open xywh {610 174 54 2} resizable } {} } } Fl_Check_Button btn_spot_when_logged { label {Spot when logged} callback {progdefaults.spot_when_logged = o->value(); progdefaults.changed = true;} tooltip {Create DX spot when logging contact} xywh {354 188 146 15} down_box DOWN_BOX code0 {o->value(progdefaults.spot_when_logged);} } Fl_Check_Button btn_dxc_hertz { label {Report [0..99 Hz]} callback {progdefaults.dxc_hertz = o->value(); progdefaults.changed = true;} tooltip {Add [0..99] Hz WF value to DX report notes} xywh {512 188 146 15} down_box DOWN_BOX code0 {o->value(progdefaults.dxc_hertz);} } } Fl_Group {} {open xywh {0 218 676 174} align 17 } { Fl_Group {} {open xywh {1 218 307 170} } { Fl_Input mlabel_1 { label {label 1} callback {progdefaults.dxcm_label_1=o->value(); dxc_macro_1->label(progdefaults.dxcm_label_1.c_str()); progdefaults.changed=true;} xywh {5 238 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_1.c_str());} } Fl_Input mtext_1 { label {macro text} callback {progdefaults.dxcm_text_1=o->value(); progdefaults.changed=true;} xywh {87 238 220 22} align 1 code0 {o->value(progdefaults.dxcm_text_1.c_str());} class Fl_Input2 } Fl_Input mlabel_2 { label {label 2} callback {progdefaults.dxcm_label_2=o->value(); dxc_macro_2->label(progdefaults.dxcm_label_2.c_str()); progdefaults.changed=true;} xywh {5 278 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_2.c_str());} } Fl_Input mtext_2 { callback {progdefaults.dxcm_text_2=o->value(); progdefaults.changed=true;} xywh {87 278 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_2.c_str());} class Fl_Input2 } Fl_Input mlabel_3 { label {label 3} callback {progdefaults.dxcm_label_3=o->value(); dxc_macro_3->label(progdefaults.dxcm_label_3.c_str()); progdefaults.changed=true;} xywh {5 318 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_3.c_str());} } Fl_Input mtext_3 { callback {progdefaults.dxcm_text_3=o->value(); progdefaults.changed=true;} xywh {87 318 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_3.c_str());} class Fl_Input2 } Fl_Input mlabel_4 { label {label 4} callback {progdefaults.dxcm_label_4=o->value(); dxc_macro_4->label(progdefaults.dxcm_label_4.c_str()); progdefaults.changed=true;} xywh {5 358 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_4.c_str());} } Fl_Input mtext_4 { callback {progdefaults.dxcm_text_4=o->value(); progdefaults.changed=true;} xywh {87 358 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_4.c_str());} class Fl_Input2 } } Fl_Group {} {open xywh {308 218 307 170} } { Fl_Input mlabel_5 { label {label 5} callback {progdefaults.dxcm_label_5=o->value(); dxc_macro_5->label(progdefaults.dxcm_label_5.c_str()); progdefaults.changed=true;} xywh {310 237 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_5.c_str());} } Fl_Input mtext_5 { label {macro text} callback {progdefaults.dxcm_text_5=o->value(); progdefaults.changed=true;} xywh {391 237 220 22} align 1 code0 {o->value(progdefaults.dxcm_text_5.c_str());} class Fl_Input2 } Fl_Input mlabel_6 { label {label 6} callback {progdefaults.dxcm_label_6=o->value(); dxc_macro_6->label(progdefaults.dxcm_label_6.c_str()); progdefaults.changed=true;} xywh {310 277 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_6.c_str());} } Fl_Input mtext_6 { callback {progdefaults.dxcm_text_6=o->value(); progdefaults.changed=true;} xywh {391 277 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_6.c_str());} class Fl_Input2 } Fl_Input mlabel_7 { label {label 7} callback {progdefaults.dxcm_label_7=o->value(); dxc_macro_7->label(progdefaults.dxcm_label_7.c_str()); progdefaults.changed=true;} xywh {310 317 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_7.c_str());} } Fl_Input mtext_7 { callback {progdefaults.dxcm_text_7=o->value(); progdefaults.changed=true;} xywh {391 317 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_7.c_str());} class Fl_Input2 } Fl_Input mlabel_8 { label {label 8} callback {progdefaults.dxcm_label_8=o->value(); dxc_macro_8->label(progdefaults.dxcm_label_8.c_str()); progdefaults.changed=true;} xywh {310 357 80 22} align 1 code0 {o->value(progdefaults.dxcm_label_8.c_str());} } Fl_Input mtext_8 { callback {progdefaults.dxcm_text_8=o->value(); progdefaults.changed=true;} xywh {391 357 220 22} align 17 code0 {o->value(progdefaults.dxcm_text_8.c_str());} class Fl_Input2 } } Fl_Button btn_dxcluster_ar_help { label {AR ?} callback dxcluster_ar_help tooltip {AR Commands} xywh {618 230 56 22} } Fl_Button btn_dxcluster_cc_help { label {CC ?} callback dxcluster_cc_help tooltip {CC Commands} xywh {618 272 56 22} } Fl_Button btn_dxcluster_dx_help { label {DX ?} callback dxcluster_dx_help tooltip {Spider Commands} xywh {618 315 56 22} } } } Fl_Group tabDXclusterHelp { label Help open xywh {1 80 675 314} hide } { Fl_Text_Editor brws_dxc_help { tooltip {Cluster server command strings} xywh {3 84 673 281} labelsize 13 textfont 13 resizable class FTextView } Fl_Button btn_dxc_help_query { label {Get Help} callback {dxc_help_query();} tooltip {Get WWV sunspot events} xywh {441 368 70 22} } Fl_Input inp_help_string { label {Help on:} callback {dxc_help_query();} tooltip {Leave blank for general help Enter subject, e.g. DX} xywh {265 368 172 22} labelsize 13 when 8 class Fl_Input2 } Fl_Button btn_dxc_help_clear { label Clear callback {dxc_help_clear()} tooltip {Clear help panel} xywh {517 368 71 22} } } } } } fldigi-4.2.05/src/dxcluster/CCC_Commands.cxx0000664000175000017500000005650214611711171015534 00000000000000std::string ccc_commands = "\n\ \n\ \n\ \n\ \n\ CCC Commands\n\ \n\ \n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\

CC Cluster Commands

\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
ANnounceSend an announcement to local USERs.  (AN<Text Message>)
ANnounce/FullSend an announcement to all nodes and USERs.  (AN/F <Text Message>)
BYEDisconnect from the node. (BYE) or (B)
DXSend a DX spot.  (DX <Callsign> <Frequency> or DX <Frequency> <Callsign>)
DXTestReturns  to USER only. (DXT P5NOW 14006.06) Good for testing RES 1 & RES 2
DIRShows mail messages on the node
DIR/BULLETINShows mail messages to ALL, BULLETIN and anything not to a call
DIR/NEWShows only mail messages you haven't seen since your last DIR
DIR/OWNShows only mail messages to you including messages to ALL & ones you sent
DIR/SUBJECTShows mail messages with subject you enter.  (DIR/SUBJECT ARL)
DELeteDelete mail messages. (DEL (Msg #) (DEL 1-99) Deletes your messages from 1 to 99
KillDelete mail messages.  (K (Msg #) (K 1-99) Deletes your messages from 1 to 99
ListShows mail messages on the node
List/NEWShows only mail messages you haven't seen since your last DIR or L
List/OWNShows only mail messages to you including messages to ALL & ones you sent
QUITDisconnect from the node
READRead cluster mail.  (READ <Message #>)  See Mail Send/Receive below
REplyREply without a number following replies to the last mail message you read. \n\ REply <#> replies to the message with that number given. \n\ REply/DELete replies to message and deletes it.  REply/DELete/RR replies\n\ to message, delets message and gets a return receipt.  REply/RR replies\n\ to message and gets a return receipt. 
SEND(SEND <Callsign>) Sends mail  to that callsign. SEND <LOCAL>\n\ to just send a message to local node USERs.  SEND <ALL>, SEND\n\ <FORSALE> and SEND <DXNEWS> will be passed to all nodes for all USERs.
SET/ANNTurn on announcements
SET/BEACONTurn on beacon spots.  These are spots ending in \"/B\" or \"BCN\"
SET/BEEPTurn on a beep for DX and Announcement spots
SET/BOBTurn on bottom of band DX spots
SET/DXTurn on DX spot announcements
SET/DXCQTurn on CQ Zone in DX info for DX spots
SET/DXITUTurn on ITU Zone in DX info for DX spots
SET/DXSTurn on US state/province or country in DX info for DX spots
SET/USSTATETurn on US\n\ state or Canadian province spotter in DX info for DX spots
SET/FILTERSee Band\n\ & Mode Filtering Below
SET/GRIDTurns on DX\n\ Grid, toggles CQ Zone, ITU Zone, & US State to off
SET/HOMETell cluster\n\ your home node. (SET/HOME <Node Call>) If you normally connect to\n\ K8SMC then it would be (SET/HOME K8SMC) 
SET/LOCATIONSet your location (lat/lon) of your station.  (SET/LOCATION 42 17 N 84 21 W)
SET/LOGINTells cluster to send USER connects and disconnects.
SET/NAMESet your name (SET/NAME <First Name>)
SET/NOANNTurn off announcements.
SET/NOBEACONTurn off beacon spots.  These are spots ending in \"/B\" or \"BCN\"
SET/NOBEEPTurn off a beep for DX and Announcement spots\n\ .
SET/NOBOBTurn off bottom of band DX spots.
SET/NOCQTurn off CQ Zone in spot announcements.
SET/NODXTurn off DX spot announcements.
SET/NODXCQTurn off CQ Zone in DX info for DX spots
SET/NODXITUTurn off ITU Zone in DX info for DX spots
SET/NODXSTurn off US state/province or country in DX info for DX spots
SET/NOUSSTATETurn off US state or Canadian province spotter in DX info for DX spots
SET/NOGRIDTurn off DX Grids in spot announcements
SET/NOITUTurn off ITU Zone in spot announcements
SET/NOLOGINStops cluster from sending USER connects and disconnects
SET/NOOWNTurn off skimmer spots for your own call
SET/NOSELFTurn off self spots by other users
SET/NOSKIMMERTurn off Skimmer spots
SET/NOTALKTurn off the display of talk messages
SET/NOWCYTurn off the display of WCY spots
SET/NOWWVTurn off the display of WWV spots
SET/NOWXTurn off the display of weather announcements
SET/OWNTurn on Skimmer spots for own call
SET/NOLOGINStops cluster from sending USER connects and disconnects
SET/QRAInput your Grid Square. (SET/QRA EN72)
SET/QTHSet your city and state. (SET/QTH <City, State>) DX <City, Country>
SET/RES 1Tells CC-Cluster to give you 1 decimal point rounding in DX spots
SET/RES 2Tells CC-Cluster to give you 2 decimal point rounding in DX spots
SET/SELFTurn on self spots by other users
SET/SKIMMERTurn on Skimmer spots
SET/TALKTurn on the display of talk messages
SET/USSTATETurns on US State, toggles CQ Zone, DX Grid, & ITU Zone to off
SET/WCYTurn on the display of WCY spots
SET/WIDTHSets the line width for DX spots, normally this has been 80 characters.  Depending\n\ on your logging program you can use anything between 45 to 130\n\ characters,  SET/WIDTH XX where XX is the number of characters.
SET/WWVTurn on the display of WWV spots
SET/WXTurn on the display of weather announcements
SHow/CLNode Info and CCC Uptime  See SH/VERSION 
SHow/CONFShows nodes and callsigns of USERs, only nodes called LOCAL by Sysop.
SHow/DXShows last 30 spots
SHow/DX <Call>Shows last 30 spots for that call
SHow/DX/<number>Shows that number of spots.  SH/DX/100
SHow/DX <Band>Shows spots on that band.  SH/DX 20  for 20 meters
SHow/DX/ <Freq>Shows spots by frequency range.  Syntax = SH/DX 7020-7130
SHow/DX <prefix*>Shows all spots for a country, standard prefix not necessary, asterisk needed
SHow/DX 'rtty'Shows spots where the comment field contains (rtty)
SHow/DXBY <call>Shows spots where spotter = Call
SHow/FDXShows real time formatted dx spots.
SHow/FILTERShows how you have your filters set.
SHow/HEAD <Call>Shows heading - distance and bearing for the\n\ call.
SHow/MYANNShows last 5 announcements allowed by your filter settings.
SHow/MYDXShows last 30 spots allowed by your filter settings
SHow/MYDX <Call>Shows last 30 spots for the call allowed by your filter settings.
SHow/MYDX/<number>Shows that number of spots allowed by your filter.  SH/MYDX/100
SHow/MYDX <Band>Shows spots on that band allowed by your filter settings.  SH/MYDX 20  for 20 meters
SHow/MYFDXShows last 30 spots allowed by your filter settings.  
SHow/MYWXShows last 5 weather announcements allowed by your filter settings.
SHow/RESShows the number of digits after the decimal point for frequencies
SHow/SETTINGSShows information on the node for your call and how you are setup.
SHow/STATIONShows information on the node for a station.  (SH/STA <Callsign>)
SHow/SUNShows local sunrise and sunset times.  (SH/SUN <Prefix.) for that country
SHow/TIMEShows GMT time.
SHow/TIME <Call>Shows local time for the call.
SHow/USDBShows State/Province for US/VE calls.  (SH/USDB <Callsign>)
SHow/USERSShows callsigns of everyone connected to the local node.
SHow/VERSIONShows the CCC Uptime for connections.
SHow/WIDTHShows the length of a DX Spot. Normally 80 characters.
SHow/WWVShows WWV info, (SH/WWV) gives last 5 (SH/WWV/99) gives last 99
SHow/WCYShows last 5 DK0WCY, similar to WWV
TalkSend a talk message to someone on the node.  (T<Callsign> <Message>)
UNSET/This command can be used instead of SET/NO, Compatibility for DX-Spider USERs
WHOThis command will return a list of connections in alphabetical order.  Items are: Call User/Node Name IP/AGW
WXThe command \"WX\" will send a local weather announcement.  (WX Sunny and Warm)
\n\
\n\ \n\   \n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\
Most Common Used Filter Commands
\n\
\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
Filter Settings:Filters are mostly default to off, but one simple setting for say someone in the US or Canada\n\ that is happy seeing spots from just the US and Canada can do a quick setting for this: SET/FILTER K,VE/PASS
SH/FILTERShows all of your USER\n\ filter settings
SH/FILTER <aaa>Show setting for specific filter, <aaa> = filter name.
\n\ SH/FILTER DOC = DX Origination Country
\n\ SH/FILTER DOS = DX Origination State
\n\ SH/FILTER AOC = Announce Origination Country
\n\ SH/FILTER AOS = Announce Origination State
\n\ SH/FILTER WOC = Weather Origination Country
\n\ SH/FILTER WOS = Weather Origination State
\n\ SH/FILTER DXCTY = DX spot CounTrY
\n\ SH/FILTER DXSTATE = DX spot STATE 
SET/NOFILTERResets all filters to default.  If you suspect you have\n\ entered invalid filter command or commands, reset and start over.
SET/FILTER <aaa>/OFFTurn off specific filter.  <aaa> = filter name (see SH/FILTER <aaa>)
SET/FILTER K,VE/PASSThis would be the most common filter setting for say someone\n\ in the United States or Canada to set so as to only see spots that\n\ originated in the US or Canada. 
SET/FILTER <aaa>/<p/r> <bbb>Set specific filter.
\n\ <aaa> = filter name (see SH/FILTER <aaa>
\n\ <p/r> = PASS or REJECT
\n\ <bbb> = Country or State
\n\ Example #1:  SET/FILTER DOC/PASS EA,OH,G  This would set your\n\ filter to pass originated spots from Spain, Finland and England only.
\n\ Example #2:  SET/FILTER DXCTY/PASS F,OH  This would set\n\ your filter to pass spots for France and Finland only.
DX Band Mode FilteringThe DXBM filter has many variations for your settings, it\n\ is defaulted to receive all DX spots for all modes from 160 to 10 meters,\n\ (see Band & Mode Filtering below).
\n\
\n\
\n\

 

\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\

Band & Mode Filtering

\n\
\n\
\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
You can tailor the DX spots from CC Cluster to only the bands and modes that interest you.
The default setting for new users is to receive all DX\n\ spots from 160 to 10 meters, all modes.
To reset the band/mode filter to pass everything, enter \"SET/FILTER DXBM/OFF\".
To display your current settings, enter \"SH/FILTER DXBM\".
You can change any band or band/mode
You can set the band or band/mode to either pass or reject.
You can add items one at a time, or all at once.
 
For example:
To add 6 meters, you enter \"SET/FILTER DXBM/PASS 6\".
\n\ To delete 80 meter and 40 meter CW, enter \"SET/FILTER DXBM/REJECT 80-CW,40-CW\"
 
Although the band/mode has a \"mode\" name, it does not mean\n\ that when you select 40-RTTY that you are selecting only RTTY spots. What it\n\ really means is that you are selecting the frequency range in the following\n\ table that corresponds to this name. In this case 7040-7100. The actual\n\ mode may be anything. The only thing you have selected is a frequency range.
 
\n\
\n\
\n\
\n\
\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
DXBM Frequencies
Band ModeLowHighBand ModeLowHighBand ModeLowHigh
160-CW18001850   160-SSB18502000
80-CW3500358080-RTTY3580370080-SSB37004000
      60-SSB52605405
40-CW7000704040-RTTY7040710040-SSB71007300
30-CW101001013030-RTTY1013010150   
20-CW140001407020-RTTY140701415020-SSB1415014350
17-CW180681810017-RTTY181001811017-SSB1811018168
15-CW210002107015-RTTY210702120015-SSB2120021450
12-CW248902492012-RTTY249202493012-SSB2493024990
10-CW280002807010-RTTY280702830010-SSB2830029700
6-CW50000500806-SSB50080505006-FM5050054000
      4-MTR7000070650
2-CW1440001441002-SSB1441001445002-FM144500148000
1-CW2200002210001-SSB2220002240001-FM221000222000
      MW-MW50000047000000
\n\
\n\
\n\
\n\
\n\ \n\ "; fldigi-4.2.05/src/dxcluster/DXSpiderCommandReference.cxx0000664000175000017500000032710614611711171020124 00000000000000std::string dxspider_cmds = "\n\ \n\ \n\ \n\ \n\ DX Spider Command Reference\n\ \n\ \n\

DXSpider Command Reference

\n\
\n\
\n\
\n\
\n\

Contents

\n\
\n\
\n\
\n\
\n\
\n\
    \n\
  • 1 ACCEPT\n\
      \n\
    • 1.1 accept/announce
    • \n\
    • 1.2 accept/spots
    • \n\
    • 1.3 accept/wcy
    • \n\
    • 1.4 accept/wwv
    • \n\
    \n\
  • \n\
  • 2 ANNOUNCE\n\
      \n\
    • 2.1 announce
    • \n\
    • 2.2 announce\n\ full
    • \n\
    \n\
  • \n\
  • 3 APROPOS\n\
      \n\
    • 3.1 apropos
    • \n\
    \n\
  • \n\
  • 4 BLANK\n\
      \n\
    • 4.1 blank
    • \n\
    \n\
  • \n\
  • 5 BYE\n\
      \n\
    • 5.1 bye
    • \n\
    \n\
  • \n\
  • 6 CHAT\n\
      \n\
    • 6.1 chat
    • \n\
    \n\
  • \n\
  • 7 CLEAR\n\
      \n\
    • 7.1 clear/announce
    • \n\
    • 7.2 clear/route
    • \n\
    • 7.3 clear/spots\n\ [0-9|all]
    • \n\
    • 7.4 clear/wcy
    • \n\
    • 7.5 clear/wwv
    • \n\
    \n\
  • \n\
  • 8 DATABASES\n\
      \n\
    • 8.1 dbavail
    • \n\
    • 8.2 dbshow
    • \n\
    \n\
  • \n\
  • 9 MAIL\n\
      \n\
    • 9.1 directory
    • \n\
    • 9.2 directory\n\ <from>-<to>
    • \n\
    • 9.3 directory\n\ <nn>
    • \n\
    • 9.4 directory\n\ all
    • \n\
    • 9.5 directory\n\ from <call>
    • \n\
    • 9.6 directory\n\ new
    • \n\
    • 9.7 directory\n\ own
    • \n\
    • 9.8 directory\n\ subject <string>
    • \n\
    • 9.9 directory\n\ to <call>
    • \n\
    \n\
  • \n\
  • 10 DX\n\
      \n\
    • 10.1 dx\n\ [by <call>] <freq> <call>\n\ <remarks>
    • \n\
    \n\
  • \n\
  • 11 ECHO\n\
      \n\
    • 11.1 echo\n\ <line>
    • \n\
    \n\
  • \n\
  • 12 FILTERING\n\
      \n\
    • 12.1 filtering...
    • \n\
    \n\
  • \n\
  • 13 HELP\n\
      \n\
    • 13.1 help
    • \n\
    \n\
  • \n\
  • 14 JOIN\n\
      \n\
    • 14.1 join\n\ <group>
    • \n\
    \n\
  • \n\
  • 15 KILL\n\
      \n\
    • 15.1 kill\n\ <from msgno>-<to msgno>
    • \n\
    • 15.2 kill\n\ <msgno> [<msgno..]
    • \n\
    • 15.3 kill\n\ <msgno> [<msgno> ...]
    • \n\
    • 15.4 kill\n\ from <regex>
    • \n\
    • 15.5 kill\n\ to <regex>
    • \n\
    \n\
  • \n\
  • 16 LEAVE\n\
      \n\
    • 16.1 leave\n\ <group>
    • \n\
    \n\
  • \n\
  • 17 LINKS\n\
      \n\
    • 17.1 links
    • \n\
    \n\
  • \n\
  • 18 READ\n\
      \n\
    • 18.1 read
    • \n\
    • 18.2 read\n\ <msgno>
    • \n\
    \n\
  • \n\
  • 19 REJECT\n\
      \n\
    • 19.1 reject
    • \n\
    • 19.2 reject/announce\n\ [0-9] <pattern>
    • \n\
    • 19.3 reject/spots\n\ [0-9] <pattern>
    • \n\
    • 19.4 reject/wcy\n\ [0-9] <pattern>
    • \n\
    • 19.5 reject/wwv\n\ [0-9] <pattern>
    • \n\
    \n\
  • \n\
  • 20 REPLY\n\
      \n\
    • 20.1 reply
    • \n\
    • 20.2 reply\n\ <msgno>
    • \n\
    • 20.3 reply\n\ b <msgno>
    • \n\
    • 20.4 reply\n\ noprivate <msgno>
    • \n\
    • 20.5 reply\n\ rr <msgno>
    • \n\
    \n\
  • \n\
  • 21 SEND\n\
      \n\
    • 21.1 send\n\ <call> [<call> ...]
    • \n\
    • 21.2 send\n\ copy <msgno> <call>
    • \n\
    • 21.3 send\n\ noprivate <call>
    • \n\
    • 21.4 send\n\ private <call>
    • \n\
    • 21.5 send\n\ rr <call>
    • \n\
    \n\
  • \n\
  • 22 SET\n\
      \n\
    • 22.1 set/address\n\ <your address>
    • \n\
    • 22.2 set/announce
    • \n\
    • 22.3 set/anntalk
    • \n\
    • 22.4 set/beep
    • \n\
    • 22.5 set/dx
    • \n\
    • 22.6 set/dxcq
    • \n\
    • 22.7 set/dxgrid
    • \n\
    • 22.8 set/dxitu
    • \n\
    • 22.9 set/echo
    • \n\
    • 22.10 set/email\n\ <email>
    • \n\
    • 22.11 set/here
    • \n\
    • 22.12 set/homenode\n\ <node>
    • \n\
    • 22.13 set/language\n\ <lang>
    • \n\
    • 22.14 set/location\n\ <lat & long>
    • \n\
    • 22.15 set/logininfo
    • \n\
    • 22.16 set/name\n\ <your name>
    • \n\
    • 22.17 set/page\n\ <lines per page>
    • \n\
    • 22.18 set/password
    • \n\
    • 22.19 set/prompt\n\ <string>
    • \n\
    • 22.20 set/qra\n\ <locator>
    • \n\
    • 22.21 set/qth\n\ <your qth>
    • \n\
    • 22.22 set/startup
    • \n\
    • 22.23 set/talk
    • \n\
    • 22.24 set/usstate
    • \n\
    • 22.25 set/wcy
    • \n\
    • 22.26 set/wwv
    • \n\
    • 22.27 set/wx
    • \n\
    \n\
  • \n\
  • 23 SHOW\n\
      \n\
    • 23.1 show/chat
    • \n\
    • 23.2 show/configuration
    • \n\
    • 23.3 show/configuration/node
    • \n\
    • 23.4 show/contest
    • \n\
    • 23.5 show/date
    • \n\
    • 23.6 show/db0sdx
    • \n\
    • 23.7 show/dx
    • \n\
    • 23.8 show/dxcc
    • \n\
    • 23.9 show/dxqsl
    • \n\
    • 23.10 show/dxstats
    • \n\
    • 23.11 show/fdx
    • \n\
    • 23.12 show/files
    • \n\
    • 23.13 show/filter
    • \n\
    • 23.14 show/hfstats
    • \n\
    • 23.15 show/hftable
    • \n\
    • 23.16 show/moon
    • \n\
    • 23.17 show/muf
    • \n\
    • 23.18 show/mydx
    • \n\
    • 23.19 show/newconfiguration
    • \n\
    • 23.20 show/newconfiguration/node
    • \n\
    • 23.21 show/prefix
    • \n\
    • 23.22 show/qra
    • \n\
    • 23.23 show/qrz
    • \n\
    • 23.24 show/route
    • \n\
    • 23.25 show/satellite
    • \n\
    • 23.26 show/startup
    • \n\
    • 23.27 show/station
    • \n\
    • 23.28 show/sun
    • \n\
    • 23.29 show/time
    • \n\
    • 23.30 show/usdb
    • \n\
    • 23.31 show/vhfstats
    • \n\
    • 23.32 show/vhftable
    • \n\
    • 23.33 show/wcy
    • \n\
    • 23.34 show/wm7d
    • \n\
    • 23.35 show/wwv
    • \n\
    • 23.36 sysop
    • \n\
    • 23.37 talk
    • \n\
    • 23.38 type
    • \n\
    • 23.39 unset/announce
    • \n\
    • 23.40 unset/anntalk
    • \n\
    • 23.41 unset/beep
    • \n\
    • 23.42 unset/dx
    • \n\
    • 23.43 unset/dxcq
    • \n\
    • 23.44 unset/dxgrid
    • \n\
    • 23.45 unset/dxitu
    • \n\
    • 23.46 unset/echo
    • \n\
    • 23.47 unset/email
    • \n\
    • 23.48 unset/here
    • \n\
    • 23.49 unset/logininfo
    • \n\
    • 23.50 unset/privilege
    • \n\
    • 23.51 unset/prompt
    • \n\
    • 23.52 unset/startup
    • \n\
    • 23.53 unset/talk
    • \n\
    • 23.54 unset/usstate
    • \n\
    • 23.55 unset/wcy
    • \n\
    • 23.56 unset/wwv
    • \n\
    • 23.57 unset/wx
    • \n\
    • 23.58 who
    • \n\
    • 23.59 wx
    • \n\
    \n\
  • \n\
\n\
\n\

ACCEPT

\n\
    \n\
  • accept - Set a filter to accept something\n\
  • \n\
\n\

There are 2 types of filter, accept and reject. See HELP\n\ FILTERING for more info.\n\

\n\

accept/announce

\n\
    \n\
  • accept/announce [0-9] <pattern> Set an 'accept' filter\n\ line for announce\n\
  • \n\
\n\

Create an 'accept this announce' line for a filter.\n\

\n\

An accept filter line means that if the announce matches this\n\ filter it is passed onto the user. See HELP FILTERING for more\n\ info. Please read this to understand how filters work - it will\n\ save a lot of grief later on.\n\ You can use any of the following things in this line:-\n\

\n\
info <string>            eg: iota or qsl\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
origin_state <states>                eg: VA,NH,RI,NH\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
by_state <states>\n\
channel <prefixes>\n\
wx 1                     filter WX announces\n\
dest <prefixes>          eg: 6MUK,WDX      (distros)\n\
\n\

some examples:-\n\

\n\
acc/ann dest 6MUK\n\
acc/ann 2 by_zone 14,15,16\n\
(this could be all on one line: acc/ann dest 6MUK or by_zone 14,15,16)\n\
\n\

or\n\

\n\
acc/ann by G,M,2\n\
\n\

for american states\n\

\n\
acc/ann by_state va,nh,ri,nh\n\
\n\

You can use the tag 'all' to accept everything eg:\n\

\n\
acc/ann all\n\
\n\

but this probably for advanced users...\n\

\n\

accept/spots

\n\
    \n\
  • accept/spots [0-9] <pattern> Set an 'accept' filter line\n\ for spots\n\
  • \n\
\n\

Create an 'accept this spot' line for a filter.\n\

\n\

An accept filter line means that if the spot matches this filter\n\ it is passed onto the user. See HELP FILTERING for more info.\n\ Please read this to understand how filters work - it will save a\n\ lot of grief later on.\n\

\n\

You can use any of the following things in this line:-\n\

\n\
freq <range>           eg: 0/30000 or hf or hf/cw or 6m,4m,2m\n\
on <range>             same as 'freq'\n\
call <prefixes>        eg: G,PA,HB9\n\
info <string>          eg: iota or qsl\n\
by <prefixes>\n\
call_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
call_itu <prefixes or numbers>     or: G,GM,GW\n\
call_zone <prefixes or numbers>\n\
call_state <states>                eg: VA,NH,RI,ME\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
by_state <states>                eg: VA,NH,RI,ME\n\
origin <prefixes>\n\
channel <prefixes>\n\
\n\

For frequencies, you can use any of the band names defined in\n\ SHOW/BANDS and you can use a subband name like: cw, rtty, data,\n\ ssb - thus: hf/ssb. You can also just have a simple range like:\n\ 0/30000 - this is more efficient than saying simply: freq HF (but\n\ don't get too hung up about that)\n\

\n\

some examples:-\n\

\n\
acc/spot 1 on hf/cw\n\
acc/spot 2 on vhf and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

You can use the tag 'all' to accept everything, eg:\n\

\n\
acc/spot 3 all\n\
\n\

for US states\n\

\n\
acc/spots by_state VA,NH,RI,MA,ME\n\
\n\

but this probably for advanced users...\n\

\n\

accept/wcy

\n\
    \n\
  • accept/wcy [0-9] <pattern> set an 'accept' WCY filter\n\
  • \n\
\n\

It is unlikely that you will want to do this, but if you do then\n\ you can filter on the following fields:-\n\

\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
channel <prefixes>\n\
\n\

There are no examples because WCY Broadcasts only come from one\n\ place and you either want them or not (see UNSET/WCY if you don't\n\ want them).\n\

\n\

This command is really provided for future use.\n\

\n\

See HELP FILTER for information.\n\

\n\

accept/wwv

\n\
    \n\
  • accept/wwv [0-9] <pattern> set an 'accept' WWV filter\n\
  • \n\
\n\

It is unlikely that you will want to do this, but if you do then\n\ you can filter on the following fields:-\n\

\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
channel <prefixes>\n\
\n\

for example\n\

\n\
accept/wwv by_zone 4\n\
\n\

is probably the only useful thing to do (which will only show WWV\n\ broadcasts by stations in the US).\n\

\n\

See HELP FILTER for information.\n\

\n\

ANNOUNCE

\n\

announce

\n\
    \n\
  • announce <text> Send an announcement to LOCAL users only\n\
  • \n\
\n\

<text> is the text of the announcement you wish to\n\ broadcast\n\

\n\

announce full

\n\
    \n\
  • announce full <text> Send an announcement cluster wide\n\
  • \n\
\n\

This will send your announcement cluster wide\n\

\n\

APROPOS

\n\

apropos

\n\
    \n\
  • apropos <string> Search help database for <string>\n\
  • \n\
\n\

Search the help database for <string> (it isn't case\n\ sensitive), and print the names of all the commands that may be\n\ relevant.\n\

\n\

BLANK

\n\

blank

\n\
    \n\
  • blank [<string>] [<nn>] Print nn (default 1) blank\n\ lines (or strings)\n\
  • \n\
\n\

In its basic form this command prints one or more blank lines.\n\ However if you pass it a string it will replicate the string for\n\ the width of the screen (default 80) and then print that one or\n\ more times, so:\n\

\n\
blank 2\n\
\n\

prints two blank lines\n\

\n\
blank -\n\
\n\

prints a row of - characters once.\n\

\n\
blank abc\n\
\n\

prints 'abcabcabcabcabcabc....'\n\

\n\

This is really only of any use in a script file and you can print\n\ a maximum of 9 lines.\n\

\n\

BYE

\n\

bye

\n\
    \n\
  • bye Exit from the cluster\n\
  • \n\
\n\

This will disconnect you from the cluster\n\

\n\

CHAT

\n\

chat

\n\
    \n\
  • chat <group> <text> Chat or Conference to a group\n\
  • \n\
\n\

It is now possible to JOIN a group and have network wide\n\ conferencing to that group. DXSpider does not (and probably will\n\ not) implement the AK1A conference mode as this seems very\n\ limiting, is hardly used and doesn't seem to work too well anyway.\n\

\n\

This system uses the existing ANN system and is compatible with\n\ both other DXSpider nodes and AK1A clusters (they use\n\ ANN/<group>).\n\

\n\

You can be a member of as many \"groups\" as you want. To join a\n\ group type:-\n\

\n\
JOIN FOC    (where FOC is the group name)\n\
\n\

To leave a group type:-\n\

\n\
LEAVE FOC\n\
\n\

You can see which groups you are in by typing:-\n\

\n\
STAT/USER\n\
\n\

and you can see whether your mate is in the group, if he connects\n\ to the same node as you, by typing:-\n\

\n\
STAT/USER g1tlh\n\
\n\

To send a message to a group type:-\n\

\n\
CHAT FOC hello everyone\n\
\n\

or\n\

\n\
CH #9000 hello I am back\n\
\n\

See also JOIN, LEAVE, SHOW/CHAT\n\

\n\

CLEAR

\n\

clear/announce

\n\
    \n\
  • clear/announce [1|all] Clear a announce filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a annouce\n\ filter or to remove the whole filter. See CLEAR/SPOTS for a more\n\ detailed explanation.\n\

\n\

clear/route

\n\
    \n\
  • clear/route [1|all] Clear a route filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a route\n\ filter or to remove the whole filter. See CLEAR/SPOTS for a more\n\ detailed explanation.\n\

\n\

clear/spots\n\ [0-9|all]

\n\
    \n\
  • clear/spots [0-9|all] Clear a spot filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a spot filter\n\ or to remove the whole filter.\n\

\n\

If you have a filter:-\n\

\n\
acc/spot 1 on hf/cw\n\
acc/spot 2 on vhf and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

and you say:-\n\

\n\
clear/spot 1\n\
\n\

you will be left with:-\n\

\n\
acc/spot 2 on vhf and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

If you do:\n\

\n\
clear/spot all\n\
\n\

the filter will be completely removed.\n\

\n\

clear/wcy

\n\
    \n\
  • clear/wcy [1|all] Clear a WCY filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a WCY filter\n\ or to remove the whole filter. See CLEAR/SPOTS for a more detailed\n\ explanation.\n\

\n\

clear/wwv

\n\
    \n\
  • clear/wwv [1|all] Clear a WWV filter line\n\
  • \n\
\n\

This command allows you to clear (remove) a line in a WWV filter\n\ or to remove the whole filter. See CLEAR/SPOTS for a more detailed\n\ explanation.\n\

\n\

DATABASES

\n\

dbavail

\n\
    \n\
  • dbavail - Show a list of all the Databases in the system\n\
  • \n\
\n\

The name says it all really, this command lists all the databases\n\ defined in the system. It is also aliased to SHOW/COMMAND.\n\

\n\

dbshow

\n\
    \n\
  • dbshow <dbname> <key> - Display an entry, if it\n\ exists, in a database\n\
  • \n\
\n\

This is the generic user interface to the database to the\n\ database system. It is expected that the sysop will add an entry\n\ to the local Aliases file so that users can use the more familiar\n\ AK1A style of enquiry such as:\n\

\n\
SH/BUCK G1TLH\n\
\n\

but if he hasn't and the database really does exist (use DBAVAIL\n\ or SHOW/COMMAND to find out) you can do the same thing with:\n\

\n\
DBSHOW buck G1TLH\n\
\n\

MAIL

\n\

directory

\n\
    \n\
  • directory - List messages\n\
  • \n\
\n\

directory\n\ <from>-<to>

\n\
    \n\
  • directory <from>-<to> - List messages <from>\n\ message <to> message\n\
  • \n\
\n\

List the messages in the messages directory.\n\

\n\

If there is a 'p' one space after the message number then it is a\n\ personal message. If there is a '-' between the message number and\n\ the 'p' then this indicates the message has been read.\n\

\n\

You can use shell escape characters such as '*' and '?' in the\n\ <call> fields.\n\

\n\

You can also combine some of the various directory commands\n\ together eg:-\n\

\n\
DIR TO G1TLH 5\n\
\n\

or\n\

\n\
DIR SUBJECT IOTA 200-250\n\
\n\

You can abbreviate all the commands to one letter and use ak1a\n\ syntax:-\n\

\n\
DIR/T G1* 10\n\
DIR/S QSL 10-100 5\n\
\n\

directory\n\ <nn>

\n\
    \n\
  • directory <nn> - List last <nn> messages\n\
  • \n\
\n\

directory all

\n\
    \n\
  • directory all - List all messages\n\
  • \n\
\n\

directory\n\ from <call>

\n\
    \n\
  • directory from <call> - List all messages from\n\ <call>\n\
  • \n\
\n\

directory new

\n\
    \n\
  • directory new - List all new messages\n\
  • \n\
\n\

directory own

\n\
    \n\
  • directory own - List your own messages\n\
  • \n\
\n\

directory\n\ subject <string>

\n\
    \n\
  • directory subject <string> - List all messages with\n\ <string> in subject\n\
  • \n\
\n\

directory\n\ to <call>

\n\
    \n\
  • directory to <call> - List all messages to <call>\n\
  • \n\
\n\

DX

\n\

dx\n\ [by <call>] <freq> <call> <remarks>

\n\
    \n\
  • dx [by <call>] <freq> <call> <remarks>\n\ - Send a DX spot\n\
  • \n\
\n\

This is how you send a DX Spot to other users. You can, in fact,\n\ now enter the <freq> and the <call> either way round.\n\

\n\
DX FR0G 144.600\n\
DX 144.600 FR0G\n\
DX 144600 FR0G\n\
\n\

will all give the same result. You can add some remarks to the\n\ end of the command and they will be added to the spot.\n\

\n\
DX FR0G 144600 this is a test\n\
\n\

You can credit someone else by saying:-\n\

\n\
DX by G1TLH FR0G 144.600 he isn't on the cluster\n\
\n\

The <freq> is compared against the available bands set up\n\ in the cluster. See SHOW/BANDS for more information.\n\

\n\

ECHO

\n\

echo <line>

\n\
    \n\
  • echo <line> - Echo the line to the output\n\
  • \n\
\n\

This command is useful in scripts and so forth for printing the\n\ line that you give to the command to the output. You can use this\n\ in user_default scripts and the SAVE command for titling and so\n\ forth.\n\

\n\

The script will interpret certain standard \"escape\" sequences as\n\ follows:-\n\

\n\
\\t - becomes a TAB character (0x09 in ascii)\n\
\\a - becomes a BEEP character (0x07 in ascii)\n\
\\n - prints a new line\n\
\n\

So the following example:-\n\

\n\
echo GB7DJK is a dxcluster\n\
\n\

produces:-\n\

\n\
GB7DJK is a dxcluster\n\
\n\

on the output. You don't need a \\n on the end of the line you\n\ want to send.\n\

\n\

A more complex example:-\n\

\n\
echo GB7DJK\\n\\tg1tlh\\tDirk\\n\\tg3xvf\\tRichard\n\
\n\

produces:-\n\

\n\
GB7DJK\n\
g1tlh   Dirk\n\
g3xvf   Richard\n\
\n\

on the output.\n\

\n\

FILTERING

\n\

filtering...

\n\
    \n\
  • filtering... - Filtering things in DXSpider\n\
  • \n\
\n\

There are a number of things you can filter in the DXSpider\n\ system. They all use the same general mechanism.\n\

\n\

In general terms you can create a 'reject' or an 'accept' filter\n\ which can have up to 10 lines in it. You do this using, for\n\ example:-\n\

\n\
accept/spots .....\n\
reject/spots .....\n\
\n\

where ..... are the specific commands for that type of filter.\n\ There are filters for spots, wwv, announce, wcy and (for sysops)\n\ connects. See each different accept or reject command reference\n\ for more details.\n\

\n\

There is also a command to clear out one or more lines in a\n\ filter and one to show you what you have set. They are:-\n\

\n\
clear/spots 1\n\
clear/spots all\n\
\n\

and\n\

\n\
show/filter\n\
\n\

There is clear/xxxx command for each type of filter.\n\

\n\

For now we are going to use spots for the examples, but you can\n\ apply the principles to all types of filter.\n\

\n\

There are two main types of filter 'accept' or 'reject'; which\n\ you use depends entirely on how you look at the world and what is\n\ least writing to achieve what you want. Each filter has 10 lines\n\ (of any length) which are tried in order. If a line matches then\n\ the action you have specified is taken (ie reject means ignore it\n\ and accept means gimme it).\n\

\n\

The important thing to remember is that if you specify a 'reject'\n\ filter (all the lines in it say 'reject/spots' (for instance))\n\ then if a spot comes in that doesn't match any of the lines then\n\ you will get it BUT if you specify an 'accept' filter then any\n\ spots that don't match are dumped. For example if I have a one\n\ line accept filter:-\n\

\n\
accept/spots on vhf and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

then automatically you will ONLY get VHF spots from or to CQ\n\ zones 14 15 and 16. If you set a reject filter like:\n\

\n\
reject/spots on hf/cw\n\
\n\

Then you will get everything EXCEPT HF CW spots, If you am\n\ interested in IOTA and will work it even on CW then you could\n\ say:-\n\

\n\
reject/spots on hf/cw and not info iota\n\
\n\

But in that case you might only be interested in iota and say:-\n\

\n\
accept/spots not on hf/cw or info iota\n\
\n\

which is exactly the same. You should choose one or the other\n\ until you are confortable with the way it works. Yes, you can mix\n\ them (actually you can have an accept AND a reject on the same\n\ line) but don't try this at home until you can analyse the results\n\ that you get without ringing up the sysop for help.\n\

\n\

Another useful addition now is filtering by US state\n\

\n\
accept/spots by_state VA,NH,RI,ME\n\
\n\

You can arrange your filter lines into logical units, either for\n\ your own understanding or simply convenience. I have one set\n\ frequently:-\n\

\n\
reject/spots 1 on hf/cw\n\
reject/spots 2 on 50000/1400000 not (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

What this does is to ignore all HF CW spots (being a class B I\n\ can't read any CW and couldn't possibly be interested in\n\ HF :-) and also rejects any spots on VHF which don't either\n\ originate or spot someone in Europe.\n\

\n\

This is an exmaple where you would use the line number (1 and 2\n\ in this case), if you leave the digit out, the system assumes '1'.\n\ Digits '0'-'9' are available.\n\

\n\

You can leave the word 'and' out if you want, it is implied. You\n\ can use any number of brackets to make the 'expression' as you\n\ want it. There are things called precedence rules working here\n\ which mean that you will NEED brackets in a situation like line 2\n\ because, without it, will assume:-\n\

\n\
(on 50000/1400000 and by_zone 14,15,16) or call_zone 14,15,16\n\
\n\

annoying, but that is the way it is. If you use OR - use\n\ brackets. Whilst we are here CASE is not important. 'And BY_Zone'\n\ is just 'and by_zone'.\n\

\n\

If you want to alter your filter you can just redefine one or\n\ more lines of it or clear out one line. For example:-\n\

\n\
reject/spots 1 on hf/ssb\n\
\n\

or\n\

\n\
clear/spots 1\n\
\n\

To remove the filter in its entirety:-\n\

\n\
clear/spots all\n\
\n\

There are similar CLEAR commands for the other filters:-\n\

\n\
clear/announce\n\
clear/wcy\n\
clear/wwv\n\
\n\

ADVANCED USERS:-\n\

\n\

Once you are happy with the results you get, you may like to\n\ experiment.\n\

\n\

My example that filters hf/cw spots and accepts vhf/uhf spots\n\ from EU can be written with a mixed filter, eg:\n\

\n\
rej/spot on hf/cw\n\
acc/spot on 0/30000\n\
acc/spot 2 on 50000/1400000 and (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

Each filter slot actually has a 'reject' slot and an 'accept'\n\ slot. The reject slot is executed BEFORE the accept slot.\n\

\n\

It was mentioned earlier that after a reject test that doesn't\n\ match, the default for following tests is 'accept', the reverse is\n\ true for first, any non hf/cw spot is passed to the accept line,\n\ which lets through everything else on HF.\n\

\n\

The last filter line in the example above lets through just\n\ VHF/UHF spots from EU.\n\

\n\

HELP

\n\

help

\n\
    \n\
  • help - The HELP Command\n\
  • \n\
\n\

HELP is available for a number of commands. The syntax is:-\n\

\n\
HELP <cmd>\n\
\n\

Where <cmd> is the name of the command you want help on.\n\ All commands can be abbreviated, so SHOW/DX can be abbreviated to\n\ SH/DX, ANNOUNCE can be shortened to AN and so on.\n\

\n\

Look at the APROPOS <string> command which will search the\n\ help database for the <string> you specify and give you a\n\ list of likely commands to look at with HELP.\n\

\n\

JOIN

\n\

join\n\ <group>

\n\
    \n\
  • join <group> - Join a chat or conference group\n\
  • \n\
\n\

JOIN allows you to join a network wide conference group. To join\n\ a group (called FOC in this case) type:-\n\

\n\
JOIN FOC\n\
\n\

See also CHAT, LEAVE, SHOW/CHAT\n\

\n\

KILL

\n\

kill <from\n\ msgno>-<to msgno>

\n\
    \n\
  • kill <from msgno>-<to msgno> - Delete a range of\n\ messages\n\
  • \n\
\n\

kill\n\ <msgno> [<msgno..]

\n\
    \n\
  • kill <msgno> [<msgno..] - Delete a message from the\n\ local system\n\
  • \n\
\n\

kill <msgno>\n\ [<msgno> ...]

\n\
    \n\
  • kill <msgno> [<msgno> ...] - Remove or erase a\n\ message from the system\n\
  • \n\
\n\

You can get rid of any message to or originating from your\n\ callsign using this command. You can remove more than one message\n\ at a time.\n\

\n\

kill from\n\ <regex>

\n\
    \n\
  • kill from <regex> - Delete messages FROM a callsign or\n\ pattern\n\
  • \n\
\n\

kill to\n\ <regex>

\n\
    \n\
  • kill to <regex> - Delete messages TO a callsign or\n\ pattern\n\
  • \n\
\n\

LEAVE

\n\

leave\n\ <group>

\n\
    \n\
  • leave <group> - Leave a chat or conference group\n\
  • \n\
\n\

LEAVE allows you to leave a network wide conference group. To\n\ leave a group (called FOC in this case) type:-\n\

\n\
LEAVE FOC\n\
\n\

See also CHAT, JOIN, SHOW/CHAT\n\

\n\

LINKS

\n\

links

\n\
    \n\
  • links - Show which nodes is physically connected\n\
  • \n\
\n\

This is a quick listing that shows which links are connected and\n\ some information about them. See WHO for a list of all\n\ connections.\n\

\n\

READ

\n\

read

\n\
    \n\
  • read - Read the next unread personal message addressed to you\n\
  • \n\
\n\

read\n\ <msgno>

\n\
    \n\
  • read <msgno> - Read the specified message\n\
  • \n\
\n\

You can read any messages that are sent as 'non-personal' and\n\ also any message either sent by or sent to your callsign.\n\

\n\

REJECT

\n\

reject

\n\
    \n\
  • reject - Set a filter to reject something\n\
  • \n\
\n\

There are 2 types of filter, accept and reject. See HELP\n\ FILTERING for more info.\n\

\n\

reject/announce\n\ [0-9] <pattern>

\n\
    \n\
  • reject/announce [0-9] <pattern> - Set a 'reject' filter\n\ line for announce\n\
  • \n\
\n\

A reject filter line means that if the announce matches this\n\ filter it is passed onto the user. See HELP FILTERING for more\n\ info. Please read this to understand how filters work - it will\n\ save a lot of grief later on.\n\

\n\

You can use any of the following things in this line:-\n\

\n\
info <string>            eg: iota or qsl\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
origin_state <states>                eg: VA,NH,RI,ME\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
by_state <states>                eg: VA,NH,RI,ME\n\
channel <prefixes>\n\
wx 1                     filter WX announces\n\
dest <prefixes>          eg: 6MUK,WDX      (distros)\n\
\n\

some examples:-\n\

\n\
rej/ann by_zone 14,15,16 and not by G,M,2\n\
\n\

You can use the tag 'all' to reject everything eg:\n\

\n\
rej/ann all\n\
\n\

but this probably for advanced users...\n\

\n\

reject/spots [0-9]\n\ <pattern>

\n\
    \n\
  • reject/spots [0-9] <pattern> - Set a 'reject' filter\n\ line for spots\n\
  • \n\
\n\

A reject filter line means that if the spot matches this filter\n\ it is dumped (not passed on). See HELP FILTERING for more info.\n\ Please read this to understand how filters work - it will save a\n\ lot of grief later on.\n\

\n\

You can use any of the following things in this line:-\n\

\n\
freq <range>           eg: 0/30000 or hf or hf/cw or 6m,4m,2m\n\
on <range>             same as 'freq'\n\
call <prefixes>        eg: G,PA,HB9\n\
info <string>          eg: iota or qsl\n\
by <prefixes>\n\
call_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
call_itu <prefixes or numbers>     or: G,GM,GW\n\
call_zone <prefixes or numbers>\n\
call_state <states>                eg: VA,NH,RI,ME\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
by_state <states>                eg: VA,NH,RI,ME\n\
origin <prefixes>\n\
channel <prefixes>\n\
\n\

For frequencies, you can use any of the band names defined in\n\ SHOW/BANDS and you can use a subband name like: cw, rtty, data,\n\ ssb - thus: hf/ssb. You can also just have a simple range like:\n\ 0/30000 - this is more efficient than saying simply: on HF (but\n\ don't get too hung up about that)\n\

\n\

some examples:-\n\

\n\
rej/spot 1 on hf\n\
rej/spot 2 on vhf and not (by_zone 14,15,16 or call_zone 14,15,16)\n\
\n\

You can use the tag 'all' to reject everything eg:\n\

\n\
rej/spot 3 all\n\
\n\

but this probably for advanced users...\n\

\n\

reject/wcy [0-9]\n\ <pattern>

\n\
    \n\
  • reject/wcy [0-9] <pattern> - set a 'reject' WCY filter\n\
  • \n\
\n\

It is unlikely that you will want to do this, but if you do then\n\ you can filter on the following fields:-\n\

\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
channel <prefixes>\n\
\n\

There are no examples because WCY Broadcasts only come from one\n\ place and you either want them or not (see UNSET/WCY if you don't\n\ want them).\n\

\n\

This command is really provided for future use.\n\

\n\

See HELP FILTER for information.\n\

\n\

reject/wwv [0-9]\n\ <pattern>

\n\
    \n\
  • reject/wwv [0-9] <pattern> - set a 'reject' WWV filter\n\
  • \n\
\n\

It is unlikely that you will want to do this, but if you do then\n\ you can filter on the following fields:-\n\

\n\
by <prefixes>            eg: G,M,2\n\
origin <prefixes>\n\
origin_dxcc <prefixes or numbers>    eg: 61,62 (from eg: sh/pre G)\n\
origin_itu <prefixes or numbers>     or: G,GM,GW\n\
origin_zone <prefixes or numbers>\n\
by_dxcc <prefixes or numbers>\n\
by_itu <prefixes or numbers>\n\
by_zone <prefixes or numbers>\n\
channel <prefixes>\n\
\n\

for example\n\

\n\
reject/wwv by_zone 14,15,16\n\
\n\

is probably the only useful thing to do (which will only show WWV\n\ broadcasts by stations in the US).\n\

\n\

See HELP FILTER for information.\n\

\n\

REPLY

\n\

reply

\n\
    \n\
  • reply = Reply (privately) to the last message that you have\n\ read\n\
  • \n\
\n\

reply\n\ <msgno>

\n\
    \n\
  • reply <msgno> - Reply (privately) to the specified\n\ message\n\
  • \n\
\n\

reply b\n\ <msgno>

\n\
    \n\
  • reply b <msgno> - Reply as a Bulletin to the specified\n\ message\n\
  • \n\
\n\

reply\n\ noprivate <msgno>

\n\
    \n\
  • reply noprivate <msgno> - Reply as a Bulletin to the\n\ specified message\n\
  • \n\
\n\

reply rr\n\ <msgno>

\n\
    \n\
  • reply rr <msgno> - Reply to the specified message with\n\ read receipt\n\
  • \n\
\n\

You can reply to a message and the subject will automatically\n\ have \"Re:\" inserted in front of it, if it isn't already present.\n\ You can also use all the extra qualifiers such as RR, PRIVATE,\n\ NOPRIVATE, B that you can use with the SEND command (see SEND for\n\ further details)\n\

\n\

SEND

\n\

send <call>\n\ [<call> ...]

\n\
    \n\
  • send <call> [<call> ...] - Send a message to one\n\ or more callsigns\n\
  • \n\
\n\

send\n\ copy <msgno> <call>

\n\
    \n\
  • send copy <msgno> <call> - Send a copy of a\n\ message to someone\n\
  • \n\
\n\

send\n\ noprivate <call>

\n\
    \n\
  • send noprivate <call> - Send a message to all stations\n\
  • \n\
\n\

All the SEND commands will create a message which will be sent\n\ either to an individual callsign or to one of the 'bulletin'\n\ addresses.\n\ SEND <call> on its own acts as though you had typed SEND\n\ PRIVATE, that is it will mark the message as personal and send it\n\ to the cluster node that that callsign is connected to. If the\n\ <call> you have specified is in fact a known bulletin\n\ category on your node (eg: ALL) then the message should\n\ automatically become a bulletin. You can have more than one\n\ callsign in all of the SEND commands.\n\

\n\

You can have multiple qualifiers so that you can have for\n\ example:-\n\

\n\
SEND RR COPY 123 PRIVATE G1TLH G0RDI\n\
\n\

which should send a copy of message 123 to G1TLH and G0RDI and\n\ you will receive a read receipt when they have read the message.\n\

\n\

SB is an alias for SEND NOPRIVATE (or send a bulletin in BBS\n\ speak) SP is an alias for SEND PRIVATE\n\

\n\

The system will ask you for a subject. Conventionally this should\n\ be no longer than 29 characters for compatibility. Most modern\n\ cluster software should accept more.\n\

\n\

You will now be prompted to start entering your text.\n\

\n\

You finish the message by entering '/EX' on a new line. For\n\ instance:\n\

\n\
...\n\
bye then Jim\n\
73 Dirk\n\
/ex\n\
\n\

If you have started a message and you don't want to keep it then\n\ you can abandon the message with '/ABORT' on a new line, like:-\n\

\n\
line 1\n\
line 2\n\
oh I just can't be bothered with this\n\
/abort\n\
\n\

If you abort the message it will NOT be sent.\n\

\n\

When you are entering the text of your message, most normal\n\ output (such as DX announcements and so on are suppressed and\n\ stored for latter display (upto 20 such lines are stored, as new\n\ ones come along, so the oldest lines are dropped).\n\

\n\

Also, you can enter normal commands commands (and get the output\n\ immediately) whilst in the middle of a message. You do this by\n\ typing the command preceeded by a '/' character on a new line,\n\ so:-\n\

\n\
/dx g1tlh 144010 strong signal\n\
\n\

Will issue a dx annoucement to the rest of the cluster.\n\

\n\

Also, you can add the output of a command to your message by\n\ preceeding the command with '//', thus :-\n\

\n\
//sh/vhftable\n\
\n\

This will show YOU the output from SH/VHFTABLE and also store it\n\ in the message.\n\

\n\

You can carry on with the message until you are ready to send it.\n\

\n\

send\n\ private <call>

\n\
    \n\
  • send private <call> - Send a personal message\n\
  • \n\
\n\

send rr\n\ <call>

\n\
    \n\
  • send rr <call> - Send a message and ask for a read\n\ receipt\n\
  • \n\
\n\

SET

\n\

set/address\n\ <your address>

\n\
    \n\
  • set/address <your address> - Record your postal address\n\
  • \n\
\n\

set/announce

\n\
    \n\
  • set/announce - Allow announce messages to come out on your\n\ terminal\n\
  • \n\
\n\

set/anntalk

\n\
    \n\
  • set/anntalk - Allow talk like announce messages on your\n\ terminal\n\
  • \n\
\n\

set/beep

\n\
    \n\
  • set/beep - Add a beep to DX and other messages on your\n\ terminal\n\
  • \n\
\n\

set/dx

\n\
    \n\
  • set/dx - Allow DX messages to come out on your terminal\n\
  • \n\
\n\

set/dxcq

\n\
    \n\
  • set/dxcq - Show CQ Zones on the end of DX announcements\n\
  • \n\
\n\

set/dxgrid

\n\
    \n\
  • set/dxgrid - Allow QRA Grid Squares on the end of DX\n\ announcements\n\
  • \n\
\n\

set/dxitu

\n\
    \n\
  • set/dxitu - Show ITU Zones on the end of DX announcements\n\
  • \n\
\n\

set/echo

\n\
    \n\
  • set/echo - Make the cluster echo your input\n\
  • \n\
\n\

set/email\n\ <email>

\n\
    \n\
  • set/email <email> - Set email address(es) and forward\n\ your personals\n\
  • \n\
\n\

set/here

\n\
    \n\
  • set/here - Tell the system you are present at your terminal\n\
  • \n\
\n\

set/homenode\n\ <node>

\n\
    \n\
  • set/homenode <node> - Set your normal cluster callsign\n\
  • \n\
\n\

Tell the cluster system where you normally connect to. Any\n\ Messages sent to you will normally find their way there should you\n\ not be connected. eg:-\n\

\n\
SET/HOMENODE gb7djk\n\
\n\

set/language\n\ <lang>

\n\
    \n\
  • set/language <lang> - Set the language you want to use\n\
  • \n\
\n\

You can select the language that you want the cluster to use.\n\ Currently the languages available are en (English), de (German),\n\ es (Spanish), Czech (cz), French (fr), Portuguese (pt), Italian\n\ (it) and nl (Dutch).\n\

\n\

set/location\n\ <lat & long>

\n\
    \n\
  • set/location <lat & long> - Set your latitude and\n\ longitude\n\
  • \n\
\n\

set/logininfo

\n\
    \n\
  • set/logininfo - Inform when a station logs in/out locally\n\
  • \n\
\n\

set/name\n\ <your name>

\n\
    \n\
  • set/name <your name> - Set your name\n\
  • \n\
\n\

Tell the system what your name is eg:-\n\

\n\
SET/NAME Dirk\n\
\n\

set/page\n\ <lines per page>

\n\
    \n\
  • set/page <lines per page> - Set the lines per page\n\
  • \n\
\n\

Tell the system how many lines you wish on a page when the number\n\ of line of output from a command is more than this. The default is\n\ 20. Setting it explicitly to 0 will disable paging.\n\

\n\
SET/PAGE 30\n\
SET/PAGE 0\n\
\n\

The setting is stored in your user profile.\n\

\n\

set/password

\n\
    \n\
  • set/password - Set your own password\n\
  • \n\
\n\

This command only works for a 'telnet' user (currently). It will\n\ only work if you have a password already set. This initial\n\ password can only be set by the sysop.\n\

\n\

When you execute this command it will ask you for your old\n\ password, then ask you to type in your new password twice (to make\n\ sure you get it right). You may or may not see the data echoed on\n\ the screen as you type, depending on the type of telnet client you\n\ have.\n\

\n\

set/prompt\n\ <string>

\n\
    \n\
  • set/prompt <string> - Set your prompt to <string>\n\
  • \n\
\n\

set/qra\n\ <locator>

\n\
    \n\
  • set/qra <locator> - Set your QRA Grid locator\n\
  • \n\
\n\

Tell the system what your QRA (or Maidenhead) locator is. If you\n\ have not done a SET/LOCATION then your latitude and longitude will\n\ be set roughly correctly (assuming your locator is\n\ correct ;-). For example:-\n\

\n\
SET/QRA JO02LQ\n\
\n\

set/qth\n\ <your qth>

\n\
    \n\
  • set/qth <your qth> - Set your QTH\n\
  • \n\
\n\

Tell the system where you are. For example:-\n\

\n\
SET/QTH East Dereham, Norfolk\n\
\n\

set/startup

\n\
    \n\
  • set/startup - Create your own startup script\n\
  • \n\
\n\

Create a startup script of DXSpider commands which will be\n\ executed everytime that you login into this node. You can only\n\ input the whole script afresh, it is not possible to 'edit' it.\n\ Inputting a new script is just like typing in a message using\n\ SEND. To finish inputting type: /EX on a newline, to abandon the\n\ script type: /ABORT.\n\

\n\

You may find the (curiously named) command BLANK useful to break\n\ up the output. If you simply want a blank line, it is easier to\n\ input one or more spaces and press the <return> key.\n\

\n\

See UNSET/STARTUP to remove a script.\n\

\n\

set/talk

\n\
    \n\
  • set/talk - Allow TALK messages to come out on your terminal\n\
  • \n\
\n\

set/usstate

\n\
    \n\
  • set/usstate - Allow US State info on the end of DX\n\ announcements\n\
  • \n\
\n\

set/wcy

\n\
    \n\
  • set/wcy - Allow WCY messages to come out on your terminal\n\
  • \n\
\n\

set/wwv

\n\
    \n\
  • set/wwv - Allow WWV messages to come out on your terminal\n\
  • \n\
\n\

set/wx

\n\
    \n\
  • set/wx - Allow WX messages to come out on your terminal\n\
  • \n\
\n\

SHOW

\n\

show/chat

\n\
    \n\
  • show/chat [<group>] [<lines>]\n\
  • \n\
\n\

This command allows you to see any chat or conferencing that has\n\ occurred whilst you were away. SHOW/CHAT on its own will show data\n\ for all groups. If you use a group name then it will show only\n\ chat for that group.\n\

\n\

show/configuration

\n\
    \n\
  • show/configuration [<node>]\n\
  • \n\
\n\

This command allows you to see all the users that can be seen and\n\ the nodes to which they are connected.\n\

\n\

This command is normally abbreviated to: sh/c\n\

\n\

Normally, the list returned will be just for the nodes from your\n\ country (because the list otherwise will be very long).\n\

\n\
SH/C ALL\n\
\n\

will produce a complete list of all nodes.\n\

\n\

BE WARNED: the list that is returned can be VERY long\n\

\n\

It is possible to supply a node or part of a prefix and you will\n\ get a list of the users for that node or list of nodes starting\n\ with that prefix.\n\

\n\
SH/C GB7DJK\n\
SH/C SK\n\
\n\

show/configuration/node

\n\
    \n\
  • show/configuration/node\n\
  • \n\
\n\

Show all the nodes connected to this node.\n\

\n\

show/contest

\n\
    \n\
  • show/contest <year and month>\n\
  • \n\
\n\

Show all known contests which are maintained at http://www.sk3bg.se/contest/\n\ for a particular month or year. The format is reasonably flexible.\n\ For example:-\n\

\n\
SH/CONTEST sep2003\n\
SH/CONTEST 03 march\n\
\n\

show/date

\n\
    \n\
  • show/date [<prefix>|<callsign>]\n\
  • \n\
\n\

This is very nearly the same as SHOW/TIME, the only difference\n\ the format of the date string if no arguments are given.\n\

\n\

If no prefixes or callsigns are given then this command returns\n\ the local time and UTC as the computer has it right now. If you\n\ give some prefixes then it will show UTC and UTC + the local\n\ offset (not including DST) at the prefixes or callsigns that you\n\ specify.\n\

\n\

show/db0sdx

\n\
    \n\
  • show/db0sdx <callsign>\n\
  • \n\
\n\

This command queries the DB0SDX QSL server on the internet and\n\ returns any information available for that callsign. This service\n\ is provided for users of this software by http://www.qslinfo.de.\n\

\n\

See also SHOW/QRZ, SHOW/WM7D.\n\

\n\

show/dx

\n\
    \n\
  • show/dx\n\
  • \n\
\n\

If you just type SHOW/DX you will get the last so many spots\n\ (sysop configurable, but usually 10).\n\

\n\

In addition you can add any number of these commands in very\n\ nearly any order to the basic SHOW/DX command, they are:-\n\

\n\
on <band>       - eg 160m 20m 2m 23cm 6mm\n\
on <region>     - eg hf vhf uhf shf      (see SHOW/BANDS)\n\
on <from>/<to>  - eg 1000/4000 14000-30000  (in Khz)\n\
   <from>-<to>\n\
<number>        - the number of spots you want\n\
<from>-<to>     - <from> spot no <to> spot no in the selected list\n\
<from>/<to>\n\
<prefix>        - for a spotted callsign beginning with <prefix>\n\
*<suffix>       - for a spotted callsign ending in <suffix>\n\
*<string>*      - for a spotted callsign containing <string>\n\
day <number>    - starting <number> days ago\n\
day <from>-<to> - <from> days <to> days ago\n\
<from>/<to>\n\
info <text>     - any spots containing <text> in the info or remarks\n\
by <call>       - any spots spotted by <call> (spotter <call> is the same).\n\
qsl             - this automatically looks for any qsl info on the call\n\
  held in the spot database.\n\
iota [<iota>]   - If the iota island number is missing it will look for\n\
  the string iota and anything which looks like an iota\n\
  island number. If you specify then it will look for\n\
  that island.\n\
qra [<locator>] - this will look for the specific locator if you specify\n\
  one or else anything that looks like a locator.\n\
dxcc            - treat the prefix as a 'country' and look for spots\n\
  from that country regardless of actual prefix. eg dxcc oq2\n\
  You can also use this with the 'by' keyword. eg by W dxcc\n\
real or rt      - Format the output the same as for real time spots. The\n\
  formats are deliberately different (so you can tell\n\
  one sort from the other). This is useful for some\n\
  logging programs that can't cope with normal sh/dx\n\
  output. An alias of SHOW/FDX is available.\n\
filter          - Filter the spots, before output, with the user's\n\
  spot filter. An alias of SHOW/MYDX is available.\n\
zone <zones>    - look for spots in the cq zone (or zones) specified.\n\
  zones are numbers separated by commas.\n\
by_zone <zones> - look for spots spotted by people in the cq zone\n\
  specified.\n\
itu <itus>      - look for spots in the itu zone (or zones) specified\n\
  itu zones are numbers separated by commas.\n\
by_itu <itus>   - look for spots spotted by people in the itu zone\n\
  specified.\n\
state <list>    - look for spots in the US state (or states) specified\n\
  The list is two letter state codes separated by commas.\n\
by_state <list> - look for spots spotted by people in the US state\n\
  specified.\n\
\n\

Examples...\n\

\n\
SH/DX 9m0\n\
SH/DX on 20m info iota\n\
SH/DX 9a on vhf day 30\n\
SH/DX rf1p qsl\n\
SH/DX iota\n\
SH/DX iota eu-064\n\
SH/DX qra jn86\n\
SH/DX dxcc oq2\n\
SH/DX dxcc oq2 by w dxcc\n\
SH/DX zone 4,5,6\n\
SH/DX by_zone 4,5,6\n\
SH/DX state in,oh\n\
SH/DX by_state in,oh\n\
\n\

show/dxcc

\n\
    \n\
  • show/dxcc <prefix>\n\
  • \n\
\n\

This command takes the <prefix> (which can be a full or\n\ partial callsign if desired), looks up which internal country\n\ number it is and then displays all the spots as per SH/DX for that\n\ country.\n\

\n\

This is now an alias for 'SHOW/DX DXCC'\n\

\n\

The options for SHOW/DX also apply to this command. e.g.\n\

\n\
SH/DXCC G\n\
SH/DXCC W on 20m iota\n\
\n\

This can be done with the SHOW/DX command like this:-\n\

\n\
SH/DX dxcc g\n\
SH/DX dxcc w on 20m iota\n\
\n\

This is an alias for: SH/DX dxcc\n\

\n\

show/dxqsl

\n\
    \n\
  • show/dxqsl <callsign>\n\
  • \n\
\n\

The node collects information from the comment fields in spots\n\ (things like 'VIA EA7WA' or 'QSL-G1TLH') and stores these in a\n\ database.\n\

\n\

This command allows you to interrogate that database and if the\n\ callsign is found will display the manager(s) that people have\n\ spotted. This information is NOT reliable, but it is normally\n\ reasonably accurate if it is spotted enough times.\n\

\n\

For example:-\n\

\n\
sh/dxqsl 4k9w\n\
\n\

You can check the raw input spots yourself with:-\n\

\n\
sh/dx 4k9w qsl\n\
\n\

This gives you more background information.\n\

\n\

show/dxstats

\n\
    \n\
  • show/dxstats [days] [date]�[0m\n\
  • \n\
\n\

Show the total DX spots for the last <days> no of days\n\ (default is 31), starting from a <date> (default: today).\n\

\n\

show/fdx

\n\
    \n\
  • show/fdx\n\
  • \n\
\n\

Normally SHOW/DX outputs spot data in a different format to the\n\ realtime data. This is a deliberate policy (so you can tell the\n\ difference between the two). Some logging programs cannot handle\n\ this so SHOW/FDX outputs historical data in real time format.\n\

\n\

This is an alias for: SHOW/DX real\n\

\n\

show/files

\n\
    \n\
  • show/files [<filearea> [<string>]]\n\
  • \n\
\n\

SHOW/FILES on its own will show you a list of the various\n\ fileareas available on the system. To see the contents of a\n\ particular file area type:-\n\

\n\
SH/FILES <filearea>\n\
\n\

where <filearea> is the name of the filearea you want to\n\ see the contents of.\n\

\n\

You can also use shell globbing characters like '*' and '?' in a\n\ string to see a selection of files in a filearea eg:-\n\

\n\
SH/FILES bulletins arld*\n\
\n\

See also TYPE - to see the contents of a file.\n\

\n\

show/filter

\n\
    \n\
  • show/filter\n\
  • \n\
\n\

Show the contents of all the filters that are set. This command\n\ displays all the filters set - for all the various categories.\n\

\n\

show/hfstats

\n\
    \n\
  • show/hfstats [days] [date]\n\
  • \n\
\n\

Show the HF DX spots breakdown by band for the last <days>\n\ no of days (default is 31), starting from a <date> (default:\n\ today).\n\

\n\

show/hftable

\n\
    \n\
  • show/hftable [days] [date] [prefix ...]\n\
  • \n\
\n\

Show the HF DX Spotter table for the list of prefixes for the\n\ last <days> no of days (default is 31), starting from a\n\ <date> (default: today).\n\

\n\

If there are no prefixes then it will show the table for your\n\ country.\n\

\n\

Remember that some countries have more than one \"DXCC country\" in\n\ them (eg G :-), to show them (assuming you are not in G\n\ already which is specially treated in the code) you must list all\n\ the relevant prefixes\n\

\n\
sh/hftable g gm gd gi gj gw gu\n\
\n\

Note that the prefixes are converted into country codes so you\n\ don't have to list all possible prefixes for each country.\n\

\n\

If you want more or less days than the default simply include the\n\ number you require:-\n\

\n\
sh/hftable 20 pa\n\
\n\

If you want to start at a different day, simply add the date in\n\ some recognizable form:-\n\

\n\
sh/hftable 2 25nov02\n\
sh/hftable 2 25-nov-02\n\
sh/hftable 2 021125\n\
sh/hftable 2 25/11/02\n\
\n\

This will show the stats for your DXCC for that CQWW contest\n\ weekend.\n\

\n\

You can specify either prefixes or full callsigns (so you can see\n\ how you did against all your mates). You can also say 'all' which\n\ will then print the worldwide statistics.\n\

\n\
sh/hftable all\n\
\n\

show/moon

\n\
    \n\
  • show/moon [ndays] [<prefix>|<callsign>]�[0m\n\
  • \n\
\n\

Show the Moon rise and set times for a (list of) prefixes or\n\ callsigns, together with the azimuth and elevation of the sun\n\ currently at those locations.\n\

\n\

If you don't specify any prefixes or callsigns, it will show the\n\ times for your QTH (assuming you have set it with either\n\ SET/LOCATION or SET/QRA), together with the current azimuth and\n\ elevation.\n\

\n\

In addition, it will show the illuminated fraction of the moons\n\ disk.\n\

\n\

If all else fails it will show the Moonrise and set times for the\n\ node that you are connected to.\n\

\n\

For example:-\n\

\n\
SH/MOON\n\
SH/MOON G1TLH W5UN\n\
\n\

You can also use this command to see into the past or the future,\n\ so if you want to see yesterday's times then do:-\n\

\n\
SH/MOON -1\n\
\n\

or in three days time:-\n\

\n\
SH/MOON +3 W9\n\
\n\

Upto 366 days can be checked both in the past and in the future.\n\

\n\

Please note that the rise and set times are given as the UT times\n\ of rise and set on the requested UT day.\n\

\n\

show/muf

\n\
    \n\
  • show/muf <prefix> [<hours>][long]\n\
  • \n\
\n\

This command allow you to estimate the likelihood of you\n\ contacting a station with the prefix you have specified. The\n\ output assumes a modest power of 20dBW and receiver sensitivity of\n\ -123dBm (about 0.15muV/10dB SINAD)\n\

\n\

The result predicts the most likely operating frequencies and\n\ signal levels for high frequency (shortwave) radio propagation\n\ paths on specified days of the year and hours of the day. It is\n\ most useful for paths between 250 km and 6000 km, but can be used\n\ with reduced accuracy for paths shorter or longer than this.\n\

\n\

The command uses a routine MINIMUF 3.5 developed by the U.S. Navy\n\ and used to predict the MUF given the predicted flux, day of the\n\ year, hour of the day and geographic coordinates of the\n\ transmitter and receiver. This routine is reasonably accurate for\n\ the purposes here, with a claimed RMS error of 3.8 MHz, but much\n\ smaller and less complex than the programs used by major shortwave\n\ broadcasting organizations, such as the Voice of America.\n\

\n\

The command will display some header information detailing its\n\ assumptions, together with the locations, latitude and longitudes\n\ and bearings. It will then show UTC (UT), local time at the other\n\ end (LT), calculate the MUFs, Sun zenith angle at the midpoint of\n\ the path (Zen) and the likely signal strengths. Then for each\n\ frequency for which the system thinks there is a likelihood of a\n\ circuit it prints a value.\n\

\n\

The value is currently a likely S meter reading based on the\n\ conventional 6dB / S point scale. If the value has a '+' appended\n\ it means that it is 1/2 an S point stronger. If the value is\n\ preceded by an 'm' it means that there is likely to be much fading\n\ and by an 's' that the signal is likely to be noisy.\n\

\n\

By default SHOW/MUF will show the next two hours worth of data.\n\ You can specify anything up to 24 hours worth of data by appending\n\ the no of hours required after the prefix. For example:-\n\

\n\
SH/MUF W\n\
\n\

produces:\n\

\n\
RxSens: -123 dBM SFI: 159   R: 193   Month: 10   Day: 21\n\
Power :   20 dBW    Distance:  6283 km    Delay: 22.4 ms\n\
Location                       Lat / Long           Azim\n\
East Dereham, Norfolk          52 41 N 0 57 E         47\n\
United-States-W                43 0 N 87 54 W        299\n\
UT LT  MUF Zen  1.8  3.5  7.0 10.1 14.0 18.1 21.0 24.9 28.0 50.0\n\
18 23 11.5 -35  mS0+ mS2   S3\n\
19  0 11.2 -41  mS0+ mS2   S3\n\
\n\

indicating that you will have weak, fading circuits on top band\n\ and 80m but usable signals on 40m (about S3).\n\

\n\

inputing:-\n\

\n\
SH/MUF W 24\n\
\n\

will get you the above display, but with the next 24 hours worth\n\ of propagation data.\n\

\n\
SH/MUF W L 24\n\
SH/MUF W 24 Long\n\
\n\

Gives you an estimate of the long path propagation characterics.\n\ It should be noted that the figures will probably not be very\n\ useful, nor terrible accurate, but it is included for\n\ completeness.\n\

\n\

show/mydx

\n\
    \n\
  • show/mydx\n\
  • \n\
\n\

SHOW/DX potentially shows all the spots available in the system.\n\ Using SHOW/MYDX will, instead, filter the availble spots using any\n\ spot filter that you have set, first.\n\

\n\

This command, together with ACCEPT/SPOT or REJECT/SPOT, will\n\ allow you to customise the spots that you receive.\n\

\n\

So if you have said: ACC/SPOT on hf, doing a SHOW/MYDX will now\n\ only, ever, show HF spots.

\n\

All the other options on SH/DX can still be used.\n\

\n\

show/newconfiguration

\n\
    \n\
  • show/newconfiguration [<node>]\n\
  • \n\
\n\

This command allows you to see all the users that can be seen and\n\ the nodes to which they are connected.\n\

\n\

This command produces essentially the same information as\n\ SHOW/CONFIGURATION except that it shows all the duplication of any\n\ routes that might be present It also uses a different format which\n\ may not take up quite as much space if you don't have any loops.\n\

\n\

BE WARNED: the list that is returned can be VERY long\n\

\n\

show/newconfiguration/node

\n\
    \n\
  • show/newconfiguration/node\n\
  • \n\
\n\

Show all the nodes connected to this node in the new format.\n\

\n\

show/prefix

\n\
    \n\
  • show/prefix <callsign>\n\
  • \n\
\n\

This command takes the <callsign> (which can be a full or\n\ partial callsign or a prefix), looks up which internal country\n\ number it is and then displays all the relevant prefixes for that\n\ country together with the internal country no, the CQ and ITU\n\ regions.\n\

\n\

See also SHOW/DXCC\n\

\n\

show/qra

\n\
    \n\
  • show/qra <lat> <long>\n\
  • \n\
\n\

This is a multipurpose command that allows you either to\n\ calculate the distance and bearing between two locators or (if\n\ only one locator is given on the command line) the distance and\n\ beraing from your station to the locator. For example:-\n\

\n\
SH/QRA IO92QL\n\
SH/QRA JN06 IN73\n\
\n\

The first example will show the distance and bearing to the\n\ locator from yourself, the second example will calculate the\n\ distance and bearing from the first locator to the second. You can\n\ use 4 or 6 character locators.\n\

\n\

It is also possible to convert a latitude and longitude to a\n\ locator by using this command with a latitude and longitude as an\n\ argument, for example:-\n\

\n\
SH/QRA 52 41 N 0 58 E\n\
\n\
    \n\
  • show/qra <locator> [<locator>]\n\
  • \n\
\n\

Show distance between QRA Grid locators\n\

\n\

show/qrz

\n\
    \n\
  • show/qrz <callsign>\n\
  • \n\
\n\

This command queries the QRZ callbook server on the internet and\n\ returns any information available for that callsign. This service\n\ is provided for users of this software by http://www.qrz.com\n\

\n\

See also SHOW/WM7D for an alternative.\n\

\n\

show/route

\n\
    \n\
  • show/route <callsign> ...\n\
  • \n\
\n\

This command allows you to see to which node the callsigns\n\ specified are connected. It is a sort of inverse sh/config.\n\

\n\
sh/route n2tly\n\
\n\

show/satellite

\n\
    \n\
  • show/satellite <name> [<hours> <interval>]\n\
  • \n\
\n\

Show the tracking data from your location to the satellite of\n\ your choice from now on for the next few hours.\n\

\n\

If you use this command without a satellite name it will display\n\ a list of all the satellites known currently to the system.\n\

\n\

If you give a name then you can obtain tracking data of all the\n\ passes that start and finish 5 degrees below the horizon. As\n\ default it will give information for the next three hours for\n\ every five minute period.\n\

\n\

You can alter the number of hours and the step size, within\n\ certain limits.\n\

\n\

Each pass in a period is separated with a row of '-----'\n\ characters\n\

\n\

So for example:-\n\

\n\
SH/SAT AO-10\n\
SH/SAT FENGYUN1 12 2\n\
\n\

show/startup

\n\
    \n\
  • show/startup\n\
  • \n\
\n\

View the contents of a startup script created with SET/STARTUP.\n\

\n\

show/station

\n\
    \n\
  • show/station [<callsign> ..]\n\
  • \n\
\n\

Show the information known about a callsign and whether (and\n\ where) that callsign is connected to the cluster.\n\

\n\
SH/ST G1TLH\n\
\n\

If no callsign is given then show the information for yourself.\n\

\n\

show/sun

\n\
    \n\
  • show/sun [ndays] [<prefix>|<callsign>]\n\
  • \n\
\n\

Show the sun rise and set times for a (list of) prefixes or\n\ callsigns, together with the azimuth and elevation of the sun\n\ currently at those locations.\n\

\n\

If you don't specify any prefixes or callsigns, it will show the\n\ times for your QTH (assuming you have set it with either\n\ SET/LOCATION or SET/QRA), together with the current azimuth and\n\ elevation.\n\

\n\

If all else fails it will show the sunrise and set times for the\n\ node that you are connected to.\n\

\n\

For example:-\n\

\n\
SH/SUN\n\
SH/SUN G1TLH K9CW ZS\n\
\n\

You can also use this command to see into the past or the future,\n\ so if you want to see yesterday's times then do:-\n\

\n\
SH/SUN -1\n\
\n\

or in three days time:-\n\

\n\
SH/SUN +3 W9\n\
\n\

Upto 366 days can be checked both in the past and in the future.\n\

\n\

Please note that the rise and set times are given as the UT times\n\ of rise and set on the requested UT day.\n\

\n\

show/time

\n\
    \n\
  • show/time [<prefix>|<callsign>]\n\
  • \n\
\n\

If no prefixes or callsigns are given then this command returns\n\ the local time and UTC as the computer has it right now. If you\n\ give some prefixes then it will show UTC and UTC + the local\n\ offset (not including DST) at the prefixes or callsigns that you\n\ specify.\n\

\n\

show/usdb

\n\
    \n\
  • show/usdb [call ..]\n\
  • \n\
\n\

Show the City and State of a Callsign held on the FCC database if\n\ his is being run on this system, eg:-\n\

\n\
sh/usdb k1xx\n\
\n\

show/vhfstats

\n\
    \n\
  • show/vhfstats [days] [date]\n\
  • \n\
\n\

Show the VHF DX spots breakdown by band for the last <days>\n\ no of days (default is 31), starting from a date (default: today).\n\

\n\

show/vhftable

\n\
    \n\
  • show/vhftable [days] [date] [prefix ...]\n\
  • \n\
\n\

Show the VHF DX Spotter table for the list of prefixes for the\n\ last <days> no of days (default is 31), starting from a date\n\ (default: today).\n\

\n\

If there are no prefixes then it will show the table for your\n\ country.\n\

\n\

Remember that some countries have more than one \"DXCC country\" in\n\ them (eg G :-), to show them (assuming you are not in G\n\ already which is specially treated in the code) you must list all\n\ the relevant prefixes\n\

\n\
sh/vhftable g gm gd gi gj gw gu\n\
\n\

Note that the prefixes are converted into country codes so you\n\ don't have to list all possible prefixes for each country.\n\

\n\

If you want more or less days than the default simply include the\n\ number you require:-\n\

\n\
sh/vhftable 20 pa\n\
\n\

If you want to start at a different day, simply add the date in\n\ some recognizable form:-\n\

\n\
sh/vhftable 2 25nov02\n\
sh/vhftable 2 25-nov-02\n\
sh/vhftable 2 021125\n\
sh/vhftable 2 25/11/02\n\
\n\

This will show the stats for your DXCC for that CQWW contest\n\ weekend.\n\

\n\

You can specify either prefixes or full callsigns (so you can see\n\ how you did against all your mates). You can also say 'all' which\n\ will then print the worldwide statistics.\n\

\n\
sh/vhftable all\n\
\n\

show/wcy

\n\

Display the most recent WCY information that has been received by\n\ the system\n\

\n\
    \n\
  • show/wcy\n\
  • \n\
\n\

Show last 10 WCY broadcasts\n\

\n\
    \n\
  • show/wcy <n>\n\
  • \n\
\n\

Show last <n> WCY broadcasts\n\

\n\

show/wm7d

\n\
    \n\
  • show/wm7d <callsign>\n\
  • \n\
\n\

This command queries the WM7D callbook server on the internet and\n\ returns any information available for that US callsign. This\n\ service is provided for users of this software by http://www.wm7d.net.\n\

\n\

See also SHOW/QRZ.\n\

\n\

show/wwv

\n\

Display the most recent WWV information that has been received by\n\ the system\n\

\n\
    \n\
  • show/wwv\n\
  • \n\
\n\

Show last 10 WWV broadcasts\n\

\n\
    \n\
  • show/wwv <n>\n\
  • \n\
\n\

Show last <n> WWV broadcasts\n\

\n\

sysop

\n\
    \n\
  • sysop\n\
  • \n\
\n\

The system automatically reduces your privilege level to that of\n\ a normal user if you login in remotely. This command allows you to\n\ regain your normal privilege level. It uses the normal system:\n\ five numbers are returned that are indexes into the character\n\ array that is your assigned password (see SET/PASSWORD). The\n\ indexes start from zero.\n\

\n\

You are expected to return a string which contains the characters\n\ required in the correct order. You may intersperse those\n\ characters with others to obscure your reply for any watchers. For\n\ example (and these values are for explanation :-):\n\

\n\
password = 012345678901234567890123456789\n\
> sysop\n\
22 10 15 17 3\n\
\n\

you type:-\n\

\n\
aa2bbbb0ccc5ddd7xxx3n\n\
or 2 0 5 7 3\n\
or 20573\n\
\n\

They will all match. If there is no password you will still be\n\ offered numbers but nothing will happen when you input a string.\n\ Any match is case sensitive.\n\

\n\

talk

\n\
    \n\
  • talk <call> > <node> [<text>]\n\
  • \n\
\n\

Send a short message to any other station that is visible on the\n\ cluster system. You can send it to anyone you can see with a\n\ SHOW/CONFIGURATION command, they don't have to be connected\n\ locally.\n\

\n\

The second form of TALK is used when other cluster nodes are\n\ connected with restricted information. This usually means that\n\ they don't send the user information usually associated with\n\ logging on and off the cluster.\n\

\n\

If you know that G3JNB is likely to be present on GB7TLH, but you\n\ can only see GB7TLH in the SH/C list but with no users, then you\n\ would use the second form of the talk message.\n\

\n\

If you want to have a ragchew with someone you can leave the text\n\ message out and the system will go into 'Talk' mode. What this\n\ means is that a short message is sent to the recipient telling\n\ them that you are in a go to the station that you asked for.\n\

\n\

All the usual announcements, spots and so on will still come out\n\ on your terminal. If you want to do something (such as send a\n\ spot) you preceed the normal command with a '/' character, eg:-\n\

\n\
/DX 14001 G1TLH What's a B class licensee doing on 20m CW?\n\
/HELP talk\n\
\n\

To leave talk mode type:\n\

\n\
/EX\n\
\n\

If you are in 'Talk' mode, there is an extention to the '/'\n\ command which allows you to send the output to all the people you\n\ are talking to. You do with the '//' command. For example:-\n\

\n\
//sh/hftable\n\
\n\

will send the hftable as you have it to all the people you are\n\ currently talking to.\n\

\n\
    \n\
  • talk <call> [<text>]\n\
  • \n\
\n\

Send a text message to another station\n\

\n\

type

\n\
    \n\
  • type <filearea>/<name>\n\
  • \n\
\n\

Type out the contents of a file in a filearea. So, for example,\n\ in filearea 'bulletins' you want to look at file 'arld051' you\n\ would enter:-\n\

\n\
TYPE bulletins/arld051\n\
\n\

See also SHOW/FILES to see what fileareas are available and a\n\ list of content.\n\

\n\

unset/announce

\n\
    \n\
  • unset/announce\n\
  • \n\
\n\

Stop announce messages coming out on your terminal\n\

\n\

unset/anntalk

\n\
    \n\
  • unset/anntalk\n\
  • \n\
\n\

The announce system on legacy cluster nodes is used as a talk\n\ substitute because the network is so poorly connected. If you:\n\

\n\
unset/anntalk\n\
\n\

you will suppress several of these announces, you may miss the\n\ odd useful one as well, but you would probably miss them anyway in\n\ the welter of useless ones.\n\

\n\
set/anntalk\n\
\n\

allows you to see them again. This is the default.\n\

\n\

unset/beep

\n\
    \n\
  • unset/beep\n\
  • \n\
\n\

Stop beeps for DX and other messages on your terminal\n\

\n\

unset/dx

\n\
    \n\
  • unset/dx\n\
  • \n\
\n\

Stop DX messages coming out on your terminal\n\

\n\

unset/dxcq

\n\
    \n\
  • unset/dxcq\n\
  • \n\
\n\

Stop CQ Zones on the end of DX announcements\n\

\n\

unset/dxgrid

\n\
    \n\
  • unset/dxgrid\n\
  • \n\
\n\

Stop QRA Grid Square announcements

\n\

A standard feature which is enabled in version 1.43 and above is\n\ that if the spotter's grid square is known it is output on the end\n\ of a DX announcement (there is just enough room). Some user\n\ programs cannot cope with this. You can use this command to reset\n\ (or set) this feature.\n\

\n\

Conflicts with: SET/DXCQ, SET/DXITU\n\

\n\

Do a STAT/USER to see which flags you have set if you are\n\ confused.\n\

\n\

unset/dxitu

\n\
    \n\
  • unset/dxitu\n\
  • \n\
\n\

Stop ITU Zones on the end of DX announcements\n\

\n\

unset/echo

\n\
    \n\
  • unset/echo\n\
  • \n\
\n\

Stop the cluster echoing your input\n\

\n\

If you are connected via a telnet session, different\n\ implimentations of telnet handle echo differently depending on\n\ whether you are connected via port 23 or some other port. You can\n\ use this command to change the setting appropriately.\n\

\n\

The setting is stored in your user profile.\n\

\n\

YOU DO NOT NEED TO USE THIS COMMAND IF YOU ARE CONNECTED VIA\n\ AX25.\n\

\n\

unset/email

\n\
    \n\
  • unset/email\n\
  • \n\
\n\

Stop personal messages being forwarded by email\n\

\n\

If any personal messages come in for your callsign then you can\n\ usevthese commands to control whether they are forwarded onto your\n\ email address. To enable the forwarding do something like:-\n\

\n\
SET/EMAIL mike.tubby@somewhere.com\n\
\n\

You can have more than one email address (each one separated by a\n\ space). Emails are forwarded to all the email addresses you\n\ specify.\n\

\n\

You can disable forwarding by:-\n\

\n\
UNSET/EMAIL\n\
\n\

unset/here

\n\
    \n\
  • unset/here\n\
  • \n\
\n\

Tell the system you are absent from your terminal\n\

\n\

unset/logininfo

\n\
    \n\
  • unset/logininfo\n\
  • \n\
\n\

No longer inform when a station logs in/out locally\n\

\n\

unset/privilege

\n\
    \n\
  • unset/privilege\n\
  • \n\
\n\

Remove any privilege for this session\n\

\n\

You can use this command to 'protect' this session from\n\ unauthorised use. If you want to get your normal privilege back\n\ you will need to either logout and login again (if you are on a\n\ console) or use the SYSOP command.\n\

\n\

unset/prompt

\n\
    \n\
  • unset/prompt\n\
  • \n\
\n\

Set your prompt back to default\n\

\n\

UNSET/PROMPT will undo the SET/PROMPT command and set your prompt\n\ back to normal.\n\

\n\

unset/startup

\n\
    \n\
  • unset/startup\n\
  • \n\
\n\

Remove your own startup script\n\

\n\

unset/talk

\n\
    \n\
  • unset/talk\n\
  • \n\
\n\

Stop TALK messages coming out on your terminal\n\

\n\

unset/usstate

\n\
    \n\
  • unset/usstate\n\
  • \n\
\n\

Stop US State info on the end of DX announcements\n\

\n\

If the spotter's or spotted's US State is known it is output on\n\ the end of a DX announcement (there is just enough room).\n\

\n\

A spotter's state will appear on the RHS of the time (like\n\ SET/DXGRID) and the spotted's State will appear on the LHS of the\n\ time field. Any information found will override any locator\n\ information from SET/DXGRID.\n\

\n\

Some user programs cannot cope with this. You can use this\n\ command to reset (or set) this feature.\n\

\n\

Conflicts with: SET/DXCQ, SET/DXITU\n\

\n\

Do a STAT/USER to see which flags you have set if you are\n\ confused.\n\

\n\

unset/wcy

\n\
    \n\
  • unset/wcy\n\
  • \n\
\n\

Stop WCY messages coming out on your terminal\n\

\n\

unset/wwv

\n\
    \n\
  • unset/wwv\n\
  • \n\
\n\

Stop WWV messages coming out on your terminal\n\

\n\

unset/wx

\n\
    \n\
  • unset/wx\n\
  • \n\
\n\

Stop WX messages coming out on your terminal\n\

\n\

who

\n\
    \n\
  • who\n\
  • \n\
\n\

Show who is physically connected\n\

\n\

This is a quick listing that shows which callsigns are connected\n\ and what sort of connection they have.\n\

\n\

wx

\n\
    \n\
  • wx <text>\n\
  • \n\
\n\

Send a weather message to local users\n\

\n\
    \n\
  • wx full <text>\n\
  • \n\
\n\

Send a weather message to all cluster users\n\

\n\ \n\ "; fldigi-4.2.05/src/dxcluster/dxcluster.cxx0000664000175000017500000011471314611711171015337 00000000000000// ===================================================================== // // dxcluster.cxx // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "fl_digi.h" #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "threads.h" #include "strutil.h" #include "fileselect.h" #include "logsupport.h" #include "dx_dialog.h" #include "dx_cluster.h" #include "confdialog.h" #ifdef __MINGW32__ # include "compat/mingw.h" #endif LOG_FILE_SOURCE(debug::LOG_FD); //#define DXC_DEBUG 1 pthread_mutex_t dxcc_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t dxc_line_mutex = PTHREAD_MUTEX_INITIALIZER; //forward declarations of local functions void DXcluster_start(); static char even[50]; static char odd[50]; //====================================================================== // Socket DXcluster i/o used on all platforms //====================================================================== pthread_t DXcluster_thread; pthread_mutex_t DXcluster_mutex = PTHREAD_MUTEX_INITIALIZER; Socket *DXcluster_socket = 0; enum DXC_STATES {DISCONNECTED, CONNECTING, CONNECTED}; int DXcluster_state = DISCONNECTED; bool DXcluster_exit = false; bool DXcluster_enabled = false; #define DXCLUSTER_CONNECT_TIMEOUT 5000 // 5 second timeout #define DXCLUSTER_SOCKET_TIMEOUT 200 // milliseconds #define DXCLUSTER_LOOP_TIME 100 // milliseconds int DXcluster_connect_timeout = (DXCLUSTER_CONNECT_TIMEOUT) / (DXCLUSTER_SOCKET_TIMEOUT + DXCLUSTER_LOOP_TIME); //====================================================================== // support routines all called from DXcluster thread using REQ(...) //====================================================================== void set_btn_dxcc_connect(bool v) { btn_dxcc_connect->value(v); btn_dxcc_connect->redraw(); } void dxc_label() { switch (DXcluster_state) { case CONNECTING: lbl_dxc_connected->color(FL_YELLOW); cluster_tabs->value(tabDXclusterTelNetStream); break; case CONNECTED: lbl_dxc_connected->color(FL_GREEN); cluster_tabs->value(tabDXclusterTelNetStream); break; case DISCONNECTED: default : lbl_dxc_connected->color(FL_WHITE); } lbl_dxc_connected->redraw_label(); lbl_dxc_connected->redraw(); } static std::string trim(std::string s) { size_t p; while (s[s.length()-1] == ' ') s.erase(s.length()-1, 1); while ( (p = s.find("\x07")) != std::string::npos) s.erase(p, 1); while ((p = s.find("\r")) != std::string::npos) s.erase(p,1); while ((p = s.find("\n")) != std::string::npos) s.erase(p,1); return s; } //-------------------------------------------------------------------------------- // 1 2 3 4 5 6 7 //01234567890123456789012345678901234567890123456789012345678901234567890123456789 // 1 ^ 2 ^ 3 ^4 5 6 ^ //DX de KB8O: 14240.0 D66D up 10 59 Ohio 2059Z EN81 //DX de W4DL: 18082.0 V44KAI 2220Z //DX de K2IOF: 14240.0 D66D up 5 2220Z //DX de N3ZV: 10147.0 AN400G RTTY 2220Z FM18 //DX de W4LT: 14204.0 EA3HSO 2218Z EL88 //-------------------------------------------------------------------------------- static std::string tcpip_buffer; void show_tx_stream(std::string buff) { size_t p; while ((p = buff.find("\r")) != std::string::npos) buff.erase(p,1); if (buff[buff.length()-1] != '\n') buff += '\n'; brws_tcpip_stream->insert_position(brws_tcpip_stream->buffer()->length()); brws_tcpip_stream->addstr(buff, FTextBase::XMIT); #ifdef DXC_DEBUG std::string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "a"); fprintf(dxcdebug, "[T]:%s\n", buff.c_str()); fclose(dxcdebug); #endif } void show_rx_stream(std::string buff) { for (size_t p = 0; p < buff.length(); p++) { if ( (buff[p] < '\n') || (buff[p] > '\n' && buff[p] < ' ') || (buff[p] > '~') ) buff[p] = ' '; } if (buff.empty()) buff = "\n"; else if (buff[buff.length()-1] != '\n') buff += '\n'; brws_tcpip_stream->insert_position(brws_tcpip_stream->buffer()->length()); brws_tcpip_stream->addstr(buff, FTextBase::RECV); #ifdef DXC_DEBUG std::string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "a"); fprintf(dxcdebug, "[R]:%s\n", buff.c_str()); fclose(dxcdebug); #endif } void show_error(std::string buff) { if (buff.empty()) return; if (!brws_tcpip_stream) return; if (buff[buff.length()-1] != '\n') buff += '\n'; brws_tcpip_stream->addstr(buff, FTextBase::CTRL); brws_tcpip_stream->redraw(); #ifdef DXC_DEBUG std::string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "a"); fprintf(dxcdebug, "[E]:%s\n", buff.c_str()); fclose(dxcdebug); #endif } static void odd_even() { char hdr[100]; snprintf(hdr, sizeof(hdr), "@F%d@S%d@.Spotter Freq Dx Station Notes UTC LOC", progdefaults.DXC_textfont, progdefaults.DXC_textsize); reports_header->clear(); reports_header->add(hdr); reports_header->redraw(); snprintf(odd, sizeof(odd), "@B%u@C%u@F%d@S%d@.", progdefaults.DXC_odd_color, FL_BLACK, progdefaults.DXC_textfont, progdefaults.DXC_textsize); snprintf(even, sizeof(even), "@B%u@C%u@F%d@S%d@.", progdefaults.DXC_even_color, FL_BLACK, progdefaults.DXC_textfont, progdefaults.DXC_textsize); } void dxc_lines_redraw() { guard_lock dxcc_lock(&dxc_line_mutex); odd_even(); int n = brws_dx_cluster->size(); if (n == 0) return; std::queue lines; std::string dxc_line; size_t p; for (int i = 0; i < n; i++) { dxc_line = brws_dx_cluster->text(i+1); p = dxc_line.find("."); if (p != std::string::npos) dxc_line.erase(0,p+1); lines.push(dxc_line); } brws_dx_cluster->clear(); for (int i = 0; i < n; i++) { if (i % 2) dxc_line.assign(even); else dxc_line.assign(odd); dxc_line.append(lines.front()); lines.pop(); brws_dx_cluster->insert(1, dxc_line.c_str()); } if (progdefaults.dxc_topline) brws_dx_cluster->make_visible(1); else brws_dx_cluster->bottomline(brws_dx_cluster->size()); brws_dx_cluster->redraw(); } void dxc_lines() { guard_lock dxcc_lock(&dxc_line_mutex); odd_even(); int n = brws_dx_cluster->size(); if (n == 0) return; std::queue lines; std::string dxc_line; size_t p; for (int i = 0; i < n; i++) { if (progdefaults.dxc_topline) dxc_line = brws_dx_cluster->text(i+1); else dxc_line = brws_dx_cluster->text(n - i); p = dxc_line.find("."); if (p != std::string::npos) dxc_line.erase(0,p+1); lines.push(dxc_line); } brws_dx_cluster->clear(); for (int i = 0; i < n; i++) { if (i % 2) dxc_line.assign(even); else dxc_line.assign(odd); dxc_line.append(lines.front()); lines.pop(); if (progdefaults.dxc_topline) brws_dx_cluster->insert(1, dxc_line.c_str()); else brws_dx_cluster->add(dxc_line.c_str()); } if (progdefaults.dxc_topline) brws_dx_cluster->make_visible(1); else brws_dx_cluster->bottomline(brws_dx_cluster->size()); brws_dx_cluster->redraw(); } void parse_dxline(std::string buffer) { guard_lock dxcc_lock(&dxc_line_mutex); snprintf(odd, sizeof(odd), "@B%u@C%u@F%d@S%d@.", progdefaults.DXC_odd_color, FL_BLACK, progdefaults.DXC_textfont, progdefaults.DXC_textsize); snprintf(even, sizeof(even), "@B%u@C%u@F%d@S%d@.", progdefaults.DXC_even_color, FL_BLACK, progdefaults.DXC_textfont, progdefaults.DXC_textsize); buffer.erase(0, strlen("DX de ")); size_t p = buffer.find(":"); if (p != std::string::npos) buffer.replace(p, 1, " "); std::string dxc_line; if (brws_dx_cluster->size() % 2) dxc_line.assign(even); else dxc_line.assign(odd); dxc_line.append(buffer); if (progdefaults.dxc_topline) { bool visible = brws_dx_cluster->displayed(1); brws_dx_cluster->insert(1, dxc_line.c_str()); if (visible) brws_dx_cluster->make_visible(1); } else { bool visible = brws_dx_cluster->displayed(brws_dx_cluster->size()); brws_dx_cluster->add(dxc_line.c_str()); if (visible) brws_dx_cluster->bottomline(brws_dx_cluster->size()); } } void show_help_line(std::string buff) { brws_dxc_help->insert_position(brws_dxc_help->buffer()->length()); brws_dxc_help->addstr(buff, FTextBase::RECV); #ifdef DXC_DEBUG std::string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "a"); fprintf(dxcdebug, "[W]:%s\n", buff.c_str()); fclose(dxcdebug); #endif } enum server_type {NIL, DX_SPIDER, AR_CLUSTER, CC_CLUSTER}; static int cluster_login = NIL; static bool logged_in = false; void register_dxspider() { std::string login; login.assign("set/page 0\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/name ").append(progdefaults.myName); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/qth ").append(progdefaults.myQth); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/qra ").append(progdefaults.myLocator); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); } void login_to_dxspider() { if (!DXcluster_socket) return; try { std::string login = progdefaults.dxcc_login; login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); if (progdefaults.dxcc_password.empty()) register_dxspider(); logged_in = true; cluster_login = NIL; } catch (const SocketException& e) { std::string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } void login_to_arcluster() { std::string login = progdefaults.dxcc_login; login.append("\r\n"); try { DXcluster_socket->send(login); REQ(show_tx_stream, login); logged_in = true; cluster_login = NIL; } catch (const SocketException& e) { std::string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } /* * telnet session with dxspots.com 7300 * Trying 204.221.76.52... Connected to dxspots.com. Escape character is '^]'. Greetings from the AE5E CC Cluster in Thief River Falls MN USA Running CC Cluster software version 3.101b ************************************************************************* * * * Please login with a callsign indicating your correct country * * Portable calls are ok. * * * ************************************************************************ New commands: set/skimmer turns on Skimmer spots. set/noskimmer turns off Skimmer spots. set/own turns on Skimmer spots for own call. set/noown turns them off. set/nobeacon turns off spots for beacons. set/beacon turns them back on. For information on CC Cluster software see: http://bcdxc.org/ve7cc/ccc/CCC_Commands.htm Please enter your call: login: w1hkj W1HKJ Hello David. CC-User is the recommended telnet acess program. It simplifies filtering, may be used stand alone or can feed spots to your logging program. CC_User is free at: http://ve7cc.net/default.htm#prog CC_User group at: http://groups.yahoo.com/group/ARUser Using telnet port 7000 Cluster: 423 nodes 459 Locals 4704 Total users Uptime 7 days 15:32 Date Hour SFI A K Forecast Logger 19-Nov-2016 0 78 3 0 No Storms -> No Storms W1HKJ de AE5E 19-Nov-2016 0154Z CCC > W1HKJ de AE5E 19-Nov-2016 0154Z CCC > bye 73 David. W1HKJ de AE5E 19-Nov-2016 0154Z CCC > Connection closed by foreign host. */ void register_cccluster() { std::string login; login.assign("set/name ").append(progdefaults.myName); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/qth ").append(progdefaults.myQth); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/qra ").append(progdefaults.myLocator); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/noskimmer"); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/noown"); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); login.assign("set/nobeacon"); login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); } void login_to_cccluster() { if (!DXcluster_socket) return; try { std::string login = progdefaults.dxcc_login; login.append("\r\n"); DXcluster_socket->send(login); REQ(show_tx_stream, login); if (progdefaults.dxcc_password.empty()) register_cccluster(); logged_in = true; cluster_login = NIL; } catch (const SocketException& e) { std::string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } void send_password() { if (!DXcluster_socket || logged_in == false || inp_dxcc_password->value()[0] == 0) return; try { std::string password = inp_dxcc_password->value(); password.append("\r\n"); DXcluster_socket->send(password); REQ(show_tx_stream, password); switch (cluster_login) { case AR_CLUSTER: break; case CC_CLUSTER: register_cccluster(); break; case DX_SPIDER: register_dxspider(); break; } } catch (const SocketException& e) { std::string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } static bool help_lines = false; void init_cluster_stream() { std::string buffer; help_lines = false; tcpip_buffer.clear(); brws_tcpip_stream->clear(); brws_tcpip_stream->redraw(); } void parse_DXcluster_stream(std::string input_buffer) { guard_lock dxcc_lock(&dxcc_mutex); std::string buffer; std::string ucasebuffer = ucasestr(input_buffer); if (!logged_in) { if (ucasebuffer.find("AR-CLUSTER") != std::string::npos) { // AR cluster init_cluster_stream(); cluster_login = AR_CLUSTER; } else if (ucasebuffer.find("CC CLUSTER") != std::string::npos) { // CC cluster init_cluster_stream(); cluster_login = CC_CLUSTER; } else if (ucasebuffer.find("LOGIN:") != std::string::npos) { // DX Spider init_cluster_stream(); cluster_login = DX_SPIDER; } } tcpip_buffer.append(input_buffer); std::string strm; std::string its_me = progdefaults.dxcc_login; its_me.append(" DE "); its_me = ucasestr(its_me); size_t p; while (!tcpip_buffer.empty()) { p = tcpip_buffer.find("\n"); if (p != std::string::npos) { buffer = trim(tcpip_buffer.substr(0, p)); tcpip_buffer.erase(0, p + 1); } else { buffer = trim(tcpip_buffer); tcpip_buffer.clear(); } REQ(show_rx_stream, buffer); ucasebuffer = ucasestr(buffer); if (ucasebuffer.find("DX DE") != std::string::npos) { parse_dxline(buffer); continue; } if (ucasebuffer.find("HELP") != std::string::npos) { help_lines = true; } if (ucasebuffer.find(its_me) != std::string::npos) { help_lines = false; continue; } if (help_lines) { show_help_line(buffer); continue; } if (cluster_login == AR_CLUSTER && ucasebuffer.find("CALL:") != std::string::npos) login_to_arcluster(); if (cluster_login == CC_CLUSTER && ucasebuffer.find("CALL:") != std::string::npos) login_to_cccluster(); if (cluster_login == DX_SPIDER && ucasebuffer.find("LOGIN:") != std::string::npos) login_to_dxspider(); if (cluster_login == DX_SPIDER && ucasebuffer.find("PASSWORD:") != std::string::npos) send_password(); } } void clear_dxcluster_viewer() { guard_lock dxcc_lock(&dxcc_mutex); brws_dx_cluster->clear(); brws_tcpip_stream->clear(); } //====================================================================== // Receive tcpip data stream //====================================================================== void DXcluster_recv_data() { if (!DXcluster_socket) return; std::string tempbuff; try { guard_lock dxc_lock(&DXcluster_mutex); if (DXcluster_state == CONNECTED) { DXcluster_socket->recv(tempbuff); if (!tempbuff.empty()) REQ(parse_DXcluster_stream, tempbuff); } } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); } } //====================================================================== // //====================================================================== const char *default_help[]={ "Help available after logging on", "Try URL: k4zr.no-ip.org, PORT 7300", "", "Visit http://www.dxcluster.info/telnet/ for a listing of dx cluster servers", NULL }; void dxc_help_query() { // brws_dxc_help->clear(); if ((DXcluster_state == DISCONNECTED) || !DXcluster_socket) { brws_dxc_help->clear(); const char **help = default_help; while (*help) { brws_dxc_help->add(*help); help++; } return; } try { guard_lock dxc_lock(&DXcluster_mutex); std::string sendbuf = "help"; if (inp_help_string->value()[0]) { std::string helptype = inp_help_string->value(); if (ucasestr(helptype).find("HELP") != std::string::npos) sendbuf = helptype; else sendbuf.append(" ").append(helptype); } sendbuf.append("\r\n"); DXcluster_socket->send(sendbuf.c_str()); REQ(show_tx_stream, sendbuf); } catch (const SocketException& e) { std::string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } void dxc_help_clear() { guard_lock dxcc_lock(&dxcc_mutex); brws_dxc_help->clear(); } //====================================================================== // //====================================================================== void DXcluster_submit() { if (!DXcluster_socket) return; try { guard_lock dxc_lock(&DXcluster_mutex); std::string sendbuf = trim(inp_dxcluster_cmd->value()); if (sendbuf[0] == '!') sendbuf.erase(0,1); std::string test = ucasestr(sendbuf); if (test.find("BYE") != std::string::npos) { fl_alert2("Uncheck the \"Connect\" button to disconnect!"); logged_in = false; return; } sendbuf.append("\r\n"); DXcluster_socket->send(sendbuf.c_str()); REQ(show_tx_stream, sendbuf); } catch (const SocketException& e) { std::string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } inp_dxcluster_cmd->value(""); } void rf_af(long &rf, long &af) { mode_t md = active_modem->get_mode(); std::string testmode = qso_opMODE->value(); bool xcvr_useFSK = (testmode.find("RTTY") != std::string::npos); if (md == MODE_SSB) { af = 0; return; } if (md == MODE_CW) { af = progdefaults.CWsweetspot; std::string smode = qso_opMODE->value(); if (smode.find("CW") == std::string::npos) { if (wf->USB()) rf -= af; else rf += af; } } else if (md == MODE_RTTY) { if (xcvr_useFSK) { af = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift]/2; } else { int shift = rtty::SHIFT[progdefaults.rtty_shift]; af = progdefaults.RTTYsweetspot; if (progdefaults.useMARKfreq) { if (wf->USB()) rf -= (af + shift / 2); else rf += (af - shift / 2); } else { if (wf->USB()) rf -= af; else rf += af; } } } else { af = progdefaults.PSKsweetspot; if (wf->USB()) rf -= af; else rf += af; } return; } void DXcluster_select() { int sel = brws_dx_cluster->value(); if (sel == 0) return; //-------------------------------------------------------------------------------- // 1 2 3 4 5 6 7 //01234567890123456789012345678901234567890123456789012345678901234567890123456789 // 1^ ^ 3 ^ 4 5 6 ^ //KB8O 14240.0 D66D up 10 59 Ohio 2059Z EN81 std::string dxcline = brws_dx_cluster->text(sel); size_t p = dxcline.find("@."); if (p == std::string::npos) return; // remove rendition characters dxcline = dxcline.substr(p + 2); // remove reporting stations call p = dxcline.find(" "); dxcline.erase(0, p+1); // find reported frequency while (dxcline[0] == ' ') dxcline.erase(0,1); p = dxcline.find(" "); std::string sfreq = dxcline.substr(0, p); dxcline.erase(0, p+1); // find dx call while (dxcline[0] == ' ') dxcline.erase(0,1); p = dxcline.find(" "); std::string dxcall = trim(dxcline.substr(0, p)); dxcline.erase(0, p+1); // treat remainder as remarks // search for a mode name in the remarks // change to that mode if discovered dxcline = ucasestr(dxcline); for (int i = 0; i < NUM_RXTX_MODES; i++) { if (dxcline.find(mode_info[i].adif_name) != std::string::npos) { if (active_modem->get_mode() != mode_info[i].mode) init_modem_sync(mode_info[i].mode); break; } } inpCall->value(dxcall.c_str()); DupCheck(); long freq = (long)(atof(sfreq.c_str()) * 1000.0 + 0.5); // does remark section have a [nn] block? p = dxcline.find("["); if (p != std::string::npos) { dxcline.erase(0, p+1); p = dxcline.find("]"); if (p == 2) freq += atoi(dxcline.c_str()); } long af = progdefaults.PSKsweetspot; if (active_modem->get_mode() == MODE_CW) af = progdefaults.CWsweetspot; if (active_modem->get_mode() == MODE_RTTY) af = progdefaults.RTTYsweetspot; rf_af(freq, af); qsy(freq, af); } //-------------------------------------------------------------------------------- // 1 2 3 4 5 6 7 //01234567890123456789012345678901234567890123456789012345678901234567890123456789 // 1 ^ 2 ^ 3 ^4 5 6 ^ //7080.4 CO3VR Optional Comment void freqstrings (std::string &khz, std::string &hz ) { std::string sfreq = inpFreq->value(); size_t p = sfreq.find_first_of(".,"); if (p != std::string::npos) sfreq.erase(p,1); int phz = sfreq.length() - 2; hz = sfreq.substr(phz, 2); sfreq.erase(phz); long freq = atol(sfreq.c_str()); if (!progdefaults.dxc_hertz) { if (hz > "49") freq++; } char szfreq[20]; snprintf(szfreq, sizeof(szfreq), "%ld", freq); khz = szfreq; khz.insert(khz.length() - 1, "."); return; } void send_DXcluster_spot() { if (inpCall->value()[0] == 0) return; // no call std::string hz, khz; freqstrings (khz, hz ); std::string spot = "dx "; spot.append(khz) .append(" ") .append(inpCall->value()) .append(" "); std::string comments = trim(inp_dxcluster_cmd->value()); std::string currmode = mode_info[active_modem->get_mode()].adif_name; if (comments.find(currmode) == std::string::npos) { if (progdefaults.dxc_hertz) { currmode.append(" [") .append(hz). append("] "); } comments.insert(0, currmode); } spot.append(comments); inp_dxcluster_cmd->value(spot.c_str()); tabDXclusterTelNetStream->show(); } //====================================================================== // //====================================================================== bool connect_changed; bool connect_to_cluster; void DXcluster_doconnect() { int result = 0; if (connect_to_cluster) { REQ(clear_dxcluster_viewer); try { if (DXcluster_state == DISCONNECTED) { if (DXcluster_socket) { DXcluster_socket->shut_down(); DXcluster_socket->close(); delete DXcluster_socket; DXcluster_socket = 0; DXcluster_state = DISCONNECTED; REQ(dxc_label); } Address addr = Address( progdefaults.dxcc_host_url.c_str(), progdefaults.dxcc_host_port.c_str() ); DXcluster_socket = new Socket( addr ); DXcluster_socket->set_nonblocking(true); DXcluster_socket->set_timeout((double)(DXCLUSTER_SOCKET_TIMEOUT / 1000.0)); } result = DXcluster_socket->connect(); if ( (result == 0) || (result == EISCONN) || (result == EALREADY) ) { DXcluster_state = CONNECTED; REQ(dxc_label); LOG_INFO( "Connected to dxserver %s:%s", progdefaults.dxcc_host_url.c_str(), progdefaults.dxcc_host_port.c_str() ); connect_changed = false; return; } else if ( (result == EWOULDBLOCK) || (result == EINPROGRESS) ) DXcluster_state = CONNECTING; else DXcluster_state = DISCONNECTED; if ((DXcluster_state == CONNECTING) && (DXcluster_connect_timeout-- <= 0) ) { REQ(show_error, "Connection attempt timed out"); DXcluster_state = DISCONNECTED; set_btn_dxcc_connect(false); REQ(dxc_label); DXcluster_socket->shut_down(); DXcluster_socket->close(); delete DXcluster_socket; DXcluster_socket = 0; } else { LOG_INFO("Connecting %f seconds remaining", DXcluster_connect_timeout * DXCLUSTER_LOOP_TIME * 0.001); } connect_changed = false; return; } catch (const SocketException& e) { std::string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); connect_to_cluster = false; connect_changed = false; DXcluster_state = DISCONNECTED; set_btn_dxcc_connect(false); REQ(dxc_label); return; } } else { if (!DXcluster_socket) { REQ(show_error, "NO socket!"); DXcluster_state = DISCONNECTED; connect_to_cluster = false; connect_changed = false; set_btn_dxcc_connect(false); REQ(dxc_label); return; } try { std::string bye = "BYE\r\n"; DXcluster_socket->send(bye); REQ(show_tx_stream, bye); } catch (const SocketException& e) { std::string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); DXcluster_state = DISCONNECTED; connect_to_cluster = false; connect_changed = false; set_btn_dxcc_connect(false); REQ(dxc_label); return; } MilliSleep(50); logged_in = false; DXcluster_socket->shut_down(); DXcluster_socket->close(); delete DXcluster_socket; DXcluster_socket = 0; DXcluster_state = DISCONNECTED; lbl_dxc_connected->color(FL_WHITE); lbl_dxc_connected->redraw(); progStatus.cluster_connected = false; set_btn_dxcc_connect(false); LOG_INFO("Disconnected from dxserver"); } connect_changed = false; } void DXcluster_connect(bool val) { connect_changed = true; connect_to_cluster = val; } //====================================================================== // Thread loop //====================================================================== void *DXcluster_loop(void *args) { SET_THREAD_ID(DXCC_TID); while(1) { MilliSleep(DXCLUSTER_LOOP_TIME); if (DXcluster_exit) break; if (connect_changed || (DXcluster_state == CONNECTING) ) DXcluster_doconnect(); if (DXcluster_state == CONNECTED) DXcluster_recv_data(); } // exit the DXCC thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== void DXcluster_init(void) { DXcluster_enabled = false; DXcluster_exit = false; if (pthread_create(&DXcluster_thread, NULL, DXcluster_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); return; } LOG_INFO("%s", "dxserver thread started"); DXcluster_enabled = true; char hdr[100]; snprintf(hdr, sizeof(hdr), "@F%d@S%d@.Spotter Freq Dx Station Notes UTC LOC", progdefaults.DXC_textfont, progdefaults.DXC_textsize); reports_header->clear(); reports_header->add(hdr); reports_header->has_scrollbar(0); brws_tcpip_stream->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_tcpip_stream->setFont(progdefaults.DXfontnbr); brws_tcpip_stream->setFontSize(progdefaults.DXfontsize); brws_tcpip_stream->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->setFontColor( fl_contrast(progdefaults.DXfontcolor, fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B) ), FTextBase::CTRL); ed_telnet_cmds->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); ed_telnet_cmds->setFont(progdefaults.DXfontnbr); ed_telnet_cmds->setFontSize(progdefaults.DXfontsize); ed_telnet_cmds->setFontColor(progdefaults.DXfontcolor); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); cluster_tabs->selection_color(progdefaults.TabsColor); if (progdefaults.dxc_auto_connect) { DXcluster_connect(true); set_btn_dxcc_connect(true); } #ifdef DXC_DEBUG std::string pname = "TempDir"; pname.append("dxcdebug.txt", "a"); FILE *dxcdebug = fl_fopen(pname.c_str(), "w"); fprintf(dxcdebug, "DXC session\n\n"); fclose(dxcdebug); #endif } //====================================================================== // //====================================================================== void DXcluster_close(void) { if (!DXcluster_enabled) return; if ((DXcluster_state != DISCONNECTED) && DXcluster_socket) { DXcluster_connect(false); int n = 500; while ((DXcluster_state != DISCONNECTED) && n) { MilliSleep(10); n--; } if (n == 0) { LOG_ERROR("%s", _("Failed to shut down dxcluster socket")); fl_message2(_("Failed to shut down dxcluster socket")); exit(1); return; } } DXcluster_exit = true; pthread_join(DXcluster_thread, NULL); DXcluster_enabled = false; LOG_INFO("%s", "dxserver thread terminated. "); if (DXcluster_socket) { DXcluster_socket->shut_down(); DXcluster_socket->close(); } } void dxcluster_hosts_save() { std::string hosts = ""; int nlines = brws_dxcluster_hosts->size(); if (!nlines) { progdefaults.dxcluster_hosts = hosts; return; } std::string hostline; size_t p; for (int n = 1; n <= nlines; n++) { hostline = brws_dxcluster_hosts->text(n); p = hostline.find("@."); if (p != std::string::npos) hostline.erase(0,p+2); hosts.append(hostline).append("|"); } progdefaults.dxcluster_hosts = hosts; progdefaults.changed = true; } void dxcluster_hosts_load() { brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); brws_dxcluster_hosts->clear(); if (progdefaults.dxcluster_hosts.empty()) { return; } std::string hostline; std::string hosts = progdefaults.dxcluster_hosts; size_t p = hosts.find("|"); size_t p2; while (p != std::string::npos && p != 0) { hostline.assign(hosts.substr(0,p+1)); p2 = hostline.find("::|"); if (p2 != std::string::npos) hostline.insert(p2 + 1, progdefaults.myCall); p2 = hostline.find("|"); if (p2 != std::string::npos) hostline.erase(p2, 1); brws_dxcluster_hosts->add(hostline.c_str()); hosts.erase(0, p+1); p = hosts.find("|"); } brws_dxcluster_hosts->sort(FL_SORT_ASCENDING); brws_dxcluster_hosts->redraw(); } void dxcluster_hosts_select(Fl_Button*, void*) { std::string host_line; int line_nbr = brws_dxcluster_hosts->value(); if (line_nbr == 0) return; host_line = brws_dxcluster_hosts->text(line_nbr); std::string host_name, host_port, host_login, host_password; size_t p = host_line.find("@."); if (p != std::string::npos) host_line.erase(0, p + 2); p = host_line.find(":"); if (p == std::string::npos) return; host_name = host_line.substr(0, p); host_line.erase(0, p+1); p = host_line.find(":"); if (p == std::string::npos) return; host_port = host_line.substr(0, p); host_line.erase(0, p+1); p = host_line.find(":"); if (p == std::string::npos) host_login = host_line; else { host_login = host_line.substr(0, p); host_line.erase(0, p+1); host_password = host_line; } progdefaults.dxcc_host_url = host_name; inp_dxcc_host_url->value(host_name.c_str()); inp_dxcc_host_url->redraw(); progdefaults.dxcc_host_port = host_port; inp_dccc_host_port->value(host_port.c_str()); inp_dccc_host_port->redraw(); progdefaults.dxcc_login = host_login; inp_dccc_login->value(host_login.c_str()); inp_dccc_login->redraw(); progdefaults.dxcc_password = host_password; inp_dxcc_password->value(host_password.c_str()); inp_dxcc_password->redraw(); } void dxcluster_hosts_delete(Fl_Button*, void*) { int line_nbr = brws_dxcluster_hosts->value(); if (line_nbr == 0) return; brws_dxcluster_hosts->remove(line_nbr); dxcluster_hosts_save(); brws_dxcluster_hosts->redraw(); } void dxcluster_hosts_clear(Fl_Button*, void*) { brws_dxcluster_hosts->clear(); dxcluster_hosts_save(); brws_dxcluster_hosts->redraw(); } void dxcluster_hosts_add(Fl_Button*, void*) { brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); std::string host_line = progdefaults.dxcc_host_url.c_str(); host_line.append(":").append(progdefaults.dxcc_host_port.c_str()); host_line.append(":").append(progdefaults.dxcc_login); host_line.append(":").append(progdefaults.dxcc_password); if (brws_dx_cluster->size() > 0) { for (int i = 1; i <= brws_dxcluster_hosts->size(); i++) { if (host_line == brws_dxcluster_hosts->text(i)) return; } } brws_dxcluster_hosts->add(host_line.c_str()); brws_dxcluster_hosts->sort(FL_SORT_ASCENDING); brws_dxcluster_hosts->redraw(); dxcluster_hosts_save(); } void dxcluster_hosts_clear_setup(Fl_Button*, void*) { ed_telnet_cmds->clear(); } void dxcluster_hosts_load_setup(Fl_Button*, void*) { const char* p = FSEL::select( _("Load dxcluster setup file"), "*.dxc", ScriptsDir.c_str()); if (!p) return; if (!*p) return; ed_telnet_cmds->buffer()->loadfile(p); } void dxcluster_hosts_save_setup(Fl_Button*, void*) { std::string defaultfilename = ScriptsDir; defaultfilename.append("default.dxc"); const char* p = FSEL::saveas( _("Save dxcluster setup file"), "*.dxc", defaultfilename.c_str()); if (!p) return; if (!*p) return; ed_telnet_cmds->buffer()->savefile(p); } void dxc_sendstring(std::string &tosend) { if (!DXcluster_socket) return; std::string line; size_t p; while (!tosend.empty()) { p = tosend.find("\n"); if (p != std::string::npos) { line = tosend.substr(0,p); tosend.erase(0,p+1); } else { line = tosend; tosend.clear(); } line.append("\r\n"); try { DXcluster_socket->send(line); REQ(show_tx_stream, line); } catch (const SocketException& e) { std::string serr = e.what(); LOG_ERROR("%s", serr.c_str() ); REQ(show_error, serr); } } } void dxcluster_hosts_send_setup(Fl_Button*, void*) { char *str = ed_telnet_cmds->buffer()->text(); std::string tosend = str; free(str); dxc_sendstring(tosend); } #include "arc-help.cxx" void dxcluster_ar_help(Fl_Button*, void*) { std::string fn_help = HelpDir; fn_help.append("arc_help.html"); std::ifstream f_help(fn_help.c_str()); if (!f_help) { std::ofstream fo_help(fn_help.c_str()); fo_help << arc_commands; fo_help.close(); } else f_help.close(); cb_mnuVisitURL(0, (void*)fn_help.c_str()); } #include "CCC_Commands.cxx" void dxcluster_cc_help(Fl_Button*, void*) { std::string fn_help = HelpDir; fn_help.append("ccc_help.html"); std::ifstream f_help(fn_help.c_str()); if (!f_help) { std::ofstream fo_help(fn_help.c_str()); fo_help << ccc_commands; fo_help.close(); } else f_help.close(); cb_mnuVisitURL(0, (void*)fn_help.c_str()); } #include "DXSpiderCommandReference.cxx" void dxcluster_dx_help(Fl_Button*, void*) { std::string fn_help = HelpDir; fn_help.append("dxc_help.html"); std::ifstream f_help(fn_help.c_str()); if (!f_help) { std::ofstream fo_help(fn_help.c_str()); fo_help << dxspider_cmds; fo_help.close(); } else f_help.close(); cb_mnuVisitURL(0, (void*)fn_help.c_str()); } #include "DXClusterServers.cxx" void dxcluster_servers(Fl_Button*, void*) { std::string fn_help = HelpDir; fn_help.append("dxc_servers.html"); std::ifstream f_help(fn_help.c_str()); if (!f_help) { std::ofstream fo_help(fn_help.c_str()); fo_help << dxcc_servers; fo_help.close(); } else f_help.close(); cb_mnuVisitURL(0, (void*)fn_help.c_str()); } void dxc_click_m1(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_1.c_str()); if (progdefaults.dxcm_text_1[0] == '!') DXcluster_submit(); } void dxc_click_m2(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_2.c_str()); if (progdefaults.dxcm_text_2[0] == '!') DXcluster_submit(); } void dxc_click_m3(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_3.c_str()); if (progdefaults.dxcm_text_3[0] == '!') DXcluster_submit(); } void dxc_click_m4(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_4.c_str()); if (progdefaults.dxcm_text_4[0] == '!') DXcluster_submit(); } void dxc_click_m5(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_5.c_str()); if (progdefaults.dxcm_text_5[0] == '!') DXcluster_submit(); } void dxc_click_m6(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_6.c_str()); if (progdefaults.dxcm_text_6[0] == '!') DXcluster_submit(); } void dxc_click_m7(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_7.c_str()); if (progdefaults.dxcm_text_7[0] == '!') DXcluster_submit(); } void dxc_click_m8(Fl_Button*, void*) { inp_dxcluster_cmd->value(progdefaults.dxcm_text_8.c_str()); if (progdefaults.dxcm_text_8[0] == '!') DXcluster_submit(); } fldigi-4.2.05/src/rsid/0000775000175000017500000000000014611714005011572 500000000000000fldigi-4.2.05/src/rsid/rsid.cxx0000664000175000017500000007251014611711171013205 00000000000000// ---------------------------------------------------------------------------- // // rsid.cxx // // Copyright (C) 2008-2012 // Dave Freese, W1HKJ // Copyright (C) 2009-2012 // Stelios Bounanos, M0GLD // Copyright (C) 2012 // John Douyere, VK2ETA // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "rsid.h" #include "filters.h" #include "misc.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "confdialog.h" #include "qrunner.h" #include "notify.h" #include "debug.h" #include "main.h" #include "arq_io.h" #include "data_io.h" #include "audio_alert.h" LOG_FILE_SOURCE(debug::LOG_MODEM); #include "rsid_defs.cxx" #define RSWINDOW 1 const int cRsId::Squares[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 0, 2, 4, 6, 8,10,12,14, 9,11,13,15, 1, 3, 5, 7, 0, 3, 6, 5,12,15,10, 9, 1, 2, 7, 4,13,14,11, 8, 0, 4, 8,12, 9,13, 1, 5,11,15, 3, 7, 2, 6,10,14, 0, 5,10,15,13, 8, 7, 2, 3, 6, 9,12,14,11, 4, 1, 0, 6,12,10, 1, 7,13,11, 2, 4,14, 8, 3, 5,15, 9, 0, 7,14, 9, 5, 2,11,12,10,13, 4, 3,15, 8, 1, 6, 0, 8, 9, 1,11, 3, 2,10,15, 7, 6,14, 4,12,13, 5, 0, 9,11, 2,15, 6, 4,13, 7,14,12, 5, 8, 1, 3,10, 0,10,13, 7, 3, 9,14, 4, 6,12,11, 1, 5,15, 8, 2, 0,11,15, 4, 7,12, 8, 3,14, 5, 1,10, 9, 2, 6,13, 0,12, 1,13, 2,14, 3,15, 4, 8, 5, 9, 6,10, 7,11, 0,13, 3,14, 6,11, 5, 8,12, 1,15, 2,10, 7, 9, 4, 0,14, 5,11,10, 4,15, 1,13, 3, 8, 6, 7, 9, 2,12, 0,15, 7, 8,14, 1, 9, 6, 5,10, 2,13,11, 4,12, 3 }; const int cRsId::indices[] = { 2, 4, 8, 9, 11, 15, 7, 14, 5, 10, 13, 3 }; cRsId::cRsId() { int error; src_state = src_new(progdefaults.sample_converter, 1, &error); if (error) { LOG_ERROR("src_new error %d: %s", error, src_strerror(error)); abort(); } src_data.end_of_input = 0; reset(); rsfft = new g_fft(RSID_ARRAY_SIZE); memset(fftwindow, 0, sizeof(fftwindow)); if (RSWINDOW) { for (int i = 0; i < RSID_ARRAY_SIZE; i++) // fftwindow[i] = blackman ( 1.0 * i / RSID_ARRAY_SIZE ); fftwindow[i] = hamming ( 1.0 * i / RSID_ARRAY_SIZE ); // fftwindow[i] = hanning ( 1.0 * i / RSID_ARRAY_SIZE ); // fftwindow[i] = 1.0; } pCodes1 = new unsigned char[rsid_ids_size1 * RSID_NSYMBOLS]; memset(pCodes1, 0, sizeof(pCodes1) * sizeof(unsigned char)); pCodes2 = new unsigned char[rsid_ids_size2 * RSID_NSYMBOLS]; memset(pCodes2, 0, sizeof(pCodes2) * sizeof(unsigned char)); // Initialization of assigned mode/submode IDs. unsigned char* c; for (int i = 0; i < rsid_ids_size1; i++) { c = pCodes1 + i * RSID_NSYMBOLS; Encode(rsid_ids_1[i].rs, c); } for (int i = 0; i < rsid_ids_size2; i++) { c = pCodes2 + i * RSID_NSYMBOLS; Encode(rsid_ids_2[i].rs, c); } #if 0 printf("pcode 1\n"); printf(",rs, name, mode,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\n"); for (int i = 0; i < rsid_ids_size1; i++) { printf("%d,%d,%s,%d", i, rsid_ids_1[i].rs, rsid_ids_1[i].name, rsid_ids_1[i].mode); for (int j = 0; j < RSID_NSYMBOLS + 1; j++) printf(",%d", pCodes1[i*(RSID_NSYMBOLS + 1) + j]); printf("\n"); } printf("\npcode 2\n"); printf(", rs, name, mode,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14\n"); for (int i = 0; i < rsid_ids_size2; i++) { printf("%d,%d,%s,%d", i, rsid_ids_2[i].rs, rsid_ids_2[i].name, rsid_ids_2[i].mode); for (int j = 0; j < RSID_NSYMBOLS + 1; j++) printf(",%d", pCodes2[i*(RSID_NSYMBOLS+ 1) + j]); printf("\n"); } #endif nBinLow = 3; nBinHigh = RSID_FFT_SIZE - 32; // - RSID_NTIMES - 2 outbuf = 0; symlen = 0; reset(); } cRsId::~cRsId() { delete [] pCodes1; delete [] pCodes2; delete [] outbuf; delete rsfft; src_delete(src_state); } void cRsId::reset() { iPrevDistance = iPrevDistance2 = 99; bPrevTimeSliceValid = bPrevTimeSliceValid2 = false; found1 = found2 = false; rsid_secondary_time_out = 0; memset(aInputSamples, 0, (RSID_ARRAY_SIZE * 2) * sizeof(float)); memset(aFFTAmpl, 0, RSID_FFT_SIZE * sizeof(rs_fft_type)); memset(fft_buckets, 0, RSID_NTIMES * RSID_FFT_SIZE * sizeof(int)); for (int n = 0; n < RSID_ARRAY_SIZE; n++) aFFTcmplx[n] = cmplx(0,0); int error = src_reset(src_state); if (error) LOG_ERROR("src_reset error %d: %s", error, src_strerror(error)); src_data.src_ratio = 0.0; inptr = RSID_FFT_SIZE; hamming_resolution = progdefaults.RsID_label_type; } void cRsId::Encode(int code, unsigned char *rsid) { rsid[0] = code >> 8; rsid[1] = (code >> 4) & 0x0f; rsid[2] = code & 0x0f; for (int i = 3; i < RSID_NSYMBOLS; i++) rsid[i] = 0; for (int i = 0; i < 12; i++) { for (int j = RSID_NSYMBOLS - 1; j > 0; j--) rsid[j] = rsid[j - 1] ^ Squares[(rsid[j] << 4) + indices[i]]; rsid[0] = Squares[(rsid[0] << 4) + indices[i]]; } } void cRsId::CalculateBuckets(const rs_fft_type *pSpectrum, int iBegin, int iEnd) { rs_fft_type Amp = 0.0, AmpMax = 0.0; int iBucketMax = iBegin - 2; int j; for (int i = iBegin; i < iEnd; i += 2) { if (iBucketMax == i - 2) { AmpMax = pSpectrum[i]; iBucketMax = i; for (j = i + 2; j < i + RSID_NTIMES + 2; j += 2) { Amp = pSpectrum[j]; if (Amp > AmpMax) { AmpMax = Amp; iBucketMax = j; } } } else { j = i + RSID_NTIMES; Amp = pSpectrum[j]; if (Amp > AmpMax) { AmpMax = Amp; iBucketMax = j; } } fft_buckets[RSID_NTIMES - 1][i] = (iBucketMax - i) >> 1; } } void cRsId::receive(const float* buf, size_t len) { if (len == 0) return; int srclen = static_cast(len); double src_ratio = RSID_SAMPLE_RATE / active_modem->get_samplerate(); if (rsid_secondary_time_out > 0) { rsid_secondary_time_out -= 1.0 * len / active_modem->get_samplerate(); if (rsid_secondary_time_out <= 0) { LOG_INFO("%s", "Secondary RsID timed out"); reset(); } } if (src_data.src_ratio != src_ratio) { src_data.src_ratio = src_ratio; src_set_ratio(src_state, src_data.src_ratio); } while (srclen > 0) { src_data.data_in = const_cast(buf); src_data.input_frames = srclen; src_data.data_out = &aInputSamples[inptr]; src_data.output_frames = RSID_ARRAY_SIZE * 2 - inptr; src_data.input_frames_used = 0; int error = src_process(src_state, &src_data); if (unlikely(error)) { LOG_ERROR("src_process error %d: %s", error, src_strerror(error)); return; } size_t gend = src_data.output_frames_gen; size_t used = src_data.input_frames_used; inptr += gend; buf += used; srclen -= used; while (inptr >= RSID_ARRAY_SIZE) { search(); memmove(&aInputSamples[0], &aInputSamples[RSID_FFT_SAMPLES], (RSID_BUFFER_SIZE - RSID_FFT_SAMPLES)*sizeof(float)); inptr -= RSID_FFT_SAMPLES; } } } void cRsId::search(void) { if (progdefaults.rsidWideSearch) { nBinLow = 3; nBinHigh = RSID_FFT_SIZE - 32; } else { float centerfreq = active_modem->get_freq(); float bpf = 1.0 * RSID_ARRAY_SIZE / RSID_SAMPLE_RATE; nBinLow = (int)((centerfreq - progdefaults.rsid_min_bw / 2) * bpf); nBinHigh = (int)((centerfreq + progdefaults.rsid_min_bw / 2) * bpf); } if (nBinLow < 3) nBinLow = 3; if (nBinHigh > RSID_FFT_SIZE - 32) nBinHigh = RSID_FFT_SIZE - 32; bool bReverse = !(wf->Reverse() ^ wf->USB()); if (bReverse) { nBinLow = RSID_FFT_SIZE - nBinHigh; nBinHigh = RSID_FFT_SIZE - nBinLow; } if (RSWINDOW) { for (int i = 0; i < RSID_ARRAY_SIZE; i++) aFFTcmplx[i] = cmplx(aInputSamples[i] * fftwindow[i], 0); } else { for (int i = 0; i < RSID_ARRAY_SIZE; i++) aFFTcmplx[i] = cmplx(aInputSamples[i], 0); } rsfft->ComplexFFT(aFFTcmplx); memset(aFFTAmpl, 0, sizeof(aFFTAmpl)); static const double pscale = 4.0 / (RSID_FFT_SIZE * RSID_FFT_SIZE); if (unlikely(bReverse)) { for (int i = 0; i < RSID_FFT_SIZE; i++) aFFTAmpl[RSID_FFT_SIZE - 1 - i] = norm(aFFTcmplx[i]) * pscale; } else { for (int i = 0; i < RSID_FFT_SIZE; i++) aFFTAmpl[i] = norm(aFFTcmplx[i]) * pscale; } int bucket_low = 3; int bucket_high = RSID_FFT_SIZE - 32; if (bReverse) { bucket_low = RSID_FFT_SIZE - bucket_high; bucket_high = RSID_FFT_SIZE - bucket_low; } memmove(fft_buckets, &(fft_buckets[1][0]), (RSID_NTIMES - 1) * RSID_FFT_SIZE * sizeof(int)); memset(&(fft_buckets[RSID_NTIMES - 1][0]), 0, RSID_FFT_SIZE * sizeof(int)); CalculateBuckets ( aFFTAmpl, bucket_low, bucket_high - RSID_NTIMES); CalculateBuckets ( aFFTAmpl, bucket_low + 1, bucket_high - RSID_NTIMES); int symbol_out_1 = -1; int bin_out_1 = -1; int symbol_out_2 = -1; int bin_out_2 = -1; if (rsid_secondary_time_out <= 0) { found1 = search_amp(bin_out_1, symbol_out_1, pCodes1); if (found1) { if (symbol_out_1 != RSID_ESCAPE) { if (bReverse) bin_out_1 = 1024 - bin_out_1 - 31; apply(bin_out_1, symbol_out_1, 0); reset(); return; } else { // 10 rsid_gap + 15 symbols + 2 for timing errors rsid_secondary_time_out = 27 * RSID_SYMLEN; return; } } else return; } found2 = search_amp(bin_out_2, symbol_out_2, pCodes2); if (found2) { if (symbol_out_2 != RSID_NONE2) { if (bReverse) bin_out_2 = 1024 - bin_out_2 - 31; apply(bin_out_2, symbol_out_2, 1); } reset(); } } void cRsId::setup_mode(int iSymbol) { switch (iSymbol) { case RSID_RTTY_ASCII_7: progdefaults.rtty_baud = 5; progdefaults.rtty_bits = 1; progdefaults.rtty_shift = 9; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_ASCII_8: progdefaults.rtty_baud = 5; progdefaults.rtty_bits = 2; progdefaults.rtty_shift = 9; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_45: progdefaults.rtty_baud = 1; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_50: progdefaults.rtty_baud = 2; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; REQ(&set_rtty_tab_widgets); break; case RSID_RTTY_75: progdefaults.rtty_baud = 4; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 9; REQ(&set_rtty_tab_widgets); break; // DominoEX / FEC case RSID_DOMINOEX_4: case RSID_DOMINOEX_5: case RSID_DOMINOEX_8: case RSID_DOMINOEX_11: case RSID_DOMINOEX_16: case RSID_DOMINOEX_22: progdefaults.DOMINOEX_FEC = false; REQ(&set_dominoex_tab_widgets); break; case RSID_DOMINOEX_4_FEC: case RSID_DOMINOEX_5_FEC: case RSID_DOMINOEX_8_FEC: case RSID_DOMINOEX_11_FEC: case RSID_DOMINOEX_16_FEC: case RSID_DOMINOEX_22_FEC: progdefaults.DOMINOEX_FEC = true; REQ(&set_dominoex_tab_widgets); break; // olivia parameters case RSID_OLIVIA_4_125: progdefaults.oliviatones = 1; progdefaults.oliviabw = 0; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_250: progdefaults.oliviatones = 1; progdefaults.oliviabw = 1; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_500: progdefaults.oliviatones = 1; progdefaults.oliviabw = 2; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_1000: progdefaults.oliviatones = 1; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_4_2000: progdefaults.oliviatones = 1; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_125: progdefaults.oliviatones = 2; progdefaults.oliviabw = 0; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_250: progdefaults.oliviatones = 2; progdefaults.oliviabw = 1; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_500: progdefaults.oliviatones = 2; progdefaults.oliviabw = 2; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_1000: progdefaults.oliviatones = 2; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_8_2000: progdefaults.oliviatones = 2; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_16_500: progdefaults.oliviatones = 3; progdefaults.oliviabw = 2; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_16_1000: progdefaults.oliviatones = 3; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_16_2000: progdefaults.oliviatones = 3; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_32_1000: progdefaults.oliviatones = 4; progdefaults.oliviabw = 3; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_32_2000: progdefaults.oliviatones = 4; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; case RSID_OLIVIA_64_2000: progdefaults.oliviatones = 5; progdefaults.oliviabw = 4; REQ(&set_olivia_tab_widgets); break; // contestia parameters case RSID_CONTESTIA_4_125: progdefaults.contestiatones = 1; progdefaults.contestiabw = 0; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_250: progdefaults.contestiatones = 1; progdefaults.contestiabw = 1; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_500: progdefaults.contestiatones = 1; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_1000: progdefaults.contestiatones = 1; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_4_2000: progdefaults.contestiatones = 1; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_125: progdefaults.contestiatones = 2; progdefaults.contestiabw = 0; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_250: progdefaults.contestiatones = 2; progdefaults.contestiabw = 1; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_500: progdefaults.contestiatones = 2; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_1000: progdefaults.contestiatones = 2; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_8_2000: progdefaults.contestiatones = 2; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_16_500: progdefaults.contestiatones = 3; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_16_1000: progdefaults.contestiatones = 3; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_16_2000: progdefaults.contestiatones = 3; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_32_1000: progdefaults.contestiatones = 4; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_32_2000: progdefaults.contestiatones = 4; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_64_500: progdefaults.contestiatones = 5; progdefaults.contestiabw = 2; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_64_1000: progdefaults.contestiatones = 5; progdefaults.contestiabw = 3; REQ(&set_contestia_tab_widgets); break; case RSID_CONTESTIA_64_2000: progdefaults.contestiatones = 5; progdefaults.contestiabw = 4; REQ(&set_contestia_tab_widgets); break; default: break; } // switch (iSymbol) } void cRsId::apply(int iBin, int iSymbol, int extended) { ENSURE_THREAD(TRX_TID); double rsidfreq = 0, currfreq = 0; int n, mbin = NUM_MODES; int tblsize; const RSIDs *p_rsid; if (extended) { tblsize = rsid_ids_size2; p_rsid = rsid_ids_2; } else { tblsize = rsid_ids_size1; p_rsid = rsid_ids_1; } currfreq = active_modem->get_freq(); rsidfreq = (iBin + RSID_NSYMBOLS - 0.5) * RSID_SAMPLE_RATE / 2048.0; for (n = 0; n < tblsize; n++) { if (p_rsid[n].rs == iSymbol) { mbin = p_rsid[n].mode; break; } } if (mbin == NUM_MODES) { char msg[50]; if (n < tblsize) // RSID known but unimplemented snprintf(msg, sizeof(msg), "RSID: %s unimplemented", p_rsid[n].name); else // RSID unknown; shouldn't happen snprintf(msg, sizeof(msg), "RSID: code %d unknown", iSymbol); put_status(msg, 4.0); LOG_VERBOSE("%s", msg); return; } if (progdefaults.rsid_rx_modes.test(mbin)) { char msg[50]; snprintf(msg, sizeof(msg), "RSID: %s @ %0.1f Hz", p_rsid[n].name, rsidfreq); LOG_VERBOSE("%s", msg); } else { char msg[50]; snprintf(msg, sizeof(msg), "Ignoring RSID: %s @ %0.1f Hz", p_rsid[n].name, rsidfreq); LOG_DEBUG("%s", msg); return; } if (progdefaults.ENABLE_RSID_MATCH) audio_alert->alert(progdefaults.RSID_MATCH); if (mailclient || mailserver) REQ(pskmail_notify_rsid, mbin); if (progdefaults.rsid_auto_disable) REQ(toggleRSID); if (iSymbol == RSID_EOT) { if (progdefaults.rsid_eot_squelch) { REQ(rsid_eot_squelch); if (!progdefaults.disable_rsid_warning_dialog_box) REQ(notify_rsid_eot, mbin, rsidfreq); } return; } if (!progdefaults.disable_rsid_warning_dialog_box) { LOG_INFO("REQ call of notify_ssid: %d %f", mbin, rsidfreq); REQ(notify_rsid, mbin, rsidfreq); } if (progdefaults.rsid_notify_only) { if (data_io_enabled == KISS_IO) { bcast_rsid_kiss_frame(rsidfreq, mbin, (int) active_modem->get_txfreq_woffset(), active_modem->get_mode(), RSID_KISS_NOTIFY); } return; } if (progdefaults.rsid_mark) // mark current modem & freq REQ(note_qrg, false, "\nBefore RSID: ", "\n\n", active_modem->get_mode(), 0LL, currfreq); if(active_modem) // Currently only effects Olivia, Contestia and MT63. active_modem->rx_flush(); setup_mode(iSymbol); if (progdefaults.rsid_squelch) REQ(init_modem_squelch, mbin, progdefaults.disable_rsid_freq_change ? currfreq : rsidfreq); else REQ(init_modem, mbin, progdefaults.disable_rsid_freq_change ? currfreq : rsidfreq); } inline int cRsId::HammingDistance(int iBucket, unsigned char *p2) { int dist = 0; for (int i = 0, j = 1; i < RSID_NSYMBOLS; i++, j += 2) { if (fft_buckets[j][iBucket] != p2[i]) { ++dist; if (dist > hamming_resolution) break; } } return dist; } bool cRsId::search_amp( int &bin_out, int &symbol_out, unsigned char *pcode) { int i, j; int iDistanceMin = 1000; // infinity int iDistance = 1000; int iBin = -1; int iSymbol = -1; int tblsize; const RSIDs *prsid; if (pcode == pCodes1) { tblsize = rsid_ids_size1; prsid = rsid_ids_1; } else { tblsize = rsid_ids_size2; prsid = rsid_ids_2; } unsigned char *pc = 0; for (i = 0; i < tblsize; i++) { pc = pcode + i * RSID_NSYMBOLS; for (j = nBinLow; j < nBinHigh - RSID_NTIMES; j++) { iDistance = HammingDistance(j, pc); if (iDistance < iDistanceMin) { iDistanceMin = iDistance; iSymbol = prsid[i].rs; iBin = j; if (iDistanceMin == 0) break; } } } if (iDistanceMin <= hamming_resolution) { symbol_out = iSymbol; bin_out = iBin; return true; } return false; } //============================================================================= // transmit rsid code for current mode //============================================================================= bool cRsId::assigned(trx_mode mode) { rmode = RSID_NONE; rmode2 = RSID_NONE2; switch (mode) { case MODE_EOT : rmode = RSID_EOT; std::cout << "send RSID_EOT" << std::endl; return true; case MODE_RTTY : if (progdefaults.rtty_baud == 5 && progdefaults.rtty_bits == 1 && progdefaults.rtty_shift == 9) rmode = RSID_RTTY_ASCII_7; else if (progdefaults.rtty_baud == 5 && progdefaults.rtty_bits == 1 && progdefaults.rtty_shift == 9) rmode = RSID_RTTY_ASCII_8; else if (progdefaults.rtty_baud == 1 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 3) rmode = RSID_RTTY_45; else if (progdefaults.rtty_baud == 2 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 3) rmode = RSID_RTTY_50; else if (progdefaults.rtty_baud == 4 && progdefaults.rtty_bits == 0 && progdefaults.rtty_shift == 9) rmode = RSID_RTTY_75; else return false; return true; break; case MODE_OLIVIA: case MODE_OLIVIA_4_250: case MODE_OLIVIA_8_250: case MODE_OLIVIA_4_500: case MODE_OLIVIA_8_500: case MODE_OLIVIA_16_500: case MODE_OLIVIA_8_1000: case MODE_OLIVIA_16_1000: case MODE_OLIVIA_32_1000: case MODE_OLIVIA_64_2000: if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 0) rmode = RSID_OLIVIA_4_125; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 1) rmode = RSID_OLIVIA_4_250; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 2) rmode = RSID_OLIVIA_4_500; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_4_1000; else if (progdefaults.oliviatones == 1 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_4_2000; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 0) rmode = RSID_OLIVIA_8_125; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 1) rmode = RSID_OLIVIA_8_250; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 2) rmode = RSID_OLIVIA_8_500; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_8_1000; else if (progdefaults.oliviatones == 2 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_8_2000; else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 2) rmode = RSID_OLIVIA_16_500; else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_16_1000; else if (progdefaults.oliviatones == 3 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_16_2000; else if (progdefaults.oliviatones == 4 && progdefaults.oliviabw == 3) rmode = RSID_OLIVIA_32_1000; else if (progdefaults.oliviatones == 4 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_32_2000; else if (progdefaults.oliviatones == 5 && progdefaults.oliviabw == 4) rmode = RSID_OLIVIA_64_2000; else return false; return true; break; case MODE_CONTESTIA: case MODE_CONTESTIA_4_125: case MODE_CONTESTIA_4_250: case MODE_CONTESTIA_8_250: case MODE_CONTESTIA_4_500: case MODE_CONTESTIA_8_500: case MODE_CONTESTIA_16_500: case MODE_CONTESTIA_8_1000: case MODE_CONTESTIA_16_1000: case MODE_CONTESTIA_32_1000: case MODE_CONTESTIA_64_2000: if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 0) rmode = RSID_CONTESTIA_4_125; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 1) rmode = RSID_CONTESTIA_4_250; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_4_500; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_4_1000; else if (progdefaults.contestiatones == 1 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_4_2000; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 0) rmode = RSID_CONTESTIA_8_125; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 1) rmode = RSID_CONTESTIA_8_250; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_8_500; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_8_1000; else if (progdefaults.contestiatones == 2 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_8_2000; else if (progdefaults.contestiatones == 3 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_16_500; else if (progdefaults.contestiatones == 3 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_16_1000; else if (progdefaults.contestiatones == 3 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_16_2000; else if (progdefaults.contestiatones == 4 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_32_1000; else if (progdefaults.contestiatones == 4 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_32_2000; else if (progdefaults.contestiatones == 5 && progdefaults.contestiabw == 2) rmode = RSID_CONTESTIA_64_500; else if (progdefaults.contestiatones == 5 && progdefaults.contestiabw == 3) rmode = RSID_CONTESTIA_64_1000; else if (progdefaults.contestiatones == 5 && progdefaults.contestiabw == 4) rmode = RSID_CONTESTIA_64_2000; else return false; return true; break; case MODE_DOMINOEX4: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_4_FEC; break; case MODE_DOMINOEX5: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_5_FEC; break; case MODE_DOMINOEX8: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_8_FEC; break; case MODE_DOMINOEX11: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_11_FEC; break; case MODE_DOMINOEX16: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_16_FEC; break; case MODE_DOMINOEX22: if (progdefaults.DOMINOEX_FEC) rmode = RSID_DOMINOEX_22_FEC; break; case MODE_MT63_500S: rmode = RSID_MT63_500_ST; break; case MODE_MT63_500L: rmode = RSID_MT63_500_LG; break; case MODE_MT63_1000S: rmode = RSID_MT63_1000_ST; break; case MODE_MT63_1000L: rmode = RSID_MT63_1000_LG; break; case MODE_MT63_2000S: rmode = RSID_MT63_2000_ST; break; case MODE_MT63_2000L: rmode = RSID_MT63_2000_LG; break; } // if rmode is still unset, look it up // Try secondary table first if (rmode == RSID_NONE) { for (size_t i = 0; i < sizeof(rsid_ids_2)/sizeof(*rsid_ids_2); i++) { if (mode == rsid_ids_2[i].mode) { rmode = RSID_ESCAPE; rmode2 = rsid_ids_2[i].rs; break; } } if (rmode2 == RSID_NONE2) { for (size_t i = 0; i < sizeof(rsid_ids_1)/sizeof(*rsid_ids_1); i++) { if (mode == rsid_ids_1[i].mode) { rmode = rsid_ids_1[i].rs; break; } } } } if (rmode == RSID_NONE) { LOG_DEBUG("%s mode is not assigned an RSID", mode_info[mode].sname); return false; } return true; } void cRsId::send_eot() { unsigned char rsid[RSID_NSYMBOLS]; double sr; size_t len; int iTone; double freq, phaseincr; double fr; double phase; Encode(RSID_EOT, rsid); sr = active_modem->get_samplerate(); len = (size_t)floor(RSID_SYMLEN * sr); if (unlikely(len != symlen)) { symlen = len; delete [] outbuf; outbuf = new double[symlen]; } // transmit 5 symbol periods of silence at beginning of rsid memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < 5; i++) active_modem->ModulateXmtr(outbuf, symlen); // transmit sequence of 15 symbols (tones) fr = 1.0 * active_modem->get_txfreq_woffset() - (RSID_SAMPLE_RATE * 7 / 1024); phase = 0.0; for (int i = 0; i < 15; i++) { iTone = rsid[i]; if (active_modem->get_reverse()) iTone = 15 - iTone; freq = fr + iTone * RSID_SAMPLE_RATE / 1024; phaseincr = 2.0 * M_PI * freq / sr; for (size_t j = 0; j < symlen; j++) { phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; outbuf[j] = sin(phase); } active_modem->ModulateXmtr(outbuf, symlen); } } void cRsId::send(bool preRSID) { trx_mode mode = active_modem->get_mode(); if (!progdefaults.rsid_tx_modes.test(mode)) { LOG_DEBUG("Mode %s excluded, not sending RSID", mode_info[mode].sname); return; } if (!progdefaults.rsid_post && !preRSID) return; if (!assigned(mode)) return; unsigned char rsid[RSID_NSYMBOLS]; double sr; size_t len; int iTone; double freq, phaseincr; double fr; double phase; Encode(rmode, rsid); sr = active_modem->get_samplerate(); len = (size_t)floor(RSID_SYMLEN * sr); if (unlikely(len != symlen)) { symlen = len; delete [] outbuf; outbuf = new double[symlen]; } // transmit 5 symbol periods of silence at beginning of rsid memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < 5; i++) active_modem->ModulateXmtr(outbuf, symlen); // transmit sequence of 15 symbols (tones) fr = 1.0 * active_modem->get_txfreq_woffset() - (RSID_SAMPLE_RATE * 7 / 1024); phase = 0.0; for (int i = 0; i < 15; i++) { iTone = rsid[i]; if (active_modem->get_reverse()) iTone = 15 - iTone; freq = fr + iTone * RSID_SAMPLE_RATE / 1024; phaseincr = 2.0 * M_PI * freq / sr; for (size_t j = 0; j < symlen; j++) { phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; outbuf[j] = sin(phase); } active_modem->ModulateXmtr(outbuf, symlen); } if (rmode == RSID_ESCAPE && rmode2 != RSID_NONE2) { // transmit 10 symbol periods of silence between rsid sequences memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < 10; i++) active_modem->ModulateXmtr(outbuf, symlen); Encode(rmode2, rsid); sr = active_modem->get_samplerate(); len = (size_t)floor(RSID_SYMLEN * sr); if (unlikely(len != symlen)) { symlen = len; delete [] outbuf; outbuf = new double[symlen]; } // transmit sequence of 15 symbols (tones) fr = 1.0 * active_modem->get_txfreq_woffset() - (RSID_SAMPLE_RATE * 7 / 1024); phase = 0.0; for (int i = 0; i < 15; i++) { iTone = rsid[i]; if (active_modem->get_reverse()) iTone = 15 - iTone; freq = fr + iTone * RSID_SAMPLE_RATE / 1024; phaseincr = 2.0 * M_PI * freq / sr; for (size_t j = 0; j < symlen; j++) { phase += phaseincr; if (phase > 2.0 * M_PI) phase -= 2.0 * M_PI; outbuf[j] = sin(phase); } active_modem->ModulateXmtr(outbuf, symlen); } } // 5 symbol periods of silence at end of transmission // and between RsID and the data signal int nperiods = 5; memset(outbuf, 0, symlen * sizeof(*outbuf)); for (int i = 0; i < nperiods; i++) active_modem->ModulateXmtr(outbuf, symlen); } fldigi-4.2.05/src/rsid/rsid_defs.cxx0000664000175000017500000004206714611711171014212 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // Syntax: ELEM_(rsid_code, rsid_tag, fldigi_mode) // fldigi_mode is NUM_MODES if mode is not available in fldigi, // otherwise one of the tags defined in globals.h. // rsid_tag is stringified and may be shown to the user. /* ELEM_(263, ESCAPE, NUM_MODES) \ */ #undef ELEM_ #define RSID_LIST \ \ /* ESCAPE used to transition to 2nd RSID set */ \ \ ELEM_(263, EOT, MODE_EOT) \ ELEM_(6, ESCAPE, NUM_MODES) \ \ ELEM_(1, BPSK31, MODE_PSK31) \ ELEM_(110, QPSK31, MODE_QPSK31) \ ELEM_(2, BPSK63, MODE_PSK63) \ ELEM_(3, QPSK63, MODE_QPSK63) \ ELEM_(4, BPSK125, MODE_PSK125) \ ELEM_(5, QPSK125, MODE_QPSK125) \ ELEM_(126, BPSK250, MODE_PSK250) \ ELEM_(127, QPSK250, MODE_QPSK250) \ ELEM_(173, BPSK500, MODE_PSK500) \ \ ELEM_(183, PSK125R, MODE_PSK125R) \ ELEM_(186, PSK250R, MODE_PSK250R) \ ELEM_(187, PSK500R, MODE_PSK500R) \ \ ELEM_(7, PSKFEC31, NUM_MODES) \ ELEM_(8, PSK10, NUM_MODES) \ \ ELEM_(9, MT63_500_LG, MODE_MT63_500L) \ ELEM_(10, MT63_500_ST, MODE_MT63_500S) \ ELEM_(11, MT63_500_VST, NUM_MODES) \ ELEM_(12, MT63_1000_LG, MODE_MT63_1000L) \ ELEM_(13, MT63_1000_ST, MODE_MT63_1000S) \ ELEM_(14, MT63_1000_VST, NUM_MODES) \ ELEM_(15, MT63_2000_LG, MODE_MT63_2000L) \ ELEM_(17, MT63_2000_ST, MODE_MT63_2000S) \ ELEM_(18, MT63_2000_VST, NUM_MODES) \ \ ELEM_(19, PSKAM10, NUM_MODES) \ ELEM_(20, PSKAM31, NUM_MODES) \ ELEM_(21, PSKAM50, NUM_MODES) \ \ ELEM_(22, PSK63F, MODE_PSK63F) \ ELEM_(23, PSK220F, NUM_MODES) \ \ ELEM_(24, CHIP64, NUM_MODES) \ ELEM_(25, CHIP128, NUM_MODES) \ \ ELEM_(26, CW, MODE_CW) \ \ ELEM_(27, CCW_OOK_12, NUM_MODES) \ ELEM_(28, CCW_OOK_24, NUM_MODES) \ ELEM_(29, CCW_OOK_48, NUM_MODES) \ ELEM_(30, CCW_FSK_12, NUM_MODES) \ ELEM_(31, CCW_FSK_24, NUM_MODES) \ ELEM_(33, CCW_FSK_48, NUM_MODES) \ \ ELEM_(34, PACTOR1_FEC, NUM_MODES) \ \ ELEM_(113, PACKET_110, NUM_MODES) \ ELEM_(35, PACKET_300, NUM_MODES) \ ELEM_(36, PACKET_1200, NUM_MODES) \ \ ELEM_(37, RTTY_ASCII_7, MODE_RTTY) \ ELEM_(38, RTTY_ASCII_8, MODE_RTTY) \ ELEM_(39, RTTY_45, MODE_RTTY) \ ELEM_(40, RTTY_50, MODE_RTTY) \ ELEM_(41, RTTY_75, MODE_RTTY) \ \ ELEM_(42, AMTOR_FEC, NUM_MODES) \ \ ELEM_(43, THROB_1, MODE_THROB1) \ ELEM_(44, THROB_2, MODE_THROB2) \ ELEM_(45, THROB_4, MODE_THROB4) \ ELEM_(46, THROBX_1, MODE_THROBX1) \ ELEM_(47, THROBX_2, MODE_THROBX2) \ ELEM_(146, THROBX_4, MODE_THROBX4) \ \ ELEM_(204, CONTESTIA_4_125, MODE_CONTESTIA_4_125) \ ELEM_(55, CONTESTIA_4_250, MODE_CONTESTIA_4_250) \ ELEM_(54, CONTESTIA_4_500, MODE_CONTESTIA_4_500) \ ELEM_(255, CONTESTIA_4_1000, MODE_CONTESTIA_4_1000) \ ELEM_(254, CONTESTIA_4_2000, MODE_CONTESTIA_4_2000) \ \ ELEM_(169, CONTESTIA_8_125, MODE_CONTESTIA_8_125) \ ELEM_(49, CONTESTIA_8_250, MODE_CONTESTIA_8_250) \ ELEM_(52, CONTESTIA_8_500, MODE_CONTESTIA_8_500) \ ELEM_(117, CONTESTIA_8_1000, MODE_CONTESTIA_8_1000) \ ELEM_(247, CONTESTIA_8_2000, MODE_CONTESTIA_8_2000) \ \ ELEM_(275, CONTESTIA_16_250, MODE_CONTESTIA_16_250) \ ELEM_(50, CONTESTIA_16_500, MODE_CONTESTIA_16_500) \ ELEM_(53, CONTESTIA_16_1000, MODE_CONTESTIA_16_1000) \ ELEM_(259, CONTESTIA_16_2000, MODE_CONTESTIA_16_2000) \ \ ELEM_(51, CONTESTIA_32_1000, MODE_CONTESTIA_32_1000) \ ELEM_(201, CONTESTIA_32_2000, MODE_CONTESTIA_32_2000) \ \ ELEM_(194, CONTESTIA_64_500, MODE_CONTESTIA_64_500) \ ELEM_(193, CONTESTIA_64_1000, MODE_CONTESTIA_64_1000) \ ELEM_(191, CONTESTIA_64_2000, MODE_CONTESTIA_64_2000) \ \ ELEM_(56, VOICE, NUM_MODES) \ \ ELEM_(60, MFSK8, MODE_MFSK8) \ ELEM_(57, MFSK16, MODE_MFSK16) \ ELEM_(147, MFSK32, MODE_MFSK32) \ \ ELEM_(148, MFSK11, MODE_MFSK11) \ ELEM_(152, MFSK22, MODE_MFSK22) \ \ ELEM_(61, RTTYM_8_250, NUM_MODES) \ ELEM_(62, RTTYM_16_500, NUM_MODES) \ ELEM_(63, RTTYM_32_1000, NUM_MODES) \ ELEM_(65, RTTYM_8_500, NUM_MODES) \ ELEM_(66, RTTYM_16_1000, NUM_MODES) \ ELEM_(67, RTTYM_4_500, NUM_MODES) \ ELEM_(68, RTTYM_4_250, NUM_MODES) \ ELEM_(119, RTTYM_8_1000, NUM_MODES) \ ELEM_(170, RTTYM_8_125, NUM_MODES) \ \ ELEM_(203, OLIVIA_4_125, MODE_OLIVIA_4_125) \ ELEM_(75, OLIVIA_4_250, MODE_OLIVIA_4_250) \ ELEM_(74, OLIVIA_4_500, MODE_OLIVIA_4_500) \ ELEM_(229, OLIVIA_4_1000, MODE_OLIVIA_4_1000) \ ELEM_(238, OLIVIA_4_2000, MODE_OLIVIA_4_2000) \ \ ELEM_(163, OLIVIA_8_125, MODE_OLIVIA_8_125) \ ELEM_(69, OLIVIA_8_250, MODE_OLIVIA_8_250) \ ELEM_(72, OLIVIA_8_500, MODE_OLIVIA_8_500) \ ELEM_(116, OLIVIA_8_1000, MODE_OLIVIA_8_1000) \ ELEM_(214, OLIVIA_8_2000, MODE_OLIVIA_8_2000) \ \ ELEM_(70, OLIVIA_16_500, MODE_OLIVIA_16_500) \ ELEM_(73, OLIVIA_16_1000, MODE_OLIVIA_16_1000) \ ELEM_(234, OLIVIA_16_2000, MODE_OLIVIA_16_2000) \ \ ELEM_(71, OLIVIA_32_1000, MODE_OLIVIA_32_1000) \ ELEM_(221, OLIVIA_32_2000, MODE_OLIVIA_32_2000) \ \ ELEM_(211, OLIVIA_64_2000, MODE_OLIVIA_64_2000) \ \ ELEM_(76, PAX, NUM_MODES) \ ELEM_(77, PAX2, NUM_MODES) \ ELEM_(78, DOMINOF, NUM_MODES) \ ELEM_(79, FAX, NUM_MODES) \ ELEM_(81, SSTV, NUM_MODES) \ \ ELEM_(84, DOMINOEX_4, MODE_DOMINOEX4) \ ELEM_(85, DOMINOEX_5, MODE_DOMINOEX5) \ ELEM_(86, DOMINOEX_8, MODE_DOMINOEX8) \ ELEM_(87, DOMINOEX_11, MODE_DOMINOEX11) \ ELEM_(88, DOMINOEX_16, MODE_DOMINOEX16) \ ELEM_(90, DOMINOEX_22, MODE_DOMINOEX22) \ ELEM_(92, DOMINOEX_4_FEC, MODE_DOMINOEX4) \ ELEM_(93, DOMINOEX_5_FEC, MODE_DOMINOEX5) \ ELEM_(97, DOMINOEX_8_FEC, MODE_DOMINOEX8) \ ELEM_(98, DOMINOEX_11_FEC, MODE_DOMINOEX11) \ ELEM_(99, DOMINOEX_16_FEC, MODE_DOMINOEX16) \ ELEM_(101, DOMINOEX_22_FEC, MODE_DOMINOEX22) \ \ ELEM_(104, FELD_HELL, MODE_FELDHELL) \ ELEM_(105, PSK_HELL, NUM_MODES) \ ELEM_(106, HELL_80, MODE_HELL80) \ ELEM_(107, FM_HELL_105, MODE_FSKH105) \ ELEM_(108, FM_HELL_245, MODE_FSKH245) \ \ ELEM_(114, MODE_141A, NUM_MODES) \ ELEM_(123, DTMF, NUM_MODES) \ ELEM_(125, ALE400, NUM_MODES) \ ELEM_(131, FDMDV, NUM_MODES) \ \ ELEM_(132, JT65_A, NUM_MODES) \ ELEM_(134, JT65_B, NUM_MODES) \ ELEM_(135, JT65_C, NUM_MODES) \ \ ELEM_(136, THOR_4, MODE_THOR4) \ ELEM_(137, THOR_8, MODE_THOR8) \ ELEM_(138, THOR_16, MODE_THOR16) \ ELEM_(139, THOR_5, MODE_THOR5) \ ELEM_(143, THOR_11, MODE_THOR11) \ ELEM_(145, THOR_22, MODE_THOR22) \ \ ELEM_(153, CALL_ID, NUM_MODES) \ \ ELEM_(155, PACKET_PSK1200, NUM_MODES) \ ELEM_(156, PACKET_PSK250, NUM_MODES) \ ELEM_(159, PACKET_PSK63, NUM_MODES) \ \ ELEM_(172, MODE_188_110A_8N1, NUM_MODES) \ \ /* NONE must be the last element */ \ ELEM_(0, NONE, NUM_MODES) #define ELEM_(code_, tag_, mode_) RSID_ ## tag_ = code_, enum { RSID_LIST }; #undef ELEM_ #define ELEM_(code_, tag_, mode_) { RSID_ ## tag_, mode_, #tag_ }, const RSIDs cRsId::rsid_ids_1[] = { RSID_LIST }; #undef ELEM_ const int cRsId::rsid_ids_size1 = sizeof(rsid_ids_1)/sizeof(*rsid_ids_1) - 1; //====================================================================== /* ELEM_(6, ESCAPE2, NUM_MODES) \ */ #define RSID_LIST2 \ ELEM2_(450, PSK63RX4, MODE_4X_PSK63R) \ ELEM2_(457, PSK63RX5, MODE_5X_PSK63R) \ ELEM2_(458, PSK63RX10, MODE_10X_PSK63R) \ ELEM2_(460, PSK63RX20, MODE_20X_PSK63R) \ ELEM2_(462, PSK63RX32, MODE_32X_PSK63R) \ \ ELEM2_(467, PSK125RX4, MODE_4X_PSK125R) \ ELEM2_(497, PSK125RX5, MODE_5X_PSK125R) \ ELEM2_(513, PSK125RX10, MODE_10X_PSK125R) \ ELEM2_(519, PSK125X12, MODE_12X_PSK125) \ ELEM2_(522, PSK125RX12, MODE_12X_PSK125R) \ ELEM2_(527, PSK125RX16, MODE_16X_PSK125R) \ \ ELEM2_(529, PSK250RX2, MODE_2X_PSK250R) \ ELEM2_(533, PSK250RX3, MODE_3X_PSK250R) \ ELEM2_(539, PSK250RX5, MODE_5X_PSK250R) \ ELEM2_(541, PSK250X6, MODE_6X_PSK250) \ ELEM2_(545, PSK250RX6, MODE_6X_PSK250R) \ ELEM2_(551, PSK250RX7, MODE_7X_PSK250R) \ \ ELEM2_(553, PSK500RX2, MODE_2X_PSK500R) \ ELEM2_(558, PSK500RX3, MODE_3X_PSK500R) \ ELEM2_(564, PSK500RX4, MODE_4X_PSK500R) \ ELEM2_(566, PSK500X2, MODE_2X_PSK500) \ ELEM2_(569, PSK500X4, MODE_4X_PSK500) \ \ ELEM2_(570, PSK1000, MODE_PSK1000) \ ELEM2_(580, PSK1000R, MODE_PSK1000R) \ ELEM2_(587, PSK1000X2, MODE_2X_PSK1000) \ ELEM2_(595, PSK1000RX2, MODE_2X_PSK1000R) \ ELEM2_(604, PSK800RX2, MODE_2X_PSK800R) \ ELEM2_(610, PSK800X2, MODE_2X_PSK800) \ \ ELEM2_(620, MFSK64, MODE_MFSK64) \ ELEM2_(625, MFSK128, MODE_MFSK128) \ \ ELEM2_(639, THOR25x4, MODE_THOR25x4) \ ELEM2_(649, THOR50x1, MODE_THOR50x1) \ ELEM2_(653, THOR50x2, MODE_THOR50x2) \ ELEM2_(658, THOR100, MODE_THOR100) \ ELEM2_(2119, THOR32, MODE_THOR32) \ ELEM2_(2156, THOR44, MODE_THOR44) \ ELEM2_(2157, THOR56, MODE_THOR56) \ \ ELEM2_(662, DOMINOEX_44, MODE_DOMINOEX44) \ ELEM2_(681, DOMINOEX_88, MODE_DOMINOEX88) \ \ ELEM2_(687, MFSK31, MODE_MFSK31) \ \ ELEM2_(691, DOMINOEX_MICRO, MODE_DOMINOEXMICRO) \ ELEM2_(693, THOR_MICRO, MODE_THORMICRO) \ \ ELEM2_(1026, MFSK64L, MODE_MFSK64L) \ ELEM2_(1029, MFSK128L, MODE_MFSK128L) \ \ ELEM2_(1066, PSK8P125, MODE_8PSK125) \ ELEM2_(1071, PSK8P250, MODE_8PSK250) \ ELEM2_(1076, PSK8P500, MODE_8PSK500) \ ELEM2_(1047, PSK8P1000, MODE_8PSK1000) \ \ ELEM2_(1037, PSK8P125F, MODE_8PSK125F) \ ELEM2_(1038, PSK8P250F, MODE_8PSK250F) \ ELEM2_(1043, PSK8P500F, MODE_8PSK500F) \ ELEM2_(1078, PSK8P1000F, MODE_8PSK1000F) \ ELEM2_(1058, PSK8P1200F, MODE_8PSK1200F) \ \ ELEM2_(1239, PSK8P125FL, MODE_8PSK125FL) \ ELEM2_(2052, PSK8P250FL, MODE_8PSK250FL) \ \ ELEM2_(2053, OFDM500F, MODE_OFDM_500F) \ ELEM2_(2094, OFDM7F0F, MODE_OFDM_750F) \ \ ELEM2_(1171, IFKP, MODE_IFKP) \ \ ELEM2_(0, NONE2, NUM_MODES) #define ELEM2_(code_, tag_, mode_) RSID_ ## tag_ = code_, enum { RSID_LIST2 }; #undef ELEM2_ #define ELEM2_(code_, tag_, mode_) { RSID_ ## tag_, mode_, #tag_ }, const RSIDs cRsId::rsid_ids_2[] = { RSID_LIST2 }; #undef ELEM2_ const int cRsId::rsid_ids_size2 = sizeof(rsid_ids_2)/sizeof(*rsid_ids_2) - 1; /* ELEM2_(2118, OFDM2000, MODE_OFDM_2000) \ ELEM2_(2110, OFDM2000F, MODE_OFDM_2000F) \ */ fldigi-4.2.05/src/debug/0000775000175000017500000000000014611714005011717 500000000000000fldigi-4.2.05/src/debug/debug.cxx0000664000175000017500000001667514611711171013471 00000000000000// ---------------------------------------------------------------------------- // debug.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "debug_dialog.h" #include "status.h" #include "timeops.h" #include "icons.h" #include "gettext.h" #include "threads.h" #ifndef FLARQ_VERSION # include "status.h" # include "fl_digi.h" #endif static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t debug_hd_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t rotate_mutex = PTHREAD_MUTEX_INITIALIZER; extern Fl_Double_Window *fl_digi_main; extern void update_main_title(); #define MAX_LINES 65536 static FILE* wfile = 0; static FILE* rfile = 0; static int rfd; static bool tty; static Fl_Double_Window* window; static std::string linebuf; debug* debug::inst = 0; debug::level_e debug::level = debug::INFO_LEVEL; static const char* prefix[] = { _("Quiet"), _("Error"), _("Warning"), _("Info"), _("Verbose"), _("Debug") }; unsigned int debug::mask = 0; #include void fcopy(std::string from, std::string to) { char buffer[65536]; FILE *fp_from, *fp_to; size_t n; if ((fp_from = fopen(from.c_str(), "rb")) != NULL) { if ((fp_to = fopen(to.c_str(), "wb")) != NULL) { while(1) { if (feof(fp_from)) break; // memset(buffer, 0, sizeof(buffer)); if ((n = fread(buffer, 1, sizeof(buffer), fp_from)) > 0) n = fwrite(buffer, 1, n, fp_to); else break; } fflush(fp_to); fclose(fp_to); } fclose(fp_from); } } void rotate_log(std::string filename) { guard_lock rlock(&rotate_mutex); std::string oldfn, newfn; const char *ext[] = {".1", ".2", ".3", ".4", ".5"}; for (int i = 4; i > 0; i--) { newfn.assign(filename).append(ext[i]); oldfn.assign(filename).append(ext[i - 1]); fcopy(oldfn, newfn); } newfn.assign(filename).append(ext[0]); fcopy(filename, newfn); } void debug::start(const char* filename) { if (debug::inst) return; rotate_log(filename); inst = new debug(filename); window = debug_dialog(); } void debug::stop(void) { if (window) { window->hide(); delete window; window = 0; //std::cout << "debug window deleted" << std::endl; } // if (inst) { // delete inst; // inst = 0; //std::cout << "instance deleted" << std::endl; // } //std::cout << "debug stopped" << std::endl; } static char fmt[2048]; static char dtext[32768]; void debug::log(level_e level, const char* func, const char* srcf, int line, const char* format, ...) { guard_lock debug_lock(&debug_mutex); if (!debug::inst) return; // always annotate with date/time & line number struct tm tm; time_t t_temp; struct timeval tv; gettimeofday(&tv, NULL); t_temp=(time_t)tv.tv_sec; // gmtime_r(&t_temp, &tm); localtime_r(&t_temp, &tm); static int _zmsec = 0; static int _zsec = 0; static int _zmin = 0; static int _zhr = 0; _zmsec = tv.tv_usec / 1000; _zsec = tm.tm_sec; _zmin = tm.tm_min; _zhr = tm.tm_hour; snprintf(fmt, sizeof(fmt), "%c: [%02d:%02d:%02d.%03d] %s : %d : %s\n %s\n", *prefix[level], _zhr, _zmin, _zsec, _zmsec, srcf, line, func, format); va_list args; va_start(args, format); intptr_t nt = vsnprintf(dtext, sizeof(dtext), fmt, args); va_end(args); fprintf(wfile, "%s", dtext); if (tty) { if (level <= DEBUG_LEVEL && level > QUIET_LEVEL) { fprintf(stderr, "%s", dtext); } } #ifdef __MINGW32__ fflush(wfile); #endif linebuf.append(dtext); Fl::awake(sync_text, (void*)nt); } void debug::hex_dump(const char* func, const char * data, int length) { guard_lock debug_lock(&debug_hd_mutex); char cbuff[32]; char hbuff[64]; char tbuff[32]; int index = 0; int data_index = 0; int count = length; unsigned int c = 0; int hi = 0; int step = 16; if(!func) func = "Unassigned"; if(!data || length < 0) return; while(count > 0) { memset(cbuff, 0, sizeof(cbuff)); memset(hbuff, 0, sizeof(hbuff)); memset(tbuff, 0, sizeof(tbuff)); hi = 0; for(index = 0; index < step; index++) { if(data_index < length) { c = ((unsigned int) data[data_index]) & 0xFF; if(c >= ' ' && c <= 0xff) { cbuff[index] = c; } else { cbuff[index] = '.'; } snprintf(tbuff, sizeof(tbuff) - 1, "%02X", c); hbuff[hi++] = tbuff[0]; hbuff[hi++] = tbuff[1]; hbuff[hi++] = ' '; } else { break; } data_index++; } if (debug::inst) LOG_DEBUG("%s: %s %s", func, cbuff, hbuff); count -= step; } } void debug::elog(const char* func, const char* srcf, int line, const char* text) { if (debug::inst) log(ERROR_LEVEL, func, srcf, line, "%s: %s", text, strerror(errno)); } void debug::show(void) { btext->bottomline(btext->size()); window->show(); } void debug::sync_text(void* arg) { guard_lock debug_lock(&debug_mutex); if (!window) return; size_t p1 = 0, p2 = linebuf.find("\n"); while (p2 != std::string::npos) { btext->add(linebuf.substr(p1, p2 - p1).c_str()); p1 = p2 + 1; p2 = linebuf.find("\n", p1); } btext->redraw(); btext->bottomline(btext->size()); linebuf.clear(); return; } debug::debug(const char* filename) { if ((wfile = fl_fopen(filename, "w")) == NULL) throw strerror(errno); setvbuf(wfile, (char*)NULL, _IOLBF, 0); set_cloexec(fileno(wfile), 1); if ((rfile = fl_fopen(filename, "r")) == NULL) throw strerror(errno); rfd = fileno(rfile); set_cloexec(rfd, 1); #ifndef __MINGW32__ int f; if ((f = fcntl(rfd, F_GETFL)) == -1) throw strerror(errno); if (fcntl(rfd, F_SETFL, f | O_NONBLOCK) == -1) throw strerror(errno); #endif tty = isatty(fileno(stderr)); linebuf.clear(); } debug::~debug() { if (wfile) fclose(wfile); if (rfile) fclose(rfile); // if (window) { // window->hide(); // delete window; // window = 0; // } // if (inst) { // delete inst; // inst = 0; // } } void mnu_debug_level_cb() { debug::level = (debug::level_e)(mnu_debug_level->value()); } void btn_debug_source_cb(int n) { int mask = 1 << n; if (source_code[n]->value()) debug::mask |= mask; else debug::mask &= ~mask; } void clear_debug() { guard_lock debug_lock(&debug_mutex); btext->clear(); linebuf.clear(); } void set_debug_mask(int mask) { debug::mask = mask; for (int n = 0; n < 15; n++) { source_code[n]->value( (mask & (1 << n)) ? 1 : 0); source_code[n]->redraw(); } mnu_debug_level->value(progStatus.debug_level); debug::level = debug::level_e(progStatus.debug_level); } fldigi-4.2.05/src/debug/debug_dialog.cxx0000664000175000017500000001631014611711171014772 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "debug_dialog.h" Fl_Choice *mnu_debug_level=(Fl_Choice *)0; static void cb_mnu_debug_level(Fl_Choice*, void*) { mnu_debug_level_cb(); } Fl_Button *btn_clear_debug=(Fl_Button *)0; static void cb_btn_clear_debug(Fl_Button*, void*) { clear_debug(); } static void cb_source_code(Fl_Check_Button*, void*) { btn_debug_source_cb(0); } static void cb_source_code1(Fl_Check_Button*, void*) { btn_debug_source_cb(1); } static void cb_source_code2(Fl_Check_Button*, void*) { btn_debug_source_cb(2); } static void cb_source_code3(Fl_Check_Button*, void*) { btn_debug_source_cb(3); } static void cb_source_code4(Fl_Check_Button*, void*) { btn_debug_source_cb(4); } static void cb_source_code5(Fl_Check_Button*, void*) { btn_debug_source_cb(5); } static void cb_source_code6(Fl_Check_Button*, void*) { btn_debug_source_cb(6); } static void cb_source_code7(Fl_Check_Button*, void*) { btn_debug_source_cb(7); } static void cb_source_code8(Fl_Check_Button*, void*) { btn_debug_source_cb(8); } static void cb_source_code9(Fl_Check_Button*, void*) { btn_debug_source_cb(9); } static void cb_source_codea(Fl_Check_Button*, void*) { btn_debug_source_cb(10); } static void cb_source_codeb(Fl_Check_Button*, void*) { btn_debug_source_cb(11); } static void cb_source_codec(Fl_Check_Button*, void*) { btn_debug_source_cb(12); } static void cb_source_coded(Fl_Check_Button*, void*) { btn_debug_source_cb(13); } Fl_Check_Button *source_code[15]={(Fl_Check_Button *)0}; static void cb_source_codee(Fl_Check_Button*, void*) { btn_debug_source_cb(14); } Fl_Browser *btext=(Fl_Browser *)0; Fl_Double_Window* debug_dialog() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(570, 240, "Event Log"); w = o; if (w) {/* empty */} { Fl_Group* o = new Fl_Group(0, 0, 570, 60); o->box(FL_ENGRAVED_BOX); { Fl_Group* o = new Fl_Group(0, 0, 140, 60); { Fl_Group* o = new Fl_Group(0, 0, 130, 60); { Fl_Choice* o = mnu_debug_level = new Fl_Choice(6, 5, 120, 22); mnu_debug_level->down_box(FL_BORDER_BOX); mnu_debug_level->callback((Fl_Callback*)cb_mnu_debug_level); mnu_debug_level->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); o->add("Quiet|Error|Warning|Info|Verbose|Debug"); o->value(3); } // Fl_Choice* mnu_debug_level { btn_clear_debug = new Fl_Button(5, 34, 60, 21, "clear"); btn_clear_debug->callback((Fl_Callback*)cb_btn_clear_debug); } // Fl_Button* btn_clear_debug o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(130, 0, 10, 60); o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o { source_code[0] = new Fl_Check_Button(145, 5, 70, 15, "ARQ"); source_code[0]->tooltip("ARQ server"); source_code[0]->down_box(FL_DOWN_BOX); source_code[0]->callback((Fl_Callback*)cb_source_code); } // Fl_Check_Button* source_code[0] { source_code[1] = new Fl_Check_Button(145, 22, 70, 15, "Audio"); source_code[1]->tooltip("Audio: OSS, PortAudio, PulseAudio"); source_code[1]->down_box(FL_DOWN_BOX); source_code[1]->callback((Fl_Callback*)cb_source_code1); } // Fl_Check_Button* source_code[1] { source_code[2] = new Fl_Check_Button(145, 40, 70, 15, "Modem"); source_code[2]->tooltip("All Modem code"); source_code[2]->down_box(FL_DOWN_BOX); source_code[2]->callback((Fl_Callback*)cb_source_code2); } // Fl_Check_Button* source_code[2] { source_code[3] = new Fl_Check_Button(228, 5, 70, 15, "Rig i/o"); source_code[3]->tooltip("Rigcat, Hamlib, serial port i/o"); source_code[3]->down_box(FL_DOWN_BOX); source_code[3]->callback((Fl_Callback*)cb_source_code3); } // Fl_Check_Button* source_code[3] { source_code[4] = new Fl_Check_Button(228, 22, 70, 15, "Server"); source_code[4]->tooltip("XMLRPC server"); source_code[4]->down_box(FL_DOWN_BOX); source_code[4]->callback((Fl_Callback*)cb_source_code4); } // Fl_Check_Button* source_code[4] { source_code[5] = new Fl_Check_Button(228, 40, 70, 15, "Client"); source_code[5]->tooltip("XMLRPC client (flrig i/o)"); source_code[5]->down_box(FL_DOWN_BOX); source_code[5]->callback((Fl_Callback*)cb_source_code5); } // Fl_Check_Button* source_code[5] { source_code[6] = new Fl_Check_Button(311, 5, 70, 15, "Spotter"); source_code[6]->tooltip("Spotter client"); source_code[6]->down_box(FL_DOWN_BOX); source_code[6]->callback((Fl_Callback*)cb_source_code6); } // Fl_Check_Button* source_code[6] { source_code[7] = new Fl_Check_Button(311, 22, 70, 15, "Data"); source_code[7]->tooltip("Data sources i/o"); source_code[7]->down_box(FL_DOWN_BOX); source_code[7]->callback((Fl_Callback*)cb_source_code7); } // Fl_Check_Button* source_code[7] { source_code[8] = new Fl_Check_Button(311, 40, 70, 15, "Synop"); source_code[8]->tooltip("Synop code"); source_code[8]->down_box(FL_DOWN_BOX); source_code[8]->callback((Fl_Callback*)cb_source_code8); } // Fl_Check_Button* source_code[8] { source_code[9] = new Fl_Check_Button(394, 5, 70, 15, "KML"); source_code[9]->tooltip("KML code"); source_code[9]->down_box(FL_DOWN_BOX); source_code[9]->callback((Fl_Callback*)cb_source_code9); } // Fl_Check_Button* source_code[9] { source_code[10] = new Fl_Check_Button(394, 22, 70, 15, "KISS"); source_code[10]->tooltip("KISS code"); source_code[10]->down_box(FL_DOWN_BOX); source_code[10]->callback((Fl_Callback*)cb_source_codea); } // Fl_Check_Button* source_code[10] { source_code[11] = new Fl_Check_Button(394, 40, 70, 15, "MacLog"); source_code[11]->tooltip("Mac Logger i/o"); source_code[11]->down_box(FL_DOWN_BOX); source_code[11]->callback((Fl_Callback*)cb_source_codeb); } // Fl_Check_Button* source_code[11] { source_code[12] = new Fl_Check_Button(477, 5, 70, 15, "FD Log"); source_code[12]->tooltip("FD log i/o"); source_code[12]->down_box(FL_DOWN_BOX); source_code[12]->callback((Fl_Callback*)cb_source_codec); } // Fl_Check_Button* source_code[12] { source_code[13] = new Fl_Check_Button(477, 22, 70, 15, "N3FJP log"); source_code[13]->tooltip("N3FJP log i/o"); source_code[13]->down_box(FL_DOWN_BOX); source_code[13]->callback((Fl_Callback*)cb_source_coded); } // Fl_Check_Button* source_code[13] { source_code[14] = new Fl_Check_Button(477, 40, 70, 15, "Other"); source_code[14]->tooltip("All other code"); source_code[14]->down_box(FL_DOWN_BOX); source_code[14]->callback((Fl_Callback*)cb_source_codee); } // Fl_Check_Button* source_code[14] o->end(); } // Fl_Group* o { btext = new Fl_Browser(0, 60, 570, 180); Fl_Group::current()->resizable(btext); } // Fl_Browser* btext o->size_range(570, 240); o->end(); } // Fl_Double_Window* o return w; } fldigi-4.2.05/src/debug/debug_dialog.fl0000664000175000017500000000746714611711171014606 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0305 header_name {.h} code_name {.cxx} Function {debug_dialog()} {open } { Fl_Window {} { label {Event Log} open selected xywh {641 62 570 240} type Double resizable size_range {570 240 0 0} visible } { Fl_Group {} {open xywh {0 0 570 60} box ENGRAVED_BOX } { Fl_Group {} {open xywh {0 0 140 60} resizable } { Fl_Group {} {open xywh {0 0 130 60} } { Fl_Choice mnu_debug_level { callback {mnu_debug_level_cb();} open xywh {6 5 120 22} down_box BORDER_BOX align 20 code0 {o->add("Quiet|Error|Warning|Info|Verbose|Debug");} code1 {o->value(3);} code2 {\#include "debug.h"} } {} Fl_Button btn_clear_debug { label clear callback {clear_debug();} xywh {5 34 60 21} } } Fl_Group {} {open xywh {130 0 10 60} resizable } {} } Fl_Check_Button {source_code[0]} { label ARQ callback {btn_debug_source_cb(0);} tooltip {ARQ server} xywh {145 5 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[1]} { label Audio callback {btn_debug_source_cb(1);} tooltip {Audio: OSS, PortAudio, PulseAudio} xywh {145 22 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[2]} { label Modem callback {btn_debug_source_cb(2);} tooltip {All Modem code} xywh {145 40 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[3]} { label {Rig i/o} callback {btn_debug_source_cb(3);} tooltip {Rigcat, Hamlib, serial port i/o} xywh {228 5 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[4]} { label Server callback {btn_debug_source_cb(4);} tooltip {XMLRPC server} xywh {228 22 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[5]} { label Client callback {btn_debug_source_cb(5);} tooltip {XMLRPC client (flrig i/o)} xywh {228 40 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[6]} { label Spotter callback {btn_debug_source_cb(6);} tooltip {Spotter client} xywh {311 5 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[7]} { label Data callback {btn_debug_source_cb(7);} tooltip {Data sources i/o} xywh {311 22 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[8]} { label Synop callback {btn_debug_source_cb(8);} tooltip {Synop code} xywh {311 40 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[9]} { label KML callback {btn_debug_source_cb(9);} tooltip {KML code} xywh {394 5 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[10]} { label KISS callback {btn_debug_source_cb(10);} tooltip {KISS code} xywh {394 22 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[11]} { label MacLog callback {btn_debug_source_cb(11);} tooltip {Mac Logger i/o} xywh {394 40 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[12]} { label {FD Log} callback {btn_debug_source_cb(12);} tooltip {FD log i/o} xywh {477 5 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[13]} { label {N3FJP log} callback {btn_debug_source_cb(13);} tooltip {N3FJP log i/o} xywh {477 22 70 15} down_box DOWN_BOX } Fl_Check_Button {source_code[14]} { label Other callback {btn_debug_source_cb(14);} tooltip {All other code} xywh {477 40 70 15} down_box DOWN_BOX } } Fl_Browser btext { xywh {0 60 570 180} resizable } } } fldigi-4.2.05/src/Makefile.am0000664000175000017500000006661014611711171012617 00000000000000## Copyright (C) 2007-2009 Stelios Bounanos, M0GLD (m0gld AT enotty DOT net) # Copyright (c) 2008 Dave Freese, W1HKJ (w1hkj AT w1hkj DOT com) # Copyright (c) 2012 Remi Chateauneu, F4ECW (remi dot chateauneu AT gmail DOT com) # License: GPLv3+: GNU GPL version 3 or later. bin_PROGRAMS = SUBDIRS = if WANT_FLDIGI bin_PROGRAMS += fldigi endif if WANT_FLARQ bin_PROGRAMS += flarq endif # The BUILD_* variables are defined in build.m4 fldigi_CPPFLAGS = -DBUILD_FLDIGI -DLOCALEDIR=\"$(localedir)\" @FLDIGI_BUILD_CPPFLAGS@ -DPKGDATADIR=\"$(pkgdatadir)\" fldigi_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ fldigi_CFLAGS = @FLDIGI_BUILD_CFLAGS@ fldigi_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ fldigi_LDADD = @FLDIGI_BUILD_LDADD@ flarq_CPPFLAGS = -DBUILD_FLARQ -DLOCALEDIR=\"$(localedir)\" @FLARQ_BUILD_CPPFLAGS@ flarq_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ flarq_CFLAGS = $(fldigi_CFLAGS) flarq_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ flarq_LDADD = @FLARQ_BUILD_LDADD@ if WIN32 fldigi_CPPFLAGS += -fno-var-tracking fldigi_CXXFLAGS += -fno-var-tracking endif HAMLIB_SRC = \ include/hamlib.h \ rigcontrol/hamlib.cxx \ include/rigclass.h \ rigcontrol/rigclass.cxx XMLRPC_SRC = \ include/xmlrpc.h \ network/xmlrpc.cxx FLDIGI_WIN32_RES_SRC = fldigirc.rc FLARQ_WIN32_RES_SRC = flarq-src/flarqrc.rc COMMON_WIN32_RES_SRC = common.rc BENCHMARK_SRC = include/benchmark.h misc/benchmark.cxx REGEX_SRC = compat/regex.h compat/regex.c STACK_SRC = include/stack.h misc/stack.cxx MINGW32_SRC = include/compat.h compat/getsysinfo.c compat/mingw.c compat/mingw.h NLS_SRC = misc/nls.cxx include/nls.h # We distribute these but do not always compile them # Build the xmlrpcpp source if libflxmlrpc is not found XMLRPCPP_SRC = \ xmlrpcpp/XmlRpcBase64.h \ xmlrpcpp/XmlRpcClient.cpp \ xmlrpcpp/XmlRpcClient.h \ xmlrpcpp/XmlRpcDispatch.cpp \ xmlrpcpp/XmlRpcDispatch.h \ xmlrpcpp/XmlRpcException.h \ xmlrpcpp/XmlRpc.h \ xmlrpcpp/XmlRpcMutex.cpp \ xmlrpcpp/XmlRpcMutex.h \ xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h \ xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h \ xmlrpcpp/XmlRpcServerMethod.cpp \ xmlrpcpp/XmlRpcServerMethod.h \ xmlrpcpp/XmlRpcSocket.cpp \ xmlrpcpp/XmlRpcSocket.h \ xmlrpcpp/XmlRpcSource.cpp \ xmlrpcpp/XmlRpcSource.h \ xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h \ xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h # Build the libmbedtls source if libmbedtls is not found LIBMBEDTLS_SRC = \ mbedtls/aes.c \ mbedtls/aesni.c \ mbedtls/arc4.c \ mbedtls/aria.c \ mbedtls/asn1parse.c \ mbedtls/asn1write.c \ mbedtls/base64.c \ mbedtls/bignum.c \ mbedtls/blowfish.c \ mbedtls/camellia.c \ mbedtls/ccm.c \ mbedtls/certs.c \ mbedtls/chacha20.c \ mbedtls/chachapoly.c \ mbedtls/cipher.c \ mbedtls/cipher_wrap.c \ mbedtls/cmac.c \ mbedtls/ctr_drbg.c \ mbedtls/debug.c \ mbedtls/des.c \ mbedtls/dhm.c \ mbedtls/ecdh.c \ mbedtls/ecdsa.c \ mbedtls/ecjpake.c \ mbedtls/ecp.c \ mbedtls/ecp_curves.c \ mbedtls/entropy.c \ mbedtls/entropy_poll.c \ mbedtls/error.c \ mbedtls/gcm.c \ mbedtls/havege.c \ mbedtls/hkdf.c \ mbedtls/hmac_drbg.c \ mbedtls/md2.c \ mbedtls/md4.c \ mbedtls/md5.c \ mbedtls/md.c \ mbedtls/md_wrap.c \ mbedtls/memory_buffer_alloc.c \ mbedtls/net_sockets.c \ mbedtls/nist_kw.c \ mbedtls/oid.c \ mbedtls/padlock.c \ mbedtls/pem.c \ mbedtls/pk.c \ mbedtls/pkcs11.c \ mbedtls/pkcs12.c \ mbedtls/pkcs5.c \ mbedtls/pkparse.c \ mbedtls/pk_wrap.c \ mbedtls/pkwrite.c \ mbedtls/platform.c \ mbedtls/platform_util.c \ mbedtls/poly1305.c \ mbedtls/ripemd160.c \ mbedtls/rsa.c \ mbedtls/rsa_internal.c \ mbedtls/sha1.c \ mbedtls/sha256.c \ mbedtls/sha512.c \ mbedtls/ssl_cache.c \ mbedtls/ssl_ciphersuites.c \ mbedtls/ssl_cli.c \ mbedtls/ssl_cookie.c \ mbedtls/ssl_srv.c \ mbedtls/ssl_ticket.c \ mbedtls/ssl_tls.c \ mbedtls/threading.c \ mbedtls/timing.c \ mbedtls/version.c \ mbedtls/version_features.c \ mbedtls/x509.c \ mbedtls/x509_create.c \ mbedtls/x509_crl.c \ mbedtls/x509_crt.c \ mbedtls/x509_csr.c \ mbedtls/x509write_crt.c \ mbedtls/x509write_csr.c \ mbedtls/xtea.c \ include/mbedtls/aes.h \ include/mbedtls/aesni.h \ include/mbedtls/arc4.h \ include/mbedtls/aria.h \ include/mbedtls/asn1.h \ include/mbedtls/asn1write.h \ include/mbedtls/base64.h \ include/mbedtls/bignum.h \ include/mbedtls/blowfish.h \ include/mbedtls/bn_mul.h \ include/mbedtls/camellia.h \ include/mbedtls/ccm.h \ include/mbedtls/certs.h \ include/mbedtls/chacha20.h \ include/mbedtls/chachapoly.h \ include/mbedtls/check_config.h \ include/mbedtls/cipher.h \ include/mbedtls/cipher_internal.h \ include/mbedtls/cmac.h \ include/mbedtls/compat-1.3.h \ include/mbedtls/config.h \ include/mbedtls/ctr_drbg.h \ include/mbedtls/debug.h \ include/mbedtls/des.h \ include/mbedtls/dhm.h \ include/mbedtls/ecdh.h \ include/mbedtls/ecdsa.h \ include/mbedtls/ecjpake.h \ include/mbedtls/ecp.h \ include/mbedtls/ecp_internal.h \ include/mbedtls/entropy.h \ include/mbedtls/entropy_poll.h \ include/mbedtls/error.h \ include/mbedtls/gcm.h \ include/mbedtls/havege.h \ include/mbedtls/hkdf.h \ include/mbedtls/hmac_drbg.h \ include/mbedtls/md2.h \ include/mbedtls/md4.h \ include/mbedtls/md5.h \ include/mbedtls/md.h \ include/mbedtls/md_internal.h \ include/mbedtls/memory_buffer_alloc.h \ include/mbedtls/net.h \ include/mbedtls/net_sockets.h \ include/mbedtls/nist_kw.h \ include/mbedtls/oid.h \ include/mbedtls/padlock.h \ include/mbedtls/pem.h \ include/mbedtls/pkcs11.h \ include/mbedtls/pkcs12.h \ include/mbedtls/pkcs5.h \ include/mbedtls/pk.h \ include/mbedtls/pk_internal.h \ include/mbedtls/platform.h \ include/mbedtls/platform_time.h \ include/mbedtls/platform_util.h \ include/mbedtls/poly1305.h \ include/mbedtls/ripemd160.h \ include/mbedtls/rsa.h \ include/mbedtls/rsa_internal.h \ include/mbedtls/sha1.h \ include/mbedtls/sha256.h \ include/mbedtls/sha512.h \ include/mbedtls/ssl_cache.h \ include/mbedtls/ssl_ciphersuites.h \ include/mbedtls/ssl_cookie.h \ include/mbedtls/ssl.h \ include/mbedtls/ssl_internal.h \ include/mbedtls/ssl_ticket.h \ include/mbedtls/threading.h \ include/mbedtls/timing.h \ include/mbedtls/version.h \ include/mbedtls/x509_crl.h \ include/mbedtls/x509_crt.h \ include/mbedtls/x509_csr.h \ include/mbedtls/x509.h \ include/mbedtls/xtea.h EXTRA_fldigi_SOURCES = \ $(HAMLIB_SRC) $(XMLRPC_SRC) $(FLDIGI_WIN32_RES_SRC) \ $(COMMON_WIN32_RES_SRC) $(BENCHMARK_SRC) $(REGEX_SRC) $(STACK_SRC) \ $(MINGW32_SRC) $(NLS_SRC) $(XMLRPCPP_SRC) $(LIBMBEDTLS_SRC) EXTRA_flarq_SOURCES = $(FLARQ_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) $(XMLRPCPP_SRC) fldigi_SOURCES = flarq_SOURCES = fldigi_SOURCES += $(XMLRPC_SRC) if !ENABLE_FLXMLRPC fldigi_SOURCES += $(XMLRPCPP_SRC) flarq_SOURCES += $(XMLRPCPP_SRC) else fldigi_CPPFLAGS += @FLXMLRPC_CFLAGS@ fldigi_CXXFLAGS += @FLXMLRPC_CFLAGS@ fldigi_CFLAGS += @FLXMLRPC_CFLAGS@ fldigi_LDFLAGS += @FLXMLRPC_LIBS@ flarq_CPPFLAGS += @FLXMLRPC_CFLAGS@ flarq_CXXFLAGS += @FLXMLRPC_CFLAGS@ flarq_CFLAGS += @FLXMLRPC_CFLAGS@ flarq_LDFLAGS += @FLXMLRPC_LIBS@ endif if !ENABLE_LIBMBEDTLS fldigi_SOURCES += $(LIBMBEDTLS_SRC) else fldigi_CPPFLAGS += @LIBMBEDTLS_CFLAGS@ fldigi_CXXFLAGS += @LIBMBEDTLS_CFLAGS@ fldigi_CFLAGS += @LIBMBEDTLS_CFLAGS@ fldigi_LDFLAGS += @LIBMBEDTLS_LIBS@ endif if ENABLE_HAMLIB fldigi_SOURCES += $(HAMLIB_SRC) endif if NEED_HAMLIB_LOCATOR fldigi_SOURCES += $(LOCATOR_SRC) endif if ENABLE_BENCHMARK fldigi_SOURCES += $(BENCHMARK_SRC) endif if COMPAT_REGEX fldigi_SOURCES += $(REGEX_SRC) flarq_SOURCES += $(REGEX_SRC) endif if COMPAT_STACK fldigi_SOURCES += $(STACK_SRC) flarq_SOURCES += $(STACK_SRC) endif if MINGW32 fldigi_SOURCES += $(MINGW32_SRC) flarq_SOURCES += $(MINGW32_SRC) endif if USE_NLS fldigi_SOURCES += $(NLS_SRC) flarq_SOURCES += $(NLS_SRC) endif ######################################################################## FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLDIGI_VERSION = @FLDIGI_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLARQ_VERSION = @FLARQ_VERSION@ # Define the custom silent rule function @SILENT_CMDS@ .EXPORT_ALL_VARIABLES: appbundle nsisinst hamlib-static # Sources that are generated, BUILT_SOURCES = # not distributed, nodist_fldigi_SOURCES = $(BUILT_SOURCES) # and deleted by the clean targets CLEANFILES = $(BUILT_SOURCES) CLEAN_LOCAL = if WIN32 if HAVE_WINDRES .rc.o: $(call silent,WRES ,$@)$(WINDRES) -DRC_BUILD_TIME=\\\"$(shell date +%s)\\\" -I$(srcdir) -I$(srcdir)/include -I$(srcdir)/../data/win32 $< -O coff $@ fldigi_SOURCES += $(FLDIGI_WIN32_RES_SRC) flarq_SOURCES += $(FLARQ_WIN32_RES_SRC) endif endif install-exec-local: if WANT_FLDIGI if test -f $(srcdir)/../scripts/ftp_kml_files.sh; then \ $(mkinstalldirs) $(DESTDIR)/$(bindir); \ $(INSTALL_SCRIPT) $(srcdir)/../scripts/ftp_kml_files.sh $(DESTDIR)/$(bindir); \ fi endif # TODO: xpm files should probably go to $(datadir)/pixmaps/fldigi instead of $(datadir)/pixmaps install-data-local: if WANT_FLDIGI if test -f $(srcdir)/../data/fldigi.xpm; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ $(INSTALL_DATA) $(srcdir)/../data/fldigi.xpm $(DESTDIR)/$(datadir)/pixmaps; \ fi if test -f $(srcdir)/../data/fldigi.desktop; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ $(INSTALL_DATA) $(srcdir)/../data/fldigi.desktop $(DESTDIR)/$(datadir)/applications; \ fi if test -f $(srcdir)/../data/NAVTEX_Stations.csv; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/NAVTEX_Stations.csv $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/nsd_bbsss.txt; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/nsd_bbsss.txt $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/station_table.txt; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/station_table.txt $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/ToR-Stats-SHIP.csv; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/ToR-Stats-SHIP.csv $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../data/wmo_list.txt; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ $(INSTALL_DATA) $(srcdir)/../data/wmo_list.txt $(DESTDIR)/$(pkgdatadir); \ fi if test -f $(srcdir)/../kml/styles.kml; then \ $(mkinstalldirs) $(DESTDIR)/$(pkgdatadir)/kml; \ $(INSTALL_DATA) $(srcdir)/../kml/styles.kml $(DESTDIR)/$(pkgdatadir)/kml; \ fi endif if WANT_FLARQ if test -f $(srcdir)/../data/flarq.xpm; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ $(INSTALL_DATA) $(srcdir)/../data/flarq.xpm $(DESTDIR)/$(datadir)/pixmaps; \ fi if test -f $(srcdir)/../data/flarq.desktop; then \ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ $(INSTALL_DATA) $(srcdir)/../data/flarq.desktop $(DESTDIR)/$(datadir)/applications; \ fi endif uninstall-local: if WANT_FLDIGI rm -f $(DESTDIR)/$(datadir)/pixmaps/fldigi.xpm rm -f $(DESTDIR)/$(datadir)/applications/fldigi.desktop rm -fr $(DESTDIR)/$(datadir)/fldigi endif if WANT_FLARQ rm -f $(DESTDIR)/$(datadir)/pixmaps/flarq.xpm rm -f $(DESTDIR)/$(datadir)/applications/flarq.desktop endif FLDIGI_FL_SRC = \ debug/debug_dialog.fl \ dialogs/confdialog.fl \ dialogs/notifydialog.fl \ dialogs/record_browse.fl \ dialogs/rxmon.fl \ dialogs/testsigs.fl \ logbook/lgbook.fl \ logbook/fd_view.fl \ dxcluster/dx_dialog.fl FLARQ_FL_SRC = flarq-src/arqdialogs.fl if HAVE_FLUID flgen: $(FLDIGI_FL_SRC) $(FLARQ_FL_SRC) if WANT_FLDIGI $(call silent,FLUID ,$(FLDIGI_FL_SRC))(cd $(srcdir)/include; \ for f in $(FLDIGI_FL_SRC); do \ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ $(FLUID) -c -o ../$$c -h $$h ../$$f; \ done) endif if WANT_FLARQ $(call silent,FLUID ,$(FLARQ_FL_SRC))(cd $(srcdir)/flarq-src/include; \ for f in $(FLARQ_FL_SRC); do \ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ $(FLUID) -c -o ../../$$c -h $$h ../../$$f; \ done) endif endif if WANT_FLDIGI WANT_FLDIGI = yes INSTALLER_FILE = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)_setup.exe APPBUNDLE=$(PACKAGE_TARNAME)-$(PACKAGE_VERSION) APPBUNDLE_NOLIBS=$(APPBUNDLE)-nolibs endif if WANT_FLARQ WANT_FLARQ = yes if !WANT_FLDIGI INSTALLER_FILE = flarq-$(FLARQ_VERSION)_setup.exe APPBUNDLE=flarq-$(FLARQ_VERSION) APPBUNDLE_NOLIBS=$(APPBUNDLE)-nolibs endif endif if DARWIN appbundle: $(bin_PROGRAMS) $(call silent,APPB ,$(APPBUNDLE_NOLIBS) $(APPBUNDLE))sh $(srcdir)/../scripts/mkappbundle.sh "$(srcdir)/../data" . CLEAN_LOCAL += $(APPBUNDLE_NOLIBS) $(APPBUNDLE) $(APPBUNDLE)*.dmg endif if HAVE_NSIS nsisinst: $(bin_PROGRAMS) $(call silent,NSIS ,$(INSTALLER_FILE))sh $(srcdir)/../scripts/mknsisinst.sh "$(srcdir)/../data" . CLEANFILES += $(INSTALLER_FILE) endif if USE_NLS CLEAN_LOCAL += share endif if WANT_FLDIGI if ENABLE_HAMLIB hamlib-static: $(fldigi_OBJECTS) $(call silent,HLS ,fldigi$(EXEEXT))sh $(srcdir)/../scripts/mkhamlibstatic.sh fldigi endif endif tmp_srcdir_var=$(srcdir) TESTS = $(tmp_srcdir_var)/../scripts/tests/config-h.sh $(tmp_srcdir_var)/../scripts/tests/cr.sh if HAVE_ASCIIDOC $(builddir)/../doc/guide.html: $(builddir)/../doc/guide.txt @$(MAKE) -C $(builddir)/../doc $(AM_MAKEFLAGS) guide.html $(builddir)/dialogs/guide.cxx: $(builddir)/../doc/guide.html @mkdir -p $(builddir)/dialogs $(call silent,GUIDE ,$@)sed 's/\\/\\\\/g; s/"/\\"/g; s/$$/\\n\\/g; 1 s/.*/const char* szBeginner = "&/; $$ s/.*/&n";/' $< > $@ dialogs/htmlstrings.cxx: $(builddir)/dialogs/guide.cxx distclean-local: @if test "$(builddir)" != "$(srcdir)"; then \ rm -f $(builddir)/dialogs/guide.cxx; \ fi endif clean-local: -rm -rf $(CLEAN_LOCAL) # Sources that we build. It is OK to have headers here. fldigi_SOURCES += \ cmedia/cmedia.cxx \ cmedia/hid.cxx \ combo/combo.cxx \ config_script/create_default_script.cxx \ config_script/run_script.h \ config_script/run_scripts.cxx \ config_script/script_parsing.cxx \ config_script/script_parsing.h \ contestia/contestia.cxx \ cw/cw.cxx \ cw/ICOMkeying.cxx \ cw/KYkeying.cxx \ cw/morse.cxx \ cw/nanoIO.cxx \ cw/Nav.cxx \ cw/view_cw.cxx \ cw/winkeyer.cxx \ cw/YAESUkeying.cxx \ rtty/fsk.cxx \ rtty/rtty.cxx \ rtty/view_rtty.cxx \ debug/debug.cxx \ debug/debug_dialog.cxx \ dialogs/confdialog.cxx \ dialogs/fl_digi.cxx \ dialogs/font_browser.cxx \ dialogs/htmlstrings.cxx \ dialogs/notifydialog.cxx \ dialogs/record_browse.cxx \ dialogs/rxmon.cxx \ dialogs/testsigs.cxx \ dialogs/tod_clock.cxx \ dialogs/Viewer.cxx \ dominoex/dominoex.cxx \ dominoex/dominovar.cxx \ dtmf/dtmf.cxx \ dxcluster/dxcluster.cxx \ dxcluster/dx_dialog.cxx \ feld/feld.cxx \ feld/feldfonts.cxx \ fft-monitor/fft-monitor.cxx \ fft-monitor/spectrum.cxx \ fft-monitor/spectrum_viewer.cxx \ fileselector/fileselect.cxx \ filters/fftfilt.cxx \ filters/filters.cxx \ filters/viterbi.cxx \ fmt/fmt.cxx \ fmt/fmt_dialog.cxx \ fsq/fsq.cxx \ fsq/fsq_monitor.cxx \ globals/globals.cxx \ ifkp/ifkp.cxx \ ifkp/tux.cxx \ irrxml/CXMLReaderImpl.h \ irrxml/fast_atof.h \ irrxml/heapsort.h \ irrxml/irrArray.h \ irrxml/irrString.h \ irrxml/irrTypes.h \ irrxml/irrXML.cpp \ irrxml/irrXML.h \ kml/kmlserver.cxx \ libtiniconv/tiniconv.c \ libtiniconv/tiniconv_desc.c \ logbook/adif_io.cxx \ logbook/calendar.cxx \ logbook/contest.cxx \ logbook/counties.cxx \ logbook/county_lists.cxx \ logbook/cty-dat.cxx \ logbook/date.cxx \ logbook/fd_logger.cxx \ logbook/fd_view.cxx \ logbook/lgbook.cxx \ logbook/logbook.cxx \ logbook/logsupport.cxx \ logbook/lookupcall.cxx \ logbook/maclogger.cxx \ logbook/n3fjp_logger.cxx \ logbook/qrzlib.cxx \ logbook/qso_db.cxx \ logbook/table.cxx \ logbook/textio.cxx \ logbook/xmlrpc_log.cxx \ logger/logger.cxx \ logger/rx_extract.cxx \ logger/speak.cxx \ main.cxx \ mfsk/interleave.cxx \ mfsk/mfsk.cxx \ mfsk/mfskvaricode.cxx \ misc/arq_io.cxx \ misc/ascii.cxx \ misc/ax25_decode.cxx \ misc/charsetdistiller.cxx \ misc/charsetlist.cxx \ misc/configuration.cxx \ misc/coordinate.cxx \ misc/dxcc.cxx \ misc/estrings.cxx \ misc/icons.cxx \ misc/kiss_io.cxx \ misc/locator.cxx \ misc/log.cxx \ misc/macroedit.cxx \ misc/macros.cxx \ misc/misc.cxx \ misc/newinstall.cxx \ misc/outputencoder.cxx \ misc/pixmaps.cxx \ misc/pixmaps_tango.cxx \ misc/record_loader.cxx \ misc/re.cxx \ misc/stacktrace.cxx \ misc/strutil.cxx \ misc/threads.cxx \ misc/timeops.cxx \ misc/utf8file_io.cxx \ misc/util.cxx \ mt63/dsp.cxx \ mt63/mt63base.cxx \ mt63/mt63.cxx \ navtex/navtex.cxx \ network/ca_cert.cxx \ network/metar.cxx \ network/network.cxx \ network/socket.cxx \ network/weather.cxx \ olivia/olivia.cxx \ psk/pskcoeff.cxx \ psk/psk.cxx \ psk/pskeval.cxx \ psk/pskvaricode.cxx \ psk/viewpsk.cxx \ psm/psm.cxx \ psm/psm.h \ qrunner/fqueue.h \ qrunner/qrunner.cxx \ rigcontrol/FreqControl.cxx \ rigcontrol/norig.cxx \ rigcontrol/ptt.cxx \ rigcontrol/rigio.cxx \ rigcontrol/rigsupport.cxx \ rigcontrol/rigxml.cxx \ rigcontrol/serial.cxx \ rigcontrol/xmlrpc_rig.cxx \ rsid/rsid.cxx \ soundcard/audio_alert.cxx \ soundcard/bark.cxx \ soundcard/checkout.cxx \ soundcard/diesel.cxx \ soundcard/dinnerbell.cxx \ soundcard/doesnot.cxx \ soundcard/play.pa.cxx \ soundcard/soundconf.cxx \ soundcard/sound.cxx \ soundcard/steam_train.cxx \ soundcard/ttybell.cxx \ spot/notify.cxx \ spot/pskrep.cxx \ spot/spot.cxx \ ssb/ssb.cxx \ status/squelch_status.cxx \ status/status.cxx \ synop-src/synop.cxx \ thor/thor.cxx \ thor/thorvaricode.cxx \ throb/throb.cxx \ trx/modem.cxx \ trx/nullmodem.cxx \ trx/test_signal.cxx \ trx/trx.cxx \ waterfall/colorbox.cxx \ waterfall/digiscope.cxx \ waterfall/raster.cxx \ waterfall/waterfall.cxx \ wefax/wefax.cxx \ wefax/wefax_map.cxx \ wefax/wefax-pic.cxx \ widgets/flinput2.cxx \ widgets/flmisc.cxx \ widgets/flslider2.cxx \ widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextRXTX.cxx \ widgets/FTextView.cxx \ widgets/Panel.cxx \ widgets/picture.cxx \ widgets/plot_xy.cxx \ widgets/progress.cxx \ widgets/psk_browser.cxx \ widgets/pwrmeter.cxx \ widgets/smeter.cxx \ widgets/vumeter.cxx \ wwv/analysis.cxx \ wwv/wwv.cxx # packet/pkt.cxx # include/pkt.h # Sources that are part of the distribution but are not compiled directly EXTRA_fldigi_SOURCES += \ blank/blank.cxx \ blank/blank.h \ cmedia/hid_lin.cxx \ cmedia/hid_mac.cxx \ cmedia/hid_win.cxx \ dialogs/fl_digi_main.cxx \ dxcluster/arc-help.cxx \ dxcluster/CCC_Commands.cxx \ dxcluster/DXClusterServers.cxx \ dxcluster/DXSpiderCommandReference.cxx \ fileselector/flnfc_common.cxx \ feld/Feld7x7-14.cxx \ feld/Feld7x7n-14.cxx \ feld/FeldDx-14.cxx \ feld/FeldFat-14.cxx \ feld/FeldHell-12.cxx \ feld/FeldLittle-12.cxx \ feld/FeldLo8-14.cxx \ feld/FeldLow-14.cxx \ feld/FeldModern-14.cxx \ feld/FeldModern8-14.cxx \ feld/FeldNarr-14.cxx \ feld/FeldReal-14.cxx \ feld/FeldStyl-14.cxx \ feld/FeldVert-14.cxx \ feld/FeldWide-14.cxx \ fsq/fsq_varicode.cxx \ include/crc8.h \ include/Fl_Text_Buffer_mod.H \ include/Fl_Text_Display_mod.H \ include/Fl_Text_Editor_mod.H \ fsq/fsq-pic.cxx \ fsq/bitmaps.cxx \ ifkp/ifkp_bitmaps.cxx \ ifkp/ifkp_varicode.cxx \ ifkp/ifkp-pic.cxx \ mfsk/mfsk-pic.cxx \ mt63/alias_1k.dat \ mt63/alias_2k.dat \ mt63/morse.dat \ mt63/symbol.dat \ mt63/alias_k5.dat \ mt63/mt63intl.dat \ rsid/rsid_defs.cxx \ thor/thor-pic.cxx \ trx/tune.cxx \ dialogs/guide.cxx \ include/adif_def.h \ include/adif_io.h \ include/analysis.h \ include/arq_io.h \ include/ascii.h \ include/audio_alert.h \ include/ax25_decode.h \ include/calendar.h \ include/charsetdistiller.h \ include/charsetlist.h \ include/cmedia.h \ include/colorbox.h \ include/combo.h \ include/complex.h \ include/confdialog.h \ include/configuration.h \ include/contest.h \ include/contestia.h \ include/coordinate.h \ include/counties.h \ include/cw.h \ include/data_io.h \ include/date.h \ include/debug.h \ include/debug_dialog.h \ include/digiscope.h \ include/dominoex.h \ include/dominovar.h \ include/dr_mp3.h \ include/dsp.h \ include/dtmf.h \ include/dxcc.h \ include/dx_cluster.h \ include/dx_dialog.h \ include/estrings.h \ include/fd_logger.h \ include/fd_view.h \ include/feld.h \ include/fftfilt.h \ include/fft-monitor.h \ include/field_def.h \ include/fileselect.h \ include/filters.h \ include/fldigi-config.h \ include/fl_digi.h \ include/flinput2.h \ include/flmisc.h \ include/flslider2.h \ include/fmt.h \ include/fmt_dialog.h \ include/font_browser.h \ include/fontdef.h \ include/FreqControl.h \ include/fsk.h \ include/fsq.h \ include/FTextRXTX.h \ include/FTextView.h \ include/gettext.h \ include/gfft.h \ include/globals.h \ include/hidapi.h \ include/hid_lin.h \ include/hid_mac.h \ include/hid_win.h \ include/htmlstrings.h \ include/https.h \ include/icons.h \ include/ifkp.h \ include/interleave.h \ include/jalocha/pj_cmpx.h \ include/jalocha/pj_fft.h \ include/jalocha/pj_fht.h \ include/jalocha/pj_fifo.h \ include/jalocha/pj_gray.h \ include/jalocha/pj_lowpass3.h \ include/jalocha/pj_mfsk.h \ include/jalocha/pj_struc.h \ include/kiss_io.h \ include/kmlserver.h \ include/ICOMkeying.h \ include/KYkeying.h \ include/YAESUkeying.h \ include/lgbook.h \ include/locator.h \ include/logbook.h \ include/logger.h \ include/log.h \ include/logsupport.h \ include/lookupcall.h \ include/maclogger.h \ include/macroedit.h \ include/macros.h \ include/main.h \ include/mbuffer.h \ include/metar.h \ include/mfsk.h \ include/mfskvaricode.h \ include/misc.h \ include/modem.h \ include/morse.h \ include/mt63base.h \ include/mt63.h \ include/n3fjp_logger.h \ include/nanoIO.h \ include/Nav.h \ include/navtex.h \ include/navtex.h \ include/nco.h \ include/network.h \ include/newinstall.h \ include/notifydialog.h \ include/notify.h \ include/nullmodem.h \ include/olivia.h \ include/outputencoder.h \ include/Panel.h \ include/picture.h \ include/plot_xy.h \ include/pixmaps.h \ include/pkg.h \ include/play.pa.h \ include/progress.h \ include/psk_browser.h \ include/pskcoeff.h \ include/pskeval.h \ include/psk.h \ include/pskrep.h \ include/pskvaricode.h \ include/ptt.h \ include/pwrmeter.h \ include/qrunner.h \ include/qrzlib.h \ include/qso_db.h \ include/raster.h \ include/record_browse.h \ include/record_loader_gui.h \ include/record_loader.h \ include/re.h \ include/rigCAT.h \ include/rigio.h \ include/rigsupport.h \ include/rigxml.h \ include/ringbuffer.h \ include/rsid.h \ include/rtty.h \ include/rx_extract.h \ include/rxmon.h \ include/serial.h \ include/smeter.h \ include/squelch_status.h \ include/vumeter.h \ include/socket.h \ include/soundconf.h \ include/sound.h \ include/speak.h \ include/spectrum.h \ include/spectrum_viewer.h \ include/spot.h \ include/ssb.h \ include/stacktrace.h \ include/status.h \ include/status_box.h \ include/strutil.h \ include/synop.h \ include/tabdefs.h \ include/table.h \ include/testmodem.h \ include/test_signal.h \ include/testsigs.h \ include/textio.h \ include/thor.h \ include/thorvaricode.h \ include/threads.h \ include/throb.h \ include/timeops.h \ include/trx.h \ include/utf8file_io.h \ include/util.h \ include/view_cw.h \ include/Viewer.h \ include/viewpsk.h \ include/view_rtty.h \ include/viterbi.h \ include/waterfall.h \ include/weather.h \ include/wefax.h \ include/wefax_map.h \ include/wefax-pic.h \ include/winkeyer.h \ include/wwv.h \ include/xmlreader.h \ libtiniconv/tiniconv.h \ libtiniconv/tiniconv_int.h \ libtiniconv/encdec/ascii.h \ libtiniconv/encdec/big5.h \ libtiniconv/encdec/ces_big5.h \ libtiniconv/encdec/ces_gbk.h \ libtiniconv/encdec/cp1250.h \ libtiniconv/encdec/cp1251.h \ libtiniconv/encdec/cp1252.h \ libtiniconv/encdec/cp1253.h \ libtiniconv/encdec/cp1254.h \ libtiniconv/encdec/cp1255.h \ libtiniconv/encdec/cp1256.h \ libtiniconv/encdec/cp1257.h \ libtiniconv/encdec/cp1258.h \ libtiniconv/encdec/cp866.h \ libtiniconv/encdec/cp936ext.h \ libtiniconv/encdec/cp936.h \ libtiniconv/encdec/euc_cn.h \ libtiniconv/encdec/flushwc.h \ libtiniconv/encdec/gb2312.h \ libtiniconv/encdec/gbkext1.h \ libtiniconv/encdec/gbkext2.h \ libtiniconv/encdec/gbkext_inv.h \ libtiniconv/encdec/gbk.h \ libtiniconv/encdec/iso2022_jp.h \ libtiniconv/encdec/iso8859_10.h \ libtiniconv/encdec/iso8859_11.h \ libtiniconv/encdec/iso8859_13.h \ libtiniconv/encdec/iso8859_14.h \ libtiniconv/encdec/iso8859_15.h \ libtiniconv/encdec/iso8859_16.h \ libtiniconv/encdec/iso8859_1.h \ libtiniconv/encdec/iso8859_2.h \ libtiniconv/encdec/iso8859_3.h \ libtiniconv/encdec/iso8859_4.h \ libtiniconv/encdec/iso8859_5.h \ libtiniconv/encdec/iso8859_6.h \ libtiniconv/encdec/iso8859_7.h \ libtiniconv/encdec/iso8859_8.h \ libtiniconv/encdec/iso8859_9.h \ libtiniconv/encdec/jisx0201.h \ libtiniconv/encdec/jisx0208.h \ libtiniconv/encdec/koi8_r.h \ libtiniconv/encdec/koi8_ru.h \ libtiniconv/encdec/koi8_u.h \ libtiniconv/encdec/mac_cyrillic.h \ libtiniconv/encdec/ucs2.h \ libtiniconv/encdec/utf7.h \ libtiniconv/encdec/utf8.h \ libtiniconv/encdec/vietcomb.h flarq_SOURCES += \ dialogs/font_browser.cxx \ flarq-src/arq.cxx \ flarq-src/arqdialogs.cxx \ flarq-src/arqhelp.cxx \ flarq-src/b64.cxx \ flarq-src/flarq.cxx \ flarq-src/flarqenv.cxx \ flarq-src/xml_server.cxx \ flarq-src/include/arq.h \ flarq-src/include/arqdialogs.h \ flarq-src/include/b64.h \ flarq-src/include/flarq.h \ flarq-src/include/flarqenv.h \ flarq-src/include/xml_server.h \ include/F_Edit.h \ include/fileselect.h \ include/flinput2.h \ include/flmisc.h \ include/flslider2.h \ include/font_browser.h \ include/icons.h \ include/pixmaps.h \ include/re.h \ include/socket.h \ include/stacktrace.h \ include/threads.h \ include/table.h \ include/util.h \ combo/combo.cxx \ fileselector/fileselect.cxx \ logbook/table.cxx \ misc/ascii.cxx \ misc/stacktrace.cxx \ misc/threads.cxx \ misc/timeops.cxx \ network/socket.cxx \ widgets/flinput2.cxx \ widgets/flmisc.cxx \ widgets/flslider2.cxx \ misc/icons.cxx \ misc/pixmaps.cxx \ misc/pixmaps_tango.cxx \ misc/re.cxx \ misc/util.cxx \ widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextView.cxx \ widgets/F_Edit.cxx # Additional files that we distribute EXTRA_DIST = \ $(srcdir)/../build-aux/config.rpath \ $(srcdir)/../scripts/mkappbundle.sh \ $(srcdir)/../scripts/mkhamlibstatic.sh \ $(srcdir)/../scripts/mknsisinst.sh \ $(srcdir)/../scripts/buildmxe.sh \ $(srcdir)/../scripts/builddist.sh \ $(srcdir)/../scripts/tests/cr.sh \ $(srcdir)/../scripts/tests/config-h.sh \ $(srcdir)/../data/fldigi-psk.png \ $(srcdir)/../data/fldigi-rtty.png \ $(srcdir)/../data/fldigi.xpm \ $(srcdir)/../data/fldigi.desktop \ $(srcdir)/../data/NAVTEX_Stations.csv \ $(srcdir)/../data/nsd_bbsss.txt \ $(srcdir)/../data/station_table.txt \ $(srcdir)/../data/ToR-Stats-SHIP.csv \ $(srcdir)/../data/mac/Info.plist.in \ $(srcdir)/../data/mac/fldigi.icns \ $(srcdir)/../data/win32/fldigi.ico \ $(srcdir)/../data/win32/fldigi.nsi \ $(srcdir)/../data/flarq.desktop \ $(srcdir)/../data/flarq.xpm \ $(srcdir)/../data/mac/flarq.icns \ $(srcdir)/../data/win32/flarq.ico \ $(srcdir)/mbedtls/libmbedtls.pc \ $(srcdir)/mbedtls/LICENSE \ $(srcdir)/mbedtls/gpl-2.0.txt \ $(srcdir)/synop-src/synop_tool.cxx \ $(srcdir)/synop-src/README \ $(srcdir)/synop-src/Makefile \ $(FLDIGI_FL_SRC) \ $(FLARQ_FL_SRC) fldigi-4.2.05/src/flarq-src/0000775000175000017500000000000014611714005012523 500000000000000fldigi-4.2.05/src/flarq-src/arqdialogs.cxx0000664000175000017500000006114414611711171015324 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "arqdialogs.h" #include #include #include "flarq.h" static void cb_flarq(Fl_Double_Window*, void*) { arqCLOSE(); } Fl_Menu_Bar *mnu=(Fl_Menu_Bar *)0; static void cb_mnu_nbems_files(Fl_Menu_*, void*) { open_nbems_file_folder(); } static void cb_mnuExit(Fl_Menu_*, void*) { arqCLOSE(); } static void cb_mnuSendEmail(Fl_Menu_*, void*) { sendEmailFile(); } static void cb_mnuSendText(Fl_Menu_*, void*) { sendAsciiFile(); } static void cb_mnuSendImage(Fl_Menu_*, void*) { sendImageFile(); } static void cb_mnuSendBinary(Fl_Menu_*, void*) { sendBinaryFile(); } static void cb_mnuCompose(Fl_Menu_*, void*) { ComposeMail(); } static void cb_mnuConfig(Fl_Menu_*, void*) { cbMenuConfig(); } static void cb_mnuHowTo(Fl_Menu_*, void*) { help_cb(); } static void cb_mnuAbout(Fl_Menu_*, void*) { cbMenuAbout(); } Fl_Menu_Item menu_mnu[] = { {"&File", 0, 0, 0, 64, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"NBEMS files", 0, (Fl_Callback*)cb_mnu_nbems_files, 0, 128, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"E&xit", 0, (Fl_Callback*)cb_mnuExit, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"&Send", 0, 0, 0, 64, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"Email", 0, (Fl_Callback*)cb_mnuSendEmail, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"Text File", 0, (Fl_Callback*)cb_mnuSendText, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"Image File", 0, (Fl_Callback*)cb_mnuSendImage, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"Binary File", 0, (Fl_Callback*)cb_mnuSendBinary, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Compose", 0, (Fl_Callback*)cb_mnuCompose, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"&Config", 0, (Fl_Callback*)cb_mnuConfig, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"&Help", 0, 0, 0, 64, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"How To", 0, (Fl_Callback*)cb_mnuHowTo, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {"&About", 0, (Fl_Callback*)cb_mnuAbout, 0, 0, (uchar)FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0} }; Fl_Button *btnCONNECT=(Fl_Button *)0; static void cb_btnCONNECT(Fl_Button*, void*) { arqCONNECT(); } Fl_Input2 *txtURCALL=(Fl_Input2 *)0; Fl_Light_Button *btnBEACON=(Fl_Light_Button *)0; static void cb_btnBEACON(Fl_Light_Button*, void*) { arqBEACON(); } Fl_Input2 *txtBeaconing=(Fl_Input2 *)0; Fl_Box *indCONNECT=(Fl_Box *)0; Fl_Input2 *txtState=(Fl_Input2 *)0; FTextView *txtARQ=(FTextView *)0; Fl_Input2 *txtStatus=(Fl_Input2 *)0; Fl_Input2 *txtStatus2=(Fl_Input2 *)0; Fl_Progress *prgStatus=(Fl_Progress *)0; Fl_Button *btnClearText=(Fl_Button *)0; static void cb_btnClearText(Fl_Button*, void*) { cbClearText(); } FTextView *txtRX=(FTextView *)0; Fl_Input2 *txtTX=(Fl_Input2 *)0; static void cb_txtTX(Fl_Input2*, void*) { cbSendTalk(); } Fl_Button *btnSendTalk=(Fl_Button *)0; static void cb_btnSendTalk(Fl_Button*, void*) { cbClearTalk(); } Fl_Double_Window* arq_dialog() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(515, 415, "flarq"); w = o; if (w) {/* empty */} o->color(FL_LIGHT1); o->callback((Fl_Callback*)cb_flarq); { mnu = new Fl_Menu_Bar(0, 0, 516, 22); mnu->menu(menu_mnu); } // Fl_Menu_Bar* mnu { Fl_Group* o = new Fl_Group(0, 25, 515, 60); { Fl_Group* o = new Fl_Group(0, 25, 515, 31); o->box(FL_ENGRAVED_FRAME); { btnCONNECT = new Fl_Button(5, 28, 90, 24, "Connnect"); btnCONNECT->tooltip("Connect to other station"); btnCONNECT->color(FL_LIGHT1); btnCONNECT->callback((Fl_Callback*)cb_btnCONNECT); } // Fl_Button* btnCONNECT { txtURCALL = new Fl_Input2(97, 28, 70, 24); txtURCALL->tooltip("Connect-to callsign"); txtURCALL->box(FL_DOWN_BOX); txtURCALL->color(FL_BACKGROUND2_COLOR); txtURCALL->selection_color(FL_SELECTION_COLOR); txtURCALL->labeltype(FL_NORMAL_LABEL); txtURCALL->labelfont(0); txtURCALL->labelsize(14); txtURCALL->labelcolor(FL_FOREGROUND_COLOR); txtURCALL->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtURCALL->when(FL_WHEN_RELEASE); } // Fl_Input2* txtURCALL { btnBEACON = new Fl_Light_Button(168, 28, 79, 24, "Beacon"); btnBEACON->tooltip("Beacon ON / OFF"); btnBEACON->selection_color((Fl_Color)2); btnBEACON->callback((Fl_Callback*)cb_btnBEACON); } // Fl_Light_Button* btnBEACON { Fl_Input2* o = txtBeaconing = new Fl_Input2(249, 28, 261, 24, "output:"); txtBeaconing->box(FL_FLAT_BOX); txtBeaconing->color(FL_LIGHT1); txtBeaconing->selection_color(FL_SELECTION_COLOR); txtBeaconing->labeltype(FL_NORMAL_LABEL); txtBeaconing->labelfont(0); txtBeaconing->labelsize(14); txtBeaconing->labelcolor(FL_FOREGROUND_COLOR); txtBeaconing->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtBeaconing->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtBeaconing); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtBeaconing o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 54, 515, 31); o->box(FL_ENGRAVED_FRAME); { indCONNECT = new Fl_Box(5, 60, 18, 18); indCONNECT->tooltip("ARQ state"); indCONNECT->box(FL_DIAMOND_DOWN_BOX); indCONNECT->color(FL_LIGHT1); indCONNECT->labelfont(13); indCONNECT->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE)); } // Fl_Box* indCONNECT { Fl_Input2* o = txtState = new Fl_Input2(27, 57, 483, 24, "Disconnecting"); txtState->box(FL_FLAT_BOX); txtState->color(FL_LIGHT1); txtState->selection_color(FL_SELECTION_COLOR); txtState->labeltype(FL_NORMAL_LABEL); txtState->labelfont(0); txtState->labelsize(14); txtState->labelcolor(FL_FOREGROUND_COLOR); txtState->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtState->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtState); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtState o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { txtARQ = new FTextView(0, 87, 515, 117); txtARQ->box(FL_DOWN_BOX); txtARQ->color(FL_BACKGROUND2_COLOR); txtARQ->selection_color(FL_SELECTION_COLOR); txtARQ->labeltype(FL_NORMAL_LABEL); txtARQ->labelfont(0); txtARQ->labelsize(14); txtARQ->labelcolor(FL_FOREGROUND_COLOR); txtARQ->textfont(4); txtARQ->align(Fl_Align(FL_ALIGN_TOP)); txtARQ->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtARQ); } // FTextView* txtARQ { Fl_Group* o = new Fl_Group(0, 206, 516, 26); o->box(FL_DOWN_BOX); { Fl_Input2* o = txtStatus = new Fl_Input2(5, 208, 220, 22); txtStatus->tooltip("Status messages"); txtStatus->box(FL_DOWN_BOX); txtStatus->color(FL_BACKGROUND2_COLOR); txtStatus->selection_color(FL_SELECTION_COLOR); txtStatus->labeltype(FL_NORMAL_LABEL); txtStatus->labelfont(0); txtStatus->labelsize(14); txtStatus->labelcolor(FL_FOREGROUND_COLOR); txtStatus->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtStatus->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtStatus); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtStatus { Fl_Input2* o = txtStatus2 = new Fl_Input2(225, 208, 170, 22); txtStatus2->box(FL_DOWN_BOX); txtStatus2->color(FL_BACKGROUND2_COLOR); txtStatus2->selection_color(FL_SELECTION_COLOR); txtStatus2->labeltype(FL_NORMAL_LABEL); txtStatus2->labelfont(0); txtStatus2->labelsize(14); txtStatus2->labelcolor(FL_FOREGROUND_COLOR); txtStatus2->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); txtStatus2->when(FL_WHEN_RELEASE); o->type(FL_NORMAL_OUTPUT); } // Fl_Input2* txtStatus2 { Fl_Progress* o = prgStatus = new Fl_Progress(395, 210, 70, 18); prgStatus->tooltip("Tx/Rx ARQ file transfer progress"); prgStatus->selection_color((Fl_Color)70); prgStatus->labelfont(1); o->minimum(0.0); o->maximum(1.0); } // Fl_Progress* prgStatus { btnClearText = new Fl_Button(468, 210, 45, 20, "Clear"); btnClearText->callback((Fl_Callback*)cb_btnClearText); } // Fl_Button* btnClearText o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(0, 235, 515, 180, "Plain Talk"); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { txtRX = new FTextView(5, 255, 505, 130); txtRX->box(FL_DOWN_BOX); txtRX->color(FL_BACKGROUND2_COLOR); txtRX->selection_color(FL_SELECTION_COLOR); txtRX->labeltype(FL_NORMAL_LABEL); txtRX->labelfont(0); txtRX->labelsize(14); txtRX->labelcolor(FL_FOREGROUND_COLOR); txtRX->textfont(4); txtRX->align(Fl_Align(FL_ALIGN_TOP)); txtRX->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtRX); } // FTextView* txtRX { Fl_Group* o = new Fl_Group(0, 387, 515, 28); o->box(FL_ENGRAVED_FRAME); { txtTX = new Fl_Input2(5, 390, 450, 22, "input:"); txtTX->tooltip("Plain talk text - ENTER to send"); txtTX->box(FL_DOWN_BOX); txtTX->color(FL_BACKGROUND2_COLOR); txtTX->selection_color(FL_SELECTION_COLOR); txtTX->labeltype(FL_NORMAL_LABEL); txtTX->labelfont(0); txtTX->labelsize(14); txtTX->labelcolor(FL_FOREGROUND_COLOR); txtTX->callback((Fl_Callback*)cb_txtTX); txtTX->align(Fl_Align(FL_ALIGN_CENTER)); txtTX->when(FL_WHEN_ENTER_KEY); Fl_Group::current()->resizable(txtTX); txtTX->value(""); txtTX->maximum_size(80); } // Fl_Input2* txtTX { btnSendTalk = new Fl_Button(460, 390, 49, 22, "Clear"); btnSendTalk->callback((Fl_Callback*)cb_btnSendTalk); } // Fl_Button* btnSendTalk o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o o->end(); } // Fl_Double_Window* o return w; } Fl_Input2 *txtMyCall=(Fl_Input2 *)0; static void cb_txtMyCall(Fl_Input2* o, void*) { changeMyCall(o->value()); } Fl_Input2 *txtBEACONTXT=(Fl_Input2 *)0; static void cb_txtBEACONTXT(Fl_Input2* o, void*) { changeBeaconText(o->value()); } Fl_Spinner2 *spnRetries=(Fl_Spinner2 *)0; static void cb_spnRetries(Fl_Spinner2* o, void*) { iretries = (int)o->value(); cbSetConfig(); } Fl_Spinner2 *spnWaitTime=(Fl_Spinner2 *)0; static void cb_spnWaitTime(Fl_Spinner2* o, void*) { iwaittime = (int)(1000 * o->value()); cbSetConfig(); } Fl_Spinner2 *spnTimeout=(Fl_Spinner2 *)0; static void cb_spnTimeout(Fl_Spinner2* o, void*) { itimeout = (int)(o->value() * 1000.0); cbSetConfig(); } Fl_Spinner2 *spnTxDelay=(Fl_Spinner2 *)0; static void cb_spnTxDelay(Fl_Spinner2* o, void*) { txdelay = (int)o->value(); cbSetConfig(); } Fl_Spinner2 *spnBcnInterval=(Fl_Spinner2 *)0; static void cb_spnBcnInterval(Fl_Spinner2* o, void*) { bcnInterval = (int)o->value(); cbSetConfig(); } Fl_Spinner2 *spnIDtimer=(Fl_Spinner2 *)0; static void cb_spnIDtimer(Fl_Spinner2* o, void*) { idtimer = (int)(o->value()); cb_idtimer(); } Fl_ComboBox *choiceBlockSize=(Fl_ComboBox *)0; static void cb_choiceBlockSize(Fl_ComboBox* o, void*) { exponent = (int)o->index() + 4; cbSetConfig(); } Fl_Button *btnOK=(Fl_Button *)0; static void cb_btnOK(Fl_Button*, void*) { closeConfig(); } Fl_Check_Button *btn_restart_beacon=(Fl_Check_Button *)0; static void cb_btn_restart_beacon(Fl_Check_Button* o, void*) { restart_beacon = (int)(o->value()); cbSetConfig(); } Fl_Double_Window* arq_configure() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(480, 190, "Configure flarq"); w = o; if (w) {/* empty */} { Fl_Input2* o = txtMyCall = new Fl_Input2(98, 13, 150, 22, "My Call:"); txtMyCall->box(FL_DOWN_BOX); txtMyCall->color(FL_BACKGROUND2_COLOR); txtMyCall->selection_color(FL_SELECTION_COLOR); txtMyCall->labeltype(FL_NORMAL_LABEL); txtMyCall->labelfont(0); txtMyCall->labelsize(14); txtMyCall->labelcolor(FL_FOREGROUND_COLOR); txtMyCall->callback((Fl_Callback*)cb_txtMyCall); txtMyCall->align(Fl_Align(FL_ALIGN_LEFT)); txtMyCall->when(FL_WHEN_RELEASE); o->value(MyCall.c_str()); } // Fl_Input2* txtMyCall { Fl_Input2* o = txtBEACONTXT = new Fl_Input2(98, 42, 370, 22, "Beacon Text"); txtBEACONTXT->tooltip("Text for the beacon 64 chars max"); txtBEACONTXT->box(FL_DOWN_BOX); txtBEACONTXT->color(FL_BACKGROUND2_COLOR); txtBEACONTXT->selection_color(FL_SELECTION_COLOR); txtBEACONTXT->labeltype(FL_NORMAL_LABEL); txtBEACONTXT->labelfont(0); txtBEACONTXT->labelsize(14); txtBEACONTXT->labelcolor(FL_FOREGROUND_COLOR); txtBEACONTXT->callback((Fl_Callback*)cb_txtBEACONTXT); txtBEACONTXT->align(Fl_Align(FL_ALIGN_LEFT)); txtBEACONTXT->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtBEACONTXT); o->value(beacontext.c_str()); } // Fl_Input2* txtBEACONTXT { Fl_Spinner2* o = spnRetries = new Fl_Spinner2(146, 71, 45, 22, "Retries:"); spnRetries->tooltip("# retries before connection declared down"); spnRetries->box(FL_NO_BOX); spnRetries->color(FL_BACKGROUND_COLOR); spnRetries->selection_color(FL_BACKGROUND_COLOR); spnRetries->labeltype(FL_NORMAL_LABEL); spnRetries->labelfont(0); spnRetries->labelsize(14); spnRetries->labelcolor(FL_FOREGROUND_COLOR); spnRetries->callback((Fl_Callback*)cb_spnRetries); spnRetries->align(Fl_Align(FL_ALIGN_LEFT)); spnRetries->when(FL_WHEN_RELEASE); o->minimum(2); o->maximum(20); o->step(1); o->value(iretries); } // Fl_Spinner2* spnRetries { Fl_Spinner2* o = spnWaitTime = new Fl_Spinner2(121, 98, 70, 22, "Wait time (sec):"); spnWaitTime->tooltip("Time between retries"); spnWaitTime->box(FL_NO_BOX); spnWaitTime->color(FL_BACKGROUND_COLOR); spnWaitTime->selection_color(FL_BACKGROUND_COLOR); spnWaitTime->labeltype(FL_NORMAL_LABEL); spnWaitTime->labelfont(0); spnWaitTime->labelsize(14); spnWaitTime->labelcolor(FL_FOREGROUND_COLOR); spnWaitTime->callback((Fl_Callback*)cb_spnWaitTime); spnWaitTime->align(Fl_Align(FL_ALIGN_LEFT)); spnWaitTime->when(FL_WHEN_RELEASE); o->minimum(10); o->maximum(30); o->step(5); o->value(iwaittime/1000); } // Fl_Spinner2* spnWaitTime { Fl_Spinner2* o = spnTimeout = new Fl_Spinner2(121, 126, 70, 22, "Timeout (sec):"); spnTimeout->tooltip("Time out for dead connection"); spnTimeout->box(FL_NO_BOX); spnTimeout->color(FL_BACKGROUND_COLOR); spnTimeout->selection_color(FL_BACKGROUND_COLOR); spnTimeout->labeltype(FL_NORMAL_LABEL); spnTimeout->labelfont(0); spnTimeout->labelsize(14); spnTimeout->labelcolor(FL_FOREGROUND_COLOR); spnTimeout->callback((Fl_Callback*)cb_spnTimeout); spnTimeout->align(Fl_Align(FL_ALIGN_LEFT)); spnTimeout->when(FL_WHEN_RELEASE); o->minimum(30); o->maximum(300); o->step(15); o->value(itimeout / 1000); } // Fl_Spinner2* spnTimeout { Fl_Spinner2* o = spnTxDelay = new Fl_Spinner2(317, 126, 70, 22, "Tx delay (msec):"); spnTxDelay->tooltip("delay from Rx to Tx"); spnTxDelay->box(FL_NO_BOX); spnTxDelay->color(FL_BACKGROUND_COLOR); spnTxDelay->selection_color(FL_BACKGROUND_COLOR); spnTxDelay->labeltype(FL_NORMAL_LABEL); spnTxDelay->labelfont(0); spnTxDelay->labelsize(14); spnTxDelay->labelcolor(FL_FOREGROUND_COLOR); spnTxDelay->callback((Fl_Callback*)cb_spnTxDelay); spnTxDelay->align(Fl_Align(FL_ALIGN_LEFT)); spnTxDelay->when(FL_WHEN_RELEASE); o->minimum(200); o->maximum(2000); o->step(100); o->value(txdelay); } // Fl_Spinner2* spnTxDelay { Fl_Spinner2* o = spnBcnInterval = new Fl_Spinner2(398, 71, 70, 22, "Beacon interval (sec)"); spnBcnInterval->tooltip("Time between beacon transmissions"); spnBcnInterval->box(FL_NO_BOX); spnBcnInterval->color(FL_BACKGROUND_COLOR); spnBcnInterval->selection_color(FL_BACKGROUND_COLOR); spnBcnInterval->labeltype(FL_NORMAL_LABEL); spnBcnInterval->labelfont(0); spnBcnInterval->labelsize(14); spnBcnInterval->labelcolor(FL_FOREGROUND_COLOR); spnBcnInterval->value(120); spnBcnInterval->callback((Fl_Callback*)cb_spnBcnInterval); spnBcnInterval->align(Fl_Align(FL_ALIGN_LEFT)); spnBcnInterval->when(FL_WHEN_RELEASE); o->minimum(60); o->maximum(3600); o->step(30); o->value(bcnInterval); } // Fl_Spinner2* spnBcnInterval { Fl_Spinner2* o = spnIDtimer = new Fl_Spinner2(121, 155, 70, 22, "ID timer (min):"); spnIDtimer->tooltip("ID timer\\n0 = disable"); spnIDtimer->box(FL_NO_BOX); spnIDtimer->color(FL_BACKGROUND_COLOR); spnIDtimer->selection_color(FL_BACKGROUND_COLOR); spnIDtimer->labeltype(FL_NORMAL_LABEL); spnIDtimer->labelfont(0); spnIDtimer->labelsize(14); spnIDtimer->labelcolor(FL_FOREGROUND_COLOR); spnIDtimer->minimum(0); spnIDtimer->maximum(10); spnIDtimer->value(10); spnIDtimer->callback((Fl_Callback*)cb_spnIDtimer); spnIDtimer->align(Fl_Align(FL_ALIGN_LEFT)); spnIDtimer->when(FL_WHEN_RELEASE); o->minimum(0); o->maximum(10); o->step(1); o->value(idtimer); } // Fl_Spinner2* spnIDtimer { choiceBlockSize = new Fl_ComboBox(314, 155, 72, 22, "Block Size:"); choiceBlockSize->box(FL_DOWN_BOX); choiceBlockSize->color(FL_BACKGROUND2_COLOR); choiceBlockSize->selection_color(FL_BACKGROUND_COLOR); choiceBlockSize->labeltype(FL_NORMAL_LABEL); choiceBlockSize->labelfont(0); choiceBlockSize->labelsize(14); choiceBlockSize->labelcolor(FL_FOREGROUND_COLOR); choiceBlockSize->callback((Fl_Callback*)cb_choiceBlockSize); choiceBlockSize->align(Fl_Align(FL_ALIGN_LEFT)); choiceBlockSize->when(FL_WHEN_RELEASE); choiceBlockSize->end(); } // Fl_ComboBox* choiceBlockSize { btnOK = new Fl_Button(406, 154, 62, 24, "Ok"); btnOK->callback((Fl_Callback*)cb_btnOK); } // Fl_Button* btnOK { Fl_Check_Button* o = btn_restart_beacon = new Fl_Check_Button(448, 101, 20, 20, "Restart Beacon"); btn_restart_beacon->tooltip("Restart beacon after disconnect"); btn_restart_beacon->down_box(FL_DOWN_BOX); btn_restart_beacon->callback((Fl_Callback*)cb_btn_restart_beacon); btn_restart_beacon->align(Fl_Align(FL_ALIGN_LEFT)); o->value(restart_beacon); } // Fl_Check_Button* btn_restart_beacon o->end(); } // Fl_Double_Window* o return w; } Table *tblOutgoing=(Table *)0; Fl_Button *send_Cancel=(Fl_Button *)0; static void cb_send_Cancel(Fl_Button*, void*) { sendCancel(); } Fl_Return_Button *send_OK=(Fl_Return_Button *)0; static void cb_send_OK(Fl_Return_Button*, void*) { sendOK(); } Fl_Double_Window* arq_SendSelect() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(500, 170, "Select Email"); w = o; if (w) {/* empty */} { tblOutgoing = new Table(0, 3, 500, 140); tblOutgoing->box(FL_DOWN_BOX); tblOutgoing->color(FL_BACKGROUND2_COLOR); tblOutgoing->selection_color((Fl_Color)246); tblOutgoing->labeltype(FL_NORMAL_LABEL); tblOutgoing->labelfont(0); tblOutgoing->labelsize(14); tblOutgoing->labelcolor(FL_FOREGROUND_COLOR); tblOutgoing->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); tblOutgoing->when(FL_WHEN_RELEASE); } // Table* tblOutgoing { send_Cancel = new Fl_Button(335, 145, 70, 20, "Cancel"); send_Cancel->callback((Fl_Callback*)cb_send_Cancel); } // Fl_Button* send_Cancel { send_OK = new Fl_Return_Button(420, 145, 72, 20, "OK"); send_OK->callback((Fl_Callback*)cb_send_OK); } // Fl_Return_Button* send_OK o->set_modal(); o->end(); o->resizable(o); } // Fl_Double_Window* o return w; } Fl_Input2 *inpMailFrom=(Fl_Input2 *)0; Fl_Input2 *inpMailTo=(Fl_Input2 *)0; Fl_Input2 *inpMailSubj=(Fl_Input2 *)0; F_Edit *txtMailText=(F_Edit *)0; Fl_Button *btnOpenComposedMail=(Fl_Button *)0; static void cb_btnOpenComposedMail(Fl_Button*, void*) { cb_OpenComposeMail(); } Fl_Button *btnClearComposer=(Fl_Button *)0; static void cb_btnClearComposer(Fl_Button*, void*) { cb_ClearComposer(); } Fl_Button *btnUseTemplate=(Fl_Button *)0; static void cb_btnUseTemplate(Fl_Button*, void*) { cb_UseTemplate(); } Fl_Button *btnCancelComposedMail=(Fl_Button *)0; static void cb_btnCancelComposedMail(Fl_Button*, void*) { cb_CancelComposeMail(); } Fl_Button *btnSaveComposedMail=(Fl_Button *)0; static void cb_btnSaveComposedMail(Fl_Button*, void*) { cb_SaveComposeMail(); } Fl_Double_Window* arq_composer() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(515, 300, "Flarq Mail Composer"); w = o; if (w) {/* empty */} { inpMailFrom = new Fl_Input2(47, 5, 460, 24, "From"); inpMailFrom->box(FL_DOWN_BOX); inpMailFrom->color(FL_BACKGROUND2_COLOR); inpMailFrom->selection_color(FL_SELECTION_COLOR); inpMailFrom->labeltype(FL_NORMAL_LABEL); inpMailFrom->labelfont(0); inpMailFrom->labelsize(14); inpMailFrom->labelcolor(FL_FOREGROUND_COLOR); inpMailFrom->align(Fl_Align(FL_ALIGN_LEFT)); inpMailFrom->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMailFrom { inpMailTo = new Fl_Input2(48, 32, 460, 24, "To"); inpMailTo->box(FL_DOWN_BOX); inpMailTo->color(FL_BACKGROUND2_COLOR); inpMailTo->selection_color(FL_SELECTION_COLOR); inpMailTo->labeltype(FL_NORMAL_LABEL); inpMailTo->labelfont(0); inpMailTo->labelsize(14); inpMailTo->labelcolor(FL_FOREGROUND_COLOR); inpMailTo->align(Fl_Align(FL_ALIGN_LEFT)); inpMailTo->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMailTo { inpMailSubj = new Fl_Input2(48, 59, 460, 24, "Subj"); inpMailSubj->box(FL_DOWN_BOX); inpMailSubj->color(FL_BACKGROUND2_COLOR); inpMailSubj->selection_color(FL_SELECTION_COLOR); inpMailSubj->labeltype(FL_NORMAL_LABEL); inpMailSubj->labelfont(0); inpMailSubj->labelsize(14); inpMailSubj->labelcolor(FL_FOREGROUND_COLOR); inpMailSubj->align(Fl_Align(FL_ALIGN_LEFT)); inpMailSubj->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMailSubj { txtMailText = new F_Edit(0, 85, 510, 188); txtMailText->box(FL_DOWN_FRAME); txtMailText->color(FL_BACKGROUND2_COLOR); txtMailText->selection_color(FL_SELECTION_COLOR); txtMailText->labeltype(FL_NORMAL_LABEL); txtMailText->labelfont(0); txtMailText->labelsize(14); txtMailText->labelcolor(FL_FOREGROUND_COLOR); txtMailText->textfont(4); txtMailText->align(Fl_Align(FL_ALIGN_TOP)); txtMailText->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(txtMailText); } // F_Edit* txtMailText { Fl_Group* o = new Fl_Group(0, 274, 515, 28); { btnOpenComposedMail = new Fl_Button(4, 278, 70, 20, "Open"); btnOpenComposedMail->tooltip("Open existing Composed email"); btnOpenComposedMail->callback((Fl_Callback*)cb_btnOpenComposedMail); } // Fl_Button* btnOpenComposedMail { new Fl_Box(75, 278, 5, 20); } // Fl_Box* o { btnClearComposer = new Fl_Button(81, 278, 70, 20, "Clear"); btnClearComposer->tooltip("Clear all fields"); btnClearComposer->callback((Fl_Callback*)cb_btnClearComposer); } // Fl_Button* btnClearComposer { new Fl_Box(152, 278, 5, 20); } // Fl_Box* o { btnUseTemplate = new Fl_Button(159, 278, 70, 20, "Template"); btnUseTemplate->tooltip("Use template file"); btnUseTemplate->callback((Fl_Callback*)cb_btnUseTemplate); } // Fl_Button* btnUseTemplate { Fl_Box* o = new Fl_Box(230, 278, 127, 20); Fl_Group::current()->resizable(o); } // Fl_Box* o { btnCancelComposedMail = new Fl_Button(358, 278, 70, 20, "Cancel"); btnCancelComposedMail->tooltip("Close Dialog"); btnCancelComposedMail->callback((Fl_Callback*)cb_btnCancelComposedMail); } // Fl_Button* btnCancelComposedMail { new Fl_Box(429, 278, 5, 20); } // Fl_Box* o { btnSaveComposedMail = new Fl_Button(436, 278, 70, 20, "Save"); btnSaveComposedMail->tooltip("Save this message (shift click Save Template)"); btnSaveComposedMail->callback((Fl_Callback*)cb_btnSaveComposedMail); } // Fl_Button* btnSaveComposedMail o->end(); } // Fl_Group* o o->end(); } // Fl_Double_Window* o return w; } fldigi-4.2.05/src/flarq-src/arq.cxx0000664000175000017500000007734014611711171013766 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "arq.h" //============================================================================= // status messages //============================================================================= std::string TXPOLL = "TX: Send Blocks Report"; std::string STIMEDOUT = "Timed out"; std::string ABORTXFR = "ABORT transfer"; std::string RXIDENT = "RX: Link Still Active"; std::string RXCONREQ = "RX: Connect Request"; std::string RXCONACK = "RX: Connect OK"; std::string RXDISCONN = "RX: Disconnect Request"; std::string RXDISCONACK = "RX: Disconnect OK"; std::string RXSTATUS = "RX: Status Report"; std::string RXPOLL = "RX: Send Blocks Report"; std::string TXSTATUS = "TX: Blocks Received OK"; std::string TXDISCONN = "TX: Disconnect Request"; std::string TXDISACK = "TX: Disconnect OK"; std::string TXBEACON = "TX: Beacon"; std::string TXCONNECT = "TX: Connect"; std::string TXCONNACK = "TX: Connect OK"; std::string TXIDENT = "TX: Watchdog %d"; //bool bPoll = false; std::string arq::upcase(std::string s) { for (size_t i = 0; i < s.length(); i++) s[i] = toupper(s[i]); return s; } arq::arq() { sendfnc = NULL; rcvfnc = NULL; printRX = NULL; abortfnc = NULL; disconnectfnc = NULL; qualityfnc = NULL; printRX_DEBUG = NULL; printTX_DEBUG = NULL; rxUrCall = NULL; Header.erase(); MyStreamID = '0'; UrStreamID = '0'; UrCall.erase(); MyCall.erase(); logfile = "server.log"; // queues // TxTextQueue.clear();//erase(); // Text out to mail engine RxTextQueue.clear();//erase(); // Text in from mail engine TxPlainTextQueue.clear();//erase(); RxFrameQueue.clear();//erase(); lastRxChar = 0; TXflag = false; SessionNumber = 0; exponent = EXPONENT; maxheaders = MAXHEADERS; RetryTime = RETRYTIME; Retries = RETRIES; Timeout = TIMEOUT; TxDelay = TXDELAY; immediate = false; primary = false; setBufferlength(); // status variables // // totalRx = 0; // nbrbadRx = 0; totalTx = 0; nbrbadTx = 0; payloadlength = 32; // Average length of payload received // static status Firstsent = MAXCOUNT - 1; // First Header I sent last turn LastHeader = MAXCOUNT - 1; // Last Header I sent last turn Lastqueued = MAXCOUNT - 1; // Last Header in static send queue EndHeader = MAXCOUNT - 1; // Last I received o.k. GoodHeader = MAXCOUNT - 1; // Last Header received consecutive // Ur status UrGoodHeader = MAXCOUNT - 1; // Other station's Good Header UrLastHeader = MAXCOUNT - 1; // Other station's Header last sent UrEndHeader = MAXCOUNT - 1; // Other station's last received Header blkcount = -1; TXflag = false; // TX on LinkState = DOWN; // ARQ link is initially down Sending = 0; PollOK = false; // bABORT = false; MyMissing.clear(); MissingRxBlocks = ""; TxBlocks.clear(); TxMissing.clear(); TxPending.clear(); RxPending.clear(); arqstop = false; retries = baseRetries = Retries; baseRetryTime = RetryTime; baseTimeout = Timeout; retrytime = RetryTime / ARQLOOPTIME; timeout = Timeout / ARQLOOPTIME; loopcount = 0; set_idtimer(); tx2txdelay = 0;//TxDelay / ARQLOOPTIME; // srand(time(NULL)); } void arq::setBufferlength() { Bufferlength = 1; for (int i = 0; i < exponent; i++) Bufferlength *= 2; MyBlockLengthChar = '0' + exponent; } void arq::resetTx() { Firstsent = MAXCOUNT - 1; // First Header I sent last turn LastHeader = MAXCOUNT - 1; // Last Header I sent last turn Lastqueued = MAXCOUNT - 1; // Last Header in static send queue TxMissing.clear(); TxBlocks.clear(); TxPending.clear(); TxTextQueue.clear(); // UrMissing.clear(); } void arq::resetRx() { RxTextQueue.clear();//erase(); // Text in from mail engine RxFrameQueue.clear();//erase(); lastRxChar = 0; EndHeader = MAXCOUNT - 1; // Last I received o.k. GoodHeader = MAXCOUNT - 1; // Last Header I received conseq. o.k, 1st in send queue RxPending.clear(); MissingRxBlocks = ""; } void arq::reset() { resetTx(); resetRx(); immediate = false; primary = false; blkcount = -1; // bABORT = false; } // new session number // unknown stream id = 0 // known id's from 1 to 63 void arq::newsession() { if (++SessionNumber == 64) SessionNumber = 1; MyStreamID = SessionNumber + '0'; } // get new blocknumber void arq::newblocknumber() { Lastqueued++; Lastqueued %= MAXCOUNT; } // Checksum of header + Header std::string arq::checksum(std::string &s) { framecrc.reset(); return framecrc.scrc16(s); } // Start header when MyStreamID has been assigned void arq::newHeader() { Header.erase(); Header += SOH; Header += '0'; // protocol version; } void arq::IdHeader() { newHeader(); Header += UrStreamID; } void arq::UnkHeader() { newHeader(); Header += '0'; } char crlf[3] = " "; void arq::addToTxQue(std::string s) { // TxTextQueue += "\r\n"; crlf[0] = 0x0D; crlf[1] = 0x0A; TxTextQueue.append(s); TxTextQueue.append(crlf); totalTx++; } // Connect (client:port, server:port) // c Header = Client:port Server:port // e.g.: '00cW1HKJ:1025 KH6TY:24 4' // void arq::connectFrame() { char szGlobals[24]; reset(); UnkHeader(); Header += CONREQ; Payload.erase(); Payload.append(MyCall); Payload.append(":1025"); Payload += ' '; Payload.append(UrCall); Payload.append(":24"); Payload += ' '; Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; snprintf(szGlobals, 23, " T%dR%dW%d", Timeout/1000, Retries, RetryTime/1000); Payload.append(szGlobals); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); LinkState = ARQ_CONNECTING; printSTATUS(TXCONNECT, 5.0); set_idtimer(); } // Connect acknowledge (server:port, client:port) // k Header = Server:port Client:port // e.g: '00kKH6TY:24 W1HKJ:1024 8 6' // void arq::ackFrame () { reset(); IdHeader(); Header += CONACK; Payload.erase(); Payload.append(MyCall); Payload.append(":24"); Payload += ' '; Payload.append(UrCall); Payload += ' '; Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXCONNACK, 5.0); set_idtimer(); } // Connect (caller:port, static:port) // c Header = Caller:port static:port // e.g.: '00cW1HKJ:87 KH6TY:87 4' // void arq::ttyconnectFrame() { UnkHeader(); Header += CONREQ; Payload.erase(); Payload.append(MyCall); Payload.append(":87"); Payload += ' '; Payload.append(UrCall); Payload.append(":87"); Payload += ' '; Payload += MyStreamID; Payload += ' '; Payload += MyBlockLengthChar; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } // Connect acknowledge (server:port, client:port) // k Header = Server:port Client:port // e.g: '00kKH6TY:87 W1HKJ 4' // Service id # 87 is keyboard-to-keyboard // void arq::ttyackFrame() { IdHeader(); Header += CONACK; Payload.erase(); Payload.append(MyCall); Payload.append(":87"); Payload += ' '; Payload.append(UrCall); Payload += ' '; Payload += MyBlockLengthChar; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } // Identify //i frame = '00iKH6TY de W1HKJ' void arq::identFrame() { IdHeader(); Header += IDENT; Payload.erase(); Payload.append(UrCall); Payload.append(" de "); Payload.append(MyCall); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); char szIDENT[80]; snprintf(szIDENT,sizeof(szIDENT), TXIDENT.c_str(), retries); printSTATUS(szIDENT, 5.0); set_idtimer(); } // e.g. Ping frame // u Header = From:port // e.g: '00uKH6TY:7 ' void arq::pingFrame() { IdHeader(); Header += _UNPROTO; Payload.erase(); Payload.append(MyCall); Payload.append(":7"); Payload += ' '; Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } // talk frame // similar to UNPROTO frame // but only sent if ARQ_CONNECTED void arq::talkFrame(std::string txt) { IdHeader(); Header += _TALK; Payload.erase(); Payload.append(MyCall); Payload.append(":73"); Payload += ' '; if (txt.length() > (size_t)Bufferlength) Payload.append(txt.substr(0, Bufferlength)); else Payload.append(txt); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } void arq::ackAbortFrame() { IdHeader(); Header += _ACKABORT; Payload.erase(); Payload += (LastHeader + 0x20); Payload += (GoodHeader + 0x20); Payload += (EndHeader + 0x20); Payload.append(MissingRxBlocks); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXSTATUS, 5.0); } // Status report (End, Good, Lastrx, Missing) //p frame = //e.g.: '00sXHCAB' // void arq::statFrame() { if (idtimer && _idtimer <= 0) talkFrame("auto ID"); IdHeader(); Header += STATUS; Payload.erase(); Payload += (LastHeader + 0x20); Payload += (GoodHeader + 0x20); Payload += (EndHeader + 0x20); Payload.append(MissingRxBlocks); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXSTATUS, 5.0); } // Disconnect session //d frame = "" //e.g.: '00d' void arq::disconnectFrame() { IdHeader(); Header += DISREQ; Payload.erase(); Payload.append(MyCall); Payload.append(":90"); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXDISCONN, 5.0); set_idtimer(); } void arq::disackFrame() { IdHeader(); Header += _DISACK; Payload.erase(); Payload.append(MyCall); Payload.append(":91"); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXDISACK, 5.0); set_idtimer(); } // ABORT session //a frame = "" //e.g.: '00a' void arq::abortFrame() { IdHeader(); Header += _ABORT; Payload.erase(); Payload.append(MyCall); Payload.append(":92"); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); set_idtimer(); } // Beacon frame // u Header = From:port data // e.g: '00uKH6TY:72 Beacon text ' // void arq::beaconFrame(std::string txt) { UnkHeader(); Header += _UNPROTO; Payload.erase(); Payload.append(MyCall); Payload.append(":72"); Payload += ' '; if (txt.length() > (size_t)Bufferlength) Payload.append(txt.substr(0, Bufferlength)); else Payload.append(txt); Frame = Header + Payload; Frame = Frame + checksum(Frame); Frame += EOT; addToTxQue(Frame); printSTATUS(TXBEACON, 5.0); set_idtimer(); } // poll //p frame = //e.g.: '00pXHCAB' void arq::pollFrame() { IdHeader(); Frame = Header; Frame += POLL; Frame.append(MyCall); Frame += SUB; Frame += (LastHeader + 0x20); Frame += (GoodHeader + 0x20); Frame += (EndHeader + 0x20); Frame.append(MissingRxBlocks); Frame.append(checksum(Frame)); Frame += EOT; addToTxQue(Frame); printSTATUS(TXPOLL, 5.0); set_idtimer(); } // Text frame void arq::textFrame(cTxtBlk block) { IdHeader(); Frame = Header; Frame += (block.nbr() + 0x20); Frame.append(block.text()); Frame.append(checksum(Frame)); Frame += SOH; addToTxQue(Frame); } //===================================================================== void arq::parseIDENT() { timeout = Timeout / ARQLOOPTIME; statFrame(); immediate = true; printSTATUS(RXIDENT, 5.0); } void arq::parseCONREQ() { size_t p1 = 0, p2 = rcvPayload.find(':'); if (p2 == std::string::npos) return; // if (LinkState == ARQ_CONNECTED || LinkState == WAITFORACK) return; // disallow multiple connects // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); p1 = rcvPayload.find(' ', p2+1); if (p1 == std::string::npos) { UrCall.erase(); return; } p1++; p2 = rcvPayload.find(":", p1); std::string testcall = upcase(rcvPayload.substr(p1, p2 - p1)); if (testcall != MyCall) { UrCall.erase(); return; } p1 = rcvPayload.find(' ', p2 +1); if (p1 == std::string::npos) { UrCall.erase(); return; } p1++; // *p1 ==> StreamID for requesting station UrStreamID = rcvPayload[p1]; p1++; // *p1 ==> requested block size UrBlockLengthChar = rcvPayload[p1]; p1 += 3; // *p1 ==>" TnnnRnnnWnnn" if (p1 < rcvPayload.length()) { char num[7]; if (rcvPayload[p1] == 'T') { int n = 0; while (rcvPayload[++p1] != 'R' && n < 6) num[n++] = rcvPayload[p1]; num[n] = 0; sscanf(num, "%d", &Timeout); Timeout *= 1000; if (p1 < rcvPayload.length() && rcvPayload[p1] == 'R') { int n = 0; while (rcvPayload[++p1] != 'W' && n < 6) num[n++] = rcvPayload[p1]; num[n] = 0; sscanf(num, "%d", &Retries); if (p1 < rcvPayload.length() && rcvPayload[p1] == 'W') { int n = 0; while (++p1 < rcvPayload.length() && n < 6) num[n++] = rcvPayload[p1]; num[n] = 0; sscanf(num, "%d", &RetryTime); RetryTime *= 1000; Timeout += Retries * RetryTime; } } /* char line[80]; std::string NewValues = "Temporary control parameters set to\n"; snprintf(line, 79, " Retries = %d\n", Retries); NewValues.append(line); snprintf(line, 79, " Wait time = %d secs\n", RetryTime / 1000); NewValues.append(line); snprintf(line, 79, " Timeout = %d secs\n", Timeout / 1000); NewValues.append(line); printRX(NewValues); */ } } reset(); LinkState = WAITFORACK; newsession(); if (rxUrCall) rxUrCall(UrCall); TxTextQueue.clear(); ackFrame(); immediate = true; printSTATUS(RXCONREQ, 5.0); } void arq::parseCONACK() { if (LinkState < ARQ_CONNECTING ) { //!= ARQ_CONNECTING) { return; // Connect Acknowledge only valid during a connect } size_t p1 = 0, p2 = rcvPayload.find(':'); // LinkState = DOWN; if (p2 == std::string::npos) return; // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); p1 = rcvPayload.find(' ', p2+1); if (p1 == std::string::npos) { UrCall.erase(); return; } p1++; p2 = rcvPayload.find(" ", p1); std::string testcall = upcase(rcvPayload.substr(p1, p2 - p1)); if (testcall != MyCall) { UrCall.erase(); return; } p1++; // *p1 ==> StreamID for requesting station UrStreamID = rcvPayload[p1]; p1++; // *p1 ==> requested block size UrBlockLengthChar = rcvPayload[p1]; RxTextQueue.clear();//erase(); LinkState = ARQ_CONNECTED; timeout = Timeout / ARQLOOPTIME; statFrame(); immediate = true; primary = true; printSTATUS(RXCONACK, 5.0); } void arq::parseDISREQ() { if (LinkState == DOWN) return; TxTextQueue.clear();//erase(); TxMissing.clear(); TxBlocks.clear(); TxPlainTextQueue.clear(); disackFrame(); immediate = true; LinkState = DOWN; if (rxUrCall) rxUrCall(""); if (disconnectfnc) disconnectfnc(); printSTATUS(RXDISCONN, 5.0); } void arq::parseDISACK() { if (rxUrCall) rxUrCall(""); LinkState = DOWN; printSTATUS(RXDISCONACK, 5.0); } void arq::parseABORT() { reset(); if (abortfnc) abortfnc(); ackAbortFrame(); immediate = true; LinkState = ARQ_CONNECTED; } void arq::parseACKABORT() { reset(); if (abortfnc) abortfnc(); LinkState = ARQ_CONNECTED; } void arq::parseUNPROTO() { size_t p1 = 0, p2 = rcvPayload.find(':'); if (p2 == std::string::npos) return; // requesting stations callsign UrCall = upcase(rcvPayload.substr(p1, p2 - p1)); if (rxUrCall) rxUrCall(UrCall); if (printRX) printRX(rcvPayload + "\n"); } void arq::parseTALK() { size_t p1 = rcvPayload.find(":73"); if (p1 == std::string::npos) return; std::string talktext = rcvPayload.substr(p1 + 4); if (printTALK) printTALK(talktext); } void arq::parseSTATUS() { // create the missing list // all reported missing blocks if (LinkState >= ARQ_CONNECTED) { UrLastHeader = rcvPayload[0] - 0x20; // Other station's Header last sent UrGoodHeader = rcvPayload[1] - 0x20; // Other station's Good Header UrEndHeader = rcvPayload[2] - 0x20; // Other station's last received Header size_t nummissing = rcvPayload.length() - 3; std::vector missing; // append those reported missing if (nummissing > 0) for (size_t i = 0; i < nummissing; i++) missing.push_back(rcvPayload[i+3] - 0x20); // append those not reported missing from UrEndHeader to LastHeader if (UrEndHeader != LastHeader) { int m = UrEndHeader + 1; if (m > MAXCOUNT) m -= MAXCOUNT; while (m != LastHeader) { missing.push_back(m); m++; if (m > MAXCOUNT) m -= MAXCOUNT; } missing.push_back(LastHeader); } if (missing.empty()) TxMissing.clear(); if (TxMissing.empty() == false) { std::list keep; std::list::iterator p = TxMissing.begin(); while (p != TxMissing.end()) { for (size_t n = 0; n < missing.size(); n++) { if (p->nbr() == missing[n]) { keep.push_back(*p); break; } } p++; } TxMissing = keep; } } // print any txpending blocks up to and including UrGoodHeader std::list::iterator p1 = TxPending.begin(); p1 = TxPending.begin(); while (p1 != TxPending.end()) { if(p1->nbr() == UrGoodHeader) { if (printTX) printTX(p1->text()); TxPending.erase(p1); break; } else if (printTX) printTX(p1->text()); TxPending.erase(p1); p1 = TxPending.begin(); } switch (LinkState) { case WAITFORACK : LinkState = ARQ_CONNECTED; break; case DISCONNECTING : if (rxUrCall) rxUrCall(""); LinkState = DOWN; break; case WAITING : LinkState = ARQ_CONNECTED; break; // case ABORTING : // reset(); // if (abortfnc) abortfnc(); // LinkState = ARQ_CONNECTED; // break; // case ABORT : // break; default: break; } printSTATUS(RXSTATUS, 5.0); } void arq::parsePOLL() { if (LinkState == DISCONNECTING || LinkState == DOWN || LinkState == TIMEDOUT || LinkState == ABORT ) return; statFrame(); immediate = true; LinkState = ARQ_CONNECTED; printSTATUS(RXPOLL, 5.0); } void arq::parseDATA() { std::vector::iterator p1, p2; int n1, n2; if (LinkState < ARQ_CONNECTED) return; // do not respond if DOWN or TIMEDOUT for (p1 = RxPending.begin(); p1 < RxPending.end(); p1++) if (blknbr == p1->nbr()) { return; } char szStatus[80]; snprintf(szStatus, sizeof(szStatus),"RX: data block %d", blknbr); printSTATUS(szStatus, 5.0); cTxtBlk tempblk(blknbr, rcvPayload); RxPending.push_back (tempblk); for (p1 = RxPending.begin(); p1 < RxPending.end() - 1; p1++) { n1 = p1->nbr(); if (n1 < GoodHeader) n1 += MAXCOUNT; for (p2 = p1 + 1; p2 < RxPending.end(); p2++) { n2 = p2->nbr(); if (n2 < GoodHeader) n2 += MAXCOUNT; if (n2 < n1) { tempblk = *p1; *p1 = *p2; *p2 = tempblk; } } } // compute new EndHeader EndHeader = GoodHeader; if (!RxPending.empty()) { p1 = RxPending.end() - 1; EndHeader = p1->nbr(); } // add RxPending blocks that are consecutive to GoodHeader p1 = RxPending.begin(); while (!RxPending.empty()) { if ((p1->nbr() != (GoodHeader +1) % MAXCOUNT)) break; RxTextQueue.append(p1->text()); GoodHeader = p1->nbr(); if (printRX) printRX(p1->text()); RxPending.erase(p1); p1 = RxPending.begin(); } MissingRxBlocks = ""; if (RxPending.empty()) return; int start = (GoodHeader + 1)%MAXCOUNT; int end = (EndHeader + 1)%MAXCOUNT; int test; bool ok; if (end < start) end += MAXCOUNT; for (int i = start; i < end; i++) { test = (i % MAXCOUNT); ok = false; for (p1 = RxPending.begin(); p1 < RxPending.end(); p1++) { if (test == p1->nbr()) { ok = true; break; } } if (!ok) MissingRxBlocks += test + 0x20; } } bool arq::isUrcall() { if (UrCall.empty()) return false; if (rcvPayload.find(UrCall) != std::string::npos) return true; return false; } // expects to receive a full frame // txt[0] == SOH // txt[len - 3] ... txt[len] == CRC // returns // -1 invalid frame // -n failed CRC for text type n // n valid frame // rcvPayload will contain the valid payload // int arq::parseFrame(std::string txt) { if ( txt.length() < 8 ) { return -1; // not a valid frame } Ccrc16 testcrc; size_t len = txt.length(); rcvPayload = txt.substr(4, len - 8); fID = txt[3]; // treat unproto TALK as a special case // no effort made to confirm the data by the CRC value if (fID == _TALK) { if (LinkState >= ARQ_CONNECTED) { timeout = Timeout / ARQLOOPTIME; parseTALK(); retries = Retries; } return -1; } std::string sRcvdCRC = testcrc.scrc16( txt.substr(0, len - 4)); if (sRcvdCRC != txt.substr(len - 4) ) { if (printRX_DEBUG) printRX_DEBUG("CRC failed\n"); return -1; // failed CRC test } retries = Retries; switch (fID) { case IDENT : if (!isUrcall()) break; blknbr = fID - 0x20; parseIDENT(); if (printRX_DEBUG) { printRX_DEBUG("IDENT:"); } break; case CONREQ : if (LinkState > TIMEDOUT) break; // disallow multiple connects blknbr = fID - 0x20; parseCONREQ(); if (printRX_DEBUG) { printRX_DEBUG("CONREQ:"); } break; case CONACK : if (!isUrcall()) break; blknbr = fID - 0x20; parseCONACK(); if (printRX_DEBUG) { printRX_DEBUG("CONACK:"); } break; case DISREQ : if (!isUrcall()) break; blknbr = fID - 0x20; parseDISREQ(); if (printRX_DEBUG) { printRX_DEBUG("DISREQ:"); } break; case _DISACK : if (!isUrcall()) break; blknbr = fID - 0x20; parseDISACK(); if (printRX_DEBUG) { printRX_DEBUG("DISACK: "); } break; case STATUS : if (LinkState == DOWN || LinkState == TIMEOUT) break; blknbr = fID - 0x20; parseSTATUS(); if (printRX_DEBUG) { printRX_DEBUG("STATUS:"); } break; case POLL : if (!isUrcall()) { break; } blknbr = fID - 0x20; parsePOLL(); if (printRX_DEBUG) { printRX_DEBUG("POLL:"); } break; case _ABORT : if (!isUrcall()) break; blknbr = fID - 0x20; parseABORT(); if (printRX_DEBUG) { printRX_DEBUG("RCVD ABORT:"); } break; case _ACKABORT : blknbr = fID - 0x20; parseACKABORT(); if (printRX_DEBUG) { printRX_DEBUG("RCVD ACK_ABORT:"); } break; case _UNPROTO : if (LinkState >TIMEDOUT && !isUrcall()) break; // disallow interruption blknbr = fID - 0x20; parseUNPROTO(); if (printRX_DEBUG) { printRX_DEBUG("UNPROTO:"); } break; default : blknbr = fID - 0x20; parseDATA(); if (printRX_DEBUG) { printRX_DEBUG("DATA:"); } } if (printRX_DEBUG) { printRX_DEBUG(txt); printRX_DEBUG("\n"); } if (LinkState == ARQ_CONNECTED) timeout = Timeout / ARQLOOPTIME; return fID; } void arq::rcvChar( char c ) { if ( c == 0x06 ) { Sending = 0; retrytime = rtry(); timeout = Timeout / ARQLOOPTIME; tx2txdelay = TxDelay / ARQLOOPTIME; return; } if (lastRxChar == SOH && c == SOH) // consecutive characters return; if (lastRxChar == EOT && c == EOT) // consecutive characters return; if (RxFrameQueue.empty()) { if (c == SOH) RxFrameQueue += c; } else { if (c == SOH || c == EOT) { parseFrame(RxFrameQueue); RxFrameQueue.clear();//erase(); if (c == SOH) RxFrameQueue += c; } else RxFrameQueue += c; } lastRxChar = c; } //===================================================================== void arq::sendText (std::string txt) { size_t offset = 0; cTxtBlk tempblk; if (LinkState < ARQ_CONNECTED) return; Blocks2Send = 0; while (offset < txt.length()) { newblocknumber(); tempblk.nbr(Lastqueued); tempblk.text(txt.substr(offset, Bufferlength)); offset += Bufferlength; TxBlocks.push_back(tempblk); Blocks2Send++; } } void arq::sendblocks() { char szStatus[80]; int missedblks = 0, newblks = 0; int framecount = 0; cTxtBlk tempblk; if (TxMissing.empty() == false) { std::list::iterator p = TxMissing.begin(); while (p != TxMissing.end()) { textFrame(*p); p++; framecount++; } } missedblks = framecount; if (!TxBlocks.empty()) { while (TxBlocks.empty() == false && framecount < maxheaders) { tempblk = TxBlocks.front(); if ((tempblk.nbr() + 2)%MAXCOUNT == UrGoodHeader) break; TxBlocks.pop_front(); TxMissing.push_back(tempblk); TxPending.push_back(tempblk); textFrame(tempblk); LastHeader = tempblk.nbr(); framecount++; } } newblks = framecount - missedblks; snprintf(szStatus, sizeof(szStatus),"TX: repeat %d new %d", missedblks, newblks); printSTATUS(szStatus, 0.0); if (!TxMissing.empty() || !TxBlocks.empty()) pollFrame(); if (LinkState != ABORT && LinkState != ABORTING) LinkState = WAITING; } void arq::connect(std::string callsign) { UrCall = callsign; for (size_t i = 0; i < UrCall.length(); i++) UrCall[i] = toupper(UrCall[i]); if (rxUrCall) rxUrCall(UrCall); TxTextQueue.clear(); connectFrame(); LinkState = ARQ_CONNECTING; immediate = true; } void arq::disconnect() { Retries = baseRetries; Timeout = baseTimeout; RetryTime = baseRetryTime; totalTx = 0; nbrbadTx = 0; LinkState = DISCONNECT; } void arq::abort() { // bABORT = true; LinkState = ABORT; } void arq::sendBeacon (std::string txt) { std::string deText = "<<< FLARQ Beacon >>> de "; deText.append(MyCall); TxTextQueue.clear();//erase(); addToTxQue(deText); beaconFrame(txt); immediate = true; LinkState = DOWN; } void arq::sendPlainText( std::string txt ) { size_t p = 0; while (p < txt.length()) { talkFrame(txt.substr(p, Bufferlength)); p += Bufferlength; } } void arq::transmitdata() { if (TxTextQueue.empty() == false) { sendfnc(TxTextQueue); Sending = 0x80; if (printTX_DEBUG) printTX_DEBUG(TxTextQueue); TxTextQueue.clear(); tx2txdelay = TxDelay / ARQLOOPTIME; return; } if (TxPlainTextQueue.empty() == false) { sendfnc(TxPlainTextQueue); Sending = 0x80; if (printTX_DEBUG) printTX_DEBUG(TxPlainTextQueue); TxPlainTextQueue.clear(); tx2txdelay = TxDelay / ARQLOOPTIME; } } int arq::rtry() { return RetryTime / ARQLOOPTIME; // return (RetryTime + rand() * 5000 / RAND_MAX) / ARQLOOPTIME; } //--------------------------------------------------------------------- void arqloop(void *who) { arq *me = (arq *)who; char c; if (idtimer) me->_idtimer--; // check for received chars including 0x06 for Sending = 0 if (me->getc1(c) == true) { me->rcvChar(c); while (me->getc1(c) == true) me->rcvChar(c); if (me->tx2txdelay < me->TxDelay / ARQLOOPTIME) me->tx2txdelay = me->TxDelay / ARQLOOPTIME; } if (me->Sending == 0) { // not transmitting // wait period between transmits if (me->tx2txdelay > 0) { me->tx2txdelay--; } else { if (me->immediate == true) { me->transmitdata(); me->retrytime = me->rtry(); me->retries = me->Retries; me->immediate = false; } else { switch (me->LinkState) { case ARQ_CONNECTING : break; case DISCONNECT : me->LinkState = DISCONNECTING; me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->disconnectFrame(); me->immediate = true; break; case DISCONNECTING : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); if (--me->retries) { me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->disconnectFrame(); me->transmitdata(); me->timeout = me->Timeout / ARQLOOPTIME; } } break; case ABORT : me->LinkState = ABORTING; me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->tx2txdelay = 5000/ ARQLOOPTIME; // 5 sec delay for abort me->abortFrame(); me->immediate = true; break; case ABORTING : if (--me->retrytime == 0) { me->retrytime = me->rtry(); if (me->retries--) { me->TxTextQueue.clear(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxPlainTextQueue.clear(); me->abortFrame(); me->transmitdata(); me->timeout = me->Timeout / ARQLOOPTIME; } } break; case WAITING : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); if (--me->retries) { me->TxTextQueue.clear(); me->pollFrame(); me->transmitdata(); me->nbrbadTx++; me->timeout = me->Timeout / ARQLOOPTIME; } } break; case WAITFORACK : if (me->retrytime-- == 0) { me->retrytime = me->rtry(); if (--me->retries) { me->TxTextQueue.clear(); me->ackFrame(); me->transmitdata(); me->nbrbadTx++; me->timeout = me->Timeout / ARQLOOPTIME; } } break; case ARQ_CONNECTED : default: if (me->TxTextQueue.empty() == false) { me->transmitdata(); } else if ( (me->TxMissing.empty() == false) || (me->TxBlocks.empty() == false)) { me->nbrbadTx += me->TxMissing.size(); me->sendblocks(); me->transmitdata(); } else if ( me->TxPlainTextQueue.empty() == false ) { me->transmitdata(); } break; } me->timeout--; if (me->timeout == 0 // 10000 / ARQLOOPTIME // 10 seconds remaining && me->LinkState == ARQ_CONNECTED // link is connected && me->primary == true ) { // this is the connecting station if (--me->retries) { // repeat Retries and then allow timeout me->TxTextQueue.clear(); me->identFrame(); // send an identity frame to try to keep me->transmitdata(); // the link up me->timeout = me->rtry(); //10000 / ARQLOOPTIME + 1; } } if (me->timeout == 0) { if (me->LinkState == ARQ_CONNECTED) me->LinkState = TIMEDOUT; else me->LinkState = DOWN; me->Retries = me->baseRetries; me->Timeout = me->baseTimeout; me->RetryTime = me->baseRetryTime; me->retries = me->Retries; me->retrytime = me->rtry(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxTextQueue.clear(); me->TxPlainTextQueue.clear(); me->timeout = me->Timeout / ARQLOOPTIME; if (me->rxUrCall) me->rxUrCall(""); } if (me->retries == 0) { me->LinkState = DOWN; me->Retries = me->baseRetries; me->Timeout = me->baseTimeout; me->RetryTime = me->baseRetryTime; me->retries = me->Retries; me->retrytime = me->rtry(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxTextQueue.clear(); me->TxPlainTextQueue.clear(); me->timeout = me->Timeout / ARQLOOPTIME; if (me->rxUrCall) me->rxUrCall(""); me->printSTATUS(STIMEDOUT, 10.0); } } } } if (me->arqstop) { me->LinkState = STOPPED; me->arqstop = false; me->LinkState = DOWN; me->Retries = me->baseRetries; me->Timeout = me->baseTimeout; me->RetryTime = me->baseRetryTime; me->retries = me->Retries; me->retrytime = me->rtry(); me->TxMissing.clear(); me->TxBlocks.clear(); me->TxTextQueue.clear(); me->TxPlainTextQueue.clear(); me->timeout = me->Timeout / ARQLOOPTIME; if (me->rxUrCall) me->rxUrCall(""); me->printSTATUS(STIMEDOUT, 10.0); Fl::repeat_timeout( 1.0, arqloop, me); return; } Fl::repeat_timeout( ARQLOOPTIME/1000.0, arqloop, me); } void arq::start_arq() { Fl::add_timeout(1.0, arqloop, this); } void arq::restart_arq() { arqstop = true; } //--------------------------------------------------------------------- fldigi-4.2.05/src/flarq-src/flarq.cxx0000664000175000017500000013573614611711171014314 00000000000000// ---------------------------------------------------------------------------- // flarq.cxx - Fast Light ARQ Application // // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include "fileselect.h" #include "socket.h" #include "debug.h" #include "threads.h" #include "flarq.h" #include "flarqenv.h" #include "flmisc.h" #include "stacktrace.h" #include "icons.h" #include "arq.h" #include "arqdialogs.h" #include "b64.h" #include "gettext.h" #include "xml_server.h" #include "FTextView.h" debug::level_e debug::level = debug::INFO_LEVEL; unsigned int debug::mask; void debug::log(debug::level_e, const char*, const char*, int line, const char* ...) {} #define FLDIGI_port "7322" #define MPSK_port "3122" #define FLARQ_XML_PORT 7422 #define MPSK_TX "TX" #define MPSK_RX "RX" #define MPSK_TX2RX "RX_AFTER_TX" #define MPSK_BYTE 25 #define MPSK_CMD 26 #define MPSK_END 27 #define MPSK_ISTX 28 #define MPSK_ISRX 29 #define MPSK_ISCMD 30 #define MPSK_CMDEND 31 // directory structures for all NBEMS applications static void checkdirectories(void); std::string HomeDir; std::string NBEMS_dir; std::string ARQ_dir; std::string ARQ_files_dir; std::string ARQ_recv_dir; std::string ARQ_send_dir; std::string ARQ_mail_dir; std::string ARQ_mail_in_dir; std::string ARQ_mail_out_dir; std::string ARQ_mail_sent_dir; std::string WRAP_dir; std::string WRAP_recv_dir; std::string WRAP_send_dir; std::string WRAP_auto_dir; std::string ICS_dir; std::string ICS_msg_dir; std::string ICS_tmp_dir; std::string MailFileName = ""; std::string MailSaveFileName = ""; std::string Logfile; struct dirent *entry; DIR *dp; bool SendingEmail = false; bool SHOWDEBUG = false; extern void STATUSprint(std::string s); Fl_Text_Buffer_mod *txtbuffARQ; Fl_Text_Buffer_mod *txtbuffRX; Fl_Text_Buffer_mod *txtbuffComposer; Fl_Double_Window *arqwin = 0; Fl_Double_Window *dlgconfig = 0; Fl_Double_Window *outdialog = 0; Fl_Double_Window *composer = 0; arq *digi_arq; bool traffic = false; bool sendingfile = false; int arqstate = 0; bool configured = false; bool ioMPSK = false; std::string arq_address = "127.0.0.1"; std::string arq_port = FLDIGI_port; std::string RX; std::string TX; std::string teststring; std::string statusmsg; std::string MyCall; std::string beacontext; #if !defined(__APPLE__) && !defined(__WOE32__) && USE_X Pixmap flarq_icon_pixmap; #endif Socket *tcpip = 0; std::string txbuffer; std::string cmdbuffer; std::string rxbuffer; size_t bufsize = 0; size_t bufptr = 0; bool isRxChar = false; bool isCmdChar = false; bool isTxChar = false; bool inLoop = false; int exponent = 5; int txdelay = 500; int iretries = 5; long iwaittime = 10000; long itimeout = 60000; int idtimer = 10; int bcnInterval = 30; enum {OFF, ON, WAIT}; int autobeacon = OFF; bool beaconrcvd = false; bool restart_beacon = false; int blocksSent = 0; int mainX = 0, mainY = 0, mainW = 600, mainH = 500; float vers = 0; float version; const char *ASCII[32] = { "", "", "", "", // 0x00 - 0x03 "", "", "", "", // 0x04 - 0x07 "", "", "", "", // 0x08 - 0x0B "", "", "", "", // 0x0C - 0x0F "", "", "", "", // 0x10 - 0x13 "", "", "", "", // 0x14 - 0x17 "", "", "", "", // 0x18 - 0x1B "", "", "", "" // 0x1C - 0x1F }; std::string AsciiChars; std::string incomingText = ""; std::string txtarqload = ""; std::string rxfname = ""; std::string arqstart = "ARQ::STX\n"; std::string arqend = "ARQ::ETX\n"; std::string arqfile = "ARQ:FILE::"; std::string arqemail = "ARQ:EMAIL::\n"; std::string arqascii = "ARQ:ENCODING::ASCII\n"; std::string arqbase64 = "ARQ:ENCODING::BASE64\n"; std::string arqsizespec = "ARQ:SIZE::"; size_t startpos = std::string::npos; size_t endpos = std::string::npos; size_t fnamepos = std::string::npos; size_t indx = std::string::npos; size_t sizepos = std::string::npos; size_t lfpos = std::string::npos; size_t arqPayloadSize = 0; bool haveemail = false; bool rxARQfile = false; bool rxARQhavesize = false; bool rxTextReady = false; time_t StartTime_t; time_t EndTime_t; time_t TransferTime_t; double TransferTime; //============================================================================= // email selector //============================================================================= int datedir = 1; int todir = 1; int subdir = 1; std::string sendfilename = ""; void cb_SortByDate() { if (datedir == 0) { tblOutgoing->sort(1, false); datedir = 1; } else { tblOutgoing->sort(1, true); datedir = 0; } tblOutgoing->redraw(); } void cb_SortByTo() { if (todir == 0) { tblOutgoing->sort(2, false); todir = 1; } else { tblOutgoing->sort(2, true); todir = 0; } tblOutgoing->redraw(); } void cb_SortBySubj() { if (subdir == 0) { tblOutgoing->sort(3, false); subdir = 1; } else { tblOutgoing->sort(3, true); subdir = 0; } tblOutgoing->redraw(); } void sendOK() { outdialog->hide(); int sel = tblOutgoing->value(); if (sel >= 0) sendfilename = tblOutgoing->valueAt(sel,0); else sendfilename.clear(); } void sendCancel() { outdialog->hide(); sendfilename.clear(); } void selectTrafficOut(bool ComposerOnly) { if (outdialog == 0) { outdialog = arq_SendSelect(); outdialog->xclass(PACKAGE_TARNAME); tblOutgoing->addHiddenColumn ("fnbr"); // column #0 tblOutgoing->addColumn ("Date", 180); // column #1 tblOutgoing->addColumn ("To", 120); // column #2 tblOutgoing->addColumn ("Subj", 196); // column #3 tblOutgoing->colcallback (1, cb_SortByDate); tblOutgoing->columnAlign(1, FL_ALIGN_LEFT); tblOutgoing->colcallback (2, cb_SortByTo); tblOutgoing->columnAlign(2, FL_ALIGN_LEFT); tblOutgoing->colcallback (3, cb_SortBySubj); tblOutgoing->columnAlign(3, FL_ALIGN_LEFT); tblOutgoing->allowSort(true); tblOutgoing->rowSize (14); tblOutgoing->headerSize (14); tblOutgoing->allowResize (true); tblOutgoing->gridEnabled (true); } tblOutgoing->clear(); std::string fline, fname, fdate, fto, fsubj; char szline[10000]; size_t p; std::string folder = ARQ_mail_out_dir; dp = 0; dp = opendir(folder.c_str()); if (dp == 0) { std::string nfound = folder; nfound += " not found"; fl_message("%s", nfound.c_str()); return; } int nummails = 0; while ((entry = readdir(dp)) != 0) { if (entry->d_name[0] == '.') continue; fname = folder; fname.append(entry->d_name); if (fname.find(".eml") == std::string::npos) continue; int validlines = 0; std::ifstream emailtxt(fname.c_str()); while (!emailtxt.eof()) { memset(szline, 0, 10000); emailtxt.getline(szline,10000); fline = szline; if ((p = fline.find("Date: ")) != std::string::npos) { fdate = fline.substr(p + 6); validlines++; continue; } if ((p = fline.find("To: ")) != std::string::npos) { fto = fline.substr(p + 4); p = fto.find('@'); if (p != std::string::npos) fto.replace(p,1,"@@"); p = fto.find("<"); if (p != std::string::npos) fto.erase(p,1); p = fto.find(">"); if (p != std::string::npos) fto.erase(p,1); validlines++; continue; } if ((p = fline.find("Subject: ")) != std::string::npos) { fsubj = fline.substr(p + 9); validlines++; continue; } if ((p = fline.find("//FLARQ COMPOSER")) != std::string::npos) validlines++; } emailtxt.close(); if ((!ComposerOnly && validlines >= 3) || (ComposerOnly && validlines == 4)) { tblOutgoing->addRow (4, fname.c_str(), fdate.c_str(), fto.c_str(), fsubj.c_str()); nummails++; } } if (nummails) { tblOutgoing->FirstRow(); outdialog->show(); while (outdialog->shown()) Fl::wait(); } else fl_message2("No emails for delivery"); } //====================================================================================== // simple email composer //====================================================================================== extern bool fileExists(std::string fname); void cb_CancelComposeMail() { composer->hide(); } void readComposedFile(std::string filename) { std::ifstream textfile; textfile.open(filename.c_str()); if (textfile) { char szline[10000]; std::string fline, tempstr; size_t p; txtMailText->clear(); inpMailFrom->value(""); inpMailTo->value(""); inpMailSubj->value(""); while (!textfile.eof()) { memset(szline,0, 10000); textfile.getline(szline,10000); fline = szline; if ((p = fline.find("//FLARQ COMPOSER")) != std::string::npos) continue; if ((p = fline.find("Date: ")) != std::string::npos) continue; if ((p = fline.find("Content-Type:")) != std::string::npos) continue; if ((p = fline.find("From: ")) != std::string::npos) { tempstr = fline.substr(p + 6); inpMailFrom->value(tempstr.c_str()); continue; } if ((p = fline.find("To: ")) != std::string::npos) { tempstr = fline.substr(p + 4); p = tempstr.find("<"); if (p != std::string::npos) tempstr.erase(p,1); p = tempstr.find(">"); if (p != std::string::npos) tempstr.erase(p,1); inpMailTo->value(tempstr.c_str()); continue; } if ((p = fline.find("Subject: ")) != std::string::npos) { inpMailSubj->value(fline.substr(p + 9).c_str()); continue; } if (strlen(szline) == 0 && txtbuffComposer->length() == 0) continue; txtMailText->add(szline); txtMailText->add("\n"); } textfile.close(); } } void cb_UseTemplate() { std::string templatename = ARQ_mail_out_dir; const char *p = FSEL::select("Load Template file", "*.tpl", templatename.c_str()); if (!p) return; if (!*p) return; readComposedFile(p); } void cb_ClearComposer() { sendfilename.clear(); txtMailText->clear(); inpMailFrom->value(""); inpMailTo->value(""); inpMailSubj->value(""); } std::string nextEmailFile(std::string fname) { int nbr = 0; char szNbr[20]; std::string name; std::string ext; std::string nuname; size_t p; p = fname.find_last_of('.'); if (p != std::string::npos) { ext = fname.substr(p); name = fname.substr(0,p); } else { ext = ""; name = fname; } do { nbr++; nuname = name; #ifdef __WOE32__ snprintf(szNbr, sizeof(szNbr), "-%-d", nbr); #else snprintf(szNbr, sizeof(szNbr), "%-d", nbr); #endif nuname.append(szNbr); nuname.append(ext); } while (fileExists(nuname)); return nuname; } void saveComposedText(std::string filename) { std::ofstream textfile; textfile.open(filename.c_str()); textfile << "//FLARQ COMPOSER" << std::endl; char szmaildt[100]; time_t maildt = time(NULL); struct tm *gmt = gmtime(&maildt); strftime(szmaildt, sizeof(szmaildt), "%x %X", gmt); textfile << "Date: " << szmaildt << std::endl; textfile << "From: " << inpMailFrom->value() << std::endl; textfile << "To: " << inpMailTo->value() << std::endl; textfile << "Subject: " << inpMailSubj->value() << std::endl; textfile << "Content-Type: text/plain; charset=\"UTF-8\"" << std::endl; textfile << std::endl; textfile << txtbuffComposer->text() << std::endl; textfile.close(); cb_ClearComposer(); } void SaveComposeMail() { if (strlen(inpMailTo->value()) == 0 || strlen(inpMailSubj->value()) == 0) return; if (sendfilename.empty()) { sendfilename = ARQ_mail_out_dir; sendfilename += "flarqmail.eml"; sendfilename = nextEmailFile(sendfilename); } saveComposedText(sendfilename); } void SaveComposeTemplate() { std::string templatename = ARQ_mail_out_dir; const char *p = FSEL::saveas("Save Template file", "*.tpl", templatename.c_str()); if (!p) return; if (!*p) return; saveComposedText(p); } void cb_SaveComposeMail() { if (Fl::event_state(FL_SHIFT)) SaveComposeTemplate(); else SaveComposeMail(); } void cb_OpenComposeMail() { sendfilename.clear(); selectTrafficOut(true); if (sendfilename.empty()) return; readComposedFile(sendfilename); } void ComposeMail() { if (composer == 0) { composer = arq_composer(); composer->xclass(PACKAGE_TARNAME); txtbuffComposer = txtMailText->buffer(); txtMailText->wrap_mode(1,80); } txtbuffComposer->text(""); inpMailFrom->value(""); inpMailTo->value(""); inpMailSubj->value(""); composer->show(); } //====================================================================================== std::string noCR(std::string s) { std::string text = s; size_t p; while ((p = text.find('\r')) != std::string::npos) text.erase(p,1); return text; } void createAsciiChars() { AsciiChars = ""; AsciiChars += 0x09; // tab AsciiChars += 0x0A; // lf AsciiChars += 0x0D; // cr for (int n = 20; n < 256; n++) AsciiChars += n; } void initVals() { MyCall = "NOCALL"; exponent = digi_arq->getExponent(); iretries = digi_arq->getRetries(); itimeout = digi_arq->getTimeout(); txdelay = digi_arq->getTxDelay(); iwaittime = digi_arq->getWaitTime(); bcnInterval = 30; beacontext = ""; cbMenuConfig(); digi_arq->myCall(MyCall.c_str()); } void testDirectory(std::string dir) { std::string tstdir = ARQ_dir; tstdir += '/'; tstdir.append(dir); std::ifstream test(tstdir.c_str()); if (!test) mkdir(tstdir.c_str(), 0777); else test.close(); } void readConfig() { extern void cbMenuConfig(); std::string configfname = ARQ_dir; configfname.append("flarq.config"); std::ifstream configfile(configfname.c_str()); if (configfile) { char tempstr[200]; configfile.getline(tempstr,200); sscanf(tempstr,"%f", &vers); if (int(vers*10) != int(version*10)) initVals(); else { configfile >> MyCall; configfile >> exponent; configfile >> txdelay; configfile >> iretries; configfile >> iwaittime; configfile >> itimeout; configfile >> bcnInterval; configfile >> mainX; configfile >> mainY; configfile >> mainW; configfile >> mainH; configfile.ignore(); configfile.getline(tempstr, 200); beacontext = tempstr; configfile >> restart_beacon; digi_arq->myCall(MyCall.c_str()); digi_arq->setExponent(exponent); digi_arq->setRetries(iretries); digi_arq->setTimeout(itimeout); digi_arq->setTxDelay(txdelay); digi_arq->setWaitTime(iwaittime); } configfile.close(); } else initVals(); } void saveConfig() { std::string configfname = ARQ_dir; configfname.append("flarq.config"); std::ofstream configfile(configfname.c_str()); if (configfile) { int mainX = arqwin->x(); int mainY = arqwin->y(); int mainW = arqwin->w(); int mainH = arqwin->h(); configfile << VERSION << std::endl; configfile << MyCall << std::endl; configfile << exponent << std::endl; configfile << txdelay << std::endl; configfile << iretries << std::endl; configfile << iwaittime << std::endl; configfile << itimeout << std::endl; configfile << bcnInterval << std::endl; configfile << mainX << std::endl; configfile << mainY << std::endl; configfile << mainW << std::endl; configfile << mainH << std::endl; configfile << beacontext.c_str() << std::endl; configfile << restart_beacon << std::endl; configfile.close(); } } void cbSetConfig() { digi_arq->setExponent(exponent); digi_arq->setRetries(iretries); digi_arq->setTimeout(itimeout); digi_arq->setTxDelay(txdelay); digi_arq->setWaitTime(iwaittime); } void closeConfig() { if (dlgconfig) dlgconfig->hide(); cbSetConfig(); } void cb_idtimer() { digi_arq->set_idtimer(); } void cbMenuConfig() { if (!dlgconfig) { dlgconfig = arq_configure(); dlgconfig->xclass(PACKAGE_TARNAME); choiceBlockSize->add("16"); choiceBlockSize->add("32"); choiceBlockSize->add("64"); choiceBlockSize->add("128"); choiceBlockSize->add("256"); } choiceBlockSize->index(exponent - 4); choiceBlockSize->redraw(); dlgconfig->show(); } void cbMenuAbout() { fl_message2("flarq - ARQ client\nversion: %s\nw1hkj@@w1hkj.com", VERSION); } std::string txhold = ""; //============================================================================= void mpsk_on() { std::string s; s.append(1, MPSK_CMD).append(MPSK_TX).append(1, MPSK_END); try { tcpip->send(s); } catch (const SocketException& e) { std::cerr << e.what() << '\n'; } } void mpsk_off_after_buffer_sent() { std::string s; s.append(1, MPSK_CMD).append(MPSK_TX2RX).append(1, MPSK_END); try { tcpip->send(s); } catch (const SocketException& e) { std::cerr << e.what() << '\n'; } } void mpsk_off() { std::string s; s.append(1, MPSK_CMD).append(MPSK_RX).append(1, MPSK_END); try { tcpip->send(s); } catch (const SocketException& e) { std::cerr << e.what() << '\n'; } } void MPSK_client_transmit(const std::string& s) { if (s.empty()) return; std::string tosend; tosend.reserve(s.length() * 2); for (size_t i = 0; i < s.length(); i++) tosend.append(1, MPSK_BYTE).append(1, s[i]); try { mpsk_on(); tcpip->send(tosend); mpsk_off_after_buffer_sent(); } catch (const SocketException& e) { std::cerr << e.what() << '\n'; } } void MPSK_Socket_rcv_loop(void *) { if (inLoop) Fl::wait(0.1); inLoop = true; char cs; try { while (tcpip->wait(0)) { tcpip->recv(&cs, 1); if (isRxChar) { rxbuffer += cs; isRxChar = false; continue; } if (isTxChar) { if (cs < 28 || cs > 31) txbuffer += cs; isTxChar = false; continue; } if (isCmdChar) { if (cs == MPSK_CMDEND) { isCmdChar = false; if (cmdbuffer.find("RX_AFTER_TX OK") != std::string::npos) { rxbuffer += 0x06; cmdbuffer.clear(); txbuffer.clear(); } continue; } cmdbuffer += cs; continue; } if (cs == MPSK_ISRX) { isRxChar = true; continue; } if (cs == MPSK_ISCMD) { isCmdChar = true; continue; } if (cs == MPSK_ISTX) { isTxChar = true; continue; } } } catch (const SocketException& e) { std::cerr << e.what() << '\n'; } inLoop = false; Fl::add_timeout(0.01, MPSK_Socket_rcv_loop); } //============================================================================= void client_transmit(const std::string& s ) { try { if (!s.empty()) tcpip->send(s); } catch (const SocketException& e) { std::cerr << e.what() << '\n'; } } void Socket_rcv_loop(void *) { if (inLoop) Fl::wait(0.1); inLoop = true; try { tcpip->set_nonblocking(true); tcpip->recv(rxbuffer); tcpip->set_nonblocking(false); } catch (const SocketException& e) { std::cerr << e.what() << '\n'; } inLoop = false; Fl::add_timeout(0.01, Socket_rcv_loop); } bool client_receive(char &c) { if (inLoop) Fl::wait(0.1); inLoop = true; bufsize = rxbuffer.length(); if (bufsize) { if (bufptr < bufsize) { c = rxbuffer[bufptr++]; inLoop = false; return true; } } rxbuffer.clear(); bufsize = 0; bufptr = 0; inLoop = false; return false; } int autobeaconcounter = 0; char bcnMsg[40]; void arqAutoBeacon(void *) { if (autobeacon == ON) { int currstate = digi_arq->state(); btnCONNECT->deactivate(); btnCONNECT->redraw(); if (currstate > 0x7F) { txtBeaconing->value("Beaconing"); btnBEACON->deactivate(); btnBEACON->redraw(); Fl::repeat_timeout(1.0, arqAutoBeacon); return; } else if (currstate == DOWN || currstate == TIMEDOUT) { if (autobeaconcounter == 0) { digi_arq->sendBeacon( beacontext ); autobeaconcounter = bcnInterval; Fl::repeat_timeout(1.0 + txdelay / 1000.0, arqAutoBeacon); } else { snprintf(bcnMsg, sizeof(bcnMsg), "Bcn in: %d sec", autobeaconcounter); txtBeaconing->value(bcnMsg); btnBEACON->label("STOP"); btnBEACON->redraw_label(); btnBEACON->activate(); btnBEACON->redraw(); autobeaconcounter--; Fl::repeat_timeout(1.0, arqAutoBeacon); } return; } else { autobeaconcounter = 0; btnBEACON->value(0); btnBEACON->label("Beacon"); btnBEACON->redraw_label(); btnBEACON->activate(); btnBEACON->redraw(); txtBeaconing->value("Beacon Off"); } } else if (autobeacon == OFF) { autobeaconcounter = 0; btnCONNECT->activate(); btnCONNECT->redraw(); btnBEACON->value(0); btnBEACON->label("Beacon"); btnBEACON->redraw_label(); btnBEACON->activate(); btnBEACON->redraw(); txtBeaconing->value("Beacon Off"); } else { // autobeacon == WAIT btnBEACON->deactivate(); btnBEACON->redraw(); Fl::repeat_timeout(1.0, arqAutoBeacon); } } void arqBEACON() { if (autobeacon != ON) { autobeacon = ON; btnBEACON->value(1); Fl::add_timeout(0.01, arqAutoBeacon); } else { autobeacon = OFF; btnBEACON->value(0); } } void printstring(std::string s) { for (size_t n = 0; n < s.length(); n++) if (s[n] < ' ') printf("<%02d>",(int)s[n]); else printf("%c", s[n]); printf("\n"); } void arqCLOSE() { tcpip->close(); saveConfig(); exit_server(); exit(0); } void clearText() { txtarqload = ""; txtbuffARQ->text(""); txtStatus->value(""); txtStatus2->value(""); } void restart() { TX.clear(); rxfname = ""; rxTextReady = false; prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); rxARQfile = false; sendingfile = false; incomingText.clear(); clearText(); } void arqCONNECT() { int state = Fl::event_state(); if ((state & FL_CTRL) == FL_CTRL) { digi_arq->restart_arq(); txtURCALL->value(""); restart(); return; } if (digi_arq->state() < ARQ_CONNECTED) { if (strlen(txtURCALL->value()) > 0) digi_arq->connect(txtURCALL->value()); } else { if (rxARQfile || sendingfile) abortTransfer(); else { restart(); digi_arq->disconnect(); txtURCALL->value(""); } } } bool fileExists(std::string fname) { std::ifstream test(fname.c_str()); if (test) { test.close(); return true; } return false; } std::string nextFileName(std::string fname) { int nbr = 0; char szNbr[20]; std::string name; std::string ext; std::string nuname; size_t p; p = fname.find_last_of('.'); if (p != std::string::npos) { ext = fname.substr(p); name = fname.substr(0,p); } else { ext = ""; name = fname; } do { nbr++; nuname = name; snprintf(szNbr, sizeof(szNbr), ".dup%-d", nbr); nuname.append(szNbr); nuname.append(ext); } while (fileExists(nuname)); return nuname; } void saveEmailFile() { static char xfrmsg[80]; std::string tempname; time(&EndTime_t); TransferTime = difftime(EndTime_t, StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); std::string savetoname = ARQ_mail_in_dir; if (rxfname.find(".eml") == std::string::npos) rxfname.append(".eml"); savetoname.append(rxfname); while (fileExists(savetoname)) savetoname = nextFileName(savetoname); std::ofstream tfile(savetoname.c_str(), std::ios::binary); if (tfile) { tfile << txtarqload; tfile.close(); } txtStatus->value(xfrmsg); rxfname = ""; txtarqload = ""; rxTextReady = false; } void saveRxFile() { static char xfrmsg[80]; time(&EndTime_t); TransferTime = difftime(EndTime_t, StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); std::string savetoname = ARQ_recv_dir; savetoname.append(rxfname); if (fileExists(savetoname)) savetoname = nextFileName(savetoname); std::ofstream tfile(savetoname.c_str(), std::ios::binary); if (tfile) { tfile << txtarqload; tfile.close(); } txtStatus->value(xfrmsg); rxfname = ""; txtarqload = ""; rxTextReady = false; } void payloadText(std::string s) { static char szPercent[10]; std::string text = noCR(s); txtARQ->insert(text.c_str()); txtARQ->show_insert_position(); txtARQ->redraw(); incomingText.append (s); if (!rxARQfile) if ((startpos = incomingText.find(arqstart)) != std::string::npos) { rxARQfile = true; startpos += arqstart.length(); time(&StartTime_t); } if (rxARQfile) { if (!rxARQhavesize) { if ( (sizepos = incomingText.find(arqsizespec)) != std::string::npos) { sizepos += arqsizespec.length(); if ((lfpos = incomingText.find('\n', sizepos)) != std::string::npos) { std::string sizechars = incomingText.substr(sizepos, lfpos - sizepos); unsigned int tempnbr; sscanf(sizechars.c_str(), "%u", &tempnbr); arqPayloadSize = tempnbr; rxARQhavesize = true; char statusmsg[40]; snprintf(statusmsg, sizeof(statusmsg), "Rcvg: %d", static_cast(arqPayloadSize)); txtStatus->value(statusmsg); } } } else { if (startpos != std::string::npos) { float partial = incomingText.length() - startpos; snprintf(szPercent, sizeof(szPercent), "%3.0f %%", 100.0 * partial / arqPayloadSize); prgStatus->value( partial / arqPayloadSize ); prgStatus->label(szPercent); } else { prgStatus->value(0.0); prgStatus->label(""); } prgStatus->redraw(); prgStatus->redraw_label(); } if ((endpos = incomingText.find(arqend)) != std::string::npos) { haveemail = false; fnamepos = incomingText.find(arqfile); fnamepos += arqfile.length(); indx = incomingText.find('\n', fnamepos); rxfname = incomingText.substr(fnamepos, indx - fnamepos); txtarqload = incomingText.substr(startpos, endpos - startpos); if (incomingText.find(arqbase64) != std::string::npos) { base64 b64; txtarqload = b64.decode(txtarqload); } if (incomingText.find(arqemail) != std::string::npos) haveemail = true; startpos = std::string::npos; endpos = std::string::npos; fnamepos = std::string::npos; indx = std::string::npos; sizepos = std::string::npos; lfpos = std::string::npos; arqPayloadSize = 0; rxARQfile = false; rxARQhavesize = false; rxTextReady = true; if (incomingText.find("FLMSG_XFR") != std::string::npos) xml_rx_text_ready = true; incomingText = ""; txtStatus->value(""); prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); } } } void cbClearText() { txtbuffARQ->text(""); } void abortedTransfer() { restart(); txtARQ->insert("transfer aborted\n"); btnCONNECT->activate(); } void abortTransfer() { sendingfile = false; SendingEmail = false; rxARQfile = false; btnCONNECT->label("ABORTING"); btnCONNECT->redraw_label(); btnCONNECT->deactivate(); digi_arq->abort(); } void rxBeaconCallsign(std::string s) { txtURCALL->value(s.c_str()); beaconrcvd = true; } void moveEmailFile() { if (MailFileName.empty()) return; if (MailSaveFileName.empty()) return; std::ifstream infile(MailFileName.c_str(), std::ios::in | std::ios::binary); if (MailSaveFileName.find(".eml") == std::string::npos) MailSaveFileName.append(".eml"); while (fileExists(MailSaveFileName)) MailSaveFileName = nextFileName(MailSaveFileName); std::ofstream outfile(MailSaveFileName.c_str(), std::ios::out | std::ios::binary); char c; if (infile && outfile) { while (!infile.eof()) { infile.get(c); outfile.put(c); } infile.close(); outfile.close(); unlink(MailFileName.c_str()); } MailFileName.clear(); MailSaveFileName.clear(); } void sendEmailFile() { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } sendfilename.clear(); selectTrafficOut(false); if (sendfilename.empty()) return; char cin; size_t txtsize; std::string textin = ""; char sizemsg[40]; size_t p; std::ifstream textfile; textfile.open(sendfilename.c_str(), std::ios::binary); if (textfile) { for (size_t i = 0; i < sendfilename.length(); i++) if (sendfilename[i] == '\\') sendfilename[i] = '/'; MailFileName = sendfilename; TX.erase(); TX.append(arqfile); MailSaveFileName = ARQ_mail_sent_dir; p = sendfilename.find_last_of('/'); if (p != std::string::npos) p++; MailSaveFileName.append(sendfilename.substr(p)); TX.append(sendfilename.substr(p)); TX.append("\n"); TX.append(arqemail); // only allow ASCII printable characters while (textfile.get(cin)) textin += (cin & 0xFF); textfile.close(); if ( textin.find_first_not_of(AsciiChars) != std::string::npos) { fl_alert2("File contains non-ASCII bytes and must be sent as binary."); return; } textfile.close(); txtsize = textin.length(); arqPayloadSize = txtsize; blocksSent = 0; snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(txtsize)); TX.append(sizemsg); TX.append(arqstart); TX.append(textin); TX.append(arqend); traffic = true; statusmsg = "Sending email: "; statusmsg.append(sendfilename.substr(p)); txtStatus->value(statusmsg.c_str()); SendingEmail = true; sendingfile = true; cbClearText(); return; } traffic = false; sendingfile = false; SendingEmail = false; } void sendAsciiFile() { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } std::string readfromname = ARQ_send_dir; readfromname.append(rxfname); const char *p = FSEL::select("ARQ text file", "*.txt\t*", readfromname.c_str()); char cin; size_t txtsize; std::string textin = ""; char sizemsg[40]; if (p && *p) { std::ifstream textfile; textfile.open(p); if (textfile) { TX.erase(); TX.append(arqfile); p = fl_filename_name(p); TX.append(p); TX.append("\n"); TX.append(arqascii); while (textfile.get(cin)) textin += (cin & 0xFF); textfile.close(); if ( textin.find_first_not_of(AsciiChars) != std::string::npos) { fl_alert2("File contains non-ASCII bytes and must be sent as binary."); return; } txtsize = textin.length(); arqPayloadSize = txtsize; blocksSent = 0; snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(txtsize)); TX.append(sizemsg); TX.append(arqstart); TX.append(textin); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending ASCII file: "; statusmsg.append(p); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } } traffic = false; sendingfile = false; } void sendImageFile() { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } const char *p = FSEL::select(_("ARQ image file"), "Images\t*.{png,jpg,bmp}", ""); char cin; size_t b64size; std::string textin = ""; std::string b64text; base64 b64(true); char sizemsg[40]; if (p && *p) { std::ifstream textfile; textfile.open(p, std::ios::binary); if (textfile) { TX.erase(); TX.append(arqfile); p = fl_filename_name(p); TX.append(p); TX.append("\n"); TX.append(arqbase64); while (textfile.get(cin)) textin += cin; textfile.close(); b64text = b64.encode(textin); b64size = b64text.length(); snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(b64size)); arqPayloadSize = b64size; blocksSent = 0; TX.append(sizemsg); TX.append(arqstart); TX.append(b64text); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending image: "; statusmsg.append(p); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } } traffic = false; sendingfile = false; } void sendBinaryFile() { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } const char *p = FSEL::select("ARQ file", "*", ""); char cin; size_t b64size; std::string textin = ""; std::string b64text; base64 b64(true); char sizemsg[40]; if (p && *p) { std::ifstream textfile; textfile.open(p, std::ios::binary); if (textfile) { TX.erase(); TX.append(arqfile); p = fl_filename_name(p); TX.append(p); TX.append("\n"); TX.append(arqbase64); while (textfile.get(cin)) textin += cin; textfile.close(); b64text = b64.encode(textin); b64size = b64text.length(); snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(b64size)); arqPayloadSize = b64size; blocksSent = 0; TX.append(sizemsg); TX.append(arqstart); TX.append(b64text); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending binary: "; statusmsg.append(p); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } } traffic = false; sendingfile = false; } void send_xml_text(std::string fname, std::string txt) { if (arqstate < ARQ_CONNECTED) { fl_alert2("Not connected"); return; } size_t txtsize; char sizemsg[40]; if (!txt.empty()) { TX.erase(); TX.append(arqfile); TX.append(fname); TX.append("\n"); TX.append(arqascii); txtsize = txt.length(); arqPayloadSize = txtsize; blocksSent = 0; snprintf(sizemsg, sizeof(sizemsg), "ARQ:SIZE::%d\n", static_cast(txtsize)); TX.append(sizemsg); TX.append(arqstart); TX.append(txt); TX.append(arqend); traffic = true; sendingfile = true; statusmsg = "Sending XML payload: "; statusmsg.append(fname); txtStatus->value(statusmsg.c_str()); cbClearText(); return; } traffic = false; sendingfile = false; } static char statemsg[80]; void dispState() { static int last_state = DOWN; int currstate = digi_arq->state(); static char xfrmsg[80]; static char szPercent[10]; arqstate = currstate & 0x7F; if (last_state != currstate) { last_state = currstate; if (arqstate == DOWN || arqstate == TIMEDOUT) { if (btnCONNECT->active()) { btnCONNECT->label("Connect"); } btnBEACON->activate(); mnu->redraw(); } else if (arqstate == ARQ_CONNECTED || arqstate == WAITING) { if (btnCONNECT->active()) btnCONNECT->label("Disconnect"); if (!autobeacon) btnBEACON->deactivate(); mnuSend->activate(); mnu->redraw(); } if (rxARQfile || sendingfile) { if (btnCONNECT->active()) btnCONNECT->label("Abort"); } if (btnCONNECT->active()) btnCONNECT->redraw_label(); if (currstate <= 0x7F) { // receiving switch (currstate) { case ARQ_CONNECTING : snprintf(statemsg, sizeof(statemsg), "CONNECTING: %d", digi_arq->getTimeLeft()); txtState->value(statemsg); txtState->redraw(); autobeacon = WAIT; break; case WAITFORACK : snprintf(statemsg, sizeof(statemsg), "WAITING FOR ACK "); txtState->value(statemsg); txtState->redraw(); autobeacon = WAIT; break; case ABORT: case ABORTING : txtState->value("ABORTING XFR"); txtState->redraw(); autobeacon = WAIT; break; case WAITING : case ARQ_CONNECTED : char szState[80]; snprintf(szState, sizeof(szState),"CONNECTED - Quality = %4.2f", digi_arq->quality()); indCONNECT->color(FL_GREEN); indCONNECT->redraw(); txtBeaconing->value(""); txtState->value(szState); txtURCALL->value( digi_arq->urCall().c_str() ); autobeacon = WAIT; break; case TIMEDOUT : indCONNECT->color(FL_WHITE); indCONNECT->redraw(); txtState->value("TIMED OUT"); txtStatus->value(""); if (restart_beacon && autobeacon != ON) { autobeacon = ON; Fl::remove_timeout(arqAutoBeacon); Fl::add_timeout(1.0 + txdelay / 1000.0, arqAutoBeacon); } beaconrcvd = false; break; case DISCONNECT: case DISCONNECTING: txtState->value("DISCONNECTING"); break; case DOWN : default : if (autobeacon != ON && restart_beacon) { btnBEACON->activate(); Fl::remove_timeout(arqAutoBeacon); Fl::add_timeout(1.0 + txdelay / 1000.0, arqAutoBeacon); } indCONNECT->color(FL_WHITE); indCONNECT->redraw(); autobeacon = ON; txtState->value("NOT CONNECTED"); txtStatus->value(""); } } } if (sendingfile == true) { if (digi_arq->transferComplete()) { time(&EndTime_t); TransferTime = difftime(EndTime_t,StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); txtStatus->value(xfrmsg); blocksSent = 0; prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); sendingfile = false; } else { prgStatus->value( digi_arq->percentSent()); snprintf(szPercent, sizeof(szPercent), "%3.0f %%", 100.0 * digi_arq->percentSent()); prgStatus->label(szPercent); prgStatus->redraw(); prgStatus->redraw_label(); } } if (SendingEmail == true) { if (digi_arq->transferComplete()) { time(&EndTime_t); TransferTime = difftime(EndTime_t,StartTime_t); snprintf(xfrmsg, sizeof(xfrmsg), "Transfer Completed in %4.0f sec's", TransferTime); txtStatus->value(xfrmsg); moveEmailFile(); blocksSent = 0; prgStatus->value(0.0); prgStatus->label(""); prgStatus->redraw(); prgStatus->redraw_label(); SendingEmail = false; } else { prgStatus->value( digi_arq->percentSent()); snprintf(szPercent, sizeof(szPercent), "%3.0f %%", 100.0 * digi_arq->percentSent()); prgStatus->label(szPercent); prgStatus->redraw(); prgStatus->redraw_label(); } } } void mainloop(void *) { if (traffic) { digi_arq->sendText(TX); traffic = false; time(&StartTime_t); } dispState(); if (rxTextReady) { if (haveemail) saveEmailFile(); else if (!xml_rx_text_ready) saveRxFile(); } Fl::repeat_timeout(0.1, mainloop); } void changeMyCall(const char *nucall) { int currstate = digi_arq->state(); if (currstate != DOWN) return; MyCall = nucall; for (size_t i = 0; i < MyCall.length(); i++) MyCall[i] = toupper(MyCall[i]); txtMyCall->value(MyCall.c_str()); digi_arq->myCall(MyCall.c_str()); std::string title = "flarq "; title.append(VERSION); title.append(" - "); title.append(MyCall); arqwin->label(title.c_str()); } void changeBeaconText(const char *txt) { beacontext = txt; } void TALKprint(std::string s) { txtRX->insert(s.c_str()); txtRX->show_insert_position(); txtRX->redraw(); } void clear_STATUS(void* arg) { txtStatus2->value(""); } void STATUSprint(std::string s, double disptime) { txtStatus2->value(s.c_str()); if (disptime > 0.0) { Fl::remove_timeout( clear_STATUS ); Fl::add_timeout( disptime, clear_STATUS ); } } void cbSendTalk() { std::string tosend; tosend = txtTX->value(); if (tosend.empty()) return; tosend += '\n'; digi_arq->sendPlainText(tosend); txtTX->value(""); txtRX->insert(tosend.c_str()); txtRX->show_insert_position(); txtRX->redraw(); } void arqlog(std::string nom,std::string s) { static char szGMT[80]; tm *now; time_t tm; std::string strdebug; time(&tm); now = localtime( &tm ); strftime(szGMT, sizeof(szGMT), "[%X] ", now); for (unsigned int i = 0; i < s.length(); i++) if (s[i] < 32) strdebug += ASCII[(int)s[i]]; else strdebug += s[i]; std::ofstream logfile(Logfile.c_str(), std::ios::app); if (logfile) logfile << nom << szGMT << strdebug << std::endl; } void DEBUGrxprint(std::string s) { std::string text = noCR(s); txtRX->insert(text.c_str()); txtRX->show_insert_position(); txtRX->redraw(); arqlog("",s); } void DEBUGtxprint(std::string s) { std::string text = noCR(s); txtRX->insert(text.c_str()); txtRX->show_insert_position(); txtRX->redraw(); arqlog("",s); } void TXecho(std::string s) { blocksSent += s.length(); std::string text = noCR(s); txtARQ->insert(text.c_str()); txtARQ->show_insert_position(); txtARQ->redraw(); } void style_unfinished_cb(int, void*) { } void cbClearTalk() { txtbuffRX->text(""); } void cb_arqwin(Fl_Widget *, void*) { arqCLOSE(); } std::string pname; int main (int argc, char *argv[] ) { sscanf(VERSION, "%f", &version); std::set_terminate(diediedie); setup_signal_handlers(); NBEMS_dir.clear(); { std::string appname = pname = argv[0]; std::string appdir = argv[0]; #ifdef __WIN32__ size_t p = appdir.find("FL_APPS\\"); if (p == std::string::npos) p = appdir.find("FL_APPS/"); if (p == std::string::npos) { char dirbuf[FL_PATH_MAX + 1]; fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$USERPROFILE/"); NBEMS_dir.assign(dirbuf); } else NBEMS_dir.assign(appdir.substr(0, p + 8)); NBEMS_dir.append("NBEMS.files/"); #else char dirbuf[FL_PATH_MAX + 1]; fl_filename_absolute(dirbuf, sizeof(dirbuf), argv[0]); appdir.assign(dirbuf); size_t p = appdir.rfind("flarq"); if (p != std::string::npos) appdir.erase(p); p = appdir.find("FL_APPS/"); if (p != std::string::npos) NBEMS_dir.assign(appdir.substr(0, p + 8)); else { fl_filename_expand(dirbuf, FL_PATH_MAX, "$HOME/"); NBEMS_dir = dirbuf; } DIR *isdir = 0; std::string test_dir; test_dir.assign(NBEMS_dir).append("NBEMS.files/"); isdir = opendir(test_dir.c_str()); if (isdir) { NBEMS_dir = test_dir; closedir(isdir); } else { NBEMS_dir.append(".nbems/"); } #endif HomeDir = NBEMS_dir; } checkdirectories(); Logfile = ARQ_dir; Logfile.append("/").append("arqlog.txt"); set_platform_ui(); generate_option_help(); generate_version_text(); int arg_idx; if (Fl::args(argc, argv, arg_idx, parse_args) != argc) { std::cerr << PACKAGE_NAME << ": bad option `" << argv[arg_idx] << "'\nTry `" << PACKAGE_NAME << " --help' for more information.\n"; exit(EXIT_FAILURE); } createAsciiChars(); // allowable ASCII text chars for ".txt" type of files FSEL::create(); arqwin = arq_dialog(); arqwin->callback(cb_arqwin); arqwin->xclass(PACKAGE_TARNAME); // FL_NORMAL_SIZE may have changed; update the menu items for (int i = 0; i < menu_mnu->size() - 1; i++) if (menu_mnu[i].text) menu_mnu[i].labelsize(FL_NORMAL_SIZE); txtbuffRX = txtRX->buffer(); txtRX->wrap_mode(1,80); txtbuffARQ = txtARQ->buffer(); txtARQ->wrap_mode(1,80); digi_arq = new arq(); try { tcpip = new Socket(Address(arq_address.c_str(), arq_port.c_str())); tcpip->set_timeout(0.01); tcpip->connect(); } catch (const SocketException& e) { std::string errmsg; errmsg.append("Could not connect to modem program.\nPlease start "); if (ioMPSK) errmsg.append("MultiPSK"); else errmsg.append("fldigi"); errmsg.append(" before flarq."); fl_alert2("%s", errmsg.c_str()); exit(EXIT_FAILURE); } if (ioMPSK) Fl::add_timeout(0.1, MPSK_Socket_rcv_loop); else Fl::add_timeout(0.1, Socket_rcv_loop); // the following sequence of assigning callback functions is mandatory // for the arq class to function if (ioMPSK) digi_arq->setSendFunc (MPSK_client_transmit); else digi_arq->setSendFunc (client_transmit); digi_arq->setGetCFunc (client_receive); digi_arq->setAbortedTransfer(abortedTransfer); digi_arq->setDisconnected(restart); digi_arq->setrxUrCall (rxBeaconCallsign); digi_arq->setPrintRX (payloadText); digi_arq->setPrintTX (TXecho); digi_arq->setPrintTALK (TALKprint); digi_arq->setPrintSTATUS (STATUSprint); if (SHOWDEBUG) { digi_arq->setPrintRX_DEBUG (DEBUGrxprint); digi_arq->setPrintTX_DEBUG (DEBUGtxprint); } digi_arq->start_arq(); readConfig(); std::string title = "flarq "; title.append(VERSION); title.append(" - "); title.append(MyCall); arqwin->label(title.c_str()); arqwin->resize(mainX, mainY, mainW, mainH); txtBeaconing->value("Beacon Off"); Fl::add_timeout(0.1, mainloop); #ifdef __WOE32__ # ifndef IDI_ICON # define IDI_ICON 101 # endif arqwin->icon((char*)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON))); #elif !defined(__APPLE__) && USE_X make_pixmap(&flarq_icon_pixmap, flarq_icon, argc, argv); arqwin->icon((char *)flarq_icon_pixmap); #endif start_xml_server(FLARQ_XML_PORT); arqwin->show(argc, argv); #ifdef USE_X // See https://groups.google.com/g/fltkgeneral/c/hcjV-rgjHWM // read in the current window hints, then modify them to allow icon transparency XWMHints* hints = XGetWMHints(fl_display, fl_xid(arqwin)); hints->flags |= IconMaskHint; // ensure transparency mask is enabled for the XPM icon hints->icon_mask |= IconPixmapHint; XSetWMHints(fl_display, fl_xid(arqwin), hints); XFree(hints); #endif return Fl::run(); } static void checkdirectories(void) { struct DIRS { std::string& dir; const char* suffix; void (*new_dir_func)(void); }; DIRS NBEMS_dirs[] = { { NBEMS_dir, 0, 0 }, { ARQ_dir, "ARQ", 0 }, { ARQ_files_dir, "ARQ/files", 0 }, { ARQ_recv_dir, "ARQ/recv", 0 }, { ARQ_send_dir, "ARQ/send", 0 }, { ARQ_mail_dir, "ARQ/mail", 0 }, { ARQ_mail_in_dir, "ARQ/mail/in", 0 }, { ARQ_mail_out_dir, "ARQ/mail/out", 0 }, { ARQ_mail_sent_dir, "ARQ/mail/sent", 0 }, { WRAP_dir, "WRAP", 0 }, { WRAP_recv_dir, "WRAP/recv", 0 }, { WRAP_send_dir, "WRAP/send", 0 }, { WRAP_auto_dir, "WRAP/auto", 0 }, { ICS_dir, "ICS", 0 }, { ICS_msg_dir, "ICS/messages", 0 }, { ICS_tmp_dir, "ICS/templates", 0 }, }; int r; for (size_t i = 0; i < sizeof(NBEMS_dirs)/sizeof(*NBEMS_dirs); i++) { if (NBEMS_dirs[i].suffix) NBEMS_dirs[i].dir.assign(NBEMS_dir).append(NBEMS_dirs[i].suffix).append("/"); if ((r = mkdir(NBEMS_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { std::cerr << _("Could not make directory") << ' ' << NBEMS_dirs[i].dir << ": " << strerror(errno) << '\n'; exit(EXIT_FAILURE); } else if (r == 0 && NBEMS_dirs[i].new_dir_func) NBEMS_dirs[i].new_dir_func(); } } // This function may be called by the QRZ thread void cb_mnuVisitURL(Fl_Widget*, void* arg) { const char* url = reinterpret_cast(arg); #ifndef __WOE32__ const char* browsers[] = { # ifdef __APPLE__ getenv("FLDIGI_BROWSER"), // valid for any OS - set by user "open" // OS X # else "fl-xdg-open", // Puppy Linux "xdg-open", // other Unix-Linux distros getenv("FLDIGI_BROWSER"), // force use of spec'd browser getenv("BROWSER"), // most Linux distributions "sensible-browser", "firefox", "mozilla" // must be something out there! # endif }; switch (fork()) { case 0: # ifndef NDEBUG unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); # endif for (size_t i = 0; i < sizeof(browsers)/sizeof(browsers[0]); i++) if (browsers[i]) execlp(browsers[i], browsers[i], url, (char*)0); exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not run a web browser:\n%s\n\n" "Open this URL manually:\n%s"), strerror(errno), url); } #else // gurgle... gurgle... HOWL // "The return value is cast as an HINSTANCE for backward // compatibility with 16-bit Windows applications. It is // not a true HINSTANCE, however. The only thing that can // be done with the returned HINSTANCE is to cast it to an // int and compare it with the value 32 or one of the error // codes below." (Error codes omitted to preserve sanity). if ((INT_PTR)ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL) <= 32) fl_alert2(_("Could not open url:\n%s\n"), url); #endif } void open_nbems_file_folder() { cb_mnuVisitURL(0, (void*)NBEMS_dir.c_str()); } fldigi-4.2.05/src/flarq-src/include/0000775000175000017500000000000014611714004014145 500000000000000fldigi-4.2.05/src/flarq-src/include/flarq.h0000664000175000017500000000426414611711171015353 00000000000000#ifndef FLARQ_H #define FLARQ_H #include #define SOHCOUNT 10 extern void arqBEACON(); extern void arqCLOSE(); extern void arqCONNECT(); extern void cbMenuAbout(); extern void cbMenuConfig(); extern void cbSetConfig(); extern void closeConfig(); extern void sendCancel(); extern void sendOK(); extern void cb_SortByDate(); extern void cb_SortByTo(); extern void cb_SortBySubj(); extern void abortTransfer(); extern void cbAbort(); extern void cbClearText(); extern void testDirectory(std::string); extern void cbSendTalk(); extern void cbClearTalk(); extern void help_cb(); extern void open_nbems_file_folder(); extern void sendEmailFile(); extern void sendAsciiFile(); extern void sendImageFile(); extern void sendBinaryFile(); extern void changeMyCall(const char *); extern void changeBeaconText(const char *); extern std::string HomeDir; extern std::string NBEMS_dir; extern std::string ARQ_dir; extern std::string ARQ_files_dir; extern std::string ARQ_recv_dir; extern std::string ARQ_send_dir; extern std::string ARQ_mail_dir; extern std::string ARQ_mail_in_dir; extern std::string ARQ_mail_out_dir; extern std::string ARQ_mail_sent_dir; extern std::string WRAP_dir; extern std::string WRAP_recv_dir; extern std::string WRAP_send_dir; extern std::string WRAP_auto_dir; extern std::string ICS_dir; extern std::string ICS_msg_dir; extern std::string ICS_tmp_dir; extern std::string MyCall; extern std::string InFolder; extern std::string OutFolder; extern std::string MailInFolder; extern std::string MailOutFolder; extern std::string MailSentFolder; extern std::string Logfile; extern std::string beacontext; extern int exponent; extern int txdelay; extern int iretries; extern long iwaittime; extern long itimeout; extern int bcnInterval; extern int idtimer; extern bool restart_beacon; extern void cb_idtimer(); // used by xmlrpc interface extern int arqstate; extern bool sendingfile; extern bool rxTextReady; extern bool rxARQfile; extern std::string txtarqload; extern void cb_SaveComposeMail(); extern void cb_CancelComposeMail(); extern void cb_UseTemplate(); extern void cb_OpenComposeMail(); extern void ComposeMail(); extern void send_xml_text(std::string, std::string); #endif fldigi-4.2.05/src/flarq-src/include/arq.h0000664000175000017500000002726714611711171015041 00000000000000#ifndef arq_H #define arq_H // ---------------------------------------------------------------------------- // arq module arq.h // Copyright (c) 2007-2009, Dave Freese, W1HKJ // // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // link layer spec for fldigi_arq // // generic Frame format: // dcl[info])12EF // | ||| | | | // | ||| | | +--ASCII or (0x04) character // | ||| | +-------checksum (4xAlphaNum) // | ||| +-------------Payload (1 ... 2^N chars, N 4, 5, 6, 7 8) // | ||+---------------Block type // | |+----------------Stream id // | +-----------------Protocol version number // +---------------------ASCII (0x01) character // BLOCKSIZE = 2^n // #include #include #include #include #include #include #include #include extern int idtimer; #define DEBUG #define arq_Version "arq 0.1" //===================================================================== // following Block Types are defined in K9PS ARQ Protocol specification #define IDENT 'i' #define CONREQ 'c' #define CONACK 'k' #define REFUSED 'r' #define DISREQ 'd' #define STATUS 's' #define POLL 'p' #define FMTFAIL 'f' // following Block Types are extensions to the K9PS specification #define _ABORT 'a' #define _ACKABORT 'o' #define _DISACK 'b' #define _UNPROTO 'u' #define _TALK 't' //===================================================================== #define SOH 0X01 #define STX 0X02 #define ACK 0X06 #define SUB 0X1A #define EOT 0X04 //===================================================================== //ARQ defaults #define MAXHEADERS 8 // Max. number of missing blocks #define MAXCOUNT 64 // DO NOT CHANGE THIS CONSTANT #define EXPONENT 7 // Bufferlength = 2 ^ EXPONENT = 128 //===================================================================== //link timing defaults #define RETRIES 5 #define RETRYTIME 10000 // # milliseconds between retries #define TXDELAY 500 // # milliseconds from xmt to rcv #define TIMEOUT 60000 // # milliseconds before TIMED OUT #define ARQLOOPTIME 100 // # msec for loop timing //===================================================================== //link states enum LINK_STATES { DOWN = 0, TIMEDOUT, ABORT, ARQ_CONNECTING, ARQ_CONNECTED, WAITING, WAITFORACK, DISCONNECT, DISCONNECTING, ABORTING, STOPPED }; //#define DOWN 0 //#define TIMEDOUT 1 //#define ABORT 3 //#define ARQ_CONNECTING 4 //#define ARQ_CONNECTED 5 //#define WAITING 6 //#define WAITFORACK 7 //#define DISCONNECT 8 //#define DISCONNECTING 9 //#define ABORTING 10 #define SENDING 0x80; //===================================================================== extern char *ARQASCII[]; // crc 16 cycle redundancy check sum for data block integrity class Ccrc16 { private: unsigned int crcval; char ss[5]; public: Ccrc16() { crcval = 0xFFFF; } ~Ccrc16() {}; void reset() { crcval = 0xFFFF;} unsigned int val() {return crcval;} std::string sval() { snprintf(ss, sizeof(ss), "%04X", crcval); return ss; } void update(char c) { crcval ^= c & 255; for (int i = 0; i < 8; ++i) { if (crcval & 1) crcval = (crcval >> 1) ^ 0xA001; else crcval = (crcval >> 1); } } unsigned int crc16(char c) { update(c); return crcval; } unsigned int crc16(std::string s) { reset(); for (size_t i = 0; i < s.length(); i++) update(s[i]); return crcval; } std::string scrc16(std::string s) { crc16(s); return sval(); } }; // text block; block # and std::string of text class cTxtBlk { private: int number; std::string txt; public: cTxtBlk() {number = -1; txt = "";} cTxtBlk(int n, std::string text) { number = n; txt = text; } ~cTxtBlk() {} void nbr(int n) { number = n;} int nbr() { return number; } std::string text() { return txt; } void text(std::string t) { txt = t;} bool operator <(const cTxtBlk &b)const { return number < b.number; } bool operator ==(const cTxtBlk b)const { return number == b.number; } }; class arq { private: bool arqstop; std::string MyCall; std::string UrCall; std::string Header; std::string Frame; std::string Payload; std::string rcvPayload; std::string logfile; char MyStreamID; char UrStreamID; char MyBlockLengthChar; char UrBlockLengthChar; char BlockNumberChar; char fID; int blknbr; // queues // std::string TxTextQueue; // Text out to mail engine std::string TxPlainTextQueue; // plain text transmit queu std::string RxTextQueue; // Text in from mail engine std::string RxFrameQueue; char lastRxChar; bool TXflag; int Bufferlength; int maxheaders; int exponent; // status variables int payloadlength; // Average length of payload received int totalRx; // total number of frames received int totalTx; // total number of frames transmitted int nbrbadRx; // number with crc errors int nbrbadTx; // total number of repeats required // int max_idle; // Dynamic timing slot initial value int SessionNumber; bool PollOK; // used for status handshake bool wrappedFlag; // set true if missing blocks bit count // has wrapped around int retrytime; int RetryTime; int retries; int Retries; int timeout; int Timeout; int tx2txdelay; int TxDelay; int loopcount; int _idtimer; int baseRetryTime; int baseTimeout; int baseRetries; bool immediate; bool primary; Ccrc16 framecrc; // My status int Firstsent; // First Header I sent last turn int LastHeader; // Last Header I sent last turn int Lastqueued; // Last Header in static send queue int EndHeader; // Last I received o.k. int GoodHeader; // Last Header received consecutively int blkcount; int Blocks2Send; // number of blocks at beginning of Tx std::vector MyMissing; // missing Rx blocks std::string MissingRxBlocks; std::vector RxPending; // RxPending Rx blocks (not consecutive) std::list TxBlocks; // fifo of transmit buffers std::list TxMissing; // fifo of sent; RxPending Status report std::list TxPending; // fifo of transmitted buffers pending print // Ur status int UrGoodHeader; // Other station's Good Header int UrLastHeader; // Other station's Header last sent int UrEndHeader; // Other station's last received Header std::vector UrMissing; // Other station's missing Headers int LinkState; // status of ARQ link int Sending; bool bABORT; // Link quality for sending *** used for testing only !! *** // double sendquality; void reset(); void resetTx(); void resetRx(); int rtry(); void setBufferlength(); void checkblocks(); std::string upcase(std::string s); void newblocknumber(); void newHeader(); void IdHeader(); void UnkHeader(); void connectFrame(); void disackFrame(); void ackFrame(); void ttyconnectFrame(); void ttyackFrame(); void pollFrame(); void identFrame(); void pingFrame(); void statFrame(); void disconnectFrame(); void abortFrame(); void ackAbortFrame(); void beaconFrame(std::string txt); void textFrame(cTxtBlk block); void talkFrame(std::string txt); void addToTxQue(std::string s); void sendblocks(); void transmitdata(); std::string frame() {return Frame;} bool isUrcall(); void parseIDENT(); void parseCONREQ(); void parseCONACK(); void parseREFUSED(); void parseDISREQ(); void parseDISACK(); void parseABORT(); void parseACKABORT(); void parseUNPROTO(); void parseSTATUS(); void parsePOLL(); void parseDATA(); void parseTALK(); int parseFrame(std::string txt); // external functions called by arq class void (*sendfnc)(const std::string& s); bool (*getc1)(char &); void (*rcvfnc)(); void (*printRX)(std::string s); void (*printTX)(std::string s); void (*printRX_DEBUG)(std::string s); void (*printTX_DEBUG)(std::string s); void (*printTALK)(std::string s); void (*abortfnc)(); void (*disconnectfnc)(); void (*rxUrCall)(std::string s); void (*qualityfnc)(std::string s); void (*printSTATUS)(std::string s, double disptime); public: arq(); ~arq() {}; friend void arqloop(void *me); void start_arq(); void restart_arq(); std::string checksum(std::string &s); void myCall(std::string s) { MyCall = upcase(s);} std::string myCall() { return MyCall;} void urCall(std::string s) { UrCall = s;} std::string urCall() { return UrCall;} void newsession(); void setSendFunc( void (*f)(const std::string& s)) { sendfnc = f;} void setGetCFunc( bool (*f)(char &)) { getc1 = f;} void setRcvFunc( void (*f)()) { rcvfnc = f;} void setPrintRX( void (*f)(std::string s)) { printRX = f;} void setPrintTX( void (*f)(std::string s)) { printTX = f;} void setPrintTALK (void (*f)(std::string s)) {printTALK = f;} void setPrintRX_DEBUG (void (*f)(std::string s)){printRX_DEBUG = f;} void setPrintTX_DEBUG (void (*f)(std::string s)) {printTX_DEBUG = f;} void setPrintSTATUS (void (*f)(std::string s, double disptime)) { printSTATUS = f;} void setMaxHeaders( int mh ) { maxheaders = mh; } void setExponent( int exp ) { exponent = exp; setBufferlength(); } int getExponent() { return (int) exponent;} void setWaitTime( int rtime ) { RetryTime = rtime; baseRetryTime = rtime; } int getWaitTime() { return (int) RetryTime; } void setRetries ( int rtries ) { retries = Retries = baseRetries = rtries; } int getRetries() { return (int) Retries; } void setTimeout ( int tout ) { Timeout = tout; baseTimeout = tout; } int getTimeout() { return (int) Timeout; } int getTimeLeft() { return (int) timeout * ARQLOOPTIME / 1000; } void setTxDelay ( int r2t ) { TxDelay = r2t; } int getTxDelay() { return (int) TxDelay; } int getRetryCount() { return (int)(Retries - retries + 1); } void set_idtimer() { if (idtimer) _idtimer = (idtimer * 60 - 10) * 1000 / ARQLOOPTIME; else _idtimer = (10 * 60 - 10) * 1000 / ARQLOOPTIME; } void setrxUrCall( void (*f)(std::string s)) { rxUrCall = f;} void setQualityValue( void (*f)(std::string s)) { qualityfnc = f;} void setAbortedTransfer( void (*f)()) { abortfnc = f;}; void setDisconnected( void (*f)()) { disconnectfnc = f;}; void rcvChar( char c ); void connect(std::string callsign);//, int blocksize = 6, int retries = 4); void sendblocks( std::string txt ); void sendBeacon (std::string txt); void sendPlainText( std::string txt ); std::string getText() { return RxTextQueue;} void sendText(std::string txt); bool connected() { return (LinkState == ARQ_CONNECTED); } void disconnect(); void abort(); int state() { return (LinkState + Sending);} int TXblocks() { return totalTx;} int TXbad() { return nbrbadTx;} int RXblocks() { return totalRx;} int RXbad() { return nbrbadRx;} double quality() { if (totalTx == 0) return 1.0; return ( 1.0 * (totalTx - nbrbadTx) / totalTx ); } float percentSent() { if (Blocks2Send == 0) return 0.0; if ((TxBlocks.empty() && TxMissing.empty())) return 1.0; return (1.0 * (Blocks2Send - TxBlocks.size() - TxMissing.size()) / Blocks2Send); } bool transferComplete() { if (TxMissing.empty() == false) return false; if (TxBlocks.empty() == false) return false; return true; } }; #endif fldigi-4.2.05/src/flarq-src/include/flarqenv.h0000664000175000017500000000050014532252172016054 00000000000000#ifndef flarqenv_h_ #define flarqenv_h_ #include extern std::string option_help, version_text, build_text; void generate_option_help(void); void generate_version_text(void); int parse_args(int argc, char** argv, int& idx); void set_platform_ui(void); void setup_signal_handlers(void); #endif // flarqenv_h_ fldigi-4.2.05/src/flarq-src/include/arqdialogs.h0000664000175000017500000000502514611711171016370 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef arqdialogs_h #define arqdialogs_h #include #include "flinput2.h" #include "flslider2.h" #include "combo.h" #include #include extern Fl_Menu_Bar *mnu; extern void ComposeMail(); extern void cbMenuConfig(); extern void cbMenuAbout(); #include #include extern Fl_Button *btnCONNECT; extern Fl_Input2 *txtURCALL; #include extern Fl_Light_Button *btnBEACON; extern Fl_Input2 *txtBeaconing; #include extern Fl_Box *indCONNECT; extern Fl_Input2 *txtState; #include "FTextView.h" extern FTextView *txtARQ; extern Fl_Input2 *txtStatus; extern Fl_Input2 *txtStatus2; #include extern Fl_Progress *prgStatus; extern Fl_Button *btnClearText; extern FTextView *txtRX; extern Fl_Input2 *txtTX; extern Fl_Button *btnSendTalk; Fl_Double_Window* arq_dialog(); extern Fl_Menu_Item menu_mnu[]; #define mnu_nbems_files (menu_mnu+1) #define mnuExit (menu_mnu+2) #define mnuSend (menu_mnu+4) #define mnuSendEmail (menu_mnu+5) #define mnuSendText (menu_mnu+6) #define mnuSendImage (menu_mnu+7) #define mnuSendBinary (menu_mnu+8) #define mnuCompose (menu_mnu+10) #define mnuConfig (menu_mnu+11) #define mnuHelp (menu_mnu+12) #define mnuHowTo (menu_mnu+13) #define mnuAbout (menu_mnu+14) extern Fl_Input2 *txtMyCall; extern Fl_Input2 *txtBEACONTXT; extern Fl_Spinner2 *spnRetries; extern Fl_Spinner2 *spnWaitTime; extern Fl_Spinner2 *spnTimeout; extern Fl_Spinner2 *spnTxDelay; extern Fl_Spinner2 *spnBcnInterval; extern Fl_Spinner2 *spnIDtimer; extern Fl_ComboBox *choiceBlockSize; extern Fl_Button *btnOK; #include extern Fl_Check_Button *btn_restart_beacon; Fl_Double_Window* arq_configure(); #include "table.h" extern Table *tblOutgoing; extern void sendCancel(); extern Fl_Button *send_Cancel; #include extern void sendOK(); extern Fl_Return_Button *send_OK; Fl_Double_Window* arq_SendSelect(); extern Fl_Input2 *inpMailFrom; extern Fl_Input2 *inpMailTo; extern Fl_Input2 *inpMailSubj; #include "F_Edit.h" extern F_Edit *txtMailText; extern void cb_OpenComposeMail(); extern Fl_Button *btnOpenComposedMail; extern void cb_ClearComposer(); extern Fl_Button *btnClearComposer; extern void cb_UseTemplate(); extern Fl_Button *btnUseTemplate; extern void cb_CancelComposeMail(); extern Fl_Button *btnCancelComposedMail; extern void cb_SaveComposeMail(); extern Fl_Button *btnSaveComposedMail; Fl_Double_Window* arq_composer(); #endif fldigi-4.2.05/src/flarq-src/include/b64.h0000664000175000017500000000116514611711171014636 00000000000000//===================================================================== // // base64 encoding / decoding class // //===================================================================== #include #include #include #include typedef unsigned char byte; class base64 { #define LINELEN 72 private: std::string output; size_t iolen; size_t iocp; bool ateof; byte dtable[256]; byte etable[256]; int linelength; bool crlf; void init(); public: base64(bool t = false) {crlf = t; init(); }; ~base64(){}; std::string encode(std::string in); std::string decode(std::string in); }; fldigi-4.2.05/src/flarq-src/include/xml_server.h0000664000175000017500000000254314532252172016435 00000000000000// --------------------------------------------------------------------- // // xml_server.h, a part of flarq // // Copyflarqht (C) 2016 // Dave Freese, W1HKJ // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with the program; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #ifndef XML_SERVER_H #define XML_SERVER_H #include #include #include #include #ifndef WIN32 #include #include #include #endif #include "status.h" #include #include extern void start_xml_server(int port = 12345); extern void exit_server(); extern bool xml_rx_text_ready; #endif fldigi-4.2.05/src/flarq-src/arqhelp.cxx0000664000175000017500000002133114532252172014627 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef __WOE32__ #include #include #include #endif // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #include #include "flarq.h" #include "arq.h" #include "arqdialogs.h" #include "b64.h" Fl_Help_Dialog *help_dialog = (Fl_Help_Dialog *)0; void help_cb() { if (!help_dialog) { help_dialog = new Fl_Help_Dialog(); help_dialog->value( "\n" "\n" "Flarq Help\n" "\n" "\n" "

Initiating an ARQ connect session

\n" "

Start by sending a 'CQ NBEMS' or some similar unique way of indicating\n" "that you are seeking to send ARQ traffic. Do this from the digital modem\n" "program and not from flarq. The potential station for receiving your ARQ\n" "traffic will answer in the clear. Negotiate what digital mode you will use\n" "for the ARQ connection; ie: PSK-63, PSK-125, PSK-250, MFKS-16 etc. Then\n" "try that mode without ARQ to be sure that QRN and QSB will not seriously\n" "disrupt the connection. Ask the responding station to send an ARQ beacon\n" "using flarq. You will then see his ARQ callsign appear in the callsign\n" "window.

" "

Click the CONNECT button to connect with that station. The text next to\n" "the diamond will change to CONNECTING and remain that way during the connect\n" "time out period. During the connection process the CONNECT button will be\n" "disabled (greyed out).

\n" "

After a connection has been established the button label changes to\n" "'Disconnect' and the text next to the diamond indicator will read CONNECTED.\n" "Pressing this button will then execute an orderly disconnect from the other\n" "station and return the program to the CONNECTED state.

\n" "

During a file transfer the button's label changes to Abort. When the\n" "button says Abort, pressing it will abort the file transfer and the program\n" "will return to the CONNECTED state. During the abort text next to the\n" "diamond indicator will read ABORTING XFR and return to CONNECTED after the\n" "abort has been fully recognized by both ends of the connection.

\n" "

Beaconing

\n" "

Click the Beacon button to transmit a beacon signal requesting\n" "assistance with ARQ message forwarding. The small rectangle on the Beacon\n" "button will turn green when a beacon signal is being sent. The beacon will\n" "repeat at the repeat interval (default is 60 seconds). You should not reduce\n" "the repeat interval so short as to make it impossible to receive an ARQ\n" "connection. This is particularly true on PSK-31.

\n" "

Diamond Indicator

\n" "

The diamond-shaped indicator will be green when ready to transfer messages.\n" "The ""Not Connected"" label next to the diamond indicator will change to Sending\n" "when sending, or Connected when connected.

\n" "

Send Menu

\n" "

The Send menu will not be enabled unless a CONNECTION has been established\n" "with another flarq station.

\n" "

This menu accesses four types of files. When selecting any type, the Show: field\n" "allows you to use the dropdown arrow to choose which type of file to display.

\n" "

The area with the question mark is where file content is displayed, if the Preview\n" "box is checked.

\n" "

The Filename field has a row of buttons above it which can be used to quickly\n" "navigate through the hierarchy of folders shown. Just click the button over the\n" "folder you want to access.

\n" "

When Email is selected, a list of emails waiting to be transferred will be\n" "displayed. Select an email and click the Send button to start transferring the\n" "email.

\n" "

When Image File is selected, Flarq can send a color, passport photo sized\n" "picture, in about 10 minutes using PSK250.

\n" "

Config Menu

\n" "

This menu provides a place where you should enter your callsign that Flarq\n" "will use for transmitting. Various folders are shown and can be changed, but\n" "it is recommended that the default folders be used except in special\n" "circumstances.

\n" "

If you are using the Sylpheed mail client you need to check that box.\n" "Sylpheed uses a different naming convention for storing messages inside of\n" "it's mail folders.

\n" "

The beacon interval is probably the most often changed setting. Use it to\n" "control how often Flarq sends the beacon text.

\n" "

You can enter additional beacon text which will be sent with the each time\n" "the ARQ beacon is transmited.

\n" "

At the bottom left of the Flarq window there is a space on the left side that\n" "displays messages showing the Flarq status at any given time.

\n" "

At the bottom right, there is a space for a progress indicator, which will show\n" "a moving green bar as a message is transferred. When a transfer is completed, the\n" "green color will disappear after filling the space, indicating that transfer has\n" "been completed.

\n" "

Status Bar

\n" "

A notification area in the bar just above the Plain Talk label will show the name\n" "and size of the file being transferred and how long it took to transfer when the\n" "transfer is completed. The left and right arrows are for adjusting the number of\n" "SOH characters preceding each block. Leave it at the default of 10 unless you\n" "have trouble connecting at high speed, or have too many repeat blocks. Then try\n" "higher values to reduce the number of repeated blocks.

\n" "

Next to the right hand arrow is an area where the quality level of the transfer\n" "is shown. A transfer without any retries will be shown as 1.00.

\n" "

The area next to the Clear button will display a progress indicator, which will\n" "show the progress of the transfer. When you are sending a message, it will show\n" "the amount of the message confirmed as being received correctly. When you are on\n" "the receiving end, it will advance as each message frame is received.

\n" "

The Clear button can be used to clear the flarq screen.

\n" "

Plain Talk

\n" "

You can also communicate during, before, or after a file transfer, as long as\n" "the Connected diamond is green (showing that you are connected to the other\n" "station), by typing in the box next to the Clear button at the very bottom of\n" "the flarq window, and pressing Enter. The text you are sending will be shown\n" "in red in the Plain Talk window and incoming text from the other station will\n" "be shown in black. Text you type will be sent out at the first opportunity,\n" "but only after a block completes being sent, so there will be a delay until\n" "your text appears on the other station's Plain Talk window, and the other\n" "station responds. As with most edit controls it is necessary to first put\n" "the keyboard focus in that box by clicking in it with the mouse.

\n" "

The maximum number of characters you can type on the Plain Talk line before\n" "pressing Enter can be no more than 80 characters. In order to make the speed\n" "of Plain Talk text exchanges as rapid as possible, Plain Talk uses the current\n" "mode without any ARQ error checking, so there may be some errors at the\n" "receiving end that would not occur if ARQ were used.

\n" "

The Clear button next to the Plain Talk line can be used to clear the Plain\n" "Talk display area." "\n" ); } help_dialog->show(); } fldigi-4.2.05/src/flarq-src/arqdialogs.fl0000664000175000017500000002550414611711171015123 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0305 header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include } {private local } decl {\#include "flarq.h"} {private local } decl {\#include "flinput2.h"} {public local } decl {\#include "flslider2.h"} {public local } decl {\#include "combo.h"} {public local } Function {arq_dialog()} {} { Fl_Window {} { label flarq callback {arqCLOSE();} open xywh {848 29 515 415} type Double color 50 resizable visible } { Fl_Menu_Bar mnu {open xywh {0 0 516 22} } { Submenu {} { label {&File} open xywh {0 0 70 21} } { MenuItem mnu_nbems_files { label {NBEMS files} callback {open_nbems_file_folder();} xywh {0 0 36 20} divider } MenuItem mnuExit { label {E&xit} callback {arqCLOSE();} xywh {0 0 36 21} } } Submenu mnuSend { label {&Send} open xywh {0 0 70 21} } { MenuItem mnuSendEmail { label Email callback {sendEmailFile();} xywh {0 0 34 21} } MenuItem mnuSendText { label {Text File} callback {sendAsciiFile();} xywh {0 0 36 21} } MenuItem mnuSendImage { label {Image File} callback {sendImageFile();} xywh {0 0 36 21} } MenuItem mnuSendBinary { label {Binary File} callback {sendBinaryFile();} xywh {0 0 36 21} } } MenuItem mnuCompose { label Compose callback {ComposeMail();} xywh {0 0 30 20} code0 {extern void ComposeMail();} } MenuItem mnuConfig { label {&Config} callback {cbMenuConfig();} xywh {0 0 36 21} code0 {extern void cbMenuConfig();} } Submenu mnuHelp { label {&Help} open xywh {0 0 62 20} } { MenuItem mnuHowTo { label {How To} callback {help_cb();} xywh {0 0 30 20} } MenuItem mnuAbout { label {&About} callback {cbMenuAbout();} xywh {5 5 36 21} code0 {extern void cbMenuAbout();} } } } Fl_Group {} {open xywh {0 25 515 60} } { Fl_Group {} {open xywh {0 25 515 31} box ENGRAVED_FRAME } { Fl_Button btnCONNECT { label Connnect callback {arqCONNECT();} tooltip {Connect to other station} xywh {5 28 90 24} color 50 } Fl_Input txtURCALL { tooltip {Connect-to callsign} xywh {97 28 70 24} align 20 class Fl_Input2 } Fl_Light_Button btnBEACON { label Beacon callback {arqBEACON();} tooltip {Beacon ON / OFF} xywh {168 28 79 24} selection_color 2 } Fl_Output txtBeaconing { label {output:} xywh {249 28 261 24} box FLAT_BOX color 50 align 20 resizable code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } } Fl_Group {} {open xywh {0 54 515 31} box ENGRAVED_FRAME } { Fl_Box indCONNECT { tooltip {ARQ state} xywh {5 60 18 18} box DIAMOND_DOWN_BOX color 50 labelfont 13 align 24 } Fl_Output txtState { label Disconnecting xywh {27 57 483 24} box FLAT_BOX color 50 align 20 resizable code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } } } Fl_Text_Display txtARQ { xywh {0 87 515 117} box DOWN_BOX textfont 4 resizable code0 {\#include "FTextView.h"} class FTextView } Fl_Group {} {open xywh {0 206 516 26} box DOWN_BOX } { Fl_Output txtStatus { tooltip {Status messages} xywh {5 208 220 22} align 20 resizable code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } Fl_Output txtStatus2 { xywh {225 208 170 22} align 20 code0 {o->type(FL_NORMAL_OUTPUT);} class Fl_Input2 } Fl_Progress prgStatus { tooltip {Tx/Rx ARQ file transfer progress} xywh {395 210 70 18} selection_color 70 labelfont 1 code0 {o->minimum(0.0);} code1 {o->maximum(1.0);} } Fl_Button btnClearText { label Clear callback {cbClearText();} xywh {468 210 45 20} } } Fl_Group {} { label {Plain Talk} open xywh {0 235 515 180} box ENGRAVED_FRAME align 21 } { Fl_Text_Display txtRX { xywh {5 255 505 130} box DOWN_BOX textfont 4 resizable class FTextView } Fl_Group {} {open xywh {0 387 515 28} box ENGRAVED_FRAME } { Fl_Input txtTX { label {input:} callback {cbSendTalk();} tooltip {Plain talk text - ENTER to send} xywh {5 390 450 22} align 0 when 8 resizable code0 {txtTX->value("");} code1 {txtTX->maximum_size(80);} class Fl_Input2 } Fl_Button btnSendTalk { label Clear callback {cbClearTalk();} xywh {460 390 49 22} } } } } } Function {arq_configure()} {open } { Fl_Window {} { label {Configure flarq} open xywh {658 503 480 190} type Double resizable visible } { Fl_Input txtMyCall { label {My Call:} callback {changeMyCall(o->value());} xywh {98 13 150 22} code0 {o->value(MyCall.c_str());} class Fl_Input2 } Fl_Input txtBEACONTXT { label {Beacon Text} callback {changeBeaconText(o->value());} tooltip {Text for the beacon 64 chars max} xywh {98 42 370 22} resizable code0 {o->value(beacontext.c_str());} class Fl_Input2 } Fl_Spinner spnRetries { label {Retries:} callback {iretries = (int)o->value(); cbSetConfig();} tooltip {\# retries before connection declared down} xywh {146 71 45 22} code0 {o->minimum(2);} code1 {o->maximum(20);} code2 {o->step(1);} code3 {o->value(iretries);} class Fl_Spinner2 } Fl_Spinner spnWaitTime { label {Wait time (sec):} callback {iwaittime = (int)(1000 * o->value()); cbSetConfig();} tooltip {Time between retries} xywh {121 98 70 22} code0 {o->minimum(10);} code1 {o->maximum(30);} code2 {o->step(5);} code3 {o->value(iwaittime/1000);} class Fl_Spinner2 } Fl_Spinner spnTimeout { label {Timeout (sec):} callback {itimeout = (int)(o->value() * 1000.0); cbSetConfig();} tooltip {Time out for dead connection} xywh {121 126 70 22} code0 {o->minimum(30);} code1 {o->maximum(300);} code2 {o->step(15);} code3 {o->value(itimeout / 1000);} class Fl_Spinner2 } Fl_Spinner spnTxDelay { label {Tx delay (msec):} callback {txdelay = (int)o->value(); cbSetConfig();} tooltip {delay from Rx to Tx} xywh {317 126 70 22} code0 {o->minimum(200);} code1 {o->maximum(2000);} code2 {o->step(100);} code3 {o->value(txdelay);} class Fl_Spinner2 } Fl_Spinner spnBcnInterval { label {Beacon interval (sec)} callback {bcnInterval = (int)o->value(); cbSetConfig();} tooltip {Time between beacon transmissions} xywh {398 71 70 22} value 120 code0 {o->minimum(60); o->maximum(3600);} code1 {o->step(30);} code2 {o->value(bcnInterval);} class Fl_Spinner2 } Fl_Spinner spnIDtimer { label {ID timer (min):} callback {idtimer = (int)(o->value()); cb_idtimer();} tooltip {ID timer\\n0 = disable} xywh {121 155 70 22} minimum 0 maximum 10 value 10 code0 {o->minimum(0);} code1 {o->maximum(10);} code2 {o->step(1);} code3 {o->value(idtimer);} class Fl_Spinner2 } Fl_Group choiceBlockSize { label {Block Size:} callback {exponent = (int)o->index() + 4; cbSetConfig();} open selected xywh {314 155 72 22} box DOWN_BOX color 7 align 4 class Fl_ComboBox } {} Fl_Button btnOK { label Ok callback {closeConfig();} xywh {406 154 62 24} } Fl_Check_Button btn_restart_beacon { label {Restart Beacon} callback {restart_beacon = (int)(o->value()); cbSetConfig();} tooltip {Restart beacon after disconnect} xywh {448 101 20 20} down_box DOWN_BOX align 4 code0 {o->value(restart_beacon);} } } } Function {arq_SendSelect()} {} { Fl_Window {} { label {Select Email} open xywh {768 532 500 170} type Double hide resizable modal } { Fl_Box tblOutgoing { xywh {0 3 500 140} box DOWN_BOX color 7 selection_color 246 align 16 code0 {\#include "table.h"} class Table } Fl_Button send_Cancel { label Cancel callback {sendCancel();} xywh {335 145 70 20} code0 {extern void sendCancel();} } Fl_Return_Button send_OK { label OK callback {sendOK();} xywh {420 145 72 20} code0 {extern void sendOK();} } } } Function {arq_composer()} {} { Fl_Window {} { label {Flarq Mail Composer} open xywh {848 430 515 300} type Double hide resizable } { Fl_Input inpMailFrom { label From xywh {47 5 460 24} class Fl_Input2 } Fl_Input inpMailTo { label To xywh {48 32 460 24} class Fl_Input2 } Fl_Input inpMailSubj { label Subj xywh {48 59 460 24} class Fl_Input2 } Fl_Text_Editor txtMailText { xywh {0 85 510 188} textfont 4 resizable code0 {\#include "F_Edit.h"} class F_Edit } Fl_Group {} {open xywh {0 274 515 28} } { Fl_Button btnOpenComposedMail { label Open callback {cb_OpenComposeMail();} tooltip {Open existing Composed email} xywh {4 278 70 20} code0 {extern void cb_OpenComposeMail();} } Fl_Box {} { xywh {75 278 5 20} } Fl_Button btnClearComposer { label Clear callback {cb_ClearComposer();} tooltip {Clear all fields} xywh {81 278 70 20} code0 {extern void cb_ClearComposer();} } Fl_Box {} { xywh {152 278 5 20} } Fl_Button btnUseTemplate { label Template callback {cb_UseTemplate();} tooltip {Use template file} xywh {159 278 70 20} code0 {extern void cb_UseTemplate();} } Fl_Box {} { xywh {230 278 127 20} resizable } Fl_Button btnCancelComposedMail { label Cancel callback {cb_CancelComposeMail();} tooltip {Close Dialog} xywh {358 278 70 20} code0 {extern void cb_CancelComposeMail();} } Fl_Box {} { xywh {429 278 5 20} } Fl_Button btnSaveComposedMail { label Save callback {cb_SaveComposeMail();} tooltip {Save this message (shift click Save Template)} xywh {436 278 70 20} code0 {extern void cb_SaveComposeMail();} } } } } fldigi-4.2.05/src/flarq-src/flarqrc.rc0000664000175000017500000000040014532252172014421 00000000000000#define BUILD_FLARQ 1 #include "config.h" #define IDI_ICON 101 IDI_ICON ICON DISCARDABLE "flarq.ico" #define RC_FILE_VERSION_QUAD FLARQ_VERSION_MAJOR,FLARQ_VERSION_MINOR,0,0 #define RC_FILE_DESCRIPTION "Fast Light ARQ Application" #include "common.rc" fldigi-4.2.05/src/flarq-src/b64.cxx0000664000175000017500000001260514611711171013567 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- //===================================================================== // // base64 encoding / decoding class // // To create a standalone base64 encode/coder: // g++ -DTEST b64.cxx -o base64 // // To use in a calling program: // // base64 b64; // default no CRLF's in output file // base 64 b64(true); // insert CRLF's in output file // pass c++ string into encoder / decoder // return value is encoded / decoded string // original string is left unchanged // // string instr, outstr; // outstr = b64.encoder(instr); // outstr = b64.decoder(instr); //===================================================================== #ifdef HAVE_CONFIG_H # include #endif #include "b64.h" void base64::init() { iolen = 0; iocp = 0; ateof = false; linelength = 0; // create the etable for encoding for (int i = 0; i < 9; i++) { etable[i] = 'A' + i; etable[i + 9] = 'J' + i; etable[26 + i] = 'a' + i; etable[26 + i + 9] = 'j' + i; } for (int i = 0; i < 8; i++) { etable[i + 18] = 'S' + i; etable[26 + i + 18] = 's' + i; } for (int i = 0; i < 10; i++) etable[52 + i] = '0' + i; etable[62] = '+'; etable[63] = '/'; // create the dtable for decoding for (int i= 0; i < 255; i++) dtable[i] = 0x80; for (int i = 'A'; i <= 'I'; i++) dtable[i] = 0 + (i - 'A'); for (int i = 'J'; i <= 'R'; i++) dtable[i] = 9 + (i - 'J'); for (int i = 'S'; i <= 'Z'; i++) dtable[i] = 18 + (i - 'S'); for (int i = 'a'; i <= 'i'; i++) dtable[i] = 26 + (i - 'a'); for (int i = 'j'; i <= 'r'; i++) dtable[i] = 35 + (i - 'j'); for (int i = 's'; i <= 'z'; i++) dtable[i] = 44 + (i - 's'); for (int i = '0'; i <= '9'; i++) dtable[i] = 52 + (i - '0'); dtable[(int)'+'] = 62; dtable[(int)'/'] = 63; dtable[(int)'='] = 0; } std::string base64::encode(std::string in) { int n; byte igroup[3], ogroup[4]; output = ""; iocp = 0; ateof = false; if (crlf) linelength = 0; iolen = in.length(); while (!ateof) { igroup[0] = igroup[1] = igroup[2] = 0; for (n = 0; n < 3; n++) { if (iocp == iolen) { ateof = true; break; } igroup[n] = (byte)in[iocp]; iocp++; } if (n > 0) { ogroup[0] = etable[igroup[0] >> 2]; ogroup[1] = etable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)]; ogroup[2] = etable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)]; ogroup[3] = etable[igroup[2] & 0x3F]; if (n < 2) { ogroup[2] = '='; if (n < 1) { ogroup[2] = '='; } } for (int i = 0; i < 4; i++) { if (crlf) if (linelength >= LINELEN) { // output += '\r'; output += '\n'; linelength = 0; } output += (byte)ogroup[i]; if (crlf) linelength++; } } } if (crlf) { // output += '\r'; output += '\n'; } return output; } std::string base64::decode(std::string in) { int i; output = ""; iocp = 0; iolen = in.length(); byte c; while (iocp < iolen) { byte a[4], b[4], o[3]; for (i = 0; i < 4; i++) { if (iocp == iolen) { output = "b64 file length error.\n"; return output; } c = in[iocp++]; while (c <= ' ') { if (iocp == iolen) { return output; } c = in[iocp++]; } if (dtable[c] & 0x80) { output = "Illegal character in b64 file.\n"; return output; } a[i] = c; b[i] = (byte)dtable[c]; } o[0] = (b[0] << 2) | (b[1] >> 4); o[1] = (b[1] << 4) | (b[2] >> 2); o[2] = (b[2] << 6) | b[3]; output += o[0]; if (a[2] != '=') { output += o[1]; if (a[3] != '=') output += o[2]; } } return output; } #ifdef TEST #include #include void usage(void) { printf("b64 -- Encode/decode file as base64. Call:\n"); printf(" b64 e/d < infile > outfile\n"); } int main(int argc,char*argv[]) { char opt; bool decoding = false; char * cp; byte c; std::string inputstring; std::string infilename; std::string outputstring; std::string outfilename; base64 b64; if (argc < 2) { usage(); return(0); } opt = *(argv[1]); if (opt == 'd' || opt == 'D') { while (!std::cin.eof()) { c = std::cin.get(); if (!std::cin.eof()) inputstring += c; } outputstring = b64.decode( inputstring ); size_t len = outputstring.length(); for (size_t n = 0; n < len; n++) std::cout << (unsigned char)outputstring[n]; } else if (opt == 'e' || opt == 'E') { while (!std::cin.eof()) { c = std::cin.get(); if (!std::cin.eof()) inputstring += c; } outputstring = b64.encode( inputstring ); size_t len = outputstring.length(); for (size_t n = 0; n < len; n++) std::cout << (unsigned char)outputstring[n]; } else usage(); return 0; } #endif fldigi-4.2.05/src/flarq-src/flarqenv.cxx0000664000175000017500000002131514611711171015010 00000000000000// ---------------------------------------------------------------------------- // flarqenv.cxx // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #ifdef __MINGW32__ # include "compat.h" #endif #if HAVE_SYS_UTSNAME_H # include #endif #include #include #include #include "stacktrace.h" #include "flarq.h" std::string option_help, version_text, build_text; extern std::string arq_address, arq_port; extern bool ioMPSK; extern bool SHOWDEBUG; void generate_option_help(void) { std::ostringstream help; help << "Usage:\n" << " " << PACKAGE_NAME << " [option...]\n\n"; help << PACKAGE_NAME << " options:\n\n" << " --arq-protocol TYPE\n" << " Set the ARQ protocol\n" << " May be either ``fldigi'' or ``multipsk''\n" << " The default is: " << (ioMPSK ? "multipsk" : "fldigi") << "\n\n" << " --arq-server-address HOSTNAME\n" << " Set the ARQ TCP server address\n" << " The default is: " << arq_address << "\n\n" << " --arq-server-port PORT\n" << " Set the ARQ TCP server port\n" << " The default is: " << arq_port << "\n\n" << " --version\n" << " Print version information\n\n" << " --build-info\n" << " Print build information\n\n" << " --help\n" << " Print this option help\n\n"; // Fl::help looks ugly so we'll write our own help << "Standard FLTK options:\n\n" << " -bg COLOR, -background COLOR\n" << " Set the background color\n" << " -bg2 COLOR, -background2 COLOR\n" << " Set the secondary (text) background color\n\n" << " -di DISPLAY, -display DISPLAY\n" << " Set the X display to use DISPLAY,\n" << " format is ``host:n.n''\n\n" << " -dn, -dnd or -nodn, -nodnd\n" << " Enable or disable drag and drop copy and paste in text fields\n\n" << " -fg COLOR, -foreground COLOR\n" << " Set the foreground color\n\n" << " -g GEOMETRY, -geometry GEOMETRY\n" << " Set the initial window size and position\n" << " GEOMETRY format is ``WxH+X+Y''\n" << " ** " << PACKAGE_NAME << " may override this setting **\n\n" << " -i, -iconic\n" << " Start " << PACKAGE_NAME << " in iconified state\n\n" << " -k, -kbd or -nok, -nokbd\n" << " Enable or disable visible keyboard focus in non-text widgets\n\n" << " -na CLASSNAME, -name CLASSNAME\n" << " Set the window class to CLASSNAME\n\n" << " -ti WINDOWTITLE, -title WINDOWTITLE\n" << " Set the window title\n\n"; help << "Additional UI options:\n\n" << " --font FONT[:SIZE]\n" << " Set the widget font and (optionally) size\n" << " The default is: " << Fl::get_font(FL_HELVETICA) << ':' << FL_NORMAL_SIZE << "\n\n"; option_help = help.str(); } int parse_args(int argc, char** argv, int& idx) { // Only handle long options if ( !(strlen(argv[idx]) >= 2 && strncmp(argv[idx], "--", 2) == 0) ) return 0; enum { OPT_ZERO, #ifndef __WOE32__ OPT_RX_IPC_KEY, OPT_TX_IPC_KEY, #endif OPT_ARQ_PROTOCOL, OPT_ARQ_ADDRESS, OPT_ARQ_PORT, OPT_FONT, OPT_DEBUG, OPT_DEPRECATED, OPT_HELP, OPT_VERSION, OPT_BUILD_INFO }; const char shortopts[] = "+"; struct option longopts[] = { #ifndef __WOE32__ { "rx-ipc-key", 1, 0, OPT_RX_IPC_KEY }, { "tx-ipc-key", 1, 0, OPT_TX_IPC_KEY }, #endif { "arq-protocol", 1, 0, OPT_ARQ_PROTOCOL }, { "arq-server-address", 1, 0, OPT_ARQ_ADDRESS }, { "arq-server-port", 1, 0, OPT_ARQ_PORT }, { "font", 1, 0, OPT_FONT }, { "help", 0, 0, OPT_HELP }, { "version", 0, 0, OPT_VERSION }, { "build-info", 0, 0, OPT_BUILD_INFO }, { 0 } }; int longindex; optind = idx; int c = getopt_long(argc, argv, shortopts, longopts, &longindex); switch (c) { case -1: return 0; case 0: // handle options with non-0 flag here return 0; case OPT_ARQ_PROTOCOL: if (!strcmp(optarg, "fldigi")) ioMPSK = false; else if (!strcmp(optarg, "multipsk")) ioMPSK = true; else { std::cerr << "E: unknown protocol type\n"; exit(EXIT_FAILURE); } break; case OPT_ARQ_ADDRESS: arq_address = optarg; break; case OPT_ARQ_PORT: arq_port = optarg; break; case OPT_FONT: { char *p; if ((p = strchr(optarg, ':'))) { *p = '\0'; FL_NORMAL_SIZE = strtol(p + 1, 0, 10); } Fl::set_font(FL_HELVETICA, optarg); break; } case OPT_DEBUG: SHOWDEBUG = true; break; case OPT_DEPRECATED: std::cerr << "W: the --" << longopts[longindex].name << " option has been deprecated and will be removed in a future version\n"; break; case OPT_HELP: std::cout << option_help; exit(EXIT_SUCCESS); case OPT_VERSION: std::cout << version_text; exit(EXIT_SUCCESS); case OPT_BUILD_INFO: std::cout << build_text; exit(EXIT_SUCCESS); case '?': default: std::cerr << "Try `" << PACKAGE_NAME << " --help' for more information.\n"; exit(EXIT_FAILURE); } // Increment idx by the number of args we used and return that number. // We must check whether the option argument is in the same argv element // as the option name itself, i.e., --opt=arg. c = longopts[longindex].has_arg ? 2 : 1; if (c == 2) { std::string arg = argv[idx]; std::string::size_type p; if ((p = arg.rfind(optarg)) != std::string::npos && arg[p-1] == '=') c = 1; } idx += c; return c; } void set_platform_ui(void) { #if defined(__APPLE__) FL_NORMAL_SIZE = 12; #elif defined(__WOE32__) Fl::set_font(FL_HELVETICA, "Tahoma"); FL_NORMAL_SIZE = 11; #else FL_NORMAL_SIZE = 12; #endif } void generate_version_text(void) { version_text.assign(PACKAGE_STRING "\nCopyright (C) 2008, 2009 " PACKAGE_AUTHORS ".\n"); version_text.append("License GPLv3+: GNU GPL version 3 or later " "\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n"); std::ostringstream s; s << "Build information:\n"; s << " built : " << BUILD_DATE << " by " << BUILD_USER << '@' << BUILD_HOST << " on " << BUILD_BUILD_PLATFORM << " for " << BUILD_TARGET_PLATFORM << "\n\n" << " configure flags: " << BUILD_CONFIGURE_ARGS << "\n\n" << " compiler : " << BUILD_COMPILER << "\n\n" << " compiler flags : " << FLARQ_BUILD_CXXFLAGS << "\n\n" << " linker flags : " << FLARQ_BUILD_LDFLAGS << "\n\n" << " libraries : " "FLTK " FLTK_BUILD_VERSION "\n"; s << "\nRuntime information:\n"; struct utsname u; if (uname(&u) != -1) { s << " system : " << u.sysname << ' ' << u.nodename << ' ' << u.release << ' ' << u.version << ' ' << u.machine << "\n\n"; } build_text = s.str(); } void setup_signal_handlers(void) { #ifndef __WOE32__ struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); // no child stopped notifications, no zombies action.sa_handler = SIG_DFL; action.sa_flags = SA_NOCLDSTOP; #ifdef SA_NOCLDWAIT action.sa_flags |= SA_NOCLDWAIT; #endif sigaction(SIGCHLD, &action, NULL); action.sa_flags = 0; action.sa_handler = handle_signal; sigaction(SIGSEGV, &action, NULL); sigaction(SIGILL, &action, NULL); sigaction(SIGABRT, &action, NULL); sigaction(SIGUSR2, &action, NULL); action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &action, NULL); sigemptyset(&action.sa_mask); sigaddset(&action.sa_mask, SIGUSR2); pthread_sigmask(SIG_BLOCK, &action.sa_mask, NULL); #else signal(SIGSEGV, handle_signal); signal(SIGILL, handle_signal); signal(SIGABRT, handle_signal); #endif } fldigi-4.2.05/src/flarq-src/xml_server.cxx0000664000175000017500000001354314611711171015364 00000000000000// --------------------------------------------------------------------- // // xml_server.cxx, a part of flarq // // Copyflarqht (C) 2016 // Dave Freese, W1HKJ // // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with the program; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "arq.h" #include "flarq.h" #include "xml_server.h" #include "xmlrpcpp/XmlRpc.h" using namespace XmlRpc; // The server XmlRpcServer flarq_server; //---------------------------------------------------------------------- // get interface //---------------------------------------------------------------------- bool xml_rx_text_ready = false; //---------------------------------------------------------------------- // Request for flarq version //---------------------------------------------------------------------- class flarq_get_version : public XmlRpcServerMethod { public: flarq_get_version(XmlRpcServer* s) : XmlRpcServerMethod("flarq.get_version", s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { result = VERSION; } std::string help() { return std::string("returns version number of flarq"); } } flarq_get_version(&flarq_server); //---------------------------------------------------------------------- // Request for ARQ state //---------------------------------------------------------------------- class flarq_get_state : public XmlRpcServerMethod { public: flarq_get_state(XmlRpcServer* s) : XmlRpcServerMethod("flarq.get_state", s) {} // x00 - unconnected // x81 - connected // x82 - sending // x83 - receiving // x84 - send completed // x85 - recv completed void execute(XmlRpcValue& params, XmlRpcValue& result) { int state = 0; if (arqstate != ARQ_CONNECTED) state = 0; else if (sendingfile) state = 0x82; else if (rxARQfile) state = 0x83; else if (xml_rx_text_ready) state = 0x85; else state = 0x81; result = state; } std::string help() { return std::string("returns state of connection"); } } flarq_get_state(&flarq_server); //---------------------------------------------------------------------- // Request for received text //---------------------------------------------------------------------- class flarq_rcvd_text : public XmlRpcServerMethod { public: flarq_rcvd_text(XmlRpcServer* s) : XmlRpcServerMethod("flarq.rcvd_text", s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { std::string result_string = "none"; if (xml_rx_text_ready) result_string = txtarqload; xml_rx_text_ready = false; result = result_string; txtarqload = ""; } std::string help() { return std::string("returns received text"); } } flarq_rcvd_text(&flarq_server); //---------------------------------------------------------------------- // set interface //---------------------------------------------------------------------- //------------------------------------------------------------------------------ // Send text //------------------------------------------------------------------------------ class flarq_send_text : public XmlRpcServerMethod { public: flarq_send_text(XmlRpcServer* s) : XmlRpcServerMethod("flarq.send_text", s) {} void execute(XmlRpcValue& params, XmlRpcValue &result) { std::string txt_to_send = std::string(params[0]); send_xml_text("FLMSG_XFR", txt_to_send); } std::string help() { return std::string("send_text"); } } flarq_send_text(&flarq_server); struct MLIST { std::string name; std::string signature; std::string help; } mlist[] = { { "flarq.rcvd_text", "s:n", "return MODE of current VFO" }, { "flarq.get_state", "s:n", "return PTT state" }, { "flarq.send_text", "i:i", "set MODE iaw MODE table" } }; class flarq_list_methods : public XmlRpcServerMethod { public: flarq_list_methods(XmlRpcServer *s) : XmlRpcServerMethod("flarq.list_methods", s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { std::vector methods; for (size_t n = 0; n < sizeof(mlist) / sizeof(*mlist); ++n) { XmlRpcValue::ValueStruct item; item["name"] = mlist[n].name; item["signature"] = mlist[n].signature; item["help"] = mlist[n].help; methods.push_back(item); } result = methods; } std::string help() { return std::string("get flarq methods"); } } flarq_list_methods(&flarq_server); //------------------------------------------------------------------------------ // support thread xmlrpc clients //------------------------------------------------------------------------------ pthread_t *xml_thread = 0; void * xml_thread_loop(void *d) { for(;;) { flarq_server.work(-1.0); } return NULL; } void start_xml_server(int port) { XmlRpc::setVerbosity(0); // Create the server socket on the specified port flarq_server.bindAndListen(port); // Enable introspection flarq_server.enableIntrospection(true); xml_thread = new pthread_t; if (pthread_create(xml_thread, NULL, xml_thread_loop, NULL)) { perror("pthread_create"); exit(EXIT_FAILURE); } } void exit_server() { flarq_server.exit(); } fldigi-4.2.05/src/rtty/0000775000175000017500000000000014611714005011633 500000000000000fldigi-4.2.05/src/rtty/rtty.cxx0000664000175000017500000011225214611711171013305 00000000000000// ---------------------------------------------------------------------------- // rtty.cxx -- RTTY modem // // Copyright (C) 2012 // Dave Freese, W1HKJ // Stefan Fendt, DL1SMF // // This file is part of fldigi. // // This code bears some resemblance to code contained in gmfsk from which // it originated. Much has been changed, but credit should still be // given to Tomi Manninen (oh2bns@sral.fi), who so graciously distributed // his gmfsk modem under the GPL. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "view_rtty.h" #include "fl_digi.h" #include "digiscope.h" #include "misc.h" #include "waterfall.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "digiscope.h" #include "trx.h" #include "debug.h" #include "synop.h" #include "main.h" #include "modem.h" #include "threads.h" #include "rtty.h" #include "fsk.h" #define FILTER_DEBUG 0 #define SHAPER_BAUD 150 //===================================================================== // Baudot support //===================================================================== static char letters[32] = { '\0', 'E', '\n', 'A', ' ', 'S', 'I', 'U', '\r', 'D', 'R', 'J', 'N', 'F', 'C', 'K', 'T', 'Z', 'L', 'W', 'H', 'Y', 'P', 'Q', 'O', 'B', 'G', ' ', 'M', 'X', 'V', ' ' }; /* * U.S. version of the figures case. */ static char figures[32] = { '\0', '3', '\n', '-', ' ', '\a', '8', '7', '\r', '$', '4', '\'', ',', '!', ':', '(', '5', '"', ')', '2', '#', '6', '0', '1', '9', '?', '&', ' ', '.', '/', ';', ' ' }; int dspcnt = 0; static char msg1[20]; const double rtty::SHIFT[] = {23, 85, 160, 170, 182, 200, 240, 350, 425, 850}; // FILTLEN must be same size as BAUD const double rtty::BAUD[] = {45, 45.45, 50, 56, 75, 100, 110, 150, 200, 300}; const int rtty::FILTLEN[] = { 512, 512, 512, 512, 512, 512, 512, 256, 128, 64}; const int rtty::BITS[] = {5, 7, 8}; const int rtty::numshifts = (int)(sizeof(SHIFT) / sizeof(*SHIFT)); const int rtty::numbauds = (int)(sizeof(BAUD) / sizeof(*BAUD)); void rtty::tx_init() { phaseacc = 0; preamble = true; videoText(); symbols = 0; acc_symbols = 0; ovhd_symbols = 0; } // Customizes output of Synop decoded data. struct rtty_callback : public synop_callback { // Callback for writing decoded synop messages. void print(const char * str, size_t nb, bool bold ) const { // Could choose: FTextBase::CTRL,XMIT,RECV int style = bold ? FTextBase::XMIT : FTextBase::RECV; for( size_t i = 0; i < nb; ++i ) { unsigned char c = str[i]; put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c, style ); } } // Should we log new Synop messages to the current Adif log file ? bool log_adif(void) const { return progdefaults.SynopAdifDecoding ;} // Should we log new Synop messages to KML file ? bool log_kml(void) const { return progdefaults.SynopKmlDecoding ;} bool interleaved(void) const { return progdefaults.SynopInterleaved ;} }; void rtty::rx_init() { rxstate = RTTY_RX_STATE_IDLE; rxmode = LETTERS; phaseacc = 0; FSKphaseacc = 0; for (int i = 0; i < MAXBITS; i++ ) bit_buf[i] = 0.0; mark_phase = 0; space_phase = 0; xy_phase = 0.0; mark_mag = 0; space_mag = 0; mark_env = 0; space_env = 0; inp_ptr = 0; lastchar = 0; // Synop file is reloaded each time we enter this modem. Ideally do that when the file is changed. static bool wmo_loaded = false ; if( wmo_loaded == false ) { wmo_loaded = true ; SynopDB::Init(PKGDATADIR); } /// Used by weather reports decoding. synop::setup(); synop::instance()->init(); } void rtty::init() { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); // Probably not necessary because similar to modem::set_reverse reverse = wfrev ^ !wfsb; stopflag = false; if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.RTTYsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); rx_init(); put_MODEstatus(mode); if ((rtty_baud - (int)rtty_baud) == 0) snprintf(msg1, sizeof(msg1), "%-3.0f/%-4.0f", rtty_baud, rtty_shift); else snprintf(msg1, sizeof(msg1), "%-4.2f/%-4.0f", rtty_baud, rtty_shift); put_Status1(msg1); if (progdefaults.PreferXhairScope) set_scope_mode(Digiscope::XHAIRS); else set_scope_mode(Digiscope::RTTY); for (int i = 0; i < MAXPIPE; i++) mark_history[i] = space_history[i] = cmplx(0,0); lastchar = 0; } rtty::~rtty() { if (rttyviewer) delete rttyviewer; if (mark_filt) delete mark_filt; if (space_filt) delete space_filt; if (pipe) delete [] pipe; if (dsppipe) delete [] dsppipe; if (bits) delete bits; delete m_Osc1; delete m_Osc2; delete m_SymShaper1; delete m_SymShaper2; if (fsk_tty) { delete fsk_tty; fsk_tty = 0; } } void rtty::reset_filters() { delete mark_filt; mark_filt = new fftfilt(rtty_baud/samplerate, filter_length); mark_filt->rtty_filter(rtty_baud/samplerate); delete space_filt; space_filt = new fftfilt(rtty_baud/samplerate, filter_length); space_filt->rtty_filter(rtty_baud/samplerate); } void rtty::restart() { double stl; rtty_shift = shift = (progdefaults.rtty_shift < numshifts ? SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); if (progdefaults.rtty_baud > numbauds - 1) progdefaults.rtty_baud = numbauds - 1; rtty_baud = BAUD[progdefaults.rtty_baud]; filter_length = FILTLEN[progdefaults.rtty_baud]; nbits = rtty_bits = BITS[progdefaults.rtty_bits]; if (rtty_bits == 5) rtty_parity = RTTY_PARITY_NONE; else switch (progdefaults.rtty_parity) { case 0 : rtty_parity = RTTY_PARITY_NONE; break; case 1 : rtty_parity = RTTY_PARITY_EVEN; break; case 2 : rtty_parity = RTTY_PARITY_ODD; break; case 3 : rtty_parity = RTTY_PARITY_ZERO; break; case 4 : rtty_parity = RTTY_PARITY_ONE; break; default : rtty_parity = RTTY_PARITY_NONE; break; } shift_state = LETTERS; rxmode = LETTERS; symbollen = (int) (samplerate / rtty_baud + 0.5); set_bandwidth(shift); rtty_BW = progdefaults.RTTY_BW = rtty_baud * 2; wf->redraw_marker(); reset_filters(); if (bits) bits->setLength(symbollen / 8);//2); else bits = new Cmovavg(symbollen / 8);//2); mark_noise = space_noise = 0; bit = nubit = true; // stop length = 1, 1.5 or 2 bits rtty_stop = progdefaults.rtty_stop; if (rtty_stop == 0) stl = 1.0; else if (rtty_stop == 1) stl = 1.5; else stl = 2.0; stoplen = (int) (stl * samplerate / rtty_baud + 0.5); freqerr = 0.0; pipeptr = 0; for (int i = 0; i < MAXBITS; i++ ) bit_buf[i] = 0.0; metric = 0.0; if ((rtty_baud - (int)rtty_baud) == 0) snprintf(msg1, sizeof(msg1), "%-3.0f/%-4.0f", rtty_baud, rtty_shift); else snprintf(msg1, sizeof(msg1), "%-4.2f/%-4.0f", rtty_baud, rtty_shift); put_Status1(msg1); put_MODEstatus(mode); for (int i = 0; i < MAXPIPE; i++) QI[i] = cmplx(0.0, 0.0); sigpwr = 0.0; noisepwr = 0.0; sigsearch = 0; dspcnt = 2*(nbits + 2); clear_zdata = true; // restart symbol-rtty_shaper m_SymShaper1->Preset(rtty_baud, samplerate); m_SymShaper2->Preset(rtty_baud, samplerate); mark_phase = 0; space_phase = 0; xy_phase = 0.0; mark_mag = 0; space_mag = 0; mark_env = 0; space_env = 0; inp_ptr = 0; for (int i = 0; i < MAXPIPE; i++) mark_history[i] = space_history[i] = cmplx(0,0); if (rttyviewer) rttyviewer->restart(); progStatus.rtty_filter_changed = false; } void rtty::resetFSK() { delete fsk_tty; fsk_tty = 0; if (progdefaults.useFSK) { fsk_tty = new FSK; if (progdefaults.fsk_shares_port) { fsk_tty->fsk_shares_port(&rigio); } else if (!progdefaults.fsk_port.empty()) { fsk_tty->open_port(progdefaults.fsk_port); } fsk_tty->shift_on_space(progdefaults.fsk_shift_on_space); fsk_tty->reverse(progdefaults.fsk_reverse); if (progdefaults.fsk_on_dtr) fsk_tty->dtr(true); else fsk_tty->rts(true); sig_start = true; } } rtty::rtty(trx_mode tty_mode) { cap |= CAP_AFC | CAP_REV; mode = tty_mode; samplerate = RTTY_SampleRate; mark_filt = (fftfilt *)0; space_filt = (fftfilt *)0; bits = (Cmovavg *)0; pipe = new double[MAXPIPE]; dsppipe = new double [MAXPIPE]; rttyviewer = new view_rtty(mode); m_Osc1 = new Oscillator( samplerate ); m_Osc2 = new Oscillator( samplerate ); m_SymShaper1 = new SymbolShaper( 45, samplerate ); m_SymShaper2 = new SymbolShaper( 45, samplerate ); fsk_tty = 0; resetFSK(); restart(); } void rtty::Update_syncscope() { int j; for (int i = 0; i < symbollen; i++) { j = pipeptr - i; if (j < 0) j += symbollen; dsppipe[i] = pipe[j]; } set_scope(dsppipe, symbollen, false); } void rtty::Clear_syncscope() { set_scope(0, 0, false); } cmplx rtty::mixer(double &phase, double f, cmplx in) { cmplx z = cmplx( cos(phase), sin(phase)) * in; phase -= TWOPI * f / samplerate; if (phase < -TWOPI) phase += TWOPI; return z; } unsigned char rtty::Bit_reverse(unsigned char in, int n) { unsigned char out = 0; for (int i = 0; i < n; i++) out = (out << 1) | ((in >> i) & 1); return out; } static int rparity(int c) { int w = c; int p = 0; while (w) { p += (w & 1); w >>= 1; } return p & 1; } int rttyparity(unsigned int c, int nbits) { c &= (1 << nbits) - 1; switch (progdefaults.rtty_parity) { default: case rtty::RTTY_PARITY_NONE: return 0; case rtty::RTTY_PARITY_ODD: return rparity(c); case rtty::RTTY_PARITY_EVEN: return !rparity(c); case rtty::RTTY_PARITY_ZERO: return 0; case rtty::RTTY_PARITY_ONE: return 1; } } int rtty::decode_char() { unsigned int parbit, par, data; parbit = (rxdata >> nbits) & 1; par = rttyparity(rxdata, nbits); if (rtty_parity != RTTY_PARITY_NONE && parbit != par) return 0; data = rxdata & ((1 << nbits) - 1); if (nbits == 5) return baudot_dec(data); return data; } bool rtty::is_mark_space( int &correction) { correction = 0; // test for rough bit position if (bit_buf[0] && !bit_buf[symbollen-1]) { // test for mark/space straddle point for (int i = 0; i < symbollen; i++) correction += bit_buf[i]; if (abs(symbollen/2 - correction) < 6) // too small & bad signals are not decoded return true; } return false; } bool rtty::is_mark() { return bit_buf[symbollen / 2]; } bool rtty::rx(bool bit) // original modified for probability test { bool flag = false; unsigned char c = 0; int correction; for (int i = 1; i < symbollen; i++) bit_buf[i-1] = bit_buf[i]; bit_buf[symbollen - 1] = bit; switch (rxstate) { case RTTY_RX_STATE_IDLE: if ( is_mark_space(correction)) { rxstate = RTTY_RX_STATE_START; counter = correction; } break; case RTTY_RX_STATE_START: if (--counter == 0) { if (!is_mark()) { rxstate = RTTY_RX_STATE_DATA; counter = symbollen; bitcntr = 0; rxdata = 0; } else { rxstate = RTTY_RX_STATE_IDLE; } } break; case RTTY_RX_STATE_DATA: if (--counter == 0) { rxdata |= is_mark() << bitcntr++; counter = symbollen; } if (bitcntr == nbits + (rtty_parity != RTTY_PARITY_NONE ? 1 : 0)) rxstate = RTTY_RX_STATE_STOP; break; case RTTY_RX_STATE_STOP: if (--counter == 0) { if (is_mark()) { if ((metric >= progStatus.sldrSquelchValue && progStatus.sqlonoff) || !progStatus.sqlonoff) { c = decode_char(); if( progdefaults.SynopAdifDecoding || progdefaults.SynopKmlDecoding ) { if (c != 0 && c != '\r') { synop::instance()->add(c); } else { if( synop::instance()->enabled() ) synop::instance()->flush(false); put_rx_char(c); } } else if ( c != 0 ) { // supress and sequences // these were observed during the RTTY contest 2/9/2013 if (c == '\r' && lastchar == '\r'); else if (c == '\n' && lastchar == '\n'); else put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c); lastchar = c; } flag = true; } } rxstate = RTTY_RX_STATE_IDLE; } break; default : break; } return flag; } char snrmsg[80]; void rtty::Metric() { double delta = rtty_baud/8.0; double np = wf->powerDensity(frequency, delta) * 3000 / delta + 1e-8; double sp = wf->powerDensity(frequency - shift/2, delta) + wf->powerDensity(frequency + shift/2, delta) + 1e-8; double snr = 0; if (np < 1e-6) np = sp * 100; sigpwr = decayavg( sigpwr, sp, sp > sigpwr ? 2 : 8); noisepwr = decayavg( noisepwr, np, 16 ); snr = 10*log10(sigpwr / noisepwr); snprintf(snrmsg, sizeof(snrmsg), "s/n %-3.0f dB", snr); put_Status2(snrmsg); metric = CLAMP((3000 / delta) * (sigpwr/noisepwr), 0.0, 100.0); display_metric(metric); } void rtty::searchDown() { double srchfreq = frequency - shift -100; double minfreq = shift * 2 + 100; double spwrlo, spwrhi, npwr; while (srchfreq > minfreq) { spwrlo = wf->powerDensity(srchfreq - shift/2, 2*rtty_baud); spwrhi = wf->powerDensity(srchfreq + shift/2, 2*rtty_baud); npwr = wf->powerDensity(srchfreq + shift, 2*rtty_baud) + 1e-10; if ((spwrlo / npwr > 10.0) && (spwrhi / npwr > 10.0)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq -= 5.0; } } void rtty::searchUp() { double srchfreq = frequency + shift +100; double maxfreq = IMAGE_WIDTH - shift * 2 - 100; double spwrhi, spwrlo, npwr; while (srchfreq < maxfreq) { spwrlo = wf->powerDensity(srchfreq - shift/2, 2*rtty_baud); spwrhi = wf->powerDensity(srchfreq + shift/2, 2*rtty_baud); npwr = wf->powerDensity(srchfreq - shift, 2*rtty_baud) + 1e-10; if ((spwrlo / npwr > 10.0) && (spwrhi / npwr > 10.0)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq += 5.0; } } #if FILTER_DEBUG == 1 int snum = 0; int mnum = 0; #define ook(sp) \ { \ value = sin(2.0*M_PI*( \ (((sp / symbollen) % 2 == 0) ? (frequency + shift/2.0) : (frequency - shift/2.0))\ /samplerate)*sp); \ } std::fstream ook_signal("ook_signal.csv", std::ios::out ); #endif int rtty::rx_process(const double *buf, int len) { const double *buffer = buf; int length = len; static int showxy = symbollen; cmplx z, zmark, zspace, *zp_mark, *zp_space; int n_out = 0; static int bitcount = 5 * nbits * symbollen; if ( !progdefaults.report_when_visible || dlgViewer->visible() || progStatus.show_channels ) if (!bHistory && rttyviewer) rttyviewer->rx_process(buf, len); if (progStatus.rtty_filter_changed) { progStatus.rtty_filter_changed = false; reset_filters(); } { reverse = wf->Reverse() ^ !wf->USB(); } Metric(); #if FILTER_DEBUG == 1 double value; #endif while (length-- > 0) { // Create analytic signal from sound card input samples #if FILTER_DEBUG == 1 if (snum < 2 * filter_length) { frequency = 1000.0; ook(snum); z = cmplx(value, value); ook_signal << snum << "," << z.real() << ","; // snum++; } else { z = cmplx(*buffer, *buffer); } #else z = cmplx(*buffer, *buffer); #endif buffer++; // Mix it with the audio carrier frequency to create two baseband signals // mark and space are separated and processed independently // lowpass Windowed Sinc - Overlap-Add convolution filters. // The two fftfilt's are the same size and processed in sync // therefore the mark and space filters will concurrently have the // same size outputs available for further processing zmark = mixer(mark_phase, frequency + shift/2.0, z); mark_filt->run(zmark, &zp_mark); zspace = mixer(space_phase, frequency - shift/2.0, z); n_out = space_filt->run(zspace, &zp_space); #if FILTER_DEBUG == 1 if (snum < 2 * filter_length) { ook_signal << abs(zmark) <<"\n"; snum++; } #endif for (int i = 0; i < n_out; i++) { mark_mag = abs(zp_mark[i]); mark_env = decayavg (mark_env, mark_mag, (mark_mag > mark_env) ? symbollen / 4 : symbollen * 16); mark_noise = decayavg (mark_noise, mark_mag, (mark_mag < mark_noise) ? symbollen / 4 : symbollen * 48); space_mag = abs(zp_space[i]); space_env = decayavg (space_env, space_mag, (space_mag > space_env) ? symbollen / 4 : symbollen * 16); space_noise = decayavg (space_noise, space_mag, (space_mag < space_noise) ? symbollen / 4 : symbollen * 48); #if FILTER_DEBUG == 1 if (mnum < 2 * filter_length) ook_signal << ",,," << mnum++ + filter_length / 2 << "," << mark_mag << "," << space_mag << "\n"; #endif noise_floor = std::min(space_noise, mark_noise); // clipped if clipped decoder selected double mclipped = 0, sclipped = 0; mclipped = mark_mag > mark_env ? mark_env : mark_mag; sclipped = space_mag > space_env ? space_env : space_mag; if (mclipped < noise_floor) mclipped = noise_floor; if (sclipped < noise_floor) sclipped = noise_floor; switch (progdefaults.rtty_cwi) { case 1 : // mark only decode space_env = sclipped = noise_floor; break; case 2: // space only decode mark_env = mclipped = noise_floor; default : ; } // double v0, v1, v2, v3, v4, v5; double v3; // no ATC // v0 = mark_mag - space_mag; // Linear ATC // v1 = mark_mag - space_mag - 0.5 * (mark_env - space_env); // Clipped ATC // v2 = (mclipped - noise_floor) - (sclipped - noise_floor) - 0.5 * ( // (mark_env - noise_floor) - (space_env - noise_floor)); // Optimal ATC v3 = (mclipped - noise_floor) * (mark_env - noise_floor) - (sclipped - noise_floor) * (space_env - noise_floor) - 0.25 * ( (mark_env - noise_floor) * (mark_env - noise_floor) - (space_env - noise_floor) * (space_env - noise_floor)); // Kahn Squarer with Linear ATC // v4 = (mark_mag - noise_floor) * (mark_mag - noise_floor) - // (space_mag - noise_floor) * (space_mag - noise_floor) - 0.25 * ( // (mark_env - noise_floor) * (mark_env - noise_floor) - // (space_env - noise_floor) * (space_env - noise_floor)); // Kahn Squarer with Clipped ATC // v5 = (mclipped - noise_floor) * (mclipped - noise_floor) - // (sclipped - noise_floor) * (sclipped - noise_floor) - 0.25 * ( // (mark_env - noise_floor) * (mark_env - noise_floor) - // (space_env - noise_floor) * (space_env - noise_floor)); // switch (progdefaults.rtty_demodulator) { // switch (2) { // Optimal ATC // case 0: // linear ATC // bit = v1 > 0; // break; // case 1: // clipped ATC // bit = v2 > 0; // break; // case 2: // optimal ATC bit = v3 > 0; // break; // case 3: // Kahn linear ATC // bit = v4 > 0; // break; // case 4: // Kahn clipped // bit = v5 > 0; // break; // case 5: // No ATC // default : // bit = v0 > 0; // } // XY scope signal generation if (progdefaults.true_scope) { //---------------------------------------------------------------------- // "true" scope implementation------------------------------------------ //---------------------------------------------------------------------- // get the baseband-signal and... xy = cmplx( zp_mark[i].real() * cos(xy_phase) + zp_mark[i].imag() * sin(xy_phase), zp_space[i].real() * cos(xy_phase) + zp_space[i].imag() * sin(xy_phase) ); // if mark-tone has a higher magnitude than the space-tone, // further reduce the scope's space-amplitude and vice versa // this makes the scope looking a little bit nicer, too... // aka: less noisy... if( abs(zp_mark[i]) > abs(zp_space[i]) ) { // note ox x complex lib does not support xy.real(double) or xy.imag(double) xy = cmplx( xy.real(), xy.imag() * abs(zp_space[i])/abs(zp_mark[i]) ); // xy.imag() *= abs(zp_space[i])/abs(zp_mark[i]); } else { xy = cmplx( xy.real() / ( abs(zp_space[i])/abs(zp_mark[i]) ), xy.imag() ); // xy.real() /= abs(zp_space[i])/abs(zp_mark[i]); } // now normalize the scope double const norm = 1.3*(abs(zp_mark [i]) + abs(zp_space[i])); xy /= norm; } else { //---------------------------------------------------------------------- // "ortho" scope implementation----------------------------------------- //---------------------------------------------------------------------- // get magnitude of the baseband-signal if (bit) xy = cmplx( mark_mag * cos(xy_phase), space_noise * sin(xy_phase) / 2.0); else xy = cmplx( mark_noise * cos(xy_phase) / 2.0, space_mag * sin(xy_phase)); // now normalize the scope double const norm = (mark_env + space_env); xy /= norm; } // Rotate the scope x-y iaw frequency error. Old scopes were not capable // of this, but it should be very handy, so... who cares of realism anyways? double const rotate = 8 * TWOPI * freqerr / rtty_shift; xy = xy * cmplx(cos(rotate), sin(rotate)); QI[inp_ptr] = xy; // shift it to 128Hz(!) and not to it's original position. // this makes it more pretty and does not remove it's other // qualities. Reason is that this is a fraction of the used // block-size. xy_phase += (TWOPI * (128.0 / samplerate)); // end XY signal generation mark_history[inp_ptr] = zp_mark[i]; space_history[inp_ptr] = zp_space[i]; inp_ptr = (inp_ptr + 1) % MAXPIPE; if (dspcnt && (--dspcnt % (nbits + 2) == 0)) { pipe[pipeptr] = bit - 0.5; //testbit - 0.5; pipeptr = (pipeptr + 1) % symbollen; } // detect TTY signal transitions // rx(...) returns true if valid TTY bit stream detected // either character or idle signal if ( rx( reverse ? !bit : bit ) ) { dspcnt = symbollen * (nbits + 2); if (!bHighSpeed) Update_syncscope(); clear_zdata = true; bitcount = 5 * nbits * symbollen; if (sigsearch) sigsearch--; int mp0 = inp_ptr - 2; int mp1 = mp0 + 1; if (mp0 < 0) mp0 += MAXPIPE; if (mp1 < 0) mp1 += MAXPIPE; double ferr = (TWOPI * samplerate / rtty_baud) * (!reverse ? arg(conj(mark_history[mp1]) * mark_history[mp0]) : arg(conj(space_history[mp1]) * space_history[mp0])); if (fabs(ferr) > rtty_baud / 2) ferr = 0; freqerr = decayavg ( freqerr, ferr / 8, progdefaults.rtty_afcspeed == 0 ? 8 : progdefaults.rtty_afcspeed == 1 ? 4 : 1 ); if (progStatus.afconoff && (metric > progStatus.sldrSquelchValue || !progStatus.sqlonoff)) set_freq(frequency - freqerr); } else if (bitcount) --bitcount; } if (!bHighSpeed) { if (!bitcount) { if (clear_zdata) { clear_zdata = false; Clear_syncscope(); for (int i = 0; i < MAXPIPE; i++) QI[i] = cmplx(0.0, 0.0); } } if (!--showxy) { set_zdata(QI, MAXPIPE); showxy = symbollen; } } } return 0; } //===================================================================== // RTTY transmit //===================================================================== //double freq1; double maxamp = 0; double rtty::nco(double freq) { phaseacc += TWOPI * freq / samplerate; if (phaseacc > TWOPI) phaseacc -= TWOPI; return cos(phaseacc); } double rtty::FSKnco() { FSKphaseacc += TWOPI * 1000 / samplerate; if (FSKphaseacc > TWOPI) FSKphaseacc -= TWOPI; return sin(FSKphaseacc); } extern Cserial CW_KEYLINE_serial; extern bool CW_KEYLINE_isopen; void rtty::send_symbol(int symbol, int len) { if (reverse) symbol = !symbol; acc_symbols += len; if (!progStatus.shaped_rtty) { double freq; if (symbol) freq = get_txfreq_woffset() + shift / 2.0; else freq = get_txfreq_woffset() - shift / 2.0; for (int i = 0; i < len; i++) { outbuf[i] = nco(freq); if (symbol) FSKbuf[i] = FSKnco(); else FSKbuf[i] = 0.0; } } else { double const freq1 = get_txfreq_woffset() + shift / 2.0; double const freq2 = get_txfreq_woffset() - shift / 2.0; double mark = 0, space = 0; double signal = 0; if (maxamp == 0) { int sym = 0; for (int j = 0; j < 100; j++) { if (sym) sym = 0; else sym = 1; for( int i = 0; i < 3*len; ++i ) { mark = m_SymShaper1->Update( sym) * m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(!sym) * m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) maxamp = fabs(signal); } } } for( int i = 0; i < len; ++i ) { mark = m_SymShaper1->Update( symbol) * m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(!symbol) * m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) { maxamp = fabs(signal); } outbuf[i] = maxamp ? (signal / maxamp) : 0.0; if (symbol) FSKbuf[i] = FSKnco(); else FSKbuf[i] = 0.0 * FSKnco(); } } if (progdefaults.PseudoFSK) ModulateStereo(outbuf, FSKbuf, symbollen); else ModulateXmtr(outbuf, symbollen); } void rtty::send_stop() { if (!progStatus.shaped_rtty) { double freq; bool invert = reverse; if (invert) freq = get_txfreq_woffset() - shift / 2.0; else freq = get_txfreq_woffset() + shift / 2.0; for (int i = 0; i < stoplen; i++) { outbuf[i] = nco(freq); if (invert) FSKbuf[i] = 0.0; else FSKbuf[i] = FSKnco(); } } else { double const freq1 = get_txfreq_woffset() + shift / 2.0; double const freq2 = get_txfreq_woffset() - shift / 2.0; double mark = 0, space = 0, signal = 0; bool symbol = true; if (reverse) symbol = !symbol; for( int i = 0; i < stoplen; ++i ) { mark = m_SymShaper1->Update( symbol)*m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(!symbol)*m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) maxamp = fabs(signal); outbuf[i] = maxamp ? (signal / maxamp) : 0.0; if (reverse) FSKbuf[i] = 0.0; else FSKbuf[i] = FSKnco(); } } if (progdefaults.PseudoFSK) ModulateStereo(outbuf, FSKbuf, stoplen); else ModulateXmtr(outbuf, stoplen); } void rtty::flush_stream() { double const freq1 = get_txfreq_woffset() + shift / 2.0; double const freq2 = get_txfreq_woffset() - shift / 2.0; double mark = 0, space = 0, signal = 0; for( int i = 0; i < symbollen * 6; ++i ) { mark = m_SymShaper1->Update(0)*m_Osc1->Update( freq1 ); space = m_SymShaper2->Update(0)*m_Osc2->Update( freq2 ); signal = mark + space; if (maxamp < fabs(signal)) maxamp = fabs(signal); outbuf[i] = maxamp ? (signal / maxamp) : 0.0; FSKbuf[i] = 0.0; } sig_stop = true; if (progdefaults.PseudoFSK) ModulateStereo(outbuf, FSKbuf, symbollen * 6); else ModulateXmtr(outbuf, symbollen * 6); } void rtty::send_char(int c) { int i; if (nbits == 5) { if (c == LETTERS) c = 0x1F; if (c == FIGURES) c = 0x1B; } // start bit send_symbol(0, symbollen); // data bits for (i = 0; i < nbits; i++) { send_symbol((c >> i) & 1, symbollen); } // parity bit if (rtty_parity != RTTY_PARITY_NONE) send_symbol(rttyparity(c, nbits), symbollen); // stop bit(s) send_stop(); if (nbits == 5) { if (c == 0x1F || c == 0x1B) return; if (shift_state == LETTERS) c = letters[c]; else c = figures[c]; if (c) put_echo_char(progdefaults.rx_lowercase ? tolower(c) : c); } else put_echo_char(c); } void rtty::send_idle() { if (nbits == 5) { send_char(LETTERS); shift_state = LETTERS; } else send_char(0); } double rtty::rtty_now() { static struct timeval t1; gettimeofday(&t1, NULL); return t1.tv_sec + t1.tv_usec / 1e6; } // sub millisecond accurate sleep function // sleep_time in seconds int rtty::rtty_sleep (double sleep_time) { struct timespec tv; double start_at = rtty_now(); double end_at = start_at + sleep_time; double delay = sleep_time - 0.005; tv.tv_sec = (time_t) delay; tv.tv_nsec = (long) ((delay - tv.tv_sec) * 1000000000L); int rval = 0; #ifdef __WIN32__ timeBeginPeriod(1); #endif // while (1) { rval = nanosleep (&tv, &tv); if (errno == EINTR) { // continue std::cout << "EINTR error in rtty_sleep" << std::endl; } // break; // } rval = 0; while (rtty_now() < end_at) rval++; //std::cout << "rtty_sleep( " << sleep_time << ") : " << rval << std::endl; #ifdef __WIN32__ timeEndPeriod(1); #endif return 0; } static int line_char_count = 0; // 1 start, 5 data, 1.5/2.0 stopbits #define wait_one_byte(baud, stopbits) \ rtty_sleep( ((6 + (stopbits))*1.0 / (baud))); void rtty::flrig_fsk_send(char c) { static std::string s = " "; s[0] = c; flrig_fskio_send_text(s); // if (c == '[' || c == ']') // return; wait_one_byte(45.45, 1.5); } int rtty::tx_process() { modem::tx_process(); int c = get_tx_char(); if (progdefaults.use_FLRIG_FSK) { if (preamble) { start_deadman(); flrig_fsk_send('['); preamble = false; } if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; flrig_fsk_send(']'); put_echo_char('\n'); stop_deadman(); return -1; } if (c == GET_TX_CHAR_NODATA) { rtty_sleep(0.022 * 7.5); } else { flrig_fsk_send(c); put_echo_char(c); } return 0; } if (progdefaults.useFSK) { if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; stop_deadman(); sig_start = true; return -1; } if (c == GET_TX_CHAR_NODATA) { send_FSK(0x03); return 0; } // if (sig_start) { // int cltrs = 0x1F; // send_FSK(cltrs); // send_FSK(cltrs); // sig_start = false; // } send_FSK(c); put_echo_char(toupper(c)); return 0; } if (progStatus.nanoFSK_online) { if (preamble) { start_deadman(); sig_start = true; for (int i = 0; i < progdefaults.TTY_LTRS; i++) nano_send_char(-1); preamble = false; nano_send_char(-1); nano_send_char(-1); } if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; stop_deadman(); return -1; } nano_send_char(c); if (c == GET_TX_CHAR_NODATA) { return 0; } put_echo_char(c); return 0; } if (use_Nav) { if (preamble) { start_deadman(); for (int i = 0; i < progdefaults.TTY_LTRS; i++) Nav_send_char(-1); preamble = false; } if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; stop_deadman(); return -1; } if (c == GET_TX_CHAR_NODATA) { Nav_send_char(-1); return 0; } Nav_send_char(c); put_echo_char(c); return 0; } if (progStatus.WK_online && progStatus.WKFSK_mode) { if (preamble) { start_deadman(); WKFSK_send_char('['); preamble = false; } if (c == GET_TX_CHAR_ETX || stopflag) { if (stopflag) WKFSK_send_char('\\'); WKFSK_send_char(']'); stop_deadman(); stopflag = false; return -1; } // send idle character if c == -1 // must insert a suitable time delay to account for the idle if (c == GET_TX_CHAR_NODATA) { wait_one_byte( (progStatus.WKFSK_baud == 0 ? 45.45 : progStatus.WKFSK_baud == 1 ? 50.0 : progStatus.WKFSK_baud == 2 ? 75.0 : 100.0), (progStatus.WKFSK_stopbits == 0 ? 2.0 : 1.5)); return 0; } else { WKFSK_send_char(c); put_echo_char(c); wait_one_byte( (progStatus.WKFSK_baud == 0 ? 45.45 : progStatus.WKFSK_baud == 1 ? 50.0 : progStatus.WKFSK_baud == 2 ? 75.0 : 100.0), (progStatus.WKFSK_stopbits == 0 ? 2.0 : 1.5)); } return 0; } if (preamble) { sig_start = true; for (int i = 0; i < progdefaults.TTY_LTRS; i++) send_char(LETTERS); preamble = false; } // TX buffer empty if (c == GET_TX_CHAR_ETX || stopflag) { stopflag = false; line_char_count = 0; if (nbits != 5) { if (progdefaults.rtty_crcrlf) send_char('\r'); send_char('\r'); send_char('\n'); } else { if (progdefaults.rtty_crcrlf) send_char(0x08); send_char(0x08); send_char(0x02); } flush_stream(); return -1; } // send idle character if c == -1 if (c == GET_TX_CHAR_NODATA) { send_idle(); return 0; } // if NOT Baudot if (nbits != 5) { acc_symbols = 0; send_char(c); xmt_samples = char_samples = acc_symbols; return 0; } if (isalpha(c) || isdigit(c) || isblank(c) || ispunct(c)) { ++line_char_count; } if (progdefaults.rtty_autocrlf && (c != '\n' && c != '\r') && (line_char_count == progdefaults.rtty_autocount || (line_char_count > progdefaults.rtty_autocount - 5 && c == ' '))) { line_char_count = 0; if (progdefaults.rtty_crcrlf) send_char(0x08); // CR-CR-LF triplet send_char(0x08); send_char(0x02); if (c == ' ') return 0; } if (c == '\r') { line_char_count = 0; send_char(0x08); return 0; } if (c == '\n') { line_char_count = 0; if (progdefaults.rtty_crcrlf) send_char(0x08); // CR-CR-LF triplet send_char(0x02); return 0; } /* unshift-on-space */ if (c == ' ') { if (progdefaults.UOStx) { send_char(LETTERS); send_char(0x04); // coded value for a space shift_state = LETTERS; } else send_char(0x04); return 0; } if ((c = baudot_enc(c)) < 0) return 0; // switch case if necessary if ((c & 0x300) != shift_state) { if (shift_state == FIGURES) { send_char(LETTERS); shift_state = LETTERS; } else { send_char(FIGURES); shift_state = FIGURES; } } /// acc_symbols = 0; send_char(c & 0x1F); xmt_samples = char_samples = acc_symbols; return 0; } int rtty::baudot_enc(unsigned char data) { int i, c, mode; mode = 0; c = -1; if (islower(data)) data = toupper(data); for (i = 0; i < 32; i++) { if (data == letters[i]) { mode |= LETTERS; c = i; } if (data == figures[i]) { mode |= FIGURES; c = i; } if (c != -1) return (mode | c); } return -1; } char rtty::baudot_dec(unsigned char data) { int out = 0; switch (data) { case 0x1F: /* letters */ rxmode = LETTERS; break; case 0x1B: /* figures */ rxmode = FIGURES; break; case 0x04: /* unshift-on-space */ if (progdefaults.UOSrx) rxmode = LETTERS; return ' '; break; default: if (rxmode == LETTERS) out = letters[data]; else out = figures[data]; break; } return out; } // --------------------------------------------------------------------- // TTY output on DTR/RTS signal lines //---------------------------------------------------------------------- void rtty::send_FSK(int c) { if (!fsk_tty) return; int timeout = 1000; fsk_tty->append( (char)c ); while (fsk_tty->sending() && timeout--) rtty_sleep(.010); // MilliSleep(1); } //====================================================================== // methods for class Oscillator and class SymbolShaper //====================================================================== Oscillator::Oscillator( double samplerate ) { m_phase = 0; m_samplerate = samplerate; // std::cerr << "samplerate for Oscillator:"< TWOPI ) m_phase -= TWOPI; return ( sin( m_phase ) ); } SymbolShaper::SymbolShaper(double baud, double sr) { m_sinc_table = 0; Preset( baud, sr ); } SymbolShaper::~SymbolShaper() { delete [] m_sinc_table; } void SymbolShaper::reset() { m_State = false; m_Accumulator = 0.0; m_Counter0 = 1024; m_Counter1 = 1024; m_Counter2 = 1024; m_Counter3 = 1024; m_Counter4 = 1024; m_Counter5 = 1024; m_Factor0 = 0.0; m_Factor1 = 0.0; m_Factor2 = 0.0; m_Factor3 = 0.0; m_Factor4 = 0.0; m_Factor5 = 0.0; } void SymbolShaper::Preset(double baud, double sr) { double baud_rate = baud; double sample_rate = sr; LOG_INFO("Shaper::reset( %f, %f )", baud_rate, sample_rate); // calculate new table-size for six integrators ---------------------- m_table_size = sample_rate / baud_rate * 5.49; LOG_INFO("Shaper::m_table_size = %d", m_table_size); // kill old sinc-table and get memory for the new one ----------------- if (m_sinc_table) delete [] m_sinc_table; m_sinc_table = new double[m_table_size]; // set up the new sinc-table based on the new parameters -------------- long double sum = 0.0; for( int x=0; x= m_table_size ) { m_Counter0 = 0; m_Factor0 = (state)? +1.0 : -1.0; } else if( m_Counter1 >= m_table_size ) { m_Counter1 = 0; m_Factor1 = (state)? +1.0 : -1.0; } else if( m_Counter2 >= m_table_size ) { m_Counter2 = 0; m_Factor2 = (state)? +1.0 : -1.0; } else if( m_Counter3 >= m_table_size ) { m_Counter3 = 0; m_Factor3 = (state)? +1.0 : -1.0; } else if( m_Counter4 >= m_table_size ) { m_Counter4 = 0; m_Factor4 = (state)? +1.0 : -1.0; } else if( m_Counter5 >= m_table_size ) { m_Counter5 = 0; m_Factor5 = (state)? +1.0 : -1.0; } } if( m_Counter0 < m_table_size ) m_Accumulator += m_Factor0 * m_sinc_table[m_Counter0++]; if( m_Counter1 < m_table_size ) m_Accumulator += m_Factor1 * m_sinc_table[m_Counter1++]; if( m_Counter2 < m_table_size ) m_Accumulator += m_Factor2 * m_sinc_table[m_Counter2++]; if( m_Counter3 < m_table_size ) m_Accumulator += m_Factor3 * m_sinc_table[m_Counter3++]; if( m_Counter4 < m_table_size ) m_Accumulator += m_Factor4 * m_sinc_table[m_Counter4++]; if( m_Counter5 < m_table_size ) m_Accumulator += m_Factor5 * m_sinc_table[m_Counter5++]; return ( m_Accumulator / sqrt(2) ); } void SymbolShaper::print_sinc_table() { for (int i = 0; i < 1024; i++) printf("%f\n", m_SincTable[i]); } fldigi-4.2.05/src/rtty/view_rtty.cxx0000664000175000017500000004075614611711171014350 00000000000000// ---------------------------------------------------------------------------- // rtty.cxx -- RTTY modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include //#include "rtty.h" #include "view_rtty.h" #include "fl_digi.h" #include "digiscope.h" #include "misc.h" #include "waterfall.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "digiscope.h" #include "Viewer.h" #include "qrunner.h" //===================================================================== // Baudot support //===================================================================== static char letters[32] = { '\0', 'E', '\n', 'A', ' ', 'S', 'I', 'U', '\r', 'D', 'R', 'J', 'N', 'F', 'C', 'K', 'T', 'Z', 'L', 'W', 'H', 'Y', 'P', 'Q', 'O', 'B', 'G', ' ', 'M', 'X', 'V', ' ' }; // U.S. version of the figures case. static char figures[32] = { '\0', '3', '\n', '-', ' ', '\a', '8', '7', '\r', '$', '4', '\'', ',', '!', ':', '(', '5', '"', ')', '2', '#', '6', '0', '1', '9', '?', '&', ' ', '.', '/', ';', ' ' }; const double view_rtty::SHIFT[] = {23, 85, 160, 170, 182, 200, 240, 350, 425, 850}; // FILTLEN must be same size as BAUD const double view_rtty::BAUD[] = {45, 45.45, 50, 56, 75, 100, 110, 150, 200, 300}; const int view_rtty::FILTLEN[] = { 512, 512, 512, 512, 512, 512, 512, 256, 128, 64}; const int view_rtty::BITS[] = {5, 7, 8}; const int view_rtty::numshifts = (int)(sizeof(SHIFT) / sizeof(*SHIFT)); const int view_rtty::numbauds = (int)(sizeof(BAUD) / sizeof(*BAUD)); void view_rtty::rx_init() { for (int ch = 0; ch < progdefaults.VIEWERchannels; ch++) { channel[ch].state = IDLE; channel[ch].rxstate = RTTY_RX_STATE_IDLE; channel[ch].rxmode = LETTERS; channel[ch].phaseacc = 0; channel[ch].timeout = 0; channel[ch].frequency = NULLFREQ; channel[ch].poserr = channel[ch].negerr = 0.0; channel[ch].mark_phase = 0; channel[ch].space_phase = 0; channel[ch].mark_mag = 0; channel[ch].space_mag = 0; channel[ch].mark_env = 0; channel[ch].space_env = 0; channel[ch].inp_ptr = 0; for (int i = 0; i < VIEW_MAXPIPE; i++) channel[ch].mark_history[i] = channel[ch].space_history[i] = cmplx(0,0); } } void view_rtty::init() { bool wfrev = wf->Reverse(); bool wfsb = wf->USB(); reverse = wfrev ^ !wfsb; rx_init(); } view_rtty::~view_rtty() { for (int ch = 0; ch < MAX_CHANNELS; ch ++) { if (channel[ch].mark_filt) delete channel[ch].mark_filt; if (channel[ch].space_filt) delete channel[ch].space_filt; if (channel[ch].bits) delete channel[ch].bits; } } void view_rtty::reset_filters(int ch) { delete channel[ch].mark_filt; channel[ch].mark_filt = new fftfilt(rtty_baud/samplerate, filter_length); channel[ch].mark_filt->rtty_filter(rtty_baud/samplerate); delete channel[ch].space_filt; channel[ch].space_filt = new fftfilt(rtty_baud/samplerate, filter_length); channel[ch].space_filt->rtty_filter(rtty_baud/samplerate); } void view_rtty::restart() { double stl; rtty_shift = shift = (progdefaults.rtty_shift < rtty::numshifts ? SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); rtty_baud = BAUD[progdefaults.rtty_baud]; filter_length = FILTLEN[progdefaults.rtty_baud]; nbits = rtty_bits = BITS[progdefaults.rtty_bits]; if (rtty_bits == 5) rtty_parity = RTTY_PARITY_NONE; else switch (progdefaults.rtty_parity) { case 0 : rtty_parity = RTTY_PARITY_NONE; break; case 1 : rtty_parity = RTTY_PARITY_EVEN; break; case 2 : rtty_parity = RTTY_PARITY_ODD; break; case 3 : rtty_parity = RTTY_PARITY_ZERO; break; case 4 : rtty_parity = RTTY_PARITY_ONE; break; default : rtty_parity = RTTY_PARITY_NONE; break; } rtty_stop = progdefaults.rtty_stop; symbollen = (int) (samplerate / rtty_baud + 0.5); bflen = symbollen/3; set_bandwidth(shift); rtty_BW = progdefaults.RTTY_BW; bp_filt_lo = (shift/2.0 - rtty_BW/2.0) / samplerate; if (bp_filt_lo < 0) bp_filt_lo = 0; bp_filt_hi = (shift/2.0 + rtty_BW/2.0) / samplerate; for (int ch = 0; ch < MAX_CHANNELS; ch ++) { reset_filters(ch); channel[ch].state = IDLE; channel[ch].timeout = 0; channel[ch].freqerr = 0.0; channel[ch].metric = 0.0; channel[ch].sigpwr = 0.0; channel[ch].noisepwr = 0.0; channel[ch].sigsearch = 0; channel[ch].frequency = NULLFREQ; channel[ch].counter = symbollen / 2; channel[ch].mark_phase = 0; channel[ch].space_phase = 0; channel[ch].mark_mag = 0; channel[ch].space_mag = 0; channel[ch].mark_env = 0; channel[ch].space_env = 0; channel[ch].inp_ptr = 0; if (channel[ch].bits) channel[ch].bits->setLength(symbollen / 8); else channel[ch].bits = new Cmovavg(symbollen / 8); channel[ch].mark_noise = channel[ch].space_noise = 0; channel[ch].bit = channel[ch].nubit = true; for (int i = 0; i < VIEW_RTTY_MAXBITS; i++) channel[ch].bit_buf[i] = 0.0; for (int i = 0; i < VIEW_MAXPIPE; i++) channel[ch].mark_history[i] = channel[ch].space_history[i] = cmplx(0,0); } // stop length = 1, 1.5 or 2 bits rtty_stop = progdefaults.rtty_stop; if (rtty_stop == 0) stl = 1.0; else if (rtty_stop == 1) stl = 1.5; else stl = 2.0; stoplen = (int) (stl * samplerate / rtty_baud + 0.5); rx_init(); } view_rtty::view_rtty(trx_mode tty_mode) { cap |= CAP_AFC | CAP_REV; mode = tty_mode; samplerate = RTTY_SampleRate; for (int ch = 0; ch < MAX_CHANNELS; ch ++) { channel[ch].mark_filt = (fftfilt *)0; channel[ch].space_filt = (fftfilt *)0; channel[ch].bits = (Cmovavg *)0; } restart(); } cmplx view_rtty::mixer(double &phase, double f, cmplx in) { cmplx z = cmplx( cos(phase), sin(phase)) * in;; phase -= TWOPI * f / samplerate; if (phase < - TWOPI) phase += TWOPI; return z; } unsigned char view_rtty::bitreverse(unsigned char in, int n) { unsigned char out = 0; for (int i = 0; i < n; i++) out = (out << 1) | ((in >> i) & 1); return out; } static int rparity(int c) { int w = c; int p = 0; while (w) { p += (w & 1); w >>= 1; } return p & 1; } int view_rtty::rttyparity(unsigned int c) { c &= (1 << nbits) - 1; switch (rtty_parity) { default: case RTTY_PARITY_NONE: return 0; case RTTY_PARITY_ODD: return rparity(c); case RTTY_PARITY_EVEN: return !rparity(c); case RTTY_PARITY_ZERO: return 0; case RTTY_PARITY_ONE: return 1; } } int view_rtty::decode_char(int ch) { unsigned int parbit, par, data; parbit = (channel[ch].rxdata >> nbits) & 1; par = rttyparity(channel[ch].rxdata); if (rtty_parity != RTTY_PARITY_NONE && parbit != par) return 0; data = channel[ch].rxdata & ((1 << nbits) - 1); if (nbits == 5) return baudot_dec(ch & 0x7F, data); return data; } bool view_rtty::is_mark_space( int ch, int &correction) { correction = 0; // test for rough bit position if (channel[ch].bit_buf[0] && !channel[ch].bit_buf[symbollen-1]) { // test for mark/space straddle point for (int i = 0; i < symbollen; i++) correction += channel[ch].bit_buf[i]; if (abs(symbollen/2 - correction) < 6) // too small & bad signals are not decoded return true; } return false; } bool view_rtty::is_mark(int ch) { return channel[ch].bit_buf[symbollen / 2]; } bool view_rtty::rx(int ch, bool bit) { bool flag = false; unsigned char c = 0; int correction = 0; for (int i = 1; i < symbollen; i++) channel[ch].bit_buf[i-1] = channel[ch].bit_buf[i]; channel[ch].bit_buf[symbollen - 1] = bit; switch (channel[ch].rxstate) { case RTTY_RX_STATE_IDLE: if ( is_mark_space(ch, correction)) { channel[ch].rxstate = RTTY_RX_STATE_START; channel[ch].counter = correction; } break; case RTTY_RX_STATE_START: if (--channel[ch].counter == 0) { if (!is_mark(ch)) { channel[ch].rxstate = RTTY_RX_STATE_DATA; channel[ch].counter = symbollen; channel[ch].bitcntr = 0; channel[ch].rxdata = 0; } else { channel[ch].rxstate = RTTY_RX_STATE_IDLE; } } break; case RTTY_RX_STATE_DATA: if (--channel[ch].counter == 0) { channel[ch].rxdata |= is_mark(ch) << channel[ch].bitcntr++; channel[ch].counter = symbollen; } if (channel[ch].bitcntr == nbits + (rtty_parity != RTTY_PARITY_NONE ? 1 : 0)) channel[ch].rxstate = RTTY_RX_STATE_STOP; break; case RTTY_RX_STATE_STOP: if (--channel[ch].counter == 0) { if (is_mark(ch)) { if (channel[ch].metric > rtty_squelch) { c = decode_char(ch); // print this RTTY_CHANNEL if ( c != 0 ) REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, mode); } flag = true; } channel[ch].rxstate = RTTY_RX_STATE_IDLE; } break; default : break; } return flag; } void view_rtty::Metric(int ch) { double delta = rtty_baud/2.0; double np = wf->powerDensity(channel[ch].frequency, delta) * 3000 / delta; double sp = wf->powerDensity(channel[ch].frequency - shift/2, delta) + wf->powerDensity(channel[ch].frequency + shift/2, delta) + 1e-10; channel[ch].sigpwr = decayavg( channel[ch].sigpwr, sp, sp - channel[ch].sigpwr > 0 ? 2 : 16); channel[ch].noisepwr = decayavg( channel[ch].noisepwr, np, 16 ); channel[ch].metric = CLAMP(channel[ch].sigpwr/channel[ch].noisepwr, 0.0, 100.0); if (channel[ch].state == RCVNG) if (channel[ch].metric < rtty_squelch) { channel[ch].timeout = progdefaults.VIEWERtimeout * samplerate / WF_BLOCKSIZE; channel[ch].state = WAITING; } if (channel[ch].timeout) { channel[ch].timeout--; if (!channel[ch].timeout) { channel[ch].frequency = NULLFREQ; channel[ch].metric = 0; channel[ch].freqerr = 0; channel[ch].state = IDLE; REQ(&viewclearchannel, ch); } } } void view_rtty::find_signals() { double spwrhi = 0.0, spwrlo = 0.0, npwr = 0.0; double rtty_squelch = pow(10, progStatus.VIEWER_rttysquelch / 10.0); for (int i = 0; i < progdefaults.VIEWERchannels; i++) { if (channel[i].state != IDLE) continue; int cf = progdefaults.LowFreqCutoff + 100 * i; if (cf < shift) cf = shift; double delta = rtty_baud / 8; for (int chf = cf; chf < cf + 100 - rtty_baud / 4; chf += 5) { spwrlo = wf->powerDensity(chf - shift/2, delta); spwrhi = wf->powerDensity(chf + shift/2, delta); npwr = (wf->powerDensity(chf, delta) * 3000 / rtty_baud) + 1e-10; if ((spwrlo / npwr > rtty_squelch) && (spwrhi / npwr > rtty_squelch)) { if (!i && (channel[i+1].state == SRCHG || channel[i+1].state == RCVNG)) break; if ((i == (progdefaults.VIEWERchannels -2)) && (channel[i+1].state == SRCHG || channel[i+1].state == RCVNG)) break; if (i && (channel[i-1].state == SRCHG || channel[i-1].state == RCVNG)) break; if (i > 3 && (channel[i-2].state == SRCHG || channel[i-2].state == RCVNG)) break; channel[i].frequency = chf; channel[i].sigsearch = SIGSEARCH; channel[i].state = SRCHG; REQ(&viewaddchr, i, (int)channel[i].frequency, 0, mode); break; } } } for (int i = 1; i < progdefaults.VIEWERchannels; i++ ) if (fabs(channel[i].frequency - channel[i-1].frequency) < rtty_baud/2) clearch(i); } void view_rtty::clearch(int ch) { channel[ch].state = IDLE; channel[ch].rxstate = RTTY_RX_STATE_IDLE; channel[ch].rxmode = LETTERS; channel[ch].phaseacc = 0; channel[ch].frequency = NULLFREQ; channel[ch].poserr = channel[ch].negerr = 0.0; REQ( &viewclearchannel, ch); } void view_rtty::clear() { for (int ch = 0; ch < progdefaults.VIEWERchannels; ch++) { channel[ch].state = IDLE; channel[ch].rxstate = RTTY_RX_STATE_IDLE; channel[ch].rxmode = LETTERS; channel[ch].phaseacc = 0; channel[ch].frequency = NULLFREQ; channel[ch].poserr = channel[ch].negerr = 0.0; } } int view_rtty::rx_process(const double *buf, int buflen) { cmplx z, zmark, zspace, *zp_mark, *zp_space; static bool bit = true; int n = 0; { reverse = wf->Reverse() ^ !wf->USB(); } rtty_squelch = pow(10, progStatus.VIEWER_rttysquelch / 10.0); for (int ch = 0; ch < progdefaults.VIEWERchannels; ch++) { if (channel[ch].state == IDLE) continue; if (channel[ch].sigsearch) { channel[ch].sigsearch--; if (!channel[ch].sigsearch) channel[ch].state = RCVNG; } for (int len = 0; len < buflen; len++) { z = cmplx(buf[len], buf[len]); zmark = mixer(channel[ch].mark_phase, channel[ch].frequency + shift/2.0, z); channel[ch].mark_filt->run(zmark, &zp_mark); zspace = mixer(channel[ch].space_phase, channel[ch].frequency - shift/2.0, z); n = channel[ch].space_filt->run(zspace, &zp_space); // n loop if (n) Metric(ch); for (int i = 0; i < n; i++) { channel[ch].mark_mag = abs(zp_mark[i]); channel[ch].mark_env = decayavg (channel[ch].mark_env, channel[ch].mark_mag, (channel[ch].mark_mag > channel[ch].mark_env) ? symbollen / 4 : symbollen * 16); channel[ch].mark_noise = decayavg (channel[ch].mark_noise, channel[ch].mark_mag, (channel[ch].mark_mag < channel[ch].mark_noise) ? symbollen / 4 : symbollen * 48); channel[ch].space_mag = abs(zp_space[i]); channel[ch].space_env = decayavg (channel[ch].space_env, channel[ch].space_mag, (channel[ch].space_mag > channel[ch].space_env) ? symbollen / 4 : symbollen * 16); channel[ch].space_noise = decayavg (channel[ch].space_noise, channel[ch].space_mag, (channel[ch].space_mag < channel[ch].space_noise) ? symbollen / 4 : symbollen * 48); channel[ch].noise_floor = std::min(channel[ch].space_noise, channel[ch].mark_noise); // clipped if clipped decoder selected double mclipped = 0, sclipped = 0; mclipped = channel[ch].mark_mag > channel[ch].mark_env ? channel[ch].mark_env : channel[ch].mark_mag; sclipped = channel[ch].space_mag > channel[ch].space_env ? channel[ch].space_env : channel[ch].space_mag; if (mclipped < channel[ch].noise_floor) mclipped = channel[ch].noise_floor; if (sclipped < channel[ch].noise_floor) sclipped = channel[ch].noise_floor; // Optimal ATC // int v = (((mclipped - channel[ch].noise_floor) * (channel[ch].mark_env - channel[ch].noise_floor) - // (sclipped - channel[ch].noise_floor) * (channel[ch].space_env - channel[ch].noise_floor)) - // 0.25 * ((channel[ch].mark_env - channel[ch].noise_floor) * // (channel[ch].mark_env - channel[ch].noise_floor) - // (channel[ch].space_env - channel[ch].noise_floor) * // (channel[ch].space_env - channel[ch].noise_floor))); // bit = (v > 0); // Kahn Square Law demodulator bit = norm(zp_mark[i]) >= norm(zp_space[i]); channel[ch].mark_history[channel[ch].inp_ptr] = zp_mark[i]; channel[ch].space_history[channel[ch].inp_ptr] = zp_space[i]; channel[ch].inp_ptr = (channel[ch].inp_ptr + 1) % VIEW_MAXPIPE; if (channel[ch].state == RCVNG && rx( ch, reverse ? !bit : bit ) ) { if (channel[ch].sigsearch) channel[ch].sigsearch--; int mp0 = channel[ch].inp_ptr - 2; int mp1 = mp0 + 1; if (mp0 < 0) mp0 += VIEW_MAXPIPE; if (mp1 < 0) mp1 += VIEW_MAXPIPE; double ferr = (TWOPI * samplerate / rtty_baud) * (!reverse ? arg(conj(channel[ch].mark_history[mp1]) * channel[ch].mark_history[mp0]) : arg(conj(channel[ch].space_history[mp1]) * channel[ch].space_history[mp0])); if (fabs(ferr) > rtty_baud / 2) ferr = 0; channel[ch].freqerr = decayavg ( channel[ch].freqerr, ferr / 4, progdefaults.rtty_afcspeed == 0 ? 8 : progdefaults.rtty_afcspeed == 1 ? 4 : 1 ); if (channel[ch].metric > pow(10, progStatus.VIEWER_rttysquelch / 10.0)) channel[ch].frequency -= ferr; } } } } find_signals(); return 0; } char view_rtty::baudot_dec(int ch, unsigned char data) { int out = 0; switch (data) { case 0x1F: /* letters */ channel[ch].rxmode = LETTERS; break; case 0x1B: /* figures */ channel[ch].rxmode = FIGURES; break; case 0x04: /* unshift-on-space */ if (progdefaults.UOSrx) channel[ch].rxmode = LETTERS; return ' '; break; default: if (channel[ch].rxmode == LETTERS) out = letters[data]; else out = figures[data]; break; } return out; } //===================================================================== // RTTY transmit //===================================================================== int view_rtty::tx_process() { return 0; } fldigi-4.2.05/src/rtty/fsk.cxx0000664000175000017500000002327714611711171013076 00000000000000// ---------------------------------------------------------------------------- // fsk.cxx -- FSK signal generator // // Copyright (C) 2021 // Dave Freese, W1HKJ // // This file is part of fldigi. // // This code bears some resemblance to code contained in gmfsk from which // it originated. Much has been changed, but credit should still be // given to Tomi Manninen (oh2bns@sral.fi), who so graciously distributed // his gmfsk modem under the GPL. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "trx.h" #include "fsk.h" #include "serial.h" #include #include #include #include #include //#include #if !HAVE_CLOCK_GETTIME # ifdef __APPLE__ # include # define CLOCK_REALTIME 0 # define CLOCK_MONOTONIC 6 # endif # if HAVE_SYS_TIME_H # include # endif #endif #include #include #ifdef __WIN32__ # include //# include # include #else # ifdef __APPLE__ //# include # include # include # else //# include # include # endif #endif #include "threads.h" #include "util.h" #include "configuration.h" #include "debug.h" static pthread_mutex_t fsk_mutex = PTHREAD_MUTEX_INITIALIZER; //using namespace std; //using namespace std::chrono; //static std::chrono::time_point tp_start, tp_end; char FSK::letters[32] = { '\0', 'E', '\n', 'A', ' ', 'S', 'I', 'U', '\r', 'D', 'R', 'J', 'N', 'F', 'C', 'K', 'T', 'Z', 'L', 'W', 'H', 'Y', 'P', 'Q', 'O', 'B', 'G', ' ', 'M', 'X', 'V', ' ' }; /* * U.S. version of the figures case. */ char FSK::figures[32] = { '\0', '3', '\n', '-', ' ', '\a', '8', '7', '\r', '$', '4', '\'', ',', '!', ':', '(', '5', '"', ')', '2', '#', '6', '0', '1', '9', '?', '&', ' ', '.', '/', ';', ' ' }; const char * FSK::ascii[256] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "", "", "", "", "", "", " ", "!", "\"","#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\","]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", "<160>", "<161>", "<162>", "<163>", "<164>", "<165>", "<166>", "<167>", "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", "<176>", "<177>", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>", "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "<247>", "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" }; FSK::FSK() { str_buff.clear(); start_bits = 0; stop_bits = 0; chr_bits = 0; fsk_chr = 0; chr_out = 0; shift_state = FSK_FIGURES; shift = 0; _shift_on_space = false; init_fsk_thread(); shared_port = false; _sending = false; fsk_port = new Cserial(); } FSK::~FSK() { exit_fsk_thread(); if (shared_port) return; fsk_port->ClosePort(); delete fsk_port; } void FSK::open_port(std::string device_name) { if (shared_port) return; serial_device = device_name; fsk_port->Device (serial_device.c_str()); fsk_port->OpenPort(); } void FSK::fsk_shares_port(Cserial *shared_device) { //std::cout << "fsk shares port : " << shared_device << std::endl; shared_port = true; delete fsk_port; fsk_port = shared_device; } bool FSK::sending() { return chr_out != 0; // return str_buff.length() > 0; } void FSK::send(const char ch) { chr_out = ch; // str_buff.clear(); // str_buff += ch; } void FSK::append(const char ch) { chr_out = ch; // str_buff += ch; } void FSK::send(std::string s) { str_buff = s; } void FSK::append(std::string s) { str_buff.append(s); } void FSK::abort() { str_buff.clear(); } void FSK::fsk_out (bool state) { if (_dtr) { fsk_port->SetDTR(_reverse ? state : !state); } else { fsk_port->SetRTS(_reverse ? state : !state); } } int FSK::baudot_enc(int data) { data &= 0xFF; int i; if (islower(data)) data = toupper(data); if (data == ' ') // always force space to be a LETTERS char return FSK_LETTERS | 4; for (i = 0; i < 32; i++) { if (data == letters[i]) { return (i | FSK_LETTERS); } if (data == figures[i]) { return (i | FSK_FIGURES); } } return shift_state | 4; } //---------------------------------------------------------------------- void FSK::send_baudot(int ch) { fskbit(FSK_SPACE, BITLEN); fskbit((ch & 0x01) == 0x01 ? FSK_MARK : FSK_SPACE, BITLEN); fskbit((ch & 0x02) == 0x02 ? FSK_MARK : FSK_SPACE, BITLEN); fskbit((ch & 0x04) == 0x04 ? FSK_MARK : FSK_SPACE, BITLEN); fskbit((ch & 0x08) == 0x08 ? FSK_MARK : FSK_SPACE, BITLEN); fskbit((ch & 0x10) == 0x10 ? FSK_MARK : FSK_SPACE, BITLEN); fskbit(FSK_MARK, BITLEN * (progdefaults.fsk_STOPBITS ? 1.5 : 2.0)); } //---------------------------------------------------------------------- extern state_t trx_state; static int idles = 0; int FSK::callback_method() { if (trx_state != STATE_TX || chr_out == 0) { stop_bits = 0; idles = 4; MilliSleep(22); return 0; } while (idles) { send_baudot(LTRS); shift_state = FSK_LETTERS; idles--; } if (chr_out == 0x03) { chr_out = 0; send_baudot(LTRS); shift_state = FSK_LETTERS; } else { fsk_chr = baudot_enc(chr_out & 0xFF); if ((fsk_chr & 0x300) != shift_state) { shift_state = fsk_chr & 0x300; if (shift_state == FSK_LETTERS) { send_baudot(LTRS); } else { send_baudot(FIGS); } } chr_out = 0; send_baudot(fsk_chr & 0x1F); } return 0; } void *fsk_loop(void *data) { SET_THREAD_ID(FSK_TID); FSK *fsk = (FSK *)data; while (1) { fsk->callback_method(); { guard_lock tlock (&fsk_mutex); if (fsk->fsk_loop_terminate) goto _exit; } } _exit: return NULL; } int FSK::init_fsk_thread() { fsk_loop_terminate = false; if(pthread_mutex_init(&fsk_mutex, NULL)) { LOG_ERROR("FSK tabortimer thread create fail (pthread_mutex_init)"); return 0; } if (pthread_create(&fsk_thread, NULL, fsk_loop, this)) { LOG_ERROR("FSK timer thread create fail (pthread_create)"); return 0; } return 1; } void FSK::exit_fsk_thread() { { guard_lock tlock (&fsk_mutex); fsk_loop_terminate = true; MilliSleep(50); } pthread_join(fsk_thread, NULL); fsk_loop_terminate = false; } double FSK::fsk_now() { static struct timespec tp; #if HAVE_CLOCK_GETTIME clock_gettime(CLOCK_MONOTONIC, &tp); #elif defined(__WIN32__) DWORD msec = GetTickCount(); tp.tv_sec = msec / 1000; tp.tv_nsec = (msec % 1000) * 1000000; #elif defined(__APPLE__) static mach_timebase_info_data_t info = { 0, 0 }; if (unlikely(info.denom == 0)) mach_timebase_info(&info); uint64_t t = mach_absolute_time() * info.numer / info.denom; tp.tv_sec = t / 1000000000; tp.tv_nsec = t % 1000000000; #endif return 1.0 * tp.tv_sec + tp.tv_nsec * 1e-9; } // set DTR/RTS to bit value for secs duration //#define TTEST #ifdef TTEST static FILE *ttest = 0; #endif void FSK::fskbit(int bit, double secs) { #ifdef TTEST if (!ttest) ttest = fopen("ttest.txt", "a"); #endif static struct timespec tv = { 0, 1000000L}; static double end1 = 0; static double end2 = 0; static double t1 = 0; #ifdef TTEST static double t2 = 0; #endif static double t3 = 0; static double t4 = 0; int loop1 = 0; int loop2 = 0; int n1 = secs*1e3; #ifdef __WIN32__ timeBeginPeriod(1); #endif t1 = fsk_now(); end2 = t1 + secs - 0.0001; fsk_out(bit); #ifdef TTEST t2 = fsk_now(); #endif end1 = end2 - 0.005; t3 = fsk_now(); while (t3 < end1 && (++loop1 < n1)) { nanosleep(&tv, NULL); t3 = fsk_now(); } t4 = t3; while (t4 <= end2) { loop2++; t4 = fsk_now(); } #ifdef __WIN32__ timeEndPeriod(1); #endif #ifdef TTEST if (ttest) fprintf(ttest, "%d, %d, %d, %6f, %6f, %6f, %6f, %6f, %6f, %6f\n", bit, loop1, loop2, secs * 1e3, (t2 - t1)*1e3, (t3 - t1)*1e3, (t3 - end1) * 1e3, (t4 - t1)*1e3, (t4 - end2) * 1e3, (t4 - t1 - secs)*1e3); #endif } fldigi-4.2.05/src/psm/0000775000175000017500000000000014611714005011430 500000000000000fldigi-4.2.05/src/psm/psm.h0000664000175000017500000000315014532252172012323 00000000000000// ---------------------------------------------------------------------------- // psm/psm.h // // Support for Signal Montoring, CSMA, Transmit Inhibit (Busy Detection) // Effect all transmission types, Keybord, ARQ and KISS interface. // // Copyright (c) 2016 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef __psm_h__ #define __psm_h__ enum { CSMA_PERSISTANCE = 0x01, CSMA_SLOT_TIME = 0x02, CSMA_TX_DELAY = 0x04, CSMA_ALL = (CSMA_PERSISTANCE|CSMA_SLOT_TIME|CSMA_TX_DELAY) }; enum { PSM_STOP = 1, PSM_ABORT }; extern bool psm_thread_running; extern void psm_reset_histogram(void); extern void psm_transmit(void); extern void psm_transmit_ended(int flag); extern void start_psm_thread(void); extern void stop_psm_thread(void); extern void signal_psm(void); extern void update_kpsql_fractional_gain(int value); extern void update_csma_io_config(int update_this); #endif /* __psm_h__ */ fldigi-4.2.05/src/psm/psm.cxx0000664000175000017500000004327214611711171012704 00000000000000// ---------------------------------------------------------------------------- // psm/psm.cxx // // Support for Signal Montoring, CSMA, Transmit Inhibit (Busy Detection) // When enabled effects all transmission types, Keybord, ARQ, and KISS. // // Copyright (c) 2016 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #if !defined(__WOE32__) && !defined(__APPLE__) # include # include #endif #include #include #include #include #include "main.h" #include "fl_digi.h" #include "trx.h" #include "globals.h" #include "threads.h" #include "socket.h" #include "debug.h" #include "qrunner.h" #include "data_io.h" #include "configuration.h" #include "status.h" #include "confdialog.h" #include "psm/psm.h" #include "gettext.h" #include "timeops.h" #include "kiss_io.h" #include "xmlrpc.h" #include "arq_io.h" #define HISTO_COUNT 256 static int HISTO_THRESH_HOLD = 48; // In seconds #define HISTO_RESET_TIME 180 #define HISTO_RESET_TX_TIME_INHIBIT 3 #define DISABLE_TX_INHIBIT_DURATION 5 #define EST_STATE_CHANGE_MS 25 static int histogram[HISTO_COUNT]; //static bool init_hist_flag = true; static double threshold = 5.0; static int kpsql_pl = 0; static double kpsql_threshold = 0.0; time_t inhibit_tx_seconds = 0; // Used to scale the sensitivity of PSM // Values range from 1/(largest int value) to 1/1 #define FGD_DEFAULT 2 static double fractional_gain = (1.0 / (1.0 * FGD_DEFAULT)); static pthread_t psm_pthread; static pthread_cond_t psm_cond; static pthread_mutex_t psm_mutex; bool psm_thread_running = false; static bool psm_terminate_flag = false; static bool psm_thread_exit_flag = false; static bool request_transmit_flag = false; // A list of timers static double timer_tramit_buffer_timeout = 0; static double timer_slot_time = 0; static double timer_inhibit_tx_seconds = 0; static double timer_histrogram_reset_timer = 0; static double timer_temp_disable_tx_inhibit = 0; static double timer_sql_timer = 0; static pthread_mutex_t external_access_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t millisleep_mutex = PTHREAD_MUTEX_INITIALIZER; static void update_sql_display(void); static double detect_signal(int freq, int bw, double *low, double *high); static void flush_tx_buffer(void); static void process_psm(void); static void * psm_loop(void *args); static inline double current_double_time(void); static void psm_millisleep(int delay_time); bool csma_idling = 0; /********************************************************************************** * Use a local version of MilliSleep() **********************************************************************************/ static void psm_millisleep(int delay_time) { guard_lock _lock(&millisleep_mutex); size_t seconds = 0; size_t nano_seconds = 0; struct timespec timeout = {0}; double to_time = current_double_time(); to_time += (delay_time * 0.001); seconds = (size_t) to_time; nano_seconds = (size_t) ((to_time - seconds) * 1000000000.0); timeout.tv_sec = seconds; timeout.tv_nsec = nano_seconds; pthread_cond_timedwait(&psm_cond, &millisleep_mutex, &timeout); } /********************************************************************************** * Reset Histogram **********************************************************************************/ void psm_reset_histogram(void) { guard_lock _lock(&external_access_mutex); memset(histogram, 0, sizeof(histogram)); histogram[3] = 1; timer_inhibit_tx_seconds = current_double_time() + HISTO_RESET_TX_TIME_INHIBIT; } /********************************************************************************** * **********************************************************************************/ void update_kpsql_fractional_gain(int value) { guard_lock _lock(&external_access_mutex); if(value > 1) { progdefaults.kpsql_attenuation = value; fractional_gain = 1.0 / ((double) value); } else { progdefaults.kpsql_attenuation = FGD_DEFAULT; fractional_gain = 1.0 / ( 1.0 * FGD_DEFAULT); } } /********************************************************************************** * **********************************************************************************/ static void update_sql_display(void) { static int prev_power_level = 0; static double convert_scale = (1.0 / ((double)HISTO_COUNT)); if(progdefaults.show_psm_btn && progStatus.kpsql_enabled) { double high_limit = 0; double low_limit = 0; if(kpsql_pl != prev_power_level) { prev_power_level = kpsql_pl; high_limit = sldrSquelch->maximum(); low_limit = sldrSquelch->minimum(); if(kpsql_pl > HISTO_COUNT) { REQ(callback_set_metric, low_limit); } else { double diff = high_limit - low_limit; double scaled_value = kpsql_pl * convert_scale; double convert_value = scaled_value * diff; double results = high_limit - convert_value; REQ(callback_set_metric, results); } } } } /********************************************************************************** * To deal with the AGC from radios we create a ratio between * the high and low signal levels. **********************************************************************************/ static double detect_signal(int freq, int bw, double *low, double *high) { int freq_step = 10; int freq_pos = 0; int start_freq = freq - (bw >> 1); int end_freq = freq + (bw >> 1); int freq_half_step = freq_step >> 1; int i = 0; double low_value = FLT_MAX; double high_value = FLT_MIN; double ratio = 0.0; double pd = 0; double ratio_avg = 0.0; static double pratio0 = 0.0; static double pratio1 = 0.0; static double pratio2 = 0.0; static double pratio3 = 0.0; if(trx_state != STATE_RX) return ratio_avg; for(i = 0; start_freq <= end_freq; start_freq += freq_step, i++) { freq_pos = start_freq + freq_half_step; pd = wf->powerDensity((double) freq_pos, (double) freq_step); if(pd < low_value) low_value = pd; if(pd > high_value) high_value = pd; } if(low) *low = low_value; if(high) *high = high_value; ratio = high_value/low_value; ratio *= fractional_gain; kpsql_pl = ratio_avg = (ratio + pratio0 + pratio1 + pratio2 + pratio3) * 0.20; if((ratio_avg > 0.0) && (ratio_avg <= (double) HISTO_COUNT)) { i = (int) ratio_avg; i &= 0xFF; histogram[i]++; if(histogram[i] > HISTO_THRESH_HOLD) { for(i = 0; i < HISTO_COUNT; i++) { histogram[i] >>= 1; } return 0.0; } } pratio3 = pratio2; pratio2 = pratio1; pratio1 = pratio0; pratio0 = ratio; return ratio; } /********************************************************************************** * Clear all transmit buffers (ARQ/KISS/XMLRPC) **********************************************************************************/ static void flush_tx_buffer(void) { if(kiss_text_available) { flush_kiss_tx_buffer(); kiss_text_available = false; } if(arq_text_available) { flush_arq_tx_buffer(); arq_text_available = false; } if(xmltest_char_available) { reset_xmlchars(); xmltest_char_available = false; } } /********************************************************************************** * Set state for PSM transmit. **********************************************************************************/ void psm_transmit(void) { guard_lock extern_lock(&external_access_mutex); request_transmit_flag = true; } /********************************************************************************** * Clear state for PSM transmit. **********************************************************************************/ void psm_transmit_ended(int flag) { guard_lock extern_lock(&external_access_mutex); if(flag == PSM_ABORT) { flush_tx_buffer(); abort_tx(); } request_transmit_flag = false; REQ(set_xmtrcv_selection_color_transmitting); } /********************************************************************************** * Convert timespec difference to absolute double. **********************************************************************************/ #if 0 static double timespec_difference(timespec * ts_a, timespec * ts_b) { if(!ts_a) return 0.0; if(!ts_b) return 0.0; double a = ts_a->tv_sec + (ts_a->tv_nsec * 0.000000001); double b = ts_b->tv_sec + (ts_b->tv_nsec * 0.000000001); if(a > b) return (a - b); return (b - a); } #endif // 0 /********************************************************************************** * Convert timespec to double. **********************************************************************************/ static inline double current_double_time(void) { struct timespec current_timespec_time = {0}; clock_gettime(CLOCK_REALTIME, ¤t_timespec_time); double a = current_timespec_time.tv_sec + (current_timespec_time.tv_nsec * 0.000000001); return a; } /********************************************************************************** * PSM processing. Sync's with Waterfall Display Update **********************************************************************************/ static void process_psm(void) { if (!progdefaults.show_psm_btn) return; if (!progStatus.kpsql_enabled) return; guard_lock psm_lock(&psm_mutex); bool detected_signal = false; bool transmit_authorized = true; double busyChannelSeconds = 0; double current_time = 0; double level = 0.0; double random_number = 0; int bw = active_modem->get_bandwidth(); int bw_margin = progStatus.psm_minimum_bandwidth_margin; int freq = active_modem->get_txfreq(); static bool histrogram_reset_timer = true; static bool signal_recorded_flag = false; static double signal_hit_time = 0; static int delay_time = 0; current_time = current_double_time(); level = detect_signal(freq, bw + bw_margin, 0, 0); if(!progStatus.enableBusyChannel) { timer_inhibit_tx_seconds = temp_disable_tx_inhibit = 0; } // Enabled on valid packet reception. Currently only available // to checksum verified protocols (HDLC). if(temp_disable_tx_inhibit) { timer_temp_disable_tx_inhibit = current_time + DISABLE_TX_INHIBIT_DURATION; temp_disable_tx_inhibit = 0; } random_number = (rand() & 0xFF) * 0.00390625; // Reduce value to 0 - 1.0 if(current_time < timer_temp_disable_tx_inhibit) { busyChannelSeconds = 0.25 + (random_number * 0.75); // 0.25 - 1.0 Seconds } else { busyChannelSeconds = (double) progStatus.busyChannelSeconds + random_number; } if(timer_tramit_buffer_timeout == 0.0) { timer_tramit_buffer_timeout = current_time + (progStatus.psm_flush_buffer_timeout * 60); // Minutes to Seconds } // If busy for an extended time flush transmit buffer(s). if(progStatus.psm_flush_buffer_timeout) { // If set to zero no buffer flushing allowed. if(current_time > timer_tramit_buffer_timeout) { timer_tramit_buffer_timeout = current_time + (progStatus.psm_flush_buffer_timeout * 60); flush_tx_buffer(); return; } } if(histrogram_reset_timer) { timer_histrogram_reset_timer = current_time + HISTO_RESET_TIME; histrogram_reset_timer = false; } if(current_time > timer_histrogram_reset_timer) { psm_reset_histogram(); timer_histrogram_reset_timer = current_time + HISTO_RESET_TIME; timer_inhibit_tx_seconds = current_time + 2.0; // Time to rebuild the histogram table. return; } // Histogram keeps the threshold 'x' number of units above the noise level. if(progStatus.psm_use_histogram) { int idx = 0; int first_value = 0; int offset = progStatus.psm_histogram_offset_threshold; int index = 0; if(offset > HISTO_COUNT) offset = HISTO_COUNT; for(index = 0; index < HISTO_COUNT; index++) { if(histogram[index]) { if(idx == 0) { first_value = index; } if(idx >= offset) { threshold = (double) index; break; } idx++; } } if(index > HISTO_COUNT) { threshold = (double) (first_value + offset); } } else { threshold = (int) (progStatus.sldrPwrSquelchValue * 2.56); // Histogram scaled. } kpsql_threshold = threshold; if(level < threshold) { detected_signal = false; signal_recorded_flag = false; } else { detected_signal = true; if(!signal_recorded_flag) { signal_hit_time = current_double_time(); signal_recorded_flag = true; } } if(progStatus.enableBusyChannel && detected_signal) { double signal_hit_time_test = (progStatus.psm_hit_time_window * 0.001); // Milliseconds to seconds. double signal_hit_time_diff = (current_time - signal_hit_time); if(signal_hit_time_diff >= signal_hit_time_test) { timer_inhibit_tx_seconds = current_time + busyChannelSeconds; } } if(current_time < timer_inhibit_tx_seconds) { inhibit_tx_seconds = true; } else { inhibit_tx_seconds = false; } // Limit the number of times update_sql_display() is called per second. if(current_time > timer_sql_timer) { update_sql_display(); timer_sql_timer = current_time + 0.06; // Eyeball tested value. } if(inhibit_tx_seconds || !request_transmit_flag || detected_signal || (current_time < timer_slot_time)) return; delay_time = 0; if(progStatus.csma_enabled) { int rn_persistance = rand() & 0xFF; if(rn_persistance > progStatus.csma_persistance) { double _slot_time = ((progdefaults.csma_slot_time * 10) * 0.001); timer_slot_time = current_time + _slot_time; transmit_authorized = false; } if(progStatus.csma_transmit_delay > 0) { csma_idling = true; delay_time = progStatus.csma_transmit_delay * 10; } } if(transmit_authorized && (trx_state == STATE_RX)) { REQ(set_xmtrcv_selection_color_transmitting); trx_transmit_psm(); active_modem->set_stopflag(false); // Transmit idle time plus START_RX to STATE_TX state change // delay. if(delay_time > 0) { psm_millisleep(delay_time + EST_STATE_CHANGE_MS); delay_time = 0; csma_idling = false; } else { psm_millisleep(EST_STATE_CHANGE_MS); } timer_tramit_buffer_timeout = current_time + (progStatus.psm_flush_buffer_timeout * 60); timer_slot_time = current_time + ((progdefaults.csma_slot_time * 10) * 0.001); timer_slot_time += (((rand() & 0xFF) * 0.00390625) * 0.20); } } /********************************************************************************** * PSM processing loop. Sync's with Waterfall Display Update **********************************************************************************/ static void * psm_loop(void *args) { SET_THREAD_ID(PSM_TID); psm_thread_running = true; psm_terminate_flag = false; psm_thread_exit_flag = false; while(1) { pthread_mutex_lock(&psm_mutex); pthread_cond_wait(&psm_cond, &psm_mutex); pthread_mutex_unlock(&psm_mutex); if (psm_terminate_flag) break; if(trx_state == STATE_RX) { process_psm(); } } psm_thread_exit_flag = true; return (void *)0; } /********************************************************************************** * Start PSM Thread **********************************************************************************/ void start_psm_thread(void) { guard_lock extern_lock(&external_access_mutex); csma_idling = false; if(psm_thread_running) return; memset((void *) &psm_pthread, 0, sizeof(psm_pthread)); memset((void *) &psm_cond, 0, sizeof(psm_cond)); memset((void *) &psm_mutex, 0, sizeof(psm_mutex)); if(pthread_cond_init(&psm_cond, NULL)) { LOG_ERROR("PSM thread create fail (pthread_cond_init)"); return; } if(pthread_mutex_init(&psm_mutex, NULL)) { LOG_ERROR("PSM thread create fail (pthread_mutex_init)"); pthread_cond_destroy(&psm_cond); return; } memset((void *) &psm_pthread, 0, sizeof(psm_pthread)); if(!psm_thread_running) { if (pthread_create(&psm_pthread, NULL, psm_loop, NULL) < 0) { pthread_cond_destroy(&psm_cond); pthread_mutex_destroy(&psm_mutex); LOG_ERROR("PSM thread create fail (pthread_create)"); } } MilliSleep(10); // Give the CPU time to set 'psm_thread_running' } /********************************************************************************** * Stop PSM Thread **********************************************************************************/ void stop_psm_thread(void) { guard_lock extern_lock(&external_access_mutex); if(!psm_thread_running) return; psm_terminate_flag = true; pthread_cond_signal(&psm_cond); MilliSleep(10); if(psm_thread_exit_flag) { pthread_join(psm_pthread, NULL); LOG_INFO("%s", "psm thread - join"); } else { CANCEL_THREAD(psm_pthread); LOG_INFO("%s", "psm thread - cancel"); } pthread_cond_destroy(&psm_cond); pthread_mutex_destroy(&psm_mutex); memset((void *) &psm_pthread, 0, sizeof(psm_pthread)); memset((void *) &psm_cond, 0, sizeof(psm_cond)); memset((void *) &psm_mutex, 0, sizeof(psm_mutex)); psm_thread_running = false; psm_terminate_flag = false; psm_thread_exit_flag = false; csma_idling = false; } /********************************************************************************** * Signal PSM to process Waterfall power level information. **********************************************************************************/ void signal_psm(void) { if(psm_thread_running) { pthread_cond_signal(&psm_cond); } } fldigi-4.2.05/src/navtex/0000775000175000017500000000000014611714005012136 500000000000000fldigi-4.2.05/src/navtex/navtex.cxx0000664000175000017500000016505514611711171014124 00000000000000// --------------------------------------------------------------------- // // navtex.cxx // // Copyright (C) 2011-2016 // Remi Chateauneu, F4ECW // Rik van Riel, AB1KW, // // This file is part of fldigi. Adapted from code contained in JNX // source code distribution. // JNX Copyright (C) Paul Lutus // http://www.arachnoid.com/JNX/index.html // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Sync using multicorrelator, instead of null crossings // Rik van Riel, AB1KW, // // Null crossings are somewhat noisy, and the code to keep the navtex // decoder in sync with the incoming signal using null crossings was // rather fragile. // // Use a multicorrelator instead, which relies on the averaged magnitude // of the signal accumulator to sync the decoder with the incoming signal. // // When debugging the code, the multicorrelator mostly corrects the // modem forward in time, which can be explained by the fact that a // bit takes 110.25 samples, while the code uses 110. When the NAVTEX // transmitter is running at exactly 100 baud, one can expect to see // the decoder get adjusted 25 times a second, to make up for the // difference between 11000 and 11025. // // When multiple signals are on the air simultaneously, the null crossing // code would often lose track of the signal. The multicorrelator seems // to be more stable in this situation, though of course when both signals // are close in strength things do not get decoded right. // // The signal sampling spread of 1/6 of the width of a bit was set through // trial and error. A larger spread increases the signal difference between // early, prompt, and late samples, but reduces the accumulator value seen // by the demodulator. A smaller spread increases the accumulator value seen, // but makes it harder to lock on in noisy conditions. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // low pass mark & space individually // Rik van Riel, AB1KW, // // Putting individual low pass filters on mark and space seems to // result in an improved ability to overcome pulse noise, and decode // weaker navtex signals. // // I have not found any signal where the performance of the codec // got worse with this change. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Correct display metric // Rik van Riel, AB1KW, // // The NAVTEX display_metric() function was buggy, in that decayavg // returns the decayed value, but does not store it. It always put // the current value in the metric, and kept avg_ratio at 0.0. // // This resulted in a somewhat chaotic, and not very useful metric // display. Copy over the S/N calculation from the RTTY code, because // that code seems to work well. // Also print the S/N in Status2, like the RTTY code and other modes // do. // Copying over the RTTY S/N code wholesale might still not be // enough, since the NAVTEX wave form appears to be somewhat // different from RTTY. However, at least we have something // now, and the metric used for squelch seems to work again. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Correct display metric // Rik van Riel, AB1KW, // // Widen afc filter for 'jump 90 Hz' code // // When the NAVTEX code spots a power imbalance of more than a factor // 5 between mark and space, it will shift the frequency by 90 Hz. // This is reported to help with some signals. // // However, it breaks with some other signals, which have a different // spectral distribution between mark and space, with a spectrum looking // something like this: // // * // * // * // ** // ****** *** // ******** ****** // ********** ******** // ******************************************** // ********************************************** // // In this spectrum, mark & space have a similar amount of energy, // but that is only apparent when the comparison between them is // done on a wider sample than 10 Hz. // // Sampling 30 Hz instead seems to result in a more stable AFC. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // use exact bit length // Rik van Riel, AB1KW, // // With a baud rate of 100 and a sample rate of 11025, the number // of bits per sample is 110.25. Approximating this with 110 bits // per sample results in the decoder continuously chasing after the // signal, and losing it more easily during transient noise or // interference events. // // Simply changing the variable type from int to double makes life // a little easier on the bit tracking code. // // The accumulator does not seem to care that it gets an extra sample // every 4 bit periods. // --------------------------------------------------------------------- // --------------------------------------------------------------------- // improvements to the multi correlator // Rik van Riel, AB1KW, // // While the multi correlator for bit sync was a nice improvement over // the null crossing tracking, it did lose sync too easily in the presence // of transient noise or interference, and was full of magic adjustments. // // Replace the magic adjustments with a calculation, which makes the multi // correlator able to ride out transient noise or interference, and then // make a larger adjustment all at once (if needed). // --------------------------------------------------------------------- // --------------------------------------------------------------------- // use same mark/space detector as RTTY modem // Rik van Riel, AB1KW, // // Switch the NAVTEX modem over to the same mark/spac decoder, with W7AY's // automatic threshold correction algorithm, like the RTTY modem uses. // // The noise subtraction is a little different than in the RTTY modem; // the algorithm used in W7AY's code seems to work a little better with // the noise present at 518 kHz, when compared to the algorithm used in // the RTTY modem. // // I have compared this detector to a correlation detector; the latter // appears to be a little more sensitive, which includes higher // sensitivity to noise. With a 250 Hz filter on the radio, the // correlation detector might be a little bit better, while with the // filter on the radio opened up to 4kHz wide, this detector appears // to be more robust. // // On signals with a large mark/space power imbalance, or where the power // distribution in one of the two throws off the automatic frequency // correction, this decoder is able to handle signals that neither of // the alternatives tested does. // --------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "configuration.h" #include "fl_digi.h" #include "debug.h" #include "gettext.h" #include "navtex.h" #include "logbook.h" #include "coordinate.h" #include "misc.h" #include "status.h" #include "strutil.h" #include "kmlserver.h" #include "record_loader.h" #include "fftfilt.h" #include "strutil.h" #include "FL/fl_ask.H" pthread_mutex_t navtex_filter_mutex = PTHREAD_MUTEX_INITIALIZER; /// This models a line of the file defining Navtex stations. class NavtexRecord { std::string m_country ; std::string m_country_code ; double m_frequency ; char m_origin ; std::string m_callsign ; std::string m_name ; CoordinateT::Pair m_coordinates ; std::string m_locator ; /// Reads a CSV file. static const char m_delim = ';'; public: NavtexRecord() : m_frequency(0.0) , m_origin('?') , m_name( _("Unknown station") ) {} char origin(void) const { return m_origin; }; const CoordinateT::Pair & coordinates() const { return m_coordinates; } double frequency(void) const { return m_frequency; }; const std::string & country() const { return m_country; } const std::string & name() const { return m_name; } const std::string & callsign() const { return m_callsign; } /// Example: Azores;AZR;490.0;J;CTH;Horta;38 32 N;28 38 W;II;PP friend std::istream & operator>>( std::istream & istrm, NavtexRecord & rec ) { std::string input_str ; if( ! std::getline( istrm, input_str ) ) return istrm ; std::stringstream str_strm( input_str ); if( read_until_delim( m_delim, str_strm, rec.m_country ) && read_until_delim( m_delim, str_strm /* Country code */ ) && read_until_delim( m_delim, str_strm, rec.m_frequency ) && read_until_delim( m_delim, str_strm, rec.m_origin ) && read_until_delim( m_delim, str_strm, rec.m_callsign ) && read_until_delim( m_delim, str_strm, rec.m_name ) && read_until_delim( m_delim, str_strm, rec.m_coordinates.latitude() ) && read_until_delim( m_delim, str_strm, rec.m_coordinates.longitude() ) && read_until_delim( m_delim, str_strm /* Zone */ ) && read_until_delim( m_delim, str_strm /* Language */ ) && ( rec.m_coordinates.latitude().is_lon() == false ) && ( rec.m_coordinates.longitude().is_lon() == true ) ) { return istrm ; } istrm.setstate(std::ios::eofbit); return istrm ; } }; /// Navtex catalog of stations is used when logging to ADIF file: It gives the station name, callsign etc... class NavtexCatalog : public RecordLoader< NavtexCatalog > { // TODO: Consider a multimap typedef std::deque< NavtexRecord > CatalogType ; CatalogType m_catalog ; /// Frequency more or less 1 %: 485-494 kHz, 512-523 kHz etc... static bool freq_close( double freqA, double freqB ) { static const double freq_ratio = 1.01 ; return ( freqA < freqB * freq_ratio ) || ( freqA * freq_ratio > freqB ); } /// Tells if this is a reasonable Navtex frequency. static bool freq_acceptable( double freq ) { return freq_close( freq, 490.0 ) || freq_close( freq, 518.0 ) || freq_close( freq, 4209.5 ); } void Clear() { m_catalog.clear(); } bool ReadRecord( std::istream & istrm ) { NavtexRecord tmp ; istrm >> tmp ; if( istrm || istrm.eof() ) { m_catalog.push_back( tmp ); return true ; } return false ; } /// Minimal edit distance (Levenshtein) between the pattern and any token of the string. static double DistToStationName( const std::string & msg, const std::string & pattern ) { std::stringstream strm( msg ); /// Any big number is OK, if bigger than any string length. double currDist = 1.7976931348623157e+308; // DBL_MAX ; typedef std::istream_iterator StrmIterStr ; for( StrmIterStr itStrm( strm ); itStrm != StrmIterStr(); ++itStrm ) { const std::string tmp = *itStrm ; currDist = std::min( currDist, (double)levenshtein( tmp, pattern ) ); } return currDist ; } public: std::string base_filename() const { return "NAVTEX_Stations.csv"; } const char * Description() const { return _("Navtex stations"); } /// Usual frequencies are 490, 518 or 4209 kiloHertz. const NavtexRecord * FindStation( long long freq_ll, char origin, const std::string & maidenhead, const std::string & msg) { if( maidenhead.empty() ) return NULL; if( m_catalog.empty() ) { int nbRecs = LoadAndRegister(); static bool error_signaled = false ; if( nbRecs <= 0 ) { LOG_WARN("Error reading Navtex stations file"); if(error_signaled == false) { fl_alert("Cannot read Navtex file %s", storage_filename().first.c_str() ); error_signaled = true ; return NULL; } } error_signaled = false ; } const CoordinateT::Pair coo( maidenhead ); /// Possible Navtex stations stored by closer first. typedef std::multimap< double, CatalogType::const_iterator > SolutionType ; SolutionType solDistKm; double freq = freq_ll / 1000.0 ; // As kiloHertz in the data file. bool okFreq = freq_acceptable( freq ); //LOG_INFO("Operator Maidenhead=%s lon=%lf lat=%lf okFreq=%d Origin=%c", // maidenhead.c_str(), coo.longitude().angle(), coo.latitude().angle(), okFreq, origin ); for( CatalogType::const_iterator it = m_catalog.begin(), en = m_catalog.end(); it != en ; ++it ) { /// The origin letters must be identical. if( origin != it->origin() ) continue ; /// The two frequencies must be close more or less 10%. bool freqClose = freq_close( freq, it->frequency() ); if( okFreq && ! freqClose ) continue ; /// Solutions are stored smallest distance first. double dist = coo.distance( it->coordinates() ); solDistKm.insert( SolutionType::value_type( dist, it ) ); } /// No station found. if( solDistKm.empty() ) return NULL; /// Only one station, no ambiguity. SolutionType::iterator begSolKm = solDistKm.begin(); if( solDistKm.size() == 1 ) return & ( *begSolKm->second ); SolutionType solStrDist ; // Maybe some station names appear but not others. This can be for example "Maltaradio", "Cullercoat", "Limnos" etc... for( SolutionType::iterator itSolKm = begSolKm, endSolKm = solDistKm.end(); itSolKm != endSolKm; ++itSolKm ) { std::stringstream strm ; strm << itSolKm->second->coordinates(); // LOG_INFO("Name=%s Dist=%lf %s", itSolKm->second->name().c_str(), itSolKm->first, strm.str().c_str() ); // The message is in uppercase anyway, so no need to convert. double str_dist = DistToStationName( msg, ucasestr( itSolKm->second->name() ) ); solStrDist.insert( SolutionType::value_type( str_dist, itSolKm->second ) ); } // There are at least two elements, so we can do this. SolutionType::iterator begSolStr = solStrDist.begin(); SolutionType::iterator nxtSolStr = begSolStr; ++nxtSolStr ; // The first message only contains a string very similar to a radio station. if( (begSolStr->first < 2) && ( nxtSolStr->first > 2 ) ) { //LOG_INFO("Levenshtein beg=%lf beg_name=%s next=%lf next_name=%s", // begSolStr->first, begSolStr->second->name().c_str(), // nxtSolStr->first, nxtSolStr->second->name().c_str() ); return & (*begSolStr->second) ; } // There are at least two elements, and more than one station name, or none of them, // is contained in the message. // Just returns the closest element. return & ( *begSolKm->second ); // Now we could search for a coordinate in the message, and we will keep the station which is the closest // to this coordinate. We wish to do that anyway in order to map things in KML. // Possible formats are -(This is experimental): // 67-04.0N 032-25.7E // 47-29'30N 003-16'00W // 6930.1N 01729.9E // 48-21'45N 004-31'45W // 58-37N 003-32W // 314408N 341742E // 42-42N 005-10E // 54-02.3N 004-45.8E // 55-20.76N 014-45.27E // 55-31.1 N 012-44.7 E // 5330.4N 01051.5W // 43 45.0 N - 015 44.8 E // 34-33.7N 012-28.7E // 51 10.55 N - 001 51.02 E // 51.21.67N 002.13.29E // 73 NORTH 14 EAST // 58-01.20N 005-27.08W // 50.56N 007.00,5W // 5630,1N- 00501,6E // LAT. 41.06N - LONG 012.57E // 42 40 01 N - 018 05 10 E // 40 25 31N - 18 15 30E // 40-32.2N 000-33.5E // 58-01.2 NORTH 005-27.1 WEST // 39-07,7N 026-39,2E // // ESTIMATED LIMIT OF ALL KNOWN ICE: // 4649N 5411W TO 4530N 5400W TO // 4400N 4900W TO 4545N 4530W TO // 4715N 4530W TO 5000N 4715W TO // 5530N 5115W TO 5700N 5545W. // } }; // NavtexCatalog static const unsigned char code_to_ltrs[128] = { //0 1 2 3 4 5 6 7 8 9 a b c d e f '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', // 0 '_', '_', '_', '_', '_', '_', '_', 'J', '_', '_', '_', 'F', '_', 'C', 'K', '_', // 1 '_', '_', '_', '_', '_', '_', '_', 'W', '_', '_', '_', 'Y', '_', 'P', 'Q', '_', // 2 '_', '_', '_', '_', '_', 'G', '_', '_', '_', 'M', 'X', '_', 'V', '_', '_', '_', // 3 '_', '_', '_', '_', '_', '_', '_', 'A', '_', '_', '_', 'S', '_', 'I', 'U', '_', // 4 '_', '_', '_', 'D', '_', 'R', 'E', '_', '_', 'N', '_', '_', ' ', '_', '_', '_', // 5 '_', '_', '_', 'Z', '_', 'L', '_', '_', '_', 'H', '_', '_', '\n', '_', '_', '_', // 6 '_', 'O', 'B', '_', 'T', '_', '_', '_', '\r', '_', '_', '_', '_', '_', '_', '_' // 7 }; static const unsigned char code_to_figs[128] = { //0 1 2 3 4 5 6 7 8 9 a b c d e f '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', '_', // 0 '_', '_', '_', '_', '_', '_', '_', '\'', '_', '_', '_', '!', '_', ':', '(', '_', // 1 '_', '_', '_', '_', '_', '_', '_', '2', '_', '_', '_', '6', '_', '0', '1', '_', // 2 '_', '_', '_', '_', '_', '&', '_', '_', '_', '.', '/', '_', ';', '_', '_', '_', // 3 '_', '_', '_', '_', '_', '_', '_', '-', '_', '_', '_', '\07', '_', '8', '7', '_', // 4 '_', '_', '_', '$', '_', '4', '3', '_', '_', ',', '_', '_', ' ', '_', '_', '_', // 5 '_', '_', '_', '"', '_', ')', '_', '_', '_', '#', '_', '_', '\n', '_', '_', '_', // 6 '_', '9', '?', '_', '5', '_', '_', '_', '\r', '_', '_', '_', '_', '_', '_', '_' // 7 }; static const int code_ltrs = 0x5a; static const int code_figs = 0x36; static const int code_alpha = 0x0f; static const int code_beta = 0x33; static const int code_char32 = 0x6a; static const int code_rep = 0x66; static const int char_bell = 0x07; class CCIR476 { unsigned char m_ltrs_to_code[128]; unsigned char m_figs_to_code[128]; bool m_valid_codes[128]; public: CCIR476() { memset( m_ltrs_to_code, 0, 128 ); memset( m_figs_to_code, 0, 128 ); for( size_t i = 0; i < 128; ++i ) m_valid_codes[i] = false ; for (int code = 0; code < 128; code++) { // Valid codes have four bits set only. This leaves three bits for error detection. // TODO: If a code is invalid, we could take the closest value in terms of bits. if (check_bits(code)) { m_valid_codes[code] = true; unsigned char figv = code_to_figs[code]; unsigned char ltrv = code_to_ltrs[code]; if ( figv != '_') { m_figs_to_code[figv] = code; } if ( ltrv != '_') { m_ltrs_to_code[ltrv] = code; } } } } void char_to_code(std::string & str, int ch, bool & ex_shift) const { ch = toupper(ch); // avoid unnecessary shifts if (ex_shift && m_figs_to_code[ch] != '\0') { str.push_back( m_figs_to_code[ch] ); } else if (!ex_shift && m_ltrs_to_code[ch] != '\0') { str.push_back( m_ltrs_to_code[ch] ); } else if (m_figs_to_code[ch] != '\0') { ex_shift = true; str.push_back( code_figs ); str.push_back( m_figs_to_code[ch] ); } else if (m_ltrs_to_code[ch] != '\0') { ex_shift = false; str.push_back( code_ltrs ); str.push_back( m_ltrs_to_code[ch] ); } } int code_to_char(int code, bool shift) const { const unsigned char * target = (shift) ? code_to_figs : code_to_ltrs; if (target[code] != '_') { return target[code]; } // default: return negated code return -code; } int bytes_to_code(int *pos) { int code = 0; int i; for (i = 0; i < 7; i++) code |= ((pos[i] > 0) << i); return code; } int bytes_to_char(int *pos, int shift) { int code = bytes_to_code(pos); return code_to_char(code, shift); } // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive /// Counting set bits, Brian Kernighan's way static bool check_bits(int v) { int bc = 0; while (v != 0) { bc++; v &= v - 1; } //printf("check_bits %d %d %c\n", bc, (int)code_to_ltrs[v], code_to_ltrs[v] ); return bc == 4; } // Is there a valid character in the next 7 ints? bool valid_char_at(int *pos) { int count = 0; int i; for (i = 0; i < 7; i++) if (pos[i] > 0) count++; return (count == 4); } }; /// This is temporary, to manipulate a multi-line string. static const char * new_line = "\n"; // Coordinates samples: // 52-08.5N 003-18.0E // 51-03.93N 001-09.17E // 50-40.2N 001-03.7W class ccir_message : public std::string { static const size_t header_len = 10 ; static const size_t trunc_len = 5 ; // Header structure is: // ZCZCabcd message text NNNN // a : Origin of the station. // b : Message type. // cd : Message number from this station. char m_origin ; char m_subject ; int m_number ; public: const char * msg_type(void) const { switch(m_subject) { case 'A' : return _("Navigational warning"); case 'B' : return _("Meteorological warning"); case 'C' : return _("Ice report"); case 'D' : return _("Search & rescue information, pirate warnings"); case 'E' : return _("Meteorological forecast"); case 'F' : return _("Pilot service message"); case 'G' : return _("AIS message"); case 'H' : return _("LORAN message"); case 'I' : return _("Not used"); case 'J' : return _("SATNAV messages"); case 'K' : return _("Other electronic navaid messages"); case 'L' : return _("Navigational warnings"); case 'T' : return _("Test transmissions (UK only)"); case 'V' : return _("Notice to fishermen (U.S. only)"); case 'W' : return _("Environmental (U.S. only)"); case 'X' : return _("Special services - allocation by IMO NAVTEX Panel"); case 'Y' : return _("Special services - allocation by IMO NAVTEX Panel"); case 'Z' : return _("No message on hand"); default : return _("Invalid navtex subject"); } } private: /// Remove non-Ascii chars, replace new-line by special character etc.... void cleanup() { /// It would be possible to do the change in place, because the new string /// it shorter than the current one, but at the expense of clarity. bool wasDelim = false, wasSpace = false, chrSeen = false ; std::string newStr ; for( iterator it = begin(); it != end(); ++it ) { switch( *it ) { case '\n': case '\r': wasDelim = true ; break ; case ' ' : case '\t': wasSpace = true ; break ; default : if( chrSeen ) { if( wasDelim ) { newStr.append(new_line); } else if( wasSpace ) { newStr.push_back(' '); } } wasDelim = false ; wasSpace = false ; chrSeen = true ; newStr.push_back( *it ); } } swap( newStr ); } void init_members() { m_origin = '?'; m_subject = '?'; m_number = 0 ; } public: ccir_message() { init_members(); } ccir_message( const std::string & s, char origin, char subject, int number ) : std::string(s) , m_origin(origin) , m_subject(subject) , m_number(number) { cleanup(); } void reset_msg() { clear(); init_members(); } typedef std::pair detect_result ; detect_result detect_header() { size_t qlen = size(); if (qlen >= header_len) { const char * comp = & (*this)[ qlen - header_len ]; if( (comp[0] == 'Z') && (comp[1] == 'C') && (comp[2] == 'Z') && (comp[3] == 'C') && (comp[4] == ' ') && isalnum(comp[5]) && isalnum(comp[6]) && isdigit(comp[7]) && isdigit(comp[8]) && // (comp[9] == '\r') ) (strchr( "\n\r", comp[9] ) ) ) { /// This returns the garbage before the valid header. // Garbage because the trailer could not be read, but maybe header OK. ccir_message msg_cut( substr( 0, size() - header_len ), m_origin, m_subject, m_number ); m_origin = comp[5]; m_subject = comp[6]; m_number = ( comp[7] - '0' ) * 10 + ( comp[8] - '0' ); // Remove the beginning useless chars. /// TODO: Read broken headers such as "ZCZC EA0?" clear(); return detect_result( true, msg_cut ); } } return detect_result( false, ccir_message() ); ; } bool detect_end() { // Should be "\r\nNNNN\r\n" theoretically, but tolerates shorter strings. static const size_t slen = 4 ; static const char stop_valid[slen + 1] = "NNNN"; size_t qlen = size(); if (qlen < slen) { return false; } std::string comp = substr(qlen - slen, slen); bool end_seen = comp == stop_valid; if( end_seen ) { erase( qlen - slen, slen ); LOG_INFO("\n%s", c_str()); } return end_seen ; } void display( const std::string & alt_string ) { std::string::operator=( alt_string ); cleanup(); unsigned long long currFreq = wf->rfcarrier(); if( ! progdefaults.NVTX_AdifLog && ! progdefaults.NVTX_KmlLog ) { return ; } const NavtexRecord * ptrNavRec = NavtexCatalog::InstCatalog().FindStation(currFreq, m_origin, progdefaults.myLocator, *this ); if( ptrNavRec != NULL ) { #ifdef __WIN32__ // this subterfuge is necessary due to a bug in mingw gcc macro parser char dummy[100]; snprintf(dummy, sizeof(dummy), "Locator=%s Origin=%c freq=%llu name=%s lon=%lf lat=%lf", progdefaults.myLocator.c_str(), m_origin, currFreq, ptrNavRec->name().c_str(), ptrNavRec->coordinates().longitude().angle(), ptrNavRec->coordinates().latitude().angle() ); LOG_INFO("%s", dummy); #else LOG_INFO("Locator=%s Origin=%c freq=%llu name=%s lon=%lf lat=%lf", progdefaults.myLocator.c_str(), m_origin, currFreq, ptrNavRec->name().c_str(), ptrNavRec->coordinates().longitude().angle(), ptrNavRec->coordinates().latitude().angle() ); #endif } else { LOG_INFO("Locator=%s Origin=%c freq=%d Navtex station not found", progdefaults.myLocator.c_str(), m_origin, static_cast(currFreq) ); } if( progdefaults.NVTX_AdifLog ) { /// For updating the logbook with received messages. QsoHelper qso(MODE_NAVTEX); if( ptrNavRec ) { qso.Push(QTH, ptrNavRec->country() ); qso.Push(CALL, ptrNavRec->callsign() ); qso.Push(COUNTRY, ptrNavRec->country() ); qso.Push(GRIDSQUARE, ptrNavRec->coordinates().locator() ); qso.Push(NAME, ptrNavRec->name() ); /// If the header is clean, the message type is removed from the string. // In this context, this field cannot be used. qso.Push(XCHG1, msg_type() ); qso.Push(SRX, strformat( "%d", m_number ) ); } else { qso.Push(NAME, std::string("Station_") + m_origin ); } // Sequence of Chars and line-breaks, ASCII CR (code 13) + ASCII LF (code 10) qso.Push(NOTES, strreplace( *this, new_line, ADIF_EOL ) ); } // Adds a placemark to the navtex KML file. if( progdefaults.NVTX_KmlLog ) { if( ptrNavRec ) { KmlServer::CustomDataT custData ; custData.Push( "Callsign", ptrNavRec->callsign() ); custData.Push( "Country", ptrNavRec->country() ); custData.Push( "Locator", ptrNavRec->coordinates().locator() ); custData.Push( "Message number", m_number ); custData.Push( "Frequency", currFreq ); custData.Push( "Mode", mode_info[MODE_NAVTEX].adif_name ); custData.Push( "Message", *this ); KmlServer::GetInstance()->Broadcast( "Navtex", 0, ptrNavRec->coordinates(), 0, ptrNavRec->name(), "navtex_station", substr( 0, 20 ) + "...", custData ); } // TODO: Parse the message to extract coordinates. } } // display }; // ccir_message static const int deviation_f = 85; static const double dflt_center_freq = 1000.0 ; class navtex ; /// Implements PIMPL idiom. class navtex_implementation { enum State { SYNC_SETUP, SYNC, READ_DATA }; static const char * state_to_str( State s ) { switch( s ) { case SYNC_SETUP: return "SYNC_SETUP"; case SYNC : return "SYNC"; case READ_DATA : return "READ_DATA"; default : return "Unknown" ; } } bool m_only_sitor_b ; int m_message_counter ; static const size_t m_tx_block_len = 1024 ; /// Between -1 and 1. double m_tx_buf[m_tx_block_len]; size_t m_tx_counter ; navtex * m_ptr_navtex ; pthread_mutex_t m_mutex_tx ; typedef std::list TxMsgQueueT ; TxMsgQueueT m_tx_msg_queue ; double m_metric ; CCIR476 m_ccir476; typedef std::list sync_chrs_type ; ccir_message m_curr_msg ; double m_message_time ; double m_mark_f, m_space_f; double m_time_sec; double m_baud_rate ; int m_sample_rate ; int m_averaged_mark_state; int m_bit_duration ; fftfilt *m_mark_lowpass; fftfilt *m_space_lowpass; double m_mark_phase; double m_space_phase; double m_bit_sample_count; State m_state; int m_sample_count; double m_next_early_event; double m_next_prompt_event; double m_next_late_event; double m_average_early_signal; double m_average_prompt_signal; double m_average_late_signal; std::vector m_bit_values; int m_bit_cursor; bool m_shift ; bool m_pulse_edge_event; int m_error_count; bool m_alpha_phase ; bool m_header_found ; char snrmsg[80]; // filter method related double m_center_frequency_f ; navtex_implementation( const navtex_implementation & ); navtex_implementation(); navtex_implementation & operator=( const navtex_implementation & ); public: navtex_implementation(int the_sample_rate, bool only_sitor_b, navtex * ptr_navtex ) { pthread_mutex_init( &m_mutex_tx, NULL ); m_ptr_navtex = ptr_navtex ; m_only_sitor_b = only_sitor_b ; m_message_counter = 1 ; m_metric = 0.0 ; m_time_sec = 0.0 ; m_state = SYNC_SETUP; m_message_time = 0.0 ; m_sample_rate = the_sample_rate; m_bit_duration = 0; m_shift = false; m_alpha_phase = false; m_header_found = false; m_center_frequency_f = dflt_center_freq; // this value must never be zero and bigger than 10. m_baud_rate = 100; double m_bit_duration_seconds = 1.0 / m_baud_rate; m_bit_sample_count = m_sample_rate * m_bit_duration_seconds; // A narrower spread between signals allows the modem to // center on the pulses better, but a wider spread makes // more robust under noisy conditions. 1/5 seems to work. m_next_early_event = 0; m_next_prompt_event = m_bit_sample_count / 5; m_next_late_event = m_bit_sample_count * 2 / 5; m_average_early_signal = 0; m_average_prompt_signal = 0; m_average_late_signal = 0; m_error_count = 0; m_sample_count = 0; // keep 1 second worth of bit values for decoding m_bit_values.resize(m_baud_rate); m_bit_cursor = 0; m_mark_lowpass = 0; m_space_lowpass = 0; set_filter_values(); configure_filters(); } ~navtex_implementation() { pthread_mutex_destroy( &m_mutex_tx ); } private: void set_filter_values() { m_mark_f = m_center_frequency_f + deviation_f; m_space_f = m_center_frequency_f - deviation_f; m_mark_phase = 0; m_space_phase = 0; } void configure_filters() { // do not allow filters to be changed during signal processing! guard_lock filter_guard(&navtex_filter_mutex); const int filtlen = 512; if (m_mark_lowpass) delete m_mark_lowpass; m_mark_lowpass = new fftfilt(m_baud_rate/m_sample_rate, filtlen); m_mark_lowpass->rtty_filter(m_baud_rate/m_sample_rate); if (m_space_lowpass) delete m_space_lowpass; m_space_lowpass = new fftfilt(m_baud_rate/m_sample_rate, filtlen); m_space_lowpass->rtty_filter(m_baud_rate/m_sample_rate); } void set_state(State s) { if (s != m_state) { m_state = s; set_label_from_state(); } } /// The parameter is appended at the message end. void flush_message(const std::string & extra_info) { if( m_header_found ) { m_header_found = false; display_message( m_curr_msg, m_curr_msg + extra_info ); } else { display_message( m_curr_msg, "[Lost header]:" + m_curr_msg + extra_info ); } m_curr_msg.reset_msg(); m_message_time = m_time_sec; } /// Checks that we have no waited too long, and if so, flushes the message with a specific terminator. void process_timeout() { /// No messaging in SitorB if ( m_only_sitor_b ) { return ; } bool timeOut = m_time_sec - m_message_time > 600 ; if ( ! timeOut ) return ; LOG_INFO("Timeout: time_sec=%lf, message_time=%lf", m_time_sec, m_message_time ); // TODO: Headerless messages could be dropped if shorter than X chars. flush_message(":"); } void process_messages(int c) { m_curr_msg.push_back((char) c); /// No header nor trailer for plain SitorB. if ( m_only_sitor_b ) { m_header_found = true; m_message_time = m_time_sec; return; } ccir_message::detect_result msg_cut = m_curr_msg.detect_header(); if ( msg_cut.first ) { /// Maybe the message was already valid. if( m_header_found ) { display_message( msg_cut.second, msg_cut.second + ":[Lost trailer]" ); } else { /// Maybe only non-significant chars. if( ! msg_cut.second.empty() ) { display_message( msg_cut.second, "[Lost header]:" + msg_cut.second + ":[Lost trailer]" ); } } m_header_found = true; m_message_time = m_time_sec; } else { // valid message state if ( m_curr_msg.detect_end() ) { flush_message(""); } } } // The rep character is transmitted 5 characters (35 bits) ahead of // the alpha character. int fec_offset(int offset) { return offset - 35; } // Flip the sign of the smallest (least certain) bit in a character; // hopefully this will result in the right valid character. void flip_smallest_bit(int *pos) { int min_zero = INT_MIN, min_one = INT_MAX; int min_zero_pos = -1, min_one_pos = -1; int count_zero = 0, count_one = 1; int val, i; for (i = 0; i < 7; i++) { val = pos[i]; if (val < 0) { count_zero++; if (val > min_zero) { min_zero = val; min_zero_pos = i; } } else { count_one++; if (val < min_one) { min_one = val; min_one_pos = i; } } } // A valid character has 3 zeroes and 4 ones, if we have // 5 ones or 4 zeroes, flipping the smallest one would make // this character valid. if (count_zero == 4) pos[min_zero_pos] = -pos[min_zero_pos]; else if (count_one == 5) pos[min_one_pos] = -pos[min_one_pos]; } // Try to find a position in the bit stream with: // - the largest number of valid characters, and // - with rep (duplicate) characters in the right locations // This way the code can sync up with an incoming signal after // the initial alpha/rep synchronisation // // http://www.arachnoid.com/JNX/index.html // "NAUTICAL" becomes: // rep alpha rep alpha N alpha A alpha U N T A I U C T A I L C blank A blank L int find_alpha_characters(void) { int best_offset = 0; int best_score = 0; int offset, i; // With 7 bits per character, and interleaved rep & alpha // characters, the first alpha character with a corresponding // rep in the stream can be in any of 14 locations for (offset = 35; offset < (35 + 14); offset++) { int score = 0; int reps = 0; int limit = m_bit_values.size() - 7; // Search for the largest sequence of valid characters for (i = offset; i < limit; i += 7) { if (m_ccir476.valid_char_at(&m_bit_values[i])) { int ri = fec_offset(i); int code = m_ccir476.bytes_to_code(&m_bit_values[i]); int rep = m_ccir476.bytes_to_code(&m_bit_values[ri]); // This character is valid score++; // Does it match its rep? if (code == rep) { // This offset is wrong, rep // and alpha are spaced odd if (code == code_alpha || code == code_rep) { score = 0; continue; } reps++; } else if (code == code_alpha) { // Is there a matching rep to // this alpha? int ri = i - 7; int rep = m_ccir476.bytes_to_code(&m_bit_values[ri]); if (rep == code_rep) { reps++; } } } } // the most valid characters, with at least 3 FEC reps if (reps >= 3 && score + reps > best_score) { best_score = score + reps; best_offset = offset; } } // m_bit_values fits 14 characters; if there are at least // 9 good ones, tell the caller where they start if (best_score > 8) return best_offset; else return -1; } // Turns accumulator values (estimates of whether a bit is 1 or 0) // into navtex messages void handle_bit_value(int logic_level) { int buffersize = m_bit_values.size(); int i, offset = 0; // Store the received value in the bit stream for (i = 0; i < buffersize - 1; i++) { m_bit_values[i] = m_bit_values[i+1]; } m_bit_values[buffersize - 1] = logic_level; if (m_bit_cursor > 0) m_bit_cursor--; // Find the most likely location where the message starts if (m_state == SYNC) { offset = find_alpha_characters(); if (offset >= 0) { set_state(READ_DATA); m_bit_cursor = offset; m_alpha_phase = true; } else set_state(SYNC_SETUP); } // Process 7-bit characters as they come in, // skipping rep (duplicate) characters if (m_state == READ_DATA) { if (m_bit_cursor < buffersize - 7) { if (m_alpha_phase) { int ret = process_bytes(m_bit_cursor); m_error_count -= ret; if (m_error_count > 5) set_state(SYNC_SETUP); if (m_error_count < 0) m_error_count = 0; } m_alpha_phase = !m_alpha_phase; m_bit_cursor += 7; } } } // Turn a series of 7 bit confidence values into a character // // 1 on successful decode of the alpha character // 0 on unmodified FEC replacement // -1 on soft failure (FEC calculation) // -2 on hard failure int process_bytes(int m_bit_cursor) { int code = m_ccir476.bytes_to_code(&m_bit_values[m_bit_cursor]); int success = 0; if (m_ccir476.check_bits(code)) { LOG_DEBUG("valid code : %x (%c)", code, m_ccir476.code_to_char(code, m_shift)); success = 1; goto decode; } if (fec_offset(m_bit_cursor) < 0) return -1; // The alpha (primary) character received was not correct. // Try the rep (duplicate) copy of the character, and some // permutations to see if the correct character can be found. { int i, calc, avg[7]; // Rep is 5 characters before alpha. int reppos = fec_offset(m_bit_cursor); int rep = m_ccir476.bytes_to_code(&m_bit_values[reppos]); if (CCIR476::check_bits(rep)) { // Current code is probably code_alpha. // Skip decoding to avoid switching phase. if (rep == code_rep) return 0; LOG_DEBUG("FEC replacement: %x -> %x (%c)", code, rep, m_ccir476.code_to_char(rep, m_shift)); code = rep; goto decode; } // Neither alpha or rep are valid. Check whether // the average of the two is a valid character. for (i = 0; i < 7; i++) { int a = m_bit_values[m_bit_cursor + i]; int r = m_bit_values[reppos + i]; avg[i] = a + r; } calc = m_ccir476.bytes_to_code(avg); if (CCIR476::check_bits(calc)) { LOG_DEBUG("FEC calculation: %x & %x -> %x (%c)", code, rep, calc, m_ccir476.code_to_char(calc, m_shift)); code = calc; success = -1; goto decode; } // Flip the lowest confidence bit in alpha. flip_smallest_bit(&m_bit_values[m_bit_cursor]); calc = m_ccir476.bytes_to_code(&m_bit_values[m_bit_cursor]); if (CCIR476::check_bits(calc)) { LOG_DEBUG("FEC calculation: %x & %x -> %x (%c)", code, rep, calc, m_ccir476.code_to_char(calc, m_shift)); code = calc; success = -1; goto decode; } // Flip the lowest confidence bit in rep. flip_smallest_bit(&m_bit_values[reppos]); calc = m_ccir476.bytes_to_code(&m_bit_values[reppos]); if (CCIR476::check_bits(calc)) { LOG_DEBUG("FEC calculation: %x & %x -> %x (%c)", code, rep, calc, m_ccir476.code_to_char(calc, m_shift)); code = calc; success = -1; goto decode; } // Try flipping the bit with the lowest confidence // in the average of alpha & rep. flip_smallest_bit(avg); calc = m_ccir476.bytes_to_code(avg); if (CCIR476::check_bits(calc)) { LOG_DEBUG("FEC calculation: %x & %x -> %x (%c)", code, rep, calc, m_ccir476.code_to_char(calc, m_shift)); code = calc; success = -1; goto decode; } LOG_DEBUG("decode fail %x, %x", code, rep); return -2; } decode: process_char(code); return success; } bool process_char(int chr) { static int last_char = 0; switch (chr) { case code_rep: // This code should run in alpha phase, but // it just received two rep characters. Fix // the rep/alpha phase, so FEC works again. if (last_char == code_rep) { LOG_DEBUG("fixing rep/alpha sync"); m_alpha_phase = false; } break; case code_alpha: break; case code_beta: break; case code_char32: break; case code_ltrs: m_shift = false; break; case code_figs: m_shift = true; break; default: chr = m_ccir476.code_to_char(chr, m_shift); if (chr < 0) { LOG_INFO(_("Missed this code: %x"), abs(chr)); } else { filter_print(chr); process_messages(chr); } break; } // switch last_char = chr; return true; } void filter_print(int c) { if (c == char_bell) { /// TODO: It should be a beep, but French navtex displays a quote. put_rx_char('\''); } else if (c != -1 && c != '\r' && c != code_alpha && c != code_rep) { put_rx_char(c); } } void compute_metric(void) { static double sigpwr = 0.0 ; static double noisepwr = 0.0; double delta = m_baud_rate/8.0; double np = wf->powerDensity(m_center_frequency_f, delta) * 3000 / delta; double sp = wf->powerDensity(m_mark_f, delta) + wf->powerDensity(m_space_f, delta) + 1e-10; double snr; sigpwr = decayavg ( sigpwr, sp, sp > sigpwr ? 2 : 8); noisepwr = decayavg ( noisepwr, np, 16 ); snr = 10*log10(sigpwr / noisepwr); snprintf(snrmsg, sizeof(snrmsg), "s/n %3.0f dB", snr); put_Status2(snrmsg); m_metric = CLAMP((3000 / delta) * (sigpwr/noisepwr), 0.0, 100.0); m_ptr_navtex->display_metric(m_metric); } void process_afc() { if( progStatus.afconoff == false ) return ; static size_t cnt_upd = 0 ; static const size_t delay_upd = 50 ; ++cnt_upd ; /// AFC from time to time. if( ( cnt_upd % delay_upd ) != 0 ) { return ; } static int cnt_read_data = 0 ; /// This centers the carrier where the activity is the strongest. static const int bw[][2] = { { -deviation_f - 10, -deviation_f + 5 }, { deviation_f - 5, deviation_f + 10 } }; // find mid frequency of power spectra in mark/space frequency interval double max_carrier = wf->powerDensityMaximum( 2, bw ); /// Do not change the frequency too quickly if an image is received. double next_carr = 0.0 ; State lingering_state ; if( m_state == READ_DATA ) { /// Proportional to the number of lines between each AFC update. cnt_read_data = delay_upd / 20 ; lingering_state = READ_DATA ; } else { if( cnt_read_data ) { --cnt_read_data ; lingering_state = READ_DATA ; } else { lingering_state = m_state ; /// Maybe this is the phasing signal, so we recenter. double pwr_left = wf->powerDensity ( max_carrier - deviation_f, 30 ); double pwr_right = wf->powerDensity( max_carrier + deviation_f, 30 ); static const double ratio_left_right = 5.0 ; if( pwr_left > ratio_left_right * pwr_right ) { max_carrier -= deviation_f ; } else if ( ratio_left_right * pwr_left < pwr_right ) { max_carrier += deviation_f ; } } } switch( lingering_state ) { case SYNC_SETUP: next_carr = max_carrier ; break; case SYNC: next_carr = decayavg( m_center_frequency_f, max_carrier, 1 ); break; case READ_DATA: // It will stay stable for a couple of calls. if( max_carrier < m_center_frequency_f ) next_carr = std::max( max_carrier, m_center_frequency_f - 3.0 ); else if( max_carrier > m_center_frequency_f ) next_carr = std::min( max_carrier, m_center_frequency_f + 3.0 ); else next_carr = max_carrier ; break; default: LOG_ERROR("Should not happen: lingering_state=%d", (int)lingering_state ); break ; } LOG_DEBUG("m_center_frequency_f=%f max_carrier=%f next_carr=%f cnt_read_data=%d", (double)m_center_frequency_f, max_carrier, next_carr, cnt_read_data ); double delta = fabs( m_center_frequency_f - next_carr ); if( delta > 1.0 ) { // Hertz. m_ptr_navtex->set_freq(next_carr); } } // The signal is sampled at three points: early, prompt, and late. // The prompt event is where the signal is decoded, while early and // late are only used to adjust the time of the sampling to match // the incoming signal. // // The early event happens 1/5 bit period before the prompt event, // and the late event 1/5 bit period later. If the incoming signal // peaks early, it means the decoder is late. That is, if the early // signal is "too large", decoding should to happen earlier. // // Attempt to center the signal so the accumulator is at its // maximum deviation at the prompt event. If the bit is decoded // too early or too late, the code is more sensitive to noise, // and less likely to decode the signal correctly. void process_multicorrelator() { // Adjust the sampling period once every 8 bit periods. if (m_sample_count % (int)(m_bit_sample_count * 8)) return; // Calculate the slope between early and late signals // to align the logic sampling with the received signal // This usually returns a value between -1..1, closer to 0. double slope = m_average_late_signal - m_average_early_signal; slope /= (m_average_prompt_signal + 0.1); // Scale by the distance between the sample points slope *= 22; // Slow down the adjustment at the peak if (m_average_prompt_signal > m_average_early_signal && m_average_prompt_signal > m_average_late_signal) slope /= 2; if (slope) { m_next_early_event += slope; m_next_prompt_event += slope; m_next_late_event += slope; LOG_DEBUG("adjusting by %1.2f, early %1.1f, prompt %1.1f, late %1.1f", slope, m_average_early_signal, m_average_prompt_signal, m_average_late_signal); } } /* A NAVTEX message is built on SITOR collective B-mode and consists of: * a phasing signal of at least ten seconds * the four characters "ZCZC" that identify the end of phasing * a single space * four characters B1, B2, B3 and B4: * B1 is an alpha character identifying the station, * B2 is an alpha character used to identify the subject of the message. * B3 and B4 are two-digit numerics identifying individual messages * a carriage return and a line feed * the information * the four characters "NNNN" to identify the end of information * a carriage return and two line feeds * either * 5 or more seconds of phasing signal and another message starting with "ZCZC" or * an end of emission idle signal alpha for at least 2 seconds. */ public: void process_data(const double * data, int nb_samples) { cmplx z, zmark, zspace, *zp_mark, *zp_space; process_afc(); process_timeout(); // prevent user waterfall interaction from changing filters! guard_lock g( &navtex_filter_mutex ); for( int i =0; i < nb_samples; ++i ) { int n_out; m_time_sec = m_sample_count / m_sample_rate ; double dv = 32767 * data[i]; z = cmplx(dv, dv); zmark = mixer(m_mark_phase, m_mark_f, z); m_mark_lowpass->run(zmark, &zp_mark); zspace = mixer(m_space_phase, m_space_f, z); n_out = m_space_lowpass->run(zspace, &zp_space); if (n_out) process_fft_output(zp_mark, zp_space, n_out); } } private: cmplx mixer(double &phase, double f, cmplx in) { cmplx z = cmplx( cos(phase), sin(phase)) * in; phase -= TWOPI * f / m_sample_rate; if (phase < -TWOPI) phase += TWOPI; return z; } // noise average decays fast down, slow up double noise_decay(double avg, double value) { int divisor; if (value < avg) divisor = m_bit_sample_count / 4; else divisor = m_bit_sample_count * 48; return decayavg(avg, value, divisor); } // envelope average decays fast up, slow down double envelope_decay(double avg, double value) { int divisor; if (value > avg) divisor = m_bit_sample_count / 4; else divisor = m_bit_sample_count * 16; return decayavg(avg, value, divisor); } void process_fft_output(cmplx *zp_mark, cmplx *zp_space, int samples) { // envelope & noise levels for mark & space, respectively static double mark_env = 0, space_env = 0; static double mark_noise = 0, space_noise = 0; for (int i = 0; i < samples; i++) { double mark_abs = abs(zp_mark[i]); double space_abs = abs(zp_space[i]); process_multicorrelator(); // determine noise floor & envelope for mark & space mark_env = envelope_decay(mark_env, mark_abs); mark_noise = noise_decay(mark_noise, mark_abs); space_env = envelope_decay(space_env, space_abs); space_noise = noise_decay(space_noise, space_abs); double noise_floor = (space_noise + mark_noise) / 2; // clip mark & space to envelope & floor mark_abs = std::min(mark_abs, mark_env); mark_abs = std::max(mark_abs, noise_floor); space_abs = std::min(space_abs, space_env); space_abs = std::max(space_abs, noise_floor); // mark-space discriminator with automatic threshold // correction, see: // http://www.w7ay.net/site/Technical/ATC/ double logic_level = (mark_abs - noise_floor) * (mark_env - noise_floor) - (space_abs - noise_floor) * (space_env - noise_floor) - 0.5 * ( (mark_env - noise_floor) * (mark_env - noise_floor) - (space_env - noise_floor) * (space_env - noise_floor)); // An average of the magnitude of the logic_level // is taken at the sample point, as well as a quarter // bit before and after. This allows the code to see // the best time to sample the signal without relying // on (noisy) null crossings. if (m_sample_count >= m_next_early_event) { m_average_early_signal = decayavg( m_average_early_signal, fabs(logic_level), 64); m_next_early_event += m_bit_sample_count; } if (m_sample_count >= m_next_late_event) { m_average_late_signal = decayavg( m_average_late_signal, fabs(logic_level), 64); m_next_late_event += m_bit_sample_count; } // the peak of a signal pulse m_pulse_edge_event = m_sample_count >= m_next_prompt_event; if (m_pulse_edge_event) { m_average_prompt_signal = decayavg( m_average_prompt_signal, fabs(logic_level), 64); m_next_prompt_event += m_bit_sample_count; if (m_ptr_navtex->get_reverse()) m_averaged_mark_state = -m_averaged_mark_state; } switch (m_state) { case SYNC_SETUP: m_error_count = 0; m_shift = false; set_state(SYNC); break; case SYNC: case READ_DATA: if (m_pulse_edge_event) handle_bit_value(logic_level); } m_sample_count++; } compute_metric(); } /// This updates the window label according to the state. void set_label_from_state(void) const { put_status( state_to_str(m_state) ); } private: /// Each received message is pushed in this queue, so it can be read by XML/RPC. syncobj m_sync_rx ; std::queue< std::string > m_received_messages ; void display_message( ccir_message & ccir_msg, const std::string & alt_string ) { if( ccir_msg.size() >= (size_t)progdefaults.NVTX_MinSizLoggedMsg ) { try { ccir_msg.display(alt_string); put_received_message( alt_string ); } catch( const std::exception & exc ) { LOG_WARN("Caught %s", exc.what() ); } } else { LOG_INFO("Do not log short message:%s", ccir_msg.c_str() ); } } /// Called by the engine each time a message is saved. void put_received_message( const std::string &message ) { guard_lock g( m_sync_rx.mtxp() ); LOG_INFO("%s", message.c_str() ); m_received_messages.push( message ); m_sync_rx.signal(); } public: /// Returns a received message, by chronological order. std::string get_received_message( double max_seconds ) { guard_lock g( m_sync_rx.mtxp() ); LOG_DEBUG("Delay=%f", max_seconds ); if( m_received_messages.empty() ) { if( ! m_sync_rx.wait(max_seconds) ) return "Timeout"; } std::string message = m_received_messages.front(); m_received_messages.pop(); return message ; } // http://www.arachnoid.com/JNX/index.html // "NAUTICAL" becomes: // rep alpha rep alpha N alpha A alpha U N T A I U C T A I L C blank A blank L std::string create_fec( const std::string & str ) const { std::string res ; const size_t sz = str.size(); static const size_t offset = 2 ; for( size_t i = 0 ; i < offset ; ++i ) { res.push_back( code_rep ); res.push_back( code_alpha ); } for ( size_t i = 0; i < sz; ++i ) { res.push_back( str[i] ); res.push_back( i >= offset ? str[ i - offset ] : code_alpha ); } for( size_t i = 0 ; i < offset ; ++i ) { res.push_back( code_char32 ); res.push_back( str[ sz - offset + i ] ); } return res; } /// Note path std::string can contain null characters. TODO: Beware of the extra copy constructor. std::string encode( const std::string & str ) const { std::string res ; bool shift = false ; for ( size_t i = 0, sz = str.size(); i < sz; ++ i ) { m_ccir476.char_to_code(res, str[i], shift ); } return res; } void tx_flush() { if( m_tx_counter != 0 ) { m_ptr_navtex->ModulateXmtr( m_tx_buf, m_tx_counter ); m_tx_counter = 0 ; } } /// Input value must be between -1 and 1 void add_sample( double sam ) { m_tx_buf[ m_tx_counter++ ] = sam ; if( m_tx_counter == m_tx_block_len ) { tx_flush(); } } // REMI : Note change to send_sine void send_sine( double seconds, double freq ) { static double phase = 0; int nb_samples = seconds * m_ptr_navtex->get_samplerate(); double max_level = 0.9;//0.99 ; // Between -1.0 and 1.0 double ratio = 2.0 * M_PI * (double)freq / (double)m_ptr_navtex->get_samplerate() ; for (int i = 0; i < nb_samples ; ++i ) { add_sample( max_level * sin( phase += ratio));//i * ratio ) ); if (phase > 2.0 * M_PI) phase -= 2.0*M_PI; } } void send_phasing( int seconds ) { send_sine( seconds, m_center_frequency_f ); } void send_bit( bool bit ) { send_sine( 1.0 / (double)m_baud_rate, bit ? m_mark_f : m_space_f ); } void send_string( const std::string & msg ) { std::string encod = encode( msg ); std::string sevenbits = create_fec( encod ); for( size_t i = 0, sz = sevenbits.size(); i < sz; i++ ) { char tmp_stat[64]; snprintf( tmp_stat, sizeof(tmp_stat), "Transmission %d%%", (int)( 100.0 * ( i + 1.0 ) / sz ) ); put_status( tmp_stat ); char c = sevenbits[i]; for( size_t j = 0; j < 7 ; ++j, c >>= 1 ) { send_bit( c & 1 ); } } } void send_message( const std::string & msg, bool is_first, bool is_last ) { put_status( "Transmission" ); m_tx_counter = 0 ; if( m_only_sitor_b ) { send_string( msg ); } else { put_status( "Phasing" ); send_phasing( is_first ? 10.0 : 5.0 ); char preamble[64]; const char origin = 'Z' ; // Never seen this value. const char subject = 'I' ; // This code is not used. snprintf( preamble, sizeof(preamble), "ZCZC %c%c%02d\r\n", origin, subject, m_message_counter ); m_message_counter = ( m_message_counter + 1 ) % 100 ; /// The extra cr-nl before NNNN is not in the specification but clarify things. std::string full_msg = preamble + msg + "\r\nNNNN\r\n\n"; send_string( full_msg ); // 5 or more seconds of phasing signal and another message starting with "ZCZC" or // an end of emission idle signal alpha for at least 2 seconds. */ if( is_last ) { put_status( "Trailer" ); send_phasing(2.0); } } tx_flush(); put_status( "" ); } void append_message_to_send( const std::string & msg ) { guard_lock g( &m_mutex_tx ); m_tx_msg_queue.push_back( msg ); } void transmit_message_async( const std::string & msg ) { LOG_INFO("%s", msg.c_str() ); append_message_to_send( msg ); bool is_first = true ; for(;;) { guard_lock g( &m_mutex_tx ); TxMsgQueueT::iterator it = m_tx_msg_queue.begin(), en = m_tx_msg_queue.end(); if( it == en ) break ; TxMsgQueueT::iterator it_next = it ; ++it_next ; bool is_last = it_next == en ; send_message( *it, is_first, is_last ); is_first = false ; m_tx_msg_queue.erase(it); } } void process_tx() { std::string msg ; for(;;) { int c = get_tx_char(); if( c == GET_TX_CHAR_NODATA ) { break ; } msg.push_back( c ); } for( size_t i = 0 ; i < msg.size(); ++ i) { put_echo_char( msg[i] ); } transmit_message_async(msg); } void set_carrier( double freq ) { m_center_frequency_f = freq; set_filter_values(); } }; // navtex_implementation #ifdef NAVTEX_COMMAND_LINE /// For testing purpose, this file can be compiled and run separately as a command-line program. int main(int n, const char ** v ) { printf("%s\n", v[1] ); FILE * f = fl_fopen( v[1], "r" ); fseek( f, 0, SEEK_END ); long l = ftell( f ); printf("l=%ld\n", l); char * buf = new char[l]; fseek( f, 0, SEEK_SET ); size_t lr = fread( buf, 1, l, f ); if( lr - l ) { printf("Err reading\n"); exit(EXIT_FAILURE); }; navtex_implementation nv(11025) ; double * tmp = new double[l/2]; const short * shrt = (const short *)buf; for( int i = 0; i < l/2; i++ ) tmp[i] = ( (double)shrt[i] ) / 32767.0; nv.process_data( tmp, l / 2 ); return 0 ; } #endif // NAVTEX_COMMAND_LINE navtex::navtex (trx_mode md) { modem::cap |= CAP_AFC | CAP_REV; navtex::mode = md; modem::samplerate = 11025; modem::bandwidth = 2 * deviation_f ; modem::reverse = false ; bool only_sitor_b = false ; switch( md ) { case MODE_NAVTEX : only_sitor_b = false ; break; case MODE_SITORB : only_sitor_b = true ; break; default : LOG_ERROR("Unknown mode"); } m_impl = new navtex_implementation( modem::samplerate, only_sitor_b, this ); } navtex::~navtex() { if( m_impl ) { delete m_impl ; } } void navtex::rx_init() { put_MODEstatus(modem::mode); } void navtex::restart() { } int navtex::rx_process(const double *buf, int len) { m_impl->process_data( buf, len ); return 0; } void navtex::tx_init() { videoText(); // In trx/modem.cxx } int navtex::tx_process() { modem::tx_process(); m_impl->process_tx(); return -1; } void navtex::set_freq( double freq ) { modem::set_freq( freq ); m_impl->set_carrier( freq ); } /// This returns the next received message. std::string navtex::get_message(int max_seconds) { return m_impl->get_received_message(max_seconds); } std::string navtex::send_message(const std::string &msg) { m_impl->append_message_to_send(msg); start_tx(); // If this is not done. return ""; } fldigi-4.2.05/src/fft-monitor/0000775000175000017500000000000014611714005013075 500000000000000fldigi-4.2.05/src/fft-monitor/fft-monitor.cxx0000664000175000017500000002056214611711171016013 00000000000000// ---------------------------------------------------------------------------- // fftmon.cxx -- fftmon modem // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "fl_digi.h" #include "modem.h" #include "misc.h" #include "filters.h" #include "fftfilt.h" #include "waterfall.h" #include "main.h" #include "fft-monitor.h" #include "timeops.h" #include "debug.h" #include "digiscope.h" #include "trx.h" #include "spectrum_viewer.h" #include "threads.h" #include "configuration.h" //extern Digiscope *fftscope; //extern spectrum *fftscope; #include "confdialog.h" extern Fl_Counter *fftviewer_scans; extern Fl_Counter *fftviewer_fcenter; extern Fl_Counter *fftviewer_frng; extern Fl_Button *pause_button; extern Fl_Box *annunciator; pthread_mutex_t fftmon_mutex = PTHREAD_MUTEX_INITIALIZER; bool b_write_fftfile = false; static std::string fftmonFilename; void toggle_scans(void *me) { fftmon *mon = (fftmon *)(me); if (mon->scans_stable) fftviewer_scans->color(FL_GREEN); else fftviewer_scans->color(FL_BACKGROUND_COLOR); fftviewer_scans->redraw(); } void fftmon::init() { } fftmon::~fftmon() { delete [] fftbuff; delete [] dftbuff; delete [] buffer; delete [] cmplxbuf; delete scanfft; } void fftmon::restart() { fftmon_sr = active_modem->get_samplerate(); for (int i = 0; i < fftmonFFT_LEN; i++) { bshape[i] = blackman(1.0 * i / fftmonFFT_LEN); fftbuff[i] = dftbuff[i] = 0; cmplxbuf[i] = std::complex(0, 0); } for (int i = 0; i < fftmonFFT_LEN / 2; i++) buffer[i] = 0; for (int i = 0; i < LENdiv2; i++) fftfilt[i]->setLength(progdefaults.fftviewer_scans); scans_stable = false; numscans = 0; Fl::awake(toggle_scans, this); } fftmon::fftmon() { fftbuff = new double[fftmonFFT_LEN]; dftbuff = new double[fftmonFFT_LEN]; cmplxbuf = new cmplx[fftmonFFT_LEN]; buffer = new double[fftmonFFT_LEN / 2]; for (int i = 0; i < LENdiv2; i++) { fftfilt[i] = new Cmovavg(1000); fftfilt[i]->setLength(progdefaults.fftviewer_scans); } for (int i = 0; i < fftmonFFT_LEN; i++) { bshape[i] = blackman(1.0 * i / fftmonFFT_LEN); fftbuff[i] = dftbuff[i] = 0; cmplxbuf[i] = std::complex(0, 0); } for (int i = 0; i < fftmonFFT_LEN / 2; i++) buffer[i] = 0; scanfft = new g_fft(fftmonFFT_LEN); fftmonFilename = TempDir; fftmonFilename.append("rx_spectrum.csv"); cap &= ~CAP_TX; // rx only modem restart(); } //======================================================================= // //======================================================================= // static double scopebuff[LENdiv2]; static double filebuff[LENdiv2]; double goto_freq() { int fc = fftscope->gofreq(); int fr = progdefaults.fftviewer_frng; int rem = 0; if (fc < 100) fc = 100; if (fr < 200) fr = 200; if (fc + fr/2 > 4000) fr = (4000 - fc)/2; if (fc < fr/2) fr = fc * 2; rem = fr % 20; fr /= 20; if (rem >= 10) fr = fr + 1; fr *= 20; if (fr > 4000) fr = 4000; progdefaults.fftviewer_frng = fr; progdefaults.fftviewer_fcenter = fc; fftviewer_fcenter->value(fc); fftviewer_fcenter->redraw(); fftviewer_frng->value(fr); fftviewer_frng->redraw(); fftscope->gofreq(0); return fc; } void write_to_fftscope(void *) { // clear scope views fftscope->clear_axis(); double f0 = progdefaults.fftviewer_fcenter - progdefaults.fftviewer_frng / 2; double f1 = progdefaults.fftviewer_fcenter + progdefaults.fftviewer_frng / 2; double sr = active_modem->get_samplerate(); if (fftscope->gofreq()) f0 = goto_freq(); int n0 = LENdiv2 * (8000.0 / sr) * (f0 / 4000.0); int n1 = LENdiv2 * (8000.0 / sr) * (f1 / 4000.0); // vertical graticule, every 10 dB int N = progdefaults.fftviewer_range / 10; for (int i = 1; i < N; i++) fftscope->xaxis(i, 1.0 * i / N); // horizontal graticule int incr = 500; if (progdefaults.fftviewer_frng <= 2000) incr = 200; if (progdefaults.fftviewer_frng <= 1000) incr = 100; if (progdefaults.fftviewer_frng <= 500 ) incr = 50; if (progdefaults.fftviewer_frng <= 250) incr = 25; annunciator->label( (incr == 500) ? "10 db/div, 500 Hz/div" : (incr == 200) ? "10 db/div, 200 Hz/div" : (incr == 100) ? "10 db/div, 100 Hz/div" : (incr == 50) ? "10 db/div, 50 Hz/div" : "10 db/div, 25 Hz/div"); annunciator->redraw_label(); int xp = f0; int xpd = xp % incr; double xpos = 1.0 * (incr - xpd) / progdefaults.fftviewer_frng; double fincr = 1.0 * incr / progdefaults.fftviewer_frng; int n = 1; while (xpos < 1.0) { fftscope->yaxis(n, xpos); xpos += fincr; n++; } if (fftscope->paused()) pause_button->label("Paused"); else pause_button->label("Running"); pause_button->redraw_label(); static char msg[100]; snprintf(msg, sizeof(msg), " %.0f Hz, %.1f dB", fftscope->freq(), fftscope->db()); values->value(msg); if (fftscope->db_diff()) { snprintf(msg, sizeof(msg), "%.0f dB", fftscope->db_diff()); db_diffs->value(msg); snprintf(msg, sizeof(msg), "%.0f Hz", fabs(fftscope->f_diff())); f_diffs->value(msg); } else { db_diffs->value(""); f_diffs->value(""); } fftscope->data(&scopebuff[n0], n1 - n0, false); fftscope->redraw(); } // add mutex lock void write_to_fftfile(void *) { guard_lock gl_filebuff(&fftmon_mutex); b_write_fftfile = false; double sr = active_modem->get_samplerate(); FILE *out = fl_fopen(fftmonFilename.c_str(), "w"); if (unlikely(!out)) { LOG_PERROR("fl_fopen"); return; } fprintf(out, "Frequency,Magnitude\n"); for (int i = 0; i < LENdiv2; i++) fprintf(out, "%0.1f, %f\n", i * sr / fftmonFFT_LEN, filebuff[i]); fclose(out); } void fftmon::update_fftscope() { if (!fftscope) return; if (b_write_fftfile) Fl::awake(write_to_fftfile); if ( !fftscope->paused() ) { guard_lock gl_filebuff(&fftmon_mutex); double val = 0; for (int i = 0; i < LENdiv2; i++) { val = fftbuff[i] / LENdiv2; if (val < 1e-6) val = 1e-6; if (val > 1) val = 1.0; filebuff[i] = val; buffer[i] = 20 * log10f(val); } } for (int i = 0; i < LENdiv2; i++) scopebuff[i] = 1.0 + (buffer[i] - progdefaults.fftviewer_maxdb)/progdefaults.fftviewer_range; Fl::awake(write_to_fftscope); } static std::complex fftmon_temp[fftmonFFT_LEN]; int fftmon::rx_process(const double *buf, int len) { if (len > fftmonFFT_LEN) return 0; // if audio playback if (fftmon_sr != active_modem->get_samplerate()) restart(); for (int i = 0; i < fftmonFFT_LEN - len; i++) dftbuff[i] = dftbuff[i + len]; for (int i = 0; i < len; i++) { dftbuff[fftmonFFT_LEN - len + i] = buf[i]; } double val; for (int i = 0; i < fftmonFFT_LEN; i++) { val = dftbuff[i] * bshape[i]; fftmon_temp[i] = std::complex(val, 0);//val); } scanfft->ComplexFFT(fftmon_temp); for (int i = 0; i < fftmonFFT_LEN/2; i++) fftbuff[i] = fftfilt[i]->run(abs(fftmon_temp[i])); update_fftscope(); if (!scans_stable) { if (numscans++ >= progdefaults.fftviewer_scans) { scans_stable = true; Fl::awake(toggle_scans, this); } } return 0; } int fftmon::cmplx_process(const cmplx *buf, int len) { if (len > fftmonFFT_LEN) return 0; // if audio playback if (fftmon_sr != active_modem->get_samplerate()) restart(); for (int i = 0; i < fftmonFFT_LEN - len; i++) cmplxbuf[i] = cmplxbuf[i + len]; for (int i = 0; i < len; i++) { cmplxbuf[fftmonFFT_LEN - len + i] = buf[i]; } for (int i = 0; i < fftmonFFT_LEN; i++) { fftmon_temp[i] = bshape[i] * cmplxbuf[i]; } scanfft->ComplexFFT(fftmon_temp); for (int i = 0; i < fftmonFFT_LEN/2; i++) fftbuff[i] = fftfilt[i]->run(abs(fftmon_temp[i])); update_fftscope(); if (!scans_stable) { if (numscans++ >= progdefaults.fftviewer_scans) { scans_stable = true; Fl::awake(toggle_scans, this); } } return 0; } fldigi-4.2.05/src/fft-monitor/spectrum_viewer.cxx0000664000175000017500000003254314611711171016774 00000000000000// ---------------------------------------------------------------------------- // spectrum_viewer.cxx -- spectrum dialog // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "configuration.h" #include "status.h" #include "spectrum.h" #include "spectrum_viewer.h" #include "fft-monitor.h" #include "gettext.h" #include "modem.h" #include "trx.h" Fl_Double_Window *spectrum_viewer = (Fl_Double_Window *)0; spectrum *fftscope = (spectrum *)0; Fl_Group *fftmon_mnuFrame = (Fl_Group *)0; Fl_Group *group1 = (Fl_Group *)0; Fl_Group *group2 = (Fl_Group *)0; Fl_Counter *fftviewer_scans = (Fl_Counter *)0; Fl_Counter *fftviewer_range = (Fl_Counter *)0; Fl_Counter *fftviewer_maxdb = (Fl_Counter *)0; Fl_Counter *fftviewer_fcenter = (Fl_Counter *)0; Fl_Counter *fftviewer_frng = (Fl_Counter *)0; Fl_Button *fftviewer_reset = (Fl_Button *)0; Fl_Button *fftviewer_goto = (Fl_Button *)0; Fl_Group *g1 = (Fl_Group *)0; Fl_Group *g3 = (Fl_Group *)0; Fl_Group *g2 = (Fl_Group *)0; Fl_Menu_Bar *fftmon_mnu_bar = (Fl_Menu_Bar *)0; Fl_Output *values = (Fl_Output *)0; Fl_Output *db_diffs = (Fl_Output *)0; Fl_Output *f_diffs = (Fl_Output *)0; Fl_Button *pause_button = (Fl_Button *)0; Fl_Box *annunciator = (Fl_Box *)0; fftmon *fft_modem = (fftmon *)0; void cb_fftviewer_scans(Fl_Counter *w, void *d) { progdefaults.fftviewer_scans = w->value(); fft_modem->restart(); } void cb_fftviewer_range(Fl_Counter *w, void *d) { progdefaults.fftviewer_range = w->value(); } void cb_fftviewer_maxdb(Fl_Counter *w, void *d) { progdefaults.fftviewer_maxdb = w->value(); } void check_frng(int fr) { int fc = progdefaults.fftviewer_fcenter; if (fc - fr/2 < 0) fr = 2*fc; if (fc + fr/2 > 4000) fr = 2*(4000 - fc); progdefaults.fftviewer_frng = fr; fftviewer_frng->value(fr); fftviewer_frng->redraw(); } void cb_fftviewer_fcenter(Fl_Counter *w, void *d) { progdefaults.fftviewer_fcenter = w->value(); int fr = progdefaults.fftviewer_frng; check_frng(fr); } void cb_fftviewer_frng(Fl_Counter *w, void *d) { progdefaults.fftviewer_frng = w->value(); int fr = progdefaults.fftviewer_frng; check_frng(fr); } void cb_fftviewer_reset(Fl_Button *b, void *d) { progdefaults.fftviewer_fcenter = 2000; progdefaults.fftviewer_frng = 4000; fftviewer_fcenter->value(2000); fftviewer_frng->value(4000); fftviewer_fcenter->redraw(); fftviewer_frng->redraw(); if (progdefaults.wf_spectrum_dbvals) { progdefaults.fftviewer_range = progdefaults.wfAmpSpan; progdefaults.fftviewer_maxdb = progdefaults.wfRefLevel; fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->redraw(); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->redraw(); } } void cb_pause_button(Fl_Button *b, void *d) { fftscope->paused( !fftscope->paused() ); } void cb_fftviewer_goto(Fl_Button *b, void *d) { progdefaults.fftviewer_fcenter = active_modem->get_freq(); int fr = progdefaults.fftviewer_frng; if (progdefaults.wf_spectrum_modem_scale) fr = progdefaults.wf_spectrum_scale_factor * active_modem->get_bandwidth(); check_frng(fr); fftviewer_fcenter->value(progdefaults.fftviewer_fcenter); fftviewer_fcenter->redraw(); if (progdefaults.wf_spectrum_dbvals) { progdefaults.fftviewer_range = progdefaults.wfAmpSpan; progdefaults.fftviewer_maxdb = progdefaults.wfRefLevel; fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->redraw(); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->redraw(); } } void cb_spectrum_viewer(Fl_Double_Window *w, void *) { progStatus.svX = spectrum_viewer->x(); progStatus.svY = spectrum_viewer->y(); progStatus.svW = spectrum_viewer->w(); progStatus.svH = spectrum_viewer->h(); spectrum_viewer->hide(); return; } void cb_mnu_fftmon_close(Fl_Menu_*, void*) { cb_spectrum_viewer(0,0); } extern bool b_write_fftfile; void cb_mnu_fftmon_csv(Fl_Menu_*, void*) { if (!b_write_fftfile) b_write_fftfile = true; } void cb_mnu_x_graticule(Fl_Menu_*, void*) { progStatus.x_graticule = true; progStatus.y_graticule = false; progStatus.xy_graticule = false; fftscope->x_graticule(true); fftscope->y_graticule(false); } void cb_mnu_y_graticule(Fl_Menu_*, void*) { progStatus.y_graticule = true; progStatus.x_graticule = false; progStatus.xy_graticule = false; fftscope->x_graticule(false); fftscope->y_graticule(true); } void cb_mnu_xy_graticules(Fl_Menu_*, void*) { progStatus.xy_graticule = true; progStatus.x_graticule = false; progStatus.y_graticule = false; fftscope->x_graticule(true); fftscope->y_graticule(true); } Fl_Menu_Item fftmon_menu[] = { {_("&Dialog"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, {_("&Graticule"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { _("X graticule"), 0, (Fl_Callback*)cb_mnu_x_graticule, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { _("Y graticule"), 0, (Fl_Callback*)cb_mnu_y_graticule, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { _("X/Y graticules"), 0, (Fl_Callback*)cb_mnu_xy_graticules, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { 0 }, {_("&Save to CSV"), 0, (Fl_Callback*)cb_mnu_fftmon_csv, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, {_("&Close"), 0, (Fl_Callback*)cb_mnu_fftmon_close, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, { 0 }, { 0 } }; #define VALWIDTH 120 #define DIFFSWIDTH 80 #define PAUSEWIDTH 60 #define ANNUNWIDTH 140 #define WIDTHS (VALWIDTH + 2*DIFFSWIDTH + PAUSEWIDTH + ANNUNWIDTH) #define STATUS_COLOR 0xfdf5e600 void create_spectrum_viewer() { if (spectrum_viewer) return; spectrum_viewer = new Fl_Double_Window(0, 0, 550, 400, "Spectrum Scope"); spectrum_viewer->xclass(PACKAGE_NAME); fftmon_mnuFrame = new Fl_Group(0,0, spectrum_viewer->w(), 20); fftmon_mnu_bar = new Fl_Menu_Bar(0, 0, fftmon_mnuFrame->w() - WIDTHS, 20); fftmon_mnu_bar->menu(fftmon_menu); pause_button = new Fl_Button( fftmon_mnu_bar->x() + fftmon_mnu_bar->w(), 0, PAUSEWIDTH, 20, "Running"); pause_button->callback((Fl_Callback*)cb_pause_button); annunciator = new Fl_Box( pause_button->x() + pause_button->w(), 0, ANNUNWIDTH, 20, ""); annunciator->box(FL_DOWN_BOX); annunciator->color(STATUS_COLOR); values = new Fl_Output( annunciator->x() + annunciator->w(), 0, VALWIDTH, 20, ""); values->value(""); values->color(STATUS_COLOR); db_diffs = new Fl_Output( values->x() + values->w(), 0, DIFFSWIDTH, 20, ""); db_diffs->value(""); db_diffs->color(STATUS_COLOR); f_diffs = new Fl_Output( db_diffs->x() + db_diffs->w(), 0, DIFFSWIDTH, 20, ""); f_diffs->value(""); f_diffs->color(STATUS_COLOR); fftmon_mnuFrame->resizable(fftmon_mnu_bar); fftmon_mnuFrame->end(); group1 = new Fl_Group(0, 20, 550, 330); fftscope = new spectrum (group1->x(), group1->y(), group1->w(), group1->h()); group1->resizable(fftscope); group1->end(); group1->show(); group2 = new Fl_Group(0, 350, 550, 50); g1 = new Fl_Group(0, 350, 548, 50, ""); fftviewer_scans = new Fl_Counter(5, 360, 100, 22, "# scans"); fftviewer_scans->minimum(1); fftviewer_scans->maximum(500); fftviewer_scans->step(1); fftviewer_scans->lstep(10.0); fftviewer_scans->value(50); fftviewer_scans->callback((Fl_Callback*)cb_fftviewer_scans); fftviewer_scans->value(progdefaults.fftviewer_scans); fftviewer_scans->tooltip(_("each display point an average of past N fft values")); fftviewer_range = new Fl_Counter( 5 + fftviewer_scans->x() + fftviewer_scans->w(), 360, 80, 22, "dB Range"); fftviewer_range->type(1); fftviewer_range->minimum(20); fftviewer_range->maximum(120); fftviewer_range->step(10); fftviewer_range->value(60); fftviewer_range->callback((Fl_Callback*)cb_fftviewer_range); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->tooltip(_("range of dB scale")); fftviewer_maxdb = new Fl_Counter( 5 + fftviewer_range->x() + fftviewer_range->w(), 360, 80, 22, "upper dB"); fftviewer_maxdb->type(1); fftviewer_maxdb->minimum(-60); fftviewer_maxdb->maximum(0); fftviewer_maxdb->step(10); fftviewer_maxdb->value(0); fftviewer_maxdb->callback((Fl_Callback*)cb_fftviewer_maxdb); fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->tooltip(_("offset Db scale")); int xp = 5 + fftviewer_maxdb->x() + fftviewer_maxdb->w(); g2 = new Fl_Group( xp, 352, g1->w() - 2 - xp, 46, ""); g2->box(FL_ENGRAVED_FRAME); fftviewer_fcenter = new Fl_Counter( 5 + g2->x(), 358, 100, 22, "F-center"); fftviewer_fcenter->minimum(0); fftviewer_fcenter->maximum(3950); fftviewer_fcenter->step(1); fftviewer_fcenter->lstep(10); fftviewer_fcenter->value(0); fftviewer_fcenter->callback((Fl_Callback*)cb_fftviewer_fcenter); fftviewer_fcenter->value(progdefaults.fftviewer_fcenter); fftviewer_fcenter->tooltip(_("center frequency")); fftviewer_frng = new Fl_Counter( 5 + fftviewer_fcenter->x() + fftviewer_fcenter->w(), 358, 110, 22, "F-range"); fftviewer_frng->minimum(100); fftviewer_frng->maximum(4000); fftviewer_frng->step(20); fftviewer_frng->lstep(100); fftviewer_frng->value(4000); fftviewer_frng->callback((Fl_Callback*)cb_fftviewer_frng); fftviewer_frng->value(progdefaults.fftviewer_frng); fftviewer_frng->tooltip(_("frequency range")); fftviewer_reset = new Fl_Button( 5 + fftviewer_frng->x() + fftviewer_frng->w(), 354, 38, 20, "Reset"); fftviewer_reset->callback((Fl_Callback*)cb_fftviewer_reset); fftviewer_reset->tooltip(_("Center = 2000, Range = 4000")); fftviewer_goto = new Fl_Button( 5 + fftviewer_frng->x() + fftviewer_frng->w(), 376, 38, 20, "Goto"); fftviewer_goto->callback((Fl_Callback*)cb_fftviewer_goto); fftviewer_goto->tooltip(_("Center - wf track\nRange = 10 * mode-bw")); g2->end(); g1->end(); g3 = new Fl_Group(spectrum_viewer->w() - 2, 350, 2, 50, ""); g3->end(); group2->end(); group2->resizable(g3); spectrum_viewer->resizable(group1); spectrum_viewer->size_range(550, 400); spectrum_viewer->end(); spectrum_viewer->callback((Fl_Callback *)cb_spectrum_viewer); if (progStatus.x_graticule) { fftmon_menu[2].setonly(); fftscope->x_graticule(true); fftscope->y_graticule(false); } else if (progStatus.y_graticule) { fftmon_menu[3].setonly(); fftscope->x_graticule(false); fftscope->y_graticule(true); } else { fftmon_menu[4].setonly(); fftscope->x_graticule(true); fftscope->y_graticule(true); } } //====================================================================== void open_spectrum_viewer() { if (!spectrum_viewer) create_spectrum_viewer(); if (!fft_modem) { progdefaults.fftviewer_fcenter = active_modem->get_freq(); fft_modem = new fftmon(); active_modem->set_freq(progdefaults.fftviewer_fcenter); } else progdefaults.fftviewer_fcenter = active_modem->get_freq(); int fr = progdefaults.fftviewer_frng; if (progdefaults.wf_spectrum_modem_scale) fr = progdefaults.wf_spectrum_scale_factor * active_modem->get_bandwidth(); check_frng(fr); fftviewer_fcenter->value(progdefaults.fftviewer_fcenter); fftviewer_fcenter->redraw(); if (progdefaults.wf_spectrum_dbvals) { progdefaults.fftviewer_range = progdefaults.wfAmpSpan; progdefaults.fftviewer_maxdb = progdefaults.wfRefLevel; fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->redraw(); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->redraw(); } spectrum_viewer->show(); spectrum_viewer->redraw(); spectrum_viewer->resize(progStatus.svX, progStatus.svY, progStatus.svW, progStatus.svH); } void close_spectrum_viewer() { if (spectrum_viewer) { spectrum_viewer->hide(); delete spectrum_viewer; spectrum_viewer = 0; } if (fft_modem) { delete fft_modem; fft_modem = 0; } } void recenter_spectrum_viewer() { if (!spectrum_viewer) return; if (!spectrum_viewer->visible()) return; if (!progdefaults.wf_spectrum_center) return; if (!fft_modem) return; progdefaults.fftviewer_fcenter = active_modem->get_freq(); int fr = progdefaults.fftviewer_frng; if (progdefaults.wf_spectrum_modem_scale) fr = progdefaults.wf_spectrum_scale_factor * active_modem->get_bandwidth(); check_frng(fr); fftviewer_fcenter->value(progdefaults.fftviewer_fcenter); fftviewer_fcenter->redraw(); if (progdefaults.wf_spectrum_dbvals) { progdefaults.fftviewer_range = progdefaults.wfAmpSpan; progdefaults.fftviewer_maxdb = progdefaults.wfRefLevel; fftviewer_maxdb->value(progdefaults.fftviewer_maxdb); fftviewer_maxdb->redraw(); fftviewer_range->value(progdefaults.fftviewer_range); fftviewer_range->redraw(); } spectrum_viewer->redraw(); } fldigi-4.2.05/src/fft-monitor/spectrum.cxx0000664000175000017500000000701214611711171015404 00000000000000// ---------------------------------------------------------------------------- // spectrum Spectrum display Widget based on Digiscope widget // // Copyright (C) 2006-2017 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "spectrum.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "qrunner.h" #include "configuration.h" spectrum::spectrum (int x, int y, int w, int h) : Digiscope (x, y, w, h) { _paused = false; _freq = 0; _db = 0; _db_diff = 0; _f_diff = 0; _gofreq = 0; mode(spectrum::SCOPE); } spectrum::~spectrum() { } void spectrum::handle_shift_leftclick(int x1) { _gofreq = progdefaults.fftviewer_fcenter - progdefaults.fftviewer_frng / 2 + (1.0 * x1 / w()) * progdefaults.fftviewer_frng; } void spectrum::handle_leftclick( int x1, int y1) { if (Fl::event_state() & FL_SHIFT) { handle_shift_leftclick(x1); return; } if (Fl::event_key('1') || Fl::event_key(FL_KP + '1')) { _y_user1 = 1.0 * y1 / h(); _x_user1 = 1.0 * x1 / w(); } else if (Fl::event_key('2') || Fl::event_key(FL_KP + '2')) { _y_user2 = 1.0 * y1 / h(); _x_user2 = 1.0 * x1 / w(); } else if (Fl::event_key('c') || Fl::event_key('3') || Fl::event_key(FL_KP + '3')) { _y_user1 = _y_user2 = -1; _x_user1 = _x_user2 = -1; } else { _freq = progdefaults.fftviewer_fcenter - progdefaults.fftviewer_frng / 2 + (1.0 * x1 / w()) * progdefaults.fftviewer_frng; _db = progdefaults.fftviewer_maxdb - (1.0 * y1 / h()) * progdefaults.fftviewer_range; return; } if ((_y_user1 != -1) && (_y_user2 != -1)) _db_diff = (_y_user1 - _y_user2) * progdefaults.fftviewer_range; else _db_diff = 0; if ((_x_user1 != -1) && (_x_user2 != -1)) _f_diff = (_x_user2 - _x_user1) * progdefaults.fftviewer_frng; else _db_diff = 0; } void spectrum::handle_rightclick( int x, int y) { _paused = !_paused; } int spectrum::handle(int event) { if (event == FL_ENTER) { fl_cursor(FL_CURSOR_CROSS); redraw(); return 1; } if (event == FL_LEAVE) { fl_cursor(FL_CURSOR_ARROW); redraw(); return 1; } if (!Fl::event_inside(this)) return 0; switch (event) { case FL_PUSH : break; case FL_RELEASE : if (!Fl::event_inside(this)) break; switch (Fl::event_button()) { case FL_LEFT_MOUSE: handle_leftclick(Fl::event_x() - x(), Fl::event_y() - y()); break; case FL_RIGHT_MOUSE : handle_rightclick(Fl::event_x() - x(), Fl::event_y() - y()); break; default : break; } default : break; } return 1; } fldigi-4.2.05/src/soundcard/0000775000175000017500000000000014611714005012613 500000000000000fldigi-4.2.05/src/soundcard/steam_train.cxx0000664000175000017500000116573714611711171015612 00000000000000#define STEAM_TRAIN_SIZE 50225 int int_steam_train[STEAM_TRAIN_SIZE] = { -1, 2, -2, 2, -2, 1, 0, -1, 3, -3, 2, -1, 1, -1, 2, -2, 0, 2, -3, 3, -4, 2, -2, 1, 0, 0, 2, -1, 0, 2, -4, 6, -3, 2, -1, -2, 2, 0, 0, 2, 0, 3, 3, 0, 4, 3, 4, 6, 2, 4, 1, 3, 0, 1, -3, -2, 0, -1, -1, -6, 0, -1, 10, 5, 5, 0, 5, 3, 3, 0, -4, 0, -4, -9, -7, -12, 1, 3, 1, -12, -15, -5, 0, -5, -16, -18, -11, -13, -9, -9, -10, -4, -6, 7, -4, -4, -8, 4, 11, 5, -4, -2, 1, -3, -8, -15, -4, 3, -1, -8, -14, -2, -3, 0, -10, -10, -8, -9, -17, -25, -22, -5, 4, 4, -1, 3, 17, 22, 14, 4, 0, -8, -21, -21, -23, -32, -33, -16, -6, -3, -15, -10, 9, 31, 34, 23, 29, 29, 14, -12, -11, -20, -44, -55, -68, -56, -29, -7, -25, -34, -33, -14, 7, 28, 22, 37, 44, 75, 73, 56, 5, -15, -30, -33, -44, -38, -38, -33, -46, -52, -33, -18, 16, 21, 29, 32, 26, 17, 5, 0, 3, 29, 40, 20, -2, -13, -23, -32, -40, -31, -26, -20, -5, -4, -1, 14, 26, 26, 13, 0, -1, -34, -60, -57, -49, -60, -43, -32, 1, 15, 36, 26, 10, 13, 18, -7, -35, -50, -44, -11, 17, 47, 69, 32, 0, 1, 42, 52, 69, 89, 75, 70, 106, 153, 204, 214, 149, 77, -30, -106, -150, -145, -139, -103, -60, 24, 92, 145, 148, 161, 210, 248, 210, 155, 107, 64, -7, -80, -101, -114, -152, -240, -257, -211, -149, -93, -17, 77, 140, 171, 191, 147, 120, 143, 141, 78, 47, 65, 25, -11, -39, -52, -120, -187, -232, -259, -306, -305, -254, -153, -41, 22, 148, 242, 299, 248, 143, 67, 28, 22, -55, -140, -202, -248, -212, -144, -51, 106, 241, 302, 285, 257, 116, -34, -160, -241, -360, -449, -382, -281, -144, -30, 147, 415, 581, 645, 596, 461, 266, 16, -233, -434, -562, -576, -474, -302, -124, -5, 152, 346, 462, 524, 490, 367, 339, 366, 355, 324, 232, 59, -115, -282, -369, -396, -401, -374, -350, -424, -486, -451, -286, -64, 103, 196, 267, 357, 421, 378, 321, 231, 157, 14, -258, -533, -813, -894, -825, -616, -429, -357, -283, -194, -4, 251, 462, 483, 408, 306, 120, -54, -135, -89, -40, 52, 57, -22, -196, -426, -514, -491, -337, -189, -45, 119, 232, 320, 252, 160, 40, -54, -33, 3, -79, -192, -214, -119, 1, 43, 12, 95, 298, 480, 498, 352, 247, 113, -76, -382, -656, -707, -660, -513, -360, -164, 41, 295, 492, 635, 736, 819, 916, 859, 764, 478, 15, -521, -970, -1242, -1444, -1396, -1218, -867, -455, -22, 520, 972, 1315, 1384, 1312, 1146, 826, 358, -220, -676, -979, -1005, -752, -475, -181, 123, 358, 448, 374, 96, -342, -608, -690, -684, -481, 40, 693, 1013, 1130, 1220, 1146, 992, 588, -3, -573, -1216, -1662, -1752, -1222, -525, 62, 640, 1024, 1184, 1154, 1093, 853, 470, 27, -461, -732, -866, -935, -724, -388, -99, 155, 321, 307, 474, 638, 504, 300, 9, -230, -344, -402, -553, -671, -639, -556, -314, 0, 284, 449, 459, 724, 969, 1219, 1317, 1089, 714, 315, -90, -764, -1352, -1806, -1802, -1518, -1111, -478, 95, 600, 876, 1084, 1334, 1462, 1273, 893, 413, 7, -75, -45, -125, -433, -629, -831, -1021, -1218, -1377, -1144, -797, -268, 274, 557, 813, 1063, 1369, 1606, 1535, 1148, 463, -422, -1141, -1220, -989, -635, -399, -240, -33, 149, 381, 337, 89, -223, -688, -996, -915, -599, 3, 533, 1123, 1796, 2165, 2078, 1347, 521, -528, -1468, -1857, -2133, -1917, -1256, -480, 266, 785, 1211, 1454, 1540, 1043, 114, -925, -1922, -2439, -2422, -1904, -937, 51, 1093, 1877, 2490, 2805, 2579, 1718, 227, -1065, -2216, -2770, -2873, -2778, -2225, -1566, -632, 252, 1055, 1743, 1922, 1892, 1505, 979, 515, 131, -101, -197, -134, -51, -319, -871, -1377, -1779, -1707, -1494, -1173, -731, -193, 141, 517, 1218, 1590, 1697, 1554, 1034, 479, -65, -361, -432, -315, -21, 227, 317, 184, -343, -969, -1525, -1784, -1622, -1336, -789, -51, 962, 1944, 2668, 3195, 2876, 2155, 836, -597, -1508, -2208, -2459, -2326, -1897, -1319, -490, 615, 1636, 2470, 2397, 1621, 756, -100, -679, -1147, -1355, -1300, -973, -152, 631, 1213, 1505, 1223, 932, 413, -69, -438, -764, -739, -675, -574, -582, -411, -158, -163, -446, -896, -1276, -1283, -1035, -571, 48, 648, 1564, 2283, 2663, 2460, 1596, 523, -682, -1590, -2138, -2459, -2539, -2360, -1678, -612, 487, 1220, 1405, 1251, 1075, 1194, 1468, 1872, 1903, 1662, 1085, 482, -226, -870, -1437, -1938, -2191, -2305, -1908, -1263, -447, 417, 1343, 2134, 2613, 2817, 1983, 685, -159, -684, -735, -112, 565, 897, 1070, 975, 407, -320, -1004, -1851, -2411, -2677, -2654, -1890, -827, 551, 1888, 3050, 3855, 3958, 3314, 1464, -386, -1936, -3282, -3776, -3739, -3029, -1751, 17, 1819, 3091, 3637, 3172, 2074, 576, -1180, -2528, -3259, -3320, -3139, -2790, -1852, -473, 1449, 3008, 3635, 3335, 2538, 1408, 313, -616, -1520, -1921, -1900, -1851, -1473, -1035, -919, -787, -515, -366, -287, -35, 111, 340, 717, 1332, 2340, 2977, 2845, 2225, 843, -737, -1981, -2570, -2311, -1934, -1683, -1320, -678, 211, 851, 828, 418, 107, -285, -419, -198, 299, 1146, 2280, 2918, 2981, 2577, 1060, -589, -2123, -3255, -3787, -4037, -3546, -2503, -864, 703, 1741, 2845, 3155, 2558, 1791, 632, -494, -1350, -1623, -1234, -709, -21, 842, 1216, 719, -272, -885, -1225, -1315, -1155, -1081, -971, -657, 489, 1684, 2491, 2509, 1072, -514, -2165, -3363, -3555, -2842, -1651, -355, 1495, 3201, 5012, 6505, 6049, 4399, 1016, -3342, -6548, -8578, -8974, -8626, -6710, -3794, -41, 5173, 8457, 9671, 9055, 6803, 4104, 1034, -1156, -3046, -4408, -3831, -2435, -463, 1203, 1277, 263, -1028, -2152, -3300, -3931, -3594, -2847, -771, 2166, 5000, 6689, 6184, 4890, 3663, 2236, 554, -690, -2408, -3842, -3726, -3031, -2086, -689, -71, -426, -1098, -1866, -1455, -73, 1161, 2355, 3930, 4841, 5000, 4303, 2085, -767, -2965, -4660, -5679, -5286, -4119, -1737, 1784, 4559, 5757, 5133, 3034, 128, -1859, -3262, -4643, -5263, -4870, -2885, -475, 1823, 3935, 5324, 5457, 3871, 2293, 643, -674, -989, -2066, -2363, -2364, -1528, 299, 970, 759, -852, -3444, -5060, -5135, -4669, -3259, -1598, 1605, 5601, 9527, 12825, 12566, 9299, 4048, -1797, -7357, -10709, -12020, -11747, -10112, -5862, -555, 4614, 8328, 9051, 8228, 5958, 3920, 1224, -1746, -3889, -4176, -2432, 257, 3301, 3795, 1960, 708, -535, -1863, -2485, -3558, -4566, -4043, -2323, -752, 572, 947, 1052, 1904, 2142, 2364, 3117, 3160, 2692, 2001, 657, -839, -1896, -4305, -6631, -6586, -5456, -3295, -384, 1466, 3991, 7311, 8229, 6789, 3861, -574, -4345, -6687, -9877, -10427, -8418, -3747, 3308, 8696, 12809, 13210, 10355, 5266, 231, -3368, -7512, -10458, -12119, -11756, -9633, -5471, 635, 6249, 9302, 9037, 7009, 4002, 887, -531, -832, -1375, -1174, 667, 2133, 2803, 2609, 953, -1124, -3872, -6152, -8293, -9157, -7998, -5431, -665, 4813, 9598, 10944, 9612, 6425, 2962, 1413, -141, -3196, -6331, -7033, -6732, -4389, 117, 2411, 2965, 1669, -441, -1171, -2047, -3049, -2910, -1687, 234, 2399, 1954, -29, -510, 502, 2404, 3427, 2598, 1415, 2085, 1866, 1501, 710, -1985, -3806, -5325, -6618, -5396, -3142, -241, 4357, 8283, 10334, 8352, 3844, -1372, -5200, -5973, -5790, -5386, -3006, -576, 4047, 9001, 12307, 14704, 11332, 4566, -4056, -11269, -15548, -16607, -15463, -11984, -4448, 4306, 11311, 15902, 16718, 15441, 12439, 6631, -359, -7843, -12006, -13221, -11762, -8430, -4843, -408, 3182, 5099, 5785, 3980, 359, -1397, -1705, -1461, -419, 168, 631, 1115, 2305, 3055, 2677, 1312, -47, -1231, -1372, 345, 822, 49, -2819, -4728, -5116, -4903, -2597, 967, 3471, 6182, 8648, 6993, 3452, -391, -3020, -4005, -5358, -6073, -5493, -3606, 258, 5645, 9361, 10696, 8254, 1206, -4677, -8283, -10596, -9418, -6484, -3252, 609, 3417, 6560, 8056, 7694, 6810, 4345, 866, -2531, -5051, -7010, -7499, -3745, 1784, 5171, 7482, 4231, -81, -1978, -4392, -4730, -4829, -4631, -2502, 12, 1839, 3608, 6156, 7557, 8189, 6710, 3441, 65, -4497, -7884, -8363, -7014, -5575, -5170, -6273, -5122, -1140, 3594, 9013, 11988, 10042, 7534, 3456, -338, -2052, -5685, -8734, -10935, -9977, -5941, -468, 4663, 10248, 14175, 12905, 8326, -83, -7806, -12319, -14083, -11716, -6939, -2454, 1898, 6040, 8868, 11875, 13250, 8957, 1784, -4476, -9545, -9892, -9365, -6795, -1369, 3424, 8077, 8712, 7930, 3979, -1584, -5454, -7987, -7365, -6400, -6550, -6148, -3227, 4761, 13601, 14461, 10912, 6397, 1012, -3470, -6844, -7771, -7500, -5982, -5473, -5403, -3702, -1198, 2387, 5339, 7831, 8659, 5754, 561, -3651, -3451, 383, 2722, 803, -2267, -3713, -3398, -1546, 570, 2129, 941, -688, -1952, -1539, 83, -1931, -1640, 353, 1272, 3396, 2955, 1851, 3655, 3959, 3447, 432, -5515, -7268, -9132, -9007, -3638, 2205, 7653, 10020, 10025, 7697, 5061, 1093, -4314, -7329, -9244, -10437, -11256, -8292, -904, 8190, 16224, 19173, 15829, 6667, -3510, -10305, -13474, -11763, -7854, -5833, -5488, -4080, 149, 7090, 11867, 12970, 10061, 3856, -2352, -7724, -9320, -8043, -4438, -486, 2369, 5925, 7400, 7324, 5796, 2913, 294, -4826, -9043, -11169, -10699, -6996, -2339, 2897, 6130, 8412, 8878, 7122, 4697, 1833, 1199, 302, -1697, -3636, -6638, -8599, -7089, -3488, 2009, 7761, 8961, 8056, 5533, 2040, -318, -2646, -4945, -5532, -7213, -7494, -5204, -381, 8028, 14146, 15432, 10858, 2453, -5165, -8822, -10870, -9942, -7862, -5568, -2168, 2940, 7953, 11005, 12919, 6760, -125, -7433, -12347, -12570, -11612, -4927, 2234, 10778, 15965, 15464, 12637, 4728, -1675, -5435, -9753, -12135, -14323, -15602, -13511, -4886, 6432, 15758, 20793, 18052, 11414, 2483, -5521, -9060, -10118, -9887, -8659, -6643, -2639, 1404, 5839, 9074, 10817, 9177, 2233, -4251, -10078, -10964, -7050, -3125, 2709, 5130, 5067, 5130, 5737, 8473, 8389, 4406, -2462, -8102, -11210, -11331, -9816, -6898, -2306, 1645, 5623, 8501, 7763, 6731, 6178, 4841, 2337, -2993, -8376, -14089, -15071, -9050, -1392, 6862, 13245, 16142, 14390, 9588, 2637, -4894, -7750, -10601, -13018, -12508, -9809, -5657, 825, 9658, 15661, 18441, 12806, 2079, -5973, -8753, -8627, -6406, -5054, -4730, -2392, 311, 6159, 9125, 9599, 5773, -1082, -7324, -11251, -10782, -9555, -4718, 1974, 8660, 12619, 11160, 6862, 4555, 3908, 1625, -2952, -7893, -11239, -11354, -8439, -5624, -1463, 1808, 3500, 5828, 7597, 7644, 4293, 1097, -695, -3074, -5391, -8252, -8892, -6529, -14, 7800, 11898, 13147, 10921, 4981, -462, -5584, -9476, -13051, -14098, -12344, -6857, 1178, 8687, 18265, 20294, 18266, 10455, -1884, -10062, -16739, -16854, -12958, -7507, 804, 7103, 11383, 13705, 13125, 9433, 1619, -6641, -13328, -17645, -17255, -13333, -6265, 3301, 11987, 17512, 18444, 15442, 8262, 1152, -4050, -8820, -12399, -13810, -12986, -8269, -2460, 3818, 7398, 6702, 6667, 4482, 2043, 283, -861, -2072, -1173, -501, -343, 716, 513, 2579, 2929, 2932, 3344, -483, -4263, -5436, -4116, -2782, -2918, -3811, -3469, -741, 2443, 7266, 10072, 9108, 7823, 4408, -81, -2850, -7275, -9608, -10403, -8232, -2414, 2071, 7268, 11175, 13239, 10962, 2997, -5497, -13045, -15081, -13212, -10714, -2122, 4294, 9702, 16524, 16475, 14737, 9050, -647, -8789, -14736, -16353, -15432, -11842, -6104, 3559, 13105, 16512, 15412, 9143, 1284, -5103, -9459, -11293, -10751, -8605, -4524, 2548, 12027, 18815, 18853, 12736, 3322, -4071, -10726, -14263, -14925, -14633, -11066, -6904, -783, 6062, 11531, 13887, 14796, 13283, 8574, 3327, -4183, -10489, -11091, -6362, -2469, 761, 1781, 838, 1952, 3477, 4189, 2799, -637, -4497, -5171, -3942, -3123, -2515, 133, 3840, 6782, 8891, 6952, 3944, 3314, 23, -3340, -6320, -10836, -12006, -11031, -7325, 19, 8260, 12778, 12129, 7480, 2228, -1175, -6236, -10305, -10382, -10507, -6782, -1015, 5020, 14854, 17953, 15806, 11085, 1433, -7951, -15613, -20691, -20529, -14517, -5672, 2300, 9135, 14031, 16437, 14560, 8732, 1569, -5767, -11628, -14330, -13270, -6792, 2655, 9851, 12689, 13288, 11082, 2660, -3689, -9959, -14035, -14093, -13836, -11981, -8021, -73, 8815, 17191, 20828, 17192, 9097, 888, -4566, -6885, -8829, -9223, -8761, -8091, -5615, -3794, -982, 4346, 7818, 8132, 5888, 1983, -1678, -2316, -1722, -899, -548, -434, -1120, -1297, 1751, 3934, 5224, 4750, 3240, 686, -2148, -5657, -8187, -7255, -4785, -2922, -1077, 1671, 4706, 8740, 9732, 8003, 4695, -2313, -7947, -10590, -9824, -3513, 2542, 7338, 11812, 12072, 9220, 4249, -3574, -8695, -10905, -13455, -13950, -11672, -6100, 2375, 11247, 19398, 22218, 16137, 6873, -2042, -7994, -10183, -11453, -10985, -9337, -4708, 757, 7046, 12415, 11377, 7478, 896, -7018, -10593, -11717, -11738, -6831, 1144, 9464, 13951, 14064, 12698, 9943, 4953, -1139, -7253, -12437, -15451, -15429, -10811, -3410, 4601, 8802, 9443, 9776, 8599, 5154, 1489, -2315, -1527, -511, -1065, -2679, -5587, -4087, -2755, 580, 3915, 4132, 1722, 331, 1024, 1737, 2307, -978, -5926, -9233, -8573, -4756, 1407, 6618, 10832, 11541, 8244, 6442, 3303, -1177, -4750, -8505, -11078, -9062, -6422, -1110, 6113, 8906, 10995, 7137, -2142, -8365, -12552, -13498, -8161, -2038, 5326, 12056, 14923, 18165, 17693, 10428, 1053, -9392, -17544, -19948, -19914, -16573, -7722, 2249, 10572, 17005, 14676, 8327, 3695, -2137, -5357, -6417, -7133, -6104, -3869, 1343, 6745, 10218, 10090, 3901, -2276, -6646, -10727, -11516, -10371, -6211, -1046, 2597, 6428, 6297, 6042, 6377, 6074, 5727, 3872, 218, -2894, -2406, -818, -1654, -2916, -4438, -6536, -4694, -1788, 1477, 5112, 8264, 8639, 5416, 1569, -3726, -7462, -8197, -6383, -3805, 156, 4204, 9042, 13060, 12210, 9315, 671, -6975, -13648, -19340, -17900, -13217, -4422, 5356, 13049, 14505, 14345, 10072, 1766, -2852, -8524, -12567, -13491, -10318, -2742, 9060, 17760, 20570, 15791, 5316, -4891, -14976, -19060, -20894, -17384, -12147, -5535, 6171, 13765, 20088, 19714, 14628, 9846, 1155, -6077, -12480, -13956, -10994, -5637, 1384, 5345, 4823, 3349, 649, -2041, -2377, -4022, -5331, -6014, -3055, 721, 5608, 8149, 7871, 6787, 4095, 2516, -387, -1422, -2543, -2307, -800, -2348, -4260, -7117, -7953, -4582, 251, 6405, 7800, 6435, 4653, 3753, 4399, 2535, -429, -5089, -9238, -11174, -9465, -1259, 7388, 14454, 17010, 12615, 5339, -4381, -10991, -14867, -16287, -12008, -7189, -1946, 5843, 11940, 17746, 18946, 13845, 5025, -6401, -14106, -18388, -14633, -6521, 1111, 8334, 10750, 11031, 9342, 4682, -830, -7088, -11342, -13740, -14356, -10608, -3763, 4911, 13288, 18104, 17316, 12103, 3850, -3644, -8056, -9934, -9030, -6578, -4565, -2129, -547, -85, 1968, 4748, 5140, 3373, -15, -3406, -3601, -1652, 2552, 3115, 2010, 1379, -927, -112, 2546, 3008, 2367, 1777, -293, -2651, -5695, -8623, -7900, -4328, -1418, 2651, 6173, 6137, 7456, 8809, 8744, 6814, 82, -7118, -13681, -15525, -9704, -1976, 5160, 11421, 14131, 12368, 8121, 987, -6118, -10701, -13412, -14235, -11170, -7300, -1802, 7560, 16291, 22501, 19104, 9155, -2410, -11697, -13283, -12520, -11350, -8267, -2851, 5404, 11640, 13670, 11356, 5287, -2172, -7810, -10366, -11057, -10356, -6967, 1201, 9911, 15789, 14390, 9730, 2046, -1756, -3640, -6126, -6415, -7389, -6091, -4470, -2104, 1182, 3436, 2494, 3306, 3379, 1499, 31, 1538, 1895, 2669, 1521, -3015, -5759, -5444, -2631, 749, 3749, 6272, 6806, 3878, 357, -4791, -6337, -7419, -8170, -7256, -4599, -612, 7948, 15241, 16200, 13532, 4761, -5946, -12940, -15763, -14432, -10618, -3028, 7196, 12949, 16799, 14934, 9106, 1581, -4941, -9745, -16325, -18879, -16789, -9817, 2837, 14108, 21772, 22036, 14576, 7058, -139, -6704, -12169, -14306, -15535, -12905, -5560, 1791, 8551, 11151, 11396, 6421, 839, -4323, -9611, -10161, -7516, -1702, 3310, 6915, 6030, 4152, 4057, 3947, 3194, 559, -3405, -7261, -7828, -6325, -3753, -2544, -3138, -3639, -3008, -495, 2420, 6238, 9614, 11477, 11278, 5591, -1722, -8330, -12536, -12507, -8249, -2583, 2557, 7142, 9493, 10893, 10606, 5891, -1080, -9353, -17495, -17223, -11812, -2824, 8654, 17032, 20667, 17441, 9647, 740, -7134, -12194, -15591, -13785, -8469, -3317, 4700, 11038, 17263, 17956, 11638, 1628, -12452, -20061, -21258, -17061, -7481, 1832, 11097, 16311, 18021, 18361, 12892, 5418, -4884, -14057, -17318, -19571, -16666, -9791, 826, 11436, 13876, 12104, 7047, 1666, -1288, -3748, -6386, -4954, -1038, 1200, 1182, 1794, 4371, 6259, 7479, 5721, 1462, -5291, -8844, -6132, -2648, -2280, -4933, -8844, -9823, -6269, -548, 7769, 13704, 17290, 17138, 12311, 4078, -4235, -11231, -17386, -17888, -15283, -10023, -4074, 7218, 17217, 20654, 19905, 9124, -3110, -12760, -19353, -17707, -13315, -8272, 2182, 10100, 18536, 23809, 20502, 11050, -1953, -10214, -15815, -18390, -19266, -14328, -4430, 6324, 17560, 21165, 14432, 5702, -2896, -9105, -10098, -8949, -7515, -5386, 1210, 10579, 16858, 16074, 10902, 2569, -4826, -10676, -13088, -14125, -11217, -4046, 178, 3704, 2312, 2658, 3789, 3879, 5790, 6138, 3941, 823, 1035, 3588, 3161, -332, -2912, -6673, -6161, -3583, -1349, 1924, 3519, 4562, 1109, -2683, -6860, -8757, -9290, -8368, -1021, 5157, 12108, 17423, 19953, 16866, 7495, -2393, -11806, -19158, -23385, -20735, -13611, -3023, 9910, 19169, 22662, 18979, 9888, 363, -8706, -14855, -18770, -17483, -13042, -4655, 9016, 19211, 25780, 25003, 14417, 1544, -10149, -18647, -21807, -21502, -17098, -7465, 3368, 12404, 16647, 15299, 11057, 4932, -471, -6240, -9593, -9017, -4582, 1777, 7726, 11563, 8630, 2345, -2338, -5975, -7088, -6654, -6631, -4640, -3211, -985, 196, 1007, 2033, 1598, 3099, 5949, 5953, 6346, 7222, 5282, 4290, -164, -5345, -10990, -15030, -14890, -11329, -3592, 5260, 9645, 10868, 9584, 3687, -1181, -6498, -9910, -10921, -7021, -1237, 7201, 15047, 16324, 15291, 6648, -3714, -11501, -19674, -23159, -20173, -11592, 1880, 13036, 20240, 21652, 16684, 10444, 2619, -7170, -15190, -18820, -17275, -10406, 2721, 13593, 20404, 22945, 15583, 7501, -4293, -13714, -17548, -18479, -16420, -11819, -3806, 3890, 11980, 15616, 16003, 12765, 6363, -264, -4798, -6307, -3687, 4, 1492, 1411, -2052, -5047, -5215, -4121, -2041, -812, -305, 787, 2137, 4135, 3421, 567, -2244, -3694, -1785, -221, 3417, 8143, 10557, 11981, 9156, 2544, -6086, -13883, -20102, -20804, -15635, -6879, 1373, 10399, 17065, 20191, 18034, 9782, 2239, -6575, -12894, -15965, -14314, -7449, 3191, 11569, 17505, 16422, 9462, 884, -9992, -15995, -16045, -14320, -11162, -4906, 2050, 10894, 17340, 18978, 14940, 6668, -3686, -11915, -14529, -11822, -6530, 135, 6370, 10030, 10522, 7665, 2327, -3291, -7235, -10080, -11520, -11566, -7580, -1817, 3305, 6350, 8057, 8005, 6753, 4409, 3600, 5616, 5236, 3178, -884, -7895, -13595, -15642, -14226, -7632, -937, 6330, 10120, 10403, 9424, 7841, 5136, -240, -4451, -10104, -11460, -7885, -183, 9211, 17270, 19287, 16485, 6192, -6226, -15582, -22710, -21993, -18659, -11715, -3877, 6235, 15337, 22220, 24560, 21206, 10955, -440, -11098, -17510, -17140, -14900, -6134, 1474, 7458, 10615, 9917, 7509, 3766, -1993, -4259, -8192, -10819, -7802, -6626, 1105, 8578, 11291, 10705, 5787, 568, -2491, -1570, -583, 1270, 891, -1128, -3862, -6991, -4315, -2872, -1708, -25, -173, 751, 301, 1020, 5017, 4924, 2363, -1539, -4676, -5724, -3122, 3820, 9467, 11488, 7727, 3274, -3132, -9460, -12920, -14366, -13257, -10522, -6811, -2743, 4191, 12204, 17579, 17339, 10879, 2067, -6093, -13447, -14968, -10693, -4256, 3417, 9440, 12771, 10606, 4749, -1451, -8840, -13082, -14693, -14975, -12467, -5208, 7436, 17736, 25154, 24144, 15353, 6004, -2904, -7663, -12354, -14325, -13415, -10553, -4654, 3270, 10559, 12792, 11547, 9299, 4607, -1897, -7280, -11623, -9931, -4423, 2952, 6878, 6433, 5928, 3707, 4321, 5138, 3480, 1229, -2444, -4649, -3013, -4922, -7019, -7492, -7552, -4865, -1594, 2579, 5786, 9407, 10552, 8685, 6067, -38, -6476, -11154, -9164, -4389, -1166, 3763, 6904, 9030, 9242, 6115, -1039, -6411, -12319, -17261, -16385, -12985, -3390, 7895, 16101, 21236, 19581, 12659, 4518, -4319, -7839, -11452, -13600, -12395, -6701, 2662, 7504, 12158, 10976, 4695, -1012, -8236, -12987, -12063, -8110, -2280, 4556, 9955, 14297, 14190, 11391, 6975, -535, -7628, -12475, -14596, -13161, -7825, -2287, 3605, 6709, 7821, 7827, 3439, -164, -2299, -3575, -2587, 95, 2372, 2583, 252, -620, -1472, -701, 2439, 5251, 5921, 5163, 4936, 1427, -2981, -7424, -13008, -16206, -14928, -9464, -896, 10078, 18061, 19652, 17087, 9525, 1511, -3494, -8841, -11807, -11537, -10210, -5751, 451, 8791, 13378, 11611, 6678, -2838, -10899, -15435, -15450, -11406, -5007, 2606, 9030, 14847, 17556, 16311, 11354, 2002, -6386, -13712, -16848, -14327, -10129, -2331, 3000, 6369, 7050, 4623, 2109, -1556, -3975, -5317, -3479, 314, 4064, 5883, 7243, 6897, 4082, 1908, -608, -3961, -6978, -6934, -4896, -1353, 477, 506, -2318, -3417, -3716, -3774, 113, 2707, 8292, 10589, 9194, 5419, -622, -5239, -9169, -9094, -6548, -4712, -760, 6674, 12469, 14142, 8983, -582, -8498, -13682, -16165, -15556, -11091, -4406, 5713, 15514, 20354, 20964, 15151, 7566, 516, -6669, -13519, -18361, -17894, -12653, -2789, 6079, 12449, 12359, 7578, 1411, -6745, -9226, -9049, -6501, -3054, 2726, 8552, 13396, 16319, 14018, 7955, -748, -6591, -12787, -14046, -11027, -7720, -2685, 1501, 2119, 1649, 980, -89, 1828, 3631, 5123, 5764, 6065, 6639, 5189, 1967, -2400, -7348, -8844, -6855, -3903, -865, 2318, 4506, 4609, 2971, -1207, -4636, -9182, -9228, -5550, 554, 8490, 12613, 14581, 14236, 10881, 2164, -5278, -12231, -16719, -15723, -10696, -2616, 7502, 13869, 15101, 12408, 4868, -1871, -8251, -12985, -14817, -11861, -7882, 1292, 10852, 18734, 24548, 19757, 11637, 1477, -9246, -15965, -19502, -19108, -12762, -4729, 4297, 10234, 9992, 8301, 2951, -634, -2432, -4373, -4711, -2974, 1592, 7935, 12841, 10791, 5984, 154, -3991, -6890, -9392, -10247, -8849, -5284, -518, 2004, 754, -1308, -2587, 299, 5128, 8921, 8762, 7232, 6408, 6949, 5647, -93, -6632, -12302, -14116, -12995, -6194, 2054, 5955, 9819, 8531, 5890, 1944, -3571, -7134, -9018, -6146, -387, 4451, 9373, 14068, 14380, 12385, 4213, -3565, -12923, -21064, -20780, -16412, -5719, 4765, 13354, 15756, 14439, 10583, 2249, -5299, -11819, -15978, -15413, -10717, -2614, 8602, 17634, 22568, 18891, 9982, -570, -11257, -17102, -19742, -16621, -10709, -4419, 512, 5339, 9050, 9436, 8963, 5783, 1155, -1789, -3715, -4118, 965, 5195, 6742, 5514, 1465, -2190, -6592, -8866, -8177, -6321, -3518, -278, 1464, 2835, 1805, -1461, -518, 1924, 3597, 6195, 4536, 3523, 6042, 7169, 8177, 2631, -6387, -14908, -19456, -16142, -9557, 771, 8286, 11591, 12738, 11545, 6243, -831, -5717, -10156, -11827, -8970, -4851, 1710, 11338, 16712, 18063, 13048, 1512, -8460, -17523, -21767, -18525, -11788, -3741, 4349, 11869, 16355, 17030, 11574, 4524, -2888, -11214, -13588, -13619, -9323, 1078, 9253, 16520, 18224, 12499, 5123, -5648, -13446, -15674, -14508, -11331, -8759, -4166, 2440, 10349, 15439, 14737, 12322, 6233, 840, -2469, -3634, -2443, -1585, 781, -612, -3368, -5905, -8846, -7979, -5494, -2120, 454, 2199, 2144, 4315, 4791, 3101, 1829, -2799, -5419, -4214, -1172, 4349, 11687, 12616, 11868, 4466, -6001, -11898, -15256, -15231, -11207, -4936, 1, 9124, 15334, 18166, 17229, 9922, 1335, -5656, -13441, -15756, -13395, -7438, 2357, 9515, 15889, 16371, 11359, 4761, -3634, -9986, -12825, -13849, -14731, -11798, -2818, 6839, 16774, 19837, 16112, 9247, -552, -5824, -9875, -8740, -4158, -1452, 3779, 6221, 6048, 3879, 1179, -269, -3781, -4793, -6751, -8238, -5670, -1911, 3267, 5702, 5077, 2702, 1131, 1391, 3395, 4798, 5925, 6639, 4266, 2335, -2774, -9514, -13480, -15466, -12984, -5908, 979, 6938, 11255, 14199, 15789, 11173, 5096, -3684, -12626, -14420, -11731, -4175, 3196, 10107, 13848, 11311, 5760, -3276, -9570, -12860, -14769, -12881, -10417, -3276, 4758, 11291, 17862, 17304, 13477, 5534, -6557, -14646, -17538, -14659, -7607, -270, 7069, 11114, 12245, 10705, 3640, -3636, -8906, -12730, -15121, -14252, -9892, -3553, 6940, 13348, 15056, 14049, 8456, 3067, -1147, -2300, -3666, -3249, -2150, -1883, -4417, -7226, -5943, -3993, 1618, 5682, 3613, 706, -153, -430, 2838, 3540, 878, -1849, -4170, -3452, -1087, 5426, 10474, 13272, 12761, 6375, -2717, -12183, -19367, -21760, -19777, -12163, -4330, 3164, 13552, 19514, 22871, 18839, 11252, 1624, -9082, -15658, -19547, -17291, -11005, -1289, 6507, 11792, 13334, 9997, 4223, -2030, -6542, -8524, -10975, -13606, -11048, -5571, 4153, 13741, 16338, 14421, 7971, 529, -4298, -5384, -5260, -4495, -2204, -1642, -540, 178, -1496, -1945, -329, -918, -444, -2885, -3745, -2579, 1097, 5949, 5669, 4505, 1206, 80, 707, 4553, 7816, 9438, 7351, 2666, -1919, -7218, -12203, -14023, -13048, -7844, -2943, 2142, 9737, 11961, 15150, 15006, 10405, 3780, -4363, -11670, -15380, -10907, -2184, 6258, 12214, 12010, 9130, 2423, -6054, -10355, -13279, -13969, -13256, -9836, -1479, 7627, 15723, 21808, 20890, 13599, 5475, -6230, -15513, -18050, -18138, -12382, -4777, 1887, 9050, 12052, 11834, 11127, 6399, 1636, -6134, -12156, -14352, -13409, -6414, 577, 8250, 11252, 10128, 8587, 5104, 5350, 4942, 2027, -221, -3498, -5550, -7702, -9962, -9469, -4961, -1440, 1715, 2348, 2933, 5220, 7961, 10086, 8923, 4713, -2205, -6687, -9484, -5468, -1217, 3286, 6883, 7075, 5789, 336, -3907, -8110, -10029, -11664, -12751, -9177, -3913, 3701, 14068, 21291, 24141, 18502, 5539, -5826, -12583, -15558, -15387, -13155, -9863, -3153, 3672, 9738, 13930, 10536, 5299, 798, -6109, -9374, -11772, -10262, -5308, 2410, 12041, 15464, 15337, 10234, 3635, -3097, -7243, -10591, -12045, -10035, -8557, -2335, 4756, 8595, 8492, 7510, 3971, 346, -2809, -7208, -7577, -5505, -1632, 1311, 2485, 3626, 6576, 8063, 8859, 8353, 3005, -2389, -8910, -11446, -9163, -8576, -7955, -8124, -7461, -3791, 2037, 9993, 14396, 16418, 16129, 11319, 3799, -5901, -11668, -14601, -14821, -10166, -5290, 741, 6525, 9330, 10982, 8782, 1627, -3745, -10624, -14505, -12071, -7992, 202, 8074, 14925, 18784, 18324, 12849, 4109, -5775, -13583, -17411, -18860, -14896, -9748, -1682, 7919, 14510, 18104, 14074, 7081, -1604, -9404, -11172, -9914, -7739, -4190, 313, 3601, 7992, 9266, 8140, 6387, 1592, -3518, -7325, -10273, -10178, -6157, -1580, 1511, 3073, 1508, -747, 231, 2475, 3709, 2595, 1872, 2222, 3950, 5597, 3197, 589, -1789, -4175, -3784, -3218, -2378, -2084, -1573, -1571, -1982, -1509, -4495, -6821, -5903, -2355, 4856, 11410, 15560, 16169, 11917, 8508, 3498, -5114, -12970, -18691, -21430, -16715, -11280, -1589, 12074, 18330, 21987, 16115, 5113, -3904, -11626, -15135, -13110, -8906, -4933, 2171, 8799, 15694, 18523, 13490, 5599, -3438, -13035, -18450, -18671, -14159, -5062, 2666, 8819, 12717, 11226, 8883, 5675, 958, -2728, -7396, -9666, -9349, -5183, 3799, 8543, 9181, 7793, 3848, 916, -2031, -6417, -6809, -4425, -1605, 360, -301, -4042, -4430, -2486, 667, 6577, 7542, 7051, 5863, 5471, 7757, 9026, 3673, -4781, -10846, -12742, -12385, -9281, -2857, 4086, 9849, 9984, 6754, 515, -3701, -5584, -5468, -1305, 1817, 3275, 5608, 10077, 14053, 14142, 7697, -4180, -12810, -19428, -21746, -15777, -8257, 1821, 11459, 15606, 16226, 13065, 6720, 443, -5444, -8084, -11229, -13756, -11708, -3797, 10234, 18412, 21722, 16862, 6341, -2127, -10481, -13812, -12700, -11911, -10937, -8206, -2738, 4974, 10412, 13591, 13517, 10462, 4524, -2389, -9413, -10791, -6156, -265, 3066, 4332, 3139, -1446, -2761, -1436, 1566, 903, -2252, -6049, -7943, -6714, -2810, -799, 927, 3436, 5048, 7881, 7770, 6320, 8183, 8141, 3066, -958, -9221, -17476, -20504, -19148, -11275, -753, 6201, 9803, 11382, 11461, 11072, 7654, 3742, -2848, -10750, -13665, -13217, -6984, 2647, 11298, 16198, 14359, 8857, 89, -9133, -14123, -12445, -9559, -7737, -5281, -1447, 5820, 13115, 17237, 14163, 7787, -1324, -9004, -13363, -14409, -9211, -2827, 6074, 9744, 11589, 12209, 7247, 2441, -2722, -7836, -11640, -15242, -15654, -10555, -3123, 7502, 14540, 17121, 15372, 8587, 3560, -991, -2368, -2836, -4683, -6272, -7798, -7846, -7382, -3714, 1023, 5180, 5650, 1590, -1847, -3724, -2447, 740, 2148, 2125, 636, -1006, 539, 3775, 9439, 11820, 9641, 3965, -3672, -9981, -16004, -18107, -15796, -11172, -5395, 1187, 7081, 14995, 19011, 19730, 17216, 7202, -3373, -12180, -18746, -19522, -14622, -6191, 4623, 11911, 16872, 15330, 10895, 5381, -1813, -6522, -11810, -15395, -16761, -14939, -5464, 6270, 15679, 20437, 17368, 12399, 4556, -2720, -4339, -6095, -7597, -6458, -5863, -2841, 1843, 3711, 5109, 5049, 1395, -3337, -8934, -11728, -9244, -4574, 1118, 5992, 8488, 9204, 9704, 11141, 11176, 7154, 102, -7887, -11552, -13148, -11830, -11955, -9330, -2683, -17, 3898, 5777, 6805, 8011, 9497, 9183, 7212, 2198, -6335, -11277, -11679, -5602, 188, 5353, 8714, 7345, 6674, 2864, -3768, -7444, -9375, -11381, -9855, -8281, -3479, 3909, 12570, 20302, 21060, 14836, 3116, -6003, -12473, -15519, -15167, -11750, -6561, 2289, 9450, 15020, 19118, 15196, 6877, -3037, -11369, -16679, -18193, -17474, -12125, -1469, 10299, 18736, 22427, 19553, 15837, 9742, 2269, -4039, -11268, -15548, -18960, -15306, -8629, -2055, 4598, 6188, 5790, 4645, 2750, 606, -283, 249, 2582, 3879, 4585, 4763, 3824, 4407, 2103, 384, -1702, -6266, -9969, -9461, -6891, -4305, -957, -2321, -2379, -2316, -1297, 3551, 8502, 11177, 11144, 8935, 3800, 510, -4637, -8011, -9832, -11635, -9624, -6318, -1305, 4849, 9575, 11043, 9746, 3329, -5021, -11545, -15548, -14407, -8733, -1169, 6893, 14500, 18457, 18454, 13930, 3947, -5942, -14072, -19125, -18734, -15444, -8384, 1914, 11356, 17235, 18060, 12259, 2378, -6986, -13340, -14099, -12155, -9789, -3130, 5849, 16352, 23560, 23404, 17584, 5698, -6685, -14951, -19629, -21057, -19366, -14248, -6396, 1479, 9990, 12914, 13150, 12031, 11168, 9150, 3784, -949, -5313, -4332, -5827, -4435, -3111, -5274, -5321, -3916, -1530, 2212, 4562, 2549, 614, -2161, -1805, -3466, -5323, -3863, -2311, 1574, 5633, 8863, 11662, 13173, 10072, 4254, -1902, -11539, -19284, -21865, -18471, -8943, -259, 8701, 14891, 16283, 15365, 8253, 397, -5166, -9547, -13058, -13401, -11514, -4466, 8828, 17119, 22119, 18973, 8631, -2046, -11455, -16491, -16587, -14266, -8582, -3236, 642, 5706, 10451, 13679, 10926, 6691, -430, -5833, -7285, -6468, -1970, 4425, 9194, 9991, 6538, 2280, 998, -3040, -5937, -9037, -12671, -13508, -12133, -5048, 3819, 11555, 16789, 16971, 14003, 8874, 2502, -882, -3035, -4723, -4419, -7294, -8906, -8496, -8724, -3167, 3692, 9185, 11481, 8000, 4161, 864, -887, -256, -2117, -6070, -8037, -9236, -7143, 520, 8162, 13902, 18040, 14356, 6058, -1477, -11054, -15227, -16499, -16318, -12177, -8479, -857, 8007, 15591, 19499, 18213, 11556, 1112, -7940, -14703, -15337, -9621, -2012, 5625, 10007, 10580, 9719, 5168, -271, -4638, -10201, -13375, -15455, -16335, -12932, -5043, 6783, 17269, 23583, 19122, 11117, 3722, -3638, -4081, -4673, -6984, -7758, -6477, -4830, -1750, 18, 1788, 2588, 594, -1848, -3618, -4084, -2566, 3012, 8343, 9200, 5542, 2043, -1098, -72, 417, -352, -366, -2371, -2676, -2386, -2970, -3540, -3239, -2916, -3083, -2420, -357, 2130, 5252, 8869, 10986, 6895, -1713, -9323, -13811, -13372, -6056, 1979, 9698, 16482, 17503, 14228, 6840, -1866, -9847, -16368, -21475, -25294, -21995, -13158, 574, 16170, 26205, 30853, 23098, 11750, 1181, -6711, -9599, -13483, -13646, -13328, -8892, -1365, 4848, 11161, 11538, 6136, -1926, -10454, -15533, -14934, -10354, -1956, 7124, 14966, 18470, 16957, 12173, 7502, 3910, -3856, -9856, -15270, -15378, -10369, -7213, -2476, 782, 2873, 1968, 926, 2451, 3425, 5950, 9204, 10014, 9972, 4644, -3328, -10884, -13967, -10746, -5954, -608, 3713, 8909, 10401, 9995, 6079, 1382, -3839, -12641, -18251, -18093, -13183, -2972, 8416, 17377, 20893, 15298, 7624, -874, -5817, -7704, -9115, -8637, -5558, 383, 4799, 9385, 11953, 8063, 1882, -7800, -17729, -19439, -17951, -11113, 1075, 11771, 21438, 24241, 22514, 17174, 10011, 2101, -7860, -16025, -21983, -20656, -15404, -7367, 3775, 9437, 10748, 10422, 6080, 1704, -2248, -4223, -2228, 1631, 5133, 6971, 5477, 2379, 1673, 768, -16, -1456, -6664, -7780, -5535, -3357, 543, 46, -2465, -5293, -6196, -5401, -506, 6888, 12793, 17054, 15308, 10106, 1740, -6861, -11201, -15051, -14902, -10955, -6758, 1333, 9325, 15285, 16079, 10622, 1607, -7576, -14953, -19057, -18847, -13344, -5921, 4561, 15593, 21525, 25327, 21517, 14689, 5211, -5979, -15347, -22045, -25231, -23043, -12950, -779, 9744, 12995, 10687, 7911, 3718, 937, -1598, -2235, -1477, 917, 3413, 6854, 11128, 9817, 5926, -909, -6480, -11643, -14288, -15273, -11021, -2937, 2610, 5599, 4413, 2307, 1891, 5357, 7672, 8398, 6117, 4273, 1611, 1372, 953, -4802, -9208, -11847, -12633, -9195, -3366, 2555, 10366, 12947, 12198, 6483, -2875, -8301, -12370, -11878, -7321, -1069, 5221, 11778, 15360, 17168, 16536, 8897, -1327, -11300, -20660, -23931, -18370, -9578, -252, 9737, 16143, 18064, 13755, 3087, -4852, -11582, -14641, -14815, -12643, -7253, 3095, 16954, 25529, 28997, 21134, 6927, -6776, -18771, -24250, -26520, -25145, -18091, -7681, 2948, 10811, 18313, 19253, 18254, 14107, 6838, 1227, -5998, -9726, -7591, -3394, 910, 2791, -1741, -5577, -7233, -4964, -1284, 2733, 2889, 583, 489, -606, 108, -480, -1047, 108, 1961, 5778, 7434, 7757, 9258, 7319, 5526, 905, -7985, -16619, -20164, -17869, -9352, 2423, 9337, 13920, 13667, 9991, 7232, 2063, -3940, -9150, -12206, -12753, -9529, -2239, 7500, 18764, 22958, 19905, 10723, -3269, -13728, -20314, -23499, -19642, -11919, -3666, 4526, 10295, 15663, 17814, 12437, 5244, -2451, -10468, -11662, -8642, -2049, 5766, 11176, 13251, 9720, 5111, -3311, -11508, -14547, -15092, -12596, -10384, -6866, -1218, 6605, 14505, 18425, 17711, 11379, 4204, -1469, -4388, -4456, -5880, -5602, -6376, -8226, -6584, -5071, -1056, 2886, 3830, 5664, 5668, 3502, 1845, 2029, 3663, 2273, -2189, -5964, -8998, -5505, 1778, 9233, 14174, 13582, 10583, 2964, -3426, -8636, -13354, -15786, -15663, -12023, -5812, 1650, 11818, 20126, 22334, 18459, 8664, -2057, -12003, -17297, -16435, -8497, 508, 8085, 12728, 13915, 11200, 5494, -1060, -7421, -13172, -17474, -18284, -16415, -8700, 1119, 10724, 19159, 20813, 16398, 10116, 2647, -2197, -5278, -8974, -11959, -11078, -8312, -5451, -2590, -1545, 870, 191, 429, -777, -2433, -1545, -1836, 2565, 6317, 6091, 2958, 114, -614, -1089, 55, 605, -477, -2670, -2829, -1728, -1380, -1974, -4140, -3984, -3872, -3914, -1486, 947, 3980, 8732, 11487, 9225, 4719, -3020, -8700, -9590, -6816, -604, 3487, 7363, 10836, 10523, 8726, 3040, -6165, -12336, -17269, -18405, -16566, -9436, 1102, 10005, 21079, 24392, 22514, 13970, 1730, -6589, -11972, -13997, -13345, -11664, -8081, -214, 7321, 13872, 15213, 7964, -2644, -10866, -16040, -16404, -13712, -7095, 2750, 12923, 19232, 21179, 18086, 12173, 5811, -2178, -10183, -17130, -18028, -18141, -13501, -4752, 4891, 11817, 12137, 9730, 5551, 2847, -234, -2172, -2610, -1300, 1377, 2018, 1267, -513, -276, 174, 263, 1071, 762, -1207, -1281, 1, 971, 441, -4245, -8561, -10309, -7913, -2387, 3061, 7895, 10698, 12703, 9002, 4218, 489, -4496, -5651, -7721, -6784, -2901, -868, 1999, 6374, 8593, 6826, 598, -9066, -14976, -15331, -12515, -5044, 4041, 11408, 17441, 19894, 19222, 17077, 9747, -2314, -12556, -19122, -21415, -18920, -12741, -4651, 6550, 12279, 13795, 12097, 5749, -1353, -5762, -7355, -4956, -2033, -1331, 841, 4766, 12522, 16645, 13587, 3529, -7260, -14833, -17609, -17040, -12182, -5870, -1572, 3213, 6644, 10542, 12534, 11113, 9027, 5489, 208, -5840, -11218, -13123, -8088, -2365, 1195, 5210, 5905, 6230, 6377, 5355, 2321, -193, -5179, -9182, -10399, -9198, -6061, -3830, -85, 4118, 7772, 10041, 10472, 9040, 9147, 6712, 4231, 952, -7958, -14825, -16838, -15635, -8199, -608, 2907, 6168, 5931, 5093, 5037, 1660, -667, -2381, -4265, -2833, -407, 2522, 6914, 11166, 11130, 8459, 1378, -8365, -14054, -16924, -15738, -10501, -5034, -172, 4985, 10253, 14758, 16465, 12767, 5585, -3051, -9761, -12361, -12756, -7627, -208, 6904, 8870, 9331, 8890, 2003, -1870, -4349, -7855, -9225, -8954, -9875, -7628, -1409, 6985, 14734, 16152, 12610, 6319, -2431, -6850, -6839, -5911, -5636, -4833, -2108, 961, 4397, 4350, 5365, 4420, 1203, -2397, -7904, -12647, -13395, -8518, -2537, 4197, 7613, 7330, 7388, 7548, 10479, 11433, 6597, 557, -5488, -9668, -11504, -13415, -12525, -10556, -6222, -123, 3577, 7135, 8912, 12710, 13268, 10806, 5861, -3138, -8602, -12499, -11084, -2303, 2983, 7020, 8714, 6637, 5016, 775, -4176, -7554, -10376, -13288, -12023, -6366, 1171, 10793, 18346, 19829, 16689, 7872, -2893, -9700, -12346, -11875, -9540, -7283, -2933, 2581, 8795, 14032, 12838, 9080, -414, -9960, -14766, -16009, -12993, -7237, 1768, 8831, 14985, 16013, 10834, 6633, 2104, -1807, -5366, -8172, -11370, -12310, -7046, -585, 7232, 11655, 9234, 3110, -4585, -8817, -9848, -10023, -6552, -659, 3284, 6720, 9041, 11726, 13060, 12407, 7888, 1764, -4891, -12427, -15337, -14040, -9028, -5450, -2946, -2085, -1044, 2583, 7955, 11275, 11483, 10859, 7059, 3347, -1840, -5882, -7178, -9209, -7801, -5718, -3165, 914, 5118, 9419, 9877, 8436, 2095, -6095, -10570, -13343, -10472, -4814, 887, 8025, 12608, 14651, 14445, 10579, 3505, -2751, -8179, -13192, -14620, -12906, -7052, 2758, 10787, 15096, 12676, 4993, -1588, -7154, -9066, -8483, -7328, -4863, -2944, 892, 8472, 14738, 17685, 14446, 7535, -2169, -10127, -14475, -16574, -13407, -10366, -4084, 1700, 5173, 7768, 7456, 5573, 3471, 1286, -870, -3879, -4615, -2442, 2785, 6635, 6650, 5845, 2152, -1266, -4558, -7745, -9708, -8487, -7131, -5937, -5484, -3727, 1190, 6260, 9948, 12589, 13919, 9617, 4013, 192, -1516, -2937, -4340, -10088, -14647, -13012, -9060, -186, 8899, 13232, 13734, 11459, 6834, 975, -6417, -10079, -10812, -10098, -7926, -4556, 553, 9370, 17741, 18921, 16401, 6107, -5700, -12125, -17804, -17144, -11946, -7593, -863, 4679, 9909, 13173, 12359, 7768, 1385, -4755, -8728, -9988, -9088, -3768, 2171, 9249, 13408, 14250, 8877, 638, -4804, -10005, -11337, -11118, -10121, -9632, -7233, -2334, 4099, 10506, 10917, 9483, 6647, 3374, 2250, 758, -440, -1838, -1275, -2858, -6528, -7731, -8790, -6437, -3335, 138, 1836, 1303, 1494, 2666, 5734, 5002, 1722, -1043, -3203, -3493, -64, 4013, 5227, 6168, 5127, -172, -4903, -9408, -12666, -12900, -9749, -2103, 4141, 8912, 12589, 11202, 9265, 7039, 217, -5061, -12201, -16752, -15447, -9121, 3455, 12371, 19277, 21033, 17010, 9692, -924, -9729, -14851, -17886, -16300, -13567, -8968, 389, 8639, 16792, 19533, 17628, 11807, 3214, -4785, -9714, -8135, -6546, -4991, -3888, -3209, 1162, 4138, 5131, 5391, 1916, -2043, -5995, -7739, -7781, -6104, -876, 4364, 9297, 10730, 8531, 5459, 2837, 3514, 2270, -2575, -7534, -10991, -11610, -10084, -6400, -371, 2557, 3112, 4398, 6161, 7349, 4308, 2865, 1710, 1316, 560, -3393, -6183, -5181, -866, 3746, 6188, 4972, 3158, 719, -2577, -3087, -2031, -2790, -3898, -5265, -3631, -144, 5283, 10561, 11140, 9274, 5204, -1242, -7079, -9108, -7351, -5052, -2167, 2654, 5610, 8148, 8744, 6580, 4709, 358, -6658, -12308, -16360, -16395, -10307, -2027, 5719, 12704, 17130, 17066, 13189, 6760, 2135, -3755, -9717, -13818, -15634, -12860, -9850, -2558, 4701, 7737, 10130, 7541, 2077, -1353, -3944, -4769, -2032, -812, -822, 1230, 2832, 8225, 11829, 9974, 7110, -151, -6946, -10839, -15392, -14498, -10200, -6500, -1373, 2246, 6262, 9684, 12017, 12262, 10033, 5453, -2030, -7775, -9242, -8047, -5127, -1345, -82, 173, 1000, -122, -1328, 520, 1239, 2249, 1861, -943, -1766, -4312, -3992, -2218, 283, 3510, 3478, 2614, 2109, 4795, 5653, 6311, 3795, -1795, -5063, -8710, -9410, -6979, -3667, 301, 3051, 2290, 2303, 2059, 129, 772, 1371, -998, -2152, -2323, -1258, 5222, 12121, 12645, 8614, 825, -6295, -10047, -12608, -12725, -12041, -10030, -6657, -1482, 5226, 11550, 13994, 12775, 10356, 5927, -14, -5556, -8191, -7785, -4735, -723, 3692, 5512, 5554, 3789, -878, -3922, -5698, -7824, -8309, -9657, -7368, -1597, 3990, 11244, 14269, 13391, 9778, 5353, 357, -3451, -7973, -10129, -9008, -8219, -5414, -2676, 1154, 5861, 9370, 9187, 5348, 1145, -3158, -5603, -3314, -746, -691, -2229, -1839, -1360, 2204, 6411, 8204, 8395, 5521, 1600, -2643, -6178, -8656, -8813, -6816, -4879, -4511, -3082, -1274, 1348, 5588, 9613, 10401, 8071, 3960, 332, -2546, -3232, -3618, -3975, -3130, -1928, 516, 2145, 2495, 1244, -1251, -4300, -6142, -6816, -5784, -3180, -1184, 1784, 8631, 14021, 16202, 12862, 4494, -769, -4741, -7907, -9899, -12438, -13116, -10555, -5617, 694, 8243, 11882, 10601, 7903, 2504, -2092, -5216, -7224, -5816, -3174, 102, 3198, 6307, 8909, 8189, 6685, 2413, -2809, -6447, -10214, -10593, -8298, -3813, 1324, 4219, 5422, 6060, 5740, 4357, 3115, 422, -3030, -4518, -3324, -1740, 425, 2226, 2527, 2784, 2002, 1613, 836, -999, -3214, -3083, -1816, -313, 1098, -853, -2208, -3017, -2476, 196, 3331, 5219, 6215, 6252, 5421, 6311, 4279, 119, -3246, -6353, -7540, -8929, -9317, -6682, -2882, 3431, 7211, 8105, 6854, 3460, 301, -1986, -2862, -3801, -3566, -3161, -1442, 2014, 5716, 7538, 6466, 2082, -2652, -5878, -8420, -9134, -8410, -4780, -188, 4638, 8760, 10305, 8328, 3768, 475, -1321, -2804, -4435, -6195, -6380, -5062, -1021, 4009, 7451, 8793, 7311, 3584, -1022, -3997, -6679, -6642, -5297, -3542, -464, 2789, 5068, 5473, 5617, 4383, 2590, -356, -3090, -6320, -7187, -4728, -1325, 909, 1560, 1180, 1311, 2574, 2801, 2431, -511, -3175, -4460, -4419, -3335, -1700, -760, -1354, -1202, 422, 2534, 4447, 4822, 4212, 4489, 3770, 1976, -646, -4324, -6825, -8325, -9323, -8245, -5431, -976, 3041, 7304, 9333, 9513, 7934, 3529, -37, -3594, -5305, -5598, -5914, -5215, -3017, -299, 2352, 4103, 3935, 3130, 1076, -1342, -2594, -4129, -4474, -3264, -1463, 1633, 4744, 6325, 6768, 5397, 3192, 508, -2692, -5043, -7498, -7313, -5153, -2670, 918, 4617, 7056, 7453, 6509, 3717, -80, -3592, -5639, -6274, -5234, -3191, -1094, 1908, 4393, 6158, 6910, 5953, 3090, -790, -4139, -6306, -5873, -4948, -2556, 750, 2923, 4903, 5125, 4117, 2003, -538, -2079, -3537, -3998, -2928, -1520, 1241, 3383, 4267, 4146, 2760, 1791, 1068, 227, -1104, -3005, -5763, -6483, -5015, -2803, 431, 2051, 2668, 2340, 1889, 2725, 3314, 4020, 4440, 3048, 1242, 440, -797, -2085, -3976, -5979, -5994, -5555, -3635, -603, 2243, 5170, 6535, 6613, 6187, 3458, -536, -2864, -4465, -4871, -4429, -3675, -2137, -494, 1198, 2862, 3564, 2711, 1308, -368, -2157, -2879, -3303, -2582, -1267, 24, 1986, 2311, 2687, 2644, 1401, -519, -2312, -2824, -2299, -1776, -652, 535, 910, 1605, 1414, 1331, 1029, 573, -621, -1483, -2093, -2435, -1581, -1327, -812, -425, 541, 1845, 2186, 2677, 2022, 1306, 549, -689, -1181, -1579, -1175, -455, 541, 587, 676, 1148, 1577, 1432, 1053, 690, 79, -532, -1503, -1988, -1789, -278, 1222, 2888, 3361, 3259, 2973, 1545, 289, -1256, -2619, -3402, -3647, -3365, -2638, -1762, -747, 1081, 2265, 3284, 3795, 3645, 3466, 2033, 801, -443, -1625, -2676, -4108, -4368, -3805, -3141, -1994, -666, 1152, 2952, 3916, 3026, 2461, 1918, 420, -1343, -3176, -3617, -3545, -2646, -1000, 757, 2082, 2239, 1667, 1172, 505, -98, -734, -711, -174, -267, -256, -193, -361, -435, -355, -348, -490, -809, -1508, -1168, -628, -536, 442, 953, 1683, 2417, 1907, 987, 433, 202, -44, -465, -1198, -1953, -1608, -1566, -2018, -1247, -581, -567, 96, 1193, 2008, 2243, 1975, 2047, 1668, 904, 90, -970, -1421, -1437, -1642, -1405, -822, 114, 575, 601, 639, 352, -44, -1083, -1562, -1218, -547, 368, 1743, 2421, 2744, 2846, 2752, 1747, 114, -1024, -1902, -2397, -2653, -2929, -2998, -2284, -639, 840, 1678, 2252, 1843, 1888, 1502, 677, -384, -1400, -1822, -1677, -1361, -1269, -735, -177, 776, 1214, 1261, 1486, 1398, 1141, 890, 263, 20, -283, -1002, -1395, -1337, -1447, -1396, -957, -583, 60, 641, 857, 1085, 1806, 2039, 2280, 2271, 1680, 964, 293, -212, -712, -952, -1594, -2265, -1969, -1411, -935, -352, 24, 233, 612, 1120, 1518, 1956, 1599, 1075, 439, -223, -397, -647, -645, -751, -791, -904, -1100, -1187, -1119, -1076, -944, -506, -487, -659, -205, 714, 1418, 1832, 1770, 1815, 1590, 1110, 928, 485, -494, -1268, -2040, -2408, -2424, -1991, -1095, -669, -188, 716, 1200, 1459, 1960, 1422, 556, -50, -573, -653, -336, 196, 910, 1094, 893, 548, 410, 518, 516, 341, 263, 8, -112, -280, -299, 219, 376, 195, -130, -316, -356, -334, -380, 43, 279, 219, 345, 528, 415, -79, -390, -266, 81, 313, 251, -120, -72, 79, -641, -1530, -1678, -1380, -800, -317, 258, 741, 1009, 1269, 1723, 2063, 1280, 182, -393, -512, -329, -497, -574, -362, -368, -441, -751, -673, -550, -690, -586, -424, -90, 19, -4, 203, 669, 898, 843, 418, -54, -42, -270, -390, -364, -182, -259, -841, -1502, -1587, -1162, -461, 232, -188, -896, -941, 166, 1420, 2093, 2053, 1146, 254, -162, -184, -84, -266, -695, -796, -723, -641, -368, -190, -364, -482, -241, 166, 752, 1326, 1165, 656, 261, 345, 345, 121, -185, -380, -209, 106, 409, 697, 712, 163, -361, -893, -943, -795, -627, -296, -134, -66, 182, 626, 991, 1178, 813, 153, -191, -289, -233, -10, 229, 312, 167, 159, 186, 128, -135, -626, -893, -757, -430, -44, 244, 594, 1179, 1359, 1088, 835, 443, 233, -28, -187, -355, -422, -287, -136, -224, -635, -1033, -1017, -297, 104, 346, 342, 127, 292, 533, 623, 585, 367, 162, 53, -14, -98, -146, -280, -424, -241, -151, -211, -314, -331, -472, -555, -202, -9, 56, 147, 72, -131, -79, 127, 284, 118, -48, -332, -575, -513, -199, 277, 283, -52, -254, -392, -340, -131, 249, 411, 438, 331, 266, 381, 472, 451, 322, 253, 87, -18, 3, 31, 4, 20, 91, 52, -28, -180, -324, -360, -123, 113, 152, -89, -382, -451, -152, -7, -15, 16, -156, -351, -393, -355, -203, -114, 86, 261, 191, 67, -127, -235, -106, 114, 181, 31, 21, 128, 185, 130, 100, 201, 37, -288, -548, -442, -190, -108, 5, 179, 405, 328, 134, 122, 251, 332, 180, -61, -11, 145, 95, -206, -321, -254, -313, -297, -360, -331, -203, -166, -138, -200, -284, -311, -84, 182, 307, 329, 337, 227, 62, -286, -422, -408, -381, -258, -148, -112, -127, -51, 55, 84, 83, 140, 147, 122, 134, 213, 308, 389, 363, 279, 153, 24, -112, -177, -147, -44, 60, 15, -83, -208, -233, -164, -79, 17, 28, 22, 16, 28, 48, 62, 204, 261, 216, 104, 27, 17, 92, 212, 186, 101, 110, 100, 199, 214, 150, 111, 21, 52, 224, 303, 273, 192, 203, 187, 154, 126, 144, 66, -58, -142, -89, 12, 74, 105, 104, 190, 265, 252, 191, 53, -17, 53, 95, 134, 96, 13, -122, -178, -186, -139, -187, -210, -128, -102, -99, -62, -42, -42, -31, -84, -19, 41, 61, 58, 24, -59, -108, -137, -145, -103, -69, -46, 7, 31, 8, -67, -68, 15, 94, 78, 41, 80, 153, 194, 199, 229, 233, 198, 175, 149, 172, 238, 289, 228, 198, 134, 33, 3, 20, 102, 183, 168, 206, 144, 83, 14, 20, 74, 90, 51, 44, 102, 173, 147, 73, 27, -22, -119, -147, -157, -93, -110, -152, -143, -109, -29, 40, 65, 39, -11, -67, -5, -8, -2, 6, -94, -183, -191, -181, -161, -208, -202, -251, -208, -180, -128, -68, -138, -92, -34, -2, -10, -4, -31, -108, -82, 19, 64, 90, 55, -6, -6, 59, 52, -60, -156, -159, -89, -60, -149, -307, -184, -1, -57, 45, 2, -46, -14, -197, -354, -254, -104, -87, 98, 52, -326, -477, -401, -265, -172, -215, -162, -31, 30, 195, 194, 40, 57, 59, 104, 158, 56, -4, -7, -16, 42, 80, 211, 164, 8, 201, 340, 408, 420, 405, 288, 211, 45, -245, -292, -240, -140, -56, 3, 78, -8, 22, 73, 165, 219, 133, 90, 62, -120, -345, -354, -254, -111, -123, -203, -242, -265, -100, 138, 155, 111, -101, -281, -135, -24, 77, 155, 138, 177, 195, 292, 286, 215, 47, -176, -65, 109, 203, 164, 13, -132, -233, -166, -83, -142, -61, -74, -11, 171, 173, 111, -22, -30, 73, 225, 243, 211, 223, 74, -11, -21, -71, -151, -116, -63, -34, -49, -155, -132, 0, 167, 195, 78, 67, 46, 150, 242, 175, 6, -65, -39, -43, -74, -145, -73, 18, 7, 49, 1, -62, -50, -129, -102, -35, -5, 101, 243, 207, 82, 95, 116, 147, 89, 59, 65, 43, 63, 69, 126, 199, 153, 139, 135, 266, 311, 338, 342, 244, 152, 119, 154, 165, 173, 174, 138, 85, 129, 120, 54, 74, 31, 33, 130, 117, 101, 110, 53, 50, -1, -58, -121, -113, -135, -112, -67, 5, -38, -196, -229, -222, -52, 55, 43, -19, -165, -227, -198, -117, -8, 8, -56, -138, -140, -178, -187, -142, -158, -122, -136, -219, -246, -152, -28, 106, 181, 134, 37, -25, -72, -125, -110, -96, -117, -117, -208, -93, 1, 27, -9, -19, 40, 38, 61, 32, 14, -5, 24, 62, 33, -18, -7, 33, 28, -4, -38, -98, -65, -80, -42, -1, 19, 70, 17, -101, -202, -110, 14, 61, 42, -44, -15, 61, 194, 266, 202, 125, 188, 196, 138, 45, -66, -72, -52, -39, -9, 44, -54, -140, -138, 11, 181, 259, 223, 108, -38, -78, -76, 7, -21, -69, -119, -124, -65, -63, -107, -133, -103, -112, -179, -232, -255, -229, -193, -124, -134, -114, -90, -46, 36, 106, 149, 81, -25, -102, -144, -132, -69, -32, -11, -37, -27, 33, 128, 132, 105, 118, 106, 131, 182, 147, 80, 19, -89, -83, -47, 26, 114, 145, 158, 224, 235, 207, 168, 146, 116, 91, 1, -5, -35, -91, -25, 76, 186, 229, 213, 127, 117, 120, 117, 133, 45, 37, 21, -8, 4, -3, -6, 82, 111, 103, 120, 151, 140, 130, 111, 52, -15, 25, 46, 73, 26, 4, -38, -23, -14, 11, -39, -77, -110, -106, -54, -56, -6, -10, -43, -51, -37, -43, 4, 116, 77, -2, -3, 32, 77, 27, -120, -151, -153, -112, -29, 53, 183, 191, 175, 139, -28, -84, -147, -153, -180, -250, -319, -249, -179, -89, 116, 174, 218, 282, 315, 298, 293, 223, -12, -281, -390, -423, -336, -235, -8, 241, 400, 463, 425, 333, 260, 165, 1, -99, -112, -88, -17, 34, 38, -11, -41, -115, -178, -151, -63, -92, -75, -59, 7, 64, 28, -106, -284, -423, -487, -361, -259, -45, 106, 145, 228, 187, 156, 113, 41, 23, 66, 229, 321, 260, 162, 52, -92, -155, -183, -190, -245, -249, -201, -121, 12, 89, 9, -216, -400, -490, -479, -367, -172, 44, 49, -72, -124, -134, -186, -156, -29, 91, 108, 79, 61, 32, -34, -59, 50, 210, 343, 464, 429, 319, 195, 177, 123, 34, -73, -133, -103, 64, 261, 417, 358, 193, 26, -45, -21, 63, 70, 104, 163, 236, 272, 310, 271, 133, 64, 2, 14, 40, -71, -158, -276, -303, -197, -118, -75, -57, -32, -25, 1, 64, 97, 10, -116, -188, -239, -159, -155, -164, -181, -34, 37, 23, 16, 15, -41, -123, -165, -131, 24, 89, 79, 51, 38, 24, -20, -41, -42, 20, 17, -111, -104, 15, 80, 172, 234, 208, 115, 71, -8, 21, 93, 107, 146, 195, 249, 250, 165, 55, -6, -10, 36, 69, 57, 71, 60, 77, 116, 139, 145, 191, 207, 142, 124, 99, 9, -10, 3, 4, -13, -40, -36, -21, -23, 82, 124, 97, 43, 17, 11, 30, -20, -98, -162, -174, -164, -111, -77, -120, -128, -78, 2, 68, 60, 60, 91, 122, 69, 28, -34, -77, -111, -54, -41, -64, -140, -145, -59, 69, 92, 106, 75, 8, -4, -33, -19, 17, 48, 40, -20, -34, -88, -64, -75, -44, -26, 11, 12, 53, 50, 71, 64, -21, -58, -71, -41, -9, -24, -57, -72, -19, 41, 65, 43, 21, -3, -30, -51, -52, -53, -38, -20, -21, -28, 4, -11, -9, -56, -78, -67, -59, -70, -91, -99, -93, -85, -27, -3, -3, -64, -72, -66, -58, -56, -27, 47, 47, 7, 23, 35, -10, -112, -134, -147, -110, -108, -42, -52, -59, 6, 51, 26, -20, -49, -22, -19, -14, 13, 12, 19, 46, 71, 87, 68, 94, 121, 141, 89, 5, -23, -47, -63, -28, 12, 87, 130, 174, 142, 155, 132, 81, 57, 52, 28, 16, -16, -17, -60, -65, -95, -80, -13, -14, 2, 3, -7, -29, -31, -31, -64, -141, -200, -172, -103, -33, 12, 0, -9, 35, 67, 50, 26, 28, 39, 63, 52, 67, 40, 9, 1, 65, 140, 202, 229, 214, 133, 113, 104, 72, 59, 54, 65, 58, 54, 90, 98, 138, 139, 158, 133, 112, 114, 147, 112, 62, 28, 70, 50, 38, -51, -70, -97, -54, -14, 76, 79, 46, 31, 5, 2, 32, 44, 23, 5, -31, -22, -28, -25, 15, 9, 38, 72, 88, 25, 10, 38, 53, 60, 19, -43, -56, -39, 17, 55, 56, -11, -59, -74, -26, -14, 49, 58, 62, 56, 38, 5, -3, 7, 19, -18, -47, -61, -59, -26, 47, 84, 83, 25, -14, 23, 7, 15, -27, -70, -105, -82, -73, -83, -98, -84, -101, -104, -117, -129, -87, -94, -20, 3, -9, -30, -63, -24, -10, 35, 65, 15, -20, -82, -61, -97, -75, -19, -31, -28, -33, -38, -1, -30, -20, -33, -18, 32, 43, 50, -17, 14, 1, 17, 9, 16, 79, 71, 89, 30, 103, 88, 69, 23, -20, -48, -62, -52, -10, -11, -45, -76, -82, -67, -58, -61, -79, -68, -45, -12, -5, 8, 31, 1, 11, -31, -11, 1, 12, 20, 42, 39, 15, 25, 32, 68, 84, 84, 41, 1, -33, -33, -15, -20, -30, -24, -32, -1, 47, 98, 49, 17, 0, 28, 28, 23, -17, -29, 17, 13, 44, 53, 97, 58, 40, 21, 27, 20, 7, -20, -16, -28, -26, -25, -45, -25, 0, 39, 39, -13, 14, -4, -6, 14, 46, 57, 73, 110, 51, -20, -59, -70, 3, -3, 38, 12, -2, -33, -11, -14, -26, -80, -90, -75, -32, -50, -3, -15, 1, 16, 53, 58, 78, 58, -2, 5, 24, 9, -26, -58, -15, 0, -18, -11, -16, -17, -53, -15, 46, 55, 72, 45, 37, 21, 80, 84, 82, 85, 96, 62, 25, 18, 10, 8, 48, 62, 77, 63, 99, 86, 61, 55, 100, 142, 111, 120, 87, 68, 48, 29, 16, -15, -36, -66, -98, -94, -58, -63, -28, -1, 14, 12, -5, -2, 38, 18, 42, 55, 13, 13, 2, 42, 79, 78, 77, 75, 79, 77, 72, 82, 86, -5, -59, -73, -24, 42, 59, -13, 8, -1, -14, -24, -60, -61, 38, 40, 42, 12, -21, 27, 0, 57, 54, 56, 60, 50, 44, 49, 75, 42, 40, 25, -12, -64, -56, -51, -85, -19, -4, -45, -22, -79, -113, -111, -57, -12, -73, -75, -82, -60, -64, 2, 101, 24, 54, 19, 36, 1, 63, -1, -79, -68, -69, -67, -113, -132, -105, -68, 32, 55, 92, 24, 0, 4, -19, 7, -30, -60, -85, -74, -42, 22, 105, 64, -17, -97, -63, -9, 59, 59, 17, -47, -20, -16, -25, -48, -5, 49, 115, 167, 155, 100, -5, -57, -86, -87, -73, -104, -124, -150, -106, -65, -29, -13, 38, 27, 47, 27, 28, -13, -14, -31, -65, -80, -79, -90, -77, -14, 86, 124, 129, 114, 118, 113, 155, 117, 22, -56, -130, -204, -264, -261, -239, -167, -100, -36, 77, 161, 238, 276, 350, 398, 344, 272, 148, -34, -170, -329, -384, -416, -392, -356, -267, -154, -37, 68, 176, 258, 346, 342, 300, 167, 77, -5, -38, -65, -101, -115, -113, -76, -45, -6, 24, 62, 67, 23, -44, -88, -112, -128, -101, -25, 59, 133, 229, 347, 454, 482, 467, 352, 242, 94, -77, -216, -301, -315, -313, -207, -132, -49, 62, 136, 222, 284, 264, 190, 56, -51, -94, -45, 6, 73, 71, 43, 44, 103, 184, 278, 289, 205, 73, -38, -178, -252, -296, -334, -341, -321, -236, -108, 29, 116, 201, 237, 263, 288, 305, 307, 292, 248, 154, 9, -126, -261, -322, -359, -353, -405, -416, -457, -396, -267, -118, 94, 305, 532, 651, 667, 607, 428, 256, 0, -158, -315, -383, -435, -395, -295, -165, 0, 115, 126, 93, 40, 12, -2, -5, 7, 1, 10, 94, 165, 269, 338, 382, 299, 136, -65, -239, -341, -371, -401, -347, -274, -106, 14, 136, 180, 164, 112, 101, 59, 50, 39, 5, -36, -70, -86, -79, -88, -72, -75, -79, -50, 45, 180, 197, 158, 50, -82, -178, -250, -242, -286, -321, -355, -248, -71, 189, 450, 641, 791, 804, 610, 325, -56, -433, -757, -936, -956, -874, -649, -402, -89, 253, 524, 691, 712, 584, 313, 33, -124, -176, -152, -145, -148, -169, -97, 1, 100, 119, 49, -103, -304, -455, -520, -425, -249, -53, 125, 279, 428, 576, 693, 670, 531, 346, 101, -157, -349, -503, -596, -546, -435, -258, -96, 46, 95, 113, 139, 181, 231, 182, 58, -15, -20, 85, 196, 275, 160, -65, -300, -368, -353, -184, 11, 120, 275, 350, 343, 271, 47, -205, -478, -593, -645, -566, -384, -235, 37, 325, 607, 879, 908, 770, 491, 185, -172, -369, -445, -425, -347, -254, -136, -49, 6, -29, -160, -219, -174, -16, 162, 292, 446, 548, 750, 955, 934, 623, 153, -455, -838, -996, -967, -846, -620, -281, 9, 385, 664, 820, 843, 661, 339, 15, -251, -365, -323, -249, -144, 77, 321, 547, 682, 529, 175, -226, -581, -751, -822, -775, -601, -317, 25, 459, 803, 1023, 1031, 770, 313, -166, -554, -680, -758, -715, -504, -243, 120, 514, 755, 820, 648, 419, 26, -335, -646, -868, -906, -820, -558, -204, 197, 445, 604, 685, 619, 494, 403, 331, 206, 10, -125, -218, -312, -407, -568, -615, -652, -608, -386, -129, 50, 234, 416, 545, 691, 722, 593, 443, 241, -50, -281, -452, -471, -375, -260, -210, -156, -132, -200, -270, -315, -295, -220, -12, 220, 357, 483, 596, 608, 571, 392, 38, -234, -411, -604, -621, -573, -334, 36, 349, 494, 480, 247, 5, -217, -346, -399, -340, -209, -166, -103, -1, 290, 503, 681, 611, 213, -161, -448, -561, -403, -328, -224, -110, 297, 1063, 1651, 1967, 890, -1108, -2988, -4760, -5483, -5295, -4244, -1956, 1007, 6015, 10645, 12955, 11279, 6893, 1417, -4474, -8404, -10894, -11430, -11277, -10847, -7939, -3023, 2462, 7478, 9581, 8972, 7397, 4934, 1659, -973, -3067, -3802, -2137, -178, 1129, 2582, 2708, 1209, -97, -1454, -2422, -3367, -4538, -5384, -5261, -3576, -680, 2797, 5542, 5913, 5113, 4231, 2136, 1570, 2008, 470, -840, -1616, -2380, -1633, 18, 247, -9, 400, 648, 956, 1351, 1016, 336, -234, -78, -153, 335, 723, -927, -2161, -2654, -1892, 778, 3452, 5412, 6741, 6939, 4881, 2772, 390, -2538, -3774, -5252, -6214, -5769, -4368, -2791, -1603, 1242, 3909, 5317, 4667, 1293, -803, -1024, -590, 602, 1375, 2231, 2981, 3611, 3482, 2238, 764, -3180, -7056, -9086, -10724, -9512, -6867, -3504, 251, 5387, 11079, 14504, 15810, 11534, 4470, -1389, -6070, -8968, -10805, -10878, -9801, -6844, -1185, 4684, 9815, 10809, 8279, 4642, -796, -4761, -7312, -8406, -8170, -5592, -741, 3445, 7587, 9244, 7759, 6516, 3922, 681, -2112, -5170, -7379, -7567, -5539, -2452, 1443, 3711, 4648, 4589, 2853, 1540, -141, -2305, -3551, -3376, -2162, -307, 534, -657, 5, 2788, 4877, 6310, 5462, 3537, 1763, 46, -939, -1302, -2643, -5139, -7945, -10185, -10673, -7747, -2294, 4007, 9896, 13313, 13906, 11599, 7317, 2008, -1219, -3996, -7811, -9055, -8912, -6383, -2645, 555, 4189, 6229, 5798, 2700, -1795, -5433, -7178, -6816, -4902, -1612, 1904, 5129, 7017, 7397, 7882, 7099, 3679, -1100, -7043, -10124, -10244, -8823, -4578, 229, 6237, 9831, 9196, 6710, 1700, -2594, -6249, -8797, -8619, -6961, -4896, -2273, 1378, 6128, 10368, 11250, 8956, 5679, 1408, -3051, -6250, -8398, -8166, -6092, -3014, -204, 1870, 2551, 1382, 341, -204, 122, 775, -1167, -2146, -1459, 34, 5411, 6891, 4684, 3684, 2665, 1186, -94, -307, -926, -2158, -3251, -4881, -6065, -7181, -8080, -7279, -3967, 920, 5606, 8991, 10074, 11025, 10387, 10307, 7265, -842, -7498, -13648, -16373, -16326, -12757, -5927, 713, 7748, 11921, 13354, 11481, 4983, -1154, -5639, -8657, -9568, -9399, -7610, -4805, 1041, 7753, 13426, 15978, 11407, 5401, -898, -6619, -8839, -9640, -8688, -6897, -3271, 1449, 5078, 7580, 5433, 3447, 1741, -2215, -5091, -7855, -8134, -5529, 307, 8105, 12473, 14364, 11026, 5428, 1192, -4025, -7326, -9775, -11526, -10896, -8172, -3518, 1429, 5431, 7736, 8246, 7571, 5571, 2657, -656, -3201, -2915, 291, 2514, 4087, 2517, -710, -1482, -2150, -2419, -2489, -2961, -4206, -3573, -2733, -2104, 451, 1735, 2322, 2752, 1070, 626, 1930, 4163, 6823, 7815, 6678, 3276, -1570, -5988, -8946, -10270, -9261, -7081, -4021, -859, 4478, 10539, 12383, 11622, 7730, 2215, -2466, -8230, -12463, -14555, -11321, -3442, 4586, 12606, 15969, 15789, 12168, 5903, 672, -3967, -8282, -12813, -15306, -15096, -11816, -5011, 2964, 11984, 16306, 14928, 10418, 3018, -2278, -4614, -4822, -4376, -3765, -2113, -6, 2792, 5324, 4380, 3890, 1556, -4248, -7707, -10994, -11117, -8627, -3161, 3694, 9711, 12751, 10865, 7587, 3349, 2058, 1103, -2297, -4960, -6917, -7685, -5105, -1464, 1277, 2867, 2670, 1905, 313, -1122, -2050, -2984, -1503, 147, 2539, 2990, -243, -1548, -2027, 295, 3378, 4217, 4215, 3025, 1273, -263, -1005, -597, -1543, -4099, -6659, -8675, -8001, -4514, 174, 6507, 10300, 10713, 7939, 1009, -4749, -8300, -8215, -6063, -4807, -2251, 2406, 7647, 11085, 13104, 13081, 6827, -1334, -9148, -15404, -18952, -20151, -15310, -7981, 3221, 12716, 17381, 19018, 14414, 9007, 4948, -113, -6123, -11565, -13994, -14323, -11917, -5337, 3641, 10622, 10430, 7245, 2673, -2553, -5692, -8001, -7404, -5406, -2588, 1202, 4753, 7399, 8756, 9938, 7330, 1681, -2903, -7622, -10822, -9987, -6285, -622, 4216, 4540, 4146, 3105, -52, -839, -1389, -2133, -2899, -3560, -2827, -1210, 1774, 3679, 5488, 5631, 4642, 4446, 2946, 337, -1756, -1395, -1441, -2556, -3758, -5730, -6014, -5554, -4368, -490, 4446, 7428, 7896, 6613, 4730, 4212, 4356, 1451, -3035, -5935, -6719, -5451, -3297, 257, 5432, 8745, 7571, 5129, -169, -6358, -10999, -13772, -11449, -6407, -451, 5270, 10325, 14752, 18605, 18841, 11735, 1974, -5749, -11774, -15835, -19012, -16344, -8898, -230, 8317, 12928, 13490, 9572, 4769, 934, -3179, -6177, -7532, -9733, -9358, -5665, 2227, 10816, 12772, 12026, 8786, 3888, -1601, -6216, -8208, -8740, -7307, -4126, -1735, 937, 2130, 916, 1142, 1179, 1022, 925, -1957, -4309, -1984, 3487, 7939, 8250, 5808, 1922, -1535, -4151, -4614, -4499, -3204, -353, -86, -584, -2211, -5057, -5424, -3665, 136, 3741, 4740, 4853, 4952, 7246, 9341, 8112, 3151, -2015, -6774, -10894, -12381, -10118, -4309, 1875, 8427, 10667, 9979, 6664, -349, -5162, -7869, -8370, -8448, -7478, -3785, 1661, 9272, 16685, 18851, 14727, 6639, -1978, -8650, -14087, -17440, -15609, -9631, -3487, 4081, 9660, 13936, 14802, 8864, 4330, -914, -6396, -10316, -14047, -13957, -10204, -308, 9989, 14887, 16655, 12697, 7647, 1665, -4898, -6962, -8739, -10154, -8960, -7502, -5034, -2077, -272, 3657, 7493, 7497, 6040, 2885, -1324, -1514, 1640, 2636, 2344, 1568, -796, -3085, -5730, -7918, -5191, -1714, -1457, -461, -267, 378, 552, -889, -75, 359, -592, -668, -125, 729, 4433, 9398, 9964, 6935, 809, -4640, -8865, -12398, -11138, -7060, -2179, 909, 4769, 8147, 7986, 5235, 1190, -1681, -3266, -5700, -7813, -7840, -6242, 1070, 10034, 15608, 16902, 12115, 4846, -2950, -10420, -12165, -12109, -10698, -8085, -5158, 594, 5178, 10182, 11221, 9984, 7912, 2216, -4313, -10276, -12165, -8174, -2042, 3795, 7635, 8430, 8144, 6487, 4242, -397, -4677, -9544, -12983, -13515, -12293, -7958, -2791, 4931, 11490, 13909, 12083, 8329, 2911, 152, -1532, -2511, -1777, -3943, -4666, -6199, -7798, -5586, 195, 4067, 5440, 4090, 1914, 1500, 1024, 320, -1411, -780, -2611, -3963, -2321, -1958, 2889, 9166, 12406, 12537, 6679, -425, -6603, -10814, -10272, -7603, -4613, -2689, -689, 2298, 5428, 8517, 8562, 6033, 2300, -2288, -6572, -8701, -8194, -4215, 4241, 11575, 14183, 13267, 7231, -1709, -7048, -9283, -9069, -8038, -6859, -7074, -6622, -3807, 798, 10591, 14405, 12684, 9633, 2405, -2509, -6080, -6479, -2273, 286, 1049, 566, -1058, -603, 205, 1409, 2656, 1822, -193, -4791, -9026, -7796, -2902, 2082, 5448, 4823, 4227, 3896, 3512, 4170, 4293, 3992, 1746, -1670, -5153, -7897, -8376, -6645, -2467, 2748, 5990, 5685, 1978, 352, -36, 1279, 819, -2988, -6186, -10261, -10460, -7148, -4, 10351, 18062, 18263, 13064, 5637, -3000, -8857, -12269, -13031, -10885, -8312, -5796, -2543, 2244, 7429, 12882, 14003, 8880, 2942, -4885, -10208, -11062, -7516, -762, 4457, 6660, 8191, 9153, 6435, 1387, -4439, -7034, -8639, -10315, -10130, -8989, -4470, 226, 6492, 13661, 14384, 12060, 5510, -1908, -4454, -4227, -2561, -3210, -3536, -4256, -5333, -3594, -1684, -5, 3067, 5092, 3783, 333, -3542, -5131, -3898, -615, 2292, 2476, 311, -2143, -2276, 1366, 4915, 6171, 5613, 4183, 912, -2394, -5478, -8350, -6930, -6068, -4129, -1633, -190, 3036, 5736, 6343, 6005, 4089, 210, -4377, -8762, -8236, -4048, 1739, 8443, 11738, 11016, 7788, 2789, -3701, -8939, -11928, -14892, -15049, -13565, -6944, 1913, 9266, 16932, 20091, 18977, 10147, 7, -7216, -11764, -11983, -9836, -5148, -1278, 1192, 3780, 5925, 6298, 4696, 1786, -2912, -7929, -9364, -8530, -5661, -1717, 3028, 9551, 13892, 12228, 8358, 4027, 548, -2511, -6515, -8247, -9825, -6890, -4345, -2737, 1612, 4919, 7119, 6949, 5288, 1603, -2587, -4041, -3588, -1403, 2209, 3333, 610, -1528, -746, 1499, 4211, 5462, 4681, 1491, -2190, -5412, -4975, -3703, -2641, -1735, -4045, -3312, -1841, -21, 4099, 8442, 10314, 8956, 4721, -1225, -4494, -4613, -5533, -7222, -5653, -1300, 2464, 4747, 5657, 6393, 3544, -2545, -6096, -9630, -11229, -10418, -6344, 3428, 12325, 18724, 19034, 12489, 4390, -4468, -7168, -9073, -12286, -11761, -11218, -9911, -5131, 4775, 13536, 17769, 15035, 6987, -295, -6263, -11623, -12206, -9447, -5893, -202, 2985, 7256, 10884, 11379, 10950, 7456, 1094, -5404, -9332, -12511, -10761, -5838, -1338, 3820, 7848, 9034, 8825, 7432, 3267, -26, -2817, -4024, -4283, -4251, -3408, -198, 3457, 5902, 7350, 5306, 2797, -2144, -6586, -5886, -3749, -1016, 717, -75, -1257, -3253, -4123, -973, 3465, 7002, 7896, 4700, 1575, -207, -411, -853, -4295, -7415, -8836, -9100, -7939, -4943, -1015, 5813, 12031, 11357, 7382, 1543, -5064, -7291, -6631, -5095, -1467, 626, 3017, 6134, 8337, 10212, 4933, -1789, -7139, -10487, -10759, -11901, -9995, -4799, 2985, 11036, 15957, 13771, 6191, -1058, -6416, -8320, -7663, -7531, -8618, -8965, -5110, 3657, 12230, 15013, 10930, 5203, -1035, -7630, -12182, -13040, -11522, -7673, -1817, 3731, 9001, 10200, 10470, 10342, 8522, 4320, -1543, -7132, -13077, -13650, -9028, -3033, 2220, 4160, 4217, 3489, 2697, 2007, 610, -1132, -3864, -3581, -2038, 124, 1765, 3021, 8332, 10285, 8527, 5606, 950, -3635, -6024, -5006, -4145, -4103, -6450, -8088, -6796, -5314, -665, 4318, 8291, 10884, 12084, 11091, 6918, 1562, -1688, -2479, -5276, -7579, -8388, -8071, -6426, -1353, 4498, 7412, 6956, 2376, -1537, -4713, -5862, -6316, -5119, -2016, 820, 6076, 9779, 12590, 12747, 7188, 1921, -3530, -7381, -9816, -13351, -12824, -8391, 535, 7245, 10618, 9487, 4125, 921, -1723, -2578, -2755, -3538, -5166, -4253, -735, 6407, 12779, 14328, 11068, 5496, -733, -8542, -13358, -15387, -13441, -7657, -1690, 3827, 7317, 7694, 7850, 7471, 6102, 3124, -2632, -8513, -9633, -5359, 1211, 6147, 6718, 5977, 4583, 2774, 706, -3110, -6309, -8770, -9983, -8184, -5493, -1266, 1921, 4768, 8350, 10005, 10950, 7826, 1420, -2047, -1840, -449, 63, -2310, -6985, -9530, -9257, -6012, 35, 5259, 7035, 7444, 5759, 3170, 1234, -1785, -3769, -4569, -3995, -3217, -2167, -122, 4165, 8184, 9743, 9111, 3258, -3684, -8436, -10370, -9335, -7028, -4612, -3915, 122, 5844, 9898, 12021, 8772, 2466, -2498, -5674, -7446, -8197, -6045, -1556, 3250, 10144, 13021, 11639, 5947, -1578, -6787, -9018, -10357, -10461, -11791, -10969, -4955, 3152, 12938, 15680, 14798, 11055, 6117, 419, -4057, -6245, -7777, -6179, -4123, -2093, -656, -249, 1317, 3274, 2992, 653, -4057, -8779, -9389, -5492, 1405, 7317, 7992, 6831, 4267, 3613, 5386, 6265, 1890, -3077, -6781, -10276, -9523, -8675, -5954, -2267, 1142, 4304, 6886, 6883, 5139, 3594, 1994, 1945, 1369, -4889, -9073, -11067, -11825, -5497, 2000, 8430, 10885, 11748, 8914, 4761, 101, -4220, -6719, -10065, -11091, -11486, -8891, -4629, 1011, 9283, 15327, 16098, 9867, 949, -6099, -9320, -5623, -2338, -2950, -3735, -2411, 2536, 7795, 11052, 10468, 4403, -2705, -9821, -13917, -13061, -12616, -7435, 374, 7506, 14710, 15281, 11940, 7387, 3939, 2236, -1700, -6275, -11306, -12032, -10891, -7475, -1165, 3598, 6474, 5590, 5548, 5447, 2162, -1361, -816, 352, 1568, 341, -4082, -5711, -3180, 2526, 7351, 8362, 4362, 1152, -2115, -3148, -673, -1090, -2449, -5293, -6565, -4174, -801, 3436, 7551, 9387, 7791, 4390, -1734, -7996, -8654, -7070, -3328, 1779, 4954, 8945, 10643, 9049, 8355, 4897, -822, -7981, -14461, -16907, -16759, -13120, -6509, 4771, 14587, 20083, 19485, 10655, 3140, -2155, -5618, -7283, -8966, -9240, -9862, -8438, -3797, 3601, 9810, 9872, 6654, 1401, -4129, -8212, -10276, -8791, -4298, -445, 2188, 4234, 5370, 8159, 11110, 9423, 4513, -1633, -7178, -10710, -10481, -5785, -2509, -428, 847, 1505, 2439, 3613, 5937, 6094, 3279, 2309, 394, -1165, -2320, -5898, -5648, -3209, 25, 2558, 4101, 5216, 6954, 8047, 6237, 4340, -1446, -8270, -10668, -11190, -9327, -5482, -731, 5357, 9965, 12349, 11838, 9665, 5294, 1686, -2312, -7490, -9964, -10493, -9093, -3643, 4648, 9673, 10845, 5514, -2166, -6638, -7982, -7175, -5920, -3956, -919, 4318, 10257, 15032, 15214, 8585, 2312, -4217, -10731, -13023, -15931, -15472, -10153, -2282, 5960, 11261, 12440, 11125, 8677, 4310, 360, -3264, -7617, -9852, -8607, -3725, 2273, 6394, 6969, 6412, 5910, 3956, 661, -3112, -6039, -6827, -5850, -3934, -1955, -1794, -580, 385, 3759, 7340, 7305, 3388, -977, -2175, -1546, -865, -3567, -6545, -6157, -4031, -1544, 3044, 5657, 7462, 6793, 3137, 141, -4276, -9889, -12113, -11799, -8331, -3295, 598, 6611, 13917, 18977, 17725, 12981, 2344, -7425, -13329, -17794, -18255, -14765, -9188, -4586, 2265, 8469, 13678, 15264, 10915, 5236, -96, -5027, -6700, -7171, -6672, -3924, 3, 5729, 8214, 7127, 4331, -780, -4228, -6473, -7541, -7500, -6814, -2958, 359, 6405, 10104, 9903, 9019, 4559, 112, -4416, -6173, -5444, -4774, -2978, -1653, -219, 472, -225, 1996, 5559, 6696, 4168, 307, -3662, -5635, -4028, -2144, -2013, -535, -1702, -2931, -106, 4000, 7323, 8891, 9222, 5674, 2770, -2963, -7907, -9502, -9357, -6191, -2657, 1039, 4187, 5919, 6342, 7217, 5396, 903, -3264, -7818, -11867, -9626, -3261, 4384, 12567, 17408, 17293, 11314, 1058, -7129, -11943, -15069, -16658, -14440, -10166, -4956, 4149, 12608, 20275, 23686, 19201, 9277, -3498, -13022, -15069, -12768, -10079, -7977, -3750, -104, 2663, 7324, 9445, 10212, 5957, 238, -4418, -8080, -9650, -9469, -3683, 1280, 6409, 8308, 4770, 626, -1134, 454, 255, -26, -310, -302, -1553, -1193, 931, 2520, 2320, 73, -1296, -3114, -4090, -4421, -1713, 2959, 6751, 5829, 661, -4792, -7564, -3638, 2690, 8019, 11278, 9539, 5090, 18, -3946, -4712, -5837, -8159, -11510, -12952, -11321, -5275, 6386, 15989, 20388, 17607, 8447, -948, -9529, -12542, -11890, -9794, -4348, 1862, 7154, 9745, 12085, 9621, 3659, -1690, -8880, -14648, -16732, -14336, -7691, 482, 10810, 17917, 19723, 16141, 6538, -355, -6145, -9811, -11314, -11638, -10191, -8048, -2091, 6333, 12435, 12747, 10599, 4963, -2655, -7793, -9960, -9577, -7215, -2823, 59, 2773, 3075, 3868, 6600, 7514, 8562, 6280, 489, -4933, -7831, -7032, -3062, -1331, -2101, -3267, -4395, -4159, -2763, -544, 2259, 5645, 7175, 7006, 4843, 707, -1612, -1412, -1454, -483, -127, -296, -90, 664, 2602, 2825, 519, -4889, -8717, -10354, -11363, -7653, -244, 6868, 16290, 18497, 15779, 9545, -997, -4150, -8620, -10707, -12134, -10672, -5983, -1467, 6749, 12221, 15674, 12311, 2879, -6403, -12871, -15367, -13221, -9675, -4966, 2262, 7970, 12282, 15504, 14461, 9092, 2396, -5180, -8856, -12003, -15070, -12407, -5185, 2340, 6413, 8470, 6599, 4227, 1291, -2215, -2808, -2300, -2793, -4560, -5224, -3359, 2666, 7538, 8693, 8115, 6871, 4652, -663, -6005, -6784, -4325, -2152, -3502, -7927, -10175, -9191, -5289, 2415, 9554, 12238, 12906, 10615, 6688, 5731, 1790, -4492, -8145, -11667, -11011, -7416, -4965, 272, 6660, 9663, 10353, 6128, -1112, -5277, -8289, -7995, -4889, -1026, 2322, 5650, 9540, 11890, 12396, 8355, -270, -7657, -12620, -13473, -10940, -8027, -916, 6046, 11218, 14346, 11800, 4676, -3337, -8864, -9375, -7655, -6081, -4689, -2344, 2739, 8748, 14491, 14613, 9229, 3594, -2883, -8166, -11182, -11595, -9024, -5912, -838, 2139, 2611, 2712, 3285, 4421, 4448, 3835, 2129, -505, -3562, -1922, 2245, 3991, 2347, -968, -2834, -2736, -641, 239, -1416, -2440, -2089, -2178, -2356, -4494, -6512, -4654, 732, 6451, 10652, 11049, 7915, 7458, 5992, 4522, -253, -8653, -13444, -18370, -16822, -11303, -3341, 6699, 12724, 15098, 13801, 9288, 1829, -2767, -6289, -9551, -10305, -7560, -5694, 709, 9913, 13205, 16823, 11854, 2883, -4784, -11352, -12705, -9765, -6204, -4586, -1977, 511, 4940, 7403, 6689, 6646, 4038, -1318, -4971, -7976, -7630, -2223, 4052, 8158, 8840, 7334, 2942, -1071, -4223, -5341, -5107, -5208, -5272, -5599, -5619, -3539, -1757, 1493, 5381, 6973, 8343, 6490, 3005, 1804, 3305, 2212, -26, -1832, -5468, -8026, -9196, -5968, -566, 3994, 4666, 2293, 1129, -443, -210, -1416, -1379, -2026, -3048, -1212, -306, 4178, 10407, 13188, 9952, 3623, -4102, -10811, -16674, -18353, -13022, -6121, 530, 5978, 11528, 15081, 14639, 11473, 4539, -2036, -8773, -14467, -16705, -15483, -6291, 6037, 14465, 17059, 16036, 10682, 1995, -4415, -7975, -9422, -10132, -12267, -11451, -7209, -3836, 5790, 12550, 13714, 13752, 6872, 1042, -3718, -4094, -1583, 24, 261, -2279, -3335, -4726, -2644, 478, 2240, 3385, 2343, -2377, -6466, -7669, -4576, 1004, 3352, 4163, 2738, 2079, 1730, 4452, 8806, 9892, 8023, 2997, -3203, -9885, -15060, -16123, -12877, -6408, -448, 4493, 6795, 8427, 10760, 9468, 7241, 1585, -3438, -7939, -11903, -10906, -5278, 1787, 6783, 10599, 11248, 8696, 3060, -3051, -5620, -5976, -7194, -8023, -8053, -5724, -2067, 6346, 14786, 18047, 13856, 2936, -6167, -13362, -11831, -5909, -2425, 771, 3629, 6256, 9154, 9533, 6995, 3193, -901, -7746, -13003, -16592, -18383, -13573, -4998, 7934, 15475, 16782, 15062, 10685, 7936, 6702, 1902, -4706, -9503, -12530, -13738, -12169, -7068, -1159, 2530, 4517, 7158, 6913, 3925, -770, -1407, 1533, 5540, 5409, -513, -4528, -3617, 700, 5133, 7668, 5693, 1751, -2598, -5696, -4846, -3858, -5340, -5362, -3202, -947, 1382, 2881, 6013, 9859, 12985, 11236, 2110, -5422, -9036, -10415, -8691, -5913, -3090, -126, 2972, 8788, 12511, 12865, 7459, -2366, -8560, -13935, -16943, -16333, -12626, -3757, 6275, 13954, 16314, 13748, 10067, 7154, 2755, -2474, -5279, -9594, -13063, -12440, -8232, -363, 5453, 5346, 4319, 1093, -2839, -5887, -6657, -4380, -331, 5764, 9855, 9435, 6842, 6703, 6442, 4582, 2773, -2377, -9067, -12192, -13912, -10754, -6056, -1576, 1093, 1852, 3820, 4695, 7462, 8084, 5507, 3194, -628, -1650, -2498, -5287, -5198, -3797, -810, 619, 1782, 2909, 3034, 4468, 5292, 4079, -774, -7590, -10795, -11402, -8039, -2951, 2875, 7455, 11401, 12097, 9416, 6288, 993, -3153, -7578, -9932, -10667, -7514, -4556, 1871, 9815, 13964, 11890, 3594, -5009, -11156, -12558, -13088, -10330, -4648, 472, 7475, 14864, 19322, 20213, 13620, 4735, -4976, -11711, -15655, -18579, -16905, -10739, -4027, 2752, 7962, 11136, 11554, 8011, 3636, -545, -2338, -4916, -6380, -6901, -2803, 3749, 7445, 6486, 4685, 2235, -1069, -3567, -5946, -5694, -5916, -4665, -1825, 1786, 1522, -247, 182, 2696, 5597, 6819, 4539, -624, -606, 1142, 530, -561, -3117, -4393, -4217, -3268, 415, 5007, 7244, 6478, 2773, -810, -4330, -7696, -9289, -8993, -4315, 990, 4279, 6819, 10977, 13738, 15987, 11724, 2614, -5102, -13223, -16825, -16995, -11715, -3800, 5015, 10704, 11796, 9900, 5260, -1873, -5346, -5861, -6349, -5183, -4792, -2907, 2467, 11193, 17091, 16686, 10343, 3342, -5270, -12593, -15966, -14830, -10172, -6433, -2248, 2924, 7860, 9515, 10961, 10951, 7816, 2242, -3976, -8242, -11293, -8530, -695, 3806, 6519, 5532, 3277, 1881, 478, 1659, 1182, -1808, -4426, -5891, -6726, -5786, -4527, -1056, 2695, 4193, 5196, 3233, -317, 238, 3882, 6571, 6148, 3009, -1935, -6906, -9001, -6914, -1720, 1186, 1503, 19, -2847, -3426, -1696, -2055, -1495, 125, 801, 1528, 1733, 4436, 11137, 14851, 13982, 9070, -1910, -10946, -15417, -16771, -13602, -8761, -5420, -679, 3772, 9374, 13949, 12634, 7046, 2638, -893, -6195, -9874, -10996, -7050, -461, 7789, 10777, 11473, 9153, 2125, -3697, -8895, -10099, -9909, -10771, -10754, -6743, -942, 6334, 13133, 14102, 12008, 6582, -1484, -6675, -8257, -7940, -6113, -4438, -2723, 814, 4017, 4968, 6976, 8454, 5358, 551, -7052, -11231, -10706, -8744, -3825, 760, 3204, 3552, 3638, 4084, 6294, 8337, 7281, 5358, 3640, 1058, -1279, -7809, -10267, -8099, -6544, -4241, -3255, -1389, -1429, -447, 2433, 6107, 8151, 6071, 2928, -192, -2442, -131, 2749, 3580, 4845, 2832, -882, -3543, -7013, -8235, -9155, -9457, -7556, -4948, -1503, 3144, 11844, 16421, 18304, 12660, 3280, -3772, -10627, -10861, -10340, -7979, -4371, -1363, 2053, 7335, 11870, 10625, 7590, 1876, -5076, -7876, -11442, -13285, -9614, -3271, 6053, 13581, 14999, 12176, 6808, 2342, -643, -2745, -5553, -9513, -9728, -7428, -812, 5152, 7669, 8616, 6936, 2736, -2484, -8095, -9900, -9713, -7593, -1816, 1788, 5924, 8646, 12202, 13535, 12209, 7691, 108, -7835, -13036, -11805, -8020, -3594, -2832, -3469, -4612, -3084, 1467, 6434, 7270, 7694, 8600, 6881, 5916, 2439, -1355, -2923, -4248, -3763, -3016, -4980, -4554, -2741, 195, 3404, 4907, 3046, -302, -4046, -6665, -4246, -1905, 1079, 5060, 8547, 9266, 9130, 6005, -317, -2743, -7058, -10514, -10636, -10581, -6742, 36, 9055, 14578, 13818, 8620, -67, -8119, -11248, -11769, -11576, -9663, -6253, 242, 7383, 14076, 17696, 15828, 9365, 1208, -5359, -11506, -14947, -15576, -11328, -3261, 2570, 7350, 8941, 6443, 4009, 647, -1871, -4204, -5956, -5934, -4437, 2360, 8909, 13325, 13200, 8858, 4776, -1821, -7190, -12066, -14261, -10952, -7979, -4724, 570, 3818, 6242, 9193, 9194, 8868, 6011, 406, -4266, -5422, -1984, 510, -1406, -3927, -4381, -5898, -4186, -2147, 1354, 5680, 5141, 2881, 2658, 2144, -2583, -5468, -6948, -6836, -4415, -2040, 504, 5462, 10149, 13140, 11548, 5280, 700, -4104, -10987, -13887, -10271, -6666, -2058, 1177, 4788, 9914, 9487, 6061, 2800, -935, -5595, -11040, -11477, -9368, -2609, 7192, 12185, 16433, 15380, 9841, 1376, -8643, -12708, -13061, -13346, -12936, -9921, -4237, 2880, 10068, 13026, 14121, 11255, 4008, -530, -5821, -7684, -5322, -3495, 109, 2505, 2398, 1922, 320, -299, -1288, -3386, -5399, -8461, -7567, -3847, 1926, 7440, 8462, 8429, 5442, 3370, 1843, -1176, -2301, -786, -1263, -2192, -2130, -3708, -3978, -3105, -513, 2428, 4949, 3960, 3406, 1354, 208, 1796, -311, -2626, -5317, -6986, -7311, -3677, 2853, 11914, 16880, 14326, 10566, 2070, -5899, -9747, -13267, -13936, -13077, -10730, -5380, 1048, 7542, 14591, 17077, 12993, 7685, 1101, -6677, -10918, -9036, -4723, -416, 2854, 6032, 7654, 7941, 5937, 2389, -904, -7477, -11178, -13247, -13672, -9645, -3847, 5196, 14509, 18863, 18255, 11992, 3733, -364, -3068, -6311, -9439, -10477, -9600, -6954, -1463, 3402, 7478, 8036, 5256, 1554, -2375, -5712, -6120, -3378, -1040, 2261, 3799, 3617, 3304, 1988, 3466, 5447, 3062, -151, -2247, -4809, -4888, -3721, -2788, -1554, -2450, -3145, -2459, -1333, 2068, 5467, 6805, 6731, 3345, -606, -3891, -7549, -5607, -1528, 1281, 5704, 8757, 8110, 5697, 2318, -779, -3849, -8601, -13849, -14673, -12812, -7825, 2023, 11031, 18960, 21797, 16953, 10521, 2477, -3946, -7856, -11814, -14078, -13592, -10144, -4950, 3371, 11999, 14154, 10446, 4415, -2998, -8525, -11582, -12085, -8766, -3325, 2944, 8110, 11066, 12733, 12868, 7797, 1510, -4863, -12410, -16072, -16203, -11344, -3452, 2276, 4339, 5780, 7567, 7289, 5485, 2543, -738, -3252, -3450, -3304, -1583, -1415, -1930, 279, 2811, 5102, 6238, 3246, -262, -559, -1375, -927, -3110, -6423, -7577, -9299, -8378, -3896, 1030, 5808, 9246, 11923, 11207, 8364, 4713, 997, -2334, -7909, -10414, -12454, -11302, -5824, 2781, 8523, 9577, 7519, 849, -5258, -8778, -9133, -8687, -5971, -2016, 5332, 12337, 17834, 21038, 15039, 6661, -3360, -12482, -17315, -19807, -18490, -14115, -5706, 4051, 11443, 17001, 15094, 11269, 7059, 386, -3449, -7059, -10084, -11190, -7953, -92, 7000, 11585, 11241, 7803, 3369, -3257, -8432, -11073, -11459, -8823, -5812, -2476, 1248, 3644, 6909, 10113, 10702, 8117, 1981, -5688, -8637, -5800, -1738, -26, -233, -324, -243, 213, 1671, 3452, 2131, 1101, -1395, -2687, -2608, -5701, -7508, -7576, -3777, 1799, 6488, 10044, 12207, 14813, 14608, 11311, 4024, -4776, -11458, -16249, -17777, -14717, -8575, -2143, 4429, 9742, 13330, 13951, 9468, 4929, 728, -3509, -6263, -7555, -7719, -3974, 6488, 14362, 17679, 14344, 4616, -5383, -12648, -14236, -11945, -11847, -10521, -5976, -109, 9199, 14957, 15823, 12790, 7810, 2001, -3696, -9500, -11401, -9216, -5121, -723, 3234, 7517, 7104, 6026, 4964, 2816, 88, -6440, -12370, -12782, -8662, -3206, 1696, 4914, 7057, 10756, 10531, 7350, 2663, -324, -318, -1070, -1420, -2868, -5417, -9562, -8386, -2876, 3460, 6322, 2817, -881, -3084, -1890, 83, -246, -1230, -3291, -2662, 721, 3776, 9056, 13328, 12300, 8482, 1693, -6735, -13207, -17621, -17104, -14947, -9379, -2750, 3241, 12035, 14844, 18119, 15672, 8940, 1827, -7541, -13320, -16721, -12900, -6427, 1550, 8964, 12509, 11980, 8211, 2162, -2183, -6747, -9764, -9326, -12509, -11503, -6232, 1362, 11231, 19162, 18855, 13350, 5692, -3046, -7171, -8413, -9158, -6759, -4931, -4592, 75, 3152, 5390, 6061, 3681, 440, -4474, -8202, -9382, -6904, -2399, 3320, 5572, 4793, 4281, 2142, 2664, 6711, 7536, 4612, 14, -5418, -7518, -8266, -9280, -6671, -4182, -2971, -1087, -790, -289, 1425, 3621, 7257, 9503, 5453, -519, -5287, -7430, -3620, 1433, 4810, 4151, 798, -1615, -4457, -4963, -4109, -3859, -5763, -8697, -7503, -2097, 4028, 9600, 15031, 15868, 12881, 6511, -1343, -8789, -13846, -13213, -9886, -6560, -1408, 3079, 8028, 11342, 11283, 8954, 2087, -5458, -11091, -14182, -13970, -10003, -496, 10312, 17702, 21861, 16030, 8447, 2351, -2849, -4277, -8718, -12728, -13930, -12736, -7387, 797, 9368, 13684, 11568, 4909, -1709, -6927, -11072, -9081, -5705, -1103, 2494, 5567, 7512, 8939, 12982, 12751, 7458, 614, -7019, -12826, -13661, -11566, -5424, -1531, -1350, -1541, -896, 1405, 3364, 6759, 9350, 10617, 8846, 5256, -1526, -7779, -5944, -6770, -7327, -4385, -3467, -2013, -607, 3767, 6677, 6755, 4061, -2807, -5480, -6956, -6491, -2568, 1723, 8541, 12837, 12688, 11123, 7714, 2393, -2162, -5747, -9767, -12465, -11978, -10330, -1673, 9583, 16682, 18232, 10555, 1882, -4343, -10157, -12177, -10720, -7173, -2359, 1765, 8286, 13170, 16516, 14641, 8836, 1580, -8090, -14224, -19379, -19820, -14470, -3867, 6329, 13217, 17112, 14349, 6820, 936, -2346, -4783, -7354, -9211, -8307, -4676, 2960, 9597, 12808, 12124, 6764, -778, -7307, -14716, -16571, -14245, -10554, -4459, -2107, 2668, 6130, 9909, 15525, 15853, 11185, 2807, -5896, -11309, -10834, -6511, -2340, -976, -2575, -2459, -883, 1407, 3150, 4564, 5311, 3093, -33, -1229, -2370, -4557, -2471, -1066, 685, 2612, 2520, 1614, 2086, 6047, 7254, 4807, -1196, -6738, -10683, -11698, -9543, -5551, 466, 5802, 8582, 9646, 9893, 4912, 143, -3506, -7374, -8096, -8016, -6921, -313, 7971, 13558, 14972, 10204, 3932, -4586, -11511, -14027, -12815, -8247, -4411, -1871, 311, 5866, 12928, 12211, 7893, 2999, -1699, -4482, -9173, -9010, -4297, 1827, 7765, 8110, 6447, 2265, -4043, -7643, -8478, -7860, -7388, -8861, -8035, -2681, 4912, 12036, 13886, 12508, 8168, 2387, -3920, -8578, -11263, -10061, -5687, -2674, 1308, 3215, 3634, 4883, 6234, 6052, 4065, -1584, -6804, -8191, -5527, -92, 1390, 798, 526, -1614, -912, 1872, 4211, 6483, 8710, 7486, 2829, -1595, -7337, -10586, -9741, -6254, -2588, 876, 2167, 2249, 3437, 6042, 7524, 4771, 1707, -3159, -6247, -6543, -2968, 3380, 9020, 10519, 8579, 4698, -2400, -7756, -9995, -8853, -9198, -8414, -6820, -1560, 6924, 13110, 17549, 15955, 9792, 1673, -7260, -13614, -14059, -8796, -2231, 3364, 7871, 9507, 8679, 2788, -737, -2451, -4111, -5911, -8143, -7241, -5222, 864, 7736, 14725, 15958, 9097, 2442, -5166, -10204, -9365, -8475, -6756, -3999, -322, 4432, 9108, 12410, 11709, 6602, -461, -6809, -11380, -12329, -11837, -8566, -2170, 3757, 8967, 10662, 8847, 5752, 4596, 4576, 1945, -2168, -5259, -6144, -5901, -3933, -1523, 782, 1781, -22, -2021, -3512, -5445, -4599, 2, 5714, 10031, 9372, 5378, 1017, -310, 3161, 4268, -172, -3265, -6802, -8779, -5322, -3247, -2390, -2112, -3130, -1717, 1815, 5394, 6118, 6691, 7195, 6005, 2582, -6054, -10648, -10977, -8594, -1807, 1818, 4289, 6214, 5525, 3736, 2515, -458, -3928, -7156, -9762, -9485, -6251, -1157, 5942, 13447, 15381, 14490, 6079, -3534, -8428, -11168, -10287, -9079, -6749, -2015, 3430, 7971, 11654, 11609, 6945, 293, -6247, -11331, -14160, -14050, -9750, -1662, 8008, 13955, 16940, 13984, 9520, 6372, 2153, -3013, -7309, -10806, -14520, -14753, -9544, 538, 8000, 10063, 6852, 3203, -303, -2573, -2897, -778, -60, 2621, 4248, 2784, 3831, 3888, 4894, 1710, -1539, -4572, -8635, -11897, -10904, -4500, 1582, 4157, 2742, 1484, 2114, 2777, 2784, 3766, 2360, -455, -1258, -3554, -4741, -3024, -1991, -1233, -697, 1346, 2602, 580, -502, 2468, 3483, 2666, -63, -6677, -9689, -9851, -6539, 725, 9148, 12140, 11773, 7650, 2509, 2091, -794, -4867, -9065, -10283, -9098, -6496, -1131, 5590, 12618, 14656, 11813, 3856, -4774, -10038, -14395, -13168, -7377, 501, 7208, 13035, 15215, 15218, 14919, 7213, -1645, -10170, -14696, -17404, -19280, -14254, -5369, 3922, 13375, 17279, 15290, 10348, 2103, -2796, -4469, -5255, -6844, -8692, -8557, -3407, 8098, 15847, 15273, 9286, 638, -6875, -12782, -14343, -12442, -8586, -2592, 2504, 8345, 11500, 9859, 7813, 5798, 3109, -881, -5527, -11641, -12514, -7211, -353, 8315, 11234, 10668, 7471, 1660, -1627, -3822, -6873, -8283, -9025, -8039, -4994, -728, 5101, 9339, 12747, 13492, 9210, 1505, -5230, -8580, -5924, -2585, -680, -1535, -4350, -5323, -3720, 2655, 8644, 8533, 5783, -610, -4688, -4401, -6234, -3983, -2881, 1191, 5495, 5220, 3716, 3969, 6935, 8797, 6868, 392, -7913, -15074, -17481, -14389, -5939, 1481, 8469, 10646, 9330, 9481, 7530, 4481, 2614, -972, -6344, -10552, -12077, -5675, 3052, 11068, 14027, 10167, 3489, -3796, -7680, -9418, -8770, -7047, -4185, -1419, 1923, 6130, 10476, 11944, 10209, 7356, -855, -9032, -16481, -17731, -12073, -1440, 7138, 10062, 10973, 7020, 4189, 384, -1644, -4270, -7739, -10600, -13671, -12029, -6167, 4180, 12294, 16369, 15238, 6952, -1185, -6637, -7458, -4289, -3492, -4033, -4842, -5154, -2628, 898, 5309, 9880, 7767, 3721, -4180, -10397, -9378, -5822, -93, 1963, 4112, 3927, 3011, 3160, 2339, 5298, 8882, 5487, 803, -3488, -10628, -15946, -15023, -9720, -3020, 5783, 7876, 9152, 11762, 10832, 8649, 2209, -3059, -9166, -14166, -13304, -11247, -3683, 8140, 15977, 16584, 11802, 4602, -3522, -9268, -9598, -8170, -5231, -5380, -3528, 2840, 8631, 13094, 12599, 9328, 2106, -7062, -15470, -18723, -15504, -5020, 9168, 16064, 17299, 14337, 7083, 940, -3426, -4380, -6776, -10837, -14024, -15499, -11180, -1377, 10485, 18905, 19778, 13070, 4795, -4596, -8951, -9602, -6613, -2762, -1230, -1000, -253, 46, 306, 5034, 6688, 5587, 1109, -5395, -8027, -6092, -1690, 1154, 2930, 3674, -488, -652, 639, 2655, 8285, 9108, 5716, -1420, -8824, -12794, -13204, -10040, -1911, 4674, 9251, 10121, 8286, 8601, 6483, 3333, -1017, -6325, -13304, -17034, -15190, -9917, 2932, 18723, 25248, 22714, 12372, 309, -6943, -12626, -12591, -12927, -10386, -7416, -3913, 4279, 11184, 15230, 14462, 9073, -1372, -9880, -15212, -17478, -12282, 2091, 13508, 17477, 17341, 12044, 5665, -1832, -8564, -12028, -14107, -15586, -15436, -10081, -206, 10924, 19961, 20242, 15596, 7550, -661, -7749, -12049, -8931, -4366, -1812, -2713, -1087, 2313, 4233, 6590, 6731, 5286, -247, -7328, -9807, -7113, -2409, 3063, 3215, 863, -348, 164, 2123, 1578, 3215, 5366, 4957, 2104, -1987, -7330, -10319, -9222, -4755, 2111, 6680, 6881, 6434, 6649, 6199, 3174, -407, -5102, -11444, -13798, -13262, -8988, 205, 13427, 22639, 23016, 17263, 5303, -7029, -15403, -21116, -17294, -13179, -10356, -4573, 1057, 9918, 16929, 17718, 13274, 4953, -4636, -10224, -14014, -13453, -7866, 905, 8329, 12827, 15208, 10106, 2462, -4456, -10584, -12933, -12737, -12717, -10265, -2607, 5776, 14130, 19636, 17161, 8870, -411, -6805, -11151, -10332, -7660, -1944, 160, 67, 3339, 1751, 1416, 3955, 4840, 2420, -2932, -9234, -10565, -8007, -3713, 2359, 6065, 4960, 2515, 2035, 1077, -25, 1366, 2786, 2178, 531, -1536, -4574, -7804, -5461, -1669, 3610, 6615, 4521, 2007, -1157, -1581, -991, -2483, -3166, -5591, -7584, -5976, -3786, 6173, 15771, 19384, 17270, 8699, -596, -11104, -16103, -16434, -14683, -9806, -6338, -2116, 6066, 12444, 18017, 19704, 13585, 4370, -5712, -14062, -17210, -12937, -3372, 5100, 10738, 13612, 12241, 7099, -575, -3678, -5374, -8238, -10239, -11501, -8113, -2140, 6482, 13940, 17550, 14545, 6023, -1075, -9600, -12417, -9315, -6667, -4753, -1187, 3381, 5503, 9035, 9898, 9407, 5698, -2755, -9321, -15158, -17668, -13669, -4959, 6074, 13326, 15480, 12220, 5388, 539, -1026, -885, -3363, -6352, -8636, -8261, -4177, 1488, 8442, 12686, 10775, 4212, -2698, -9300, -12186, -10829, -5716, 404, 5007, 7032, 6080, 7184, 9779, 10610, 7695, 1968, -3112, -8416, -12394, -12433, -9325, -5752, -4261, -375, 3023, 6379, 7223, 5602, 8582, 9509, 9045, 2734, -8726, -13661, -12237, -4507, 4406, 6853, 6741, 5130, 2729, 1703, 976, -1919, -6802, -11847, -12961, -9985, -5084, 1450, 10171, 17012, 17509, 14618, 3479, -5156, -9793, -12936, -11196, -8673, -3562, 1000, 6729, 10305, 11353, 9603, 2563, -5981, -13116, -16028, -14322, -10488, -3384, 8100, 14693, 17621, 14370, 5259, -573, -6260, -7480, -7928, -7878, -6926, -5055, -621, 4432, 12199, 12282, 5095, -2703, -9629, -12020, -11209, -7705, -943, 4290, 7996, 11519, 9647, 9009, 6752, 3061, -693, -7456, -8143, -8820, -8069, -6413, -3444, -448, 8, 1488, 3000, 5927, 5471, 5526, 4828, 4257, 3903, 3311, -1001, -7312, -9172, -7335, -3161, -18, 2811, 2931, 4933, 4897, 5185, 4145, -2032, -6327, -9989, -10179, -7137, -578, 6445, 10980, 12968, 12197, 7085, -939, -7089, -10546, -11596, -10579, -6297, -189, 4989, 9204, 10449, 8006, 1587, -5908, -10425, -12918, -12505, -8782, -3446, 3877, 13424, 18643, 17749, 12208, 2982, -4311, -10418, -14972, -15541, -13626, -9530, -2452, 7689, 14611, 15353, 9148, -1334, -6921, -9423, -11087, -10019, -6240, 727, 9680, 15329, 19042, 16803, 9207, 940, -7958, -13992, -16569, -16141, -14641, -10226, -817, 7608, 12813, 15911, 13606, 9901, 3938, -1354, -4689, -7494, -9055, -7296, -1505, 2016, 3787, 4310, 3875, 2299, 1486, -1571, -4157, -5440, -3166, -11, -363, 1185, 729, 169, 2471, 5861, 7631, 5159, 374, -2854, -1236, 821, 113, -2279, -4451, -4787, -2990, 22, 2320, 2854, 1930, 1422, -916, -692, -1616, -4653, -3954, -2198, 1578, 6109, 7154, 7085, 8132, 7996, 6732, 937, -6285, -12128, -15265, -13054, -7568, 228, 7831, 11156, 9545, 5558, 1915, -2817, -5674, -8015, -7859, -2994, 1101, 5506, 11162, 15276, 16908, 11407, -128, -9390, -16864, -20066, -19356, -14147, -6031, 2520, 9927, 14011, 18590, 16299, 9147, 2665, -4353, -6338, -8377, -10695, -9890, -6873, 1714, 8560, 9831, 8318, 2770, -2566, -6257, -7599, -4137, -2112, -1997, -2804, -964, 2890, 4177, 5721, 5583, 3571, 866, -2418, -4001, -2516, 1400, 3287, 2259, -1785, -4216, -4309, -3410, -103, 2496, 2659, 551, -2357, -2554, -1433, -3416, -3680, -2218, 168, 3873, 7084, 6487, 6935, 9792, 5821, 1037, -5505, -11981, -14390, -13747, -8436, -603, 6225, 7788, 6363, 4094, 2378, -856, -2981, -3968, -4479, -2124, 8, 2534, 7875, 14364, 13238, 7970, -64, -9115, -14539, -18870, -19076, -11166, -3270, 3562, 10140, 14958, 19245, 15175, 8145, 397, -7555, -10960, -13068, -14178, -12440, -5515, 4376, 11423, 14996, 12106, 4430, -3345, -7985, -7046, -6392, -7330, -9219, -7916, -3142, 2944, 7579, 8350, 6477, 3199, 987, -722, -2917, -2033, 937, 2581, 2625, 2602, 1970, 187, 266, 2155, 2428, 997, -2764, -7104, -6526, -5699, -3222, -675, 2993, 5572, 7232, 8866, 6403, 5494, 4283, 2040, -2366, -5207, -8196, -11527, -12209, -8973, -4346, 499, 3453, 3332, 4052, 3777, 3503, 2599, 1450, 357, -1358, -2128, -1582, 3800, 8057, 8140, 5646, 285, -5087, -11323, -14143, -13543, -10726, -4511, 1944, 8119, 14057, 14378, 13215, 8997, 1578, -3125, -8076, -12182, -12775, -8586, -2622, 6268, 15023, 16671, 13120, 6051, -4033, -7768, -7968, -9519, -11379, -11764, -7452, -316, 7273, 14558, 17436, 14143, 6727, -1221, -8628, -10044, -4860, -3704, -331, 3005, 3467, 3989, 1560, 1224, 2387, 2336, -416, -4235, -7175, -8984, -5950, 1428, 8029, 9744, 9658, 7137, 2574, 58, 15, -972, -2592, -1286, -1395, -1665, -4388, -6496, -4440, -2169, 897, 3032, -947, -3830, -4057, -987, 6271, 7785, 4982, 1769, -2951, -3610, 2031, 5748, 5982, 3434, -463, -3695, -6176, -8351, -6916, -4885, -2756, 191, 994, 2854, 5624, 7294, 9648, 8612, 2560, -3464, -12822, -17186, -12033, -4201, 3968, 11902, 14556, 12680, 7785, -138, -4141, -7503, -11246, -12427, -13632, -12416, -6862, 955, 9252, 16927, 18648, 13524, 4417, -4684, -8166, -6874, -5320, -5674, -3832, -1891, 1321, 5583, 7669, 9023, 5501, -962, -7036, -11452, -12262, -9680, -3693, 4170, 10937, 13598, 10344, 6695, 3601, 2376, 2528, -1712, -5329, -7509, -8667, -9084, -5881, -397, 2083, 3670, 3381, 1929, -155, -3130, -1770, 3380, 4303, 3168, -1540, -3242, -3773, -919, 5671, 5957, 1846, -1978, -2846, -6217, -5712, -4711, -4675, -3563, -2849, -2305, -435, 1777, 4997, 8640, 8992, 7134, -1388, -7863, -12725, -11990, -4290, 1171, 4730, 7322, 9274, 8178, 5361, 2017, -2841, -6991, -10231, -13860, -14164, -10753, -3221, 7721, 16932, 20696, 17567, 7452, -1311, -4649, -6949, -9064, -9314, -8581, -6502, -228, 4233, 9587, 10184, 3778, -849, -5992, -9390, -10159, -10165, -5251, 2043, 9903, 15657, 12812, 7742, 3829, 2018, 1008, -2105, -6332, -10382, -12202, -9072, -3597, 1789, 4196, 2182, 3109, 3804, 4162, 4869, 4295, 4666, 4757, 3932, 233, -4106, -5722, -5194, -2387, 51, 1074, 979, 543, 636, 3929, 5283, 780, -3998, -8206, -8814, -5703, 1, 5807, 9043, 9119, 8586, 4378, -2294, -6077, -9605, -7164, -3161, -1677, 690, 2845, 4670, 7597, 7475, 1871, -3972, -10249, -15974, -14931, -8832, 264, 10648, 16638, 17337, 14603, 9624, 3233, -3712, -10024, -14776, -15088, -12459, -9146, -1711, 7928, 14608, 14801, 8866, 1664, -4602, -8919, -9369, -7477, -3331, 1561, 7557, 12120, 14605, 14331, 8350, 2737, -5420, -10912, -13762, -16032, -12988, -5057, 3180, 9661, 12173, 10923, 8533, 3519, 1074, -604, -1886, -1889, -1484, -1935, -604, 1474, 1550, 2403, 2612, 381, -1739, -6290, -8510, -4050, 902, 4308, 3100, -547, -3888, -2695, 135, 3301, 3720, 1550, 369, -115, 1581, 3454, 483, -4042, -4866, -4492, -2443, -2001, -3077, -883, 3379, 4400, 4588, -1325, -8305, -9914, -9346, -3401, 3574, 9903, 13509, 12189, 9264, 6790, 387, -4503, -10812, -15250, -14888, -13153, -7656, -1129, 7901, 12814, 14707, 11475, 3163, -2652, -7282, -8660, -6440, -3325, -852, 3198, 7395, 11256, 11749, 7014, -149, -8871, -13959, -16710, -15989, -10268, -2426, 8024, 15970, 17072, 12284, 5841, -867, -5191, -5437, -7666, -9137, -8344, -4704, 1762, 8085, 11925, 8535, 3244, -3551, -7960, -10646, -10092, -7099, -2890, 2703, 5953, 9600, 9533, 7177, 2953, 254, -2015, -3055, -5025, -6742, -5339, -2332, 2212, 2392, 1931, 369, -2702, -5128, -5276, -4369, -1667, 1619, 3433, 3972, 1541, 2145, 3999, 5120, 5072, 2918, 1830, 352, -499, -1273, -3998, -8916, -10876, -12122, -11543, -6302, -655, 5407, 11048, 14107, 13091, 8928, 3024, 1110, -657, -2704, -4040, -4650, -2259, 1093, 2488, 1865, 441, -3064, -4762, -7858, -11451, -10194, -5690, 151, 10274, 17605, 19951, 18054, 9333, 2370, -3165, -8865, -11420, -13810, -11268, -6095, -2188, 5375, 9036, 9130, 5815, 813, -4103, -7443, -8121, -7396, -3346, 2135, 7998, 14022, 16043, 11526, 7531, -234, -7043, -9394, -9473, -11393, -11771, -7139, -3158, 3355, 6279, 6470, 4559, 592, -705, 510, 1289, 1314, 1196, 662, 2217, 3356, 3608, 2510, 1219, 1175, 862, -2665, -7369, -6834, -5527, -1593, -57, -1642, -2043, -3656, -1368, 2106, 6719, 8682, 10412, 9252, 8095, 5453, -952, -4929, -10526, -10238, -7788, -5339, -1845, 1639, 5105, 5442, 3151, -786, -4177, -6965, -7093, -3401, 1934, 7601, 10939, 12016, 11457, 11396, 5781, -2906, -10857, -16772, -17479, -15917, -9698, 361, 10527, 13056, 12532, 8969, 1508, -4671, -8515, -8731, -5125, -2532, 1403, 6042, 8928, 13116, 10826, 4301, -1831, -8020, -12358, -13870, -12834, -6139, 1919, 6979, 11555, 11344, 6241, 3105, -60, -2948, -3873, -5739, -6783, -3882, 1114, 7382, 12510, 9867, 5361, 641, -4801, -8930, -11813, -10290, -5978, -91, 3764, 3594, 1979, -1234, -447, 2470, 2964, 1777, -1476, -4480, -2080, 4019, 7717, 5820, -144, -4823, -5901, -4766, -4315, -4663, -5468, -3767, -1965, -216, 608, -1815, -2219, -680, 2818, 6936, 6556, 3630, 2142, 3361, 5573, 4393, -1988, -8559, -12282, -14856, -10662, -2574, 3205, 7609, 9561, 9416, 8272, 3384, -1277, -4818, -7798, -8270, -7548, -4414, 1160, 8848, 12436, 12653, 7818, -450, -6790, -12433, -13859, -10780, -4935, -455, 4119, 8264, 9565, 9564, 5870, 1473, -2634, -6735, -10738, -10439, -6812, 256, 8771, 12440, 14728, 10775, 4529, -2368, -9407, -11067, -10186, -8900, -7557, -5559, -1347, 4144, 10051, 11926, 9598, 5059, -244, -3833, -5800, -3444, -616, 1816, 3825, 5014, 5554, 3243, -1081, -3445, -5466, -6889, -7945, -8692, -4946, -1734, 2993, 7921, 9134, 9886, 8746, 4223, 970, -1078, -1307, 932, -605, -3263, -4971, -8885, -8465, -4461, -262, 5139, 4788, 4150, 4084, 3678, 5374, 2124, -1458, -3245, -5194, -4907, -3661, 714, 5948, 9738, 9884, 6527, 351, -7812, -12283, -12072, -8346, -4111, -2664, -44, 6487, 9817, 12973, 9366, 1766, -2425, -8912, -11789, -12256, -8350, 1056, 9384, 15960, 17517, 12333, 4843, -4267, -10686, -10944, -11033, -12677, -12719, -9726, -2477, 7132, 15219, 16874, 13624, 7635, 868, -3907, -5663, -4825, -4135, -1497, 263, 2170, 3527, 1969, 1675, -315, -2934, -5711, -7285, -6424, -5749, -2754, 3457, 10297, 10763, 9586, 6991, 2637, 2631, 1488, 123, -1748, -4154, -5879, -8109, -7000, -2170, 505, 3504, 4530, 4089, 3307, 550, 13, 1680, 4139, 1253, -2969, -6402, -5632, -1630, 3499, 7725, 8537, 9099, 5110, 122, -4972, -10230, -11158, -11046, -10273, -6697, -2849, 3794, 11114, 14720, 13936, 8553, -224, -7382, -13224, -14203, -9739, -3960, 3175, 9832, 14428, 14453, 8602, 334, -6088, -11858, -14660, -16013, -15805, -12768, -4509, 5585, 13580, 20179, 17410, 11376, 3509, -4137, -5245, -6446, -7967, -8065, -5926, -3296, 427, 2400, 3246, 2574, 405, -1786, -4317, -5358, -5242, -783, 2114, 5264, 6953, 5500, 4243, 3949, 3235, 1294, -666, -4593, -7243, -6058, -5722, -3438, -1661, -1194, 1080, 2162, 4262, 3792, 1263, 679, 2035, 4042, 2245, -3055, -5991, -6266, -3377, 2006, 7563, 8602, 8159, 6291, 2402, -2009, -8009, -11098, -13307, -12566, -7714, -3480, 3206, 11209, 14080, 15566, 11599, 3103, -3481, -8420, -11285, -10605, -7006, -2364, 2554, 7320, 10294, 10714, 6433, 712, -6282, -13154, -15977, -16162, -11204, -4132, 4300, 12923, 18530, 20757, 17345, 9541, 1203, -5395, -9303, -13121, -14550, -14834, -10523, -4100, 2533, 7954, 8843, 8444, 3752, 1371, 826, 464, -1681, -1948, -1168, 1125, 5614, 5458, 3377, 2100, -181, -2841, -5463, -8059, -8160, -6680, -2611, 1553, 5920, 6497, 4772, 3608, 3336, 4266, 3205, 1, -2623, -1320, -255, 617, -318, -1136, -776, -1319, 517, 2854, 838, 272, -915, -1943, 599, -1797, -4145, -3636, -1649, 2273, 4545, 5548, 6749, 8171, 7839, 5439, 798, -4669, -8665, -12063, -11196, -7988, -3533, 4365, 8891, 9764, 8155, 2225, -3980, -7282, -8742, -9187, -6616, -1784, 4132, 11942, 17469, 18858, 15334, 5423, -5094, -12528, -17594, -19067, -18223, -13737, -6597, 2631, 11606, 17171, 18372, 16384, 11870, 4023, -1982, -7111, -11965, -12961, -10663, -4405, 5019, 7866, 7991, 6002, 1121, -710, -2155, -3050, -6904, -8630, -7990, -5534, 1275, 5789, 8600, 9401, 6533, 3442, -398, -2808, -4464, -4567, -1826, -2248, -1437, -395, 344, 3444, 4225, 3480, -375, -5718, -8016, -8080, -5694, -296, 2091, 2348, 2842, 2526, 4632, 7215, 6737, 5085, 4147, 402, -3011, -6782, -10875, -10696, -8312, -4519, -809, 1754, 1798, 3109, 4408, 6925, 6929, 2012, -2657, -6264, -5668, -2122, 2180, 5544, 9544, 8702, 6194, 1669, -5709, -10112, -13044, -12534, -11272, -8649, -4903, 1919, 10437, 17425, 20950, 17229, 7652, -2297, -9085, -12782, -14006, -11914, -9749, -6779, 1073, 8172, 13670, 13272, 9571, 6730, 298, -4614, -9389, -12962, -12817, -8995, -534, 7704, 10877, 10768, 7867, 4343, 1814, -5, -2825, -5829, -7127, -7556, -5340, -2078, 3558, 6737, 5281, 3537, -67, -3964, -5630, -8090, -5439, 32, 3766, 7746, 4948, 2387, 4542, 6669, 7741, 3545, -1512, -4504, -7863, -6156, -4514, -3963, -4638, -6455, -5664, -1258, 2221, 4668, 7894, 8857, 9684, 7883, 2966, -3829, -7910, -7523, -4598, -2404, -1372, 402, 732, 984, 2286, 1173, -2442, -6348, -9504, -9025, -5086, 581, 6216, 12805, 15259, 15497, 10701, 304, -6921, -12102, -14724, -14358, -11519, -6433, -249, 7589, 15851, 18741, 14035, 5861, -4037, -12701, -15364, -14748, -10940, -5154, 2618, 9033, 14032, 18124, 14500, 8785, 1669, -4697, -8965, -11961, -11846, -8959, -4520, 1232, 7094, 8017, 6511, 3652, 617, -1039, -2956, -3387, -3816, -2010, -163, 3589, 7934, 6441, 4941, 1736, 560, -379, -2379, -3670, -4481, -3033, -3859, -3885, -3945, -2669, -1588, 663, 5120, 8841, 9256, 7582, 5125, 2632, 4075, 1172, -4756, -7828, -10195, -7933, -4555, -528, 3796, 5063, 5975, 3464, 1961, -19, -3707, -5736, -5474, -2233, 1735, 4425, 6388, 6756, 7057, 6413, -754, -5915, -10053, -12175, -10298, -5371, 1989, 7325, 11141, 9766, 6856, 3514, -2971, -7668, -10126, -12226, -9919, -6036, -1813, 6264, 14524, 19810, 17396, 10048, 831, -6987, -12450, -15607, -15472, -11611, -5067, 2071, 6359, 9302, 10683, 7140, 4594, 302, -2438, -3894, -6670, -9001, -8709, -2134, 4641, 10157, 11916, 8940, 5009, -1570, -6894, -8233, -9597, -9671, -7577, -4519, -233, 3517, 5496, 7529, 7379, 6008, 3684, -1033, -6251, -4840, -2084, -1326, -1050, -3047, -3114, -3319, -672, 3171, 4719, 3962, 2108, -585, -1064, -859, -4213, -4320, -4016, -2633, 846, 2555, 2280, 3567, 6213, 6498, 4151, 188, -4519, -8236, -9543, -6188, 1243, 5655, 8226, 6502, 4353, 3463, -2393, -6259, -7725, -9623, -8467, -4921, -1943, 7854, 17702, 20538, 17860, 9932, 335, -9639, -16903, -20171, -18102, -12402, -6268, 473, 6889, 13929, 16561, 13899, 9636, 2349, -2726, -8019, -12842, -12067, -7339, 1731, 8877, 12077, 13194, 7393, -734, -6311, -9947, -9153, -7877, -9202, -7172, -2340, 2283, 8781, 11901, 11119, 8411, 3175, -3078, -6557, -7255, -6509, -3756, -1707, -1077, 576, -146, 946, 6455, 8849, 6856, 2468, -2824, -5645, -5373, -4175, -3464, -2727, -2876, -2475, -229, 2206, 6522, 11308, 12407, 11222, 7725, 259, -8032, -13965, -13343, -8168, -2452, 2664, 3189, 3033, 2187, 2028, 3035, 1614, -618, -3021, -4562, -3931, 738, 8100, 14272, 14236, 10305, 2909, -5252, -11800, -15770, -16842, -16026, -8798, -3521, 4046, 11812, 15614, 18031, 13315, 6221, -743, -8532, -14103, -15997, -10790, -2750, 5131, 11646, 11874, 9181, 3819, -1425, -4630, -7553, -9728, -11025, -11592, -7245, -278, 8121, 15511, 16430, 12212, 4424, -3431, -10527, -11462, -8423, -6245, -2816, 237, 3068, 6213, 7711, 10296, 7553, 1705, -3349, -9550, -12497, -13261, -8749, -3371, 2881, 6868, 5922, 6446, 7640, 11481, 10432, 5549, 708, -3657, -6611, -9370, -9241, -7290, -4401, -2297, -1492, -249, 1242, 689, 2955, 6200, 7609, 7643, 2715, -1416, -4425, -1882, 2643, 1949, 2464, 1424, -474, -1371, -2145, -3311, -3795, -4250, -7006, -5635, -3060, 552, 6735, 10892, 12334, 9116, 3234, -1894, -4954, -6254, -7892, -6037, -4478, -1887, 4086, 6227, 7429, 8232, 3834, -488, -5041, -10281, -11953, -12381, -6922, 951, 9736, 14878, 15298, 12390, 3548, -2154, -5511, -7973, -8641, -11426, -10285, -4949, 452, 7037, 11765, 12492, 6436, -190, -8596, -11936, -11712, -10231, -6341, -2762, 2858, 8640, 14419, 15587, 14406, 8598, 606, -6899, -12404, -15897, -16195, -12598, -6197, 290, 4453, 5989, 6559, 7313, 7563, 7162, 4902, 1727, -1839, -3615, -4503, -681, 2334, 4007, 2825, 688, -570, -3463, -5023, -4109, -1694, 875, 2573, 1160, -830, -346, 907, 4077, 7229, 6370, 3727, -1113, -3613, -3819, -1827, -1701, -4324, -4669, -2608, 83, 3410, 7070, 9059, 6340, 2325, -2259, -8358, -11172, -11894, -9146, -3697, 1590, 3094, 6221, 8872, 11278, 11964, 6733, -309, -6437, -11521, -13671, -12515, -6981, 915, 6751, 10022, 9098, 6619, 203, -4731, -5432, -4652, -3638, -4234, -3593, 414, 8781, 16371, 17133, 13109, 4077, -4724, -10260, -14864, -14975, -12606, -10776, -7356, -961, 5852, 12223, 15013, 15312, 12120, 6896, 1459, -4137, -9518, -10530, -7762, -4722, -1116, 1647, 2649, 3588, 3592, 3069, 3006, -1128, -4761, -7553, -5443, -2891, -12, 3004, 3959, 6565, 6034, 4509, 663, -2819, -5288, -3900, -2997, -2455, -2562, -3627, -1489, 2679, 7654, 8836, 5357, -940, -3608, -4792, -4087, -2973, -4840, -5351, -3596, -499, 2528, 7375, 11380, 12339, 12785, 6991, 788, -5982, -12842, -13741, -12598, -8434, -4689, -1408, 862, 3998, 7004, 9575, 8463, 5364, 249, -4904, -7608, -6988, -1022, 2172, 6801, 9014, 7723, 6302, -199, -7416, -10270, -12020, -12866, -12036, -9517, -4376, 5463, 14220, 18326, 19366, 12645, 4335, -2026, -7961, -9299, -9965, -11723, -9713, -5971, -407, 5561, 10572, 10282, 8641, 5515, -1135, -5554, -9204, -11209, -10320, -4592, 3332, 10000, 11499, 7617, 5038, 2831, 1010, -555, -4289, -8120, -7276, -4980, -1859, 1720, 3722, 6173, 6018, 3033, -1532, -5299, -8009, -6470, -325, 3710, 3986, 1925, -70, 2794, 7969, 9156, 7087, 2412, -3062, -7646, -8379, -7574, -5918, -5155, -6475, -6181, -1935, 2578, 6619, 10169, 12599, 12194, 7539, -98, -8493, -10931, -10339, -6042, -2659, 1490, 6966, 5363, 4061, 2504, 201, -2631, -5616, -9097, -10034, -7124, -3036, 4269, 12681, 16391, 16002, 11424, 1922, -4586, -9187, -11274, -12263, -11785, -8728, -5073, 2032, 9783, 16808, 18568, 11535, 3413, -4564, -11072, -12530, -12102, -8720, -4090, 1338, 6276, 9605, 11808, 13227, 13146, 8248, 1237, -5192, -11767, -14503, -12453, -7574, -1472, 3606, 5610, 4662, 4097, 2717, 70, -74, -1212, -202, 1166, -511, 288, 2014, 4907, 5804, 4389, 2705, -768, -5256, -9398, -8956, -6163, -3036, -508, -2259, -1748, 10, 1021, 4671, 8721, 9452, 7632, 3041, -3703, -3671, -4203, -6631, -6074, -5019, -3235, -1960, 23, 4572, 8108, 8448, 6114, 1506, -2886, -7791, -10869, -9084, -3810, 2428, 5882, 8497, 8499, 8296, 7479, 1961, -1955, -5790, -9632, -12448, -12699, -6444, 2009, 10225, 14151, 11912, 7849, 461, -5980, -9001, -10778, -9261, -7423, -5029, -877, 5897, 14333, 19164, 17536, 12044, 2185, -7799, -16218, -20267, -18306, -13417, -5144, 1440, 5860, 9636, 10884, 9287, 8321, 5269, 1647, -3083, -7468, -10572, -9433, -3292, 3989, 10380, 10537, 8269, 1899, -4338, -8378, -8913, -7057, -6615, -5894, -4244, -1133, 4206, 8101, 13084, 14591, 9524, 2854, -6647, -11958, -10743, -5539, -1535, 134, -81, -715, 351, 4017, 6835, 6963, 4090, -171, -4268, -6383, -6078, -7789, -5206, -1084, 2161, 4393, 5337, 4221, 2402, 5092, 7339, 4894, 951, -4782, -9271, -10009, -8545, -3600, 2033, 5649, 6892, 5366, 2864, -1342, -4595, -5033, -5784, -6603, -6473, -4516, -441, 11102, 19471, 20474, 16123, 4004, -4663, -11662, -15601, -15375, -13694, -10357, -7237, -1666, 5992, 12725, 15437, 13473, 9262, 3122, -2849, -8765, -12820, -10276, -3298, 6025, 11908, 11342, 8378, 3327, -1340, -4356, -5639, -7720, -11349, -12144, -9193, -3861, 4887, 10926, 13781, 14216, 9961, 4442, -2580, -7895, -9204, -7052, -4119, -2486, 994, 2831, 2437, 7121, 11373, 9647, 3546, -4635, -11180, -12662, -8533, -2599, 1278, 2888, 3406, 3743, 6217, 7876, 9301, 9226, 5074, 917, -2506, -6559, -10120, -11395, -6926, -2922, -326, 2553, 1557, 1123, 1766, 4681, 6128, 2736, -1931, -7280, -8968, -5290, 769, 8014, 12117, 10876, 8856, 4972, -1206, -7127, -10768, -14354, -16091, -12221, -8746, -3367, 5487, 13148, 20330, 19039, 12024, 4108, -5186, -10960, -12509, -9182, -5465, -546, 3536, 5775, 8100, 7471, 4798, 984, -3863, -7101, -9032, -10555, -8492, -4105, 3178, 12459, 16612, 14357, 8157, 1221, -3878, -7778, -9356, -9572, -8208, -5939, -1623, 3132, 7379, 10057, 9132, 5832, -1367, -8596, -12553, -14728, -12418, -6061, 131, 5718, 8208, 9614, 10980, 10473, 8571, 4871, -516, -5889, -8981, -9507, -8075, -5991, -3082, -638, 2037, 2682, 1756, 1267, 281, 2212, 4964, 5885, 3700, -1198, -2537, -1655, 341, 4134, 4635, 2873, -121, -2783, -4835, -7031, -8113, -9138, -9337, -7136, -3915, -264, 7244, 13273, 17050, 15836, 7905, -152, -4911, -7143, -9975, -9959, -8789, -5334, 2454, 7219, 11311, 13519, 9096, 4459, -456, -6003, -9152, -11358, -10042, -5918, 734, 7380, 10393, 10236, 6515, 3057, -1634, -5693, -8771, -11703, -11825, -9499, -3759, 3111, 9717, 11734, 9069, 2429, -4608, -8909, -11098, -9402, -6063, -2831, 2554, 7337, 11385, 14341, 13818, 11644, 6229, -1402, -8224, -15075, -18679, -15629, -10530, -2025, 4441, 6379, 6335, 5945, 5911, 5029, 2593, -343, -1487, -3503, -2340, 980, 5309, 6507, 6268, 3946, 424, -2414, -7084, -8112, -6459, -3876, -1588, -1435, -1844, 408, 5021, 8577, 9944, 8401, 4728, 2269, 873, 2218, 1967, -1239, -4890, -7947, -8456, -7488, -3853, 342, 5898, 10070, 9678, 6757, 473, -4396, -6895, -9051, -5706, -2654, 963, 4613, 6741, 11007, 11935, 7873, 1042, -5105, -10273, -14397, -14822, -10309, -3823, 3095, 7823, 10164, 9874, 5294, -1211, -5586, -6777, -7119, -7293, -5705, -1391, 6281, 14924, 16948, 14086, 7693, -577, -8465, -13756, -16063, -14244, -10160, -5469, 819, 6661, 11512, 11738, 9563, 7788, 3846, -901, -3332, -6794, -8244, -3562, 1420, 5970, 9926, 9017, 4161, -1716, -5097, -6487, -5920, -7052, -7816, -5313, -3115, 1130, 6618, 11791, 13266, 11607, 6920, 909, -4516, -6477, -4728, -3225, -3132, -3454, -3911, -3387, -1897, 1432, 4968, 3555, 843, -3361, -4743, -3475, -1934, -226, -1103, -285, 26, -45, 1473, 3203, 5759, 7308, 6431, 2804, -2522, -7390, -10824, -10990, -8363, -4592, 937, 4066, 4274, 4940, 4238, 3986, 2086, -259, -3401, -8444, -9701, -7756, 1112, 11635, 16250, 15491, 11155, 2189, -5706, -9705, -12651, -13604, -13643, -11055, -7183, 756, 9013, 15471, 17497, 14252, 7767, 599, -6065, -11596, -11927, -7304, -2095, 3246, 8223, 8601, 6880, 2638, -1308, -4495, -6349, -8365, -11930, -13235, -11107, -3606, 7228, 16339, 19863, 15195, 8452, -164, -5792, -4973, -6243, -8310, -9298, -8789, -4980, 677, 6283, 10921, 10907, 6952, -156, -5651, -9355, -9690, -5019, -140, 4094, 7461, 7384, 4556, 2601, 3090, 5037, 3078, -2397, -5680, -5842, -5398, -3256, 107, 2316, 3912, 3374, 1184, -2291, -5195, -4926, -3981, -51, 2125, 1205, -928, -2979, -1258, 5403, 10630, 10078, 7033, 2596, -1489, -5179, -7419, -8925, -10514, -12739, -11508, -8721, -703, 8858, 15216, 19256, 18058, 13020, 5084, -2424, -10108, -11686, -9493, -6809, -2043, 2169, 4375, 5898, 6886, 4472, 1579, -3147, -9087, -12647, -12056, -8271, -1964, 7057, 15167, 18698, 14420, 7105, 1037, -3991, -6671, -9734, -12100, -12434, -9853, -5506, 1117, 9294, 13139, 11964, 6008, -2110, -7261, -8916, -9404, -5784, -1897, 967, 3049, 3886, 4991, 5670, 7586, 6524, 3024, -2104, -6590, -8999, -9318, -5469, -1286, 994, 1941, 1936, 2799, 2345, 859, 13, 1262, 3915, 3964, 1985, -2271, -4533, -1267, 4032, 8472, 8606, 5231, 2498, -1272, -3151, -3862, -7107, -10150, -11359, -9340, -5251, 2074, 8272, 13025, 17326, 15511, 11842, 4365, -4418, -9475, -11697, -9964, -8020, -4533, -576, 3333, 7725, 9996, 10918, 5385, -3722, -8681, -12637, -12253, -8456, -4718, 3397, 11344, 15874, 16099, 11005, 3731, -3476, -8953, -10827, -11506, -11340, -10694, -5891, 2368, 11373, 16854, 11698, 5156, -1633, -5877, -7242, -7828, -7458, -5574, -44, 4677, 8608, 9852, 9071, 6798, 3074, -1800, -5486, -8989, -11405, -9190, -4539, 1022, 5727, 6873, 4963, 2646, 50, -1653, -1875, -2854, -2377, -2000, -697, 1215, 2075, 4350, 4792, 4819, 4366, -387, -7004, -10793, -13560, -10412, -5857, -1759, 697, -306, -375, 2420, 9314, 11653, 10024, 5374, 1805, -2016, -1911, -3007, -8725, -9587, -9325, -6916, -1663, 2285, 4139, 6515, 6756, 7729, 5941, -424, -6407, -10293, -8891, -3065, 3524, 8022, 9919, 9725, 7291, 4366, 47, -4458, -7395, -10619, -10920, -9363, -6212, -1627, 4317, 9783, 11587, 9619, 4075, -788, -4458, -7247, -7128, -4941, -1863, 1737, 5192, 9073, 10869, 7230, 1044, -5563, -10500, -10525, -8829, -7578, -5568, -2163, 2795, 8238, 11833, 11494, 8595, 4747, 214, -2870, -2802, -3249, -5731, -3985, -1252, 1233, 4926, 4611, 2425, -613, -3608, -6825, -8764, -8660, -7059, -2669, 2860, 9354, 13192, 12784, 11605, 8025, 4103, -144, -6207, -9848, -12649, -12482, -10451, -7516, -2655, 2169, 6060, 8260, 7177, 4430, 1411, -1569, -72, 509, -179, -627, -2335, -2278, 564, 2060, 2761, 3227, 810, -454, -1745, -3399, -5486, -6512, -3836, -1228, -766, -211, 1282, 2596, 6195, 8791, 8371, 4202, -1730, -5147, -6519, -4192, -248, 2572, 4151, 6919, 7969, 5072, 2317, -2698, -6492, -6632, -8252, -8617, -7533, -4749, -153, 7598, 16336, 17914, 14564, 6567, -494, -3587, -6608, -8837, -10673, -10349, -6562, -1903, 3747, 8076, 8540, 4855, 435, -4432, -8544, -9316, -8503, -4567, 1529, 8338, 12862, 15178, 13386, 7997, 1131, -4705, -9154, -12803, -15015, -16552, -12234, -4499, 3656, 11033, 13272, 11589, 9560, 5177, 662, -2090, -2827, -3584, -4238, -3209, -1289, 3359, 6201, 7743, 7001, 2743, -3169, -8782, -10317, -10360, -7116, -2315, 172, 2519, 3266, 3714, 5053, 6743, 6989, 2399, -3681, -8275, -7474, -2774, 1003, 3548, 2419, 1840, 1104, -980, -882, -1309, -2964, -2445, -3114, -4261, -1762, -2511, -2646, 991, 4111, 7175, 8040, 4370, 2605, 3706, 4315, 2862, -875, -4090, -7390, -8364, -5780, -2574, 1155, 3894, 4202, 3621, 2263, -51, -4166, -5502, -4078, -3600, -116, 1730, 2787, 8105, 12937, 14222, 10911, 3140, -6484, -13910, -16796, -16068, -10887, -4208, -20, 5361, 10275, 11609, 10689, 6659, 1920, -906, -4645, -7747, -10225, -10032, -3782, 2956, 10433, 12866, 9362, 3158, -4645, -8503, -8405, -7782, -8185, -8091, -5671, -422, 5977, 11329, 12953, 11392, 6186, -213, -7239, -11683, -11195, -8477, -3705, 369, 5106, 8774, 7989, 5366, 2987, 305, -2581, -6198, -10684, -13756, -11168, -6138, 1125, 9498, 12115, 12398, 9369, 3973, 1088, -1466, -4336, -5457, -4907, -4028, -1388, -114, 1149, 2997, 3138, 3050, -765, -5902, -8947, -8698, -5248, 914, 5073, 4961, 4502, 4169, 5535, 8697, 9199, 4611, 910, -3102, -5843, -7568, -10646, -9440, -5682, -2446, 865, 3372, 4496, 5069, 5954, 7229, 7678, 5271, 1173, -3904, -8433, -8802, -5506, -479, 3653, 7061, 6803, 3935, 1208, -1457, -2787, -3551, -5694, -8460, -7501, -6145, -1342, 4674, 9746, 14441, 12389, 5653, -602, -5546, -7100, -6921, -7314, -4584, -1719, 718, 4521, 8275, 8987, 6856, 1509, -5654, -9862, -11693, -11421, -9307, -3384, 5186, 12314, 15232, 13537, 10017, 5785, 931, -3135, -6204, -8820, -10060, -8332, -4193, -232, 3507, 6776, 6699, 5504, 2109, -2957, -5342, -5075, -2618, 550, 2742, 6764, 9197, 7958, 7864, 4564, 137, -4777, -11459, -14029, -12195, -8040, -2430, 2081, 4505, 5605, 5276, 5272, 4181, 2811, 1589, 252, 407, -453, -1752, -3179, -4358, -2911, -1114, 889, 2531, 1766, 222, 1639, 2988, 2326, 1561, -2588, -7041, -7594, -7756, -4201, 1972, 5762, 9425, 10102, 8763, 5827, 1052, -2520, -5671, -7748, -9610, -10283, -7998, -1675, 7828, 12996, 13195, 9344, -323, -6328, -10288, -12775, -10735, -8591, -4026, 1882, 8303, 14352, 16694, 14364, 6706, -1661, -7153, -10854, -13166, -13640, -11038, -4844, 2693, 8398, 11113, 10246, 5163, -303, -2900, -3599, -3624, -4734, -4709, -1868, 3100, 8481, 10115, 8206, 5160, -423, -7455, -11644, -12105, -10312, -6827, -1694, 2558, 6068, 8280, 7960, 7826, 7604, 4204, -813, -7146, -10727, -10326, -5698, 95, 3173, 4746, 4468, 4276, 3980, 3391, 101, -3255, -4751, -4006, -2793, -1615, -3138, -5283, -3641, 322, 5023, 6795, 5552, 1530, 1000, 2838, 3899, 2006, -1731, -5542, -8376, -7463, -3394, 1632, 5670, 6765, 6255, 3854, -165, -4392, -8263, -7697, -6052, -4010, -1750, 932, 3588, 9178, 14413, 13296, 8357, 1653, -5303, -9975, -12241, -12687, -10187, -6005, 238, 5041, 8509, 10089, 8390, 4239, 1476, -1536, -4738, -7366, -9158, -8226, -3508, 3388, 8064, 11267, 9533, 4606, -32, -4317, -5239, -4465, -4470, -5307, -5346, -2063, 2706, 6942, 8588, 8309, 5412, 483, -4755, -9204, -9399, -7291, -1724, 3499, 6573, 8920, 7518, 5600, 4683, 2205, -955, -4066, -7465, -7286, -7037, -6438, -3443, -1576, 2762, 6017, 6517, 5033, 1792, -630, 243, 2485, 2670, 2425, 529, -3198, -4311, -2273, 85, 1239, 463, -1676, -2665, -1368, -1042, -1596, -2148, -2630, -3139, -3133, -994, 2695, 7205, 10050, 10203, 8344, 4903, -565, -6891, -10385, -10529, -9981, -8125, -5047, -1055, 4109, 9161, 10743, 8925, 5759, 1945, -1260, -4630, -6779, -6684, -5507, -2668, 1865, 6447, 9150, 7816, 4801, 3132, 1555, -773, -3630, -6029, -7539, -6726, -4244, -456, 4633, 7038, 6108, 3125, -786, -2958, -3807, -4447, -3422, -1668, 1104, 3390, 4566, 6152, 5275, 5056, 3273, -856, -5667, -9825, -12170, -11963, -7789, -2861, 2370, 5934, 7382, 8635, 9195, 9493, 7737, 2142, -2175, -4185, -5957, -6344, -6151, -5683, -3743, -1154, 100, 2338, 3397, 1940, 1934, 1619, 937, 245, -1846, -2966, -2464, 56, 2111, 3851, 5867, 5937, 4756, 1815, -1794, -4084, -6390, -7452, -7496, -7923, -6077, -2227, 1295, 6266, 11212, 11746, 10078, 5284, -624, -3746, -7120, -8896, -8535, -6876, -4691, -1834, 3436, 8223, 10323, 10486, 5969, -1, -4696, -7818, -8404, -7643, -6297, -4362, -823, 3329, 7951, 9785, 8301, 5361, 686, -2013, -4394, -7043, -6573, -5175, -2634, 1371, 4379, 5989, 4760, 1682, -2476, -6296, -7637, -7732, -6552, -4260, -692, 5407, 10523, 14568, 14058, 9588, 4638, -2144, -7707, -11888, -12405, -11157, -9200, -5809, -2003, 3977, 8297, 9943, 10893, 8555, 4561, -73, -4861, -5325, -3896, -2222, -1222, -950, -1182, -363, 923, 2032, 2521, 1984, -227, -2458, -2590, -2193, -726, -1129, -1778, -1223, -127, 1019, 2557, 4168, 5199, 5093, 4332, 2744, 554, -2647, -7220, -8191, -8038, -6262, -1702, 2221, 5500, 7611, 7461, 6641, 3637, 859, -1723, -5183, -6921, -8184, -6123, -2286, 2282, 7256, 9040, 8537, 5609, 1451, -2257, -4875, -5799, -6178, -5561, -4907, -2866, 944, 3364, 5387, 5964, 4362, 1433, -2055, -4942, -5616, -4528, -2221, 1018, 3975, 6481, 6917, 5823, 2907, -323, -4290, -8442, -9308, -9807, -8923, -6111, -2104, 3203, 9355, 14028, 13847, 11656, 7198, 1655, -3159, -6935, -8253, -8089, -7061, -6473, -3963, -145, 3919, 7306, 7880, 6712, 4279, 979, -1679, -3283, -3602, -3548, -1975, 1133, 3733, 4535, 4095, 2884, 1396, -438, -2404, -4351, -5966, -5597, -4541, -1955, 814, 1981, 1683, 1592, 1264, 2035, 3357, 1913, -55, -612, -1021, -1788, -1719, -2047, -2662, -2457, -1361, 115, 1565, 1401, 1894, 2301, 2596, 2767, 1635, -705, -3214, -5281, -6897, -5942, -2960, -65, 2085, 3530, 3998, 4728, 4094, 2327, 526, -1682, -2928, -3982, -3212, -726, 988, 2703, 3464, 2998, 1752, -1105, -3305, -4388, -4141, -2486, -93, 3474, 6633, 9894, 11389, 9714, 6700, 785, -4982, -9708, -12819, -13583, -12753, -9351, -4753, 1384, 7538, 12574, 14668, 13174, 9539, 2981, -2136, -5825, -8991, -10006, -9343, -6347, -3095, -284, 2178, 3968, 5505, 5180, 3425, 1006, -1476, -3360, -3980, -3372, -1991, -705, 959, 2548, 3615, 3824, 3062, 1490, -1023, -2779, -3329, -3422, -2245, -311, 1077, 2693, 3532, 4007, 2886, 806, -364, -1864, -2186, -2920, -3676, -3597, -2502, -24, 1315, 2319, 2883, 3083, 3809, 3497, 2656, 1312, -563, -2180, -3192, -3580, -2885, -2673, -2833, -2147, -1011, 278, 2099, 3633, 3578, 3276, 2578, 1652, 843, -344, -1198, -1412, -1450, -683, 606, 1472, 1012, -722, -2444, -4376, -5319, -4945, -4191, -3365, -1505, 1020, 4022, 7421, 10194, 9707, 7181, 3671, -352, -3544, -7265, -9542, -10589, -9201, -6717, -3148, 1758, 5208, 8039, 8928, 8566, 6479, 2940, -977, -4846, -7020, -7431, -6231, -3600, -561, 2382, 4159, 5251, 5279, 4183, 2188, -684, -2857, -4288, -4691, -3606, -2564, -1239, 353, 1877, 3337, 3355, 2553, 955, -1093, -2290, -2885, -2688, -1869, -661, 1607, 3419, 3885, 3768, 2640, 874, -1198, -2979, -4343, -4227, -3807, -3483, -1966, -15, 2241, 4140, 4494, 4320, 3514, 2685, 1472, -99, -1074, -1901, -2195, -1826, -801, -2, 135, 282, 215, 460, 726, 87, -750, -1827, -2611, -2566, -1288, 841, 2345, 3157, 3327, 3105, 3077, 2879, 2016, -117, -2161, -3081, -4482, -5878, -7052, -6591, -4768, -1910, 1300, 5119, 7840, 8521, 8530, 6465, 4037, 804, -2442, -4680, -6492, -6767, -6237, -4642, -1727, 1250, 3354, 4647, 4826, 3982, 1962, -160, -2330, -3573, -3394, -2477, -1275, 133, 1881, 3209, 4302, 4284, 3035, 1177, -1395, -3534, -4402, -4410, -3568, -2432, -1023, 287, 1492, 2652, 2778, 2348, 1473, 352, -736, -1909, -2412, -2037, -1208, -254, 730, 2037, 2922, 3675, 3916, 3334, 1976, -116, -1975, -3611, -4246, -4108, -3375, -1418, 397, 1786, 2508, 2580, 2300, 1787, 1415, 783, -78, -717, -1146, -854, -166, 517, 1561, 1979, 1663, 288, -1692, -3165, -4839, -5404, -5095, -4100, -2260, -73, 2810, 5118, 6703, 6981, 6519, 5086, 2047, -848, -3703, -5505, -6437, -6075, -4964, -3694, -1752, 10, 1495, 2755, 3688, 3584, 2729, 1195, -502, -1197, -838, -351, 30, 466, 103, 44, 214, 59, 287, 472, 77, -309, -1067, -1752, -1630, -1276, -978, -490, 150, 953, 1690, 2298, 2606, 2416, 2184, 1575, 717, 132, -612, -1823, -2459, -2318, -1557, -22, 940, 2027, 2569, 2193, 1302, 176, -820, -2156, -3011, -3261, -3044, -1898, -791, 542, 2126, 2768, 3148, 3160, 2570, 1555, 56, -1341, -2217, -2272, -2227, -1944, -1550, -1286, -988, -744, -258, 246, 478, 261, 0, 18, 536, 1231, 1897, 2352, 2713, 2702, 1946, 1326, 257, -1077, -2596, -4032, -4987, -5293, -4422, -2926, -1016, 1254, 3369, 4906, 5729, 6051, 5160, 3298, 993, -1542, -3581, -4961, -4934, -4120, -2484, -263, 1340, 2296, 2294, 1649, 460, -1050, -2433, -3295, -2986, -2270, -1393, 50, 1788, 3386, 4242, 4319, 3532, 1822, -164, -2141, -3879, -4989, -4863, -3536, -2104, 157, 1905, 2791, 3645, 3634, 3043, 2229, 404, -1109, -1973, -2275, -1896, -1219, -321, 745, 1527, 1931, 2382, 2018, 1556, 1068, 321, -569, -1801, -2223, -2329, -2133, -1318, -693, -487, -195, -258, 103, 685, 1223, 1395, 1406, 1572, 1640, 1803, 1592, 440, -430, -945, -1478, -1456, -1693, -1840, -1745, -1594, -1212, -651, -118, 243, 755, 1254, 1920, 2329, 3062, 3437, 3157, 2363, 1157, -512, -2187, -3143, -3991, -4249, -3928, -3026, -1298, 94, 1339, 2516, 2736, 2658, 2426, 1925, 868, -301, -873, -1505, -1495, -1010, -261, 798, 1481, 1647, 1265, 429, -889, -2240, -3056, -3394, -3205, -2621, -1192, 721, 2344, 3596, 4301, 4300, 3694, 1926, 250, -1482, -2959, -3822, -4345, -3762, -2375, -237, 1640, 3223, 4127, 3769, 2717, 845, -1091, -2564, -3578, -3854, -3424, -2259, -581, 1048, 2589, 3551, 4020, 3837, 2962, 1610, 106, -1166, -2011, -2553, -2717, -2203, -1730, -1439, -874, -120, 588, 1075, 1199, 820, 406, 198, 217, 522, 1037, 1523, 1940, 1975, 1816, 1463, 216, -1062, -2321, -3308, -3563, -3418, -2838, -1976, -796, 625, 1832, 2701, 3131, 3068, 2674, 1778, 873, 93, -633, -1284, -1615, -1695, -1473, -866, -190, 95, -28, -616, -1198, -1349, -1338, -927, -680, -188, 574, 1602, 2442, 2829, 2723, 1825, 1103, 155, -739, -1347, -1662, -1901, -2093, -1959, -1694, -1112, -360, 302, 914, 1191, 1282, 1345, 1450, 1221, 610, -88, -539, -626, -836, -912, -1270, -1249, -628, -130, 644, 1289, 1578, 1732, 1228, 392, -581, -1513, -2318, -2958, -2709, -2130, -1032, 235, 1474, 2685, 3259, 3205, 2509, 1548, 233, -932, -1616, -2025, -2147, -1963, -1621, -984, 86, 938, 1524, 1494, 946, -56, -1043, -1619, -1695, -1149, -147, 748, 1792, 2723, 3280, 3231, 2259, 906, -631, -2057, -3133, -3737, -3783, -3239, -2301, -1527, -194, 1224, 2375, 3008, 2832, 2235, 1588, 1048, 597, 312, 182, 125, 59, -48, -254, -560, -769, -1196, -1780, -1988, -2145, -2146, -1531, -659, 560, 1861, 2901, 3401, 3244, 2431, 1259, -38, -958, -1855, -2431, -2650, -2372, -1719, -995, 358, 1455, 2177, 2411, 2079, 1430, 586, -251, -941, -1770, -2331, -2046, -1257, 54, 1101, 1911, 2048, 1897, 1863, 1841, 1551, 569, -228, -982, -1571, -2037, -1838, -1421, -1314, -1138, -722, -104, 555, 1208, 1363, 1085, 844, 600, 275, 82, 88, -47, 32, 65, 137, 592, 858, 611, 15, -738, -1630, -2235, -2822, -2779, -2250, -1431, -328, 947, 2188, 2970, 3641, 3772, 3107, 2139, 821, -830, -2716, -3802, -4027, -3627, -2563, -1390, -346, 185, 841, 1355, 1469, 1333, 908, 467, 18, -118, 93, 448, 843, 1004, 790, 524, 165, -218, -684, -1423, -1949, -1986, -1502, -881, -146, 801, 1352, 1558, 1681, 1630, 1331, 897, 242, -487, -1048, -1291, -1168, -570, 151, 742, 1186, 1551, 1456, 1052, 758, 325, -293, -1020, -1888, -2268, -2037, -1106, -23, 884, 1534, 1804, 2021, 1859, 1410, 594, -78, -831, -1434, -1576, -1467, -874, -323, 86, 494, 578, 520, 188, -385, -925, -1525, -1926, -2174, -1823, -736, 434, 1772, 2826, 3390, 3747, 3202, 2064, 305, -1432, -2762, -3517, -3778, -3619, -2937, -1902, -602, 445, 1333, 2148, 2528, 2532, 2146, 1404, 580, -84, -369, -441, -200, -174, -152, -275, -515, -761, -834, -856, -826, -791, -804, -505, -25, 689, 1319, 1640, 1602, 1296, 917, 597, 290, 32, -350, -533, -633, -700, -696, -819, -725, -524, -384, -173, 230, 454, 516, 693, 746, 720, 496, 126, -244, -533, -662, -536, -381, -153, 8, 236, 422, 399, 375, 218, -206, -661, -1001, -995, -781, -536, -212, 40, 183, 314, 298, 240, 119, -99, -293, -320, 57, 565, 969, 1230, 1210, 1040, 649, 29, -692, -1338, -1875, -2255, -2173, -1856, -1200, -287, 580, 1442, 2049, 2505, 2551, 2134, 1364, 69, -1090, -1864, -2126, -1983, -1576, -850, -221, 500, 919, 1087, 1039, 696, 360, -100, -480, -586, -519, -132, 375, 786, 1046, 1113, 1094, 891, 430, -112, -655, -1113, -1464, -1557, -1386, -804, -38, 511, 894, 1040, 990, 901, 811, 560, 99, -239, -571, -816, -889, -719, -334, -38, 114, 229, 395, 363, 260, 69, -125, -349, -435, -523, -497, -460, -241, -38, 228, 416, 293, 186, 137, 83, 34, 90, 184, 291, 263, 195, 128, 47, -95, -283, -338, -496, -539, -458, -403, -325, -325, -85, 162, 546, 906, 1017, 1051, 619, 297, 35, -244, -460, -732, -936, -1070, -895, -648, -228, 146, 460, 596, 581, 647, 695, 732, 608, 395, 162, -97, -362, -588, -662, -618, -450, -190, 119, 479, 749, 725, 483, 220, 67, -51, -185, -262, -305, -151, 73, 425, 711, 829, 755, 365, -97, -528, -850, -1016, -1084, -938, -686, -152, 395, 917, 1275, 1254, 1048, 678, 209, -276, -811, -1104, -1299, -1283, -1003, -626, -281, -78, 245, 514, 692, 804, 660, 404, 159, 112, 146, 66, -23, -352, -714, -1009, -962, -659, -201, 223, 460, 591, 749, 766, 667, 492, 126, -240, -620, -861, -918, -890, -602, -348, -90, 297, 772, 1127, 1154, 1012, 593, 139, -233, -463, -496, -435, -345, -255, -169, -102, 36, 198, 338, 378, 263, 263, 333, 356, 249, 79, -58, -116, -50, -24, -77, -89, -36, -32, -10, 52, -16, -220, -631, -856, -935, -599, -127, 244, 435, 252, 127, 107, 272, 595, 729, 611, 516, 294, -30, -258, -656, -1098, -1431, -1676, -1583, -1099, -344, 514, 1376, 2066, 2458, 2508, 2267, 1660, 440, -689, -1583, -2049, -2145, -1974, -1466, -1093, -436, 51, 572, 896, 987, 1246, 751, 522, 247, -329, -370, -481, -632, -567, -192, 168, 552, 580, -91, -698, -850, -511, -271, -223, 10, 439, 723, 901, 590, 509, 489, 96, -98, -219, -452, -641, -441, -327, -88, 351, 681, 944, 1007, 661, 263, -184, -506, -638, -868, -816, -853, -692, -317, 238, 930, 1124, 962, 640, 402, 240, 246, 284, 175, 52, -156, -99, -88, -175, -327, -678, -863, -960, -1013, -664, -69, 223, 206, 279, 454, 881, 1064, 759, 225, -121, -514, -856, -811, -577, -141, 246, 380, 288, 37, -372, -802, -1186, -1485, -1567, -1357, -545, 549, 1476, 2130, 2741, 2680, 2015, 1033, -57, -816, -1569, -2170, -2281, -1881, -1268, -838, -51, 796, 1364, 1510, 1239, 819, 343, -64, -395, -492, -547, -470, -147, 330, 536, 532, 392, 21, -389, -799, -863, -660, -513, -337, -88, 146, 517, 856, 894, 501, 54, -276, -578, -570, -131, 511, 661, 521, 410, 348, 422, 472, 106, -582, -1243, -1635, -1456, -856, -449, 64, 629, 1118, 1505, 1534, 1213, 704, 145, -557, -1028, -1075, -834, -452, 94, 744, 1150, 1028, 301, -454, -935, -1173, -1278, -1165, -856, -645, -29, 733, 1482, 1952, 1790, 1233, 424, -264, -896, -1169, -1047, -790, -577, -479, -38, 592, 913, 735, 295, -143, -589, -1014, -1153, -920, -119, 925, 1749, 2078, 1996, 1621, 1023, 321, -378, -1053, -1427, -1693, -1515, -1098, -597, 29, 524, 749, 589, 327, 216, 260, 293, 357, 372, 466, 665, 731, 568, -79, -620, -807, -798, -663, -446, -460, -549, -397, 83, 436, 660, 589, 108, -403, -737, -631, 73, 826, 1298, 1574, 1715, 1564, 1054, 249, -828, -1937, -2787, -2859, -2337, -1820, -1018, -168, 1027, 2194, 2995, 2984, 2054, 868, -307, -1055, -1652, -1885, -1735, -1545, -1003, -339, 343, 1148, 1597, 1666, 1268, 535, -346, -1169, -1551, -1645, -1423, -891, -9, 1048, 1445, 1251, 737, -21, -136, 19, 107, 119, -17, -205, -232, -138, -200, -573, -1002, -1253, -1186, -588, 6, 579, 994, 1314, 1619, 1492, 1082, 487, -23, -524, -974, -1159, -1205, -876, -351, 379, 981, 1061, 645, 54, -247, -415, -685, -893, -980, -869, -179, 909, 1933, 2159, 1641, 843, -59, -704, -1203, -1327, -1281, -1015, -653, -235, 313, 785, 1074, 782, 75, -480, -739, -668, -307, -33, 194, 390, 689, 1068, 1314, 1407, 963, 95, -719, -1401, -1807, -2169, -2218, -1828, -857, 466, 1447, 2049, 2075, 1773, 1463, 1050, 573, -261, -907, -1297, -1464, -1306, -1083, -788, -487, -36, 292, 366, 499, 714, 784, 671, 476, 397, 340, 253, 58, -309, -565, -803, -796, -633, -334, -15, 284, 692, 855, 851, 552, -169, -742, -1079, -1307, -1159, -663, -144, 558, 1351, 1758, 1702, 1265, 489, -366, -1070, -1473, -1570, -1238, -766, -155, 650, 1332, 1570, 1252, 539, -275, -766, -1006, -1105, -1040, -840, -402, 336, 1003, 1580, 1679, 1013, 130, -490, -772, -699, -563, -563, -510, -284, 66, 367, 608, 339, -88, -322, -557, -627, -529, -191, 273, 897, 1448, 1284, 1025, 510, -34, -442, -902, -1434, -1764, -1844, -1883, -1309, -427, 428, 1429, 1867, 1789, 1476, 1131, 1049, 896, 371, -230, -645, -921, -902, -835, -922, -1028, -1063, -967, -642, -156, 312, 946, 1398, 1614, 1521, 998, 409, -151, -462, -716, -912, -713, -343, 90, 443, 472, 293, -107, -567, -886, -1015, -899, -636, -286, 262, 829, 1612, 2165, 2274, 1500, 379, -517, -1226, -1430, -1504, -1519, -1241, -628, 182, 985, 1490, 1526, 949, 204, -480, -807, -802, -710, -397, 70, 536, 806, 806, 427, -34, -305, -408, -545, -741, -775, -410, 178, 726, 1118, 1079, 582, 154, -121, -444, -692, -854, -956, -862, -329, 314, 904, 1081, 900, 701, 445, 312, 258, 199, -98, -497, -642, -660, -651, -795, -957, -1088, -974, -487, 336, 1072, 1737, 2450, 2448, 1883, 763, -502, -1380, -2197, -2370, -2207, -1778, -951, -20, 920, 1423, 1626, 1243, 537, 96, -411, -686, -646, -541, -93, 504, 972, 1128, 1053, 664, 15, -634, -1243, -1562, -1672, -1607, -1183, -552, 235, 964, 1528, 1652, 1326, 1034, 583, 63, -287, -478, -417, -305, -412, -423, -518, -795, -811, -774, -624, -363, -60, 202, 561, 917, 1110, 1138, 659, 136, -234, -634, -699, -531, -351, -157, 31, -11, 2, -163, -376, -288, -310, -271, -194, 56, 430, 754, 1111, 1149, 883, 241, -565, -1218, -1679, -1493, -930, -462, 228, 960, 1571, 1882, 1900, 1433, 525, -489, -1414, -1881, -1958, -1816, -1247, -432, 575, 1371, 1788, 1684, 1218, 714, 126, -285, -582, -834, -822, -615, -402, -186, 106, 92, 105, 77, -87, -181, -327, -447, -337, 50, 455, 836, 736, 374, 304, 310, 228, 218, 126, -239, -371, -351, -325, -161, -341, -680, -884, -974, -752, -139, 415, 1111, 1730, 1862, 1777, 1442, 662, -164, -757, -1291, -1474, -1527, -1297, -795, -141, 612, 1229, 1358, 984, 310, -122, -231, -192, -118, -112, -219, 79, 536, 795, 863, 424, -183, -786, -1215, -1292, -1110, -645, -242, 359, 932, 1259, 1243, 660, 32, -421, -705, -889, -1108, -1203, -843, -124, 514, 904, 1041, 893, 687, 395, 204, 108, -257, -480, -733, -877, -818, -735, -700, -463, -131, 208, 553, 618, 904, 1264, 1342, 1142, 470, -279, -912, -1389, -1422, -1380, -859, 317, 1554, 2656, 2871, 2441, 553, -2258, -4405, -5771, -5465, -4669, -2175, 2482, 8264, 12637, 12737, 11004, 6209, -29, -5162, -9431, -11474, -12168, -11241, -9686, -6303, -1213, 4472, 10036, 11075, 10406, 9067, 5645, 2702, 319, -1910, -3114, -2680, -2532, -2860, -3480, -3886, -3244, -2095, -653, 332, 719, 329, 246, 767, 2610, 4864, 4216, 1585, -1179, -3080, -2440, -1083, 87, 660, 466, 1370, 1257, 563, 141, -691, -1017, -2026, -3045, -3023, -2343, -1494, 162, 2030, 3020, 2422, -58, -2629, -3527, -2609, -1394, -408, 233, 1639, 3861, 4859, 5393, 3552, 69, -2698, -5785, -7231, -7368, -6597, -4892, -2259, 1397, 4893, 7761, 7863, 5589, 3899, 2794, 2019, 456, -1621, -3076, -2580, -792, 397, 2026, 1349, -136, -1189, -3067, -4088, -5334, -6354, -5007, -1688, 2288, 5854, 7437, 7398, 7361, 7484, 5948, 3846, 518, -3716, -5820, -6119, -6023, -5272, -4517, -5475, -4380, -2912, -1359, 1714, 3589, 5374, 7083, 8332, 7692, 5562, 1572, -2987, -4687, -6811, -7971, -7721, -6411, -3400, -188, 4406, 7310, 7544, 5135, 594, -2495, -3635, -4325, -4288, -4177, -3361, 319, 5309, 9780, 12019, 9880, 4627, -95, -4725, -8099, -9058, -8875, -7266, -3805, 871, 4326, 6751, 6503, 4503, 3052, 876, -1736, -4245, -6459, -5993, -2647, 1381, 5292, 6414, 5449, 4137, 2122, -722, -3092, -3796, -3642, -3523, -3898, -3332, -870, -30, 251, 783, -600, -2006, -2936, -2619, 795, 4943, 7283, 9141, 7459, 3781, 861, -2891, -5482, -7051, -7583, -6725, -4887, -1797, 261, 2584, 3961, 3975, 4193, 3704, 2436, 312, -1468, -1157, 2437, 5724, 6649, 5184, 1621, -2455, -4870, -6834, -8482, -8565, -7582, -5553, -2532, 1986, 6002, 9087, 10507, 8934, 6106, 2201, -1728, -3983, -5174, -4965, -3557, -1503, -30, 560, 1456, 1799, 1626, 831, -948, -3184, -5449, -5722, -3195, 646, 4642, 5260, 3820, 2898, 1695, 1429, 640, -590, -1621, -2245, -2624, -2900, -2219, -1051, 544, 1156, 618, 604, 1303, 1118, 1521, 2545, 2257, 2740, 1712, -1158, -2765, -4766, -5111, -3925, -3098, -306, 2546, 5477, 8101, 8627, 7137, 4005, 179, -4352, -7368, -9428, -10752, -9530, -6471, -723, 4727, 7961, 8769, 7626, 6130, 3911, 1692, -1054, -3355, -4351, -4064, -2962, -545, 1996, 2046, 792, -839, -2611, -3995, -5065, -5259, -3923, -807, 3067, 6109, 7848, 7859, 6569, 4604, 1128, -3006, -5820, -7352, -6744, -3819, -1526, 1139, 3518, 2493, 1473, -372, -3130, -4220, -3426, -1365, 875, 3596, 5377, 7510, 7554, 5407, 2358, -2046, -6258, -9067, -9766, -9227, -6108, -1135, 3781, 7102, 7976, 6422, 4041, 1810, -820, -2945, -4401, -5117, -4156, -1107, 2380, 5714, 6179, 3846, 837, -3095, -5344, -5346, -3640, -1604, -594, 1633, 3446, 6067, 7679, 4935, 2205, -1200, -4873, -7225, -8475, -6285, -2021, 2080, 5067, 7265, 8560, 7581, 5724, 3055, -558, -4702, -7564, -8968, -8404, -5442, -2159, 2029, 3778, 3054, 2404, 990, -225, -744, -1179, 21, 2625, 3636, 2907, 1750, -734, -3013, -4774, -5168, -4433, -4389, -2976, -1462, 617, 3696, 5440, 4817, 2307, -492, -2498, -3322, -2492, -151, 2699, 5197, 6684, 6598, 4114, -213, -3939, -6432, -8590, -9217, -8309, -7305, -4643, 1076, 8056, 14496, 16989, 13420, 7161, 962, -3691, -6235, -7700, -8454, -7905, -5391, -2249, 1876, 6153, 8514, 7845, 4204, -12, -3812, -5686, -5691, -4230, -1221, 2177, 4745, 6197, 4953, 2217, -28, -3058, -4754, -5596, -6409, -6564, -3795, 1364, 5332, 8909, 7838, 3663, -224, -4872, -6333, -5443, -3831, -1456, 1163, 2799, 2995, 3620, 2970, 1149, 98, -1803, -3628, -3803, -2953, -389, 2939, 5555, 6552, 4862, 1841, -2235, -5228, -6409, -7371, -6351, -5362, -3014, 1477, 6350, 11419, 12432, 9672, 4264, -1559, -5636, -7591, -6911, -5250, -3927, -3226, -988, 1719, 4018, 5046, 3458, 1821, -150, -2659, -2877, -575, 2091, 4215, 6225, 6977, 5803, 2980, -1409, -5702, -9203, -10637, -9510, -6158, -3591, -6, 4969, 8414, 11381, 10406, 8017, 4616, -374, -2621, -3256, -3715, -3923, -3986, -4403, -3584, -1904, -1016, 706, 994, 1114, 1566, 1490, 1388, 1869, 2953, 3150, 3949, 834, -2810, -4602, -5841, -4261, -914, 1330, 2395, 3358, 2176, 797, -751, -2874, -3525, -3907, -4755, -4037, -2363, -150, 3746, 7323, 9079, 8125, 3154, -2993, -8109, -10309, -9532, -7426, -4923, -1567, 3219, 7756, 10940, 11818, 11320, 7119, 209, -4777, -9612, -12742, -12139, -10116, -5522, -40, 4960, 9086, 10704, 10240, 9088, 6919, 2313, -2387, -6048, -8592, -8319, -5578, -1582, 2749, 4453, 3109, 949, -819, -2032, -2565, -2284, -2258, -1673, 942, 3740, 5320, 6816, 6062, 3772, 917, -2801, -5104, -6172, -6422, -5907, -3389, -446, 950, 2552, 1960, 534, 648, 398, 853, 1174, 848, 1088, 1062, 1417, 2454, 2230, -291, -3629, -5374, -6448, -6020, -4126, -603, 4187, 7777, 9995, 8419, 4340, -514, -5431, -7841, -7554, -6275, -4788, -3774, -1584, 2416, 7175, 10327, 8218, 3457, -1389, -4933, -6309, -5612, -2978, -273, 2238, 4609, 4995, 3698, 1503, -1598, -4453, -6516, -7515, -8237, -6986, -4738, 371, 8708, 13539, 15370, 11961, 5787, 2154, -1399, -3486, -6133, -8630, -10073, -10136, -7534, -3346, 783, 2814, 5078, 6111, 5854, 5338, 4412, 2818, 2804, 3980, 3795, 2367, -1712, -6445, -8269, -8296, -5748, -940, 2637, 4954, 4917, 4246, 3401, 1627, -180, -1940, -3596, -4955, -4832, -3102, -411, 5547, 10843, 12398, 10090, 2341, -4729, -9018, -11001, -10467, -8727, -6573, -3376, 1810, 7831, 11472, 12795, 10177, 4954, -941, -6937, -10674, -12831, -11013, -6288, -436, 4466, 7936, 10636, 10990, 9343, 7001, 3174, -2291, -7116, -9832, -11379, -10728, -7266, -3970, 344, 3963, 6047, 7181, 5998, 4009, 3984, 4810, 4142, 3204, 427, -2117, -2383, -2892, -3347, -2936, -3678, -3826, -3975, -4622, -3326, -1772, 1360, 4882, 5054, 3432, 2260, 732, 605, 2264, 3603, 4299, 3909, 2835, 235, -2430, -4923, -7794, -7835, -7233, -6519, -5559, -4151, -888, 3153, 8295, 11652, 12144, 8958, 2950, -2243, -5305, -5433, -4310, -4676, -5141, -4021, -849, 2942, 5489, 6457, 4782, 1841, -1490, -4479, -6157, -6981, -5936, -3600, 759, 4817, 7100, 7518, 5043, 3336, 1319, -628, -2758, -4800, -5069, -3377, -591, 2490, 5127, 5162, 3204, 700, -2215, -4793, -6743, -8300, -7298, -4510, -1088, 1223, 2743, 3694, 5985, 8688, 9811, 8093, 4266, 363, -2820, -4454, -5507, -6646, -8405, -9807, -10195, -8236, -4541, 309, 5756, 10954, 14289, 13801, 10138, 5213, 111, -2677, -5385, -6958, -7379, -6979, -4009, -1201, 2513, 5477, 5145, 2014, -1020, -4298, -5408, -5952, -4896, -1938, 1635, 5618, 8985, 9855, 7904, 6081, 2548, -1047, -5200, -8640, -9711, -9248, -7072, -4048, -595, 3824, 7102, 7819, 5522, 3384, 1143, -1499, -3169, -5575, -6517, -5566, -3101, 160, 3659, 4989, 4708, 3453, 2252, 1343, 319, -440, -927, -698, -1125, -860, -822, -3391, -5279, -5285, -4138, -1981, 806, 2885, 3477, 4819, 6327, 8226, 8608, 5605, 1636, -1964, -5143, -5684, -5247, -3450, -425, -99, -1118, -1910, -3695, -3858, -1770, -273, 857, 1933, 4441, 6221, 9863, 12232, 11151, 7246, -1491, -8258, -11248, -12173, -11969, -10411, -6106, -1508, 3804, 8114, 9321, 8595, 5096, 2303, 185, -1527, -2728, -4603, -5318, -4134, 1316, 7184, 8473, 7592, 3697, -1109, -4071, -6815, -8150, -8491, -8921, -6923, -1795, 3057, 8746, 11552, 9993, 6839, 2242, -2602, -5761, -7215, -6725, -4520, -2592, -961, 137, 2029, 4667, 6503, 6681, 4502, 130, -4268, -6163, -6788, -5474, -2548, -1657, -2435, -3206, -2476, -306, 3339, 6908, 8425, 9538, 8705, 5976, 2797, -2097, -5647, -7994, -10107, -10456, -9496, -5934, -2426, 3042, 7715, 10184, 9368, 3923, 641, -1163, -601, 953, 1258, 1018, 621, 981, 2769, 4429, 4472, 796, -4695, -9065, -12205, -11807, -9900, -5833, 557, 7432, 13258, 14659, 11289, 6885, 3855, 1457, -2027, -5455, -8531, -9951, -9126, -6213, -711, 3570, 4672, 4145, 1375, -1888, -3879, -5531, -5310, -2787, 1332, 4216, 6589, 7502, 6769, 6707, 4148, 191, -4505, -8645, -10502, -9813, -4975, -126, 4243, 6741, 5568, 4785, 3388, 1705, -703, -2980, -4459, -3797, -1875, -646, 1398, 2431, 3233, 3040, 2725, 3841, 4762, 4615, 3450, 2182, -520, -3050, -5314, -7428, -8465, -9049, -8406, -5240, -938, 4538, 10101, 10825, 10576, 9322, 6174, 3536, 67, -3910, -7777, -9895, -8173, -3262, 2111, 5517, 4695, 1432, -3634, -6889, -8123, -7073, -4435, -3159, -1848, -396, 4225, 10785, 16996, 17332, 10767, 2928, -4160, -9433, -13499, -15172, -14050, -10640, -5267, -726, 4212, 8030, 8497, 9513, 7488, 4250, 1182, -3162, -5678, -4575, -123, 4007, 4742, 3350, 1007, -1550, -2034, -2815, -3473, -4305, -3619, -2374, -975, 1085, 197, 478, 1441, 2305, 2629, 99, -2814, -2183, 1223, 4516, 5990, 3960, 235, -1432, -2525, -2526, -570, 679, -72, -1445, -2058, -1666, -2102, -4621, -5199, -4826, -3631, -1406, 177, 1407, 5805, 14090, 18424, 16052, 8611, -443, -7115, -10323, -11469, -10734, -9017, -7901, -4057, 698, 3649, 6782, 6468, 4138, 1069, -2574, -3695, -4047, -2764, 914, 5708, 9965, 10742, 8902, 4642, -369, -5093, -8705, -11340, -13238, -13315, -12472, -7646, -1859, 5214, 12250, 13762, 13909, 11590, 6994, 1608, -3896, -6052, -7267, -7430, -6431, -5466, -3139, -295, 4050, 7863, 8993, 6140, 360, -3864, -6111, -4881, -3763, -4533, -4941, -5516, -1068, 4114, 8727, 13817, 13714, 10009, 3674, -2553, -7956, -11388, -11279, -9229, -5152, -512, 1690, 4281, 6792, 7155, 7868, 3960, -2525, -7235, -8960, -7773, -4416, 1151, 7118, 11956, 13198, 11230, 7943, 2183, -2988, -6661, -10615, -11526, -12315, -13291, -11597, -4934, 3824, 11954, 14646, 10511, 8435, 4949, 3412, 4474, 2990, 1268, -2479, -4777, -6591, -7989, -5850, -3398, -1353, 355, -413, -1584, -2353, -1521, 2246, 5125, 5950, 1851, -2662, -3299, -142, 6087, 9331, 6420, 2095, -1307, -5641, -7129, -9732, -11614, -9850, -7689, -2011, 3889, 6987, 9476, 11179, 11286, 8078, 614, -8024, -13897, -13679, -9866, -2599, 4860, 8064, 11346, 12286, 11560, 9548, 2041, -5556, -13691, -16552, -15057, -13286, -7425, -519, 9640, 15432, 16845, 14345, 5847, 225, -3359, -5124, -3336, -1847, -2369, -1813, 624, 4656, 8416, 7179, 432, -6569, -10923, -11908, -9841, -6510, -3023, 1349, 5543, 8452, 9863, 9388, 9040, 8871, 6436, 2509, -1537, -8189, -10796, -10471, -9583, -7498, -7802, -7304, -6465, -2155, 3211, 8809, 11928, 11225, 8703, 4360, 1515, -3533, -6262, -7306, -8296, -5791, -2354, 2065, 7695, 10142, 8051, 3572, -4029, -9747, -13713, -14179, -10211, -4414, 2530, 8992, 14472, 15723, 16215, 10821, 1059, -4328, -9171, -11736, -11935, -11588, -8119, -242, 8175, 13332, 13706, 8534, 1531, -4366, -9842, -11721, -10255, -8321, -4705, 364, 5765, 11337, 13567, 12046, 8770, 5242, 565, -5325, -10155, -11324, -7641, -3871, -1463, -1986, -3971, -3569, -2047, 1192, 4516, 4092, 1900, 3470, 5907, 7513, 8528, 5723, 2258, -901, -2590, -1991, -3655, -5118, -3946, -2300, -2945, -3784, -6536, -8943, -8566, -4900, 2072, 6990, 11074, 12867, 13908, 12878, 9386, 4339, -3728, -12036, -17285, -16889, -13143, -7812, -2053, 4784, 10778, 12948, 11639, 5329, -1796, -5892, -8317, -8984, -8707, -7230, -2042, 5714, 12663, 17187, 14413, 6803, -1765, -7639, -8431, -8034, -9069, -8879, -6449, -3414, 4536, 9966, 9768, 8115, 5104, 1435, -2812, -5965, -8368, -6927, -1858, 2816, 6926, 9158, 8191, 6896, 6154, 4816, 2416, -3355, -8725, -12754, -12379, -8810, -6632, -3383, -838, 3479, 7703, 11053, 11761, 10797, 9977, 7208, 4445, -2151, -7919, -11143, -13657, -12325, -7784, -3032, -625, 3938, 6310, 5038, 3713, 93, -2278, -2795, -5171, -4354, -215, 3305, 9822, 13031, 10580, 6023, -2994, -10785, -14295, -15047, -12519, -10338, -7566, -1904, 5827, 11256, 15510, 15896, 9958, 4909, -3217, -8873, -10595, -10550, -6775, -2960, 2538, 6380, 8810, 9968, 6665, 4210, 1171, -4660, -7820, -10074, -11136, -8744, -4440, 2692, 8773, 9735, 9560, 8205, 4614, 1750, 8, -2200, -2287, -2607, -2204, -526, -36, 3124, 4452, 4327, 2410, -2016, -6519, -9402, -9513, -5526, -1681, -1899, -1008, 1264, 5408, 10805, 14532, 14174, 11028, 5554, -949, -6351, -13010, -15135, -14322, -12376, -7687, -2279, 3613, 8586, 14764, 15966, 13568, 7309, -3209, -7451, -9665, -9489, -6721, -2693, 3023, 6987, 8635, 9279, 7684, 2695, -1970, -7347, -11594, -11681, -10061, -7789, -3088, 3285, 10422, 14753, 11420, 6445, 1380, -3828, -7195, -8835, -7935, -6905, -4843, -3397, -1356, 3366, 5566, 5687, 1727, -2669, -4178, -5762, -6091, -5237, -1858, 1742, 299, -2120, -2753, -522, 3922, 6709, 8204, 6937, 4799, 462, -2082, -3084, -5328, -6509, -8025, -8994, -7078, -2334, 2925, 10801, 13988, 12878, 6841, -1275, -4597, -5473, -4321, -2545, 87, 3426, 7925, 10143, 7985, 5209, -1187, -8774, -11657, -15697, -14994, -11644, -5230, 6335, 15518, 22269, 21006, 13496, 5092, -2673, -7353, -9941, -13265, -14351, -13067, -7070, 1515, 9858, 16201, 14205, 7482, 779, -7946, -11860, -11446, -9003, -3414, 1574, 5116, 6876, 10448, 10215, 7685, 4083, -1695, -6834, -11191, -12832, -10538, -4213, 1155, 5054, 4206, 1304, 52, 919, 4620, 4781, 2471, -70, -1285, -3203, -2477, -1759, -3601, -3213, -3650, -936, 1408, 2461, 5045, 6698, 6718, 4925, -2524, -10762, -14662, -14969, -9795, -1995, 5602, 10553, 13377, 13609, 14026, 12836, 3723, -4633, -12280, -17811, -14598, -10824, -4355, 3940, 9190, 11775, 11386, 8290, 1502, -4755, -8247, -6690, -3461, -2022, -2188, -960, 7297, 15870, 18460, 12605, 1955, -7282, -13850, -14534, -12841, -7583, -2542, 1987, 5783, 7289, 10268, 9106, 8408, 3685, -1390, -3649, -9181, -10728, -6281, 1590, 7008, 8678, 5857, 1949, -982, -3230, -3528, -3664, -5848, -7893, -8310, -4403, 2861, 6057, 6706, 5786, 3923, 2917, 1077, -2301, -4289, -2510, 325, 1817, 372, -3930, -5171, -4224, 98, 5058, 8182, 7947, 2726, -1158, -3403, -3779, -4610, -4464, -5901, -6126, -1801, 2995, 9579, 16641, 17463, 12516, 4185, -6355, -12313, -14595, -14850, -11726, -8389, -6911, -1934, 5618, 11726, 17177, 15699, 7879, 830, -7105, -10341, -10335, -9232, -4350, 985, 8376, 8675, 7876, 5631, 2389, 221, -4442, -7788, -11755, -13611, -12316, -5345, 1152, 7894, 10695, 10349, 9133, 4098, 1724, -1010, -3723, -4763, -5271, -4986, -4900, -4646, -1294, 1842, 4480, 5643, 3132, 394, -1975, -3136, -2108, 1856, 2227, -1784, -4942, -7033, -3951, 2164, 7905, 8639, 7235, 5053, 2875, -310, -6304, -8650, -7507, -6040, -2834, -1161, -1279, 3361, 7409, 10861, 9994, 3061, -3470, -8430, -11823, -9301, -2108, 2625, 5880, 9601, 12509, 12907, 7144, -1422, -8217, -14148, -17521, -17294, -12002, -5345, 4619, 14120, 21036, 22370, 12775, 1907, -8094, -15700, -12548, -8574, -5471, -1818, 496, 6464, 11028, 13205, 10462, 3561, -4519, -10837, -13809, -12086, -9514, -4038, 2848, 8370, 13606, 11942, 8061, 3938, 859, -964, -3204, -7600, -8789, -6716, -5226, -1077, 2516, 4456, 3832, 903, 910, 936, -160, 689, 1259, 1641, 2444, -2064, -7227, -6931, -4822, 762, 6173, 7382, 9482, 8411, 3777, 1499, -2336, -4846, -8437, -13272, -14742, -11624, -4305, 5068, 15589, 20881, 19374, 12921, 1382, -7390, -11508, -14578, -13738, -10205, -3664, 4296, 10519, 13078, 15509, 12821, 2432, -7698, -14839, -18880, -15062, -8202, -554, 8051, 13791, 16680, 15591, 10631, 3396, -1204, -7807, -12975, -15109, -14376, -9296, 209, 6931, 11733, 13014, 8118, 4185, -2240, -5511, -7543, -6155, -2484, -1111, 925, 1511, 3729, 5412, 4313, 5124, 3227, 169, -3689, -8420, -7683, -3166, 144, 1561, -1123, -4923, -3724, -1355, 2582, 6431, 5690, 4107, 2034, -762, -105, -1294, -5365, -5829, -5039, -2956, -246, 3153, 7378, 10455, 10221, 4240, -3979, -12421, -16236, -16507, -12715, -4052, 5047, 11453, 16030, 18261, 17034, 13427, 2546, -7751, -14530, -18634, -19282, -15453, -7214, 1839, 10697, 14880, 15336, 13065, 4014, -3441, -7339, -8319, -6088, -6352, -5436, -1993, 6725, 15015, 18571, 14092, 3741, -3991, -11244, -12840, -9988, -7914, -4963, -2649, -529, 1457, 5132, 8052, 9302, 9442, 5595, 1746, -3127, -6788, -6348, -3811, -1736, -86, -412, -2199, -2343, 587, 3594, 4432, 2412, -1113, -2914, -5597, -3337, -2210, -3184, -2573, -3808, -1865, 550, 4322, 9612, 11834, 10590, 5346, -1587, -9073, -12533, -12191, -8859, -965, 3417, 4311, 4313, 3097, 2555, 1789, -564, -3113, -6688, -8034, -6105, 144, 9487, 15156, 18000, 15010, 8148, -1603, -11794, -15546, -16538, -14244, -10346, -6280, -348, 6509, 13546, 18874, 17211, 8702, -76, -7455, -11032, -10106, -5088, 212, 3655, 6107, 6659, 5320, 4017, 2182, -401, -3611, -7984, -10157, -11172, -8205, -2733, 4282, 9107, 10776, 10094, 6759, 3809, 1068, -653, -2972, -4103, -4456, -4323, -6668, -6310, -2960, 733, 3825, 3737, 1882, -131, -427, -1802, -201, -411, -4202, -7426, -8783, -6612, -702, 6523, 13934, 19173, 17224, 10915, -559, -12291, -16855, -16725, -14433, -11878, -8761, -5396, 2487, 12027, 16078, 18492, 13202, 3837, -3566, -11499, -13928, -11175, -4247, 2307, 8286, 12581, 12668, 10823, 4426, -5171, -12263, -15139, -15620, -13085, -10980, -4210, 4338, 15084, 24038, 18080, 10015, 1946, -4512, -5210, -5874, -3717, -3302, -2345, 554, 979, 2322, 1004, 920, 531, -888, -2928, -5638, -6357, -4405, 1981, 9774, 9892, 4704, 1140, -1631, 185, 3236, 6002, 4932, 397, -3519, -5506, -6051, -6915, -6547, -5662, -4478, -1163, 1562, 3548, 5880, 8191, 10181, 5877, -686, -7208, -11738, -7904, -1570, 3669, 7301, 9884, 9993, 5701, 2005, -4342, -9894, -14917, -19260, -18904, -14590, -6127, 6413, 19532, 26498, 26706, 17972, 5213, -6358, -13004, -14280, -13719, -11100, -6822, 167, 5980, 10491, 13339, 11918, 7060, -746, -9174, -14391, -13370, -10125, -1057, 7346, 11348, 13363, 8631, 5020, 4117, 3792, 2852, -2020, -6981, -9088, -8121, -4187, -2372, -546, -2376, -4868, -2966, 510, 4925, 7206, 7896, 9433, 7698, 3364, -1664, -8373, -9906, -9063, -5516, -1318, -482, 2682, 6432, 7741, 8628, 3772, -4283, -11660, -17658, -15805, -10699, -3053, 6376, 15262, 19873, 18754, 13481, 3185, -5724, -9878, -12700, -13607, -14099, -12418, -5544, 4695, 15193, 19060, 13840, 2124, -8047, -13292, -13130, -9264, -4435, 323, 5507, 11473, 14428, 15735, 13335, 6480, -1759, -9635, -16051, -18269, -15571, -10251, -1364, 6647, 10196, 9745, 4836, 2973, 1989, 2336, 3495, 234, -3394, -6007, -6473, -3158, 2369, 5155, 3840, 423, 36, 564, -46, -413, -349, -105, -828, -3542, -7922, -8777, -5626, -792, 7068, 11948, 11115, 9630, 5693, 3392, 2440, -3208, -10213, -15564, -16318, -10130, -4011, 4863, 14313, 16790, 13902, 5823, -4165, -11562, -15556, -14974, -10637, -4408, 1981, 7626, 14116, 18178, 20554, 16397, 3818, -8891, -18546, -22012, -20202, -14758, -6204, 540, 7505, 10577, 13777, 15915, 10499, 5390, -1713, -7491, -10232, -9644, -6599, -1945, 3970, 7813, 9364, 6139, 970, -2434, -5304, -6582, -5391, -4042, -3644, -2084, -2850, -282, 4956, 6690, 7558, 6502, 5056, 4604, 4147, 1210, -785, -2893, -2841, -4716, -6328, -6493, -5955, -865, 4462, 9904, 8487, 4018, -888, -3237, -3171, -4335, -5420, -5310, -2555, 3953, 8820, 12161, 14620, 12020, 5900, -3136, -9960, -13320, -14647, -14499, -9916, -3234, 3969, 10149, 14012, 13902, 10922, 4744, -2883, -7630, -13164, -13562, -8735, -1601, 7119, 12370, 14057, 12673, 7550, -146, -9627, -16153, -17082, -14256, -11551, -7087, -484, 6987, 12824, 16819, 18355, 13893, 6936, -1587, -8306, -10410, -9583, -8727, -5620, -4039, -1818, 3179, 4632, 6659, 7522, 3582, -700, -4285, -6793, -5792, -3892, -1952, -313, 207, 1778, 4439, 8008, 10954, 9150, 3892, -546, -3944, -6508, -6849, -9525, -9295, -5907, -4051, 250, 4316, 6760, 9363, 12614, 10488, 6404, -1439, -9755, -13529, -13919, -8379, -1075, 4207, 7865, 12967, 15171, 12032, 3959, -5621, -12607, -15323, -15782, -13523, -8813, -2781, 6122, 14720, 18681, 17488, 9533, 1162, -3959, -6719, -5985, -7146, -9480, -11155, -5073, 2990, 10124, 13869, 8009, 1507, -5098, -9731, -9448, -8846, -7084, -2189, 4067, 8293, 8865, 7935, 7541, 7757, 3480, -2423, -9040, -13794, -13633, -10143, -3441, 3055, 5467, 3010, 1838, 1586, 2871, 4054, 1881, -1672, -2502, -3034, -2081, 659, 702, 1315, 973, 2156, 4197, 2998, 98, -431, -1296, -2026, -3108, -7302, -9407, -7989, -3427, 3042, 9484, 12116, 13367, 10074, 5592, 3226, -2713, -6878, -11210, -14565, -9799, -2696, 3077, 9347, 14160, 14356, 10717, 3698, -7285, -13129, -15439, -15088, -10552, -5570, 1951, 9824, 17172, 23151, 21142, 11009, -1577, -12524, -18217, -18892, -15718, -11508, -3959, 2325, 6834, 11660, 12505, 9471, 5288, -771, -5147, -6982, -7882, -6687, -2611, 3118, 6468, 8575, 6525, 3549, 226, -1810, -4169, -5288, -5558, -6446, -6281, -4296, -1382, -1339, 1710, 3375, 5365, 7534, 6417, 4636, 5377, 5301, 3819, 224, -8632, -10191, -9731, -8632, -3719, 1454, 6790, 9034, 8404, 5378, 792, -4376, -5818, -6320, -6726, -4749, 408, 5489, 13424, 19256, 17059, 9493, -3684, -12208, -16227, -17904, -14354, -10011, -4949, 4412, 12874, 18202, 18096, 12565, 2815, -6257, -12435, -15894, -14720, -9429, 351, 10377, 16237, 17914, 14618, 6612, -81, -7988, -13130, -15291, -15495, -15476, -10217, -1437, 6146, 16656, 16455, 13035, 9022, 2928, -412, -4588, -6731, -5223, -2872, -1605, -1169, -1516, -2525, -2445, -20, 2189, 2019, -610, -2720, -3718, -114, 297, -1955, -4612, -6719, -1347, 4225, 11312, 17633, 18317, 13887, 4226, -7207, -14601, -20432, -22200, -18704, -10545, -1434, 5997, 13445, 17220, 21180, 17074, 8265, -192, -10914, -16441, -16948, -12857, -2211, 8625, 15168, 15926, 12320, 7590, 262, -7290, -12821, -14943, -14134, -11803, -4883, 2122, 8978, 15488, 14330, 10609, 4658, -1295, -4778, -7264, -5993, -1001, 1757, 2531, 2059, -1147, -1699, -2220, -2587, -3038, -6098, -9415, -5920, -676, 5109, 8754, 6517, 2548, -1210, -2044, 357, 5275, 5986, 6113, 5973, 1984, -2624, -8034, -12716, -13645, -13845, -10128, -4738, -780, 6706, 12700, 16344, 16049, 8832, 347, -8754, -14305, -12353, -5848, 1464, 5661, 9925, 12678, 13512, 7553, -3711, -11633, -18024, -20883, -17949, -12808, -2381, 9768, 21644, 28205, 25462, 16674, 2805, -7339, -12528, -14723, -13206, -11537, -8131, -2429, 4367, 11869, 10771, 7203, 1314, -6530, -9006, -10252, -8428, -2057, 3263, 8446, 10503, 6504, 2844, -170, -190, 2241, 2262, -1577, -1933, -3144, -991, 1903, -1993, -4112, -8358, -11054, -8387, -4004, 1497, 8401, 12318, 13074, 10041, 3948, -555, -2479, -4419, -5590, -4268, -322, 6034, 8572, 8426, 4560, -3423, -10157, -15041, -16697, -16245, -11936, -2541, 7857, 19365, 24691, 23117, 17035, 7233, -2471, -11804, -16680, -18607, -17255, -10349, -1138, 6647, 11977, 12833, 8659, 1099, -6123, -10503, -11048, -8498, -4421, 1827, 8568, 13530, 15201, 12591, 6082, -57, -5943, -9912, -13169, -12482, -8149, -2770, 4238, 5862, 3788, -1, -210, 2222, 4491, 4861, 3022, 1617, 2475, 2051, -47, -1032, -5084, -4237, -1816, 1644, 6529, 7638, 6263, 5078, 956, -3657, -8793, -16164, -16882, -14426, -6940, 3763, 14142, 19873, 19518, 14867, 9909, 3613, -5177, -11830, -17859, -17373, -11478, -3826, 2769, 9660, 12953, 8714, 3324, -4227, -11377, -12305, -10707, -5374, 1719, 8247, 13901, 15668, 15300, 11681, 5364, -3487, -14241, -20285, -19733, -14695, -6399, 2204, 8483, 7470, 7685, 7833, 5773, 4559, 113, -2662, -2927, -776, 1135, 2609, 1821, -663, -2199, -2122, -997, -1471, -1634, -477, 978, 3556, -58, -7103, -9474, -8812, -3635, 2099, 7863, 12676, 12643, 11287, 9570, 4329, -1201, -8147, -14410, -17665, -15583, -7629, -279, 7838, 14647, 17200, 13254, 5113, -3633, -10716, -14305, -15102, -12244, -4572, 4435, 13099, 21433, 21531, 14557, 6251, -4441, -12658, -17793, -18944, -17661, -11735, -3574, 4506, 11623, 12868, 14583, 11983, 6215, 1889, -2446, -4724, -3820, -1853, 1260, 447, 206, 1987, 738, -295, -2143, -4754, -5733, -4046, -1828, 768, -2700, -4992, -2640, -165, 3966, 8862, 8822, 8490, 9032, 8338, 5176, -3188, -9748, -14659, -14841, -11786, -6855, -29, 7130, 11460, 10502, 7689, 2289, -3288, -6753, -11354, -11344, -6941, -1949, 5570, 14731, 18834, 18544, 12460, 1174, -8440, -17366, -21472, -21583, -16233, -9278, -1177, 7725, 16736, 19685, 16354, 11970, 2264, -4314, -7947, -11682, -11306, -6846, 544, 8033, 12485, 12507, 6062, -1099, -6312, -8891, -9337, -9352, -8691, -7859, -2726, 2341, 6467, 11131, 11409, 9217, 6269, 1134, -1297, -73, -1860, -3670, -5824, -7727, -5730, -4193, -4213, -1010, 2806, 4536, 5979, 3231, 2825, 519, -3815, -4179, -7199, -6255, -2204, 1535, 10762, 15884, 14834, 12032, 2096, -7198, -12977, -17188, -18372, -15291, -9357, -2725, 9026, 15472, 17936, 15320, 7437, 2186, -5123, -9316, -12243, -12132, -4091, 4989, 13459, 18420, 13226, 6161, -2474, -12112, -16091, -17762, -16441, -13229, -5490, 5392, 16902, 24236, 23241, 18000, 8702, -2031, -11858, -16696, -14915, -11705, -5871, 1287, 8445, 11844, 9680, 6283, 2216, -1236, -3659, -8861, -12185, -9579, -5249, 1663, 6524, 8790, 8046, 5759, 3606, 4389, 5933, 3655, 3340, -780, -6660, -10686, -14680, -14268, -10570, -4633, 2786, 9951, 13740, 13565, 8604, 2715, 745, -3394, -9167, -13212, -12546, -5015, 7951, 17114, 20860, 16991, 5926, -4685, -14197, -19174, -19015, -18302, -15392, -6747, 4345, 15873, 21089, 21557, 19034, 11480, 164, -8713, -14075, -15943, -12281, -4487, 4658, 8789, 8239, 5444, 2912, 290, -2533, -7435, -11776, -11731, -8300, -972, 7738, 13865, 15319, 11998, 5001, -2866, -6363, -8273, -7697, -2300, 1758, 1805, 28, -2207, -2176, 1636, 3797, 3584, 1357, -2236, -3158, -3817, -3947, -2501, -3852, -3267, -3376, -781, 10227, 18173, 19928, 14610, 2491, -6101, -11504, -16229, -19890, -20592, -15712, -6680, 5739, 14346, 19807, 18969, 15215, 10272, 339, -8179, -16476, -19648, -12194, -510, 9393, 15333, 15620, 11745, 3987, -4067, -11053, -15811, -17688, -15735, -10264, -1907, 7701, 12065, 15592, 16435, 13980, 10065, 1673, -6023, -9848, -8500, -6120, -5061, -3665, -4657, -4362, -2869, 584, 4786, 4847, 3922, 2668, 3567, 2518, -1265, -3157, -6558, -6461, -6403, -4660, 4789, 11954, 14718, 13408, 7965, 18, -7654, -14191, -18768, -16701, -9674, -1071, 8639, 14711, 14205, 9227, 3810, -587, -6161, -11545, -14643, -12018, -1076, 12159, 20223, 22271, 16449, 7155, -3493, -13888, -20324, -24189, -23834, -18257, -7990, 7245, 18746, 24508, 24963, 18299, 11620, 1446, -8303, -13707, -15224, -10207, -2717, 3548, 7292, 6121, 2687, -70, -2760, -4723, -8079, -9226, -7207, -1075, 6013, 7410, 7654, 7715, 5081, 3211, 3396, 1411, 1096, 1762, 2725, 2436, -4514, -10355, -16016, -16672, -11324, -4550, 3382, 10954, 14812, 14737, 14465, 9567, 2224, -5791, -14541, -20613, -16456, -6980, 4861, 16040, 21597, 20862, 12241, 2438, -7627, -17241, -22133, -22464, -17776, -7444, 1300, 10882, 19749, 23476, 20141, 10478, -2346, -15049, -16102, -11557, -4838, 5675, 9703, 10453, 9055, 4375, 1563, -3923, -10179, -15925, -19986, -16073, -8134, 2792, 14687, 20852, 20849, 15387, 5808, -1445, -4321, -4259, -4724, -4240, -2273, -2695, -4401, -8174, -8488, -4573, -1286, -514, 1060, 3608, 6691, 7772, 5950, 3642, -2003, -6874, -9585, -7109, 1473, 12430, 17924, 15552, 5694, -3233, -10597, -17558, -19421, -18593, -13202, -5313, 5838, 14203, 21677, 23914, 19745, 12861, 271, -12621, -20866, -21121, -16006, -4560, 6735, 14008, 15480, 13458, 10831, 3144, -4500, -11884, -18167, -18412, -13566, -5225, 4536, 12029, 14589, 12983, 8116, 3280, 631, -1157, -3811, -2985, -1054, -265, -1487, -5411, -5693, -5903, -4489, -2192, -4228, -4388, -2692, 141, 7152, 9834, 8522, 4190, -819, -2754, -2121, 2664, 5095, 6958, 6726, 3261, -1276, -7336, -12141, -13796, -13928, -11378, -7697, -878, 9878, 15749, 20167, 17917, 10018, 2627, -6273, -12372, -13507, -9813, -2276, 5902, 8802, 9900, 8489, 1518, -6336, -11129, -14707, -16413, -14159, -8925, 1026, 10872, 19935, 24358, 20932, 15022, 5334, -6249, -14059, -18731, -15961, -10418, -5641, 3424, 7397, 7143, 5973, 4602, 2633, -2613, -7709, -10239, -7970, -996, 6525, 8959, 6728, 3526, 2215, 1385, 503, 2429, 5244, 5323, 5248, 330, -7353, -11616, -16032, -14544, -10200, -5674, 858, 7217, 12818, 16208, 15719, 12345, 5609, -3996, -10757, -12855, -9916, -3991, 3647, 7933, 9962, 8223, 1404, -4693, -11461, -13838, -13557, -12740, -9369, -4845, 4410, 15374, 24023, 26482, 18434, 6824, -4621, -10287, -10304, -7250, -4244, -5427, -2781, -2402, -2721, -1399, -1541, -110, -480, -2339, -2371, 28, 4732, 10799, 10365, 8003, 4425, -979, -2456, -3057, -783, 2381, -481, -2681, -4977, -9588, -9950, -9494, -6099, -1787, 290, 2611, 5825, 11078, 15173, 11610, 4524, -3870, -11876, -13968, -11519, -3812, 3302, 8305, 11193, 10279, 6915, -1122, -6685, -10756, -14547, -14002, -14632, -10364, -28, 12809, 22898, 24502, 18915, 9644, -188, -4600, -6511, -8684, -9992, -10129, -6331, -2743, 4545, 7382, 7503, 6571, -331, -7283, -12052, -12476, -5036, 2465, 5703, 8515, 10042, 12234, 12815, 11328, 3866, -2877, -9107, -12572, -11146, -9392, -8684, -8792, -6537, -4455, -4843, -3319, 1292, 5503, 13594, 16299, 14879, 9098, 2251, -464, -3420, -4944, -4167, -5464, -4872, 829, 3881, 3699, -1675, -5246, -6822, -8427, -10770, -8565, -4073, 3197, 11210, 18178, 21907, 12920, 6355, -897, -7415, -8403, -10751, -13102, -12268, -5476, 3440, 8207, 9872, 6248, -324, -6906, -10698, -9479, -7111, -3609, 1343, 8451, 15405, 19108, 17778, 13277, 4244, -4277, -13023, -18213, -18575, -13771, -7788, -1606, 5666, 5244, 7102, 5665, 2000, -126, -2916, -3636, -2233, 841, 5069, 9358, 9605, 7120, 3662, -520, -3503, -4049, -3870, -2115, -3684, -4216, -5997, -7837, -5489, -8051, -6650, -1548, 3234, 12460, 19187, 19159, 19047, 13495, 4435, -2357, -11073, -18014, -21734, -18878, -12795, -1825, 8357, 13338, 14052, 8776, 3133, -4579, -8918, -10748, -11957, -8053, 540, 11171, 20515, 22302, 18597, 9336, -3608, -10683, -18713, -21160, -20671, -18688, -8685, 1071, 13018, 15367, 12990, 9520, 4890, 1874, -4319, -6232, -5297, 772, 6110, 9432, 7666, 1832, -4153, -8836, -9074, -9169, -8942, -5258, -479, 7101, 11504, 6744, 2043, -4030, -6848, -6052, -4182, -1740, 5702, 13129, 14889, 13583, 7772, 455, -7017, -11525, -14580, -14072, -10047, -2137, 3659, 7579, 7848, 2560, 1124, -2505, -6274, -6454, -4567, 3229, 12096, 16899, 20768, 16962, 7332, -1607, -10921, -19511, -23665, -21320, -16427, -5892, 4038, 10156, 13808, 12815, 13097, 8482, 387, -3727, -7944, -6577, -2713, 2767, 9473, 9220, 5245, 1179, -4371, -9303, -11509, -11776, -10120, -6869, -2037, 1736, 5837, 6359, 5365, 4569, 2884, 4716, 5895, 4125, 4185, 6253, 4528, 559, -7136, -15617, -19263, -17042, -9516, -1743, 6378, 10796, 11417, 12590, 10456, 5059, -2008, -9949, -14404, -15412, -9971, 725, 11013, 19382, 20386, 14086, 5002, -4637, -10953, -14176, -14215, -11031, -10029, -8117, -2326, 4883, 11692, 15368, 14071, 9173, 600, -4374, -1895, 615, 2043, 1183, 74, -748, -1259, -930, 379, 10, -1817, -5948, -10227, -6771, -2471, 1568, 5396, 5428, 5859, 4937, 596, 1985, 7741, 9847, 8718, 7319, 3253, -3427, -10537, -15079, -15453, -13466, -9583, -7549, -926, 5692, 10075, 14242, 13395, 9541, 3301, -4856, -8848, -4754, -885, 483, 4129, 5943, 5311, 3018, -2822, -4939, -8053, -11834, -12989, -12643, -7849, 123, 9036, 19022, 21844, 14807, 7791, -3583, -9339, -9644, -13468, -12579, -7859, -2005, 4665, 11050, 15875, 13369, 5405, -2565, -10336, -15527, -17906, -14924, -8036, 2189, 11865, 15053, 14160, 11786, 10155, 7234, 2058, -4503, -7420, -8190, -6042, -3067, -2658, -921, -1106, -2822, -4882, -5869, -4087, 1477, 6523, 10281, 9022, 4410, 719, -2846, -1606, -1146, -162, 3216, 5572, 6851, 5392, 1358, -4062, -7922, -11184, -15857, -17034, -16319, -7566, 6623, 16031, 23597, 23264, 18163, 12455, 4654, -3992, -12977, -17424, -17762, -12652, -5078, 5262, 15683, 12548, 8292, 3509, -5287, -9667, -13998, -14531, -8601, -23, 10743, 16053, 15358, 12421, 4489, -1396, -5547, -8943, -9836, -7203, -1312, 4747, 6805, 3860, 642, -5419, -10043, -10733, -9253, -5355, 2896, 9650, 14541, 16448, 10870, 6440, -1482, -8102, -8490, -7039, -5602, -2303, 469, 2277, 3109, 1251, -1603, -9149, -13260, -14229, -11336, -2951, 7411, 15972, 19569, 17357, 11258, 3851, -5045, -12165, -15999, -14165, -8680, -901, 6448, 9862, 11620, 5860, -2039, -8396, -17293, -20004, -16993, -9709, 4401, 16595, 22620, 24883, 21133, 13026, 1354, -9626, -17614, -21553, -21744, -16657, -6358, 3739, 12418, 14778, 12102, 9043, 1876, -4341, -4880, -4850, -653, 3889, 5421, 8051, 7178, 3188, 1088, -1424, -2606, -3200, -3838, -3652, -696, 3411, 4501, -712, -5746, -8958, -9833, -3940, 2624, 10415, 14123, 14950, 12600, 8623, 2414, -3155, -9074, -14353, -15965, -12695, -7317, -34, 9674, 14270, 17017, 10089, 925, -10038, -15754, -15094, -10172, -3858, 394, 4949, 10466, 18477, 19096, 14235, 5367, -7476, -15981, -16097, -16902, -12098, -6020, -1039, 5574, 7555, 5551, 2431, 1239, 2292, 1928, 2498, 2472, 782, 3949, 6899, 6182, 2442, -3389, -9890, -12508, -11073, -6968, -2250, 3468, 4805, 6342, 5014, -190, -1054, -640, -909, -1318, 2184, 3107, 6186, 9748, 9830, 6402, 596, -5608, -12852, -14598, -13713, -9202, -797, 7861, 13246, 11665, 5144, -2089, -3929, -3573, -4991, -4808, -5622, -3871, 3171, 10678, 16057, 12731, 3224, -3767, -10529, -14881, -15354, -13548, -8042, -1717, 7446, 12972, 14659, 14452, 8367, 3125, -2744, -10450, -13071, -13008, -5963, 4409, 9894, 13333, 13034, 9196, 2179, -4038, -9516, -11848, -11243, -7548, -3524, 698, 2784, 2309, 3351, 3994, 7220, 8116, 5003, 3676, 3095, 1704, 1336, -2238, -5257, -11247, -14841, -14486, -8719, -93, 8139, 14938, 12850, 9578, 2300, -3186, -4195, -6305, -9221, -9374, -7654, -362, 9718, 16789, 18820, 12427, 2421, -8017, -16620, -19933, -17831, -13958, -6334, 2667, 9696, 15079, 17316, 16468, 13173, 5435, -4845, -11667, -14393, -13962, -6932, 1173, 8474, 10130, 6123, 2231, 36, -882, -2891, -4623, -5683, -2602, -498, 3575, 5012, 3224, 2795, -1182, -2339, -946, 1317, 3941, 6397, 9008, 9163, 2427, -6521, -12629, -13768, -9619, -3532, -207, 2454, 3896, 4382, 8383, 8144, 6145, -2146, -9613, -10764, -9724, -887, 6959, 11048, 12776, 7438, 139, -6053, -13122, -14892, -13676, -10534, -4492, 3806, 9209, 13518, 15665, 12063, 6207, -2459, -11268, -14848, -12188, -5624, 3693, 8741, 11274, 10576, 8952, 6361, -793, -7648, -14609, -17707, -15976, -10319, -948, 7389, 15099, 18934, 15143, 11358, 3202, -2721, -5167, -9936, -9499, -7943, -5781, -4153, -2064, 979, 4513, 4162, 1569, 280, 268, 3788, 3790, 5009, 1444, -5524, -8051, -10036, -6955, 789, 6706, 9831, 12319, 12080, 8585, 863, -4972, -8658, -12492, -15887, -15061, -7319, 520, 8649, 14761, 16430, 13477, 5893, 526, -4930, -9854, -9472, -9597, -7042, -326, 7073, 10760, 12653, 10235, 2296, -5339, -12458, -14511, -10799, -8371, -4352, 3085, 8945, 14284, 12977, 10308, 6471, -114, -5358, -9990, -9891, -6042, -2132, 1367, 1760, 567, -114, -990, 628, -51, -2695, -4980, -4812, -2107, 2873, 4714, 2844, 3134, 1789, 1378, 3120, 2117, 111, -370, -1231, -530, -2546, -8376, -10460, -7389, -413, 3909, 6410, 8664, 10074, 11552, 9815, 4129, -5075, -13134, -17776, -16113, -8875, 916, 10177, 16533, 20581, 17755, 9162, -446, -9860, -15437, -18268, -18986, -13997, -8025, 1251, 12642, 19649, 21191, 15594, 6325, -2736, -7007, -7935, -9158, -8570, -7850, -5149, 1592, 7393, 11593, 10619, 3277, -2975, -7022, -9308, -10281, -6128, -742, 2067, 5559, 7583, 7880, 9605, 7849, 3125, 743, -1334, -4362, -3309, -4067, -7299, -6135, -6511, -3847, -2355, 1330, 4889, 8659, 11852, 9166, 4623, -2786, -6316, -7375, -6229, -3412, -1309, 552, 5219, 8000, 9010, 5325, -1985, -6598, -10102, -12141, -13736, -10740, -2824, 7005, 15868, 17870, 13916, 7507, -1245, -7437, -11154, -13685, -13664, -12436, -4086, 5362, 12867, 18560, 13684, 8482, 641, -9018, -13089, -16332, -14136, -10594, -4621, 3807, 10521, 18818, 21574, 17865, 12543, 3345, -6104, -13470, -16673, -14100, -8902, -1249, 4532, 6149, 3213, -1386, -882, 734, 1132, 3158, 2329, 1310, 2567, -60, -655, -543, -3402, -4323, -2169, 2119, 3712, 3967, 3746, 1260, -2887, -7993, -14626, -16968, -13070, -5368, 3235, 11329, 18226, 19038, 19629, 12582, 3445, -4762, -15254, -20489, -21573, -16535, -6747, 5372, 15817, 19078, 13734, 5436, -3332, -8827, -11615, -13304, -12314, -5456, 6268, 15198, 23434, 21494, 12703, 3477, -8362, -14499, -17196, -16477, -10395, -2949, 5109, 11861, 11148, 9232, 4627, -1804, -5732, -9907, -10074, -7767, -2392, 5002, 12184, 14781, 10307, 3245, -353, -2181, -3511, -7034, -8970, -6144, -3284, -2437, -4252, -5012, -4985, -2995, 570, 5508, 8403, 10710, 12535, 13292, 11691, 1137, -8573, -16249, -19327, -14508, -8181, 2243, 12035, 14943, 12123, 6417, -1088, -7481, -12354, -13310, -11822, -7062, 1531, 13559, 27013, 29499, 23828, 11364, -1462, -12051, -20787, -24344, -24302, -19156, -9110, 718, 9443, 16497, 17706, 14686, 8943, 1913, -4842, -9826, -10052, -4667, 1270, 6657, 8017, 4540, 2066, 140, -1463, -3744, -6345, -10409, -8230, -3622, -2462, 116, 723, 4000, 7023, 8559, 7363, 3775, 3176, 3342, 3519, 2760, -3370, -8961, -11700, -10378, -3693, 2402, 4188, 3726, 4107, 2894, 3775, -1205, -5162, -5491, -8437, -7993, -4193, 3022, 14604, 19969, 17825, 11321, 893, -6703, -12546, -17343, -18934, -15991, -9905, 421, 8304, 13849, 14520, 10174, 7241, 584, -8104, -13435, -15197, -8823, 1090, 8194, 13702, 15462, 15748, 12198, 4659, -5515, -15766, -21641, -23241, -19569, -11476, -1658, 7717, 14127, 19210, 19623, 15848, 8490, 532, -2711, -4239, -3525, -4843, -6524, -6859, -5423, -2726, -694, 33, -1441, -463, 72, 1154, 308, -1703, -735, -902, 2210, 6446, 8296, 10588, 12566, 11011, 5553, -2336, -9815, -16102, -19620, -19079, -13439, -5990, 2840, 12891, 15171, 15855, 12355, 5300, 20, -8930, -13624, -15221, -14658, -5451, 6622, 16017, 19264, 15007, 8949, 2845, -4608, -12041, -17346, -19713, -15786, -9030, -1132, 8791, 14828, 17452, 16031, 10984, 4286, -4658, -9846, -8912, -4787, 844, 5320, 5902, 3793, 3963, 3088, 137, -4051, -8896, -13717, -13951, -9322, -2576, 2857, 5888, 9979, 11938, 11644, 10398, 8977, 6019, 6678, 2834, -929, -7595, -17544, -19140, -17822, -12340, -6534, -802, 5130, 9780, 11075, 12975, 11051, 6036, -1491, -9678, -10813, -5488, 2311, 7818, 10482, 9182, 6149, -1743, -9359, -13875, -18038, -18150, -13181, -6696, 2758, 11994, 17812, 23395, 20757, 14136, 5706, -6935, -15006, -18829, -15654, -8689, -801, 7273, 10315, 13372, 11654, 5496, -1501, -7288, -9981, -12927, -13869, -9941, -2198, 9047, 15928, 15615, 13003, 4718, 1853, -672, -4999, -5571, -5559, -5276, -6051, -3403, -1557, 580, 3887, 1351, -2589, -5556, -9062, -6635, -571, 3926, 5282, 3351, -1080, -1683, 3418, 8974, 9591, 7873, 6941, 3405, 1260, -6557, -15638, -18225, -20290, -17728, -10528, -2764, 7252, 17587, 22914, 24946, 19892, 8421, -3117, -11315, -14249, -13707, -8784, -2634, 1182, 4334, 7302, 6542, 4454, 959, -6368, -13624, -14380, -12366, -7940, 1853, 11442, 21485, 23530, 16152, 7161, -1332, -7106, -11142, -12902, -12656, -11119, -6432, 774, 5746, 8166, 8929, 5098, -874, -6432, -9347, -5760, 2067, 5263, 5315, 4097, -283, 644, 4112, 5686, 4129, 1559, -1271, -3324, -1016, -1932, -5606, -7477, -6241, -4152, -3205, -2502, -382, 6049, 13010, 14817, 10500, 1097, -7429, -9704, -6711, -3881, -1121, 3740, 7925, 13412, 13016, 6418, -1252, -9712, -15324, -19960, -21520, -16515, -6876, 7104, 18211, 25520, 27137, 18828, 10928, 2319, -5422, -12372, -17699, -15900, -12284, -5223, 2944, 6085, 8920, 7522, 3293, 432, -4380, -7949, -6944, -3244, 684, 5552, 7682, 8425, 9326, 9184, 4834, -83, -5065, -7398, -5911, -4064, -3093, -5589, -7086, -5913, -2005, 398, 94, -719, 4618, 10208, 9665, 7211, 1919, -2842, -4954, -6220, -5110, -2318, 2099, 6110, 8491, 7323, 705, -6959, -12270, -14222, -13739, -12003, -7989, 1484, 12468, 21220, 22472, 16320, 7853, -727, -7077, -11417, -15246, -13932, -9699, -3334, 5734, 11813, 13810, 10825, 5847, -3133, -13077, -20130, -20651, -13247, -2997, 8933, 17504, 19216, 18990, 16729, 12104, 2818, -6038, -11103, -13734, -12784, -11580, -9208, -5188, -101, 1567, 1807, 2761, 401, 1412, 7467, 11890, 12651, 5623, -2322, -5180, -2851, -465, -1934, -5192, -5348, -1819, 3620, 6279, 2357, -3324, -9886, -13420, -14990, -11784, -7576, 2192, 14378, 19190, 20111, 13101, 4850, 531, -6014, -11357, -14181, -14318, -9063, -2094, 7608, 11624, 8202, 3352, -4513, -10563, -13300, -13467, -9186, -2262, 8374, 15424, 17609, 17644, 14223, 9306, -686, -10640, -14633, -15284, -12067, -6578, -1440, 3041, 5867, 6956, 4407, 1449, -2175, -6527, -7427, -2881, 3375, 6864, 8038, 7320, 8999, 8486, 3908, -119, -2244, 122, 1869, 1662, -2227, -8132, -10872, -12870, -14526, -11514, -5277, -466, 9660, 19979, 25431, 21900, 11978, 1615, -7549, -12758, -15836, -16365, -13770, -5112, 2965, 8741, 10134, 7083, 2110, -3951, -9234, -11235, -11648, -9578, -806, 8783, 18386, 21515, 20046, 14361, 6570, -3576, -13098, -16909, -17313, -13378, -11159, -4394, 2465, 6469, 8894, 6083, 886, -3624, -7079, -4172, 3989, 8818, 10830, 8201, 6167, 3451, 116, -2538, -6188, -9565, -9449, -7011, -1907, 3135, 2760, 1076, -1633, -2952, -4928, -5739, -4176, 3530, 12026, 16462, 14480, 5840, -502, -4955, -6017, -5272, -5954, -6784, -3104, 2629, 7678, 7677, 3877, -1362, -7642, -13826, -15223, -11304, -2536, 9294, 16654, 22641, 22213, 15628, 7653, 155, -6193, -11775, -16369, -17827, -14893, -7226, 3609, 10395, 14009, 11622, 4002, -3542, -8896, -8953, -4467, -155, 4731, 9938, 12504, 13423, 8720, 3220, -3904, -12194, -16396, -15824, -10569, -4240, 3477, 3713, 1722, 511, -1088, -239, 1502, 3566, 5294, 9835, 10216, 5857, 1551, -2999, -7784, -10574, -11848, -10879, -7054, -1016, 4520, 9044, 7531, 1532, -2822, -8035, -10049, -8499, -4148, 1846, 11250, 19302, 20465, 15894, 10417, 1592, -8050, -14315, -19164, -19611, -17016, -5817, 5332, 13789, 18150, 12427, 6534, -181, -7244, -9889, -10135, -8338, -4224, 2425, 11040, 16224, 17939, 12942, 4905, -2716, -10981, -13993, -15383, -12688, -9171, -6636, -2444, 197, 4873, 6406, 6371, 8194, 7970, 6225, 5843, 5009, 4342, 2790, -4129, -8222, -10537, -12129, -9190, -5424, -2244, 593, 2070, 2689, 1380, -736, -1996, -2968, -1455, 685, 1709, 4333, 9543, 13580, 14237, 7647, -2728, -10548, -13773, -15512, -14034, -12399, -8887, 87, 8390, 14337, 13578, 9223, 3681, -1142, -4001, -5898, -6505, -3656, 1247, 6474, 10886, 11644, 7078, 1556, -4046, -10730, -14895, -15231, -13773, -9454, -1411, 8000, 15614, 14657, 11499, 6476, 2230, -2973, -7698, -10390, -9499, -3274, 2467, 8094, 9878, 6931, 2769, -254, -4322, -6974, -9529, -9049, -6368, -2825, -506, -1716, 1306, 5790, 8607, 9743, 9585, 9407, 9063, 7732, 2926, -2076, -8081, -13491, -14359, -15086, -12135, -6239, 3509, 9563, 12988, 15422, 7799, 2682, -704, -4221, -5554, -8308, -6897, -686, 9361, 16708, 16648, 10739, 837, -9015, -16222, -20117, -19008, -15187, -9005, 1248, 11332, 17837, 18419, 15941, 10720, 3099, -2632, -9469, -13917, -11246, -5656, 337, 5252, 5607, 2621, 177, -2381, -4501, -4676, -4105, -4715, -1160, 5064, 6724, 8312, 7471, 3031, -113, -2557, -3982, -3762, 575, 5336, 5057, 2848, -707, -4344, -7060, -6604, -4118, 1475, 6627, 7721, 7784, 3221, -2192, -4520, -6416, -7225, -6693, -5100, -1052, 10396, 20444, 20579, 14675, 3300, -7622, -14242, -17069, -18778, -17935, -13621, -5801, 4926, 14480, 18137, 17686, 13379, 5737, -1553, -7968, -11572, -13219, -8059, -785, 6399, 10735, 8499, 4421, 1898, -952, -4107, -9293, -12686, -9964, -5417, 1084, 4544, 7302, 8128, 6098, 5928, 4343, 2387, 2504, 2948, 3522, -193, -7597, -11406, -13877, -11298, -7259, -3668, 3129, 8563, 12392, 13736, 10336, 5018, 252, -5477, -9830, -10634, -8835, -3858, 4470, 11678, 13690, 9760, 2729, -2252, -6733, -9761, -12547, -13875, -9519, -291, 11434, 17587, 15636, 8496, 1060, -5252, -9285, -10112, -10443, -8970, -3630, 5213, 13186, 16495, 13016, 4556, -3563, -9762, -14844, -17901, -17354, -11226, -2570, 7920, 13600, 14905, 14036, 11499, 8986, 3065, -4100, -9040, -9971, -7297, -2715, 307, 1563, -1278, -3775, -3206, -3092, -727, 3384, 4478, 4009, 1477, -1673, -2473, -4126, -3369, -1002, 231, 5954, 11710, 12508, 11106, 3017, -4532, -11430, -17663, -21239, -20146, -14339, -4590, 9539, 19181, 23042, 19048, 12216, 6151, -1741, -7624, -13152, -17220, -14075, -6900, 4577, 10669, 11343, 11467, 4051, -357, -5423, -10222, -10746, -10553, -5823, -642, 6797, 10423, 10614, 10594, 6081, 2763, -333, -4501, -5717, -2651, -908, 630, 538, -1070, -2371, -4363, -2748, -752, -298, -214, -1965, 240, 4592, 3710, 1659, 564, -1472, -630, 3966, 7926, 9522, 8537, 5049, -803, -8927, -13595, -15471, -15554, -11514, -7851, -1626, 7444, 14679, 17707, 16199, 9517, 1413, -4347, -9991, -11211, -8605, -2805, 4989, 9137, 9205, 6641, 792, -4248, -9192, -12890, -14663, -15326, -13151, -5783, 7708, 17890, 23053, 22375, 16000, 7564, 1941, -4352, -11512, -14915, -16669, -14805, -7990, -731, 4469, 8460, 10144, 10659, 5929, -15, -5363, -6232, -2601, -929, -913, -10, -34, 2329, 5357, 9713, 9294, 3657, 2602, 3, -854, -5564, -10496, -13864, -13655, -10017, -4181, 4075, 10065, 14644, 15505, 11337, 5867, -799, -6937, -10235, -11855, -5741, -2962, 5097, 12510, 14383, 13972, 4385, -3720, -10711, -17989, -19275, -17195, -13457, -2488, 9871, 18810, 21635, 18955, 13286, 5855, 582, -4906, -13144, -15553, -12750, -7269, 58, 5789, 9494, 5908, 485, -4581, -7467, -8185, -9325, -6827, -2256, 6098, 12818, 13555, 13378, 11484, 8110, 3284, -3903, -9430, -10826, -9171, -8114, -8825, -9484, -8037, -5867, -1130, 6483, 9718, 13953, 15537, 14331, 9898, 1993, -4723, -11616, -15474, -13472, -7114, -1621, 5669, 12316, 13830, 10391, 4705, -4043, -9188, -14352, -19299, -16152, -8513, 5579, 15471, 18790, 19099, 13710, 7801, 427, -8041, -11440, -14493, -13750, -7690, -660, 5207, 8568, 9285, 7998, 4533, -1651, -8023, -13526, -13861, -5876, 1219, 6856, 10042, 7400, 9457, 10048, 8738, 6194, -1517, -8236, -10858, -8890, -5361, -3007, -5019, -6851, -5607, -4298, 573, 4067, 6718, 10185, 9729, 8969, 4417, -531, -4355, -7113, -4428, -2927, -1606, 2325, 3802, 3449, 776, -4992, -9073, -11847, -13538, -13296, -7743, 2448, 11621, 19687, 22440, 19363, 12735, 4997, -4381, -13308, -18273, -21181, -18302, -10514, -749, 6971, 10938, 13676, 11105, 6407, 188, -5248, -6974, -6858, -5955, -3560, -377, 2883, 7698, 8854, 8353, 5395, -277, -4879, -5386, -5183, -3846, -2897, -3837, -4646, -5613, -2456, -725, 1467, 4827, 5262, 4318, 5306, 7021, 7607, 3924, -1785, -6459, -9402, -7780, -4403, 95, 4586, 5568, 6511, 3702, -3348, -7494, -10825, -11082, -6651, -542, 4210, 10117, 15697, 17416, 16426, 8840, -402, -9722, -16259, -17776, -15015, -6475, 732, 6194, 9891, 9568, 6342, 2987, -1972, -5321, -5487, -6817, -6264, -3826, 1357, 11566, 16773, 15539, 9451, 1326, -4071, -9108, -10523, -11130, -11832, -9045, -4594, 107, 6214, 8842, 10556, 9492, 7128, 2387, -3455, -5916, -4083, -1166, -639, -1443, -2852, -1004, 502, 5176, 7053, 4677, 2371, 365, -2826, -5374, -8834, -9800, -8022, -5226, -1341, 2107, 7023, 12317, 17467, 15390, 10187, 1663, -7075, -14320, -16962, -14852, -10520, -4283, 246, 6293, 10940, 11814, 10022, 5375, 60, -5935, -11586, -12733, -11992, -4352, 6422, 11912, 17574, 16082, 9280, 2622, -5999, -10081, -11691, -13228, -13679, -10337, -3740, 5134, 12805, 15247, 12308, 4724, -2186, -6073, -5613, -3037, -1411, 202, 3142, 5381, 5690, 5720, 3044, -876, -4664, -8800, -9886, -8167, -2721, 379, 2750, 3956, 1724, -94, 1378, 5111, 8416, 10955, 7705, 2923, -3031, -8352, -10118, -11394, -11300, -8405, -4533, 3846, 10379, 13510, 13519, 4018, -3159, -7660, -11188, -10392, -9194, -4607, 3911, 12436, 19080, 18191, 10445, 2384, -3611, -9720, -14592, -18454, -18695, -11375, -1132, 7659, 14231, 15994, 14102, 8383, 819, -4895, -10193, -10426, -7793, -4091, 1877, 7155, 9342, 8635, 7409, 2411, -4742, -8730, -10927, -9905, -6858, -3613, 69, 3437, 5702, 6430, 4928, 3736, 4104, 1460, -134, 548, 511, 988, -290, -1523, -2659, -7210, -8143, -8034, -5105, -707, 1991, 2200, 3545, 4661, 2692, 1621, -2662, -2429, -1813, 1566, 8027, 11643, 10166, 6460, 522, -6376, -10041, -15232, -15936, -13730, -8249, -1301, 5897, 14580, 18751, 15819, 10097, 2744, -3403, -7040, -10075, -12437, -11519, -2782, 5206, 10626, 14156, 9127, 3946, -1551, -8150, -11170, -14980, -15258, -10162, -518, 9499, 15481, 14726, 11436, 9266, 5764, 1218, -4338, -8247, -10167, -7115, -3766, -1855, -1067, -1741, -911, 97, 266, -368, -364, 2479, 5473, 6536, 4144, -1560, -5179, -5553, -2950, 1967, 8343, 7497, 6696, 5403, 2378, 2601, -1467, -6968, -13801, -17717, -18270, -12260, -1340, 10165, 18932, 22354, 22183, 13033, 2963, -1120, -6609, -12065, -13896, -12620, -6401, 919, 6668, 10344, 8887, 4996, -2266, -11972, -15375, -15340, -8638, -1318, 5890, 13611, 16642, 17999, 14834, 9813, 1039, -8898, -16306, -20439, -17801, -10416, -4073, 2214, 8151, 12020, 10116, 3801, -815, -3391, -3561, -3182, -925, 886, 2708, 6122, 5456, 3906, 1514, -1149, -1160, -2400, -2093, -2031, -2124, -1285, -3353, -7072, -8533, -6728, -2762, 3665, 8590, 10773, 12764, 12367, 10733, 5739, -2628, -11019, -16317, -16667, -12838, -6163, 2451, 12358, 17027, 16116, 8672, -1335, -8708, -13773, -16789, -14428, -7881, 622, 11248, 17531, 24057, 22924, 12151, 2405, -8503, -14804, -16673, -16624, -13915, -7656, 973, 7940, 11728, 11368, 5700, 34, -2970, -4837, -5140, -4090, -1170, 2840, 8341, 13336, 13567, 7552, 461, -8323, -12963, -14586, -14822, -10713, -4982, 286, 5038, 6500, 4820, 4787, 3533, 4510, 3708, 1003, 257, 378, 2097, 2871, -1572, -7852, -11037, -10659, -5981, -2091, 665, 6477, 8177, 7266, 3495, -4045, -7134, -6765, -5231, -2071, 85, 2586, 9921, 14152, 16811, 12468, -418, -8895, -15115, -16678, -17122, -13264, -3226, 6544, 16991, 19929, 14173, 4266, -2389, -5427, -7842, -12412, -15295, -14621, -3540, 12833, 22650, 28530, 19795, 5423, -4344, -13201, -16941, -16639, -14320, -9796, -5620, 408, 5839, 11976, 13132, 11277, 7685, 1297, -4675, -8479, -5047, 992, 4880, 8648, 8273, -868, -6620, -9597, -9679, -5785, -3874, -5371, -2965, 1736, 5931, 9200, 8410, 4442, 1008, -1588, -2435, 1671, 2837, 5257, 5614, 2733, -1705, -8537, -12277, -13015, -10865, -5025, 1348, 4915, 8242, 9510, 11158, 9695, 3118, -3862, -12667, -15154, -10711, -3521, 5068, 11991, 15621, 13953, 6933, -1084, -8007, -12821, -15149, -16616, -12110, -6331, 3156, 12381, 17388, 19303, 12016, 1406, -8179, -15579, -15267, -9215, -3870, 4250, 10449, 13095, 14007, 11979, 4825, -4162, -11143, -17096, -18322, -15864, -10215, -1594, 7750, 16756, 19334, 14963, 8911, 3534, 1125, -1262, -3454, -5831, -5134, -1506, 2065, 3216, 422, -4527, -7066, -5605, -4633, -3431, -1306, 758, 4727, 10767, 10368, 5254, -599, -2609, -614, 1718, 2080, 1045, 361, -1611, -1211, -3651, -7640, -10587, -13109, -10009, -1695, 4937, 12623, 16685, 15243, 12464, 5775, -2066, -10164, -14258, -15065, -11310, -3144, 6195, 12722, 15793, 14656, 8435, 135, -7161, -14916, -19160, -18146, -14349, -2539, 8293, 16109, 19985, 19057, 13634, 6051, -1094, -10053, -15535, -14062, -10179, -6591, -613, 4390, 9950, 12466, 10095, 4530, -5111, -9897, -13352, -13746, -9635, -4561, 4257, 10935, 14042, 15263, 15685, 11321, 4849, -3691, -11199, -13373, -12601, -8804, -5846, -4787, -4163, -983, 2698, 5122, 6259, 5981, 5080, 7081, 6380, 3074, 1700, -1865, -5237, -6508, -4557, -3027, -2201, -108, 1596, 2886, 1041, -2276, -5318, -8519, -8446, -8092, -4469, 1397, 5153, 13353, 18046, 18853, 15613, 4320, -6761, -16902, -22495, -20225, -14974, -8355, -849, 7068, 15539, 17738, 13322, 4396, -7197, -13792, -14271, -11991, -8053, -1939, 6544, 14614, 20020, 20356, 13322, 4172, -5495, -12750, -17950, -18539, -14324, -7211, 2234, 9868, 12781, 9395, 6010, 3359, 1009, 500, -1205, -2879, -629, 2909, 7186, 7794, 5877, 1028, -2928, -4769, -7420, -7850, -4994, -1758, -1023, 1264, -841, -4174, -5011, -2293, 3118, 8506, 10654, 11994, 13096, 11748, 7999, -1052, -9544, -15851, -20004, -18988, -13135, -4651, 3834, 14999, 18775, 13636, 5809, -4214, -8004, -11167, -12316, -9307, -4826, 1890, 12454, 19739, 21752, 16088, 4652, -9060, -19131, -21218, -21705, -18294, -11422, -381, 7180, 11995, 16560, 15653, 11042, 6364, -1137, -5046, -7243, -9058, -6975, -2861, 4585, 9130, 6646, 2941, -966, -4159, -2901, -5878, -8272, -8446, -6546, -1881, 4913, 8754, 8041, 7051, 4440, 4469, 3380, 2108, 1557, 736, -1658, -4144, -6070, -10013, -9283, -6173, -2103, 3983, 5385, 4548, 4421, 1852, 2117, 4105, 335, -2674, -4737, -3828, 2857, 9287, 11734, 9320, 4882, -642, -3302, -6260, -9713, -11191, -12524, -10064, -4661, 1947, 8996, 12625, 14670, 13982, 8370, 1072, -4234, -8928, -9864, -6392, -2039, 2761, 6924, 10012, 8253, 3468, -3926, -9703, -16137, -18585, -16340, -10816, -2201, 7642, 17929, 23378, 23070, 16213, 6810, -4605, -11602, -16815, -18179, -16117, -10313, -3125, 2170, 7704, 9708, 10102, 6325, 661, -4138, -7359, -7966, -4641, -270, 3942, 5961, 6581, 5116, 3700, 2669, 681, -429, -3051, -1820, -2288, -2874, -696, -1569, -4444, -4705, -3564, -439, 2471, 3233, 7848, 9528, 10166, 6728, -617, -4993, -8311, -6093, -1551, -692, 3597, 7171, 6867, 9119, 3047, -5142, -10566, -14673, -14321, -13336, -9426, 190, 11870, 19417, 22067, 16591, 8170, 342, -6211, -10016, -11148, -12673, -10968, -3776, 2112, 7722, 7251, 3517, 1034, -4668, -9302, -10337, -8413, -4635, 1653, 9271, 14777, 17124, 15786, 11466, 3318, -7869, -17176, -21342, -20942, -13993, -6424, 404, 6736, 12584, 13783, 11282, 8152, 2464, -2866, -8464, -8664, -6520, -3818, -2154, 1964, 4142, 2930, 2927, 4699, 5694, 2870, -359, -4918, -4280, -1391, -1129, -3788, -5140, -3161, -2972, -2017, 1599, 5671, 9333, 10913, 9932, 9545, 3459, -3581, -5841, -8723, -8172, -8920, -6369, 2445, 8807, 10786, 6644, 504, -6133, -10095, -11231, -12041, -7056, -1460, 6411, 14934, 20092, 24139, 17584, 7355, -4500, -15315, -19795, -23273, -22015, -16813, -4736, 7606, 13957, 17202, 13023, 7959, 4386, 333, -3774, -6020, -8815, -8642, -2300, 6233, 11694, 8151, 3071, -1351, -4408, -6568, -8855, -9073, -6874, -1438, 919, 2554, 3723, 3463, 5533, 7332, 6711, 2535, -4217, -8628, -4618, 1330, 5439, 4461, 150, -1210, -327, 3008, 5453, 2469, -336, -3783, -6801, -6012, -7148, -7323, -6219, -4337, 314, 6558, 12321, 19009, 20500, 18315, 11864, 512, -10942, -18790, -23187, -22978, -16912, -6956, 3191, 9490, 14591, 15750, 13148, 6832, 191, -7853, -11164, -9510, -4865, 3083, 8188, 13084, 16701, 15394, 6997, -2656, -12216, -20370, -20517, -17974, -13838, -7306, -350, 8429, 16751, 21115, 20131, 14249, 6354, -1159, -6659, -10346, -11978, -10203, -6621, -2275, 1372, 3673, 3535, 3475, 2598, 988, -2654, -6983, -8239, -5843, -1908, 771, 4289, 5780, 4757, 5771, 6605, 4303, 4419, 4189, 1030, -1343, -4753, -10450, -11143, -8824, -6389, -3079, -676, 1692, 3140, 4344, 5369, 5154, 2805, 21, -2687, -2729, 1540, 5711, 8041, 11557, 10648, 6402, -714, -11743, -17072, -18077, -16833, -14294, -8303, -1456, 6006, 17376, 23897, 25998, 17358, 4828, -4404, -10288, -10179, -13060, -13532, -9397, -2288, 6274, 12055, 11233, 6539, -1064, -8670, -12701, -14439, -14498, -11603, -3721, 6364, 16262, 19715, 18374, 14713, 8807, 2280, -4454, -11517, -13259, -11305, -9165, -6800, -4799, -2083, -1750, -1502, 238, 2839, 4069, 6163, 6721, 6784, 7488, 3958, -108, -3373, -4950, -4874, -1780, 1020, 3926, 6333, 6390, 1988, -5469, -9956, -15579, -17958, -15580, -7234, 1634, 12031, 21545, 23308, 23175, 14105, 4905, -3243, -10754, -15292, -17441, -14202, -7120, 3139, 9941, 12358, 7084, 1108, -4017, -9061, -10382, -9535, -6061, -2359, 6907, 15130, 19115, 18727, 13033, 6736, -3280, -10805, -16125, -18010, -13666, -8699, -361, 6168, 7677, 7400, 3510, 199, -3521, -5798, -5661, -6372, -1446, 6011, 9329, 10567, 9689, 7228, 4656, 730, -2724, -5837, -6689, -8666, -8649, -6827, -5258, -4427, -6784, -6318, -3984, 1609, 9563, 14603, 17489, 18522, 15919, 11503, 2099, -9409, -17428, -23337, -22329, -14979, -8270, 2891, 12836, 17198, 17462, 9003, -1051, -8054, -13523, -13779, -8353, -2071, 4488, 10816, 18518, 22064, 19530, 8969, -6281, -16591, -21525, -23369, -20344, -13247, -3181, 7920, 14960, 18988, 17566, 10733, 2275, -5633, -9714, -8469, -7685, -4604, 2110, 8785, 14008, 13652, 6834, -302, -6107, -10662, -12073, -11286, -7022, -1736, 2039, 2403, 1545, -356, 522, 2799, 4402, 5935, 6067, 8178, 9260, 7810, 4876, -1386, -10394, -14231, -14889, -12965, -6359, -15, 4797, 6826, 3877, 1298, -1197, -3660, -2480, -2302, -238, 4763, 10460, 15156, 17542, 13294, 7088, -4865, -18305, -24302, -28571, -24866, -16072, -4802, 7629, 18427, 25122, 26460, 22032, 10654, -1722, -11053, -16961, -17155, -13128, -7576, -25, 10763, 17258, 16696, 9511, 151, -6321, -11868, -12772, -12713, -11619, -7834, -1025, 6898, 15034, 16593, 11966, 6183, 1220, -1947, -5604, -6466, -6313, -2370, 2017, 1955, 1106, -75, -2613, -1850, 832, 320, -3512, -6878, -7462, -3882, 2293, 4134, 3418, 1362, -230, 1839, 8494, 11537, 10748, 7546, 1273, -2813, -6933, -11816, -14905, -16455, -13564, -7409, -2259, 4613, 10662, 15000, 18100, 16351, 7870, -1628, -10024, -10807, -6121, -2455, 1519, 4610, 7736, 8493, 4441, -4385, -12228, -15563, -14384, -11970, -5194, 260, 7214, 16475, 21629, 22071, 13918, 3864, -7179, -13705, -14882, -13681, -11561, -7350, -664, 5126, 10327, 12045, 10270, 4434, -2887, -7792, -9979, -10204, -7361, -3100, 2807, 7283, 9571, 9157, 3514, 1662, 3021, 4464, 4442, 710, -2948, -3951, -4845, -5621, -6296, -9490, -9829, -7003, -1213, 4491, 7430, 13009, 14854, 12671, 8573, -879, -6473, -7234, -7072, -3986, -894, 2352, 5558, 5361, 2933, -2902, -7802, -9579, -13036, -12623, -10498, -4804, 4755, 15768, 24439, 24153, 17779, 4789, -6252, -12253, -14039, -15191, -14153, -11127, -5378, 1895, 10000, 14513, 12179, 8143, -2677, -9804, -13458, -12280, -7200, -1834, 4881, 9696, 13352, 14579, 10752, 3419, -2983, -9018, -12517, -13352, -11646, -6615, 626, 6092, 7566, 4978, 477, -1401, 230, 538, 324, 160, 830, 2494, 2951, 3905, 2240, -20, -958, -1653, 198, -656, -1256, -424, -1069, 783, -1117, -8411, -12971, -12469, -9303, -1656, 6671, 15645, 21849, 19578, 17633, 12220, 2978, -7296, -18114, -23429, -22794, -14234, -6596, 2733, 12819, 16293, 15657, 8630, -880, -8202, -12176, -12777, -8043, -1453, 5455, 12334, 19640, 21794, 16439, 6669, -7349, -18068, -22604, -21651, -17568, -10864, -416, 7953, 14271, 17820, 14423, 7669, -91, -4757, -6464, -7765, -5759, -2202, 4010, 8000, 8547, 6497, 0, -4492, -6974, -8565, -8569, -7656, -5218, -422, 2753, 6197, 6216, 3716, 2696, 1145, 3294, 4522, 3886, 3776, 4636, 4968, 3061, -2433, -9224, -13684, -13607, -11363, -5216, 3492, 8826, 12564, 11537, 7179, 147, -6161, -10448, -11720, -7663, -1898, 3284, 12898, 21942, 19848, 13443, 269, -12318, -18939, -22805, -20724, -15936, -8023, 2950, 10983, 19260, 22624, 16572, 7532, -3189, -8990, -8750, -9530, -8739, -3858, 3177, 10322, 13679, 13189, 6778, -1574, -10281, -14618, -15664, -13164, -9671, -6270, 692, 7750, 12702, 12605, 11432, 8331, 6211, 2820, -585, -3980, -4930, -2268, -1077, -2077, -4726, -9554, -11579, -6597, 485, 5222, 6159, 5364, 4561, 7510, 6427, 828, -5033, -8183, -8180, -5919, -290, 6375, 10390, 9271, 8215, 529, -8692, -12106, -15906, -12441, -3892, 1577, 7471, 12058, 13539, 13378, 8249, 2323, -1601, -8077, -13180, -12348, -5586, 4163, 14781, 19204, 16906, 9142, -1167, -8610, -14854, -17440, -17379, -16038, -12851, -3837, 7217, 16536, 21358, 17297, 11011, 3706, -6498, -11244, -11775, -10552, -4638, 1654, 6412, 9426, 6533, 1899, -2305, -7506, -8335, -10033, -11094, -8655, -2310, 4602, 12751, 16606, 14788, 10758, 3719, 1125, -1646, -5150, -8072, -9705, -9249, -7875, -5847, -4486, -1843, 1848, 6261, 10669, 10374, 6457, 2804, 3271, 4036, 2200, -1923, -8435, -11510, -8621, -1509, 6734, 10198, 9023, 5741, 1639, -1541, -6755, -9928, -11248, -10533, -5616, -254, 3919, 9107, 12425, 14092, 11836, 2120, -7637, -14012, -12527, -7238, -284, 7292, 9441, 9214, 10079, 7418, 2265, -5180, -14186, -20730, -21691, -15800, -8665, 3995, 13801, 21359, 24622, 16600, 6709, -2788, -8753, -12335, -12239, -9609, -7726, -4788, 129, 4747, 8980, 10591, 5461, -2849, -10872, -12585, -9479, -4947, 252, 5342, 10473, 12706, 14393, 12720, 6587, -372, -7514, -13480, -16482, -16144, -12125, -7132, 230, 7212, 8769, 9630, 7273, 5189, 4940, 3373, 2914, 899, -2120, -4439, -6843, -6828, -4784, -1639, 1270, 4218, 6524, 6384, 5424, 3912, 1480, -4220, -9702, -12684, -13058, -7706, -1221, 7287, 14095, 17577, 16788, 10485, 4369, -3016, -6971, -11145, -13398, -11463, -7226, -704, 8378, 14647, 12723, 5651, -5187, -11391, -14250, -13185, -7841, -1762, 3766, 12162, 19089, 21485, 22290, 12401, -145, -10621, -20802, -22898, -20920, -16513, -8699, 2725, 12994, 18877, 18284, 10576, 3392, -1831, -6778, -10237, -10409, -9639, -5451, 4178, 13750, 16516, 14354, 7108, -4369, -12174, -15165, -16891, -14357, -9386, -1945, 5229, 9821, 12052, 9852, 11366, 7329, 3149, -397, -7062, -9420, -9629, -5299, -555, 2152, 2322, 1064, 2295, 4683, 5235, 3242, 587, -1335, -4797, -4673, -5196, -5373, -2509, -1342, 1782, 5854, 8687, 8792, 11335, 11859, 6574, 1086, -7500, -16095, -18926, -17825, -9610, 887, 7573, 12965, 12521, 9521, 6327, 1190, -2584, -5834, -7074, -9240, -7803, -1116, 8521, 16111, 15220, 10670, 170, -10070, -16267, -18126, -15115, -9430, -4052, 3211, 7853, 11165, 16660, 16451, 10599, 2130, -6609, -13795, -14971, -10786, -3957, 1937, 8197, 9471, 6696, 2920, 1061, 49, -3287, -5732, -8612, -9162, -7423, -3088, 4493, 9595, 9735, 9787, 7864, 4642, 2278, -1710, -5044, -5175, -3564, -3463, -4624, -3589, -3588, 67, 5492, 7119, 5080, 1744, 595, -742, 787, 352, -2654, -4931, -7165, -6768, -2745, 4038, 11076, 14886, 13663, 8291, 799, -7902, -13043, -14212, -13872, -10311, -5613, -1898, 3019, 11417, 15536, 16432, 11562, 1486, -7536, -12730, -13443, -12270, -7099, -2593, 4857, 12458, 15290, 13181, 6127, -2104, -7922, -11135, -11668, -10593, -11084, -8190, 493, 9506, 17168, 17054, 10001, 3062, -2895, -6260, -8412, -7270, -7149, -3476, 370, 2872, 6203, 4655, 5130, 3974, 312, -2662, -9923, -10779, -7383, -1631, 5420, 7375, 5871, 3216, 2387, 3170, 4674, 3495, -328, -6495, -7594, -7320, -6347, -4458, -1550, 639, 1588, 2130, 5052, 5730, 3610, 2749, 2183, 802, -7015, -13235, -13264, -6122, 2760, 10790, 13487, 15252, 12240, 8090, 2483, -5428, -12063, -18582, -21066, -17645, -10288, -1241, 11559, 20376, 24913, 21063, 10996, -1599, -6678, -9367, -11247, -11036, -9087, -3994, 1282, 7884, 10568, 11972, 6398, -2638, -10914, -15437, -15859, -11090, -4891, 3609, 12387, 14677, 17602, 16138, 12429, 5582, -2717, -8594, -14891, -15736, -13706, -9485, -4506, -349, 6379, 10187, 10142, 6421, 884, -400, -1932, -4407, -4281, -535, 2089, 3761, 4398, 3354, 3962, 3689, 505, -3508, -6907, -9542, -6514, -4394, -1144, 299, -1789, -942, -1010, 3155, 6906, 5576, 3428, -374, -1486, 2185, 2113, -350, -872, -2205, -1982, -29, -653, 660, 3539, 3994, 2353, -3065, -10976, -13410, -13078, -9611, -575, 6929, 11643, 17176, 22887, 22862, 16906, 3648, -6994, -16235, -23017, -22735, -21446, -13207, -2438, 7763, 14640, 17227, 13977, 7157, 2927, -1412, -3155, -6595, -8689, -4648, 4390, 12587, 15551, 13925, 6715, -2143, -11935, -17665, -18613, -13860, -8082, -3301, 4112, 9026, 13281, 15236, 11143, 6723, 517, -5063, -7925, -8118, -3588, 469, 3049, 4087, 2374, -1528, -3516, -2158, -643, -1138, -2355, -4093, -3199, -1757, 1289, 3868, 2408, 530, -2215, -1564, 1828, 6524, 9164, 9327, 7335, 1936, -2180, -8277, -13250, -12353, -10787, -6184, 1469, 6492, 7336, 6268, 4445, 2785, -3127, -5949, -7425, -8274, -3246, 5242, 15432, 19963, 19770, 13145, 1573, -9434, -17533, -23909, -27152, -24386, -14604, -3142, 8567, 17513, 24521, 27532, 23434, 13890, -946, -11903, -21761, -22509, -15502, -6594, 3413, 8647, 10403, 10775, 6450, 2050, -3346, -9825, -13255, -13314, -9656, -5538, 3906, 12380, 16801, 16450, 12758, 5720, -344, -3661, -5280, -7691, -9134, -8066, -7459, -4655, -1982, 2312, 5116, 6348, 4877, 1340, -2560, -3648, -2735, 2231, 5154, 2979, 40, -3494, -2334, 2815, 7041, 6959, 4100, 922, -3586, -7244, -7010, -7470, -8159, -8606, -6815, -4224, 1272, 7767, 14878, 18602, 14775, 7150, -3625, -10232, -10880, -8399, -5074, -2355, 509, 4426, 7724, 12503, 8376, -2710, -10278, -15891, -17675, -14168, -7177, 3229, 11682, 20368, 25453, 21897, 12646, 918, -7279, -14701, -17948, -20501, -18893, -11168, 17, 12093, 18518, 19146, 12924, 3211, -6074, -13569, -15934, -13608, -9736, -3300, 6199, 15938, 21623, 21448, 15521, 3528, -7734, -14833, -19341, -18012, -15888, -10022, -2638, 6197, 13417, 12992, 9468, 5846, 2686, 241, -2030, -6260, -5502, -1719, 3252, 5765, 1786, -2475, -4282, -3541, 423, 3860, 2046, -1388, -2513, -989, 1897, -826, -5410, -8373, -8865, -3662, 3116, 9487, 12455, 14698, 13365, 8550, -26, -8857, -13478, -16310, -13417, -7019, -531, 6606, 11374, 11939, 9699, 3080, -3877, -10299, -16264, -15356, -8147, 4018, 14923, 24203, 27415, 20548, 10188, -2759, -12143, -20649, -25374, -25020, -18940, -5734, 6118, 15055, 20127, 21538, 14445, 2017, -6499, -11317, -12835, -8025, -4568, 1516, 10131, 12567, 14511, 10175, 1161, -6656, -14300, -16956, -15475, -12145, -5337, 2171, 9387, 14110, 13083, 10158, 6896, 3354, -803, -3517, -5534, -6927, -5617, -1709, 1270, 44, -2036, -2784, -1852, 169, 1113, 1339, -387, -274, 1534, 331, -443, -3047, -6329, -6103, -2875, 1745, 7421, 13290, 14968, 12885, 10135, 2830, -7260, -15418, -20828, -19735, -13117, -5200, 1349, 8111, 11206, 12594, 12487, 6539, 80, -5564, -9126, -8618, -4755, 1715, 9041, 16376, 16480, 10779, 1333, -12195, -21081, -24979, -23437, -15874, -8479, 3374, 14971, 21647, 28122, 22732, 13380, 2693, -10903, -16379, -18013, -13750, -6992, -323, 5552, 8262, 9594, 7314, 1618, -3241, -7276, -11266, -11407, -10397, -6497, 893, 11138, 16980, 14864, 11230, 3156, -3218, -4960, -6701, -6494, -4975, -5150, -4140, -3362, -1085, 1933, 3543, 3926, 2668, -25, -3242, -3906, -3190, 669, 1282, 1198, 200, -2234, -981, 3046, 12116, 13981, 12852, 7580, -1063, -5554, -10540, -11882, -13870, -16385, -13569, -9019, -2105, 8719, 17517, 23023, 21639, 13269, 2455, -5755, -8849, -9242, -9588, -7096, -2866, 2328, 5767, 6901, 5082, -176, -4882, -10091, -11395, -12758, -10606, -4283, 7671, 20202, 25782, 23677, 14672, 4879, -3905, -12134, -17642, -20135, -20781, -15118, -4825, 6669, 15058, 17011, 14579, 8903, 3669, -4713, -11723, -13071, -13782, -7813, -174, 9294, 14893, 15225, 12986, 7241, 1540, -6085, -13207, -15738, -12976, -8315, -3250, 522, 4010, 5599, 5900, 4731, 4031, 1058, -520, -115, 719, 1876, 1126, 1469, 21, -767, 805, 1693, 3795, 5719, 2294, -2076, -7821, -10706, -10165, -10515, -8804, -7153, -1993, 6736, 16453, 22176, 22255, 18184, 9829, 2097, -8883, -19322, -23110, -22224, -14611, -3271, 5359, 10011, 13223, 12796, 8316, 1578, -3110, -9663, -13390, -11025, -5965, 4092, 10250, 19166, 22367, 13323, 5128, -7319, -18030, -20910, -22044, -18613, -12443, -1012, 11054, 17260, 20672, 17045, 9835, -79, -8837, -11581, -12262, -9860, -2423, 6989, 14380, 13804, 10137, 5769, 20, -3651, -10493, -15692, -16123, -12510, -4665, 726, 6617, 9643, 10918, 11773, 10210, 7592, 978, -3434, -5127, -4339, -1628, -1189, -3499, -4400, -4832, -3320, 991, 1875, 1230, 1900, 928, 333, 959, -3343, -6347, -7154, -3283, 2070, 5751, 10578, 12401, 14546, 11954, 4783, -3616, -13214, -19560, -21177, -17310, -10077, -3189, 6808, 14013, 17636, 18188, 10609, 1274, -7287, -12262, -12344, -9993, -7652, -271, 10042, 19044, 22163, 15346, 1377, -10488, -17246, -21780, -20754, -16846, -8868, 1202, 11167, 19313, 21595, 17722, 9988, 1281, -7194, -13004, -12759, -11402, -7304, 1285, 7143, 12031, 10514, 3950, -2211, -8100, -10403, -10693, -9922, -6387, -2470, 4884, 13045, 16677, 16240, 10336, 4164, -1069, -6087, -9114, -9709, -8509, -5545, -2312, -1383, -48, 1771, 5003, 8304, 8039, 5569, 1585, -1869, -2368, -512, -1213, -6207, -9380, -8035, -2407, 5122, 8184, 11595, 11511, 7075, 3502, -4035, -11008, -14362, -13967, -11498, -5880, -2418, 1212, 9473, 16115, 17881, 13440, 3331, -5925, -11128, -12752, -9844, -6138, 795, 9163, 15125, 16592, 9552, 402, -7426, -13222, -15413, -16673, -15670, -11175, 1144, 14690, 25142, 28684, 19732, 7477, -4492, -11095, -14026, -14979, -13622, -11570, -5204, 1676, 7990, 10851, 8743, 5451, 888, -5504, -10565, -11215, -8740, -1156, 6856, 12242, 12099, 6191, 3023, -201, -2686, -4552, -7424, -9660, -10502, -6650, -1489, 4028, 6397, 6100, 4037, 964, -270, -1213, -325, 1460, 3731, 1715, -3761, -6869, -6963, -4257, 2407, 8306, 9843, 8403, 8145, 6556, 1965, -2885, -8514, -12833, -16254, -17049, -12246, -2319, 9157, 20279, 22648, 19924, 13251, 5743, -919, -9297, -12608, -14224, -12821, -7137, -500, 6702, 13087, 12293, 6737, -1199, -8949, -13426, -13480, -8975, -1575, 7065, 13962, 19045, 19558, 13680, 3851, -5518, -12474, -19392, -19856, -16236, -12624, 1221, 10853, 15439, 16986, 8453, 1359, -4688, -9729, -10093, -10112, -7067, -516, 5593, 13637, 15423, 11593, 6256, -2097, -6898, -11836, -14004, -10864, -5527, 835, 3898, 5765, 5780, 4336, 5521, 6321, 2845, -606, -4764, -8246, -5916, 1016, 5035, 3208, 1176, -424, 903, 3058, 4436, 2828, 872, 237, -1541, -4735, -10391, -14353, -13731, -7961, 785, 7383, 10322, 14369, 19683, 21148, 16136, 5233, -8776, -19582, -24066, -21099, -15339, -7715, 1469, 10081, 14679, 15388, 10777, 3367, -703, -5360, -7004, -8583, -8195, -4236, 5643, 14313, 18592, 15883, 5536, -3321, -10279, -13842, -14047, -12154, -9789, -3150, 1827, 7769, 10409, 7537, 5557, 2762, -599, -2750, -5240, -5324, -3032, 361, 5789, 6313, 4023, 1765, -815, -1860, -2815, -6802, -8265, -8284, -5812, -1947, -308, -1062, 931, 5314, 5643, 6138, 4379, 2952, 2388, 1131, 2920, 1195, -4061, -9584, -12414, -8319, -2895, 3623, 7394, 7330, 6313, 1966, -3219, -7670, -9821, -9828, -8519, -2917, 4462, 12320, 20679, 22412, 20832, 14976, -1087, -12573, -21358, -24964, -21556, -17190, -8320, -742, 9258, 17032, 21417, 18723, 10059, 1500, -5002, -7926, -9993, -9433, -5674, 1406, 8307, 14167, 13316, 7939, -738, -8838, -12886, -13453, -13085, -15078, -12094, -6025, 4012, 14236, 16065, 15986, 12868, 7726, 5206, -1285, -6787, -8401, -8540, -7152, -4424, -2308, -2069, -660, 1850, 2278, 1784, -376, -5361, -5668, -893, 4585, 6894, 7025, 4367, 2046, 4504, 5484, 3426, 683, -3321, -5590, -4611, -6428, -8735, -7870, -7886, -3345, 3014, 5677, 5467, 5875, 8021, 7424, 3660, -1794, -6766, -9103, -3911, -795, 4290, 10382, 12460, 11102, 6239, -1723, -9457, -11900, -15314, -17158, -15078, -9904, -3288, 8789, 18387, 24274, 23243, 17035, 7832, -2274, -8887, -14464, -13632, -11767, -6135, -387, 3180, 8244, 8674, 5743, 1026, -6746, -10992, -12522, -10180, -2077, 6044, 13272, 18324, 17169, 14404, 7943, -747, -6214, -11477, -12906, -13162, -9938, -7816, -3583, 3782, 4620, 4543, 3446, 700, -1202, -2891, -1555, 3597, 8237, 10480, 9662, 3703, -1292, -2789, -3349, -3878, -8140, -12361, -11154, -7029, 1058, 7020, 3231, -498, -3678, -2383, 1268, 4223, 5404, 5850, 7867, 6621, 6664, 2476, -2086, -4884, -7722, -8253, -6524, -3768, -497, 4316, 8333, 6853, 108, -6332, -12433, -15386, -11565, -4720, 3575, 12502, 19733, 24841, 25741, 17727, 5906, -6951, -21167, -26991, -26801, -21995, -12916, -1781, 8238, 14557, 17429, 13468, 6900, 577, -5424, -6330, -5641, -5539, -1328, 6899, 15335, 16437, 11571, 2936, -8066, -14838, -19231, -17689, -11318, -6501, -127, 4284, 8846, 10048, 8821, 9100, 5411, 1529, -753, -5244, -4250, 2823, 5168, 5908, 252, -6962, -9571, -10907, -5509, -261, 2605, 4446, 2863, 3856, 3749, -1535, -4325, -4693, -3792, -1899, 458, 4710, 9088, 14311, 14261, 7930, -766, -11402, -18294, -19809, -17425, -9279, -56, 7803, 13559, 14703, 12472, 4330, -3797, -9799, -14286, -13612, -10990, -4012, 10072, 22400, 26152, 21739, 11029, -3194, -14767, -21714, -26009, -24359, -16249, -8893, 2546, 15056, 23691, 27803, 20234, 10531, -1104, -9986, -12188, -12010, -7901, -2341, 4300, 9921, 9485, 4813, 738, -5052, -9513, -11014, -10688, -8722, -4188, 2186, 8985, 14227, 14058, 9373, 3162, -1206, -3044, -1844, -2345, -3996, -2207, -1816, -1636, -1327, -4490, -5927, -4497, -610, 2513, 1599, 1721, 990, 3395, 5067, 2041, -3223, -6008, -4173, -230, 5192, 8433, 12115, 11661, 6181, 195, -7669, -15945, -19841, -19661, -13102, -4298, 4799, 15018, 20302, 22242, 18544, 9322, -882, -11333, -18760, -18882, -13870, -3542, 6327, 14700, 19331, 16538, 10115, -75, -10628, -19281, -23040, -20905, -15257, -5166, 6479, 16725, 23794, 24016, 18047, 7461, -132, -7427, -12933, -13591, -12304, -7424, -1520, 2723, 2744, 2054, 288, -815, -1578, -2080, -3202, -3062, 1816, 6029, 9112, 8707, 7757, 5286, 930, -2364, -4335, -4361, -4389, -3433, -3840, -2392, -2250, -2424, -4961, -6045, -3802, -2922, 1079, 5008, 8764, 10867, 10850, 8618, 5168, -2692, -9231, -13012, -10919, -4499, -563, 4790, 7177, 7151, 5726, -848, -6351, -10269, -14381, -12411, -8308, 2541, 10380, 14355, 18728, 18339, 15838, 5457, -6189, -13472, -16195, -14305, -11229, -6196, -1767, 4594, 12423, 13847, 10889, 1032, -9493, -13554, -11181, -5204, -1196, 2013, 4403, 10087, 15058, 15780, 12466, 4286, -3873, -8008, -10005, -10087, -9992, -8846, -5797, -6517, -4536, -1842, 1172, 5860, 9736, 11464, 10162, 8385, 3151, 815, 1571, -472, -2387, -5208, -9047, -9216, -6795, -2946, 1113, 4685, 3847, 711, -2134, -6041, -7802, -7096, -3894, 768, 5409, 10662, 14966, 16280, 14094, 6657, -3024, -11204, -16919, -20684, -20463, -14097, -3844, 6548, 12953, 15010, 13771, 8238, 1819, -1388, -4947, -7602, -9101, -9091, -3081, 5713, 14641, 17985, 13419, 4554, -5315, -11788, -13204, -10338, -8209, -7522, -4407, 333, 6248, 9933, 10077, 9047, 4322, -2312, -7599, -8353, -2806, 1555, 6433, 8795, 6054, 4020, 1085, -231, -1392, -4212, -8249, -13119, -16160, -10548, -3487, 2787, 9100, 10282, 10316, 7713, 6449, 7346, 5465, 3379, -544, -3311, -3365, -6908, -10405, -11609, -8225, -2504, 3290, 3476, 1409, 1599, 2211, 7338, 7591, 1694, -5004, -8811, -6421, 2911, 9906, 12352, 12419, 6314, 1483, -3356, -8475, -12235, -16080, -17542, -13907, -6755, 262, 9809, 16329, 21675, 22335, 10271, -1446, -11019, -15349, -13854, -12701, -7244, -8, 6742, 13012, 17804, 14499, 7273, -3667, -15127, -19425, -20722, -15680, -7662, 3787, 15203, 19913, 20224, 14776, 7544, 2625, -5384, -10247, -10421, -10513, -8656, -3676, 6437, 12155, 10598, 6303, -1932, -8609, -12586, -14709, -9759, -4241, 1664, 6491, 9903, 13971, 14687, 14153, 9441, 3647, -1761, -6864, -7757, -6258, -5518, -8804, -10884, -8687, -7181, -3774, 2316, 6370, 12106, 15270, 13378, 10763, 4654, -222, -5342, -9701, -9434, -8980, -7874, -7, 8783, 12285, 9856, 874, -5531, -10984, -13692, -14995, -13323, -6833, -32, 10880, 21457, 25872, 22307, 11428, -1325, -12255, -19233, -19110, -18203, -12757, -1436, 6567, 13282, 16545, 13798, 5759, -5104, -11497, -14328, -14303, -10476, -3365, 4665, 13858, 22825, 21939, 16162, 6105, -4517, -10129, -14222, -13362, -12273, -9017, -2951, 3016, 8040, 6497, 4048, 527, -2470, -3205, -4457, -2929, 855, 5383, 10421, 11257, 7502, 2625, -2169, -4310, -5199, -6384, -7222, -5145, -3622, -2618, -1922, -4879, -6571, -6336, -2614, 3502, 7559, 11725, 13985, 15106, 15676, 9055, -1764, -11882, -20317, -21470, -19288, -14643, -3771, 8562, 16161, 14699, 9601, 2915, -2729, -6095, -8817, -10412, -8803, -4257, 6462, 19590, 23611, 19936, 10067, -1597, -11076, -18332, -22609, -23883, -17837, -6016, 5472, 12888, 18279, 17199, 13195, 11405, 1180, -6259, -12418, -16150, -10805, -2351, 8462, 14581, 12035, 8262, 4220, -1688, -7137, -12088, -12077, -10276, -5070, -2340, -104, 2593, 2671, 4851, 5367, 4641, 3673, 2661, 2832, 6669, 9484, 7161, 253, -10242, -13466, -12497, -10893, -4564, -1943, -603, 1991, 3910, 7460, 7304, 2642, -808, -4742, -5317, -3019, 3146, 12085, 16264, 15098, 9957, 563, -10551, -16422, -21022, -23472, -17265, -9684, -490, 10669, 16547, 22551, 20436, 12307, 2789, -8707, -14695, -14865, -9276, -1889, 5677, 10944, 13805, 12775, 5970, -133, -8068, -15609, -18519, -19939, -18123, -9276, 3479, 15220, 25620, 26845, 20257, 9259, 966, -5915, -11972, -15416, -15578, -11263, -7264, 660, 7541, 11208, 10572, 5390, -476, -5504, -9290, -9695, -6082, 1030, 6403, 5621, 1933, 1997, 5565, 8695, 8462, 7134, 4537, 123, -2504, -3423, -2632, -6274, -10408, -12656, -11239, -8911, -2863, 3375, 11026, 17962, 14537, 12152, 5700, 241, -2696, -6653, -5893, -4827, -4783, -2022, 3138, 5938, 6494, 2059, -6754, -11698, -14818, -14539, -8263, -2290, 7356, 18422, 22353, 22085, 16449, 6386, -3049, -10005, -15251, -20639, -21246, -12569, -100, 11568, 17486, 16368, 9064, -1281, -9549, -13996, -14428, -13013, -9596, -2918, 8517, 18498, 24691, 22016, 12821, 2800, -8194, -16686, -20908, -19446, -15666, -8483, 1582, 8711, 12122, 11684, 8702, 5610, 2134, -3636, -7346, -7109, -6593, -1394, 4000, 8703, 10172, 6660, 2649, 1467, 3019, 2011, -3535, -7049, -8620, -9561, -6601, -6842, -6984, -6815, -3957, 1329, 9062, 13975, 14735, 18911, 18640, 14816, 3397, -10011, -18605, -21033, -15869, -8843, -649, 6305, 9133, 11277, 12179, 7276, 822, -5688, -9586, -11510, -7634, -759, 9365, 20458, 20266, 15343, 6538, -7547, -17475, -24392, -28298, -25740, -18003, -5402, 3887, 14869, 20848, 20864, 16765, 8223, -1052, -10937, -14906, -12025, -4913, 2489, 8143, 9164, 11386, 8361, 2258, -2443, -9434, -14792, -14894, -11132, -9103, -4400, 1541, 7254, 12693, 13109, 10026, 5683, 2797, -30, -5620, -6900, -4846, -2661, -2720, -3782, -1146, 1380, 3341, 3702, 3518, 1690, -3167, -5222, -4920, -2255, -1621, -4698, -3177, -480, 6232, 13838, 13721, 12959, 11214, 6372, -107, -7311, -13941, -18367, -20532, -15847, -8977, -2269, 4876, 12692, 19461, 19843, 13693, 1947, -4932, -9093, -11116, -9607, -5391, -27, 4528, 10559, 14621, 12279, 4666, -5178, -16151, -20386, -21095, -19307, -12653, -2306, 11552, 22141, 29600, 25866, 15690, 5468, -5950, -9788, -13243, -16940, -18221, -12008, -1892, 5902, 14146, 12583, 6098, 1810, -5704, -9360, -9765, -8446, -5418, -1872, 6327, 12733, 15447, 15306, 11426, 4308, -2833, -10067, -13572, -13979, -11079, -5426, -390, 2550, 2704, 3559, 3359, 5409, 6691, 4603, 889, -248, -1490, -427, 1372, 2954, 3438, 1480, 1114, 3097, 3494, 1638, 1057, -3642, -5197, -4857, -6189, -10034, -10331, -6725, -1928, 5019, 10010, 14254, 15807, 14126, 12489, 6358, -3436, -11523, -19033, -18562, -13247, -5951, 631, 6189, 8550, 8920, 5831, -1076, -4015, -8181, -10399, -8919, -4478, 3426, 11325, 18345, 22540, 17296, 6411, -4003, -13729, -16805, -18531, -20199, -15118, -6804, 3823, 10186, 15025, 17754, 14222, 7446, -669, -5709, -8419, -9347, -8073, -2357, 4323, 9548, 8461, 7335, 6386, 2723, -1812, -8133, -10226, -9555, -8584, -8026, -4586, 543, 3769, 7513, 10582, 9712, 8603, 5048, 2538, 2436, 1587, -185, -5532, -9428, -10185, -8575, -4847, 147, 4347, 6146, 5200, 4493, 3591, -711, -5444, -9872, -12458, -9687, -5326, 5399, 17700, 21065, 22525, 17864, 4508, -8358, -19514, -24810, -23466, -18753, -11624, -3231, 6021, 13045, 19066, 19566, 15591, 7280, -5087, -13438, -16172, -11161, -4616, 2530, 9605, 13090, 13136, 9918, 3856, -6049, -13893, -17346, -17242, -16204, -10024, -2217, 7666, 18973, 19579, 16771, 8436, 1679, -1776, -5850, -6208, -5720, -4445, -6356, -3508, 474, 1002, 5022, 4857, 1278, -1932, -8233, -9102, -6206, -1730, 1761, 2048, 5241, 5448, 5615, 7574, 8707, 7493, 4298, -1286, -6599, -7712, -9264, -9704, -6062, -3205, -915, 1880, 5107, 8740, 11769, 10686, 4935, -1766, -7478, -11758, -12690, -6342, 85, 5917, 12361, 16552, 16156, 12343, 3936, -5177, -12580, -20565, -23088, -21885, -13821, -3744, 6923, 20560, 24326, 23804, 16949, 3600, -2776, -8781, -11849, -13375, -13363, -8254, -1121, 7275, 12935, 12161, 5447, -1763, -9906, -13108, -14573, -13266, -7798, -2255, 7717, 14881, 17161, 15880, 11492, 5867, -1181, -6813, -9572, -12169, -12154, -8200, -3667, 370, 2985, 2042, 2927, 2863, 616, 719, 745, -464, 344, 3316, 4798, 7043, 5780, 1414, -1838, -799, -1377, -4215, -6227, -6192, -3311, 898, 3551, -712, -4198, -5690, -2309, 3542, 7306, 6442, 4116, 1970, 905, 2851, 694, -1815, -2836, -3337, -3386, 13, 2331, 4417, 6584, 3307, -1175, -8147, -12566, -11531, -10969, -4655, 3126, 6990, 10148, 13438, 19243, 18652, 11150, 2259, -8034, -17125, -21079, -19806, -12744, -5748, 2738, 7316, 8174, 8946, 6292, 5931, 1178, -2304, -3394, -4532, -5330, -2591, 5459, 10132, 13389, 11676, 3917, -2493, -9554, -13306, -13216, -11789, -6603, -2620, -1441, 3023, 9113, 11018, 11447, 7703, 3560, -90, -3300, -2387, -1524, 699, 945, -1357, -3788, -5042, -2765, 22, 782, 823, 1196, -156, -1160, 1425, 2892, -123, -2473, -3116, -719, 1062, 3021, 8151, 8941, 8334, 6042, 626, -5396, -10722, -11632, -10448, -7320, -2224, 3593, 6565, 6189, 7573, 5073, 632, -3083, -8161, -11328, -10046, -3250, 6898, 14315, 18752, 20611, 13332, 2750, -8715, -18728, -21587, -23432, -20536, -14564, -5754, 4981, 14228, 23659, 23811, 17412, 7993, -2596, -8373, -10610, -10858, -7358, -3047, 3227, 7915, 6914, 4087, -594, -5209, -6206, -8009, -9675, -9243, -7751, -414, 10372, 15324, 13261, 10936, 6018, 3286, 945, -1949, -3633, -4897, -6209, -6186, -6199, -8877, -8142, -4676, 1313, 5518, 5836, 3864, 2203, 3715, 6379, 4887, 1025, -2186, -7157, -8343, -2923, 2963, 7525, 6720, 4837, 1793, -2520, -5681, -10112, -10386, -10832, -9337, -5089, 1204, 10455, 16184, 19070, 16172, 6791, -3373, -12297, -13453, -11199, -6200, 11, 4389, 8074, 9963, 11209, 6324, -974, -9539, -18621, -22676, -20928, -13947, 1009, 13858, 24318, 29914, 24045, 15195, 5687, -2605, -10863, -16743, -20413, -19973, -13156, -3430, 5064, 10687, 11837, 9575, 3631, -356, -5258, -6572, -3266, -911, 3496, 6198, 8177, 8031, 8078, 5524, 2761, -3219, -9245, -14274, -14880, -8795, -4031, -2186, -850, -416, -654, 2860, 6265, 10417, 9550, 9029, 7658, 5477, 4914, 291, -5540, -10126, -12070, -10710, -8099, -1874, 4228, 7790, 9996, 5406, 720, -5361, -9484, -8739, -6573, -1331, 3128, 6342, 12379, 14607, 15553, 14045, 4959, -5495, -13901, -16567, -18142, -15256, -8627, -480, 9253, 13143, 12529, 8451, 872, -4497, -6913, -7060, -5059, -2559, 310, 7324, 19983, 24686, 15709, 2040, -8787, -15180, -19319, -22375, -20669, -15770, -8676, 2322, 11193, 20255, 21300, 17249, 11623, 3228, -817, -6333, -9708, -9423, -5392, 698, 4394, 4816, 3064, -141, -4123, -6560, -7766, -10571, -12568, -7997, -1416, 6105, 11369, 13172, 14377, 11931, 9909, 7686, 3129, -3323, -8238, -8087, -8546, -9007, -8892, -9088, -7602, -4656, 976, 7186, 9949, 9371, 6346, 4462, 5061, 2197, -2812, -6971, -9903, -6326, -1251, 5631, 12254, 14054, 11243, 3957, -3051, -10692, -17702, -22050, -20120, -10233, -352, 6892, 14943, 19464, 21170, 15541, 6499, -649, -9798, -14918, -15390, -9204, -39, 7785, 11688, 10984, 7494, 990, -5861, -13706, -16689, -17066, -15885, -10459, 789, 13142, 22160, 26677, 21586, 14223, 3122, -8190, -12304, -14441, -14792, -10625, -5655, -982, 4114, 6551, 5977, 3720, -581, -5135, -10712, -10731, -6816, 316, 8141, 12890, 15800, 13666, 10463, 5352, 1529, -6141, -13237, -16562, -15486, -10623, -7272, -2348, 777, 4703, 8693, 8469, 8284, 5041, 1591, 1073, 242, 1602, 455, -4875, -7258, -5755, -1322, 2533, 4063, 5000, 3973, 3535, -844, -3622, -6917, -9345, -9289, -8449, -3456, 375, 5857, 13407, 18620, 17741, 11690, 1221, -6035, -9259, -13466, -14375, -10115, -6481, -215, 8592, 11025, 11472, 8998, -507, -8201, -14278, -17995, -15838, -8631, 3707, 14298, 22055, 24364, 19820, 12226, 1222, -9685, -17164, -20844, -18818, -16198, -10572, -363, 9804, 18109, 18614, 12333, 3547, -4931, -8186, -6977, -6168, -6536, -1862, 5185, 10895, 16907, 14497, 8139, 1176, -8160, -14514, -17335, -16278, -11954, -3167, 5109, 11642, 13413, 9200, 8326, 7929, 5878, 3051, -1928, -6217, -8765, -7449, -2505, 3106, 6396, 4142, 465, 140, 1783, 1487, -378, -2095, -3931, -4447, -6730, -8118, -4271, -79, 3228, 8436, 9141, 6657, 6145, 5339, 5281, 2374, -5662, -14399, -17444, -13157, -6029, 1332, 7588, 11975, 9626, 3066, -1589, -5478, -7331, -8805, -8931, -3145, 2194, 11001, 20464, 21782, 20819, 8757, -7203, -17929, -24753, -24258, -20953, -10852, -465, 7660, 15470, 18259, 19598, 14047, 5134, -3077, -11718, -15774, -15232, -8354, 1638, 11383, 15910, 15585, 10628, 3012, -5030, -11856, -13653, -15117, -15996, -13934, -3714, 6585, 15714, 20973, 17132, 11705, 2220, -4602, -6354, -6125, -6884, -8178, -4052, -1562, -924, 1676, 3739, 6645, 3986, -1001, -4533, -6222, -6297, -3547, 329, 1236, 1352, -2027, -2852, 893, 8933, 12015, 9716, 6783, 3654, 662, -5297, -9973, -13639, -14068, -12046, -7321, -802, 4282, 7496, 10935, 12465, 7535, -429, -7367, -10236, -7395, 946, 6375, 10199, 12819, 8741, 6463, 1021, -6092, -13358, -22830, -24552, -20366, -9082, 5206, 17036, 24908, 23927, 18331, 9148, -330, -8249, -14654, -17298, -12803, -5268, 1570, 8944, 14178, 15132, 10184, 2638, -8684, -17104, -18412, -16268, -12243, -5515, 4035, 12761, 20213, 22488, 18261, 11354, 2040, -7480, -13181, -17244, -16328, -10137, -2511, 3983, 7833, 9321, 8644, 6733, 3443, -1678, -6687, -8858, -6532, -2594, 255, 1590, 3243, 6015, 6666, 6738, 5934, 4615, 3541, 516, -2433, -5105, -6676, -8146, -9368, -7216, -5855, -4786, -1826, 2936, 8198, 12216, 11327, 8140, 4598, -1164, -5666, -7078, -4867, -2227, 1469, 3274, 5266, 3009, -665, -4063, -11524, -14133, -17563, -15667, -6627, 1720, 12759, 22930, 26230, 23897, 17961, 5779, -7921, -15896, -20785, -20645, -16263, -11013, 339, 11155, 18867, 20197, 10336, -319, -10244, -15077, -15829, -13616, -5439, 4296, 13749, 22482, 27691, 21641, 11217, -1064, -13308, -21113, -23078, -21170, -14972, -4343, 6158, 15068, 17793, 14331, 8209, 2793, -3172, -6929, -7375, -7745, -7028, -2230, 2690, 10405, 14856, 10783, 5873, -1103, -4475, -5114, -6456, -9193, -9516, -8837, -7598, -4484, -1669, 2194, 4445, 6585, 8858, 7656, 6333, 6712, 7364, 6855, 2504, -6366, -14854, -15089, -10825, -1834, 5114, 3327, 1563, -1871, -7178, -5387, -3417, -3861, -1272, 1076, 5997, 9762, 16050, 20754, 17132, 10171, -1307, -12537, -20695, -25769, -24283, -16269, -4489, 5777, 12515, 15517, 13576, 11474, 6550, 158, -5764, -12999, -15129, -10654, 1516, 14819, 21220, 21036, 13561, 3632, -7410, -15408, -18588, -19684, -16116, -11949, -5515, 4501, 11843, 15595, 19538, 15949, 9392, -753, -9747, -8761, -7646, -3911, 694, 2581, 3145, 4188, 5075, 4943, 2063, -4072, -10257, -11290, -10855, -9659, -7569, -3484, 2326, 8980, 12600, 11698, 13121, 11315, 9471, 6242, 903, -3957, -9543, -14978, -16851, -14423, -7879, -3342, -342, 2625, 3493, 3261, 5572, 6732, 3248, 3530, 2200, 1190, 1391, 2048, 3423, 6883, 6781, 4181, -1099, -8732, -12319, -14505, -11743, -8746, -6642, -2866, 1864, 7067, 13982, 17917, 16782, 12148, 3919, -5320, -8846, -11081, -10681, -4285, 973, 4175, 7149, 5633, 4189, 2933, -2801, -6433, -10204, -13501, -14743, -9473, -676, 10137, 19971, 22739, 19681, 10380, 3847, -2472, -8147, -9384, -13352, -16735, -16719, -8503, 3677, 10497, 13621, 9976, 3021, -2936, -8465, -10305, -7835, -2918, 1810, 3296, 4007, 8372, 14269, 16721, 13827, 7073, -3956, -15073, -20755, -20907, -13316, -6981, -3151, -1382, 680, 3316, 6533, 10874, 12525, 10809, 7871, 4908, -1431, -1527, -2018, -3799, -5219, -7430, -6370, -3900, -704, 546, 3379, 1901, -685, -621, -4317, -6586, -5606, -4457, 826, 6799, 10281, 13250, 11137, 11484, 10108, 93, -7341, -14726, -19199, -16368, -11487, -5212, 4475, 10977, 13429, 12841, 7168, 392, -4765, -10183, -11668, -4876, 2836, 8650, 12567, 14966, 14104, 7498, 242, -8334, -16439, -19220, -18853, -13334, -5046, 3888, 10849, 13974, 18149, 14497, 7246, 183, -8033, -8095, -8986, -8273, -4130, 1102, 8591, 12159, 12589, 7910, -876, -9709, -15681, -16752, -11620, -8544, -5051, 394, 4651, 6652, 9350, 13713, 13063, 10852, 4823, -1426, -8497, -9483, -6514, -5913, -2943, -3934, -3863, -3144, -2520, 3448, 8302, 9167, 7675, 875, -3975, -4676, -4078, -2943, -3216, -2146, 2442, 6023, 10430, 14003, 13339, 10477, 1856, -9473, -15785, -19918, -21312, -15073, -5165, 6747, 13644, 14915, 14423, 12523, 8370, 3152, -3365, -8330, -12920, -14327, -9391, -451, 11146, 13726, 11823, 7720, 1021, -6517, -11614, -11620, -7785, -6108, -5998, -2149, 5159, 13651, 14857, 13329, 9465, 1413, -5949, -12001, -9608, -3707, -1535, -864, -1773, -933, 2213, 2587, 4189, 5739, 1898, -3237, -8194, -8975, -6442, -1503, 1573, 1467, 1884, 2836, 5018, 7919, 7905, 6968, 4439, -1345, -7129, -13633, -14651, -12627, -8007, -2661, 2228, 7872, 14130, 14341, 10173, 5324, -1710, -7364, -12665, -13044, -8588, -794, 7367, 15993, 19532, 14466, 5396, -5260, -14389, -16833, -18380, -19473, -13684, -4084, 6157, 12886, 21269, 25111, 21382, 10700, -2583, -9788, -16053, -17177, -15093, -11041, -2072, 4407, 10696, 14070, 12614, 9721, 4803, -1106, -6658, -11247, -11985, -10178, -4749, 900, 5455, 9766, 9502, 7177, 4398, 3156, 1264, 268, -2779, -6476, -6911, -6950, -6548, -3797, -714, 847, 1963, 2137, 625, -538, 2463, 3482, 1463, -2770, -6104, -8057, -2853, 6239, 10489, 11093, 7681, 3879, 1311, -5905, -13385, -16282, -18572, -14901, -7855, 698, 7279, 16254, 22580, 19431, 16366, 5775, -6141, -12086, -15189, -12960, -8740, -5811, -222, 7832, 14705, 16023, 8036, -462, -8012, -13523, -12738, -10418, -8723, -1284, 9168, 16366, 21389, 18142, 11098, 4711, -4611, -11290, -15423, -16075, -13049, -9873, -1105, 6617, 14162, 14290, 8551, 3859, -1474, -2788, -3633, -5198, -6231, -5803, -4932, -285, 6587, 10213, 8014, 5289, 3216, 1157, -1628, -5904, -7820, -7236, -7377, -8178, -7536, -5854, -2113, 2540, 7714, 12046, 13374, 12054, 8978, 6740, 4057, -4282, -12856, -16819, -16082, -8782, 599, 8042, 12212, 9265, 5587, -1450, -7601, -10723, -14186, -11323, -3925, 3137, 12571, 21144, 22335, 20647, 11062, -1985, -12576, -19499, -23488, -22682, -16897, -7769, 3934, 12668, 19571, 20224, 13442, 5849, -3139, -11620, -14136, -14642, -9248, -1928, 7509, 15502, 17782, 16504, 8165, -739, -9705, -16105, -18328, -19500, -15779, -6352, 2490, 12565, 17880, 14844, 13444, 10729, 4716, 142, -7114, -13184, -13915, -10889, -4489, 2620, 7753, 7853, 7550, 6270, 1998, -2958, -6252, -9045, -7888, -6202, -5841, -5881, -3341, 4633, 10781, 15732, 15862, 8298, 4803, 3525, -74, -2945, -9813, -16295, -18377, -15396, -8314, 1387, 9840, 12740, 12208, 9418, 5504, -111, -5002, -7439, -9222, -7233, -3212, 850, 8003, 13911, 17350, 14679, 4106, -6788, -15691, -20634, -19108, -14286, -6187, 1250, 6764, 14358, 19539, 17424, 13147, 6270, -4238, -11689, -13475, -10097, -6005, -227, 6155, 7129, 7084, 5752, 782, -2307, -6860, -10084, -9239, -11034, -6861, -372, 6487, 17022, 19380, 16337, 9220, -574, -4065, -5401, -7771, -8235, -8332, -8594, -7993, -4237, 96, 5019, 8981, 8466, 5802, 1900, 174, -2348, -1219, -1629, -3518, -3060, -4452, -3661, 2912, 9338, 10441, 10596, 7230, -132, -5511, -9944, -13594, -11988, -10449, -6185, -2506, 2684, 12778, 16229, 14613, 10699, 2615, -4615, -11643, -14896, -11361, -5152, 1713, 6225, 10463, 11609, 11970, 7444, -2251, -8866, -13977, -17313, -16387, -12522, -4610, 4970, 14031, 20018, 19406, 13513, 6712, -127, -5529, -11842, -13255, -12161, -11982, -3408, 4378, 11663, 12256, 6779, 1420, -4620, -7415, -8909, -9585, -5255, 692, 7634, 14881, 15545, 13373, 6915, -922, -5674, -9283, -14278, -16659, -14615, -6148, 2194, 7652, 9530, 8477, 7404, 4196, 1872, -155, -2236, -6135, -6202, -4113, -188, 2320, 2018, 1566, 4672, 6106, 3110, -1337, -5202, -3356, -1641, 97, -3844, -7610, -8935, -7222, -3258, 3238, 6226, 7453, 9700, 8534, 8886, 3804, -2387, -7862, -11094, -11106, -8533, -2253, 4720, 8765, 9505, 5581, 66, -3134, -7057, -10128, -12287, -7492, 593, 8637, 16004, 19419, 20349, 13665, 4514, -3678, -14906, -20762, -23682, -21264, -10162, 1741, 12524, 17196, 17652, 13289, 5069, -1964, -8499, -11043, -11587, -9189, -3055, 4771, 14359, 18682, 14955, 6420, -1749, -9620, -17179, -20665, -16364, -9547, -1009, 7456, 11725, 16455, 15609, 13501, 7783, -1720, -9594, -15115, -16120, -11781, -4583, 3167, 10437, 13009, 12436, 9620, 4104, -1938, -6712, -9012, -11259, -11750, -10870, -9644, -2992, 5070, 9582, 11826, 12097, 7388, 4397, 3484, 5316, 5773, 2810, -3578, -12890, -15089, -13299, -9705, -2487, 2961, 4094, 6208, 5758, 6104, 6235, 6, -4352, -4028, -6939, -5924, -1322, 6535, 15176, 16168, 12730, 3283, -9251, -14560, -18261, -18852, -14226, -8241, -216, 5888, 14777, 18964, 20872, 16130, 6828, -3189, -13948, -17295, -14351, -7948, 647, 7943, 10252, 11812, 5991, -140, -2616, -6320, -9985, -11920, -10514, -7398, -1154, 11439, 19220, 21575, 15973, 2947, -5266, -9931, -11648, -10416, -6887, -6313, -3877, 1633, 7623, 12313, 12203, 6813, -2213, -7262, -9959, -13121, -11605, -4835, 1152, 5710, 7353, 7309, 9718, 12213, 11084, 7594, 1870, -6935, -14239, -15251, -10009, -5061, -4101, -3693, -3395, -500, 3747, 7134, 10480, 11724, 9855, 5255, -895, -4497, -5777, -6098, -5626, -4850, -2106, 2653, 7567, 8055, 6080, -66, -6378, -8197, -10914, -13705, -11827, -4104, 6766, 16231, 20454, 18709, 12747, 8554, -54, -8340, -13212, -18688, -19593, -14331, -4881, 4476, 9315, 12618, 12069, 7766, 2430, -6278, -9835, -8375, -6247, -3504, 553, 6339, 13651, 14367, 10061, 5174, -1429, -8733, -13903, -14305, -13004, -9543, -4553, 1592, 6076, 8278, 9275, 9473, 6746, 1975, -2260, -4972, -4920, -1065, 2427, 3625, 2727, 1886, 2696, 2770, -941, -5360, -8502, -10402, -7093, -2255, 1125, -747, -957, 1411, 4839, 8604, 9448, 7171, 7847, 9761, 5746, -373, -8707, -13628, -14883, -13435, -9750, -4878, 942, 8110, 11504, 14116, 10143, 1576, -3489, -8489, -10698, -9808, -5312, -462, 7019, 15101, 18306, 14946, 6781, -2951, -10846, -18326, -22412, -21788, -15111, -4111, 6366, 13672, 18149, 19398, 14530, 6979, -1482, -6536, -9237, -10020, -10081, -3012, 3082, 7817, 12598, 8147, 2653, -3279, -9687, -10848, -11295, -9161, -5031, -1569, 4217, 10422, 14130, 14056, 11856, 6108, 419, -6176, -8531, -8854, -6657, -4439, -5679, -4350, -930, 2658, 5310, 6472, 2173, -1541, -3861, -2773, 876, 1040, -2481, -4483, -3105, 179, 6124, 11295, 11626, 10274, 4531, -387, -6059, -12642, -12972, -14554, -12464, -7694, -3770, 3012, 11559, 18337, 18928, 12433, 3801, -3814, -9461, -11492, -8959, -4516, -1909, 1932, 7378, 11214, 11572, 6771, -383, -7981, -13869, -16081, -17196, -11850, -4433, 4533, 12723, 17111, 18975, 14626, 9299, 3535, -259, -4217, -8231, -13763, -15364, -10485, -2539, 4966, 4643, 3943, 2188, 1372, 1617, -163, -2705, 755, 3973, 5791, 7035, 2531, -387, 519, 259, -1442, -4520, -6715, -4697, -3196, 2213, 2748, -1325, -3932, -4638, -2592, 2856, 4401, 1605, 1988, 478, 2478, 1460, -1659, -4309, -4842, -1923, 2227, 6953, 8593, 6838, 4031, 2365, -3391, -8126, -12438, -17998, -17283, -11724, -3850, 6729, 15359, 20834, 21881, 17122, 9867, 1804, -5621, -14597, -18958, -15881, -9835, -2196, 4492, 9608, 10402, 9167, 3378, -4818, -9545, -11940, -10773, -6878, -631, 7713, 16473, 19130, 18726, 13158, 5363, -1586, -9460, -14221, -16655, -16508, -13230, -7736, -491, 6212, 9485, 7789, 6321, 6679, 6822, 6814, 3570, 2422, 2372, -903, -6148, -6950, -7177, -5110, 201, 388, 2007, 4717, 5129, 4406, 161, -5348, -9923, -12703, -11654, -5609, 2867, 8168, 13263, 13137, 12812, 9953, 2108, -3108, -11861, -16282, -13787, -9735, -2398, 6516, 10756, 12063, 7550, -324, -6020, -14084, -16360, -13303, -6778, 388, 8182, 17483, 24802, 26390, 17841, 6469, -6081, -17652, -23211, -25308, -19581, -10011, -906, 5560, 9742, 14515, 12089, 8122, 2722, -2177, -4401, -6348, -5782, -1025, 6580, 12172, 13771, 9114, 1561, -4913, -9539, -12854, -14016, -12468, -10004, -7119, -1168, 4259, 8839, 13035, 13015, 9490, 4731, -599, -3118, -1986, 162, 1153, -553, -3916, -5758, -5362, -2413, 910, 1106, -11, -1379, -1243, -430, -168, -2205, -3361, -3001, -2046, 3332, 6995, 11069, 14214, 11300, 7800, 207, -8939, -14030, -17390, -16102, -11943, -5234, 3365, 10175, 14738, 14439, 7645, -649, -8071, -14117, -13622, -9626, -4294, 5140, 16899, 23864, 24614, 18568, 4514, -5873, -17127, -26132, -26823, -24470, -15802, -5077, 5805, 15802, 21932, 20211, 13481, 5852, -708, -5658, -7790, -6603, -5554, -1753, 2517, 8167, 10330, 4884, -2731, -9858, -11802, -9954, -8802, -8029, -4209, 1164, 7195, 11842, 10931, 8997, 6228, 5477, 5391, 2261, 241, 179, -2484, -3169, -4837, -9309, -10330, -10006, -5010, -247, 2812, 2200, 2915, 6204, 8473, 10139, 7811, 1184, -3286, -2584, -1488, 2154, 2577, 3239, 3042, 676, -2341, -8684, -11807, -12323, -11194, -6315, -1473, 4687, 12192, 14422, 15458, 12722, 2966, -5964, -13767, -14845, -10865, -6388, 1718, 9412, 15327, 18094, 12430, 2377, -4699, -12225, -19802, -22752, -21772, -16994, -4611, 11088, 23253, 29144, 24229, 15619, 8206, -293, -6798, -11997, -15352, -15263, -11442, -5280, 480, 5021, 6346, 5285, 2210, -1658, -5681, -7370, -5664, -810, 5031, 8738, 9633, 9503, 8230, 6650, 5679, 1013, -3768, -9715, -13458, -11977, -9375, -8437, -8184, -5885, -3624, 2344, 9962, 14768, 14992, 13896, 11038, 7466, 2500, -4504, -10952, -14483, -12081, -9067, -3794, 2010, 7172, 10064, 10397, 4940, -3380, -7487, -12053, -12159, -5242, 1733, 8866, 14940, 16818, 16552, 11349, 3190, -5578, -13389, -18453, -19109, -13025, -5115, 3359, 13040, 16181, 15742, 8968, -621, -7268, -13634, -14773, -13898, -11556, -5461, 7177, 18636, 25408, 24756, 16146, 2793, -9221, -16632, -21537, -21794, -19770, -15309, -9494, 27, 8757, 16141, 17480, 14335, 8659, 762, -5017, -7382, -3711, 716, 4735, 5576, 3881, 112, -1762, -2886, -3774, -7493, -13054, -12474, -9499, -3687, 3195, 6581, 8660, 9920, 9162, 8437, 6434, 6845, 6257, 5048, 3468, -2627, -11120, -15249, -16524, -12610, -4895, -593, 4564, 6507, 10164, 10532, 8375, 5989, -1002, -7901, -12261, -10633, -3899, 3478, 9415, 14032, 11499, 7932, 1918, -6244, -10469, -14848, -15606, -13707, -11211, -3329, 6293, 14415, 18624, 14232, 5659, -5136, -11923, -12728, -9467, -4725, 362, 7895, 14305, 18461, 17201, 9670, -2386, -13200, -19275, -20738, -19577, -15139, -6822, 5074, 16652, 23176, 21862, 15772, 10008, 5043, 1100, -5784, -11614, -11424, -8834, -4602, 1163, 3218, 3042, 868, -2017, -4635, -5551, -5340, -3525, 2975, 7524, 7330, 4921, 2757, 3073, 5071, 4873, 1569, -2761, -1991, -2286, -196, -866, -6267, -8103, -11668, -10739, -5850, -477, 4482, 10689, 12344, 10738, 6464, -1478, -4867, -7411, -9274, -7276, -3152, 2596, 9490, 13209, 15403, 10474, -343, -7803, -15590, -18571, -18241, -15244, -6473, 5548, 19262, 24601, 25057, 16777, 4319, -4571, -12041, -12825, -14095, -13767, -6858, 2889, 11010, 14677, 10721, 3849, -3781, -10299, -12514, -12259, -7808, -4562, -608, 6793, 14617, 17597, 14766, 10452, 3112, -3489, -8276, -14259, -16217, -12899, -7330, 1368, 7855, 7324, 5381, 179, -2220, 1974, 3051, 1248, -422, -1611, -562, 2012, 2807, 2030, -149, -1766, -289, 1425, 612, 235, -484, 547, -132, -6269, -10909, -10626, -6316, 1088, 6245, 9946, 9902, 8208, 10997, 8159, 2473, -4373, -10546, -14409, -13167, -5846, -394, 7613, 12625, 9884, 4513, -4582, -8672, -12348, -13591, -11118, -6721, 470, 8450, 19929, 22819, 20665, 12982, 2865, -8527, -18517, -22123, -23775, -17996, -8370, 2914, 11124, 16130, 16989, 13318, 10471, 3657, -4198, -11844, -17384, -14940, -5513, 4421, 11654, 14659, 11612, 7081, 3545, -778, -5179, -7435, -10286, -11584, -7782, -4791, 262, 3981, 4954, 7180, 4910, 2723, 257, 196, 3012, 5003, 5585, 2069, -4365, -6830, -5342, -1641, 675, -350, -3053, -3922, -2156, -1209, 244, -1320, -2337, -4826, -3856, 895, 5416, 10951, 13723, 14573, 11137, 1364, -7258, -9761, -11586, -14148, -13516, -10162, -4378, 3659, 9582, 12713, 10496, 5291, -1104, -6726, -8783, -7136, -2798, 3165, 10733, 14722, 17102, 11513, 2883, -3977, -12482, -18478, -20333, -17131, -14749, -3943, 7202, 15203, 24419, 22173, 14359, 5579, -4790, -10850, -13947, -14633, -11403, -5419, 1939, 7743, 11557, 11476, 9029, 4720, -1960, -8953, -13942, -14355, -12281, -9165, -419, 4442, 6467, 9807, 10154, 13007, 12562, 7840, 3948, 1280, -1067, -3177, -7419, -11312, -10512, -8885, -8025, -4778, -1417, -224, 5113, 9695, 11564, 9642, 4735, -255, -3396, -797, 159, 1418, 4260, 8425, 10145, 8548, 2217, -8724, -15635, -19883, -21455, -17962, -12858, -4032, 9863, 21909, 29209, 26478, 17325, 5772, -3799, -10761, -16546, -16941, -13968, -7211, 1503, 7543, 11290, 9222, 3075, -3562, -12185, -14595, -14048, -10875, -2891, 4325, 13859, 20061, 19430, 16793, 8070, -2072, -7756, -12365, -13700, -11973, -6936, -111, 6163, 8038, 4956, 745, -3060, -5086, -6555, -6508, -5185, -371, 6613, 10593, 11952, 11478, 7444, 4676, 1885, 18, -1661, -3753, -4626, -6511, -5851, -6482, -10354, -15741, -15231, -11212, -3805, 5757, 14802, 22311, 22820, 20886, 16660, 6160, -6093, -16283, -22891, -20917, -12765, -4868, 3083, 8199, 9360, 6972, -1508, -7455, -10355, -10213, -9709, -5585, 4422, 13968, 21871, 26829, 25029, 13663, 387, -12548, -20261, -22415, -21846, -18152, -12313, -1567, 7508, 13241, 15669, 11372, 5756, -141, -5847, -7179, -6767, -4364, 3311, 9994, 13906, 12732, 7487, 2640, -2808, -7143, -11103, -15112, -15139, -11591, -4797, 1595, 981, 1262, 1866, 4069, 9474, 9991, 8261, 7181, 7537, 6671, 3173, -891, -6894, -13223, -12003, -9503, -5835, -532, 199, 1633, 3997, 4418, 650, -6467, -10533, -10012, -7038, 1516, 10157, 21180, 29062, 25803, 19221, 7439, -8967, -20292, -28221, -30882, -27614, -20449, -7769, 6761, 17753, 24617, 26793, 18252, 9222, -1567, -9356, -10590, -9769, -5844, -2273, 3451, 9987, 12549, 11376, 5473, -5700, -16434, -23661, -19745, -11570, -5174, 169, 4912, 12931, 15114, 13280, 9540, 3653, 2711, 1951, -1257, -2733, -1281, -1299, -1555, -3371, -5901, -8794, -11511, -8431, -4296, -1547, 367, 1809, 4580, 8448, 7663, 6903, 5341, 3304, 3645, 4846, 4680, 4478, 2292, -1238, -5037, -11026, -14372, -16623, -13264, -7404, 53, 2748, 8147, 15609, 17104, 16307, 8485, -682, -5061, -8674, -8335, -5383, -3090, 5422, 10324, 13591, 11198, 380, -9310, -15421, -17556, -16809, -14517, -11719, -4150, 8596, 20526, 29040, 28238, 19930, 8816, -3586, -11506, -15564, -16451, -17123, -13198, -4387, 3407, 10178, 12861, 10228, 6553, -551, -6256, -11313, -14189, -9475, -2791, 7826, 14977, 15316, 11475, 8801, 7056, 2281, -3283, -9117, -13773, -14398, -9529, -4691, -3180, -2423, -942, -797, 3469, 6650, 7176, 8261, 9356, 10420, 7819, 2936, -3227, -9446, -12252, -9805, -6432, -2007, 2171, 4150, 4258, 2444, -541, -2948, -7184, -9028, -7787, -3993, 3944, 13930, 20899, 21815, 13852, 3971, -2632, -10530, -15269, -19738, -19029, -13526, -1557, 9119, 16469, 20460, 13825, 5292, -826, -9661, -14745, -15609, -14913, -5236, 3966, 11504, 16831, 20010, 16829, 8142, -4453, -14371, -16399, -16416, -13536, -7562, -617, 4665, 9443, 10388, 9588, 4379, -1615, -4072, -6054, -5228, -2401, 4, 4324, 6605, 2596, -684, -3747, -1991, 477, -3055, -5975, -5499, -3290, 405, 1356, -790, -3296, -5161, -1283, 4415, 8011, 8385, 7435, 6184, 6404, 1990, -8180, -13158, -16394, -16518, -10750, -3854, 5929, 16110, 19337, 19715, 13305, 1742, -7794, -15539, -17820, -15583, -7891, -397, 8444, 17321, 17773, 16278, 9838, -1536, -12314, -20920, -21673, -16563, -6917, 3753, 12620, 21033, 22800, 17878, 8511, -3500, -13761, -19432, -20794, -17670, -11244, 418, 12782, 21737, 26085, 19014, 5690, -4641, -12730, -14810, -14440, -13848, -10924, -8210, 231, 8152, 13132, 14389, 12846, 7294, 951, -3548, -4504, -3560, -2901, -1464, -2970, -4164, -4077, -1415, 1038, 4341, 4533, 1998, 249, 774, 972, -335, -3691, -6358, -8507, -7848, -3416, 3883, 12666, 15461, 15194, 7374, -2911, -10388, -14478, -15905, -14066, -8494, -3196, 4866, 15496, 20425, 17945, 12184, 1568, -9187, -15509, -20134, -17769, -9293, -415, 10213, 17302, 22141, 21114, 11477, 1797, -8640, -15779, -18639, -18572, -13154, -4175, 6431, 15020, 18860, 13692, 4084, -3354, -9459, -11584, -9796, -7563, -1675, 6799, 13584, 16823, 14740, 10026, 3763, -5235, -12394, -16748, -17769, -17351, -10960, -1277, 6243, 13626, 15007, 15863, 11476, 6128, 1725, -4069, -5949, -6101, -5293, -1843, -953, -4542, -3908, -3643, -396, 6355, 5220, 2793, 539, -4219, -2388, -1872, -3667, -5769, -7433, -2510, 4409, 12724, 17179, 14675, 11990, 5306, -5540, -13418, -17882, -20727, -18877, -14122, -6962, 2788, 11982, 19645, 23474, 20932, 10283, -630, -9971, -14440, -14931, -11938, -5124, 1797, 8878, 13331, 14252, 8992, 2525, -3895, -12489, -17718, -18194, -16436, -7440, 3485, 14462, 20717, 16259, 13424, 10023, 4774, 97, -6185, -11144, -13178, -11201, -8386, -4375, 971, 1601, 1669, 1566, 204, -753, -2470, -763, 3349, 5609, 5844, 5271, 4427, 4745, 4881, 3929, 459, -4081, -6035, -7453, -7527, -4041, -3534, -5713, -6835, -6200, -2447, 1442, 5712, 9753, 10708, 10175, 8788, 6085, 1671, -4325, -8725, -8868, -7316, -4179, 176, 2740, 5674, 5271, 1182, -5241, -10309, -13283, -14632, -9298, -2632, 2211, 9684, 18071, 25071, 29654, 20234, 2854, -10287, -19567, -22961, -22892, -21299, -14003, -3684, 8595, 17843, 20445, 17418, 8272, 222, -4687, -7738, -10431, -10894, -8362, 2333, 13580, 18001, 19464, 11812, 2938, -4138, -10121, -16760, -22447, -21628, -16907, -6325, 7915, 14340, 15315, 15736, 14900, 12441, 6418, -1240, -7513, -7853, -6621, -2499, -388, -2845, -2891, -1713, 387, 371, -2671, -5398, -6489, -2713, 746, -632, -566, -196, 1952, 5561, 7520, 8989, 10752, 9712, 8251, 3805, -4986, -10638, -14684, -17796, -17792, -14282, -7179, 2712, 10356, 13055, 13184, 7958, 4045, 2039, -2114, -3160, -3969, -2295, 2538, 8542, 13211, 11264, 4699, -4837, -13157, -20213, -23339, -20607, -15293, -5326, 6579, 16912, 24781, 27363, 23436, 14332, 3865, -7692, -17666, -19592, -18925, -11087, 613, 6693, 11039, 10364, 6398, 1586, -3164, -7057, -9137, -10735, -12043, -5817, 5106, 13120, 18352, 15456, 11178, 5927, 2032, 94, -6542, -10063, -10471, -9645, -6295, -3740, -3904, -2173, 244, 3647, 7676, 7234, 3868, 1297, 3396, 8789, 7110, 707, -7375, -13300, -8682, -318, 5434, 8571, 6218, 3067, 2982, -941, -7069, -12147, -15081, -14867, -10785, -2958, 4343, 13780, 21355, 22804, 19974, 9006, -1624, -10902, -14162, -14238, -13948, -9036, -2542, 4422, 9658, 8530, 3369, 462, -4479, -7427, -8216, -5909, -1561, 6262, 15643, 18181, 17194, 10605, 2584, -2555, -11665, -17044, -20196, -19196, -13093, -4861, 5436, 11914, 16628, 14624, 11430, 5975, -1145, -6933, -10436, -8263, -4407, -2509, 396, 2936, 3327, 5502, 5609, 2251, -1181, -4470, -6332, -4025, -3319, -3891, -3369, -6656, -3987, 2106, 3402, 10670, 14217, 10870, 7162, 2337, -557, -5065, -9857, -11550, -12636, -9582, -4056, -1712, 5821, 13337, 15010, 13421, 4237, -7226, -13068, -16818, -15545, -6190, 756, 5180, 11376, 18826, 24114, 20325, 7565, -6234, -16775, -21679, -21932, -19826, -14178, -4905, 7234, 15499, 20003, 19373, 12988, 4696, -164, -4476, -10697, -14037, -13441, -6241, 4991, 12475, 12225, 7222, 21, -3521, -6780, -10166, -9094, -7121, -2172, 3909, 7688, 10773, 8247, 7855, 7418, 1893, -2144, -7452, -10971, -13135, -8210, -2992, 1594, 5681, 6348, 7642, 7679, 6725, 2955, -339, -4320, -7222, -8078, -7423, -5262, -3158, -1303, 947, 4601, 6462, 6059, 7338, 9123, 6299, 315, -8207, -13513, -15409, -13464, -7170, 783, 9496, 15670, 16571, 11597, 3924, -4218, -8881, -13297, -16024, -13535, -10908, -5174, 10055, 22875, 27100, 23699, 11845, -495, -10574, -17155, -19952, -20111, -16670, -9476, 1293, 13720, 20912, 21969, 15643, 6499, -2115, -12009, -19266, -18733, -13793, -4256, 6173, 14072, 18532, 13950, 8980, 3362, -1836, -6523, -11515, -15237, -14151, -8603, -1441, 7656, 9332, 8540, 5852, 818, -774, 40, -1780, -2167, 1539, 3441, 2133, -444, -630, -1534, 739, 3956, 708, -4094, -8716, -9617, -3642, 3126, 6505, 2970, -2912, -4254, -938, 7726, 10749, 10742, 7135, 1783, -384, -3375, -7718, -12518, -12386, -10494, -4185, 513, 5203, 11518, 12938, 15154, 8655, -3582, -13641, -20795, -16917, -5107, 4640, 11765, 17191, 20187, 19762, 12070, 1759, -8879, -18009, -23797, -25788, -21875, -12595, 2531, 15760, 24484, 26111, 17243, 5251, -4278, -9151, -7442, -6560, -6052, -4190, 260, 5538, 7582, 7964, 3882, -597, -6068, -11817, -12668, -11315, -6899, 1067, 5598, 7488, 7944, 7227, 7849, 8846, 6679, 3590, 847, -3535, -4369, -2565, -3361, -7471, -10965, -11278, -8245, -2979, 2139, 6055, 8830, 11228, 11387, 7135, 3134, -3568, -9648, -9295, -6031, -879, 6401, 7549, 7249, 6088, 2395, -874, -8183, -13923, -16493, -13986, -7903, 6, 7884, 14554, 17376, 16383, 10998, 1670, -5876, -10778, -13236, -10933, -5571, -1719, 4005, 10196, 14063, 13309, 4464, -6400, -17108, -22990, -20909, -14546, -4571, 4152, 13628, 20186, 26998, 27095, 16345, 4676, -7786, -15665, -17041, -17573, -16715, -11985, -4927, 3056, 9804, 9984, 5171, 2492, 2039, 3071, 4040, 2508, -1885, -4034, 554, 5574, 7753, 5276, -756, -3325, -3566, -3287, -3263, -5227, -7503, -5141, -2911, -1006, -1441, -1687, 3154, 7343, 11911, 11609, 5196, 43, -1060, -595, 788, -6803, -11848, -11419, -9631, -2325, 6056, 10669, 9367, 7789, 2544, -2765, -7075, -8799, -9324, -7812, -2385, 1825, 6996, 13015, 16737, 15168, 8037, -414, -7948, -11696, -15116, -15861, -9089, -1716, 3912, 8062, 8188, 5608, 3299, -2766, -4842, -6376, -7709, -7478, -1536, 9345, 14851, 18100, 16516, 11645, 2533, -7034, -14716, -21127, -22623, -16978, -12008, -6672, 2408, 11798, 18559, 19950, 18321, 12212, 4786, -2737, -5744, -9508, -10043, -5884, -4050, -3164, -3113, -3095, -1184, 2941, 5654, 5707, 736, -3689, -4935, -1697, 1534, 1453, -553, -2764, -128, 5227, 8322, 6639, 5289, 5189, 2241, -1274, -6277, -13649, -15473, -10544, -3174, 1709, 3051, 4901, 7610, 10259, 13036, 9423, -182, -8109, -13712, -12088, -4968, -231, 4038, 7689, 11406, 12191, 7647, 35, -5437, -8460, -12188, -13223, -11498, -10083, -4040, 7742, 16721, 20759, 14706, 3849, -2670, -4998, -5353, -5006, -3740, -4328, -3726, -625, 2488, 6923, 5928, -157, -5474, -9168, -10259, -9970, -4737, 4835, 12836, 11916, 9830, 6841, 4719, 3288, -950, -3506, -6819, -9650, -10461, -5219, -1025, 1121, 100, -1066, 839, 769, 704, 2352, 6904, 7692, 5930, 1063, -4589, -5233, -6557, -6340, -1690, 973, 4462, 10648, 13492, 12181, 4629, -6147, -11797, -14708, -17402, -16791, -12255, -3948, 10655, 20571, 24664, 22074, 12710, 3395, -7439, -12840, -15104, -16474, -15439, -9119, 1861, 10522, 15364, 16641, 9728, 393, -6740, -12426, -11672, -11327, -9705, -2316, 5599, 12042, 15942, 15925, 12285, 6197, 299, -6873, -12086, -14155, -13671, -7383, 108, 3335, 2815, -14, -1670, -303, 2735, 2576, 2138, 2426, 3155, 7110, 9282, 3584, -3415, -6682, -6723, -3606, -3051, -2414, -1209, 1318, 2203, 699, -897, -5318, -11022, -10011, -4351, 2209, 10246, 13450, 15731, 15435, 9830, 1857, -5561, -10733, -16398, -16886, -12817, -7513, 2785, 11304, 13918, 14875, 8005, -3702, -10369, -13925, -12613, -7767, -19, 7468, 15724, 21641, 21591, 18381, 7922, -6478, -17800, -24098, -23017, -19326, -10880, 944, 10178, 15982, 17861, 15375, 9069, 3122, -2490, -6264, -10817, -12371, -11753, -5511, 4465, 11267, 12136, 7124, 3958, 1685, -1209, -7663, -11165, -10945, -10013, -6973, -3762, 574, 2191, 5774, 9136, 8760, 8042, 4710, 2896, 3935, 4472, 1595, -4468, -10651, -12414, -10125, -4823, 1217, 6907, 5539, 1359, -75, -1392, -470, -1709, -4591, -3793, -1300, 3002, 6580, 12926, 16466, 12873, 9848, 1, -9146, -15597, -18947, -18508, -15869, -7889, -3474, 3127, 13254, 16415, 17205, 11678, 2459, -2746, -6363, -6673, -5086, -2947, -2102, 1307, 5820, 7406, 7269, 1229, -7976, -12049, -11754, -9640, -7575, -3036, 2366, 6178, 13842, 20358, 17117, 10441, 690, -7561, -11175, -14063, -12661, -8107, -1322, 5153, 8650, 8507, 6824, 5533, 1302, -2192, -4042, -10116, -15409, -14375, -5659, 6073, 13029, 13717, 10359, 7604, 7726, 5951, 2428, -2020, -7413, -10189, -10524, -8083, -6968, -4486, -2362, -1524, -11, 624, 783, 2975, 7056, 9308, 9735, 3955, -3513, -6636, -6932, -4211, 868, 5139, 6404, 5030, 4475, 125, -6642, -8372, -9572, -12541, -14902, -11266, -3228, 8434, 20915, 27889, 26175, 16223, 5468, -5753, -15203, -17442, -19339, -18950, -14264, -5831, 5837, 13742, 17658, 17523, 10671, 346, -9051, -12960, -10466, -6761, 468, 6486, 9706, 10759, 9219, 6689, 641, -2649, -8886, -12225, -12534, -8376, -75, 4218, 7080, 5013, 1915, -661, -1060, -1631, -1873, -4018, -2222, 146, 2082, 6776, 6680, 5672, 2373, -2013, -2113, -3240, -4350, -2158, -1638, 1595, 825, -3320, -7232, -9827, -8058, -2489, 3575, 9396, 14837, 15867, 13940, 12804, 7116, -4063, -14019, -20354, -19825, -14199, -7682, 1725, 10458, 13398, 15795, 9573, 255, -6072, -11126, -12937, -12136, -6598, 1479, 10654, 20982, 26131, 20382, 9469, -4775, -16427, -24166, -25975, -24192, -17016, -3431, 8500, 21068, 26009, 22772, 17035, 5647, -4496, -11461, -16183, -16280, -13799, -5154, 2570, 8711, 12021, 10176, 9964, 4777, -2437, -7878, -9086, -8641, -5954, -2155, -218, 2242, 2746, 4117, 4316, 4092, 3077, 1104, 211, 1659, 2049, 1827, -415, -6514, -9072, -9288, -6141, -1533, 4049, 6968, 7363, 6128, 1610, -4455, -9063, -8415, -7875, -6494, -997, 4262, 11784, 18451, 17834, 16040, 6556, -6952, -16419, -23778, -22302, -15644, -7397, 900, 8685, 16064, 17300, 14626, 9205, 808, -7549, -10474, -10726, -11628, -5648, 5587, 15490, 20274, 19252, 8322, -3706, -13392, -19786, -20595, -17304, -10628, -6212, 2218, 11975, 21306, 25440, 19444, 10982, 2218, -7785, -14259, -15777, -13497, -8559, -5402, -1735, 3394, 7325, 7881, 7385, 7274, 5223, -966, -8723, -10584, -8778, -3312, 2243, 3355, 4786, 2165, 924, 3297, 4737, 4977, 3651, -334, -5157, -5999, -6099, -6405, -5341, -4395, -4307, -2659, 2475, 5616, 6910, 7319, 6268, 3317, -1106, -6941, -9899, -4630, 733, 5852, 10659, 9290, 4770, 3197, -408, -5079, -6863, -11636, -15191, -13630, -9030, -1717, 7805, 16125, 17810, 14402, 9235, 1744, -2024, -3798, -6322, -7890, -8684, -3416, 2209, 5755, 7720, 2378, -3999, -8312, -12003, -11412, -9266, -4659, 3203, 10244, 16339, 20202, 18610, 10775, 5939, -1809, -10840, -15886, -19519, -17276, -12248, -4982, 3381, 8819, 12723, 13092, 9890, 5505, -569, -4098, -8421, -8951, -2619, 1537, 4707, 7867, 6417, 2976, 1925, 1796, -55, -4244, -8431, -7894, -4784, -1204, 359, -2279, -2942, -3126, 112, 4557, 5956, 4905, 3906, 4692, 6279, 4987, -1029, -7749, -9626, -6453, -2842, 168, 99, 2261, 3029, 1272, -50, -3253, -7934, -11833, -12819, -5856, 3175, 10191, 17681, 20602, 22520, 16256, 5759, -5338, -15988, -20587, -22789, -19302, -10337, -2523, 7030, 14010, 16655, 14530, 6488, -1664, -8199, -9371, -8337, -5630, -688, 6046, 15669, 21044, 18796, 10635, -2003, -12923, -22195, -24996, -23545, -17584, -6224, 3852, 15406, 22722, 22464, 18221, 9793, -745, -8654, -12449, -13647, -12715, -4464, 1992, 6815, 10148, 6899, 3732, -2524, -7017, -6951, -6945, -5504, -3421, -1064, 742, 2387, 5446, 5927, 4711, 1587, -2915, -2125, 2314, 6621, 7628, 5887, 862, -5367, -10304, -12245, -9592, -5909, 813, 3725, 5421, 5229, 3003, 4327, 1807, -1128, -6307, -8823, -3442, 3249, 10330, 17687, 16760, 13653, 3798, -10087, -16553, -21286, -20500, -15809, -7546, 826, 10344, 17784, 21391, 20612, 11499, -1309, -11207, -17250, -17689, -10575, -1161, 8010, 16501, 21289, 19432, 10338, -1843, -13958, -24290, -25710, -23005, -16156, -8269, 4856, 19055, 28867, 30774, 21004, 6872, -7550, -12469, -15352, -16909, -15675, -12768, -4833, 5522, 14075, 16240, 11393, 4803, -1679, -8080, -12248, -12501, -10400, -4809, 3151, 8500, 12297, 9175, 7079, 6937, 2466, -80, -3776, -6297, -5564, -5864, -3673, -1883, -3202, -4758, -6710, -5484, 275, 4845, 6726, 8211, 9156, 10402, 5899, -1805, -5334, -7705, -6566, -3832, 938, 5217, 4644, 2948, 1862, -52, -2419, -6471, -10212, -13856, -13649, -5388, 3512, 14717, 19795, 15771, 9150, 959, -3443, -8302, -12255, -12886, -8630, 140, 8499, 14787, 11993, 6848, 435, -7683, -13240, -20084, -22381, -15477, -4857, 9744, 22379, 27159, 26184, 18229, 7704, -3697, -13978, -21597, -24197, -19665, -11405, -2127, 11035, 16407, 18295, 17247, 5683, -3045, -10629, -15458, -12843, -7036, -1242, 2998, 6999, 12397, 17149, 16162, 9628, 491, -7579, -11260, -15573, -14709, -9805, -4561, -1297, 1606, 5786, 6458, 8227, 9664, 6842, 3319, 282, -5279, -4296, -444, 1326, -631, -2227, -1689, -1815, -439, 1252, 2721, 2298, 1026, -2648, -4687, -6007, -8700, -6558, -4432, -1429, 4011, 7106, 11204, 15754, 16967, 11527, 3096, -5020, -12755, -16231, -16863, -12696, -4793, 1259, 8105, 11088, 10132, 6499, 361, -4590, -8276, -11771, -9779, -3745, 1075, 10280, 16937, 20578, 19591, 8534, -2599, -12367, -21152, -22513, -18993, -10858, -2644, 2599, 8431, 15107, 18580, 13500, 5106, -2186, -5961, -6448, -6458, -7118, -5239, 2363, 8232, 11375, 11444, 7096, -1880, -9543, -11416, -10722, -9813, -11320, -7915, -2272, 6287, 13301, 15762, 15211, 8508, 3702, -1441, -5805, -7077, -6466, -4275, -3098, -1782, -1376, -1077, 1394, 4176, 4525, 1159, -3489, -6743, -7140, -3177, 641, 1597, 2775, 2004, 1473, 3358, 8105, 10549, 11003, 8734, 2698, -4099, -10118, -11613, -12855, -13196, -9998, -4147, -1639, 1929, 7717, 11945, 13940, 10516, 5654, 308, -7524, -11370, -8915, -5441, 2255, 10412, 13523, 11252, 4768, -2026, -9930, -14416, -14489, -16795, -15592, -10375, 1314, 14972, 23431, 26973, 20681, 11000, 43, -7607, -13512, -16296, -13277, -9803, -5922, -473, 6845, 10505, 10671, 9317, 2682, -8397, -13090, -15353, -13769, -6555, 2979, 13387, 17433, 15000, 9834, 6041, 1510, -3566, -8431, -13021, -14795, -10262, -4385, 421, 4186, 5100, 4263, 4016, 2343, -1833, -5349, -5669, -744, 5124, 6790, 1884, -3259, -2256, 2425, 6640, 7740, 3321, -87, 611, 258, -1639, -3575, -8229, -14007, -16163, -12587, -7008, -998, 8259, 17805, 22850, 22620, 14161, 4169, -1164, -9615, -14356, -14300, -13447, -8033, -536, 4506, 10284, 11824, 7273, -512, -6795, -11163, -14012, -10442, -4191, 4977, 12022, 16232, 19583, 17472, 10107, 1608, -7000, -14153, -18837, -17419, -15502, -9151, -536, 7341, 14290, 12915, 10080, 3031, -2507, -4850, -3354, -1627, -1467, -980, 758, 4705, 6863, 6710, 1847, -1911, -6500, -8749, -8799, -6272, -1643, 1551, 5078, 4770, -1, -2035, -1560, 174, 3230, 2210, 1336, 962, 2553, 5926, 5222, 1666, 62, -3253, -5283, -5684, -3296, 1331, 4530, 3698, -1370, -7453, -11377, -9185, -6589, -2038, 1582, 5465, 10220, 16173, 19282, 17691, 11368, 791, -6575, -13213, -18678, -22279, -22526, -11799, 1387, 11710, 15170, 13354, 9823, 4286, 3795, 488, -5035, -7821, -10041, -8510, 2269, 11566, 17413, 15376, 7905, -111, -9434, -13922, -15729, -15091, -11593, -5429, -84, 4239, 10902, 16520, 17891, 15004, 5194, -2993, -10659, -14641, -11308, -6198, -1139, 1716, 4167, 3927, 3257, 5407, 4758, 3171, -421, -6074, -8080, -6952, -3313, -1446, -1968, -882, -251, 234, 2851, 4372, 8000, 11857, 12231, 7938, 1019, -5996, -10763, -13660, -15013, -9280, -4273, -1016, 3414, 6351, 8663, 5568, 738, -763, -3067, -4586, -4090, 159, 9259, 15289, 17852, 16823, 8927, -2133, -12690, -20394, -23742, -22458, -18087, -9867, 821, 10713, 19276, 23203, 21924, 15403, 5439, -4587, -12081, -14472, -14501, -8957, 629, 8294, 11235, 8442, 4715, 540, -5549, -10394, -14601, -15884, -11513, -4732, 4220, 12475, 16814, 17368, 13349, 9365, 3676, -4396, -11003, -12518, -8167, -6622, -6140, -4781, -1727, 2532, 6570, 6989, 4804, 614, -1910, -4972, -6354, -3110, 554, 1878, -501, 924, 964, 4281, 9197, 10841, 9018, 5270, -231, -6705, -10991, -11908, -12005, -12350, -11129, -6968, -2412, 2619, 12432, 17229, 20639, 16120, 5243, -3603, -8815, -7590, -6302, -5145, -3345, -625, 4784, 7863, 5947, 2346, -4599, -10465, -14253, -15045, -13818, -10107, 690, 13240, 23165, 27001, 20134, 9207, 2635, -3041, -10305, -14057, -15239, -16962, -12481, -5784, 1024, 8190, 10316, 8950, 6844, 559, -3933, -5376, -4245, 1074, 4704, 7112, 5554, 7411, 7964, 6342, 3523, -1712, -6394, -11869, -14213, -10316, -4283, 341, 2978, 71, 1134, -113, 1864, 8618, 8691, 5670, 3776, 2124, 130, 1108, 1783, 15, -1893, -5019, -5051, -941, -816, 1356, 2164, 249, -2842, -6590, -9830, -11147, -7570, -2912, 5234, 13330, 20084, 21519, 17543, 13251, 2886, -7591, -15875, -24170, -25315, -20530, -10838, 1319, 13246, 18505, 17879, 12595, 5467, -1541, -10050, -13908, -12880, -7332, 407, 8233, 14138, 21441, 20710, 12109, 727, -11208, -18710, -24596, -22375, -18692, -12530, -2925, 6675, 16057, 19339, 18633, 14405, 7971, 2179, -3559, -6858, -8467, -7781, -4396, -4010, -992, 1781, 1968, 2656, 1870, -880, -4315, -5878, -5740, -3242, -1279, -208, -125, 2464, 6027, 8031, 9067, 8221, 5089, 3129, 1023, -744, -3950, -10908, -13495, -12459, -8589, -3325, 3793, 6591, 6138, 7943, 6572, 3070, -645, -3168, -4814, -4692, -982, 3078, 6005, 12170, 13807, 8558, 3022, -6501, -15918, -20453, -21721, -16501, -5666, 3739, 11512, 16801, 17120, 14764, 10722, 1633, -5970, -12164, -16427, -14835, -8403, 3910, 12370, 19044, 18604, 13258, 6686, -4084, -14828, -21354, -21926, -18379, -11753, -3267, 6499, 13827, 22644, 23778, 17660, 10590, -916, -9066, -11907, -13899, -13016, -8685, -4357, -441, 4829, 8870, 10255, 7135, 1612, -1463, -6451, -8049, -9883, -10459, -5405, 3497, 11890, 13966, 12459, 8124, 5196, 2201, -2645, -6467, -8835, -12622, -13472, -11274, -6179, 1189, 5319, 9106, 10122, 9689, 7063, 2897, 1759, 886, -1073, -4892, -8568, -8273, -5578, 776, 7159, 9067, 8015, 4504, -335, -4382, -5004, -6883, -8767, -7834, -5248, -694, 3656, 9310, 12905, 12114, 9867, 3171, -6568, -11388, -12473, -9858, -1819, 3470, 6677, 10321, 10513, 9242, 3733, -2466, -9091, -14819, -18052, -18613, -13482, -4450, 9608, 22266, 28361, 23880, 11110, 1291, -5561, -9213, -12577, -16856, -18859, -16032, -5072, 6137, 16487, 19993, 13045, 4875, -4234, -11841, -11255, -11002, -6158, 2366, 7186, 11423, 9972, 8860, 7777, 5931, 181, -7473, -14494, -18812, -15178, -4836, 3382, 8870, 8844, 6019, 5376, 5435, 7709, 5240, -250, -6952, -9307, -10338, -7242, -2180, 1180, 2949, 2406, 6142, 8985, 7128, 5545, 3839, -900, -2930, -9514, -14877, -16179, -12495, -3231, 5000, 12341, 14245, 13288, 10543, 8677, 5544, -2326, -9970, -15912, -14277, -6911, 443, 10012, 13622, 12404, 8978, 553, -7432, -14627, -18467, -17069, -11064, -632, 5996, 14070, 24002, 25546, 23530, 11790, -3557, -14382, -21120, -23028, -22698, -15615, -7487, 926, 10197, 17393, 20109, 14540, 6295, -1179, -6569, -8396, -8136, -6699, -5490, -2353, 4909, 8106, 8477, 7885, 3848, -709, -5343, -7287, -6144, -5601, -1913, 5, -516, 1062, 535, 1784, 4366, 4606, 3707, -548, -7057, -6501, -1401, 3338, 4386, 3928, 4278, 3263, 2778, 3084, 2688, -124, -2339, -6945, -9797, -10713, -12171, -9843, -2585, 4527, 10621, 15578, 13914, 14366, 13673, 7323, 299, -8964, -15978, -19801, -17827, -8673, -566, 7108, 12853, 9620, 5894, 3706, -2806, -5891, -6005, -9096, -7744, -3266, 2453, 10814, 20737, 23350, 17578, 6378, -10620, -19372, -23016, -22500, -16788, -10342, -3679, 4706, 13701, 20846, 23799, 16860, 6707, -2913, -12931, -16499, -16418, -12298, -2967, 2857, 8544, 10742, 12157, 13642, 8708, 131, -7560, -12942, -13721, -13988, -11248, -4781, 1839, 10475, 11754, 10005, 6832, 1815, 108, -428, -1465, -2950, -2613, -1747, 668, 2575, 528, -1090, -2608, -612, 760, -5052, -8408, -10282, -7342, 1983, 7177, 5241, 2906, 1820, 2857, 9347, 12891, 10292, 5690, -2048, -8738, -11939, -12771, -12554, -10456, -6936, -2968, 2234, 6681, 9624, 13753, 15246, 11200, 4247, -6381, -10794, -13157, -11076, -2924, 3354, 9113, 13048, 10967, 5300, 1251, -4610, -9899, -14435, -17531, -14906, -8377, -219, 12504, 22927, 25224, 19164, 8237, -3507, -10245, -13510, -12385, -7882, -5640, -4164, -1264, 6289, 12401, 14859, 10055, -2391, -12198, -16948, -14692, -6180, 564, 5281, 8580, 9451, 10407, 11851, 8563, 4088, -2446, -8135, -10168, -12473, -9216, -2940, 2318, 4998, 3791, 502, -1327, -1031, 1075, 3584, 3122, 1610, 1337, -760, 1304, 2617, 1482, -300, -3118, -1568, 2036, 3261, 987, -380, -1298, -3615, -4736, -4830, -8788, -9057, -6121, -351, 7181, 12616, 13081, 9956, 9867, 6822, 2258, -5153, -11275, -11984, -9625, -6268, -1623, 3700, 7407, 8899, 7439, 4499, -3160, -10722, -13776, -13662, -7729, -871, 6142, 11603, 15463, 19463, 16248, 9945, 1152, -10246, -16489, -21218, -19878, -14224, -7533, 1039, 8912, 16121, 16836, 13334, 6273, 1530, 15, -1651, -1790, -5541, -10315, -10151, -5548, 4239, 10439, 8273, 3420, -3457, -5684, -2931, -729, -606, -4379, -8518, -8467, -3588, 7102, 13103, 15259, 14227, 7458, -1308, -9136, -11900, -11320, -7226, -4410, -3303, -1536, 2014, 7509, 13318, 16329, 12216, 606, -13174, -21216, -19009, -10835, -3002, 963, 2072, 3879, 6994, 13057, 17005, 15746, 7933, -1146, -8516, -13758, -15074, -11722, -5104, -1103, 1056, 1035, 1065, 1913, 3879, 5316, 7030, 5009, 372, -1688, -1498, 1047, 2186, 4710, 3014, 535, -1044, -2632, -4717, -7854, -5829, -3901, -3724, -2715, -1806, -1126, 2420, 6809, 12697, 14864, 9130, 1702, -6869, -11633, -9890, -8971, -7943, -5809, -2899, 1571, 5635, 11193, 14071, 13318, 6968, -2139, -9026, -12448, -12161, -10346, -4854, 1434, 6374, 9553, 8412, 7335, 6885, 3412, 88, -6299, -9366, -8501, -6892, -355, 3149, 5805, 5911, 3698, 2098, -2238, -8230, -10298, -5792, 1251, 5799, 4760, 1746, 695, 6566, 11954, 11913, 7028, -2183, -5971, -7569, -9225, -7502, -7394, -7095, -5693, -5268, -1664, 2077, 7902, 15773, 17291, 14079, 6828, -5317, -12020, -10926, -8895, -7811, -7865, -5837, -2963, 2376, 8962, 13472, 14583, 7800, -1955, -8532, -10297, -8480, -6239, -6161, -2600, 4809, 9491, 10826, 8576, 6336, 3259, -2247, -5870, -7833, -7434, -6488, -4931, -535, 4189, 6337, 4055, 1628, 817, -723, -1575, -615, -552, -946, -2777, -3220, 853, 3380, 4203, 3999, 4331, 5016, 2250, -3227, -5432, -3933, -4502, -6038, -7314, -6680, -2675, 2185, 7944, 14692, 14977, 8454, 3502, -1344, -2472, -6248, -10961, -9705, -8369, -2756, 2223, 6672, 10002, 9205, 6382, -87, -4416, -8463, -11160, -10109, -8328, -2024, 4679, 8782, 14562, 14203, 10757, 8529, 451, -5642, -10408, -13908, -12583, -10965, -5684, 1732, 9057, 12958, 11057, 6331, 502, -3659, -5862, -6270, -6804, -5941, -3218, -877, 5824, 11799, 14517, 14453, 5505, -1114, -5864, -10697, -11272, -11940, -10766, -9499, -6505, 541, 7160, 10974, 14418, 14635, 10191, 3727, -3178, -10761, -12152, -7524, -3717, -761, 614, 2090, 3277, 3729, 3299, 2465, -1388, -6498, -6143, -5970, -3685, 1433, 3921, 7606, 8907, 7928, 3961, -2038, -4521, -2909, -1024, -344, -1738, -4492, -5365, -3162, 1308, 4147, 4782, 2892, -628, -4578, -6002, -5465, -2599, 452, 1194, 927, 1288, 2931, 8350, 15034, 15593, 11436, 2912, -7926, -17296, -19127, -14689, -10610, -6072, -4634, -2649, 3658, 12231, 20505, 19421, 11900, 3115, -5197, -8847, -8684, -6740, -2598, 361, 2501, 3494, 3269, 3317, 918, -766, -5103, -10511, -13727, -13783, -8204, -554, 10069, 17608, 17914, 15462, 9547, 3847, -746, -5289, -9249, -12857, -15833, -15738, -9893, -1136, 8261, 13825, 12922, 8796, 4708, 141, -4455, -6712, -5639, -5191, -5190, -2778, -1863, 2083, 8516, 12102, 13174, 8900, 158, -5515, -6514, -5493, -4461, -7302, -10886, -14093, -12381, -5532, 1739, 8843, 14476, 15933, 11742, 7397, 3904, 3664, 2467, -1449, -6693, -10662, -11302, -6189, 1589, 4953, 6147, 748, -6134, -7612, -7543, -5950, -2350, 799, 6121, 10730, 14866, 17265, 16103, 11778, 4481, -4155, -14114, -19249, -20128, -17079, -10683, -1901, 4181, 8031, 9955, 8926, 8442, 6320, 1585, -2415, -5950, -7405, -4917, -2500, 4866, 10126, 10159, 8193, 2936, -2082, -5147, -9125, -11531, -11555, -8146, -3559, 15, 4814, 6998, 9678, 9032, 6480, 2320, -2413, -6125, -6828, -3312, 1105, 1976, 1844, 3351, 5142, 6799, 5267, 1553, -4514, -7203, -11113, -10607, -8632, -8835, -5841, -2463, 2797, 9339, 14712, 15634, 15649, 15819, 11921, 1747, -7976, -14444, -17577, -17557, -16694, -12686, -4802, 2015, 8991, 13726, 14465, 11410, 5424, 161, -4995, -6229, -5434, -4245, -1813, 3853, 7466, 10838, 12671, 6698, -1177, -9585, -16758, -17949, -15573, -9245, -2456, 3909, 11624, 15505, 17792, 11990, 6720, 1663, -5704, -9056, -8519, -5882, -3641, 2145, 5955, 6957, 4897, 341, -5435, -7002, -6613, -6470, -5925, -4574, -1986, 3404, 8263, 8032, 9122, 6653, 3758, 2145, 859, 832, 106, 122, -61, -2433, -4682, -7869, -10152, -8109, -4593, 690, 3833, 3128, 2280, 2998, 5073, 6292, 5457, 1705, -3922, -6084, -3079, 2643, 8478, 11618, 7075, 286, -5598, -13464, -15159, -13927, -12367, -7303, -2003, 3324, 8805, 16278, 20268, 18372, 10814, -1032, -9849, -15710, -15466, -10709, -5148, 851, 6580, 9984, 9702, 8644, 4691, -1015, -6297, -10297, -11808, -11000, -8461, -3373, 4099, 9584, 13548, 13415, 10274, 7152, 5505, 2985, -1529, -5941, -11107, -13572, -12677, -8452, -5632, -2884, 1081, 1944, 3063, 5029, 6580, 7378, 8931, 9789, 5642, 815, -4635, -7274, -6209, -4307, -1514, 808, 726, 514, -321, -1689, -948, -2913, -5463, -8822, -6700, -1514, 3433, 8325, 12261, 15660, 11686, 5354, -469, -6141, -10464, -12026, -9954, -6759, -3056, 13, 3485, 8685, 12809, 12242, 4518, -4592, -11093, -13825, -11645, -5068, 999, 4118, 6095, 8836, 11065, 11817, 9774, 3953, -2107, -7603, -10595, -10937, -9349, -6369, -2231, 492, 2471, 2181, 1443, 2209, 3941, 5322, 5073, 395, -1586, 351, 1110, 4523, 4931, 4914, 2534, -2087, -5561, -6809, -7932, -7935, -7136, -8857, -7426, -3784, 319, 5681, 11884, 16569, 15746, 10961, 6117, 798, -4105, -6445, -7115, -10689, -13561, -13908, -10018, -2956, 4265, 10078, 10764, 8545, 5521, 1908, -287, 159, -1027, -3864, -5648, -5246, -2983, -583, 2849, 7426, 7348, 3817, -23, -3559, -3500, -1146, -88, -1681, -4941, -5615, -1824, 3979, 7985, 5635, 2429, -80, -922, 856, 612, -963, -2420, 310, 3319, 4806, 6920, 4479, 3082, 1243, -4000, -6458, -11046, -11158, -7444, -5645, -2570, 4, 4318, 8656, 13808, 17336, 14164, 6076, -3170, -9544, -9819, -7728, -5787, -4041, -3934, -4182, -2756, 951, 6767, 8195, 2542, -2485, -5391, -6096, -1894, 2506, 5501, 9198, 7858, 5766, 3330, 368, -2435, -4751, -5705, -8407, -10255, -11895, -10343, -2199, 6787, 12971, 13455, 9021, 5905, 2520, 559, -1102, -3921, -7151, -10126, -11155, -9889, -3860, 4003, 10328, 14607, 13979, 8842, -530, -8550, -8908, -5626, -4740, -4895, -6818, -8501, -2954, 3805, 11643, 15700, 11588, 4280, -3194, -6656, -7261, -3958, -1822, -3394, -2480, -2805, -2201, 2286, 5111, 7950, 7562, 1080, -4495, -9879, -9938, -3515, 675, 4200, 4965, 1544, 2388, 4266, 5051, 5876, 2021, -1722, -5346, -6430, -6030, -5107, -2803, -325, 1440, 895, 791, 1141, 1213, 2571, 4376, 4908, 4860, 2704, 74, -3543, -4948, -4276, -2896, -3419, -2624, 446, 960, 2064, 2702, 1865, 2781, 2848, 428, -918, -5306, -7041, -2723, 4037, 9302, 9834, 3446, -2496, -4180, -2906, -1864, -5239, -6271, -5110, -1290, 2368, 5561, 9793, 9191, 5280, 2398, -2944, -9002, -11139, -9978, -6516, 1322, 6814, 8877, 8825, 4981, 3884, 2350, -941, -4387, -7668, -9163, -8432, -3548, 2594, 7375, 11169, 9916, 5472, 257, -4740, -7714, -8034, -6390, -2803, 36, 1173, 2092, 4596, 7991, 9213, 7231, 2294, -1815, -5795, -6734, -5105, -1659, 1730, -184, -4330, -5938, -3373, 236, 3699, 6998, 8556, 7963, 4523, 1796, -875, -4484, -6981, -9758, -10879, -9292, -5316, 449, 7970, 16155, 16605, 8979, 736, -4513, -8698, -10499, -9505, -8274, -3771, 121, 4899, 7857, 10439, 11972, 5735, -1457, -8074, -11254, -10259, -7671, -1999, 3691, 6049, 7362, 7602, 6845, 2784, -1883, -6501, -9554, -9498, -7325, -5716, -6034, 1012, 10047, 14698, 13011, 8781, 4608, -570, -2653, -3005, -3037, -5283, -7923, -6692, -4040, -1201, 515, 1791, 2526, 2294, 4105, 3313, 1543, 374, 2590, 4428, 2124, 580, -2522, -4196, -1803, 1030, 3768, 3044, -1030, -2772, -4580, -5196, -6449, -5916, -3455, -564, 3723, 5770, 5878, 8005, 9351, 6392, 2065, -4755, -9384, -10118, -9935, -5651, -968, 2430, 6304, 7766, 9006, 8260, 3676, -3374, -6297, -7372, -8048, -7573, -7843, -5335, 703, 8504, 11981, 12846, 10100, 5429, 2293, -1443, -2656, -3833, -6408, -7509, -9275, -7496, -4288, -29, 3939, 5385, 7464, 5014, 1130, -1453, -3083, -737, 3220, 4192, 4385, 3408, 1839, 1794, 2261, 1621, -1141, -6613, -13314, -14868, -12166, -5702, 876, 3096, 4893, 5600, 6525, 7177, 8207, 9805, 8760, 5046, -1162, -5529, -8793, -8650, -6036, -5228, -6193, -5637, -3290, -2020, 3012, 6668, 7741, 7945, 5730, 2921, -1075, -4223, -3985, -2533, 723, 3506, 3705, 2421, 2963, 4873, 2317, 737, -3118, -7969, -10612, -11761, -9006, -3827, 3401, 11278, 14674, 11557, 5973, 1048, -191, -303, -1642, -4844, -7866, -7571, -2653, 3744, 8377, 8928, 5388, -202, -5336, -7754, -9343, -8606, -6736, -2384, 1322, 4503, 6609, 7132, 9725, 9927, 8713, 4012, -2913, -8043, -8312, -6018, -1527, 56, -4477, -5391, -5253, -2777, 832, 1519, 302, -4, 904, 2252, 5610, 5159, 3167, 1103, -862, 69, 997, 1795, 1383, 1226, -270, -3954, -6889, -7649, -9437, -11017, -8606, -6040, 73, 7330, 11465, 14934, 16063, 14582, 8992, -326, -6740, -10827, -12376, -12241, -10988, -8277, -3148, 3679, 9356, 12198, 9725, 4787, -1067, -6308, -8131, -6457, -4480, -2460, 737, 4908, 8794, 11533, 11118, 7109, 2907, -2593, -8865, -12639, -13764, -10336, -6778, -2373, 3287, 7341, 9465, 7289, 7282, 6538, 4911, 1203, -5001, -10037, -9229, -3005, 1207, 4585, 5604, 5119, 4034, 1788, 22, -1020, -2496, -3481, -5563, -5531, -4841, -6686, -3402, 1103, 4832, 6937, 6488, 4674, 3037, 5650, 6790, 3988, -60, -4009, -5546, -6442, -5927, -2822, -1195, -1670, -2069, -1379, 260, -248, -609, 540, 943, 2588, 4819, 5233, 4664, 7559, 9292, 7159, 1839, -5307, -9495, -12577, -11697, -8424, -5887, -3216, -1918, 1345, 7064, 11928, 12129, 8022, 3762, -189, -2343, -3085, -5395, -6994, -4353, -1877, 1664, 4268, 2566, 484, 551, 1782, 1895, 651, -2316, -3483, -3870, -2716, 143, 2437, 3371, 2496, 2464, 3141, 700, -1915, -2126, -1783, -1237, -756, -97, -1042, -1200, -677, 2463, 5551, 5617, 2846, -2059, -5326, -4974, -4459, -5973, -6326, -6193, -4477, -1417, 4436, 11390, 15073, 14362, 10984, 5973, -1240, -8124, -11604, -12607, -12800, -10057, -8992, -8061, -1636, 5943, 14466, 17343, 13967, 9037, 2211, -2982, -4283, -2832, -3344, -4973, -4954, -2481, -587, -1131, -519, 2878, 4660, 3891, -520, -4782, -5589, -3220, 568, 3992, 5429, 4445, 1598, -476, 1811, 3809, 2944, -656, -3445, -5601, -6435, -6479, -4403, 161, 3673, 4438, 4093, 3877, 2203, 501, 736, 1223, 314, -3390, -7772, -9213, -8429, -3858, 962, 4871, 6861, 6602, 5428, 3864, 3054, 2842, 360, -2750, -6339, -8560, -8134, -6774, -3392, -916, 1401, 2436, 3141, 1714, 868, 2391, 3520, 3632, 2865, 1853, 1535, 2380, 3017, 3076, -33, -4367, -8623, -9747, -8958, -5337, -596, 1049, 3276, 5924, 8496, 9429, 7935, 6440, 2933, -1030, -3547, -5430, -5919, -8238, -8044, -3829, 942, 5592, 5356, 2709, 1123, 519, -347, -1683, -1839, -2902, -1623, -854, 232, 2712, 3098, 2834, 2356, 1496, -1730, -4032, -4460, -2898, -542, 591, 1625, 1672, -328, -1709, -1541, 368, 1320, 77, 218, -395, -82, 1346, 750, 386, 123, -2529, -3395, -1620, 786, 4189, 7312, 7112, 5015, 2998, -2499, -6608, -8837, -8499, -7451, -5396, -1611, 727, 5373, 10117, 15463, 14825, 7212, 454, -4404, -6531, -6813, -6907, -5174, -3303, -998, 1491, 3142, 3525, 821, -101, -1886, -3026, -2068, -3986, -5282, -888, 4501, 7244, 6362, 4786, 3858, 2227, -16, -3912, -6599, -7799, -6669, -4302, -1150, 987, 52, -988, 1183, 5031, 7887, 8211, 4676, 1432, 1076, 365, -1431, -3506, -5056, -5403, -5301, -3478, -843, 3872, 6884, 6965, 5991, 2116, -3463, -7167, -6782, -5354, -3004, -1197, 672, 3669, 7898, 11965, 11553, 6813, 595, -6794, -11695, -11923, -8847, -4661, -1599, 395, 1537, 4634, 6210, 6893, 4733, 1052, -2518, -6717, -9143, -8036, -4344, 59, 4622, 5268, 4943, 4262, 2964, 3204, 4965, 3452, 662, -4011, -9322, -11243, -10760, -5443, 477, 3675, 4299, 4155, 1814, 3075, 7355, 7852, 7388, 4353, -327, -3896, -5177, -2755, 79, 910, 1321, 442, -2832, -5011, -5048, -2935, 810, 2114, -349, -1741, -288, 2273, 6095, 9470, 9765, 6170, 729, -3731, -7323, -8687, -7941, -6146, -4684, -4759, -3585, -2915, -1210, 3272, 6695, 9065, 9077, 7355, 2892, -2763, -4200, -3930, -3828, -5029, -5939, -5496, -4339, 426, 4258, 6883, 7311, 5175, 2880, -359, -2884, -5433, -5140, -2208, 293, 1992, 1547, 1333, 2856, 5051, 4225, 1177, -2620, -6203, -7012, -5846, -2714, 105, 2389, 3832, 5006, 5176, 4556, 2945, -288, -2655, -5659, -6882, -6958, -7141, -5232, -2627, 826, 6239, 9545, 8861, 7630, 5437, 1711, -288, -3320, -6132, -8391, -10681, -10960, -8654, -3588, 1886, 7585, 12147, 14387, 12488, 7627, 2823, -383, -3000, -6950, -9024, -8831, -8365, -4567, 1461, 7014, 9529, 6134, 3956, 1800, -1996, -3285, -3437, -2054, 1169, 4452, 5633, 4727, 3055, 1744, 141, -1598, -4127, -7964, -10958, -10155, -5093, 972, 5175, 5468, 5316, 5446, 2887, 866, 534, -217, 239, 141, -854, -1457, -3140, -3826, -2779, -2924, -3648, -4542, -4907, -1191, 3444, 5886, 5950, 5081, 3528, 1574, -262, -1404, -322, -228, -260, 872, 1792, 22, -1557, -2394, -2510, -1589, -2441, -2602, -807, 2338, 3624, 4343, 5797, 6888, 5759, 2768, 55, -2153, -4641, -6523, -6653, -5482, -2855, 117, 2016, 3972, 5470, 4601, 2903, 522, -841, -2794, -4980, -5013, -4063, -3144, -3410, -3454, -936, 1737, 5009, 6330, 6327, 6302, 3743, 1842, 96, -2999, -7393, -8785, -9119, -7687, -4686, -1907, 2194, 7029, 10796, 10277, 7684, 4056, 875, -971, -3572, -7253, -6854, -5258, -2471, 3160, 7976, 9868, 6759, 1548, -2827, -5169, -6652, -7754, -7156, -5820, -3328, -571, 3907, 11863, 15172, 13157, 9681, 3166, -3994, -9504, -11798, -11850, -10792, -7798, -5469, -2854, 603, 5620, 8883, 8445, 6873, 3551, 154, -2011, -1469, 1239, 2981, 1039, -1900, -3141, -4244, -4535, -1715, 175, 1405, 2938, 2515, 2453, 1409, 994, 1073, -497, -3070, -4557, -3919, -2326, 2548, 6624, 7663, 6856, 2134, -1790, -4094, -4966, -3247, -2194, -2754, -1496, 1879, 4181, 6472, 7065, 4429, 46, -5051, -9995, -11989, -10133, -5672, -1062, 3833, 9133, 12477, 12667, 8239, 3408, -101, -5315, -9606, -11577, -12717, -10458, -4857, 1102, 4872, 6530, 5835, 3259, 2074, 1547, 534, -1953, -3670, -2775, 525, 3989, 4843, 3505, 648, -976, -2020, -3229, -4387, -5248, -4496, -2026, 1071, 2231, 2708, 1422, 702, 2416, 2858, 3852, 4070, 4160, 6547, 6991, 4622, 350, -5592, -8909, -10374, -11583, -9828, -6935, -1538, 4760, 10994, 15575, 13975, 8272, 1702, -2299, -6421, -8556, -9643, -10413, -6416, -303, 4997, 7973, 8722, 6440, 2916, -1453, -4270, -5520, -6058, -5249, -2673, 953, 2802, 3746, 4223, 3859, 3310, 1702, -1801, -4759, -5704, -3438, 100, 3757, 5945, 4898, 2198, -989, -2375, -2802, -2685, -2336, -2703, -2394, -1430, -752, 456, 1548, 2113, 2247, 1028, -335, -378, 1432, 4425, 6416, 6090, 2336, -2508, -5946, -7801, -6761, -5847, -5807, -5363, -3812, 245, 4260, 7819, 9094, 6950, 3152, -1348, -2880, -2702, -650, 1761, 1779, 1809, 1426, -446, -2354, -3995, -5755, -5682, -6039, -6042, -5828, -3207, 2633, 7548, 11281, 13373, 11908, 6779, 1944, -752, -3310, -5589, -7834, -8613, -7581, -5063, -861, 1569, 4134, 5691, 6570, 5264, 2138, 508, -36, -511, -596, 110, -2067, -3967, -4732, -3121, 499, 2626, 3511, 3701, 2237, 1354, 1988, 2079, 1265, -1282, -5309, -7672, -7836, -6788, -3475, -313, 2371, 5713, 7651, 7145, 5276, 3766, 1976, -490, -2597, -4907, -5865, -5982, -4828, -1388, 1483, 2826, 1789, -201, -1890, -2659, -2117, -1412, -1258, -1231, -47, 3535, 7490, 9299, 8572, 4850, 1379, -1739, -3656, -3896, -4797, -5641, -5912, -5106, -4577, -3123, -938, 986, 2009, 2724, 3650, 3976, 5026, 7200, 9880, 10415, 6157, -212, -4546, -7370, -8154, -7978, -7193, -6664, -5494, -2840, 260, 4759, 7333, 6826, 4302, 2075, 562, -242, 182, 907, 1956, 3382, 3100, 1919, -316, -3040, -4052, -4796, -4788, -4267, -3378, -2291, -68, 2911, 4706, 5584, 4378, 1373, -1108, -2355, -2141, -1314, -1345, -599, 349, 1595, 2850, 2931, 2643, 1259, -752, -2926, -4715, -5952, -5822, -3739, -1330, 313, 840, 1524, 2962, 3600, 3865, 3685, 2786, 1250, -398, 107, 1825, 500, -2010, -4136, -6437, -5660, -3268, -648, 1890, 1157, -333, -1463, -1629, 380, 849, 148, -72, 1449, 3035, 3645, 5313, 7629, 8315, 6201, 551, -5130, -9732, -12254, -11135, -9378, -6947, -4607, -1492, 1885, 7598, 12461, 13544, 12249, 8657, 4020, -540, -3578, -4281, -3907, -3418, -2966, -4276, -5303, -4776, -3166, -2574, -2164, -1614, -1553, -678, 1141, 3936, 6861, 9322, 9782, 7618, 2851, -430, -1934, -3526, -4671, -5114, -5841, -6360, -5553, -3451, 83, 1630, 1501, 510, -748, -433, 2158, 3424, 2823, 3323, 4120, 4145, 2979, 2428, 1621, 174, -2506, -5724, -6639, -5901, -4271, -2764, -1320, -719, -551, 350, 1196, 2323, 2736, 1401, 332, 326, 517, 1688, 2778, 3593, 3063, 896, -1123, -3053, -3981, -3810, -2447, -1243, -713, -1393, -2816, -2302, -917, 1336, 2092, 1279, 1293, 1262, 1637, 2833, 5273, 6363, 5081, 2284, -622, -2347, -2343, -2111, -4031, -5010, -6050, -6575, -5395, -3337, 583, 3386, 4374, 4656, 4711, 5326, 6055, 6575, 6457, 5642, 3551, -147, -4462, -6973, -7804, -8075, -7410, -6591, -4357, -1998, -190, 2898, 5007, 6208, 5296, 4560, 4321, 2552, 2260, 1893, 1502, 1065, -631, -3164, -4103, -4442, -4091, -2601, -3010, -3116, -3460, -4013, -2599, -428, 786, 1732, 2685, 3800, 5435, 7486, 8847, 7769, 5933, 2479, -1914, -6222, -10116, -10867, -9120, -6926, -5123, -2423, -61, 2860, 5727, 6646, 6187, 3928, 2082, 978, 855, 1885, 2649, 2349, 1302, 66, -1820, -3590, -5439, -5884, -5760, -5198, -3383, -889, 2467, 4599, 5559, 4714, 3400, 1088, -1514, -2210, -934, 942, 2487, 3919, 4627, 3839, 546, -2214, -4846, -7128, -7539, -7549, -5947, -2291, 1872, 5888, 8138, 8718, 6815, 3648, 432, -1548, -2690, -3777, -3161, -1150, 1199, 1849, 2074, 1568, 537, -963, -2972, -4977, -4903, -3637, -1893, 969, 2998, 4338, 4071, 2689, 1845, 1308, 210, -920, -1213, -196, 1183, 2068, 2921, 2909, 1319, -1112, -4667, -6568, -6870, -6273, -4432, -1498, 1809, 3689, 4887, 5099, 5513, 5459, 3349, 1117, 275, 139, 245, 126, 274, 157, -1501, -4494, -6956, -8000, -8169, -6145, -2854, -252, 2797, 5770, 6499, 7179, 8251, 7330, 4462, 1740, -1509, -4405, -6045, -5831, -4730, -3893, -3197, -2781, -1484, -372, 1158, 3148, 4285, 4213, 3570, 1867, 1158, 1939, 1034, -1168, -2577, -4874, -3642, -2414, -1470, 1349, 1464, 2952, 1553, -1003, -1934, -1031, -609, 372, 2145, 1842, 3143, 3348, 2861, 2715, 2009, 63, -3125, -4920, -5449, -4537, -2610, -1720, -2091, -1800, 207, 1294, 1297, 1465, 2365, 2796, 2485, 1766, 1243, 331, -2457, -3868, -5803, -7389, -6901, -5185, -1258, 1838, 5141, 7812, 7281, 4874, 3030, 2134, -1068, -3889, -4994, -5776, -4888, -2432, 507, 3747, 5414, 4716, 3072, 784, -1495, -2602, -2873, -2154, -710, 645, 2015, 2688, 2438, 1510, 1269, 21, -1458, -2297, -2215, -203, 2182, 2076, 2288, 2667, 1724, 835, -1539, -2765, -3135, -2664, -1894, 136, 1678, 2914, 3467, 3063, 3132, 1568, -447, -2607, -3655, -3318, -2060, -1199, -169, 277, 331, 70, -996, -1226, -1568, -2209, -2478, -2308, -1007, 636, 2249, 3922, 5114, 4750, 2612, 854, -290, -540, -1093, -2036, -2334, -2318, -1754, -1529, -1072, -321, 214, 527, 523, 300, -393, -1113, -687, 576, 1642, 2533, 3700, 3928, 2977, 2286, 1230, 544, 26, -1625, -3606, -5794, -6600, -5855, -4390, -2316, -135, 2230, 3701, 4770, 5447, 5447, 5546, 5317, 4045, 1413, -1783, -4451, -5838, -5692, -4737, -4160, -3725, -2535, -1728, -789, 1059, 2668, 3499, 3437, 2783, 2050, 1109, 1024, 1244, 1154, 1153, 775, -241, -1199, -1465, -1786, -2512, -3184, -4115, -4484, -3840, -2624, -446, 1485, 2920, 3923, 4567, 4740, 4384, 3778, 2498, 1740, 816, -370, -1266, -1684, -2083, -2837, -2944, -2907, -2580, -1794, -1071, -614, 303, 1535, 2425, 2819, 2805, 2978, 2966, 2941, 2246, 1088, 126, -704, -1058, -1241, -1467, -2713, -3695, -3855, -3506, -2060, -649, 318, 742, 1201, 1747, 2035, 2087, 2075, 2130, 2017, 1754, 1433, 988, 183, -595, -964, -1633, -2825, -3956, -4174, -3569, -2122, -310, 377, 1129, 1997, 2396, 2512, 2546, 2140, 1097, -209, -1364, -1406, -747, 61, 399, 178, -188, -792, -1298, -1787, -2179, -1847, -1634, -1220, -132, 351, 1065, 2024, 2368, 1930, 859, -257, -593, -615, -726, -238, 84, -100, -466, -798, -610, -291, -222, -506, -1245, -1879, -1737, -1163, -479, 429, 677, 565, 574, 1318, 2389, 2549, 2628, 2231, 1250, -14, -1212, -1880, -2133, -2173, -2238, -2346, -2302, -1092, 708, 2049, 2917, 2872, 2298, 1273, 400, -9, -317, -480, -967, -1414, -1352, -557, 795, 1856, 1968, 1337, 263, -639, -1243, -1014, -333, 19, 149, 230, 461, 642, 807, 1248, 1008, 384, -590, -1617, -1944, -1809, -869, 67, 833, 862, 491, 254, 351, 518, 526, 566, -114, -636, -649, -804, -837, -488, -326, -332, -809, -1076, -917, -372, 488, 1107, 1156, 1050, 718, 243, 271, 149, 23, -43, -339, -599, -888, -1374, -1448, -1009, -777, -896, -1092, -600, 229, 1002, 1784, 2036, 1469, 837, 280, 601, 688, 23, -868, -1450, -1427, -681, -182, -420, -514, -507, -437, -414, -402, -435, -264, 110, 1050, 1390, 1104, 1086, 981, 1208, 1104, 240, -772, -1013, -688, -197, -106, -424, -626, -739, -319, 515, 647, 207, 326, 861, 1092, 855, 715, 396, 215, 146, -34, -66, -300, -138, 332, 378, 250, 103, -39, -210, -222, -246, -450, -522, -420, -288, -69, 175, 666, 1140, 1076, 970, 830, 381, -249, -513, -552, -823, -886, -874, -907, -990, -678, -538, -563, -198, -39, 48, -15, 171, 346, 367, 213, 84, -189, -167, 238, 397, 203, -428, -779, -940, -889, -662, -274, 64, 182, 284, 386, 614, 935, 1040, 1077, 644, 173, -16, -205, -510, -653, -218, 57, 101, 67, 145, 266, 550, 309, -277, -654, -535, -319, 1, 450, 865, 1213, 1047, 572, 235, 115, -239, -425, -534, -609, -565, -266, 178, 578, 1108, 1352, 1044, 527, -7, -780, -1191, -1304, -1213, -1194, -1340, -964, -132, 845, 1399, 1520, 1330, 973, 515, -214, -929, -1441, -1488, -1145, -616, -289, -164, 202, 571, 664, 318, -242, -744, -1141, -1227, -896, -233, 268, 543, 460, 431, 664, 814, 723, 202, -332, -580, -774, -979, -928, -734, -483, -323, -288, -386, -448, -323, -199, -6, 144, 195, 180, 609, 882, 817, 628, 372, 354, 199, -96, -585, -905, -851, -747, -916, -1082, -881, -502, 56, 952, 1689, 1894, 1850, 1395, 956, 855, 639, 62, -705, -1337, -1714, -1498, -1058, -723, -335, 364, 723, 851, 972, 905, 591, 294, 236, 159, 279, 207, 205, 343, 424, 299, -110, -530, -792, -787, -571, -440, -305, -28, 92, 185, 163, 138, 182, 214, 87, -54, -13, 85, 360, 682, 797, 683, 354, 40, -111, -447, -844, -881, -648, -395, -257, -143, -101, -26, -188, -155, 54, 312, 429, 497, 657, 678, 666, 805, 716, 314, -110, -511, -649, -865, -795, -895, -925, -704, -403, -65, 191, 596, 960, 1293, 1503, 1588, 1375, 889, 207, -305, -543, -759, -957, -1092, -1132, -943, -660, -285, -2, 211, 628, 834, 1015, 1228, 1161, 902, 538, 286, 10, -432, -1081, -1441, -1594, -1477, -1011, -494, -44, 251, 416, 540, 552, 564, 504, 97, -350, -554, -425, -175, 106, 306, 361, 363, 48, -251, -516, -626, -704, -623, -387, -79, 189, 304, 368, 397, 344, 227, 27, -125, -246, -224, -82, 111, 359, 550, 609, 441, 133, -176, -437, -638, -581, -474, -329, -56, 296, 476, 481, 394, 355, 458, 469, 372, 264, 276, 250, 177, -36, -252, -610, -809, -701, -276, 133, 261, 285, 137, 16, -45, -101, -199, -220, -155, 213, 630, 996, 994, 513, 241, -164, -673, -1182, -1671, -1793, -1430, -704, 91, 737, 1330, 1701, 1685, 1299, 647, -153, -784, -1135, -1261, -1104, -864, -556, -165, 162, 342, 415, 395, 235, -45, -145, -148, -118, -16, 152, 314, 283, 162, -45, -93, -64, -48, -141, -290, -429, -356, -353, -335, -171, -197, -248, -162, 95, 422, 670, 712, 637, 521, 355, 123, -180, -486, -694, -725, -525, -222, 19, 114, -20, -31, 36, -55, -33, 104, 168, 313, 628, 899, 1067, 731, 182, -226, -601, -796, -888, -815, -513, -180, 130, 303, 450, 509, 429, 181, -74, -247, -169, -90, 32, 171, 433, 719, 745, 561, 175, -191, -573, -974, -1217, -1223, -1129, -840, -422, 182, 737, 1175, 1320, 1303, 1224, 958, 546, 137, -161, -436, -641, -686, -595, -430, -235, -38, 134, 325, 412, 204, -155, -207, -231, -154, 90, 307, 626, 944, 1009, 943, 770, 299, -208, -641, -1142, -1145, -902, -693, -465, -337, -165, 83, 279, 380, 247, 127, 246, 303, 372, 319, 287, 213, 38, -113, -355, -581, -676, -644, -508, -420, -325, -433, -420, -148, 167, 459, 557, 648, 689, 672, 564, 426, 313, 153, -166, -504, -625, -640, -631, -628, -579, -483, -207, 15, 246, 475, 494, 384, 272, 228, 222, 228, 350, 509, 627, 508, 323, 33, -255, -526, -810, -867, -781, -524, -235, 51, 227, 343, 440, 478, 401, 308, 204, 310, 519, 603, 431, 152, -146, -417, -693, -759, -682, -511, -415, -303, -141, 119, 406, 485, 603, 644, 514, 356, 206, 122, 125, 92, -76, -280, -361, -248, -143, -84, -21, 29, -83, -147, -197, -155, -177, -201, -123, 31, 205, 404, 573, 702, 704, 669, 467, 99, -285, -673, -889, -943, -812, -608, -416, -61, 203, 356, 561, 637, 537, 317, 161, 2, -58, -85, -113, -190, -148, -81, -91, -170, -268, -408, -562, -456, -385, -239, -16, 153, 368, 425, 424, 239, 65, -28, -41, -22, 12, 99, 160, 178, 34, -183, -340, -366, -315, -235, -226, -132, -29, 86, 142, 155, 232, 245, 259, 194, 19, -56, -32, -75, -200, -363, -433, -433, -343, -290, -227, -62, 44, 152, 169, 134, 67, 1, 39, 105, 107, 37, -9, -10, 36, 106, 109, -31, -168, -305, -386, -361, -202, -76, -45, -21, 167, 348, 347, 312, 264, 135, -88, -340, -437, -270, 69, 386, 559, 482, 357, 177, -66, -246, -337, -409, -438, -273, -24, 104, 209, 341, 468, 499, 440, 331, 101, -7, -219, -329, -337, -229, -116, -81, -31, 12, 85, 88, 92, 133, 220, 170, 110, 44, -88, -190, -80, 8, 63, 122, 179, 237, 242, 187, 77, -28, -164, -273, -217, -21, 214, 353, 348, 344, 247, 142, 39, -135, -282, -265, -194, -116, 17, 222, 353, 444, 376, 159, -72, -221, -264, -220, -154, -96, -1, 151, 314, 378, 346, 225, 28, -225, -370, -366, -202, -46, 120, 264, 414, 403, 295, 238, 151, 115, 79, 4, -106, -162, -230, -204, -181, -103, -16, 6, -19, -33, -76, -106, -50, 44, 147, 171, 135, 58, -21, -94, -85, -98, -78, -77, -143, -150, -199, -243, -218, -182, -161, -105, 12, 128, 189, 156, 21, -203, -365, -418, -411, -340, -188, -32, 78, 144, 174, 236, 331, 253, 39, -162, -337, -345, -350, -249, -211, -180, -82, 54, 164, 289, 366, 460, 458, 237, 11, -166, -285, -232, -110, -3, 33, 41, 21, -13, 51, 169, 217, 176, 112, 64, 13, -7, 50, 163, 317, 292, 157, 34, -152, -281, -318, -359, -373, -298, -182, 2, 180, 319, 311, 262, 109, -46, -214, -257, -154, 1, 100, 189, 152, 51, -54, -122, -192, -321, -424, -437, -339, -124, 98, 290, 391, 434, 403, 318, 207, 90, -75, -164, -226, -253, -266, -209, -122, -71, 3, 118, 141, 50, -19, -10, 18, 29, -3, -49, -104, -93, -68, -30, -9, 40, 76, 65, 37, -5, -28, -108, -291, -378, -418, -398, -246, -104, 140, 283, 401, 434, 312, 213, 125, 28, -93, -153, -169, -193, -104, 13, 132, 190, 210, 209, 165, 83, 71, 0, -52, -19, 34, 66, 99, 152, 215, 173, 107, 4, -35, -11, 3, 10, -43, -92, -113, -110, -67, -23, 24, 63, 70, 56, 47, -29, -93, -83, -34, 27, 48, 27, 76, 109, 93, 59, 42, 14, -73, -173, -217, -171, -85, 13, 114, 136, 187, 204, 178, 128, 82, 70, 22, -1, -8, -24, -9, -60, -40, -48, -43, -82, -98, -88, -35, 19, 109, 159, 194, 178, 116, 83, 65, -7, -96, -181, -173, -174, -166, -190, -198, -179, -119, -47, -11, 52, 90, 154, 173, 156, 131, 57, -38, -105, -147, -134, -113, -86, -66, -48, 15, 75, 130, 103, 86, 52, 5, -66, -66, -26, -4, 40, 37, -1, -32, -53, -44, -28, -6, 16, 32, 56, 98, 158, 185, 118, 41, -5, -56, -87, -67, -37, 10, 21, 6, -16, 19, 51, 28, 31, 8, 15, -23, -16, -11, 20, 28, -4, -70, -96, -98, -82, -83, -47, 14, 73, 62, 84, 134, 151, 174, 136, 68, -35, -106, -139, -152, -169, -166, -139, -120, -38, 23, 93, 120, 171, 172, 149, 125, 50, -9, -61, -75, -62, -75, -121, -102, -85, -58, -22, -28, -123, -156, -125, -9, 91, 150, 199, 239, 182, 125, 56, -19, -89, -127, -170, -210, -198, -173, -96, 7, 79, 131, 99, 34, -25, -12, 28, 64, 61, 57, 61, 46, 24, 16, 21, 0, -45, -87, -73, -36, -3, 12, -5, -3, -10, -24, -35, -49, -19, 50, 118, 149, 87, 26, -20, -35, -61, -86, -110, -78, -5, 24, 59, 82, 67, 46, -3, -47, -124, -152, -140, -84, -3, 72, 100, 105, 106, 104, 58, -15, -77, -127, -133, -125, -91, -43, 23, 91, 117, 92, 36, -32, -98, -115, -79, -20, 42, 81, 108, 103, 76, 36, -10, -52, -77, -132, -142, -109, -33, 59, 119, 110, 89, 67, 45, 34, 19, 41, 60, 69, 55, 30, -17, -35, -32, -11, 1, 15, 23, 17, 24, 45, 76, 58, 29, -19, -39, -60, -40, -12, 35, 65, 66, 40, 29, -1, 3, -17, -39, -66, -70, -60, -33, 6, 49, 32, -17, -39, -39, -37, -41, -29, 4, 42, 48, 64, 82, 64, 36, -24, -78, -136, -133, -119, -77, -31, 18, 44, 29, -8, -28, -41, -26, -7, 16, 23, 52, 47, 52, 30, -22, -54, -75, -65, -36, 14, 63, 95, 97, 87, 45, -16, -29, -38, -31, -47, -47, -19, 4, 42, 55, 70, 69, 50, 31, 17, -9, -9, -34, -25, -28, -4, 16, 32, 52, 44, 35, 27, 54, 56, 34, 13, 8, -8, -10, -11, -5, -12, -5, -7, -14, -4, 7, -2, -3, -16, -32, -36, -33, -5, 16, 24, 22, 25, 29, 41, 37, 6, -21, -49, -73, -77, -83, -86, -51, -27, 15, 30, 54, 72, 78, 69, 53, 29, -27, -97, -110, -117, -112, -105, -64, 5, 45, 83, 80, 74, 44, 22, -9, -45, -56, -61, -40, -29, -2, 13, 16, 5, -1, 6, 24, 28, 8, -1, -25, -52, -71, -58, -58, -47, -29, 13, 45, 48, 31, 19, 22, 47, 57, 30, -7, -50, -57, -50, -12, 24, 56, 72, 57, 25, -19, -28, -39, -52, -54, -55, -46, -7, 27, 56, 78, 79, 78, 60, 24, -19, -65, -80, -78, -57, -41, -12, 0, 10, 18, 27, 15, 34, 42, 44, 54, 71, 83, 46, -16, -76, -83, -92, -70, -61, -39, -21, 13, 19, -8, -26, -1, 31, 36, 50, 58, 60, 30, 11, -9, -34, -56, -57, -59, -57, -42, -3, 49, 77, 96, 89, 66, 31, 5, -23, -43, -27, -6, -21, -38, -19, 2, 17, -2, -22, -31, -2, 14, 22, 20, 18, 21, 35, 33, 16, 29, 27, 23, 24, 22, 0, -44, -74, -80, -49, -16, 12, -27, -43, -15, 38, 47, 43, 51, 55, 53, 8, -28, -75, -98, -73, -16, -7, 6, 48, 75, 81, 49, 7, -17, -18, -34, -24, -25, -21, -6, 15, -5, -11, -6, 0, 27, 48, 93, 82, 47, -21, -61, -116, -114, -84, -80, -63, -38, 8, 41, 65, 89, 92, 76, 55, 28, -23, -62, -43, 3, 26, 38, 25, 21, -10, -36, -34, -48, -67, -46, -21, 3, 59, 106, 122, 96, 71, 48, 17, -30, -45, -31, -10, -15, -41, -72, -78, -30, -15, -10, 0, 21, 41, 9, 23, 29, 59, 74, 50, 5, -24, -26, -16, -11, -13, -30, -56, -79, -95, -90, -53, -6, 38, 69, 81, 75, 68, 50, 45, 33, 15, -23, -56, -82, -102, -95, -38, 16, 31, 30, 8, -7, -24, -16, -12, -2, 10, 12, 29, 33, 33, 38, 26, 7, 5, 6, -4, 10, 19, 34, 25, 12, -7, -1, 16, 28, 15, -10, -19, -19, -10, 4, 13, -3, -16, 0, 29, 48, 21, -4, -21, -18, -13, -27, -25, -22, -3, 9, -10, -9, 9, 31, 24, -8, -25, -25, 7, -1, -4, -32, -28, -24, -29, -26, -33, -23, -25, -16, -26, -35, -54, -23, 9, 42, 32, 26, 16, 28, 4, -18, -26, -18, -20, -26, -31, -5, 21, 36, 20, -4, -13, -27, -23, -40, -42, -18, 11, 23, 28, 21, 35, 49, 43, 25, 8, 8, -25, -27, -32, -29, -47, -37, -14, 1, 1, -11, 1, 39, 61, 62, 48, 60, 45, 11, -11, -17, -31, -59, -74, -79, -60, -13, -6, -24, -34, -30, 3, 21, 38, 39, 51, 82, 101, 95, 50, -3, -20, -38, -47, -50, -45, -31, -35, -50, -41, -28, 11, 34, 40, 43, 40, 23, 16, -4, 4, 10, 52, 39, 25, -3, -10, -22, -32, -33, -24, -21, -11, 3, -1, 17, 29, 47, 37, 23, 12, -5, -35, -58, -38, -46, -39, -24, -7, 17, 38, 35, 42, 13, 33, 10, -7, -34, -38, -16, 8, 35, 53, 52, 12, -4, 1, 23, 26, 43, 47, 45, 50, 93, 125, 167, 141, 110, 25, -32, -99, -102, -111, -85, -66, -18, 36, 76, 103, 99, 120, 146, 160, 114, 94, 54, 37, -22, -42, -63, -57, -102, -139, -133, -102, -62, -28, 24, 70, 102, 108, 108, 69, 64, 77, 59, 31, 33, 40, 24, 7, 2, -20, -52, -89, -110, -129, -161, -146, -112, -49, 1, 53, 112, 165, 167, 128, 69, 35, 16, -1, -51, -92, -120, -128, -94, -48, 12, 101, 154, 175, 166, 126, 57, -25, -73, -131, -188, -214, -168, -120, -49, 13, 119, 239, 291, 308, 265, 194, 91, -24, -129, -215, -244, -243, -172, -100, -21, 26, 113, 175, 214, 220, 179, 135, 125, 142, 119, 122, 60, 7, -56, -107, -118, -130, -119, -110, -114, -149, -168, -136, -72, 16, 59, 101, 114, 159, 154, 146, 116, 94, 61, -6, -111, -208, -290, -292, -248, -168, -120, -89, -71, -24, 41, 127, 178, 169, 140, 98, 21, -23, -43, -12, 2, 42, 20, -1, -88, -127, -167, -123, -80, -25, 25, 69, 102, 111, 85, 55, 18, -1, 10, 7, -39, -66, -61, -24, 12, 14, 17, 63, 133, 172, 164, 115, 89, 37, -33, -135, -196, -197, -181, -123, -90, -12, 30, 126, 159, 209, 231, 258, 278, 249, 216, 107, -27, -176, -286, -356, -399, -359, -309, -179, -78, 70, 207, 331, 393, 394, 362, 288, 189, 39, -120, -216, -286, -241, -157, -80, 22, 87, 153, 146, 106, 5, -117, -165, -190, -174, -88, 72, 224, 290, 318, 345, 301, 258, 106, -33, -204, -337, -443, -390, -242, -63, 85, 220, 299, 313, 302, 269, 189, 90, -27, -138, -175, -221, -198, -142, -54, 13, 71, 98, 99, 153, 163, 123, 68, 4, -41, -62, -88, -131, -146, -135, -107, -35, 27, 101, 107, 140, 197, 258, 306, 305, 234, 147, 53, -52, -216, -323, -400, -352, -288, -177, -42, 74, 176, 222, 270, 322, 324, 257, 177, 62, 3, 0, 2, -27, -98, -129, -175, -214, -254, -262, -197, -108, 7, 96, 150, 200, 259, 324, 342, 310, 202, 49, -134, -231, -226, -154, -99, -49, -12, 29, 71, 107, 65, 25, -69, -147, -195, -151, -75, 59, 150, 294, 402, 460, 395, 236, 60, -161, -312, -378, -407, -330, -178, -27, 110, 213, 277, 330, 302, 167, -26, -236, -409, -470, -443, -299, -107, 100, 289, 425, 532, 548, 471, 250, -35, -262, -464, -518, -534, -471, -354, -212, -27, 121, 273, 362, 371, 344, 250, 163, 74, 28, -21, -10, 2, 9, -72, -166, -272, -304, -293, -230, -173, -73, 16, 65, 158, 271, 307, 318, 259, 165, 57, -19, -60, -54, -15, 41, 79, 86, 28, -74, -200, -275, -302, -248, -191, -75, 67, 251, 406, 528, 564, 483, 314, 65, -149, -295, -385, -400, -354, -259, -157, 12, 188, 351, 453, 377, 242, 90, -40, -126, -193, -199, -187, -90, 42, 160, 239, 252, 196, 148, 53, -13, -69, -113, -91, -89, -73, -78, -31, -13, -25, -82, -166, -188, -178, -116, -30, 61, 165, 319, 401, 451, 361, 221, 27, -140, -270, -338, -382, -377, -329, -191, -20, 140, 225, 233, 209, 198, 236, 284, 331, 313, 251, 154, 52, -57, -156, -235, -304, -321, -321, -232, -127, 2, 132, 275, 371, 441, 425, 252, 77, -30, -92, -61, 47, 139, 164, 189, 134, 29, -71, -184, -296, -352, -392, -341, -215, -37, 175, 364, 529, 616, 596, 442, 128, -111, -353, -504, -551, -510, -386, -163, 102, 358, 517, 555, 447, 265, 16, -230, -409, -477, -472, -441, -363, -196, 37, 332, 519, 556, 492, 343, 171, 18, -139, -247, -280, -267, -240, -170, -117, -106, -72, -38, -23, -12, 20, 33, 74, 144, 261, 410, 468, 417, 300, 63, -154, -311, -361, -292, -263, -201, -160, -21, 86, 170, 129, 80, 23, -39, -48, -3, 83, 238, 387, 453, 444, 340, 85, -128, -360, -471, -558, -543, -460, -268, -25, 178, 336, 477, 461, 357, 221, 38, -115, -211, -208, -130, -52, 70, 178, 198, 78, -44, -135, -171, -179, -163, -153, -124, -36, 176, 318, 413, 334, 90, -135, -366, -497, -470, -334, -163, 80, 324, 955, 2392, 3483, 3441, 2347, -453, -3639, -6084, -7509, -7655, -6987, -4818, -2224, 1616, 5798, 7832, 8387, 7231, 5127, 2639, 186, -1471, -3095, -3695, -2826, -1503, 243, 1206, 846, -175, -1236, -2162, -3106, -3259, -2869, -1883, 277, 2800, 5032, 5772, 4954, 3839, 2812, 1437, 135, -961, -2541, -3301, -2909, -2316, -1347, -251, -136, -503, -1204, -1578, -829, 394, 1363, 2526, 3778, 4252, 4203, 3156, 929, -1358, -3012, -4330, -4780, -4143, -2909, -424, 2493, 4396, 4861, 3848, 1713, -613, -1972, -3205, -4175, -4418, -3606, -1624, 342, 2288, 3869, 4758, 4299, 2785, 1540, 37, -662, -1101, -1951, -1948, -1945, -713, 616, 914, 332, -1645, -3979, -4911, -4788, -4039, -2542, -600, 3094, 6866, 10811, 12985, 11552, 7504, 2015, -3831, -8710, -11195, -11902, -11186, -8770, -3864, 1281, 6218, 8764, 8879, 7496, 5213, 3156, 210, -2515, -4138, -3592, -1505, 1445, 3875, 3205, 1405, 371, -1041, -2056, -2727, -3942, -4527, -3437, -1712, -272, 828, 892, 1337, 2128, 2157, 2670, 3265, 3025, 2513, 1635, 87, -1175, -2545, -5308, -6796, -6163, -4784, -2168, 427, 2158, 5246, 7944, 7856, 5901, 2433, -2110, -5094, -7722, -10464, -9774, -7147, -1167, 5479, 10367, 13466, 12384, 8769, 3217, -1048, -4844, -8731, -11197, -12226, -11161, -8430, -3403, 2806, 7737, 9563, 8494, 6118, 2856, 221, -599, -922, -1423, -580, 1346, 2402, 2889, 2103, 280, -2056, -4752, -6886, -8871, -8862, -7314, -3896, 1268, 6761, 10544, 10690, 8739, 5092, 2298, 1060, -970, -4424, -6803, -6964, -6333, -2818, 1233, 2697, 2763, 827, -825, -1374, -2476, -3145, -2554, -1088, 1091, 2642, 1196, -373, -259, 1249, 3047, 3480, 2131, 1595, 2243, 1615, 1464, -159, -2782, -4251, -5903, -6434, -4517, -2241, 1374, 5977, 9398, 10153, 6927, 2070, -2995, -5689, -5769, -5691, -4575, -2019, 761, 6143, 10187, 13567, 14188, 9178, 1664, -6936, -13057, -16282, -16308, -14608, -9655, -1211, 7092, 13300, 16671, 16379, 14764, 10656, 4357, -3063, -9769, -12659, -13097, -10666, -7291, -3364, 1035, 3995, 5517, 5521, 2743, -504, -1493, -1684, -1107, -156, 315, 766, 1476, 2768, 3100, 2398, 833, -353, -1531, -771, 677, 712, -810, -3802, -4901, -5159, -4299, -1258, 2110, 4350, 7402, 8545, 5749, 2088, -1601, -3418, -4392, -5705, -5934, -4941, -2473, 2156, 7284, 10074, 10435, 6061, -1270, -6060, -9358, -10591, -8331, -5389, -1767, 1740, 4506, 7427, 7988, 7517, 6161, 3262, -354, -3453, -5779, -7480, -6720, -1604, 3137, 6302, 7067, 2341, -756, -2858, -4742, -4569, -4888, -3961, -1562, 776, 2338, 4523, 6841, 7899, 8106, 5631, 2379, -1462, -5996, -8396, -8010, -6520, -5267, -5558, -6321, -3857, 512, 5577, 10729, 11780, 9146, 6442, 1731, -899, -3210, -6907, -9635, -11031, -8745, -4061, 1469, 6554, 12207, 14247, 11687, 5673, -3229, -9717, -13369, -13678, -10086, -5180, -910, 3539, 7179, 9897, 12838, 12459, 6451, -434, -6572, -10185, -9587, -9022, -4843, 323, 5352, 8762, 8512, 7062, 1834, -3036, -6596, -8017, -6841, -6402, -6578, -5548, -1012, 8416, 14955, 13388, 9558, 4494, -660, -4887, -7419, -7770, -7088, -5563, -5638, -4941, -2939, 20, 3626, 6330, 8586, 8119, 4068, -1230, -4170, -2280, 1644, 2470, -385, -2960, -3816, -2827, -773, 1344, 2054, 257, -1099, -2217, -748, -391, -2380, -717, 708, 2062, 3751, 2307, 2353, 4106, 3733, 2998, -1819, -6638, -7710, -9795, -7397, -1476, 4381, 8964, 10292, 9477, 6677, 4009, -947, -5612, -8058, -9696, -10870, -10837, -6003, 2260, 11445, 18045, 18772, 13145, 2811, -6363, -11930, -13439, -10371, -6844, -5694, -5222, -3001, 2512, 9288, 12683, 12578, 8098, 1677, -4468, -8794, -9118, -7066, -2867, 523, 3658, 6818, 7430, 7094, 4763, 2156, -1238, -6657, -9981, -11524, -9661, -5522, -421, 4329, 7056, 9005, 8457, 6448, 3653, 1389, 1146, -437, -2346, -4676, -7712, -8516, -5941, -1782, 4444, 8796, 8789, 7460, 4247, 1049, -1083, -3645, -5279, -5965, -7737, -6803, -3934, 2515, 10778, 15267, 14508, 8112, -649, -6894, -9742, -10999, -9124, -7191, -4418, -621, 5090, 9021, 12298, 11586, 4032, -2428, -9992, -12577, -12742, -9760, -2267, 5111, 13561, 16153, 14973, 10309, 1911, -2979, -7033, -10843, -12905, -15082, -15485, -11260, -752, 10041, 18440, 20702, 16057, 8520, -731, -7272, -9608, -10246, -9562, -8175, -5443, -1170, 2923, 7311, 9872, 11026, 7114, -206, -6418, -11329, -9751, -5834, -1173, 4194, 5077, 5230, 5124, 6779, 9021, 7480, 2166, -4780, -9545, -11702, -10970, -9131, -5338, -777, 3081, 7074, 8698, 7305, 6705, 5772, 4267, 603, -5011, -10518, -15480, -13482, -6401, 1600, 9601, 14830, 16188, 12924, 7502, -344, -6418, -8556, -11879, -13159, -11879, -8440, -3816, 4092, 12242, 17304, 17660, 9111, -1285, -7551, -8924, -8140, -5589, -5199, -3962, -1679, 2247, 7820, 9532, 9008, 3357, -3297, -9296, -11394, -10568, -8379, -2379, 4419, 10675, 12764, 9785, 5762, 4430, 3417, 225, -4856, -9370, -11874, -10534, -7521, -4340, 52, 2489, 4399, 6699, 8022, 6871, 2883, 472, -1597, -3923, -6539, -8918, -8445, -4710, 3040, 9816, 12680, 12989, 9039, 2905, -2354, -7212, -10829, -13986, -13731, -11054, -3858, 3650, 12347, 20155, 19778, 16655, 5863, -5179, -12807, -17820, -15618, -11475, -4674, 3451, 8811, 12641, 13895, 12389, 7098, -1450, -9205, -15348, -18170, -16267, -11356, -3007, 6610, 14519, 18428, 18000, 13373, 5584, -760, -5775, -10378, -13220, -13981, -11844, -6236, -375, 5807, 7333, 6796, 6280, 3589, 1414, -143, -1372, -2140, -735, -754, 122, 549, 1071, 3160, 2739, 3465, 2448, -2090, -5009, -5277, -3553, -2821, -3250, -4061, -2616, 345, 4109, 8887, 10063, 8698, 7030, 2564, -1160, -4410, -8653, -9995, -10327, -6215, -649, 3918, 9059, 12206, 13276, 8535, -142, -8497, -14761, -14519, -12851, -8261, 891, 5809, 12644, 17345, 15935, 13591, 5644, -3772, -11387, -15879, -16381, -14563, -10105, -3172, 7561, 15071, 16756, 13832, 6308, -1167, -6988, -10510, -11472, -10283, -7545, -2429, 5816, 15181, 19729, 17470, 9555, 473, -6455, -12644, -14658, -15288, -13776, -9770, -5089, 1725, 8308, 12856, 14376, 14903, 11823, 6890, 822, -6963, -11663, -9862, -4843, -1441, 1570, 1366, 1121, 2623, 3992, 4022, 1809, -2180, -5249, -4864, -3670, -3053, -1896, 1537, 5006, 7859, 8858, 5697, 3717, 2554, -1523, -4219, -8107, -11795, -11847, -10156, -4964, 3210, 10635, 13234, 10968, 5464, 953, -2757, -8275, -10686, -10527, -9929, -4522, 733, 8626, 17246, 17489, 14824, 8089, -2137, -10900, -17960, -21436, -19084, -11493, -2671, 4945, 11268, 15374, 16493, 12904, 6322, -1069, -8201, -13086, -14567, -11712, -3486, 5647, 11453, 13059, 13392, 8601, 49, -5634, -12101, -14240, -14240, -13453, -11090, -5587, 3124, 12078, 19449, 20484, 14771, 6152, -1409, -5611, -7662, -9378, -9146, -8854, -7440, -4865, -3116, 918, 6109, 8423, 7717, 4745, 497, -2289, -2189, -1590, -779, -643, -531, -1558, -355, 2779, 4576, 5342, 4315, 2448, -398, -3345, -7004, -8269, -6476, -3992, -2356, -45, 2712, 6238, 9650, 9221, 7127, 2412, -4902, -9222, -11046, -8075, -1040, 4254, 9258, 12585, 11317, 7882, 1583, -6035, -9645, -11976, -14120, -13564, -10187, -3281, 5622, 14431, 21517, 21024, 12950, 3633, -4747, -9086, -10884, -11601, -10704, -8132, -2706, 2792, 9563, 12812, 10216, 5631, -2105, -8931, -11106, -12183, -10704, -4251, 4180, 11724, 14373, 13782, 12043, 8508, 2846, -3332, -9397, -13897, -16094, -14421, -8539, -491, 6680, 9296, 9672, 9845, 7617, 4028, -21, -2638, -866, -913, -1395, -4159, -5509, -3553, -1936, 2157, 4423, 3623, 918, 616, 1179, 2132, 1509, -2848, -7558, -9523, -7571, -2679, 3538, 8264, 11835, 10514, 7432, 5652, 1611, -2622, -6076, -9886, -10818, -8012, -5108, 1844, 7558, 9787, 10723, 3876, -4917, -10026, -13705, -12197, -5940, 273, 8236, 13395, 16128, 18965, 15759, 7230, -2573, -12952, -19051, -20231, -19442, -14049, -3986, 5303, 13489, 17453, 12408, 6793, 1773, -3748, -5760, -6888, -6996, -5605, -2408, 3482, 8207, 10931, 8508, 1461, -3750, -8248, -11429, -11325, -9456, -4246, 114, 4089, 6807, 5997, 6366, 6354, 6137, 5355, 2764, -1212, -3224, -1839, -970, -2373, -3327, -5440, -6313, -3519, -661, 2933, 6391, 8985, 7654, 4093, -329, -5508, -8166, -7839, -5535, -2553, 1799, 5773, 11104, 13195, 11625, 6849, -2647, -9124, -16429, -19533, -16601, -10498, -808, 8682, 14365, 14478, 13844, 6938, -141, -4756, -10446, -13331, -12946, -8167, 1229, 13017, 19470, 20110, 12282, 1839, -8832, -17133, -19975, -20601, -15340, -10627, -1464, 9428, 16191, 21269, 17919, 13406, 7067, -1636, -8518, -13886, -13246, -9572, -3175, 3273, 5563, 4289, 2774, -539, -2095, -2791, -4525, -5837, -5436, -1765, 2199, 7035, 8033, 7804, 5817, 3649, 1619, -964, -1648, -2897, -1646, -1183, -3206, -5224, -8068, -7021, -3063, 2630, 7716, 7440, 5987, 4043, 4034, 3941, 1436, -2001, -6967, -10206, -11304, -7069, 2160, 10145, 16337, 16067, 10367, 1939, -7412, -12570, -16092, -15397, -10171, -5688, 780, 8316, 14122, 19196, 17645, 11275, 838, -9687, -16234, -18249, -11805, -3944, 4001, 9789, 11003, 10917, 7983, 2850, -3036, -9009, -12349, -14479, -13631, -8526, -858, 8108, 15641, 18551, 16012, 9505, 938, -5523, -9065, -10020, -8310, -5936, -3889, -1401, -444, 447, 3123, 5343, 4738, 2446, -1474, -3814, -3272, -292, 3286, 2457, 1955, 566, -1092, 965, 3098, 2800, 2282, 1154, -1206, -3711, -7041, -9000, -6781, -3226, -202, 4370, 6467, 6376, 8239, 8846, 8496, 4750, -2727, -9667, -15375, -14166, -6926, 653, 7654, 13058, 13988, 11214, 5884, -1814, -8119, -11933, -14168, -13682, -9750, -5899, 1385, 10887, 19206, 22682, 15901, 5254, -6459, -13081, -13080, -12402, -10550, -6776, -89, 8129, 12849, 13461, 9553, 2731, -4597, -9013, -10931, -11002, -9821, -4481, 4326, 12657, 16061, 13071, 7316, -48, -2066, -4869, -6243, -6946, -7235, -5634, -3844, -1118, 2388, 3270, 2581, 3702, 2896, 760, 368, 1895, 1891, 2746, -118, -4327, -6070, -4561, -1456, 2005, 4695, 7028, 5913, 2784, -1612, -5876, -6627, -7955, -8067, -6485, -3402, 1945, 11389, 16143, 15814, 11078, 735, -9059, -14485, -15866, -13322, -8640, 854, 9766, 14648, 17066, 13095, 6690, -1159, -6569, -12179, -18073, -18652, -15164, -5719, 7308, 17326, 23153, 19924, 11857, 4562, -2530, -8937, -13373, -14862, -15503, -10550, -3017, 4494, 9952, 11635, 10370, 4202, -674, -6573, -10327, -9679, -5732, 187, 4759, 7142, 5101, 4132, 4092, 3974, 2500, -642, -4997, -7876, -7531, -5566, -3143, -2755, -3409, -3635, -2233, 583, 3718, 7731, 10406, 11894, 9780, 2847, -4253, -10353, -13095, -11473, -6190, -730, 4409, 8263, 10063, 11172, 9425, 3397, -3792, -12832, -18545, -15615, -9204, 1337, 12129, 19029, 20347, 14958, 6482, -2379, -9284, -13713, -15860, -11901, -6907, -617, 7251, 13294, 18678, 16124, 8721, -3413, -16311, -21017, -20686, -14008, -4133, 5187, 13716, 17037, 18661, 17071, 10362, 2237, -8869, -15681, -18408, -19434, -14522, -6637, 5225, 13161, 13591, 10772, 4992, 427, -2087, -4904, -6548, -3619, -85, 1280, 985, 2657, 5162, 6949, 7298, 4540, -707, -7321, -8393, -4771, -2215, -3107, -6413, -9875, -8898, -4536, 2356, 10428, 15260, 17952, 15880, 9706, 768, -6767, -13953, -18292, -17328, -13667, -8102, -747, 11759, 18904, 21331, 17096, 4367, -6734, -15866, -19809, -16066, -12154, -4927, 5476, 12795, 21473, 23414, 17972, 6291, -5465, -12478, -17150, -19037, -18538, -11044, -794, 10514, 20204, 19592, 11259, 2722, -5680, -9950, -9893, -8444, -7118, -3647, 4428, 13500, 17283, 14666, 8207, -304, -7087, -12065, -13461, -14031, -8610, -2414, 1625, 3648, 1854, 3437, 3651, 4515, 6180, 5654, 2682, 375, 1838, 3935, 1857, -1275, -4232, -7220, -5051, -2993, -22, 2573, 4148, 3751, -506, -4123, -8148, -8768, -9716, -6149, 1454, 7479, 14511, 18619, 19848, 13829, 3896, -5980, -14745, -21352, -23352, -18574, -10335, 1634, 13902, 21145, 22333, 16029, 6500, -3096, -11302, -16664, -19134, -16115, -10946, 36, 13271, 21937, 26808, 22076, 9811, -2763, -13762, -20401, -22109, -20650, -14207, -3578, 6829, 14633, 16645, 14150, 8968, 2971, -2498, -7938, -9819, -7940, -2380, 3844, 9548, 11298, 6376, 469, -3740, -6777, -6855, -6777, -6075, -4064, -2625, -349, 259, 1530, 1871, 1767, 4177, 6326, 5731, 7008, 6576, 4919, 3148, -2190, -7206, -12968, -15376, -14142, -9002, -288, 7496, 10127, 10987, 7650, 1778, -3043, -8067, -10628, -10151, -4960, 1245, 10733, 15927, 16367, 13118, 2519, -6573, -14567, -21811, -22761, -17868, -7051, 6416, 15996, 21661, 20338, 14473, 7933, -860, -10498, -17132, -18918, -15610, -6288, 7363, 16131, 22428, 21068, 12666, 3876, -8558, -15421, -18433, -17997, -15384, -9146, -1151, 6887, 13880, 16007, 15438, 10705, 3940, -2233, -5740, -5902, -2228, 637, 1657, 433, -3511, -5355, -4945, -3443, -1409, -665, 66, 1170, 2853, 4261, 2391, -501, -3158, -3309, -1147, 578, 5351, 9133, 11341, 11526, 7141, -498, -9033, -16463, -21192, -19602, -12769, -3846, 4404, 13347, 18393, 20397, 15278, 7054, -840, -9305, -14405, -16042, -12499, -3844, 6582, 13937, 18243, 14090, 6767, -3074, -12984, -16551, -15470, -13621, -9149, -2612, 5069, 13676, 18476, 18163, 12325, 3065, -7172, -13574, -14103, -10134, -4308, 2560, 7971, 10593, 9817, 5996, 146, -4876, -8480, -10743, -11894, -10651, -5583, 119, 4613, 7061, 8292, 7630, 6048, 3626, 4260, 5804, 4555, 2016, -3206, -10443, -14666, -15763, -12266, -5136, 1573, 8392, 10310, 10299, 8701, 7273, 3122, -1792, -6512, -11385, -10671, -5623, 3126, 12475, 18811, 18788, 13865, 1254, -9586, -18924, -23168, -21149, -16625, -9069, -576, 9779, 18033, 23735, 24045, 18296, 6627, -4161, -14458, -17694, -16955, -12374, -3056, 3608, 9062, 10645, 9134, 6455, 1717, -3258, -5068, -10068, -9798, -7509, -4805, 4407, 9750, 11590, 9204, 3820, -989, -2478, -1152, -51, 1634, 60, -1767, -5482, -6574, -3417, -2783, -938, -93, -4, 836, 10, 2449, 5606, 4054, 1135, -2996, -5201, -5528, -868, 6014, 10763, 10584, 6051, 1330, -5776, -10943, -13728, -14187, -12473, -9232, -5582, -667, 7097, 14540, 18196, 15556, 7677, -908, -8990, -14910, -13841, -8641, -1520, 5831, 11035, 12702, 8569, 2587, -4143, -10940, -13790, -15135, -14450, -10698, -939, 11593, 20734, 26163, 21297, 12079, 2481, -4999, -9326, -13695, -14193, -12799, -8750, -2070, 6216, 11958, 12568, 10864, 8044, 2213, -3927, -9224, -11852, -8220, -1996, 5076, 6751, 6385, 5156, 3507, 4884, 4705, 2714, 134, -3784, -4209, -3195, -6117, -7167, -7822, -6837, -3819, -185, 3817, 7008, 10371, 9938, 7990, 4188, -2464, -8554, -11415, -7280, -3421, 496, 5121, 7721, 9387, 8584, 3801, -3341, -8126, -14753, -17417, -15651, -10346, 845, 11110, 18332, 21543, 17306, 9979, 1085, -6158, -8852, -12781, -13377, -11230, -3184, 4726, 9114, 12765, 8744, 2680, -3529, -10557, -13286, -10836, -6315, 232, 6582, 11729, 14842, 13240, 10144, 4467, -3334, -9701, -13597, -14639, -11568, -5823, -222, 5229, 7037, 8272, 6571, 1833, -1019, -2968, -3577, -1747, 940, 2772, 1780, -305, -849, -1613, 312, 3544, 5844, 5573, 5183, 4078, -325, -4444, -9473, -14657, -16343, -13452, -6791, 2865, 13632, 19230, 19211, 14924, 6299, -454, -5362, -10475, -11917, -11355, -9020, -3757, 3200, 11299, 13145, 10346, 3621, -6161, -12902, -16081, -14347, -9444, -2300, 4963, 11148, 16287, 17415, 15084, 8290, -1293, -9054, -15704, -16245, -13174, -7601, 53, 4166, 7140, 6200, 3805, 763, -2622, -4680, -5095, -2215, 1750, 4920, 6293, 7519, 5934, 3218, 1038, -1743, -5326, -7324, -6449, -3703, -452, 671, -214, -3212, -3217, -4273, -2518, 1009, 4350, 9873, 10137, 8268, 3147, -2380, -6856, -9728, -8240, -5869, -3792, 1712, 9139, 13602, 13136, 5645, -3747, -10681, -14919, -16454, -14381, -8976, -1236, 9654, 17706, 21161, 19563, 12325, 5093, -2142, -9154, -15779, -18810, -16659, -9507, 667, 8646, 13398, 10721, 5782, -1733, -8338, -9311, -8470, -5341, -1410, 5054, 10156, 14983, 15912, 12366, 4746, -3086, -8800, -14167, -13060, -10008, -6086, -930, 2097, 1819, 1575, 364, 298, 2573, 4118, 5495, 5776, 6340, 6398, 4130, 563, -4285, -8452, -8380, -5905, -2829, 181, 3363, 4639, 4349, 1512, -2477, -6221, -10025, -8015, -3922, 3595, 10332, 13551, 14638, 13587, 8102, -904, -7671, -14495, -16922, -14398, -8128, 899, 10582, 14633, 14825, 9930, 2277, -4218, -10213, -14191, -14198, -10655, -5397, 5185, 13462, 21707, 23883, 16889, 8409, -2617, -12150, -17561, -20067, -17445, -9934, -1701, 7206, 10479, 9614, 6739, 1173, -1181, -3299, -4677, -4469, -1605, 3630, 10225, 12781, 9148, 3967, -1653, -5006, -7963, -9919, -10067, -7774, -3670, 851, 1742, 48, -2093, -2035, 1942, 6755, 9313, 8158, 6857, 6431, 7001, 3886, -2461, -8932, -13453, -14083, -11449, -2800, 3618, 7475, 10031, 7375, 4907, -204, -4986, -8187, -8589, -4229, 1532, 5962, 11422, 14518, 14060, 10067, 1002, -6332, -16795, -21633, -19870, -13140, -1710, 8147, 15120, 15348, 13666, 7821, -663, -7757, -13778, -16447, -14152, -8370, 1261, 12214, 20035, 22373, 15906, 6544, -4738, -13835, -18516, -19372, -14640, -8532, -2482, 2036, 7043, 9369, 9415, 8208, 4120, -166, -2449, -4372, -2825, 2906, 5857, 6755, 4086, 144, -3734, -7834, -8865, -7626, -5472, -2302, 493, 1930, 2927, 493, -1734, 518, 2406, 4622, 6174, 3555, 4402, 6496, 7713, 7116, -707, -9455, -17498, -18921, -14211, -6151, 4121, 9760, 12266, 12612, 10194, 3537, -2771, -7381, -11324, -11237, -7562, -3065, 5146, 13933, 17542, 17322, 9181, -2354, -11788, -19995, -21305, -16416, -8977, -882, 7238, 13862, 17155, 15757, 8872, 2185, -6211, -12822, -13687, -13067, -5881, 4363, 11876, 18282, 16613, 10158, 1579, -9180, -14718, -15703, -13474, -10472, -7551, -1996, 5101, 12876, 15605, 14141, 10602, 3944, -404, -3338, -3238, -2288, -811, 834, -1864, -4078, -7225, -8902, -7169, -4284, -1051, 1275, 2286, 2566, 5055, 3980, 2889, 370, -4227, -5368, -3223, 282, 7309, 12714, 12426, 10350, 258, -8507, -13518, -15626, -14443, -8795, -3369, 2943, 12072, 16549, 18591, 15221, 6654, -1204, -8538, -15273, -15161, -12038, -3963, 5182, 11974, 17091, 14895, 9289, 1879, -6316, -11337, -13328, -14247, -14537, -9040, 611, 10485, 19093, 18835, 14280, 5655, -2950, -7315, -10472, -6941, -3324, 190, 5178, 6242, 5633, 2696, 845, -1401, -4474, -5083, -7801, -7603, -4560, -130, 4549, 5693, 4342, 1926, 1076, 1991, 4163, 5097, 6539, 5974, 3514, 1038, -5443, -11280, -14516, -15305, -10776, -3277, 3170, 8815, 12313, 15277, 14784, 8933, 2525, -7510, -14015, -14015, -9494, -1307, 5598, 12220, 13455, 9708, 2775, -6175, -10799, -13969, -14397, -12146, -8593, -19, 6920, 14059, 18530, 16052, 11423, 1212, -10143, -16294, -17278, -12401, -5008, 2448, 9079, 11708, 12311, 8725, 810, -5666, -10480, -13817, -15449, -12976, -8136, -131, 10092, 14112, 15313, 12379, 6489, 1333, -1794, -2717, -3917, -2776, -2075, -2369, -5944, -7028, -5415, -2389, 3775, 5534, 2354, 313, -505, 331, 3698, 2508, -64, -3033, -4154, -2929, 924, 7776, 11651, 13839, 11055, 3276, -6214, -15284, -20891, -21702, -17760, -9011, -2096, 7014, 16297, 21183, 22554, 16167, 8358, -2591, -11823, -17661, -19540, -15578, -7830, 1916, 8608, 13052, 12662, 8255, 1996, -3843, -7497, -9131, -12353, -13370, -9447, -2763, 8131, 15393, 16130, 12664, 5202, -1506, -5079, -5261, -5293, -3664, -1901, -1452, -79, -195, -2064, -1204, -370, -758, -853, -3783, -3285, -1977, 3265, 6081, 5377, 3373, 493, 111, 1810, 6066, 8614, 9317, 5693, 1042, -3810, -9245, -13373, -14038, -11750, -5639, -1662, 5222, 11036, 12932, 15936, 13605, 8331, 849, -7156, -13769, -14770, -7917, 910, 8980, 12842, 11182, 7419, -888, -8005, -11545, -13907, -13834, -12637, -7279, 1930, 10689, 18437, 22636, 18725, 10899, 1780, -10480, -16941, -18597, -16907, -9606, -2499, 4532, 10910, 12089, 12052, 9901, 4795, -628, -8985, -13135, -14876, -11423, -3985, 3204, 10161, 10934, 9912, 7450, 4809, 5853, 3943, 1309, -1400, -4474, -6333, -8710, -10427, -8141, -3499, -270, 2436, 2312, 3840, 6102, 9096, 9924, 7891, 2139, -4090, -8141, -8819, -3522, 90, 5221, 7084, 7147, 4070, -1409, -5467, -9259, -10496, -12544, -11988, -7354, -1617, 7480, 17293, 23004, 23470, 14284, 1011, -8822, -14078, -15993, -14777, -12334, -7862, -494, 5838, 11899, 13672, 8465, 4020, -1682, -7776, -10263, -12070, -8630, -3237, 6212, 13947, 15861, 14137, 7892, 1279, -5018, -8298, -11795, -11399, -9770, -6973, 416, 6626, 8954, 8285, 6733, 2445, -479, -4574, -7913, -7139, -4393, -437, 1783, 2728, 4576, 7543, 8325, 9353, 6890, 1101, -4589, -10751, -10854, -8888, -8589, -7966, -8307, -6409, -1980, 4990, 12282, 15299, 16954, 14854, 8980, 263, -8715, -12926, -15406, -13579, -8403, -3355, 3145, 7896, 10106, 11020, 6449, -556, -5907, -13040, -14036, -11037, -5470, 3238, 10661, 16904, 19200, 17064, 9966, 671, -9159, -15310, -18526, -18121, -13143, -7512, 2000, 10579, 16509, 17652, 11736, 4396, -4899, -10675, -10989, -9313, -6864, -2598, 1431, 5082, 9088, 8930, 7900, 5092, -277, -4932, -8525, -10790, -9161, -4497, -423, 2245, 2881, 472, -687, 1060, 3236, 3533, 2165, 1901, 2546, 4793, 5082, 2025, -105, -2834, -4207, -3436, -2908, -2098, -2020, -1382, -1990, -1769, -2293, -5828, -6800, -5047, -17, 7631, 13227, 16558, 15023, 10534, 7187, 568, -8344, -15313, -20468, -20582, -14573, -8910, 3837, 15112, 20176, 21436, 12146, 1832, -6986, -13543, -15158, -11622, -7806, -2698, 4687, 11256, 17720, 17544, 10881, 2624, -6972, -15693, -19073, -17818, -11267, -1987, 4881, 10788, 12766, 10380, 8171, 4027, -347, -4315, -8754, -9789, -8749, -2193, 6206, 8978, 9083, 6642, 2690, 279, -3581, -7081, -6062, -3489, -792, 397, -1603, -4944, -3649, -1862, 2981, 7622, 7423, 6891, 5469, 6094, 8659, 7909, 544, -7405, -12035, -12721, -11771, -7090, -397, 6661, 10560, 9154, 4736, -1543, -4462, -6097, -4284, 129, 2431, 3977, 7070, 11870, 14709, 12790, 3626, -7916, -15245, -21346, -20308, -13178, -5043, 5828, 13657, 16282, 15764, 11062, 4505, -1855, -6854, -9002, -12761, -13595, -9981, 1070, 14140, 20096, 21421, 13194, 3349, -5191, -12455, -13698, -12389, -11862, -10289, -6795, -8, 7276, 11910, 14075, 12898, 8720, 2196, -5049, -10921, -9623, -4150, 1271, 3473, 4477, 1531, -2257, -2463, -196, 1966, -75, -3632, -7191, -8007, -5627, -1827, -570, 1975, 3955, 6196, 8452, 7241, 6721, 8992, 6485, 1536, -3357, -12895, -19180, -20778, -17124, -7429, 2363, 7837, 10784, 11555, 11621, 10194, 6190, 1844, -6110, -12465, -14012, -11847, -3601, 5933, 13820, 16287, 12782, 6127, -3412, -11676, -14252, -11295, -9039, -6936, -4282, 885, 8647, 15299, 17006, 12096, 4902, -4673, -10757, -14618, -13054, -7210, 258, 8271, 10191, 12589, 10917, 5517, 785, -4676, -9366, -13057, -16241, -14416, -8359, 399, 10775, 15779, 17412, 13272, 6687, 2002, -1931, -2297, -3564, -5314, -7060, -8007, -7894, -6489, -1911, 2687, 6152, 4527, 235, -2731, -3741, -1389, 1404, 2110, 1764, -230, -714, 1557, 5785, 11140, 11497, 8185, 1155, -6041, -12415, -17510, -17843, -14413, -9338, -2955, 3316, 9925, 17386, 19454, 19784, 14277, 3161, -6796, -15078, -20045, -18360, -12208, -2273, 7716, 14137, 17391, 13819, 9487, 2742, -3667, -8364, -13600, -16159, -16943, -12522, -1142, 9874, 18327, 20099, 15776, 10167, 1439, -3730, -4757, -7015, -7416, -6254, -5339, -1002, 2841, 4220, 5578, 4129, -172, -5275, -10618, -11385, -7834, -2703, 3001, 7155, 8913, 9440, 10244, 11721, 10278, 5077, -2964, -9744, -12407, -13116, -11636, -12057, -6802, -1476, 1276, 5097, 6176, 7423, 8608, 9806, 8513, 6036, -972, -8710, -12176, -10134, -3160, 1901, 7272, 8526, 7142, 5972, 491, -5611, -8118, -10427, -11239, -9307, -7189, -817, 6794, 16023, 21488, 19838, 10908, -631, -8621, -14137, -15870, -14341, -10234, -3792, 5461, 11363, 17308, 18720, 12661, 3418, -6320, -13788, -17715, -18398, -16438, -8933, 2853, 13780, 20869, 22146, 18284, 14403, 6933, 247, -6815, -13093, -17176, -18815, -12901, -6621, 652, 5721, 6172, 5585, 4162, 2018, 161, -283, 902, 3253, 3949, 4872, 4265, 4083, 3983, 1262, 68, -3163, -7827, -10423, -8512, -6310, -2928, -1103, -2810, -2079, -2408, 319, 5520, 10004, 11415, 10850, 7135, 2414, -1115, -6490, -8592, -10877, -11298, -8517, -4715, 957, 6953, 10506, 11029, 8073, 180, -7627, -13497, -15870, -12823, -6142, 1692, 9876, 16541, 18930, 17596, 10827, 126, -9036, -16559, -19599, -17918, -13523, -4883, 5592, 14008, 18289, 16831, 8966, -1166, -9804, -14372, -13501, -11687, -8007, -111, 9485, 19816, 24353, 22164, 14018, 1030, -10119, -17023, -20657, -20908, -18194, -11672, -3787, 4660, 11883, 13082, 13185, 11580, 11161, 7315, 2236, -3007, -5380, -4585, -6174, -3403, -3982, -5510, -4956, -3040, -337, 3707, 4106, 1897, -485, -2429, -1926, -4675, -4960, -3437, -1148, 3213, 6931, 10008, 12571, 12745, 7987, 2249, -5080, -15011, -20794, -21620, -15434, -5592, 2849, 11720, 15751, 16546, 13543, 5155, -1763, -6910, -11010, -13749, -12893, -10117, 236, 12500, 19322, 22377, 15683, 4835, -5683, -13909, -16993, -16071, -12698, -6349, -2021, 2466, 7366, 12192, 13291, 9552, 4558, -2969, -6579, -7425, -5256, 182, 6529, 9928, 9298, 4706, 1828, -70, -4423, -6713, -10661, -13223, -13554, -10309, -1819, 6689, 13949, 17475, 16223, 12572, 6616, 928, -1552, -3952, -4687, -5111, -8527, -8683, -8907, -7470, -460, 5792, 10789, 10781, 6556, 3027, -110, -779, -491, -3668, -7077, -8569, -9189, -4816, 3587, 10390, 15912, 17911, 11420, 3520, -4892, -13496, -15627, -17083, -15023, -10974, -6315, 2478, 10920, 17680, 19645, 16584, 7949, -2370, -10770, -15877, -13831, -7017, 790, 7762, 10507, 10580, 8641, 3080, -1733, -6604, -11752, -14079, -16234, -15660, -10782, -1029, 10837, 20378, 23366, 16069, 8836, 615, -4413, -3909, -5559, -7587, -7507, -6021, -3896, -866, 484, 2497, 2074, -216, -2630, -3855, -3986, -923, 5163, 9320, 8107, 4243, 747, -1206, 593, -18, -160, -1001, -2781, -2517, -2548, -3286, -3537, -3086, -2949, -2994, -1740, 544, 3203, 6515, 10053, 10318, 3986, -4786, -11351, -14470, -11385, -2939, 4618, 12654, 17578, 16853, 12072, 3700, -4816, -12481, -18288, -23318, -25156, -19287, -9022, 6536, 20364, 28915, 29595, 18830, 8174, -2425, -7832, -11069, -14018, -13525, -12626, -6098, 804, 7376, 12219, 10097, 3496, -5057, -12893, -15909, -13773, -7741, 1358, 10121, 16925, 18384, 15655, 10229, 6573, 1479, -6362, -11775, -16447, -13605, -9271, -5702, -1081, 1625, 2984, 1300, 1418, 2963, 4026, 7372, 9653, 10218, 8795, 1726, -6096, -12943, -13222, -9218, -3899, 919, 5706, 9967, 10412, 9126, 4156, -41, -6856, -15326, -18816, -16907, -10115, 1323, 11886, 19717, 19682, 12608, 4635, -3326, -6515, -8394, -9125, -7980, -3535, 2195, 6290, 10974, 11183, 5990, -1014, -11976, -19242, -19076, -16551, -6874, 5012, 15589, 23406, 23917, 21196, 14574, 7570, -1467, -10965, -18674, -22482, -18953, -13158, -3353, 6666, 10040, 11028, 9245, 4415, 340, -3376, -3889, -961, 3017, 6021, 6891, 4242, 1887, 1520, 349, -110, -3079, -7901, -6898, -5049, -1864, 925, -830, -3503, -5945, -6077, -4295, 2284, 9111, 14799, 17146, 13714, 7552, -1720, -8774, -12590, -15801, -13516, -9732, -4236, 4432, 11770, 16422, 14750, 7665, -1811, -10502, -16874, -19552, -17437, -10762, -2789, 9018, 18089, 23426, 24934, 19140, 11843, 1088, -9488, -18170, -23547, -25405, -20179, -8615, 3371, 11992, 12375, 9852, 6464, 2560, 64, -2130, -2013, -910, 1990, 4222, 8800, 11214, 8698, 3697, -3130, -8298, -12993, -14768, -14733, -8028, -750, 4159, 5496, 3696, 1699, 2936, 6454, 8217, 7895, 5315, 3500, 948, 1855, -806, -6704, -10292, -12456, -11974, -7075, -1447, 5414, 12085, 12824, 11089, 2946, -5148, -9986, -12872, -10570, -5157, 1178, 7619, 13536, 15999, 17641, 14544, 5263, -4891, -14881, -22876, -22757, -15313, -6386, 3381, 12656, 17284, 17579, 10179, -183, -7288, -13307, -14763, -14504, -10991, -4417, 8248, 20665, 27605, 27695, 16188, 2038, -11561, -21461, -25192, -26730, -23138, -14769, -3585, 5852, 13815, 19503, 18796, 17555, 11377, 4929, -1255, -8028, -9532, -6119, -1931, 2296, 1638, -3439, -6447, -6909, -3591, 146, 3561, 1810, 518, 83, -515, 205, -926, -726, 587, 3188, 6892, 7354, 8486, 8878, 6554, 4530, -2001, -11302, -18675, -19921, -15687, -4956, 5470, 11175, 14636, 12322, 9058, 5715, -126, -5902, -10564, -12678, -12181, -7221, 885, 11731, 21371, 22472, 17508, 5870, -7632, -16348, -22054, -22947, -16996, -9071, -573, 6820, 12193, 17227, 16632, 9770, 2783, -5685, -11751, -10819, -6795, 965, 7890, 12555, 12439, 8190, 2710, -6808, -12997, -15082, -14404, -11697, -9430, -5036, 1278, 9700, 16408, 18826, 15999, 8645, 2044, -3002, -4440, -4832, -6084, -5441, -7329, -7888, -5995, -4084, 765, 3317, 4407, 6062, 4987, 2758, 1640, 2597, 3758, 748, -3578, -7351, -8708, -2919, 4345, 11711, 14335, 12936, 8235, 268, -5179, -10544, -14435, -16129, -14763, -10009, -3334, 4980, 15433, 21532, 21796, 15361, 4851, -5872, -14538, -17796, -14227, -5102, 3357, 10202, 13505, 13498, 9335, 3261, -3453, -9457, -15058, -18042, -18057, -14338, -5122, 4489, 14173, 20733, 19651, 14352, 7463, 505, -3243, -6525, -10247, -12165, -10011, -7423, -4140, -2238, -645, 1007, -25, 547, -1772, -2011, -1781, -828, 4436, 6620, 5298, 1646, -213, -889, -799, 463, 435, -1246, -3085, -2363, -1542, -1339, -2732, -4424, -3709, -4123, -3205, -545, 1843, 5518, 10267, 11122, 7895, 2276, -5690, -9403, -9152, -4687, 1207, 4683, 8927, 11093, 10003, 7440, -264, -8725, -14219, -18257, -17930, -14936, -5449, 4054, 14090, 23394, 24070, 20547, 9359, -1651, -8892, -13017, -14011, -12716, -10897, -5574, 2626, 9852, 15334, 13520, 4155, -5912, -13158, -16683, -15711, -11877, -3791, 6497, 15762, 20366, 20759, 15998, 10110, 2993, -4940, -13134, -17974, -18069, -17359, -10484, -1429, 8129, 12464, 11545, 8269, 4424, 1883, -1224, -2386, -2504, -254, 1833, 1946, 611, -706, 15, 131, 547, 1233, 123, -1580, -787, 356, 1206, -847, -6067, -9473, -10049, -6041, -428, 4989, 9030, 11653, 12160, 6920, 3175, -1518, -5208, -6199, -8074, -5296, -2021, -80, 3518, 7620, 8400, 5235, -2758, -11908, -15575, -14739, -10407, -1652, 6806, 13789, 18784, 19849, 18724, 15311, 5606, -6342, -15379, -20408, -21118, -16879, -10259, -694, 9502, 12986, 13845, 10214, 3096, -3347, -6641, -7010, -3512, -1821, -669, 1781, 7337, 14772, 16453, 10634, -569, -10409, -16391, -17690, -15868, -9653, -4291, 153, 4559, 7955, 11735, 12263, 10417, 8010, 3758, -1915, -7930, -12532, -12059, -5620, -1159, 2820, 5805, 5934, 6366, 6259, 4411, 1432, -1595, -7095, -9749, -10400, -7984, -5290, -2682, 1390, 5559, 8711, 10539, 9954, 8984, 8707, 5516, 3655, -1774, -11034, -15904, -16925, -13656, -4942, 865, 4189, 6584, 5367, 5301, 4139, 487, -1087, -3308, -4094, -1960, 522, 3904, 8695, 11670, 10410, 6667, -2246, -10882, -15342, -17095, -14122, -8423, -3278, 1625, 6886, 12003, 15870, 15784, 10448, 2616, -5983, -10966, -12914, -11539, -5019, 2507, 8366, 8719, 9907, 6807, 10, -2551, -5645, -8677, -9073, -9220, -9678, -5719, 1337, 10182, 16083, 15231, 10748, 3212, -4801, -7047, -6565, -5626, -5651, -3908, -1156, 2428, 4683, 4486, 5576, 3245, 154, -4242, -9780, -13623, -12095, -6403, -171, 6101, 7599, 7328, 7302, 8277, 11519, 10182, 4423, -1604, -7358, -10386, -12226, -13479, -11766, -9561, -3826, 1304, 5010, 7822, 10050, 13607, 12400, 9682, 2714, -5592, -10037, -13132, -8231, 203, 4295, 8287, 8050, 6131, 3877, -1101, -5538, -8491, -11545, -13499, -10294, -3909, 4438, 14064, 19531, 19245, 14213, 3840, -5881, -11059, -12493, -11112, -8741, -6093, -917, 4560, 11256, 14218, 11820, 6437, -4399, -12034, -15737, -15247, -11364, -4178, 4595, 11063, 16378, 14406, 9189, 5084, 562, -3075, -6477, -9149, -12384, -10938, -4762, 2064, 9639, 11412, 7419, 299, -6655, -9342, -10066, -9362, -4396, 925, 4556, 7645, 9935, 12469, 13059, 11335, 5605, -283, -7832, -14029, -15375, -12439, -7427, -4511, -2369, -1985, -14, 4387, 9651, 11470, 11498, 9775, 5634, 1784, -3772, -6332, -7987, -9163, -6887, -5074, -1689, 2295, 6911, 10023, 9589, 6951, -1134, -7960, -11860, -13067, -8398, -2960, 3430, 10072, 13532, 14917, 13544, 8258, 1020, -4625, -10181, -14144, -14308, -11416, -3737, 6048, 12820, 15239, 10117, 2484, -3759, -8363, -8921, -8200, -6531, -4093, -2120, 3387, 11010, 16308, 17264, 12207, 4389, -5626, -11782, -15797, -15746, -12331, -8595, -1599, 2991, 6340, 7978, 6849, 4825, 2656, 563, -1942, -4572, -4139, -922, 4717, 6779, 6591, 4768, 797, -2381, -5737, -8708, -9588, -7867, -6759, -5604, -5290, -2164, 3031, 7806, 10838, 13527, 12970, 7477, 2388, -584, -2032, -3264, -5781, -12460, -14466, -11956, -6418, 3457, 11047, 13754, 13289, 9964, 4989, -1692, -8326, -10462, -10793, -9431, -6920, -2983, 3168, 12997, 18826, 18513, 13765, 1321, -8327, -14291, -18606, -15229, -10483, -5376, 1363, 6479, 11554, 13318, 11158, 5500, -855, -6621, -9305, -10155, -7520, -1703, 4628, 11231, 14068, 13264, 5665, -1415, -6854, -10948, -11283, -10860, -9847, -9247, -5608, -359, 6793, 11283, 10346, 8766, 5204, 2845, 1742, 286, -1005, -1909, -1255, -4388, -7097, -8264, -8384, -5252, -2221, 1189, 1626, 1313, 1612, 3769, 6071, 3826, 663, -1943, -3666, -2718, 1629, 4689, 5479, 6298, 3508, -2072, -6422, -10924, -13013, -12369, -7305, 498, 5822, 10601, 12660, 10198, 8958, 4849, -1888, -7211, -14672, -16643, -14118, -4806, 7233, 14980, 20851, 20018, 14923, 6115, -4474, -11821, -16210, -17857, -15125, -12552, -5805, 3463, 11682, 18640, 19151, 16157, 8764, 307, -7256, -9656, -7318, -6140, -4337, -3917, -1967, 2690, 4470, 5563, 4482, 452, -3483, -7005, -7773, -7621, -4499, 1061, 6196, 10400, 10121, 7529, 4233, 2785, 3614, 740, -4433, -9053, -11552, -11256, -9121, -4336, 1267, 2687, 3555, 4861, 6998, 6550, 3435, 2622, 1308, 1431, -640, -4688, -6309, -3841, 874, 5066, 6096, 4305, 2513, -491, -3183, -2559, -2111, -3116, -4443, -5090, -2430, 1477, 7593, 11285, 10676, 8154, 3119, -3596, -8292, -8792, -6404, -4298, -465, 3977, 6479, 8814, 8069, 5924, 3639, -2074, -8925, -13925, -17101, -14812, -7408, 812, 8271, 14726, 17544, 16109, 10894, 4852, 355, -6218, -11269, -15057, -14929, -11896, -7913, 572, 5975, 8774, 9939, 5529, 604, -2307, -4647, -4069, -1148, -1059, -147, 1691, 4240, 10275, 11435, 9168, 5050, -3089, -8353, -12569, -15965, -12898, -9008, -4710, 79, 3518, 7667, 10561, 12459, 11605, 8786, 2899, -4545, -8793, -9027, -7269, -3702, -568, -82, 490, 907, -854, -866, 1024, 1393, 2622, 748, -1292, -2523, -4769, -3229, -1681, 1707, 3727, 3253, 2131, 2865, 5423, 5766, 6156, 1661, -3080, -6368, -9471, -8736, -5859, -2317, 1646, 3048, 2028, 2511, 1319, -26, 1312, 685, -1721, -2200, -2376, 393, 8136, 13029, 11597, 6189, -2187, -7857, -11186, -12905, -12551, -11544, -8985, -5087, 796, 7657, 13023, 13747, 12077, 9007, 3932, -2207, -6859, -8390, -6908, -3389, 921, 4760, 5580, 5325, 2275, -2316, -4489, -6566, -8109, -8705, -9634, -5301, 174, 6609, 12938, 14268, 12330, 8220, 3582, -1165, -4881, -9375, -9722, -8826, -7360, -4363, -1502, 2876, 7392, 9885, 8090, 3813, -306, -4529, -5177, -2211, -364, -1315, -2297, -1694, -625, 4005, 7158, 8600, 7618, 4185, 51, -3978, -7262, -8999, -8307, -5923, -4706, -4181, -2429, -541, 2677, 7214, 10310, 9841, 6676, 2522, -821, -3097, -3238, -3928, -3718, -2828, -1131, 1267, 2422, 2241, 479, -2364, -5136, -6504, -6706, -4938, -2340, -528, 3904, 10989, 15095, 15911, 9945, 2131, -2143, -6129, -8611, -10825, -13050, -12591, -9000, -3581, 3366, 10272, 11689, 9833, 6216, 546, -3233, -6243, -7070, -4889, -2102, 1339, 4199, 7565, 8959, 7738, 5647, 346, -4092, -7905, -10812, -9967, -6991, -1831, 2620, 4756, 5654, 6096, 5241, 3909, 2375, -851, -3856, -4248, -2673, -1068, 1278, 2371, 2655, 2567, 1761, 1467, 295, -1790, -3450, -2475, -1406, 489, 662, -1472, -2400, -2998, -1610, 1332, 4099, 5430, 6274, 5643, 5491, 5914, 2659, -1075, -4300, -6715, -7579, -9079, -8224, -5344, -788, 5043, 7280, 7602, 5397, 2150, -695, -2246, -3078, -3655, -3233, -2666, -323, 3188, 6260, 7052, 4908, 168, -3646, -6514, -8293, -8533, -6957, -2921, 1354, 5878, 8954, 9342, 6301, 2160, -214, -1721, -3062, -4732, -5945, -5602, -3636, 813, 4980, 7538, 7809, 5685, 1695, -2002, -4542, -6396, -5508, -4386, -2254, 596, 3483, 4742, 5038, 4740, 3422, 1427, -1244, -3779, -6389, -5865, -3196, -283, 1052, 1341, 836, 1571, 2366, 2479, 1419, -1506, -3317, -4092, -3621, -2490, -1040, -800, -1324, -679, 988, 2829, 4176, 3907, 3648, 3770, 2684, 998, -1667, -4614, -6238, -7469, -7729, -6281, -3304, 415, 3777, 7019, 7828, 7768, 5344, 1756, -1104, -3780, -4505, -4770, -4837, -3793, -1693, 518, 2611, 3440, 3029, 2124, 78, -1516, -2529, -3674, -3360, -2211, -419, 2325, 4427, 5351, 5255, 3718, 1894, -553, -2876, -4798, -6311, -5267, -3497, -1175, 1824, 4584, 5896, 5813, 4560, 1922, -1128, -3576, -4759, -4841, -3567, -1992, -82, 2293, 3970, 5186, 5288, 4049, 1329, -1592, -4021, -4966, -4301, -3400, -978, 1231, 2884, 4035, 3749, 2719, 794, -912, -1983, -3030, -2837, -1931, -519, 1679, 2870, 3345, 2815, 1772, 1161, 609, -153, -1265, -3008, -4828, -4563, -3292, -1243, 936, 1723, 2027, 1516, 1573, 2223, 2605, 3198, 3086, 1715, 671, 62, -946, -1925, -3572, -4538, -4309, -3766, -1887, 281, 2438, 4294, 4824, 4774, 4035, 1403, -1143, -2542, -3483, -3442, -3075, -2322, -1112, 46, 1305, 2342, 2437, 1565, 552, -787, -1810, -2184, -2320, -1467, -664, 539, 1608, 1646, 1988, 1599, 541, -902, -1879, -1912, -1476, -1069, -83, 455, 817, 1125, 930, 880, 612, 165, -734, -1132, -1640, -1507, -981, -850, -436, -175, 740, 1363, 1604, 1774, 1125, 790, 30, -604, -920, -1020, -638, -53, 464, 354, 574, 866, 1096, 826, 657, 297, -61, -599, -1151, -1369, -893, 173, 1195, 2133, 2144, 2148, 1653, 689, -134, -1197, -1912, -2330, -2327, -2063, -1487, -967, -89, 1033, 1654, 2311, 2374, 2341, 1952, 956, 251, -600, -1246, -2040, -2789, -2644, -2299, -1753, -985, -60, 1146, 2158, 2353, 1659, 1497, 878, -102, -1308, -2167, -2252, -2076, -1310, -230, 807, 1403, 1255, 909, 572, 158, -206, -532, -303, -93, -198, -118, -154, -241, -260, -194, -248, -334, -653, -939, -533, -404, -160, 413, 652, 1213, 1387, 926, 429, 201, 68, -94, -408, -890, -1149, -838, -1055, -1094, -522, -347, -251, 264, 876, 1244, 1218, 1126, 1132, 791, 351, -170, -715, -809, -872, -916, -710, -290, 210, 321, 360, 304, 137, -211, -786, -840, -567, -165, 454, 1145, 1392, 1541, 1556, 1388, 616, -193, -758, -1160, -1373, -1494, -1639, -1545, -965, -3, 617, 1062, 1158, 960, 988, 633, 173, -442, -863, -991, -814, -725, -588, -293, 66, 552, 624, 708, 771, 678, 551, 353, 47, -16, -275, -627, -727, -688, -783, -633, -442, -201, 132, 368, 432, 654, 976, 1034, 1175, 1038, 713, 345, 53, -206, -404, -550, -949, -1120, -873, -621, -368, -97, 36, 164, 380, 608, 825, 930, 676, 426, 74, -156, -239, -325, -321, -380, -381, -474, -542, -559, -508, -504, -371, -204, -271, -283, 51, 452, 748, 839, 813, 823, 637, 464, 379, 76, -382, -698, -1036, -1104, -1082, -755, -406, -252, 47, 428, 557, 742, 839, 479, 126, -123, -315, -264, -101, 189, 444, 438, 322, 177, 175, 216, 186, 122, 66, -33, -83, -153, -74, 143, 128, 32, -109, -150, -150, -163, -119, 75, 106, 96, 166, 226, 94, -94, -174, -61, 65, 136, 50, -72, 17, -29, -417, -666, -659, -472, -255, -58, 181, 331, 436, 542, 757, 739, 329, -38, -195, -187, -136, -245, -189, -139, -150, -210, -318, -224, -239, -259, -210, -107, -2, 20, 11, 154, 305, 361, 283, 84, -46, -30, -148, -151, -127, -62, -172, -424, -632, -553, -364, -55, 81, -197, -403, -250, 270, 677, 861, 705, 319, 9, -74, -74, -54, -188, -331, -321, -308, -233, -116, -90, -166, -174, -31, 130, 400, 519, 381, 156, 62, 115, 72, -12, -145, -151, -64, 81, 184, 316, 216, -1, -232, -411, -376, -328, -213, -113, -59, -18, 121, 297, 413, 427, 209, -38, -120, -154, -81, -7, 79, 72, 17, 23, 29, -8, -122, -329, -381, -299, -136, 6, 111, 294, 501, 494, 374, 269, 107, 34, -51, -94, -140, -146, -82, -43, -143, -294, -431, -285, -12, 97, 159, 91, 57, 162, 247, 267, 230, 126, 54, -2, -16, -33, -39, -105, -100, -36, -49, -94, -121, -106, -186, -161, -29, 10, 30, 66, -5, -31, -2, 99, 107, 41, -21, -140, -197, -151, 2, 113, 32, -72, -134, -149, -88, 18, 112, 149, 148, 100, 110, 156, 176, 89, 33, -10, -55, -51, -47, -14, -39, -5, -13, -47, -45, -78, -82, -45, 27, 58, 37, -56, -123, -102, 3, -6, -8, -19, -83, -138, -130, -86, -49, -16, 48, 60, 37, 8, -54, -49, -11, 31, 25, -36, 32, 108, 121, 63, 46, 58, -47, -155, -191, -107, -46, -46, -28, 50, 132, 87, 60, 52, 95, 77, 15, -16, 36, 69, 20, -72, -53, -42, -64, -64, -80, -33, 4, 24, 10, -23, -61, -46, 22, 64, 108, 118, 118, 68, 20, -75, -111, -143, -154, -79, -31, 1, -3, 11, 24, 6, 14, 33, 37, 22, 26, 67, 83, 108, 66, 50, 22, -48, -83, -101, -66, -19, 22, 0, -31, -41, -38, -9, 4, 24, 33, 19, 20, 7, 6, 19, 43, 49, 7, -39, -69, -70, -26, -3, 17, -18, -33, -40, -38, -16, -19, -14, -23, -5, 34, 49, 57, 44, 46, 27, -5, -15, -36, -60, -58, -50, -27, -10, -1, 15, 16, 27, 25, 16, 24, 4, 4, -3, 11, 0, 33, 8, 6, -13, -26, -35, -31, -36, -17, -32, -16, -20, 4, 13, 19, 16, 23, 19, 29, 12, 17, -16, 8, -8, -6, -12, -6, -15, 0, -12, -1, -10, 1, -6, 12, 1, 21, 5, 27, 1, 12, 3, 3, 5, -1, -1, -6, 1, -6, 0, -11, -4, -5, 1, 3, -5, 8, -10, 2, -7, -5, 3, -8, 4, -6, -2, 2, -4 }; fldigi-4.2.05/src/soundcard/audio_alert.cxx0000664000175000017500000001214114611711171015547 00000000000000// Class Caudio_alert // // play various canned play_sounds or wav file using port audio interface #include "config.h" #include "audio_alert.h" #include "configuration.h" #include "confdialog.h" #include "rxmon.h" #if USE_PORTAUDIO #define SC_RATE 8000 #define PHONERING 15000 int Caudio_alert::int_phone_ring[PHONERING]; #define BEEBOO 48000 int Caudio_alert::int_audio_beeboo[BEEBOO]; void Caudio_alert::bark() { try { sc_audio->play_sound(int_audio_bark, BARK_SIZE, SC_RATE); sc_audio->silence(0.5, SC_RATE); sc_audio->play_sound(int_audio_bark, BARK_SIZE, SC_RATE); } catch (...) { throw; } } void Caudio_alert::checkout() { try { sc_audio->play_sound(int_audio_checkout, CHECKOUT_SIZE, SC_RATE); } catch (...) { throw; } } void Caudio_alert::doesnot() { try { sc_audio->play_sound(int_audio_doesnot, DOESNOT_SIZE, SC_RATE); } catch (...) { throw; } } void Caudio_alert::diesel() { try { sc_audio->play_sound(int_audio_diesel, DIESEL_SIZE, SC_RATE); sc_audio->silence(0.5, SC_RATE); sc_audio->play_sound(int_audio_diesel, DIESEL_SIZE, SC_RATE); } catch (...) { throw; } } void Caudio_alert::steam_train() { try { sc_audio->play_sound(int_steam_train, STEAM_TRAIN_SIZE, SC_RATE); } catch (...) { throw; } } void Caudio_alert::beeboo() { try { sc_audio->play_sound(int_audio_beeboo, BEEBOO, SC_RATE); } catch (...) { throw; } } void Caudio_alert::phone() { try { sc_audio->play_sound(int_phone_ring, PHONERING, SC_RATE); sc_audio->silence(1.0, SC_RATE); sc_audio->play_sound(int_phone_ring, PHONERING, SC_RATE); } catch (...) { throw; } } void Caudio_alert::dinner_bell() { try { sc_audio->play_sound(int_dinner_bell, DINNER_BELL, SC_RATE); } catch (...) { throw; } } void Caudio_alert::tty_bell() { try { sc_audio->play_sound(int_tty_bell, TTY_BELL, SC_RATE); } catch (...) { throw; } } void Caudio_alert::standard_tone() { try{ float st[16000]; float mod; for (int i = 0; i < 16000; i++) { mod = i < 800 ? sin(M_PI*i/1600.0) : i > 15200 ? (cos(M_PI*(i - 15200)/1600.0)) : 1.0; st[i] = 0.9 * mod * sin(2.0*M_PI*i*440.0/8000.0); } sc_audio->play_sound(st, 16000, 8000.0); } catch (...) { throw; } } void Caudio_alert::file(std::string sndfile) { try { sc_audio->play_file(sndfile); } catch (...) { throw; } } void Caudio_alert::create_beeboo() { float bee = 800; float boo = 500; float val; float sr = 8000; for (int i = 0; i < BEEBOO; i++) { val = sin( (2.0 * M_PI * i / sr) * (i / 2000 % 2 == 0 ? bee : boo)); if (i < 500) val *= 1.0 * i / 500; if (i > (BEEBOO-500)) val *= 1.0 * (BEEBOO - i) / 500; int_audio_beeboo[i] = 32500 * val; } } void Caudio_alert::create_phonering() { int ntones = 60; float freq = 500; float sr = 8000; int mod = PHONERING/ntones; memset(int_phone_ring, 0, sizeof(int_phone_ring)); for (int i = 0; i <= (PHONERING - mod); i++) int_phone_ring[i] = 32000 * fabs(sin(M_PI * i / mod)) * sin(2.0 * M_PI * freq * i / sr);; } void Caudio_alert::alert(std::string s) { if (s.empty()) return; if (s == "bark") bark(); else if (s == "checkout") checkout(); else if (s == "doesnot" ) doesnot(); else if (s == "diesel" ) diesel(); else if (s == "steam_train") steam_train(); else if (s == "beeboo") beeboo(); else if (s == "phone") phone(); else if (s == "dinner_bell") dinner_bell(); else if (s == "rtty_bell") tty_bell(); else if (s == "standard_tone") standard_tone(); else file(s); } void Caudio_alert::monitor(double *buffer, int len, int _sr, double amp) { double nubuff[len]; for (int i = 0; i < len; i++) nubuff[i] = buffer[i] * amp; sc_audio->mon_write(nubuff, len, _sr); } Caudio_alert::Caudio_alert() { try { sc_audio = new c_portaudio; create_phonering(); create_beeboo(); } catch (...) { throw; } } Caudio_alert::~Caudio_alert() { delete sc_audio; } Caudio_alert *audio_alert = 0; void center_rxfilt_at_track() { progdefaults.RxFilt_mid = active_modem->get_freq(); int bw2 = progdefaults.RxFilt_bw / 2; progdefaults.RxFilt_low = progdefaults.RxFilt_mid - bw2; if (progdefaults.RxFilt_low < 100) progdefaults.RxFilt_low = 100; progdefaults.RxFilt_high = progdefaults.RxFilt_mid + bw2; if (progdefaults.RxFilt_high > 4000) progdefaults.RxFilt_high = 4000; sldrRxFilt_mid->value(progdefaults.RxFilt_mid); sldrRxFilt_mid->redraw(); sldrRxFilt_low->value(progdefaults.RxFilt_low); sldrRxFilt_low->redraw(); sldrRxFilt_high->value(progdefaults.RxFilt_high); sldrRxFilt_high->redraw(); progdefaults.changed = true; if (audio_alert) audio_alert->init_filter(); } void reset_audio_alerts() { if (!audio_alert) return; if (progdefaults.enable_audio_alerts && audio_alert) { if (audio_alert->open()) LOG_INFO("Opened audio alert stream on %s", progdefaults.AlertDevice.c_str()); else { progdefaults.enable_audio_alerts = 0; btn_enable_audio_alerts->value(0); LOG_ERROR("Open audio device %s FAILED", progdefaults.AlertDevice.c_str()); } } else { audio_alert->close(); LOG_INFO("Closed audio alert device %s", progdefaults.AlertDevice.c_str()); } } #else Caudio_alert *audio_alert; void reset_audio_alerts() {} void center_rxfilt_at_track() {} #endif fldigi-4.2.05/src/soundcard/bark.cxx0000664000175000017500000003170314611711171014203 00000000000000#define BARK_SIZE 1501 int int_audio_bark[BARK_SIZE] = { 936, 1012, -165, -994, -1724, -1893, -2394, -2472, -2530, -2478, -2377, -1798, -574, 240, 1147, 1832, 2081, 1781, 1121, 363, -126, -531, -1056, -1456, -1930, -2058, -1772, -1485, -960, -277, 73, 588, 1058, 1282, 1023, 828, 889, 712, 701, 287, 27, 497, 985, 1017, 854, 713, 338, -410, -1292, -2121, -3223, -4354, -4515, -4051, -3019, -1229, -117, 1009, 2652, 3638, 3629, 2928, 1942, 691, -1293, -3184, -3935, -4378, -3328, -41, 2266, 2492, 2523, 1577, -44, -45, 155, -364, -940, -2107, -4449, -6415, -5723, -3739, -2078, 56, 3138, 4747, 4378, 4291, 3015, 513, -853, -2185, -3250, -2605, 754, 4961, 3605, 209, -275, -1622, -1733, -40, 373, -1272, -3562, -5569, -8514, -7745, -2744, 184, 1580, 5788, 9343, 8273, 6635, 5903, 2383, 127, 1966, 1722, -137, -132, -1861, -7002, -8002, -5436, -5412, -3565, 2390, 4452, 1745, 479, -1214, -3168, -402, 4158, 4354, 3759, 4258, 113, -4875, -2847, -2208, -3926, 3478, 11668, 7096, 225, 896, -2384, -6413, -1740, -794, -5297, -4708, -4509, -10118, -9582, -1133, 36, -184, 7892, 12924, 8567, 6161, 6063, 593, 3687, 14336, 11291, -1108, -6415, -9802, -16218, -14248, -8233, -9858, -8053, 44, 1230, 1693, 9394, 10094, 3951, 5414, 10972, 6555, -2876, -6074, -9317, -9172, 3208, 11631, 2695, -1550, 1974, -3751, -5942, 2407, -542, -8052, -4900, -5805, -11478, -6965, -1141, -4676, -2477, 9446, 14724, 7207, 4214, 2972, 7579, 19004, 17455, 3588, -6083, -9614, -18211, -16633, -11363, -15225, -14954, -7853, -2617, 3209, 11494, 14397, 10225, 12131, 18116, 10910, -1454, -7281, -13869, -13528, 4811, 10350, -4212, -8812, -3876, -5286, -625, 5750, -601, -4767, -1347, -3984, -9676, -4969, -1856, -6471, -1204, 11722, 12850, 4181, 1196, 15349, 25327, 18329, 7884, -3696, -19158, -20968, -10813, -17773, -22533, -13301, -10423, -7369, 11890, 22983, 14818, 7810, 13141, 15361, 4242, -4747, -5864, -241, 9446, 8563, -10230, -19311, -13076, -5681, 2472, 3607, -5697, -8606, -7203, -5532, 341, 2147, -4430, -6233, 1405, 13652, 13307, 4018, 19570, 28053, 16682, 4530, -2067, -17958, -26346, -7441, -11308, -29067, -19319, -7781, -11919, 4714, 28605, 17228, -785, 11447, 17924, 5243, -4279, 1, 14107, 12187, 12, -13253, -24193, -24268, -4772, 8636, -4916, -7588, 2145, -8046, -17247, -351, 2005, -7647, -5020, 10575, 18192, 19692, 30367, 28053, 16641, -1468, -1291, -12838, -31744, -15404, -10644, -26448, -21098, -2201, -5854, 1832, 27703, 20793, -2394, 6293, 23145, 2787, -12228, 11296, 19544, -843, -11725, -9231, -25238, -19697, 12591, 8178, -8909, 84, -856, -25659, -19309, -3978, -6000, -6666, 9349, 28970, 31926, 28975, 19534, 6011, -18080, -20029, -9107, -24414, -30097, -17450, -9881, -7682, 6749, 19759, 11986, 3548, 12223, 19381, 7266, 12289, 25661, 19256, 5822, -10922, -19256, -31215, -25296, 1660, 9553, -968, -6738, -6500, -18006, -18714, -10223, -5107, 550, 19094, 31929, 31053, 26512, 13469, 3189, -23024, -30544, -14481, -21138, -25954, -7976, -4223, -14974, -1883, 7719, 884, 6146, 22875, 31914, 29998, 24109, 4974, -14461, -22935, -24797, -17795, -14789, -13832, -8670, -432, -3427, -8542, 2048, 2661, 9237, 29075, 31261, 28236, 12400, -11842, -23705, -24063, -9716, -6491, -16594, -12211, 1458, -845, -844, -7539, -12609, -7329, 1884, 27862, 30684, 25842, 6831, -10331, -21275, -26266, 2533, 7163, -16739, -17304, 1245, -7152, -5299, -2555, -10415, -3468, 11662, 31026, 30442, 25922, 8034, -10723, -19631, -18811, -8916, -10846, -21045, -19358, -1723, 1366, 4668, 2668, -3133, 3464, 19986, 31998, 28612, 22576, 132, -18698, -20657, -15745, -10566, -8693, -11602, -14383, -6920, -9175, -8875, -1112, 4186, 21197, 31999, 30408, 24591, 2149, -24948, -30958, -12877, 5521, -2230, -16516, -12786, -7488, -6300, -7181, -9104, -6620, 3578, 25174, 31999, 24941, 14499, -13284, -31931, -28243, -13763, 5311, 6285, -4213, -7190, -9360, -10081, -12681, -9851, -2659, 15117, 31999, 29568, 23112, 796, -25452, -25582, -8939, -542, 4582, 2081, -5272, -6590, -7479, -14715, -14488, -6697, 3016, 25870, 31956, 29541, 19706, -4835, -24007, -25261, -10607, 3234, -300, -11045, -3911, -2982, -12166, -9990, -5871, 4317, 24408, 31999, 28434, 20350, -297, -27436, -29567, -15817, -12041, -2307, 6562, 2102, 95, 2949, -7426, -14748, -9580, -1018, 23353, 31466, 24704, 13015, -15850, -29620, -25941, -7213, 16243, 10885, -10456, -8419, -5971, -16447, -14369, -9160, -1455, 19822, 31999, 27930, 21652, 3394, -24579, -30074, -12122, -7596, -6768, 3144, 197, -8471, -2829, -8499, -13842, -7725, 2288, 24928, 31999, 27185, 18209, -6668, -29686, -28663, -13368, 9273, 8225, -7642, -4414, -3833, -9987, -10276, -6239, 1616, 22168, 31999, 27334, 20837, 1415, -24768, -31999, -20551, -4357, 4742, 5127, 356, -4032, -4844, -12882, -14038, -8026, 10686, 30850, 29005, 21033, 9350, -16203, -32000, -27891, -13596, 6718, 13043, 8687, -6282, -12147, -9561, -11886, -8304, 6969, 28295, 31521, 24043, 15132, -6152, -29848, -31131, -20039, 250, 13175, 11101, -1625, -10136, -9616, -12640, -9990, -2999, 18273, 31807, 29140, 21120, 8462, -17648, -32000, -27791, -11847, 9884, 9121, 1407, -5398, -10948, -13920, -11279, -5213, 15793, 31795, 30110, 21766, 10917, -11199, -31633, -31002, -21127, -1559, 9856, 17196, 382, -11732, -7953, -13201, -11726, 1561, 24800, 31999, 24889, 16271, 220, -26090, -32000, -27284, -10109, 17726, 19837, 4567, -8426, -15495, -15754, -11364, -3298, 19691, 31999, 28403, 19775, 8253, -16187, -32000, -30113, -16680, 4045, 10444, 14000, -2600, -9931, -6983, -12484, -10200, 5011, 27682, 31771, 23326, 14333, -4539, -28281, -32000, -24526, -4585, 14968, 15942, 1665, -11861, -14263, -13242, -10450, 1270, 24450, 31997, 26465, 18127, 3850, -21630, -32000, -28418, -16430, 6721, 16318, 10995, -5254, -6544, -10073, -14134, -9135, 7383, 29755, 30811, 22630, 13540, -3071, -28032, -31389, -23573, -7034, 10361, 18960, 8887, -11746, -15475, -14819, -10901, -2365, 20469, 31999, 27977, 20066, 8822, -14329, -31646, -27428, -11530, 2328, 12632, 13815, -12001, -12201, -9347, -14814, -9289, 3251, 26002, 31999, 26700, 18407, 4157, -20192, -31998, -22323, -11358, -537, 17947, 14265, -6220, -5075, -11492, -18331, -11039, -1724, 19946, 31999, 28516, 20518, 7250, -14795, -31999, -26068, -11016, -629, 8037, 4099, -4158, -4015, -12356, -13103, -8146, 5233, 27637, 31720, 25351, 17085, 2504, -22742, -31801, -15273, -11086, -12292, 3868, 2549, -6352, 1512, -5507, -13363, -7965, 4842, 26479, 31999, 25523, 17976, 3371, -21242, -32000, -17205, -15026, -12288, 12136, 13755, -4516, -3463, -10561, -17743, -10117, -2063, 19417, 31878, 30175, 23333, 11433, -10541, -31593, -22008, -9095, -16697, -3705, 18791, 6812, -5435, -9458, -19052, -19205, -10210, -1500, 6013, 23983, 31999, 30215, 23733, 7859, 2826, -18765, -32000, -21540, -20006, -12581, 7719, 4250, -18201, -12457, -7005, -9744, -1979, 11865, 7870, 11615, 29961, 31496, 26911, 16898, 5528, -15805, -31997, -28977, -18660, -12119, 1840, 11757, -39, -8726, -5670, -9570, -12239, -3676, 9404, 10221, 14626, 31182, 29041, 20866, 9633, -3001, -21451, -31998, -22070, -9348, -10791, -4152, 727, -13144, -14568, -9153, -6885, -2215, 12700, 22125, 20075, 17814, 26993, 25058, 14259, 4335, -7653, -18061, -29436, -31498, -24277, -13427, -4860, 3650, 3984, 4070, 5790, 2996, -3240, -731, 8178, 11136, 15931, 22771, 20807, 12398, 7522, 1971, -10819, -21067, -16161, -15357, -19771, -14101, -5421, -4959, -929, 3026, -4095, -7006, 1087, 6354, 8738, 18065, 21681, 12249, 4183, 9509, 9421, -4460, -12737, -2305, 8339, 1874, -4743, -5120, -12055, -17144, -11378, -4506, -1654, -1176, -1206, -3412, -2590, 5685, 8281, 5652, 8619, 5930, -1817, -705, 4277, 4112, 651, -4495, -578, 8989, 7699, -2156, -3422, -3827, -12806, -13564, -8547, -6887, -7533, -4058, -5639, -6669, -1803, -1224, 2741, 10322, 11616, 10276, 9867, 7733, 8644, 1999, -11311, -8064, 1854, 1894, 1770, 5169, 394, -6014, -5899, -10927, -12454, -8572, -7984, -11217, -6953, -2204, 3472, 11824, 13147, 16342, 16156, 13183, 9500, 8509, -826, -9260, -12127, -10795, -4719, -1123, 3716, 3640, 2030, -858, -3266, -5789, -5418, -6052, -4763, -4468, -2729, 340, 15, 4738, 10496, 15512, 17715, 16331, 9072, 2200, -7337, -16003, -17596, -15856, -8008, 2678, 5681, 8624, 10768, 6940, 3621, -764, -1542, -1504, -1520, -5275, -8908, -9129, -8268, -6305, 1641, 8510, 8315, 11224, 8406, 3993, 4393, -1455, -8750, -8807, -7750, -5796, -4092, 1346, 7399, 9405, 8669, 6676, 6276, 5729, 2215, -4138, -6636, -13179, -17010, -18096, -18872, -11305, -835, 8367, 14494, 15900, 13728, 11562, 5132, 1460, -2076, -7508, -7469, -7680, -5235, -3153, -4185, -2915, -913, 2620, 7081, 8780, 11201, 11205, 3817, -4399, -13065, -19283, -19323, -17210, -11000, -2420, 5806, 12571, 13722, 11972, 9939, 5963, 1130, -1873, -4666, -7041, -7803, -7526, -5278, -3846, -1240, -497, 730, 4982, 7551, 8964, 9399, 7217, 1681, -2494, -10218, -14825, -14814, -12372, -7528, -3654, 2387, 6345, 9165, 11087, 11650, 7542, 2497, -3454, -7717, -8043, -6363, -2586, -1639, -1783, 436, 1615, 968, 4580, 4333, 4053, 6327, 7140, 6070, 3511, -286, -5409, -11013, -13447, -11203, -10047, -4833, -580, 2712, 6713, 8770, 9068, 7257, 2668, -33, -1007, -2742, -831, -838, -1809, -776, -168, -846, -191, -466, 315, 743, 1421, 3448, 1396, 1457, 3297, 3324, 2577, 1880, -173, -2415, -5141, -6259, -4832, -5202, -3332, -272, 1161, 1810, 1583, 1680, 1803, 1834, 2796, 2141, 145, 964, 1002, -1651, -2117, -2399, -3407, -2426, -1855, 1154, 3115, 1737, 2947, 2144, -223, 557, 2386, 2584, 2853, 3387, 1178, -2610, -4853, -5482, -7643, -7710, -5138, -3539, -1142, 751, 1385, 2853, 2744, 3294, 5644, 3552, 2271, 2108, -52, -1746, -2759, -3103, -3633, -3469, -2443, -457, -197, -269, 13, 1637, 3952, 3354, 4365, 4915, 1627, 428, -1217, -4111, -4566, -6259, -6458, -4675, -3812, -2087, -414, -300, 740, 1367, 1172, 1694, 1678, 2983, 2179, 684, 1369, -152, -1562, -1910, -2983, -2099, -277, -494, -407, -1549, -3224, -3460, -2999, -642, 861, 2495, 3523, 2934, 3613, 3332, 593, -1052, -2399, -3148, -3129, -4482, -4381, -4066, -4641, -3228, -1526, -742, 1535, 1896, 1898, 3105, 3555, 3259, 2215, 801, -74, -698, -1116, -1784, -3600, -4257, -4804, -3776, -2021, -354, 1070, 1759, 898, 1668, 2141, 419, 958, 864, 1112, 549, -535, -848, -828, -1400, -1375, -1228, -986, -73, -18, -24, -260, -260, -214, -394, -818, 352, 1004, 725, 332, -281, -206, }; fldigi-4.2.05/src/soundcard/diesel.cxx0000664000175000017500000020014114611711171014523 00000000000000#define DIESEL_SIZE 7621 int int_audio_diesel[DIESEL_SIZE] = { -1556, -594, -3297, -4007, -3029, -2668, -1282, -1432, -615, -841, -1989, -1587, -1985, -1423, -2066, -2257, -1630, -1906, -2242, -848, 2031, 1619, 2520, 2703, 2144, 1447, 2108, 2767, 1488, 1866, 2604, 2398, 1802, 1724, 2145, 2034, 1407, 2703, 3012, 3546, 2611, 3072, 2911, 2392, 3402, 2498, 3559, 2929, 3036, 2349, 2281, 2277, 236, 899, 1209, 654, 113, 575, 1633, 1333, 565, 1720, 1912, 2883, 3117, 1447, 890, -443, -171, -416, -268, 1998, 1066, -1711, -4346, -6440, -7462, -4192, -1446, -115, 3224, 98, -1360, -551, 2340, 4792, 2344, -421, -6521, -11091, -12809, -9595, -4677, -4157, -5461, -1192, 5111, 5467, 2461, -840, -4078, -6382, -5641, -4193, -2654, -494, 1089, 7518, 14612, 11258, 4916, 1255, -2881, -10444, -16913, -14517, -9980, -9701, -9259, -4948, 3963, 10100, 15864, 18029, 9065, -242, -1903, 2475, 457, -7816, -10585, -6749, -1041, 1792, -1440, -9037, -14310, -9679, -2422, 1702, 3245, 4597, 9446, 17931, 22048, 18266, 12642, 7875, 714, -9549, -13794, -17073, -15171, -10174, -7600, -6192, -3186, 8222, 22598, 27969, 23145, 18219, 17774, 17979, 7061, -9297, -19575, -22125, -16869, -7695, -1994, -5627, -10844, -6984, 2016, 6637, 3012, 2202, 7818, 12689, 15117, 15791, 12961, 11141, 13479, 13476, 4462, -12353, -22296, -21900, -19561, -20846, -18859, -15136, -7151, 1844, 3741, 5062, 8508, 12443, 13807, 12119, 4293, -2720, 41, 6254, 5275, -55, -8499, -16093, -16879, -12863, -11824, -12028, -10513, -10163, -6576, -191, -583, -3241, 2541, 11289, 19760, 21880, 17055, 11385, 2837, -11459, -23125, -20481, -12913, -6486, 5309, 7929, 4556, 2861, 4528, 4442, -1675, -4690, -7459, -6890, -2700, -3770, -6395, -3445, -3808, -1562, 7080, 14333, 10011, 8670, 16552, 17990, 13408, 5871, -2529, -10225, -11285, -11432, -10814, -6088, 2598, 11583, 9452, -6058, -14994, -10039, -1349, 3306, 5986, 13208, 22715, 24436, 13696, -2649, -12412, -14594, -11005, -2024, 1915, 320, -2687, -2503, 680, 9820, 14981, 15097, 14223, 9558, -835, -8095, -13916, -18567, -15921, -11442, -7552, -8894, -7700, -3265, 11788, 20256, 13620, 10990, 18190, 20325, 11814, 696, -7622, -7466, -1230, 3096, -3921, -13264, -17551, -12974, -11049, -17693, -18218, -14145, -10474, -5812, 513, 4917, 11458, 27868, 31738, 27212, 23035, 17124, 7519, -8065, -17706, -20534, -20514, -16686, -11491, -11893, -11478, -17904, -16986, -12639, -3928, 10830, 15704, 18136, 19510, 22156, 20656, 15427, 7754, 4535, 8201, 6106, -9412, -22166, -25149, -22840, -21845, -21159, -16918, -13243, -987, 19321, 28225, 23173, 17333, 12351, 3131, -9263, -16349, -20045, -18271, -14706, -6339, 1831, 1897, 382, 678, 2861, 2048, 1782, 6510, 14288, 17594, 13743, 8169, 1279, -4333, 363, 4227, -5656, -17988, -17917, -12851, -9821, -8054, -7983, -4782, 8417, 13353, 18573, 31863, 30229, 25426, 19697, 12479, -1205, -13769, -15339, -11004, -8117, -7219, -7726, -9802, -9154, -10259, -8432, -9049, -8491, -7190, 2267, 12413, 11339, 20471, 29969, 30062, 25842, 19558, 12267, 5634, -6387, -24845, -30995, -24988, -20519, -16534, -4842, 420, -2038, -2973, -585, 8117, 6339, 1374, 3623, 3716, -2659, -5341, 2701, 4181, -1934, 1631, 12718, 9024, -5464, -11419, -7079, -4081, -5813, -9765, -14048, -7750, -648, 596, 3513, 3306, 3227, 7062, 2467, -7160, -13513, -12627, 1396, 15559, 13787, 15851, 23245, 21791, 11364, -6565, -19097, -23366, -17858, -8877, -2387, -5496, -6881, -3678, 2645, 9848, 10099, 5743, 4572, 4948, -7825, -14518, -15920, -14936, -7165, 4329, 8251, 2392, 5916, 16616, 22042, 16110, 2083, -10018, -11762, -7294, -8422, -8416, -6096, -2831, 3088, 9987, 4476, -6572, -5708, -5051, -2204, -10174, -8957, 2660, 12567, 18954, 18860, 21951, 20236, 15945, 13389, 12293, -3944, -17288, -20598, -18135, -13667, -10464, -8825, -8084, -1115, 2783, -1313, -5396, -9036, -10962, 399, 20022, 24056, 16661, 21355, 25510, 23423, 17067, 8959, -6500, -15856, -20843, -26480, -22604, -19926, -18508, -16425, -12724, -9179, -2034, 13453, 29208, 28651, 22476, 15470, 6391, 2619, -3672, -13748, -12231, -9797, -5445, 3860, 7941, -881, -14275, -16988, -17274, -10430, -5870, 1937, 7607, 13946, 20941, 17426, 12392, 9590, 5837, 2220, -4657, -21058, -22178, -12973, -6618, -4565, -3470, 3170, 6590, 6737, 9906, 7822, 4037, 1285, -410, 3356, 366, -10400, -11291, -7226, -5952, 1160, 5850, 5508, -1575, -10763, -16035, -13583, -9654, -8832, 2836, 25623, 28161, 17740, 18256, 19298, 18813, 10186, -3174, -15873, -21957, -22320, -19674, -19195, -17191, -11605, -694, 11858, 11470, 1695, -4863, 3464, 7115, 8173, 13081, 17715, 19070, 10113, 3378, -662, -6699, -13482, -16851, -12640, -12578, -13863, -7087, -980, 698, 2472, 5408, 7565, 13782, 18904, 14339, 6075, 7274, 7682, 3425, -507, -8939, -13875, -7813, 1058, 4945, 9084, 11602, 10509, 2455, -9385, -22699, -23579, -14615, -9893, 505, 8798, 9554, 10830, 15011, 11597, 1250, -3661, -2440, -3281, -3072, -2711, -2064, 1378, -492, -6138, -6685, -6619, -10586, -6065, 1505, 4166, 1446, -2545, -4709, -5219, -2510, -1468, -16, 4910, 8362, 8196, 6239, 2342, -5149, -8596, -3334, -3848, -3870, 1241, 4021, 8296, 7417, -21, 1277, 1874, -872, -896, -3609, -6325, -8707, -5325, 559, 5711, 8222, 7212, 695, -3206, -6432, -8387, -4263, -1674, 2784, 11749, 17113, 11006, 8492, 8422, 5974, 7343, 5191, -5407, -12027, -14834, -14188, -15327, -14846, -10235, -8880, -4403, -2611, 2090, 14202, 25005, 28035, 25877, 22630, 17849, 8498, -1370, -14177, -20218, -15689, -12256, -10172, -4619, -4272, -11613, -17960, -17557, -11351, -5043, 8672, 20157, 23875, 21795, 19754, 15174, 11301, 2209, -7770, -5618, -6389, -14600, -16079, -12492, -9450, -7770, -9307, -6960, -7451, -272, 2303, 4962, 10335, 7031, 8435, 10401, 5132, -4202, -4179, -3291, 1216, 11040, 6329, -2729, -4593, -7347, -12843, -14789, -12528, -12047, -1598, 13948, 19924, 17411, 15906, 6992, 226, -1665, -9047, -11040, -11856, -8029, -11757, -12438, -8397, -4532, 6309, 10194, 5713, 2589, 7318, 10815, 11944, 13015, 9391, 3285, 1057, -996, -4404, -2192, -5775, -16641, -17107, -13440, -9973, -5832, 2509, 2924, 3588, 9360, 5010, 10833, 16741, 19660, 20459, 14105, 8199, -3083, -9034, -9223, -17466, -19650, -12359, -4275, 3286, 5819, 3724, -2735, -4493, -5427, -9793, -6398, -3578, -1054, 8677, 14815, 20058, 19718, 16856, 10806, 646, -3705, -7915, -8651, -7014, -9024, -8903, -937, -3951, -10649, -8900, -7357, -8632, -4862, 3791, 10930, 15140, 9418, 2836, -4749, -3599, 3605, 4907, 10014, 13862, 5605, -1113, -2599, -10468, -14625, -14647, -13810, -10904, -1935, 5877, 4963, 7594, 5050, -1471, -2333, -3266, -3451, -2361, -117, -2038, -2362, 903, 1925, 7683, 14699, 5688, -4309, -6920, -11292, -9906, -8156, -6096, -4936, 3465, 11124, 8155, 7214, 5437, 2208, 4769, 5437, -2418, -8395, -7730, -9400, -12899, -4970, -858, 425, 7877, 12963, 14662, 16527, 16143, 14036, 13856, 5892, -2956, -6942, -9882, -10412, -8588, -8576, -9789, -9368, -3864, -2281, -8021, -9818, -9780, -3249, 13607, 27918, 31610, 29297, 25639, 19627, 12219, -857, -18376, -22128, -17848, -17194, -16037, -14407, -11273, -7153, -3702, -2589, -4905, -471, 10437, 15084, 14572, 8502, 2046, 4248, 5510, 5083, 5553, 3507, 5041, 594, -4810, -11660, -18757, -16669, -15577, -13718, -11939, -11300, -7900, 4814, 16113, 22377, 20564, 14465, 7481, 1510, -3212, -12437, -11847, -7944, 78, 2022, -930, -781, -1214, -1284, -3659, -3126, -5700, -2757, 5928, 6128, 4362, 5409, 4161, 3644, 5765, 3905, -598, -5069, -11148, -16257, -13920, -9120, -3240, 8869, 14773, 18211, 18157, 13205, 9488, 6942, 7365, 149, -6190, -8547, -13964, -15886, -14064, -11301, -7694, -1340, 6471, 10308, 10678, 7797, 1040, -2703, -4022, -7439, -1832, 7575, 15705, 22025, 19995, 17400, 8145, -3582, -11185, -16338, -14487, -11841, -10374, -8680, -5325, -2619, 1207, 5474, 4303, -550, -4105, -2917, -3227, 2803, 11220, 17342, 15875, 8403, 4737, 3458, 6051, -1328, -5233, -6438, -12264, -13906, -16678, -17700, -15507, -10588, -6156, 25, 11730, 20518, 19861, 14794, 3167, -10740, -11365, -7671, -4124, 3065, 7334, 9021, 6512, 4139, 426, -2791, -5354, -11875, -12927, -12297, -12208, -11988, -8624, -4208, 3001, 15944, 20387, 16074, 10947, 7833, 4136, -1356, -4365, -5947, -6215, 2167, 2686, 1463, 1155, -3143, -4059, -8563, -7981, -7405, -2577, 643, 2112, 4024, 4473, 5985, 10066, 13163, 6295, -1868, -6055, -9264, -15025, -11266, -6607, -4786, -1332, 1719, 10627, 18807, 18035, 17932, 17221, 13241, 476, -12777, -16876, -18029, -14586, -14075, -9512, -4084, 2380, 5065, 6115, 3801, -3013, -7434, -3811, 8657, 12041, 14989, 16565, 17513, 10700, 1254, -1815, -5362, -4011, -6453, -8750, -13805, -19275, -16404, -13247, -6281, -1545, -577, 1628, 8179, 14360, 10950, 6427, 8864, 11099, 8226, 10939, 7319, 5166, 3233, -4226, -5942, -13391, -18153, -17067, -14133, -13302, -12478, -9574, -5033, 2721, 12375, 20645, 20524, 15774, 13407, 9066, 1930, -1609, -5897, -10103, -9548, -10705, -11157, -8730, -6964, 2259, 7004, 9707, 6033, -3136, -3891, -3396, -506, -1203, -1415, 2931, 5376, 2242, -801, -2451, -4255, -3735, -2526, 2041, 4909, 4822, 7926, 8574, 6627, -1034, -8809, -6850, -1177, 161, -708, 246, -3989, -4925, -6768, -8189, -3231, 546, 4693, 8907, 7779, 3366, 312, 1046, 3659, -1326, -4555, -679, 5239, 11762, 11277, 5741, 1665, -225, -3652, -4027, -5712, -11562, -8042, -6449, -8245, -7263, -4058, -1266, 2948, 6290, 6100, 3510, 4874, 13411, 12066, 12012, 5753, -2726, -351, -1991, -5390, -6261, -5099, -4254, -1254, -1705, -5868, -6041, -6231, -3610, -1786, -521, -975, -2387, 748, 1061, 1010, 2747, 13761, 19768, 17707, 13645, 8424, 5714, -4898, -11595, -13167, -12115, -9024, -8735, -7889, -7514, -11973, -17097, -13400, -6030, 4192, 15603, 20701, 19878, 14182, 9349, 5789, 6500, 4349, -5146, -6741, -6208, -9808, -13389, -11953, -9962, -9737, -8314, -6814, 1144, 6033, 9640, 13442, 13029, 10730, 5208, 170, -2859, -5745, -11303, -9171, -5428, 1246, 5496, 4825, 5809, -2405, -5575, -5021, -3279, 1515, 4733, 7364, 7663, 8542, 177, -5679, -1144, -1460, -2487, -3157, -3478, -7331, -6233, -6206, -5965, -2320, 273, 7037, 7268, 8255, 8167, 10862, 14460, 14642, 10623, 3729, -1873, -5530, -4667, -8563, -10399, -8802, -11242, -13272, -10888, -4788, -1905, 1581, 6465, 3714, 9491, 15494, 18998, 21689, 18202, 15465, 10100, 2277, -8795, -14726, -16318, -16060, -17203, -15384, -10702, -5158, 3667, 7120, 6111, 1148, 290, 4840, 4978, 7586, 8353, 4560, 2444, 12, -1809, -722, 371, -2010, 415, 265, -493, -1086, -1871, 1160, -1226, -4228, -7202, -8487, -3728, 3843, 2807, 4873, 8098, 4390, 1795, -3994, -5147, -5188, -2331, 5580, 11902, 8567, 3691, 2996, 39, -1848, -10976, -15508, -8690, -3979, -251, 2570, 3708, 2848, 2128, 869, -2317, 1492, 638, -833, -955, -3674, -7248, -9569, -1706, 5666, 10789, 9572, 4889, 1472, 2443, 1457, -1485, -1804, -7221, -8739, -6078, -3625, -732, -1251, 3, 3181, 7101, 3310, -3614, -2894, -4786, -3736, -5079, -7866, -3771, 8084, 10433, 12845, 12990, 7314, 10875, 4235, 815, -1970, -5612, -10005, -11232, -6474, -5492, -3705, -2744, -1479, -2559, -3109, -7131, -10112, -2196, 6067, 15708, 24427, 24931, 19299, 15619, 15446, 6476, -4256, -14625, -17675, -17515, -18874, -18599, -16208, -12917, -7857, -3668, -3876, 6844, 14540, 20909, 21015, 11301, 4799, -1875, -7387, -6333, -254, -1188, -4442, -1862, -752, -2420, -4203, -8255, -11957, -12576, -9619, -7755, -3050, 3147, 11792, 17382, 18293, 15953, 4033, -1998, -4073, -6285, -9456, -14086, -12487, -6581, 524, 2684, 3660, 5913, 4628, 1495, 1488, 1056, -2254, 622, 1695, 1133, 2682, 2697, 2282, -227, 2714, 2117, -5507, -8759, -13250, -14236, -6957, -2093, -344, 7065, 9588, 16277, 25672, 19875, 12446, 3984, 5041, -369, -15536, -19995, -18774, -15877, -13433, -11834, -9176, -551, 6608, 12560, 12525, 4682, -558, 1033, 1732, 1511, 10096, 14443, 12461, 12683, 7408, -120, -9984, -15530, -14398, -13325, -9056, -6284, -6309, -2121, 6741, 9834, 9649, 5380, 3665, 4470, 4345, 173, -5783, -3791, -1223, 3173, 5730, 4001, 3558, 4022, 6247, 4075, -2793, -5186, -7656, -9403, -11107, -14340, -14849, -6731, 2791, 11485, 16398, 14704, 8696, 1190, -939, -5509, -4278, -5315, -2983, 534, 4250, 3970, -2559, -117, -633, 1247, -2848, -8913, -11591, -8704, -4882, -3916, -128, 3695, 8346, 10902, 9779, 2317, -1565, -2655, -1133, -3019, -8043, -3886, 1313, 3998, 4750, 275, 722, 591, 573, -392, -3191, -3673, -3437, 1960, 1445, 6463, 6233, 4609, 2119, -1427, 1664, 453, 84, -4949, -9182, -10036, -6621, -8238, -2534, 6423, 15321, 26484, 21755, 16989, 9886, 1525, -4200, -13500, -16282, -14720, -13491, -11707, -7592, -5524, -4192, 3719, 3549, 1821, 2480, 1259, 5542, 13030, 16856, 16099, 14785, 8805, 1325, -5342, -7163, -11393, -14432, -14451, -15794, -12534, -9010, -7117, -5462, -816, 1816, 7092, 14862, 20327, 20260, 15034, 7765, -4932, -10741, -4440, -3019, -1749, -1489, -5099, -4435, -6904, -4108, -3691, -3922, -4691, -8327, -7701, -2956, -1767, 4837, 13911, 11328, 15479, 13172, 5065, -1809, -8639, -10683, -11454, -10407, -9779, -9240, -1847, 5317, 5600, 1286, 4107, 5588, 4060, 5251, 207, -187, 2637, 2878, -4053, -6801, -6839, -5805, -4102, -4323, -7072, -6899, 922, 4795, 9663, 13209, 10627, 3749, 986, 3039, 6214, 8090, 6880, 4062, -3954, -11291, -14570, -15968, -11742, -6872, 1394, 5162, 7952, 9051, 8715, 13664, 8641, 1048, -7533, -6737, 1122, 3669, 1608, 4531, 6705, 273, -2625, -2648, -1886, -3314, -2239, -2064, -1110, -162, -2116, -1005, -3234, -4014, -5927, -4094, 6099, 9259, 9495, 10766, 7754, 351, 54, 2974, 4897, 3958, -4584, -8871, -6474, -4615, -12018, -11956, -6497, -4315, -835, -4931, -5138, -175, 4189, 8066, 9104, 9188, 7620, 2963, 3686, 1916, -5471, -1749, 372, 875, 384, -6253, -4779, -3730, -4863, -5635, -7104, -5218, -6779, -8150, -2975, 5268, 6334, 8856, 8861, 6286, 10305, 7215, 29, -7253, -5669, -1335, -2138, -2480, -4442, -7655, -9100, -11492, -12136, -2217, 8250, 16972, 19037, 13231, 7612, 2375, 159, -1627, -5406, -6674, -8026, -10006, -7384, -6655, -4459, 277, 1055, 225, 4592, 12377, 15347, 12333, 10218, 11273, 9039, 4312, -3648, -8133, -7572, -10622, -15011, -12624, -8432, -4187, 1384, 3106, 1106, 1258, 5969, 8376, 13222, 14886, 13905, 12554, 9083, 2007, -9105, -10356, -7427, -7199, -8903, -10152, -8500, -8955, -9092, -5571, -128, 2752, -561, -2680, 3454, 5738, 6257, 11400, 8013, 11347, 16018, 7562, 841, -5498, -7460, -9103, -15398, -17219, -14929, -9733, -1682, 2565, -2335, -552, 3078, 5031, 11036, 8894, 8417, 8022, 3846, -1951, -5523, -5817, -4997, -5750, -7327, -5497, -5508, 2948, 9358, 8666, 7490, 3275, -1567, -4471, -418, 3598, 4670, 1372, -1492, -2324, -5182, -7153, -9107, -7548, -4051, 2321, 5906, 7013, 9226, 10802, 12573, 7518, 716, -4463, -7906, -6208, -2589, -5274, -6847, 864, 1144, -705, 71, -1032, 320, 839, 3312, 2677, 1973, -1282, -3966, -1928, -159, -991, -4364, 2640, 8761, 10323, 9288, 3081, -3049, -3876, -1359, -1681, -3080, -5416, -8592, -4724, 1431, -4225, -8552, -635, 5349, 4968, -912, -7366, -2375, 2598, 5530, 8306, 9455, 10056, 7949, 8814, 7340, -2842, -12089, -9527, -5914, -5384, -4619, -4529, -3675, -2357, -2302, -6135, -5024, -757, -775, 1938, 6550, 5363, 2689, 7384, 13536, 14623, 10173, 1217, -5250, -5423, -3345, -8431, -10988, -8641, -11338, -11623, -11806, -12318, -6799, 6288, 17325, 21768, 21125, 14826, 5750, 593, 780, -5777, -11922, -10232, -7166, -5899, -967, -528, -4827, -3612, -5807, -4897, 1959, 4474, 5147, 5031, 7851, 11408, 8460, 3464, -1697, -2819, -4723, -9058, -14903, -11372, -6744, -6906, 351, 3705, 4562, 6683, 10232, 8810, 9550, 9149, 8308, 7059, 804, -6798, -14512, -8645, -4985, -4474, -4173, -3177, -2090, -4265, -1716, 2500, 5200, 756, -3889, -3480, 6844, 14217, 13258, 15637, 12301, 11651, 7195, -3560, -9900, -14582, -13874, -15320, -15148, -12803, -8823, 1061, 11660, 9914, -164, 3020, 7054, 8161, 7347, 2260, 2127, 7042, 8827, 2673, 1146, -1567, -8873, -12507, -11331, -8783, -8398, -4222, -221, 3620, 5079, 1445, -2261, 2879, 11724, 12319, 9694, 2047, -4365, -7717, -10185, -13356, -12886, -3345, 3562, 10126, 11321, 4879, 4116, 7976, 7343, -1447, -12273, -15411, -11291, -5484, -833, -516, 2032, 8125, 5926, 1284, 1028, -1621, -2204, -2437, -4317, -414, 5507, 6495, 5778, 5558, 3241, -3387, -7147, -3864, -1266, 1458, -1089, -7511, -8594, -2394, 3972, 8444, 7454, 2180, 399, 3807, 3866, -8806, -9916, -3547, -140, 1858, 224, 1080, 5983, 9106, 8925, 6713, 4682, 3672, -4057, -7449, -7608, -10781, -11096, -4219, 1506, 5714, 7478, 8284, 4603, -2745, -3825, -4224, -6464, -9533, -3383, 7987, 16766, 14137, 9187, 7115, 8091, 9347, 2095, -9084, -15328, -12456, -9198, -8951, -6283, -1968, -2235, -1130, -1263, -2149, -121, 9526, 14583, 12264, 7395, 3437, 4815, 5506, 6223, -79, -5156, -5416, -5369, -6508, -5705, -11926, -16969, -14503, -9987, -2564, 5041, 12412, 13848, 20306, 21391, 15020, 3083, -8546, -10716, -13230, -11846, -12791, -13577, -4315, 2426, 5318, 4833, 1356, -1074, -1645, -83, -2130, -1248, 2412, 5468, 5599, 5117, -1345, -3960, 15, -722, -3268, -7139, -8149, -12459, -9204, 395, 7440, 8363, 5591, 787, 6764, 17093, 8956, 3812, 4548, 208, -3558, -5389, -10031, -11759, -7809, -3000, -2365, -2048, -391, 2079, 6495, 8115, -2388, -7743, 322, 8128, 13064, 12080, 12512, 9162, 8669, 5220, -4109, -10314, -16747, -18852, -14769, -10714, -11248, -5672, 5328, 11664, 14902, 11641, 2283, -560, 2891, 3952, 2400, 1585, -973, -2003, -941, 2056, -6318, -10449, -1369, 2068, 7715, 2419, -4658, -70, 5031, 2520, -2041, -3598, -2491, 3441, 8453, 10281, 3311, -2653, -3454, -6464, -4501, -41, -241, -993, 4639, 11041, 7699, 4431, 1943, 245, -4547, -12390, -15836, -13909, -5694, 822, 7950, 4775, 1489, 1329, 1361, 7523, 7178, -2016, -7765, -4113, -272, -1065, -7844, -1046, 5770, 4145, 833, -4115, -2587, -1570, -2279, -3119, -3118, -1085, 709, -2579, 803, 2998, -2657, -3624, 3162, 7104, 3150, -850, -2944, -4185, -3315, -2572, -2815, -299, -1319, 2243, 6753, 8951, 6485, -4639, -3306, 2889, 2494, -4392, -9694, -5713, -958, 2850, 1944, 1049, 3025, 789, -7022, -10196, -5001, 4491, 16989, 20424, 20064, 16517, 7627, 2187, -611, -1338, -7786, -11516, -10958, -10387, -9128, -6665, -6856, -9085, -2743, -590, 9371, 16461, 14529, 11241, 10119, 15117, 6416, -1654, -5059, -5058, -3774, -11570, -17376, -10204, -2891, -3270, -2347, -2879, -6757, -4893, -2261, 1130, 6322, 13981, 15740, 7365, 4883, 2489, -8065, -9253, -1401, -7450, -6329, -1090, -2378, -7416, -5089, 7253, 3917, -2599, -1906, -901, 3235, 7226, 1569, -3892, 559, 6347, 2646, -5733, -5545, -2694, -4553, -3273, -7527, -7907, -1385, 7541, 11999, 6001, -967, -1875, 4694, 3606, 8375, 11254, 4369, 1583, 2821, -4335, -11249, -9606, -12499, -13272, -4066, 4472, -720, 2065, 13290, 12023, 10330, 6540, -2181, 1507, 7748, 10830, 3291, -5129, -2370, -4922, -8664, -10096, -13413, -12885, -3815, 3173, 4401, 160, 4387, 11528, 5393, -806, -774, -4389, -8920, 3898, 12764, 5905, -1512, -1576, -1125, -6528, -1462, 1933, -2382, -637, 5213, 6228, 372, 402, -1468, -8227, -7580, -5336, -9318, -3998, 6943, 7939, 2932, -1036, 2832, 2889, 9240, 16461, 4628, -5782, -1330, 330, -5716, -7041, -4649, -6671, -7729, -1889, -1453, -6933, -5404, -1228, 743, 4958, 6359, 5584, -796, 1765, 4566, -1584, -1423, 1186, 3911, 2101, 2959, 3137, -4782, -5721, -3110, -5834, -8887, -7943, -3997, -764, 11164, 13166, 1657, -1189, 7269, 8906, -64, -5958, -3112, -1889, -5075, 4032, 6657, -1726, -2257, -3501, -7504, -2395, 249, 3779, 11321, 14923, 13029, 4240, 2863, 4618, -2066, -4932, -5548, -10273, -12118, -7000, -1473, -2395, -11100, -10410, -551, 6169, 18070, 17796, 13208, 16746, 20289, 13085, -6580, -14962, -10119, -10506, -12666, -10297, -11731, -12450, -5252, -2971, -4587, -444, 593, 1154, 6517, 13162, 7453, 4269, 12759, 12864, 5505, -370, -2989, -5443, -8241, -6745, -8828, -15047, -15280, -6792, -232, 1038, 3983, 1597, -5578, -725, 11853, 8851, 13, -1086, 7891, 4004, -877, 791, -2250, 1558, 2877, -7, -9003, -7327, -2737, -2541, 1061, 625, -6437, -9333, 4606, 10945, 4692, 3519, 6847, 4776, 758, 809, -7780, -15344, -13200, -8530, -3178, 1478, 4003, 9344, 16503, 15409, 11713, -2465, -12157, -4250, 1220, 2844, -847, -5692, -4826, -602, -948, -9861, -12371, -1518, 6812, 6379, 7812, 5429, 820, 3292, 9898, 6653, -1039, 2321, 7005, 4834, 2171, 669, -8236, -9241, -4949, -3051, -1347, 1326, 1484, 3276, 8540, 10376, 4130, -5981, -3779, -6436, -7156, -8642, -11364, -798, 13051, 20939, 15172, 1485, 3351, 8567, 1541, -482, -3693, -9755, -10892, -7843, -8024, -8478, -10500, -2542, 4088, -2319, -2156, 520, -498, -871, 2563, 6220, 9942, 11304, 9519, 7200, 9071, 4265, -9692, -11712, -4443, -7781, -11394, -11370, -11829, -12184, -7680, -139, -1968, -289, 5877, 14284, 13499, 5746, 1531, -751, -322, 1021, 2954, 305, 99, 3702, 4237, 838, -3105, -6888, -13255, -15925, -12090, -6694, -2666, 8054, 17383, 18355, 19347, 11541, -1142, -5871, -2540, -2662, -7903, -12426, -11357, -7019, -751, 3400, -2884, -3673, 5892, 15724, 13777, 7505, 9262, 6903, 929, -265, -5007, -8663, -7262, -6014, -1272, -5736, -10508, -6571, -3067, 1639, -543, -2129, 3705, 7354, 11589, 23403, 22155, 16682, 9189, -1375, -3170, -15518, -22370, -16558, -10305, -7692, -4720, -6734, -6033, -1181, 8443, 13596, 3476, -631, 1706, 1312, -534, 4414, 1172, 4642, 14609, 11853, 3958, -1114, -4398, -10626, -14853, -14425, -12220, -9261, -4406, 255, 1272, 1142, -546, 3218, 11189, 11873, 13988, 3265, -3611, -5220, -5966, -1361, -2225, -841, -2001, 887, 7019, 3849, -6435, -4325, 398, -1791, -5541, -8387, -8291, -3197, 6246, 8334, 5956, 6913, 5828, -970, -2737, -7373, -14494, -7031, 8556, 13222, 8641, 9843, 11362, 5476, 252, -1467, -10268, -15040, -9728, -5918, -4337, -6284, -5540, -2391, 2303, 10350, 14833, 10267, 6857, 4881, 1506, -3621, -9854, -5941, -4750, -4681, 3063, -356, -4408, 6401, 10720, 5751, 1976, -1805, -6617, -2213, 3508, 2873, -4021, -3909, 2708, -2522, -282, 2504, -4510, -10022, -6323, -3705, -5002, 118, 8302, 13894, 17106, 18415, 13874, 7253, 3725, 1414, -5954, -14333, -18315, -16316, -12213, -5989, 110, -4966, -5435, 5544, 7048, 1986, 622, 831, 640, 6809, 15907, 11013, 3296, 11024, 11558, 859, -4022, -8227, -10610, -12566, -10323, -9760, -13672, -11522, -7689, -8912, -1952, 10925, 13675, 17769, 20479, 16498, 7591, -4202, -7801, -7110, -4434, -808, -4198, -9542, -6773, -194, 58, -5526, -11263, -12271, -7068, 4234, 10559, 5195, 8042, 16040, 14513, 7994, -542, -2387, -3739, -8328, -11548, -13994, -13232, -5552, 3259, 7488, 9185, 2875, -424, 2390, 10428, 13309, 3317, -1928, -3430, -6868, -8226, -8705, -12417, -9075, 1590, 7848, 1850, -4312, -965, 438, 4432, 7419, 3110, -1686, 5798, 15203, 8474, 647, -1947, 1217, 2523, -1622, -5453, -9156, -12054, -10531, -5803, -2069, 1827, 5302, 10605, 8385, 7831, 6793, -8879, -8964, 5184, 9238, 10672, 8566, 5147, 1044, -410, 2993, -6761, -11406, -8244, -7041, -3125, -3573, -8557, -6037, 5415, 7516, 4534, -2904, -1013, 5980, 7001, 6862, 415, 2132, 2527, 308, 1123, -1118, -4846, -1537, 2914, 2607, 6057, 3182, -6256, -9699, -7242, -9923, -15086, -8136, -474, 4197, 11749, 10340, -19, -2813, 4372, 4062, 6789, 6162, 1582, 3616, 5604, 3752, -6264, -9703, -6653, -7602, -12884, -11929, -10729, -7376, 1736, 5154, 6302, 7602, 10583, 9973, 5275, 6851, 5502, -3958, -7687, -4923, -469, -5077, -9753, -5012, -2756, -2793, -5, 2719, -448, 3080, 9869, 9508, 6061, 2309, -825, -1499, 2353, -1972, -12922, -11524, 106, -411, -2083, -665, -1224, -470, -457, 3808, 3164, 7811, 17043, 13549, 8907, 6419, -2031, -10351, -9127, -4172, -8041, -11439, -9915, -3387, 473, -798, -434, -2091, -5190, -4138, 2505, 8996, 14313, 18059, 21343, 18422, 15538, 3174, -9961, -7581, -7740, -10267, -13281, -13109, -9528, -9454, -4488, -3245, -10125, -7637, 2635, 14234, 19386, 16413, 12686, 8493, 4484, 4114, -2704, -7304, -3756, -1419, -5768, -7229, -9788, -14884, -6910, -4836, -2157, -2012, -1349, 2365, 5482, 13274, 13424, 6037, 2817, 4042, -4358, -7912, -9735, -10230, -3831, 4665, 5163, -2543, -496, 4704, 10943, 6232, -1935, -6643, -7043, -63, -2852, -2884, -2899, -2115, 5255, 2857, -1399, -2370, -3523, -5351, -2371, 2854, -1816, -855, 9305, 9721, 4617, 4586, -4567, -7230, 740, 3088, 5813, -585, -2932, -4583, -7274, 67, 612, -6701, -3754, 3258, 4092, 6571, 179, -3546, 3037, 654, -3552, -2836, 3688, 12191, 15019, 14407, 8790, 2168, -6141, -11402, -11933, -8081, -9194, -8817, 3016, 6082, 5331, 3940, -222, -5088, -5492, -2763, -2377, -1857, 1005, 2900, 5185, 8240, 2783, -1642, 7541, 15571, 10954, 3761, -5231, -8725, -7541, -8785, -12407, -11544, -6099, -4498, -6369, -2775, 1229, 1583, 9214, 9153, 5170, 4755, 2481, 4559, 7738, 8041, 5787, 901, -2528, -7000, -8634, -9238, -14903, -17276, -11191, -6308, -2091, 3165, 1641, 7443, 16156, 20129, 12342, 2189, 1213, -2008, -6642, -11073, -14736, -10803, 2847, 6926, 8122, 4677, -4060, -3748, -6220, -2814, 2227, 4527, 7900, 5117, 6260, 4771, -1708, -1585, 1471, 1198, -213, -4408, -7757, -4993, -3779, -3238, -2743, -552, -623, 8879, 20044, 15854, 10401, 5387, 7166, 416, -9577, -11018, -11069, -6732, -6670, -4143, -3003, -3523, -1990, -3024, -4540, -4720, -5124, -3278, 6125, 16177, 20513, 17289, 13434, 12209, 8628, -1506, -10251, -11940, -14434, -16466, -16552, -14670, -14678, -11382, -1366, 7983, 11297, 4729, 3201, 8407, 11993, 9778, 214, -3956, -2481, -991, 2107, 2980, 29, -4019, -2771, -2786, -7647, -8534, -5311, -3541, -2206, 1814, -2867, -3554, 4581, 9951, 10544, 9674, 544, -3600, 941, -4807, -5467, -8334, -7306, -996, 4043, 11638, 10001, 4812, 2871, -726, -3471, -9872, -16792, -11769, -1545, 2251, 4203, 8467, 4361, 2211, 5308, 2209, -5254, -5352, -659, -1252, -4209, -2235, 588, 3386, 12247, 12466, 3387, 2731, 3921, 412, 1980, -2627, -9516, -9341, -8391, -3516, 873, 4672, 5094, 4046, 7480, 6190, 1429, -3674, -7430, -9920, -7037, 110, 4311, 9011, 11365, 11554, 8085, -511, -12853, -10030, -349, -1958, -4390, -6157, -3499, -2255, 1805, 3508, 885, 721, -2216, -6943, -5080, -3103, -9735, -3008, 8301, 12353, 14807, 16166, 13237, 6797, 2531, -2946, -9254, -12875, -14720, -16947, -13114, -8858, -8947, -3732, 4837, 9495, 10987, 6191, 5462, 8908, 8427, 2625, -4673, -1114, 2438, 2551, 2276, 611, -6049, -8454, -2510, -3181, -5828, -9820, -13216, -10924, -4000, 2572, 5741, 14759, 17553, 13282, 7365, 1338, -2693, -9306, -6637, -4711, -5850, -4418, -2117, 1714, 6601, 5709, -2516, -2789, -4719, -2360, 697, -1002, -1034, -500, 7029, 8706, 10417, 3060, 511, 1842, -1090, -162, -9228, -8556, -7856, -7962, -2984, 4119, 2666, 6312, 19646, 17462, 15368, 12102, 3149, -3828, -8681, -11472, -11227, -10140, -7768, -3359, -983, -3094, -4434, -2702, 5992, 7124, 4410, -537, -5044, 4064, 11665, 11192, 8145, 7398, 3746, 354, -6000, -7731, -12090, -16875, -13519, -8871, -5339, -1619, 4712, 7378, 6591, 5138, 5073, 4100, 5015, 2796, -1298, -6634, -5557, -392, 3217, 5046, 5770, 417, -5170, -4035, -2081, -15, -6710, -9573, -2872, -603, -2467, -2033, -3944, 2586, 10961, 12490, 7661, 5573, 1862, -6438, -9589, -8077, -2746, -1016, 4649, 5055, 4709, 3498, 924, -2314, -3346, -3719, -8889, -7398, -3044, 1938, 4054, 4648, 3791, -718, -1780, -9, 4365, 5721, -1571, -6663, -2947, 5447, 5062, 4156, 3772, 2674, 346, -1202, -787, -2042, 167, -2013, -3937, -6666, -6420, -3215, 5234, 9765, 6437, 4716, 2081, 2624, 2834, 1374, -6108, -10242, -7029, -5537, -2120, 4505, 4967, 2561, 6634, 9370, 6198, 624, -1763, -1867, -1788, -1838, -7349, -7190, -5373, -6033, -71, 420, -2647, -3382, 1942, 1237, -306, 3303, 6183, 15123, 14687, 10680, 1798, -179, 3420, -3902, -8918, -10885, -16081, -16156, -5160, -3584, -2945, -3992, -7780, -2991, 7251, 12776, 10102, 12034, 9179, 3567, 586, 31, -3717, -4664, 1403, 406, -329, -5084, -9664, -5608, -822, -2610, -9187, -9868, -7053, -316, 6899, 9196, 7117, 7824, 13079, 7052, 1083, -1388, -6597, -7971, -2548, -1636, -6926, -2711, 308, -1405, -1582, -2342, -6748, -1756, 5759, 10290, 13731, 6347, -630, -3898, -1611, -764, -2549, -4210, -3336, -1914, -270, -4846, -12793, -5244, 4262, 10165, 11699, 4465, 2144, 9351, 11328, 8977, 2135, -5357, -4482, -4674, -5005, -7519, -14725, -14677, -7637, -1677, 4599, 7419, 6291, 7225, 4585, 3392, 2295, -1197, 2661, 7686, 10629, 7030, -1514, -8035, -6710, 1226, -1153, -8063, -8710, -6348, -2332, 1156, 2223, -2287, -2003, 3111, 2085, -1842, -4322, -3450, 3014, 14147, 11464, 2323, -1802, -2409, -1745, -3667, -3632, -1300, 1048, -2092, -951, 2201, -4034, -9358, -8048, -5154, -976, 2721, 6184, 8176, 8078, 6709, -1843, -7253, -1387, 2292, 6118, 8750, 828, -1307, 4964, 6540, 1370, -6948, -7510, -5811, -5865, 92, -232, -1367, 933, -1190, -2877, -963, -229, 3236, 7398, 6884, 5631, 2950, 3126, 345, 1943, 1208, -3561, -4174, -7360, -8268, -6281, 463, -4166, -7494, 3337, 8820, 14078, 8814, -1998, -717, 3926, 6840, 623, -7450, -6457, -5100, -5750, -1789, -4946, -7323, -251, 3575, 7637, 6442, 7845, 6833, 5629, 3783, -2906, -1750, -2371, -4159, -7717, -9647, -12205, -9720, -919, 1381, -767, -2216, -5626, -7189, 7090, 21506, 18464, 13221, 11739, 8250, 3799, -3123, -13285, -14139, -7584, -5419, -2994, -7731, -7216, -4040, -4108, -5540, -8916, -4050, 7362, 9511, 8624, 9649, -1422, 4779, 15381, 10831, 7180, 3128, -2651, -1762, -3195, -7588, -11199, -12627, -10589, -8852, -6124, -1527, -1097, -23, 9085, 10980, 17583, 12000, 2380, -3370, -4400, -2844, -4530, -1878, -2473, 814, -1090, -4739, -10006, -4791, 579, 2272, 772, -2742, -1487, 2058, 8962, 9273, 5007, 302, -2395, -5055, -4940, -8168, -13783, -12690, -5683, -4378, 3430, 10101, 10801, 13505, 8534, 4442, 3324, 666, -3326, -3289, -6708, -5518, -8800, -9773, -706, 1702, 2089, -3519, -2083, 3477, 4856, 4761, 1372, -2834, -3759, 2347, 3008, 3688, 5763, 8839, 14021, 11689, 8316, -4026, -11396, -9642, -8672, -6182, -3844, 1876, 2216, 2006, -1157, 120, -2172, -8081, -3012, -2648, -156, -437, 2800, 10639, 12059, 11041, 9291, 1025, -1758, 2808, -3452, -3375, -9325, -14413, -6181, -1107, 1609, -1095, -899, 758, 3247, 4355, 1513, 2901, 1293, -3095, -7879, -5378, 3333, 8315, 14841, 15835, 12708, 6017, -1403, -6929, -9237, -8830, -13791, -14097, -12324, -10604, -5432, -804, 614, 3707, 7918, 10285, 12667, 5860, -716, -494, -1363, 1152, -1379, -5389, -13, 4186, 752, -2821, -9695, -13314, -7520, -7958, -4707, 979, 5814, 11547, 12114, 9888, 8144, 3908, -1801, -2353, -9281, -13055, -14426, -15096, -6748, -1564, 3877, 7170, 6036, 6351, 12416, 16631, 13685, 7664, 486, -4592, -10123, -8955, -10007, -9235, -1018, 4113, 1873, -3167, -830, -2556, -4782, -2898, -3963, -4323, 2128, 9877, 15679, 20056, 16058, 10390, 8649, -1151, -4223, -4894, -11831, -16716, -16477, -10301, -9560, -6169, -3701, 895, 1890, 4308, 1318, -2112, 8652, 12125, 8370, 4583, 5660, 3069, 6416, 12336, 7159, -2908, -8840, -10955, -14747, -16326, -18689, -13684, -1864, 1124, 3322, 4948, 9563, 12887, 13920, 11782, 2010, -738, -6386, -14003, -12034, -3741, -7875, -5055, 4497, 5975, 8762, 8283, 6205, 870, -2226, -6754, -10135, -7143, -3125, -10, 4018, 3405, -2823, -2166, 4950, 5649, -189, -6419, -6658, -2870, 5928, 9469, 5963, 12687, 10946, 4327, 336, -3285, -8196, -7630, -3532, -5423, -2195, -5101, -4852, 880, 3284, 7429, 7122, 5711, 5053, -559, -2767, -6938, -15011, -8334, -2042, 1999, 13260, 12550, 9839, 12227, 9083, 2365, -11470, -14457, -9131, -8081, -7412, -7520, -9583, -3786, 6725, 7058, 6822, 3424, 632, -4176, -4952, -3728, -2647, 4104, 6002, 9203, 10041, 8744, 5344, 5371, 3999, -1958, -5756, -13333, -13291, -9041, -3847, -2625, -5317, -4901, -2307, 7009, 11669, 7464, -4164, -4914, 5130, 11041, 10644, 4999, 4407, 8991, 7742, 851, -7328, -11100, -8223, -10493, -13729, -15421, -15266, -9680, -3115, 1766, 11250, 14222, 18937, 20436, 14024, 6017, -5057, -10524, -13782, -10890, -8530, -7378, -7420, 611, 6646, 7080, 2967, -6141, -7036, -3833, 2439, 8024, 4764, 1378, 5346, 5503, 2769, -583, -5249, -4112, 1516, 651, -4547, -10608, -2042, 5945, 5919, 5542, 3525, 9062, 11586, 13364, 11336, 4665, -5407, -8673, -4464, -5611, -7298, -8723, -7590, -5283, -1003, 5141, 4881, 846, -978, -3848, -7024, -5973, -3894, 7325, 20540, 23229, 16308, 4067, -475, -2863, -1974, -7931, -19558, -18090, -12326, -12340, -10833, -8030, -4192, 6434, 12813, 11945, 7488, 7377, 7423, 2541, 2323, 3706, 860, 433, -204, -3591, -3988, -7454, -13653, -9100, -3370, 1, 3958, -1754, -4922, -2783, 962, 2290, 2770, 6186, 9146, 8476, 6411, -2646, -15378, -7669, 1703, -906, 2045, 4510, 5461, 7662, 7548, 8048, -442, -3273, -5870, -12237, -11189, -11567, -9031, 1347, 11232, 11596, 9067, 744, -1304, 244, 4562, 1579, -2688, 1389, -356, 2980, 6751, 473, -12040, -7232, 915, 4583, 2564, -1626, 3364, 3358, 2026, -5436, -8686, -2982, 1358, 6262, 6856, 2208, -3404, 2555, 4973, -8, -1828, -7225, -4209, 1110, 6055, 7624, 3876, 4707, 4089, -1516, -4619, -6355, -8949, -4265, -1946, 510, 3690, -3610, -4078, 2300, 5263, 335, -4470, -5166, -1577, 3677, 1487, 4031, 1283, 13082, 17255, 7277, 4329, -4426, -2400, -4296, -6189, -10556, -14885, -13666, -10521, -7833, -5456, -4755, -5626, 2789, 9209, 14999, 15418, 13452, 12483, 7735, 3246, 621, -1705, -6399, -9827, -7393, -7922, -11377, -14128, -8197, -2833, -3482, -4904, -10996, -739, 12823, 20366, 20879, 13833, 6825, 4134, -580, -8007, -9609, -10150, -5541, 1261, 4187, 480, -3990, -3734, -1542, -2066, -1428, -3714, -60, 5650, 7958, 7454, 3084, -2099, -5568, -1013, 4758, 3889, -3135, 152, -2537, 413, 4077, -5707, -4456, 1074, 4623, 3993, -59, -2405, 5944, 16074, 10250, 1037, -8200, -10429, -4435, -2019, -2024, -6950, -2837, 874, -881, -2231, -1604, -5161, 4038, 13320, 5247, 6103, 5126, 8080, 8693, 5365, -242, -7455, -10528, -10453, -8366, -7168, -9558, -11364, -4433, 5226, 11269, 8824, 3412, 2897, 6682, 6244, -291, -3111, 6916, 7344, 4200, 1061, -9193, -10556, -4021, -1325, -1436, -2482, -3703, -1903, -1663, 2703, 1069, -45, -2822, -5906, -2122, 5273, 2041, 1321, 7137, 3840, 5027, 1251, -5039, -3371, 3676, 6424, 8874, -457, -3574, -4044, -6362, -5142, -14780, -16097, -7588, 2571, 7043, 4541, 2284, 6182, 5472, 5841, -823, -3940, 2334, 4044, 2903, 3173, -2341, -5818, -443, 1728, 4225, -994, -6664, -11148, -4080, 1741, 650, -1333, -144, 214, 965, 4307, -670, -330, 5488, 12104, 9341, 288, -11103, -6690, 5466, 3620, -3731, -3654, 25, 2448, 4501, 901, -7009, -5459, 2952, 5300, 5637, 2831, 1412, -1402, 1382, 496, -4250, -2417, -2063, -5687, -3467, -3083, -7901, -3864, 4657, 15697, 22100, 16351, 5753, 5565, 1232, -3793, -7343, -12852, -13575, -10859, -8102, -8789, -10886, -7054, -655, 1574, 7724, 3043, 1890, 9265, 11376, 8695, 6107, 4027, 4120, 5486, 813, -3990, -9750, -11583, -9161, -7928, -9255, -9256, -4910, -2356, -1750, 3370, 5241, 9150, 9036, 10188, 11715, 1781, -6058, -11134, -5536, 3398, 6280, 650, -2492, -352, -1640, -1732, -4422, -7753, -5303, -4187, -2611, -3089, -4548, 4043, 9904, 13626, 11684, 1877, -825, 0, -2512, -4415, -7863, -10215, -5704, -2709, -1363, 7008, 7501, 6395, 6768, 5461, 7088, -1971, -4791, -4514, -2379, 913, -1223, -2541, -1068, 1108, -70, -2999, -8259, -4805, 4544, 9187, 4201, -970, 3250, 6400, 8301, 8754, 2632, 1543, 1857, -3523, -9204, -13588, -13805, -5966, -1550, 386, 3753, 4285, 7047, 7377, 7640, 6593, 2125, -2145, -6000, -10303, -3479, 1838, 1042, 5128, 10713, 11662, 5194, -3579, -7008, -3595, -2614, -4328, -9509, -6414, -2523, 1706, 3054, -423, -2346, 614, 6721, 7178, 6507, -2187, -6638, -2851, 1807, 4736, 4238, 10050, 11863, 3161, -31, -6433, -14071, -12790, -9309, -5689, -2860, -3665, -4389, -1298, 5978, 11206, 6079, 2220, 2682, 3904, 192, -4789, -9629, -6978, 3908, 6264, 6257, 1500, -2892, 4527, 4333, -5143, -11720, -13567, -10675, -7110, -5212, -2816, 1682, 10077, 19161, 15390, 10271, 3216, -2241, -6428, -10047, -10278, -11530, -2543, -279, 3509, 8895, 3199, -3940, -3535, -938, 4224, 5833, -2689, -3064, -1002, 4287, 3422, -1704, -2058, 637, 2805, 1045, -3166, -7287, -3363, -2565, 382, 828, -385, 7767, 16209, 17928, 12575, 9326, 5238, -3166, -9939, -14505, -16197, -15937, -11401, -5082, 1717, 8293, 6959, 5810, 7964, 5615, -1519, -698, -4279, -5426, 3458, 5064, 5579, 3165, 3870, 7100, 7611, 1347, -9009, -10129, -10992, -12702, -7821, -4805, -804, 3890, 5697, 6622, 5343, 7364, 9877, 8494, 5451, -1041, -6227, -6686, -4087, -215, -192, 1623, 874, -1382, -3153, -919, -435, -6993, -9695, -6958, -804, -124, -1271, 4250, 11336, 13609, 15923, 6439, -3808, -4686, -7133, -11223, -15143, -10759, -3751, 7044, 17299, 15348, 7049, 5004, 3340, -3538, -9274, -13404, -9085, -3379, -4533, -2747, -2978, -2041, 3921, 6912, 8541, 6957, -747, -686, -300, -2706, 1398, -1609, -3043, -244, 3644, 3728, 3485, 3648, 2207, 2416, -2875, -9595, -13716, -7902, -637, 2048, 4793, 3457, 7809, 12132, 7176, 91, -6502, -11325, -11680, -2615, 911, 3041, 6582, 9838, 9250, 5137, 3682, 2704, 2724, -4122, -11219, -14085, -9564, -9000, -3634, 4162, 7512, 10294, 4959, 1989, 585, 1886, 2736, -6510, -7047, -575, -726, 1457, 3125, 673, 1828, 8382, 4580, -1481, -8407, -8589, -6423, -8126, -7213, -9064, -6328, -833, 4798, 6543, 10338, 7355, 8138, 8928, -993, -4312, -4465, -5333, -4219, 843, 1753, 4120, 8747, 3662, -3913, -5964, -9477, -17159, -12354, -354, 8426, 13815, 10083, 8765, 6650, 8010, 6840, -104, -4376, -6571, -8596, -10570, -7002, -4398, 1875, 4088, 3862, 1824, 2009, 5439, 8602, 7628, -1444, -358, -160, -5212, -7332, -3001, -2050, -2251, 4554, 6475, 6783, 3351, -4005, -9879, -6569, -3573, -1998, 3846, 8132, 13558, 12875, 8420, -1770, -7859, -8405, -6942, -1583, -7151, -11089, -6512, -1093, 2370, 955, 2146, 6912, 5121, 705, -5744, -7901, -1007, 4970, 5952, 5127, 6318, 2863, 1578, 1531, -2577, -3944, -7248, -7320, -6060, -9774, -6841, -4071, -3013, -508, 1943, 10716, 15017, 8269, 5149, 4740, -1012, 590, -4078, -7061, -1980, -1994, -1665, -6560, -6109, -216, 6186, 3776, -1389, -2687, -5696, -4801, -3632, 307, 6408, 10737, 8546, 5019, 368, -5066, -7575, -7819, -3461, 1006, 3883, 2956, 4403, 6312, 6170, 3832, -1565, -3033, -3283, -2218, -2418, -3832, -3248, -2846, 390, 4218, 3138, -1401, 4968, 10355, 7430, 4603, -4298, -3902, -10, -2122, -6828, -5663, -4753, 657, 5385, 6611, 12133, 1704, -1130, -3660, -6431, -2261, -751, 299, 1360, 1421, -1049, 3211, -1567, -6605, -1687, -2075, -77, -1845, -2355, 2833, 7138, 8524, 2080, -1034, 265, 4279, -3663, -3192, -4802, -8624, -916, -159, -1846, -6529, -2210, 443, 871, -206, -1075, -974, 1911, -1203, -2825, 1356, -1536, 4377, 7797, 7110, 5815, 2462, 113, -1981, -1185, -7545, -11755, -6765, -5615, -4097, -5257, -7367, -6766, 5059, 13614, 13635, 10439, 2147, 2106, 4158, 7329, 3694, -1118, -1246, 1152, -1916, -8451, -9821, -10745, -6655, -5708, -4054, -1773, 346, 9205, 13281, 12990, 9070, 7376, 6344, -1455, -847, -1993, -7298, -8452, -2047, -705, -2645, 98, -4333, -517, 3780, 4156, 1883, 3833, 1615, 1177, 4885, 170, 1281, -5720, -4368, 3920, 7893, 3092, -3784, -3443, -3900, -5523, -8699, -2485, 1618, 3890, 5088, -1087, 1080, 6253, 5417, 2034, 988, 1257, -6548, -5282, 2035, 4959, -636, -4538, -4035, -6346, -3420, -2324, -2661, -4015, -3518, -1844, 6835, 10421, 4271, 7509, 10932, 7882, 7877, -4986, -8704, -2996, -7307, -11797, -14585, -10910, -5413, 1487, 1527, 4122, 2843, 4399, 5191, 3358, 1318, -1580, -1388, 53, 5637, -1003, -2159, -1279, -1331, 3157, 1365, 2417, -2919, -9077, -4220, -1917, 3099, -614, -745, 901, 1868, 4546, -1107, 1866, 2850, 2172, -2078, -4610, -3386, 9079, 13004, 7121, 5626, -549, 3300, 1297, -2760, -6125, -11813, -11518, -8305, -2018, 2487, 5958, 7265, 7748, 8491, 4105, 4755, 6390, 2432, -4366, -6609, -7181, -6638, -6144, -3778, 4392, 5826, 9179, 447, -1135, 2869, -1953, -3078, -5618, -794, 4232, 4362, 733, 1583, -427, -1025, 1582, -1563, -4562, -9920, -6789, -4724, -3508, 5134, 814, 1770, 7825, 4200, 4405, 6150, 1866, -3700, -4831, -3018, 3439, -1910, -5621, -1772, -458, -112, -2333, -2519, -3538, -2614, -4862, -9925, -12436, -745, 12638, 16142, 14409, 13311, 15705, 12805, 10147, 562, -11206, -14763, -15845, -17140, -16090, -11198, -7294, -2505, -336, 2450, 7811, 7378, 6676, 6237, 7781, 6403, 862, 1430, 2692, -114, 3297, 1031, -8225, -6127, -7260, -6645, -3955, -8416, -8569, -2583, 664, 2283, 4489, 8796, 14131, 16056, 10316, -109, -7258, -8905, -3803, -5908, -3854, -85, -553, 1816, 2518, 6001, 9967, 5505, -796, -6838, -8363, -3950, -5631, -578, 4617, 8350, 11873, 7270, 616, 2899, 2333, -5666, -11712, -11592, -10438, -10732, -337, 1444, 1539, 7201, 8785, 11231, 13566, 3845, 590, 2721, -4099, -7946, -9575, -2635, -584, -5475, -7006, -5278, -4906, -2513, 1854, 2250, 3475, 566, -5628, -3825, 3204, 9227, 9585, 14565, 17849, 7907, 1936, -8095, -13711, -14625, -14625, -9802, -2336, 986, -1533, 5975, 7208, 6165, 3461, -3930, -5848, -3434, -3181, -5989, -3067, 4315, 8047, 7125, 12349, 10937, 6333, 4313, 525, -6035, -11032, -11506, -10337, -9610, -10049, -5545, -6687, -4320, 5903, 12232, 12560, 9750, 2673, -1076, -4317, -3054, 2790, 3750, 2325, 3106, 5404, -916, -4693, -6303, -6679, -8427, -8309, -9993, -6286, 319, 4201, 8992, 9315, 12491, 13362, 7508, 2787, -1868, -10902, -9773, -9840, -7675, -1753, -701, 3639, 9082, 8171, 4256, 297, -1309, -3148, -9475, -8059, -234, 1378, 88, 3199, 5479, 11334, 6912, -3493, -3015, -125, -4980, -6991, -10047, -10104, -2291, -3377, -2937, 1951, 11712, 17601, 20186, 18045, 7182, -1430, -6429, -8108, -9781, -11950, -10761, -5836, -1989, -2993, -2607, -776, -3112, -5022, -4997, -3564, 3087, 10354, 14626, 18275, 20347, 14587, 6328, 3357, -2825, -11382, -16006, -19719, -17405, -8902, -7352, -6161, -5433, 2279, 7057, 6112, 10176, 8104, 7142, 10613, 2646, -7541, -6102, -6872, 367, 5864, 4287, 2333, 1506, -198, -3038, -8840, -11740, -7390, -6016, -3334, -5775, -3936, 5882, 8238, 12130, 16791, 9282, 8349, 1798, -8321, -8110, -6162, -6158, -4752, -1052, 928, 4555, 6974, 5688, -3083, -5747, -5912, -5094, -2145, -853, 1276, 5568, 7775, 4313, -484, 2748, 5003, -3606, -9605, -9315, -9346, -7373, 518, 1982, 6484, 8185, 6507, 5773, 9257, 8706, 2634, 3541, -2053, -4689, -9485, -11342, -12760, -10163, -913, 4833, 14765, 9447, 2447, 3884, 2712, -4065, -13050, -7504, -286, 4189, 7236, 9048, 9504, 11316, 7932, -5648, -5163, -6097, -6814, -4636, -4982, -4154, -5211, -1903, -2974, -2437, -399, 666, -4833, -3801, 3518, 1544, 9258, 8644, 3268, 7235, 7784, 10697, 6041, 2232, -909, -4719, -7407, -16187, -18375, -14078, -7856, -7115, -893, 2381, 7635, 13356, 11458, 8541, 5059, 5898, 1024, -231, -3218, -2893, -3227, 1024, 5727, -507, 1017, -2959, -5673, -5933, -8764, -7683, -8798, -4536, -4645, 1530, 13222, 12247, 9715, 6117, 5609, 4614, 3595, -5336, -5986, -3758, -5071, -2534, -1223, 6041, 1211, -3099, -2532, -4326, -6608, -1788, 5342, 9083, 10400, 2883, -2604, 1380, 3158, 1132, -1541, -4366, -2592, -6458, -10893, -8572, -8232, -8596, -1786, 4668, 15984, 17313, 13718, 16241, 11081, 4663, -4521, -12410, -14001, -9897, -12711, -11422, -8819, -5773, 93, 1338, 2189, 374, -433, 1742, 5541, 3654, 4332, 9437, 15618, 16365, 6617, -3496, -7413, -7803, -2664, -5562, -10541, -9313, -9778, -10743, -9874, -234, 876, 5114, 7481, 3646, 5173, 7003, 3127, 1558, 5959, 6231, 4843, 1713, 4111, 3077, 701, -2596, -8901, -10286, -9206, -8661, -5359, -4834, -6498, -2975, 3565, 7370, 13029, 13996, 13163, 11720, 3611, -284, -7901, -3886, -1355, -4112, -4226, -585, 1115, 264, 4358, 252, 726, 889, -5623, -5370, 629, 1793, 2285, 3611, 4133, 1437, -2694, -4718, -3890, -3457, 2595, 1518, 1433, 3566, -124, 4503, 3808, 4331, 2184, 1078, -1224, -300, -2078, -4950, -3804, -6651, -6341, -5994, 1162, 6210, 7010, 5794, 4320, -437, -4679, -4951, -11080, -10837, -496, 26, 29, 5880, 10728, 11396, 9022, 3628, -4482, -5195, -4097, -1423, -4208, -6882, -6896, -6715, -5924, -6490, -7920, -3357, 1358, -1223, 3841, -627, -1864, 5426, 7223, 10544, 10193, 11664, 8993, 3450, 479, -5275, -10656, -14411, -12125, -9801, -6549, -1507, -1896, -129, 1135, 1306, 4368, 3570, 1362, 5942, 5670, 2963, 2618, 4923, 12409, 11192, 7734, 4477, -1798, -3429, -8389, -10983, -9875, -9774, -7254, -7263, -3833, -2458, 3087, 11412, 17134, 19300, 14456, 6958, -288, -1180, -4272, -3212, -100, -207, -3928, -2946, 310, 327, -4647, -12689, -7940, -1724, 4243, 2644, 1609, 8077, 9623, 8168, 1526, 532, 2296, -2198, -7207, -11522, -12531, -13437, -8751, -1346, 5616, 7874, 10059, 15437, 11487, 9409, 1924, -1301, -4871, -9535, -11724, -11447, -3586, -6253, -1324, -493, 1544, 1707, -7084, -5031, -1409, 3015, -1125, -2684, 1896, 5226, 6545, 9825, 10798, 8013, 9766, 1694, -4448, -6434, -11147, -12702, -11684, -8697, -9150, -5992, 664, 5416, 7164, 4131, 1500, -3590, -1634, -1273, 1422, 11039, 10454, 10164, 12092, 12398, 7648, 2130, -10936, -14134, -11001, -13091, -13233, -9927, -72, 680, 8049, 7819, 6238, 8438, 6072, 8841, 1415, -580, -3235, -6848, -4046, -2285, -1529, 2013, 13119, 14003, 9573, 1280, -5153, -4680, -8899, -11577, -9520, -4791, -3159, 298, 4358, 10015, 7732, 479, 916, 1538, 5169, 2202, -3625, -4376, -1688, 2518, 4590, 7682, 9107, 3720, -2416, -5686, -12253, -13618, -11169, -6474, -273, 2817, 5909, 9598, 16879, 11153, 886, -1062, -5915, -8658, -10453, -12538, -11789, -5046, 2669, 7597, 13223, 13066, 9713, 3367, 364, 434, -3024, -4529, -8947, -9988, -8060, -4946, -7741, -6555, 852, 2089, 6615, 3092, -2599, -5079, -3160, -5575, -9273, 786, 9123, 16102, 21867, 17069, 7008, 261, -5687, -11380, -13537, -14290, -14385, -10292, -7500, -1023, 4789, 4428, 2462, -1031, -2769, -804, 1085, 1856, 3668, 4038, 12054, 14353, 11615, 12068, 11333, 5160, -4307, -8820, -14576, -15968, -13610, -13222, -11362, -8368, -1963, 6450, 14468, 16982, 15108, 17176, 11381, 4522, -2316, -7831, -9684, -9967, -6539, -3768, 1690, 2222, 2346, 4994, 4771, 535, -3623, -6628, -7833, -3490, -2029, 3264, 11366, 9541, 10127, 4827, -3086, -5641, -7732, -8276, -8315, -7418, -5673, 601, 8307, 15080, 12315, 11200, 7156, -57, -4521, -8763, -8179, -10353, -6942, -4349, -1855, 3720, 1727, 2397, 1083, -103, 306, -1428, 1340, -1304, -6576, -7263, -4084, -3327, 4087, 9532, 14129, 20812, 13058, 3218, -5062, -9755, -13276, -14487, -13922, -11190, -4987, -2201, 2312, 3458, 5774, 7011, 3958, 2668, -2952, -3807, -4189, 2247, 6963, 7697, 8279, 6803, 6741, -2302, -7144, -10262, -9069, -9380, -8213, -2643, 604, 974, 269, 3887, 3791, 4371, 3330, 4108, 4112, 2734, -3232, -10499, -1887, 3298, 5220, 10153, 11632, 10968, 4270, 1265, -2740, -8558, -11422, -16041, -14447, -8719, -9006, -6920, 4902, 10559, 15486, 17716, 11213, 8791, 2741, -1944, -6756, -7148, -1721, -3438, -4510, 3015, 6494, -2054, -1979, -2010, -2999, -4249, -7886, -3585, 3862, 8205, 3537, 6491, 7592, 3041, 3496, 2293, -2038, -9607, -7959, -7006, -4171, 1610, -304, 1140, 5606, 6565, 1298, 5093, 6643, 2412, 673, -6011, -9067, -8621, -5861, -3103, -1552, -639, 1866, 1908, 4648, 5459, -2736, -3326, -3705, -10079, -8945, -1974, 4090, 11487, 16090, 13995, 12639, 12267, 249, -8486, -8221, -12207, -12289, -9380, -6996, -4700, -4129, -2811, -2430, -1870, 2421, 5180, 10437, 12104, 7709, 8562, 6633, 6464, 4950, 251, -491, -1859, -2827, -9419, -12433, -11140, -11617, -8335, -6269, -338, 1145, -918, 3926, 10077, 14058, 14627, 9839, 2367, 749, -6546, -10789, -7261, -5463, 2176, 4056, 2752, 1452, 1515, 3370, 241, -3237, -8732, -6958, -3770, -2351, -1320, -447, 2163, 3427, 6627, 4279, 4502, 4761, 2614, -4390, -9513, -4693, 177, 4516, 1891, 592, 3865, 600, -5679, -4805, -1127, 2483, 3063, 2129, 3854, -785, -1523, 208, -2699, -1268, 1685, 4125, 1719, 1037, -2599, -5775, -912, 274, 3385, 3914, 3651, 7718, 9612, 5116, 1749, -1181, -8041, -11286, -8762, -4765, -6992, -4991, -147, 3896, 6736, 3024, 3590, 546, 886, -248, -9458, -2403, 5099, 8400, 8127, 1966, -993, -926, 46, 2464, 3057, -1472, -6153, -5536, -1900, -6664, -8522, -7289, -6173, -2972, -648, 2801, 4217, 7284, 4846, 2219, 6450, 7247, 6899, 6354, 5067, 3704, -2437, -6133, -7630, -9521, -8574, -9360, -10315, -6982, -1109, 512, 1728, 3297, 7360, 12961, 14461, 12448, 6149, 3089, -2860, -6661, -3035, -4703, -7178, -6279, -2250, 356, -1200, -3476, -2579, -943, -4399, -2865, -1194, 2057, 7807, 5199, 2745, 2381, 972, -1407, 655, 2173, 932, -4944, -6531, -572, 2833, 625, -3722, -682, 213, -76, 2638, 6100, 4880, 4443, 2931, 2543, 1786, -995, -4054, -6194, -564, -1273, -2971, -1974, -465, -2277, -4972, -5525, -1345, 2330, 5490, 8492, 10754, 11000, 6475, 1208, -1302, 513, -4193, -5766, -7722, -8528, -5826, -5035, -9704, -6909, -2658, 1894, 8899, 9333, 6367, 1411, 3360, 4970, 8721, 2773, 771, 5, -2216, -638, -2289, -4874, -7100, -4952, -4976, -6398, -3830, 721, -661, -441, -1167, -249, 1655, 7089, 8539, 6366, 1735, -83, 2435, 4028, 5744, 3286, 1618, -6129, -5271, -3300, -2458, 406, -2834, -3334, -2368, -3127, -5214, -4844, 992, 3148, 6906, 8369, 6476, 3575, -895, 845, -496, -1303, -337, 1026, 1655, 1010, -6390, -5881, -1567, -998, -26, -978, 3825, 2865, -69, -300, -361, -692, -1293, -2559, 1875, 4990, 916, -2123, -2696, -1847, -2398, -2858, -1256, 687, 639, -2944, -1902, 3338, 750, 161, 2791, 4916, -383, -4488, -331, 1761, 2074, -5550, -6672, -2984, -4903, -5196, -5525, -2471, 1653, 3010, 1399, 4135, 9612, 5509, 1720, 2180, 4898, 7862, 4197, 1781, 1257, -3065, -7982, -9322, -7324, -5208, -4483, 762, 1788, -1281, 330, 888, 4410, 6153, 7340, 6512, 5238, 6748, 3520, -222, -908, -2768, -5565, -5035, -5080, -3679, -4327, -4968, -4146, -1902, 2213, 2737, 873, 2846, 4175, 3922, 5519, 2244, 2257, 3008, 425, -1517, -50, -1859, -1702, -559, -2024, -3747, -5005, -1650, -862, 558, 1541, 2172, 1759, 4709, 4777, 2682, 2375, 768, 545, 786, -90, -2250, -4019, -5583, -2761, 1018, 852, -416, 567, 4001, 4385, 433, 4100, 2125, 755, -759, -4128, -5129, -4829, 880, -713, -1908, -3408, -3915, -4848, -3133, -3035, -2350, -1093, 256, 6342, 5736, 1838, -2270, -1759, 935, -353, 394, -489, -1587, -1043, -2804, -2653, -4839, -1758, -769, 175, 2531, 276, 119, 35, -1705, -3311, -1420, 2262, 5671, 5925, 7208, 2624, 919, 3689, 2135, 2294, -816, -2448, -3324, -7141, -4746, -761, 172, 1101, 2568, 3685, 2862, -322, 214, 2847, 1148, 2175, 3792, 3985, 3578, 2606, -784, -3012, -2010, -369, 984, -449, -994, -2053, -6019, -3850, -140, 4256, 5590, 2523, 3995, 777, 630, 593, 386, -536, -597, 850, 549, -1046, -6046, -5377, -4585, -488, 1208, 873, -163, -1493, 13, -3376, -2736, 585, 4352, 6370, 1519, 770, -923, -3126, -1599, -5340, -8797, -5311, -2958, -3045, 1082, -104, -1708, 458, 1059, 4224, 6713, 4798, 1045, -1237, -1287, -2924, -3014, 0, -1591, -5531, -6491, -6869, -5158, -1525, -711, -833, 2694, 4733, 1268, 2772, 4833, 3877, 1452, 2316, 3467, 2507, 1276, -2187, -4000, -4989, -3657, -4231, -23, 63, -1329, 1819, 1691, 1568, 2646, 4090, 624, 3563, 5084, 1098, 3076, 2994, 208, -2139, 406, 3294, 1129, -2464, -3317, -590, -1585, -553, -1008, 2786, 4620, -250, 162, 578, 3070, 3741, 3789, 649, 84, -387, -1321, 490, -876, -1627, -2659, -1878, -1788, -1875, -907, 2012, 1515, -391, -1036, -545, 3667, 1066, -1467, -1166, -470, 863, -1589, -1043, -2114, -1530, -1583, -2764, -1276, -2350, -1409, -3317, -3429, 511, 184, -794, 779, 149, -196, }; fldigi-4.2.05/src/soundcard/sound.cxx0000664000175000017500000020441614611711171014417 00000000000000// ---------------------------------------------------------------------------- // // sound.cxx // // Copyright (C) 2006-2013 // Dave Freese, W1HKJ // // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if USE_OSS # include # if defined(__OpenBSD__) # include # else # include # endif #endif #include #if HAVE_DLOPEN # include #endif #include "gettext.h" #include "sound.h" #include "configuration.h" #include "status.h" #include "fileselect.h" #include "trx.h" #include "fl_digi.h" #include "threads.h" #include "timeops.h" #include "ringbuffer.h" #include "debug.h" #include "qrunner.h" #include "icons.h" #include "macros.h" #include "util.h" #include "estrings.h" #include "dr_mp3.h" #define SND_BUF_LEN 65536 #define SND_RW_LEN (8 * SND_BUF_LEN) #define SNDFILE_CHANNELS 2 int sndfile_samplerate[7] = {8000, 11025, 16000, 22050, 24000, 44100, 48000}; LOG_FILE_SOURCE(debug::LOG_AUDIO); namespace SND_SUPPORT { bool format_supported(int format) { SF_INFO info = { 0, sndfile_samplerate[progdefaults.wavSampleRate], progdefaults.record_both_channels ? 2 : 1, format, 0, 0 }; SNDFILE* sndf = sf_open("temp.audio", SFM_WRITE, &info); sf_close(sndf); remove("temp.audio"); if (sndf) return true; return false; } void get_file_params(std::string def_fname, std::string &fname, int &format, bool check) { bool isplayback = (def_fname.find("playback") != std::string::npos); std::string filters; if (isplayback) filters = "Audio format\t*.{mp3,wav}\n"; else filters = "Audio format\t*.wav\n"; format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; int fsel = 0; const char *fn = 0; if (isplayback) fn = FSEL::select(_("Audio file"), filters.c_str(), def_fname.c_str(), &fsel); else fn = FSEL::saveas(_("Audio file"), filters.c_str(), def_fname.c_str(), &fsel); if (!fn || !*fn) { fname = ""; return; } fname = fn; if (!isplayback && (fname.find(".wav") == std::string::npos)) fname.append(".wav"); if (check) { FILE *f = fopen(fname.c_str(), "r"); if (f) { fclose(f); int ans = fl_choice("Replace %s?", "Yes", "No", 0, fname.c_str()); if ( ans == 1) fname = ""; } } } void tag_file(SNDFILE *sndfile, const char *title) { int err; if ((err = sf_set_string(sndfile, SF_STR_TITLE, title)) != 0) { LOG_VERBOSE("sf_set_string STR_TITLE: %s", sf_error_number(err)); return; } sf_set_string(sndfile, SF_STR_COPYRIGHT, progdefaults.myName.c_str()); sf_set_string(sndfile, SF_STR_SOFTWARE, PACKAGE_NAME "-" PACKAGE_VERSION); sf_set_string(sndfile, SF_STR_ARTIST, progdefaults.myCall.c_str()); char s[64]; snprintf(s, sizeof(s), "%s freq=%s", active_modem->get_mode_name(), inpFreq->value()); sf_set_string(sndfile, SF_STR_COMMENT, s); time_t t = time(0); struct tm zt; (void)gmtime_r(&t, &zt); if (strftime(s, sizeof(s), "%Y-%m-%dT%H:%M:%Sz", &zt) > 0) sf_set_string(sndfile, SF_STR_DATE, s); } }; SoundBase::SoundBase() : sample_frequency(0), txppm(progdefaults.TX_corr), rxppm(progdefaults.RX_corr), tx_src_state(0), rx_src_state(0), wrt_buffer(new double[SND_BUF_LEN]), ofCapture(0), ifPlayback(0), ofGenerate(0) { memset(wrt_buffer, 0, SND_BUF_LEN * sizeof(*wrt_buffer)); int err; writ_src_data_left = new SRC_DATA; writ_src_data_right = new SRC_DATA; play_src_data = new SRC_DATA; writ_src_state_left = src_new(progdefaults.sample_converter, 1, &err); if (writ_src_state_left == 0) throw SndException(src_strerror(err)); writ_src_state_right = src_new(progdefaults.sample_converter, 1, &err); if (writ_src_state_right == 0) throw SndException(src_strerror(err)); play_src_state = src_new(progdefaults.sample_converter, 1, &err); if (play_src_state == 0) throw SndException(src_strerror(err)); if (play_src_state == 0) throw SndException(src_strerror(err)); src_write_buffer_left = new float [SND_RW_LEN]; if (!src_write_buffer_left) throw SndException(src_strerror(err)); src_write_buffer_right = new float [SND_RW_LEN]; if (!src_write_buffer_right) throw SndException(src_strerror(err)); src_rd_inp_buffer = new float [SND_RW_LEN]; if (!src_rd_inp_buffer) throw SndException(src_strerror(err)); src_rd_out_buffer = new float [SND_RW_LEN]; if (!src_rd_out_buffer) throw SndException(src_strerror(err)); modem_wr_sr = modem_play_sr = 0; out_pointer = src_rd_out_buffer; } SoundBase::~SoundBase() { delete [] wrt_buffer; if (ofGenerate) sf_close(ofGenerate); if (ofCapture) sf_close(ofCapture); if (ifPlayback) sf_close(ifPlayback); delete writ_src_data_left; delete writ_src_data_right; delete play_src_data; delete [] src_write_buffer_left; delete [] src_write_buffer_right; delete [] src_rd_inp_buffer; delete [] src_rd_out_buffer; } void SoundBase::stopCapture() { if (ofCapture) { int err; if ((err = sf_close(ofCapture)) != 0) LOG_ERROR("sf_close error: %s", sf_error_number(err)); ofCapture = 0; } } int SoundBase::startCapture(std::string fname, int format) { // frames (ignored), freq, channels, format, sections (ignored), seekable (ignored) SF_INFO info = { 0, sndfile_samplerate[progdefaults.wavSampleRate], progdefaults.record_both_channels ? 2 : 1, // SNDFILE_CHANNELS, format, 0, 0 }; if ((ofCapture = sf_open(fname.c_str(), SFM_WRITE, &info)) == NULL) { LOG_ERROR("Could not write %s:%s", fname.c_str(), sf_strerror(NULL) ); return 0; } if (sf_command(ofCapture, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) != SF_TRUE) LOG_ERROR("ofCapture update header command failed: %s", sf_strerror(ofCapture)); SND_SUPPORT::tag_file(ofCapture, "Captured audio"); return 1; } void SoundBase::stopGenerate() { if (ofGenerate) { int err; if ((err = sf_close(ofGenerate)) != 0) LOG_ERROR("sf_close error: %s", sf_error_number(err)); ofGenerate = 0; } } //int SoundBase::startGenerate(bool val, std::string fname, int format) int SoundBase::startGenerate(std::string fname, int format) { SF_INFO info = { 0, sndfile_samplerate[progdefaults.wavSampleRate], progdefaults.record_both_channels ? 2 : 1, // SNDFILE_CHANNELS, format, 0, 0 }; if ((ofGenerate = sf_open(fname.c_str(), SFM_WRITE, &info)) == NULL) { LOG_ERROR("Could not write %s", fname.c_str()); return 0; } if (sf_command(ofGenerate, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) != SF_TRUE) LOG_ERROR("ofGenerate update header command failed: %s", sf_strerror(ofGenerate)); SND_SUPPORT::tag_file(ofGenerate, "Generated audio"); modem_wr_sr = sample_frequency; writ_src_data_left->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; src_set_ratio(writ_src_state_left, writ_src_data_left->src_ratio); writ_src_data_right->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; src_set_ratio(writ_src_state_right, writ_src_data_right->src_ratio); return 1; } void SoundBase::stopPlayback() { if (ifPlayback) { int err; if ((err = sf_close(ifPlayback)) != 0) LOG_ERROR("sf_close error: %s", sf_error_number(err)); ifPlayback = 0; } progdefaults.loop_playback = false; } int SoundBase::startPlayback(std::string fname, int format) { play_info.frames = 0; play_info.samplerate = 0; play_info.channels = 0; play_info.format = 0; play_info.sections = 0; play_info.seekable = 0; if ((ifPlayback = sf_open(fname.c_str(), SFM_READ, &play_info)) == NULL) { LOG_ERROR("Could not open %s:%s", fname.c_str(), sf_strerror(NULL) ); return 1; } LOG_VERBOSE ("wav file stats:\n\ frames : %d\n\ samplerate : %d\n\ channels : %d\n\ format : %d\n\ sections : %d\n\ seekable : %d", static_cast(play_info.frames), play_info.samplerate, play_info.channels, play_info.format, play_info.sections, play_info.seekable); modem_play_sr = sample_frequency; play_src_data->src_ratio = 1.0 * modem_play_sr / play_info.samplerate; src_set_ratio(play_src_state, play_src_data->src_ratio); LOG_VERBOSE("src ratio %f", play_src_data->src_ratio); new_playback = true; return 0; } // --------------------------------------------------------------------- // read_file // can be simplified from the equivalent read audio stream // source sr is arbitrary, requested is either 8000 or 11025 depending // on the modem in use // read from file and resample until a "count" number of converted samples // is available, or until at the end of the input file // --------------------------------------------------------------------- extern int fmt_auto_record; sf_count_t SoundBase::read_file(SNDFILE* file, float* buf, size_t count) { sf_count_t r = 0, rd_count = 0; int err = 0; if (new_playback || modem_play_sr != sample_frequency) { modem_play_sr = sample_frequency; play_src_data->src_ratio = 1.0 * modem_play_sr / play_info.samplerate; src_set_ratio(play_src_state, play_src_data->src_ratio); LOG_VERBOSE("src ratio %f", play_src_data->src_ratio); new_playback = true; } if (new_playback) { fmt_auto_record = 1; } #define RDBLKSIZE 1024 float rdbuf[2 * RDBLKSIZE]; int ch = play_info.channels; while ( static_cast(out_pointer - src_rd_out_buffer) < count) { memset(src_rd_inp_buffer, 0, RDBLKSIZE * sizeof(float)); if (new_playback) { new_playback = false; rd_count = RDBLKSIZE; } else { memset(rdbuf, 0, 2 * RDBLKSIZE * sizeof(float)); rd_count = sf_readf_float(file, rdbuf, RDBLKSIZE); if (!rd_count) break; for (int i = 0; i < rd_count; i++) src_rd_inp_buffer[i] = rdbuf[i * ch]; } play_src_data->data_in = src_rd_inp_buffer; play_src_data->input_frames = rd_count; play_src_data->data_out = out_pointer; play_src_data->output_frames = SND_RW_LEN - (out_pointer - src_rd_out_buffer); play_src_data->end_of_input = 0; if ((err = src_process(play_src_state, play_src_data)) != 0) throw SndException(src_strerror(err)); out_pointer += play_src_data->output_frames_gen; } if ( static_cast(out_pointer - src_rd_out_buffer) >= count) { memcpy(buf, src_rd_out_buffer, count * sizeof(float)); memmove(src_rd_out_buffer, src_rd_out_buffer + count, (SND_RW_LEN - count) * sizeof(float)); out_pointer -= count; r = count; } if (r == 0) { src_reset (play_src_state); out_pointer = src_rd_out_buffer; if (!progdefaults.loop_playback) { stopPlayback(); bHighSpeed = false; REQ(reset_mnuPlayback); } else { memset(buf, count, sizeof(*buf)); sf_seek(file, 0, SEEK_SET); } } return r; } //---------------------------------------------------------------------- // Audio // Adds ability to transmit an audio file using new macro tag: // // macro editor opens an OS select file dialog when the tag is // selected from the pick list. // suggested use: // // // // <@MODEM:BPSK31> // or modem type of choice // Audio file may be either wav or mp3 format, either mono or stereo // any sample rate // Returning to Rx stops current and any pending audio playback. Post // Tx macro tags are then executed. // T/R button or Escape key will abort the playback. // Please use responsibly - know and understand your license limitations // for transmitting audio files, especially music and/or copyrighted // material. //---------------------------------------------------------------------- int SoundBase::AudioMP3(std::string fname) { drmp3_config config; drmp3_uint64 frame_count; float* mp3_buffer = drmp3_open_file_and_read_f32( fname.c_str(), &config, &frame_count ); if (!mp3_buffer) { LOG_ERROR("File must be mp3 float format"); return 0; } LOG_INFO("\n\ MP3 parameters\n\ channels: %d\n\ sample rate: %d\n\ frame count: %ld\n", config.outputChannels, config.outputSampleRate, long(frame_count)); float *buffer = new float[2 * frame_count]; if (!buffer) { LOG_ERROR("Could not allocate audio buffer"); drmp3_free(mp3_buffer); return 0; } if (config.outputChannels == 2) { float maxval = 1.0; for (unsigned int n = 0; n < frame_count; n++) { buffer[2 * n] = mp3_buffer[2 * n] + mp3_buffer[2 * n + 1]; buffer[2 * n + 1] = 0; if (fabs(buffer[2 * n]) > maxval) maxval = fabs(buffer[ 2 * n]); } for (unsigned int n = 0; n < frame_count; n++) buffer[2 * n] /= maxval; } else { for (unsigned int n = frame_count - 1; n >= 0; n--) { buffer[2 * n] = mp3_buffer[n]; buffer[2 * n + 1] = 0; } } drmp3_free(mp3_buffer); double save_sample_rate = req_sample_rate; req_sample_rate = config.outputSampleRate; unsigned int n = 0; int incr = SCBLOCKSIZE; while (n < frame_count) { if (active_modem->get_stopflag()) { Rx_queue_execute(); break; } if (n + incr < frame_count) resample_write(&buffer[n*2], incr); else resample_write(&buffer[n*2], frame_count - n); n += incr; } delete [] buffer; req_sample_rate = save_sample_rate; return n; } int SoundBase::AudioWAV(std::string fname) { SNDFILE *playback; play_info.frames = 0; play_info.samplerate = 0; play_info.channels = 0; play_info.format = 0; play_info.sections = 0; play_info.seekable = 0; if ((playback = sf_open(fname.c_str(), SFM_READ, &play_info)) == NULL) { LOG_ERROR("Could not open %s", fname.c_str()); return 0; } LOG_INFO("\ \nAudio file: %s\ \nframes: %ld\ \nsamplerate: %d\ \nchannels: %d", fname.c_str(), (long)play_info.frames, play_info.samplerate, play_info.channels); int ch = play_info.channels; if (ch > 2) return 0; int fsize = play_info.frames * 2; float *buffer = new float[fsize]; if (!buffer) return 0; memset(buffer, 0, fsize * sizeof(*buffer)); int ret = sf_readf_float( playback, buffer, play_info.frames); if (!ret) { sf_close(playback); delete [] buffer; return 0; } double save_sample_rate = req_sample_rate; req_sample_rate = play_info.samplerate; if (ch == 1) { for (long int n = play_info.frames - 1; n >= 0; n--) { buffer[2 * n] = buffer[n]; buffer[2 * n + 1] = 0; } } else { float maxval = 1.0; for (long int n = play_info.frames - 1; n >= 0; n--) { buffer[2 * n] = buffer[2 * n] + buffer[2 * n + 1]; buffer[2 * n + 1] = 0; if (fabs(buffer[2*n] > maxval)) maxval = fabs(buffer[2*n]); } for (long int n = 0; n < play_info.frames; n++) buffer[2*n] /= maxval; } unsigned int n = 0; int incr = SCBLOCKSIZE; while (n < play_info.frames) { if (active_modem->get_stopflag()) { Rx_queue_execute(); break; } if (n + incr < play_info.frames) resample_write(&buffer[n*2], incr); else resample_write(&buffer[n*2], play_info.frames - n); n += incr; } sf_close(playback); delete [] buffer; req_sample_rate = save_sample_rate; return play_info.frames; } int SoundBase::Audio(std::string fname) { if (fname.empty()) return 0; if ((fname.find("mp3") != std::string::npos) || (fname.find("MP3") != std::string::npos )) return AudioMP3(fname); else return AudioWAV(fname); } // --------------------------------------------------------------------- // write_file // All sound buffer data is resampled to a specified sample rate // progdefaults.wavSampleRate // resultant data (left channel only) is written to a wav file //---------------------------------------------------------------------- void SoundBase::write_file(SNDFILE* file, float* bufleft, float* bufright, size_t count) { bool must_delete = false; if (bufright == NULL || !progdefaults.record_both_channels) { bufright = new float[count]; memset(bufright, 0, count * sizeof(float)); must_delete = true; } int err; size_t output_size = count; float *bufl = bufleft; float *bufr = bufright; if (modem_wr_sr != sample_frequency) { modem_wr_sr = sample_frequency; writ_src_data_left->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; writ_src_data_left->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; src_set_ratio(writ_src_state_left, writ_src_data_left->src_ratio); writ_src_data_right->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; writ_src_data_right->src_ratio = 1.0 * sndfile_samplerate[progdefaults.wavSampleRate] / modem_wr_sr; src_set_ratio(writ_src_state_right, writ_src_data_right->src_ratio); } writ_src_data_left->data_in = bufleft; writ_src_data_left->input_frames = count; writ_src_data_left->data_out = src_write_buffer_left; writ_src_data_left->output_frames = SND_RW_LEN; writ_src_data_left->end_of_input = 0; writ_src_data_right->data_in = bufright; writ_src_data_right->input_frames = count; writ_src_data_right->data_out = src_write_buffer_right; writ_src_data_right->output_frames = SND_RW_LEN; writ_src_data_right->end_of_input = 0; if ((err = src_process(writ_src_state_left, writ_src_data_left)) != 0) { if (must_delete) { delete [] bufright; } throw SndException(src_strerror(err)); } if ((err = src_process(writ_src_state_right, writ_src_data_right)) != 0) { if (must_delete) { delete [] bufright; } throw SndException(src_strerror(err)); } output_size = writ_src_data_left->output_frames_gen; bufl = src_write_buffer_left; bufr = src_write_buffer_right; if (output_size) { if (progdefaults.record_both_channels) { float buffer[2*output_size]; memset(buffer, 0, 2 * output_size * sizeof(float)); for (size_t i = 0; i < output_size; i++) { buffer[2*i] = bufl[i];//0.9 * bufl[i]; buffer[2*i + 1] = bufr[i];//0.9 * bufr[i]; } sf_write_float(file, buffer, 2 * output_size); } else { sf_write_float(file, bufl, output_size); } } if (must_delete) { delete [] bufright; } return; } void SoundBase::write_file(SNDFILE* file, double* bufleft, double *bufright, size_t count) { float *outbuf_l = new float[count]; float *outbuf_r = new float[count]; for (size_t i = 0; i < count; i++) { outbuf_l[i] = bufleft[i]; outbuf_r[i] = (bufright ? bufright[i] : 0); } write_file(file, outbuf_l, outbuf_r, count); delete [] outbuf_l; delete [] outbuf_r; return; } #if USE_OSS #define MAXSC 32767.0f #define maxsc 32000.0 SoundOSS::SoundOSS(const char *dev ) { device = dev; cbuff = 0; try { Open(O_RDONLY); getVersion(); getCapabilities(); getFormats(); Close(); } catch (const SndException& e) { LOG_ERROR("device %s error: %s", device.c_str(), e.what()); } snd_buffer = new float [2 * SND_BUF_LEN]; src_buffer = new float [2 * SND_BUF_LEN]; cbuff = new unsigned char [4 * SND_BUF_LEN]; memset(snd_buffer, 0, 2 * SND_BUF_LEN * sizeof(*snd_buffer)); memset(src_buffer, 0, 2 * SND_BUF_LEN * sizeof(*src_buffer)); memset(cbuff, 0, 4 * SND_BUF_LEN * sizeof(*cbuff)); tx_src_data = new SRC_DATA; rx_src_data = new SRC_DATA; int err; rx_src_state = src_new(progdefaults.sample_converter, 2, &err); if (rx_src_state == 0) throw SndException(src_strerror(err)); tx_src_state = src_new(progdefaults.sample_converter, 2, &err); if (tx_src_state == 0) throw SndException(src_strerror(err)); rx_src_data->src_ratio = 1.0/(1.0 + rxppm/1e6); src_set_ratio ( rx_src_state, 1.0/(1.0 + rxppm/1e6)); tx_src_data->src_ratio = 1.0 + txppm/1e6; src_set_ratio ( tx_src_state, 1.0 + txppm/1e6); } SoundOSS::~SoundOSS() { Close(); delete tx_src_data; delete rx_src_data; if (rx_src_state) src_delete(rx_src_state); if (tx_src_state) src_delete(tx_src_state); delete [] snd_buffer; delete [] src_buffer; delete [] cbuff; } void SoundOSS::setfragsize() { int sndparam; // Try to get ~100ms worth of samples per fragment sndparam = (int)log2(sample_frequency * 0.1); // double since we are using 16 bit samples sndparam += 1; // Unlimited amount of buffers for RX, four for TX if (mode == O_RDONLY) sndparam |= 0x7FFF0000; else sndparam |= 0x00040000; if (ioctl(device_fd, SNDCTL_DSP_SETFRAGMENT, &sndparam) < 0) throw SndException(errno); } int SoundOSS::Open(int md, int freq) { Close(); mode = md; try { int oflags = md; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif #ifdef __FreeBSD__ /* * In FreeBSD sound devices e.g. /dev/dsp0.0 can only be open once * whereas /dev/dsp0 can be open multiple times. fldigi tries * to open /dev/dsp0.0 multiple times which fails. Also see man 4 sound. * "For specific sound card access, please instead use /dev/dsp or /dev/dsp%d" * This is a hack. XXX - db VA3DB */ char *fixed_name; char *p; /* Look for a '.' if found, blow it away */ fixed_name = strdup(device.c_str()); p = strchr(fixed_name, '.'); if(p != NULL) *p = '\0'; device_fd = fl_open(fixed_name, oflags, 0); free(fixed_name); #else device_fd = fl_open(device.c_str(), oflags, 0); #endif if (device_fd == -1) throw SndException(errno); Format(AFMT_S16_LE); // default: 16 bit little endian Channels(2); // 2 channels Frequency(freq); setfragsize(); } catch (...) { throw; } return 0; } void SoundOSS::Close(unsigned dir) { if (device_fd == -1) return; close(device_fd); device_fd = -1; } void SoundOSS::getVersion() { version = 0; if (ioctl(device_fd, OSS_GETVERSION, &version) == -1) { version = -1; throw SndException("OSS Version"); } } void SoundOSS::getCapabilities() { capability_mask = 0; if (ioctl(device_fd, SNDCTL_DSP_GETCAPS, &capability_mask) == -1) { capability_mask = 0; throw SndException("OSS capabilities"); } } void SoundOSS::getFormats() { format_mask = 0; if (ioctl(device_fd, SNDCTL_DSP_GETFMTS, &format_mask) == -1) { format_mask = 0; throw SndException("OSS formats"); } } void SoundOSS::Format(int format) { play_format = format; if (ioctl(device_fd, SNDCTL_DSP_SETFMT, &play_format) == -1) { device_fd = -1; formatok = false; throw SndException("Unsupported snd card format"); } formatok = true; } void SoundOSS::Channels(int nuchannels) { channels = nuchannels; if (ioctl(device_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) { device_fd = -1; throw "Snd card channel request failed"; } } void SoundOSS::Frequency(int frequency) { sample_frequency = frequency; if (ioctl(device_fd, SNDCTL_DSP_SPEED, &sample_frequency) == -1) { device_fd = -1; throw SndException("Cannot set frequency"); } } int SoundOSS::BufferSize( int seconds ) { int bytes_per_channel = 0; switch (play_format) { case AFMT_MU_LAW: case AFMT_A_LAW: case AFMT_IMA_ADPCM: bytes_per_channel = 0; /* format not supported by this program */ break; case AFMT_S16_BE: case AFMT_U16_LE: case AFMT_U16_BE: case AFMT_MPEG: case AFMT_S16_LE: bytes_per_channel = 2; break; case AFMT_U8: case AFMT_S8: bytes_per_channel = 1; break; } return seconds * sample_frequency * bytes_per_channel * channels; } bool SoundOSS::wait_till_finished() { if (ioctl(device_fd, SNDCTL_DSP_POST, (void*)1) == -1 ) return false; if (ioctl(device_fd, SNDCTL_DSP_SYNC, (void*)0) == -1) return false; /* format (or ioctl()) not supported by device */ return true; /* all sound has been played */ } bool SoundOSS::reset_device() { if (ioctl(device_fd, SNDCTL_DSP_RESET, 0) == -1) { device_fd = -1; return false; /* format (or ioctl()) not supported by device */ } return 1; /* sounddevice has been reset */ } size_t SoundOSS::Read(float *buffer, size_t buffersize) { short int *ibuff = (short int *)cbuff; int numread; numread = read(device_fd, cbuff, buffersize * 4); if (numread == -1) throw SndException(errno); for (size_t i = 0; i < buffersize * 2; i++) src_buffer[i] = ibuff[i] / MAXSC; for (size_t i = 0; i < buffersize; i++) buffer[i] = src_buffer[2*i + (progdefaults.ReverseRxAudio ? 1 : 0)]; if (ofCapture) write_file(ofCapture, buffer, NULL, buffersize); if (ifPlayback) { read_file(ifPlayback, buffer, buffersize); return buffersize; } if (rxppm != progdefaults.RX_corr) { rxppm = progdefaults.RX_corr; rx_src_data->src_ratio = 1.0/(1.0 + rxppm/1e6); src_set_ratio ( rx_src_state, 1.0/(1.0 + rxppm/1e6)); } if (rxppm == 0) return buffersize; // process using samplerate library rx_src_data->data_in = src_buffer; rx_src_data->input_frames = buffersize; rx_src_data->data_out = snd_buffer; rx_src_data->output_frames = SND_BUF_LEN; rx_src_data->end_of_input = 0; if ((numread = src_process(rx_src_state, rx_src_data)) != 0) throw SndException(src_strerror(numread)); numread = rx_src_data->output_frames_gen; for (int i = 0; i < numread; i++) buffer[i] = snd_buffer[2*i + (progdefaults.sig_on_right_channel ? 1 : 0)]; return numread; } size_t SoundOSS::Write(double *buf, size_t count) { int retval; short int *wbuff; unsigned char *p; if (ofGenerate) write_file(ofGenerate, buf, NULL, count); if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } if (txppm != progdefaults.TX_corr) { txppm = progdefaults.TX_corr; tx_src_data->src_ratio = 1.0 + txppm/1e6; src_set_ratio ( tx_src_state, 1.0 + txppm/1e6); } if (txppm == 0) { wbuff = new short int[2*count]; p = (unsigned char *)wbuff; for (size_t i = 0; i < count; i++) { wbuff[2*i] = wbuff[2*i+1] = (short int)(buf[i] * maxsc); } count *= sizeof(short int); retval = write(device_fd, p, 2*count); delete [] wbuff; if (retval == -1) throw SndException(errno); } else { float *inbuf; inbuf = new float[2*count]; size_t bufsize; for (size_t i = 0; i < count; i++) inbuf[2*i] = inbuf[2*i+1] = buf[i]; tx_src_data->data_in = inbuf; tx_src_data->input_frames = count; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SND_BUF_LEN; tx_src_data->end_of_input = 0; retval = src_process(tx_src_state, tx_src_data); delete [] inbuf; if (retval != 0) throw SndException(src_strerror(retval)); bufsize = tx_src_data->output_frames_gen; wbuff = new short int[2*bufsize]; p = (unsigned char *)wbuff; for (size_t i = 0; i < 2*bufsize; i++) wbuff[i] = (short int)(src_buffer[i] * maxsc); int num2write = bufsize * 2 * sizeof(short int); retval = write(device_fd, p, num2write); delete [] wbuff; if (retval != num2write) throw SndException(errno); retval = count; } return retval; } size_t SoundOSS::resample_write(float *buf, size_t count) { double *samples = new double[2*count]; Write(samples, count); delete [] samples; return 0; } size_t SoundOSS::Write_stereo(double *bufleft, double *bufright, size_t count) { int retval; short int *wbuff; unsigned char *p; if (ofGenerate) write_file(ofGenerate, bufleft, bufright, count); if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } if (txppm != progdefaults.TX_corr) { txppm = progdefaults.TX_corr; tx_src_data->src_ratio = 1.0 + txppm/1e6; src_set_ratio ( tx_src_state, 1.0 + txppm/1e6); } if (txppm == 0) { wbuff = new short int[2*count]; p = (unsigned char *)wbuff; for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { wbuff[2*i+1] = (short int)(bufleft[i] * maxsc); wbuff[2*i] = (short int)(bufright[i] * maxsc); } else { wbuff[2*i] = (short int)(bufleft[i] * maxsc); wbuff[2*i+1] = (short int)(bufright[i] * maxsc); } } count *= sizeof(short int); retval = write(device_fd, p, 2*count); delete [] wbuff; if (retval == -1) throw SndException(errno); } else { float *inbuf; inbuf = new float[2*count]; size_t bufsize; for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { inbuf[2*i+1] = bufleft[i]; inbuf[2*i] = bufright[i]; } else { inbuf[2*i] = bufleft[i]; inbuf[2*i+1] = bufright[i]; } } tx_src_data->data_in = inbuf; tx_src_data->input_frames = count; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SND_BUF_LEN; tx_src_data->end_of_input = 0; retval = src_process(tx_src_state, tx_src_data); delete [] inbuf; if (retval != 0) throw SndException(src_strerror(retval)); bufsize = tx_src_data->output_frames_gen; wbuff = new short int[2*bufsize]; p = (unsigned char *)wbuff; for (size_t i = 0; i < 2*bufsize; i++) wbuff[i] = (short int)(src_buffer[i] * maxsc); int num2write = bufsize * 2 * sizeof(short int); retval = write(device_fd, p, num2write); delete [] wbuff; if (retval != num2write) throw SndException(errno); retval = count; } return retval; } #endif // USE_OSS #if USE_PORTAUDIO bool SoundPort::pa_init = false; std::vector SoundPort::devs; static std::ostringstream device_text[2]; static pthread_mutex_t device_mutex = PTHREAD_MUTEX_INITIALIZER; std::map > supported_rates[2]; void SoundPort::initialize(void) { if (pa_init) return; init_hostapi_ext(); int err; if ((err = Pa_Initialize()) != paNoError) { #if __WIN32__ LOG_PERROR(win_error_string(err).c_str()); #else LOG_PERROR("Portaudio Initialize error"); #endif throw SndPortException(err); } pa_init = true; PaDeviceIndex ndev; if ((ndev = Pa_GetDeviceCount()) < 0) { LOG_PERROR("Portaudio device count error"); throw SndPortException(ndev); } if (ndev == 0) { LOG_PERROR("Portaudio, no audio devices"); throw SndException(ENODEV, "No available audio devices"); } devs.reserve(ndev); for (PaDeviceIndex i = 0; i < ndev; i++) devs.push_back(Pa_GetDeviceInfo(i)); } void SoundPort::terminate(void) { if (!pa_init) return; static_cast(Pa_Terminate()); pa_init = false; devs.clear(); supported_rates[0].clear(); supported_rates[1].clear(); } const std::vector& SoundPort::devices(void) { return devs; } void SoundPort::devices_info(std::string& in, std::string& out) { guard_lock devices_lock(&device_mutex); in = device_text[0].str(); out = device_text[1].str(); } const std::vector& SoundPort::get_supported_rates(const std::string& name, unsigned dir) { return supported_rates[dir][name]; } SoundPort::SoundPort(const char *in_dev, const char *out_dev) { req_sample_rate = 0; sd[0].device = in_dev; sd[0].params.channelCount = 2; // init_stream can change this to 0 or 1 sd[0].stream = 0; sd[0].frames_per_buffer = paFramesPerBufferUnspecified; sd[0].dev_sample_rate = 0; sd[0].state = spa_continue; sd[0].rb = 0; sd[0].advance = 0; sd[1].device = out_dev; sd[1].params.channelCount = 2; sd[1].stream = 0; sd[1].frames_per_buffer = paFramesPerBufferUnspecified; sd[1].dev_sample_rate = 0; sd[1].state = spa_continue; sd[1].rb = 0; sd[1].advance = 0; sem_t** sems[] = { &sd[0].rwsem, &sd[1].rwsem }; #if USE_NAMED_SEMAPHORES char sname[32]; #endif for (size_t i = 0; i < sizeof(sems)/sizeof(*sems); i++) { #if USE_NAMED_SEMAPHORES unsigned int un = i; snprintf(sname, sizeof(sname), "%u-%u-%s", un, getpid(), PACKAGE_TARNAME); if ((*sems[i] = sem_open(sname, O_CREAT | O_EXCL, 0600, 0)) == (sem_t*)SEM_FAILED) { pa_perror(errno, sname); throw SndException(errno); } # if HAVE_SEM_UNLINK if (sem_unlink(sname) == -1) { pa_perror(errno, sname); throw SndException(errno); } # endif #else *sems[i] = new sem_t; if (sem_init(*sems[i], 0, 0) == -1) { #if __WIN32__ int err = GetLastError(); LOG_PERROR(win_error_string(err).c_str()); #endif pa_perror(errno, "sem_init error"); throw SndException(errno); } #endif // USE_NAMED_SEMAPHORES } for (size_t i = 0; i < 2; i++) { sd[i].cmutex = new pthread_mutex_t; pthread_mutex_init(sd[i].cmutex, NULL); sd[i].ccond = new pthread_cond_t; pthread_cond_init(sd[i].ccond, NULL); } tx_src_data = new SRC_DATA; src_buffer = new float[sd[1].params.channelCount * SND_BUF_LEN]; fbuf = new float[2 * SND_BUF_LEN]; memset(src_buffer, 0, sd[1].params.channelCount * SND_BUF_LEN * sizeof(*src_buffer)); memset(fbuf, 0, 2 * SND_BUF_LEN * sizeof(*fbuf)); } SoundPort::~SoundPort() { Close(); sem_t* sems[] = { sd[0].rwsem, sd[1].rwsem }; for (size_t i = 0; i < sizeof(sems)/sizeof(*sems); i++) { #if USE_NAMED_SEMAPHORES if (sem_close(sems[i]) == -1) LOG_PERROR("sem_close"); #else if (sem_destroy(sems[i]) == -1) LOG_PERROR("sem_destroy"); delete sems[i]; #endif } for (size_t i = 0; i < 2; i++) { if (pthread_mutex_destroy(sd[i].cmutex) == -1) { pa_perror(errno, "pthread mutex destroy"); terminate(); //throw SndException(errno); } delete sd[i].cmutex; if (pthread_cond_destroy(sd[i].ccond) == -1) { pa_perror(errno, "pthread cond destroy"); terminate(); //throw SndException(errno); } delete sd[i].ccond; } delete sd[0].rb; delete sd[1].rb; if (rx_src_state) src_delete(rx_src_state); if (tx_src_state) src_delete(tx_src_state); delete tx_src_data; delete [] src_buffer; delete [] fbuf; } int SoundPort::Open(int mode, int freq) { int old_sample_rate = (int)req_sample_rate; req_sample_rate = sample_frequency = freq; // do we need to (re)initialise the streams? int ret = 1; int sr[2] = { progdefaults.in_sample_rate, progdefaults.out_sample_rate }; // initialize stream if it is a JACK device, regardless of mode device_iterator idev; int device_type = 0; if (mode == O_WRONLY && (idev = name_to_device(sd[0].device, 0)) != devs.end() && (device_type = Pa_GetHostApiInfo((*idev)->hostApi)->type) == paJACK) mode = O_RDWR; if (mode == O_RDONLY && (idev = name_to_device(sd[1].device, 1)) != devs.end() && (device_type = Pa_GetHostApiInfo((*idev)->hostApi)->type) == paJACK) mode = O_RDWR; size_t start = (mode == O_RDONLY || mode == O_RDWR) ? 0 : 1, end = (mode == O_WRONLY || mode == O_RDWR) ? 1 : 0; for (size_t i = start; i <= end; i++) { if ( !(stream_active(i) && (Pa_GetHostApiInfo((*sd[i].idev)->hostApi)->type == paJACK || old_sample_rate == freq || sr[i] != SAMPLE_RATE_AUTO)) ) { Close(i); try { init_stream(i); } catch (const SndException& e) { LOG_ERROR("SndException: %s", e.what()); throw SndPortException(paDeviceUnavailable); } src_data_reset(i); // reset the semaphore while (sem_trywait(sd[i].rwsem) == 0); if (errno && errno != EAGAIN) { pa_perror(errno, "open failed"); throw SndException(errno); } start_stream(i); ret = 0; } else { pause_stream(i); src_data_reset(i); sd[i].state = spa_continue; } } static char pa_open_str[500]; snprintf(pa_open_str, sizeof(pa_open_str), "\ Port Audio open mode = %s\n\ device type = %s\n\ device name = %s\n\ # input channels %d\n\ # output channels %d", mode == O_WRONLY ? "Write" : mode == O_RDONLY ? "Read" : mode == O_RDWR ? "Read/Write" : "unknown", device_type == 0 ? "paInDevelopment" : device_type == 1 ? "paDirectSound" : device_type == 2 ? "paMME" : device_type == 3 ? "paASIO" : device_type == 4 ? "paSoundManager" : device_type == 5 ? "paCoreAudio" : device_type == 7 ? "paOSS" : device_type == 8 ? "paALSA" : device_type == 9 ? "paAL" : device_type == 10 ? "paBeOS" : device_type == 11 ? "paWDMKS" : device_type == 12 ? "paJACK" : device_type == 13 ? "paWASAPI" : device_type == 14 ? "paAudioScienceHPI" : "unknown", mode == O_WRONLY ? sd[1].device.c_str() : mode == O_RDONLY ? sd[0].device.c_str() : "unknown", sd[0].params.channelCount, sd[1].params.channelCount ); LOG_INFO( "%s", pa_open_str); return ret; } void SoundPort::pause_stream(unsigned dir) { if (sd[dir].stream == 0 || !stream_active(dir)) return; pthread_mutex_lock(sd[dir].cmutex); sd[dir].state = spa_pause; if (pthread_cond_timedwait_rel(sd[dir].ccond, sd[dir].cmutex, 5.0) == -1 && errno == ETIMEDOUT) LOG_ERROR("stream %u wedged", dir); pthread_mutex_unlock(sd[dir].cmutex); } void SoundPort::Close(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; for (unsigned i = start; i <= end; i++) { if (!stream_active(i)) continue; pthread_mutex_lock(sd[i].cmutex); sd[i].state = spa_complete; // first wait for buffers to be drained and for the // stop callback to signal us that the stream has // been stopped if (pthread_cond_timedwait_rel(sd[i].ccond, sd[i].cmutex, 5.0) == -1 && errno == ETIMEDOUT) LOG_ERROR("stream %u wedged", i); pthread_mutex_unlock(sd[i].cmutex); sd[i].state = spa_continue; int err; if ((err = Pa_CloseStream(sd[i].stream)) != paNoError) pa_perror(err, "Pa_CloseStream"); sd[i].stream = 0; } } void SoundPort::Abort(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; int err; for (unsigned i = start; i <= end; i++) { if (!stream_active(i)) continue; if ((err = Pa_AbortStream(sd[i].stream)) != paNoError) #if __WIN32__ LOG_PERROR(win_error_string(err).c_str()); #endif pa_perror(err, "Pa_AbortStream"); sd[i].stream = 0; } } #define WAIT_FOR_COND(cond, s, t) \ do { \ while (!(cond)) { \ if (sem_timedwait_rel(s, t) == -1) { \ if (errno == ETIMEDOUT) { \ timeout = true; \ break; \ } else if (errno == EINTR) { \ continue; \ } \ LOG_PERROR("sem_timedwait"); \ throw SndException(errno); \ } \ } \ } while (0) size_t SoundPort::Read(float *buf, size_t count) { if (ifPlayback) { read_file(ifPlayback, buf, count); if (!ofCapture) { if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / req_sample_rate)); return count; } } if (rxppm != progdefaults.RX_corr) rxppm = progdefaults.RX_corr; sd[0].src_ratio = req_sample_rate / (sd[0].dev_sample_rate * (1.0 + rxppm / 1e6)); src_set_ratio(rx_src_state, sd[0].src_ratio); size_t maxframes = (size_t)floor(sd[0].rb->length() * sd[0].src_ratio / sd[0].params.channelCount); if (unlikely(count > maxframes)) { size_t n = 0; #define PA_TIMEOUT_TRIES 10 int pa_timeout = PA_TIMEOUT_TRIES; // possible to lock up in this while block if the Read(...) fails while (count > maxframes) { n += Read(buf, maxframes); buf += maxframes * sd[0].params.channelCount; count -= n;//maxframes; pa_timeout--; if (pa_timeout == 0) { #if __WIN32__ int err = GetLastError(); LOG_PERROR(win_error_string(err).c_str()); #endif pa_perror(1, "Portaudio read error #1"); throw SndException("Portaudio read error 1"); } } if (count > 0) n += Read(buf, count); return n; } float* rbuf = fbuf; if (req_sample_rate != sd[0].dev_sample_rate || rxppm != 0) { long r; size_t n = 0; sd[0].blocksize = SCBLOCKSIZE; while (n < count) { if ((r = src_callback_read(rx_src_state, sd[0].src_ratio, count - n, rbuf + n * sd[0].params.channelCount)) == 0) { pa_perror(2, "Portaudio read error #2"); throw SndException("Portaudio read error 2"); } n += r; } } else { bool timeout = false; WAIT_FOR_COND( (sd[0].rb->read_space() >= count * sd[0].params.channelCount / sd[0].src_ratio), sd[0].rwsem, (MAX(1.0, 2 * count * sd[0].params.channelCount / sd->dev_sample_rate)) ); if (timeout) { pa_perror(3, "Portaudio read error #3"); throw SndException("Portaudio read error 3"); } ringbuffer::vector_type vec[2]; sd[0].rb->get_rv(vec); if (vec[0].len >= count * sd[0].params.channelCount) { rbuf = vec[0].buf; sd[0].advance = vec[0].len; } else sd[0].rb->read(rbuf, count * sd[0].params.channelCount); } if (sd[0].advance) { sd[0].rb->read_advance(sd[0].advance); sd[0].advance = 0; } // transfer active input channel; left == 0, right == 1 size_t n; for (size_t i = 0; i < count; i++) { n = sd[0].params.channelCount * i; if (sd[0].params.channelCount == 2) n += progdefaults.ReverseRxAudio; buf[i] = rbuf[n]; } if (ofCapture) write_file(ofCapture, buf, NULL, count); return count; } size_t SoundPort::Write(double *buf, size_t count) { if (ofGenerate) write_file(ofGenerate, buf, NULL, count); if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } // copy input to both channels if right channel enabled for (size_t i = 0; i < count; i++) if (progdefaults.sig_on_right_channel) fbuf[sd[1].params.channelCount * i] = fbuf[sd[1].params.channelCount * i + 1] = buf[i]; else if (progdefaults.ReverseAudio) { fbuf[sd[1].params.channelCount * i + 1] = buf[i]; fbuf[sd[1].params.channelCount * i] = 0; } else { fbuf[sd[1].params.channelCount * i] = buf[i]; fbuf[sd[1].params.channelCount * i + 1] = 0; } return resample_write(fbuf, count); } size_t SoundPort::Write_stereo(double *bufleft, double *bufright, size_t count) { if (sd[1].params.channelCount != 2) return Write(bufleft, count); if (ofGenerate) write_file(ofCapture, bufleft, bufright, count); if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } // interleave into fbuf for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { fbuf[sd[1].params.channelCount * i + 1] = bufleft[i]; fbuf[sd[1].params.channelCount * i] = bufright[i]; } else { fbuf[sd[1].params.channelCount * i] = bufleft[i]; fbuf[sd[1].params.channelCount * i + 1] = bufright[i]; } } return resample_write(fbuf, count); } size_t SoundPort::resample_write(float* buf, size_t count) { size_t maxframes = (size_t)floor((sd[1].rb->length() / sd[1].params.channelCount) / tx_src_data->src_ratio); maxframes /= 2; // don't fill the buffer if (unlikely(count > maxframes)) { size_t n = 0; #define PA_TIMEOUT_TRIES 10 int pa_timeout = PA_TIMEOUT_TRIES; // possible to lock up in this while block if the resample_write(...) fails while (count > maxframes) { n += resample_write(buf, maxframes); buf += sd[1].params.channelCount * maxframes; count -= maxframes; pa_timeout--; if (pa_timeout == 0) { pa_perror(1, "Portaudio write error #1"); throw SndException("Portaudio write error 1"); } } if (count > 0) n += resample_write(buf, count); return n; } assert(count * sd[1].params.channelCount * tx_src_data->src_ratio <= sd[1].rb->length()); ringbuffer::vector_type vec[2]; sd[1].rb->get_wv(vec); float* wbuf = buf; if (req_sample_rate != sd[1].dev_sample_rate || progdefaults.TX_corr != 0) { if (vec[0].len >= sd[1].params.channelCount * (size_t)ceil(count * tx_src_data->src_ratio)) wbuf = vec[0].buf; // direct write in the rb else wbuf = src_buffer; if (txppm != progdefaults.TX_corr) txppm = progdefaults.TX_corr; tx_src_data->src_ratio = sd[1].dev_sample_rate * (1.0 + txppm / 1e6) / req_sample_rate; src_set_ratio(tx_src_state, tx_src_data->src_ratio); tx_src_data->data_in = buf; tx_src_data->input_frames = count; tx_src_data->data_out = wbuf; tx_src_data->output_frames = (wbuf == vec[0].buf ? vec[0].len : SND_BUF_LEN); tx_src_data->end_of_input = 0; int r; if ((r = src_process(tx_src_state, tx_src_data)) != 0) { pa_perror(2, "Portaudio write error #2"); throw SndException("Portaudio write error 2"); } if (tx_src_data->output_frames_gen == 0) // input was too small return count; count = tx_src_data->output_frames_gen; if (wbuf == vec[0].buf) { // advance write pointer and return sd[1].rb->write_advance(sd[1].params.channelCount * count); sem_trywait(sd[1].rwsem); return count; } } // if we didn't do a direct resample into the rb, or didn't resample at all, // we must now copy buf into the ringbuffer, possibly waiting for space first bool timeout = false; WAIT_FOR_COND( (sd[1].rb->write_space() >= sd[1].params.channelCount * count), sd[1].rwsem, (MAX(1.0, 2 * sd[1].params.channelCount * count / sd[1].dev_sample_rate)) ); if (timeout) { pa_perror(3, "Portaudio write error #3"); throw SndException("Portaudio write error 3"); } sd[1].rb->write(wbuf, sd[1].params.channelCount * count); return count; } void SoundPort::flush(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; for (unsigned i = start; i <= end; i++) { if (!stream_active(i)) continue; pthread_mutex_lock(sd[i].cmutex); sd[i].state = spa_drain; if (pthread_cond_timedwait_rel(sd[i].ccond, sd[i].cmutex, 5.0) == -1 && errno == ETIMEDOUT) LOG_ERROR("stream %u wedged", i); pthread_mutex_unlock(sd[i].cmutex); sd[i].state = spa_continue; } } void SoundPort::src_data_reset(unsigned dir) { size_t rbsize; int err; if (dir == 0) { if (rx_src_state) src_delete(rx_src_state); rx_src_state = src_callback_new(src_read_cb, progdefaults.sample_converter, sd[0].params.channelCount, &err, &sd[0]); if (!rx_src_state) { pa_perror(err, src_strerror(err)); throw SndException(src_strerror(err)); } sd[0].src_ratio = req_sample_rate / (sd[0].dev_sample_rate * (1.0 + rxppm / 1e6)); } else if (dir == 1) { if (tx_src_state) src_delete(tx_src_state); tx_src_state = src_new(progdefaults.sample_converter, sd[1].params.channelCount, &err); if (!tx_src_state) { pa_perror(err, src_strerror(err)); throw SndException(src_strerror(err)); } tx_src_data->src_ratio = sd[1].dev_sample_rate * (1.0 + txppm / 1e6) / req_sample_rate; } rbsize = 2 * MAX(ceil2( (unsigned)(2 * sd[dir].params.channelCount * SCBLOCKSIZE * MAX(req_sample_rate, sd[dir].dev_sample_rate) / MIN(req_sample_rate, sd[dir].dev_sample_rate))), 8192); std::stringstream info; info << "rbsize = " << rbsize; LOG_VERBOSE("%s", info.str().c_str()); if (sd[dir].rb) delete sd[dir].rb; sd[dir].rb = new ringbuffer(rbsize); } long SoundPort::src_read_cb(void* arg, float** data) { struct stream_data* sd = reinterpret_cast(arg); // advance read pointer for previous read if (sd->advance) { sd->rb->read_advance(sd->advance); sd->advance = 0; } // wait for data bool timeout = false; WAIT_FOR_COND( (sd->rb->read_space() >= (size_t)sd[0].params.channelCount * SCBLOCKSIZE), sd->rwsem, (MAX(1.0, 2 * sd[0].params.channelCount * SCBLOCKSIZE / sd->dev_sample_rate)) ); if (timeout) { *data = 0; return 0; } ringbuffer::vector_type vec[2]; sd->rb->get_rv(vec); *data = vec[0].buf; sd->advance = vec[0].len; return vec[0].len / sd[0].params.channelCount; } SoundPort::device_iterator SoundPort::name_to_device(std::string &name, unsigned dir) { device_iterator i; for (i = devs.begin(); i != devs.end(); ++i) if (name == (*i)->name && (dir ? (*i)->maxOutputChannels : (*i)->maxInputChannels)) break; return i; } void SoundPort::init_stream(unsigned dir) { const char* dir_str[2] = { "input", "output" }; PaDeviceIndex idx = paNoDevice; LOG_DEBUG("looking for device \"%s\"", sd[dir].device.c_str()); if ((sd[dir].idev = name_to_device(sd[dir].device, dir)) != devs.end()) idx = sd[dir].idev - devs.begin(); if (idx == paNoDevice) { // no match LOG_ERROR("Could not find device \"%s\", using default device", sd[dir].device.c_str()); PaDeviceIndex def = (dir == 0 ? Pa_GetDefaultInputDevice() : Pa_GetDefaultOutputDevice()); if (def == paNoDevice) { pa_perror(paDeviceUnavailable, "Portaudio device unavailable"); throw SndPortException(paDeviceUnavailable); } sd[dir].idev = devs.begin() + def; idx = def; } else if (sd[dir].idev == devs.end()) // if we only found a near-match point the idev iterator to it sd[dir].idev = devs.begin() + idx; const PaHostApiInfo* host_api = Pa_GetHostApiInfo((*sd[dir].idev)->hostApi); int max_channels = dir ? (*sd[dir].idev)->maxOutputChannels : (*sd[dir].idev)->maxInputChannels; if ((host_api->type == paALSA || host_api->type == paOSS) && max_channels == 0) { pa_perror(EBUSY, "Portaudio device busy"); throw SndException(EBUSY); } if (dir == 0) { sd[0].params.device = idx; sd[0].params.sampleFormat = paFloat32; sd[0].params.suggestedLatency = (*sd[dir].idev)->defaultHighInputLatency; sd[0].params.hostApiSpecificStreamInfo = NULL; if (max_channels < 2) sd[0].params.channelCount = max_channels; if (max_channels == 0) { pa_perror(EBUSY, "Portaudio device cannot open for read"); throw SndException(EBUSY); } } else { sd[1].params.device = idx; sd[1].params.sampleFormat = paFloat32; if (host_api->type == paMME) sd[1].params.suggestedLatency = (*sd[dir].idev)->defaultLowOutputLatency; else sd[1].params.suggestedLatency = (*sd[dir].idev)->defaultHighOutputLatency; sd[1].params.hostApiSpecificStreamInfo = NULL; if (max_channels < 2) sd[1].params.channelCount = max_channels; } const std::vector& rates = supported_rates[dir][(*sd[dir].idev)->name]; if (rates.size() <= 1) probe_supported_rates(sd[dir].idev); std::ostringstream ss; if (rates.size() > 1) copy(rates.begin() + 1, rates.end(), std::ostream_iterator(ss, " ")); else ss << "Unknown"; { guard_lock devices_lock(&device_mutex); device_text[dir].str(""); device_text[dir] << "index: " << idx << "\nname: " << (*sd[dir].idev)->name << "\nhost API: " << host_api->name << "\nmax input channels: " << (*sd[dir].idev)->maxInputChannels << "\nmax output channels: " << (*sd[dir].idev)->maxOutputChannels << "\ndefault sample rate: " << (*sd[dir].idev)->defaultSampleRate << "\nsupported sample rates: " << ss.str() << std::boolalpha << "\ninput only: " << ((*sd[dir].idev)->maxOutputChannels == 0) << "\noutput only: " << ((*sd[dir].idev)->maxInputChannels == 0) << "\nfull duplex: " << full_duplex_device(*sd[dir].idev) << "\nsystem default input: " << (idx == Pa_GetDefaultInputDevice()) << "\nsystem default output: " << (idx == Pa_GetDefaultOutputDevice()) << "\nhost API default input: " << (idx == host_api->defaultInputDevice) << "\nhost API default output: " << (idx == host_api->defaultOutputDevice) << "\ndefault low input latency: " << (*sd[dir].idev)->defaultLowInputLatency << "\ndefault high input latency: " << (*sd[dir].idev)->defaultHighInputLatency << "\ndefault low output latency: " << (*sd[dir].idev)->defaultLowOutputLatency << "\ndefault high output latency: " << (*sd[dir].idev)->defaultHighOutputLatency << "\n"; } LOG_VERBOSE("using %s (%d ch) device \"%s\":\n%s", dir_str[dir], sd[dir].params.channelCount, sd[dir].device.c_str(), device_text[dir].str().c_str()); sd[dir].dev_sample_rate = find_srate(dir); if (sd[dir].dev_sample_rate != req_sample_rate) LOG_DEBUG("%s: resampling %f <=> %f", dir_str[dir], sd[dir].dev_sample_rate, req_sample_rate); if (progdefaults.PortFramesPerBuffer > 0) { sd[dir].frames_per_buffer = progdefaults.PortFramesPerBuffer; LOG_DEBUG("%s: frames_per_buffer=%u", dir_str[dir], sd[dir].frames_per_buffer); } } void SoundPort::start_stream(unsigned dir) { int err; PaStreamParameters* sp[2]; sp[dir] = &sd[dir].params; sp[!dir] = NULL; LOG_INFO("\n\ open pa stream for %s:\n\ samplerate : %.0f\n\ device number : %d\n\ # channels : %d\n\ latency : %f\n\ sample Format : paFloat32", (dir == 1 ? "write" : "read"), sd[dir].dev_sample_rate, sp[dir]->device, sp[dir]->channelCount, sp[dir]->suggestedLatency); err = Pa_OpenStream(&sd[dir].stream, sp[0], sp[1], sd[dir].dev_sample_rate, sd[dir].frames_per_buffer, paNoFlag, stream_process, &sd[dir]); if (err != paNoError) { throw SndPortException(err); } if ((err = Pa_SetStreamFinishedCallback(sd[dir].stream, stream_stopped)) != paNoError) throw SndPortException(err); if ((err = Pa_StartStream(sd[dir].stream)) != paNoError) { pa_perror(err, "Portaudio stream start stream error"); Close(); throw SndPortException(err); } } int SoundPort::stream_process( const void* in, void* out, unsigned long nframes, const PaStreamCallbackTimeInfo *time_info, PaStreamCallbackFlags flags, void* data) { struct stream_data* sd = reinterpret_cast(data); #ifndef NDEBUG struct { PaStreamCallbackFlags f; const char* s; } fa[] = { { paInputUnderflow, "Input underflow" }, { paInputOverflow, "Input overflow" }, { paOutputUnderflow, "Output underflow" }, { paOutputOverflow, "Output overflow" } }; for (size_t i = 0; i < sizeof(fa)/sizeof(*fa); i++) if (flags & fa[i].f) LOG_DEBUG("%s", fa[i].s); #endif if (unlikely(sd->state == spa_abort || sd->state == spa_complete)) // finished return sd->state; if (in) { switch (sd->state) { case spa_continue: // write into the rb, post rwsem if we wrote anything if (sd->rb->write(reinterpret_cast(in), sd->params.channelCount * nframes)) sem_post(sd->rwsem); break; case spa_drain: case spa_pause: // signal the cv pthread_mutex_lock(sd->cmutex); pthread_cond_signal(sd->ccond); pthread_mutex_unlock(sd->cmutex); } } else if (out) { float* outf = reinterpret_cast(out); // if we are paused just pretend that the rb was empty size_t nread = (sd->state == spa_pause) ? 0 : sd->rb->read(outf, sd->params.channelCount * nframes); memset(outf + nread, 0, (sd->params.channelCount * nframes - nread) * sizeof(float)); // fill rest with 0 switch (sd->state) { case spa_continue: // post rwsem if we read anything if (nread > 0) sem_post(sd->rwsem); break; case spa_drain: // signal the cv when we have emptied the buffer if (nread > 0) break; // else fall through case spa_pause: pthread_mutex_lock(sd->cmutex); pthread_cond_signal(sd->ccond); pthread_mutex_unlock(sd->cmutex); break; } } return paContinue; } void SoundPort::stream_stopped(void* data) { struct stream_data* sd = reinterpret_cast(data); if (sd->rb) sd->rb->reset(); pthread_mutex_lock(sd->cmutex); pthread_cond_signal(sd->ccond); pthread_mutex_unlock(sd->cmutex); } bool SoundPort::stream_active(unsigned dir) { if (!sd[dir].stream) return false; int err; if ((err = Pa_IsStreamActive(sd[dir].stream)) < 0) { pa_perror(err, "Portaudio stream active error"); throw SndPortException(err); } return err == 1; } bool SoundPort::full_duplex_device(const PaDeviceInfo* dev) { return dev->maxInputChannels > 0 && dev->maxOutputChannels > 0; } bool SoundPort::must_close(int dir) { return Pa_GetHostApiInfo((*sd[dir].idev)->hostApi)->type != paJACK; } double SoundPort::find_srate(unsigned dir) { int sr = (dir == 0 ? progdefaults.in_sample_rate : progdefaults.out_sample_rate); switch (sr) { case SAMPLE_RATE_UNSET: case SAMPLE_RATE_AUTO: break; case SAMPLE_RATE_NATIVE: return (*sd[dir].idev)->defaultSampleRate; default: return sr; } const std::vector& rates = supported_rates[dir][(*sd[dir].idev)->name]; for (std::vector::const_iterator i = rates.begin(); i != rates.end(); i++) if (req_sample_rate == *i || (*sd[dir].idev)->defaultSampleRate == *i) return *i; pa_perror(0, "Portaudio - no supported sample rate found"); throw SndException("No supported sample rate found"); } void SoundPort::probe_supported_rates(const device_iterator& idev) { PaStreamParameters params[2]; params[0].device = params[1].device = idev - devs.begin(); params[0].channelCount = 2; params[1].channelCount = 2; params[0].sampleFormat = params[1].sampleFormat = paFloat32; params[0].suggestedLatency = (*idev)->defaultHighInputLatency; params[1].suggestedLatency = (*idev)->defaultHighOutputLatency; params[0].hostApiSpecificStreamInfo = params[1].hostApiSpecificStreamInfo = NULL; supported_rates[0][(*idev)->name].clear(); supported_rates[1][(*idev)->name].clear(); supported_rates[0][(*idev)->name].push_back((*idev)->defaultSampleRate); supported_rates[1][(*idev)->name].push_back((*idev)->defaultSampleRate); extern double std_sample_rates[]; for (const double* r = std_sample_rates; *r > 0.0; r++) { if (Pa_IsFormatSupported(¶ms[0], NULL, *r) == paFormatIsSupported) supported_rates[0][(*idev)->name].push_back(*r); if (Pa_IsFormatSupported(NULL, ¶ms[1], *r) == paFormatIsSupported) supported_rates[1][(*idev)->name].push_back(*r); } } void SoundPort::pa_perror(int err, const char* str) { if (str) LOG_ERROR("%s: %s", str, Pa_GetErrorText(err)); if (err == paUnanticipatedHostError) { const PaHostErrorInfo* hosterr = Pa_GetLastHostErrorInfo(); PaHostApiIndex i = Pa_HostApiTypeIdToHostApiIndex(hosterr->hostApiType); if (i < 0) { // PA failed without setting its "last host error" info. Sigh... LOG_ERROR("Host API error info not available"); if ( ((sd[0].stream && Pa_GetHostApiInfo((*sd[0].idev)->hostApi)->type == paOSS) || (sd[1].stream && Pa_GetHostApiInfo((*sd[1].idev)->hostApi)->type == paOSS)) && errno ) LOG_ERROR("Possible OSS error %d: %s", errno, strerror(errno)); } else LOG_ERROR("%s error %ld: %s", Pa_GetHostApiInfo(i)->name, hosterr->errorCode, hosterr->errorText); } } void SoundPort::init_hostapi_ext(void) { #if HAVE_DLOPEN && !defined(__WOE32__) void* handle = dlopen(NULL, RTLD_LAZY); if (!handle) return; PaError (*set_jack_client_name)(const char*); const char* err = dlerror(); set_jack_client_name = (PaError (*)(const char*))dlsym(handle, "PaJack_SetClientName"); if (!(err = dlerror())) set_jack_client_name(main_window_title.c_str()); # ifndef NDEBUG else LOG_VERBOSE("dlsym(PaJack_SetClientName) error: %s", err); # endif #endif } #endif // USE_PORTAUDIO #if USE_PULSEAUDIO SoundPulse::SoundPulse(const char *dev) { sd[0].stream = 0; sd[0].stream_params.channels = 2; sd[0].dir = PA_STREAM_RECORD; sd[0].stream_params.format = PA_SAMPLE_FLOAT32LE; sd[0].buffer_attrs.maxlength = (uint32_t)-1; sd[0].buffer_attrs.minreq = (uint32_t)-1; sd[0].buffer_attrs.prebuf = (uint32_t)-1; sd[0].buffer_attrs.fragsize = SCBLOCKSIZE * sizeof(float); sd[0].buffer_attrs.tlength = (uint32_t)-1; sd[1].stream = 0; sd[1].dir = PA_STREAM_PLAYBACK; sd[1].stream_params.format = PA_SAMPLE_FLOAT32LE; sd[1].stream_params.channels = 2; sd[1].buffer_attrs.maxlength = (uint32_t)-1; sd[1].buffer_attrs.minreq = (uint32_t)-1; sd[1].buffer_attrs.prebuf = (uint32_t)-1; sd[1].buffer_attrs.fragsize = (uint32_t)-1; sd[1].buffer_attrs.tlength = SCBLOCKSIZE * sizeof(float); tx_src_data = new SRC_DATA; snd_buffer = new float[sd[0].stream_params.channels * SND_BUF_LEN]; rbuf = new float[sd[0].stream_params.channels * SND_BUF_LEN]; src_buffer = new float[sd[1].stream_params.channels * SND_BUF_LEN]; fbuf = new float[sd[1].stream_params.channels * SND_BUF_LEN]; memset(snd_buffer, 0, sd[0].stream_params.channels * SND_BUF_LEN * sizeof(*snd_buffer)); memset(rbuf, 0, sd[0].stream_params.channels * SND_BUF_LEN * sizeof(*rbuf)); memset(src_buffer, 0, sd[1].stream_params.channels * SND_BUF_LEN * sizeof(*src_buffer)); memset(fbuf, 0, sd[1].stream_params.channels * SND_BUF_LEN * sizeof(*fbuf)); } SoundPulse::~SoundPulse() { Close(); delete tx_src_data; if (rx_src_state) src_delete(rx_src_state); if (tx_src_state) src_delete(tx_src_state); delete [] snd_buffer; delete [] src_buffer; delete [] fbuf; delete [] rbuf; } int SoundPulse::Open(int dir, int freq) { const char* server = (progdefaults.PulseServer.length() ? progdefaults.PulseServer.c_str() : NULL); char sname[32]; int err; sample_frequency = freq; src_data_reset(1 << O_RDONLY | 1 << O_WRONLY); if ((unsigned)freq != sd[dir].stream_params.rate) Close(dir); sd[dir].stream_params.rate = freq; snprintf(sname, sizeof(sname), "%s (%u)", (dir ? "playback" : "capture"), getpid()); setenv("PULSE_PROP_application.icon_name", PACKAGE_TARNAME, 1); sd[dir].stream = pa_simple_new( server, // server address main_window_title.c_str(), // application name sd[dir].dir, // playback / record NULL, // device (default) sname, // system description &sd[dir].stream_params, // sample format NULL, // channel map (default) &sd[dir].buffer_attrs, // buffering attributes &err); // return address for error code if (!sd[dir].stream) throw SndPulseException(err); return 0; } void SoundPulse::Close(unsigned dir) { if (dir == 1 || dir == UINT_MAX) flush(1); Abort(dir); } void SoundPulse::Abort(unsigned dir) { unsigned start, end; if (dir == UINT_MAX) { start = 0; end = 1; } else start = end = dir; for (unsigned i = start; i <= end; i++) { if (sd[i].stream) { pa_simple_free(sd[i].stream); sd[i].stream = 0; } } } void SoundPulse::flush(unsigned dir) { int err = PA_OK; if ((dir == 1 || dir == UINT_MAX) && sd[1].stream) { // wait for audio to finish playing MilliSleep(SCBLOCKSIZE * 1000 / sd[1].stream_params.rate); pa_simple_flush(sd[1].stream, &err); } if ((dir == 0 || dir == UINT_MAX) && sd[0].stream) { // We need to flush the captured audio that PA has been // buffering for us while we were transmitting. We will use // pa_simple_get_latency() which, contrary to the docs, also // works for capture streams. It tells us how much earlier the // data that would be returned by pa_simple_read() was actually // captured, and we read and discard all that data. pa_usec_t t = pa_simple_get_latency(sd[0].stream, &err); if (t && err == PA_OK) { size_t bytes = pa_usec_to_bytes(t, &sd[0].stream_params); while (bytes > SND_BUF_LEN) { pa_simple_read(sd[0].stream, snd_buffer, SND_BUF_LEN, &err); if (err != PA_OK) break; bytes -= SND_BUF_LEN; } if (bytes) pa_simple_read(sd[0].stream, snd_buffer, bytes, &err); } } } size_t SoundPulse::Write(double* buf, size_t count) { if (ofGenerate) write_file(ofGenerate, buf, NULL, count); if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } // copy input to both channels for (size_t i = 0; i < count; i++) if (progdefaults.sig_on_right_channel) fbuf[sd[1].stream_params.channels * i] = fbuf[sd[1].stream_params.channels * i + 1] = buf[i]; else if (progdefaults.ReverseAudio) { fbuf[sd[1].stream_params.channels * i + 1] = buf[i]; fbuf[sd[1].stream_params.channels * i] = 0; } else { fbuf[sd[1].stream_params.channels * i] = buf[i]; fbuf[sd[1].stream_params.channels * i + 1] = 0; } return resample_write(fbuf, count); } size_t SoundPulse::Write_stereo(double* bufleft, double* bufright, size_t count) { if (sd[1].stream_params.channels != 2) return Write(bufleft, count); if (ofGenerate) write_file(ofGenerate, bufleft, bufright, count); if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } for (size_t i = 0; i < count; i++) { if (progdefaults.ReverseAudio) { fbuf[sd[1].stream_params.channels * i + 1] = bufleft[i]; fbuf[sd[1].stream_params.channels * i] = bufright[i]; } else { fbuf[sd[1].stream_params.channels * i] = bufleft[i]; fbuf[sd[1].stream_params.channels * i + 1] = bufright[i]; } } return resample_write(fbuf, count); } size_t SoundPulse::resample_write(float* buf, size_t count) { int err; float *wbuf = buf; if (progdefaults.TX_corr != 0) { if (txppm != progdefaults.TX_corr) { txppm = progdefaults.TX_corr; tx_src_data->src_ratio = 1.0 + txppm / 1e6; src_set_ratio(tx_src_state, tx_src_data->src_ratio); } tx_src_data->data_in = wbuf; tx_src_data->input_frames = count; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SND_BUF_LEN; tx_src_data->end_of_input = 0; if ((err = src_process(tx_src_state, tx_src_data)) != 0) throw SndException(src_strerror(err)); if (tx_src_data->output_frames_gen == 0) // input was too small return count; wbuf = tx_src_data->data_out; count = tx_src_data->output_frames_gen; } if (!active_modem) return count; if (pa_simple_write(sd[1].stream, wbuf, count * sd[1].stream_params.channels * sizeof(float), &err) == -1) throw SndPulseException(err); return count; } long SoundPulse::src_read_cb(void* arg, float** data) { SoundPulse* p = reinterpret_cast(arg); int err; int nread = 0; if ((nread = pa_simple_read(p->sd[0].stream, p->snd_buffer, p->sd[0].stream_params.channels * sizeof(float) * p->sd[0].blocksize, &err)) == -1) { LOG_ERROR("%s", pa_strerror(err)); *data = 0; return 0; } *data = p->snd_buffer; return p->sd[0].blocksize; } size_t SoundPulse::Read(float *buf, size_t count) { if (ifPlayback) { read_file(ifPlayback, buf, count); if (!ofCapture) { flush(0); if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } } size_t n = 0; long r = 0; if (progdefaults.RX_corr != 0) { if (rxppm != progdefaults.RX_corr) { rxppm = progdefaults.RX_corr; sd[0].src_ratio = 1.0 / (1.0 + rxppm / 1e6); src_set_ratio(rx_src_state, sd[0].src_ratio); } sd[0].blocksize = SCBLOCKSIZE; while (n < count) { if ((r = src_callback_read(rx_src_state, sd[0].src_ratio, count - n, rbuf + n)) == 0) break; n += r; } } else { int err; if ((r = pa_simple_read(sd[0].stream, rbuf, sd[0].stream_params.channels * sizeof(float) * count, &err)) == -1) throw SndPulseException(err); } // transfer active input channel; left == 0, right == 1 size_t i = 0; if (sd[0].stream_params.channels == 2) n = progdefaults.ReverseRxAudio; else n = 0; while (i < count) { buf[i] = rbuf[n]; i++; n += sd[0].stream_params.channels; } if (ofCapture) write_file(ofCapture, buf, NULL, count); return count; } void SoundPulse::src_data_reset(int mode) { int err; if (mode & 1 << O_RDONLY) { if (rx_src_state) src_delete(rx_src_state); rx_src_state = src_callback_new(src_read_cb, progdefaults.sample_converter, sd[0].stream_params.channels, &err, this); if (!rx_src_state) throw SndException(src_strerror(err)); sd[0].src_ratio = 1.0 / (1.0 + rxppm / 1e6); } if (mode & 1 << O_WRONLY) { if (tx_src_state) src_delete(tx_src_state); tx_src_state = src_new(progdefaults.sample_converter, sd[1].stream_params.channels, &err); if (!tx_src_state) throw SndException(src_strerror(err)); tx_src_data->src_ratio = 1.0 + txppm / 1e6; } } #endif // USE_PULSEAUDIO size_t SoundNull::Write(double* buf, size_t count) { if (ofGenerate) write_file(ofGenerate, buf, NULL, count); if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) { return count; } MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } size_t SoundNull::Write_stereo(double* bufleft, double* bufright, size_t count) { if (ofGenerate) write_file(ofGenerate, bufleft, bufright, count); MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count ? count : 1; } size_t SoundNull::Read(float *buf, size_t count) { if (ifPlayback) read_file(ifPlayback, buf, count); else memset(buf, 0, count * sizeof(*buf)); if (ofCapture) write_file(ofCapture, buf, NULL, count); if (!bHighSpeed) MilliSleep((long)ceil((1e3 * count) / sample_frequency)); return count; } void SoundNull::flush(unsigned) { if (ofGenerate) sf_close(ofGenerate); } fldigi-4.2.05/src/soundcard/checkout.cxx0000664000175000017500000027476014611711171015105 00000000000000#define CHECKOUT_SIZE 11424 int int_audio_checkout[CHECKOUT_SIZE] = { -2, -1, 5, -258, -122, -154, -294, -219, -271, -234, -260, -243, -253, -249, -246, -260, -229, -289, -38, -58, -263, -266, -156, 10, 25, -134, -83, -21, -317, -165, -121, -112, -186, -287, -219, -276, -226, -270, -232, -265, -235, -262, -240, -256, -248, -245, -263, -223, -300, -78, -214, -160, -132, -45, -88, -125, 53, -34, 24, -17, 12, -8, 4, 0, -1, 2, -3, 4, -5, 6, -6, 3, 0, -3, 7, -12, 20, -39, 148, 67, 41, 296, 222, 268, 233, 275, 125, 127, 63, -66, 105, 107, 166, 278, 138, -72, 139, 89, 13, 285, 215, 43, -150, -248, 17, -11, 32, 301, 21, 85, 131, -32, 9, 1, -8, 8, 145, 62, -65, 99, 120, 5, -20, 26, -29, 28, -24, 18, -7, -15, -163, -115, -92, 34, -9, -11, 38, -204, -21, -361, -106, -444, 27, -929, 218, -2795, -171, 4311, -4495, 1126, 1644, -2751, 268, -2027, 2804, -872, -1618, 1728, -1493, -1131, -1936, 3635, -1361, -1380, -419, -3253, 5219, -2809, -2438, 3322, -2402, -628, 1133, -1437, -69, 550, -1577, 333, 38, -1317, -97, -136, -471, 40, -1008, 545, -768, -102, -1557, -4310, 5340, -1340, -3339, 4159, -3170, -175, 2002, -2386, 705, 730, -1397, 245, 870, -751, -385, 1125, 286, -2043, 2071, 1885, -4422, 3781, 39, -3190, 4409, -2744, 446, -338, 166, 1208, -2306, 1083, 1086, -1258, -1102, 3602, -4251, 2539, 26, -7065, 8304, -3004, -10612, 9143, -337, -4857, 5161, -3724, 573, 2304, -3527, 3708, 2296, -3069, -157, 38, 3539, -4162, -986, 1727, 1384, -1123, -2017, 2752, -324, -5502, 5511, 1650, -9192, 12584, -7326, -1704, 8610, -4484, 1308, 3413, -3318, 517, -1165, -4356, 14961, -8006, -1524, 5083, -13042, 6390, 1851, -4203, -1337, 2287, -2347, -42, 658, -3568, 6823, -8757, 5522, 4054, -9501, 5797, 4338, -9747, 5894, 1517, -5217, 3455, -1034, 1688, -5520, 8061, -4997, -608, 3061, -3766, 6377, -5458, -2953, 10207, -8512, -1090, 9148, -10271, 4762, 1225, -6817, 7993, -4667, -1512, 8032, -9284, 4364, 2400, -7243, 7624, -1223, -6397, 8641, -3416, -2869, 5475, -2791, 1736, -1656, -310, 6416, -10303, 6621, 5633, -14493, 12723, 72, -4105, 9333, -2986, 1115, 5807, -7445, 5179, 575, -3710, 6847, -4550, 834, 2583, 421, -2705, 1508, 5324, -8496, 1714, 12352, -16053, 8000, 1994, -7300, 8698, -8687, 8823, -8239, 4383, 6166, -12431, 8666, 413, -7168, 4484, 2886, -5014, 4604, -944, -6595, 9243, -3550, -5066, 5411, 1243, -4750, 4468, -3286, -7320, 23124, -23329, 12227, 17448, -26505, 25613, -5843, -16284, 20760, -6489, -11542, 19320, -12138, -2358, 15409, -19964, 8326, 7343, -15287, 13652, -5231, -10805, 16796, -6821, -6716, 11103, -9512, -1277, 14375, -14505, -2913, 10951, -3825, -7593, 9879, -4712, -6323, 15625, -16772, 13619, -300, -17095, 24445, -15638, -7647, 23657, -17787, -1049, 17515, -21120, 8510, 12493, -23727, 10250, 11994, -23413, 13750, 7083, -25561, 22862, -3109, -14125, 17173, -14526, 2791, 13345, -25442, 14916, 13032, -30109, 26373, -2302, -16135, 24645, -9372, -15417, 23603, -9891, -16787, 30440, -22114, 6850, 12562, -21726, 21696, -15706, 2367, 10770, -18794, 18212, -7891, -7698, 12892, -1867, -5171, -2535, 5019, 614, -1997, -9483, 15201, -9755, -4133, 16443, -18574, -487, 14889, -5214, -14003, 21165, -3558, -4722, -2460, 1769, 6277, -8853, -2249, 9280, -3658, -11380, 19151, -11722, -9877, 17417, -9048, -9552, 17915, -14217, 5404, -851, -1708, 7284, -12601, 15204, -8937, -4020, 13842, -9728, -78, 5431, -2160, 875, -11308, 15825, -10478, -4045, 18381, -23590, 13504, 1679, -9297, 6572, -7826, 13424, -11626, -1277, 16798, -16810, 7508, 4845, -6909, 3382, -1861, 5577, -8974, 4699, 7676, -18217, 8958, 8501, -13427, 3925, 3524, -4463, 3647, -2698, 973, -402, 4528, -4337, -431, 5666, -8707, 11928, -11587, 2673, 7653, -12050, 9801, -6826, 5732, -2133, -3331, 6723, -4119, 6266, -3201, -4417, 4198, 3350, -2585, -4151, -2024, 16363, -13523, -1819, 9386, -8661, 13445, -14085, 6890, 1945, -1697, 4312, -11511, 8810, 2887, -6693, 3130, 526, -1629, 2970, -3845, 2484, -1876, 117, 2670, -86, -4296, 5275, 1529, -7176, 3707, 833, -821, -2335, -23, 3758, -1520, -96, -666, 3610, 716, -3503, 1996, -3581, 1926, 600, -598, -4676, 9089, -5003, -3338, 4575, -869, 4416, -7755, 7447, 923, -2498, -1415, 3031, 4699, -6142, 6268, -2652, -1419, 10250, -8534, 3624, -3630, 6665, 1620, -10597, 8663, -85, 4577, -7970, 1860, 7912, -6832, 1087, 672, -1016, 2775, -4908, 4443, -5385, 7101, -1455, -8809, 14376, -7259, 4170, -3232, -40, 1691, 3069, 5512, -15918, 7173, 12540, -6108, -13814, 8278, 12616, -14639, 3809, 4063, -6496, 2129, 5156, -5296, -10679, 12796, 3844, -19565, 5700, 18274, -13348, -8499, 9664, 8431, -12771, 1510, 6040, -13188, 13201, 1355, -15269, 1201, 16068, -955, -21979, 11289, 15784, -13974, -1941, 5764, -2135, -1440, 1088, -1363, -2988, 7869, 2095, -13552, 4789, 12430, -8504, -6164, 4336, 2423, 86, -1537, -4564, 51, 7723, -2378, -7168, 2845, 4084, 1016, -7123, 4670, 4517, -4293, -23, -1261, 6322, -2195, -1265, 246, -2737, 7404, -473, -6627, 7623, 3153, -4988, 1147, -1097, 4386, -2425, -1603, 3742, -5772, 8715, -4476, -10095, 13211, -2929, -4968, -467, 2636, 3469, -8666, 2643, 5164, -6529, 381, 7649, -5958, -3209, 7426, 1722, -2763, -4122, 7175, 915, -12840, 8097, 4723, -8362, 368, 2851, 4408, -3947, 1031, 5252, -4494, 2729, 1915, -3636, 1223, 1298, 638, -2294, -2349, 4879, -2214, -3115, 6033, 1649, -3475, 3691, 3920, -4183, 5013, 6651, -1358, -491, 5929, 4324, -2416, -640, 4125, 232, -3997, 1982, -929, -2966, 1273, 409, -3783, 295, 3350, -137, -489, 851, 4182, 203, -1898, 2374, 2146, 1326, 1897, 1182, 3174, 1683, 1027, 629, -1130, 3525, -175, -3333, 259, -528, -590, -966, -3899, -1405, 205, -2994, -3742, -2429, -1469, -3880, -5717, -3834, -2679, -4964, -6916, -5979, -4062, -4230, -6618, -6869, -3430, -2010, -5250, -4999, -1990, -447, -1940, -1939, 32, -965, -1082, -2508, -2289, -1740, -2669, -5288, -4041, -1694, -3885, -3156, -2209, -529, -254, 736, 1856, 3882, 3775, 4660, 6175, 5318, 7206, 7742, 7525, 7914, 9728, 9845, 10547, 12391, 14410, 11765, 13669, 22130, 24146, 23609, 24040, 591, -2954, 29164, 7143, -31925, -13262, 3877, -16063, -31682, -25506, -7934, -18260, -25903, -12233, -7513, 896, 3395, -1773, 4260, 15104, 15915, 4791, -749, 9848, 6441, -10303, -13311, -10291, -12940, -19941, -26613, -22012, -16198, -19514, -21870, -17629, -7499, -4386, -10288, -6762, 1530, 2487, -2427, -5423, -1916, -1314, -7969, -12069, -10367, -9915, -11571, -13621, -12632, -9973, -7865, -6674, -5255, -2049, 1300, 2514, 1125, 3374, 5554, 5896, 4458, 3035, 4578, 3338, 2775, 1921, 1083, 3381, 4909, 4355, 7651, 7962, 11537, 11780, 11473, 12866, 18510, 20337, 17759, 18547, 25035, 28574, 27427, 13741, -32000, 9886, 29840, -28056, -30969, 38, 2414, -25315, -31906, -4779, 9171, -14170, -2558, 5461, 9632, 22947, 14452, 4129, 6642, 17383, 14208, -12687, -17740, -112, -9447, -23855, -27194, -17103, -10521, -16445, -16695, -7909, 548, 6528, 3129, 1607, 10203, 12650, 4854, -1298, -348, -473, -8526, -14747, -14179, -15487, -15991, -16439, -17793, -13584, -7416, -5733, -5278, -1072, 3920, 3791, 2786, 3838, 2372, -718, -2503, -5609, -7034, -6637, -8437, -8439, -5367, -2791, -1343, -159, 4803, 9471, 6876, 8667, 14314, 12871, 8965, 9786, 12813, 7299, 1290, 6162, 9293, 847, 1510, 9563, 7530, 3791, 6738, 9424, 10349, 12938, 17532, 20949, 17277, 20068, 1787, -12369, 12917, 6541, -24211, -20262, -4090, -5653, -17621, -16025, -228, 2809, 3008, 8003, 6653, 9965, 15703, 10062, 516, -778, 3472, -1810, -14147, -16334, -11082, -10397, -12995, -12531, -6780, -1114, 1336, 3754, 3867, 6041, 8823, 5257, -1341, -2133, -1697, -7351, -10648, -9851, -10534, -12377, -10430, -8694, -8150, -4660, -907, 460, -411, 1187, 3220, 1058, -2839, -1997, -1710, -5703, -7734, -8051, -7759, -7914, -5745, -5421, -4508, 248, 5270, 6462, 6541, 9288, 10799, 11367, 9308, 8353, 8940, 6607, 4166, 3800, 2022, 1188, 916, 1557, 5236, 6300, 5586, 7347, 9268, 11416, 9625, 7821, 10164, 12903, 14884, 16150, 14689, 15947, 9157, -14005, -8892, 7894, -4847, -24261, -16919, 606, -2034, -7098, -1183, 6271, 10173, 14868, 10825, 3343, 6153, 8549, 59, -11826, -10981, -6681, -9892, -14083, -12667, -7056, -924, 2382, 686, 3357, 8083, 8616, 4379, -868, -1429, -1336, -5116, -9538, -10621, -10001, -7698, -4743, -4728, -4563, 368, 3490, 764, -2167, -1167, -1960, -4154, -5983, -7634, -7260, -7020, -6785, -6559, -2643, -1471, -991, 502, -321, -327, 1277, 157, -1045, 2206, 3816, 1815, 1642, 6110, 7398, 6903, 7567, 8157, 6691, 9899, 7739, 2380, 3622, 8107, 6045, 113, 5500, 7903, 2977, 4004, 8371, 7821, 9109, 11999, 14080, 22062, 25951, 22051, 6333, -25751, -4480, 15168, -19132, -31681, -12603, 3768, -3453, -170, 6125, 9043, 21013, 24151, 8574, -4349, 3536, 4249, -13147, -22770, -17129, -10862, -8204, -6155, -5205, 589, 13178, 12670, 4451, 6119, 7977, 948, -8168, -10448, -11895, -13055, -11225, -9553, -6255, -2756, 1079, 2216, 6215, 9003, 5367, -2083, -6121, -5025, -9669, -15841, -16575, -12393, -7456, -4040, -3573, -558, 4494, 5363, 1908, -1392, -3058, -3382, -7066, -9255, -7269, -2356, 405, 1104, 4524, 6989, 7650, 8423, 7451, 2766, 1029, 3024, 3464, 3406, 3891, -208, 2372, 6811, 7936, 2695, 10227, 15055, 7176, 7875, 15221, 16637, 8822, 15033, 27260, 24658, 11864, -24929, -28161, 26071, 620, -32000, -13507, 9028, 10855, 9917, 12368, -1013, 11242, 29358, 5626, -24767, -14217, -640, -9068, -19735, -14633, -5776, 6958, 15458, 4558, -3187, 9689, 15828, -2519, -20986, -19852, -7946, -4704, -9832, -14258, -6933, 9375, 15338, 3835, -1875, 5741, 9003, -3099, -16692, -20752, -10248, -2340, -8591, -14008, -6823, 6402, 7255, -673, -7333, -4816, 167, -5731, -15051, -12630, -5346, -2280, -4333, -6550, -3604, 5571, 7867, -2125, -7042, 330, 4351, -2362, -7992, -4592, -502, 1658, 2902, 2506, 7952, 15164, 15363, 7663, 10059, 13147, 10673, 3518, 1537, 3454, 5919, 4708, 9740, 16157, 15308, 23625, 29031, 31581, 17213, -28237, -25068, 26960, -6475, -32000, -20223, 3365, 13161, 17238, 17653, -4131, 18449, 30978, 5720, -26340, -19919, -5353, -14461, -20583, -19546, -8716, 11575, 22817, 8875, -521, 12142, 18127, -7583, -21699, -21465, -17613, -9081, -8205, -11171, -6967, 11295, 16108, 5115, -250, 3669, 3370, -7834, -16987, -19292, -14914, -5265, -516, -5079, -3455, 5543, 6061, -964, -5435, -7015, -8261, -9371, -12098, -11395, -6934, -1848, 289, -2056, 774, 4856, 3031, -732, -3438, -4580, -2732, -1025, -3504, -5041, -3119, 2689, 2862, 3425, 8470, 13110, 14006, 9881, 9574, 7955, 13643, 12792, 6319, 4226, 10421, 16658, 9223, 11566, 21711, 21996, 26038, 31998, 8916, -29107, -22860, 15186, -6862, -31997, -18771, 2735, 12487, 14918, 14996, -669, 13110, 25573, 6872, -21236, -20925, -8381, -11925, -16310, -16250, -9756, 5786, 15533, 8323, -2068, 1609, 6360, -6506, -10812, -17116, -18389, -9779, -4188, -8278, -10006, 1110, 4983, 954, -2738, -1008, -2611, -6630, -11080, -14098, -11639, -4848, -942, -5244, -5911, 860, 2083, -2544, -5962, -7064, -7032, -6192, -5189, -7746, -7872, -3139, -1312, -2733, -2740, 1269, 1343, -625, -2564, -3107, 193, 968, -757, -1165, 461, 1353, 2349, 5341, 4798, 4961, 11195, 9126, 9348, 16221, 16306, 10018, 15442, 16009, 12778, 21943, 19711, 12277, 17011, 26395, 21983, 12084, 3192, -13800, -20401, -1028, -1699, -19948, -16389, 4106, 10697, 3515, 5741, 7817, 8657, 9176, 4185, -8412, -13464, -7458, -7023, -14532, -15380, -4900, 1101, -2455, -1978, -4779, -3723, 3475, -1408, -10202, -11436, -5727, -6054, -10091, -10810, -9133, -7094, -3853, -5117, -9349, -8200, -4482, -6166, -10251, -7225, -2824, -3779, -6768, -5279, -5292, -5034, -3404, -6023, -8248, -6072, -2935, -3390, -4139, -1575, 328, -531, -464, 64, -1885, -2860, -827, -1045, -1843, -458, 1888, 4041, 3694, 3937, 4799, 6444, 7197, 5884, 7291, 9666, 11277, 7283, 6889, 11737, 11673, 11570, 11066, 12410, 18667, 20346, 22833, 23363, 19524, 17889, 15142, 10486, -249, -5754, -7098, -9523, -10710, -8804, -7082, -6437, -787, 3490, 2974, 2618, 4736, 4602, 771, -1717, -3274, -6988, -8081, -7451, -9526, -10724, -10398, -9670, -7492, -6363, -6293, -7184, -5254, -3411, -5135, -8354, -7483, -4768, -7308, -10522, -10021, -8560, -10230, -12056, -10507, -6689, -5895, -6076, -4740, -2488, -2782, -3392, -3153, -4836, -5671, -6134, -7058, -8019, -7563, -6229, -3890, -2871, -957, 462, 2124, 3493, 1947, -41, 853, 3708, 2624, -659, 484, 3922, 4749, 4914, 3857, 6985, 8040, 8409, 8354, 9398, 7964, 9971, 12120, 7907, 5296, 9660, 14207, 5540, 2707, 9214, 16475, 9344, 4652, 10232, 19730, 15421, 7912, 11501, 19898, 17945, 2296, 1750, 7580, 6607, -7900, -10464, -4676, -3235, -9285, -10398, -5834, -3759, -3734, -4017, -2243, -2045, -24, -2171, -4616, -7028, -4375, -5652, -8827, -11231, -8183, -6181, -8113, -8744, -7611, -3916, -4187, -5373, -6847, -5116, -5715, -7692, -9088, -7573, -5622, -6781, -7721, -5003, -2573, -3276, -3383, -1858, -1112, -1454, -779, -1865, -2336, -1482, 117, -939, -877, 1916, 3121, 2658, 3545, 4482, 3259, 4944, 4708, 3971, 4817, 4829, 4931, 4601, 4362, 4620, 5696, 5332, 3732, 2940, 3981, 4231, 2567, 1604, 2501, 2317, 645, 784, 2347, 2936, 2258, 1465, 1027, 1354, 1132, 1518, 92, -812, 1370, 1720, 291, -541, 938, 1336, 491, 583, 920, 785, 345, 237, 305, 534, 486, 439, 308, 706, 779, 90, -263, 150, -849, -2025, -2024, -2388, -2881, -3323, -3224, -3148, -2524, -2949, -3322, -2653, -2182, -2524, -3242, -3395, -3304, -3365, -4213, -4460, -4541, -4280, -4195, -3916, -3948, -3933, -3549, -3895, -3395, -3305, -3731, -3794, -3646, -3647, -3562, -3516, -3345, -3246, -2804, -2458, -2476, -2211, -2427, -2294, -2083, -2207, -2630, -2628, -2114, -1747, -1546, -1555, -1686, -1122, -916, -1649, -2032, -1866, -1548, -1447, -1810, -1834, -1233, -962, -773, -737, -758, -750, -621, -426, -661, -563, -245, -144, 90, 133, 121, 354, 382, 373, 332, 55, 227, 169, -46, 68, 256, 416, 232, -91, 137, 384, 253, 405, -179, -53, 286, 222, 64, -54, 203, 3, 11, -22, -314, -562, -375, 408, 334, 259, 577, 422, 646, 710, 625, 602, 520, 410, 256, 24, 19, -169, -40, 25, -201, -534, -362, 19, -189, -434, -582, -542, -631, -553, -463, -125, -246, 62, 77, 56, 345, 126, -133, -73, 445, 293, -255, -132, 233, 262, 100, -257, -242, -246, -307, -529, -677, -796, -698, -612, -704, -983, -283, 203, -97, 143, 250, 487, 507, 326, 145, 109, 125, -249, -519, -15, -81, -521, -57, 267, 289, 503, 513, 177, 96, 485, 153, 100, 135, -298, -175, 112, 257, 65, 251, 238, 504, 385, 230, 514, 485, 514, 483, 521, 464, 634, 614, 646, 485, 508, 490, 515, 447, 216, 453, 517, 484, 518, 468, 698, 963, 603, 457, 609, 626, 446, 544, 443, 352, 490, 532, 386, 382, 541, 473, 521, 477, 530, 436, 348, 515, 514, 376, 398, 546, 468, 333, 561, 822, 656, 502, 657, 540, 467, 330, 114, -7, 5, -96, -336, -50, 276, 462, 511, 497, 497, 506, 491, 509, 490, 288, 225, 275, 221, 282, 207, 362, 510, 500, 501, 340, 457, 539, 422, -22, 162, 286, 221, 274, 227, 271, 415, 258, 252, 194, 76, 325, 178, 444, 490, 519, 476, 525, 472, 533, 414, 94, 133, 125, 109, -69, 179, 38, 66, 298, 414, 242, 266, 212, 416, 465, 334, 515, 324, 395, 389, 553, 461, 531, 469, 536, 424, 247, 235, -15, 141, 89, -149, -89, 34, -28, 43, 220, 413, 519, 493, 499, 507, 484, 531, 394, 251, 184, 107, 108, -46, 31, 146, 100, 278, 19, 416, 319, 228, 263, 53, 281, -62, -142, -118, 29, -33, 157, 270, 245, 243, 268, 215, 319, 381, 275, 374, 412, 287, 91, 120, 1, -104, -112, 24, 0, -14, 34, -152, -254, 97, 277, 248, 145, 140, 528, 7, 85, 119, 159, 226, 55, 338, 173, 324, 172, 333, 158, 359, 33, 73, -156, -74, -3, 13, -11, 5, 0, 0, -62, -67, 684, 212, 270, 15, 703, -739, 686, -2102, -910, -3050, -7506, 4897, 5405, -6833, -2067, 6493, -2903, -4200, 4362, 2107, -3913, 0, 2741, -949, -2765, 485, 1378, -1852, -1851, 850, 548, -1098, -384, 721, -432, -28, 72, 1193, 1130, 1007, 1651, -3007, -5893, -3941, 7178, 3484, 3354, -4968, -9888, 9678, -2081, -19394, 6485, 12436, -17638, -165, 16802, -5873, -1492, 12820, -16461, -13779, 20416, -28, -21296, -243, 5082, -12290, -2908, 8267, -5705, -7818, 5638, -3318, -13840, 3238, 5405, -3996, 2833, 6230, 2431, 4827, 753, -4806, 3089, 1686, -2859, 2454, 333, -7019, -425, -361, -5635, 1380, 2651, -2208, 2416, 3788, 24, 750, 2707, 3454, 1101, 1038, 2291, 1095, -4066, -1335, 239, -3798, -2409, 597, -725, -1077, 1806, 1469, 936, 1705, 2910, 1753, 1021, 2050, 1736, 445, 976, 1945, -1291, -555, 916, -1083, -1373, -54, -710, -2142, 166, -597, -887, 93, -345, -679, 277, 213, -179, -183, -791, -741, -144, -882, -1276, -659, -979, -1666, -824, -519, -2271, 339, -913, -1797, 1600, 1522, -55, 3275, 3938, 2041, 4525, 4492, 4689, 5906, 6218, 6680, 8408, 7402, 8857, 11827, 10653, 12336, 13707, 13982, 14611, 15942, 14507, 18433, 19889, 18267, 20781, 19409, 16803, 10771, 14063, 8350, 1331, -625, -3067, -6874, -12464, -13414, -16774, -14464, -18063, -16475, -13738, -11133, -10321, -7984, -2570, -958, 2877, 2251, 4602, 5623, 5750, 2768, 1812, 1208, -2964, -7062, -12116, -13400, -15318, -18981, -23113, -21145, -19071, -21080, -20012, -15914, -11633, -11125, -9475, -4639, -1223, -1650, -1074, 1901, 2064, 151, -1519, -806, -1267, -3147, -3355, -1890, -176, 1191, 3412, 6169, 11583, 14859, 17911, 22024, 27207, 29478, 29909, 29603, 29902, 29561, 30083, 27535, 17771, 17203, 6990, -2528, -8193, -14132, -20756, -25227, -26023, -27291, -22754, -22535, -15937, -11259, -3124, 1149, 6726, 12779, 15347, 18532, 17553, 16979, 13500, 10685, 1766, -1121, -9646, -14173, -18805, -25118, -26686, -25660, -24122, -25938, -18751, -14347, -9947, -8622, -2083, -229, 507, 1574, 516, 1, -2518, -4868, -9056, -9525, -13631, -16361, -17985, -15946, -16441, -15823, -11707, -8615, -5537, -2687, 399, 2112, 6313, 6176, 6583, 8259, 10399, 9520, 8644, 12648, 13695, 13447, 14139, 20736, 21632, 23889, 28220, 30915, 26468, 23229, 25623, 17884, 8625, 162, -2936, -10030, -16615, -23431, -22871, -20511, -21017, -19825, -13363, -3940, -1271, 3803, 8517, 15095, 15271, 14965, 12916, 11230, 7107, -573, -7700, -11525, -12715, -22260, -24339, -21088, -21518, -20209, -14427, -11226, -5747, 800, 2717, 4831, 8432, 8569, 4707, 2441, 893, -5888, -12043, -11855, -16354, -21553, -21526, -19551, -19098, -17577, -14105, -10196, -7199, -4862, -3714, -2135, 182, -956, -3157, -1641, -1803, -4571, -4580, -770, 231, 2449, 4825, 8856, 16249, 20636, 20913, 25597, 30407, 29100, 30468, 28892, 30849, 26223, 22854, -419, -34, 6462, -22098, -32000, -19569, -16883, -31829, -23733, -11033, 119, 1959, 9484, 15170, 25096, 27952, 15763, 11794, 14174, 9050, -9422, -16661, -18014, -18683, -28520, -29250, -21388, -14079, -12921, -7811, 952, 9277, 14225, 10750, 13655, 17250, 11364, 352, -1324, -5791, -12668, -19516, -23665, -22270, -19128, -19073, -18620, -11032, -4797, -4356, -3568, 1489, 1253, -2190, -5154, -7068, -9791, -12283, -15866, -16167, -13451, -11444, -11300, -7161, -529, 3506, 6800, 10878, 15344, 19428, 22210, 18867, 22607, 28471, 24272, 21112, 27689, 28661, 30955, 25409, 15005, -5574, -4587, 12072, -12956, -32000, -15066, -975, -18887, -20261, -3948, 8645, 10666, 9822, 11631, 17999, 23213, 10257, -2098, 1163, 3577, -9889, -19510, -17400, -11895, -12849, -15123, -11680, -1853, 4334, 2863, 1872, 8479, 10159, 4423, -1333, -1900, -2737, -8837, -13365, -13833, -11201, -10336, -8315, -6354, -2380, 533, 3082, 1767, -950, -911, -3375, -10584, -12955, -11945, -16913, -20101, -16533, -13860, -13988, -10297, -6776, -3125, 88, 3242, 3153, 3884, 6255, 7300, 5471, 4678, 8450, 9808, 9361, 10793, 16470, 20443, 23164, 28020, 30302, 29181, 30605, 22107, 16365, 8203, -12544, -12482, -13117, -28059, -27024, -13961, -8871, -6179, 4373, 16752, 21782, 24948, 24708, 16762, 12213, 5752, -7733, -18134, -19790, -20352, -23883, -21617, -12325, -5442, 866, 8749, 11484, 13334, 15562, 10889, -1004, -3172, -2133, -11970, -21216, -17797, -12569, -12196, -9624, -4144, 3362, 9519, 10480, 6721, 5630, 3800, -2685, -12876, -18613, -20478, -21785, -22198, -19996, -15649, -8963, -3466, -2171, -356, 3047, 3962, 734, -320, 485, -775, -3206, -1727, -510, 1980, 7727, 9665, 12071, 16964, 18864, 27976, 30108, 29584, 29858, 29680, 28924, 12962, -272, -12474, -18299, -16923, -21180, -25080, -12867, 2503, 7021, 10789, 19249, 25372, 23667, 16512, 6018, -3066, -9874, -16300, -24487, -23907, -16481, -9275, -4776, 2133, 9827, 13878, 14422, 10298, 3536, -1618, -6819, -18884, -19032, -13277, -16158, -13897, -3848, 1241, 2853, 7688, 7678, 4845, 4878, 2642, -3964, -9046, -12609, -16582, -14143, -12704, -17648, -14349, -7142, -6508, -7295, -5021, -5046, -6499, -5738, -7933, -8682, -6128, -4211, -4048, -3410, 2105, 3290, 3467, 5599, 6625, 9457, 13723, 15332, 11806, 17253, 24609, 27536, 30014, 29595, 29425, 19748, 7109, -8600, -25220, -13317, -9962, -23803, -17822, 2141, 12326, 11720, 17716, 17975, 16791, 15399, 5330, -11790, -18416, -13964, -18087, -20998, -12723, -1605, 5105, 10476, 13023, 10389, 8916, 7201, -2602, -13330, -13364, -16871, -21388, -8830, -1756, -4969, -112, 10240, 7591, 2234, 3050, -1604, -7907, -7677, -7980, -12037, -10601, -7136, -4830, -3696, -3646, -9155, -9274, -8376, -11154, -12405, -11746, -9796, -7211, -3571, -3316, -3203, -1208, 381, -1798, -2793, -207, 1279, 2296, 4467, 6613, 11193, 13641, 19181, 18215, 22845, 29907, 29767, 29463, 30364, 16767, -4524, -9799, -27802, -22807, -12625, -17730, -13457, 6032, 20365, 17144, 21397, 19605, 12453, 5731, -1310, -17993, -26598, -20670, -16985, -13408, -3804, 7723, 11857, 16434, 16816, 9122, 36, -4950, -12023, -19287, -18722, -20059, -12423, -1102, 4885, 5788, 6751, 9569, 4181, -1146, -8110, -11559, -13846, -13247, -10506, -6758, -1162, 1396, 3675, 2043, -2313, -7684, -11864, -16932, -18410, -13600, -11059, -9333, -4114, 47, -665, -2289, -3219, -5249, -3701, -2040, -327, 1441, 5246, 7044, 11732, 13231, 13850, 15379, 19888, 28559, 29642, 30031, 29316, 29585, 11356, -39, -21493, -32000, -13878, -6480, -11244, -8654, 15750, 20094, 26025, 26170, 10033, -2158, -2311, -7278, -25184, -27846, -21764, -11997, 729, 12905, 13143, 12340, 16617, 13260, -245, -11208, -19145, -26055, -17873, -19450, -12699, 4567, 10318, 10071, 8667, 8071, -2035, -4700, -9606, -18478, -18810, -11153, -6885, -3830, 3055, 2264, 550, 3533, -1243, -12905, -18458, -19694, -18078, -12672, -8665, -9060, -5596, -126, 320, -2299, -4087, -6539, -5437, -602, 1739, 240, 3455, 7977, 12651, 14275, 14447, 17041, 20313, 26810, 30347, 29260, 30355, 27443, 12497, -6389, -29763, -27310, -11775, -3209, -5356, 2531, 19430, 20699, 30892, 22750, 509, -13570, -11816, -16100, -24157, -19881, -18172, -4325, 13066, 22168, 16114, 10041, 5954, -2775, -8623, -15080, -23722, -24372, -13019, -8553, 3462, 13875, 10237, 6687, 4569, 258, -8586, -10427, -15657, -17868, -9886, -2684, -582, 548, 3508, 1157, 1592, -456, -9733, -19854, -21571, -14047, -9386, -6864, -6993, -7354, -3656, 1155, -102, -5832, -8052, -6297, -1329, 3450, 4983, 3653, 4796, 9545, 15138, 16428, 15978, 17661, 22999, 29721, 29400, 30127, 29392, 21432, -1967, -28522, -29707, -17752, -4327, 1199, 7248, 13830, 15979, 29511, 27001, 5211, -13791, -20212, -22359, -18334, -11251, -15941, -8196, 8897, 21623, 21309, 14737, 2067, -10704, -14028, -14739, -17057, -18466, -15382, -13506, 4852, 16172, 12806, 6267, -1189, -5611, -7972, -7151, -14612, -17636, -12099, -2780, 3248, 5909, 2263, -5184, -3520, -1175, -7630, -18044, -20820, -17397, -10411, -3281, -4161, -8929, -7745, -1720, 256, -799, -4930, -9182, -4638, 2584, 5640, 5725, 5765, 8396, 14917, 17638, 18427, 16899, 22046, 29056, 29583, 30044, 29364, 26463, -3048, -32000, -27018, -18125, -5738, 10004, 13074, 9502, 9065, 28609, 26402, 7500, -9699, -26375, -30473, -18666, -2658, -7388, -3752, 5618, 12780, 19883, 20934, 4327, -16170, -21719, -19836, -14335, -9380, -14370, -10958, 4036, 11910, 15383, 9041, -4301, -13354, -10308, -10099, -10860, -10466, -11318, -7053, 498, 4855, 1907, -2891, -6002, -9153, -10723, -13099, -14553, -14831, -11602, -6519, -5023, -4212, -4260, -4064, -4662, -3564, -3218, -2756, -1959, 1588, 4294, 8153, 10194, 12741, 13934, 15726, 20425, 24286, 29018, 30001, 29623, 29804, 28359, -694, -31449, -28487, -25185, -4251, 17084, 17355, 9091, 2212, 28556, 23875, 15040, -2496, -27472, -30881, -23974, -2850, -1921, 6192, 5353, 5137, 14535, 21366, 10553, -10164, -21799, -29164, -21267, -10707, -7466, -2477, 2988, 6126, 10773, 11571, 3610, -6488, -11310, -15766, -14038, -9993, -7877, -7562, -4234, -390, 1438, 3181, 62, -5618, -11609, -13690, -14489, -12246, -9244, -8673, -7959, -6649, -2393, -1561, -836, -1254, -2076, -1549, 1444, 3999, 5693, 10554, 12525, 14864, 19953, 24268, 27996, 29109, 29662, 29970, 29391, 28631, -6350, -31997, -28626, -25901, -776, 20530, 24620, 6040, 2846, 22163, 16500, 18737, 4785, -23141, -31542, -25050, -12207, -1233, 14226, 10553, 2959, 9593, 18005, 11811, -59, -12642, -29536, -27761, -20352, -12873, 3264, 7076, 5297, 5461, 8688, 4215, 477, -2034, -14384, -18510, -16233, -10848, -8542, -973, -1815, -4828, -2717, -942, 208, -2840, -6871, -15194, -16467, -12599, -8189, -4583, -2935, -4757, -5959, -1748, 1586, 2941, 3950, 2292, 1891, 5736, 12633, 17867, 21865, 24679, 28305, 29890, 29801, 29516, 30253, 13000, -24391, -30327, -30578, -21978, 8328, 23893, 19322, 6764, 11649, 15357, 17898, 21072, 1178, -24649, -30576, -28872, -20234, -740, 12463, 9401, 7570, 12410, 14793, 12935, 7284, -8165, -26266, -28341, -29918, -15838, -1304, 5768, 5488, 4100, 6158, 2718, 7568, 1913, -8953, -18686, -20992, -19168, -11827, -2425, -2559, -4407, -5303, -2893, -309, 2533, -974, -9964, -13913, -15127, -11986, -5397, -2555, -4082, -3505, -1730, -398, 4955, 7541, 6648, 8102, 11782, 14063, 21173, 26188, 28828, 29726, 29796, 29748, 28064, 5413, -28071, -29842, -30498, -18008, 4894, 17033, 15063, 7166, 13851, 16038, 21323, 20416, 4802, -18117, -30495, -29787, -26597, -8631, 4826, 6923, 8557, 9841, 12567, 12811, 12833, 1245, -15587, -27166, -30088, -19819, -7227, 3429, 5526, 2441, -805, 2399, 7633, 4789, -326, -11478, -20916, -20750, -15892, -10055, -7086, -4750, -6671, -4554, 76, 1351, 1949, -1282, -6699, -10548, -10401, -10202, -6781, -2876, -2199, -772, 2531, 6811, 11679, 18984, 22075, 22336, 23328, 25556, 28186, 28912, 30993, 19757, -875, -23729, -31507, -27517, -13184, 6071, 8668, 11366, 4396, 7238, 16893, 24050, 24776, 10608, -7138, -25830, -30124, -24593, -14198, -4141, -1409, -699, 1913, 7260, 15009, 16988, 14359, 1165, -11575, -23411, -27119, -16147, -9169, -1806, -1933, -1946, -3076, 2625, 8564, 6541, 4585, -7729, -14746, -17521, -15615, -12610, -10407, -7992, -10468, -6574, -3533, -682, 2430, 2480, 511, -2727, -2806, -3424, -798, 2236, 3769, 7615, 10569, 15934, 21826, 28712, 29939, 29687, 29578, 18871, 1104, -19538, -29752, -26572, -17385, -10794, -3945, -524, -208, 7643, 18257, 25375, 26750, 21209, 6984, -8263, -15627, -19147, -19142, -14973, -13485, -12748, -8873, -2281, 4677, 12066, 15918, 12869, 6764, -947, -6468, -10297, -15759, -12179, -12178, -12850, -9308, -7768, -3424, -1053, 4512, 2186, 338, -2073, -7079, -7236, -9585, -9807, -11899, -11824, -10711, -9992, -6349, -5156, -2500, -30, 2716, 6697, 9499, 13701, 14908, 15940, 15588, 16597, 20315, 25470, 27134, 20022, 11886, -4200, -16476, -17440, -16194, -11513, -7700, -5414, -7195, -5308, 3401, 10500, 18782, 22860, 18488, 9354, 44, -6000, -10847, -10496, -9416, -12246, -14243, -14332, -11547, -4856, 4710, 11647, 12602, 10125, 5753, -329, -3938, -2731, -4026, -9052, -8841, -12460, -15944, -10544, -7004, -3551, 76, 2397, 877, -2536, -1209, -2973, -4299, -2349, -5060, -7684, -8706, -8718, -7779, -5079, -1334, 22, 889, 3686, 6471, 9931, 15227, 19302, 21333, 22717, 22304, 18389, 13066, 6210, -3212, -10649, -12560, -14421, -13587, -9607, -7209, -5892, -2862, 1739, 5957, 10767, 14527, 14917, 10781, 6252, 2436, -1568, -3297, -3319, -5955, -9489, -11993, -13404, -12496, -8572, -2682, 1101, 2974, 4101, 3967, 2666, 3566, 4836, 3034, 712, -1946, -6550, -9703, -10459, -10052, -8125, -6304, -5152, -4331, -3448, -2115, -916, -430, -9, 36, -1109, -2319, -2893, -3689, -4027, -3779, -2791, -1170, 324, 1469, 3720, 6221, 7584, 10511, 14059, 16469, 18432, 18341, 16161, 12644, 5744, -992, -3758, -5076, -6930, -8349, -9669, -11127, -11109, -8759, -3701, 2064, 5897, 7418, 7483, 7102, 6366, 5937, 5781, 5005, 3582, 763, -2363, -3989, -4163, -3599, -3140, -3101, -4173, -5254, -5016, -4433, -2719, -1195, -448, 152, 716, 883, 701, 846, 1235, 1708, 1914, 1572, 155, -1319, -2680, -3259, -3109, -2500, -1384, -1267, -2268, -3290, -3774, -2735, -1787, -1508, -2178, -3448, -3731, -3103, -1967, -791, -306, -747, -639, -160, 680, 1561, 2318, 1979, 1524, 1459, 1797, 2329, 3345, 3828, 3750, 4076, 3944, 4398, 4464, 4565, 4274, 3462, 1848, 407, -633, -1785, -2789, -3282, -3225, -3429, -3864, -3863, -3530, -3027, -2864, -3291, -3204, -3628, -3864, -3893, -3242, -3002, -2831, -2222, -1776, -851, -13, 721, 1178, 1209, 755, 775, 722, 789, 997, 991, 1036, 789, 428, 252, -176, -468, -834, -1312, -1852, -2375, -2527, -2190, -1843, -1715, -1462, -1697, -1692, -1599, -1620, -1388, -1235, -1276, -1148, -835, -151, 364, 952, 1921, 3041, 3706, 4693, 5512, 5760, 6163, 5920, 5482, 4667, 4160, 3664, 3249, 2526, 1843, 973, 511, 212, -86, 8, -895, -1320, -2105, -2615, -2632, -2734, -2585, -2734, -2945, -3332, -3422, -2719, -2114, -1170, -233, 61, -247, -115, 432, 976, 1662, 1736, 1511, 962, 694, 506, 505, 481, 544, 133, -316, -640, -758, -82, 463, 480, 609, 780, 463, 658, 559, 505, 83, -951, -1573, -2200, -2747, -2758, -2718, -2492, -2380, -1828, -1220, -908, -625, -496, -526, -769, -739, -747, -846, -1248, -1174, -962, -833, -532, -179, -57, 50, 83, -35, 138, 159, 378, 690, 1350, 1936, 2179, 2359, 2642, 2844, 2965, 3202, 2989, 3042, 2532, 2234, 2248, 2264, 2154, 1611, 1367, 689, 200, -353, -672, -1330, -1889, -2391, -2583, -2919, -2986, -2733, -2598, -1934, -1655, -1040, -747, -623, -198, -4, 17, -61, -281, -55, -250, -250, -244, -265, -74, 68, 394, 535, 472, 525, 475, 524, 458, 20, -110, -562, -616, -809, -812, -833, -882, -958, -892, -897, -1063, -952, -1013, -557, -376, -628, -626, -612, -717, -799, -596, -425, -1101, -1096, -1179, -1204, -1022, -771, -605, -497, -208, -120, 338, 228, 576, 423, 46, -25, -356, -351, -687, -747, -866, -864, -964, -901, -472, -542, -316, -195, 36, -53, -151, -110, -328, -557, -988, -1247, -1688, -1890, -1876, -1982, -2044, -1861, -1754, -1428, -1254, -1043, -1751, -2351, -1732, -1228, -384, -1672, -3097, -3348, -2010, 732, 2223, 2480, 1782, 2207, 3636, 5189, 6562, 6582, 5694, 4637, 4714, 4970, 4341, 2907, 993, -438, -1157, -1605, -2875, -4068, -5158, -5208, -4543, -3842, -3731, -3765, -3352, -2068, -695, -147, 254, 437, 1359, 1932, 2190, 2356, 2520, 2487, 2524, 2149, 1837, 1338, 821, 233, -667, -1250, -1649, -1786, -2296, -2675, -2749, -2389, -2079, -1646, -1124, -393, 114, 394, 544, 932, 1345, 1432, 1535, 1838, 1756, 1386, 1395, 968, 581, 403, 156, -295, -543, -1887, -3036, -3349, -3876, -3827, -4163, -3847, -3420, -3565, -3668, -3831, -3321, -2953, -2460, -1516, -494, -218, -277, -126, 39, 294, 666, 1649, 2592, 3403, 3812, 4742, 6017, 7185, 8291, 9223, 9560, 9290, 8942, 8077, 7035, 5325, 3794, 2154, 530, -1010, -2714, -3532, -4460, -5486, -5649, -5364, -4911, -4163, -2974, -1790, -516, 805, 1797, 2590, 3241, 3775, 3975, 4027, 3735, 3041, 2387, 1313, 293, -293, -1325, -1894, -2542, -3105, -3465, -3740, -3756, -3750, -3696, -3311, -2750, -2008, -1195, -585, -101, 57, 555, 152, -1, -212, -409, -456, -1083, -1533, -2071, -2754, -3595, -4240, -4912, -5419, -5781, -5561, -5300, -4799, -3887, -3091, -2228, -1225, -303, 828, 2143, 3411, 4517, 5515, 6775, 7862, 8888, 9895, 11087, 11774, 11656, 10841, 9818, 8828, 6765, 5037, 3372, 1448, -1166, -3285, -4033, -5630, -6556, -5856, -5208, -5086, -3978, -2882, -2306, -1766, -339, 609, 880, 2201, 2889, 2280, 2291, 2404, 1059, -140, -615, -1386, -2818, -3268, -3535, -4106, -4632, -4761, -4868, -5019, -4318, -3800, -3500, -3117, -2816, -2719, -2683, -2156, -2214, -2519, -2765, -3105, -3506, -3962, -4255, -5021, -5233, -5421, -5515, -5511, -5128, -4592, -3941, -3252, -2456, -1585, -661, 395, 1640, 3308, 4648, 6234, 7413, 8645, 9840, 10949, 11730, 12734, 13637, 13771, 13678, 12934, 11169, 8632, 5229, 2256, -233, -3058, -3814, -3557, -3794, -4739, -5265, -5970, -6144, -4673, -3221, -2099, -995, 256, 817, 1332, 1714, 1459, 1239, 1052, 346, -302, -1271, -1772, -2051, -2891, -2830, -3133, -3680, -4192, -4479, -4500, -4652, -4276, -3694, -3262, -3250, -3248, -3256, -3230, -3450, -4055, -4403, -4710, -4843, -5032, -4974, -5102, -5475, -5491, -5521, -5260, -4850, -4067, -3317, -2512, -1137, 18, 650, 1925, 2994, 3773, 4931, 6282, 7623, 8555, 9647, 10262, 11265, 12004, 13014, 14144, 15044, 15127, 15036, 14331, 11532, 8008, 3934, 702, -2619, -4593, -5214, -5708, -6274, -6524, -6238, -6258, -6033, -5151, -3759, -2596, -1285, 332, 1134, 1844, 2201, 2015, 1680, 600, -248, -1343, -2498, -3473, -4106, -4580, -4971, -5531, -5778, -6109, -6323, -6192, -6289, -5750, -5135, -4330, -4004, -3414, -3460, -3517, -3538, -4186, -4224, -4904, -5266, -5492, -6118, -6285, -6178, -6012, -5788, -5152, -4286, -3679, -3099, -2194, -1153, -629, 99, 993, 1835, 2908, 3454, 4299, 5396, 6395, 7086, 7829, 8768, 9600, 11224, 12513, 14301, 16337, 17862, 18725, 18795, 17904, 15100, 10792, 6041, 1717, -2579, -5275, -6722, -7343, -8089, -8774, -8787, -8953, -7988, -6997, -5777, -4317, -2640, -865, 460, 2090, 3031, 3732, 4025, 3211, 1831, 170, -1475, -3197, -4312, -5272, -6416, -6936, -7279, -7725, -7787, -7571, -7264, -6770, -6107, -5072, -4200, -3530, -3158, -2958, -2591, -2931, -3393, -3622, -4184, -5437, -6503, -6915, -7042, -6977, -6671, -6052, -5394, -3905, -3223, -2407, -1267, -738, 257, 791, 1532, 2369, 3057, 3824, 4043, 4615, 5667, 5880, 6605, 7693, 8661, 10100, 11637, 13333, 15235, 17225, 19191, 20746, 21433, 21297, 18482, 13799, 7936, 1223, -4587, -8462, -10316, -12152, -12560, -11073, -10661, -10352, -8763, -7693, -6292, -4128, -2510, -716, 1458, 3457, 5138, 6489, 7277, 6749, 5493, 3295, 751, -2378, -5352, -7673, -10063, -10613, -11066, -11036, -10310, -9513, -8256, -7004, -5898, -4759, -3819, -3003, -2604, -2058, -1465, -1541, -1564, -2112, -2871, -3835, -5276, -6426, -7359, -8122, -7630, -7328, -6462, -4476, -2860, -938, 529, 1298, 1569, 1438, 2043, 2067, 2370, 3217, 3421, 4341, 5265, 5455, 6469, 7445, 7889, 9512, 10750, 12850, 14919, 17173, 20245, 22748, 24710, 25499, 24329, 20574, 15051, 7814, -13, -6959, -12044, -15801, -17274, -17178, -16483, -15072, -12627, -10034, -8123, -5512, -3342, -1644, 754, 3841, 6151, 8479, 10234, 10898, 10044, 7832, 4595, -189, -4861, -9308, -13152, -16579, -17455, -17703, -16958, -14250, -12270, -9944, -7459, -5569, -4138, -3273, -2360, -1676, -1344, -849, -1402, -2151, -3077, -4647, -6497, -8208, -9826, -10421, -10606, -9622, -7791, -5790, -3035, -927, 758, 1486, 1815, 1536, 1499, 1590, 1880, 2452, 2813, 3297, 3669, 4465, 5301, 6187, 7411, 8950, 10607, 12706, 14944, 17410, 20537, 23610, 26344, 28578, 28159, 24890, 19457, 11276, 1760, -7209, -14244, -19652, -22149, -21961, -20435, -17292, -13371, -9548, -6629, -3582, -461, 1875, 4478, 7410, 10229, 12513, 14131, 14273, 12264, 8237, 2939, -3447, -10049, -15792, -20671, -22304, -22708, -21088, -17265, -13830, -9230, -5557, -2950, -657, 41, 785, 1073, 539, 787, -429, -1822, -3199, -5700, -7848, -10140, -11491, -12074, -11505, -9405, -7372, -4198, -730, 1339, 2839, 3633, 3769, 3197, 2969, 3018, 2622, 2647, 2542, 2629, 3665, 4291, 5441, 7180, 8449, 10772, 12731, 14965, 17388, 19736, 22715, 26069, 28888, 29960, 29315, 24683, 17715, 7447, -4365, -13771, -21124, -25065, -26004, -23336, -19318, -14962, -9568, -5520, -2661, 814, 3503, 6328, 9874, 13217, 15925, 16725, 16078, 12232, 5620, -2174, -9583, -18153, -23117, -25852, -26429, -23315, -20569, -14562, -10060, -5893, -1993, -567, 1398, 2211, 2149, 2465, 1231, 319, -1855, -4792, -7430, -10871, -12449, -13285, -12858, -10916, -8642, -5593, -2854, -882, 1057, 1945, 2888, 3144, 2826, 2917, 2625, 2269, 2133, 1478, 1833, 2422, 3572, 5904, 8703, 11678, 14658, 17168, 19169, 20637, 22515, 24276, 27926, 29920, 29562, 29965, 21993, 13880, -1395, -16523, -23563, -29659, -28928, -24803, -16281, -10854, -7401, -1946, -1026, -352, 4639, 8378, 13167, 18400, 21171, 20094, 13416, 6574, -4704, -16347, -22257, -26527, -27032, -23670, -19463, -15891, -12646, -10457, -8375, -7139, -3108, 961, 3223, 6340, 6207, 3816, -1149, -7244, -12998, -16349, -16925, -15913, -12693, -8923, -6646, -4891, -3946, -3749, -3608, -2777, -1038, 60, 907, 955, -978, -2729, -4454, -5437, -4603, -1904, 1156, 4292, 7552, 10754, 12666, 15577, 18340, 20313, 23682, 26730, 29213, 29638, 29996, 29316, 30589, 17234, 4715, -9645, -27360, -29571, -29168, -22250, -16351, -7614, -3656, -6706, -3161, 630, 3964, 14816, 23746, 26874, 24289, 16670, 5115, -10084, -18541, -21017, -22326, -18111, -13286, -13367, -14376, -16184, -15023, -14237, -5714, 4104, 9731, 14617, 12683, 5555, -3271, -9402, -13373, -14324, -10984, -9506, -10439, -10904, -13792, -14644, -12068, -5958, 210, 5055, 7833, 4252, -1675, -6502, -10510, -10185, -7363, -4271, -2867, -3850, -5424, -7250, -5015, 60, 6619, 13123, 18823, 20638, 19914, 19304, 19537, 20715, 26310, 29368, 30130, 29190, 30868, 23363, 14, -11957, -26462, -30229, -22378, -13937, -8639, -10580, -7170, -11257, -8391, 5689, 17570, 26496, 30062, 25639, 10509, -5373, -12762, -16420, -16355, -9759, -9209, -15314, -20229, -21848, -20576, -11632, 3076, 11076, 12004, 8843, 1446, -7750, -7180, -2895, -676, 503, -3180, -13392, -22253, -23374, -19500, -11232, -936, 4070, 998, -2297, -6462, -7764, -4733, 848, 1677, -1859, -7194, -14479, -18271, -15014, -7442, -1898, 1648, 1315, -1832, -3165, 914, 7524, 15494, 20438, 22419, 18389, 16504, 16127, 20198, 27891, 30167, 29390, 30345, 22460, -2653, -13593, -22144, -20093, -12716, -8729, -10879, -21054, -15850, -10949, 2032, 19426, 27426, 25344, 14958, 6665, -412, -3637, 471, -1278, -10653, -19135, -25860, -26293, -18406, -4487, 4458, 4383, 4889, -1367, -3186, 217, 6165, 7110, -597, -2772, -13531, -17345, -14353, -11449, -8832, -10299, -7925, -10402, -8532, -575, 1980, 3791, 1002, -3083, -7883, -9411, -5436, -6855, -7659, -10166, -13808, -13870, -9242, -1957, -161, 2187, 2719, 1263, 3967, 9955, 15298, 17274, 18736, 18137, 15915, 19814, 26951, 29865, 29597, 30058, 25461, 1156, -9530, -11745, -15097, -10365, -11719, -14473, -22988, -15305, -800, 7293, 17796, 19011, 13802, 8087, 8858, 11145, 4969, -861, -9034, -19299, -21655, -16390, -11066, -9861, -8209, -5450, -5481, 2002, 7874, 7385, 4502, -1154, -626, -7388, -3485, -1196, -10738, -13060, -15394, -13962, -11732, -5901, -2132, -7118, -4443, -1021, -802, 1735, 907, -1982, -8022, -7322, -6053, -9203, -9334, -10666, -11839, -8763, -3790, -564, 275, 2985, 5723, 8574, 13806, 17785, 19093, 18833, 20415, 22141, 27215, 29201, 29760, 29306, 22407, 3923, -7434, -7849, -11249, -10359, -14017, -15822, -18360, -11607, 2368, 7673, 10185, 11621, 11479, 12087, 14286, 12196, 3384, -7136, -9850, -11108, -11661, -11246, -14067, -16381, -13898, -4858, -67, 976, 3912, -551, 290, 2887, 4441, 1358, -6255, -4240, -9250, -11618, -9125, -11432, -14829, -13702, -8336, -6350, -5524, -2979, -2423, -3687, -71, 1269, -2259, -4799, -5888, -6728, -7648, -7193, -7887, -10024, -8668, -3943, -1367, 1187, 5202, 7920, 11250, 15594, 20172, 21285, 22314, 26577, 28901, 29367, 29988, 24327, 9611, -1415, -3320, -6938, -12297, -15806, -19975, -19676, -12170, -2592, 707, 614, 5101, 11667, 16169, 18012, 14092, 5406, -522, -1443, -3073, -8370, -13563, -16318, -16461, -13149, -8582, -8050, -8541, -3652, 2421, 2241, 1735, 2708, 2774, 1451, 696, 671, -4749, -9735, -9231, -10265, -13765, -12482, -11071, -11439, -9006, -5806, -3937, -2913, -960, 445, 134, -440, -971, -2503, -4016, -5151, -6516, -7711, -8207, -6773, -3340, -62, 2026, 5019, 9746, 14688, 17355, 20073, 23643, 27532, 29353, 29774, 29310, 22033, 11962, 6152, 1873, -4857, -10736, -16507, -19220, -17785, -14496, -11562, -8791, -4814, 1367, 7913, 11408, 13118, 12836, 12486, 11255, 9069, 4308, -978, -4764, -7316, -10087, -13447, -15933, -15247, -12375, -10777, -9876, -8761, -5356, -394, 2137, 1833, 2963, 3401, 3289, 2571, -250, -4277, -6311, -7086, -8860, -10506, -11250, -10992, -9819, -7160, -5909, -4379, -2444, -242, 947, 1253, 1585, 900, 709, 678, -508, -1647, -792, 695, 1777, 2994, 4653, 5633, 7903, 11466, 14078, 15152, 16465, 19010, 19652, 18606, 17790, 15278, 11760, 9129, 6775, 3197, -714, -3187, -5799, -7149, -7075, -7434, -7918, -7378, -6115, -4648, -3049, -1493, -524, -154, 566, 1659, 2043, 1993, 1418, 529, 532, 423, 100, -1104, -2138, -2690, -3327, -3473, -3559, -3399, -3876, -4165, -4044, -4054, -4596, -4483, -3747, -4583, -4178, -3248, -3384, -3339, -2881, -2310, -2042, -1259, -992, -1204, -1371, -1702, -1759, -1860, -1881, -1997, -2546, -2312, -2236, -2551, -2486, -2390, -1941, -1339, -572, -3, 432, 647, 1288, 1780, 2022, 2611, 3126, 3800, 4145, 4441, 4264, 4229, 4282, 4196, 4481, 4426, 4147, 3866, 3597, 2979, 2444, 1652, 659, 26, -774, -1755, -2237, -2573, -3274, -3213, -3465, -3765, -3734, -3773, -3656, -3448, -3352, -3389, -3208, -3278, -3223, -3286, -3127, -3133, -3314, -3181, -3519, -3362, -3545, -3571, -3083, -2997, -2725, -2232, -1700, -1199, -666, -158, 285, 385, 585, 299, 124, 36, -273, -286, -596, -1161, -1305, -1678, -1933, -1750, -1884, -1839, -1589, -1157, -479, 285, 888, 1558, 2155, 3038, 3810, 4225, 4537, 4457, 4363, 4389, 4066, 3962, 4047, 3564, 3159, 2831, 2497, 2524, 2303, 2258, 2026, 1224, 1029, 825, 506, 501, 339, -202, -963, -1195, -1707, -2202, -2285, -2645, -2601, -2712, -2772, -2924, -2677, -2433, -2326, -2087, -1988, -1724, -1785, -1705, -1815, -1507, -1612, -1500, -1190, -1284, -1105, -699, -507, -461, -55, 166, 54, -16, 128, 364, 369, 93, 135, 19, -57, -212, -444, -713, -879, -1028, -1252, -1234, -1095, -1157, -811, -247, -287, 155, 591, 896, 1276, 1517, 1483, 1527, 1366, 1400, 1572, 1300, 1075, 1239, 1267, 1258, 1690, 1924, 2419, 2306, 2525, 2757, 2623, 2867, 2788, 2495, 2555, 2280, 1850, 1479, 1068, 836, 470, 479, 244, 105, -562, -733, -992, -1433, -1340, -1769, -1799, -2220, -2291, -2534, -2635, -2273, -2240, -2057, -2296, -1877, -1446, -1089, -1007, -910, -737, -275, 50, -41, 57, -277, -388, -438, -678, -812, -981, -1394, -1700, -1701, -1595, -1819, -1666, -1494, -1195, -1308, -1141, -711, -305, 101, -129, 127, 247, 318, 249, 402, -70, -216, 39, -357, 82, 77, -181, 239, 387, 597, 1009, 1119, 1272, 1366, 1487, 1368, 1154, 1116, 970, 783, 500, 665, 514, 623, 833, 574, 692, 759, 748, 766, 1042, 809, 751, 645, 445, 556, 319, 444, 151, -179, -45, 41, -51, 116, 238, 305, 492, 528, 419, 247, 231, 338, 524, 54, -108, -458, -800, -1154, -1628, -1672, -2087, -1890, -1872, -2031, -1929, -1720, -1376, -1101, -1011, -951, -641, -260, -282, -87, 0, -364, -539, -669, -485, -521, -753, -746, -750, -757, -591, -413, -242, -232, 365, 365, 236, 566, 437, 575, 309, 284, 133, 5, -54, -252, -262, -228, -281, -6, 343, 544, 450, 649, 581, 466, 526, 473, 527, 471, 506, 60, 28, -44, 54, -60, 65, -66, 58, 37, 561, 420, 576, 432, 548, 618, 568, 473, 300, 272, 152, 293, -95, 187, -3519, -134, 41, 66, -958, -2158, 1809, -332, 309, -51, 759, 181, 1083, 730, -745, 626, 363, -207, -518, -134, -422, -593, -452, -728, -993, -169, -258, -369, -176, -5, -90, 94, 512, 191, 23, 405, -43, 72, 12, 322, -165, -397, 148, -446, -30, -955, -468, -776, -523, -168, -718, -458, -520, -492, -591, -201, -929, -742, -1333, -663, -341, -724, -674, -663, -419, -528, 136, -595, -228, -230, -540, -332, -510, -513, -1030, 75, -762, -858, -327, -2478, -1177, -121, -747, -385, -1446, -847, 666, -1349, -406, 870, -340, 75, -94, 441, -667, -595, 278, 217, 202, -189, -341, 36, 62, -834, 285, -1227, 1070, -891, -459, 879, -1860, 381, -615, 543, -792, -211, 316, -1253, 1016, -475, -369, 242, -487, 1323, -1435, 1011, -324, -74, 156, -140, 333, -759, 346, -926, 414, -735, 402, -1086, 717, -1041, 113, 392, -402, 272, -405, 119, -314, 354, -238, 90, -83, 302, -618, -2, 756, -450, 990, -362, -211, 547, -1372, 1488, -1054, 374, -249, 721, -1761, 1587, -661, 1426, 1289, -1250, 573, -291, 1809, -1035, 1803, -1134, 2229, -2301, 2242, -2444, 1880, -645, 116, 977, -2413, 1100, -2553, -362, -2744, 1874, -2264, 2005, -1893, 1081, -1842, 536, -858, -157, 715, -1354, 796, -1362, 420, -1681, 1665, -1509, 782, -1600, 824, -1163, 418, -960, 402, -698, 81, -547, -70, 404, -2234, 2001, -2291, 1597, -662, 653, -1286, 639, -528, 1319, -333, 584, 727, -1437, 2399, -1083, 1518, -1301, 1954, -1472, 792, 992, -871, 855, -717, 1493, -1483, 2515, -754, -229, 1306, -504, 539, 344, 501, 154, 739, -1236, 2230, -845, 248, 1684, -1345, 1107, 262, 282, 1144, -454, 360, 600, -47, 893, -355, 37, 1696, -1092, 1208, 876, -2182, 3160, -2527, 2608, -1093, -975, 2361, -3559, 3585, -3267, 2503, -1756, 364, 645, -954, 583, -2735, 3098, -3891, 2923, -2392, 165, 446, -1752, 114, 747, -1708, -751, 754, -1354, 447, -112, -41, -1894, 3017, -4733, 3146, -3027, -450, 489, -2132, 1125, -2589, 915, -2851, 896, -2230, 1027, -1968, 838, -587, -2507, 3688, -4748, 2982, -3132, 939, -522, -468, 2, -878, 1334, -6219, 7620, -8130, 5684, -4854, 350, 2104, -4173, 3261, -4598, 4256, -4285, 4050, -4850, 2461, -1916, 350, 914, -1716, 1208, -1452, 588, -541, -556, -1013, 1787, -2133, 160, 827, -947, 517, -511, -1208, 2138, -3276, 4642, -6007, 4118, -1856, 3402, -1460, -1791, 2583, -6675, 7051, -7606, 5476, -7116, 6314, -5636, 3253, 215, -3086, 4750, -6041, 6579, -6082, 5636, -4443, 3063, -836, -142, 202, -155, -1799, 3434, -2475, 4052, -1310, 712, 2076, -5080, 5839, -5430, 7259, 1831, 1055, -10599, 4806, -539, 2545, -4515, 5860, -2815, 1280, 2249, -3770, 4191, -4999, 8517, -5328, 4292, -3708, 2652, -4015, 3940, -2802, 1952, -2360, 802, 271, 417, -554, -814, 1242, -2313, 5598, -7516, 7259, -5683, 2953, -368, -63, 1045, -1594, 1097, -1389, 1687, -2799, 3317, -2759, 1350, 52, -1281, 1778, -3622, 1988, -2448, 1647, -2504, 2974, -2668, 469, -42, -1634, 2948, -3499, 2434, -3156, 4519, -3722, 2724, -1068, -1034, 515, -447, 719, -730, 1433, -719, 1477, -2820, 3742, -1699, -131, 691, -439, 795, -646, 1173, -1180, 1054, -1313, 2580, -2795, 2994, -1911, 136, 1053, -994, 3533, -5655, 4764, -2328, 2360, -2129, 576, -629, -1633, 3114, -2601, 998, -1244, 911, 241, 410, -630, -110, -404, 983, -717, -1150, 679, -923, 1083, -1733, 712, -268, 257, -1113, 991, -1119, 922, -604, 304, -148, -2092, 3518, -6937, 8073, -7378, 6385, -5848, 1741, 2247, -5147, 6542, -8180, 6747, -7110, 5455, -3455, 1794, -461, -2248, 2571, -1360, -300, -1049, -283, 582, -151, -1763, 2646, -4233, 4621, -2281, 1333, 915, -3235, 3270, -2003, 1115, -1658, 818, 380, -3157, 2337, -2080, 740, -96, -333, -211, -1673, 1792, -3644, 3729, -4247, 1127, 480, -3459, 5074, -7944, 5121, -2889, 1003, -2043, 236, -1141, 1413, -1387, -1245, 2291, -4872, 5092, -5841, 5740, -5040, 4500, -4820, 3809, -794, -1010, 1321, -2208, 6387, -6885, 6324, -5440, 4656, -4210, 2913, -264, -1336, 2084, -2399, 3394, -3566, 5804, -6212, 6306, -4161, 1805, 1498, -2858, 5204, -4825, 4881, -5020, 5321, -5790, 5701, -4516, 2906, -1733, 1176, 2918, -5794, 8602, -10465, 10667, -9762, 9543, -5909, 2709, 1639, -2856, 5325, -7661, 6179, -6607, 4778, -3169, 1254, -2011, 2176, 573, -788, 864, -1037, 3496, -2668, 2534, 1561, -2308, 3490, -1101, 3126, -149, 454, -1150, 2363, -1842, -330, -108, -3180, 2313, -3732, 5802, -6741, 5362, -3429, 1161, 2354, -3486, 2197, -4567, 4130, -4467, 3526, -1784, -1050, 1534, -2903, 4950, -4685, 1781, -1603, -59, 1687, -2979, 1689, -2123, -103, 112, -350, -1793, 837, -2707, 1646, -1760, 1400, -750, -1059, -71, -917, 619, -319, -388, -951, 1448, -3423, 3508, -4998, 2599, -1922, 249, -354, -710, -435, -2015, 1526, -1993, 1965, -2452, 2494, -2656, 1961, -3382, 4820, -5756, 5248, -3338, -98, 3485, -7122, 9337, -10427, 6925, -4745, 1441, -520, -846, 1318, -2659, 847, 361, -1365, -1429, 1428, -3019, 3104, -4541, 5106, -4672, 3646, -3183, 2192, -1318, -1001, 3600, -4903, 3844, -3223, 4505, -5223, 5320, -4035, 413, 166, -678, 727, -2844, 2911, -3805, 3897, -4036, 2823, -644, -1194, 2453, -2315, 1198, -544, -28, 377, -682, 231, -1269, 925, -954, -702, 230, -1428, 605, -1184, -576, 342, -2597, 548, -1429, -3267, -3061, -2517, -546, -2697, -202, -1023, 726, -3569, 932, -3547, -803, -229, -2912, 379, -2542, 559, -1737, 652, -2378, -744, -2145, 786, -1859, -379, -369, -1259, -574, -2182, 582, -3281, 2046, -2614, 644, -833, -1719, 1126, -3404, 2035, -1584, 225, -145, -1474, 600, -1962, 742, -950, 986, -301, -220, -158, 341, 100, -899, 1313, -906, 2317, -212, 1153, 51, -275, 448, 220, 1567, 374, 2293, 925, 1283, 160, 1366, 93, 264, 416, 926, 743, 288, 1357, -42, 1359, -250, 911, 95, -197, 970, 961, 1545, 1366, 1501, 1148, 627, 18, 344, 851, 1667, 1171, 570, 491, 71, -651, -2053, -1560, -1650, -2076, -2229, -2660, -3401, -4015, -3646, -4913, -4610, -4409, -3968, -3246, -3133, -3193, -2644, -3301, -3234, -2303, -2262, -1230, -609, 439, 862, 970, 1295, 771, 1441, 1755, 2119, 3723, 3662, 4652, 5499, 5576, 5354, 6442, 7103, 7947, 8801, 10145, 12021, 12948, 14140, 15558, 14484, 11432, 10851, 9678, 7062, 4484, 4218, 3010, -706, -2507, -4607, -8592, -10733, -11295, -11568, -12657, -11495, -11251, -11455, -11149, -9610, -9518, -9011, -6938, -6250, -4456, -3477, -1796, -2538, -1448, -1577, -1976, -2519, -2617, -3387, -4552, -4460, -5325, -6018, -7130, -7680, -8638, -8281, -8517, -7984, -7842, -6717, -6473, -5157, -3798, -3395, -2461, -1472, -128, 370, 1565, 2111, 3177, 3849, 5178, 5347, 6754, 7683, 8645, 10516, 11656, 13659, 14717, 17700, 19833, 22257, 23870, 23912, 22583, 18193, 15951, 14876, 11260, 8443, 7815, 5448, 29, -3676, -6249, -11754, -14096, -13215, -13507, -14582, -13090, -12803, -14319, -12771, -10275, -9215, -7880, -4539, -3344, -2786, -1536, -1241, -1885, -960, 631, 0, 353, 777, -33, -1046, -1300, -2179, -3541, -4054, -4862, -5340, -5489, -5759, -7160, -7726, -8249, -8845, -9286, -9030, -9670, -9258, -8369, -8409, -7221, -6640, -5671, -5081, -3762, -2894, -1965, -604, 1023, 1625, 3282, 4108, 5303, 7472, 9152, 10655, 11435, 13791, 15316, 17893, 21376, 25241, 28239, 30130, 28910, 22106, 19080, 20383, 15295, 11071, 12139, 10269, 2369, -3541, -6288, -12708, -17002, -15377, -14591, -15835, -15237, -15845, -17453, -15530, -12430, -10463, -7558, -4646, -3636, -2751, -364, -325, -119, 144, 899, 2291, 2440, 1658, 612, 592, -1064, -2003, -1122, -1821, -3795, -4381, -5094, -6881, -8294, -9272, -10440, -11002, -10786, -10396, -10992, -11940, -12625, -11625, -10231, -9304, -8641, -7124, -5537, -4748, -2733, -1462, -256, 1306, 3747, 4881, 5586, 7179, 7835, 8900, 11791, 13660, 15778, 17935, 20848, 22933, 26657, 29815, 29965, 25979, 18018, 21397, 20283, 12242, 11760, 13030, 5704, -3634, -5162, -9408, -16329, -16735, -14049, -15779, -16950, -16363, -18508, -18225, -14151, -10798, -8321, -6032, -5306, -5042, -1853, -18, 117, 1190, 1365, 1716, 3084, 3190, 1235, 875, 994, -158, -340, -1258, -3684, -6256, -6819, -6708, -7983, -9482, -11394, -12607, -11936, -11907, -12932, -12710, -12596, -12252, -10452, -9247, -9238, -8407, -6588, -4852, -3680, -1590, -914, 170, 1962, 3584, 5049, 5927, 6899, 7847, 10292, 12480, 14681, 17375, 19125, 21637, 26908, 29425, 30258, 26241, 21369, 20940, 19428, 16298, 13433, 11666, 6742, -808, -5332, -8845, -13624, -15108, -14578, -14115, -16321, -18362, -18088, -16833, -14316, -10446, -7292, -6537, -6476, -4862, -1957, 84, 1231, 1792, 1557, 1871, 3708, 2635, 1336, 1873, 1718, 182, -308, -1050, -3891, -6164, -6614, -6512, -7931, -9597, -11545, -11916, -11327, -11770, -12125, -11770, -11813, -11446, -9601, -8173, -7909, -7113, -4999, -3499, -2125, -498, 310, 867, 2830, 4253, 5655, 6547, 6468, 7981, 10301, 12709, 14382, 16213, 18927, 21866, 25335, 28961, 29929, 24861, 19368, 21185, 21244, 15719, 13256, 13080, 7036, -898, -4222, -7842, -12800, -13964, -12963, -13721, -15032, -17315, -18661, -16396, -12551, -10486, -8279, -6504, -7055, -6321, -2280, 416, -318, 41, 781, 1606, 2863, 2127, 1101, 1227, 1086, 302, -99, -1551, -3980, -5385, -5657, -6103, -7589, -9476, -11059, -11392, -10794, -10861, -11546, -11422, -11508, -10529, -9008, -7955, -7599, -6315, -4544, -2703, -1460, -237, 89, 1383, 2920, 4750, 5455, 6040, 6859, 8304, 11295, 12527, 15414, 16322, 20341, 22322, 28370, 28441, 31831, 19517, 14455, 26617, 17290, 12676, 12302, 13833, -500, -2803, -5275, -12786, -17073, -17432, -13128, -14103, -14865, -20280, -17942, -14058, -9016, -6679, -7160, -7416, -6005, -1223, 3413, 198, -1010, -2807, 3425, 4722, 2208, -1334, -2562, 845, -900, 561, -5293, -6917, -9625, -5857, -8236, -10125, -15580, -16065, -10916, -11012, -10750, -14692, -9791, -9209, -5100, -7619, -7048, -6697, -3281, 380, -1430, -913, -286, 3220, 4430, 5010, 3480, 6321, 9326, 13989, 15875, 18073, 22460, 28283, 29316, 30442, 28778, 31224, 15745, 9615, 20578, 11422, 82, -12652, -9543, -13731, -15920, -24860, -30972, -24895, -17434, -7698, -5860, -5991, -6755, 3881, 14762, 12374, 10660, 14247, 13952, 12022, 5620, -1258, -8627, -7250, -10435, -17604, -17884, -19041, -21326, -16968, -12452, -12333, -8872, -2650, -874, -87, 2962, 2767, 4521, 3702, 45, -4331, -3575, -7413, -12726, -14136, -15654, -16500, -15374, -14294, -14583, -10654, -5669, -3685, -1408, 2231, 5039, 7996, 11462, 10607, 11416, 13263, 15307, 15576, 18195, 19761, 21125, 27337, 29971, 29622, 30100, 25649, 817, 12845, 15513, -568, -11867, -18818, -9599, -16755, -15673, -29866, -24954, -9585, -4313, 832, -1687, 6120, 8546, 18978, 17763, 5304, 12738, 15646, 8523, -3224, -11744, -13064, -11574, -14709, -26959, -25461, -14375, -14070, -15750, -12072, -6029, 1578, 6454, 4026, 821, 6475, 7872, 4756, -1583, -6669, -8696, -7589, -11972, -21449, -19644, -15334, -13116, -15162, -13377, -10182, -2794, 823, -845, 963, 6255, 8659, 7452, 7575, 8903, 11576, 13454, 13185, 12095, 18770, 23062, 25490, 28335, 30713, 28506, 30472, 155, 590, 23485, -3633, -13807, -24312, -15127, -14999, -21606, -24224, -32000, -5589, 118, 1437, 2067, 7554, 16443, 18355, 21965, 4961, 12496, 17571, 6596, -9533, -17746, -13842, -15452, -19450, -30690, -24223, -13149, -9937, -16009, -10972, 648, 8291, 9504, 4741, 4306, 7784, 10276, 1333, -5846, -8824, -8933, -11820, -17520, -22708, -20581, -13958, -13930, -16044, -10336, -3571, 637, 1884, 3455, 5823, 10831, 12627, 8498, 10578, 16281, 16252, 15336, 17761, 20495, 26552, 29762, 30012, 29438, 26730, -5583, 5712, 16590, -11228, -17983, -22600, -8554, -19174, -17724, -24623, -25078, 2239, 313, 2354, 2875, 16171, 16215, 13072, 14541, 4970, 12686, 9402, -522, -15985, -18798, -12312, -21082, -26375, -25935, -15576, -9740, -11567, -11936, -4453, 8022, 9911, 4706, 4607, 7971, 7517, 651, -5657, -8308, -7646, -9556, -16677, -19966, -17551, -14317, -14453, -14750, -10411, -3889, 1466, 1649, 2858, 8793, 13466, 13126, 12869, 14781, 16326, 20138, 19477, 20755, 26748, 31041, 28295, 31204, -3935, -593, 21529, -9192, -15182, -26248, -8689, -13305, -17458, -20885, -31093, 3224, 942, 1103, 2352, 12416, 20253, 10554, 13596, 4779, 7917, 11139, -177, -15087, -16577, -10551, -20786, -26338, -24653, -16972, -11500, -10522, -12470, -6151, 6962, 8620, 3011, 3096, 10253, 7264, 931, -4906, -6834, -6558, -7670, -14358, -17632, -12957, -10211, -11214, -10361, -5423, -224, 3455, 4841, 8068, 12825, 17284, 17416, 19756, 21392, 26725, 29204, 30498, 28590, 31733, 2353, -4013, 22469, -9360, -17843, -21587, -13271, -14630, -17723, -14588, -29980, 1095, 3613, 65, 5582, 14585, 20769, 9923, 13889, 8925, 4766, 8393, -797, -17668, -15414, -16069, -24138, -31227, -20485, -13851, -17765, -8327, -10342, -3177, 3772, 4908, 2808, 5765, 11310, 1651, -1446, -3908, -6751, -9046, -11879, -13647, -11841, -8560, -9676, -9152, -3359, 3577, 8600, 13194, 16300, 22861, 25767, 29634, 29194, 30591, 28506, 31586, 9267, -5800, 17134, -9054, -23822, -27980, -22133, -19144, -23112, -18091, -30413, -3072, 5139, 1733, 9660, 19499, 28541, 18763, 19229, 12515, 9557, 9411, -1078, -18399, -19770, -19850, -30016, -29813, -28074, -22998, -17986, -8064, -10842, -6109, 6514, 7122, 7884, 8932, 11158, 7970, 4492, -2541, -9196, -9151, -10997, -15380, -15267, -13069, -8153, -2984, 3464, 9607, 19035, 28580, 29978, 29559, 30030, 28766, 21455, 23310, 14135, -3901, -12460, -17910, -20660, -24134, -26207, -30196, -22853, -12695, -11098, -4734, 5963, 14303, 17058, 19116, 20048, 17779, 17586, 10251, -1250, -8054, -12424, -20778, -28733, -24240, -26824, -26177, -17987, -18375, -14935, -6962, -669, 1162, 5608, 10416, 9809, 9827, 7210, 2286, 2130, 305, -2740, -3167, 3431, 9185, 8187, 12541, 20652, 28273, 23569, 15929, 12179, 11780, 9297, -2133, -10507, -11416, -9539, -14857, -20873, -19241, -13757, -8458, -4489, -1506, 4972, 12627, 15599, 12988, 12805, 13937, 11708, 2101, -5358, -7561, -12012, -21643, -26489, -18280, -21612, -21386, -15451, -12115, -6612, -862, 974, 300, 7521, 9299, 4668, 4414, 3505, 1135, 1518, 1308, 2628, 8200, 14035, 13345, 18745, 23817, 20382, 14173, 11355, 10249, 4014, 1506, -5895, -11156, -8955, -11143, -16214, -17300, -11218, -7520, -4716, -768, 1978, 7012, 10923, 9761, 6746, 6754, 2633, 4566, -4223, -15669, -13182, -13547, -14243, -22041, -18708, -12724, -9883, -8240, -9369, -1836, 3010, 4500, 4056, 4666, 8468, 8676, 7276, 6660, 8478, 15802, 16625, 13950, 18041, 21098, 16936, 9424, 6893, 3664, -1167, -2369, -8735, -12837, -10734, -9078, -12244, -13324, -7954, -4749, -228, 2135, 3486, 7673, 11059, 9504, 6812, 2964, 1447, -2040, -7857, -11649, -16189, -11720, -14291, -17861, -14423, -11810, -9006, -8368, -5293, -3291, 1237, 4666, 2902, 4529, 5753, 7532, 9642, 10502, 14707, 15469, 17848, 20501, 16286, 11315, 8003, 7468, 282, -3833, -2602, -9183, -9342, -8076, -10736, -10512, -7603, -5695, -5590, -375, 2900, 1924, 3828, 5653, 5086, 672, -1576, -733, -8760, -9351, -8115, -13861, -13255, -10979, -10279, -11066, -7279, -5856, -5904, -527, 98, 769, 4967, 6593, 7403, 9877, 13959, 15175, 15298, 17617, 19102, 15717, 9705, 5423, 2818, 466, -5646, -9568, -9920, -10060, -9203, -10182, -9596, -6829, -2865, -31, 544, 3687, 5553, 7716, 5158, 2977, 2715, -1118, -4402, -8948, -8665, -11750, -13724, -11503, -12158, -10954, -8514, -6835, -5081, -2271, 576, 2400, 5263, 7600, 8300, 11260, 13494, 16081, 14883, 15861, 17549, 10866, 8071, 5279, 1267, -1352, -5748, -6594, -7786, -7836, -8433, -9716, -6842, -5576, -3217, -1318, -207, 2991, 2578, 3111, 4755, -289, -1544, -2868, -5613, -4660, -8776, -11428, -10433, -9277, -10409, -10196, -7172, -6947, -2743, 1408, 2558, 6971, 10208, 12778, 14800, 16794, 16431, 16341, 17969, 11955, 6627, 4360, 849, -3482, -7780, -9385, -11527, -9842, -8069, -10279, -8665, -5034, -3037, -1669, 1031, 1012, 1890, 6309, 3410, -1030, -844, -3796, -5307, -3824, -8383, -11540, -7062, -6004, -8113, -7146, -6725, -6357, -1863, 590, -276, 4711, 8895, 10303, 14033, 16275, 14931, 16206, 17824, 12885, 8348, 5822, 1812, -2117, -3851, -7912, -9480, -7906, -8083, -7464, -6761, -5113, -2876, -207, 1403, 1490, 3574, 2506, 360, 763, -4533, -5662, -3974, -7741, -9298, -8325, -8735, -8696, -6719, -6839, -6602, -1619, 1676, 2633, 7124, 9062, 10846, 15080, 16375, 14902, 14309, 14433, 10514, 7277, 4179, -2108, -3746, -4551, -8043, -9271, -9820, -8636, -6789, -4179, -2319, -2100, 946, 2721, 3601, 3356, -238, -1261, -3527, -6234, -5840, -8414, -10568, -9333, -8330, -8418, -7722, -6274, -5451, -2190, 1061, 3461, 7914, 10332, 12648, 15445, 18399, 17565, 15166, 14930, 9764, 6338, 3050, -2646, -5690, -9055, -10499, -10763, -10408, -9059, -8633, -5761, -3800, -2236, 1202, 2514, 4163, 2883, 1736, 1617, -3053, -3476, -4583, -8504, -9735, -10078, -10042, -10574, -8928, -8416, -7563, -3044, -830, 2738, 8046, 9634, 12322, 16134, 18449, 18735, 17213, 13554, 8657, 5948, 3653, -1577, -5299, -6896, -9907, -9018, -7844, -9287, -8505, -6673, -4639, -1841, 295, 807, -439, 1308, 1431, -2930, -2022, -2753, -6123, -5116, -5614, -7336, -7663, -6648, -6929, -6455, -2216, -1394, 2288, 7762, 9284, 12858, 16920, 18050, 17178, 16090, 12273, 8618, 7225, 2662, -3022, -5149, -8485, -10682, -9397, -10545, -11499, -9479, -7299, -4632, -1539, 932, 560, 816, 2958, 147, -621, 340, -3926, -5454, -4773, -6363, -7011, -6987, -7119, -8197, -5147, -2739, -570, 5375, 7999, 10735, 15210, 18271, 18851, 17403, 13117, 9299, 7572, 5136, -255, -5208, -7808, -9469, -9610, -10214, -11525, -11332, -9608, -6157, -2711, -1094, -455, -1884, 265, 368, -2190, -122, -2959, -5591, -3391, -4150, -5393, -6307, -6096, -5717, -4229, -1084, 513, 4584, 9216, 11365, 14530, 17156, 17691, 15120, 10806, 8375, 5278, 3790, 394, -5024, -6770, -8761, -8302, -8151, -10170, -9852, -9012, -5366, -2035, -394, -530, -1642, -917, -1875, -1438, -1435, -5263, -6413, -5299, -4856, -4859, -5567, -6168, -5692, -2026, 779, 4033, 8614, 10841, 14537, 17928, 19684, 17654, 11582, 8879, 5741, 4163, 1602, -4292, -7195, -9399, -7857, -7510, -9417, -9957, -10351, -6400, -1976, -184, -103, -2212, -1170, -2019, -1941, -108, -4956, -6333, -5042, -4625, -3096, -3873, -4931, -5377, -3264, 224, 2560, 6900, 9270, 11201, 15862, 18976, 18556, 12368, 6979, 5291, 3754, 3320, -2123, -8175, -9437, -9048, -6414, -7070, -9702, -10491, -8846, -3346, 20, 877, -782, -3770, -2128, -1817, -2074, -2168, -6801, -7841, -5897, -4744, -3244, -4774, -5702, -4681, -2077, 2377, 4655, 6901, 9990, 13376, 17230, 20683, 18022, 9404, 5968, 4010, 2599, 1346, -4462, -9454, -11091, -8430, -6761, -7591, -7964, -10128, -7647, -999, 1317, 2177, -689, -2484, -2261, -3407, -500, -3964, -8156, -7062, -7736, -5085, -2943, -4169, -4757, -4346, -853, 2417, 7242, 10610, 11020, 16182, 18306, 21043, 19316, 9471, 6225, 3569, 1417, 760, -4351, -8618, -10797, -9301, -7079, -7415, -7615, -9541, -7613, -1358, 1906, 3305, 1601, -2227, -1913, -3104, -2684, -1900, -7404, -8583, -6823, -6541, -4005, -3786, -5869, -5253, -2241, 1620, 4370, 8627, 10507, 12439, 17718, 20428, 20835, 14588, 7798, 4977, 2957, 2467, -745, -6411, -10704, -11350, -8860, -7125, -7725, -8844, -9369, -5729, 125, 2833, 3337, 1111, -1955, -793, -912, -3162, -3451, -6841, -9479, -7916, -6379, -5697, -5139, -5892, -5754, -3232, 73, 2513, 5740, 9068, 10606, 14958, 18892, 21259, 19747, 11700, 7296, 4240, 1634, 2185, -3089, -8229, -11886, -12773, -8854, -7548, -7281, -8146, -8416, -4278, -292, 3287, 5822, 2566, 337, -815, -902, -1729, -5534, -6097, -8046, -10338, -7818, -7322, -7728, -6363, -6346, -4316, -1065, 1453, 3408, 6079, 8910, 11035, 14929, 18527, 20956, 21239, 14503, 8596, 6098, 2667, 746, -2185, -7063, -10896, -11880, -10217, -7992, -6737, -6622, -7037, -4476, -910, 2355, 5219, 3886, 3089, 2478, -89, -25, -2666, -6958, -7003, -8670, -9995, -9168, -8850, -8492, -7102, -4232, -3583, -1791, 1161, 1635, 3913, 6812, 7613, 9286, 11856, 14144, 17478, 20226, 15757, 9083, 5694, 2333, 1152, 87, -3632, -9182, -11782, -10609, -8500, -5927, -5266, -7188, -6187, -2754, 219, 4548, 5468, 3397, 941, 990, 1583, -1443, -2358, -5394, -10625, -10489, -9248, -9258, -8351, -7200, -7736, -6526, -2622, -428, 912, 2079, 764, 788, 2570, 3558, 4521, 5816, 7460, 7895, 10504, 14280, 15207, 12833, 10561, 6884, 3474, 3487, 1667, -899, -3047, -5971, -7724, -7283, -6842, -6231, -6526, -5327, -4144, -2538, 1503, 3542, 4369, 4697, 3373, 1752, 678, -1470, -2830, -4694, -6635, -8601, -10596, -9554, -8317, -8326, -6389, -5342, -5116, -2758, -1096, -147, 162, -1094, -2975, -3495, -2979, -1596, -382, 1596, 2639, 4454, 8534, 11779, 15452, 19305, 20242, 17950, 16286, 13141, 9917, 6139, 1925, -2621, -7843, -9798, -10773, -11172, -9933, -8960, -7805, -5146, -2270, 1878, 5003, 7055, 8380, 7603, 7483, 6025, 2776, 588, -2716, -8243, -10138, -11196, -13436, -12770, -12697, -12489, -9692, -7363, -5660, -3089, -1462, -559, -154, 354, 0, -697, -1122, -2891, -3420, -3609, -4246, -3688, -2944, -1917, 313, 2566, 5481, 8633, 11208, 14182, 16656, 19025, 21935, 21907, 20038, 15899, 8731, 3821, -578, -4500, -5918, -8598, -10842, -11300, -11306, -9124, -6412, -2941, -40, 1384, 3561, 4853, 5649, 7213, 6630, 4688, 2250, -1550, -3729, -5981, -7133, -6916, -8173, -9257, -9232, -8727, -7789, -6381, -5106, -4639, -3626, -2635, -2605, -1760, -1589, -2491, -3038, -3180, -3699, -4178, -4552, -4731, -4961, -4001, -3155, -2657, -1794, -1660, -1814, -1251, 8, 182, 1160, 1581, 2241, 3488, 4946, 6621, 8591, 10636, 12995, 16095, 19490, 21685, 20583, 19291, 16369, 11633, 7945, 4529, -612, -4760, -7369, -9067, -10466, -10557, -9462, -8149, -5906, -2791, 166, 2089, 4350, 5077, 5977, 6099, 5563, 3271, 706, -1992, -4624, -6389, -7413, -8435, -9496, -8397, -9833, -7827, -4938, -3826, -824, 1170, 986, 297, -1065, -2258, -2659, -2820, -2253, -3703, -5996, -7962, -8458, -7940, -6668, -4925, -3540, -3624, -3481, -2836, -2459, -872, 151, -22, -421, -1934, -3923, -5208, -5792, -5606, -4606, -3446, -3170, -2425, -805, 1017, 3307, 6664, 8825, 10531, 11732, 12619, 14329, 16181, 17128, 18469, 20033, 19250, 17411, 14772, 11129, 7132, 3561, -408, -4167, -7667, -9553, -10841, -10521, -8717, -6769, -4638, -2166, -144, 1365, 3529, 4857, 6114, 6140, 5583, 3595, 1140, -865, -3336, -5237, -6366, -7921, -9019, -9873, -9496, -7875, -6173, -3356, -1102, 109, 620, 448, -308, 481, -365, 101, -27, -2332, -3299, -5402, -6094, -5722, -5607, -3493, -3596, -5299, -4217, -5386, -4788, -3529, -1870, -684, -2098, -1765, -2493, -4015, -3448, -3238, -3047, -2494, -3386, -3435, -4670, -4808, -3766, -3467, -2147, -1519, -2007, -1241, -1150, -330, 1552, 2441, 4175, 4538, 5236, 5868, 5436, 6212, 7038, 7275, 8237, 8509, 7968, 8936, 10102, 11070, 12494, 14116, 15158, 14463, 14175, 11736, 7768, 3748, -1232, -4736, -7219, -7859, -7543, -7291, -6742, -5821, -5045, -3007, -767, 1391, 3747, 4830, 5574, 5133, 4052, 2510, 401, -840, -2499, -3866, -4999, -6624, -7135, -7836, -7638, -6254, -4870, -3149, -1604, -633, -109, 153, -34, -899, -1171, -2419, -3642, -4207, -5434, -4785, -4041, -3908, -3341, -3068, -2533, -1668, -909, 541, 762, 503, 441, -642, -2354, -4133, -5241, -6189, -6884, -6335, -5957, -6390, -5563, -5235, -4672, -3497, -2180, -665, -176, 530, 234, -489, -279, -651, -732, -580, -654, -247, -579, -123, 456, 872, 2656, 3255, 4089, 5473, 5861, 6027, 6254, 6659, 6924, 6444, 6204, 6047, 5654, 6009, 6701, 7406, 8817, 10766, 11715, 11776, 12368, 14935, 15703, 13848, 8011, 2306, -2932, -8959, -10222, -9925, -9425, -8088, -7327, -7716, -7276, -6884, -3987, -668, 3174, 6751, 7808, 7053, 5161, 2413, 59, -1467, -2799, -3551, -5286, -6431, -9339, -10200, -10163, -9048, -6280, -3223, -441, 1734, 2806, 3259, 2880, 2038, 2143, 1254, 46, -1555, -2305, -4948, -6678, -6934, -7040, -6847, -5403, -3809, -2888, -1796, -59, 805, 1017, 2132, 2069, 1471, 435, -404, -2841, -4923, -5490, -6958, -7443, -5939, -5630, -4774, -3288, -3291, -3067, -2325, -1141, -159, 406, 1259, 1222, 212, -462, -1333, -1833, -1464, -787, -413, 71, 792, 1175, 2000, 3371, 4491, 5659, 6800, 6831, 6485, 6082, 6188, 5860, 4841, 4745, 3939, 3094, 2791, 3491, 3249, 4419, 6219, 7293, 8675, 9883, 10524, 11079, 12682, 14776, 12465, 5397, 2623, -4743, -10648, -11532, -11540, -10213, -8171, -5629, -4833, -4952, -3859, -1461, -475, 4652, 7349, 8121, 8255, 6487, 2410, -1502, -4260, -6425, -7774, -7898, -6782, -8048, -7690, -7596, -7798, -6272, -3222, -407, 2788, 4965, 6472, 5613, 3896, 2675, -77, -1680, -1978, -3181, -4045, -4245, -5771, -6542, -7511, -7036, -6360, -5113, -2200, -207, 867, 2514, 2353, 1769, 1255, 112, -304, -1536, -2061, -2854, -4260, -4941, -5647, -6582, -5873, -5335, -4267, -2928, -2274, -1187, -1313, -904, -174, -475, -138, 202, -285, -229, -1041, -1502, -2065, -2775, -1842, -834, 442, 1866, 2920, 3494, 4308, 4494, 4920, 5831, 6297, 6767, 6751, 6652, 5102, 3817, 3066, 2240, 2365, 3544, 4266, 4756, 5480, 5457, 5495, 5129, 5827, 6371, 7397, 8556, 9647, 9729, 9786, 4802, -463, -2740, -9131, -10304, -9322, -8708, -6614, -4811, -4161, -3301, -4248, -2654, -1313, -79, 4331, 5288, 6214, 6448, 4023, 1070, -1460, -4170, -4596, -5800, -4888, -3978, -4515, -3942, -4263, -5276, -4478, -3336, -1629, 920, 2510, 4187, 3731, 3135, 1490, -885, -2667, -2641, -3263, -2330, -1869, -2353, -2357, -3374, -3387, -3713, -3289, -1813, -257, 908, 2362, 2297, 1982, 1124, -1282, -3474, -5048, -5992, -5913, -5317, -3955, -3117, -3168, -3080, -3180, -3242, -2748, -2041, -1018, -270, -251, -372, -1533, -2644, -3666, -4477, -4100, -3420, -2846, -1349, -777, -437, -233, -220, 333, 810, 1835, 2754, 3399, 3856, 3886, 3487, 3170, 2807, 2970, 3001, 3190, 3852, 4004, 3822, 3947, 3358, 3311, 3833, 3693, 4134, 4108, 3744, 3845, 4040, 3974, 4014, 4021, 4880, 4851, 5188, 6060, 6095, 6500, 6788, 4415, 727, 276, -3896, -6206, -5802, -6853, -5887, -4943, -3791, -3309, -3167, -1944, -332, -175, 2166, 3584, 3592, 4300, 3823, 1992, 291, -1585, -3022, -4283, -5206, -4407, -5120, -4572, -3847, -3916, -3481, -2210, -1226, 83, 1290, 2303, 3233, 2971, 2915, 1627, 208, -520, -1849, -2987, -2970, -3094, -3280, -3206, -2954, -3229, -3105, -2024, -1033, -271, 1023, 2194, 2480, 2823, 2357, 1578, 450, 2, -308, -1115, -1193, -1694, -2377, -2991, -3379, -4545, -4834, -4333, -4294, -3333, -2525, -2386, -2255, -2126, -2807, -2663, -2960, -2538, -1961, -1894, -967, -1254, -1359, -1283, -2126, -2403, -2007, -1852, -944, -369, 156, 525, 597, 1262, 1881, 2000, 2806, 3296, 3597, 4106, 3779, 3799, 3553, 2872, 2133, 1695, 1990, 2207, 1918, 2313, 1997, 1742, 1660, 1727, 1927, 2282, 3367, 3413, 3548, 4142, 3802, 3489, 3500, 3066, 2816, 2912, 2867, 2244, 2019, 1763, 1486, 918, 1382, 398, -1070, -757, -2922, -3844, -3338, -3800, -3547, -2973, -2066, -1691, -1698, -693, -330, -655, 419, 873, 531, 1437, 1037, 121, -351, -1615, -2589, -3100, -3260, -3232, -3296, -2911, -2071, -2187, -1730, -1006, -1021, -553, -157, 334, 593, 747, 903, 504, -99, -271, -1137, -2039, -1720, -1784, -1693, -1258, -1247, -1248, -1264, -1073, -733, -687, 15, 419, 346, 816, 510, 203, -46, -824, -1635, -2798, -2800, -3331, -3993, -3473, -3555, -3335, -2852, -2239, -2156, -1498, -922, -877, -632, -377, -402, -950, -784, -1351, -2198, -2240, -2638, -3086, -2493, -2176, -1758, -1037, -446, -48, 138, 836, 1297, 1566, 2012, 2137, 2137, 2244, 2001, 1859, 1454, 1241, 1084, 420, 810, 1196, 1073, 1427, 2024, 2262, 2418, 2893, 3323, 3168, 3484, 3622, 2996, 2921, 2494, 2209, 1927, 2083, 1766, 1465, 1765, 1549, 923, 1215, 1382, 596, 1215, 1568, 1474, 2062, 2290, 2158, 2088, 1961, 1641, 1158, 806, 634, -233, -1988, -1872, -3444, -4404, -3530, -3735, -3199, -2497, -1536, -917, -145, 366, 566, 443, 1297, 1214, 895, 1346, 857, 40, -120, -1184, -2216, -2730, -3017, -2888, -2972, -2085, -1744, -1208, -528, 68, -85, 423, 667, 714, 1295, 1163, 694, 368, -99, -469, -1104, -1689, -1414, -1644, -1482, -1249, -860, -717, -790, -590, -301, -515, -340, -212, -272, -405, -929, -1409, -1559, -1811, -2228, -1986, -2038, -1926, -1875, -1857, -1503, -1515, -1176, -896, -1212, -821, -763, -577, -307, -496, -670, -556, -924, -965, -837, -886, -476, -952, -615, -475, -503, -322, -99, -317, -288, 83, -239, -195, 181, 215, 84, 132, 216, 586, 435, 891, 958, 1129, 1789, 1580, 1442, 1674, 1352, 930, 1187, 1017, 608, 490, 498, 514, 284, 258, 87, -195, 420, 490, 552, 908, 1026, 978, 1029, 903, 449, 538, 461, 542, 442, 640, 724, 842, 876, 733, 743, 773, 689, 527, 293, -482, -1132, -1837, -2530, -3088, -3084, -2876, -2557, -2204, -1755, -1173, -781, -584, -229, 114, 455, 513, 490, 498, 152, -162, -810, -1383, -1875, -2097, -2280, -2170, -1764, -1433, -1154, -907, -510, -181, 26, 409, 536, 483, 500, 525, 250, -237, -526, -857, -977, -1016, -1250, -1133, -783, -1021, -852, -676, -505, -488, -484, -54, 157, 412, 308, 293, 0, -276, -621, -1048, -1188, -1261, -1394, -1307, -1221, -1256, -983, -1016, -981, -1027, -823, -482, -539, -90, -33, -318, 4, -411, -458, -394, -774, -920, -715, -291, -55, 136, 105, 170, -147, 100, 395, 492, 511, 489, 510, 487, 513, 487, 511, 489, 509, 489, 513, 476, 637, 800, 633, 487, 730, 852, 1078, 1145, 993, 992, 1024, 813, 498, 497, 510, 472, 663, 763, 759, 575, 474, 515, 488, 508, 493, 504, 502, 333, 206, 292, 194, 385, 345, 455, 518, 488, 508, 492, 507, 492, 506, 255, 259, 232, 283, 87, 182, -97, -274, -523, -794, -552, -746, -753, -743, -758, -744, -1002, -994, -822, -703, -800, -880, -868, -1178, -1326, -1630, -1635, -1984, -1869, -1702, -1708, -1221, -1355, -1487, -1533, -1398, -1210, -1331, -1389, -1381, -1298, -1216, -1469, -1589, -1793, -1959, -2022, -1977, -1693, -1445, -1368, -1377, -1240, -1214, -858, -530, -495, -499, -507, -478, -681, -506, -623, -600, -430, -694, -527, -486, -668, -837, -1022, -774, -400, -80, 295, 517, 490, 516, 371, 188, 385, 350, 453, 520, 490, 500, 509, 266, 334, 543, 471, 517, 663, 818, 550, 545, 744, 780, 655, 625, 585, 461, 525, 480, 519, 467, 322, 529, 477, 525, 463, 354, 384, 221, 266, 233, 464, 513, 487, 514, 482, 519, 146, 121, 499, 498, 496, 518, 375, 384, 295, 216, 278, 225, 274, 483, 404, 333, 83, -210, -223, -291, -184, 170, 437, 284, 261, 215, 112, 120, -2, -29, 159, 58, -19, 7, -234, -255, -244, -258, -238, -70, 125, 251, 32, -121, -304, -423, -207, -298, -111, -165, -224, -43, -562, -639, -495, -693, -402, -195, -45, 37, -37, 48, -185, -252, -256, -241, -256, -248, -58, 41, -171, -288, -119, -140, -53, 151, 293, 134, -7, -22, 134, 244, 26, -177, 204, 67, -162, 73, -44, 22, 44, 314, 385, 289, 193, 115, 120, 152, 366, 513, 489, 518, 452, 103, 133, -36, 7, 133, 107, 241, 109, 130, 122, 111, -161, -73, -6, 116, 281, 235, 256, 248, 247, 260, 202, -37, 40, -98, -257, -261, -214, -457, -182, -119, -85, 31, -12, 1, 8, -25, 86, 140, -43, 28, -26, 37, -130, -115, -147, 15, -210, -259, -253, -206, 24, -13, 8, -7, 8, -12, 23, -73, -153, -117, -389, -479, -338, -491, -367, -383, -267, -214, -7, 3, 1, -10, 27, -89, -133, -137, -31, 10, -184, -76, -319, -452, -537, -465, -534, -460, -319, -175, -510, -377, -412, -456, -357, -353, -257, -554, -299, -493, -506, -476, -150, 41, -31, 28, -27, 28, -31, 35, -41, 56, 142, 22, -71, -425, -202, -106, -138, 28, -13, 6, -2, 0, 1, 0, -4, 161, 41, -37, 59, 227, 285, 172, 11, -35, 106, 123, 146, 16, -9, 5, -2, 0, 0, 0, 1, -1, 1, -2, 3, -3, 4, -5, 5, -4, 3, -2, 1, -1, 1, 0, 0, 0, 0, 0, 0, 0, -1, 2, -3, 4, -5, 6, -7, 10, -17, 31, -83, -142, 37, -20, 14, -11, 8, -6, 5, -3, 2, -3, 4, -5, 7, -11, 24, -132, -269, 49, -177, -41, 17, -12, 11, -11, 13, -18, 23, -257, -218, -302, -124, -158, -214, -86, -271, -264, -117, -171, -215, 53, -234, -269, -73, -238, -127, -156, -291, -225, -264, -243, -245, -276, -104, -175, -276, -237, -254, -250, -243, -262, -231, -274, -217, -294, -158, -117, -270, -247, -244, -261, -233, -274, -191, 22, -181, -6, -121, -309, -132, 30, -73, -151, -119, -57, 41, -38, 45, -199, -251, -255, -242, -258, -241, -257, -244, -250, -261, -131, -111, -142, }; fldigi-4.2.05/src/soundcard/play.pa.cxx0000664000175000017500000004776614611711171014650 00000000000000// Pulse Class #include #include #include #include "play.pa.h" #include "misc.h" #include "debug.h" #include "configuration.h" #include "fl_digi.h" #include "qrunner.h" #include "confdialog.h" #define DR_MP3_IMPLEMENTATION #include "dr_mp3.h" #if USE_PORTAUDIO #define CHANNELS 2 #define SCRATE 44100 // 8000 #define FRAMES_PER_BUFFER 8192 // 4096 // 1024 // lower than 1023 values causes audio distortion on pi3 #define RBUFF_SIZE 131072 // 65576 // 32768 // 16384 // 4096 static pthread_t alert_pthread; static pthread_cond_t alert_cond; static pthread_mutex_t alert_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t filter_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t rx_stream_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_t filelist_pthread; static pthread_mutex_t filelist_mutex = PTHREAD_MUTEX_INITIALIZER; static void start_alert_thread(void); static void start_filelist_thread(void); static void stop_alert_thread(void); static void stop_filelist_thread(void); static bool alert_thread_running = false; static bool alert_terminate_flag = false; //static bool stream_ready = false; enum { NONE, START, OPEN, CLOSE, TERMINATE }; static int alert_process_flag = NONE; struct PLAYLIST { c_portaudio *cpa; float *fbuff; unsigned long int bufflen; unsigned long int data_ptr; unsigned long int frames; int src; }; std::queue playlist; static PLAYLIST *plist = 0; struct FILELIST { c_portaudio *cpa; std::string fn; FILELIST() { cpa = 0; fn = ""; } FILELIST( c_portaudio *_cpa, std::string _fn ) { cpa = _cpa; fn = _fn; } ~FILELIST() {}; }; std::stack filelist; /********************************************************************************** * AUDIO_ALERT process event. **********************************************************************************/ int csinc = 2;// 0 - best, 1 - medium, 2 - fastest, 3 - zoh, 4 - linear static sf_count_t rate_convert (float *inbuff, int len, float *outbuff, int outlen, double src_ratio, int channels) { SRC_DATA src_data ; src_data.data_in = inbuff; // pointer to the input data samples. src_data.input_frames = len / channels; // number of frames of data pointed to by data_in. src_data.data_out = outbuff; // pointer to the output data samples. src_data.output_frames = outlen / channels; // Maximum number of frames pointed to by data_out. src_data.src_ratio = src_ratio; // output_sample_rate / input_sample_rate. int error = src_simple (&src_data, csinc, channels) ; return error; } int stream_process( const void* in, void* out, unsigned long nframes, const PaStreamCallbackTimeInfo *time_info, PaStreamCallbackFlags flags, void* data) { float* outf = reinterpret_cast(out); memset(outf, 0, nframes * 2 * sizeof(float)); if (!plist) { if (playlist.empty()) { guard_lock rx_lock(&rx_stream_mutex); c_portaudio *cpa = (c_portaudio *)data; unsigned long len = nframes * cpa->paStreamParameters.channelCount; unsigned long available = cpa->monitor_rb->read_space(); if (progdefaults.mon_xcvr_audio && available >= len) { cpa->monitor_rb->read((float *)out, len); } return paContinue; } guard_lock que_lock(&alert_mutex); plist = playlist.front(); playlist.pop(); } c_portaudio* cpa = plist->cpa; int chcnt = cpa->paStreamParameters.channelCount; unsigned long int nbr_frames = plist->bufflen / chcnt; unsigned int ncopy = nbr_frames - plist->data_ptr; if (ncopy > nframes) ncopy = nframes; memcpy( outf, plist->fbuff + plist->data_ptr * chcnt, ncopy * chcnt * sizeof(float)); plist->data_ptr += ncopy; float outvol = 0.01 * progdefaults.alert_volume; for (unsigned int n = 0; n < ncopy * chcnt; n++) outf[n] *= outvol; if (nbr_frames && plist->src == c_portaudio::ALERT) { static char progress[20]; snprintf(progress, sizeof(progress), "%d %%", int(100.0 * plist->data_ptr / nbr_frames)); put_status(progress, 2.0, STATUS_CLEAR); } if (plist->data_ptr >= nbr_frames) { plist = NULL; } return paContinue; } static int paStatus; static void StreamFinished( void* userData ) { paStatus = paComplete; } void process_alert() { return; } /********************************************************************************** * AUDIO_ALERT processing loop. * syncs to requests for audio alert output **********************************************************************************/ static c_portaudio *requester = 0; static void * alert_loop(void *args) { SET_THREAD_ID(AUDIO_ALERT_TID); alert_thread_running = true; alert_terminate_flag = false; while(1) { pthread_mutex_lock(&alert_mutex); pthread_cond_wait(&alert_cond, &alert_mutex); pthread_mutex_unlock(&alert_mutex); if (alert_process_flag == OPEN) { if (requester) requester->open(); alert_process_flag = NONE; requester = 0; } if (alert_process_flag == CLOSE) { if (requester) requester->close(); alert_process_flag = NONE; requester = 0; } if (alert_process_flag == TERMINATE) break; } return (void *)0; } void open_alert_port(c_portaudio *cpa) { alert_process_flag = OPEN; requester = cpa; pthread_cond_signal(&alert_cond); } void close_alert_port(c_portaudio *cpa) { alert_process_flag = CLOSE; requester = cpa; pthread_cond_signal(&alert_cond); } /********************************************************************************** * Start AUDIO_ALERT Thread **********************************************************************************/ static void start_alert_thread(void) { if(alert_thread_running) return; memset((void *) &alert_pthread, 0, sizeof(alert_pthread)); memset((void *) &alert_mutex, 0, sizeof(alert_mutex)); memset((void *) &alert_cond, 0, sizeof(alert_cond)); if(pthread_cond_init(&alert_cond, NULL)) { LOG_ERROR("Alert thread create fail (pthread_cond_init)"); return; } if(pthread_mutex_init(&alert_mutex, NULL)) { LOG_ERROR("AUDIO_ALERT thread create fail (pthread_mutex_init)"); return; } if (pthread_create(&alert_pthread, NULL, alert_loop, NULL) < 0) { pthread_mutex_destroy(&alert_mutex); LOG_ERROR("AUDIO_ALERT thread create fail (pthread_create)"); } LOG_VERBOSE("started audio alert thread"); MilliSleep(10); // Give the CPU time to set 'alert_thread_running' } /********************************************************************************** * Stop AUDIO_ALERT Thread **********************************************************************************/ static void stop_alert_thread(void) { if(!alert_thread_running) return; struct PLAYLIST *plist = 0; while (!playlist.empty()) { plist = playlist.front(); delete [] plist->fbuff; playlist.pop(); } alert_process_flag = TERMINATE; pthread_cond_signal(&alert_cond); MilliSleep(10); pthread_join(alert_pthread, NULL); LOG_VERBOSE("%s", "audio alert thread - stopped"); pthread_mutex_destroy(&alert_mutex); pthread_cond_destroy(&alert_cond); memset((void *) &alert_pthread, 0, sizeof(alert_pthread)); memset((void *) &alert_mutex, 0, sizeof(alert_mutex)); alert_thread_running = false; alert_terminate_flag = false; } static void add_alert(c_portaudio * _cpa, float *buffer, int len, int src) { if(alert_thread_running) { if (_cpa->paStreamParameters.device == -1) return; struct PLAYLIST *plist = new PLAYLIST; plist->fbuff = buffer; plist->bufflen = len; plist->cpa = _cpa; plist->data_ptr = 0; plist->frames = len / _cpa->paStreamParameters.channelCount; guard_lock que_lock(&alert_mutex); playlist.push(plist); LOG_VERBOSE("play list contains %d items", (int)(playlist.size())); } } // Initialize the c_portaudio class c_portaudio::c_portaudio() { PaError paError = Pa_Initialize(); if (paError != paNoError) { LOG_ERROR("pa Error # %d, %s", paError, Pa_GetErrorText(paError)); throw cPA_exception(paError); } stream = 0; fbuffer = new float[44100];//8192]; nubuffer = new float[44100 * 6];//8192 * 6]; data_frames = new float[ FRAMES_PER_BUFFER * CHANNELS ]; paStreamParameters.device = -1; sr = 44100; paStreamParameters.channelCount = 2; paStreamParameters.sampleFormat = paFloat32; paStreamParameters.hostApiSpecificStreamInfo = NULL; sr = SCRATE; b_sr = SCRATE; b_len = 0; rc = src_new (progdefaults.sample_converter, 1, &rc_error) ; monitor_rb = new ringbuffer(RBUFF_SIZE); bpfilt = new C_FIR_filter(); start_alert_thread(); start_filelist_thread(); } c_portaudio::~c_portaudio() { close(); stop_filelist_thread(); stop_alert_thread(); Pa_Terminate(); delete monitor_rb; delete [] fbuffer; delete [] nubuffer; delete [] data_frames; src_delete(rc); delete bpfilt; } void c_portaudio::init_filter() { guard_lock filter_lock(&filter_mutex); if (!bpfilt) bpfilt = new C_FIR_filter(); flo = 1.0 * progdefaults.RxFilt_low / sr; fhi = 1.0 * progdefaults.RxFilt_high / sr; double fmid = progdefaults.RxFilt_mid / sr; bpfilt->init_bandpass (511, 1, flo, fhi); { C_FIR_filter *testfilt = new C_FIR_filter(); testfilt->init_bandpass(511, 1, flo, fhi); double amp = 0; double sum_in = 0, sum_out = 0; double inp = 0; for (int i = 0; i < 100 / fmid; i++) { inp = cos (TWOPI * i * fmid); if (testfilt->Irun( inp, amp ) ) { sum_in += fabs(inp); sum_out += fabs(amp); } } gain = 0.98 * sum_in / sum_out; delete testfilt; } // std::cout << "############################################" << std::endl; // std::cout << "Sampling rate: " << sr << std::endl; // std::cout << "BW : " << progdefaults.RxFilt_bw << " : [ " << progdefaults.RxFilt_low << // " | " << progdefaults.RxFilt_mid << // " | " << progdefaults.RxFilt_high << " ]" << // std::endl; // std::cout << "bpfilt : " << flo << " | " << fhi << std::endl; // std::cout << "gain : " << gain << std::endl; // std::cout << "############################################" << std::endl; } int c_portaudio::open()//void *data) { paStreamParameters.device = progdefaults.AlertIndex; sr = Pa_GetDeviceInfo(paStreamParameters.device)->defaultSampleRate; paStreamParameters.channelCount = 2; paStreamParameters.sampleFormat = paFloat32; paStreamParameters.suggestedLatency = Pa_GetDeviceInfo(paStreamParameters.device)->defaultLowOutputLatency; paStreamParameters.hostApiSpecificStreamInfo = NULL; LOG_INFO("\n\ open pa stream:\n\ samplerate : %.0f\n\ device name : %s\n\ device number : %d\n\ # channels : %d\n\ latency : %f\n\ sample Format : paFloat32", sr, progdefaults.AlertDevice.c_str(), paStreamParameters.device, paStreamParameters.channelCount, paStreamParameters.suggestedLatency); state = paContinue; paError = Pa_OpenStream( &stream, NULL, &paStreamParameters, sr, FRAMES_PER_BUFFER, paClipOff, stream_process, this); if (paError != paNoError) { LOG_ERROR("pa Error # %d, %s", paError, Pa_GetErrorText(paError)); stream = 0; return 0; } paError = Pa_SetStreamFinishedCallback( stream, StreamFinished ); if (paError != paNoError) { LOG_ERROR("pa Error # %d, %s", paError, Pa_GetErrorText(paError)); paError = Pa_StopStream(stream ); paError = Pa_CloseStream(stream); stream = 0; return 0; } paError = Pa_StartStream(stream ); if (paError != paNoError) { LOG_ERROR("pa Error # %d, %s", paError, Pa_GetErrorText(paError)); paError = Pa_StopStream(stream ); paError = Pa_CloseStream(stream); stream = 0; return 0; } LOG_INFO("OPENED pa stream %p @ %f samples/sec", stream, sr); init_filter(); return 1; } void c_portaudio::close() { if (stream) { paError = Pa_StopStream(stream ); paError = Pa_CloseStream(stream); if (paError != paNoError) { LOG_ERROR("pa Error # %d, %s", paError, Pa_GetErrorText(paError)); } else LOG_VERBOSE("closed stream %p", stream); } } // Play 2 channel buffer void c_portaudio::play_buffer(float *buffer, int len, int _sr, int src) { // do not delete [] nubuffer // deleted after use float *nubuffer = new float[len]; int nusize = len; if (sr == _sr) { // do not resample if sample rate is default for (int i = 0; i < len; i++) nubuffer[i] = buffer[i]; } else { double src_ratio = 1.0 * sr / _sr; // resize nubuffer nusize = len * src_ratio; delete [] nubuffer; nubuffer = new float[nusize]; int num = rate_convert( buffer, len, nubuffer, nusize, src_ratio, paStreamParameters.channelCount); if (num != 0) { LOG_ERROR("rate converter failed"); return; } } data_ptr = 0; add_alert(this, nubuffer, nusize, src); return; } // play mono buffer void c_portaudio::play_sound(int *buffer, int len, int _sr) { float *fbuff = new float[2]; try { delete [] fbuff; fbuff = new float[2*len]; for (int i = 0; i < len; i++) fbuff[2*i] = fbuff[2*i+1] = buffer[i] / 33000.0; //32768.0; play_buffer(fbuff, 2*len, _sr, ALERT); } catch (...) { delete [] fbuff; throw; } delete [] fbuff; return; } // play mono buffer void c_portaudio::play_sound(float *buffer, int len, int _sr) { float *fbuff = new float[2]; try { delete [] fbuff; fbuff = new float[2*len]; for (int i = 0; i < len; i++) { fbuff[2*i] = fbuff[2*i+1] = buffer[i]; } play_buffer(fbuff, 2 * len, _sr, ALERT); } catch (...) { delete [] fbuff; throw; } delete [] fbuff; return; } void c_portaudio::silence(float secs, int _sr) { int len = secs * _sr; int nosound[len]; memset(nosound, 0, sizeof(*nosound) * len); play_sound(nosound, len, _sr); } void c_portaudio::play_mp3(std::string fname) { if (fname.empty()) return; FILE* pFile; pFile = fopen(fname.c_str(), "rb"); if (pFile == NULL) { return; } fclose(pFile); drmp3_config config; drmp3_uint64 frame_count; float* mp3_buffer = drmp3_open_file_and_read_f32( fname.c_str(), &config, &frame_count ); if (!mp3_buffer) { LOG_ERROR("File must be mp3 float 32 format"); return; } LOG_INFO("\n\ MP3 channels: %d\n\ sample rate: %d\n\ frame count: %ld\n", config.outputChannels, config.outputSampleRate, long(frame_count)); if (config.outputChannels == 2) play_buffer(mp3_buffer, config.outputChannels * frame_count, config.outputSampleRate); else play_sound(mp3_buffer, frame_count, config.outputSampleRate); drmp3_free(mp3_buffer); } void c_portaudio::play_wav(std::string fname) { playinfo.frames = 0; playinfo.samplerate = 0; playinfo.channels = 0; playinfo.format = 0; playinfo.sections = 0; playinfo.seekable = 0; if ((playback = sf_open(fname.c_str(), SFM_READ, &playinfo)) == NULL) return; int ch = playinfo.channels; int fsize = playinfo.frames * ch; float *buffer = new float[fsize]; memset(buffer, 0, fsize * sizeof(*buffer)); if (sf_readf_float( playback, buffer, playinfo.frames )) { if (ch == 2) { play_buffer(buffer, fsize, playinfo.samplerate); } else { play_sound(buffer, fsize, playinfo.samplerate); } } sf_close(playback); delete [] buffer; } void c_portaudio::do_play_file(std::string fname) { if ((fname.find(".mp3") != std::string::npos) || (fname.find(".MP3") != std::string::npos)) { //std::cout << "do_play_file(" << fname << ")" << std::endl; return play_mp3(fname); } if ((fname.find(".wav") != std::string::npos) || (fname.find(".WAV") != std::string::npos)) { return play_wav(fname); } LOG_ERROR("%s : Audio file format must be either wav or mp3", fname.c_str()); } void c_portaudio::play_file(std::string fname) { guard_lock filelock(&filelist_mutex); //std::cout << "filelist.push(this, " << fname << ")" << std::endl; filelist.push( FILELIST(this, fname)); } // write len elements from monophonic audio stream to ring buffer // ring buffer is stereo; LRLRLR... void c_portaudio::mon_write(double *buffer, int len, int mon_sr) { guard_lock filter_lock(&filter_mutex); float *rsbuffer = 0; if (!bpfilt) init_filter(); try { // do not resample if alert samplerate == modem samplerate if (sr == mon_sr) { rsbuffer = new float[2*len]; if (progdefaults.mon_dsp_audio) { double out; for (int n = 0; n < len; n++) { if (bpfilt->Irun(buffer[n], out)) { rsbuffer[2*n] = rsbuffer[2*n + 1] = gain * out; } } } else for (int i = 0; i < len; i++) rsbuffer[2*i] = rsbuffer[2*i+1] = buffer[i]; monitor_rb->write(nubuffer, 2 * len); delete [] rsbuffer; return; } // sample rates not equal; resample monophonic else { for (int i = 0; i < len; i++) fbuffer[i] = buffer[i]; double src_ratio = 1.0 * sr / mon_sr; int oframes = len * src_ratio + 10; float *nubuffer = new float[oframes]; rcdata.data_in = fbuffer; // pointer to the input data samples. rcdata.input_frames = len; // number of frames of data pointed to by data_in. rcdata.data_out = nubuffer; // pointer to the output data samples. rcdata.output_frames = oframes; // nusize; // Maximum number of frames pointed to by data_out. rcdata.src_ratio = src_ratio; // output_sample_rate / input_sample_rate. rcdata.end_of_input = 0; // resample before filtering int erc; if ((erc = src_process (rc, &rcdata)) != 0) { LOG_ERROR("rate converter failed: %s", src_strerror (erc)); throw; } int flen = rcdata.output_frames_gen; float *rsbuffer = new float[2*flen]; if (progdefaults.mon_dsp_audio) { double out; for (int n = 0; n < flen; n++) { if (bpfilt->Irun(nubuffer[n], out)) { rsbuffer[2*n] = rsbuffer[2*n+1] = gain * out; } } monitor_rb->write(rsbuffer, 2*flen); delete [] rsbuffer; delete [] nubuffer; return; } else { for (int n = 0; n < flen; n++) { rsbuffer[2*n] = rsbuffer[2*n+1] = nubuffer[n]; } monitor_rb->write(rsbuffer, 2*flen); delete [] rsbuffer; delete [] nubuffer; return; } } } catch (...) { if (rsbuffer) { delete [] rsbuffer; rsbuffer = 0;} throw; } } // read len elements of 2 channel audio from ring buffer //size_t c_portaudio::mon_read(float *buffer, int len) //{ // return monitor_rb->read(buffer, len); //} /********************************************************************************** * AUDIO FILELIST processing loop. * syncs to requests for file / clip playback **********************************************************************************/ bool filelist_thread_running = false; bool filelist_terminate_flag = false; static void * filelist_loop(void *args) { // SET_THREAD_ID(AUDIO_ALERT_TID); alert_thread_running = true; alert_terminate_flag = false; FILELIST fl; while(1) { MilliSleep(50); if (filelist_terminate_flag) break; { guard_lock filelock(&filelist_mutex); if (!filelist.empty()) { fl = filelist.top(); filelist.pop(); fl.cpa->do_play_file(fl.fn); } } } return (void *)0; } /********************************************************************************** * Start FILELIST Thread **********************************************************************************/ static void start_filelist_thread(void) { if(filelist_thread_running) return; memset((void *) &filelist_pthread, 0, sizeof(filelist_pthread)); memset((void *) &filelist_mutex, 0, sizeof(filelist_mutex)); if(pthread_mutex_init(&filelist_mutex, NULL)) { LOG_ERROR("AUDIO_ALERT thread create fail (pthread_mutex_init)"); return; } memset((void *) &filelist_pthread, 0, sizeof(filelist_pthread)); if (pthread_create(&filelist_pthread, NULL, filelist_loop, NULL) < 0) { pthread_mutex_destroy(&filelist_mutex); LOG_ERROR("AUDIO_ALERT thread create fail (pthread_create)"); } LOG_VERBOSE("started audio alert thread"); MilliSleep(10); } /********************************************************************************** * Stop AUDIO_ALERT Thread **********************************************************************************/ static void stop_filelist_thread(void) { if(!filelist_thread_running) return; filelist_terminate_flag = true; MilliSleep(10); pthread_join(filelist_pthread, NULL); LOG_VERBOSE("%s", "pa filelist thread - stopped"); pthread_mutex_destroy(&filelist_mutex); memset((void *) &filelist_pthread, 0, sizeof(filelist_pthread)); memset((void *) &filelist_mutex, 0, sizeof(filelist_mutex)); filelist_thread_running = false; filelist_terminate_flag = false; } #endif fldigi-4.2.05/src/soundcard/doesnot.cxx0000664000175000017500000024343014611711171014741 00000000000000#define DOESNOT_SIZE 9927 int int_audio_doesnot[DOESNOT_SIZE] = { 14, -241, -5, -258, 42, -392, -407, -1046, -825, 269, -648, 178, -355, 907, 59, -37, -472, -353, 300, 1445, 3439, 2079, 2224, -242, -158, 499, -196, 649, 1672, 2503, 988, 967, 1144, -164, 1398, 894, 114, 674, -163, -1479, -1924, -248, -585, 1087, 2381, 1989, 1095, 376, 520, 405, 2273, 1822, 1640, 2522, 2459, 1480, 540, 1235, 1166, 1269, 2486, 1911, 1667, 2252, 1997, 2669, 3137, 2966, 1354, 847, 329, -481, -375, 193, 0, -871, -350, -525, -772, -584, -1065, -1670, -844, -904, -1601, -670, -232, -1413, -1318, -1240, -1598, -1304, -589, -222, 175, 217, 40, -304, -1641, -1863, -2343, -2660, -3049, -2758, -3211, -3236, -2722, -2509, -1628, -1999, -2667, -2943, -2782, -2295, -1572, -761, -268, -493, -629, -776, -376, -99, 423, 1411, 883, 759, 577, -421, 110, 432, 636, 2104, 2917, 3169, 3581, 2002, -269, 441, -502, 787, 2638, 1444, 3067, 1699, 121, -278, -308, -53, 270, 2146, 569, -268, 204, -289, -349, 72, 9, -723, 8, -1221, -2370, -1181, -275, 76, 1105, 1911, 760, -396, -810, -1880, -1723, -236, -608, -1970, -3173, -2514, -3390, -1731, -9, -648, 219, -48, -126, -538, 678, 605, 627, 1077, 1200, 596, -181, 738, 1063, 2000, 2538, 2195, 1350, 133, 732, 463, 709, 1606, 114, 1203, 1606, 2109, 1541, 2139, 1083, -141, 1770, -202, 1655, 1795, 998, 980, 113, 232, -622, -572, -1708, -1115, 432, -78, 229, 144, -267, 48, 838, 1430, 1204, 1543, 507, -645, -716, -738, -314, -406, -1332, -1581, -1432, -1598, -1660, -919, -941, -1050, -502, 102, -545, -276, -24, -541, 226, 497, 487, -143, 464, -679, -634, 744, 1722, 2082, 2114, 1267, -333, 125, 208, 943, 2506, 2101, 1341, 599, -106, 377, 349, 1692, 156, 183, -537, -2332, -1384, -1044, 0, -562, -613, -385, 236, 1100, 545, 310, 417, -56, 147, 86, -19, -95, -301, 73, -81, -90, -182, -35, -365, -805, -339, 208, 541, 229, -105, -638, -748, -311, -36, 317, 42, -680, -736, 367, 2191, 2396, 2214, 2532, 1635, 1590, 2025, 2356, 2541, 1747, 1043, 1333, 1861, 2333, 2507, 2317, 1824, 1323, 1395, 1367, 1363, 318, -333, -9, 40, 471, 229, -94, -490, -718, -885, -1417, -1599, -1914, -1823, -1601, -1500, -1471, -1657, -1556, -1537, -1986, -1438, -855, -517, -340, -998, -930, -1227, -1543, -1966, -1996, -2052, -2383, -1771, -1527, -758, -1345, -2683, -2573, -2809, -1649, -486, 295, 84, 216, 314, -898, -614, 468, 1258, 64, 2336, 717, 327, 3112, 1614, 2994, 3352, 2962, 1139, 469, 185, -838, 1214, 2334, 1325, 1470, 1706, 590, 1160, 2825, 1985, 1322, 1331, 265, -237, 118, 654, -723, -66, -521, -1453, -489, -535, -495, -613, 259, -1250, -869, -224, -496, 936, 281, 721, -1618, -1938, -1673, -1874, -709, -1025, -180, -1500, -1177, -1907, -2547, -1601, -1544, -359, -792, -309, 20, -578, -21, 320, 1672, 1399, 1135, 1074, 83, 868, 1342, 2047, 2326, 2995, 3058, 3192, 3214, 1318, 1461, 1238, 1520, 2909, 2171, 1381, 489, 227, 584, 799, 561, 315, 884, 235, -59, -279, -566, -471, -767, -181, -187, 66, 199, -173, -729, -1004, -468, -1369, -1771, -2291, -2501, -1162, 683, 956, 155, 146, -1242, -1676, -1047, -988, -1010, -1442, -2108, -2591, -1250, -739, -67, 1673, 1574, 64, -935, -850, -822, 133, 466, 1245, 651, 484, 1610, 1854, 3856, 4110, 3961, 2605, 833, 1872, 2302, 2941, 2966, 2003, 1490, 1082, 2148, 2563, 3356, 3199, 1302, 1192, 139, 199, -24, 300, 848, -208, 31, -19, -273, -868, -619, -1354, -2034, -2015, -1119, -1195, -1053, -428, -1455, -536, -391, -500, -602, -756, -1117, -1945, -2376, -2804, -2066, -2793, -3937, -4006, -3598, -2261, -1698, -687, -816, -229, -347, 678, 2198, 1841, 634, 442, 175, -2530, 1964, 3751, 718, 642, -46, -385, 2683, 4954, 4092, 2657, -1648, -3250, 3952, 3954, 5638, 7496, -2166, -5170, -8494, -2713, 4267, 5633, 7805, 375, -6580, -5687, -2189, 2730, 5129, 4103, 1906, -8418, -4940, 25, 1174, 6276, 1824, -384, -6553, -6788, -106, -657, 1866, 1984, -5395, -6350, -4077, 3657, 7037, 5750, 4852, -8257, -11716, -8287, 336, 7368, 4454, 4912, -5277, -12082, -2949, 2466, 7883, 9484, 1275, -6813, -6398, 909, 5919, 9649, 4765, -3980, -5343, 1084, 10784, 10157, 6169, -2909, -9191, -1481, 6955, 12495, 4057, 3167, -2337, -7648, 5383, 4409, 5440, 1216, -2250, -643, -1791, 1834, -759, -1580, -2083, -156, 29, 103, 1097, 734, 955, 4730, 5402, -616, 819, 3000, 3668, -25059, -18042, 13013, -6744, 24161, 21023, -21063, -22263, -30351, 7375, 2614, 12302, 24724, -23840, -30082, -15107, 11693, 30148, 24769, 9894, -11316, -31120, 15533, 12814, 8856, 9610, -29809, -25882, -29114, 935, 5778, -9150, -1403, -19016, -13668, 21767, 29998, 29993, 5181, 624, -12204, -15536, 23619, 16640, -9750, -28730, -25793, -24874, -4465, 25667, 16311, 1614, 5591, 15336, 9497, 19655, 28203, -5231, -3706, 1634, -8008, -13086, -24997, -14624, -16574, 3122, 23905, 4541, 16274, 10268, 11216, 19875, 14988, 22091, -14038, -14804, -13467, -23728, -3024, -3199, -6551, -9312, -5146, 10791, 14453, 29180, 24618, -2208, -24905, -19045, 25479, 14274, 19016, 15384, -30375, -28417, -26370, 8053, 27567, 4261, 4672, -20913, -18885, 24436, 27659, 25652, 4717, -26073, -28501, -26585, 9635, 7650, -29846, -25335, -26911, -10533, 18593, 30359, 24883, -4434, 3239, 19526, 7575, 15342, -6011, -29661, -28235, -26856, -8022, -809, 11325, 383, -13493, 14841, 31958, 29467, 13940, -12228, -26213, -30797, -12935, -1344, -23255, -13780, 9924, 20615, 31999, 24332, -6036, -23871, -13790, 14454, 18718, 7223, -1007, -20557, -7433, 13481, 10459, 976, -6628, -4223, -3892, 13494, 21922, 8892, 7274, -1309, 1395, 16453, 16815, 2690, -20734, -23642, 15257, 28923, 24481, 13126, -21263, -30688, -26750, -4446, 29693, 15169, -10934, -12676, -11246, 15061, 31223, 8745, -23421, -29895, -27756, -12435, 12482, 7739, -18388, -28508, 6756, 28873, 30590, 20259, -13768, -30878, -23637, 11560, 23389, -5212, -19182, -26425, -14607, 15870, 31589, 8903, -17829, -13628, -10289, 8048, 27420, 10424, -15625, -25982, -18472, 2051, 21373, 19399, -4035, -15055, 6437, 15954, 9674, 6044, -8578, -14375, 2712, 16936, 22250, 8768, -6151, -5544, -8471, 4889, 8422, -736, 3580, 5887, 9498, 3869, -847, 1394, -9773, 5760, 15445, 15207, 11185, -17520, -31236, -3510, 27375, 27342, 20977, -11457, -31764, -29043, -10255, 26089, 21730, -20864, -26617, -7739, 10032, 31999, 13761, -23760, -31040, -27947, -4505, 12224, -1314, -14967, -29041, 1842, 29907, 22042, 5186, -20706, -27559, -15144, 12589, 17641, -9004, -8645, 3175, 12015, 25219, 12942, -10240, -24151, -12300, 1659, 7319, 17143, 11770, 5139, 1578, 2084, 3737, 6609, 11117, -4365, -20666, -10116, 10200, 13287, 17146, 15078, -2167, -3666, -3804, 547, -2146, -12874, -5896, 5430, 13522, 20362, 6817, -5759, -3775, -2378, -470, -12935, -15004, -6568, 18245, 27437, -13249, -28837, 17793, 26703, 13996, 16077, -21728, -31998, -27012, -4572, 30915, -3998, -18500, 7916, -6087, 17564, 27884, -18058, -28968, -28577, -15598, 3776, -483, 2547, -15708, -2331, 31999, 18597, 4615, -12128, -23497, -14692, 6675, 21550, -4780, -21769, 515, 13356, 25845, 26462, 1340, -20876, -20668, 6862, 7755, 1769, 2879, -13280, -10517, 13688, 21210, 13932, 17191, 6830, -19974, -25469, 483, 7580, 6398, 16513, -2651, -13587, -5265, 3078, 11227, 1822, -2822, 2610, 1378, 17847, 7978, -16101, -17686, -12562, 15443, 9695, -24407, -22440, 19952, 27688, 20056, 14406, -24340, -30956, -20149, 11620, 27003, -17399, -18943, 4906, 3230, 28489, 18780, -23053, -28135, -19856, 10333, 10960, 1418, 2952, -21983, 4434, 30442, 7394, -11592, -17172, -4278, 4986, 17058, 12687, -18235, -11222, 19404, 25900, 16881, -887, -16878, -26477, -6722, 26365, 14077, -6869, -2808, -9392, -5492, 10439, 2930, -2508, 7356, 12315, -10493, -13256, 13963, 8052, 83, -1590, -17369, -19064, -16714, -1620, 13185, 1875, 13205, 18579, 6314, 5657, -17217, -18194, -5864, -21493, -26607, 11335, 25457, 15639, 29756, -9899, -30710, -21355, 3942, 18598, -24337, -15356, 10927, 13360, 29174, 23053, -11039, -18859, 726, 14824, -12376, -27145, -18931, -18285, 11942, 29524, 17423, -6304, 105, 21763, 13405, 5356, -4809, -21904, -14322, 6503, 13932, 3375, -7312, -4102, 2755, 23401, 18692, -11707, -16331, 4880, 17575, 11178, 711, -18551, -18189, 8454, 20461, -4233, -25814, -3385, 18141, 25075, 20423, -7095, -24621, -26675, -22646, -9373, -9151, -4885, 8349, 20431, 30743, 14071, -21147, -27915, 12208, 11762, 5771, -664, -30408, -23544, 665, 31700, 13696, -20405, -4599, 3805, 15964, 27551, -6492, -26446, -17297, 16787, 24127, -5525, -9203, -19230, -8377, 23422, 21416, -8709, -20117, 4091, 14348, 14275, 12246, -6149, -15386, 5303, 16675, -6543, -22805, -18516, -2468, 19500, 31322, 18742, -5235, -16641, -19638, -11553, 7015, 5565, 3446, 16930, 15784, -1968, -28205, -22725, 5662, 11923, 16075, 323, -1852, 9673, -5125, -5090, -17193, -27830, -13050, 11875, 26516, -10503, -17238, 27215, 19418, 25284, 10337, -28689, -27088, -24177, 13570, -1900, -21160, 329, 13957, 27436, 28370, 14746, -14358, -23217, -1999, -7380, -21698, -11833, -18369, -6235, 12411, 21972, 6932, 5951, 21375, 11496, -5226, -7565, -4889, -13149, 3710, 15257, -1634, -8868, 953, 1450, 21, 6539, 11211, -2689, 263, 8765, -10469, -20038, -1704, 19806, 20282, 10229, -2028, -25427, -20443, 4096, 5092, -5934, -7503, 9722, 16801, 13386, 8714, -8299, -20633, -12929, 2679, -7830, -22550, 20859, 19220, 19987, 22906, -12944, -26705, -15403, 13387, -5007, -23323, -10260, 8688, 11007, 28836, 16417, -5296, 5203, 19578, 13032, -15248, -21355, -22746, -22473, -4094, 241, -16686, -4384, 18726, 27382, 15134, 6836, -1518, -4326, 16362, 13198, -16303, -24303, -10938, 626, -644, -1154, -9699, -8886, 18710, 27791, 6165, -11937, -2833, 11809, 20578, 6912, -8058, -27685, -22292, 5035, 3209, -9538, -20368, -4668, 12946, 24773, 19879, 5211, -7995, -576, 12088, 1044, -29118, -21421, 4146, 14750, 27493, 1484, -16990, -24678, 11665, 21717, -184, -20599, -14467, 2353, 11646, 23208, -6821, -14447, 5810, 28673, 11850, -3906, -12169, -18267, -3977, 4348, -10135, -25102, -16644, 10045, 15443, 9002, 2840, -678, 14101, 28655, 19083, -13146, -16889, -1819, 3280, 3588, -3784, -22660, -20970, -2839, 13529, -6000, -10864, 9151, 22628, 27424, 20362, -2459, -19780, -2421, 9347, -2037, -23834, -23897, -13485, 7205, 2301, 5205, -633, 10412, 22060, 13882, 9715, -6637, -9071, -18604, 9466, 7558, -1565, -6614, -8228, -3717, 7498, 11480, -3051, -1905, 1929, 3690, -3188, 6314, 3019, 356, -3838, -2546, -4247, 2939, 7997, 977, -4575, -9461, -3056, 2590, 6099, -2730, -14027, -10466, 9430, 14478, 3541, -10512, -6057, 8829, 10399, 9683, -1798, -17109, -12943, -1583, 4324, -7563, -13623, -769, 12725, 14137, 5461, -4594, -10660, -5506, 1432, 1974, -8375, -10710, -6968, 5483, 8126, 4048, -4725, -3462, 14337, 13716, 5142, -8280, -6061, -1503, 268, 3232, -2247, -8544, 213, 8829, 4347, 4537, 7675, 9456, 5208, 2365, -4392, -5136, 2189, 1679, -4936, -8271, -8451, -1024, 14687, 15386, 460, 997, 12693, 9505, 5198, -2200, -15941, -19676, -5238, 6458, 1189, -11408, -4356, 12094, 12067, 18748, 7377, -10783, -7970, 2192, 5431, -8496, -16433, -14028, -13182, -554, 10761, 5252, -2815, -65, 11088, 8763, 2308, -7249, -13687, -8885, -2804, -2693, -8577, -7844, 3532, 14153, 18194, 9568, 356, 4205, 5432, 3394, -6167, -14286, -13308, -4382, 3340, 2762, 3072, 9490, 10656, 7748, 9428, 3937, -383, -165, -1081, -5122, -10535, -5087, 69, 2594, 3575, 1779, 9447, 9925, 7609, 583, -7284, -4129, -244, -1989, -6416, -5622, -4298, 1619, 3840, 6281, 2255, 1834, 6425, 5031, 58, -11899, -12236, -10269, -5606, -3142, -4967, -4039, -4833, 5823, 16292, 11928, 4834, -2960, -4224, -1460, -1475, -7602, -16630, -13404, -1300, 9328, 10730, 3942, 3219, 11314, 15260, 10936, -3153, -11702, -11154, -5648, 112, -766, -3300, -3520, 2626, 12121, 8329, 2159, 2236, 1317, 5470, 2606, -6020, -9501, -4596, 3810, 1417, -4915, -2516, -1968, 3135, 6114, 2468, 1700, 2004, 1260, -632, -4667, -6804, -5769, -3649, 304, -2073, -1975, -1031, 7262, 7590, -61, -1625, -2935, -1590, -6328, -8575, -9574, -9400, -2337, 6366, 6629, 4818, 7580, 6438, 4545, 2618, -473, -4942, -7877, -4450, 1041, 312, -2765, 512, 6436, 12916, 15970, 7773, 1078, -2147, -3881, -2409, -1185, -3126, -7786, -1772, 3589, 7063, 5793, 3661, 4453, 5390, 7570, -675, -6748, -5729, -3, 162, -3518, -3105, -875, 1198, 5465, 4975, 1246, -933, -625, 1833, 277, 5, -3435, -1887, -2750, -2286, 1230, -22, 1717, -1063, -2583, -161, 986, 560, -263, -1583, -3957, -1148, 1476, -1276, -2996, 1758, 5174, 4677, 5645, 2986, 141, 307, 1302, -810, -3838, -2764, -1390, -872, 730, 2779, 3191, 5445, 11788, 7733, 110, -1058, -215, -1564, -3473, -2893, -5297, -7624, -1727, 5290, 5738, 7676, 2197, -1991, -800, 2635, 524, -9500, -7117, -4510, -3028, 286, 402, -71, -989, 3486, 2809, -1203, -3027, -6542, -4555, -1677, -2771, -6597, -7026, -1980, 1066, 921, 712, -3942, -2862, 2664, 1667, -142, -4044, -4287, -1739, -271, 553, -1017, -2713, -1009, 6165, 9484, 4601, 3452, 3985, 992, 689, -1318, -5503, -7301, -2948, 1743, 3612, 8029, 10377, 8521, 4455, 2299, 4410, 172, -5062, -5190, -5328, -2883, -314, 3436, 4361, 5090, 3797, 3428, 2424, 1208, -1093, -5525, -2630, -1577, -712, -2547, -3759, -833, 990, 3462, 4893, 1655, -1729, -2511, -978, -229, -2727, -3723, -5916, -6115, -1265, 477, 464, -113, -354, 1583, 4522, 6981, 354, -2728, -1625, -334, 1750, 67, -1670, -5036, -760, 4983, 5763, 6874, 6248, 4430, 3155, 3114, 1885, -3082, -5852, -3080, -965, 477, 5078, 5969, 2799, 4725, 8357, 5669, 2643, 1788, -4451, -7235, -4015, -1357, -3761, -3475, -278, 99, 5366, 8471, 2295, -1855, -1014, -27, -374, -3696, -3702, -6975, -5508, 1975, 896, -1136, -2788, -3601, 317, 2069, -482, -3550, -6151, -2797, -435, -782, -1219, -4460, -2992, 146, 3048, 3699, -58, 260, 2130, 4753, 3502, -1696, -2636, -1351, 1466, 3227, 2128, 1066, 1465, 5737, 8617, 4278, 146, -2540, -1243, 1886, 1716, -248, 997, 2061, 3901, 6260, 1738, -30, -392, 213, 1134, -1413, -1679, -2078, -561, 2252, -716, -2764, -940, 3483, 3416, -75, -1344, -758, -368, -880, -466, -4854, -4968, -661, 1281, -373, -4613, -3519, -1844, -247, 1415, -1191, -3610, -3112, -241, 1740, -378, -4478, -6216, -3211, 1456, 2294, 82, -1548, -69, 4141, 6148, 2928, -1537, -3073, -1186, 908, 608, -449, -245, 12, 4051, 6848, 3885, 411, 478, 2134, 265, 927, -955, -1788, -1, 2256, 5271, 1313, 451, 1956, -324, 1231, -383, -1706, -3197, -257, 2033, -814, 2067, -1880, 1398, 2190, 755, 1641, -2496, 472, -1566, -3991, -1948, -1985, -590, -447, 394, -391, -2267, 362, -1613, -1854, -862, -2290, 518, 625, -1588, -1238, -1389, 1265, 2168, 2293, 1315, -1733, 3061, 4029, 1920, 1689, 260, 727, 1291, 2339, 1233, -2057, -1182, 375, 2917, 4470, 3251, 2877, 1704, 1566, 2574, 1135, -1810, -624, -2200, -2753, 890, 236, -1394, -1180, 710, 1703, 2241, 2044, -220, -1039, -1208, -1840, -1957, -1914, -1558, -668, 1388, 1135, 269, 544, 291, 269, -1686, -2783, -3099, -4036, -3481, -1644, -317, -264, 469, -501, -680, -1120, -654, 528, -1159, 28, 409, 24, 933, 1007, 756, -783, 736, 2618, 2, 1530, 3092, 1643, 1964, 3720, 5342, 1710, -151, 449, -1638, -552, -87, -518, -23, 1314, 4982, 4226, 3085, 1902, -732, -31, -103, -1495, -2384, -2987, -767, 1662, 2527, 1706, -230, 1525, 3342, 1568, 263, -1668, -4390, -2594, -289, 438, -291, -1473, -1409, -739, 786, 128, -837, -1901, -2878, -1398, -780, -2285, -2113, -1953, -582, 270, -836, 833, -169, -303, 1897, 2199, 1717, 573, 1304, 816, -473, 617, -465, -405, 1069, 2500, 3015, 560, 2789, 3294, 557, 400, -139, 342, -459, -186, 1133, -847, -420, -262, -6, 1802, 1179, 1451, -20, -542, 1060, -1118, -1885, -907, -2303, -2672, -1402, -276, -138, 45, 3018, 2619, 558, 537, -294, -1637, -2635, -2098, -3127, -3266, -468, 265, 259, 899, 246, -753, 178, 883, -1358, -1636, -1840, -122, -2092, -264, 208, 792, 6313, 62, 1290, 3658, 529, 597, 2743, 492, -550, 436, 267, 1007, 1507, 1196, -157, 2750, 3487, -2204, 679, 1317, -6033, 2208, 3434, -839, -15, -2309, -3883, -1017, -56, 106, 887, 1097, 1418, -645, -627, -2438, -3240, -749, 2738, -1799, -2408, 840, 504, 464, 1206, 1875, 2654, -50, 100, 1901, -1933, -333, -3700, -814, -517, -3481, -700, 40, 1547, 234, 157, 994, 2318, 1633, 1638, 2544, 1192, 196, 1212, 4000, 3083, 506, 2356, 3576, 1041, -54, 798, -4926, 1433, 2964, 3042, 4239, -330, 4972, 3585, 5539, 2595, -222, -4192, -3265, -1923, -2272, -611, -3909, -1998, -29, 3364, -944, -1651, 9, 1555, -713, 400, -1136, -4509, -2553, -4343, 1880, -1059, 178, -1336, 33, 958, 1872, 466, -2562, -12539, -7432, 6957, 4375, 8101, -6450, -4631, -15375, -4008, 8122, 5052, 263, -8438, 572, -1357, 6747, 8876, 2877, -5480, -2749, 6405, 10046, 3666, 1868, -3994, -3715, -1572, 5507, 1037, -7743, -3513, -1080, 6291, 5710, 7122, -2447, -3017, 4064, 9112, 5036, 318, 333, 339, 2840, 1711, -791, -3428, -6689, -2667, -3990, -3120, -1005, 854, 1106, -5488, 1007, -1989, 1112, -1290, 25, -2132, -1736, 1176, -2571, -23346, -930, 13500, 13752, 20702, -10579, -3579, -29186, -1935, 10159, 3312, -9068, -22375, -5847, -12833, 16743, 18257, -1731, -11875, 4764, 24417, 23256, 10821, 7998, -16681, -14019, -1089, 7832, -6720, -26119, -14691, -15748, 5911, 14094, 20824, 1463, 236, 21333, 25034, 22371, 9937, 3487, -4705, 63, 11897, 1239, -12487, -19242, -17453, -16624, -7419, 1562, -1254, 1005, 4757, 19866, 16997, 19002, 12373, 1722, 379, -4963, -1347, -5500, -10416, -13581, -16397, -7988, 2119, -10521, -27129, 585, 12157, 24261, 25708, 182, -10005, -29004, 3511, 10277, 724, -16440, -29339, -18997, -13202, 19300, 23715, -3486, -14346, 4330, 20845, 26836, 17069, 7384, -21511, -21631, -3433, 5721, -7210, -26804, -20112, -22282, -1423, 18253, 22081, 1774, 520, 22015, 28059, 27286, 20938, 5572, -10833, -5314, 3839, -6595, -21074, -24276, -22507, -10250, 11503, 19169, 15820, 4249, 6756, 24358, 22523, 27886, 7153, -4554, -4583, -8353, -4141, -7349, -7854, -19575, -18857, -460, 526, -22250, 15172, 15887, 23255, 25095, 725, 220, -31596, 2701, 1452, -2950, -16844, -29306, -17991, -15853, 17422, 26263, 4261, -8848, 7900, 17318, 24304, 17555, 9643, -22014, -27262, -15757, -7554, -11166, -24910, -19008, -22079, 531, 21839, 27082, 10242, 5721, 16233, 20403, 22659, 17439, -204, -17264, -14413, -7340, -12750, -23564, -26515, -25839, -13054, 13249, 20686, 21116, 6419, 1597, 19446, 17633, 25368, 1637, -15079, -12280, -15651, -7519, -6847, -8332, -17834, -20627, -1984, 8597, -13935, -2178, 27777, 23044, 31359, 18410, -5677, -24041, -26366, 1583, -1247, -10450, -21206, -22782, -16348, 4768, 30576, 25565, 2165, 1477, 17895, 17742, 25619, 20760, -2423, -25990, -23346, -11428, -7602, -13614, -19299, -18318, -10567, 14942, 30353, 25537, 13589, 13573, 22309, 24281, 23148, 14052, -8258, -18441, -12877, -10867, -18744, -25125, -23734, -17846, -157, 20191, 23528, 23069, 7340, 13443, 22265, 18428, 17798, -7652, -13745, -17264, -16770, -9860, -8216, -12752, -18013, -13970, -2524, 9376, 818, -13899, 19100, 26522, 22475, 27088, -6120, -15684, -31130, -8676, 1145, -7629, -14279, -26566, -17547, -2085, 24868, 29248, 11420, -4408, 8384, 12220, 22854, 20193, 1456, -19634, -28909, -16256, -10159, -9319, -18748, -17779, -18318, 1391, 22316, 28815, 22440, 14599, 17612, 15777, 17398, 15386, 884, -13006, -15706, -17023, -21596, -25334, -20549, -18054, -8970, 8991, 18875, 23268, 21329, 14389, 17064, 12386, 16349, 3455, -9077, -11041, -18362, -17873, -13998, -8560, -14028, -11803, -4061, 3354, 6238, 1998, -6674, 29737, 17107, 23980, 17972, -9680, -10019, -29368, 1591, -8323, -3646, -13554, -15772, -11033, 756, 23690, 24655, 13893, 2428, 13413, 4623, 18036, 13506, 3020, -16915, -22921, -17538, -15640, -9221, -7393, -10484, -17331, -4662, 13625, 27298, 24640, 25626, 10676, 4606, 7211, 15078, 12958, -6713, -15062, -25189, -26506, -19814, -9529, -6748, -11930, -779, 11976, 24586, 24916, 11546, 14119, 1278, 6888, 2831, -1280, -5194, -21242, -19748, -17853, -9200, -9011, -5940, -6491, 70, 2732, 13689, -11809, 12662, 22870, 6391, 31061, -4187, 646, -26446, -12022, -4089, -4439, 7679, -11563, -6046, -19392, 7930, 24801, 25849, 7493, 9672, 212, 3056, 15447, 16391, 1450, -24356, -17744, -21652, -10510, -9375, 2556, -13575, -20358, 1386, 18233, 26510, 22547, 22994, 2315, -5065, 10988, 14616, 444, -8323, -15748, -24740, -23752, -9042, -382, -9232, -5350, 3722, 6680, 19337, 10086, 11942, 3448, -977, 8394, 488, 5141, -7159, -14766, -12515, -8681, -3397, -7241, -5592, -4749, -1282, 8190, 15588, -6118, 2461, 26685, 2862, 27951, 4382, -2251, -16362, -22440, 2200, -8154, 13947, -7518, 597, -15438, -4934, 15291, 21247, 17128, 9296, 7923, -9573, 3936, 8098, 10219, -8997, -9276, -18623, -21294, -11381, -574, -364, -7722, 4615, 3638, 10889, 17193, 23786, 11807, 3861, 4418, -3416, -2200, -885, -3740, -20537, -19496, -12575, -10625, -8328, 2911, 2765, -5775, 5605, 1118, 3660, 7863, 9658, 7899, -5813, 3110, -483, -5111, -5032, -4940, -8710, -16477, -2859, -812, 1768, -1643, 6317, 11043, 2557, -10053, 18095, 6058, 5869, 24823, -534, 2794, -27900, -4542, -9407, 2022, 12186, 5520, -527, -21953, -3794, 5559, 17315, 13397, 17226, -6173, -9267, -1885, 12747, 6425, -84, -3890, -17434, -18858, -13653, 5666, -573, 2443, 798, 762, 3276, 14184, 18086, 12963, 4378, -1027, -2926, -6314, -1426, -2104, -1893, -5536, -11372, -11288, -9021, -5949, -497, 5573, 4936, -4807, 2812, 5776, 15942, 13282, 7613, 7992, -12985, -6024, -6547, -3055, -440, -7151, -2946, -10353, -4701, 5789, 5199, 12253, 8866, 5582, -6652, -3455, 8534, 4354, 16638, 5554, 610, -11306, -10353, -5539, -7031, 1409, 2270, 1179, -8237, -2387, -3903, 1791, 5242, 11463, 7370, 2595, 5549, 4791, 5707, -2542, 1269, -6032, -10601, -11912, -10012, -5004, -8034, -4926, -4763, -5439, 579, 4634, 8935, 10582, 5439, 4546, 598, 3119, -705, 2713, -1757, -12227, -9050, -14554, -4791, -4407, 2790, 7655, -3362, 3976, 9429, 14297, 16264, 12777, 8353, -6751, -4550, -4703, -6464, -1206, -6640, -3367, -4166, -3209, 5708, 6056, 8183, 10041, 6710, 10060, 2763, 155, -569, -1119, 1102, 530, -321, -10653, -9413, -12221, -4750, 3276, 3646, 6041, -3474, 2705, -1449, 4627, 10617, 3689, 5669, 1992, -756, -4413, -6295, -3804, -6762, -6177, 25, -8508, -6306, -4413, -5996, 504, 7981, 7430, 4818, 1837, 1018, -127, -291, 486, -3791, -312, -920, 1257, 131, -574, 2227, -2922, 4969, 1815, 5033, 5182, -3659, 8470, -1799, 2617, 4726, -2390, -456, -5263, 36, 2181, -7579, 277, -1515, -969, 8181, 6485, 7319, -2518, -3164, -734, 1217, 2266, 5377, -2260, -4351, -4827, -2217, -2882, 548, 5313, -3370, -5997, -4925, -1397, 4590, 5811, 962, -877, -8385, -4819, -851, 2898, 744, -16, -5781, -4824, -3461, 1052, 4167, 750, 4112, -1128, 3015, -401, 1423, 2046, -765, 319, 1966, -4196, -1700, -781, 2043, 6405, 2448, 4466, -3984, 7229, 3048, 6243, 7514, -3412, -2868, -6341, 940, -1171, 5841, -989, -1711, -1188, -1811, -379, 3805, 5291, -5808, 2631, -3869, -875, 5490, 1990, -957, -5995, -4640, -1532, 368, 941, -2689, 1552, -4528, -1067, 231, -1316, 1435, -3059, 432, -3897, 2234, -1561, -2444, -77, -1760, -4508, 806, -2353, -3312, -1254, 562, 1832, 5419, 2314, -2689, 9272, -1123, 3325, 3507, 3284, -2049, -1377, 195, -1036, 2954, 4761, 2916, 3138, 65, 1354, 9151, -3446, 9158, 1518, 1610, 231, 2524, 7940, -4325, 2239, -2797, -2599, 622, -2100, -1179, -2797, -3489, 1906, -1306, 1967, 5139, -978, 1097, -502, 2206, 539, -1015, 3897, -3554, -3496, -2109, 1023, -7873, -575, -8192, -7991, 2451, -7571, 6972, -5309, -1144, 200, -953, 6520, 479, 215, -2611, -4964, -2238, 980, -2542, 3086, -3266, -375, 2839, -401, 5998, 575, 7495, 1644, -534, 2002, 348, 5005, -2275, 2232, 1262, 2794, 507, -66, 2520, 594, 2144, 530, 3152, -2177, 1857, 1608, 11, 4393, -3227, 2791, 847, -2646, 697, -3017, -1359, -3266, -1942, -1372, -2956, -800, -1433, -2171, -761, -1396, 1645, -46, -747, -747, -1286, -194, -818, -463, -2506, -3006, -4576, -1317, -1099, 1625, -704, 83, -88, -1339, 5523, 1703, 1861, 2877, -1187, -121, 223, 2282, 1609, 564, 2672, -675, 3540, 952, 3367, 5247, 916, 2806, 1193, 1673, 2555, 2542, 1386, 9, -165, -493, -45, 256, -333, -245, -1120, -13, -92, 2010, 561, -356, 1306, -837, 2454, -1220, -625, -544, -2333, 591, -505, 471, -1022, -1697, -1695, -395, -753, -931, -1806, -927, -686, -926, 377, -1453, -1417, -1743, -2390, -991, -1221, -503, -1433, -2213, -500, -320, 1158, 2585, 1552, 1096, 1090, 949, 2304, 988, 3332, 455, 1763, 990, 178, 2407, 1650, 2015, -40, 1725, 2066, 2394, 1031, 933, 485, 654, -6, 1895, -1671, -42, 127, -971, -505, -1847, 1227, -1931, 472, -1674, 467, -135, 81, -797, -320, -898, -869, 740, -1468, 681, -3420, -725, -1337, -788, 549, -1610, -1960, -778, -3022, -848, -1263, -24, -642, -1756, -271, -3417, 329, -1347, 1148, 414, 346, 1513, 63, 1724, 1145, 1065, 1191, 2029, 2605, 1368, 832, 1002, 2077, 1945, 2514, 1478, 737, 1227, 2030, 2965, 2291, 961, 124, 998, -268, 2451, 1307, 203, 823, -502, 1053, -142, 302, -186, -2343, -921, -742, 634, -731, -1113, 94, -570, 640, 1393, -509, -923, -808, -2082, -468, -1676, -1920, -2633, -1897, -880, -745, -673, -929, -1321, -1745, -138, -732, 303, -1136, -1312, -841, -862, 803, 749, 267, 113, 302, 1768, 1438, 606, 1233, 361, 1855, 2038, 2091, 1417, 991, 1129, 1790, 2066, 3186, 1679, -297, 217, -723, 1012, 146, 161, 77, -92, 149, 799, 913, 276, 565, 1472, 1303, 568, -220, -924, -532, -2139, -1050, 26, -75, -28, 318, 1048, -1208, -2050, -1188, -1307, -503, -1116, -1681, -1854, -2915, -2827, -1523, -671, -703, -1578, -519, -362, 220, 771, -296, 612, -40, 367, 389, 36, -124, -819, -1291, 515, 1125, 1247, 1968, 1987, 2944, 2792, 2776, 2105, 1912, 2192, 2307, 1453, 1322, 1083, 135, 6, 780, 1188, 742, -21, -136, -440, -79, 1371, 458, -654, -869, -769, -404, -272, 275, -301, -181, 411, 115, 1426, -628, -1582, -428, -95, 472, 232, -639, -3572, -6429, -3138, 598, -708, 525, 1424, -848, -4368, -2392, 244, -2542, -2353, -864, -1368, -2877, -576, 755, -821, 2166, 4391, 3663, 2559, 2821, 2234, 219, 2461, 3965, 2110, 1233, 904, -718, -2492, -210, 654, 1256, 1174, 1643, 1275, 116, 2933, 2511, 3111, 4505, 4458, 495, -951, -1311, -2920, -1457, 63, -557, -672, 2000, -415, -2017, -130, 912, 341, 64, 1487, 73, -754, 47, -2107, -2077, 288, -692, -1678, -672, -1100, -1818, -2609, -734, -6848, -5018, 8109, 588, 2578, 9464, 3775, -6105, -8174, 1043, -6816, -2398, 3483, -870, -2476, -1605, 2262, -2832, 6138, 7748, 1004, 2287, 3890, 2739, -259, 8300, 7573, -1959, -695, -3143, -6032, -6521, 622, 1345, -3124, 2322, 284, 1529, 4387, 7719, 3835, 3376, 1733, -637, -750, -42, 324, -4288, -110, -3500, -261, 684, 1707, -280, -3728, -1416, -2543, 3392, 2204, 1141, -520, -3756, -5651, -5995, -4290, -2179, -569, -3393, 402, 584, -6051, -11682, 9980, 11509, -464, 15567, 6972, -5876, -13860, -1980, -3024, -2248, 8764, -2333, -2791, 336, 3398, -2203, 8609, 15515, -1789, -1950, 3340, -916, 981, 8565, 10825, -1913, -2313, -5779, -11215, -5907, -1054, 1853, -4468, 3638, -1361, -2437, 5287, 7928, 6929, 3461, 2075, -3700, -346, -1141, 1402, 1737, -52, -3808, -3662, -1414, -49, 3477, -907, -799, -4320, -3958, -2912, -3136, 981, -804, -3465, -3580, -4399, -2044, 2069, 1740, 834, -5270, -11894, 8288, 4805, 872, 17804, 5402, -4874, -14379, -2291, -4274, -1912, 13026, 1171, 1066, -620, -1011, -1791, 9422, 16103, 680, 2201, 1404, -5836, -1455, 6225, 10924, 431, 667, -5872, -14553, -8404, -4427, 1113, 2300, 7544, -688, -3050, -396, 948, 6529, 7196, 5887, 191, 1245, -3261, -2195, 205, 2607, 1756, -1171, 4389, -5899, -4697, -3569, -3574, 890, 2150, -564, -8201, -6821, -7666, -1296, 3792, 5574, 756, 2176, 3262, -13481, -27482, 4612, 14088, 16882, 31997, 8548, -11688, -31996, -21430, -14114, 14745, 30417, 16147, 705, -22193, -18487, -5890, 19508, 31999, 21105, 5084, -15358, -27516, -19604, 4340, 27660, 12419, -1521, -20484, -29327, -17517, 8001, 27919, 27432, 20897, -5501, -15037, -5100, 14467, 21679, 14142, -2916, -19744, -27351, -21245, -1952, 14916, 14900, 2999, -6640, -1606, 9555, 20983, 14068, -1562, -7849, -17747, -6022, -118, 8739, 291, -13768, -19614, -19918, 4594, 27370, 12110, -23346, 12683, 16241, 6310, 31999, 17508, -12745, -30266, -29875, -26285, -6541, 27561, 22483, 6410, 730, -20819, -4920, 16970, 30322, 20811, -2352, -18474, -28680, -28963, -14782, 9003, 4829, -5296, -16614, -17242, -2589, 21640, 29860, 24572, 12112, -9827, -22086, -14464, 542, 7077, 4118, -9253, -21061, -22921, -7313, 11610, 22774, 24597, 10261, -7510, -5921, 7375, 17687, 13771, -10140, -19086, -23124, -18088, 1020, 9662, 18633, -3508, -17791, -9815, -1723, 22263, 30208, 22473, -191, -32000, -13533, 3934, 9743, 31999, 16269, -16359, -29221, -28680, -22248, 9451, 29788, 29450, -83, -17293, -22912, -8371, 25031, 29806, 17123, -17899, -28731, -27489, -20769, 10699, 30541, 12848, -4683, -18076, -13152, 6992, 23936, 30066, 10384, -9833, -18463, -19349, -5939, 9986, 11834, 944, -9936, -6086, 2565, 14031, 18406, 10110, -5255, -10866, -8165, 9972, 21386, 17161, 1810, -23632, -24820, -17102, 3725, 25985, 20947, 10055, -12921, -25430, -10420, 4149, 23509, 23044, 6923, -8590, -30146, -24601, 3210, 18837, 28668, 25782, -7888, -30332, -28128, -24869, 4511, 25536, 30906, 2927, -26732, -19086, -8380, 20608, 29129, 11135, -19427, -28852, -25111, -8941, 16307, 30646, 12914, -16590, -19707, -12858, 8054, 21067, 24106, 1269, -18004, -14350, -7697, 8947, 21677, 9452, -8192, -12932, -3576, 5280, 12948, 13918, -5571, -16909, -14510, -2060, 15632, 26114, 16484, -7516, -27769, -26382, -9540, 15488, 31401, 15867, -2166, -20021, -29044, -10394, 10506, 26999, 22019, 3156, -12900, -32000, -11077, 16711, 18954, 30583, 15012, -22936, -29856, -28283, -11347, 18226, 26098, 28505, -10860, -27451, -5705, 5413, 26596, 21978, -7883, -26812, -28698, -16224, 11916, 21911, 27561, 330, -28291, -19031, -1574, 15255, 15385, 10131, -7236, -19177, -8846, 8194, 12713, 12316, -2125, -14688, -13581, 3472, 14519, 10577, 10132, -8665, -21515, -14146, 3805, 20147, 24224, 17292, -7412, -29000, -20989, -5462, 14079, 26905, 12158, -7143, -19325, -21969, -1609, 12002, 21713, 24746, -2332, -25530, -27841, 3740, 19076, 22402, 29873, -6116, -30637, -28547, -22992, 10487, 24925, 28811, 12717, -29333, -17260, 3159, 18895, 27453, 1655, -23748, -28666, -24616, 5058, 23678, 20251, 11580, -20455, -25514, -6141, 16026, 14842, 3041, -7737, -16738, -12150, 7434, 20371, 8591, -3500, -13858, -14262, -2952, 17116, 14659, 1515, -4705, -17142, -18994, -6656, 10189, 20185, 15298, 4504, -16792, -24620, -7045, 4576, 17817, 15018, 1250, -7382, -20169, -8581, 8949, 16292, 25442, 5900, -24594, -24862, 9690, 24604, 23003, 29218, -5834, -29775, -28351, -19141, 16318, 23999, 27458, 10697, -28496, -15289, 15407, 27405, 21748, -1318, -25890, -28249, -23766, 8295, 25144, 13620, 4769, -17975, -15303, 338, 22081, 17482, -8055, -17416, -19750, -8203, 14942, 21022, 4774, -11418, -16681, -7034, 5728, 16680, 10415, -10777, -20433, -13354, -9474, -3166, 7896, 13033, 7494, -1063, -14274, -20152, -8082, 486, 15340, 11813, 896, -6717, -23862, -13035, 8567, 20277, 21763, -9878, -29999, 485, 21761, 23145, 30681, 1415, -27746, -27746, -21781, 11676, 20145, 22842, 9791, -21059, -5833, 20503, 29867, 12966, -10427, -21473, -24262, -17343, 14859, 12625, -2591, -7807, -3854, 13000, 16628, 28296, 11457, -13458, -20236, -8913, 815, 8515, 13238, 3015, -17658, -11387, 13842, 13983, 9939, 2121, -9927, -19168, -10037, 5902, 32, -14289, 7225, 18265, 8126, -4103, -18426, -14077, -11443, 10460, 25298, 11723, -5707, -22591, -22528, 2257, 20252, 20027, -12961, -26331, 12553, 16869, 21872, 25278, -13486, -27768, -29252, -7250, 20685, 2371, 3427, -6125, -15697, 13128, 28998, 25726, 4334, -26406, -17606, -15411, -5655, 14224, -9835, -22518, -22639, 3454, 26179, 23758, 13286, 5578, -13742, -4547, 11680, 1225, -13286, -22667, -5891, -953, 1851, 14719, 11160, -6320, 6132, 14596, 4290, -8884, -12767, -17488, -16618, 10675, 30777, 19072, -14570, -21826, -10757, -2065, 13356, 16005, 6830, -6455, -11924, 6144, 17260, 5256, -726, -20748, -18419, 22848, 19171, 25924, 8498, -22886, -24228, -15474, 16616, 22100, -7731, -23355, 2074, 1981, 22535, 26305, 8299, -3687, -11016, 14125, 3062, -13807, -23348, -16830, -19416, -8015, 8075, 3168, -5425, 5589, 24633, 27288, 17321, -1866, -7181, -23236, -11874, 6938, 421, -22356, -21536, -4424, 7857, 18809, 19873, 7558, -8142, -5160, -860, -5775, -160, 11249, 5118, -14897, -19375, -8010, -5251, 1773, 8280, 3070, 273, 762, 15049, 24796, 6008, -515, -5090, -24123, -15142, 21298, 10449, 9499, -5299, -8625, -4851, -6645, 26410, 5331, -13582, -9364, 10995, 2166, 4434, 8970, 3832, 3796, 2034, 14338, -5475, -15094, -6881, 95, -2444, -3793, -8648, -13560, -9381, 1921, 16055, 11154, 7193, 5386, -1262, -1093, 1439, 6297, 753, -7424, -6030, -4875, -1425, 1423, 2126, -2098, -11352, -14677, -16396, 1495, 23914, 15668, 1885, -17959, -13188, 3588, 10197, 9632, -5246, -6208, -3653, 1424, 1780, 1635, -5997, -11446, -1477, 8478, 7552, -381, -1344, 6750, 12205, 4869, 4850, -5453, -11728, -1541, 8478, 9239, -1398, -3721, -1343, 1912, 5940, 8139, 3443, -6297, -5116, 1347, 126, 55, 4438, 7015, -1035, -8084, -4690, 2762, 4388, 4704, 9506, -1738, -12977, -6713, 3812, 2416, 611, 2735, -4221, -5994, -1075, 5452, 3989, -2062, -1811, -5473, -6056, 202, 3439, -3923, -11079, -5568, 998, 1882, 3177, 6177, 1658, 587, 4477, 2613, -4376, -6840, -5132, -1567, 3049, 5093, 2310, 1876, 7555, 4599, 4488, -163, -5737, -5689, -6744, -564, 5377, 3437, 7086, 6622, 348, 2858, 2285, 3126, -363, -3563, -830, -2591, -6654, -2772, 2947, 3291, -353, -4969, 2353, 4629, 5392, 8191, 488, -5420, -8166, -2529, -1197, -6096, -6910, -892, 5212, 3536, 3840, 2456, -2578, -2841, 4828, 4030, -3837, -13083, -10283, -5116, -4398, 3411, 4706, 1536, -194, 6567, 14364, 10380, -142, -5573, -10594, -8597, -1492, 3482, 1021, -5233, 99, 10213, 16228, 11323, 5873, -2171, -5933, -2486, -624, -1511, -7790, -7508, 1966, 6995, 6170, 6821, 2856, -1640, 14, 6513, 7469, -2377, -8594, -6419, -1471, 1702, 2449, -712, -2032, -471, 4715, 8680, 1838, -552, -3159, -2675, -2867, -3581, -4388, -4878, -2495, -2836, 3669, 926, 203, 958, -449, 468, -4043, -6153, -3240, -1947, -4038, -3641, -2000, -3641, -601, 8600, 13777, 5833, -3158, -812, -2684, -868, 1145, 61, -6437, -8588, 3824, 11225, 6696, 3774, 5579, -283, 1678, 6549, 2220, -8467, -9159, -1336, 2949, 5409, 2334, 1126, -2262, 136, 5737, 7891, 5335, -6162, -5616, 539, 975, 2328, -675, -7251, -10121, -929, 7819, 4091, 1668, -781, -1211, 2571, 4511, 2776, -6130, -9839, -6802, -2457, 2390, 1880, -736, -3693, -2551, 289, 2864, 4272, 1749, -2625, -5921, -4448, -2620, -2088, -715, 3376, 3252, 511, 1159, 2773, 3266, 416, -347, -625, -4089, 1178, 6713, 4208, -852, -806, 4461, 3967, 3087, 2541, -2634, -4055, 1587, 5136, 6398, 1625, -333, 157, -1092, 329, 1204, -1344, -5192, 1035, 7356, 7088, 2733, 586, 234, -2919, -2022, 2030, 899, -4672, -4282, 264, 3182, 3354, 1312, -1116, -4746, -6115, -1842, 7, -2906, -3978, -3144, -1835, 1057, 3224, 2679, -595, -3248, -3797, -2900, -1049, -578, 1319, 1588, 1467, 893, -622, 581, 1916, 1926, 2824, 924, -276, 1167, 3707, 3850, -1122, -797, -84, -2237, -369, 2561, -2271, -727, 2343, 3904, 5433, 4631, 5340, -28, -759, -2204, -3691, -4993, -7573, -1449, 2981, 4561, 4399, 1454, -227, 1278, 916, 540, -1730, -5944, -3088, -2449, 743, 1095, 338, -1012, -2171, -2818, -2128, -1201, -4329, -1802, -3280, -958, 337, 412, 1735, -1634, -2827, -2011, -2121, -803, 568, -484, 1977, 1694, 1994, 1394, -899, -341, 1439, 812, 799, 2662, 2139, 5661, 1673, 3635, 624, -67, 2970, -2993, -2586, -4203, -456, 2045, 5995, 7042, 3847, 4301, 5544, 1884, 667, -2148, -3821, -6157, -4037, 1681, 2113, 4215, -64, 2556, 2041, 3857, 5284, 784, -4428, -3882, 521, -691, 1515, -530, -2925, -2332, -21, 396, -2372, -2179, -2890, -1212, 2600, 2048, 36, -1950, -2553, -1909, -781, 125, 1, 315, 1785, 3635, 4281, 4270, 1647, -1422, -1759, -1329, 2489, 314, -1198, 761, 676, 3027, 3583, 6021, 4586, 74, -1291, -2694, -5882, -2055, 129, -323, 1468, 527, 1861, 2013, 3069, 500, -1394, -2904, -4014, -1824, -1552, -2564, -2623, -1324, -2958, -1476, 1526, 543, -1926, -2600, -963, -1470, -1410, -431, -2673, -2137, -3123, -3652, -1505, -3259, -4481, -2557, -169, 1538, 1785, 1133, -98, -1750, -902, -641, -486, -1804, -1687, -182, 2313, 5036, 5558, 4239, 584, 826, 1404, 4075, 3278, 1105, 1240, 55, 2000, 3340, 5869, 6038, 3722, 2594, 2067, 1046, 1590, 1638, 853, 2093, 2519, 3936, 1641, 1721, 2430, -151, 75, -371, 1885, 761, -1490, 1243, 871, -178, -250, 43, 250, -1687, -2420, 704, 1199, -110, -321, -2360, -2567, -2735, -1462, -1929, -5890, -5340, -2970, -2106, 1295, 1895, -783, -974, -2465, -666, 1164, 149, -1512, -5214, -3703, 255, 2521, 5226, 2538, -853, -499, 553, 3295, 2669, 786, -1791, -2189, -589, 166, 2358, 1597, 912, 440, 986, 577, -260, -67, -1003, -69, 869, 2215, 710, -1674, -1007, -299, -438, -583, -3, -30, -1817, -946, 1699, 2502, 1152, -1608, -1610, -1683, -640, 475, 67, -741, -1609, -408, 496, 522, -53, -2060, -3765, -2875, -1425, 508, -424, -613, 948, 614, 465, 178, 171, 298, 805, 323, -763, 49, -752, 20, 3838, 2727, 1894, 1720, 1801, 3388, 1300, 327, 182, -851, 1431, 2714, 3125, 2112, 1743, 2028, 1135, 998, -209, -405, 160, 12, 1422, 2147, -709, 133, 242, -455, 1858, 576, 705, 355, -2316, 225, 757, 875, -66, -1576, -2236, -2390, -764, -919, -2284, -3435, -902, -92, 996, -66, -1276, -2777, -3896, -2132, -561, -1301, -2447, -2414, -820, 384, -63, 1008, 28, -462, 503, 1676, 928, 649, -921, -181, 429, 1285, 2719, 3298, 1979, 2391, 933, 2787, -848, 762, 6334, -2992, 3780, 4550, 840, -3965, 380, -643, 46, 2987, -1202, 5107, -1825, 115, 1851, 2333, -1921, -795, 1915, -1419, -4387, -4461, 6045, 1408, -4565, 607, 2998, -1660, -867, 3063, 1848, -2359, -1955, -1725, -2050, -3597, -2819, 2092, -1546, -1848, -727, 611, -137, -2479, -1373, -2543, 2358, 1280, -1965, 1916, 354, -92, -104, 3667, 2602, -1667, 3227, 3078, -166, -1007, -527, -626, 2178, 3248, 3150, 3213, -502, -507, 610, 2428, 4957, 4734, 531, -1535, -3289, -2458, 725, -545, -4695, -980, 4090, 702, -1986, 569, 4555, 1566, 2249, -727, -702, -346, -4939, -3404, -643, 583, -3544, -488, 364, -98, -1313, -1930, 516, -280, -2416, -1567, -1215, -4130, -2571, -2534, 2496, -1883, -6762, 594, 4837, 70, -2936, 3053, 1984, -847, 2831, 1106, -1153, 1338, -461, 445, 300, 1911, 5290, 1604, 1342, 3458, 5087, 5265, -1162, -704, 2699, 1971, -294, -1741, 3528, 2544, -167, -1715, 1727, 1309, -1154, 699, 892, 1859, 76, 136, -296, 624, -2348, -1422, 226, -289, -3308, -1708, -1294, -2037, 1700, -1250, -932, 832, -72, -1987, 285, -917, -1686, 341, 1141, -3591, -5221, -1432, 51, -1541, -4431, -1657, 1066, -389, 1477, -1965, 1526, 5287, 2260, 392, -6548, 812, 4000, -584, -2805, 830, 4747, 3245, -1929, 3425, 5555, 1721, 5364, 3963, 1373, -3417, 1750, 3974, 870, 998, 213, -825, 1331, 2266, 2119, 2989, -645, 1371, 3120, -645, -2038, 66, 2356, -129, -1119, 905, 4609, 4316, 1343, -274, -1257, -1770, -1836, -3583, -4971, -2726, -2563, -529, -2253, -2743, -328, 3021, 2445, 1206, -420, 2590, 2453, 806, -1150, -3602, -1991, -5215, -3664, -850, -4534, -6869, -186, 1451, 1690, -2317, 1195, 7912, 4821, 7052, 4677, -20100, -3845, 12690, 15357, 11278, -13359, -3359, 3945, -822, 117, -3696, -12632, -1627, -1875, 9701, 312, -11892, 895, 9337, 13876, 6179, -3378, 1892, 8554, 1344, 6571, -7657, -11932, -12046, -7866, -4573, -10269, -11541, -6260, -2337, 2426, 7054, 6522, 10654, 8062, 11058, 11404, 6399, 1585, -4129, -6551, -4499, -7118, -9163, -13001, -9907, -6172, -1088, -3071, -7817, 1094, 10193, 17926, 10249, 4297, 5889, 8527, 4063, 67, -2550, -1379, 4069, -26438, -13347, 16571, 23535, 24179, -7707, -11695, -5344, -8409, 12685, 24715, -10969, -16979, -15103, 4632, 20419, -3866, -589, 1885, 2607, 13833, 19385, 15267, 4672, -18977, -10487, -3063, -8474, -11432, -19402, -17142, -11421, -3625, 12583, 17613, 9178, 14865, 14208, 17208, 14313, 4580, -953, -11587, -17073, -14493, -16210, -17904, -16118, -15112, -8349, 2521, 16566, 27054, 17921, -2460, 2912, 13602, 17210, 3550, -17286, -15100, -14128, -19596, -13542, 3234, 4000, -1845, 6757, 23570, -15515, -5662, 27166, 22209, 30508, 7200, -11240, -22790, -30326, -16045, 16541, 2941, -5693, -15841, -15613, 10471, 20722, 27740, 28683, 6850, -8300, -11121, 401, 7924, -13244, -12640, -25411, -29107, -23538, -3812, 16742, 21714, 3034, 12794, 12744, 15459, 24822, 13592, 6947, -13543, -20663, -21556, -12616, -12180, -5979, -14692, -10651, -13174, 2002, 20367, 29741, 26660, 15097, 1347, -16406, -5883, -2109, 6791, -3230, -15973, -17542, -12467, -8738, 11027, 16609, 21226, 11952, 2270, 10974, 10098, -21138, -2337, 23437, 6572, 23835, -7863, -12180, -19419, -30970, -7791, 13974, 13972, 9088, 804, 1006, 665, 5311, 27910, 22373, 1156, -12338, -20072, -17905, -15030, -16806, 5816, -7838, -3428, -9141, -5306, 2906, 9496, 19513, 26222, 11794, -5407, -1793, -12747, 892, -12684, -5951, -6513, -10766, -14977, -10260, -6299, 2403, 4929, 10793, 16630, 2814, 4665, 499, 4282, -9135, 284, -1558, 1560, -8880, -12650, 4221, 1878, 610, 5500, 10363, 4683, 495, 3328, 14166, 7221, -4959, -28701, 3827, 11711, 12607, 28304, 5774, -5910, -26762, -28487, -13989, 5083, 19657, 24912, 17229, -1609, -21033, -12682, 6132, 17347, 13548, 15720, -4667, -19939, -25857, -25325, -7471, -1255, 10880, 2154, -215, -9400, -3708, -6153, 7619, 22869, 25223, 18208, -3852, -13648, -24029, -18699, -6975, 11484, 5165, -2262, -13403, -13997, -8094, 3720, 14254, 22542, 19943, 14128, -833, -15884, -2893, -2099, 10269, 5406, 1513, -3752, -16187, -14152, -227, 8043, 14368, 11949, 10929, 10404, -1735, -23515, -6241, 18562, 8635, 27060, 14618, -1089, -18365, -31876, -23742, -12600, 6051, 24449, 27800, 13167, -7754, -16629, -12139, 122, 8204, 16565, 21933, -1459, -9952, -23747, -26558, -22050, -10426, 7691, 9889, 5684, -2271, -9445, -12712, 2818, 14521, 18831, 15555, 6827, -7452, -15073, -16925, -9432, -3496, -3375, -318, -3195, -3624, -1392, 7098, 10313, 15702, 13218, 9867, -3676, -3793, 2095, 1374, 2344, -2995, 2672, -4654, -10555, -7010, 3993, 10564, 11867, 8528, 8657, 1637, -2221, -20111, -368, 18781, 4328, 19250, 9855, -273, -18353, -30820, -17685, -5456, 1822, 13289, 18959, 12489, -2673, -3756, -8573, -1247, 1237, 6242, 14324, 3054, 1410, -13981, -14880, -20705, -14324, -10768, -5811, 4369, 1208, 241, -1335, 4697, 9134, 9599, 7953, 9371, 3842, -4634, -8564, -7119, -6497, -5033, -6303, -3706, -1040, 2979, 4757, 6471, 7313, 5356, 5693, -5090, -272, 1581, 3585, 5923, 5426, 6878, 2001, -4327, -3136, -426, -2365, 3962, 3794, 6575, 1666, -3196, -9539, -5138, -7876, -571, 18801, 7573, 6059, 4165, -34, -7543, -11901, -288, 5718, 7294, 854, -2073, -3969, -16636, -10081, -3091, 8352, 6657, 2870, 4450, -2313, -3222, -8781, -801, -158, -228, -553, -5034, -6160, -4236, -1336, -1821, 3550, 6269, 4324, 546, -1184, 2165, 548, 922, 6907, 4828, 2496, 2960, 3473, 4006, 1081, -163, 2880, -498, -5316, -5555, -4232, 579, 2049, 3473, 7930, 7616, 5828, 4073, 378, -2886, -5666, -3041, -1326, -3791, -4886, -3416, -2268, -2773, 1921, 5470, -1505, 4785, 11521, 6109, 4623, 3324, 3511, -9093, -12794, -6102, -3261, -541, -6955, -5225, 632, -2824, -1924, 2266, 8052, 2915, -2372, -938, -2957, -1449, -5198, 1490, 7379, 1004, 724, 737, -3844, -3391, -4651, 1627, 5508, 1826, 3453, 105, -1193, 1088, 3275, 3737, 9120, 6889, 6670, 7439, -188, -1861, -3055, -2457, -1542, -609, 200, 1275, -2255, -1823, 639, 261, 5692, 5182, 5371, 4140, -2356, -6650, -7312, -3465, -2528, 559, 1937, 1209, -2953, -7405, -1534, 4136, 5015, -3406, -2302, 5828, 652, -5163, -1150, 4405, -4860, -11998, -5344, -47, 906, -4168, -3117, 3352, -4598, -9414, -5591, 1638, 4132, -1251, 4703, 9676, 4570, -640, 349, 5336, 2904, -5317, -5093, -1338, -2480, -6223, -4144, 3241, 4174, 2312, 5696, 10970, 7401, 6419, 4886, 3219, 666, -3441, -2687, -3446, -1808, -105, 1837, 1377, 3837, 3467, 3734, 3438, 1534, 950, 1848, -545, -2198, -1499, -5291, -3357, -5746, -3659, -563, -745, -641, 521, 1415, 1320, -461, -878, -117, -1775, -4562, -6825, -9924, -7048, 681, 578, 3966, 4030, 3126, -3274, -5062, -411, 3502, 2193, -2508, -2046, -3310, -3288, -2300, 4162, 9558, 6901, 1322, 1145, 261, -541, 374, 3570, 6790, 3731, 201, -2952, -4123, 137, 1625, 4538, 5693, 2038, -1349, -5777, -4848, -1736, 1404, 5927, 10047, 7880, 2757, 400, 922, 2999, 3560, 2959, 3264, 1001, -3985, -5296, -2589, -1470, 1743, 3184, 1529, -158, -2874, -1677, -22, -2237, -911, 260, -480, 217, -1082, -645, -1627, -1407, 6, 3770, 3526, 4246, 3766, 1640, -156, -166, 3347, 4367, 2715, -1561, 1469, 815, -685, -2294, 1990, 4475, 298, -2059, -2835, -2629, -3615, -2454, 1051, 5637, 3481, 2084, 1541, 49, -230, -432, -537, 385, -3466, -5674, -5879, -7424, -5160, -2951, -598, -546, -691, -342, 490, -827, -1453, 1501, 1116, -1435, -1615, -1633, -1597, -2470, -4252, -2418, -2605, -4153, -3815, -2733, -142, -1739, -2575, -817, -854, -588, -1378, -935, -1370, -671, -2036, -1850, 2610, 1929, 3067, 1582, 2324, 3292, 168, 1856, 1442, -449, 192, -337, 2300, 8173, 7332, 3633, 2993, 4765, 4140, 1621, 385, 176, -526, -2270, -3647, -1537, 1942, 626, 1171, 4466, 2464, 950, 1449, 1144, 545, -231, 942, 1146, 2285, 986, 333, 1156, -570, -943, -787, -157, -184, 623, -1173, -3453, -3208, -2128, -963, -867, 128, 237, -185, -664, -336, 829, 1193, -978, 71, 2480, 1625, 127, 718, 1152, 92, -86, 1698, 3338, 1850, 1089, -460, 500, -514, -1550, -243, 561, -988, 125, 1115, 416, 1031, 425, 2587, 421, 1961, 1974, -1134, -903, -535, -1004, -974, 1014, 545, -736, -1064, -533, -572, -1134, -170, 433, 692, -1036, -3125, -2281, -1896, -1995, -443, 2614, 1173, -1646, -3041, -1650, -419, -734, -405, -109, 727, -1171, -1491, -463, 1012, 1425, 1019, 2268, 2276, -184, -1269, -47, -752, -51, -378, 173, 2438, 1147, -484, -343, 1082, 1960, 3442, 3726, 5369, 4887, 1350, 628, 886, 1239, -1247, 266, 1959, 1262, 2011, 591, -985, -699, -80, 8, 126, -193, -753, -2162, -1138, -294, 376, 598, -664, 380, 814, -196, -212, 744, 619, -296, -768, -892, -643, -859, -2252, -2798, -404, -1036, -2316, -1651, -2473, -2733, -1829, -425, -200, -634, -584, -538, -614, 34, -335, 70, 180, -460, -1346, -21, 1310, 593, 1188, 1885, 1326, 1258, 2295, 2006, 2336, 1674, 961, 999, 1770, 968, 465, 426, -1080, -1573, -878, -59, 147, 1754, 1441, 1060, 713, 534, 179, -940, -638, -1897, -697, -2015, -1345, 96, -1070, -554, -702, 1559, 107, 163, -365, 971, 688, -547, 387, -1293, -262, -1972, -568, 105, -308, -29, -1872, -640, 1168, -1238, -916, 208, -141, -327, -363, 1616, 1594, 1048, 163, 1610, 1070, 923, 430, 1550, 2632, 1017, 2601, 2319, 2550, 2785, 1965, 1253, 2207, 2372, 1903, 2914, 2096, 1174, 591, 266, -738, -1397, -889, -1045, -113, 774, 151, 1031, 1197, -1460, -1644, -888, -847, -765, -403, -354, -983, -730, 535, -129, 108, 881, -205, 111, -1380, -1691, -1606, -1124, -2000, -2245, -679, -1458, -844, 84, -625, -670, 33, -491, 185, 187, -164, -132, -418, -158, 20, 1131, 1870, 910, 791, 2507, 2637, 1632, 1906, 1470, 1067, 590, 657, 1255, 1447, 6, 524, 2261, 1240, 1529, 860, 1719, 1483, -214, 741, 117, 264, -1008, -259, -1171, -1923, -436, -1040, 1374, -706, -22, -1675, -1648, -1786, -3362, -380, -1833, -999, -1331, -1622, -874, -899, -566, -699, -2227, -1330, -2733, -3406, -3185, -3772, -3586, -4422, -3508, -1644, -955, -1962, -990, -448, 129, 115, 946, 612, -407, 127, -633, 47, 1289, 793, 1089, 2000, 2774, 2008, 2283, 2542, 2744, 3400, 2082, 2190, 2206, 2069, 2322, 1929, 2745, 1902, 1283, 2183, 2149, 3444, 2126, 2317, 1512, 1365, 1637, 1225, 1440, -196, 441, 1066, 2458, 2007, 2187, 1543, -69, -419, 846, 1045, 153, 256, -236, 214, 18, -476, -807, -477, -1183, -1559, -863, -1545, -2378, -1911, -1484, -1651, -1238, -223, -515, 36, -390, -573, 354, 663, 1044, 627, 871, 222, 527, 79, 1169, 973, 870, 2094, 1192, 1102, 41, 228, -500, -75, -474, -692, 198, -1613, -113, -575, -445, 319, 636, 1060, -398, 477, -322, -811, 11, -254, -1660, -1510, -2360, -2104, -1601, 13, -77, -199, 112, -319, -524, 488, 1316, -4642, 103, -441, -2023, 2937, -783, -6629, -2878, 2363, -2502, -1519, 1826, -1623, -701, 2916, 1652, -541, -2264, -744, 309, -558, 137, 3776, 2022, -1820, 85, 3849, 1377, -876, 4301, 2850, 850, 2181, 2607, 1294, -323, 2298, 2471, 345, 23, 53, -782, 1101, 3391, -1066, 555, 3037, -1293, -97, 1950, 1898, -3253, 2041, 2977, -4279, -304, 1167, 516, -589, -3449, 184, 2389, -4724, 3375, 1463, -3061, -307, -6, 2532, -2384, -2450, -4, -1836, -1957, -2750, -268, 3902, -4556, -4122, 8821, 805, -7225, 5259, 1478, -6312, -1695, 7265, -1908, 98, 5801, 347, -3125, -165, 7081, 3338, 991, 1210, 6658, -1985, 375, 1650, 1556, 642, -2981, 4994, 731, -2786, 6533, -1257, -3892, 2413, 1066, 1744, -6072, 1343, 995, -2896, 4643, -538, -2218, 1743, -2333, -720, -2370, -3135, 1035, -3389, -139, -669, -2424, 2870, -1394, 1010, 1195, -3136, 543, 276, -3864, -392, -1861, -1069, -825, -2864, 6, -6174, -2350, 112, -1040, 652, -384, -2234, 195, 1318, 2375, -2859, -122, 4580, -3839, 1082, 2746, -2201, 2538, 2390, 1136, 1684, 4475, 2471, -2947, 3623, -118, 2199, 5647, -1064, 1343, 1032, 2358, 1503, -1105, 7719, -5391, -1967, 4394, -1712, 4240, -1413, 2178, -1690, -2994, 3644, -986, 431, 3689, -3815, 622, 325, -1565, 408, 238, 825, -6986, 646, 1976, -6578, 485, 388, -5948, 2333, 1503, -3478, -3785, 180, 1368, -6750, -2297, 1225, -6000, -801, 2894, -1125, -1189, 2755, 3166, -5928, 3321, 4256, -4553, 1813, 2916, -1000, 1620, 4081, 1071, 1655, 2416, 163, -1236, 5385, 77, -637, 5648, -1735, 3695, 4755, 401, -189, 2676, 1443, -1208, 1439, -817, 1946, 1322, -2356, 958, 1468, -1363, 2927, 5072, 1587, -2008, 1328, -1945, -1717, 4903, -2109, 218, 2382, -1309, 550, -1156, 1501, -2232, -1198, 2792, -7284, 3290, -764, -2353, 2579, -4522, 2574, -3500, -225, 40, -1680, 4176, -2865, 647, 6875, -3210, 806, 4699, -557, -1271, 1139, 3605, -6349, 786, 3000, -1545, 3977, 3583, -1174, 637, 3888, -306, -2279, 4022, 90, -4658, 5109, -1488, -2461, 2023, -682, -318, -2139, 964, -2665, -3254, 1691, -3187, 3385, 510, -4149, 3322, -451, -2773, 542, 1093, -2711, 791, -177, -3084, -468, -2200, -2247, 1957, -4780, -4168, 1018, -1512, 1918, -2432, 268, -2916, -3233, 1533, -3361, 2368, -1694, 370, 2020, -5041, 3454, -640, -877, 2612, 1776, 4286, -2, 1363, 2219, -311, 2548, 948, 1904, 5587, -2506, 1849, 2291, -2556, 910, 1420, 2192, 1833, 4448, 2617, -2143, 3324, 277, -4764, 756, -2854, -5559, -631, -954, -1192, 1283, 1983, 496, 147, 1530, -1081, 381, 447, -2226, -828, -40, -2114, -670, -854, -2270, -614, -918, -995, -1226, -693, 1777, -2553, -1612, 670, -1439, 98, -178, 3245, 1230, -1346, 2514, -598, -3009, 2357, -2119, -446, 1666, 559, 2004, 2444, 4549, 1055, 3525, 6351, -1840, 2163, 4416, -2236, 1939, 6784, 4050, 2167, 5687, 1625, -1683, 3372, 2115, -3919, 8634, -485, 99, 4959, -3968, 1775, -587, -1543, 141, 163, -646, -760, -1757, 1979, -4536, 194, 3565, -979, 1676, 1147, 2329, -1119, -311, 2211, -3559, -2520, -376, -5573, -7268, -2148, -3671, -8394, -4379, -2879, 250, -1349, -687, 259, -1312, 1664, -820, -1378, 2507, 666, 514, -259, 371, 1069, -1181, 10, 814, 799, -2750, -1812, 1859, -1072, 269, 895, -3710, 242, 1206, -1614, -271, 277, 3615, 7925, -952, 3984, 3396, -7715, 8918, 19935, -990, -5474, 11039, -2695, -6536, 378, -4831, -8025, -608, 4388, -6199, -5618, 5357, 1241, -1050, 6146, 4038, 5751, 6684, 7064, 3908, -1069, 2807, 127, -6181, -4576, -5365, -9442, -7988, -6211, -3513, -7939, -863, 4632, -5321, 2135, 11755, 8082, 2975, 6055, 7662, 2301, 1649, 3097, -2482, -7, 2770, 22, -3063, -2988, -2027, -7673, -4488, 2252, 461, -2920, 1785, 2529, 1143, -3194, 2228, 1645, -748, 7833, 5044, -16609, -17080, 22219, -4546, -4361, 23124, -10468, 601, 10638, -4722, -2603, -13748, 218, 12348, -19833, -12494, 12897, -2118, 2336, 2686, -2941, 9928, 229, 11562, 1610, -14581, 6129, 4614, -13261, -14306, -11240, -6022, -7270, -15825, -2968, -5269, -2975, 8685, 1565, 3665, 12193, 9357, 8437, 3307, 6041, 9900, -1495, 3695, 4392, -794, -74, 3043, -97, 595, -5652, -4848, 12680, 449, 1292, 3585, 1700, 12845, 4245, -186, 11391, 6638, 7468, 16207, -1300, -21773, 16708, 14837, -18643, 11528, -9363, -691, 13107, -18566, 1950, -6105, -16094, 17493, 2674, -26208, 883, 10163, 11285, 5458, -15695, 15936, 11210, -4329, 7156, -7242, -8145, -1143, -5050, -12409, -12876, -21216, -1026, -481, -17677, -4258, -1773, 7513, 4475, -1180, 6410, 7877, 2199, 15735, 7458, -5262, 2140, 3647, 991, -11576, -9175, 5023, 715, -12819, -4746, -13126, 5186, 7471, -10141, -550, -1932, 11554, 13929, -6385, 1734, 18379, 3756, 7218, 6500, -3199, -23095, -7357, 29367, -7566, -15140, -11952, -3067, 19760, -16282, -11703, 7914, -11520, -263, 17733, -6160, -16666, 4361, 14253, 24327, -7705, -16384, 20644, 11485, 1633, -6636, -12822, -4058, 837, -7946, -7379, -12864, -21715, 7444, 3676, -2067, -3842, -4452, 19341, 24413, 4896, 2274, 11200, 15364, 20804, -2792, -1388, -1342, -2798, 3626, -3675, -16062, -9537, -753, 2749, -9393, -16175, 17095, 15641, 325, -5157, 8841, 24252, 7975, -7667, 11931, 8576, -6586, 2535, 2344, -2273, -19660, -24679, 20781, 6789, -18146, -13960, -12582, 26781, 5501, -20474, 4450, -182, -11352, 20307, 5000, -17457, -8056, -5924, 23791, 11505, -26913, -5979, 12234, 12514, 203, -20502, -13495, -1342, -4668, -8198, -5603, -24896, -5705, 6272, 7679, 7215, -7142, 7672, 21126, 19187, 7145, 8799, -452, 11765, 6493, 222, -453, -13208, -2867, -539, -8842, -6583, -4042, -602, -41, -4667, 20164, 13864, 9092, 3381, 1839, 21998, 10105, -9659, 2514, 9561, -26, -8408, -8553, -426, -16952, -24014, 12435, 18482, -4627, -11670, -15961, 15025, 17333, -5523, -16, -965, -10684, 6122, 5393, -3632, -10811, -20214, 4392, 15777, -8014, -11005, -2221, 3341, 10333, -7282, -10142, -6158, -11142, -14643, 19, -5706, -6721, -6501, -7384, 16300, 14082, 4761, 6515, 8020, 9623, 19301, 5211, -1589, -2529, -4385, 4657, 1483, -6788, -7046, -5697, -4202, 7519, 1863, -979, -6590, 9313, 28004, 16798, 1773, -4590, 11847, 12006, 5119, -2474, 53, -2798, -2845, -873, -1734, -3650, -16052, -24466, 3044, 31295, 7096, -191, -15801, -4410, 20783, 1988, 1537, 7564, -16205, -14569, 6306, 6343, -914, -17607, -20484, 12877, 14263, 386, 3907, -9974, 4331, 5590, -2121, -1507, -4272, -19232, -7792, 977, 1304, -1136, -12168, 11572, 14673, 8418, 7142, 12115, 8614, 12170, -2562, 375, 5569, -9574, -5037, -5401, -163, -2763, -7003, -4693, 2056, -5475, -6536, -1096, 16621, 17817, 551, -2342, 3632, 9514, 1574, -9008, -4836, 6751, -4576, -9263, -6147, -4005, -7092, -16493, -10449, -214, -13618, 13271, 17501, 4072, 10900, -18385, -9070, 1388, -1191, 2253, 611, -15570, -13663, -8570, -14498, 1913, 7118, 2745, 3608, -6836, 6555, 21021, 9704, 4276, -8440, -11870, -8908, 5647, -1900, -10833, -16344, -7698, 7515, 6916, 11616, 6282, 6300, 10773, 18103, 14587, 11620, 964, 645, -4547, -9819, 553, 6931, 2518, -8786, -13443, -4297, 5340, -3395, -2908, -5053, 8254, 14094, 12804, 12297, 2720, 6434, 5314, -218, 2510, 4554, -1982, -3750, -6758, -7468, -4295, -7675, -8326, 241, -7285, -20691, 9972, 18538, 18235, 19250, -14960, -7451, -8233, -5547, 8633, 6473, -4707, -19415, -21918, -12349, 10458, 9826, 8182, 89, -4165, 5473, 5132, 11207, 15959, 285, -9603, -15209, -16073, -2295, 2499, -3165, -3593, -13331, -10290, 5357, 12780, 21366, 12643, 4953, 2237, 4698, 6252, 12803, 5107, 80, -7608, -16090, -1730, -820, -1221, -4302, -8421, -9724, -8164, -9218, 13200, 21365, 16422, 10102, -626, 6817, 6757, 1238, 446, 3807, -6371, -9430, -13126, -6513, 4359, -5358, -14445, -5220, 2735, 2611, -16438, 568, 24820, 18188, 27217, 341, 172, -6453, -22125, -4488, 18443, 16920, -10479, -20673, -22106, -7109, -1002, 12239, 24284, 11090, -3556, -8120, 12211, 27517, 14260, 1666, -6278, -11539, -17931, -13064, -6496, -2679, -10805, -17956, -8923, -1779, 8759, 10749, 19697, 16941, 7021, -3208, -548, 5878, 9150, 2356, -10294, -13885, -20481, -20526, -10015, 7866, 2127, -8306, -19298, -5775, 7435, 16990, 18714, 5760, 423, -12717, -13952, 2522, 10911, 2044, -3916, -11604, -3445, -1051, -2510, -4875, 1089, 992, -652, -1798, -5481, -11651, 1555, 23281, 21000, 29191, 4833, -5820, -14583, -16219, 1261, 11197, 5402, -4458, -12341, -20926, -9368, -4157, 12876, 25848, 20286, 12925, -416, -4904, 11666, 12459, 11538, 2528, -12529, -22903, -26805, -20532, -272, 7634, -111, -978, -5197, 7125, 10423, 13790, 15469, 13256, 4945, 6757, 78, -5427, -1870, -6835, -2902, -7551, -15795, -13487, -2395, -1487, 4581, -7613, -2808, 4577, 1290, 5889, 3964, 5858, 4139, -3108, -4596, 7552, 4805, 4151, 4462, -259, -3291, -2720, -7199, 3574, 5919, -3220, -4448, -1785, 4399, 6845, -14269, -2405, 21465, 9668, 25567, 1025, 198, -7122, -25995, -11026, 9471, 12581, -328, -4892, -17926, -5632, -5787, 3615, 18630, 19494, 12500, 260, -4502, -174, -3872, -165, 2829, -23, -11630, -23122, -23499, -12557, 249, -245, 8015, 6002, 3019, -7105, -1928, 14101, 23620, 14713, 7509, -5733, -13752, -12490, -13766, 3664, 7005, -5977, -16773, -11503, -2098, 11030, 1824, 4551, 7289, -913, -513, -3669, 5045, 12622, 7648, 1051, 5195, -423, 1083, 4088, 7068, 10230, 1439, -11492, -6853, 5071, -1041, -2381, -3232, -147, -3200, -6228, 950, 10229, -7158, -1, 11551, 8369, 26518, -375, -2907, -10874, -22676, -7650, 4990, 11762, 936, -9097, -15177, -4522, -4127, 6068, 15047, 12359, 7958, -8778, -8829, -2807, -1344, 3685, 602, -4903, -16076, -21292, -16875, 1174, 7875, 6577, 7318, -1622, -652, 2338, 13221, 17965, 13529, 401, -4404, -9262, -8579, -2023, 5353, 11965, 3884, -8204, -9629, -3831, 665, 15058, 8648, 6292, -3889, -10928, -6595, 1190, 7107, 3840, 918, -3984, 769, -1972, 8076, 7606, 6597, 7055, -2199, -7396, -221, 1866, 4976, -2146, -11484, -11056, -16058, -6822, 357, 11293, 7894, 1407, -3943, -5239, -14799, 10493, 13522, 13056, 18653, -14139, -15133, -23253, -9831, 5110, 14770, 5266, -5506, -15647, -21316, -2809, 10142, 20789, 14912, 1943, -7574, -7149, 2386, 14681, 16508, 10777, -2995, -15104, -18784, -7302, 439, 5488, 3308, -2997, -4528, -2033, 3311, 9432, 17541, 7769, 2930, 2571, 4665, 4835, 4690, 6158, 2198, -4569, -8259, -9548, -3205, 1751, -3486, -9083, -10628, -4555, 320, 12794, 9695, 698, -1347, -9371, -4578, 4260, 8456, 11400, 3336, -4474, -6219, -2528, 1596, -1658, -1708, -4726, -9906, -12941, -6174, -1849, -2227, -2750, -3440, -610, -3524, 1052, 8572, 14260, 11855, 1885, -3109, -3029, -10567, 938, 20808, 12141, 13036, -9045, -18459, -8059, -5678, 12107, 10671, 2144, -9049, -14034, -9423, 7556, 14503, 12340, 8271, -6220, -3344, 1726, 9141, 15203, 5246, -6362, -14352, -13220, -6069, 4411, 6209, -2765, -11606, -13607, -718, 6136, 12705, 9163, 2200, -1069, -2625, 5028, 9064, 6294, -1279, -4679, -5900, -6923, -5520, -840, -585, -3021, -6630, -5774, -4629, 260, 852, 1475, 7931, 4368, 2213, 121, -2505, -1457, 4723, 7550, 5437, 514, -411, -1819, -975, 3473, 5183, 2335, -4498, -3791, -4235, -337, 370, 1253, 3080, 108, -137, -785, 3776, 3243, 2925, 2560, 1006, 3446, 2082, -719, 1238, 4144, -1846, -7555, -12267, 7629, 8162, 883, 5630, -14386, -5932, -7971, 1404, 10712, -4686, -8081, -9004, 271, 1940, 5008, 2177, -2259, -4295, -808, 8740, 6721, 3006, -2617, -5189, -3697, -6834, -3044, -5366, -6571, -6488, -3312, 3284, 1406, 3133, 4448, 8179, 7411, 9875, 7772, 4982, 2598, 927, 4000, 1924, 690, -2499, -3794, -609, -738, 1049, 368, -2631, -4659, -3712, 8490, 5155, 6240, 597, -3397, 4734, 1172, 5295, 6318, 2783, -1398, -3658, -3289, 149, -1126, -5749, -3544, -1916, -599, 1064, -1211, -289, -3833, -2258, 2389, 1151, 1436, -1907, -3606, -4405, -806, -1442, -3376, -1523, -672, -471, -2687, -2708, -177, 253, -717, 766, 1488, 744, 590, -1959, 3250, 4646, 989, 3502, 3553, -3616, -2953, 8150, 1147, 5687, 2548, -9393, -1817, 89, 3910, 1204, -2253, 3721, 1330, 0, 3342, 657, -584, -3646, 2026, 6782, 2963, 1001, -995, 389, -1802, -380, 717, -1691, -5038, -2966, 254, -976, 2087, -416, -1929, -253, 2109, 3056, 1483, -1474, -2163, -652, -3078, -514, -1610, -2433, -3411, -3711, 469, -533, 1546, 165, 1041, 797, 3540, 3524, 58, 2237, -2014, 2273, -1499, -1767, 896, 353, 3541, 1726, -1812, 2251, 6811, 1794, 2549, 1619, 4021, 1219, -1023, -383, -412, 472, -1895, -2346, -30, 1886, -671, 87, 16, -476, -377, -181, -517, 1787, -1556, -4387, -895, 128, 1179, -1532, 10, 2364, 1827, 1667, 1737, 148, -519, -1002, -3546, -2195, -2474, -2561, -1626, -1601, -2876, -776, -756, -1357, 1397, 1166, 641, -661, 733, 333, -406, 553, 851, -1035, 2037, 2226, 823, 5359, 1327, -496, -31, 2223, 1049, -447, -831, -2240, 456, 202, 238, -706, 923, 340, 2704, 4812, 4750, 1568, 62, 831, -674, 2983, -354, -821, -1091, -2683, -649, -98, -1217, -1076, 36, -159, -495, 1321, 1998, 740, 901, 317, 1358, 611, 391, -555, -131, -635, -4470, -3683, -826, -2991, -3578, -1076, -1713, -690, -1551, -584, 542, 1279, 1779, -20, 1577, 176, -371, 1289, 627, -556, 342, 214, 251, 1476, 1449, 1037, 1193, 1558, -1033, -694, 2336, 2556, 454, 786, 616, 1755, 2121, 264, 988, 2539, -295, -2222, 421, -435, -421, -767, -131, -965, -2057, -1491, -1260, -291, 27, -886, -777, -147, -767, -797, -90, 1540, 605, 87, -2181, -2004, 1252, 1804, 1254, -123, -1958, -2806, -1763, -179, 1144, 786, -790, -1768, -883, -353, 512, -106, 365, -83, -1137, 274, 297, 1424, 2171, 2366, 1594, 3456, 2534, 2444, 3221, 4140, 4865, 3213, 3072, -1218, 2208, 1798, -964, -164, -480, -1229, -1062, 1911, 1545, 1259, 1575, 1734, -119, 520, 39, 623, 1148, 56, -1751, -1480, -1336, -1941, -461, -292, 1044, -881, -441, -1491, -1401, -641, -717, -310, -1644, -1535, -2465, -933, -143, -464, -470, -863, -2684, -2165, -1670, -2747, -2306, -1581, -1069, -515, 234, -1532, 278, 765, 828, 567, 1365, 2201, 895, 2958, 2256, 1947, 377, 242, 42, 1514, 2982, 802, 2089, 1402, 500, 2000, 1551, 391, 486, 354, 185, -104, 1712, -204, -507, 739, 147, 44, -2099, 1427, 630, -857, -726, -528, -140, -1688, 37, -965, 600, 676, -983, -775, -208, -354, -159, 387, 425, -831, 27, -167, -2530, -388, -3283, -2133, -167, -532, -840, -1740, -1493, 173, -765, -317, 811, -264, -555, 2522, 1500, -331, 1847, -617, 930, 959, 6603, 516, 1856, 2995, -4106, 4211, 1403, -1964, 4864, 2408, 85, 5777, 1239, -3311, -475, -3524, 3051, 97, 3581, 91, -1005, 2190, -5439, 2617, -1813, 4017, -4312, 3390, -6675, -2190, -1790, -1129, 2185, 12, 5518, -4040, 2568, -4619, 3191, -1896, 3618, -2958, -2489, -4519, -1868, -2947, 925, 833, -4759, -1213, -4159, 972, -1730, 2879, 94, 3643, -780, 2333, -3257, 2175, 499, -1778, 4376, 599, 4289, 2193, 2085, 1973, 1700, 1112, 2671, 4208, 6919, 3429, 4801, -1808, 1842, -715, 1547, 2431, 2193, 2381, -4079, 5855, -3057, 2585, -1330, 1390, -3187, -501, 1662, -2752, -83, -877, -195, -2345, 232, -2737, -1167, -3603, 1097, -2708, -34, -1486, -2172, -2123, -2154, -3234, -1935, -931, 133, -2014, -1005, -1014, -4225, -1766, -2132, -1556, -791, -4031, -1057, -1819, -434, 1559, -3687, 2542, -2625, 2642, -2133, 3365, 200, 750, -129, 1673, 2632, 2006, 3718, 528, 2152, 3380, 3470, 3271, 2908, 2031, 3846, -966, 6065, 1489, 6912, 75, 5476, 968, 2839, 1593, 2018, 224, 1889, 853, 624, 1556, 1756, 1996, 812, 3641, -4172, 4212, -6670, 3333, -2450, 4685, -3848, 3746, 402, 1057, -767, -1396, 521, -6044, 1178, -5173, 1971, -8044, 3250, -7779, 1041, -5328, 298, -3514, -1982, 2426, -5280, 3623, -5504, 2562, -3427, 3184, -3534, 2293, 883, 1976, -1215, 854, -958, -1111, 3330, -3196, 4456, -2524, 4608, -3125, 3584, -991, 965, -218, 877, 1775, 250, 558, -2086, -202, -2520, 346, -2980, 3060, -3270, 2315, -2564, 2048, -1996, 1433, -3185, 616, 394, -1944, 1879, -2549, 1483, -2673, 2244, -4806, 3979, -5369, 3111, -1489, 151, 124, -4257, 1680, -2762, 128, -2095, -2190, -2133, -894, -2591, 3400, -3948, 4185, -1655, 3761, 795, 1429, 2405, -2206, 4010, -242, 2620, -262, 3725, 693, 4332, 1658, 3898, 1133, 3399, 2236, 2270, 3109, 1687, 2904, 2059, 1508, 924, 1956, -349, 1472, -504, 1070, -1958, 3758, -3226, 1440, 41, -188, 969, -1725, 2329, -2753, 1648, 786, -916, -228, 1088, 2135, 1520, -2004, 424, -4215, -308, -1933, -1809, -2738, -3779, -1025, -1267, -706, -2594, -2208, -3012, 1405, -2346, 16, -362, -801, -1358, -166, -702, -577, 457, -1110, 76, 1821, 580, 2900, 3784, 2176, 3141, -101, 3096, 756, 965, -646, -812, 1545, 943, 343, 1318, 458, 723, 4378, 328, 561, -37, -2230, 382, -110, -1162, -406, 1045, -547, -197, 121, 416, 347, -1033, -301, -1731, 758, -601, -1082, -412, -1071, -887, -644, 166, -258, -1077, 621, -1612, -560, -762, -1743, 897, -2666, 1358, -2351, -1174, -176, -1926, 1481, -1908, 129, -468, 667, 2210, 96, 1802, -798, 3652, 3174, 1516, 2041, 1048, 1826, 525, 3664, 742, 558, 1866, 1882, 379, 2430, -268, -146, 509, 1022, 258, 655, 1375, -1122, 1506, 516, 1123, -377, -64, -2105, 430, -126, 980, 930, -150, -201, -1494, -1280, -2641, 307, -276, }; fldigi-4.2.05/src/soundcard/dinnerbell.cxx0000664000175000017500000030137714611711171015411 00000000000000#define DINNER_BELL 15287 int int_dinner_bell[DINNER_BELL] = { 5877, 6488, 2883, -3586, -9223, -10177, -4970, 4043, 11723, 13116, 6765, -4037, -13025, -14654, -7598, 4196, 13747, 15211, 7567, -4771, -14435, -15610, -7483, 5234, 15026, 16093, 7741, -5217, -15299, -16721, -8662, 4345, 14939, 17162, 9766, -3068, -14220, -17478, -10978, 1725, 13572, 17915, 12218, -459, -13041, -18444, -13472, -750, 12653, 19107, 14852, 2143, -11919, -19363, -15893, -3413, 11070, 19347, 16679, 4576, -10101, -19034, -17164, -5598, 9056, 18497, 17435, 6564, -7945, -17930, -17850, -7814, 6501, 17048, 17998, 8846, -5222, -16312, -18159, -9789, 4021, 15464, 18087, 10472, -3025, -14786, -18114, -11116, 2224, 14265, 18141, 11675, -1405, -13628, -18024, -12124, 725, 13149, 18024, 12596, 18, -12481, -17788, -12920, -723, 11834, 17613, 13331, 1475, -11158, -17386, -13650, -2104, 10655, 17271, 13927, 2524, -10408, -17407, -14355, -2935, 10319, 17748, 14952, 3423, -10275, -18194, -15664, -3991, 10153, 18575, 16287, 4514, -9980, -18805, -16746, -4896, 9919, 19090, 17205, 5258, -9869, -19424, -17768, -5783, 9709, 19721, 18410, 6433, -9359, -19877, -18995, -7153, 8901, 19906, 19465, 7761, -8533, -20020, -20012, -8421, 8178, 20221, 20711, 9236, -7719, -20431, -21547, -10291, 6970, 20414, 22263, 11398, -6086, -20216, -22894, -12489, 5124, 19905, 23378, 13523, -4121, -19521, -23889, -14678, 2964, 19025, 24372, 15904, -1627, -18328, -24718, -17120, 234, 17534, 24955, 18251, 1126, -16715, -25188, -19383, -2516, 15909, 25411, 20554, 3970, -15009, -25639, -21798, -5544, 13982, 25705, 22907, 7046, -12933, -25688, -23906, -8482, 11879, 25587, 24763, 9801, -10864, -25457, -25621, -11140, 9792, 25249, 26391, 12462, -8626, -24891, -27008, -13687, 7479, 24472, 27536, 14891, -6305, -23977, -28008, -16060, 5116, 23440, 28469, 17281, -3761, -22690, -28735, -18414, 2380, 21828, 28848, 19442, -1025, -20870, -28788, -20261, -163, 20024, 28791, 21127, 1438, -19069, -28726, -22051, -2841, 17965, 28569, 22990, 4433, -16566, -28128, -23753, -5978, 15074, 27500, 24325, 7423, -13590, -26830, -24855, -8812, 12151, 26187, 25384, 10249, -10633, -25472, -25921, -11739, 9027, 24638, 26287, 13122, -7399, -23660, -26496, -14339, 5885, 22731, 26634, 15463, -4436, -21772, -26757, -16579, 2965, 20809, 26874, 17761, -1354, -19672, -26840, -18864, -257, 18450, 26724, 19908, 1912, -17136, -26468, -20890, -3534, 15759, 26147, 21798, 5186, -14286, -25674, -22545, -6722, 12850, 25095, 23126, 8094, -11482, -24496, -23601, -9302, 10260, 23983, 24078, 10484, -9031, -23408, -24490, -11656, 7780, 22764, 24771, 12715, -6537, -21981, -24856, -13533, 5482, 21287, 24880, 14217, -4551, -20669, -24916, -14865, 3710, 20152, 25053, 15609, -2744, -19524, -25105, -16305, 1815, 18857, 25089, 16928, -899, -18187, -24997, -17440, 132, 17647, 25016, 18042, 712, -17029, -25013, -18661, -1601, 16356, 24943, 19245, 2564, -15538, -24676, -19633, -3333, 14829, 24419, 19919, 3984, -14214, -24194, -20217, -4568, 13715, 24102, 20637, 5304, -13067, -23934, -21036, -6070, 12365, 23671, 21367, 6819, -11595, -23282, -21562, -7440, 10890, 22916, 21716, 8053, -10193, -22508, -21843, -8623, 9509, 22101, 21943, 9168, -8819, -21693, -22038, -9714, 8198, 21370, 22249, 10336, -7532, -21099, -22589, -11132, 6727, 20777, 22979, 12058, -5750, -20279, -23255, -12954, 4713, 19677, 23364, 13697, -3786, -19084, -23440, -14346, 2974, 18592, 23537, 14969, -2188, -18106, -23666, -15671, 1318, 17543, 23716, 16304, -439, -16935, -23753, -16996, -511, 16264, 23738, 17655, 1474, -15559, -23768, -18451, -2621, 14679, 23645, 19147, 3810, -13673, -23358, -19740, -4900, 12659, 22938, 20053, 5734, -11844, -22588, -20355, -6427, 11182, 22353, 20694, 7123, -10529, -22159, -21094, -7921, 9768, 21830, 21367, 8662, -8940, -21390, -21554, -9382, 8107, 20887, 21653, 10026, -7302, -20411, -21831, -10792, 6361, 19839, 21934, 11532, -5427, -19244, -22065, -12290, 4448, 18596, 22065, 12888, -3654, -18113, -22198, -13567, 2839, 17615, 22312, 14210, -2039, -17165, -22488, -14967, 1108, 16536, 22459, 15524, -296, -15912, -22395, -16024, -493, 15287, 22250, 16417, 1173, -14729, -22171, -16889, -1948, 14093, 22009, 17288, 2669, -13452, -21829, -17679, -3385, 12815, 21610, 17975, 3990, -12285, -21492, -18360, -4655, 11735, 21391, 18749, 5336, -11146, -21228, -19123, -6055, 10468, 20933, 19322, 6588, -9885, -20631, -19449, -7042, 9384, 20356, 19536, 7422, -8984, -20198, -19733, -7874, 8520, 19967, 19860, 8282, -8070, -19735, -19981, -8677, 7634, 19514, 20068, 8993, -7295, -19393, -20294, -9450, 6881, 19254, 20539, 9983, -6327, -19002, -20729, -10530, 5702, 18597, 20739, 10918, -5147, -18189, -20677, -11199, 4734, 17918, 20707, 11542, -4300, -17671, -20873, -12045, 3718, 17344, 21027, 12655, -2942, -16829, -21067, -13247, 2117, 16241, 21037, 13797, -1299, -15631, -21019, -14391, 464, 15058, 21061, 15040, 460, -14384, -21022, -15682, -1393, 13678, 20933, 16222, 2263, -12962, -20780, -16686, -3061, 12320, 20643, 17149, 3847, -11650, -20470, -17588, -4656, 10916, 20241, 17974, 5483, -10104, -19876, -18285, -6254, 9319, 19534, 18584, 7043, -8490, -19174, -18938, -7912, 7603, 18804, 19328, 8912, -6536, -18274, -19620, -9856, 5489, 17693, 19831, 10720, -4455, -17077, -19978, -11493, 3533, 16557, 20163, 12312, -2542, -15927, -20251, -13050, 1563, 15254, 20230, 13662, -642, -14537, -20081, -14121, -93, 13963, 19981, 14535, 764, -13435, -19942, -15014, -1481, 12918, 19936, 15570, 2318, -12246, -19794, -16042, -3123, 11537, 19583, 16384, 3830, -10890, -19345, -16686, -4451, 10342, 19213, 17056, 5126, -9748, -19050, -17449, -5858, 9086, 18817, 17767, 6562, -8360, -18452, -17957, -7150, 7710, 18119, 18092, 7692, -7096, -17795, -18265, -8242, 6491, 17490, 18448, 8853, -5795, -17097, -18578, -9411, 5140, 16718, 18697, 9940, -4501, -16374, -18846, -10515, 3869, 16052, 19054, 11157, -3132, -15639, -19226, -11815, 2333, 15127, 19224, 12316, -1609, -14580, -19128, -12671, 1049, 14136, 19030, 12945, -601, -13790, -19008, -13260, 143, 13448, 19000, 13593, 373, -13028, -18900, -13864, -858, 12623, 18783, 14089, 1280, -12238, -18688, -14325, -1715, 11884, 18645, 14671, 2290, -11405, -18526, -15013, -2893, 10869, 18366, 15334, 3524, -10268, -18145, -15592, -4112, 9716, 17974, 15929, 4770, -9107, -17792, -16301, -5503, 8434, 17531, 16624, 6248, -7660, -17155, -16811, -6860, 6998, 16791, 16933, 7346, -6444, -16518, -17094, -7818, 5954, 16346, 17344, 8409, -5335, -16039, -17528, -8965, 4723, 15691, 17618, 9460, -4096, -15259, -17613, -9829, 3597, 14944, 17677, 10256, -3054, -14605, -17752, -10718, 2483, 14254, 17861, 11238, -1798, -13761, -17812, -11624, 1226, 13347, 17782, 11967, -704, -12974, -17745, -12286, 270, 12688, 17820, 12693, 249, -12335, -17838, -13062, -768, 11952, 17785, 13373, 1257, -11546, -17667, -13582, -1668, 11200, 17587, 13825, 2106, -10819, -17491, -14082, -2564, 10411, 17378, 14335, 3062, -9919, -17170, -14503, -3503, 9503, 16996, 14696, 3928, -9077, -16837, -14894, -4374, 8664, 16707, 15121, 4849, -8197, -16481, -15245, -5207, 7803, 16279, 15314, 5486, -7512, -16146, -15413, -5732, 7292, 16114, 15617, 6072, -7004, -16059, -15848, -6496, 6576, 15842, 15943, 6843, -6152, -15558, -15927, -7104, 5804, 15293, 15880, 7256, -5565, -15178, -15987, -7533, 5286, 15067, 16160, 7928, -4886, -14884, -16319, -8353, 4417, 14607, 16369, 8689, -3966, -14332, -16394, -8991, 3595, 14085, 16427, 9276, -3209, -13834, -16454, -9587, 2806, 13527, 16394, 9778, -2481, -13269, -16345, -9949, 2212, 13069, 16328, 10124, -1980, -12955, -16464, -10463, 1574, 12718, 16550, 10865, -1063, -12363, -16548, -11236, 487, 11879, 16386, 11450, -61, -11500, -16290, -11690, -349, 11160, 16238, 11934, 747, -10882, -16286, -12324, -1300, 10471, 16213, 12637, 1811, -10053, -16125, -12954, -2342, 9569, 15961, 13167, 2805, -9152, -15857, -13450, -3351, 8627, 15623, 13642, 3842, -8141, -15436, -13869, -4362, 7600, 15158, 13986, 4770, -7186, -15035, -14282, -5330, 6668, 14870, 14581, 5954, -6066, -14652, -14899, -6682, 5308, 14243, 15029, 7264, -4612, -13817, -15113, -7767, 3979, 13411, 15148, 8202, -3450, -13115, -15288, -8705, 2855, 12781, 15392, 9204, -2257, -12417, -15451, -9646, 1671, 12017, 15432, 9977, -1216, -11723, -15479, -10345, 738, 11403, 15519, 10709, -241, -11062, -15529, -11084, -302, 10622, 15416, 11341, 767, -10206, -15279, -11523, -1149, 9873, 15179, 11727, 1515, -9565, -15136, -11976, -1920, 9239, 15069, 12226, 2355, -8840, -14930, -12396, -2713, 8518, 14805, 12547, 3026, -8227, -14724, -12714, -3352, 7942, 14651, 12914, 3732, -7565, -14492, -13051, -4099, 7177, 14261, 13087, 4348, -6877, -14099, -13144, -4582, 6611, 13977, 13242, 4838, -6379, -13944, -13481, -5252, 5993, 13774, 13623, 5632, -5581, -13567, -13723, -5982, 5175, 13327, 13747, 6231, -4892, -13187, -13887, -6559, 4536, 13042, 14033, 6951, -4130, -12837, -14166, -7367, 3651, 12521, 14176, 7670, -3229, -12252, -14182, -7924, 2905, 12070, 14268, 8245, -2544, -11877, -14415, -8645, 2076, 11626, 14497, 9056, -1567, -11253, -14453, -9348, 1117, 10894, 14366, 9555, -735, -10578, -14284, -9750, 386, 10270, 14213, 9944, -41, -9983, -14138, -10138, -311, 9676, 14056, 10331, 624, -9426, -14050, -10571, -980, 9180, 14099, 10921, 1483, -8815, -14078, -11281, -2019, 8369, 13962, 11554, 2560, -7854, -13711, -11674, -2929, 7466, 13529, 11791, 3262, -7134, -13411, -11948, -3609, 6829, 13352, 12212, 4070, -6404, -13200, -12429, -4509, 5970, 13038, 12623, 4968, -5530, -12850, -12806, -5419, 5097, 12704, 13054, 5954, -4555, -12448, -13216, -6446, 3993, 12110, 13285, 6863, -3451, -11729, -13241, -7132, 3053, 11468, 13265, 7436, -2672, -11247, -13357, -7793, 2252, 11012, 13490, 8246, -1688, -10645, -13486, -8604, 1189, 10274, 13448, 8905, -746, -9939, -13407, -9135, 387, 9704, 13457, 9474, 52, -9406, -13458, -9775, -493, 9065, 13394, 10030, 929, -8652, -13204, -10121, -1203, 8373, 13087, 10221, 1465, -8133, -13018, -10369, -1732, 7917, 13000, 10619, 2119, -7585, -12926, -10818, -2493, 7265, 12840, 11046, 2895, -6912, -12740, -11228, -3263, 6582, 12644, 11418, 3638, -6228, -12477, -11529, -3919, 5927, 12301, 11563, 4121, -5672, -12150, -11552, -4236, 5548, 12109, 11664, 4454, -5347, -12065, -11814, -4741, 5080, 11978, 11982, 5108, -4688, -11736, -11987, -5333, 4404, 11552, 12029, 5542, -4149, -11419, -12096, -5755, 3937, 11388, 12298, 6131, -3561, -11214, -12427, -6494, 3154, 10963, 12480, 6845, -2693, -10627, -12416, -7080, 2332, 10372, 12455, 7386, -1906, -10078, -12467, -7708, 1448, 9771, 12487, 8073, -934, -9378, -12418, -8341, 498, 9038, 12364, 8604, -97, -8739, -12364, -8890, -308, 8461, 12401, 9274, 834, -8049, -12331, -9579, -1381, 7579, 12172, 9826, 1863, -7107, -11982, -9992, -2300, 6690, 11862, 10252, 2804, -6261, -11774, -10602, -3404, 5739, 11640, 10959, 4076, -5123, -11421, -11243, -4698, 4509, 11179, 11501, 5292, -3935, -10940, -11753, -5895, 3312, 10644, 11937, 6467, -2660, -10257, -12023, -6962, 2012, 9789, 11936, 7282, -1519, -9414, -11899, -7578, 1046, 9050, 11859, 7886, -585, -8736, -11889, -8296, 17, 8296, 11846, 8651, 543, -7854, -11788, -8995, -1092, 7426, 11702, 9290, 1577, -7063, -11685, -9663, -2135, 6622, 11592, 9966, 2643, -6161, -11440, -10183, -3118, 5686, 11207, 10262, 3444, -5348, -11033, -10388, -3759, 5008, 10903, 10532, 4119, -4658, -10774, -10763, -4613, 4134, 10506, 10878, 5051, -3627, -10197, -10937, -5434, 3144, 9897, 10959, 5732, -2773, -9708, -11092, -6130, 2338, 9475, 11177, 6483, -1940, -9253, -11258, -6812, 1517, 8954, 11217, 7030, -1220, -8761, -11258, -7290, 879, 8538, 11285, 7562, -510, -8301, -11361, -7935, -1, 7909, 11285, 8221, 471, -7520, -11222, -8519, -973, 7110, 11130, 8775, 1419, -6776, -11124, -9162, -1995, 6315, 11015, 9451, 2502, -5867, -10888, -9711, -3025, 5356, 10643, 9812, 3362, -5015, -10530, -10029, -3807, 4584, 10337, 10211, 4256, -4103, -10135, -10415, -4819, 3446, 9709, 10420, 5245, -2865, -9296, -10415, -5618, 2336, 8912, 10387, 5932, -1899, -8666, -10501, -6370, 1401, 8398, 10644, 6853, -858, -8106, -10768, -7333, 285, 7752, 10830, 7754, 246, -7423, -10893, -8182, -804, 7028, 10889, 8574, 1395, -6566, -10781, -8870, -1939, 6066, 10581, 9051, 2380, -5605, -10346, -9168, -2741, 5222, 10176, 9304, 3115, -4848, -10037, -9501, -3536, 4431, 9863, 9683, 3995, -3938, -9621, -9790, -4397, 3503, 9390, 9909, 4780, -3110, -9217, -10086, -5199, 2678, 9044, 10283, 5678, -2149, -8775, -10410, -6139, 1619, 8414, 10400, 6452, -1172, -8093, -10362, -6689, 812, 7824, 10353, 6909, -480, -7619, -10394, -7211, 86, 7338, 10387, 7482, 305, -7024, -10309, -7680, -657, 6712, 10209, 7820, 946, -6471, -10169, -8018, -1264, 6216, 10132, 8231, 1630, -5905, -10026, -8410, -1975, 5567, 9883, 8507, 2254, -5294, -9782, -8637, -2524, 5056, 9717, 8808, 2808, -4812, -9701, -9030, -3194, 4465, 9560, 9163, 3520, -4130, -9386, -9221, -3758, 3855, 9212, 9239, 3913, -3675, -9148, -9328, -4136, 3459, 9064, 9462, 4408, -3175, -8929, -9545, -4702, 2838, 8724, 9597, 4971, -2487, -8487, -9589, -5204, 2164, 8287, 9648, 5499, -1777, -8007, -9629, -5739, 1428, 7749, 9628, 5982, -1058, -7455, -9542, -6133, 814, 7299, 9612, 6401, -498, -7124, -9703, -6731, 108, 6910, 9804, 7151, 457, -6479, -9723, -7433, -941, 6046, 9555, 7610, 1347, -5646, -9382, -7731, -1656, 5387, 9339, 7957, 2021, -5086, -9286, -8197, -2425, 4734, 9213, 8436, 2882, -4325, -9035, -8609, -3255, 3939, 8902, 8797, 3694, -3496, -8720, -8991, -4179, 2996, 8497, 9195, 4737, -2370, -8115, -9275, -5225, 1748, 7694, 9272, 5613, -1193, -7305, -9265, -5966, 695, 6974, 9316, 6375, -172, -6654, -9365, -6785, -365, 6281, 9366, 7146, 876, -5890, -9316, -7435, -1333, 5531, 9241, 7686, 1758, -5172, -9149, -7917, -2185, 4774, 9014, 8111, 2593, -4364, -8812, -8216, -2930, 4009, 8645, 8350, 3280, -3660, -8514, -8518, -3658, 3298, 8403, 8749, 4145, -2817, -8172, -8896, -4587, 2300, 7863, 8928, 4906, -1874, -7561, -8897, -5135, 1570, 7362, 8922, 5369, -1284, -7203, -9005, -5656, 955, 6989, 9033, 5907, -598, -6733, -8998, -6100, 286, 6482, 8941, 6243, -40, -6317, -8956, -6457, -236, 6141, 9026, 6767, 638, -5865, -9025, -7042, -1062, 5502, 8896, 7233, 1427, -5131, -8749, -7322, -1723, 4867, 8641, 7464, 1997, -4624, -8606, -7669, -2364, 4302, 8508, 7863, 2753, -3920, -8356, -8018, -3137, 3525, 8153, 8130, 3479, -3159, -7969, -8261, -3830, 2766, 7790, 8385, 4225, -2310, -7522, -8454, -4587, 1863, 7216, 8460, 4867, -1475, -6951, -8457, -5132, 1121, 6737, 8537, 5475, -710, -6495, -8619, -5864, 200, 6141, 8601, 6208, 322, -5714, -8509, -6474, -801, 5287, 8352, 6671, 1195, -4958, -8284, -6920, -1628, 4594, 8217, 7192, 2096, -4198, -8123, -7471, -2601, 3749, 7957, 7668, 3035, -3330, -7804, -7872, -3478, 2906, 7643, 8081, 3930, -2442, -7439, -8233, -4369, 1951, 7153, 8297, 4728, -1493, -6849, -8265, -4955, 1186, 6625, 8277, 5176, -882, -6451, -8321, -5455, 554, 6236, 8366, 5732, -149, -5937, -8320, -5965, -231, 5600, 8205, 6115, 535, -5314, -8112, -6261, -840, 5066, 8087, 6482, 1187, -4789, -8061, -6751, -1614, 4424, 7947, 6951, 2001, -4057, -7804, -7089, -2320, 3758, 7686, 7201, 2599, -3510, -7628, -7405, -2943, 3187, 7521, 7564, 3316, -2816, -7351, -7691, -3681, 2400, 7071, 7704, 3945, -2045, -6850, -7731, -4219, 1690, 6616, 7772, 4500, -1326, -6388, -7827, -4815, 915, 6092, 7777, 5028, -589, -5850, -7762, -5218, 318, 5657, 7765, 5391, -85, -5554, -7854, -5665, -235, 5342, 7870, 5886, 534, -5124, -7868, -6114, -887, 4833, 7748, 6206, 1094, -4647, -7723, -6363, -1369, 4408, 7653, 6495, 1634, -4165, -7584, -6670, -1964, 3827, 7397, 6709, 2181, -3573, -7249, -6765, -2394, 3328, 7122, 6816, 2577, -3152, -7093, -7001, -2910, 2838, 6977, 7142, 3259, -2482, -6801, -7272, -3602, 2094, 6582, 7307, 3876, -1769, -6420, -7423, -4207, 1399, 6218, 7505, 4540, -1023, -5994, -7580, -4874, 581, 5675, 7516, 5081, -251, -5402, -7453, -5242, -38, 5181, 7416, 5398, 302, -4991, -7426, -5643, -652, 4709, 7388, 5887, 1050, -4349, -7282, -6076, -1434, 3996, 7158, 6242, 1797, -3661, -7062, -6451, -2184, 3329, 6964, 6687, 2627, -2918, -6803, -6839, -3018, 2506, 6590, 6919, 3315, -2147, -6370, -6955, -3556, 1861, 6212, 7010, 3819, -1548, -6040, -7090, -4114, 1186, 5794, 7107, 4393, -805, -5501, -7074, -4610, 452, 5244, 7029, 4810, -149, -5034, -7056, -5077, -189, 4800, 7075, 5346, 573, -4525, -7051, -5573, -929, 4232, 6962, 5718, 1207, -3990, -6906, -5856, -1454, 3813, 6906, 6061, 1748, -3592, -6897, -6290, -2095, 3272, 6796, 6435, 2442, -2933, -6606, -6502, -2692, 2629, 6436, 6540, 2908, -2384, -6298, -6613, -3141, 2128, 6172, 6707, 3421, -1800, -5985, -6731, -3649, 1502, 5762, 6701, 3812, -1265, -5590, -6694, -3937, 1087, 5493, 6756, 4146, -846, -5373, -6833, -4392, 557, 5188, 6868, 4624, -231, -4953, -6845, -4814, -47, 4736, 6803, 4983, 327, -4532, -6793, -5195, -641, 4275, 6750, 5391, 970, -3970, -6634, -5511, -1262, 3693, 6501, 5598, 1488, -3456, -6416, -5694, -1720, 3248, 6381, 5885, 2051, -2952, -6279, -6047, -2390, 2600, 6118, 6153, 2717, -2245, -5900, -6186, -2942, 1967, 5756, 6265, 3204, -1717, -5655, -6409, -3523, 1366, 5509, 6534, 3882, -964, -5269, -6582, -4185, 561, 4972, 6539, 4400, -220, -4710, -6511, -4614, -107, 4477, 6505, 4865, 463, -4196, -6504, -5143, -886, 3859, 6430, 5391, 1325, -3463, -6282, -5536, -1684, 3122, 6154, 5722, 2067, -2736, -5987, -5837, -2389, 2405, 5832, 5965, 2738, -2023, -5600, -5984, -2938, 1783, 5507, 6098, 3210, -1510, -5390, -6197, -3479, 1261, 5311, 6375, 3846, -845, -5059, -6388, -4124, 481, 4762, 6332, 4292, -161, -4466, -6189, -4332, -18, 4317, 6169, 4487, 246, -4137, -6150, -4662, -517, 3939, 6168, 4929, 915, -3588, -6026, -5042, -1201, 3319, 5936, 5183, 1500, -3039, -5824, -5298, -1731, 2839, 5824, 5529, 2072, -2551, -5747, -5688, -2389, 2256, 5638, 5812, 2690, -1958, -5480, -5880, -2902, 1722, 5386, 5978, 3171, -1434, -5214, -6026, -3415, 1136, 5018, 6044, 3638, -801, -4748, -5950, -3754, 571, 4541, 5899, 3862, -379, -4391, -5883, -3986, 200, 4283, 5939, 4200, 75, -4097, -5938, -4388, -346, 3904, 5908, 4548, 590, -3686, -5857, -4657, -790, 3543, 5861, 4816, 1024, -3358, -5850, -4984, -1286, 3149, 5791, 5127, 1553, -2893, -5685, -5219, -1781, 2657, 5576, 5302, 1993, -2427, -5488, -5409, -2267, 2145, 5328, 5495, 2547, -1829, -5150, -5533, -2796, 1511, 4918, 5511, 2942, -1304, -4805, -5569, -3158, 1061, 4708, 5678, 3417, -800, -4596, -5823, -3759, 397, 4342, 5797, 3996, -65, -4058, -5735, -4154, -231, 3785, 5630, 4231, 420, -3641, -5641, -4431, -709, 3430, 5621, 4628, 1013, -3202, -5626, -4907, -1441, 2824, 5486, 5052, 1766, -2518, -5393, -5247, -2171, 2114, 5202, 5357, 2512, -1760, -5038, -5503, -2905, 1290, 4722, 5469, 3121, -968, -4495, -5477, -3354, 649, 4262, 5447, 3513, -434, -4158, -5558, -3843, 59, 3912, 5574, 4072, 286, -3686, -5566, -4328, -660, 3349, 5438, 4419, 890, -3160, -5407, -4583, -1153, 2926, 5351, 4734, 1417, -2721, -5336, -4955, -1789, 2359, 5156, 5044, 2073, -2046, -4999, -5115, -2350, 1724, 4784, 5112, 2533, -1490, -4664, -5192, -2769, 1200, 4492, 5216, 2976, -941, -4339, -5258, -3199, 678, 4164, 5263, 3368, -452, -4017, -5312, -3589, 180, 3852, 5344, 3816, 139, -3614, -5314, -4002, -437, 3343, 5196, 4081, 644, -3146, -5115, -4154, -801, 3000, 5085, 4242, 961, -2900, -5119, -4439, -1228, 2684, 5063, 4569, 1475, -2451, -4971, -4646, -1689, 2217, 4831, 4673, 1829, -2052, -4776, -4776, -2053, 1843, 4711, 4916, 2325, -1584, -4605, -5030, -2633, 1233, 4381, 5031, 2838, -960, -4194, -5027, -2991, 736, 4024, 5012, 3103, -588, -3953, -5082, -3294, 370, 3822, 5080, 3438, -174, -3693, -5092, -3582, -24, 3531, 5061, 3698, 206, -3404, -5093, -3875, -465, 3215, 5066, 4054, 744, -2976, -5011, -4223, -1071, 2649, 4853, 4278, 1297, -2403, -4715, -4328, -1480, 2205, 4626, 4411, 1667, -2013, -4577, -4527, -1913, 1785, 4479, 4640, 2176, -1507, -4329, -4684, -2389, 1270, 4198, 4767, 2634, -984, -4041, -4811, -2874, 694, 3864, 4873, 3134, -329, -3591, -4794, -3301, 42, 3338, 4703, 3403, 166, -3125, -4632, -3463, -297, 3063, 4702, 3655, 520, -2944, -4753, -3876, -790, 2756, 4777, 4110, 1151, -2451, -4639, -4202, -1377, 2210, 4538, 4284, 1601, -1970, -4412, -4319, -1769, 1803, 4355, 4450, 2027, -1540, -4217, -4509, -2229, 1302, 4108, 4594, 2500, -1008, -3934, -4635, -2690, 768, 3811, 4719, 2973, -437, -3586, -4696, -3158, 157, 3368, 4659, 3310, 105, -3135, -4569, -3377, -260, 3020, 4571, 3544, 494, -2856, -4588, -3728, -748, 2680, 4608, 3961, 1097, -2363, -4491, -4065, -1350, 2112, 4370, 4122, 1546, -1908, -4238, -4149, -1662, 1787, 4224, 4265, 1862, -1599, -4164, -4340, -2057, 1396, 4052, 4399, 2261, -1155, -3885, -4375, -2366, 986, 3762, 4391, 2515, -791, -3634, -4402, -2661, 589, 3499, 4444, 2866, -312, -3286, -4364, -2956, 124, 3112, 4327, 3059, 56, -2979, -4305, -3164, -203, 2904, 4355, 3352, 429, -2743, -4367, -3533, -674, 2554, 4338, 3663, 906, -2347, -4263, -3732, -1067, 2220, 4246, 3867, 1276, -2054, -4217, -3994, -1501, 1853, 4158, 4122, 1770, -1567, -3988, -4126, -1935, 1349, 3831, 4130, 2054, -1179, -3719, -4122, -2174, 1035, 3654, 4206, 2373, -823, -3542, -4273, -2595, 554, 3381, 4300, 2804, -273, -3194, -4312, -2989, 11, 3008, 4307, 3172, 262, -2814, -4298, -3376, -567, 2546, 4222, 3529, 849, -2284, -4121, -3613, -1091, 2037, 3987, 3669, 1264, -1862, -3936, -3788, -1496, 1634, 3847, 3895, 1740, -1397, -3751, -3989, -1988, 1111, 3567, 3987, 2151, -915, -3460, -4022, -2310, 736, 3363, 4089, 2472, -549, -3289, -4170, -2702, 274, 3105, 4164, 2876, -35, -2909, -4119, -2977, -178, 2714, 4012, 3027, 302, -2589, -3994, -3123, -459, 2453, 3977, 3232, 676, -2277, -3913, -3328, -860, 2095, 3843, 3406, 1027, -1926, -3760, -3445, -1150, 1806, 3744, 3541, 1313, -1673, -3713, -3634, -1485, 1524, 3652, 3702, 1628, -1384, -3569, -3711, -1701, 1293, 3537, 3731, 1759, -1245, -3537, -3801, -1871, 1134, 3487, 3841, 1996, -980, -3368, -3815, -2093, 825, 3218, 3745, 2109, -729, -3133, -3703, -2138, 671, 3105, 3751, 2241, -557, -3052, -3817, -2401, 374, 2945, 3834, 2537, -201, -2810, -3802, -2609, 74, 2719, 3800, 2681, 15, -2676, -3849, -2823, -184, 2574, 3880, 2981, 391, -2419, -3862, -3116, -620, 2206, 3747, 3158, 757, -2049, -3659, -3185, -865, 1936, 3628, 3236, 984, -1846, -3640, -3351, -1162, 1707, 3578, 3415, 1282, -1582, -3546, -3487, -1430, 1437, 3481, 3503, 1506, -1367, -3471, -3602, -1678, 1189, 3378, 3631, 1821, -1029, -3283, -3670, -1984, 805, 3107, 3623, 2073, -652, -2993, -3624, -2195, 456, 2838, 3603, 2314, -282, -2691, -3602, -2439, 70, 2534, 3532, 2504, 58, -2433, -3522, -2595, -161, 2377, 3582, 2726, 303, -2332, -3669, -2929, -518, 2187, 3679, 3075, 737, -2015, -3610, -3153, -898, 1845, 3522, 3158, 992, -1737, -3460, -3198, -1087, 1638, 3435, 3268, 1256, -1476, -3358, -3327, -1423, 1277, 3234, 3341, 1553, -1101, -3112, -3324, -1633, 998, 3056, 3379, 1761, -866, -3019, -3453, -1923, 712, 2947, 3519, 2097, -510, -2805, -3502, -2189, 352, 2696, 3483, 2273, -244, -2593, -3473, -2351, 121, 2527, 3509, 2488, 65, -2389, -3475, -2603, -238, 2237, 3436, 2686, 391, -2104, -3391, -2732, -503, 2036, 3405, 2846, 652, -1924, -3446, -3014, -874, 1765, 3414, 3147, 1104, -1545, -3312, -3190, -1282, 1343, 3179, 3198, 1381, -1199, -3093, -3208, -1488, 1079, 3028, 3231, 1599, -946, -2941, -3245, -1677, 840, 2875, 3254, 1758, -747, -2824, -3261, -1830, 674, 2808, 3357, 1987, -516, -2745, -3419, -2176, 286, 2588, 3432, 2350, -21, -2364, -3341, -2438, -157, 2188, 3298, 2531, 333, -2036, -3251, -2605, -482, 1931, 3272, 2767, 705, -1753, -3232, -2879, -905, 1579, 3158, 2954, 1081, -1401, -3084, -3001, -1231, 1247, 3019, 3099, 1442, -1020, -2896, -3152, -1639, 767, 2723, 3162, 1822, -511, -2544, -3126, -1954, 315, 2403, 3141, 2092, -141, -2313, -3215, -2305, -101, 2175, 3254, 2519, 370, -1983, -3240, -2672, -627, 1752, 3118, 2714, 765, -1599, -3049, -2753, -901, 1459, 2980, 2803, 1039, -1322, -2944, -2912, -1256, 1095, 2818, 2955, 1446, -872, -2685, -2997, -1618, 661, 2556, 3021, 1766, -475, -2467, -3077, -1971, 253, 2326, 3105, 2133, -26, -2181, -3102, -2270, -168, 2017, 3039, 2326, 297, -1915, -3028, -2417, -432, 1809, 3030, 2541, 611, -1669, -3018, -2675, -846, 1449, 2926, 2763, 1057, -1232, -2817, -2823, -1246, 1038, 2719, 2885, 1423, -856, -2645, -2962, -1612, 643, 2524, 2991, 1773, -440, -2393, -2985, -1869, 303, 2302, 2984, 1946, -213, -2273, -3044, -2075, 91, 2236, 3139, 2267, 112, -2113, -3165, -2447, -353, 1913, 3097, 2534, 551, -1705, -2967, -2537, -664, 1576, 2914, 2584, 783, -1451, -2866, -2651, -928, 1326, 2831, 2746, 1123, -1115, -2704, -2758, -1245, 955, 2600, 2738, 1338, -829, -2514, -2752, -1416, 732, 2483, 2830, 1586, -571, -2405, -2896, -1757, 375, 2294, 2922, 1928, -156, -2129, -2889, -2007, 13, 2024, 2878, 2113, 142, -1896, -2858, -2171, -251, 1812, 2839, 2231, 357, -1720, -2788, -2244, -395, 1692, 2796, 2308, 467, -1641, -2826, -2378, -566, 1585, 2853, 2514, 763, -1424, -2779, -2572, -898, 1253, 2704, 2609, 1056, -1084, -2579, -2593, -1138, 979, 2533, 2663, 1276, -807, -2443, -2677, -1414, 659, 2355, 2710, 1552, -477, -2217, -2683, -1599, 389, 2177, 2718, 1696, -303, -2140, -2781, -1834, 172, 2109, 2868, 2030, 66, -1936, -2834, -2144, -261, 1739, 2731, 2166, 384, -1587, -2609, -2135, -430, 1518, 2580, 2156, 489, -1465, -2589, -2220, -578, 1402, 2593, 2322, 733, -1274, -2542, -2367, -851, 1158, 2507, 2420, 969, -1049, -2451, -2478, -1086, 941, 2430, 2561, 1241, -786, -2356, -2585, -1336, 679, 2299, 2609, 1412, -598, -2267, -2640, -1482, 546, 2279, 2710, 1589, -467, -2254, -2765, -1708, 333, 2184, 2786, 1822, -172, -2056, -2750, -1876, 60, 1942, 2723, 1942, 68, -1831, -2674, -2008, -208, 1706, 2642, 2077, 329, -1583, -2586, -2113, -441, 1497, 2569, 2168, 508, -1447, -2599, -2258, -623, 1391, 2622, 2369, 775, -1270, -2582, -2438, -902, 1108, 2460, 2377, 938, -1025, -2352, -2304, -898, 1018, 2334, 2276, 880, -1050, -2390, -2371, -989, 974, 2396, 2478, 1161, -815, -2322, -2533, -1325, 603, 2170, 2482, 1384, -508, -2088, -2470, -1425, 437, 2029, 2460, 1470, -374, -2023, -2523, -1586, 251, 1932, 2507, 1649, -156, -1867, -2507, -1724, 36, 1758, 2498, 1791, 68, -1705, -2509, -1915, -225, 1584, 2495, 2004, 357, -1478, -2481, -2085, -505, 1353, 2456, 2132, 604, -1293, -2470, -2250, -757, 1179, 2459, 2349, 904, -1055, -2440, -2452, -1106, 845, 2315, 2468, 1227, -694, -2223, -2497, -1353, 515, 2091, 2468, 1436, -410, -2029, -2501, -1576, 226, 1872, 2442, 1616, -119, -1780, -2419, -1664, 28, 1687, 2357, 1648, -21, -1707, -2443, -1773, -111, 1653, 2476, 1919, 272, -1522, -2470, -2054, -500, 1302, 2353, 2066, 643, -1131, -2240, -2068, -732, 1001, 2150, 2065, 790, -948, -2148, -2126, -897, 864, 2131, 2199, 991, -779, -2128, -2270, -1105, 694, 2113, 2310, 1182, -633, -2127, -2425, -1356, 486, 2051, 2451, 1493, -321, -1920, -2436, -1581, 136, 1733, 2330, 1593, -29, -1596, -2246, -1579, -29, 1533, 2219, 1627, 117, -1472, -2232, -1727, -264, 1362, 2217, 1831, 416, -1224, -2175, -1897, -546, 1103, 2135, 1938, 644, -1026, -2132, -2024, -765, 945, 2138, 2106, 902, -838, -2095, -2170, -1024, 720, 2025, 2175, 1076, -649, -2000, -2187, -1124, 624, 1999, 2262, 1208, -538, -1985, -2300, -1307, 431, 1933, 2343, 1422, -295, -1819, -2300, -1463, 187, 1742, 2290, 1532, -79, -1656, -2284, -1617, -27, 1583, 2305, 1740, 196, -1434, -2253, -1792, -324, 1329, 2230, 1871, 452, -1229, -2222, -1964, -600, 1117, 2219, 2089, 793, -934, -2130, -2134, -942, 750, 2010, 2116, 1037, -605, -1880, -2059, -1052, 557, 1858, 2076, 1117, -512, -1850, -2141, -1221, 422, 1839, 2253, 1400, -222, -1715, -2231, -1489, 79, 1602, 2197, 1550, 25, -1502, -2165, -1564, -69, 1485, 2200, 1665, 186, -1409, -2186, -1759, -327, 1290, 2164, 1833, 479, -1122, -2065, -1821, -556, 1021, 1994, 1823, 604, -951, -1960, -1837, -652, 909, 1971, 1907, 762, -834, -1948, -1964, -837, 766, 1947, 2028, 946, -671, -1910, -2071, -1036, 581, 1879, 2123, 1158, -450, -1798, -2129, -1241, 332, 1716, 2112, 1297, -249, -1649, -2105, -1336, 200, 1612, 2123, 1407, -87, -1550, -2106, -1481, -14, 1441, 2058, 1512, 115, -1308, -1953, -1437, -91, 1300, 1912, 1404, 55, -1338, -1956, -1427, -53, 1391, 2062, 1580, 177, -1323, -2091, -1678, -304, 1228, 2078, 1738, 425, -1104, -1985, -1703, -442, 1087, 2000, 1776, 528, -1013, -1973, -1809, -592, 951, 1985, 1890, 748, -798, -1885, -1884, -810, 721, 1811, 1877, 873, -632, -1749, -1867, -885, 614, 1771, 1925, 977, -528, -1735, -1926, -1023, 488, 1730, 1986, 1106, -401, -1674, -1961, -1110, 398, 1687, 2024, 1209, -296, -1624, -2000, -1245, 239, 1576, 2008, 1303, -136, -1478, -1943, -1272, 135, 1466, 1942, 1308, -82, -1433, -1964, -1372, 19, 1408, 2017, 1489, 136, -1277, -1969, -1535, -262, 1159, 1887, 1545, 328, -1065, -1839, -1556, -374, 1020, 1839, 1610, 465, -959, -1836, -1698, -585, 849, 1811, 1740, 691, -755, -1746, -1750, -744, 689, 1736, 1765, 770, -683, -1748, -1815, -817, 655, 1781, 1884, 914, -585, -1757, -1927, -998, 496, 1701, 1931, 1055, -411, -1650, -1937, -1126, 316, 1590, 1959, 1216, -204, -1503, -1955, -1314, 49, 1377, 1905, 1358, 40, -1278, -1856, -1358, -75, 1216, 1809, 1339, 83, -1230, -1854, -1409, -146, 1221, 1902, 1507, 238, -1167, -1927, -1601, -369, 1061, 1900, 1657, 465, -993, -1893, -1720, -581, 889, 1855, 1756, 678, -796, -1812, -1805, -777, 667, 1707, 1751, 788, -612, -1634, -1712, -795, 570, 1581, 1667, 780, -560, -1591, -1724, -877, 461, 1520, 1721, 944, -369, -1477, -1770, -1068, 226, 1384, 1745, 1105, -181, -1392, -1836, -1237, 75, 1347, 1854, 1309, -8, -1332, -1913, -1419, -118, 1205, 1818, 1358, 109, -1205, -1813, -1343, -110, 1190, 1768, 1301, 57, -1241, -1850, -1413, -175, 1146, 1818, 1451, 280, -1060, -1798, -1541, -437, 890, 1691, 1530, 500, -835, -1697, -1618, -615, 733, 1682, 1674, 707, -687, -1696, -1781, -848, 560, 1639, 1782, 896, -509, -1617, -1798, -949, 443, 1569, 1777, 960, -404, -1538, -1794, -1036, 299, 1457, 1761, 1071, -218, -1365, -1716, -1090, 153, 1291, 1684, 1104, -102, -1266, -1711, -1181, 36, 1239, 1757, 1302, 105, -1139, -1751, -1372, -238, 1016, 1688, 1391, 321, -912, -1608, -1367, -337, 882, 1604, 1382, 384, -860, -1605, -1431, -443, 820, 1609, 1498, 534, -729, -1581, -1538, -628, 653, 1547, 1578, 710, -555, -1500, -1594, -792, 452, 1429, 1602, 878, -314, -1320, -1559, -935, 215, 1210, 1492, 927, -159, -1134, -1456, -925, 152, 1144, 1497, 974, -102, -1152, -1555, -1079, 33, 1138, 1634, 1191, 64, -1108, -1676, -1289, -160, 1077, 1716, 1381, 255, -1041, -1742, -1484, -378, 922, 1702, 1516, 482, -789, -1580, -1471, -538, 658, 1435, 1362, 502, -639, -1376, -1318, -484, 615, 1359, 1328, 536, -584, -1379, -1431, -675, 454, 1332, 1476, 796, -345, -1275, -1501, -864, 268, 1253, 1514, 898, -247, -1269, -1564, -956, 222, 1276, 1613, 1006, -163, -1256, -1617, -1057, 108, 1185, 1573, 1053, -60, -1117, -1535, -1066, 3, 1060, 1505, 1102, 91, -960, -1474, -1166, -205, 857, 1448, 1206, 297, -796, -1430, -1260, -343, 800, 1502, 1359, 411, -814, -1602, -1478, -495, 789, 1647, 1565, 593, -689, -1539, -1482, -578, 625, 1402, 1334, 481, -604, -1306, -1210, -425, 578, 1227, 1180, 489, -456, -1145, -1243, -699, 196, 995, 1283, 885, -15, -947, -1383, -1037, -35, 1058, 1592, 1142, -72, -1375, -1913, -1306, 169, 1584, 2090, 1332, -182, -1457, -1680, -793, 448, 1019, 460, -814, -1613, -901, 1271, 3552, 4163, 2055, -2183, -6368, -7883, -5290, 720, 7423, 11311, 10045, 3775, -4830, -11825, -13920, -10113, -1970, 7335, 14189, 15786, 11238, 2007, -8554, -16458, -18517, -13462, -2716, 9963, 19543, 21875, 15419, 2309, -12365, -22652, -24231, -16173, -1376, 14319, 24508, 25067, 15919, 704, -14705, -24560, -25182, -16280, -1187, 14419, 24621, 25651, 17132, 2141, -13857, -24817, -26405, -17888, -2486, 13930, 25068, 26703, 18184, 2760, -13717, -24942, -26593, -18086, -2765, 13421, 24322, 25913, 17763, 3033, -12652, -23264, -24882, -17180, -3394, 11211, 21321, 23478, 17102, 4802, -8872, -19112, -22466, -17903, -7061, 6299, 17538, 22666, 19699, 9514, -4353, -16857, -23332, -21233, -11158, 3242, 16599, 23858, 22230, 12226, -2397, -16136, -23829, -22624, -12974, 1536, 15400, 23399, 22628, 13535, -484, -14156, -22432, -22315, -14038, -826, 12421, 21006, 21999, 15227, 3107, -10105, -19807, -22570, -17244, -5620, 8328, 19621, 24025, 19609, 7666, -7535, -20262, -25590, -21232, -8666, 7470, 20952, 26562, 22034, 9066, -7393, -21025, -26623, -22129, -9304, 6936, 20369, 25990, 21856, 9720, -5798, -18945, -24910, -21673, -10572, 4143, 17106, 23673, 21614, 11773, -2162, -15123, -22515, -21768, -13262, -56, 13079, 21487, 22209, 14985, 2335, -11249, -20855, -23007, -16772, -4271, 9997, 20712, 23812, 18022, 5401, -9346, -20590, -24028, -18359, -5827, 8728, 19739, 23158, 17923, 6262, -7335, -17870, -21640, -17561, -7365, 5128, 15475, 20165, 17741, 9168, -2468, -13131, -19170, -18520, -11374, -174, 11245, 18806, 19753, 13565, 2318, -10003, -18885, -20928, -15203, -3711, 9311, 18932, 21479, 15994, 4541, -8538, -18339, -21247, -16258, -5386, 7274, 17054, 20474, 16446, 6588, -5454, -15385, -19721, -16995, -8232, 3403, 13742, 19154, 17721, 9958, -1384, -12277, -18830, -18681, -11767, -512, 11096, 18800, 19755, 13452, 2095, -10242, -18950, -20717, -14769, -3222, 9654, 18976, 21229, 15531, 4042, -8921, -18509, -21143, -15929, -4911, 7750, 17367, 20495, 16180, 6131, -5914, -15647, -19700, -16758, -7955, 3554, 13742, 19097, 17766, 10157, -1119, -12157, -19034, -19209, -12450, -995, 11060, 19290, 20530, 14160, 2363, -10505, -19597, -21438, -15240, -3290, 9873, 19299, 21444, 15585, 4004, -8887, -18323, -20896, -15822, -5126, 7195, 16661, 19989, 16171, 6685, -5036, -14858, -19386, -17056, -8711, 2730, 13228, 19101, 18186, 10722, -740, -12107, -19264, -19497, -12573, -862, 11370, 19579, 20591, 13891, 1884, -10974, -19812, -21239, -14667, -2554, 10499, 19507, 21128, 14857, 3173, -9505, -18444, -20492, -15063, -4339, 7716, 16776, 19732, 15673, 6126, -5509, -15140, -19436, -16874, -8289, 3319, 13868, 19549, 18240, 10278, -1578, -13053, -19918, -19534, -11911, 257, 12495, 20204, 20420, 12985, 624, -12041, -20210, -20807, -13616, -1367, 11289, 19625, 20571, 13898, 2220, -10081, -18469, -20013, -14295, -3566, 8257, 16920, 19437, 15031, 5340, -6174, -15479, -19313, -16296, -7430, 4221, 14495, 19669, 17732, 9229, -2850, -14104, -20283, -18977, -10502, 2071, 14009, 20743, 19646, 11109, -1657, -13774, -20652, -19702, -11361, 1156, 13079, 19967, 19350, 11612, -248, -11787, -18824, -18932, -12211, -1207, 10076, 17617, 18802, 13292, 3047, -8279, -16679, -19159, -14744, -4927, 6845, 16291, 19913, 16205, 6385, -5997, -16342, -20682, -17245, -7226, 5647, 16450, 21034, 17627, 7553, -5348, -16131, -20761, -17553, -7839, 4656, 15216, 19990, 17375, 8474, -3347, -13776, -19106, -17520, -9662, 1606, 12259, 18506, 18134, 11224, 230, -10973, -18314, -19055, -12816, -1749, 10140, 18439, 19984, 14087, 2835, -9616, -18572, -20606, -14869, -3497, 9245, 18522, 20791, 15249, 4010, -8652, -17959, -20452, -15305, -4550, 7709, 16944, 19831, 15452, 5544, -6205, -15549, -19187, -15924, -6974, 4431, 14255, 18985, 16922, 8724, -2720, -13322, -19202, -18108, -10287, 1505, 12938, 19705, 19178, 11422, -747, -12743, -20006, -19732, -11978, 300, 12463, 19869, 19764, 12271, 284, -11654, -19105, -19421, -12603, -1320, 10260, 17938, 19042, 13324, 2918, -8410, -16662, -18958, -14501, -4876, 6553, 15708, 19305, 15974, 6793, -5007, -15161, -19893, -17327, -8262, 4029, 14979, 20415, 18248, 9184, -3387, -14710, -20504, -18571, -9659, 2853, 14215, 20145, 18535, 10048, -2023, -13182, -19312, -18265, -10577, 828, 11759, 18296, 18190, 11586, 913, -10005, -17304, -18436, -12998, -2873, 8367, 16735, 19166, 14682, 4758, -7067, -16499, -19976, -16074, -6113, 6281, 16459, 20545, 16955, 7004, -5578, -16057, -20488, -17257, -7635, 4709, 15167, 19892, 17270, 8390, -3373, -13718, -18924, -17265, -9453, 1625, 11963, 17956, 17535, 10911, 444, -10185, -17227, -18165, -12592, -2413, 8787, 16968, 19064, 14199, 3989, -7884, -16992, -19877, -15319, -4957, 7391, 17024, 20290, 15890, 5523, -6905, -16671, -20122, -16035, -6008, 6133, 15841, 19569, 16080, 6783, -4814, -14494, -18802, -16294, -7990, 3077, 12951, 18177, 16942, 9685, -1010, -11420, -17828, -17909, -11537, -895, 10253, 17860, 19026, 13235, 2423, -9440, -17957, -19872, -14367, -3432, 8848, 17845, 20164, 14943, 4177, -8063, -17202, -19854, -15174, -4989, 6854, 16004, 19193, 15417, 6152, -5170, -14489, -18540, -15971, -7754, 3188, 12959, 18129, 16860, 9570, -1204, -11660, -18039, -17983, -11379, -515, 10703, 18152, 19013, 12837, 1818, -10035, -18252, -19744, -13855, -2763, 9392, 18009, 19875, 14325, 3483, -8542, -17277, -19541, -14624, -4451, 7159, 15992, 18912, 15002, 5793, -5369, -14503, -18412, -15759, -7541, 3372, 13087, 18169, 16775, 9336, -1556, -12015, -18254, -17911, -10997, 66, 11260, 18407, 18803, 12173, 934, -10766, -18487, -19322, -12900, -1639, 10204, 18151, 19253, 13169, 2255, -9349, -17342, -18832, -13435, -3215, 7983, 16127, 18326, 13924, 4584, -6324, -14902, -18145, -14898, -6311, 4583, 13897, 18279, 16074, 7974, -3164, -13312, -18705, -17258, -9369, 2130, 12973, 19055, 18033, 10219, -1483, -12656, -19076, -18313, -10673, 892, 12028, 18546, 18091, 10964, -93, -10933, -17591, -17742, -11468, -1169, 9405, 16464, 17571, 12382, 2817, -7742, -15530, -17786, -13668, -4581, 6254, 14971, 18330, 15025, 6154, -5141, -14682, -18906, -16143, -7313, 4341, 14480, 19239, 16827, 8094, -3663, -14027, -19110, -17048, -8676, 2827, 13150, 18496, 16989, 9308, -1635, -11833, -17608, -16966, -10249, 70, 10260, 16716, 17187, 11518, 1733, -8711, -16091, -17736, -12986, -3462, 7456, 15793, 18453, 14340, 4869, -6559, -15697, -19074, -15347, -5801, 6000, 15579, 19338, 15805, 6341, -5472, -15142, -19053, -15805, -6719, 4736, 14245, 18347, 15668, 7328, -3526, -12913, -17503, -15717, -8327, 1987, 11523, 16918, 16238, 9734, -327, -10356, -16722, -17074, -11169, -1045, 9645, 16924, 18020, 12389, 2022, -9257, -17156, -18666, -13106, -2554, 9001, 17178, 18850, 13412, 2974, -8499, -16673, -18520, -13466, -3510, 7595, 15737, 17995, 13688, 4486, -6217, -14550, -17557, -14240, -5813, 4672, 13495, 17465, 15153, 7336, -3228, -12717, -17673, -16187, -8734, 2046, 12201, 17943, 17088, 9845, -1141, -11805, -18108, -17674, -10625, 430, 11331, 17971, 17885, 11131, 285, -10564, -17396, -17707, -11499, -1157, 9446, 16466, 17412, 12053, 2444, -7937, -15365, -17240, -12931, -4004, 6379, 14503, 17464, 14131, 5634, -5006, -13972, -17897, -15282, -6957, 4056, 13699, 18334, 16172, 7941, -3291, -13355, -18428, -16601, -8573, 2649, 12815, 18146, 16690, 9083, -1798, -11855, -17422, -16513, -9611, 690, 10575, 16508, 16423, 10467, 825, -9026, -15613, -16593, -11658, -2494, 7638, 15111, 17203, 13031, 4025, -6634, -15015, -17944, -14211, -5084, 6089, 15101, 18497, 14912, 5680, -5742, -14981, -18536, -15102, -6003, 5235, 14381, 18054, 14986, 6467, -4276, -13268, -17285, -15001, -7353, 2817, 11864, 16593, 15369, 8659, -1149, -10571, -16270, -16140, -10186, -455, 9581, 16243, 17023, 11551, 1711, -8904, -16341, -17777, -12610, -2685, 8291, 16215, 18110, 13257, 3482, -7536, -15716, -18017, -13689, -4372, 6407, 14717, 17569, 14016, 5463, -4931, -13424, -17010, -14502, -6864, 3171, 12020, 16553, 15199, 8409, -1408, -10789, -16359, -16081, -9969, -166, 9815, 16321, 16902, 11272, 1395, -9099, -16333, -17546, -12262, -2369, 8439, 16124, 17797, 12867, 3169, -7658, -15579, -17697, -13299, -4083, 6523, 14598, 17289, 13683, 5201, -5057, -13395, -16863, -14302, -6645, 3343, 12132, 16579, 15105, 8215, -1678, -11045, -16506, -16048, -9744, 179, 10164, 16517, 16881, 11024, 1032, -9426, -16478, -17466, -11993, -2042, 8666, 16154, 17632, 12593, 2931, -7731, -15446, -17427, -13031, -3961, 6410, 14303, 16934, 13452, 5212, -4787, -12988, -16512, -14153, -6779, 3007, 11724, 16297, 15052, 8389, -1383, -10780, -16379, -16070, -9856, 69, 10087, 16487, 16848, 10924, 900, -9549, -16462, -17284, -11685, -1757, 8779, 15996, 17253, 12160, 2656, -7702, -15131, -16989, -12684, -3883, 6195, 13912, 16579, 13304, 5303, -4527, -12711, -16355, -14187, -6944, 2789, 11578, 16252, 15101, 8463, -1338, -10761, -16368, -16032, -9782, 163, 10135, 16430, 16643, 10651, 661, -9599, -16275, -16890, -11242, -1443, 8802, 15699, 16755, 11661, 2354, -7681, -14812, -16486, -12202, -3575, 6247, 13730, 16247, 12929, 5012, -4670, -12674, -16144, -13840, -6549, 3144, 11794, 16255, 14858, 8034, -1822, -11138, -16467, -15773, -9202, 844, 10678, 16598, 16372, 10020, -70, -10115, -16362, -16483, -10496, -686, 9263, 15681, 16280, 10946, 1729, -7970, -14651, -15976, -11571, -3078, 6423, 13581, 15858, 12486, 4650, -4855, -12658, -15960, -13531, -6154, 3541, 12063, 16282, 14569, 7455, -2507, -11660, -16558, -15321, -8333, 1818, 11360, 16674, 15763, 8976, -1143, -10776, -16348, -15818, -9459, 321, 9881, 15710, 15757, 10095, 864, -8582, -14815, -15688, -10933, -2294, 7124, 13970, 15811, 12009, 3883, -5664, -13245, -16090, -13130, -5357, 4480, 12792, 16505, 14161, 6546, -3592, -12477, -16777, -14814, -7293, 2980, 12139, 16741, 15083, 7812, -2288, -11436, -16229, -14999, -8280, 1357, 10364, 15480, 14953, 9064, -20, -9010, -14708, -15104, -10093, -1456, 7721, 14161, 15529, 11293, 2913, -6617, -13817, -16021, -12364, -4084, 5794, 13642, 16499, 13247, 5030, -5109, -13410, -16728, -13808, -5705, 4539, 13081, 16721, 14129, 6305, -3785, -12374, -16287, -14176, -6894, 2788, 11315, 15640, 14280, 7820, -1348, -9935, -14924, -14562, -9022, -252, 8630, 14487, 15177, 10387, 1771, -7599, -14315, -15857, -11546, -2902, 6946, 14290, 16372, 12322, 3645, -6449, -14130, -16518, -12698, -4145, 5928, 13704, 16324, 12861, 4685, -5127, -12919, -15879, -12989, -5408, 4050, 11933, 15412, 13312, 6435, -2705, -10843, -15045, -13852, -7651, 1333, 9895, 14938, 14605, 8936, -69, -9169, -15007, -15368, -10029, -870, 8699, 15119, 15936, 10783, 1556, -8271, -14997, -16101, -11177, -2129, 7641, 14482, 15899, 11456, 2889, -6621, -13589, -15549, -11872, -3967, 5258, 12528, 15247, 12516, 5307, -3789, -11544, -15171, -13357, -6711, 2423, 10751, 15236, 14194, 7951, -1312, -10177, -15359, -14907, -8905, 464, 9718, 15387, 15331, 9548, 185, -9218, -15174, -15442, -9973, -839, 8518, 14644, 15306, 10354, 1679, -7514, -13859, -15137, -10931, -2827, 6227, 12980, 15062, 11738, 4201, -4859, -12212, -15211, -12742, -5633, 3592, 11600, 15451, 13696, 6875, -2553, -11127, -15652, -14421, -7830, 1689, 10608, 15577, 14786, 8503, -878, -9878, -15189, -14869, -9106, -80, 8855, 14476, 14789, 9759, 1260, -7599, -13641, -14755, -10602, -2678, 6172, 12791, 14833, 11580, 4155, -4801, -12109, -15103, -12663, -5607, 3599, 11593, 15426, 13608, 6731, -2732, -11271, -15683, -14270, -7529, 2018, 10807, 15536, 14458, 8042, -1286, -10038, -15000, -14433, -8628, 200, 8835, 14167, 14352, 9411, 1155, -7448, -13340, -14475, -10465, -2733, 5955, 12564, 14697, 11577, 4269, -4651, -11977, -15051, -12693, -5690, 3468, 11458, 15305, 13545, 6736, -2622, -11084, -15461, -14113, -7516, 1873, 10524, 15212, 14227, 7969, -1183, -9785, -14710, -14172, -8501, 185, 8675, 13901, 14067, 9165, 1016, -7434, -13208, -14234, -10189, -2481, 6148, 12612, 14569, 11258, 3820, -5104, -12281, -15035, -12317, -5038, 4171, 11901, 15297, 13046, 5957, -3355, -11463, -15334, -13560, -6792, 2448, 10734, 15039, 13793, 7512, -1452, -9793, -14501, -13907, -8311, 198, 8544, 13735, 13979, 9238, 1237, -7172, -13022, -14240, -10376, -2783, 5864, 12467, 14631, 11488, 4111, -4845, -12141, -15026, -12390, -5134, 4084, 11826, 15193, 12909, 5813, -3449, -11395, -15072, -13126, -6346, 2732, 10716, 14670, 13199, 6901, -1843, -9824, -14152, -13288, -7613, 776, 8826, 13637, 13503, 8499, 424, -7797, -13213, -13865, -9516, -1687, 6809, 12905, 14341, 10564, 2871, -5966, -12716, -14846, -11501, -3847, 5308, 12561, 15146, 12095, 4496, -4770, -12241, -15101, -12326, -5023, 4063, 11499, 14632, 12353, 5635, -3027, -10457, -14043, -12562, -6590, 1695, 9352, 13631, 13025, 7723, -406, -8440, -13471, -13657, -8831, -717, 7768, 13451, 14213, 9724, 1578, -7201, -13365, -14568, -10359, -2280, 6658, 13110, 14689, 10815, 2953, -5977, -12635, -14577, -11118, -3605, 5179, 11967, 14301, 11406, 4379, -4147, -11086, -13940, -11741, -5335, 2966, 10165, 13713, 12324, 6507, -1704, -9346, -13664, -13019, -7599, 706, 8843, 13808, 13698, 8484, 66, -8423, -13780, -14007, -8993, -620, 7955, 13546, 14065, 9376, 1276, -7230, -12958, -13898, -9700, -1991, 6383, 12374, 13792, 10191, 2902, -5389, -11676, -13681, -10699, -3819, 4449, 11104, 13744, 11380, 4868, -3477, -10595, -13874, -12065, -5786, 2712, 10300, 14131, 12731, 6568, -2108, -10022, -14220, -13076, -7021, 1659, 9694, 14061, 13160, 7375, -1091, -9052, -13563, -13041, -7743, 337, 8182, 12976, 13007, 8325, 668, -7186, -12422, -13144, -9107, -1762, 6254, 12041, 13471, 9994, 2813, -5479, -11812, -13868, -10799, -3701, 4843, 11653, 14174, 11441, 4437, -4250, -11350, -14240, -11824, -5021, 3601, 10847, 14026, 12030, 5625, -2760, -10046, -13582, -12165, -6352, 1680, 9030, 13073, 12409, 7314, -396, -7968, -12694, -12870, -8399, -837, 7115, 12561, 13458, 9417, 1831, -6505, -12506, -13885, -10091, -2518, 6033, 12340, 14051, 10542, 3129, -5412, -11891, -13943, -10829, -3742, 4671, 11322, 13755, 11130, 4446, -3821, -10607, -13456, -11359, -5143, 2897, 9827, 13153, 11701, 6026, -1812, -8976, -12913, -12194, -7023, 744, 8318, 12931, 12844, 8015, 154, -7848, -12988, -13340, -8709, -818, 7394, 12854, 13529, 9204, 1503, -6697, -12380, -13474, -9659, -2353, 5745, 11700, 13374, 10190, 3356, -4660, -10946, -13231, -10754, -4404, 3510, 10127, 13096, 11347, 5521, -2301, -9297, -12984, -12006, -6680, 1107, 8573, 12975, 12698, 7749, -93, -7992, -13016, -13253, -8589, -712, 7444, 12836, 13466, 9107, 1420, -6725, -12325, -13373, -9539, -2325, 5650, 11475, 13115, 10032, 3388, -4419, -10590, -12957, -10697, -4611, 3124, 9739, 12874, 11380, 5766, -1958, -9032, -12874, -12070, -6869, 879, 8377, 12875, 12680, 7808, 28, -7843, -12859, -13140, -8539, -762, 7293, 12643, 13280, 9009, 1450, -6567, -12076, -13127, -9396, -2335, 5498, 11230, 12884, 9925, 3444, -4209, -10336, -12760, -10640, -4699, 2934, 9547, 12778, 11392, 5889, -1826, -8940, -12855, -12121, -6931, 853, 8377, 12864, 12628, 7731, -60, -7828, -12726, -12922, -8357, -743, 7105, 12296, 12955, 8879, 1616, -6165, -11636, -12858, -9442, -2658, 5030, 10863, 12760, 10080, 3794, -3846, -10105, -12748, -10805, -4960, 2706, 9443, 12792, 11523, 6023, -1715, -8895, -12868, -12138, -6931, 873, 8381, 12826, 12528, 7591, -139, -7812, -12580, -12693, -8168, -672, 6986, 12061, 12675, 8711, 1609, -6009, -11411, -12641, -9334, -2683, 4888, 10642, 12557, 9949, 3773, -3750, -9937, -12551, -10670, -4927, 2639, 9286, 12623, 11374, 5932, -1756, -8888, -12793, -11988, -6706, 1115, 8543, 12799, 12254, 7142, -615, -8093, -12526, -12284, -7529, -77, 7327, 11950, 12203, 8018, 964, -6379, -11352, -12211, -8661, -2000, 5361, 10766, 12276, 9354, 3043, -4381, -10237, -12420, -10098, -4106, 3426, 9773, 12600, 10818, 5026, -2666, -9466, -12784, -11383, -5730, 2062, 9097, 12751, 11666, 6264, -1413, -8512, -12418, -11747, -6802, 565, 7653, 11928, 11850, 7501, 461, -6715, -11452, -12040, -8275, -1509, 5809, 11034, 12253, 9022, 2488, -4971, -10640, -12476, -9740, -3415, 4228, 10364, 12729, 10395, 4159, -3673, -10195, -12922, -10826, -4655, 3261, 9945, 12876, 10983, 5021, -2764, -9426, -12544, -11018, -5475, 1989, 8637, 12096, 11135, 6165, -1012, -7789, -11733, -11424, -6970, 7, 7005, 11469, 11762, 7764, 900, -6334, -11286, -12117, -8487, -1693, 5783, 11169, 12429, 9062, 2289, -5371, -11054, -12594, -9423, -2721, 4965, 10758, 12499, 9595, 3153, -4387, -10236, -12276, -9803, -3786, 3562, 9568, 12060, 10152, 4569, -2691, -8969, -11985, -10638, -5390, 1845, 8437, 11950, 11090, 6129, -1127, -8005, -11961, -11511, -6805, 470, 7607, 11952, 11846, 7306, 17, -7301, -11883, -12016, -7646, -434, 6908, 11620, 11976, 7897, 918, -6304, -11136, -11841, -8212, -1629, 5494, 10570, 11777, 8704, 2470, -4649, -10088, -11858, -9329, -3361, 3853, 9718, 12034, 9928, 4108, -3274, -9513, -12252, -10435, -4719, 2809, 9303, 12337, 10737, 5116, -2434, -9037, -12245, -10872, -5468, 1925, 8542, 11940, 10910, 5892, -1247, -7855, -11557, -11026, -6500, 346, 7053, 11173, 11242, 7230, 595, -6284, -10898, -11573, -8025, -1509, 5608, 10722, 11917, 8706, 2230, -5145, -10656, -12221, -9217, -2738, 4786, 10508, 12278, 9427, 3045, -4435, -10215, -12127, -9525, -3410, 3893, 9676, 11831, 9617, 3916, -3195, -9082, -11635, -9928, -4610, 2401, 8521, 11542, 10317, 5300, -1707, -8098, -11547, -10731, -5951, 1050, 7691, 11487, 11045, 6481, -497, -7328, -11449, -11336, -7001, -46, 6942, 11355, 11522, 7378, 471, -6596, -11177, -11572, -7657, -928, 6086, 10769, 11452, 7916, 1506, -5387, -10272, -11402, -8392, -2356, 4529, 9774, 11472, 9005, 3213, -3802, -9472, -11712, -9632, -3976, 3210, 9263, 11900, 10108, 4529, -2777, -9053, -11947, -10381, -4941, 2352, 8723, 11833, 10509, 5280, -1868, -8278, -11579, -10573, -5678, 1252, 7680, 11233, 10656, 6189, -514, -7016, -10939, -10866, -6831, -281, 6393, 10742, 11171, 7488, 994, -5894, -10658, -11485, -8031, -1580, 5499, 10550, 11685, 8450, 2058, -5112, -10375, -11747, -8729, -2462, 4710, 10110, 11723, 8964, 2876, -4246, -9732, -11577, -9126, -3338, 3622, 9199, 11369, 9390, 3999, -2806, -8579, -11235, -9798, -4824, 1959, 8056, 11266, 10373, 5653, -1210, -7684, -11368, -10828, -6259, 689, 7408, 11383, 11103, 6681, -223, -7022, -11181, -11153, -6983, -234, 6552, 10869, 11129, 7272, 766, -5971, -10447, -11035, -7553, -1336, 5334, 9991, 10974, 7962, 2062, -4555, -9501, -10979, -8467, -2849, 3845, 9180, 11191, 9102, 3633, -3236, -8958, -11406, -9599, -4181, 2849, 8852, 11559, 9949, 4626, -2426, -8545, -11448, -10062, -4937, 1992, 8153, 11245, 10186, 5382, -1353, -7522, -10900, -10243, -5843, 656, 6907, 10606, 10456, 6490, 179, -6212, -10349, -10726, -7180, -965, 5655, 10259, 11124, 7873, 1672, -5197, -10188, -11384, -8318, -2096, 4922, 10124, 11514, 8589, 2473, -4524, -9771, -11334, -8668, -2828, 4000, 9298, 11117, 8865, 3397, -3249, -8670, -10902, -9158, -4068, 2505, 8174, 10867, 9608, 4823, -1748, -7704, -10875, -10032, -5503, 1103, 7335, 10894, 10445, 6133, -480, -6918, -10822, -10711, -6631, -84, 6486, 10659, 10871, 7059, 655, -5966, -10360, -10918, -7442, -1265, 5341, 9939, 10867, 7827, 1948, -4606, -9463, -10862, -8305, -2730, 3828, 8996, 10897, 8840, 3556, -3039, -8576, -11002, -9410, -4340, 2366, 8253, 11128, 9900, 4985, -1812, -7962, -11165, -10202, -5447, 1339, 7591, 10995, 10291, 5790, -814, -7043, -10631, -10257, -6152, 153, 6353, 10178, 10281, 6645, 609, -5621, -9821, -10449, -7267, -1417, 4993, 9609, 10723, 7869, 2070, -4574, -9557, -11034, -8387, -2587, 4213, 9455, 11155, 8662, 2910, -3921, -9267, -11127, -8832, -3275, 3447, 8828, 10896, 8920, 3675, -2873, -8308, -10661, -9105, -4247, 2140, 7704, 10441, 9361, 4856, -1421, -7202, -10356, -9755, -5557, 704, 6744, 10327, 10109, 6139, -150, -6431, -10375, -10461, -6656, -330, 6128, 10322, 10638, 6976, 686, -5856, -10185, -10702, -7234, -1082, 5427, 9873, 10606, 7408, 1497, -4934, -9485, -10519, -7676, -2043, 4314, 9045, 10440, 8002, 2642, -3717, -8713, -10540, -8489, -3298, 3145, 8465, 10677, 8936, 3828, -2740, -8348, -10864, -9328, -4299, 2349, 8113, 10844, 9506, 4629, -1963, -7784, -10709, -9637, -5028, 1411, 7267, 10408, 9706, 5461, -759, -6661, -10097, -9843, -5999, -5, 5982, 9787, 10047, 6632, 803, -5359, -9606, -10373, -7323, -1553, 4866, 9533, 10697, 7893, 2118, -4484, -9447, -10898, -8272, -2577, 4066, 9178, 10869, 8548, 3072, -3501, -8746, -10752, -8817, -3658, 2813, 8214, 10601, 9095, 4257, -2112, -7689, -10425, -9347, -4860, 1365, 7082, 10191, 9593, 5503, -601, -6494, -10040, -9948, -6194, -159, 5997, 9967, 10292, 6788, 732, -5645, -9943, -10551, -7210, -1170, 5291, 9754, 10552, 7426, 1566, -4818, -9353, -10412, -7627, -2106, 4129, 8780, 10203, 7903, 2772, -3343, -8231, -10120, -8346, -3549, 2560, 7763, 10160, 8847, 4262, -1947, -7479, -10294, -9313, -4862, 1419, 7214, 10330, 9617, 5308, -979, -6910, -10284, -9838, -5763, 445, 6474, 10094, 9984, 6170, 93, -6009, -9875, -10085, -6574, -660, 5456, 9523, 10068, 6926, 1275, -4792, -9083, -10044, -7362, -2017, 4052, 8639, 10123, 7907, 2799, -3391, -8407, -10358, -8488, -3439, 2948, 8275, 10533, 8853, 3858, -2594, -8063, -10498, -9023, -4203, 2122, 7611, 10259, 9121, 4651, -1485, -7035, -9991, -9292, -5207, 763, 6444, 9756, 9496, 5769, -50, -5852, -9509, -9699, -6325, -647, 5287, 9294, 9915, 6887, 1320, -4765, -9127, -10125, -7389, -1893, 4313, 8926, 10246, 7766, 2395, -3851, -8654, -10242, -8057, -2906, 3277, 8219, 10138, 8331, 3490, -2595, -7715, -9995, -8629, -4125, 1870, 7166, 9855, 8956, 4782, -1144, -6662, -9764, -9303, -5429, 458, 6214, 9701, 9632, 5998, 139, -5819, -9622, -9881, -6489, -673, 5374, 9437, 9992, 6881, 1231, -4857, -9132, -10040, -7278, -1849, 4224, 8737, 10040, 7671, 2517, -3539, -8276, -9987, -8063, -3228, 2759, 7732, 9888, 8460, 3978, -1950, -7177, -9811, -8889, -4721, 1192, 6695, 9806, 9329, 5419, -511, -6292, -9743, -9619, -5906, -21, 5882, 9599, 9766, 6339, 597, -5319, -9250, -9761, -6711, -1242, 4637, 8793, 9732, 7167, 2026, -3822, -8264, -9703, -7640, -2806, 3054, 7827, 9779, 8188, 3596, -2332, -7446, -9839, -8622, -4204, 1808, 7188, 9923, 8991, 4718, -1336, -6875, -9849, -9139, -5014, 972, 6576, 9725, 9250, 5370, -472, -6099, -9423, -9248, -5672, -32, 5590, 9124, 9316, 6110, 675, -4980, -8801, -9405, -6565, -1310, 4456, 8592, 9615, 7086, 1929, -3981, -8439, -9779, -7488, -2375, 3652, 8367, 9952, 7828, 2743, -3342, -8184, -9946, -7992, -3047, 2999, 7906, 9860, 8156, 3449, -2512, -7499, -9719, -8343, -3914, 1963, 7114, 9625, 8619, 4415, -1412, -6711, -9538, -8822, -4860, 901, 6322, 9410, 9013, 5306, -356, -5901, -9269, -9221, -5769, -162, 5518, 9177, 9431, 6166, 581, -5239, -9106, -9570, -6468, -950, 4891, 8883, 9540, 6675, 1364, -4402, -8503, -9469, -6979, -1965, 3733, 8058, 9439, 7410, 2686, -3021, -7644, -9500, -7910, -3422, 2353, 7310, 9631, 8405, 4082, -1798, -7045, -9715, -8785, -4572, 1357, 6800, 9697, 8985, 4929, -939, -6430, -9488, -9030, -5235, 434, 5904, 9154, 9048, 5653, 232, -5230, -8778, -9113, -6163, -949, 4610, 8516, 9320, 6718, 1661, -4046, -8272, -9485, -7184, -2216, 3582, 8080, 9595, 7562, 2724, -3156, -7856, -9656, -7864, -3121, 2790, 7665, 9671, 8058, 3446, -2446, -7399, -9558, -8148, -3715, 2055, 7025, 9350, 8205, 4068, -1544, -6549, -9134, -8380, -4565, 918, 6064, 8999, 8638, 5089, -363, -5710, -8981, -8948, -5582, -131, 5403, 8937, 9138, 5921, 474, -5165, -8888, -9309, -6256, -872, 4815, 8687, 9315, 6447, 1205, -4474, -8471, -9312, -6729, -1690, 3932, 8068, 9203, 6969, 2187, -3393, -7707, -9224, -7382, -2854, 2706, 7289, 9197, 7746, 3434, -2153, -6993, -9275, -8156, -4030, 1610, 6661, 9252, 8415, 4430, -1215, -6413, -9231, -8600, -4780, 809, 6073, 9048, 8647, 5023, -423, -5696, -8821, -8697, -5363, -83, 5211, 8568, 8771, 5747, 609, -4768, -8406, -8960, -6222, -1184, 4311, 8237, 9137, 6655, 1693, -3908, -8104, -9310, -7074, -2202, 3497, 7932, 9414, 7410, 2640, -3122, -7738, -9472, -7670, -3014, 2748, 7463, 9386, 7824, 3359, -2287, -7048, -9174, -7909, -3784, 1699, 6511, 8939, 8111, 4343, -1000, -5982, -8795, -8405, -4930, 380, 5586, 8762, 8710, 5423, 123, -5251, -8693, -8900, -5808, -562, 4900, 8543, 9016, 6142, 987, -4539, -8371, -9092, -6432, -1387, 4156, 8143, 9074, 6639, 1759, -3735, -7808, -8987, -6872, -2264, 3137, 7365, 8905, 7219, 2903, -2471, -6985, -8972, -7709, -3597, 1861, 6678, 9049, 8097, 4124, -1388, -6420, -9073, -8367, -4577, 871, 5995, 8881, 8492, 4991, -338, -5534, -8676, -8647, -5440, -260, 5012, 8407, 8714, 5814, 797, -4479, -8089, -8732, -6200, -1441, 3811, 7688, 8753, 6687, 2170, -3122, -7339, -8907, -7241, -2907, 2546, 7096, 9075, 7698, 3473, -2075, -6878, -9136, -8021, -3930, 1611, 6531, 9045, 8215, 4350, -1103, -6140, -8899, -8357, -4747, 613, 5713, 8690, 8456, 5114, -71, -5193, -8365, -8465, -5475, -518, 4593, 8043, 8567, 5986, 1231, -4001, -7805, -8779, -6530, -1837, 3583, 7718, 9007, 6945, 2249, -3273, -7575, -9027, -7108, -2530, 2942, 7282, 8896, 7204, 2887, -2450, -6830, -8666, -7318, -3290, 1932, 6423, 8553, 7531, 3754, -1397, -6031, -8441, -7733, -4176, 920, 5703, 8389, 8005, 4654, -430, -5379, -8369, -8259, -5081, 0, 5115, 8361, 8479, 5456, 380, -4823, -8224, -8558, -5719, -780, 4427, 7969, 8562, 6018, 1279, -3904, -7638, -8574, -6382, -1874, 3331, 7312, 8615, 6781, 2449, -2796, -7027, -8683, -7154, -2993, 2257, 6694, 8680, 7483, 3552, -1703, -6332, -8654, -7804, -4088, 1122, 5930, 8567, 8068, 4603, -561, -5516, -8448, -8263, -5043, 19, 5059, 8232, 8382, 5459, 564, -4529, -7955, -8445, -5855, -1130, 3990, 7679, 8541, 6302, 1754, -3441, -7375, -8622, -6705, -2315, 2934, 7132, 8710, 7087, 2859, -2423, -6811, -8678, -7354, -3315, 1940, 6473, 8631, 7599, 3806, -1397, -6054, -8467, -7762, -4208, 901, 5652, 8323, 7916, 4611, -372, -5185, -8072, -7960, -4934, -93, 4754, 7845, 8072, 5347, 685, -4221, -7598, -8175, -5761, -1208, 3824, 7493, 8426, 6252, 1726, -3469, -7413, -8604, -6572, -2069, 3225, 7311, 8670, 6789, 2403, -2850, -6995, -8533, -6927, -2784, 2320, 6571, 8382, 7155, 3313, -1696, -6094, -8261, -7423, -3846, 1135, 5717, 8205, 7689, 4349, -590, -5317, -8081, -7880, -4773, 80, 4914, 7949, 8049, 5204, 437, -4495, -7769, -8176, -5562, -901, 4103, 7591, 8261, 5871, 1333, -3693, -7333, -8258, -6138, -1756, 3263, 7051, 8233, 6372, 2154, -2841, -6788, -8229, -6626, -2581, 2415, 6506, 8178, 6825, 2947, -2026, -6247, -8177, -7094, -3398, 1575, 5963, 8166, 7343, 3797, -1179, -5748, -8207, -7616, -4211, 772, 5477, 8152, 7795, 4536, -398, -5180, -8016, -7897, -4861, -53, 4728, 7766, 7933, 5203, 579, -4242, -7496, -8019, -5613, -1150, 3736, 7239, 8095, 5983, 1662, -3279, -7029, -8192, -6338, -2149, 2841, 6786, 8223, 6631, 2583, -2413, -6521, -8224, -6891, -3026, 1955, 6203, 8160, 7092, 3418, -1508, -5849, -8026, -7254, -3823, 989, 5420, 7840, 7383, 4251, -437, -4971, -7677, -7604, -4738, -132, 4531, 7553, 7814, 5180, 631, -4188, -7482, -8012, -5587, -1083, 3817, 7309, 8104, 5890, 1504, -3430, -7101, -8130, -6208, -1988, 2920, 6755, 8100, 6482, 2493, -2389, -6381, -8028, -6754, -3028, 1774, 5919, 7900, 7004, 3577, -1154, -5463, -7784, -7267, -4120, 555, 5028, 7677, 7510, 4615, 5, -4619, -7567, -7741, -5076, -542, 4204, 7412, 7890, 5461, 1017, -3820, -7246, -8003, -5814, -1490, 3373, 6981, 7999, 6067, 1921, -2905, -6648, -7952, -6363, -2461, 2309, 6213, 7848, 6628, 2980, -1762, -5879, -7858, -6980, -3525, 1239, 5553, 7829, 7216, 3917, -842, -5302, -7793, -7422, -4299, 394, 4926, 7628, 7505, 4620, 36, -4548, -7460, -7623, -5002, -559, 4083, 7226, 7702, 5368, 1066, -3628, -6991, -7767, -5724, -1575, 3145, 6715, 7827, 6064, 2080, -2661, -6430, -7843, -6381, -2588, 2169, 6134, 7853, 6699, 3079, -1674, -5812, -7819, -6949, -3532, 1190, 5474, 7739, 7170, 3975, -654, -5032, -7548, -7301, -4393, 93, 4530, 7301, 7407, 4851, 557, -3930, -6966, -7488, -5305, -1209, 3326, 6665, 7609, 5802, 1878, -2748, -6398, -7727, -6213, -2405, 2318, 6213, 7827, 6555, 2850, -1914, -5963, -7797, -6732, -3192, 1513, 5632, 7669, 6897, 3616, -954, -5152, -7451, -7045, -4079, 343, 4660, 7274, 7269, 4636, 323, -4104, -7052, -7449, -5144, -955, 3585, 6828, 7617, 5645, 1614, -3006, -6551, -7712, -6076, -2208, 2473, 6270, 7789, 6461, 2754, -1963, -5950, -7750, -6680, -3175, 1483, 5566, 7608, 6846, 3615, -912, -5069, -7355, -6964, -4050, 331, 4576, 7141, 7113, 4488, 222, -4130, -6981, -7263, -4862, -675, 3778, 6834, 7370, 5175, 1054, -3466, -6700, -7467, -5434, -1405, 3167, 6547, 7499, 5652, 1697, -2884, -6400, -7530, -5873, -2033, 2538, 6151, 7476, 6044, 2383, -2124, -5828, -7388, -6247, -2848, 1567, 5387, 7251, 6490, 3398, -930, -4932, -7181, -6835, -4014, 293, 4525, 7145, 7165, 4533, 196, -4245, -7127, -7360, -4851, -554, 3929, 6925, 7361, 5072, 941, -3486, -6623, -7305, -5341, -1424, 2993, 6323, 7332, 5678, 1919, -2549, -6081, -7386, -5926, -2297, 2194, 5858, 7347, 6129, 2659, -1754, -5520, -7229, -6297, -3076, 1282, 5179, 7201, 6594, 3544, -837, -4962, -7262, -6862, -3885, 571, 4824, 7282, 6996, 4087, -320, -4583, -7097, -6968, -4269, -18, 4188, 6836, 6972, 4572, 526, -3702, -6582, -7063, -4972, -1061, 3256, 6384, 7183, 5334, 1500, -2882, -6221, -7254, -5617, -1910, 2492, 5971, 7244, 5849, 2314, -2083, -5705, -7245, -6102, -2740, 1673, 5458, 7243, 6344, 3089, -1338, -5247, -7215, -6506, -3386, 985, 4957, 7087, 6595, 3682, -552, -4569, -6899, -6736, -4109, 7, 4120, 6744, 6917, 4553, 507, -3742, -6645, -7115, -4955, -968, 3371, 6470, 7187, 5247, 1373, -2993, -6262, -7223, -5545, -1834, 2549, 5982, 7211, 5787, 2232, -2126, -5693, -7173, -6016, -2657, 1643, 5313, 7027, 6184, 3097, -1101, -4875, -6887, -6412, -3630, 490, 4428, 6780, 6666, 4136, 80, -4033, -6675, -6875, -4546, -536, 3685, 6549, 7001, 4883, 973, -3278, -6314, -7010, -5125, -1367, 2895, 6081, 7030, 5408, 1803, -2455, -5777, -6978, -5590, -2180, 2039, 5499, 6950, 5849, 2644, -1535, -5158, -6902, -6120, -3090, 1109, 4913, 6935, 6400, 3502, -711, -4661, -6890, -6558, -3787, 380, 4402, 6776, 6643, 4079, 16, -4039, -6589, -6717, -4367, -432, 3675, 6424, 6817, 4685, 819, -3340, -6270, -6871, -4945, -1192, 2968, 6029, 6861, 5173, 1608, -2543, -5750, -6875, -5482, -2093, 2071, 5492, 6917, 5788, 2526, -1691, -5311, -6954, -6043, -2882, 1337, 5049, 6881, 6145, 3154, -1010, -4766, -6782, -6282, -3478, 579, 4406, 6590, 6333, 3762, -204, -4065, -6431, -6434, -4105, -290, 3599, 6161, 6485, 4460, 807, -3143, -5983, -6672, -4935, -1413, 2678, 5805, 6828, 5340, 1861, -2334, -5683, -6941, -5637, -2261, 1938, 5387, 6849, 5780, 2611, -1487, -5004, -6711, -5967, -3085, 895, 4540, 6542, 6178, 3580, -309, -4093, -6403, -6403, -4094, -287, 3627, 6249, 6623, 4597, 896, -3165, -6102, -6826, -5073, -1440, 2736, 5925, 6965, 5422, 1909, -2325, -5680, -6943, -5658, -2318, 1836, 5282, 6772, 5813, 2767, -1223, -4748, -6529, -5973, -3289, 566, 4215, 6360, 6231, 3854, 87, -3734, -6212, -6437, -4327, -632, 3318, 6071, 6616, 4747, 1155, -2878, -5857, -6702, -5109, -1644, 2438, 5629, 6777, 5435, 2103, -2020, -5400, -6792, -5680, -2467, 1616, 5120, 6700, 5802, 2787, -1238, -4766, -6535, -5923, -3163, 702, 4280, 6300, 6034, 3578, -175, -3878, -6184, -6265, -4059, -370, 3472, 6061, 6428, 4443, 798, -3147, -5942, -6571, -4782, -1248, 2740, 5715, 6591, 5036, 1662, -2334, -5465, -6589, -5320, -2097, 1874, 5142, 6515, 5501, 2479, -1437, -4814, -6424, -5690, -2881, 964, 4427, 6279, 5826, 3262, -478, -4046, -6143, -6017, -3698, -20, 3678, 6050, 6235, 4122, 495, -3346, -5978, -6408, -4463, -870, 3060, 5860, 6499, 4744, 1248, -2679, -5610, -6461, -4944, -1639, 2252, 5301, 6423, 5209, 2101, -1753, -4966, -6350, -5421, -2497, 1316, 4668, 6316, 5655, 2954, -828, -4289, -6192, -5838, -3367, 345, 3951, 6132, 6099, 3828, 152, -3590, -6016, -6232, -4154, -535, 3279, 5883, 6338, 4473, 1009, -2797, -5563, -6297, -4729, -1477, 2312, 5257, 6303, 5088, 2023, -1759, -4910, -6262, -5350, -2476, 1286, 4572, 6206, 5600, 2971, -706, -4127, -6055, -5810, -3476, 142, 3707, 5976, 6098, 3994, 433, -3339, -5900, -6318, -4398, -865, 2995, 5740, 6351, 4655, 1247, -2553, -5399, -6255, -4866, -1746, 1948, 4931, 6122, 5137, 2317, -1328, -4517, -6085, -5483, -2891, 759, 4136, 6043, 5740, 3363, -259, -3793, -5954, -5954, -3815, -273, 3368, 5798, 6124, 4224, 773, -2955, -5632, -6235, -4580, -1256, 2499, 5343, 6221, 4852, 1746, -1972, -4958, -6144, -5131, -2295, 1365, 4532, 6071, 5422, 2822, -824, -4174, -6012, -5670, -3259, 341, 3816, 5891, 5815, 3627, 125, -3418, -5723, -5953, -4015, -609, 3038, 5595, 6113, 4383, 1020, -2734, -5488, -6190, -4602, -1306, 2451, 5265, 6114, 4703, 1608, -2026, -4868, -5916, -4833, -2034, 1460, 4418, 5793, 5101, 2577, -878, -4044, -5771, -5417, -3076, 411, 3800, 5815, 5711, 3490, -43, -3576, -5805, -5899, -3787, -288, 3323, 5718, 5992, 4075, 675, -2962, -5482, -5986, -4315, -1076, 2531, 5208, 5989, 4613, 1577, -2007, -4854, -5936, -4873, -2059, 1501, 4512, 5896, 5148, 2544, -968, -4140, -5821, -5389, -3018, 453, 3769, 5742, 5636, 3485, 50, -3424, -5671, -5854, -3886, -490, 3118, 5569, 5977, 4180, 858, -2769, -5341, -5944, -4389, -1251, 2287, 4965, 5832, 4608, 1752, -1702, -4547, -5761, -4933, -2344, 1106, 4182, 5767, 5273, 2868, -599, -3885, -5774, -5565, -3303, 188, 3618, 5741, 5754, 3671, 223, -3278, -5591, -5858, -3987, -672, 2903, 5397, 5938, 4321, 1163, -2427, -5116, -5953, -4629, -1643, 1936, 4812, 5949, 4937, 2156, -1395, -4433, -5863, -5182, -2631, 883, 4073, 5788, 5418, 3081, -359, -3678, -5645, -5551, -3425, -63, 3338, 5520, 5683, 3780, 500, -2958, -5318, -5728, -4037, -861, 2616, 5140, 5779, 4311, 1284, -2193, -4858, -5735, -4523, -1656, 1796, 4604, 5743, 4807, 2132, -1321, -4278, -5696, -5022, -2501, 936, 4052, 5686, 5251, 2898, -514, -3733, -5584, -5395, -3229, 117, 3436, 5510, 5587, 3623, 317, -3115, -5412, -5734, -3915, -661, 2867, 5320, 5815, 4145, 958, -2561, -5108, -5744, -4284, -1275, 2168, 4782, 5635, 4440, 1648, -1711, -4442, -5550, -4658, -2088, 1238, 4112, 5492, 4871, 2476, -856, -3886, -5499, -5107, -2826, 519, 3680, 5483, 5263, 3071, -266, -3521, -5463, -5380, -3299, -4, 3278, 5323, 5411, 3508, 314, -2961, -5163, -5465, -3794, -748, 2564, 4937, 5519, 4085, 1176, -2189, -4759, -5612, -4424, -1614, 1801, 4549, 5652, 4663, 1956, -1491, -4383, -5677, -4887, -2289, 1128, 4126, 5586, 4983, 2563, -790, -3847, -5478, -5099, -2878, 385, 3493, 5309, 5187, 3168, 7, -3157, -5168, -5288, -3490, -413, 2790, 4976, 5354, 3776, 818, -2425, -4805, -5429, -4071, -1228, 2077, 4633, 5494, 4332, 1569, -1780, -4490, -5551, -4553, -1884, 1483, 4300, 5528, 4702, 2149, -1194, -4096, -5488, -4863, -2455, 832, 3813, 5362, 4975, 2744, -448, -3485, -5247, -5093, -3121, -20, 3078, 5061, 5209, 3487, 485, -2709, -4934, -5372, -3857, -946, 2345, 4763, 5448, 4130, 1299, -2017, -4591, -5490, -4379, -1684, 1608, 4314, 5419, 4568, 2045, -1224, -4047, -5406, -4799, -2461, 768, 3713, 5299, 4943, 2800, -366, -3400, -5212, -5126, -3192, -118, 2999, 5024, 5235, 3531, 543, -2660, -4904, -5380, -3899, -977, 2291, 4736, 5438, 4139, 1315, -2003, -4576, -5459, -4342, -1631, 1670, 4329, 5391, 4461, 1916, -1324, -4058, -5307, -4628, -2266, 891, 3720, 5182, 4759, 2594, -510, -3432, -5112, -4938, -2962, 91, 3102, 4978, 5038, 3258, 267, -2811, -4884, -5178, -3584, -678, 2496, 4764, 5281, 3834, 950, -2318, -4726, -5378, -4022, -1178, 2087, 4543, 5296, 4077, 1366, -1802, -4284, -5187, -4214, -1745, 1330, 3908, 5075, 4424, 2170, -893, -3663, -5122, -4726, -2599, 486, 3410, 5076, 4892, 2917, -134, -3122, -4972, -4997, -3216, -287, 2747, 4774, 5080, 3541, 709, -2386, -4634, -5200, -3867, -1116, 2059, 4454, 5237, 4090, 1440, -1722, -4245, -5203, -4277, -1800, 1285, 3915, 5098, 4460, 2216, -820, -3568, -5040, -4709, -2688, 332, 3225, 4985, 4926, 3071, 80, -2952, -4912, -5069, -3364, -441, 2646, 4749, 5105, 3613, 812, -2257, -4496, -5098, -3853, -1226, 1853, 4236, 5091, 4088, 1615, -1458, -3974, -5053, -4294, -1989, 1019, 3657, 4964, 4498, 2416, -521, -3277, -4858, -4722, -2885, 19, 2943, 4830, 4977, 3297, 410, -2659, -4748, -5103, -3566, -730, 2358, 4577, 5109, 3799, 1132, -1910, -4241, -5035, -4010, -1552, 1462, 3960, 5050, 4332, 2049, -972, -3660, -5003, -4533, -2411, 604, 3402, 4972, 4736, 2801, -143, -3023, -4798, -4849, -3140, -296, 2660, 4660, 4990, 3525, 775, -2251, -4463, -5041, -3784, -1138, 1929, 4298, 5093, 4052, 1523, -1540, -4028, -5042, -4204, -1824, 1216, 3816, 5021, 4406, 2179, -822, -3501, -4902, -4499, -2464, 473, 3245, 4837, 4688, 2848, -23, -2873, -4692, -4789, -3133, -332, 2624, 4628, 4968, 3495, 756, -2264, -4451, -4998, -3696, -1035, 2036, 4347, 5078, 3948, 1386, -1667, -4063, -4970, -4025, -1619, 1357, 3838, 4924, 4231, 2040, -875, -3463, -4783, -4393, -2392, 488, 3223, 4802, 4656, 2811, -61, -2915, -4700, -4757, -3060, -237, 2682, 4619, 4873, 3367, 658, -2280, -4377, -4885, -3612, -1020, 1959, 4231, 4967, 3893, 1391, -1618, -4038, -4953, -4045, -1658, 1324, 3807, 4886, 4190, 1982, -924, -3487, -4786, -4338, -2341, 518, 3179, 4721, 4552, 2726, -85, -2875, -4634, -4686, -3045, -278, 2577, 4502, 4787, 3353, 696, -2195, -4284, -4820, -3606, -1099, 1825, 4077, 4854, 3872, 1488, -1431, -3830, -4825, -4059, -1838, 1046, 3538, 4751, 4244, 2209, -618, -3228, -4672, -4422, -2576, 209, 2926, 4579, 4578, 2891, 180, -2622, -4449, -4674, -3180, -566, 2264, 4245, 4707, 3440, 950, -1881, -4025, -4713, -3704, -1343, 1483, 3755, 4674, 3908, 1724, -1062, -3461, -4601, -4085, -2117, 628, 3137, 4541, 4307, 2534, -184, -2844, -4507, -4530, -2918, -196, 2613, 4493, 4713, 3213, 507, -2403, -4425, -4817, -3432, -787, 2152, 4270, 4811, 3580, 1040, -1855, -4053, -4736, -3690, -1314, 1514, 3752, 4618, 3809, 1631, -1118, -3450, -4541, -3993, -2005, 714, 3180, 4487, 4171, 2307, -413, -3013, -4519, -4369, -2598, 119, 2800, 4441, 4439, 2802, 115, -2595, -4356, -4532, -3035, -450, 2287, 4172, 4529, 3219, 726, -2024, -4036, -4562, -3438, -1059, 1680, 3796, 4494, 3550, 1318, -1393, -3590, -4493, -3766, -1696, 982, 3295, 4418, 3931, 1991, -701, -3166, -4488, -4183, -2335, 383, 2961, 4446, 4273, 2505, -183, -2804, -4388, -4364, -2758, -172, 2447, 4141, 4353, 2979, 524, -2117, -4024, -4482, -3335, -994, 1726, 3817, 4523, 3561, 1283, -1479, -3710, -4584, -3789, -1629, 1112, 3414, 4470, 3893, 1917, -742, -3137, -4411, -4106, -2331, 289, 2798, 4309, 4251, 2641, 61, -2543, -4224, -4384, -2957, -468, 2181, 4019, 4407, 3205, 843, -1815, -3816, -4435, -3464, -1244, 1424, 3574, 4440, 3694, 1602, -1051, -3350, -4427, -3898, -1965, 691, 3104, 4400, 4088, 2294, -351, -2871, -4348, -4241, -2588, 11, 2592, 4235, 4314, 2853, 356, -2266, -4059, -4403, -3154, -790, 1869, 3851, 4448, 3446, 1194, -1507, -3669, -4507, -3707, -1558, 1142, 3416, 4446, 3863, 1878, -769, -3135, -4363, -4036, -2242, 341, 2814, 4281, 4194, 2585, 24, -2553, -4200, -4329, -2866, -369, 2265, 4049, 4342, 3065, 684, -1928, -3825, -4341, -3295, -1085, 1495, 3532, 4292, 3519, 1465, -1114, -3298, -4294, -3743, -1846, 707, 3001, 4190, 3885, 2154, -335, -2704, -4118, -4039, -2546, -92, 2381, 4018, 4195, 2843, 430, -2178, -3994, -4343, -3097, -706, 1933, 3851, 4326, 3229, 959, -1636, -3615, -4274, -3389, -1301, 1246, 3324, 4218, 3582, 1661, -863, -3075, -4174, -3752, -1962, 532, 2832, 4104, 3891, 2256, -174, -2557, -3997, -3989, -2533, -131, 2328, 3968, 4150, 2825, 443, -2114, -3884, -4217, -2977, -645, 1933, 3785, 4250, 3177, 951, -1595, -3547, -4193, -3328, -1252, 1280, 3362, 4226, 3576, 1626, -901, -3113, -4185, -3736, -1908, 596, 2907, 4159, 3919, 2255, -207, -2590, -4028, -4009, -2529, -126, 2333, 3956, 4146, 2845, 508, -2020, -3816, -4227, -3103, -832, 1744, 3696, 4301, 3348, 1178, -1403, -3466, -4255, -3501, -1480, 1068, 3217, 4210, 3686, 1852, -638, -2890, -4103, -3838, -2199, 245, 2616, 4065, 4041, 2545, 115, -2366, -3978, -4138, -2771, -390, 2131, 3862, 4177, 2980, 702, -1798, -3637, -4155, -3187, -1065, 1410, 3389, 4143, 3419, 1462, -1011, -3129, -4109, -3625, -1831, 611, 2839, 4054, 3800, 2197, -208, -2522, -3938, -3924, -2497, -172, 2217, 3811, 4035, 2795, 549, -1909, -3669, -4099, -3026, -841, 1664, 3551, 4153, 3229, 1132, -1374, -3355, -4104, -3353, -1375, 1091, 3154, 4080, 3529, 1701, -724, -2898, -4017, -3685, -2007, 425, 2709, 4032, 3881, 2323, -105, -2496, -3960, -3964, -2491, -113, 2322, 3882, 4020, 2683, 390, -2032, -3686, -3978, -2829, -657, 1750, 3517, 4012, 3042, 986, -1435, -3329, -4004, -3210, -1238, 1196, 3195, 4036, 3389, 1502, -931, -3005, -3966, -3466, -1700, 678, 2809, 3895, 3579, 1947, -369, -2560, -3819, -3691, -2211, 79, 2346, 3761, 3809, 2456, 189, -2160, -3731, -3917, -2667, -414, 1972, 3647, 3969, 2823, 659, -1755, -3522, -3999, -3026, -962, 1440, 3319, 3987, 3215, 1272, -1119, -3126, -3994, -3431, -1630, 771, 2877, 3955, 3583, 1910, -459, -2667, -3908, -3730, -2223, 95, 2363, 3763, 3807, 2445, 200, -2138, -3709, -3922, -2711, -497, 1888, 3586, 3958, 2866, 709, -1706, -3494, -3987, -3012, -949, 1447, 3292, 3918, 3128, 1191, -1151, -3084, -3883, -3292, -1524, 797, 2831, 3848, 3468, 1845, -454, -2616, -3826, -3663, -2153, 150, 2413, 3810, 3811, 2421, 129, -2199, -3736, -3884, -2609, -380, 2001, 3632, 3928, 2777, 645, -1715, -3417, -3885, -2929, -941, 1388, 3189, 3854, 3137, 1304, -997, -2948, -3835, -3326, -1615, 696, 2766, 3842, 3520, 1914, -397, -2557, -3779, -3614, -2117, 160, 2373, 3731, 3719, 2351, 124, -2158, -3646, -3775, -2514, -311, 1994, 3572, 3824, 2675, 549, -1753, -3393, -3795, -2809, -801, 1470, 3219, 3797, 3005, 1121, -1179, -3060, -3841, -3220, -1427, 902, 2904, 3839, 3352, 1644, -683, -2741, -3796, -3460, -1867, 396, 2488, 3689, 3531, 2098, -109, -2272, -3634, -3658, -2344, -163, 2087, 3565, 3716, 2478, 322, -1948, -3478, -3730, -2606, -546, 1678, 3277, 3674, 2739, 837, -1383, -3091, -3706, -2971, -1155, 1083, 2941, 3732, 3168, 1413, -850, -2819, -3741, -3309, -1629, 630, 2663, 3711, 3394, 1847, -385, -2457, -3626, -3478, -2049, 113, 2244, 3547, 3562, 2273, 165, -1998, -3435, -3623, -2502, -469, 1744, 3338, 3709, 2749, 776, -1477, -3205, -3767, -2964, -1080, 1202, 3061, 3793, 3146, 1352, -923, -2858, -3749, -3292, -1630, 616, 2624, 3700, 3426, 1920, -272, -2355, -3580, -3505, -2161, -34, 2101, 3486, 3605, 2435, 405, -1754, -3275, -3622, -2670, -773, 1404, 3090, 3695, 2974, 1192, -1032, -2890, -3719, -3194, -1516, 742, 2720, 3722, 3371, 1810, -391, -2424, -3569, -3418, -2049, 39, 2108, 3433, 3530, 2375, 361, -1786, -3296, -3610, -2604, -651, 1562, 3193, 3665, 2778, 889, -1298, -2997, -3591, -2887, -1153, 969, 2746, 3539, 3071, 1515, -601, -2527, -3550, -3303, -1837, 324, 2387, 3584, 3467, 2056, -111, -2235, -3524, -3513, -2232, -153, 1949, 3331, 3507, 2428, 490, -1613, -3150, -3560, -2711, -878, 1264, 2983, 3630, 2972, 1236, -960, -2816, -3653, -3179, -1558, 629, 2578, 3616, 3346, 1883, -238, -2297, -3523, -3494, -2206, -123, 2037, 3463, 3643, 2477, 414, -1819, -3366, -3670, -2619, -618, 1574, 3165, 3573, 2675, 840, -1270, -2893, -3484, -2815, -1151, 917, 2663, 3467, 3023, 1472, -642, -2543, -3532, -3220, -1706, 466, 2469, 3576, 3342, 1877, -272, -2311, -3490, -3382, -2053, 19, 2068, 3369, 3458, 2300, 329, -1762, -3221, -3525, -2563, -672, 1461, 3097, 3603, 2814, 990, -1179, -2924, -3606, -2986, -1300, 847, 2675, 3534, 3144, 1618, -454, -2382, -3460, -3307, -1972, 82, 2123, 3413, 3483, 2277, 243, -1903, -3346, -3568, -2484, -497, 1646, 3168, 3531, 2607, 740, -1370, -2968, -3490, -2753, -1041, 1040, 2737, 3431, 2874, 1265, -801, -2555, -3384, -2984, -1517, 485, 2280, 3253, 3055, 1753, -168, -2054, -3222, -3252, -2116, -213, 1795, 3175, 3399, 2380, 473, -1630, -3152, -3521, -2605, -742, 1363, 2966, 3467, 2725, 1002, -1059, -2736, -3432, -2907, -1365, 664, 2428, 3336, 3046, 1672, -284, -2170, -3276, -3230, -2012, -89, 1885, 3175, 3328, 2272, 374, -1666, -3124, -3454, -2529, -691, 1402, 2979, 3481, 2685, 934, -1169, -2835, -3459, -2839, -1185, 880, 2628, 3413, 2967, 1427, -605, -2418, -3352, -3061, -1672, 326, 2191, 3279, 3170, 1932, -17, -1973, -3210, -3285, -2158, -230, 1795, 3193, 3418, 2383, 465, -1632, -3112, -3445, -2497, -638, 1457, 3004, 3462, 2645, 887, -1193, -2818, -3414, -2775, -1110, 941, 2663, 3402, 2899, 1335, -712, -2492, -3356, -2982, -1506, 505, 2324, 3295, 3043, 1680, -296, -2149, -3219, -3084, -1822, 97, 1988, 3132, 3131, 1978, 104, -1804, -3070, -3195, -2168, -343, 1620, 2997, 3273, 2345, 539, -1480, -2960, -3355, -2498, -715, 1335, 2868, 3333, 2550, 846, -1132, -2680, -3241, -2631, -1081, 821, 2425, 3157, 2753, 1371, -507, -2240, -3163, -2964, -1666, 250, 2102, 3187, 3108, 1871, -55, -1974, -3174, -3202, -2060, -167, 1787, 3086, 3269, 2244, 400, -1597, -3018, -3349, -2438, -637, 1401, 2913, 3356, 2550, 823, -1188, -2741, -3287, -2647, -1064, 872, 2485, 3202, 2758, 1346, -565, -2279, -3177, -2937, -1615, 290, 2100, 3139, 3031, 1812, -58, -1901, -3039, -3075, -2011, -228, 1622, 2905, 3154, 2271, 565, -1349, -2804, -3245, -2514, -852, 1140, 2741, 3331, 2701, 1071, -946, -2602, -3293, -2778, -1261, 706, 2403, 3233, 2897, 1548, -361, -2143, -3159, -3041, -1809, 89, 1982, 3172, 3221, 2095, 192, -1807, -3141, -3314, -2260, -371, 1661, 3076, 3364, 2413, 598, -1422, -2896, -3290, -2500, -807, 1153, 2671, 3231, 2625, 1084, -822, -2429, -3145, -2746, -1338, 536, 2213, 3103, 2874, 1588, -265, -2020, -3039, -2954, -1797, 23, 1829, 2984, 3071, 2017, 237, -1643, -2935, -3152, -2217, -446, 1486, 2888, 3223, 2375, 654, -1295, -2757, -3190, -2455, -845, 1057, 2546, 3136, 2596, 1137, -704, -2309, -3094, -2769, -1448, 417, 2158, 3127, 2956, 1670, -237, -2066, -3111, -3006, -1779, 86, 1914, 3015, 3004, 1921, 155, -1636, -2832, -2996, -2088, -427, 1406, 2750, 3117, 2336, 704, -1224, -2684, -3173, -2473, -847, 1089, 2613, 3170, 2558, 1031, -842, -2391, -3078, -2637, -1271, 555, 2193, 3062, 2830, 1574, -261, -2028, -3050, -2965, -1777, 73, 1903, 3031, 3042, 1955, 180, -1644, -2852, -3030, -2126, -479, 1349, 2699, 3104, 2410, 852, -1029, -2538, -3132, -2583, -1083, 785, 2381, 3092, 2696, 1334, -460, -2068, -2917, -2727, -1591, 90, 1755, 2827, 2897, 1948, 295, -1479, -2745, -3009, -2162, -512, 1358, 2726, 3101, 2335, 709, -1146, -2577, -3052, -2426, -918, 921, 2424, 3070, 2602, 1194, -643, -2263, -3061, -2737, -1414, 445, 2147, 3053, 2849, 1584, -233, -1951, -2951, -2879, -1758, -18, 1712, 2811, 2894, 1933, 294, -1457, -2674, -2943, -2160, -618, 1135, 2493, 2949, 2374, 935, -846, -2366, -3043, -2652, -1295, 552, 2220, 3070, 2808, 1497, -380, -2103, -3067, -2900, -1693, 112, 1851, 2892, 2897, 1868, 181, -1572, -2775, -3001, -2145, -512, 1331, 2705, 3088, 2324, 692, -1208, -2667, -3120, -2427, -840, 1037, 2512, 3039, 2449, 974, -840, -2352, -3017, -2585, -1225, 580, 2189, 3011, 2715, 1416, -433, -2112, -3018, -2805, -1556, 267, 1976, 2963, 2829, 1659, -112, -1827, -2870, -2853, -1797, -80, 1652, 2777, 2879, 1930, 273, -1474, -2676, -2891, -2042, -460, 1299, 2566, 2904, 2178, 665, -1086, -2439, -2900, -2311, -863, 892, 2330, 2919, 2440, 1073, -683, -2187, -2889, -2537, -1269, 458, 2023, 2846, 2645, 1471, -231, -1852, -2805, -2733, -1664, 14, 1697, 2754, 2808, 1828, 189, -1529, -2667, -2847, -1979, -391, 1326, 2562, 2875, 2132, 626, -1134, -2482, -2948, -2342, -878, 924, 2393, 2996, 2497, 1073, -760, -2317, -3026, -2634, -1279, 541, 2160, 2977, 2710, 1459, -321, -1966, -2902, -2794, -1684, 40, 1741, 2837, 2875, 1874, 189, -1581, -2777, -2956, -2058, -405, 1378, 2645, 2926, 2149, 589, -1144, -2456, -2868, -2263, -884, 818, 2212, 2826, 2460, 1218, -475, -2031, -2881, -2700, -1520, 230, 1923, 2928, 2846, 1700, -86, -1832, -2882, -2871, -1796, -93, 1636, 2734, 2838, 1910, 305, -1400, -2594, -2864, -2081, -571, 1154, 2451, 2860, 2246, 806, -927, -2320, -2883, -2398, -1055, 688, 2193, 2904, 2575, 1305, -447, -2054, -2904, -2714, -1521, 230, 1910, 2900, 2820, 1700, -46, -1760, -2834, -2849, -1835, -128, 1606, 2750, 2889, 1966, 348, -1385, -2590, -2848, -2077, -554, 1165, 2455, 2860, 2254, 829, -882, -2287, -2869, -2423, -1095, 642, 2171, 2924, 2618, 1369, -398, -2027, -2933, -2775, -1593, 191, 1906, 2927, 2889, 1791, 42, -1730, -2860, -2942, -1960, -262, 1511, 2731, 2961, 2123, 525, -1252, -2571, -2967, -2295, -796, 991, 2424, 2994, 2475, 1069, -741, -2277, -2991, -2616, -1287, 505, 2108, 2936, 2696, 1480, -248, -1884, -2832, -2754, -1700, -44, 1617, 2688, 2801, 1892, 303, -1410, -2611, -2874, -2074, -550, 1175, 2442, 2825, 2162, 739, -947, -2286, -2786, -2304, -998, 646, 2058, 2742, 2427, 1244, -397, -1910, -2744, -2603, -1496, 145, 1745, 2707, 2691, 1693, 91, -1560, -2638, -2760, -1892, -327, 1333, 2524, 2807, 2074, 596, -1093, -2380, -2809, -2219, -845, 823, 2185, 2776, 2364, 1113, -544, -2003, -2766, -2532, -1388, 270, 1840, 2750, 2670, 1616, -8, -1637, -2676, -2719, -1799, -228, 1412, 2549, 2783, 2028, 561, -1110, -2383, -2816, -2227, -849, 866, 2263, 2860, 2420, 1110, -596, -2085, -2794, -2504, -1315, 328, 1840, 2700, 2597, 1582, 16, -1556, -2582, -2680, -1833, -306, 1337, 2516, 2785, 2049, 590, -1099, -2368, -2790, -2196, -832, 839, 2199, 2784, 2380, 1120, -526, -1991, -2756, -2522, -1379, 272, 1827, 2732, 2642, 1581, -53, -1660, -2649, -2646, -1695, -130, 1453, 2511, 2653, 1831, 372, -1221, -2365, -2662, -2002, -600, 1004, 2258, 2685, 2116, 774, -854, -2178, -2706, -2248, -967, 651, 2030, 2649, 2318, 1127, -461, -1889, -2626, -2428, -1358, 212, 1692, 2573, 2519, 1548, 1, -1528, -2526, -2604, -1751, -258, 1322, 2430, 2669, 1941, 499, -1129, -2371, -2757, -2142, -737, 963, 2327, 2840, 2308, 918, -808, -2244, -2828, -2379, -1050, 658, 2110, 2792, 2467, 1266, -379, -1874, -2686, -2512, -1439, 150, 1685, 2633, 2645, 1707, 175, -1435, -2520, -2695, -1890, -387, 1270, 2485, 2807, 2117, 649, -1050, -2369, -2810, -2233, -815, 910, 2305, 2857, 2360, 1019, -678, -2110, -2743, -2395, -1162, 460, 1912, 2672, 2478, 1410, -150, -1645, -2531, -2510, -1581, -102, 1424, 2426, 2565, 1780, 370, -1151, -2256, -2541, -1918, -605, 930, 2135, 2567, 2071, 819, -726, -2020, -2552, -2165, -980, 549, 1879, 2513, 2242, 1178, -312, -1686, -2479, -2373, -1425, 57, 1556, 2506, 2553, 1646, 114, -1493, -2550, -2662, -1764, -216, 1396, 2466, 2613, 1815, 385, -1155, -2272, -2572, -1983, -689, 846, 2113, 2632, 2204, 951, -667, -2077, -2714, -2351, -1105, 542, 1974, 2666, 2355, 1197, -369, -1785, -2535, -2378, -1394, 91, 1535, 2454, 2493, 1619, 158, -1400, -2447, -2606, -1784, -299, 1280, 2389, 2592, 1850, 451, -1096, -2230, -2560, -1968, -697, 834, 2069, 2586, 2160, 961, -623, -1999, -2667, -2366, -1163, 473, 1960, 2714, 2471, 1309, -339, -1845, -2654, -2505, -1427, 149, 1652, 2560, 2545, 1621, 127, -1394, -2418, -2585, -1814, -398, 1181, 2348, 2660, 2028, 644, -961, -2222, -2656, -2110, -793, 817, 2129, 2654, 2213, 967, -612, -1964, -2586, -2270, -1114, 440, 1850, 2579, 2376, 1295, -244, -1706, -2529, -2423, -1423, 89, 1589, 2498, 2503, 1585, 104, -1404, -2402, -2533, -1737, -311, 1231, 2325, 2576, 1896, 535, -1022, -2188, -2563, -2005, -749, 773, 1991, 2516, 2139, 1010, -468, -1811, -2512, -2333, -1316, 200, 1665, 2543, 2481, 1491, -57, -1586, -2528, -2521, -1599, -100, 1379, 2329, 2429, 1660, 338, -1072, -2086, -2383, -1851, -696, 714, 1889, 2419, 2089, 1007, -452, -1767, -2461, -2271, -1238, 234, 1642, 2446, 2384, 1453, -6, -1466, -2405, -2484, -1663, -231, 1309, 2384, 2594, 1854, 420, -1166, -2333, -2638, -1988, -608, 979, 2188, 2606, 2090, 824, -712, -1983, -2546, -2208, -1101, 403, 1768, 2507, 2364, 1361, -120, -1572, -2464, -2475, -1571, -109, 1399, 2388, 2513, 1718, 312, -1189, -2261, -2496, -1836, -529, 966, 2102, 2482, 1983, 790, -695, -1924, -2475, -2120, -1008, 468, 1787, 2461, 2250, 1221, -248, -1630, -2422, -2339, -1401, 42, 1472, 2371, 2417, 1569, 166, -1308, -2298, -2452, -1704, -332, 1148, 2221, 2463, 1799, 484, -1000, -2113, -2438, -1888, -648, 794, 1958, 2389, 1963, 839, -597, -1817, -2386, -2104, -1065, 365, 1661, 2362, 2205, 1243, -189, -1558, -2385, -2336, -1445, -29, 1375, 2283, 2350, 1549, 201, -1246, -2232, -2436, -1752, -452, 1015, 2107, 2430, 1853, 594, -892, -2056, -2465, -1993, -803, 665, 1867, 2389, 2042, 961, -454, -1712, -2377, -2185, -1226, 174, 1500, 2292, 2258, 1406, 37, -1349, -2258, -2354, -1626, -297, 1115, 2132, 2376, 1767, 507, -931, -2049, -2438, -1933, -719, 765, 1954, 2436, 2006, 837, -636, -1860, -2387, -2047, -975, 442, 1669, 2284, 2092, 1142, -199, -1470, -2222, -2172, -1348, -27, 1297, 2179, 2272, 1556, 286, -1095, -2085, -2328, -1742, -510, 911, 2027, 2428, 1954, 762, -726, -1959, -2461, -2068, -897, 606, 1875, 2456, 2129, 1044, -414, -1698, -2350, -2146, -1168, 220, 1527, 2281, 2219, 1354, 11, -1339, -2205, -2250, -1487, -179, 1193, 2124, 2290, 1621, 371, -1006, -2024, -2303, -1747, -542, 857, 1942, 2326, 1844, 687, -731, -1862, -2307, -1902, -801, 573, 1734, 2261, 1971, 975, -372, -1594, -2265, -2129, -1225, 156, 1508, 2321, 2280, 1380, -47, -1486, -2370, -2363, -1479, -56, 1361, 2267, 2317, 1544, 236, -1135, -2092, -2311, -1726, -529, 857, 1955, 2369, 1930, 775, -684, -1911, -2437, -2047, -912, 567, 1814, 2373, 2048, 987, -422, -1646, -2287, -2100, -1161, 185, 1462, 2222, 2159, 1321, -39, -1402, -2257, -2270, -1447, -82, 1307, 2199, 2270, 1499, 213, -1151, -2081, -2263, -1641, -425, 941, 1994, 2339, 1832, 658, -773, -1934, -2389, -1958, -786, 675, 1888, 2386, 2010, 902, -497, -1704, -2276, -2029, -1062, 273, 1515, 2229, 2153, 1319, -2, -1345, -2198, -2257, -1478, -136, 1249, 2188, 2311, 1592, 298, -1089, -2064, -2286, -1679, -484, 883, 1921, 2276, 1817, 703, -667, -1812, -2297, -1944, -881, 513, 1729, 2318, 2050, 1021, -366, -1617, -2269, -2089, -1139, 208, 1471, 2191, 2118, 1295, 8, -1288, -2111, -2190, -1491, -240, 1099, 2052, 2284, 1676, 450, -958, -2019, -2355, -1814, -600, 827, 1954, 2336, 1875, 726, -672, -1810, -2273, -1917, -879, 462, 1640, 2209, 1982, 1060, -255, -1471, -2167, -2076, -1238, 54, 1327, 2117, 2143, 1398, 142, -1181, -2066, -2228, -1585, -355, 1006, 2015, 2305, 1731, 536, -872, -1959, -2330, -1846, -683, 702, 1835, 2280, 1913, 878, -473, -1640, -2220, -2004, -1074, 254, 1500, 2206, 2120, 1258, -58, -1369, -2168, -2171, -1364, -62, 1259, 2128, 2205, 1493, 231, -1090, -2029, -2203, -1592, -371, 981, 1981, 2256, 1693, 525, -834, -1859, -2202, -1729, -638, 692, 1760, 2198, 1853, 864, -437, -1594, -2166, -1960, -1032, 293, 1527, 2226, 2108, 1229, -126, -1427, -2188, -2149, -1307, 8, 1318, 2151, 2206, 1474, 208, -1121, -2065, -2253, -1620, -389, 1004, 2038, 2328, 1760, 541, -861, -1942, -2287, -1788, -649, 709, 1792, 2208, 1840, 841, -459, -1578, -2141, -1946, -1055, 218, 1444, 2161, 2099, 1269, -65, -1383, -2194, -2195, -1378, -32, 1327, 2183, 2232, 1461, 163, -1192, -2092, -2232, -1569, -336, 1004, 1989, 2259, 1705, 536, -820, -1908, -2292, -1843, -731, 654, 1786, 2272, 1923, 882, -471, -1653, -2226, -2001, -1070, 262, 1485, 2168, 2067, 1204, -86, -1366, -2132, -2126, -1344, -67, 1205, 2029, 2096, 1415, 219, -1034, -1916, -2102, -1547, -440, 825, 1791, 2132, 1720, 672, -639, -1740, -2217, -1873, -840, 515, 1683, 2238, 1962, 982, -381, -1591, -2226, -2048, -1135, 205, 1470, 2201, 2142, 1289, -41, -1375, -2203, -2237, -1447, -103, 1263, 2161, 2272, 1528, 243, -1140, -2094, -2291, -1662, -421, 939, 1967, 2261, 1738, 578, -782, -1856, -2240, -1820, -753, 569, 1669, 2161, 1887, 945, -336, -1494, -2119, -2001, -1147, 132, 1391, 2126, 2105, 1279, -30, -1326, -2136, -2120, -1321, -34, 1233, 2036, 2081, 1362, 170, -1070, -1920, -2078, -1499, -381, 879, 1836, 2121, 1631, 527, -784, -1819, -2164, -1727, -639, 650, 1695, 2111, 1735, 759, -500, -1566, -2056, -1829, -945, 280, 1411, 2033, 1911, 1083, -156, -1350, -2046, -1994, -1188, 49, 1254, 1993, 1995, 1259, 53, -1170, -1959, -2038, -1371, -207, 1036, 1903, 2063, 1456, 293, -976, -1883, -2079, -1522, -401, 866, 1796, 2064, 1573, 514, -736, -1714, -2065, -1686, -676, 567, 1619, 2074, 1780, 832, -444, -1555, -2121, -1890, -963, 323, 1501, 2126, 1969, 1091, -196, -1413, -2116, -2025, -1193, 80, 1308, 2039, 2023, 1278, 74, -1129, -1909, -2007, -1389, -290, 920, 1777, 2023, 1541, 508, -724, -1697, -2065, -1680, -655, 597, 1654, 2087, 1769, 797, -464, -1547, -2048, -1787, -885, 356, 1464, 2044, 1895, 1053, -164, -1315, -1993, -1931, -1167, 42, 1239, 1983, 2025, 1319, 153, -1061, -1886, -2026, -1418, -307, 930, 1824, 2073, 1571, 516, -736, -1723, -2067, -1678, -668, 576, 1634, 2091, 1808, 856, -394, -1514, -2059, -1868, -980, 278, 1425, 2056, 1925, 1111, -98, -1248, -1932, -1918, -1205, -81, 1064, 1826, 1963, 1405, 356, -822, -1734, -2036, -1591, -567, 693, 1716, 2126, 1744, 713, -606, -1679, -2136, -1779, -781, 499, 1570, 2058, 1788, 880, -333, -1420, -1984, -1844, -1029, 140, 1266, 1927, 1890, 1162, 3, -1164, -1881, -1931, -1248, -141, 1009, 1784, 1915, 1365, 318, -833, -1698, -1965, -1521, -514, 678, 1641, 1998, 1624, 637, -609, -1634, -2049, -1713, -745, 484, 1526, 2000, 1735, 837, -374, -1439, -2008, -1855, -1028, 189, 1340, 2017, 1936, 1141, -99, -1300, -2050, -2029, -1275, -48, 1197, 1984, 2049, 1358, 168, -1077, -1915, -2067, -1472, -346, 900, 1806, 2046, 1545, 493, -734, -1689, -2026, -1623, -643, 570, 1556, 1968, 1675, 770, -397, -1416, -1920, -1730, -924, 211, 1272, 1877, 1813, 1093, -39, -1173, -1898, -1940, -1248, -89, 1122, 1936, 2020, 1356, 163, -1065, -1904, -2006, -1391, -259, 938, 1774, 1972, 1451, 432, -741, -1648, -1971, -1593, -639, 548, 1533, 1978, 1692, 796, -394, -1452, -1975, -1775, -953, 202, 1270, 1878, 1816, 1133, 21, -1077, -1826, -1923, -1346, -276, 924, 1782, 2000, 1468, 400, -831, -1742, -2028, -1552, -542, 663, 1603, 1946, 1580, 646, -514, -1483, -1908, -1666, -808, 320, 1331, 1857, 1702, 935, -189, -1247, -1860, -1791, -1083, 19, 1118, 1806, 1844, 1206, 122, -1018, -1776, -1919, -1343, -299, 869, 1718, 1950, 1467, 468, -724, -1648, -1980, -1578, -620, 587, 1559, 1976, 1682, 775, -395, -1423, -1919, -1707, -886, 257, 1307, 1880, 1780, 1036, -78, -1155, -1809, -1778, -1089, -14, 1068, 1756, 1799, 1202, 173, -900, -1635, -1771, -1268, -306, 785, 1582, 1827, 1422, 488, -616, -1506, -1835, -1495, -585, 566, 1504, 1897, 1597, 715, -415, -1367, -1802, -1579, -772, 306, 1291, 1811, 1705, 991, -80, -1135, -1784, -1791, -1117, -15, 1141, 1877, 1941, 1266, 116, -1074, -1842, -1918, -1265, -151, 1012, 1795, 1927, 1367, 336, -799, -1634, -1891, -1447, -493, 668, 1584, 1943, 1587, 650, -533, -1510, -1926, -1633, -735, 427, 1414, 1891, 1667, 857, -278, -1304, -1860, -1748, -974, 149, 1224, 1846, 1781, 1052, -68, -1146, -1793, -1777, -1119, -77, 966, 1631, 1734, 1218, 281, -757, -1542, -1795, -1430, -540, 567, 1489, 1880, 1575, 660, -521, -1522, -1949, -1654, -734, 429, 1421, 1862, 1629, 808, -304, -1291, -1816, -1698, -983, 89, 1126, 1770, 1767, 1123, 33, -1063, -1788, -1842, -1228, -156, 943, 1701, 1812, 1290, 313, -761, -1553, -1799, -1408, -520, 554, 1447, 1828, 1563, 720, -397, -1386, -1868, -1632, -808, 333, 1342, 1849, 1676, 896, -194, -1198, -1748, -1672, -980, 47, 1063, 1712, 1748, 1161, 148, -929, -1672, -1821, -1280, -261, 868, 1687, 1895, 1406, 415, -733, -1624, -1912, -1500, -534, 628, 1566, 1935, 1598, 662, -510, -1507, -1927, -1645, -768, 388, 1384, 1868, 1668, 867, -231, -1241, -1801, -1714, -1029, 26, 1074, 1734, 1778, 1176, 142, -962, -1719, -1855, -1307, -292, 844, 1654, 1857, 1371, 375, -756, -1615, -1883, -1452, -517, 607, 1488, 1812, 1451, 576, -522, -1423, -1796, -1519, -712, 350, 1267, 1709, 1542, 813, -230, -1200, -1760, -1668, -993, 76, 1102, 1734, 1710, 1055, -24, -1065, -1727, -1738, -1121, -108, 914, 1587, 1695, 1200, 296, -709, -1477, -1722, -1371, -532, 507, 1371, 1750, 1498, 685, -384, -1327, -1772, -1583, -795, 265, 1217, 1703, 1577, 891, -118, -1068, -1641, -1627, -1047, -85, 912, 1598, 1711, 1222, 245, -817, -1595, -1789, -1303, -328, 769, 1581, 1794, 1360, 428, -622, -1438, -1719, -1386, -582, 437, 1298, 1712, 1535, 812, -221, -1185, -1728, -1626, -923, 137, 1156, 1741, 1691, 1016, -1, -1018, -1636, -1655, -1089, -135, 853, 1525, 1664, 1225, 328, -670, -1449, -1706, -1346, -486, 560, 1416, 1748, 1440, 590, -472, -1354, -1725, -1460, -672, 358, 1245, 1668, 1496, 771, -215, -1136, -1641, -1554, -907, 69, 1020, 1608, 1610, 1037, 46, -950, -1631, -1722, -1177, -210, 856, 1605, 1759, 1255, 289, -803, -1602, -1819, -1375, -436, 638, 1475, 1763, 1418, 564, -505, -1379, -1778, -1551, -796, 246, 1193, 1720, 1624, 951, -92, -1109, -1744, -1758, -1117, -82, 1001, 1702, 1772, 1187, 161, -928, -1668, -1787, -1247, -263, 792, 1544, 1722, 1276, 379, -652, -1438, -1709, -1359, -547, 475, 1312, 1685, 1454, 687, -338, -1236, -1699, -1539, -824, 204, 1173, 1714, 1638, 965, -73, -1088, -1701, -1689, -1041, -23, 1025, 1684, 1715, 1133, 127, -917, -1611, -1711, -1191, -234, 791, 1524, 1703, 1284, 400, -619, -1416, -1690, -1358, -548, 467, 1317, 1685, 1467, 721, -285, -1171, -1649, -1533, -855, 133, 1079, 1638, 1621, 1006, 13, -978, -1616, -1648, -1080, -117, 883, 1555, 1673, 1165, 252, -772, -1499, -1688, -1256, -372, 651, 1447, 1715, 1357, 477, -558, -1421, -1730, -1408, -576, 454, 1308, 1663, 1425, 672, -304, -1159, -1604, -1491, -849, 85, 989, 1543, 1576, 1013, 99, -881, -1552, -1653, -1163, -239, 775, 1499, 1664, 1244, 359, -658, -1425, -1687, -1333, -508, 504, 1332, 1662, 1419, 639, -377, -1260, -1673, -1499, -749, 252, 1151, 1625, 1508, 861, -103, -1002, -1551, -1542, -991, -83, 845, 1488, 1593, 1145, 265, -723, -1448, -1645, -1226, -352, 666, 1430, 1667, 1288, 455, -532, -1301, -1585, -1292, -523, 414, 1217, 1568, 1373, 684, -235, -1077, -1516, -1403, -768, 153, 1031, 1527, 1485, 908, 20, -855, -1420, -1458, -974, -124, 777, 1412, 1542, 1143, 316, -638, -1347, -1572, -1201, -384, 592, 1346, 1616, 1307, 524, -434, -1223, -1570, -1345, -630, 325, 1177, 1639, 1520, 844, -169, -1135, -1689, -1609, -916, 147, 1159, 1722, 1638, 942, -94, -1062, -1613, -1550, -940, -18, 894, 1457, 1511, 1062, 239, -668, -1334, -1558, -1211, -434, 529, 1306, 1620, 1345, 557, -450, -1307, -1679, -1421, -623, 410, 1272, 1662, 1421, 667, -318, -1180, -1591, -1430, -755, 165, 1007, 1486, 1434, 875, 23, -861, -1435, -1524, -1075, -241, 695, 1378, 1582, 1196, 363, -626, -1387, -1639, -1299, -473, 513, 1304, 1603, 1319, 558, -402, -1205, -1579, -1390, -706, 234, 1095, 1564, 1471, 832, -129, -1058, -1604, -1548, -916, 53, 982, 1549, 1537, 955, 41, -882, -1475, -1528, -1046, -192, 731, 1386, 1555, 1169, 351, -595, -1340, -1595, -1265, -470, 519, 1306, 1624, 1355, 589, -389, -1229, -1606, -1406, -671, 307, 1193, 1632, 1477, 787, -183, -1086, -1568, -1478, -854, 83, 957, 1507, 1500, 991, 127, -776, -1409, -1549, -1134, -291, 674, 1406, 1635, 1258, 409, -615, -1410, -1662, -1288, -421, 588, 1370, 1630, 1283, 481, -487, -1258, -1563, -1307, -576, 362, 1152, 1529, 1353, 701, -206, -1042, -1504, -1417, -823, 73, 950, 1489, 1481, 959, 61, -852, -1469, -1550, -1066, -195, 748, 1416, 1556, 1132, 310, -614, -1319, -1550, -1235, -479, 442, 1217, 1560, 1355, 652, -306, -1171, -1603, -1451, -746, 228, 1131, 1582, 1464, 801, -128, -1006, -1493, -1453, -905, -47, 821, 1385, 1463, 1035, 209, -697, -1365, -1549, -1159, -337, 611, 1316, 1546, 1178, 396, -532, -1250, -1508, -1217, -490, 391, 1140, 1462, 1263, 613, -262, -1049, -1475, -1345, -745, 129, 977, 1458, 1419, 858, -31, -912, -1466, -1473, -945, -67, 827, 1425, 1491, 1042, 207, -688, -1337, -1496, -1145, -376, 507, 1231, 1518, 1277, 563, -384, -1206, -1604, -1400, -668, 319, 1187, 1576, 1381, 672, -265, -1073, -1480, -1340, -750, 82, 877, 1358, 1370, 914, 104, -747, -1359, -1465, -1039, -196, 716, 1352, 1475, 1034, 236, -634, -1239, -1395, -1042, -355, 444, 1078, 1337, 1155, 564, -249, -1004, -1410, -1320, -722, 158, 1007, 1472, 1393, 801, -113, -963, -1460, -1414, -862, -3, 851, 1391, 1442, 989, 157, -729, -1384, -1524, -1113, -297, 647, 1352, 1546, 1171, 377, -546, -1268, -1523, -1230, -522, 381, 1127, 1470, 1299, 674, -221, -1033, -1490, -1408, -811, 73, 939, 1465, 1435, 883, 0, -879, -1437, -1465, -974, -140, 734, 1344, 1455, 1049, 259, -625, -1297, -1503, -1164, -414, 488, 1202, 1461, 1199, 500, -362, -1099, -1429, -1273, -668, 158, 933, 1375, 1344, 831, 8, -837, -1397, -1454, -973, -122, 776, 1396, 1484, 1031, 183, -716, -1351, -1479, -1062, -270, 603, 1246, 1438, 1119, 389, -479, -1181, -1436, -1180, -470, 413, 1125, 1435, 1214, 562, -305, -1029, -1372, -1203, -608, 201, 917, 1323, 1252, 753, -24, -802, -1292, -1323, -865, -69, 778, 1345, 1426, 968, 152, -730, -1330, -1425, -969, -170, 693, 1290, 1410, 1040, 298, -536, -1164, -1379, -1089, -419, 407, 1090, 1401, 1208, 587, -243, -972, -1349, -1239, -670, 138, 891, 1336, 1302, 830, 62, -708, -1234, -1307, -919, -195, 626, 1220, 1390, 1071, 351, -502, -1166, -1402, -1107, -404, 468, 1156, 1420, 1165, 485, -364, -1064, -1374, -1174, -552, 268, 968, 1338, 1203, 656, -125, -864, -1287, -1262, -767, -12, 765, 1257, 1307, 878, 126, -683, -1265, -1378, -1001, -235, 602, 1227, 1388, 1051, 315, -547, -1213, -1422, -1118, -397, 465, 1146, 1407, 1144, 484, -364, -1062, -1381, -1198, -591, 211, 931, 1314, 1228, 724, -57, -814, -1299, -1317, -856, -78, 740, 1298, 1380, 948, 154, -684, -1279, -1366, -942, -182, 640, 1204, 1332, 972, 280, -489, -1077, -1267, -999, -374, 400, 1031, 1294, 1107, 506, -278, -957, -1273, -1117, -547, 239, 935, 1297, 1191, 679, -84, -804, -1233, -1218, -734, 8, 790, 1297, 1334, 890, 103, -724, -1272, -1349, -911, -119, 717, 1280, 1373, 969, 222, -591, -1188, -1342, -1018, -335, 480, 1125, 1378, 1143, 488, -338, -1062, -1389, -1213, -593, 242, 985, 1378, 1259, 707, -92, -858, -1317, -1319, -857, -91, 719, 1276, 1383, 999, 239, -639, -1277, -1458, -1089, -342, 556, 1217, 1423, 1108, 384, -473, -1143, -1403, -1156, -514, 304, 1001, 1331, 1198, 624, -185, -924, -1370, -1303, -781, 37, 836, 1335, 1332, 829, 15, -827, -1359, -1402, -940, -136, 710, 1267, 1345, 922, 150, -679, -1253, -1371, -997, -272, 523, 1100, 1274, 989, 355, -407, -1030, -1299, -1103, -529, 239, 927, 1281, 1174, 632, -157, -908, -1328, -1269, -736, 66, 839, 1301, 1279, 799, 5, -770, -1276, -1299, -852, -100, 685, 1211, 1284, 904, 196, -586, -1139, -1263, -943, -281, 487, 1062, 1245, 998, 387, -337, -944, -1199, -1037, -493, 214, 859, 1207, 1130, 666, -49, -742, -1193, -1213, -783, -76, 696, 1219, 1306, 929, 197, -626, -1203, -1351, -982, -252, 574, 1191, 1378, 1057, 353, -484, -1134, -1356, -1081, -401, 428, 1093, 1342, 1118, 478, -325, -1002, -1304, -1136, -564, 202, 888, 1262, 1186, 690, -57, -786, -1247, -1262, -822, -93, 685, 1220, 1307, 940, 211, -594, -1189, -1352, -1030, -326, 481, 1117, 1345, 1092, 437, -376, -1054, -1348, -1147, -529, 258, 953, 1272, 1147, 588, -167, -850, -1233, -1164, -692, 12, 706, 1148, 1184, 796, 102, -642, -1166, -1264, -900, -191, 594, 1150, 1279, 908, 213, -570, -1129, -1270, -945, -296, 439, 1031, 1232, 1015, 420, -314, -962, -1280, -1130, -572, 226, 958, 1341, 1240, 674, -163, -925, -1360, -1280, -730, 94, 881, 1347, 1326, 838, 45, -754, -1296, -1344, -900, -128, 692, 1258, 1373, 985, 244, -562, -1140, -1287, -963, -302, 457, 1033, 1231, 997, 427, -282, -868, -1155, -1014, -515, 167, 804, 1145, 1084, 627, -53, -725, -1113, -1102, -666, 13, 703, 1143, 1166, 766, 84, -636, -1113, -1176, -802, -120, 606, 1101, 1188, 861, 222, -475, -992, -1146, -894, -328, 327, 896, 1141, 1016, 529, -160, -824, -1194, -1153, -665, 77, 808, 1247, 1214, 732, -42, -807, -1264, -1248, -766, -35, 721, 1185, 1235, 821, 109, -665, -1189, -1285, -916, -192, 582, 1140, 1252, 909, 226, -540, -1092, -1247, -968, -349, 377, 966, 1205, 1029, 472, -262, -931, -1300, -1187, -641, 162, 921, 1327, 1237, 680, -147, -909, -1332, -1260, -729, 35, 781, 1243, 1255, 815, 97, -669, -1195, -1282, -909, -197, 569, 1137, 1257, 936, 290, -435, -969, -1161, -926, -402, 252, 807, 1109, 1028, 596, -45, -714, -1106, -1104, -676, 37, 738, 1178, 1150, 680, -29, -717, -1086, -1041, -603, 33, 647, 1015, 1030, 698, 122, -487, -931, -1039, -745, -182, 489, 989, 1145, 880, 284, -407, -940, -1110, -867, -308, 364, 909, 1133, 970, 469, -199, -801, -1110, -1023, -569, 107, 753, 1141, 1118, 707, 26, -657, -1115, -1163, -780, -120, 590, 1092, 1197, 885, 239, -486, -1041, -1204, -950, -337, 380, 956, 1196, 1000, 451, -268, -906, -1225, -1090, -562, 179, 856, 1216, 1101, 593, -170, -846, -1212, -1130, -634, 71, 734, 1121, 1096, 692, 15, -658, -1139, -1194, -847, -178, 565, 1092, 1212, 886, 215, -542, -1095, -1260, -979, -359, 362, 957, 1194, 1035, 506, -225, -878, -1250, -1172, -667, 84, 827, 1253, 1219, 724, -39, -780, -1208, -1194, -735, -32, 668, 1113, 1158, 787, 145, -537, -1026, -1136, -835, -229, 451, 963, 1115, 867, 311, -331, -838, -1046, -888, -433, 175, 735, 1050, 1027, 643, 19, -643, -1069, -1130, -751, -85, 646, 1131, 1203, 827, 156, -550, -1047, -1140, -836, -222, 474, 993, 1155, 905, 317, -373, -926, -1088, -825, -230, 440, 901, 970, 637, 92, -416, -681, -597, }; fldigi-4.2.05/src/soundcard/soundconf.cxx0000664000175000017500000003706414611711171015270 00000000000000// ---------------------------------------------------------------------------- // soundconf.cxx // // Copyright (C) 2008-2010, Stelios Bounanos, M0GLD // Copyright (C) 2014 David Freese, W1HKJ // Copyright (C) 2015 Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #if USE_PORTAUDIO # include # include #endif #include #include #include #if USE_OSS # include #endif #include "soundconf.h" #include "sound.h" #include "main.h" #include "configuration.h" #include "confdialog.h" #include "debug.h" #include "util.h" LOG_FILE_SOURCE(debug::LOG_AUDIO); double std_sample_rates[] = { 8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, 44100.0, 48000.0, 88200.0, 96000.0, 192000.0, -1.0 }; static void init_oss(void) { #if USE_OSS #ifdef __FreeBSD__ char *last = NULL; char *curr = NULL; char *p; #endif glob_t gbuf; glob("/dev/dsp*", 0, NULL, &gbuf); if (gbuf.gl_pathc == 0) { AudioOSS->deactivate(); btnAudioIO[SND_IDX_OSS]->deactivate(); menuOSSDev->deactivate(); return; } for (size_t i = 0; i < gbuf.gl_pathc; i++) { #ifdef __FreeBSD__ if (curr) free(curr); curr = strdup(gbuf.gl_pathv[i]); p = strrchr(curr, '.'); if (p) *p = '\0'; if (last != NULL) { if (strcmp(last, curr) == 0) continue; } menuOSSDev->add(curr); if (last) free(last); last = curr; curr = NULL; #else menuOSSDev->add(gbuf.gl_pathv[i]); #endif } #ifdef __FreeBSD__ if (last) free(last); if (curr) free(curr); #endif if (progdefaults.OSSdevice.length() == 0 && gbuf.gl_pathc) progdefaults.OSSdevice = gbuf.gl_pathv[0]; menuOSSDev->value(progdefaults.OSSdevice.c_str()); globfree(&gbuf); menuOSSDev->activate(); #endif // USE_OSS } #if USE_PORTAUDIO std::map pa_api_prio; struct padev { public: padev(const PaDeviceInfo* dev_, PaDeviceIndex idx_, PaHostApiTypeId api_) : dev(dev_), idx(idx_), api(api_) { } bool operator<(const padev& rhs) const { return pa_api_prio.find(api) != pa_api_prio.end() && pa_api_prio.find(rhs.api) != pa_api_prio.end() && pa_api_prio[api] < pa_api_prio[rhs.api]; } const PaDeviceInfo* dev; PaDeviceIndex idx; PaHostApiTypeId api; }; static PaDeviceIndex get_default_portaudio_device(int dir) { #ifndef __linux__ goto ret_def; #else // Recent PortAudio snapshots prefer ALSA over OSS for the default device, but there are // still versions out there that try OSS first. We check the default host api type and, // if it is not ALSA, return the ALSA default device instead. PaHostApiIndex api_idx; if ((api_idx = Pa_GetDefaultHostApi()) < 0) goto ret_def; const PaHostApiInfo* host_api; if ((host_api = Pa_GetHostApiInfo(api_idx)) == NULL || host_api->type == paALSA) goto ret_def; LOG_DEBUG("Default host API is %s, trying default ALSA %s device instead", host_api->name, (dir == 0 ? "input" : "output")); api_idx = Pa_GetHostApiCount(); if (api_idx < 0) goto ret_def; for (PaHostApiIndex i = 0; i < api_idx; i++) if ((host_api = Pa_GetHostApiInfo(i)) && host_api->type == paALSA) return dir == 0 ? host_api->defaultInputDevice : host_api->defaultOutputDevice; #endif // __linux__ ret_def: return dir == 0 ? Pa_GetDefaultInputDevice() : Pa_GetDefaultOutputDevice(); } #include std::string str_pa_devices; static void init_portaudio(void) { try { SoundPort::initialize(); } catch (const SndException& e) { // if (e.error() == ENODEV) // don't complain if there are no devices // return; str_pa_devices.assign("\nPortaudio devices init failure:"); str_pa_devices.assign(e.what()); AudioPort->deactivate(); btnAudioIO[SND_IDX_PORT]->deactivate(); if (progdefaults.btnAudioIOis == SND_IDX_PORT) progdefaults.btnAudioIOis = SND_IDX_NULL; return; } pa_api_prio.clear(); #if defined(__APPLE__) pa_api_prio[paASIO] = 0; pa_api_prio[paCoreAudio] = 1; #elif defined(__WOE32__) pa_api_prio[paASIO] = 0; pa_api_prio[paWASAPI] = 1; pa_api_prio[paMME] = 2; pa_api_prio[paDirectSound] = 3; #else pa_api_prio[paALSA] = 0; pa_api_prio[paJACK] = 1; pa_api_prio[paOSS] = 2; #endif std::list devlist; int devnbr = 0; for (SoundPort::device_iterator idev = SoundPort::devices().begin(); idev != SoundPort::devices().end(); ++idev) { devlist.push_back( padev(*idev, idev - SoundPort::devices().begin(), Pa_GetHostApiInfo((*idev)->hostApi)->type) ); devnbr++; } devlist.sort(); str_pa_devices.assign("\nPortaudio devices:\n"); PaHostApiTypeId first_api = devlist.begin()->api; for (std::list::const_iterator ilist = devlist.begin(); ilist != devlist.end(); ilist++) { std::string menu_item; std::string::size_type i = 0; if (ilist->api != first_api) { // add a submenu menu_item.append(Pa_GetHostApiInfo(ilist->dev->hostApi)->name).append(" devices/"); i = menu_item.length(); } menu_item.append(ilist->dev->name); str_pa_devices.append(menu_item).append("\n"); // backslash-escape any slashes in the device name while ((i = menu_item.find('/', i)) != std::string::npos) { menu_item.insert(i, 1, '\\'); i += 2; } // add to menu if (ilist->dev->maxInputChannels > 0) menuPortInDev->add(menu_item.c_str(), 0, NULL, reinterpret_cast(ilist->idx), 0); if (ilist->dev->maxOutputChannels > 0) { menuPortOutDev->add(menu_item.c_str(), 0, NULL, reinterpret_cast(ilist->idx), 0); menuAlertsDev->add(menu_item.c_str(), 0, NULL, reinterpret_cast(ilist->idx), 0); } } if (progdefaults.PortInDevice.length() == 0) { if (progdefaults.PAdevice.length() == 0) { PaDeviceIndex def = get_default_portaudio_device(0); if (def != paNoDevice) { progdefaults.PortInDevice = (*(SoundPort::devices().begin() + def))->name; progdefaults.PortInIndex = def; } } else progdefaults.PortInDevice = progdefaults.PAdevice; } if (progdefaults.PortOutDevice.length() == 0) { if (progdefaults.PAdevice.length() == 0) { PaDeviceIndex def = get_default_portaudio_device(1); if (def != paNoDevice) { progdefaults.PortOutDevice = (*(SoundPort::devices().begin() + def))->name; progdefaults.PortOutIndex = def; } } else progdefaults.PortOutDevice = progdefaults.PAdevice; } if (progdefaults.AlertDevice.length() == 0) { PaDeviceIndex def = get_default_portaudio_device(1); if (def != paNoDevice) { progdefaults.AlertDevice = (*(SoundPort::devices().begin() + def))->name; progdefaults.AlertIndex = def; } } // select the correct menu items pa_set_dev(menuPortInDev, progdefaults.PortInDevice, progdefaults.PortInIndex); pa_set_dev(menuPortOutDev, progdefaults.PortOutDevice, progdefaults.PortOutIndex); pa_set_dev(menuAlertsDev, progdefaults.AlertDevice, progdefaults.AlertIndex); } int pa_set_dev(Fl_Choice *loc_choice, std::string loc_dev_name, int loc_dev_index) { const Fl_Menu_Item *loc_menu = (Fl_Menu_Item *)0; int loc_size = 0; int loc_dev_found = PA_DEV_NOT_FOUND; int loc_idx = -1; if(!loc_choice) return loc_dev_found; loc_menu = loc_choice->menu(); loc_size = loc_choice->size(); for (int loc_i = 0; loc_i < loc_size - 1; loc_i++, loc_menu++) { if (loc_menu->label() && loc_dev_name == loc_menu->label()) { loc_idx = loc_i; loc_dev_found = PA_DEV_FOUND; if (reinterpret_cast(loc_menu->user_data()) == loc_dev_index || loc_dev_found == -1) { // exact match, or index was never saved loc_dev_found = PA_EXACT_DEV_FOUND; } } } if (loc_idx >= 0) { loc_choice->value(loc_idx); loc_choice->set_changed(); } return loc_dev_found; } #else static void init_portaudio(void) { } #endif // USE_PORTAUDIO static void build_srate_listbox(Fl_ListBox* lbox, const double* rates, size_t length, double defrate = -1.0) { lbox->clear(); lbox->add("Auto"); lbox->add("Native"); char s[16]; for (size_t i = 0; i < length; i++) { if (defrate != rates[i]) snprintf(s, sizeof(s), "%.0f", rates[i]); else snprintf(s, sizeof(s), "%.0f (native)", rates[i]); lbox->add(s); } } int sample_rate_converters[FLDIGI_NUM_SRC] = { SRC_SINC_BEST_QUALITY, SRC_SINC_MEDIUM_QUALITY, SRC_SINC_FASTEST #if !(defined(__ppc__) || defined(__powerpc__) || defined(__PPC__)) , SRC_LINEAR #endif }; static void sound_init_options(void) { build_srate_listbox(menuInSampleRate, std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1); build_srate_listbox(menuOutSampleRate, std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1); for (int i = 0; i < FLDIGI_NUM_SRC; i++) menuSampleConverter->add(src_get_name(sample_rate_converters[i])); // Warn if we are using ZOH if (progdefaults.sample_converter == SRC_ZERO_ORDER_HOLD) { progdefaults.sample_converter = SRC_LINEAR; LOG_WARN("The Zero Order Hold sample rate converter should not be used! " "Your setting has been changed to Linear."); } #if defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) // SRC_LINEAR may crash with 11025Hz modems. Change to SINC_FASTEST. if (progdefaults.sample_converter == SRC_LINEAR) { progdefaults.sample_converter = SRC_SINC_FASTEST; LOG_WARN("Linear sample rate converter may not work on this architecture. " "Your setting has been changed to Fastest Sinc"); } #endif for (int i = 0; i < FLDIGI_NUM_SRC; i++) { if (sample_rate_converters[i] == progdefaults.sample_converter) { menuSampleConverter->index(i); menuSampleConverter->tooltip(src_get_description(progdefaults.sample_converter)); break; } } menuOSSDev->value(progdefaults.OSSdevice.c_str()); inpPulseServer->value(progdefaults.PulseServer.c_str()); char sr[20]; if (progdefaults.in_sample_rate == SAMPLE_RATE_UNSET && (progdefaults.in_sample_rate = progdefaults.sample_rate) == SAMPLE_RATE_UNSET) progdefaults.in_sample_rate = SAMPLE_RATE_NATIVE; else if (progdefaults.in_sample_rate < SAMPLE_RATE_OTHER) menuInSampleRate->index(progdefaults.in_sample_rate); else { snprintf(sr, sizeof(sr), "%d", progdefaults.in_sample_rate); for (int i = SAMPLE_RATE_NATIVE + 1; i < menuInSampleRate->lsize(); i++) { menuInSampleRate->index(i); if (strstr(menuInSampleRate->value(), sr)) break; } } if (progdefaults.out_sample_rate == SAMPLE_RATE_UNSET && (progdefaults.out_sample_rate = progdefaults.sample_rate) == SAMPLE_RATE_UNSET) progdefaults.out_sample_rate = SAMPLE_RATE_NATIVE; else if (progdefaults.out_sample_rate < SAMPLE_RATE_OTHER) menuOutSampleRate->index(progdefaults.out_sample_rate); else { snprintf(sr, sizeof(sr), "%d", progdefaults.out_sample_rate); for (int i = SAMPLE_RATE_NATIVE + 1; i < menuOutSampleRate->lsize(); i++) { menuOutSampleRate->index(i); if (strstr(menuOutSampleRate->value(), sr)) break; } } cntRxRateCorr->value(progdefaults.RX_corr); cntTxRateCorr->value(progdefaults.TX_corr); cntTxOffset->value(progdefaults.TxOffset); } #if USE_PULSEAUDIO # include # include # include # if PA_API_VERSION < 12 static inline int PA_CONTEXT_IS_GOOD(pa_context_state_t x) { return x == PA_CONTEXT_CONNECTING || x == PA_CONTEXT_AUTHORIZING || x == PA_CONTEXT_SETTING_NAME || x == PA_CONTEXT_READY; } # endif static bool probe_pulseaudio(void) { pa_mainloop* loop = pa_mainloop_new(); if (!loop) return false; bool ok = false; pa_context* context = pa_context_new(pa_mainloop_get_api(loop), PACKAGE_TARNAME); if (context && pa_context_connect(context, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL) >= 0) { pa_context_state_t state; do { // iterate main loop until the context connection fails or becomes ready if (!(ok = (pa_mainloop_iterate(loop, 1, NULL) >= 0 && PA_CONTEXT_IS_GOOD(state = pa_context_get_state(context))))) break; } while (state != PA_CONTEXT_READY); } if (context) { pa_context_disconnect(context); pa_context_unref(context); } pa_mainloop_free(loop); return ok; } #else static bool probe_pulseaudio(void) { return false; } #endif // USE_PULSEAUDIO void sound_init(void) { init_oss(); init_portaudio(); // set the Sound Card configuration tab to the correct initial values #if !USE_OSS AudioOSS->deactivate(); btnAudioIO[SND_IDX_OSS]->deactivate(); #endif #if !USE_PORTAUDIO AudioPort->deactivate(); btnAudioIO[SND_IDX_PORT]->deactivate(); AudioAlerts->deactivate(); #endif #if !USE_PULSEAUDIO AudioPulse->deactivate(); btnAudioIO[SND_IDX_PULSE]->deactivate(); inpPulseServer->deactivate(); #endif if (progdefaults.btnAudioIOis == SND_IDX_UNKNOWN || !btnAudioIO[progdefaults.btnAudioIOis]->active()) { // or saved sound api now disabled int io[4] = { SND_IDX_PORT, SND_IDX_PULSE, SND_IDX_OSS, SND_IDX_NULL }; if (probe_pulseaudio()) { // prefer pulseaudio io[0] = SND_IDX_PULSE; io[1] = SND_IDX_PORT; } for (size_t i = 0; i < sizeof(io)/sizeof(*io); i++) { if (btnAudioIO[io[i]]->active()) { progdefaults.btnAudioIOis = io[i]; break; } } } sound_init_options(); sound_update(progdefaults.btnAudioIOis); } void sound_close(void) { #if USE_PORTAUDIO SoundPort::terminate(); #endif } void sound_update(unsigned idx) { // radio button for (size_t i = 0; i < sizeof(btnAudioIO)/sizeof(*btnAudioIO); i++) btnAudioIO[i]->value(i == idx); // devices menuOSSDev->deactivate(); menuPortInDev->deactivate(); menuPortOutDev->deactivate(); // settings menuInSampleRate->deactivate(); menuOutSampleRate->deactivate(); progdefaults.btnAudioIOis = idx; switch (idx) { #if USE_OSS case SND_IDX_OSS: scDevice[0] = scDevice[1] = menuOSSDev->value(); menuOSSDev->activate(); break; #endif #if USE_PORTAUDIO case SND_IDX_PORT: menuPortInDev->activate(); menuPortOutDev->activate(); if (menuPortInDev->text()) scDevice[0] = menuPortInDev->text(); if (menuPortOutDev->text()) scDevice[1] = menuPortOutDev->text(); { Fl_ListBox* listbox[2] = { menuInSampleRate, menuOutSampleRate }; for (size_t i = 0; i < 2; i++) { char* label = strdup(listbox[i]->value()); const std::vector& srates = SoundPort::get_supported_rates(scDevice[i], i); switch (srates.size()) { case 0: // startup; no devices initialised yet build_srate_listbox(listbox[i], std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1); break; case 1: // default sample rate only, build menu with all std rates build_srate_listbox(listbox[i], std_sample_rates, sizeof(std_sample_rates)/sizeof(*std_sample_rates) - 1, srates[0]); break; default: // first element is default sample rate, build menu with rest build_srate_listbox(listbox[i], &srates[0] + 1, srates.size() - 1, srates[0]); break; } for (int j = 0; j < listbox[i]->lsize(); j++) { listbox[i]->index(j); if (strstr(listbox[i]->value(), label)) break; } free(label); listbox[i]->activate(); } } break; #endif #if USE_PULSEAUDIO case SND_IDX_PULSE: scDevice[0] = scDevice[1] = inpPulseServer->value(); break; #endif case SND_IDX_NULL: scDevice[0] = scDevice[1] = ""; break; }; } fldigi-4.2.05/src/soundcard/ttybell.cxx0000664000175000017500000007153514611711171014752 00000000000000#define TTY_BELL 4763 int int_tty_bell[TTY_BELL] = { 11038, 10967, 6666, -770, -8105, -12598, -12110, -5979, 3074, 10794, 14575, 13438, 6988, -2753, -11600, -16188, -14064, -5320, 5905, 14556, 18027, 15203, 6142, -5782, -15665, -19709, -15366, -3829, 9261, 18414, 21221, 16206, 4466, -8909, -18682, -21268, -14642, -1500, 11613, 19576, 20761, 14413, 2009, -10999, -19616, -20658, -12646, 892, 13329, 20118, 19936, 12329, -514, -12962, -20327, -19632, -10294, 3379, 14898, 20456, 18861, 9976, -3104, -14780, -20794, -18361, -7802, 5782, 16237, 20543, 17605, 7557, -5584, -16352, -20977, -16907, -5309, 8039, 17382, 20382, 16139, 5192, -7850, -17630, -20742, -15080, -2680, 10225, 18377, 19957, 14381, 2774, -9926, -18625, -20172, -13068, -273, 11945, 18971, 19278, 12384, 278, -11888, -19441, -19361, -10848, 2202, 13545, 19366, 18400, 10250, -2252, -13700, -20011, -18318, -8545, 4578, 14968, 19539, 17302, 8083, -4600, -15251, -20235, -17048, -6299, 6689, 16134, 19463, 15928, 5832, -6789, -16573, -20123, -15374, -3875, 8713, 17095, 19169, 14229, 3319, -8984, -17751, -19733, -13380, -1279, 10650, 17838, 18632, 12315, 732, -11077, -18682, -19063, -11229, 1293, 12433, 18368, 17909, 10478, -1496, -12710, -19184, -18164, -9195, 3461, 13828, 18594, 16877, 8443, -3719, -14259, -19437, -16874, -6917, 5616, 15040, 18619, 15533, 6108, -6000, -15685, -19446, -15246, -4405, 7741, 16067, 18417, 13969, 3626, -8226, -16913, -19205, -13419, -1866, 9728, 16878, 17970, 12249, 1196, -10265, -17829, -18655, -11493, 493, 11447, 17426, 17297, 10559, -831, -11816, -18341, -17858, -9723, 2381, 12669, 17686, 16343, 8498, -3140, -13477, -18747, -16599, -7290, 4745, 14031, 17821, 15087, 6100, -5549, -15001, -18879, -15064, -4742, 7001, 15176, 17686, 13627, 3685, -7796, -16240, -18683, -13364, -2295, 8993, 16046, 17292, 12098, 1610, -9549, -17020, -18156, -11710, -314, 10441, 16532, 16606, 10213, -723, -11383, -17715, -17238, -9431, 2156, 12058, 16944, 15713, 8162, -2979, -12946, -18105, -16069, -7104, 4476, 13400, 17100, 14568, 5937, -5299, -14406, -18277, -14833, -4986, 6380, 14390, 16967, 13350, 3965, -7155, -15443, -18043, -13276, -2792, 8212, 15229, 16598, 11727, 1723, -9078, -16366, -17503, -11349, -428, 9920, 15863, 15981, 9839, -638, -10891, -17079, -16697, -9210, 1937, 11475, 16252, 15203, 7998, -2734, -12346, -17465, -15807, -7354, 3824, 12586, 16362, 14216, 6092, -4782, -13675, -17587, -14547, -5236, 5787, 13668, 16268, 12874, 3938, -6800, -14850, -17389, -12889, -2889, 7693, 14556, 15978, 11345, 1804, -8584, -15713, -16985, -11221, -800, 9214, 15101, 15440, 9614, -483, -10386, -16450, -16284, -9205, 1541, 10816, 15545, 14709, 7905, -2474, -11781, -16786, -15325, -7268, 3529, 12054, 15697, 13666, 5944, -4506, -13124, -16919, -14101, -5263, 5324, 13011, 15633, 12440, 3945, -6355, -14193, -16759, -12514, -2957, 7218, 13891, 15370, 10912, 1665, -8305, -15173, -16435, -10900, -844, 8819, 14488, 14905, 9423, -304, -9872, -15773, -15777, -9108, 1241, 10277, 14899, 14133, 7627, -2375, -11381, -16180, -14822, -7213, 3139, 11435, 15064, 13134, 5722, -4300, -12633, -16284, -13509, -4969, 5178, 12539, 15044, 11839, 3511, -6378, -13815, -16223, -12086, -2850, 6936, 13340, 14789, 10513, 1546, -8075, -14635, -15830, -10457, -725, 8586, 13982, 14301, 9031, -326, -9560, -15188, -15159, -8804, 1122, 9844, 14327, 13519, 7180, -2428, -11078, -15604, -14101, -6644, 3297, 11158, 14550, 12531, 5251, -4384, -12312, -15746, -12959, -4646, 5101, 12119, 14481, 11334, 3200, -6356, -13423, -15655, -11617, -2679, 6769, 12893, 14203, 10032, 1345, -7945, -14168, -15164, -9931, -564, 8376, 13525, 13675, 8423, -625, -9453, -14729, -14458, -8163, 1368, 9663, 13865, 12939, 6676, -2573, -10815, -15066, -13448, -6101, 3458, 10911, 14038, 11932, 4694, -4623, -12086, -15186, -12309, -4179, 5207, 11816, 13931, 10817, 2934, -6260, -12970, -14979, -11006, -2362, 6704, 12509, 13613, 9457, 1079, -7824, -13712, -14521, -9405, -398, 8137, 13046, 13093, 7876, -888, -9300, -14262, -13763, -7472, 1754, 9564, 13430, 12358, 6156, -2802, -10602, -14564, -12896, -5716, 3506, 10614, 13511, 11406, 4356, -4660, -11759, -14620, -11775, -3925, 5121, 11455, 13382, 10251, 2615, -6229, -12616, -14337, -10281, -1885, 6756, 12204, 13075, 8852, 730, -7746, -13299, -13892, -8754, -32, 8073, 12649, 12531, 7273, -1251, -9238, -13835, -13241, -7090, 1814, 9284, 12931, 11832, 5748, -2952, -10388, -14035, -12295, -5315, 3582, 10352, 13014, 10875, 4094, -4562, -11365, -13999, -11139, -3561, 5101, 11135, 12891, 9734, 2335, -6128, -12206, -13756, -9671, -1529, 6709, 11841, 12562, 8301, 344, -7739, -12927, -13317, -8166, 310, 8012, 12265, 12044, 6904, -1360, -9000, -13319, -12671, -6679, 1918, 9086, 12485, 11316, 5428, -2951, -10074, -13492, -11742, -5022, 3498, 10014, 12536, 10360, 3744, -4555, -11052, -13450, -10478, -3051, 5210, 10882, 12412, 9111, 1801, -6269, -11942, -13232, -9128, -1214, 6658, 11476, 12081, 7855, 93, -7643, -12504, -12776, -7752, 434, 7854, 11852, 11514, 6468, -1549, -8874, -12879, -12036, -6141, 2160, 8987, 12117, 10713, 4818, -3282, -10032, -13062, -10964, -4220, 3970, 10022, 12169, 9693, 3011, -4983, -11030, -13029, -9781, -2394, 5531, 10781, 11997, 8506, 1194, -6580, -11830, -12739, -8399, -546, 6990, 11373, 11599, 7204, -464, -7903, -12319, -12161, -6914, 1135, 8159, 11721, 10917, 5592, -2287, -9204, -12684, -11304, -5170, 2894, 9234, 11894, 10050, 3901, -3985, -10256, -12776, -10257, -3395, 4486, 10074, 11833, 9028, 2220, -5509, -11057, -12619, -9086, -1719, 5886, 10706, 11567, 7888, 647, -6817, -11633, -12155, -7655, 44, 7207, 11199, 11069, 6498, -993, -8053, -12049, -11488, -6112, 1678, 8268, 11449, 10382, 4985, -2612, -9138, -12276, -10632, -4483, 3266, 9185, 11524, 9521, 3420, -4164, -10043, -12277, -9627, -2870, 4694, 9912, 11399, 8549, 1916, -5524, -10741, -12048, -8498, -1344, 5939, 10453, 11068, 7354, 355, -6784, -11272, -11568, -7093, 316, 7105, 10839, 10541, 5960, -1284, -7960, -11656, -10902, -5570, 1928, 8140, 11071, 9875, 4483, -2863, -8999, -11816, -9987, -3868, 3582, 9085, 11127, 9018, 3010, -4296, -9811, -11751, -9002, -2397, 4862, 9722, 10919, 7912, 1398, -5706, -10531, -11451, -7735, -754, 6121, 10252, 10544, 6630, -228, -6951, -11021, -10938, -6299, 884, 7236, 10588, 10006, 5255, -1810, -8052, -11328, -10253, -4829, 2435, 8203, 10745, 9295, 3850, -3273, -8975, -11392, -9392, -3363, 3801, 8964, 10695, 8379, 2412, -4616, -9719, -11250, -8298, -1819, 5081, 9581, 10471, 7260, 852, -5891, -10319, -10887, -6992, -183, 6282, 10044, 10101, 6079, -611, -6971, -10714, -10376, -5665, 1327, 7307, 10327, 9558, 4797, -2069, -7970, -10926, -9680, -4304, 2714, 8157, 10409, 8811, 3464, -3413, -8794, -10931, -8759, -2856, 4000, 8839, 10314, 7848, 1988, -4713, -9503, -10743, -7622, -1271, 5255, 9400, 10053, 6736, 456, -5928, -10037, -10381, -6402, 238, 6353, 9791, 9617, 5466, -1100, -7083, -10414, -9839, -5112, 1647, 7290, 10005, 9037, 4255, -2405, -7969, -10540, -9044, -3674, 3046, 8132, 10043, 8188, 2845, -3730, -8721, -10464, -8056, -2190, 4313, 8753, 9901, 7224, 1401, -4963, -9334, -10244, -6952, -716, 5447, 9213, 9617, 6167, -6, -6068, -9795, -9900, -5833, 647, 6429, 9528, 9194, 5092, -1283, -7006, -10046, -9288, -4601, 1920, 7257, 9681, 8534, 3805, -2585, -7834, -10141, -8495, -3235, 3186, 7976, 9707, 7737, 2449, -3839, -8549, -10072, -7540, -1788, 4418, 8552, 9539, 6785, 1052, -5025, -9088, -9818, -6514, -409, 5505, 9011, 9260, 5805, -245, -6046, -9487, -9406, -5386, 876, 6420, 9266, 8733, 4615, -1542, -6956, -9699, -8745, -4073, 2176, 7202, 9395, 8059, 3314, -2835, -7743, -9750, -7867, -2578, 3569, 7962, 9393, 7228, 1948, -4077, -8395, -9625, -6923, -1234, 4686, 8465, 9177, 6326, 688, -5110, -8845, -9327, -5923, 15, 5620, 8811, 8802, 5283, -559, -6044, -9170, -8817, -4744, 1293, 6461, 9026, 8255, 4098, -1824, -6904, -9359, -8164, -3465, 2551, 7216, 9112, 7588, 2830, -3067, -7634, -9381, -7373, -2159, 3721, 7811, 9025, 6799, 1618, -4156, -8198, -9214, -6496, -951, 4706, 8251, 8774, 5882, 411, -5136, -8612, -8853, -5418, 327, 5630, 8575, 8356, 4790, -863, -6054, -8900, -8325, -4208, 1607, 6455, 8752, 7803, 3599, -2119, -6859, -9030, -7646, -2963, 2811, 7139, 8780, 7135, 2423, -3264, -7516, -9002, -6887, -1781, 3860, 7676, 8653, 6324, 1249, -4290, -8025, -8770, -5931, -537, 4829, 8090, 8354, 5333, -5, -5245, -8409, -8367, -4823, 745, 5717, 8366, 7921, 4232, -1267, -6121, -8650, -7829, -3651, 1970, 6482, 8491, 7366, 3107, -2428, -6842, -8716, -7156, -2489, 3068, 7088, 8453, 6658, 1997, -3461, -7410, -8590, -6329, -1301, 4057, 7570, 8273, 5773, 786, -4457, -7876, -8324, -5332, -58, 4996, 7937, 7956, 4766, -464, -5373, -8198, -7888, -4223, 1190, 5821, 8151, 7498, 3704, -1643, -6167, -8370, -7342, -3126, 2310, 6500, 8221, 6898, 2642, -2705, -6799, -8354, -6615, -1989, 3327, 7051, 8136, 6130, 1478, -3715, -7337, -8195, -5715, -760, 4304, 7487, 7903, 5201, 260, -4672, -7741, -7872, -4690, 472, 5182, 7785, 7544, 4209, -919, -5507, -7995, -7420, -3648, 1597, 5913, 7932, 7083, 3303, -1877, -6127, -8056, -6833, -2634, 2591, 6505, 7947, 6450, 2224, -2890, -6722, -7995, -6060, -1471, 3566, 6996, 7826, 5653, 1072, -3864, -7195, -7797, -5159, -282, 4486, 7365, 7573, 4767, -95, -4758, -7545, -7461, -4201, 850, 5281, 7600, 7188, 3844, -1154, -5499, -7715, -6968, -3215, 1859, 5926, 7683, 6638, 2818, -2161, -6132, -7743, -6298, -2104, 2863, 6478, 7647, 5933, 1714, -3153, -6663, -7667, -5559, -1045, 3742, 6881, 7489, 5139, 575, -4085, -7088, -7430, -4669, 101, 4593, 7200, 7195, 4280, -489, -4878, -7352, -7048, -3743, 1141, 5315, 7380, 6778, 3409, -1407, -5498, -7448, -6498, -2734, 2145, 5925, 7439, 6176, 2345, -2434, -6108, -7455, -5793, -1613, 3119, 6435, 7368, 5477, 1249, -3388, -6584, -7305, -4992, -494, 4012, 6815, 7159, 4687, 179, -4241, -6942, -7034, -4146, 544, 4787, 7081, 6819, 3808, -837, -4988, -7150, -6573, -3158, 1579, 5464, 7209, 6299, 2783, -1882, -5655, -7244, -5959, -2065, 2610, 6049, 7232, 5660, 1700, -2886, -6214, -7202, -5250, -993, 3517, 6483, 7105, 4946, 668, -3761, -6615, -7000, -4449, 64, 4347, 6814, 6833, 4121, -358, -4548, -6895, -6649, -3580, 1016, 5002, 6995, 6429, 3238, -1311, -5189, -7031, -6128, -2574, 2022, 5605, 7075, 5872, 2223, -2294, -5765, -7048, -5493, -1520, 2965, 6106, 7018, 5239, 1218, -3183, -6217, -6930, -4796, -541, 3764, 6454, 6828, 4537, 294, -3924, -6516, -6660, -4004, 393, 4455, 6680, 6494, 3694, -657, -4609, -6709, -6232, -3081, 1362, 5062, 6816, 6033, 2778, -1618, -5211, -6807, -5706, -2113, 2283, 5593, 6828, 5498, 1831, -2504, -5709, -6771, -5100, -1168, 3123, 6003, 6731, 4874, 925, -3277, -6071, -6592, -4401, -258, 3837, 6311, 6492, 4130, 3, -3985, -6346, -6279, -3562, 690, 4499, 6509, 6133, 3274, -946, -4632, -6526, -5849, -2655, 1645, 5083, 6616, 5684, 2375, -1856, -5196, -6569, -5329, -1736, 2502, 5559, 6587, 5144, 1504, -2667, -5623, -6483, -4710, -848, 3251, 5927, 6445, 4485, 608, -3398, -5955, -6262, -3956, 81, 3946, 6194, 6172, 3699, -338, -4084, -6197, -5914, -3107, 1030, 4581, 6358, 5806, 2846, -1251, -4691, -6322, -5477, -2231, 1906, 5100, 6404, 5336, 2004, -2076, -5162, -6307, -4948, -1382, 2666, 5510, 6327, 4761, 1154, -2814, -5549, -6165, -4264, -477, 3395, 5831, 6139, 4046, 239, -3525, -5848, -5913, -3495, 451, 4052, 6060, 5847, 3260, -670, -4174, -6029, -5556, -2668, 1335, 4625, 6177, 5488, 2542, -1427, -4637, -6076, -5123, -1902, 2083, 5069, 6174, 5011, 1747, -2176, -5074, -6028, -4547, -1045, 2821, 5442, 6071, 4401, 876, -2892, -5425, -5872, -3865, -151, 3503, 5723, 5867, 3696, -9, -3570, -5679, -5604, -3110, 730, 4122, 5905, 5574, 2966, -854, -4148, -5823, -5243, -2359, 1517, 4619, 5971, 5161, 2214, -1612, -4624, -5845, -4746, -1556, 2261, 5032, 5938, 4626, 1383, -2356, -5017, -5756, -4129, -686, 2966, 5361, 5806, 4003, 512, -3047, -5342, -5572, -3451, 192, 3620, 5602, 5578, 3322, -314, -3658, -5536, -5292, -2750, 982, 4162, 5728, 5240, 2620, -1065, -4163, -5617, -4889, -1998, 1724, 4621, 5770, 4792, 1845, -1816, -4612, -5621, -4354, -1171, 2449, 5000, 5707, 4239, 1006, -2528, -4970, -5503, -3735, -325, 3128, 5278, 5545, 3626, 193, -3170, -5236, -5293, -3094, 467, 3701, 5476, 5286, 2981, -570, -3720, -5386, -4968, -2391, 1214, 4202, 5568, 4920, 2256, -1307, -4191, -5439, -4512, -1613, 1951, 4611, 5568, 4421, 1454, -2042, -4594, -5410, -4013, -859, 2587, 4917, 5480, 3930, 729, -2636, -4873, -5263, -3450, -90, 3183, 5165, 5305, 3352, -15, -3217, -5082, -5027, -2816, 641, 3709, 5314, 5013, 2683, -748, -3725, -5206, -4659, -2084, 1385, 4171, 5385, 4600, 1931, -1489, -4171, -5243, -4197, -1301, 2100, 4568, 5365, 4126, 1151, -2185, -4542, -5177, -3667, -525, 2750, 4866, 5251, 3592, 418, -2783, -4799, -5003, -3101, 192, 3301, 5060, 5017, 2976, -300, -3316, -4961, -4707, -2419, 923, 3782, 5176, 4679, 2288, -1033, -3785, -5054, -4316, -1683, 1645, 4203, 5217, 4270, 1546, -1732, -4188, -5045, -3848, -927, 2310, 4543, 5156, 3821, 885, -2297, -4451, -4926, -3347, -258, 2862, 4778, 4999, 3294, 200, -2838, -4677, -4703, -2743, 460, 3363, 4939, 4736, 2650, -516, -3341, -4817, -4395, -2054, 1169, 3824, 5031, 4396, 1969, -1220, -3777, -4871, -3997, -1343, 1840, 4197, 5032, 3987, 1283, -1859, -4127, -4837, -3587, -728, 2367, 4450, 4921, 3524, 627, -2408, -4386, -4685, -3044, -40, 2908, 4661, 4734, 2936, -88, -2943, -4583, -4441, -2411, 690, 3404, 4807, 4455, 2286, -789, -3411, -4691, -4121, -1740, 1369, 3827, 4869, 4113, 1621, -1446, -3800, -4703, -3723, -1077, 1971, 4148, 4827, 3720, 1041, -1966, -4069, -4613, -3254, -441, 2512, 4393, 4707, 3199, 366, -2510, -4301, -4433, -2677, 263, 3021, 4583, 4490, 2607, -330, -3004, -4457, -4169, -2050, 941, 3471, 4680, 4205, 1996, -988, -3423, -4533, -3837, -1431, 1562, 3834, 4693, 3846, 1385, -1572, -3762, -4509, -3427, -805, 2124, 4124, 4628, 3383, 726, -2129, -4041, -4395, -2948, -174, 2602, 4323, 4465, 2850, 55, -2646, -4241, -4204, -2367, 506, 3091, 4474, 4236, 2272, -607, -3091, -4360, -3928, -1773, 1141, 3486, 4533, 3933, 1682, -1202, -3462, -4379, -3566, -1169, 1706, 3809, 4516, 3555, 1112, -1708, -3730, -4306, -3119, -538, 2232, 4060, 4423, 3078, 459, -2238, -3976, -4169, -2595, 137, 2730, 4255, 4245, 2550, -193, -2703, -4142, -3953, -2048, 760, 3158, 4363, 3998, 2000, -786, -3110, -4213, -3659, -1490, 1320, 3499, 4381, 3655, 1419, -1346, -3439, -4196, -3264, -869, 1867, 3792, 4331, 3232, 786, -1882, -3717, -4116, -2823, -273, 2331, 3990, 4200, 2756, 155, -2374, -3918, -3962, -2303, 370, 2809, 4154, 4023, 2267, -416, -2785, -4040, -3726, -1791, 941, 3195, 4239, 3743, 1716, -999, -3162, -4091, -3385, -1189, 1513, 3528, 4243, 3373, 1110, -1550, -3471, -4057, -2966, -551, 2054, 3806, 4177, 2935, 465, -2078, -3731, -3946, -2487, 86, 2550, 3998, 4031, 2443, -151, -2541, -3894, -3756, -1977, 667, 2965, 4114, 3800, 1922, -714, -2938, -3973, -3463, -1417, 1233, 3309, 4146, 3454, 1339, -1275, -3263, -3975, -3079, -807, 1770, 3595, 4109, 3057, 722, -1794, -3527, -3897, -2639, -197, 2267, 3808, 3991, 2607, 130, -2259, -3712, -3754, -2214, 317, 2640, 3925, 3818, 2186, -346, -2603, -3801, -3522, -1728, 845, 2990, 3993, 3552, 1655, -891, -2953, -3849, -3205, -1153, 1382, 3305, 4000, 3198, 1067, -1424, -3246, -3821, -2816, -565, 1894, 3548, 3935, 2803, 491, -1902, -3471, -3715, -2394, 2, 2337, 3722, 3793, 2370, -49, -2310, -3619, -3530, -1932, 531, 2706, 3825, 3567, 1865, -583, -2681, -3701, -3260, -1397, 1070, 3041, 3881, 3289, 1364, -1076, -2969, -3716, -2957, -896, 1528, 3283, 3849, 2953, 824, -1562, -3220, -3670, -2584, -349, 1990, 3494, 3759, 2571, 300, -1985, -3403, -3538, -2169, 168, 2383, 3636, 3590, 2115, -233, -2366, -3527, -3314, -1675, 706, 2736, 3723, 3340, 1598, -763, -2714, -3586, -3030, -1141, 1220, 3039, 3740, 3033, 1063, -1267, -2995, -3572, -2694, -609, 1694, 3276, 3694, 2717, 597, -1665, -3179, -3482, -2324, -119, 2095, 3441, 3567, 2314, 88, -2060, -3336, -3329, -1914, 353, 2425, 3547, 3381, 1851, -420, -2421, -3440, -3106, -1427, 867, 2761, 3615, 3133, 1349, -929, -2725, -3466, -2813, -919, 1353, 3022, 3599, 2824, 849, -1386, -2967, -3426, -2493, -444, 1767, 3232, 3521, 2481, 379, -1772, -3148, -3311, -2099, 47, 2140, 3364, 3376, 2053, -117, -2134, -3275, -3134, -1657, 552, 2479, 3459, 3176, 1601, -608, -2455, -3344, -2908, -1193, 1020, 2770, 3486, 2924, 1134, -1054, -2721, -3338, -2629, -741, 1431, 2988, 3452, 2624, 679, -1453, -2925, -3274, -2287, -276, 1819, 3161, 3365, 2255, 206, -1829, -3087, -3148, -1884, 218, 2174, 3289, 3201, 1827, -286, -2169, -3189, -2960, -1451, 693, 2490, 3356, 2993, 1392, -736, -2453, -3220, -2729, -1014, 1109, 2739, 3359, 2737, 964, -1142, -2692, -3200, -2435, -580, 1501, 2944, 3301, 2405, 496, -1530, -2884, -3119, -2069, -104, 1871, 3096, 3194, 2029, 26, -1890, -3025, -2991, -1683, 356, 2200, 3192, 3029, 1637, -423, -2188, -3098, -2794, -1284, 788, 2482, 3240, 2824, 1229, -832, -2444, -3108, -2551, -871, 1178, 2696, 3217, 2538, 789, -1217, -2658, -3069, -2233, -407, 1567, 2895, 3165, 2201, 323, -1602, -2834, -2979, -1868, 57, 1924, 3029, 3040, 1828, -129, -1929, -2947, -2831, -1502, 491, 2228, 3108, 2881, 1482, -500, -2172, -2985, -2632, -1119, 871, 2463, 3124, 2646, 1077, -890, -2407, -2983, -2360, -692, 1258, 2674, 3095, 2361, 631, -1275, -2614, -2940, -2047, -246, 1627, 2831, 3028, 2035, 196, -1623, -2763, -2840, -1708, 182, 1954, 2941, 2906, 1683, -213, -1919, -2845, -2681, -1349, 576, 2212, 3004, 2712, 1317, -606, -2179, -2890, -2463, -950, 966, 2444, 3021, 2460, 894, -996, -2401, -2885, -2184, -524, 1341, 2634, 2978, 2171, 459, -1354, -2579, -2821, -1880, -103, 1677, 2776, 2893, 1863, 56, -1665, -2698, -2705, -1556, 281, 1950, 2864, 2736, 1523, -328, -1939, -2771, -2521, -1185, 672, 2207, 2903, 2536, 1123, -716, -2182, -2793, -2291, -783, 1047, 2420, 2907, 2290, 719, -1085, -2381, -2778, -2021, -378, 1405, 2591, 2852, 2012, 314, -1411, -2537, -2697, -1735, 2, 1693, 2710, 2744, 1707, -58, -1694, -2638, -2558, -1398, 386, 1962, 2782, 2577, 1340, -441, -1952, -2690, -2360, -1015, 774, 2196, 2806, 2369, 943, -819, -2180, -2706, -2128, -626, 1132, 2394, 2794, 2122, 559, -1163, -2357, -2661, -1873, -254, 1444, 2533, 2717, 1847, 193, -1462, -2481, -2566, -1573, 121, 1719, 2638, 2588, 1518, -189, -1724, -2560, -2401, -1221, 502, 1965, 2695, 2418, 1149, -561, -1968, -2608, -2211, -852, 865, 2189, 2702, 2210, 778, -912, -2167, -2601, -1985, -489, 1190, 2354, 2669, 1964, 427, -1217, -2314, -2544, -1719, -139, 1474, 2480, 2578, 1670, 62, -1499, -2424, -2422, -1397, 241, 1741, 2564, 2441, 1336, -323, -1758, -2503, -2266, -1050, 614, 1978, 2611, 2264, 987, -674, -1967, -2525, -2072, -703, 939, 2170, 2604, 2060, 648, -982, -2143, -2497, -1843, -365, 1237, 2314, 2547, 1794, 289, -1275, -2275, -2416, -1550, -5, 1516, 2421, 2452, 1490, -72, -1539, -2372, -2290, -1231, 360, 1761, 2493, 2303, 1166, -435, -1772, -2430, -2131, -916, 699, 1966, 2521, 2131, 849, -744, -1961, -2433, -1938, -597, 995, 2137, 2491, 1905, 512, -1043, -2118, -2385, -1689, -237, 1277, 2273, 2423, 1634, 151, -1320, -2239, -2295, -1396, 130, 1547, 2370, 2314, 1322, -216, -1582, -2325, -2169, -1076, 480, 1793, 2425, 2174, 1008, -549, -1801, -2364, -1998, -765, 797, 1982, 2434, 1974, 677, -860, -1984, -2346, -1769, -415, 1103, 2143, 2399, 1721, 323, -1161, -2129, -2291, -1500, -52, 1386, 2268, 2318, 1440, -48, -1431, -2239, -2185, -1204, 300, 1644, 2343, 2200, 1137, -384, -1667, -2292, -2046, -899, 620, 1849, 2375, 2025, 834, -688, -1846, -2304, -1839, -587, 917, 2008, 2356, 1808, 495, -974, -2004, -2265, -1607, -245, 1198, 2139, 2302, 1553, 155, -1242, -2117, -2188, -1350, 93, 1446, 2236, 2210, 1283, -173, -1481, -2195, -2078, -1073, 399, 1652, 2284, 2073, 999, -473, -1678, -2224, -1912, -770, 691, 1837, 2287, 1884, 684, -755, -1845, -2213, -1704, -448, 982, 1979, 2267, 1667, 382, -1013, -1963, -2171, -1472, -132, 1236, 2095, 2201, 1433, 62, -1262, -2067, -2092, -1225, 174, 1462, 2170, 2098, 1176, -234, -1473, -2129, -1962, -950, 464, 1653, 2204, 1945, 883, -530, -1660, -2149, -1789, -647, 752, 1817, 2203, 1751, 568, -807, -1819, -2132, -1583, -336, 1032, 1954, 2173, 1534, 254, -1072, -1936, -2085, -1370, -59, 1237, 2035, 2091, 1308, -29, -1289, -2017, -1995, -1125, 224, 1450, 2094, 1973, 1038, -314, -1483, -2062, -1845, -845, 516, 1628, 2123, 1819, 746, -598, -1657, -2084, -1677, -546, 794, 1788, 2118, 1627, 446, -870, -1798, -2056, -1474, -254, 1051, 1906, 2074, 1418, 160, -1105, -1894, -1991, -1251, 23, 1266, 1989, 1985, 1179, -120, -1312, -1966, -1871, -996, 316, 1456, 2034, 1848, 895, -410, -1498, -2004, -1730, -714, 598, 1627, 2054, 1686, 612, -686, -1651, -2003, -1553, -428, 856, 1764, 2033, 1505, 336, -922, -1771, -1962, -1356, -157, 1080, 1865, 1969, 1289, 55, -1139, -1862, -1879, -1122, 126, 1286, 1932, 1863, 1030, -229, -1335, -1917, -1757, -857, 410, 1469, 1974, 1726, 759, -507, -1506, -1945, -1610, -585, 671, 1623, 1978, 1571, 495, -755, -1642, -1927, -1441, -323, 901, 1740, 1935, 1380, 226, -969, -1745, -1866, -1231, -56, 1111, 1825, 1862, 1148, -46, -1170, -1822, -1773, -994, 219, 1304, 1882, 1754, 891, -324, -1363, -1866, -1656, -729, 493, 1476, 1909, 1621, 640, -581, -1509, -1874, -1505, -481, 720, 1604, 1894, 1452, 388, -802, -1623, -1846, -1320, -229, 940, 1710, 1846, 1248, 123, -1014, -1721, -1779, -1107, 44, 1146, 1788, 1770, 1016, -151, -1211, -1786, -1680, -865, 312, 1321, 1835, 1666, 794, -381, -1358, -1808, -1566, -629, 550, 1467, 1846, 1525, 561, -612, -1487, -1801, -1407, -388, 765, 1585, 1814, 1346, 300, -827, -1595, -1758, -1213, -132, 969, 1674, 1766, 1134, 37, -1032, -1674, -1690, -989, 133, 1162, 1744, 1675, 912, -221, -1213, -1729, -1593, -769, 372, 1325, 1767, 1564, 690, -445, -1355, -1740, -1463, -540, 590, 1450, 1765, 1407, 446, -667, -1479, -1727, -1292, -293, 803, 1559, 1732, 1223, 194, -875, -1578, -1678, -1096, -31, 1008, 1641, 1671, 1015, -59, -1064, -1644, -1604, -889, 208, 1178, 1689, 1582, 803, -290, -1224, -1680, -1500, -673, 426, 1317, 1708, 1452, 585, -508, -1357, -1682, -1355, -438, 641, 1433, 1693, 1289, 339, -719, -1470, -1662, -1194, -209, 831, 1523, 1649, 1106, 94, -916, -1553, -1611, -1007, 30, 1012, 1590, 1580, 920, -138, -1081, -1607, -1523, -813, 253, 1168, 1631, 1476, 710, -362, -1229, -1623, -1406, -584, 465, 1301, 1637, 1346, 475, -571, -1355, -1627, -1256, -351, 676, 1407, 1621, 1178, 241, -768, -1447, -1597, -1095, -120, 861, 1495, 1574, 1012, 20, -943, -1517, -1535, -925, 96, 1026, 1553, 1494, 820, -200, -1093, -1553, -1432, -714, 310, 1167, 1574, 1374, 601, -414, -1227, -1569, -1307, -486, 520, 1295, 1576, 1244, 372, -617, -1345, -1565, -1158, -259, 721, 1392, 1553, 1075, 147, -812, -1436, -1523, -1001, -41, 896, 1468, 1504, 924, -34, -956, -1476, -1450, -819, 161, 1041, 1521, 1418, 735, -258, -1100, -1519, -1347, -607, 374, 1174, 1530, 1298, 514, -467, -1224, -1522, -1217, -388, 577, 1285, 1517, 1154, 294, -655, -1326, -1494, -1083, -182, 744, 1363, 1487, 1000, 97, -821, -1390, -1450, -919, 16, 907, 1427, 1419, 818, -118, -978, -1440, -1370, -715, 228, 1054, 1466, 1324, 622, -328, -1111, -1469, -1259, -509, 430, 1173, 1474, 1201, 414, -520, -1219, -1462, -1132, -308, 612, 1261, 1448, 1063, 218, -689, -1303, -1426, -986, -117, 778, 1333, 1412, 900, 19, -859, -1366, -1372, -805, 98, 929, 1385, 1322, 710, -195, -994, -1407, -1288, -621, 298, 1056, 1415, 1227, 515, -401, -1121, -1428, -1173, -419, 495, 1171, 1413, 1109, 328, -581, -1219, -1412, -1050, -238, 653, 1260, 1394, 984, 142, -740, -1304, -1373, -884, -24, 819, 1308, 1320, 793, -78, -886, -1353, -1307, -721, 162, 940, 1344, 1246, 609, -260, -1002, -1366, -1220, -554, 333, 1050, 1364, 1154, 444, -437, -1107, -1376, -1112, -375, 508, 1143, 1351, 1020, 252, -605, -1194, -1343, -966, -183, 663, 1211, 1310, 877, 59, -754, -1260, -1296, -810, 19, 803, 1269, 1247, 714, -136, -898, -1312, -1234, -642, 213, 944, 1305, 1173, 538, -320, -1013, -1331, -1146, -480, 380, 1046, 1308, 1070, 363, -482, -1107, -1319, -1020, -292, 542, 1130, 1288, 940, 189, -620, -1171, -1283, -880, -105, 692, 1186, 1249, 793, -4, -775, -1230, -1236, -729, 86, 829, 1239, 1186, 640, -185, -893, -1266, -1159, -573, 257, 937, 1255, 1098, 473, -345, -996, -1271, -1064, -400, 413, 1036, 1253, 988, 296, -509, -1085, -1260, -939, -214, 569, 1117, 1223, 862, 109, -655, -1158, -1227, -802, -32, 716, 1167, 1189, 711, -68, -790, -1207, -1172, -660, 137, 839, 1202, 1120, 564, -235, -904, -1229, -1090, -494, 300, 942, 1217, 1019, 395, -398, -1000, -1227, -983, -318, 464, 1028, 1208, 902, 214, -553, -1079, -1213, -861, -140, 607, 1095, 1174, 777, 40, -691, -1137, -1174, -727, 30, 734, 1140, 1118, 644, -121, -803, -1170, -1104, -585, 186, 840, 1167, 1040, 484, -284, -914, -1189, -1019, -417, 348, 940, 1167, 944, 314, -444, -998, -1185, -909, -243, 496, 1013, 1149, 829, 137, -585, -1069, -1163, -789, -79, 632, 1071, 1115, 702, -16, -711, -1112, -1122, -668, 60, 733, 1104, 1055, 565, -172, -816, -1140, -1047, -515, 218, 840, 1119, 975, 404, -331, -911, -1155, -953, -357, 376, 925, 1122, 877, 240, -480, -992, -1143, -846, -190, 514, 994, 1101, 768, 84, -608, -1056, -1111, -734, -41, 643, 1039, 1063, 642, -51, -715, -1087, -1052, -597, 115, 742, 1075, 993, 497, -215, -816, -1107, -981, -441, 265, 841, 1091, 909, 345, -371, -904, -1113, -891, -288, 409, 916, 1075, 814, 190, -495, -974, -1090, -787, -141, 535, 974, 1049, 701, 43, -618, -1019, -1050, -662, 17, 650, 1022, 999, 564, -114, -731, -1057, -993, -520, 166, 755, 1042, 933, 420, -267, -822, -1077, -915, -372, 315, 839, 1049, 844, 273, -411, -902, -1070, -823, -230, 442, 908, 1032, 749, 132, -524, -959, -1045, -715, -87, 560, 956, 992, 628, -22, -637, -1006, -999, -587, 66, 668, 992, 940, 493, -170, -736, -1029, -933, -451, 214, 756, 1009, 873, 349, -305, -827, -1035, -856, -311, 346, 832, 1001, 785, 216, -433, -889, -1023, -760, -172, 468, 888, 980, 672, 70, -549, -943, -988, -642, -25, 574, 939, 937, 557, -75, -656, -982, -943, -516, 121, 678, 962, 879, 424, -218, -750, -998, -881, -388, 255, 758, 974, 808, 295, -340, -824, -992, -801, -252, 374, 826, 960, 717, 155, -463, -883, -982, -701, -129, 476, 873, 932, 614, 13, -570, -929, -946, -585, 19, 579, 913, 891, 502, -113, -659, -951, -900, -470, 151, 673, 932, 838, 382, -239, -738, -967, -831, -351, 268, 745, 931, 757, 251, -360, -810, -958, -745, -212, 387, 807, 919, 660, 115, -473, -864, -938, -640, -74, 501, 854, 887, 556, -27, -576, -903, -901, -531, 62, 594, 885, 845, 444, -147, -668, -925, -856, -417, 174, 675, 896, 782, 326, -274, -740, -935, -771, -295, 303, 747, 895, 698, 189, -392, -806, -925, -679, -157, 418, 793, 875, 599, 49, -495, -860, -893, -586, -23, 516, 837, 844, 500, -75, -592, -882, -858, -480, 95, 601, 857, 798, 385, -188, -675, -897, -796, -357, 214, 676, 861, 722, 254, -308, -744, -897, -714, -226, 332, 741, 861, 640, 130, -422, -799, -885, -632, -102, 439, 789, 840, 547, 5, -521, -840, -856, -533, 16, 529, 814, 803, 441, -110, -603, -860, -806, -422, 136, 611, 830, 740, 323, -230, -678, -874, -741, -299, 254, 679, 836, 662, 201, -352, -740, -870, -660, -174, 368, 728, 829, 577, 79, -447, -787, -847, -575, -57, 456, 770, 799, 486, -32, -532, -819, -812, -487, 48, 526, 797, 755, 392, -134, -609, -831, -766, -374, 157, 606, 804, 698, 274, -246, -674, -836, -696, -259, 271, 666, 807, 623, 161, -356, -728, -825, -621, -138, 369, 713, 789, 539, 50, -447, -761, -805, -529, -38, 459, 742, 758, 446, -64, -531, -795, -762, -430, 82, 535, 768, 704, 339, -180, -604, -814, -710, -320, 197, 609, 779, 647, 226, -282, -673, -809, -647, -207, 298, 657, 771, 570, 116, -383, -718, -791, -569, -98, 389, 692, 747, 497, 39, -436, -728, -769, -514, -50, 402, 695, 713, 458, -4, -446, -727, -743, -471, -17, 424, 690, 698, 419, -38, -471, -730, -726, -441, 14, 448, 694, 685, 393, -65, -495, -735, -713, -421, 47, 466, 706, 668, 369, -97, -519, -741, -704, -390, 80, 496, 714, 666, 334, -133, -554, -754, -702, -358, 123, 530, 735, 663, 300, -193, -594, -775, -670, -289, 213, 580, 746, 604, 198, -290, -650, -774, -611, -185, 298, 637, 727, 535, 92, -379, -693, -756, -527, -76, 386, 680, 706, 445, -16, -463, -724, -727, -436, 35, 461, 703, 668, 350, -126, -536, -746, -684, -343, 139, 529, 716, 622, 255, -227, -599, -755, -625, -248, 237, 581, 714, 555, 151, -316, -647, -744, -556, -142, 321, 631, 698, 480, 49, -400, -687, -722, -478, -33, 401, 664, 672, 398, -49, -472, -709, -689, -392, 70, 466, 684, 630, 312, -152, -532, -728, -647, -313, 154, 522, 690, 589, 219, -234, -596, -726, -592, -213, 242, 571, 683, 518, 120, -321, -639, -710, -525, -106, 324, 618, 665, 440, 15, -407, -670, -694, -440, -6, 403, 644, 638, 355, -78, -478, -695, -659, -361, 88, 466, 662, 595, 275, -175, -535, -704, -609, -268, 175, 524, 663, 537, 178, -265, -589, -702, -544, -171, 266, 565, 657, 467, 73, -344, -635, -687, -477, -63, 345, 607, 632, 398, -21, -421, -659, -664, -398, 25, 413, 624, 602, 314, -115, -482, -678, -622, -320, 116, 467, 640, 549, 226, -203, -538, -681, -563, -220, 202, 520, 636, 491, 132, -288, -583, -674, -498, -124, 287, 558, 620, 423, 37, -364, -617, -654, -431, -30, 359, 590, 600, 356, -55, -430, -644, -621, -356, 60, 415, 607, 560, 275, -139, -485, -654, -576, -262, 141, 478, 609, 510, 180, -226, -536, -653, -522, -171, 229, 518, 609, 447, 89, -309, -577, -645, -460, -70, 1, -3, 3, -2, 1, 0, -1, 0, 0, 1, 0, 0, 0, -2, 3, -3, 2, 0, -2, 3, -2, 1, 0, 0, -2, 3, -4, 5, -5, 4, -3, 3, -3, 3, -3, 3, -3, 2, -1, 1, -1, 2, -3, 2, -1, 0, 1, 0, -2, 3, -3, 2, 0, -2, 3, -2, 0, 2, -3, 3, -3, 3, -2, 1, 0, -1, 0, 3, -5, 5, -4, 2, 0, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 0, -1, 1, -1, 2, -2, 1, -1, 1, 0, 1, -3, 3, -3, 3, -2, 2, -3, 3, -3, 3, -3, 3, -3, 3, -3, 3, -2, 1, -1, 1, 0, -1, 1, 0, -1, 2, -2, 1, }; fldigi-4.2.05/src/filters/0000775000175000017500000000000014611714005012301 500000000000000fldigi-4.2.05/src/filters/viterbi.cxx0000664000175000017500000001307614532252172014424 00000000000000// ---------------------------------------------------------------------------- // viterbi.cxx -- Viterbi decoder // // Copyright (C) 2006 // Dave Freese, W1HKJ // // Adapted from code contained in gmfsk source code distribution. // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "viterbi.h" #include "misc.h" /* ---------------------------------------------------------------------- */ viterbi::viterbi(int k, int poly1, int poly2) { outsize = 1 << k; nstates = 1 << (k - 1); _k = k; _poly1 = poly1; _poly2 = poly2; output = new int[outsize]; for (int i = 0; i < PATHMEM; i++) { metrics[i] = new int[nstates]; history[i] = new int[nstates]; } init(); } viterbi::~viterbi() { if (output) delete [] output; for (int i = 0; i < PATHMEM; i++) { if (metrics[i]) delete [] metrics[i]; if (history[i]) delete [] history[i]; } } void viterbi::init(void) { if(output) { _traceback = _k * 12; // takes >= 12 constraint lengths to calculate from an arbitrary state, when punctured _chunksize = 8; for (int i = 0; i < outsize; i++) { output[i] = parity(_poly1 & i) | (parity(_poly2 & i) << 1); } for (int i = 0; i < 256; i++) { mettab[0][i] = 128 - i; mettab[1][i] = i - 128; } memset(sequence, 0, sizeof(sequence)); reset(); } } void viterbi::reset() { for (int i = 0; i < PATHMEM; i++) { memset(metrics[i], 0, nstates * sizeof(int)); memset(history[i], 0, nstates * sizeof(int)); } ptr = 0; } int viterbi::settraceback(int trace) { if (trace < 0 || trace > PATHMEM - 1) return -1; _traceback = trace; return 0; } int viterbi::setchunksize(int chunk) { if (chunk < 1 || chunk > _traceback) return -1; _chunksize = chunk; return 0; } int viterbi::traceback(int *metric) { int bestmetric, beststate; unsigned int p, c = 0; p = (ptr - 1) % PATHMEM; // Find the state with the best metric bestmetric = INT_MIN; beststate = 0; for (int i = 0; i < nstates; i++) { if (metrics[p][i] > bestmetric) { bestmetric = metrics[p][i]; beststate = i; } } // Trace back 'traceback' steps, starting from the best state sequence[p] = beststate; for (int i = 0; i < _traceback; i++) { unsigned int prev = (p - 1) % PATHMEM; sequence[prev] = history[p][sequence[p]]; p = prev; } if (metric) *metric = metrics[p][sequence[p]]; // Decode 'chunksize' bits for (int i = 0; i < _chunksize; i++) { // low bit of state is the previous input bit c = (c << 1) | (sequence[p] & 1); p = (p + 1) % PATHMEM; } if (metric) *metric = metrics[p][sequence[p]] - *metric; return c; } int viterbi::decode(unsigned char *sym, int *metric) { unsigned int currptr, prevptr; int met[4]; currptr = ptr; prevptr = (currptr - 1) % PATHMEM; // if (prevptr < 0) prevptr = PATHMEM - 1; met[0] = mettab[0][sym[1]] + mettab[0][sym[0]]; met[1] = mettab[0][sym[1]] + mettab[1][sym[0]]; met[2] = mettab[1][sym[1]] + mettab[0][sym[0]]; met[3] = mettab[1][sym[1]] + mettab[1][sym[0]]; // met[0] = 256 - sym[1] - sym[0]; // met[1] = sym[0] - sym[1]; // met[2] = sym[1] - sym[0]; // met[3] = sym[0] + sym[1] - 256; for (int n = 0; n < nstates; n++) { int p0, p1, s0, s1, m0, m1; m0 = 0; m1 = 0; s0 = n; s1 = n + nstates; p0 = s0 >> 1; p1 = s1 >> 1; m0 = metrics[prevptr][p0] + met[output[s0]]; m1 = metrics[prevptr][p1] + met[output[s1]]; if (m0 > m1) { metrics[currptr][n] = m0; history[currptr][n] = p0; } else { metrics[currptr][n] = m1; history[currptr][n] = p1; } } ptr = (ptr + 1) % PATHMEM; if ((ptr % _chunksize) == 0) return traceback(metric); if (metrics[currptr][0] > INT_MAX / 2) { for (int i = 0; i < PATHMEM; i++) for (int j = 0; j < nstates; j++) metrics[i][j] -= INT_MAX / 2; } if (metrics[currptr][0] < INT_MIN / 2) { for (int i = 0; i < PATHMEM; i++) for (int j = 0; j < nstates; j++) metrics[i][j] += INT_MIN / 2; } return -1; } /* ---------------------------------------------------------------------- */ #include encoder::encoder(int k, int poly1, int poly2) { int size = 1 << k; /* size of the output table */ output = new int[size]; _k = k; _poly1 = poly1; _poly2 = poly2; init(); } encoder::~encoder() { delete [] output; } int encoder::encode(int bit) { shreg = (shreg << 1) | !!bit; return output[shreg & shregmask]; } void encoder::init(void) { if(output) { int size = 1 << _k; /* size of the output table */ // output contains 2 bits in positions 0 and 1 describing the state machine // for each bit delay, ie: for k = 7 there are 128 possible state pairs. // the modulo-2 addition for polynomial 1 is in bit 0 // the modulo-2 addition for polynomial 2 is in bit 1 // the allowable state outputs are 0, 1, 2 and 3 for (int i = 0; i < size; i++) { output[i] = parity(_poly1 & i) | (parity(_poly2 & i) << 1); } shreg = 0; shregmask = size - 1; } } fldigi-4.2.05/src/filters/fftfilt.cxx0000664000175000017500000002001514611711171014402 00000000000000// ---------------------------------------------------------------------------- // fftfilt.cxx -- Fast convolution Overlap-Add filter // // Filter implemented using overlap-add FFT convolution method // h(t) characterized by Windowed-Sinc impulse response // // Reference: // "The Scientist and Engineer's Guide to Digital Signal Processing" // by Dr. Steven W. Smith, http://www.dspguide.com // Chapters 16, 18 and 21 // // Copyright (C) 2006-2008 Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "misc.h" #include "fftfilt.h" //------------------------------------------------------------------------------ // initialize the filter // create forward and reverse FFTs //------------------------------------------------------------------------------ // probably only need a single instance of g_fft !! // use for both forward and reverse void fftfilt::clear_filter() { for (int i = 0; i < flen; i++) { filter[i] = 0; timedata[i] = 0; freqdata[i] = 0; output[i] = 0; ht[i] = 0; } for (int i = 0; i < flen2; i++) ovlbuf[i] = 0; inptr = 0; } void fftfilt::init_filter() { flen2 = flen >> 1; fft = new g_fft(flen); filter = new cmplx[flen]; timedata = new cmplx[flen]; freqdata = new cmplx[flen]; output = new cmplx[flen]; ovlbuf = new cmplx[flen2]; ht = new cmplx[flen]; } // number of samples needed to completely flush the filter int fftfilt::flush_size() { return flen - inptr; } //------------------------------------------------------------------------------ // fft filter // f1 < f2 ==> band pass filter // f1 > f2 ==> band reject filter // f1 == 0 ==> low pass filter // f2 == 0 ==> high pass filter //------------------------------------------------------------------------------ fftfilt::fftfilt(double f1, double f2, int len) { flen = len; init_filter(); create_filter(f1, f2); } //------------------------------------------------------------------------------ // low pass filter //------------------------------------------------------------------------------ fftfilt::fftfilt(double f, int len) { flen = len; init_filter(); create_lpf(f); } fftfilt::~fftfilt() { if (fft) delete fft; if (filter) delete [] filter; if (timedata) delete [] timedata; if (freqdata) delete [] freqdata; if (output) delete [] output; if (ovlbuf) delete [] ovlbuf; if (ht) delete [] ht; } void fftfilt::create_filter(double f1, double f2) { clear_filter(); // initialize the filter to zero for (int i = 0; i < flen; i++) ht[i] = 0; // create the filter shape coefficients by fft // filter values initialized to the ht response h(t) bool b_lowpass, b_highpass;//, window; b_lowpass = (f2 != 0); b_highpass = (f1 != 0); for (int i = 0; i < flen2; i++) { ht[i] = 0; //combine lowpass / highpass // lowpass @ f2 if (b_lowpass) ht[i] += fsinc(f2, i, flen2); // highighpass @ f1 if (b_highpass) ht[i] -= fsinc(f1, i, flen2); } // highpass is delta[flen2/2] - h(t) if (b_highpass && f2 < f1) ht[flen2 / 2] += 1; for (int i = 0; i < flen2; i++) ht[i] *= _blackman(i, flen2); // this may change since green fft is in place fft memcpy(filter, ht, flen * sizeof(cmplx)); // ht is flen complex points with imaginary all zero // first half describes h(t), second half all zeros // perform the cmplx forward fft to obtain H(w) // filter is flen/2 complex values fft->ComplexFFT(filter); // fft->transform(ht, filter); // normalize the output filter for unity gain double scale = 0, mag; for (int i = 0; i < flen2; i++) { mag = abs(filter[i]); if (mag > scale) scale = mag; } if (scale != 0) { for (int i = 0; i < flen; i++) filter[i] /= scale; } // perform the reverse fft to obtain h(t) // for testing // uncomment to obtain filter characteristics /* cmplx *revht = new cmplx[flen]; memcpy(revht, filter, flen * sizeof(cmplx)); fft->InverseComplexFFT(revht); std::fstream fspec; fspec.open("fspec.csv", std::ios::out); fspec << "i,imp.re,imp.im,filt.re,filt.im,filt.abs,revimp.re,revimp.im\n"; for (int i = 0; i < flen2; i++) fspec << i << "," << ht[i].real() << "," << ht[i].imag() << "," << filter[i].real() << "," << filter[i].imag() << "," << abs(filter[i]) << "," << revht[i].real() << "," << revht[i].imag() << "," << std::endl; fspec.close(); delete [] revht; */ // start output after 2 full passes are complete pass = 1; } /* * Filter with fast convolution (overlap-add algorithm). */ int fftfilt::run(const cmplx & in, cmplx **out) { // collect flen/2 input samples timedata[inptr++] = in; if (inptr < flen2) return 0; if (pass) --pass; // filter output is not stable until 2 passes // FFT transpose to the frequency domain memcpy(freqdata, timedata, flen * sizeof(cmplx)); fft->ComplexFFT(freqdata); // multiply with the filter shape for (int i = 0; i < flen; i++) freqdata[i] *= filter[i]; // transform back to time domain fft->InverseComplexFFT(freqdata); // overlap and add // save the second half for overlapping next inverse FFT for (int i = 0; i < flen2; i++) { output[i] = ovlbuf[i] + freqdata[i]; ovlbuf[i] = freqdata[i+flen2]; } // clear inbuf pointer inptr = 0; // signal the caller there is flen/2 samples ready if (pass) return 0; *out = output; return flen2; } //------------------------------------------------------------------------------ // rtty filter //------------------------------------------------------------------------------ //bool print_filter = true; // flag to inhibit printing multiple copies void fftfilt::rtty_filter(double f) { // Raised cosine filter designed iaw Section 1.2.6 of // Telecommunications Measurements, Analysis, and Instrumentation // by Dr. Kamilo Feher / Engineers of Hewlett-Packard // // Frequency scaling factor determined hueristically by testing various values // and measuring resulting decoder CER with input s/n = - 9 dB // // K CER // 1.0 .0244 // 1.1 .0117 // 1.2 .0081 // 1.3 .0062 // 1.4 .0054 // 1.5 .0062 // 1.6 .0076 f *= 1.4; double dht; for( int i = 0; i < flen2; ++i ) { double x = (double)i/(double)(flen2); // raised cosine response (changed for -1.0...+1.0 times Nyquist-f // instead of books versions ranging from -1..+1 times samplerate) dht = x <= 0 ? 1.0 : x > 2.0 * f ? 0.0 : cos((M_PI * x) / (f * 4.0)); dht *= dht; // cos^2 // amplitude equalized nyquist-channel response dht /= sinc(2.0 * i * f); filter[i] = cmplx( dht*cos((double)i* - 0.5*M_PI), dht*sin((double)i* - 0.5*M_PI) ); filter[(flen-i)%flen] = cmplx( dht*cos((double)i*+0.5*M_PI), dht*sin((double)i*+0.5*M_PI) ); } // perform the reverse fft to obtain h(t) // for testing // uncomment to obtain filter characteristics /* cmplx *revht = new cmplx[flen]; memcpy(revht, filter, flen * sizeof(cmplx)); fft->InverseComplexFFT(revht); std::fstream fspec; fspec.open("rtty_filter.csv", std::ios::out); fspec << "i,filt.re,filt.im,filt.abs,,revimp.re,revimp.im\n"; for (int i = 0; i < flen; i++) fspec << i << "," << filter[i].real() << "," << filter[i].imag() << "," << abs(filter[i]) << ",," << revht[i].real() << "," << revht[i].imag() << std::endl; fspec.close(); delete [] revht; */ // start output after 2 full passes are complete pass = 1; } fldigi-4.2.05/src/filters/filters.cxx0000664000175000017500000003661614611711171014432 00000000000000// ---------------------------------------------------------------------------- // // filters.cxx -- Several Digital Filter classes used in fldigi // // Copyright (C) 2006-2008 Dave Freese, W1HKJ // // These filters are based on the gmfsk design and the design notes given in // "Digital Signal Processing, A Practical Guid for Engineers and Scientists" // by Steven W. Smith. // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "filters.h" #include //===================================================================== // C_FIR_filter // // a class of Finite Impulse Response (FIR) filters with // decimate in time capability // //===================================================================== C_FIR_filter::C_FIR_filter () { pointer = counter = length = 0; decimateratio = 1; ifilter = qfilter = (double *)0; ffreq = 0.0; } C_FIR_filter::~C_FIR_filter() { if (ifilter) delete [] ifilter; if (qfilter) delete [] qfilter; } void C_FIR_filter::init(int len, int dec, double *itaps, double *qtaps) { length = len; decimateratio = dec; if (ifilter) { delete [] ifilter; ifilter = (double *)0; } if (qfilter) { delete [] qfilter; qfilter = (double *)0; } for (int i = 0; i < FIRBufferLen; i++) ibuffer[i] = qbuffer[i] = 0.0; if (itaps) { ifilter = new double[len]; for (int i = 0; i < len; i++) ifilter[i] = itaps[i]; } if (qtaps) { qfilter = new double[len]; for (int i = 0; i < len; i++) qfilter[i] = qtaps[i]; } pointer = len; counter = 0; } //===================================================================== // Create a band pass FIR filter with 6 dB corner frequencies // of 'f1' and 'f2'. (0 <= f1 < f2 <= 0.5) //===================================================================== double * C_FIR_filter::bp_FIR(int len, int hilbert, double f1, double f2) { double *fir; double t, h, x; fir = new double[len]; for (int i = 0; i < len; i++) { t = i - (len - 1.0) / 2.0; h = i * (1.0 / (len - 1.0)); if (!hilbert) { x = (2 * f2 * sinc(2 * f2 * t) - 2 * f1 * sinc(2 * f1 * t)) * hamming(h); } else { x = (2 * f2 * cosc(2 * f2 * t) - 2 * f1 * cosc(2 * f1 * t)) * hamming(h); // The actual filter code assumes the impulse response // is in time reversed order. This will be anti- // symmetric so the minus sign handles that for us. x = -x; } fir[i] = x; } return fir; } //===================================================================== // Filter will be a lowpass with // length = len // decimation = dec // 0.5 frequency point = freq //===================================================================== void C_FIR_filter::init_lowpass (int len, int dec, double freq) { double *fi = bp_FIR(len, 0, 0.0, freq); ffreq = freq; init (len, dec, fi, fi); delete [] fi; } //===================================================================== // Filter will be a bandpass with // length = len // decimation = dec // 0.5 frequency points of f1 (low) and f2 (high) //===================================================================== void C_FIR_filter::init_bandpass (int len, int dec, double f1, double f2) { double *fi = bp_FIR (len, 0, f1, f2); init (len, dec, fi, fi); delete [] fi; } //===================================================================== // Filter will the Hilbert form //===================================================================== void C_FIR_filter::init_hilbert (int len, int dec) { double *fi = bp_FIR(len, 0, 0.05, 0.45); double *fq = bp_FIR(len, 1, 0.05, 0.45); init (len, dec, fi, fq); delete [] fi; delete [] fq; } //===================================================================== // Run // passes a cmplx value (in) and receives the cmplx value (out) // function returns 0 if the filter is not yet stable // returns 1 when stable and decimated cmplx output value is valid //===================================================================== int C_FIR_filter::run (const cmplx &in, cmplx &out) { ibuffer[pointer] = in.real(); qbuffer[pointer] = in.imag(); counter++; if (counter == decimateratio) out = cmplx ( mac(&ibuffer[pointer - length], ifilter, length), mac(&qbuffer[pointer - length], qfilter, length) ); pointer++; if (pointer == FIRBufferLen) { /// memmove is necessary if length >= FIRBufferLen/2 , theoretically possible. memmove (ibuffer, ibuffer + FIRBufferLen - length, length * sizeof (double) ); memmove (qbuffer, qbuffer + FIRBufferLen - length, length * sizeof (double) ); pointer = length; } if (counter == decimateratio) { counter = 0; return 1; } return 0; } //===================================================================== // Run the filter for the Real part of the cmplx variable //===================================================================== int C_FIR_filter::Irun (const double &in, double &out) { double *iptr = ibuffer + pointer; pointer++; counter++; *iptr = in; if (counter == decimateratio) { out = mac(iptr - length, ifilter, length); } if (pointer == FIRBufferLen) { iptr = ibuffer + FIRBufferLen - length; memcpy(ibuffer, iptr, length * sizeof(double)); pointer = length; } if (counter == decimateratio) { counter = 0; return 1; } return 0; } //===================================================================== // Run the filter for the Imaginary part of the cmplx variable //===================================================================== int C_FIR_filter::Qrun (const double &in, double &out) { double *qptr = ibuffer + pointer; pointer++; counter++; *qptr = in; if (counter == decimateratio) { out = mac(qptr - length, qfilter, length); } if (pointer == FIRBufferLen) { qptr = qbuffer + FIRBufferLen - length; memcpy(qbuffer, qptr, length * sizeof(double)); pointer = length; } if (counter == decimateratio) { counter = 0; return 1; } return 0; } //===================================================================== // Moving average filter // // Simple in concept, sublime in implementation ... the fastest filter // in the west. Also optimal for the processing of time domain signals // characterized by a transition edge. The is the perfect signal filter // for CW, RTTY and other signals of that type. For a given filter size // it provides the greatest s/n improvement while retaining the sharpest // leading edge on the filtered signal. //===================================================================== Cmovavg::Cmovavg (int filtlen) { len = filtlen; in = new double[len]; empty = true; } Cmovavg::~Cmovavg() { if (in) delete [] in; } double Cmovavg::run(double a) { if (!in) { return a; } if (empty) { empty = false; out = 0; for (int i = 0; i < len; i++) { in[i] = a; out += a; } pint = 0; return a; } out = out - in[pint] + a; in[pint] = a; if (++pint >= len) pint = 0; return out / len; } void Cmovavg::setLength(int filtlen) { if (filtlen > len) { if (in) delete [] in; in = new double[filtlen]; } len = filtlen; empty = true; } void Cmovavg::reset() { empty = true; } //===================================================================== // Sliding FFT filter // Sliding Fast Fourier Transform // // The sliding FFT ingeniously exploits the properties of a time-delayed // input and the property of linearity for its derivation. // // First of all, the N-point transform of a sequence x(n) is equal to the // summation of the transforms of N separate transforms where each transform // has just one of the original samples at it's original sample time. // //i.e. // transform of [x0, x1, x2, x3, x4, x5,...xN-1] // is equal to // transform of [x0, 0, 0, 0, 0, 0,...0] // + transform of [0, x1, 0, 0, 0, 0,...0] // + transform of [0, 0, x2, 0, 0, 0,...0] // + transform of [0, 0, 0, x3, 0, 0,...0] // . // . // . // + transform of [0, 0, 0, 0, 0, 0,...xN-1] // // Secondly, the transform of a time-delayed sequence is a phase-rotated // version of the transform of the original sequence. i.e. // // If x(n) transforms to X(k), // Then x(n-m) transforms to X(k)(Wn)^(-mk) // // where N is the FFT size, m is the delay in sample periods, and WN is the // familiar phase-rotating coefficient or twiddle factor e^(-j2p/N) // // Therefore, if the N-point transform X(k) of an individual sample is considered, // and then the sample is moved back in time by one sample period, all frequency // bins of X(k) are phase-rotated by 2pk/N radians. // // The important thing here is that the transform is not performed again because // the previous frequency results can be used by simply application of the correct // coefficients. // // This is the technique that is applied when the rectangular sampling window // slides along by one sample. The contributions of all samples that are // included in both the original and the new windows are simply phase rotated. // The end effects are that the transform of the new sample must be added, and // the transform of the oldest sample that disappeared off the end must be // subtracted. These end-effects are easy to perform if we treat the new sample // as occurring at time t = 0, because the transform of a single sample at t = 0, // say (a + bj), simply has all frequency bins equal to (a + bj). Similarly, the // oldest sample that has just disappeared off the end of the window is exactly N // samples old. I.e. it occurred at t = -N. The transform of this sample, // say (c + dj), is also straightforward since every frequency bin has now been // phase-rotated an integer number of times from when the sample was at t = 0. // (The kth frequency bin has been rotated by 2pk radians). The transform of the // sample at t = -N is therefore the same as if it was still at t = 0. I.e. it // has all frequency bins equal to (c + dj). // // All that is needed therefore is to // phase rotate each frequency bin in F(k) by WN^(k) and then // add [(a + bj) + (c + dj)] to each frequency bin. // // One cmplx multiplication and two cmplx additions per frequency bin are // therefore required, per sample period, regardless of the size of the transform. // // For example, a traditional 1024-point FFT needs 5120 cmplx multiplies // and 10240 cmplx additions to calculate all 1024 frequency bins. A 1024-point // Sliding FFT however needs 1024 cmplx multiplies and 2048 cmplx additions // for all 1024 frequency bins, and as each frequency bin is calculated separately, // it is only necessary to calculate the ones that are of interest. // // One drawback of the Sliding FFT is that in using feedback from previous // frequency bins, there is potential for instability if the coefficients are not // infinitely precise. Without infinite precision, stability can be guaranteed by // making each phase-rotation coefficient have a magnitude of slightly less than // unity. E.g. 0.9999. // // This then has to taken into account when the Nth sample is subtracted, because // the factor 0.9999 has been applied N times to the transform of this sample. // The sample cannot therefore be directly subtracted, it must first be multiplied // by the factor of 0.9999^N. This unfortunately means there is another multipli- // cation to perform per frequency bin. Another drawback is that a circular buffer // is needed in which to keep N samples, so that the oldest sample, (from t= -N), // can be subtracted each time. // // This filter is ideal for extracting a finite number of frequency bins // with a very long kernel length. The filter only needs to calculate the // values for the bins of interest and not the entire spectrum. It does // require the store of the history associated with those bins over the // kernel length. // // Use in the MFSK / DOMINO modem for extraction of the frequency spectra // //===================================================================== struct sfft::vrot_bins_pair { cmplx vrot; cmplx bins; } ; sfft::sfft(int len, int _first, int _last) { vrot_bins = new vrot_bins_pair[len]; delay = new cmplx[len]; fftlen = len; first = _first; last = _last; ptr = 0; double phi = 0.0, tau = 2.0 * M_PI/ len; k2 = 1.0; for (int i = 0; i < fftlen; i++) { vrot_bins[i].vrot = cmplx( K1 * cos (phi), K1 * sin (phi) ); phi += tau; delay[i] = vrot_bins[i].bins = 0.0; k2 *= K1; } count = 0; } sfft::~sfft() { delete [] vrot_bins; delete [] delay; } void sfft::reset() { for (int i = 0; i < fftlen; i++) delay[i] = vrot_bins[i].bins = 0.0; count = 0; } bool sfft::is_stable() { return (count >= fftlen); } // Sliding FFT, cmplx input, cmplx output // FFT is computed for each value from first to last // Values are not stable until more than "len" samples have been processed. // Copies the frequencies to a pointer with a given stride. void sfft::run(const cmplx& input, cmplx * __restrict__ result, int stride ) { cmplx & de = delay[ptr]; const cmplx z( input.real() - k2 * de.real(), input.imag() - k2 * de.imag()); de = input; ++ptr ; if( ptr >= fftlen ) ptr = 0 ; // It is more efficient to have vrot and bins very close to each other. for( vrot_bins_pair * __restrict__ itr = vrot_bins + first, * __restrict__ end = vrot_bins + last ; itr != end ; ++itr, result += stride ) { *result = itr->bins = itr->bins * itr->vrot + z * itr->vrot; } if (count < fftlen) count++; } // ============================================================================ // Goertzel filter // Optimized implementation of a DFT for a single frequency of interest // SR = sample rate // N = Block size (does not need to be a factor of 2!) // bin size = SR / N // K = frequency bin of interest = (N * freq / SR) // N should be selected to make K an integer if possible // // Q0 = current sample // Q1 = previous sample (1 delay) // Q2 = previous sample (2 delay) // w = (2 * pi * K / N) // k1 = cos(w) // k2 = sin(w) // k3 = 2.0 * k1 // Q0, Q1, Q2 are initialized to zero // Iterate N times: // Q0 = k3*Q1 - Q2 + sample // Q2 = Q1 // Q1 = Q0 // // After N interations: // real = (Q1 - Q2 * k1) // imag = Q2 * k2 // or // mag = Q1*Q1 + Q2*Q2 - Q1*Q2*k1 // ============================================================================ goertzel::goertzel(int n, double freq, double sr) { double w; w = 2 * M_PI * freq / sr; k1 = cos(w); k2 = sin(w); k3 = 2.0 * k1; Q0 = Q1 = Q2 = 0.0; count = N = n; } goertzel::~goertzel() { } void goertzel::reset() { Q0 = Q1 = Q2 = 0.0; count = N; } void goertzel::reset(int n, double freq, double sr) { double w; w = 2 * M_PI * freq / sr; k1 = cos(w); k2 = sin(w); k3 = 2.0 * k1; Q0 = Q1 = Q2 = 0.0; count = N = n; } bool goertzel::run(double sample) { Q0 = sample + k3*Q1 - Q2; Q2 = Q1; Q1 = Q0; if (count) { --count; return false; } return true; } double goertzel::real() { return ((0.5*k3*Q1 - Q2)/N); } double goertzel::imag() { return ((k2*Q1)/N); } double goertzel::mag() { return (Q2*Q2 + Q1*Q1 - k3*Q2*Q1); } fldigi-4.2.05/src/status/0000775000175000017500000000000014611714005012154 500000000000000fldigi-4.2.05/src/status/squelch_status.cxx0000664000175000017500000002155314611711171015676 00000000000000// --------------------------------------------------------------------- // squelch_status.cxx // // Copyright (C) 2021 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // --------------------------------------------------------------------- // // Save all floating point values as integers // // int_fval = fval * NNN where NNN is a factor of 10 // // restore using fval = int_fval / NNN // // A work around for a bug in class preferences. Read/Write of floating // point values fails on read if locale is not EN_... // //---------------------------------------------------------------------- #include #include #include #include #include #include "squelch_status.h" static int firstuse = 1; #define SS_160 1800000 #define SS_80 3500000 #define SS_75 3800000 #define SS_40 7000000 #define SS_30 10100000 #define SS_20 14000000 #define SS_17 18068000 #define SS_15 21000000 #define SS_12 24890000 #define SS_10 28000000 #define SS_6 50000000 #define SS_2 144000000 #define SS_220 222000000 #define SS_440 420000000 #define SS_HI 902000000 ModeBand modeband; void show_band_mode_change() { if (progdefaults.txlevel_by_mode) { progStatus.txlevel = modeband.get_mode_txlevel(); cntTxLevel->value(progStatus.txlevel); } if (progdefaults.reverse_by_mode) { progStatus.reverse = modeband.get_mode_reverse(); if (active_modem->get_cap() & modem::CAP_REV) { wf->btnRev->value(progStatus.reverse); wf->btnRev->activate(); } else { wf->btnRev->value(0); wf->btnRev->deactivate(); } } if (progdefaults.afc_by_mode) { progStatus.afconoff = modeband.get_mode_afc(); if (active_modem->get_cap() & modem::CAP_AFC) { btnAFC->value(progStatus.afconoff); btnAFC->activate(); } else { btnAFC->value(0); btnAFC->deactivate(); } } if (progdefaults.sqlch_by_mode) { progStatus.sldrSquelchValue = modeband.get_mode_squelch(); progStatus.sqlonoff = modeband.get_mode_squelch_onoff(); sldrSquelch->value(progStatus.sldrSquelchValue); btnSQL->value(progStatus.sqlonoff); } } const char * ModeBand::bands[NUMBANDS] = { "lo", "160", "80", "75", "40", "30", "20", "17", "15", "12", "10", "6", "2", "220", "440", "hi" }; bool ModeBand::band_changed() { int band = -1; if (wf->rfcarrier() < SS_160) band = BND_LO; else if (wf->rfcarrier() < SS_80) band = BND_160; else if (wf->rfcarrier() < SS_75) band = BND_80; else if (wf->rfcarrier() < SS_40) band = BND_75; else if (wf->rfcarrier() < SS_30) band = BND_40; else if (wf->rfcarrier() < SS_20) band = BND_30; else if (wf->rfcarrier() < SS_17) band = BND_20; else if (wf->rfcarrier() < SS_15) band = BND_17; else if (wf->rfcarrier() < SS_12) band = BND_15; else if (wf->rfcarrier() < SS_10) band = BND_12; else if (wf->rfcarrier() < SS_6) band = BND_10; else if (wf->rfcarrier() < SS_2) band = BND_6; else if (wf->rfcarrier() < SS_220) band = BND_2; else if (wf->rfcarrier() < SS_440) band = BND_220; else if (wf->rfcarrier() < SS_HI) band = BND_440; else band = BND_HI; if (band_in_use != band) { band_in_use = band; return true; } return false; } bool ModeBand::mode_changed() { trx_mode mode = active_modem->get_mode(); if (mode != mode_in_use) { mode_in_use = mode; return true; } return false; } void ModeBand::band_mode_change() { if (!active_modem) { std::cout << "oh shit!!" << std::endl; return; } bool bc = band_changed(); bool mc = mode_changed(); if (bc || mc ) { REQ(show_band_mode_change); } } void ModeBand::init() { for (size_t m = 0; m < NUM_MODES; m++) { for (size_t b = 0; b < NUMBANDS; b++) { mode_bands[m][b].txlevel = -120; mode_bands[m][b].rev = false; mode_bands[m][b].afc = true; mode_bands[m][b].sqstate = true; mode_bands[m][b].sqlevel = 300; } } } void ModeBand::save_mode_state() { std::string pref; Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", "mode_state"); spref.set("firstuse", 0); for (size_t m = 0; m < NUM_MODES; m++) { for (size_t b = 0; b < NUMBANDS; b++) { pref.assign(mode_info[m].sname).append(".tx_").append(bands[b]); spref.set(pref.c_str(), mode_bands[m][b].txlevel); pref.assign(mode_info[m].sname).append(".rev_").append(bands[b]); spref.set(pref.c_str(), mode_bands[m][b].rev); pref.assign(mode_info[m].sname).append(".afc_").append(bands[b]); spref.set(pref.c_str(), mode_bands[m][b].afc); pref.assign(mode_info[m].sname).append(".sqstate_").append(bands[b]); spref.set(pref.c_str(), mode_bands[m][b].sqstate); pref.assign(mode_info[m].sname).append(".sqlevel_").append(bands[b]); spref.set(pref.c_str(), mode_bands[m][b].sqlevel); } } } void ModeBand::load_mode_state() { std::string pref; Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", "mode_state"); spref.get("firstuse", firstuse, firstuse); if (firstuse) return; int val = 0; for (size_t m = MODE_NULL; m <= NUM_RXTX_MODES; m++) { for (size_t b = BND_LO; b <= BND_HI; b++) { pref.assign(mode_info[m].sname).append(".tx_").append(bands[b]); spref.get(pref.c_str(), val, mode_bands[m][b].txlevel); mode_bands[m][b].txlevel = val; pref.assign(mode_info[m].sname).append(".rev_").append(bands[b]); spref.get(pref.c_str(), val, mode_bands[m][b].rev); mode_bands[m][b].rev = val; pref.assign(mode_info[m].sname).append(".afc_").append(bands[b]); spref.get(pref.c_str(), val, mode_bands[m][b].afc); mode_bands[m][b].afc = val; pref.assign(mode_info[m].sname).append(".sqstate_").append(bands[b]); spref.get(pref.c_str(), val, mode_bands[m][b].sqstate); mode_bands[m][b].sqstate = val; pref.assign(mode_info[m].sname).append(".sqlevel_").append(bands[b]); spref.get(pref.c_str(), val, mode_bands[m][b].sqlevel); mode_bands[m][b].sqlevel = val; } } } void ModeBand::set_mode_squelch(double val) { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return; if (band_in_use < BND_LO || band_in_use > BND_HI) return; mode_bands[mode][band_in_use].sqlevel = val * 10; } double ModeBand::get_mode_squelch() { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return 0; if (band_in_use < BND_LO || band_in_use > BND_HI) return 0; return mode_bands[mode][band_in_use].sqlevel / 10.0; } void ModeBand::set_mode_squelch_onoff(int val) { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return; if (band_in_use < BND_LO || band_in_use > BND_HI) return; mode_bands[mode][band_in_use].sqstate = val; } int ModeBand::get_mode_squelch_onoff() { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return 0; if (band_in_use < BND_LO || band_in_use > BND_HI) return 0; return mode_bands[mode][band_in_use].sqstate; } void ModeBand::set_mode_txlevel(double val) { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return; if (band_in_use < BND_LO || band_in_use > BND_HI) return; mode_bands[mode][band_in_use].txlevel = val * 10.0; } double ModeBand::get_mode_txlevel() { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return 0; if (band_in_use < BND_LO || band_in_use > BND_HI) return 0; return mode_bands[mode][band_in_use].txlevel / 10; } void ModeBand::set_mode_afc(int val) { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return; if (band_in_use < BND_LO || band_in_use > BND_HI) return; mode_bands[mode][band_in_use].afc = val; } int ModeBand::get_mode_afc() { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return 0; if (band_in_use < BND_LO || band_in_use > BND_HI) return 0; return mode_bands[mode][band_in_use].afc; } void ModeBand::set_mode_reverse(int val ) { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return; if (band_in_use < BND_LO || band_in_use > BND_HI) return; mode_bands[mode][band_in_use].rev = val; } int ModeBand::get_mode_reverse() { size_t mode = (size_t)active_modem->get_mode(); if (mode < MODE_NULL || mode > NUM_RXTX_MODES) return 0; if (band_in_use < BND_LO || band_in_use > BND_HI) return 0; return mode_bands[mode][band_in_use].rev; } fldigi-4.2.05/src/status/status.cxx0000664000175000017500000014016214611711171014150 00000000000000// --------------------------------------------------------------------- // status.cxx // // Copyright (C) 2007-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // --------------------------------------------------------------------- // // Save all floating point values as integers // // int_fval = fval * NNN where NNN is a factor of 10 // // restore using fval = int_fval / NNN // // A work around for a bug in class preferences. Read/Write of floating // point values fails on read if locale is not EN_... // //---------------------------------------------------------------------- #include #include #include #include #include #include "gettext.h" #include "main.h" #include "globals.h" #include "status.h" #include "configuration.h" #include "confdialog.h" #include "fl_digi.h" #include "debug.h" #include "waterfall.h" #include "modem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "rtty.h" #include "olivia.h" #include "dominoex.h" #include "feld.h" #include "throb.h" #include "wwv.h" #include "analysis.h" #include "rigsupport.h" #include "Viewer.h" #include "lgbook.h" #include "logsupport.h" #include "qso_db.h" #include "dx_dialog.h" #include "contest.h" #include "misc.h" #include "data_io.h" #include "psm/psm.h" #include "spectrum_viewer.h" #define STATUS_FILENAME "status" status progStatus = { MODE_PSK31, // trx_mode lastmode; mode_info[MODE_PSK31].sname, // lastmode_name 50, // int mainX; 50, // int mainY; WMIN, // int mainW; HMIN, // int mainH; false, // bool WF_UI; false, // bool NO_RIGLOG; false, // bool Rig_Log_UI; false, // bool Rig_Contest_UI; false, // bool DOCKEDSCOPE; false, // bool tbar_is_docked; // 50, // int RxTextHeight; WMIN/2, // int tiled_group_x; true, // bool show_channels; 50, // int rigX; 50, // int rigY; 560, // int rigW 80, // int rigH 1000, // int carrier; 14070000ULL, // unsigned long long noCATfreq; "USB", // string noCATmode; "3000", // string noCATwidth; 1, // int mag; 0, // int offset; NORMAL, // WFdisp::WFspeed -20, // reflevel -2000, // int_reflevel 70, // ampspan 7000, // int_ampspan 50, // uint VIEWERxpos 50, // uint VIEWERypos 200, // uint VIEWERwidth 400, // uint VIEDWERheight 3.0, // double VIEWER_psksquelch 300, // int int_VIEWER_psksquelch -6.0, // double VIEWER_rttysquelch -600, // int int_VIEWER_rttysquelch 3.0, // double VIEWER_cwsquelch 300, // int int_VIEWER_cwsquelch false, // bool VIEWERvisible 50, // unsigned int fsqMONITORxpos; 50, // unsigned int fsqMONITORypos; 600, // unsigned int fsqMONITORwidth; 400, // unsigned int fsqMONITORheight; 100, // int tile_x 200, // int tile_w; 90, // int tile_y; 150, // int tile_h; 0.5, // double tile_y_ratio; 0.5, // double fsq_ratio; 0.5, // double ifkp_ratio; 500, // int int_tile_y_ratio; 500, // int int_fsq_ratio; 500, // int int_ifkp_ratio; false, // bool LOGenabled 5.0, // double sldrSquelchValue 500, // int int_sldrSquelchValue 5.0, // double sldrPwrSquelchValue 500, // int int_sldrPwrSquelchValue true, // bool afconoff true, // bool sqlonoff false, // bool reverse -12.0, // double txlevel 50, // int scopeX; 50, // int scopeY; false, // bool scopeVisible; 172, // int scopeW; 172, // int scopeH; 10, // int svX; 10, // int svY; 550, // int svW; 400, // int svH; false, // bool x_graticule; false, // bool y_graticule; true, // bool xy_graticule; -1, // int repeatMacro; 0, // float repeatIdleTime; 0, // int timer 0, // int timerMacro false, // bool skip_sked_macro "macros.mdf", // string LastMacroFile; "frequencies2.txt", // string default_frequencies_filename 0, // int n_rsids false, // bool spot_recv false, // bool spot_log false, // bool contest false, // bool quick_entry true, // bool rx_scroll_hints; true, // bool rx_word_wrap true, // bool tx_word_wrap false, // bool cluster_connected; // not saved 50, // int logbook_x; 50, // int logbook_y; 590, // int logbook_w; 490, // int logbook_h; false, // bool logbook_reverse; 85, // int logbook_browser_col_0; 47, // int logbook_browser_col_1; 100, // int logbook_browser_col_2; 110, // int logbook_browser_col_3; 120, // int logbook_browser_col_4; 103, // int logbook_browser_col_5; 50, // int dxdialog_x; 50, // int dxdialog_y; 625, // int dxdialog_w; 395, // int dxdialog_h; progdefaults.contestiatones, progdefaults.contestiabw, progdefaults.contestiasmargin, progdefaults.contestiasinteg, progdefaults.contestia8bit, progdefaults.oliviatones, progdefaults.oliviabw, progdefaults.oliviasmargin, progdefaults.oliviasinteg, progdefaults.olivia8bit, progdefaults.rtty_shift, progdefaults.rtty_custom_shift, progdefaults.rtty_baud, progdefaults.rtty_bits, progdefaults.rtty_parity, progdefaults.rtty_stop, progdefaults.rtty_reverse, progdefaults.rtty_crcrlf, progdefaults.rtty_autocrlf, progdefaults.rtty_autocount, progdefaults.rtty_afcspeed, false, // bool rtty_filter_changed progdefaults.PreferXhairScope, true, // bool shaped_rtty progdefaults.UOSrx, progdefaults.UOStx, DEFAULT_XMLPRC_IP_ADDRESS, DEFAULT_XMLRPC_IP_PORT, DEFAULT_ARQ_IP_ADDRESS, DEFAULT_ARQ_IP_PORT, DEFAULT_KISS_IP_ADDRESS, DEFAULT_KISS_IP_IO_PORT, DEFAULT_KISS_IP_OUT_PORT, progdefaults.kiss_dual_port_enabled, progdefaults.data_io_enabled, progdefaults.ax25_decode_enabled, progdefaults.enableBusyChannel, progdefaults.busyChannelSeconds, progdefaults.kpsql_attenuation, progdefaults.csma_enabled, progdefaults.kiss_tcp_io, progdefaults.kiss_tcp_listen, progdefaults.kpsql_enabled, progdefaults.csma_persistance, progdefaults.csma_slot_time, progdefaults.csma_transmit_delay, progdefaults.psm_flush_buffer_timeout, progdefaults.psm_minimum_bandwidth, progdefaults.psm_minimum_bandwidth_margin, progdefaults.psm_use_histogram, progdefaults.psm_histogram_offset_threshold, progdefaults.psm_hit_time_window, progdefaults.tx_buffer_timeout, progdefaults.kiss_io_modem_change_inhibit, true, 0.0, 0, progdefaults.psk8DCDShortFlag, "CQ", // string browser_search; false, // meters false, // fsq_rx_abort false, // ifkp_rx_abort //---------------------------------------------------------------------- // winkeyer status values //---------------------------------------------------------------------- "NONE", // string WK_serial_port_name; 1200, // int WK_comm_baudrate; 2, // int WK_stopbits; 2, // int WK_comm_retries; 5, // int WK_comm_wait; 50, // int WK_comm_timeout; false, // bool WK_comm_echo; // wkeyer defaults 0xC4, // unsigned char WK_mode_register; 18, // unsigned char WK_speed_wpm; 6, // unsigned char WK_sidetone; 50, // unsigned char WK_weight; 0, // unsigned char WK_lead_in_time; 0, // unsigned char WK_tail_time; 10, // unsigned char WK_min_wpm; 25, // unsigned char WK_max_wpm; 0, // unsigned char WK_first_extension; 0, // unsigned char WK_key_compensation; 0, // unsigned char WK_farnsworth_wpm; 50, // unsigned char WK_paddle_setpoint; 50, // unsigned char WK_dit_dah_ratio; 7, // unsigned char WK_pin_configuration; 255, // unsigned char WK_dont_care; false, // bool WK_cut_zeronine; 18, // unsigned char WK_cmd_wpm; false, // bool WK_use_pot false, // bool WK_online; 2, // int WK_version; 0, // int WKFSK_mode; 0, // int WKFSK_baud; 0, // int WKFSK_stopbits; 0, // int WKFSK_ptt; 0, // int WKFSK_polarity; 0, // int WKFSK_sidetone; 0, // int WKFSK_auto_crlf; 0, // int WKFSK_diddle; 0, // int WKFSK_diddle_char; 0, // int WKFSK_usos; 1, // int WKFSK_monitor; false, // bool Nav_online; false, // bool Nav_config_online; false, // bool nanoCW_online; false, // bool nanoFSK_online; false, // bool useCW_KEYLINE; //---------------------------------------------------------------------- // FMT saved controls 1500.0, // double FMT_ref_freq; 1500000, // int int_FMT_ref_freq; 1500.0, // double FMT_unk_fre; 1500000, // int int_FMT_unk_fre; 1, // int FMT_trk_speed; 1, // int FMT_trk_scale; 2, // int FMT_rec_interval //---------------------------------------------------------------------- 046, // debug_mask // 046 // 0000000000010110 // ||||||||||||||_ARQ control // |||||||||||||__Audio // ||||||||||||___Modem // |||||||||||____Rig Control // ||||||||||_____Xmlrpc // |||||||||______Spotter // ||||||||_______Data Sources // |||||||________Synop // ||||||_________KML // |||||__________KISS control // ||||___________Mac Logger // |||____________Field Day Logger // ||_____________N3FJP Logger // |______________Other 3, // debug_level : INFO(3) //---------------------------------------------------------------------- 1, // int vumeter_shown //---------------------------------------------------------------------- false // bool bLastStateRead; }; void status::saveLastState() { int mX = fl_digi_main->x(); int mY = fl_digi_main->y(); mainX = mX; mainY = mY; mainW = fl_digi_main->w(); mainH = fl_digi_main->h(); carrier = wf->Carrier(); mag = wf->Mag(); offset = wf->Offset(); speed = wf->Speed(); reflevel = progdefaults.wfRefLevel; ampspan = progdefaults.wfAmpSpan; logbook_x = dlgLogbook->x(); logbook_y = dlgLogbook->y(); logbook_w = dlgLogbook->w(); logbook_h = dlgLogbook->h(); logbook_reverse = cQsoDb::reverse; logbook_col_0 = wBrowser->columnWidth(0); logbook_col_1 = wBrowser->columnWidth(1); logbook_col_2 = wBrowser->columnWidth(2); logbook_col_3 = wBrowser->columnWidth(3); logbook_col_4 = wBrowser->columnWidth(4); logbook_col_5 = wBrowser->columnWidth(5); dxdialog_x = dxcluster_viewer->x(); dxdialog_y = dxcluster_viewer->y(); dxdialog_w = dxcluster_viewer->w(); dxdialog_h = dxcluster_viewer->h(); if (!bWF_only) { // RxTextHeight = (ReceiveText->h() * 100) / text_panel->h();//VTgroup->h(); quick_entry = ReceiveText->get_quick_entry(); rx_scroll_hints = ReceiveText->get_scroll_hints(); rx_word_wrap = ReceiveText->get_word_wrap(); tx_word_wrap = TransmitText->get_word_wrap(); tile_w = text_panel->w(); tile_y = progdefaults.rxtx_swap ? TransmitText->h() : ReceiveText->h(); tile_h = text_panel->h(); tile_y_ratio = 1.0 * tile_y / text_group->h(); if (text_panel->w() != ReceiveText->w()) tile_x = mvgroup->w(); fsq_ratio = 1.0 * fsq_rx_text->h() / fsq_group->h(); ifkp_ratio = 1.0 * ifkp_rx_text->h() / ifkp_group->h(); int_tile_y_ratio = round(tile_y_ratio * 1000); int_fsq_ratio = round(fsq_ratio * 1000); int_ifkp_ratio = round (ifkp_ratio * 1000); } VIEWERvisible = dlgViewer->visible(); if (VIEWERvisible) { VIEWERxpos = dlgViewer->x(); VIEWERypos = dlgViewer->y(); VIEWERwidth = dlgViewer->w(); VIEWERheight = dlgViewer->h(); } scopeVisible = scopeview->visible(); scopeX = scopeview->x(); scopeY = scopeview->y(); scopeW = scopeview->w(); scopeH = scopeview->h(); if (spectrum_viewer) { svX = spectrum_viewer->x(); svY = spectrum_viewer->y(); svW = spectrum_viewer->w(); svH = spectrum_viewer->h(); } contestiatones = progdefaults.contestiatones; contestiabw = progdefaults.contestiabw; contestiamargin = progdefaults.contestiasmargin; contestiainteg = progdefaults.contestiasinteg; contestia8bit = progdefaults.contestia8bit; oliviatones = progdefaults.oliviatones; oliviabw = progdefaults.oliviabw; oliviamargin = progdefaults.oliviasmargin; oliviainteg = progdefaults.oliviasinteg; olivia8bit = progdefaults.olivia8bit; rtty_shift = progdefaults.rtty_shift; rtty_custom_shift = progdefaults.rtty_custom_shift; rtty_baud = progdefaults.rtty_baud; rtty_bits = progdefaults.rtty_bits; rtty_parity = progdefaults.rtty_parity; rtty_stop = progdefaults.rtty_stop; rtty_reverse = progdefaults.rtty_reverse; rtty_crcrlf = progdefaults.rtty_crcrlf; rtty_autocrlf = progdefaults.rtty_autocrlf; rtty_autocount = progdefaults.rtty_autocount; rtty_afcspeed = progdefaults.rtty_afcspeed; PreferXhairScope = progdefaults.PreferXhairScope; UOSrx = progdefaults.UOSrx; UOStx = progdefaults.UOStx; xmlrpc_address = progdefaults.xmlrpc_address; xmlrpc_port = progdefaults.xmlrpc_port; arq_address = progdefaults.arq_address; arq_port = progdefaults.arq_port; kiss_address = progdefaults.kiss_address; kiss_io_port = progdefaults.kiss_io_port; kiss_out_port = progdefaults.kiss_out_port; kiss_dual_port_enabled = progdefaults.kiss_dual_port_enabled; data_io_enabled = progdefaults.data_io_enabled; ax25_decode_enabled = progdefaults.ax25_decode_enabled; enableBusyChannel = progdefaults.enableBusyChannel; busyChannelSeconds = progdefaults.busyChannelSeconds; kpsql_attenuation = progdefaults.kpsql_attenuation; csma_enabled = progdefaults.csma_enabled; kiss_tcp_io = progdefaults.kiss_tcp_io; kiss_tcp_listen = progdefaults.kiss_tcp_listen; kpsql_enabled = progdefaults.kpsql_enabled; csma_persistance = progdefaults.csma_persistance; csma_slot_time = progdefaults.csma_slot_time; csma_transmit_delay = progdefaults.csma_transmit_delay; psm_flush_buffer_timeout = progdefaults.psm_flush_buffer_timeout; psm_minimum_bandwidth = progdefaults.psm_minimum_bandwidth; psm_minimum_bandwidth_margin = progdefaults.psm_minimum_bandwidth_margin; psm_use_histogram = progdefaults.psm_use_histogram; psm_histogram_offset_threshold = progdefaults.psm_histogram_offset_threshold; psm_hit_time_window = progdefaults.psm_hit_time_window; tx_buffer_timeout = progdefaults.tx_buffer_timeout; kiss_io_modem_change_inhibit = progdefaults.kiss_io_modem_change_inhibit; squelch_value = 0; int_squelch_value = 0; Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", PACKAGE_TARNAME); spref.set("version", PACKAGE_VERSION); spref.set("dual_channels", "YES"); spref.set("mode_name", mode_info[lastmode].sname); spref.set("squelch_enabled", sqlonoff); spref.set("int_squelch_level", (int)round(sldrSquelchValue * 100)); spref.set("int_pwr_squelch_level", (int)round(sldrPwrSquelchValue * 100)); spref.set("afc_enabled", afconoff); spref.set("reverse", reverse); spref.set("psk8DCDShortFlag", psk8DCDShortFlag); spref.set("log_enabled", LOGenabled); spref.set("wf_carrier", carrier); spref.set("wf_mag", mag); spref.set("wf_offset", offset); spref.set("wf_speed", speed); spref.set("int_wf_reflevel", (int)round(reflevel * 100)); spref.set("int_wf_ampspan", (int)round(ampspan * 100)); int hval, lval; hval = noCATfreq / INT_MAX; lval = noCATfreq - hval * INT_MAX; spref.set("noCATfreqH", hval); spref.set("noCATfreqL", lval); spref.set("noCATmode", noCATmode.c_str()); spref.set("noCATwidth", noCATwidth.c_str()); spref.set("main_x", mainX); spref.set("main_y", mainY); spref.set("main_w", mainW); if (!bWF_only) { spref.set("main_h", mainH); // spref.set("rx_text_height", RxTextHeight); spref.set("tiled_group_x", tiled_group_x); spref.set("show_channels", show_channels); } spref.set("wf_ui", WF_UI); spref.set("riglog_ui", Rig_Log_UI); spref.set("rigcontest_ui", Rig_Contest_UI); spref.set("noriglog", NO_RIGLOG); spref.set("docked_scope", DOCKEDSCOPE); spref.set("tbar_is_docked", tbar_is_docked); spref.set("rigctl_x", rigX); spref.set("rigctl_y", rigY); spref.set("rigctl_w", rigW); spref.set("rigctl_h", rigH); spref.set("viewer_visible", VIEWERvisible); spref.set("viewer_x", static_cast(VIEWERxpos)); spref.set("viewer_y", static_cast(VIEWERypos)); spref.set("viewer_w", static_cast(VIEWERwidth)); spref.set("viewer_h", static_cast(VIEWERheight)); spref.set("int_viewer_psksq", (int)round(VIEWER_psksquelch * 100)); spref.set("int_viewer_rttysq", (int)round(VIEWER_rttysquelch * 100)); spref.set("int_viewer_cwsq", (int)round(VIEWER_cwsquelch * 100)); spref.set("fsq_monitor_x", static_cast(fsqMONITORxpos)); spref.set("fsq_monitor_y", static_cast(fsqMONITORypos)); spref.set("fsq_monitor_w", static_cast(fsqMONITORwidth)); spref.set("fsq_monitor_h", static_cast(fsqMONITORheight)); spref.set("tile_x", tile_x); spref.set("tile_y", tile_y); spref.set("tile_w", tile_w); spref.set("tile_h", tile_h); spref.set("int_tile_y_ratio", int_tile_y_ratio); spref.set("int_fsq_ratio", int_fsq_ratio); spref.set("int_ifkp_ratio", int_ifkp_ratio); spref.set("scope_visible", scopeVisible); spref.set("scope_x", scopeX); spref.set("scope_y", scopeY); spref.set("scope_w", scopeW); spref.set("scope_h", scopeH); spref.set("sqlevel", sldrSquelchValue); spref.set("sqlonoff", sqlonoff); spref.set("afconoff", afconoff); spref.set("reverse", reverse); spref.set("txlevel", txlevel); spref.set("svX", svX); spref.set("svY", svY); spref.set("svW", svW); spref.set("svH", svH); spref.set("x_graticule", x_graticule); spref.set("y_graticule", y_graticule); spref.set("xy_graticule", xy_graticule); spref.set("last_macro_file", LastMacroFile.c_str()); spref.set("default_frequencies_filename", default_frequencies_filename.c_str()); spref.set("spot_recv", spot_recv); spref.set("spot_log", spot_log); spref.set("contest", contest); spref.set("quick_entry", quick_entry); spref.set("rx_scroll_hints", rx_scroll_hints); spref.set("rx_word_wrap", rx_word_wrap); spref.set("tx_word_wrap", tx_word_wrap); spref.set("logbook_x", logbook_x); spref.set("logbook_y", logbook_y); spref.set("logbook_w", logbook_w); spref.set("logbook_h", logbook_h); spref.set("logbook_reverse", logbook_reverse); spref.set("logbook_col_0", logbook_col_0); spref.set("logbook_col_1", logbook_col_1); spref.set("logbook_col_2", logbook_col_2); spref.set("logbook_col_3", logbook_col_3); spref.set("logbook_col_4", logbook_col_4); spref.set("logbook_col_5", logbook_col_5); spref.set("dxdialog_x", dxdialog_x); spref.set("dxdialog_y", dxdialog_y); spref.set("dxdialog_w", dxdialog_w); spref.set("dxdialog_h", dxdialog_h); spref.set("contestiatones", contestiatones); spref.set("contestiabw", contestiabw); spref.set("contestiamargin", contestiamargin); spref.set("contestiainteg", contestiainteg); spref.set("contestia8bit", contestia8bit); spref.set("oliviaiatones", oliviatones); spref.set("oliviaiabw", oliviabw); spref.set("oliviaiamargin", oliviamargin); spref.set("oliviaiainteg", oliviainteg); spref.set("oliviaia8bit", olivia8bit); spref.set("rtty_shift", rtty_shift); spref.set("rtty_custom_shift", rtty_custom_shift); spref.set("rtty_baud", rtty_baud); spref.set("rtty_bits", rtty_bits); spref.set("rtty_parity", rtty_parity); spref.set("rtty_stop", rtty_stop); spref.set("rtty_reverse", rtty_reverse); spref.set("rtty_crcrlf", rtty_crcrlf); spref.set("rtty_autocrlf", rtty_autocrlf); spref.set("rtty_autocount", rtty_autocount); spref.set("rtty_afcspeed", rtty_afcspeed); spref.set("preferxhairscope", PreferXhairScope); spref.set("shaped_rtty", shaped_rtty); spref.set("uosrx", UOSrx); spref.set("uostx", UOStx); if(!xmlrpc_address_override_flag) { spref.set("xmlrpc_address", xmlrpc_address.c_str()); spref.set("xmlrpc_port", xmlrpc_port.c_str()); } if(!arq_address_override_flag) { spref.set("arq_address", arq_address.c_str()); spref.set("arq_port", arq_port.c_str()); } if(!kiss_address_override_flag) { spref.set("kiss_address", kiss_address.c_str()); spref.set("kiss_io_port", kiss_io_port.c_str()); spref.set("kiss_out_port", kiss_out_port.c_str()); spref.set("kiss_dual_port_enabled", kiss_dual_port_enabled); } if(!override_data_io_enabled) spref.set("data_io_enabled", data_io_enabled); spref.set("ax25_decode_enabled", ax25_decode_enabled); spref.set("enableBusyChannel", enableBusyChannel); spref.set("busyChannelSeconds", busyChannelSeconds); spref.set("kpsql_attenuation", kpsql_attenuation); spref.set("csma_enabled", csma_enabled); spref.set("kiss_tcp_io", kiss_tcp_io); spref.set("kiss_tcp_listen", kiss_tcp_listen); spref.set("kpsql_enabled", kpsql_enabled); spref.set("csma_persistance", csma_persistance); spref.set("csma_slot_time", csma_slot_time); spref.set("csma_transmit_delay", csma_transmit_delay); spref.set("psm_flush_buffer_timeout", psm_flush_buffer_timeout); spref.set("psm_minimum_bandwidth", psm_minimum_bandwidth); spref.set("psm_minimum_bandwidth_margin", psm_minimum_bandwidth_margin); spref.set("psm_use_histogram", psm_use_histogram); spref.set("psm_histogram_offset_threshold", psm_histogram_offset_threshold); spref.set("psm_hit_time_window", psm_hit_time_window); spref.set("tx_buffer_timeout", tx_buffer_timeout); spref.set("kiss_io_modem_change_inhibit", kiss_io_modem_change_inhibit); spref.set("browser_search", browser_search.c_str()); spref.set("meters", meters); //---------------------------------------------------------------------- // WinKeyer prefs set spref.set("WK_serial_port_name", WK_serial_port_name.c_str()); spref.set("WK_mode_register", WK_mode_register); spref.set("WK_speed_wpm", WK_speed_wpm); spref.set("WK_cut_zeronine", WK_cut_zeronine); spref.set("WK_cmd_wpm", WK_cmd_wpm); spref.set("WK_sidetone", WK_sidetone); spref.set("WK_weight", WK_weight); spref.set("WK_lead_in_time", WK_lead_in_time); spref.set("WK_tail_time", WK_tail_time); spref.set("WK_min_wpm", WK_min_wpm); spref.set("WK_rng_wpm", WK_rng_wpm); spref.set("WK_1st_ext", WK_first_extension); spref.set("WK_key_comp", WK_key_compensation); spref.set("WK_farnsworth", WK_farnsworth_wpm); spref.set("WK_paddle_set", WK_paddle_setpoint); spref.set("WK_dit_dah_ratio", WK_dit_dah_ratio); spref.set("WK_pin_config", WK_pin_configuration); spref.set("WK_use_pot", WK_use_pot); spref.set("WK_online", WK_online); spref.set("WK_version", WK_version); spref.set("WKFSK_mode", WKFSK_mode); spref.set("WKFSK_baud", WKFSK_baud); spref.set("WKFSK_stopbits", WKFSK_stopbits); spref.set("WKFSK_ptt", WKFSK_ptt); spref.set("WKFSK_polarity", WKFSK_polarity); spref.set("WKFSK_sidetone", WKFSK_sidetone); spref.set("WKFSK_auto_crlf", WKFSK_auto_crlf); spref.set("WKFSK_diddle", WKFSK_diddle); spref.set("WKFSK_diddle_char", WKFSK_diddle_char); spref.set("WKFSK_usos", WKFSK_usos); spref.set("WKFSK_monitor", WKFSK_monitor); spref.set("Nav_online", Nav_online); spref.set("Nav_config_online", Nav_config_online); spref.set("nanoCW_online", nanoCW_online); spref.set("nanoFSK_online", nanoFSK_online); spref.set("useCW_KEYLINE", useCW_KEYLINE); //---------------------------------------------------------------------- // FMT saved controls spref.set("int_FMT_ref_freq", (int)round(FMT_ref_freq * 1000)); spref.set("int_FMT_unk_freq", (int)round(FMT_unk_freq * 1000)); spref.set("FMT_rec_interval", FMT_rec_interval); spref.set("FMT_trk_scale", FMT_trk_scale); spref.set("FMT_minutes", FMT_minutes); //---------------------------------------------------------------------- debug_mask = debug::mask; spref.set("debug_mask", debug_mask); debug_level = debug::level; spref.set("debug_level", debug_level); //---------------------------------------------------------------------- spref.set("vumeter_shown", vumeter_shown); modeband.save_mode_state(); } void status::loadLastState() { Fl_Preferences spref(HomeDir.c_str(), "w1hkj.com", PACKAGE_TARNAME); int i; char strbuff[1000]; char version[64]; version[sizeof(version)-1] = '\0'; // Skip loading the rest of the status variables if we didn't read a // version name/value pair; or this is not a file that supports dual // channel browsers. bLastStateRead = spref.get("version", version, "", sizeof(version)-1); if (!bLastStateRead) return; bLastStateRead = spref.get("dual_channels", version, "", sizeof(version) - 1); if (!bLastStateRead) return; memset(strbuff, 0, sizeof(strbuff)); spref.get("mode_name", strbuff, mode_info[MODE_PSK31].sname, sizeof(strbuff) - 1); mode_name = strbuff; lastmode = MODE_PSK31; for (i = 0; i < NUM_MODES;i++) { if (mode_name == mode_info[i].sname) { lastmode = (trx_mode) i; break; } } spref.get("squelch_enabled", i, sqlonoff); sqlonoff = i; spref.get("int_squelch_level", i, int_sldrSquelchValue); int_sldrSquelchValue = i; sldrSquelchValue = int_sldrSquelchValue / 100.0; spref.get("int_pwr_squelch_level", i, int_sldrPwrSquelchValue); int_sldrPwrSquelchValue = i; sldrPwrSquelchValue = int_sldrPwrSquelchValue / 100.0; spref.get("afc_enabled", i, afconoff); afconoff = i; spref.get("reverse", i, reverse); reverse = i; // spref.get("rx_text_height", RxTextHeight, RxTextHeight); spref.get("tiled_group_x", tiled_group_x, tiled_group_x); spref.get("show_channels", i, show_channels); show_channels = i; spref.get("log_enabled", i, LOGenabled); LOGenabled = i; spref.get("wf_carrier", carrier, carrier); spref.get("wf_mag", mag, mag); spref.get("wf_offset", offset, offset); spref.get("wf_speed", speed, speed); spref.get("int_wf_reflevel", int_reflevel, int_reflevel); reflevel = int_reflevel / 100.0; progdefaults.wfRefLevel = reflevel; spref.get("int_wf_ampspan", int_ampspan, int_ampspan); ampspan = int_ampspan / 100.0; progdefaults.wfAmpSpan = ampspan; int hval = 0, lval = 0; spref.get("noCATfreqH", hval, hval); spref.get("noCATfreqL", lval, lval); noCATfreq = 1ULL * hval * INT_MAX + lval; memset(strbuff, 0, sizeof(strbuff)); spref.get("noCATmode", strbuff, "USB", sizeof(strbuff) - 1); noCATmode = strbuff; memset(strbuff, 0, sizeof(strbuff)); spref.get("noCATwidth", strbuff, "3000", sizeof(strbuff) - 1); noCATwidth = strbuff; spref.get("main_x", mainX, mainX); if (mainX > Fl::w()) mainX = 0; spref.get("main_y", mainY, mainY); if (mainY > Fl::h()) mainY = 0; spref.get("main_w", mainW, mainW); if (mainW < WMIN) mainW = WMIN; if (mainW > Fl::w()) mainW = Fl::w(); spref.get("main_h", mainH, mainH); // if (mainH < HMIN) mainH = HMIN; if (mainH > Fl::w()) mainH = Fl::h(); spref.get("wf_ui", i, WF_UI); WF_UI = i; spref.get("riglog_ui", i, Rig_Log_UI); Rig_Log_UI = i; spref.get("rigcontest_ui", i, Rig_Contest_UI); Rig_Contest_UI = i; spref.get("noriglog", i, NO_RIGLOG); NO_RIGLOG = i; spref.get("docked_scope", i, DOCKEDSCOPE); DOCKEDSCOPE = i; spref.get("tbar_is_docked", i, tbar_is_docked); tbar_is_docked = i; spref.get("rigctl_x", rigX, rigX); spref.get("rigctl_y", rigY, rigY); spref.get("rigctl_w", rigW, rigW); spref.get("rigctl_h", rigH, rigH); spref.get("viewer_visible", i, VIEWERvisible); VIEWERvisible = i; spref.get("viewer_x", i, VIEWERxpos); VIEWERxpos = i; spref.get("viewer_y", i, VIEWERypos); VIEWERypos = i; spref.get("viewer_w", i, VIEWERwidth); VIEWERwidth = i; spref.get("viewer_h", i, VIEWERheight); VIEWERheight = i; spref.get("int_viewer_psksq", int_VIEWER_psksquelch, int_VIEWER_psksquelch); VIEWER_psksquelch = int_VIEWER_psksquelch / 100.0; spref.get("int_viewer_rttysq", int_VIEWER_rttysquelch, int_VIEWER_rttysquelch); VIEWER_rttysquelch = int_VIEWER_rttysquelch / 100.0; spref.get("int_viewer_cwsq", int_VIEWER_cwsquelch, int_VIEWER_cwsquelch); VIEWER_cwsquelch = int_VIEWER_cwsquelch / 100.0; spref.get("fsq_monitor_x", i, fsqMONITORxpos); fsqMONITORxpos = i; spref.get("fsq_monitor_y", i, fsqMONITORypos); fsqMONITORypos = i; spref.get("fsq_monitor_w", i, fsqMONITORwidth); fsqMONITORwidth = i; spref.get("fsq_monitor_h", i, fsqMONITORheight); fsqMONITORheight = i; spref.get("tile_x", tile_x, tile_x); spref.get("tile_y", tile_y, tile_y); spref.get("tile_w", tile_w, tile_w); spref.get("tile_h", tile_h, tile_h); spref.get("int_tile_y_ratio", int_tile_y_ratio, int_tile_y_ratio); spref.get("int_fsq_ratio", int_fsq_ratio, int_fsq_ratio); spref.get("int_ifkp_ratio", int_ifkp_ratio, int_ifkp_ratio); tile_y_ratio = int_tile_y_ratio / 1000.0; fsq_ratio = int_fsq_ratio / 1000.0; ifkp_ratio = int_ifkp_ratio / 1000.0; spref.get("scope_visible", i, scopeVisible); scopeVisible = i; spref.get("scope_x", scopeX, scopeX); spref.get("scope_y", scopeY, scopeY); spref.get("scope_w", scopeW, scopeW); spref.get("scope_h", scopeH, scopeH); spref.get("sqlevel", sldrSquelchValue, sldrSquelchValue); spref.get("sqlonoff", i, sqlonoff); sqlonoff = i; spref.get("afconoff", i, afconoff); afconoff = i; spref.get("reverse", i, reverse); reverse = i; spref.get("txlevel", txlevel, txlevel); spref.get("svX", svX, svX); spref.get("svY", svY, svY); spref.get("svW", svW, svW); spref.get("svH", svH, svH); spref.get("x_graticule", i, x_graticule); x_graticule = i; spref.get("y_graticule", i, y_graticule); y_graticule = i; spref.get("xy_graticule",i, xy_graticule); xy_graticule = i; memset(strbuff, 0, sizeof(strbuff)); spref.get("last_macro_file", strbuff, "macros.mdf", sizeof(strbuff) - 1); LastMacroFile = strbuff; memset(strbuff, 0, sizeof(strbuff)); spref.get("default_frequencies_filename", strbuff, "frequencies2.txt", sizeof(strbuff) - 1); default_frequencies_filename = strbuff; spref.get("spot_recv", i, spot_recv); spot_recv = i; spref.get("spot_log", i, spot_log); spot_log = i; spref.get("contest", i, contest); contest = i; spref.get("quick_entry", i, quick_entry); quick_entry = i; spref.get("rx_scroll_hints", i, rx_scroll_hints); rx_scroll_hints = i; spref.get("rx_word_wrap", i, rx_word_wrap); rx_word_wrap = i; spref.get("tx_word_wrap", i, tx_word_wrap); tx_word_wrap = i; spref.get("logbook_x", logbook_x, logbook_x); spref.get("logbook_y", logbook_y, logbook_y); spref.get("logbook_w", logbook_w, logbook_w); spref.get("logbook_h", logbook_h, logbook_h); spref.get("logbook_reverse", i, logbook_reverse); logbook_reverse = i; spref.get("logbook_col_0", logbook_col_0, logbook_col_0); spref.get("logbook_col_1", logbook_col_1, logbook_col_1); spref.get("logbook_col_2", logbook_col_2, logbook_col_2); spref.get("logbook_col_3", logbook_col_3, logbook_col_3); spref.get("logbook_col_4", logbook_col_4, logbook_col_4); spref.get("logbook_col_5", logbook_col_5, logbook_col_5); spref.get("dxdialog_x", dxdialog_x, dxdialog_x); spref.get("dxdialog_y", dxdialog_y, dxdialog_y); spref.get("dxdialog_w", dxdialog_w, dxdialog_w); spref.get("dxdialog_h", dxdialog_h, dxdialog_h); spref.get("contestiatones", contestiatones, contestiatones); spref.get("contestiabw", contestiabw, contestiabw); spref.get("contestiamargin", contestiamargin, contestiamargin); spref.get("contestiainteg", contestiainteg, contestiainteg); spref.get("contestia8bit", i, contestia8bit); contestia8bit = i; spref.get("oliviaiatones", oliviatones, oliviatones); spref.get("oliviaiabw", oliviabw, oliviabw); spref.get("oliviaiamargin", oliviamargin, oliviamargin); spref.get("oliviaiainteg", oliviainteg, oliviainteg); spref.get("oliviaia8bit", i, olivia8bit); olivia8bit = i; spref.get("rtty_shift", rtty_shift, rtty_shift); spref.get("rtty_custom_shift", rtty_custom_shift, rtty_custom_shift); spref.get("rtty_baud", rtty_baud, rtty_baud); spref.get("rtty_bits", rtty_bits, rtty_bits); spref.get("rtty_parity", rtty_parity, rtty_parity); spref.get("rtty_stop", rtty_stop, rtty_stop); spref.get("rtty_reverse", i, rtty_reverse); rtty_reverse = i; spref.get("rtty_crcrlf", i, rtty_crcrlf); rtty_crcrlf = i; spref.get("rtty_autocrlf", i, rtty_autocrlf); rtty_autocrlf = i; spref.get("rtty_autocount", rtty_autocount, rtty_autocount); spref.get("rtty_afcspeed", rtty_afcspeed, rtty_afcspeed); spref.get("preferxhairscope", i, PreferXhairScope); PreferXhairScope = i; spref.get("shaped_rtty", i, shaped_rtty); shaped_rtty = i; spref.get("uosrx", i, UOSrx); UOSrx = i; spref.get("uostx", i, UOStx); UOStx = i; if(!xmlrpc_address_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("xmlrpc_address", strbuff, xmlrpc_address.c_str(), sizeof(strbuff) - 1); xmlrpc_address = strbuff; } if (!xmlrpc_port_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("xmlrpc_port", strbuff, xmlrpc_port.c_str(), sizeof(strbuff) - 1); xmlrpc_port = strbuff; } if(!arq_address_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("arq_address", strbuff, arq_address.c_str(), sizeof(strbuff) - 1); arq_address = strbuff; } if(!arq_port_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("arq_port", strbuff, arq_port.c_str(), sizeof(strbuff) - 1); arq_port = strbuff; } if(!kiss_address_override_flag) { memset(strbuff, 0, sizeof(strbuff)); spref.get("kiss_address", strbuff, kiss_address.c_str(), sizeof(strbuff) - 1); kiss_address = strbuff; memset(strbuff, 0, sizeof(strbuff)); spref.get("kiss_io_port", strbuff, kiss_io_port.c_str(), sizeof(strbuff) - 1); kiss_io_port = strbuff; memset(strbuff, 0, sizeof(strbuff)); spref.get("kiss_out_port", strbuff, kiss_out_port.c_str(), sizeof(strbuff) - 1); kiss_out_port = strbuff; spref.get("kiss_dual_port_enabled", i, kiss_dual_port_enabled); kiss_dual_port_enabled = i; } if(!override_data_io_enabled) { spref.get("data_io_enabled", i, data_io_enabled); data_io_enabled = i; } spref.get("ax25_decode_enabled", i, ax25_decode_enabled); ax25_decode_enabled = i; spref.get("enableBusyChannel", i, enableBusyChannel); enableBusyChannel = i; spref.get("busyChannelSeconds", i, busyChannelSeconds); busyChannelSeconds = i; spref.get("kpsql_attenuation", i, kpsql_attenuation); kpsql_attenuation = i; spref.get("csma_enabled", i, csma_enabled); csma_enabled = i; spref.get("kiss_tcp_io", i, kiss_tcp_io); kiss_tcp_io = i; spref.get("kiss_tcp_listen", i, kiss_tcp_listen); kiss_tcp_listen = i; spref.get("kpsql_enabled", i, kpsql_enabled); kpsql_enabled = i; spref.get("csma_persistance", i, csma_persistance); csma_persistance = i; spref.get("csma_slot_time", i, csma_slot_time); csma_slot_time = i; spref.get("csma_transmit_delay", i, csma_transmit_delay); csma_transmit_delay = i; spref.get("psm_flush_buffer_timeout", i, psm_flush_buffer_timeout); psm_flush_buffer_timeout = i; spref.get("psm_minimum_bandwidth", i, psm_minimum_bandwidth); psm_minimum_bandwidth = i; spref.get("psm_minimum_bandwidth_margin", i, psm_minimum_bandwidth_margin); psm_minimum_bandwidth_margin = i; spref.get("psm_use_histogram", i, psm_use_histogram); psm_use_histogram = i; spref.get("psm_histogram_offset_threshold", i, psm_histogram_offset_threshold); psm_histogram_offset_threshold = i; spref.get("psm_hit_time_window", i, psm_hit_time_window); psm_hit_time_window = i; spref.get("tx_buffer_timeout", i, tx_buffer_timeout); tx_buffer_timeout = i; spref.get("kiss_io_modem_change_inhibit", i, kiss_io_modem_change_inhibit); kiss_io_modem_change_inhibit = i; spref.get("psk8DCDShortFlag", i, psk8DCDShortFlag); psk8DCDShortFlag = i; memset(strbuff, 0, sizeof(strbuff)); spref.get("browser_search", strbuff, browser_search.c_str(), sizeof(strbuff) - 1); browser_search = strbuff; seek_re.recompile(browser_search.c_str()); spref.get("meters", i, meters); meters = i; //---------------------------------------------------------------------- // WinKeyer prefs get //---------------------------------------------------------------------- spref.get("WK_serial_port_name", strbuff, "NONE", 199); WK_serial_port_name = strbuff; if (WK_serial_port_name.find("tty") == 0) WK_serial_port_name.insert(0, "/dev/"); spref.get("WK_mode_register", i, WK_mode_register); WK_mode_register = i; spref.get("WK_speed_wpm", i, WK_speed_wpm); WK_speed_wpm = i; spref.get("WK_cmd_wpm", i, WK_cmd_wpm); WK_cmd_wpm = i; spref.get("WK_cut_zeronine", i, WK_cut_zeronine); WK_cut_zeronine = i; spref.get("WK_sidetone", i, WK_sidetone); WK_sidetone = i; spref.get("WK_weight", i, WK_weight); WK_weight = i; spref.get("WK_lead_in_time", i, WK_lead_in_time); WK_lead_in_time = i; spref.get("WK_tail_time", i, WK_tail_time); WK_tail_time = i; spref.get("WK_min_wpm", i, WK_min_wpm); WK_min_wpm = i; spref.get("WK_rng_wpm", i, WK_rng_wpm); WK_rng_wpm = i; spref.get("WK_1st_ext", i, WK_first_extension); WK_first_extension = i; spref.get("WK_key_comp", i, WK_key_compensation); WK_key_compensation = i; spref.get("WK_farnsworth", i, WK_farnsworth_wpm); WK_farnsworth_wpm = i; spref.get("WK_paddle_set", i, WK_paddle_setpoint); WK_paddle_setpoint = i; spref.get("WK_dit_dah_ratio", i, WK_dit_dah_ratio); WK_dit_dah_ratio = i; spref.get("WK_pin_config", i, WK_pin_configuration); WK_pin_configuration = i; spref.get("WK_use_pot", i, WK_use_pot); WK_use_pot = i; spref.get("WK_online", i, WK_online); WK_online = i; spref.get("WK_version", WK_version, WK_version); spref.get("WKFSK_mode", WKFSK_mode, WKFSK_mode); spref.get("WKFSK_baud", WKFSK_baud, WKFSK_baud); spref.get("WKFSK_stopbits", WKFSK_stopbits, WKFSK_stopbits); spref.get("WKFSK_ptt", WKFSK_ptt, WKFSK_ptt); spref.get("WKFSK_polarity", WKFSK_polarity, WKFSK_polarity); spref.get("WKFSK_sidetone", WKFSK_sidetone, WKFSK_sidetone); spref.get("WKFSK_auto_crlf", WKFSK_auto_crlf, WKFSK_auto_crlf); spref.get("WKFSK_diddle", WKFSK_diddle, WKFSK_diddle); spref.get("WKFSK_diddle_char", WKFSK_diddle_char, WKFSK_diddle_char); spref.get("WKFSK_diddle_char", WKFSK_diddle_char, WKFSK_diddle_char); spref.get("WKFSK_monitor", WKFSK_monitor, WKFSK_monitor); spref.get("Nav_online", i, Nav_online); Nav_online = i; spref.get("Nav_config_online", i, Nav_config_online); Nav_config_online = i; spref.get("nanoCW_online", i, nanoCW_online); nanoCW_online = i; spref.get("nanoFSK_online", i, nanoFSK_online); nanoFSK_online = i; spref.get("useCW_KEYLINE", i, useCW_KEYLINE); useCW_KEYLINE = i; //---------------------------------------------------------------------- // FMT saved controls spref.get("int_FMT_ref_freq", int_FMT_ref_freq, int_FMT_ref_freq); FMT_ref_freq = int_FMT_ref_freq / 1000.0; spref.get("int_FMT_unk_freq", int_FMT_unk_freq, int_FMT_unk_freq); FMT_unk_freq = int_FMT_unk_freq / 1000.0; spref.get("FMT_rec_interval", FMT_rec_interval, FMT_rec_interval); spref.get("FMT_trk_scale", FMT_trk_scale, FMT_trk_scale); spref.get("FMT_minutes", FMT_minutes, FMT_minutes); //---------------------------------------------------------------------- spref.get("debug_level", debug_level, debug_level); spref.get("debug_mask", debug_mask, debug_mask); //---------------------------------------------------------------------- spref.get("vumeter_shown", vumeter_shown, vumeter_shown); //---------------------------------------------------------------------- modeband.load_mode_state(); set_debug_mask(debug_mask); } void status::initLastState() { if (!bLastStateRead) loadLastState(); // RTTY if (lastmode == MODE_RTTY ) { progdefaults.rtty_shift = rtty_shift; selShift->index(progdefaults.rtty_shift); if (rtty_shift == selShift->lsize() - 1) { selCustomShift->deactivate(); } else { // Custom shift selCustomShift->activate(); } selBaud->index((progdefaults.rtty_baud = rtty_baud)); selBits->index((progdefaults.rtty_bits = rtty_bits)); selParity->index((progdefaults.rtty_parity = rtty_parity)); selStopBits->index((progdefaults.rtty_stop = rtty_stop)); btnCRCRLF->value(progdefaults.rtty_crcrlf = rtty_crcrlf); btnAUTOCRLF->value(progdefaults.rtty_autocrlf = rtty_autocrlf); cntrAUTOCRLF->value(progdefaults.rtty_autocount = rtty_autocount); chkUOSrx->value(progdefaults.UOSrx = UOSrx); chkUOStx->value(progdefaults.UOStx = UOStx); i_listbox_rtty_afc_speed->index(progdefaults.rtty_afcspeed = rtty_afcspeed); btnPreferXhairScope->value(progdefaults.PreferXhairScope = PreferXhairScope); if (mvsquelch) { mvsquelch->range(-12.0, 6.0); mvsquelch->value(VIEWER_rttysquelch); } if (sldrViewerSquelch) { sldrViewerSquelch->range(-12.0, 6.0); sldrViewerSquelch->value(VIEWER_rttysquelch); } } if (lastmode >= MODE_PSK_FIRST && lastmode <= MODE_PSK_LAST) { if (mvsquelch) { mvsquelch->range(-3.0, 6.0); mvsquelch->value(VIEWER_psksquelch); } if (sldrViewerSquelch) { sldrViewerSquelch->range(-3.0, 6.0); sldrViewerSquelch->value(VIEWER_psksquelch); } } // OLIVIA if (lastmode == MODE_OLIVIA) { i_listbox_olivia_tones->index(progdefaults.oliviatones = oliviatones); i_listbox_olivia_bandwidth->index(progdefaults.oliviabw = oliviabw); cntOlivia_smargin->value(progdefaults.oliviasmargin = oliviamargin); cntOlivia_sinteg->value(progdefaults.oliviasinteg = oliviainteg); btnOlivia_8bit->value(progdefaults.olivia8bit = olivia8bit); } // CONTESTIA if (lastmode == MODE_CONTESTIA) { i_listbox_contestia_tones->index(progdefaults.contestiatones = contestiatones); i_listbox_contestia_bandwidth->index(progdefaults.contestiabw = contestiabw); cntContestia_smargin->value(progdefaults.contestiasmargin = contestiamargin); cntContestia_sinteg->value(progdefaults.contestiasinteg = contestiainteg); btnContestia_8bit->value(progdefaults.contestia8bit = contestia8bit); } init_modem_sync(lastmode); wf->opmode(); wf->Mag(mag); wf->Offset(offset); wf->Speed(speed); wf->setRefLevel(); wf->setAmpSpan(); btnAFC->value(afconoff); if(override_data_io_enabled != DISABLED_IO) { data_io_enabled = override_data_io_enabled; progdefaults.data_io_enabled = data_io_enabled; data_io_enabled = data_io_enabled; } if(data_io_enabled == KISS_IO) { data_io_enabled = KISS_IO; progdefaults.data_io_enabled = KISS_IO; } else { data_io_enabled = ARQ_IO; progdefaults.data_io_enabled = ARQ_IO; data_io_enabled = ARQ_IO; kpsql_enabled = false; } btnSQL->value(sqlonoff); btnPSQL->value(kpsql_enabled); if(kpsql_enabled) sldrSquelch->value(sldrPwrSquelchValue); else sldrSquelch->value(sldrSquelchValue); if (arq_address_override_flag) arq_address = progdefaults.arq_address = override_arq_address; if (arq_port_override_flag) arq_port = progdefaults.arq_port = override_arq_port; if(kiss_address_override_flag) { if(!override_kiss_address.empty()) kiss_address = progdefaults.kiss_address = override_kiss_address; if(!override_kiss_io_port.empty()) kiss_io_port = progdefaults.kiss_io_port = override_kiss_io_port; if(!override_kiss_out_port.empty()) kiss_out_port = progdefaults.kiss_out_port = override_kiss_out_port; if(override_kiss_dual_port_enabled > -1) kiss_dual_port_enabled = progdefaults.kiss_dual_port_enabled = override_kiss_dual_port_enabled; } if (xmlrpc_address_override_flag) xmlrpc_address = progdefaults.xmlrpc_address = override_xmlrpc_address; if (xmlrpc_port_override_flag) xmlrpc_port = progdefaults.xmlrpc_port = override_xmlrpc_port; txtArq_ip_address->value(arq_address.c_str()); txtArq_ip_port_no->value(arq_port.c_str()); txtXmlrpc_ip_address->value(xmlrpc_address.c_str()); txtXmlrpc_ip_port_no->value(xmlrpc_port.c_str()); txtKiss_ip_address->value(kiss_address.c_str()); txtKiss_ip_io_port_no->value(kiss_io_port.c_str()); txtKiss_ip_out_port_no->value(kiss_out_port.c_str()); btnEnable_dual_port->value(kiss_dual_port_enabled); progdefaults.kiss_dual_port_enabled = kiss_dual_port_enabled; btnEnable_csma->value(csma_enabled); progdefaults.csma_enabled = csma_enabled; btnEnable_ax25_decode->value(ax25_decode_enabled); progdefaults.ax25_decode_enabled = ax25_decode_enabled; cntKPSQLAttenuation->value(kpsql_attenuation); progdefaults.kpsql_attenuation = kpsql_attenuation; kiss_io_set_button_state(0); if (bWF_only) fl_digi_main->resize(mainX, mainY, mainW, Hmenu + Hwfall + Hstatus); else { fl_digi_main->resize(mainX, mainY, mainW, mainH); set_macroLabels(); UI_select(); } if (VIEWERvisible) openViewer(); if (scopeview) { scopeview->resize(scopeX, scopeY, scopeW, scopeH); digiscope->resize(0,0,scopeW,scopeH); if (scopeVisible) scopeview->show(); } cQsoDb::reverse = logbook_reverse; if (cQsoDb::reverse) { qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); } dlgLogbook->resize(logbook_x, logbook_y, logbook_w, logbook_h); wBrowser->columnWidth(0, logbook_col_0); wBrowser->columnWidth(1, logbook_col_1); wBrowser->columnWidth(2, logbook_col_2); wBrowser->columnWidth(3, logbook_col_3); wBrowser->columnWidth(4, logbook_col_4); wBrowser->columnWidth(5, logbook_col_5); dxcluster_viewer->resize(dxdialog_x, dxdialog_y, dxdialog_w, dxdialog_h); ReceiveText->set_all_entry(quick_entry); ReceiveText->set_scroll_hints(rx_scroll_hints); ReceiveText->set_word_wrap(rx_word_wrap, true); TransmitText->set_word_wrap(tx_word_wrap, true); disable_config_p2p_io_widgets(); update_csma_io_config(CSMA_ALL); // config_WK choice_WK_keyer_mode->add("Iambic B"); choice_WK_keyer_mode->add("Iambic A"); choice_WK_keyer_mode->add("Ultimatic"); choice_WK_keyer_mode->add("Bug Mode"); choice_WK_keyer_mode->index((WK_mode_register & 0x30) >> 4); choice_WK_output_pins->add("Key 1"); choice_WK_output_pins->add("Key 2"); choice_WK_output_pins->add("Key 1 & 2"); choice_WK_output_pins->index(((WK_pin_configuration & 0x06) >> 2) - 1); choice_WK_sidetone->add("4000"); choice_WK_sidetone->add("2000"); choice_WK_sidetone->add("1333"); choice_WK_sidetone->add("1000"); choice_WK_sidetone->add("800"); choice_WK_sidetone->add("666"); choice_WK_sidetone->add("571"); choice_WK_sidetone->add("500"); choice_WK_sidetone->add("444"); choice_WK_sidetone->add("400"); choice_WK_sidetone->index((WK_sidetone & 0x0F) - 1); choice_WK_hang->add("Wait 1.0"); choice_WK_hang->add("Wait 1.33"); choice_WK_hang->add("Wait 1.66"); choice_WK_hang->add("Wait 2.0"); choice_WK_hang->index((WK_pin_configuration & 0x30) >> 4); cntr_WK_tail->minimum(0); cntr_WK_tail->maximum(250); cntr_WK_tail->step(10); cntr_WK_tail->value(WK_tail_time); cntr_WK_leadin->minimum(0); cntr_WK_leadin->maximum(250); cntr_WK_leadin->step(10); cntr_WK_leadin->value(WK_lead_in_time); cntr_WK_weight->minimum(10); cntr_WK_weight->maximum(90); cntr_WK_weight->step(1); cntr_WK_weight->value(WK_weight); cntr_WK_sample->minimum(10); cntr_WK_sample->maximum(90); cntr_WK_sample->step(1); cntr_WK_sample->value(WK_paddle_setpoint); cntr_WK_first_ext->minimum(0); cntr_WK_first_ext->maximum(250); cntr_WK_first_ext->step(1); cntr_WK_first_ext->value(WK_first_extension); cntr_WK_comp->minimum(0); cntr_WK_comp->maximum(250); cntr_WK_comp->step(1); cntr_WK_comp->value(WK_key_compensation); cntr_WK_ratio->minimum(2.0); cntr_WK_ratio->maximum(4.0); cntr_WK_ratio->step(0.1); cntr_WK_ratio->value(WK_dit_dah_ratio * 3 / 50.0); cntr_WK_cmd_wpm->minimum(10); cntr_WK_cmd_wpm->maximum(30); cntr_WK_cmd_wpm->step(1); cntr_WK_cmd_wpm->value(WK_cmd_wpm); cntr_WK_farnsworth->minimum(10); cntr_WK_farnsworth->maximum(99); cntr_WK_farnsworth->step(1); cntr_WK_farnsworth->value(WK_farnsworth_wpm); cntr_WK_rng_wpm->minimum(10); cntr_WK_rng_wpm->maximum(40); cntr_WK_rng_wpm->step(1); cntr_WK_rng_wpm->value(WK_rng_wpm); cntr_WK_min_wpm->minimum(5); cntr_WK_min_wpm->maximum(89); cntr_WK_min_wpm->step(1); cntr_WK_min_wpm->value(WK_min_wpm); btn_WK_sidetone_on->value(WK_sidetone); btn_WK_cut_zeronine->value(WK_cut_zeronine); btn_WK_ptt_on->value((WK_pin_configuration & 0x01) == 0x01); btn_WK_tone_on->value((WK_pin_configuration & 0x02) == 0x02); btn_WK_ct_space->value((WK_mode_register & 0x01) == 0x01); btn_WK_auto_space->value((WK_mode_register & 0x02) == 0x02); btn_WK_serial_echo->value((WK_mode_register & 0x04) == 0x04); btn_WK_swap->value((WK_mode_register & 0x08) == 0x08); btn_WK_paddle_echo->value((WK_mode_register & 0x40) == 0x40); btn_WK_paddledog->value((WK_mode_register & 0x80) == 0x80); select_WK_CommPort->value(WK_serial_port_name.c_str()); } fldigi-4.2.05/src/globals/0000775000175000017500000000000014611714005012254 500000000000000fldigi-4.2.05/src/globals/globals.cxx0000664000175000017500000006133314611711171014352 00000000000000// ---------------------------------------------------------------------------- // globals.cxx -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "gettext.h" #include "globals.h" #include "modem.h" #include "data_io.h" #include "strutil.h" // ************ Elements are in enum trx_mode order. ************ // N.B. it is not valid to use an _("NLS") std::string in this table!! // ... doing so will break the Fl_menu_item table 'menu_'. -Kamal // Last value (true/false) determines if it's used with the KISS interface. // It must have 8 bit support. Current selection based on the modems used in FLAMP. //struc entries: // mode, **modem, *sname, *name, *pskmail_name, *adif_name, *export_mode, *export_submode, *vid_name, iface_io // *** DO NOT PUT A '/' in the name std::string const struct mode_info_t mode_info[NUM_MODES] = { {MODE_NULL,&null_modem,"NULL","NULL","","NULL","","","", DISABLED_IO }, {MODE_CW,&cw_modem,"CW","CW","CW","CW","CW","","CW", DISABLED_IO }, {MODE_CONTESTIA,&contestia_modem,"CONTESTIA","Contestia","","CONTESTI","CONTESTI","","CT",DISABLED_IO}, {MODE_CONTESTIA_4_125,&contestia_4_125_modem,"Cont-4/125","Cont4-125","","CONTESTI4/125","CONTESTI","","CT4/125",DISABLED_IO}, {MODE_CONTESTIA_4_250,&contestia_4_250_modem,"Cont-4/250","Cont4-250","","CONTESTI4/250","CONTESTI","","CT4/250",DISABLED_IO}, {MODE_CONTESTIA_4_500,&contestia_4_500_modem,"Cont-4/500","Cont4-500","","CONTESTI4/500","CONTESTI","","CT4/500",DISABLED_IO}, {MODE_CONTESTIA_4_1000,&contestia_4_1000_modem,"Cont-4/1K","Cont4-1K","","CONTESTI4/1000","CONTESTI","","CT4/1K",DISABLED_IO}, {MODE_CONTESTIA_4_2000,&contestia_4_2000_modem,"Cont-4/2K","Cont4-2K","","CONTESTI4/2000","CONTESTI","","CT4/2K",DISABLED_IO}, {MODE_CONTESTIA_8_125,&contestia_8_125_modem,"Cont-8/125","Cont8-125","","CONTESTI8/125","CONTESTI","","CT8/125",DISABLED_IO}, {MODE_CONTESTIA_8_250,&contestia_8_250_modem,"Cont-8/250","Cont8-250","","CONTESTI8/250","CONTESTI","","CT8/250",DISABLED_IO}, {MODE_CONTESTIA_8_500,&contestia_8_500_modem,"Cont-8/500","Cont8-500","","CONTESTI8/500","CONTESTI","","CT8/500",DISABLED_IO}, {MODE_CONTESTIA_8_1000,&contestia_8_1000_modem,"Cont-8/1K","Cont8-1K","","CONTESTI8/1000","CONTESTI","","CT8/1K",DISABLED_IO}, {MODE_CONTESTIA_8_2000,&contestia_8_2000_modem,"Cont-8/2K","Cont8-2K","","CONTESTI8/2000","CONTESTI","","CT8/2K",DISABLED_IO}, {MODE_CONTESTIA_16_250,&contestia_16_250_modem,"Cont-16/250","Cont16-250","","CONTESTI16/250","CONTESTI","","CT16/250",DISABLED_IO}, {MODE_CONTESTIA_16_500,&contestia_16_500_modem,"Cont-16/500","Cont16-500","","CONTESTI16/500","CONTESTI","","CT16/500",DISABLED_IO}, {MODE_CONTESTIA_16_1000,&contestia_16_1000_modem,"Cont-16/1K","Cont16-1K","","CONTESTI16/1000","CONTESTI","","CT16/1K",DISABLED_IO}, {MODE_CONTESTIA_16_2000,&contestia_16_2000_modem,"Cont-16/2K","Cont16-2K","","CONTESTI16/2000","CONTESTI","","CT16/2K",DISABLED_IO}, {MODE_CONTESTIA_32_1000,&contestia_32_1000_modem,"Cont-32/1K","Cont32-1K","","CONTESTI32/1000","CONTESTI","","CT32/1K",DISABLED_IO}, {MODE_CONTESTIA_32_2000,&contestia_32_2000_modem,"Cont-32/2K","Cont32-2K","","CONTESTI32/2000","CONTESTI","","CT32/2K",DISABLED_IO}, {MODE_CONTESTIA_64_500,&contestia_64_500_modem,"Cont-64/500","Cont64-500","","CONTESTI64/500","CONTESTI","","CT64/500",DISABLED_IO}, {MODE_CONTESTIA_64_1000,&contestia_64_1000_modem,"Cont-64/1K","Cont64-1K","","CONTESTI64/1000","CONTESTI","","CT64/1K",DISABLED_IO}, {MODE_CONTESTIA_64_2000,&contestia_64_2000_modem,"Cont-64/2K","Cont64-2K","","CONTESTI64/2000","CONTESTI","","CT64/2K",DISABLED_IO}, {MODE_DOMINOEXMICRO,&dominoexmicro_modem,"DOMEX Micro","DominoEX Micro","DOMINOEXMICRO","DOMINO","DOMINO","","DM M", DISABLED_IO }, {MODE_DOMINOEX4,&dominoex4_modem,"DOMEX4","DominoEX 4","DOMINOEX4","DOMINO","DOMINO","","DM 4", DISABLED_IO }, {MODE_DOMINOEX5,&dominoex5_modem,"DOMEX5","DominoEX 5","DOMINOEX5","DOMINO","DOMINO","","DM 5", DISABLED_IO }, {MODE_DOMINOEX8,&dominoex8_modem,"DOMEX8","DominoEX 8","DOMINOEX8","DOMINO","DOMINO","","DM 8", DISABLED_IO }, {MODE_DOMINOEX11,&dominoex11_modem,"DOMX11","DominoEX 11","DOMINOEX11","DOMINO","DOMINO","","DM11", DISABLED_IO }, {MODE_DOMINOEX16,&dominoex16_modem,"DOMX16","DominoEX 16","DOMINOEX16","DOMINO","DOMINO","","DM16", ARQ_IO | KISS_IO }, {MODE_DOMINOEX22,&dominoex22_modem,"DOMX22","DominoEX 22","DOMINOEX22","DOMINO","DOMINO","","DM22", ARQ_IO | KISS_IO }, {MODE_DOMINOEX44,&dominoex44_modem,"DOMX44","DominoEX 44","DOMINOEX44","DOMINO","DOMINO","","DM44", ARQ_IO | KISS_IO }, {MODE_DOMINOEX88,&dominoex88_modem,"DOMX88","DominoEX 88","DOMINOEX88","DOMINO","DOMINO","","DM88", ARQ_IO | KISS_IO }, {MODE_FELDHELL,&feld_modem,"FELDHELL","Feld Hell","","HELL","HELL","","HELL", DISABLED_IO }, {MODE_SLOWHELL,&feld_slowmodem,"SLOWHELL","Slow Hell","","HELL","HELL","","SHLL", DISABLED_IO }, {MODE_HELLX5,&feld_x5modem,"HELLX5","Feld Hell X5","","HELL","HELL","","HLX5", DISABLED_IO }, {MODE_HELLX9,&feld_x9modem,"HELLX9","Feld Hell X9","","HELL","HELL","","HLX9", DISABLED_IO }, {MODE_FSKH245,&feld_FMmodem,"FSKH245","FSK Hell-245","","FSKH245","HELL","FSKH245","FSKHL", DISABLED_IO }, {MODE_FSKH105,&feld_FM105modem,"FSKH105","FSK Hell-105","","FSKH105","HELL","FSKH105","H105", DISABLED_IO }, {MODE_HELL80,&feld_80modem,"HELL80","Hell 80","","HELL80","HELL","HELL80","HL80", DISABLED_IO }, {MODE_MFSK8,&mfsk8_modem,"MFSK8","MFSK-8","MFSK8","MFSK8","MFSK","MFSK8","MK 8", DISABLED_IO }, {MODE_MFSK16,&mfsk16_modem,"MFSK16","MFSK-16","MFSK16","MFSK16","MFSK","MFSK16","MK16", ARQ_IO | KISS_IO }, {MODE_MFSK32,&mfsk32_modem,"MFSK32","MFSK-32","MFSK32","MFSK32","MFSK","MFSK32","MK32", ARQ_IO | KISS_IO }, {MODE_MFSK4,&mfsk4_modem,"MFSK4","MFSK-4","MFSK4","MFSK4","MFSK","MFSK4","MK 4", DISABLED_IO }, {MODE_MFSK11,&mfsk11_modem,"MFSK11","MFSK-11","MFSK11","MFSK11","MFSK","MFSK11","MK11", DISABLED_IO }, {MODE_MFSK22,&mfsk22_modem,"MFSK22","MFSK-22","MFSK22","MFSK22","MFSK","MFSK22","MK22", DISABLED_IO }, {MODE_MFSK31,&mfsk31_modem,"MFSK31","MFSK-31","MFSK31","MFSK31","MFSK","MFSK31","MK31", ARQ_IO | KISS_IO }, {MODE_MFSK64,&mfsk64_modem,"MFSK64","MFSK-64","MFSK64","MFSK64","MFSK","MFSK64","MK64", ARQ_IO | KISS_IO }, {MODE_MFSK128,&mfsk128_modem,"MFSK128","MFSK-128","MFSK128","MFSK128","MFSK","MFSK128","MK128", ARQ_IO | KISS_IO }, {MODE_MFSK64L,&mfsk64l_modem,"MFSK64L","MFSK-64L","MFSK64L","MFSK64L","MFSK","MFSK64","MK64L", ARQ_IO | KISS_IO }, {MODE_MFSK128L,&mfsk128l_modem,"MFSK128L","MFSK-128L","MFSK128L","MFSK128L","MFSK","MFSK128","MK128L", ARQ_IO | KISS_IO }, {MODE_WEFAX_576,&wefax576_modem,"WEFAX576","WEFAX-IOC576","WEFAXIOC576","FAX","FAX","","FX576", DISABLED_IO }, {MODE_WEFAX_288,&wefax288_modem,"WEFAX288","WEFAX-IOC288","WEFAXIOC288","FAX","FAX","","FX288", DISABLED_IO }, {MODE_NAVTEX,&navtex_modem,"NAVTEX","NAVTEX","NAVTEX","TOR","NAVTEX","","NAVTEX", DISABLED_IO }, {MODE_SITORB,&sitorb_modem,"SITORB","SITORB","SITORB","TOR","SITORB","","SITORB", DISABLED_IO }, {MODE_MT63_500S,&mt63_500S_modem,"MT63-500S","MT63-500S","MT63-500S","MT63-500S","MT63","","MT63-500S", ARQ_IO | KISS_IO }, {MODE_MT63_500L,&mt63_500L_modem,"MT63-500L","MT63-500L","MT63-500L","MT63-500L","MT63","","MT63-500L", ARQ_IO | KISS_IO }, {MODE_MT63_1000S,&mt63_1000S_modem,"MT63-1KS","MT63-1000S","MT63-1XXS","MT63-1KS","MT63","","MT63 1KS", ARQ_IO | KISS_IO }, {MODE_MT63_1000L,&mt63_1000L_modem,"MT63-1KL","MT63-1000L","MT63-1XXL","MT63-1KL","MT63","","MT63 1KL", ARQ_IO | KISS_IO }, {MODE_MT63_2000S,&mt63_2000S_modem,"MT63-2KS","MT63-2000S","MT63-2XXS","MT63-2KS","MT63","","MT63 2KS", ARQ_IO | KISS_IO }, {MODE_MT63_2000L,&mt63_2000L_modem,"MT63-2KL","MT63-2000L","MT63-2XXL","MT63-2KL","MT63","","MT63 2KL", ARQ_IO | KISS_IO }, {MODE_PSK31,&psk31_modem,"BPSK31","BPSK-31","PSK31","PSK31","PSK","PSK31","P31", ARQ_IO | KISS_IO }, {MODE_PSK63,&psk63_modem,"BPSK63","BPSK-63","PSK63","PSK63","PSK","PSK63","P63", ARQ_IO | KISS_IO }, {MODE_PSK63F,&psk63f_modem,"BPSK63F","BPSK-63F","PSK63F","PSK63F","PSK","PSK63F","P63F", ARQ_IO | KISS_IO }, {MODE_PSK125,&psk125_modem,"BPSK125","BPSK-125","PSK125","PSK125","PSK","PSK125","P125", ARQ_IO | KISS_IO }, {MODE_PSK250,&psk250_modem,"BPSK250","BPSK-250","PSK250","PSK250","PSK","PSK250","P250", ARQ_IO | KISS_IO }, {MODE_PSK500,&psk500_modem,"BPSK500","BPSK-500","PSK500","PSK500","PSK","PSK500","P500", ARQ_IO | KISS_IO }, {MODE_PSK1000,&psk1000_modem,"BPSK1000","BPSK-1000","PSK1000","PSK1000","PSK","PSK1000","P1000", ARQ_IO | KISS_IO }, {MODE_12X_PSK125,&psk125_c12_modem,"PSK125C12","12xPSK125","PSK125C12","PSK125C12","PSK","","P125C12", ARQ_IO | KISS_IO }, {MODE_6X_PSK250,&psk250_c6_modem,"PSK250C6","6xPSK250","PSK250C6","PSK250C6","PSK","","P2506", ARQ_IO | KISS_IO }, {MODE_2X_PSK500,&psk500_c2_modem,"PSK500C2","2xPSK500","PSK500C2","PSK500C2","PSK","","2xP500", ARQ_IO | KISS_IO }, {MODE_4X_PSK500,&psk500_c4_modem,"PSK500C4","4xPSK500","PSK500C4","PSK500C4","PSK","","4xP500", ARQ_IO | KISS_IO }, {MODE_2X_PSK800,&psk800_c2_modem,"PSK800C2","2xPSK800","PSK800C2","PSK800C2","PSK","","P800RC2", ARQ_IO | KISS_IO }, {MODE_2X_PSK1000,&psk1000_c2_modem,"PSK1000C2","2xPSK1000","PSK1000C2","PSK1000C2","PSK","","P1KC2", ARQ_IO | KISS_IO }, {MODE_QPSK31,&qpsk31_modem,"QPSK31","QPSK-31","QPSK31","QPSK31","PSK","QPSK31","Q31", ARQ_IO | KISS_IO }, {MODE_QPSK63,&qpsk63_modem,"QPSK63","QPSK-63","QPSK63","QPSK63","PSK","QPSK63","Q63", ARQ_IO | KISS_IO }, {MODE_QPSK125,&qpsk125_modem,"QPSK125","QPSK-125","QPSK125","QPSK125","PSK","QPSK125","Q125", ARQ_IO | KISS_IO }, {MODE_QPSK250,&qpsk250_modem,"QPSK250","QPSK-250","QPSK250","QPSK250","PSK","QPSK250","Q250", ARQ_IO | KISS_IO }, {MODE_QPSK500,&qpsk500_modem,"QPSK500","QPSK-500","QPSK500","QPSK500","PSK","QPSK500","Q500", ARQ_IO | KISS_IO }, {MODE_8PSK125,&_8psk125_modem,"8PSK125","8PSK-125","8PSK125","8PSK125","PSK","","8PSK125", ARQ_IO | KISS_IO }, {MODE_8PSK125FL,&_8psk125fl_modem,"8PSK125FL","8PSK-125FL","8PSK125FL","8PSK125FL","PSK","","8PSK125FL", ARQ_IO | KISS_IO }, {MODE_8PSK125F,&_8psk125f_modem,"8PSK125F","8PSK-125F","8PSK125F","8PSK125F","PSK","","8PSK125F", ARQ_IO | KISS_IO }, {MODE_8PSK250,&_8psk250_modem,"8PSK250","8PSK-250","8PSK250","8PSK250","PSK","","8PSK250", ARQ_IO | KISS_IO }, {MODE_8PSK250FL,&_8psk250fl_modem,"8PSK250FL","8PSK-250FL","8PSK250FL","8PSK250F","PSK","","8PSK250FL", ARQ_IO | KISS_IO }, {MODE_8PSK250F,&_8psk250f_modem,"8PSK250F","8PSK-250F","8PSK250F","8PSK250F","PSK","","8PSK250F", ARQ_IO | KISS_IO }, {MODE_8PSK500,&_8psk500_modem,"8PSK500","8PSK-500","8PSK500","8PSK500","PSK","","8PSK500", ARQ_IO | KISS_IO }, {MODE_8PSK500F,&_8psk500f_modem,"8PSK500F","8PSK-500F","8PSK500F","8PSK500F","PSK","","8PSK500F", ARQ_IO | KISS_IO }, {MODE_8PSK1000,&_8psk1000_modem,"8PSK1000","8PSK-1000","8PSK1000","8PSK1000","PSK","","8PSK1000", ARQ_IO | KISS_IO }, {MODE_8PSK1000F,&_8psk1000f_modem,"8PSK1000F","8PSK-1000F","8PSK1000F","8PSK1000F","PSK","","8PSK1000F", ARQ_IO | KISS_IO }, {MODE_8PSK1200F,&_8psk1200f_modem,"8PSK1200F","8PSK-1200F","8PSK1200F","8PSK1200F","PSK","","8PSK1200F", ARQ_IO | KISS_IO }, {MODE_OFDM_500F,&ofdm_500f_modem,"OFDM500F","OFDM-500F","OFDM500F","OFDM500F","OFDM","","OFDM500F", ARQ_IO | KISS_IO }, {MODE_OFDM_750F,&ofdm_750f_modem,"OFDM750F","OFDM-750F","OFDM750F","OFDM750F","OFDM","","OFDM750F", ARQ_IO | KISS_IO }, //{MODE_OFDM_2000F,&ofdm_2000f_modem,"OFDM2000F","OFDM-2000F","OFDM2000F","OFDM2000F","OFDM","","OFDM2000F", ARQ_IO | KISS_IO }, //{MODE_OFDM_2000,&ofdm_2000_modem,"OFDM2000","OFDM-2000","OFDM2000","OFDM2000","OFDM","","OFDM2000", ARQ_IO | KISS_IO }, {MODE_OFDM_3500,&ofdm_3500_modem,"OFDM3500","OFDM-3500","OFDM3500","OFDM3500","OFDM","","OFDM3500", ARQ_IO | KISS_IO }, {MODE_OLIVIA,&olivia_modem,"OLIVIA","OLIVIA","OLIVIA","OLIVIA","OLIVIA","","OL", DISABLED_IO }, {MODE_OLIVIA_4_125,&olivia_4_125_modem,"OLIVIA-4/125","OL 4-125","OLIV 4-125","OLIVIA 4/125","OLIVIA","OLIVIA 4/125","OL4/125", ARQ_IO }, {MODE_OLIVIA_4_250,&olivia_4_250_modem,"OLIVIA-4/250","OL 4-250","OLIV 4-250","OLIVIA 4/250","OLIVIA","OLIVIA 4/250","OL4/250", ARQ_IO }, {MODE_OLIVIA_4_500,&olivia_4_500_modem,"OLIVIA-4/500","OL 4-500","OLIV 4-500","OLIVIA 4/500","OLIVIA","OLIVIA 4/500","OL4/500", ARQ_IO | KISS_IO }, {MODE_OLIVIA_4_1000,&olivia_4_1000_modem,"OLIVIA-4/1K","OL 4-1K","OLIV 4-1K","OLIVIA 4/1K","OLIVIA","OLIVIA 4/1K","OL4/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_4_2000,&olivia_4_2000_modem,"OLIVIA-4/2K","OL 4-2K","OLIV 4-2K","OLIVIA 4/2K","OLIVIA","OLIVIA 4/2K","OL4/2K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_8_125,&olivia_8_125_modem,"OLIVIA-8/125","OL 8-125","OLIV 8-125","OLIVIA 8/125","OLIVIA","OLIVIA 8/125","OL8/125", ARQ_IO }, {MODE_OLIVIA_8_250,&olivia_8_250_modem,"OLIVIA-8/250","OL 8-250","OLIV 8-250","OLIVIA 8/250","OLIVIA","OLIVIA 8/250","OL8/250", ARQ_IO }, {MODE_OLIVIA_8_500,&olivia_8_500_modem,"OLIVIA-8/500","OL 8-500","OLIV 8-500","OLIVIA 8/500","OLIVIA","OLIVIA 8/500","OL8/500", ARQ_IO | KISS_IO }, {MODE_OLIVIA_8_1000,&olivia_8_1000_modem,"OLIVIA-8/1K","OL 8-1K","OLIV 8-1K","OLIVIA 8/1K","OLIVIA","OLIVIA 8/1K","OL8/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_8_2000,&olivia_8_2000_modem,"OLIVIA-8/2K","OL 8-2K","OLIV 8-2K","OLIVIA 8/2K","OLIVIA","OLIVIA 8/2K","OL8/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_16_500,&olivia_16_500_modem,"OLIVIA-16/500","OL 16-500","OLIV 16-500","OLIVIA 16/500","OLIVIA","OLIVIA 16/500","OL16/500", ARQ_IO | KISS_IO }, {MODE_OLIVIA_16_1000,&olivia_16_1000_modem,"OLIVIA-16/1K","OL 16-1K","OLIV 16-1K","OLIVIA 16/1K","OLIVIA","OLIVIA 16/1K","OL16/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_16_2000,&olivia_16_2000_modem,"OLIVIA-16/2K","OL 16-2K","OLIV 16-2K","OLIVIA 16/2K","OLIVIA","OLIVIA 16/2K","OL16/2K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_32_1000,&olivia_32_1000_modem,"OLIVIA-32/1K","OL 32-1K","OLIV 32-1K","OLIVIA 32/1K","OLIVIA","OLIVIA 32/1K","OL32/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_32_2000,&olivia_32_2000_modem,"OLIVIA-32/2K","OL 32-2K","OLIV 32-2K","OLIVIA 32/2K","OLIVIA","OLIVIA 32/2K","OL32/2K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_64_500,&olivia_64_500_modem,"OLIVIA-64/500","OL 64-500","OLIV 64-500","OLIVIA 64/500","OLIVIA","","OL64/500", ARQ_IO | KISS_IO }, {MODE_OLIVIA_64_1000,&olivia_64_1000_modem,"OLIVIA-64/1K","OL 64-1K","OLIV 64-1K","OLIVIA 64/1K","OLIVIA","","OL64/1K", ARQ_IO | KISS_IO }, {MODE_OLIVIA_64_2000,&olivia_64_2000_modem,"OLIVIA-64/2K","OL 64-2K","OLIV 64-2K","OLIVIA 64/2K","OLIVIA","","OL64/2K", ARQ_IO | KISS_IO }, {MODE_RTTY,&rtty_modem,"RTTY","RTTY","RTTY","RTTY","RTTY","","RY", DISABLED_IO }, {MODE_THORMICRO,&thormicro_modem,"THOR Micro","THOR Micro","THORM","THOR-M","THOR","","THM", DISABLED_IO }, {MODE_THOR4,&thor4_modem,"THOR4","THOR 4","THOR4","THOR4","THOR","","TH4", DISABLED_IO }, {MODE_THOR5,&thor5_modem,"THOR5","THOR 5","THOR5","THOR5","THOR","","TH5", DISABLED_IO }, {MODE_THOR8,&thor8_modem,"THOR8","THOR 8","THOR8","THOR8","THOR","","TH8", DISABLED_IO }, {MODE_THOR11,&thor11_modem,"THOR11","THOR 11","THOR11","THOR11","THOR","","TH11", DISABLED_IO }, {MODE_THOR16,&thor16_modem,"THOR16","THOR 16","THOR16","THOR16","THOR","","TH16", ARQ_IO | KISS_IO }, {MODE_THOR22,&thor22_modem,"THOR22","THOR 22","THOR22","THOR22","THOR","","TH22", ARQ_IO | KISS_IO }, {MODE_THOR32,&thor32_modem,"THOR32","THOR 32","THOR32","THOR32","THOR","","TH32", ARQ_IO | KISS_IO }, {MODE_THOR44,&thor44_modem,"THOR44","THOR 44","THOR44","THOR44","THOR","","TH44", ARQ_IO | KISS_IO }, {MODE_THOR56,&thor56_modem,"THOR56","THOR 56","THOR56","THOR56","THOR","","TH56", ARQ_IO | KISS_IO }, {MODE_THOR25x4,&thor25x4_modem,"THOR25x4","THOR 25 x4","THOR25x4","THOR-25X4","THOR","","TH25", ARQ_IO | KISS_IO }, {MODE_THOR50x1,&thor50x1_modem,"THOR50x1","THOR 50 x1","THOR50x1","THOR-50X1","THOR","","TH51", ARQ_IO | KISS_IO }, {MODE_THOR50x2,&thor50x2_modem,"THOR50x2","THOR 50 x2","THOR50x2","THOR-50X2","THOR","","TH52", ARQ_IO | KISS_IO }, {MODE_THOR100,&thor100_modem,"THOR100","THOR 100","THOR100","THOR-100","THOR","","TH100", ARQ_IO | KISS_IO }, {MODE_THROB1,&throb1_modem,"THROB1","Throb 1","","THRB","THRB","","TB1", DISABLED_IO }, {MODE_THROB2,&throb2_modem,"THROB2","Throb 2","","THRB","THRB","","TB2", DISABLED_IO }, {MODE_THROB4,&throb4_modem,"THROB4","Throb 4","","THRB","THRB","","TB4", DISABLED_IO }, {MODE_THROBX1,&throbx1_modem,"THRBX1","ThrobX 1","","THRBX","THRB","THRBX","TX1", DISABLED_IO }, {MODE_THROBX2,&throbx2_modem,"THRBX2","ThrobX 2","","THRBX","THRB","THRBX","TX2", DISABLED_IO }, {MODE_THROBX4,&throbx4_modem,"THRBX4","ThrobX 4","","THRBX","THRB","THRBX","TX4", DISABLED_IO }, //{MODE_PACKET,&pkt_modem,"PACKET","Packet","","PKT","PKT","PKT",ARQ_IO | KISS_IO }, {MODE_PSK125R,&psk125r_modem,"PSK125R","PSK-125R","PSK125R","PSK125R","PSK","","P125R", ARQ_IO | KISS_IO }, {MODE_PSK250R,&psk250r_modem,"PSK250R","PSK-250R","PSK250R","PSK250R","PSK","","P250R", ARQ_IO | KISS_IO }, {MODE_PSK500R,&psk500r_modem,"PSK500R","PSK-500R","PSK500R","PSK500R","PSK","","P500R", ARQ_IO | KISS_IO }, {MODE_PSK1000R,&psk1000r_modem,"PSK1000R","PSK-1000R","PSK1000R","PSK1000R","PSK","","PSK1000R", ARQ_IO | KISS_IO }, {MODE_4X_PSK63R,&psk63r_c4_modem,"PSK63RC4","4xPSK63R","PSK63RC4","PSK63RC4","PSK","","P63R4", ARQ_IO | KISS_IO }, {MODE_5X_PSK63R,&psk63r_c5_modem,"PSK63RC5","5xPSK63R","PSK63RC5","PSK63RC5","PSK","","P63R5", ARQ_IO | KISS_IO }, {MODE_10X_PSK63R,&psk63r_c10_modem,"PSK63RC10","10xPSK63R","PSK63RC10","PSK63RC10","PSK","","P63R10", ARQ_IO | KISS_IO }, {MODE_20X_PSK63R,&psk63r_c20_modem,"PSK63RC20","20xPSK63R","PSK63RC20","PSK63RC20","PSK","","P63R20", ARQ_IO | KISS_IO }, {MODE_32X_PSK63R,&psk63r_c32_modem,"PSK63RC32","32xPSK63R","PSK63RC32","PSK63RC32","PSK","","P63R32", ARQ_IO | KISS_IO }, {MODE_4X_PSK125R,&psk125r_c4_modem,"PSK125RC4","4xPSK125R","PSK125RC4","PSK125RC4","PSK","","P125R4", ARQ_IO | KISS_IO }, {MODE_5X_PSK125R,&psk125r_c5_modem,"PSK125RC5","5xPSK125R","PSK125RC5","PSK125RC5","PSK","","P125R5", ARQ_IO | KISS_IO }, {MODE_10X_PSK125R,&psk125r_c10_modem,"PSK125RC10","10xPSK125R","PSK125RC10","PSK125RC10","PSK","","P125R10", ARQ_IO | KISS_IO }, {MODE_12X_PSK125R,&psk125r_c12_modem,"PSK125RC12","12xPSK125R","PSK125RC12","PSK125RC12","PSK","","P125R12", ARQ_IO | KISS_IO }, {MODE_16X_PSK125R,&psk125r_c16_modem,"PSK125RC16","16xPSK125R","PSK125RC16","PSK125RC16","PSK","","P125R16", ARQ_IO | KISS_IO }, {MODE_2X_PSK250R,&psk250r_c2_modem,"PSK250RC2","2xPSK250R","PSK250RC2","PSK250RC2","PSK","","P250R2", ARQ_IO | KISS_IO }, {MODE_3X_PSK250R,&psk250r_c3_modem,"PSK250RC3","3xPSK250R","PSK250RC3","PSK250RC3","PSK","","P250R3", ARQ_IO | KISS_IO }, {MODE_5X_PSK250R,&psk250r_c5_modem,"PSK250RC5","5xPSK250R","PSK250RC5","PSK250RC5","PSK","","P250R5", ARQ_IO | KISS_IO }, {MODE_6X_PSK250R,&psk250r_c6_modem,"PSK250RC6","6xPSK250R","PSK250RC6","PSK250RC6","PSK","","P250R6", ARQ_IO | KISS_IO }, {MODE_7X_PSK250R,&psk250r_c7_modem,"PSK250RC7","7xPSK250R","PSK250RC7","PSK250RC7","PSK","","P250R7", ARQ_IO | KISS_IO }, {MODE_2X_PSK500R,&psk500r_c2_modem,"PSK500RC2","2xPSK500R","PSK500RC2","PSK500RC2","PSK","","P500R2", ARQ_IO | KISS_IO }, {MODE_3X_PSK500R,&psk500r_c3_modem,"PSK500RC3","3xPSK500R","PSK500RC3","PSK500RC3","PSK","","P500R3", ARQ_IO | KISS_IO }, {MODE_4X_PSK500R,&psk500r_c4_modem,"PSK500RC4","4xPSK500R","PSK500RC4", "PSK500RC4","PSK","","P500R4", ARQ_IO | KISS_IO }, {MODE_2X_PSK800R,&psk800r_c2_modem,"PSK800RC2","2xPSK800R","PSK800RC2","PSK800RC2","PSK","","P800RC2", ARQ_IO | KISS_IO }, {MODE_2X_PSK1000R,&psk1000r_c2_modem,"PSK1000RC2","2xPSK1000R","PSK1000RC2","PSK1000RC2","PSK","","P1KRC2", ARQ_IO | KISS_IO }, {MODE_FSQ,&fsq_modem,"FSQ","FSQ","FSQ","FSQ","FSQ","","FSQ", DISABLED_IO }, {MODE_IFKP,&ifkp_modem,"IFKP","IFKP","IFKP","IFKP","IFKP","","IFKP", DISABLED_IO }, {MODE_SSB,&ssb_modem,"SSB","SSB","","SSB","SSB","","", DISABLED_IO }, {MODE_WWV,&wwv_modem,"WWV","WWV","","","","","", DISABLED_IO }, {MODE_ANALYSIS,&anal_modem,"ANALYSIS","Freq Analysis","","","","","", DISABLED_IO }, {MODE_FMT,&fmt_modem,"FMT","Frequency Measurement Test","","","","","", DISABLED_IO }, {MODE_EOT,&null_modem,"RSID_EOT","EOT","","EOT","","","", DISABLED_IO } }; std::string adif2export(std::string adif) { std::string test = ucasestr(adif); for (int n = 0; n < NUM_MODES; n++) { if (test == ucasestr(mode_info[n].sname) || test == ucasestr(mode_info[n].adif_name) || test == ucasestr(mode_info[n].export_mode) || test == ucasestr(mode_info[n].export_submode)) return ucasestr(mode_info[n].export_mode); } return test; } std::string adif2submode(std::string adif) { std::string test = ucasestr(adif); for (int n = 0; n < NUM_MODES; n++) { if (test == ucasestr(mode_info[n].sname) || test == ucasestr(mode_info[n].adif_name) || test == ucasestr(mode_info[n].export_mode) || test == ucasestr(mode_info[n].export_submode)) return ucasestr(mode_info[n].export_submode); } return ""; } std::ostream& operator<<(std::ostream& s, const qrg_mode_t& m) { return s << m.rfcarrier << ' ' << m.rmode << ' ' << m.carrier << ' ' << mode_info[m.mode].sname << ' ' << m.usage; } std::istream& operator>>(std::istream& s, qrg_mode_t& m) { std::string sMode; char temp[255]; int mnbr; s >> m.rfcarrier >> m.rmode >> m.carrier >> sMode; s.getline(temp, 255); m.usage = temp; while (m.usage[0] == ' ') m.usage.erase(0,1); // handle case for reading older type of specification std::string if (sscanf(sMode.c_str(), "%d",&mnbr)) { m.mode = mnbr; return s; } m.mode = MODE_PSK31; for (mnbr = MODE_CW; mnbr < NUM_MODES; mnbr++) if (sMode == mode_info[mnbr].sname) { m.mode = mnbr; break; } return s; } std::string qrg_mode_t::str(void) { std::ostringstream s; s << std::setiosflags(std::ios::fixed) << std::setprecision(3) << rfcarrier/1000.0 << '|' << rmode << '|' << (mode < NUM_MODES ? mode_info[mode].sname : "NONE") << '|' // << carrier; << carrier << '|' << usage; return s.str(); } band_t band(long long freq_hz) { switch (freq_hz / 1000000LL) { case 0: case 1: return BAND_160M; case 3: return BAND_80M; case 4: return BAND_75M; case 5: return BAND_60M; case 7: return BAND_40M; case 10: return BAND_30M; case 14: return BAND_20M; case 18: return BAND_17M; case 21: return BAND_15M; case 24: return BAND_12M; case 28 ... 29: return BAND_10M; case 50 ... 54: return BAND_6M; case 70 ... 71: return BAND_4M; case 144 ... 148: return BAND_2M; case 222 ... 225: return BAND_125CM; case 420 ... 450: return BAND_70CM; case 902 ... 928: return BAND_33CM; case 1240 ... 1325: return BAND_23CM; case 2300 ... 2450: return BAND_13CM; case 3300 ... 3500: return BAND_9CM; case 5650 ... 5925: return BAND_6CM; case 10000 ... 10500: return BAND_3CM; case 24000 ... 24250: return BAND_125MM; case 47000 ... 47200: return BAND_6MM; case 75500 ... 81000: return BAND_4MM; case 119980 ... 120020: return BAND_2P5MM; case 142000 ... 149000: return BAND_2MM; case 241000 ... 250000: return BAND_1MM; } return BAND_OTHER; } band_t band(const char* freq_mhz) { errno = 0; double d = strtod(freq_mhz, NULL); if (d != 0.0 && errno == 0) return band((long long)(d * 1e6)); else return BAND_OTHER; } struct band_freq_t { const char* band; const char* freq; }; static struct band_freq_t band_names[NUM_BANDS] = { { "160m", "1.8" }, { "80m", "3.5" }, { "75m", "4.0" }, { "60m", "5.3" }, { "40m", "7.0" }, { "30m", "10.0" }, { "20m", "14.0" }, { "17m", "18.0" }, { "15m", "21.0" }, { "12m", "24.0" }, { "10m", "28.0" }, { "6m", "50.0" }, { "4m", "70.0" }, { "2m", "144.0" }, { "1.25m", "222.0" }, { "70cm", "420.0" }, { "33cm", "902.0" }, { "23cm", "1240.0" }, { "13cm", "2300.0" }, { "9cm", "3300.0" }, { "6cm", "5650.0" }, { "3cm", "10000.0" }, { "1.25cm", "24000.0" }, { "6mm", "47000.0" }, { "4mm", "75500.0" }, { "2.5mm", "119980.0" }, { "2mm", "142000.0" }, { "1mm", "241000.0" }, { "other", "" } }; const char* band_name(band_t b) { return band_names[CLAMP(b, 0, NUM_BANDS-1)].band; } const char* band_name(const char* freq_mhz) { return band_name(band(freq_mhz)); } const char* band_freq(band_t b) { return band_names[CLAMP(b, 0, NUM_BANDS-1)].freq; } const char* band_freq(const char* band_name) { for (size_t i = 0; i < BAND_OTHER; i++) if (!strcmp(band_names[i].band, band_name)) return band_names[i].freq; return ""; } fldigi-4.2.05/src/wefax/0000775000175000017500000000000014611714005011743 500000000000000fldigi-4.2.05/src/wefax/wefax_map.cxx0000664000175000017500000005151314611711171014364 00000000000000// ---------------------------------------------------------------------------- // wefax_map.cxx rgb wefax_map viewer // // Copyright (C) 2006-2017 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 4 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "trx.h" #include "wefax_map.h" #include "debug.h" #include "timeops.h" wefax_map::wefax_map (int X, int Y, int W, int H, int bg_col) : Fl_Widget (X, Y, W, H) { box(FL_FLAT_BOX); width = W; height = H; bufsize = W * H * depth; numcol = 0; slantdir = 0; vidbuf = new unsigned char[bufsize]; background = bg_col ; memset( vidbuf, background, bufsize ); zoom = 0 ; binary = false ; binary_threshold = 128 ; } wefax_map::~wefax_map() { if (vidbuf) delete [] vidbuf; } void wefax_map::video(unsigned char const *data, int len ) { if (len > bufsize) return; memcpy( vidbuf, data, len ); redraw(); } unsigned char wefax_map::pixel(int pos) { if (pos < 0 || pos >= bufsize) return 0; return vidbuf[pos]; } void wefax_map::clear() { memset(vidbuf, background, bufsize); redraw(); } void wefax_map::resize_zoom(int x, int y, int w, int h) { if( zoom < 0 ) { int stride = -zoom + 1 ; Fl_Widget::resize(x,y,w/stride,h/stride); } else if( zoom > 0 ) { int stride = zoom + 1 ; Fl_Widget::resize(x,y,w*stride,h*stride); } else { Fl_Widget::resize(x,y,w,h); } } void wefax_map::resize(int x, int y, int w, int h) { width = w; height = h; delete [] vidbuf; bufsize = depth * w * h; vidbuf = new unsigned char[bufsize]; memset( vidbuf, background, bufsize ); resize_zoom(x,y,w,h); } /// No data destruction. Used when the received image grows more than expected. /// Beware that this is not protected by a mutex. void wefax_map::resize_height(int new_height, bool clear_img) { int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; if( clear_img ) { /// Sets to zero the complete image. memset( new_vidbuf, background, new_bufsize ); } else { if( new_height <= height ) { memcpy( new_vidbuf, vidbuf, new_bufsize ); } else { memcpy( new_vidbuf, vidbuf, bufsize ); memset( new_vidbuf + bufsize, background, new_bufsize - bufsize ); } } delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } void wefax_map::stretch(double the_ratio) { /// We do not change the width but the height int new_height = height * the_ratio + 0.5 ; int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; /// No interpolation, it takes the nearest pixel. for( int ix_out = 0 ; ix_out < new_bufsize ; ix_out += depth ) { int ix_in = 0.5 + ( double )ix_out * the_ratio ; switch( ix_in % depth ) { case 1 : --ix_in ; break ; case 2 : ++ix_in ; break ; default: ; } if( ix_in >= bufsize ) { /// Grey value as a filler to indicate the end. For debugging. memset( new_vidbuf + ix_out, 128, new_bufsize - ix_out ); break ; } for( int i = 0; i < depth ; ++i ) { new_vidbuf[ ix_out + i ] = vidbuf[ ix_in + i ]; } }; delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } /// Change the horizontal center of the image by shifting the pixels. void wefax_map::shift_horizontal_center(int horizontal_shift) { /// This is a number of pixels. horizontal_shift *= depth ; if( horizontal_shift < -bufsize ) { horizontal_shift = -bufsize ; } if( horizontal_shift > 0 ) { /// Here we lose a couple of pixels at the end of the buffer /// if there is not a line enough. It should not be a lot. memmove( vidbuf + horizontal_shift, vidbuf, bufsize - horizontal_shift ); memset( vidbuf, background, horizontal_shift ); } else { /// Here, it is not necessary to reduce the buffer size. memmove( vidbuf, vidbuf - horizontal_shift, bufsize + horizontal_shift ); memset( vidbuf + bufsize + horizontal_shift, background, -horizontal_shift ); } redraw(); } void wefax_map::set_zoom( int the_zoom ) { zoom = the_zoom ; /// The size of the displayed bitmap is changed. resize_zoom( x(), y(), width, height ); } // in data user data passed to function // in x_screen,y_screen,wid_screen position and width of scan line in image // out buf buffer for generated image data. // Must copy wid_screen pixels from scanline y_screen, starting at pixel x_screen to this buffer. void wefax_map::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, uchar * __restrict__ buf) { const wefax_map * __restrict__ ptr_pic = ( const wefax_map * ) data ; const int img_width = ptr_pic->width ; const unsigned char * __restrict__ in_ptr = ptr_pic->vidbuf ; /// One pixel out of (zoom+1) if( ptr_pic->zoom < 0 ) { const int stride = -ptr_pic->zoom + 1 ; const int in_offset = ( img_width * y_screen + x_screen ) * stride ; int dpth_in_offset = depth * in_offset ; if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth * stride ; } } else { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = in_ptr[ dpth_in_offset ]; buf[ ix_w + 1 ] = in_ptr[ dpth_in_offset + 1 ]; buf[ ix_w + 2 ] = in_ptr[ dpth_in_offset + 2 ]; dpth_in_offset += depth * stride ; } } return ; } /// Reads each input pixel (-zoom+1) times. if( ptr_pic->zoom > 0 ) { const int stride = ptr_pic->zoom + 1 ; const int in_offset = img_width * ( y_screen / stride ) + x_screen / stride ; #ifndef NDEBUG if( y_screen / stride >= ptr_pic->h() ) { LOG_ERROR( "Overflow2 y_screen=%d h=%d y_screen*stride=%d height=%d stride=%d\n", y_screen, ptr_pic->h(), (y_screen/stride), ptr_pic->height, stride ); return ; } #endif if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); unsigned char in_dpth_in_offset_1 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); unsigned char in_dpth_in_offset_2 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } else { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = in_ptr[ dpth_in_offset ]; unsigned char in_dpth_in_offset_1 = in_ptr[ dpth_in_offset + 1 ]; unsigned char in_dpth_in_offset_2 = in_ptr[ dpth_in_offset + 2 ]; // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } return ; } // zoom == 0, stride=1 const int in_offset = img_width * y_screen + x_screen ; if(ptr_pic->binary) { int dpth_in_offset = depth * in_offset ; for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth ; } } else { abort(); // This should never be called, see optimization in wefax_map::draw(). } } // wefax_map::draw_cb void wefax_map::draw() { if( ( zoom == 0 ) && ( binary == false ) ) { /// No scaling, this is faster. fl_draw_image( vidbuf, x(), y(), w(), h() ); } else { fl_draw_image( draw_cb, this, x(), y(), w(), h() ); // redraw(); } } void wefax_map::slant_undo() { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0 || slantdir == 0) return; if (slantdir == -1) { // undo from left for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } } else if (slantdir == 1) { // undo from right for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } } slantdir = 0; redraw(); } void wefax_map::slant_corr(int x, int y) { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0) return; if (x > width / 2) { // unwrap from right numcol = (width - x) * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } slantdir = 1; } else { // unwrap from left numcol = x * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } slantdir = -1; } redraw(); } int wefax_map::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_RELEASE) { int xpos = Fl::event_x() - x(); int ypos = Fl::event_y() - y(); int evb = Fl::event_button(); if (evb == 1) slant_corr(xpos, ypos); else if (evb == 3) slant_undo(); LOG_DEBUG("#2 %d, %d", xpos, ypos); return 1; } return 1; } return 0; } static FILE* open_file(const char* name, const char* suffix) { FILE* fp; std::string fname = name; if (fname[fname.length() - 1] == '/') { // if the name ends in a slash we will generate // a timestamped name in the following format: char stamp[50]; time_t time_sec = time(0); struct tm ztime; (void)gmtime_r(&time_sec, &ztime); size_t sz; if ((sz = strftime(stamp, sizeof(stamp), "pic_%Y-%m-%d_%H%M%Sz", &ztime)) > 0) { fname.append(stamp); fname.append(suffix); mkdir(name, 0777); fp = fopen(fname.c_str(), "wb"); } else fp = NULL; } else { if (fname.find(suffix) == std::string::npos) fname.append(suffix); fp = fopen(fname.c_str(), "wb"); } return fp; } static inline unsigned char avg_pix( const unsigned char * vidbuf ) { return ( vidbuf[ 0 ] + vidbuf[ 1 ] + vidbuf[ 2 ] ) / wefax_map::depth ; } int wefax_map::save_png(const char* filename, const char *extra_comments) { FILE* fp; if ((fp = open_file(filename, ".png")) == NULL) return -1; // set up the png structures png_structp png; png_infop info; if ((png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL) { fclose(fp); return -1; } /* png_set_compression_level() shall set the compression level to "level". * The valid values for "level" range from [0,9], corresponding directly * to compression levels for zlib. The value 0 implies no compression * and 9 implies maximal compression. Note: Tests have shown that zlib * compression levels 3-6 usually perform as well as level 9 for PNG images, * and do considerably fewer calculations. */ png_set_compression_level(png, Z_BEST_COMPRESSION); if ((info = png_create_info_struct(png)) == NULL) { png_destroy_write_struct(&png, NULL); fclose(fp); return -1; } if (setjmp(png_jmpbuf(png))) { png_destroy_write_struct(&png, &info); fclose(fp); return -1; } // use an stdio stream png_init_io(png, fp); // set png header int color_type = PNG_COLOR_TYPE_RGB ; /// Color images must take eight bits per pixel. const int bit_depth = 8;//( monochrome && binary ) ? 1 : 8 ; png_set_IHDR(png, info, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); // write text comments struct tm tm; time_t t = time(NULL); gmtime_r(&t, &tm); char z[20 + 1]; strftime(z, sizeof(z), "%Y-%m-%dT%H:%M:%SZ", &tm); z[sizeof(z) - 1] = '\0'; std::ostringstream comment; comment << "Program: " PACKAGE_STRING << '\n' << "Received: " << z << '\n' << "Modem: " << mode_info[active_modem->get_mode()].name << '\n' << "Frequency: " << inpFreq->value() << '\n'; if( extra_comments ) { comment << extra_comments ; } if (inpCall->size()) comment << "Log call: " << inpCall->value() << '\n'; // set text png_text text; text.key = strdup("Comment"); text.text = strdup(comment.str().c_str()); text.compression = PNG_TEXT_COMPRESSION_NONE; png_set_text(png, info, &text, 1); // write header png_write_info(png, info); // Extra check for debugging. if( height * width * depth != bufsize ) { LOG_ERROR("Buffer inconsistency h=%d w=%d b=%d", height, width, bufsize ); } // write image /* if(monochrome) { unsigned char tmp_row[width]; png_bytep row; for (int i = 0; i < height; i++) { int row_offset = i * width * depth ; if( binary ) { unsigned char accumPix = 0 ; int j_offset = 0 ; for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; unsigned char tmpChr = avg_pix( vidbuf + col_offset ); tmpChr = pix2bin(tmpChr) ? 1 : 0 ; j_offset = j & 0x07 ; tmpChr = tmpChr << ( 7 - j_offset ); accumPix |= tmpChr ; if( j_offset == 7 ) { tmp_row[ j >> 3 ] = accumPix ; accumPix = 0 ; } } if( j_offset != 7 ) { tmp_row[ width >> 3 ] = accumPix ; } } else { for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; tmp_row[j] = avg_pix( vidbuf + col_offset ); } } row = tmp_row; png_write_rows(png, &row, 1); } } else */ { png_bytep row; for (int i = 0; i < height; i++) { row = &vidbuf[i * width * depth]; png_write_rows(png, &row, 1); } } png_write_end(png, info); // clean up free(text.key); free(text.text); png_destroy_write_struct(&png, &info); fclose(fp); return 0; } bool wefax_map::restore( int row, int margin ) { if( ( row <= noise_height_margin ) || ( row >= height ) ) return true; unsigned char * line_ante = vidbuf + (row - noise_height_margin) * width * depth; // Copy the new calculated value (at previous call) to all channels. // TODO: Do that when switching off noise removal, otherwise a couple of colored pixels are left. for( int col = margin ; col < width - margin; ++col ) { int offset = col * depth ; line_ante[ offset ] = line_ante[ offset + 2 ] = line_ante[ offset + 1 ]; } return false ; } void wefax_map::erosion( int row ) { static const size_t margin_one = 1 ; if( restore( row, margin_one ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; for( size_t col = margin_one ; col < width - margin_one; ++col ) { unsigned char new_pix = 255 ; new_pix = std::min( new_pix, line_prev[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col + 1 ) ] ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } void wefax_map::remove_noise( int row, int half_len, int noise_margin ) { if( restore( row, half_len ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; const int nb_neighbours = ( 2 * ( 2 * half_len + 1 ) ); int medians[nb_neighbours]; /// Takes into account the first component only. for( int col = half_len ; col < width - half_len; ++col ) { int curr_pix = line_curr[ col * depth ]; assert( ( curr_pix >= 0 ) && ( curr_pix <= 255 ) ); int pix_min = 255, pix_max = 0; for( int subcol = col - half_len, tmp, nghb_i = 0 ; subcol <= col + half_len ; ++subcol ) { int offset = subcol * depth ; tmp = line_prev[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; tmp = line_next[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; } // Maybe the pixel is between min and max. int thres_min = pix_min - noise_margin; if(thres_min < 0) thres_min = 0; assert(thres_min <= pix_min); int thres_max = pix_max + noise_margin; if(thres_max > 255 ) thres_max = 255; if(thres_max < pix_max) abort(); if( ( curr_pix >= thres_min ) && ( curr_pix <= thres_max ) ) continue ; assert( ( pix_max >= 0 ) && ( pix_max <= 255 ) ); std::sort( medians, medians + nb_neighbours ); int new_pix = medians[ nb_neighbours / 2 ]; assert( new_pix >= 0 ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } int wefax_picbox::handle(int event) { if (!Fl::event_inside(this)) return 0; switch (event) { case FL_DND_ENTER: case FL_DND_LEAVE: case FL_DND_DRAG: case FL_DND_RELEASE: return 1; case FL_PASTE: break; default: return Fl_Box::handle(event); } // handle FL_PASTE std::string text = Fl::event_text(); // from dnd event "file:///home/dave/Photos/dave.jpeg" std::string::size_type p; if ((p = text.find("file://")) != std::string::npos) text.erase(0, p + strlen("file://")); if ((p = text.find('\r')) != std::string::npos) text.erase(p); if ((p = text.find('\n')) != std::string::npos) text.erase(p); struct stat st; if (stat(text.c_str(), &st) == -1 || !S_ISREG(st.st_mode)) return 0; extern void load_image(const char*); load_image(text.c_str()); return 1; } fldigi-4.2.05/src/wefax/wefax.cxx0000664000175000017500000024474114611711171013536 00000000000000// --------------------------------------------------------------------- // wefax.cxx -- Weather Fax modem // // Copyright (C) 2019 // Remi Chateauneu, F4ECW // David Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in HAMFAX source code // distribution. // Hamfax Copyright (C) Christof Schmitt // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // --------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "gettext.h" #include "wefax.h" #include "modem.h" #include "main.h" #include "misc.h" #include "timeops.h" #include "fl_digi.h" #include "configuration.h" #include "status.h" #include "filters.h" #include "strutil.h" #include "wefax-pic.h" #include "ascii.h" #include "qrunner.h" // --------------------------------------------------------------------- // // --------------------------------------------------------------------- #define PUT_STATUS(A) \ { \ std::stringstream strm_status ; \ strm_status << A ; \ LOG_DEBUG("%s", strm_status.str().c_str()); \ } // put_status(strm_status.str().c_str()); // --------------------------------------------------------------------- // Core of the code taken from Hamfax. // --------------------------------------------------------------------- /// No reasonable FIR filter should have more coefficients than that. #define MAX_FILT_SIZE 256 struct fir_coeffs { const char * _name ; int _size ; const double _coefs[MAX_FILT_SIZE]; }; // Narrow, middle and wide fir low pass filter from ACfax static const fir_coeffs input_filters[] = { { _("Narrow"), 65, { 0.000495, 0.000684, 0.000885, 0.00109, 0.00128, 0.00141, 0.00142, 0.00124, 0.000793, 2.94e-05, -0.00108, -0.00251, -0.0042, -0.00602, -0.00778, -0.00925, -0.0101, -0.0102, -0.00909, -0.00664, -0.00267, 0.00289, 0.01, 0.0185, 0.0281, 0.0383, 0.0488, 0.059, 0.0682, 0.0761, 0.0821, 0.0858, 0.0871, 0.0858, 0.0821, 0.0761, 0.0682, 0.059, 0.0488, 0.0383, 0.0281, 0.0185, 0.01, 0.00289, -0.00267, -0.00664, -0.00909, -0.0102, -0.0101, -0.00925, -0.00778, -0.00602, -0.0042, -0.00251, -0.00108, 2.94e-05, 0.000793, 0.00124, 0.00142, 0.00141, 0.00128, 0.00109, 0.000885, 0.000684, 0.000495 } }, { _("Medium"), 65, { -0.000795, -0.000779, -0.000698, -0.000517, -0.000195, 0.000303, 0.000982, 0.0018, 0.00267, 0.00343, 0.00389, 0.00383, 0.00306, 0.00144, -0.00102, -0.0042, -0.0078, -0.0114, -0.0143, -0.0159, -0.0156, -0.0127, -0.00695, 0.00188, 0.0136, 0.0277, 0.0434, 0.0596, 0.0752, 0.0889, 0.0997, 0.106, 0.109, 0.106, 0.0997, 0.0889, 0.0752, 0.0596, 0.0434, 0.0277, 0.0136, 0.00188, -0.00695, -0.0127, -0.0156, -0.0159, -0.0143, -0.0114, -0.0078, -0.0042, -0.00102, 0.00144, 0.00306, 0.00383, 0.00389, 0.00343, 0.00267, 0.0018, 0.000982, 0.000303, -0.000195, -0.000517, -0.000698, -0.000779, -0.000795 } }, { _("Wide"), 65, { 0.000716, 0.000844, 0.000845, 0.000668, 0.000259, -0.000402, -0.00126, -0.00216, -0.00284, -0.003, -0.00234, -0.00073, 0.00175, 0.0047, 0.00747, 0.00922, 0.00911, 0.00655, 0.00143, -0.00575, -0.0138, -0.0209, -0.025, -0.0241, -0.0167, -0.00203, 0.0193, 0.0457, 0.0743, 0.102, 0.125, 0.14, 0.145, 0.14, 0.125, 0.102, 0.0743, 0.0457, 0.0193, -0.00203, -0.0167, -0.0241, -0.025, -0.0209, -0.0138, -0.00575, 0.00143, 0.00655, 0.00911, 0.00922, 0.00747, 0.0047, 0.00175, -0.00073, -0.00234, -0.003, -0.00284, -0.00216, -0.00126, -0.000402, 0.000259, 0.000668, 0.000845, 0.000844, 0.000716 } } }; static const size_t nb_filters = sizeof(input_filters)/sizeof(input_filters[0]); ; /// This contains all possible reception filters. class fir_filter_pair_set : public std::vector< C_FIR_filter > { /// This, because C_FIR_filter cannot be copied. fir_filter_pair_set(const fir_filter_pair_set &); fir_filter_pair_set & operator = (const fir_filter_pair_set &); public: static const char ** filters_list(void) { /// There will be a small memory leak when leaving. No problem at all. static const char ** stt_filters = NULL ; if (stt_filters == NULL) { stt_filters = new const char * [nb_filters + 1]; for(size_t ix_filt = 0 ; ix_filt < nb_filters ; ++ix_filt) { stt_filters[ix_filt] = input_filters[ix_filt]._name ; } stt_filters[nb_filters] = NULL ; } return stt_filters ; } fir_filter_pair_set() { /// Beware that C_FIR_filter cannot be copied with its content. resize(nb_filters); for(size_t ix_filt = 0 ; ix_filt < nb_filters ; ++ix_filt) { // Same filter for real and imaginary. const fir_coeffs * ptr_filt = input_filters + ix_filt ; // init() should take const double pointers. operator[](ix_filt).init(ptr_filt->_size, 1, const_cast< double * >(ptr_filt->_coefs), const_cast< double * >(ptr_filt->_coefs)); } } }; // fir_filter_pair_set /// Speed-up of trigonometric calculations. template class lookup_table { T * m_table; size_t m_table_size; size_t m_next; size_t m_increment; /// No default constructor because it would invalidate the buffer pointer. lookup_table(); lookup_table(const lookup_table &); lookup_table & operator = (const lookup_table &); public: lookup_table(const size_t N) : m_table_size(N), m_next(0), m_increment(0) { assert(N != 0); /// If no more memory, an exception will be thrown. m_table = new T[m_table_size]; } ~lookup_table(void) { delete[] m_table; } T& operator[](size_t i) { return m_table[i]; } void set_increment(size_t i) { m_increment = i; } T next_value(void) { m_next+=m_increment; if (m_next>=m_table_size) { m_next%=m_table_size; } return m_table[m_next]; } size_t size(void) const { return m_table_size; } void reset(void) { m_next = 0; } }; // lookup_table typedef enum { RXAPTSTART, RXAPTSTOP, RXPHASING, RXIMAGE, TXAPTSTART, TXPHASING, ENDPHASING, TXIMAGE, TXAPTSTOP, TXBLACK, IDLE } fax_state; static const char * state_to_str(fax_state a_state) { switch(a_state) { case RXAPTSTART : return _("APT reception start"); case RXAPTSTOP : return _("APT reception stop"); case RXPHASING : return _("Phasing reception"); case RXIMAGE : return _("Receiving"); case TXAPTSTART : return _("APT transmission start"); case TXAPTSTOP : return _("APT stop"); case TXPHASING : return _("Phasing transmission"); case ENDPHASING : return _("End phasing"); case TXIMAGE : return _("Sending image"); case TXBLACK : return _("Sending black"); case IDLE : return _("Idle"); } return "UNKNOWN"; }; /// TODO: This should be hidden to this class. static const int bytes_per_pixel = 3; #define IOC_576 576 #define IOC_288 288 /// Index of correlation to image width. static int ioc_to_width(int ioc) { return ioc * M_PI ; }; /// Used by bandwidth. Standard shift is 800 Hz, so deviation is 400 Hz. /// Deutsche Wetterdienst (DWD) shift is 850 Hz. static int fm_deviation = -1 ; #define GARBAGE_STR "garbage" class fax_implementation { wefax * m_ptr_wefax ; // Points to the modem of which this is the implementation. fax_state m_rx_state ; // RXPHASING, RXIMAGE etc... bool rx_state_changed; int m_sample_rate; // Set at startup: 8000, 11025 etc... int m_current_value; // Latest received pixel value. bool m_apt_high; int m_apt_trans; // APT low-high transitions int m_apt_count; // samples counted for m_apt_trans int m_apt_start_freq; // Standard APT frequency. Set at startup. int m_apt_stop_freq; // Standard APT frequency. bool m_phase_high; // When state=RXPHASING int m_curr_phase_len; // Counts the len of the image band used for phasing int m_curr_phase_high; // Counts the len of the white part of the phasing image band. int m_curr_phase_low; // Counts the len of the black part of the phasing image band. int m_phase_lines; int m_num_phase_lines; int m_phasing_calls_nb;// Number of calls to decode_phasing for the current image. double m_lpm_img; // Lines per minute. double m_lpm_sum_rx; // Sum of the latest LPM values, when RXPHASING. int m_default_lpm; // 120 for WEFAX_576, 60 for WEFAX_288. int m_img_width; // Calculated with IOC=576 or 288. int m_img_sample; // Current received samples number when in RXIMAGE. int m_last_col; // Current col based on samples number, decides to set a pixel when changes. int m_pixel_val; // Accumulates received samples, then averaged to set a pixel. int m_pix_samples_nb; // Number of samples read for the next pixel, and current column. About 4 if 11025 Hz. bool m_img_color; // Whether this is a color image or not. fax_state m_tx_state; // Modem state when transmitting. int m_tx_phasing_lin; // Nb of phasing lines sent when transmitting an image. int m_start_duration; // Number of seconds for sending ATP start. int m_stop_duration; // Number of seconds for sending APT stop. int m_img_tx_cols; // Number of columns when transmitting. int m_img_tx_rows; // Number of rows when transmitting. int m_carrier; // Normalised fax carrier frequency. Should be identical to modem::get_freq(). int m_fax_pix_num; // Index of current pixel in received image. const unsigned char * m_xmt_pic_buf ; // Bytes to send. Number of pixels by three. bool m_manual_mode ; // Tells whether everything is read, or apt+phasing detection. /// The number of samples sent for one line. The LPM is given by the GUI. Typically 5512. double m_smpl_per_lin ;// Recalculated each time m_lpm_img is updated. double deviation_ratio; // At the moment, never found an example where it should be negated. static const bool m_phase_inverted = false; /// This is always the same filter for all objects. static fir_filter_pair_set m_rx_filters ; /// These are used for transmission. lookup_table m_dbl_sine; lookup_table m_dbl_cosine; lookup_table m_dbl_arc_sine; /// Stores a result based on the previous received sample. double m_i_fir_old; double m_q_fir_old; cmplx currz; cmplx prevz; void decode(const int* buf, int nb_samples); /// Used for transmission. lookup_table m_short_sine; /// This evaluates the average and standard deviation of the current image, // using the histogram. class statistics { static const size_t m_sz = 256 ; int m_hist[m_sz]; mutable double m_avg ; mutable double m_dev ; public: void add_bw(int pix_val) { pix_val = pix_val < 0 ? 0 : pix_val > 255 ? 255 : pix_val ; m_hist[ pix_val ]++; } void calc() const { m_avg = 0.0; int sum = 0 ; int sum_vals = 0 ; for(size_t i = 0; i < m_sz; ++ i) { int weight = m_hist[i]; sum_vals += i * weight ; sum += weight ; } if (sum == 0) { m_avg = 0.0 ; m_dev = 0.0 ; return ; } m_avg = sum_vals / sum ; double sum_dlt_pwr2 = 0.0 ; for(size_t i = 0; i < m_sz; ++ i) { int weight = m_hist[i]; double val = i - m_avg ; sum_dlt_pwr2 += val * val * weight ; } m_dev = sqrt(sum_dlt_pwr2 / sum); } double average() const { return m_avg; } double stddev() const { return m_dev; }; void reset() { std::fill(m_hist, m_hist + m_sz, 0); } }; statistics m_statistics ; fax_implementation(); /// Needed when starting image reception, after phasing. void reset_counters(void) { m_last_col = 0 ; m_fax_pix_num = 0 ; m_img_sample = 0; m_pix_samples_nb = 0; } // These counters used for phasing. void reset_phasing_counters() { m_lpm_sum_rx = 0; m_phasing_calls_nb = 0 ; m_phase_high = m_current_value >= 128 ? true : false; m_curr_phase_len = m_curr_phase_high = m_curr_phase_low = 0; m_phase_lines = m_num_phase_lines = 0; } /// Called at init time or when the carrier changes. void reset_increments(void) { /// This might happen at startup. Not a problem. if (m_sample_rate == 0) { return; } m_dbl_sine.set_increment(m_dbl_sine.size()*m_carrier/m_sample_rate); m_dbl_cosine.set_increment(m_dbl_cosine.size()*m_carrier/m_sample_rate); m_dbl_sine.reset(); m_dbl_cosine.reset(); m_short_sine.reset(); } public: fax_implementation(int fax_mode, wefax * ptr_wefax); void init_rx(int the_smpl_rate); void skip_apt_rx(void); void skip_phasing_to_image_save(const std::string & comment); void skip_phasing_to_image(bool auto_center); void skip_phasing_rx(bool auto_center); void end_rx(void); void rx_new_samples(const double* audio_ptr, int audio_sz); void init_tx(int the_smpl_rate); void modulate(const double* buffer, int n); void tx_params_set( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h); bool trx_do_next(void); void tx_apt_stop(void); double carrier(void) const { return m_carrier ; } /// The trigo tables have an increment which depends on the carrier frequency. void set_carrier(double freq) { m_carrier = freq ; reset_increments(); } int fax_width(void) const { return m_img_width ; } /// When set, starts receiving faxes without interruption other than manual. void manual_mode_set(bool manual_flag) { m_manual_mode = manual_flag ; } /// Called by the GUI. bool manual_mode_get(void) const { return m_manual_mode ; } int lpm_to_samples(int the_lpm) const { return m_sample_rate * 60.0 / the_lpm ; } /// Called by the GUI. void lpm_set(int the_lpm) { m_lpm_img = the_lpm ; m_smpl_per_lin = lpm_to_samples(m_lpm_img); } /// This generates a filename based on the frequency, current time, internal state etc... std::string generate_filename(const char *extra_msg) const ; const char * state_rx_str(void) const { return state_to_str(m_rx_state); } /// Returns a string telling the state. Informational purpose. std::string state_string(void) const { std::stringstream result ; result << "tx:" << state_to_str(m_tx_state) << " " << "rx:" << state_to_str(m_rx_state); return result.str(); }; private: /// Centered around the frequency. double power_usb_noise(void) const { static double avg_pwr = 0.0 ; double pwr = wf->powerDensity(m_carrier, 2 * fm_deviation) + 1e-10; return decayavg(avg_pwr, pwr, 25);//10); } /// This evaluates the power signal when APT start frequency. This frequency pattern /// can be observed on the waterfall. double power_usb_apt_start(void) const { static double avg_pwr = 0.0 ; /// Value approximated by watching the waterfall. double pwr = wf->powerDensity(m_apt_start_freq, 10); return decayavg(avg_pwr, pwr, 10); } /// Estimates the signal power when the phasing signal is received. double power_usb_phasing(void) const { static double avg_pwr = 0.0 ; /// Rough estimate based on waterfall observation. static const int bandwidth_phasing = 1 ; double pwr = wf->powerDensity(m_carrier - fm_deviation, bandwidth_phasing); return decayavg(avg_pwr, pwr, 10); } /// There is some power at m_carrier + fm_deviation but this is neglictible. double power_usb_image(void) const { static double avg_pwr = 0.0 ; /// This value is obtained by watching the waterfall. static const int bandwidth_image = 100 ; double pwr = wf->powerDensity(m_carrier + fm_deviation, bandwidth_image); return decayavg(avg_pwr, pwr, 10); } /// Hambourg Radio sends a constant freq which looks like an image. /// We eliminate it by comparing with a black signal. /// If this is a real image, bith powers will be close. /// If not, the image is very important, but not the black. /// TODO: Consider removing this, because it is not used. double power_usb_black(void) const { static double avg_pwr = 0.0 ; /// This value is obtained by watching the waterfall. static const int bandwidth_black = 20 ; double pwr = wf->powerDensity(m_carrier - fm_deviation, bandwidth_black); return decayavg(avg_pwr, pwr, 10); } /// Evaluates the signal power for APT stop frequency. double power_usb_apt_stop(void) const { static double avg_pwr = 0.0 ; /// This value is obtained by watching the waterfall. double pwr = wf->powerDensity(m_apt_stop_freq, 10); return decayavg(avg_pwr, pwr, 10); } /// This evaluates the signal/noise ratio for some specific bandwidths. class fax_signal { const fax_implementation * _ptr_fax ; int _cnt ; /// The value can be reused a couple of times. double _apt_start ; double _phasing ; double _image ; double _black ; double _apt_stop ; fax_state _state ; /// Deduction made based on signal power. const char * _text; const char * _stop_code; /// Finer tests can be added. These are all rule-of-thumb values based /// on observation of real signals. /// TODO: Adds a learning mode using the Hamfax detector to train the signal-based one. void set_state(void) { _state = IDLE ; _text = _("No signal detected"); _stop_code = "" ; if ((_apt_start > 20.0) && (_phasing < 10.0) && (_image < 10.0) && (_apt_stop < 10.0)) { _state = RXAPTSTART ; _text = _("Strong APT start signal: Skip to phasing."); } if ( /// The image signal may be weak if the others signals are even weaker. ( (_apt_start < 1.0) && (_phasing < 1.0) && (_image > 10.0) && (_apt_stop < 1.0)) || ( (_apt_start < 1.0) && (_phasing < 0.5) && (_image > 8.0) && (_apt_stop < 0.5)) || ( (_apt_start < 3.0) && (_phasing < 1.0) && (_image > 15.0) && (_apt_stop < 1.0))) { _state = RXIMAGE ; _text = _("Strong image signal when getting APT start: Starting phasing."); } if ((_apt_start < 10.0) && (_phasing > 20.0) && (_image < 10.0) && (_apt_stop < 10.0)) { _state = RXPHASING ; _text = _("Strong phasing signal when getting APT start: Starting phasing."); } /// TODO: Beware that quite often, it cuts image in the middle. // Maybe the levels should be amended. if ((_apt_start < 2.0) & (_phasing < 2.0) && (_image < 2.0) && (_apt_stop > 20.0)) { _state = RXAPTSTOP ; _text = _("Strong APT stop signal: Stopping reception."); _stop_code = "stop"; } /// Consecutive lines in a wefax image have a strong statistical correlation. fax_state state_corr = _ptr_fax->correlation_state(&_stop_code); if ((_state == RXIMAGE) || (_state == IDLE)) { if (state_corr == RXAPTSTOP) { _state = RXAPTSTOP ; _text = _("No significant line-to-line correlation: Reception should stop."); } } if ((_state == IDLE) || (_state == RXAPTSTART) || (_state == RXPHASING)) { if (state_corr == RXIMAGE) { _state = RXIMAGE ; _text = _("Significant line-to-line correlation: Reception should start."); } } } void recalc(void) { /// Adds a small value to avoid division by zero. double noise = _ptr_fax->power_usb_noise() + 1e-10 ; /// Multiplications are faster than divisions. double inv_noise = 1.0 / noise ; _apt_start = _ptr_fax->power_usb_apt_start() * inv_noise ; _phasing = _ptr_fax->power_usb_phasing() * inv_noise ; _image = _ptr_fax->power_usb_image() * inv_noise ; _black = _ptr_fax->power_usb_black() * inv_noise ; _apt_stop = _ptr_fax->power_usb_apt_stop() * inv_noise ; set_state(); } public: /// This recomputes, if needed, the various signal power ratios. void refresh(void) { /// Values reevaluated every X input samples. Must be smaller /// than the typical audio input frames (512 samples). static const int validity = 1000 ; /// Calculated at least the first time. if ((_cnt % validity) == 0) { recalc(); } /// Does not matter if wrapped beyond 2**31. ++_cnt ; } fax_signal(const fax_implementation * ptr_fax) : _ptr_fax(ptr_fax) , _cnt(0) , _text(NULL) {} fax_state signal_state(void) const { return _state ; } const char * signal_text(void) const { return _text; }; const char * signal_stop_code(void) const { return _stop_code; } double image_noise_ratio(void) const { return _image ; } /// For debugging only. friend std::ostream & operator<<(std::ostream & refO, const fax_signal & ref_sig) { refO << " start=" << std::setw(10) << ref_sig._apt_start << " phasing=" << std::setw(10) << ref_sig._phasing << " image=" << std::setw(10) << ref_sig._image << " black=" << std::setw(10) << ref_sig._black << " stop=" << std::setw(10) << ref_sig._apt_stop << " pwr_state=" << state_to_str(ref_sig._state); return refO ; } std::string to_string(void) const { std::stringstream tmp_strm ; tmp_strm << *this ; return tmp_strm.str(); } }; /// We tolerate a small difference between the frequencies. bool is_near_freq(int f1, int f2, int margin) const { int delta = f1 - f2 ; if (delta < 0) { delta = -delta ; } if (delta < margin) { return true ; } else { return false ; } } void save_automatic( const char * extra_msg, const std::string & comment); void decode_apt(int x, const fax_signal & the_signal); void decode_phasing(int x, const fax_signal & the_signal); bool decode_image(int x); private: /// Each received file has its name pushed in this queue. syncobj m_sync_rx ; std::queue< std::string > m_received_files ; public: /// Called by the engine each time a file is saved. void put_received_file(const std::string &filnam) { guard_lock g(m_sync_rx.mtxp()); LOG_INFO("%s", filnam.c_str()); m_received_files.push(filnam); m_sync_rx.signal(); } /// Returns a received file name, by chronological order. std::string get_received_file(int max_seconds) { guard_lock g(m_sync_rx.mtxp()); LOG_VERBOSE(_("delay = %d"), max_seconds); if (m_received_files.empty()) { if (! m_sync_rx.wait(max_seconds)) return std::string(); } std::string filnam = m_received_files.front(); m_received_files.pop(); return filnam ; } private: /// No unicity if the same filename is sent by several clients at the same time. /// This does not really matter because the error codes should be the same. syncobj m_sync_tx_fil ; std::string m_tx_fil ; // Filename being transmitted. syncobj m_sync_tx_msg ; typedef std::map< std::string, std::string > sent_files_type ; sent_files_type m_sent_files ; public: /// If the delay is exceeded, returns with an error message. std::string send_file(const std::string & filnam, double max_seconds) { #ifdef __WIN32__ // this subterfuge is necessary due to a bug in mingw gcc macro parser char dummy[50]; snprintf(dummy, sizeof(dummy), "%s rf_carrier = %llu carrier = %d", filnam.c_str(), wf->rfcarrier(), m_carrier); LOG_VERBOSE("%s", dummy); #else LOG_VERBOSE("%s rf_carrier = %llu carrier = %d", filnam.c_str(), wf->rfcarrier(), m_carrier); #endif bool is_acquired = transmit_lock_acquire(filnam, max_seconds); if (! is_acquired) return "Timeout sending " + filnam ; REQ(wefax_pic::send_image, filnam); guard_lock g(m_sync_tx_fil.mtxp()); sent_files_type::iterator itFi ; while(true) { itFi = m_sent_files.find(filnam); if (itFi != m_sent_files.end()) { break ; } LOG_VERBOSE("Locking"); guard_lock g(m_sync_tx_msg.mtxp()); LOG_VERBOSE("Waiting %f",max_seconds); if (! m_sync_tx_msg.wait(max_seconds)) { LOG_VERBOSE("Timeout %f", max_seconds); return "Timeout"; } } std::string err_msg = itFi->second ; LOG_VERBOSE("err_msg = %s", err_msg.c_str()); m_sent_files.erase(itFi); return err_msg ; } /// Called when loading a file from the GUI, or indirectly from XML-RPC. bool transmit_lock_acquire(const std::string & filnam, double delay = wefax::max_delay) { LOG_VERBOSE("Sending %s delay = %f tid = %d", filnam.c_str(), delay, (int)GET_THREAD_ID()); guard_lock g(m_sync_tx_fil.mtxp()); LOG_VERBOSE("Locked"); if (! m_tx_fil.empty()) { if (! m_sync_tx_fil.wait(delay)) return false ; } m_tx_fil = filnam ; LOG_VERBOSE("Sent %s", filnam.c_str()); return true ; } /// Allows to send another file. Called by XML-RPC and the GUI. void transmit_lock_release(const std::string & err_msg) { LOG_VERBOSE("err_msg = %s tid = %d", err_msg.c_str(), (int)GET_THREAD_ID()); guard_lock g(m_sync_tx_msg.mtxp()); LOG_VERBOSE("%s %s", m_tx_fil.c_str(), err_msg.c_str()); if (m_tx_fil.empty()) { LOG_WARN(_("%s: File name should not be empty"), err_msg.c_str()); } else { m_sent_files[ m_tx_fil ] = err_msg ; m_tx_fil.clear(); } LOG_VERBOSE("Signaling"); m_sync_tx_msg.signal(); } /// Maybe we could reset this buffer when we change the state so that we could /// use the current LPM width. struct corr_buffer_t : public std::vector { unsigned char at_mod(size_t i) const { return operator[](i % size()); } unsigned char & at_mod(size_t i) { return operator[](i % size()); } }; mutable corr_buffer_t m_correlation_buffer ; mutable double m_curr_corr_avg ; // Average line-to-line correlation for the spec'd # sampled lines. mutable double m_imag_corr_max ; // Max line-to-line correlation for the current image. mutable double m_imag_corr_min ; // Min line-to-line correlation for the current image. mutable int m_corr_calls_nb; /// Evaluates the correlation between two lines separated by line_offset pixels. double correlation_from_index(size_t line_length, size_t line_offset) const { /// This is a ring buffer. size_t line_length_plus_img_sample = line_length + m_img_sample ; int avg_pred = 0, avg_curr = 0 ; for(size_t i = m_img_sample ; i < line_length_plus_img_sample ; ++i) { int pix_pred = m_correlation_buffer.at_mod(i ); int pix_curr = m_correlation_buffer.at_mod(i + line_offset); avg_pred += pix_pred; avg_curr += pix_curr ; } avg_pred /= line_length; avg_curr /= line_length; /// Use integers because it is faster. Samples are chars, so no overflow possible. int numerator = 0, denom_pred = 0, denom_curr = 0 ; for(size_t i = m_img_sample ; i < line_length_plus_img_sample ; ++i) { int pix_pred = m_correlation_buffer.at_mod(i ); int pix_curr = m_correlation_buffer.at_mod(i + line_offset); int delta_pred = pix_pred - avg_pred ; int delta_curr = pix_curr - avg_curr ; numerator += delta_pred * delta_curr ; denom_pred += delta_pred * delta_pred ; denom_curr += delta_curr * delta_curr ; } double denominator = sqrt((double)denom_pred * (double)denom_curr); if (denominator == 0.0) { return 0.0 ; } else { return fabs(numerator / denominator); } } size_t correlation_shift(size_t corr_smpl_lin) const { static bool is_init = false ; static const size_t max_space_echo = 100 ; /// Specific to the antenna and the reception, so no need to clean it up. static size_t shift_histogram[max_space_echo]; static size_t nb_calls = 0 ; if (! is_init) { for(size_t i = 0; i < max_space_echo; ++i) shift_histogram[i] = 0 ; is_init = true ; } double tmpCorrPrev = correlation_from_index(corr_smpl_lin, 0); size_t local_max = 0 ; bool is_growing = false ; /// We could even start the loop later because we are not interested by small shifts. for(size_t i = 1 ; i < max_space_echo; i++) { double tmpCorr = correlation_from_index(corr_smpl_lin, i); bool is_growing_next = tmpCorr > tmpCorrPrev ; if (is_growing && (! is_growing_next )) { local_max = i - 1 ; break ; } is_growing = is_growing_next ; tmpCorrPrev = tmpCorr ; } if (local_max != 0) { ++shift_histogram[local_max]; } ++nb_calls ; size_t best_shift_idx = 0 ; size_t biggest_shift = shift_histogram[best_shift_idx]; if ((nb_calls > 100) && ((nb_calls % 10) == 0)) { for(size_t i = 0; i < max_space_echo; ++i) { size_t new_hist = shift_histogram[i]; if (new_hist > biggest_shift) { biggest_shift = new_hist ; best_shift_idx = i ; } } LOG_VERBOSE("Shift: i = %d hist = %d", (int)best_shift_idx, (int)biggest_shift); } return best_shift_idx ; } static const int min_white_level = 128 ; /// Absolute value of statistical correlation between the current line and the previous one. /// Called once per maximum sample line. void correlation_calc(void) const { ++m_corr_calls_nb; /// We should in fact take the smallest one, 60. size_t corr_smpl_lin = lpm_to_samples(m_default_lpm); double current_corr = correlation_from_index(corr_smpl_lin, corr_smpl_lin); /// This never happened, but who knows (Inaccuracy etc...)? if (current_corr > 1.0) { LOG_WARN("Inconsistent correlation:%lf", current_corr); current_corr = 1.0; } int crows = progdefaults.wefax_correlation_rows; if (m_corr_calls_nb < crows) { m_curr_corr_avg = current_corr ; /// The max value of the correlation must be significative (Does not take peak values). m_imag_corr_max = 0.0; m_imag_corr_min = 0.0; } else { /// Equivalent to decayavg with weight= (min_corr_lin +1)/min_corr_lin m_curr_corr_avg = (m_curr_corr_avg * crows + current_corr) / (crows + 1); m_imag_corr_max = std::max(m_curr_corr_avg, m_imag_corr_max); m_imag_corr_min = std::min(m_curr_corr_avg, m_imag_corr_min); } /// Debugging purpose only. if ((m_corr_calls_nb % 10) == 0) { LOG_DEBUG( "current_corr = %lf m_curr_corr_avg = %lf m_imag_corr_max = %f m_corr_calls_nb = %d state = %s m_lpm_img = %f", current_corr, m_curr_corr_avg, m_imag_corr_max, m_corr_calls_nb, state_rx_str(), m_lpm_img); } double metric = m_curr_corr_avg * 100.0 ; m_ptr_wefax->display_metric(metric); return; /* static bool first = true; if ((m_corr_calls_nb % 10) == 0) { if (first) { ofstream csv("stats.csv"); csv << "current_corr,curr_corr_avg,imag_corr_max,corr_calls_nb,state,lpm_img,metric" << std::endl; first = false; } ofstream csv("stats.csv", ios::app); csv << current_corr << "," << m_curr_corr_avg << "," << m_imag_corr_max << "," << m_corr_calls_nb << "," << state_rx_str() << "," << m_lpm_img << "," << metric << std::endl; csv.close(); } */ } /// This is called quite often. It estimates, based on the mobile /// average of statistical correlation between consecutive lines, whether this is a wefax /// signal or not. fax_state correlation_state(const char ** stop_code) const { static fax_state stable_state = IDLE ; switch(stable_state) { case RXAPTSTART : *stop_code = "stable_start" ; break; case RXAPTSTOP : *stop_code = "stable_stop" ; break; case RXPHASING : *stop_code = "stable_phasing"; break; case RXIMAGE : *stop_code = "stable_image" ; break; case IDLE : *stop_code = "stable_idle" ; break; default : *stop_code = "unexpected" ; break; } /// If the mobile average is not computed on enough lines, returns IDLE /// which means "Do not know" in this context. if (m_corr_calls_nb >= progdefaults.wefax_correlation_rows) { int crr_row = m_img_sample / m_smpl_per_lin ; /// Sometimes, we detected a Stop just after the header, and we create an image /// of 300 lines. This is a rule of thumb. The bad consequence is that the image /// would be a bit too high. This an approximate row number. /// On the other hand, if we read very few lines, we assume this is just noise. double low_corr = progdefaults.wefax_correlation; /// If high threshold, we cut images in two. /// If low threshold, we go on reading an image after its end if apt stop is not seen, /// and might read the beginning of the next image. if (m_curr_corr_avg < low_corr) { LOG_DEBUG("Setting to stop m_curr_corr_avg = %f low_corr = %f", m_curr_corr_avg, low_corr); *stop_code = "nocorr"; stable_state = RXAPTSTOP ; /// TODO: Beware, this is sometimes triggered with cyclic parasites. } else if (m_curr_corr_avg > 3 * low_corr / 2) { stable_state = RXIMAGE ; } else if ((m_imag_corr_max < 0.10) && (crr_row > 200)) { // If the correlation was always very low for many lines, // this means that we started to read a wrong image, so // there might be a wrong tuning or the DWD constant frequency. // So we trash the image. // TODO: It is done too many times: SOMETIMES THE MESSAGE IS REPEATED HUNDREDTH. // crr8row continues to grow although it makes no sense. LOG_INFO("Flushing dummy image m_imag_corr_max = %f crr_row = %d 200 lines.", m_imag_corr_max, crr_row); static const char * garbage_200 = GARBAGE_STR ".200"; *stop_code = garbage_200; reset_afc(); stable_state = RXAPTSTOP ; } else if ((m_imag_corr_max < 0.20) && (crr_row > 500)) { // If the max line-to-line correlation still low for a bigger image. LOG_INFO("Flushing dummy image m_imag_corr_max = %f crr_row = %d 500 lines.", m_imag_corr_max, crr_row); static const char * garbage_500 = GARBAGE_STR ".500"; *stop_code = garbage_500; reset_afc(); stable_state = RXAPTSTOP ; } else { stable_state = IDLE ; } } /// Message for first detection. if ((stable_state == IDLE) && (m_corr_calls_nb == progdefaults.wefax_correlation_rows)) { static double last_corr_avg = 0.0 ; if (m_curr_corr_avg != last_corr_avg) { LOG_INFO("Correlation average %lf m_imag_corr_max = %f: Detected %s", m_curr_corr_avg, m_imag_corr_max, state_to_str(stable_state)); last_corr_avg = m_curr_corr_avg ; } } return stable_state; } /// We compute about the same when plotting a pixel. void correlation_update(int the_sample) { size_t corr_smpl_lin = lpm_to_samples(m_default_lpm); size_t corr_buff_sz = 2 * corr_smpl_lin ; static size_t cnt_upd = 0 ; if (m_correlation_buffer.size() != corr_buff_sz) { m_correlation_buffer.resize(corr_buff_sz, 0); m_curr_corr_avg = 0.0 ; } if ((cnt_upd % corr_smpl_lin) == 0) { correlation_calc(); } ++cnt_upd ; m_correlation_buffer.at_mod(m_img_sample) = the_sample ; } // correlation_update /// Clean trick so that we can reset internal variables of process_afc(). void reset_afc() const { process_afc(true); } /// Called once for each row of input data. void process_afc(bool reset_afc = false) const { static int prev_row = -1 ; static int total_img_rows = 0 ; /// Audio frequency. static int stable_carrier = 0 ; static const int max_median_freqs = 20 ; static double median_freqs[ max_median_freqs ]; static int nb_median_freqs = 0 ; /// Rig frequency. static long long stable_rfcarrier = 0 ; /// TODO: Maybe we could restrict the range of frequencies. if (reset_afc) { /// Displays the message only once. if (prev_row != -1) { LOG_DEBUG("Resetting AFC total_img_rows = %d",total_img_rows); } prev_row = -1 ; total_img_rows = 0 ; stable_carrier = 0; stable_rfcarrier = 0 ; nb_median_freqs = 0 ; return; } if (progStatus.afconoff == false) return ; /// The LPM might have changed, but this is very improbable. /// We do not know the LPM so we assume the default. double smpl_per_lin = lpm_to_samples(m_default_lpm); int crr_row = m_img_sample / smpl_per_lin ; if (crr_row == prev_row) return ; long long curr_rfcarr = wf->rfcarrier() ; /// If the freq changed, reset the number of good lines read. if ((m_carrier != stable_carrier) || (curr_rfcarr != stable_rfcarrier)) { /// Displays the messages once only. if (total_img_rows != 0) { LOG_VERBOSE("Setting m_carrier = %d curr_rfcarr = %d total_img_rows = %d", m_carrier, static_cast(curr_rfcarr), total_img_rows); } total_img_rows = 0 ; stable_carrier = m_carrier ; stable_rfcarrier = curr_rfcarr ; } /// If we could read a big portion of an image, then no adjustment. if (m_rx_state == RXIMAGE) { /// Maybe this is a new image so last_img_rows is from the previous image. if (prev_row < crr_row) { total_img_rows += crr_row - prev_row ; } else { LOG_DEBUG("prev_crr_row = %d crr_row = %d total_img_rows = %d", prev_row, crr_row, total_img_rows); } } else { LOG_DEBUG("State = %s crr_row = %d", state_rx_str(), crr_row); } prev_row = crr_row ; /// If we could succesfully read this number of lines, it must be the right frequency. static const int threshold_rows = 200 ; /// Consider than not only we could read many lines, but also other criterias such /// as correlation, or if we could read apt start/stop. Otherwise, it may stabilize a useless frequency. if ((total_img_rows >= threshold_rows) && (m_curr_corr_avg > 0.10)) { if (total_img_rows == threshold_rows) { LOG_VERBOSE("Stable total_img_rows = %d m_curr_corr_avg = %f", total_img_rows, m_curr_corr_avg); } //If the reception is always poor for a long time restart AFC. stable_carrier = progdefaults.WEFAX_Center; m_ptr_wefax->set_freq(stable_carrier); return ; } /// This centers the carrier where the activity is the strongest. static const int bw_dual[][2] = { { -fm_deviation - 50, -fm_deviation + 50 }, { fm_deviation - 50, fm_deviation + 50 } }; double max_carrier_dual = wf->powerDensityMaximum(2, bw_dual); static const int bw_right[][2] = { { fm_deviation - 50, fm_deviation + 50 } }; double max_carrier_right = wf->powerDensityMaximum(1, bw_right); // This might have to be adjusted because DWD has all the energy on the right // band, but Northwood has some on the left. double max_carrier = 0.0 ; /// Maybe there is not enough room on the left. if (max_carrier_dual < 0.0) { LOG_DEBUG("Invalid AFC: Dual band = %f, right band = %f. Take right", max_carrier_dual, max_carrier_right); max_carrier = max_carrier_right - fm_deviation; } else /// Both mask detect approximately the same frequency: This is the consistent case. if (fabs(max_carrier_dual - max_carrier_right) < 20) { max_carrier = max_carrier_right - fm_deviation; } else if (max_carrier_dual < max_carrier_right) { LOG_DEBUG("Inconsistent AFC: Dual band = %f, right band = %f. Take right", max_carrier_dual, max_carrier_right); max_carrier = max_carrier_right - fm_deviation; } else /// Single-band mask close to the left frequency of the dual-freq mask if (fabs(fabs(max_carrier_dual - max_carrier_right) - 2 * fm_deviation) < 20) { LOG_DEBUG("Dual band = %f instead of right band = %f. Take dual", max_carrier_dual, max_carrier_right); max_carrier = max_carrier_dual ; } else { LOG_DEBUG("Inconsistent AFC: Dual band = %f, right band = %f. Take dual.", max_carrier_dual, max_carrier_right); max_carrier = max_carrier_dual ; } /// The max power is unreachable, there might be another reason. Stay where we are. static bool prevWasRight = true ; /// TODO: We might find the next solution, maybe by giving to powerDensityMaximum a smaller range. if ((max_carrier <= fm_deviation) || (max_carrier >= IMAGE_WIDTH - fm_deviation)) { /// Display this message once only. if (prevWasRight) { LOG_VERBOSE("Invalid max_carrier = %f", max_carrier); } prevWasRight = false ; return ; } else { prevWasRight = true ; } // TODO: If the correlation is below a given threshold, it might be useless to add it. median_freqs[ nb_median_freqs % max_median_freqs ] = max_carrier ; ++nb_median_freqs; if (nb_median_freqs >= max_median_freqs) { std::sort(median_freqs, median_freqs + max_median_freqs); max_carrier = median_freqs[ max_median_freqs / 2 ]; } /// Do not change the frequency too quickly if an image is received. /// Reject large excursions in carrier if (fabs(m_carrier - max_carrier) > 10) return; stable_carrier += 0.10*(max_carrier - stable_carrier); if (stable_carrier < (progdefaults.WEFAX_Center - 25)) stable_carrier = progdefaults.WEFAX_Center; if (stable_carrier > (progdefaults.WEFAX_Center + 25)) stable_carrier = progdefaults.WEFAX_Center; m_ptr_wefax->set_freq(stable_carrier); LOG_DEBUG("m_carrier = %f max_carrier = %f next_carr = %d", (double)m_carrier, max_carrier, stable_carrier); } }; // class fax_implementation /// Narrow, middle etc... input filters. Constructed at program startup. Readonly. fir_filter_pair_set fax_implementation::m_rx_filters ; fax_implementation::fax_implementation(int fax_mode, wefax * ptr_wefax ) : m_ptr_wefax(ptr_wefax) , m_dbl_sine(8192),m_dbl_cosine(8192),m_dbl_arc_sine(256) , m_short_sine(8192) { m_apt_stop_freq = 450 ; m_img_color = false ; m_tx_phasing_lin = 20 ; m_carrier = progdefaults.WEFAX_Center ; m_start_duration = 5 ; m_stop_duration = 5 ; m_manual_mode = false ; m_rx_state = IDLE ; m_tx_state = IDLE ; m_sample_rate = 0 ; reset_counters(); int index_of_correlation ; /// http://en.wikipedia.org/wiki/Radiofax switch(fax_mode) { default: case MODE_WEFAX_576: m_apt_start_freq = 300 ; index_of_correlation = IOC_576 ; m_default_lpm = 120 ; break; case MODE_WEFAX_288: m_apt_start_freq = 675 ; index_of_correlation = IOC_288 ; m_default_lpm = 60 ; break; } m_img_width = ioc_to_width(index_of_correlation); for(size_t i = 0; i(32767*std::sin(2.0*M_PI*i/m_short_sine.size())); } }; void fax_implementation::init_rx(int the_smpl_rat) { m_sample_rate = the_smpl_rat; m_rx_state = RXAPTSTART; rx_state_changed = true; m_apt_count = m_apt_trans = 0; m_apt_high = false; /// Centers the carriers on the GUI and reinits the trigonometric tables. m_ptr_wefax->set_freq(progdefaults.WEFAX_Center); reset_increments(); m_i_fir_old = m_q_fir_old = 0; m_corr_calls_nb = 0; deviation_ratio = (m_sample_rate / progdefaults.WEFAX_Shift) / TWOPI; } /// Values are between zero and 255 void fax_implementation::decode(const int* buf, int nb_samples) { if (nb_samples == 0) { LOG_WARN(_("Empty buffer.")); end_rx(); } fax_signal my_signal(this); process_afc(); for(int i = 0; i 0) { /// If the maximum number of lines is reached, we stop the reception. decode_image(crr_val); } } m_img_sample++; } if (rx_state_changed) { std::string str_state; switch(m_rx_state) { case RXAPTSTART : str_state = "APT start"; break; case RXAPTSTOP : str_state = "APT stop"; break; case RXPHASING : str_state = "Rx Phasing"; break; case RXIMAGE : str_state = "Rx Image"; break; default : case IDLE : str_state = "Idle"; break; } put_Status2(str_state.c_str()); rx_state_changed = false; } } // The number of transitions between black and white is counted. After 1/2 // second, the frequency is calculated. If it matches the APT start frequency, // the state skips to the detection of phasing lines, if it matches the apt // stop frequency two times, the reception is ended. void fax_implementation::decode_apt(int x, const fax_signal & the_signal) { if ((m_img_sample % 10000) == 0) { PUT_STATUS(state_rx_str() << " apt_count = " << m_apt_count); } /// Maybe the thresholds 229 and 25 should be changed if the image is not contrasted enough. // if (x>229 && !m_apt_high) { if (x>215 && !m_apt_high) { m_apt_high = true; ++m_apt_trans; // } else if (x<25 && m_apt_high) { } else if (x<40 && m_apt_high) { m_apt_high = false; } ++m_apt_count ; /// This makes one line if LPM = 120: // samples_per_line = m_sample_rate * 60.0 / the_lpm ; if (m_apt_count >= m_sample_rate/2) { static int curr_freq = 0 ; static int cr_1_freq = 0 ; static int cr_2_freq = 0 ; static int cr_3_freq = 0 ; // For APT start, we have several lines with freq=300 nearly exactly. // For APT stop, one or two lines maximum with freq=452, and this is not accurate. // On top of that, sometimes lines randomly have 300 or 452 black-white transitions, // especially if the signal is very noisy. This is why we check the transitions // frequency of two consecutive lines. cr_3_freq = cr_2_freq; cr_2_freq = cr_1_freq; cr_1_freq = curr_freq; curr_freq = m_sample_rate*m_apt_trans/m_apt_count; /// This writes the S/R level on the status bar. double tmp_snr = the_signal.image_noise_ratio(); char snr_buffer[64]; snprintf(snr_buffer, sizeof(snr_buffer), "s/n %3.0f dB", 20.0 * log10(tmp_snr)); put_Status1(snr_buffer); LOG_DEBUG("m_apt_count = %d m_apt_trans = %d curr_freq = %d cr_1_freq = %d cr_2_freq = %d", m_apt_count, m_apt_trans, curr_freq, cr_1_freq, cr_2_freq); m_apt_count = m_apt_trans = 0; if (m_rx_state == RXAPTSTART) { if (is_near_freq(curr_freq,m_apt_start_freq, 8) && is_near_freq(cr_1_freq,m_apt_start_freq, 8)) { LOG_VERBOSE(_("Skipping APT freq = %d State = %s"), curr_freq, state_rx_str()); skip_apt_rx(); PUT_STATUS(state_rx_str() << ", " << _("frequency") << ": " << curr_freq << " Hz. " << _("Skipping.")); return ; } if (is_near_freq(curr_freq,m_apt_stop_freq, 2) && is_near_freq(cr_1_freq,m_apt_stop_freq, 2)) { LOG_VERBOSE(_("Spurious APT stop frequency = %d Hz as waiting for APT start. SNR = %f State = %s"), curr_freq, tmp_snr, state_rx_str()); return ; } PUT_STATUS(state_rx_str() << ", " << _("frequency") << ": " << curr_freq << " Hz."); } /// If APT start in the middle of an image, maybe the preceding APT Stop was not caught. if (m_rx_state == RXIMAGE) { /// TODO: We could enhance accuracy by taking into account the number of read lines. int crr_row = m_img_sample / m_smpl_per_lin ; const char * msg_start = NULL ; if (is_near_freq(curr_freq,m_apt_start_freq, 4) && is_near_freq(cr_1_freq,m_apt_start_freq, 4) && is_near_freq(cr_2_freq,m_apt_start_freq, 4)) { msg_start = "apt"; } else if (is_near_freq(curr_freq,m_apt_start_freq, 5) && is_near_freq(cr_1_freq,m_apt_start_freq, 5) && is_near_freq(cr_2_freq,m_apt_start_freq, 5) && is_near_freq(cr_3_freq,m_apt_start_freq, 5)) { msg_start = "apt2"; } if (msg_start != NULL) { std::string comment = strformat( "APT start: freq = %d cr_1 = %d cr_2 = %d cr_3 = %d crr_row = %d State = %s msg = %s", curr_freq, cr_1_freq, cr_2_freq, cr_3_freq, crr_row, state_rx_str(), msg_start); LOG_VERBOSE("%s",comment.c_str()); PUT_STATUS(state_rx_str() << ", " << _("frequency") << ": " << curr_freq << " Hz. " << _("Skipping.")); save_automatic(msg_start,comment); skip_apt_rx(); return ; } } /// TODO: Check that the correlation is not too high because there are false stops. const char * msg_stop = NULL ; if (is_near_freq(curr_freq,m_apt_stop_freq, 6) && is_near_freq(cr_1_freq,m_apt_stop_freq, 6)) { msg_stop = "ok" ; } else if (is_near_freq(curr_freq,m_apt_stop_freq, 7) && is_near_freq(cr_1_freq,m_apt_stop_freq, 7) && is_near_freq(cr_2_freq,m_apt_stop_freq, 7)) { msg_stop = "ok2" ; } if (msg_stop != NULL) { std::string comment = strformat( "APT Stop: curr_freq = %d m_img_sample = %d State = %s_ msg = %s", curr_freq, m_img_sample, state_rx_str(), msg_stop); LOG_VERBOSE("%s",comment.c_str()); PUT_STATUS(state_rx_str() << " " << _("Apt stop frequency") << ": " << curr_freq << " Hz. " << _("Stopping.")); save_automatic(msg_stop,comment); return ; } switch(the_signal.signal_state()) { case RXAPTSTART : switch(m_rx_state) { case RXAPTSTART : skip_apt_rx(); LOG_VERBOSE("Start, start: %s", the_signal.signal_text()); break ; default : LOG_DEBUG("Start, %s: %s", state_rx_str(), the_signal.signal_text()); break ; } break ; case RXPHASING : switch(m_rx_state) { case RXAPTSTART : skip_apt_rx(); LOG_VERBOSE("Phasing, start: %s", the_signal.signal_text()); break ; default : LOG_DEBUG("Phasing, %s: %s", state_rx_str(), the_signal.signal_text()); break ; } break ; case RXIMAGE : switch(m_rx_state) { case RXAPTSTART : skip_apt_rx(); /// The phasing step will start receiving the image later. First we try /// to phase the image correctly. LOG_VERBOSE("Image, start: %s", the_signal.signal_text()); break ; default : LOG_DEBUG("Image, %s: %s", state_rx_str(), the_signal.signal_text()); break ; } break ; case RXAPTSTOP : switch(m_rx_state) { case RXIMAGE : LOG_VERBOSE("Stop, image: %s", the_signal.signal_text()); save_automatic(the_signal.signal_stop_code(), the_signal.signal_text()); break; default : LOG_DEBUG("Stop, %s: %s", state_rx_str(), the_signal.signal_text()); break ; } break ; default : LOG_DEBUG("%s, %s: %s", state_to_str(the_signal.signal_state()), state_rx_str(), the_signal.signal_text()); break ; } } } /// This generates a file name with the reception time and the frequency. std::string fax_implementation::generate_filename(const char *extra_msg) const { time_t tmp_time = time(NULL); struct tm tmp_tm ; localtime_r(&tmp_time, &tmp_tm); char buf_fil_nam[256] ; unsigned long long tmp_fl = wf->rfcarrier() ; snprintf(buf_fil_nam, sizeof(buf_fil_nam), "wefax_%04d%02d%02d_%02d%02d%02d_%llu_%s.png", 1900 + tmp_tm.tm_year, 1 + tmp_tm.tm_mon, tmp_tm.tm_mday, tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec, tmp_fl, extra_msg); return buf_fil_nam ; } /// This saves an image and adds the right comments. void fax_implementation::save_automatic( const char * extra_msg, const std::string & comment) { std::string new_filnam ; std::stringstream extra_comments ; /// These criteria used by rules-of-thumb to eliminate blank images. m_statistics.calc(); double avg = m_statistics.average(); double stddev = m_statistics.stddev(); int current_row = m_img_sample / m_smpl_per_lin ; /* Sometimes the AFC leaves the right frequency (Because no signal) and it produces * images which are plain wrong (Pure periodic parasites). We might find * a criteria to suppress them but maybe it's better to enhance AFC. */ /// Minimum pixel numbers for a valid image. static const int max_fax_pix_num = 150000 ; if (m_fax_pix_num < max_fax_pix_num) { /// Maybe we should reset AFC ? LOG_VERBOSE(_("Do not save small image (%d bytes). Manual = %d"), m_fax_pix_num, m_manual_mode); goto cleanup_rx ; } /// If correlation was always low. if (0 == strncmp(extra_msg, GARBAGE_STR, strlen(GARBAGE_STR))) { LOG_VERBOSE(_("Do not save garbage file")); goto cleanup_rx ; } static const double min_max_correlation = 0.20 ; if (m_imag_corr_max < min_max_correlation) { LOG_VERBOSE(_("Do not save image with correlation < less than %f"), min_max_correlation); goto cleanup_rx ; } /// Intermediate blank images, low standard deviation and correlation. if (((avg > 220) && (m_imag_corr_max < 0.30) && (stddev < 30)) || ((avg > 240) && (m_imag_corr_max < 0.35) && (stddev < 30)) || ((avg > 230) && (m_imag_corr_max < 0.25) && (stddev < 35)) || ((avg > 220) && (stddev < 20))) { LOG_VERBOSE(_("Do not save non-significant image, avg = %f, m_imag_corr_max = %f stddev = %f"), avg, m_imag_corr_max, stddev); goto cleanup_rx ; } /// Dark images coming from local parasites. if ((avg < 100) && (m_imag_corr_max < 0.30)) { LOG_VERBOSE(_("Do not save dark parasite image, avg = %f, m_imag_corr_max = %f"), avg, m_imag_corr_max); goto cleanup_rx ; } /// Same: Dark images due to parasites. if ((avg < 80) && (m_imag_corr_max < 0.35)) { LOG_VERBOSE(_("Do not save dark parasite image (II), avg = %f, m_imag_corr_max = %f"), avg, m_imag_corr_max); goto cleanup_rx ; } if ((avg > 235) && (m_imag_corr_max < 0.65) && (stddev < 40) && (current_row < 100)) { LOG_VERBOSE(_("Do not save small white image, avg = %f, m_imag_corr_max = %f stddev = %f current_row = %d"), avg, m_imag_corr_max, stddev, current_row); goto cleanup_rx ; } /// Small image cut between APT start and phasing. if ((avg < 130) && (m_imag_corr_max < 0.70) && (stddev < 100) && (current_row < 100)) { LOG_VERBOSE(_("Do not save small white image, avg = %f, m_imag_corr_max = %f stddev = %f current_row = %d"), avg, m_imag_corr_max, stddev, current_row); goto cleanup_rx ; } new_filnam = generate_filename(extra_msg); LOG_VERBOSE("Saving %d bytes in %s. m_imag_corr_max = %f", m_fax_pix_num, new_filnam.c_str(), m_imag_corr_max); extra_comments << "ControlMode:" << (m_manual_mode ? "Manual" : "APT control") << "\n" ; extra_comments << "LPM:" << m_lpm_img << "\n" ; extra_comments << "Carrier:" << m_carrier << "\n" ; extra_comments << "Inversion:" << (m_phase_inverted ? "Inverted" : "Normal") << "\n" ; extra_comments << "Color:" << (m_img_color ? "Color" : "BW") << "\n" ; extra_comments << "SampleRate:" << m_sample_rate << "\n" ; extra_comments << "Maximum line-to-line correlation:" << m_imag_corr_max << "\n" ; extra_comments << "Minimum line-to-line correlation:" << m_imag_corr_min << "\n" ; extra_comments << "Average:" << avg << "\n" ; extra_comments << "Row number:" << current_row << "\n" ; extra_comments << "Standard deviation:" << stddev << "\n" ; extra_comments << "Comment:" << comment << "\n" ; extra_comments << "PID:" << getpid() << "\n" ; wefax_pic::save_image(new_filnam, extra_comments.str()); cleanup_rx: /// This clears the current image. end_rx(); }; // Phasing lines consist of 2.5% white at the beginning, 95% black and again // 2.5% white at the end (or inverted). In normal phasing lines we try to // count the length between the white-black transitions. If the line has // a reasonable amount of black (4.8%--5.2%) and the length fits in the // range of 60--360 lpm (plus some tolerance) it is considered a valid // phasing line. Then the start of a line and the lpm is calculated. void fax_implementation::decode_phasing(int x, const fax_signal & the_signal) { static const bool filter_phasing = true ; if (filter_phasing) { // The input is filtered over X columns because the blacks bands are very wide. static const size_t phasing_width = 16 ; static size_t phasing_count = 0 ; static int phasing_history[ phasing_width ]; /// Mobile average filters out parasites. phasing_history[ phasing_count % phasing_width ] = x ; ++phasing_count ; if (phasing_count >= phasing_width) { x = 0 ; for(size_t i = 0; i < phasing_width; ++i) x += phasing_history[ i ]; x /= phasing_width ; } } /// Number of samples per line. m_curr_phase_len++; ++m_phasing_calls_nb ; /// Number of white / black pixels. if (x > 188) m_curr_phase_high++; else if (x < 68) m_curr_phase_low++; /* If the high level is too high (229) we miss some phasing lines. * but if it is too low (200) the center is not at the right place. * We should instead use an histogram and determine what is the highest level in the image. */ // if ((!m_phase_inverted && x>229 && !m_phase_high) || if ((!m_phase_inverted && x > 200 && !m_phase_high) || (m_phase_inverted && x < 25 && m_phase_high)) { m_phase_high = m_phase_inverted ? false : true; } else if ((!m_phase_inverted && x < 25 && m_phase_high) || (m_phase_inverted && x > 200 && !m_phase_high)) { m_phase_high = m_phase_inverted ? true : false; /// In the phasing line, there is a white segment of 5% of the total length, // so it is approximated with 0.048->0.052. if (m_curr_phase_high >= (m_phase_inverted ? 0.94 : 0.04) * m_curr_phase_len && m_curr_phase_low >= (m_phase_inverted ? 0.04 : 0.94) * m_curr_phase_len && m_curr_phase_len >= 0.4 * m_sample_rate) { double tmp_lpm = 60.0 * m_sample_rate / m_curr_phase_len; m_lpm_sum_rx += tmp_lpm; ++m_phase_lines; PUT_STATUS(state_rx_str() << ". " << _("Decoding phasing line") << ", lpm = " << tmp_lpm << " " << _("count") << "=" << m_phase_lines); m_num_phase_lines = 0; // This option was selected just once, in the middle of an image, // with many vertical lines. if (m_phase_lines >= 4 /* Was 4 */) { /// The precision cannot really increase because there cannot // be more than a couple of loops. This is used for guessing // whether the LPM is around 120 or 60. lpm_set(m_lpm_sum_rx / m_phase_lines); std::string comment = strformat( "m_phase_lines = %d, m_num_phase_lines = %d, LPM = %f State = %s, \ m_img_sample = %d, m_last_col = %d, m_lpm_img = %f, m_smpl_per_lin = %f", m_phase_lines, m_num_phase_lines, m_lpm_img, state_rx_str(), m_img_sample, m_last_col, m_lpm_img, m_smpl_per_lin); LOG_VERBOSE("%s", comment.c_str()); skip_phasing_to_image_save(comment); /// reset_counters sets these to zero, so restore right values. // But skip_phasing_to_image normalizes the LPM if not accurate. /// Half of the band of the phasing line. m_img_sample = static_cast(1.025 * m_smpl_per_lin); double tmp_pos = std::fmod(m_img_sample,m_smpl_per_lin) / m_smpl_per_lin; m_last_col = static_cast(tmp_pos*m_img_width); /// Now the image will start at the right column offset. m_fax_pix_num = m_last_col * bytes_per_pixel ; LOG_VERBOSE("Center set: m_last_col = %d m_img_width = %d m_smpl_per_lin = %f", m_last_col, m_img_width, m_smpl_per_lin); } m_curr_phase_len = 0; } else if (m_rx_state == RXPHASING && m_phase_lines > 0 && ++m_num_phase_lines >= 5) { /// TODO: Compare with m_tx_phasing_lin which indicates the number of phasing /// lines sent when transmitting an image. std::string comment = strformat( "Missed last phasing line m_phase_lines = %d m_num_phase_lines = %d LPM = %f State = %s", m_phase_lines, m_num_phase_lines, m_lpm_img, state_rx_str()); LOG_VERBOSE("%s", comment.c_str()); /// Phasing header is finished but could not get the center. skip_phasing_to_image(true); } else if (m_curr_phase_len > 5*m_sample_rate) { m_curr_phase_len = m_curr_phase_high = m_curr_phase_low = 0; PUT_STATUS(state_rx_str() << ". " << _("Decoding phasing line, resetting.")); } else { /// Here, if no phasing is detected. Must be very fast. } PUT_STATUS(state_rx_str() << ". " << _("Decoding phasing line, reset.")); m_curr_phase_len = m_curr_phase_high = m_curr_phase_low = 0; } else if (m_rx_state == RXPHASING) { /// We do not know the LPM so we assume the default. /// TODO: We could take the one given by the GUI. Apparently; problem for Japanese faxes when lpm = 60: // http://forums.radioreference.com/digital-signals-decoding/228802-problems-decoding-wefax.html double smpl_per_lin = lpm_to_samples(m_default_lpm); int smpl_per_lin_int = smpl_per_lin ; int nb_tested_phasing_lines = m_phasing_calls_nb / smpl_per_lin ; /// If this is too big, we lose the beginning of the fax. // If this is too small, we start recording when we should not (But why not starting early ?) // Value was: 30 static const int max_tested_phasing_lines = 20 ; if ( (m_phase_lines == 0) && (m_num_phase_lines == 0) && (nb_tested_phasing_lines >= max_tested_phasing_lines) && ((m_phasing_calls_nb % smpl_per_lin_int) == 0)) { switch(the_signal.signal_state()) { case RXIMAGE : LOG_VERBOSE(_("Starting reception when phasing:%s"), the_signal.signal_text()); skip_phasing_to_image(true); break ; /// If RXPHASING, we stay in phasing mode. case RXAPTSTOP : /// Do not display the same message over and over. LOG_DEBUG(_("Strong APT stop when phasing:%s"), the_signal.signal_text()); end_rx(); skip_apt_rx(); default : break ; } } } } bool fax_implementation::decode_image(int x) { double current_row_dbl = m_img_sample / m_smpl_per_lin ; int current_row = current_row_dbl ; int curr_col = m_img_width * (current_row_dbl - current_row) ; if (curr_col == m_last_col) { m_pixel_val+=x; m_pix_samples_nb++; } else { if (m_pix_samples_nb>0) { m_pixel_val /= m_pix_samples_nb; REQ(wefax_pic::update_rx_pic_bw, m_pixel_val, m_fax_pix_num); m_statistics.add_bw(m_pixel_val); m_fax_pix_num += bytes_per_pixel ; } m_last_col = curr_col; m_pixel_val = x; m_pix_samples_nb = 1; } /// Prints the status from time to time. if ((m_img_sample % 10000) == 0) { PUT_STATUS(state_rx_str() << ". " << _("Image reception") << ", " << _("sample") << "=" << m_img_sample); } /// Hard-limit to the number of rows. if (current_row >= progdefaults.WEFAX_MaxRows) { std::string comment = strformat(_("Maximum number of rows %d reached:%d. m_last_col = %d Manual = %d"), progdefaults.WEFAX_MaxRows, current_row, m_last_col, m_manual_mode); LOG_VERBOSE("%s", comment.c_str()); /// The reception might be very poor, so reset AFC. reset_afc(); save_automatic("max",comment); return true ; } else { return false ; } } /// Called automatically or by the GUI, when clicking "Skip APT" void fax_implementation::skip_apt_rx(void) { LOG_VERBOSE("state = %s",state_rx_str()); REQ(wefax_pic::skip_rx_apt); if (m_rx_state!= RXAPTSTART) { LOG_ERROR(_("Should be in APT state. State = %s. Manual = %d"), state_rx_str(), m_manual_mode); } lpm_set(0); m_rx_state = RXPHASING; rx_state_changed = true; reset_phasing_counters(); m_img_sample = 0; /// Used for correlation between consecutive lines. m_imag_corr_max = 0.0 ; // Used for finally deciding whether it is worth saving the image. m_imag_corr_min = 1.0 ; // Used for finally deciding whether it is worth saving the image. m_statistics.reset(); } void fax_implementation::skip_phasing_to_image_save(const std::string & comment) { switch(m_rx_state) { /// Maybe we were still reading an image when the phasing band was detected. case RXIMAGE : LOG_VERBOSE("Detected phasing when in image state."); save_automatic("phasing",comment); skip_apt_rx(); break ; default: LOG_ERROR(_("Should be in phasing or image state. State = %s"), state_rx_str()); case RXPHASING: break ; } /// Because we might find a phasing band when reading an image. reset_phasing_counters(); /// Auto-centering by default. Beware that if an image is saved and /// if we lose samples, the alignment is lost. skip_phasing_to_image(false); } /// Called by the user when skipping phasing, /// or automatically when phasing is detected. void fax_implementation::skip_phasing_to_image(bool auto_center) { m_ptr_wefax->qso_rec_init(); REQ(wefax_pic::skip_rx_phasing, auto_center); m_rx_state = RXIMAGE; rx_state_changed = true; // For monochrome, LPM = 60, 90, 100, 120, 180, 240. For colour, LPM = 120, 240 // /// So we round to the nearest integer to avoid slanting. // int lpm_integer = wefax_pic::normalize_lpm(m_lpm_img); // if (m_lpm_img != lpm_integer) { // /// If we could not find a valid LPM, then set the default one for this mode (576/288). // lpm_integer = wefax_pic::normalize_lpm(m_default_lpm); // LOG_VERBOSE(_("LPM rounded from %f to %d. Manual = %d State = %s"), // m_lpm_img, lpm_integer, m_manual_mode, state_rx_str()); // } // /// From now on, m_lpm_img will never change and has a normalized value. // REQ(wefax_pic::update_rx_lpm, lpm_integer); // PUT_STATUS(state_rx_str() << ". " << _("Decoding phasing line LPM = ") << lpm_integer); // lpm_set(lpm_integer); lpm_set(m_default_lpm); } /// Called by the user when clicking button. Never called automatically. void fax_implementation::skip_phasing_rx(bool auto_center) { if (m_rx_state!= RXPHASING) { LOG_ERROR(_("Should be in phasing state. State = %s"), state_rx_str()); } skip_phasing_to_image(auto_center); /// We force these two values because these could not be detected automatically. // if (m_lpm_img != m_default_lpm) { // lpm_set(m_default_lpm); // LOG_VERBOSE(_("Forcing m_lpm_img = %f. Manual = %d"), m_lpm_img, m_manual_mode); // } m_img_sample = 0; /// The image start may not be what the phasing would have told. } // Here we want to remove the last detected phasing line and the following // non phasing line from the beginning of the image and one second of apt stop // from the end void fax_implementation::end_rx(void) { /// Synchronized otherwise there might be a crash if something tries to access the data. REQ(wefax_pic::abort_rx_viewer); m_rx_state = RXAPTSTART; rx_state_changed = true; reset_counters(); } #define CLIP 0.001 /// Receives data from the soundcard. void fax_implementation::rx_new_samples(const double* audio_ptr, int audio_sz) { int demod[audio_sz]; int ix = 0; /// The reception filter may have been changed by the GUI. if (progdefaults.wefax_filter > 2 || progdefaults.wefax_filter < 0) progdefaults.wefax_filter = 0; C_FIR_filter & ref_fir_filt_pair = m_rx_filters[ progdefaults.wefax_filter]; for (int i = 0; i < audio_sz; i++) { if (!ref_fir_filt_pair.run( cmplx (audio_ptr[i] * m_dbl_cosine.next_value(), audio_ptr[i] * m_dbl_sine.next_value()), currz)) continue; if (abs(currz) <= CLIP && abs(prevz) <= CLIP) demod[i] = 255; // white else { ix = round (255 * (0.5 - deviation_ratio * arg (conj (prevz) * currz))); demod[i] = std::min (std::max (0, ix), 255); } prevz = currz; } decode(demod, audio_sz); } // Init transmission. Called once only. void fax_implementation::init_tx(int the_smpl_rat) { m_sample_rate = the_smpl_rat; set_carrier(progdefaults.WEFAX_Center); /// These reset increments of trigo tables. m_ptr_wefax->set_freq(progdefaults.WEFAX_Center); m_tx_state = TXAPTSTART; } /// Elements of buffer are between 0.0 and 1.0 void fax_implementation::modulate(const double* buffer, int number) { double *stack = new double[number]; double tmp_freq = 0; for(int i = 0; i < number; i++) { tmp_freq = m_carrier + 2.0 * (buffer[i] - 0.5) * fm_deviation ; m_dbl_sine.set_increment(m_dbl_sine.size() * tmp_freq / m_sample_rate); stack[i] = m_dbl_sine.next_value(); } m_ptr_wefax->ModulateXmtr(stack, number); delete [] stack; } /// START 5 seconds /// SYNC 20 lines => 10 seconds if LPM = 120 /// IMAGE /// STOP 5 seconds /// BLACK 10 seconds bool fax_implementation::trx_do_next(void) { LOG_DEBUG("m_lpm_img = %f", m_lpm_img); /// The number of samples sent for one line. The LPM is given by the GUI. const int smpl_per_lin = m_smpl_per_lin; static const int block_len = 256;//1024; double *buf = new double[block_len]; bool end_of_loop = false ; bool tx_completed = true ; int curr_sample_idx = 0 , nb_samples_to_send = 0 ; double phase_pos; const char * curr_status_msg = 0; for (int num_bytes_to_write = 0; ; ++num_bytes_to_write) { if ((num_bytes_to_write % block_len == 0) && (num_bytes_to_write > 0)) { modulate(buf, num_bytes_to_write); curr_status_msg = state_to_str(m_tx_state); if (m_ptr_wefax->is_tx_finished(curr_sample_idx, nb_samples_to_send, curr_status_msg)) { end_of_loop = true ; tx_completed = false; continue ; } num_bytes_to_write = 0 ; } if (end_of_loop) { break ; } if (m_tx_state == TXAPTSTART) { nb_samples_to_send = m_sample_rate * m_start_duration ; if (curr_sample_idx < nb_samples_to_send) { buf[num_bytes_to_write] = 0.5 - (m_carrier - m_apt_start_freq) / (2.0 * fm_deviation); curr_sample_idx++; } else { m_tx_state = TXPHASING; curr_sample_idx = 0; } } if (m_tx_state == TXPHASING) { nb_samples_to_send = smpl_per_lin * m_tx_phasing_lin ; if (curr_sample_idx < nb_samples_to_send) { phase_pos = (double)(curr_sample_idx % smpl_per_lin) / (double)smpl_per_lin; buf[num_bytes_to_write] = (phase_pos < 0.025 || phase_pos >= 0.975) ? (m_phase_inverted ? 0.0 : 1.0) : (m_phase_inverted ? 1.0 : 0.0); curr_sample_idx++; } else { m_tx_state = ENDPHASING; curr_sample_idx = 0; } } if (m_tx_state == ENDPHASING) { nb_samples_to_send = smpl_per_lin ; if (curr_sample_idx < nb_samples_to_send) { buf[num_bytes_to_write] = m_phase_inverted ? 0.0 : 1.0; curr_sample_idx++; } else { m_tx_state = TXIMAGE; curr_sample_idx = 0; } } if (m_tx_state == TXIMAGE) { /// The image must be stretched so that its width matches the fax width, /// which cannot change because because it depends on the LPM. /// Accordingly the height is stretched. /// For LPM = 120 and sample rate = 11025 Hz, smpl_per_lin = 5512. double ratio_img_to_fax = 1.0 * m_img_width / m_img_tx_cols ; double ratio_pow = 1.0 * smpl_per_lin / m_img_tx_cols; nb_samples_to_send = m_img_tx_cols * m_img_tx_rows * ratio_pow; if (curr_sample_idx < nb_samples_to_send) { int tmp_col = (double)(curr_sample_idx % smpl_per_lin) * (double)m_img_tx_cols / smpl_per_lin; int tmp_row = (double)(curr_sample_idx / smpl_per_lin);// * (double)m_img_tx_cols / m_img_width; if (tmp_row >= m_img_tx_rows) { LOG_ERROR("Inconsistent tmp_row = %d m_img_tx_rows = %d " "curr_sample_idx = %d smpl_per_lin = %d " "ratio_img_to_fax = %f nb_samples_to_send = %d", tmp_row, m_img_tx_rows, curr_sample_idx, smpl_per_lin, ratio_img_to_fax, nb_samples_to_send); exit(EXIT_FAILURE); } /* if ((curr_sample_idx % smpl_per_lin) == 0) { printf("\ idx: %d, row: %d, spl: %d, Nsmpls: %d, %d x %d x %f, miw: %d\n", curr_sample_idx, tmp_row, smpl_per_lin, nb_samples_to_send, m_img_tx_cols, m_img_tx_rows, ratio_pow, m_img_width); } */ int byte_offset = bytes_per_pixel * (tmp_row * m_img_tx_cols + tmp_col); unsigned char temp_pix = m_xmt_pic_buf[ byte_offset ]; curr_sample_idx++; REQ(wefax_pic::set_tx_pic, temp_pix, tmp_col, tmp_row, m_img_color); buf[num_bytes_to_write] = (double)temp_pix / 256.0 ; } else { m_tx_state = TXAPTSTOP; curr_sample_idx = 0; } } if (m_tx_state == TXAPTSTOP) { nb_samples_to_send = m_sample_rate * m_stop_duration ; if (curr_sample_idx < nb_samples_to_send) { buf[num_bytes_to_write] = 0.5 - (m_carrier - m_apt_stop_freq) / (2.0 * fm_deviation); curr_sample_idx++; } else { m_tx_state = TXBLACK; curr_sample_idx = 0; continue; } } if (m_tx_state == TXBLACK) { nb_samples_to_send = m_sample_rate * 10; // 10 seconds of black if (curr_sample_idx < nb_samples_to_send) { buf[num_bytes_to_write] = 0; curr_sample_idx++; } else { m_tx_state = IDLE; end_of_loop = true ; continue ; } } } // loop delete [] buf; return tx_completed ; } void fax_implementation::tx_params_set( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h) { LOG_DEBUG("img_w = %d img_h = %d the_lpm = %d is_color = %d", img_w, img_h, the_lpm, (int)is_color); m_img_tx_rows = img_h; m_img_tx_cols = img_w; m_img_color = is_color ; lpm_set(the_lpm); m_xmt_pic_buf = xmtpic_buffer ; PUT_STATUS(_("Sending wefax_map.") << _(" rows = ") << m_img_tx_rows << _(" cols = ") << m_img_tx_cols); } void fax_implementation::tx_apt_stop(void) { m_tx_state = TXAPTSTOP; } // --------------------------------------------------------------------- // // --------------------------------------------------------------------- /// Called by trx_trx_transmit_loop void wefax::tx_init() { videoText(); // In trx/modem.cxx m_impl->init_tx(modem::samplerate) ; } /// This updates the window label according to the state. void wefax::update_rx_label(void) const { std::string tmp_label(_("Reception ")); tmp_label += mode_info[modem::mode].name ; if (m_impl->manual_mode_get()) { tmp_label += _(" - Manual") ; } else { tmp_label += _(" - APT control") ; } REQ(wefax_pic::set_rx_label, tmp_label); } void wefax::rx_init() { put_MODEstatus(modem::mode); m_impl->init_rx(modem::samplerate) ; REQ(wefax_pic::resize_rx_viewer, m_impl->fax_width()); } void wefax::init() { modem::init(); /// TODO: Maybe remove, probably not necessary because called by trx_trx_loop rx_init(); /// TODO: Display scope. set_scope_mode(Digiscope::SCOPE); } void wefax::shutdown() { } wefax::~wefax() { modem::stopflag = true; /// Maybe we are receiving an image, this must be stopped. end_reception(); /// Maybe we are sending an image. REQ(wefax_pic::abort_tx_viewer); activate_wefax_image_item(false); delete m_impl ; /// Not really useful, just to help debugging. m_impl = 0 ; } wefax::wefax(trx_mode wefax_mode) : modem() { /// Beware that it is already set by modem::modem modem::cap |= CAP_AFC | CAP_REV | CAP_IMG ; LOG_DEBUG("wefax_mode = %d", (int)wefax_mode); wefax::mode = wefax_mode; modem::samplerate = 11025; m_impl = new fax_implementation(wefax_mode, this); /// Now this object is usable by wefax_pic. wefax_pic::setwefax_map_link(this); int tmpShift = progdefaults.WEFAX_Shift ; if ( (progdefaults.WEFAX_Shift < 100) || (progdefaults.WEFAX_Shift > 1000)) { static const int standard_shift = 800; LOG_WARN("Invalid weather fax shift: %d. setting standard value: %d", progdefaults.WEFAX_Shift, standard_shift); tmpShift = standard_shift ; } fm_deviation = tmpShift / 2 ; modem::bandwidth = fm_deviation * 2 ; m_abortxmt = false; modem::stopflag = false; // There is only one instance of the reception and transmission // windows, therefore only static methods. wefax_pic::create_both(false); /// This updates the window label. set_rx_manual_mode(false); activate_wefax_image_item(true); init(); } //---------------------------------------------------------------------- // receive processing //---------------------------------------------------------------------- /// This must return the current time in seconds with high precision. #if defined(__WIN32__) || defined(__APPLE__) #include /// This is much less accurate. static double current_time(void) { clock_t clks = clock(); return clks * 1.0 / CLOCKS_PER_SEC; } #else #if defined(HAVE_CLOCK_GETTIME) #include static double current_time(void) { // DJV/AB3NR // Replace call to deprecated ftime() function with call to // clock_gettime(2). clock_gettime(2) is POSIX.1 compliant. // Replace ifdef __linux__ with autoconf generated guard. // (Note __linux__ fails for *BSD, which all have better functions // than the fallback Windows routine. Note, clock(2) on Unix systems // returns CPU time used so far. It's not a "clock" in any generally // accepted sense of the word. // // Check system call return codes and abort on failure. // DJV/AB3NR struct timespec ts; double curtime; // Do not know if CLOCK_MONOTONIC or CLOCK_REALTIME is appropriate. DJV if (clock_gettime(CLOCK_REALTIME, &ts) != 0) { LOG_PERROR("clock_gettime"); abort(); } curtime = ts.tv_nsec*1e-09 + (double)ts.tv_sec; return curtime; } #else #include // This is much less accurate. // Add compile time warning DJV/AB3NR #warning imprecise clock() call in function current_time in wefax.cxx static double current_time(void) { clock_t clks = clock(); return clks * 1.0 / CLOCKS_PER_SEC; } #endif // HAVE_CLOCK_GETTIME #endif //__WIN32__ /// Callback continuously called by fldigi modem class. int wefax::rx_process(const double *buf, int len) { if (len == 0 || len > 512) return 0 ; static const int avg_buf_size = 256 ; static int idx = 0 ; static double buf_tim[avg_buf_size]; static int buf_len[avg_buf_size]; int idx_mod = idx % avg_buf_size ; /// Here we estimate the average number of pixels per second. buf_tim[idx_mod] = current_time(); buf_len[idx_mod] = len ; ++idx ; /// Wait some seconds otherwise not significant. if (idx >= avg_buf_size) { if (idx == avg_buf_size) { LOG_VERBOSE(_("Starting samples loss control avg_buf_size = %d"), avg_buf_size); } int idx_mod_first = idx % avg_buf_size ; double total_tim = buf_tim[idx_mod] - buf_tim[idx_mod_first]; int total_len = 0 ; for(int ix = 0 ; ix < avg_buf_size ; ++ix) { total_len += buf_len[ix] ; } /// Estimate the real sample rate. double estim_smpl_rate = (double)total_len / total_tim ; /// If too far from what it should be, it means that pixels were lost. if (estim_smpl_rate < 0.95 * modem::samplerate) { int expected_samples = (int)(modem::samplerate * total_tim + 0.5); int missing_samples = expected_samples - total_len ; LOG_VERBOSE(_("Lost %d samples idx = %d estim_smpl_rate = %f total_tim = %f total_len = %d. Auto-center."), missing_samples, idx, estim_smpl_rate, total_tim, total_len); // REQ(wefax_pic::update_auto_center, true); if (missing_samples <= 0) { /// This should practically never happen. LOG_WARN(_("Cannot compensate")); } else { /// Adjust the number of received pixels, /// so the lost frames are signaled once only. buf_len[idx_mod] += missing_samples ; } } } /// Back to normal processing. m_impl->rx_new_samples(buf, len); return 0; } //---------------------------------------------------------------------- // transmit processing //---------------------------------------------------------------------- /// This is called by wefax-pix.cxx before entering transmission loop. void wefax::set_tx_parameters( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h) { m_impl->tx_params_set( the_lpm, xmtpic_buffer, is_color, img_w, img_h); } /// Callback continuously called by fldigi modem class. int wefax::tx_process() { modem::tx_process(); bool tx_was_completed = m_impl->trx_do_next(); std::string status ; if (!tx_was_completed) { status = _("Transmission cancelled"); LOG_VERBOSE("Sending cancelled"); m_qso_rec.putField(NOTES, status.c_str()); } REQ_FLUSH(GET_THREAD_ID()); wefax_pic::restart_tx_viewer(); transmit_lock_release(status); m_abortxmt = false; m_impl->tx_apt_stop(); return -1; } void wefax::skip_apt(void) { m_impl->skip_apt_rx(); } /// auto_center indicates whether we try to find the margin of the image /// automatically. This is the fact when skipping to image reception /// is triggered manually or based on the signal power. void wefax::skip_phasing(bool auto_center) { m_impl->skip_phasing_rx(auto_center); } void wefax::end_reception(void) { m_impl->end_rx(); } // Continuous reception or APT control. void wefax::set_rx_manual_mode(bool manual_flag) { m_impl->manual_mode_set(manual_flag); wefax_pic::set_manual(manual_flag); update_rx_label(); } void wefax::set_lpm(int the_lpm) { return m_impl->lpm_set(the_lpm); } /// Transmission time in seconds. Factor 3 if b/w image. int wefax::tx_time(int nb_bytes) const { return (double)nb_bytes / modem::samplerate ; } /// This prints a message about the progress of image sending, /// then tells whether the user has requested the end. bool wefax::is_tx_finished(int ix_sample, int nb_sample, const char * msg) const { static char wefaxmsg[256]; double fraction_done = nb_sample ? 100.0 * (double)ix_sample / nb_sample : 0.0 ; int tm_left = tx_time(nb_sample - ix_sample); snprintf( wefaxmsg, sizeof(wefaxmsg), "%s : %04.1f%%, %dm %ds remaining", msg, fraction_done, tm_left / 60, tm_left % 60); put_status(wefaxmsg); bool is_finished = modem::stopflag || m_abortxmt ; if (is_finished) { LOG_VERBOSE("Transmit finished"); } return is_finished ; } /// This returns the names of the possible reception filters. const char ** wefax::rx_filters(void) { return fir_filter_pair_set::filters_list(); } /// Allows to choose the reception filter. //void wefax::set_rx_filter(int idx_filter) //{ // m_impl->set_filter_rx(idx_filter); //} std::string wefax::suggested_filename(void) const { return m_impl->generate_filename("gui"); }; /// This creates a QSO record to be written to an adif file. void wefax::qso_rec_init(void) { /// This is always initialised because the flag progdefaults.WEFAX_AdifLog /// may be set in the middle of an image reception. /// Ideally we should find out the name of the fax station. m_qso_rec.putField(CALL, "Wefax"); m_qso_rec.putField(NAME, "Weather fax"); m_qso_rec.putField(TX_PWR, "0"); m_qso_rec.setDateTime(true); m_qso_rec.setFrequency(wf->rfcarrier() + m_impl->carrier()); m_qso_rec.putField(ADIF_MODE, mode_info[get_mode()].adif_name); } /// Called once a QSO rec has been filled with information. Saved to adif file. void wefax::qso_rec_save(void) { if (progdefaults.WEFAX_AdifLog == false) { return ; } m_qso_rec.setDateTime(false); qsodb.qsoNewRec (&m_qso_rec); qsodb.isdirty(0); loadBrowser(true); adifFile.writeLog (logbook_filename.c_str(), &qsodb); // dxcc_entity_cache_add(&rec); LOG_VERBOSE(_("Updating log book %s"), logbook_filename.c_str()); } /// Called when changing the carrier in the GUI, and by class modem with 1000Hz, when initializing. void wefax::set_freq(double freq) { modem::set_freq(freq); /// This must recompute the increments of the trigonometric tables. m_impl->set_carrier(freq); } // String telling the tx and rx internal state. std::string wefax::state_string(void) const { return m_impl->state_string(); } /// Called when a file is saved, so XML-RPC calls can get the filename. void wefax::put_received_file(const std::string &filnam) { m_impl->put_received_file(filnam); } /// Returns a received file name, by chronological order. std::string wefax::get_received_file(int max_seconds) { return m_impl->get_received_file(max_seconds); } std::string wefax::send_file(const std::string & filnam, double max_seconds) { return m_impl->send_file(filnam, max_seconds); } /// Transmitting files is done in exclusive mode. bool wefax::transmit_lock_acquire(const std::string & filnam, double max_seconds) { return m_impl->transmit_lock_acquire(filnam, max_seconds); } /// Called after a file is sent. void wefax::transmit_lock_release(const std::string & err_msg) { m_impl->transmit_lock_release(err_msg); } fldigi-4.2.05/src/wefax/wefax-pic.cxx0000664000175000017500000013306014611711171014276 00000000000000// ---------------------------------------------------------------------------- // wefax-pic.cxx -- wefax support functions // // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. Adapted from code contained in HAMFAX source code // distribution. // Hamfax Copyright (C) Christof Schmitt // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "wefax-pic.h" #include "debug.h" #include "configuration.h" #include "wefax.h" #include "trx.h" #include "fl_digi.h" #include "main.h" #include "fileselect.h" #include "wefax_map.h" #include "gettext.h" //Fl_Double_Window *wefax_pic_rx_win = (Fl_Double_Window *)0; Fl_Group *wefax_pic_rx_win = (Fl_Group *)0; Fl_Scroll *wefax_pic_rx_scroll = (Fl_Scroll *)0 ; static wefax_map *wefax_pic_rx_wefax_map = (wefax_map *)0; static Fl_Button *wefax_btn_rx_save = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_abort = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_pause = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_resume = (Fl_Button *)0; static Fl_Choice *wefax_choice_rx_zoom = (Fl_Choice *)0; //static Fl_Browser *wefax_browse_rx_events = (Fl_Browser *)0; static Fl_Button *wefax_btn_rx_skip_apt = (Fl_Button *)0; static Fl_Button *wefax_btn_rx_skip_phasing = (Fl_Button *)0; Fl_Light_Button *wefax_round_rx_noise_removal = (Fl_Light_Button *)0; Fl_Light_Button *wefax_round_rx_binary = (Fl_Light_Button *)0; static Fl_Spinner *wefax_spinner_rx_binary = (Fl_Spinner *)0; Fl_Light_Button *wefax_round_rx_non_stop = (Fl_Light_Button *)0; static Fl_Output *wefax_out_rx_row_num = (Fl_Output *)0; //static Fl_Output *wefax_out_rx_width = (Fl_Output *)0; static Fl_Counter *wefax_cnt_rx_ratio = (Fl_Counter *)0; static Fl_Counter *wefax_rx_center = (Fl_Counter *)0; static Fl_Light_Button *wefax_autocenter = (Fl_Light_Button *)0; Fl_Double_Window *wefax_pic_tx_win = (Fl_Double_Window *)0; static Fl_Scroll *wefax_pic_tx_scroll = (Fl_Scroll *)0 ; static wefax_map *wefax_pic_tx_wefax_map = (wefax_map *)0; static wefax_picbox *wefax_pic_tx_box = (wefax_picbox *)0; static Fl_Choice *wefax_choice_tx_zoom = (Fl_Choice *)0; static Fl_Choice *wefax_choice_tx_lpm = (Fl_Choice *)0; static Fl_Button *wefax_btn_tx_send_color = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_send_grey = (Fl_Button *)0; static Fl_Output *wefax_out_tx_row_num = (Fl_Output *)0; static Fl_Output *wefax_out_tx_col_num = (Fl_Output *)0; static Fl_Button *wefax_btn_tx_send_abort = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_load = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_clear = (Fl_Button *)0; static Fl_Button *wefax_btn_tx_close = (Fl_Button *)0; static void wefax_cb_pic_rx_center( Fl_Widget *, void *); /// The image to send. static Fl_Shared_Image *wefax_shared_tx_img = (Fl_Shared_Image *)0; /// This contains the original content of the image to send, /// converted into three bytes per pixel. static unsigned char *wefax_xmtimg = (unsigned char *)0; /// This indicates whether an image to send is loaded in the GUI. /// It allows to acquire twice when re-loading an image without sending. static bool wefax_image_loaded_in_gui = false ; /// Used for shifting the received image left and right. static int center_val_prev = 0 ; /// Global pointer to the current wefax modem. static wefax *wefax_serviceme = 0; /// TODO: This should be hidden in the class wefax_map. It is in wefax too. static const int bytes_per_pix = 3 ; /// Initial size of the reception image. A typical fax has about 1300 lines. static const int curr_pix_h_default = 1300 ; /// Always reset before loading a new image. static int curr_pix_height = curr_pix_h_default ; /// The antepenultimate line of the rx image is filtered to remove noise. static int rx_last_filtered_row = 0 ; static bool noise_removal = false ; /// Alters the slanting of the image based on LPM adjustments. static double rx_slant_ratio = 0.0 ; /// This transforms the user slant ratio (Small number around 0.0) /// into a ratio used to stretch the image (Very very small mantissa added to 1.0). static double slant_factor_default(void) { return 100.0 / ( rx_slant_ratio + 100.0 ); } static double slant_factor_with_ratio( double ratio_percent ) { return ( ratio_percent + 100.0 ) / ( rx_slant_ratio + 100.0 ); } /// When set by the user, no new pixel is added or printed. /// However, when the printing resumes, the position is not altered. static bool reception_paused = false ; /// Sets the label of the received or sent image. static void set_win_label( Fl_Window * wefax_pic, const std::string & lab) { char* label = strdup(lab.c_str()); wefax_pic->copy_label(label); free(label); wefax_pic->redraw(); } /// Called when clearing the image to send. static void clear_image(void) { ENSURE_THREAD(FLMAIN_TID); if (wefax_xmtimg) { delete [] wefax_xmtimg; wefax_xmtimg = NULL ; } if (wefax_shared_tx_img) { wefax_shared_tx_img->release(); wefax_shared_tx_img = 0; } set_win_label(wefax_pic_tx_win,""); } /// Clears the loaded image. It allows XML-RPC clients to send an image. static void wefax_cb_pic_tx_clear( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); wefax_image_loaded_in_gui = false ; clear_image(); wefax_pic_tx_wefax_map->clear(); wefax_pic_tx_wefax_map->resize(0,0,0,0); wefax_pic::restart_tx_viewer(); /// Now the lock can be acquired by XML-RPC. wefax_serviceme->transmit_lock_release( "Cleared" ); } /// According to config flags, shows or hides the transmission window, and resizes both windows if needed. static void wefax_pic_show_tx() { ENSURE_THREAD(FLMAIN_TID); wefax_pic_tx_win->show(); } static void wefax_cb_pic_tx_close( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); wefax_pic_tx_win->hide(); } /// Usual LPM values. static const struct { int m_value ; const char * m_label ; } all_lpm_values[] = { { 240, "240" }, { 120, "120" }, { 90, "90" }, { 60, "60" } }; static const int nb_lpm_values = sizeof(all_lpm_values) / sizeof(all_lpm_values[0]); /// Returns the LPM value choosed on the TX or RX window. static int get_choice_lpm_value( Fl_Choice * the_choice_lpm ) { int idx_lpm = the_choice_lpm->value(); if( ( idx_lpm < 0 ) || ( idx_lpm >= nb_lpm_values ) ) { LOG_WARN( "Invalid LPM index=%d", idx_lpm ); idx_lpm = 0 ; } return all_lpm_values[ idx_lpm ].m_value ; } /// Lpm=120 is by far the most common value, therefore used by default if nothing else works. /// wefax.cxx will always try 120 for wefax576 or 60 for wefax288. static const int lpm_default_idx = 1 ; static const char * title_choice_lpm = "LPM" ; /// Fills a FLTK widget with LPM vpossible values. Used for transmission and reception. static Fl_Choice * make_lpm_choice( int width_offset, int y_btn, int width_btn, int hei_tx_btn ) { Fl_Choice * choice_lpm = new Fl_Choice(width_offset, y_btn, width_btn, hei_tx_btn, title_choice_lpm ); for( int ix_lpm = 0 ; ix_lpm < nb_lpm_values ; ++ix_lpm ) { choice_lpm->add( all_lpm_values[ ix_lpm ].m_label ); }; choice_lpm->value(lpm_default_idx); choice_lpm->tooltip(_("Set the LPM value")); return choice_lpm ; } /// Sometimes the LPM can be calculated to 122.0 when it should be 120.0. int wefax_pic::normalize_lpm( double the_lpm ) { for( int ix_lpm = 0 ; ix_lpm < nb_lpm_values ; ++ix_lpm ) { int curr_lpm = all_lpm_values[ ix_lpm ].m_value ; if( std::fabs( the_lpm - curr_lpm ) < 3.0 ) { return curr_lpm ; } }; int dflt_lpm = all_lpm_values[ lpm_default_idx ].m_value ; LOG_VERBOSE("Out of bounds LPM=%f. Setting to default:%d", the_lpm, dflt_lpm ); return dflt_lpm ; } /// Called for each new color component. int wefax_pic::update_rx_pic_col(unsigned char data, int pix_pos ) { /// Each time the received image becomes too high, we increase its height. static const int curr_pix_incr_height = 100 ; /// Three ints per pixel. It is safer to recalculate the /// row index to avoid any buffer overflow, because the given /// row is invalid if the image was horizontally moved. int row_number = 1 + ( pix_pos / ( wefax_pic_rx_wefax_map->pix_width() * bytes_per_pix ) ); /// Maybe we must increase the image height. if( curr_pix_height <= row_number ) { curr_pix_height = row_number + curr_pix_incr_height ; wefax_pic_rx_wefax_map->resize_height( curr_pix_height, false ); int y_pos = wefax_pic_rx_wefax_map->h() - wefax_pic_rx_scroll->h() ; if( y_pos < 0 ) { y_pos = 0 ; } else { // Small margin at the bottom, so we can immediately see new lines. y_pos += 20 ; } wefax_pic_rx_wefax_map->position( wefax_pic_rx_wefax_map->x(), -y_pos ); wefax_pic_rx_scroll->redraw(); } wefax_pic_rx_wefax_map->pixel(data, pix_pos); return row_number ; } /// This estimates the colum of where the horizontal center of the image is, /// or rather, the beginning of the left margin. The estimation is done on /// a range of rows. It looks for a vertical band of X pixels, where the image /// derivative is the lowest. It works well with faxes because they always have /// a wide blank margin. //static int rowcount = 2; static int estimate_rx_image_center( int row_end , int numrows ) { if (row_end < numrows) return 0; /// This works as well with color images. int img_wid = wefax_pic_rx_wefax_map->pix_width() * bytes_per_pix ; unsigned const char * img_start = wefax_pic_rx_wefax_map->buffer(); /// The width of the image band on which we compute the minima /// of the absolute value of the video signal. /// Equal to the WEFAX start phasing width. #define AVG_WID 180 const unsigned char *pch = img_start; int avgs[img_wid]; memset(avgs, 0, img_wid * sizeof(*avgs)); int img_avg[img_wid]; memset(img_avg, 0, img_wid * sizeof(*img_avg)); // averages over numrows for (int col = 0; col < img_wid; col++) { int avgval = 0; Fl::awake(); for (int row = row_end - numrows; row < row_end; ++row) { avgval += (int)(pch[row * img_wid + col]); } avgs[col] = avgval / numrows; } int min_idx = -1; int min_val = 255; for (int col = 0; col < img_wid; col++) { for (int n = 0; n < AVG_WID; n++) img_avg[col] += avgs[(col + n) % img_wid]; img_avg[col] /= AVG_WID; if (img_avg[col] < min_val) { min_val = img_avg[col]; min_idx = col; } } if (min_idx > img_wid / 2) min_idx -= img_wid; min_idx += AVG_WID / 2; min_idx /= bytes_per_pix; // if (!rowcount) { // ofstream csvfile("img.csv"); // for (int col = 0; col < img_wid; ++col) // csvfile << avgs[col] << "," << img_avg[col] << std::endl; // csvfile.close(); // } else // --rowcount; if (min_val > 40) return 0; return min_idx; } /// Called for each bw pixel. void wefax_pic::update_rx_pic_bw(unsigned char data, int pix_pos ) { /// No pixel is added nor printed until this flag is reset to false. if( reception_paused ) { return ; }; /// The image must be horizontally shifted. pix_pos += center_val_prev * bytes_per_pix ; if( pix_pos < 0 ) { pix_pos = 0 ; } /// Maybe there is a slant. pix_pos = ( double )pix_pos * slant_factor_default() + 0.5 ; /// Must be a multiple of the number of bytes per pixel. pix_pos = ( pix_pos / bytes_per_pix ) * bytes_per_pix ; static int prev_row = 0; int row_number = 0; for (int n = 0; n < bytes_per_pix; n++) row_number = update_rx_pic_col(data, pix_pos + n); if (prev_row != row_number) { char row_num_buffer[20]; snprintf( row_num_buffer, sizeof(row_num_buffer), "%d", row_number ); wefax_out_rx_row_num->value( row_num_buffer ); prev_row = row_number; } if( noise_removal ) { if( ( row_number > wefax_map::noise_height_margin - 2 ) && ( row_number != rx_last_filtered_row ) ) { wefax_pic_rx_wefax_map->remove_noise( row_number, progdefaults.WEFAX_NoiseMargin, progdefaults.WEFAX_NoiseThreshold ); rx_last_filtered_row = row_number ; } } /// Recenter every X-th row static int last_row = 0; if ((row_number != last_row) && (row_number < progdefaults.wefax_align_stop) && (row_number > progdefaults.wefax_auto_after) && (row_number % progdefaults.wefax_align_rows == 0)) { last_row = row_number; int new_center = estimate_rx_image_center( row_number, progdefaults.wefax_align_rows ); if (progdefaults.wefax_autocenter) { if ( abs(new_center) > 3) { // 2 x depth of image wefax_rx_center->value(wefax_rx_center->value() - new_center); wefax_cb_pic_rx_center(NULL, NULL); } } } } static void wefax_cb_pic_rx_pause( Fl_Widget *, void *) { wefax_btn_rx_pause->hide(); wefax_btn_rx_resume->show(); reception_paused = true ; wefax_serviceme->update_rx_label(); } static void wefax_cb_pic_rx_resume( Fl_Widget *, void *) { wefax_btn_rx_pause->show(); wefax_btn_rx_resume->hide(); reception_paused = false ; wefax_serviceme->update_rx_label(); } static void wefax_cb_pic_rx_abort( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); if (wefax_serviceme != active_modem) return; /// This will call wefax_pic::abort_rx_viewer wefax_serviceme->end_reception(); wefax_round_rx_non_stop->value(false); wefax_serviceme->set_rx_manual_mode(false); wefax_round_rx_non_stop->redraw(); wefax_btn_rx_pause->show(); wefax_btn_rx_resume->hide(); } void wefax_pic::set_manual( bool manual ) { wefax_round_rx_non_stop->value(manual); } static void wefax_cb_pic_rx_manual( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; if( wefax_round_rx_non_stop->value() ) { wefax_serviceme->set_rx_manual_mode(true); wefax_serviceme->skip_apt(); wefax_serviceme->skip_phasing(true); } else { wefax_serviceme->set_rx_manual_mode(false); } } static void wefax_cb_pic_rx_center( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int center_new_val = wefax_rx_center->value(); int center_delta = center_new_val - center_val_prev ; center_val_prev = center_new_val ; wefax_pic_rx_wefax_map->shift_horizontal_center( center_delta ); } static void cb_wefax_autocenter( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; progdefaults.wefax_autocenter = wefax_autocenter->value(); return; } /// This gets the directory where images are accessed by default. static std::string default_dir_get( const std::string & config_dir ) { std::string tmp_dir = config_dir.empty() ? PicsDir : config_dir ; /// Valid dir names must end with a slash. if( ! tmp_dir.empty() ) { char termin = tmp_dir[ tmp_dir.size() - 1 ]; if( ( termin != '/' ) && ( termin != '\\' ) ) tmp_dir += '/'; } return tmp_dir ; } /// This sets the directory where images are accessed by default. /// Receives a file name, not a directory name. static void default_dir_set( std::string & config_dir, const std::string & fil_name ) { char * fil_nam_copy = strdup( fil_name.c_str() ); /// dirname() is a POSIX function. const char * dir_nam = dirname( fil_nam_copy ); config_dir = dir_nam + std::string("/"); LOG_VERBOSE("Setting default dir to %s", dir_nam ); free( fil_nam_copy ); } /// Adds the file name to log to the adif file. static void qso_notes( const char * direction, const std::string & file_name ) { if( progdefaults.WEFAX_AdifLog == false ) { return ; } const std::string tmp_notes = direction + file_name ; wefax_serviceme->qso_rec().putField( NOTES, tmp_notes.c_str() ); } static void wefax_cb_pic_rx_save( Fl_Widget *, void *) { ENSURE_THREAD(FLMAIN_TID); const char ffilter[] = "Portable Network Graphics\t*.png\n"; std::string dfname = default_dir_get( progdefaults.wefax_save_dir ); dfname.append( wefax_serviceme->suggested_filename() ); const char *file_name = FSEL::saveas(_("Save image as:"), ffilter, dfname.c_str(), NULL); /// Beware that no extra comments are saved here. if (!file_name) return; if (!*file_name) return; wefax_pic_rx_wefax_map->save_png(file_name); qso_notes( "RX:", file_name ); wefax_serviceme->qso_rec_save(); /// Next time, image will be saved at the same place. default_dir_set( progdefaults.wefax_save_dir, file_name ); } /// Beware, might be called by another thread. Called by the GUI /// or when APT start is detected. void wefax_pic::skip_rx_apt(void) { ENSURE_THREAD(FLMAIN_TID); wefax_btn_rx_abort->hide(); wefax_btn_rx_skip_apt->hide(); wefax_btn_rx_skip_phasing->show(); } /// Called when the user clicks "Skip APT" static void wefax_cb_pic_rx_skip_apt( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); wefax_serviceme->skip_apt(); } /// Called when clicking "Skip phasing" or by wefax.cxx /// when end of phasing is detected. Beware, might be called by another thread. void wefax_pic::skip_rx_phasing(bool auto_center) { ENSURE_THREAD(FLMAIN_TID); /// Theoretically, this widget should already be hidden, but sometimes /// it seems that a call to skip_apt is lost... ? wefax_btn_rx_abort->show(); wefax_btn_rx_skip_apt->hide(); wefax_btn_rx_skip_phasing->hide(); wefax_round_rx_noise_removal->show(); wefax_round_rx_binary->show(); wefax_spinner_rx_binary->show(); wefax_out_rx_row_num->show(); wefax_cnt_rx_ratio->show(); } /// Called when clicking "Skip phasing". static void wefax_cb_pic_rx_skip_phasing( Fl_Widget *w, void *) { if (wefax_serviceme != active_modem) return; wefax_serviceme->skip_phasing(true); } static void wefax_cb_pic_rx_noise_removal( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); char rndVal = wefax_round_rx_noise_removal->value(); noise_removal = rndVal ? true : false; } static void wefax_cb_pic_rx_binary( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); char rndVal = wefax_round_rx_binary->value(); if( rndVal ) { wefax_pic_rx_wefax_map->set_binary( true ); wefax_spinner_rx_binary->activate(); } else { wefax_pic_rx_wefax_map->set_binary( false ); wefax_spinner_rx_binary->deactivate(); } } static void wefax_cb_pic_rx_bin_threshold( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int rndVal = wefax_spinner_rx_binary->value(); wefax_pic_rx_wefax_map->set_binary_threshold( rndVal ); } static void wefax_cb_pic_ratio( Fl_Widget *, void * ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); double ratio_percent = wefax_cnt_rx_ratio->value(); double current_ratio = slant_factor_with_ratio( ratio_percent ); wefax_pic_rx_wefax_map->stretch( current_ratio ); rx_slant_ratio = ratio_percent ; /// And we update the configuration structure. progdefaults.wefax_slant = rx_slant_ratio ; /// Will prompt for saving configuration when exiting. progdefaults.changed = true; } /// Possible zooms. The value is processed by class wefax_map. static const struct { int m_value ; const char * m_label ; } all_zooms[] = { { -3, "25%" }, { -2, "33%" }, { -1, "50%" }, { 0, "100%" } }; //, // { 1, "200%" }, // { 2, "300%" }, // { 3, "400%" }, //}; // Index in all_zooms. static const int idx_default_zoom = 2 ; static int zoom_nb = sizeof(all_zooms) / sizeof(all_zooms[0]); static void wefax_cb_pic_zoom( Fl_Widget * wefax_choice_zoom, void * ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); int idx_zoom = dynamic_cast(wefax_choice_zoom)->value(); if( ( idx_zoom < 0 ) || ( idx_zoom >= zoom_nb ) ) { LOG_WARN( "Invalid zoom index=%d", idx_zoom ); idx_zoom = idx_default_zoom ; } /// Not very elegant but OK if two possibilities only. if( wefax_choice_zoom == wefax_choice_rx_zoom ) { wefax_pic_rx_wefax_map->set_zoom( all_zooms[ idx_zoom ].m_value ); wefax_pic_rx_win->redraw(); } else if( wefax_choice_zoom == wefax_choice_tx_zoom ) { wefax_pic_tx_wefax_map->set_zoom( all_zooms[ idx_zoom ].m_value ); wefax_pic_tx_win->redraw(); } else { LOG_ERROR("Inconsistent possibility"); } } static Fl_Choice * wefax_create_zoom(int fax_grp_x, int fax_grp_y, int wid_btn_curr, int H_BUTTON) { ENSURE_THREAD(FLMAIN_TID); static const char * title_zoom = "Zoom" ; Fl_Choice * wefax_choice_zoom = new Fl_Choice(fax_grp_x, fax_grp_y, wid_btn_curr, H_BUTTON, _(title_zoom)); wefax_choice_zoom->callback(wefax_cb_pic_zoom, 0); for( int ix_zoom = 0; ix_zoom < zoom_nb ; ++ix_zoom ) { wefax_choice_zoom->add( all_zooms[ ix_zoom ].m_label ); }; wefax_choice_zoom->value(idx_default_zoom); wefax_choice_zoom->tooltip(_("Window zoom")); wefax_choice_zoom->align(FL_ALIGN_LEFT); return wefax_choice_zoom ; } void wefax_pic::abort_rx_viewer(void) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); put_status(""); /// Maybe the image is too high, we make it shorter. wefax_pic_rx_wefax_map->resize_height( curr_pix_h_default, true ); /// Now returns to the top of the image, and refresh the scrolling. wefax_pic_rx_wefax_map->position( wefax_pic_rx_wefax_map->x(), 0 ); wefax_pic_rx_scroll->redraw(); curr_pix_height = curr_pix_h_default ; rx_last_filtered_row = 0; center_val_prev = 0 ; wefax_rx_center->value(0.0); wefax_btn_rx_abort->hide(); wefax_btn_rx_skip_apt->show(); wefax_btn_rx_skip_phasing->hide(); // Back to the first line before reading next image. wefax_pic_rx_scroll->scroll_to( 0, 0 ); } /// The resizing is different from the base class. class wefax_map_scroll : public wefax_map { public: /// Background color is gray. wefax_map_scroll(int X, int Y, int W, int H) : wefax_map (X, Y, W, H, 255) {}; virtual ~wefax_map_scroll() {}; /// wefax_map::resize destroys the image, we do not want that when displaying. virtual void resize(int x, int y, int w, int h) { Fl_Widget::resize( x, y, w, h ); } /// This must not process slant this way, so inhibits wefax_map::handle. virtual int handle(int event) { return 0 ; } }; static void wefax_load_image(const char * fil_name); static const int extra_win_wid = 800 ; Fl_Group *create_wefax_rx_viewer(int pos_x, int pos_y,int win_wid, int hei_win) { rx_slant_ratio = progdefaults.wefax_slant ; wefax_pic_rx_win = new Fl_Group(pos_x, pos_y, win_wid, hei_win); wefax_pic_rx_win->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); wefax_pic_rx_win->align(FL_ALIGN_CLIP); /// A bit wider so that it does not scroll at the beginning. int H_MARGIN = 1; int W_MARGIN = 1; int H_BUTTON = 22; Fl_Font font = fl_font(); int fsize = fl_size(); fl_font(FL_HELVETICA, 12); int wid_img = win_wid - 2 * W_MARGIN; int hei_scroll = hei_win - (H_BUTTON + 3 * H_MARGIN); wefax_pic_rx_win->begin(); wefax_pic_rx_scroll = new Fl_Scroll( pos_x + W_MARGIN, pos_y, wid_img, hei_scroll ); wefax_pic_rx_scroll->type(Fl_Scroll::HORIZONTAL | Fl_Scroll::VERTICAL | Fl_Scroll::ALWAYS_ON); wefax_pic_rx_scroll->color( fl_rgb_color( 255, 255, 255), progdefaults.RxTxSelectcolor); wefax_pic_rx_scroll->box(FL_ENGRAVED_FRAME); wefax_pic_rx_scroll->begin(); /// It will be resized immediately. wefax_pic_rx_wefax_map = new wefax_map_scroll( wefax_pic_rx_scroll->x(), wefax_pic_rx_scroll->y(), wid_img, curr_pix_height); wefax_pic_rx_wefax_map->align(FL_ALIGN_TOP); wefax_pic_rx_wefax_map->set_zoom( all_zooms[ idx_default_zoom ].m_value ); wefax_pic_rx_scroll->end(); /// Sets the group at a big size, we will resize the width at the end. Fl_Group * tmpGroup = new Fl_Group( W_MARGIN, pos_y + hei_scroll, wid_img, H_BUTTON + 2 * H_MARGIN); tmpGroup->begin(); tmpGroup->box( FL_DOWN_BOX); tmpGroup->color(fl_rgb_color(144, 175, 200)); wefax_btn_rx_save = new Fl_Button( tmpGroup->x() + W_MARGIN, tmpGroup->y() + H_MARGIN, 35, H_BUTTON, _("Save")); wefax_btn_rx_save->callback(wefax_cb_pic_rx_save, 0); wefax_btn_rx_save->tooltip(_("Save current image in a file.")); /// Clear, Skipt APT and Skip phasing are at the same place wefax_btn_rx_abort = new Fl_Button( wefax_btn_rx_save->x() + wefax_btn_rx_save->w() + W_MARGIN, wefax_btn_rx_save->y(), 45, H_BUTTON, _("Clear")); wefax_btn_rx_abort->callback(wefax_cb_pic_rx_abort, 0); wefax_btn_rx_abort->tooltip(_("End and clear current image reception.")); wefax_btn_rx_skip_apt = new Fl_Button( wefax_btn_rx_abort->x(), wefax_btn_rx_abort->y(), wefax_btn_rx_abort->w(), wefax_btn_rx_abort->h(), _("APT")); wefax_btn_rx_skip_apt->callback(wefax_cb_pic_rx_skip_apt, 0); wefax_btn_rx_skip_apt->tooltip(_("Skip Automatic Picture Transmission step")); wefax_btn_rx_skip_phasing = new Fl_Button( wefax_btn_rx_abort->x(), wefax_btn_rx_abort->y(), wefax_btn_rx_abort->w(), wefax_btn_rx_abort->h(), _("Phase")); wefax_btn_rx_skip_phasing->callback(wefax_cb_pic_rx_skip_phasing, 0); wefax_btn_rx_skip_phasing->tooltip(_("Skip phasing step")); wefax_btn_rx_pause = new Fl_Button( wefax_btn_rx_skip_phasing->x() + wefax_btn_rx_skip_phasing->w() + W_MARGIN, wefax_btn_rx_skip_phasing->y(), 45, H_BUTTON, _("Pause")); wefax_btn_rx_pause->callback(wefax_cb_pic_rx_pause, 0); wefax_btn_rx_pause->tooltip(_("Pause reception.")); wefax_btn_rx_resume = new Fl_Button( wefax_btn_rx_skip_phasing->x(), wefax_btn_rx_skip_phasing->y(), wefax_btn_rx_skip_phasing->w(), wefax_btn_rx_skip_phasing->h(), _("Resume")); wefax_btn_rx_resume->callback(wefax_cb_pic_rx_resume, 0); wefax_btn_rx_resume->tooltip(_("Resume reception.")); wefax_btn_rx_resume->hide(); wefax_round_rx_non_stop = new Fl_Light_Button( wefax_btn_rx_resume->x() + wefax_btn_rx_resume->w() + W_MARGIN, wefax_btn_rx_resume->y(), 50, H_BUTTON, _("Cont'")); wefax_round_rx_non_stop->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); wefax_round_rx_non_stop->selection_color(progdefaults.default_btn_color); wefax_round_rx_non_stop->callback(wefax_cb_pic_rx_manual, 0); wefax_round_rx_non_stop->tooltip(_("Continuous reception mode")); int zw = fl_width(_("Mag")) + 5; wefax_choice_rx_zoom = new Fl_Choice( wefax_round_rx_non_stop->x() + wefax_round_rx_non_stop->w() + W_MARGIN + zw, wefax_round_rx_non_stop->y(), 60, H_BUTTON, _("Mag") ); wefax_choice_rx_zoom->callback(wefax_cb_pic_zoom, 0); for( int ix_zoom = 0; ix_zoom < zoom_nb ; ++ix_zoom ) wefax_choice_rx_zoom->add( all_zooms[ ix_zoom ].m_label ); wefax_choice_rx_zoom->value(idx_default_zoom); wefax_choice_rx_zoom->tooltip(_("Image magnification")); wefax_choice_rx_zoom->align(FL_ALIGN_LEFT); zw = fl_width(_("Row")) + 5; wefax_out_rx_row_num = new Fl_Output( wefax_choice_rx_zoom->x() + wefax_choice_rx_zoom->w() + zw + W_MARGIN, wefax_choice_rx_zoom->y(), 50, H_BUTTON, _("Row")); wefax_out_rx_row_num->align(FL_ALIGN_LEFT); wefax_out_rx_row_num->tooltip(_("Fax line number being read. Image is saved when reaching max lines.")); zw = fl_width(_("Tilt")) + 5; wefax_cnt_rx_ratio = new Fl_Counter( wefax_out_rx_row_num->x() + wefax_out_rx_row_num->w() + zw, wefax_out_rx_row_num->y(), 120, H_BUTTON, _("Tilt")); wefax_cnt_rx_ratio->align(FL_ALIGN_LEFT); wefax_cnt_rx_ratio->step(.0001); wefax_cnt_rx_ratio->lstep(.001); wefax_cnt_rx_ratio->precision( 4 ); wefax_cnt_rx_ratio->callback(wefax_cb_pic_ratio, 0); wefax_cnt_rx_ratio->value(rx_slant_ratio); wefax_cnt_rx_ratio->tooltip(_("Adjust image slant to correct soundcard clock error.")); zw = fl_width(_("Align")) + 5; wefax_rx_center = new Fl_Counter( wefax_cnt_rx_ratio->x() + wefax_cnt_rx_ratio->w() + zw, wefax_cnt_rx_ratio->y(), 130, H_BUTTON, _("Align")); wefax_rx_center->align(FL_ALIGN_LEFT); /// The range is set when the image size in pixels is known. wefax_rx_center->step(1.0); wefax_rx_center->lstep(10.0); wefax_rx_center->callback(wefax_cb_pic_rx_center, 0); wefax_rx_center->tooltip(_("Align image horizontally.")); center_val_prev = 0 ; wefax_autocenter = new Fl_Light_Button( wefax_rx_center->x() + wefax_rx_center->w() + W_MARGIN, wefax_rx_center->y(), 45, H_BUTTON, "Auto"); wefax_autocenter->selection_color(progdefaults.default_btn_color); wefax_autocenter->callback(cb_wefax_autocenter, 0); wefax_autocenter->tooltip(_("Enable automatic image centering")); wefax_autocenter->value(progdefaults.wefax_autocenter); wefax_round_rx_noise_removal = new Fl_Light_Button( wefax_autocenter->x() + wefax_autocenter->w() + W_MARGIN, wefax_autocenter->y(), 50, H_BUTTON, _("Noise")); wefax_round_rx_noise_removal->callback(wefax_cb_pic_rx_noise_removal, 0); wefax_round_rx_noise_removal->tooltip(_("Removes noise when ticked")); wefax_round_rx_noise_removal->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); wefax_round_rx_noise_removal->selection_color(progdefaults.default_btn_color); wefax_round_rx_binary = new Fl_Light_Button( wefax_round_rx_noise_removal->x() + wefax_round_rx_noise_removal->w() + W_MARGIN, wefax_round_rx_noise_removal->y(), 35, H_BUTTON, _("Bin")); wefax_round_rx_binary->callback(wefax_cb_pic_rx_binary, 0); wefax_round_rx_binary->tooltip(_("Binary image when ticked")); wefax_round_rx_binary->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); wefax_round_rx_binary->selection_color(progdefaults.default_btn_color); wefax_round_rx_binary->value(0); wefax_spinner_rx_binary = new Fl_Spinner( wefax_round_rx_binary->x() + wefax_round_rx_binary->w() + W_MARGIN, wefax_round_rx_binary->y(), 50, H_BUTTON ); wefax_spinner_rx_binary->callback(wefax_cb_pic_rx_bin_threshold, 0); wefax_spinner_rx_binary->tooltip(_("Set binarization level")); wefax_spinner_rx_binary->format("%d"); wefax_spinner_rx_binary->type(FL_INT_INPUT); wefax_spinner_rx_binary->range(0.0, 255.0); wefax_spinner_rx_binary->step(1.0); wefax_spinner_rx_binary->value(wefax_pic_rx_wefax_map->get_binary_threshold()); Fl_Box *filler = new Fl_Box( wefax_spinner_rx_binary->x() + wefax_spinner_rx_binary->w(), wefax_spinner_rx_binary->y(), 2, H_BUTTON ); filler->box(FL_NO_BOX); tmpGroup->end(); tmpGroup->resizable(filler);//wefax_browse_rx_events); tmpGroup->init_sizes(); wefax_pic_rx_win->end(); wefax_pic_rx_win->resizable( wefax_pic_rx_scroll ); wefax_pic_rx_win->init_sizes(); wefax_pic_rx_win->redraw(); fl_font(font, fsize); return wefax_pic_rx_win; } void wefax_pic::resize_rx_viewer(int wid_img) { // return; ENSURE_THREAD(FLMAIN_TID); abort_rx_viewer(); wefax_pic_rx_wefax_map->wefax_map::resize( wefax_pic_rx_wefax_map->x(), wefax_pic_rx_wefax_map->y(), wid_img, curr_pix_h_default ); wefax_pic_rx_win->redraw(); } void wefax_pic::set_rx_label(const std::string & win_label) { std::string tmp_label( win_label ); if( reception_paused ) { tmp_label += " paused" ; } } void wefax_pic::save_image(const std::string & fil_name, const std::string & extra_comments ) { std::string dfname = default_dir_get( progdefaults.wefax_save_dir ) + fil_name ; std::stringstream local_comments; local_comments << extra_comments ; local_comments << "Slant:" << rx_slant_ratio << "\n" ; local_comments << "Auto-Center:" << ( progdefaults.wefax_autocenter ? "On" : "Off" ) << "\n" ; wefax_pic_rx_wefax_map->save_png( dfname.c_str(), local_comments.str().c_str()); // add_to_files_list( dfname ); qso_notes( "RX:", fil_name ); wefax_serviceme->qso_rec_save(); } /// Protected by an exclusive mutex. static std::string wefax_load_image_after_acquire(const char * fil_name) { if (wefax_serviceme != active_modem) return "Not in WEFAX mode"; ENSURE_THREAD(FLMAIN_TID); wefax_serviceme->qso_rec_init(); qso_notes( "TX:", fil_name ); clear_image(); wefax_shared_tx_img = Fl_Shared_Image::get(fil_name); if (!wefax_shared_tx_img) { std::string err_msg("Cannot call Fl_Shared_Image::get on file:" + std::string(fil_name) ); LOG_ERROR("%s",err_msg.c_str()); return err_msg; } if (wefax_shared_tx_img->count() > 1) { // we only handle rgb images std::string err_msg("Handle only RGB images: " + std::string(fil_name) ); LOG_ERROR("%s",err_msg.c_str()); clear_image(); return err_msg; } unsigned char * img_data = (unsigned char *)wefax_shared_tx_img->data()[0]; int img_wid = wefax_shared_tx_img->w(); int img_hei = wefax_shared_tx_img->h(); int img_depth = wefax_shared_tx_img->d(); wefax_xmtimg = new unsigned char [img_wid * img_hei * bytes_per_pix]; if (img_depth == bytes_per_pix) memcpy(wefax_xmtimg, img_data, img_wid*img_hei*bytes_per_pix); else if (img_depth == 4) { int i, j, k; for (i = 0; i < img_wid*img_hei; i++) { j = i*bytes_per_pix; k = i*4; wefax_xmtimg[j] = img_data[k]; wefax_xmtimg[j+1] = img_data[k+1]; wefax_xmtimg[j+2] = img_data[k+2]; } } else if (img_depth == 1) { int i, j; for (i = 0; i < img_wid*img_hei; i++) { j = i * bytes_per_pix; wefax_xmtimg[j] = wefax_xmtimg[j+1] = wefax_xmtimg[j+2] = img_data[i]; } } else { std::stringstream err_strm ; err_strm << "Inconsistent img_depth=" << img_depth << " for " << fil_name ; std::string err_msg = err_strm.str(); LOG_ERROR("%s",err_msg.c_str()); return err_msg ; }; wefax_pic::tx_viewer_resize(img_wid, img_hei); set_win_label(wefax_pic_tx_win, fil_name); wefax_pic_tx_box->label(0); // load the wefax_map widget with the rgb image wefax_pic_tx_wefax_map->show(); wefax_pic_tx_wefax_map->clear(); wefax_pic_tx_wefax_map->video(wefax_xmtimg, img_wid * img_hei * bytes_per_pix); int tim_color = wefax_serviceme->tx_time( img_wid * img_hei * bytes_per_pix ); static char wefax_txclr_tooltip[24]; snprintf( wefax_txclr_tooltip, sizeof(wefax_txclr_tooltip), _("Time needed: %dm %ds (Color)"), tim_color/60, tim_color % 60 ); wefax_btn_tx_send_color->tooltip(wefax_txclr_tooltip); if( false ) { // No color transmission now because no information this format. wefax_btn_tx_send_color->activate(); } int tim_grey = wefax_serviceme->tx_time( img_wid * img_hei ); static char wefax_txgry_tooltip[24]; snprintf( wefax_txgry_tooltip, sizeof(wefax_txgry_tooltip), _("Time needed: %dm %ds (B/W)"), tim_grey/60, tim_grey % 60 ); wefax_btn_tx_send_grey->tooltip(wefax_txgry_tooltip); wefax_btn_tx_send_grey->activate(); wefax_choice_tx_zoom->activate(); wefax_btn_tx_clear->activate(); return std::string(); } static void wefax_load_image(const char * fil_name) { if (wefax_serviceme != active_modem) return; if( !wefax_image_loaded_in_gui ) { /// So we do not re-acquire the exclusive access to wefax transmission. wefax_serviceme->transmit_lock_acquire(fil_name); wefax_image_loaded_in_gui = true ; } wefax_load_image_after_acquire(fil_name); } void wefax_pic::set_tx_pic(unsigned char data, int col, int row, bool is_color ) { if (wefax_serviceme != active_modem) return; ENSURE_THREAD(FLMAIN_TID); if( ( col >= wefax_shared_tx_img->w() ) || ( row >= wefax_shared_tx_img->h() ) ) { LOG_ERROR("invalid col=%d row=%d w=%d h=%d", col, row, wefax_shared_tx_img->w(), wefax_shared_tx_img->h() ); exit(EXIT_FAILURE); } int offset = row * wefax_shared_tx_img->w() + col ; if (is_color) { wefax_pic_tx_wefax_map->pixel( data, offset ); } else { int tripleOffset = bytes_per_pix * offset ; wefax_pic_tx_wefax_map->pixel( data, tripleOffset ); wefax_pic_tx_wefax_map->pixel( data, tripleOffset + 1 ); wefax_pic_tx_wefax_map->pixel( data, tripleOffset + 2 ); } static int previous_row = -1 ; if( row != previous_row ) { previous_row = row ; char num_buffer[20]; snprintf( num_buffer, sizeof(num_buffer), "%d", row ); wefax_out_tx_row_num->value( num_buffer ); snprintf( num_buffer, sizeof(num_buffer), "%d", wefax_shared_tx_img->w() ); wefax_out_tx_col_num->value( num_buffer ); } } static void wefax_cb_pic_tx_load(Fl_Widget *, void *) { const char *fil_name = FSEL::select(_("Load image file"), "Portable Network Graphics\t*.png\n" "Independent JPEG Group\t*.{jpg,jif,jpeg,jpe}\n" "Graphics Interchange Format\t*.gif", default_dir_get( progdefaults.wefax_load_dir ).c_str() ); if (!fil_name) return; if (!*fil_name) return; /// Next time, image will be saved at the same place. default_dir_set( progdefaults.wefax_load_dir, fil_name ); wefax_load_image(fil_name); } /// Called whether color or b/w image. static void wefax_pic_tx_send_common( bool is_color ) { ENSURE_THREAD(FLMAIN_TID); if (wefax_serviceme != active_modem) return; int img_w = wefax_shared_tx_img->w(); int img_h = wefax_shared_tx_img->h(); wefax_choice_tx_lpm->hide(); wefax_btn_tx_send_color->hide(); wefax_btn_tx_send_grey->hide(); wefax_btn_tx_load->hide(); wefax_choice_tx_zoom->hide(); wefax_btn_tx_clear->hide(); wefax_btn_tx_close->hide(); wefax_out_tx_row_num->show(); wefax_out_tx_col_num->show(); wefax_btn_tx_send_abort->show(); wefax_pic_tx_wefax_map->clear(); wefax_out_tx_row_num->value( "Init" ); wefax_out_tx_col_num->value( "" ); wefax_serviceme->set_tx_parameters( get_choice_lpm_value( wefax_choice_tx_lpm ), wefax_xmtimg, is_color, img_w, img_h ); start_tx(); } static void wefax_cb_pic_tx_send_color( Fl_Widget * , void *) { wefax_pic_tx_send_common(true); } static void wefax_cb_pic_tx_send_grey( Fl_Widget *, void *) { wefax_pic_tx_send_common(false); } static void wefax_cb_pic_tx_send_abort( Fl_Widget *, void *) { if (wefax_serviceme != active_modem) return; /// Maybe we are not sending an image. if( wefax_shared_tx_img ) { wefax_serviceme->set_tx_abort_flag(); // reload the wefax_map widget with the rgb image wefax_pic_tx_wefax_map->video(wefax_xmtimg, wefax_shared_tx_img->w() * wefax_shared_tx_img->h() * bytes_per_pix); } } void wefax_pic::restart_tx_viewer(void) { ENSURE_THREAD(FLMAIN_TID); wefax_out_tx_row_num->hide(); wefax_out_tx_col_num->hide(); wefax_btn_tx_send_abort->hide(); wefax_btn_tx_load->show(); wefax_btn_tx_close->show(); if( wefax_image_loaded_in_gui ) { // If the image was loaded from the GUI. wefax_choice_tx_lpm->show(); wefax_btn_tx_send_color->show(); wefax_btn_tx_send_grey->show(); wefax_choice_tx_zoom->show(); wefax_btn_tx_clear->show(); } else { /// If the image was loaded and sent from XML-RPC, or no image present. wefax_choice_tx_lpm->deactivate(); wefax_btn_tx_send_color->deactivate(); wefax_btn_tx_send_grey->deactivate(); wefax_choice_tx_zoom->deactivate(); wefax_btn_tx_clear->deactivate(); } } //void wefax_pic::create_wefax_tx_viewer(int pos_x, int pos_y,int win_wid, int hei_win) void create_wefax_tx_viewer(int pos_x, int pos_y,int win_wid, int hei_win) { ENSURE_THREAD(FLMAIN_TID); int wid_btn_margin = 5 ; Fl_Double_Window * tmpWin = new Fl_Double_Window(win_wid, hei_win, _("Send image")); wefax_pic_tx_win = tmpWin; wefax_pic_tx_win->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); wefax_pic_tx_win->begin(); wefax_pic_tx_scroll = new Fl_Scroll( 1, 1, win_wid-2, hei_win - 23 ); wefax_pic_tx_scroll->type(Fl_Scroll::HORIZONTAL | Fl_Scroll::VERTICAL); wefax_pic_tx_scroll->color( fl_rgb_color( 255, 255, 255), progdefaults.RxTxSelectcolor); wefax_pic_tx_scroll->box(FL_ENGRAVED_FRAME); wefax_pic_tx_scroll->begin(); /// It will be resized immediately when an image is loaded. wefax_pic_tx_wefax_map = new wefax_map_scroll( 0,0,0,0); wefax_pic_tx_wefax_map->align(FL_ALIGN_TOP); wefax_pic_tx_wefax_map->set_zoom( all_zooms[ idx_default_zoom ].m_value ); wefax_pic_tx_scroll->end(); wefax_pic_tx_win->resizable( wefax_pic_tx_scroll ); wefax_pic_tx_box = new wefax_picbox( wefax_pic_tx_scroll->x(), wefax_pic_tx_scroll->y(), wefax_pic_tx_scroll->w(), wefax_pic_tx_scroll->h(), _("Loads an image file\nSupported types: PNG, JPEG, BMP")); wefax_pic_tx_box->labelfont(FL_HELVETICA_ITALIC); static const int last_margin = 21 ; static const int y_btn = hei_win - last_margin ; static const int hei_tx_btn = 20 ; Fl_Group * tmpGroup = new Fl_Group( 0, y_btn, extra_win_wid, last_margin ); tmpGroup->begin(); int width_btn = 30; int width_offset = 30; width_btn = 50 ; wefax_choice_tx_lpm = make_lpm_choice( width_offset, y_btn, width_btn, hei_tx_btn ); width_offset += width_btn + wid_btn_margin ; width_btn = 55 ; wefax_btn_tx_send_color = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, "Tx Color"); wefax_btn_tx_send_color->callback(wefax_cb_pic_tx_send_color, 0); wefax_btn_tx_send_color->tooltip(_("Starts transmit in color mode")); width_offset += width_btn + wid_btn_margin ; width_btn = 45 ; wefax_btn_tx_send_grey = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, "Tx B/W"); wefax_btn_tx_send_grey->callback( wefax_cb_pic_tx_send_grey, 0); wefax_btn_tx_send_grey->tooltip(_("Starts transmit in gray level mode")); width_offset += width_btn + wid_btn_margin ; width_btn = 55 ; wefax_btn_tx_load = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, _("Load...")); wefax_btn_tx_load->callback(wefax_cb_pic_tx_load, 0); wefax_btn_tx_load->tooltip(_("Load image to send")); width_offset += width_btn + wid_btn_margin + 40 ; width_btn = 58 ; wefax_choice_tx_zoom = wefax_create_zoom( width_offset, y_btn, width_btn, hei_tx_btn ); width_offset += width_btn + wid_btn_margin ; width_btn = 45 ; wefax_btn_tx_clear = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, _("Clear")); wefax_btn_tx_clear->callback(wefax_cb_pic_tx_clear, 0); wefax_btn_tx_clear->tooltip(_("Clear image to transmit")); width_offset += width_btn + wid_btn_margin ; width_btn = 45 ; wefax_btn_tx_close = new Fl_Button(width_offset, y_btn, width_btn, hei_tx_btn, _("Close")); wefax_btn_tx_close->callback(wefax_cb_pic_tx_close, 0); wefax_btn_tx_close->tooltip(_("Close transmit window")); wefax_out_tx_row_num = new Fl_Output(20, y_btn, 50, hei_tx_btn ); wefax_out_tx_row_num->align(FL_ALIGN_LEFT); wefax_out_tx_row_num->tooltip(_("Fax line number being sent.")); wefax_out_tx_col_num = new Fl_Output(80, y_btn, 50, hei_tx_btn, "x" ); wefax_out_tx_col_num->align(FL_ALIGN_LEFT); wefax_out_tx_col_num->tooltip(_("Fax column number.")); wefax_btn_tx_send_abort = new Fl_Button(180, y_btn, 100, hei_tx_btn, _("Abort Transmit") ); wefax_btn_tx_send_abort->callback(wefax_cb_pic_tx_send_abort, 0); wefax_btn_tx_send_abort->tooltip(_("Abort transmission")); wefax_out_tx_row_num->hide(); wefax_out_tx_col_num->hide(); wefax_btn_tx_send_abort->hide(); wefax_btn_tx_send_color->deactivate(); wefax_btn_tx_send_grey->deactivate(); wefax_choice_tx_zoom->deactivate(); wefax_btn_tx_clear->deactivate(); tmpGroup->end(); wefax_pic_tx_win->end(); wefax_pic_rx_win->init_sizes(); wefax_pic_rx_win->redraw(); } void wefax_pic::abort_tx_viewer(void) { wefax_cb_pic_tx_send_abort(NULL,NULL); wefax_cb_pic_tx_close(NULL,NULL); } void wefax_pic::tx_viewer_resize(int the_width, int the_height) { ENSURE_THREAD(FLMAIN_TID); LOG_DEBUG("the_width=%d the_height=%d", the_width, the_height ); int win_width = the_width < 288 ? 290 : the_width + 4; int win_height = the_height < 180 ? 180 : the_height + 30; int pic_x = (win_width - the_width) / 2; int pic_y = (win_height - 30 - the_height)/2; /// This because it is a wefax_map_scroll object. wefax_pic_tx_wefax_map->wefax_map::resize(pic_x, pic_y, the_width, the_height); wefax_pic_tx_wefax_map->clear(); wefax_pic_tx_box->size(win_width, win_height); } /// TODO: This crashes but should be called. void wefax_pic::delete_tx_viewer() { ENSURE_THREAD(FLMAIN_TID); wefax_pic_tx_win->hide(); wefax_serviceme = 0; /// First delete the Fl_Widget. delete wefax_pic_tx_win; wefax_pic_tx_win = 0; delete [] wefax_xmtimg; wefax_xmtimg = 0; } /// TODO: This crashes. void wefax_pic::delete_rx_viewer() { ENSURE_THREAD(FLMAIN_TID); wefax_pic_rx_win->hide(); wefax_serviceme = 0; /// These objects are deleted with the main window. wefax_pic_tx_win = 0; wefax_pic_rx_win = 0; } void wefax_pic::setwefax_map_link(wefax *me) { wefax_serviceme = me; } /// Called by the main menu bar to open explicitely a wefax transmission window. void wefax_pic::cb_mnu_pic_viewer_tx(Fl_Menu_ *, void * ) { if ( ! wefax_pic_tx_win) { LOG_ERROR("wefax_tx_win should be created"); return ; } progdefaults.WEFAX_HideTx = ! progdefaults.WEFAX_HideTx ; wefax_pic_show_tx(); } /// Called from XML-RPC thread. void wefax_pic::send_image( const std::string & fil_nam ) { LOG_VERBOSE("Sending %s", fil_nam.c_str() ); /// Here, transmit_lock_acquire is called by the XML-RPC client. std::string err_msg = wefax_load_image_after_acquire( fil_nam.c_str() ); if( ! err_msg.empty() ) { if (wefax_serviceme == active_modem) { /// Allows another XML-RPC client or the GUI to send an image. wefax_serviceme->transmit_lock_release( err_msg ); } return ; } wefax_cb_pic_tx_send_grey( NULL, NULL ); LOG_VERBOSE("Sent %s", fil_nam.c_str() ); } /// This function is called at two places: // - When creating the main window. // - When initializing the fax modem. void wefax_pic::create_both(bool called_from_fl_digi) { return; if( wefax_pic_rx_win ) return ; ENSURE_THREAD(FLMAIN_TID); // Fl_Window *temp = new Fl_Window(0,0,400,400); // wefax_pic_rx_wefax_map = new wefax_map_scroll(0, 0, 400, 200); // wefax_pic_rx_wefax_map->align(FL_ALIGN_TOP); // wefax_pic_rx_wefax_map->set_zoom( all_zooms[ idx_default_zoom ].m_value ); // temp->end(); } fldigi-4.2.05/src/widgets/0000775000175000017500000000000014611714005012277 500000000000000fldigi-4.2.05/src/widgets/Fl_Text_Display_mod.cxx0000664000175000017500000037426414611711171016655 00000000000000// // "$Id: Fl_Text_Display_mod.cxx 8808 2011-06-16 13:31:25Z manolo $" // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include #include #include #include #include #include #include "Fl_Text_Buffer_mod.H" #include "Fl_Text_Display_mod.H" #undef min #undef max // Text area margins. Left & right margins should be at least 3 so that // there is some room for the overhanging parts of the cursor! const int Fl_Text_Display_mod::DEFAULT_TOP_MARGIN = 1; const int Fl_Text_Display_mod::DEFAULT_BOTTOM_MARGIN = 1; const int Fl_Text_Display_mod::DEFAULT_LEFT_MARGIN = 3; const int Fl_Text_Display_mod::DEFAULT_RIGHT_MARGIN = 3; //#define TOP_MARGIN 1 //#define BOTTOM_MARGIN 1 //#define LEFT_MARGIN 3 //#define RIGHT_MARGIN 3 #define NO_HINT -1 /* Masks for text drawing methods. These are or'd together to form an integer which describes what drawing calls to use to draw a string */ #define FILL_MASK 0x0100 #define SECONDARY_MASK 0x0200 #define PRIMARY_MASK 0x0400 #define HIGHLIGHT_MASK 0x0800 #define BG_ONLY_MASK 0x1000 #define TEXT_ONLY_MASK 0x2000 #define STYLE_LOOKUP_MASK 0xff /* Maximum displayable line length (how many characters will fit across the widest window). This amount of memory is temporarily allocated from the stack in the draw_vline() method for drawing strings */ #define MAX_DISP_LINE_LEN 1000 static int max( int i1, int i2 ); static int min( int i1, int i2 ); static int countlines( const char *string ); /* The variables below are used in a timer event to allow smooth scrolling of the text area when the pointer has left the area. */ static int scroll_direction = 0; static int scroll_amount = 0; static int scroll_y = 0; static int scroll_x = 0; // CET - FIXME #define TMPFONTWIDTH 6 /** \brief Creates a new text display widget. \param X, Y, W, H position and size of widget \param l label text, defaults to none */ Fl_Text_Display_mod::Fl_Text_Display_mod(int X, int Y, int W, int H, const char* l) : Fl_Group(X, Y, W, H, l) { //int i; TOP_MARGIN = DEFAULT_TOP_MARGIN; BOTTOM_MARGIN = DEFAULT_BOTTOM_MARGIN; LEFT_MARGIN = DEFAULT_LEFT_MARGIN; RIGHT_MARGIN = DEFAULT_RIGHT_MARGIN; mMaxsize = 0; damage_range1_start = damage_range1_end = -1; damage_range2_start = damage_range2_end = -1; dragPos = dragging = 0; dragType = DRAG_CHAR; display_insert_position_hint = 0; shortcut_ = 0; color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR); box(FL_DOWN_BOX); textsize(FL_NORMAL_SIZE); textcolor(FL_FOREGROUND_COLOR); textfont(FL_HELVETICA); set_flag(SHORTCUT_LABEL); text_area.x = 0; text_area.y = 0; text_area.w = 0; text_area.h = 0; mVScrollBar = new Fl_Scrollbar(0,0,1,1); mVScrollBar->callback((Fl_Callback*)v_scrollbar_cb, this); mHScrollBar = new Fl_Scrollbar(0,0,1,1); mHScrollBar->callback((Fl_Callback*)h_scrollbar_cb, this); mHScrollBar->type(FL_HORIZONTAL); end(); scrollbar_width(Fl::scrollbar_size()); scrollbar_align(FL_ALIGN_BOTTOM_RIGHT); mCursorOn = 0; mCursorPos = 0; mCursorOldY = -100; mCursorToHint = NO_HINT; mCursorStyle = NORMAL_CURSOR; mCursorPreferredXPos = -1; mBuffer = 0; mFirstChar = 0; mLastChar = 0; mNBufferLines = 0; mTopLineNum = mTopLineNumHint = 1; mAbsTopLineNum = 1; mNeedAbsTopLineNum = 0; mHorizOffset = mHorizOffsetHint = 0; mCursor_color = FL_FOREGROUND_COLOR; mStyleBuffer = 0; mStyleTable = 0; mNStyles = 0; mNVisibleLines = 1; mLineStarts = new int[mNVisibleLines]; mLineStarts[0] = 0; // for loop will never "fire" due to nVisibleLines, i = 1 // for (i=1; iremove_modify_callback(buffer_modified_cb, this); // mBuffer->remove_predelete_callback(buffer_predelete_cb, this); // } if (mLineStarts) delete[] mLineStarts; } /** Attach a text buffer to display, replacing the current buffer (if any) \param buf attach this text buffer */ void Fl_Text_Display_mod::buffer( Fl_Text_Buffer_mod *buf ) { /* If the text display is already displaying a buffer, clear it off of the display and remove our callback from it */ if ( buf == mBuffer) return; if ( mBuffer != 0 ) { // we must provide a copy of the buffer that we are deleting! char *deletedText = mBuffer->text(); buffer_modified_cb( 0, 0, mBuffer->length(), 0, deletedText, this ); free(deletedText); mNBufferLines = 0; mBuffer->remove_modify_callback( buffer_modified_cb, this ); mBuffer->remove_predelete_callback( buffer_predelete_cb, this ); } /* Add the buffer to the display, and attach a callback to the buffer for receiving modification information when the buffer contents change */ mBuffer = buf; if (mBuffer) { mBuffer->add_modify_callback( buffer_modified_cb, this ); mBuffer->add_predelete_callback( buffer_predelete_cb, this ); /* Update the display */ buffer_modified_cb( 0, buf->length(), 0, 0, 0, this ); } /* Resize the widget to update the screen... */ resize(x(), y(), w(), h()); } /** \brief Attach (or remove) highlight information in text display and redisplay. Highlighting information consists of a style buffer which parallels the normal text buffer, but codes font and color information for the display; a style table which translates style buffer codes (indexed by buffer character - 'A') into fonts and colors; and a callback mechanism for as-needed highlighting, triggered by a style buffer entry of "unfinishedStyle". Style buffer can trigger additional redisplay during a normal buffer modification if the buffer contains a primary Fl_Text_Selection (see extendRangeForStyleMods for more information on this protocol). Style buffers, tables and their associated memory are managed by the caller. Styles are ranged from 65 ('A') to 126. \param styleBuffer this buffer works in parallel to the text buffer. For every character in the text buffer, the stye buffer has a byte at the same offset that contains an index into an array of possible styles. \param styleTable a list of styles indexed by the style buffer \param nStyles number of styles in the style table \param unfinishedStyle if this style is found, the callback below is called \param unfinishedHighlightCB if a character with an unfinished style is found, this callback will be called \param cbArg and optional argument for the callback above, usually a pointer to the Text Display. */ void Fl_Text_Display_mod::highlight_data(Fl_Text_Buffer_mod *styleBuffer, const Style_Table_Entry *styleTable, int nStyles, char unfinishedStyle, Unfinished_Style_Cb unfinishedHighlightCB, void *cbArg ) { mStyleBuffer = styleBuffer; mStyleTable = styleTable; mNStyles = nStyles; mUnfinishedStyle = unfinishedStyle; mUnfinishedHighlightCB = unfinishedHighlightCB; mHighlightCBArg = cbArg; mColumnScale = 0; mStyleBuffer->canUndo(0); damage(FL_DAMAGE_EXPOSE); } /** \brief Find the longest line of all visible lines. \return the width of the longest visible line in pixels */ int Fl_Text_Display_mod::longest_vline() const { int longest = 0; for (int i = 0; i < mNVisibleLines; i++) longest = max(longest, measure_vline(i)); return longest; } /** \brief Change the size of the displayed text area. Calling this function will trigger a recalculation of all lines visible and of all scrollbar sizes. \param X, Y, W, H new position and size of this widget */ void Fl_Text_Display_mod::resize(int X, int Y, int W, int H) { #ifdef DEBUG printf("Fl_Text_Display_mod::resize(X=%d, Y=%d, W=%d, H=%d)\n", X, Y, W, H); #endif // DEBUG const int oldWidth = w(); #ifdef DEBUG printf(" oldWidth=%d, mContinuousWrap=%d, mWrapMargin=%d\n", oldWidth, mContinuousWrap, mWrapMarginPix); #endif // DEBUG Fl_Widget::resize(X,Y,W,H); if (!buffer()) return; X += Fl::box_dx(box()); Y += Fl::box_dy(box()); W -= Fl::box_dw(box()); H -= Fl::box_dh(box()); text_area.x = X+LEFT_MARGIN; text_area.y = Y+TOP_MARGIN; text_area.w = W-LEFT_MARGIN-RIGHT_MARGIN; text_area.h = H-TOP_MARGIN-BOTTOM_MARGIN; int i; /* Find the new maximum font height for this text display */ for (i = 0, mMaxsize = fl_height(textfont(), textsize()); i < mNStyles; i++) mMaxsize = max(mMaxsize, fl_height(mStyleTable[i].font, mStyleTable[i].size)); // did we have scrollbars initially? unsigned int hscrollbarvisible = mHScrollBar->visible(); unsigned int vscrollbarvisible = mVScrollBar->visible(); // try without scrollbars first mVScrollBar->clear_visible(); mHScrollBar->clear_visible(); for (int again = 1; again;) { again = 0; /* In continuous wrap mode, a change in width affects the total number of lines in the buffer, and can leave the top line number incorrect, and the top character no longer pointing at a valid line start */ if (!mFastDisplay && mContinuousWrap && !mWrapMarginPix && W!=oldWidth) { int oldFirstChar = mFirstChar; mNBufferLines = count_lines(0, buffer()->length(), true); mFirstChar = line_start(mFirstChar); mTopLineNum = count_lines(0, mFirstChar, true)+1; absolute_top_line_number(oldFirstChar); #ifdef DEBUG printf(" mNBufferLines=%d\n", mNBufferLines); #endif // DEBUG } /* reallocate and update the line starts array, which may have changed size and / or contents. */ int nvlines = (text_area.h + mMaxsize - 1) / mMaxsize; if (nvlines < 1) nvlines = 1; if (mNVisibleLines != nvlines) { mNVisibleLines = nvlines; if (mLineStarts) delete[] mLineStarts; mLineStarts = new int [mNVisibleLines]; } calc_line_starts(0, mNVisibleLines); calc_last_char(); // figure the scrollbars if (scrollbar_width()) { /* Decide if the vertical scrollbar needs to be visible */ // always display vertical scroll bar // if (scrollbar_align() & (FL_ALIGN_LEFT|FL_ALIGN_RIGHT) && // mNBufferLines >= mNVisibleLines - 1) { mVScrollBar->set_visible(); if (scrollbar_align() & FL_ALIGN_LEFT) { text_area.x = X+scrollbar_width()+LEFT_MARGIN; text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN; mVScrollBar->resize(X, text_area.y-TOP_MARGIN, scrollbar_width(), text_area.h+TOP_MARGIN+BOTTOM_MARGIN); } else { text_area.x = X+LEFT_MARGIN; text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN; mVScrollBar->resize(X+W-scrollbar_width(), text_area.y-TOP_MARGIN, scrollbar_width(), text_area.h+TOP_MARGIN+BOTTOM_MARGIN); } } /* Decide if the horizontal scrollbar needs to be visible. If there is a vertical scrollbar, a horizontal is always created too. This is because the alternatives are unattractive: * Dynamically creating a horizontal scrollbar based on the currently visible lines is what the original nedit does, but it always wastes space for the scrollbar even when it's not used. Since the FLTK widget dynamically allocates the space for the scrollbar and rearranges the widget to make room for it, this would create a very visually displeasing "bounce" effect when the vertical scrollbar is dragged. Trust me, I tried it and it looks really bad. * The other alternative would be to keep track of what the longest line in the entire buffer is and base the scrollbar on that. I didn't do this because I didn't see any easy way to do that using the nedit code and this could involve a lengthy calculation for large buffers. If an efficient and non-costly way of doing this can be found, this might be a way to go. */ /* WAS: Suggestion: Try turning the horizontal scrollbar on when you first see a line that is too wide in the window, but then don't turn it off (ie mix both of your solutions). */ if (!mFastDisplay && !mContinuousWrap && scrollbar_align() & (FL_ALIGN_TOP|FL_ALIGN_BOTTOM) && (mVScrollBar->visible() || longest_vline() > text_area.w)) { if (!mHScrollBar->visible()) { mHScrollBar->set_visible(); again = 1; // loop again to see if we now need vert. & recalc sizes } if (scrollbar_align() & FL_ALIGN_TOP) { text_area.y = Y + scrollbar_width()+TOP_MARGIN; text_area.h = H - scrollbar_width()-TOP_MARGIN-BOTTOM_MARGIN; mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y, text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width()); } else { text_area.y = Y+TOP_MARGIN; text_area.h = H - scrollbar_width()-TOP_MARGIN-BOTTOM_MARGIN; mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y+H-scrollbar_width(), text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width()); } } } } // user request to change viewport if (mTopLineNumHint != mTopLineNum || mHorizOffsetHint != mHorizOffset) scroll_(mTopLineNumHint, mHorizOffsetHint); // everything will fit in the viewport if (mNBufferLines < mNVisibleLines || mBuffer == NULL || mBuffer->length() == 0) { scroll_(1, mHorizOffset); /* if empty lines become visible, there may be an opportunity to display more text by scrolling down */ } else { while ( mNVisibleLines>=2 && (mLineStarts[mNVisibleLines-2]==-1) && scroll_(mTopLineNum-1, mHorizOffset)) { } } // user request to display insert position if (display_insert_position_hint) display_insert(); // in case horizontal offset is now greater than longest line int maxhoffset = max(0, longest_vline()-text_area.w); if (mHorizOffset > maxhoffset) scroll_(mTopLineNumHint, maxhoffset); mTopLineNumHint = mTopLineNum; mHorizOffsetHint = mHorizOffset; display_insert_position_hint = 0; if ((!mFastDisplay && mContinuousWrap) || hscrollbarvisible != mHScrollBar->visible() || vscrollbarvisible != mVScrollBar->visible()) redraw(); update_v_scrollbar(); update_h_scrollbar(); } /** \brief Refresh a rectangle of the text display. \param left, top are in coordinates of the text drawing window. \param width, height size in pixels */ void Fl_Text_Display_mod::draw_text( int left, int top, int width, int height ) { int fontHeight, firstLine, lastLine, line; /* find the line number range of the display */ fontHeight = mMaxsize ? mMaxsize : textsize_; firstLine = ( top - text_area.y - fontHeight + 1 ) / fontHeight; lastLine = ( top + height - text_area.y ) / fontHeight + 1; fl_push_clip( left, top, width, height ); /* draw the lines */ for ( line = firstLine; line <= lastLine; line++ ) draw_vline( line, left, left + width, 0, INT_MAX ); /* draw the line numbers if exposed area includes them */ if (mLineNumWidth != 0 && left <= mLineNumLeft + mLineNumWidth) draw_line_numbers(false); fl_pop_clip(); } /** \brief Marks text from start to end as needing a redraw. This function will trigger a damage event and later a redraw of parts of the widget. \param startpos index of first character needing redraw \param endpos index after last character needing redraw */ void Fl_Text_Display_mod::redisplay_range(int startpos, int endpos) { IS_UTF8_ALIGNED2(buffer(), startpos) IS_UTF8_ALIGNED2(buffer(), endpos) if (damage_range1_start == -1 && damage_range1_end == -1) { damage_range1_start = startpos; damage_range1_end = endpos; } else if ((startpos >= damage_range1_start && startpos <= damage_range1_end) || (endpos >= damage_range1_start && endpos <= damage_range1_end)) { damage_range1_start = min(damage_range1_start, startpos); damage_range1_end = max(damage_range1_end, endpos); } else if (damage_range2_start == -1 && damage_range2_end == -1) { damage_range2_start = startpos; damage_range2_end = endpos; } else { damage_range2_start = min(damage_range2_start, startpos); damage_range2_end = max(damage_range2_end, endpos); } damage(FL_DAMAGE_SCROLL); } /** \brief Draw a range of text. Refresh all of the text between buffer positions \p startpos and \p endpos not including the character at the position \p endpos. If \p endpos points beyond the end of the buffer, refresh the whole display after \p startpos, including blank lines which are not technically part of any range of characters. \param startpos index of first character to draw \param endpos index after last character to draw */ void Fl_Text_Display_mod::draw_range(int startpos, int endpos) { startpos = buffer()->utf8_align(startpos); endpos = buffer()->utf8_align(endpos); int i, startLine, lastLine, startIndex, endIndex; /* If the range is outside of the displayed text, just return */ if ( endpos < mFirstChar || ( startpos > mLastChar && !empty_vlines() ) ) return; /* Clean up the starting and ending values */ if ( startpos < 0 ) startpos = 0; if ( startpos > mBuffer->length() ) startpos = mBuffer->length(); if ( endpos < 0 ) endpos = 0; if ( endpos > mBuffer->length() ) endpos = mBuffer->length(); /* Get the starting and ending lines */ if ( startpos < mFirstChar ) startpos = mFirstChar; if ( !position_to_line( startpos, &startLine ) ) startLine = mNVisibleLines - 1; if ( endpos >= mLastChar ) { lastLine = mNVisibleLines - 1; } else { if ( !position_to_line( endpos, &lastLine ) ) { /* shouldn't happen */ lastLine = mNVisibleLines - 1; } } /* Get the starting and ending positions within the lines */ startIndex = mLineStarts[ startLine ] == -1 ? 0 : startpos - mLineStarts[ startLine ]; if ( endpos >= mLastChar ) endIndex = INT_MAX; else if ( mLineStarts[ lastLine ] == -1 ) endIndex = 0; else endIndex = endpos - mLineStarts[ lastLine ]; /* If the starting and ending lines are the same, redisplay the single line between "start" and "end" */ if ( startLine == lastLine ) { draw_vline( startLine, 0, INT_MAX, startIndex, endIndex ); return; } /* Redisplay the first line from "start" */ draw_vline( startLine, 0, INT_MAX, startIndex, INT_MAX ); /* Redisplay the lines in between at their full width */ for ( i = startLine + 1; i < lastLine; i++ ) draw_vline( i, 0, INT_MAX, 0, INT_MAX ); /* Redisplay the last line to "end" */ draw_vline( lastLine, 0, INT_MAX, 0, endIndex ); } /** \brief Sets the position of the text insertion cursor for text display. Move the insertion cursor in front of the character at \p newPos. This function may trigger a redraw. \param newPos new caret position */ void Fl_Text_Display_mod::insert_position( int newPos ) { IS_UTF8_ALIGNED2(buffer(), newPos) /* make sure new position is ok, do nothing if it hasn't changed */ if ( newPos == mCursorPos ) return; if ( newPos < 0 ) newPos = 0; if ( newPos > mBuffer->length() ) newPos = mBuffer->length(); /* cursor movement cancels vertical cursor motion column */ mCursorPreferredXPos = -1; /* erase the cursor at its previous position */ redisplay_range(buffer()->prev_char_clipped(mCursorPos), buffer()->next_char(mCursorPos)); mCursorPos = newPos; /* draw cursor at its new position */ redisplay_range(buffer()->prev_char_clipped(mCursorPos), buffer()->next_char(mCursorPos)); } /** \brief Shows the text cursor. This function may trigger a redraw. \param b show(1) or hide(0) the text cursor (caret). */ void Fl_Text_Display_mod::show_cursor(int b) { mCursorOn = b; redisplay_range(buffer()->prev_char_clipped(mCursorPos), buffer()->next_char(mCursorPos)); } /** \brief Sets the text cursor style. Sets the text cursor style to one of the following: \li Fl_Text_Display_mod::NORMAL_CURSOR - Shows an I beam. \li Fl_Text_Display_mod::CARET_CURSOR - Shows a caret under the text. \li Fl_Text_Display_mod::DIM_CURSOR - Shows a dimmed I beam. \li Fl_Text_Display_mod::BLOCK_CURSOR - Shows an unfilled box around the current character. \li Fl_Text_Display_mod::HEAVY_CURSOR - Shows a thick I beam. This call also switches the cursor on and may trigger a redraw. \param style new cursor style */ void Fl_Text_Display_mod::cursor_style(int style) { mCursorStyle = style; if (mCursorOn) show_cursor(); } /** \brief Set the new text wrap mode. If \p wrap mode is not zero, this call enables automatic word wrapping at column \p wrapMargin. Word-wrapping does not change the text buffer itself, only the way the text is displayed. Different Text Displays can have different wrap modes, even if they share the same Text Buffer. \param wrap new wrap mode is WRAP_NONE (don't wrap text at all), WRAP_AT_COLUMN (wrap text at the given text column), WRAP_AT_PIXEL (wrap text at a pixel position), or WRAP_AT_BOUNDS (wrap text so that it fits into the widget width) \param wrapMargin in WRAP_AT_COLUMN mode, text will wrap at the n'th character. For variable width fonts, an average character width is calculated. The column width is calculated using the current textfont or the first style when this function is called. If the font size changes, this function must be called again. In WRAP_AT_PIXEL mode, this is the pixel position. \todo we need new wrap modes to wrap at the window edge and based on pixel width or average character width. */ void Fl_Text_Display_mod::wrap_mode(int wrap, int wrapMargin) { switch (wrap) { case WRAP_NONE: mWrapMarginPix = 0; mContinuousWrap = 0; break; case WRAP_AT_COLUMN: default: mWrapMarginPix = int(col_to_x(wrapMargin)); mContinuousWrap = 1; break; case WRAP_AT_PIXEL: mWrapMarginPix = wrapMargin; mContinuousWrap = 1; break; case WRAP_AT_BOUNDS: mWrapMarginPix = 0; mContinuousWrap = 1; break; } if (buffer()) { /* wrapping can change the total number of lines, re-count */ mNBufferLines = count_lines(0, buffer()->length(), true); /* changing wrap margins or changing from wrapped mode to non-wrapped can leave the character at the top no longer at a line start, and/or change the line number */ mFirstChar = line_start(mFirstChar); mTopLineNum = count_lines(0, mFirstChar, true) + 1; reset_absolute_top_line_number(); /* update the line starts array */ calc_line_starts(0, mNVisibleLines); calc_last_char(); } else { // No buffer, so just clear the state info for later... mNBufferLines = 0; mFirstChar = 0; mTopLineNum = 1; mAbsTopLineNum = 0; } resize(x(), y(), w(), h()); } /** \brief Inserts "text" at the current cursor location. This has the same effect as inserting the text into the buffer using BufInsert and then moving the insert position after the newly inserted text, except that it's optimized to do less redrawing. \param text new text in UTF-8 encoding. */ void Fl_Text_Display_mod::insert(const char* text) { IS_UTF8_ALIGNED2(buffer(), mCursorPos) IS_UTF8_ALIGNED(text) int pos = mCursorPos; mCursorToHint = pos + strlen( text ); mBuffer->insert( pos, text ); mCursorToHint = NO_HINT; } /** \brief Replaces text at the current insert position. \param text new text in UTF-8 encoding \todo Unicode? Find out exactly what we do here and simplify. */ void Fl_Text_Display_mod::overstrike(const char* text) { IS_UTF8_ALIGNED2(buffer(), mCursorPos) IS_UTF8_ALIGNED(text) int startPos = mCursorPos; Fl_Text_Buffer_mod *buf = mBuffer; int lineStart = buf->line_start( startPos ); int textLen = strlen( text ); int i, p, endPos, indent, startIndent, endIndent; const char *c; unsigned int ch; char *paddedText = NULL; /* determine how many displayed character positions are covered */ startIndent = mBuffer->count_displayed_characters( lineStart, startPos ); indent = startIndent; for ( c = text; *c != '\0'; c += fl_utf8len1(*c) ) indent++; endIndent = indent; /* find which characters to remove, and if necessary generate additional padding to make up for removed control characters at the end */ indent = startIndent; for ( p = startPos; ; p=buffer()->next_char(p) ) { if ( p == buf->length() ) break; ch = buf->char_at( p ); if ( ch == '\n' ) break; indent++; if ( indent == endIndent ) { p++; break; } else if ( indent > endIndent ) { if ( ch != '\t' ) { p++; paddedText = new char [ textLen + FL_TEXT_MAX_EXP_CHAR_LEN + 1 ]; strcpy( paddedText, text ); for ( i = 0; i < indent - endIndent; i++ ) paddedText[ textLen + i ] = ' '; paddedText[ textLen + i ] = '\0'; } break; } } endPos = p; mCursorToHint = startPos + textLen; buf->replace( startPos, endPos, paddedText == NULL ? text : paddedText ); mCursorToHint = NO_HINT; if ( paddedText != NULL ) delete [] paddedText; } /** \brief Convert a character index into a pixel position. Translate a buffer text position to the XY location where the top left of the cursor would be positioned to point to that character. Returns 0 if the position is not displayed because it is \e \b vertically out of view. If the position is horizontally out of view, returns the X coordinate where the position would be if it were visible. \param pos character index \param[out] X, Y pixel position of character on screen \return 0 if character vertically out of view, X position otherwise */ int Fl_Text_Display_mod::position_to_xy( int pos, int* X, int* Y ) const { IS_UTF8_ALIGNED2(buffer(), pos) int lineStartPos, fontHeight;//, lineLen; int visLineNum; /* If position is not displayed, return false */ if (pos < mFirstChar || (pos > mLastChar && !empty_vlines())) { return 0; } /* Calculate Y coordinate */ if (!position_to_line(pos, &visLineNum)) { return 0; } if (visLineNum < 0 || visLineNum > mNBufferLines) { return 0; } fontHeight = mMaxsize; *Y = text_area.y + visLineNum * fontHeight; /* Get the text, length, and buffer position of the line. If the position is beyond the end of the buffer and should be at the first position on the first empty line, don't try to get or scan the text */ lineStartPos = mLineStarts[visLineNum]; if ( lineStartPos == -1 ) { *X = text_area.x - mHorizOffset; return 1; } // lineLen = vline_length( visLineNum ); *X = text_area.x + handle_vline(GET_WIDTH, lineStartPos, pos-lineStartPos, 0, 0, 0, 0, 0, 0) - mHorizOffset; return 1; } /** \brief Find the line and column number of position \p pos. This only works for displayed lines. If the line is not displayed, the function returns 0 (without the mLineStarts array it could turn in to very long calculation involving scanning large amounts of text in the buffer). If continuous wrap mode is on, returns the absolute line number (as opposed to the wrapped line number which is used for scrolling). \param pos character index \param[out] lineNum absolute (unwrapped) line number \param[out] column character offset to the beginning of the line \return 0 if \p pos is off screen, line number otherwise \todo a column number makes little sense in the UTF-8/variable font width environment. We will have to further define what exactly we want to return. Please check the functions that call this particular function. */ int Fl_Text_Display_mod::position_to_linecol( int pos, int* lineNum, int* column ) const { IS_UTF8_ALIGNED2(buffer(), pos) int retVal; /* In continuous wrap mode, the absolute (non-wrapped) line count is maintained separately, as needed. Only return it if we're actually keeping track of it and pos is in the displayed text */ if (!mFastDisplay && mContinuousWrap) { if (!maintaining_absolute_top_line_number() || pos < mFirstChar || pos > mLastChar) return 0; *lineNum = mAbsTopLineNum + buffer()->count_lines(mFirstChar, pos); *column = buffer()->count_displayed_characters(buffer()->line_start(pos), pos); return 1; } retVal = position_to_line( pos, lineNum ); if ( retVal ) { *column = mBuffer->count_displayed_characters( mLineStarts[ *lineNum ], pos ); *lineNum += mTopLineNum; } return retVal; } /** \brief Check if a pixel position is within the primary selection. \param X, Y pixel position to test \return 1 if position (X, Y) is inside of the primary Fl_Text_Selection */ int Fl_Text_Display_mod::in_selection( int X, int Y ) const { int pos = xy_to_position( X, Y, CHARACTER_POS ); IS_UTF8_ALIGNED2(buffer(), pos) Fl_Text_Buffer_mod *buf = mBuffer; return buf->primary_selection()->includes(pos); } /** \brief Nobody knows what this function does. Correct a column number based on an unconstrained position (as returned by TextDXYToUnconstrainedPosition) to be relative to the last actual newline in the buffer before the row and column position given, rather than the last line start created by line wrapping. This is an adapter for rectangular selections and code written before continuous wrap mode, which thinks that the unconstrained column is the number of characters from the last newline. Obviously this is time consuming, because it invloves character re-counting. \param row \param column \return something unknown \todo What does this do and how is it useful? Column numbers mean little in this context. Which functions depend on this one? \todo Unicode? */ int Fl_Text_Display_mod::wrapped_column(int row, int column) const { int lineStart, dispLineStart; if (mFastDisplay || !mContinuousWrap || row < 0 || row > mNVisibleLines) return column; dispLineStart = mLineStarts[row]; if (dispLineStart == -1) return column; lineStart = buffer()->line_start(dispLineStart); return column + buffer()->count_displayed_characters(lineStart, dispLineStart); } /** \brief Nobody knows what this function does. Correct a row number from an unconstrained position (as returned by TextDXYToUnconstrainedPosition) to a straight number of newlines from the top line of the display. Because rectangular selections are based on newlines, rather than display wrapping, and anywhere a rectangular selection needs a row, it needs it in terms of un-wrapped lines. \param row \return something unknown \todo What does this do and how is it useful? Column numbers mean little in this context. Which functions depend on this one? */ int Fl_Text_Display_mod::wrapped_row(int row) const { if (mFastDisplay || !mContinuousWrap || row < 0 || row > mNVisibleLines) return row; return buffer()->count_lines(mFirstChar, mLineStarts[row]); } /** \brief Scroll the display to bring insertion cursor into view. Note: it would be nice to be able to do this without counting lines twice (scroll_() counts them too) and/or to count from the most efficient starting point, but the efficiency of this routine is not as important to the overall performance of the text display. \todo Unicode? */ void Fl_Text_Display_mod::display_insert() { int hOffset, topLine, X, Y; hOffset = mHorizOffset; topLine = mTopLineNum; if (insert_position() < mFirstChar) { topLine -= count_lines(insert_position(), mFirstChar, false); } else if (mNVisibleLines>=2 && mLineStarts[mNVisibleLines-2] != -1) { int lastChar = line_end(mLineStarts[mNVisibleLines-2],true); if (insert_position() >= lastChar) topLine += count_lines(lastChar - (wrap_uses_character(mLastChar) ? 0 : 1), insert_position(), false); } /* Find the new setting for horizontal offset (this is a bit ungraceful). If the line is visible, just use PositionToXY to get the position to scroll to, otherwise, do the vertical scrolling first, then the horizontal */ if (!position_to_xy( mCursorPos, &X, &Y )) { scroll_(topLine, hOffset); if (!position_to_xy( mCursorPos, &X, &Y )) { #ifdef DEBUG printf ("*** display_insert/position_to_xy # GIVE UP !\n"); fflush(stdout); #endif // DEBUG return; /* Give up, it's not worth it (but why does it fail?) */ } } if (X > text_area.x + text_area.w) hOffset += X-(text_area.x + text_area.w); else if (X < text_area.x) hOffset += X-text_area.x; /* Do the scroll */ if (topLine != mTopLineNum || hOffset != mHorizOffset) scroll_(topLine, hOffset); } /** \brief Scrolls the text buffer to show the current insert position. This function triggers a complete recalculation, ending in a call to Fl_Text_Display_mod::display_insert() */ void Fl_Text_Display_mod::show_insert_position() { display_insert_position_hint = 1; resize(x(), y(), w(), h()); } /* Cursor movement functions */ /** \brief Moves the current insert position right one character. \return 1 if the cursor moved, 0 if the end of the text was reached */ int Fl_Text_Display_mod::move_right() { if ( mCursorPos >= mBuffer->length() ) return 0; int p = insert_position(); int q = buffer()->next_char(p); insert_position(q); return 1; } /** \brief Moves the current insert position left one character. \return 1 if the cursor moved, 0 if the beginning of the text was reached */ int Fl_Text_Display_mod::move_left() { if ( mCursorPos <= 0 ) return 0; int p = insert_position(); int q = buffer()->prev_char_clipped(p); insert_position(q); return 1; } /** \brief Moves the current insert position up one line. \return 1 if the cursor moved, 0 if the beginning of the text was reached */ int Fl_Text_Display_mod::move_up() { int lineStartPos, xPos, prevLineStartPos, newPos, visLineNum; /* Find the position of the start of the line. Use the line starts array if possible */ if ( position_to_line( mCursorPos, &visLineNum ) ) lineStartPos = mLineStarts[ visLineNum ]; else { lineStartPos = line_start( mCursorPos ); visLineNum = -1; } if ( lineStartPos == 0 ) return 0; /* Decide what column to move to, if there's a preferred column use that */ if (mCursorPreferredXPos >= 0) xPos = mCursorPreferredXPos; else xPos = handle_vline(GET_WIDTH, lineStartPos, mCursorPos-lineStartPos, 0, 0, 0, 0, 0, INT_MAX); /* count forward from the start of the previous line to reach the column */ if ( visLineNum != -1 && visLineNum != 0 ) prevLineStartPos = mLineStarts[ visLineNum - 1 ]; else prevLineStartPos = rewind_lines( lineStartPos, 1 ); int lineEnd = line_end(prevLineStartPos, true); newPos = handle_vline(FIND_INDEX_FROM_ZERO, prevLineStartPos, lineEnd-prevLineStartPos, 0, 0, 0, 0, 0, xPos); /* move the cursor */ insert_position( newPos ); /* if a preferred column wasn't aleady established, establish it */ mCursorPreferredXPos = xPos; return 1; } /** \brief Moves the current insert position down one line. \return 1 if the cursor moved, 0 if the beginning of the text was reached */ int Fl_Text_Display_mod::move_down() { int lineStartPos, xPos, newPos, visLineNum; if ( mCursorPos == mBuffer->length() ) return 0; if ( position_to_line( mCursorPos, &visLineNum ) ) lineStartPos = mLineStarts[ visLineNum ]; else { lineStartPos = line_start( mCursorPos ); visLineNum = -1; } if (mCursorPreferredXPos >= 0) { xPos = mCursorPreferredXPos; } else { xPos = handle_vline(GET_WIDTH, lineStartPos, mCursorPos-lineStartPos, 0, 0, 0, 0, 0, INT_MAX); } int nextLineStartPos = skip_lines( lineStartPos, 1, true ); int lineEnd = line_end(nextLineStartPos, true); newPos = handle_vline(FIND_INDEX_FROM_ZERO, nextLineStartPos, lineEnd-nextLineStartPos, 0, 0, 0, 0, 0, xPos); insert_position( newPos ); mCursorPreferredXPos = xPos; return 1; } /** \brief Count the number of lines between two positions. Same as BufCountLines, but takes into account wrapping if wrapping is turned on. If the caller knows that \p startPos is at a line start, it can pass \p startPosIsLineStart as True to make the call more efficient by avoiding the additional step of scanning back to the last newline. \param startPos index to first character \param endPos index after last character \param startPosIsLineStart avoid scanning back to the line start \return number of lines */ int Fl_Text_Display_mod::count_lines(int startPos, int endPos, bool startPosIsLineStart) const { IS_UTF8_ALIGNED2(buffer(), startPos) IS_UTF8_ALIGNED2(buffer(), endPos) int retLines, retPos, retLineStart, retLineEnd; #ifdef DEBUG printf("Fl_Text_Display_mod::count_lines(startPos=%d, endPos=%d, startPosIsLineStart=%d\n", startPos, endPos, startPosIsLineStart); #endif // DEBUG /* If we're not wrapping use simple (and more efficient) BufCountLines */ if (mFastDisplay || !mContinuousWrap) return buffer()->count_lines(startPos, endPos); wrapped_line_counter(buffer(), startPos, endPos, INT_MAX, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, &retLineEnd); #ifdef DEBUG printf(" # after WLC: retPos=%d, retLines=%d, retLineStart=%d, retLineEnd=%d\n", retPos, retLines, retLineStart, retLineEnd); #endif // DEBUG return retLines; } /** \brief Skip a number of lines forward. Same as BufCountForwardNLines, but takes into account line breaks when wrapping is turned on. If the caller knows that startPos is at a line start, it can pass "startPosIsLineStart" as True to make the call more efficient by avoiding the additional step of scanning back to the last newline. \param startPos index to starting character \param nLines number of lines to skip ahead \param startPosIsLineStart avoid scanning back to the line start \return new position as index */ int Fl_Text_Display_mod::skip_lines(int startPos, int nLines, bool startPosIsLineStart) { IS_UTF8_ALIGNED2(buffer(), startPos) int retLines, retPos, retLineStart, retLineEnd; /* if we're not wrapping use more efficient BufCountForwardNLines */ if (mFastDisplay || !mContinuousWrap) return buffer()->skip_lines(startPos, nLines); /* wrappedLineCounter can't handle the 0 lines case */ if (nLines == 0) return startPos; /* use the common line counting routine to count forward */ wrapped_line_counter(buffer(), startPos, buffer()->length(), nLines, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, &retLineEnd); IS_UTF8_ALIGNED2(buffer(), retPos) return retPos; } /** \brief Returns the end of a line. Same as BufEndOfLine, but takes into account line breaks when wrapping is turned on. If the caller knows that \p startPos is at a line start, it can pass "startPosIsLineStart" as True to make the call more efficient by avoiding the additional step of scanning back to the last newline. Note that the definition of the end of a line is less clear when continuous wrap is on. With continuous wrap off, it's just a pointer to the newline that ends the line. When it's on, it's the character beyond the last \b displayable character on the line, where a whitespace character which has been "converted" to a newline for wrapping is not considered displayable. Also note that a line can be wrapped at a non-whitespace character if the line had no whitespace. In this case, this routine returns a pointer to the start of the next line. This is also consistent with the model used by visLineLength. \param startPos index to starting character \param startPosIsLineStart avoid scanning back to the line start \return new position as index */ int Fl_Text_Display_mod::line_end(int startPos, bool startPosIsLineStart) const { IS_UTF8_ALIGNED2(buffer(), startPos) int retLines, retPos, retLineStart, retLineEnd; /* If we're not wrapping use more efficient BufEndOfLine */ if (mFastDisplay || !mContinuousWrap) return buffer()->line_end(startPos); if (startPos == buffer()->length()) return startPos; wrapped_line_counter(buffer(), startPos, buffer()->length(), 1, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, &retLineEnd); IS_UTF8_ALIGNED2(buffer(), retLineEnd) return retLineEnd; } /** \brief Return the beginning of a line. Same as BufStartOfLine, but returns the character after last wrap point rather than the last newline. \param pos index to starting character \return new position as index */ int Fl_Text_Display_mod::line_start(int pos) const { IS_UTF8_ALIGNED2(buffer(), pos) int retLines, retPos, retLineStart, retLineEnd; /* If we're not wrapping, use the more efficient BufStartOfLine */ if (mFastDisplay || !mContinuousWrap) return buffer()->line_start(pos); wrapped_line_counter(buffer(), buffer()->line_start(pos), pos, INT_MAX, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd); IS_UTF8_ALIGNED2(buffer(), retLineStart) return retLineStart; } /** \brief Skip a number of lines back. Same as BufCountBackwardNLines, but takes into account line breaks when wrapping is turned on. \param startPos index to starting character \param nLines number of lines to skip back \return new position as index */ int Fl_Text_Display_mod::rewind_lines(int startPos, int nLines) { IS_UTF8_ALIGNED2(buffer(), startPos) Fl_Text_Buffer_mod *buf = buffer(); int pos, lineStart, retLines, retPos, retLineStart, retLineEnd; /* If we're not wrapping, use the more efficient BufCountBackwardNLines */ if (mFastDisplay || !mContinuousWrap) return buf->rewind_lines(startPos, nLines); pos = startPos; for (;;) { lineStart = buf->line_start(pos); wrapped_line_counter(buf, lineStart, pos, INT_MAX, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd, false); if (retLines > nLines) return skip_lines(lineStart, retLines-nLines, true); nLines -= retLines; pos = lineStart - 1; if (pos < 0) return 0; nLines -= 1; } } static inline int fl_isseparator(unsigned int c) { // FIXME: this does not take UCS-4 encoding into account return c != '$' && c != '_' && (isspace(c) || ispunct(c)); } /** \brief Moves the current insert position right one word. */ void Fl_Text_Display_mod::next_word() { int pos = insert_position(); while (pos < buffer()->length() && !fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->next_char(pos); } while (pos < buffer()->length() && fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->next_char(pos); } insert_position( pos ); } /** \brief Moves the current insert position left one word. */ void Fl_Text_Display_mod::previous_word() { int pos = insert_position(); if (pos==0) return; pos = buffer()->prev_char(pos); while (pos && fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->prev_char(pos); } while (pos && !fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->prev_char(pos); } if (fl_isseparator(buffer()->char_at(pos))) { pos = buffer()->next_char(pos); } insert_position( pos ); } /** \brief This is called before any characters are deleted. Callback attached to the text buffer to receive delete information before the modifications are actually made. \param pos starting index of deletion \param nDeleted number of bytes we will delete (must be UTF-8 aligned!) \param cbArg "this" pointer for static callback function */ void Fl_Text_Display_mod::buffer_predelete_cb(int pos, int nDeleted, void *cbArg) { Fl_Text_Display_mod *textD = (Fl_Text_Display_mod *)cbArg; if (textD->mContinuousWrap && !textD->mFastDisplay) { /* Note: we must perform this measurement, even if there is not a single character deleted; the number of "deleted" lines is the number of visual lines spanned by the real line in which the modification takes place. Also, a modification of the tab distance requires the same kind of calculations in advance, even if the font width is "fixed", because when the width of the tab characters changes, the layout of the text may be completely different. */ IS_UTF8_ALIGNED2(textD->buffer(), pos) textD->measure_deleted_lines(pos, nDeleted); } else { textD->mSuppressResync = 0; /* Probably not needed, but just in case */ } } /** \brief This is called whenever the buffer is modified. Callback attached to the text buffer to receive modification information \param pos starting index of modification \param nInserted number of bytes we inserted (must be UTF-8 aligned!) \param nDeleted number of bytes deleted (must be UTF-8 aligned!) \param nRestyled ?? \param deletedText this is what was removed, must not be NULL if nDeleted is set \param cbArg "this" pointer for static callback function */ void Fl_Text_Display_mod::buffer_modified_cb( int pos, int nInserted, int nDeleted, int nRestyled, const char *deletedText, void *cbArg ) { int linesInserted, linesDeleted, startDispPos, endDispPos; Fl_Text_Display_mod *textD = ( Fl_Text_Display_mod * ) cbArg; Fl_Text_Buffer_mod *buf = textD->mBuffer; int oldFirstChar = textD->mFirstChar; int scrolled, origCursorPos = textD->mCursorPos; int wrapModStart = 0, wrapModEnd = 0; IS_UTF8_ALIGNED2(buf, pos) IS_UTF8_ALIGNED2(buf, oldFirstChar) /* buffer modification cancels vertical cursor motion column */ if ( nInserted != 0 || nDeleted != 0 ) textD->mCursorPreferredXPos = -1; /* Count the number of lines inserted and deleted, and in the case of continuous wrap mode, how much has changed */ if (textD->mContinuousWrap && !textD->mFastDisplay) { textD->find_wrap_range(deletedText, pos, nInserted, nDeleted, &wrapModStart, &wrapModEnd, &linesInserted, &linesDeleted); } else { linesInserted = nInserted == 0 ? 0 : buf->count_lines( pos, pos + nInserted ); linesDeleted = nDeleted == 0 ? 0 : countlines( deletedText ); } /* Update the line starts and mTopLineNum */ if ( nInserted != 0 || nDeleted != 0 ) { if (textD->mContinuousWrap && !textD->mFastDisplay) { textD->update_line_starts( wrapModStart, wrapModEnd-wrapModStart, nDeleted + pos-wrapModStart + (wrapModEnd-(pos+nInserted)), linesInserted, linesDeleted, &scrolled ); } else { textD->update_line_starts( pos, nInserted, nDeleted, linesInserted, linesDeleted, &scrolled ); } } else scrolled = 0; /* If we're counting non-wrapped lines as well, maintain the absolute (non-wrapped) line number of the text displayed */ if (textD->maintaining_absolute_top_line_number() && (nInserted != 0 || nDeleted != 0)) { if (deletedText && (pos + nDeleted < oldFirstChar)) textD->mAbsTopLineNum += buf->count_lines(pos, pos + nInserted) - countlines(deletedText); else if (pos < oldFirstChar) textD->reset_absolute_top_line_number(); } /* Update the line count for the whole buffer */ textD->mNBufferLines += linesInserted - linesDeleted; /* Update the cursor position */ if ( textD->mCursorToHint != NO_HINT ) { textD->mCursorPos = textD->mCursorToHint; textD->mCursorToHint = NO_HINT; } else if ( textD->mCursorPos > pos ) { if ( textD->mCursorPos < pos + nDeleted ) textD->mCursorPos = pos; else textD->mCursorPos += nInserted - nDeleted; } // refigure scrollbars & stuff textD->resize(textD->x(), textD->y(), textD->w(), textD->h()); // don't need to do anything else if not visible? if (!textD->visible_r()) return; /* If the changes caused scrolling, re-paint everything and we're done. */ if ( scrolled ) { textD->damage(FL_DAMAGE_EXPOSE); if ( textD->mStyleBuffer ) /* See comments in extendRangeForStyleMods */ textD->mStyleBuffer->primary_selection()->selected(0); return; } /* If the changes didn't cause scrolling, decide the range of characters that need to be re-painted. Also if the cursor position moved, be sure that the redisplay range covers the old cursor position so the old cursor gets erased, and erase the bits of the cursor which extend beyond the left and right edges of the text. */ startDispPos = (textD->mContinuousWrap && !textD->mFastDisplay) ? wrapModStart : pos; IS_UTF8_ALIGNED2(buf, startDispPos) if ( origCursorPos == startDispPos && textD->mCursorPos != startDispPos ) startDispPos = min( startDispPos, buf->prev_char_clipped(origCursorPos) ); IS_UTF8_ALIGNED2(buf, startDispPos) if ( linesInserted == linesDeleted ) { if ( nInserted == 0 && nDeleted == 0 ) endDispPos = pos + nRestyled; else { endDispPos = textD->mContinuousWrap ? wrapModEnd : buf->line_end( pos + nInserted ) + 1; if (textD->mContinuousWrap && !textD->mFastDisplay) endDispPos = wrapModEnd; else endDispPos = buf->next_char(buf->line_end( pos + nInserted )); // CET - FIXME if ( origCursorPos >= startDispPos && // ( origCursorPos <= endDispPos || endDispPos == buf->length() ) ) } if (linesInserted > 1) textD->draw_line_numbers(false); } else { endDispPos = buf->next_char(textD->mLastChar); // CET - FIXME if ( origCursorPos >= pos ) /* If more than one line is inserted/deleted, a line break may have been inserted or removed in between, and the line numbers may have changed. If only one line is altered, line numbers cannot be affected (the insertion or removal of a line break always results in at least two lines being redrawn). */ textD->draw_line_numbers(false); } IS_UTF8_ALIGNED2(buf, startDispPos) IS_UTF8_ALIGNED2(buf, endDispPos) /* If there is a style buffer, check if the modification caused additional changes that need to be redisplayed. (Redisplaying separately would cause double-redraw on almost every modification involving styled text). Extend the redraw range to incorporate style changes */ if ( textD->mStyleBuffer ) textD->extend_range_for_styles( &startDispPos, &endDispPos ); IS_UTF8_ALIGNED2(buf, startDispPos) IS_UTF8_ALIGNED2(buf, endDispPos) /* Redisplay computed range */ textD->redisplay_range( startDispPos, endDispPos ); } /** \brief Line numbering stuff, currently unused. In continuous wrap mode, internal line numbers are calculated after wrapping. A separate non-wrapped line count is maintained when line numbering is turned on. There is some performance cost to maintaining this line count, so normally absolute line numbers are not tracked if line numbering is off. This routine allows callers to specify that they still want this line count maintained (for use via TextDPosToLineAndCol). More specifically, this allows the line number reported in the statistics line to be calibrated in absolute lines, rather than post-wrapped lines. */ void Fl_Text_Display_mod::maintain_absolute_top_line_number(int state) { mNeedAbsTopLineNum = state; reset_absolute_top_line_number(); } /** \brief Line numbering stuff, currently unused. Returns the absolute (non-wrapped) line number of the first line displayed. Returns 0 if the absolute top line number is not being maintained. */ int Fl_Text_Display_mod::get_absolute_top_line_number() const { if (mFastDisplay || !mContinuousWrap) return mTopLineNum; if (maintaining_absolute_top_line_number()) return mAbsTopLineNum; return 0; } /** \brief Line numbering stuff, currently unused. Re-calculate absolute top line number for a change in scroll position. */ void Fl_Text_Display_mod::absolute_top_line_number(int oldFirstChar) { if (maintaining_absolute_top_line_number()) { if (mFirstChar < oldFirstChar) mAbsTopLineNum -= buffer()->count_lines(mFirstChar, oldFirstChar); else mAbsTopLineNum += buffer()->count_lines(oldFirstChar, mFirstChar); } } /** \brief Line numbering stuff, currently unused. Return true if a separate absolute top line number is being maintained (for displaying line numbers or showing in the statistics line). */ int Fl_Text_Display_mod::maintaining_absolute_top_line_number() const { return (!mFastDisplay && mContinuousWrap && (mLineNumWidth != 0 || mNeedAbsTopLineNum)); } /** \brief Line numbering stuff, probably unused. Count lines from the beginning of the buffer to reestablish the absolute (non-wrapped) top line number. If mode is not continuous wrap, or the number is not being maintained, does nothing. */ void Fl_Text_Display_mod::reset_absolute_top_line_number() { mAbsTopLineNum = 1; absolute_top_line_number(0); } /** \brief Convert a position index into a line number offset. Find the line number of position \p pos relative to the first line of displayed text. Returns 0 if the line is not displayed. \param pos ?? \param[out] lineNum ?? \return ?? \todo What does this do? */ int Fl_Text_Display_mod::position_to_line( int pos, int *lineNum ) const { IS_UTF8_ALIGNED2(buffer(), pos) int i; *lineNum = 0; if ( pos < mFirstChar ) return 0; if ( pos > mLastChar ) { if ( empty_vlines() ) { if ( mLastChar < mBuffer->length() ) { if ( !position_to_line( mLastChar, lineNum ) ) { Fl::error("Please change the text panel font / font-size.\nUse a fixed width font such as Consolas on Windows."); return 0; } return ++( *lineNum ) <= mNVisibleLines - 1; } else { position_to_line( buffer()->prev_char_clipped(mLastChar), lineNum ); return 1; } } return 0; } for ( i = mNVisibleLines - 1; i >= 0; i-- ) { if ( mLineStarts[ i ] != -1 && pos >= mLineStarts[ i ] ) { *lineNum = i; return 1; } } return 0; /* probably never be reached */ } /** Universal pixel machine. We use a single function that handles all line layout, measuring, and drawing \li draw a text range \li return the width of a text range in pixels \li return the index of a character that is at a pixel position \param[in] mode DRAW_LINE, GET_WIDTH, FIND_INDEX \param[in] lineStartPos index of first character \param[in] lineLen size of string in bytes \param[in] leftChar, rightChar \param[in] Y drawing position \param[in] bottomClip, leftClip, rightClip stop work when we reach the clipped area. rightClip is the X position that we search in FIND_INDEX. \retval DRAW_LINE index of last drawn character \retval GET_WIDTH width in pixels of text segment if we would draw it \retval FIND_INDEX index of character at given x position in window coordinates \retval FIND_INDEX_FROM_ZERO index of character at given x position without scrolling and widget offsets \todo we need to handle hidden hyphens and tabs here! \todo we handle all styles and selections \todo we must provide code to get pixel positions of the middle of a character as well */ int Fl_Text_Display_mod::handle_vline( int mode, int lineStartPos, int lineLen, int leftChar, int rightChar, int Y, int bottomClip, int leftClip, int rightClip) const { IS_UTF8_ALIGNED2(buffer(), lineStartPos) // FIXME: we need to allow two modes for FIND_INDEX: one on the edge of the // FIXME: character for selection, and one on the character center for cursors. int i, X, startX, startIndex, style, charStyle; char *lineStr; if ( lineStartPos == -1 ) { lineStr = NULL; } else { lineStr = mBuffer->text_range( lineStartPos, lineStartPos + lineLen ); } if (mode==GET_WIDTH) { X = 0; } else if (mode==FIND_INDEX_FROM_ZERO) { X = 0; mode = FIND_INDEX; } else { X = text_area.x - mHorizOffset; } startX = X; startIndex = 0; if (!lineStr) { // just clear the background if (mode==DRAW_LINE) { style = position_style(lineStartPos, lineLen, -1); draw_string( style|BG_ONLY_MASK, text_area.x, Y, text_area.x+text_area.w, lineStr, lineLen ); } if (mode==FIND_INDEX) { IS_UTF8_ALIGNED2(buffer(), lineStartPos) return lineStartPos; } return 0; } char currChar = 0, prevChar = 0; // draw the line style = position_style(lineStartPos, lineLen, 0); for (i=0; itab_distance()); int xAbs = (mode==GET_WIDTH) ? startX : startX+mHorizOffset-text_area.x; w = (((xAbs/tab)+1)*tab) - xAbs; if (mode==DRAW_LINE) draw_string( style|BG_ONLY_MASK, startX, Y, startX+w, 0, 0 ); if (mode==FIND_INDEX && startX+w>rightClip) { // find x pos inside block free(lineStr); return lineStartPos + startIndex; } } else { // draw a text segment w = int( string_width( lineStr+startIndex, i-startIndex, style ) ); if (mode==DRAW_LINE) draw_string( style, startX, Y, startX+w, lineStr+startIndex, i-startIndex ); if (mode==FIND_INDEX && startX+w>rightClip) { // find x pos inside block int di = find_x(lineStr+startIndex, i-startIndex, style, rightClip-startX); free(lineStr); IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di)) return lineStartPos + startIndex + di; } } style = charStyle; startX += w; startIndex = i; } i += len; prevChar = currChar; } int w = 0; if (currChar=='\t') { // draw a single Tab space int tab = (int)col_to_x(mBuffer->tab_distance()); int xAbs = (mode==GET_WIDTH) ? startX : startX+mHorizOffset-text_area.x; w = (((xAbs/tab)+1)*tab) - xAbs; if (mode==DRAW_LINE) draw_string( style|BG_ONLY_MASK, startX, Y, startX+w, 0, 0 ); if (mode==FIND_INDEX) { // find x pos inside block free(lineStr); return lineStartPos + startIndex + ( rightClip-startX>w ? 1 : 0 ); } } else { w = int( string_width( lineStr+startIndex, i-startIndex, style ) ); if (mode==DRAW_LINE) draw_string( style, startX, Y, startX+w, lineStr+startIndex, i-startIndex ); if (mode==FIND_INDEX) { // find x pos inside block int di = find_x(lineStr+startIndex, i-startIndex, style, rightClip-startX); free(lineStr); IS_UTF8_ALIGNED2(buffer(), (lineStartPos+startIndex+di)) return lineStartPos + startIndex + di; } } if (mode==GET_WIDTH) { free(lineStr); return startX+w; } // clear the rest of the line startX += w; style = position_style(lineStartPos, lineLen, i); if (mode==DRAW_LINE) draw_string( style|BG_ONLY_MASK, startX, Y, text_area.x+text_area.w, lineStr, lineLen ); free(lineStr); IS_UTF8_ALIGNED2(buffer(), (lineStartPos+lineLen)) return lineStartPos + lineLen; } /** \brief Find the index of the character that lies at the given x position. \param s UTF-8 text string \param len length of string \param style index into style lookup table \param x position in pixels \return index into buffer */ int Fl_Text_Display_mod::find_x(const char *s, int len, int style, int x) const { IS_UTF8_ALIGNED(s) // TODO: use binary search which may be quicker. int i = 0; while (ix) return i; i += cl; } return len; } /** \brief Draw a single line of text. Draw the text on a single line represented by \p visLineNum (the number of lines down from the top of the display), limited by \p leftClip and \p rightClip window coordinates and \p leftCharIndex and \p rightCharIndex character positions (not including the character at position \p rightCharIndex). \param visLineNum index of line in the visible line number lookup \param leftClip, rightClip pixel position of clipped area \param leftCharIndex, rightCharIndex index into line of segment that we want to draw */ void Fl_Text_Display_mod::draw_vline(int visLineNum, int leftClip, int rightClip, int leftCharIndex, int rightCharIndex) { int Y, lineStartPos, lineLen, fontHeight; // printf("draw_vline(visLineNum=%d, leftClip=%d, rightClip=%d, leftCharIndex=%d, rightCharIndex=%d)\n", // visLineNum, leftClip, rightClip, leftCharIndex, rightCharIndex); // printf("nNVisibleLines=%d\n", mNVisibleLines); /* If line is not displayed, skip it */ if ( visLineNum < 0 || visLineNum >= mNVisibleLines ) return; /* Calculate Y coordinate of the string to draw */ fontHeight = mMaxsize; Y = text_area.y + visLineNum * fontHeight; /* Get the text, length, and buffer position of the line to display */ lineStartPos = mLineStarts[ visLineNum ]; if ( lineStartPos == -1 ) { lineLen = 0; } else { lineLen = vline_length( visLineNum ); } /* Shrink the clipping range to the active display area */ leftClip = max( text_area.x, leftClip ); rightClip = min( rightClip, text_area.x + text_area.w ); handle_vline(DRAW_LINE, lineStartPos, lineLen, leftCharIndex, rightCharIndex, Y, Y+fontHeight, leftClip, rightClip); return; } /** \brief Draw a text segment in a single style. Draw a string or blank area according to parameter \p style, using the appropriate colors and drawing method for that style, with top left corner at \p X, \p Y. If style says to draw text, use \p string as source of characters, and draw \p nChars, if style is FILL, erase rectangle where text would have drawn from \p X to \p toX and from \p Y to the maximum y extent of the current font(s). \param style index into style lookup table \param X, Y drawing origin \param toX rightmost position if this is a fill operation \param string text if this is a drawing operation \param nChars number of characters to draw */ void Fl_Text_Display_mod::draw_string(int style, int X, int Y, int toX, const char *string, int nChars) const { IS_UTF8_ALIGNED(string) const Style_Table_Entry * styleRec; /* Draw blank area rather than text, if that was the request */ if ( style & FILL_MASK ) { if (style & TEXT_ONLY_MASK) return; clear_rect( style, X, Y, toX - X, mMaxsize ); return; } /* Set font, color, and gc depending on style. For normal text, GCs for normal drawing, or drawing within a Fl_Text_Selection or highlight are pre-allocated and pre-configured. For syntax highlighting, GCs are configured here, on the fly. */ Fl_Font font = textfont(); int fsize = textsize(); Fl_Color foreground = textcolor(); Fl_Color background = color(); if ( style & STYLE_LOOKUP_MASK ) { int si = (style & STYLE_LOOKUP_MASK) - 'A'; if (si < 0) si = 0; else if (si >= mNStyles) si = mNStyles - 1; styleRec = mStyleTable + si; font = styleRec->font; fsize = styleRec->size; foreground = styleRec->color; background = color(); if (style & PRIMARY_MASK) { if (Fl::focus() == (Fl_Widget*)this) { background = foreground; foreground = color(); } } else if (style & HIGHLIGHT_MASK) { if (Fl::focus() == (Fl_Widget*)this) { background = fl_color_average(color(), selection_color(), 0.5f); } } } else if (style & PRIMARY_MASK) { if (Fl::focus() == (Fl_Widget*)this) background = selection_color(); else background = fl_color_average(color(), selection_color(), 0.4f); } else if (style & HIGHLIGHT_MASK) { if (Fl::focus() == (Fl_Widget*)this) background = fl_color_average(color(), selection_color(), 0.5f); else background = fl_color_average(color(), selection_color(), 0.6f); } else { foreground = textcolor(); background = color(); } if (!(style & TEXT_ONLY_MASK)) { fl_color( background ); fl_rectf( X, Y, toX - X, mMaxsize ); } if (!(style & BG_ONLY_MASK)) { fl_color( foreground ); fl_font( font, fsize ); #if !(defined(__APPLE__) || defined(WIN32)) && USE_XFT // makes sure antialiased ÄÖÜ do not leak on line above fl_push_clip(X, Y, toX - X, mMaxsize); #endif fl_draw( string, nChars, X, Y + mMaxsize - fl_descent()); #if !(defined(__APPLE__) || defined(WIN32)) && USE_XFT fl_pop_clip(); #endif } // CET - FIXME /* If any space around the character remains unfilled (due to use of different sized fonts for highlighting), fill in above or below to erase previously drawn characters */ /* if (fs->ascent < mAscent) clear_rect( style, X, Y, toX - X, mAscent - fs->ascent); if (fs->descent < mDescent) clear_rect( style, X, Y + mAscent + fs->descent, toX - x, mDescent - fs->descent); */ /* Underline if style is secondary Fl_Text_Selection */ /* if (style & SECONDARY_MASK) XDrawLine(XtDisplay(mW), XtWindow(mW), gc, x, y + mAscent, toX - 1, Y + fs->ascent); */ } /** \brief Clear a rectangle with the appropriate background color for \p style. \param style index into style table \param X, Y, width, height size and position of background area */ void Fl_Text_Display_mod::clear_rect(int style, int X, int Y, int width, int height) const { /* A width of zero means "clear to end of window" to XClearArea */ if ( width == 0 ) return; if (style & PRIMARY_MASK) { if (Fl::focus()==(Fl_Widget*)this) { fl_color(selection_color()); } else { fl_color(fl_color_average(color(), selection_color(), 0.4f)); } } else if (style & HIGHLIGHT_MASK) { if (Fl::focus()==(Fl_Widget*)this) { fl_color(fl_color_average(color(), selection_color(), 0.5f)); } else { fl_color(fl_color_average(color(), selection_color(), 0.6f)); } } else { fl_color( color() ); } fl_rectf( X, Y, width, height ); } /** \brief Draw a cursor with top center at \p X, \p Y. \param X, Y cursor position in pixels */ void Fl_Text_Display_mod::draw_cursor( int X, int Y ) { typedef struct { int x1, y1, x2, y2; } Segment; Segment segs[ 5 ]; int left, right, cursorWidth, midY; // int fontWidth = mFontStruct->min_bounds.width, nSegs = 0; int fontWidth = TMPFONTWIDTH; // CET - FIXME int nSegs = 0; int fontHeight = mMaxsize; int bot = Y + fontHeight - 1; if ( X < text_area.x - 1 || X > text_area.x + text_area.w ) return; /* For cursors other than the block, make them around 2/3 of a character width, rounded to an even number of pixels so that X will draw an odd number centered on the stem at x. */ cursorWidth = 4; //(fontWidth/3) * 2; left = X - cursorWidth / 2; right = left + cursorWidth; /* Create segments and draw cursor */ if ( mCursorStyle == CARET_CURSOR ) { midY = bot - fontHeight / 5; segs[ 0 ].x1 = left; segs[ 0 ].y1 = bot; segs[ 0 ].x2 = X; segs[ 0 ].y2 = midY; segs[ 1 ].x1 = X; segs[ 1 ].y1 = midY; segs[ 1 ].x2 = right; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = left; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = midY - 1; segs[ 3 ].x1 = X; segs[ 3 ].y1 = midY - 1; segs[ 3 ].x2 = right; segs[ 3 ].y2 = bot; nSegs = 4; } else if ( mCursorStyle == NORMAL_CURSOR ) { segs[ 0 ].x1 = left; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = right; segs[ 0 ].y2 = Y; segs[ 1 ].x1 = X; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = X; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = left; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = right; segs[ 2 ].y2 = bot; nSegs = 3; } else if ( mCursorStyle == HEAVY_CURSOR ) { segs[ 0 ].x1 = X - 1; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = X - 1; segs[ 0 ].y2 = bot; segs[ 1 ].x1 = X; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = X; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = X + 1; segs[ 2 ].y1 = Y; segs[ 2 ].x2 = X + 1; segs[ 2 ].y2 = bot; segs[ 3 ].x1 = left; segs[ 3 ].y1 = Y; segs[ 3 ].x2 = right; segs[ 3 ].y2 = Y; segs[ 4 ].x1 = left; segs[ 4 ].y1 = bot; segs[ 4 ].x2 = right; segs[ 4 ].y2 = bot; nSegs = 5; } else if ( mCursorStyle == DIM_CURSOR ) { midY = Y + fontHeight / 2; segs[ 0 ].x1 = X; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = X; segs[ 0 ].y2 = Y; segs[ 1 ].x1 = X; segs[ 1 ].y1 = midY; segs[ 1 ].x2 = X; segs[ 1 ].y2 = midY; segs[ 2 ].x1 = X; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = bot; nSegs = 3; } else if ( mCursorStyle == BLOCK_CURSOR ) { right = X + fontWidth; segs[ 0 ].x1 = X; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = right; segs[ 0 ].y2 = Y; segs[ 1 ].x1 = right; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = right; segs[ 1 ].y2 = bot; segs[ 2 ].x1 = right; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = bot; segs[ 3 ].x1 = X; segs[ 3 ].y1 = bot; segs[ 3 ].x2 = X; segs[ 3 ].y2 = Y; nSegs = 4; } fl_color( mCursor_color ); for ( int k = 0; k < nSegs; k++ ) { fl_line( segs[ k ].x1, segs[ k ].y1, segs[ k ].x2, segs[ k ].y2 ); } } /** \brief Find the correct style for a character. Determine the drawing method to use to draw a specific character from "buf". \p lineStartPos gives the character index where the line begins, \p lineIndex, the number of characters past the beginning of the line, and \p lineIndex the number of displayed characters past the beginning of the line. Passing \p lineStartPos of -1 returns the drawing style for "no text". Why not just: position_style(pos)? Because style applies to blank areas of the window beyond the text boundaries, and because this routine must also decide whether a position is inside of a rectangular Fl_Text_Selection, and do so efficiently, without re-counting character positions from the start of the line. Note that style is a somewhat incorrect name, drawing method would be more appropriate. \param lineStartPos beginning of this line \param lineLen number of bytes in line \param lineIndex position of character within line \return style for the given character */ int Fl_Text_Display_mod::position_style( int lineStartPos, int lineLen, int lineIndex) const { IS_UTF8_ALIGNED2(buffer(), lineStartPos) Fl_Text_Buffer_mod * buf = mBuffer; Fl_Text_Buffer_mod *styleBuf = mStyleBuffer; int pos, style = 0; if ( lineStartPos == -1 || buf == NULL ) return FILL_MASK; pos = lineStartPos + min( lineIndex, lineLen ); if ( lineIndex >= lineLen ) style = FILL_MASK; else if ( styleBuf != NULL ) { style = ( unsigned char ) styleBuf->byte_at( pos ); if (style == mUnfinishedStyle && mUnfinishedHighlightCB) { /* encountered "unfinished" style, trigger parsing */ (mUnfinishedHighlightCB)( pos, mHighlightCBArg); style = (unsigned char) styleBuf->byte_at( pos); } } if (buf->primary_selection()->includes(pos)) style |= PRIMARY_MASK; if (buf->highlight_selection()->includes(pos)) style |= HIGHLIGHT_MASK; if (buf->secondary_selection()->includes(pos)) style |= SECONDARY_MASK; return style; } /** \brief Find the width of a string in the font of a particular style. \param string the text \param length number of bytes in string \param style index into style table \return width of text segment in pixels */ double Fl_Text_Display_mod::string_width( const char *string, int length, int style ) const { IS_UTF8_ALIGNED(string) Fl_Font font; Fl_Fontsize fsize; if ( mNStyles && (style & STYLE_LOOKUP_MASK) ) { int si = (style & STYLE_LOOKUP_MASK) - 'A'; if (si < 0) si = 0; else if (si >= mNStyles) si = mNStyles - 1; font = mStyleTable[si].font; fsize = mStyleTable[si].size; } else { font = textfont(); fsize = textsize(); } fl_font( font, fsize ); return fl_width( string, length ); } /** \brief Translate a pixel position into a character index. Translate window coordinates to the nearest (insert cursor or character cell) text position. The parameter \p posType specifies how to interpret the position: CURSOR_POS means translate the coordinates to the nearest cursor position, and CHARACTER_POS means return the position of the character closest to (\p X, \p Y). \param X, Y pixel position \param posType CURSOR_POS or CHARACTER_POS \return index into text buffer */ int Fl_Text_Display_mod::xy_to_position( int X, int Y, int posType ) const { int lineStart, lineLen, fontHeight; int visLineNum; /* Find the visible line number corresponding to the Y coordinate */ fontHeight = mMaxsize; visLineNum = ( Y - text_area.y ) / fontHeight; if ( visLineNum < 0 ) return mFirstChar; if ( visLineNum >= mNVisibleLines ) visLineNum = mNVisibleLines - 1; /* Find the position at the start of the line */ lineStart = mLineStarts[ visLineNum ]; /* If the line start was empty, return the last position in the buffer */ if ( lineStart == -1 ) return mBuffer->length(); /* Get the line text and its length */ lineLen = vline_length( visLineNum ); return handle_vline(FIND_INDEX, lineStart, lineLen, 0, 0, 0, 0, text_area.x, X); } /** \brief Translate pixel coordinates into row and column. Translate window coordinates to the nearest row and column number for positioning the cursor. This, of course, makes no sense when the font is proportional, since there are no absolute columns. The parameter posType specifies how to interpret the position: CURSOR_POS means translate the coordinates to the nearest position between characters, and CHARACTER_POS means translate the position to the nearest character cell. \param X, Y pixel coordinates \param[out] row, column neares row and column \param posType CURSOR_POS or CHARACTER_POS */ void Fl_Text_Display_mod::xy_to_rowcol( int X, int Y, int *row, int *column, int posType ) const { int fontHeight = mMaxsize; int fontWidth = TMPFONTWIDTH; //mFontStruct->max_bounds.width; /* Find the visible line number corresponding to the Y coordinate */ *row = ( Y - text_area.y ) / fontHeight; if ( *row < 0 ) *row = 0; if ( *row >= mNVisibleLines ) *row = mNVisibleLines - 1; *column = ( ( X - text_area.x ) + mHorizOffset + ( posType == CURSOR_POS ? fontWidth / 2 : 0 ) ) / fontWidth; if ( *column < 0 ) * column = 0; } /** \brief Offset line start counters for a new vertical scroll position. Offset the line starts array, mTopLineNum, mFirstChar and lastChar, for a new vertical scroll position given by newTopLineNum. If any currently displayed lines will still be visible, salvage the line starts values, otherwise, count lines from the nearest known line start (start or end of buffer, or the closest value in the mLineStarts array) \param newTopLineNum index into buffer */ void Fl_Text_Display_mod::offset_line_starts( int newTopLineNum ) { int oldTopLineNum = mTopLineNum; int oldFirstChar = mFirstChar; int lineDelta = newTopLineNum - oldTopLineNum; int nVisLines = mNVisibleLines; int *lineStarts = mLineStarts; int i, lastLineNum; Fl_Text_Buffer_mod *buf = mBuffer; /* If there was no offset, nothing needs to be changed */ if ( lineDelta == 0 ) return; /* Find the new value for mFirstChar by counting lines from the nearest known line start (start or end of buffer, or the closest value in the lineStarts array) */ lastLineNum = oldTopLineNum + nVisLines - 1; if ( newTopLineNum < oldTopLineNum && newTopLineNum < -lineDelta ) { mFirstChar = skip_lines( 0, newTopLineNum - 1, true ); } else if ( newTopLineNum < oldTopLineNum ) { mFirstChar = rewind_lines( mFirstChar, -lineDelta ); } else if ( newTopLineNum < lastLineNum ) { mFirstChar = lineStarts[ newTopLineNum - oldTopLineNum ]; } else if ( newTopLineNum - lastLineNum < mNBufferLines - newTopLineNum ) { mFirstChar = skip_lines( lineStarts[ nVisLines - 1 ], newTopLineNum - lastLineNum, true ); } else { mFirstChar = rewind_lines( buf->length(), mNBufferLines - newTopLineNum + 1 ); } /* Fill in the line starts array */ if ( lineDelta < 0 && -lineDelta < nVisLines ) { for ( i = nVisLines - 1; i >= -lineDelta; i-- ) lineStarts[ i ] = lineStarts[ i + lineDelta ]; calc_line_starts( 0, -lineDelta ); } else if ( lineDelta > 0 && lineDelta < nVisLines ) { for ( i = 0; i < nVisLines - lineDelta; i++ ) lineStarts[ i ] = lineStarts[ i + lineDelta ]; calc_line_starts( nVisLines - lineDelta, nVisLines - 1 ); } else calc_line_starts( 0, nVisLines ); /* Set lastChar and mTopLineNum */ calc_last_char(); mTopLineNum = newTopLineNum; /* If we're numbering lines or being asked to maintain an absolute line number, re-calculate the absolute line number */ absolute_top_line_number(oldFirstChar); } /** \brief Update line start arrays and variables. Update the line starts array, mTopLineNum, mFirstChar and lastChar for this text display after a modification to the text buffer, given by the position \p pos where the change began, and the numbers of characters and lines inserted and deleted. \param pos index into buffer of recent changes \param charsInserted number of bytes(!) inserted \param charsDeleted number of bytes(!) deleted \param linesInserted number of lines \param linesDeleted number of lines \param[out] scrolled set to 1 if the text display needs to be scrolled */ void Fl_Text_Display_mod::update_line_starts(int pos, int charsInserted, int charsDeleted, int linesInserted, int linesDeleted, int *scrolled ) { IS_UTF8_ALIGNED2(buffer(), pos) int *lineStarts = mLineStarts; int i, lineOfPos, lineOfEnd, nVisLines = mNVisibleLines; int charDelta = charsInserted - charsDeleted; int lineDelta = linesInserted - linesDeleted; /* If all of the changes were before the displayed text, the display doesn't change, just update the top line num and offset the line start entries and first and last characters */ if ( pos + charsDeleted < mFirstChar ) { mTopLineNum += lineDelta; for ( i = 0; i < nVisLines && lineStarts[i] != -1; i++ ) lineStarts[ i ] += charDelta; mFirstChar += charDelta; mLastChar += charDelta; *scrolled = 0; return; } /* The change began before the beginning of the displayed text, but part or all of the displayed text was deleted */ if ( pos < mFirstChar ) { /* If some text remains in the window, anchor on that */ if ( position_to_line( pos + charsDeleted, &lineOfEnd ) && ++lineOfEnd < nVisLines && lineStarts[ lineOfEnd ] != -1 ) { mTopLineNum = max( 1, mTopLineNum + lineDelta ); mFirstChar = rewind_lines(lineStarts[ lineOfEnd ] + charDelta, lineOfEnd ); /* Otherwise anchor on original line number and recount everything */ } else { if ( mTopLineNum > mNBufferLines + lineDelta ) { mTopLineNum = 1; mFirstChar = 0; } else mFirstChar = skip_lines( 0, mTopLineNum - 1, true ); } calc_line_starts( 0, nVisLines - 1 ); /* calculate lastChar by finding the end of the last displayed line */ calc_last_char(); *scrolled = 1; return; } /* If the change was in the middle of the displayed text (it usually is), salvage as much of the line starts array as possible by moving and offsetting the entries after the changed area, and re-counting the added lines or the lines beyond the salvaged part of the line starts array */ if ( pos <= mLastChar ) { /* find line on which the change began */ position_to_line( pos, &lineOfPos ); /* salvage line starts after the changed area */ if ( lineDelta == 0 ) { for ( i = lineOfPos + 1; i < nVisLines && lineStarts[ i ] != -1; i++ ) lineStarts[ i ] += charDelta; } else if ( lineDelta > 0 ) { for ( i = nVisLines - 1; i >= lineOfPos + lineDelta + 1; i-- ) lineStarts[ i ] = lineStarts[ i - lineDelta ] + ( lineStarts[ i - lineDelta ] == -1 ? 0 : charDelta ); } else /* (lineDelta < 0) */ { for ( i = max( 0, lineOfPos + 1 ); i < nVisLines + lineDelta; i++ ) lineStarts[ i ] = lineStarts[ i - lineDelta ] + ( lineStarts[ i - lineDelta ] == -1 ? 0 : charDelta ); } /* fill in the missing line starts */ if ( linesInserted >= 0 ) calc_line_starts( lineOfPos + 1, lineOfPos + linesInserted ); if ( lineDelta < 0 ) calc_line_starts( nVisLines + lineDelta, nVisLines ); /* calculate lastChar by finding the end of the last displayed line */ calc_last_char(); *scrolled = 0; return; } /* Change was past the end of the displayed text, but displayable by virtue of being an insert at the end of the buffer into visible blank lines */ if ( empty_vlines() ) { position_to_line( pos, &lineOfPos ); calc_line_starts( lineOfPos, lineOfPos + linesInserted ); calc_last_char(); *scrolled = 0; return; } /* Change was beyond the end of the buffer and not visible, do nothing */ *scrolled = 0; } /** \brief Update the line start arrays. Scan through the text in the "textD"'s buffer and recalculate the line starts array values beginning at index "startLine" and continuing through (including) "endLine". It assumes that the line starts entry preceding "startLine" (or mFirstChar if startLine is 0) is good, and re-counts newlines to fill in the requested entries. Out of range values for "startLine" and "endLine" are acceptable. \param startLine, endLine range of lines to scan as line numbers */ void Fl_Text_Display_mod::calc_line_starts( int startLine, int endLine ) { int startPos, bufLen = mBuffer->length(); int line, lineEnd, nextLineStart, nVis = mNVisibleLines; int *lineStarts = mLineStarts; /* Clean up (possibly) messy input parameters */ if ( endLine < 0 ) endLine = 0; if ( endLine >= nVis ) endLine = nVis - 1; if ( startLine < 0 ) startLine = 0; if ( startLine >= nVis ) startLine = nVis - 1; if ( startLine > endLine ) return; /* Find the last known good line number -> position mapping */ if ( startLine == 0 ) { lineStarts[ 0 ] = mFirstChar; startLine = 1; } startPos = lineStarts[ startLine - 1 ]; /* If the starting position is already past the end of the text, fill in -1's (means no text on line) and return */ if ( startPos == -1 ) { for ( line = startLine; line <= endLine; line++ ) lineStarts[ line ] = -1; return; } /* Loop searching for ends of lines and storing the positions of the start of the next line in lineStarts */ for ( line = startLine; line <= endLine; line++ ) { find_line_end(startPos, true, &lineEnd, &nextLineStart); startPos = nextLineStart; if ( startPos >= bufLen ) { /* If the buffer ends with a newline or line break, put buf->length() in the next line start position (instead of a -1 which is the normal marker for an empty line) to indicate that the cursor may safely be displayed there */ if ( line == 0 || ( lineStarts[ line - 1 ] != bufLen && lineEnd != nextLineStart ) ) { lineStarts[ line ] = bufLen; line++; } break; } lineStarts[ line ] = startPos; } /* Set any entries beyond the end of the text to -1 */ for ( ; line <= endLine; line++ ) lineStarts[ line ] = -1; } /** \brief Update last display character index. Given a Fl_Text_Display_mod with a complete, up-to-date lineStarts array, update the lastChar entry to point to the last buffer position displayed. */ void Fl_Text_Display_mod::calc_last_char() { int i; for (i = mNVisibleLines - 1; i >= 0 && mLineStarts[i] == -1; i--) ; mLastChar = i < 0 ? 0 : line_end(mLineStarts[i], true); } /** \brief Scrolls the current buffer to start at the specified line and column. \param topLineNum top line number \param horizOffset column number \todo Column numbers make little sense here. */ void Fl_Text_Display_mod::scroll(int topLineNum, int horizOffset) { mTopLineNumHint = topLineNum; mHorizOffsetHint = horizOffset; resize(x(), y(), w(), h()); } /** \brief Scrolls the current buffer to start at the specified line and column. \param topLineNum top line number \param horizOffset in pixels \return 0 if nothing changed, 1 if we scrolled */ int Fl_Text_Display_mod::scroll_(int topLineNum, int horizOffset) { /* Limit the requested scroll position to allowable values */ if (topLineNum > mNBufferLines + 3 - mNVisibleLines) topLineNum = mNBufferLines + 3 - mNVisibleLines; if (topLineNum < 1) topLineNum = 1; if (horizOffset > longest_vline() - text_area.w) horizOffset = longest_vline() - text_area.w; if (horizOffset < 0) horizOffset = 0; /* Do nothing if scroll position hasn't actually changed or there's no window to draw in yet */ if (mHorizOffset == horizOffset && mTopLineNum == topLineNum) return 0; /* If the vertical scroll position has changed, update the line starts array and related counters in the text display */ offset_line_starts(topLineNum); /* Just setting mHorizOffset is enough information for redisplay */ mHorizOffset = horizOffset; // redraw all text damage(FL_DAMAGE_EXPOSE); return 1; } /** \brief Update vertical scrollbar. Update the minimum, maximum, slider size, page increment, and value for vertical scrollbar. */ void Fl_Text_Display_mod::update_v_scrollbar() { /* The vertical scrollbar value and slider size directly represent the top line number, and the number of visible lines respectively. The scroll bar maximum value is chosen to generally represent the size of the whole buffer, with minor adjustments to keep the scrollbar widget happy */ #ifdef DEBUG printf("Fl_Text_Display_mod::update_v_scrollbar():\n" " mTopLineNum=%d, mNVisibleLines=%d, mNBufferLines=%d\n", mTopLineNum, mNVisibleLines, mNBufferLines); #endif // DEBUG mVScrollBar->value(mTopLineNum, mNVisibleLines, 1, mNBufferLines + 2); mVScrollBar->linesize(3); } /** \brief Update vertical scrollbar. Update the minimum, maximum, slider size, page increment, and value for the horizontal scrollbar. */ void Fl_Text_Display_mod::update_h_scrollbar() { int sliderMax = max(longest_vline(), text_area.w + mHorizOffset); mHScrollBar->value( mHorizOffset, text_area.w, 0, sliderMax ); } /** \brief Callbacks for drag or valueChanged on scrollbars. */ void Fl_Text_Display_mod::v_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display_mod* textD) { if (b->value() == textD->mTopLineNum) return; textD->scroll(b->value(), textD->mHorizOffset); } /** \brief Callbacks for drag or valueChanged on scrollbars. */ void Fl_Text_Display_mod::h_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display_mod* textD) { if (b->value() == textD->mHorizOffset) return; textD->scroll(textD->mTopLineNum, b->value()); } /** \brief Refresh the line number area. If clearAll is False, writes only over the character cell areas. Setting clearAll to True will clear out any stray marks outside of the character cell area, which might have been left from before a resize or font change. This function is not used. */ void Fl_Text_Display_mod::draw_line_numbers(bool /*clearAll*/) { #if 0 int y, line, visLine, nCols, lineStart; char lineNumString[12]; int lineHeight = mMaxsize ? mMaxsize : textsize_; int charWidth = TMPFONTWIDTH; //mFontStruct->max_bounds.width; /* Don't draw if mLineNumWidth == 0 (line numbers are hidden), or widget is not yet realized */ if (mLineNumWidth == 0 || visible_r()) return; /* GC is allocated on demand, since not everyone will use line numbering */ if (textD->lineNumGC == NULL) { XGCValues values; values.foreground = textD->lineNumFGPixel; values.background = textD->bgPixel; values.font = textD->fontStruct->fid; textD->lineNumGC = XtGetGC(textD->w, GCFont| GCForeground | GCBackground, &values); } /* Erase the previous contents of the line number area, if requested */ if (clearAll) XClearArea(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumLeft, textD->top, textD->lineNumWidth, textD->height, False); /* Draw the line numbers, aligned to the text */ nCols = min(11, textD->lineNumWidth / charWidth); y = textD->top; line = getAbsTopLineNum(textD); for (visLine=0; visLine < textD->nVisibleLines; visLine++) { lineStart = textD->lineStarts[visLine]; if (lineStart != -1 && (lineStart==0 || BufGetCharacter(textD->buffer, lineStart-1)=='\n')) { snprintf(lineNumString, sizeof(lineNumString), "%*d", nCols, line); XDrawImageString(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumGC, textD->lineNumLeft, y + textD->ascent, lineNumString, strlen(lineNumString)); line++; } else { XClearArea(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumLeft, y, textD->lineNumWidth, textD->ascent + textD->descent, False); if (visLine == 0) line++; } y += lineHeight; } #endif } static int max( int i1, int i2 ) { return i1 >= i2 ? i1 : i2; } static int min( int i1, int i2 ) { return i1 <= i2 ? i1 : i2; } /** Count the number of newlines in a null-terminated text string; */ static int countlines( const char *string ) { IS_UTF8_ALIGNED(string) const char * c; int lineCount = 0; if (!string) return 0; for ( c = string; *c != '\0'; c++ ) if ( *c == '\n' ) lineCount++; return lineCount; } /** \brief Returns the width in pixels of the displayed line pointed to by "visLineNum". \param visLineNum index into visible lines array \return width of line in pixels */ int Fl_Text_Display_mod::measure_vline( int visLineNum ) const { int lineLen = vline_length( visLineNum ); int lineStartPos = mLineStarts[ visLineNum ]; if (lineStartPos < 0 || lineLen == 0) return 0; return handle_vline(GET_WIDTH, lineStartPos, lineLen, 0, 0, 0, 0, 0, 0); } /** \brief Return true if there are lines visible with no corresponding buffer text. \return 1 if there are empty lines */ int Fl_Text_Display_mod::empty_vlines() const { return (mNVisibleLines > 0) && (mLineStarts[ mNVisibleLines - 1 ] == -1); } /** \brief Count number of bytes in a visible line. Return the length of a line (number of bytes) by examining entries in the line starts array rather than by scanning for newlines. \param visLineNum index of line in visible line array \return number of bytes in this line */ int Fl_Text_Display_mod::vline_length( int visLineNum ) const { int nextLineStart, lineStartPos; if (visLineNum < 0 || visLineNum >= mNVisibleLines) return (0); lineStartPos = mLineStarts[ visLineNum ]; if ( lineStartPos == -1 ) return 0; if ( visLineNum + 1 >= mNVisibleLines ) return mLastChar - lineStartPos; nextLineStart = mLineStarts[ visLineNum + 1 ]; if ( nextLineStart == -1 ) return mLastChar - lineStartPos; int nextLineStartMinus1 = buffer()->prev_char(nextLineStart); if (wrap_uses_character(nextLineStartMinus1)) return nextLineStartMinus1 - lineStartPos; return nextLineStart - lineStartPos; } /** \brief Wrapping calculations. When continuous wrap is on, and the user inserts or deletes characters, wrapping can happen before and beyond the changed position. This routine finds the extent of the changes, and counts the deleted and inserted lines over that range. It also attempts to minimize the size of the range to what has to be counted and re-displayed, so the results can be useful both for delimiting where the line starts need to be recalculated, and for deciding what part of the text to redisplay. \param deletedText \param pos \param nInserted \param nDeleted \param modRangeStart \param modRangeEnd \param linesInserted \param linesDeleted */ void Fl_Text_Display_mod::find_wrap_range(const char *deletedText, int pos, int nInserted, int nDeleted, int *modRangeStart, int *modRangeEnd, int *linesInserted, int *linesDeleted) { IS_UTF8_ALIGNED(deletedText) IS_UTF8_ALIGNED2(buffer(), pos) int length, retPos, retLines, retLineStart, retLineEnd; Fl_Text_Buffer_mod *deletedTextBuf, *buf = buffer(); int nVisLines = mNVisibleLines; int *lineStarts = mLineStarts; int countFrom, countTo, lineStart, adjLineStart, i; int visLineNum = 0, nLines = 0; /* ** Determine where to begin searching: either the previous newline, or ** if possible, limit to the start of the (original) previous displayed ** line, using information from the existing line starts array */ if (pos >= mFirstChar && pos <= mLastChar) { for (i=nVisLines-1; i>0; i--) { if (lineStarts[i] != -1 && pos >= lineStarts[i]) { break; } } if (i > 0) { countFrom = lineStarts[i-1]; visLineNum = i-1; } else { countFrom = buf->line_start(pos); } } else { countFrom = buf->line_start(pos); } IS_UTF8_ALIGNED2(buf, countFrom) /* ** Move forward through the (new) text one line at a time, counting ** displayed lines, and looking for either a real newline, or for the ** line starts to re-sync with the original line starts array */ lineStart = countFrom; *modRangeStart = countFrom; for (;;) { /* advance to the next line. If the line ended in a real newline or the end of the buffer, that's far enough */ wrapped_line_counter(buf, lineStart, buf->length(), 1, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd); if (retPos >= buf->length()) { countTo = buf->length(); *modRangeEnd = countTo; if (retPos != retLineEnd) nLines++; break; } else { lineStart = retPos; } nLines++; if (lineStart > pos + nInserted && buf->char_at(buf->prev_char(lineStart)) == '\n') { countTo = lineStart; *modRangeEnd = lineStart; break; } /* Don't try to resync in continuous wrap mode with non-fixed font sizes; it would result in a chicken-and-egg dependency between the calculations for the inserted and the deleted lines. If we're in that mode, the number of deleted lines is calculated in advance, without resynchronization, so we shouldn't resynchronize for the inserted lines either. */ if (mSuppressResync) continue; /* check for synchronization with the original line starts array before pos, if so, the modified range can begin later */ if (lineStart <= pos) { while (visLineNumprev_char(lineStarts[visLineNum+1])); else *modRangeStart = countFrom; } else *modRangeStart = min(*modRangeStart, buf->prev_char(lineStart)); } /* check for synchronization with the original line starts array after pos, if so, the modified range can end early */ else if (lineStart > pos + nInserted) { adjLineStart = lineStart - nInserted + nDeleted; while (visLineNumcopy(buffer(), countFrom, pos, 0); if (nDeleted != 0) deletedTextBuf->insert(pos-countFrom, deletedText); deletedTextBuf->copy(buffer(), pos+nInserted, countTo, pos-countFrom+nDeleted); /* Note that we need to take into account an offset for the style buffer: the deletedTextBuf can be out of sync with the style buffer. */ wrapped_line_counter(deletedTextBuf, 0, length, INT_MAX, true, countFrom, &retPos, &retLines, &retLineStart, &retLineEnd, false); delete deletedTextBuf; *linesDeleted = retLines; mSuppressResync = 0; } /** \brief Wrapping calculations. This is a stripped-down version of the findWrapRange() function above, intended to be used to calculate the number of "deleted" lines during a buffer modification. It is called _before_ the modification takes place. This function should only be called in continuous wrap mode with a non-fixed font width. In that case, it is impossible to calculate the number of deleted lines, because the necessary style information is no longer available _after_ the modification. In other cases, we can still perform the calculation afterwards (possibly even more efficiently). \param pos \param nDeleted */ void Fl_Text_Display_mod::measure_deleted_lines(int pos, int nDeleted) { IS_UTF8_ALIGNED2(buffer(), pos) int retPos, retLines, retLineStart, retLineEnd; Fl_Text_Buffer_mod *buf = buffer(); int nVisLines = mNVisibleLines; int *lineStarts = mLineStarts; int countFrom, lineStart; // int visLineNum = 0; int nLines = 0, i; /* ** Determine where to begin searching: either the previous newline, or ** if possible, limit to the start of the (original) previous displayed ** line, using information from the existing line starts array */ if (pos >= mFirstChar && pos <= mLastChar) { for (i=nVisLines-1; i>0; i--) if (lineStarts[i] != -1 && pos >= lineStarts[i]) break; if (i > 0) { countFrom = lineStarts[i-1]; // visLineNum = i-1; } else countFrom = buf->line_start(pos); } else countFrom = buf->line_start(pos); /* ** Move forward through the (new) text one line at a time, counting ** displayed lines, and looking for either a real newline, or for the ** line starts to re-sync with the original line starts array */ lineStart = countFrom; for (;;) { /* advance to the next line. If the line ended in a real newline or the end of the buffer, that's far enough */ wrapped_line_counter(buf, lineStart, buf->length(), 1, true, 0, &retPos, &retLines, &retLineStart, &retLineEnd); if (retPos >= buf->length()) { if (retPos != retLineEnd) nLines++; break; } else lineStart = retPos; nLines++; if (lineStart > pos + nDeleted && buf->char_at(lineStart-1) == '\n') { break; } /* Unlike in the findWrapRange() function above, we don't try to resync with the line starts, because we don't know the length of the inserted text yet, nor the updated style information. Because of that, we also shouldn't resync with the line starts after the modification either, because we must perform the calculations for the deleted and inserted lines in the same way. This can result in some unnecessary recalculation and redrawing overhead, and therefore we should only use this two-phase mode of calculation when it's really needed (continuous wrap + variable font width). */ } mNLinesDeleted = nLines; mSuppressResync = 1; } /** \brief Wrapping calculations. Count forward from startPos to either maxPos or maxLines (whichever is reached first), and return all relevant positions and line count. The provided textBuffer may differ from the actual text buffer of the widget. In that case it must be a (partial) copy of the actual text buffer and the styleBufOffset argument must indicate the starting position of the copy, to take into account the correct style information. \param buf \param startPos \param maxPos \param maxLines \param startPosIsLineStart \param styleBufOffset \param[out] retPos Position where counting ended. When counting lines, the position returned is the start of the line "maxLines" lines beyond "startPos". \param[out] retLines Number of line breaks counted \param[out] retLineStart Start of the line where counting ended \param[out] retLineEnd End position of the last line traversed \param[out] countLastLineMissingNewLine */ void Fl_Text_Display_mod::wrapped_line_counter(Fl_Text_Buffer_mod *buf, int startPos, int maxPos, int maxLines, bool startPosIsLineStart, int styleBufOffset, int *retPos, int *retLines, int *retLineStart, int *retLineEnd, bool countLastLineMissingNewLine) const { IS_UTF8_ALIGNED2(buf, startPos) IS_UTF8_ALIGNED2(buf, maxPos) int lineStart, newLineStart = 0, b, p, colNum, wrapMarginPix; int i, foundBreak; double width; int nLines = 0; unsigned int c; /* Set the wrap margin to the wrap column or the view width */ if (mWrapMarginPix != 0) { wrapMarginPix = mWrapMarginPix; } else { wrapMarginPix = text_area.w; } /* Find the start of the line if the start pos is not marked as a line start. */ if (startPosIsLineStart) lineStart = startPos; else lineStart = line_start(startPos); /* ** Loop until position exceeds maxPos or line count exceeds maxLines. ** (actually, continues beyond maxPos to end of line containing maxPos, ** in case later characters cause a word wrap back before maxPos) */ colNum = 0; width = 0; for (p=lineStart; plength(); p=buf->next_char(p)) { c = buf->char_at(p); // UCS-4 /* If the character was a newline, count the line and start over, otherwise, add it to the width and column counts */ if (c == '\n') { if (p >= maxPos) { *retPos = maxPos; *retLines = nLines; *retLineStart = lineStart; *retLineEnd = maxPos; return; } nLines++; int p1 = buf->next_char(p); if (nLines >= maxLines) { *retPos = p1; *retLines = nLines; *retLineStart = p1; *retLineEnd = p; return; } lineStart = p1; colNum = 0; width = 0; } else { const char *s = buf->address(p); colNum++; // FIXME: it is not a good idea to simply add character widths because on // some platforms, the width is a floating point value and depends on the // previous character as well. width += measure_proportional_character(s, (int)width, p+styleBufOffset); } /* If character exceeded wrap margin, find the break point and wrap there */ if (width > wrapMarginPix) { foundBreak = false; for (b=p; b>=lineStart; b=buf->prev_char(b)) { c = buf->char_at(b); if (c == '\t' || c == ' ') { newLineStart = buf->next_char(b); colNum = 0; width = 0; int iMax = buf->next_char(p); for (i=buf->next_char(b); inext_char(i)) { width += measure_proportional_character(buf->address(i), (int)width, i+styleBufOffset); colNum++; } foundBreak = true; break; } } if (!foundBreak) { /* no whitespace, just break at margin */ newLineStart = max(p, buf->next_char(lineStart)); const char *s = buf->address(b); colNum++; width = measure_proportional_character(s, 0, p+styleBufOffset); } if (p >= maxPos) { *retPos = maxPos; *retLines = maxPos < newLineStart ? nLines : nLines + 1; *retLineStart = maxPos < newLineStart ? lineStart : newLineStart; *retLineEnd = maxPos; return; } nLines++; if (nLines >= maxLines) { *retPos = foundBreak ? buf->next_char(b) : max(p, buf->next_char(lineStart)); *retLines = nLines; *retLineStart = lineStart; *retLineEnd = foundBreak ? b : p; return; } lineStart = newLineStart; } } /* reached end of buffer before reaching pos or line target */ *retPos = buf->length(); *retLines = nLines; if (countLastLineMissingNewLine && colNum > 0) *retLines = buf->next_char(*retLines); *retLineStart = lineStart; *retLineEnd = buf->length(); } /** \brief Wrapping calculations. Measure the width in pixels of the first character of string "s" at a particular column "colNum" and buffer position "pos". This is for measuring characters in proportional or mixed-width highlighting fonts. A note about proportional and mixed-width fonts: the mixed width and proportional font code in nedit does not get much use in general editing, because nedit doesn't allow per-language-mode fonts, and editing programs in a proportional font is usually a bad idea, so very few users would choose a proportional font as a default. There are still probably mixed- width syntax highlighting cases where things don't redraw properly for insertion/deletion, though static display and wrapping and resizing should now be solid because they are now used for online help display. \param s text string \param xPix x pixel position needed for calculating tab widths \param pos offset within string \return width of character in pixels */ double Fl_Text_Display_mod::measure_proportional_character(const char *s, int xPix, int pos) const { IS_UTF8_ALIGNED(s) if (*s=='\t') { int tab = (int)col_to_x(mBuffer->tab_distance()); return (((xPix/tab)+1)*tab) - xPix; } int charLen = fl_utf8len1(*s), style = 0; if (mStyleBuffer) { style = mStyleBuffer->byte_at(pos); } return string_width(s, charLen, style); } /** \brief Finds both the end of the current line and the start of the next line. Why? In continuous wrap mode, if you need to know both, figuring out one from the other can be expensive or error prone. The problem comes when there's a trailing space or tab just before the end of the buffer. To translate an end of line value to or from the next lines start value, you need to know whether the trailing space or tab is being used as a line break or just a normal character, and to find that out would otherwise require counting all the way back to the beginning of the line. \param startPos \param startPosIsLineStart \param[out] lineEnd \param[out] nextLineStart */ void Fl_Text_Display_mod::find_line_end(int startPos, bool startPosIsLineStart, int *lineEnd, int *nextLineStart) const { IS_UTF8_ALIGNED2(buffer(), startPos) int retLines, retLineStart; /* if we're not wrapping use more efficient BufEndOfLine */ if (mFastDisplay || !mContinuousWrap) { int le = buffer()->line_end(startPos); int ls = buffer()->next_char(le); *lineEnd = le; *nextLineStart = min(buffer()->length(), ls); return; } /* use the wrapped line counter routine to count forward one line */ wrapped_line_counter(buffer(), startPos, buffer()->length(), 1, startPosIsLineStart, 0, nextLineStart, &retLines, &retLineStart, lineEnd); } /** \brief Check if the line break is caused by a \\n or by line wrapping. Line breaks in continuous wrap mode usually happen at newlines or whitespace. This line-terminating character is not included in line width measurements and has a special status as a non-visible character. However, lines with no whitespace are wrapped without the benefit of a line terminating character, and this distinction causes endless trouble with all of the text display code which was originally written without continuous wrap mode and always expects to wrap at a newline character. Given the position of the end of the line, as returned by TextDEndOfLine or BufEndOfLine, this returns true if there is a line terminating character, and false if there's not. On the last character in the buffer, this function can't tell for certain whether a trailing space was used as a wrap point, and just guesses that it wasn't. So if an exact accounting is necessary, don't use this function. \param lineEndPos index of character where the line wraps \return 1 if a \\n character causes the line wrap */ int Fl_Text_Display_mod::wrap_uses_character(int lineEndPos) const { IS_UTF8_ALIGNED2(buffer(), lineEndPos) unsigned int c; if (mFastDisplay || !mContinuousWrap || lineEndPos == buffer()->length()) return 1; c = buffer()->char_at(lineEndPos); return c == '\n' || ((c == '\t' || c == ' ') && lineEndPos + 1 < buffer()->length()); } /** \brief I don't know what this does! Extend the range of a redraw request (from *start to *end) with additional redraw requests resulting from changes to the attached style buffer (which contains auxiliary information for coloring or styling text). \param startpos ?? \param endpos ?? \todo Unicode? */ void Fl_Text_Display_mod::extend_range_for_styles( int *startpos, int *endpos ) { IS_UTF8_ALIGNED2(buffer(), (*startpos)) IS_UTF8_ALIGNED2(buffer(), (*endpos)) Fl_Text_Selection_mod * sel = mStyleBuffer->primary_selection(); int extended = 0; /* The peculiar protocol used here is that modifications to the style buffer are marked by selecting them with the buffer's primary Fl_Text_Selection. The style buffer is usually modified in response to a modify callback on the text buffer BEFORE Fl_Text_Display_mod.c's modify callback, so that it can keep the style buffer in step with the text buffer. The style-update callback can't just call for a redraw, because Fl_Text_Display_mod hasn't processed the original text changes yet. Anyhow, to minimize redrawing and to avoid the complexity of scheduling redraws later, this simple protocol tells the text display's buffer modify callback to extend its redraw range to show the text color/and font changes as well. */ if ( sel->selected() ) { if ( sel->start() < *startpos ) { *startpos = sel->start(); // somewhere while deleting, alignment is lost. We do this just to be sure. *startpos = buffer()->utf8_align(*startpos); IS_UTF8_ALIGNED2(buffer(), (*startpos)) extended = 1; } if ( sel->end() > *endpos ) { *endpos = sel->end(); *endpos = buffer()->utf8_align(*endpos); IS_UTF8_ALIGNED2(buffer(), (*endpos)) extended = 1; } } /* If the Fl_Text_Selection was extended due to a style change, and some of the fonts don't match in spacing, extend redraw area to end of line to redraw characters exposed by possible font size changes */ if ( extended ) *endpos = mBuffer->line_end( *endpos ) + 1; IS_UTF8_ALIGNED2(buffer(), (*endpos)) } /** \brief Draw the widget. This function tries to limit drawing to smaller areas if possible. */ void Fl_Text_Display_mod::draw(void) { // don't even try if there is no associated text buffer! if (!buffer()) { draw_box(); return; } fl_push_clip(x(),y(),w(),h()); // prevent drawing outside widget area // draw the non-text, non-scrollbar areas. if (damage() & FL_DAMAGE_ALL) { // printf("drawing all (box = %d)\n", box()); //#ifndef __APPLE__ // if (Fl_Surface_Device::surface()->class_name() == Fl_Printer::class_id) { // if to printer, draw the background // fl_rectf(text_area.x, text_area.y, text_area.w, text_area.h, color() ); // } //#endif // draw the box() int W = w(), H = h(); draw_box(box(), x(), y(), W, H, color()); if (mHScrollBar->visible()) W -= scrollbar_width(); if (mVScrollBar->visible()) H -= scrollbar_width(); // left margin fl_rectf(text_area.x-LEFT_MARGIN, text_area.y-TOP_MARGIN, LEFT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN, color()); // right margin fl_rectf(text_area.x+text_area.w, text_area.y-TOP_MARGIN, RIGHT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN, color()); // top margin fl_rectf(text_area.x, text_area.y-TOP_MARGIN, text_area.w, TOP_MARGIN, color()); // bottom margin fl_rectf(text_area.x, text_area.y+text_area.h, text_area.w, BOTTOM_MARGIN, color()); // draw that little box in the corner of the scrollbars if (mVScrollBar->visible() && mHScrollBar->visible()) fl_rectf(mVScrollBar->x(), mHScrollBar->y(), mVScrollBar->w(), mHScrollBar->h(), FL_GRAY); // blank the previous cursor protrusions } else if (damage() & (FL_DAMAGE_SCROLL | FL_DAMAGE_EXPOSE)) { // printf("blanking previous cursor extrusions at Y: %d\n", mCursorOldY); // CET - FIXME - save old cursor position instead and just draw side needed? fl_push_clip(text_area.x-LEFT_MARGIN, text_area.y, text_area.w+LEFT_MARGIN+RIGHT_MARGIN, text_area.h); fl_rectf(text_area.x-LEFT_MARGIN, mCursorOldY, LEFT_MARGIN, mMaxsize, color()); fl_rectf(text_area.x+text_area.w, mCursorOldY, RIGHT_MARGIN, mMaxsize, color()); fl_pop_clip(); } // draw the scrollbars if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_CHILD)) { mVScrollBar->damage(FL_DAMAGE_ALL); mHScrollBar->damage(FL_DAMAGE_ALL); } update_child(*mVScrollBar); update_child(*mHScrollBar); // draw all of the text if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_EXPOSE)) { //printf("drawing all text\n"); int X, Y, W, H; if (fl_clip_box(text_area.x, text_area.y, text_area.w, text_area.h, X, Y, W, H)) { // Draw text using the intersected clipping box... // (this sets the clipping internally) draw_text(X, Y, W, H); } else { // Draw the whole area... draw_text(text_area.x, text_area.y, text_area.w, text_area.h); } } else if (damage() & FL_DAMAGE_SCROLL) { // draw some lines of text fl_push_clip(text_area.x, text_area.y, text_area.w, text_area.h); //printf("drawing text from %d to %d\n", damage_range1_start, damage_range1_end); draw_range(damage_range1_start, damage_range1_end); if (damage_range2_end != -1) { //printf("drawing text from %d to %d\n", damage_range2_start, damage_range2_end); draw_range(damage_range2_start, damage_range2_end); } damage_range1_start = damage_range1_end = -1; damage_range2_start = damage_range2_end = -1; fl_pop_clip(); } // draw the text cursor if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_SCROLL | FL_DAMAGE_EXPOSE) && !buffer()->primary_selection()->selected() && mCursorOn && Fl::focus() == (Fl_Widget*)this ) { fl_push_clip(text_area.x-LEFT_MARGIN, text_area.y, text_area.w+LEFT_MARGIN+RIGHT_MARGIN, text_area.h); int X, Y = 0; if (position_to_xy(mCursorPos, &X, &Y)) draw_cursor(X, Y); // else puts("position_to_xy() failed - unable to draw cursor!"); //printf("drew cursor at pos: %d (%d,%d)\n", mCursorPos, X, Y); mCursorOldY = Y; fl_pop_clip(); } fl_pop_clip(); } // this processes drag events due to mouse for Fl_Text_Display_mod and // also drags due to cursor movement with shift held down for // Fl_Text_Editor_mod void fl_text_drag_me(int pos, Fl_Text_Display_mod* d) { if (d->dragType == Fl_Text_Display_mod::DRAG_CHAR) { if (pos >= d->dragPos) { d->buffer()->select(d->dragPos, pos); } else { d->buffer()->select(pos, d->dragPos); } d->insert_position(pos); } else if (d->dragType == Fl_Text_Display_mod::DRAG_WORD) { if (pos >= d->dragPos) { d->insert_position(d->word_end(pos)); d->buffer()->select(d->word_start(d->dragPos), d->word_end(pos)); } else { d->insert_position(d->word_start(pos)); d->buffer()->select(d->word_start(pos), d->word_end(d->dragPos)); } } else if (d->dragType == Fl_Text_Display_mod::DRAG_LINE) { if (pos >= d->dragPos) { d->insert_position(d->buffer()->line_end(pos)+1); d->buffer()->select(d->buffer()->line_start(d->dragPos), d->buffer()->line_end(pos)+1); } else { d->insert_position(d->buffer()->line_start(pos)); d->buffer()->select(d->buffer()->line_start(pos), d->buffer()->line_end(d->dragPos)+1); } } } /** \brief Timer callback for scroll events. This timer event scrolls the text view proportionally to how far the mouse pointer has left the text area. This allows for smooth scrolling without "wiggeling" the mouse. */ void Fl_Text_Display_mod::scroll_timer_cb(void *user_data) { Fl_Text_Display_mod *w = (Fl_Text_Display_mod*)user_data; int pos; switch (scroll_direction) { case 1: // mouse is to the right, scroll left w->scroll(w->mTopLineNum, w->mHorizOffset + scroll_amount); pos = w->xy_to_position(w->text_area.x + w->text_area.w, scroll_y, CURSOR_POS); break; case 2: // mouse is to the left, scroll right w->scroll(w->mTopLineNum, w->mHorizOffset + scroll_amount); pos = w->xy_to_position(w->text_area.x, scroll_y, CURSOR_POS); break; case 3: // mouse is above, scroll down w->scroll(w->mTopLineNum + scroll_amount, w->mHorizOffset); pos = w->xy_to_position(scroll_x, w->text_area.y, CURSOR_POS); break; case 4: // mouse is below, scroll up w->scroll(w->mTopLineNum + scroll_amount, w->mHorizOffset); pos = w->xy_to_position(scroll_x, w->text_area.y + w->text_area.h, CURSOR_POS); break; default: return; } fl_text_drag_me(pos, w); Fl::repeat_timeout(.1, scroll_timer_cb, user_data); } /** \brief Event handling. */ int Fl_Text_Display_mod::handle(int event) { if (!buffer()) return 0; // This isn't very elegant! if (!Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h) && !dragging && event != FL_LEAVE && event != FL_ENTER && event != FL_MOVE && event != FL_FOCUS && event != FL_UNFOCUS && event != FL_KEYBOARD && event != FL_KEYUP) { return Fl_Group::handle(event); } switch (event) { case FL_ENTER: case FL_MOVE: if (active_r()) { if (Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h)) window()->cursor(FL_CURSOR_INSERT); else window()->cursor(FL_CURSOR_DEFAULT); return 1; } else { return 0; } case FL_LEAVE: case FL_HIDE: if (active_r() && window()) { window()->cursor(FL_CURSOR_DEFAULT); return 1; } else { return 0; } case FL_PUSH: { if (active_r() && window()) { if (Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h)) window()->cursor(FL_CURSOR_INSERT); else window()->cursor(FL_CURSOR_DEFAULT); } if (Fl::focus() != this) { Fl::focus(this); handle(FL_FOCUS); } if (Fl_Group::handle(event)) return 1; if (Fl::event_state()&FL_SHIFT) return handle(FL_DRAG); dragging = 1; int pos = xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS); dragPos = pos; if (buffer()->primary_selection()->includes(pos)) { dragType = DRAG_START_DND; return 1; } dragType = Fl::event_clicks(); if (dragType == DRAG_CHAR) { buffer()->unselect(); // Fl::copy("", 0, 0); /* removed for STR 2668 */ } else if (dragType == DRAG_WORD) { buffer()->select(word_start(pos), word_end(pos)); dragPos = word_start(pos); } if (buffer()->primary_selection()->selected()) insert_position(buffer()->primary_selection()->end()); else insert_position(pos); show_insert_position(); return 1; } case FL_DRAG: { if (dragType==DRAG_NONE) return 1; if (dragType==DRAG_START_DND) { if (!Fl::event_is_click() && Fl::dnd_text_ops()) { const char* copy = buffer()->selection_text(); Fl::dnd(); free((void*)copy); } return 1; } int X = Fl::event_x(), Y = Fl::event_y(), pos = insert_position(); // if we leave the text_area, we start a timer event // that will take care of scrolling and selecting if (Y < text_area.y) { scroll_x = X; scroll_amount = (Y - text_area.y) / 5 - 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 3; } else if (Y >= text_area.y+text_area.h) { scroll_x = X; scroll_amount = (Y - text_area.y - text_area.h) / 5 + 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 4; } else if (X < text_area.x) { scroll_y = Y; scroll_amount = (X - text_area.x) / 2 - 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 2; } else if (X >= text_area.x+text_area.w) { scroll_y = Y; scroll_amount = (X - text_area.x - text_area.w) / 2 + 1; if (!scroll_direction) { Fl::add_timeout(.01, scroll_timer_cb, this); } scroll_direction = 1; } else { if (scroll_direction) { Fl::remove_timeout(scroll_timer_cb, this); scroll_direction = 0; } pos = xy_to_position(X, Y, CURSOR_POS); pos = buffer()->next_char(pos); } fl_text_drag_me(pos, this); return 1; } case FL_RELEASE: { if (Fl::event_is_click() && (! Fl::event_clicks()) && buffer()->primary_selection()->includes(dragPos) && !(Fl::event_state()&FL_SHIFT) ) { buffer()->unselect(); // clicking in the selection: unselect and move cursor insert_position(dragPos); return 1; } else if (Fl::event_clicks() == DRAG_LINE && Fl::event_button() == FL_LEFT_MOUSE) { buffer()->select(buffer()->line_start(dragPos), buffer()->next_char(buffer()->line_end(dragPos))); dragPos = line_start(dragPos); dragType = DRAG_CHAR; } else { dragging = 0; if (scroll_direction) { Fl::remove_timeout(scroll_timer_cb, this); scroll_direction = 0; } // convert from WORD or LINE selection to CHAR /*if (insert_position() >= dragPos) dragPos = buffer()->primary_selection()->start(); else dragPos = buffer()->primary_selection()->end();*/ dragType = DRAG_CHAR; } const char* copy = buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 0); free((void*)copy); return 1; } case FL_MOUSEWHEEL: if (Fl::event_dy()) return mVScrollBar->handle(event); else return mHScrollBar->handle(event); case FL_UNFOCUS: if (active_r() && window()) window()->cursor(FL_CURSOR_DEFAULT); case FL_FOCUS: if (buffer()->selected()) { int start, end; if (buffer()->selection_position(&start, &end)) redisplay_range(start, end); } if (buffer()->secondary_selected()) { int start, end; if (buffer()->secondary_selection_position(&start, &end)) redisplay_range(start, end); } if (buffer()->highlight()) { int start, end; if (buffer()->highlight_position(&start, &end)) redisplay_range(start, end); } return 1; case FL_KEYBOARD: // Copy? if ((Fl::event_state()&(FL_CTRL|FL_COMMAND)) && Fl::event_key()=='c') { if (!buffer()->selected()) return 1; const char *copy = buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 1); free((void*)copy); return 1; } // Select all ? if ((Fl::event_state()&(FL_CTRL|FL_COMMAND)) && Fl::event_key()=='a') { buffer()->select(0,buffer()->length()); const char *copy = buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 0); free((void*)copy); return 1; } if (mVScrollBar->handle(event)) return 1; if (mHScrollBar->handle(event)) return 1; break; case FL_SHORTCUT: if (!(shortcut() ? Fl::test_shortcut(shortcut()) : test_shortcut())) return 0; if (Fl::visible_focus() && handle(FL_FOCUS)) { Fl::focus(this); return 1; } break; } return 0; } /* Convert an x pixel position into a column number. */ double Fl_Text_Display_mod::x_to_col(double y) const { if (!mColumnScale) { mColumnScale = string_width("Mitg", 4, 'A') / 4.0; } return (y/mColumnScale)+0.5; } /** Convert a column number into an x pixel position. */ double Fl_Text_Display_mod::col_to_x(double col) const { if (!mColumnScale) { // recalculate column scale value x_to_col(0); } return col*mColumnScale; } // // End of "$Id: Fl_Text_Display_mod.cxx 8808 2011-06-16 13:31:25Z manolo $". // fldigi-4.2.05/src/widgets/flslider2.cxx0000664000175000017500000001633614532252172014646 00000000000000// ---------------------------------------------------------------------------- // flslider2.cxx // // Copyright (C) 2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include "flslider2.h" inline static int handle_scroll(Fl_Valuator* w, int event) { if (!(event == FL_MOUSEWHEEL && Fl::event_inside(w))) return 0; double d; if ((d = Fl::event_dy()) || (d = Fl::event_dx())) { if (Fl::event_state() & FL_SHIFT) d *= 10.0; if (!dynamic_cast(w) && !dynamic_cast(w) && !(w->type() & FL_HOR_SLIDER)) d = -d; w->value(w->clamp(w->increment(w->value(), static_cast(-d)))); w->do_callback(); } return 1; } int Fl_Slider2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Slider::handle(event); } int Fl_Value_Slider2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Value_Slider::handle(event); } int Fl_Value_Input2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Value_Input::handle(event); } inline static int handle_scroll(Fl_Spinner* w, int event) { if (!(event == FL_MOUSEWHEEL && Fl::event_inside(w))) return 0; double d; if ((d = Fl::event_dy()) || (d = Fl::event_dx())) { if (Fl::event_state() & FL_SHIFT) d *= 10.0; d = w->value() - d * w->step(); w->value(WCLAMP(d, w->minimum(), w->maximum())); w->do_callback(); } return 1; } int Fl_Spinner2::handle(int event) { return handle_scroll(this, event) ? 1 : Fl_Spinner::handle(event); } // // Counter widget for FLDIGI modified from FLTK // // Counter widget for the Fast Light Tool Kit (FLTK). // #include void My_Counter::draw() { int i; Fl_Boxtype boxtype[5]; Fl_Color selcolor; boxtype[0] = box(); if (boxtype[0] == FL_UP_BOX) boxtype[0] = FL_DOWN_BOX; if (boxtype[0] == FL_THIN_UP_BOX) boxtype[0] = FL_THIN_DOWN_BOX; for (i=1; i<5; i++) if (mouseobj == i) boxtype[i] = fl_down(box()); else boxtype[i] = box(); int xx[5], ww[5]; if (type() == FL_NORMAL_COUNTER) { int W = w()*15/100; xx[1] = x(); ww[1] = W; xx[2] = x()+1*W; ww[2] = W; xx[0] = x()+2*W; ww[0] = w()-4*W; xx[3] = x()+w()-2*W; ww[3] = W; xx[4] = x()+w()-1*W; ww[4] = W; } else { int W = w()*20/100; xx[1] = 0; ww[1] = 0; xx[2] = x(); ww[2] = W; xx[0] = x()+W; ww[0] = w()-2*W; xx[3] = x()+w()-1*W; ww[3] = W; xx[4] = 0; ww[4] = 0; } draw_box(boxtype[0], xx[0], y(), ww[0], h(), bkcolor_); fl_font(textfont(), textsize()); fl_color(active_r() ? textcolor() : fl_inactive(textcolor())); char str[128]; format(str); fl_draw(str, xx[0], y(), ww[0], h(), FL_ALIGN_CENTER); if (Fl::focus() == this) draw_focus(boxtype[0], xx[0], y(), ww[0], h()); if (!(damage()&FL_DAMAGE_ALL)) return; // only need to redraw text if (active_r()) selcolor = labelcolor(); else selcolor = fl_inactive(labelcolor()); if (type() == FL_NORMAL_COUNTER) { draw_box(boxtype[1], xx[1], y(), ww[1], h(), color()); fl_draw_symbol("@-4<<", xx[1], y(), ww[1], h(), selcolor); } draw_box(boxtype[2], xx[2], y(), ww[2], h(), color()); fl_draw_symbol("@-4<", xx[2], y(), ww[2], h(), selcolor); draw_box(boxtype[3], xx[3], y(), ww[3], h(), color()); fl_draw_symbol("@-4>", xx[3], y(), ww[3], h(), selcolor); if (type() == FL_NORMAL_COUNTER) { draw_box(boxtype[4], xx[4], y(), ww[4], h(), color()); fl_draw_symbol("@-4>>", xx[4], y(), ww[4], h(), selcolor); } } void My_Counter::increment_cb() { if (!mouseobj) return; double v = value(); switch (mouseobj) { case 1: v -= lstep_; break; case 2: v = increment(v, -1); break; case 3: v = increment(v, 1); break; case 4: v += lstep_; break; } handle_drag(clamp(round(v))); } #define INITIALREPEAT .5 #define REPEAT .1 void My_Counter::repeat_callback(void* v) { My_Counter* b = (My_Counter*)v; if (b->mouseobj) { Fl::add_timeout(REPEAT, repeat_callback, b); b->increment_cb(); } } int My_Counter::calc_mouseobj() { if (type() == FL_NORMAL_COUNTER) { int W = w()*15/100; if (Fl::event_inside(x(), y(), W, h())) return 1; if (Fl::event_inside(x()+W, y(), W, h())) return 2; if (Fl::event_inside(x()+w()-2*W, y(), W, h())) return 3; if (Fl::event_inside(x()+w()-W, y(), W, h())) return 4; } else { int W = w()*20/100; if (Fl::event_inside(x(), y(), W, h())) return 2; if (Fl::event_inside(x()+w()-W, y(), W, h())) return 3; } return -1; } int My_Counter::handle(int event) { int i; switch (event) { case FL_RELEASE: if (mouseobj) { Fl::remove_timeout(repeat_callback, this); mouseobj = 0; redraw(); } handle_release(); return 1; case FL_PUSH: if (Fl::visible_focus()) Fl::focus(this); { Fl_Widget_Tracker wp(this); handle_push(); if (wp.deleted()) return 1; } case FL_DRAG: i = calc_mouseobj(); if (i != mouseobj) { Fl::remove_timeout(repeat_callback, this); mouseobj = (uchar)i; if (i) Fl::add_timeout(INITIALREPEAT, repeat_callback, this); Fl_Widget_Tracker wp(this); increment_cb(); if (wp.deleted()) return 1; redraw(); } return 1; case FL_KEYBOARD : switch (Fl::event_key()) { case FL_Left: handle_drag(clamp(increment(value(),-1))); return 1; case FL_Right: handle_drag(clamp(increment(value(),1))); return 1; default: return 0; } // break not required because of switch... case FL_FOCUS : /* FALLTHROUGH */ case FL_UNFOCUS : if (Fl::visible_focus()) { redraw(); return 1; } else return 0; case FL_ENTER : /* FALLTHROUGH */ case FL_LEAVE : return 1; default: return 0; } } /** Destroys the valuator. */ My_Counter::~My_Counter() { Fl::remove_timeout(repeat_callback, this); } /** Creates a new My_Counter widget using the given position, size, and label string. The default type is FL_NORMAL_COUNTER. \param[in] X, Y, W, H position and size of the widget \param[in] L widget label, default is no label */ My_Counter::My_Counter(int X, int Y, int W, int H, const char* L) : Fl_Valuator(X, Y, W, H, L) { box(FL_UP_BOX); selection_color(FL_INACTIVE_COLOR); // was FL_BLUE align(FL_ALIGN_BOTTOM); bounds(-1000000.0, 1000000.0); Fl_Valuator::step(1, 10); lstep_ = 1.0; mouseobj = 0; textfont_ = FL_HELVETICA; textsize_ = FL_NORMAL_SIZE; textcolor_ = FL_FOREGROUND_COLOR; bkcolor_ = FL_BACKGROUND2_COLOR; } int Fl_Counter2::handle(int event) { return handle_scroll(this, event) ? 1 : My_Counter::handle(event); } fldigi-4.2.05/src/widgets/FTextView.cxx0000664000175000017500000006162514611711171014643 00000000000000// ---------------------------------------------------------------------------- // FTextView.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // Copyright (C) 2008-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "flmisc.h" #include "fileselect.h" #include "font_browser.h" #include "ascii.h" #include "icons.h" #include "gettext.h" #include "macros.h" #include "FTextView.h" #include "debug.h" /// FTextBase constructor. /// Word wrapping is enabled by default at column 80, but see \c reset_wrap_col. /// @param x /// @param y /// @param w /// @param h /// @param l FTextBase::FTextBase(int x, int y, int w, int h, const char *l) : Fl_Text_Editor_mod(x, y, w, h, l), wrap(true), wrap_col(80), max_lines(0), scroll_hint(false) { oldw = oldh = olds = -1; oldf = (Fl_Font)-1; textfont(FL_HELVETICA); textsize(FL_NORMAL_SIZE); textcolor(FL_FOREGROUND_COLOR); tbuf = new Fl_Text_Buffer_mod; sbuf = new Fl_Text_Buffer_mod; buffer(tbuf); highlight_data(sbuf, styles, NATTR, FTEXT_DEF, 0, 0); cursor_style(Fl_Text_Editor_mod::NORMAL_CURSOR); // reset_styles MUST before the call to wrap_mode or mStyleTable will have // garbage values! reset_styles(SET_FONT | SET_SIZE | SET_COLOR); wrap_mode(wrap, wrap_col); restore_wrap = wrap; } void FTextBase::clear() { tbuf->text(""); sbuf->text(""); set_word_wrap(restore_wrap); } int FTextBase::handle(int event) { if (event == FL_MOUSEWHEEL && !Fl::event_inside(this)) return 1; // Fl_Text_Editor::handle() calls window()->cursor(FL_CURSOR_DONE) when // it receives an FL_KEYBOARD event, which crashes some buggy X drivers // (e.g. Intel on the Asus Eee PC). Call handle_key directly to work // around this problem. if (event == FL_KEYBOARD) return Fl_Text_Editor_mod::handle_key(); else return Fl_Text_Editor_mod::handle(event); } /// @see FTextRX::add /// /// @param s /// @param attr /// void FTextBase::add(const char *s, int attr) { // handle the text attribute first int n = strlen(s); char a[n + 1]; memset(a, FTEXT_DEF + attr, n); a[n] = '\0'; sbuf->replace(insert_position(), insert_position() + n, a); insert(s); } /// @see FTextBase::add /// /// @param s /// @param attr /// #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR >= 3 void FTextBase::add(unsigned int c, int attr) #else void FTextBase::add(unsigned char c, int attr) #endif { char s[] = { (char)(FTEXT_DEF + attr), '\0' }; sbuf->replace(insert_position(), insert_position() + 1, s); s[0] = c & 0xFF; insert(s); } void FTextBase::set_word_wrap(bool b, bool b2) { wrap_mode((wrap = b), wrap_col); if (b2) restore_wrap = wrap; show_insert_position(); } void FTextBase::setFont(Fl_Font f, int attr) { set_style(attr, f, textsize(), textcolor(), SET_FONT); } void FTextBase::setFontSize(int s, int attr) { set_style(attr, textfont(), s, textcolor(), SET_SIZE); } void FTextBase::setFontColor(Fl_Color c, int attr) { set_style(attr, textfont(), textsize(), c, SET_COLOR); } /// Resizes the text widget. /// The real work is done by \c Fl_Text_Editor_mod::resize or, if \c HSCROLLBAR_KLUDGE /// is defined, a version of that code modified so that no horizontal /// scrollbars are displayed when word wrapping. /// /// @param X /// @param Y /// @param W /// @param H /// void FTextBase::resize(int X, int Y, int W, int H) { bool need_wrap_reset = false; bool need_margin_reset = false; if (unlikely(text_area.w != oldw)) { oldw = text_area.w; need_wrap_reset = true; } if (unlikely(text_area.h != oldh)) { oldh = text_area.h; need_margin_reset = true; } if (unlikely(textfont() != oldf || textsize() != olds)) { oldf = textfont(); olds = textsize(); need_wrap_reset = need_margin_reset = true; } if (need_wrap_reset) reset_wrap_col(); TOP_MARGIN = DEFAULT_TOP_MARGIN; int r = H - Fl::box_dh(box()) - TOP_MARGIN - BOTTOM_MARGIN; if (mHScrollBar->visible()) r -= scrollbar_width(); int msize = mMaxsize ? mMaxsize : textsize(); if (!msize) msize = 1; //printf("H %d, textsize %d, lines %d, extra %d\n", r, msize, r / msize, r % msize); if (r %= msize) TOP_MARGIN += r; if (scroll_hint) { mTopLineNumHint = mNBufferLines; mHorizOffsetHint = 0; // display_insert_position_hint = 1; scroll_hint = false; } bool hscroll_visible = mHScrollBar->visible(); Fl_Text_Editor_mod::resize(X, Y, W, H); if (hscroll_visible != mHScrollBar->visible()) oldh = 0; // reset margins next time } /// Checks the new widget height. /// This is registered with Fl_Tile_check and then called with horizontal /// and vertical size increments every time the Fl_Tile boundary is moved. /// /// @param arg The callback argument; should be a pointer to a FTextBase object /// @param xd The horizontal increment (ignored) /// @param yd The vertical increment /// /// @return True if the widget is visible, and the new text area height would be /// a multiple of the font height. /// bool FTextBase::wheight_mult_tsize(void *arg, int, int yd) { FTextBase *v = reinterpret_cast(arg); if (!v->visible()) return true; return v->mMaxsize > 0 && (v->text_area.h + yd) % v->mMaxsize == 0; } /// Changes text style attributes /// /// @param attr The attribute name to change, or \c NATTR to change all styles. /// @param f The new font /// @param s The new font size /// @param c The new font color /// @param set One or more (OR'd together) SET operations; @see set_style_op_e /// void FTextBase::set_style(int attr, Fl_Font f, int s, Fl_Color c, int set) { int start, end; if (attr == NATTR) { // update all styles start = 0; end = NATTR; if (set & SET_FONT) Fl_Text_Display_mod::textfont(f); if (set & SET_SIZE) textsize(s); if (set & SET_COLOR) textcolor(c); } else { start = attr; end = start + 1; } for (int i = start; i < end; i++) { styles[i].attr = 0; if (set & SET_FONT) styles[i].font = f; if (set & SET_SIZE) styles[i].size = s; if (set & SET_COLOR) styles[i].color = c; if (i == SKIP) // clickable styles always same as SKIP for now for (int j = CLICK_START; j < NATTR; j++) memcpy(&styles[j], &styles[i], sizeof(styles[j])); } if (set & SET_COLOR) mCursor_color = styles[0].color; resize(x(), y(), w(), h()); // to redraw and recalculate the wrap column } /// Reads a file and inserts its contents. /// change all occurrences of ^ to ^^ to prevent get_tx_char from /// treating the carat as a control sequence, ie: ^r ^R ^t ^T ^L ^C /// get_tx_char passes ^^ as a single ^ /// /// @return 0 on success, -1 on error int FTextBase::readFile(const char* fn) { set_word_wrap(restore_wrap); if ( !(fn || (fn = FSEL::select(_("Insert text"), "Text\t*.txt"))) ) return -1; int ret = 0, pos = insert_position(); #ifdef __WOE32__ FILE* tfile = fl_fopen(fn, "rt"); #else FILE* tfile = fl_fopen(fn, "r"); #endif if (!tfile) return -1; char buf[BUFSIZ+1]; std::string newbuf; size_t p; memset(buf, 0, BUFSIZ+1); p = 0; while (fgets(buf, sizeof(buf), tfile)) { newbuf.append(buf); memset(buf, 0, BUFSIZ+1); } if (ferror(tfile)) return (-1); fclose(tfile); while ((p = newbuf.find("^",p)) != std::string::npos) { newbuf.insert(p, "^"); p += 2; } p = 0; while ((p = newbuf.find("@^^", p)) != std::string::npos) { newbuf.erase(p,2); } if (pos == tbuf->length()) { // optimise for append tbuf->append(newbuf.c_str()); pos = tbuf->length(); } else { tbuf->insert(pos, newbuf.c_str()); pos += newbuf.length(); } insert_position(pos); show_insert_position(); return ret; } /// Writes all buffer text out to a file. /// /// void FTextBase::saveFile(void) { const char *fn = FSEL::saveas(_("Save text as"), "Text\t*.txt"); if (fn) { #ifdef __WOE32__ std::ofstream tfile(fn); if (!tfile) return; char *p1, *p2, *text = tbuf->text(); for (p1 = p2 = text; *p1; p1 = p2) { while (*p2 != '\0' && *p2 != '\r') p2++; if (*p2 == '\n') { *p2 = '\0'; tfile << p1 << "\r\n"; p2++; } else tfile << p1; } free(text); #else tbuf->outputfile(fn, 0, tbuf->length()); #endif } } /// Returns a character string containing the selected (n) word(s), if any, /// or the word at (\a x, \a y) relative to the widget's \c x() and \c y(). /// If \a ontext is true, this function will return text only if the /// mouse cursor position is inside the text range. /// /// @param x /// @param y /// /// @return The selection, or the word text at (x,y). Must be freed by the caller. /// char* FTextBase::get_word(int x, int y, const char* nwchars, int n, bool ontext) { int p = xy_to_position(x + this->x(), y + this->y(), Fl_Text_Display_mod::CURSOR_POS); int start, end; if (tbuf->selected()) { if (ontext && (p < start || p >= end) && tbuf->selection_position(&start, &end)) return 0; else return tbuf->selection_text(); } std::string nonword = nwchars; nonword.append(" \t\n"); if (!tbuf->findchars_backward(p, nonword.c_str(), &start)) start = 0; else start++; if (!tbuf->findchars_forward(p, nonword.c_str(), &end, n)) return 0; // end = tbuf->length(); if (start >= end) return 0; if (ontext && (p < start || p >= end)) return 0; else return tbuf->text_range(start, end); } /// Initialised the menu pointed to by \c context_menu. The menu items' user_data /// field is used to store the initialisation flag. void FTextBase::init_context_menu(void) { for (int i = 0; i < context_menu->size() - 1; i++) { if (context_menu[i].user_data() == 0 && context_menu[i].labeltype() == _FL_MULTI_LABEL) { icons::set_icon_label(&context_menu[i]); context_menu[i].user_data(this); } } } /// Displays the menu pointed to by \c context_menu and calls the menu function; /// @see call_cb. /// void FTextBase::show_context_menu(void) { const Fl_Menu_Item *m; int xpos = Fl::event_x(); int ypos = Fl::event_y(); popx = xpos - x(); popy = ypos - y(); window()->cursor(FL_CURSOR_DEFAULT); m = context_menu->popup(xpos, ypos, 0, 0, 0); if (m) menu_cb(m - context_menu); } /// Recalculates the wrap margin when the font is changed or the widget resized. /// Line wrapping works with proportional fonts but may be very slow. /// int FTextBase::reset_wrap_col(void) { if (!wrap || text_area.w == 0) return wrap_col; int old_wrap_col = wrap_col; if (Font_Browser::fixed_width(textfont())) { fl_font(textfont(), textsize()); wrap_col = (int)floorf(text_area.w / fl_width('X')); } else // use slower (but accurate) wrapping for variable width fonts wrap_col = 0; // wrap_mode triggers a resize; don't call it if wrap_col hasn't changed if (old_wrap_col != wrap_col) wrap_mode(wrap, wrap_col); return old_wrap_col; } void FTextBase::reset_styles(int set) { set_style(NATTR, FL_HELVETICA, FL_NORMAL_SIZE, FL_FOREGROUND_COLOR, set); set_style(XMIT, FL_HELVETICA, FL_NORMAL_SIZE, FL_RED, set); set_style(CTRL, FL_HELVETICA, FL_NORMAL_SIZE, FL_DARK_GREEN, set); set_style(SKIP, FL_HELVETICA, FL_NORMAL_SIZE, FL_BLUE, set); set_style(ALTR, FL_HELVETICA, FL_NORMAL_SIZE, FL_DARK_MAGENTA, set); set_style(FSQ_TX, FL_HELVETICA, FL_NORMAL_SIZE, FL_RED, set); set_style(FSQ_DIR, FL_HELVETICA, FL_NORMAL_SIZE, FL_BLUE, set); set_style(FSQ_UND, FL_HELVETICA, FL_NORMAL_SIZE, FL_DARK_GREEN, set); } // ---------------------------------------------------------------------------- Fl_Menu_Item FTextView::menu[] = { { icons::make_icon_label(_("Copy"), edit_copy_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Select All"), edit_select_all_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Save as..."), save_as_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { _("Word wrap"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL }, { 0 } }; /// FTextView constructor. /// We remove \c Fl_Text_Display_mod::buffer_modified_cb from the list of callbacks /// because we want to scroll depending on the visibility of the last line; @see /// changed_cb. /// @param x /// @param y /// @param w /// @param h /// @param l FTextView::FTextView(int x, int y, int w, int h, const char *l) : FTextBase(x, y, w, h, l), quick_entry(false) { tbuf->remove_modify_callback(buffer_modified_cb, this); tbuf->add_modify_callback(changed_cb, this); tbuf->canUndo(0); // disable some keybindings that are not allowed in FTextView buffers change_keybindings(); context_menu = menu; init_context_menu(); } /// Handles fltk events for this widget. /// We only care about mouse presses (to display the popup menu and prevent /// pasting) and keyboard events (to make sure no text can be inserted). /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextView::handle(int event) { switch (event) { case FL_PUSH: if (!Fl::event_inside(this)) break; if (Fl::event_button() == FL_RIGHT_MOUSE) { handle_context_menu(); return 1; } if (Fl::event_button() == FL_MIDDLE_MOUSE) return 1; // ignore mouse2 text pastes inside the received text break; case FL_DRAG: if (Fl::event_button() != FL_LEFT_MOUSE) return 1; break; // catch some text-modifying events that are not handled by kf_* functions case FL_KEYBOARD: int k; if (Fl::compose(k)) return 1; k = Fl::event_key(); if (k == FL_BackSpace) return 1; else if (k == FL_Tab) return Fl_Widget::handle(event); } return FTextBase::handle(event); } void FTextView::handle_context_menu(void) { icons::set_active(&menu[VIEW_MENU_COPY], tbuf->selected()); icons::set_active(&menu[VIEW_MENU_CLEAR], tbuf->length()); icons::set_active(&menu[VIEW_MENU_SELECT_ALL], tbuf->length()); icons::set_active(&menu[VIEW_MENU_SAVE], tbuf->length()); if (wrap) menu[VIEW_MENU_WRAP].set(); else menu[VIEW_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextView::menu_cb(size_t item) { switch (item) { case VIEW_MENU_COPY: kf_copy(Fl::event_key(), this); break; case VIEW_MENU_CLEAR: clear(); break; case VIEW_MENU_SELECT_ALL: tbuf->select(0, tbuf->length()); break; case VIEW_MENU_SAVE: saveFile(); break; case VIEW_MENU_WRAP: set_word_wrap(!wrap, true); break; } } /// Scrolls down if the buffer has been modified and the last line is /// visible. See Fl_Text_Buffer::add_modify_callback() for parameter details. /// /// @param pos /// @param nins /// @param ndel /// @param nsty /// @param dtext /// @param arg /// inline void FTextView::changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg) { FTextView *v = reinterpret_cast(arg); if (v->mTopLineNum + v->mNVisibleLines - 1 == v->mNBufferLines) v->scroll_hint = true; v->buffer_modified_cb(pos, nins, ndel, nsty, dtext, v); } /// Removes Fl_Text_Edit keybindings that would modify text and put it out of /// sync with the style buffer. At some point we may decide that we want /// FTextView to be editable (e.g., to insert comments about a QSO), in which /// case we'll keep the keybindings and add some code to changed_cb to update /// the style buffer. /// void FTextView::change_keybindings(void) { Fl_Text_Editor_mod::Key_Func fdelete[] = { Fl_Text_Editor_mod::kf_default, Fl_Text_Editor_mod::kf_enter, Fl_Text_Editor_mod::kf_delete, Fl_Text_Editor_mod::kf_cut, Fl_Text_Editor_mod::kf_paste }; int n = sizeof(fdelete) / sizeof(fdelete[0]); // walk the keybindings linked list and delete items containing elements // of fdelete loop: for (Fl_Text_Editor_mod::Key_Binding *k = key_bindings; k; k = k->next) { for (int i = 0; i < n; i++) { if (k->function == fdelete[i]) { remove_key_binding(k->key, k->state); goto loop; } } } } // ---------------------------------------------------------------------------- Fl_Menu_Item FTextEdit::menu[] = { { icons::make_icon_label(_("Cut"), edit_cut_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Copy"), edit_copy_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Paste"), edit_paste_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Insert file..."), file_open_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { _("Word wrap"), 0, 0, 0, FL_MENU_TOGGLE | FL_MENU_DIVIDER, FL_NORMAL_LABEL } , { 0 } }; FTextEdit::FTextEdit(int x, int y, int w, int h, const char *l) : FTextBase(x, y, w, h, l) { tbuf->remove_modify_callback(buffer_modified_cb, this); tbuf->add_modify_callback(changed_cb, this); ascii_cnt = 0; ascii_chr = 0; context_menu = menu; init_context_menu(); dnd_paste = false; } /// Handles fltk events for this widget. /// We pass keyboard events to handle_key() and handle mouse3 presses to show /// the popup menu. We also disallow mouse2 events in the transmitted text area. /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextEdit::handle(int event) { if ( !(Fl::event_inside(this) || (event == FL_KEYBOARD && Fl::focus() == this)) ) return FTextBase::handle(event); switch (event) { case FL_KEYBOARD: return handle_key(Fl::event_key()) ? 1 : FTextBase::handle(event); case FL_DND_RELEASE: dnd_paste = true; // fall through case FL_DND_ENTER: case FL_DND_LEAVE: return 1; case FL_DND_DRAG: return handle_dnd_drag(xy_to_position(Fl::event_x(), Fl::event_y(), CHARACTER_POS)); case FL_PASTE: { int r = dnd_paste ? handle_dnd_drop() : FTextBase::handle(event); dnd_paste = false; return r; } case FL_PUSH: { int eb = Fl::event_button(); if (eb == FL_RIGHT_MOUSE) { handle_context_menu(); return 1; } } default: break; } return FTextBase::handle(event); } /// Handles keyboard events to override Fl_Text_Editor_mod's handling of some /// keystrokes. /// /// @param key /// /// @return /// int FTextEdit::handle_key(int key) { // read ctl-ddd, where d is a digit, as ascii characters (in base 10) // and insert verbatim; e.g. ctl-001 inserts a if (Fl::event_state() & FL_CTRL && (isdigit(key) || isdigit(key - FL_KP))) return handle_key_ascii(key); ascii_cnt = 0; // restart the numeric keypad entries. ascii_chr = 0; return 0; } /// Composes ascii characters and adds them to the FTextEdit buffer. /// Control characters are inserted with the CTRL style. Values larger than 127 /// (0x7f) are ignored. We cannot really add NULs for the time being. /// /// @param key A digit character /// /// @return 1 /// int FTextEdit::handle_key_ascii(int key) { if (key >= FL_KP) key -= FL_KP; key -= '0'; ascii_cnt++; for (int i = 0; i < 3 - ascii_cnt; i++) key *= 10; ascii_chr += key; if (ascii_cnt == 3) { if (ascii_chr < 0x100) { char buff[fl_utf8bytes(ascii_chr) + 1]; int utf8cnt = fl_utf8encode(ascii_chr, buff); for ( int i = 0; i < utf8cnt; i++) add(buff[i], (iscntrl(ascii_chr) ? CTRL : RECV)); } ascii_cnt = ascii_chr = 0; } return 1; } /// Handles FL_DND_DRAG events by scrolling and moving the cursor /// /// @return 1 int FTextEdit::handle_dnd_drag(int pos) { // Scroll if the pointer is being dragged inside the scrollbars, // otherwise obtain keyboard focus and set the insert position. if (mVScrollBar->visible() && Fl::event_inside(mVScrollBar)) mVScrollBar->handle(FL_DRAG); else if (mHScrollBar->visible() && Fl::event_inside(mHScrollBar)) mHScrollBar->handle(FL_DRAG); else { if (Fl::focus() != this) take_focus(); insert_position(pos); } return 1; } /// Handles FL_PASTE events by inserting text /// /// @return 1 or FTextBase::handle(FL_PASTE) int FTextEdit::handle_dnd_drop(void) { // paste verbatim if the shift key was held down during dnd if (Fl::event_shift()) return FTextBase::handle(FL_PASTE); std::string text; std::string::size_type p, len; text = Fl::event_text(); const char sep[] = "\n"; #if defined(__APPLE__) || defined(__WOE32__) text += sep; #endif len = text.length(); while ((p = text.find(sep)) != std::string::npos) { text[p] = '\0'; #if !defined(__APPLE__) && !defined(__WOE32__) if (text.find("file://") == 0) { text.erase(0, 7); p -= 7; len -= 7; } #endif #ifndef BUILD_FLARQ if ((text.find(".jpg") != std::string::npos) || (text.find(".JPG") != std::string::npos) || (text.find(".jpeg") != std::string::npos) || (text.find(".JPEG") != std::string::npos) || (text.find(".png") != std::string::npos) || (text.find(".PNG") != std::string::npos) || (text.find(".bmp") != std::string::npos) || (text.find(".BMP") != std::string::npos) ) { LOG_INFO("DnD image %s", text.c_str()); if ((p = text.find("file://")) != std::string::npos) text.erase(0, p + strlen("file://")); if ((p = text.find('\r')) != std::string::npos) text.erase(p); if ((p = text.find('\n')) != std::string::npos) text.erase(p); if (text[text.length()-1] == 0) text.erase(text.length() -1); TxQueINSERTIMAGE(text); return 1; } #endif // paste everything verbatim if we cannot read the first file LOG_INFO("DnD file %s", text.c_str()); if (readFile(text.c_str()) == -1 && len == text.length()) return FTextBase::handle(FL_PASTE); text.erase(0, p + sizeof(sep) - 1); } return 1; } /// Handles mouse-3 clicks by displaying the context menu /// /// @param val /// void FTextEdit::handle_context_menu(void) { bool selected = tbuf->selected(); std::cout << "FTextEdit::tbuf " << (selected ? "selected" : "not selected") << std::endl; icons::set_active(&menu[EDIT_MENU_CUT], selected); icons::set_active(&menu[EDIT_MENU_COPY], selected); icons::set_active(&menu[EDIT_MENU_CLEAR], tbuf->length()); if (wrap) menu[EDIT_MENU_WRAP].set(); else menu[EDIT_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextEdit::menu_cb(size_t item) { switch (item) { case EDIT_MENU_CLEAR: clear(); break; case EDIT_MENU_CUT: kf_cut(0, this); break; case EDIT_MENU_COPY: kf_copy(0, this); break; case EDIT_MENU_PASTE: kf_paste(0, this); break; case EDIT_MENU_READ: readFile(); break; case EDIT_MENU_WRAP: set_word_wrap(!wrap, true); break; default: if (FTextEdit::menu[item].flags == 0) { // not an FL_SUB_MENU add(FTextEdit::menu[item].text[0]); add(FTextEdit::menu[item].text[1]); } } } /// This function is called by Fl_Text_Buffer when the buffer is modified, and /// also by nextChar when a character has been passed up the transmit path. In /// the first case either nins or ndel will be nonzero, and we change a /// corresponding amount of text in the style buffer. /// /// In the latter case, nins, ndel, pos and nsty are all zero and we update the /// style buffer to mark the last character in the buffer with the XMIT /// attribute. /// /// @param pos /// @param nins /// @param ndel /// @param nsty /// @param dtext /// @param arg /// void FTextEdit::changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg) { FTextEdit *e = reinterpret_cast(arg); if (nins == 0 && ndel == 0) { if (nsty == -1) { // called by nextChar to update transmitted text style char s[] = { FTEXT_DEF + XMIT, '\0' }; e->sbuf->replace(pos - 1, pos, s); e->redisplay_range(pos - 1, pos); } else if (nsty > 0) // restyled, e.g. selected, text return e->buffer_modified_cb(pos, nins, ndel, nsty, dtext, e); // No changes, e.g., a paste with an empty clipboard. return; } else if (nins > 0 && e->sbuf->length() < e->tbuf->length()) { // New text not inserted by our add() methods, i.e., via a file // read, mouse-2 paste or, most likely, direct keyboard entry. int n = e->tbuf->length() - e->sbuf->length(); if (n == 1) { char s[] = { FTEXT_DEF, '\0' }; e->sbuf->append(s); } else { char *s = new char [n + 1]; memset(s, FTEXT_DEF, n); s[n] = '\0'; e->sbuf->append(s); delete [] s; } } else if (ndel > 0) e->sbuf->remove(pos, pos + ndel); e->sbuf->select(pos, pos + nins - ndel); e->buffer_modified_cb(pos, nins, ndel, nsty, dtext, e); // We may need to scroll if the text was inserted by the // add() methods, e.g. by a macro if (e->mTopLineNum + e->mNVisibleLines - 1 <= e->mNBufferLines) e->show_insert_position(); } fldigi-4.2.05/src/widgets/Fl_Text_Editor_mod.cxx0000664000175000017500000005570614532252172016476 00000000000000// // "$Id: Fl_Text_Editor_mod.cxx 8034 2010-12-15 12:21:55Z AlbrechtS $" // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include #include #include #include #include "Fl_Text_Editor_mod.H" /* Keyboard Control Matrix key\modifier plain Ctrl Alt Meta left 1/1 13/9 0/13 0/9 right 2/2 14/10 0/14 0/10 up 3/19 21/7 0/15 0/17 down 4/20 22/8 0/16 0/18 home 9/5 17/0 0/0 0/0 end 10/6 18/0 0/0 0/0 page up 11/7 23/0 0/11 0/0 page down 12/8 24/0 0/12 0/0 (FLTK action / OS X action) (adding the shift key extends the selection, all other combinations are no-op) 0: no-op 1: move cursor to the left, at line beginning wrap to end of prev line, at doc start no-op 2: move cursor to the right, at line end move to beginning of the next line, at doc end no-op 3: move cursor up, at doc top no-op 4: move cursor down, at doc bottom no-op 5: scroll display to top of text (cursor unchanged) 6: scroll display to end of text (cursor unchanged) 7: scroll text down one page (cursor unchanged) 8: scroll text up one page (cursor unchanged) 9: move cursor to beginning of line 10: move cursor to end of line 11: move cursor up one page and scroll down 12: move cursor down one page and scroll up 13: move to the beginning of the word or the previous word 14: move to the end of the word or the next word 15: if start of line: start of prev line, else start of this line 16: if end of line: end of next line, else end of this line 17: move cursor to the beginning of the document 18: move cursor to the end of the document 19: move cursor up, at doc top: home, at doc start: no-op) 20: move cursor down, at doc bot: end, at doc end: no-op) 21: scroll text down one line (cursor unchanged) 22: scroll text up one line (cursor unchanged) 23: move cursor to the beginning of the top of the screen 24: move cursor to the beginning of the bottom of the window */ /** The constructor creates a new text editor widget.*/ Fl_Text_Editor_mod::Fl_Text_Editor_mod(int X, int Y, int W, int H, const char* l) : Fl_Text_Display_mod(X, Y, W, H, l) { mCursorOn = 1; insert_mode_ = 1; key_bindings = 0; // handle the default key bindings add_default_key_bindings(&key_bindings); // handle everything else default_key_function(kf_default); } #ifndef FL_DOXYGEN Fl_Text_Editor_mod::Key_Binding* Fl_Text_Editor_mod::global_key_bindings = 0; #endif // These are the default key bindings every widget should start with static struct { int key; int state; Fl_Text_Editor_mod::Key_Func func; } default_key_bindings[] = { { FL_Escape, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_ignore }, { FL_Enter, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_enter }, { FL_KP_Enter, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_enter }, { FL_BackSpace, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_backspace }, { FL_Insert, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_insert }, { FL_Delete, Fl_Text_Editor_mod_ANY_STATE, Fl_Text_Editor_mod::kf_delete }, { FL_Home, 0, Fl_Text_Editor_mod::kf_move }, { FL_End, 0, Fl_Text_Editor_mod::kf_move }, { FL_Left, 0, Fl_Text_Editor_mod::kf_move }, { FL_Up, 0, Fl_Text_Editor_mod::kf_move }, { FL_Right, 0, Fl_Text_Editor_mod::kf_move }, { FL_Down, 0, Fl_Text_Editor_mod::kf_move }, { FL_Page_Up, 0, Fl_Text_Editor_mod::kf_move }, { FL_Page_Down, 0, Fl_Text_Editor_mod::kf_move }, { FL_Home, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_End, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Left, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Up, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Right, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Down, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Page_Up, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Page_Down, FL_SHIFT, Fl_Text_Editor_mod::kf_shift_move }, { FL_Home, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_End, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Left, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Up, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Right, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Down, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Page_Up, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Page_Down, FL_CTRL, Fl_Text_Editor_mod::kf_ctrl_move }, { FL_Home, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_End, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Left, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Up, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Right, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Down, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Page_Up, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, { FL_Page_Down, FL_CTRL|FL_SHIFT, Fl_Text_Editor_mod::kf_c_s_move }, //{ FL_Clear, 0, Fl_Text_Editor_mod::delete_to_eol }, { 'z', FL_CTRL, Fl_Text_Editor_mod::kf_undo }, { '/', FL_CTRL, Fl_Text_Editor_mod::kf_undo }, { 'x', FL_CTRL, Fl_Text_Editor_mod::kf_cut }, { FL_Delete, FL_SHIFT, Fl_Text_Editor_mod::kf_cut }, { 'c', FL_CTRL, Fl_Text_Editor_mod::kf_copy }, { FL_Insert, FL_CTRL, Fl_Text_Editor_mod::kf_copy }, { 'v', FL_CTRL, Fl_Text_Editor_mod::kf_paste }, { FL_Insert, FL_SHIFT, Fl_Text_Editor_mod::kf_paste }, { 'a', FL_CTRL, Fl_Text_Editor_mod::kf_select_all }, #ifdef __APPLE__ // Define CMD+key accelerators... { 'z', FL_COMMAND, Fl_Text_Editor_mod::kf_undo }, { 'x', FL_COMMAND, Fl_Text_Editor_mod::kf_cut }, { 'c', FL_COMMAND, Fl_Text_Editor_mod::kf_copy }, { 'v', FL_COMMAND, Fl_Text_Editor_mod::kf_paste }, { 'a', FL_COMMAND, Fl_Text_Editor_mod::kf_select_all }, { FL_Left, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Right, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Up, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Down, FL_COMMAND, Fl_Text_Editor_mod::kf_meta_move }, { FL_Left, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, { FL_Right, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, { FL_Up, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, { FL_Down, FL_COMMAND|FL_SHIFT, Fl_Text_Editor_mod::kf_m_s_move }, #endif // __APPLE__ { 0, 0, 0 } }; /** Adds all of the default editor key bindings to the specified key binding list.*/ void Fl_Text_Editor_mod::add_default_key_bindings(Key_Binding** list) { for (int i = 0; default_key_bindings[i].key; i++) { add_key_binding(default_key_bindings[i].key, default_key_bindings[i].state, default_key_bindings[i].func, list); } } /** Returns the function associated with a key binding.*/ Fl_Text_Editor_mod::Key_Func Fl_Text_Editor_mod::bound_key_function(int key, int state, Key_Binding* list) { Key_Binding* cur; for (cur = list; cur; cur = cur->next) if (cur->key == key) if (cur->state == Fl_Text_Editor_mod_ANY_STATE || cur->state == state) break; if (!cur) return 0; return cur->function; } /** Removes all of the key bindings associated with the text editor or list.*/ void Fl_Text_Editor_mod::remove_all_key_bindings(Key_Binding** list) { Key_Binding *cur, *next; for (cur = *list; cur; cur = next) { next = cur->next; delete cur; } *list = 0; } /** Removes the key binding associated with the key "key" of state "state" */ void Fl_Text_Editor_mod::remove_key_binding(int key, int state, Key_Binding** list) { Key_Binding *cur, *last = 0; for (cur = *list; cur; last = cur, cur = cur->next) if (cur->key == key && cur->state == state) break; if (!cur) return; if (last) last->next = cur->next; else *list = cur->next; delete cur; } /** Adds a key of state "state" with the function "function" */ void Fl_Text_Editor_mod::add_key_binding(int key, int state, Key_Func function, Key_Binding** list) { Key_Binding* kb = new Key_Binding; kb->key = key; kb->state = state; kb->function = function; kb->next = *list; *list = kb; } //////////////////////////////////////////////////////////////// static void kill_selection(Fl_Text_Editor_mod* e) { if (e->buffer()->selected()) { e->insert_position(e->buffer()->primary_selection()->start()); e->buffer()->remove_selection(); } } /** Inserts the text associated with the key */ int Fl_Text_Editor_mod::kf_default(int c, Fl_Text_Editor_mod* e) { // FIXME: this function is a mess! Fix this! if (!c || (!isprint(c) && c != '\t')) return 0; char s[2] = "\0"; s[0] = (char)c; kill_selection(e); if (e->insert_mode()) e->insert(s); else e->overstrike(s); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Ignores the keypress */ int Fl_Text_Editor_mod::kf_ignore(int, Fl_Text_Editor_mod*) { return 0; // don't handle } /** Does a backspace in the current buffer.*/ int Fl_Text_Editor_mod::kf_backspace(int, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected() && e->move_left()) { int p1 = e->insert_position(); int p2 = e->buffer()->next_char(p1); e->buffer()->select(p1, p2); } kill_selection(e); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Inserts a newline at the current cursor position */ int Fl_Text_Editor_mod::kf_enter(int, Fl_Text_Editor_mod* e) { kill_selection(e); e->insert("\n"); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } extern void fl_text_drag_me(int pos, Fl_Text_Display_mod* d); /** Moves the text cursor in the direction indicated by key c.*/ int Fl_Text_Editor_mod::kf_move(int c, Fl_Text_Editor_mod* e) { int i; int selected = e->buffer()->selected(); if (!selected) e->dragPos = e->insert_position(); e->buffer()->unselect(); Fl::copy("", 0, 0); switch (c) { case FL_Home: e->insert_position(e->buffer()->line_start(e->insert_position())); break; case FL_End: e->insert_position(e->buffer()->line_end(e->insert_position())); break; case FL_Left: e->move_left(); break; case FL_Right: e->move_right(); break; case FL_Up: e->move_up(); break; case FL_Down: e->move_down(); break; case FL_Page_Up: for (i = 0; i < e->mNVisibleLines - 1; i++) e->move_up(); break; case FL_Page_Down: for (i = 0; i < e->mNVisibleLines - 1; i++) e->move_down(); break; } e->show_insert_position(); return 1; } /** Extends the current selection in the direction of key c.*/ int Fl_Text_Editor_mod::kf_shift_move(int c, Fl_Text_Editor_mod* e) { kf_move(c, e); fl_text_drag_me(e->insert_position(), e); char *copy = e->buffer()->selection_text(); if (copy) { Fl::copy(copy, strlen(copy), 0); free(copy); } return 1; } /** Moves the current text cursor in the direction indicated by control key */ int Fl_Text_Editor_mod::kf_ctrl_move(int c, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) e->dragPos = e->insert_position(); if (c != FL_Up && c != FL_Down) { e->buffer()->unselect(); Fl::copy("", 0, 0); e->show_insert_position(); } switch (c) { case FL_Home: e->insert_position(0); e->scroll(0, 0); break; case FL_End: e->insert_position(e->buffer()->length()); e->scroll(e->count_lines(0, e->buffer()->length(), 1), 0); break; case FL_Left: e->previous_word(); break; case FL_Right: e->next_word(); break; case FL_Up: e->scroll(e->mTopLineNum-1, e->mHorizOffset); break; case FL_Down: e->scroll(e->mTopLineNum+1, e->mHorizOffset); break; case FL_Page_Up: e->insert_position(e->mLineStarts[0]); break; case FL_Page_Down: e->insert_position(e->mLineStarts[e->mNVisibleLines-2]); break; } return 1; } /** Moves the current text cursor in the direction indicated by meta key */ int Fl_Text_Editor_mod::kf_meta_move(int c, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) e->dragPos = e->insert_position(); if (c != FL_Up && c != FL_Down) { e->buffer()->unselect(); Fl::copy("", 0, 0); e->show_insert_position(); } switch (c) { case FL_Up: // top of buffer e->insert_position(0); e->scroll(0, 0); break; case FL_Down: // end of buffer e->insert_position(e->buffer()->length()); e->scroll(e->count_lines(0, e->buffer()->length(), 1), 0); break; case FL_Left: // beginning of line kf_move(FL_Home, e); break; case FL_Right: // end of line kf_move(FL_End, e); break; } return 1; } /** Extends the current selection in the direction indicated by meta key c. */ int Fl_Text_Editor_mod::kf_m_s_move(int c, Fl_Text_Editor_mod* e) { kf_meta_move(c, e); fl_text_drag_me(e->insert_position(), e); return 1; } /** Extends the current selection in the direction indicated by control key c. */ int Fl_Text_Editor_mod::kf_c_s_move(int c, Fl_Text_Editor_mod* e) { kf_ctrl_move(c, e); fl_text_drag_me(e->insert_position(), e); return 1; } /** Moves the text cursor to the beginning of the current line.*/ int Fl_Text_Editor_mod::kf_home(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Home, e); } /** Moves the text cursor to the end of the current line.*/ int Fl_Text_Editor_mod::kf_end(int, Fl_Text_Editor_mod* e) { return kf_move(FL_End, e); } /** Moves the text cursor one character to the left.*/ int Fl_Text_Editor_mod::kf_left(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Left, e); } /** Moves the text cursor one line up.*/ int Fl_Text_Editor_mod::kf_up(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Up, e); } /** Moves the text cursor one character to the right.*/ int Fl_Text_Editor_mod::kf_right(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Right, e); } /** Moves the text cursor one line down.*/ int Fl_Text_Editor_mod::kf_down(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Down, e); } /** Moves the text cursor up one page.*/ int Fl_Text_Editor_mod::kf_page_up(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Page_Up, e); } /** Moves the text cursor down one page.*/ int Fl_Text_Editor_mod::kf_page_down(int, Fl_Text_Editor_mod* e) { return kf_move(FL_Page_Down, e); } /** Toggles the insert mode in the text editor.*/ int Fl_Text_Editor_mod::kf_insert(int, Fl_Text_Editor_mod* e) { e->insert_mode(e->insert_mode() ? 0 : 1); return 1; } /** Does a delete of selected text or the current character in the current buffer.*/ int Fl_Text_Editor_mod::kf_delete(int, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) { int p1 = e->insert_position(); int p2 = e->buffer()->next_char(p1); e->buffer()->select(p1, p2); } kill_selection(e); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Does a copy of selected text or the current character in the current buffer.*/ int Fl_Text_Editor_mod::kf_copy(int, Fl_Text_Editor_mod* e) { if (!e->buffer()->selected()) return 1; const char *copy = e->buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 1); free((void*)copy); e->show_insert_position(); return 1; } /** Does a cut of selected text in the current buffer.*/ int Fl_Text_Editor_mod::kf_cut(int c, Fl_Text_Editor_mod* e) { kf_copy(c, e); kill_selection(e); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Does a paste of selected text in the current buffer.*/ int Fl_Text_Editor_mod::kf_paste(int, Fl_Text_Editor_mod* e) { kill_selection(e); Fl::paste(*e, 1); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return 1; } /** Selects all text in the current buffer.*/ int Fl_Text_Editor_mod::kf_select_all(int, Fl_Text_Editor_mod* e) { e->buffer()->select(0, e->buffer()->length()); const char *copy = e->buffer()->selection_text(); if (*copy) Fl::copy(copy, strlen(copy), 0); free((void*)copy); return 1; } /** Undo last edit in the current buffer. Also deselect previous selection. */ int Fl_Text_Editor_mod::kf_undo(int , Fl_Text_Editor_mod* e) { e->buffer()->unselect(); Fl::copy("", 0, 0); int crsr; int ret = e->buffer()->undo(&crsr); e->insert_position(crsr); e->show_insert_position(); e->set_changed(); if (e->when()&FL_WHEN_CHANGED) e->do_callback(); return ret; } /** Handles a key press in the editor */ int Fl_Text_Editor_mod::handle_key() { // Call FLTK's rules to try to turn this into a printing character. // This uses the right-hand ctrl key as a "compose prefix" and returns // the changes that should be made to the text, as a number of // bytes to delete and a string to insert: int del = 0; if (Fl::compose(del)) { if (del) { int dp = insert_position(), di = del; while (di--) dp = buffer()->prev_char_clipped(dp); buffer()->select(dp, insert_position()); } kill_selection(this); if (Fl::event_length()) { if (insert_mode()) insert(Fl::event_text()); else overstrike(Fl::event_text()); } show_insert_position(); set_changed(); if (when()&FL_WHEN_CHANGED) do_callback(); return 1; } int key = Fl::event_key(), state = Fl::event_state(), c = Fl::event_text()[0]; state &= FL_SHIFT|FL_CTRL|FL_ALT|FL_META; // only care about these states Key_Func f; f = bound_key_function(key, state, global_key_bindings); if (!f) f = bound_key_function(key, state, key_bindings); if (f) return f(key, this); if (default_key_function_ && !state) return default_key_function_(c, this); return 0; } /** does or does not a callback according to changed() and when() settings */ void Fl_Text_Editor_mod::maybe_do_callback() { // printf("Fl_Text_Editor_mod::maybe_do_callback()\n"); // printf("changed()=%d, when()=%x\n", changed(), when()); if (changed() || (when()&FL_WHEN_NOT_CHANGED)) do_callback(); } int Fl_Text_Editor_mod::handle(int event) { static int dndCursorPos; if (!buffer()) return 0; switch (event) { case FL_FOCUS: show_cursor(mCursorOn); // redraws the cursor if (buffer()->selected()) redraw(); // Redraw selections... Fl::focus(this); return 1; case FL_UNFOCUS: show_cursor(mCursorOn); // redraws the cursor if (buffer()->selected()) redraw(); // Redraw selections... case FL_HIDE: if (when() & FL_WHEN_RELEASE) maybe_do_callback(); return 1; case FL_KEYBOARD: if (active_r() && window() && this == Fl::belowmouse()) window()->cursor(FL_CURSOR_NONE); return handle_key(); case FL_PASTE: if (!Fl::event_text()) { fl_beep(); return 1; } buffer()->remove_selection(); if (insert_mode()) insert(Fl::event_text()); else overstrike(Fl::event_text()); show_insert_position(); set_changed(); if (when()&FL_WHEN_CHANGED) do_callback(); return 1; case FL_ENTER: // MRS: WIN32 only? Need to test! // case FL_MOVE: show_cursor(mCursorOn); return 1; case FL_PUSH: if (Fl::event_button() == 2) { // don't let the text_display see this event if (Fl_Group::handle(event)) return 1; dragType = DRAG_NONE; if(buffer()->selected()) { buffer()->unselect(); } int pos = xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS); insert_position(pos); Fl::paste(*this, 0); Fl::focus(this); set_changed(); if (when()&FL_WHEN_CHANGED) do_callback(); return 1; } break; case FL_SHORTCUT: if (!(shortcut() ? Fl::test_shortcut(shortcut()) : test_shortcut())) return 0; if (Fl::visible_focus() && handle(FL_FOCUS)) { Fl::focus(this); return 1; } break; // Handle drag'n'drop attempt by the user. This is a simplified // implementation which allows dnd operations onto the scroll bars. case FL_DND_ENTER: // save the current cursor position if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this); show_cursor(mCursorOn); dndCursorPos = insert_position(); /* fall through */ case FL_DND_DRAG: // show a temporary insertion cursor insert_position(xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS)); return 1; case FL_DND_LEAVE: // restore original cursor insert_position(dndCursorPos); return 1; case FL_DND_RELEASE: // keep insertion cursor and wait for the FL_PASTE event buffer()->unselect(); // FL_PASTE must not destroy current selection! return 1; } return Fl_Text_Display_mod::handle(event); } // // End of "$Id: Fl_Text_Editor_mod.cxx 8034 2010-12-15 12:21:55Z AlbrechtS $". // fldigi-4.2.05/src/widgets/flmisc.cxx0000664000175000017500000002215514611711171014226 00000000000000// ---------------------------------------------------------------------------- // flmisc.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "flmisc.h" #include "pixmaps.h" unsigned quick_choice_menu(const char* title, unsigned sel, const Fl_Menu_Item* menu) { unsigned n = menu->size(); sel = CLAMP(sel - 1, 0, n - 1); int t = Fl_Tooltip::enabled(); Fl_Tooltip::disable(); const Fl_Menu_Item* p = menu->popup(Fl::event_x(), Fl::event_y(), title, menu + sel); Fl_Tooltip::enable(t); return p ? p - menu + 1 : 0; } unsigned quick_choice(const char* title, unsigned sel, ...) { const char* item; const Fl_Menu_Item* menu = NULL; Fl_Menu_Item* p = NULL; va_list ap; va_start(ap, sel); for (size_t n = 0; (item = va_arg(ap, const char*)); n++) { if ((p = (Fl_Menu_Item*)realloc(p, (n+2) * sizeof(Fl_Menu_Item))) == NULL) { free((Fl_Menu_Item*)menu); va_end(ap); return 0; } memset(p + n, 0, 2 * sizeof(Fl_Menu_Item)); p[n].label(item); p[n+1].label(NULL); menu = p; } va_end(ap); sel = quick_choice_menu(title, sel, menu); free(p); return sel; } // Adjust and return fg color to ensure good contrast with bg Fl_Color adjust_color(Fl_Color fg, Fl_Color bg) { Fl_Color adj; unsigned max = 24; while ((adj = fl_contrast(fg, bg)) != fg && max--) fg = (adj == FL_WHITE) ? fl_color_average(fg, FL_WHITE, .9) : fl_color_average(fg, FL_BLACK, .9); return fg; } // invert colour (bg1r, bg1g, bg1b); return def if new colour does not make // good contrast with bg2 void adjust_color_inv(unsigned char& bg1r, unsigned char& bg1g, unsigned char& bg1b, Fl_Color bg2, Fl_Color def) { bg1r = 255 - bg1r; bg1g = 255 - bg1g; bg1b = 255 - bg1b; Fl_Color adj = fl_rgb_color(bg1r, bg1g, bg1b); if (fl_contrast(adj, bg2) != adj) Fl::get_color((def >= 1 ? def : adj), bg1r, bg1g, bg1b); } #if !defined(__APPLE__) && !defined(__WOE32__) && USE_X # include # include # include void make_pixmap(Pixmap *xpm, const char **data, int argc, char** argv) { // We need a displayed window to provide a GC for X_CreatePixmap Fl_Window w(0, 0, PACKAGE_NAME); w.xclass(PACKAGE_NAME); w.border(0); w.show(argc, argv); Fl_Pixmap icon(data); int maxd = MAX(icon.w(), icon.h()); w.make_current(); *xpm = fl_create_offscreen(maxd, maxd); w.hide(); fl_begin_offscreen(*xpm); // Fl_Color(FL_BACKGROUND_COLOR); // fl_rectf(0, 0, maxd, maxd); icon.draw(maxd - icon.w(), maxd - icon.h()); fl_end_offscreen(); } #endif dialog_positions notify_dialog::positions[11] = { {0, 50, 50}, //0 {0, 150, 200}, //1 {0, 200, 350}, //2 {0, 150, 50}, //3 {0, 150, 200}, //4 {0, 200, 350}, //5 {0, 250, 50}, //6 {0, 350, 200}, //7 {0, 450, 350}, //8 {0, 350, 50}, //9 {0, 400, 300} //10 centered on screen, all dialogs past 10 }; notify_dialog::notify_dialog(int X, int Y) : Fl_Window(X, Y, 410, 103, ""), icon(10, 10, 50, 50), message(70, 25, 330, 35), dial(277, 70, 23, 23), button(309, 70, 90, 23, "Close"), resize_box(399, 26, 1, 1) { set_non_modal(); for (dialog_number = 0; dialog_number < 10; dialog_number++) if (positions[dialog_number].used == 0) break; positions[dialog_number].used = 1; position (positions[dialog_number].X, positions[dialog_number].Y); icon.image(new Fl_Pixmap(dialog_information_48_icon)); message.type (FL_MULTILINE_OUTPUT); message.box (FL_FLAT_BOX); message.color (FL_BACKGROUND_COLOR); button.callback (button_cb); newx = button.x(); dial.box(FL_FLAT_BOX); dial.type(FL_FILL_DIAL); dial.selection_color(adjust_color(fl_lighter(FL_BACKGROUND_COLOR), FL_BACKGROUND_COLOR)); dial.angle1(180); dial.angle2(-180); dial.minimum(0.0); user_button = (Fl_Button *)0; xclass(PACKAGE_TARNAME); resizable(resize_box); end(); hide(); } notify_dialog::~notify_dialog() { Fl::remove_timeout(dial_timer, &dial); this->hide(); delete icon.image(); delete user_button; positions[dialog_number].used = 0; } int notify_dialog::handle(int event) { if (event == FL_PUSH) { dial.hide(); return Fl_Window::handle(event); } return Fl_Window::handle(event); } void notify_dialog::button_cb(Fl_Widget* w, void*) { w->window()->hide(); } void notify_dialog::dial_timer(void* arg) { Fl_Dial* dial = reinterpret_cast(arg); double v = dial->value(); if (!dial->visible()) return; if (v == dial->minimum()) return dial->window()->hide(); dial->value(dial->clamp(v - 0.05)); return Fl::repeat_timeout(0.05, dial_timer, arg); } Fl_Button* notify_dialog::make_button(int W, int H) { Fl_Group* cur = Fl_Group::current(); Fl_Group::current(this); if (user_button) return user_button; int pad = 10; int X = newx - pad - W; if (X - pad - dial.w() > 0) { user_button = new Fl_Button(newx = X, button.y(), W, H); dial.position(user_button->x() - dial.w() - pad, dial.y()); } Fl_Group::current(cur); return user_button; } void notify_dialog::notify(const char* msg, double timeout) { message.value(msg); _timeout = timeout; const char* p; if ((p = strchr(msg, '\n'))) { // use first line as label std::string l(msg, p - msg); copy_label(l.c_str()); } else label("Notification"); fl_font(message.textfont(), message.textsize()); int H = 0; for (const char* p = msg; (p = strchr(p, '\n')); p++) H++; int nuh = 103 + std::max(H-1, 0) * fl_height(); resize(x(), y(), w(), nuh); } void show_notifier(notify_dialog *me) { if (me->_timeout > 0.0) { me->dial.maximum(me->_timeout); me->dial.value(me->_timeout); me->dial.show(); Fl::add_timeout(0.0, notify_dialog::dial_timer, &me->dial); } else me->dial.hide(); me->button.take_focus(); me->show(); } // ============================================================================= #ifdef BUILD_FLDIGI #include "icons.h" #include "gettext.h" Mode_Browser::Mode_Browser(void) : Fl_Double_Window(170, 460), changed_cb(NULL), changed_args(NULL) { int bw = 80, bh = 20, pad = 2; modes = new Fl_Check_Browser(pad, pad, w() - pad, h() - 2 * (bh + 2 * pad)); for (int i = 0; i < NUM_MODES; i++) modes->add(mode_info[i].name); modes->callback(modes_cb, this); modes->when(FL_WHEN_CHANGED); all_button = new Fl_Button(modes->x(), modes->y() + modes->h() + pad, bw, bh, _("Select All")); all_button->callback(button_cb, this); none_button = new Fl_Button(all_button->x(), all_button->y() + all_button->h() + pad, all_button->w(), all_button->h(), _("Clear All")); none_button->callback(button_cb, this); close_button = new Fl_Button(w() - none_button->w() - pad, none_button->y(), none_button->w(), none_button->h(), icons::make_icon_label(_("Close"), close_icon)); icons::set_icon_label(close_button); close_button->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); close_button->callback(button_cb, this); end(); resizable(modes); xclass(PACKAGE_TARNAME); } Mode_Browser::~Mode_Browser(void) { icons::free_icon_label(close_button); delete close_button; delete all_button; delete none_button; delete modes; } #define FLTK_VER (FLDIGI_FLTK_API_MAJOR * 10000 + FLDIGI_FLTK_API_MINOR * 100 + FLDIGI_FLTK_API_PATCH) void Mode_Browser::show_(mode_set_t* b) { store = b; modes->check_none(); for (size_t i = 0; i < b->size(); i++) modes->checked(i + 1, store->test(i)); #if (FLTK_VER >= 10400) modes->vposition(0); #else modes->position(0); #endif Fl_Double_Window::show(); } void Mode_Browser::callback(Fl_Callback* cb, void* args) { changed_cb = cb; changed_args = args; } void Mode_Browser::modes_cb(Fl_Widget* w, void* arg) { Mode_Browser* m = static_cast(arg); int sel = m->modes->value(); m->store->set(sel - 1, m->modes->checked(sel)); if (m->changed_cb) m->changed_cb(m, m->changed_args); } void Mode_Browser::button_cb(Fl_Widget* w, void* arg) { Mode_Browser* m = static_cast(arg); if (w == m->close_button) m->hide(); else { if (w == m->all_button) { m->store->set(); m->modes->check_all(); } else { m->store->reset(); m->modes->check_none(); } if (m->changed_cb) m->changed_cb(m, m->changed_args); } } #endif // BUILD_FLDIGI fldigi-4.2.05/src/widgets/vumeter.cxx0000664000175000017500000001063014611711171014433 00000000000000// // vumeter.cxx // // vumeter bar widget routines. // // A part of the fldigi. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "vumeter.h" #define min(a,b) ((a) <= (b) ? (a) : (b) ) #define max(a,b) ((a) >= (b) ? (a) : (b) ) // // vumeter is a vumeter bar widget based off Fl_Widget that shows a // standard vumeter bar in horizontal format const char * vumeter::meter_face_A = "|.-120.-110.-100..-90..-80..-70..-60..-50..-40..-30..-20..-10...|"; const char * vumeter::meter_face_B = "|..-30..-20..-10....0...10...20...30...40...50...60...70...80...|"; void vumeter::draw() { int bx, by, bw;//, bh; // Box areas... int tx, tw, th; // Temporary X + width int meter_width, meter_height; // Get the box borders... bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); // bh = Fl::box_dh(box()); // Defne the inner box tx = x() + bx; tw = w() - bw; th = h() - 2 * by - 2;//bh; // Determine optimal meter face height int fsize = 1; fl_font(FL_COURIER, fsize); meter_height = fl_height(); while (meter_height < th) { fsize++; fsize++; fl_font(FL_COURIER, fsize); meter_height = fl_height(); } fsize--; fl_font(FL_COURIER, fsize); meter_height = fl_height(); // Find visible scale const char *meter = meter_face; if (meter == meter_face_A) { minimum_ = -130; maximum_ = 0; } else { minimum_ = -40; maximum_ = 90; } meter_width = fl_width(meter); while (meter_width > tw && *meter != 0) { meter++; meter_width = fl_width(meter); minimum_ += 2; } int mwidth = round(meter_width * (value_ - minimum_) / (maximum_ - minimum_)); int PeakPos = round (meter_width * (peakv_ - minimum_) / (maximum_ - minimum_)); mwidth = max ( min ( mwidth, meter_width), 0 ); PeakPos = max ( min ( PeakPos, meter_width), 0 ); // Draw the box and label... fl_push_clip(x(), y(), w(), h()); draw_box(box(), x(), y(), w(), h(), bgnd_); draw_box(FL_FLAT_BOX, tx, y() + by, tw, th, bgnd_); if (mwidth > 0) { draw_box(FL_FLAT_BOX, tx + (w() - meter_width) / 2, y() + by + (th - meter_height) / 2 + 1, mwidth, meter_height, fgnd_); draw_box(FL_FLAT_BOX, tx + (w() - meter_width) / 2 + PeakPos, y() + by + (th - meter_height) / 2 + 1, 2, meter_height, peak_color); } label(meter); labelfont(FL_COURIER); labelsize(fsize); labelcolor(scale_color); draw_label(); fl_pop_clip(); } vumeter::vumeter(int X, int Y, int W, int H, const char *label) : Fl_Widget(X, Y, W, H, "") { align(FL_ALIGN_INSIDE); box(FL_DOWN_BOX); bgnd_ = FL_BACKGROUND2_COLOR; fgnd_ = FL_GREEN; peak_color = FL_RED; scale_color = FL_BLACK; meter_face = meter_face_A; minimum_ = -100.0; maximum_ = 0.0; value_ = -50; avg_ = 10; aging_ = 10; clear(); cbFunc = 0; } void vumeter::value(double v) { double val; double peak = 0; if (v < 1e-9) v = 1e-9; for (int i = 1; i < aging_; i++) { peak_[i-1] = peak_[i]; if (peak < peak_[i]) peak = peak_[i]; } peak_[aging_ - 1] = v; if (peak > v) peak = v; val = v; for (int i = 1; i < avg_; i++) val += (vals_[i-1] = vals_[i]); vals_[avg_-1] = v; val /= avg_; value_ = 20 * log10(val); peakv_ = 20 * log10(peak); if (meter_face == meter_face_B) { value_ += 90; peakv_ += 90; } redraw(); } double vumeter::value() { return (value_); } void vumeter::aging (int n) { if (n <= 10 && n > 0) aging_ = n; else aging_ = 5; for (int i = 0; i < aging_; i++) peak_[i] = peakv_; } void vumeter::avg (int n) { if (n <= 10 && n > 0) avg_ = n; else avg_ = 5; for (int i = 0; i < avg_; i++) vals_[i] = value_ / avg_; } void vumeter::clear () { for (int i = 0; i < 10; i++) { vals_[i] = peak_[i] = 0; } peakv_ = value_ = 0; } // // End of vumeter.cxx // fldigi-4.2.05/src/widgets/plot_xy.cxx0000664000175000017500000001405414611711171014446 00000000000000// --------------------------------------------------------------------- // plot_xy.cxx // // Copyright (C) 2019 // David Freese, W1HKJ // // This is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // --------------------------------------------------------------------- #include #include #include #include "plot_xy.h" plot_xy::plot_xy (int X, int Y, int W, int H, const char *lbl) : Fl_Widget (X, Y, W, H, lbl) { _bk_color = FL_BACKGROUND2_COLOR; _axis_color = FL_BLACK; _color_1 = FL_DARK_RED; _color_2 = FL_GREEN; _legend_color = FL_BLACK; color(_bk_color); _len_1 = PLOT_XY_MAX_LEN; _len_2 = PLOT_XY_MAX_LEN; buf_1 = new PLOT_XY[PLOT_XY_MAX_LEN]; buf_2 = new PLOT_XY[PLOT_XY_MAX_LEN]; xmin = 0; xmax = 10.0; x_graticule = 2.0; ymin = 0; ymax = 10.0; y_graticule = 2.0; x_legend = y_legend = true; sx_legend.clear(); sy_legend.clear(); _show_1 = true; _show_2 = true; _thick_lines = false; } plot_xy::~plot_xy() { delete [] buf_1; delete [] buf_2; } void plot_xy::data_1(PLOT_XY *data, int len) { if (data == 0 || len == 0) { for (int n = 0; n < PLOT_XY_MAX_LEN; n++) { buf_1[n].x = 0; buf_1[n].y = ymax * 2; } _len_1 = 0; } else { _len_1 = (len > PLOT_XY_MAX_LEN ) ? PLOT_XY_MAX_LEN : len; for (int n = 0; n < _len_1; n++) buf_1[PLOT_XY_MAX_LEN - _len_1 + n] = data[n]; } } void plot_xy::data_2(PLOT_XY *data, int len) { if (data == 0 || len == 0) { for (int n = 0; n < PLOT_XY_MAX_LEN; n++) { buf_2[n].x = 0; buf_2[n].y = ymax * 2; } _len_2 = 0; } else { _len_2 = (len > PLOT_XY_MAX_LEN ) ? PLOT_XY_MAX_LEN : len; for (int n = 0; n < _len_2; n++) buf_2[PLOT_XY_MAX_LEN - _len_2 + n] = data[n]; } } void plot_xy::draw() { draw_box(); int X, Y, W, H; X = x() + 2; Y = y() + 2; W = w() - 4; H = h() - 4; fl_clip(X, Y, W, H); fl_color(_bk_color); fl_rectf(X, Y, W, H); fl_push_matrix(); if (y_legend) { X += 45; W -= 50; } else { X += 5; W -= 10; } if (x_legend) { Y += 10; H -= 30; } else { Y += 5; H -= 10; } fl_translate( X, (Y + H)); fl_scale (1.0 * W / (xmax - xmin), -1.0 * H / (ymax - ymin)); // horizontal & vertical grids fl_line_style(FL_SOLID, 0, NULL); fl_color(_axis_color); // vertical graticules for (int n = 0; n <= x_graticule; n++) { fl_begin_line(); fl_vertex((xmax - xmin)*n/x_graticule, 0); fl_vertex((xmax - xmin)*n/x_graticule, (ymax - ymin)); fl_end_line(); } // horizontal graticules for (int n = 0; n <= y_graticule; n++) { fl_begin_line(); fl_vertex(0, (ymax - ymin)*n/y_graticule); fl_vertex((xmax-xmin), (ymax - ymin)*n/y_graticule); fl_end_line(); } // data float xp, yp, xp1, yp1; xp = 0; yp = 0; xp1 = 1.0; yp1 = 1.0; int xs = 0; // line 1 if (_show_1) { xs = PLOT_XY_MAX_LEN - _len_1; fl_color(_color_1); yp = buf_1[xs].y; xp = buf_1[xs].x; for (int i = 1; i < _len_1; i++) { yp1 = buf_1[xs + i].y; xp1 = buf_1[xs + i].x; if (yp == 0 && yp1 == 0 && !_plot_over_axis) { fl_color (_axis_color); fl_line_style(FL_SOLID, 0, NULL); } else { fl_color (_color_1); if (_thick_lines) fl_line_style(FL_SOLID, 2, NULL); } if (yp > ymin && yp < ymax && yp1 > ymin && yp1 < ymax) { fl_begin_line(); if (xreverse) { fl_vertex(xmax - xp, yp - ymin); fl_vertex(xmax - xp1, yp - ymin); } else { fl_vertex(xp - xmin, yp - ymin); fl_vertex(xp1 - xmin, yp1 - ymin); } fl_end_line(); } xp = xp1; yp = yp1; } } // line 2 if (_show_2) { xs = PLOT_XY_MAX_LEN - _len_2; fl_color(_color_2); yp = buf_2[xs].y; xp = buf_2[xs].x; for (int i = 1; i < _len_2; i++) { yp1 = buf_2[xs + i].y; xp1 = buf_2[xs + i].x; if (yp == 0 && yp1 == 0 && !_plot_over_axis) { fl_color (_axis_color); fl_line_style(FL_SOLID, 0, NULL); } else { fl_color (_color_2); if (_thick_lines) fl_line_style(FL_SOLID, 2, NULL); } if (yp > ymin && yp < ymax && yp1 > ymin && yp1 < ymax) { fl_begin_line(); if (xreverse) { fl_vertex(xmax - xp, yp - ymin); fl_vertex(xmax - xp1, yp - ymin); } else { fl_vertex(xp - xmin, yp - ymin); fl_vertex(xp1 - xmin, yp1 - ymin); } fl_end_line(); } xp = xp1; yp = yp1; } } fl_pop_matrix(); fl_line_style(FL_SOLID, 0, NULL); // legends fl_color(_legend_color); fl_font(FL_COURIER, 12); int lbl_w = fl_width("XX") + 2; int lbl_h = fl_height(); if (x_legend && !sx_legend.empty()) { std::string tmp = sx_legend; std::string lgnd; float xd = 0, yd = Y + H + 20 - lbl_h/2; size_t p = tmp.find("|"); for (int n = 0; n <= x_graticule; n++) { if (tmp.empty()) break; lgnd = tmp.substr(0,p); lbl_w = fl_width(lgnd.c_str()); if (xreverse) xd = X + W - n * W / x_graticule - lbl_w / 2; else xd = X + n * W / x_graticule - lbl_w / 2; if (lgnd != " ") fl_draw(lgnd.c_str(), xd, yd); tmp.erase(0, p+1); p = tmp.find("|"); } } if (y_legend && !sy_legend.empty()) { std::string tmp = sy_legend; size_t p = tmp.find("|"); std::string lgnd; float xd, yd; for (int n = 0; n <= y_graticule; n++) { if (tmp.empty()) break; lgnd = tmp.substr(0,p); lbl_w = fl_width(lgnd.c_str()); xd = X - lbl_w - 4; yd = Y + H * (1 - n / y_graticule) + lbl_h / 3; if (lgnd != " ") fl_draw(lgnd.c_str(), xd, yd); tmp.erase(0, p+1); p = tmp.find("|"); } } fl_pop_clip(); } int plot_xy::handle(int event) { if (!Fl::event_inside(this)) return 0; return 1; } void plot_xy::resize(int x, int y, int w, int h) { Fl_Widget::resize(x, y, w, h); } fldigi-4.2.05/src/widgets/progress.cxx0000664000175000017500000000623514532252172014621 00000000000000// // progress.cxx // // Progress bar widget routines. // // Based on Fl_Progress widget, Copyright 2000-2005 by Michael Sweet. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "progress.h" // // progress is a progress bar widget based off Fl_Widget that shows a // standard progress bar in either horizontal or vertical format // // if direction == VERTICAL the indicator goes from lower to upper // if direction == HORIZONTAL the indicator goes from left to right void Progress::draw() { int progress; // Size of progress bar... int bx, by, bw, bh; // Box areas... int tx, tw; // Temporary X + width int th; // Get the box borders... bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = x() + bx; tw = w() - bw; th = h() - bh; // Draw the progress bar... if (maximum_ > minimum_) progress = (int)((direction == HORIZONTAL ? tw : th) * (value_ - minimum_) / (maximum_ - minimum_) + 0.5f); else progress = 0; // Draw the box and label... if (progress > 0) { Fl_Color c = labelcolor(); labelcolor(fl_contrast(labelcolor(), color2())); if (direction == HORIZONTAL) { fl_clip(x(), y(), progress, h()); draw_box(box(), x(), y(), w(), h(), active_r() ? color2() : fl_inactive(color2())); draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); labelcolor(c); fl_clip(x() + progress, y(), tw - progress, h()); draw_box(box(), x(), y(), w(), h(), active_r() ? color() : fl_inactive(color())); draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); } else { fl_clip(x(), y(), w(), h() - progress); draw_box(box(), x(), y(), w(), h(), active_r() ? color() : fl_inactive(color())); // draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); labelcolor(c); fl_clip(x(), y() + h() - progress, w(), progress ); draw_box(box(), x(), y(), w(), h(), active_r() ? color2() : fl_inactive(color2())); // draw_label(tx, y() + by, tw, h() - bh); fl_pop_clip(); } } else { draw_box(box(), x(), y(), w(), h(), color()); if (direction == HORIZONTAL) draw_label(tx, y() + by, tw, h() - bh); } } Progress::Progress(int X, int Y, int W, int H, const char* l) : Fl_Widget(X, Y, W, H, l) { align(FL_ALIGN_INSIDE); box(FL_DOWN_BOX); color(FL_BACKGROUND2_COLOR, FL_YELLOW); minimum(0.0f); maximum(100.0f); value(0.0f); direction = HORIZONTAL; } // // End of "$Id: Progress.cxx 4288 2005-04-16 00:13:17Z mike $". // fldigi-4.2.05/src/widgets/psk_browser.cxx0000664000175000017500000002114214611711171015304 00000000000000// ---------------------------------------------------------------------------- // // PSK browser widget // // Copyright (C) 2008-2010 // David Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "psk_browser.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "waterfall.h" #include "fl_digi.h" #include "gettext.h" #include "flmisc.h" #include "flinput2.h" #include "flslider2.h" #include "spot.h" #include "icons.h" #include "Viewer.h" #include "audio_alert.h" #include std::string pskBrowser::hilite_color_1; std::string pskBrowser::hilite_color_2; std::string pskBrowser::white; std::string pskBrowser::bkgnd[2]; int pskBrowser::cwidth = 5; int pskBrowser::cheight = 12; int pskBrowser::sbarwidth = 16; pskBrowser::pskBrowser(int x, int y, int w, int h, const char *l) :Fl_Hold_Browser(x,y,w,h,l) { fnt = FL_HELVETICA; siz = 12; rfc = 0LL; usb = true; seek_re = NULL; cols[0] = 80; cols[1] = 0; evalcwidth(); HiLite_1 = FL_RED; HiLite_2 = FL_GREEN; BkSelect = FL_BLUE; Backgnd1 = (Fl_Color)55; Backgnd2 = (Fl_Color)53; makecolors(); cdistiller = reinterpret_cast(operator new(MAXCHANNELS*sizeof(CharsetDistiller))); std::string bline; for (int i = 0; i < MAXCHANNELS; i++) { alerted[i].regex_alert = alerted[i].mycall_alert = false; bwsrline[i] = " "; bwsrfreq[i] = NULLFREQ; bline = freqformat(i); if ( i < progdefaults.VIEWERchannels) add(bline.c_str()); new(&cdistiller[i]) CharsetDistiller; } } pskBrowser::~pskBrowser() { for (int i = MAXCHANNELS-1; i >= 0; i--) cdistiller[i].~CharsetDistiller(); operator delete(cdistiller); } void pskBrowser::evalcwidth() { fl_font(fnt, siz); textfont(fnt); textsize(siz); cwidth = (int)fl_width("8"); if (cwidth <= 0) cwidth = 5; cheight = fl_height(); labelwidth[VIEWER_LABEL_OFF] = 1; labelwidth[VIEWER_LABEL_AF] = 5*cwidth; labelwidth[VIEWER_LABEL_RF] = 10*cwidth; labelwidth[VIEWER_LABEL_CH] = 3*cwidth; columns(labelwidth[progdefaults.VIEWERlabeltype]); } std::string pskBrowser::freqformat(int i) // 0 < i < channels { szLine[0] = 0; int freq = bwsrfreq[i]; switch (progdefaults.VIEWERlabeltype) { case VIEWER_LABEL_AF: if (freq != NULLFREQ) snprintf(szLine, sizeof(szLine), "%4d", freq); else snprintf(szLine, sizeof(szLine), " "); break; case VIEWER_LABEL_RF: if (freq != NULLFREQ) snprintf(szLine, sizeof(szLine), "%8.2f", (rfc + (usb ? freq : -freq)) / 1000.0f); else snprintf(szLine, sizeof(szLine), " "); break; case VIEWER_LABEL_CH: snprintf(szLine, sizeof(szLine), "%2d", i + 1); break; default: snprintf(szLine, sizeof(szLine), " "); break; } fline = white; fline.append("@r").append(szLine).append("\t").append(bkgnd[i%2]); return fline; } void pskBrowser::swap(int i, int j) { std::string tempstr = bwsrline[j]; bwsrline[j] = bwsrline[i]; bwsrline[i] = tempstr; int f = bwsrfreq[j]; bwsrfreq[j] = bwsrfreq[i]; bwsrfreq[i] = f; tempstr = freqformat(i); tempstr.append(bwsrline[i]); text(i+1, tempstr.c_str()); tempstr = freqformat(j); tempstr.append(bwsrline[j]); text(j+1, tempstr.c_str()); redraw(); } static size_t case_find(std::string &haystack, std::string &needle) { std::string Uhaystack = haystack; std::string Uneedle = needle; for (size_t i = 0; i < Uhaystack.length(); i++ ) Uhaystack[i] = toupper(Uhaystack[i]); for (size_t i = 0; i < Uneedle.length(); i++ ) Uneedle[i] = toupper(Uneedle[i]); return Uhaystack.find(Uneedle); } void pskBrowser::resize(int x, int y, int w, int h) { if (w) { Fl_Hold_Browser::resize(x,y,w,h); evalcwidth(); std::string bline; Fl_Hold_Browser::clear(); for (int i = 0, j = 0; i < progdefaults.VIEWERchannels; i++) { if (progdefaults.VIEWERascend) j = progdefaults.VIEWERchannels - 1 - i; else j = i; bwsrline[j].clear(); bline = freqformat(j); if (seek_re && seek_re->match(bwsrline[j].c_str(), REG_NOTBOL | REG_NOTEOL)) bline.append(hilite_color_1); else if ( !progdefaults.myCall.empty() && case_find (bwsrline[j], progdefaults.myCall ) != std::string::npos) bline.append(hilite_color_2); Fl_Hold_Browser::add(bline.c_str()); } } } void pskBrowser::makecolors() { char tempstr[20]; snprintf(tempstr, sizeof(tempstr), "@C%u", HiLite_1); hilite_color_1 = tempstr; snprintf(tempstr, sizeof(tempstr), "@C%u", HiLite_2); hilite_color_2 = tempstr; snprintf(tempstr, sizeof(tempstr), "@C%u", FL_FOREGROUND_COLOR); // foreground white = tempstr; selection_color(BkSelect); snprintf(tempstr, sizeof(tempstr), "@B%u", Backgnd1); // background for odd rows bkgnd[0] = tempstr; snprintf(tempstr, sizeof(tempstr), "@B%u", Backgnd2); // background for even rows bkgnd[1] = tempstr; } void pskBrowser::addchr(int ch, int freq, unsigned char c, int md, bool signal_alert) { if (ch < 0 || ch >= MAXCHANNELS) return; if (c == '\n') c = ' '; if (c < ' ') return; bwsrfreq[ch] = freq; if (bwsrline[ch].length() == 1 && bwsrline[ch][0] == ' ') { bwsrline[ch].clear(); } cdistiller[ch].rx(c); if (cdistiller[ch].data_length() > 0) { bwsrline[ch] += cdistiller[ch].data(); cdistiller[ch].clear(); } fl_font(fnt, siz); int bX, bY, bW, bH; bbox(bX, bY, bW, bH); size_t available = bW - cols[0]; // size_t available = (w() - cols[0] - (sbarwidth + 2*BWSR_BORDER)); size_t linewidth = fl_width(bwsrline[ch].c_str()); if (linewidth > available) { if (progdefaults.VIEWERmarquee) { bwsrline[ch].erase(0, fl_utf8len1(bwsrline[ch][0])); } else { bwsrline[ch].clear(); } } nuline = freqformat(ch); if (!bwsrline[ch].empty()) { if (seek_re && seek_re->match(bwsrline[ch].c_str(), REG_NOTBOL | REG_NOTEOL)) { if ((trx_state == STATE_RX) && (alerted[ch].regex_alert == false) && signal_alert && progdefaults.ENABLE_BWSR_REGEX_MATCH) { if (audio_alert) audio_alert->alert(progdefaults.BWSR_REGEX_MATCH); alerted[ch].regex_alert = true; } nuline.append(hilite_color_1); } else { alerted[ch].regex_alert = false; } } else { alerted[ch].regex_alert = false; } if (!progdefaults.myCall.empty() && case_find (bwsrline[ch], progdefaults.myCall ) != std::string::npos) { nuline.append(hilite_color_2); if ((trx_state == STATE_RX) && (alerted[ch].mycall_alert == false) && signal_alert && progdefaults.ENABLE_BWSR_MYCALL_MATCH) { if (audio_alert) audio_alert->alert(progdefaults.BWSR_MYCALL_MATCH); alerted[ch].mycall_alert = true; } } else alerted[ch].mycall_alert = false; nuline.append("@.").append(bwsrline[ch]); if (progdefaults.VIEWERascend) text(progdefaults.VIEWERchannels - ch, nuline.c_str()); else text(ch + 1, nuline.c_str()); redraw(); } void pskBrowser::set_freq(int i, int freq) // 0 < i < channels { std::string new_line = ""; bwsrfreq[i] = freq; new_line.append(freqformat(i)).append(bwsrline[i]); if (progdefaults.VIEWERascend) replace(progdefaults.VIEWERchannels - i, new_line.c_str()); else replace(i + 1, new_line.c_str()); } void pskBrowser::clear() { long freq; Fl_Hold_Browser::clear(); for (int i = 0, j = 0; i < progdefaults.VIEWERchannels; i++) { if (progdefaults.VIEWERascend) j = progdefaults.VIEWERchannels - 1 - i; else j = i; freq = NULLFREQ; bwsrline[j] = " "; bwsrfreq[j] = freq; fline = freqformat(j); add((fline.append(bwsrline[j])).c_str()); } deselect(); redraw(); } void pskBrowser::clearch(int n, int freq) // 0 < n < channels { bwsrline[n] = " "; set_freq(n, freq); redraw(); } int pskBrowser::freq(int i) { // 1 < i < progdefaults.VIEWERchannels if (progdefaults.VIEWERascend) return ( i < 1 ? 0 : i > progdefaults.VIEWERchannels ? 0 : bwsrfreq[progdefaults.VIEWERchannels - i]); else return (i < 1 ? 0 : i > MAXCHANNELS ? 0 : bwsrfreq[i - 1]); } void pskBrowser::set_input_encoding(int encoding_id) { for (int i = 0; i < MAXCHANNELS; i++) cdistiller[i].set_input_encoding(encoding_id); } fldigi-4.2.05/src/widgets/pwrmeter.cxx0000664000175000017500000001266514611711171014623 00000000000000// // pwrmeter.cxx // // PWRmeter bar widget routines. // // A part of the fldigi. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "pwrmeter.h" // // pwrmeter is a pwrmeter bar widget based off Fl_Widget that shows a // standard pwrmeter bar in horizontal format void PWRmeter::draw() { if (select_ == 4) select_auto(); if (0) sval = round(meter_width * value_ / maximum_); else sval = round(meter_width * peak_ / maximum_); if (sval > meter_width) sval = meter_width; if (sval < 0) sval = 0; // Draw the box and label... draw_box(); draw_box(box(), tx, ty, tw, th, bgnd_); if (sval > 0) draw_box(FL_FLAT_BOX, tx + sx, ty + 2, sval, th - 4, fgnd_); labelcolor(scale_color); draw_label(); } void PWRmeter::select_25W() { maximum_ = 25; label(W25_face); fl_font(FL_HELVETICA, labelsize()); meter_width = fl_width(W25_face); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::select_50W() { maximum_ = 50; label(W50_face); fl_font(FL_HELVETICA, labelsize()); meter_width = fl_width(W50_face); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::select_100W() { maximum_ = 100; label(W100_face); fl_font(FL_HELVETICA, labelsize()); meter_width = fl_width(W100_face); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::select_200W() { maximum_ = 200; label(W200_face); fl_font(FL_HELVETICA, labelsize()); meter_width = fl_width(W200_face); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::select_auto() { if (value_ <= 25.0) { select_25W(); } else if (value_ <= 50.0) { select_50W(); } else if (value_ <= 100) { select_100W(); } else { select_200W(); } redraw(); } void PWRmeter::select( int sel ) { switch (sel) { case P25: select_25W(); select_ = 0; break; case P50: select_50W(); select_ = 1; break; case P100: select_100W(); select_ = 2; break; case P200: select_200W(); select_ = 3; break; case AUTO: default: select_auto(); select_ = 4; } redraw(); } const char * PWRmeter::W25_face = "| : : : : | : : : : | : : : : | : : : : | : : : 25|"; const char * PWRmeter::W50_face = "| : | : | : | : | : 50|"; const char * PWRmeter::W100_face = "| | | | | | | | | | 100|"; const char * PWRmeter::W200_face = "| : | : | : | : 200|"; PWRmeter::PWRmeter(int X, int Y, int W, int H, const char* l) : Fl_Widget(X, Y, W, H, "") { align(FL_ALIGN_INSIDE); box(FL_DOWN_BOX); bgnd_ = FL_BACKGROUND2_COLOR; fgnd_ = FL_GREEN; scale_color = FL_BLACK; maximum_ = 100.0; value_ = 0.0; peak_ = 0.0; ppeak = 0; for (int n = 0; n < NPEAKS; n++) peaks_[n] = 0.0; select_ = 2; // 100 W scale // Get the box borders... bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = X + bx; tw = W - bw; ty = Y + by; th = H - bh; static int fsize = 6; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(W100_face); while ((meter_width < tw) && (fl_height() < th)) { fsize++; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(W100_face); } fsize--; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(W100_face); meter_height = fl_height(); label(W100_face); labelfont(FL_HELVETICA); labelsize(fsize); labelcolor(scale_color); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } void PWRmeter::resize(int X, int Y, int W, int H) { Fl_Widget::resize(X,Y,W,H); bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = X + bx; tw = W - bw; ty = Y + by; th = H - bh; const char *face; switch (select_) { case P25: face = W25_face; break; case P50: face = W50_face; break; case P100: face = W100_face; break; case P200: face = W200_face; break; case AUTO: default: face = W25_face; } static int fsize = 6; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(face); while ((meter_width < tw) && (fl_height() < th)) { fsize++; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(face); } fsize--; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(face); meter_height = fl_height(); label(face); labelfont(FL_HELVETICA); labelsize(fsize); labelcolor(scale_color); sx = (tw - meter_width) / 2 + fl_width("|") / 2; meter_width -= fl_width("|"); } int PWRmeter::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_RELEASE) { do_callback(); return 1; } } return 0; } // // End of PWRmeter.cxx // fldigi-4.2.05/src/widgets/picture.cxx0000664000175000017500000006001514611711171014421 00000000000000// ---------------------------------------------------------------------------- // picture.cxx rgb picture viewer // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2010 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include "fl_digi.h" #include "trx.h" #include "picture.h" #include "debug.h" #include "timeops.h" picture::picture (int X, int Y, int W, int H, int bg_col) : Fl_Widget (X, Y, W, H) { width = W; height = H; bufsize = W * H * depth; numcol = 0; slantdir = 0; vidbuf = new unsigned char[bufsize]; background = bg_col ; memset( vidbuf, background, bufsize ); zoom = 0 ; binary = false ; binary_threshold = 128 ; slantcorr = true; cbFunc = NULL; } picture::~picture() { if (vidbuf) delete [] vidbuf; } void picture::video(unsigned char const *data, int len ) { if (len > bufsize) return; memcpy( vidbuf, data, len ); redraw(); } unsigned char picture::pixel(int pos) { if (pos < 0 || pos >= bufsize) return 0; return vidbuf[pos]; } void picture::clear() { memset(vidbuf, background, bufsize); redraw(); } void picture::resize_zoom(int x, int y, int w, int h) { if( zoom < 0 ) { int stride = -zoom + 1 ; Fl_Widget::resize(x,y,w/stride,h/stride); } else if( zoom > 0 ) { int stride = zoom + 1 ; Fl_Widget::resize(x,y,w*stride,h*stride); } else { Fl_Widget::resize(x,y,w,h); } redraw(); } void picture::resize(int x, int y, int w, int h) { if (w != width || h != height) { width = w; height = h; delete [] vidbuf; bufsize = depth * w * h; vidbuf = new unsigned char[bufsize]; memset( vidbuf, background, bufsize ); } resize_zoom(x,y,w,h); } /// No data destruction. Used when the received image grows more than expected. /// Beware that this is not protected by a mutex. void picture::resize_height(int new_height, bool clear_img) { int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; if( clear_img ) { /// Sets to zero the complete image. memset( new_vidbuf, background, new_bufsize ); } else { if( new_height <= height ) { memcpy( new_vidbuf, vidbuf, new_bufsize ); } else { memcpy( new_vidbuf, vidbuf, bufsize ); memset( new_vidbuf + bufsize, background, new_bufsize - bufsize ); } } delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } void picture::stretch(double the_ratio) { /// We do not change the width but the height int new_height = height * the_ratio + 0.5 ; int new_bufsize = width * new_height * depth; /// If the allocation fails, std::bad_alloc is thrown. unsigned char * new_vidbuf = new unsigned char[new_bufsize]; /// No interpolation, it takes the nearest pixel. for( int ix_out = 0 ; ix_out < new_bufsize ; ix_out += depth ) { int ix_in = 0.5 + ( double )ix_out * the_ratio ; switch( ix_in % depth ) { case 1 : --ix_in ; break ; case 2 : ++ix_in ; break ; default: ; } if( ix_in >= bufsize ) { /// Grey value as a filler to indicate the end. For debugging. memset( new_vidbuf + ix_out, 128, new_bufsize - ix_out ); break ; } for( int i = 0; i < depth ; ++i ) { new_vidbuf[ ix_out + i ] = vidbuf[ ix_in + i ]; } }; delete [] vidbuf ; vidbuf = new_vidbuf ; bufsize = new_bufsize ; height = new_height; resize_zoom( x(), y(), width, height ); redraw(); } /// Change the horizontal center of the image by shifting the pixels. // Beware that it is not protected by a mutex void picture::shift_horizontal_center(int horizontal_shift) { /// This is a number of pixels. int shift = horizontal_shift * depth; if( shift < -bufsize ) { shift = -bufsize ; } if( horizontal_shift > 0 ) { /// Here we lose a couple of pixels at the end of the buffer /// if there is not a line enough. It should not be a lot. int tmp, n; memmove( vidbuf + shift, vidbuf, bufsize - shift ); memcpy(vidbuf, vidbuf + width*depth, shift); for (int row = 0; row < height; row ++) { for (int col = 0; col < shift; col++) { n = (row * width + col) * depth; tmp = vidbuf[n]; vidbuf[n] = vidbuf[n+2]; vidbuf[n+2] = tmp; } } // memset( vidbuf, background, horizontal_shift ); } else { // shift *= -1; /// Here, it is not necessary to reduce the buffer's size. // memmove( vidbuf, vidbuf + shift, bufsize - shift ); // memcpy( vidbuf + bufsize - shift - 1, // vidbuf + bufsize - width * depth - 1, shift); // memset( vidbuf + bufsize + horizontal_shift, background, -horizontal_shift ); } redraw(); } /// Shift the center by 1 rgb value // not protected by a mutex void picture::shift_center(int dir) { if( dir > 0 ) { memmove( vidbuf + 1, vidbuf, bufsize - 1 ); vidbuf[0] = 0; } else { memmove( vidbuf, vidbuf + 1, bufsize - 1 ); vidbuf[bufsize-1] = 0; } redraw(); } /// rotate rgb pixel ordering in the image to the right of /// and including grp pixels from the left // not protected by a mutex void picture::rotate() { unsigned char tmp; int n; for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { n = (row * width + col) * depth; tmp = vidbuf[n]; vidbuf[n] = vidbuf[n+1]; vidbuf[n+1] = vidbuf[n+2]; vidbuf[n+2] = tmp; } } redraw(); } void picture::set_zoom( int the_zoom ) { zoom = the_zoom ; /// The size of the displayed bitmap is changed. resize_zoom( x(), y(), width, height ); } // in data user data passed to function // in x_screen,y_screen,wid_screen position and width of scan line in image // out buf buffer for generated image data. // Must copy wid_screen pixels from scanline y_screen, starting at pixel x_screen to this buffer. void picture::draw_cb( void *data, int x_screen, int y_screen, int wid_screen, uchar * __restrict__ buf) { const picture * __restrict__ ptr_pic = ( const picture * ) data ; const int img_width = ptr_pic->width ; const unsigned char * __restrict__ in_ptr = ptr_pic->vidbuf ; /// One pixel out of (zoom+1) if( ptr_pic->zoom < 0 ) { const int stride = -ptr_pic->zoom + 1 ; const int in_offset = ( img_width * y_screen + x_screen ) * stride ; int dpth_in_offset = depth * in_offset ; if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth * stride ; } } else { for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = in_ptr[ dpth_in_offset ]; buf[ ix_w + 1 ] = in_ptr[ dpth_in_offset + 1 ]; buf[ ix_w + 2 ] = in_ptr[ dpth_in_offset + 2 ]; dpth_in_offset += depth * stride ; } } return ; } /// Reads each input pixel (-zoom+1) times. if( ptr_pic->zoom > 0 ) { const int stride = ptr_pic->zoom + 1 ; const int in_offset = img_width * ( y_screen / stride ) + x_screen / stride ; #ifndef NDEBUG if( y_screen / stride >= ptr_pic->h() ) { LOG_ERROR( "Overflow2 y_screen=%d h=%d y_screen*stride=%d height=%d stride=%d\n", y_screen, ptr_pic->h(), (y_screen/stride), ptr_pic->height, stride ); return ; } #endif if(ptr_pic->binary) { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); unsigned char in_dpth_in_offset_1 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); unsigned char in_dpth_in_offset_2 = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } else { for( int ix_w = 0, max_w = wid_screen * depth, dpth_in_offset = depth * in_offset ; ix_w < max_w ; ) { unsigned char in_dpth_in_offset_0 = in_ptr[ dpth_in_offset ]; unsigned char in_dpth_in_offset_1 = in_ptr[ dpth_in_offset + 1 ]; unsigned char in_dpth_in_offset_2 = in_ptr[ dpth_in_offset + 2 ]; // Stride is less than 4 or 5. for( int j= 0; j < stride; j++, ix_w += depth ) { buf[ ix_w ] = in_dpth_in_offset_0; buf[ ix_w + 1 ] = in_dpth_in_offset_1; buf[ ix_w + 2 ] = in_dpth_in_offset_2; } dpth_in_offset += depth ; } } return ; } // zoom == 0, stride=1 const int in_offset = img_width * y_screen + x_screen ; if(ptr_pic->binary) { int dpth_in_offset = depth * in_offset ; for( int ix_w = 0, max_w = wid_screen * depth; ix_w < max_w ; ix_w += depth ) { buf[ ix_w ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset ]); buf[ ix_w + 1 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 1 ]); buf[ ix_w + 2 ] = ptr_pic->pix2bin(in_ptr[ dpth_in_offset + 2 ]); dpth_in_offset += depth ; } } else { abort(); // This should never be called, see optimization in picture::draw(). } } // picture::draw_cb void picture::draw() { if( ( zoom == 0 ) && ( binary == false ) ) { /// No scaling, this is faster. fl_draw_image( vidbuf, x(), y(), w(), h() ); } else { fl_draw_image( draw_cb, this, x(), y(), w(), h() ); } } void picture::slant_undo() { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0 || slantdir == 0) return; if (slantdir == -1) { // undo from left for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } } else if (slantdir == 1) { // undo from right for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } } slantdir = 0; redraw(); } void picture::slant_corr(int x, int y) { int row, col; unsigned char temp[width * depth]; if (height == 0 || width == 0) return; if (x > width / 2) { // unwrap from right numcol = (width - x) * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[(row * width + width - col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + col)*depth], &vidbuf[row * width *depth], (width - col) * depth ); memmove( &vidbuf[row * width * depth], temp, col * depth ); } } slantdir = 1; } else { // unwrap from left numcol = x * height / y; if (numcol > width / 2) numcol = width / 2; for (row = 0; row < height; row++) { col = numcol * row / (height - 1); if (col > 0) { memmove( temp, &vidbuf[row * width * depth], col * depth ); memmove( &vidbuf[row * width * depth], &vidbuf[(row * width + col) * depth], (width - col) * depth ); memmove( &vidbuf[(row * width + width - col) * depth], temp, col *depth ); } } slantdir = -1; } redraw(); } void picture::slant(int dir) { } int picture::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_RELEASE) { if (!slantcorr) { do_callback(); return 1; } int xpos = Fl::event_x() - x(); int ypos = Fl::event_y() - y(); int evb = Fl::event_button(); if (evb == 1) slant_corr(xpos, ypos); else if (evb == 3) slant_undo(); LOG_DEBUG("#2 %d, %d", xpos, ypos); return 1; } return 1; } return 0; } static FILE* open_file(const char* name, const char* suffix) { FILE* fp; size_t flen = strlen(name); if (name[flen - 1] == '/') { // if the name ends in a slash we will generate // a timestamped name in the following format: const char t[] = "pic_YYYY-MM-DD_HHMMSSz"; size_t newlen = flen + sizeof(t); if (suffix) newlen += 5; char* newfn = new char[newlen]; memcpy(newfn, name, flen); time_t time_sec = time(0); struct tm ztime; (void)gmtime_r(&time_sec, &ztime); size_t sz; if ((sz = strftime(newfn + flen, newlen - flen, "pic_%Y-%m-%d_%H%M%Sz", &ztime)) > 0) { strncpy(newfn + flen + sz, suffix, newlen - flen - sz); newfn[newlen - 1] = '\0'; mkdir(name, 0777); fp = fl_fopen(newfn, "wb"); } else fp = NULL; delete [] newfn; } else { fp = fl_fopen(name, "rb"); if (fp) { fclose(fp); const int n = 5; // rename existing image files to keep up to 5 old versions std::ostringstream oldfn, newfn; std::streampos p; oldfn << name << '.'; newfn << name << '.'; p = oldfn.tellp(); for (int i = n - 1; i > 0; i--) { oldfn.seekp(p); newfn.seekp(p); oldfn << i; newfn << i + 1; remove(newfn.str().c_str()); rename(oldfn.str().c_str(), newfn.str().c_str()); } remove(oldfn.str().c_str()); rename(name, oldfn.str().c_str()); } fp = fl_fopen(name, "wb"); } return fp; } static inline unsigned char avg_pix( const unsigned char * vidbuf ) { return ( vidbuf[ 0 ] + vidbuf[ 1 ] + vidbuf[ 2 ] ) / picture::depth ; } int picture::save_png(const char* filename, bool monochrome, const char *extra_comments) { FILE* fp; if ((fp = open_file(filename, ".png")) == NULL) return -1; // set up the png structures png_structp png; png_infop info; if ((png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL) { fclose(fp); return -1; } /* png_set_compression_level() shall set the compression level to "level". * The valid values for "level" range from [0,9], corresponding directly * to compression levels for zlib. The value 0 implies no compression * and 9 implies maximal compression. Note: Tests have shown that zlib * compression levels 3-6 usually perform as well as level 9 for PNG images, * and do considerably fewer calculations. */ png_set_compression_level(png, Z_BEST_COMPRESSION); if ((info = png_create_info_struct(png)) == NULL) { png_destroy_write_struct(&png, NULL); fclose(fp); return -1; } if (setjmp(png_jmpbuf(png))) { png_destroy_write_struct(&png, &info); fclose(fp); return -1; } // use an stdio stream png_init_io(png, fp); // set png header int color_type = monochrome ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_RGB ; /// Color images must take eight bits per pixel. const int bit_depth = ( monochrome && binary ) ? 1 : 8 ; png_set_IHDR(png, info, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); // write text comments struct tm tm; time_t t = time(NULL); gmtime_r(&t, &tm); char z[20 + 1]; strftime(z, sizeof(z), "%Y-%m-%dT%H:%M:%SZ", &tm); z[sizeof(z) - 1] = '\0'; std::ostringstream comment; comment << "Program: " PACKAGE_STRING << '\n' << "Received: " << z << '\n' << "Modem: " << mode_info[active_modem->get_mode()].name << '\n' << "Frequency: " << inpFreq->value() << '\n'; if( extra_comments ) { comment << extra_comments ; } if (inpCall->size()) comment << "Log call: " << inpCall->value() << '\n'; // set text png_text text; text.key = strdup("Comment"); text.text = strdup(comment.str().c_str()); text.compression = PNG_TEXT_COMPRESSION_NONE; png_set_text(png, info, &text, 1); // write header png_write_info(png, info); // Extra check for debugging. if( height * width * depth != bufsize ) { LOG_ERROR("Buffer inconsistency h=%d w=%d b=%d", height, width, bufsize ); } // write image if(monochrome) { unsigned char tmp_row[width]; png_bytep row; for (int i = 0; i < height; i++) { int row_offset = i * width * depth ; if( binary ) { unsigned char accumPix = 0 ; int j_offset = 0 ; for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; unsigned char tmpChr = avg_pix( vidbuf + col_offset ); tmpChr = pix2bin(tmpChr) ? 1 : 0 ; j_offset = j & 0x07 ; tmpChr = tmpChr << ( 7 - j_offset ); accumPix |= tmpChr ; if( j_offset == 7 ) { tmp_row[ j >> 3 ] = accumPix ; accumPix = 0 ; } } if( j_offset != 7 ) { tmp_row[ width >> 3 ] = accumPix ; } } else { for(int j = 0 ; j < width; ++j ) { int col_offset = row_offset + j * depth ; tmp_row[j] = avg_pix( vidbuf + col_offset ); } } row = tmp_row; png_write_rows(png, &row, 1); } } else { png_bytep row; for (int i = 0; i < height; i++) { row = &vidbuf[i * width * depth]; png_write_rows(png, &row, 1); } } png_write_end(png, info); // clean up free(text.key); free(text.text); png_destroy_write_struct(&png, &info); fflush(fp); fsync(fileno(fp)); fclose(fp); return 0; } bool picture::restore( int row, int margin ) { if( ( row <= noise_height_margin ) || ( row >= height ) ) return true; unsigned char * line_ante = vidbuf + (row - noise_height_margin) * width * depth; // Copy the new calculated value (at previous call) to all channels. // TODO: Do that when switching off noise removal, otherwise a couple of colored pixels are left. for( int col = margin ; col < width - margin; ++col ) { int offset = col * depth ; line_ante[ offset ] = line_ante[ offset + 2 ] = line_ante[ offset + 1 ]; } return false ; } void picture::erosion( int row ) { static const size_t margin_one = 1 ; if( restore( row, margin_one ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; for( size_t col = margin_one ; col < width - margin_one; ++col ) { unsigned char new_pix = 255 ; new_pix = std::min( new_pix, line_prev[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_prev[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_curr[ depth * ( col + 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col - 1 ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col ) ] ); new_pix = std::min( new_pix, line_next[ depth * ( col + 1 ) ] ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } void picture::dilatation( int row ) { static const size_t margin_one = 1 ; if( restore( row, margin_one ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; for( size_t col = margin_one ; col < width - margin_one; ++col ) { unsigned char new_pix = 0 ; new_pix = std::max( new_pix, line_prev[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_prev[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_prev[ depth * ( col + 1 ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_curr[ depth * ( col + 1 ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col - 1 ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col ) ] ); new_pix = std::max( new_pix, line_next[ depth * ( col + 1 ) ] ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } void picture::remove_noise( int row, int half_len, int noise_margin ) { if( restore( row, half_len ) ) return ; const unsigned char * line_prev = vidbuf + (row - noise_height_margin + 1) * width * depth; unsigned char * line_curr = vidbuf + (row - noise_height_margin + 2) * width * depth; const unsigned char * line_next = vidbuf + (row - noise_height_margin + 3) * width * depth; const int nb_neighbours = ( 2 * ( 2 * half_len + 1 ) ); int medians[nb_neighbours]; /// Takes into account the first component only. for( int col = half_len ; col < width - half_len; ++col ) { int curr_pix = line_curr[ col * depth ]; assert( ( curr_pix >= 0 ) && ( curr_pix <= 255 ) ); int pix_min = 255, pix_max = 0; for( int subcol = col - half_len, tmp, nghb_i = 0 ; subcol <= col + half_len ; ++subcol ) { int offset = subcol * depth ; tmp = line_prev[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; tmp = line_next[ offset ]; if( tmp < pix_min ) pix_min = tmp ; else if( tmp > pix_max ) pix_max = tmp ; medians[nghb_i++] = tmp; } // Maybe the pixel is between min and max. int thres_min = pix_min - noise_margin; if(thres_min < 0) thres_min = 0; assert(thres_min <= pix_min); int thres_max = pix_max + noise_margin; if(thres_max > 255 ) thres_max = 255; if(thres_max < pix_max) abort(); if( ( curr_pix >= thres_min ) && ( curr_pix <= thres_max ) ) continue ; assert( ( pix_max >= 0 ) && ( pix_max <= 255 ) ); std::sort( medians, medians + nb_neighbours ); int new_pix = medians[ nb_neighbours / 2 ]; assert( new_pix >= 0 ); /// Use this channel as a buffer. Beware that if we change the slant, // this component might not be restored // because the line position changed. Not a big problem. // We might forbid slanting when de-noising. line_curr[ col * depth + 1 ] = new_pix; } } int picbox::handle(int event) { if (!Fl::event_inside(this)) return 0; switch (event) { case FL_DND_ENTER: case FL_DND_LEAVE: case FL_DND_DRAG: case FL_DND_RELEASE: return 1; case FL_PASTE: break; default: return Fl_Box::handle(event); } // handle FL_PASTE std::string text = Fl::event_text(); // from dnd event "file:///home/dave/Photos/dave.jpeg" std::string::size_type p; if ((p = text.find("file://")) != std::string::npos) text.erase(0, p + strlen("file://")); if ((p = text.find('\r')) != std::string::npos) text.erase(p); if ((p = text.find('\n')) != std::string::npos) text.erase(p); struct stat st; if (stat(text.c_str(), &st) == -1 || !S_ISREG(st.st_mode)) return 0; extern void load_image(const char*); load_image(text.c_str()); return 1; } fldigi-4.2.05/src/widgets/FTextRXTX.cxx0000664000175000017500000020713214611711171014531 00000000000000// ---------------------------------------------------------------------------- // FTextRXTX.cxx // // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // Copyright (C) 2008-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "FTextView.h" #include "main.h" #include "trx.h" #include "macros.h" #include "main.h" #include "fl_digi.h" #include "cw.h" #include "fileselect.h" #include "font_browser.h" #include "ascii.h" #include "configuration.h" #include "qrunner.h" #include "mfsk.h" #include "icons.h" #include "globals.h" #include "re.h" #include "strutil.h" #include "dxcc.h" #include "locator.h" #include "logsupport.h" #include "status.h" #include "gettext.h" #include "arq_io.h" #include "fl_digi.h" #include "strutil.h" #include "debug.h" #include "contest.h" #include "counties.h" // Fl_Scrollbar wrapper to draw marks on the slider background. // Currently only implemented for a vertical scrollbar. class MVScrollbar : public Fl_Scrollbar { struct mark_t { double pos; Fl_Color color; mark_t(double pos_, Fl_Color color_) : pos(pos_), color(color_) { } }; public: MVScrollbar(int X, int Y, int W, int H, const char* l = 0) : Fl_Scrollbar(X, Y, W, H, l), draw_marks(false) { } void draw(void); void mark(Fl_Color c) { marks.push_back(mark_t(maximum() - 1.0, c)); redraw(); } bool has_marks(void) { return !marks.empty(); } void show_marks(bool b) { draw_marks = b; redraw(); } void clear(void) { marks.clear(); redraw(); } private: std::vector marks; bool draw_marks; }; /* RX_MENU_QRZ_THIS, RX_MENU_CALL, RX_MENU_NAME, RX_MENU_QTH, RX_MENU_STATE, RX_MENU_COUNTY, RX_MENU_PROVINCE, RX_MENU_COUNTRY, RX_MENU_LOC, RX_MENU_RST_IN, RX_MENU_RST_OUT, RX_MENU_XCHG, RX_MENU_SERIAL, RX_MENU_CLASS, RX_MENU_SECTION, RX_MENU_SS_SER, RX_MENU_SS_PRE, RX_MENU_SS_CHK, RX_MENU_SS_SEC, RX_MENU_CQZONE, RX_MENU_CQSTATE, RX_MENU_1010_NR, RX_MENU_AGE, RX_MENU_CHECK, RX_MENU_NAQP, RX_MENU_SCOUT, RX_MENU_TROOP, RX_MENU_POWER, RX_MENU_QSOP_STATE, RX_MENU_QSOP_COUNTY, RX_MENU_QSOP_SERNO, RX_MENU_QSOP_NAME, RX_MENU_QSOP_XCHG, RX_MENU_QSOP_CAT, RX_MENU_DIV, RX_MENU_COPY, RX_MENU_CLEAR, RX_MENU_SELECT_ALL, RX_MENU_SAVE, RX_MENU_WRAP, RX_MENU_ALL_ENTRY, RX_MENU_SCROLL_HINTS, RX_MENU_NUM_ITEMS */ Fl_Menu_Item FTextRX::menu[] = { { icons::make_icon_label(_("Look up call"), net_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Call"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Name"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QTH"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("State"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("County"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Province"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Country"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Locator"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("RST(r)"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("RST(s)"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Exchange In"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Rx Serial #"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Class"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Section"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("SS ser #"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("SS prec"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("SS check"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("SS section"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("CQ zone"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("CQ STATE"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("1010 Nr"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Kid's Age"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Round Up Chk"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("NAQP xchg"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("JOTA scout"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("JOTA troop"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("POWER(r)"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp state"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp county"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp serno"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp name"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp xchg"), enter_key_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("QSOp category"), enter_key_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Insert marker"), insert_link_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { 0 }, // VIEW_MENU_COPY { 0 }, // VIEW_MENU_CLEAR { 0 }, // VIEW_MENU_SELECT_ALL { 0 }, // VIEW_MENU_SAVE { 0 }, // VIEW_MENU_WRAP { _("All entries"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL }, { _("Scroll hints"), 0, 0, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL }, { 0 } }; /// FTextRX constructor. /// We remove \c Fl_Text_Display_mod::buffer_modified_cb from the list of callbacks /// because we want to scroll depending on the visibility of the last line; @see /// changed_cb. /// @param x /// @param y /// @param w /// @param h /// @param l FTextRX::FTextRX(int x, int y, int w, int h, const char *l) : FTextView(x, y, w, h, l) { memcpy(menu + RX_MENU_COPY, FTextView::menu, (FTextView::menu->size() - 1) * sizeof(*FTextView::menu)); context_menu = menu; init_context_menu(); menu[RX_MENU_ALL_ENTRY].clear(); menu[RX_MENU_SCROLL_HINTS].clear(); menu[RX_MENU_WRAP].hide(); // Replace the scrollbar widget MVScrollbar* mvsb = new MVScrollbar(mVScrollBar->x(), mVScrollBar->y(), mVScrollBar->w(), mVScrollBar->h(), NULL); mvsb->show_marks(false); mvsb->callback(mVScrollBar->callback(), mVScrollBar->user_data()); remove(mVScrollBar); delete mVScrollBar; Fl_Group::add(mVScrollBar = mvsb); mFastDisplay = 1; num_words = 1; } FTextRX::~FTextRX() { } /// Handles fltk events for this widget. /// We only care about mouse presses (to display the popup menu and prevent /// pasting) and keyboard events (to make sure no text can be inserted). /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextRX::handle(int event) { static Fl_Cursor cursor; switch (event) { case FL_DRAG: if (Fl::event_button() != FL_LEFT_MOUSE) return 1; break; case FL_PUSH: if (!Fl::event_inside(this)) break; switch (Fl::event_button()) { case FL_LEFT_MOUSE: if (progdefaults.rxtext_clicks_qso_data) { if (handle_clickable(Fl::event_x() - x(), Fl::event_y() - y())) return 1; if (handle_qso_data(Fl::event_x() - x(), Fl::event_y() - y())) return 1; } goto out; case FL_MIDDLE_MOUSE: if (cursor != FL_CURSOR_HAND) { if (handle_qso_data(Fl::event_x() - x(), Fl::event_y() - y())) { return 1; } } goto out; case FL_RIGHT_MOUSE: handle_context_menu(); return 1; default: goto out; } break; case FL_RELEASE: break; case FL_MOVE: { int p = xy_to_position(Fl::event_x(), Fl::event_y(), Fl_Text_Display_mod::CURSOR_POS); if ((unsigned char)sbuf->byte_at(p) >= CLICK_START + FTEXT_DEF) { if (cursor != FL_CURSOR_HAND) window()->cursor(cursor = FL_CURSOR_HAND); return 1; } else cursor = FL_CURSOR_INSERT; break; } // catch some text-modifying events that are not handled by kf_* functions case FL_KEYBOARD: break; case FL_PASTE: return 0; case FL_ENTER: if (!progdefaults.rxtext_tooltips || Fl_Tooltip::delay() == 0.0f) break; tooltips.enabled = Fl_Tooltip::enabled(); tooltips.delay = Fl_Tooltip::delay(); Fl_Tooltip::enable(1); Fl_Tooltip::delay(0.0f); Fl::add_timeout(tooltips.delay / 2.0, dxcc_tooltip, this); break; case FL_LEAVE: window()->cursor(FL_CURSOR_DEFAULT); if (!progdefaults.rxtext_tooltips || Fl_Tooltip::delay() != 0.0f) break; Fl_Tooltip::enable(tooltips.enabled); Fl_Tooltip::delay(tooltips.delay); Fl::remove_timeout(dxcc_tooltip, this); break; } out: return FTextView::handle(event); } /// Adds a char to the buffer /// /// @param c The character /// @param attr The attribute (@see enum text_attr_e); RECV if omitted. /// void FTextRX::add(unsigned int c, int attr) { if (c == '\r') return; char s[] = { '\0', '\0', char( FTEXT_DEF + attr ), '\0' }; const char *cp = &s[0]; // The user may have moved the cursor by selecting text or // scrolling. Place it at the end of the buffer. if (mCursorPos != tbuf->length()) insert_position(tbuf->length()); switch (c) { case '\b': // we don't call kf_backspace because it kills selected text if (s_text.length()) { int character_start = tbuf->utf8_align(tbuf->length() - 1); int character_length = fl_utf8len1(tbuf->byte_at(character_start)); tbuf->remove(character_start, tbuf->length()); sbuf->remove(character_start, sbuf->length()); s_text.resize(s_text.length() - character_length); s_style.resize(s_style.length() - character_length); } break; case '\n': // maintain the scrollback limit, if we have one if (max_lines > 0 && tbuf->count_lines(0, tbuf->length()) >= max_lines) { int le = tbuf->line_end(0) + 1; // plus 1 for the newline tbuf->remove(0, le); sbuf->remove(0, le); } s_text.clear(); s_style.clear(); insert("\n"); sbuf->append(s + 2); break; default: if ((c < ' ' || c == 127) && attr != CTRL) // look it up cp = ascii[(unsigned char)c]; else // insert verbatim s[0] = c; for (int i = 0; cp[i]; ++i) { s_text += cp[i]; s_style += s[2]; } fl_font( textfont(), textsize() ); int lwidth = (int)fl_width( s_text.c_str(), s_text.length()); bool wrapped = false; if ( lwidth >= (text_area.w - mVScrollBar->w() - LEFT_MARGIN - RIGHT_MARGIN)) { if (c != ' ') { size_t p = s_text.rfind(' '); if (p != std::string::npos) { s_text.erase(0, p+1); s_style.erase(0, p+1); if (s_text.length() < 10) { // wrap and delete trailing space tbuf->remove(tbuf->length() - s_text.length(), tbuf->length()); sbuf->remove(sbuf->length() - s_style.length(), sbuf->length()); insert("\n"); // always insert new line sbuf->append(s + 2); insert(s_text.c_str()); sbuf->append(s_style.c_str()); wrapped = true; } } } if (!wrapped) { // add a new line if not wrapped insert("\n"); sbuf->append(s + 2); s_text.clear(); s_style.clear(); if (c != ' ') { // add character if not a space (no leading spaces) for (int i = 0; cp[i]; ++i) { sbuf->append(s + 2); s_style.append(s + 2); } s_text.append(cp); insert(cp); } } } else { for (int i = 0; cp[i]; ++i) sbuf->append(s + 2); insert(cp); } break; } // test for bottom of text visibility if (// !mFastDisplay && (mVScrollBar->value() >= mNBufferLines - mNVisibleLines + mVScrollBar->linesize() - 1)) show_insert_position(); } void FTextRX::set_all_entry(bool b) { if (b) menu[RX_MENU_ALL_ENTRY].set(); else menu[RX_MENU_ALL_ENTRY].clear(); } void FTextRX::set_scroll_hints(bool b) { if (b) menu[RX_MENU_SCROLL_HINTS].set(); else menu[RX_MENU_SCROLL_HINTS].clear(); static_cast(mVScrollBar)->show_marks(b); } void FTextRX::mark(FTextBase::TEXT_ATTR attr) { if (attr == NATTR) attr = CLICK_START; static_cast(mVScrollBar)->mark(styles[attr].color); } void FTextRX::clear(void) { FTextBase::clear(); s_text.clear(); s_style.clear(); static_cast(mVScrollBar)->clear(); } void FTextRX::setFont(Fl_Font f, int attr) { FTextBase::setFont(f, attr); } int FTextRX::handle_clickable(int x, int y) { int pos; unsigned int style; pos = xy_to_position(x + this->x(), y + this->y(), CURSOR_POS); // return unless clickable style if ((style = (unsigned char)sbuf->byte_at(pos)) < CLICK_START + FTEXT_DEF) return 0; int start, end; for (start = pos-1; start >= 0; start--) if ((unsigned char)sbuf->byte_at(start) != style) break; start++; int len = sbuf->length(); for (end = pos+1; end < len; end++) if ((unsigned char)sbuf->byte_at(end) != style) break; switch (style - FTEXT_DEF) { case QSY: handle_qsy(start, end); return 1; break; // ... default: break; } return 0; } void FTextRX::handle_qsy(int start, int end) { char* text = tbuf->text_range(start, end); extern std::map qrg_marks; std::map::const_iterator i; if ((i = qrg_marks.find(text)) != qrg_marks.end()) { const qrg_mode_t& m = i->second; if (active_modem->get_mode() != m.mode) init_modem_sync(m.mode); qsy(m.rfcarrier, m.carrier); } free(text); } static fre_t rst("^[1-5][123456789nN]{2}$", REG_EXTENDED | REG_NOSUB); static fre_t loc("[a-r]{2}[[:digit:]]{2}([a-x]{2})?", REG_EXTENDED | REG_ICASE); static fre_t call("([[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+)", REG_EXTENDED); void set_cbo_county(std::string str) { inpCounty->value(str.c_str()); inpSQSO_county1->value(str.c_str()); inpSQSO_county2->value(str.c_str()); Cstates st; if (inpState->value()[0]) cboCountyQSO->value( std::string(st.state_short(inpState->value())).append(" "). append(st.county(inpState->value(), inpCounty->value())).c_str()); else cboCountyQSO->clear_entry(); cboCountyQSO->redraw(); } void set_QSO_call(const char *s) { if (progdefaults.clear_fields) clearQSO(); std::string call = ucasestr(s); inpCall1->value(call.c_str()); inpCall2->value(call.c_str()); inpCall3->value(call.c_str()); inpCall4->value(call.c_str()); if (progStatus.timer && (Fl::event() != FL_HIDE)) stopMacroTimer(); sDate_on = sDate_off = zdate(); sTime_on = sTime_off = ztime(); inpTimeOn->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn1->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn2->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn3->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn4->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn5->value(inpTimeOff->value(), inpTimeOff->size()); updateOutSerNo(); } void set_cbo_Country(std::string c) { cboCountryQSO->value(c.c_str()); cboCountryAICW2->value(c.c_str()); cboCountryAIDX2->value(c.c_str()); cboCountryCQDX2->value(c.c_str()); cboCountryCQ2->value(c.c_str()); cboCountryIARI2->value(c.c_str()); cboCountryRTU2->value(c.c_str()); // cboCountryWAE2->value(c.c_str()); if (progdefaults.logging == LOG_JOTA) inp_JOTA_spc->value(c.c_str()); if (progdefaults.logging == LOG_ARR) inpXchgIn->value(c.c_str()); } void set_zone(std::string z) { inp_CQDXzone1->value(z.c_str()); inp_CQDXzone2->value(z.c_str()); inp_CQzone1->value(z.c_str()); inp_CQzone2->value(z.c_str()); } void set_name(std::string nm) { inpName->value(nm.c_str()); inpName1->value(nm.c_str()); inpName2->value(nm.c_str()); inp_1010_name2->value(nm.c_str()); inp_ARR_Name2->value(nm.c_str()); inpNAQPname2->value(nm.c_str()); inp_ASCR_name2->value(nm.c_str()); } void set_rst_in(std::string rst) { for (size_t n = 0; n < rst.length(); n++) if (rst[n] == 'N' || rst[n] == 'n') rst[n] = '9'; inpRstIn->value(rst.c_str()); inpRTU_RSTin2->value(rst.c_str()); inpRstIn1->value(rst.c_str()); inpRstIn2->value(rst.c_str()); inpRstIn3->value(rst.c_str()); inpRstIn4->value(rst.c_str()); inpRstIn_AICW2->value(rst.c_str()); inpRstIn_SQSO2->value(rst.c_str()); inpRstIn_WPX2->value(rst.c_str()); inp_IARI_RSTin2->value(rst.c_str()); // inpRstIn_WAE2->value(rst.c_str()); } void set_rst_out(std::string rst) { for (size_t n = 0; n < rst.length(); n++) if (rst[n] == 'N' || rst[n] == 'n') rst[n] = '9'; inpRstOut->value(rst.c_str()); inpRstOut1->value(rst.c_str()); inpRstOut2->value(rst.c_str()); inpRstOut3->value(rst.c_str()); inpRstOut4->value(rst.c_str()); inpRstOut_AICW2->value(rst.c_str()); inpRstOut_SQSO2->value(rst.c_str()); inpRstOut_WPX2->value(rst.c_str()); inp_IARI_RSTout2->value(rst.c_str()); // inpRstOut_WAE2->value(rst.c_str()); } void set_rst(std::string rst) { if (inpRstIn->value()[0] == 0) set_rst_in(rst); else set_rst_out(rst); } void set_state(std::string s) { s = ucasestr(s); inpState->value(s.c_str()); inpState1->value(s.c_str()); inp_CQstate1->value(s.c_str()); inp_CQstate2->value(s.c_str()); inp_KD_state1->value(s.c_str()); inp_KD_state2->value(s.c_str()); inpSQSO_state1->value(s.c_str()); inpSQSO_state2->value(s.c_str()); } void set_province(std::string pr) { pr = ucasestr(pr); inpVEprov->value(pr.c_str()); inp_KD_VEprov1->value(pr.c_str()); inp_KD_VEprov2->value(pr.c_str()); } void set_serno_in(std::string s) { inpSerNo->value(s.c_str()); inpSerNo1->value(s.c_str()); inpSerNo2->value(s.c_str()); inpSerNo3->value(s.c_str()); inpSerNo4->value(s.c_str()); inpSerNo_WPX1->value(s.c_str()); inpSerNo_WPX2->value(s.c_str()); inpRTU_serno1->value(s.c_str()); inpRTU_serno2->value(s.c_str()); inpSQSO_serno1->value(s.c_str()); inpSQSO_serno2->value(s.c_str()); inp_IARI_SerNo1->value(s.c_str()); inp_IARI_SerNo2->value(s.c_str()); // inpSerNo_WAE1->value(s.c_str()); // inpSerNo_WAE2->value(s.c_str()); } void parseSQSO(std::string str) { if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP" && str.length() == 5 && !inpState->value()[0]) { set_state(str.substr(0,2).c_str()); set_cbo_county(str); return; } if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE" && str.length() == 5 && !inpState->value()[0]) { set_state(str.substr(str.length() - 2, 2).c_str()); set_cbo_county(str); return; } if (progdefaults.SQSOinstate) { if (state_test(str)) { set_state(str); return; } } std::string st = inpState->value(); std::string inState = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (st == "6NE" || st == "7QP") { st.clear(); } else if (st.empty()) st = inState; bool chkC = check_field(str, cCNTY, st); bool chkP = check_field(str, cDIST, st); bool chkCin = check_field(str, cCNTY, inState); bool chkPin = check_field(str, cDIST, inState); if ( QSOparties.qso_parties[progdefaults.SQSOcontest].st && !st.empty() && progdefaults.SQSOlogcounty && (chkC || chkP) ) { if (progdefaults.SQSOinstate && !inpState->value()[0]) set_state(st); set_cbo_county(states.cnty_short(st, str)); return; } if ((chkCin || chkPin) && inpCounty->value()[0] == 0) { set_state(st.c_str()); set_cbo_county(states.cnty_short(st, str)); return; } if (progdefaults.SQSOlogstate && check_field(str, cSTATE) && !inpState->value()[0]) { set_state(str); return; } if (progdefaults.SQSOlogstate && check_field(str, cVE_PROV) && !inpState->value()[0]) { set_state(str); return; } if (section_test(str) && !inpState->value()[0]) { set_state(str); return; } if (check_field(str, cCOUNTRY)) { cboCountry->value(country_match.c_str()); return; } if (progdefaults.SQSOlogserno && check_field(str, cNUMERIC) && !inpSerNo->value()[0]) { set_serno_in(str); return; } { bool bCAT = (QSOparties.qso_parties[progdefaults.SQSOcontest].cat[0]); std::string category = ucasestr(str); if (bCAT && (category == "CLB" || category == "MOB" || category == "QRP" || category == "STD")) { inpSQSO_category->value(category.c_str()); return; } } if (!inpName->value()[0] && !isdigit(str[0]) && !chkC && !chkP && !chkCin && !chkPin) { set_name(str); return; } if (check_field(str, cRST) ) { set_rst(str); } } // capture 1, 2, or 3 sequential words from RX text // 1 - left click on word // 2 - shift-left click on first word // 3 - ctrl-left click on first word // 4 - shift-ctrl-left click on first word int FTextRX::handle_qso_data(int start, int end) { if (start < 0 || end < 0) return 0; num_words = 1; if (Fl::event_state() & FL_SHIFT) { num_words = 2; } if (Fl::event_state() & FL_CTRL) { num_words = 3; if (Fl::event_state() & FL_SHIFT) { num_words = 4; } } char *sz = get_word(start, end, progdefaults.nonwordchars.c_str(), num_words); if (!sz) return 0; std::string sz_str = sz; free(sz); if (sz_str.empty()) return 0; while (sz_str[sz_str.length() -1] <= ' ') sz_str.erase(sz_str.length() - 1); // remove leading substrings such as 'loc:' 'qth:' 'op:' etc size_t sp = std::string::npos; if ((sp = sz_str.find(":")) != std::string::npos) sz_str.erase(0, sp+1); if (sz_str.empty()) return 0; char* s = (char *)sz_str.c_str(); char* p = (char *)sz_str.c_str(); if (progdefaults.logging != LOG_QSO) { if (loc.match(s)) { // force maidenhead match to exchange // or it will overwrite the call inpXchgIn->position(inpXchgIn->size()); if (inpXchgIn->size()) inpXchgIn->insert(" ", 1); if (progdefaults.logging == LOG_VHF) { inpLoc->value(s); DupCheck(); } else { inpXchgIn->insert(s); log_callback(inpXchgIn); DupCheck(); } } else if (call.match(s)) { // point p to substring const regmatch_t& offsets = call.suboff()[1]; p = s + offsets.rm_so; *(s + offsets.rm_eo) = '\0'; set_QSO_call(p); Fl::copy(p, strlen(p), 1); // copy to clipboard if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { set_state(""); } const dxcc *e = dxcc_lookup(p); if (e) { std::ostringstream zone; zone << e->cq_zone; set_zone(zone.str()); std::string cntry = e->country; if (cntry.find("United States") != std::string::npos) cntry = "USA"; set_cbo_Country(cntry); } DupCheck(); } else { std::string str = ucasestr(s); if (cut_numeric_test(str)) str = cut_to_numeric(str); switch (progdefaults.logging) { case LOG_FD: if (check_field(str, cFD_SECTION) && !inpSection->value()[0]) { inpSection->value(str.c_str()); break; } if (check_field(str, cFD_CLASS) && !inpClass->value()[0]) { inpClass->value(str.c_str()); break; } if (check_field(str, cRST)) { set_rst(str); break; } break; case LOG_WFD: if (check_field(str, cFD_SECTION) && !inpSection->value()[0]) { inpSection->value(str.c_str()); break; } if (check_field(str, cWFD_CLASS) && !inpClass->value()[0]) { inpClass->value(str.c_str()); break; } if (check_field(str, cRST)) { set_rst(str); break; } break; case LOG_CQWW_DX: if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(str, cNUMERIC) && !inp_CQzone->value()[0]) { set_zone(str); break; } if (check_field(str, cRST)) { if (!inpRstIn->value()[0]) set_rst_in(str); else if (!inpRstOut->value()[0]) set_rst_out(str); } break; case LOG_CQWW_RTTY : if ( (check_field(str, cSTATE) || check_field(str, cVE_PROV)) && !inp_CQstate->value()[0] ) { inp_CQstate->value(str.c_str()); break; } if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(str, cNUMERIC) && !inp_CQzone->value()[0]) { set_zone(str); break; } if (check_field(str, cRST)) { set_rst(str); break; } break; case LOG_KD: if (!check_field(str, cNUMERIC) && inpName->value()[0] == 0) { set_name(s); break; } if (!check_field(str, cRST) && check_field(str, cNUMERIC) && inp_KD_age->value()[0] == 0) { inp_KD_age->value(str.c_str()); break; } if (check_field(str, cSTATE) && !inpState->value()[0]) { set_state(str); break; } if (check_field(str, cVE_PROV) && !inpVEprov->value()[0]) { set_province(str); break; } if (check_field(str, cRST)) { set_rst(str); break; } if (!inpXchgIn->value()[0]) { inpXchgIn->position(inpXchgIn->size()); if (inpXchgIn->size()) inpXchgIn->insert(" ", 1); inpXchgIn->insert(str.c_str()); } break; case LOG_ASCR: if (check_field(str, cASCR_CLASS) && !inpClass->value()[0]) { inpClass->value(str.c_str()); break; } if (check_field(str, cSTATE) && !inpXchgIn->value()[0]) { inpXchgIn->value(str.c_str()); break; } if (check_field(str, cVE_PROV) && !inpXchgIn->value()[0]) { inpXchgIn->value(str.c_str()); break; } if (check_field(str, cRST)) { set_rst(str); break; } if (!inpName->value()[0]) { set_name(s); break; } inpXchgIn->value(s); break; case LOG_ARR: // rookie roundup if (check_field(str, cRST)) { set_rst(str); break; } if (check_field(s, cROOKIE) && !inp_ARR_check->value()[0]) { if (strlen(s) > 2) inp_ARR_check->value(s + 2); else inp_ARR_check->value(s); break; } if (!inpName->value()[0]) { set_name(s); break; } if (check_field(str, cCHECK) && !inpXchgIn->value()[0]) { inpXchgIn->value(str.c_str()); break; } if (!inpXchgIn->value()[0]) { inpXchgIn->value(s); break; } break; case LOG_AICW: if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(str, cNUMERIC) && !inpSPCnum->value()[0]) { inpSPCnum->value(str.c_str()); break; } if (check_field(str, cRST)) { set_rst(str); break; } break; case LOG_1010: if (check_field(str, c1010) && !inp_1010_nr->value()[0]) { inp_1010_nr->value(str.c_str()); break; } if (check_field(str, cRST)) { set_rst(str); break; } if (check_field(str, cSTATE) && !inpXchgIn->value()[0]) { inpXchgIn->value(str.c_str()); break; } if (check_field(str, cVE_PROV) && !inpXchgIn->value()[0]) { inpXchgIn->value(str.c_str()); break; } if (!inpName->value()[0]) { set_name(s); break; } inpXchgIn->value(s); break; case LOG_NAQP: if (!inpName->value()[0]) { set_name(s); break; } else if (!inpSPCnum->value()[0]) { inpSPCnum_NAQP1->value(s); inpSPCnum_NAQP2->value(s); inpXchgIn1->value(s); inpXchgIn2->value(s); break; } if (check_field(str, cRST)) { set_rst(str); break; } break; case LOG_CWSS: if (check_field(str, cSS_SEC) && !inp_SS_Section->value()[0]) { inp_SS_Section->value(str.c_str()); break; } if (cut_numeric_test(str) && !inpSerNo->value()[0]) { set_serno_in(str); break; } if (check_field(str, cSS_PREC) && !inp_SS_Precedence->value()[0]) { inp_SS_Precedence->value(s); break; } if (check_field(str, cSS_CHK) && !inp_SS_Check->value()[0]) { inp_SS_Check->value(str.c_str()); break; } if (check_field(str, cRST)) { set_rst(str); break; } break; case LOG_CQ_WPX: if (cut_numeric_test(str) && !inpSerNo->value()[0]) { set_serno_in(str); break; } if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(str, cRST)) { set_rst(str); break; } break; case LOG_RTTY: // ARRL RTTY Round Up if (check_field(str, cSTATE) || check_field(str, cVE_PROV)) { set_state(str); break; } if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(str, cRST)) { set_rst(str); break; } if (cut_numeric_test(str) && !inpSerNo->value()[0]) { set_serno_in(str); break; } break; case LOG_IARI: if (check_field(str, cITALIAN)) { inp_IARI_PR1->value(ucasestr(str).c_str()); inp_IARI_PR2->value(ucasestr(str).c_str()); break; } if (check_field(str, cCOUNTRY)) { set_cbo_Country(country_match); break; } if (check_field(str, cRST)) { set_rst(str); break; } if (cut_numeric_test(str) && !inpSerNo->value()[0]) { set_serno_in(str); break; } break; case LOG_NAS: if (cut_numeric_test(str) && !inpSerNo->value()[0]) { set_serno_in(str); break; } if (check_field(str, cSTATE) && !inpXchgIn->value()[0]) { inpXchgIn->value(str.c_str()); break; } if (check_field(str, cVE_PROV) && !inpXchgIn->value()[0]) { inpXchgIn->value(str.c_str()); break; } if (check_field(str, cCOUNTRY) && !inpXchgIn->value()[0]) { set_cbo_Country(str); inpXchgIn->value(str.c_str()); break; } if (inpName->value()[0] == 0 && !inpName->value()[0]) { set_name(str); break; } if (check_field(s, cRST)) { set_rst(s); break; } break; case LOG_AIDX: if (check_field(str, cNUMERIC) && !inpSerNo->value()[0]) { set_serno_in(str); break; } if (check_field(str, cCOUNTRY) && !inpXchgIn->value()[0]) { set_cbo_Country(str); inpXchgIn->value(str.c_str()); break; } if (check_field(str, cRST)) { set_rst(str); break; } break; case LOG_JOTA: if (check_field(str, cRST)) { set_rst(str); break; } if (cut_numeric_test(str) && !inp_JOTA_troop->value()[0]) { inp_JOTA_troop->value(str.c_str()); break; } if (check_field(str, cSTATE)) { set_state(str); break; } if (check_field(str, cVE_PROV)) { set_province(str); break; } if (check_field(str, cCOUNTRY)) { set_cbo_Country(str); inpXchgIn->value(str.c_str()); break; } inp_JOTA_scout->value(str.c_str()); break; // case LOG_WAE: // if (!inpSerNo->value()[0] && check_field(str, cNUMERIC)) { // set_serno_in(str); // break; // } // if (check_field(str, cCOUNTRY)) { // cboCountryCQ1->value(country_match.c_str()); // cboCountryCQ2->value(country_match.c_str()); // cboCountry->value(country_match.c_str()); // } // if (check_field(s, cRST)) { // set_rst(s); // break; // } // break; case LOG_VHF: if (check_field(str, cRST)) set_rst(str); break; case LOG_SQSO: parseSQSO(str); break; case LOG_BART: // CALL, NAME, SERIAL, EXCHANGE if (!cut_numeric_test(s) && !inpName->value()[0]) { set_name(p); break; } else if (cut_numeric_test(str) && !inpSerNo->value()[0]) { set_serno_in(str); break; } case LOG_GENERIC: default: // EXCHANGE inpXchgIn->position(inpXchgIn->size()); if (inpXchgIn->size()) inpXchgIn->insert(" ", 1); if (cut_numeric_test(str)) inpXchgIn->insert(str.c_str()); else inpXchgIn->insert(s); log_callback(inpXchgIn); } } DupCheck(); restoreFocus(91); return 1; } else { if (loc.match(s) && inpCall->value()[0]) { inpLoc->value(p); log_callback(inpLoc); restoreFocus(); DupCheck(); return 1; } else if (call.match(s)) { // point p to substring const regmatch_t& offsets = call.suboff()[1]; p = s + offsets.rm_so; *(s + offsets.rm_eo) = '\0'; Fl::copy(p, strlen(p), 1); // copy to clipboard set_QSO_call(p); log_callback(inpCall); restoreFocus(); return 1; } else if (rst.match(s)) { set_rst(s); restoreFocus(); return 1; } else if (!inpName->value()[0]) { set_name(p); restoreFocus(); return 1; } else if (!inpQTH->value()[0]) { inpQTH->value(p); log_callback(inpQTH); restoreFocus(); return 1; } else if (!inpState->value()[0]) { set_state(p); log_callback(inpState); restoreFocus(); DupCheck(); return 1; } } return 0; } void FTextRX::handle_context_menu(void) { bool contest_ui = (progdefaults.logging != LOG_QSO); num_words = 1; if (Fl::event_state() & FL_SHIFT) { num_words = 2; } if (Fl::event_state() & FL_CTRL) { num_words = 3; if (Fl::event_state() & FL_SHIFT) { num_words = 4; } } unsigned shown[RX_MENU_NUM_ITEMS]; for (int i = 0; i < RX_MENU_NUM_ITEMS; shown[i++] = 0); // all hidden #define show_item(x_) (shown[x_] = 1) #define hide_item(x_) (shown[x_] = 0) #define test_item(x_) (shown[x_] == 1) show_item(RX_MENU_CALL); if (contest_ui) { switch (progdefaults.logging) { case LOG_FD: case LOG_WFD: show_item(RX_MENU_CLASS); show_item(RX_MENU_SECTION); break; case LOG_CQ_WPX: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_CQZONE); show_item(RX_MENU_COUNTRY); show_item(RX_MENU_SERIAL); break; case LOG_CQWW_DX: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_CQZONE); show_item(RX_MENU_COUNTRY); break; case LOG_CQWW_RTTY: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_CQZONE); show_item(RX_MENU_CQSTATE); show_item(RX_MENU_COUNTRY); break; case LOG_ASCR: show_item(RX_MENU_NAME); show_item(RX_MENU_CLASS); show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_XCHG); break; case LOG_VHF: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_LOC); break; case LOG_CWSS: show_item(RX_MENU_SS_SER); show_item(RX_MENU_SS_PRE); show_item(RX_MENU_SS_CHK); show_item(RX_MENU_SS_SEC); show_item(RX_MENU_RST_IN); break; case LOG_1010: show_item(RX_MENU_NAME); show_item(RX_MENU_1010_NR); show_item(RX_MENU_XCHG); break; case LOG_ARR: show_item(RX_MENU_NAME); show_item(RX_MENU_CHECK); show_item(RX_MENU_XCHG); break; case LOG_AICW: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_POWER); show_item(RX_MENU_COUNTRY); break; case LOG_KD: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_NAME); show_item(RX_MENU_AGE); show_item(RX_MENU_STATE); show_item(RX_MENU_PROVINCE); show_item(RX_MENU_XCHG); break; case LOG_NAS: show_item(RX_MENU_NAME); show_item(RX_MENU_SERIAL); show_item(RX_MENU_STATE); show_item(RX_MENU_PROVINCE); show_item(RX_MENU_COUNTRY); break; case LOG_AIDX: show_item(RX_MENU_SERIAL); show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_COUNTRY); break; case LOG_NAQP: show_item(RX_MENU_NAME); show_item(RX_MENU_NAQP); break; case LOG_RTTY: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_STATE); show_item(RX_MENU_COUNTRY); show_item(RX_MENU_SERIAL); break; case LOG_IARI: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_COUNTRY); show_item(RX_MENU_PROVINCE); show_item(RX_MENU_SERIAL); break; case LOG_JOTA: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_SCOUT); show_item(RX_MENU_TROOP); show_item(RX_MENU_STATE); show_item(RX_MENU_PROVINCE); show_item(RX_MENU_COUNTRY); break; case LOG_SQSO: show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); show_item(RX_MENU_QSOP_STATE); show_item(RX_MENU_QSOP_COUNTY); show_item(RX_MENU_QSOP_SERNO); show_item(RX_MENU_QSOP_NAME); show_item(RX_MENU_QSOP_CAT); break; // case LOG_WAE: // show_item(RX_MENU_RST_IN); // show_item(RX_MENU_RST_OUT); // show_item(RX_MENU_SERIAL); // show_item(RX_MENU_COUNTRY); // break; case LOG_BART: show_item(RX_MENU_NAME); show_item(RX_MENU_SERIAL); show_item(RX_MENU_XCHG); show_item(RX_MENU_RST_IN); break; case LOG_GENERIC: default: show_item(RX_MENU_SERIAL); show_item(RX_MENU_XCHG); show_item(RX_MENU_RST_IN); break; } } else { show_item(RX_MENU_NAME); show_item(RX_MENU_QTH); show_item(RX_MENU_RST_IN); show_item(RX_MENU_RST_OUT); // "Look up call" shown only in non-contest mode if (progdefaults.QRZWEB != QRZWEBNONE || progdefaults.QRZXML != QRZXMLNONE) show_item(RX_MENU_QRZ_THIS); menu[RX_MENU_CALL].flags |= FL_MENU_DIVIDER; } if (menu[RX_MENU_ALL_ENTRY].value()) { for (size_t i = RX_MENU_NAME; i <= RX_MENU_RST_OUT; i++) show_item(i); menu[RX_MENU_CALL].flags &= ~FL_MENU_DIVIDER; } if (static_cast(mVScrollBar)->has_marks()) menu[RX_MENU_SCROLL_HINTS].show(); else menu[RX_MENU_SCROLL_HINTS].hide(); for (size_t i = RX_MENU_QRZ_THIS; i < RX_MENU_DIV; i++) { if (test_item(i)) menu[i].show(); else menu[i].hide(); } #undef show_item #undef hide_item #undef test_item // availability of editing items depend on buffer state icons::set_active(&menu[RX_MENU_COPY], tbuf->selected()); icons::set_active(&menu[RX_MENU_CLEAR], tbuf->length()); icons::set_active(&menu[RX_MENU_SELECT_ALL], tbuf->length()); icons::set_active(&menu[RX_MENU_SAVE], tbuf->length()); if (wrap) menu[RX_MENU_WRAP].set(); else menu[RX_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextRX::menu_cb(size_t item) { Fl_Input2* input = 0; std::string s; char* str = get_word(popx, popy, "", 1, false); if (str) { s = str; free(str); } // remove leading substrings such as 'loc:' 'qth:' 'op:' etc size_t sp = std::string::npos; if ((sp = s.find(":")) != std::string::npos) s.erase(0, sp+1); if (!s.empty()) while (s[s.length() -1] <= ' ') s.erase(s.length() - 1); if (s.empty()) { switch (item) { case RX_MENU_CLEAR: clear(); break; case RX_MENU_SELECT_ALL: tbuf->select(0, tbuf->length()); break; case RX_MENU_SAVE: saveFile(); break; case RX_MENU_ALL_ENTRY: menu[item].flags ^= FL_MENU_VALUE; if (menu[item].value()) handle_context_menu(); break; case RX_MENU_WRAP: set_word_wrap(!wrap, true); break; case RX_MENU_DIV: note_qrg(false, "\n", "\n"); break; case RX_MENU_SCROLL_HINTS: menu[item].flags ^= FL_MENU_VALUE; static_cast(mVScrollBar)->show_marks(menu[item].value()); break; default: ; } return; } switch (item) { case RX_MENU_QRZ_THIS: menu_cb(RX_MENU_CALL); extern void CALLSIGNquery(); CALLSIGNquery(); break; case RX_MENU_CALL: input = inpCall; break; case RX_MENU_NAME: input = inpName; break; case RX_MENU_QTH: input = inpQTH; break; case RX_MENU_STATE: if (progdefaults.logging == LOG_NAS) input = inpXchgIn; else if (progdefaults.logging == LOG_JOTA) input = inp_JOTA_spc; else input = inpState; break; case RX_MENU_LOC: input = inpLoc; break; case RX_MENU_RST_IN: input = inpRstIn; break; case RX_MENU_RST_OUT: input = inpRstOut; break; case RX_MENU_SERIAL: if (progdefaults.logging == LOG_IARI) input = inpXchgIn; else input = inpSerNo; break; case RX_MENU_XCHG: input = inpXchgIn; break; case RX_MENU_POWER: input = inpSPCnum; break; case RX_MENU_CLASS: input = inpClass; break; case RX_MENU_SECTION: input = inpSection; break; case RX_MENU_SS_SER: input = inp_SS_SerialNoR; break; case RX_MENU_SS_PRE: input = inp_SS_Precedence; break; case RX_MENU_SS_CHK: input = inp_SS_Check; break; case RX_MENU_SS_SEC: input = inp_SS_Section; break; case RX_MENU_CQZONE: input = inp_CQzone; break; case RX_MENU_CQSTATE: input = inp_CQstate; break; case RX_MENU_1010_NR: input = inp_1010_nr; break; case RX_MENU_AGE: input = inp_KD_age; break; case RX_MENU_CHECK: input = inp_ARR_check; break; case RX_MENU_NAQP: input = inpSPCnum; break; case RX_MENU_SCOUT: input = inp_JOTA_scout; break; case RX_MENU_TROOP: input = inp_JOTA_troop; break; case RX_MENU_QSOP_STATE: input = inpState; break; case RX_MENU_QSOP_COUNTY: input = inpCounty; break; case RX_MENU_QSOP_SERNO: input = inpSerNo; break; case RX_MENU_QSOP_NAME: input = inpName; break; case RX_MENU_QSOP_XCHG: input = inpXchgIn; break; case RX_MENU_QSOP_CAT: input = inpXchgIn; break; case RX_MENU_DIV: note_qrg(false, "\n", "\n"); break; case RX_MENU_COPY: kf_copy(Fl::event_key(), this); break; case RX_MENU_CLEAR: clear(); break; case RX_MENU_SELECT_ALL: tbuf->select(0, tbuf->length()); break; case RX_MENU_SAVE: saveFile(); break; case RX_MENU_ALL_ENTRY: menu[item].flags ^= FL_MENU_VALUE; if (menu[item].value()) handle_context_menu(); break; case RX_MENU_WRAP: set_word_wrap(!wrap, true); break; case RX_MENU_SCROLL_HINTS: menu[item].flags ^= FL_MENU_VALUE; static_cast(mVScrollBar)->show_marks(menu[item].value()); break; case RX_MENU_COUNTRY: if (progdefaults.logging == LOG_NAS) inpXchgIn->value(s.c_str()); else if (progdefaults.logging == LOG_JOTA) inp_JOTA_spc->value(s.c_str()); else cboCountry->value(s.c_str()); return; case RX_MENU_PROVINCE: if (progdefaults.logging == LOG_NAS) inpXchgIn->value(s.c_str()); else if (progdefaults.logging == LOG_JOTA) inp_JOTA_spc->value(s.c_str()); else if (progdefaults.logging == LOG_IARI) inpXchgIn->value(s.c_str()); else set_province(s); return; case RX_MENU_COUNTY: set_cbo_county(s.c_str()); return; default: return; } restoreFocus(92); if (!input) return; if (item == RX_MENU_XCHG) { // append input->position(input->size()); if (input->size()) input->insert(" ", 1); input->insert(s.c_str()); } else if (item == RX_MENU_SECTION) { if (check_field(ucasestr(s).c_str(), cFD_SECTION)) input->value(ucasestr(s).c_str()); } else if (item == RX_MENU_CLASS) { if (check_field(ucasestr(s).c_str(), cFD_CLASS)) input->value(ucasestr(s).c_str()); } else if (item == RX_MENU_RST_IN) { if (check_field(s, cRST)) { set_rst_in(s); } } else if (item == RX_MENU_RST_OUT) { if (check_field(s, cRST)) set_rst_out(s); } else { if (input == inpCounty) set_cbo_county(s.c_str()); else { input->value(s.c_str()); log_callback(input); } } } const char* FTextRX::dxcc_lookup_call(int x, int y) { char* s = get_word(x - this->x(), y - this->y(), progdefaults.nonwordchars.c_str()); char* mem = s; if (!(s && *s && call.match(s))) { free(s); return 0; } double lon1, lat1, lon2 = 360.0, lat2 = 360.0, distance, azimuth; static std::string tip; std::ostringstream stip; const dxcc* e = 0; cQsoRec* qso = 0; unsigned char qsl; // prevent locator-only lookup if Ctrl is held if (!(Fl::event_state() & FL_CTRL) && loc.match(s)) { const std::vector& v = loc.suboff(); s += v[0].rm_so; *(s + v[0].rm_eo) = '\0'; if (QRB::locator2longlat(&lon2, &lat2, s) != QRB::QRB_OK) goto ret; e = 0; qsl = 0; qso = 0; } else { e = dxcc_lookup(s); qsl = qsl_lookup(s); qso = SearchLog(s); } if (qso && QRB::locator2longlat(&lon2, &lat2, qso->getField(GRIDSQUARE)) != QRB::QRB_OK) lon2 = lat2 = 360.0; if (e) { // use dxcc data if we didn't have a good locator string in the log file if (lon2 == 360.0) lon2 = -e->longitude; if (lat2 == 360.0) lat2 = e->latitude; stip << e->country << " (" << e->continent << " GMT" << std::fixed << std::showpos << std::setprecision(1) << -e->gmt_offset << std::noshowpos << ") CQ-" << e->cq_zone << " ITU-" << e->itu_zone << '\n'; } if (QRB::locator2longlat(&lon1, &lat1, progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == QRB::QRB_OK) { if (progdefaults.us_units) { stip << "QTE " << std::fixed << std::setprecision(0) << azimuth << '\260' << " (" << QRB::azimuth_long_path(azimuth) << '\260' << ") QRB " << distance * 0.62168188 << "mi"<< " (" << QRB::distance_long_path(distance) * 0.62168188 << "mi)\n"; } else { stip << "QTE " << std::fixed << std::setprecision(0) << azimuth << '\260' << " (" << QRB::azimuth_long_path(azimuth) << '\260' << ") QRB " << distance << "km(" << QRB::distance_long_path(distance) << "km)\n"; } } if (qso) { if (qso->getField(NAME)[0]) { stip << "* " << qso->getField(NAME); if (qso->getField(QTH)[0]) stip << _(" in ") << qso->getField(QTH); stip << "\n"; } if (qso->getField(QSO_DATE)[0]) stip << "* " << _("Last QSO") << ": " << qso->getField(QSO_DATE); if (qso->getField(BAND)[0]) stip << ", " << qso->getField(BAND); if (qso->getField(ADIF_MODE)[0]) stip << ", " << qso->getField(ADIF_MODE); stip << "\n"; } if (qsl) { stip << "* QSL: "; for (unsigned char i = 0; i < QSL_END; i++) if (qsl & (1 << i)) stip << qsl_names[i] << ' '; stip << '\n'; } ret: free(mem); tip = stip.str(); return tip.empty() ? 0 : tip.c_str(); } void FTextRX::dxcc_tooltip(void* obj) { struct point { int x, y; bool operator==(const point& p) { return x == p.x && y == p.y; } bool operator!=(const point& p) { return !(*this == p); } }; static point p[3] = { {0, 0}, {0, 0}, {0, 0} }; memmove(p, p+1, 2 * sizeof(point)); p[2].x = Fl::event_x(); p[2].y = Fl::event_y(); static const char* tip = 0; FTextRX* v = reinterpret_cast(obj); // look up word under cursor if we have been called twice with the cursor // at the same position, and if the cursor was previously somewhere else if (p[2] == p[1] && p[2] != p[0] && ((tip = v->dxcc_lookup_call(p[2].x, p[2].y)))) Fl_Tooltip::enter_area(v, p[2].x, p[2].y, 100, 100, tip); else if (p[2] != p[1]) Fl_Tooltip::exit(v); Fl::repeat_timeout(tip ? Fl_Tooltip::hoverdelay() : v->tooltips.delay / 2.0, dxcc_tooltip, obj); } // ---------------------------------------------------------------------------- Fl_Menu_Item FTextTX::menu[] = { { icons::make_icon_label(_("Transmit"), tx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Receive"), rx_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Abort"), process_stop_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Send image..."), image_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { 0 }, // EDIT_MENU_CUT { 0 }, // EDIT_MENU_COPY { 0 }, // EDIT_MENU_PASTE { 0 }, // EDIT_MENU_CLEAR { 0 }, // EDIT_MENU_READ { 0 }, // EDIT_MENU_WRAP { _("Spec Char"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "¢ - cent", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "£ - pound", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "µ - micro", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "° - degree", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "¿ - iques", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "× - times", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "÷ - divide", 0, 0, 0, 0, FL_NORMAL_LABEL }, { _("A"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "À - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("E"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "È - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "è - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "É - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "é - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("I"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("N"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("O"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("U"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Y"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ÿ - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Other"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "ß - szlig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Þ - thorn", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { 0 } }; // needed by our static kf functions, which may restrict editing depending on // the transmit cursor position int *FTextTX::ptxpos; FTextTX::FTextTX(int x, int y, int w, int h, const char *l) : FTextEdit(x, y, w, h, l), PauseBreak(false), txpos(0), bkspaces(0) { ptxpos = &txpos; change_keybindings(); memcpy(menu + TX_MENU_CUT, FTextEdit::menu, (FTextEdit::menu->size() - 1) * sizeof(*FTextEdit::menu)); context_menu = menu; init_context_menu(); utf8_txpos = txpos = 0; } /// Handles fltk events for this widget. /// We pass keyboard events to handle_key() and handle mouse3 presses to show /// the popup menu. We also disallow mouse2 events in the transmitted text area. /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int FTextTX::handle(int event) { if ( !(Fl::event_inside(this) || (event == FL_KEYBOARD && Fl::focus() == this)) ) return FTextEdit::handle(event); switch (event) { case FL_KEYBOARD: if (active_modem->get_mode() == MODE_FSQ) { if (Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter) { fsq_transmit(0); return 1; } } return handle_key(Fl::event_key()) ? 1 : FTextEdit::handle(event); case FL_PUSH: if (Fl::event_button() == FL_MIDDLE_MOUSE && xy_to_position(Fl::event_x(), Fl::event_y(), CHARACTER_POS) < txpos) return 1; // ignore mouse2 text pastes inside the transmitted text } return FTextEdit::handle(event); } /// Clears the buffer. /// Also resets the transmit position, stored backspaces and tx pause flag. /// void FTextTX::clear(void) { FTextEdit::clear(); txpos = 0; utf8_txpos = 0; bkspaces = 0; PauseBreak = false; } /// Clears the sent text. /// Also resets the transmit position, stored backspaces and tx pause flag. /// void FTextTX::clear_sent(void) { tbuf->remove(0, utf8_txpos); sbuf->remove(0, utf8_txpos); txpos = 0; utf8_txpos = 0; bkspaces = 0; PauseBreak = false; set_word_wrap(restore_wrap); } /// Returns boolean end of text /// /// true if empty buffer /// false if characters remain /// bool FTextTX::eot(void) { return (insert_position() == txpos); } /// Returns the next character to be transmitted. /// /// @return The next character, or ETX if the transmission has been paused, or /// NUL if no text should be transmitted. /// int FTextTX::nextChar(void) { int c; if (bkspaces) { --bkspaces; c = '\b'; } else if (PauseBreak) { PauseBreak = false; c = GET_TX_CHAR_ETX;//0x03; } else if (insert_position() <= utf8_txpos) { // empty buffer or cursor inside transmitted text c = -1; } else { if ((c = tbuf->char_at(utf8_txpos)) > 0) { int n = fl_utf8bytes(c); REQ(FTextTX::changed_cb, utf8_txpos, 0, 0, -1, static_cast(0), this); REQ(FTextTX::changed_cb, utf8_txpos+1, 0, 0, -1, static_cast(0), this); ++txpos; utf8_txpos += n; } else c = -1; } return c; } // called by xmlrpc thread // called by macro execution void FTextTX::add_text(std::string s) { for (size_t n = 0; n < s.length(); n++) { if (s[n] == '\b') { int ipos = insert_position(); if (tbuf->length()) { if (ipos > 0 && txpos == ipos) { bkspaces++; txpos--; int nn; tbuf->get_char_at(utf8_txpos, nn); utf8_txpos -= nn; } tbuf->remove(tbuf->length() - 1, tbuf->length()); sbuf->remove(sbuf->length() - 1, sbuf->length()); redraw(); } } else { //LOG_DEBUG("%04x ", s[n] & 0x00FF); add(s[n] & 0xFF, RECV); } } } void FTextTX::setFont(Fl_Font f, int attr) { FTextBase::setFont(f, attr); } /// Handles keyboard shorcuts /// /// @param key // pressed key /// /// @return // 1 if shortcut is handled, otherwise 0. /// int FTextTX::handle_key_shortcuts(int key) { std::string etag = ""; switch (key) { case 'c': // add for SC-c case 'm': // add for SC-m case 'n': // add for SC-n case 'r': // add rcvd for SC-r case 's': // add sent for SC-s case 'l': // add for SC-l case 'h': // add for SC-h case 'a': // add for SC-a case 'g': // add 0x07 if ((Fl::event_state() & FL_CTRL) && (Fl::event_state() & FL_SHIFT)) // if ((Fl::event_state() & (FL_CTRL | FL_SHIFT))) // investigate why this doesn't work... { switch (key) { case 'c': etag = inpCall->value(); break; case 'm': etag = progdefaults.myCall; break; case 'n': etag = inpName->value(); break; case 'r': { std::string s; etag = (s = inpRstIn->value()).length() ? s : std::string("599"); } break; case 's': { std::string s; etag = (s = inpRstOut->value()).length() ? s : std::string("599"); } break; case 'l': etag = progdefaults.myLocator; break; case 'h': etag = progdefaults.myQth; break; case 'a': etag = progdefaults.myAntenna; break; case 'g': etag = "\007"; break; default: break; } // Add text + space if length is > 0 if (etag.length()) { add_text(etag); if (etag != "\007") add_text(" "); return 1; } } break; default: break; } return 0; } /// Handles keyboard events to override Fl_Text_Editor_mod's handling of some /// keystrokes. /// /// @param key /// /// @return /// int FTextTX::handle_key(int key) { if (handle_key_shortcuts(key)) return 1; switch (key) { case FL_Escape: // set stop flag and clear { static time_t t[2] = { 0, 0 }; static unsigned char i = 0; if (t[i] == time(&t[!i])) { // two presses in a second: abort transmission if (trx_state == STATE_TX) menu_cb(TX_MENU_ABORT); t[i = !i] = 0; return 1; } i = !i; } if (trx_state == STATE_TX && active_modem->get_stopflag() == false) { kf_select_all(0, this); kf_copy(0, this); clear(); if (arq_text_available) AbortARQ(); active_modem->set_stopflag(true); } if (trx_state == STATE_TUNE) abort_tx(); stopMacroTimer(); return 1; case 't': // transmit for C-t if (trx_state == STATE_RX && Fl::event_state() & FL_CTRL) { menu_cb(TX_MENU_TX); return 1; } break; case 'r':// receive for C-r if (Fl::event_state() & FL_CTRL) { menu_cb(TX_MENU_RX); return 1; } else if (!(Fl::event_state() & (FL_META | FL_ALT))) break; // fall through to (un)pause for M-r or A-r case 'p': // same as Pause/Break key if (Fl::event_state() & FL_CTRL) { if (trx_state != STATE_TX) { start_tx(); } else { PauseBreak = true; } return 1; } break; case FL_Pause: if (trx_state != STATE_TX) { start_tx(); } else PauseBreak = true; return 1; case (FL_KP + '+'): if (active_modem == cw_modem) active_modem->incWPM(); return 1; case (FL_KP + '-'): if (active_modem == cw_modem) active_modem->decWPM(); return 1; case (FL_KP + '*'): if (active_modem == cw_modem) active_modem->toggleWPM(); return 1; case FL_Tab: if (active_modem == fsq_modem) return 1; // In non-CW modes: Tab and Ctrl-tab both pause until user moves the // cursor to let some more text through. Another (ctrl-)tab goes back to // the end of the buffer and resumes sending. // In CW mode: Tab pauses, skips rest of buffer, applies the // SKIP style, then resumes sending when new text is entered. // Ctrl-tab does the same thing as for all other modes. if (utf8_txpos != insert_position()) insert_position(utf8_txpos); else insert_position(tbuf->length()); if (!(Fl::event_state() & FL_CTRL) && active_modem == cw_modem) { int n = tbuf->length() - utf8_txpos; char s[n + 1]; memset(s, FTEXT_DEF + SKIP, n); s[n] = 0; sbuf->replace(utf8_txpos, sbuf->length(), s); insert_position(tbuf->length()); redisplay_range(utf8_txpos, insert_position()); utf8_txpos = insert_position(); } return 1; // Move cursor, or search up/down with the Meta/Alt modifiers case FL_Left: if (Fl::event_state() & (FL_META | FL_ALT)) { if (active_modem == fsq_modem) return 1; active_modem->searchDown(); return 1; } return 0; case FL_Right: if (Fl::event_state() & (FL_META | FL_ALT)) { if (active_modem == fsq_modem) return 1; active_modem->searchUp(); return 1; } return 0; // queue a BS and decr. the txpos, unless the cursor is in the tx text case FL_BackSpace: { int ipos = insert_position(); if (utf8_txpos > 0 && utf8_txpos == ipos) { bkspaces++; utf8_txpos = tbuf->prev_char(ipos); txpos--; } return 0; } // alt - 1 / 2 changes macro sets case '1': case '2': case '3': case '4': if (Fl::event_state() & FL_ALT) { if (active_modem == fsq_modem) return 1; static char lbl[2] = "1"; altMacros = key - '1'; if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (!altMacros) altMacros = 1; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[NUMMACKEYS + i]->label( macros.name[(altMacros * NUMMACKEYS) + i].c_str()); btnMacro[NUMMACKEYS + i]->redraw_label(); } lbl[0] = key; btnAltMacros2->label(lbl); btnAltMacros2->redraw_label(); } else { for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label( macros.name[(altMacros * NUMMACKEYS) + i].c_str()); btnMacro[i]->redraw_label(); } lbl[0] = key; btnAltMacros1->label(lbl); btnAltMacros1->redraw_label(); } return 1; } break; default: break; } if (insert_position() < txpos) return 1; // insert a macro if (key >= FL_F && key <= FL_F_Last) { return handle_key_macro(key); } // read ctl-ddd, where d is a digit, as ascii characters (in base 10) // and insert verbatim; e.g. ctl-001 inserts a if (Fl::event_state() & FL_CTRL && (key >= FL_KP) && (key <= FL_KP + '9')) return handle_key_ascii(key); // restart the numeric keypad entries. ascii_cnt = 0; ascii_chr = 0; return 0; } /// Inserts the macro for function key \c key. /// /// @param key An integer in the range [FL_F, FL_F_Last] /// /// @return 1 /// int FTextTX::handle_key_macro(int key) { key -= FL_F + 1; if (active_modem == fsq_modem) { if (key == 0) fsq_repeat_last_heard(); if (key == 1) fsq_repeat_last_command(); return 1; } if (key > 11) return 0; if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (Fl::event_state(FL_SHIFT)) key += altMacros * NUMMACKEYS; } else { key += altMacros * NUMMACKEYS; } if (!(macros.text[key]).empty()) macros.execute(key); return 1; } int FTextTX::handle_dnd_drag(int pos) { if (pos >= txpos) { return FTextEdit::handle_dnd_drag(pos); } else // refuse drop inside transmitted text return 0; } /// Handles mouse-3 clicks by displaying the context menu /// /// @param val /// void FTextTX::handle_context_menu(void) { // adjust Abort/Transmit/Receive menu items switch (trx_state) { case STATE_TX: menu[TX_MENU_TX].hide(); menu[TX_MENU_RX].show(); menu[TX_MENU_ABORT].show(); break; case STATE_TUNE: menu[TX_MENU_TX].hide(); menu[TX_MENU_RX].show(); menu[TX_MENU_ABORT].hide(); break; default: menu[TX_MENU_TX].show(); menu[TX_MENU_RX].hide(); menu[TX_MENU_ABORT].hide(); break; } bool modify_text_ok = insert_position() >= txpos; bool selected = tbuf->selected(); icons::set_active(&menu[TX_MENU_MFSK16_IMG], active_modem->get_cap() & modem::CAP_IMG); icons::set_active(&menu[TX_MENU_CLEAR], tbuf->length()); icons::set_active(&menu[TX_MENU_CUT], selected && modify_text_ok); icons::set_active(&menu[TX_MENU_COPY], selected); icons::set_active(&menu[TX_MENU_PASTE], modify_text_ok); icons::set_active(&menu[TX_MENU_READ], modify_text_ok); if (wrap) menu[TX_MENU_WRAP].set(); else menu[TX_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void FTextTX::menu_cb(size_t item) { switch (item) { case TX_MENU_TX: active_modem->set_stopflag(false); start_tx(); break; case TX_MENU_ABORT: char panic[200]; snprintf(panic, sizeof(panic), "*** Don't panic *** %s", progdefaults.myName.c_str()); put_status(panic, 5.0); abort_tx(); break; case TX_MENU_RX: if (trx_state == STATE_TX) { insert_position(tbuf->length()); add("^r", CTRL); } else abort_tx(); break; case TX_MENU_MFSK16_IMG: { trx_mode md = active_modem->get_mode(); if (md == MODE_IFKP) ifkp_showTxViewer(); else if (md >= MODE_THOR_FIRST && md <= MODE_THOR_LAST) thor_showTxViewer(); else showTxViewer(0, 0); break; } case TX_MENU_CLEAR: clear(); break; case TX_MENU_CUT: kf_cut(0, this); break; case TX_MENU_COPY: kf_copy(0, this); break; case TX_MENU_PASTE: kf_paste(0, this); break; case TX_MENU_READ: { restore_wrap = wrap; set_word_wrap(false); readFile(); break; } case TX_MENU_WRAP: set_word_wrap(!wrap, true); break; default: if (FTextTX::menu[item].flags == 0) { // not an FL_SUB_MENU add(FTextTX::menu[item].text[0]); add(FTextTX::menu[item].text[1]); } } } /// Overrides some useful Fl_Text_Edit keybindings that we want to keep working, /// provided that they don't try to change chunks of transmitted text. /// void FTextTX::change_keybindings(void) { struct { Fl_Text_Editor_mod::Key_Func function, override; } fbind[] = { { Fl_Text_Editor_mod::kf_default, FTextTX::kf_default }, { Fl_Text_Editor_mod::kf_enter, FTextTX::kf_enter }, { Fl_Text_Editor_mod::kf_delete, FTextTX::kf_delete }, { Fl_Text_Editor_mod::kf_cut, FTextTX::kf_cut }, { Fl_Text_Editor_mod::kf_paste, FTextTX::kf_paste } }; int n = sizeof(fbind) / sizeof(fbind[0]); // walk the keybindings linked list and replace items containing // functions for which we have an override in fbind for (Fl_Text_Editor_mod::Key_Binding *k = key_bindings; k; k = k->next) { for (int i = 0; i < n; i++) if (fbind[i].function == k->function) k->function = fbind[i].override; } } // The kf_* functions below call the corresponding Fl_Text_Editor_mod routines, but // may make adjustments so that no transmitted text is modified. int FTextTX::kf_default(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *ptxpos ? 1 : Fl_Text_Editor_mod::kf_default(c, e); } int FTextTX::kf_enter(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *ptxpos ? 1 : Fl_Text_Editor_mod::kf_enter(c, e); } int FTextTX::kf_delete(int c, Fl_Text_Editor_mod* e) { // single character if (!e->buffer()->selected()) { if (e->insert_position() >= *ptxpos && e->insert_position() != e->buffer()->length()) return Fl_Text_Editor_mod::kf_delete(c, e); else return 1; } // region: delete as much as we can int start, end; e->buffer()->selection_position(&start, &end); if (*ptxpos >= end) return 1; if (*ptxpos > start) e->buffer()->select(*ptxpos, end); return Fl_Text_Editor_mod::kf_delete(c, e); } int FTextTX::kf_cut(int c, Fl_Text_Editor_mod* e) { if (e->buffer()->selected()) { int start, end; e->buffer()->selection_position(&start, &end); if (*ptxpos >= end) return 1; if (*ptxpos > start) e->buffer()->select(*ptxpos, end); } return Fl_Text_Editor_mod::kf_cut(c, e); } int FTextTX::kf_paste(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *ptxpos ? 1 : Fl_Text_Editor_mod::kf_paste(c, e); } // ---------------------------------------------------------------------------- void MVScrollbar::draw(void) { Fl_Scrollbar::draw(); if (marks.empty() || !draw_marks) return; assert((type() & FL_HOR_SLIDER) == 0); // Calculate the slider knob position and height. For a vertical scrollbar, // the scroll buttons' height is the scrollbar width and the minimum knob // height is half that. int H = h() - Fl::box_dh(box()) - 2 * w(); // internal height (minus buttons) int slider_h = (int)(slider_size() * H + 0.5); int min_h = (w() - Fl::box_dw(box())) / 2 + 1; if (slider_h < min_h) slider_h = min_h; double val = (Fl_Slider::value() - minimum()) / (maximum() - minimum()); int slider_y = (int)(val * (H - slider_h) + 0.5) + w(); // relative to y() // This would draw a green rectangle around the slider knob: // fl_color(FL_GREEN); // fl_rect(x(), y() + slider_y, w() - Fl::box_dw(box()), slider_h); int x1 = x() + Fl::box_dx(box()), x2 = x1 + w() - Fl::box_dw(box()) - 1, ypos; // Convert stored scrollbar values to vertical positions and draw // lines inside the widget if they don't overlap with the knob area. for (std::vector::const_iterator i = marks.begin(); i != marks.end(); ++i) { ypos = static_cast(w() + H * i->pos / maximum()); // Don't draw over slider knob if ((ypos > slider_y && ypos < slider_y + slider_h) || (ypos < slider_y + slider_h && ypos > slider_y)) continue; ypos += y(); fl_color(i->color); fl_line(x1, ypos, x2, ypos); } } fldigi-4.2.05/src/widgets/flinput2.cxx0000664000175000017500000002462514611711171014520 00000000000000// ---------------------------------------------------------------------------- // flinput2.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "icons.h" #include "flinput2.h" #include "gettext.h" #include "debug.h" enum { OP_UNDO, OP_CUT, OP_COPY, OP_PASTE, OP_DELETE, OP_CLEAR, OP_SELECT_ALL }; static Fl_Menu_Item cmenu[] = { { icons::make_icon_label(_("Undo"), edit_undo_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Cut"), edit_cut_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Copy"), edit_copy_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Paste"), edit_paste_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Delete"), trash_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Clear"), edit_clear_icon), 0, 0, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL }, { icons::make_icon_label(_("Select All"), edit_select_all_icon), 0, 0, 0, 0, _FL_MULTI_LABEL }, { _("Spec Char"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "¢ - cent", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "£ - pound", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "µ - micro", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "° - degree", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "¿ - iques", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "× - times", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "÷ - divide", 0, 0, 0, 0, FL_NORMAL_LABEL }, { _("A"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "À - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("E"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "È - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "è - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "É - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "é - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("I"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("N"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("O"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("U"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Y"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ÿ - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Other"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "ß - szlig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Þ - thorn", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0} }; static bool cmenu_init = false; Fl_Input2::Fl_Input2(int x, int y, int w, int h, const char* l) : Fl_Input(x, y, w, h, l) { if (!cmenu_init) { for (size_t i = 0; i < sizeof(cmenu)/sizeof(*cmenu) - 1; i++) if (cmenu[i].labeltype() == _FL_MULTI_LABEL) icons::set_icon_label(&cmenu[i]); cmenu_init = true; } ascii_cnt = 0; // restart the numeric keypad entries. ascii_chr = 0; utf8text = NULL; } //---------------------------------------------------------------------- /// Composes ascii characters and adds them to the Fl_Input2 buffer. /// Control characters are inserted with the CTRL style. Values larger than 127 /// (0x7f) are ignored. We cannot really add NULs for the time being. /// /// @param key A digit character /// /// @return 1 /// int Fl_Input2::handle_key_ascii(int key) { if (key >= FL_KP) key -= FL_KP; key -= '0'; ascii_cnt++; ascii_chr *= 10; ascii_chr += key; if (ascii_cnt == 3) { if (ascii_chr < 0x100) { utf8text = new char[fl_utf8bytes(ascii_chr) + 1]; utf8cnt = fl_utf8encode(ascii_chr, utf8text); return 1; } ascii_cnt = ascii_chr = 0; } return 0; } //---------------------------------------------------------------------- int Fl_Input2::handle(int event) { switch (event) { case FL_KEYBOARD: { int b = Fl::event_key(); if (b == FL_Enter || b == FL_KP_Enter) { do_callback(); return Fl_Input::handle(event); } if (b == FL_Tab) { do_callback(); return Fl_Input::handle(event); } if ((Fl::event_state() & FL_CTRL) && (isdigit(b) || isdigit(b - FL_KP))) { if (handle_key_ascii(b)) { if (utf8text) { insert(utf8text, utf8cnt); delete utf8text; } ascii_cnt = 0; ascii_chr = 0; } return 1; } ascii_cnt = 0; ascii_chr = 0; int p = position(); // stop the move-to-next-field madness, we have Tab for that! if (unlikely((b == FL_Left && p == 0) || (b == FL_Right && p == size()) || (b == FL_Up && line_start(p) == 0) || (b == FL_Down && line_end(p) == size()))) return 1; else if (unlikely(Fl::event_state() & (FL_ALT | FL_META))) { switch (b) { case 'c': { // capitalise if (readonly() || p == size()) return 1; while (p < size() && isspace(*(value() + p))) p++; if (p == size()) return 1; char c = toupper(*(value() + p)); replace(p, p + 1, &c, 1); position(word_end(p)); } return 1; case 'u': case 'l': { // upper/lower case if (readonly() || p == size()) return 1; while (p < size() && isspace(*(value() + p))) p++; int n = word_end(p) - p; if (n == 0) return 1; char* s = new char[n]; memcpy(s, value() + p, n); if (b == 'u') for (int i = 0; i < n; i++) s[i] = toupper(s[i]); else for (int i = 0; i < n; i++) s[i] = tolower(s[i]); replace(p, p + n, s, n); position(p + n); delete [] s; return 1; } default: break; } } return Fl_Input::handle(event); } case FL_MOUSEWHEEL: { if (!((type() & (FL_MULTILINE_INPUT | FL_MULTILINE_OUTPUT)) && Fl::event_inside(this))) return Fl_Input::handle(event); int d; if (!((d = Fl::event_dy()) || (d = Fl::event_dx()))) return Fl_Input::handle(event); if (Fl::focus() != this) take_focus(); up_down_position(d + (d > 0 ? line_end(position()) : line_start(position()))); return 1; } case FL_PUSH: if (Fl::event_button() == FL_RIGHT_MOUSE) break; // fall through default: return Fl_Input::handle(event); } bool sel = position() != mark(), ro = readonly(); icons::set_active(&cmenu[OP_UNDO], !ro); icons::set_active(&cmenu[OP_CUT], !ro && sel); icons::set_active(&cmenu[OP_COPY], sel); icons::set_active(&cmenu[OP_PASTE], !ro); icons::set_active(&cmenu[OP_DELETE], !ro && sel); icons::set_active(&cmenu[OP_CLEAR], !ro && size()); icons::set_active(&cmenu[OP_SELECT_ALL], size()); take_focus(); window()->cursor(FL_CURSOR_DEFAULT); int t = Fl_Tooltip::enabled(); Fl_Tooltip::disable(); const Fl_Menu_Item* m = cmenu->popup(Fl::event_x(), Fl::event_y()); Fl_Tooltip::enable(t); if (!m) return 1; switch (m - cmenu) { case OP_UNDO: undo(); break; case OP_CUT: cut(); copy_cuts(); break; case OP_COPY: copy(1); break; case OP_PASTE: Fl::paste(*this, 1); break; case OP_DELETE: cut(); break; case OP_CLEAR: cut(0, size()); break; case OP_SELECT_ALL: position(0, size()); break; default: insert(m->text, 1); } return 1; } fldigi-4.2.05/src/widgets/F_Edit.cxx0000664000175000017500000002725514611711171014111 00000000000000// ---------------------------------------------------------------------------- // FTextView.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // Copyright (C) 2008-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "flmisc.h" #include "fileselect.h" #include "font_browser.h" #include "ascii.h" #include "icons.h" #include "gettext.h" #include "macros.h" #include "F_Edit.h" #include "debug.h" int * F_Edit::p_editpos; Fl_Menu_Item F_Edit::menu[] = { { 0 }, // EDIT_MENU_CUT { 0 }, // EDIT_MENU_COPY { 0 }, // EDIT_MENU_PASTE { 0 }, // EDIT_MENU_CLEAR { 0 }, // EDIT_MENU_READ { 0 }, // EDIT_MENU_WRAP { _("Spec Char"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "¢ - cent", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "£ - pound", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "µ - micro", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "° - degree", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "¿ - iques", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "× - times", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "÷ - divide", 0, 0, 0, 0, FL_NORMAL_LABEL }, { _("A"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "À - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "à - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "á - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "â - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ã - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ä - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "å - ring", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "æ - aelig", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("E"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "È - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "è - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "É - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "é - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ê - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ë - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("I"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ì - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "í - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "î - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ï - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("N"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ñ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("O"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ò - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ó - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ô - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "õ - tilde", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ö - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ø - slash", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("U"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ù - grave", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ú - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "û - circ", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ü - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Y"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "Ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ý - acute", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ÿ - umlaut", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, { _("Other"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL }, { "ß - szlig", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ç - cedil", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "ð - eth", 0, 0, 0, 0, FL_NORMAL_LABEL }, { "Þ - thorn", 0, 0, 0, 0, FL_NORMAL_LABEL }, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { 0 } }; F_Edit::F_Edit(int x, int y, int w, int h, const char *l) : FTextEdit(x, y, w, h, l), editpos(0), bkspaces(0) { change_keybindings(); memcpy(menu + EDIT_MENU_CUT, FTextEdit::menu, (FTextEdit::menu->size() - 1) * sizeof(*FTextEdit::menu)); context_menu = menu; init_context_menu(); p_editpos = &editpos; } /// Handles fltk events for this widget. /// We pass keyboard events to handle_key() and handle mouse3 presses to show /// the popup menu. We also disallow mouse2 events in the transmitted text area. /// Everything else is passed to the base class handle(). /// /// @param event /// /// @return /// int F_Edit::handle(int event) { // if ( !(Fl::event_inside(this) || (event == FL_KEYBOARD && Fl::focus() == this)) ) // return FTextEdit::handle(event); // if (event == FL_KEYBOARD) // return handle_key(Fl::event_key()) ? 1 : FTextEdit::handle(event); return FTextEdit::handle(event); } /// Clears the buffer. /// Also resets the transmit position, stored backspaces and tx pause flag. /// void F_Edit::clear(void) { FTextEdit::clear(); editpos = 0; bkspaces = 0; } void F_Edit::add_text(std::string s) { for (size_t n = 0; n < s.length(); n++) { if (s[n] == '\b') { int ipos = insert_position(); if (tbuf->length()) { if (ipos > 0) { bkspaces++; int nn; tbuf->get_char_at(editpos, nn); editpos -= nn; } tbuf->remove(tbuf->length() - 1, tbuf->length()); sbuf->remove(sbuf->length() - 1, sbuf->length()); redraw(); } } else { add(s[n] & 0xFF, RECV); } } } void F_Edit::setFont(Fl_Font f, int attr) { FTextBase::setFont(f, attr); } /// Handles keyboard events to override Fl_Text_Editor_mod's handling of some /// keystrokes. /// /// @param key /// /// @return /// int F_Edit::handle_key(int key) { switch (key) { case FL_Tab: if (editpos != insert_position()) insert_position(editpos); else insert_position(tbuf->length()); return 1; case FL_BackSpace: { int ipos = insert_position(); if (editpos > 0 && editpos == ipos) { bkspaces++; editpos = tbuf->prev_char(ipos); } return 0; } default: break; } // read ctl-ddd, where d is a digit, as ascii characters (in base 10) // and insert verbatim; e.g. ctl-001 inserts a if (Fl::event_state() & FL_CTRL && (key >= FL_KP) && (key <= FL_KP + '9')) return handle_key_ascii(key); // restart the numeric keypad entries. ascii_cnt = 0; ascii_chr = 0; return 0; } int F_Edit::handle_dnd_drag(int pos) { return 1; return FTextEdit::handle_dnd_drag(pos); } /// Handles mouse-3 clicks by displaying the context menu /// /// @param val /// void F_Edit::handle_context_menu(void) { bool selected = tbuf->selected(); std::cout << "F_Edit::tbuf " << (selected ? "selected" : "not selected") << std::endl; icons::set_active(&menu[EDIT_MENU_CLEAR], tbuf->length()); icons::set_active(&menu[EDIT_MENU_CUT], selected); icons::set_active(&menu[EDIT_MENU_COPY], selected); icons::set_active(&menu[EDIT_MENU_PASTE], true); icons::set_active(&menu[EDIT_MENU_READ], true); if (wrap) menu[EDIT_MENU_WRAP].set(); else menu[EDIT_MENU_WRAP].clear(); show_context_menu(); } /// The context menu handler /// /// @param val /// void F_Edit::menu_cb(size_t item) { switch (item) { case EDIT_MENU_CLEAR: clear(); break; case EDIT_MENU_CUT: kf_cut(0, this); break; case EDIT_MENU_COPY: kf_copy(0, this); break; case EDIT_MENU_PASTE: kf_paste(0, this); break; case EDIT_MENU_READ: { restore_wrap = wrap; set_word_wrap(false); readFile(); break; } case EDIT_MENU_WRAP: set_word_wrap(!wrap, true); break; default: if (F_Edit::menu[item].flags == 0) { // not an FL_SUB_MENU add(F_Edit::menu[item].text[0]); add(F_Edit::menu[item].text[1]); } } } /// Overrides some useful Fl_Text_Edit keybindings that we want to keep working, /// provided that they don't try to change chunks of transmitted text. /// void F_Edit::change_keybindings(void) { struct { Fl_Text_Editor_mod::Key_Func function, override; } fbind[] = { { Fl_Text_Editor_mod::kf_default, F_Edit::kf_default }, { Fl_Text_Editor_mod::kf_enter, F_Edit::kf_enter }, { Fl_Text_Editor_mod::kf_delete, F_Edit::kf_delete }, { Fl_Text_Editor_mod::kf_cut, F_Edit::kf_cut }, { Fl_Text_Editor_mod::kf_paste, F_Edit::kf_paste } }; int n = sizeof(fbind) / sizeof(fbind[0]); // walk the keybindings linked list and replace items containing // functions for which we have an override in fbind for (Fl_Text_Editor_mod::Key_Binding *k = key_bindings; k; k = k->next) { for (int i = 0; i < n; i++) if (fbind[i].function == k->function) k->function = fbind[i].override; } } // The kf_* functions below call the corresponding Fl_Text_Editor_mod routines, but // may make adjustments so that no transmitted text is modified. int F_Edit::kf_default(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *p_editpos ? 1 : Fl_Text_Editor_mod::kf_default(c, e); } int F_Edit::kf_enter(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *p_editpos ? 1 : Fl_Text_Editor_mod::kf_enter(c, e); } int F_Edit::kf_delete(int c, Fl_Text_Editor_mod* e) { // single character if (!e->buffer()->selected()) { if (e->insert_position() >= *p_editpos && e->insert_position() != e->buffer()->length()) return Fl_Text_Editor_mod::kf_delete(c, e); else return 1; } // region: delete as much as we can int start, end; e->buffer()->selection_position(&start, &end); if (*p_editpos >= end) return 1; if (*p_editpos > start) e->buffer()->select(*p_editpos, end); return Fl_Text_Editor_mod::kf_delete(c, e); } int F_Edit::kf_cut(int c, Fl_Text_Editor_mod* e) { if (e->buffer()->selected()) { int start, end; e->buffer()->selection_position(&start, &end); if (*p_editpos >= end) return 1; if (*p_editpos > start) e->buffer()->select(*p_editpos, end); } return Fl_Text_Editor_mod::kf_cut(c, e); } int F_Edit::kf_paste(int c, Fl_Text_Editor_mod* e) { return e->insert_position() < *p_editpos ? 1 : Fl_Text_Editor_mod::kf_paste(c, e); } fldigi-4.2.05/src/widgets/smeter.cxx0000664000175000017500000000642414611711171014251 00000000000000// // smeter.cxx // // Smeter bar widget routines. // // A part of the fldigi. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "smeter.h" // // smeter is a smeter bar widget based off Fl_Widget that shows a // standard smeter bar in horizontal format void Smeter::draw() { if (maximum_ > minimum_) sval = round(meter_width * (value_ - minimum_) / (maximum_ - minimum_)); else sval = 0; // Draw the box and label... draw_box(); draw_box(box(), tx, ty, tw, th, bgnd_); if (sval > 0) draw_box(FL_FLAT_BOX, tx + sx, ty + 2, sval, th - 4, fgnd_); labelcolor(scale_color); draw_label(); } const char * Smeter::meter_face = "| : : S3 : : S6 : : S9 :: 20 :: 40 :: |"; Smeter::Smeter(int X, int Y, int W, int H, const char* l) : Fl_Widget(X, Y, W, H, "") { align(FL_ALIGN_INSIDE); box(FL_DOWN_BOX); bgnd_ = FL_BACKGROUND2_COLOR; fgnd_ = FL_GREEN; scale_color = FL_BLACK; minimum_ = 0.0; maximum_ = 100.0; value_ = 0; // Get the box borders... bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = X + bx; tw = W - bw; ty = Y + by; th = H - bh; static int fsize = 6; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); while ((meter_width < tw) && (fl_height() < th)) { fsize++; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); } fsize--; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); meter_height = fl_height(); label(meter_face); labelfont(FL_HELVETICA); labelsize(fsize); labelcolor(scale_color); meter_width -= fl_width("|"); sx = (tw - meter_width) / 2; } void Smeter::resize(int X, int Y, int W, int H) { Fl_Widget::resize(X,Y,W,H); bx = Fl::box_dx(box()); by = Fl::box_dy(box()); bw = Fl::box_dw(box()); bh = Fl::box_dh(box()); tx = X + bx; tw = W - bw; ty = Y + by; th = H - bh; static int fsize = 6; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); while ((meter_width < tw) && (fl_height() < th)) { fsize++; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); } fsize--; fl_font(FL_HELVETICA, fsize); meter_width = fl_width(meter_face); meter_height = fl_height(); label(meter_face); labelfont(FL_HELVETICA); labelsize(fsize); labelcolor(scale_color); meter_width -= fl_width("|"); sx = (tw - meter_width) / 2; } int Smeter::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_RELEASE) { do_callback(); return 1; } } return 0; } // // End of Smeter.cxx // fldigi-4.2.05/src/widgets/Panel.cxx0000664000175000017500000001450714611711171014012 00000000000000// ---------------------------------------------------------------------------- // Panel.cxx // // Copyright (C) 2007-2011 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 or later of the License. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ARY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- //#include #include #include #include #include #include #include "Panel.h" #include // Drag the edges that were initially at oldx,oldy to newx,newy: // pass -1 as oldx or oldy to disable drag in that direction: //#define DEVEL_DEBUG 1 int Panel::orgx() { int oldx = w(); int *p = sizes() + 8; for (int i=children(); i--; p += 4) if (p[1] < oldx) oldx = p[1]; return oldx; } int Panel::orgy() { int oldy = h(); int *p = sizes() + 8; for (int i=children(); i--; p += 4) if (p[3] < oldy) oldy = p[3]; return oldy; } void Panel::position(int oix, int oiy, int newx, int newy) { #ifdef DEVEL_DEBUG printf("oix %3d, oiy %3d, nux %3d, nuy %3d\n", oix, oiy, newx, newy); #endif Fl_Widget* const* a = array(); int *p = sizes(); #ifdef DEVEL_DEBUG printf("p0 %3d, p1 %3d, p2 %3d, p3 %3d\n", p[0], p[1], p[2], p[3]); printf("p4 %3d, p5 %3d, p6 %3d, p7 %3d\n", p[0], p[1], p[2], p[3]); #endif p += 8; // skip group & resizable's saved size for (int i=children(); i--; p += 4) { Fl_Widget* o = *a++; if (o == resizable()) continue; int X = o->x(); int Y = o->y(); int W = o->w(); int H = o->h(); int R = X + W; int B = Y + H; if (o == resizable()) continue; if (oix > -1) { int t = p[0]; if ((t == oix) || (t>oix && Xnewx)) X = newx; t = p[1]; if ((t == oix) || (t>oix && Rnewx)) R = newx; } if (oiy > -1) { int t = p[2]; if ((t == oiy) || (t>oiy && Ynewy)) Y = newy; t = p[3]; if ((t == oiy) || (t>oiy && Bnewy)) B = newy; } o->damage_resize(X, Y, R-X, B-Y); } } // move the lower-right corner (sort of): void Panel::resize(int X,int Y,int W,int H) { // remember how much to move the child widgets: int *p = sizes(); int OX = x(); int OY = y(); int OW = w(); int OH = h(); int OR = OX + OW; int OB = OY + OH; float dw = 1.0 * W / OW; float dh = 1.0 * H / OH; // resize this (skip the Fl_Group resize): Fl_Widget::resize(X,Y,W,H); // find x, y, w, h of resizable: int RX = X + (p[4] - p[0]); int RY = Y + (p[6] - p[2]); int RR = X + W - (p[1] - p[5]); int RB = Y + H - (p[3] - p[7]); int NW = RR - RX; int NH = RB - RY; int R; int B; int xx; int yy; // move everything to be on correct side of new resizable: Fl_Widget * const *a = array(); Fl_Widget * o = 0; p += 8; for (int i=children(); i--;) { o = *a++; if (o == resizable()) { o->resize(RX, RY, NW, NH); } else { xx = X; if (o->x() != OX) xx = (o->x() - OX) * dw + X + 0.5; if (xx > RR) xx = RR; if (o->x() + o->w() == OR) { R = X + W; if (xx != X && xx < RX) xx = RX; } else { R = xx + o->w() * dw + 0.5; if (R < xx) R = xx; if (xx <= RX && R < RX) R = RX; if (xx <= RX && R > RR ) R = RR; } yy = Y; if (o->y() != OY) yy = (o->y() - OY) * dh + Y + 0.5; if (yy > RB) yy = RB; if (o->y() + o->h() == OB) { B = Y + H; if (yy != Y && yy < RY) yy = RY; } else { B = yy + o->h() * dh + 0.5; if (B < yy) B = yy; if (yy <= RY && B < RY) B = RY; if (yy <= RY && B > RB) B = RB; } o->resize(xx,yy,R-xx,B-yy); } p += 4; // next child sizes array // do *not* call o->redraw() here! If you do, and the tile is inside a // scroll, it'll set the damage areas wrong for all children! } } static void set_cursor(Panel *t, Fl_Cursor c) { static Fl_Cursor cursor; if (cursor == c || !t->window()) return; cursor = c; t->window()->cursor(c); } static Fl_Cursor cursors[4] = { FL_CURSOR_DEFAULT, FL_CURSOR_WE, FL_CURSOR_NS, FL_CURSOR_MOVE}; int Panel::handle(int event) { static int sdrag; static int sdx, sdy; static int sx, sy; #define DRAGH 1 #define DRAGV 2 #define GRABAREA 4 int mx = Fl::event_x(); int my = Fl::event_y(); switch (event) { case FL_MOVE: case FL_ENTER: case FL_PUSH: { int mindx = 100; int mindy = 100; int oldx = 0; int oldy = 0; Fl_Widget*const* a = array(); int *q = sizes(); int *p = q + 8; for (int i=children(); i--; p += 4) { Fl_Widget* o = *a++; if (o == resizable()) continue; if (p[1]y()<=my+GRABAREA && o->y()+o->h()>=my-GRABAREA) { int t = mx - (o->x()+o->w()); if (abs(t) < mindx) { sdx = t; mindx = abs(t); oldx = p[1]; } } if (p[3]x()<=mx+GRABAREA && o->x()+o->w()>=mx-GRABAREA) { int t = my - (o->y()+o->h()); if (abs(t) < mindy) { sdy = t; mindy = abs(t); oldy = p[3]; } } } sdrag = 0; sx = sy = -1; if (mindx <= GRABAREA) {sdrag = DRAGH; sx = oldx;} if (mindy <= GRABAREA) {sdrag |= DRAGV; sy = oldy;} set_cursor(this, cursors[sdrag]); if (sdrag) return 1; return Fl_Group::handle(event); } case FL_LEAVE: set_cursor(this, FL_CURSOR_DEFAULT); break; case FL_DRAG: // This is necessary if CONSOLIDATE_MOTION in Fl_x.cxx is turned off: if (damage()) return 1; // don't fall behind case FL_RELEASE: { if (!sdrag) return 0; // should not happen Fl_Widget* r = resizable(); if (!r) r = this; int newx; if (sdrag&DRAGH) { newx = Fl::event_x()-sdx; if (newx < r->x()) newx = r->x(); else if (newx >= r->x()+r->w()) newx = r->x()+r->w(); } else newx = sx; int newy; if (sdrag&DRAGV) { newy = Fl::event_y()-sdy; if (newy < r->y()) newy = r->y(); else if (newy >= r->y()+r->h()) newy = r->y()+r->h(); } else newy = sy; position(sx,sy,newx,newy); if (event == FL_DRAG) set_changed(); do_callback(); return 1;} } return Fl_Group::handle(event); } fldigi-4.2.05/src/widgets/Fl_Text_Buffer_mod.cxx0000664000175000017500000013223114611711171016443 00000000000000// // "$Id: Fl_Text_Buffer_mod.cxx 8040 2010-12-15 17:38:39Z manolo $" // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include #include #include #include #include #include #include "Fl_Text_Buffer_mod.H" #include /* This file is based on a port of NEdit to FLTK many years ago. NEdit at that point was already stretched beyond the task it was designed for which explains why the source code is sometimes pretty convoluted. It still is a very useful widget for FLTK, and we are thankful that the nedit team allowed us to integrate their code. With the introduction of Unicode and UTF-8, Fl_Text_... has to go into a whole new generation of code. Originally designed for monospaced fonts only, many features make less sense in the multibyte and multiwidth world of UTF-8. Columns are a good example. There is simply no such thing. The new Fl_Text_... widget converts columns to pixels by multiplying them with the average character width for a given font. Rectangular selections were rarely used (if at all) and make little sense when using variable width fonts. They have been removed. Using multiple spaces to emulate tab stops has been replaced by pixel counting routines. They are slower, but give the expected result for proportional fonts. And constantly recalculating character widths is just much too expensive. Lines of text are now subdivided into blocks of text which are measured at once instead of individual characters. */ #ifndef min static int max(int i1, int i2) { return i1 >= i2 ? i1 : i2; } static int min(int i1, int i2) { return i1 <= i2 ? i1 : i2; } #endif static char *undobuffer; static int undobufferlength; static Fl_Text_Buffer_mod *undowidget; static int undoat; // points after insertion static int undocut; // number of characters deleted there static int undoinsert; // number of characters inserted static int undoyankcut; // length of valid contents of buffer, even if undocut=0 /* Resize the undo buffer to match at least the requested size. */ static void undobuffersize(int n) { if (n > undobufferlength) { if (undobuffer) { do { undobufferlength *= 2; } while (undobufferlength < n); undobuffer = (char *) realloc(undobuffer, undobufferlength); } else { undobufferlength = n + 9; undobuffer = (char *) malloc(undobufferlength); } } } static void def_transcoding_warning_action(Fl_Text_Buffer_mod *text) { fl_alert("%s", text->file_encoding_warning_message); } /* Initialize all variables. */ Fl_Text_Buffer_mod::Fl_Text_Buffer_mod(int requestedSize, int preferredGapSize) { mLength = 0; mPreferredGapSize = preferredGapSize; mBuf = (char *) malloc(requestedSize + mPreferredGapSize); mGapStart = 0; mGapEnd = mPreferredGapSize; mTabDist = 8; mPrimary.mSelected = 0; mPrimary.mStart = mPrimary.mEnd = 0; mSecondary.mSelected = 0; mSecondary.mStart = mSecondary.mEnd = 0; mHighlight.mSelected = 0; mHighlight.mStart = mHighlight.mEnd = 0; mModifyProcs = NULL; mCbArgs = NULL; mNModifyProcs = 0; mNPredeleteProcs = 0; mPredeleteProcs = NULL; mPredeleteCbArgs = NULL; mCursorPosHint = 0; mCanUndo = 1; input_file_was_transcoded = 0; transcoding_warning_action = def_transcoding_warning_action; } /* Free all resources. */ Fl_Text_Buffer_mod::~Fl_Text_Buffer_mod() { free(mBuf); if (mNModifyProcs != 0) { delete[]mModifyProcs; delete[]mCbArgs; } if (mNPredeleteProcs != 0) { delete[]mPredeleteProcs; delete[]mPredeleteCbArgs; } } /* This function copies verbose whatever is in front and after the gap into a single buffer. */ char *Fl_Text_Buffer_mod::text() const { char *t = (char *) malloc(mLength + 1); memcpy(t, mBuf, mGapStart); memcpy(t+mGapStart, mBuf+mGapEnd, mLength - mGapStart); t[mLength] = '\0'; return t; } /* Set the text buffer to a new string. */ void Fl_Text_Buffer_mod::text(const char *t) { IS_UTF8_ALIGNED(t) call_predelete_callbacks(0, length()); /* Save information for redisplay, and get rid of the old buffer */ const char *deletedText = text(); int deletedLength = mLength; free((void *) mBuf); /* Start a new buffer with a gap of mPreferredGapSize at the end */ int insertedLength = strlen(t); mBuf = (char *) malloc(insertedLength + mPreferredGapSize); mLength = insertedLength; mGapStart = insertedLength; mGapEnd = mGapStart + mPreferredGapSize; memcpy(mBuf, t, insertedLength); /* Zero all of the existing selections */ update_selections(0, deletedLength, 0); /* Call the saved display routine(s) to update the screen */ call_modify_callbacks(0, deletedLength, insertedLength, 0, deletedText); free((void *) deletedText); } /* Creates a range of text to a new buffer and copies verbose from around the gap. */ char *Fl_Text_Buffer_mod::text_range(int start, int end) const { IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) char *s = NULL; /* Make sure start and end are ok, and allocate memory for returned string. If start is bad, return "", if end is bad, adjust it. */ if (start < 0 || start > mLength) { s = (char *) malloc(1); s[0] = '\0'; return s; } if (end < start) { int temp = start; start = end; end = temp; } if (end > mLength) end = mLength; int copiedLength = end - start; s = (char *) malloc(copiedLength + 1); /* Copy the text from the buffer to the returned string */ if (end <= mGapStart) { memcpy(s, mBuf + start, copiedLength); } else if (start >= mGapStart) { memcpy(s, mBuf + start + (mGapEnd - mGapStart), copiedLength); } else { int part1Length = mGapStart - start; memcpy(s, mBuf + start, part1Length); memcpy(s + part1Length, mBuf + mGapEnd, copiedLength - part1Length); } s[copiedLength] = '\0'; return s; } /* Return a UCS-4 character at the given index. Pos must be at a character boundary. */ unsigned int Fl_Text_Buffer_mod::char_at(int pos) const { if (pos < 0 || pos >= mLength) return '\0'; IS_UTF8_ALIGNED2(this, (pos)) const char *src = address(pos); return fl_utf8decode(src, 0, 0); } /* Return a UTF-8 character at the given index. Pos must be at a character boundary. */ unsigned int Fl_Text_Buffer_mod::get_char_at(int pos, int &len) const { if (pos < 0 || pos >= mLength) return '\0'; IS_UTF8_ALIGNED2(this, (pos)) const char *src = address(pos); unsigned int code = 0; if (*src & 0x80) { fl_utf8decode(src, 0, &len); for (int i = 0; i < len && i < 4; i++) { code <<= 8; code |= (unsigned char)*(src + i) & 0xFF; } } else { code = *src; len = 1; } return code; } /* Return the raw byte at the given index. This function ignores all unicode encoding. */ char Fl_Text_Buffer_mod::byte_at(int pos) const { if (pos < 0 || pos >= mLength) return '\0'; const char *src = address(pos); return *src; } /* Insert some text at the given index. Pos must be at a character boundary. */ void Fl_Text_Buffer_mod::insert(int pos, const char *text) { IS_UTF8_ALIGNED2(this, (pos)) IS_UTF8_ALIGNED(text) /* check if there is actually any text */ if (!text || !*text) return; /* if pos is not contiguous to existing text, make it */ if (pos > mLength) pos = mLength; if (pos < 0) pos = 0; /* Even if nothing is deleted, we must call these callbacks */ call_predelete_callbacks(pos, 0); /* insert and redisplay */ int nInserted = insert_(pos, text); mCursorPosHint = pos + nInserted; IS_UTF8_ALIGNED2(this, (mCursorPosHint)) call_modify_callbacks(pos, 0, nInserted, 0, NULL); } /* Replace a range of text with new text. Start and end must be at a character boundary. */ void Fl_Text_Buffer_mod::replace(int start, int end, const char *text) { // Range check... if (!text) return; if (start < 0) start = 0; if (end > mLength) end = mLength; if (end < start) end = start; IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) IS_UTF8_ALIGNED(text) call_predelete_callbacks(start, end - start); const char *deletedText = text_range(start, end); remove_(start, end); int nInserted = insert_(start, text); mCursorPosHint = start + nInserted; call_modify_callbacks(start, end - start, nInserted, 0, deletedText); free((void *) deletedText); } /* Remove a range of text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::remove(int start, int end) { /* Make sure the arguments make sense */ if (start > end) { int temp = start; start = end; end = temp; } if (start > mLength) start = mLength; if (start < 0) start = 0; if (end > mLength) end = mLength; if (end < 0) end = 0; IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) if (start == end) return; call_predelete_callbacks(start, end - start); /* Remove and redisplay */ const char *deletedText = text_range(start, end); remove_(start, end); mCursorPosHint = start; call_modify_callbacks(start, end - start, 0, 0, deletedText); free((void *) deletedText); } /* Copy a range of text from another text buffer. fromStart, fromEnd, and toPos must be at a character boundary. */ void Fl_Text_Buffer_mod::copy(Fl_Text_Buffer_mod * fromBuf, int fromStart, int fromEnd, int toPos) { IS_UTF8_ALIGNED2(fromBuf, fromStart) IS_UTF8_ALIGNED2(fromBuf, fromEnd) IS_UTF8_ALIGNED2(this, (toPos)) int copiedLength = fromEnd - fromStart; /* Prepare the buffer to receive the new text. If the new text fits in the current buffer, just move the gap (if necessary) to where the text should be inserted. If the new text is too large, reallocate the buffer with a gap large enough to accomodate the new text and a gap of mPreferredGapSize */ if (copiedLength > mGapEnd - mGapStart) reallocate_with_gap(toPos, copiedLength + mPreferredGapSize); else if (toPos != mGapStart) move_gap(toPos); /* Insert the new text (toPos now corresponds to the start of the gap) */ if (fromEnd <= fromBuf->mGapStart) { memcpy(&mBuf[toPos], &fromBuf->mBuf[fromStart], copiedLength); } else if (fromStart >= fromBuf->mGapStart) { memcpy(&mBuf[toPos], &fromBuf->mBuf[fromStart + (fromBuf->mGapEnd - fromBuf->mGapStart)], copiedLength); } else { int part1Length = fromBuf->mGapStart - fromStart; memcpy(&mBuf[toPos], &fromBuf->mBuf[fromStart], part1Length); memcpy(&mBuf[toPos + part1Length], &fromBuf->mBuf[fromBuf->mGapEnd], copiedLength - part1Length); } mGapStart += copiedLength; mLength += copiedLength; update_selections(toPos, 0, copiedLength); } /* Take the previous changes and undo them. Return the previous cursor position in cursorPos. Returns 1 if the undo was applied. CursorPos will be at a character boundary. */ int Fl_Text_Buffer_mod::undo(int *cursorPos) { if (undowidget != this || (!undocut && !undoinsert && !mCanUndo)) return 0; int ilen = undocut; int xlen = undoinsert; int b = undoat - xlen; if (xlen && undoyankcut && !ilen) { ilen = undoyankcut; } if (xlen && ilen) { undobuffersize(ilen + 1); undobuffer[ilen] = 0; char *tmp = strdup(undobuffer); replace(b, undoat, tmp); if (cursorPos) *cursorPos = mCursorPosHint; free(tmp); } else if (xlen) { remove(b, undoat); if (cursorPos) *cursorPos = mCursorPosHint; } else if (ilen) { undobuffersize(ilen + 1); undobuffer[ilen] = 0; insert(undoat, undobuffer); if (cursorPos) *cursorPos = mCursorPosHint; undoyankcut = 0; } return 1; } /* Set a flag if undo function will work. */ void Fl_Text_Buffer_mod::canUndo(char flag) { mCanUndo = flag; // disabling undo also clears the last undo operation! if (!mCanUndo && undowidget==this) undowidget = 0; } /* Change the tab width. This will cause a couple of callbacks and a complete redisplay. Matt: I am not entirely sure why we need to trigger callbacks because tabs are only a graphical hint, not changing any text at all, but I leave this in here for back compatibility. */ void Fl_Text_Buffer_mod::tab_distance(int tabDist) { /* First call the pre-delete callbacks with the previous tab setting still active. */ call_predelete_callbacks(0, mLength); /* Change the tab setting */ mTabDist = tabDist; /* Force any display routines to redisplay everything (unfortunately, this means copying the whole buffer contents to provide "deletedText" */ const char *deletedText = text(); call_modify_callbacks(0, mLength, mLength, 0, deletedText); free((void *) deletedText); } /* Select a range of text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::select(int start, int end) { IS_UTF8_ALIGNED2(this, (start)) IS_UTF8_ALIGNED2(this, (end)) Fl_Text_Selection_mod oldSelection = mPrimary; mPrimary.set(start, end); redisplay_selection(&oldSelection, &mPrimary); } /* Clear the primary selection. */ void Fl_Text_Buffer_mod::unselect() { Fl_Text_Selection_mod oldSelection = mPrimary; mPrimary.mSelected = 0; redisplay_selection(&oldSelection, &mPrimary); } /* Return the primary selection range. */ int Fl_Text_Buffer_mod::selection_position(int *start, int *end) { return mPrimary.position(start, end); } /* Return a copy of the selected text. */ char *Fl_Text_Buffer_mod::selection_text() { return selection_text_(&mPrimary); } /* Remove the selected text. */ void Fl_Text_Buffer_mod::remove_selection() { remove_selection_(&mPrimary); } /* Replace the selected text. */ void Fl_Text_Buffer_mod::replace_selection(const char *text) { replace_selection_(&mPrimary, text); } /* Select text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::secondary_select(int start, int end) { Fl_Text_Selection_mod oldSelection = mSecondary; mSecondary.set(start, end); redisplay_selection(&oldSelection, &mSecondary); } /* Deselect text. */ void Fl_Text_Buffer_mod::secondary_unselect() { Fl_Text_Selection_mod oldSelection = mSecondary; mSecondary.mSelected = 0; redisplay_selection(&oldSelection, &mSecondary); } /* Return the selected range. */ int Fl_Text_Buffer_mod::secondary_selection_position(int *start, int *end) { return mSecondary.position(start, end); } /* Return a copy of the text in this selection. */ char *Fl_Text_Buffer_mod::secondary_selection_text() { return selection_text_(&mSecondary); } /* Remove the selected text. */ void Fl_Text_Buffer_mod::remove_secondary_selection() { remove_selection_(&mSecondary); } /* Replace selected text. */ void Fl_Text_Buffer_mod::replace_secondary_selection(const char *text) { replace_selection_(&mSecondary, text); } /* Highlight a range of text. Start and End must be at a character boundary. */ void Fl_Text_Buffer_mod::highlight(int start, int end) { Fl_Text_Selection_mod oldSelection = mHighlight; mHighlight.set(start, end); redisplay_selection(&oldSelection, &mHighlight); } /* Remove text highlighting. */ void Fl_Text_Buffer_mod::unhighlight() { Fl_Text_Selection_mod oldSelection = mHighlight; mHighlight.mSelected = 0; redisplay_selection(&oldSelection, &mHighlight); } /* Return position of highlight. */ int Fl_Text_Buffer_mod::highlight_position(int *start, int *end) { return mHighlight.position(start, end); } /* Return a copy of highlighted text. */ char *Fl_Text_Buffer_mod::highlight_text() { return selection_text_(&mHighlight); } /* Add a callback that is called whenever text is modified. */ void Fl_Text_Buffer_mod::add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void *cbArg) { Fl_Text_Modify_Cb *newModifyProcs = new Fl_Text_Modify_Cb[mNModifyProcs + 1]; void **newCBArgs = new void *[mNModifyProcs + 1]; for (int i = 0; i < mNModifyProcs; i++) { newModifyProcs[i + 1] = mModifyProcs[i]; newCBArgs[i + 1] = mCbArgs[i]; } if (mNModifyProcs != 0) { delete[]mModifyProcs; delete[]mCbArgs; } newModifyProcs[0] = bufModifiedCB; newCBArgs[0] = cbArg; mNModifyProcs++; mModifyProcs = newModifyProcs; mCbArgs = newCBArgs; } /* Remove a callback. */ void Fl_Text_Buffer_mod::remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void *cbArg) { int i, toRemove = -1; /* find the matching callback to remove */ for (i = 0; i < mNModifyProcs; i++) { if (mModifyProcs[i] == bufModifiedCB && mCbArgs[i] == cbArg) { toRemove = i; break; } } if (toRemove == -1) { Fl::error ("Fl_Text_Buffer_mod::remove_modify_callback(): Can't find modify CB to remove"); return; } /* Allocate new lists for remaining callback procs and args (if any are left) */ mNModifyProcs--; if (mNModifyProcs == 0) { mNModifyProcs = 0; delete[]mModifyProcs; mModifyProcs = NULL; delete[]mCbArgs; mCbArgs = NULL; return; } Fl_Text_Modify_Cb *newModifyProcs = new Fl_Text_Modify_Cb[mNModifyProcs]; void **newCBArgs = new void *[mNModifyProcs]; /* copy out the remaining members and free the old lists */ for (i = 0; i < toRemove; i++) { newModifyProcs[i] = mModifyProcs[i]; newCBArgs[i] = mCbArgs[i]; } for (; i < mNModifyProcs; i++) { newModifyProcs[i] = mModifyProcs[i + 1]; newCBArgs[i] = mCbArgs[i + 1]; } delete[]mModifyProcs; delete[]mCbArgs; mModifyProcs = newModifyProcs; mCbArgs = newCBArgs; } /* Add a callback that is called before deleting text. */ void Fl_Text_Buffer_mod::add_predelete_callback(Fl_Text_Predelete_Cb bufPreDeleteCB, void *cbArg) { Fl_Text_Predelete_Cb *newPreDeleteProcs = new Fl_Text_Predelete_Cb[mNPredeleteProcs + 1]; void **newCBArgs = new void *[mNPredeleteProcs + 1]; for (int i = 0; i < mNPredeleteProcs; i++) { newPreDeleteProcs[i + 1] = mPredeleteProcs[i]; newCBArgs[i + 1] = mPredeleteCbArgs[i]; } if (mNPredeleteProcs != 0) { delete[]mPredeleteProcs; delete[]mPredeleteCbArgs; } newPreDeleteProcs[0] = bufPreDeleteCB; newCBArgs[0] = cbArg; mNPredeleteProcs++; mPredeleteProcs = newPreDeleteProcs; mPredeleteCbArgs = newCBArgs; } /* Remove a callback. */ void Fl_Text_Buffer_mod::remove_predelete_callback(Fl_Text_Predelete_Cb bufPreDeleteCB, void *cbArg) { int i, toRemove = -1; /* find the matching callback to remove */ for (i = 0; i < mNPredeleteProcs; i++) { if (mPredeleteProcs[i] == bufPreDeleteCB && mPredeleteCbArgs[i] == cbArg) { toRemove = i; break; } } if (toRemove == -1) { Fl::error ("Fl_Text_Buffer_mod::remove_predelete_callback(): Can't find pre-delete CB to remove"); return; } /* Allocate new lists for remaining callback procs and args (if any are left) */ mNPredeleteProcs--; if (mNPredeleteProcs == 0) { mNPredeleteProcs = 0; delete[]mPredeleteProcs; mPredeleteProcs = NULL; delete[]mPredeleteCbArgs; mPredeleteCbArgs = NULL; return; } Fl_Text_Predelete_Cb *newPreDeleteProcs = new Fl_Text_Predelete_Cb[mNPredeleteProcs]; void **newCBArgs = new void *[mNPredeleteProcs]; /* copy out the remaining members and free the old lists */ for (i = 0; i < toRemove; i++) { newPreDeleteProcs[i] = mPredeleteProcs[i]; newCBArgs[i] = mPredeleteCbArgs[i]; } for (; i < mNPredeleteProcs; i++) { newPreDeleteProcs[i] = mPredeleteProcs[i + 1]; newCBArgs[i] = mPredeleteCbArgs[i + 1]; } delete[]mPredeleteProcs; delete[]mPredeleteCbArgs; mPredeleteProcs = newPreDeleteProcs; mPredeleteCbArgs = newCBArgs; } /* Return a copy of the line that contains a given index. Pos must be at a character boundary. */ char *Fl_Text_Buffer_mod::line_text(int pos) const { return text_range(line_start(pos), line_end(pos)); } /* Find the beginning of the line. */ int Fl_Text_Buffer_mod::line_start(int pos) const { if (!findchar_backward(pos, '\n', &pos)) return 0; return pos + 1; } /* Find the end of the line. */ int Fl_Text_Buffer_mod::line_end(int pos) const { if (!findchar_forward(pos, '\n', &pos)) pos = mLength; return pos; } /* Find the beginning of a word. NOT UNICODE SAFE. */ int Fl_Text_Buffer_mod::word_start(int pos) const { // FIXME: character is ucs-4 while (pos>0 && (isalnum(char_at(pos)) || char_at(pos) == '_')) { pos = prev_char(pos); } // FIXME: character is ucs-4 if (!(isalnum(char_at(pos)) || char_at(pos) == '_')) pos = next_char(pos); return pos; } /* ** Search backwards in buffer for characters in "searchChars", starting ** with the character BEFORE "startPos", returning the result in "foundPos" ** returns 1 if found, 0 if not. */ int Fl_Text_Buffer_mod::findchars_backward( int startPos, const char *searchChars, int *foundPos ) { int pos = startPos; const char *c; char ch = 0; if ( startPos == 0 ) { *foundPos = 0; return 0; } while ( pos > 0 ) { ch = byte_at(pos); for ( c = searchChars; *c != '\0'; c++ ) { if ( ch == *c ) { *foundPos = pos; return 1; } } pos = prev_char(pos); } *foundPos = 0; return 0; } /* Find the end of a word. NOT UNICODE SAFE. */ int Fl_Text_Buffer_mod::word_end(int pos) const { // FIXME: character is ucs-4 while (pos < length() && (isalnum(char_at(pos)) || char_at(pos) == '_')) { pos = next_char(pos); } return pos; } /* ** Search forwards in buffer for nth occurance ofcharacters in "searchChars", starting ** with the character "startPos", and returning the result in "foundPos" ** returns 1 if found, 0 if not. */ int Fl_Text_Buffer_mod::findchars_forward( int startPos, const char *searchChars, int *foundPos, int n ) const { int pos = startPos; const char *c; char ch = 0; while ( pos < length() && n) { ch = byte_at(pos); for ( c = searchChars; *c != '\0'; c++ ) { if (n != 1 && (*c == '.' || *c == '-')) continue; if ( ch == *c ) { n--; if (n == 0) { *foundPos = pos; return 1; } } } pos = next_char(pos); } *foundPos = length(); return 0; } /* Count the number of characters between two positions. */ int Fl_Text_Buffer_mod::count_displayed_characters(int lineStartPos, int targetPos) const { IS_UTF8_ALIGNED2(this, (lineStartPos)) IS_UTF8_ALIGNED2(this, (targetPos)) int charCount = 0; int pos = lineStartPos; while (pos < targetPos) { pos = next_char(pos); charCount++; } return charCount; } /* Skip ahead a number of characters from a given index. This function breaks early if it encounters a newline character. */ int Fl_Text_Buffer_mod::skip_displayed_characters(int lineStartPos, int nChars) { IS_UTF8_ALIGNED2(this, (lineStartPos)) int pos = lineStartPos; for (int charCount = 0; charCount < nChars && pos < mLength; charCount++) { unsigned int c = char_at(pos); if (c == '\n') return pos; pos = next_char(pos); } return pos; } /* Count the number of newline characters between start and end. startPos and endPos must be at a character boundary. This function is optimized for speed by not using UTF-8 calls. */ int Fl_Text_Buffer_mod::count_lines(int startPos, int endPos) const { IS_UTF8_ALIGNED2(this, (startPos)) IS_UTF8_ALIGNED2(this, (endPos)) int gapLen = mGapEnd - mGapStart; int lineCount = 0; int pos = startPos; while (pos < mGapStart) { if (pos == endPos) return lineCount; if (mBuf[pos++] == '\n') lineCount++; } while (pos < mLength) { if (pos == endPos) return lineCount; if (mBuf[pos++ + gapLen] == '\n') lineCount++; } return lineCount; } /* Skip to the first character, n lines ahead. StartPos must be at a character boundary. This function is optimized for speed by not using UTF-8 calls. */ int Fl_Text_Buffer_mod::skip_lines(int startPos, int nLines) { IS_UTF8_ALIGNED2(this, (startPos)) if (nLines == 0) return startPos; int gapLen = mGapEnd - mGapStart; int pos = startPos; int lineCount = 0; while (pos < mGapStart) { if (mBuf[pos++] == '\n') { lineCount++; if (lineCount == nLines) { IS_UTF8_ALIGNED2(this, (pos)) return pos; } } } while (pos < mLength) { if (mBuf[pos++ + gapLen] == '\n') { lineCount++; if (lineCount >= nLines) { IS_UTF8_ALIGNED2(this, (pos)) return pos; } } } IS_UTF8_ALIGNED2(this, (pos)) return pos; } /* Skip to the first character, n lines back. StartPos must be at a character boundary. This function is optimized for speed by not using UTF-8 calls. */ int Fl_Text_Buffer_mod::rewind_lines(int startPos, int nLines) { IS_UTF8_ALIGNED2(this, (startPos)) int pos = startPos - 1; if (pos <= 0) return 0; int gapLen = mGapEnd - mGapStart; int lineCount = -1; while (pos >= mGapStart) { if (mBuf[pos + gapLen] == '\n') { if (++lineCount >= nLines) { IS_UTF8_ALIGNED2(this, (pos+1)) return pos + 1; } } pos--; } while (pos >= 0) { if (mBuf[pos] == '\n') { if (++lineCount >= nLines) { IS_UTF8_ALIGNED2(this, (pos+1)) return pos + 1; } } pos--; } return 0; } /* Find a matching string in the buffer. */ int Fl_Text_Buffer_mod::search_forward(int startPos, const char *searchString, int *foundPos, int matchCase) const { IS_UTF8_ALIGNED2(this, (startPos)) IS_UTF8_ALIGNED(searchString) if (!searchString) return 0; int bp; const char *sp; if (matchCase) { while (startPos < length()) { bp = startPos; sp = searchString; for (;;) { char c = *sp; // we reached the end of the "needle", so we found the string! if (!c) { *foundPos = startPos; return 1; } int l = fl_utf8len1(c); if (memcmp(sp, address(bp), l)) break; sp += l; bp += l; } startPos = next_char(startPos); } } else { while (startPos < length()) { bp = startPos; sp = searchString; for (;;) { // we reached the end of the "needle", so we found the string! if (!*sp) { *foundPos = startPos; return 1; } int l; unsigned int b = char_at(bp); unsigned int s = fl_utf8decode(sp, 0, &l); if (fl_tolower(b)!=fl_tolower(s)) break; sp += l; bp = next_char(bp); } startPos = next_char(startPos); } } return 0; } int Fl_Text_Buffer_mod::search_backward(int startPos, const char *searchString, int *foundPos, int matchCase) const { IS_UTF8_ALIGNED2(this, (startPos)) IS_UTF8_ALIGNED(searchString) if (!searchString) return 0; int bp; const char *sp; if (matchCase) { while (startPos >= 0) { bp = startPos; sp = searchString; for (;;) { char c = *sp; // we reached the end of the "needle", so we found the string! if (!c) { *foundPos = startPos; return 1; } int l = fl_utf8len1(c); if (memcmp(sp, address(bp), l)) break; sp += l; bp += l; } startPos = prev_char(startPos); } } else { while (startPos >= 0) { bp = startPos; sp = searchString; for (;;) { // we reached the end of the "needle", so we found the string! if (!*sp) { *foundPos = startPos; return 1; } int l; unsigned int b = char_at(bp); unsigned int s = fl_utf8decode(sp, 0, &l); if (fl_tolower(b)!=fl_tolower(s)) break; sp += l; bp = next_char(bp); } startPos = prev_char(startPos); } } return 0; } /* Insert a string into the buffer. Pos must be at a character boundary. Text must be a correct UTF-8 string. */ int Fl_Text_Buffer_mod::insert_(int pos, const char *text) { if (!text || !*text) return 0; int insertedLength = strlen(text); /* Prepare the buffer to receive the new text. If the new text fits in the current buffer, just move the gap (if necessary) to where the text should be inserted. If the new text is too large, reallocate the buffer with a gap large enough to accomodate the new text and a gap of mPreferredGapSize */ if (insertedLength > mGapEnd - mGapStart) reallocate_with_gap(pos, insertedLength + mPreferredGapSize); else if (pos != mGapStart) move_gap(pos); /* Insert the new text (pos now corresponds to the start of the gap) */ memcpy(&mBuf[pos], text, insertedLength); mGapStart += insertedLength; mLength += insertedLength; update_selections(pos, 0, insertedLength); if (mCanUndo) { if (undowidget == this && undoat == pos && undoinsert) { undoinsert += insertedLength; } else { undoinsert = insertedLength; undoyankcut = (undoat == pos) ? undocut : 0; } undoat = pos + insertedLength; undocut = 0; undowidget = this; } return insertedLength; } /* Remove a string from the buffer. Unicode safe. Start and end must be at a character boundary. */ void Fl_Text_Buffer_mod::remove_(int start, int end) { /* if the gap is not contiguous to the area to remove, move it there */ if (mCanUndo) { if (undowidget == this && undoat == end && undocut) { undobuffersize(undocut + end - start + 1); memmove(undobuffer + end - start, undobuffer, undocut); undocut += end - start; } else { undocut = end - start; undobuffersize(undocut); } undoat = start; undoinsert = 0; undoyankcut = 0; undowidget = this; } if (start > mGapStart) { if (mCanUndo) memcpy(undobuffer, mBuf + (mGapEnd - mGapStart) + start, end - start); move_gap(start); } else if (end < mGapStart) { if (mCanUndo) memcpy(undobuffer, mBuf + start, end - start); move_gap(end); } else { int prelen = mGapStart - start; if (mCanUndo) { memcpy(undobuffer, mBuf + start, prelen); memcpy(undobuffer + prelen, mBuf + mGapEnd, end - start - prelen); } } /* expand the gap to encompass the deleted characters */ mGapEnd += end - mGapStart; mGapStart -= mGapStart - start; /* update the length */ mLength -= end - start; /* fix up any selections which might be affected by the change */ update_selections(start, end - start, 0); } /* simple setter. Unicode safe. Start and end must be at a character boundary. */ void Fl_Text_Selection_mod::set(int startpos, int endpos) { mSelected = startpos != endpos; mStart = min(startpos, endpos); mEnd = max(startpos, endpos); } /* simple getter. Unicode safe. Start and end will be at a character boundary. */ int Fl_Text_Selection_mod::position(int *startpos, int *endpos) const { if (!mSelected) return 0; *startpos = mStart; *endpos = mEnd; return 1; } /* Return if a position is inside the selected area. Unicode safe. Pos must be at a character boundary. */ int Fl_Text_Selection_mod::includes(int pos) const { return (selected() && pos >= start() && pos < end() ); } /* Return a duplicate of the selected text, or an empty string. Unicode safe. */ char *Fl_Text_Buffer_mod::selection_text_(Fl_Text_Selection_mod * sel) const { int start, end; /* If there's no selection, return an allocated empty string */ if (!sel->position(&start, &end)) { char *s = (char *) malloc(1); *s = '\0'; return s; } /* Return the selected range */ return text_range(start, end); } /* Remove the selected text. Unicode safe. */ void Fl_Text_Buffer_mod::remove_selection_(Fl_Text_Selection_mod * sel) { int start, end; if (!sel->position(&start, &end)) return; remove(start, end); //undoyankcut = undocut; } /* Replace selection with text. Unicode safe. */ void Fl_Text_Buffer_mod::replace_selection_(Fl_Text_Selection_mod * sel, const char *text) { Fl_Text_Selection_mod oldSelection = *sel; /* If there's no selection, return */ int start, end; if (!sel->position(&start, &end)) return; /* Do the appropriate type of replace */ replace(start, end, text); /* Unselect (happens automatically in BufReplace, but BufReplaceRect can't detect when the contents of a selection goes away) */ sel->mSelected = 0; redisplay_selection(&oldSelection, sel); } /* Call all callbacks. Unicode safe. */ void Fl_Text_Buffer_mod::call_modify_callbacks(int pos, int nDeleted, int nInserted, int nRestyled, const char *deletedText) const { IS_UTF8_ALIGNED2(this, pos) for (int i = 0; i < mNModifyProcs; i++) (*mModifyProcs[i]) (pos, nInserted, nDeleted, nRestyled, deletedText, mCbArgs[i]); } /* Call all callbacks. Unicode safe. */ void Fl_Text_Buffer_mod::call_predelete_callbacks(int pos, int nDeleted) const { for (int i = 0; i < mNPredeleteProcs; i++) (*mPredeleteProcs[i]) (pos, nDeleted, mPredeleteCbArgs[i]); } /* Redisplay a new selected area. Unicode safe. */ void Fl_Text_Buffer_mod::redisplay_selection(Fl_Text_Selection_mod * oldSelection, Fl_Text_Selection_mod * newSelection) const { int oldStart, oldEnd, newStart, newEnd, ch1Start, ch1End, ch2Start, ch2End; /* If either selection is rectangular, add an additional character to the end of the selection to request the redraw routines to wipe out the parts of the selection beyond the end of the line */ oldStart = oldSelection->mStart; newStart = newSelection->mStart; oldEnd = oldSelection->mEnd; newEnd = newSelection->mEnd; /* If the old or new selection is unselected, just redisplay the single area that is (was) selected and return */ if (!oldSelection->mSelected && !newSelection->mSelected) return; if (!oldSelection->mSelected) { call_modify_callbacks(newStart, 0, 0, newEnd - newStart, NULL); return; } if (!newSelection->mSelected) { call_modify_callbacks(oldStart, 0, 0, oldEnd - oldStart, NULL); return; } /* If the selections are non-contiguous, do two separate updates and return */ if (oldEnd < newStart || newEnd < oldStart) { call_modify_callbacks(oldStart, 0, 0, oldEnd - oldStart, NULL); call_modify_callbacks(newStart, 0, 0, newEnd - newStart, NULL); return; } /* Otherwise, separate into 3 separate regions: ch1, and ch2 (the two changed areas), and the unchanged area of their intersection, and update only the changed area(s) */ ch1Start = min(oldStart, newStart); ch2End = max(oldEnd, newEnd); ch1End = max(oldStart, newStart); ch2Start = min(oldEnd, newEnd); if (ch1Start != ch1End) call_modify_callbacks(ch1Start, 0, 0, ch1End - ch1Start, NULL); if (ch2Start != ch2End) call_modify_callbacks(ch2Start, 0, 0, ch2End - ch2Start, NULL); } /* Move the gap around without changing buffer content. Unicode safe. Pos must be at a character boundary. */ void Fl_Text_Buffer_mod::move_gap(int pos) { int gapLen = mGapEnd - mGapStart; if (pos > mGapStart) memmove(&mBuf[mGapStart], &mBuf[mGapEnd], pos - mGapStart); else memmove(&mBuf[pos + gapLen], &mBuf[pos], mGapStart - pos); mGapEnd += pos - mGapStart; mGapStart += pos - mGapStart; } /* Create a larger gap. Unicode safe. Start must be at a character boundary. */ void Fl_Text_Buffer_mod::reallocate_with_gap(int newGapStart, int newGapLen) { char *newBuf = (char *) malloc(mLength + newGapLen); int newGapEnd = newGapStart + newGapLen; if (newGapStart <= mGapStart) { memcpy(newBuf, mBuf, newGapStart); memcpy(&newBuf[newGapEnd], &mBuf[newGapStart], mGapStart - newGapStart); memcpy(&newBuf[newGapEnd + mGapStart - newGapStart], &mBuf[mGapEnd], mLength - mGapStart); } else { /* newGapStart > mGapStart */ memcpy(newBuf, mBuf, mGapStart); memcpy(&newBuf[mGapStart], &mBuf[mGapEnd], newGapStart - mGapStart); memcpy(&newBuf[newGapEnd], &mBuf[mGapEnd + newGapStart - mGapStart], mLength - newGapStart); } free((void *) mBuf); mBuf = newBuf; mGapStart = newGapStart; mGapEnd = newGapEnd; } /* Update selection range if characters were inserted. Unicode safe. Pos must be at a character boundary. */ void Fl_Text_Buffer_mod::update_selections(int pos, int nDeleted, int nInserted) { mPrimary.update(pos, nDeleted, nInserted); mSecondary.update(pos, nDeleted, nInserted); mHighlight.update(pos, nDeleted, nInserted); } // unicode safe, assuming the arguments are on character boundaries void Fl_Text_Selection_mod::update(int pos, int nDeleted, int nInserted) { if (!mSelected || pos > mEnd) return; if (pos + nDeleted <= mStart) { mStart += nInserted - nDeleted; mEnd += nInserted - nDeleted; } else if (pos <= mStart && pos + nDeleted >= mEnd) { mStart = pos; mEnd = pos; mSelected = 0; } else if (pos <= mStart && pos + nDeleted < mEnd) { mStart = pos; mEnd = nInserted + mEnd - nDeleted; } else if (pos < mEnd) { mEnd += nInserted - nDeleted; if (mEnd <= mStart) mSelected = 0; } } /* Find a UCS-4 character. StartPos must be at a character boundary, searchChar is UCS-4 encoded. */ int Fl_Text_Buffer_mod::findchar_forward(int startPos, unsigned searchChar, int *foundPos) const { if (startPos >= mLength) { *foundPos = mLength; return 0; } if (startPos<0) startPos = 0; for ( ; startPos mLength) startPos = mLength; for (startPos = prev_char(startPos); startPos>=0; startPos = prev_char(startPos)) { if (searchChar == char_at(startPos)) { *foundPos = startPos; return 1; } } *foundPos = 0; return 0; } //#define EXAMPLE_ENCODING // shows how to process any encoding for which a decoding function exists #ifdef EXAMPLE_ENCODING // returns the UCS equivalent of *p in CP1252 and advances p by 1 unsigned cp1252toucs(char* &p) { // Codes 0x80..0x9f from the Microsoft CP1252 character set, translated // to Unicode static unsigned cp1252[32] = { 0x20ac, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x017d, 0x008f, 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x017e, 0x0178 }; unsigned char uc = *(unsigned char*)p; p++; return (uc < 0x80 || uc >= 0xa0 ? uc : cp1252[uc - 0x80]); } // returns the UCS equivalent of *p in UTF-16 and advances p by 2 (or more for surrogates) unsigned utf16toucs(char* &p) { union { #if WORDS_BIGENDIAN struct { unsigned char a, b;} chars; #else struct { unsigned char b, a;} chars; #endif U16 short_val; } u; u.chars.a = *(unsigned char*)p++; u.chars.b = *(unsigned char*)p++; return u.short_val; } // filter that produces, from an input stream fed by reading from fp, // a UTF-8-encoded output stream written in buffer. // Input can be any (e.g., 8-bit, UTF-16) encoding. // Output is true UTF-8. // p_trf points to a function that transforms encoded byte(s) into one UCS // and that increases the pointer by the adequate quantity static int general_input_filter(char *buffer, int buflen, char *line, int sline, char* &endline, unsigned (*p_trf)(char* &), FILE *fp) { char *p, *q, multibyte[5]; int lq, r, offset; p = endline = line; q = buffer; while (q < buffer + buflen) { if (p >= endline) { r = fread(line, 1, sline, fp); endline = line + r; if (r == 0) return q - buffer; p = line; } if (q + 4 /*max width of utf-8 char*/ > buffer + buflen) { memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } lq = fl_utf8encode( p_trf(p), multibyte ); memcpy(q, multibyte, lq); q += lq; } memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } #endif // EXAMPLE_ENCODING /* filter that produces, from an input stream fed by reading from fp, a UTF-8-encoded output stream written in buffer. Input can be UTF-8. If it is not, it is decoded with CP1252. Output is UTF-8. *input_was_changed is set to true if the input was not strict UTF-8 so output differs from input. */ static int utf8_input_filter(char *buffer, int buflen, char *line, int sline, char* &endline, FILE *fp, int *input_was_changed) { char *p, *q, multibyte[5]; int l, lp, lq, r; unsigned u; p = endline = line; q = buffer; while (q < buffer + buflen) { if (p >= endline) { r = fread(line, 1, sline, fp); endline = line + r; if (r == 0) return q - buffer; p = line; } l = fl_utf8len1(*p); if (p + l > endline) { memmove(line, p, endline - p); endline -= (p - line); r = fread(endline, 1, sline - (endline - line), fp); endline += r; p = line; if (endline - line < l) break; } while ( l > 0) { u = fl_utf8decode(p, p+l, &lp); lq = fl_utf8encode(u, multibyte); if (lp != l || lq != l) *input_was_changed = true; if (q + lq > buffer + buflen) { memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } memcpy(q, multibyte, lq); q += lq; p += lp; l -= lp; } } memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } const char *Fl_Text_Buffer_mod::file_encoding_warning_message = "Displayed text contains the UTF-8 transcoding\n" "of the input file which was not UTF-8 encoded.\n" "Some changes may have occurred."; /* Insert text from a file. Input file can be of various encodings according to what input fiter is used. utf8_input_filter accepts UTF-8 or CP1252 as input encoding. Output is always UTF-8. */ int Fl_Text_Buffer_mod::insertfile(const char *file, int pos, int buflen) { FILE *fp; if (!(fp = fl_fopen(file, "r"))) return 1; char *buffer = new char[buflen + 1]; char *endline, line[100]; int l; input_file_was_transcoded = false; endline = line; while (true) { #ifdef EXAMPLE_ENCODING // example of 16-bit encoding: UTF-16 l = general_input_filter(buffer, buflen, line, sizeof(line), endline, utf16toucs, // use cp1252toucs to read CP1252-encoded files fp); input_file_was_transcoded = true; #else l = utf8_input_filter(buffer, buflen, line, sizeof(line), endline, fp, &input_file_was_transcoded); #endif if (l == 0) break; buffer[l] = 0; insert(pos, buffer); pos += l; } int e = ferror(fp) ? 2 : 0; fclose(fp); delete[]buffer; if ( (!e) && input_file_was_transcoded && transcoding_warning_action) { transcoding_warning_action(this); } return e; } /* Write text to file. Unicode safe. */ int Fl_Text_Buffer_mod::outputfile(const char *file, int start, int end, int buflen) { FILE *fp; if (!(fp = fl_fopen(file, "w"))) return 1; for (int n; (n = min(end - start, buflen)); start += n) { const char *p = text_range(start, start + n); int r = fwrite(p, 1, n, fp); free((void *) p); if (r != n) break; } int e = ferror(fp) ? 2 : 0; fclose(fp); return e; } /* Return the previous character position. Unicode safe. */ int Fl_Text_Buffer_mod::prev_char_clipped(int pos) const { if (pos<=0) return 0; IS_UTF8_ALIGNED2(this, (pos)) char c; do { pos--; if (pos==0) return 0; c = byte_at(pos); } while ( (c&0xc0) == 0x80); IS_UTF8_ALIGNED2(this, (pos)) return pos; } /* Return the previous character position. Returns -1 if the beginning of the buffer is reached. */ int Fl_Text_Buffer_mod::prev_char(int pos) const { if (pos==0) return -1; return prev_char_clipped(pos); } /* Return the next character position. Returns length() if the end of the buffer is reached. */ int Fl_Text_Buffer_mod::next_char(int pos) const { IS_UTF8_ALIGNED2(this, (pos)) int n = fl_utf8len1(byte_at(pos)); pos += n; if (pos>=mLength) return mLength; IS_UTF8_ALIGNED2(this, (pos)) return pos; } /* Return the next character position. If the end of the buffer is reached, it returns the current position. */ int Fl_Text_Buffer_mod::next_char_clipped(int pos) const { return next_char(pos); } /* Align an index to the current UTF-8 boundary. */ int Fl_Text_Buffer_mod::utf8_align(int pos) const { char c = byte_at(pos); while ( (c&0xc0) == 0x80) { pos--; c = byte_at(pos); } return pos; } // // End of "$Id: Fl_Text_Buffer_mod.cxx 8040 2010-12-15 17:38:39Z manolo $". // fldigi-4.2.05/src/include/0000775000175000017500000000000014611714005012254 500000000000000fldigi-4.2.05/src/include/fmt.h0000664000175000017500000000524314611711171013140 00000000000000// ---------------------------------------------------------------------------- // fmt.h -- frequency measurement modem // // Copyright (C) 2020 // Dave Freese, W1HKJ // JC Gibbons, N8OBJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _fmt_H #define _fmt_H #include #include #include #include "complex.h" #include "filters.h" #include "fftfilt.h" #include "modem.h" #include "threads.h" #define DSP_CNT 1 //seconds #define MAX_MINUTES 120 #define MAX_DATA_PTS (60 * MAX_MINUTES) extern pthread_mutex_t scope_mutex; extern void fmt_write_file(); extern void FMT_thread_close(void); extern void cb_fmt_record_wav(bool); extern bool write_recs; extern bool record_unk; extern bool record_ref; class fmt : public modem { friend void fmt_write_file(); private: int sr; // 1..6; 8000 ... 48000 sps double unk_freq; Cmovavg *unk_ffilt; Cmovavg *unk_afilt; double unk_base_freq; double unk_amp; double ref_freq; Cmovavg *ref_ffilt; Cmovavg *ref_afilt; double ref_base_freq; double ref_amp; double movavg_len; double dspcnt; void writeFile(); // T&R discriminator double *fftbuff; double *unkbuff; double *refbuff; double bpf_width; double *BLACKMAN; double Ts; int ref_count; int unk_count; double dft_ref_base; double dft_ref_amp; double dft_unk_base; double dft_unk_amp; double am; double bm; double dm; double delta; double dmK; double srK; double twoPI; double blackman (double omega); double absdft (double *buff, double freq, double incr); int rx_process_dft (); C_FIR_filter *unk_bpfilter; C_FIR_filter *ref_bpfilter; void reset_bpf(); double evaluate_dft(double &freq); public: fmt(); ~fmt(); void init(); void rx_init(); void tx_init(); void restart(); void clear_ref_pipe(); void clear_unk_pipe(); int rx_process(const double *buf, int len); int tx_process(); void reset_unknown(); void reset_reference(); }; #endif fldigi-4.2.05/src/include/olivia.h0000664000175000017500000000405314611711171013633 00000000000000// ---------------------------------------------------------------------------- // olivia.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _OLIVIA_H #define _OLIVIA_H #include "modem.h" #include "jalocha/pj_mfsk.h" #include "sound.h" #define TONE_DURATION (SCBLOCKSIZE * 16) #define SR4 ((TONE_DURATION) / 4) class olivia : public modem { private: MFSK_Transmitter < double >*Tx; MFSK_Receiver < double >*Rx; double *txfbuffer; int txbufferlen; double phaseacc; cmplx prevsymbol; int preamble; unsigned int shreg; double np; double sp; double sigpwr; double noisepwr; int escape; int smargin; int sinteg; int tones; int bw; double tone_bw; int preamblesent; int postamblesent; double preamblephase; double txbasefreq; double tone_midfreq; double lastfreq; double ampshape[SR4]; double tonebuff[TONE_DURATION]; double nco(double freq); void send_tones(); public: olivia(trx_mode omode = MODE_OLIVIA); ~olivia(); void init(); void rx_init(); void rx_flush(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); int unescape(int c); }; #endif fldigi-4.2.05/src/include/timeops.h0000664000175000017500000000441114611711171014026 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef TIMEOPS_H_ #define TIMEOPS_H_ #include #include #include #ifdef __MINGW32__ # include #endif #if !HAVE_CLOCK_GETTIME # ifndef __clockid_t_defined typedef int clockid_t; #define __clockid_t_defined 1 # endif /* __clockid_t_defined */ # ifndef CLOCK_REALTIME # define CLOCK_REALTIME 0 # endif # ifndef CLOCK_MONOTONIC # define CLOCK_MONOTONIC 1 # endif int clock_gettime(clockid_t clock_id, struct timespec* tp); #endif /* !HAVE_CLOCK_GETTIME */ struct timespec operator+(const struct timespec &t0, const double &t); struct timespec operator-(const struct timespec &t0, const struct timespec &t1); struct timespec& operator-=(struct timespec &t0, const struct timespec &t1); bool operator>(const struct timespec &t0, const struct timespec &t1); bool operator==(const struct timespec &t0, const struct timespec &t1); struct timeval operator+(const struct timeval &t0, const double &t); struct timeval operator-(const struct timeval &t0, const struct timeval &t1); struct timeval& operator-=(struct timeval &t0, const struct timeval &t1); bool operator>(const struct timeval &t0, const struct timeval &t1); bool operator==(const struct timeval &t0, const struct timeval &t1); #ifndef GMTIME_R extern struct tm *gmtime_r(const time_t *timer, struct tm *tmbuf); extern struct tm *localtime_r(const time_t *_Time,struct tm *_Tm); #endif #endif // TIMEOPS_H_ fldigi-4.2.05/src/include/wefax.h0000664000175000017500000000714514611711171013467 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // Remi Chateauneu // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _WEFAX_H #define _WEFAX_H #include "globals.h" #include "modem.h" #include "filters.h" #include "mbuffer.h" #include "logbook.h" /// Forward definition. class fax_implementation ; class wefax : public modem { fax_implementation * m_impl ; bool m_abortxmt; /// For updating the logbook when loading/saving an image file. cQsoRec m_qso_rec ; /// Non-copiable object. wefax (); wefax ( const wefax & ); wefax & operator=( const wefax & ); public: wefax (trx_mode md); virtual ~wefax (); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void shutdown(); int tx_time( int nb_bytes ) const ; bool is_tx_finished( int ix_sample, int nb_sample, const char * msg ) const; void skip_apt(void); void skip_phasing(bool auto_center); void end_reception(void); void set_tx_parameters( int the_lpm, const unsigned char * xmtpic_buffer, bool is_color, int img_w, int img_h ); void set_tx_abort_flag(void) { m_abortxmt = true ; } /// Whether reading without end, or apt/phasing/stop. void set_rx_manual_mode( bool manual_flag ); /// There are several possible input filter designated /// by a name, for displaying, and an index. static const char ** rx_filters(void); /// Set by the GUI. void set_rx_filter( int idx_filter ); void set_lpm( int the_lpm ); /// Restores the window label by taking into account wefax state mode. void update_rx_label(void) const ; /// Returns a filename matching current image properties. std::string suggested_filename(void) const ; cQsoRec & qso_rec(void) { return m_qso_rec ; } /// Called before loading/sending an image. void qso_rec_init(void); /// Called when transmitting/receiving is finished. void qso_rec_save(void); void set_freq(double); /// Helper string indicating the internal state of the wefax engine. std::string state_string(void) const; /// Maximum wait time when getting information about received and sent files. static const int max_delay = 3600 * 24 * 365 ; /// Called by the engine when a file is received. void put_received_file(const std::string & filnam); /// Used by XML-RPC to get the list of received files. std::string get_received_file(int max_seconds=max_delay); /// Called by XML-RPC to send a file which resides on the machine where fldigi runs. std::string send_file( const std::string & filnam, double max_seconds=max_delay); /// Called before sending a file. Transmitting is an exclusive process. bool transmit_lock_acquire( const std::string & filnam, double max_seconds=max_delay); /// Called after sending a file so another sending can take place. void transmit_lock_release( const std::string & err_msg ); }; #endif fldigi-4.2.05/src/include/qrunner.h0000664000175000017500000001403514611711171014043 00000000000000// ---------------------------------------------------------------------------- // qrunner.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef QRUNNER_H_ #define QRUNNER_H_ #ifndef NDEBUG # include # include "debug.h" #endif #include #include #include #include #include #if HAVE_STD_BIND # include namespace qrbind { using std::bind; }; #elif HAVE_STD_TR1_BIND # include namespace qrbind { using std::tr1::bind; }; #else # error need std::bind or std::tr1::bind #endif #include "threads.h" #include "qrunner/fqueue.h" extern void write_message(int line_no, const char *func, const char *msg); extern void qrunner_debug(int tid, const char * name); extern const char *sztid[]; #ifndef __MINGW32__ typedef int SOCKET; # define QRUNNER_READ(fd__, buf__, len__) read(fd__, buf__, len__) # define QRUNNER_WRITE(fd__, buf__, len__) write(fd__, buf__, len__) #else # undef _WINSOCKAPI_ # include # define QRUNNER_READ(fd__, buf__, len__) recv(fd__, (char*)buf__, len__, 0) # define QRUNNER_WRITE(fd__, buf__, len__) send(fd__, (const char*)buf__, len__, 0) #endif class qexception : public std::exception { public: qexception(const char *msg_) : msg(msg_) { } qexception(int e) : msg(strerror(e)) { } ~qexception() throw() { } const char *what(void) const throw() { perror(msg.c_str()); return msg.c_str(); } private: std::string msg; }; struct fsignal { typedef void result_type; pthread_mutex_t* m; pthread_cond_t* c; fsignal(pthread_mutex_t* m_, pthread_cond_t* c_) : m(m_), c(c_) { } void operator()(void) const { pthread_mutex_lock(m); pthread_cond_signal(c); pthread_mutex_unlock(m); } }; struct nop { typedef void result_type; void operator()(void) const { } }; class qrunner { private: #define QRUNNER_DEBUG false public: qrunner(); ~qrunner(); void attach(void); void attach(int, std::string); void detach(void); template bool request(const F& f) { // added mutex here and removed it from qrunner_debug static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; guard_lock reqlock(&m); if (fifo->push(f)) { int resp = QRUNNER_WRITE(pfd[1], "", 1); if (QRUNNER_DEBUG) qrunner_debug(GET_THREAD_ID(), typeid(F).name()); #ifdef NDEBUG if (unlikely(resp != 1)) { throw qexception(errno); } #else assert(resp); #endif return true; } return false; } template bool request_sync(const F& f) { if (!attached) return request(f); for (;;) { if (request(f)) break; sched_yield(); } static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t c = PTHREAD_COND_INITIALIZER; fsignal s(&m, &c); pthread_mutex_lock(&m); for (;;) { if (request(s)) break; sched_yield(); } pthread_cond_wait(&c, &m); pthread_mutex_unlock(&m); return true; } static void execute(int fd, void *arg); void flush(void); void drop(void) { fifo->drop(); } size_t size(void) { return fifo->size(); } std::string id_str(void) { return _id_string; } protected: fqueue *fifo; SOCKET pfd[2]; bool attached; int _id_no; std::string _id_string; bool inprog; public: bool drop_flag; }; extern qrunner *cbq[NUM_QRUNNER_THREADS]; #if BENCHMARK_MODE #define REQ(...) ((void)0) #define REQ_DROP(...) ((void)0) #define REQ_SYNC(...) ((void)0) #define REQ_FLUSH(...) ((void)0) #define QRUNNER_DROP(...) ((void)0) #else #define REQ REQ_ASYNC #define REQ_DROP REQ_ASYNC_DROP #define REQ_ASYNC(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) \ cbq[GET_THREAD_ID()]->request(qrbind::bind(__VA_ARGS__)); \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_SYNC(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) \ cbq[GET_THREAD_ID()]->request_sync(qrbind::bind(__VA_ARGS__)); \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_ASYNC_DROP(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) { \ if (unlikely(cbq[GET_THREAD_ID()]->drop_flag)) \ break; \ cbq[GET_THREAD_ID()]->request(qrbind::bind(__VA_ARGS__)); \ } \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_SYNC_DROP(...) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) { \ if (unlikely(cbq[GET_THREAD_ID()]->drop_flag)) \ break; \ cbq[GET_THREAD_ID()]->request_sync(qrbind::bind(__VA_ARGS__)); \ } \ else \ qrbind::bind(__VA_ARGS__)(); \ } while (0) #define REQ_FLUSH(t_) \ do { \ if (GET_THREAD_ID() != FLMAIN_TID) \ cbq[GET_THREAD_ID()]->request_sync(nop()); \ else if (t_ < NUM_QRUNNER_THREADS) \ cbq[t_]->flush(); \ else \ for (int i = 0; i < NUM_QRUNNER_THREADS; i++) \ cbq[i]->flush(); \ } while (0) #define QRUNNER_DROP(v_) \ do { \ if ((GET_THREAD_ID() != FLMAIN_TID)) \ cbq[GET_THREAD_ID()]->drop_flag = v_; \ } while (0) #endif // BENCHMARK_MODE #endif // QRUNNER_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/waterfall.h0000664000175000017500000002052314611711171014331 00000000000000// ---------------------------------------------------------------------------- // Waterfall Spectrum Analyzer Widget // Copyright (C) 2006-2010 Dave Freese, W1HKJ // Copyright (C) 2008 Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _WF_H #define _WF_H #include #include #include #include #include #include #include #include "gfft.h" #include "fldigi-config.h" #include "digiscope.h" #include "flslider2.h" #include enum { WF_FFT_RECTANGULAR, WF_FFT_BLACKMAN, WF_FFT_HAMMING, WF_FFT_HANNING, WF_FFT_TRIANGULAR }; #define WF_FFTLEN 8192 #define WF_SAMPLERATE 8000 #define WF_BLOCKSIZE 512 struct RGB { uchar R; uchar G; uchar B; }; struct RGBI { uchar R; uchar G; uchar B; uchar I; }; // you can change the basic fft processing type by a simple change in the // following typedef. change to float if you need to skimp on cpu cycles. typedef double wf_fft_type; //typedef float wf_fft_type; typedef std::complex wf_cpx_type; extern RGBI mag2RGBI[256]; extern RGB palette[9]; enum WFmode { WATERFALL, SPECTRUM, SCOPE, NUM_WF_MODES }; #define MAG_1 1 #define MAG_2 2 #define MAG_4 3 enum WFspeed { PAUSE = 0, FAST = 1, NORMAL = 2, SLOW = 4 }; extern void do_qsy(bool); class WFdisp : public Fl_Widget { public: WFdisp (int x, int y, int w, int h, char *lbl = 0); ~WFdisp (); int wfmag(); int setMag(int m); void setOffset(int v); void Mode(WFmode M) { mode = M; } WFmode Mode() { return mode; } int cursorFreq(int xpos) { return (offset + step * xpos); } void Ampspan(double AmpSpn) { ampspan = (int)AmpSpn; } double Ampspan() { return ampspan; } void Bandwidth (int bw) { bandwidth = bw; makeMarker(); } int Bandwidth () { return bandwidth; } void Overload(int ovr) { if (overload == ovr) return; overload = ovr; } double AudioPeak() { return peakaudio; } WFspeed Speed() { return wfspeed;} void Speed(WFspeed rate) { wfspeed = rate; dispcnt = 1.0 * WF_BLOCKSIZE / WF_SAMPLERATE; } int Mag() { return mag;} void Mag(int m) { setMag(m);} int Offset() { return offset;} void Offset(int v) { setOffset(v);} void initmaps(); void draw(); int handle(int event); void update_sigmap(); void update_waterfall(); void checkoffset(); void slew(int); void movetocenter(); void carrier(int cf); int carrier(); inline void makeNotch_(int notch_frequency); inline void makeMarker_(int width, const RGB* color, int freq, const RGB* clrMin, RGB* clrM, const RGB* clrMax); void make_fmt_marker (); void makeMarker(); void process_analog(wf_fft_type *sig, int len); void processFFT(); void sig_data(double *sig, int len); void handle_sig_data(); void rfcarrier(unsigned long long f) { rfc = f; } void USB(bool b) { usb = b; } bool USB() {return usb;}; unsigned long long rfcarrier() { return rfc;}; void updateMarker() { drawMarker();}; int peakFreq(int f0, int delta); double powerDensity(double f0, double bw); double powerDensityMaximum(int bw_nb, const int (*bw)[2]) const ; void setPrefilter(int v); void setcolors(); double dFreq() {return dfreq;} void defaultColors(); private: int disp_width; int image_width; int scale_width; int RGBwidth; int RGBsize; int image_height; int image_area; int sig_image_area; int mag; int magset; WFmode mode; bool overload; bool usb; unsigned long long rfc; int offset; int sigoffset; int step; int carrierfreq; int bandwidth; int wfspdcnt; float dispcnt; float dispdec; int ampspan; double peakaudio; double dfreq; bool centercarrier; bool cursormoved; WFspeed wfspeed; // int srate; RGBI *fft_img; RGB *markerimage; RGB RGBmarker; RGB RGBcursor; RGBI RGBInotch; wf_fft_type *fftwindow; uchar *scaleimage; uchar *fft_sig_img; uchar *sig_img; uchar *scline; wf_cpx_type *wfbuf; short int *fft_db; int ptrFFTbuff; wf_fft_type *circbuff; int ptrCB; wf_fft_type *pwr; g_fft *wfft; int prefilter; int checkMag(); void checkWidth(); void initMarkers(); void makeScale(); void drawScale(); void drawMarker(); int log2disp(int v); void drawcolorWF(); void drawgrayWF(); void drawspectrum(); void drawsignal(); // resample SRC_STATE* src_state; SRC_DATA src_data; int genptr; float insamples[WF_BLOCKSIZE * 2]; float outsamples[WF_BLOCKSIZE * 16]; float *buf; int srclen; protected: public: bool wantcursor; int cursorpos; int newcarrier; int oldcarrier; bool tmp_carrier; double Pwr(int i) { if ( i > 0 && i < IMAGE_WIDTH) return pwr[i]; return 0.0; } }; class waterfall: public Fl_Group { friend void x1_cb(Fl_Widget *w, void* v); friend void slew_left(Fl_Widget *w, void * v); friend void slew_right(Fl_Widget *w, void * v); friend void center_cb(Fl_Widget *w, void *v); friend void carrier_cb(Fl_Widget *w, void *v); friend void mode_cb(Fl_Widget *w, void *v); friend void set_wf_mode(void); friend void ampspan_cb(Fl_Widget *w, void *v); friend void qsy_cb(Fl_Widget *w, void *v); friend void rate_cb(Fl_Widget *w, void *v); friend void btnMem_cb(Fl_Widget *w, void *v); public: waterfall(int x, int y, int w, int h, char *lbl= 0); ~waterfall(){}; void show_scope(bool on); void opmode(); void sig_data(double *sig, int len) { wfdisp->sig_data(sig, len); } void handle_sig_data() {wfdisp->handle_sig_data();} void Overload(bool ovr) { wfdisp->Overload(ovr); } int carrier() { return wfdisp->carrier(); } void carrier(int f); void rfcarrier(unsigned long long cf); unsigned long long rfcarrier(); bool tmp_carrier(void) { return wfdisp->tmp_carrier; } void set_XmtRcvBtn(bool val); void USB(bool b); bool USB(); void Reverse( bool v) { reverse = v;} bool Reverse() { return reverse;} void xmtrcv_selection_color(Fl_Color clr) {xmtrcv->selection_color(clr);} void reverse_selection_color(Fl_Color clr) {btnRev->selection_color(clr);} void xmtlock_selection_color(Fl_Color clr) {xmtlock->selection_color(clr);} void Bandwidth(int bw) { wfdisp->Bandwidth(bw); } int peakFreq(int f0, int delta) { return (wfdisp->peakFreq(f0, delta)); } double powerDensity(double f0, double bw) { return (wfdisp->powerDensity(f0,bw)); } double powerDensityMaximum(int bw_nb, const int (*bw)[2]) const { return (wfdisp->powerDensityMaximum(bw_nb,bw)); } int Speed(); void Speed(int rate); int Mag(); void Mag(int m); int Offset(); void Offset(int v); int Carrier(); void Carrier(int f); void draw_fmt_marker() { wfdisp->make_fmt_marker(); } void movetocenter() { wfdisp->movetocenter();} void redraw_marker() { wfdisp->makeMarker(); } void setPrefilter(int v) {wfdisp->setPrefilter(v);} void setcolors() { wfdisp->setcolors(); } void setRefLevel(); void setAmpSpan(); double dFreq() { return wfdisp->dFreq();} void setQSY(bool on) { if (on) qsy->activate(); else qsy->deactivate(); } double Pwr(int i) { return wfdisp->Pwr(i); } int handle(int event); void insert_text(bool check = false); enum { WF_NOP, WF_AFC_BW, WF_SIGNAL_SEARCH, WF_SQUELCH, WF_CARRIER, WF_MODEM, WF_SCROLL }; static const char* wf_wheel_action[7]; void handle_mouse_wheel(int what, int d); Fl_Button *btnRev; Fl_Counter2 *wfcarrier; Fl_Counter2 *wfRefLevel; Fl_Counter2 *wfAmpSpan; Fl_Light_Button *xmtrcv; Fl_Light_Button *xmtlock; Fl_Button *qsy; void UI_select(bool); Digiscope *wfscope; private: int wf_dim; WFdisp *wfdisp; Fl_Group *rs1; Fl_Button *mode; Fl_Button *x1; Fl_Button *left; Fl_Button *center; Fl_Button *right; Fl_Button *wfrate; Fl_Button *btnMem; Fl_Menu_Button *mbtnMem; int buttonrow; bool reverse; }; #endif fldigi-4.2.05/src/include/charsetdistiller.h0000664000175000017500000000360314532252172015720 00000000000000// ---------------------------------------------------------------------------- // charsetdistiller.h -- input charset cleaning and conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef CHARSETDISTILLER_H #define CHARSETDISTILLER_H #include #include "tiniconv.h" class CharsetDistiller { public: CharsetDistiller(const int charset_in = TINICONV_CHARSET_UTF_8); int set_input_encoding(const int charset_in); void rx(const unsigned char c); void rx(const unsigned char *c); void flush(); void reset(void); void clear(void); int data_length(void); int num_chars(void); const std::string &data(void); private: void process_buffer(void); void shift_first_out(); unsigned char buf[6]; // input buffer unsigned char *bufptr; // points to the next unused byte in the buffer tiniconv_ctx_s ctx; // libtiniconv conversion state for input encoding -> UTF-8 tiniconv_ctx_s ctx1252; // libtiniconv conversion state for CP1252 -> UTF-8 std::string outdata; // valid data int nutf8; // number of UTF-8 characters in the output buffer }; #endif fldigi-4.2.05/src/include/xmlrpc.h0000664000175000017500000000351714611711171013661 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef XMLRPC_H #define XMLRPC_H #include #include #include #include #include #include "threads.h" struct XmlRpcImpl; class XML_RPC_Server { public: static void start(const char* node, const char* service); static void stop(void); static std::ostream& list_methods(std::ostream& out); private: XML_RPC_Server(); ~XML_RPC_Server(); XML_RPC_Server(const XML_RPC_Server&); XML_RPC_Server operator=(const XML_RPC_Server&); static void add_methods(void); static void* thread_func(void*); private: static XML_RPC_Server* inst; bool run; XmlRpcImpl* server_impl; }; extern void xmlrpc_set_qsy(long long rfc); extern int xmltest_char(); extern bool xmltest_char_available; extern void reset_xmlchars(); extern int number_of_samples(std::string s); extern bool flmsg_is_online; extern std::string flmsg_data; extern pthread_mutex_t* server_mutex; #endif // XMLRPC_H fldigi-4.2.05/src/include/psk_browser.h0000664000175000017500000000607314611711171014714 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PSK_BROWSER_H #define PSK_BROWSER_H #include #include #include #include #include #include #include "viewpsk.h" #include "globals.h" #include "charsetdistiller.h" #include "re.h" #define BWSR_BORDER 2 class pskBrowser : public Fl_Hold_Browser{ private: static std::string hilite_color_1; static std::string hilite_color_2; static std::string white; static std::string bkgnd[]; std::string fline; std::string nuline; std::string bwsrline[MAXCHANNELS]; int bwsrfreq[MAXCHANNELS]; struct {bool regex_alert; bool mycall_alert;} alerted[MAXCHANNELS]; CharsetDistiller *cdistiller; int labelwidth[VIEWER_LABEL_NTYPES]; Fl_Font fnt; Fl_Color HiLite_1; Fl_Color HiLite_2; Fl_Color BkSelect; Fl_Color Backgnd1; Fl_Color Backgnd2; int siz; int cols[2]; char szLine[32]; public: static int cwidth; static int cheight; static int sbarwidth; unsigned long long rfc; bool usb; fre_t *seek_re; public: pskBrowser(int x, int y, int w, int h, const char *l = ""); ~pskBrowser(); void makecolors(); void evalcwidth(); void setfont(Fl_Font font, int sz) { fnt = font; siz = sz; evalcwidth();} void HighLight_1(Fl_Color clr) { HiLite_1 = clr; } Fl_Color HighLight_1() { return HiLite_1; } void HighLight_2(Fl_Color clr) { HiLite_2 = clr; } Fl_Color HighLight_2() { return HiLite_2; } void SelectColor(Fl_Color clr) { BkSelect = clr; } Fl_Color SelectColor() { return BkSelect; } void Background1(Fl_Color clr) { Backgnd1 = clr; } Fl_Color Background1() { return Backgnd1; } void Background2(Fl_Color clr) { Backgnd2 = clr; } Fl_Color Background2() { return Backgnd2; } void columns(int a) { cols[0] = a; cols[1] = 0; column_widths(cols); } void resize(int x, int y, int w, int h); void addchr(int ch, int freq, unsigned char c, int md, bool alert = false); void set_input_encoding(int encoding_id); std::string freqformat (int i); void set_freq(int i, int freq); void clearline(int i) { bwsrline[i] = ""; } std::string line(int i) { return (i < 1 ? "" : i > MAXCHANNELS ? "" : bwsrline[i - 1]); } int freq(int i); void clear(); void clearch(int n, int freq); void swap(int, int); }; #endif fldigi-4.2.05/src/include/utf8file_io.h0000664000175000017500000000213014532252172014562 00000000000000// ---------------------------------------------------------------------------- // utf8file_io.h // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef UTF8_FILE_IO #define UTF8_FILE_IO #include int UTF8_readfile ( const char *file, std::string &textread ); int UTF8_writefile( const char *file, std::string &textwrite ); #endif fldigi-4.2.05/src/include/dsp.h0000664000175000017500000011453514611711171013145 00000000000000/* * dsp.h -- various DSP algorithms * * based on mt63 code by Pawel Jalocha * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2019 Dave Freese, W1HKJ * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #include #include #include // ---------------------------------------------------------------------------- // double/other-complex type template struct Cdspcmpx { type re,im; }; typedef Cdspcmpx dspCmpx; // Some complex operators template inline void operator +=(Cdspcmpx &Dst, Cdspcmpx &Src) { Dst.re += Src.re; Dst.im += Src.im; } template inline void operator -=(Cdspcmpx &Dst, Cdspcmpx &Src) { Dst.re -= Src.re; Dst.im -= Src.im; } template inline void operator *=(Cdspcmpx &Dst, num Src) { Dst.re *= Src; Dst.im *= Src; } template inline void operator /=(Cdspcmpx &Dst, num Src) { Dst.re /= Src; Dst.im /= Src; } // scalar product of two vectors template inline double dspScalProd(Cdspcmpx &A, Cdspcmpx &B) { return A.re * B.re + A.im * B.im; } template inline double dspScalProd(typeA Ia, typeA Qa, Cdspcmpx &B) { return Ia * B.re + Qa * B.im; } // complex multiply template inline void CdspcmpxMultAxB(Cdspcmpx &Dst, Cdspcmpx &A, Cdspcmpx &B) { Dst.re = A.re * B.re - A.im * B.im; Dst.im = A.re * B.im + A.im * B.re; } template inline void CdspcmpxMultAxB(typeDst &DstI, typeDst &DstQ, Cdspcmpx &A, Cdspcmpx &B) { DstI = A.re * B.re - A.im * B.im; DstQ = A.re * B.im + A.im * B.re; } // complex multiply, second argument with a "star" (B.im is negated) template inline void CdspcmpxMultAxBs(Cdspcmpx &Dst, Cdspcmpx &A, Cdspcmpx &B) { Dst.re = A.re * B.re + A.im * B.im; Dst.im = A.im * B.re - A.re * B.im; } // ---------------------------------------------------------------------------- // signed 16-bit format (standard 16-bit audio) typedef short dspS16; // ---------------------------------------------------------------------------- template inline int dspRedspAllocArray(type **Array, int Size) { delete [] *Array; *Array = new type[Size]; return (*Array == 0); } template inline int dspAllocArray(type **Array, int Size) { *Array = new type[Size]; return (*Array == 0); } template inline void dspClearArray(type *Array, int Size) { memset(Array, 0, Size*sizeof(type)); } template inline void dspCopyArray(type *Dst, type *Src, int Size) { memcpy(Dst, Src, Size*sizeof(type)); } template inline void dspMoveArray(type *Dst, type *Src, int Size) { memmove(Dst, Src, Size*sizeof(type)); } template int dspAllocArray2D(type ***Array, int Size1, int Size2) { int i; (*Array) = new type *[Size1 * (sizeof(type *))]; if ((*Array) == NULL) return 1; for (i = 0; i < Size1; i++) (*Array)[i] = NULL; for (i = 0; i < Size1; i++) { (*Array)[i] = new type [Size2 * sizeof(type)]; if ((*Array)[i] == NULL) goto Error; } return 0; Error: for (i = 0; i < Size1; i++) delete [] (*Array)[i]; delete [] *Array; return 1; } template void dspFreeArray2D(type **Array, int Size1) { if (Array == 0) return; int i; for (i = 0; i < Size1; i++) delete [] (Array)[i]; delete [] Array; } template void dspClearArray2D(type **Array, int Size1, int Size2) { int i; for (i = 0; i < Size1; i++) memset(Array[i], 0, Size2 * sizeof(type)); } // ---------------------------------------------------------------------------- // processing buffers: template class dspSeq { public: dspSeq(); ~dspSeq(); int EnsureSpace(int ReqSpace); // make sure that there is enough space void Free(void); // free space to save RAM when buffer is not in use int Space; // that much is allocated in *Data int Len; // that much is filled up type *Data; // contains Len elements }; template dspSeq::dspSeq() { Data = NULL; Len = Space = 0; } template dspSeq::~dspSeq() { free(Data); } template int dspSeq::EnsureSpace(int ReqSpace) { if (ReqSpace <= Space) return 0; Data = new type[ReqSpace * sizeof(type)]; if (Data == NULL) { Space = Len = 0; return -1; } Space = ReqSpace; return 0; } template void dspSeq::Free(void) { delete [] Data; Data = NULL; Space = Len = 0; } typedef dspSeq float_buff; typedef dspSeq double_buff; typedef dspSeq dspCmpx_buff; typedef dspSeq dspCmpx_buff; // typedef dspSeq int16_buff; <- this doesn't work - why ?! typedef dspSeq dspS16_buff; typedef dspSeq char_buff; // ---------------------------------------------------------------------------- // First-In First-Out pipes template class dspFIFO { public: dspFIFO(); ~dspFIFO(); int Preset(int Max); void Free(void); void Clear(void); int Inp(type Elem); int Out(type &Elem); int InpReady(void); int OutReady(void); private: type *Buff; int Size; int Rd,Wr; }; template dspFIFO::dspFIFO() { Buff = NULL; } template dspFIFO::~dspFIFO() { free(Buff); } template void dspFIFO::Free(void) { delete [] Buff; Buff = NULL; } template int dspFIFO::Preset(int Max) { Size = Max + 1; if (dspRedspAllocArray(&Buff, Size)) return -1; Rd = 0; Wr = 0; return 0; } template void dspFIFO::Clear(void) { Rd = Wr; } template int dspFIFO::Inp(type Elem) { int w = Wr; Buff[w] = Elem; w += 1; if (w >= Size) w=0; if (w == Rd) return -1; Wr = w; return 0; } template int dspFIFO::Out(type &Elem) { if (Rd == Wr) return -1; Elem = Buff[Rd]; Rd += 1; if (Rd >= Size) Rd = 0; return 0; } template int dspFIFO::OutReady(void) { return (Wr >= Rd) ? Wr - Rd : Wr -Rd + Size; } template int dspFIFO::InpReady(void) { return (Rd > Wr) ? Rd - Wr - 1 : Rd - Wr + Size - 1; } typedef dspFIFO char_dspFIFO; // ---------------------------------------------------------------------------- // dspPower of single and complex values and dspSequences of these inline double dspPower(double X) { return X * X; } inline double dspPower(double I, double Q) { return I * I + Q * Q; } inline double dspPower(dspCmpx X) { return X.re * X.re + X.im * X.im; } double dspPower(double *X, int Len); double dspPower(double *I, double *Q, int Len); double dspPower(dspCmpx *X, int Len); inline double dspPower(double_buff *buff) { return dspPower(buff->Data, buff->Len); } inline double dspPower(dspCmpx_buff *buff) { return dspPower(buff->Data, buff->Len); } // dspAmplitude calculations inline double dspAmpl(double I, double Q) { return sqrt(I * I + Q * Q); } inline double dspAmpl(dspCmpx X) { return sqrt(X.re * X.re + X.im * X.im); } // dspPhase calculation (output = <-PI..PI) ) inline double dspPhase(double I, double Q) { return atan2(Q,I); } inline double dspPhase(dspCmpx X) { return atan2(X.im, X.re); } // dspPhase normalization inline double dspPhaseNorm(double dspPhase) { if (dspPhase >= M_PI) return dspPhase - 2 * M_PI; if (dspPhase < (-M_PI)) return dspPhase + 2 * M_PI; return dspPhase; } // ---------------------------------------------------------------------------- // min./max. of integers inline int dspIntmin(int i1, int i2) { return i1 < i2 ? i1 : i2; } inline int dspIntmax(int i1, int i2) { return i1 > i2 ? i1 : i2; } inline int dspIntmin(int i1, int i2, int i3) { return i1 < i2 ? (i1 < i3 ? i1 : i3) : (i2 < i3 ? i2 : i3); } inline int dspIntmax(int i1, int i2, int i3) { return i1 > i2 ? (i1 > i3 ? i1 : i3) : (i2 > i3 ? i2 : i3); } // ---------------------------------------------------------------------------- // Extreme search, dspAverage, fitting double dspAverage(double *Data, int Len); int dspCountInRange(double *Data, int Len, double Low, double Upp); inline int dspCountInRange(double_buff *Input, double Low, double Upp) { return dspCountInRange(Input->Data, Input->Len, Low, Upp); } inline double dspRMS(double *Data, int Len) { return sqrt(dspPower(Data, Len) / Len); } inline double dspRMS(dspCmpx *Data, int Len) { return sqrt(dspPower(Data, Len) / Len); } inline double dspRMS(double_buff *Input) { return dspRMS(Input->Data, Input->Len); } inline double dspRMS(dspCmpx_buff *Input) { return dspRMS(Input->Data, Input->Len); } template type dspFindMin(type *Data, int Len) { type Min; int i; Min = Data[0]; for (i = 1; i < Len; i++) if(Data[i] < Min) Min = Data[i]; return Min; } template type dspFindMin(type *Data, int Len, int &MinPos) { type Min; int i, pos; Min = Data[0]; pos=0; for (i = 1; i < Len; i++) if (Data[i] < Min) { Min = Data[i]; pos = i; } MinPos = pos; return Min; } template type dspFindMax(type *Data, int Len) { type Max; int i; Max = Data[0]; for (i = 1; i < Len; i++) if (Data[i] > Max) Max = Data[i]; return Max; } template type dspFindMax(type *Data, int Len, int &MaxPos) { type Max; int i, pos; Max = Data[0]; pos = 0; for (i = 1; i < Len; i++) if (Data[i] > Max) { Max = Data[i]; pos = i; } MaxPos = pos; return Max; } double dspFindMaxdspPower(dspCmpx *Data, int Len); double dspFindMaxdspPower(dspCmpx *Data, int Len, int &MaxPos); double dspFitPoly1(double *Data, int Len, double &A, double &B); double dspFitPoly2(double *Data, int Len, double &A, double &B, double &C); void dspFitPoly2(double Data[3], double &A, double &B, double &C); // ---------------------------------------------------------------------------- // "selective" dspAverage fit template int dspSelFitAver( type *Data, int Len, double SelThres, int Loops, double &Aver, double &dspRMS, int &Sel) { int i, loop, Incl;//, prev; double Sum, ErrSum, Lev, dLev, Diff, Thres; for (ErrSum = Sum = 0.0, i = 0; i < Len; i++) { Sum += Data[i]; ErrSum += dspPower(Data[i]); } Lev = Sum/Len; ErrSum /= Len; ErrSum -= Lev*Lev; // printf("Len=%d, Lev=%+7.4f, ErrSum=%7.4f, dspRMS=%7.4f\n", // Len,Lev,ErrSum,sqrt(ErrSum)); // prev = Len; Incl = 0; for (loop = 0; loop < Loops; loop++) { Thres = SelThres * SelThres * ErrSum; for (ErrSum = Sum = 0.0, Incl = 0, i = 0; i < Len; i++) { Diff = dspPower(Data[i]-Lev); if (Diff <= Thres) { Sum += Data[i]; ErrSum += Diff; Incl += 1; } // else printf(" %d",i); } Sum /= Incl; dLev = Sum - Lev; ErrSum /= Incl; ErrSum -= dLev * dLev; Lev += dLev; ErrSum = fabs(ErrSum); // printf("\nLoop #%d, Lev=%+7.4f, dLev=%+7.4f, ErrSum=%7.4f, dspRMS=%7.4f, Incl=%d\n", // loop,Lev,dLev,ErrSum,sqrt(ErrSum),Incl); // if(Incl==prev) { loop++; break; } // prev=Incl; } Aver = Lev; dspRMS = sqrt(ErrSum); Sel=Incl; return loop; } template int dspSelFitAver( Cdspcmpx *Data, int Len, double SelThres, int Loops, Cdspcmpx &Aver, double &dspRMS, int &Sel) { int i, loop, Incl;//, prev; dspCmpx Sum, Lev, dLev; double ErrSum, Diff, Thres; for (ErrSum = 0.0, Sum.re = Sum.im = 0.0, i = 0; i < Len; i++) { Sum.re += Data[i].re; Sum.im += Data[i].im; ErrSum += dspPower(Data[i]); } Lev.re = Sum.re / Len; Lev.im = Sum.im / Len; ErrSum /= Len; ErrSum -= dspPower(Lev); // printf("Len=%d, Lev=[%+7.4f,%+7.4f], ErrSum=%7.4f, dspRMS=%7.4f\n", // Len,Lev.re,Lev.im,ErrSum,sqrt(ErrSum)); Incl = 0; // prev = Len; for (loop = 0; loop < Loops; loop++) { Thres = 0.5 * SelThres * SelThres * ErrSum; for (ErrSum = 0.0, Sum.re = Sum.im = 0.0, Incl = 0, i = 0; i < Len; i++) { Diff = dspPower(Data[i].re - Lev.re, Data[i].im - Lev.im); if (Diff <= Thres) { Sum.re += Data[i].re; Sum.im += Data[i].im; ErrSum += Diff; Incl += 1; } // else printf(" %d",i); } Sum.re /= Incl; Sum.im /= Incl; dLev.re = Sum.re - Lev.re; dLev.im = Sum.im - Lev.im; ErrSum /= Incl; ErrSum -= dspPower(dLev); ErrSum = fabs(ErrSum); Lev.re += dLev.re; Lev.im += dLev.im; // printf("\nLoop #%d, Lev=[%+6.3f,%+6.3f], dLev=[%+6.3f,%+6.3f], ErrSum=%7.4f, dspRMS=%7.4f, Incl=%d\n", // loop, Lev.re,Lev.im, dLev.re,dLev.im, ErrSum,sqrt(ErrSum), Incl); // if(Incl==prev) { loop++; break; } // prev=Incl; } Aver = Lev; dspRMS = sqrt(ErrSum); Sel = Incl; return loop; } // ---------------------------------------------------------------------------- // white noise generator template void dspWhiteNoise(type &X) { double Rand, dspPower, dspPhase; Rand = ((double)rand() + 1.0) / ((double)RAND_MAX + 1.0); dspPower = sqrt(-2*log(Rand)); Rand = (double)rand() / (double)RAND_MAX; dspPhase = 2 * M_PI * Rand; X = dspPower * cos(dspPhase); } template void CdspcmpxdspWhiteNoise(Cdspcmpx &X) { double Rand, dspPower, dspPhase; Rand = ((double)rand() + 1.0) / ((double)RAND_MAX + 1.0); dspPower = sqrt(-log(Rand)); Rand = (double)rand() / (double)RAND_MAX; dspPhase = 2 * M_PI* Rand; X.re = dspPower * cos(dspPhase); X.im = dspPower * sin(dspPhase); } // ---------------------------------------------------------------------------- // various window shapes (for the FFT and FIR filters) // these functions are supposed to be called with the argument "dspPhase" // between -PI and +PI. Most (or even all) will return zero for input // euqal -PI or +PI. double dspWindowHanning(double dspPhase); double WindowBlackman2(double dspPhase); // from Freq 5.1 FFT analyzer double dspWindowBlackman3(double dspPhase); // from the Motorola BBS // ---------------------------------------------------------------------------- // FIR shape calculation for a flat response from FreqLow to FreqUpp void dspWinFirI( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift = 0.0); void WinFirQ( double LowOmega, double UppOmega, double *Shape, int Len, double (*Window)(double), double shift = 0.0); // ---------------------------------------------------------------------------- // convert 16-bit signed or 8-bit unsigned into doubles void dspConvS16todouble(dspS16 *dspS16, double *dbl, int Len, double Gain = 1.0 / 32768.0); int dspConvS16todouble(dspS16 *dspS16, double_buff *dbl, int Len, double Gain = 1.0 / 32768.0); void dspConvdoubleTodspS16(double *dbl, dspS16 *dspS16, int Len, double Gain = 32768.0); inline int dspConvdoubleTodspS16(double_buff *dbl, dspS16_buff *dspS16, double Gain = 32768.0) { int err = dspS16->EnsureSpace(dbl->Len); if (err) return -1; dspConvdoubleTodspS16(dbl->Data, dspS16->Data, dbl->Len, Gain); dspS16->Len = dbl->Len; return 0; } void dspConvU8todouble(unsigned char *U8, double *dbl, int Len, double Gain = 1.0 / 128.0); int dspConvU8todouble(unsigned char *U8, double_buff *dbl, int Len, double Gain = 1.0 / 128.0); // ---------------------------------------------------------------------------- // other converts void dspConvCmpxTodspPower(dspCmpx *Inp, int InpLen, double *Out); int dspConvCmpxTodspPower(dspCmpx_buff *Input, double_buff *Output); void dspConvCmpxTodspAmpl(dspCmpx *Inp, int InpLen, double *Out); int dspConvCmpxTodspAmpl(dspCmpx_buff *Input, double_buff *Output); void dspConvCmpxTodspPhase(dspCmpx *Inp, int InpLen, double *Out); int dspConvCmpxTodspPhase(dspCmpx_buff *Input, double_buff *Output); // ---------------------------------------------------------------------------- // Pulse noise limiter class dspPulseLimiter { public: dspPulseLimiter(); ~dspPulseLimiter(); void Free(void); int Preset(int TapLen, double Limit=4.0); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); double_buff Output; double dspRMS; private: int Len; double Thres; double *Tap; int Ptr; double PwrSum; }; // ---------------------------------------------------------------------------- // Signal level monitor class dspLevelMonitor { public: dspLevelMonitor(); ~dspLevelMonitor(); int Preset(double Integ, double Range = 0.75); int Process(double *Inp, int Len); int Process(double_buff *Input); double dspRMS; double OutOfRange; private: double PwrMid,PwrOut; double OutOfRangeMid; double MaxSqr; double W1, W2, W5; }; // ---------------------------------------------------------------------------- // Automatic Gain/Level Control for the Mixer class dspMixerAutoLevel { public: dspMixerAutoLevel(); // ~dspMixerAutoLevel(); int Process(double *Inp, int InpLen); int Process(double_buff *Inp) { return Process(Inp->Data, Inp->Len); } public: int IntegLen; // mean dspPower integration time [samples] double MinMS; // minimum acceptable dspAverage dspPower double MaxMS; // maximum acceptable dspAverage dspPower int PeakHold; // level holding time after a peak [samples] int MinHold; // minimal time between changing the mixer level [samples] int AdjStep; // mixer level adjusting step int MinLevel; // mimimum allowed mixer level int MaxLevel; // maximum allowed mixer level double AvedspRMS; // dspAverage dspPower of the input signal int Hold; // time counter for holding levels int Level; // actual mixer level }; // ---------------------------------------------------------------------------- // Two-element IIR low pass filter struct dspLowPass2elem { double Mid, Out; }; struct dspLowPass2weight { double W1, W2, W5; }; // first calculate the coefficiants W1,W2 and W5 for given integration time template inline void dspLowPass2Coeff(typeLen IntegLen, typeW &W1, typeW &W2, typeW &W5) { W1 = 1.0 / IntegLen; W2 = 2.0 / IntegLen; W5 = 5.0 / IntegLen; } template inline void dspLowPass2Coeff(typeLen IntegLen, dspLowPass2weight &Weight) { Weight.W1 = 1.0 / IntegLen; Weight.W2 = 2.0 / IntegLen; Weight.W5 = 5.0 / IntegLen; } // then you can process samples template inline void dspLowPass2( typeInp Inp, typeOut &Mid, typeOut &Out, typeW W1, typeW W2, typeW W5) { double Sum, Diff; Sum = Mid + Out; Diff = Mid-Out; Mid += W2 * Inp - W1 * Sum; Out += W5 * Diff; } template inline void dspLowPass2( typeInp Inp, dspLowPass2elem &Elem, typeW W1, typeW W2, typeW W5) { double Sum, Diff; Sum = Elem.Mid + Elem.Out; Diff = Elem.Mid - Elem.Out; Elem.Mid += W2 * Inp - W1 * Sum; Elem.Out += W5 * Diff; } template inline void dspLowPass2( typeInp Inp, dspLowPass2elem &Elem, dspLowPass2weight &Weight) { double Sum, Diff; Sum = Elem.Mid + Elem.Out; Diff = Elem.Mid - Elem.Out; Elem.Mid += Weight.W2 * Inp - Weight.W1 * Sum; Elem.Out += Weight.W5 * Diff; } void dspLowPass2( dspCmpx *Inp, dspCmpx *Mid, dspCmpx *Out, double W1, double W2, double W5); // ---------------------------------------------------------------------------- // periodic low pass class dspPeriodLowPass2 { public: dspPeriodLowPass2(); ~dspPeriodLowPass2(); void Free(void); int Preset(int Period, double IntegLen); int Process(double Inp, double &Out); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); double_buff Output; private: int Len; double *TapMid,*TapOut; int TapPtr; double W1,W2,W5; }; // ---------------------------------------------------------------------------- // a simple dspDelay template class dspDelay { public: dspDelay(); ~dspDelay(); void Free(void); int Preset(int len); void Process(type *Inp, int InpLen, type *Out); int Process(dspSeq *Input); dspSeq Output; private: int Len; type *Tap; int TapPtr; }; template dspDelay::dspDelay() { Tap = NULL; } template dspDelay::~dspDelay() { delete [] Tap; } template void dspDelay::Free(void) { delete [] Tap; Tap = NULL; } template int dspDelay::Preset(int dspDelayLen) { Len = dspDelayLen; if (dspRedspAllocArray(&Tap,Len)) return -1; dspClearArray(Tap,Len); TapPtr = 0; return 0; } template void dspDelay::Process(type *Inp, int InpLen, type *Out) { int i, batch; for (i = 0; i < InpLen; ) { for (batch = dspIntmin(InpLen - i, Len - TapPtr), i += batch; batch; batch--) { (*Out++) = Tap[TapPtr]; Tap[TapPtr++] = (*Inp++); } if (TapPtr >= Len) TapPtr = 0; } } template int dspDelay::Process(dspSeq *Input) { int err = Output.EnsureSpace(Input->Len); if (err) return -1; Process(Input->Data, Input->Len, Output.Data); Output.Len = Input->Len; return 0; } // ---------------------------------------------------------------------------- // dspDelayLine, like dspDelay but more flexible // The idea is that we hold addressable history of at least MaxdspDelay // samples. // After each input batch is processed, the InpPtr points to the first sample // of this batch and we can address samples backwards upto MaxdspDelay. // For more optimal performace we allocate more RAM than just for MaxdspDelay. // Infact the allocated size (MaxSize) should be at least // MaxdspDelay plus the largest expected input length. template class dspDelayLine { public: dspDelayLine(); ~dspDelayLine(); void Free(void); int Preset(int MaxdspDelay, int MaxSize = 0); int Process(type *Inp, int Len); int Process(dspSeq *Input); type *Line; // line storage int dspDelay; // how many (at least) backward samples are stored int LineSize; // allocated size int DataLen; // length of the valid data type *InpPtr; // first sample for the most recent processed batch int InpLen; // number of samples for the most recent input }; template dspDelayLine::dspDelayLine() { Line = NULL; } template dspDelayLine::~dspDelayLine() { delete [] Line; } template void dspDelayLine::Free(void) { delete [] Line; Line = NULL; } template int dspDelayLine::Preset(int MaxdspDelay, int MaxSize) { LineSize = MaxSize; if (LineSize < (2 * MaxdspDelay)) LineSize = 2 * MaxdspDelay; DataLen = MaxdspDelay; dspDelay = MaxdspDelay; if (dspRedspAllocArray(&Line, LineSize)) return -1; dspClearArray(Line, LineSize); InpPtr = Line + DataLen; InpLen = 0; return 0; } template int dspDelayLine::Process(type *Inp, int Len) { if ((DataLen + Len) > LineSize) { dspMoveArray(Line, Line + DataLen - dspDelay, dspDelay); DataLen = dspDelay; } if ((DataLen + Len) > LineSize) return -1; dspCopyArray(Line + DataLen, Inp, Len); InpPtr = Line + DataLen; InpLen = Len; DataLen += Len; return 0; } template int dspDelayLine::Process(dspSeq *Input) { return Process(Input->Data, Input->Len); } // ---------------------------------------------------------------------------- // Low pass "moving box" FIR filter // very unpure spectral response but CPU complexity very low // and independent on the integration time class dspBoxFilter { public: dspBoxFilter(); ~dspBoxFilter(); void Free(void); int Preset(int BoxLen); int Process(double Inp, double &Out); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); void Recalibrate(); double_buff Output; private: int Len; double *Tap; int TapPtr; double Sum; }; class dspCmpxBoxFilter { public: dspCmpxBoxFilter(); ~dspCmpxBoxFilter(); void Free(void); int Preset(int BoxLen); int Process(dspCmpx *Inp, int InpLen, dspCmpx *Out); void Recalibrate(); int Process(dspCmpx_buff *Input); dspCmpx_buff Output; private: int Len; dspCmpx *Tap; int TapPtr; dspCmpx Sum; }; // ---------------------------------------------------------------------------- // FIR filter with a given shape class dspFirFilter { public: dspFirFilter(); ~dspFirFilter(); void Free(void); int Preset(int FilterLen, double *FilterShape = (double*)NULL); int Process(double *Inp, int InpLen, double *Out); int Process(double_buff *Input); // Response(double Freq, double *Resp); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); // UseExternShape(double *shape); double_buff Output; private: int Len; // Tap/Shape length double *Shape; // Response shape int ExternShape; // that we are using an externally provided shape double *Tap; int TapPtr; }; // ---------------------------------------------------------------------------- // a pair of FIR filters. quadrature split, decimate // the decimation rate must be integer class dspQuadrSplit { public: dspQuadrSplit(); ~dspQuadrSplit(); void Free(void); int Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); // int Process(double *Inp, int InpLen, // double *OutI, double *OutQ, int MaxOutLen, int *OutLen); // int Process(double *Inp, int InpLen, // dspCmpx *Out, int MaxOutLen, int *OutLen); int Process(double_buff *Input); dspCmpx_buff Output; private: int Len; double_buff Tap; double *ShapeI, *ShapeQ; int ExternShape; int Rate; }; // ---------------------------------------------------------------------------- // reverse of dspQuadrSplit: interpolates and combines the I/Q // back into 'real' signal. class dspQuadrComb { public: dspQuadrComb(); ~dspQuadrComb(); void Free(void); int Preset( int FilterLen, double *FilterShape_I, double *FilterShape_Q, int DecimateRate); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); int Process(dspCmpx_buff *Input); double_buff Output; private: int Len; double *Tap; int TapPtr; double *ShapeI, *ShapeQ; int ExternShape; int Rate; }; // ---------------------------------------------------------------------------- // complex mix with an oscilator (carrier) // here we could avoid computing sine/cos at every sample class dspCmpxMixer { public: dspCmpxMixer(); // ~dspCmpxMixer(); void Free(void); int Preset(double CarrierOmega); int ProcessFast( double *InpI, double *InpQ, int InpLen, double *OutI, double *OutQ); int Process(dspCmpx *Inp, int InpLen, dspCmpx *Out); int ProcessFast(dspCmpx *Inp, int InpLen, dspCmpx *Out); int Process(dspCmpx_buff *Input); int ProcessFast(dspCmpx_buff *Input); dspCmpx_buff Output; public: double dspPhase, Omega; }; // ---------------------------------------------------------------------------- // FM demodulator (dspPhase rotation speed-meter) class dspFMdemod { public: dspFMdemod(); // ~dspFMdemod(); int Preset(double CenterOmega); int Process(double *InpI, double *InpQ, int InpLen, double *Out); int Process(dspCmpx *Inp, int InpLen, double *Out); int Process(dspCmpx_buff *Input); double_buff Output; private: double PrevdspPhase; public: double RefOmega; }; // ---------------------------------------------------------------------------- // Rate converter - real input/output, linear interpolation // expect large error when high frequency components are present // thus the best place to convert rates is after a low pass filter // of a demodulator. class dspRateConvLin { public: dspRateConvLin(); // ~dspRateConvLin(); void SetOutVsInp(double OutVsInp); void SetInpVsOut(double InpVsOut); int Process(double_buff *InpBuff); double_buff Output; private: double OutStep, OutdspPhase; double PrevSample; }; // ---------------------------------------------------------------------------- // Rate converter - real input/output, quadratic interpolation // similar limits like for RateConv1 class dspRateConvQuadr { public: dspRateConvQuadr(); // ~dspRateConvQuadr(); void SetOutVsInp(double OutVsInp); void SetInpVsOut(double InpVsOut); int Process(double *Inp, int InpLen, double *Out, int MaxOutLen, int *OutLen); int Process(double_buff *InpBuff); double_buff Output; private: double OutStep, OutdspPhase; double Tap[4]; int TapPtr; }; // ---------------------------------------------------------------------------- // Rate converter, real input/output, // bandwidth-limited interpolation, several shifted FIR filters class dspRateConvBL { public: dspRateConvBL(); ~dspRateConvBL(); void Free(void); int Preset(int FilterLen, double *FilterShape[], int FilterShapeNum); int ComputeShape(double LowOmega, double UppOmega, double (*Window)(double)); void SetOutVsInp(double OutVsInp); void SetInpVsOut(double InpVsOut); int Process(double_buff *Input); int ProcessLinI(double_buff *Input); double_buff Output; private: double OutStep, OutdspPhase; int Len; double *Tap; int TapSize; double **Shape; int ShapeNum; int ExternShape; }; // ---------------------------------------------------------------------------- // Sliding window (for FFT input) class dspCmpxSlideWindow { public: dspCmpxSlideWindow(); ~dspCmpxSlideWindow(); void Free(void); int Preset(int WindowLen, int SlideDist, double *WindowShape=(double*)NULL); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); int Process(dspCmpx_buff *Input); dspCmpx_buff Output; private: int Len; // Window length dspCmpx *Buff; // storage int Dist; // distance between slides int Ptr; // data pointer in Buff double *Window; // window shape int ExternWindow; }; // ---------------------------------------------------------------------------- // Overlapping window (for IFFT output) class dspCmpxOverlapWindow { public: dspCmpxOverlapWindow(); ~dspCmpxOverlapWindow(); void Free(void); int Preset(int WindowLen, int SlideDist, double *WindowShape=(double*)NULL); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); void Process(dspCmpx *Inp, dspCmpx *Out); int ProcessSilence(int Slides=1); int Process(dspCmpx_buff *Input); int Process(dspCmpx *Input); // int Process(dspCmpx_buff *Input); dspCmpx_buff Output; private: int Len; // Window length dspCmpx *Buff; // storage int Dist; // distance between slides double *Window; // window shape int ExternWindow; }; // ---------------------------------------------------------------------------- // FFT dspPhase corrector class dspFFT_TimeShift { public: dspFFT_TimeShift(); ~dspFFT_TimeShift(); void Free(void); int Preset(int FFTlen, int Backwards=0); int Process(dspCmpx *Data, int Time); private: int Len; // FFT length int LenMask; // length-1 for pointer wrapping dspCmpx *FreqTable; // sin/cos table int dspPhase; }; // ---------------------------------------------------------------------------- // bit synchronizer, the bit rate is the input rate divided by four class dspDiffBitSync4 { public: dspDiffBitSync4(int IntegBits);\ ~dspDiffBitSync4(); void Free(void); int Process(double *Inp, int InpLen, double *BitOut, double *IbitOut, int MaxOutLen, int *OutLen); double GetSyncDriftRate(); // get aver. sync. drift double GetSyncConfid(); private: // eg. 0.01 means 1 bit drift per 100 bits double *InpTap; int InpTapLen, InpTapPtr; // buffer tap, length and pointer int IntegLen; // integrate tdspIntming over that many bits double W1,W2,W5; // weights for the two-stage IIR lopass filter double DiffInteg0[4], DiffInteg[4]; // signal diff. integrators int DiffTapPtr; // integrator and bit-sdspAmpling pointer int BitPtr; double SyncdspPhase; // sync. pointer/dspPhase double SyncDrift0,SyncDrift; // low pass filter for the sync. drift rate double SyncConfid; }; // ---------------------------------------------------------------------------- // bit slicer, SNR/Tune meter class dspBitSlicer { public: dspBitSlicer(int IntegBits); ~dspBitSlicer(); int Process(double *Bits, double *IBits, int InpLen, double *OutBits); double GetSigToNoise(); double GetdspAmplAsym(); double GetTimeAsym(); private: int IntegLen,TapLen; double W1,W2,W5; double Sum0[2], Sum[2]; double SumSq0[2], SumSq[2]; double TimeAsym0, TimeAsym; double dspAmplAsym0, dspAmplAsym; double Noise[2]; double OptimThres; double *Tap; int TapPtr; double PrevBit, PrevIBit; }; // ---------------------------------------------------------------------------- // The decoder for the HDLC frames, // makes no AX.25 CRC check, only the length in bytes against MinLen and MaxLen // however it does not pass frames with non-complete bytes. class dspHDLCdecoder { public: dspHDLCdecoder(int minlen, int maxlen, int diff, int invert, int chan, int (*handler)(int, char *, int)); ~dspHDLCdecoder(); int Process(double *Inp, int InpLen); public: int AllFrameCount; int BadFrameCount; private: int MinLen,MaxLen; int RxDiff,RxInvert; int ChanId; int (*FrameHandler)(int ChanId, char *Frame, int Len); char *Buff; int Len,PrevLev; unsigned int ShiftReg; int BitCount,Count1s; }; // ---------------------------------------------------------------------------- // AX.25 CRC short unsigned int dspAX25CRC(char *Data, int Len); // ---------------------------------------------------------------------------- // check if the given number (an integer) is a dspPower of 2 template int dspPowerOf2(type I) { int c; if (I <= 0) return 0; for (c = 0; I != 0; I >>= 1) c += I & 1; return c == 1; } // ---------------------------------------------------------------------------- // radix-2 FFT class dsp_r2FFT { public: // size must a dspPower of 2: 2,4,8,16,32,64,128,256,... dsp_r2FFT(); ~dsp_r2FFT(); void Free(void); // preset tables for given processing size int Preset(int size); // scramble/unscramble input void Scramble(dspCmpx x[]); // apply input window // separate the result of a two real channels FFT void SeparTwoReals(dspCmpx Buff[], dspCmpx Out0[], dspCmpx Out1[]); // join spectra of two real channels void JoinTwoReals(dspCmpx Inp0[], dspCmpx Inp1[], dspCmpx Buff[]); // core process: the classic tripple loop of butterflies void CoreProc(dspCmpx x[]); // complex FFT process in place, includes unscrambling inline void ProcInPlace(dspCmpx x[]) { Scramble(x); CoreProc(x); } // define the FFT window and input/output scales (NULL => rectangular window) public: int Size; // FFT size int *BitRevIdx; // Bit-reverse indexing table for data (un)scrambling dspCmpx *Twiddle; // Twiddle factors (sine/cos values) private: // double *Window; // window shape (NULL => rectangular window // double WinInpScale, WinOutScale; // window scales on input/output private: // classic radix-2 butterflies inline void FFTbf(dspCmpx &x0, dspCmpx &x1, dspCmpx &W); // special 2-elem. FFT for the first pass inline void FFT2(dspCmpx &x0, dspCmpx &x1); // special 2-elem. FFT for the second pass inline void FFT4(dspCmpx &x0, dspCmpx &x1, dspCmpx &x2, dspCmpx &x3); }; // --------------------------------------------------------------------------- // Sliding window FFT for spectral analysis (e.g. SETI) // input: real-valued time-domain signal, // output: complex-valued Fourier Transform // // We use a little trick here to process two real-valued FFT // in one go using the complex FFT engine. // This cuts the CPU but makes the input->output dspDelay longer. class dspSlideWinFFT { public: dspSlideWinFFT(); ~dspSlideWinFFT(); void Free(); int Preset(int size, int step, double *window); int Preset(int size, int step, double (*NewWindow)(double dspPhase), double Scale=1.0); int SetWindow(double *window); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); int Process(double_buff *Input); dsp_r2FFT FFT; // FFT engine dspCmpx_buff Output; // output buffer int Size; int SizeMask; // FFT size, size mask for pointer wrapping int Dist; int Left; // distance between slides, samples left before the next slide int Slide; // even/odd slide private: double *SlideBuff; int SlidePtr; // sliding window buffer, pointer double *Window; int ExternWindow; // window shape dspCmpx *FFTbuff; // FFT buffer }; // --------------------------------------------------------------------------- // Overlapping window Inverse FFT to convert spectra into time-domain signal class dspOvlapWinIFFT { public: dspOvlapWinIFFT(); ~dspOvlapWinIFFT(); void Free(void); int Preset(int size, int step, double *window); int Preset(int size, int step, double (*NewWindow)(double dspPhase), double Scale=1.0); int SetWindow(double *window); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=1.0); int Process(dspCmpx *Input); dsp_r2FFT FFT; // FFT engine double_buff Output; // output buffer int Size; int SizeMask; // FFT size, size mask for pointer wrapping int Dist; // distance between slides int Slide; private: dspCmpx *Spectr[2]; dspCmpx *FFTbuff; // FFT buffer double *Window; int ExternWindow; // window shape double *OvlapBuff; int OvlapPtr; }; // --------------------------------------------------------------------------- // Sliding window FFT for spectral processing (e.g. de-noising) // input: real-valued signal // in the middle you are given a chance to process // the complex-valued Fourier Transform (SpectraProc() routine). // output: real-valued signal // If you don't touch the spectra in SpectralProc() // the output will be an exact copy (only dspDelayed) of the input. class dspSlideWinFFTproc { public: dspSlideWinFFTproc(); ~dspSlideWinFFTproc(); void Free(void); int Preset(int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double *window); int Preset(int size, int step, void (*proc)(dspCmpx *Spectra, int Len), double (*NewWindow)(double dspPhase), double Scale=0.0); int SetWindow(double *window); int SetWindow(double (*NewWindow)(double dspPhase), double Scale=0.0); int Process(double_buff *Input); dsp_r2FFT FFT; double_buff Output; int Size; int SizeMask; int Dist; int Left; int Slide; private: double *SlideBuff; int SlidePtr; double *Window; int ExternWindow; dspCmpx *FFTbuff; dspCmpx *Spectr[2]; void (*SpectraProc)(dspCmpx *Spectra, int Len); double *OvlapBuff; int OvlapPtr; }; // --------------------------------------------------------------------------- // Walsh (Hadamard ?) transform. void dspWalshTrans(double *Data, int Len); void dspWalshInvTrans(double *Data, int Len); // --------------------------------------------------------------------------- fldigi-4.2.05/src/include/cmedia.h0000664000175000017500000000234714611711171013576 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2020 // David Freese, W1HKJ // // This file is part of fldigi. // // flrig is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // flrig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef CMEDIA_H #define CMEDIA_H #include /* #ifdef __WIN32__ # include //# include "par_nt.h" # include # include #endif */ extern bool set_cmedia(int, int); extern int get_cmedia(); extern int open_cmedia(std::string); extern void close_cmedia(); extern void init_hids(); extern void test_hid_ptt(); #endif fldigi-4.2.05/src/include/mfsk.h0000664000175000017500000001416414611711171013314 00000000000000// ---------------------------------------------------------------------------- // mfsk.h -- mfsk modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _MFSK_H #define _MFSK_H #include #include #include #include #include "globals.h" #include "modem.h" #include "filters.h" #include "interleave.h" #include "viterbi.h" #include "complex.h" #include "mfskvaricode.h" #include "mbuffer.h" #include "picture.h" #define MFSKSampleRate 8000 // 1 ms per pixel #define SAMPLES_PER_PIXEL 8 #define MAX_SYMBOLS 32 #define PICHEADER 64 // NASA coefficients for viterbi encode/decode algorithms #define NASA_K 7 #define POLY1 0x6d #define POLY2 0x4f class mfsk; extern int print_time_left(float secs, char *str, size_t len, const char *prefix = "", const char *suffix = ""); extern void updateTxPic(unsigned char data); extern void updateRxPic(unsigned char data, int pos); extern void TxViewerResize(int W, int H); extern void showTxViewer(int W, int H); extern void createTxViewer(); extern void createRxViewer(); extern void showRxViewer(int W, int H); extern void deleteRxViewer(); extern void deleteTxViewer(); extern void cb_picRxClose( Fl_Widget *w, void *); extern void cb_picRxAbort( Fl_Widget *w, void *); extern void pic_TxSendColor(); extern void pic_TxSendGrey(); extern void cb_picTxSendColor( Fl_Widget *w, void *); extern void cb_picTxSendGrey( Fl_Widget *w, void *); extern void cb_picTxSendAbort( Fl_Widget *w, void *); extern void load_file(const char *n); extern Fl_Double_Window *picRxWin; extern picture *picRx; extern Fl_Button *btnpicRxSave; extern Fl_Button *btnpicRxAbort; extern Fl_Button *btnpicRxClose; extern Fl_Double_Window *picTxWin; extern picture *picTx; extern Fl_Button *btnpicTxSPP; extern Fl_Button *btnpicTxSendColor; extern Fl_Button *btnpicTxSendGrey; extern Fl_Button *btnpicTxSendAbort; extern Fl_Button *btnpicTxLoad; extern Fl_Button *btnpicTxClose; extern Fl_Shared_Image *TxImg; extern unsigned char *xmtimg; extern unsigned char *xmtpicbuff; struct rxpipe { cmplx vector[MAX_SYMBOLS]; //numtones <= 32 }; struct history { cmplx val; int symnbr; }; class mfsk : public modem { #define SCOPESIZE 64 friend void updateTxPic(unsigned char data); friend void cb_picRxClose( Fl_Widget *w, void *); friend void cb_picRxAbort( Fl_Widget *w, void *); friend void pic_TxSendColor(); friend void pic_TxSendGrey(); friend void cb_picTxSendColor( Fl_Widget *w, void *); friend void cb_picTxSendGrey( Fl_Widget *w, void *); friend void cb_picTxSendAbort( Fl_Widget *w, void *); friend void cb_picTxSPP( Fl_Widget *w, void *); friend int load_image(const char *n); public: enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_FLUSH, TX_STATE_FINISH, TX_STATE_TUNE, TX_STATE_PICTURE_START, TX_STATE_PICTURE }; enum { RX_STATE_DATA, RX_STATE_PICTURE_START, // RX_STATE_PICTURE_START_1, // RX_STATE_PICTURE_START_2, RX_STATE_PICTURE }; protected: // general double phaseacc; int symlen; int symbits; int numtones; int basetone; double tonespacing; double basefreq; int counter; int depth; // receive int rxstate; C_FIR_filter *hbfilt; sfft *binsfft; C_FIR_filter *bpfilt; C_FIR_filter *xmtfilt; Cmovavg *vidfilter[SCOPESIZE]; Cmovavg *syncfilter; viterbi *dec1; viterbi *dec2; interleave *rxinlv; rxpipe *pipe; unsigned int pipeptr; unsigned int datashreg; //VK2ETA high speed modes int preamble; cmplx currvector; cmplx prev1vector; cmplx prev2vector; int currsymbol; int prev1symbol; int prev2symbol; double maxval; double prevmaxval; double met1; double met2; mbuffer scopedata; double s2n; double sig; double noise; double afcmetric; bool staticburst; double currfreq; int synccounter; int AFC_COUNT; unsigned char symbolpair[2]; int symcounter; int RXspp; // samples per pixel int TXspp; int symbolbit; // transmit int txstate; encoder *enc; interleave *txinlv; unsigned int bitshreg; int bitstate; // Picutre data and methods int picturesize; char picheader[PICHEADER]; cmplx prevz; double picf; unsigned char prepost[128]; int row; int col; int rgb; int pixelnbr; int picW; int picH; bool color; unsigned char picprologue[176]; int xmtbytes; bool startpic; bool abortxmt; void recvpic(cmplx z); void recvchar(int c); void recvbit(int bit); // internal processes void decodesymbol(unsigned char symbol); void softdecode(cmplx *bins); cmplx mixer(cmplx in, double f); int harddecode(cmplx *in); void update_syncscope(); void synchronize(); void afc(); void reset_afc(); void eval_s2n(); void transmit(double *, int); void sendsymbol(int sym); void sendbit(int bit); void sendchar(unsigned char c); void sendidle(); void flush_xmt_filter(int); void send_prologue(); void send_epilogue(); void flushtx(int nbits); void clearbits(); void sendpic(unsigned char *data, int len); bool check_picture_header(char c); void s2nreport(void); public: mfsk (trx_mode md); ~mfsk (); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void send_color_image(std::string s); void send_Grey_image(std::string s); void shutdown(); }; #endif fldigi-4.2.05/src/include/nls.h0000664000175000017500000000241614532252172013150 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef NLS_H_ #define NLS_H_ #include "config.h" #include #include #include #if ENABLE_NLS && defined(__WOE32__) struct lang_def_t { const char* lang; const char* lang_region; const char* native_name; }; extern struct lang_def_t ui_langs[]; int get_ui_lang(const char* homedir = NULL); void set_ui_lang(int lang, const char* homedir = NULL); #endif #endif // NLS_H_ fldigi-4.2.05/src/include/dominovar.h0000664000175000017500000000201214532252172014342 00000000000000/* * varicode.h -- DominoEX Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #ifndef _DOMVARICODE_H #define _DOMVARICODE_H #define MAX_VARICODE_LEN 3 extern unsigned char *dominoex_varienc(unsigned char c, int secondary); extern int dominoex_varidec(unsigned int symbol); #endif fldigi-4.2.05/src/include/picture.h0000664000175000017500000000654614611711171014034 00000000000000// ---------------------------------------------------------------------------- // picture.h // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef picture_H #define picture_H #include #include #include class picture : public Fl_Widget { private: unsigned char *vidbuf; int bufsize; int width; int height; int numcol; int slantdir; void slant_corr(int x, int y); void slant_undo(); int zoom ; int background ; bool binary ; unsigned char binary_threshold ; inline unsigned char pix2bin( unsigned char x ) const { return x < binary_threshold ? 0 : 255 ; } static void draw_cb(void *data, int x, int y, int w, uchar *buf); void resize_zoom(int, int, int, int); void (*cbFunc)(Fl_Widget *, void *); public: picture(int, int, int, int, int bg_col = 0); ~picture(); void video(unsigned char const *, int); void pixel(unsigned char data, int pos) { if (pos < 0 || pos >= bufsize) { return ; } vidbuf[pos] = data; if (pos % (width * depth) == 0) redraw(); } unsigned char pixel(int); int handle(int); void draw(); void clear(); void image(Fl_Image *img) {Fl_Widget::image(img);} void resize(int, int, int, int); void resize_height(int new_height, bool clear_img); void shift_horizontal_center(int hShift); void stretch(double the_ratio); int save_png(const char * filename, bool monochrome = false, const char * extra_comments = NULL); void set_zoom(int the_zoom); void set_binary(bool bin_mode) { binary = bin_mode ;} int pix_width(void) const { return width ; } int pix_height(void) const { return height ; } const unsigned char * buffer(void) const { return vidbuf; } /// Sometimes the row number goes back of one due to rounding error. /// If this happens, noise removal does not work. static const int noise_height_margin = 5 ; void remove_noise( int row, int half_len, int noise_margin ); static const int depth = 3; void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } private: bool restore( int row, int margin ); bool slantcorr; public: void dilatation( int row ); void erosion( int row ); void set_binary_threshold(unsigned char thres) { binary_threshold = thres ; } unsigned char get_binary_threshold() const { return binary_threshold ; } void slant(int dir); void rotate(); void shift_center(int dir); void noslant() {slantcorr = false;} }; class picbox : public Fl_Box { public: picbox(int x, int y, int w, int h, const char* l = 0) : Fl_Box(x, y, w, h, l) { } int handle(int event); }; #endif fldigi-4.2.05/src/include/fldigi-config.h0000664000175000017500000000573514611711171015061 00000000000000// ---------------------------------------------------------------------------- // fldigi-config.h -- user configuration items for fldigi // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef FLDIGI_CONFIG_H #define FLDIGI_CONFIG_H //============================================================================= // You can change the x1 width of the waterfall / spectrum display by modifying this // constant. // Suggest that you make the value a multiple of 100. // DO NOT EXCEED 4000 // The larger the number the greater the cpu load will be for creating the // waterfall display // // Setting the DEFAULT_IMAGE_WIDTH to 3200 will size the x1 waterfall to be // 800 pixels wide. The x1 waterfall size is always DEFAULT_IMAGE_WIDTH / 4 // and the minimum width of main display would then be // // DEFAULT_IMAGE_WIDTH / 4 + 2 * BEZEL + 2 * DEFAULT_SW // // where BEZEL is set to 2 (border around the waterfall), and // DEFAULT_SW is the width of the signal level and squelch controls #define DEFAULT_IMAGE_WIDTH 3000 //============================================================================= // widget sizes internal to the waterfall widget #define BEZEL 2 #define WFTEXT 10 #define WFSCALE 10 #define WFMARKER 6 #define BTN_HEIGHT 20 #define DEFAULT_SW 16 //#define DEFAULT_HWFALL 144 #define DEFAULT_HWFALL 124 //#define DEFAULT_HNOM 500 #define WMIN 800 #define HMIN 460 //#define Wwfall (DEFAULT_HNOM + 2 * BEZEL) //#define DEFAULT_WNOM (Wwfall + 2* DEFAULT_SW) //#define EMC_HWFALL 144 //#define EMC_HNOM 500 //#define EMC_WNOM (500 + 2 * DEFAULT_SW + 2 * BEZEL) extern int IMAGE_WIDTH; extern int Hwfall; extern int HNOM; extern int WNOM; extern int Wwfall; extern int Haqsoframe; extern int Hmenu; extern int Hstatus; extern int Hmacros; //#define Htext (DEFAULT_HNOM - 4 - Hwfall - Hmenu - Hstatus - Hmacros - Hqsoframe) //#define Hrcvtxt (Htext) / 2 //#define Hxmttxt (Htext - (Hrcvtxt)) #define Wmode 110 #define Ws2n 110 #define Wimd 110 #define Wwarn 16 #define bwTxLevel 120 #define bwAfcOnOff 60 #define bwSqlOnOff 60 #define bwPwrSqlOnOff 60 #define Wstatus (WNOM - Wmode - Ws2n - Wimd - bwAfcOnOff - bwSqlOnOff - bwPwrSqlOnOff - Wwarn) #define SCOPEWIN_MIN_WIDTH 48 #define SCOPEWIN_MIN_HEIGHT 48 #endif // FLDIGI_CONFIG_H fldigi-4.2.05/src/include/ax25_decode.h0000664000175000017500000000435114532252172014436 00000000000000// --------------------------------------------------------------------- // ax25_decode.cxx -- AX25 Packet disassembler. // // This file is a proposed part of fldigi. Adapted very liberally from // rtty.cxx, with many thanks to John Hansen, W2FS, who wrote // 'dcc.doc' and 'dcc2.doc', GNU Octave, GNU Radio Companion, and finally // Bartek Kania (bk.gnarf.org) whose 'aprs.c' expository coding style helped // shape this implementation. // // Copyright (C) 2010, 2014 // Dave Freese, W1HKJ // Chris Sylvain, KB3CS // Robert Stiles, KK5VD // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #ifndef __ax25_decode__ #define __ax25_decode__ #include // 70 bytes addr + 256 payload + 2 FCS + 1 Control + 1 Protocol ID #define MAXOCTETS 340 // 136 bits minimum (including start and end flags) - AX.25 v2.2 section 3.9 // == 15 octets. we count only one of the two flags, though. #define MINOCTETS 14 enum PKT_MicE_field { Null = 0x00, Space = 0x20, Zero = 0x30, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, P0 = 0x40, P100, North = 0x50, East, South, West, Invalid = 0xFF }; struct PKT_PHG_table { const char *s; unsigned char l; }; //static void do_put_rx_char(unsigned char *cp); static void expand_MicE(unsigned char *cpI, unsigned char *cpE); static void expand_PHG(unsigned char *cpI); static void expand_Cmp(unsigned char *cpI); inline void put_rx_const(const char s[]); void ax25_decode(unsigned char *buffer, size_t count, bool pad, bool tx_flag); #endif /* defined(__ax25_decode__) */ fldigi-4.2.05/src/include/smeter.h0000664000175000017500000000455414532252172013660 00000000000000// // smeter.h // // Smeter bar widget routines. // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SMETER #define SMETER // // Include necessary headers. // #include #include // // Smeter class... // class Smeter : public Fl_Widget { private: double value_, minimum_, maximum_; int sval; // Size of sval bar... int bx, by, bw, bh; // Box areas... int tx, tw; // Temporary X + width int ty, th; // Temporary Y + height int sx; // meter left offset int meter_width; int meter_height; Fl_Color bgnd_; Fl_Color fgnd_; Fl_Color scale_color; static const char *meter_face; void (*cbFunc)(Fl_Widget *, void *); protected: virtual void draw(); public: Smeter(int x, int y, int w, int h, const char *l = 0); void maximum(double v) { maximum_ = v; redraw(); } double maximum() const { return (maximum_); } void minimum(double v) { minimum_ = v; redraw(); } double minimum() const { return (minimum_); } void value(double v) { value_ = v; if (value_ < minimum_) value_ = minimum_; if (value_ > maximum_) value_ = maximum_; redraw(); } double value() const { return (value_); } void resize(int x, int y, int w, int h); int handle(int); void set_background(Fl_Color c1) { bgnd_ = c1; redraw(); } void set_metercolor(Fl_Color c2) { fgnd_ = c2; redraw(); } void set_scalecolor(Fl_Color c3) { scale_color = c3; redraw(); } void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } }; #endif // !smeter fldigi-4.2.05/src/include/fd_view.h0000664000175000017500000000171614611711171013776 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef fd_view_h #define fd_view_h #include #include #include extern Fl_Output *view_FD_call; extern Fl_Output *view_FD_class; extern Fl_Output *view_FD_section; extern Fl_Output *view_FD_mult; extern Fl_Output *view_FD_score; extern Fl_Output *view_FD_CW[12]; extern Fl_Output *view_FD_CW_OP[12]; extern Fl_Output *view_FD_DIG[12]; extern Fl_Output *view_FD_DIG_OP[12]; extern Fl_Output *view_FD_PHONE[12]; extern Fl_Output *view_FD_PHONE_OP[12]; #include #include #include "flinput2.h" extern Fl_Input2 *inp_fd_tcpip_addr; extern Fl_Input2 *inp_fd_tcpip_port; extern Fl_Input2 *inp_fd_op_call; #include #include "confdialog.h" #include "fl_digi.h" #include "logsupport.h" extern Fl_Check_Button *btn_fd_connect; extern Fl_Box *box_fdserver_connected; Fl_Double_Window* make_fd_view(); #endif fldigi-4.2.05/src/include/stack.h0000664000175000017500000000306214532252172013457 00000000000000// Copyright 2007 Edd Dawson. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef STACK_HPP_0022_01092007 #define STACK_HPP_0022_01092007 #include #include #include #include namespace dbg { class stack_error : public std::exception { public: stack_error(const std::string &what); ~stack_error() throw(); const char *what() const throw(); private: std::string what_; }; class stack_frame { public: stack_frame(const void *instruction, const std::string &function); const void *instruction() const; const std::string &function() const; private: const void *instruction_; const std::string function_; }; std::ostream &operator<< (std::ostream &out, const stack_frame &frame); class stack { public: typedef std::list::size_type depth_type; typedef std::list::const_iterator const_iterator; stack(depth_type limit = 0); const_iterator begin() const; const_iterator end() const; depth_type depth() const; private: std::list frames_; }; } // close namespace dbg #endif // STACK_HPP_0022_01092007 fldigi-4.2.05/src/include/lgbook.h0000664000175000017500000001521114611711171013623 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef lgbook_h #define lgbook_h #include #include "flinput2.h" // Avoid 'nitems' macro collision between FreeBSD's sys/params.h and fltk's // FL/Fl_Check_Browser.H (http://www.fltk.org/str.php?L2984) #undef nitems #include #define FLTK_nitems nitems #undef nitems // ^^^ Avoid 'nitems' macro collision extern Fl_Check_Browser *chkExportBrowser; #include extern Fl_Double_Window *wExport; #include #include extern Fl_Check_Browser *chkExportBrowser; #include extern Fl_Button *btnClearAll; extern Fl_Button *btnCheckAll; #include "calendar.h" extern Fl_DateInput *inp_export_start_date; extern Fl_DateInput *inp_export_stop_date; #include extern Fl_Check_Button *btn_export_by_date; extern Fl_Check_Button *btnSelectCall; extern Fl_Check_Button *btnSelectName; extern Fl_Check_Button *btnSelectFreq; extern Fl_Check_Button *btnSelectBand; extern Fl_Check_Button *btnSelectMode; extern Fl_Check_Button *btnSelectQSOdateOn; extern Fl_Check_Button *btnSelectQSOdateOff; extern Fl_Check_Button *btnSelectTimeON; extern Fl_Check_Button *btnSelectTimeOFF; extern Fl_Check_Button *btnSelectTX_pwr; extern Fl_Check_Button *btnSelectRSTsent; extern Fl_Check_Button *btnSelectRSTrcvd; extern Fl_Check_Button *btnSelectQth; extern Fl_Check_Button *btnSelectLOC; extern Fl_Check_Button *btnSelectState; extern Fl_Check_Button *btnSelectAge; extern Fl_Check_Button *btnSelectStaCall; extern Fl_Check_Button *btnSelectStaCity; extern Fl_Check_Button *btnSelectStaGrid; extern Fl_Check_Button *btnSelectOperator; extern Fl_Check_Button *btnSelectProvince; extern Fl_Check_Button *btnSelectCountry; extern Fl_Check_Button *btnSelectNotes; extern Fl_Check_Button *btnSelectQSLrcvd; extern Fl_Check_Button *btnSelectQSLsent; extern Fl_Check_Button *btnSelecteQSLrcvd; extern Fl_Check_Button *btnSelecteQSLsent; extern Fl_Check_Button *btnSelectLOTWrcvd; extern Fl_Check_Button *btnSelectLOTWsent; extern Fl_Check_Button *btnSelectQSL_VIA; extern Fl_Check_Button *btnSelectSerialIN; extern Fl_Check_Button *btnSelectSerialOUT; extern Fl_Check_Button *btnSelectCheck; extern Fl_Check_Button *btnSelectXchgIn; extern Fl_Check_Button *btnSelectMyXchg; extern Fl_Check_Button *btnSelectCNTY; extern Fl_Check_Button *btnSelectCONT; extern Fl_Check_Button *btnSelectCQZ; extern Fl_Check_Button *btnSelectDXCC; extern Fl_Check_Button *btnSelectIOTA; extern Fl_Check_Button *btnSelectITUZ; extern Fl_Check_Button *btnSelectClass; extern Fl_Check_Button *btnSelectSection; extern Fl_Check_Button *btnSelect_cwss_serno; extern Fl_Check_Button *btnSelect_cwss_prec; extern Fl_Check_Button *btnSelect_cwss_check; extern Fl_Check_Button *btnSelect_cwss_section; extern Fl_Check_Button *btnSelect_1010; extern Fl_Button *btnClearAllFields; extern Fl_Button *btnCheckAllFields; extern Fl_Button *btnSetFieldDefaults; extern Fl_Button *btnSetLoTWfields; #include extern Fl_Return_Button *btnOK; extern Fl_Button *btnCancel; extern Fl_Double_Window *dlgLogbook; extern Fl_DateInput *inpDate_log; extern Fl_Input2 *inpTimeOn_log; extern Fl_Input2 *inpCall_log; extern Fl_Input2 *inpName_log; extern Fl_Input2 *inpRstR_log; extern Fl_Input2 *txtNbrRecs_log; extern Fl_DateInput *inpDateOff_log; extern Fl_Input2 *inpTimeOff_log; extern Fl_Input2 *inpFreq_log; extern Fl_Input2 *inpMode_log; extern Fl_Input2 *inpTX_pwr_log; extern Fl_Input2 *inpLoc_log; extern Fl_Input2 *inpRstS_log; extern Fl_Input2 *inpQth_log; extern Fl_Input2 *inpState_log; extern Fl_Input2 *inpVE_Prov_log; extern Fl_Input2 *inpCountry_log; extern Fl_Group *grpTabsSearch; #include extern Fl_Tabs *Tabs; extern Fl_Group *tab_log_qsl; extern Fl_DateInput *inpQSLrcvddate_log; extern Fl_DateInput *inpEQSLrcvddate_log; extern Fl_DateInput *inpLOTWrcvddate_log; extern Fl_DateInput *inpQSLsentdate_log; extern Fl_DateInput *inpEQSLsentdate_log; extern Fl_DateInput *inpLOTWsentdate_log; extern Fl_Input2 *inpQSL_VIA_log; extern Fl_Group *tab_log_other; extern Fl_Input2 *inpCNTY_log; extern Fl_Input2 *inpIOTA_log; extern Fl_Input2 *inpCQZ_log; extern Fl_Input2 *inpCONT_log; extern Fl_Input2 *inpITUZ_log; extern Fl_Input2 *inpDXCC_log; extern Fl_Group *tab_log_notes; extern Fl_Input2 *inpNotes_log; extern Fl_Group *tab_log_my_station; extern Fl_Input2 *inp_log_sta_call; extern Fl_Input2 *inp_log_op_call; extern Fl_Input2 *inp_log_sta_qth; extern Fl_Input2 *inp_log_sta_loc; extern Fl_Group *tab_log_contest; extern Fl_Input2 *inpSerNoOut_log; extern Fl_Input2 *inpMyXchg_log; extern Fl_Input2 *inpSerNoIn_log; extern Fl_Input2 *inpXchgIn_log; extern Fl_Input2 *inpClass_log; extern Fl_Input2 *inpSection_log; extern Fl_Input2 *inp_age_log; extern Fl_Input2 *inp_1010_log; extern Fl_Input2 *inpBand_log; extern Fl_Input2 *inp_check_log; extern Fl_Group *tab_log_cwss; extern Fl_Input2 *inp_log_cwss_serno; extern Fl_Input2 *inp_log_cwss_sec; extern Fl_Input2 *inp_log_cwss_prec; extern Fl_Input2 *inp_log_cwss_chk; extern Fl_Group *tab_log_jota; extern Fl_Input2 *inp_log_troop_s; extern Fl_Input2 *inp_log_troop_r; extern Fl_Input2 *inp_log_scout_s; extern Fl_Input2 *inp_log_scout_r; extern Fl_Group *grpCallSearch; extern Fl_Input2 *inpSearchString; extern void cb_search(Fl_Button*, void*); extern Fl_Button *bSearchPrev; extern Fl_Button *bSearchNext; extern void cb_btnRetrieve(Fl_Button*, void*); extern Fl_Button *bRetrieve; extern Fl_Group *grpFileButtons; extern void cb_btnNewSave(Fl_Button*, void*); extern Fl_Button *bNewSave; extern void cb_btnUpdateCancel(Fl_Button*, void*); extern Fl_Button *bUpdateCancel; extern void cb_btnDelete(Fl_Button*, void*); extern Fl_Button *bDelete; #include extern Fl_Output *txtLogFile; #include "table.h" extern Table *wBrowser; extern Fl_Double_Window *wCabrillo; extern Fl_Check_Browser *chkCabBrowser; extern Fl_Button *btnCabClearAll; extern Fl_Button *btnCabCheckAll; extern Fl_Return_Button *btnCabOK; extern Fl_Button *btnCabCancel; #include "combo.h" extern void setContestType(); extern Fl_ComboBox *cboContest; extern Fl_Check_Button *btnCabCall; extern Fl_Check_Button *btnCabFreq; extern Fl_Check_Button *btnCabMode; extern Fl_Check_Button *btnCabQSOdate; extern Fl_Check_Button *btnCabTimeOFF; extern Fl_Check_Button *btnCabRSTsent; extern Fl_Check_Button *btnCabRSTrcvd; extern Fl_Check_Button *btnCabSerialIN; extern Fl_Check_Button *btnCabSerialOUT; extern Fl_Check_Button *btnCabXchgIn; extern Fl_Check_Button *btnCabMyXchg; extern Fl_Check_Button *btnCabState; extern Fl_Check_Button *btnCabCounty; extern Fl_Button *btnCabClearAllFields; extern Fl_Button *btnCabCheckAllFields; void create_logbook_dialogs(); #endif fldigi-4.2.05/src/include/Fl_Text_Display_mod.H0000664000175000017500000004170414532252172016210 00000000000000// // "$Id: Fl_Text_Display_mod.H 8306 2011-01-24 17:04:22Z matt $" // // Header file for Fl_Text_Display_mod class. // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* \file Fl_Text_Display_mod widget . */ #ifndef Fl_Text_Display_mod_H #define Fl_Text_Display_mod_H #include #include #include #include #include #include "Fl_Text_Buffer_mod.H" /** \brief Rich text display widget. This is the FLTK text display widget. It allows the user to view multiple lines of text and supports highlighting and scrolling. The buffer that is displayed in the widget is managed by the Fl_Text_Buffer_mod class. A single Text Buffer can be displayed by multiple Text Displays. */ class FL_EXPORT Fl_Text_Display_mod: public Fl_Group { public: /** text display cursor shapes enumeration */ enum { NORMAL_CURSOR, /**< I-beam */ CARET_CURSOR, /**< caret under the text */ DIM_CURSOR, /**< dim I-beam */ BLOCK_CURSOR, /**< unfille box under the current character */ HEAVY_CURSOR /**< thick I-beam */ }; /** the character position is the left edge of a character, whereas the cursor is thought to be between the centers of two consecutive characters. */ enum { CURSOR_POS, CHARACTER_POS }; /** drag types - they match Fl::event_clicks() so that single clicking to start a collection selects by character, double clicking selects by word and triple clicking selects by line. */ enum { DRAG_NONE = -2, DRAG_START_DND = -1, DRAG_CHAR = 0, DRAG_WORD = 1, DRAG_LINE = 2 }; /** wrap types - used in wrap_mode() */ enum { WRAP_NONE, /**< don't wrap text at all */ WRAP_AT_COLUMN, /**< wrap text at the given text column */ WRAP_AT_PIXEL, /**< wrap text at a pixel position */ WRAP_AT_BOUNDS /**< wrap text so that it fits into the widget width */ }; friend void fl_text_drag_me(int pos, Fl_Text_Display_mod* d); typedef void (*Unfinished_Style_Cb)(int, void *); /** This structure associates the color, font, andsize of a string to draw with an attribute mask matching attr */ struct Style_Table_Entry { Fl_Color color; Fl_Font font; Fl_Fontsize size; unsigned attr; }; Fl_Text_Display_mod(int X, int Y, int W, int H, const char *l = 0); ~Fl_Text_Display_mod(); virtual int handle(int e); void buffer(Fl_Text_Buffer_mod* buf); /** Sets the current text buffer associated with the text widget. Multiple text widgets can be associated with the same text buffer. \param buf new text buffer */ void buffer(Fl_Text_Buffer_mod& buf) { buffer(&buf); } /** Gets the current text buffer associated with the text widget. Multiple text widgets can be associated with the same text buffer. \return current text buffer */ Fl_Text_Buffer_mod* buffer() const { return mBuffer; } void redisplay_range(int start, int end); void scroll(int topLineNum, int horizOffset); void insert(const char* text); void overstrike(const char* text); void insert_position(int newPos); /** Gets the position of the text insertion cursor for text display. \return insert position index into text buffer */ int insert_position() const { return mCursorPos; } int position_to_xy(int pos, int* x, int* y) const; int in_selection(int x, int y) const; void show_insert_position(); int move_right(); int move_left(); int move_up(); int move_down(); int count_lines(int start, int end, bool start_pos_is_line_start) const; int line_start(int pos) const; int line_end(int startPos, bool startPosIsLineStart) const; int skip_lines(int startPos, int nLines, bool startPosIsLineStart); int rewind_lines(int startPos, int nLines); void next_word(void); void previous_word(void); void show_cursor(int b = 1); /** Hides the text cursor. */ void hide_cursor() { show_cursor(0); } void cursor_style(int style); /** Gets the text cursor color. \return cursor color */ Fl_Color cursor_color() const {return mCursor_color;} /** Sets the text cursor color. \param n new cursor color */ void cursor_color(Fl_Color n) {mCursor_color = n;} /** Gets the width/height of the scrollbars. /return width of scrollbars */ int scrollbar_width() const { return scrollbar_width_; } /** Sets the width/height of the scrollbars. \param W width of scrollbars */ void scrollbar_width(int W) { scrollbar_width_ = W; } /** Gets the scrollbar alignment type. \return scrollbar alignment */ Fl_Align scrollbar_align() const { return scrollbar_align_; } /** Sets the scrollbar alignment type. \param a new scrollbar alignment */ void scrollbar_align(Fl_Align a) { scrollbar_align_ = a; } /** Moves the insert position to the beginning of the current word. \param pos start calculation at this index \return beginning of the words */ int word_start(int pos) const { return buffer()->word_start(pos); } /** Moves the insert position to the end of the current word. \param pos start calculation at this index \return index of first character after the end of the word */ int word_end(int pos) const { return buffer()->word_end(pos); } void highlight_data(Fl_Text_Buffer_mod *styleBuffer, const Style_Table_Entry *styleTable, int nStyles, char unfinishedStyle, Unfinished_Style_Cb unfinishedHighlightCB, void *cbArg); int position_style(int lineStartPos, int lineLen, int lineIndex) const; /** \todo FIXME : get set methods pointing on shortcut_ have no effects as shortcut_ is unused in this class and derived! \return the current shortcut key */ int shortcut() const {return shortcut_;} /** \todo FIXME : get set methods pointing on shortcut_ have no effects as shortcut_ is unused in this class and derived! \param s the new shortcut key */ void shortcut(int s) {shortcut_ = s;} /** Gets the default font used when drawing text in the widget. \return current text font face unless overridden by a style */ Fl_Font textfont() const {return textfont_;} /** Sets the default font used when drawing text in the widget. \param s default text font face */ void textfont(Fl_Font s) {textfont_ = s; mColumnScale = 0;} /** Gets the default size of text in the widget. \return current text height unless overridden by a style */ Fl_Fontsize textsize() const {return textsize_;} /** Sets the default size of text in the widget. \param s new text size */ void textsize(Fl_Fontsize s) {textsize_ = s; mColumnScale = 0;} /** Gets the default color of text in the widget. \return text color unless overridden by a style */ Fl_Color textcolor() const {return textcolor_;} /** Sets the default color of text in the widget. \param n new text color */ void textcolor(Fl_Color n) {textcolor_ = n;} int wrapped_column(int row, int column) const; int wrapped_row(int row) const; void wrap_mode(int wrap, int wrap_margin); virtual void resize(int X, int Y, int W, int H); /** Convert an x pixel position into a column number. \param x number of pixels from the left margin \return an approximate column number based on the main font */ double x_to_col(double x) const; /** Convert a column number into an x pixel position. \param col an approximate column number based on the main font \return number of pixels from the left margin to the left of an average sized character */ double col_to_x(double col) const; protected: // Most (all?) of this stuff should only be called from resize() or // draw(). // Anything with "vline" indicates thats it deals with currently // visible lines. virtual void draw(); void draw_text(int X, int Y, int W, int H); void draw_range(int start, int end); void draw_cursor(int, int); void draw_string(int style, int x, int y, int toX, const char *string, int nChars) const; void draw_vline(int visLineNum, int leftClip, int rightClip, int leftCharIndex, int rightCharIndex); int find_x(const char *s, int len, int style, int x) const; enum { DRAW_LINE, FIND_INDEX, FIND_INDEX_FROM_ZERO, GET_WIDTH }; int handle_vline(int mode, int lineStart, int lineLen, int leftChar, int rightChar, int topClip, int bottomClip, int leftClip, int rightClip) const; void draw_line_numbers(bool clearAll); void clear_rect(int style, int x, int y, int width, int height) const; void display_insert(); void offset_line_starts(int newTopLineNum); void calc_line_starts(int startLine, int endLine); void update_line_starts(int pos, int charsInserted, int charsDeleted, int linesInserted, int linesDeleted, int *scrolled); void calc_last_char(); int position_to_line( int pos, int* lineNum ) const; double string_width(const char* string, int length, int style) const; static void scroll_timer_cb(void*); static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg); static void buffer_modified_cb(int pos, int nInserted, int nDeleted, int nRestyled, const char* deletedText, void* cbArg); static void h_scrollbar_cb(Fl_Scrollbar* w, Fl_Text_Display_mod* d); static void v_scrollbar_cb( Fl_Scrollbar* w, Fl_Text_Display_mod* d); void update_v_scrollbar(); void update_h_scrollbar(); int measure_vline(int visLineNum) const; int longest_vline() const; int empty_vlines() const; int vline_length(int visLineNum) const; int xy_to_position(int x, int y, int PosType = CHARACTER_POS) const; void xy_to_rowcol(int x, int y, int* row, int* column, int PosType = CHARACTER_POS) const; void maintain_absolute_top_line_number(int state); int get_absolute_top_line_number() const; void absolute_top_line_number(int oldFirstChar); int maintaining_absolute_top_line_number() const; void reset_absolute_top_line_number(); int position_to_linecol(int pos, int* lineNum, int* column) const; int scroll_(int topLineNum, int horizOffset); void extend_range_for_styles(int* start, int* end); void find_wrap_range(const char *deletedText, int pos, int nInserted, int nDeleted, int *modRangeStart, int *modRangeEnd, int *linesInserted, int *linesDeleted); void measure_deleted_lines(int pos, int nDeleted); void wrapped_line_counter(Fl_Text_Buffer_mod *buf, int startPos, int maxPos, int maxLines, bool startPosIsLineStart, int styleBufOffset, int *retPos, int *retLines, int *retLineStart, int *retLineEnd, bool countLastLineMissingNewLine = true) const; void find_line_end(int pos, bool start_pos_is_text_start, int *lineEnd, int *nextLineStart) const; double measure_proportional_character(const char *s, int colNum, int pos) const; int wrap_uses_character(int lineEndPos) const; static const int DEFAULT_TOP_MARGIN; static const int DEFAULT_BOTTOM_MARGIN; static const int DEFAULT_LEFT_MARGIN; static const int DEFAULT_RIGHT_MARGIN; int TOP_MARGIN, BOTTOM_MARGIN, LEFT_MARGIN, RIGHT_MARGIN; int damage_range1_start, damage_range1_end; int damage_range2_start, damage_range2_end; int mCursorPos; int mCursorOn; int mCursorOldY; /* Y pos. of cursor for blanking */ int mCursorToHint; /* Tells the buffer modified callback where to move the cursor, to reduce the number of redraw calls */ int mCursorStyle; /* One of enum cursorStyles above */ int mCursorPreferredXPos; /* Pixel position for vert. cursor movement */ int mNVisibleLines; /* # of visible (displayed) lines */ int mNBufferLines; /* # of newlines in the buffer */ Fl_Text_Buffer_mod* mBuffer; /* Contains text to be displayed */ Fl_Text_Buffer_mod* mStyleBuffer; /* Optional parallel buffer containing color and font information */ int mFirstChar, mLastChar; /* Buffer positions of first and last displayed character (lastChar points either to a newline or one character beyond the end of the buffer) */ int mContinuousWrap; /* Wrap long lines when displaying */ int mFastDisplay; /* force continuous wrap and insertion of eol characters used in FTextRX */ std::string s_text; /* current contents of line text buffer */ std::string s_style; /* current contents of line stype buffer */ int mWrapMarginPix; /* Margin in # of pixels for wrapping in continuousWrap mode */ int* mLineStarts; int mTopLineNum; /* Line number of top displayed line of file (first line of file is 1) */ int mAbsTopLineNum; /* In continuous wrap mode, the line number of the top line if the text were not wrapped (note that this is only maintained as needed). */ int mNeedAbsTopLineNum; /* Externally settable flag to continue maintaining absTopLineNum even if it isn't needed for line # display */ int mHorizOffset; /* Horizontal scroll pos. in pixels */ int mTopLineNumHint; /* Line number of top displayed line of file (first line of file is 1) */ int mHorizOffsetHint; /* Horizontal scroll pos. in pixels */ int mNStyles; /* Number of entries in styleTable */ const Style_Table_Entry *mStyleTable; /* Table of fonts and colors for coloring/syntax-highlighting */ char mUnfinishedStyle; /* Style buffer entry which triggers on-the-fly reparsing of region */ Unfinished_Style_Cb mUnfinishedHighlightCB; /* Callback to parse "unfinished" */ /* regions */ void* mHighlightCBArg; /* Arg to unfinishedHighlightCB */ int mMaxsize; int mSuppressResync; /* Suppress resynchronization of line starts during buffer updates */ int mNLinesDeleted; /* Number of lines deleted during buffer modification (only used when resynchronization is suppressed) */ int mModifyingTabDistance; /* Whether tab distance is being modified */ mutable double mColumnScale; /* Width in pixels of an average character. This value is calculated as needed (lazy eval); it needs to be mutable so that it can be calculated within a method marked as "const" */ Fl_Color mCursor_color; Fl_Scrollbar* mHScrollBar; Fl_Scrollbar* mVScrollBar; int scrollbar_width_; Fl_Align scrollbar_align_; int dragPos, dragType, dragging; int display_insert_position_hint; struct { int x, y, w, h; } text_area; int shortcut_; Fl_Font textfont_; Fl_Fontsize textsize_; Fl_Color textcolor_; // The following are not presently used from the original NEdit code, // but are being put here so that future versions of Fl_Text_Display_mod // can implement line numbers without breaking binary compatibility. /* Line number margin and width */ int mLineNumLeft, mLineNumWidth; }; #endif // // End of "$Id: Fl_Text_Display_mod.H 8306 2011-01-24 17:04:22Z matt $". // fldigi-4.2.05/src/include/Nav.h0000664000175000017500000000430414611711171013073 00000000000000// ---------------------------------------------------------------------------- // Nav.cxx -- Interface to Arduino Nano Nav keyer // // Copyright (C) 2018 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _USNAVFSK_H #define _USNAVFSK_H #include #include #include #include #include #include #include #include #include #include "debug.h" #include "fl_digi.h" #include "confdialog.h" #include "status.h" #include "serial.h" #include "qrunner.h" #include "threads.h" #include "FTextRXTX.h" extern bool use_Nav; extern bool open_NavFSK(); extern void close_NavFSK(); extern bool open_NavConfig(); extern void close_NavConfig(); extern bool Nav_read_byte(Cserial &serial, unsigned char &byte); extern std::string Nav_read_string(Cserial &serial, int msec_wait, std::string find); extern void Nav_send_char(int c); extern void Nav_sendString (Cserial &serial, const std::string &s); extern void Nav_PTT(int val); extern void Nav_write_eeprom(); extern void Nav_restore_eeprom(); extern std::string Nav_serial_read(Cserial &serial); extern void Nav_set_channel_1_att(int); extern void Nav_set_channel_2_att(int); extern void Nav_set_rf_att(int); extern void Nav_set_led(int); extern void Nav_set_cat_led(int); extern void Nav_set_wk_ptt(int); extern void Nav_set_baud(int); extern void Nav_set_stopbits(int); extern void Nav_set_polarity(int); extern void Nav_set_sidetone(int); extern void Nav_set_ptt(int); #endif fldigi-4.2.05/src/include/date.h0000664000175000017500000000611514532252172013271 00000000000000/* -*-C++-*- "$Id: Fl_Date.H,v 1.4 2000/03/30 04:43:56 davefreese Exp $" Copyright 1999-2000 by the Dave Freese & the Flek development team. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. */ // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef DATE_H #define DATE_H #include typedef enum { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } weekday_t; typedef enum { JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER } month_t; class Date { friend std::ostream &operator<<(std::ostream &, Date &); protected: int year; int month; int day; int fmt; static const int mdays[]; static const int jdays[][13]; static const char *month_name[]; void helpIncrement(); public: Date(); Date( int m, int d, int y ); void setDate( int, int, int ); // set the date void setDate( Date & ); void setFormat (int); void today(); // set date to the present day void Year( int ); int Year(); void Month( int ); int Month(); void Day( int ); int Day(); void previous_month (); void next_month (); void previous_year (); void next_year (); bool endOfMonth( int ); bool leapYear (int); bool leapYear () { return leapYear (year); } bool isleapyear (int year) { return leapYear (year); } bool isleapyear () { return isleapyear (year); } int daysinmonth (int, int); int daysinmonth () { return daysinmonth (month, isleapyear (year)); } bool isvalid (int, int, int); bool datevalid (int year, int mon, int day) { return isvalid (mon, day, year); } bool datevalid () { return isvalid (month, day, year); } int dayofyear (int, int, int); int dayofyear () { return dayofyear (year, month, day); } int dayofepoch (int, int, int); int dayofepoch () { return dayofepoch (year, month, day); } int dayofweek (int, int, int); int dayofweek () { return dayofweek (year, month, day); } char *szDate (int); char *szDate (); double dJulian (); bool operator==( const Date & ); bool operator!=( const Date & ); bool operator<( const Date & ); bool operator>( const Date & ); void operator=( const Date & ); const Date &operator+=( int); // add days, modify object Date &operator++(); // pre-increment operator Date operator++( int ); // post-increment operator }; #endif fldigi-4.2.05/src/include/configuration.h0000664000175000017500000077315114611711171015233 00000000000000// ---------------------------------------------------------------------------- // configuration.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CONFIGURATION_H #define _CONFIGURATION_H #include #include #include "rtty.h" #include "waterfall.h" #include "lookupcall.h" #include "psk_browser.h" #if defined(__linux__) # define DEFAULT_PTTDEV "/dev/ttyS0" # define DEFAULT_CWFSKPORT "/dev/ttyS1" # define DEFAULT_HAMRIGDEVICE "/dev/ttyS0" #elif defined(__FreeBSD__) # define DEFAULT_PTTDEV "/dev/ttyd0" # define DEFAULT_CWFSKPORT "/dev/ttyd1" # define DEFAULT_HAMRIGDEVICE "/dev/ttyd0" #elif defined(__NetBSD__) # define DEFAULT_PTTDEV "/dev/tty00" # define DEFAULT_CWFSKPORT "/dev/tty01" # define DEFAULT_HAMRIGDEVICE "/dev/tty00" #elif defined(__OpenBSD__) # define DEFAULT_PTTDEV "/dev/tty00" # define DEFAULT_CWFSKPORT "/dev/tty01" # define DEFAULT_HAMRIGDEVICE "/dev/tty00" #elif defined(__WOE32__) # define DEFAULT_PTTDEV "COM1" # define DEFAULT_CWFSKPORT "COM2" # define DEFAULT_HAMRIGDEVICE "COM1" #else // not sure # define DEFAULT_PTTDEV "/dev/ptt" # define DEFAULT_CWFSKPORT "/dev/fsk" # define DEFAULT_HAMRIGDEVICE "/dev/rig" #endif // Format: ELEM_(TYPE, VARIABLE-NAME, TAG-STRING, DOC-STRING, DEFAULT-VALUE) // Variables that are not saved to the xml file have empty TAG-STRINGs and DOC-STRINGs // // No preprocessor directives or C++ comments inside this macro! // Indent with spaces only. // The 'comments' field should not contain either '<' or '>' characters! #ifdef ELEM_ # error ELEM_ should not be defined at this point #endif #define CONFIG_LIST \ ELEM_(bool, confirmExit, "CONFIRMEXIT", \ "Ensure user wants to leave flgidi", \ true) \ ELEM_(bool, show_tx_timer, "SHOW_TX_TIMER", \ "Show tx timer on menu bar", \ true) \ ELEM_(int, tx_timeout, "TX_TIMEOUT", \ "TX deadman timeout in minutes", \ 5) \ ELEM_(bool, SaveConfig, "SAVECONFIG", \ "Save current configuration on exit", \ true) \ ELEM_(bool, noise, "NOISETEST", \ "Noise test on/off", \ false) \ ELEM_(double, s2n, "SIGNAL2NOISE", \ "Signal to Noise ratio for test", \ +20.0) \ ELEM_(bool, rsidWideSearch, "RSIDWIDESEARCH", \ "RSID detector searches the entire passband", \ false) \ ELEM_(int, rsid_squelch, "RSIDSQUELCH", \ "RSID detection opens squelch for nn seconds", \ 5) \ ELEM_(int, rsid_min_bw, "RSID_MIN_BW", \ "RSID minimum search bandwidth in Hertz", \ 200) \ ELEM_(bool, rsid, "RECEIVERSID", \ "Enable Reed Soloman ID decoding", \ false) \ ELEM_(RGBI, rsidRGBI, "RSIDCOLORS", \ "Color of RsID detection markers (RGBI)", \ {255, 255, 255, 255}) \ ELEM_(bool, TransmitRSid, "TRANSMITRSID", \ "Send RSID at beginning and end of transmission", \ false) \ ELEM_(bool, rsid_mark, "RSIDMARK", \ "Append marker (for the previous modem and frequency) to the RX text\n" \ "widget before changing to the new modem and/or frequency", \ true) \ ELEM_(bool, rsid_notify_only, "RSIDNOTIFYONLY", \ "Trigger RSID notifications but do not change modem and frequency", \ false) \ ELEM_(bool, rsid_eot_squelch, "RSIDEOTSQUELCH", \ "restore squelch upon decode of RSID_EOT signal", \ false) \ ELEM_(bool, rsid_auto_disable, "RSIDAUTODISABLE", \ "Disable RSID detection when RsID signal is detected", \ false) \ ELEM_(bool, rsid_post, "RSIDPOST", \ "Transmit an RSID signal when modem data is concluded", \ false) \ ELEM_(mode_set_t, rsid_rx_modes, "RSIDRXMODESEXCLUDE", \ "Mode names for which RSID reception is disabled", \ mode_set_t()) \ ELEM_(mode_set_t, rsid_tx_modes, "RSIDTXMODESEXCLUDE", \ "Mode names for which RSID transmission is disabled", \ mode_set_t()) \ ELEM_(int, RsID_label_type, "RSID_ERRORS", \ "values (low, medium, high) 0, 1, 2", \ 1) \ ELEM_(bool, disable_rsid_warning_dialog_box, "DISABLE_RSID_WARNING_DIALOG_BOX", \ "disable displaying the rsid warning dialog box", \ false) \ ELEM_(bool, slowcpu, "SLOWCPU", \ "Disable expensive processing in some decoders", \ true) \ ELEM_(bool, disable_rsid_freq_change, "DISABLERSIDFREQCHANGE", \ "disable changing frequency on rsid modem change/reset", \ false) \ ELEM_(bool, retain_freq_lock, "RETAINFREQLOCK", \ "retain frequency lock on rsid modem change/reset", \ true) \ ELEM_(bool, changed, "", "", false) \ \ ELEM_(double, normal_signal_level, "normal_signal_level", \ "Input signal level transition (dB); -90 to 0", \ -60.0) \ ELEM_(double, high_signal_level, "high_signal_level", \ "Input signal level transition (dB); -90 to 0", \ -6.0) \ ELEM_(double, over_signal_level, "over_signal_level", \ "Input signal level transition (dB); -90 to 0", \ -3.0) \ ELEM_(bool, use_wsjtx_vumeter_scale, "use_wsjtx_vumeter_scale", \ "Enable if WSJTX metering desired", \ false) \ \ ELEM_(double, wfRefLevel, "WFREFLEVEL", \ "Waterfall reference level (dB)", \ 0.0) \ ELEM_(double, wfAmpSpan, "WFAMPSPAN", \ "Waterfall amplitude span (dB)", \ 60.0) \ ELEM_(bool, WF_UIrev, "WF_UIREV", \ "WF_UI - enable reverse button", \ true) \ ELEM_(bool, WF_UIx1, "WF_UIX1", \ "WF_UI - enable scale multiplication button", \ true) \ ELEM_(int, drop_speed, "DROP_SPEED", \ "DROP_SPEED - slow rate waterfall drop speed", \ 8) \ ELEM_(bool, WF_UIwfcarrier, "WF_UIWFCARRIER", \ "WF_UI - enable wf carrier button", \ true) \ ELEM_(bool, WF_UIwfshift, "WF_UIWFSHIFT", \ "WF_UI - enable wf shift buttons", \ true) \ ELEM_(bool, WF_UIwfreflevel, "WF_UIWFREFLEVEL", \ "WF_UI - enable rf level and range controls", \ true) \ ELEM_(bool, WF_UIwfdrop, "WF_UIWFDROP", \ "WF_UI - enable wf drop rate control", \ true) \ ELEM_(bool, WF_UIwfampspan, "WF_UIWFAMPSPAN", \ "WF_UI - enable wf amp span control", \ true) \ ELEM_(bool, WF_UIwfstore, "WF_UIWFSTORE", \ "WF_UI - enable wf memory store button", \ true) \ ELEM_(bool, WF_UIwfmode, "WF_UIWFMODE", \ "WF_UI - enable wf mode control", \ true) \ ELEM_(bool, WF_UIqsy, "WF_UIQSY", \ "WF_UI - enable wf qsy button", \ true) \ ELEM_(bool, WF_UIxmtlock, "WF_UIXMTLOCK", \ "WF_UI - enable wf transmit lock button", \ true) \ ELEM_(int, LowFreqCutoff, "LOWFREQCUTOFF", \ "Lowest frequency shown on waterfall (Hz)", \ 0) \ ELEM_(int, HighFreqCutoff, "HIGHFREQCUTOFF", \ "Highest frequency shown on waterfall (Hz)", \ 3000) \ ELEM_(double, CWsweetspot, "CWSWEETSPOT", \ "Default CW tracking point (Hz)", \ 1500) \ ELEM_(double, RTTYsweetspot, "RTTYSWEETSPOT", \ "Default RTTY tracking point (Hz)", \ 1500) \ ELEM_(double, PSKsweetspot, "PSKSWEETSPOT", \ "Default tracking point for all other modems (Hz)", \ 1500) \ ELEM_(bool, StartAtSweetSpot, "STARTATSWEETSPOT", \ "Always start new modems at sweet spot frequencies", \ true) \ ELEM_(bool, CWOffset, "CWOFFSET", \ "Select if waterfall should compensate for BFO offset in CW", \ false) \ ELEM_(bool, CWIsLSB, "CWISLSB", \ "Select if BFO is injected as LSB instead of USB", \ false) \ ELEM_(bool, CW_backslash, "CW_blackslash", \ "encode/decode backslash character", \ true) \ ELEM_(bool, CW_apostrophe, "CW_apostrophe", \ "encode/decode apostrophe character", \ true) \ ELEM_(bool, CW_quote, "CW_quote", \ "encode/decode quote character", \ true) \ ELEM_(bool, CW_dollar_sign, "CW_dollar_sign", \ "encode/decode dollar_sign character", \ true) \ ELEM_(bool, CW_open_paren, "CW_open_paren", \ "encode/decode open_paren character", \ true) \ ELEM_(bool, CW_close_paren, "CW_close_paren", \ "encode/decode close_paren character", \ true) \ ELEM_(bool, CW_colon, "CW_colon", \ "encode/decode colon character", \ true) \ ELEM_(bool, CW_semi_colon, "CW_semi_colon", \ "encode/decode semi_colon character", \ true) \ ELEM_(bool, CW_underscore, "CW_underscore", \ "encode/decode underscore character", \ true) \ ELEM_(bool, CW_at_symbol, "CW_at_symbol", \ "encode/decode at_symbol character", \ true) \ ELEM_(bool, CW_exclamation, "CW_exclamation", \ "encode/decode exclamation character", \ true) \ ELEM_(int, CW_noise, "CW_noise", \ "use CW_noise character to display invalid CW decodes", \ '*') \ ELEM_(std::string, CW_KEYLINE_serial_port_name, "CW_KEYLINE_SERIAL_PORT_NAME", \ "Independent serial port used for keying DTR or RTS as keyline", \ "") \ ELEM_(int, CW_KEYLINE, "CWKEYLINE", \ "0 - none, 1 - RTS, 2 - DTR", \ 0) \ ELEM_(bool, use_KNWDkeying, "USE_KYWDKEYING", \ "0 - false, 1 - true; Kenwood xcvrs", \ 0) \ ELEM_(bool, use_ELCTkeying, "USE_ELCTKEYING", \ "0 - false, 1 - true; Elecraft xcvrs", \ 0) \ ELEM_(bool, use_ICOMkeying, "USE_ICOMKEYING", \ "0 - false, 1 - true", \ 0) \ ELEM_(std::string, ICOMcivaddr, "ICOMcivaddr", \ "Icom transceiver CIV address", \ "") \ ELEM_(bool, use_YAESUkeying, "USE_YAESUKEYING", \ "0 - false, 1 - true", \ 0) \ ELEM_(int, CATkeying_compensation, "CATKEYINGCOMP", \ "compensate delays in CW CAT keying (msecs)", \ 0) \ ELEM_(bool, CATkeying_disable_ptt, "CATKEYING_disable_ptt", \ "disable CAT ptt for text string CW", \ 0) \ ELEM_(int, cwio_comp, "cwio_comp", \ "compensate delays in set/clr DTR/RTS serial line\n" \ "most likely required for Windows operating system\n" \ "compensation value in msec", \ 0) \ ELEM_(int, use_FLRIGkeying, "use_FLRIGkeying", \ "flrig DTR/RTS keying", \ 0) \ ELEM_(int, PTT_KEYLINE, "PTTKEYLINE", \ "0 - none, 1 - RTS, 2 - DTR", \ 0) \ ELEM_(bool, CW_KEYLINE_changed, "CW_KEYLINE_CHANGED", \ "serial keyline parameter changed", \ 0) \ ELEM_(bool, CW_KEYLINE_on_cat_port, "CW_KEYLINE_on_cat_port", \ "DTR/RTS keying shares RigCat serial port", \ false) \ ELEM_(bool, CW_KEYLINE_on_ptt_port, "CW_KEYLINE_on_ptt_port", \ "DTR/RTS keying shares ptt serial port\n" \ "Note: ptt on DTR, keying on RTS or\n" \ " ptt on RTS, keying on DTR", \ false) \ ELEM_(double, CWkeycomp, "CWkeycomp", \ "Dot to Space ratio compensate for transceiver keying delays\n" \ "in millisecond. (-) decrease dot, (+) increase dot\n" \ "limited to 1/2 default dot / space interval", \ 0.0) \ ELEM_(bool, WaterfallHistoryDefault, "WATERFALLHISTORYDEFAULT", \ "Replay audio history when changing frequency by clicking on\n" \ "the waterfall", \ false) \ ELEM_(bool, WaterfallQSY, "WATERFALLQSY", \ "Change rig frequency by dragging the mouse cursor on the waterfall\n" \ "frequency scale area", \ false) \ ELEM_(bool, WaterfallClickInsert, "WATERFALLCLICKINSERT", \ "Insert text to the RX text widget when changing frequency by left\n" \ "clicking on the waterfall", \ false) \ ELEM_(std::string, WaterfallClickText, "WATERFALLCLICKTEXT", \ "Waterfall left click text for WATERFALLCLICKINSERT", \ "\n\n") \ ELEM_(int, WaterfallWheelAction, "WATERFALLWHEELACTION", \ "Describes how waterfall mouse wheel events are handled\n" \ " 0: do nothing; 1: change AFC width or decoder bandwidth;\n" \ " 2: signal search; 3: change squelch level; 4: change modem carrier;\n" \ " 5: change modem; 6: scroll visible area. The default is 4.", \ waterfall::WF_CARRIER) \ ELEM_(bool, rx_lowercase, "RX_LOWERCASE", \ "Print Rx in lowercase for CW, RTTY, CONTESTIA and THROB", \ false) \ ELEM_(bool, tx_lowercase, "TX_LOWERCASE", \ "Transmit all text in lowercase", \ false) \ /* PSK, filter can be 0, 1, 2 */ \ ELEM_(int, PSK_filter, "PSKFILTER", \ "0 - PskCore filter\n" \ "1 - Raised cosine / sinc filter\n" \ "2 - G3PLX (gmfsk) filter", \ 0) \ ELEM_(bool, pskbrowser_on, "PSKBROWSER_ON", \ "Enable psk multi-channel detector - disable for very slow cpus", \ true) \ /* PSK / PSKmail interface */ \ ELEM_(int, SearchRange, "PSKSEARCHRANGE", \ "PSK signal acquisition search range (Hz)", \ 50) \ ELEM_(bool, pskpilot, "PSKPILOT", \ "Vestigial pilot tone on = 1, off = 0", \ false) \ ELEM_(double, pilot_power, "PILOT_POWER", \ "Pilot tone relative power level", \ -30.0) \ ELEM_(double, ACQsn, "ACQSN", \ "PSK signal acquisition S/N (dB)", \ 9.0) \ ELEM_(bool, Pskmails2nreport, "PSKMAILS2NREPORT", \ "Send s2n report to pskmail client/server", \ false) \ ELEM_(bool, StatusDim, "STATUSDIM", \ "Behaviour of status (S/N and IMD) fields:\n" \ " 0: Clear after timeout\n" \ " 1: Dim after timeout\n", \ true) \ ELEM_(double, StatusTimeout, "STATUSTIMEOUT", \ "Dim or Clear timeout (seconds)", \ 15.0) \ ELEM_(bool, PSKmailSweetSpot, "PSKMAILSWEETSPOT", \ "Reset to carrier when no signal is present", \ false) \ ELEM_(int, ServerOffset, "PSKSERVEROFFSET", \ "Listen for signals within this range (Hz)", \ 50) \ ELEM_(int, ServerCarrier, "PSKSERVERCARRIER", \ "Default PSKMail listen / transmit frequency", \ 1500) \ ELEM_(int, ServerAFCrange, "PSKSERVERAFCRANGE", \ "Limit AFC movement to this range (Hz)", \ 25) \ ELEM_(double, ServerACQsn, "PSKSERVERACGSN", \ "Acquisition S/N (dB)", \ 9.0) \ /* DIGI SCOPE */ \ ELEM_(Fl_Color, digi_background, "digi_background", \ "Color for digi_scope background", \ FL_BLACK) \ ELEM_(Fl_Color, digi_axis_color, "digi_axis_color", \ "Color for digi_scope axis", \ FL_WHITE) \ ELEM_(Fl_Color, digi_color_1, "digi_color_1", \ "Color for digi_scope color 1", \ FL_GREEN) \ ELEM_(Fl_Color, digi_color_2, "digi_color_2", \ "Color for digi_scope color 2", \ FL_YELLOW) \ ELEM_(Fl_Color, digi_color_3, "digi_color_3", \ "Color for digi_scope color 3", \ FL_CYAN) \ ELEM_(Fl_Color, digi_color_4, "digi_color_4", \ "Color for digi_scope color 4", \ FL_MAGENTA) \ /* RTTY */ \ ELEM_(int, kahn_demod, "KAHNDEMOD", \ "1 - use Kahn power demodulator\n" \ "0 - use ATC (Kok Chen) demodulator", \ 1) \ ELEM_(bool, true_scope, "TRUESCOPE", \ "Enabled - XY scope displays Mark/Space channel signals\n" \ "Disabled - XY scope displays pseudo M/S signals", \ true) \ ELEM_(int, rtty_shift, "RTTYSHIFT", \ "Carrier shift (Hz). Values are as follows:\n" \ " 0: 23; 1: 85; 2: 160; 3: 170; 4: 182; 5: 200; 6: 240; 7: 350;\n" \ " 8: 425; 9: 850; -1: custom", \ 3) /* 170 */ \ ELEM_(int, rtty_custom_shift, "RTTYCUSTOMSHIFT", \ "Custom shift (Hz)", \ 450) \ ELEM_(double, RTTY_BW, "RTTYBW", \ "Receive filter bandwidth (Hz)", \ 68.0) \ ELEM_(int, rtty_cwi, "RTTYCWI", \ "Selective decoding of mark/space tones\n" \ "0 - both\n" \ "1 - mark only\n" \ "2 - space only", \ 0) \ ELEM_(double, rtty_filter, "RTTYFILTER", \ "Rtty Rx Filter shape factor, K * (t/T)\n" \ "You may alter this value using a text editor\n" \ "change will be effective when restarting fldigi\n" \ "K = 1.25; best for W1HKJ (default)\n" \ "K = 1.5 - best for DO2SMF", \ 1.25) \ ELEM_(int, rtty_baud, "RTTYBAUD", \ "Carrier baud rate. Values are as follows:\n" \ " 1: 45; 1: 45.45; 2: 50; 3: 56; 4: 75; 5: 100; 6: 110; 7: 150; \n" \ " 8: 200; 9: 300", \ 0) /* 45 */ \ ELEM_(int, rtty_bits, "RTTYBITS", \ "Bits per character. Values are as follows:\n" \ " 0: 5 (baudot); 1: 7 (ascii); 2: 8 (ascii)", \ 0) /* 5 */ \ ELEM_(int, rtty_parity, "RTTYPARITY", \ "Parity. Values are as folows:\n" \ " 0: none; 1: even; 2: odd: 3: zero; 4: one", \ rtty::RTTY_PARITY_NONE) \ ELEM_(int, rtty_stop, "RTTYSTOP", \ "Stop bits. Values are as folows:\n" \ " 0: 1; 1: 1.5; 2: 2", \ 1) /* 1.5 */ \ ELEM_(bool, rtty_reverse, "RTTYREVERSE", \ "This setting is currently unused", \ false) \ ELEM_(bool, rtty_msbfirst, "RTTYMSBFIRST", \ "This setting is currently unused", \ false) \ ELEM_(bool, rtty_crcrlf, "RTTYCRCLF", \ "Use \"CR CR LF\" for \"CR LF\"", \ false) \ ELEM_(bool, rtty_autocrlf, "RTTYAUTOCRLF", \ "Automatically add CRLF after `page width' characters", \ true) \ ELEM_(int, rtty_autocount, "RTTYAUTOCOUNT", \ "Page width for RTTYAUTOCRLF", \ 72) \ ELEM_(int, rtty_afcspeed, "RTTYAFCSPEED", \ "AFC tracking speed. Values are as follows:\n" \ " 0: slow; 1: normal; 2: fast", \ 1) /* normal */ \ ELEM_(bool, PreferXhairScope, "PREFERXHAIRSCOPE", \ "Default to crosshair digiscope", \ false) \ ELEM_(bool, PseudoFSK, "PSEUDOFSK", \ "Generate Pseudo-FSK signal on right audio channel", \ false) \ /* FSK interface elements */ \ ELEM_(bool, useFSK, "USEFSK", \ "TRUE if DTR/RTS keying for RTTY", \ false) \ ELEM_(bool, fsk_shares_port, "FSK_SHARES_PORT", \ "FSK signal generator shares rigio serial port for DTR/RTS control", \ false) \ ELEM_(std::string, fsk_port, "FSK_PORT", \ "FSK serial port device name", \ "") \ ELEM_(bool, fsk_reverse, "FSK_REVERSE", \ "Reverse Mark/Space signaling", \ false) \ ELEM_(bool, fsk_on_dtr, "FSK_ON_DTR", \ "Use DTR signal line for FSK control", \ false) \ ELEM_(bool, fsk_shift_on_space, "FSK_SHIFT_ON_SPACE", \ "Always send shift char before space", \ false) \ ELEM_(bool, fsk_STOPBITS, "FSK_STOPBITS", \ "True - 1.5 stop bits; False - 2 stop bits", \ true) \ ELEM_(bool, use_FLRIG_FSK, "FLRIG_FSK", \ "True - enable; False - disable", \ false) \ ELEM_(double, flrig_poll, "FLRIG_POLL", \ "range 50 to 5000 msecs", \ 200) \ /* end of FSK elements */ \ ELEM_(bool, kml_enabled, "KMLSERVER_ENABLED", \ "Enable kml server threads", \ true) \ ELEM_(bool, SynopAdifDecoding, "SYNOPADIFDECODING", \ "Decoding of Synop weather information on RTTY to ADIF log", \ false) \ ELEM_(bool, SynopKmlDecoding, "SYNOPKMLDECODING", \ "Decoding of Synop weather information on RTTY to KML file", \ false) \ ELEM_(bool, SynopInterleaved, "SYNOPINTERLEAVED", \ "Decoding of Synop interleaved with coded text, or replaces it", \ false) \ ELEM_(bool, UOSrx, "UOSRX", \ "Revert to unshifted chars on a space (RX)", \ true) \ ELEM_(bool, UOStx, "UOSTX", \ "Revert to unshifted chars on a space (TX)", \ true) \ ELEM_(bool, useMARKfreq, "USEMARKFREQ", \ "Use MARK frequency for logging", \ true) \ ELEM_(bool, visibleBELL, "visibleBELL", \ "Show in Rx panel when \a decoded", \ true) \ ELEM_(bool, audibleBELL, "audibleBELL", \ "Ring TTY bell tone when \a decoded", \ true) \ /* CW */ \ ELEM_(double, CWspeed, "CWSPEED", \ "Transmit speed (WPM)", \ 18) \ ELEM_(double, CWfarnsworth, "CWFARNSWORTH", \ "Speed for Farnsworth timing (WPM)", \ 15) \ ELEM_(bool, CWusefarnsworth, "CWUSEFARNSWORTH", \ "Use Farnsworth timing", \ false) \ ELEM_(double, CWwordsworth, "CWWORDSWORTH", \ "Speed for wordsworth timing (WPM)", \ 15) \ ELEM_(bool, CWusewordsworth, "CWUSEWORDSWORTH", \ "Use Wordsworth timing", \ false) \ ELEM_(double, defCWspeed, "CWDEFSPEED", \ "Default speed (WPM)", \ 24) \ ELEM_(int, CWbandwidth, "CWBANDWIDTH", \ "Filter bandwidth (Hz)", \ 150) \ ELEM_(double, CWlower, "CWLOWER", \ "Detector hysterisis, lower threshold", \ 0.4) \ ELEM_(double, CWupper, "CWUPPER", \ "Detector hysterisis, upper threshold", \ 0.6) \ ELEM_(int, CWmfiltlen, "CWMFILTLEN", \ "Matched Filter length", \ 100) \ ELEM_(bool, CWtrack, "CWTRACK", \ "Automatic receive speed tracking", \ true) \ ELEM_(bool, CWmfilt, "CWMFILT", \ "Matched Filter in use", \ false) \ ELEM_(bool, CWuseSOMdecoding, "CWUSESOMDECODING", \ "Self Organizing Map decoding", \ false) \ ELEM_(int, CWrange, "CWRANGE", \ "Tracking range for CWTRACK (WPM)", \ 10) \ ELEM_(int, CWlowerlimit, "CWLOWERLIMIT", \ "Lower RX limit (WPM)", \ 5) \ ELEM_(int, CWupperlimit, "CWUPPERLIMIT", \ "Upper TX limit (WPM)", \ 50) \ ELEM_(int, cwrx_attack, "CWRX_ATTACK", \ "rx squelch attack timing\n" \ "SLOW = 0 (100)\nMEDIUM = 1 (50)\nFAST = 2 (25)", \ 1) \ ELEM_(int, cwrx_decay, "CWRX_DECAY", \ "rx squelch decay timing\n" \ "SLOW = 0 (1000)\nMEDIUM = 1 (500)\nFAST = 2 (250)", \ 1) \ ELEM_(double, CWdash2dot, "CWDASH2DOT", \ "Dash to dot ratio", \ 3.0) \ ELEM_(bool, QSK, "QSK", \ "Generate QSK signal on right audio channel", \ false) \ ELEM_(double, QSKfrequency, "QSKfrequency", \ "QSK square wave fundamental frequency", \ 2000) \ ELEM_(double, CWpre, "CWPRE", \ "Pre-keydown timing (milliseconds)", \ 4.0) \ ELEM_(double, QSKamp, "QSKAMP", \ "Right channel QSK signal amplitude", \ 0.8) \ ELEM_(double, CWpost, "CWPOST", \ "Post-keydown timing (milliseconds)", \ 4.0) \ ELEM_(bool, CWid, "CWID", \ "Send callsign in CW at the end of every transmission", \ false) \ ELEM_(int, CWIDwpm, "IDWPM", \ "CW ID speed (WPM)", \ 18) \ ELEM_(mode_set_t, cwid_modes, "CWIDMODESEXCLUDE", \ "Mode names for which CWID transmission is disabled", \ mode_set_t()) \ ELEM_(bool, QSKadjust, "QSKADJUST", \ "Send a continuous stream of test characters as the QSK signal", \ false) \ ELEM_(int, TestChar, "TESTCHAR", \ "Test character for QSKADJUST (ASCII value)", \ 0) \ ELEM_(int, QSKshape, "QSKSHAPE", \ "QSK edge shape. Values are as follows:\n" \ " 0: Hanning; 1: Blackman;" \ "Raised cosine = Hanning.", \ 0) /* Hanning */ \ ELEM_(double, QSKrisetime, "QSKrisetime", \ "Leading and trailing edge rise times (milliseconds)", \ 4.0) \ ELEM_(double, CWrisetime, "CWRISETIME", \ "Leading and trailing edge rise times (milliseconds)", \ 4.0) \ ELEM_(bool, CW_bpf_on, "CW_BPF_ON", \ "Enable filtering of transmit audio", \ false) \ ELEM_(double, CW_bpf, "CW_BPF", \ "Transmit filter hi cutoff frequency\n" \ "f0 +/- CW_bpf/2", \ 100.0) \ ELEM_(bool, CWnarrow, "CWNARROW", \ "Weight decreases with increasing edge timing", \ false) \ ELEM_(bool, CW_use_paren, "CWUSEPAREN", \ "Use open paren character; typically used in MARS ops", \ false) \ ELEM_(std::string, CW_prosigns, "CWPROSIGNS", \ "CW prosigns BT AA AS AR SK KN INT HM VE", \ "=~<>%+&{}") \ ELEM_(bool, CW_prosign_display, "CW_prosign_display", \ "Display decoded prosign as assigned short cut key", \ false) \ ELEM_(int, CW_cal_speed, "CWCALSPEED", \ "CW calibrate speed in WPM", \ 20) \ ELEM_(bool, A_umlaut, "A_umlaut", \ "Use Ä extended CW character", \ true) \ ELEM_(bool, A_aelig, "A_aelig", \ "Use Æ extended CW character", \ false) \ ELEM_(bool, A_ring, "A_ring", \ "Use Ä extended CW character", \ true) \ ELEM_(bool, C_cedilla, "C_cedilla", \ "Use Ç extended CW character", \ true) \ ELEM_(bool, E_grave, "E_grave", \ "Use È extended CW character", \ true) \ ELEM_(bool, E_acute, "E_acute", \ "Use É extended CW character", \ true) \ ELEM_(bool, O_acute, "O_acute", \ "Use Ó extended CW character", \ false) \ ELEM_(bool, O_umlaut, "O_umlaut", \ "Use Ö extended CW character", \ true) \ ELEM_(bool, O_slash, "O_slash", \ "Use Ø extended CW character", \ false) \ ELEM_(bool, N_tilde, "N_tilde", \ "Use Ñ extended CW character", \ true) \ ELEM_(bool, U_umlaut, "U_umlaut", \ "Use Ü extended CW character", \ true) \ ELEM_(bool, U_circ, "U_circ", \ "Use Û extended CW character", \ false) \ ELEM_(bool, WK_K3NGsketch, "WK_K3NGsketch", \ "Mortty loaded with K3NG WinKeyer emulator sketch", \ false) \ /* FELD HELL */ \ ELEM_(double, HELL_BW, "HELL_BW0", "Feld Hell working bandwidth", 245.0) \ ELEM_(double, HELL_BW_FH, "HELL_BW1", "FH bandwidth", 245.0) \ ELEM_(double, HELL_BW_SH, "HELL_BW2", "Slow Hell bandwidth", 30.0) \ ELEM_(double, HELL_BW_X5, "HELL_BW3", "X5 Hell bandwidth", 1225.) \ ELEM_(double, HELL_BW_X9, "HELL_BW4", "X9 Hell bandwidth", 2205.0) \ ELEM_(double, HELL_BW_FSKH245, "HELL_BW5", "FSKH-245 bandwidth", 250.0) \ ELEM_(double, HELL_BW_FSKH105, "HELL_BW6", "FSKH-105 Hell bandwidth", 120.0) \ ELEM_(double, HELL_BW_HELL80, "HELL_BW7", "HELL-80 bandwidth", 450.0) \ ELEM_(int, HellRcvWidth, "HELLRCVWIDTH", \ "Horizontal size multiplier for each hell character, 1, 2, or 3", \ 2) \ ELEM_(int, HellRcvHeight, "HELLRCVHEIGHT", \ "Vertical char size in pixels", \ 20) \ ELEM_(bool, HellBlackboard, "HELLBLACKBOARD", \ "Display RX in reverse video", \ false) \ ELEM_(bool, HellMarquee, "HELLMARQUEE", \ "Display RX as scrolling marquee", \ false) \ ELEM_(int, HellXmtWidth, "HELLXMTWIDTH", \ "Transmit width (number of multiple scans per character line)", \ 1) \ ELEM_(bool, HellXmtIdle, "HELLXMTIDLE", \ "Transmit periods (.) when idle", \ false) \ ELEM_(int, HellPulseFast, "HELLPULSEFAST", \ "Raised cosine pulse shape factor. Values are as follows:\n" \ " 0: slow (4 ms)\n" \ " 1: med (2 ms)\n" \ " 2: fast (1 ms)\n" \ " 3: Hard (off)", \ 1) /* slow */ \ ELEM_(int, hellagc, "HELLAGC", \ "1 - slow, 2 - medium, 3 - fast", \ 2) \ /* OLIVIA */ \ ELEM_(int, oliviatones, "OLIVIATONES", \ "Number of tones. Values are as follows:\n" \ " 0: 2; 1: 4; 2: 8; 3: 16; 4: 32; 5: 64; 6: 128; 7: 256", \ 2) /* 8 */ \ ELEM_(int, oliviabw, "OLIVIABW", \ "Bandwidth (Hz). Values are as follows:\n" \ " 0: 125; 1: 250; 2: 500; 3: 1000; 4: 2000.", \ 2) /* 500 */ \ ELEM_(int, oliviasmargin, "OLIVIASMARGIN", \ "Tune margin (tone frequency spacing)", \ 8) \ ELEM_(int, oliviasinteg, "OLIVIASINTEG", \ "Integration period (FEC blocks)", \ 4) \ ELEM_(bool, olivia_reset_fec, "OLIVIARESETFEC", \ "Force Integration (FEC) depth to be reset when new BW/Tones selected", \ false) \ ELEM_(bool, olivia8bit, "OLIVIA8BIT", \ "8-bit extended characters", \ true) \ ELEM_(bool, olivia_start_tones, "OLIVIASTARTTONES", \ "Send start/stop tones", \ true) \ /* CONTESTIA */ \ ELEM_(int, contestiatones, "CONTESTIATONES", \ "Number of tones. Values are as follows:\n" \ " 0: 2; 1: 4; 2: 8; 3: 16; 4: 32; 5: 64; 6: 128; 7: 256", \ 2) /* 8 */ \ ELEM_(int, contestiabw, "CONTESTIABW", \ "Bandwidth (Hz). Values are as follows:\n" \ " 0: 125; 1: 250; 2: 500; 3: 1000; 4: 2000.", \ 2) /* 500 */ \ ELEM_(int, contestiasmargin, "CONTESTIASMARGIN", \ "Tune margin (tone frequency spacing)", \ 8) \ ELEM_(int, contestiasinteg, "CONTESTIASINTEG", \ "Integration period (FEC blocks)", \ 4) \ ELEM_(bool, contestia8bit, "CONTESTIA8BIT", \ "8-bit extended characters", \ true) \ ELEM_(bool, contestia_reset_fec, "CONTESTIARESETFEC", \ "Force Integration (FEC) depth to be reset when new BW/Tones selected", \ false) \ ELEM_(bool, contestia_start_tones, "CONTESTIASTARTTONES", \ "Send start/stop tones", \ true) \ /* THOR */ \ ELEM_(double, THOR_BW, "THORBW", \ "Filter bandwidth factor (bandwidth relative to signal width)", \ 2.0) \ ELEM_(bool, THOR_FILTER, "THORFILTER", \ "Enable filtering before decoding", \ true) \ ELEM_(std::string, THORsecText, "THORSECTEXT", \ "Secondary text (sent during keyboard idle times)", \ "") \ ELEM_(int, THOR_PATHS, "THORPATHS", \ "This setting is currently unused", \ 5) \ ELEM_(double, ThorCWI, "THORCWI", \ "CWI threshold (CWI detection and suppression)", \ 0.0) \ ELEM_(bool, THOR_PREAMBLE, "THORPREAMBLE", \ "Detect THOR preamble (and flush Rx pipeline)", \ true) \ ELEM_(bool, THOR_SOFTSYMBOLS, "THORSOFTSYMBOLS", \ "Enable Soft-symbol decoding", \ true) \ ELEM_(bool, THOR_SOFTBITS, "THORSOFTBITS", \ "Enable Soft-bit decoding", \ true) \ ELEM_(bool, PKT_RXTimestamp, "PKTRXTIMESTAMP", \ "No timestamps on RX packets by default", \ false) \ ELEM_(bool, PKT_expandMicE, "PKTEXPANDMICE", \ "decode received Mic-E data", \ false) \ ELEM_(bool, PKT_expandPHG, "PKTEXPANDPHG", \ "decode received PHG data", \ false) \ ELEM_(bool, PKT_expandCmp, "PKTEXPANDCMP", \ "decode received Compressed Position data", \ false) \ ELEM_(bool, PKT_unitsSI, "PKTUNITSSI", \ "display decoded data in SI units", \ false) \ ELEM_(bool, PKT_unitsEnglish, "PKTUNITSENGLISH", \ "display decoded data in English units", \ false) \ ELEM_(std::string, thor_avatar_image_file, "THOR_AVATAR_IMAGE_FILE", \ "THOR avatar image to transmit", \ "") \ /* DOMINOEX */ \ ELEM_(double, DOMINOEX_BW, "DOMINOEXBW", \ "Filter bandwidth factor (bandwidth relative to signal width)", \ 2.0) \ ELEM_(std::string, secText, "SECONDARYTEXT", \ "Secondary text (sent during keyboard idle times)", \ "") \ ELEM_(bool, DOMINOEX_FILTER, "DOMINOEXFILTER", \ "Enable filtering before decoding", \ true) \ ELEM_(bool, DOMINOEX_FEC, "DOMINOEXFEC", \ "Enable MultiPSK-compatible FEC", \ false) \ ELEM_(int, DOMINOEX_PATHS, "DOMINOEXPATHS", \ "This setting is currently unused", \ 5) \ ELEM_(double, DomCWI, "DOMCWI", \ "CWI threshold (CWI detection and suppression)", \ 0.0) \ /* MT63 */ \ ELEM_(bool, mt63_8bit, "MT638BIT", \ "8-bit extended characters", \ true) \ ELEM_(bool, mt63_rx_integration, "MT63INTEGRATION", \ "Long receive integration", \ false) \ ELEM_(bool, mt63_twotones, "MT63TWOTONES", \ "Also transmit upper start tone (only if MT63USETONES is enabled)", \ true) \ ELEM_(bool, mt63_usetones, "MT63USETONES", \ "Transmit lower start tone", \ true) \ ELEM_(int, mt63_tone_duration, "MT63TONEDURATION", \ "Tone duration (seconds)", \ 4) \ ELEM_(bool, mt63_at500, "MT63AT500", \ "Always transmit lowest tone at 500 Hz", \ false) \ ELEM_(bool, mt63_centered, "MT63CENTERED", \ "Always transmit centered at 1500 Hz (SHARES requirement)", \ false) \ /* FSQ */ \ ELEM_(int, fsq_frequency, "FSQFREQUENCY", \ "0 - 1150 Hz, 1 - 1500 Hz, 2 - Variable", \ 1) \ ELEM_(int, fsq_movavg, "FSQMOVAVG", \ "size of moving average filter for bin filtering\n" \ "value 2 to 8", \ 4) \ ELEM_(double, fsq_img_filter, "FSQIMGFILTER", \ "0 - 300 Hz, 1 - 400 Hz, 2 - 500 Hz (default)", \ 2) \ ELEM_(double, fsqbaud, "FSQBAUD", \ "6, 4.5, 3 or 2 baud", \ 4.5) \ ELEM_(int, fsqhits, "FSQHITS", \ "3 / 6", \ 3) \ ELEM_(bool, fsq_directed, "FSQDIRECTED", \ "FSQCALL directed mode", \ false) \ ELEM_(bool, fsq_show_monitor, "FSQSHOWMONITOR", \ "Show fsq monitor text panel", \ false) \ ELEM_(bool, fsq_fastavg, "FSQFASTAVG", \ "Symbol averaging: true = fast, false = slow", \ true) \ ELEM_(std::string, fsqQTCtext, "FSQQTCTEXT", \ "QTC text string", \ "cq cq cq de nocall") \ ELEM_(int, fsq_heard_aging, "FSQHEARDAGING", \ "0 - NEVER (default)\n" \ "1 - 1 minute, 2 - 5 minutes, 3 - 10 minutes\n" \ "4 - 20 minutes, 5 - 30 minutes", \ 0) \ ELEM_(int, fsq_sounder, "FSQSOUNDER", \ "0 - OFF (default)\n" \ "1 - 1 minute, 2 - 10 minutes, 3 - 30 minutes", \ 0) \ ELEM_(bool, fsq_lowercase, "FSQLOWERCASE", \ "0 - NO, 1 - YES\n" \ "convert operator MYCALL to lower case for directed call triggers", \ 0) \ ELEM_(int, fsq_time_out, "FSQTIMEOUT", \ "Time out auto replies after XX seconds", \ 6) \ ELEM_(int, fsq_notify_time_out, "FSQNOTIFYTIMEOUT", \ "FSQ notifier dialog time out XX seconds\n" \ "00 == no time out", \ 10) \ ELEM_(bool, fsq_enable_heard_log, "FSQ_ENABLE_HEARD_LOG", \ "FSQ enable heard log file", \ 1) \ ELEM_(std::string, fsq_heard_log, "FSQ_HEARD_LOG", \ "FSQ heard log pathname", \ "fsq_heard_log.txt") \ ELEM_(bool, fsq_enable_audit_log, "FSQ_ENABLE_AUDIT_LOG", \ "FSQ enable audit log file", \ 1) \ ELEM_(std::string, fsq_audit_log, "FSQ_AUDIT_LOG", \ "FSQ audit log pathname", \ "fsq_audit_log.txt") \ ELEM_(Fl_Color, fsq_xmt_color, "FSQXMTCOLOR", \ "Color for FSQ xmt text", \ FL_RED) \ ELEM_(Fl_Color, fsq_directed_color, "FSQDIRECTEDCOLOR", \ "Color for FSQ directed text", \ FL_BLUE) \ ELEM_(Fl_Color, fsq_undirected_color, "FSQUNDIRECTEDCOLOR", \ "Color for FSQ undirected text", \ FL_DARK_GREEN) \ ELEM_(bool, add_fsq_msg_dt, "ADDFSQMSGDT", \ "Add date-time stamp to each # type received message", \ 1) \ ELEM_(bool, always_append, "ALWAYS_APPEND", \ "Enable to always append # directive messages to named file", \ 1) \ /* IFKP */ \ ELEM_(int, ifkp_baud, "IFKPBAUD", \ "1, 2, 3", \ 1) \ ELEM_(bool, ifkp_enable_heard_log, "IFKP_ENABLE_HEARD_LOG", \ "IFKP enable heard log file", \ 1) \ ELEM_(std::string, ifkp_heard_log, "IFKP_HEARD_LOG", \ "IFKP heard log pathname", \ "ifkp_heard_log.txt") \ ELEM_(bool, ifkp_enable_audit_log, "IFKP_ENABLE_AUDIT_LOG", \ "IFKP enable audit log file", \ 1) \ ELEM_(std::string, ifkp_audit_log, "IFKP_AUDIT_LOG", \ "IFKP audit log pathname", \ "ifkp_audit_log.txt") \ ELEM_(bool, ifkp_lowercase, "IFKPLOWERCASE", \ "0 - NO, 1 - YES\n" \ "convert operator MYCALL to lower case for all IFKP macros", \ 1) \ ELEM_(bool, ifkp_lowercase_call, "IFKPCALLLOWERCASE", \ "0 - NO, 1 - YES\n" \ "convert other CALLSIGN to lower case for all IFKP macros", \ 1) \ ELEM_(bool, ifkp_freqlock, "IFKPFREQLOCK", \ "0 - NO, 1 - YES\n" \ "Always t/r at 1500 Hz", \ 1) \ ELEM_(std::string, ifkp_avatar_image_file, "IFKP_AVATAR_IMAGE_FILE", \ "IFKP avatar image to transmit", \ "") \ /* Waterfall & UI */ \ ELEM_(uchar, red, "", "", 0) \ ELEM_(uchar, green, "", "", 255) \ ELEM_(uchar, blue, "", "", 255) \ ELEM_(bool, MultiColorWF, "", "", false) \ ELEM_(int, wfPreFilter, "WFPREFILTER", \ "Waterfal FFT prefilter window function. Values are as follows:\n" \ " 0: Rectangular; 1: Blackman; 2: Hamming; 3: Hanning; 4: Triangular", \ 1) /* Blackman */ \ ELEM_(bool, WFaveraging, "WFAVERAGING", \ "Use FFT averaging to decrease waterfall noise", \ true) \ ELEM_(int, wf_latency, "WF_LATENCY", \ "Waterfal latency, 1...16", \ 8) \ ELEM_(bool, UseCursorLines, "USECURSORLINES", \ "Draw cursor with vertical lines", \ true) \ ELEM_(bool, UseCursorCenterLine, "USECURSORCENTERLINE", \ "Draw cursor center line", \ true) \ ELEM_(bool, UseBWTracks, "USEBWTRACKS", \ "Draw bandwidth marker with vertical lines", \ true) \ ELEM_(bool, UseWideCursor, "USEWIDECURSOR", \ "Draw cursor with 3x vertical lines", \ false) \ ELEM_(bool, UseWideCenter, "USEWIDECENTER", \ "Draw center line marker with 3x vertical lines", \ false) \ ELEM_(bool, UseWideTracks, "USEWIDETRACKS", \ "Draw bandwidth marker with 3x vertical lines", \ false) \ ELEM_(RGBI, cursorLineRGBI, "CLCOLORS", \ "Color of cursor lines (RGBI)", \ {255, 255, 0, 255}) \ ELEM_(RGBI, cursorCenterRGBI, "CCCOLORS", \ "Color of cursor center line (RGBI)", \ {255, 255, 255, 255}) \ ELEM_(RGBI, bwTrackRGBI, "BWTCOLORS", \ "Color of bandwidth marker (RGBI)", \ {255, 0, 0, 255}) \ ELEM_(RGBI, notchRGBI, "NOTCHCOLORS", \ "Color of notch marker (RGBI)", \ {255, 255, 255, 255}) \ ELEM_(RGBI, rttymarkRGBI, "RTTYMARKRGBI", \ "Color of RTTY MARK freq marker (RGBI)", \ {255, 120, 0, 255}) \ ELEM_(RGBI, monitorRGBI, "MONITORRGBI", \ "Color of audio filter bandwidth (RGBI)", \ {0, 255, 0, 255}) \ ELEM_(bool, UseWideMonitor, "USEWIDEMONITOR", \ "Draw bandwidth lines with 3x vertical lines", \ false) \ ELEM_(int, feldfontnbr, "FELDFONTNBR", \ "Index of raster font used for transmission", \ 4) \ ELEM_(bool, viewXmtSignal, "VIEWXMTSIGNAL", \ "Show transmit signal on waterfall", \ true) \ ELEM_(bool, sendid, "SENDID", \ "Send video ID containing modem name", \ false) \ ELEM_(bool, macroid, "MACROID", \ "This setting is currently unused", \ false) \ ELEM_(bool, sendtextid, "SENDTEXTID", \ "Send video ID containing arbitrary text", \ false) \ ELEM_(std::string, strTextid, "STRTEXTID", \ "Video ID text for SENDTEXTID (keep short!)", \ "CQ") \ ELEM_(double, pretone, "PRETONE", \ "Single tone at center of modem BW, carrier detect for amplifiers", \ 0.0) \ ELEM_(bool, macroCWid, "", "", false) \ ELEM_(std::string, DTMFstr, "", "", "") \ ELEM_(bool, DTMFdecode, "DTMFDECODE", \ "Decode received DTMF tones", \ false) \ ELEM_(int, videowidth, "VIDEOWIDTH", \ "Video ID text width (characters per row)", \ 1) \ ELEM_(bool, vidlimit, "VIDLIMIT", \ "Limit video width to 500 Hz", \ true) \ ELEM_(bool, vidmodelimit, "VIDMODELIMIT", \ "Limit video width to mode bandwidth", \ true) \ ELEM_(bool, ID_SMALL, "IDSMALL", \ "Use small video ID font", \ true) \ ELEM_(mode_set_t, videoid_modes, "VIDEOIDMODESEXCLUDE", \ "Mode names for which Video ID transmission is disabled", \ mode_set_t()) \ ELEM_(bool, macrotextid, "", "", false) \ ELEM_(bool, docked_rig_control, "DOCKEDRIGCONTROL", \ "Docked rig control", \ true) \ ELEM_(int, wfheight, "WFHEIGHT", \ "Waterfall height (pixels)", \ 125) \ ELEM_(bool, tooltips, "TOOLTIPS", \ "Show tooltips", \ true) \ ELEM_(bool, NagMe, "NAGME", \ "Prompt to save log", \ true) \ ELEM_(bool, EnCloudlog, "ENCLOUDLOG", \ "Enable Cloudlog", \ false) \ ELEM_(std::string, cloudlog_api_url, "CLOUDLOG_API_URL", \ "Cloudlog API URL", \ "") \ ELEM_(std::string, cloudlog_api_key, "CLOUDLOG_API_KEY", \ "Cloudlog API Key", \ "") \ ELEM_(int, cloudlog_station_id, "CLOUDLOG_STATION_ID", \ "Cloudlog Station ID", \ 1) \ ELEM_(bool, ClearOnSave, "CLEARONSAVE", \ "Clear log fields on save", \ false) \ ELEM_(bool, sort_date_time_off, "SORTDATEOFF", \ "Sort log by date/time off", \ true) \ ELEM_(bool, force_date_time, "FORCEDATETIME", \ "Force date/time ON == OFF", \ false) \ ELEM_(bool, menuicons, "MENUICONS", \ "Show menu icons", \ true) \ ELEM_(mode_set_t, visible_modes, "VISIBLEMODES", \ "Modes that are not shown in the opmodes menu", \ mode_set_t()) \ ELEM_(bool, rxtext_clicks_qso_data, "RXTEXTCLICKS", \ "Double-click on RX text enters QSO data", \ true) \ ELEM_(bool, rxtext_tooltips, "RXTEXTTOOLTIPS", \ "Show callsign tooltips in received text", \ true) \ ELEM_(bool, autofill_qso_fields, "AUTOFILLQSO", \ "Auto-fill Country and Azimuth QSO fields", \ false) \ ELEM_(bool, calluppercase, "CALLUPPERCASE", \ "Convert callsign field to upper case", \ true) \ ELEM_(bool, RSTdefault, "RSTDEFAULT", \ "Default outgoing RST to 599/59", \ true) \ ELEM_(bool, RSTin_default, "RSTINDEFAULT", \ "Default incoming RST to 599/59", \ true) \ ELEM_(bool, autoextract, "AUTOEXTRACT", \ "Enable detection and extraction of \"wrapped\" text", \ true) \ ELEM_(bool, open_flmsg, "OPEN_FLMSG", \ "Open flmsg with the autoextract file", \ true) \ ELEM_(bool, flmsg_transfer_direct, "FLMSG_TRANSFER_DIRECT", \ "Transfer incoming flmsg autosend file to open flmsg application", \ true) \ ELEM_(bool, open_flmsg_print, "OPEN_FLMSG_PRINT", \ "Open flmsg with the autoextract file\nprint to browser\nclose flmsg", \ true) \ ELEM_(bool, open_nbems_folder, "OPEN_NBEMS_FOLDER", \ "Open NBEMS folder upon receipt of an autoextract file", \ false) \ ELEM_(std::string, flmsg_pathname, "FLMSG_PATHNAME", \ "Full pathname to the flmsg executable", \ "") \ ELEM_(std::string, BWSR_REGEX_MATCH, "BWSR_REGEX_MATCH", \ "audio alert audio clip name / file", \ "dinner_bell") \ ELEM_(int, REGEX_ALERT_MENU, "REGEX_ALERT_MENU", \ "menu selector", \ 8) \ ELEM_(bool, ENABLE_BWSR_REGEX_MATCH, "ENABLE_BWSR_REGEX_MATCH", \ "enable audio alert when regex match is detected in browser", \ false) \ ELEM_(std::string, BWSR_MYCALL_MATCH, "BWSR_MYCALL_MATCH", \ "audio alert audio clip name / file", \ "dinner_bell") \ ELEM_(int, MYCALL_ALERT_MENU, "MYCALL_ALERT_MENU", \ "menu selector", \ 8) \ ELEM_(bool, ENABLE_BWSR_MYCALL_MATCH, "ENABLE_BWSR_MYCALL_MATCH", \ "enable audio alert when MYCALL is detected in browser", \ false) \ ELEM_(double, extract_timeout, "EXTRACT_TIMEOUT", \ "Abort message extraction after nn.n seconds of inactivity", \ 2.0) \ ELEM_(std::string, RX_EXTRACT_MSG_RCVD, "RX_EXTRACT_MSG_RCVD", \ "audio alert audio clip name / file", \ "phone") \ ELEM_(int, RX_EXTRACT_ALERT_MENU, "RX_EXTRACT_ALERT_MENU", \ "menu selector", \ 7) \ ELEM_(bool, ENABLE_RX_EXTRACT_MSG_RCVD, "ENABLE_RX_EXTRACT_MSG_RCVD", \ "enable audio alert when flmsg received", \ false) \ ELEM_(std::string, RX_EXTRACT_TIMED_OUT, "RX_EXTRACT_TIMED_OUT", \ "audio alert audio clip name / file", \ "beeboo") \ ELEM_(int, TIMED_OUT_ALERT_MENU, "TIMED_OUT_ALERT_MENU", \ "menu selector", \ 6) \ ELEM_(bool, ENABLE_RX_EXTRACT_TIMED_OUT, "ENABLE_RX_EXTRACT_TIMED_OUT", \ "enable audio alert when flmsg reception times out", \ false) \ ELEM_(std::string, RSID_MATCH, "RSID_MATCH", \ "audio alert audio clip name / file", \ "phone") \ ELEM_(int, RSID_ALERT_MENU, "RSID_ALERT_MENU", \ "menu selector", \ 7) \ ELEM_(bool, ENABLE_RSID_MATCH, "ENABLE_RSID_MATCH", \ "enable audio alert when RsID is detected", \ false) \ ELEM_(std::string, BELL_RING, "BELL_RING", \ "RTTY bell ring audio clip name / file", \ "rtty_bell") \ ELEM_(int, BELL_RING_MENU, "BELL_RING_MENU", \ "menu selector", \ 9) \ ELEM_(int, alert_volume, "alert_volume", \ "Audio alert stream volume", \ 50) \ ELEM_(int, mon_xcvr_audio, "mon_xcvr_audio", \ "monitor transceiver audio on alert audio device", \ 0) \ ELEM_(int, mon_dsp_audio, "mon_dsp_audio", \ "monitor dsp filter output for selected modem @ waterfall frequency", \ 0) \ ELEM_(bool, mon_wf_display, "MON_WF_DISPLAY", \ "Display monitor filter", \ true) \ ELEM_(bool, mon_wide_tracks, "WIDEMONITORTRACKS", \ "Draw bandwidth lines with 3x vertical lines", \ false) \ ELEM_(int, mon_xmt_audio, "mon_xmt_audio", \ "monitor transmit audio on alert audio device", \ true) \ ELEM_(double, mon_tx_vol, "mon_tx_vol", \ "monitor transmit monitor volume level", \ 25.0) \ ELEM_(int, RxFilt_vol, "RxFilt_vol", \ "Audio stream volume", \ 50) \ ELEM_(int, rxgain_x10, "rxgain_x10", \ "Rx monitor audio gain boost", \ false) \ ELEM_(int, RxFilt_bw, "RxFilt_bw", \ "DSP audio stream filter bandwidth", \ 500) \ ELEM_(int, RxFilt_mid, "RxFilt_mid", \ "DSP audio stream filter mid frequency", \ 1500) \ ELEM_(int, RxFilt_low, "RxFilt_low", \ "DSP audio stream filter low frequency cutoff", \ 1250) \ ELEM_(int, RxFilt_high, "RxFilt_high", \ "DSP audio stream filter high frequency cutoff", \ 1750) \ ELEM_(int, RxFilt_track_wf, "RxFilt_track_wf", \ "Rx filter tracks waterfall cursor movement", \ 0) \ ELEM_(std::string, cty_dat_pathname, "CTYDAT_PATHNAME", \ "Full pathname to the cty.dat data file", \ "") \ ELEM_(bool, speak, "SPEAK", \ "Capture text to file 'talk/textout.txt'", \ false) \ ELEM_(bool, auto_talk, "AUTO_TALK", \ "Connect to Digitalk socket server during program initialization", \ false) \ /* QRZ */ \ ELEM_(int, QRZXML, "QRZXMLTYPE", \ "Callsign xml query type. Values are as follows:\n" \ " 0: none; 1: QRZ (paid sub.); 2: QRZ cdrom; 3: HamCall (paid sub.);\n" \ " 4: callook free US calls xml service; 5: hamQTH free xml service.\n" \ " The default is none.", \ QRZXMLNONE) \ ELEM_(std::string, hamcallurl, "HAMCALLURL", \ "web address of hamcall", \ "https://www.hamcall.net/") \ ELEM_(std::string, hamqthurl, "HAMQTHURL", \ "web address of hamqth", \ "https://www.hamqth.com/") \ ELEM_(std::string, qrzurl, "QRZURL", \ "web address of QRZ.com", \ "http://www.qrz.com/") \ ELEM_(std::string, callookurl, "CALLOOKURL", \ "web address of callook", \ "https://callook.info/") \ ELEM_(int, QRZWEB, "QRZWEBTYPE", \ "Callsign browser query type. Values are as follows:\n" \ " 0: none; 1: QRZ web browser; 2: HamCall web browser\n" \ " 3: hamQTH web browser.\n The default is none.", \ QRZWEBNONE) \ ELEM_(std::string, QRZpathname, "QRZPATHNAME", \ "QRZ cdrom path", \ "") \ ELEM_(std::string, QRZusername, "QRZUSER", \ "QRZ or HamCall subscriber username", \ "") \ ELEM_(std::string, QRZuserpassword, "QRZPASSWORD", \ "QRZ or HamCall subscriber password", \ "") \ ELEM_(bool, notes_address, "NOTES_ADDRESS", \ "Populate logbook notes (comment) field with mailing address", \ false) \ ELEM_(bool, clear_notes, "CLEAR_NOTES", \ "Clear notes control when making a new QRZ query", \ true) \ ELEM_(bool, QRZchanged, "", "", false) \ /* eQSL */ \ ELEM_(std::string, eqsl_www_url, "EQSL_url", \ "eQSL web site", \ "http://www.eqsl.cc/qslcard/importADIF.cfm?ADIFdata=") \ ELEM_(std::string, eqsl_id, "EQSL_ID", \ "eQSL login id", \ "") \ ELEM_(std::string, eqsl_pwd, "EQSL_PASSWORD", \ "eQSL login password", \ "") \ ELEM_(std::string, eqsl_nick, "EQSL_NICKNAME", \ "eQSL nickname", \ "") \ ELEM_(std::string, eqsl_default_message, "EQSL_DEF_MSG", \ "eQSl default message", \ "") \ ELEM_(bool, eqsl_when_logged, "EQSL_WHEN_LOGGED", \ "Send eQSL when other log action invoked", \ false) \ ELEM_(bool, eqsl_datetime_off, "EQSL_DATETIME_OFF", \ "Send logbook date/time off vice date on (default)", \ false) \ ELEM_(bool, eqsl_show_delivery, "EQSL_SHOW_DELIVERY", \ "Show timed delivery message for successful eQSL upload", \ true) \ /* tqsl automatic log submission */ \ ELEM_(bool, submit_lotw, "SUBMIT_LOTW", \ "Send adif record to LoTW", \ false) \ ELEM_(bool, lotw_quiet_mode, "LOTW_QUIET_MODE", \ "Add -q to tqsl command line parameters", \ true) \ ELEM_(std::string, lotw_pathname, "LOTW_PATHNAME", \ "Path-name of tqsl executable", \ "") \ ELEM_(std::string, lotw_pwd, "LOTW_PASSWORD", \ "Password to access tqsl executable", \ "") \ ELEM_(bool, submit_lotw_password, "SUBMIT_LOTW_PASSWORD", \ "Send -p with each upload ", \ true) \ ELEM_(bool, lotw_show_delivery, "LOTW_SHOW_DELIVERY", \ "Show timed delivery message for successful LoTW upload", \ true) \ ELEM_(std::string, lotw_location, "LOTW_LOCATION", \ "Tqsl station location for uploading records", \ "") \ ELEM_(int, tracefile_timeout, "tracefile_timeout", \ "Tqsl trace file timeout in seconds", \ 15) \ /* MacLogger interface */ \ ELEM_(bool, connect_to_maclogger, "CONNECT_TO_MACLOGGER", \ "Connect to MacLogger UDP server on 255.255.255.255 / 9932", \ false) \ ELEM_(bool, capture_maclogger_radio, "CAPTURE_MACLOGGER_RADIO", \ "Capture and use UDP Radio Report data", \ true) \ ELEM_(bool, capture_maclogger_spot_tune, "CAPTURE_MACLOGGER_SPOT_TUNE", \ "Capture and use UDP Spot Tune data", \ false) \ ELEM_(bool, capture_maclogger_spot_report, "CAPTURE_MACLOGGER_SPOT_REPORT", \ "Capture and use UDP Spot Report data", \ false) \ ELEM_(bool, capture_maclogger_log, "CAPTURE_MACLOGGER_LOG", \ "Capture and use UDP Log Report data", \ false) \ ELEM_(bool, capture_maclogger_lookup, "CAPTURE_MACLOGGER_LOOKUP", \ "Capture and use UDP Lookup Report data", \ false) \ ELEM_(bool, enable_maclogger_log, "ENABLE_MACLOGGER_LOG", \ "Enable UDP string capture to file", \ false) \ ELEM_(bool, maclogger_spot_rx, "MACLOGGER_SPOT_RX", \ "true - tune to spot Rx frequency\n" \ "false - tune to spot Tx frequency\n", \ true) \ ELEM_(std::string, maclogger_log_filename, "MACLOGGER_LOG_FILENAME", \ "Filename for maclogger UDP datastream file", \ "maclogger_udp_strings.txt") \ /* N3FJP tcpip interface */ \ ELEM_(std::string, N3FJP_address, "N3FJP_ADDRESS", \ "IP Address of N3FJP socket", \ "127.0.0.1") \ ELEM_(std::string, N3FJP_port, "N3FJP_PORT", \ "IP port number of N3FJP socket", \ "1100") \ ELEM_(bool, enable_N3FJP_log, "ENABLE_N3FJP_LOG", \ "Enable data stream logging.", \ true) \ ELEM_(bool, connect_to_n3fjp, "CONNECT_TO_N3FJP", \ "Connect to the N3FJP log server", \ false) \ ELEM_(bool, N3FJP_sweet_spot, "N3FJP_SWEET_SPOT", \ "Use N3FJP spot report as signal center freq.\n" \ "Center the target at mode sweet spot", \ false) \ ELEM_(bool, N3FJP_modem_carrier, "N3FJP_MODEM_CARRIER", \ "Use actual modem carrier frequency for logging", \ true) \ ELEM_(bool, enable_N3FJP_RIGTX, "N3FJP_RIGTX", \ "Use RIGTX/RX vice CWCOMPORTKEYDOWN/CWCOMPORTKEYUP", \ false) \ /* Rig control */ \ ELEM_(bool, flrig_keys_modem, "FLRIG_KEYS_MODEM", \ "PTT change at flrig changes Rx/Tx state\n" \ "set to false if multple instance of fldigi used with single flrig", \ false) \ ELEM_(bool, fldigi_client_to_flrig, "CLIENT_TO_FLRIG", \ "True if flrig xmlrpc server is used for xcvr control", \ false) \ ELEM_(bool, flrig_auto_shutdown, "FLRIG_AUTO_SHUTDOWN", \ "True to shutdown flrig when closing fldigi", \ false) \ ELEM_(bool, btnusb, "BTNUSB", \ "This setting is currently unused", \ true) \ ELEM_(bool, RTSptt, "RTSPTT", \ "RTS is PTT signal line", \ false) \ ELEM_(bool, DTRptt, "DTRPTT", \ "DTR is PTT signal line", \ false) \ ELEM_(bool, RTSplus, "RTSPLUS", \ "Initial voltage on RTS is +V", \ false) \ ELEM_(bool, DTRplus, "DTRPLUS", \ "Initial voltage on DTR is +V", \ false) \ ELEM_(bool, SCU_17, "SCU_17", \ "Serial port is SCU-17 (requires 0 stop bits", \ false) \ ELEM_(bool, PTTrightchannel, "PTTRIGHTCHANNEL", \ "Generate PTT signal on right audio channel", \ false) \ ELEM_(int, chkUSEHAMLIBis, "CHKUSEHAMLIBIS", \ "Use Hamlib rig control", \ 0) \ ELEM_(int, chkUSERIGCATis, "CHKUSERIGCATIS", \ "Use RigCAT rig control", \ 0) \ ELEM_(int, chkUSEXMLRPCis, "CHKUSEXMLRPCIS", \ "Use XML-RPC rig control", \ 0) \ ELEM_(std::string, PTTdev, "PTTDEV", \ "PTT device", \ DEFAULT_PTTDEV) \ ELEM_(std::string, CWFSKport, "", "", DEFAULT_CWFSKPORT) \ ELEM_(std::string, HamRigDevice, "HAMRIGDEVICE", \ "Hamlib rig device", \ DEFAULT_HAMRIGDEVICE) \ ELEM_(std::string, HamRigName, "HAMRIGNAME", \ "Hamlib rig name", \ "") \ ELEM_(int, HamRigModel, "HAMRIGMODEL", \ "Hamlib rig model", \ 0) \ ELEM_(std::string, HamConfig, "HAMCONFIG", \ "Hamlib configuration (param=val, ...)", \ "") \ ELEM_(int, HamRigBaudrate, "HAMRIGBAUDRATE", \ "Hamlib rig baud rate. Values are as follows:\n" \ " 0: 300; 1: 600; 2: 1200; 3: 2400; 4: 4800; 5: 9600; 6: 19200;\n" \ " 7: 38400; 8: 57600; 9: 115200; 10: 230400; 11: 460800.", \ 1) /* 600 baud */ \ ELEM_(int, HamRigStopbits, "HAMRIGSTOPBITS", \ "Hamlib stopbits <1/2>.", \ 2) /* 600 baud */ \ ELEM_(int, HamRigPollrate, "HAMRIGPOLLRATE", \ "250 - 2000 in 50 msec increments", \ 250) \ ELEM_(int, hamlib_ptt_on_data, "HAMLIBPTTONDATA", \ "Hamlib PTT for xmt audio on data port", \ 1) \ ELEM_(bool, hamlib_cw_islsb, "HAMLIB_CW_ISLSB", \ "Hamlib xcvr uses LSB for CW", \ false) \ ELEM_(bool, hamlib_rtty_isusb, "HAMLIB_RTTY_ISUSB", \ "Hamlib xcvr uses USB for RTTY", \ false) \ ELEM_(int, hamlib_mode_delay, "HAMRIG_MODE_DELAY", \ "wait NN msec after sending mode change\n" \ "before next transceiver CAT query\n" \ "0 - 2000 in 100 msec increments", \ 200) \ ELEM_(std::string, XmlRigFilename, "XMLRIGFILENAME", \ "RigCAT XML file name", \ "") \ ELEM_(std::string, XmlRigDevice, "XMLRIGDEVICE", \ "RigCAT device", \ DEFAULT_HAMRIGDEVICE) \ ELEM_(int, XmlRigBaudrate, "XMLRIGBAUDRATE", \ "RigCAT rig baud rate. See HAMRIGBAUDRATE.", \ 1) /* 600 baud */ \ ELEM_(int, RigCatStopbits, "RIGCATSTOPBITS", \ "RigCAT stopbits. <1/2>", \ 2) /* 600 baud */ \ ELEM_(bool, TTYptt, "TTYPTT", \ "Use separate device for PTT", \ false) \ ELEM_(bool, HamlibCMDptt, "HAMLIBCMDPTT", \ "PTT via Hamlib command", \ false) \ ELEM_(bool, RigCatCMDptt, "RIGCATCMDPTT", \ "PTT via RigCAT command", \ false) \ ELEM_(bool, UseUHrouterPTT, "USEUHROUTERPTT", \ "Use uHRouter PTT (OS X only)", \ false) \ ELEM_(bool, UsePPortPTT, "USEPPORTPTT", \ "Use parallel port PTT", \ false) \ /* GPIO parameters */ \ ELEM_(bool, gpio_ptt, "USE_GPIO_PTT", \ "use GPIO for ptt (pi3/4)", \ false) \ ELEM_(long, enable_gpio, "ENABLE_GPIO", \ "GPIO enable\n" \ "bits 0 - 16; bit 0 : gpio pin N", \ 0) \ ELEM_(long, gpio_on, "GPIO_STATE", \ "GPIO State\n" \ "bits 0 - 16; bit 0 : PTT ON state on pin N", \ 0) \ ELEM_(int, gpio_pulse_width, "GPIO_PULSE_WIDTH", \ "GPIO pulse width setting for PiHpSDR PTT", \ 0) \ /* cmedia parameters */ \ ELEM_(std::string, cmedia_device, "CMEDIA_DEVICE", \ "DRA-xx device name", \ "NONE") /* NONE */ \ ELEM_(bool, cmedia_ptt, "CMEDIA-PTT", \ "Use cmedia PTT", \ false) \ ELEM_(std::string, cmedia_gpio_line, "CMEDIA_GPIO_LINE", \ "cmedia GPIO pin assignment for PTT", \ "GPIO-3") /* pin 13 on cmedia, default for DRA-30 */ \ /* RigCAT parameters */ \ ELEM_(bool, RigCatRTSplus, "RIGCATRTSPLUS", \ "Initial state of RTS", \ false) \ ELEM_(bool, RigCatDTRplus, "RIGCATDTRPLUS", \ "Initial state of DTR", \ false) \ ELEM_(bool, RigCatRTSptt, "RIGCATRTSPTT", \ "Toggle RTS for PTT", \ false) \ ELEM_(bool, RigCatDTRptt, "RIGCATDTRPTT", \ "Toggle DTR for PTT", \ false) \ ELEM_(bool, RigCatRTSCTSflow, "RIGCATRTSCTSFLOW", \ "RTS/CTS flow control", \ false) \ ELEM_(int, RigCatRetries, "RIGCATRETRIES", \ "Number of retries before giving up", \ 2) \ ELEM_(int, RigCatTimeout, "RIGCATTIMEOUT", \ "Retry interval (milliseconds)", \ 10) \ ELEM_(int, RigCatWait, "RIGCATWAIT", \ "Write delay (milliseconds)", \ 50) \ ELEM_(int, RigCatInitDelay, "RIGCATINITDELAY", \ "Wait delay (milliseconds) on first command to serial device", \ 200) \ ELEM_(bool, RigCatECHO, "RIGCATECHO", \ "Commands are echoed", \ false) \ ELEM_(bool, RigCatVSP, "RIGCATVSP", \ "VSP support enabled", \ false) \ ELEM_(bool, RigCatRestoreTIO, "RIGCATRESTORETIO", \ "Restore original state of comm port when closing", \ false) \ /* Hamlib parameters */ \ ELEM_(bool, HamlibRTSplus, "HAMLIBRTSPLUS", \ "RTS +12", \ false) \ ELEM_(bool, HamlibDTRplus, "HAMLIBDTRPLUS", \ "DTR +12", \ false) \ ELEM_(bool, HamlibRTSCTSflow, "HAMLIBRTSCTSFLOW", \ "RTS/CTS flow control", \ false) \ ELEM_(bool, HamlibXONXOFFflow, "HAMLIBXONXOFFFLOW", \ "XON/XOFF flow control", \ false) \ ELEM_(int, HamlibRetries, "HAMLIBRETRIES", \ "Number of times to resend command before giving up", \ 2) \ ELEM_(int, HamlibTimeout, "HAMLIBTIMEOUT", \ "Retry interval (milliseconds)", \ 200) \ ELEM_(int, HamlibWait, "HAMLIBWAIT", \ "Wait interval before reading response (milliseconds)", \ 5) \ ELEM_(int, HamlibWriteDelay, "HAMLIBWRITEDELAY", \ "Write delay (milliseconds)", \ 0) \ ELEM_(int, HamlibSideband, "HAMLIBSIDEBAND", \ "Force the rig sideband (for the purpose of calculating frequencies).\n" \ "Values are as follows: 0: as reported by rig; 1: LSB; 2: USB.", \ 0) /* SIDEBAND_RIG */ \ /* nanoIO interface parameters */ \ ELEM_(std::string, nanoIO_serial_port_name, "NANOSERIALPORTNAME", \ "nanoIO serial device", \ "NONE") \ ELEM_(int, nanoIO_baud, "NANOIOBAUD", \ "0 - 45.45, 1 - 50, 2 - 75, 3 - 100 baud", \ 0) \ ELEM_(int, nanoIO_polarity, "NANOIOPOLARITY", \ "MARK polarity 0 - high, 1 - low", \ 1) \ ELEM_(int, nanoIO_serbaud, "NANOIO_SERBAUD", \ "0/1200, 1/4800, 2/9600, 3/19200, 4/38400, 5/57600, 6/115200", \ 6) \ ELEM_(int, nanoIO_CW_incr, "NANOIOCWINCR", \ "^ ' increment/decrement value\n" \ "range '1' to '5'", \ '2') \ ELEM_(int, CW_keyspeed, "NANOCWKEYSPEED", \ "Paddle keyer WPM (0...100)", \ 18) \ ELEM_(int, nanoIO_CW_keyer, "NANOIOCWKEYER", \ "0 - IambicA, 1 - IambicB, 2 - Straight", \ 0) \ ELEM_(bool, disable_CW_PTT, "disable_CW_PTT", \ "Disable CAT PTT signal during CW ops with expernal h/w", \ 0) \ ELEM_(int, nanoIO_speed_pot, "nanoIO_speed_pot", \ "Enable speed pot in nanoIO circuit / script", \ 1) \ ELEM_(int, nanoCW_test_wpm, "nanoCW_test_wpm", \ "test wpm setting", \ 24) \ ELEM_(int, usec_correc, "usec_corr", \ "Correct CW unit timing by this amount in usec", \ 0) \ /* TTY h/w interface */ \ ELEM_(int, xcvr_FSK_sideband, "XCVRFSKSIDEBAND", \ "0 = LSB | 1 = USB", \ 0) \ ELEM_(int, xcvr_FSK_MARK, "XCVRFSKMARK", \ "typical values: 1275, 1615 or 2125 for 170 Hz shift, IC7200", \ 2125) \ ELEM_(int, TTY_LTRS, "TTYLTRS", \ "0 to 10, number of LTRS bytes send at beginning of xmt", \ 2) \ /* Navigator interface */ \ ELEM_(std::string, Nav_FSK_port, "NAVFSKPORT", \ "Nav FSK serial device", \ "NONE") \ ELEM_(std::string, Nav_config_port, "NAVCONFIGPORT", \ "Nav config serial device", \ "NONE") \ ELEM_(int, Nav_FSK_baud, "NAVFSKBAUD", \ "0 - 45.45, 1 - 75, 2 - 100 baud", \ 0) \ ELEM_(int, Nav_FSK_sidetone, "NAVFSKSIDETONE", \ "0 = Off | 1 = On", \ 0) \ ELEM_(int, Nav_FSK_ptt, "NAVFSKPTT", \ "0 = Off | 1 = On", \ 0) \ ELEM_(int, Nav_FSK_polarity, "NAVFSKPOLARITY", \ "0 = Normal | 1 = Reversed", \ 0) \ ELEM_(int, Nav_FSK_stopbits, "NAVFSKSTOPBITS", \ "0 = 1 | 1 = 1.5 | 2 = 2", \ 1) \ ELEM_(int, Nav_channel_2_att, "NAVCH2ATT", \ "0 = 15 db, 1 = None", \ 1) \ ELEM_(int, Nav_channel_1_att, "NAVCH1ATT", \ "0 = 15 db, 1 = None", \ 1) \ ELEM_(int, Nav_rf_att, "NAVRFATT", \ "0 = 20 db, 1 = None", \ 1) \ ELEM_(int, Nav_led, "NAVLED", \ "0 = Off | 1 = On", \ 0) \ ELEM_(int, Nav_cat_led, "NAVCATLED", \ "0 = Off | 1 = On", \ 0) \ ELEM_(int, Nav_wk_ptt, "NAVWKPTT", \ "0 = Off | 1 = On", \ 0) \ /* Operator */ \ ELEM_(std::string, myCall, "MYCALL", \ "Station callsign", \ "") \ ELEM_(std::string, myQth, "MYQTH", \ "Operator QTH", \ "") \ ELEM_(std::string, myName, "MYNAME", \ "Operator name", \ "") \ ELEM_(std::string, myLocator, "MYLOC", \ "Operator Maidenhead locator", \ "") \ ELEM_(std::string, myAntenna, "MYANTENNA", \ "Antenna description (keep short!)", \ "") \ /* Sound card */ \ ELEM_(std::string, operCall, "OPERCALL", \ "Operator call sign, if distinct from the station call MYCALL", \ "") \ ELEM_(int, btnAudioIOis, "AUDIOIO", \ "Audio subsystem. Values are as follows:\n" \ " 0: OSS; 1: PortAudio; 2: PulseAudio; 3: File I/O", \ SND_IDX_NULL) \ ELEM_(std::string, OSSdevice, "OSSDEVICE", \ "OSS device name", \ "") \ ELEM_(std::string, PAdevice, "PADEVICE", \ "For compatibility with older versions", \ "") \ ELEM_(std::string, PortInDevice, "PORTINDEVICE", \ "PortAudio input device name", \ "") \ ELEM_(int, PortInIndex, "PORTININDEX", \ "PortAudio input device index", \ -1) \ ELEM_(std::string, PortOutDevice, "PORTOUTDEVICE", \ "PortAudio output device name", \ "") \ ELEM_(int, PortOutIndex, "PORTOUTINDEX", \ "PortAudio input device index", \ -1) \ ELEM_(std::string, AlertDevice, "ALERTDEVICE", \ "PortAudio alert device name", \ "") \ ELEM_(int, AlertIndex, "ALERTINDEX", \ "Alert output device index", \ -1) \ ELEM_(bool, enable_audio_alerts, "ENABLE_AUDIO_ALERTS", \ "1 - enable audio stream, 0 - disable audio stream", \ false) \ ELEM_(int, PortFramesPerBuffer, "", "", 0) \ ELEM_(std::string, PulseServer, "PULSESERVER", \ "PulseAudio server string", \ "") \ ELEM_(bool, is_full_duplex, "IS_FULL_DUPLEX", \ "Audio codec supports full duplex operation", \ true) \ ELEM_(bool, sig_on_right_channel, "SIGONRIGHTCHANNEL", \ "Duplicate modem signal on left & right", \ true) \ ELEM_(bool, ReverseAudio, "REVERSEAUDIO", \ "Reverse left-right rx audio channels", \ false) \ ELEM_(bool, ReverseRxAudio, "REVERSERXAUDIO", \ "Reverse left-right rx audio channels", \ false) \ ELEM_(int, sample_rate, "SAMPLERATE", \ "For compatibility with older versions", \ SAMPLE_RATE_UNSET) \ ELEM_(int, in_sample_rate, "INSAMPLERATE", \ "Input sample rate", \ SAMPLE_RATE_UNSET) \ ELEM_(int, out_sample_rate, "OUTSAMPLERATE", \ "Output sample rate", \ SAMPLE_RATE_UNSET) \ ELEM_(int, sample_converter, "SAMPLECONVERTER", \ "Sample rate conversion type. Values are as follows:\n" \ " 0: Best SINC; 1: Medium SINC; 2: Fastest SINC; 3: ZOH; 4: Linear.\n" \ "The default is 2.", \ SRC_SINC_FASTEST) \ ELEM_(int, RX_corr, "RXCORR", \ "Input (RX) sample rate correction (PPM)", \ 0) \ ELEM_(int, TX_corr, "TXCORR", \ "Output (TX) sample rate correction (PPM)", \ 0) \ ELEM_(int, TxOffset, "TXOFFSET", \ "Difference between RX and TX freq (rig offset)", \ 0) \ ELEM_(double, RIT, "RIT", \ "Linear frequency correction applied to frequency analysis", \ 0) \ ELEM_(int, wavSampleRate, "WAV_SAMPLERATE", \ "Wave file record sample rate\n" \ "0 - 8000, 1 - 11025, 2 - 16000, 3 - 22050\n" \ "4 - 24000, 5 - 44100, 6 - 48000", \ 0) \ ELEM_(bool, record_both_channels, "RECORD_BOTH_CHANNELS", \ "Enabled - record wav file in stereo\n" \ "Disabled - record wav file in monaural (left channel only)", \ false) \ ELEM_(bool, loop_playback, "LOOPPLAYBACK", \ "true = continuous loop of sound file playback\n" \ "false = single pass through playback file.", \ false) \ ELEM_(int, PTT_on_delay, "PTTONDELAY", \ "Start of transmit delay before sending audio", \ 0) \ ELEM_(int, PTT_off_delay, "PTTOFFDELAY", \ "End of transmit delay before disabling PTT", \ 0) \ ELEM_(double, rx_gain, "RX_GAIN", \ "gain factor to compensate for low level output on USB A/D in dB\n" \ "minimum -10.0, maximum + 10.0", \ 0.0) \ /* Contest controls and Logbook */ \ ELEM_(std::string, logbookfilename, "LOGBOOKFILENAME", \ "Logbook file name", \ "") \ ELEM_(bool, DisplayLogbookRead, "LOGBOOKREADDISPLAY", \ "Display read # recs and logbook name on program start", \ 0) \ ELEM_(bool, fixed599, "FIXED599", \ "Force RST in/out to 599", \ true) \ ELEM_(bool, UseLeadingZeros, "USELEADINGZEROS", \ "Insert leading zeros into transmitted serial number (contest)", \ true) \ ELEM_(bool, cutnbrs, "CUTNBRS", \ "Send CW cut numbers", \ false) \ ELEM_(bool, clear_fields, "CLEARFIELDS", \ "clear logging fields upon transfer of CALL from Rx panel", \ true) \ ELEM_(RGB, bwsrSliderColor, "BWSRSLIDERCOLOR", \ "Background color of signal browser detect level", \ {185, 211, 238}) \ ELEM_(RGB, bwsrSldrSelColor,"BWSRSLDRSELCOLOR", \ "Button highlight color, signal browser detect level", \ {54, 100, 139}) \ ELEM_(int, bwsrHiLight1, "BWSRHILIGHT1", \ "View Browser highlight color 1, default Dark Red", \ FL_RED) \ ELEM_(int, bwsrHiLight2, "BWSRHILIGHT2", \ "View Browser highlight color 2, default Dark Green", \ FL_GREEN) \ ELEM_(int, bwsrBackgnd1, "BWSRBACKGND1", \ "View Browser background odd lines", \ 55) \ ELEM_(int, bwsrBackgnd2, "BWSRBACKGND2", \ "View Browser background odd lines", \ 53) \ ELEM_(int, bwsrSelect, "BWSRSELECT", \ "View Browser line select color", \ FL_BLUE) \ ELEM_(RGB, dup_color, "dupcolor", \ "Callsign background color when duplicate detected", \ {255, 110, 180}) \ ELEM_(RGB, possible_dup_color, "duppossiblecolor", \ "Callsign background color when possible duplicate detected", \ {255, 255, 150}) \ ELEM_(bool, EnableDupCheck, "ENABLEDUPCHECK", \ "Check for duplicates (contest)", \ true) \ ELEM_(bool, dupmode, "DUPMODE", \ "Predicate for ENABLEDUPCHECK (mode must match)", \ true) \ ELEM_(bool, dupband, "DUPBAND", \ "Predicate for ENABLEDUPCHECK (band must match)", \ true) \ ELEM_(bool, dupstate, "DUPSTATE", \ "Predicate for ENABLEDUPCHECK (state must match)", \ false) \ ELEM_(bool, dupxchg1, "DUPXCHG1", \ "Predicate for ENABLEDUPCHECK (exchange must match)", \ false) \ ELEM_(bool, duptimespan, "DUPTIMESPAN", \ "Predicate for ENABLEDUPCHECK (QSO inside timespan)", \ false) \ ELEM_(int, timespan, "TIMESPAN", \ "Time for DUPTIMESPAN (minutes)", \ 120) \ ELEM_(int, ContestStart, "CONTESTSTART", \ "Contest starting number", \ 1) \ ELEM_(int, ContestDigits, "CONTESTDIGITS", \ "Number of digits in serial number", \ 4) \ ELEM_(std::string, nonwordchars, "NONWORDCHARS", \ "Additional characters used to delimit WORDS", \ "*,-.;") \ ELEM_(std::string, myXchg, "MYXCGH", \ "Free form exchange", \ "") \ ELEM_(std::string, mytxpower, "TXPOWER", \ "TX power used for logbook entries", \ "") \ ELEM_(bool, log_power_meter, "LOG_POWER_METER", \ "Use power meter reading for logged TX power", \ true) \ ELEM_(std::string, my_FD_call, "FD_CALL", \ "Field Day call sign", \ "") \ ELEM_(std::string, fd_op_call, "FD_OP_CALL", \ "Field Day (w1hkj) server position operator call", \ "") \ ELEM_(std::string, my_FD_class, "FDCLASS", \ "Field Day class", \ "") \ ELEM_(std::string, my_FD_section, "FDSECTION", \ "Field Day section", \ "") \ ELEM_(std::string, my_FD_mult, "FDMULT", \ "Field Day multiplier", \ "5") \ ELEM_(std::string, my_SCR_class, "MY_SCR_CLASS", \ "School Round Up Class", \ "") \ ELEM_(std::string, my_JOTA_troop, "MY_JOTA_TROOP", \ "Jamboree On The Air Troop", \ "") \ ELEM_(std::string, my_JOTA_scout, "MY_JOTA_SCOUT", \ "JOTA scout operator", \ "") \ ELEM_(int, logging, "LOGGING", \ "Logging for:\n" \ " 0 - generic QSO\n" \ " 1 - generic contest\n" \ " 2 - BART\n" \ " 3 - Field Day\n" \ " 4 - Winter Field Day\n" \ " 5 - Kids Day\n" \ " 6 - Rookie Roundup\n" \ " 7 - ARRY RTTY\n" \ " 8 - School Round UP\n" \ " 9 - Jamboree On The Air\n" \ " 10 - CQ WPX\n" \ " 11 - CQWW RTTY\n" \ " 12 - Italian ARI International DX\n" \ " 13 - North American QSO Party\n" \ " 14 - North American Sprint\n" \ " 15 - Sweepstakes\n" \ " 16 - State QSO Parties\n" \ " 17 - Ten Ten\n" \ " 18 - Africa All Mode\n" \ " 19 - VHF\n" \ " 20 - Worked All Europe", \ 0) \ ELEM_(int, SQSOcontest, "SQSOcontest", \ "SQSO contest", \ 0) \ ELEM_(std::string, CONTESTnotes, "CONTESTnotes", \ "Notes for specfied contest", \ "CALL if (RSTr), if (LOCATOR), NAME, QTH") \ ELEM_(int, SQSOinstate, "SQSOinstate", \ "SQSO in-state", \ 0) \ ELEM_(int, SQSOstate, "SQSOstate", \ "SQSO state", \ 0) \ ELEM_(int, SQSOcounty, "SQSOcounty", \ "SQSO county", \ 0) \ ELEM_(int, SQSOlogstate, "SQSOlogstate", \ "SQSO log state", \ 0) \ ELEM_(int, SQSOlogcounty, "SQSOlogcounty", \ "SQSO log county", \ 0) \ ELEM_(int, SQSOlogserno, "SQSOlogserno", \ "SQSO log serno", \ 0) \ ELEM_(int, SQSOlogxchg, "SQSOlogxchg", \ "SQSO log exchange", \ 0) \ ELEM_(int, SQSOlogname, "SQSOlogname", \ "SQSO log name", \ 0) \ ELEM_(int, SQSOlogstcty, "SQSOlogstcty", \ "SQSO parse STCTY", \ 0) \ ELEM_(int, SQSOlogctyst, "SQSOlogctyst", \ "SQSO parse CTYST", \ 0) \ ELEM_(int, SQSOlogrst, "SQSOlogrst", \ "SQSO log rst", \ 0) \ ELEM_(int, SQSOlogcat, "SQSlogcat", \ "State of Maryland ... peculiar folks living there", \ 0) \ ELEM_(bool, connect_to_fdserver, "CONNECT_TO_FDSERVER", \ "Connect to field day server", \ false) \ ELEM_(std::string, fd_tcpip_addr, "FD_TCPIP_ADDR", \ "Field Day (w1hkj) server tcpip address", \ "127.0.0.1") \ ELEM_(std::string, fd_tcpip_port, "FD_TCPIP_PORT", \ "Field Day (w1hkj) server tcpip port", \ "20001") \ /* Macro controls */ \ /* DX Cluster */ \ ELEM_(std::string, dxcc_host_url, "DXCC_HOST_URL", \ "DXCC cluster tcpip address", \ "") \ ELEM_(std::string, dxcluster_hosts, "DXCLUSTER_HOSTS", \ "Array of dxcluster host-port-user lines\n" \ "Fields separated by : character\n" \ "Lines separated by | character", \ "w3nr.ddns.net:7300::|dx.n8noe.us:7373::|w0mw.dynip.com:23::|") \ ELEM_(RGB, DX_Color, "DX_COLOR", \ "RX text font color (RGB)", \ { 0, 0, 130 }) \ ELEM_(Fl_Color, DXC_even_color, "DXC_EVEN_COLOR", \ "Even line background color in dxcluster dialog", \ 7) \ ELEM_(Fl_Color, DXC_odd_color, "DXC_ODD_COLOR", \ "Odd line background color in dxcluster dialog", \ 246) \ ELEM_(Fl_Color, DXC_textcolor, "DXC_TEXTCOLOR", \ "Text color in dxcluster dialog", \ FL_YELLOW) \ ELEM_(std::string, DXC_textname, "DXC_TEXTNAME", \ "DX cluster browser font name", \ "") \ ELEM_(Fl_Font, DXC_textfont, "DXC_TEXTFONT", \ "DX cluster browsers font number", \ FL_COURIER) \ ELEM_(int, DXC_textsize, "DXC_TEXTSIZE", \ "DX cluster browsers font size", \ 14) \ ELEM_(Fl_Color, DXfontcolor, "DXFONTCOLOR", \ "Text color in dxcluster stream", \ FL_YELLOW) \ ELEM_(Fl_Color, DXalt_color, "DXALT_COLOR", \ "Alternate text color in dxcluster stream", \ FL_DARK_RED) \ ELEM_(std::string, DXfontname, "DXFONTNAME", \ "DX cluster stream font name", \ "") \ ELEM_(Fl_Font, DXfontnbr, "DXFONTNBR", \ "DX cluster stream font number", \ FL_COURIER) \ ELEM_(int, DXfontsize, "DXFONTSIZE", \ "DX cluster stream font size", \ 14) \ ELEM_(std::string, dxcc_host_port, "DXCC_HOST_PORT", \ "DXCC cluster tcpip port number", \ "") \ ELEM_(std::string, dxcc_login, "DXCC_LOGIN", \ "DXCC cluster login call sign", \ "") \ ELEM_(std::string, dxcc_password, "DXCC_PASSWORD", \ "DXCC cluster login password", \ "") \ ELEM_(std::string, dxcm_label_1, "DXC_ML1", \ "DXC Macro Label 1", \ "Show DX") \ ELEM_(std::string, dxcm_text_1, "DXC_MACRO1", \ "DXC Macro 1", \ "SH/DX") \ ELEM_(std::string, dxcm_label_2, "DXC_ML2", \ "DXC Macro Label 2", \ "dxcm 2") \ ELEM_(std::string, dxcm_text_2, "DXC_MACRO2", \ "DXC Macro 2", \ "") \ ELEM_(std::string, dxcm_label_3, "DXC_ML3", \ "DXC Macro Label 3", \ "dxcm 3") \ ELEM_(std::string, dxcm_text_3, "DXC_MACRO3", \ "DXC Macro 3", \ "") \ ELEM_(std::string, dxcm_label_4, "DXC_ML4", \ "DXC Macro Label 4", \ "dxcm 4") \ ELEM_(std::string, dxcm_text_4, "DXC_MACRO4", \ "DXC Macro 4", \ "") \ ELEM_(std::string, dxcm_label_5, "DXC_ML5", \ "DXC Macro Label 5", \ "dxcm 5") \ ELEM_(std::string, dxcm_text_5, "DXC_MACRO5", \ "DXC Macro 5", \ "") \ ELEM_(std::string, dxcm_label_6, "DXC_ML6", \ "DXC Macro Label 6", \ "dxcm 6") \ ELEM_(std::string, dxcm_text_6, "DXC_MACRO6", \ "DXC Macro 6", \ "") \ ELEM_(std::string, dxcm_label_7, "DXC_ML7", \ "DXC Macro Label 7", \ "dxcm 7") \ ELEM_(std::string, dxcm_text_7, "DXC_MACRO7", \ "DXC Macro 7", \ "") \ ELEM_(std::string, dxcm_label_8, "DXC_ML8", \ "DXC Macro Label 8", \ "dxcm 8") \ ELEM_(std::string, dxcm_text_8, "DXC_MACRO8", \ "DXC Macro 8", \ "") \ ELEM_(bool, dxc_topline, "DXC_TOPLINE", \ "DXC report order; true = new record on top line", \ true) \ ELEM_(bool, spot_when_logged, "SPOT_WHEN_LOGGED", \ "Create spot Cmd: string when logging contact", \ false) \ ELEM_(bool, dxc_auto_connect, "DXC_AUTO_CONNECT", \ "Connect to HOST when starting fldigi", \ false) \ ELEM_(bool, dxc_hertz, "DXC_HERTZ", \ "Add 0..99 Hertz audio frequency factor [nn] to DX report/notes", \ false) \ ELEM_(bool, UseLastMacro, "USELASTMACRO", \ "Load last used macro file on startup", \ true) \ ELEM_(double, mbw, "MBW", \ "Delay between execution of RIGMODE and FILWID\n" \ "when in the same macro definition\n" \ "range 0.1 to 2.0, default = 0.5", \ 0.5) \ ELEM_(bool, DisplayMacroFilename, "DISPLAYMACROFILENAME", \ "Display macro filename on startup", \ true) \ ELEM_(bool, SaveMacros, "SAVEMACROS", \ "Save current macros on exit", \ true) \ ELEM_(bool, macro_wheel, "MACROWHEEL", \ "Enable mouse wheel rotation to control visible macro set", \ false) \ ELEM_(int, mbar_scheme, "MBARSCHEME", \ "# and position of macro bars\n" \ "0..12, 1 = default", \ 1) \ ELEM_(bool, four_bar_position, "FOURBARPOSITION", \ "Position 4 bar macro sat below Tx panel\n" \ "Default is above Rx panel", \ false) \ ELEM_(bool, macro_post, "MACROPOST", \ "expand ^! macro tags in Rx panel when executed", \ false) \ ELEM_(double, txlevel, "TXATTEN", \ "TX attenuator (db) -30 .. 0", \ -3.0) \ ELEM_(double, TxMonitorLevel, "TXMONITORLEVEL", \ "Level for monitored (on waterfall) transmit signal", \ 0.2) \ /* Waterfall palette */ \ ELEM_(std::string, PaletteName, "PALETTENAME", \ "Waterfall color palette file name", \ "default.pal") \ ELEM_(RGB, cfgpal0, "PALETTE0", \ "Custom palette 0", \ { 0,0,0 }) \ ELEM_(RGB, cfgpal1, "PALETTE1", \ "Custom palette 1", \ { 0,0,136 }) \ ELEM_(RGB, cfgpal2, "PALETTE2", \ "Custom palette 2", \ { 0,19,198 }) \ ELEM_(RGB, cfgpal3, "PALETTE3", \ "Custom palette 3", \ { 0,32,239 }) \ ELEM_(RGB, cfgpal4, "PALETTE4", \ "Custom palette 4", \ { 172,167,105 }) \ ELEM_(RGB, cfgpal5, "PALETTE5", \ "Custom palette 5", \ { 194,198,49 }) \ ELEM_(RGB, cfgpal6, "PALETTE6", \ "Custom palette 6", \ { 225,228,107 }) \ ELEM_(RGB, cfgpal7, "PALETTE7", \ "Custom palette 7", \ { 255,255,0 }) \ ELEM_(RGB, cfgpal8, "PALETTE8", \ "Custom palette 8", \ { 251,51,0 }) \ /* Palettes for macro button groups */ \ ELEM_(bool, useGroupColors, "USEGROUPCOLORS", \ "Use macro group colors", \ true) \ ELEM_(RGB, btnGroup1, "FKEYGROUP1", \ "Macro group 1 color", \ { 80, 144, 144 }) \ ELEM_(RGB, btnGroup2, "FKEYGROUP2", \ "Macro group 2 color", \ { 144, 80, 80 }) \ ELEM_(RGB, btnGroup3, "FKEYGROUP3", \ "Macro group 3 color", \ { 80, 80, 144 }) \ ELEM_(RGB, btnFkeyTextColor, "FKEYTEXTCOLOR", \ "Macro button foreground ", \ { 255, 255, 255 }) \ /* RX / TX / Waterfall text widgets */ \ ELEM_(std::string, charset_name, "CHARSET_NAME", \ "Default character set", \ "UTF-8") \ ELEM_(Fl_Font, MenuFontnbr, "MENUFONTNBR", \ "Menu text font index", \ FL_HELVETICA) \ ELEM_(int, MenuFontsize, "MENUFONTSIZE", \ "Menu text font size", \ 16) \ ELEM_(bool, RxFontWarn, "RXFONTWARN", \ "Enable RX font warnings", \ true) \ ELEM_(std::string, RxFontName, "RXFONTNAME", \ "RX text font name", \ "") \ ELEM_(Fl_Font, RxFontnbr, "RXFONTNBR", \ "RX text font index", \ FL_HELVETICA) \ ELEM_(int, RxFontsize, "RXFONTSIZE", \ "RX text font size", \ 16) \ ELEM_(Fl_Color, RxFontcolor, "RXFNTCOLOR", \ "RX text font color", \ FL_BLACK) \ ELEM_(std::string, MacroBtnFontName, "MACROBTNFONTNAME", \ "Macro Btn Font Name", \ "") \ ELEM_(Fl_Font, MacroBtnFontnbr, "MACROBTNFONTNBR", \ "Macro Btn font index", \ FL_HELVETICA) \ ELEM_(int, MacroBtnFontsize, "MACROBTNFONTSIZE", \ "Macro btn font size", \ 12) \ ELEM_(Fl_Color, MacroBtnFontcolor, "MACROBTNFONTCOLOR", \ "Macro btn font color", \ FL_WHITE) \ ELEM_(Fl_Color, RxTxSelectcolor, "RXTXSELCOLOR", \ "RX/TX text select color", \ FL_MAGENTA) \ ELEM_(bool, TxFontWarn, "TXFONTWARN", \ "Enable TX font warnings", \ true) \ ELEM_(std::string, TxFontName, "TXFONTNAME", \ "TX text font name", \ "") \ ELEM_(Fl_Font, TxFontnbr, "TXFONTNBR", \ "TX text font index", \ FL_HELVETICA) \ ELEM_(int, TxFontsize, "TXFONTSIZE", \ "TX text font size", \ 16) \ ELEM_(Fl_Color, TxFontcolor, "TXFNTCOLOR", \ "TX text font color", \ FL_BLACK) \ ELEM_(RGB, RxColor, "RXFONTCOLOR", \ "RX text font color (RGB)", \ { 255, 242, 190 }) \ ELEM_(RGB, TxColor, "TXFONTCOLOR", \ "TX text font color (RGB)", \ { 200, 235, 255 }) \ ELEM_(Fl_Color, XMITcolor, "XMITCOLOR", \ "Color for Transmit text style", \ FL_RED) \ ELEM_(Fl_Color, CTRLcolor, "CTRLCOLOR", \ "Color for Control text style", \ FL_DARK_GREEN) \ ELEM_(Fl_Color, SKIPcolor, "SKIPCOLOR", \ "Color for Skipped text style", \ FL_BLUE) \ ELEM_(Fl_Color, ALTRcolor, "ALTRCOLOR", \ "Color for Alternate text style", \ FL_DARK_MAGENTA) \ ELEM_(Fl_Color, LowSignal, "LOWSIGNAL", \ "Color for low signal level", \ FL_BLACK) \ ELEM_(Fl_Color, NormSignal, "NORMSIGNAL", \ "Color for normal signal level", \ FL_GREEN) \ ELEM_(Fl_Color, HighSignal, "HIGHSIGNAL", \ "Color for high signal level", \ FL_YELLOW) \ ELEM_(Fl_Color, OverSignal, "OVERSIGNAL", \ "Color for over driven signal", \ FL_RED) \ ELEM_(std::string, WaterfallFontName, "WATERFALLFONTNAME", \ "Waterfall font name", \ "") \ ELEM_(Fl_Font, WaterfallFontnbr, "WATERFALLFONTNBR", \ "Waterfall font number", \ FL_HELVETICA) \ ELEM_(int, WaterfallFontsize, "WATERFALLFONTSIZE", \ "Waterfall font size", \ 12) \ ELEM_(Fl_Color, LOGGINGtextcolor, "LOGGINGTEXTCOLOR", \ "Text color in logging controls", \ FL_BLACK) \ ELEM_(Fl_Color, LOGGINGcolor, "LOGGINGCOLOR", \ "Background color in logging controls", \ FL_BACKGROUND2_COLOR) \ ELEM_(std::string, LOGGINGfontname, "LOGGINGTEXTNAME", \ "LOGGING text font name", \ "") \ ELEM_(Fl_Font, LOGGINGtextfont, "LOGGINGTEXTFONT", \ "Logging Controls font number", \ FL_HELVETICA) \ ELEM_(int, LOGGINGtextsize, "LOGGINGTEXTSIZE", \ "Logging Controls font size", \ 12) \ ELEM_(Fl_Color, LOGBOOKtextcolor, "LOGBOOKTEXTCOLOR", \ "Text color in logbook dialog", \ FL_BLACK) \ ELEM_(Fl_Color, LOGBOOKcolor, "LOGBOOKCOLOR", \ "Background color in logbook dialog", \ FL_BACKGROUND2_COLOR) \ ELEM_(std::string, LOGBOOKtextname, "LOGBOOKTEXTNAME", \ "Logbook text font name", \ "") \ ELEM_(Fl_Font, LOGBOOKtextfont, "LOGBOOKTEXTFONT", \ "Logbook dialog controls font number", \ FL_HELVETICA) \ ELEM_(int, LOGBOOKtextsize, "LOGBOOKTEXTSIZE", \ "Logbook dialog controls font size", \ 12) \ ELEM_(std::string, FreqControlFontName, "FREQCONTROLFONTNAME", \ "Frequency Control font name", \ "") \ ELEM_(Fl_Font, FreqControlFontnbr, "FREQCONTROLFONTNBR", \ "Frequency Control font number", \ FL_HELVETICA) \ ELEM_(std::string, ui_scheme, "UISCHEME", \ "FLTK UI scheme (none or base, gtk+, plastic)", \ "gtk+") \ ELEM_(int, ui_language, "UILANGUAGE", \ "UI language", \ 0) \ ELEM_(bool, wf_audioscale, "WFAUDIOSCALE", \ "Always show audio frequencies on waterfall", \ true) \ /* Freq Display colors */ \ ELEM_(RGB, FDbackground, "FDBACKGROUND", \ "Frequency display background color", \ { 255, 253, 222 }) \ ELEM_(RGB, FDforeground, "FDFOREGROUND", \ "Frequency display foreground color", \ { 0, 0, 0 }) \ /* S-meter and Power-meter */ \ ELEM_(RGB, Smeter_bg_color, "SMETERBG", \ "S-meter background color", \ { 255, 253, 222 }) \ ELEM_(RGB, Smeter_scale_color, "SMETERSCALECOLOR", \ "S-meter scale color", \ { 0, 0, 0 }) \ ELEM_(RGB, Smeter_meter_color, "SMETERMETERCOLOR", \ "S-meter meter color", \ { 0, 200, 0 }) \ ELEM_(RGB, PWRmeter_bg_color, "PWRMETERBGD", \ "Power meter background color", \ { 255, 253, 222 }) \ ELEM_(RGB, PWRmeter_scale_color, "PWRMETERSCALECOLOR", \ "Power meter scale color", \ { 0, 0, 0 }) \ ELEM_(RGB, PWRmeter_meter_color, "PWRMETERMETERCOLOR", \ "Power meter meter color", \ { 200, 0, 0 }) \ ELEM_(int, PWRselect, "PWRSELECT", \ "Power meter type:\n" \ " 0: 25 W, 1: 50 W, 2: 100 W, 3: 200 W, 4: AUTO", \ 4) \ /* Tab selection color */ \ ELEM_(Fl_Color, TabsColor, "TABSCOLOR", \ "UI tabs color", \ FL_BACKGROUND2_COLOR) \ /* Signal Viewer */ \ ELEM_(bool, VIEWERascend, "VIEWERASCEND", \ "Low frequency on bottom of viewer", \ true) \ ELEM_(bool, VIEWERmarquee, "VIEWERMARQUEE", \ "Signal Viewer text continuous scrolling", \ true) \ ELEM_(bool, VIEWERsort, "VIEWERSORT", \ "Signal Viewer sort after channel changes- unused", \ false) \ ELEM_(bool, VIEWERhistory, "VIEWERHISTORY", \ "Signal Viewer playback history on select", \ false) \ ELEM_(bool, VIEWERfixed, "VIEWERfixed", \ "Signal Viewer data displayed on fixed 100 Hz intervals", \ true) \ ELEM_(int, VIEWERlabeltype, "VIEWERSHOWFREQ", \ "Signal Viewer label type. Values are as follows:\n" \ " 0: None; 1: Audio freq; 2: Radio freq; 2: Channel #.", \ VIEWER_LABEL_RF) \ ELEM_(int, VIEWERchannels, "VIEWERCHANNELS", \ "Number of Signal Viewer Channels", \ 30) \ ELEM_(int, VIEWERwidth, "VIEWERWIDTH", \ "Width of viewer (% of full panel width)", \ 25) \ ELEM_(int, VIEWERtimeout, "VIEWERTIMEOUT", \ "Signal Viewer inactivity timeout (to clear text)", \ 15) \ ELEM_(std::string, ViewerFontName, "VIEWERFONTNAME", \ "Signal Viewer font name", \ "") \ ELEM_(Fl_Font, ViewerFontnbr, "VIEWERFONTNBR", \ "Signal Viewer font index", \ FL_HELVETICA) \ ELEM_(int, ViewerFontsize, "VIEWERFONTSIZE", \ "Signal Viewer font size", \ FL_NORMAL_SIZE) \ \ ELEM_(Fl_Color, Sql1Color, "SQL1COLOR", \ "UI SQL button select color 1", \ FL_YELLOW) \ ELEM_(Fl_Color, Sql2Color, "SQL2COLOR", \ "UI SQL button select color 2", \ FL_GREEN) \ ELEM_(Fl_Color, AfcColor, "AFCCOLOR", \ "UI AFC button select color", \ FL_GREEN) \ ELEM_(Fl_Color, LkColor, "LKCOLOR", \ "UI Lk xmt frequ select color", \ FL_GREEN) \ ELEM_(Fl_Color, RevColor, "REVCOLOR", \ "UI Rev select color", \ FL_GREEN) \ ELEM_(Fl_Color, XmtColor, "XMTCOLOR", \ "UI T/R select color", \ FL_RED) \ ELEM_(Fl_Color, SpotColor, "SPOTCOLOR", \ "UI Spot select color", \ FL_GREEN) \ ELEM_(Fl_Color, RxIDColor, "RXIDCOLOR", \ "UI RxID select color", \ FL_GREEN) \ ELEM_(Fl_Color, RxIDwideColor, "RXIDWIDECOLOR", \ "UI RxID WIDE search select color", \ FL_DARK_RED) \ ELEM_(Fl_Color, TxIDColor, "TXIDCOLOR", \ "UI TxID select color", \ FL_GREEN) \ ELEM_(Fl_Color, TuneColor, "TUNECOLOR", \ "UI Tune select color", \ FL_RED) \ ELEM_(Fl_Color, default_btn_color, "DEFAULTBTNCOLOR", \ "Default color of lighted buttons", \ FL_GREEN) \ ELEM_(Fl_Color, default_check_btn_color, "DEFAULTCHECKBTNCOLOR", \ "Default color of check buttons", \ FL_YELLOW) \ ELEM_(Fl_Color, default_round_btn_color, "DEFAULTROUNDBTNCOLOR", \ "Default color of round buttons", \ FL_GREEN) \ /* XMLRPC LOGBOOK server */ \ ELEM_(bool, xml_logbook, "XML_LOGBOOK", \ "Try to open remote xml logbook", \ false) \ ELEM_(std::string, xmllog_address, "XMLLOG_ADDRESS", \ "Logbook server address", \ "127.0.0.1") \ ELEM_(std::string, xmllog_port, "XMLLOG_PORT", \ "Logbook server port", \ "8421") \ \ ELEM_(bool, check_for_updates, "CHECK_FOR_UPDATES", \ "Check for updates when starting program", \ false) \ /* XML-RPC/ARQ/KISS servers */ \ ELEM_(std::string, xmlrpc_address, "XMLRPC_ADDRESS", \ "IP Address of XMLRPC Socket", \ DEFAULT_XMLPRC_IP_ADDRESS) \ ELEM_(std::string, xmlrpc_port, "XMLRPC_PORT", \ "IP port number of XMLRPC socket", \ DEFAULT_XMLRPC_IP_PORT) \ ELEM_(std::string, xmlrpc_allow, "", "", "") \ ELEM_(std::string, xmlrpc_deny, "", "", "") \ ELEM_(int, rx_msgid, "", "", 9876) \ ELEM_(int, tx_msgid, "", "", 6789) \ ELEM_(std::string, arq_address, "ARQ_ADDRESS", \ "IP Address of ARQ socket", \ DEFAULT_ARQ_IP_ADDRESS) \ ELEM_(std::string, arq_port, "ARQ_PORT", \ "IP port number of ARQ socket", \ DEFAULT_ARQ_IP_PORT) \ ELEM_(std::string, kiss_address, "KISS_ADDRESS", \ "IP Address of KISS socket", \ DEFAULT_KISS_IP_ADDRESS) \ ELEM_(std::string, kiss_io_port, "KISS_IO_PORT", \ "IP port number of KISS socket", \ DEFAULT_KISS_IP_IO_PORT) \ ELEM_(std::string, kiss_out_port, "KISS_OUT_PORT", \ "Out udp port used when ip address is the same", \ DEFAULT_KISS_IP_OUT_PORT) \ ELEM_(int, kiss_dual_port_enabled, "KISS_DUAL_PORT_ENABLED", \ "Required when same IP address is used.", \ 0) \ ELEM_(int, data_io_enabled, "DATA_IO_ENABLED", \ "Disabled (0) ARQ socket enabled (1) KISS socket enabled (2)", \ 1) \ ELEM_(bool, ax25_decode_enabled, "AX25_DECODE_ENABLED", \ "Dissasemble AX25 packet into human readable form", \ false) \ ELEM_(bool, enableBusyChannel, "ENABLE_BUSY_CHANNEL", \ "Detect busy channel and wait for a period of time before txing", \ false) \ ELEM_(int, busyChannelSeconds, "BUSY_CHANNEL_SECONDS", \ "Number of seconds to wait before transmit resume", \ 3) \ ELEM_(bool, show_psm_btn, "SHOW_PSM_BTN", \ "Display / Enable PSM button on main dialog", \ false) \ ELEM_(int, kpsql_attenuation, "KPSQL_ATTENUATION", \ "KPSQL Attenuation in 1/n of 1:1 Gain", \ 2) \ ELEM_(bool, csma_enabled, "CSMA_ENABLED", \ "Use CSMA on heavy traffic channels (AX25)", \ true) \ ELEM_(bool, kiss_tcp_io, "KISS_TCP_IO", \ "Connect kiss io via TCP/IP vise UDP/IP", \ false) \ ELEM_(bool, kiss_tcp_listen, "KISS_TCP_LISTEN", \ "Listen for TCP connection (Server mode)", \ false) \ ELEM_(bool, kpsql_enabled, "KPSQL_ENABLED", \ "Enable/Disable PSM", \ false) \ ELEM_(bool, tcp_udp_auto_connect, "TCP_UDP_AUTO_CONNECT", \ "Make Connect Attemp on Fldigi Start", \ false) \ ELEM_(int, csma_persistance, "CSMA_PERSISTANCE", \ "CSMA Persistance", \ 63) \ ELEM_(int, csma_slot_time, "CSMA_SLOT_TIME", \ "CSMA Slot Time", \ 10) \ ELEM_(int, csma_transmit_delay, "CSMA_TRANSMIT_DELAY", \ "CSMA Transit Delay", \ 50) \ ELEM_(int, psm_flush_buffer_timeout, "PSM_FLUSH_BUFFER_TIMEOUT", \ "Flush buffer timout", \ 15) \ ELEM_(int, psm_minimum_bandwidth, "PSM_MINIMUM_BANDWIDTH", \ "PSM minimum measured bandwidth", \ 100) \ ELEM_(int, psm_minimum_bandwidth_margin, "PSM_MINIMUM_BANDWIDTH_MARGIN", \ "PSM minimum measured bandwidth margin", \ 10) \ ELEM_(bool, psm_use_histogram, "PSM_USE_HISTOGRAM", \ "Histogram threshold", \ false) \ ELEM_(int, psm_histogram_offset_threshold, "PSM_HISTOGRAM_OFFSET_THRESHOLD", \ "Histogram theshold referece level", \ 3) \ ELEM_(int, psm_hit_time_window, "PSM_HIT_TIME_WINDOW", \ "Valid signal test rate (milliseconds)", \ 15) \ ELEM_(int, tx_buffer_timeout, "TX_BUFFER_TIMEOUT", \ "Transmit buffer timeout (minutes)", \ 15) \ ELEM_(bool, kiss_io_modem_change_inhibit, "KISS_IO_MODEM_CHANGE_INHIBIT", \ "Enable/Disable Modem Change to a non 8 bit when KISS IO is in use", \ false) \ ELEM_(std::string, flrig_ip_address, "FLRIG_IP_ADDRESS", \ "IP Address of flrig server", \ DEFAULT_FLRIG_IP_ADDRESS) \ ELEM_(std::string, flrig_ip_port, "FLRIG_IP_PORT", \ "IP port number of flrig server", \ DEFAULT_FLRIG_IP_PORT) \ ELEM_(bool, show_all_codes, "SHOW_ALL_CODES", \ "Display all rx char's using ascii3 table", \ false) \ /* PSK reporter */ \ ELEM_(bool, pskrep_autostart, "PSKREP_AUTOSTART", \ "Enable to start pskrep interface when starting fldigi", \ false) \ ELEM_(bool, usepskrep, "USEPSKREP", \ "(Set by fldigi)", \ false) \ ELEM_(bool, pskrep_auto, "PSKREPAUTO", \ "Report callsigns spotted in received text", \ false) \ ELEM_(bool, pskrep_log, "PSKREPLOG", \ "Report callsigns in logged QSOs", \ false) \ ELEM_(bool, pskrep_qrg, "PSKREPQRG", \ "Include rig frequency in reception report", \ false) \ ELEM_(bool, report_when_visible, "REPORTWHENVISIBLE", \ "Enable Reporter ONLY when a signal browser is visible", \ false) \ ELEM_(std::string, pskrep_host, "PSKREPHOST", \ "Reception report server address", \ "report.pskreporter.info") \ ELEM_(std::string, pskrep_port, "PSKREPPORT", \ "Reception report server port", \ "4739") \ /* WEFAX configuration items */ \ ELEM_(double, wefax_slant, "WEFAXSLANT", \ "Slant correction for wefax Rx", \ 0.0) \ ELEM_(std::string, wefax_save_dir, "WEFAXSAVEDIR", \ "Target directory for storing automatically received images storage", \ "") \ ELEM_(std::string, wefax_load_dir, "WEFAXLOADDIR", \ "Source directory for sending images", \ "") \ ELEM_(int, wefax_filter, "WEFAXFILTER", \ "Input filter for image reception", \ 0) \ ELEM_(bool, wefax_autocenter, "WEFAX_AUTOCENTER", \ "Enable image autocentering", \ true) \ ELEM_(bool, WEFAX_HideTx, "WEFAXHIDETX", \ "Hide transmission window", \ true) \ ELEM_(int, WEFAX_Shift, "WEFAXSHIFT", \ "Shift (Standard 800Hz)", \ 800 ) \ ELEM_(int, WEFAX_Center, "WEFAXCENTER", \ "Signal centered on freq (Standard 1900Hz)", \ 1900 ) \ ELEM_(int, WEFAX_MaxRows, "WEFAXMAXROWS", \ "Received fax maximum number of rows\n" \ "1200 rows standard for IOC576 transmission.", \ 4000 ) \ ELEM_(int, WEFAX_NoiseMargin, "WEFAXNOISEMARGIN", \ "Pixel margin for noise removal", \ 1 ) \ ELEM_(int, WEFAX_NoiseThreshold, "WEFAXNOISETHRESHOLD", \ "Threshold level for noise detection and removal", \ 5 ) \ ELEM_(double, wefax_correlation, "WEFAX_CORRELATION", \ "Threshold level for signal detection", \ 0.05 ) \ ELEM_(int, wefax_correlation_rows, "WEFAX_CORR_ROWS", \ "Compute correlation on NN (2 ... 25)", \ 15 ) \ ELEM_(bool, WEFAX_AdifLog, "WEFAXADIFLOG", \ "Logs wefax file names in Adif log file", \ false) \ ELEM_(int, wefax_auto_after, "WEFAX_auto_after", \ "Enable autoalign after NN rows", \ 30 ) \ ELEM_(int, wefax_align_stop, "WEFAX_align_stop", \ "Stop auto alignment after NN rows", \ 500 ) \ ELEM_(int, wefax_align_rows, "WEFAX_align_rows", \ "Enable autoalign every NN rows", \ 10 ) \ /* NAVTEX configuration items */ \ ELEM_(bool, NVTX_AdifLog, "NAVTEXADIFLOG", \ "Logs Navtex messages in Adig log file", \ false) \ ELEM_(bool, NVTX_KmlLog, "NAVTEXKMLLOG", \ "Logs Navtex messages to KML document", \ false) \ ELEM_(int, NVTX_MinSizLoggedMsg, "NAVTEXMINSIZLOGGEDMSG", \ "Minimum length of logged messages", \ 0 ) \ /* WX fetch from NOAA */ \ ELEM_(std::string, wx_url, "WX_URL", \ "Internet URL used to fetch METAR data using wget symbology", \ "http://tgftp.nws.noaa.gov/data/observations/metar/decoded/" ) \ ELEM_(std::string, wx_eoh, "WX_EOH", \ "Text at end of METAR report header\n" \ "default = Connection: close", \ "Connection: close") \ ELEM_(std::string, wx_sta, "WX_STA", \ "4 letter specifier for wx station", \ "KMDQ") \ ELEM_(bool, wx_condx, "WX_CONDX", \ "Weather conditions", \ true) \ ELEM_(bool, wx_fahrenheit, "WX_FAHRENHEIT", \ "Report in Fahrenheit", \ true) \ ELEM_(bool, wx_celsius, "WX_CELSIUS", \ "Report in Celsius", \ true) \ ELEM_(bool, wx_mph, "WX_MPH", \ "Report speed in miles per hour", \ true) \ ELEM_(bool, wx_kph, "WX_KPH", \ "Report speed in kilometers per hour", \ true) \ ELEM_(bool, wx_inches, "WX_INCHES", \ "Report pressure in inches of mercury", \ true) \ ELEM_(bool, wx_mbars, "WX_MBARS", \ "Report pressure in millibars", \ true) \ ELEM_(bool, wx_full, "WX_FULL", \ "Use complete METAR report", \ true) \ ELEM_(bool, wx_station_name, "WX_STATION_NAME", \ "Report station noun name", \ true) \ ELEM_(bool, wx_raw, "WX_RAW", \ "Unparsed METAR report", \ true) \ /* KML Keyhole Markup Language */ \ ELEM_(bool, kml_purge_on_startup, "KML_PURGE_ON_STARTUP", \ "Purge KML data at startup", \ false) \ ELEM_(std::string, kml_save_dir, "KML_SAVE_DIR", \ "Destination directory for generated KML documents", \ "") \ ELEM_(std::string, kml_command, "KML_COMMAND", \ "Command executed when creating KML files", \ "") \ ELEM_(int, kml_merge_distance, "KML_MERGE_DISTANCE", \ "Minimum distance for splitting alias nodes", \ 10000) \ ELEM_(int, kml_retention_time, "KML_RETENTION_TIME", \ "Number of hours for keeping data in each node", \ 0) \ ELEM_(int, kml_refresh_interval, "KML_REFRESH_INTERVAL", \ "Refresh interval written in KML files (In seconds)", \ 120) \ ELEM_(int, kml_balloon_style, "KML_BALLOON_STYLE", \ "KML balloons data displayed as text, HTML tables, HTML single matrix", \ 2) \ ELEM_(double, cnt_dft_range, "cnt_dft_range", \ "Display range in dB for dft scan modem", \ 60.0) \ ELEM_(int, cnt_dft_scans, "cnt_dft_scans", \ "Number of scans over which the average signal level is measured.", \ 100) \ ELEM_(bool, dft_relative, "dft_relative", \ "Plot vertical scale as dB relative to maximum value", \ false) \ ELEM_(std::string, auto_flrig_pathname, "AUTO_FLRIG_PATHNAME", \ "Full pathname to the flrig executable", \ "") \ ELEM_(std::string, auto_flamp_pathname, "AUTO_FLAMP_PATHNAME", \ "Full pathname to the flamp executable", \ "") \ ELEM_(std::string, auto_flnet_pathname, "AUTO_FLNET_PATHNAME", \ "Full pathname to the flnet executable", \ "") \ ELEM_(std::string, auto_fllog_pathname, "AUTO_FLLOG_PATHNAME", \ "Full pathname to the fllog executable", \ "") \ ELEM_(std::string, auto_prog1_pathname, "AUTO_PROG1_PATHNAME", \ "Full pathname to the prog1 executable", \ "") \ ELEM_(std::string, auto_prog2_pathname, "AUTO_PROG2_PATHNAME", \ "Full pathname to the prog2 executable", \ "") \ ELEM_(std::string, auto_prog3_pathname, "AUTO_PROG3_PATHNAME", \ "Full pathname to the prog3 executable", \ "") \ ELEM_(bool, flrig_auto_enable, "FLRIG_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, flnet_auto_enable, "FLNET_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, fllog_auto_enable, "FLLOG_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, flamp_auto_enable, "FLAMP_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, prog1_auto_enable, "PROG1_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, prog2_auto_enable, "PROG2_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(bool, prog3_auto_enable, "PROG3_AUTO_ENABLE", \ "Enable on program start", \ false) \ ELEM_(int, sel_lsd, "SEL_LSD", \ "Frequency control by keyboard arrow keys\n" \ "Least significant digit are left/right keys\n" \ "0 : 1 Hz, 1 : 10 Hz, 2 : 100 Hz, 3 : 1000 Hz", \ 0) \ ELEM_(int, macro_height, "MACRO_HEIGHT", \ "Height of macro bar\n" \ "22 .. 66, default = 22, step size 2", \ 22) \ ELEM_(bool, rxtx_swap, "RXTX_SWAP", \ "Enabled, Tx above Rx panel\n" \ "Disable, Rx above Tx panel (default", \ false) \ ELEM_(bool, view_smeter, "VIEW_SMETER", \ "Enabled, View smeter & power meter\n" \ "Disable, (default)", \ false) \ ELEM_(std::string, MacroEditFontName, "MACROEDITORFONTNAME", \ "Macro editor font name", \ "") \ ELEM_(Fl_Font, MacroEditFontnbr, "MACROEDITFONTNBR", \ "RX text font index", \ FL_HELVETICA) \ ELEM_(bool, us_units, "US_UNITS", \ "Use US units of distance for QRB", \ false) \ ELEM_(int, MacroEditFontsize, "MACROEDITFONTSIZE", \ "RX text font size", \ 16) \ ELEM_(bool, psk8DCDShortFlag, "PSK8DCDSHORTFLAG", \ "Flag: Change DCD pre-ample length", \ false) \ ELEM_(bool, display_48macros, "DISPLAY_48MACROS", \ "Allow dockable macros", \ false) \ ELEM_(double, fftviewer_maxdb, "fftviewer_maxdb", \ "Upper axis in dB for spectrum viewer", \ 0.0) \ ELEM_(double, fftviewer_range, "fftviewer_range", \ "Display range in dB for spectrum viewer", \ 60.0) \ ELEM_(int, fftviewer_scans, "fftviewer_scans", \ "Number of scans over which the average signal level is measured.", \ 100) \ ELEM_(double, fftviewer_fcenter, "fftviewer_fcenter", \ "Scan center frequency in Hertz", \ 2000.0) \ ELEM_(double, fftviewer_frng, "fftviewer_frng", \ "Frequency scan range in Hertz", \ 4000.0) \ ELEM_(int, wf_spectrum_range, "wf_spectrum_range", \ "Initial spectrum range", \ 500) \ ELEM_(bool, wf_spectrum_center, "wf_spectrum_center", \ "left click on waterfall transfers to spectrum center", \ true) \ ELEM_(bool, wf_spectrum_modem_scale, "wf_spectrum_modem_scale", \ "scale spectrum display frequency linked to modem bandwidth", \ true) \ ELEM_(int, wf_spectrum_scale_factor, "spectrum_scale_factor", \ "scale factor for spectrum display linked to modem bandwidth", \ 5) \ ELEM_(bool, wf_spectrum_dbvals, "wf_spectrum_dbvals", \ "use waterfall db range and offset values for spectrum scope", \ true) \ ELEM_(int, FMT_sr, "FMT_sr", \ "FMT sample rate\n" \ "0:8000, 1:11025, 2:12000, 3:16000, 4:22050, 5:32000, 6:44100, 7:48000", \ 1) \ ELEM_(int, FMT_dft_rate, "FMT_dft_rate", \ "FMT DFT conversions per second", \ 3) \ ELEM_(bool, FMT_reverse, "FMT_reverse", \ "Reverse time axis", \ false) \ ELEM_(bool, FMT_thick_lines, "FMT_thick_lines", \ "Plot axis/lines with 2 pixel width", \ false) \ ELEM_(bool, FMT_plot_over_axis, "FMT_plot_over_axis", \ "Plot points lie on top of axis graticule", \ false) \ ELEM_(double, FMT_freq_corr, "FMT_freq_corr", \ "FMT freq track correction in Hertz", \ 0.0) \ ELEM_(double, FMT_filter, "FMT_filter", \ "FMT FIR lpf 3db cutoff in Hertz", \ 4.0) \ ELEM_(double, FMT_bpf_width, "FMT_bpf_width", \ "FMT FIR bpf 3db cutoff in Hertz", \ 20.0) \ ELEM_(bool, FMT_unk_bpf_on, "FMT_unk_bpf_on", \ "Enable unknown bandpass filter", \ false) \ ELEM_(bool, FMT_ref_bpf_on, "FMT_ref_bpf_on", \ "Enable reference bandpass filter", \ false) \ ELEM_(double, FMT_movavg_len, "FMT_movavg_len", \ "FMT moving average filter length in seconds", \ 4.0) \ ELEM_(double, FMT_prefilter, "FMT_prefilter", \ "Experimental first-order prefilter", \ 0.95) \ ELEM_(bool, FMT_prefilter_on, "FMT_prefilter_on", \ "Enable FMT prefilter", \ false) \ ELEM_(double, FMT_cull_level, "FMT_cull_level", \ "Experimental data culling", \ 10.0) \ ELEM_(bool, FMT_cull_on, "FMT_cull_on", \ "Enable data culling", \ false) \ ELEM_(double, FMT_HL_level, "FMT_HL_level", \ "Experimental DFT hardlimit level", \ 1.0) \ ELEM_(bool, FMT_HL_on, "FMT_HL_on", \ "Enable DFT hardlimiter", \ false) \ ELEM_(bool, FMT_dft_cull_on, "FMT_dft_cull_on", \ "Enable DFT culling", \ false) \ ELEM_(Fl_Color, FMT_background, "FMT_background", \ "Color for FMT plot background", \ FL_BACKGROUND2_COLOR) \ ELEM_(Fl_Color, FMT_unk_color, "FMT_unk_color", \ "Color for FMT unknown data plot", \ FL_DARK_BLUE) \ ELEM_(Fl_Color, FMT_ref_color, "FMT_ref_color", \ "Color for FMT reference data plot", \ FL_GREEN) \ ELEM_(Fl_Color, FMT_legend_color, "FMT_legend_color", \ "Color for FMT legends", \ FL_BLACK) \ ELEM_(Fl_Color, FMT_axis_color, "FMT_axis_color", \ "Color for FMT plot axis", \ FL_BLACK) \ ELEM_(bool, FMT_use_tabs, "fmt_use_tabs", \ "Use TAB delimiters in exported csv file", \ false) \ ELEM_(bool, fmt_center_on_unknown, "fmt_center_on_unknown", \ "Waterfall centered on unknown", \ false) \ ELEM_(bool, fmt_center_on_reference, "fmt_center_on_reference", \ "Waterfall centered on reference", \ false) \ ELEM_(bool, fmt_center_on_median, "fmt_center_on_median", \ "Waterfall centered on median", \ true) \ ELEM_(bool, fmt_sync_wav_file, "fmt_sync_wav_file", \ "Sound wav file record sync'd to csv file", \ false) \ ELEM_(double, FMT_freq_err, "FMT_freq_err", \ "limit to frequency error before automatic reset", \ 2.0) \ /* save operating parameters by mode and band */ \ ELEM_(bool, sqlch_by_mode, "SQLCH_BY_MODE", \ "Save/restore SQUELCH on per mode basis", \ true) \ ELEM_(bool, txlevel_by_mode, "TXLEVEL_BY_MODE", \ "Save/restore TXLEVEL on per mode basis", \ true) \ ELEM_(bool, afc_by_mode, "AFC_BY_MODE", \ "Save/restore AFC on per mode basis", \ true) \ ELEM_(bool, reverse_by_mode, "REVERSE_BY_MODE", \ "Save/restore REVERSE on per mode basis", \ true) \ // declare the struct #define ELEM_DECLARE_CONFIGURATION(type_, var_, tag_, ...) type_ var_; #undef ELEM_ #define ELEM_ ELEM_DECLARE_CONFIGURATION struct configuration { CONFIG_LIST void writeDefaultsXML(); void storeDefaults(); bool readDefaultsXML(); void loadDefaults(); void saveDefaults(); int setDefaults(); void resetDefaults(void); static void reset(void); void initInterface(); void testCommPorts(); const char* strBaudRate(); int BaudRate(size_t); int nBaudRate(const char *); void initFonts(void); }; extern configuration progdefaults; extern Fl_Font font_number(const char* name); enum { SAMPLE_RATE_UNSET = -1, SAMPLE_RATE_AUTO, SAMPLE_RATE_NATIVE, SAMPLE_RATE_OTHER }; #endif fldigi-4.2.05/src/include/vumeter.h0000664000175000017500000000515314611711171014041 00000000000000// // vumeter.h // // vumeter bar widget routines. // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _VUMETER_H #define _VUMETER_H // // Include necessary headers. // #include #include #include // // vumeter class... // class vumeter : public Fl_Widget { private: double value_, minimum_, maximum_, peakv_, peak_[10], vals_[10]; int avg_; int aging_; Fl_Color bgnd_; Fl_Color fgnd_; Fl_Color scale_color; Fl_Color peak_color; static const char *meter_face_A; static const char *meter_face_B; const char *meter_face; void (*cbFunc)(Fl_Widget *, void *); protected: virtual void draw(); public: vumeter(int x, int y, int w, int h, const char *label = ""); void maximum(double v) { maximum_ = v; redraw(); } double maximum() const { return (maximum_); } void minimum(double v) { minimum_ = v; redraw(); } double minimum() const { return (minimum_); } void value(double v); double value(); void aging (int n); void avg (int n); void clear(); void set_background(Fl_Color c1) { bgnd_ = c1; redraw(); } void set_metercolor(Fl_Color c2) { fgnd_ = c2; redraw(); } void set_scalecolor(Fl_Color c3) { scale_color = c3; redraw(); } void set_peakcolor(Fl_Color c4) { peak_color = c4; redraw(); } int handle(int e) { if (Fl::event_inside( this )) { if (e == FL_RELEASE) { do_callback(); return 1; } } return 0; } void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } void wsjtx_meter_face (bool on) { if (on) { meter_face = meter_face_B; minimum_ = 0.0; maximum_ = 90.0; value_ = 50; } else { meter_face = meter_face_A; minimum_ = -100.0; maximum_ = 0.0; value_ = -50; } } }; #endif // !vumeter fldigi-4.2.05/src/include/flinput2.h0000664000175000017500000000300714611711171014111 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_INPUT2_ #define FL_INPUT2_ #include #include "config.h" class Fl_Input2 : public Fl_Input { private: int ascii_cnt; // restart the numeric keypad entries. int ascii_chr; // character value of ASCII > 0x80 int handle_key_ascii(int key); char *utf8text; int utf8cnt; public: Fl_Input2(int x, int y, int w, int h, const char* l = 0); int handle(int event); #if FLDIGI_FLTK_API_MINOR > 3 int position() { return Fl_Input::insert_position(); } int position(int p, int m) { return Fl_Input::insert_position(p, m); } int position(int p) { return Fl_Input::insert_position(p, p); } #endif }; #endif // FL_INPUT2_ fldigi-4.2.05/src/include/util.h0000664000175000017500000001631114611711171013325 00000000000000/* ----------------------------------------------------------------------------- * util.h -- included by config.h * * Copyright (C) 2007-2009 * Stelios Bounanos, M0GLD * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * ----------------------------------------------------------------------------- */ #ifndef UTIL_H #define UTIL_H // include the system defines #include "config.h" #ifdef __cplusplus extern "C" { #endif #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS #endif #ifndef __STDC_FORMAT_MACROS # define __STDC_FORMAT_MACROS 1 #endif #include #ifndef powerof2 # define powerof2(n) ((((n) - 1) & (n)) == 0) #endif #ifndef MAX # define MAX(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef MIN # define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif #ifndef CLAMP # define CLAMP(x, low, high) (((x)>(high))?(high):(((x)<(low))?(low):(x))) #endif #define WCLAMP(x, low, high) (((x)>(high))?(low):(((x)<(low))?(high):(x))) #ifdef __GNUC__ # if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) # define full_memory_barrier() __sync_synchronize() # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() # elif defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(__x86_64__) # define full_memory_barrier() asm volatile ("lock; addl $0,0(%%esp)":::"memory") # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() /* These would be faster on SSE2-capable processors: # define full_memory_barrier() asm volatile ("mfence":::"memory") # define read_memory_barrier() asm volatile ("lfence":::"memory") # define write_memory_barrier() asm volatile ("sfence":::"memory") */ # elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) # define full_memory_barrier() asm volatile("sync":::"memory") # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() # else # warning Memory barriers not defined on this system # define full_memory_barrier() ((void)0) # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() # endif #else # warning Memory barriers not defined on this system # define full_memory_barrier() ((void)0) # define read_memory_barrier() full_memory_barrier() # define write_memory_barrier() full_memory_barrier() #endif /* http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html */ #if defined(__GNUC__) && (__GNUC__ >= 3) # define likely(x) __builtin_expect (!!(x), 1) # define unlikely(x) __builtin_expect (!!(x), 0) # define used__ __attribute__ ((__used__)) # define unused__ __attribute__ ((__unused__)) # define must_check__ __attribute__ ((__warn_unused_result__)) # define deprecated__ __attribute__ ((__deprecated__)) # define noreturn__ __attribute__ ((__noreturn__)) # define pure__ __attribute__ ((__pure__)) # define const__ __attribute__ ((__const__)) # define malloc__ __attribute__ ((__malloc__)) # define packed__ __attribute__ ((__packed__)) # define inline__ inline __attribute__ ((__always_inline__)) # define noinline__ __attribute__ ((__noinline__)) # define nonnull__(x) __attribute__ ((__nonnull__(x))) # define format__(type_, index_, first_) __attribute__ ((format(type_, index_, first_))) #else # define likely(x) (x) # define unlikely(x) (x) # define used__ # define unused__ # define must_check__ # define deprecated__ # define noreturn__ # define pure__ # define const__ # define malloc__ # define packed__ # define inline__ # define noinline__ # define nonnull__(x) # define format__(type_, index_, first_) #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) # define hot__ __attribute__ ((__hot__)) # define cold__ __attribute__ ((__cold__)) #else # define hot__ # define cold__ #endif #include const__ uint32_t ceil2(uint32_t n); const__ uint32_t floor2(uint32_t n); #if !HAVE_STRNLEN size_t strnlen(const char* str, size_t len); #endif #if !HAVE_STRCASESTR char* strcasestr(const char* haystack, const char* needle); #endif #if !HAVE_STRLCPY size_t strlcpy(char* dest, const char* src, size_t size); #endif #if !HAVE_SETENV int setenv(const char *name, const char *value, int replace); #endif #if !HAVE_UNSETENV int unsetenv(const char *name); #endif int set_cloexec(int fd, unsigned char v); int set_nonblock(int fd, unsigned char v); int set_nodelay(int fd, unsigned char v); int get_bufsize(int fd, int dir, int* len); int set_bufsize(int fd, int dir, int len); unsigned long ver2int(const char* version); void save_signals(void); void restore_signals(void); void MilliSleep(long msecs); void NanoSleep(double msecs); #ifdef __cplusplus } // extern "C" #endif #ifdef __cplusplus uint32_t simple_hash_data(const unsigned char* buf, size_t len, uint32_t code = 0); uint32_t simple_hash_str(const unsigned char* str, uint32_t code = 0); #endif #ifdef __cplusplus const char* str2hex(const unsigned char* str, size_t len); const char* str2hex(const char* str, size_t len = 0); #else const char* str2hex(const unsigned* str, size_t len); #endif const char* uint2bin(unsigned u, size_t len); #if 0 && !defined(NDEBUG) && defined(deprecated__) && defined(__GNUC__) && !defined(__MINGW32__) #include #include deprecated__ typeof(sprintf) sprintf; /* there are far too many of these in the qrz code deprecated__ typeof(strcpy) strcpy; deprecated__ typeof(strcat) strcat; */ #endif #ifdef __WOE32__ # define NOMINMAX 1 #endif # define PATH_SEP "/" /// Unnamed sempahores are not supported on OS X (and named semaphores are broken on cygwin). #ifdef __APPLE__ # define USE_NAMED_SEMAPHORES 1 #else # define USE_NAMED_SEMAPHORES 0 #endif /// Returns 0 if a process is running, 0 if not there and -1 if the test cannot be made. int test_process(int pid); /// Starts a process and returns its pid, and -1 if error. Returns 0 if this cannot be made. int fork_process( const char * cmd ); /// Returns NULL if no error. const char * create_directory( const char * dir ); int directory_is_created( const char * dir ); // return current tick time in seconds extern double fsk_now(); // sub millisecond accurate sleep function // sleep_time in seconds extern int accu_sleep (double sleep_time); #endif /* UTIL_H */ /* Local Variables: mode: c++ c-file-style: "linux" End: */ fldigi-4.2.05/src/include/newinstall.h0000664000175000017500000000205614532252172014534 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef NEW_INSTALL_H #define NEW_INSTALL_H extern void create_new_macros(); extern void create_new_palettes(); extern void show_wizard(int argc = 0, char** argv = NULL); #endif fldigi-4.2.05/src/include/synop.h0000664000175000017500000000570114532252172013524 00000000000000// ---------------------------------------------------------------------------- // synop.h -- SYNOP decoding // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SYNOP_H #define _SYNOP_H // This tells how Synop data are serialized. class synop_callback { public: virtual ~synop_callback() {} ; // These methods could as well be pure virtual. virtual bool interleaved(void) const { return true; } virtual void print( const char * str, size_t nb, bool ) const = 0; virtual bool log_adif(void) const = 0; virtual bool log_kml(void) const = 0 ; }; // Implementation hidden in synop.cxx class synop { // When set, the output does not contain Synop sentences but only // the name of the regular expression which matched. It helps // for debugging because the output is independent of the locale. static bool m_test_mode ; public: static const synop_callback * ptr_callback ; template< class Callback > static void setup() { static const Callback cstCall = Callback(); ptr_callback = &cstCall ; }; static synop * instance(); static void regex_usage(void); virtual ~synop() {}; // It is used as a global object, the constructor does not do anything. virtual void init() = 0; virtual void cleanup() = 0; /// We should have a tempo as well. virtual void add(char c) = 0; // When Synop decoding is disabled. virtual void flush(bool finish_decoding) = 0; virtual bool enabled(void) const = 0; static bool GetTestMode(void) { return m_test_mode ; }; static void SetTestMode(bool test_mode) { m_test_mode = test_mode ; }; }; // gathers the various data files used for Synop decoding. struct SynopDB { // Loads the files from s given directory. static bool Init( const std::string & data_dir ); // For testing purpose. static const std::string & IndicatorToName( int wmo_indicator ); static const std::string IndicatorToCoordinates( int wmo_indicator ); // To Test the reading of our weather stations data files. static const std::string & BuoyToName( const char * buoy_id ); static const std::string & ShipToName( const char * ship_id ); static const std::string & JCommToName( const char * ship_id ); }; // ---------------------------------------------------------------------------- #endif // _SYNOP_H fldigi-4.2.05/src/include/dx_dialog.h0000664000175000017500000000714414611711171014306 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef dx_dialog_h #define dx_dialog_h #include #include #include extern Fl_Group *btn_select_host; #include "flinput2.h" extern Fl_Input2 *inp_dxcc_host_url; #include extern Fl_Button *btn_show_host_tab; extern Fl_Input2 *inp_dccc_host_port; extern Fl_Input2 *inp_dccc_login; extern Fl_Input2 *inp_dxcc_password; extern Fl_Button *btnDXCLUSTERpasswordShow; #include #include "status.h" extern Fl_Check_Button *btn_dxcc_connect; #include extern Fl_Box *lbl_dxc_connected; extern Fl_Check_Button *btn_dxc_auto_connect; #include extern Fl_Tabs *cluster_tabs; extern Fl_Group *tabDXclusterTelNetStream; #include "FTextView.h" extern FTextView *brws_tcpip_stream; extern void dxc_click_m1(Fl_Button*, void*); extern Fl_Button *dxc_macro_1; extern void dxc_click_m2(Fl_Button*, void*); extern Fl_Button *dxc_macro_2; extern void dxc_click_m3(Fl_Button*, void*); extern Fl_Button *dxc_macro_3; extern void dxc_click_m4(Fl_Button*, void*); extern Fl_Button *dxc_macro_4; extern void dxc_click_m5(Fl_Button*, void*); extern Fl_Button *dxc_macro_5; extern void dxc_click_m6(Fl_Button*, void*); extern Fl_Button *dxc_macro_6; extern void dxc_click_m7(Fl_Button*, void*); extern Fl_Button *dxc_macro_7; extern void dxc_click_m8(Fl_Button*, void*); extern Fl_Button *dxc_macro_8; extern Fl_Input2 *inp_dxcluster_cmd; extern Fl_Button *btn_cluster_spot; extern Fl_Button *btn_cluster_submit; extern Fl_Group *tabDXclusterReports; #include extern Fl_Browser *reports_header; extern Fl_Browser *brws_dx_cluster; extern Fl_Button *btn_dxc_cluster_clear; extern Fl_Check_Button *brws_order; extern Fl_Button *btn_cluster_spot2; extern Fl_Group *tabDXclusterConfig; extern Fl_Browser *brws_dxcluster_hosts; extern void dxcluster_hosts_select(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_select; extern void dxcluster_hosts_add(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_add; extern void dxcluster_hosts_delete(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_delete; extern void dxcluster_servers(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_servers; extern FTextEdit *ed_telnet_cmds; extern void dxcluster_hosts_load_setup(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_load_setup; extern void dxcluster_hosts_save_setup(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_save_setup; extern void dxcluster_hosts_send_setup(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_hosts_send_setup; extern Fl_Check_Button *btn_spot_when_logged; extern Fl_Check_Button *btn_dxc_hertz; #include extern Fl_Input *mlabel_1; extern Fl_Input2 *mtext_1; extern Fl_Input *mlabel_2; extern Fl_Input2 *mtext_2; extern Fl_Input *mlabel_3; extern Fl_Input2 *mtext_3; extern Fl_Input *mlabel_4; extern Fl_Input2 *mtext_4; extern Fl_Input *mlabel_5; extern Fl_Input2 *mtext_5; extern Fl_Input *mlabel_6; extern Fl_Input2 *mtext_6; extern Fl_Input *mlabel_7; extern Fl_Input2 *mtext_7; extern Fl_Input *mlabel_8; extern Fl_Input2 *mtext_8; extern void dxcluster_ar_help(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_ar_help; extern void dxcluster_cc_help(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_cc_help; extern void dxcluster_dx_help(Fl_Button*, void*); extern Fl_Button *btn_dxcluster_dx_help; extern Fl_Group *tabDXclusterHelp; extern FTextView *brws_dxc_help; extern Fl_Button *btn_dxc_help_query; extern Fl_Input2 *inp_help_string; extern Fl_Button *btn_dxc_help_clear; Fl_Double_Window* dxc_window(); #endif fldigi-4.2.05/src/include/mt63.h0000664000175000017500000000320714611711171013141 00000000000000// ---------------------------------------------------------------------------- // mt63.h // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef MT63_MODEM_H #define MT63_MODEM_H #include "dsp.h" #include "mt63base.h" #include "modem.h" class mt63 : public modem { #define TONE_AMP 0.8 private: int Interleave; int flush; int escape; bool long_integral; MT63tx *Tx; MT63rx *Rx; dspLevelMonitor *InpLevel; double_buff *InpBuff; double_buff *emptyBuff; bool flushbuffer; double maxval; public: mt63(trx_mode mode); ~mt63(); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); void rx_flush(); void set_freq(double); }; #endif fldigi-4.2.05/src/include/hid_win.h0000664000175000017500000001205414611711171013771 00000000000000/******************************************************* HIDAPI - Multi-Platform library for communication with HID devices. Alan Ott Signal 11 Software 8/22/2009 Copyright 2009, All Rights Reserved. At the discretion of the user of this library, this software may be licensed under the terms of the GNU General Public License v3, a BSD-Style license, or the original HIDAPI license as outlined in the LICENSE.txt, LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt files located at the root of the source distribution. These files may also be found in the public source code repository located at: https://github.com/libusb/hidapi . ********************************************************/ /** @file * @defgroup API hidapi API */ #ifndef HIDAPI_H__ #define HIDAPI_H__ #include #include #include #include #include #include #ifdef __MINGW32__ #include #include # ifndef _NTDEF_ typedef LONG NTSTATUS; # endif //#include #endif //#ifdef __CYGWIN__ //#include //#define _wcsdup wcsdup //#endif /* The maximum number of characters that can be passed into the HidD_Get*String() functions without it failing.*/ #define MAX_STRING_WCHARS 0xFFF /*#define HIDAPI_USE_DDK*/ #ifdef __cplusplus extern "C" { #endif #include #include #ifndef HIDAPI_USE_DDK #include #endif /* Copied from inc/ddk/hidclass.h, part of the Windows DDK. */ #define HID_OUT_CTL_CODE(id) \ CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) #define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) #define IOCTL_HID_GET_INPUT_REPORT HID_OUT_CTL_CODE(104) #ifdef __cplusplus } /* extern "C" */ #endif /** @brief Static/compile-time major version of the library. @ingroup API */ #define HID_API_VERSION_MAJOR 0 /** @brief Static/compile-time minor version of the library. @ingroup API */ #define HID_API_VERSION_MINOR 10 /** @brief Static/compile-time patch version of the library. @ingroup API */ #define HID_API_VERSION_PATCH 1 /* Helper macros */ #define HID_API_AS_STR_IMPL(x) #x #define HID_API_AS_STR(x) HID_API_AS_STR_IMPL(x) #define HID_API_TO_VERSION_STR(v1, v2, v3) HID_API_AS_STR(v1.v2.v3) /** @brief Static/compile-time string version of the library. @ingroup API */ #define HID_API_VERSION_STR HID_API_TO_VERSION_STR(HID_API_VERSION_MAJOR, HID_API_VERSION_MINOR, HID_API_VERSION_PATCH) struct hid_api_version { int major; int minor; int patch; }; class hid_device { public: HANDLE device_handle; BOOL blocking; USHORT output_report_length; unsigned char *write_buf; size_t input_report_length; USHORT feature_report_length; unsigned char *feature_buf; void *last_error_str; DWORD last_error_num; BOOL read_pending; char *read_buf; OVERLAPPED ol; OVERLAPPED write_ol; hid_device() { device_handle = INVALID_HANDLE_VALUE; blocking = TRUE; output_report_length = 0; write_buf = NULL; input_report_length = 0; feature_report_length = 0; feature_buf = NULL; last_error_str = NULL; last_error_num = 0; read_pending = FALSE; read_buf = NULL; memset(&ol, 0, sizeof(ol)); ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*initial state f=nonsignaled*/, NULL); memset(&write_ol, 0, sizeof(write_ol)); write_ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*inital state f=nonsignaled*/, NULL); } ~hid_device() { CloseHandle(ol.hEvent); CloseHandle(write_ol.hEvent); CloseHandle(device_handle); LocalFree(last_error_str); free(write_buf); free(feature_buf); free(read_buf); } void register_error(const char *op); int hid_write(const unsigned char *data, size_t length); int hid_read_timeout(unsigned char *data, size_t length, int milliseconds); int hid_read(unsigned char *data, size_t length); int hid_set_nonblocking(int nonblock); int hid_send_feature_report(const unsigned char *data, size_t length); int hid_get_feature_report(unsigned char *data, size_t length); int hid_get_input_report(unsigned char *data, size_t length); void hid_close(); std::string hid_get_manufacturer_string(); std::string hid_get_product_string(); std::string hid_get_serial_number_string(); int hid_get_indexed_string(int string_index, std::string string, size_t maxlen); const char * hid_error(); }; class hid_device_info { public: std::string path; unsigned short vendor_id; unsigned short product_id; unsigned short release_number; std::string str_serial_number; std::string str_manufacturer_string; std::string str_product_string; unsigned short usage_page; unsigned short usage; int interface_number; hid_device_info *next; hid_device_info() {} ~hid_device_info() {} }; hid_device * hid_open_path(std::string path); hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, std::string serial_number); hid_device_info *hid_enumerate(unsigned short vendor_id, unsigned short product_id); void hid_free_enumeration(hid_device_info *devs); int hid_init(void); int hid_exit(void); #endif fldigi-4.2.05/src/include/debug_dialog.h0000664000175000017500000000077214611711171014761 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef debug_dialog_h #define debug_dialog_h #include #include #include #include #include "debug.h" extern Fl_Choice *mnu_debug_level; #include extern Fl_Button *btn_clear_debug; #include extern Fl_Check_Button *source_code[15]; #include extern Fl_Browser *btext; Fl_Double_Window* debug_dialog(); #endif fldigi-4.2.05/src/include/rigxml.h0000664000175000017500000000736014611711171013656 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef XML_H #define XML_H #include #include #include struct MODE { std::string SYMBOL; std::string BYTES; MODE(std::string nm, std::string b) { SYMBOL = nm; BYTES = b;} MODE(std::string nm, char c) { SYMBOL = nm; BYTES += c;} }; struct BW { std::string SYMBOL; std::string BYTES; BW(std::string nm, std::string b) { SYMBOL = nm; BYTES = b;} BW(std::string nm, char c) { SYMBOL = nm; BYTES += c;} }; struct DATA { std::string dtype; int size; unsigned long long max; unsigned long long min; float resolution; bool reverse; int andmask; int shiftbits; void clear() { size = 0; dtype.clear(); max = 199999999; min = 0; resolution = 1.0; reverse = false; andmask = 0xFF; shiftbits = 0; } }; struct XMLIOS { std::string SYMBOL; int size; std::string str1; std::string str2; DATA data; int fill1; int fill2; std::string info; std::string ok; std::string bad; void clear() { SYMBOL.clear(); str1.clear(); str2.clear(); info.clear(); ok.clear(); bad.clear(); size = fill1 = fill2 = 0; data.clear(); } }; struct TAGS { const char *tag; void (*fp)(size_t &);}; struct PAIR { int val; int mtr; PAIR(int v, int s) { val = v; mtr = s; } void clear() {val = 0; mtr = 0; } }; struct XMLRIG { XMLRIG() { clear(); } std::string port; std::string rigTitle; int baud; int stopbits; bool dtr; bool dtrptt; bool rts; bool rtsptt; bool rtscts; bool restore_tio; int write_delay; int init_delay; int wait_for_device; int post_write_delay; int timeout; int retries; bool echo; bool cmdptt; bool vsp; bool logstr; int pollinterval; bool use_smeter; std::vector< PAIR > smeter; bool use_pwrmeter; std::vector< PAIR > pmeter; bool use_notch; std::vector< PAIR > notch; bool use_pwrlevel; std::vector< PAIR >pwrlevel; bool debug; bool noserial; bool ascii; bool xmlok; void clear() { port.clear(); baud = 1200; stopbits = 2; dtr = false; dtrptt = false; rts = false; rtsptt = false; rtscts = false; restore_tio = true; echo = false; cmdptt = false; vsp = false; logstr = false; write_delay = 0; init_delay = 0; wait_for_device = 0; post_write_delay = 50; timeout = 200; retries = 5; rigTitle = ""; pollinterval = 100; debug = false; noserial = false; ascii = false; xmlok = false; use_smeter = false; use_pwrmeter = false; use_pwrlevel = false; smeter.clear(); pmeter.clear(); pwrlevel.clear(); notch.clear(); } }; extern std::list commands; extern std::list reply; extern std::list lmodes; extern std::list lmodeCMD; extern std::list lmodeREPLY; extern std::list lbws; extern std::list lbwCMD; extern std::list lbwREPLY; extern std::list LSBmodes; extern XMLRIG xmlrig; extern bool readRigXML(); extern void selectRigXmlFilename(); extern void loadRigXmlFile(void); #endif fldigi-4.2.05/src/include/weather.h0000664000175000017500000000205514611711171014007 00000000000000// ---------------------------------------------------------------------------- // weather.cxx -- a part of fldigi // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef WEATHER_H #define WEATHER_H #include extern void getwx(std::string &wx, std::string metar = ""); extern void get_METAR_station(); #endif fldigi-4.2.05/src/include/maclogger.h0000664000175000017500000000055414532252172014315 00000000000000#ifndef MACLOGGERIO_H #define MACLOGGERIO_H #include #include "threads.h" #include "socket.h" #include "modem.h" #define MACLOGGER_BUFFER_SIZE 2048 extern void get_maclogger_udp(); extern void *maclogger_loop(void *args); extern void maclogger_init(void); extern bool maclogger_start(void); extern void maclogger_close(void); #endif // MACLOGGERIO_H fldigi-4.2.05/src/include/spectrum_viewer.h0000664000175000017500000000264114611711171015574 00000000000000// ---------------------------------------------------------------------------- // spectrum_viewer.cxx -- spectrum dialog // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef SPECTRUM_VIEWER_H #define SPECTRUM_VIEWER_H #include #include #include #include "spectrum.h" #include "digiscope.h" //extern Digiscope *fftscope; extern spectrum *fftscope; extern Fl_Box *pause_label; extern Fl_Output *values; extern Fl_Output *db_diffs; extern Fl_Output *f_diffs; extern Fl_Double_Window *spectrum_viewer; extern void open_spectrum_viewer(); extern void close_spectrum_viewer(); extern void recenter_spectrum_viewer(); #endif fldigi-4.2.05/src/include/ssb.h0000664000175000017500000000222314611711171013134 00000000000000// ---------------------------------------------------------------------------- // ssb.h -- ssb modem // // Copyright (C) 2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SSB_H #define _SSB_H #include "modem.h" #define ssb_SampleRate 8000 class ssb : public modem { public: ssb(); ~ssb(); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-4.2.05/src/include/navtex.h0000664000175000017500000000275614611711171013665 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // Remi Chateauneu // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _NAVTEX_H #define _NAVTEX_H /// Forward definition. class navtex_implementation ; #include #include "modem.h" class navtex : public modem { navtex_implementation * m_impl ; /// Non-copiable object. navtex(); navtex(const navtex *); navtex & operator=(const navtex *); public: navtex (trx_mode md); virtual ~navtex(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); void set_freq( double ); std::string get_message(int max_seconds); std::string send_message(const std::string & msg); }; #endif fldigi-4.2.05/src/include/serial.h0000664000175000017500000001177014611711171013633 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SERIAL_H #define SERIAL_H #include void com_to_tty(std::string& port); void tty_to_com(std::string& port); #ifndef __MINGW32__ #include class Cserial { public: Cserial(); ~Cserial(); //Methods bool OpenPort(); bool IsOpen() { return fd < 0 ? 0 : 1; }; void ClosePort(); void Device (std::string dev) { device = dev;}; std::string Device() { return device;}; void Baud(int b) { baud = b;}; int Baud() { return baud;}; void Timeout(int tm) { timeout = tm;} int Timeout() { return timeout; } void Retries(int r) { retries = r;} int Retries() { return retries;} void RTS(bool r){rts = r;} bool RTS(){return rts;} void RTSptt(bool b){rtsptt = b;} bool RTSptt(){return rtsptt;} void DTR(bool d){dtr = d;} bool DTR(){return dtr;} void DTRptt(bool b){dtrptt = b;} bool DTRptt(){return dtrptt;} void SetDTR(bool b); void SetRTS(bool b); void RTSCTS(bool b){rtscts = b;} bool RTSCTS(){return rtscts;} void SetPTT(bool b); void RestoreTIO(bool b) { restore_tio = b; } bool RestoreTIO() { return restore_tio; } void Stopbits(int n) { stopbits = n; } int Stopbits() { return stopbits;} bool ReadByte(unsigned char &resp); int ReadBuffer (unsigned char *b, int nbr); int WriteBuffer(unsigned char *str, int nbr); void FlushBuffer(); private: //Members std::string device; int fd; int baud; int speed; struct termios oldtio, newtio; int timeout; int retries; int status, origstatus; bool dtr; bool dtrptt; bool rts; bool rtsptt; bool rtscts; bool restore_tio; int stopbits; //char bfr[2048]; //Methods bool IOselect(); int bytes_written; }; #else //__MINGW32__ #include class Cserial { public: Cserial() { rts = dtr = false; rtsptt = dtrptt = false; rtscts = false; baud = CBR_9600; stopbits = 2; timeout = 50; }; Cserial( std::string portname) { device = portname; Cserial(); // OpenPort(); }; virtual ~Cserial() {}; //Methods BOOL OpenPort(); void ClosePort(); BOOL ConfigurePort(DWORD BaudRate,BYTE ByteSize,DWORD fParity,BYTE Parity,BYTE StopBits); bool IsBusy() { return busyflag; }; void IsBusy(bool val) { busyflag = val; }; bool IsOpen() { return hComm == INVALID_HANDLE_VALUE ? 0 : 1; }; BOOL ReadByte(unsigned char &resp); int ReadData (unsigned char *b, int nbr); int ReadBuffer (unsigned char *b, int nbr) { return ReadData (b,nbr); } BOOL WriteByte(unsigned char bybyte); int WriteBuffer(unsigned char *str, int nbr); BOOL SetCommunicationTimeouts( DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant); BOOL SetCommTimeout(); void Timeout(int tm) { timeout = tm; return; }; int Timeout() { return timeout; }; void FlushBuffer(); void Device (std::string dev) { device = dev;}; std::string Device() { return device;}; void Baud(int b) { baud = b;}; int Baud() { return baud;}; void Retries(int r) { retries = r;} int Retries() { return retries;} void RTS(bool r){rts = r;} bool RTS(){return rts;} void RTSptt(bool b){rtsptt = b;} bool RTSptt(){return rtsptt;} void DTR(bool d){dtr = d;} bool DTR(){return dtr;} void DTRptt(bool b){dtrptt = b;} bool DTRptt(){return dtrptt;} void SetDTR(bool b); void SetRTS(bool b); void RTSCTS(bool b){rtscts = b;} bool RTSCTS(){return rtscts;} void SetPTT(bool b); void RestoreTIO(bool b) { restore_tio = b; } bool RestoreTIO() { return restore_tio; } void Stopbits(int n) { stopbits = n; } int Stopbits() { return stopbits;} //Members private: std::string device; //For use by CreateFile HANDLE hComm; //DCB Defined in WinBase.h DCB dcb; COMMTIMEOUTS CommTimeoutsSaved; COMMTIMEOUTS CommTimeouts; //Is the Port Ready? BOOL bPortReady; //Number of Bytes Written to port DWORD nBytesWritten; //Number of Bytes Read from port DWORD nBytesRead; //Number of bytes Transmitted in the cur session DWORD nBytesTxD; int timeout; bool busyflag; int baud; int retries; bool dtr; bool dtrptt; bool rts; bool rtsptt; bool rtscts; bool restore_tio; int stopbits; }; #endif // __MINGW32__ #endif // SERIAL_H fldigi-4.2.05/src/include/dtmf.h0000664000175000017500000000412614532252172013306 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "filters.h" class cDTMF { private: //#define N 240 // 30 msec interval at 8000 sps #define RANGE 0.5 /* any thing higher than RANGE*peak is "on" */ #define THRESH 1000 /* 6 dB s/n for detection */ #define FLUSH_TIME 10 /* 10 frames ~ 330 millisecond */ #define NUMTONES 8 private: double power[NUMTONES]; //double thresh; double maxpower; double minpower; double data[350]; goertzel *filt[NUMTONES]; int framesize; static double coef[]; static int k[]; static const char *dtran[]; static int row[]; static int col[]; static const char rc[]; double outbuf[16384]; double shape[128]; int RT; int duration; int silence_time; int last; std::string dtmfchars; public: cDTMF() { for (int i = 0; i < 4; i++) filt[i] = new goertzel(240, row[i], 8000); for (int i = 0; i < 4; i++) filt[i+4] = new goertzel(240, col[i], 8000); for (int i = 0; i < 240; i++) data[i] = 0; dtmfchars.clear(); framesize = 240; // 8000 sr default silence_time = 0; last = ' '; } ~cDTMF() {}; // receive void calc_power(); int decode(); void receive(const float* buf, size_t len); // transmit void makeshape(); void silence(int); void two_tones(int); void send(); }; fldigi-4.2.05/src/include/complex.h0000664000175000017500000000237714532252172014031 00000000000000// ---------------------------------------------------------------------------- // complex.h -- Complex arithmetic // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _COMPLEX_H #define _COMPLEX_H #include #include typedef std::complex cmplx; inline cmplx cmac (const cmplx *a, const cmplx *b, int ptr, int len) { cmplx z; ptr %= len; for (int i = 0; i < len; i++) { z += a[i] * b[ptr]; ptr = (ptr + 1) % len; } return z; } #endif fldigi-4.2.05/src/include/tabdefs.h0000664000175000017500000000603514611711171013762 00000000000000// ---------------------------------------------------------------------------- // // tabdefs.h // // Copyright (C) 2019 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef TABDEFS_H #define TABDEFS_H #define TAB_OLIVIA _("Modem/Olivia") #define TAB_CONTESTIA _("Modem/Contestia") #define TAB_DOMINOEX _("Modem/DominoEX") #define TAB_RTTY _("Modem/TTY/Rx") #define TAB_IFKP _("Modem/IFKP") #define TAB_FMT _("Modem/FMT") #define TAB_FSQ _("Modem/FSQ") #define TAB_THOR _("Modem/Thor") #define TAB_PSK _("Modem/Psk") #define TAB_MT63 _("Modem/MT-63") #define TAB_NAVTEX _("Modem/Navtex") #define TAB_WEFAX _("Modem/Wefax") #define TAB_FELDHELL _("Modem/Feld Hell") #define TAB_CW _("Modem/CW/General") #define TAB_STATION _("Operator-Station") #define TAB_RSID _("IDs/RsID") #define TAB_CPU _("Misc/CPU") #define TAB_NBEMS _("Misc/NBEMS") #define TAB_PSKREPORTER _("Misc/PSK reporter") #define TAB_SWEETSPOT _("Misc/Sweet Spot") #define TAB_TEXT_CAPTURE _("Misc/Rx text capture") #define TAB_DTMF _("Misc/DTMF") #define TAB_MISC_KML _("Misc/KML") #define TAB_AUTOSTART _("Misc/Autostart") #define TAB_MISC_IO _("Misc/IO") #define TAB_MISC_PSM _("Misc/PSM") #define TAB_CONTEST_GEN _("Contests/General") #define TAB_SOUND_DEVICES _("Soundcard/Devices") #define TAB_CONFIG_DIALOG _("Configure") #define TAB_UI_GENERAL _("UI/General") #define TAB_UI_BROWSER _("UI/Browser") #define TAB_UI_MACRO_BTNS _("UI/Macro buttons") #define TAB_UI_RXTEXT _("UI/Rx Text") #define TAB_UI_TOUCH _("UI/Touch") #define TAB_LOGGING _("Logging") #define TAB_WEB _("Web") #define TAB_CONTESTS _("Contests") #define TAB_RIG_CONTROL _("Rig Control") #define TAB_RIG_FLRIG _("Rig Control/flrig") #define TAB_RIG_RIGCAT _("Rig Control/CAT (rigcat)") #define TAB_RIG_HAMLIB _("Rig Control/Hamlib") #define TAB_WATERFALL _("Waterfall") #define TAB_LOG_N3FJP _("Logging/N3FJP logs") #define TAB_LOG_MACLOGGER _("Logging/MacLogger") #define TAB_LOG_LOTW _("Logging/LoTW") #define TAB_UI_CF_RXTX _("Colors-Fonts/Rx-Tx") #define TAB_UI_LOGGING_CLRS _("Colors-Fonts/Logging controls") #define TAB_UI_TAB_CLRS _("Colors-Fonts/Tabs") #define TAB_UI_FD_CLRS _("Colors-Fonts/FreqDisp - Meters") #define TAB_UI_FKEY_CLRS _("Colors-Fonts/Function keys") #define TAB_PSKMAIL _("Web/Pskmail") #define TAB_MISC_WX _("Web/WX") #endif fldigi-4.2.05/src/include/gfft.h0000664000175000017500000023320014532252172013277 00000000000000//============================================================================== // g_fft.h: // // FFT library // Copyright (C) 2013 // Dave Freese, W1HKJ // // based on public domain code by John Green // original version is available at // http://hyperarchive.lcs.mit.edu/ // /HyperArchive/Archive/dev/src/ffts-for-risc-2-c.hqx // // ported to C++ for fldigi by Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . //============================================================================== //============================================================================== // Original Green C implementation written as a C++ template // Code has been tested for types // g_fft // g_fft // g_fft // g_fft // where the xxx types perform better than the xxx_t types // typical performance for 8192 point fft on an Intel(R) Pentium(R) Dual // CPU E2180 @ 2.00GHz // type complex_fwd real_fwd // double 0.407 ms 0.203 ms // double_t 1.269 ms 0.593 ms // float 0.385 ms 0.193 ms // float_t 1.160 ms 0.627 ms //============================================================================== #ifndef CGREEN_FFT_H #define CGREEN_FFT_H #include template class g_fft { #define FFT_RECIPLN2 1.442695040888963407359924681001892137426 // 1.0/log(2) // some useful conversions between a number and its power of 2 #define LOG2(a) (FFT_RECIPLN2*log(a)) // floating point logarithm base 2 #define POW2(m) ((unsigned int) 1 << (m)) // integer power of 2 for m<32 // fft's with M bigger than this bust primary cache #define MCACHE (11 - (sizeof(FFT_TYPE) / 8)) // some math constants to 40 decimal places #define FFT_PI 3.141592653589793238462643383279502884197 // pi #define FFT_ROOT2 1.414213562373095048801688724209698078569 // sqrt(2) #define FFT_COSPID8 0.9238795325112867561281831893967882868224 // cos(pi/8) #define FFT_SINPID8 0.3826834323650897717284599840303988667613 // sin(pi/8) private: int FFT_size; int FFT_N; FFT_TYPE *FFT_table_1[32]; short int *FFT_table_2[32]; FFT_TYPE *Utbl; short *BRLow; void fftInit(); int ConvertFFTSize(int); // base fft methods void riffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void ifrstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl); void rifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rifft1pt(FFT_TYPE *ioptr, FFT_TYPE scale); void rffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void frstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl); void rfft8pt(FFT_TYPE *ioptr); void rfft4pt(FFT_TYPE *ioptr); void rfft2pt(FFT_TYPE *ioptr); void rfft1pt(FFT_TYPE *ioptr); void iffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void ifftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void ibfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void ibfR4(FFT_TYPE *ioptr, int M, int NDiffU); void ibfR2(FFT_TYPE *ioptr, int M, int NDiffU); void ifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale); void ifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale); void ifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale); void scbitrevR2(FFT_TYPE *ioptr, int M, short *BRLow, FFT_TYPE scale); void ffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow); void fftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void bfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt); void bfR4(FFT_TYPE *ioptr, int M, int NDiffU); void bfR2(FFT_TYPE *ioptr, int M, int NDiffU); void fft8pt(FFT_TYPE *ioptr); void fft4pt(FFT_TYPE *ioptr); void fft2pt(FFT_TYPE *ioptr); void bitrevR2(FFT_TYPE *ioptr, int M, short *BRLow); void fftBRInit(int M, short *BRLow); void fftCosInit(int M, FFT_TYPE *Utbl); public: g_fft(int M = 8192) { if (M < 16) M = 16; if (M > 268435456) M = 268435456; FFT_size = M; fftInit(); } ~g_fft() { for (int i = 0; i < 32; i++) { if (FFT_table_1[i] != 0) delete [] FFT_table_1[i]; if (FFT_table_2[i] != 0) delete [] FFT_table_2[i]; } } void ComplexFFT(std::complex *buf); void InverseComplexFFT(std::complex *buf); void RealFFT(std::complex *buf); void InverseRealFFT(std::complex *buf); FFT_TYPE GetInverseComplexFFTScale(); FFT_TYPE GetInverseRealFFTScale(); }; //------------------------------------------------------------------------------ // Compute Utbl, the cosine table for ffts // of size (pow(2,M)/4 +1) // INPUTS // M = log2 of fft size // OUTPUTS // *Utbl = cosine table //------------------------------------------------------------------------------ template void g_fft::fftCosInit(int M, FFT_TYPE *Utbl) { unsigned int fftN = POW2(M); unsigned int i1; Utbl[0] = FFT_TYPE(1.0); for (i1 = 1; i1 < fftN/4; i1++) Utbl[i1] = (FFT_TYPE)cos((2.0 * FFT_PI * (double)i1) / (double)fftN); Utbl[fftN/4] = FFT_TYPE(0.0); } //------------------------------------------------------------------------------ // Compute BRLow, the bit reversed table for ffts // of size pow(2,M/2 -1) // INPUTS // M = log2 of fft size // OUTPUTS // *BRLow = bit reversed counter table //------------------------------------------------------------------------------ template void g_fft::fftBRInit(int M, short *BRLow) { int Mroot_1 = M / 2 - 1; int Nroot_1 = POW2(Mroot_1); int i1; int bitsum; int bitmask; int bit; for (i1 = 0; i1 < Nroot_1; i1++) { bitsum = 0; bitmask = 1; for (bit = 1; bit <= Mroot_1; bitmask <<= 1, bit++) if (i1 & bitmask) bitsum = bitsum + (Nroot_1 >> bit); BRLow[i1] = bitsum; } } //------------------------------------------------------------------------------ // parts of ffts1 // bit reverse and first radix 2 stage of forward or inverse fft //------------------------------------------------------------------------------ template void g_fft::bitrevR2(FFT_TYPE *ioptr, int M, short *BRLow) { FFT_TYPE f0r; FFT_TYPE f0i; FFT_TYPE f1r; FFT_TYPE f1i; FFT_TYPE f2r; FFT_TYPE f2i; FFT_TYPE f3r; FFT_TYPE f3i; FFT_TYPE f4r; FFT_TYPE f4i; FFT_TYPE f5r; FFT_TYPE f5i; FFT_TYPE f6r; FFT_TYPE f6i; FFT_TYPE f7r; FFT_TYPE f7i; FFT_TYPE t0r; FFT_TYPE t0i; FFT_TYPE t1r; FFT_TYPE t1i; FFT_TYPE *p0r; FFT_TYPE *p1r; FFT_TYPE *IOP; FFT_TYPE *iolimit; int Colstart; int iCol; unsigned int posA; unsigned int posAi; unsigned int posB; unsigned int posBi; const unsigned int Nrems2 = POW2((M + 3) / 2); const unsigned int Nroot_1_ColInc = POW2(M) - Nrems2; const unsigned int Nroot_1 = POW2(M / 2 - 1) - 1; const unsigned int ColstartShift = (M + 1) / 2 + 1; posA = POW2(M); // 1/2 of POW2(M) complex posAi = posA + 1; posB = posA + 2; posBi = posB + 1; iolimit = ioptr + Nrems2; for (; ioptr < iolimit; ioptr += POW2(M / 2 + 1)) { for (Colstart = Nroot_1; Colstart >= 0; Colstart--) { iCol = Nroot_1; p0r = ioptr + Nroot_1_ColInc + BRLow[Colstart] * 4; IOP = ioptr + (Colstart << ColstartShift); p1r = IOP + BRLow[iCol] * 4; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); for (; iCol > Colstart;) { f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); f4r = *(p1r); f4i = *(p1r + 1); f5r = *(p1r + posA); f5i = *(p1r + posAi); f6r = *(p1r + 2); f6i = *(p1r + (2 + 1)); f7r = *(p1r + posB); f7i = *(p1r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f0r = f4r + f5r; f0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; f2r = f6r + f7r; f2i = f6i + f7i; f7r = f6r - f7r; f7i = f6i - f7i; *(p1r) = t0r; *(p1r + 1) = t0i; *(p1r + 2) = f1r; *(p1r + (2 + 1)) = f1i; *(p1r + posA) = t1r; *(p1r + posAi) = t1i; *(p1r + posB) = f3r; *(p1r + posBi) = f3i; *(p0r) = f0r; *(p0r + 1) = f0i; *(p0r + 2) = f5r; *(p0r + (2 + 1)) = f5i; *(p0r + posA) = f2r; *(p0r + posAi) = f2i; *(p0r + posB) = f7r; *(p0r + posBi) = f7i; p0r -= Nrems2; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); iCol -= 1; p1r = IOP + BRLow[iCol] * 4; } f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; *(p0r) = t0r; *(p0r + 1) = t0i; *(p0r + 2) = f1r; *(p0r + (2 + 1)) = f1i; *(p0r + posA) = t1r; *(p0r + posAi) = t1i; *(p0r + posB) = f3r; *(p0r + posBi) = f3i; } } } //------------------------------------------------------------------------------ // RADIX 2 fft //------------------------------------------------------------------------------ template void g_fft::fft2pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[2]; f1i = ioptr[3]; // Butterflys // f0 - - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; // store result ioptr[0] = t0r; ioptr[1] = t0i; ioptr[2] = f1r; ioptr[3] = f1i; } //------------------------------------------------------------------------------ // RADIX 4 fft //------------------------------------------------------------------------------ template void g_fft::fft4pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[4]; f1i = ioptr[5]; f2r = ioptr[2]; f2i = ioptr[3]; f3r = ioptr[6]; f3i = ioptr[7]; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - -i - f3 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; // store result ioptr[0] = f0r; ioptr[1] = f0i; ioptr[2] = f1r; ioptr[3] = f1i; ioptr[4] = f2r; ioptr[5] = f2i; ioptr[6] = f3r; ioptr[7] = f3i; } //------------------------------------------------------------------------------ // RADIX 8 fft //------------------------------------------------------------------------------ template void g_fft::fft8pt(FFT_TYPE *ioptr) { FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[8]; f1i = ioptr[9]; f2r = ioptr[4]; f2i = ioptr[5]; f3r = ioptr[12]; f3i = ioptr[13]; f4r = ioptr[2]; f4i = ioptr[3]; f5r = ioptr[10]; f5i = ioptr[11]; f6r = ioptr[6]; f6i = ioptr[7]; f7r = ioptr[14]; f7i = ioptr[15]; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - -i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - -i - t1 // f7 - 1 - t1 - -i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r - t1i; f7i = f5i + t1r; f5r = f5r + t1i; f5i = f5i - t1r; t0r = f0r - f4r; t0i = f0i - f4i; f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r - f6i; t1i = f2i + f6r; f2r = f2r + f6i; f2i = f2i - f6r; f4r = f1r - f5r * w0r - f5i * w0r; f4i = f1i + f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r - f7i * w0r; f6i = f3i + f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // store result ioptr[0] = f0r; ioptr[1] = f0i; ioptr[2] = f1r; ioptr[3] = f1i; ioptr[4] = f2r; ioptr[5] = f2i; ioptr[6] = f3r; ioptr[7] = f3i; ioptr[8] = t0r; ioptr[9] = t0i; ioptr[10] = f4r; ioptr[11] = f4i; ioptr[12] = t1r; ioptr[13] = t1i; ioptr[14] = f6r; ioptr[15] = f6i; } //------------------------------------------------------------------------------ // 2nd radix 2 stage //------------------------------------------------------------------------------ template void g_fft::bfR2(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 Us at a time pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 for (SameUCnt = NSameU; SameUCnt > 0; SameUCnt--) { f0r = *p0r; f1r = *p1r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2r = *p2r; f3r = *p3r; f2i = *(p2r + 1); f3i = *(p3r + 1); f4r = f0r + f1r; f4i = f0i + f1i; f5r = f0r - f1r; f5i = f0i - f1i; f6r = f2r + f3r; f6i = f2i + f3i; f7r = f2r - f3r; f7i = f2i - f3i; *p0r = f4r; *(p0r + 1) = f4i; *p1r = f5r; *(p1r + 1) = f5i; *p2r = f6r; *(p2r + 1) = f6i; *p3r = f7r; *(p3r + 1) = f7i; f0r = *(p0r + pos); f1i = *(p1r + posi); f0i = *(p0r + posi); f1r = *(p1r + pos); f2r = *(p2r + pos); f3i = *(p3r + posi); f2i = *(p2r + posi); f3r = *(p3r + pos); f4r = f0r + f1i; f4i = f0i - f1r; f5r = f0r - f1i; f5i = f0i + f1r; f6r = f2r + f3i; f6i = f2i - f3r; f7r = f2r - f3i; f7i = f2i + f3r; *(p0r + pos) = f4r; *(p0r + posi) = f4i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; *(p2r + pos) = f6r; *(p2r + posi) = f6i; *(p3r + pos) = f7r; *(p3r + posi) = f7i; p0r += pnext; p1r += pnext; p2r += pnext; p3r += pnext; } } //------------------------------------------------------------------------------ // 1 radix 4 stage //------------------------------------------------------------------------------ template void g_fft::bfR4(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int pnexti; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE w1r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t1r, t1i; const FFT_TYPE Two = 2.0; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pnexti = pnext + 1; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 pts per butterfly pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f0 - - f4 // f1 - 1 - f5 - - f5 // f2 - - f6 - 1 - f6 // f3 - 1 - f3 - -i - f7 // Butterflys // f0 - - f4 - - f4 // f1 - -i - t1 - - f5 // f2 - - f2 - w1 - f6 // f3 - -i - f7 - iw1- f7 f0r = *p0r; f1r = *p1r; f2r = *p2r; f3r = *p3r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2i = *(p2r + 1); f3i = *(p3r + 1); f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f7r = f5r - f3i; f7i = f5i + f3r; f5r = f5r + f3i; f5i = f5i - f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r - f3i; f7i = f2i + f3r; f2r = f2r + f3i; f2i = f2i - f3r; f4r = f0r + f1i; f4i = f0i - f1r; t1r = f0r - f1i; t1i = f0i + f1r; f5r = t1r - f7r * w1r + f7i * w1r; f5i = t1i - f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r - f2i * w1r; f6i = f4i + f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; f3r = *(p3r + pnext); f0r = *(p0r + pnext); f3i = *(p3r + pnexti); f0i = *(p0r + pnexti); f2r = *(p2r + pnext); f2i = *(p2r + pnexti); f1r = *(p1r + pnext); f1i = *(p1r + pnexti); *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; p3r += pnext; p0r += pnext; p1r += pnext; p2r += pnext; } f7r = f5r - f3i; f7i = f5i + f3r; f5r = f5r + f3i; f5i = f5i - f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r - f3i; f7i = f2i + f3r; f2r = f2r + f3i; f2i = f2i - f3r; f4r = f0r + f1i; f4i = f0i - f1r; t1r = f0r - f1i; t1i = f0i + f1r; f5r = t1r - f7r * w1r + f7i * w1r; f5i = t1i - f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r - f2i * w1r; f6i = f4i + f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; } //------------------------------------------------------------------------------ // RADIX 8 Stages //------------------------------------------------------------------------------ template void g_fft::bfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; int Uinc; int Uinc2; int Uinc4; unsigned int DiffUCnt; unsigned int SameUCnt; unsigned int U2toU3; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE *u0r, *u0i, *u1r, *u1i, *u2r, *u2i; FFT_TYPE w0r, w0i, w1r, w1i, w2r, w2i, w3r, w3i; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = FFT_TYPE(2.0); pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 8; pos = pinc * 4; posi = pos + 1; NSameU = POW2(M) / 8 / NDiffU; // 8 pts per butterfly Uinc = (int) NSameU * Ustride; Uinc2 = Uinc * 2; Uinc4 = Uinc * 4; U2toU3 = (POW2(M) / 8) * Ustride; for (; StageCnt > 0; StageCnt--) { u0r = &Utbl[0]; u0i = &Utbl[POW2(M - 2) * Ustride]; u1r = u0r; u1i = u0i; u2r = u0r; u2i = u0i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; w2r = *u2r; w2i = *u2i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - w0- f1 - - f1 - - f1 // f2 - - f2 - w1- f2 - - f4 // f3 - w0- t1 - iw1- f3 - - f5 // // f4 - - t0 - - f4 - w2- t0 // f5 - w0- f5 - - f5 - w3- t1 // f6 - - f6 - w1- f6 - iw2- f6 // f7 - w0- t1 - iw1- f7 - iw3- f7 for (DiffUCnt = NDiffU; DiffUCnt > 0; DiffUCnt--) { f0r = *p0r; f0i = *(p0r + 1); f1r = *p1r; f1i = *(p1r + 1); for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r + f1i * w0i; t0i = f0i - f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r - f3i * w0i; t1i = f2i + f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r + f2i * w1i; f0i = t0i - f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i - t1i * w1r; f3i = f1i + t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; t0r = f4r + f5r * w0r + f5i * w0i; t0i = f4i - f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r - f7i * w0i; t1i = f6i + f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r + f6i * w1i; f4i = t0i - f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i - t1i * w1r; f7i = f5i + t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; t0r = f0r - f4r * w2r - f4i * w2i; t0i = f0i + f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; t1r = f1r - f5r * w3r - f5i * w3i; t1i = f1i + f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; *(p0r + pos) = t0r; *(p1r + pos) = t1r; *(p0r + posi) = t0i; *(p1r + posi) = t1i; *p0r = f0r; *p1r = f1r; *(p0r + 1) = f0i; *(p1r + 1) = f1i; p0r += pnext; f0r = *p0r; f0i = *(p0r + 1); p1r += pnext; f1r = *p1r; f1i = *(p1r + 1); f4r = f2r - f6r * w2i + f6i * w2r; f4i = f2i - f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; f5r = f3r - f7r * w3i + f7i * w3r; f5i = f3i - f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *p2r = f4r; *p3r = f5r; *(p2r + 1) = f4i; *(p3r + 1) = f5i; *(p2r + pos) = f6r; *(p3r + pos) = f7r; *(p2r + posi) = f6i; *(p3r + posi) = f7i; p2r += pnext; p3r += pnext; } f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r + f1i * w0i; t0i = f0i - f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r - f3i * w0i; t1i = f2i + f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r + f2i * w1i; f0i = t0i - f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i - t1i * w1r; f3i = f1i + t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; if ((int) DiffUCnt == NDiffU / 2) Uinc4 = -Uinc4; u0r += Uinc4; u0i -= Uinc4; u1r += Uinc2; u1i -= Uinc2; u2r += Uinc; u2i -= Uinc; pstrt += 2; t0r = f4r + f5r * w0r + f5i * w0i; t0i = f4i - f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r - f7i * w0i; t1i = f6i + f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r + f6i * w1i; f4i = t0i - f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i - t1i * w1r; f7i = f5i + t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; if ((int) DiffUCnt <= NDiffU / 2) w0r = -w0r; t0r = f0r - f4r * w2r - f4i * w2i; t0i = f0i + f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; f4r = f2r - f6r * w2i + f6i * w2r; f4i = f2i - f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; *(p0r + pos) = t0r; *p2r = f4r; *(p0r + posi) = t0i; *(p2r + 1) = f4i; w2r = *u2r; w2i = *u2i; *p0r = f0r; *(p2r + pos) = f6r; *(p0r + 1) = f0i; *(p2r + posi) = f6i; p0r = pstrt; p2r = pstrt + pinc + pinc; t1r = f1r - f5r * w3r - f5i * w3i; t1i = f1i + f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; f5r = f3r - f7r * w3i + f7i * w3r; f5i = f3i - f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *(p1r + pos) = t1r; *p3r = f5r; *(p1r + posi) = t1i; *(p3r + 1) = f5i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); *p1r = f1r; *(p3r + pos) = f7r; *(p1r + 1) = f1i; *(p3r + posi) = f7i; p1r = pstrt + pinc; p3r = p2r + pinc; } NSameU /= 8; Uinc /= 8; Uinc2 /= 8; Uinc4 = Uinc * 4; NDiffU *= 8; pinc *= 8; pnext *= 8; pos *= 8; posi = pos + 1; } } template void g_fft::fftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { // recursive bfstages calls to maximize on chip cache efficiency int i1; if (M <= (int) MCACHE) // fits on chip ? bfstages(ioptr, M, Utbl, Ustride, NDiffU, StageCnt); // RADIX 8 Stages else { for (i1 = 0; i1 < 8; i1++) { fftrecurs(&ioptr[i1 * POW2(M - 3) * 2], M - 3, Utbl, 8 * Ustride, NDiffU, StageCnt - 1); // RADIX 8 Stages } bfstages(ioptr, M, Utbl, Ustride, POW2(M - 3), 1); // RADIX 8 Stage } } //------------------------------------------------------------------------------ // Compute in-place complex fft on the rows of the input array // INPUTS // *ioptr = input data array // M = log2 of fft size (ex M=10 for 1024 point fft) // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = output data array //------------------------------------------------------------------------------ template void g_fft::ffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { int StageCnt; int NDiffU; switch (M) { case 0: break; case 1: fft2pt(ioptr); // a 2 pt fft break; case 2: fft4pt(ioptr); // a 4 pt fft break; case 3: fft8pt(ioptr); // an 8 pt fft break; default: bitrevR2(ioptr, M, BRLow); // bit reverse and first radix 2 stage StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { bfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { bfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) bfstages(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages else fftrecurs(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages } } //------------------------------------------------------------------------------ // parts of iffts1 // scaled bit reverse and first radix 2 stage forward or inverse fft //------------------------------------------------------------------------------ template void g_fft::scbitrevR2(FFT_TYPE *ioptr, int M, short *BRLow, FFT_TYPE scale) { FFT_TYPE f0r; FFT_TYPE f0i; FFT_TYPE f1r; FFT_TYPE f1i; FFT_TYPE f2r; FFT_TYPE f2i; FFT_TYPE f3r; FFT_TYPE f3i; FFT_TYPE f4r; FFT_TYPE f4i; FFT_TYPE f5r; FFT_TYPE f5i; FFT_TYPE f6r; FFT_TYPE f6i; FFT_TYPE f7r; FFT_TYPE f7i; FFT_TYPE t0r; FFT_TYPE t0i; FFT_TYPE t1r; FFT_TYPE t1i; FFT_TYPE *p0r; FFT_TYPE *p1r; FFT_TYPE *IOP; FFT_TYPE *iolimit; int Colstart; int iCol; unsigned int posA; unsigned int posAi; unsigned int posB; unsigned int posBi; const unsigned int Nrems2 = POW2((M + 3) / 2); const unsigned int Nroot_1_ColInc = POW2(M) - Nrems2; const unsigned int Nroot_1 = POW2(M / 2 - 1) - 1; const unsigned int ColstartShift = (M + 1) / 2 + 1; posA = POW2(M); // 1/2 of POW2(M) complexes posAi = posA + 1; posB = posA + 2; posBi = posB + 1; iolimit = ioptr + Nrems2; for (; ioptr < iolimit; ioptr += POW2(M / 2 + 1)) { for (Colstart = Nroot_1; Colstart >= 0; Colstart--) { iCol = Nroot_1; p0r = ioptr + Nroot_1_ColInc + BRLow[Colstart] * 4; IOP = ioptr + (Colstart << ColstartShift); p1r = IOP + BRLow[iCol] * 4; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); for (; iCol > Colstart;) { f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); f4r = *(p1r); f4i = *(p1r + 1); f5r = *(p1r + posA); f5i = *(p1r + posAi); f6r = *(p1r + 2); f6i = *(p1r + (2 + 1)); f7r = *(p1r + posB); f7i = *(p1r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f0r = f4r + f5r; f0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; f2r = f6r + f7r; f2i = f6i + f7i; f7r = f6r - f7r; f7i = f6i - f7i; *(p1r) = scale * t0r; *(p1r + 1) = scale * t0i; *(p1r + 2) = scale * f1r; *(p1r + (2 + 1)) = scale * f1i; *(p1r + posA) = scale * t1r; *(p1r + posAi) = scale * t1i; *(p1r + posB) = scale * f3r; *(p1r + posBi) = scale * f3i; *(p0r) = scale * f0r; *(p0r + 1) = scale * f0i; *(p0r + 2) = scale * f5r; *(p0r + (2 + 1)) = scale * f5i; *(p0r + posA) = scale * f2r; *(p0r + posAi) = scale * f2i; *(p0r + posB) = scale * f7r; *(p0r + posBi) = scale * f7i; p0r -= Nrems2; f0r = *(p0r); f0i = *(p0r + 1); f1r = *(p0r + posA); f1i = *(p0r + posAi); iCol -= 1; p1r = IOP + BRLow[iCol] * 4; } f2r = *(p0r + 2); f2i = *(p0r + (2 + 1)); f3r = *(p0r + posB); f3i = *(p0r + posBi); t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r + f3r; t1i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; *(p0r) = scale * t0r; *(p0r + 1) = scale * t0i; *(p0r + 2) = scale * f1r; *(p0r + (2 + 1)) = scale * f1i; *(p0r + posA) = scale * t1r; *(p0r + posAi) = scale * t1i; *(p0r + posB) = scale * f3r; *(p0r + posBi) = scale * f3i; } } } //------------------------------------------------------------------------------ // RADIX 2 ifft //------------------------------------------------------------------------------ template void g_fft::ifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[2]; f1i = ioptr[3]; // Butterflys // f0 - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; // store result ioptr[0] = scale * t0r; ioptr[1] = scale * t0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; } //------------------------------------------------------------------------------ // RADIX 4 ifft //------------------------------------------------------------------------------ template void g_fft::ifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[4]; f1i = ioptr[5]; f2r = ioptr[2]; f2i = ioptr[3]; f3r = ioptr[6]; f3i = ioptr[7]; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - i - f3 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; } //------------------------------------------------------------------------------ // RADIX 8 ifft //------------------------------------------------------------------------------ template void g_fft::ifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[8]; f1i = ioptr[9]; f2r = ioptr[4]; f2i = ioptr[5]; f3r = ioptr[12]; f3i = ioptr[13]; f4r = ioptr[2]; f4i = ioptr[3]; f5r = ioptr[10]; f5i = ioptr[11]; f6r = ioptr[6]; f6i = ioptr[7]; f7r = ioptr[14]; f7i = ioptr[15]; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - i - t1 // f7 - 1 - t1 - i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r + t1i; f7i = f5i - t1r; f5r = f5r - t1i; f5i = f5i + t1r; t0r = f0r - f4r; t0i = f0i - f4i; f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r + f6i; t1i = f2i - f6r; f2r = f2r - f6i; f2i = f2i + f6r; f4r = f1r - f5r * w0r + f5i * w0r; f4i = f1i - f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r + f7i * w0r; f6i = f3i - f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; ioptr[8] = scale * t0r; ioptr[9] = scale * t0i; ioptr[10] = scale * f4r; ioptr[11] = scale * f4i; ioptr[12] = scale * t1r; ioptr[13] = scale * t1i; ioptr[14] = scale * f6r; ioptr[15] = scale * f6i; } //------------------------------------------------------------------------------ // 2nd radix 2 stage //------------------------------------------------------------------------------ template void g_fft::ibfR2(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 Us at a time pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 // Butterflys // f0 - - f4 // f1 - 1 - f5 // f2 - - f6 // f3 - 1 - f7 for (SameUCnt = NSameU; SameUCnt > 0; SameUCnt--) { f0r = *p0r; f1r = *p1r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2r = *p2r; f3r = *p3r; f2i = *(p2r + 1); f3i = *(p3r + 1); f4r = f0r + f1r; f4i = f0i + f1i; f5r = f0r - f1r; f5i = f0i - f1i; f6r = f2r + f3r; f6i = f2i + f3i; f7r = f2r - f3r; f7i = f2i - f3i; *p0r = f4r; *(p0r + 1) = f4i; *p1r = f5r; *(p1r + 1) = f5i; *p2r = f6r; *(p2r + 1) = f6i; *p3r = f7r; *(p3r + 1) = f7i; f0r = *(p0r + pos); f1i = *(p1r + posi); f0i = *(p0r + posi); f1r = *(p1r + pos); f2r = *(p2r + pos); f3i = *(p3r + posi); f2i = *(p2r + posi); f3r = *(p3r + pos); f4r = f0r - f1i; f4i = f0i + f1r; f5r = f0r + f1i; f5i = f0i - f1r; f6r = f2r - f3i; f6i = f2i + f3r; f7r = f2r + f3i; f7i = f2i - f3r; *(p0r + pos) = f4r; *(p0r + posi) = f4i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; *(p2r + pos) = f6r; *(p2r + posi) = f6i; *(p3r + pos) = f7r; *(p3r + posi) = f7i; p0r += pnext; p1r += pnext; p2r += pnext; p3r += pnext; } } //------------------------------------------------------------------------------ // 1 radix 4 stage //------------------------------------------------------------------------------ template void g_fft::ibfR4(FFT_TYPE *ioptr, int M, int NDiffU) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int pnexti; unsigned int NSameU; unsigned int SameUCnt; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE w1r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t1r, t1i; const FFT_TYPE Two = 2.0; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 4; pnexti = pnext + 1; pos = 2; posi = pos + 1; NSameU = POW2(M) / 4 / NDiffU; // 4 pts per butterfly pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - f0 - - f4 // f1 - 1 - f5 - - f5 // f2 - - f6 - 1 - f6 // f3 - 1 - f3 - -i - f7 // Butterflys // f0 - - f4 - - f4 // f1 - -i - t1 - - f5 // f2 - - f2 - w1 - f6 // f3 - -i - f7 - iw1- f7 f0r = *p0r; f1r = *p1r; f2r = *p2r; f3r = *p3r; f0i = *(p0r + 1); f1i = *(p1r + 1); f2i = *(p2r + 1); f3i = *(p3r + 1); f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f7r = f5r + f3i; f7i = f5i - f3r; f5r = f5r - f3i; f5i = f5i + f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r + f3i; f7i = f2i - f3r; f2r = f2r - f3i; f2i = f2i + f3r; f4r = f0r - f1i; f4i = f0i + f1r; t1r = f0r + f1i; t1i = f0i - f1r; f5r = t1r - f7r * w1r - f7i * w1r; f5i = t1i + f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r + f2i * w1r; f6i = f4i - f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; f3r = *(p3r + pnext); f0r = *(p0r + pnext); f3i = *(p3r + pnexti); f0i = *(p0r + pnexti); f2r = *(p2r + pnext); f2i = *(p2r + pnexti); f1r = *(p1r + pnext); f1i = *(p1r + pnexti); *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; f6r = f2r + f3r; f6i = f2i + f3i; f3r = f2r - f3r; f3i = f2i - f3i; f5r = f0r - f1r; f5i = f0i - f1i; f0r = f0r + f1r; f0i = f0i + f1i; p3r += pnext; p0r += pnext; p1r += pnext; p2r += pnext; } f7r = f5r + f3i; f7i = f5i - f3r; f5r = f5r - f3i; f5i = f5i + f3r; f4r = f0r + f6r; f4i = f0i + f6i; f6r = f0r - f6r; f6i = f0i - f6i; f2r = *(p2r + pos); f2i = *(p2r + posi); f1r = *(p1r + pos); f1i = *(p1r + posi); f3i = *(p3r + posi); f0r = *(p0r + pos); f3r = *(p3r + pos); f0i = *(p0r + posi); *p3r = f7r; *p0r = f4r; *(p3r + 1) = f7i; *(p0r + 1) = f4i; *p1r = f5r; *p2r = f6r; *(p1r + 1) = f5i; *(p2r + 1) = f6i; f7r = f2r + f3i; f7i = f2i - f3r; f2r = f2r - f3i; f2i = f2i + f3r; f4r = f0r - f1i; f4i = f0i + f1r; t1r = f0r + f1i; t1i = f0i - f1r; f5r = t1r - f7r * w1r - f7i * w1r; f5i = t1i + f7r * w1r - f7i * w1r; f7r = t1r * Two - f5r; f7i = t1i * Two - f5i; f6r = f4r - f2r * w1r + f2i * w1r; f6i = f4i - f2r * w1r - f2i * w1r; f4r = f4r * Two - f6r; f4i = f4i * Two - f6i; *(p2r + pos) = f6r; *(p1r + pos) = f5r; *(p2r + posi) = f6i; *(p1r + posi) = f5i; *(p3r + pos) = f7r; *(p0r + pos) = f4r; *(p3r + posi) = f7i; *(p0r + posi) = f4i; } //------------------------------------------------------------------------------ // RADIX 8 Stages //------------------------------------------------------------------------------ template void g_fft::ibfstages(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { unsigned int pos; unsigned int posi; unsigned int pinc; unsigned int pnext; unsigned int NSameU; int Uinc; int Uinc2; int Uinc4; unsigned int DiffUCnt; unsigned int SameUCnt; unsigned int U2toU3; FFT_TYPE *pstrt; FFT_TYPE *p0r, *p1r, *p2r, *p3r; FFT_TYPE *u0r, *u0i, *u1r, *u1i, *u2r, *u2i; FFT_TYPE w0r, w0i, w1r, w1i, w2r, w2i, w3r, w3i; FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; pinc = NDiffU * 2; // 2 floats per complex pnext = pinc * 8; pos = pinc * 4; posi = pos + 1; NSameU = POW2(M) / 8 / NDiffU; // 8 pts per butterfly Uinc = (int) NSameU * Ustride; Uinc2 = Uinc * 2; Uinc4 = Uinc * 4; U2toU3 = (POW2(M) / 8) * Ustride; for (; StageCnt > 0; StageCnt--) { u0r = &Utbl[0]; u0i = &Utbl[POW2(M - 2) * Ustride]; u1r = u0r; u1i = u0i; u2r = u0r; u2i = u0i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; w2r = *u2r; w2i = *u2i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); pstrt = ioptr; p0r = pstrt; p1r = pstrt + pinc; p2r = p1r + pinc; p3r = p2r + pinc; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - w0- f1 - - f1 - - f1 // f2 - - f2 - w1- f2 - - f4 // f3 - w0- t1 - iw1- f3 - - f5 // f4 - - t0 - - f4 - w2- t0 // f5 - w0- f5 - - f5 - w3- t1 // f6 - - f6 - w1- f6 - iw2- f6 // f7 - w0- t1 - iw1- f7 - iw3- f7 for (DiffUCnt = NDiffU; DiffUCnt > 0; DiffUCnt--) { f0r = *p0r; f0i = *(p0r + 1); f1r = *p1r; f1i = *(p1r + 1); for (SameUCnt = NSameU - 1; SameUCnt > 0; SameUCnt--) { f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r - f1i * w0i; t0i = f0i + f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r + f3i * w0i; t1i = f2i - f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r - f2i * w1i; f0i = t0i + f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i + t1i * w1r; f3i = f1i - t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; t0r = f4r + f5r * w0r - f5i * w0i; t0i = f4i + f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r + f7i * w0i; t1i = f6i - f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r - f6i * w1i; f4i = t0i + f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i + t1i * w1r; f7i = f5i - t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; t0r = f0r - f4r * w2r + f4i * w2i; t0i = f0i - f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; t1r = f1r - f5r * w3r + f5i * w3i; t1i = f1i - f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; *(p0r + pos) = t0r; *(p0r + posi) = t0i; *p0r = f0r; *(p0r + 1) = f0i; p0r += pnext; f0r = *p0r; f0i = *(p0r + 1); *(p1r + pos) = t1r; *(p1r + posi) = t1i; *p1r = f1r; *(p1r + 1) = f1i; p1r += pnext; f1r = *p1r; f1i = *(p1r + 1); f4r = f2r - f6r * w2i - f6i * w2r; f4i = f2i + f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; f5r = f3r - f7r * w3i - f7i * w3r; f5i = f3i + f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *p2r = f4r; *(p2r + 1) = f4i; *(p2r + pos) = f6r; *(p2r + posi) = f6i; p2r += pnext; *p3r = f5r; *(p3r + 1) = f5i; *(p3r + pos) = f7r; *(p3r + posi) = f7i; p3r += pnext; } f2r = *p2r; f2i = *(p2r + 1); f3r = *p3r; f3i = *(p3r + 1); t0r = f0r + f1r * w0r - f1i * w0i; t0i = f0i + f1r * w0i + f1i * w0r; f1r = f0r * Two - t0r; f1i = f0i * Two - t0i; f4r = *(p0r + pos); f4i = *(p0r + posi); f5r = *(p1r + pos); f5i = *(p1r + posi); f6r = *(p2r + pos); f6i = *(p2r + posi); f7r = *(p3r + pos); f7i = *(p3r + posi); t1r = f2r - f3r * w0r + f3i * w0i; t1i = f2i - f3r * w0i - f3i * w0r; f2r = f2r * Two - t1r; f2i = f2i * Two - t1i; f0r = t0r + f2r * w1r - f2i * w1i; f0i = t0i + f2r * w1i + f2i * w1r; f2r = t0r * Two - f0r; f2i = t0i * Two - f0i; f3r = f1r + t1r * w1i + t1i * w1r; f3i = f1i - t1r * w1r + t1i * w1i; f1r = f1r * Two - f3r; f1i = f1i * Two - f3i; if ((int) DiffUCnt == NDiffU / 2) Uinc4 = -Uinc4; u0r += Uinc4; u0i -= Uinc4; u1r += Uinc2; u1i -= Uinc2; u2r += Uinc; u2i -= Uinc; pstrt += 2; t0r = f4r + f5r * w0r - f5i * w0i; t0i = f4i + f5r * w0i + f5i * w0r; f5r = f4r * Two - t0r; f5i = f4i * Two - t0i; t1r = f6r - f7r * w0r + f7i * w0i; t1i = f6i - f7r * w0i - f7i * w0r; f6r = f6r * Two - t1r; f6i = f6i * Two - t1i; f4r = t0r + f6r * w1r - f6i * w1i; f4i = t0i + f6r * w1i + f6i * w1r; f6r = t0r * Two - f4r; f6i = t0i * Two - f4i; f7r = f5r + t1r * w1i + t1i * w1r; f7i = f5i - t1r * w1r + t1i * w1i; f5r = f5r * Two - f7r; f5i = f5i * Two - f7i; w0r = *u0r; w0i = *u0i; w1r = *u1r; w1i = *u1i; if ((int) DiffUCnt <= NDiffU / 2) w0r = -w0r; t0r = f0r - f4r * w2r + f4i * w2i; t0i = f0i - f4r * w2i - f4i * w2r; f0r = f0r * Two - t0r; f0i = f0i * Two - t0i; f4r = f2r - f6r * w2i - f6i * w2r; f4i = f2i + f6r * w2r - f6i * w2i; f6r = f2r * Two - f4r; f6i = f2i * Two - f4i; *(p0r + pos) = t0r; *p2r = f4r; *(p0r + posi) = t0i; *(p2r + 1) = f4i; w2r = *u2r; w2i = *u2i; *p0r = f0r; *(p2r + pos) = f6r; *(p0r + 1) = f0i; *(p2r + posi) = f6i; p0r = pstrt; p2r = pstrt + pinc + pinc; t1r = f1r - f5r * w3r + f5i * w3i; t1i = f1i - f5r * w3i - f5i * w3r; f1r = f1r * Two - t1r; f1i = f1i * Two - t1i; f5r = f3r - f7r * w3i - f7i * w3r; f5i = f3i + f7r * w3r - f7i * w3i; f7r = f3r * Two - f5r; f7i = f3i * Two - f5i; *(p1r + pos) = t1r; *p3r = f5r; *(p1r + posi) = t1i; *(p3r + 1) = f5i; w3r = *(u2r + U2toU3); w3i = *(u2i - U2toU3); *p1r = f1r; *(p3r + pos) = f7r; *(p1r + 1) = f1i; *(p3r + posi) = f7i; p1r = pstrt + pinc; p3r = p2r + pinc; } NSameU /= 8; Uinc /= 8; Uinc2 /= 8; Uinc4 = Uinc * 4; NDiffU *= 8; pinc *= 8; pnext *= 8; pos *= 8; posi = pos + 1; } } //------------------------------------------------------------------------------ // recursive bfstages calls to maximize on chip cache efficiency //------------------------------------------------------------------------------ template void g_fft::ifftrecurs(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, int Ustride, int NDiffU, int StageCnt) { int i1; if (M <= (int) MCACHE) ibfstages(ioptr, M, Utbl, Ustride, NDiffU, StageCnt); // RADIX 8 Stages else { for (i1 = 0; i1 < 8; i1++) { ifftrecurs(&ioptr[i1 * POW2(M - 3) * 2], M - 3, Utbl, 8 * Ustride, NDiffU, StageCnt - 1); // RADIX 8 Stages } ibfstages(ioptr, M, Utbl, Ustride, POW2(M - 3), 1); // RADIX 8 Stage } } //------------------------------------------------------------------------------ // Compute in-place inverse complex fft on the rows of the input array // INPUTS // *ioptr = input data array // M = log2 of fft size // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = output data array //------------------------------------------------------------------------------ template void g_fft::iffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { int StageCnt; int NDiffU; const FFT_TYPE scale = 1.0 / POW2(M); switch (M) { case 0: break; case 1: ifft2pt(ioptr, scale); // a 2 pt fft break; case 2: ifft4pt(ioptr, scale); // a 4 pt fft break; case 3: ifft8pt(ioptr, scale); // an 8 pt fft break; default: // bit reverse and first radix 2 stage scbitrevR2(ioptr, M, BRLow, scale); StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { ibfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { ibfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) ibfstages(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages else ifftrecurs(ioptr, M, Utbl, 1, NDiffU, StageCnt); // RADIX 8 Stages } } //------------------------------------------------------------------------------ // parts of rffts1 // RADIX 2 rfft //------------------------------------------------------------------------------ template void g_fft::rfft1pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; // finish rfft t0r = f0r + f0i; t0i = f0r - f0i; // store result ioptr[0] = t0r; ioptr[1] = t0i; } //------------------------------------------------------------------------------ // RADIX 4 rfft //------------------------------------------------------------------------------ template void g_fft::rfft2pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[2]; f1i = ioptr[3]; // Butterflys // f0 - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f1i - f0i; // finish rfft f0r = t0r + t0i; f0i = t0r - t0i; // store result ioptr[0] = f0r; ioptr[1] = f0i; ioptr[2] = f1r; ioptr[3] = f1i; } //------------------------------------------------------------------------------ // RADIX 8 rfft //------------------------------------------------------------------------------ template void g_fft::rfft4pt(FFT_TYPE *ioptr) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) const FFT_TYPE Two = 2.0; const FFT_TYPE scale = 0.5; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[4]; f1i = ioptr[5]; f2r = ioptr[2]; f2i = ioptr[3]; f3r = ioptr[6]; f3i = ioptr[7]; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - -i - f3 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = f2i - t0i; // neg for rfft f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; // finish rfft t0r = f0r + f0i; // compute Re(x[0]) t0i = f0r - f0i; // compute Re(x[N/2]) t1r = f1r + f3r; t1i = f1i - f3i; f0r = f1i + f3i; f0i = f3r - f1r; f1r = t1r + w0r * f0r + w0r * f0i; f1i = t1i - w0r * f0r + w0r * f0i; f3r = Two * t1r - f1r; f3i = f1i - Two * t1i; // store result ioptr[4] = f2r; ioptr[5] = f2i; ioptr[0] = t0r; ioptr[1] = t0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; } //------------------------------------------------------------------------------ // RADIX 16 rfft //------------------------------------------------------------------------------ template void g_fft::rfft8pt(FFT_TYPE *ioptr) { FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) FFT_TYPE w1r = FFT_COSPID8; // cos(pi/8) FFT_TYPE w1i = FFT_SINPID8; // sin(pi/8) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; const FFT_TYPE scale = 0.5; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; f1r = ioptr[8]; f1i = ioptr[9]; f2r = ioptr[4]; f2i = ioptr[5]; f3r = ioptr[12]; f3i = ioptr[13]; f4r = ioptr[2]; f4i = ioptr[3]; f5r = ioptr[10]; f5i = ioptr[11]; f6r = ioptr[6]; f6i = ioptr[7]; f7r = ioptr[14]; f7i = ioptr[15]; // Butterflys // f0 - - t0 - - f0 - - f0 // f1 - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - -i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - -i - t1 // f7 - 1 - t1 - -i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i + f1i; f1r = f0r - f1r; f1i = f0i - f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r - t1i; f3i = f1i + t1r; f1r = f1r + t1i; f1i = f1i - t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r - t1i; f7i = f5i + t1r; f5r = f5r + t1i; f5i = f5i - t1r; t0r = f0r - f4r; t0i = f4i - f0i; // neg for rfft f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r - f6i; t1i = f2i + f6r; f2r = f2r + f6i; f2i = f2i - f6r; f4r = f1r - f5r * w0r - f5i * w0r; f4i = f1i + f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r - f7i * w0r; f6i = f3i + f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // finish rfft f5r = f0r + f0i; // compute Re(x[0]) f5i = f0r - f0i; // compute Re(x[N/2]) f0r = f2r + t1r; f0i = f2i - t1i; f7r = f2i + t1i; f7i = t1r - f2r; f2r = f0r + w0r * f7r + w0r * f7i; f2i = f0i - w0r * f7r + w0r * f7i; t1r = Two * f0r - f2r; t1i = f2i - Two * f0i; f0r = f1r + f6r; f0i = f1i - f6i; f7r = f1i + f6i; f7i = f6r - f1r; f1r = f0r + w1r * f7r + w1i * f7i; f1i = f0i - w1i * f7r + w1r * f7i; f6r = Two * f0r - f1r; f6i = f1i - Two * f0i; f0r = f3r + f4r; f0i = f3i - f4i; f7r = f3i + f4i; f7i = f4r - f3r; f3r = f0r + w1i * f7r + w1r * f7i; f3i = f0i - w1r * f7r + w1i * f7i; f4r = Two * f0r - f3r; f4i = f3i - Two * f0i; // store result ioptr[8] = t0r; ioptr[9] = t0i; ioptr[0] = f5r; ioptr[1] = f5i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[12] = scale * t1r; ioptr[13] = scale * t1i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; ioptr[10] = scale * f4r; ioptr[11] = scale * f4i; ioptr[14] = scale * f6r; ioptr[15] = scale * f6i; } //------------------------------------------------------------------------------ // Finish RFFT //------------------------------------------------------------------------------ template void g_fft::frstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl) { unsigned int pos; unsigned int posi; unsigned int diffUcnt; FFT_TYPE *p0r, *p1r; FFT_TYPE *u0r, *u0i; FFT_TYPE w0r, w0i; FFT_TYPE f0r, f0i, f1r, f1i, f4r, f4i, f5r, f5i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = 2.0; pos = POW2(M - 1); posi = pos + 1; p0r = ioptr; p1r = ioptr + pos / 2; u0r = Utbl + POW2(M - 3); w0r = *u0r, f0r = *(p0r); f0i = *(p0r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); f1r = *(p1r); f1i = *(p1r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); t0r = Two * f0r + Two * f0i; // compute Re(x[0]) t0i = Two * f0r - Two * f0i; // compute Re(x[N/2]) t1r = f4r + f4r; t1i = -f4i - f4i; f0r = f1r + f5r; f0i = f1i - f5i; f4r = f1i + f5i; f4i = f5r - f1r; f1r = f0r + w0r * f4r + w0r * f4i; f1i = f0i - w0r * f4r + w0r * f4i; f5r = Two * f0r - f1r; f5i = f1i - Two * f0i; *(p0r) = t0r; *(p0r + 1) = t0i; *(p0r + pos) = t1r; *(p0r + posi) = t1i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; u0r = Utbl + 1; u0i = Utbl + (POW2(M - 2) - 1); w0r = *u0r, w0i = *u0i; p0r = (ioptr + 2); p1r = (ioptr + (POW2(M - 2) - 1) * 2); // Butterflys // f0 - t0 - - f0 // f5 - t1 - w0 - f5 // f1 - t0 - - f1 // f4 - t1 -iw0 - f4 for (diffUcnt = POW2(M - 3) - 1; diffUcnt > 0; diffUcnt--) { f0r = *(p0r); f0i = *(p0r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); f1r = *(p1r); f1i = *(p1r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); t0r = f0r + f5r; t0i = f0i - f5i; t1r = f0i + f5i; t1i = f5r - f0r; f0r = t0r + w0r * t1r + w0i * t1i; f0i = t0i - w0i * t1r + w0r * t1i; f5r = Two * t0r - f0r; f5i = f0i - Two * t0i; t0r = f1r + f4r; t0i = f1i - f4i; t1r = f1i + f4i; t1i = f4r - f1r; f1r = t0r + w0i * t1r + w0r * t1i; f1i = t0i - w0r * t1r + w0i * t1i; f4r = Two * t0r - f1r; f4i = f1i - Two * t0i; *(p0r) = f0r; *(p0r + 1) = f0i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; w0r = *++u0r; w0i = *--u0i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p0r + pos) = f4r; *(p0r + posi) = f4i; p0r += 2; p1r -= 2; } } //------------------------------------------------------------------------------ // Compute in-place real fft on the rows of the input array // The result is the complex spectra of the positive frequencies // except the location for the first complex number contains the real // values for DC and Nyquest // INPUTS // *ioptr = real input data array // M = log2 of fft size // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = output data array in the following order // Re(x[0]), Re(x[N/2]), Re(x[1]), Im(x[1]), Re(x[2]), Im(x[2]), // ... Re(x[N/2-1]), Im(x[N/2-1]). //------------------------------------------------------------------------------ template void g_fft::rffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { FFT_TYPE scale; int StageCnt; int NDiffU; M = M - 1; switch (M) { case -1: break; case 0: rfft1pt(ioptr); // a 2 pt fft break; case 1: rfft2pt(ioptr); // a 4 pt fft break; case 2: rfft4pt(ioptr); // an 8 pt fft break; case 3: rfft8pt(ioptr); // a 16 pt fft break; default: scale = 0.5; // bit reverse and first radix 2 stage scbitrevR2(ioptr, M, BRLow, scale); StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { bfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { bfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) bfstages(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages else fftrecurs(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages frstage(ioptr, M + 1, Utbl); } } //------------------------------------------------------------------------------ // parts of riffts1 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // RADIX 2 rifft //------------------------------------------------------------------------------ template void g_fft::rifft1pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i; FFT_TYPE t0r, t0i; // bit reversed load f0r = ioptr[0]; f0i = ioptr[1]; // finish rfft t0r = f0r + f0i; t0i = f0r - f0i; // store result ioptr[0] = scale * t0r; ioptr[1] = scale * t0i; } //------------------------------------------------------------------------------ // RADIX 4 rifft //------------------------------------------------------------------------------ template void g_fft::rifft2pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i; FFT_TYPE t0r, t0i; const FFT_TYPE Two = FFT_TYPE(2.0); // bit reversed load t0r = ioptr[0]; t0i = ioptr[1]; f1r = Two * ioptr[2]; f1i = Two * ioptr[3]; // start rifft f0r = t0r + t0i; f0i = t0r - t0i; // Butterflys // f0 - - t0 // f1 - 1 - f1 t0r = f0r + f1r; t0i = f0i - f1i; f1r = f0r - f1r; f1i = f0i + f1i; // store result ioptr[0] = scale * t0r; ioptr[1] = scale * t0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; } //------------------------------------------------------------------------------ // RADIX 8 rifft //------------------------------------------------------------------------------ template void g_fft::rifft4pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE t0r, t0i, t1r, t1i; FFT_TYPE w0r = 1.0 / FFT_ROOT2; // cos(pi/4) const FFT_TYPE Two = FFT_TYPE(2.0); // bit reversed load t0r = ioptr[0]; t0i = ioptr[1]; f2r = ioptr[2]; f2i = ioptr[3]; f1r = Two * ioptr[4]; f1i = Two * ioptr[5]; f3r = ioptr[6]; f3i = ioptr[7]; // start rfft f0r = t0r + t0i; // compute Re(x[0]) f0i = t0r - t0i; // compute Re(x[N/2]) t1r = f2r + f3r; t1i = f2i - f3i; t0r = f2r - f3r; t0i = f2i + f3i; f2r = t1r - w0r * t0r - w0r * t0i; f2i = t1i + w0r * t0r - w0r * t0i; f3r = Two * t1r - f2r; f3i = f2i - Two * t1i; // Butterflys // f0 - - t0 - - f0 // f1 - 1 - f1 - - f1 // f2 - - f2 - 1 - f2 // f3 - 1 - t1 - i - f3 t0r = f0r + f1r; t0i = f0i - f1i; f1r = f0r - f1r; f1i = f0i + f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; } //------------------------------------------------------------------------------ // RADIX 16 rifft //------------------------------------------------------------------------------ template void g_fft::rifft8pt(FFT_TYPE *ioptr, FFT_TYPE scale) { FFT_TYPE w0r = (FFT_TYPE) (1.0 / FFT_ROOT2); // cos(pi/4) FFT_TYPE w1r = FFT_COSPID8; // cos(pi/8) FFT_TYPE w1i = FFT_SINPID8; // sin(pi/8) FFT_TYPE f0r, f0i, f1r, f1i, f2r, f2i, f3r, f3i; FFT_TYPE f4r, f4i, f5r, f5i, f6r, f6i, f7r, f7i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = FFT_TYPE(2.0); // bit reversed load t0r = ioptr[0]; t0i = ioptr[1]; f4r = ioptr[2]; f4i = ioptr[3]; f2r = ioptr[4]; f2i = ioptr[5]; f6r = ioptr[6]; f6i = ioptr[7]; f1r = Two * ioptr[8]; f1i = Two * ioptr[9]; f5r = ioptr[10]; f5i = ioptr[11]; f3r = ioptr[12]; f3i = ioptr[13]; f7r = ioptr[14]; f7i = ioptr[15]; // start rfft f0r = t0r + t0i; // compute Re(x[0]) f0i = t0r - t0i; // compute Re(x[N/2]) t0r = f2r + f3r; t0i = f2i - f3i; t1r = f2r - f3r; t1i = f2i + f3i; f2r = t0r - w0r * t1r - w0r * t1i; f2i = t0i + w0r * t1r - w0r * t1i; f3r = Two * t0r - f2r; f3i = f2i - Two * t0i; t0r = f4r + f7r; t0i = f4i - f7i; t1r = f4r - f7r; t1i = f4i + f7i; f4r = t0r - w1i * t1r - w1r * t1i; f4i = t0i + w1r * t1r - w1i * t1i; f7r = Two * t0r - f4r; f7i = f4i - Two * t0i; t0r = f6r + f5r; t0i = f6i - f5i; t1r = f6r - f5r; t1i = f6i + f5i; f6r = t0r - w1r * t1r - w1i * t1i; f6i = t0i + w1i * t1r - w1r * t1i; f5r = Two * t0r - f6r; f5i = f6i - Two * t0i; // Butterflys // f0 - - t0 - - f0 - - f0 // f1* - 1 - f1 - - f1 - - f1 // f2 - - f2 - 1 - f2 - - f2 // f3 - 1 - t1 - i - f3 - - f3 // f4 - - t0 - - f4 - 1 - t0 // f5 - 1 - f5 - - f5 - w3 - f4 // f6 - - f6 - 1 - f6 - i - t1 // f7 - 1 - t1 - i - f7 - iw3- f6 t0r = f0r + f1r; t0i = f0i - f1i; f1r = f0r - f1r; f1i = f0i + f1i; t1r = f2r - f3r; t1i = f2i - f3i; f2r = f2r + f3r; f2i = f2i + f3i; f0r = t0r + f2r; f0i = t0i + f2i; f2r = t0r - f2r; f2i = t0i - f2i; f3r = f1r + t1i; f3i = f1i - t1r; f1r = f1r - t1i; f1i = f1i + t1r; t0r = f4r + f5r; t0i = f4i + f5i; f5r = f4r - f5r; f5i = f4i - f5i; t1r = f6r - f7r; t1i = f6i - f7i; f6r = f6r + f7r; f6i = f6i + f7i; f4r = t0r + f6r; f4i = t0i + f6i; f6r = t0r - f6r; f6i = t0i - f6i; f7r = f5r + t1i; f7i = f5i - t1r; f5r = f5r - t1i; f5i = f5i + t1r; t0r = f0r - f4r; t0i = f0i - f4i; f0r = f0r + f4r; f0i = f0i + f4i; t1r = f2r + f6i; t1i = f2i - f6r; f2r = f2r - f6i; f2i = f2i + f6r; f4r = f1r - f5r * w0r + f5i * w0r; f4i = f1i - f5r * w0r - f5i * w0r; f1r = f1r * Two - f4r; f1i = f1i * Two - f4i; f6r = f3r + f7r * w0r + f7i * w0r; f6i = f3i - f7r * w0r + f7i * w0r; f3r = f3r * Two - f6r; f3i = f3i * Two - f6i; // store result ioptr[0] = scale * f0r; ioptr[1] = scale * f0i; ioptr[2] = scale * f1r; ioptr[3] = scale * f1i; ioptr[4] = scale * f2r; ioptr[5] = scale * f2i; ioptr[6] = scale * f3r; ioptr[7] = scale * f3i; ioptr[8] = scale * t0r; ioptr[9] = scale * t0i; ioptr[10] = scale * f4r; ioptr[11] = scale * f4i; ioptr[12] = scale * t1r; ioptr[13] = scale * t1i; ioptr[14] = scale * f6r; ioptr[15] = scale * f6i; } //------------------------------------------------------------------------------ // Start RIFFT //------------------------------------------------------------------------------ template void g_fft::ifrstage(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl) { unsigned int pos; unsigned int posi; unsigned int diffUcnt; FFT_TYPE *p0r, *p1r; FFT_TYPE *u0r, *u0i; FFT_TYPE w0r, w0i; FFT_TYPE f0r, f0i, f1r, f1i, f4r, f4i, f5r, f5i; FFT_TYPE t0r, t0i, t1r, t1i; const FFT_TYPE Two = FFT_TYPE(2.0); pos = POW2(M - 1); posi = pos + 1; p0r = ioptr; p1r = ioptr + pos / 2; u0r = Utbl + POW2(M - 3); w0r = *u0r, f0r = *(p0r); f0i = *(p0r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); f1r = *(p1r); f1i = *(p1r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); t0r = f0r + f0i; t0i = f0r - f0i; t1r = f4r + f4r; t1i = -f4i - f4i; f0r = f1r + f5r; f0i = f1i - f5i; f4r = f1r - f5r; f4i = f1i + f5i; f1r = f0r - w0r * f4r - w0r * f4i; f1i = f0i + w0r * f4r - w0r * f4i; f5r = Two * f0r - f1r; f5i = f1i - Two * f0i; *(p0r) = t0r; *(p0r + 1) = t0i; *(p0r + pos) = t1r; *(p0r + posi) = t1i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; u0r = Utbl + 1; u0i = Utbl + (POW2(M - 2) - 1); w0r = *u0r, w0i = *u0i; p0r = (ioptr + 2); p1r = (ioptr + (POW2(M - 2) - 1) * 2); // Butterflys // f0 - t0 - f0 // f1 - t1 -w0- f1 // f2 - t0 - f2 // f3 - t1 -iw0- f3 for (diffUcnt = POW2(M - 3) - 1; diffUcnt > 0; diffUcnt--) { f0r = *(p0r); f0i = *(p0r + 1); f5r = *(p1r + pos); f5i = *(p1r + posi); f1r = *(p1r); f1i = *(p1r + 1); f4r = *(p0r + pos); f4i = *(p0r + posi); t0r = f0r + f5r; t0i = f0i - f5i; t1r = f0r - f5r; t1i = f0i + f5i; f0r = t0r - w0i * t1r - w0r * t1i; f0i = t0i + w0r * t1r - w0i * t1i; f5r = Two * t0r - f0r; f5i = f0i - Two * t0i; t0r = f1r + f4r; t0i = f1i - f4i; t1r = f1r - f4r; t1i = f1i + f4i; f1r = t0r - w0r * t1r - w0i * t1i; f1i = t0i + w0i * t1r - w0r * t1i; f4r = Two * t0r - f1r; f4i = f1i - Two * t0i; *(p0r) = f0r; *(p0r + 1) = f0i; *(p1r + pos) = f5r; *(p1r + posi) = f5i; w0r = *++u0r; w0i = *--u0i; *(p1r) = f1r; *(p1r + 1) = f1i; *(p0r + pos) = f4r; *(p0r + posi) = f4i; p0r += 2; p1r -= 2; } } //------------------------------------------------------------------------------ // Compute in-place real ifft on the rows of the input array // data order as from rffts1 // INPUTS // *ioptr = input data array in the following order // M = log2 of fft size // Re(x[0]), Re(x[N/2]), Re(x[1]), Im(x[1]), // Re(x[2]), Im(x[2]), ... Re(x[N/2-1]), Im(x[N/2-1]). // *Utbl = cosine table // *BRLow = bit reversed counter table // OUTPUTS // *ioptr = real output data array //------------------------------------------------------------------------------ template void g_fft::riffts1(FFT_TYPE *ioptr, int M, FFT_TYPE *Utbl, short *BRLow) { FFT_TYPE scale; int StageCnt; int NDiffU; scale = (FFT_TYPE)(1.0 / (double)((int)POW2(M))); M = M - 1; switch (M) { case -1: break; case 0: rifft1pt(ioptr, scale); // a 2 pt fft break; case 1: rifft2pt(ioptr, scale); // a 4 pt fft break; case 2: rifft4pt(ioptr, scale); // an 8 pt fft break; case 3: rifft8pt(ioptr, scale); // a 16 pt fft break; default: ifrstage(ioptr, M + 1, Utbl); // bit reverse and first radix 2 stage scbitrevR2(ioptr, M, BRLow, scale); StageCnt = (M - 1) / 3; // number of radix 8 stages NDiffU = 2; // one radix 2 stage already complete if ((M - 1 - (StageCnt * 3)) == 1) { ibfR2(ioptr, M, NDiffU); // 1 radix 2 stage NDiffU *= 2; } if ((M - 1 - (StageCnt * 3)) == 2) { ibfR4(ioptr, M, NDiffU); // 1 radix 4 stage NDiffU *= 4; } if (M <= (int) MCACHE) ibfstages(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages else ifftrecurs(ioptr, M, Utbl, 2, NDiffU, StageCnt); // RADIX 8 Stages } } //============================================================================== // End of original C functions // // Wrapper methods for simple class access //============================================================================== //------------------------------------------------------------------------------ // malloc and init cosine and bit reversed tables for a given size // fft, ifft, rfft, rifft // INPUTS // M = log2 of fft size (ex M=10 for 1024 point fft) // OUTPUTS // private cosine and bit reversed tables //------------------------------------------------------------------------------ template void g_fft::fftInit() { for (int i = 0; i < 32; i++) { FFT_table_1[i] = (FFT_TYPE*)0; FFT_table_2[i] = (short int*)0; } FFT_N = ConvertFFTSize(FFT_size); // create and initialize cos table FFT_table_1[FFT_N] = new FFT_TYPE[(POW2(FFT_N) / 4 + 1)]; fftCosInit(FFT_N, FFT_table_1[FFT_N]); // create and initialize bit reverse tables FFT_table_2[FFT_N/2] = new short[POW2(FFT_N/2 - 1)]; fftBRInit(FFT_N, FFT_table_2[FFT_N/2]); FFT_table_2[(FFT_N - 1) / 2] = new short[POW2((FFT_N - 1) / 2 - 1)]; fftBRInit(FFT_N - 1, FFT_table_2[(FFT_N - 1) / 2]); Utbl = ((FFT_TYPE**) FFT_table_1)[FFT_N]; BRLow = ((short**) FFT_table_2)[FFT_N / 2]; } //------------------------------------------------------------------------------ // convert from N to LOG2(N) //------------------------------------------------------------------------------ template int g_fft::ConvertFFTSize(int N) { if (N <= 0) N = -N; switch (N) { case 0x00000001: return 0; // 1 case 0x00000002: return 1; // 2 case 0x00000004: return 2; // 4 case 0x00000008: return 3; // 8 case 0x00000010: return 4; // 16 case 0x00000020: return 5; // 32 case 0x00000040: return 6; // 64 case 0x00000080: return 7; // 128 case 0x00000100: return 8; // 256 case 0x00000200: return 9; // 512 case 0x00000400: return 10; // 1024 case 0x00000800: return 11; // 2048 case 0x00001000: return 12; // 4096 case 0x00002000: return 13; // 8192 case 0x00004000: return 14; // 16384 case 0x00008000: return 15; // 32768 case 0x00010000: return 16; // 65536 case 0x00020000: return 17; // 131072 case 0x00040000: return 18; // 262144 case 0x00080000: return 19; // 525288 case 0x00100000: return 20; // 1048576 case 0x00200000: return 21; // 2097152 case 0x00400000: return 22; // 4194304 case 0x00800000: return 23; // 8388608 case 0x01000000: return 24; // 16777216 case 0x02000000: return 25; // 33554432 case 0x04000000: return 26; // 67108864 case 0x08000000: return 27; // 134217728 case 0x10000000: return 28; // 268435456 } return 0; } //------------------------------------------------------------------------------ // Compute in-place complex FFT // FFTsize: FFT length in samples // buf: array of FFTsize*2 FFT_TYPE values, // in interleaved real/imaginary format //------------------------------------------------------------------------------ template void g_fft::ComplexFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); ffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Compute in-place inverse complex FFT // FFTsize: FFT length in samples // buf: array of FFTsize*2 FFT_TYPE values, // in interleaved real/imaginary format // Output should be scaled by the return value of // GetInverseComplexFFTScale(fft_struct, FFTsize). //------------------------------------------------------------------------------ template void g_fft::InverseComplexFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); iffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Compute in-place real FFT // FFTsize: FFT length in samples // buf: array of FFTsize FFT_TYPE values; output is in interleaved // real/imaginary format, except for buf[1] which is the real // part for the Nyquist frequency //------------------------------------------------------------------------------ template void g_fft::RealFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); rffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Compute in-place inverse real FFT // FFTsize: FFT length in samples // buf: array of FFTsize FFT_TYPE values; input is expected to be in // interleaved real/imaginary format, except for buf[1] which // is the real part for the Nyquist frequency // Output should be scaled by the return value of // GetInverseRealFFTScale(fft_struct, FFTsize). //------------------------------------------------------------------------------ template void g_fft::InverseRealFFT(std::complex *buf) { void *ptr = buf; FFT_TYPE *nbuf = static_cast(ptr); riffts1(nbuf, FFT_N, Utbl, BRLow); } //------------------------------------------------------------------------------ // Returns the amplitude scale that should be applied to the result of // an inverse complex FFT with a length of 'FFTsize' samples. //------------------------------------------------------------------------------ template FFT_TYPE g_fft::GetInverseComplexFFTScale() { return FFT_TYPE(1.0); } //------------------------------------------------------------------------------ // Returns the amplitude scale that should be applied to the result of // an inverse real FFT with a length of 'FFTsize' samples. //------------------------------------------------------------------------------ template FFT_TYPE g_fft::GetInverseRealFFTScale() { return FFT_TYPE(1.0); } #endif fldigi-4.2.05/src/include/outputencoder.h0000664000175000017500000000273114611711171015251 00000000000000// ---------------------------------------------------------------------------- // outputencoder.h -- output charset conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef OUTPUTENCODER_H #define OUTPUTENCODER_H #include #include class OutputEncoder { public: OutputEncoder(const int charset_out = TINICONV_CHARSET_UTF_8, unsigned int buffer_size = 32); ~OutputEncoder(void); void set_output_encoding(const int charset_out); void push(std::string s); const unsigned int pop(void); const unsigned int peek(void); private: unsigned int buffer_size; unsigned char *buffer; unsigned char *encoding_ptr; unsigned char *pop_ptr; //unsigned int data_length; tiniconv_ctx_s ctx; }; #endif fldigi-4.2.05/src/include/colorbox.h0000664000175000017500000000240314532252172014177 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef COLORBOX_H #define COLORBOX_H #include extern void loadPalette(); extern void savePalette(); extern void selectColor(int); extern void setColorButtons(); class colorbox : public Fl_Button { void draw(); public: colorbox(int x, int y, int w, int h, const char *label = 0) : Fl_Button(x,y,w,h,label) { Fl_Button::box(FL_DOWN_BOX); }; void end(){}; }; #endif fldigi-4.2.05/src/include/fd_logger.h0000664000175000017500000000262514611711171014303 00000000000000// ---------------------------------------------------------------------------- // fd_logger.h -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "qso_db.h" extern void FD_init(void); extern void FD_close(void); extern void FD_disconnect(); extern void FD_logoff(); extern void FD_add_record(); extern void FD_mode_check(); extern void FD_band_check(); extern int FD_dupcheck(); extern bool FD_connected; extern bool FD_logged_on; fldigi-4.2.05/src/include/mt63base.h0000664000175000017500000003153014532252172013777 00000000000000/* * mt63base.h -- MT63 transmitter and receiver in C++ for LINUX * * Copyright (c) 2007, 2008 Dave Freese, W1HKJ * * base class for use by fldigi * modified from original * excluded CW_ID which is a part of the base modem class for fldigi * * based on mt63 code by Pawel Jalocha * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * Copyright (c) 2007-2011 Dave Freese, W1HKJ * * This file is part of fldigi. * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #ifndef MT63BASE_H #define MT63BASE_H // ========================================================================== // Character encoder and block interleaver for the MT63 modem /* How to use this class: 1. Create or declare an object like: MT63encoder Encoder; 2. Preset the object for the given number of carriers and interleave: err=Encoder.Preset(,,); MT63 uses 64 carriers and interleave of 32 or 64 - the corresponding interleave patterns can be found in mt63.dat. If Encode.Preset() returns non-zero you are in big troubles ! 3. For each character to be encode you make the call: Encoder.Process(); and you should then take the bits from the Encode.Output - these are the bits to be sent out on the carriers. (for MT63 logical 0 means carrier flip, logical 1 is no flip). 4. At any time you can call Encoder.Preset() again to change the parameters (this will clean away the interleaver pipe). */ // MT63 modem specific routines, made to be compatible with the MT63ASC.ASM // (c) 1999 Pawel Jalocha, SP9VRC, jalocha@hpdel1.ifj.edu.pl // Date: 05-NOV-1999 class MT63encoder { public: MT63encoder(); ~MT63encoder(); void Free(); int Preset(int Carriers, int Intlv, int *Pattern, int RandFill=0); int Process(char code); char *Output; private: int DataCarriers; char CodeMask; int IntlvLen; int IntlvSize; int *IntlvPatt; char *IntlvPipe; int IntlvPtr; double *WalshBuff; } ; // ========================================================================== // MT63 deinterleaver and decoder /* How to use this class: 1. Create or declare an object: MT63decoder Decoder; 2. Preset given parameters with Decoder.Preset(); Decoder.Preset(); Number of carriers and interleave are same as for MT63encoder. "Margin" is the number of extra carriers demodulated on the side because with the MT63 you cannot say with full confidence which is really the first carrier: the FEC decoder have to tell you this. "Integ" is the integration period to find the best FEC match. "Integ" is measured in MT63 symbols (at 1000 kHz we do 10 symbols/s). 3. For each symbol period feed the demodulated data into the object: Decoder.Process(); and then get the demodulated character code from Decoder.Output You can get as well the measured signal-to-noise ratio from Decoder.SNR and the index of the first carrier (according to the FEC match) from Decoder.CarrOfs 4. You can change the parameters at any time with Decoder.Preset() (this will clean the data pipes). */ class MT63decoder { public: MT63decoder(); ~MT63decoder(); void Free(); int Preset(int Carriers, int Intlv, int *Pattern, int Margin, int Integ); int Process(double *Data); char Output; double SignalToNoise; int CarrOfs; private: int DataCarriers; double *IntlvPipe; int IntlvLen; int IntlvSize; int IntlvPtr; int *IntlvPatt; double *WalshBuff; int ScanLen; int ScanSize; double *DecodeSnrMid,*DecodeSnrOut; double W1, W2, W5; char *DecodePipe; int DecodeLen; int DecodeSize; int DecodePtr; } ; // ========================================================================== // MT63 transmitter /* How to use this class: 1. Create or declare an object: MT63tx Tx; 2. Preset parameters: Tx.Preset(,); Allowed values are: bandwidth=500,1000,2000; interleave=0,1; Non-zero value returned means there was a problem... 3. For each character to be sent: Tx.SendChar(); After each call to SendChar() you must read the samples from the Tx.Comb.Output.Data, the number of samples to read is in Tx.Comb.Output.Len. They are in double floating point, so you should convert them to 16-bit integers and output them to your soundcard. 4. If you have nothing to transmit, you must not stop, because you have to keep the sound going. MT63 transmits NL characters (code=0) in this case. 5. When you are done with all the characters and you want to stop, you should still put some NL characters in to flush the interleave thus please call the Tx.SendChar() Tx.DataInterleave times (still add few more characters to flush the windowed IFFT buffers). After that the MT63 transmits a jamming dspSequence for some time to speed up carrier drop at the receiver: you do this by calling Tx.SendJam(); 6. You can transmit few symbols of silence by: Tx.SendSilence() to make a gracefull switch-off. Remember: each time you call SendChar(), SendJam() or SendSilence() you must send the contains of Tx.Comb.Output out to your soundcard. Each Tx.SendXxx() produces the amount of sound corresponding to one symbol time that is 0.1 second for the 1000 Hz mode. The soundcard output rate must be 8000 Hz, rather precisely, that is the error should be below 1 Hz. If it is not you should use the rate converter: look into mt63tx for an example. 7. Inbetween transmissions you may change the settings by calling the Tx.Preset() again. */ class MT63tx { public: MT63tx(); ~MT63tx(); void Free(void); int Preset(double freq, int BandWidth=1000, int LongInterleave=0); int SendTune(bool twotones); int SendChar(char ch); int SendJam(void); int SendSilence(void); private: int DataCarriers; // the number of data carriers int FirstDataCarr; // the FFT index of the first data carrier int WindowLen; // FFT window and symbol shape length double *TxWindow; // The shape of the FFT window (=symbol shape) int AliasFilterLen; // anti-alias filter length //double *AliasShapeI, // *AliasShapeQ; // and shapes (for fixed lower freq of 500 Hz) int DecimateRatio; // decimation/interpolation after/before filter int *InterleavePattern; // how the bits of one block are placed on data carriers double TxAmpl; // Amplitude applied to generate a carrier (before IFFT) long CarrMarkCode; int CarrMarkAmpl; MT63encoder Encoder; // data encode and interleaver int *TxVect; // modulator vector (dspPhases) int *dspPhaseCorr; // dspPhase corrections for each carrier dspCmpx_buff WindowBuff; // FFT/window buffer dsp_r2FFT FFT; // FFT engine dspCmpxMixer txmixer; dspCmpxOverlapWindow Window; // overlapping window int ProcessTxVect(); public: int DataInterleave; dspQuadrComb Comb; // the output of this module is in Comb.Output } ; // ========================================================================== // MT63 receiver /* How to use this class: 1. Declare the object: MT63rx Rx; 2. Preset paramateres Rx.Preset(,,); For weak signals I recommend integration of 32 or more, otherwise 16 is enough. By the way, 16 means 1.6 second for 1000 Hz mode because then we transmit 10 symbols per second. 3. After EACH new batch of samples you should look into Rx.Output for the decoded characters. You can egzamin the receiver status at any time by calling: Rx.SYNC_LockStatus() => logical value 0 or 1 Rx.SYNC_Confidence() => lock confidence: a double between 0.0 and 1.0 Rx.FEC_SNR() => signal-to-noise seen by FEC Rx.TotalFreqOffset() => measured frequency offset in [Hz] assuming 8000 Hz sAmpling */ class MT63rx { public: MT63rx(); ~MT63rx(); void Free(void); int Preset( double freq, int BandWidth = 1000, int LongInterleave = 0, int Integ = 16, void (*Display)(double *Spectra, int Len) = NULL); int Process(double_buff *Input); char_buff Output; // decoded characters int SYNC_LockStatus(void); // 1 => locked, 0 => not locked double SYNC_Confidence(void); // lock confidence <0..1> double SYNC_FreqOffset(void); double SYNC_FreqDevdspRMS(void); double SYNC_TimeOffset(void); double TotalFreqOffset(); // Total frequency offset in [Hz] double FEC_SNR(void); // signal-to-noise ratio at the FEC int FEC_CarrOffset(void); private: dspQuadrSplit InpSplit; // input filter, I/Q splitter, decimator dspCmpxMixer TestOfs; // frequency offset for tests dspDelayLine ProcLine; // processing pipe int ProcdspDelay; // processing dspDelay for optimal symbol probing int SyncProcPtr; // sAmpling pointer for the synchronizer int DataProcPtr; // sAmpling pointer for the data demodulator dsp_r2FFT FFT; // FFT engine int WindowLen; // FFT window length = symbol shape length int WindowLenMask; // WindowLen-1 for pointer wrapping double *RxWindow; // FFT window shape = symbol shape void (*SpectraDisplay)(double *Spectra, int Len); double *SpectradspPower; int AliasFilterLen; // anti-alias filter length //double *AliasShapeI, // *AliasShapeQ; // and shapes int DecimateRatio; // decimation/interpolation after/before filter // how the bits of one block are placed on data carriers int *InterleavePattern; int DataInterleave; // data interleave depth int DataCarriers; // number of carriers int FirstDataCarr; // the FFT index of the first data carrier // int DataCarrSepar; // freq. separation between carriers [FFT bins] long CarrMarkCode; // code to mark carriers (not in use here) // int SymbolSepar; // time separation between symbols [samples] int ScanMargin; // How many carriers up and down to search int IntegLen; // Over how many symbols we integrate to synchronize int SymbolDiv; // =4 we probe the input 4 times per symbol time int SyncStep; // SymbolSepar/SymbolDiv int ScanFirst; // first carrier to scan int ScanLen; // number of carriers to scan dspCmpx *FFTbuff; dspCmpx *FFTbuff2; // here starts the time/frequency synchronizer void SyncProcess(dspCmpx *Slice); dspCmpx *SyncPipe[4]; // FFT result buffer for sync. int SyncPtr; // wrapping pointer for SyncPipe and integrators int SymbPtr; // points about where the symbol is dspCmpx *SyncPhCorr; // dspPhase corrections for the sync. processor dspCmpx *CorrelMid[4], *CorrelOut[4]; // correlation integrator double *dspPowerMid, *dspPowerOut; // carrier dspPower integrator dspCmpx *CorrelNorm[4]; // normalized correlation double W1, W2, W5; // correlation integrator weights double W1p, W2p, W5p; // dspPower integrator weights dspCmpx *CorrelAver[4]; // sliding sum to fit the carrier pattern int FitLen; void DoCorrelSum(dspCmpx *Correl1, dspCmpx *Correl2, dspCmpx *Aver); dspCmpx *SymbFit; // vectors to match symbol shift and confidence int SymbFitPos; // "smoothed" peak position double *FreqPipe; // smoothing pipe for frequency offset dspCmpx *SymbPipe; // smoothing pipe for symbol shift int TrackPipeLen; // tracking pipe length int TrackPipePtr; // pipe pointer double AverFreq; // dspAveraged frequency dspCmpx AverSymb; // dspAveraged symbol dspPhase double SyncLockThres; // lock confidence threshold double SyncHoldThres; // minimal confidence to hold the lock int SyncLocked; // locked or not locked double SyncSymbConf; // current smoothed confidence double SyncFreqOfs; // current smoothed frequency offset double SyncFreqDev; // frequency deviation (dspRMS) double SyncSymbShift; // current smoothed symbol time shift // here starts the data decoder void DataProcess( dspCmpx *EvenSlice, dspCmpx *OddSlice, double FreqOfs, int TimeDist); int DataScanMargin; // +/- data carriers to scan for best FEC match int DataScanLen; // total number of data carriers being processed int DataScanFirst; dspCmpx *RefDataSlice; // reference data slice for differential dspPhase decode dspCmpx *DataVect; // differentially decoded data vactor int DataPipeLen; // pipe length int DataPipePtr; // wrapping pointer dspCmpx **DataPipe; // decoded vectors pipe double *DataPwrMid, *DataPwrOut; // carrier dspPower integrator dspCmpx *DataSqrMid, *DataSqrOut; // carrier complex square integrator double dW1, dW2, dW5; // integrator constants double *DatadspPhase; // differential decoded dspPhases double *DatadspPhase2; // rather for debugging, not use otherwise MT63decoder Decoder; } ; #endif // MT63_BASE_H fldigi-4.2.05/src/include/speak.h0000664000175000017500000000205514532252172013456 00000000000000// ---------------------------------------------------------------------------- // speak.h Remote Log Interface for fldigi // // Copyright W1HKJ, Dave Freese 2009 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SPEAK_H #define _SPEAK_H extern const char *txtTalkInfo; void open_talker(); void close_talker(); void toggle_talker(); void speak(int c); #endif fldigi-4.2.05/src/include/play.pa.h0000664000175000017500000000541714611711171013721 00000000000000// Pulse Audio header #ifndef PLAY_PA_H #define PLAY_PA_H #include "config.h" #if USE_PORTAUDIO #include #include #include #include #include #include #include #include #include #include #include #include #include "threads.h" #include "trx.h" #include "ringbuffer.h" #include "filters.h" class cPA_snd_exception : public std::exception { public: cPA_snd_exception(int err_ = 0) : err(err_), msg(std::string("Sound error: ") + err_to_str(err_)) { } cPA_snd_exception(const char* msg_) : err(1), msg(msg_) { } cPA_snd_exception(int err_, const std::string& msg_) : err(err_), msg(msg_) { } virtual ~cPA_snd_exception() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: const char* err_to_str(int e) { return strerror(e); } int err; std::string msg; }; class cPA_exception : public cPA_snd_exception { public: cPA_exception(int err_ = 0) : cPA_snd_exception(err_, std::string("PortAudio error: ") + err_to_str(err_)) { } cPA_exception(const char* msg_) : cPA_snd_exception(msg_) { } protected: const char* err_to_str(int e) { return Pa_GetErrorText(e); } }; class c_portaudio { friend void process_alert(); friend void stream_process(); public: enum { ALERT, MONITOR }; int paError; float *data_frames; //[ MAX_FRAMES_PER_BUFFER * NUM_CHANNELS ]; int ptr; double sr; // sample rate of output sound codec int data_ptr; int num_frames; int state; SRC_STATE * rc; SRC_DATA rcdata; int rc_error; PaStream *stream; PaStreamParameters paStreamParameters; // sndfile interface SF_INFO playinfo; SNDFILE *playback; // transfer buffer from trx loop double *dbuffer; float *fbuffer; float *nubuffer; double b_sr; // sample rate of source monitor stream int b_len; // ringbuffer for streaming audio ringbuffer * monitor_rb; // bandpass filter for streaming audio C_FIR_filter *bpfilt; double flo; double fhi; double gain; public: c_portaudio(); ~c_portaudio(); int open();//void *); void close(); int is_open() { return stream != 0; } void play_buffer(float *buffer, int len, int _sr, int src = ALERT); void play_sound(int *sndbuffer, int len, int _sr); void play_sound(float *sndbuffer, int len, int _sr); void silence(float secs, int _sr); void mon_write(double *buffer, int len, int _sr); void process_mon(); size_t mon_read(float *buffer, int len); void do_play_file(std::string fname); void play_file(std::string fname); void play_mp3(std::string fname); void play_wav(std::string fname); void init_filter(); }; void open_alert_port(c_portaudio *cpa); void close_alert_port(c_portaudio *cpa); #endif #endif fldigi-4.2.05/src/include/textio.h0000664000175000017500000000241414532252172013666 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef MULTIPSK_H #define MULTIPSK_H #include "qso_db.h" class cTextFile { private: char header[120]; void makeHeader(); char *adif_to_date( char *s); char *adif_to_time( char *s); public: cTextFile () {}; ~cTextFile () {}; void writeCSVHeader(FILE *); int writeCSVFile (const char *, cQsoDb *); void writeTXTHeader(FILE *); int writeTXTFile (const char *, cQsoDb *); }; #endif fldigi-4.2.05/src/include/flmisc.h0000664000175000017500000000611414611711171013625 00000000000000// ---------------------------------------------------------------------------- // flmisc.h // // Copyright (C) 2009-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef fl_misc_h_ #define fl_misc_h_ #include #include #include #include #include #include #include #include #include "flinput2.h" unsigned quick_choice_menu(const char* title, unsigned sel, const Fl_Menu_Item* menu); unsigned quick_choice(const char* title, unsigned sel, ...); Fl_Color adjust_color(Fl_Color fg, Fl_Color bg); void adjust_color_inv(unsigned char& bg1r, unsigned char& bg1g, unsigned char& bg1b, Fl_Color bg2, Fl_Color def); #if !defined(__APPLE__) && !defined(__WOE32__) # include void make_pixmap(Pixmap *xpm, const char **data, int argc, char** argv); #endif struct dialog_positions { int used; int X; int Y; }; class notify_dialog : public Fl_Window { friend void show_notifier(notify_dialog *nd); Fl_Box icon; Fl_Input2 message; Fl_Dial dial; Fl_Return_Button button; Fl_Button *user_button; Fl_Box resize_box; double _timeout; int dialog_number; static dialog_positions positions[11]; public: notify_dialog(int X = 0, int Y = 0); ~notify_dialog(); int handle(int event); Fl_Button* make_button(int W, int H = 23); void notify(const char* msg, double timeout); private: static void button_cb(Fl_Widget* w, void*); static void dial_timer(void* arg); int newx; }; void show_notifier(notify_dialog *nd); #ifdef BUILD_FLDIGI #include #include // Avoid 'nitems' macro collision between FreeBSD's sys/params.h and fltk's // FL/Fl_Check_Browser.H (http://www.fltk.org/str.php?L2984) #undef nitems #include #define FLTK_nitems nitems #undef nitems // ^^^ Avoid 'nitems' macro collision #include "globals.h" class Mode_Browser : public Fl_Double_Window { public: Mode_Browser(void); ~Mode_Browser(void); void show_(mode_set_t* b); void callback(Fl_Callback* cb, void* args = 0); private: Fl_Button *close_button, *all_button, *none_button; Fl_Check_Browser* modes; mode_set_t* store; Fl_Callback* changed_cb; void* changed_args; static void modes_cb(Fl_Widget* w, void* arg); static void button_cb(Fl_Widget* w, void* arg); }; #endif // BUILD_FLDIGI #endif // fl_misc_h_ fldigi-4.2.05/src/include/FTextRXTX.h0000664000175000017500000001077414611711171014137 00000000000000// ---------------------------------------------------------------------------- // FTextView.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FTextRXTX_H_ #define FTextRXTX_H_ #include #include "FTextView.h" /// /// A TextBase subclass to display received & transmitted text /// class FTextRX : public FTextView { public: FTextRX(int x, int y, int w, int h, const char *l = 0); ~FTextRX(); virtual int handle(int event); #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR >= 3 virtual void add(unsigned int c, int attr = RECV); virtual void add(const char *s, int attr = RECV) { while (*s) add(*s++, attr); } #else virtual void add(unsigned char c, int attr = RECV); virtual void add(const char *s, int attr = RECV) { while (*s) add(*s++, attr); } #endif void set_all_entry(bool b); bool get_quick_entry(void) { return menu[RX_MENU_ALL_ENTRY].value(); } void set_scroll_hints(bool b); bool get_scroll_hints(void) { return menu[RX_MENU_SCROLL_HINTS].value(); } void mark(FTextBase::TEXT_ATTR attr = CLICK_START); void clear(void); void setFont(Fl_Font f, int attr = NATTR); protected: enum { RX_MENU_QRZ_THIS, RX_MENU_CALL, RX_MENU_NAME, RX_MENU_QTH, RX_MENU_STATE, RX_MENU_COUNTY, RX_MENU_PROVINCE, RX_MENU_COUNTRY, RX_MENU_LOC, RX_MENU_RST_IN, RX_MENU_RST_OUT, RX_MENU_XCHG, RX_MENU_SERIAL, RX_MENU_CLASS, RX_MENU_SECTION, RX_MENU_SS_SER, RX_MENU_SS_PRE, RX_MENU_SS_CHK, RX_MENU_SS_SEC, RX_MENU_CQZONE, RX_MENU_CQSTATE, RX_MENU_1010_NR, RX_MENU_AGE, RX_MENU_CHECK, RX_MENU_NAQP, RX_MENU_SCOUT, RX_MENU_TROOP, RX_MENU_POWER, RX_MENU_QSOP_STATE, RX_MENU_QSOP_COUNTY, RX_MENU_QSOP_SERNO, RX_MENU_QSOP_NAME, RX_MENU_QSOP_XCHG, RX_MENU_QSOP_CAT, RX_MENU_DIV, RX_MENU_COPY, RX_MENU_CLEAR, RX_MENU_SELECT_ALL, RX_MENU_SAVE, RX_MENU_WRAP, RX_MENU_ALL_ENTRY, RX_MENU_SCROLL_HINTS, RX_MENU_NUM_ITEMS }; int num_words; int handle_clickable(int x, int y); int handle_qso_data(int start, int end); void handle_qsy(int start, int end); void handle_context_menu(void); void menu_cb(size_t item); const char* dxcc_lookup_call(int x, int y); static void dxcc_tooltip(void* obj); private: FTextRX(); FTextRX(const FTextRX &t); protected: static Fl_Menu_Item menu[]; struct { bool enabled; float delay; } tooltips; }; /// /// A FTextBase subclass to display and edit text to be transmitted /// class FTextTX : public FTextEdit { public: FTextTX(int x, int y, int w, int h, const char *l = 0); virtual int handle(int event); void clear(void); void clear_sent(void); int nextChar(void); bool eot(void); void add_text(std::string s); void pause() { PauseBreak = true; } void setFont(Fl_Font f, int attr = NATTR); protected: enum { TX_MENU_TX, TX_MENU_RX, TX_MENU_ABORT, TX_MENU_MFSK16_IMG, TX_MENU_CUT, TX_MENU_COPY, TX_MENU_PASTE, TX_MENU_CLEAR, TX_MENU_READ, TX_MENU_WRAP }; int handle_key_shortcuts(int key); int handle_key(int key); int handle_key_macro(int key); int handle_dnd_drag(int pos); void handle_context_menu(void); void menu_cb(size_t item); void change_keybindings(void); static int kf_default(int c, Fl_Text_Editor_mod* e); static int kf_enter(int c, Fl_Text_Editor_mod* e); static int kf_delete(int c, Fl_Text_Editor_mod* e); static int kf_cut(int c, Fl_Text_Editor_mod* e); static int kf_paste(int c, Fl_Text_Editor_mod* e); private: FTextTX(); FTextTX(const FTextTX &t); protected: static Fl_Menu_Item menu[]; bool PauseBreak; int txpos; int utf8_txpos; static int *ptxpos; int bkspaces; }; #endif // FTextRXTX_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/fsk.h0000664000175000017500000000605714611711171013141 00000000000000// ---------------------------------------------------------------------------- // fsk.cxx -- FSK signal generator // // Copyright (C) 2021 // Dave Freese, W1HKJ // // This file is part of fldigi. // // This code bears some resemblance to code contained in gmfsk from which // it originated. Much has been changed, but credit should still be // given to Tomi Manninen (oh2bns@sral.fi), who so graciously distributed // his gmfsk modem under the GPL. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include //#include "io_timer.h" #include "serial.h" //#include "io_timer.h" #ifndef FSK_H #define FSK_H class FSK { // time (msec) for one symbollen @ 45.45 baud #define BITLEN 0.022 //22 #define FSK_UNKNOWN 0x000 #define FSK_LETTERS 0x100 #define FSK_FIGURES 0x200 #define LTRS 0x1F #define FIGS 0x1B #define FSK_MARK 1 #define FSK_SPACE 0 public: FSK(); ~FSK(); bool open(); bool close(); void abort(); bool sending(); void send(const char ch); void send(std::string s); void append(const char ch); void append(std::string s); void shift_on_space(bool b) { _shift_on_space = b; } bool shift_on_space() { return _shift_on_space; } void dtr(bool b) { _dtr = b; } bool dtr() { return _dtr; } void rts(bool b) { _dtr = !b; } bool rts() { return !_dtr; } void reverse(bool b) { _reverse = b; } bool reverse() { return _reverse; } void open_port(std::string device_name); void device(std::string device_name) { serial_device = device_name; } void fsk_shares_port(Cserial *shared_device); // size_t io_timer_id; Cserial *using_port() { return fsk_port; } private: Cserial *fsk_port; std::string serial_device; bool shared_port; // default is false static char letters[]; static char figures[]; static const char *ascii[]; int shift; bool _shift_on_space; bool _dtr; bool _reverse; int mode; int shift_state; int start_bits; int stop_bits; int chr_bits; std::string str_buff; int chr_out; int fsk_chr; int baudot_enc(int); void send_baudot(int ch); void fsk_out (bool); double fsk_now(); void fskbit (int, double); bool _sending; public: int callback_method(); int init_fsk_thread(); void exit_fsk_thread(); bool fsk_loop_terminate; pthread_t fsk_thread; friend void *fsk_loop(void *data); }; #endif fldigi-4.2.05/src/include/status_box.h0000664000175000017500000000313114611711171014537 00000000000000// // status_box.h // // status_box bar widget routines. // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _status_box_H #define _status_box_H // // Include necessary headers. // #include #include #include // // status_box class... // class status_box : public Fl_Box { private: void (*cbFunc)(Fl_Widget *, void *); protected: public: status_box(int x, int y, int w, int h, const char *label = "") : Fl_Box(x,y,w,h,label) { }; int handle(int e) { if (Fl::event_inside( this )) { if (e == FL_RELEASE) { do_callback(); return 1; } } return 0; } void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } }; #endif // !status_box fldigi-4.2.05/src/include/record_loader.h0000664000175000017500000000455414532252172015165 00000000000000// ---------------------------------------------------------------------------- // record_loader.h // // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef RECORD_LOADER_H #define RECORD_LOADER_H #include #include class RecordLoaderInterface { RecordLoaderInterface & operator=( const RecordLoaderInterface & ); public: RecordLoaderInterface(); virtual void Clear() = 0 ; /// Reads just one record. virtual bool ReadRecord( std::istream & ) = 0 ; /// Loads a file and stores it for later lookup. Returns the number of records, or -1. int LoadAndRegister(); std::string ContentSize() const ; virtual ~RecordLoaderInterface(); /// Base name. In case the URL is not nice enough to build a clean data filename. virtual std::string base_filename() const ; /// The place where we store the data locally. std::pair< std::string, bool > storage_filename(bool create_dir = false) const ; virtual const char * Url() const { return NULL; } virtual const char * Description() const = 0 ; std::string Timestamp() const; static void SetDataDir( const std::string & data_dir ); }; // RecordLoaderInterface /// Loads records from a file or an Url. template< class Catalog > class RecordLoaderSingleton { static Catalog s_cata_inst ; public: static Catalog & InstCatalog() { return s_cata_inst ; } }; template Catalog RecordLoaderSingleton< Catalog >::s_cata_inst = Catalog(); /// Loads tabular records from a file. template< class Catalog > struct RecordLoader : public RecordLoaderInterface, public RecordLoaderSingleton { }; // RecordLoader void createRecordLoader(); #endif // RECORD_LOADER_H fldigi-4.2.05/src/include/dr_mp3.h0000664000175000017500000045746114611711171013553 00000000000000/* MP3 audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file. dr_mp3 - v0.4.7 - 2019-07-28 David Reid - mackron@gmail.com Based off minimp3 (https://github.com/lieff/minimp3) which is where the real work was done. See the bottom of this file for differences between minimp3 and dr_mp3. */ /* USAGE ===== dr_mp3 is a single-file library. To use it, do something like the following in one .c file. #define DR_MP3_IMPLEMENTATION #include "dr_mp3.h" You can then #include this file in other parts of the program as you would with any other header file. To decode audio data, do something like the following: drmp3 mp3; if (!drmp3_init_file(&mp3, "MySong.mp3", NULL)) { // Failed to open file } ... drmp3_uint64 framesRead = drmp3_read_pcm_frames_f32(pMP3, framesToRead, pFrames); The drmp3 object is transparent so you can get access to the channel count and sample rate like so: drmp3_uint32 channels = mp3.channels; drmp3_uint32 sampleRate = mp3.sampleRate; The third parameter of drmp3_init_file() in the example above allows you to control the output channel count and sample rate. It is a pointer to a drmp3_config object. Setting any of the variables of this object to 0 will cause dr_mp3 to use defaults. The example above initializes a decoder from a file, but you can also initialize it from a block of memory and read and seek callbacks with drmp3_init_memory() and drmp3_init() respectively. You do not need to do any annoying memory management when reading PCM frames - this is all managed internally. You can request any number of PCM frames in each call to drmp3_read_pcm_frames_f32() and it will return as many PCM frames as it can, up to the requested amount. You can also decode an entire file in one go with drmp3_open_and_read_f32(), drmp3_open_memory_and_read_f32() and drmp3_open_file_and_read_f32(). OPTIONS ======= #define these options before including this file. #define DR_MP3_NO_STDIO Disable drmp3_init_file(), etc. #define DR_MP3_NO_SIMD Disable SIMD optimizations. */ #ifndef dr_mp3_h #define dr_mp3_h #ifdef __cplusplus extern "C" { #endif #include #if defined(_MSC_VER) && _MSC_VER < 1600 typedef signed char drmp3_int8; typedef unsigned char drmp3_uint8; typedef signed short drmp3_int16; typedef unsigned short drmp3_uint16; typedef signed int drmp3_int32; typedef unsigned int drmp3_uint32; typedef signed __int64 drmp3_int64; typedef unsigned __int64 drmp3_uint64; #else #include typedef int8_t drmp3_int8; typedef uint8_t drmp3_uint8; typedef int16_t drmp3_int16; typedef uint16_t drmp3_uint16; typedef int32_t drmp3_int32; typedef uint32_t drmp3_uint32; typedef int64_t drmp3_int64; typedef uint64_t drmp3_uint64; #endif typedef drmp3_uint8 drmp3_bool8; typedef drmp3_uint32 drmp3_bool32; #define DRMP3_TRUE 1 #define DRMP3_FALSE 0 #define DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME 1152 #define DRMP3_MAX_SAMPLES_PER_FRAME (DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME*2) #ifdef _MSC_VER #define DRMP3_INLINE __forceinline #else #ifdef __GNUC__ #define DRMP3_INLINE __inline__ __attribute__((always_inline)) #else #define DRMP3_INLINE #endif #endif /* Low Level Push API ================== */ typedef struct { int frame_bytes, channels, hz, layer, bitrate_kbps; } drmp3dec_frame_info; typedef struct { float mdct_overlap[2][9*32], qmf_state[15*2*32]; int reserv, free_format_bytes; unsigned char header[4], reserv_buf[511]; } drmp3dec; /* Initializes a low level decoder. */ void drmp3dec_init(drmp3dec *dec); /* Reads a frame from a low level decoder. */ int drmp3dec_decode_frame(drmp3dec *dec, const unsigned char *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info); /* Helper for converting between f32 and s16. */ void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, int num_samples); /* Main API (Pull API) =================== */ #ifndef DR_MP3_DEFAULT_CHANNELS #define DR_MP3_DEFAULT_CHANNELS 2 #endif #ifndef DR_MP3_DEFAULT_SAMPLE_RATE #define DR_MP3_DEFAULT_SAMPLE_RATE 44100 #endif typedef struct drmp3_src drmp3_src; typedef drmp3_uint64 (* drmp3_src_read_proc)(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, void* pUserData); /* Returns the number of frames that were read. */ typedef enum { drmp3_src_algorithm_none, drmp3_src_algorithm_linear } drmp3_src_algorithm; #define DRMP3_SRC_CACHE_SIZE_IN_FRAMES 512 typedef struct { drmp3_src* pSRC; float pCachedFrames[2 * DRMP3_SRC_CACHE_SIZE_IN_FRAMES]; drmp3_uint32 cachedFrameCount; drmp3_uint32 iNextFrame; } drmp3_src_cache; typedef struct { drmp3_uint32 sampleRateIn; drmp3_uint32 sampleRateOut; drmp3_uint32 channels; drmp3_src_algorithm algorithm; drmp3_uint32 cacheSizeInFrames; /* The number of frames to read from the client at a time. */ } drmp3_src_config; struct drmp3_src { drmp3_src_config config; drmp3_src_read_proc onRead; void* pUserData; float bin[256]; drmp3_src_cache cache; /* <-- For simplifying and optimizing client -> memory reading. */ union { struct { double alpha; drmp3_bool32 isPrevFramesLoaded : 1; drmp3_bool32 isNextFramesLoaded : 1; } linear; } algo; }; typedef enum { drmp3_seek_origin_start, drmp3_seek_origin_current } drmp3_seek_origin; typedef struct { drmp3_uint64 seekPosInBytes; /* Points to the first byte of an MP3 frame. */ drmp3_uint64 pcmFrameIndex; /* The index of the PCM frame this seek point targets. */ drmp3_uint16 mp3FramesToDiscard; /* The number of whole MP3 frames to be discarded before pcmFramesToDiscard. */ drmp3_uint16 pcmFramesToDiscard; /* The number of leading samples to read and discard. These are discarded after mp3FramesToDiscard. */ } drmp3_seek_point; /* Callback for when data is read. Return value is the number of bytes actually read. pUserData [in] The user data that was passed to drmp3_init(), drmp3_open() and family. pBufferOut [out] The output buffer. bytesToRead [in] The number of bytes to read. Returns the number of bytes actually read. A return value of less than bytesToRead indicates the end of the stream. Do _not_ return from this callback until either the entire bytesToRead is filled or you have reached the end of the stream. */ typedef size_t (* drmp3_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead); /* Callback for when data needs to be seeked. pUserData [in] The user data that was passed to drmp3_init(), drmp3_open() and family. offset [in] The number of bytes to move, relative to the origin. Will never be negative. origin [in] The origin of the seek - the current position or the start of the stream. Returns whether or not the seek was successful. Whether or not it is relative to the beginning or current position is determined by the "origin" parameter which will be either drmp3_seek_origin_start or drmp3_seek_origin_current. */ typedef drmp3_bool32 (* drmp3_seek_proc)(void* pUserData, int offset, drmp3_seek_origin origin); typedef struct { drmp3_uint32 outputChannels; drmp3_uint32 outputSampleRate; } drmp3_config; typedef struct { drmp3dec decoder; drmp3dec_frame_info frameInfo; drmp3_uint32 channels; drmp3_uint32 sampleRate; drmp3_read_proc onRead; drmp3_seek_proc onSeek; void* pUserData; drmp3_uint32 mp3FrameChannels; /* The number of channels in the currently loaded MP3 frame. Internal use only. */ drmp3_uint32 mp3FrameSampleRate; /* The sample rate of the currently loaded MP3 frame. Internal use only. */ drmp3_uint32 pcmFramesConsumedInMP3Frame; drmp3_uint32 pcmFramesRemainingInMP3Frame; drmp3_uint8 pcmFrames[sizeof(float)*DRMP3_MAX_SAMPLES_PER_FRAME]; /* <-- Multipled by sizeof(float) to ensure there's enough room for DR_MP3_FLOAT_OUTPUT. */ drmp3_uint64 currentPCMFrame; /* The current PCM frame, globally, based on the output sample rate. Mainly used for seeking. */ drmp3_uint64 streamCursor; /* The current byte the decoder is sitting on in the raw stream. */ drmp3_src src; drmp3_seek_point* pSeekPoints; /* NULL by default. Set with drmp3_bind_seek_table(). Memory is owned by the client. dr_mp3 will never attempt to free this pointer. */ drmp3_uint32 seekPointCount; /* The number of items in pSeekPoints. When set to 0 assumes to no seek table. Defaults to zero. */ size_t dataSize; size_t dataCapacity; drmp3_uint8* pData; drmp3_bool32 atEnd : 1; struct { const drmp3_uint8* pData; size_t dataSize; size_t currentReadPos; } memory; /* Only used for decoders that were opened against a block of memory. */ } drmp3; /* Initializes an MP3 decoder. onRead [in] The function to call when data needs to be read from the client. onSeek [in] The function to call when the read position of the client data needs to move. pUserData [in, optional] A pointer to application defined data that will be passed to onRead and onSeek. Returns true if successful; false otherwise. Close the loader with drmp3_uninit(). See also: drmp3_init_file(), drmp3_init_memory(), drmp3_uninit() */ drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig); /* Initializes an MP3 decoder from a block of memory. This does not create a copy of the data. It is up to the application to ensure the buffer remains valid for the lifetime of the drmp3 object. The buffer should contain the contents of the entire MP3 file. */ drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_config* pConfig); #ifndef DR_MP3_NO_STDIO /* Initializes an MP3 decoder from a file. This holds the internal FILE object until drmp3_uninit() is called. Keep this in mind if you're caching drmp3 objects because the operating system may restrict the number of file handles an application can have open at any given time. */ drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* filePath, const drmp3_config* pConfig); #endif /* Uninitializes an MP3 decoder. */ void drmp3_uninit(drmp3* pMP3); /* Reads PCM frames as interleaved 32-bit IEEE floating point PCM. Note that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames. */ drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut); /* Reads PCM frames as interleaved signed 16-bit integer PCM. Note that framesToRead specifies the number of PCM frames to read, _not_ the number of MP3 frames. */ drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut); /* Seeks to a specific frame. Note that this is _not_ an MP3 frame, but rather a PCM frame. */ drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex); /* Calculates the total number of PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet radio. Runs in linear time. Returns 0 on error. */ drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3); /* Calculates the total number of MP3 frames in the MP3 stream. Cannot be used for infinite streams such as internet radio. Runs in linear time. Returns 0 on error. */ drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3); /* Calculates the total number of MP3 and PCM frames in the MP3 stream. Cannot be used for infinite streams such as internet radio. Runs in linear time. Returns 0 on error. This is equivalent to calling drmp3_get_mp3_frame_count() and drmp3_get_pcm_frame_count() except that it's more efficient. */ drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount); /* Calculates the seekpoints based on PCM frames. This is slow. pSeekpoint count is a pointer to a uint32 containing the seekpoint count. On input it contains the desired count. On output it contains the actual count. The reason for this design is that the client may request too many seekpoints, in which case dr_mp3 will return a corrected count. Note that seektable seeking is not quite sample exact when the MP3 stream contains inconsistent sample rates. */ drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints); /* Binds a seek table to the decoder. This does _not_ make a copy of pSeekPoints - it only references it. It is up to the application to ensure this remains valid while it is bound to the decoder. Use drmp3_calculate_seek_points() to calculate the seek points. */ drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints); /* Opens an decodes an entire MP3 stream as a single operation. pConfig is both an input and output. On input it contains what you want. On output it contains what you got. Free the returned pointer with drmp3_free(). */ float* drmp3_open_and_read_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); drmp3_int16* drmp3_open_and_read_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); float* drmp3_open_memory_and_read_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); drmp3_int16* drmp3_open_memory_and_read_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); #ifndef DR_MP3_NO_STDIO float* drmp3_open_file_and_read_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); drmp3_int16* drmp3_open_file_and_read_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount); #endif /* Frees any memory that was allocated by a public drmp3 API. */ void drmp3_free(void* p); #ifdef __cplusplus } #endif #endif /* dr_mp3_h */ /************************************************************************************************************************************************************ ************************************************************************************************************************************************************ IMPLEMENTATION ************************************************************************************************************************************************************ ************************************************************************************************************************************************************/ #ifdef DR_MP3_IMPLEMENTATION #include #include #include /* For INT_MAX */ /* Disable SIMD when compiling with TCC for now. */ #if defined(__TINYC__) #define DR_MP3_NO_SIMD #endif #define DRMP3_OFFSET_PTR(p, offset) ((void*)((drmp3_uint8*)(p) + (offset))) #define DRMP3_MAX_FREE_FORMAT_FRAME_SIZE 2304 /* more than ISO spec's */ #ifndef DRMP3_MAX_FRAME_SYNC_MATCHES #define DRMP3_MAX_FRAME_SYNC_MATCHES 10 #endif #define DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES DRMP3_MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */ #define DRMP3_MAX_BITRESERVOIR_BYTES 511 #define DRMP3_SHORT_BLOCK_TYPE 2 #define DRMP3_STOP_BLOCK_TYPE 3 #define DRMP3_MODE_MONO 3 #define DRMP3_MODE_JOINT_STEREO 1 #define DRMP3_HDR_SIZE 4 #define DRMP3_HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0) #define DRMP3_HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60) #define DRMP3_HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0) #define DRMP3_HDR_IS_CRC(h) (!((h[1]) & 1)) #define DRMP3_HDR_TEST_PADDING(h) ((h[2]) & 0x2) #define DRMP3_HDR_TEST_MPEG1(h) ((h[1]) & 0x8) #define DRMP3_HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10) #define DRMP3_HDR_TEST_I_STEREO(h) ((h[3]) & 0x10) #define DRMP3_HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20) #define DRMP3_HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3) #define DRMP3_HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3) #define DRMP3_HDR_GET_LAYER(h) (((h[1]) >> 1) & 3) #define DRMP3_HDR_GET_BITRATE(h) ((h[2]) >> 4) #define DRMP3_HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3) #define DRMP3_HDR_GET_MY_SAMPLE_RATE(h) (DRMP3_HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3) #define DRMP3_HDR_IS_FRAME_576(h) ((h[1] & 14) == 2) #define DRMP3_HDR_IS_LAYER_1(h) ((h[1] & 6) == 6) #define DRMP3_BITS_DEQUANTIZER_OUT -1 #define DRMP3_MAX_SCF (255 + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210) #define DRMP3_MAX_SCFI ((DRMP3_MAX_SCF + 3) & ~3) #define DRMP3_MIN(a, b) ((a) > (b) ? (b) : (a)) #define DRMP3_MAX(a, b) ((a) < (b) ? (b) : (a)) #if !defined(DR_MP3_NO_SIMD) #if !defined(DR_MP3_ONLY_SIMD) && (defined(_M_X64) || defined(_M_ARM64) || defined(__x86_64__) || defined(__aarch64__)) /* x64 always have SSE2, arm64 always have neon, no need for generic code */ #define DR_MP3_ONLY_SIMD #endif #if ((defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__)) #if defined(_MSC_VER) #include #endif #include #define DRMP3_HAVE_SSE 1 #define DRMP3_HAVE_SIMD 1 #define DRMP3_VSTORE _mm_storeu_ps #define DRMP3_VLD _mm_loadu_ps #define DRMP3_VSET _mm_set1_ps #define DRMP3_VADD _mm_add_ps #define DRMP3_VSUB _mm_sub_ps #define DRMP3_VMUL _mm_mul_ps #define DRMP3_VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y)) #define DRMP3_VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y)) #define DRMP3_VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s)) #define DRMP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3)) typedef __m128 drmp3_f4; #if defined(_MSC_VER) || defined(DR_MP3_ONLY_SIMD) #define drmp3_cpuid __cpuid #else static __inline__ __attribute__((always_inline)) void drmp3_cpuid(int CPUInfo[], const int InfoType) { #if defined(__PIC__) __asm__ __volatile__( #if defined(__x86_64__) "push %%rbx\n" "cpuid\n" "xchgl %%ebx, %1\n" "pop %%rbx\n" #else "xchgl %%ebx, %1\n" "cpuid\n" "xchgl %%ebx, %1\n" #endif : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : "a" (InfoType)); #else __asm__ __volatile__( "cpuid" : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : "a" (InfoType)); #endif } #endif static int drmp3_have_simd() { #ifdef DR_MP3_ONLY_SIMD return 1; #else static int g_have_simd; int CPUInfo[4]; #ifdef MINIMP3_TEST static int g_counter; if (g_counter++ > 100) return 0; #endif if (g_have_simd) goto end; drmp3_cpuid(CPUInfo, 0); if (CPUInfo[0] > 0) { drmp3_cpuid(CPUInfo, 1); g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */ return g_have_simd - 1; } end: return g_have_simd - 1; #endif } #elif defined(__ARM_NEON) || defined(__aarch64__) #include #define DRMP3_HAVE_SIMD 1 #define DRMP3_VSTORE vst1q_f32 #define DRMP3_VLD vld1q_f32 #define DRMP3_VSET vmovq_n_f32 #define DRMP3_VADD vaddq_f32 #define DRMP3_VSUB vsubq_f32 #define DRMP3_VMUL vmulq_f32 #define DRMP3_VMAC(a, x, y) vmlaq_f32(a, x, y) #define DRMP3_VMSB(a, x, y) vmlsq_f32(a, x, y) #define DRMP3_VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s)) #define DRMP3_VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x))) typedef float32x4_t drmp3_f4; static int drmp3_have_simd() { /* TODO: detect neon for !DR_MP3_ONLY_SIMD */ return 1; } #else #define DRMP3_HAVE_SIMD 0 #ifdef DR_MP3_ONLY_SIMD #error DR_MP3_ONLY_SIMD used, but SSE/NEON not enabled #endif #endif #else #define DRMP3_HAVE_SIMD 0 #endif typedef struct { const drmp3_uint8 *buf; int pos, limit; } drmp3_bs; typedef struct { float scf[3*64]; drmp3_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64]; } drmp3_L12_scale_info; typedef struct { drmp3_uint8 tab_offset, code_tab_width, band_count; } drmp3_L12_subband_alloc; typedef struct { const drmp3_uint8 *sfbtab; drmp3_uint16 part_23_length, big_values, scalefac_compress; drmp3_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb; drmp3_uint8 table_select[3], region_count[3], subblock_gain[3]; drmp3_uint8 preflag, scalefac_scale, count1_table, scfsi; } drmp3_L3_gr_info; typedef struct { drmp3_bs bs; drmp3_uint8 maindata[DRMP3_MAX_BITRESERVOIR_BYTES + DRMP3_MAX_L3_FRAME_PAYLOAD_BYTES]; drmp3_L3_gr_info gr_info[4]; float grbuf[2][576], scf[40], syn[18 + 15][2*32]; drmp3_uint8 ist_pos[2][39]; } drmp3dec_scratch; static void drmp3_bs_init(drmp3_bs *bs, const drmp3_uint8 *data, int bytes) { bs->buf = data; bs->pos = 0; bs->limit = bytes*8; } static drmp3_uint32 drmp3_bs_get_bits(drmp3_bs *bs, int n) { drmp3_uint32 next, cache = 0, s = bs->pos & 7; int shl = n + s; const drmp3_uint8 *p = bs->buf + (bs->pos >> 3); if ((bs->pos += n) > bs->limit) return 0; next = *p++ & (255 >> s); while ((shl -= 8) > 0) { cache |= next << shl; next = *p++; } return cache | (next >> -shl); } static int drmp3_hdr_valid(const drmp3_uint8 *h) { return h[0] == 0xff && ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) && (DRMP3_HDR_GET_LAYER(h) != 0) && (DRMP3_HDR_GET_BITRATE(h) != 15) && (DRMP3_HDR_GET_SAMPLE_RATE(h) != 3); } static int drmp3_hdr_compare(const drmp3_uint8 *h1, const drmp3_uint8 *h2) { return drmp3_hdr_valid(h2) && ((h1[1] ^ h2[1]) & 0xFE) == 0 && ((h1[2] ^ h2[2]) & 0x0C) == 0 && !(DRMP3_HDR_IS_FREE_FORMAT(h1) ^ DRMP3_HDR_IS_FREE_FORMAT(h2)); } static unsigned drmp3_hdr_bitrate_kbps(const drmp3_uint8 *h) { static const drmp3_uint8 halfrate[2][3][15] = { { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } }, { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } }, }; return 2*halfrate[!!DRMP3_HDR_TEST_MPEG1(h)][DRMP3_HDR_GET_LAYER(h) - 1][DRMP3_HDR_GET_BITRATE(h)]; } static unsigned drmp3_hdr_sample_rate_hz(const drmp3_uint8 *h) { static const unsigned g_hz[3] = { 44100, 48000, 32000 }; return g_hz[DRMP3_HDR_GET_SAMPLE_RATE(h)] >> (int)!DRMP3_HDR_TEST_MPEG1(h) >> (int)!DRMP3_HDR_TEST_NOT_MPEG25(h); } static unsigned drmp3_hdr_frame_samples(const drmp3_uint8 *h) { return DRMP3_HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)DRMP3_HDR_IS_FRAME_576(h)); } static int drmp3_hdr_frame_bytes(const drmp3_uint8 *h, int free_format_size) { int frame_bytes = drmp3_hdr_frame_samples(h)*drmp3_hdr_bitrate_kbps(h)*125/drmp3_hdr_sample_rate_hz(h); if (DRMP3_HDR_IS_LAYER_1(h)) { frame_bytes &= ~3; /* slot align */ } return frame_bytes ? frame_bytes : free_format_size; } static int drmp3_hdr_padding(const drmp3_uint8 *h) { return DRMP3_HDR_TEST_PADDING(h) ? (DRMP3_HDR_IS_LAYER_1(h) ? 4 : 1) : 0; } #ifndef DR_MP3_ONLY_MP3 static const drmp3_L12_subband_alloc *drmp3_L12_subband_alloc_table(const drmp3_uint8 *hdr, drmp3_L12_scale_info *sci) { const drmp3_L12_subband_alloc *alloc; int mode = DRMP3_HDR_GET_STEREO_MODE(hdr); int nbands, stereo_bands = (mode == DRMP3_MODE_MONO) ? 0 : (mode == DRMP3_MODE_JOINT_STEREO) ? (DRMP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32; if (DRMP3_HDR_IS_LAYER_1(hdr)) { static const drmp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } }; alloc = g_alloc_L1; nbands = 32; } else if (!DRMP3_HDR_TEST_MPEG1(hdr)) { static const drmp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } }; alloc = g_alloc_L2M2; nbands = 30; } else { static const drmp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } }; int sample_rate_idx = DRMP3_HDR_GET_SAMPLE_RATE(hdr); unsigned kbps = drmp3_hdr_bitrate_kbps(hdr) >> (int)(mode != DRMP3_MODE_MONO); if (!kbps) /* free-format */ { kbps = 192; } alloc = g_alloc_L2M1; nbands = 27; if (kbps < 56) { static const drmp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } }; alloc = g_alloc_L2M1_lowrate; nbands = sample_rate_idx == 2 ? 12 : 8; } else if (kbps >= 96 && sample_rate_idx != 1) { nbands = 30; } } sci->total_bands = (drmp3_uint8)nbands; sci->stereo_bands = (drmp3_uint8)DRMP3_MIN(stereo_bands, nbands); return alloc; } static void drmp3_L12_read_scalefactors(drmp3_bs *bs, drmp3_uint8 *pba, drmp3_uint8 *scfcod, int bands, float *scf) { static const float g_deq_L12[18*3] = { #define DRMP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x DRMP3_DQ(3),DRMP3_DQ(7),DRMP3_DQ(15),DRMP3_DQ(31),DRMP3_DQ(63),DRMP3_DQ(127),DRMP3_DQ(255),DRMP3_DQ(511),DRMP3_DQ(1023),DRMP3_DQ(2047),DRMP3_DQ(4095),DRMP3_DQ(8191),DRMP3_DQ(16383),DRMP3_DQ(32767),DRMP3_DQ(65535),DRMP3_DQ(3),DRMP3_DQ(5),DRMP3_DQ(9) }; int i, m; for (i = 0; i < bands; i++) { float s = 0; int ba = *pba++; int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0; for (m = 4; m; m >>= 1) { if (mask & m) { int b = drmp3_bs_get_bits(bs, 6); s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3); } *scf++ = s; } } } static void drmp3_L12_read_scale_info(const drmp3_uint8 *hdr, drmp3_bs *bs, drmp3_L12_scale_info *sci) { static const drmp3_uint8 g_bitalloc_code_tab[] = { 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16, 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16, 0,17,18, 3,19,4,5,16, 0,17,18,16, 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15, 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14, 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16 }; const drmp3_L12_subband_alloc *subband_alloc = drmp3_L12_subband_alloc_table(hdr, sci); int i, k = 0, ba_bits = 0; const drmp3_uint8 *ba_code_tab = g_bitalloc_code_tab; for (i = 0; i < sci->total_bands; i++) { drmp3_uint8 ba; if (i == k) { k += subband_alloc->band_count; ba_bits = subband_alloc->code_tab_width; ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset; subband_alloc++; } ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)]; sci->bitalloc[2*i] = ba; if (i < sci->stereo_bands) { ba = ba_code_tab[drmp3_bs_get_bits(bs, ba_bits)]; } sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0; } for (i = 0; i < 2*sci->total_bands; i++) { sci->scfcod[i] = (drmp3_uint8)(sci->bitalloc[i] ? DRMP3_HDR_IS_LAYER_1(hdr) ? 2 : drmp3_bs_get_bits(bs, 2) : 6); } drmp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf); for (i = sci->stereo_bands; i < sci->total_bands; i++) { sci->bitalloc[2*i + 1] = 0; } } static int drmp3_L12_dequantize_granule(float *grbuf, drmp3_bs *bs, drmp3_L12_scale_info *sci, int group_size) { int i, j, k, choff = 576; for (j = 0; j < 4; j++) { float *dst = grbuf + group_size*j; for (i = 0; i < 2*sci->total_bands; i++) { int ba = sci->bitalloc[i]; if (ba != 0) { if (ba < 17) { int half = (1 << (ba - 1)) - 1; for (k = 0; k < group_size; k++) { dst[k] = (float)((int)drmp3_bs_get_bits(bs, ba) - half); } } else { unsigned mod = (2 << (ba - 17)) + 1; /* 3, 5, 9 */ unsigned code = drmp3_bs_get_bits(bs, mod + 2 - (mod >> 3)); /* 5, 7, 10 */ for (k = 0; k < group_size; k++, code /= mod) { dst[k] = (float)((int)(code % mod - mod/2)); } } } dst += choff; choff = 18 - choff; } } return group_size*4; } static void drmp3_L12_apply_scf_384(drmp3_L12_scale_info *sci, const float *scf, float *dst) { int i, k; memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float)); for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6) { for (k = 0; k < 12; k++) { dst[k + 0] *= scf[0]; dst[k + 576] *= scf[3]; } } } #endif static int drmp3_L3_read_side_info(drmp3_bs *bs, drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr) { static const drmp3_uint8 g_scf_long[8][23] = { { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 }, { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 }, { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 }, { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 }, { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 }, { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 } }; static const drmp3_uint8 g_scf_short[8][40] = { { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } }; static const drmp3_uint8 g_scf_mixed[8][40] = { { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 }, { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 }, { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 }, { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 }, { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 }, { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 }, { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 } }; unsigned tables, scfsi = 0; int main_data_begin, part_23_sum = 0; int gr_count = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2; int sr_idx = DRMP3_HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0); if (DRMP3_HDR_TEST_MPEG1(hdr)) { gr_count *= 2; main_data_begin = drmp3_bs_get_bits(bs, 9); scfsi = drmp3_bs_get_bits(bs, 7 + gr_count); } else { main_data_begin = drmp3_bs_get_bits(bs, 8 + gr_count) >> gr_count; } do { if (DRMP3_HDR_IS_MONO(hdr)) { scfsi <<= 4; } gr->part_23_length = (drmp3_uint16)drmp3_bs_get_bits(bs, 12); part_23_sum += gr->part_23_length; gr->big_values = (drmp3_uint16)drmp3_bs_get_bits(bs, 9); if (gr->big_values > 288) { return -1; } gr->global_gain = (drmp3_uint8)drmp3_bs_get_bits(bs, 8); gr->scalefac_compress = (drmp3_uint16)drmp3_bs_get_bits(bs, DRMP3_HDR_TEST_MPEG1(hdr) ? 4 : 9); gr->sfbtab = g_scf_long[sr_idx]; gr->n_long_sfb = 22; gr->n_short_sfb = 0; if (drmp3_bs_get_bits(bs, 1)) { gr->block_type = (drmp3_uint8)drmp3_bs_get_bits(bs, 2); if (!gr->block_type) { return -1; } gr->mixed_block_flag = (drmp3_uint8)drmp3_bs_get_bits(bs, 1); gr->region_count[0] = 7; gr->region_count[1] = 255; if (gr->block_type == DRMP3_SHORT_BLOCK_TYPE) { scfsi &= 0x0F0F; if (!gr->mixed_block_flag) { gr->region_count[0] = 8; gr->sfbtab = g_scf_short[sr_idx]; gr->n_long_sfb = 0; gr->n_short_sfb = 39; } else { gr->sfbtab = g_scf_mixed[sr_idx]; gr->n_long_sfb = DRMP3_HDR_TEST_MPEG1(hdr) ? 8 : 6; gr->n_short_sfb = 30; } } tables = drmp3_bs_get_bits(bs, 10); tables <<= 5; gr->subblock_gain[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3); gr->subblock_gain[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3); gr->subblock_gain[2] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3); } else { gr->block_type = 0; gr->mixed_block_flag = 0; tables = drmp3_bs_get_bits(bs, 15); gr->region_count[0] = (drmp3_uint8)drmp3_bs_get_bits(bs, 4); gr->region_count[1] = (drmp3_uint8)drmp3_bs_get_bits(bs, 3); gr->region_count[2] = 255; } gr->table_select[0] = (drmp3_uint8)(tables >> 10); gr->table_select[1] = (drmp3_uint8)((tables >> 5) & 31); gr->table_select[2] = (drmp3_uint8)((tables) & 31); gr->preflag = (drmp3_uint8)(DRMP3_HDR_TEST_MPEG1(hdr) ? drmp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500)); gr->scalefac_scale = (drmp3_uint8)drmp3_bs_get_bits(bs, 1); gr->count1_table = (drmp3_uint8)drmp3_bs_get_bits(bs, 1); gr->scfsi = (drmp3_uint8)((scfsi >> 12) & 15); scfsi <<= 4; gr++; } while(--gr_count); if (part_23_sum + bs->pos > bs->limit + main_data_begin*8) { return -1; } return main_data_begin; } static void drmp3_L3_read_scalefactors(drmp3_uint8 *scf, drmp3_uint8 *ist_pos, const drmp3_uint8 *scf_size, const drmp3_uint8 *scf_count, drmp3_bs *bitbuf, int scfsi) { int i, k; for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2) { int cnt = scf_count[i]; if (scfsi & 8) { memcpy(scf, ist_pos, cnt); } else { int bits = scf_size[i]; if (!bits) { memset(scf, 0, cnt); memset(ist_pos, 0, cnt); } else { int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1; for (k = 0; k < cnt; k++) { int s = drmp3_bs_get_bits(bitbuf, bits); ist_pos[k] = (drmp3_uint8)(s == max_scf ? -1 : s); scf[k] = (drmp3_uint8)s; } } } ist_pos += cnt; scf += cnt; } scf[0] = scf[1] = scf[2] = 0; } static float drmp3_L3_ldexp_q2(float y, int exp_q2) { static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f }; int e; do { e = DRMP3_MIN(30*4, exp_q2); y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2)); } while ((exp_q2 -= e) > 0); return y; } static void drmp3_L3_decode_scalefactors(const drmp3_uint8 *hdr, drmp3_uint8 *ist_pos, drmp3_bs *bs, const drmp3_L3_gr_info *gr, float *scf, int ch) { static const drmp3_uint8 g_scf_partitions[3][28] = { { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 }, { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 }, { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 } }; const drmp3_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb]; drmp3_uint8 scf_size[4], iscf[40]; int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi; float gain; if (DRMP3_HDR_TEST_MPEG1(hdr)) { static const drmp3_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 }; int part = g_scfc_decode[gr->scalefac_compress]; scf_size[1] = scf_size[0] = (drmp3_uint8)(part >> 2); scf_size[3] = scf_size[2] = (drmp3_uint8)(part & 3); } else { static const drmp3_uint8 g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 }; int k, modprod, sfc, ist = DRMP3_HDR_TEST_I_STEREO(hdr) && ch; sfc = gr->scalefac_compress >> ist; for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4) { for (modprod = 1, i = 3; i >= 0; i--) { scf_size[i] = (drmp3_uint8)(sfc / modprod % g_mod[k + i]); modprod *= g_mod[k + i]; } } scf_partition += k; scfsi = -16; } drmp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi); if (gr->n_short_sfb) { int sh = 3 - scf_shift; for (i = 0; i < gr->n_short_sfb; i += 3) { iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh; iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh; iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh; } } else if (gr->preflag) { static const drmp3_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 }; for (i = 0; i < 10; i++) { iscf[11 + i] += g_preamp[i]; } } gain_exp = gr->global_gain + DRMP3_BITS_DEQUANTIZER_OUT*4 - 210 - (DRMP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0); gain = drmp3_L3_ldexp_q2(1 << (DRMP3_MAX_SCFI/4), DRMP3_MAX_SCFI - gain_exp); for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++) { scf[i] = drmp3_L3_ldexp_q2(gain, iscf[i] << scf_shift); } } static const float g_drmp3_pow43[129 + 16] = { 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f, 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f }; static float drmp3_L3_pow_43(int x) { float frac; int sign, mult = 256; if (x < 129) { return g_drmp3_pow43[16 + x]; } if (x < 1024) { mult = 16; x <<= 3; } sign = 2*x & 64; frac = (float)((x & 63) - sign) / ((x & ~63) + sign); return g_drmp3_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult; } static void drmp3_L3_huffman(float *dst, drmp3_bs *bs, const drmp3_L3_gr_info *gr_info, const float *scf, int layer3gr_limit) { static const drmp3_int16 tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288, -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288, -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258, -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259, -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258, -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258, -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259, -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258, -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290, -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259, -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258, -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259, -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258, -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 }; static const drmp3_uint8 tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205}; static const drmp3_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 }; static const drmp3_int16 tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 }; static const drmp3_uint8 g_linbits[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 }; #define DRMP3_PEEK_BITS(n) (bs_cache >> (32 - n)) #define DRMP3_FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); } #define DRMP3_CHECK_BITS while (bs_sh >= 0) { bs_cache |= (drmp3_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; } #define DRMP3_BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh) float one = 0.0f; int ireg = 0, big_val_cnt = gr_info->big_values; const drmp3_uint8 *sfb = gr_info->sfbtab; const drmp3_uint8 *bs_next_ptr = bs->buf + bs->pos/8; drmp3_uint32 bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7); int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8; bs_next_ptr += 4; while (big_val_cnt > 0) { int tab_num = gr_info->table_select[ireg]; int sfb_cnt = gr_info->region_count[ireg++]; const drmp3_int16 *codebook = tabs + tabindex[tab_num]; int linbits = g_linbits[tab_num]; if (linbits) { do { np = *sfb++ / 2; pairs_to_decode = DRMP3_MIN(big_val_cnt, np); one = *scf++; do { int j, w = 5; int leaf = codebook[DRMP3_PEEK_BITS(w)]; while (leaf < 0) { DRMP3_FLUSH_BITS(w); w = leaf & 7; leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)]; } DRMP3_FLUSH_BITS(leaf >> 8); for (j = 0; j < 2; j++, dst++, leaf >>= 4) { int lsb = leaf & 0x0F; if (lsb == 15) { lsb += DRMP3_PEEK_BITS(linbits); DRMP3_FLUSH_BITS(linbits); DRMP3_CHECK_BITS; *dst = one*drmp3_L3_pow_43(lsb)*((drmp3_int32)bs_cache < 0 ? -1: 1); } else { *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; } DRMP3_FLUSH_BITS(lsb ? 1 : 0); } DRMP3_CHECK_BITS; } while (--pairs_to_decode); } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); } else { do { np = *sfb++ / 2; pairs_to_decode = DRMP3_MIN(big_val_cnt, np); one = *scf++; do { int j, w = 5; int leaf = codebook[DRMP3_PEEK_BITS(w)]; while (leaf < 0) { DRMP3_FLUSH_BITS(w); w = leaf & 7; leaf = codebook[DRMP3_PEEK_BITS(w) - (leaf >> 3)]; } DRMP3_FLUSH_BITS(leaf >> 8); for (j = 0; j < 2; j++, dst++, leaf >>= 4) { int lsb = leaf & 0x0F; *dst = g_drmp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one; DRMP3_FLUSH_BITS(lsb ? 1 : 0); } DRMP3_CHECK_BITS; } while (--pairs_to_decode); } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0); } } for (np = 1 - big_val_cnt;; dst += 4) { const drmp3_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32; int leaf = codebook_count1[DRMP3_PEEK_BITS(4)]; if (!(leaf & 8)) { leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))]; } DRMP3_FLUSH_BITS(leaf & 7); if (DRMP3_BSPOS > layer3gr_limit) { break; } #define DRMP3_RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; } #define DRMP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((drmp3_int32)bs_cache < 0) ? -one : one; DRMP3_FLUSH_BITS(1) } DRMP3_RELOAD_SCALEFACTOR; DRMP3_DEQ_COUNT1(0); DRMP3_DEQ_COUNT1(1); DRMP3_RELOAD_SCALEFACTOR; DRMP3_DEQ_COUNT1(2); DRMP3_DEQ_COUNT1(3); DRMP3_CHECK_BITS; } bs->pos = layer3gr_limit; } static void drmp3_L3_midside_stereo(float *left, int n) { int i = 0; float *right = left + 576; #if DRMP3_HAVE_SIMD if (drmp3_have_simd()) for (; i < n - 3; i += 4) { drmp3_f4 vl = DRMP3_VLD(left + i); drmp3_f4 vr = DRMP3_VLD(right + i); DRMP3_VSTORE(left + i, DRMP3_VADD(vl, vr)); DRMP3_VSTORE(right + i, DRMP3_VSUB(vl, vr)); } #endif for (; i < n; i++) { float a = left[i]; float b = right[i]; left[i] = a + b; right[i] = a - b; } } static void drmp3_L3_intensity_stereo_band(float *left, int n, float kl, float kr) { int i; for (i = 0; i < n; i++) { left[i + 576] = left[i]*kr; left[i] = left[i]*kl; } } static void drmp3_L3_stereo_top_band(const float *right, const drmp3_uint8 *sfb, int nbands, int max_band[3]) { int i, k; max_band[0] = max_band[1] = max_band[2] = -1; for (i = 0; i < nbands; i++) { for (k = 0; k < sfb[i]; k += 2) { if (right[k] != 0 || right[k + 1] != 0) { max_band[i % 3] = i; break; } } right += sfb[i]; } } static void drmp3_L3_stereo_process(float *left, const drmp3_uint8 *ist_pos, const drmp3_uint8 *sfb, const drmp3_uint8 *hdr, int max_band[3], int mpeg2_sh) { static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 }; unsigned i, max_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 7 : 64; for (i = 0; sfb[i]; i++) { unsigned ipos = ist_pos[i]; if ((int)i > max_band[i % 3] && ipos < max_pos) { float kl, kr, s = DRMP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1; if (DRMP3_HDR_TEST_MPEG1(hdr)) { kl = g_pan[2*ipos]; kr = g_pan[2*ipos + 1]; } else { kl = 1; kr = drmp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh); if (ipos & 1) { kl = kr; kr = 1; } } drmp3_L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s); } else if (DRMP3_HDR_TEST_MS_STEREO(hdr)) { drmp3_L3_midside_stereo(left, sfb[i]); } left += sfb[i]; } } static void drmp3_L3_intensity_stereo(float *left, drmp3_uint8 *ist_pos, const drmp3_L3_gr_info *gr, const drmp3_uint8 *hdr) { int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb; int i, max_blocks = gr->n_short_sfb ? 3 : 1; drmp3_L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band); if (gr->n_long_sfb) { max_band[0] = max_band[1] = max_band[2] = DRMP3_MAX(DRMP3_MAX(max_band[0], max_band[1]), max_band[2]); } for (i = 0; i < max_blocks; i++) { int default_pos = DRMP3_HDR_TEST_MPEG1(hdr) ? 3 : 0; int itop = n_sfb - max_blocks + i; int prev = itop - max_blocks; ist_pos[itop] = (drmp3_uint8)(max_band[i] >= prev ? default_pos : ist_pos[prev]); } drmp3_L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1); } static void drmp3_L3_reorder(float *grbuf, float *scratch, const drmp3_uint8 *sfb) { int i, len; float *src = grbuf, *dst = scratch; for (;0 != (len = *sfb); sfb += 3, src += 2*len) { for (i = 0; i < len; i++, src++) { *dst++ = src[0*len]; *dst++ = src[1*len]; *dst++ = src[2*len]; } } memcpy(grbuf, scratch, (dst - scratch)*sizeof(float)); } static void drmp3_L3_antialias(float *grbuf, int nbands) { static const float g_aa[2][8] = { {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f}, {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f} }; for (; nbands > 0; nbands--, grbuf += 18) { int i = 0; #if DRMP3_HAVE_SIMD if (drmp3_have_simd()) for (; i < 8; i += 4) { drmp3_f4 vu = DRMP3_VLD(grbuf + 18 + i); drmp3_f4 vd = DRMP3_VLD(grbuf + 14 - i); drmp3_f4 vc0 = DRMP3_VLD(g_aa[0] + i); drmp3_f4 vc1 = DRMP3_VLD(g_aa[1] + i); vd = DRMP3_VREV(vd); DRMP3_VSTORE(grbuf + 18 + i, DRMP3_VSUB(DRMP3_VMUL(vu, vc0), DRMP3_VMUL(vd, vc1))); vd = DRMP3_VADD(DRMP3_VMUL(vu, vc1), DRMP3_VMUL(vd, vc0)); DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vd)); } #endif #ifndef DR_MP3_ONLY_SIMD for(; i < 8; i++) { float u = grbuf[18 + i]; float d = grbuf[17 - i]; grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i]; grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i]; } #endif } } static void drmp3_L3_dct3_9(float *y) { float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4; s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8]; t0 = s0 + s6*0.5f; s0 -= s6; t4 = (s4 + s2)*0.93969262f; t2 = (s8 + s2)*0.76604444f; s6 = (s4 - s8)*0.17364818f; s4 += s8 - s2; s2 = s0 - s4*0.5f; y[4] = s4 + s0; s8 = t0 - t2 + s6; s0 = t0 - t4 + t2; s4 = t0 + t4 - s6; s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7]; s3 *= 0.86602540f; t0 = (s5 + s1)*0.98480775f; t4 = (s5 - s7)*0.34202014f; t2 = (s1 + s7)*0.64278761f; s1 = (s1 - s5 - s7)*0.86602540f; s5 = t0 - s3 - t2; s7 = t4 - s3 - t0; s3 = t4 + s3 - t2; y[0] = s4 - s7; y[1] = s2 + s1; y[2] = s0 - s3; y[3] = s8 + s5; y[5] = s8 - s5; y[6] = s0 + s3; y[7] = s2 - s1; y[8] = s4 + s7; } static void drmp3_L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands) { int i, j; static const float g_twid9[18] = { 0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f }; for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9) { float co[9], si[9]; co[0] = -grbuf[0]; si[0] = grbuf[17]; for (i = 0; i < 4; i++) { si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2]; co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2]; si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3]; co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]); } drmp3_L3_dct3_9(co); drmp3_L3_dct3_9(si); si[1] = -si[1]; si[3] = -si[3]; si[5] = -si[5]; si[7] = -si[7]; i = 0; #if DRMP3_HAVE_SIMD if (drmp3_have_simd()) for (; i < 8; i += 4) { drmp3_f4 vovl = DRMP3_VLD(overlap + i); drmp3_f4 vc = DRMP3_VLD(co + i); drmp3_f4 vs = DRMP3_VLD(si + i); drmp3_f4 vr0 = DRMP3_VLD(g_twid9 + i); drmp3_f4 vr1 = DRMP3_VLD(g_twid9 + 9 + i); drmp3_f4 vw0 = DRMP3_VLD(window + i); drmp3_f4 vw1 = DRMP3_VLD(window + 9 + i); drmp3_f4 vsum = DRMP3_VADD(DRMP3_VMUL(vc, vr1), DRMP3_VMUL(vs, vr0)); DRMP3_VSTORE(overlap + i, DRMP3_VSUB(DRMP3_VMUL(vc, vr0), DRMP3_VMUL(vs, vr1))); DRMP3_VSTORE(grbuf + i, DRMP3_VSUB(DRMP3_VMUL(vovl, vw0), DRMP3_VMUL(vsum, vw1))); vsum = DRMP3_VADD(DRMP3_VMUL(vovl, vw1), DRMP3_VMUL(vsum, vw0)); DRMP3_VSTORE(grbuf + 14 - i, DRMP3_VREV(vsum)); } #endif for (; i < 9; i++) { float ovl = overlap[i]; float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i]; overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i]; grbuf[i] = ovl*window[0 + i] - sum*window[9 + i]; grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i]; } } } static void drmp3_L3_idct3(float x0, float x1, float x2, float *dst) { float m1 = x1*0.86602540f; float a1 = x0 - x2*0.5f; dst[1] = x0 + x2; dst[0] = a1 + m1; dst[2] = a1 - m1; } static void drmp3_L3_imdct12(float *x, float *dst, float *overlap) { static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f }; float co[3], si[3]; int i; drmp3_L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co); drmp3_L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si); si[1] = -si[1]; for (i = 0; i < 3; i++) { float ovl = overlap[i]; float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i]; overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i]; dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i]; dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i]; } } static void drmp3_L3_imdct_short(float *grbuf, float *overlap, int nbands) { for (;nbands > 0; nbands--, overlap += 9, grbuf += 18) { float tmp[18]; memcpy(tmp, grbuf, sizeof(tmp)); memcpy(grbuf, overlap, 6*sizeof(float)); drmp3_L3_imdct12(tmp, grbuf + 6, overlap + 6); drmp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6); drmp3_L3_imdct12(tmp + 2, overlap, overlap + 6); } } static void drmp3_L3_change_sign(float *grbuf) { int b, i; for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36) for (i = 1; i < 18; i += 2) grbuf[i] = -grbuf[i]; } static void drmp3_L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands) { static const float g_mdct_window[2][18] = { { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f }, { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f } }; if (n_long_bands) { drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands); grbuf += 18*n_long_bands; overlap += 9*n_long_bands; } if (block_type == DRMP3_SHORT_BLOCK_TYPE) drmp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands); else drmp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == DRMP3_STOP_BLOCK_TYPE], 32 - n_long_bands); } static void drmp3_L3_save_reservoir(drmp3dec *h, drmp3dec_scratch *s) { int pos = (s->bs.pos + 7)/8u; int remains = s->bs.limit/8u - pos; if (remains > DRMP3_MAX_BITRESERVOIR_BYTES) { pos += remains - DRMP3_MAX_BITRESERVOIR_BYTES; remains = DRMP3_MAX_BITRESERVOIR_BYTES; } if (remains > 0) { memmove(h->reserv_buf, s->maindata + pos, remains); } h->reserv = remains; } static int drmp3_L3_restore_reservoir(drmp3dec *h, drmp3_bs *bs, drmp3dec_scratch *s, int main_data_begin) { int frame_bytes = (bs->limit - bs->pos)/8; int bytes_have = DRMP3_MIN(h->reserv, main_data_begin); memcpy(s->maindata, h->reserv_buf + DRMP3_MAX(0, h->reserv - main_data_begin), DRMP3_MIN(h->reserv, main_data_begin)); memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes); drmp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes); return h->reserv >= main_data_begin; } static void drmp3_L3_decode(drmp3dec *h, drmp3dec_scratch *s, drmp3_L3_gr_info *gr_info, int nch) { int ch; for (ch = 0; ch < nch; ch++) { int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length; drmp3_L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch); drmp3_L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit); } if (DRMP3_HDR_TEST_I_STEREO(h->header)) { drmp3_L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header); } else if (DRMP3_HDR_IS_MS_STEREO(h->header)) { drmp3_L3_midside_stereo(s->grbuf[0], 576); } for (ch = 0; ch < nch; ch++, gr_info++) { int aa_bands = 31; int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(DRMP3_HDR_GET_MY_SAMPLE_RATE(h->header) == 2); if (gr_info->n_short_sfb) { aa_bands = n_long_bands - 1; drmp3_L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb); } drmp3_L3_antialias(s->grbuf[ch], aa_bands); drmp3_L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands); drmp3_L3_change_sign(s->grbuf[ch]); } } static void drmp3d_DCT_II(float *grbuf, int n) { static const float g_sec[24] = { 10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f }; int i, k = 0; #if DRMP3_HAVE_SIMD if (drmp3_have_simd()) for (; k < n; k += 4) { drmp3_f4 t[4][8], *x; float *y = grbuf + k; for (x = t[0], i = 0; i < 8; i++, x++) { drmp3_f4 x0 = DRMP3_VLD(&y[i*18]); drmp3_f4 x1 = DRMP3_VLD(&y[(15 - i)*18]); drmp3_f4 x2 = DRMP3_VLD(&y[(16 + i)*18]); drmp3_f4 x3 = DRMP3_VLD(&y[(31 - i)*18]); drmp3_f4 t0 = DRMP3_VADD(x0, x3); drmp3_f4 t1 = DRMP3_VADD(x1, x2); drmp3_f4 t2 = DRMP3_VMUL_S(DRMP3_VSUB(x1, x2), g_sec[3*i + 0]); drmp3_f4 t3 = DRMP3_VMUL_S(DRMP3_VSUB(x0, x3), g_sec[3*i + 1]); x[0] = DRMP3_VADD(t0, t1); x[8] = DRMP3_VMUL_S(DRMP3_VSUB(t0, t1), g_sec[3*i + 2]); x[16] = DRMP3_VADD(t3, t2); x[24] = DRMP3_VMUL_S(DRMP3_VSUB(t3, t2), g_sec[3*i + 2]); } for (x = t[0], i = 0; i < 4; i++, x += 8) { drmp3_f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; xt = DRMP3_VSUB(x0, x7); x0 = DRMP3_VADD(x0, x7); x7 = DRMP3_VSUB(x1, x6); x1 = DRMP3_VADD(x1, x6); x6 = DRMP3_VSUB(x2, x5); x2 = DRMP3_VADD(x2, x5); x5 = DRMP3_VSUB(x3, x4); x3 = DRMP3_VADD(x3, x4); x4 = DRMP3_VSUB(x0, x3); x0 = DRMP3_VADD(x0, x3); x3 = DRMP3_VSUB(x1, x2); x1 = DRMP3_VADD(x1, x2); x[0] = DRMP3_VADD(x0, x1); x[4] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x1), 0.70710677f); x5 = DRMP3_VADD(x5, x6); x6 = DRMP3_VMUL_S(DRMP3_VADD(x6, x7), 0.70710677f); x7 = DRMP3_VADD(x7, xt); x3 = DRMP3_VMUL_S(DRMP3_VADD(x3, x4), 0.70710677f); x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */ x7 = DRMP3_VADD(x7, DRMP3_VMUL_S(x5, 0.382683432f)); x5 = DRMP3_VSUB(x5, DRMP3_VMUL_S(x7, 0.198912367f)); x0 = DRMP3_VSUB(xt, x6); xt = DRMP3_VADD(xt, x6); x[1] = DRMP3_VMUL_S(DRMP3_VADD(xt, x7), 0.50979561f); x[2] = DRMP3_VMUL_S(DRMP3_VADD(x4, x3), 0.54119611f); x[3] = DRMP3_VMUL_S(DRMP3_VSUB(x0, x5), 0.60134488f); x[5] = DRMP3_VMUL_S(DRMP3_VADD(x0, x5), 0.89997619f); x[6] = DRMP3_VMUL_S(DRMP3_VSUB(x4, x3), 1.30656302f); x[7] = DRMP3_VMUL_S(DRMP3_VSUB(xt, x7), 2.56291556f); } if (k > n - 3) { #if DRMP3_HAVE_SSE #define DRMP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v) #else #define DRMP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v)) #endif for (i = 0; i < 7; i++, y += 4*18) { drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]); DRMP3_VSAVE2(0, t[0][i]); DRMP3_VSAVE2(1, DRMP3_VADD(t[2][i], s)); DRMP3_VSAVE2(2, DRMP3_VADD(t[1][i], t[1][i + 1])); DRMP3_VSAVE2(3, DRMP3_VADD(t[2][1 + i], s)); } DRMP3_VSAVE2(0, t[0][7]); DRMP3_VSAVE2(1, DRMP3_VADD(t[2][7], t[3][7])); DRMP3_VSAVE2(2, t[1][7]); DRMP3_VSAVE2(3, t[3][7]); } else { #define DRMP3_VSAVE4(i, v) DRMP3_VSTORE(&y[i*18], v) for (i = 0; i < 7; i++, y += 4*18) { drmp3_f4 s = DRMP3_VADD(t[3][i], t[3][i + 1]); DRMP3_VSAVE4(0, t[0][i]); DRMP3_VSAVE4(1, DRMP3_VADD(t[2][i], s)); DRMP3_VSAVE4(2, DRMP3_VADD(t[1][i], t[1][i + 1])); DRMP3_VSAVE4(3, DRMP3_VADD(t[2][1 + i], s)); } DRMP3_VSAVE4(0, t[0][7]); DRMP3_VSAVE4(1, DRMP3_VADD(t[2][7], t[3][7])); DRMP3_VSAVE4(2, t[1][7]); DRMP3_VSAVE4(3, t[3][7]); } } else #endif #ifdef DR_MP3_ONLY_SIMD {} #else for (; k < n; k++) { float t[4][8], *x, *y = grbuf + k; for (x = t[0], i = 0; i < 8; i++, x++) { float x0 = y[i*18]; float x1 = y[(15 - i)*18]; float x2 = y[(16 + i)*18]; float x3 = y[(31 - i)*18]; float t0 = x0 + x3; float t1 = x1 + x2; float t2 = (x1 - x2)*g_sec[3*i + 0]; float t3 = (x0 - x3)*g_sec[3*i + 1]; x[0] = t0 + t1; x[8] = (t0 - t1)*g_sec[3*i + 2]; x[16] = t3 + t2; x[24] = (t3 - t2)*g_sec[3*i + 2]; } for (x = t[0], i = 0; i < 4; i++, x += 8) { float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt; xt = x0 - x7; x0 += x7; x7 = x1 - x6; x1 += x6; x6 = x2 - x5; x2 += x5; x5 = x3 - x4; x3 += x4; x4 = x0 - x3; x0 += x3; x3 = x1 - x2; x1 += x2; x[0] = x0 + x1; x[4] = (x0 - x1)*0.70710677f; x5 = x5 + x6; x6 = (x6 + x7)*0.70710677f; x7 = x7 + xt; x3 = (x3 + x4)*0.70710677f; x5 -= x7*0.198912367f; /* rotate by PI/8 */ x7 += x5*0.382683432f; x5 -= x7*0.198912367f; x0 = xt - x6; xt += x6; x[1] = (xt + x7)*0.50979561f; x[2] = (x4 + x3)*0.54119611f; x[3] = (x0 - x5)*0.60134488f; x[5] = (x0 + x5)*0.89997619f; x[6] = (x4 - x3)*1.30656302f; x[7] = (xt - x7)*2.56291556f; } for (i = 0; i < 7; i++, y += 4*18) { y[0*18] = t[0][i]; y[1*18] = t[2][i] + t[3][i] + t[3][i + 1]; y[2*18] = t[1][i] + t[1][i + 1]; y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1]; } y[0*18] = t[0][7]; y[1*18] = t[2][7] + t[3][7]; y[2*18] = t[1][7]; y[3*18] = t[3][7]; } #endif } #ifndef DR_MP3_FLOAT_OUTPUT typedef drmp3_int16 drmp3d_sample_t; static drmp3_int16 drmp3d_scale_pcm(float sample) { drmp3_int16 s; if (sample >= 32766.5) return (drmp3_int16) 32767; if (sample <= -32767.5) return (drmp3_int16)-32768; s = (drmp3_int16)(sample + .5f); s -= (s < 0); /* away from zero, to be compliant */ return (drmp3_int16)s; } #else typedef float drmp3d_sample_t; static float drmp3d_scale_pcm(float sample) { return sample*(1.f/32768.f); } #endif static void drmp3d_synth_pair(drmp3d_sample_t *pcm, int nch, const float *z) { float a; a = (z[14*64] - z[ 0]) * 29; a += (z[ 1*64] + z[13*64]) * 213; a += (z[12*64] - z[ 2*64]) * 459; a += (z[ 3*64] + z[11*64]) * 2037; a += (z[10*64] - z[ 4*64]) * 5153; a += (z[ 5*64] + z[ 9*64]) * 6574; a += (z[ 8*64] - z[ 6*64]) * 37489; a += z[ 7*64] * 75038; pcm[0] = drmp3d_scale_pcm(a); z += 2; a = z[14*64] * 104; a += z[12*64] * 1567; a += z[10*64] * 9727; a += z[ 8*64] * 64019; a += z[ 6*64] * -9975; a += z[ 4*64] * -45; a += z[ 2*64] * 146; a += z[ 0*64] * -5; pcm[16*nch] = drmp3d_scale_pcm(a); } static void drmp3d_synth(float *xl, drmp3d_sample_t *dstl, int nch, float *lins) { int i; float *xr = xl + 576*(nch - 1); drmp3d_sample_t *dstr = dstl + (nch - 1); static const float g_win[] = { -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992, -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856, -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630, -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313, -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908, -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415, -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835, -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169, -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420, -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590, -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679, -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692, -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629, -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494, -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290 }; float *zlin = lins + 15*64; const float *w = g_win; zlin[4*15] = xl[18*16]; zlin[4*15 + 1] = xr[18*16]; zlin[4*15 + 2] = xl[0]; zlin[4*15 + 3] = xr[0]; zlin[4*31] = xl[1 + 18*16]; zlin[4*31 + 1] = xr[1 + 18*16]; zlin[4*31 + 2] = xl[1]; zlin[4*31 + 3] = xr[1]; drmp3d_synth_pair(dstr, nch, lins + 4*15 + 1); drmp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1); drmp3d_synth_pair(dstl, nch, lins + 4*15); drmp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64); #if DRMP3_HAVE_SIMD if (drmp3_have_simd()) for (i = 14; i >= 0; i--) { #define DRMP3_VLOAD(k) drmp3_f4 w0 = DRMP3_VSET(*w++); drmp3_f4 w1 = DRMP3_VSET(*w++); drmp3_f4 vz = DRMP3_VLD(&zlin[4*i - 64*k]); drmp3_f4 vy = DRMP3_VLD(&zlin[4*i - 64*(15 - k)]); #define DRMP3_V0(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0)) ; a = DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1)); } #define DRMP3_V1(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vz, w0), DRMP3_VMUL(vy, w1))); } #define DRMP3_V2(k) { DRMP3_VLOAD(k) b = DRMP3_VADD(b, DRMP3_VADD(DRMP3_VMUL(vz, w1), DRMP3_VMUL(vy, w0))); a = DRMP3_VADD(a, DRMP3_VSUB(DRMP3_VMUL(vy, w1), DRMP3_VMUL(vz, w0))); } drmp3_f4 a, b; zlin[4*i] = xl[18*(31 - i)]; zlin[4*i + 1] = xr[18*(31 - i)]; zlin[4*i + 2] = xl[1 + 18*(31 - i)]; zlin[4*i + 3] = xr[1 + 18*(31 - i)]; zlin[4*i + 64] = xl[1 + 18*(1 + i)]; zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)]; zlin[4*i - 64 + 2] = xl[18*(1 + i)]; zlin[4*i - 64 + 3] = xr[18*(1 + i)]; DRMP3_V0(0) DRMP3_V2(1) DRMP3_V1(2) DRMP3_V2(3) DRMP3_V1(4) DRMP3_V2(5) DRMP3_V1(6) DRMP3_V2(7) { #ifndef DR_MP3_FLOAT_OUTPUT #if DRMP3_HAVE_SSE static const drmp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f }; static const drmp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f }; __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)), _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min))); dstr[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 1); dstr[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 5); dstl[(15 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 0); dstl[(17 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 4); dstr[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 3); dstr[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 7); dstl[(47 - i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 2); dstl[(49 + i)*nch] = (drmp3_int16)_mm_extract_epi16(pcm8, 6); #else int16x4_t pcma, pcmb; a = DRMP3_VADD(a, DRMP3_VSET(0.5f)); b = DRMP3_VADD(b, DRMP3_VSET(0.5f)); pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0))))); pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0))))); vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1); vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1); vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0); vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0); vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3); vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3); vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2); vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2); #endif #else static const drmp3_f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f }; a = DRMP3_VMUL(a, g_scale); b = DRMP3_VMUL(b, g_scale); #if DRMP3_HAVE_SSE _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1))); _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1))); _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0))); _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0))); _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3))); _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3))); _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2))); _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2))); #else vst1q_lane_f32(dstr + (15 - i)*nch, a, 1); vst1q_lane_f32(dstr + (17 + i)*nch, b, 1); vst1q_lane_f32(dstl + (15 - i)*nch, a, 0); vst1q_lane_f32(dstl + (17 + i)*nch, b, 0); vst1q_lane_f32(dstr + (47 - i)*nch, a, 3); vst1q_lane_f32(dstr + (49 + i)*nch, b, 3); vst1q_lane_f32(dstl + (47 - i)*nch, a, 2); vst1q_lane_f32(dstl + (49 + i)*nch, b, 2); #endif #endif /* DR_MP3_FLOAT_OUTPUT */ } } else #endif #ifdef DR_MP3_ONLY_SIMD {} #else for (i = 14; i >= 0; i--) { #define DRMP3_LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64]; #define DRMP3_S0(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; } #define DRMP3_S1(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; } #define DRMP3_S2(k) { int j; DRMP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; } float a[4], b[4]; zlin[4*i] = xl[18*(31 - i)]; zlin[4*i + 1] = xr[18*(31 - i)]; zlin[4*i + 2] = xl[1 + 18*(31 - i)]; zlin[4*i + 3] = xr[1 + 18*(31 - i)]; zlin[4*(i + 16)] = xl[1 + 18*(1 + i)]; zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)]; zlin[4*(i - 16) + 2] = xl[18*(1 + i)]; zlin[4*(i - 16) + 3] = xr[18*(1 + i)]; DRMP3_S0(0) DRMP3_S2(1) DRMP3_S1(2) DRMP3_S2(3) DRMP3_S1(4) DRMP3_S2(5) DRMP3_S1(6) DRMP3_S2(7) dstr[(15 - i)*nch] = drmp3d_scale_pcm(a[1]); dstr[(17 + i)*nch] = drmp3d_scale_pcm(b[1]); dstl[(15 - i)*nch] = drmp3d_scale_pcm(a[0]); dstl[(17 + i)*nch] = drmp3d_scale_pcm(b[0]); dstr[(47 - i)*nch] = drmp3d_scale_pcm(a[3]); dstr[(49 + i)*nch] = drmp3d_scale_pcm(b[3]); dstl[(47 - i)*nch] = drmp3d_scale_pcm(a[2]); dstl[(49 + i)*nch] = drmp3d_scale_pcm(b[2]); } #endif } static void drmp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, drmp3d_sample_t *pcm, float *lins) { int i; for (i = 0; i < nch; i++) { drmp3d_DCT_II(grbuf + 576*i, nbands); } memcpy(lins, qmf_state, sizeof(float)*15*64); for (i = 0; i < nbands; i += 2) { drmp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64); } #ifndef DR_MP3_NONSTANDARD_BUT_LOGICAL if (nch == 1) { for (i = 0; i < 15*64; i += 2) { qmf_state[i] = lins[nbands*64 + i]; } } else #endif { memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64); } } static int drmp3d_match_frame(const drmp3_uint8 *hdr, int mp3_bytes, int frame_bytes) { int i, nmatch; for (i = 0, nmatch = 0; nmatch < DRMP3_MAX_FRAME_SYNC_MATCHES; nmatch++) { i += drmp3_hdr_frame_bytes(hdr + i, frame_bytes) + drmp3_hdr_padding(hdr + i); if (i + DRMP3_HDR_SIZE > mp3_bytes) return nmatch > 0; if (!drmp3_hdr_compare(hdr, hdr + i)) return 0; } return 1; } static int drmp3d_find_frame(const drmp3_uint8 *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes) { int i, k; for (i = 0; i < mp3_bytes - DRMP3_HDR_SIZE; i++, mp3++) { if (drmp3_hdr_valid(mp3)) { int frame_bytes = drmp3_hdr_frame_bytes(mp3, *free_format_bytes); int frame_and_padding = frame_bytes + drmp3_hdr_padding(mp3); for (k = DRMP3_HDR_SIZE; !frame_bytes && k < DRMP3_MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - DRMP3_HDR_SIZE; k++) { if (drmp3_hdr_compare(mp3, mp3 + k)) { int fb = k - drmp3_hdr_padding(mp3); int nextfb = fb + drmp3_hdr_padding(mp3 + k); if (i + k + nextfb + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + k + nextfb)) continue; frame_and_padding = k; frame_bytes = fb; *free_format_bytes = fb; } } if ((frame_bytes && i + frame_and_padding <= mp3_bytes && drmp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) || (!i && frame_and_padding == mp3_bytes)) { *ptr_frame_bytes = frame_and_padding; return i; } *free_format_bytes = 0; } } *ptr_frame_bytes = 0; return i; } void drmp3dec_init(drmp3dec *dec) { dec->header[0] = 0; } int drmp3dec_decode_frame(drmp3dec *dec, const unsigned char *mp3, int mp3_bytes, void *pcm, drmp3dec_frame_info *info) { int i = 0, igr, frame_size = 0, success = 1; const drmp3_uint8 *hdr; drmp3_bs bs_frame[1]; drmp3dec_scratch scratch; if (mp3_bytes > 4 && dec->header[0] == 0xff && drmp3_hdr_compare(dec->header, mp3)) { frame_size = drmp3_hdr_frame_bytes(mp3, dec->free_format_bytes) + drmp3_hdr_padding(mp3); if (frame_size != mp3_bytes && (frame_size + DRMP3_HDR_SIZE > mp3_bytes || !drmp3_hdr_compare(mp3, mp3 + frame_size))) { frame_size = 0; } } if (!frame_size) { memset(dec, 0, sizeof(drmp3dec)); i = drmp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size); if (!frame_size || i + frame_size > mp3_bytes) { info->frame_bytes = i; return 0; } } hdr = mp3 + i; memcpy(dec->header, hdr, DRMP3_HDR_SIZE); info->frame_bytes = i + frame_size; info->channels = DRMP3_HDR_IS_MONO(hdr) ? 1 : 2; info->hz = drmp3_hdr_sample_rate_hz(hdr); info->layer = 4 - DRMP3_HDR_GET_LAYER(hdr); info->bitrate_kbps = drmp3_hdr_bitrate_kbps(hdr); drmp3_bs_init(bs_frame, hdr + DRMP3_HDR_SIZE, frame_size - DRMP3_HDR_SIZE); if (DRMP3_HDR_IS_CRC(hdr)) { drmp3_bs_get_bits(bs_frame, 16); } if (info->layer == 3) { int main_data_begin = drmp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr); if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit) { drmp3dec_init(dec); return 0; } success = drmp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin); if (success && pcm != NULL) { for (igr = 0; igr < (DRMP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*576*info->channels)) { memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); drmp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels); drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]); } } drmp3_L3_save_reservoir(dec, &scratch); } else { #ifdef DR_MP3_ONLY_MP3 return 0; #else drmp3_L12_scale_info sci[1]; if (pcm == NULL) { return drmp3_hdr_frame_samples(hdr); } drmp3_L12_read_scale_info(hdr, bs_frame, sci); memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); for (i = 0, igr = 0; igr < 3; igr++) { if (12 == (i += drmp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1))) { i = 0; drmp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]); drmp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (drmp3d_sample_t*)pcm, scratch.syn[0]); memset(scratch.grbuf[0], 0, 576*2*sizeof(float)); pcm = DRMP3_OFFSET_PTR(pcm, sizeof(drmp3d_sample_t)*384*info->channels); } if (bs_frame->pos > bs_frame->limit) { drmp3dec_init(dec); return 0; } } #endif } return success*drmp3_hdr_frame_samples(dec->header); } void drmp3dec_f32_to_s16(const float *in, drmp3_int16 *out, int num_samples) { if(num_samples > 0) { int i = 0; #if DRMP3_HAVE_SIMD int aligned_count = num_samples & ~7; for(; i < aligned_count; i+=8) { drmp3_f4 scale = DRMP3_VSET(32768.0f); drmp3_f4 a = DRMP3_VMUL(DRMP3_VLD(&in[i ]), scale); drmp3_f4 b = DRMP3_VMUL(DRMP3_VLD(&in[i+4]), scale); #if DRMP3_HAVE_SSE drmp3_f4 s16max = DRMP3_VSET( 32767.0f); drmp3_f4 s16min = DRMP3_VSET(-32768.0f); __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, s16max), s16min)), _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, s16max), s16min))); out[i ] = (drmp3_int16)_mm_extract_epi16(pcm8, 0); out[i+1] = (drmp3_int16)_mm_extract_epi16(pcm8, 1); out[i+2] = (drmp3_int16)_mm_extract_epi16(pcm8, 2); out[i+3] = (drmp3_int16)_mm_extract_epi16(pcm8, 3); out[i+4] = (drmp3_int16)_mm_extract_epi16(pcm8, 4); out[i+5] = (drmp3_int16)_mm_extract_epi16(pcm8, 5); out[i+6] = (drmp3_int16)_mm_extract_epi16(pcm8, 6); out[i+7] = (drmp3_int16)_mm_extract_epi16(pcm8, 7); #else int16x4_t pcma, pcmb; a = DRMP3_VADD(a, DRMP3_VSET(0.5f)); b = DRMP3_VADD(b, DRMP3_VSET(0.5f)); pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, DRMP3_VSET(0))))); pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, DRMP3_VSET(0))))); vst1_lane_s16(out+i , pcma, 0); vst1_lane_s16(out+i+1, pcma, 1); vst1_lane_s16(out+i+2, pcma, 2); vst1_lane_s16(out+i+3, pcma, 3); vst1_lane_s16(out+i+4, pcmb, 0); vst1_lane_s16(out+i+5, pcmb, 1); vst1_lane_s16(out+i+6, pcmb, 2); vst1_lane_s16(out+i+7, pcmb, 3); #endif } #endif for(; i < num_samples; i++) { float sample = in[i] * 32768.0f; if (sample >= 32766.5) out[i] = (drmp3_int16) 32767; else if (sample <= -32767.5) out[i] = (drmp3_int16)-32768; else { short s = (drmp3_int16)(sample + .5f); s -= (s < 0); /* away from zero, to be compliant */ out[i] = s; } } } } /************************************************************************************************************************************************************ Main Public API ************************************************************************************************************************************************************/ #if defined(SIZE_MAX) #define DRMP3_SIZE_MAX SIZE_MAX #else #if defined(_WIN64) || defined(_LP64) || defined(__LP64__) #define DRMP3_SIZE_MAX ((drmp3_uint64)0xFFFFFFFFFFFFFFFF) #else #define DRMP3_SIZE_MAX 0xFFFFFFFF #endif #endif /* Options. */ #ifndef DRMP3_SEEK_LEADING_MP3_FRAMES #define DRMP3_SEEK_LEADING_MP3_FRAMES 2 #endif /* Standard library stuff. */ #ifndef DRMP3_ASSERT #include #define DRMP3_ASSERT(expression) assert(expression) #endif #ifndef DRMP3_COPY_MEMORY #define DRMP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz)) #endif #ifndef DRMP3_ZERO_MEMORY #define DRMP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz)) #endif #define DRMP3_ZERO_OBJECT(p) DRMP3_ZERO_MEMORY((p), sizeof(*(p))) #ifndef DRMP3_MALLOC #define DRMP3_MALLOC(sz) malloc((sz)) #endif #ifndef DRMP3_REALLOC #define DRMP3_REALLOC(p, sz) realloc((p), (sz)) #endif #ifndef DRMP3_FREE #define DRMP3_FREE(p) free((p)) #endif #define drmp3_assert DRMP3_ASSERT #define drmp3_copy_memory DRMP3_COPY_MEMORY #define drmp3_zero_memory DRMP3_ZERO_MEMORY #define drmp3_zero_object DRMP3_ZERO_OBJECT #define drmp3_malloc DRMP3_MALLOC #define drmp3_realloc DRMP3_REALLOC #define drmp3_countof(x) (sizeof(x) / sizeof(x[0])) #define drmp3_max(x, y) (((x) > (y)) ? (x) : (y)) #define drmp3_min(x, y) (((x) < (y)) ? (x) : (y)) #define DRMP3_DATA_CHUNK_SIZE 16384 /* The size in bytes of each chunk of data to read from the MP3 stream. minimp3 recommends 16K. */ static DRMP3_INLINE float drmp3_mix_f32(float x, float y, float a) { return x*(1-a) + y*a; } static void drmp3_blend_f32(float* pOut, float* pInA, float* pInB, float factor, drmp3_uint32 channels) { drmp3_uint32 i; for (i = 0; i < channels; ++i) { pOut[i] = drmp3_mix_f32(pInA[i], pInB[i], factor); } } void drmp3_src_cache_init(drmp3_src* pSRC, drmp3_src_cache* pCache) { drmp3_assert(pSRC != NULL); drmp3_assert(pCache != NULL); pCache->pSRC = pSRC; pCache->cachedFrameCount = 0; pCache->iNextFrame = 0; } drmp3_uint64 drmp3_src_cache_read_frames(drmp3_src_cache* pCache, drmp3_uint64 frameCount, float* pFramesOut) { drmp3_uint32 channels; drmp3_uint64 totalFramesRead = 0; drmp3_assert(pCache != NULL); drmp3_assert(pCache->pSRC != NULL); drmp3_assert(pCache->pSRC->onRead != NULL); drmp3_assert(frameCount > 0); drmp3_assert(pFramesOut != NULL); channels = pCache->pSRC->config.channels; while (frameCount > 0) { /* If there's anything in memory go ahead and copy that over first. */ drmp3_uint32 framesToReadFromClient; drmp3_uint64 framesRemainingInMemory = pCache->cachedFrameCount - pCache->iNextFrame; drmp3_uint64 framesToReadFromMemory = frameCount; if (framesToReadFromMemory > framesRemainingInMemory) { framesToReadFromMemory = framesRemainingInMemory; } drmp3_copy_memory(pFramesOut, pCache->pCachedFrames + pCache->iNextFrame*channels, (drmp3_uint32)(framesToReadFromMemory * channels * sizeof(float))); pCache->iNextFrame += (drmp3_uint32)framesToReadFromMemory; totalFramesRead += framesToReadFromMemory; frameCount -= framesToReadFromMemory; if (frameCount == 0) { break; } /* At this point there are still more frames to read from the client, so we'll need to reload the cache with fresh data. */ drmp3_assert(frameCount > 0); pFramesOut += framesToReadFromMemory * channels; pCache->iNextFrame = 0; pCache->cachedFrameCount = 0; framesToReadFromClient = drmp3_countof(pCache->pCachedFrames) / pCache->pSRC->config.channels; if (framesToReadFromClient > pCache->pSRC->config.cacheSizeInFrames) { framesToReadFromClient = pCache->pSRC->config.cacheSizeInFrames; } pCache->cachedFrameCount = (drmp3_uint32)pCache->pSRC->onRead(pCache->pSRC, framesToReadFromClient, pCache->pCachedFrames, pCache->pSRC->pUserData); /* Get out of this loop if nothing was able to be retrieved. */ if (pCache->cachedFrameCount == 0) { break; } } return totalFramesRead; } drmp3_uint64 drmp3_src_read_frames_passthrough(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush); drmp3_uint64 drmp3_src_read_frames_linear(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush); drmp3_bool32 drmp3_src_init(const drmp3_src_config* pConfig, drmp3_src_read_proc onRead, void* pUserData, drmp3_src* pSRC) { if (pSRC == NULL) { return DRMP3_FALSE; } drmp3_zero_object(pSRC); if (pConfig == NULL || onRead == NULL) { return DRMP3_FALSE; } if (pConfig->channels == 0 || pConfig->channels > 2) { return DRMP3_FALSE; } pSRC->config = *pConfig; pSRC->onRead = onRead; pSRC->pUserData = pUserData; if (pSRC->config.cacheSizeInFrames > DRMP3_SRC_CACHE_SIZE_IN_FRAMES || pSRC->config.cacheSizeInFrames == 0) { pSRC->config.cacheSizeInFrames = DRMP3_SRC_CACHE_SIZE_IN_FRAMES; } drmp3_src_cache_init(pSRC, &pSRC->cache); return DRMP3_TRUE; } drmp3_bool32 drmp3_src_set_input_sample_rate(drmp3_src* pSRC, drmp3_uint32 sampleRateIn) { if (pSRC == NULL) { return DRMP3_FALSE; } /* Must have a sample rate of > 0. */ if (sampleRateIn == 0) { return DRMP3_FALSE; } pSRC->config.sampleRateIn = sampleRateIn; return DRMP3_TRUE; } drmp3_bool32 drmp3_src_set_output_sample_rate(drmp3_src* pSRC, drmp3_uint32 sampleRateOut) { if (pSRC == NULL) { return DRMP3_FALSE; } /* Must have a sample rate of > 0. */ if (sampleRateOut == 0) { return DRMP3_FALSE; } pSRC->config.sampleRateOut = sampleRateOut; return DRMP3_TRUE; } drmp3_uint64 drmp3_src_read_frames_ex(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush) { drmp3_src_algorithm algorithm; if (pSRC == NULL || frameCount == 0 || pFramesOut == NULL) { return 0; } algorithm = pSRC->config.algorithm; /* Always use passthrough if the sample rates are the same. */ if (pSRC->config.sampleRateIn == pSRC->config.sampleRateOut) { algorithm = drmp3_src_algorithm_none; } /* Could just use a function pointer instead of a switch for this... */ switch (algorithm) { case drmp3_src_algorithm_none: return drmp3_src_read_frames_passthrough(pSRC, frameCount, pFramesOut, flush); case drmp3_src_algorithm_linear: return drmp3_src_read_frames_linear(pSRC, frameCount, pFramesOut, flush); default: return 0; } } drmp3_uint64 drmp3_src_read_frames(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut) { return drmp3_src_read_frames_ex(pSRC, frameCount, pFramesOut, DRMP3_FALSE); } drmp3_uint64 drmp3_src_read_frames_passthrough(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush) { drmp3_assert(pSRC != NULL); drmp3_assert(frameCount > 0); drmp3_assert(pFramesOut != NULL); (void)flush; /* Passthrough need not care about flushing. */ return pSRC->onRead(pSRC, frameCount, pFramesOut, pSRC->pUserData); } drmp3_uint64 drmp3_src_read_frames_linear(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, drmp3_bool32 flush) { double factor; drmp3_uint64 totalFramesRead; drmp3_assert(pSRC != NULL); drmp3_assert(frameCount > 0); drmp3_assert(pFramesOut != NULL); /* For linear SRC, the bin is only 2 frames: 1 prior, 1 future. */ /* Load the bin if necessary. */ if (!pSRC->algo.linear.isPrevFramesLoaded) { drmp3_uint64 framesRead = drmp3_src_cache_read_frames(&pSRC->cache, 1, pSRC->bin); if (framesRead == 0) { return 0; } pSRC->algo.linear.isPrevFramesLoaded = DRMP3_TRUE; } if (!pSRC->algo.linear.isNextFramesLoaded) { drmp3_uint64 framesRead = drmp3_src_cache_read_frames(&pSRC->cache, 1, pSRC->bin + pSRC->config.channels); if (framesRead == 0) { return 0; } pSRC->algo.linear.isNextFramesLoaded = DRMP3_TRUE; } factor = (double)pSRC->config.sampleRateIn / pSRC->config.sampleRateOut; totalFramesRead = 0; while (frameCount > 0) { drmp3_uint32 i; drmp3_uint32 framesToReadFromClient; /* The bin is where the previous and next frames are located. */ float* pPrevFrame = pSRC->bin; float* pNextFrame = pSRC->bin + pSRC->config.channels; drmp3_blend_f32((float*)pFramesOut, pPrevFrame, pNextFrame, (float)pSRC->algo.linear.alpha, pSRC->config.channels); pSRC->algo.linear.alpha += factor; /* The new alpha value is how we determine whether or not we need to read fresh frames. */ framesToReadFromClient = (drmp3_uint32)pSRC->algo.linear.alpha; pSRC->algo.linear.alpha = pSRC->algo.linear.alpha - framesToReadFromClient; for (i = 0; i < framesToReadFromClient; ++i) { drmp3_uint64 framesRead; drmp3_uint32 j; for (j = 0; j < pSRC->config.channels; ++j) { pPrevFrame[j] = pNextFrame[j]; } framesRead = drmp3_src_cache_read_frames(&pSRC->cache, 1, pNextFrame); if (framesRead == 0) { drmp3_uint32 k; for (k = 0; k < pSRC->config.channels; ++k) { pNextFrame[k] = 0; } if (pSRC->algo.linear.isNextFramesLoaded) { pSRC->algo.linear.isNextFramesLoaded = DRMP3_FALSE; } else { if (flush) { pSRC->algo.linear.isPrevFramesLoaded = DRMP3_FALSE; } } break; } } pFramesOut = (drmp3_uint8*)pFramesOut + (1 * pSRC->config.channels * sizeof(float)); frameCount -= 1; totalFramesRead += 1; /* If there's no frames available we need to get out of this loop. */ if (!pSRC->algo.linear.isNextFramesLoaded && (!flush || !pSRC->algo.linear.isPrevFramesLoaded)) { break; } } return totalFramesRead; } static size_t drmp3__on_read(drmp3* pMP3, void* pBufferOut, size_t bytesToRead) { size_t bytesRead = pMP3->onRead(pMP3->pUserData, pBufferOut, bytesToRead); pMP3->streamCursor += bytesRead; return bytesRead; } static drmp3_bool32 drmp3__on_seek(drmp3* pMP3, int offset, drmp3_seek_origin origin) { drmp3_assert(offset >= 0); if (!pMP3->onSeek(pMP3->pUserData, offset, origin)) { return DRMP3_FALSE; } if (origin == drmp3_seek_origin_start) { pMP3->streamCursor = (drmp3_uint64)offset; } else { pMP3->streamCursor += offset; } return DRMP3_TRUE; } static drmp3_bool32 drmp3__on_seek_64(drmp3* pMP3, drmp3_uint64 offset, drmp3_seek_origin origin) { if (offset <= 0x7FFFFFFF) { return drmp3__on_seek(pMP3, (int)offset, origin); } /* Getting here "offset" is too large for a 32-bit integer. We just keep seeking forward until we hit the offset. */ if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_start)) { return DRMP3_FALSE; } offset -= 0x7FFFFFFF; while (offset > 0) { if (offset <= 0x7FFFFFFF) { if (!drmp3__on_seek(pMP3, (int)offset, drmp3_seek_origin_current)) { return DRMP3_FALSE; } offset = 0; } else { if (!drmp3__on_seek(pMP3, 0x7FFFFFFF, drmp3_seek_origin_current)) { return DRMP3_FALSE; } offset -= 0x7FFFFFFF; } } return DRMP3_TRUE; } static drmp3_uint32 drmp3_decode_next_frame_ex(drmp3* pMP3, drmp3d_sample_t* pPCMFrames, drmp3_bool32 discard); static drmp3_uint32 drmp3_decode_next_frame(drmp3* pMP3); static drmp3_uint64 drmp3_read_src(drmp3_src* pSRC, drmp3_uint64 frameCount, void* pFramesOut, void* pUserData) { drmp3* pMP3 = (drmp3*)pUserData; float* pFramesOutF = (float*)pFramesOut; drmp3_uint64 totalFramesRead = 0; drmp3_assert(pMP3 != NULL); drmp3_assert(pMP3->onRead != NULL); while (frameCount > 0) { /* Read from the in-memory buffer first. */ while (pMP3->pcmFramesRemainingInMP3Frame > 0 && frameCount > 0) { drmp3d_sample_t* frames = (drmp3d_sample_t*)pMP3->pcmFrames; #ifndef DR_MP3_FLOAT_OUTPUT if (pMP3->mp3FrameChannels == 1) { if (pMP3->channels == 1) { /* Mono -> Mono. */ pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame] / 32768.0f; } else { /* Mono -> Stereo. */ pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame] / 32768.0f; pFramesOutF[1] = frames[pMP3->pcmFramesConsumedInMP3Frame] / 32768.0f; } } else { if (pMP3->channels == 1) { /* Stereo -> Mono */ float sample = 0; sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0] / 32768.0f; sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1] / 32768.0f; pFramesOutF[0] = sample * 0.5f; } else { /* Stereo -> Stereo */ pFramesOutF[0] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0] / 32768.0f; pFramesOutF[1] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1] / 32768.0f; } } #else if (pMP3->mp3FrameChannels == 1) { if (pMP3->channels == 1) { /* Mono -> Mono. */ pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame]; } else { /* Mono -> Stereo. */ pFramesOutF[0] = frames[pMP3->pcmFramesConsumedInMP3Frame]; pFramesOutF[1] = frames[pMP3->pcmFramesConsumedInMP3Frame]; } } else { if (pMP3->channels == 1) { /* Stereo -> Mono */ float sample = 0; sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0]; sample += frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1]; pFramesOutF[0] = sample * 0.5f; } else { /* Stereo -> Stereo */ pFramesOutF[0] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+0]; pFramesOutF[1] = frames[(pMP3->pcmFramesConsumedInMP3Frame*pMP3->mp3FrameChannels)+1]; } } #endif pMP3->pcmFramesConsumedInMP3Frame += 1; pMP3->pcmFramesRemainingInMP3Frame -= 1; totalFramesRead += 1; frameCount -= 1; pFramesOutF += pSRC->config.channels; } if (frameCount == 0) { break; } drmp3_assert(pMP3->pcmFramesRemainingInMP3Frame == 0); /* At this point we have exhausted our in-memory buffer so we need to re-fill. Note that the sample rate may have changed at this point which means we'll also need to update our sample rate conversion pipeline. */ if (drmp3_decode_next_frame(pMP3) == 0) { break; } } return totalFramesRead; } static drmp3_bool32 drmp3_init_src(drmp3* pMP3) { drmp3_src_config srcConfig; drmp3_zero_object(&srcConfig); srcConfig.sampleRateIn = DR_MP3_DEFAULT_SAMPLE_RATE; srcConfig.sampleRateOut = pMP3->sampleRate; srcConfig.channels = pMP3->channels; srcConfig.algorithm = drmp3_src_algorithm_linear; if (!drmp3_src_init(&srcConfig, drmp3_read_src, pMP3, &pMP3->src)) { drmp3_uninit(pMP3); return DRMP3_FALSE; } return DRMP3_TRUE; } static drmp3_uint32 drmp3_decode_next_frame_ex(drmp3* pMP3, drmp3d_sample_t* pPCMFrames, drmp3_bool32 discard) { drmp3_uint32 pcmFramesRead = 0; drmp3_assert(pMP3 != NULL); drmp3_assert(pMP3->onRead != NULL); if (pMP3->atEnd) { return 0; } do { drmp3dec_frame_info info; size_t leftoverDataSize; /* minimp3 recommends doing data submission in 16K chunks. If we don't have at least 16K bytes available, get more. */ if (pMP3->dataSize < DRMP3_DATA_CHUNK_SIZE) { size_t bytesRead; if (pMP3->dataCapacity < DRMP3_DATA_CHUNK_SIZE) { drmp3_uint8* pNewData; pMP3->dataCapacity = DRMP3_DATA_CHUNK_SIZE; pNewData = (drmp3_uint8*)drmp3_realloc(pMP3->pData, pMP3->dataCapacity); if (pNewData == NULL) { return 0; /* Out of memory. */ } pMP3->pData = pNewData; } bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize)); if (bytesRead == 0) { if (pMP3->dataSize == 0) { pMP3->atEnd = DRMP3_TRUE; return 0; /* No data. */ } } pMP3->dataSize += bytesRead; } if (pMP3->dataSize > INT_MAX) { pMP3->atEnd = DRMP3_TRUE; return 0; /* File too big. */ } pcmFramesRead = drmp3dec_decode_frame(&pMP3->decoder, pMP3->pData, (int)pMP3->dataSize, pPCMFrames, &info); /* <-- Safe size_t -> int conversion thanks to the check above. */ /* Consume the data. */ leftoverDataSize = (pMP3->dataSize - (size_t)info.frame_bytes); if (info.frame_bytes > 0) { memmove(pMP3->pData, pMP3->pData + info.frame_bytes, leftoverDataSize); pMP3->dataSize = leftoverDataSize; } /* pcmFramesRead will be equal to 0 if decoding failed. If it is zero and info.frame_bytes > 0 then we have successfully decoded the frame. A special case is if we are wanting to discard the frame, in which case we return successfully. */ if (pcmFramesRead > 0 || (info.frame_bytes > 0 && discard)) { pcmFramesRead = drmp3_hdr_frame_samples(pMP3->decoder.header); pMP3->pcmFramesConsumedInMP3Frame = 0; pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead; pMP3->mp3FrameChannels = info.channels; pMP3->mp3FrameSampleRate = info.hz; /* We need to initialize the resampler if we don't yet have the channel count or sample rate. */ if (pMP3->channels == 0 || pMP3->sampleRate == 0) { if (pMP3->channels == 0) { pMP3->channels = info.channels; } if (pMP3->sampleRate == 0) { pMP3->sampleRate = info.hz; } drmp3_init_src(pMP3); } drmp3_src_set_input_sample_rate(&pMP3->src, pMP3->mp3FrameSampleRate); break; } else if (info.frame_bytes == 0) { size_t bytesRead; /* Need more data. minimp3 recommends doing data submission in 16K chunks. */ if (pMP3->dataCapacity == pMP3->dataSize) { drmp3_uint8* pNewData; /* No room. Expand. */ pMP3->dataCapacity += DRMP3_DATA_CHUNK_SIZE; pNewData = (drmp3_uint8*)drmp3_realloc(pMP3->pData, pMP3->dataCapacity); if (pNewData == NULL) { return 0; /* Out of memory. */ } pMP3->pData = pNewData; } /* Fill in a chunk. */ bytesRead = drmp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize)); if (bytesRead == 0) { pMP3->atEnd = DRMP3_TRUE; return 0; /* Error reading more data. */ } pMP3->dataSize += bytesRead; } } while (DRMP3_TRUE); return pcmFramesRead; } static drmp3_uint32 drmp3_decode_next_frame(drmp3* pMP3) { drmp3_assert(pMP3 != NULL); return drmp3_decode_next_frame_ex(pMP3, (drmp3d_sample_t*)pMP3->pcmFrames, DRMP3_FALSE); } #if 0 static drmp3_uint32 drmp3_seek_next_frame(drmp3* pMP3) { drmp3_uint32 pcmFrameCount; drmp3_assert(pMP3 != NULL); pcmFrameCount = drmp3_decode_next_frame_ex(pMP3, NULL); if (pcmFrameCount == 0) { return 0; } /* We have essentially just skipped past the frame, so just set the remaining samples to 0. */ pMP3->currentPCMFrame += pcmFrameCount; pMP3->pcmFramesConsumedInMP3Frame = pcmFrameCount; pMP3->pcmFramesRemainingInMP3Frame = 0; return pcmFrameCount; } #endif drmp3_bool32 drmp3_init_internal(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig) { drmp3_config config; drmp3_assert(pMP3 != NULL); drmp3_assert(onRead != NULL); /* This function assumes the output object has already been reset to 0. Do not do that here, otherwise things will break. */ drmp3dec_init(&pMP3->decoder); /* The config can be null in which case we use defaults. */ if (pConfig != NULL) { config = *pConfig; } else { drmp3_zero_object(&config); } pMP3->channels = config.outputChannels; /* Cannot have more than 2 channels. */ if (pMP3->channels > 2) { pMP3->channels = 2; } pMP3->sampleRate = config.outputSampleRate; pMP3->onRead = onRead; pMP3->onSeek = onSeek; pMP3->pUserData = pUserData; /* We need a sample rate converter for converting the sample rate from the MP3 frames to the requested output sample rate. Note that if we don't yet know the channel count or sample rate we defer this until the first frame is read. */ if (pMP3->channels != 0 && pMP3->sampleRate != 0) { drmp3_init_src(pMP3); } /* Decode the first frame to confirm that it is indeed a valid MP3 stream. */ if (!drmp3_decode_next_frame(pMP3)) { drmp3_uninit(pMP3); return DRMP3_FALSE; /* Not a valid MP3 stream. */ } return DRMP3_TRUE; } drmp3_bool32 drmp3_init(drmp3* pMP3, drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, const drmp3_config* pConfig) { if (pMP3 == NULL || onRead == NULL) { return DRMP3_FALSE; } drmp3_zero_object(pMP3); return drmp3_init_internal(pMP3, onRead, onSeek, pUserData, pConfig); } static size_t drmp3__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead) { drmp3* pMP3 = (drmp3*)pUserData; size_t bytesRemaining; drmp3_assert(pMP3 != NULL); drmp3_assert(pMP3->memory.dataSize >= pMP3->memory.currentReadPos); bytesRemaining = pMP3->memory.dataSize - pMP3->memory.currentReadPos; if (bytesToRead > bytesRemaining) { bytesToRead = bytesRemaining; } if (bytesToRead > 0) { drmp3_copy_memory(pBufferOut, pMP3->memory.pData + pMP3->memory.currentReadPos, bytesToRead); pMP3->memory.currentReadPos += bytesToRead; } return bytesToRead; } static drmp3_bool32 drmp3__on_seek_memory(void* pUserData, int byteOffset, drmp3_seek_origin origin) { drmp3* pMP3 = (drmp3*)pUserData; drmp3_assert(pMP3 != NULL); if (origin == drmp3_seek_origin_current) { if (byteOffset > 0) { if (pMP3->memory.currentReadPos + byteOffset > pMP3->memory.dataSize) { byteOffset = (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos); /* Trying to seek too far forward. */ } } else { if (pMP3->memory.currentReadPos < (size_t)-byteOffset) { byteOffset = -(int)pMP3->memory.currentReadPos; /* Trying to seek too far backwards. */ } } /* This will never underflow thanks to the clamps above. */ pMP3->memory.currentReadPos += byteOffset; } else { if ((drmp3_uint32)byteOffset <= pMP3->memory.dataSize) { pMP3->memory.currentReadPos = byteOffset; } else { pMP3->memory.currentReadPos = pMP3->memory.dataSize; /* Trying to seek too far forward. */ } } return DRMP3_TRUE; } drmp3_bool32 drmp3_init_memory(drmp3* pMP3, const void* pData, size_t dataSize, const drmp3_config* pConfig) { if (pMP3 == NULL) { return DRMP3_FALSE; } drmp3_zero_object(pMP3); if (pData == NULL || dataSize == 0) { return DRMP3_FALSE; } pMP3->memory.pData = (const drmp3_uint8*)pData; pMP3->memory.dataSize = dataSize; pMP3->memory.currentReadPos = 0; return drmp3_init_internal(pMP3, drmp3__on_read_memory, drmp3__on_seek_memory, pMP3, pConfig); } #ifndef DR_MP3_NO_STDIO #include static size_t drmp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead) { return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData); } static drmp3_bool32 drmp3__on_seek_stdio(void* pUserData, int offset, drmp3_seek_origin origin) { return fseek((FILE*)pUserData, offset, (origin == drmp3_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0; } drmp3_bool32 drmp3_init_file(drmp3* pMP3, const char* filePath, const drmp3_config* pConfig) { FILE* pFile; #if defined(_MSC_VER) && _MSC_VER >= 1400 if (fopen_s(&pFile, filePath, "rb") != 0) { return DRMP3_FALSE; } #else pFile = fopen(filePath, "rb"); if (pFile == NULL) { return DRMP3_FALSE; } #endif return drmp3_init(pMP3, drmp3__on_read_stdio, drmp3__on_seek_stdio, (void*)pFile, pConfig); } #endif void drmp3_uninit(drmp3* pMP3) { if (pMP3 == NULL) { return; } #ifndef DR_MP3_NO_STDIO if (pMP3->onRead == drmp3__on_read_stdio) { fclose((FILE*)pMP3->pUserData); } #endif drmp3_free(pMP3->pData); } drmp3_uint64 drmp3_read_pcm_frames_f32(drmp3* pMP3, drmp3_uint64 framesToRead, float* pBufferOut) { drmp3_uint64 totalFramesRead = 0; if (pMP3 == NULL || pMP3->onRead == NULL) { return 0; } if (pBufferOut == NULL) { float temp[4096]; while (framesToRead > 0) { drmp3_uint64 framesJustRead; drmp3_uint64 framesToReadRightNow = sizeof(temp)/sizeof(temp[0]) / pMP3->channels; if (framesToReadRightNow > framesToRead) { framesToReadRightNow = framesToRead; } framesJustRead = drmp3_read_pcm_frames_f32(pMP3, framesToReadRightNow, temp); if (framesJustRead == 0) { break; } framesToRead -= framesJustRead; totalFramesRead += framesJustRead; } } else { totalFramesRead = drmp3_src_read_frames_ex(&pMP3->src, framesToRead, pBufferOut, DRMP3_TRUE); pMP3->currentPCMFrame += totalFramesRead; } return totalFramesRead; } drmp3_uint64 drmp3_read_pcm_frames_s16(drmp3* pMP3, drmp3_uint64 framesToRead, drmp3_int16* pBufferOut) { float tempF32[4096]; drmp3_uint64 pcmFramesJustRead; drmp3_uint64 totalPCMFramesRead = 0; if (pMP3 == NULL || pMP3->onRead == NULL) { return 0; } /* Naive implementation: read into a temp f32 buffer, then convert. */ for (;;) { drmp3_uint64 pcmFramesToReadThisIteration = (framesToRead - totalPCMFramesRead); if (pcmFramesToReadThisIteration > drmp3_countof(tempF32)/pMP3->channels) { pcmFramesToReadThisIteration = drmp3_countof(tempF32)/pMP3->channels; } pcmFramesJustRead = drmp3_read_pcm_frames_f32(pMP3, pcmFramesToReadThisIteration, tempF32); if (pcmFramesJustRead == 0) { break; } drmp3dec_f32_to_s16(tempF32, pBufferOut, (int)(pcmFramesJustRead * pMP3->channels)); /* <-- Safe cast since pcmFramesJustRead will be clamped based on the size of tempF32 which is always small. */ pBufferOut += pcmFramesJustRead * pMP3->channels; totalPCMFramesRead += pcmFramesJustRead; if (pcmFramesJustRead < pcmFramesToReadThisIteration) { break; } } return totalPCMFramesRead; } void drmp3_reset(drmp3* pMP3) { drmp3_assert(pMP3 != NULL); pMP3->pcmFramesConsumedInMP3Frame = 0; pMP3->pcmFramesRemainingInMP3Frame = 0; pMP3->currentPCMFrame = 0; pMP3->dataSize = 0; pMP3->atEnd = DRMP3_FALSE; pMP3->src.bin[0] = 0; pMP3->src.bin[1] = 0; pMP3->src.bin[2] = 0; pMP3->src.bin[3] = 0; pMP3->src.cache.cachedFrameCount = 0; pMP3->src.cache.iNextFrame = 0; pMP3->src.algo.linear.alpha = 0; pMP3->src.algo.linear.isNextFramesLoaded = 0; pMP3->src.algo.linear.isPrevFramesLoaded = 0; drmp3dec_init(&pMP3->decoder); } drmp3_bool32 drmp3_seek_to_start_of_stream(drmp3* pMP3) { drmp3_assert(pMP3 != NULL); drmp3_assert(pMP3->onSeek != NULL); /* Seek to the start of the stream to begin with. */ if (!drmp3__on_seek(pMP3, 0, drmp3_seek_origin_start)) { return DRMP3_FALSE; } /* Clear any cached data. */ drmp3_reset(pMP3); return DRMP3_TRUE; } float drmp3_get_cached_pcm_frame_count_from_src(drmp3* pMP3) { return (pMP3->src.cache.cachedFrameCount - pMP3->src.cache.iNextFrame) + (float)pMP3->src.algo.linear.alpha; } float drmp3_get_pcm_frames_remaining_in_mp3_frame(drmp3* pMP3) { float factor = (float)pMP3->src.config.sampleRateOut / (float)pMP3->src.config.sampleRateIn; float frameCountPreSRC = drmp3_get_cached_pcm_frame_count_from_src(pMP3) + pMP3->pcmFramesRemainingInMP3Frame; return frameCountPreSRC * factor; } /* NOTE ON SEEKING =============== The seeking code below is a complete mess and is broken for cases when the sample rate changes. The problem is with the resampling and the crappy resampler used by dr_mp3. What needs to happen is the following: 1) The resampler needs to be replaced. 2) The resampler has state which needs to be updated whenever an MP3 frame is decoded outside of drmp3_read_pcm_frames_f32(). The resampler needs an API to "flush" some imaginary input so that it's state is updated accordingly. */ drmp3_bool32 drmp3_seek_forward_by_pcm_frames__brute_force(drmp3* pMP3, drmp3_uint64 frameOffset) { drmp3_uint64 framesRead; #if 0 /* MP3 is a bit annoying when it comes to seeking because of the bit reservoir. It basically means that an MP3 frame can possibly depend on some of the data of prior frames. This means it's not as simple as seeking to the first byte of the MP3 frame that contains the sample because that MP3 frame will need the data from the previous MP3 frame (which we just seeked past!). To resolve this we seek past a number of MP3 frames up to a point, and then read-and-discard the remainder. */ drmp3_uint64 maxFramesToReadAndDiscard = (drmp3_uint64)(DRMP3_MAX_PCM_FRAMES_PER_MP3_FRAME * 3 * ((float)pMP3->src.config.sampleRateOut / (float)pMP3->src.config.sampleRateIn)); /* Now get rid of leading whole frames. */ while (frameOffset > maxFramesToReadAndDiscard) { float pcmFramesRemainingInCurrentMP3FrameF = drmp3_get_pcm_frames_remaining_in_mp3_frame(pMP3); drmp3_uint32 pcmFramesRemainingInCurrentMP3Frame = (drmp3_uint32)pcmFramesRemainingInCurrentMP3FrameF; if (frameOffset > pcmFramesRemainingInCurrentMP3Frame) { frameOffset -= pcmFramesRemainingInCurrentMP3Frame; pMP3->currentPCMFrame += pcmFramesRemainingInCurrentMP3Frame; pMP3->pcmFramesConsumedInMP3Frame += pMP3->pcmFramesRemainingInMP3Frame; pMP3->pcmFramesRemainingInMP3Frame = 0; } else { break; } drmp3_uint32 pcmFrameCount = drmp3_decode_next_frame_ex(pMP3, pMP3->pcmFrames, DRMP3_FALSE); if (pcmFrameCount == 0) { break; } } /* The last step is to read-and-discard any remaining PCM frames to make it sample-exact. */ framesRead = drmp3_read_pcm_frames_f32(pMP3, frameOffset, NULL); if (framesRead != frameOffset) { return DRMP3_FALSE; } #else /* Just using a dumb read-and-discard for now pending updates to the resampler. */ framesRead = drmp3_read_pcm_frames_f32(pMP3, frameOffset, NULL); if (framesRead != frameOffset) { return DRMP3_FALSE; } #endif return DRMP3_TRUE; } drmp3_bool32 drmp3_seek_to_pcm_frame__brute_force(drmp3* pMP3, drmp3_uint64 frameIndex) { drmp3_assert(pMP3 != NULL); if (frameIndex == pMP3->currentPCMFrame) { return DRMP3_TRUE; } /* If we're moving foward we just read from where we're at. Otherwise we need to move back to the start of the stream and read from the beginning. */ if (frameIndex < pMP3->currentPCMFrame) { /* Moving backward. Move to the start of the stream and then move forward. */ if (!drmp3_seek_to_start_of_stream(pMP3)) { return DRMP3_FALSE; } } drmp3_assert(frameIndex >= pMP3->currentPCMFrame); return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, (frameIndex - pMP3->currentPCMFrame)); } drmp3_bool32 drmp3_find_closest_seek_point(drmp3* pMP3, drmp3_uint64 frameIndex, drmp3_uint32* pSeekPointIndex) { drmp3_uint32 iSeekPoint; drmp3_assert(pSeekPointIndex != NULL); *pSeekPointIndex = 0; if (frameIndex < pMP3->pSeekPoints[0].pcmFrameIndex) { return DRMP3_FALSE; } /* Linear search for simplicity to begin with while I'm getting this thing working. Once it's all working change this to a binary search. */ for (iSeekPoint = 0; iSeekPoint < pMP3->seekPointCount; ++iSeekPoint) { if (pMP3->pSeekPoints[iSeekPoint].pcmFrameIndex > frameIndex) { break; /* Found it. */ } *pSeekPointIndex = iSeekPoint; } return DRMP3_TRUE; } drmp3_bool32 drmp3_seek_to_pcm_frame__seek_table(drmp3* pMP3, drmp3_uint64 frameIndex) { drmp3_seek_point seekPoint; drmp3_uint32 priorSeekPointIndex; drmp3_uint16 iMP3Frame; drmp3_uint64 leftoverFrames; drmp3_assert(pMP3 != NULL); drmp3_assert(pMP3->pSeekPoints != NULL); drmp3_assert(pMP3->seekPointCount > 0); /* If there is no prior seekpoint it means the target PCM frame comes before the first seek point. Just assume a seekpoint at the start of the file in this case. */ if (drmp3_find_closest_seek_point(pMP3, frameIndex, &priorSeekPointIndex)) { seekPoint = pMP3->pSeekPoints[priorSeekPointIndex]; } else { seekPoint.seekPosInBytes = 0; seekPoint.pcmFrameIndex = 0; seekPoint.mp3FramesToDiscard = 0; seekPoint.pcmFramesToDiscard = 0; } /* First thing to do is seek to the first byte of the relevant MP3 frame. */ if (!drmp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, drmp3_seek_origin_start)) { return DRMP3_FALSE; /* Failed to seek. */ } /* Clear any cached data. */ drmp3_reset(pMP3); /* Whole MP3 frames need to be discarded first. */ for (iMP3Frame = 0; iMP3Frame < seekPoint.mp3FramesToDiscard; ++iMP3Frame) { drmp3_uint32 pcmFramesReadPreSRC; drmp3d_sample_t* pPCMFrames; /* Pass in non-null for the last frame because we want to ensure the sample rate converter is preloaded correctly. */ pPCMFrames = NULL; if (iMP3Frame == seekPoint.mp3FramesToDiscard-1) { pPCMFrames = (drmp3d_sample_t*)pMP3->pcmFrames; } /* We first need to decode the next frame, and then we need to flush the resampler. */ pcmFramesReadPreSRC = drmp3_decode_next_frame_ex(pMP3, pPCMFrames, DRMP3_TRUE); if (pcmFramesReadPreSRC == 0) { return DRMP3_FALSE; } } /* We seeked to an MP3 frame in the raw stream so we need to make sure the current PCM frame is set correctly. */ pMP3->currentPCMFrame = seekPoint.pcmFrameIndex - seekPoint.pcmFramesToDiscard; /* Update resampler. This is wrong. Need to instead update it on a per MP3 frame basis. Also broken for cases when the sample rate is being reduced in my testing. Should work fine when the input and output sample rate is the same or a clean multiple. */ pMP3->src.algo.linear.alpha = (drmp3_int64)pMP3->currentPCMFrame * ((double)pMP3->src.config.sampleRateIn / pMP3->src.config.sampleRateOut); /* <-- Cast to int64 is required for VC6. */ pMP3->src.algo.linear.alpha = pMP3->src.algo.linear.alpha - (drmp3_uint32)(pMP3->src.algo.linear.alpha); if (pMP3->src.algo.linear.alpha > 0) { pMP3->src.algo.linear.isPrevFramesLoaded = 1; } /* Now at this point we can follow the same process as the brute force technique where we just skip over unnecessary MP3 frames and then read-and-discard at least 2 whole MP3 frames. */ leftoverFrames = frameIndex - pMP3->currentPCMFrame; return drmp3_seek_forward_by_pcm_frames__brute_force(pMP3, leftoverFrames); } drmp3_bool32 drmp3_seek_to_pcm_frame(drmp3* pMP3, drmp3_uint64 frameIndex) { if (pMP3 == NULL || pMP3->onSeek == NULL) { return DRMP3_FALSE; } if (frameIndex == 0) { return drmp3_seek_to_start_of_stream(pMP3); } /* Use the seek table if we have one. */ if (pMP3->pSeekPoints != NULL && pMP3->seekPointCount > 0) { return drmp3_seek_to_pcm_frame__seek_table(pMP3, frameIndex); } else { return drmp3_seek_to_pcm_frame__brute_force(pMP3, frameIndex); } } drmp3_bool32 drmp3_get_mp3_and_pcm_frame_count(drmp3* pMP3, drmp3_uint64* pMP3FrameCount, drmp3_uint64* pPCMFrameCount) { drmp3_uint64 currentPCMFrame; drmp3_uint64 totalPCMFrameCount; drmp3_uint64 totalMP3FrameCount; float totalPCMFrameCountFractionalPart; if (pMP3 == NULL) { return DRMP3_FALSE; } /* The way this works is we move back to the start of the stream, iterate over each MP3 frame and calculate the frame count based on our output sample rate, the seek back to the PCM frame we were sitting on before calling this function. */ /* The stream must support seeking for this to work. */ if (pMP3->onSeek == NULL) { return DRMP3_FALSE; } /* We'll need to seek back to where we were, so grab the PCM frame we're currently sitting on so we can restore later. */ currentPCMFrame = pMP3->currentPCMFrame; if (!drmp3_seek_to_start_of_stream(pMP3)) { return DRMP3_FALSE; } totalPCMFrameCount = 0; totalMP3FrameCount = 0; totalPCMFrameCountFractionalPart = 0; /* <-- With resampling there will be a fractional part to each MP3 frame that we need to accumulate. */ for (;;) { drmp3_uint32 pcmFramesInCurrentMP3FrameIn; float srcRatio; float pcmFramesInCurrentMP3FrameOutF; drmp3_uint32 pcmFramesInCurrentMP3FrameOut; pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL, DRMP3_FALSE); if (pcmFramesInCurrentMP3FrameIn == 0) { break; } srcRatio = (float)pMP3->mp3FrameSampleRate / (float)pMP3->sampleRate; drmp3_assert(srcRatio > 0); pcmFramesInCurrentMP3FrameOutF = totalPCMFrameCountFractionalPart + (pcmFramesInCurrentMP3FrameIn / srcRatio); pcmFramesInCurrentMP3FrameOut = (drmp3_uint32)pcmFramesInCurrentMP3FrameOutF; totalPCMFrameCountFractionalPart = pcmFramesInCurrentMP3FrameOutF - pcmFramesInCurrentMP3FrameOut; totalPCMFrameCount += pcmFramesInCurrentMP3FrameOut; totalMP3FrameCount += 1; } /* Finally, we need to seek back to where we were. */ if (!drmp3_seek_to_start_of_stream(pMP3)) { return DRMP3_FALSE; } if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) { return DRMP3_FALSE; } if (pMP3FrameCount != NULL) { *pMP3FrameCount = totalMP3FrameCount; } if (pPCMFrameCount != NULL) { *pPCMFrameCount = totalPCMFrameCount; } return DRMP3_TRUE; } drmp3_uint64 drmp3_get_pcm_frame_count(drmp3* pMP3) { drmp3_uint64 totalPCMFrameCount; if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, NULL, &totalPCMFrameCount)) { return 0; } return totalPCMFrameCount; } drmp3_uint64 drmp3_get_mp3_frame_count(drmp3* pMP3) { drmp3_uint64 totalMP3FrameCount; if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, NULL)) { return 0; } return totalMP3FrameCount; } void drmp3__accumulate_running_pcm_frame_count(drmp3* pMP3, drmp3_uint32 pcmFrameCountIn, drmp3_uint64* pRunningPCMFrameCount, float* pRunningPCMFrameCountFractionalPart) { float srcRatio; float pcmFrameCountOutF; drmp3_uint32 pcmFrameCountOut; srcRatio = (float)pMP3->mp3FrameSampleRate / (float)pMP3->sampleRate; drmp3_assert(srcRatio > 0); pcmFrameCountOutF = *pRunningPCMFrameCountFractionalPart + (pcmFrameCountIn / srcRatio); pcmFrameCountOut = (drmp3_uint32)pcmFrameCountOutF; *pRunningPCMFrameCountFractionalPart = pcmFrameCountOutF - pcmFrameCountOut; *pRunningPCMFrameCount += pcmFrameCountOut; } typedef struct { drmp3_uint64 bytePos; drmp3_uint64 pcmFrameIndex; /* <-- After sample rate conversion. */ } drmp3__seeking_mp3_frame_info; drmp3_bool32 drmp3_calculate_seek_points(drmp3* pMP3, drmp3_uint32* pSeekPointCount, drmp3_seek_point* pSeekPoints) { drmp3_uint32 seekPointCount; drmp3_uint64 currentPCMFrame; drmp3_uint64 totalMP3FrameCount; drmp3_uint64 totalPCMFrameCount; if (pMP3 == NULL || pSeekPointCount == NULL || pSeekPoints == NULL) { return DRMP3_FALSE; /* Invalid args. */ } seekPointCount = *pSeekPointCount; if (seekPointCount == 0) { return DRMP3_FALSE; /* The client has requested no seek points. Consider this to be invalid arguments since the client has probably not intended this. */ } /* We'll need to seek back to the current sample after calculating the seekpoints so we need to go ahead and grab the current location at the top. */ currentPCMFrame = pMP3->currentPCMFrame; /* We never do more than the total number of MP3 frames and we limit it to 32-bits. */ if (!drmp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, &totalPCMFrameCount)) { return DRMP3_FALSE; } /* If there's less than DRMP3_SEEK_LEADING_MP3_FRAMES+1 frames we just report 1 seek point which will be the very start of the stream. */ if (totalMP3FrameCount < DRMP3_SEEK_LEADING_MP3_FRAMES+1) { seekPointCount = 1; pSeekPoints[0].seekPosInBytes = 0; pSeekPoints[0].pcmFrameIndex = 0; pSeekPoints[0].mp3FramesToDiscard = 0; pSeekPoints[0].pcmFramesToDiscard = 0; } else { drmp3_uint64 pcmFramesBetweenSeekPoints; drmp3__seeking_mp3_frame_info mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES+1]; drmp3_uint64 runningPCMFrameCount = 0; float runningPCMFrameCountFractionalPart = 0; drmp3_uint64 nextTargetPCMFrame; drmp3_uint32 iMP3Frame; drmp3_uint32 iSeekPoint; if (seekPointCount > totalMP3FrameCount-1) { seekPointCount = (drmp3_uint32)totalMP3FrameCount-1; } pcmFramesBetweenSeekPoints = totalPCMFrameCount / (seekPointCount+1); /* Here is where we actually calculate the seek points. We need to start by moving the start of the stream. We then enumerate over each MP3 frame. */ if (!drmp3_seek_to_start_of_stream(pMP3)) { return DRMP3_FALSE; } /* We need to cache the byte positions of the previous MP3 frames. As a new MP3 frame is iterated, we cycle the byte positions in this array. The value in the first item in this array is the byte position that will be reported in the next seek point. */ /* We need to initialize the array of MP3 byte positions for the leading MP3 frames. */ for (iMP3Frame = 0; iMP3Frame < DRMP3_SEEK_LEADING_MP3_FRAMES+1; ++iMP3Frame) { drmp3_uint32 pcmFramesInCurrentMP3FrameIn; /* The byte position of the next frame will be the stream's cursor position, minus whatever is sitting in the buffer. */ drmp3_assert(pMP3->streamCursor >= pMP3->dataSize); mp3FrameInfo[iMP3Frame].bytePos = pMP3->streamCursor - pMP3->dataSize; mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount; /* We need to get information about this frame so we can know how many samples it contained. */ pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL, DRMP3_FALSE); if (pcmFramesInCurrentMP3FrameIn == 0) { return DRMP3_FALSE; /* This should never happen. */ } drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart); } /* At this point we will have extracted the byte positions of the leading MP3 frames. We can now start iterating over each seek point and calculate them. */ nextTargetPCMFrame = 0; for (iSeekPoint = 0; iSeekPoint < seekPointCount; ++iSeekPoint) { nextTargetPCMFrame += pcmFramesBetweenSeekPoints; for (;;) { if (nextTargetPCMFrame < runningPCMFrameCount) { /* The next seek point is in the current MP3 frame. */ pSeekPoints[iSeekPoint].seekPosInBytes = mp3FrameInfo[0].bytePos; pSeekPoints[iSeekPoint].pcmFrameIndex = nextTargetPCMFrame; pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES; pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex); break; } else { size_t i; drmp3_uint32 pcmFramesInCurrentMP3FrameIn; /* The next seek point is not in the current MP3 frame, so continue on to the next one. The first thing to do is cycle the cached MP3 frame info. */ for (i = 0; i < drmp3_countof(mp3FrameInfo)-1; ++i) { mp3FrameInfo[i] = mp3FrameInfo[i+1]; } /* Cache previous MP3 frame info. */ mp3FrameInfo[drmp3_countof(mp3FrameInfo)-1].bytePos = pMP3->streamCursor - pMP3->dataSize; mp3FrameInfo[drmp3_countof(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount; /* Go to the next MP3 frame. This shouldn't ever fail, but just in case it does we just set the seek point and break. If it happens, it should only ever do it for the last seek point. */ pcmFramesInCurrentMP3FrameIn = drmp3_decode_next_frame_ex(pMP3, NULL, DRMP3_TRUE); if (pcmFramesInCurrentMP3FrameIn == 0) { pSeekPoints[iSeekPoint].seekPosInBytes = mp3FrameInfo[0].bytePos; pSeekPoints[iSeekPoint].pcmFrameIndex = nextTargetPCMFrame; pSeekPoints[iSeekPoint].mp3FramesToDiscard = DRMP3_SEEK_LEADING_MP3_FRAMES; pSeekPoints[iSeekPoint].pcmFramesToDiscard = (drmp3_uint16)(nextTargetPCMFrame - mp3FrameInfo[DRMP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex); break; } drmp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart); } } } /* Finally, we need to seek back to where we were. */ if (!drmp3_seek_to_start_of_stream(pMP3)) { return DRMP3_FALSE; } if (!drmp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) { return DRMP3_FALSE; } } *pSeekPointCount = seekPointCount; return DRMP3_TRUE; } drmp3_bool32 drmp3_bind_seek_table(drmp3* pMP3, drmp3_uint32 seekPointCount, drmp3_seek_point* pSeekPoints) { if (pMP3 == NULL) { return DRMP3_FALSE; } if (seekPointCount == 0 || pSeekPoints == NULL) { /* Unbinding. */ pMP3->seekPointCount = 0; pMP3->pSeekPoints = NULL; } else { /* Binding. */ pMP3->seekPointCount = seekPointCount; pMP3->pSeekPoints = pSeekPoints; } return DRMP3_TRUE; } float* drmp3__full_read_and_close_f32(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) { drmp3_uint64 totalFramesRead = 0; drmp3_uint64 framesCapacity = 0; float* pFrames = NULL; float temp[4096]; drmp3_assert(pMP3 != NULL); for (;;) { drmp3_uint64 framesToReadRightNow = drmp3_countof(temp) / pMP3->channels; drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_f32(pMP3, framesToReadRightNow, temp); if (framesJustRead == 0) { break; } /* Reallocate the output buffer if there's not enough room. */ if (framesCapacity < totalFramesRead + framesJustRead) { drmp3_uint64 newFramesBufferSize; float* pNewFrames; framesCapacity *= 2; if (framesCapacity < totalFramesRead + framesJustRead) { framesCapacity = totalFramesRead + framesJustRead; } newFramesBufferSize = framesCapacity*pMP3->channels*sizeof(float); if (newFramesBufferSize > DRMP3_SIZE_MAX) { break; } pNewFrames = (float*)drmp3_realloc(pFrames, (size_t)newFramesBufferSize); if (pNewFrames == NULL) { drmp3_free(pFrames); break; } pFrames = pNewFrames; } drmp3_copy_memory(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(float))); totalFramesRead += framesJustRead; /* If the number of frames we asked for is less that what we actually read it means we've reached the end. */ if (framesJustRead != framesToReadRightNow) { break; } } if (pConfig != NULL) { pConfig->outputChannels = pMP3->channels; pConfig->outputSampleRate = pMP3->sampleRate; } drmp3_uninit(pMP3); if (pTotalFrameCount) { *pTotalFrameCount = totalFramesRead; } return pFrames; } drmp3_int16* drmp3__full_read_and_close_s16(drmp3* pMP3, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) { drmp3_uint64 totalFramesRead = 0; drmp3_uint64 framesCapacity = 0; drmp3_int16* pFrames = NULL; drmp3_int16 temp[4096]; drmp3_assert(pMP3 != NULL); for (;;) { drmp3_uint64 framesToReadRightNow = drmp3_countof(temp) / pMP3->channels; drmp3_uint64 framesJustRead = drmp3_read_pcm_frames_s16(pMP3, framesToReadRightNow, temp); if (framesJustRead == 0) { break; } /* Reallocate the output buffer if there's not enough room. */ if (framesCapacity < totalFramesRead + framesJustRead) { drmp3_uint64 newFramesBufferSize; drmp3_int16* pNewFrames; framesCapacity *= 2; if (framesCapacity < totalFramesRead + framesJustRead) { framesCapacity = totalFramesRead + framesJustRead; } newFramesBufferSize = framesCapacity*pMP3->channels*sizeof(drmp3_int16); if (newFramesBufferSize > DRMP3_SIZE_MAX) { break; } pNewFrames = (drmp3_int16*)drmp3_realloc(pFrames, (size_t)newFramesBufferSize); if (pNewFrames == NULL) { drmp3_free(pFrames); break; } pFrames = pNewFrames; } drmp3_copy_memory(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(drmp3_int16))); totalFramesRead += framesJustRead; /* If the number of frames we asked for is less that what we actually read it means we've reached the end. */ if (framesJustRead != framesToReadRightNow) { break; } } if (pConfig != NULL) { pConfig->outputChannels = pMP3->channels; pConfig->outputSampleRate = pMP3->sampleRate; } drmp3_uninit(pMP3); if (pTotalFrameCount) { *pTotalFrameCount = totalFramesRead; } return pFrames; } float* drmp3_open_and_read_f32(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) { drmp3 mp3; if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pConfig)) { return NULL; } return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount); } drmp3_int16* drmp3_open_and_read_s16(drmp3_read_proc onRead, drmp3_seek_proc onSeek, void* pUserData, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) { drmp3 mp3; if (!drmp3_init(&mp3, onRead, onSeek, pUserData, pConfig)) { return NULL; } return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount); } float* drmp3_open_memory_and_read_f32(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) { drmp3 mp3; if (!drmp3_init_memory(&mp3, pData, dataSize, pConfig)) { return NULL; } return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount); } drmp3_int16* drmp3_open_memory_and_read_s16(const void* pData, size_t dataSize, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) { drmp3 mp3; if (!drmp3_init_memory(&mp3, pData, dataSize, pConfig)) { return NULL; } return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount); } #ifndef DR_MP3_NO_STDIO float* drmp3_open_file_and_read_f32(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) { drmp3 mp3; if (!drmp3_init_file(&mp3, filePath, pConfig)) { return NULL; } return drmp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount); } drmp3_int16* drmp3_open_file_and_read_s16(const char* filePath, drmp3_config* pConfig, drmp3_uint64* pTotalFrameCount) { drmp3 mp3; if (!drmp3_init_file(&mp3, filePath, pConfig)) { return NULL; } return drmp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount); } #endif void drmp3_free(void* p) { DRMP3_FREE(p); } #endif /*DR_MP3_IMPLEMENTATION*/ /* DIFFERENCES BETWEEN minimp3 AND dr_mp3 ====================================== - First, keep in mind that minimp3 (https://github.com/lieff/minimp3) is where all the real work was done. All of the code relating to the actual decoding remains mostly unmodified, apart from some namespacing changes. - dr_mp3 adds a pulling style API which allows you to deliver raw data via callbacks. So, rather than pushing data to the decoder, the decoder _pulls_ data from your callbacks. - In addition to callbacks, a decoder can be initialized from a block of memory and a file. - The dr_mp3 pull API reads PCM frames rather than whole MP3 frames. - dr_mp3 adds convenience APIs for opening and decoding entire files in one go. - dr_mp3 is fully namespaced, including the implementation section, which is more suitable when compiling projects as a single translation unit (aka unity builds). At the time of writing this, a unity build is not possible when using minimp3 in conjunction with stb_vorbis. dr_mp3 addresses this. */ /* REVISION HISTORY ================ v0.4.7 - 2019-07-28 - Fix a compiler error. v0.4.6 - 2019-06-14 - Fix a compiler error. v0.4.5 - 2019-06-06 - Bring up to date with minimp3. v0.4.4 - 2019-05-06 - Fixes to the VC6 build. v0.4.3 - 2019-05-05 - Use the channel count and/or sample rate of the first MP3 frame instead of DR_MP3_DEFAULT_CHANNELS and DR_MP3_DEFAULT_SAMPLE_RATE when they are set to 0. To use the old behaviour, just set the relevant property to DR_MP3_DEFAULT_CHANNELS or DR_MP3_DEFAULT_SAMPLE_RATE. - Add s16 reading APIs - drmp3_read_pcm_frames_s16 - drmp3_open_memory_and_read_s16 - drmp3_open_and_read_s16 - drmp3_open_file_and_read_s16 - Add drmp3_get_mp3_and_pcm_frame_count() to the public header section. - Add support for C89. - Change license to choice of public domain or MIT-0. v0.4.2 - 2019-02-21 - Fix a warning. v0.4.1 - 2018-12-30 - Fix a warning. v0.4.0 - 2018-12-16 - API CHANGE: Rename some APIs: - drmp3_read_f32 -> to drmp3_read_pcm_frames_f32 - drmp3_seek_to_frame -> drmp3_seek_to_pcm_frame - drmp3_open_and_decode_f32 -> drmp3_open_and_read_f32 - drmp3_open_and_decode_memory_f32 -> drmp3_open_memory_and_read_f32 - drmp3_open_and_decode_file_f32 -> drmp3_open_file_and_read_f32 - Add drmp3_get_pcm_frame_count(). - Add drmp3_get_mp3_frame_count(). - Improve seeking performance. v0.3.2 - 2018-09-11 - Fix a couple of memory leaks. - Bring up to date with minimp3. v0.3.1 - 2018-08-25 - Fix C++ build. v0.3.0 - 2018-08-25 - Bring up to date with minimp3. This has a minor API change: the "pcm" parameter of drmp3dec_decode_frame() has been changed from short* to void* because it can now output both s16 and f32 samples, depending on whether or not the DR_MP3_FLOAT_OUTPUT option is set. v0.2.11 - 2018-08-08 - Fix a bug where the last part of a file is not read. v0.2.10 - 2018-08-07 - Improve 64-bit detection. v0.2.9 - 2018-08-05 - Fix C++ build on older versions of GCC. - Bring up to date with minimp3. v0.2.8 - 2018-08-02 - Fix compilation errors with older versions of GCC. v0.2.7 - 2018-07-13 - Bring up to date with minimp3. v0.2.6 - 2018-07-12 - Bring up to date with minimp3. v0.2.5 - 2018-06-22 - Bring up to date with minimp3. v0.2.4 - 2018-05-12 - Bring up to date with minimp3. v0.2.3 - 2018-04-29 - Fix TCC build. v0.2.2 - 2018-04-28 - Fix bug when opening a decoder from memory. v0.2.1 - 2018-04-27 - Efficiency improvements when the decoder reaches the end of the stream. v0.2 - 2018-04-21 - Bring up to date with minimp3. - Start using major.minor.revision versioning. v0.1d - 2018-03-30 - Bring up to date with minimp3. v0.1c - 2018-03-11 - Fix C++ build error. v0.1b - 2018-03-07 - Bring up to date with minimp3. v0.1a - 2018-02-28 - Fix compilation error on GCC/Clang. - Fix some warnings. v0.1 - 2018-02-xx - Initial versioned release. */ /* This software is available as a choice of the following licenses. Choose whichever you prefer. =============================================================================== ALTERNATIVE 1 - Public Domain (www.unlicense.org) =============================================================================== This is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to =============================================================================== ALTERNATIVE 2 - MIT No Attribution =============================================================================== Copyright 2018 David Reid Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* https://github.com/lieff/minimp3 To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty. See . */ fldigi-4.2.05/src/include/F_Edit.h0000664000175000017500000000421114611711171013476 00000000000000// ---------------------------------------------------------------------------- // FTextView.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef F_EDIT_H_ #define F_EDIT_H_ #include #include #include #include #include #include #include "FTextView.h" /// A FTextBase subclass to display and edit text class F_Edit : public FTextEdit { public: F_Edit(int x, int y, int w, int h, const char *l = 0); virtual int handle(int event); void clear(void); void add_text(std::string s); void setFont(Fl_Font f, int attr = NATTR); protected: enum { EDIT_MENU_CUT, EDIT_MENU_COPY, EDIT_MENU_PASTE, EDIT_MENU_CLEAR, EDIT_MENU_READ, EDIT_MENU_WRAP }; int handle_key(int key); int handle_dnd_drag(int pos); void handle_context_menu(void); void menu_cb(size_t item); void change_keybindings(void); static int kf_default(int c, Fl_Text_Editor_mod* e); static int kf_enter(int c, Fl_Text_Editor_mod* e); static int kf_delete(int c, Fl_Text_Editor_mod* e); static int kf_cut(int c, Fl_Text_Editor_mod* e); static int kf_paste(int c, Fl_Text_Editor_mod* e); private: F_Edit(); F_Edit(const F_Edit &t); protected: static Fl_Menu_Item menu[]; int editpos; int bkspaces; static int *p_editpos; }; #endif // F_EDIT_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/fileselect.h0000664000175000017500000000245314532252172014474 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FILESELECT_H #define FILESELECT_H #include namespace FSEL { void create(void); void destroy(void); const char* select(const char* title, const char* filter, const char* def = 0, int *fsel = NULL); const char* saveas(const char* title, const char* filter, const char* def = 0, int *fsel = NULL); const char* dir_select(const char* title, const char* filter, const char* def = 0); } #endif // FILESELECT_H fldigi-4.2.05/src/include/testmodem.h0000664000175000017500000000217214532252172014354 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "trx.h" class psktest : public trx { public: psktest(char *dev) : trx(dev) {}; ~psktest(){}; protected: virtual void txinit (){}; virtual void rxinit (){}; virtual int txprocess (){}; virtual int rxprocess (unsigned char *, int len){}; }; fldigi-4.2.05/src/include/field_def.h0000664000175000017500000000501514611711171014250 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FIELD_DEFS #define FIELD_DEFS // removed unused fields to reduce size of each record and speed up // record processing // field position should correspond with fields[] in adif_io.cxx enum ADIF_FIELD_POS { FREQ = 0, CALL, ADIF_MODE, SUBMODE, NAME, QSO_DATE, QSO_DATE_OFF, TIME_OFF, TIME_ON, QTH, RST_RCVD, RST_SENT, STATE, VE_PROV, NOTES, QSLRDATE, QSLSDATE, EQSLRDATE, EQSLSDATE, LOTWRDATE, LOTWSDATE, GRIDSQUARE, BAND, CNTY, COUNTRY, CQZ, DXCC, QSL_VIA, IOTA, ITUZ, CONT, SRX, STX, XCHG1, MYXCHG, CLASS, ARRL_SECT, TX_PWR, OP_CALL, STA_CALL, MY_GRID, MY_CITY, MY_STATE, SS_SERNO, SS_PREC, SS_CHK, SS_SEC, AGE, TEN_TEN, CHECK, FD_CLASS, // for backward compatible logbook reads FD_SECTION, // for backward compatible logbook reads TROOPS, // JOTA scout troop sent TROOPR, // JOTA scout troop received SCOUTS, // JOTA scout name sent SCOUTR, // JOTA scout name received // do not add fields below this line; EXPORT must be last field in struc EXPORT, // flag used internally in fldigi's logbook NUMFIELDS }; // ADIF multiline string is a sequence of Characters and line-breaks, // where a line break is an ASCII CR (code 13) followed immediately by an ASCII LF (code 10) // Not sure fldigi is completely conformant with this. // #define ADIF_EOL "\r\n" #define ADIF_EOL "\n" // Forward declaration for QsoHelper. class cQsoRec ; // Helps for creating a new ADIF record. class QsoHelper { cQsoRec * qso_rec ; QsoHelper(); QsoHelper(const QsoHelper &); QsoHelper & operator=(const QsoHelper &); public: QsoHelper(int mode); ~QsoHelper(); // Inserts a key-value pair. void Push( ADIF_FIELD_POS pos, const std::string & value ); }; #endif fldigi-4.2.05/src/include/jalocha/0000775000175000017500000000000014611714005013655 500000000000000fldigi-4.2.05/src/include/jalocha/pj_mfsk.h0000664000175000017500000016337214611711171015414 00000000000000// MFSK trasnmitter and receiver code, Pawel Jalocha, December 2004 #ifndef __PJ_MFSK_H__ #define __PJ_MFSK_H__ // ===================================================================== #include #include #include #include "pj_struc.h" #include "pj_fht.h" #include "pj_cmpx.h" #include "pj_fft.h" #include "pj_gray.h" #include "pj_lowpass3.h" #include "pj_fifo.h" // ===================================================================== static inline size_t Exp2(uint32_t X) { return (uint32_t)1 << X; } static inline size_t Log2(uint32_t X) { uint32_t Y; for ( Y = 0; X > 1; X >>= 1) Y += 1; return Y; } // ===================================================================== // the symbol shape described in frequency domain static const double MFSK_SymbolFreqShape[] = { 1.0, 1.0 } ; // use raised cosine shape - experimental // from gMFSK // { +1.0000000000, // +1.1913785723, // -0.0793018558, // -0.2171442026, // -0.0014526076 //}; // from DM780 //{ // +1.0000000000, // +2.1373197349, // +1.1207588117, // -0.0165609232 //}; static const size_t MFSK_SymbolFreqShapeLen = sizeof(MFSK_SymbolFreqShape) / sizeof(double); // ===================================================================== template class MFSK_Modulator { public: // parameters to be set before calling Preset() size_t SymbolLen; // length of the symbol, must be a power of 2 size_t FirstCarrier; // first carrier in terms of FFT freq. bins size_t BitsPerSymbol; // bits per symbol => number of carriers/tones int UseGrayCode; static const size_t CarrierSepar = 2; // parameters that are calculated by Preset() size_t Carriers; // number of tones/carriers size_t SymbolSepar; // time distance between symbols int SymbolPhase; // the phase of the tone being transmitted int Reverse; // send carriers in reverse order? private: Type *CosineTable; // Cosine table for fast cos/sin calculation Type *SymbolShape; // the shape of the symbol Type *OutTap; // output tap (buffer) size_t TapPtr; size_t WrapMask; public: MFSK_Modulator() { Init(); Default(); } ~MFSK_Modulator() { Free(); } void Init(void) { CosineTable = 0; SymbolShape = 0; OutTap = 0; } void Free(void) { delete [] CosineTable; CosineTable = 0; delete [] SymbolShape; SymbolShape = 0; delete [] OutTap; OutTap = 0; } void Default(void) { SymbolLen = 512; FirstCarrier = 32; BitsPerSymbol = 5; Reverse = 0; UseGrayCode = 1; } int Preset(void) { size_t Idx; Carriers = Exp2(BitsPerSymbol); SymbolSepar = SymbolLen / 2; if (ReallocArray(&CosineTable, SymbolLen) < 0) goto Error; for (Idx = 0; Idx < SymbolLen; Idx++) CosineTable[Idx] = cos((2*M_PI*Idx) / SymbolLen); if (ReallocArray(&SymbolShape, SymbolLen) < 0) goto Error; { size_t Time; double Ampl = MFSK_SymbolFreqShape[0]; for (Time = 0; Time < SymbolLen; Time++) SymbolShape[Time] = Ampl; } size_t Freq; for (Freq = 1; Freq < MFSK_SymbolFreqShapeLen; Freq++) { size_t Time; double Ampl = MFSK_SymbolFreqShape[Freq]; if (Freq & 1) Ampl = (-Ampl); size_t Phase = 0; for (Time = 0; Time < SymbolLen; Time++) { SymbolShape[Time] += Ampl*CosineTable[Phase]; Phase += Freq; if (Phase >= SymbolLen) Phase-=SymbolLen; } } { size_t Time; double Scale = 1.0/4; for (Time = 0; Time < SymbolLen; Time++) SymbolShape[Time] *= Scale; } if (ReallocArray(&OutTap, SymbolLen) < 0) goto Error; for (Idx = 0; Idx < SymbolLen; Idx++) OutTap[Idx] = 0; TapPtr = 0; WrapMask = SymbolLen-1; SymbolPhase = 0; return 0; Error: Free(); return -1; } void Send(uint8_t Symbol) { if (UseGrayCode) Symbol=GrayCode(Symbol); int SymbolFreq; if (Reverse == 1) { int RevFirstCar=FirstCarrier-2; SymbolFreq=RevFirstCar-CarrierSepar*Symbol; } else { SymbolFreq=FirstCarrier+CarrierSepar*Symbol; } int TimeShift=SymbolSepar/2-SymbolLen/2; SymbolPhase+=SymbolFreq*TimeShift; SymbolPhase&=WrapMask; AddSymbol(SymbolFreq,SymbolPhase); TimeShift=SymbolSepar/2+SymbolLen/2; SymbolPhase+=SymbolFreq*TimeShift; SymbolPhase&=WrapMask; int PhaseDiffer=SymbolLen/4; if (rand()&1) PhaseDiffer=(-PhaseDiffer); SymbolPhase+=PhaseDiffer; SymbolPhase&=WrapMask; } // get output as 16-bit signed data int Output(int16_t *Buffer) { const Type Scale = 32768.0; const int32_t Limit = 0x7FFF; size_t Idx; for (Idx = 0; Idx < SymbolSepar; Idx++) { Type Ampl = OutTap[TapPtr]; Ampl *= Scale; int32_t Out = (int32_t)floor(Ampl + 0.5); if (Out > Limit) Out = Limit; else if (Out < (-Limit)) Out = (-Limit); Buffer[Idx] = (int16_t)Out; OutTap[TapPtr] = 0; TapPtr += 1; TapPtr &= WrapMask; } return SymbolSepar; } template int Output(OutType *Buffer) { size_t Idx; for (Idx = 0; Idx < SymbolSepar; Idx++) { Buffer[Idx] = OutTap[TapPtr]; OutTap[TapPtr] = 0; TapPtr += 1; TapPtr &= WrapMask; } return SymbolSepar; } private: void AddSymbol(int Freq, int Phase) { size_t Time; for (Time = 0; Time < SymbolLen; Time++) { // experimental use with {1.0, 1.0}; Type Shape=1.0-CosineTable[Time]; OutTap[TapPtr] += CosineTable[Phase] * Shape; // OutTap[TapPtr] += CosineTable[Phase] * SymbolShape[Time]; Phase += Freq; Phase &= WrapMask; TapPtr += 1; TapPtr &= WrapMask; } } } ; // ===================================================================== template class BoxFilter { public: size_t Len; TapType *Tap; size_t Ptr; OutType Output; BoxFilter() { Tap = 0; } ~BoxFilter() { delete [] Tap; } void Free(void) { delete [] Tap; Tap = 0; } int Preset(void) { if (ReallocArray(&Tap, Len) < 0) return -1; Clear(); return 0; } void Clear(void) { size_t Idx; for (Idx = 0; Idx < Len; Idx++) Tap[Idx] = 0; Ptr = 0; Output = 0; } template void Process(InpType Input) { Output -= Tap[Ptr]; Output += Input; Tap[Ptr] = Input; Ptr += 1; if (Ptr >= Len) Ptr -= Len; } }; // ===================================================================== template class MFSK_InputProcessor { public: size_t WindowLen; size_t WrapMask; Type *InpTap; size_t InpTapPtr; Type *OutTap; size_t OutTapPtr; Type *WindowShape; size_t SliceSepar; r2FFT< Cmpx > FFT; // FFT engine Cmpx *FFT_Buff; // FFT buffer size_t SpectraLen; Cmpx *Spectra[2]; Type *Output; Type *Energy; BoxFilter Filter; public: MFSK_InputProcessor() { Init(); Default(); } ~MFSK_InputProcessor() { Free(); } void Init(void) { InpTap = 0; OutTap = 0; WindowShape = 0; FFT_Buff = 0; Spectra[0] = 0; Spectra[1] = 0; Output = 0; Energy = 0; } void Free(void) { delete [] InpTap; InpTap = 0; delete [] OutTap; OutTap = 0; delete [] WindowShape; WindowShape = 0; delete [] FFT_Buff; FFT_Buff = 0; delete [] Spectra[0]; Spectra[0] = 0; delete [] Spectra[1]; Spectra[1] = 0; delete [] Output; Output = 0; delete [] Energy; Energy = 0; FFT.Free(); Filter.Free(); } void Default(void) { WindowLen = 8192; } int Preset(void) { size_t Idx; WrapMask = WindowLen - 1; Type ShapeScale = 2.0 / WindowLen; if (ReallocArray(&InpTap, WindowLen) < 0) goto Error; ClearArray(InpTap, WindowLen); InpTapPtr = 0; if (ReallocArray(&OutTap, WindowLen) < 0) goto Error; ClearArray(OutTap, WindowLen); OutTapPtr = 0; if (FFT.Preset(WindowLen) < 0) goto Error; if (ReallocArray(&FFT_Buff, WindowLen) < 0) goto Error; SliceSepar = WindowLen / 2; if (ReallocArray(&WindowShape, WindowLen)< 0) goto Error; for (Idx = 0; Idx < WindowLen; Idx++) WindowShape[Idx] = ShapeScale * sqrt(1.0 - FFT.Twiddle[Idx].Re); SpectraLen = WindowLen / 2; if (ReallocArray(&Spectra[0], SpectraLen) < 0) goto Error; if (ReallocArray(&Spectra[1], SpectraLen) < 0) goto Error; if (ReallocArray(&Output, WindowLen) < 0) goto Error; ClearArray(Output, WindowLen); if (ReallocArray(&Energy, SpectraLen) < 0) goto Error; Filter.Len = WindowLen / 16; if (Filter.Preset() < 0) goto Error; return 0; Error: Free(); return -1; } void Reset(void) { ClearArray(InpTap, WindowLen); InpTapPtr = 0; ClearArray(OutTap, WindowLen); OutTapPtr = 0; } void LimitSpectraPeaks( Cmpx *Spectra, size_t Len = 64, Type Threshold = 4.0) { Filter.Len = Len; Filter.Preset(); size_t MaxFreq = 3 * (SpectraLen / 4); size_t Freq, Idx; for (Freq = 0; Freq < Len; Freq++) Filter.Process(Energy[Freq]); for (Idx = Len / 2; Freq < MaxFreq; Freq++,Idx++) { Filter.Process(Energy[Freq]); Type Signal = Energy[Idx]; Type Limit = (Filter.Output/Len) * Threshold; if (Signal > Limit) { Spectra[Idx] *= sqrt(Limit / Signal); Energy[Idx] = Limit; } } } void LimitOutputPeaks(Type Threshold = 2.5) { size_t Idx; Type RMS = 0; for (Idx = 0; Idx < WindowLen; Idx++) { Type Signal = Output[Idx]; RMS += Signal * Signal; } RMS = sqrt(RMS / WindowLen); Type Limit = RMS * Threshold; for (Idx = 0; Idx < WindowLen; Idx++) { Type Signal = Output[Idx]; if (Signal > Limit) Output[Idx] = Limit; else if (Signal < (-Limit)) Output[Idx] = (-Limit); } } void AverageEnergy(size_t Len = 32) { Filter.Len = Len; Filter.Preset(); size_t MaxFreq = 3 * (SpectraLen / 4); Type Scale = 1.0 / Len; size_t Len2 = Len / 2; size_t Idx, Freq; for (Freq = 0; Freq < Len; Freq++) Filter.Process(Energy[Freq]); for (Idx = 0; Idx < Len2; Idx++) Energy[Idx] = Filter.Output * Scale; for ( ; Freq < MaxFreq; Freq++,Idx++) { Filter.Process(Energy[Freq]); Energy[Idx] = Filter.Output * Scale; } for ( ; Idx < SpectraLen; Idx++) Energy[Idx] = Filter.Output*Scale; } // here we process the spectral data void ProcessSpectra(Cmpx *Spectra) { size_t Freq; for (Freq = 0; Freq < SpectraLen; Freq++) Energy[Freq] = Spectra[Freq].Energy(); LimitSpectraPeaks(Spectra, WindowLen / 64, 4.0); LimitSpectraPeaks(Spectra, WindowLen / 64, 4.0); LimitSpectraPeaks(Spectra, WindowLen / 64, 4.0); AverageEnergy(WindowLen / 96); AverageEnergy(WindowLen / 64); for (Freq = 0; Freq < SpectraLen; Freq++) { Type Corr = Energy[Freq]; if (Corr <= 0) continue; Corr = 1.0 / sqrt(Corr); Spectra[Freq] *= Corr; } } template void ProcessInpTap(InpType *Input) { size_t InpIdx; for (InpIdx = 0; InpIdx < SliceSepar; InpIdx++) { InpTap[InpTapPtr] = Input[InpIdx]; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessInpTap() { size_t InpIdx; for (InpIdx = 0; InpIdx < SliceSepar; InpIdx++) { InpTap[InpTapPtr] = 0; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessInpWindow_Re(void) { size_t Time; for (Time = 0; Time < WindowLen; Time++) { FFT_Buff[Time].Re = InpTap[InpTapPtr] * WindowShape[Time]; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessInpWindow_Im(void) { size_t Time; for (Time = 0; Time < WindowLen; Time++) { FFT_Buff[Time].Im = InpTap[InpTapPtr] * WindowShape[Time]; InpTapPtr += 1; InpTapPtr &= WrapMask; } } void ProcessOutWindow_Re(void) { size_t Time; for (Time=0; Time int Process(InpType *Input) { if (Input) ProcessInpTap(Input); else ProcessInpTap(); ProcessInpWindow_Re(); if (Input) ProcessInpTap(Input+SliceSepar); else ProcessInpTap(); ProcessInpWindow_Im(); FFT.Process(FFT_Buff); FFT.SeparTwoReals(FFT_Buff, Spectra[0], Spectra[1]); ProcessSpectra(Spectra[0]); ProcessSpectra(Spectra[1]); FFT.JoinTwoReals(Spectra[0], Spectra[1], FFT_Buff); FFT.Process(FFT_Buff); ProcessOutWindow_Re(); ProcessOutTap(Output); ProcessOutWindow_Im(); ProcessOutTap(Output+SliceSepar); LimitOutputPeaks(2.5); LimitOutputPeaks(2.5); return WindowLen; } // get output as 16-bit signed data int GetOutput(int16_t *Buffer) { const Type Scale = 32768.0; const int32_t Limit = 0x7FFF; size_t Idx; for (Idx = 0; Idx < WindowLen; Idx++) { Type Ampl = Output[Idx]; Ampl *= Scale; int32_t Out = (int32_t)floor(Ampl + 0.5); if (Out > Limit) Out = Limit; else if (Out < (-Limit)) Out = (-Limit); Buffer[Idx] = (int16_t)Out; } return WindowLen; } } ; // ===================================================================== // A circular buffer to store history of data. // Data may come as single numbers or in batches // of fixed size (-> Width) template class CircularBuffer { public: size_t Width; // input/output data width (row width) size_t Len; // buffer length (column height) size_t Size; // total size of the storage in the buffer size_t Ptr; // current pointer (counts rows) Type *Data; // allocated storage CircularBuffer() { Init(); } ~CircularBuffer() { delete [] Data; } void Init(void) { Data = 0; Size = 0; Width = 1; } void Free(void) { delete [] Data; Data = 0; Size = 0; } // reset: set pointer to the beginning of the buffer void Reset(void) { Ptr = 0; } // preset for given length and width int Preset(void) { Size = Width * Len; if (ReallocArray(&Data, Size) < 0) return -1; Reset(); return 0; } // set all elements to given value void Set(Type &Value) { size_t Idx; for (Idx = 0; Idx < Size; Idx++) Data[Idx]=Value; } // set all elements to zero void Clear(void) { Type Zero; Zero = 0; Set(Zero); } // increment the pointer (with wrapping around) void IncrPtr(size_t &Ptr, size_t Step=1) { Ptr += Step; if (Ptr >= Len) Ptr -= Len; } // decrement the pointer (with wrapping around) void DecrPtr(size_t &Ptr, size_t Step=1) { if (Ptr >= Step) Ptr -= Step; else Ptr += (Len - Step); } // synchronize current pointer with another circular buffer template void operator |= (CircularBuffer Buffer) { Ptr = Buffer.Ptr; } // advance (increment) current pointer void operator += (size_t Step) { IncrPtr(Ptr, Step); } // decrement current pointer void operator -= (size_t Step) { DecrPtr(Ptr, Step); } // index operator to get the absolute data pointer Type *operator [] (size_t Idx) { return Data + (Idx * Width); } // get storage pointer corresponding to an absolute pipe pointer Type *AbsPtr(size_t Ptr) { return Data + (Ptr * Width); } // get storage pointer corresponding to current pipe pointer Type *CurrPtr(void) { return Data + (Ptr * Width); } // get storage pointer corresponding to current pointer +/- offset Type *OffsetPtr(int Offset) { Offset += Ptr; Offset *= Width; if (Offset < 0) Offset += Size; else if (Offset >= (int)Size) Offset -= Size; return Data + Offset; } }; // ===================================================================== template class MFSK_Demodulator { public: // parameters to be set before calling Preset() size_t SymbolLen; // length of the symbol, must be a power of 2 size_t FirstCarrier; // first carrier in terms of FFT freq. bins size_t BitsPerSymbol; // bits per symbol => number of carriers/tones int UseGrayCode; size_t DecodeMargin; int EqualizerDepth; // leave this at 0 (disable the equalizer) int Reverse; static const size_t CarrierSepar=2; static const size_t SpectraPerSymbol = 2; // FFT slices per symbol public: size_t Carriers; // number of tones/carriers size_t SymbolSepar; // time distance between symbols private: size_t DecodeWidth; size_t SymbolSepar2; size_t WrapMask; Type *InpTap; // input buffer size_t InpTapPtr; Type *SymbolShape; // the shape of the symbol and the FFT window r2FFT< Cmpx > FFT; // FFT engine Cmpx *FFT_Buff; // FFT buffer size_t SpectraLen; // number of spectra points per FFT Cmpx *Spectra[SpectraPerSymbol]; // two buffers for FFT spectra Type *Energy[SpectraPerSymbol]; CircularBuffer EnergyBuffer; LowPass3_Filter *AverageEnergy; Type FilterWeight; public: MFSK_Demodulator() { Init(); Default(); } ~MFSK_Demodulator() { Free(); } void Init(void) { InpTap=0; SymbolShape=0; FFT_Buff=0; Spectra[0]=0; Spectra[1]=0; Energy[0]=0; Energy[1]=0; AverageEnergy=0; } void Free(void) { delete [] InpTap; InpTap=0; delete [] SymbolShape; SymbolShape=0; delete [] FFT_Buff; FFT_Buff=0; delete [] Spectra[0]; Spectra[0]=0; delete [] Spectra[1]; Spectra[1]=0; delete [] Energy[0]; Energy[0]=0; delete [] Energy[1]; Energy[1]=0; delete [] AverageEnergy; AverageEnergy=0; FFT.Free(); EnergyBuffer.Free(); } void Default(void) { SymbolLen=512; FirstCarrier=32; BitsPerSymbol=5; UseGrayCode=1; DecodeMargin=32; Reverse=0; EqualizerDepth=0; } int Preset(void) { Carriers=Exp2(BitsPerSymbol); WrapMask=SymbolLen-1; Type ShapeScale=1.0/SymbolLen; if (ReallocArray(&InpTap,SymbolLen)<0) goto Error; ClearArray(InpTap,SymbolLen); InpTapPtr=0; if (FFT.Preset(SymbolLen)<0) goto Error; if (ReallocArray(&FFT_Buff,SymbolLen)<0) goto Error; SymbolSepar=SymbolLen/2; SymbolSepar2=SymbolSepar/2; if (ReallocArray(&SymbolShape,SymbolLen)<0) goto Error; { size_t Time; double Ampl=MFSK_SymbolFreqShape[0]; for (Time=0; Time=SymbolLen) Phase-=SymbolLen; } } { size_t Time; for (Time=0; TimeFirstCarrier) DecodeMargin=FirstCarrier; DecodeWidth=(Carriers*CarrierSepar-1)+2*DecodeMargin; if (ReallocArray(&Energy[0],DecodeWidth)<0) goto Error; if (ReallocArray(&Energy[1],DecodeWidth)<0) goto Error; if (EqualizerDepth) { EnergyBuffer.Len=EqualizerDepth; EnergyBuffer.Width=DecodeWidth; if (EnergyBuffer.Preset()<0) goto Error; EnergyBuffer.Clear(); if (ReallocArray(&AverageEnergy,DecodeWidth)<0) goto Error; size_t Idx; for (Idx=0; Idx void Process(InpType *Input) { size_t InpIdx,Time; for (InpIdx=0; InpIdx0) { Energy[0][Idx]/=RefEnergy; Energy[1][Idx]/=RefEnergy; } else { Energy[0][Idx]=0; Energy[1][Idx]=0; } } */ EnergyBuffer+=2; } else { size_t Idx; if (Reverse==1) { size_t Freq=FirstCarrier; for (Idx=0; IdxPeak) { Peak=Energy; PeakIdx=Idx; } Freq+=CarrierSepar; } if (UseGrayCode) PeakIdx=BinaryCode(PeakIdx); return PeakIdx; } template void SoftDecode(SymbType *Symbol, size_t Slice=0, int FreqOffset=0) { size_t Bit,Idx; for (Bit=0; Bit0) { for (Bit=0; Bit void SoftDecode_Test(SymbType *Symbol, size_t Slice=0, int FreqOffset=0) { size_t Bit,Idx,Freq; Type *EnergyPtr=Energy[Slice]+(DecodeMargin+FreqOffset); // printf("SoftDecode:"); Type TotalEnergy=0; Type PeakEnergy=0; for (Freq=0,Idx=0; IdxPeakEnergy) PeakEnergy=Energy; } Type AverageNoise=(TotalEnergy-PeakEnergy)/(Carriers-1)/2; /* printf(" PeakEnergy/TotalEnergy=%4.3f",PeakEnergy/TotalEnergy); printf(" AverageNoise/TotalEnergy=%4.3f\n",AverageNoise/TotalEnergy); printf("Energy[%d]/Tot =",Carriers); for (Freq=0,Idx=0; Idx void PrintBinary(Type Number, size_t Bits) { Type Mask=1; Mask<<=(Bits-1); for ( ; Bits; Bits--) { printf("%c",Number&Mask ? '1':'0'); Mask>>=1; } } // ===================================================================== class MFSK_Encoder { public: size_t BitsPerSymbol; size_t BitsPerCharacter; public: size_t Symbols; size_t SymbolsPerBlock; bool bContestia; // bool bRTTYM; private: static const uint64_t ScramblingCodeOlivia = 0xE257E6D0291574ECLL; static const uint64_t ScramblingCodeContestia = 0xEDB88320LL; // static const uint64_t ScramblingCodeRTTYM = 0xEDB88320LL; uint64_t ScramblingCode; int8_t *FHT_Buffer; public: uint8_t *OutputBlock; public: MFSK_Encoder() { Default(); Init(); } ~MFSK_Encoder() { Free(); } void Default(void) { bContestia = false; BitsPerSymbol=5; BitsPerCharacter=7; ScramblingCode = ScramblingCodeOlivia; } void Init(void) { FHT_Buffer=0; OutputBlock=0; } void Free(void) { delete [] FHT_Buffer; FHT_Buffer=0; delete [] OutputBlock; OutputBlock=0; } int Preset(void) { if (bContestia) { ScramblingCode = ScramblingCodeContestia; BitsPerCharacter = 6; // } else if (bRTTYM) { // ScramblingCode = ScramblingCodeRTTYM; // BitsPerCharacter = 5; } else { // standard Olivia ScramblingCode = ScramblingCodeOlivia; BitsPerCharacter = 7; } Symbols = 1 << BitsPerSymbol; SymbolsPerBlock = Exp2(BitsPerCharacter-1); if (ReallocArray(&FHT_Buffer,SymbolsPerBlock)<0) goto Error; if (ReallocArray(&OutputBlock,SymbolsPerBlock)<0) goto Error; return 0; Error: Free(); return -1; } void EncodeCharacter(uint8_t Char) { size_t TimeBit; uint8_t Mask = (SymbolsPerBlock << 1) - 1; if (bContestia) { if (Char >= 'a' && Char <= 'z') Char += 'A' - 'a'; if (Char == ' ') Char = 59; else if (Char == '\r') Char = 60; else if (Char == '\n') Char = 0; else if (Char >= 33 && Char <= 90) Char -= 32; else if (Char == 8) Char = 61; else if (Char == 0) Char = 0; else Char = '?' - 32; // } else if (bRTTYM) { } else { Char &= Mask; } for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) FHT_Buffer[TimeBit] = 0; if (Char= BitsPerSymbol) Bit -= BitsPerSymbol; uint8_t Mask = 1; Mask <<= Bit; OutputBlock[TimeBit] |= Mask; } Rotate += 1; if (Rotate >= BitsPerSymbol) Rotate -= BitsPerSymbol; } } } void PrintOutputBlock(void) { size_t TimeBit; for (TimeBit=0; TimeBit class MFSK_SoftDecoder { public: size_t BitsPerSymbol; // number of bits per symbol size_t BitsPerCharacter; // number of bits per character size_t Symbols; // number of symbols size_t SymbolsPerBlock; // number of symbols per FEC block float Signal, NoiseEnergy; uint8_t *OutputBlock; bool bContestia; // bool bRTTYM; private: static const uint64_t ScramblingCodeOlivia = 0xE257E6D0291574ECLL; static const uint64_t ScramblingCodeContestia = 0xEDB88320LL; // static const uint64_t ScramblingCodeRTTYM = 0xEDB88320LL; uint64_t ScramblingCode; size_t InputBufferLen; InpType *InputBuffer; size_t InputPtr; CalcType *FHT_Buffer; public: MFSK_SoftDecoder() { bContestia = false; Init(); Default(); } ~MFSK_SoftDecoder() { Free(); } void Default(void) { bContestia = false; BitsPerSymbol = 5; BitsPerCharacter = 7; ScramblingCode = ScramblingCodeOlivia; } void Init(void) { InputBuffer = 0; FHT_Buffer = 0; OutputBlock = 0; } void Free(void) { delete [] InputBuffer; InputBuffer = 0; delete [] FHT_Buffer; FHT_Buffer = 0; delete [] OutputBlock; OutputBlock = 0; } void Reset(void) { size_t Idx; for (Idx = 0; Idx < InputBufferLen; Idx++) InputBuffer[Idx] = 0; InputPtr = 0; } int Preset(void) { // if (bRTTYM) { // BitsPerCharacter = 5; // ScramblingCode = ScramblingCodeRTTYM; // } else if (bContestia) { BitsPerCharacter = 6; ScramblingCode = ScramblingCodeContestia; } else { BitsPerCharacter = 7; ScramblingCode = ScramblingCodeOlivia; } Symbols = 1 << BitsPerSymbol; SymbolsPerBlock = Exp2(BitsPerCharacter - 1); InputBufferLen = SymbolsPerBlock * BitsPerSymbol; if (ReallocArray(&InputBuffer, InputBufferLen) < 0) goto Error; if (ReallocArray(&FHT_Buffer, SymbolsPerBlock) < 0) goto Error; if (ReallocArray(&OutputBlock, BitsPerSymbol) < 0) goto Error; Reset(); return 0; Error: Free(); return -1; } int Preset(MFSK_SoftDecoder &RefDecoder) { BitsPerSymbol = RefDecoder.BitsPerSymbol; // BitsPerCharacter = RefDecoder.BitsPerCharacter; return Preset(); } void Input(InpType *Symbol) { size_t FreqBit; for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) { InputBuffer[InputPtr] = Symbol[FreqBit]; InputPtr += 1; } if (InputPtr >= InputBufferLen) InputPtr -= InputBufferLen; } void DecodeCharacter(size_t FreqBit) { size_t TimeBit; size_t Ptr = InputPtr; size_t Rotate = FreqBit; size_t CodeWrap = (SymbolsPerBlock - 1); // Olivia (13 bit shift) or Contestia/RTTYM (5 bit shift) // size_t nShift = (bContestia || bRTTYM) ? 5 : 13; size_t nShift = (bContestia) ? 5 : 13; size_t CodeBit = FreqBit * nShift; CodeBit &= CodeWrap; for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) { InpType Bit = InputBuffer[Ptr + Rotate]; uint64_t CodeMask = 1; CodeMask <<= CodeBit; if (ScramblingCode & CodeMask) Bit = (-Bit); FHT_Buffer[TimeBit] = Bit; CodeBit += 1; CodeBit &= CodeWrap; Rotate += 1; if (Rotate >= BitsPerSymbol) Rotate -= BitsPerSymbol; Ptr += BitsPerSymbol; if (Ptr >= InputBufferLen) Ptr -= InputBufferLen; } FHT(FHT_Buffer, SymbolsPerBlock); CalcType Peak = 0; size_t PeakPos = 0; CalcType SqrSum = 0; for (TimeBit = 0; TimeBit < SymbolsPerBlock; TimeBit++) { CalcType Signal = FHT_Buffer[TimeBit]; SqrSum += Signal * Signal; if (fabs(Signal) > fabs(Peak)) { Peak = Signal; PeakPos = TimeBit; } } uint8_t Char = PeakPos; if (Peak < 0) Char += SymbolsPerBlock; SqrSum -= Peak * Peak; if (bContestia && Char > 0) { if (Char == 59) Char = ' '; else if (Char == 60) Char = '\r'; else if (Char == 61) Char = 8; // backspace else Char += 32; } OutputBlock[FreqBit] = Char; NoiseEnergy += (float)SqrSum / (SymbolsPerBlock - 1); Signal += fabs(Peak); } void Process(void) { size_t FreqBit; Signal = 0; NoiseEnergy = 0; for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) DecodeCharacter(FreqBit); Signal /= BitsPerSymbol; NoiseEnergy /= BitsPerSymbol; } size_t Output(uint8_t *Buffer) { size_t FreqBit; for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) Buffer[FreqBit] = OutputBlock[FreqBit]; return BitsPerSymbol; } size_t Output(uint64_t &PackedBuffer) { size_t FreqBit; PackedBuffer = 0; for (FreqBit = BitsPerSymbol; FreqBit > 0; ) { PackedBuffer <<= 8; FreqBit--; PackedBuffer |= OutputBlock[FreqBit]; } return BitsPerSymbol; } void PrintOutputBlock(FILE *File = stdout) { size_t FreqBit; fprintf(File, "'"); for (FreqBit = 0; FreqBit < BitsPerSymbol; FreqBit++) { uint8_t Char = OutputBlock[FreqBit]; fprintf(File, "%c", (Char >= ' ') && (Char < 127) ? Char:' '); } fprintf(File, "'"); if (NoiseEnergy > 0) fprintf(File, ", S/N = %5.1f", Signal / sqrt(NoiseEnergy)); fprintf(File, "\n"); } size_t Output(uint64_t *PackedBuffer) { return Output(*PackedBuffer); } }; // ===================================================================== // rate converter template class RateConverter { public: // parameters to be set by the user size_t TapLen; // filter tap length (in term of input samples) size_t OverSampling; // internal oversampling factor Type UpperFreq; // upper frequency of the (lowpass) filter (in terms of input sampling rate) Type OutputRate; // the output rate (in terms of the input rate) private: size_t FilterLen; // the total length of the filter (in term of oversampled rate) Type *FilterShape; // the shape of the filter Type *InputTap; // filter tap size_t InputTapPtr; size_t InputWrap; Type OutputTime; Type OutputPeriod; Type OutputBefore; Type OutputAfter; size_t OutputPtr; public: RateConverter() { Init(); Default(); } ~RateConverter() { Free(); } void Init(void) { FilterShape = 0; InputTap = 0; } void Free(void) { delete [] FilterShape; FilterShape = 0; delete [] InputTap; InputTap = 0; } void Default(void) { TapLen = 16; OverSampling = 16; UpperFreq = 3.0 / 8; OutputRate = 1.0; } int Preset(void) { size_t Idx; TapLen = Exp2(Log2(TapLen)); FilterLen = TapLen * OverSampling; if ((ReallocArray(&FilterShape, FilterLen)) < 0) goto Error; if ((ReallocArray(&InputTap, TapLen)) < 0) goto Error; for (Idx = 0; Idx < FilterLen; Idx++) { Type Phase = (M_PI * (2 * (int)Idx - (int)FilterLen)) / FilterLen; // Hanning // Type Window = 0.50 + 0.50 * cos(Phase); // Blackman // Type Window = 0.42 + 0.50 * cos(Phase) + 0.08 * cos(2 * Phase); // Blackman-Harris Type Window = 0.35875 + 0.48829 * cos(Phase) + 0.14128 * cos(2 * Phase) + 0.01168 * cos(3 * Phase); Type Filter = 1.0; if (Phase != 0) { Phase *= (UpperFreq * TapLen); Filter = sin(Phase) / Phase; } // printf("%3d: %+9.6f %+9.6f %+9.6f\n", Idx, Window, Filter, Window*Filter); FilterShape[Idx] = Window * Filter; } Reset(); return 0; Error: Free(); return -1; } void Reset(void) { size_t Idx; InputWrap = TapLen - 1; for (Idx = 0; Idx < TapLen; Idx++) InputTap[Idx] = 0; InputTapPtr = 0; OutputTime = 0; OutputPeriod = OverSampling / OutputRate; OutputBefore = 0; OutputAfter = 0; OutputPtr = 0; } private: Type Convolute(size_t Shift=0) { Type Sum = 0; Shift = (OverSampling - 1) - Shift; size_t Idx = InputTapPtr; for ( ; Shift < FilterLen; Shift += OverSampling) { Sum += InputTap[Idx] * FilterShape[Shift]; Idx += 1; Idx &= InputWrap; } return Sum; } void NewInput(Type Input) { // printf("I:\n"); InputTap[InputTapPtr]=Input; InputTapPtr+=1; InputTapPtr&=InputWrap; } public: template int Process(InpType *Input, size_t InputLen, OutType *Output) { size_t OutputLen = 0; // printf("E: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); for ( ; ; ) { // printf("L: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); if (OutputPtr) { size_t Idx = (size_t)floor(OutputTime) + 1; if (Idx >= OverSampling) { if (InputLen == 0) break; NewInput(*Input); Input++; InputLen -= 1; Idx -= OverSampling; OutputTime -= (Type)OverSampling; } OutputAfter = Convolute(Idx); Type Weight = Idx - OutputTime; (*Output) = Weight * OutputBefore + (1.0 - Weight) * OutputAfter; Output++; OutputLen += 1; // printf("O: %d %3.1f %d %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen, Idx); OutputPtr = 0; } else { size_t Idx = (size_t)floor(OutputTime + OutputPeriod); if (Idx >= OverSampling) { if (InputLen == 0) break; NewInput(*Input); Input++; InputLen -= 1; Idx -= OverSampling; OutputTime -= (Type)OverSampling; } OutputBefore = Convolute(Idx); OutputTime += OutputPeriod; OutputPtr = 1; } } // printf("R: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); return OutputLen; } template int Process(InpType Input, size_t InputLen, Seq &Output) { size_t OutPtr = Output.Len; size_t MaxOutLen = (size_t)ceil(InputLen * OutputRate + 2); if (Output.EnsureSpace(OutPtr + MaxOutLen) < 0) return -1; int OutLen = Process(Input, InputLen, Output.Elem+OutPtr); Output.Len += OutLen; return OutLen; } template int Process(InpType Input, OutType *Output) { return Process(&Input, 1, Output); } }; // ===================================================================== template class MFSK_Transmitter { public: // primary parameters: set by the user bool bContestia; size_t Tones; // number of tones: 4, 8, 16, 32, 64, 128, 256 size_t Bandwidth; // bandwidth: 125, 250, 500, 1000, 2000 Type SampleRate; // audio sampling rate (internal processing) Type OutputSampleRate; // true sampling rate of the soundcard float FirstCarrierMultiplier; int Reverse; // secondary parameters: calculated by Preset() size_t BitsPerSymbol; // number of bits per symbol size_t SymbolsPerBlock; // number of symbols per one FEC code block size_t MaxOutputLen; // maximum length of the audio batch returned by Output() private: static const int State_Running = 0x0001; static const int State_StopReq = 0x0010; int State; FIFO Input; // buffer(queue) for the characters to be encoded uint8_t InputBlock[8]; // FEC code block buffer FIFO Monitor; // buffer for monitoring the characters being sent MFSK_Encoder Encoder; // FEC encoder size_t SymbolPtr; MFSK_Modulator Modulator; // MFSK modulator Type *ModulatorOutput; RateConverter Converter; // output rate converter Type *ConverterOutput; public: MFSK_Transmitter() { bContestia = false; Init(); } ~MFSK_Transmitter() { Free(); } void Init(void) { ModulatorOutput = 0; ConverterOutput = 0; } void Free(void) { Input.Free(); Monitor.Free(); Encoder.Free(); Modulator.Free(); delete [] ModulatorOutput; ModulatorOutput = 0; Converter.Free(); delete [] ConverterOutput; ConverterOutput = 0; } // set default primary parameters void Default(void) { Tones = 32; Bandwidth = 1000; Reverse = 0; SampleRate = 8000; OutputSampleRate = 8000; } // preset internal arrays according to primary paramaters int Preset(void) { // impose limits on the primary parameters if (Tones < 2 ) Tones = 2; else if (Tones > 256) Tones = 256; if (Bandwidth < 125) Bandwidth = 125; else if (Bandwidth > 2000) Bandwidth = 2000; // calculate the secondary parameters BitsPerSymbol = Log2(Tones); Tones = Exp2(BitsPerSymbol); // preset the input character buffer Input.Len = 1024; if (Input.Preset() <0 ) goto Error; Monitor.Len = 256; if (Monitor.Preset() < 0) goto Error; // preset the encoder Encoder.bContestia = bContestia; Encoder.BitsPerSymbol = BitsPerSymbol; if (Encoder.Preset() < 0) goto Error; SymbolsPerBlock = Encoder.SymbolsPerBlock; // preset the modulator Modulator.Default(); Modulator.BitsPerSymbol = BitsPerSymbol; Modulator.SymbolLen = (size_t)1 << (BitsPerSymbol + 7 - Log2(Bandwidth / 125)); Bandwidth = Exp2(Log2(Bandwidth / 125)) * 125; Modulator.FirstCarrier = (size_t) ((Modulator.SymbolLen / 16) * FirstCarrierMultiplier) + 1; Modulator.Reverse = Reverse; if (Modulator.Preset() < 0) goto Error; if (ReallocArray(&ModulatorOutput, Modulator.SymbolSepar) < 0) goto Error; // preset the rate converter Converter.OutputRate = OutputSampleRate / SampleRate; if (Converter.Preset() < 0) goto Error; MaxOutputLen = (size_t)ceil(Modulator.SymbolSepar * OutputSampleRate / SampleRate + 2); if (ReallocArray(&ConverterOutput, MaxOutputLen) < 0) goto Error; // reset the state logic SymbolPtr = 0; State = 0; return 0; Error: Free(); return -1; } void Reset(void) { Input.Reset(); Monitor.Reset(); SymbolPtr = 0; State = 0; Converter.Reset(); } Type BaudRate(void) { return SampleRate / Modulator.SymbolSepar; } Type BlockPeriod(void) { return (SymbolsPerBlock * Modulator.SymbolSepar) / SampleRate; } Type CharactersPerSecond(void) { return BitsPerSymbol * SampleRate / (SymbolsPerBlock * Modulator.SymbolSepar); } // start the transmission void Start(void) { State |= State_Running; } // request to stop (and complete) the transmission // but the transmitter will only stop after transmitting all the data void Stop(void) { State |= State_StopReq; } // check if the transmission is still running (not complete) int Running(void) { return State & State_Running; } // put the character into the transmitter input queue int PutChar(uint8_t Char) { return Input.Write(Char); } // get one character from the monitor buffer int GetChar(uint8_t &Char) { return Monitor.Read(Char); } size_t GetReadReady(void) { return Input.ReadReady(); } int DoPostambleYet(void) { if (State == 0) return 1; else return 0; } double GetSymbolPhase(void) { return Modulator.SymbolPhase; } // get out the transmitter output (audio) int Output(double *Buffer) { if (SymbolPtr == 0) { if ((State&State_StopReq) && Input.Empty()) { State=0; } else if (State&State_Running) { size_t Idx; for (Idx = 0; Idx < BitsPerSymbol; Idx++) { uint8_t Char; if (Input.Read(Char) <= 0) break; InputBlock[Idx] = Char; Monitor.Write(Char); } for ( ; Idx < BitsPerSymbol; Idx++) InputBlock[Idx] = 0; Encoder.EncodeBlock(InputBlock); } } if (State&State_Running) { Modulator.Send(Encoder.OutputBlock[SymbolPtr]); SymbolPtr += 1; if (SymbolPtr >= SymbolsPerBlock) SymbolPtr = 0; } int ModLen = Modulator.Output(ModulatorOutput); int ConvLen = Converter.Process(ModulatorOutput, ModLen, ConverterOutput); if (ConvLen < 0) return ConvLen; double maxval = 0, tempnum; for (int Idx = 0; Idx < ConvLen; Idx++) if ((tempnum = fabs(ConverterOutput[Idx])) > maxval) maxval = tempnum; for (int Idx = 0; Idx < ConvLen; Idx++) Buffer[Idx] = (double) ConverterOutput[Idx] / maxval; return ConvLen; } }; // ===================================================================== /* How to use the MFSK_Receiver class: 1. create an object like: #include "mfsk.h" MFSK_Receiver Receiver; 2. Set the parameters, for example: Receiver.Tones = 32; // number of tones (symbols) Receiver.Bandwidth = 1000; // bandwidth [Hz] Receiver.SyncMargin = 8; // synchronizer tune margin [tone freq. spacing] Receiver.SyncIntegLen = 4; // synchronizer integration period [FEC blocks] Receiver.SyncThreshold = 3.2; // S/N threshold for printing Receiver.SampleRate = 8000.0; // internal processor sampling rate [Hz] Receiver.InputSampleRate = 8000.0; // soundcard sampling rate [Hz] You don't need to set all the parameters, as upon creation of the Receiver object they are already given certain default values. If you changed parameters at one time and want later to go back to the default values you can call: Receiver.Default(); 3. Preset the Receiver internal arrays for the parameters you just set: if (Receiver.Preset()<0) printf("Not enough RAM or another problem\n"); Each time you change the parameters you need to call Preset() in order to resize the internal arrays. Preset() will as well destroy all data being in the process of decoding, if you need this data then call first Receiver.Flush() 4. Read back the parameters you set in point 1., they could have been adjusted by Preset() to their closest allowed values. 5. Feed the audio into the Receiver: Receiver.Process(AudioBuffer, BufferLength); AudioBuffer can be an array of int16_t (16-bit signed integers) that you fill with the data from the soundcard. I suggest you feed the receiver with batches of 512 or 1024 samples, but in can be any number of samples at a time. 6. Call GetChar(Char) to get decoded characters. Note, that characters come in batches, and so, you need to call GetChar() possibly several times. GetChar() returns 0 when the decoder FIFO is empty or 1 when not empty. In the latter case the argument contains the character read form the FIFO. The loop could be like: for ( ; ; ) { uint8_t Char; if (Receiver.GetChar(Char)==0) break; printf("%c",Char); } Keep in mind that you may see (random) control code characters here, and thus you must be able to deal with them. I suggest to process only carriage return (code=13) and Backspace (code=8). NUL (code=0) is the idle character: it is being sent when there is no text to be sent. 7. At any time you can read the signal-to-noise ratio of the incoming signal by calling Receiver.SignalToNoiseRatio() or frequency offset by calling Receiver.FrequencyOffset() 8. When the user decides to turn off the receiver and switch over to transmitt you may still call Receiver.Flush()in order to flush the data still being buffered in the decoder pipeplines. */ template class MFSK_Receiver { public: // primary parameters: set by the user bool bContestia; size_t Tones; // number of tones: 4, 8, 16, 32, 64, 128, 256 size_t Bandwidth; // bandwidth: 125, 250, 500, 1000, 2000 size_t SyncMargin; // synchronizer search margin, frequency-wide size_t SyncIntegLen; // synchronizer integration period Type SyncThreshold; // synchronizer S/N threshold Type SampleRate; // audio sampling rate (internal processing) Type InputSampleRate; // true sampling rate of the soundcard float FirstCarrierMultiplier; int Reverse; // secondary parameters: calculated by Preset() size_t BitsPerSymbol; // number of bits per symbol size_t SymbolsPerBlock; // number of symbols per one FEC code block private: RateConverter Converter; Seq InputBuffer; MFSK_InputProcessor InputProcessor; // equalizes the input spectrum // and removes coherent interferences MFSK_Demodulator Demodulator; // FFT demodulator const static size_t SlicesPerSymbol = MFSK_Demodulator::SpectraPerSymbol; // number of possible frequency offsets size_t FreqOffsets; // number of possible time-phases within the FEC block size_t BlockPhases; // reference decoder MFSK_SoftDecoder RefDecoder; // array of decoders MFSK_SoftDecoder *Decoder; // current running time-phase size_t BlockPhase; // FEC noise integrators CircularBuffer< LowPass3_Filter > SyncNoiseEnergy; // FEC signal integrators CircularBuffer< LowPass3_Filter > SyncSignal; // weight for the integrators Type SyncFilterWeight; // best signal Type SyncBestSignal; // time-phase of the best signal size_t SyncBestBlockPhase; // frequency offset of the best signal size_t SyncBestFreqOffset; // S/N corresponding to the SyncBestSignal Type SyncSNR; // pipeline for decoded FEC blocks CircularBuffer *DecodePipe; // buffer for decoded characters FIFO Output; public: MFSK_Receiver() { bContestia = false; Init(); Default(); } ~MFSK_Receiver() { Free(); } void Init(void) { Decoder = 0; DecodePipe = 0; } void Free(void) { if (Decoder) { size_t Idx; for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) Decoder[Idx].Free(); delete [] Decoder; Decoder=0; } if (DecodePipe) { size_t Idx; for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Free(); delete [] DecodePipe; DecodePipe = 0; } Converter.Free(); InputBuffer.Free(); InputProcessor.Free(); Demodulator.Free(); RefDecoder.Free(); SyncSignal.Free(); SyncNoiseEnergy.Free(); Output.Free(); } // set defaults values for all parameters void Default(void) { Tones = 32; Reverse = 0; Bandwidth = 1000; SyncMargin = 8; SyncIntegLen = 4; SyncThreshold = 3.0; SampleRate = 8000; InputSampleRate = 8000.0; } // resize internal arrays according the parameters int Preset(void) { size_t Idx; if (Tones < 2) Tones = 2; else if (Tones > 256) Tones = 256; if (Bandwidth < 125) Bandwidth = 125; else if (Bandwidth > 2000) Bandwidth = 2000; if (SyncMargin < 2) SyncMargin = 2; if (SyncIntegLen < 2) SyncIntegLen = 2; if (SyncThreshold < 3.0) SyncThreshold = 3.0; BitsPerSymbol = Log2(Tones); Tones = Exp2(BitsPerSymbol); Converter.OutputRate = SampleRate/InputSampleRate; if (Converter.Preset() < 0) goto Error; Demodulator.BitsPerSymbol = BitsPerSymbol; Demodulator.SymbolLen = Exp2(BitsPerSymbol + 7 - Log2(Bandwidth/125)); Bandwidth = Exp2(Log2(Bandwidth/125)) * 125; Demodulator.FirstCarrier = (size_t) ((Demodulator.SymbolLen/16) * FirstCarrierMultiplier) + 1; Demodulator.Reverse = Reverse; Demodulator.DecodeMargin = SyncMargin; if (Demodulator.Preset() < 0) goto Error; SyncMargin = Demodulator.DecodeMargin; InputProcessor.WindowLen = 16 * Demodulator.SymbolLen; if (InputProcessor.Preset() < 0) goto Error; RefDecoder.Default(); RefDecoder.BitsPerSymbol=BitsPerSymbol; RefDecoder.bContestia = bContestia; if (RefDecoder.Preset()<0) goto Error; SymbolsPerBlock=RefDecoder.SymbolsPerBlock; if (Decoder) { for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) Decoder[Idx].Free(); } if (DecodePipe) { for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Free(); } FreqOffsets = 2 * SyncMargin + 1; BlockPhases = SlicesPerSymbol * SymbolsPerBlock; if (ReallocArray(&Decoder, SlicesPerSymbol * FreqOffsets) < 0) goto Error; for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) { Decoder[Idx].bContestia = bContestia; Decoder[Idx].Init(); } for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) if (Decoder[Idx].Preset(RefDecoder) < 0) goto Error; if (ReallocArray(&DecodePipe,BlockPhases) < 0) goto Error; for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Init(); for (Idx = 0; Idx < BlockPhases; Idx++) { DecodePipe[Idx].Width = FreqOffsets; DecodePipe[Idx].Len = SyncIntegLen; if (DecodePipe[Idx].Preset() < 0) goto Error; DecodePipe[Idx].Clear(); } SyncSignal.Width = FreqOffsets; SyncSignal.Len = BlockPhases; if (SyncSignal.Preset() < 0) goto Error; SyncSignal.Clear(); SyncNoiseEnergy.Width = FreqOffsets; SyncNoiseEnergy.Len = BlockPhases; if (SyncNoiseEnergy.Preset() < 0) goto Error; SyncNoiseEnergy.Clear(); SyncFilterWeight = 1.0 / SyncIntegLen; BlockPhase=0; SyncBestSignal = 0; SyncBestBlockPhase = 0; SyncBestFreqOffset = 0; SyncSNR = 0; if (InputBuffer.EnsureSpace(InputProcessor.WindowLen + 2048) < 0) goto Error; Output.Len = 1024; if (Output.Preset() < 0) goto Error; return 0; Error: Free(); return -1; } void Reset(void) { size_t Idx; Converter.Reset(); InputBuffer.Clear(); InputProcessor.Reset(); for (Idx = 0; Idx < (SlicesPerSymbol * FreqOffsets); Idx++) Decoder[Idx].Reset(); for (Idx = 0; Idx < BlockPhases; Idx++) DecodePipe[Idx].Clear(); SyncSignal.Clear(); SyncNoiseEnergy.Clear(); BlockPhase = 0; SyncBestSignal = 0; SyncBestBlockPhase = 0; SyncBestFreqOffset = 0; SyncSNR = 0; Output.Reset(); } char *PrintParameters(void) { static char szParams[1000]; Type FreqBin = SampleRate/Demodulator.SymbolLen; snprintf(szParams, sizeof(szParams), "\ %d tones, %4.2f Hz/tone, %4.1f Hz bandwidth\n\ %d bits/symbol(tone), %4.2f baud\n\ FEC block: %d char. => %d x %d bits, %3.1f sec\n\ Audio band: %3.1f - %3.1f Hz, %3.1f Hz total\n\ Tuning tolerance = +/- %3.1f Hz\n\ Sync. S/N threshold = %3.1f\n", (int)Demodulator.Carriers, FreqBin*Demodulator.CarrierSepar, FreqBin*Demodulator.CarrierSepar*Demodulator.Carriers, (int)Demodulator.BitsPerSymbol, SampleRate/Demodulator.SymbolSepar, (int)RefDecoder.BitsPerSymbol, (int)RefDecoder.BitsPerSymbol, (int)RefDecoder.SymbolsPerBlock, (SymbolsPerBlock*Demodulator.SymbolSepar)/SampleRate, FreqBin * Demodulator.FirstCarrier, FreqBin * (Demodulator.FirstCarrier + Demodulator.CarrierSepar * Demodulator.Carriers), FreqBin * Demodulator.CarrierSepar * Demodulator.Carriers, FreqBin * SyncMargin, SyncThreshold ); return szParams; } Type BaudRate(void) { return SampleRate / Demodulator.SymbolSepar; } Type TuneMargin(void) { return SyncMargin * (SampleRate / Demodulator.SymbolLen); } Type BlockPeriod(void) { return (SymbolsPerBlock * Demodulator.SymbolSepar) / SampleRate; } Type CharactersPerSecond(void) { return BitsPerSymbol * SampleRate / (SymbolsPerBlock*Demodulator.SymbolSepar); } Type SignalToNoiseRatio(void) { return SyncSNR; } Type FrequencyOffset(void) { return ( (int)SyncBestFreqOffset - (int)FreqOffsets / 2) * (SampleRate / Demodulator.SymbolLen); } Type TimeOffset(void) { return ( (Type)SyncBestBlockPhase / SlicesPerSymbol) * (Demodulator.SymbolSepar / SampleRate); } // process an audio batch: first the input processor, then the demodulator template int Process(InpType *Input, size_t InputLen) { if (Converter.Process(Input, InputLen, InputBuffer) < 0) return -1; ProcessInputBuffer(); return 0; } void Flush(void) { ProcessInputBuffer(); size_t Idx; for (Idx = InputBuffer.Len; Idx < InputProcessor.WindowLen; Idx++) InputBuffer[Idx] = 0; InputBuffer.Len = InputProcessor.WindowLen; ProcessInputBuffer(); for (Idx = 0; Idx < InputProcessor.WindowLen; Idx++) InputBuffer[Idx] = 0; size_t FlushLen = Demodulator.SymbolSepar * SymbolsPerBlock * SyncIntegLen * 2; for (Idx=0; Idx= InputProcessor.WindowLen) { InputProcessor.Process(InputBuffer.Elem); InputBuffer.Delete(0, InputProcessor.WindowLen); size_t Idx; for (Idx = 0; Idx < InputProcessor.WindowLen; Idx += Demodulator.SymbolSepar ) ProcessSymbol(InputProcessor.Output+Idx); } } // process (through the demodulator) an audio batch corresponding to one symbol // demodulator always uses audio batches corresponding to one symbol period template void ProcessSymbol(InpType *Input) { Demodulator.Process(Input); MFSK_SoftDecoder *DecoderPtr = Decoder; size_t Offset,Slice; for (Slice = 0; Slice < SlicesPerSymbol; Slice++) { LowPass3_Filter *NoiseEnergyPtr = SyncNoiseEnergy.AbsPtr(BlockPhase); LowPass3_Filter *SignalPtr = SyncSignal.AbsPtr(BlockPhase); uint64_t *DecodeBlockPtr = DecodePipe[BlockPhase].CurrPtr(); size_t BestSliceOffset = 0; Type BestSliceSignal = 0; Type NoiseEnergy = 0; Type Signal; Type Symbol[8]; for (Offset = 0; Offset < FreqOffsets; Offset++) { Demodulator.SoftDecode(Symbol, Slice, (int)Offset - (FreqOffsets / 2)); DecoderPtr->Input(Symbol); DecoderPtr->Process(); DecoderPtr->Output(DecodeBlockPtr); NoiseEnergy = DecoderPtr->NoiseEnergy; NoiseEnergyPtr->Process(NoiseEnergy, SyncFilterWeight); Signal = DecoderPtr->Signal; SignalPtr->Process(Signal, SyncFilterWeight); Signal = SignalPtr->Output; if (Signal > BestSliceSignal) { BestSliceSignal = Signal; BestSliceOffset = Offset; } DecoderPtr++; DecodeBlockPtr++; NoiseEnergyPtr++; SignalPtr++; } DecodePipe[BlockPhase] += 1; if (BlockPhase == SyncBestBlockPhase) { SyncBestSignal = BestSliceSignal; SyncBestFreqOffset = BestSliceOffset; } else { if (BestSliceSignal > SyncBestSignal) { SyncBestSignal = BestSliceSignal; SyncBestBlockPhase = BlockPhase; SyncBestFreqOffset = BestSliceOffset; } } int Dist = (int)BlockPhase - (int)SyncBestBlockPhase; if (Dist < 0) Dist += BlockPhases; if (Dist == (int)(BlockPhases / 2)) { Type BestNoise = sqrt( NoiseEnergyPtr->Output); if (BestNoise == 0) SyncSNR = 0; else SyncSNR = SyncBestSignal / BestNoise; // printf( // "%d, %6.3f/%6.3f = %5.2f\n", // SyncBestFreqOffset, // SyncBestSignal, // BestNoise, // SyncSNR ); if (SyncSNR >= SyncThreshold) { uint64_t *BestBlockPtr = DecodePipe[SyncBestBlockPhase].CurrPtr(); uint64_t Block = BestBlockPtr[SyncBestFreqOffset]; for ( size_t Byte = 0; Byte < BitsPerSymbol; Byte++) { uint8_t Char = Block&0xFF; Output.Write(Char); Block >>= 8; } } if (SyncSNR > 100) SyncSNR = 0.0; } BlockPhase++; } if (BlockPhase >= BlockPhases) BlockPhase -= BlockPhases; } }; #endif fldigi-4.2.05/src/include/jalocha/pj_lowpass3.h0000664000175000017500000000226514611711171016220 00000000000000// (c) 1999-2003, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __LOWPASS3_H__ #define __LOWPASS3_H__ // ========================================================================== // IIR low pass filter for integration (averaging) purposes // Overshoot is about 1% for Feedback=0.5, and about 1e-6 for Feedback=0.1 // Weight is 1 / PeakingTime template class LowPass3_Filter { public: Type Out1, Out2, Output; template void Process(InpType Inp, WeightType Weight, WeightType Feedback = 0.1) { Weight *= 2.0; Type DiffI1 = Inp; DiffI1 -= Out1; Type Diff12 = Out1; Diff12 -= Out2; Type Diff23 = Out2; Diff23 -= Output; DiffI1 *= Weight; Out1 += DiffI1; Diff12 *= Weight; Out2 += Diff12; Diff23 *= Weight; Output += Diff23; Diff23 *= Feedback; Out2 += Diff23; } template void operator = (LevelType Level) { Out1 = Level; Out2 = Level; Output=Level; } template void Set(LevelType Level = 0) { Out1 = Level; Out2 = Level; Output=Level; } }; // ========================================================================== #endif // of __LOWPASS3_H__ fldigi-4.2.05/src/include/jalocha/pj_fht.h0000664000175000017500000000232214611711171015220 00000000000000// Fast Hadamard Transform, Pawel Jalocha, December 2004 // (c) 1999-2003, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __FHT_H__ #define __FHT_H__ // Forward Fast Hadamard Transform template // Type can be float, Cmpx<>, int8_t, etc. void FHT(Type *Data, size_t Len) { size_t Step, Ptr, Ptr2; Type Bit1, Bit2, NewBit1, NewBit2; for (Step = 1; Step < Len; Step *= 2) { for (Ptr = 0; Ptr < Len; Ptr += 2 * Step) { for (Ptr2 = Ptr; (Ptr2 - Ptr) < Step; Ptr2 += 1) { Bit1 = Data[Ptr2]; Bit2 = Data[Ptr2 + Step]; NewBit1 = Bit2; NewBit1 += Bit1; NewBit2 = Bit2; NewBit2 -= Bit1; Data[Ptr2] = NewBit1; Data[Ptr2 + Step] = NewBit2; } } } } // Inverse Fast Hadamard Transform template void IFHT(Type *Data, size_t Len) { size_t Step, Ptr, Ptr2; Type Bit1, Bit2, NewBit1, NewBit2; for (Step = Len/2; Step; Step /= 2) { for (Ptr = 0; Ptr < Len; Ptr += 2 * Step) { for (Ptr2 = Ptr; (Ptr2 - Ptr) < Step; Ptr2 += 1) { Bit1 = Data[Ptr2]; Bit2 = Data[Ptr2 + Step]; NewBit1 = Bit1; NewBit1 -= Bit2; NewBit2 = Bit1; NewBit2 += Bit2; Data[Ptr2] = NewBit1; Data[Ptr2 + Step] = NewBit2; } } } } #endif // of __FHT_H__ fldigi-4.2.05/src/include/jalocha/pj_gray.h0000664000175000017500000000125514611711171015405 00000000000000// Gray code convertion // (c) 2004, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __GRAY_H__ #define __GRAY_H__ #include template Type GrayCode(Type Binary) { return Binary ^ (Binary >> 1); } inline uint8_t BinaryCode(uint8_t Gray) { Gray ^= (Gray >> 4); Gray ^= (Gray >> 2); Gray ^= (Gray >> 1); return Gray; } inline uint16_t BinaryCode(uint16_t Gray) { Gray ^= (Gray >> 8); Gray ^= (Gray >> 4); Gray ^= (Gray >> 2); Gray ^= (Gray >> 1); return Gray; } inline uint32_t BinaryCode(uint32_t Gray) { Gray ^= (Gray >> 16); Gray ^= (Gray >> 8); Gray ^= (Gray >> 4); Gray ^= (Gray >> 2); Gray ^= (Gray >> 1); return Gray; } #endif fldigi-4.2.05/src/include/jalocha/pj_struc.h0000664000175000017500000002504314611711171015604 00000000000000// data structures, includes dynamically allocated vectors and arrays // (c) 1999-2003, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __STRUC_H__ #define __STRUC_H__ #include #include #include // ======================================================================== // array re(sizing), copy, move, preset, etc. template inline int ReallocArray(type **Array, size_t Size) { delete [] *Array; *Array = new type[Size]; return (*Array == 0); } template inline int AllocArray(type **Array, size_t Size) { (*Array)= new type[Size]; return (*Array)== 0 ; } template inline void ClearArray(type *Array, size_t Size) { memset(Array,0,Size*sizeof(type)); } template void PresetArray(type *Array, size_t Size, const type &Val) { size_t i; for (i = 0; i < Size; i++) Array[i] = Val; } template inline void CopyArray(type *Dst, type *Src, size_t Size) { memcpy(Dst, Src, Size * sizeof(type)); } template inline void MoveArray(type *Dst, type *Src, size_t Size) { memmove(Dst ,Src, Size * sizeof(type)); } template void PrintArray(type *Array, size_t Size, char *ValueFormat, char *IndexFormat=(char *)"%3d", size_t Columns=10) { size_t Idx,Col; for (Col = 0, Idx = 0; Idx < Size; Idx++) { if (Col == 0) { printf(IndexFormat,Idx); printf(":"); } printf(" "); printf(ValueFormat, Array[Idx]); Col++; if (Col >= Columns) { printf("\n"); Col=0; } } if (Col > 0) printf("\n"); } // ======================================================================== // a sequence of any (fixed size) items template class Seq { public: Seq(); ~Seq(); // default constructor/destructor Seq(Seq &SrcSeq); // copy constructor void Init(); // user callable "constructor" int EnsureSpace(size_t ReqSpace); // make sure that there is enough space int EnsureSpace(void) { return EnsureSpace(Len); } int SetLen(size_t NewLen) { Len=NewLen; return EnsureSpace(Len); } int ReallocLen(size_t NewLen); int EnsureSpaceSafe(size_t ReqSpace); void Free(void); // free all allocated space, remove all data void Clear(void) { Len=0; } // clear the sequence (set length to zero) size_t Index(type *Item) { return (size_t)(Item-Elem); } type &operator[] (int idx) { return (Elem[idx]); } // [index] operator Seq const &operator=(Seq const &SrcSeq); // assignment operator type *First(void) { return Elem; } type *Last(void) { return Elem+(Len-1); } type *Append(size_t Num=1); // add one or more elements at the seq. end, returns the pointer to the new element(s) type *Insert(size_t Pos=0, size_t Num=1); // insert Num elements at Pos void Delete(size_t Pos=0, size_t Num=1); // delete Num elements at Pos void Shift(int Pos, const type &Fill); // shift left or right with filling int Truncate(size_t Margin=0); // remove unused but allocated space int Copy(type *Data, size_t DataLen); int Copy(Seq &Src, size_t StartPos=0) // copy the contains of another sequence { return Copy(Src.Elem + StartPos, Src.Len - StartPos); } int Copy(Seq &Seq, size_t StartPos, size_t MaxLen); void Move(Seq &Seq); // move the contains of another sequence, clear the other sequence int Join(const type &Data); int Join(type *Data, size_t DataLen); // join (append) given data int Join(Seq &Seq) { return Join(Seq.Elem,Seq.Len); } // join a copy of the other sequence int NullTerm(void); // null-terminate (for character strings) void Reverse(void); // reverse the sequence order void FillWith(const type &Data, size_t StartPos=0); // fill with given value void Print(char *Format, size_t Columns=10); int SaveToFile(FILE *File); int LoadFromFile(FILE *File); public: size_t Space; // that many elements are allocated in *Elem size_t Len; // that many elements are used up type *Elem; // the storage space, contains Len elements } ; template Seq::Seq() { Elem=0; Len=Space=0; } template void Seq::Init() { Elem=0; Len=Space=0; } template Seq::~Seq() { delete [] (Elem); } template Seq::Seq(Seq &SrcSeq) { if (EnsureSpace(SrcSeq.Len) == 0) { Len = SrcSeq.Len; memcpy(Elem, SrcSeq.Elem, Len * sizeof(type)); } } template void Seq::Free(void) { delete [] Elem; Elem = 0; Space = Len = 0; } template int Seq::EnsureSpace(size_t ReqSpace) { if (ReqSpace <= Space) return 0; delete [] Elem; Elem = new type[ReqSpace * sizeof(type)]; if (Elem == 0) { Space = Len = 0; return -1; } Space = ReqSpace; return 0; } template Seq const &Seq::operator=(Seq const &SrcSeq) { if ((this != &SrcSeq) && (EnsureSpace(SrcSeq.Len) == 0)) { Len = SrcSeq.Len; memcpy(Elem, SrcSeq.Elem, Len* sizeof(type)); } return (*this); } template int Seq::ReallocLen(size_t NewLen) { delete [] Elem; Elem = new type[NewLen * sizeof(type)]; if (Elem == 0) { Space = Len = 0; return -1; } Space = Len = NewLen; return 0; } template int Seq::Truncate(size_t Margin) { if (Space == (Len + Margin)) return 0; delete [] Elem; Elem = new type[(Len + Margin) * sizeof(type)]; if (Elem == 0) { Space = Len = 0; return -1; } Space = Len+Margin; return 0; } template void Seq::Move(Seq &Seq) { delete [] Elem; Len = Seq.Len; Space = Seq.Space; Elem = Seq.Elem; Seq.Elem = 0; Seq.Len = Seq.Space = 0; } template int Seq::Copy(type *Data, size_t DataLen) { if (EnsureSpace(DataLen)) return -1; memcpy(Elem, Data, DataLen * sizeof(type)); Len = DataLen; return 0; } template int Seq::Copy(Seq &Src, size_t StartPos, size_t MaxLen) { int DataLen; DataLen = Src.Len - StartPos; if (DataLen > MaxLen) DataLen = MaxLen; if (EnsureSpace(DataLen)) return -1; memcpy(Elem, Src.Elem + StartPos, DataLen * sizeof(type)); Len = DataLen; return 0; } template int Seq::Join(const type &Data) { if (EnsureSpace(Len + 1)) return -1; Elem[Len++] = Data; return 0; } template int Seq::Join(type *Data, size_t DataLen) { if (EnsureSpace(Len + DataLen)) return -1; memcpy(Elem + Len, Data, DataLen * sizeof(type)); Len += DataLen; return 0; } template type *Seq::Insert(size_t Pos, size_t Num) { if (EnsureSpace(Len + Num)) return 0; if ((Len - Pos) > 0) memmove(Elem + Pos + Num, Elem + Pos, (Len - Pos) * sizeof(type)); Len += Num; return Elem + Pos; } template void Seq::Delete(size_t Pos, size_t Num) { if ((Len - Pos - Num) > 0) memmove(Elem + Pos, Elem + Pos + Num, (Len - Pos - Num) * sizeof(type)); Len -= Num; } template type *Seq::Append(size_t Num) { if (EnsureSpace(Len + Num)) return 0; Len += Num; return Elem + (Len - Num); } template void Seq::Reverse(void) { size_t i, j; type T; for (i = 0,j = Len - 1; i < j; i++, j--) { T = Elem[i]; Elem[i] = Elem[j]; Elem[j] = T; } } template void Seq::FillWith(const type &Data, size_t StartPos) { size_t i; for (i = StartPos; i < Len; i++) Elem[i] = Data; } template void Seq::Shift(int Pos, const type &Fill) { size_t i; if (Pos > 0) { // shift toward higher positions - data inserted at the start of the sequence if (Pos < Len) memmove(Elem+Pos,Elem,(Len-Pos)*sizeof(type)); else Pos = Len; for (i = 0; i < Pos; i++) Elem[i] = Fill; } else if (Pos < 0) { // shift toward lower positions - data inserted at the end Pos = (-Pos); if (Pos < Len) memmove(Elem,Elem+Pos,(Len-Pos)*sizeof(type)); else Pos = Len; for (i = Len - Pos; i < Len; i++) Elem[i]=Fill; } } template void Seq::Print(char *Format, size_t Columns) { size_t i,Col; for (Col = 0, i = 0; i < Len; i++) { if (Col == 0) { printf("%3d:",i); } printf(" "); printf(Format,Elem[i]); Col++; if (Col >= Columns) { printf("\n"); Col=0; } } if (Col > 0) printf("\n"); } // ======================================================================== // A buffer structure for processing a continues series of samples. // It is a linear array: // - data between "Read" and "Write" is ready to be readout // - data between "Write" and "Size" is still beeing written or processed // - data before "Read" has been read-out and is thus obsolete // As more data comes the samples must be shifted and the obsolete data removed: // this is done by: RemovePastData() template class SampleBuffer { public: SampleBuffer() { Sample = 0; AllocSize = Size = Read = Write = 0; } ~SampleBuffer() { delete [] Sample; } void Free(void) { delete [] Sample; Sample = 0; AllocSize = Size = Read = Write = 0; } int EnsureSize(size_t MaxSize) { // printf(" SampleBuffer::EnsureSize(%d)\n",MaxSize); if (MaxSize <= AllocSize) return 0; delete [] Sample; Sample = new Type[MaxSize * sizeof(Type)]; if (Sample == 0) { AllocSize = Size = 0; return -1; } AllocSize = MaxSize; return 0; } int EnsureWriteLen(size_t MaxWriteLen) // ensure enough space for writing new data { return EnsureSize(Write+MaxWriteLen); } void SetEmpty(void) // remove all data, make buffer empty { Read = Write = Size = 0; } void RemovePastData(void) // remove data before the read pointer { memcpy(Sample, Sample + Read, (Size - Read) * sizeof(Type)); Write -= Read; Size -= Read; Read = 0; } Type &operator[] (size_t Idx) // access data given by index { return Sample[Idx]; } size_t ReadLen(void) // length of data to be read { return Write - Read; } Type *ReadPtr(void) // get pointer to read data { return Sample + Read; } size_t WriteLen(void) // length of data that can be written { return Size - Write; } Type *WritePtr(void) // get pointer to write data { return Sample + Write; } void Print(char *Title=0) { printf("%s Sample=%08X, Read=%d, Write=%d, Size=%d, AllocSize=%d\n", Title ? Title:"SampleBuffer:", (int)Sample, Read, Write, Size, AllocSize); } public: Type *Sample; // allocated storage pointer size_t Read; // index to data that is ready to be read size_t Write; // index to data that is still to be written size_t Size; // current size of data (includes data before the read pointer) size_t AllocSize; // allocated size for data } ; // ======================================================================== #endif // __STRUC_H__ fldigi-4.2.05/src/include/jalocha/pj_cmpx.h0000664000175000017500000001304114611711171015406 00000000000000 // Complex numbers // (c) 1999-2003, Pawel Jalocha // (c) 2019, David Freese, W1HKJ #ifndef __CMPX_H__ #define __CMPX_H__ #include #include // ---------------------------------------------------------------------------- // float/double/other-complex type template class Cmpx { public: Type Re,Im; public: template Cmpx const &operator=(const Cmpx &New) { Re = New.Re; Im = New.Im; return (*this); } template Cmpx const &operator=(const Type2 &New) { Re = New; Im = 0; return (*this); } template void Set(Type2 NewRe, Type2 NewIm = 0) { Re = NewRe; Im = NewIm; } template void Set(Cmpx New) { Re = New.Re; Im = New.Im; } void SetPhase(double Phase, double Mag = 1.0) { Re = Mag * cos(Phase); Im = Mag * sin(Phase); } void Conugate(void) { Im = (-Im); } void Negate(void) { Re = (-Re); Im = (-Im); } void QuarterTurnLeft(void) { Type OldIm = Im; Im = Re; Re = (-OldIm); } void QuarterTurnRight(void) { Type OldIm = Im; Im = (-Re); Re = OldIm; } double Energy(void) { return Re * Re + Im * Im; } double Mag2(void) { return Re * Re + Im * Im; } double Mag(void) { return sqrt(Re * Re + Im * Im); } double Phase(void) { return atan2(Im, Re); } int Zero(void) { return (Re == 0) && (Im == 0); } int NotZero(void) { return (Re != 0) || (Im != 0); } // template // void operator *= (const Type2 Mult) // { Re*=Mult; Im*=Mult; } // template // void operator /= (const Type2 Mult) // { Re*=Mult; Im*=Mult; } template double VectDotProd(Cmpx X) { return Re * X.Re + Im * X.Im; } void Print(char *Form = (char *)"%+6.3f") { printf("["); printf(Form, Re); printf(","); printf(Form, Im); printf("]"); } } ; typedef Cmpx fcmpx; typedef Cmpx dcmpx; // Some complex operators: // at least with the BC++ they carry some overhead because // a function is always called instead of making the code inline. template // equal (both Re and Im) ? inline int operator ==(Cmpx &Left, Cmpx &Right) { return (Left.Re == Right.Re) && (Left.Im == Right.Im); } template // equal (both Re and Im) ? inline int operator !=(Cmpx &Left, Cmpx &Right) { return (Left.Re != Right.Re) || (Left.Im != Right.Im); } template // equal ? inline int operator ==(Cmpx &Left, type &Right) { return (Left.Re == Right) && (Left.Im == 0); } template // not equal ? inline int operator !=(Cmpx &Left, RightType &Right) { return (Left.Re != Right) || (Left.Im != 0); } template // bigger (magnitude) ? inline int operator >(Cmpx &Left, Cmpx &Right) { return Left.Mag2() > Right.Mag2(); } template // smaller (magnitude) ? inline int operator <(Cmpx &Left, Cmpx &Right) { return Left.Mag2() < Right.Mag2(); } template // addition to the argument on the left inline void operator +=(Cmpx &Dst, Cmpx &Src) { Dst.Re += Src.Re; Dst.Im += Src.Im; } template // subtraction from the argument on the left inline void operator -=(Cmpx &Dst, Cmpx &Src) { Dst.Re -= Src.Re; Dst.Im -= Src.Im; } template // multiplication by a scalar inline void operator *=(Cmpx &Dst, num Src) { Dst.Re *= Src; Dst.Im *= Src; } template // multiplication by another complex number inline void operator *=(Cmpx &Dst, Cmpx Src) { type Re = Dst.Re * Src.Re - Dst.Im * Src.Im; type Im = Dst.Re * Src.Im + Dst.Im * Src.Re; Dst.Re = Re; Dst.Im = Im; } template // division by a scalar inline void operator /=(Cmpx &Dst, num Src) { Dst.Re /= Src; Dst.Im /= Src; } template // scalar multiplication inline double operator *(Cmpx &Left, Cmpx &Right) { return Left.Re * Right.Re + Left.Im * Right.Im; } // some arithmetic functions: // scalar product of two vectors template inline double ScalProd(Cmpx &A, Cmpx &B) { return A.Re * B.Re + A.Im * B.Im; } template inline double ScalProd(typeA Ia, typeA Qa, Cmpx &B) { return Ia * B.Re + Qa*B.Im; } // complex multiply template inline void CmpxMultAxB(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.Re = A.Re * B.Re - A.Im * B.Im; Dst.Im = A.Re * B.Im + A.Im * B.Re; } template inline void CmpxMultAxB(typeDst &DstI, typeDst &DstQ, Cmpx &A, Cmpx &B) { DstI = A.Re * B.Re - A.Im * B.Im; DstQ = A.Re * B.Im + A.Im * B.Re; } // complex multiply, second argument with a "star" (B.im is negated) // (effectively subtracts the phase of the second argument) template inline void CmpxMultAxBs(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.Re = A.Re * B.Re + A.Im * B.Im; Dst.Im = A.Im * B.Re - A.Re * B.Im; } template void CmpxSqrt(Cmpx &X) { Type Mag = X.Mag(); int NegIm = (X.Im < 0); X.Im = sqrt((Mag - X.Re) / 2); X.Re = sqrt((Mag + X.Re) / 2); if (NegIm) X.Re = (-X.Re); } template void CmpxSquare(Cmpx &X) { Type Re = X.Re * X.Re - X.Im * X.Im; X.Im = 2 * X.Re * X.Im; X.Re = Re; } // ---------------------------------------------------------------------------- #endif /* __CMPX_H__ */ fldigi-4.2.05/src/include/jalocha/pj_fft.h0000664000175000017500000002326214611711171015224 00000000000000// Fast Fourier Transform // (c) 1999-2004, Pawel Jalocha #ifndef __FFT_H__ #define __FFT_H__ #include #include "pj_cmpx.h" #include "pj_struc.h" // ---------------------------------------------------------------------------- /* How to use the r2FFT class: 1. define the object: r2FFT FFT; 2. preset it for given FFT length: ret=FFT.Preset(1024); if return code is negative => your RAM is out, you can't use the FFT object. - after FFT.Preset() you have the unscrambling table in FFT.BitRevIdx[] and the full (co)sine table in FFT.Twiddle[] 3. for forward complex FFT of "Data": FFT.Process(Data); (this includes unscrambling) 4. for inverse complex FFT of "Data": - first: negate the imaginary part of "Data" - second: execute FFT.Process(Data); - third: negate (again) the imaginary part of "Data" New feature: you can call FFT.Process(Data,Len); 5. You may call FFT.Free() to free allocated RAM, but you will need to call FFT.Preset() before using the FFT object again. 6. Scaling: each pass of the FFT.Process(Data) multiplies the energy of the sequence contained in "Data" by the length of the FFT. To get the same scale (amplitude) after executing one forward and another inverse FFT you need to multiply the sequence by 1/length. 7. To make an FFT of two _real_ time sequences in one go: - place the first time sequence in the real part of complex "Data" - place the second time sequence in the imaginary part of "Data" - execute: FFT.Process(Data); - execute: FFT.SeparTwoReals(Data,Spectr1,Spectr2); where Spectr1/2 are complex arrays half the size of the FFT length. Spectr1/2 contains now the complex FFT result for the first and second real input sequence - Scaling: the sequence energy is multiplied by FFT length 8. To execute an Inverse FFT as to get two real sequences out of two spectral data: - have the two freq. sequeces in Spectr1/2 - execute: FFT.JoinTwoReals(Spectr1,Spect2,Data); - execute: FFT.Process(Data); - Data[].Re contains the first time sequence - Data[].Im contains the second time sequence - Spectr1/2 and Data arrays are like for SeparTwoReals() - Scaling: the sequence energy is multiplied by _twice_ the FFT length */ template class r2FFT { public: // size must a power of 2: 2,4,8,16,32,64,128,256,... r2FFT(int MaxSize) { BitRevIdx = 0; Twiddle = 0; Preset(MaxSize); } r2FFT() { BitRevIdx = 0; Twiddle = 0; } ~r2FFT() { delete [] BitRevIdx; //free(BitRevIdx); delete [] Twiddle; //free(Twiddle); } void Free(void) { delete [] BitRevIdx; //free(BitRevIdx); delete [] Twiddle; //free(Twiddle); BitRevIdx = 0; Twiddle = 0; } // preset tables for given (maximum) processing size int Preset(int MaxSize) { size_t idx, ridx, mask, rmask; double phase; size_t Size4; if (MaxSize < 4) goto Error; Size = MaxSize; while ((MaxSize & 1) == 0) MaxSize >>= 1; if (MaxSize != 1) goto Error; if (ReallocArray(&BitRevIdx, Size) < 0) goto Error; if (ReallocArray(&Twiddle,Size) < 0) goto Error; Size4 = Size/4; for (idx = 0; idx < Size4; idx++) { phase = (2 * M_PI * idx)/Size; Twiddle[idx].SetPhase(phase); } for ( ; idx < Size; idx++) { Twiddle[idx].Re = (-Twiddle[idx - Size4].Im); Twiddle[idx].Im = Twiddle[idx - Size4].Re; } for (ridx = 0, idx=0; idx < Size; idx++) { for (ridx = 0, mask = Size/2, rmask = 1; mask; mask >>= 1, rmask <<= 1) { if (idx & mask) ridx |= rmask; } BitRevIdx[idx] = ridx; /* printf("%04x %04x\n",idx,ridx); */ } return 0; Error: Free(); return -1; } // scramble/unscramble (I)FFT input template void Scramble(DataType x[]) { size_t idx, ridx; DataType tmp; for (idx = 0; idx < Size; idx++) { if ((ridx = BitRevIdx[idx]) > idx) { tmp = x[idx]; x[idx] = x[ridx]; x[ridx] = tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } } template void Scramble(DataType x[], size_t ShrinkShift) { size_t idx,ridx; DataType tmp; size_t Len = Size >> ShrinkShift; for (idx = 0; idx < Len; idx++) { ridx = BitRevIdx[idx]; ridx >>= ShrinkShift; if (ridx > idx) { tmp = x[idx]; x[idx] = x[ridx]; x[ridx] = tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } } // separate the result of a two real channels FFT template void SeparTwoReals(BuffType Buff[], DataType Out0[], DataType Out1[]) { int idx, HalfSize = Size/2; // for(idx=0; idx void JoinTwoReals(DataType Inp0[], DataType Inp1[], BuffType Buff[]) { int idx, HalfSize = Size/2; // for(idx=0; idx void CoreProc(BuffType x[]) { size_t Groups, GroupSize2, Group, Bf, TwidIdx; size_t Size2 = Size/2; for (Bf = 0; Bf < Size; Bf += 2) FFT2(x[Bf], x[Bf + 1]); // first pass // for(Bf=0; Bf>=1, GroupSize2<<=1) for (Groups = Size2/2, GroupSize2 = 2; Groups; Groups >>= 1, GroupSize2 <<= 1) { for (Group = 0, Bf = 0; Group < Groups; Group++, Bf += GroupSize2) { for (TwidIdx = 0; TwidIdx < Size2; TwidIdx += Groups, Bf++) { FFTbf(x[Bf], x[Bf + GroupSize2], Twiddle[TwidIdx]); } } } } // radix-2 FFT with a "shrink" factor template void CoreProc(BuffType x[], size_t ShrinkShift) { size_t Groups, GroupSize2, Group, Bf, TwidIdx, TwidIncr; size_t Len = Size >> ShrinkShift; size_t Size2 = Size/2; size_t Len2 = Len/2; for (Bf = 0; Bf < Len; Bf += 2) FFT2(x[Bf], x[Bf + 1]); // first pass // for(Bf=0; Bf>= 1, TwidIncr >>= 1, GroupSize2 <<= 1) { for (Group = 0, Bf = 0; Group < Groups; Group++, Bf += GroupSize2) { for (TwidIdx = 0; TwidIdx < Size2; TwidIdx += TwidIncr, Bf++) { FFTbf(x[Bf], x[Bf + GroupSize2], Twiddle[TwidIdx]); } } } } // complex FFT process in place, includes unscrambling template int Process(BuffType x[]) { Scramble(x); CoreProc(x); return 0; } // find the "shrink" factor for processing batches smaller than declared by Preset() int FindShrinkShift(size_t Len) { size_t Shift; for(Shift=0; Len int Process(BuffType x[], size_t Len) { if(Len<4) return -1; if(Len==Size) { Scramble(x); CoreProc(x); return 0; } int ShrinkShift=FindShrinkShift(Len); if(ShrinkShift<0) return -1; Scramble(x,ShrinkShift); CoreProc(x,ShrinkShift); return 0; } public: size_t Size; // FFT size (needs to be power of 2) size_t *BitRevIdx; // Bit-reverse indexing table for data (un)scrambling Type *Twiddle; // Twiddle factors (sine/cos values) private: // classic radix-2 butterflies template inline void FFTbf(BuffType &x0, BuffType &x1, Type &W) { Type x1W; x1W.Re = x1.Re*W.Re + x1.Im*W.Im; // x1W.Re=x1.Re*W.Re-x1.Im*W.Im; x1W.Im = (-x1.Re*W.Im) + x1.Im*W.Re; // x1W.Im=x1.Re*W.Im+x1.Im*W.Re; x1.Re = x0.Re - x1W.Re; x1.Im = x0.Im - x1W.Im; x0.Re = x0.Re + x1W.Re; x0.Im = x0.Im + x1W.Im; } // special 2-point FFT for the first pass template inline void FFT2(BuffType &x0, BuffType &x1) { Type x1W; x1W.Re = x1.Re; x1W.Im = x1.Im; x1.Re = x0.Re - x1.Re; x1.Im = x0.Im - x1.Im; x0.Re += x1W.Re; x0.Im += x1W.Im; } // special 4-point FFT for the second pass template inline void FFT4(BuffType &x0, BuffType &x1, BuffType &x2, BuffType &x3) { Type x1W; x1W.Re = x2.Re; x1W.Im = x2.Im; x2.Re = x0.Re - x1W.Re; x2.Im = x0.Im - x1W.Im; x0.Re = x0.Re + x1W.Re; x0.Im = x0.Im + x1W.Im; x1W.Re = x3.Im; x1W.Im = (-x3.Re); x3.Re = x1.Re - x1W.Re; x3.Im = x1.Im - x1W.Im; x1.Re = x1.Re + x1W.Re; x1.Im = x1.Im + x1W.Im; } }; #endif // __FFT_H__ fldigi-4.2.05/src/include/jalocha/pj_fifo.h0000664000175000017500000000354614611711171015373 00000000000000// (c) 2019, David Freese, W1HKJ #ifndef __FIFO_H__ #define __FIFO_H__ #include "pj_struc.h" // a simple FIFO buffer template class FIFO { public: size_t Len; private: size_t ReadPtr; size_t WritePtr; Type *Data; public: FIFO() { Init(); } ~FIFO() { delete [] Data; } void Init(void) { Data = 0; Len = 0; } void Free(void) { delete [] Data; Data = 0; Len = 0; } void Reset(void) { ReadPtr = WritePtr = 0; } void Clear(void) { ReadPtr = WritePtr; } int Preset(void) { if (ReallocArray(&Data, Len) < 0) return -1; Reset(); return 0; } // increment the pointer (with wrapping around) void IncrPtr(size_t &Ptr, size_t Step = 1) { Ptr += Step; if (Ptr >= Len) Ptr-=Len; } // FIFO is full ? int Full(void) { size_t Ptr = WritePtr; IncrPtr(Ptr); return (Ptr == ReadPtr); } // FIFO is empty ? int Empty(void) { return (ReadPtr == WritePtr); } // how many elements we can write = space left in the FIFO size_t WriteReady(void) { int Ready = ReadPtr - WritePtr; if (Ready <= 0) Ready += Len; return Ready - 1; } // how many elements we can read = space taken in the FIFO size_t ReadReady(void) { int Ready = WritePtr - ReadPtr; if (Ready < 0) Ready += Len; return Ready; } // write a new element int Write(Type &NewData) { size_t Ptr = WritePtr; IncrPtr(Ptr); if (Ptr == ReadPtr) return 0; Data[WritePtr] = NewData; WritePtr = Ptr; return 1; } // read the oldest element int Read(Type &OldData) { if (ReadPtr == WritePtr) return 0; OldData = Data[ReadPtr]; IncrPtr(ReadPtr); return 1; } // lookup data in the FIFO but without taking them out int Lookup(Type &OldData, size_t Offset = 0) { size_t Ready = ReadReady(); if (Offset >= Ready) return 0; size_t Ptr = ReadPtr; IncrPtr(Ptr,Offset); OldData = Data[Ptr]; return 1; } }; #endif // of __FIFO_H__ fldigi-4.2.05/src/include/test_signal.h0000664000175000017500000000234214611711171014663 00000000000000// ---------------------------------------------------------------------------- // test_signal.h // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef TEST_SIGNAL_H #define TEST_SIGNAL_H #include #include #include #include #include #include #include #include #ifdef __MINGW32__ # include #endif #include "testsigs.h" extern Fl_Double_Window* test_signal_window; extern void show_testdialog(void); #endif fldigi-4.2.05/src/include/viewpsk.h0000664000175000017500000000610514611711171014040 00000000000000// ---------------------------------------------------------------------------- // viewpsk.h -- psk modem // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _VIEWPSK_H #define _VIEWPSK_H #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "pskeval.h" #include "viterbi.h" #include "mfskvaricode.h" #include "interleave.h" //===================================================================== #define VPSKSAMPLERATE (8000) #define VAFCDECAY 8 #define MAXCHANNELS 30 #define VSEARCHWIDTH 70 #define VSIGSEARCH 5 #define VWAITCOUNT 4 #define NULLFREQ 1e6 //===================================================================== struct CHANNEL { double phaseacc; cmplx prevsymbol; cmplx quality; unsigned int shreg; unsigned int shreg2; double metric; double frequency; double freqerr; double phase; double syncbuf[16]; double averageamp; C_FIR_filter *fir1; C_FIR_filter *fir2; viterbi *dec; viterbi *dec2; unsigned int bitshreg; int rxbitstate; unsigned char symbolpair[2]; int fecmet; int fecmet2; interleave *Rxinlv; interleave *Rxinlv2; int bits; double bitclk; unsigned int dcdshreg; unsigned int dcdshreg2; int dcd; int waitcount; int timeout; bool reset; int acquire; }; class viewpsk { private: trx_mode viewmode; int symbollen; int symbits; double bandwidth; int dcdbits; int fa; int fb; int ftest; double test_peak_amp; time_t now; bool reset_all; bool tracked; bool browser_changed; CHANNEL channel[MAXCHANNELS]; int nchannels; int lowfreq; bool _pskr; bool _qpsk; pskeval* evalpsk; void rx_symbol(int ch, cmplx symbol); void rx_bit(int ch, int bit); void findsignal(int); void afc(int); void rx_bit2(int ch, int bit); void rx_pskr(int ch, unsigned char symbol); void rx_qpsk(int ch, int bits); bool is_valid_char(int &c); inline void timeout_check(); inline void insert(); public: viewpsk(pskeval* eval, trx_mode mode); ~viewpsk(); void init(); void restart(trx_mode mode); void rx_init() {}; void tx_init() {}; void restart() {}; int rx_process(const double *buf, int len); int get_freq(int n); void set_freq(int n, double f) { channel[n].frequency = f; } void findsignals(); void clearch(int n); void clear(); }; extern viewpsk *pskviewer; #endif fldigi-4.2.05/src/include/n3fjp_logger.h0000664000175000017500000000114514611711171014726 00000000000000#ifndef N3FJP_LOGGER_H #define N3FJP_LOGGER_H #include #include "qso_db.h" extern std::string n3fjp_serno; extern void get_n3fjp_udp(); extern void *n3fjp_loop(void *args); extern void n3fjp_init(void); extern void n3fjp_start(); extern void n3fjp_restart(); extern void n3fjp_close(void); extern int n3fjp_dupcheck(); extern void n3fjp_add_record(cQsoRec &rec); extern void n3fjp_get_record(std::string rec); extern void n3fjp_set_freq(long f); extern void n3fjp_set_ptt(int on); extern void n3fjp_clear_record(); extern bool n3fjp_connected; extern bool n3fjp_calltab; #endif // N3FJP_LOGGER_H fldigi-4.2.05/src/include/table.h0000664000175000017500000001345414611711171013444 00000000000000/* Copyright (c) 2004 Markus Niemist Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef __TABLE_HH #define __TABLE_HH #include #include #include #include #include #include #define TABLE_WHEN_DCLICK 16 enum SCROLLS {always, never, var}; struct ColumnInfo { bool hidden; const char *title; int width; Fl_Align align; Fl_Align hdr_align; int (*comparator)(const char*, const char*); void (*callback)(); }; int compareInt(const char *val1, const char *val2); class Table : public Fl_Group { private: // Scrollbars Fl_Scrollbar *hScroll, *vScroll; SCROLLS Vscroll; SCROLLS Hscroll; // Popup menu const Fl_Menu_Item *popupMenu; bool menuAlloc; // Column data std::vector header; // Cell data std::vector data; bool (*highlighter)(int, char **, Fl_Color *); // Table dimensions int tableHeight, tableWidth; int oX, oY, oW, oH; // Outer dimensions (widget - box) int iX, iY, iW, iH; /* * Table area dimensions * (outer dimension - header - scrollbars) */ // For optimization int topRow, bottomRow, leftCol, rightCol; int topRowY, leftColX; int nCols, nRows; // Number of rows and columns int cPos; // Column where new entry is added. int resizing, dragX; int pushed; int sortColumn; // Object sizes int scrollbarSize; int headerHeight; int rowHeight; int selected; char **curRow; Fl_Font tbl_font; int tbl_fontsize; // Various flags bool ascent; bool canResize, canSort; bool noMoreColumns; bool toBeSorted; bool dimensionsChanged; bool headerEnabled; bool withGrid; void dSort(int start, int end, int (*compare)(const char *, const char*)); void aSort(int start, int end, int (*compare)(const char *, const char*)); protected: virtual int handle(int event); virtual void drawHeader(int x, int y); virtual void drawRow(int row, char *rowData[], int x, int y); virtual void draw(); void calcDimensions(); void scrolled(); void resized(); static void scrollCallback(Fl_Widget *widget, void *data); public: Table(int x, int y, int w, int h, char *label = NULL); ~Table(); bool headerOn() const; void headerOn(bool enabled); bool allowResize() const; void allowResize(bool allow); bool allowSort() const; void allowSort(bool allow); bool gridEnabled() const; void gridEnabled(bool enable); int headerSize() const; void headerSize(int height); int rowSize() const; void rowSize(int height); int scrollbSize() const; void scrollbSize(int size); virtual void resize(int x, int y, int w, int h); void font(Fl_Font fnt) { tbl_font = fnt; } Fl_Font font() { return tbl_font; } void fontsize(int fntsize) { tbl_fontsize = fntsize; headerHeight = tbl_fontsize + 4; rowHeight = tbl_fontsize + 4; } int fontsize() { return tbl_fontsize; } Fl_Align headerAlign(int column) const; void headerAlign(int column, Fl_Align align); Fl_Align columnAlign(int column) const; void columnAlign(int column, Fl_Align align); int columnWidth(int column) const; void columnWidth(int column, int width); const char *columnTitle(int column); void columnTitle(int column, const char *title); bool columnHidden(int column); void columnHidden(int column, bool hidden); void sort(); void sort(int column, bool ascent); void getSort(int &sortColumn, bool &ascent); void setHighlighter(bool (*highlighter)(int, char **, Fl_Color *)); void addColumn(const char *label, int width = 150, Fl_Align align = (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP), int (*comparator)(const char*, const char*) = NULL); void colcomparator (int column, int (*comparator)(const char*, const char*) = NULL); void colcallback (int column, void (*callback)() = NULL); void addHiddenColumn(const char *label); void addCell(char *data); void addRow(int cols, ...); void addFromTSV(const char *data); void removeRow(int row); void clear(bool removeColumns = false); void where(int x, int y, int &row, int &column, int &resize); void scrollTo(int pos); int scrollPos() const; int columns(); int rows(); void value(int selection); int value(); char *valueAt(int row, int column); int intValueAt(int row, int column); void valueAt(int row, int column, char *data); void valueAt(int row, int column, int data); const char **getRow(int row); const Fl_Menu_Item *menu(); void menu(const Fl_Menu_Item *m); void menuCopy(const Fl_Menu_Item *m); void menuClear(); void allowVscroll(SCROLLS when) {Vscroll = when;} void allowHscroll(SCROLLS when) {Hscroll = when;} void FirstRow (); void PrevRow (); void NextRow (); void LastRow (); void PrevPage (); void NextPage (); void GotoRow (int); int vScrollWidth() { return (vScroll->visible() ? vScroll->w() : 0);} bool search(int& row, int& col, bool rev, const char* re); }; #endif fldigi-4.2.05/src/include/contestia.h0000664000175000017500000000364114611711171014343 00000000000000// ---------------------------------------------------------------------------- // contestia.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CONTESTIA_H #define _CONTESTIA_H #include "modem.h" #include "jalocha/pj_mfsk.h" #include "sound.h" #define TONE_DURATION (SCBLOCKSIZE * 16) #define SR4 ((TONE_DURATION) / 4) class contestia : public modem { private: MFSK_Transmitter < double >*Tx; MFSK_Receiver < double >*Rx; double *txfbuffer; int txbufferlen; double phaseacc; cmplx prevsymbol; int preamble; unsigned int shreg; double np; double sp; double sigpwr; double noisepwr; int escape; int smargin; int sinteg; int tones; int bw; double tone_bw; int preamblesent; int postamblesent; double preamblephase; double txbasefreq; double tone_midfreq; double lastfreq; double ampshape[SR4]; double tonebuff[TONE_DURATION]; double nco(double freq); void send_tones(); public: contestia(trx_mode omode = MODE_CONTESTIA); ~contestia(); void init(); void rx_init(); void rx_flush(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); int unescape(int c); }; #endif fldigi-4.2.05/src/include/ICOMkeying.h0000664000175000017500000000213114611711171014301 00000000000000// ---------------------------------------------------------------------------- // ICOMkeying.h serial string CW interface to Elecraft transceivers // // Copyright (C) 2020 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _ICOMKEYING_H #define _ICOMKEYING_H extern bool use_ICOMkeyer; extern int ICOMwpm; extern void set_ICOMkeyer(); extern void ICOMkeyer_send_char(int); #endif fldigi-4.2.05/src/include/gettext.h0000664000175000017500000002275414532252172014047 00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with fldigi. If not, see . */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 #include "config.h" /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include /* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by the gettext() and ngettext() macros. This is an alternative to calling textdomain(), and is useful for libraries. */ # ifdef DEFAULT_TEXT_DOMAIN # undef gettext # define gettext(Msgid) \ dgettext (DEFAULT_TEXT_DOMAIN, Msgid) # undef ngettext # define ngettext(Msgid1, Msgid2, N) \ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) # endif #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Many header files from the libstdc++ coming with g++ 3.3 or newer include , which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. */ #if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) # include # if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H # include # endif #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) # define dcgettext(Domainname, Msgid, Category) \ ((void) (Category), dgettext (Domainname, Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 \ ? ((void) (Msgid2), (const char *) (Msgid1)) \ : ((void) (Msgid1), (const char *) (Msgid2))) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) \ ((void) (Domainname), (const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) \ ((void) (Domainname), (const char *) (Codeset)) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String /* The separator between msgctxt and msgid in a .mo file. */ #define GETTEXT_CONTEXT_GLUE "\004" /* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be short and rarely need to change. The letter 'p' stands for 'particular' or 'special'. */ #ifdef DEFAULT_TEXT_DOMAIN # define pgettext(Msgctxt, Msgid) \ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #else # define pgettext(Msgctxt, Msgid) \ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #endif #define dpgettext(Domainname, Msgctxt, Msgid) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) #define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) #ifdef DEFAULT_TEXT_DOMAIN # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #else # define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #endif #define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) #define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * pgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, int category) { const char *translation = dcgettext (domain, msg_ctxt_id, category); if (translation == msg_ctxt_id) return msgid; else return translation; } #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * npgettext_aux (const char *domain, const char *msg_ctxt_id, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { const char *translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); if (translation == msg_ctxt_id || translation == msgid_plural) return (n == 1 ? msgid : msgid_plural); else return translation; } /* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID can be arbitrary expressions. But for string literals these macros are less efficient than those above. */ #include #define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ /* || __STDC_VERSION__ >= 199901L */ ) #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS #include #endif #define pgettext_expr(Msgctxt, Msgid) \ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) #define dpgettext_expr(Domainname, Msgctxt, Msgid) \ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcgettext (domain, msg_ctxt_id, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (translation != msg_ctxt_id) return translation; } return msgid; } #define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static const char * dcnpgettext_expr (const char *domain, const char *msgctxt, const char *msgid, const char *msgid_plural, unsigned long int n, int category) { size_t msgctxt_len = strlen (msgctxt) + 1; size_t msgid_len = strlen (msgid) + 1; const char *translation; #if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS char msg_ctxt_id[msgctxt_len + msgid_len]; #else char buf[1024]; char *msg_ctxt_id = (msgctxt_len + msgid_len <= sizeof (buf) ? buf : (char *) malloc (msgctxt_len + msgid_len)); if (msg_ctxt_id != NULL) #endif { memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); msg_ctxt_id[msgctxt_len - 1] = '\004'; memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); #if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS if (msg_ctxt_id != buf) free (msg_ctxt_id); #endif if (!(translation == msg_ctxt_id || translation == msgid_plural)) return translation; } return (n == 1 ? msgid : msgid_plural); } #if ENABLE_NLS #define _(String) gettext (String) #define N_(String) gettext_noop (String) #else #define _(String) (String) #define N_(String) String #endif #if ENABLE_NLS int setup_nls(void); unused__ static const int nls_init_ = setup_nls(); #endif #endif /* _LIBGETTEXT_H */ fldigi-4.2.05/src/include/wefax-pic.h0000664000175000017500000000542414611711171014236 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // Remi Chateauneu // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _WEFAX_PIC_H #define _WEFAX_PIC_H #include #include class Fl_Menu_ ; class wefax ; class wefax_pic { public: static void set_tx_pic(unsigned char data, int col, int row, bool is_color ); static int normalize_lpm( double the_lpm_value ); static int update_rx_pic_col(unsigned char data, int pos); static void update_rx_pic_bw(unsigned char data, int pos); static void tx_viewer_resize(int the_width, int the_height); static void restart_tx_viewer(void); static void abort_rx_viewer(void); static void abort_tx_viewer(void); static void resize_rx_viewer(int width_img); static void set_rx_label(const std::string & win_label); static void delete_rx_viewer(void); static void delete_tx_viewer(void); static void skip_rx_apt(void); static void skip_rx_phasing(bool auto_center); static void cb_mnu_pic_viewer_tx(Fl_Menu_ *, void *); static void setwefax_map_link(wefax *me); static void save_image(const std::string & fil_name, const std::string & extra_comments); static void send_image( const std::string & fil_name ); static void set_manual( bool manual_mode ); static void update_auto_center( bool is_auto_center ); static void create_both( bool called_from_fl_digi ); // Fl_Group * create_wefax_rx_viewer(int wid_x, int wid_y,int wid_win, int hei_win); // static void create_wefax_tx_viewer(int wid_x, int wid_y,int wid_win, int hei_win); }; extern Fl_Double_Window *wefax_pic_tx_win; extern Fl_Group *wefax_pic_rx_win; extern Fl_Light_Button *wefax_round_rx_noise_removal; extern Fl_Light_Button *wefax_round_rx_binary; extern Fl_Light_Button *wefax_round_rx_non_stop; extern void wefax_cb_rx_set_filter( Fl_Widget *, void * ); extern Fl_Group * create_wefax_rx_viewer(int wid_x, int wid_y,int wid_win, int hei_win); extern void create_wefax_tx_viewer(int wid_x, int wid_y,int wid_win, int hei_win); #endif // _WEFAX_PIC_H fldigi-4.2.05/src/include/rx_extract.h0000664000175000017500000000227614532252172014543 00000000000000// ---------------------------------------------------------------------------- // ex_extract.h Remote Log Interface for fldigi // // Copyright W1HKJ, Dave Freese 2006 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _RX_EXTRACT_H #define _RX_EXTRACT_H #include extern const char *txtWrapInfo; extern void rx_extract_add(int c); extern void select_flmsg_pathname(); extern std::string select_binary_pathname(std::string deffilename); extern bool extract_wrap; extern bool extract_flamp; #endif fldigi-4.2.05/src/include/Panel.h0000664000175000017500000000233014532252172013406 00000000000000// ---------------------------------------------------------------------------- // Panel_Check.h // // Copyright (C) 2011 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef Panel_h_ #define Panel_h_ #include class Panel : public Fl_Group { public: int handle(int); Panel(int X,int Y,int W,int H,const char*l=0) : Fl_Group(X,Y,W,H,l) { clip_children(true); } void resize(int, int, int, int); void position(int, int, int, int); int orgx(); int orgy(); }; #endif fldigi-4.2.05/src/include/trx.h0000664000175000017500000000366414611711171013174 00000000000000// ---------------------------------------------------------------------------- // trx.h // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef TRX_H #define TRX_H #include "threads.h" #include "modem.h" #include "sound.h" #include "globals.h" #include "rsid.h" // ---------------------------------------------------------------------------- extern void trx_start_modem(modem* m, int f = 0); extern void trx_start(void); extern void trx_close(void); extern void trx_transmit_psm(void); extern void trx_transmit(void); extern void trx_tune(void); extern void trx_receive(void); extern void trx_reset(void); extern void trx_wait_state(void); extern state_t trx_state; extern modem *active_modem; extern cRsId *ReedSolomon; extern SoundBase *RXscard; extern SoundBase *TXscard; extern bool bHistory; extern bool bHighSpeed; extern bool rx_only; #define TRX_WAIT(s_, code_) \ do { \ ENSURE_NOT_THREAD(TRX_TID); \ code_; \ while (trx_state != s_) \ trx_wait_state(); \ } while (0) void trx_xmit_wfall_queue(int samplerate, const double* buf, size_t len); #endif fldigi-4.2.05/src/include/icons.h0000664000175000017500000000415614611711171013467 00000000000000// ---------------------------------------------------------------------------- // icons.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef ICONS_H_ #define ICONS_H_ #define USE_IMAGE_LABELS 1 #include #include #include #include "pixmaps.h" namespace icons { const char* make_icon_label(const char* text, const char** pixmap = 0); void set_icon_label(Fl_Menu_Item* item); void set_icon_label(Fl_Widget* w); void toggle_icon_labels(void); const char* get_icon_label_text(Fl_Menu_Item* item); const char* get_icon_label_text(Fl_Widget* w); void free_icon_label(Fl_Menu_Item* item); void free_icon_label(Fl_Widget* w); void set_active(Fl_Menu_Item* item, bool v); void set_active(Fl_Widget* w, bool v); // fltk message dialogs with nicer icons void set_message_icon(const char** pixmap); } #define fl_input2(...) ({ icons::set_message_icon(dialog_question_48_icon); fl_input(__VA_ARGS__); }) #define fl_choice2(...) ({ icons::set_message_icon(dialog_question_48_icon); fl_choice(__VA_ARGS__); }) #define fl_message2(...) ({ icons::set_message_icon(dialog_information_48_icon); fl_message(__VA_ARGS__); }) #define fl_warn_choice2(...) ({ icons::set_message_icon(dialog_warning_48_icon); fl_choice(__VA_ARGS__); }) #define fl_alert2(...) ({ icons::set_message_icon(dialog_warning_48_icon); fl_alert(__VA_ARGS__); }) #endif // ICONS_H_ fldigi-4.2.05/src/include/logger.h0000664000175000017500000000254114611711171013627 00000000000000// ---------------------------------------------------------------------------- // logger.h Remote Log Interface for fldigi // // Copyright W1HKJ, Dave Freese 2006 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _LOGGER_H #define _LOGGER_H // IPC interface to Xlog and fl_logbook #define LOG_MVERSION "1" #define LOG_MKEY 1238 #define LOG_MTYPE 88 #define LOG_MSG_LEN 1024 #include "qso_db.h" typedef struct { long mtype; char mtext[LOG_MSG_LEN]; } msgtype; extern void submit_log(); extern void submit_record(cQsoRec &); extern char logdate[]; extern char logtime[]; extern char adifdate[]; extern const char *logmode; extern std::string str_lotw; #endif fldigi-4.2.05/src/include/nullmodem.h0000664000175000017500000000234614611711171014347 00000000000000// ---------------------------------------------------------------------------- // NULLMODEM.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _NULLMODEM_H #define _NULLMODEM_H #include "trx.h" #include "modem.h" #define NULLMODEMSampleRate 8000 class NULLMODEM : public modem { protected: public: NULLMODEM(); ~NULLMODEM(); void init(); void rx_init(); void restart(); void tx_init(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-4.2.05/src/include/record_loader_gui.h0000664000175000017500000000305414532252172016023 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RECORD_LOADER_GUI_H #define RECORD_LOADER_GUI_H #include #include class RecordLoaderInterface ; class DerivedRecordLst : public Fl_Table { DerivedRecordLst(); DerivedRecordLst( const DerivedRecordLst & ); DerivedRecordLst & operator=( const DerivedRecordLst & ); public: DerivedRecordLst(int, int, int, int, const char * title = 0); virtual ~DerivedRecordLst(); static void cbGuiUpdate(); static void cbGuiReset(); void AddRow(int R); void DrawRow(int R); protected: void draw_cell(TableContext context, // table cell drawing int R=0, int C=0, int X=0, int Y=0, int W=0, int H=0); }; #endif // RECORD_LOADER_GUI_H fldigi-4.2.05/src/include/KYkeying.h0000664000175000017500000000211314611711171014075 00000000000000// ---------------------------------------------------------------------------- // KYkeying.h serial string CW interface to Elecraft transceivers // // Copyright (C) 2020 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _KYKEYING_H #define _KYKEYING_H extern bool use_KYkeyer; extern int KYwpm; extern void set_KYkeyer(); extern void KYkeyer_send_char(int); #endif fldigi-4.2.05/src/include/pwrmeter.h0000664000175000017500000000515414611711171014220 00000000000000// // pwrmeter.h // // PWRmeter bar widget routines. // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PWRMETER #define PWRMETER // // Include necessary headers. // #include #include // // PWRmeter class... // class PWRmeter : public Fl_Widget { #define NPEAKS 50 public: enum {P25, P50, P100, P200, AUTO}; private: double value_, peak_, peaks_[NPEAKS], maximum_; int ppeak; int sval; // Size of sval bar... int bx, by, bw, bh; // Box areas... int tx, tw; // Temporary X + width int ty, th; // Temporary Y + height int sx; // meter left offset int meter_width; int meter_height; int select_; Fl_Color bgnd_; Fl_Color fgnd_; Fl_Color scale_color; static const char *W25_face; static const char *W50_face; static const char *W100_face; static const char *W200_face; void (*cbFunc)(Fl_Widget *, void *); protected: virtual void draw(); public: PWRmeter(int x, int y, int w, int h, const char *l = 0); void value(double v) { value_ = v; if (ppeak++ > 9) ppeak = 0; peaks_[ppeak] = value_; peak_ = 0; for (int n = 0; n < NPEAKS; n++) { if (peaks_[n] > peak_) peak_ = peaks_[n]; } // redraw(); } double value() const { return (value_); } double peak() const { return (peak_); } void resize(int x, int y, int w, int h); int handle(int); void set_background(Fl_Color c1) { bgnd_ = c1; redraw(); } void set_metercolor(Fl_Color c2) { fgnd_ = c2; redraw(); } void set_scalecolor(Fl_Color c3) { scale_color = c3; redraw(); } void select(int sel); void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } private: void select_auto(); void select_25W(); void select_50W(); void select_100W(); void select_200W(); }; #endif // !pwrmeter fldigi-4.2.05/src/include/morse.h0000664000175000017500000000270614611711171013500 00000000000000/* * morse.h -- morse code tables * * Copyright (C) 2017 * * Fldigi is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Fldigi is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with fldigi. If not, see . * */ #ifndef _MORSE_H #define _MORSE_H #include #define MorseTableSize 256 #define CW_DOT_REPRESENTATION '.' #define CW_DASH_REPRESENTATION '-' struct CWstruct { bool enabled; // true if character is active std::string chr; // utf-8 string representation of character std::string prt; // utf-8 printable representation std::string rpr; // Dot-dash code representation }; class cMorse { private: static CWstruct cw_table[]; std::string utf8; std::string toprint; int ptr; public: cMorse() { init(); } ~cMorse() { } void init(); void enable(std::string, bool); std::string rx_lookup(std::string); std::string tx_lookup(int); std::string tx_print() { return toprint; } int tx_length(int); }; #endif fldigi-4.2.05/src/include/raster.h0000664000175000017500000000347414611711171013656 00000000000000// ---------------------------------------------------------------------------- // raster.h, Raster scan Widget for display of fuzzy modes // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _RASTER_H #define _RASTER_H #include #include "feld.h" class Raster : public Fl_Widget { public: private: unsigned char *vidbuf; int width; int height; int col; int Nrows; int rowheight; int rhs; int space; int vidpos; // column start position int numcols; // number of columns to redraw int yp; bool marquee; bool _reverse; public: Raster(int X, int Y, int W, int H, int rh = 2, bool rv = false); ~Raster(); void draw(); int handle(int); void resize(int x, int y, int w, int h); unsigned char *buffer() { return vidbuf;} int size() { return width * height;} int change_rowheight( int rh ); void data(int data[], int len); void clear(); void show() { Fl_Widget::show();} void hide() { Fl_Widget::hide();} void set_marquee(bool val) { marquee = val; } bool get_marquee() { return marquee; } void reverse(bool val) { _reverse = val; } }; #endif fldigi-4.2.05/src/include/viterbi.h0000664000175000017500000000335014532252172014016 00000000000000// ---------------------------------------------------------------------------- // viterbi.h -- Viterbi decoder // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters were adapted from code contained // in the gmfsk source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef VITERBI_H #define VITERBI_H #define PATHMEM 256 class viterbi { private: int _traceback; int _chunksize; int nstates; int *output; int outsize; int *metrics[PATHMEM]; int *history[PATHMEM]; int sequence[PATHMEM]; int mettab[2][256]; unsigned int ptr; int traceback(int *metric); int _k; int _poly1; int _poly2; public: viterbi(int k, int poly1, int poly2); ~viterbi(); void reset(); void init(); int settraceback(int trace); int setchunksize(int chunk); int decode(unsigned char *sym, int *metric); }; class encoder { private: int *output; unsigned int shreg; unsigned int shregmask; int _k; int _poly1; int _poly2; public: encoder(int k, int poly1, int poly2); ~encoder(); int encode(int bit); void init(void); }; #endif fldigi-4.2.05/src/include/rigCAT.h0000664000175000017500000000232714532252172013466 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RIGCAT_H_ #define RIGCAT_H_ #ifndef RIGCATTEST # error FIXME: file should not have been included #endif #include #include #include #include #include extern Fl_Double_Window *window; extern char *homedir; extern string xmlfname; extern void MilliSleep(long msecs); #endif fldigi-4.2.05/src/include/qrzlib.h0000664000175000017500000002022514532252172013655 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef QRZHEADER // To include the email code remove the comment specifier from the following line #define HAVE_EMAIL // QRZ CDROM data structures /* ** Index Header Block Definition (Version 2) ** (applies to all QRZ CDROMS from Version 2 onward) ** ** This block is located at the start of each index */ typedef struct { char dataname[16]; /* Name of the data file */ char bytesperkey[8]; /* Data Bytes per Index Item */ char numkeys[8]; /* Number of items in this index */ char keylen[8]; /* Length of each key item in bytes */ char version[8]; /* Database Version ID */ } index_header; /* Index Usage The name index is set to a maximum of 16 characters with longer names being truncated. Names are stored in last-first format with a space between the names. The city/state index uses 12 characters per entry, the callsign index 6 characters and the zip code index 5 characters. The data which follows the header is simply a long list of single field records. The records are tightly packed on 'bytesperkey' boundaries without separators. There is no guarantee of a null terminator on any index record entry. When the program qrz.exe is run it first searches for a drive containing the base directory \CALLBK . Next, it loads all four index files (callbkc.idx, callbkn.idx, callbks.idx and callbkz.idx) into tables in memory. These tables were kept small so as not to place an undue RAM requirement on the user's system. Next, when a user specifies a field and key to search, the program searches the relevant index table and returns the closest match lower (or equal to) the supplied key. The table position of this key is then taken and multiplied by the 'bytesperkey' value to arrive at a database file offset. This offset is then used to perform the first and only seek into the database. Once on position within the file, a sequential search is performed to return the match. The search terminates at the next index key value if the field is not found. The database files all have the same format. The records each consist of comma separated fields which end with a single newline '\n' (ASCII 0xa) character. Blank fields are simply stored as a comma. Every record has the same number of commas in it. Actual comma's in the data field are stored as a semi-colon ';' which should be replaced by a comma in the user's output formatting routine. Example: AA7BQ ,LLOYD,,FRED L,,53340,90009,00009,8215 E WOOD DR,SCOTTSDALE,AZ, 85260,E,KJ6RK,A The callsign database is sorted by SUFFIX, AREA, PREFIX. For example, the following order would be observed: QE24AA ... ZZ99ZZ ... A 0A ... AA0AAA ... ZZ9ZZZ This ordering also pertains to the index file since it is just a snaphot of every nth record in the database. */ /* ** Standard Record Field Offsets */ #define QRZLIB_CALL 0 #define QRZLIB_LNAME 1 #define QRZLIB_JR 2 #define QRZLIB_FNAME 3 #define QRZLIB_MI 4 #define QRZLIB_DOB 5 #define QRZLIB_EFDATE 6 #define QRZLIB_EXPDATE 7 #define QRZLIB_MAIL_STR 8 #define QRZLIB_MAIL_CITY 9 #define QRZLIB_MAIL_ST 10 #define QRZLIB_MAIL_ZIP 11 #define QRZLIB_CLASS 12 #define QRZLIB_P_CALL 13 #define QRZLIB_P_CLASS 14 /* The fields JR and MI were obsoleted by the FCC in July 1994. The callsign fields are arranged in a strict "ccdccc" columnar format where 'c' represents a letter and 'd' a digit. Callsigns which do not conform to the "ccdccc" format are space filled in the relevant positions. This field is rearranged to the proper layout by the user program's output formatting routines. All dates are stored in 5 character Julian format, e.g. 93003 equals January 3, 1993. Dates before 1900 or after year 2000 must be determined by their context usage. In other words, if the resultant age does not make sense, then it's wrong. For example, all licenses expire in the future so 02 is 2002. Birthdays are more difficult but most can be determined to be greater than 10 years old. This is not a perfect method, but it does yield satisfactory results. Some folks may notice that the database no longer contains station location information. This information is no longer supplied nor available from the FCC since it is no longer a part of their record keeping (See the May 1993 QST for more info). Cross Reference Information Callsigns in the database are now cross-referenced to both the current and the previous call sign for each entry in which they are available. A cross reference record takes the form of 'old,new' with no other information in the record. A record can be identified as a cross reference either one of two ways: First, if the record length is less than 15 characters, then it is a cross reference record. Secondly, if the record contains only one comma "," , then it is a cross reference record. It is not necessary to test for both cases, either will do. When a cross reference record is encountered, you must fetch the second field and restart the search to return the primary reference. */ #include #include #include extern char *Composite( char * ); class QRZ { private: char criteria; index_header idxhdr; char *data; char *index; char *top; FILE *idxfile; long idxsize; FILE *datafile; long dataoffset; long databytesread; char *dfptr; char *endofline; char *idxptr; int found; char recbuffer[512]; unsigned int datarecsize; long numkeys; int keylen; void OpenQRZFiles( const char * ); int FindCallsign( char * ); int FindName( char * ); int FindState( char * ); int FindZip( char * ); int ReadDataBlock( long ); int nextrec(); bool hasImage; char *Qcall; char *Qlname; char *Qfname; char *Qdob; char *Qefdate; char *Qexpdate; char *Qmail_str; char *Qmail_city; char *Qmail_st; char *Qmail_zip; char *Qopclass; char *Qp_call; char *Qimagefname; char *Qp_class; int QRZvalid; public: QRZ( const char * ); QRZ( const char *, char ); ~QRZ(); int CallComp( char *, char * ); int CompState( const char *, const char *, const char * ); int getQRZvalid(); void NewDBpath( const char * ); int FindRecord( char * ); int NextRecord(); int ReadRec(); int GetCount( char * ); char *GetCall(); const char *GetLname(); const char *GetFname(); const char *GetDOB(); const char *GetEFdate(); const char *GetEXPdate(); const char *GetStreet(); const char *GetCity(); const char *GetState(); const char *GetZIP(); const char *GetOPclass(); const char *GetPriorCall(); const char *GetPriorClass(); const char *GetImageFileName(); char *CSV_Record(); char *Fmt_Record(); bool ImageExists(); const char *ImageFileName() {return Qimagefname;}; }; extern void SetQRZdirectory(char *dir); extern int filename_expand(char *to,int tolen, const char *from); #define QRZHEADER #endif fldigi-4.2.05/src/include/throb.h0000664000175000017500000000561714611711171013475 00000000000000// ---------------------------------------------------------------------------- // throb.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _THROB_H #define _THROB_H #include "modem.h" #include "globals.h" #include "fftfilt.h" #include "filters.h" #include "complex.h" #include "mbuffer.h" #define THROB_SAMPLE_RATE 8000 #define SYMLEN 512 #define BUFFLEN 4096 #define SCOPE_DATA_LEN 1024 #define DOWN_SAMPLE 32 #define SYMLEN_1 8192 #define SYMLEN_2 4096 #define SYMLEN_4 2048 #define MAX_RX_SYMLEN (SYMLEN_1 / DOWN_SAMPLE) #define FilterFFTLen 8192 class throb : public modem { static double ThrobToneFreqsNar[]; static double ThrobToneFreqsWid[]; static double ThrobXToneFreqsNar[]; static double ThrobXToneFreqsWid[]; static unsigned char ThrobCharSet[]; static unsigned char ThrobXCharSet[]; static int ThrobTonePairs[][2]; static int ThrobXTonePairs[][2]; protected: int num_tones; int num_chars; int idlesym; int spacesym; char lastchar; double phaseacc; double phaseincr; fftfilt *fftfilter; C_FIR_filter *syncfilt; C_FIR_filter *hilbert; Cmovavg *snfilter; int symlen; double freqs[55]; // receive double *scope_data; cmplx *rxtone[55]; cmplx symbol[MAX_RX_SYMLEN]; double syncbuf[MAX_RX_SYMLEN]; mbuffer dispbuf; double rxcntr; double signal; double noise; double s2n; int rxsymlen; int symptr; int deccntr; int shift; int waitsync; cmplx mixer(cmplx in); void sync(cmplx in); void rx(cmplx in); void decodechar(int tone1, int tone2); int findtones(cmplx *word, int &tone1, int &tone2); cmplx *mk_rxtone(double freq, double *pulse, int len); void show_char(int); void flip_syms(); void reset_syms(); // transmit int txstate; int preamble; double *txpulse; double *outbuf; unsigned int buffptr; double *mk_semi_pulse(int len); double *mk_full_pulse(int len); void send(int); public: throb(trx_mode); ~throb(); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void update_syncscope(); }; #endif fldigi-4.2.05/src/include/fontdef.h0000664000175000017500000000321414532252172013776 00000000000000// ------------------------------------------------------------------------------ // // fontdef.h -- FELDHELL modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FONTDEF_H #define _FONTDEF_H struct fntchr { char c; int byte[14]; }; extern fntchr feld7x7_14[]; extern fntchr feld7x7n_14[]; extern fntchr feldDx_14[]; extern fntchr feldfat_14[]; extern fntchr feldhell_12[]; extern fntchr feldlittle_12[]; extern fntchr feldlo8_14[]; extern fntchr feldlow_14[]; extern fntchr feldmodern_14[]; extern fntchr feldmodern8_14[]; extern fntchr feldnarr_14[]; extern fntchr feldreal_14[]; extern fntchr feldstyl_14[]; extern fntchr feldvert_14[]; extern fntchr feldwide_14[]; extern char szFeldFonts[]; #endif fldigi-4.2.05/src/include/rxmon.h0000664000175000017500000000153114611711171013511 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef rxmon_h #define rxmon_h #include #include "configuration.h" #include "combo.h" #include "flinput2.h" #include "flslider2.h" #include #include #include extern Fl_Check_Button *btn_mon_xcvr_audio; extern Fl_Value_Slider2 *sldrRxFilt_vol; extern Fl_Check_Button *btn_rxgain_x10; extern Fl_Check_Button *btn_mon_dsp_audio; extern Fl_Value_Slider2 *sldrRxFilt_bw; extern Fl_Value_Slider2 *sldrRxFilt_mid; extern Fl_Value_Slider2 *sldrRxFilt_low; extern Fl_Value_Slider2 *sldrRxFilt_high; extern Fl_Check_Button *btn_RxFilt_at_track; extern Fl_Check_Button *btn_mon_wf_display; extern Fl_Check_Button *btn_mon_xmt_audio; extern Fl_Value_Slider2 *sldr_tx_vol; Fl_Double_Window* make_rxaudio_dialog(); #endif fldigi-4.2.05/src/include/nanoIO.h0000664000175000017500000000465214611711171013540 00000000000000// ---------------------------------------------------------------------------- // nanoIO.h -- Interface to Arduino Nano keyer // // Copyright (C) 2018 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _TINYIO_H #define _TINYIO_H #include #include #include #include #include #include #include #include #include #include "debug.h" #include "fl_digi.h" #include "confdialog.h" #include "status.h" #include "serial.h" #include "qrunner.h" #include "threads.h" #include "FTextRXTX.h" extern bool use_nanoIO; extern bool nanoIO_isCW; extern bool open_nanoIO(); extern void close_nanoIO(); extern bool open_nanoCW(); extern void close_nanoIO(); extern char nano_read_byte(int &); extern std::string nano_readString(); extern void nano_send_char(int c); extern void nano_sendString (const std::string &s); extern void nano_set_baud(int bd); extern void nano_mark_polarity(int v); extern void nano_PTT(int val); extern void nano_cancel_transmit(); extern std::string nano_serial_read(); extern int nano_serial_write(char c); extern void set_nanoIO(); extern void set_nanoCW(); extern void set_nanoWPM(int wpm); extern void set_nano_keyerWPM(int wpm); extern void set_nanoIO_keyer(int indx); extern void set_nano_dash2dot(float wt); extern void nano_CW_query(); extern void nano_help(); extern void nano_CW_save(); extern void nanoCW_tune(int val); extern void set_nanoIO_incr(); extern void nanoIO_set_cw_ptt(); extern void nanoIO_use_pot(); extern void set_nanoIO_min_max(); extern void nanoIO_read_pot(); extern void set_paddle_WPM(int); extern void nanoIO_correction(); extern void nano_serial_flush(); extern void nanoIO_wpm_cal(); #endif fldigi-4.2.05/src/include/spot.h0000664000175000017500000000411214611711171013331 00000000000000// ---------------------------------------------------------------------------- // spot.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SPOT_H_ #define SPOT_H_ #if HAVE_REGEX_H # include #else # include "compat/regex.h" #endif #include #include "globals.h" typedef void (*spot_recv_cb_t)(trx_mode mode, int afreq, const char* str, const regmatch_t* sub, size_t len, void* data); typedef void (*spot_log_cb_t)(const char* call, const char* loc, unsigned long long freq, trx_mode mode, time_t rtime, void* data); void spot_recv(char c, int decoder = -1, int afreq = 0, int md = 0); void spot_log(const char* callsign, const char* locator = "", unsigned long long freq = 0LL, trx_mode mode = NUM_MODES, time_t rtime = -1L); void spot_manual(const char* callsign, const char* locator = "", unsigned long long freq = 0LL, trx_mode mode = NUM_MODES, time_t rtime = -1L); void spot_register_log(spot_log_cb_t lcb, void* ldata); void spot_register_manual(spot_log_cb_t mcb, void* mdata); void spot_register_recv(spot_recv_cb_t rcb, void* rdata, const char* re, int reflags); void spot_unregister_log(spot_log_cb_t lcb, const void* ldata); void spot_unregister_manual(spot_log_cb_t mcb, const void* mdata); void spot_unregister_recv(spot_recv_cb_t rcb, const void* rdata); #endif // SPOT_H_ fldigi-4.2.05/src/include/flslider2.h0000664000175000017500000001066014532252172014242 00000000000000// ---------------------------------------------------------------------------- // flslider2.h // // Copyright (C) 2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_SLIDER2_ #define FL_SLIDER2_ #include #include #include #include class Fl_Slider2 : public Fl_Slider { public: Fl_Slider2(int x, int y, int w, int h, const char* l = 0) : Fl_Slider(x, y, w, h, l) { } int handle(int event); }; class Fl_Value_Slider2 : public Fl_Value_Slider { public: Fl_Value_Slider2(int x, int y, int w, int h, const char* l = 0) : Fl_Value_Slider(x, y, w, h, l) { } int handle(int event); }; class Fl_Value_Input2 : public Fl_Value_Input { public: Fl_Value_Input2(int x, int y, int w, int h, const char* l = 0) : Fl_Value_Input(x, y, w, h, l) { } int handle(int event); }; class Fl_Spinner2 : public Fl_Spinner { public: Fl_Spinner2(int x, int y, int w, int h, const char* l = 0) : Fl_Spinner(x, y, w, h, l) { } int handle(int event); }; //====================================================================== // Fl_Counter with // improved event handling, // color rendering //====================================================================== // values for type(): #define FL_NORMAL_COUNTER 0 /**< type() for counter with fast buttons */ #define FL_SIMPLE_COUNTER 1 /**< type() for counter without fast buttons */ /** Controls a single floating point value with button (or keyboard) arrows. Double arrows buttons achieve larger steps than simple arrows. \see Fl_Spinner for value input with vertical step arrows.

\image html counter.png

\image latex counter.png "My_Counter" width=4cm \todo Refactor the doxygen comments for My_Counter type() documentation. The type of an My_Counter object can be set using type(uchar t) to: \li \c FL_NORMAL_COUNTER: Displays a counter with 4 arrow buttons. \li \c FL_SIMPLE_COUNTER: Displays a counter with only 2 arrow buttons. */ class FL_EXPORT My_Counter : public Fl_Valuator { Fl_Font textfont_; Fl_Fontsize textsize_; Fl_Color textcolor_; Fl_Color bkcolor_; double lstep_; uchar mouseobj; static void repeat_callback(void *); int calc_mouseobj(); void increment_cb(); protected: void draw(); public: int handle(int); My_Counter(int X, int Y, int W, int H, const char* L = 0); ~My_Counter(); /** Sets the increment for the large step buttons. The default value is 1.0. \param[in] a large step increment. */ void lstep(double a) {lstep_ = a;} /** Sets the increments for the normal and large step buttons. \param[in] a, b normal and large step increments. */ void step(double a,double b) {Fl_Valuator::step(a); lstep_ = b;} /** Sets the increment for the normal step buttons. \param[in] a normal step increment. */ void step(double a) {Fl_Valuator::step(a);} /** Returns the increment for normal step buttons. */ double step() const {return Fl_Valuator::step();} /** Gets the text font */ Fl_Font textfont() const {return textfont_;} /** Sets the text font to \p s */ void textfont(Fl_Font s) {textfont_ = s;} /** Gets the font size */ Fl_Fontsize textsize() const {return textsize_;} /** Sets the font size to \p s */ void textsize(Fl_Fontsize s) {textsize_ = s;} /** Gets the font color */ Fl_Color textcolor() const {return textcolor_;} /** Sets the font color to \p s */ void textcolor(Fl_Color s) {textcolor_ = s;} void textbkcolor(Fl_Color c) {bkcolor_ = c;} }; class Fl_Counter2 : public My_Counter { public: Fl_Counter2(int x, int y, int w, int h, const char* l = 0) : My_Counter(x, y, w, h, l) { } int handle(int event); }; #endif // FL_SLIDER2_ fldigi-4.2.05/src/include/wwv.h0000664000175000017500000000432214611711171013172 00000000000000// ---------------------------------------------------------------------------- // wwv.h -- wwv receive only modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _wwv_H #define _wwv_H //#include "complex.h" #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "mbuffer.h" #define wwvSampleRate 8000 #define MaxSymLen 512 // lp filter #1 //#define DEC_1 40 #define DEC_1 8 #define FIRLEN_1 512 #define BW_1 20 // lp filter #2 #define DEC_2 5 #define FIRLEN_2 256 #define BW_2 100 // wwv function return status codes. #define wwv_SUCCESS 0 #define wwv_ERROR -1 class wwv : public modem { protected: double phaseacc; double phaseincr; int smpl_ctr; // sample counter for timing wwv rx double agc; // threshold for tick detection C_FIR_filter *hilbert; C_FIR_filter *lpfilter; Cmovavg *vidfilter; mbuffer buffer; // storage for 1000 samples/sec video unsigned int buffptr; int sync; int sync0; int ticks; int x1; int y1; int x2; int y2; bool calc; bool zoom; double keyshape[32]; // 4 msec rise and fall time for pulse double audio[400]; double quiet[400]; double play[400]; double nco(double freq); void makeshape(); void makeaudio(); public: wwv(); ~wwv(); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); int tx_process(); void update_syncscope(); void set1(int x, int y); void set2(int x, int y); }; #endif fldigi-4.2.05/src/include/macroedit.h0000664000175000017500000000330414532252172014320 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef MACROEDIT_H #define MACROEDIT_H #include #include #include #include #include #include #include #include "flinput2.h" extern void loadBrowser(Fl_Widget *widget); extern Fl_Button *btnMacroEditOK; extern Fl_Button *btnMacroEditCancel; extern Fl_Hold_Browser *macroDefs; extern Fl_Button *btnInsertMacro; extern Fl_Input2 *macrotext; extern Fl_Input2 *labeltext; extern Fl_Double_Window *MacroEditDialog; extern Fl_Double_Window* make_macroeditor(); enum { MACRO_EDIT_BUTTON, MACRO_EDIT_INPUT }; extern void editMacro(int b, int t = MACRO_EDIT_BUTTON, Fl_Input* in = 0); extern void update_macro_button(int iMacro, const char *text, const char *name); extern void update_macroedit_font(); #endif fldigi-4.2.05/src/include/audio_alert.h0000664000175000017500000000420014611711171014632 00000000000000// Class Caudio_alert // // play various canned sounds or wav file using port audio interface #ifndef AUDIO_ALERT_H #define AUDIO_ALERT_H #include "config.h" #if USE_PORTAUDIO #include "play.pa.h" #define STEAM_TRAIN_SIZE 50225 extern int int_steam_train[]; #define BARK_SIZE 1501 extern int int_audio_bark[]; #define CHECKOUT_SIZE 11424 extern int int_audio_checkout[]; #define DOESNOT_SIZE 9927 extern int int_audio_doesnot[]; #define DIESEL_SIZE 7621 extern int int_audio_diesel[]; #define DINNER_BELL 15287 extern int int_dinner_bell[]; #define TTY_BELL 4763 extern int int_tty_bell[]; class Caudio_alert { private: static int int_phone_ring[]; static int int_audio_beeboo[]; c_portaudio *sc_audio; void create_beeboo(); void create_phonering(); public: void bark(); void checkout(); void doesnot(); void diesel(); void steam_train(); void beeboo(); void phone(); void dinner_bell(); void tty_bell(); void standard_tone(); void file(std::string sndfile); void alert(std::string s); void monitor(double *buffer, int len, int _sr, double amp); void monitor(cmplx *z, int len, double wf, int _sr); Caudio_alert(); ~Caudio_alert(); int open() { if (sc_audio) return sc_audio->open(); return 0; } void close() { if (sc_audio) sc_audio->close(); } c_portaudio *pa() { return sc_audio; } void init_filter() { sc_audio->init_filter(); } }; extern Caudio_alert *audio_alert; extern void reset_audio_alerts(); extern void center_rxfilt_at_track(); #else #include #include "complex.h" class Caudio_alert { public: Caudio_alert() {} ~Caudio_alert() {} void bark() {} void checkout() {} void doesnot() {} void diesel() {} void steam_train() {} void beeboo() {} void phone() {} void dinner_bell() {} void tty_bell() {} void standard_tone() {} void file(std::string sndfile) {} void alert(std::string s) {} void monitor(double *buffer, int len, int _sr, double amp = 1.0) {} void monitor(cmplx *z, int len, double wf, int _sr) {} void init_filter() {} }; extern Caudio_alert *audio_alert; extern void reset_audio_alerts(); extern void center_rxfilt_at_track(); #endif // USE_PORTAUDIO #endif fldigi-4.2.05/src/include/thorvaricode.h0000664000175000017500000000205114532252172015040 00000000000000// ---------------------------------------------------------------------------- // thorvaricode.h -- DEX Varicode // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _DEXVARICODE_H #define _DEXVARICODE_H extern const char *thorvarienc(int c, int secondary); extern int thorvaridec(unsigned int symbol); #endif fldigi-4.2.05/src/include/lookupcall.h0000664000175000017500000000310414611711171014511 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef LOOKUPCALL_H #define LOOKUPCALL_H #include extern std::string lookup_latd; extern std::string lookup_lond; extern std::string lookup_addr1; extern std::string lookup_addr2; extern std::string lookup_qth; extern std::string lookup_state; extern std::string lookup_province; extern std::string lookup_zip; extern std::string lookup_country; extern void clear_Lookup(); extern void CALLSIGNquery(); enum qrz_xmlquery_t { QRZXML_EXIT = -1, QRZXMLNONE, QRZNET, QRZCD, HAMCALLNET, CALLOOK, HAMQTH }; enum qrz_webquery_t { QRZWEB_EXIT = -1, QRZWEBNONE, QRZHTML, HAMCALLHTML, HAMQTHHTML, CALLOOKHTML }; extern void sendEQSL(const char *url); extern void makeEQSL(const char *msg); #endif fldigi-4.2.05/src/include/calendar.h0000664000175000017500000000651414532252172014130 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _FL_CALENDAR_H #define _FL_CALENDAR_H #include #include #include #include #include "flinput2.h" #include "date.h" class Fl_Calendar_Base : public Fl_Group , public Date { private: protected: int cal_x; int cal_y; int cal_w; int cal_h; Fl_Button * days[6*7]; public: Fl_Widget *target; int calfmt; /** * The constructor for an empty Fl_Calendar_Base. */ Fl_Calendar_Base (int x, int y, int w = (7*20), int h = (6*20), const char *l = 0); Fl_Button * day_button (int i); void update (); void csize (int cx, int cy, int cw, int ch); void setTarget (Fl_Widget *tgt); }; class Fl_Calendar : public Fl_Calendar_Base { public: /** * The constructor for an empty Fl_Calendar. */ Fl_Calendar (int x, int y, int w = (7*20), int h = (8*20), const char *l = 0); void today (); void previous_month (); void next_month (); void previous_year (); void next_year (); void setDate (int, int, int); void update (); void csize (int cx, int cy, int cw, int ch); int handle (int); protected: // Fl_Button * weekdays[7]; // Fl_Button * caption; Fl_Box * weekdays[7]; Fl_Box * caption; Fl_Button * nxt_month; Fl_Button * prv_month; Fl_Button * nxt_year; Fl_Button * prv_year; }; class Fl_PopCal : public Fl_Window { friend void popcal_cb(Fl_Widget *, long); protected: int popcalfmt_; // Fl_Window popcal_form; Fl_Calendar *popcal; Fl_Input2 *target; public: Fl_PopCal (int x, int y, int w, int h, Fl_Input2 *inp = 0); ~Fl_PopCal (); void popposition (int, int); void popshow (); void pophide (); void popcal_cb_i (Fl_Widget *, long); void popcalfmt (int); int popcalfmt (); int handle (int); void setDate (int, int, int); }; class Fl_DateInput : public Fl_Group { protected: Fl_Button *Btn; Fl_Input2 *Input; Fl_PopCal *Cal; Fl_Window *popcal_form; Fl_Calendar *popcal; int popcalfmt_; void makepopcal(); public: Fl_DateInput (int x, int y, int w, int h, const char * = 0); void format (int); const char *value (); void value (const char *); void color (Fl_Color); void textfont (int); void textsize (int); void textcolor (Fl_Color); void labelfont (int); void labelsize (int); void labelcolor (int); void align (Fl_Align); void fl_popcal(); void take_focus(); }; #endif fldigi-4.2.05/src/include/threads.h0000664000175000017500000001063314611711171014003 00000000000000// ---------------------------------------------------------------------------- // threads.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef THREADS_H_ #define THREADS_H_ #include #include #include #include #ifndef WIN32 #if !HAVE_SEM_TIMEDWAIT # include int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout); #endif #else #include #endif int sem_timedwait_rel(sem_t* sem, double rel_timeout); int pthread_cond_timedwait_rel(pthread_cond_t* cond, pthread_mutex_t* mutex, double rel_timeout); // qrunner threads enum { INVALID_TID = -1, TRX_TID, TOD_TID, QRZ_TID, RIGCTL_TID, NORIGCTL_TID, EQSL_TID, ADIF_RW_TID, ADIF_MERGE_TID, XMLRPC_TID, ARQ_TID, ARQSOCKET_TID, MACLOGGER_TID, KISS_TID, KISSSOCKET_TID, PSM_TID, AUDIO_ALERT_TID, FD_TID, N3FJP_TID, DXCC_TID, WKEY_TID, CWIO_TID, FSK_TID, FMT_TID, ACTIVITY_TID, FSQ_SOUNDER_TID, FLMAIN_TID, NUM_THREADS, NUM_QRUNNER_THREADS = NUM_THREADS - 1 }; #ifdef __linux__ void linux_log_tid(void); # define LOG_THREAD_ID() linux_log_tid() #else # define LOG_THREAD_ID() /* nothing */ #endif #if USE_TLS # define THREAD_ID_TYPE __thread intptr_t # define CREATE_THREAD_ID() thread_id_ = INVALID_TID # define SET_THREAD_ID(x) do { thread_id_ = (x); LOG_THREAD_ID(); } while (0) # define GET_THREAD_ID() thread_id_ #else # define THREAD_ID_TYPE pthread_key_t # define CREATE_THREAD_ID() pthread_key_create(&thread_id_, NULL) # define SET_THREAD_ID(x) do { pthread_setspecific(thread_id_, (const void *)(x + 1)); LOG_THREAD_ID(); } while (0) # define GET_THREAD_ID() ((intptr_t)pthread_getspecific(thread_id_) - 1) #endif // USE_TLS extern THREAD_ID_TYPE thread_id_; #ifndef NDEBUG # include "debug.h" bool thread_in_list(int id, const int* list); # define ENSURE_THREAD(...) \ do { \ int id_ = GET_THREAD_ID(); \ int t_[] = { __VA_ARGS__, INVALID_TID }; \ if (!thread_in_list(id_, t_)) \ LOG_ERROR("bad thread context: %d", id_); \ } while (0) # define ENSURE_NOT_THREAD(...) \ do { \ int id_ = GET_THREAD_ID(); \ int t_[] = { __VA_ARGS__, INVALID_TID }; \ if (thread_in_list(id_, t_)) \ LOG_ERROR("bad thread context: %d", id_); \ } while (0) #else # define ENSURE_THREAD(...) ((void)0) # define ENSURE_NOT_THREAD(...) ((void)0) #endif // ! NDEBUG // On POSIX systems we cancel threads by sending them SIGUSR2, // which will also interrupt blocking calls. On woe32 we use // pthread_cancel and there is no good/sane way to interrupt. #ifndef __WOE32__ #include # define SET_THREAD_CANCEL() \ do { \ sigset_t usr2; \ sigemptyset(&usr2); \ sigaddset(&usr2, SIGUSR2); \ pthread_sigmask(SIG_UNBLOCK, &usr2, NULL); \ } while (0) # define TEST_THREAD_CANCEL() /* nothing */ # define CANCEL_THREAD(t__) pthread_kill(t__, SIGUSR2);pthread_join(t__, NULL); #else // threads have PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DEFERRED when created # define SET_THREAD_CANCEL() /* nothing */ # define TEST_THREAD_CANCEL() pthread_testcancel() # define CANCEL_THREAD(t__) pthread_cancel(t__);pthread_join(t__, NULL) #endif /// This ensures that a mutex is always unlocked when leaving a function or block. class guard_lock { public: guard_lock(pthread_mutex_t* m); ~guard_lock(void); private: pthread_mutex_t* mutex; }; /// This wraps together a mutex and a condition variable which are used /// together very often for queues etc... class syncobj { pthread_mutex_t m_mutex ; pthread_cond_t m_cond ; public: syncobj(); ~syncobj(); pthread_mutex_t * mtxp(void) { return & m_mutex; } void signal(); bool wait( double seconds ); }; #endif // !THREADS_H_ fldigi-4.2.05/src/include/font_browser.h0000664000175000017500000000646414611711171015071 00000000000000// ---------------------------------------------------------------------------- // Font_Browser.h v 0.0.1 2005-10-17 // // for the Fast Light Tool Kit (FLTK) 1.1.x . // // David Freese, w1hkj@w1hkj.com // based on similar widget by Mariwan Jalal // // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FONTBROWSER_H #define FONTBROWSER_H #include #include #include #include #include #include #include #include #include #include "flslider2.h" // Preview box for showing font class Preview_Box : public Fl_Widget { private: int fontName; int fontSize; Fl_Color fontColor; void draw(); public: Preview_Box(int x, int y, int w, int h, const char* l); void SetFont( int fontname, int fontsize, Fl_Color c); }; // Font browser widget struct font_pair { int nbr; std::string name; font_pair() { nbr = 0; name.clear(); } ~font_pair() { } }; class Font_Browser : public Fl_Window { public: friend void *find_fixed_fonts(void *); enum filter_t { FIXED_WIDTH, VARIABLE_WIDTH, ALL_TYPES }; // these are shared by all instances of Font_Browser // created for instance 1 and deleted for instance 0 static int *fixed; static std::list font_list; font_pair nufont; static int instance; static int numfonts; private: Fl_Font fontnbr; int fontsize; Fl_Color fontcolor; filter_t filter; void *data_; Fl_Browser *lst_Font; Fl_Browser *lst_Size; Fl_Value_Input2 *txt_Size; Fl_Return_Button *btn_OK; Fl_Button *btn_Cancel; Fl_Button *btn_Color; Fl_Check_Button *btn_fixed; Preview_Box *box_Example; Fl_Callback* callback_; public: Font_Browser(int x = 100, int y = 100, int w = 430, int h = 225, const char *lbl = "Font Browser"); ~Font_Browser(); void callback(Fl_Callback* cb, void *d = 0) { callback_ = cb; data_ = d; } static void fb_callback(Fl_Widget* w, void* arg); void FontNameSelect(); void ColorSelect(); int numFonts() { return numfonts; } void fontNumber(Fl_Font n); Fl_Font fontNumber() { return fontnbr; } void fontSize(int s); int fontSize() { return fontsize; } void fontColor(Fl_Color c); Fl_Color fontColor() { return fontcolor; }; const char *fontName() { return lst_Font->text(lst_Font->value()); } void fontName(const char* n); static bool fixed_width(Fl_Font f); void fontFilter(filter_t filter); }; extern Font_Browser* font_browser; #endif fldigi-4.2.05/src/include/estrings.h0000664000175000017500000000035514532252172014212 00000000000000#ifndef _WINERROR_STRINGS_H #define _WINERROR_STRINGS_H #ifdef __WIN32__ #include #include struct ESTRINGS { long ecode; std::string estring; }; extern std::string &win_error_string(long err); #endif #endif fldigi-4.2.05/src/include/adif_io.h0000664000175000017500000000441714611711171013746 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef ADIFIO #define ADIFIO #include #include #include #include "qso_db.h" #define ADIF_VERS "2.2.7" class cAdifIO { private: bool write_all; cQsoRec *adifqso; FILE *adiFile; char *fillfield(int, int, char *); static int instances; public: cAdifIO (); ~cAdifIO (); int readAdifRec () {return 0;}; int writeAdifRec (cQsoRec *rec, const char *fname); void readFile (const char *, cQsoDb *); void do_readfile(const char *, cQsoDb *); void do_writelog(); std::string adif_record(cQsoRec *rec); int writeFile (const char *, cQsoDb *); int writeLog (const char *, cQsoDb *, bool b = true); bool log_changed(const char *fname); }; // crc 16 cycle redundancy check sum class Ccrc16 { private: unsigned int crcval; char ss[5]; public: Ccrc16() { crcval = 0xFFFF; } ~Ccrc16() {}; void reset() { crcval = 0xFFFF;} unsigned int val() {return crcval;} std::string sval() { snprintf(ss, sizeof(ss), "%04X", crcval); return ss; } void update(char c) { crcval ^= c & 255; for (int i = 0; i < 8; ++i) { if (crcval & 1) crcval = (crcval >> 1) ^ 0xA001; else crcval = (crcval >> 1); } } unsigned int crc16(char c) { update(c); return crcval; } unsigned int crc16(std::string s) { reset(); for (size_t i = 0; i < s.length(); i++) update(s[i]); return crcval; } std::string scrc16(std::string s) { crc16(s); return sval(); } }; #endif fldigi-4.2.05/src/include/fftfilt.h0000664000175000017500000000377114532252172014017 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _FFTFILT_H #define _FFTFILT_H #include "complex.h" #include "gfft.h" //---------------------------------------------------------------------- class fftfilt { enum {NONE, BLACKMAN, HAMMING, HANNING}; protected: int flen; int flen2; g_fft *fft; g_fft *ift; cmplx *ht; cmplx *filter; cmplx *timedata; cmplx *freqdata; cmplx *ovlbuf; cmplx *output; int inptr; int pass; int window; inline double fsinc(double fc, int i, int len) { return (i == len/2) ? 2.0 * fc: sin(2 * M_PI * fc * (i - len/2)) / (M_PI * (i - len/2)); } inline double _blackman(int i, int len) { return (0.42 - 0.50 * cos(2.0 * M_PI * i / len) + 0.08 * cos(4.0 * M_PI * i / len)); } void init_filter(); void clear_filter(); public: fftfilt(double f1, double f2, int len); fftfilt(double f, int len); ~fftfilt(); // f1 < f2 ==> bandpass // f1 > f2 ==> band reject void create_filter(double f1, double f2); void create_lpf(double f) { create_filter(0, f); } void create_hpf(double f) { create_filter(f, 0); } void rtty_filter(double); int run(const cmplx& in, cmplx **out); int flush_size(); }; #endif fldigi-4.2.05/src/include/interleave.h0000664000175000017500000000316114532252172014510 00000000000000// ---------------------------------------------------------------------------- // interleave.h -- MFSK (de)interleaver // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _INTERLEAVE_H #define _INTERLEAVE_H #define INTERLEAVE_FWD 0 #define INTERLEAVE_REV 1 #define PUNCTURE 128 class interleave { protected: int size; int depth; int len; int direction; unsigned char *table; unsigned char *tab(int i, int j, int k) { return &table[(size * size * i) + (size * j) + k]; } public: interleave(int _size, int depth, int dir); ~interleave(); void symbols (unsigned char *psyms); void bits (unsigned int *pbits); void flush(); void init(); }; // ---------------------------------------------------------------------------- #endif fldigi-4.2.05/src/include/fmt_dialog.h0000664000175000017500000000547714611711171014470 00000000000000// ---------------------------------------------------------------------------- // fmt_dialog.h -- fmt modem // // Copyright (C) 2020 // Dave Freese, W1HKJ // JC Gibbons, N8OBJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef fmt_dialog_h #define fmt_dialog_h #include #include #include #include "plot_xy.h" #include #include #include #include #include #include #include #include "combo.h" #include "fmt.h" extern plot_xy *fmt_plot; extern Fl_Group *ref_group; extern Fl_Light_Button *btn_ref_enable; extern Fl_Button *btn_ref_up; extern Fl_Counter *cnt_ref_freq; extern Fl_Button *btn_ref_dn; extern Fl_Button *btn_ref_reset; extern Fl_Button *btn_ref_clear; extern Fl_Output *fmt_ref_val; extern Fl_Output *fmt_ref_db; extern Fl_Box *ref_color; extern Fl_Group *unk_group; extern Fl_Light_Button *btn_unk_enable; extern Fl_Button *btn_unk_up; extern Fl_Counter *cnt_unk_freq; extern Fl_Button *btn_unk_dn; extern Fl_Button *btn_unk_reset; extern Fl_Button *btn_unk_clear; extern Fl_Output *fmt_unk_val; extern Fl_Output *fmt_unk_db; extern Fl_Box *unk_color; extern Fl_Group *fmt_record_group; extern Fl_Light_Button *btn_fmt_record ; extern Fl_Box *box_fmt_recording; extern Fl_ListBox *fmt_rec_interval; extern Fl_ListBox *fmt_scale; extern Fl_ListBox *fmt_cntr_minutes; extern Fl_Group* fmt_panel(int, int, int, int); extern void set_fmt_scope (); extern void clear_ref_scope(); extern void clear_unk_scope(); extern void show_1(bool); extern void show_2(bool); extern void cb_ref_reset (void *); extern void cb_ref_clear (void *); extern void cb_unk_reset (void *); extern void cb_unk_clear (void *); extern void put_unk_value (const char *msg); extern void put_ref_value (const char *msg); extern void put_unk_amp (const char *msg); extern void put_ref_amp (const char *msg); extern void set_ref_freq (void *); extern void set_unk_freq (void *); extern void set_unk_freq_value(double f); extern void set_ref_freq_value(double f); #endif fldigi-4.2.05/src/include/soundconf.h0000664000175000017500000000311714532252172014351 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 David Freese, W1HKJ // Copyright (C) 2015 Robert Stiles, KK5VD // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SOUNDCONF_H #define SOUNDCONF_H enum { SND_IDX_UNKNOWN = -1, SND_IDX_OSS, SND_IDX_PORT, SND_IDX_PULSE, SND_IDX_NULL, SND_IDX_END }; enum { FLDIGI_SRC_BEST, FLDIGI_SRC_MEDIUM, FLDIGI_SRC_FASTEST, #if !(defined(__ppc__) || defined(__powerpc__) || defined(__PPC__)) FLDIGI_SRC_LINEAR, #endif FLDIGI_NUM_SRC }; enum { PA_DEV_NOT_FOUND = 0, PA_DEV_FOUND, PA_EXACT_DEV_FOUND }; extern int sample_rate_converters[FLDIGI_NUM_SRC]; void sound_init(void); void sound_close(void); void sound_update(unsigned idx); #include class Fl_Choice; int pa_set_dev(Fl_Choice *choice, std::string dev_name, int dev_index); extern std::string str_pa_devices; #endif // SOUNDCONF_H fldigi-4.2.05/src/include/mbedtls/0000775000175000017500000000000014611714005013706 500000000000000fldigi-4.2.05/src/include/mbedtls/xtea.h0000664000175000017500000000731414611711171014746 00000000000000/** * \file xtea.h * * \brief XTEA block cipher (32-bit) */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_XTEA_H #define MBEDTLS_XTEA_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #define MBEDTLS_XTEA_ENCRYPT 1 #define MBEDTLS_XTEA_DECRYPT 0 #define MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH -0x0028 /**< The data input has an invalid length. */ /* MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED -0x0029 /**< XTEA hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_XTEA_ALT) // Regular implementation // /** * \brief XTEA context structure */ typedef struct mbedtls_xtea_context { uint32_t k[4]; /*!< key */ } mbedtls_xtea_context; #else /* MBEDTLS_XTEA_ALT */ #include "xtea_alt.h" #endif /* MBEDTLS_XTEA_ALT */ /** * \brief Initialize XTEA context * * \param ctx XTEA context to be initialized */ void mbedtls_xtea_init( mbedtls_xtea_context *ctx ); /** * \brief Clear XTEA context * * \param ctx XTEA context to be cleared */ void mbedtls_xtea_free( mbedtls_xtea_context *ctx ); /** * \brief XTEA key schedule * * \param ctx XTEA context to be initialized * \param key the secret key */ void mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] ); /** * \brief XTEA cipher function * * \param ctx XTEA context * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT * \param input 8-byte input block * \param output 8-byte output block * * \return 0 if successful */ int mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx, int mode, const unsigned char input[8], unsigned char output[8] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief XTEA CBC cipher function * * \param ctx XTEA context * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT * \param length the length of input, multiple of 8 * \param iv initialization vector for CBC mode * \param input input block * \param output output block * * \return 0 if successful, * MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH if the length % 8 != 0 */ int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output); #endif /* MBEDTLS_CIPHER_MODE_CBC */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_xtea_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* xtea.h */ fldigi-4.2.05/src/include/mbedtls/version.h0000664000175000017500000000674414611711171015500 00000000000000/** * \file version.h * * \brief Run-time version information */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * This set of compile-time defines and run-time variables can be used to * determine the version number of the mbed TLS library used. */ #ifndef MBEDTLS_VERSION_H #define MBEDTLS_VERSION_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif /** * The version number x.y.z is split into three parts. * Major, Minor, Patchlevel */ #define MBEDTLS_VERSION_MAJOR 2 #define MBEDTLS_VERSION_MINOR 16 #define MBEDTLS_VERSION_PATCH 0 /** * The single version number has the following structure: * MMNNPP00 * Major version | Minor version | Patch version */ #define MBEDTLS_VERSION_NUMBER 0x02100000 #define MBEDTLS_VERSION_STRING "2.16.0" #define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.16.0" #if defined(MBEDTLS_VERSION_C) #ifdef __cplusplus extern "C" { #endif /** * Get the version number. * * \return The constructed version number in the format * MMNNPP00 (Major, Minor, Patch). */ unsigned int mbedtls_version_get_number( void ); /** * Get the version string ("x.y.z"). * * \param string The string that will receive the value. * (Should be at least 9 bytes in size) */ void mbedtls_version_get_string( char *string ); /** * Get the full version string ("mbed TLS x.y.z"). * * \param string The string that will receive the value. The mbed TLS version * string will use 18 bytes AT MOST including a terminating * null byte. * (So the buffer should be at least 18 bytes to receive this * version string). */ void mbedtls_version_get_string_full( char *string ); /** * \brief Check if support for a feature was compiled into this * mbed TLS binary. This allows you to see at runtime if the * library was for instance compiled with or without * Multi-threading support. * * \note only checks against defines in the sections "System * support", "mbed TLS modules" and "mbed TLS feature * support" in config.h * * \param feature The string for the define to check (e.g. "MBEDTLS_AES_C") * * \return 0 if the feature is present, * -1 if the feature is not present and * -2 if support for feature checking as a whole was not * compiled in. */ int mbedtls_version_check_feature( const char *feature ); #ifdef __cplusplus } #endif #endif /* MBEDTLS_VERSION_C */ #endif /* version.h */ fldigi-4.2.05/src/include/mbedtls/cipher_internal.h0000664000175000017500000000763214611711171017156 00000000000000/** * \file cipher_internal.h * * \brief Cipher wrappers. * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CIPHER_WRAP_H #define MBEDTLS_CIPHER_WRAP_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "cipher.h" #ifdef __cplusplus extern "C" { #endif /** * Base cipher information. The non-mode specific functions and values. */ struct mbedtls_cipher_base_t { /** Base Cipher type (e.g. MBEDTLS_CIPHER_ID_AES) */ mbedtls_cipher_id_t cipher; /** Encrypt using ECB */ int (*ecb_func)( void *ctx, mbedtls_operation_t mode, const unsigned char *input, unsigned char *output ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** Encrypt using CBC */ int (*cbc_func)( void *ctx, mbedtls_operation_t mode, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) /** Encrypt using CFB (Full length) */ int (*cfb_func)( void *ctx, mbedtls_operation_t mode, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) /** Encrypt using OFB (Full length) */ int (*ofb_func)( void *ctx, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) /** Encrypt using CTR */ int (*ctr_func)( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) /** Encrypt or decrypt using XTS. */ int (*xts_func)( void *ctx, mbedtls_operation_t mode, size_t length, const unsigned char data_unit[16], const unsigned char *input, unsigned char *output ); #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) /** Encrypt using STREAM */ int (*stream_func)( void *ctx, size_t length, const unsigned char *input, unsigned char *output ); #endif /** Set key for encryption purposes */ int (*setkey_enc_func)( void *ctx, const unsigned char *key, unsigned int key_bitlen ); /** Set key for decryption purposes */ int (*setkey_dec_func)( void *ctx, const unsigned char *key, unsigned int key_bitlen); /** Allocate a new context */ void * (*ctx_alloc_func)( void ); /** Free the given context */ void (*ctx_free_func)( void *ctx ); }; typedef struct { mbedtls_cipher_type_t type; const mbedtls_cipher_info_t *info; } mbedtls_cipher_definition_t; extern const mbedtls_cipher_definition_t mbedtls_cipher_definitions[]; extern int mbedtls_cipher_supported[]; #ifdef __cplusplus } #endif #endif /* MBEDTLS_CIPHER_WRAP_H */ fldigi-4.2.05/src/include/mbedtls/platform_util.h0000664000175000017500000001670114611711171016666 00000000000000/** * \file platform_util.h * * \brief Common and shared functions used by multiple modules in the Mbed TLS * library. */ /* * Copyright (C) 2018, Arm Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PLATFORM_UTIL_H #define MBEDTLS_PLATFORM_UTIL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #if defined(MBEDTLS_HAVE_TIME_DATE) #include "mbedtls/platform_time.h" #include #endif /* MBEDTLS_HAVE_TIME_DATE */ #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_CHECK_PARAMS) #if defined(MBEDTLS_PARAM_FAILED) /** An alternative definition of MBEDTLS_PARAM_FAILED has been set in config.h. * * This flag can be used to check whether it is safe to assume that * MBEDTLS_PARAM_FAILED() will expand to a call to mbedtls_param_failed(). */ #define MBEDTLS_PARAM_FAILED_ALT #else /* MBEDTLS_PARAM_FAILED */ #define MBEDTLS_PARAM_FAILED( cond ) \ mbedtls_param_failed( #cond, __FILE__, __LINE__ ) /** * \brief User supplied callback function for parameter validation failure. * See #MBEDTLS_CHECK_PARAMS for context. * * This function will be called unless an alternative treatement * is defined through the #MBEDTLS_PARAM_FAILED macro. * * This function can return, and the operation will be aborted, or * alternatively, through use of setjmp()/longjmp() can resume * execution in the application code. * * \param failure_condition The assertion that didn't hold. * \param file The file where the assertion failed. * \param line The line in the file where the assertion failed. */ void mbedtls_param_failed( const char *failure_condition, const char *file, int line ); #endif /* MBEDTLS_PARAM_FAILED */ /* Internal macro meant to be called only from within the library. */ #define MBEDTLS_INTERNAL_VALIDATE_RET( cond, ret ) \ do { \ if( !(cond) ) \ { \ MBEDTLS_PARAM_FAILED( cond ); \ return( ret ); \ } \ } while( 0 ) /* Internal macro meant to be called only from within the library. */ #define MBEDTLS_INTERNAL_VALIDATE( cond ) \ do { \ if( !(cond) ) \ { \ MBEDTLS_PARAM_FAILED( cond ); \ return; \ } \ } while( 0 ) #else /* MBEDTLS_CHECK_PARAMS */ /* Internal macros meant to be called only from within the library. */ #define MBEDTLS_INTERNAL_VALIDATE_RET( cond, ret ) do { } while( 0 ) #define MBEDTLS_INTERNAL_VALIDATE( cond ) do { } while( 0 ) #endif /* MBEDTLS_CHECK_PARAMS */ /* Internal helper macros for deprecating API constants. */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) /* Deliberately don't (yet) export MBEDTLS_DEPRECATED here * to avoid conflict with other headers which define and use * it, too. We might want to move all these definitions here at * some point for uniformity. */ #define MBEDTLS_DEPRECATED __attribute__((deprecated)) MBEDTLS_DEPRECATED typedef char const * mbedtls_deprecated_string_constant_t; #define MBEDTLS_DEPRECATED_STRING_CONSTANT( VAL ) \ ( (mbedtls_deprecated_string_constant_t) ( VAL ) ) MBEDTLS_DEPRECATED typedef int mbedtls_deprecated_numeric_constant_t; #define MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( VAL ) \ ( (mbedtls_deprecated_numeric_constant_t) ( VAL ) ) #undef MBEDTLS_DEPRECATED #else /* MBEDTLS_DEPRECATED_WARNING */ #define MBEDTLS_DEPRECATED_STRING_CONSTANT( VAL ) VAL #define MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( VAL ) VAL #endif /* MBEDTLS_DEPRECATED_WARNING */ #endif /* MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Securely zeroize a buffer * * The function is meant to wipe the data contained in a buffer so * that it can no longer be recovered even if the program memory * is later compromised. Call this function on sensitive data * stored on the stack before returning from a function, and on * sensitive data stored on the heap before freeing the heap * object. * * It is extremely difficult to guarantee that calls to * mbedtls_platform_zeroize() are not removed by aggressive * compiler optimizations in a portable way. For this reason, Mbed * TLS provides the configuration option * MBEDTLS_PLATFORM_ZEROIZE_ALT, which allows users to configure * mbedtls_platform_zeroize() to use a suitable implementation for * their platform and needs * * \param buf Buffer to be zeroized * \param len Length of the buffer in bytes * */ void mbedtls_platform_zeroize( void *buf, size_t len ); #if defined(MBEDTLS_HAVE_TIME_DATE) /** * \brief Platform-specific implementation of gmtime_r() * * The function is a thread-safe abstraction that behaves * similarly to the gmtime_r() function from Unix/POSIX. * * Mbed TLS will try to identify the underlying platform and * make use of an appropriate underlying implementation (e.g. * gmtime_r() for POSIX and gmtime_s() for Windows). If this is * not possible, then gmtime() will be used. In this case, calls * from the library to gmtime() will be guarded by the mutex * mbedtls_threading_gmtime_mutex if MBEDTLS_THREADING_C is * enabled. It is recommended that calls from outside the library * are also guarded by this mutex. * * If MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, then Mbed TLS will * unconditionally use the alternative implementation for * mbedtls_platform_gmtime_r() supplied by the user at compile time. * * \param tt Pointer to an object containing time (in seconds) since the * epoch to be converted * \param tm_buf Pointer to an object where the results will be stored * * \return Pointer to an object of type struct tm on success, otherwise * NULL */ struct tm *mbedtls_platform_gmtime_r( const mbedtls_time_t *tt, struct tm *tm_buf ); #endif /* MBEDTLS_HAVE_TIME_DATE */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_PLATFORM_UTIL_H */ fldigi-4.2.05/src/include/mbedtls/compat-1.3.h0000664000175000017500000037545614611711171015606 00000000000000/** * \file compat-1.3.h * * \brief Compatibility definitions for using mbed TLS with client code written * for the PolarSSL naming conventions. * * \deprecated Use the new names directly instead */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #warning "Including compat-1.3.h is deprecated" #endif #ifndef MBEDTLS_COMPAT13_H #define MBEDTLS_COMPAT13_H /* * config.h options */ #if defined MBEDTLS_AESNI_C #define POLARSSL_AESNI_C MBEDTLS_AESNI_C #endif #if defined MBEDTLS_AES_ALT #define POLARSSL_AES_ALT MBEDTLS_AES_ALT #endif #if defined MBEDTLS_AES_C #define POLARSSL_AES_C MBEDTLS_AES_C #endif #if defined MBEDTLS_AES_ROM_TABLES #define POLARSSL_AES_ROM_TABLES MBEDTLS_AES_ROM_TABLES #endif #if defined MBEDTLS_ARC4_ALT #define POLARSSL_ARC4_ALT MBEDTLS_ARC4_ALT #endif #if defined MBEDTLS_ARC4_C #define POLARSSL_ARC4_C MBEDTLS_ARC4_C #endif #if defined MBEDTLS_ASN1_PARSE_C #define POLARSSL_ASN1_PARSE_C MBEDTLS_ASN1_PARSE_C #endif #if defined MBEDTLS_ASN1_WRITE_C #define POLARSSL_ASN1_WRITE_C MBEDTLS_ASN1_WRITE_C #endif #if defined MBEDTLS_BASE64_C #define POLARSSL_BASE64_C MBEDTLS_BASE64_C #endif #if defined MBEDTLS_BIGNUM_C #define POLARSSL_BIGNUM_C MBEDTLS_BIGNUM_C #endif #if defined MBEDTLS_BLOWFISH_ALT #define POLARSSL_BLOWFISH_ALT MBEDTLS_BLOWFISH_ALT #endif #if defined MBEDTLS_BLOWFISH_C #define POLARSSL_BLOWFISH_C MBEDTLS_BLOWFISH_C #endif #if defined MBEDTLS_CAMELLIA_ALT #define POLARSSL_CAMELLIA_ALT MBEDTLS_CAMELLIA_ALT #endif #if defined MBEDTLS_CAMELLIA_C #define POLARSSL_CAMELLIA_C MBEDTLS_CAMELLIA_C #endif #if defined MBEDTLS_CAMELLIA_SMALL_MEMORY #define POLARSSL_CAMELLIA_SMALL_MEMORY MBEDTLS_CAMELLIA_SMALL_MEMORY #endif #if defined MBEDTLS_CCM_C #define POLARSSL_CCM_C MBEDTLS_CCM_C #endif #if defined MBEDTLS_CERTS_C #define POLARSSL_CERTS_C MBEDTLS_CERTS_C #endif #if defined MBEDTLS_CIPHER_C #define POLARSSL_CIPHER_C MBEDTLS_CIPHER_C #endif #if defined MBEDTLS_CIPHER_MODE_CBC #define POLARSSL_CIPHER_MODE_CBC MBEDTLS_CIPHER_MODE_CBC #endif #if defined MBEDTLS_CIPHER_MODE_CFB #define POLARSSL_CIPHER_MODE_CFB MBEDTLS_CIPHER_MODE_CFB #endif #if defined MBEDTLS_CIPHER_MODE_CTR #define POLARSSL_CIPHER_MODE_CTR MBEDTLS_CIPHER_MODE_CTR #endif #if defined MBEDTLS_CIPHER_NULL_CIPHER #define POLARSSL_CIPHER_NULL_CIPHER MBEDTLS_CIPHER_NULL_CIPHER #endif #if defined MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS #define POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS #endif #if defined MBEDTLS_CIPHER_PADDING_PKCS7 #define POLARSSL_CIPHER_PADDING_PKCS7 MBEDTLS_CIPHER_PADDING_PKCS7 #endif #if defined MBEDTLS_CIPHER_PADDING_ZEROS #define POLARSSL_CIPHER_PADDING_ZEROS MBEDTLS_CIPHER_PADDING_ZEROS #endif #if defined MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN #define POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN #endif #if defined MBEDTLS_CTR_DRBG_C #define POLARSSL_CTR_DRBG_C MBEDTLS_CTR_DRBG_C #endif #if defined MBEDTLS_DEBUG_C #define POLARSSL_DEBUG_C MBEDTLS_DEBUG_C #endif #if defined MBEDTLS_DEPRECATED_REMOVED #define POLARSSL_DEPRECATED_REMOVED MBEDTLS_DEPRECATED_REMOVED #endif #if defined MBEDTLS_DEPRECATED_WARNING #define POLARSSL_DEPRECATED_WARNING MBEDTLS_DEPRECATED_WARNING #endif #if defined MBEDTLS_DES_ALT #define POLARSSL_DES_ALT MBEDTLS_DES_ALT #endif #if defined MBEDTLS_DES_C #define POLARSSL_DES_C MBEDTLS_DES_C #endif #if defined MBEDTLS_DHM_C #define POLARSSL_DHM_C MBEDTLS_DHM_C #endif #if defined MBEDTLS_ECDH_C #define POLARSSL_ECDH_C MBEDTLS_ECDH_C #endif #if defined MBEDTLS_ECDSA_C #define POLARSSL_ECDSA_C MBEDTLS_ECDSA_C #endif #if defined MBEDTLS_ECDSA_DETERMINISTIC #define POLARSSL_ECDSA_DETERMINISTIC MBEDTLS_ECDSA_DETERMINISTIC #endif #if defined MBEDTLS_ECP_C #define POLARSSL_ECP_C MBEDTLS_ECP_C #endif #if defined MBEDTLS_ECP_DP_BP256R1_ENABLED #define POLARSSL_ECP_DP_BP256R1_ENABLED MBEDTLS_ECP_DP_BP256R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_BP384R1_ENABLED #define POLARSSL_ECP_DP_BP384R1_ENABLED MBEDTLS_ECP_DP_BP384R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_BP512R1_ENABLED #define POLARSSL_ECP_DP_BP512R1_ENABLED MBEDTLS_ECP_DP_BP512R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_CURVE25519_ENABLED #define POLARSSL_ECP_DP_M255_ENABLED MBEDTLS_ECP_DP_CURVE25519_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP192K1_ENABLED #define POLARSSL_ECP_DP_SECP192K1_ENABLED MBEDTLS_ECP_DP_SECP192K1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP192R1_ENABLED #define POLARSSL_ECP_DP_SECP192R1_ENABLED MBEDTLS_ECP_DP_SECP192R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP224K1_ENABLED #define POLARSSL_ECP_DP_SECP224K1_ENABLED MBEDTLS_ECP_DP_SECP224K1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP224R1_ENABLED #define POLARSSL_ECP_DP_SECP224R1_ENABLED MBEDTLS_ECP_DP_SECP224R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP256K1_ENABLED #define POLARSSL_ECP_DP_SECP256K1_ENABLED MBEDTLS_ECP_DP_SECP256K1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP256R1_ENABLED #define POLARSSL_ECP_DP_SECP256R1_ENABLED MBEDTLS_ECP_DP_SECP256R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP384R1_ENABLED #define POLARSSL_ECP_DP_SECP384R1_ENABLED MBEDTLS_ECP_DP_SECP384R1_ENABLED #endif #if defined MBEDTLS_ECP_DP_SECP521R1_ENABLED #define POLARSSL_ECP_DP_SECP521R1_ENABLED MBEDTLS_ECP_DP_SECP521R1_ENABLED #endif #if defined MBEDTLS_ECP_FIXED_POINT_OPTIM #define POLARSSL_ECP_FIXED_POINT_OPTIM MBEDTLS_ECP_FIXED_POINT_OPTIM #endif #if defined MBEDTLS_ECP_MAX_BITS #define POLARSSL_ECP_MAX_BITS MBEDTLS_ECP_MAX_BITS #endif #if defined MBEDTLS_ECP_NIST_OPTIM #define POLARSSL_ECP_NIST_OPTIM MBEDTLS_ECP_NIST_OPTIM #endif #if defined MBEDTLS_ECP_WINDOW_SIZE #define POLARSSL_ECP_WINDOW_SIZE MBEDTLS_ECP_WINDOW_SIZE #endif #if defined MBEDTLS_ENABLE_WEAK_CIPHERSUITES #define POLARSSL_ENABLE_WEAK_CIPHERSUITES MBEDTLS_ENABLE_WEAK_CIPHERSUITES #endif #if defined MBEDTLS_ENTROPY_C #define POLARSSL_ENTROPY_C MBEDTLS_ENTROPY_C #endif #if defined MBEDTLS_ENTROPY_FORCE_SHA256 #define POLARSSL_ENTROPY_FORCE_SHA256 MBEDTLS_ENTROPY_FORCE_SHA256 #endif #if defined MBEDTLS_ERROR_C #define POLARSSL_ERROR_C MBEDTLS_ERROR_C #endif #if defined MBEDTLS_ERROR_STRERROR_DUMMY #define POLARSSL_ERROR_STRERROR_DUMMY MBEDTLS_ERROR_STRERROR_DUMMY #endif #if defined MBEDTLS_FS_IO #define POLARSSL_FS_IO MBEDTLS_FS_IO #endif #if defined MBEDTLS_GCM_C #define POLARSSL_GCM_C MBEDTLS_GCM_C #endif #if defined MBEDTLS_GENPRIME #define POLARSSL_GENPRIME MBEDTLS_GENPRIME #endif #if defined MBEDTLS_HAVEGE_C #define POLARSSL_HAVEGE_C MBEDTLS_HAVEGE_C #endif #if defined MBEDTLS_HAVE_ASM #define POLARSSL_HAVE_ASM MBEDTLS_HAVE_ASM #endif #if defined MBEDTLS_HAVE_SSE2 #define POLARSSL_HAVE_SSE2 MBEDTLS_HAVE_SSE2 #endif #if defined MBEDTLS_HAVE_TIME #define POLARSSL_HAVE_TIME MBEDTLS_HAVE_TIME #endif #if defined MBEDTLS_HMAC_DRBG_C #define POLARSSL_HMAC_DRBG_C MBEDTLS_HMAC_DRBG_C #endif #if defined MBEDTLS_HMAC_DRBG_MAX_INPUT #define POLARSSL_HMAC_DRBG_MAX_INPUT MBEDTLS_HMAC_DRBG_MAX_INPUT #endif #if defined MBEDTLS_HMAC_DRBG_MAX_REQUEST #define POLARSSL_HMAC_DRBG_MAX_REQUEST MBEDTLS_HMAC_DRBG_MAX_REQUEST #endif #if defined MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT #define POLARSSL_HMAC_DRBG_MAX_SEED_INPUT MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT #endif #if defined MBEDTLS_HMAC_DRBG_RESEED_INTERVAL #define POLARSSL_HMAC_DRBG_RESEED_INTERVAL MBEDTLS_HMAC_DRBG_RESEED_INTERVAL #endif #if defined MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED #define POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED #define POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED #define POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_PSK_ENABLED #define POLARSSL_KEY_EXCHANGE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_PSK_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_RSA_ENABLED #define POLARSSL_KEY_EXCHANGE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_ENABLED #endif #if defined MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED #define POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED #endif #if defined MBEDTLS_MD2_ALT #define POLARSSL_MD2_ALT MBEDTLS_MD2_ALT #endif #if defined MBEDTLS_MD2_C #define POLARSSL_MD2_C MBEDTLS_MD2_C #endif #if defined MBEDTLS_MD2_PROCESS_ALT #define POLARSSL_MD2_PROCESS_ALT MBEDTLS_MD2_PROCESS_ALT #endif #if defined MBEDTLS_MD4_ALT #define POLARSSL_MD4_ALT MBEDTLS_MD4_ALT #endif #if defined MBEDTLS_MD4_C #define POLARSSL_MD4_C MBEDTLS_MD4_C #endif #if defined MBEDTLS_MD4_PROCESS_ALT #define POLARSSL_MD4_PROCESS_ALT MBEDTLS_MD4_PROCESS_ALT #endif #if defined MBEDTLS_MD5_ALT #define POLARSSL_MD5_ALT MBEDTLS_MD5_ALT #endif #if defined MBEDTLS_MD5_C #define POLARSSL_MD5_C MBEDTLS_MD5_C #endif #if defined MBEDTLS_MD5_PROCESS_ALT #define POLARSSL_MD5_PROCESS_ALT MBEDTLS_MD5_PROCESS_ALT #endif #if defined MBEDTLS_MD_C #define POLARSSL_MD_C MBEDTLS_MD_C #endif #if defined MBEDTLS_MEMORY_ALIGN_MULTIPLE #define POLARSSL_MEMORY_ALIGN_MULTIPLE MBEDTLS_MEMORY_ALIGN_MULTIPLE #endif #if defined MBEDTLS_MEMORY_BACKTRACE #define POLARSSL_MEMORY_BACKTRACE MBEDTLS_MEMORY_BACKTRACE #endif #if defined MBEDTLS_MEMORY_BUFFER_ALLOC_C #define POLARSSL_MEMORY_BUFFER_ALLOC_C MBEDTLS_MEMORY_BUFFER_ALLOC_C #endif #if defined MBEDTLS_MEMORY_DEBUG #define POLARSSL_MEMORY_DEBUG MBEDTLS_MEMORY_DEBUG #endif #if defined MBEDTLS_MPI_MAX_SIZE #define POLARSSL_MPI_MAX_SIZE MBEDTLS_MPI_MAX_SIZE #endif #if defined MBEDTLS_MPI_WINDOW_SIZE #define POLARSSL_MPI_WINDOW_SIZE MBEDTLS_MPI_WINDOW_SIZE #endif #if defined MBEDTLS_NET_C #define POLARSSL_NET_C MBEDTLS_NET_C #endif #if defined MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES #define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES #endif #if defined MBEDTLS_NO_PLATFORM_ENTROPY #define POLARSSL_NO_PLATFORM_ENTROPY MBEDTLS_NO_PLATFORM_ENTROPY #endif #if defined MBEDTLS_OID_C #define POLARSSL_OID_C MBEDTLS_OID_C #endif #if defined MBEDTLS_PADLOCK_C #define POLARSSL_PADLOCK_C MBEDTLS_PADLOCK_C #endif #if defined MBEDTLS_PEM_PARSE_C #define POLARSSL_PEM_PARSE_C MBEDTLS_PEM_PARSE_C #endif #if defined MBEDTLS_PEM_WRITE_C #define POLARSSL_PEM_WRITE_C MBEDTLS_PEM_WRITE_C #endif #if defined MBEDTLS_PKCS11_C #define POLARSSL_PKCS11_C MBEDTLS_PKCS11_C #endif #if defined MBEDTLS_PKCS12_C #define POLARSSL_PKCS12_C MBEDTLS_PKCS12_C #endif #if defined MBEDTLS_PKCS1_V15 #define POLARSSL_PKCS1_V15 MBEDTLS_PKCS1_V15 #endif #if defined MBEDTLS_PKCS1_V21 #define POLARSSL_PKCS1_V21 MBEDTLS_PKCS1_V21 #endif #if defined MBEDTLS_PKCS5_C #define POLARSSL_PKCS5_C MBEDTLS_PKCS5_C #endif #if defined MBEDTLS_PK_C #define POLARSSL_PK_C MBEDTLS_PK_C #endif #if defined MBEDTLS_PK_PARSE_C #define POLARSSL_PK_PARSE_C MBEDTLS_PK_PARSE_C #endif #if defined MBEDTLS_PK_PARSE_EC_EXTENDED #define POLARSSL_PK_PARSE_EC_EXTENDED MBEDTLS_PK_PARSE_EC_EXTENDED #endif #if defined MBEDTLS_PK_RSA_ALT_SUPPORT #define POLARSSL_PK_RSA_ALT_SUPPORT MBEDTLS_PK_RSA_ALT_SUPPORT #endif #if defined MBEDTLS_PK_WRITE_C #define POLARSSL_PK_WRITE_C MBEDTLS_PK_WRITE_C #endif #if defined MBEDTLS_PLATFORM_C #define POLARSSL_PLATFORM_C MBEDTLS_PLATFORM_C #endif #if defined MBEDTLS_PLATFORM_EXIT_ALT #define POLARSSL_PLATFORM_EXIT_ALT MBEDTLS_PLATFORM_EXIT_ALT #endif #if defined MBEDTLS_PLATFORM_EXIT_MACRO #define POLARSSL_PLATFORM_EXIT_MACRO MBEDTLS_PLATFORM_EXIT_MACRO #endif #if defined MBEDTLS_PLATFORM_FPRINTF_ALT #define POLARSSL_PLATFORM_FPRINTF_ALT MBEDTLS_PLATFORM_FPRINTF_ALT #endif #if defined MBEDTLS_PLATFORM_FPRINTF_MACRO #define POLARSSL_PLATFORM_FPRINTF_MACRO MBEDTLS_PLATFORM_FPRINTF_MACRO #endif #if defined MBEDTLS_PLATFORM_FREE_MACRO #define POLARSSL_PLATFORM_FREE_MACRO MBEDTLS_PLATFORM_FREE_MACRO #endif #if defined MBEDTLS_PLATFORM_MEMORY #define POLARSSL_PLATFORM_MEMORY MBEDTLS_PLATFORM_MEMORY #endif #if defined MBEDTLS_PLATFORM_NO_STD_FUNCTIONS #define POLARSSL_PLATFORM_NO_STD_FUNCTIONS MBEDTLS_PLATFORM_NO_STD_FUNCTIONS #endif #if defined MBEDTLS_PLATFORM_PRINTF_ALT #define POLARSSL_PLATFORM_PRINTF_ALT MBEDTLS_PLATFORM_PRINTF_ALT #endif #if defined MBEDTLS_PLATFORM_PRINTF_MACRO #define POLARSSL_PLATFORM_PRINTF_MACRO MBEDTLS_PLATFORM_PRINTF_MACRO #endif #if defined MBEDTLS_PLATFORM_SNPRINTF_ALT #define POLARSSL_PLATFORM_SNPRINTF_ALT MBEDTLS_PLATFORM_SNPRINTF_ALT #endif #if defined MBEDTLS_PLATFORM_SNPRINTF_MACRO #define POLARSSL_PLATFORM_SNPRINTF_MACRO MBEDTLS_PLATFORM_SNPRINTF_MACRO #endif #if defined MBEDTLS_PLATFORM_STD_EXIT #define POLARSSL_PLATFORM_STD_EXIT MBEDTLS_PLATFORM_STD_EXIT #endif #if defined MBEDTLS_PLATFORM_STD_FPRINTF #define POLARSSL_PLATFORM_STD_FPRINTF MBEDTLS_PLATFORM_STD_FPRINTF #endif #if defined MBEDTLS_PLATFORM_STD_FREE #define POLARSSL_PLATFORM_STD_FREE MBEDTLS_PLATFORM_STD_FREE #endif #if defined MBEDTLS_PLATFORM_STD_MEM_HDR #define POLARSSL_PLATFORM_STD_MEM_HDR MBEDTLS_PLATFORM_STD_MEM_HDR #endif #if defined MBEDTLS_PLATFORM_STD_PRINTF #define POLARSSL_PLATFORM_STD_PRINTF MBEDTLS_PLATFORM_STD_PRINTF #endif #if defined MBEDTLS_PLATFORM_STD_SNPRINTF #define POLARSSL_PLATFORM_STD_SNPRINTF MBEDTLS_PLATFORM_STD_SNPRINTF #endif #if defined MBEDTLS_PSK_MAX_LEN #define POLARSSL_PSK_MAX_LEN MBEDTLS_PSK_MAX_LEN #endif #if defined MBEDTLS_REMOVE_ARC4_CIPHERSUITES #define POLARSSL_REMOVE_ARC4_CIPHERSUITES MBEDTLS_REMOVE_ARC4_CIPHERSUITES #endif #if defined MBEDTLS_RIPEMD160_ALT #define POLARSSL_RIPEMD160_ALT MBEDTLS_RIPEMD160_ALT #endif #if defined MBEDTLS_RIPEMD160_C #define POLARSSL_RIPEMD160_C MBEDTLS_RIPEMD160_C #endif #if defined MBEDTLS_RIPEMD160_PROCESS_ALT #define POLARSSL_RIPEMD160_PROCESS_ALT MBEDTLS_RIPEMD160_PROCESS_ALT #endif #if defined MBEDTLS_RSA_C #define POLARSSL_RSA_C MBEDTLS_RSA_C #endif #if defined MBEDTLS_RSA_NO_CRT #define POLARSSL_RSA_NO_CRT MBEDTLS_RSA_NO_CRT #endif #if defined MBEDTLS_SELF_TEST #define POLARSSL_SELF_TEST MBEDTLS_SELF_TEST #endif #if defined MBEDTLS_SHA1_ALT #define POLARSSL_SHA1_ALT MBEDTLS_SHA1_ALT #endif #if defined MBEDTLS_SHA1_C #define POLARSSL_SHA1_C MBEDTLS_SHA1_C #endif #if defined MBEDTLS_SHA1_PROCESS_ALT #define POLARSSL_SHA1_PROCESS_ALT MBEDTLS_SHA1_PROCESS_ALT #endif #if defined MBEDTLS_SHA256_ALT #define POLARSSL_SHA256_ALT MBEDTLS_SHA256_ALT #endif #if defined MBEDTLS_SHA256_C #define POLARSSL_SHA256_C MBEDTLS_SHA256_C #endif #if defined MBEDTLS_SHA256_PROCESS_ALT #define POLARSSL_SHA256_PROCESS_ALT MBEDTLS_SHA256_PROCESS_ALT #endif #if defined MBEDTLS_SHA512_ALT #define POLARSSL_SHA512_ALT MBEDTLS_SHA512_ALT #endif #if defined MBEDTLS_SHA512_C #define POLARSSL_SHA512_C MBEDTLS_SHA512_C #endif #if defined MBEDTLS_SHA512_PROCESS_ALT #define POLARSSL_SHA512_PROCESS_ALT MBEDTLS_SHA512_PROCESS_ALT #endif #if defined MBEDTLS_SSL_ALL_ALERT_MESSAGES #define POLARSSL_SSL_ALL_ALERT_MESSAGES MBEDTLS_SSL_ALL_ALERT_MESSAGES #endif #if defined MBEDTLS_SSL_ALPN #define POLARSSL_SSL_ALPN MBEDTLS_SSL_ALPN #endif #if defined MBEDTLS_SSL_CACHE_C #define POLARSSL_SSL_CACHE_C MBEDTLS_SSL_CACHE_C #endif #if defined MBEDTLS_SSL_CBC_RECORD_SPLITTING #define POLARSSL_SSL_CBC_RECORD_SPLITTING MBEDTLS_SSL_CBC_RECORD_SPLITTING #endif #if defined MBEDTLS_SSL_CLI_C #define POLARSSL_SSL_CLI_C MBEDTLS_SSL_CLI_C #endif #if defined MBEDTLS_SSL_COOKIE_C #define POLARSSL_SSL_COOKIE_C MBEDTLS_SSL_COOKIE_C #endif #if defined MBEDTLS_SSL_COOKIE_TIMEOUT #define POLARSSL_SSL_COOKIE_TIMEOUT MBEDTLS_SSL_COOKIE_TIMEOUT #endif #if defined MBEDTLS_SSL_DEBUG_ALL #define POLARSSL_SSL_DEBUG_ALL MBEDTLS_SSL_DEBUG_ALL #endif #if defined MBEDTLS_SSL_DTLS_ANTI_REPLAY #define POLARSSL_SSL_DTLS_ANTI_REPLAY MBEDTLS_SSL_DTLS_ANTI_REPLAY #endif #if defined MBEDTLS_SSL_DTLS_BADMAC_LIMIT #define POLARSSL_SSL_DTLS_BADMAC_LIMIT MBEDTLS_SSL_DTLS_BADMAC_LIMIT #endif #if defined MBEDTLS_SSL_DTLS_HELLO_VERIFY #define POLARSSL_SSL_DTLS_HELLO_VERIFY MBEDTLS_SSL_DTLS_HELLO_VERIFY #endif #if defined MBEDTLS_SSL_ENCRYPT_THEN_MAC #define POLARSSL_SSL_ENCRYPT_THEN_MAC MBEDTLS_SSL_ENCRYPT_THEN_MAC #endif #if defined MBEDTLS_SSL_EXTENDED_MASTER_SECRET #define POLARSSL_SSL_EXTENDED_MASTER_SECRET MBEDTLS_SSL_EXTENDED_MASTER_SECRET #endif #if defined MBEDTLS_SSL_FALLBACK_SCSV #define POLARSSL_SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV #endif #if defined MBEDTLS_SSL_HW_RECORD_ACCEL #define POLARSSL_SSL_HW_RECORD_ACCEL MBEDTLS_SSL_HW_RECORD_ACCEL #endif #if defined MBEDTLS_SSL_MAX_FRAGMENT_LENGTH #define POLARSSL_SSL_MAX_FRAGMENT_LENGTH MBEDTLS_SSL_MAX_FRAGMENT_LENGTH #endif #if defined MBEDTLS_SSL_PROTO_DTLS #define POLARSSL_SSL_PROTO_DTLS MBEDTLS_SSL_PROTO_DTLS #endif #if defined MBEDTLS_SSL_PROTO_SSL3 #define POLARSSL_SSL_PROTO_SSL3 MBEDTLS_SSL_PROTO_SSL3 #endif #if defined MBEDTLS_SSL_PROTO_TLS1 #define POLARSSL_SSL_PROTO_TLS1 MBEDTLS_SSL_PROTO_TLS1 #endif #if defined MBEDTLS_SSL_PROTO_TLS1_1 #define POLARSSL_SSL_PROTO_TLS1_1 MBEDTLS_SSL_PROTO_TLS1_1 #endif #if defined MBEDTLS_SSL_PROTO_TLS1_2 #define POLARSSL_SSL_PROTO_TLS1_2 MBEDTLS_SSL_PROTO_TLS1_2 #endif #if defined MBEDTLS_SSL_RENEGOTIATION #define POLARSSL_SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION #endif #if defined MBEDTLS_SSL_SERVER_NAME_INDICATION #define POLARSSL_SSL_SERVER_NAME_INDICATION MBEDTLS_SSL_SERVER_NAME_INDICATION #endif #if defined MBEDTLS_SSL_SESSION_TICKETS #define POLARSSL_SSL_SESSION_TICKETS MBEDTLS_SSL_SESSION_TICKETS #endif #if defined MBEDTLS_SSL_SRV_C #define POLARSSL_SSL_SRV_C MBEDTLS_SSL_SRV_C #endif #if defined MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE #define POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE #endif #if defined MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO #define POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO #endif #if defined MBEDTLS_SSL_TLS_C #define POLARSSL_SSL_TLS_C MBEDTLS_SSL_TLS_C #endif #if defined MBEDTLS_SSL_TRUNCATED_HMAC #define POLARSSL_SSL_TRUNCATED_HMAC MBEDTLS_SSL_TRUNCATED_HMAC #endif #if defined MBEDTLS_THREADING_ALT #define POLARSSL_THREADING_ALT MBEDTLS_THREADING_ALT #endif #if defined MBEDTLS_THREADING_C #define POLARSSL_THREADING_C MBEDTLS_THREADING_C #endif #if defined MBEDTLS_THREADING_PTHREAD #define POLARSSL_THREADING_PTHREAD MBEDTLS_THREADING_PTHREAD #endif #if defined MBEDTLS_TIMING_ALT #define POLARSSL_TIMING_ALT MBEDTLS_TIMING_ALT #endif #if defined MBEDTLS_TIMING_C #define POLARSSL_TIMING_C MBEDTLS_TIMING_C #endif #if defined MBEDTLS_VERSION_C #define POLARSSL_VERSION_C MBEDTLS_VERSION_C #endif #if defined MBEDTLS_VERSION_FEATURES #define POLARSSL_VERSION_FEATURES MBEDTLS_VERSION_FEATURES #endif #if defined MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 #define POLARSSL_X509_ALLOW_EXTENSIONS_NON_V3 MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 #endif #if defined MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION #define POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION #endif #if defined MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE #define POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE #endif #if defined MBEDTLS_X509_CHECK_KEY_USAGE #define POLARSSL_X509_CHECK_KEY_USAGE MBEDTLS_X509_CHECK_KEY_USAGE #endif #if defined MBEDTLS_X509_CREATE_C #define POLARSSL_X509_CREATE_C MBEDTLS_X509_CREATE_C #endif #if defined MBEDTLS_X509_CRL_PARSE_C #define POLARSSL_X509_CRL_PARSE_C MBEDTLS_X509_CRL_PARSE_C #endif #if defined MBEDTLS_X509_CRT_PARSE_C #define POLARSSL_X509_CRT_PARSE_C MBEDTLS_X509_CRT_PARSE_C #endif #if defined MBEDTLS_X509_CRT_WRITE_C #define POLARSSL_X509_CRT_WRITE_C MBEDTLS_X509_CRT_WRITE_C #endif #if defined MBEDTLS_X509_CSR_PARSE_C #define POLARSSL_X509_CSR_PARSE_C MBEDTLS_X509_CSR_PARSE_C #endif #if defined MBEDTLS_X509_CSR_WRITE_C #define POLARSSL_X509_CSR_WRITE_C MBEDTLS_X509_CSR_WRITE_C #endif #if defined MBEDTLS_X509_MAX_INTERMEDIATE_CA #define POLARSSL_X509_MAX_INTERMEDIATE_CA MBEDTLS_X509_MAX_INTERMEDIATE_CA #endif #if defined MBEDTLS_X509_RSASSA_PSS_SUPPORT #define POLARSSL_X509_RSASSA_PSS_SUPPORT MBEDTLS_X509_RSASSA_PSS_SUPPORT #endif #if defined MBEDTLS_X509_USE_C #define POLARSSL_X509_USE_C MBEDTLS_X509_USE_C #endif #if defined MBEDTLS_XTEA_ALT #define POLARSSL_XTEA_ALT MBEDTLS_XTEA_ALT #endif #if defined MBEDTLS_XTEA_C #define POLARSSL_XTEA_C MBEDTLS_XTEA_C #endif #if defined MBEDTLS_ZLIB_SUPPORT #define POLARSSL_ZLIB_SUPPORT MBEDTLS_ZLIB_SUPPORT #endif /* * Misc names (macros, types, functions, enum constants...) */ #define AES_DECRYPT MBEDTLS_AES_DECRYPT #define AES_ENCRYPT MBEDTLS_AES_ENCRYPT #define ASN1_BIT_STRING MBEDTLS_ASN1_BIT_STRING #define ASN1_BMP_STRING MBEDTLS_ASN1_BMP_STRING #define ASN1_BOOLEAN MBEDTLS_ASN1_BOOLEAN #define ASN1_CHK_ADD MBEDTLS_ASN1_CHK_ADD #define ASN1_CONSTRUCTED MBEDTLS_ASN1_CONSTRUCTED #define ASN1_CONTEXT_SPECIFIC MBEDTLS_ASN1_CONTEXT_SPECIFIC #define ASN1_GENERALIZED_TIME MBEDTLS_ASN1_GENERALIZED_TIME #define ASN1_IA5_STRING MBEDTLS_ASN1_IA5_STRING #define ASN1_INTEGER MBEDTLS_ASN1_INTEGER #define ASN1_NULL MBEDTLS_ASN1_NULL #define ASN1_OCTET_STRING MBEDTLS_ASN1_OCTET_STRING #define ASN1_OID MBEDTLS_ASN1_OID #define ASN1_PRIMITIVE MBEDTLS_ASN1_PRIMITIVE #define ASN1_PRINTABLE_STRING MBEDTLS_ASN1_PRINTABLE_STRING #define ASN1_SEQUENCE MBEDTLS_ASN1_SEQUENCE #define ASN1_SET MBEDTLS_ASN1_SET #define ASN1_T61_STRING MBEDTLS_ASN1_T61_STRING #define ASN1_UNIVERSAL_STRING MBEDTLS_ASN1_UNIVERSAL_STRING #define ASN1_UTC_TIME MBEDTLS_ASN1_UTC_TIME #define ASN1_UTF8_STRING MBEDTLS_ASN1_UTF8_STRING #define BADCERT_CN_MISMATCH MBEDTLS_X509_BADCERT_CN_MISMATCH #define BADCERT_EXPIRED MBEDTLS_X509_BADCERT_EXPIRED #define BADCERT_FUTURE MBEDTLS_X509_BADCERT_FUTURE #define BADCERT_MISSING MBEDTLS_X509_BADCERT_MISSING #define BADCERT_NOT_TRUSTED MBEDTLS_X509_BADCERT_NOT_TRUSTED #define BADCERT_OTHER MBEDTLS_X509_BADCERT_OTHER #define BADCERT_REVOKED MBEDTLS_X509_BADCERT_REVOKED #define BADCERT_SKIP_VERIFY MBEDTLS_X509_BADCERT_SKIP_VERIFY #define BADCRL_EXPIRED MBEDTLS_X509_BADCRL_EXPIRED #define BADCRL_FUTURE MBEDTLS_X509_BADCRL_FUTURE #define BADCRL_NOT_TRUSTED MBEDTLS_X509_BADCRL_NOT_TRUSTED #define BLOWFISH_BLOCKSIZE MBEDTLS_BLOWFISH_BLOCKSIZE #define BLOWFISH_DECRYPT MBEDTLS_BLOWFISH_DECRYPT #define BLOWFISH_ENCRYPT MBEDTLS_BLOWFISH_ENCRYPT #define BLOWFISH_MAX_KEY MBEDTLS_BLOWFISH_MAX_KEY_BITS #define BLOWFISH_MIN_KEY MBEDTLS_BLOWFISH_MIN_KEY_BITS #define BLOWFISH_ROUNDS MBEDTLS_BLOWFISH_ROUNDS #define CAMELLIA_DECRYPT MBEDTLS_CAMELLIA_DECRYPT #define CAMELLIA_ENCRYPT MBEDTLS_CAMELLIA_ENCRYPT #define COLLECT_SIZE MBEDTLS_HAVEGE_COLLECT_SIZE #define CTR_DRBG_BLOCKSIZE MBEDTLS_CTR_DRBG_BLOCKSIZE #define CTR_DRBG_ENTROPY_LEN MBEDTLS_CTR_DRBG_ENTROPY_LEN #define CTR_DRBG_KEYBITS MBEDTLS_CTR_DRBG_KEYBITS #define CTR_DRBG_KEYSIZE MBEDTLS_CTR_DRBG_KEYSIZE #define CTR_DRBG_MAX_INPUT MBEDTLS_CTR_DRBG_MAX_INPUT #define CTR_DRBG_MAX_REQUEST MBEDTLS_CTR_DRBG_MAX_REQUEST #define CTR_DRBG_MAX_SEED_INPUT MBEDTLS_CTR_DRBG_MAX_SEED_INPUT #define CTR_DRBG_PR_OFF MBEDTLS_CTR_DRBG_PR_OFF #define CTR_DRBG_PR_ON MBEDTLS_CTR_DRBG_PR_ON #define CTR_DRBG_RESEED_INTERVAL MBEDTLS_CTR_DRBG_RESEED_INTERVAL #define CTR_DRBG_SEEDLEN MBEDTLS_CTR_DRBG_SEEDLEN #define DEPRECATED MBEDTLS_DEPRECATED #define DES_DECRYPT MBEDTLS_DES_DECRYPT #define DES_ENCRYPT MBEDTLS_DES_ENCRYPT #define DES_KEY_SIZE MBEDTLS_DES_KEY_SIZE #define ENTROPY_BLOCK_SIZE MBEDTLS_ENTROPY_BLOCK_SIZE #define ENTROPY_MAX_GATHER MBEDTLS_ENTROPY_MAX_GATHER #define ENTROPY_MAX_SEED_SIZE MBEDTLS_ENTROPY_MAX_SEED_SIZE #define ENTROPY_MAX_SOURCES MBEDTLS_ENTROPY_MAX_SOURCES #define ENTROPY_MIN_HARDCLOCK MBEDTLS_ENTROPY_MIN_HARDCLOCK #define ENTROPY_MIN_HAVEGE MBEDTLS_ENTROPY_MIN_HAVEGE #define ENTROPY_MIN_PLATFORM MBEDTLS_ENTROPY_MIN_PLATFORM #define ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_SOURCE_MANUAL #define EXT_AUTHORITY_KEY_IDENTIFIER MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER #define EXT_BASIC_CONSTRAINTS MBEDTLS_X509_EXT_BASIC_CONSTRAINTS #define EXT_CERTIFICATE_POLICIES MBEDTLS_X509_EXT_CERTIFICATE_POLICIES #define EXT_CRL_DISTRIBUTION_POINTS MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS #define EXT_EXTENDED_KEY_USAGE MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE #define EXT_FRESHEST_CRL MBEDTLS_X509_EXT_FRESHEST_CRL #define EXT_INIHIBIT_ANYPOLICY MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY #define EXT_ISSUER_ALT_NAME MBEDTLS_X509_EXT_ISSUER_ALT_NAME #define EXT_KEY_USAGE MBEDTLS_X509_EXT_KEY_USAGE #define EXT_NAME_CONSTRAINTS MBEDTLS_X509_EXT_NAME_CONSTRAINTS #define EXT_NS_CERT_TYPE MBEDTLS_X509_EXT_NS_CERT_TYPE #define EXT_POLICY_CONSTRAINTS MBEDTLS_X509_EXT_POLICY_CONSTRAINTS #define EXT_POLICY_MAPPINGS MBEDTLS_X509_EXT_POLICY_MAPPINGS #define EXT_SUBJECT_ALT_NAME MBEDTLS_X509_EXT_SUBJECT_ALT_NAME #define EXT_SUBJECT_DIRECTORY_ATTRS MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS #define EXT_SUBJECT_KEY_IDENTIFIER MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER #define GCM_DECRYPT MBEDTLS_GCM_DECRYPT #define GCM_ENCRYPT MBEDTLS_GCM_ENCRYPT #define KU_CRL_SIGN MBEDTLS_X509_KU_CRL_SIGN #define KU_DATA_ENCIPHERMENT MBEDTLS_X509_KU_DATA_ENCIPHERMENT #define KU_DIGITAL_SIGNATURE MBEDTLS_X509_KU_DIGITAL_SIGNATURE #define KU_KEY_AGREEMENT MBEDTLS_X509_KU_KEY_AGREEMENT #define KU_KEY_CERT_SIGN MBEDTLS_X509_KU_KEY_CERT_SIGN #define KU_KEY_ENCIPHERMENT MBEDTLS_X509_KU_KEY_ENCIPHERMENT #define KU_NON_REPUDIATION MBEDTLS_X509_KU_NON_REPUDIATION #define LN_2_DIV_LN_10_SCALE100 MBEDTLS_LN_2_DIV_LN_10_SCALE100 #define MEMORY_VERIFY_ALLOC MBEDTLS_MEMORY_VERIFY_ALLOC #define MEMORY_VERIFY_ALWAYS MBEDTLS_MEMORY_VERIFY_ALWAYS #define MEMORY_VERIFY_FREE MBEDTLS_MEMORY_VERIFY_FREE #define MEMORY_VERIFY_NONE MBEDTLS_MEMORY_VERIFY_NONE #define MPI_CHK MBEDTLS_MPI_CHK #define NET_PROTO_TCP MBEDTLS_NET_PROTO_TCP #define NET_PROTO_UDP MBEDTLS_NET_PROTO_UDP #define NS_CERT_TYPE_EMAIL MBEDTLS_X509_NS_CERT_TYPE_EMAIL #define NS_CERT_TYPE_EMAIL_CA MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA #define NS_CERT_TYPE_OBJECT_SIGNING MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING #define NS_CERT_TYPE_OBJECT_SIGNING_CA MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA #define NS_CERT_TYPE_RESERVED MBEDTLS_X509_NS_CERT_TYPE_RESERVED #define NS_CERT_TYPE_SSL_CA MBEDTLS_X509_NS_CERT_TYPE_SSL_CA #define NS_CERT_TYPE_SSL_CLIENT MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT #define NS_CERT_TYPE_SSL_SERVER MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER #define OID_ANSI_X9_62 MBEDTLS_OID_ANSI_X9_62 #define OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE #define OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD #define OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62_SIG #define OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 #define OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE #define OID_AT MBEDTLS_OID_AT #define OID_AT_CN MBEDTLS_OID_AT_CN #define OID_AT_COUNTRY MBEDTLS_OID_AT_COUNTRY #define OID_AT_DN_QUALIFIER MBEDTLS_OID_AT_DN_QUALIFIER #define OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT_GENERATION_QUALIFIER #define OID_AT_GIVEN_NAME MBEDTLS_OID_AT_GIVEN_NAME #define OID_AT_INITIALS MBEDTLS_OID_AT_INITIALS #define OID_AT_LOCALITY MBEDTLS_OID_AT_LOCALITY #define OID_AT_ORGANIZATION MBEDTLS_OID_AT_ORGANIZATION #define OID_AT_ORG_UNIT MBEDTLS_OID_AT_ORG_UNIT #define OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT_POSTAL_ADDRESS #define OID_AT_POSTAL_CODE MBEDTLS_OID_AT_POSTAL_CODE #define OID_AT_PSEUDONYM MBEDTLS_OID_AT_PSEUDONYM #define OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT_SERIAL_NUMBER #define OID_AT_STATE MBEDTLS_OID_AT_STATE #define OID_AT_SUR_NAME MBEDTLS_OID_AT_SUR_NAME #define OID_AT_TITLE MBEDTLS_OID_AT_TITLE #define OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT_UNIQUE_IDENTIFIER #define OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER #define OID_BASIC_CONSTRAINTS MBEDTLS_OID_BASIC_CONSTRAINTS #define OID_CERTICOM MBEDTLS_OID_CERTICOM #define OID_CERTIFICATE_POLICIES MBEDTLS_OID_CERTIFICATE_POLICIES #define OID_CLIENT_AUTH MBEDTLS_OID_CLIENT_AUTH #define OID_CMP MBEDTLS_OID_CMP #define OID_CODE_SIGNING MBEDTLS_OID_CODE_SIGNING #define OID_COUNTRY_US MBEDTLS_OID_COUNTRY_US #define OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_CRL_DISTRIBUTION_POINTS #define OID_CRL_NUMBER MBEDTLS_OID_CRL_NUMBER #define OID_DES_CBC MBEDTLS_OID_DES_CBC #define OID_DES_EDE3_CBC MBEDTLS_OID_DES_EDE3_CBC #define OID_DIGEST_ALG_MD2 MBEDTLS_OID_DIGEST_ALG_MD2 #define OID_DIGEST_ALG_MD4 MBEDTLS_OID_DIGEST_ALG_MD4 #define OID_DIGEST_ALG_MD5 MBEDTLS_OID_DIGEST_ALG_MD5 #define OID_DIGEST_ALG_SHA1 MBEDTLS_OID_DIGEST_ALG_SHA1 #define OID_DIGEST_ALG_SHA224 MBEDTLS_OID_DIGEST_ALG_SHA224 #define OID_DIGEST_ALG_SHA256 MBEDTLS_OID_DIGEST_ALG_SHA256 #define OID_DIGEST_ALG_SHA384 MBEDTLS_OID_DIGEST_ALG_SHA384 #define OID_DIGEST_ALG_SHA512 MBEDTLS_OID_DIGEST_ALG_SHA512 #define OID_DOMAIN_COMPONENT MBEDTLS_OID_DOMAIN_COMPONENT #define OID_ECDSA_SHA1 MBEDTLS_OID_ECDSA_SHA1 #define OID_ECDSA_SHA224 MBEDTLS_OID_ECDSA_SHA224 #define OID_ECDSA_SHA256 MBEDTLS_OID_ECDSA_SHA256 #define OID_ECDSA_SHA384 MBEDTLS_OID_ECDSA_SHA384 #define OID_ECDSA_SHA512 MBEDTLS_OID_ECDSA_SHA512 #define OID_EC_ALG_ECDH MBEDTLS_OID_EC_ALG_ECDH #define OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_EC_ALG_UNRESTRICTED #define OID_EC_BRAINPOOL_V1 MBEDTLS_OID_EC_BRAINPOOL_V1 #define OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_GRP_BP256R1 #define OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_GRP_BP384R1 #define OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_GRP_BP512R1 #define OID_EC_GRP_SECP192K1 MBEDTLS_OID_EC_GRP_SECP192K1 #define OID_EC_GRP_SECP192R1 MBEDTLS_OID_EC_GRP_SECP192R1 #define OID_EC_GRP_SECP224K1 MBEDTLS_OID_EC_GRP_SECP224K1 #define OID_EC_GRP_SECP224R1 MBEDTLS_OID_EC_GRP_SECP224R1 #define OID_EC_GRP_SECP256K1 MBEDTLS_OID_EC_GRP_SECP256K1 #define OID_EC_GRP_SECP256R1 MBEDTLS_OID_EC_GRP_SECP256R1 #define OID_EC_GRP_SECP384R1 MBEDTLS_OID_EC_GRP_SECP384R1 #define OID_EC_GRP_SECP521R1 MBEDTLS_OID_EC_GRP_SECP521R1 #define OID_EMAIL_PROTECTION MBEDTLS_OID_EMAIL_PROTECTION #define OID_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE #define OID_FRESHEST_CRL MBEDTLS_OID_FRESHEST_CRL #define OID_GOV MBEDTLS_OID_GOV #define OID_HMAC_SHA1 MBEDTLS_OID_HMAC_SHA1 #define OID_ID_CE MBEDTLS_OID_ID_CE #define OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_INIHIBIT_ANYPOLICY #define OID_ISO_CCITT_DS MBEDTLS_OID_ISO_CCITT_DS #define OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ISO_IDENTIFIED_ORG #define OID_ISO_ITU_COUNTRY MBEDTLS_OID_ISO_ITU_COUNTRY #define OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_US_ORG #define OID_ISO_MEMBER_BODIES MBEDTLS_OID_ISO_MEMBER_BODIES #define OID_ISSUER_ALT_NAME MBEDTLS_OID_ISSUER_ALT_NAME #define OID_KEY_USAGE MBEDTLS_OID_KEY_USAGE #define OID_KP MBEDTLS_OID_KP #define OID_MGF1 MBEDTLS_OID_MGF1 #define OID_NAME_CONSTRAINTS MBEDTLS_OID_NAME_CONSTRAINTS #define OID_NETSCAPE MBEDTLS_OID_NETSCAPE #define OID_NS_BASE_URL MBEDTLS_OID_NS_BASE_URL #define OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CA_POLICY_URL #define OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CA_REVOCATION_URL #define OID_NS_CERT MBEDTLS_OID_NS_CERT #define OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_CERT_SEQUENCE #define OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT_TYPE #define OID_NS_COMMENT MBEDTLS_OID_NS_COMMENT #define OID_NS_DATA_TYPE MBEDTLS_OID_NS_DATA_TYPE #define OID_NS_RENEWAL_URL MBEDTLS_OID_NS_RENEWAL_URL #define OID_NS_REVOCATION_URL MBEDTLS_OID_NS_REVOCATION_URL #define OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_SSL_SERVER_NAME #define OID_OCSP_SIGNING MBEDTLS_OID_OCSP_SIGNING #define OID_OIW_SECSIG MBEDTLS_OID_OIW_SECSIG #define OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG_ALG #define OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_SHA1 #define OID_ORGANIZATION MBEDTLS_OID_ORGANIZATION #define OID_ORG_ANSI_X9_62 MBEDTLS_OID_ORG_ANSI_X9_62 #define OID_ORG_CERTICOM MBEDTLS_OID_ORG_CERTICOM #define OID_ORG_DOD MBEDTLS_OID_ORG_DOD #define OID_ORG_GOV MBEDTLS_OID_ORG_GOV #define OID_ORG_NETSCAPE MBEDTLS_OID_ORG_NETSCAPE #define OID_ORG_OIW MBEDTLS_OID_ORG_OIW #define OID_ORG_RSA_DATA_SECURITY MBEDTLS_OID_ORG_RSA_DATA_SECURITY #define OID_ORG_TELETRUST MBEDTLS_OID_ORG_TELETRUST #define OID_PKCS MBEDTLS_OID_PKCS #define OID_PKCS1 MBEDTLS_OID_PKCS1 #define OID_PKCS12 MBEDTLS_OID_PKCS12 #define OID_PKCS12_PBE MBEDTLS_OID_PKCS12_PBE #define OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC #define OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC #define OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC #define OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC #define OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 #define OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 #define OID_PKCS1_MD2 MBEDTLS_OID_PKCS1_MD2 #define OID_PKCS1_MD4 MBEDTLS_OID_PKCS1_MD4 #define OID_PKCS1_MD5 MBEDTLS_OID_PKCS1_MD5 #define OID_PKCS1_RSA MBEDTLS_OID_PKCS1_RSA #define OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1_SHA1 #define OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1_SHA224 #define OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1_SHA256 #define OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1_SHA384 #define OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1_SHA512 #define OID_PKCS5 MBEDTLS_OID_PKCS5 #define OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5_PBES2 #define OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC #define OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC #define OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC #define OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC #define OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC #define OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC #define OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5_PBKDF2 #define OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5_PBMAC1 #define OID_PKCS9 MBEDTLS_OID_PKCS9 #define OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9_CSR_EXT_REQ #define OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9_EMAIL #define OID_PKIX MBEDTLS_OID_PKIX #define OID_POLICY_CONSTRAINTS MBEDTLS_OID_POLICY_CONSTRAINTS #define OID_POLICY_MAPPINGS MBEDTLS_OID_POLICY_MAPPINGS #define OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD #define OID_RSASSA_PSS MBEDTLS_OID_RSASSA_PSS #define OID_RSA_COMPANY MBEDTLS_OID_RSA_COMPANY #define OID_RSA_SHA_OBS MBEDTLS_OID_RSA_SHA_OBS #define OID_SERVER_AUTH MBEDTLS_OID_SERVER_AUTH #define OID_SIZE MBEDTLS_OID_SIZE #define OID_SUBJECT_ALT_NAME MBEDTLS_OID_SUBJECT_ALT_NAME #define OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS #define OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER #define OID_TELETRUST MBEDTLS_OID_TELETRUST #define OID_TIME_STAMPING MBEDTLS_OID_TIME_STAMPING #define PADLOCK_ACE MBEDTLS_PADLOCK_ACE #define PADLOCK_ALIGN16 MBEDTLS_PADLOCK_ALIGN16 #define PADLOCK_PHE MBEDTLS_PADLOCK_PHE #define PADLOCK_PMM MBEDTLS_PADLOCK_PMM #define PADLOCK_RNG MBEDTLS_PADLOCK_RNG #define PKCS12_DERIVE_IV MBEDTLS_PKCS12_DERIVE_IV #define PKCS12_DERIVE_KEY MBEDTLS_PKCS12_DERIVE_KEY #define PKCS12_DERIVE_MAC_KEY MBEDTLS_PKCS12_DERIVE_MAC_KEY #define PKCS12_PBE_DECRYPT MBEDTLS_PKCS12_PBE_DECRYPT #define PKCS12_PBE_ENCRYPT MBEDTLS_PKCS12_PBE_ENCRYPT #define PKCS5_DECRYPT MBEDTLS_PKCS5_DECRYPT #define PKCS5_ENCRYPT MBEDTLS_PKCS5_ENCRYPT #define POLARSSL_AESNI_AES MBEDTLS_AESNI_AES #define POLARSSL_AESNI_CLMUL MBEDTLS_AESNI_CLMUL #define POLARSSL_AESNI_H MBEDTLS_AESNI_H #define POLARSSL_AES_H MBEDTLS_AES_H #define POLARSSL_ARC4_H MBEDTLS_ARC4_H #define POLARSSL_ASN1_H MBEDTLS_ASN1_H #define POLARSSL_ASN1_WRITE_H MBEDTLS_ASN1_WRITE_H #define POLARSSL_BASE64_H MBEDTLS_BASE64_H #define POLARSSL_BIGNUM_H MBEDTLS_BIGNUM_H #define POLARSSL_BLOWFISH_H MBEDTLS_BLOWFISH_H #define POLARSSL_BN_MUL_H MBEDTLS_BN_MUL_H #define POLARSSL_CAMELLIA_H MBEDTLS_CAMELLIA_H #define POLARSSL_CCM_H MBEDTLS_CCM_H #define POLARSSL_CERTS_H MBEDTLS_CERTS_H #define POLARSSL_CHECK_CONFIG_H MBEDTLS_CHECK_CONFIG_H #define POLARSSL_CIPHERSUITE_NODTLS MBEDTLS_CIPHERSUITE_NODTLS #define POLARSSL_CIPHERSUITE_SHORT_TAG MBEDTLS_CIPHERSUITE_SHORT_TAG #define POLARSSL_CIPHERSUITE_WEAK MBEDTLS_CIPHERSUITE_WEAK #define POLARSSL_CIPHER_AES_128_CBC MBEDTLS_CIPHER_AES_128_CBC #define POLARSSL_CIPHER_AES_128_CCM MBEDTLS_CIPHER_AES_128_CCM #define POLARSSL_CIPHER_AES_128_CFB128 MBEDTLS_CIPHER_AES_128_CFB128 #define POLARSSL_CIPHER_AES_128_CTR MBEDTLS_CIPHER_AES_128_CTR #define POLARSSL_CIPHER_AES_128_ECB MBEDTLS_CIPHER_AES_128_ECB #define POLARSSL_CIPHER_AES_128_GCM MBEDTLS_CIPHER_AES_128_GCM #define POLARSSL_CIPHER_AES_192_CBC MBEDTLS_CIPHER_AES_192_CBC #define POLARSSL_CIPHER_AES_192_CCM MBEDTLS_CIPHER_AES_192_CCM #define POLARSSL_CIPHER_AES_192_CFB128 MBEDTLS_CIPHER_AES_192_CFB128 #define POLARSSL_CIPHER_AES_192_CTR MBEDTLS_CIPHER_AES_192_CTR #define POLARSSL_CIPHER_AES_192_ECB MBEDTLS_CIPHER_AES_192_ECB #define POLARSSL_CIPHER_AES_192_GCM MBEDTLS_CIPHER_AES_192_GCM #define POLARSSL_CIPHER_AES_256_CBC MBEDTLS_CIPHER_AES_256_CBC #define POLARSSL_CIPHER_AES_256_CCM MBEDTLS_CIPHER_AES_256_CCM #define POLARSSL_CIPHER_AES_256_CFB128 MBEDTLS_CIPHER_AES_256_CFB128 #define POLARSSL_CIPHER_AES_256_CTR MBEDTLS_CIPHER_AES_256_CTR #define POLARSSL_CIPHER_AES_256_ECB MBEDTLS_CIPHER_AES_256_ECB #define POLARSSL_CIPHER_AES_256_GCM MBEDTLS_CIPHER_AES_256_GCM #define POLARSSL_CIPHER_ARC4_128 MBEDTLS_CIPHER_ARC4_128 #define POLARSSL_CIPHER_BLOWFISH_CBC MBEDTLS_CIPHER_BLOWFISH_CBC #define POLARSSL_CIPHER_BLOWFISH_CFB64 MBEDTLS_CIPHER_BLOWFISH_CFB64 #define POLARSSL_CIPHER_BLOWFISH_CTR MBEDTLS_CIPHER_BLOWFISH_CTR #define POLARSSL_CIPHER_BLOWFISH_ECB MBEDTLS_CIPHER_BLOWFISH_ECB #define POLARSSL_CIPHER_CAMELLIA_128_CBC MBEDTLS_CIPHER_CAMELLIA_128_CBC #define POLARSSL_CIPHER_CAMELLIA_128_CCM MBEDTLS_CIPHER_CAMELLIA_128_CCM #define POLARSSL_CIPHER_CAMELLIA_128_CFB128 MBEDTLS_CIPHER_CAMELLIA_128_CFB128 #define POLARSSL_CIPHER_CAMELLIA_128_CTR MBEDTLS_CIPHER_CAMELLIA_128_CTR #define POLARSSL_CIPHER_CAMELLIA_128_ECB MBEDTLS_CIPHER_CAMELLIA_128_ECB #define POLARSSL_CIPHER_CAMELLIA_128_GCM MBEDTLS_CIPHER_CAMELLIA_128_GCM #define POLARSSL_CIPHER_CAMELLIA_192_CBC MBEDTLS_CIPHER_CAMELLIA_192_CBC #define POLARSSL_CIPHER_CAMELLIA_192_CCM MBEDTLS_CIPHER_CAMELLIA_192_CCM #define POLARSSL_CIPHER_CAMELLIA_192_CFB128 MBEDTLS_CIPHER_CAMELLIA_192_CFB128 #define POLARSSL_CIPHER_CAMELLIA_192_CTR MBEDTLS_CIPHER_CAMELLIA_192_CTR #define POLARSSL_CIPHER_CAMELLIA_192_ECB MBEDTLS_CIPHER_CAMELLIA_192_ECB #define POLARSSL_CIPHER_CAMELLIA_192_GCM MBEDTLS_CIPHER_CAMELLIA_192_GCM #define POLARSSL_CIPHER_CAMELLIA_256_CBC MBEDTLS_CIPHER_CAMELLIA_256_CBC #define POLARSSL_CIPHER_CAMELLIA_256_CCM MBEDTLS_CIPHER_CAMELLIA_256_CCM #define POLARSSL_CIPHER_CAMELLIA_256_CFB128 MBEDTLS_CIPHER_CAMELLIA_256_CFB128 #define POLARSSL_CIPHER_CAMELLIA_256_CTR MBEDTLS_CIPHER_CAMELLIA_256_CTR #define POLARSSL_CIPHER_CAMELLIA_256_ECB MBEDTLS_CIPHER_CAMELLIA_256_ECB #define POLARSSL_CIPHER_CAMELLIA_256_GCM MBEDTLS_CIPHER_CAMELLIA_256_GCM #define POLARSSL_CIPHER_DES_CBC MBEDTLS_CIPHER_DES_CBC #define POLARSSL_CIPHER_DES_ECB MBEDTLS_CIPHER_DES_ECB #define POLARSSL_CIPHER_DES_EDE3_CBC MBEDTLS_CIPHER_DES_EDE3_CBC #define POLARSSL_CIPHER_DES_EDE3_ECB MBEDTLS_CIPHER_DES_EDE3_ECB #define POLARSSL_CIPHER_DES_EDE_CBC MBEDTLS_CIPHER_DES_EDE_CBC #define POLARSSL_CIPHER_DES_EDE_ECB MBEDTLS_CIPHER_DES_EDE_ECB #define POLARSSL_CIPHER_H MBEDTLS_CIPHER_H #define POLARSSL_CIPHER_ID_3DES MBEDTLS_CIPHER_ID_3DES #define POLARSSL_CIPHER_ID_AES MBEDTLS_CIPHER_ID_AES #define POLARSSL_CIPHER_ID_ARC4 MBEDTLS_CIPHER_ID_ARC4 #define POLARSSL_CIPHER_ID_BLOWFISH MBEDTLS_CIPHER_ID_BLOWFISH #define POLARSSL_CIPHER_ID_CAMELLIA MBEDTLS_CIPHER_ID_CAMELLIA #define POLARSSL_CIPHER_ID_DES MBEDTLS_CIPHER_ID_DES #define POLARSSL_CIPHER_ID_NONE MBEDTLS_CIPHER_ID_NONE #define POLARSSL_CIPHER_ID_NULL MBEDTLS_CIPHER_ID_NULL #define POLARSSL_CIPHER_MODE_AEAD MBEDTLS_CIPHER_MODE_AEAD #define POLARSSL_CIPHER_MODE_STREAM MBEDTLS_CIPHER_MODE_STREAM #define POLARSSL_CIPHER_MODE_WITH_PADDING MBEDTLS_CIPHER_MODE_WITH_PADDING #define POLARSSL_CIPHER_NONE MBEDTLS_CIPHER_NONE #define POLARSSL_CIPHER_NULL MBEDTLS_CIPHER_NULL #define POLARSSL_CIPHER_VARIABLE_IV_LEN MBEDTLS_CIPHER_VARIABLE_IV_LEN #define POLARSSL_CIPHER_VARIABLE_KEY_LEN MBEDTLS_CIPHER_VARIABLE_KEY_LEN #define POLARSSL_CIPHER_WRAP_H MBEDTLS_CIPHER_WRAP_H #define POLARSSL_CONFIG_H MBEDTLS_CONFIG_H #define POLARSSL_CTR_DRBG_H MBEDTLS_CTR_DRBG_H #define POLARSSL_DEBUG_H MBEDTLS_DEBUG_H #define POLARSSL_DECRYPT MBEDTLS_DECRYPT #define POLARSSL_DES_H MBEDTLS_DES_H #define POLARSSL_DHM_H MBEDTLS_DHM_H #define POLARSSL_DHM_RFC3526_MODP_2048_G MBEDTLS_DHM_RFC3526_MODP_2048_G #define POLARSSL_DHM_RFC3526_MODP_2048_P MBEDTLS_DHM_RFC3526_MODP_2048_P #define POLARSSL_DHM_RFC3526_MODP_3072_G MBEDTLS_DHM_RFC3526_MODP_3072_G #define POLARSSL_DHM_RFC3526_MODP_3072_P MBEDTLS_DHM_RFC3526_MODP_3072_P #define POLARSSL_DHM_RFC5114_MODP_2048_G MBEDTLS_DHM_RFC5114_MODP_2048_G #define POLARSSL_DHM_RFC5114_MODP_2048_P MBEDTLS_DHM_RFC5114_MODP_2048_P #define POLARSSL_ECDH_H MBEDTLS_ECDH_H #define POLARSSL_ECDH_OURS MBEDTLS_ECDH_OURS #define POLARSSL_ECDH_THEIRS MBEDTLS_ECDH_THEIRS #define POLARSSL_ECDSA_H MBEDTLS_ECDSA_H #define POLARSSL_ECP_DP_BP256R1 MBEDTLS_ECP_DP_BP256R1 #define POLARSSL_ECP_DP_BP384R1 MBEDTLS_ECP_DP_BP384R1 #define POLARSSL_ECP_DP_BP512R1 MBEDTLS_ECP_DP_BP512R1 #define POLARSSL_ECP_DP_M255 MBEDTLS_ECP_DP_CURVE25519 #define POLARSSL_ECP_DP_MAX MBEDTLS_ECP_DP_MAX #define POLARSSL_ECP_DP_NONE MBEDTLS_ECP_DP_NONE #define POLARSSL_ECP_DP_SECP192K1 MBEDTLS_ECP_DP_SECP192K1 #define POLARSSL_ECP_DP_SECP192R1 MBEDTLS_ECP_DP_SECP192R1 #define POLARSSL_ECP_DP_SECP224K1 MBEDTLS_ECP_DP_SECP224K1 #define POLARSSL_ECP_DP_SECP224R1 MBEDTLS_ECP_DP_SECP224R1 #define POLARSSL_ECP_DP_SECP256K1 MBEDTLS_ECP_DP_SECP256K1 #define POLARSSL_ECP_DP_SECP256R1 MBEDTLS_ECP_DP_SECP256R1 #define POLARSSL_ECP_DP_SECP384R1 MBEDTLS_ECP_DP_SECP384R1 #define POLARSSL_ECP_DP_SECP521R1 MBEDTLS_ECP_DP_SECP521R1 #define POLARSSL_ECP_H MBEDTLS_ECP_H #define POLARSSL_ECP_MAX_BYTES MBEDTLS_ECP_MAX_BYTES #define POLARSSL_ECP_MAX_PT_LEN MBEDTLS_ECP_MAX_PT_LEN #define POLARSSL_ECP_PF_COMPRESSED MBEDTLS_ECP_PF_COMPRESSED #define POLARSSL_ECP_PF_UNCOMPRESSED MBEDTLS_ECP_PF_UNCOMPRESSED #define POLARSSL_ECP_TLS_NAMED_CURVE MBEDTLS_ECP_TLS_NAMED_CURVE #define POLARSSL_ENCRYPT MBEDTLS_ENCRYPT #define POLARSSL_ENTROPY_H MBEDTLS_ENTROPY_H #define POLARSSL_ENTROPY_POLL_H MBEDTLS_ENTROPY_POLL_H #define POLARSSL_ENTROPY_SHA256_ACCUMULATOR MBEDTLS_ENTROPY_SHA256_ACCUMULATOR #define POLARSSL_ENTROPY_SHA512_ACCUMULATOR MBEDTLS_ENTROPY_SHA512_ACCUMULATOR #define POLARSSL_ERROR_H MBEDTLS_ERROR_H #define POLARSSL_ERR_AES_INVALID_INPUT_LENGTH MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH #define POLARSSL_ERR_AES_INVALID_KEY_LENGTH MBEDTLS_ERR_AES_INVALID_KEY_LENGTH #define POLARSSL_ERR_ASN1_BUF_TOO_SMALL MBEDTLS_ERR_ASN1_BUF_TOO_SMALL #define POLARSSL_ERR_ASN1_INVALID_DATA MBEDTLS_ERR_ASN1_INVALID_DATA #define POLARSSL_ERR_ASN1_INVALID_LENGTH MBEDTLS_ERR_ASN1_INVALID_LENGTH #define POLARSSL_ERR_ASN1_LENGTH_MISMATCH MBEDTLS_ERR_ASN1_LENGTH_MISMATCH #define POLARSSL_ERR_ASN1_MALLOC_FAILED MBEDTLS_ERR_ASN1_ALLOC_FAILED #define POLARSSL_ERR_ASN1_OUT_OF_DATA MBEDTLS_ERR_ASN1_OUT_OF_DATA #define POLARSSL_ERR_ASN1_UNEXPECTED_TAG MBEDTLS_ERR_ASN1_UNEXPECTED_TAG #define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL #define POLARSSL_ERR_BASE64_INVALID_CHARACTER MBEDTLS_ERR_BASE64_INVALID_CHARACTER #define POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH #define POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH #define POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH #define POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH #define POLARSSL_ERR_CCM_AUTH_FAILED MBEDTLS_ERR_CCM_AUTH_FAILED #define POLARSSL_ERR_CCM_BAD_INPUT MBEDTLS_ERR_CCM_BAD_INPUT #define POLARSSL_ERR_CIPHER_ALLOC_FAILED MBEDTLS_ERR_CIPHER_ALLOC_FAILED #define POLARSSL_ERR_CIPHER_AUTH_FAILED MBEDTLS_ERR_CIPHER_AUTH_FAILED #define POLARSSL_ERR_CIPHER_BAD_INPUT_DATA MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA #define POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE #define POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED #define POLARSSL_ERR_CIPHER_INVALID_PADDING MBEDTLS_ERR_CIPHER_INVALID_PADDING #define POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED #define POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR #define POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG #define POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG #define POLARSSL_ERR_DES_INVALID_INPUT_LENGTH MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH #define POLARSSL_ERR_DHM_BAD_INPUT_DATA MBEDTLS_ERR_DHM_BAD_INPUT_DATA #define POLARSSL_ERR_DHM_CALC_SECRET_FAILED MBEDTLS_ERR_DHM_CALC_SECRET_FAILED #define POLARSSL_ERR_DHM_FILE_IO_ERROR MBEDTLS_ERR_DHM_FILE_IO_ERROR #define POLARSSL_ERR_DHM_INVALID_FORMAT MBEDTLS_ERR_DHM_INVALID_FORMAT #define POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED #define POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED #define POLARSSL_ERR_DHM_MALLOC_FAILED MBEDTLS_ERR_DHM_ALLOC_FAILED #define POLARSSL_ERR_DHM_READ_PARAMS_FAILED MBEDTLS_ERR_DHM_READ_PARAMS_FAILED #define POLARSSL_ERR_DHM_READ_PUBLIC_FAILED MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED #define POLARSSL_ERR_ECP_BAD_INPUT_DATA MBEDTLS_ERR_ECP_BAD_INPUT_DATA #define POLARSSL_ERR_ECP_BUFFER_TOO_SMALL MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL #define POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE #define POLARSSL_ERR_ECP_INVALID_KEY MBEDTLS_ERR_ECP_INVALID_KEY #define POLARSSL_ERR_ECP_MALLOC_FAILED MBEDTLS_ERR_ECP_ALLOC_FAILED #define POLARSSL_ERR_ECP_RANDOM_FAILED MBEDTLS_ERR_ECP_RANDOM_FAILED #define POLARSSL_ERR_ECP_SIG_LEN_MISMATCH MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH #define POLARSSL_ERR_ECP_VERIFY_FAILED MBEDTLS_ERR_ECP_VERIFY_FAILED #define POLARSSL_ERR_ENTROPY_FILE_IO_ERROR MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR #define POLARSSL_ERR_ENTROPY_MAX_SOURCES MBEDTLS_ERR_ENTROPY_MAX_SOURCES #define POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED #define POLARSSL_ERR_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_ENTROPY_SOURCE_FAILED #define POLARSSL_ERR_GCM_AUTH_FAILED MBEDTLS_ERR_GCM_AUTH_FAILED #define POLARSSL_ERR_GCM_BAD_INPUT MBEDTLS_ERR_GCM_BAD_INPUT #define POLARSSL_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED #define POLARSSL_ERR_HMAC_DRBG_FILE_IO_ERROR MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR #define POLARSSL_ERR_HMAC_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG #define POLARSSL_ERR_HMAC_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG #define POLARSSL_ERR_MD_ALLOC_FAILED MBEDTLS_ERR_MD_ALLOC_FAILED #define POLARSSL_ERR_MD_BAD_INPUT_DATA MBEDTLS_ERR_MD_BAD_INPUT_DATA #define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE #define POLARSSL_ERR_MD_FILE_IO_ERROR MBEDTLS_ERR_MD_FILE_IO_ERROR #define POLARSSL_ERR_MPI_BAD_INPUT_DATA MBEDTLS_ERR_MPI_BAD_INPUT_DATA #define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL #define POLARSSL_ERR_MPI_DIVISION_BY_ZERO MBEDTLS_ERR_MPI_DIVISION_BY_ZERO #define POLARSSL_ERR_MPI_FILE_IO_ERROR MBEDTLS_ERR_MPI_FILE_IO_ERROR #define POLARSSL_ERR_MPI_INVALID_CHARACTER MBEDTLS_ERR_MPI_INVALID_CHARACTER #define POLARSSL_ERR_MPI_MALLOC_FAILED MBEDTLS_ERR_MPI_ALLOC_FAILED #define POLARSSL_ERR_MPI_NEGATIVE_VALUE MBEDTLS_ERR_MPI_NEGATIVE_VALUE #define POLARSSL_ERR_MPI_NOT_ACCEPTABLE MBEDTLS_ERR_MPI_NOT_ACCEPTABLE #define POLARSSL_ERR_NET_ACCEPT_FAILED MBEDTLS_ERR_NET_ACCEPT_FAILED #define POLARSSL_ERR_NET_BIND_FAILED MBEDTLS_ERR_NET_BIND_FAILED #define POLARSSL_ERR_NET_CONNECT_FAILED MBEDTLS_ERR_NET_CONNECT_FAILED #define POLARSSL_ERR_NET_CONN_RESET MBEDTLS_ERR_NET_CONN_RESET #define POLARSSL_ERR_NET_LISTEN_FAILED MBEDTLS_ERR_NET_LISTEN_FAILED #define POLARSSL_ERR_NET_RECV_FAILED MBEDTLS_ERR_NET_RECV_FAILED #define POLARSSL_ERR_NET_SEND_FAILED MBEDTLS_ERR_NET_SEND_FAILED #define POLARSSL_ERR_NET_SOCKET_FAILED MBEDTLS_ERR_NET_SOCKET_FAILED #define POLARSSL_ERR_NET_TIMEOUT MBEDTLS_ERR_SSL_TIMEOUT #define POLARSSL_ERR_NET_UNKNOWN_HOST MBEDTLS_ERR_NET_UNKNOWN_HOST #define POLARSSL_ERR_NET_WANT_READ MBEDTLS_ERR_SSL_WANT_READ #define POLARSSL_ERR_NET_WANT_WRITE MBEDTLS_ERR_SSL_WANT_WRITE #define POLARSSL_ERR_OID_BUF_TOO_SMALL MBEDTLS_ERR_OID_BUF_TOO_SMALL #define POLARSSL_ERR_OID_NOT_FOUND MBEDTLS_ERR_OID_NOT_FOUND #define POLARSSL_ERR_PADLOCK_DATA_MISALIGNED MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED #define POLARSSL_ERR_PEM_BAD_INPUT_DATA MBEDTLS_ERR_PEM_BAD_INPUT_DATA #define POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE #define POLARSSL_ERR_PEM_INVALID_DATA MBEDTLS_ERR_PEM_INVALID_DATA #define POLARSSL_ERR_PEM_INVALID_ENC_IV MBEDTLS_ERR_PEM_INVALID_ENC_IV #define POLARSSL_ERR_PEM_MALLOC_FAILED MBEDTLS_ERR_PEM_ALLOC_FAILED #define POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT #define POLARSSL_ERR_PEM_PASSWORD_MISMATCH MBEDTLS_ERR_PEM_PASSWORD_MISMATCH #define POLARSSL_ERR_PEM_PASSWORD_REQUIRED MBEDTLS_ERR_PEM_PASSWORD_REQUIRED #define POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG #define POLARSSL_ERR_PKCS12_BAD_INPUT_DATA MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA #define POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE #define POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH #define POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT #define POLARSSL_ERR_PKCS5_BAD_INPUT_DATA MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA #define POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE #define POLARSSL_ERR_PKCS5_INVALID_FORMAT MBEDTLS_ERR_PKCS5_INVALID_FORMAT #define POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH #define POLARSSL_ERR_PK_BAD_INPUT_DATA MBEDTLS_ERR_PK_BAD_INPUT_DATA #define POLARSSL_ERR_PK_FEATURE_UNAVAILABLE MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE #define POLARSSL_ERR_PK_FILE_IO_ERROR MBEDTLS_ERR_PK_FILE_IO_ERROR #define POLARSSL_ERR_PK_INVALID_ALG MBEDTLS_ERR_PK_INVALID_ALG #define POLARSSL_ERR_PK_INVALID_PUBKEY MBEDTLS_ERR_PK_INVALID_PUBKEY #define POLARSSL_ERR_PK_KEY_INVALID_FORMAT MBEDTLS_ERR_PK_KEY_INVALID_FORMAT #define POLARSSL_ERR_PK_KEY_INVALID_VERSION MBEDTLS_ERR_PK_KEY_INVALID_VERSION #define POLARSSL_ERR_PK_MALLOC_FAILED MBEDTLS_ERR_PK_ALLOC_FAILED #define POLARSSL_ERR_PK_PASSWORD_MISMATCH MBEDTLS_ERR_PK_PASSWORD_MISMATCH #define POLARSSL_ERR_PK_PASSWORD_REQUIRED MBEDTLS_ERR_PK_PASSWORD_REQUIRED #define POLARSSL_ERR_PK_SIG_LEN_MISMATCH MBEDTLS_ERR_PK_SIG_LEN_MISMATCH #define POLARSSL_ERR_PK_TYPE_MISMATCH MBEDTLS_ERR_PK_TYPE_MISMATCH #define POLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE #define POLARSSL_ERR_PK_UNKNOWN_PK_ALG MBEDTLS_ERR_PK_UNKNOWN_PK_ALG #define POLARSSL_ERR_RSA_BAD_INPUT_DATA MBEDTLS_ERR_RSA_BAD_INPUT_DATA #define POLARSSL_ERR_RSA_INVALID_PADDING MBEDTLS_ERR_RSA_INVALID_PADDING #define POLARSSL_ERR_RSA_KEY_CHECK_FAILED MBEDTLS_ERR_RSA_KEY_CHECK_FAILED #define POLARSSL_ERR_RSA_KEY_GEN_FAILED MBEDTLS_ERR_RSA_KEY_GEN_FAILED #define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE #define POLARSSL_ERR_RSA_PRIVATE_FAILED MBEDTLS_ERR_RSA_PRIVATE_FAILED #define POLARSSL_ERR_RSA_PUBLIC_FAILED MBEDTLS_ERR_RSA_PUBLIC_FAILED #define POLARSSL_ERR_RSA_RNG_FAILED MBEDTLS_ERR_RSA_RNG_FAILED #define POLARSSL_ERR_RSA_VERIFY_FAILED MBEDTLS_ERR_RSA_VERIFY_FAILED #define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE #define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST #define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY #define POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS #define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP #define POLARSSL_ERR_SSL_BAD_HS_FINISHED MBEDTLS_ERR_SSL_BAD_HS_FINISHED #define POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET #define POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION #define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO #define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE #define POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE #define POLARSSL_ERR_SSL_BAD_INPUT_DATA MBEDTLS_ERR_SSL_BAD_INPUT_DATA #define POLARSSL_ERR_SSL_BUFFER_TOO_SMALL MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL #define POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED #define POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED #define POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE #define POLARSSL_ERR_SSL_COMPRESSION_FAILED MBEDTLS_ERR_SSL_COMPRESSION_FAILED #define POLARSSL_ERR_SSL_CONN_EOF MBEDTLS_ERR_SSL_CONN_EOF #define POLARSSL_ERR_SSL_COUNTER_WRAPPING MBEDTLS_ERR_SSL_COUNTER_WRAPPING #define POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE #define POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE #define POLARSSL_ERR_SSL_HELLO_VERIFY_REQUIRED MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED #define POLARSSL_ERR_SSL_HW_ACCEL_FAILED MBEDTLS_ERR_SSL_HW_ACCEL_FAILED #define POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH #define POLARSSL_ERR_SSL_INTERNAL_ERROR MBEDTLS_ERR_SSL_INTERNAL_ERROR #define POLARSSL_ERR_SSL_INVALID_MAC MBEDTLS_ERR_SSL_INVALID_MAC #define POLARSSL_ERR_SSL_INVALID_RECORD MBEDTLS_ERR_SSL_INVALID_RECORD #define POLARSSL_ERR_SSL_MALLOC_FAILED MBEDTLS_ERR_SSL_ALLOC_FAILED #define POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN #define POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE #define POLARSSL_ERR_SSL_NO_RNG MBEDTLS_ERR_SSL_NO_RNG #define POLARSSL_ERR_SSL_NO_USABLE_CIPHERSUITE MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE #define POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY #define POLARSSL_ERR_SSL_PEER_VERIFY_FAILED MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED #define POLARSSL_ERR_SSL_PK_TYPE_MISMATCH MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH #define POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED #define POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED #define POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE #define POLARSSL_ERR_SSL_UNKNOWN_CIPHER MBEDTLS_ERR_SSL_UNKNOWN_CIPHER #define POLARSSL_ERR_SSL_UNKNOWN_IDENTITY MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY #define POLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO #define POLARSSL_ERR_THREADING_BAD_INPUT_DATA MBEDTLS_ERR_THREADING_BAD_INPUT_DATA #define POLARSSL_ERR_THREADING_FEATURE_UNAVAILABLE MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE #define POLARSSL_ERR_THREADING_MUTEX_ERROR MBEDTLS_ERR_THREADING_MUTEX_ERROR #define POLARSSL_ERR_X509_BAD_INPUT_DATA MBEDTLS_ERR_X509_BAD_INPUT_DATA #define POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT #define POLARSSL_ERR_X509_CERT_VERIFY_FAILED MBEDTLS_ERR_X509_CERT_VERIFY_FAILED #define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE #define POLARSSL_ERR_X509_FILE_IO_ERROR MBEDTLS_ERR_X509_FILE_IO_ERROR #define POLARSSL_ERR_X509_INVALID_ALG MBEDTLS_ERR_X509_INVALID_ALG #define POLARSSL_ERR_X509_INVALID_DATE MBEDTLS_ERR_X509_INVALID_DATE #define POLARSSL_ERR_X509_INVALID_EXTENSIONS MBEDTLS_ERR_X509_INVALID_EXTENSIONS #define POLARSSL_ERR_X509_INVALID_FORMAT MBEDTLS_ERR_X509_INVALID_FORMAT #define POLARSSL_ERR_X509_INVALID_NAME MBEDTLS_ERR_X509_INVALID_NAME #define POLARSSL_ERR_X509_INVALID_SERIAL MBEDTLS_ERR_X509_INVALID_SERIAL #define POLARSSL_ERR_X509_INVALID_SIGNATURE MBEDTLS_ERR_X509_INVALID_SIGNATURE #define POLARSSL_ERR_X509_INVALID_VERSION MBEDTLS_ERR_X509_INVALID_VERSION #define POLARSSL_ERR_X509_MALLOC_FAILED MBEDTLS_ERR_X509_ALLOC_FAILED #define POLARSSL_ERR_X509_SIG_MISMATCH MBEDTLS_ERR_X509_SIG_MISMATCH #define POLARSSL_ERR_X509_UNKNOWN_OID MBEDTLS_ERR_X509_UNKNOWN_OID #define POLARSSL_ERR_X509_UNKNOWN_SIG_ALG MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG #define POLARSSL_ERR_X509_UNKNOWN_VERSION MBEDTLS_ERR_X509_UNKNOWN_VERSION #define POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH #define POLARSSL_GCM_H MBEDTLS_GCM_H #define POLARSSL_HAVEGE_H MBEDTLS_HAVEGE_H #define POLARSSL_HAVE_INT32 MBEDTLS_HAVE_INT32 #define POLARSSL_HAVE_INT64 MBEDTLS_HAVE_INT64 #define POLARSSL_HAVE_UDBL MBEDTLS_HAVE_UDBL #define POLARSSL_HAVE_X86 MBEDTLS_HAVE_X86 #define POLARSSL_HAVE_X86_64 MBEDTLS_HAVE_X86_64 #define POLARSSL_HMAC_DRBG_H MBEDTLS_HMAC_DRBG_H #define POLARSSL_HMAC_DRBG_PR_OFF MBEDTLS_HMAC_DRBG_PR_OFF #define POLARSSL_HMAC_DRBG_PR_ON MBEDTLS_HMAC_DRBG_PR_ON #define POLARSSL_KEY_EXCHANGE_DHE_PSK MBEDTLS_KEY_EXCHANGE_DHE_PSK #define POLARSSL_KEY_EXCHANGE_DHE_RSA MBEDTLS_KEY_EXCHANGE_DHE_RSA #define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA #define POLARSSL_KEY_EXCHANGE_ECDHE_PSK MBEDTLS_KEY_EXCHANGE_ECDHE_PSK #define POLARSSL_KEY_EXCHANGE_ECDHE_RSA MBEDTLS_KEY_EXCHANGE_ECDHE_RSA #define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA #define POLARSSL_KEY_EXCHANGE_ECDH_RSA MBEDTLS_KEY_EXCHANGE_ECDH_RSA #define POLARSSL_KEY_EXCHANGE_NONE MBEDTLS_KEY_EXCHANGE_NONE #define POLARSSL_KEY_EXCHANGE_PSK MBEDTLS_KEY_EXCHANGE_PSK #define POLARSSL_KEY_EXCHANGE_RSA MBEDTLS_KEY_EXCHANGE_RSA #define POLARSSL_KEY_EXCHANGE_RSA_PSK MBEDTLS_KEY_EXCHANGE_RSA_PSK #define POLARSSL_KEY_EXCHANGE__SOME__ECDHE_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED #define POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED #define POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED #define POLARSSL_KEY_LENGTH_DES MBEDTLS_KEY_LENGTH_DES #define POLARSSL_KEY_LENGTH_DES_EDE MBEDTLS_KEY_LENGTH_DES_EDE #define POLARSSL_KEY_LENGTH_DES_EDE3 MBEDTLS_KEY_LENGTH_DES_EDE3 #define POLARSSL_KEY_LENGTH_NONE MBEDTLS_KEY_LENGTH_NONE #define POLARSSL_MAX_BLOCK_LENGTH MBEDTLS_MAX_BLOCK_LENGTH #define POLARSSL_MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH #define POLARSSL_MD2_H MBEDTLS_MD2_H #define POLARSSL_MD4_H MBEDTLS_MD4_H #define POLARSSL_MD5_H MBEDTLS_MD5_H #define POLARSSL_MD_H MBEDTLS_MD_H #define POLARSSL_MD_MAX_SIZE MBEDTLS_MD_MAX_SIZE #define POLARSSL_MD_MD2 MBEDTLS_MD_MD2 #define POLARSSL_MD_MD4 MBEDTLS_MD_MD4 #define POLARSSL_MD_MD5 MBEDTLS_MD_MD5 #define POLARSSL_MD_NONE MBEDTLS_MD_NONE #define POLARSSL_MD_RIPEMD160 MBEDTLS_MD_RIPEMD160 #define POLARSSL_MD_SHA1 MBEDTLS_MD_SHA1 #define POLARSSL_MD_SHA224 MBEDTLS_MD_SHA224 #define POLARSSL_MD_SHA256 MBEDTLS_MD_SHA256 #define POLARSSL_MD_SHA384 MBEDTLS_MD_SHA384 #define POLARSSL_MD_SHA512 MBEDTLS_MD_SHA512 #define POLARSSL_MD_WRAP_H MBEDTLS_MD_WRAP_H #define POLARSSL_MEMORY_BUFFER_ALLOC_H MBEDTLS_MEMORY_BUFFER_ALLOC_H #define POLARSSL_MODE_CBC MBEDTLS_MODE_CBC #define POLARSSL_MODE_CCM MBEDTLS_MODE_CCM #define POLARSSL_MODE_CFB MBEDTLS_MODE_CFB #define POLARSSL_MODE_CTR MBEDTLS_MODE_CTR #define POLARSSL_MODE_ECB MBEDTLS_MODE_ECB #define POLARSSL_MODE_GCM MBEDTLS_MODE_GCM #define POLARSSL_MODE_NONE MBEDTLS_MODE_NONE #define POLARSSL_MODE_OFB MBEDTLS_MODE_OFB #define POLARSSL_MODE_STREAM MBEDTLS_MODE_STREAM #define POLARSSL_MPI_MAX_BITS MBEDTLS_MPI_MAX_BITS #define POLARSSL_MPI_MAX_BITS_SCALE100 MBEDTLS_MPI_MAX_BITS_SCALE100 #define POLARSSL_MPI_MAX_LIMBS MBEDTLS_MPI_MAX_LIMBS #define POLARSSL_MPI_RW_BUFFER_SIZE MBEDTLS_MPI_RW_BUFFER_SIZE #define POLARSSL_NET_H MBEDTLS_NET_SOCKETS_H #define POLARSSL_NET_LISTEN_BACKLOG MBEDTLS_NET_LISTEN_BACKLOG #define POLARSSL_OID_H MBEDTLS_OID_H #define POLARSSL_OPERATION_NONE MBEDTLS_OPERATION_NONE #define POLARSSL_PADDING_NONE MBEDTLS_PADDING_NONE #define POLARSSL_PADDING_ONE_AND_ZEROS MBEDTLS_PADDING_ONE_AND_ZEROS #define POLARSSL_PADDING_PKCS7 MBEDTLS_PADDING_PKCS7 #define POLARSSL_PADDING_ZEROS MBEDTLS_PADDING_ZEROS #define POLARSSL_PADDING_ZEROS_AND_LEN MBEDTLS_PADDING_ZEROS_AND_LEN #define POLARSSL_PADLOCK_H MBEDTLS_PADLOCK_H #define POLARSSL_PEM_H MBEDTLS_PEM_H #define POLARSSL_PKCS11_H MBEDTLS_PKCS11_H #define POLARSSL_PKCS12_H MBEDTLS_PKCS12_H #define POLARSSL_PKCS5_H MBEDTLS_PKCS5_H #define POLARSSL_PK_DEBUG_ECP MBEDTLS_PK_DEBUG_ECP #define POLARSSL_PK_DEBUG_MAX_ITEMS MBEDTLS_PK_DEBUG_MAX_ITEMS #define POLARSSL_PK_DEBUG_MPI MBEDTLS_PK_DEBUG_MPI #define POLARSSL_PK_DEBUG_NONE MBEDTLS_PK_DEBUG_NONE #define POLARSSL_PK_ECDSA MBEDTLS_PK_ECDSA #define POLARSSL_PK_ECKEY MBEDTLS_PK_ECKEY #define POLARSSL_PK_ECKEY_DH MBEDTLS_PK_ECKEY_DH #define POLARSSL_PK_H MBEDTLS_PK_H #define POLARSSL_PK_NONE MBEDTLS_PK_NONE #define POLARSSL_PK_RSA MBEDTLS_PK_RSA #define POLARSSL_PK_RSASSA_PSS MBEDTLS_PK_RSASSA_PSS #define POLARSSL_PK_RSA_ALT MBEDTLS_PK_RSA_ALT #define POLARSSL_PK_WRAP_H MBEDTLS_PK_WRAP_H #define POLARSSL_PLATFORM_H MBEDTLS_PLATFORM_H #define POLARSSL_PREMASTER_SIZE MBEDTLS_PREMASTER_SIZE #define POLARSSL_RIPEMD160_H MBEDTLS_RIPEMD160_H #define POLARSSL_RSA_H MBEDTLS_RSA_H #define POLARSSL_SHA1_H MBEDTLS_SHA1_H #define POLARSSL_SHA256_H MBEDTLS_SHA256_H #define POLARSSL_SHA512_H MBEDTLS_SHA512_H #define POLARSSL_SSL_CACHE_H MBEDTLS_SSL_CACHE_H #define POLARSSL_SSL_CIPHERSUITES_H MBEDTLS_SSL_CIPHERSUITES_H #define POLARSSL_SSL_COOKIE_H MBEDTLS_SSL_COOKIE_H #define POLARSSL_SSL_H MBEDTLS_SSL_H #define POLARSSL_THREADING_H MBEDTLS_THREADING_H #define POLARSSL_THREADING_IMPL MBEDTLS_THREADING_IMPL #define POLARSSL_TIMING_H MBEDTLS_TIMING_H #define POLARSSL_VERSION_H MBEDTLS_VERSION_H #define POLARSSL_VERSION_MAJOR MBEDTLS_VERSION_MAJOR #define POLARSSL_VERSION_MINOR MBEDTLS_VERSION_MINOR #define POLARSSL_VERSION_NUMBER MBEDTLS_VERSION_NUMBER #define POLARSSL_VERSION_PATCH MBEDTLS_VERSION_PATCH #define POLARSSL_VERSION_STRING MBEDTLS_VERSION_STRING #define POLARSSL_VERSION_STRING_FULL MBEDTLS_VERSION_STRING_FULL #define POLARSSL_X509_CRL_H MBEDTLS_X509_CRL_H #define POLARSSL_X509_CRT_H MBEDTLS_X509_CRT_H #define POLARSSL_X509_CSR_H MBEDTLS_X509_CSR_H #define POLARSSL_X509_H MBEDTLS_X509_H #define POLARSSL_XTEA_H MBEDTLS_XTEA_H #define RSA_CRYPT MBEDTLS_RSA_CRYPT #define RSA_PKCS_V15 MBEDTLS_RSA_PKCS_V15 #define RSA_PKCS_V21 MBEDTLS_RSA_PKCS_V21 #define RSA_PRIVATE MBEDTLS_RSA_PRIVATE #define RSA_PUBLIC MBEDTLS_RSA_PUBLIC #define RSA_SALT_LEN_ANY MBEDTLS_RSA_SALT_LEN_ANY #define RSA_SIGN MBEDTLS_RSA_SIGN #define SSL_ALERT_LEVEL_FATAL MBEDTLS_SSL_ALERT_LEVEL_FATAL #define SSL_ALERT_LEVEL_WARNING MBEDTLS_SSL_ALERT_LEVEL_WARNING #define SSL_ALERT_MSG_ACCESS_DENIED MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED #define SSL_ALERT_MSG_BAD_CERT MBEDTLS_SSL_ALERT_MSG_BAD_CERT #define SSL_ALERT_MSG_BAD_RECORD_MAC MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC #define SSL_ALERT_MSG_CERT_EXPIRED MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED #define SSL_ALERT_MSG_CERT_REVOKED MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED #define SSL_ALERT_MSG_CERT_UNKNOWN MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN #define SSL_ALERT_MSG_CLOSE_NOTIFY MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY #define SSL_ALERT_MSG_DECODE_ERROR MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR #define SSL_ALERT_MSG_DECOMPRESSION_FAILURE MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE #define SSL_ALERT_MSG_DECRYPTION_FAILED MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED #define SSL_ALERT_MSG_DECRYPT_ERROR MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR #define SSL_ALERT_MSG_EXPORT_RESTRICTION MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION #define SSL_ALERT_MSG_HANDSHAKE_FAILURE MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE #define SSL_ALERT_MSG_ILLEGAL_PARAMETER MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER #define SSL_ALERT_MSG_INAPROPRIATE_FALLBACK MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK #define SSL_ALERT_MSG_INSUFFICIENT_SECURITY MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY #define SSL_ALERT_MSG_INTERNAL_ERROR MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR #define SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL #define SSL_ALERT_MSG_NO_CERT MBEDTLS_SSL_ALERT_MSG_NO_CERT #define SSL_ALERT_MSG_NO_RENEGOTIATION MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION #define SSL_ALERT_MSG_PROTOCOL_VERSION MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION #define SSL_ALERT_MSG_RECORD_OVERFLOW MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW #define SSL_ALERT_MSG_UNEXPECTED_MESSAGE MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE #define SSL_ALERT_MSG_UNKNOWN_CA MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA #define SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY #define SSL_ALERT_MSG_UNRECOGNIZED_NAME MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME #define SSL_ALERT_MSG_UNSUPPORTED_CERT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT #define SSL_ALERT_MSG_UNSUPPORTED_EXT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT #define SSL_ALERT_MSG_USER_CANCELED MBEDTLS_SSL_ALERT_MSG_USER_CANCELED #define SSL_ANTI_REPLAY_DISABLED MBEDTLS_SSL_ANTI_REPLAY_DISABLED #define SSL_ANTI_REPLAY_ENABLED MBEDTLS_SSL_ANTI_REPLAY_ENABLED #define SSL_ARC4_DISABLED MBEDTLS_SSL_ARC4_DISABLED #define SSL_ARC4_ENABLED MBEDTLS_SSL_ARC4_ENABLED #define SSL_BUFFER_LEN ( ( ( MBEDTLS_SSL_IN_BUFFER_LEN ) < ( MBEDTLS_SSL_OUT_BUFFER_LEN ) ) \ ? ( MBEDTLS_SSL_IN_BUFFER_LEN ) : ( MBEDTLS_SSL_OUT_BUFFER_LEN ) ) #define SSL_CACHE_DEFAULT_MAX_ENTRIES MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES #define SSL_CACHE_DEFAULT_TIMEOUT MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT #define SSL_CBC_RECORD_SPLITTING_DISABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED #define SSL_CBC_RECORD_SPLITTING_ENABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED #define SSL_CERTIFICATE_REQUEST MBEDTLS_SSL_CERTIFICATE_REQUEST #define SSL_CERTIFICATE_VERIFY MBEDTLS_SSL_CERTIFICATE_VERIFY #define SSL_CERT_TYPE_ECDSA_SIGN MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN #define SSL_CERT_TYPE_RSA_SIGN MBEDTLS_SSL_CERT_TYPE_RSA_SIGN #define SSL_CHANNEL_INBOUND MBEDTLS_SSL_CHANNEL_INBOUND #define SSL_CHANNEL_OUTBOUND MBEDTLS_SSL_CHANNEL_OUTBOUND #define SSL_CIPHERSUITES MBEDTLS_SSL_CIPHERSUITES #define SSL_CLIENT_CERTIFICATE MBEDTLS_SSL_CLIENT_CERTIFICATE #define SSL_CLIENT_CHANGE_CIPHER_SPEC MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC #define SSL_CLIENT_FINISHED MBEDTLS_SSL_CLIENT_FINISHED #define SSL_CLIENT_HELLO MBEDTLS_SSL_CLIENT_HELLO #define SSL_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_CLIENT_KEY_EXCHANGE #define SSL_COMPRESSION_ADD MBEDTLS_SSL_COMPRESSION_ADD #define SSL_COMPRESS_DEFLATE MBEDTLS_SSL_COMPRESS_DEFLATE #define SSL_COMPRESS_NULL MBEDTLS_SSL_COMPRESS_NULL #define SSL_DEBUG_BUF MBEDTLS_SSL_DEBUG_BUF #define SSL_DEBUG_CRT MBEDTLS_SSL_DEBUG_CRT #define SSL_DEBUG_ECP MBEDTLS_SSL_DEBUG_ECP #define SSL_DEBUG_MPI MBEDTLS_SSL_DEBUG_MPI #define SSL_DEBUG_MSG MBEDTLS_SSL_DEBUG_MSG #define SSL_DEBUG_RET MBEDTLS_SSL_DEBUG_RET #define SSL_DEFAULT_TICKET_LIFETIME MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME #define SSL_DTLS_TIMEOUT_DFL_MAX MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX #define SSL_DTLS_TIMEOUT_DFL_MIN MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN #define SSL_EMPTY_RENEGOTIATION_INFO MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO #define SSL_ETM_DISABLED MBEDTLS_SSL_ETM_DISABLED #define SSL_ETM_ENABLED MBEDTLS_SSL_ETM_ENABLED #define SSL_EXTENDED_MS_DISABLED MBEDTLS_SSL_EXTENDED_MS_DISABLED #define SSL_EXTENDED_MS_ENABLED MBEDTLS_SSL_EXTENDED_MS_ENABLED #define SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV #define SSL_FLUSH_BUFFERS MBEDTLS_SSL_FLUSH_BUFFERS #define SSL_HANDSHAKE_OVER MBEDTLS_SSL_HANDSHAKE_OVER #define SSL_HANDSHAKE_WRAPUP MBEDTLS_SSL_HANDSHAKE_WRAPUP #define SSL_HASH_MD5 MBEDTLS_SSL_HASH_MD5 #define SSL_HASH_NONE MBEDTLS_SSL_HASH_NONE #define SSL_HASH_SHA1 MBEDTLS_SSL_HASH_SHA1 #define SSL_HASH_SHA224 MBEDTLS_SSL_HASH_SHA224 #define SSL_HASH_SHA256 MBEDTLS_SSL_HASH_SHA256 #define SSL_HASH_SHA384 MBEDTLS_SSL_HASH_SHA384 #define SSL_HASH_SHA512 MBEDTLS_SSL_HASH_SHA512 #define SSL_HELLO_REQUEST MBEDTLS_SSL_HELLO_REQUEST #define SSL_HS_CERTIFICATE MBEDTLS_SSL_HS_CERTIFICATE #define SSL_HS_CERTIFICATE_REQUEST MBEDTLS_SSL_HS_CERTIFICATE_REQUEST #define SSL_HS_CERTIFICATE_VERIFY MBEDTLS_SSL_HS_CERTIFICATE_VERIFY #define SSL_HS_CLIENT_HELLO MBEDTLS_SSL_HS_CLIENT_HELLO #define SSL_HS_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE #define SSL_HS_FINISHED MBEDTLS_SSL_HS_FINISHED #define SSL_HS_HELLO_REQUEST MBEDTLS_SSL_HS_HELLO_REQUEST #define SSL_HS_HELLO_VERIFY_REQUEST MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST #define SSL_HS_NEW_SESSION_TICKET MBEDTLS_SSL_HS_NEW_SESSION_TICKET #define SSL_HS_SERVER_HELLO MBEDTLS_SSL_HS_SERVER_HELLO #define SSL_HS_SERVER_HELLO_DONE MBEDTLS_SSL_HS_SERVER_HELLO_DONE #define SSL_HS_SERVER_KEY_EXCHANGE MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE #define SSL_INITIAL_HANDSHAKE MBEDTLS_SSL_INITIAL_HANDSHAKE #define SSL_IS_CLIENT MBEDTLS_SSL_IS_CLIENT #define SSL_IS_FALLBACK MBEDTLS_SSL_IS_FALLBACK #define SSL_IS_NOT_FALLBACK MBEDTLS_SSL_IS_NOT_FALLBACK #define SSL_IS_SERVER MBEDTLS_SSL_IS_SERVER #define SSL_LEGACY_ALLOW_RENEGOTIATION MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION #define SSL_LEGACY_BREAK_HANDSHAKE MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE #define SSL_LEGACY_NO_RENEGOTIATION MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION #define SSL_LEGACY_RENEGOTIATION MBEDTLS_SSL_LEGACY_RENEGOTIATION #define SSL_MAC_ADD MBEDTLS_SSL_MAC_ADD #define SSL_MAJOR_VERSION_3 MBEDTLS_SSL_MAJOR_VERSION_3 #define SSL_MAX_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN #define SSL_MAX_FRAG_LEN_1024 MBEDTLS_SSL_MAX_FRAG_LEN_1024 #define SSL_MAX_FRAG_LEN_2048 MBEDTLS_SSL_MAX_FRAG_LEN_2048 #define SSL_MAX_FRAG_LEN_4096 MBEDTLS_SSL_MAX_FRAG_LEN_4096 #define SSL_MAX_FRAG_LEN_512 MBEDTLS_SSL_MAX_FRAG_LEN_512 #define SSL_MAX_FRAG_LEN_INVALID MBEDTLS_SSL_MAX_FRAG_LEN_INVALID #define SSL_MAX_FRAG_LEN_NONE MBEDTLS_SSL_MAX_FRAG_LEN_NONE #define SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAX_MAJOR_VERSION #define SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MAX_MINOR_VERSION #define SSL_MINOR_VERSION_0 MBEDTLS_SSL_MINOR_VERSION_0 #define SSL_MINOR_VERSION_1 MBEDTLS_SSL_MINOR_VERSION_1 #define SSL_MINOR_VERSION_2 MBEDTLS_SSL_MINOR_VERSION_2 #define SSL_MINOR_VERSION_3 MBEDTLS_SSL_MINOR_VERSION_3 #define SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MIN_MAJOR_VERSION #define SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MIN_MINOR_VERSION #define SSL_MSG_ALERT MBEDTLS_SSL_MSG_ALERT #define SSL_MSG_APPLICATION_DATA MBEDTLS_SSL_MSG_APPLICATION_DATA #define SSL_MSG_CHANGE_CIPHER_SPEC MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC #define SSL_MSG_HANDSHAKE MBEDTLS_SSL_MSG_HANDSHAKE #define SSL_PADDING_ADD MBEDTLS_SSL_PADDING_ADD #define SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION #define SSL_RENEGOTIATION_DISABLED MBEDTLS_SSL_RENEGOTIATION_DISABLED #define SSL_RENEGOTIATION_DONE MBEDTLS_SSL_RENEGOTIATION_DONE #define SSL_RENEGOTIATION_ENABLED MBEDTLS_SSL_RENEGOTIATION_ENABLED #define SSL_RENEGOTIATION_NOT_ENFORCED MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED #define SSL_RENEGOTIATION_PENDING MBEDTLS_SSL_RENEGOTIATION_PENDING #define SSL_RENEGO_MAX_RECORDS_DEFAULT MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT #define SSL_RETRANS_FINISHED MBEDTLS_SSL_RETRANS_FINISHED #define SSL_RETRANS_PREPARING MBEDTLS_SSL_RETRANS_PREPARING #define SSL_RETRANS_SENDING MBEDTLS_SSL_RETRANS_SENDING #define SSL_RETRANS_WAITING MBEDTLS_SSL_RETRANS_WAITING #define SSL_SECURE_RENEGOTIATION MBEDTLS_SSL_SECURE_RENEGOTIATION #define SSL_SERVER_CERTIFICATE MBEDTLS_SSL_SERVER_CERTIFICATE #define SSL_SERVER_CHANGE_CIPHER_SPEC MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC #define SSL_SERVER_FINISHED MBEDTLS_SSL_SERVER_FINISHED #define SSL_SERVER_HELLO MBEDTLS_SSL_SERVER_HELLO #define SSL_SERVER_HELLO_DONE MBEDTLS_SSL_SERVER_HELLO_DONE #define SSL_SERVER_HELLO_VERIFY_REQUEST_SENT MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT #define SSL_SERVER_KEY_EXCHANGE MBEDTLS_SSL_SERVER_KEY_EXCHANGE #define SSL_SERVER_NEW_SESSION_TICKET MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET #define SSL_SESSION_TICKETS_DISABLED MBEDTLS_SSL_SESSION_TICKETS_DISABLED #define SSL_SESSION_TICKETS_ENABLED MBEDTLS_SSL_SESSION_TICKETS_ENABLED #define SSL_SIG_ANON MBEDTLS_SSL_SIG_ANON #define SSL_SIG_ECDSA MBEDTLS_SSL_SIG_ECDSA #define SSL_SIG_RSA MBEDTLS_SSL_SIG_RSA #define SSL_TRANSPORT_DATAGRAM MBEDTLS_SSL_TRANSPORT_DATAGRAM #define SSL_TRANSPORT_STREAM MBEDTLS_SSL_TRANSPORT_STREAM #define SSL_TRUNCATED_HMAC_LEN MBEDTLS_SSL_TRUNCATED_HMAC_LEN #define SSL_TRUNC_HMAC_DISABLED MBEDTLS_SSL_TRUNC_HMAC_DISABLED #define SSL_TRUNC_HMAC_ENABLED MBEDTLS_SSL_TRUNC_HMAC_ENABLED #define SSL_VERIFY_DATA_MAX_LEN MBEDTLS_SSL_VERIFY_DATA_MAX_LEN #define SSL_VERIFY_NONE MBEDTLS_SSL_VERIFY_NONE #define SSL_VERIFY_OPTIONAL MBEDTLS_SSL_VERIFY_OPTIONAL #define SSL_VERIFY_REQUIRED MBEDTLS_SSL_VERIFY_REQUIRED #define TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA #define TLS_DHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA #define TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 #define TLS_DHE_PSK_WITH_AES_128_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM #define TLS_DHE_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 #define TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 #define TLS_DHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA #define TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 #define TLS_DHE_PSK_WITH_AES_256_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM #define TLS_DHE_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 #define TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 #define TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_DHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA #define TLS_DHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 #define TLS_DHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 #define TLS_DHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA #define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 #define TLS_DHE_RSA_WITH_AES_128_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM #define TLS_DHE_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 #define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 #define TLS_DHE_RSA_WITH_AES_256_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM #define TLS_DHE_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 #define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 #define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA #define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA #define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 #define TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_DHE_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA #define TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA #define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA #define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 #define TLS_ECDHE_ECDSA_WITH_AES_128_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM #define TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 #define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 #define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA #define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 #define TLS_ECDHE_ECDSA_WITH_AES_256_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM #define TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 #define TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 #define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_ECDHE_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA #define TLS_ECDHE_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA #define TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA #define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA #define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 #define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA #define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 #define TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA #define TLS_ECDHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 #define TLS_ECDHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 #define TLS_ECDHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA #define TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA #define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA #define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 #define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 #define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA #define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 #define TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 #define TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_ECDHE_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA #define TLS_ECDHE_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA #define TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA #define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA #define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 #define TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 #define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA #define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 #define TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 #define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_ECDH_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA #define TLS_ECDH_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA #define TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA #define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA #define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 #define TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 #define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA #define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 #define TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 #define TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_ECDH_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA #define TLS_ECDH_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA #define TLS_EXT_ALPN MBEDTLS_TLS_EXT_ALPN #define TLS_EXT_ENCRYPT_THEN_MAC MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC #define TLS_EXT_EXTENDED_MASTER_SECRET MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET #define TLS_EXT_MAX_FRAGMENT_LENGTH MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH #define TLS_EXT_RENEGOTIATION_INFO MBEDTLS_TLS_EXT_RENEGOTIATION_INFO #define TLS_EXT_SERVERNAME MBEDTLS_TLS_EXT_SERVERNAME #define TLS_EXT_SERVERNAME_HOSTNAME MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME #define TLS_EXT_SESSION_TICKET MBEDTLS_TLS_EXT_SESSION_TICKET #define TLS_EXT_SIG_ALG MBEDTLS_TLS_EXT_SIG_ALG #define TLS_EXT_SUPPORTED_ELLIPTIC_CURVES MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES #define TLS_EXT_SUPPORTED_POINT_FORMATS MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS #define TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT #define TLS_EXT_TRUNCATED_HMAC MBEDTLS_TLS_EXT_TRUNCATED_HMAC #define TLS_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA #define TLS_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA #define TLS_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 #define TLS_PSK_WITH_AES_128_CCM MBEDTLS_TLS_PSK_WITH_AES_128_CCM #define TLS_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 #define TLS_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 #define TLS_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA #define TLS_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 #define TLS_PSK_WITH_AES_256_CCM MBEDTLS_TLS_PSK_WITH_AES_256_CCM #define TLS_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 #define TLS_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 #define TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_PSK_WITH_NULL_SHA MBEDTLS_TLS_PSK_WITH_NULL_SHA #define TLS_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_PSK_WITH_NULL_SHA256 #define TLS_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_PSK_WITH_NULL_SHA384 #define TLS_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_PSK_WITH_RC4_128_SHA #define TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA #define TLS_RSA_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA #define TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 #define TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 #define TLS_RSA_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA #define TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 #define TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 #define TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 #define TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_RSA_PSK_WITH_NULL_SHA MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA #define TLS_RSA_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 #define TLS_RSA_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 #define TLS_RSA_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA #define TLS_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA #define TLS_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA #define TLS_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 #define TLS_RSA_WITH_AES_128_CCM MBEDTLS_TLS_RSA_WITH_AES_128_CCM #define TLS_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 #define TLS_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 #define TLS_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA #define TLS_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 #define TLS_RSA_WITH_AES_256_CCM MBEDTLS_TLS_RSA_WITH_AES_256_CCM #define TLS_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 #define TLS_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 #define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA #define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 #define TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 #define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA #define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 #define TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 #define TLS_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA #define TLS_RSA_WITH_NULL_MD5 MBEDTLS_TLS_RSA_WITH_NULL_MD5 #define TLS_RSA_WITH_NULL_SHA MBEDTLS_TLS_RSA_WITH_NULL_SHA #define TLS_RSA_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_WITH_NULL_SHA256 #define TLS_RSA_WITH_RC4_128_MD5 MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 #define TLS_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_WITH_RC4_128_SHA #define X509_CRT_VERSION_1 MBEDTLS_X509_CRT_VERSION_1 #define X509_CRT_VERSION_2 MBEDTLS_X509_CRT_VERSION_2 #define X509_CRT_VERSION_3 MBEDTLS_X509_CRT_VERSION_3 #define X509_FORMAT_DER MBEDTLS_X509_FORMAT_DER #define X509_FORMAT_PEM MBEDTLS_X509_FORMAT_PEM #define X509_MAX_DN_NAME_SIZE MBEDTLS_X509_MAX_DN_NAME_SIZE #define X509_RFC5280_MAX_SERIAL_LEN MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN #define X509_RFC5280_UTC_TIME_LEN MBEDTLS_X509_RFC5280_UTC_TIME_LEN #define XTEA_DECRYPT MBEDTLS_XTEA_DECRYPT #define XTEA_ENCRYPT MBEDTLS_XTEA_ENCRYPT #define _asn1_bitstring mbedtls_asn1_bitstring #define _asn1_buf mbedtls_asn1_buf #define _asn1_named_data mbedtls_asn1_named_data #define _asn1_sequence mbedtls_asn1_sequence #define _ssl_cache_context mbedtls_ssl_cache_context #define _ssl_cache_entry mbedtls_ssl_cache_entry #define _ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t #define _ssl_context mbedtls_ssl_context #define _ssl_flight_item mbedtls_ssl_flight_item #define _ssl_handshake_params mbedtls_ssl_handshake_params #define _ssl_key_cert mbedtls_ssl_key_cert #define _ssl_premaster_secret mbedtls_ssl_premaster_secret #define _ssl_session mbedtls_ssl_session #define _ssl_transform mbedtls_ssl_transform #define _x509_crl mbedtls_x509_crl #define _x509_crl_entry mbedtls_x509_crl_entry #define _x509_crt mbedtls_x509_crt #define _x509_csr mbedtls_x509_csr #define _x509_time mbedtls_x509_time #define _x509write_cert mbedtls_x509write_cert #define _x509write_csr mbedtls_x509write_csr #define aes_context mbedtls_aes_context #define aes_crypt_cbc mbedtls_aes_crypt_cbc #define aes_crypt_cfb128 mbedtls_aes_crypt_cfb128 #define aes_crypt_cfb8 mbedtls_aes_crypt_cfb8 #define aes_crypt_ctr mbedtls_aes_crypt_ctr #define aes_crypt_ecb mbedtls_aes_crypt_ecb #define aes_free mbedtls_aes_free #define aes_init mbedtls_aes_init #define aes_self_test mbedtls_aes_self_test #define aes_setkey_dec mbedtls_aes_setkey_dec #define aes_setkey_enc mbedtls_aes_setkey_enc #define aesni_crypt_ecb mbedtls_aesni_crypt_ecb #define aesni_gcm_mult mbedtls_aesni_gcm_mult #define aesni_inverse_key mbedtls_aesni_inverse_key #define aesni_setkey_enc mbedtls_aesni_setkey_enc #define aesni_supports mbedtls_aesni_has_support #define alarmed mbedtls_timing_alarmed #define arc4_context mbedtls_arc4_context #define arc4_crypt mbedtls_arc4_crypt #define arc4_free mbedtls_arc4_free #define arc4_init mbedtls_arc4_init #define arc4_self_test mbedtls_arc4_self_test #define arc4_setup mbedtls_arc4_setup #define asn1_bitstring mbedtls_asn1_bitstring #define asn1_buf mbedtls_asn1_buf #define asn1_find_named_data mbedtls_asn1_find_named_data #define asn1_free_named_data mbedtls_asn1_free_named_data #define asn1_free_named_data_list mbedtls_asn1_free_named_data_list #define asn1_get_alg mbedtls_asn1_get_alg #define asn1_get_alg_null mbedtls_asn1_get_alg_null #define asn1_get_bitstring mbedtls_asn1_get_bitstring #define asn1_get_bitstring_null mbedtls_asn1_get_bitstring_null #define asn1_get_bool mbedtls_asn1_get_bool #define asn1_get_int mbedtls_asn1_get_int #define asn1_get_len mbedtls_asn1_get_len #define asn1_get_mpi mbedtls_asn1_get_mpi #define asn1_get_sequence_of mbedtls_asn1_get_sequence_of #define asn1_get_tag mbedtls_asn1_get_tag #define asn1_named_data mbedtls_asn1_named_data #define asn1_sequence mbedtls_asn1_sequence #define asn1_store_named_data mbedtls_asn1_store_named_data #define asn1_write_algorithm_identifier mbedtls_asn1_write_algorithm_identifier #define asn1_write_bitstring mbedtls_asn1_write_bitstring #define asn1_write_bool mbedtls_asn1_write_bool #define asn1_write_ia5_string mbedtls_asn1_write_ia5_string #define asn1_write_int mbedtls_asn1_write_int #define asn1_write_len mbedtls_asn1_write_len #define asn1_write_mpi mbedtls_asn1_write_mpi #define asn1_write_null mbedtls_asn1_write_null #define asn1_write_octet_string mbedtls_asn1_write_octet_string #define asn1_write_oid mbedtls_asn1_write_oid #define asn1_write_printable_string mbedtls_asn1_write_printable_string #define asn1_write_raw_buffer mbedtls_asn1_write_raw_buffer #define asn1_write_tag mbedtls_asn1_write_tag #define base64_decode mbedtls_base64_decode #define base64_encode mbedtls_base64_encode #define base64_self_test mbedtls_base64_self_test #define blowfish_context mbedtls_blowfish_context #define blowfish_crypt_cbc mbedtls_blowfish_crypt_cbc #define blowfish_crypt_cfb64 mbedtls_blowfish_crypt_cfb64 #define blowfish_crypt_ctr mbedtls_blowfish_crypt_ctr #define blowfish_crypt_ecb mbedtls_blowfish_crypt_ecb #define blowfish_free mbedtls_blowfish_free #define blowfish_init mbedtls_blowfish_init #define blowfish_setkey mbedtls_blowfish_setkey #define camellia_context mbedtls_camellia_context #define camellia_crypt_cbc mbedtls_camellia_crypt_cbc #define camellia_crypt_cfb128 mbedtls_camellia_crypt_cfb128 #define camellia_crypt_ctr mbedtls_camellia_crypt_ctr #define camellia_crypt_ecb mbedtls_camellia_crypt_ecb #define camellia_free mbedtls_camellia_free #define camellia_init mbedtls_camellia_init #define camellia_self_test mbedtls_camellia_self_test #define camellia_setkey_dec mbedtls_camellia_setkey_dec #define camellia_setkey_enc mbedtls_camellia_setkey_enc #define ccm_auth_decrypt mbedtls_ccm_auth_decrypt #define ccm_context mbedtls_ccm_context #define ccm_encrypt_and_tag mbedtls_ccm_encrypt_and_tag #define ccm_free mbedtls_ccm_free #define ccm_init mbedtls_ccm_init #define ccm_self_test mbedtls_ccm_self_test #define cipher_auth_decrypt mbedtls_cipher_auth_decrypt #define cipher_auth_encrypt mbedtls_cipher_auth_encrypt #define cipher_base_t mbedtls_cipher_base_t #define cipher_check_tag mbedtls_cipher_check_tag #define cipher_context_t mbedtls_cipher_context_t #define cipher_crypt mbedtls_cipher_crypt #define cipher_definition_t mbedtls_cipher_definition_t #define cipher_definitions mbedtls_cipher_definitions #define cipher_finish mbedtls_cipher_finish #define cipher_free mbedtls_cipher_free #define cipher_get_block_size mbedtls_cipher_get_block_size #define cipher_get_cipher_mode mbedtls_cipher_get_cipher_mode #define cipher_get_iv_size mbedtls_cipher_get_iv_size #define cipher_get_key_size mbedtls_cipher_get_key_bitlen #define cipher_get_name mbedtls_cipher_get_name #define cipher_get_operation mbedtls_cipher_get_operation #define cipher_get_type mbedtls_cipher_get_type #define cipher_id_t mbedtls_cipher_id_t #define cipher_info_from_string mbedtls_cipher_info_from_string #define cipher_info_from_type mbedtls_cipher_info_from_type #define cipher_info_from_values mbedtls_cipher_info_from_values #define cipher_info_t mbedtls_cipher_info_t #define cipher_init mbedtls_cipher_init #define cipher_init_ctx mbedtls_cipher_setup #define cipher_list mbedtls_cipher_list #define cipher_mode_t mbedtls_cipher_mode_t #define cipher_padding_t mbedtls_cipher_padding_t #define cipher_reset mbedtls_cipher_reset #define cipher_set_iv mbedtls_cipher_set_iv #define cipher_set_padding_mode mbedtls_cipher_set_padding_mode #define cipher_setkey mbedtls_cipher_setkey #define cipher_type_t mbedtls_cipher_type_t #define cipher_update mbedtls_cipher_update #define cipher_update_ad mbedtls_cipher_update_ad #define cipher_write_tag mbedtls_cipher_write_tag #define ctr_drbg_context mbedtls_ctr_drbg_context #define ctr_drbg_free mbedtls_ctr_drbg_free #define ctr_drbg_init mbedtls_ctr_drbg_init #define ctr_drbg_random mbedtls_ctr_drbg_random #define ctr_drbg_random_with_add mbedtls_ctr_drbg_random_with_add #define ctr_drbg_reseed mbedtls_ctr_drbg_reseed #define ctr_drbg_self_test mbedtls_ctr_drbg_self_test #define ctr_drbg_set_entropy_len mbedtls_ctr_drbg_set_entropy_len #define ctr_drbg_set_prediction_resistance mbedtls_ctr_drbg_set_prediction_resistance #define ctr_drbg_set_reseed_interval mbedtls_ctr_drbg_set_reseed_interval #define ctr_drbg_update mbedtls_ctr_drbg_update #define ctr_drbg_update_seed_file mbedtls_ctr_drbg_update_seed_file #define ctr_drbg_write_seed_file mbedtls_ctr_drbg_write_seed_file #define debug_print_buf mbedtls_debug_print_buf #define debug_print_crt mbedtls_debug_print_crt #define debug_print_ecp mbedtls_debug_print_ecp #define debug_print_mpi mbedtls_debug_print_mpi #define debug_print_msg mbedtls_debug_print_msg #define debug_print_ret mbedtls_debug_print_ret #define debug_set_threshold mbedtls_debug_set_threshold #define des3_context mbedtls_des3_context #define des3_crypt_cbc mbedtls_des3_crypt_cbc #define des3_crypt_ecb mbedtls_des3_crypt_ecb #define des3_free mbedtls_des3_free #define des3_init mbedtls_des3_init #define des3_set2key_dec mbedtls_des3_set2key_dec #define des3_set2key_enc mbedtls_des3_set2key_enc #define des3_set3key_dec mbedtls_des3_set3key_dec #define des3_set3key_enc mbedtls_des3_set3key_enc #define des_context mbedtls_des_context #define des_crypt_cbc mbedtls_des_crypt_cbc #define des_crypt_ecb mbedtls_des_crypt_ecb #define des_free mbedtls_des_free #define des_init mbedtls_des_init #define des_key_check_key_parity mbedtls_des_key_check_key_parity #define des_key_check_weak mbedtls_des_key_check_weak #define des_key_set_parity mbedtls_des_key_set_parity #define des_self_test mbedtls_des_self_test #define des_setkey_dec mbedtls_des_setkey_dec #define des_setkey_enc mbedtls_des_setkey_enc #define dhm_calc_secret mbedtls_dhm_calc_secret #define dhm_context mbedtls_dhm_context #define dhm_free mbedtls_dhm_free #define dhm_init mbedtls_dhm_init #define dhm_make_params mbedtls_dhm_make_params #define dhm_make_public mbedtls_dhm_make_public #define dhm_parse_dhm mbedtls_dhm_parse_dhm #define dhm_parse_dhmfile mbedtls_dhm_parse_dhmfile #define dhm_read_params mbedtls_dhm_read_params #define dhm_read_public mbedtls_dhm_read_public #define dhm_self_test mbedtls_dhm_self_test #define ecdh_calc_secret mbedtls_ecdh_calc_secret #define ecdh_compute_shared mbedtls_ecdh_compute_shared #define ecdh_context mbedtls_ecdh_context #define ecdh_free mbedtls_ecdh_free #define ecdh_gen_public mbedtls_ecdh_gen_public #define ecdh_get_params mbedtls_ecdh_get_params #define ecdh_init mbedtls_ecdh_init #define ecdh_make_params mbedtls_ecdh_make_params #define ecdh_make_public mbedtls_ecdh_make_public #define ecdh_read_params mbedtls_ecdh_read_params #define ecdh_read_public mbedtls_ecdh_read_public #define ecdh_side mbedtls_ecdh_side #define ecdsa_context mbedtls_ecdsa_context #define ecdsa_free mbedtls_ecdsa_free #define ecdsa_from_keypair mbedtls_ecdsa_from_keypair #define ecdsa_genkey mbedtls_ecdsa_genkey #define ecdsa_info mbedtls_ecdsa_info #define ecdsa_init mbedtls_ecdsa_init #define ecdsa_read_signature mbedtls_ecdsa_read_signature #define ecdsa_sign mbedtls_ecdsa_sign #define ecdsa_sign_det mbedtls_ecdsa_sign_det #define ecdsa_verify mbedtls_ecdsa_verify #define ecdsa_write_signature mbedtls_ecdsa_write_signature #define ecdsa_write_signature_det mbedtls_ecdsa_write_signature_det #define eckey_info mbedtls_eckey_info #define eckeydh_info mbedtls_eckeydh_info #define ecp_check_privkey mbedtls_ecp_check_privkey #define ecp_check_pub_priv mbedtls_ecp_check_pub_priv #define ecp_check_pubkey mbedtls_ecp_check_pubkey #define ecp_copy mbedtls_ecp_copy #define ecp_curve_info mbedtls_ecp_curve_info #define ecp_curve_info_from_grp_id mbedtls_ecp_curve_info_from_grp_id #define ecp_curve_info_from_name mbedtls_ecp_curve_info_from_name #define ecp_curve_info_from_tls_id mbedtls_ecp_curve_info_from_tls_id #define ecp_curve_list mbedtls_ecp_curve_list #define ecp_gen_key mbedtls_ecp_gen_key #define ecp_gen_keypair mbedtls_ecp_gen_keypair #define ecp_group mbedtls_ecp_group #define ecp_group_copy mbedtls_ecp_group_copy #define ecp_group_free mbedtls_ecp_group_free #define ecp_group_id mbedtls_ecp_group_id #define ecp_group_init mbedtls_ecp_group_init #define ecp_grp_id_list mbedtls_ecp_grp_id_list #define ecp_is_zero mbedtls_ecp_is_zero #define ecp_keypair mbedtls_ecp_keypair #define ecp_keypair_free mbedtls_ecp_keypair_free #define ecp_keypair_init mbedtls_ecp_keypair_init #define ecp_mul mbedtls_ecp_mul #define ecp_point mbedtls_ecp_point #define ecp_point_free mbedtls_ecp_point_free #define ecp_point_init mbedtls_ecp_point_init #define ecp_point_read_binary mbedtls_ecp_point_read_binary #define ecp_point_read_string mbedtls_ecp_point_read_string #define ecp_point_write_binary mbedtls_ecp_point_write_binary #define ecp_self_test mbedtls_ecp_self_test #define ecp_set_zero mbedtls_ecp_set_zero #define ecp_tls_read_group mbedtls_ecp_tls_read_group #define ecp_tls_read_point mbedtls_ecp_tls_read_point #define ecp_tls_write_group mbedtls_ecp_tls_write_group #define ecp_tls_write_point mbedtls_ecp_tls_write_point #define ecp_use_known_dp mbedtls_ecp_group_load #define entropy_add_source mbedtls_entropy_add_source #define entropy_context mbedtls_entropy_context #define entropy_free mbedtls_entropy_free #define entropy_func mbedtls_entropy_func #define entropy_gather mbedtls_entropy_gather #define entropy_init mbedtls_entropy_init #define entropy_self_test mbedtls_entropy_self_test #define entropy_update_manual mbedtls_entropy_update_manual #define entropy_update_seed_file mbedtls_entropy_update_seed_file #define entropy_write_seed_file mbedtls_entropy_write_seed_file #define error_strerror mbedtls_strerror #define f_source_ptr mbedtls_entropy_f_source_ptr #define gcm_auth_decrypt mbedtls_gcm_auth_decrypt #define gcm_context mbedtls_gcm_context #define gcm_crypt_and_tag mbedtls_gcm_crypt_and_tag #define gcm_finish mbedtls_gcm_finish #define gcm_free mbedtls_gcm_free #define gcm_init mbedtls_gcm_init #define gcm_self_test mbedtls_gcm_self_test #define gcm_starts mbedtls_gcm_starts #define gcm_update mbedtls_gcm_update #define get_timer mbedtls_timing_get_timer #define hardclock mbedtls_timing_hardclock #define hardclock_poll mbedtls_hardclock_poll #define havege_free mbedtls_havege_free #define havege_init mbedtls_havege_init #define havege_poll mbedtls_havege_poll #define havege_random mbedtls_havege_random #define havege_state mbedtls_havege_state #define hmac_drbg_context mbedtls_hmac_drbg_context #define hmac_drbg_free mbedtls_hmac_drbg_free #define hmac_drbg_init mbedtls_hmac_drbg_init #define hmac_drbg_random mbedtls_hmac_drbg_random #define hmac_drbg_random_with_add mbedtls_hmac_drbg_random_with_add #define hmac_drbg_reseed mbedtls_hmac_drbg_reseed #define hmac_drbg_self_test mbedtls_hmac_drbg_self_test #define hmac_drbg_set_entropy_len mbedtls_hmac_drbg_set_entropy_len #define hmac_drbg_set_prediction_resistance mbedtls_hmac_drbg_set_prediction_resistance #define hmac_drbg_set_reseed_interval mbedtls_hmac_drbg_set_reseed_interval #define hmac_drbg_update mbedtls_hmac_drbg_update #define hmac_drbg_update_seed_file mbedtls_hmac_drbg_update_seed_file #define hmac_drbg_write_seed_file mbedtls_hmac_drbg_write_seed_file #define hr_time mbedtls_timing_hr_time #define key_exchange_type_t mbedtls_key_exchange_type_t #define md mbedtls_md #define md2 mbedtls_md2 #define md2_context mbedtls_md2_context #define md2_finish mbedtls_md2_finish #define md2_free mbedtls_md2_free #define md2_info mbedtls_md2_info #define md2_init mbedtls_md2_init #define md2_process mbedtls_md2_process #define md2_self_test mbedtls_md2_self_test #define md2_starts mbedtls_md2_starts #define md2_update mbedtls_md2_update #define md4 mbedtls_md4 #define md4_context mbedtls_md4_context #define md4_finish mbedtls_md4_finish #define md4_free mbedtls_md4_free #define md4_info mbedtls_md4_info #define md4_init mbedtls_md4_init #define md4_process mbedtls_md4_process #define md4_self_test mbedtls_md4_self_test #define md4_starts mbedtls_md4_starts #define md4_update mbedtls_md4_update #define md5 mbedtls_md5 #define md5_context mbedtls_md5_context #define md5_finish mbedtls_md5_finish #define md5_free mbedtls_md5_free #define md5_info mbedtls_md5_info #define md5_init mbedtls_md5_init #define md5_process mbedtls_md5_process #define md5_self_test mbedtls_md5_self_test #define md5_starts mbedtls_md5_starts #define md5_update mbedtls_md5_update #define md_context_t mbedtls_md_context_t #define md_file mbedtls_md_file #define md_finish mbedtls_md_finish #define md_free mbedtls_md_free #define md_get_name mbedtls_md_get_name #define md_get_size mbedtls_md_get_size #define md_get_type mbedtls_md_get_type #define md_hmac mbedtls_md_hmac #define md_hmac_finish mbedtls_md_hmac_finish #define md_hmac_reset mbedtls_md_hmac_reset #define md_hmac_starts mbedtls_md_hmac_starts #define md_hmac_update mbedtls_md_hmac_update #define md_info_from_string mbedtls_md_info_from_string #define md_info_from_type mbedtls_md_info_from_type #define md_info_t mbedtls_md_info_t #define md_init mbedtls_md_init #define md_init_ctx mbedtls_md_init_ctx #define md_list mbedtls_md_list #define md_process mbedtls_md_process #define md_starts mbedtls_md_starts #define md_type_t mbedtls_md_type_t #define md_update mbedtls_md_update #define memory_buffer_alloc_cur_get mbedtls_memory_buffer_alloc_cur_get #define memory_buffer_alloc_free mbedtls_memory_buffer_alloc_free #define memory_buffer_alloc_init mbedtls_memory_buffer_alloc_init #define memory_buffer_alloc_max_get mbedtls_memory_buffer_alloc_max_get #define memory_buffer_alloc_max_reset mbedtls_memory_buffer_alloc_max_reset #define memory_buffer_alloc_self_test mbedtls_memory_buffer_alloc_self_test #define memory_buffer_alloc_status mbedtls_memory_buffer_alloc_status #define memory_buffer_alloc_verify mbedtls_memory_buffer_alloc_verify #define memory_buffer_set_verify mbedtls_memory_buffer_set_verify #define mpi mbedtls_mpi #define mpi_add_abs mbedtls_mpi_add_abs #define mpi_add_int mbedtls_mpi_add_int #define mpi_add_mpi mbedtls_mpi_add_mpi #define mpi_cmp_abs mbedtls_mpi_cmp_abs #define mpi_cmp_int mbedtls_mpi_cmp_int #define mpi_cmp_mpi mbedtls_mpi_cmp_mpi #define mpi_copy mbedtls_mpi_copy #define mpi_div_int mbedtls_mpi_div_int #define mpi_div_mpi mbedtls_mpi_div_mpi #define mpi_exp_mod mbedtls_mpi_exp_mod #define mpi_fill_random mbedtls_mpi_fill_random #define mpi_free mbedtls_mpi_free #define mpi_gcd mbedtls_mpi_gcd #define mpi_gen_prime mbedtls_mpi_gen_prime #define mpi_get_bit mbedtls_mpi_get_bit #define mpi_grow mbedtls_mpi_grow #define mpi_init mbedtls_mpi_init #define mpi_inv_mod mbedtls_mpi_inv_mod #define mpi_is_prime mbedtls_mpi_is_prime #define mpi_lsb mbedtls_mpi_lsb #define mpi_lset mbedtls_mpi_lset #define mpi_mod_int mbedtls_mpi_mod_int #define mpi_mod_mpi mbedtls_mpi_mod_mpi #define mpi_msb mbedtls_mpi_bitlen #define mpi_mul_int mbedtls_mpi_mul_int #define mpi_mul_mpi mbedtls_mpi_mul_mpi #define mpi_read_binary mbedtls_mpi_read_binary #define mpi_read_file mbedtls_mpi_read_file #define mpi_read_string mbedtls_mpi_read_string #define mpi_safe_cond_assign mbedtls_mpi_safe_cond_assign #define mpi_safe_cond_swap mbedtls_mpi_safe_cond_swap #define mpi_self_test mbedtls_mpi_self_test #define mpi_set_bit mbedtls_mpi_set_bit #define mpi_shift_l mbedtls_mpi_shift_l #define mpi_shift_r mbedtls_mpi_shift_r #define mpi_shrink mbedtls_mpi_shrink #define mpi_size mbedtls_mpi_size #define mpi_sub_abs mbedtls_mpi_sub_abs #define mpi_sub_int mbedtls_mpi_sub_int #define mpi_sub_mpi mbedtls_mpi_sub_mpi #define mpi_swap mbedtls_mpi_swap #define mpi_write_binary mbedtls_mpi_write_binary #define mpi_write_file mbedtls_mpi_write_file #define mpi_write_string mbedtls_mpi_write_string #define net_accept mbedtls_net_accept #define net_bind mbedtls_net_bind #define net_close mbedtls_net_free #define net_connect mbedtls_net_connect #define net_recv mbedtls_net_recv #define net_recv_timeout mbedtls_net_recv_timeout #define net_send mbedtls_net_send #define net_set_block mbedtls_net_set_block #define net_set_nonblock mbedtls_net_set_nonblock #define net_usleep mbedtls_net_usleep #define oid_descriptor_t mbedtls_oid_descriptor_t #define oid_get_attr_short_name mbedtls_oid_get_attr_short_name #define oid_get_cipher_alg mbedtls_oid_get_cipher_alg #define oid_get_ec_grp mbedtls_oid_get_ec_grp #define oid_get_extended_key_usage mbedtls_oid_get_extended_key_usage #define oid_get_md_alg mbedtls_oid_get_md_alg #define oid_get_numeric_string mbedtls_oid_get_numeric_string #define oid_get_oid_by_ec_grp mbedtls_oid_get_oid_by_ec_grp #define oid_get_oid_by_md mbedtls_oid_get_oid_by_md #define oid_get_oid_by_pk_alg mbedtls_oid_get_oid_by_pk_alg #define oid_get_oid_by_sig_alg mbedtls_oid_get_oid_by_sig_alg #define oid_get_pk_alg mbedtls_oid_get_pk_alg #define oid_get_pkcs12_pbe_alg mbedtls_oid_get_pkcs12_pbe_alg #define oid_get_sig_alg mbedtls_oid_get_sig_alg #define oid_get_sig_alg_desc mbedtls_oid_get_sig_alg_desc #define oid_get_x509_ext_type mbedtls_oid_get_x509_ext_type #define operation_t mbedtls_operation_t #define padlock_supports mbedtls_padlock_has_support #define padlock_xcryptcbc mbedtls_padlock_xcryptcbc #define padlock_xcryptecb mbedtls_padlock_xcryptecb #define pem_context mbedtls_pem_context #define pem_free mbedtls_pem_free #define pem_init mbedtls_pem_init #define pem_read_buffer mbedtls_pem_read_buffer #define pem_write_buffer mbedtls_pem_write_buffer #define pk_can_do mbedtls_pk_can_do #define pk_check_pair mbedtls_pk_check_pair #define pk_context mbedtls_pk_context #define pk_debug mbedtls_pk_debug #define pk_debug_item mbedtls_pk_debug_item #define pk_debug_type mbedtls_pk_debug_type #define pk_decrypt mbedtls_pk_decrypt #define pk_ec mbedtls_pk_ec #define pk_encrypt mbedtls_pk_encrypt #define pk_free mbedtls_pk_free #define pk_get_len mbedtls_pk_get_len #define pk_get_name mbedtls_pk_get_name #define pk_get_size mbedtls_pk_get_bitlen #define pk_get_type mbedtls_pk_get_type #define pk_info_from_type mbedtls_pk_info_from_type #define pk_info_t mbedtls_pk_info_t #define pk_init mbedtls_pk_init #define pk_init_ctx mbedtls_pk_setup #define pk_init_ctx_rsa_alt mbedtls_pk_setup_rsa_alt #define pk_load_file mbedtls_pk_load_file #define pk_parse_key mbedtls_pk_parse_key #define pk_parse_keyfile mbedtls_pk_parse_keyfile #define pk_parse_public_key mbedtls_pk_parse_public_key #define pk_parse_public_keyfile mbedtls_pk_parse_public_keyfile #define pk_parse_subpubkey mbedtls_pk_parse_subpubkey #define pk_rsa mbedtls_pk_rsa #define pk_rsa_alt_decrypt_func mbedtls_pk_rsa_alt_decrypt_func #define pk_rsa_alt_key_len_func mbedtls_pk_rsa_alt_key_len_func #define pk_rsa_alt_sign_func mbedtls_pk_rsa_alt_sign_func #define pk_rsassa_pss_options mbedtls_pk_rsassa_pss_options #define pk_sign mbedtls_pk_sign #define pk_type_t mbedtls_pk_type_t #define pk_verify mbedtls_pk_verify #define pk_verify_ext mbedtls_pk_verify_ext #define pk_write_key_der mbedtls_pk_write_key_der #define pk_write_key_pem mbedtls_pk_write_key_pem #define pk_write_pubkey mbedtls_pk_write_pubkey #define pk_write_pubkey_der mbedtls_pk_write_pubkey_der #define pk_write_pubkey_pem mbedtls_pk_write_pubkey_pem #define pkcs11_context mbedtls_pkcs11_context #define pkcs11_decrypt mbedtls_pkcs11_decrypt #define pkcs11_priv_key_free mbedtls_pkcs11_priv_key_free #define pkcs11_priv_key_init mbedtls_pkcs11_priv_key_bind #define pkcs11_sign mbedtls_pkcs11_sign #define pkcs11_x509_cert_init mbedtls_pkcs11_x509_cert_bind #define pkcs12_derivation mbedtls_pkcs12_derivation #define pkcs12_pbe mbedtls_pkcs12_pbe #define pkcs12_pbe_sha1_rc4_128 mbedtls_pkcs12_pbe_sha1_rc4_128 #define pkcs5_pbes2 mbedtls_pkcs5_pbes2 #define pkcs5_pbkdf2_hmac mbedtls_pkcs5_pbkdf2_hmac #define pkcs5_self_test mbedtls_pkcs5_self_test #define platform_entropy_poll mbedtls_platform_entropy_poll #define platform_set_exit mbedtls_platform_set_exit #define platform_set_fprintf mbedtls_platform_set_fprintf #define platform_set_printf mbedtls_platform_set_printf #define platform_set_snprintf mbedtls_platform_set_snprintf #define polarssl_exit mbedtls_exit #define polarssl_fprintf mbedtls_fprintf #define polarssl_free mbedtls_free #define polarssl_mutex_free mbedtls_mutex_free #define polarssl_mutex_init mbedtls_mutex_init #define polarssl_mutex_lock mbedtls_mutex_lock #define polarssl_mutex_unlock mbedtls_mutex_unlock #define polarssl_printf mbedtls_printf #define polarssl_snprintf mbedtls_snprintf #define polarssl_strerror mbedtls_strerror #define ripemd160 mbedtls_ripemd160 #define ripemd160_context mbedtls_ripemd160_context #define ripemd160_finish mbedtls_ripemd160_finish #define ripemd160_free mbedtls_ripemd160_free #define ripemd160_info mbedtls_ripemd160_info #define ripemd160_init mbedtls_ripemd160_init #define ripemd160_process mbedtls_ripemd160_process #define ripemd160_self_test mbedtls_ripemd160_self_test #define ripemd160_starts mbedtls_ripemd160_starts #define ripemd160_update mbedtls_ripemd160_update #define rsa_alt_context mbedtls_rsa_alt_context #define rsa_alt_info mbedtls_rsa_alt_info #define rsa_check_privkey mbedtls_rsa_check_privkey #define rsa_check_pub_priv mbedtls_rsa_check_pub_priv #define rsa_check_pubkey mbedtls_rsa_check_pubkey #define rsa_context mbedtls_rsa_context #define rsa_copy mbedtls_rsa_copy #define rsa_free mbedtls_rsa_free #define rsa_gen_key mbedtls_rsa_gen_key #define rsa_info mbedtls_rsa_info #define rsa_init mbedtls_rsa_init #define rsa_pkcs1_decrypt mbedtls_rsa_pkcs1_decrypt #define rsa_pkcs1_encrypt mbedtls_rsa_pkcs1_encrypt #define rsa_pkcs1_sign mbedtls_rsa_pkcs1_sign #define rsa_pkcs1_verify mbedtls_rsa_pkcs1_verify #define rsa_private mbedtls_rsa_private #define rsa_public mbedtls_rsa_public #define rsa_rsaes_oaep_decrypt mbedtls_rsa_rsaes_oaep_decrypt #define rsa_rsaes_oaep_encrypt mbedtls_rsa_rsaes_oaep_encrypt #define rsa_rsaes_pkcs1_v15_decrypt mbedtls_rsa_rsaes_pkcs1_v15_decrypt #define rsa_rsaes_pkcs1_v15_encrypt mbedtls_rsa_rsaes_pkcs1_v15_encrypt #define rsa_rsassa_pkcs1_v15_sign mbedtls_rsa_rsassa_pkcs1_v15_sign #define rsa_rsassa_pkcs1_v15_verify mbedtls_rsa_rsassa_pkcs1_v15_verify #define rsa_rsassa_pss_sign mbedtls_rsa_rsassa_pss_sign #define rsa_rsassa_pss_verify mbedtls_rsa_rsassa_pss_verify #define rsa_rsassa_pss_verify_ext mbedtls_rsa_rsassa_pss_verify_ext #define rsa_self_test mbedtls_rsa_self_test #define rsa_set_padding mbedtls_rsa_set_padding #define safer_memcmp mbedtls_ssl_safer_memcmp #define set_alarm mbedtls_set_alarm #define sha1 mbedtls_sha1 #define sha1_context mbedtls_sha1_context #define sha1_finish mbedtls_sha1_finish #define sha1_free mbedtls_sha1_free #define sha1_info mbedtls_sha1_info #define sha1_init mbedtls_sha1_init #define sha1_process mbedtls_sha1_process #define sha1_self_test mbedtls_sha1_self_test #define sha1_starts mbedtls_sha1_starts #define sha1_update mbedtls_sha1_update #define sha224_info mbedtls_sha224_info #define sha256 mbedtls_sha256 #define sha256_context mbedtls_sha256_context #define sha256_finish mbedtls_sha256_finish #define sha256_free mbedtls_sha256_free #define sha256_info mbedtls_sha256_info #define sha256_init mbedtls_sha256_init #define sha256_process mbedtls_sha256_process #define sha256_self_test mbedtls_sha256_self_test #define sha256_starts mbedtls_sha256_starts #define sha256_update mbedtls_sha256_update #define sha384_info mbedtls_sha384_info #define sha512 mbedtls_sha512 #define sha512_context mbedtls_sha512_context #define sha512_finish mbedtls_sha512_finish #define sha512_free mbedtls_sha512_free #define sha512_info mbedtls_sha512_info #define sha512_init mbedtls_sha512_init #define sha512_process mbedtls_sha512_process #define sha512_self_test mbedtls_sha512_self_test #define sha512_starts mbedtls_sha512_starts #define sha512_update mbedtls_sha512_update #define source_state mbedtls_entropy_source_state #define ssl_cache_context mbedtls_ssl_cache_context #define ssl_cache_entry mbedtls_ssl_cache_entry #define ssl_cache_free mbedtls_ssl_cache_free #define ssl_cache_get mbedtls_ssl_cache_get #define ssl_cache_init mbedtls_ssl_cache_init #define ssl_cache_set mbedtls_ssl_cache_set #define ssl_cache_set_max_entries mbedtls_ssl_cache_set_max_entries #define ssl_cache_set_timeout mbedtls_ssl_cache_set_timeout #define ssl_check_cert_usage mbedtls_ssl_check_cert_usage #define ssl_ciphersuite_from_id mbedtls_ssl_ciphersuite_from_id #define ssl_ciphersuite_from_string mbedtls_ssl_ciphersuite_from_string #define ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t #define ssl_ciphersuite_uses_ec mbedtls_ssl_ciphersuite_uses_ec #define ssl_ciphersuite_uses_psk mbedtls_ssl_ciphersuite_uses_psk #define ssl_close_notify mbedtls_ssl_close_notify #define ssl_context mbedtls_ssl_context #define ssl_cookie_check mbedtls_ssl_cookie_check #define ssl_cookie_check_t mbedtls_ssl_cookie_check_t #define ssl_cookie_ctx mbedtls_ssl_cookie_ctx #define ssl_cookie_free mbedtls_ssl_cookie_free #define ssl_cookie_init mbedtls_ssl_cookie_init #define ssl_cookie_set_timeout mbedtls_ssl_cookie_set_timeout #define ssl_cookie_setup mbedtls_ssl_cookie_setup #define ssl_cookie_write mbedtls_ssl_cookie_write #define ssl_cookie_write_t mbedtls_ssl_cookie_write_t #define ssl_derive_keys mbedtls_ssl_derive_keys #define ssl_dtls_replay_check mbedtls_ssl_dtls_replay_check #define ssl_dtls_replay_update mbedtls_ssl_dtls_replay_update #define ssl_fetch_input mbedtls_ssl_fetch_input #define ssl_flight_item mbedtls_ssl_flight_item #define ssl_flush_output mbedtls_ssl_flush_output #define ssl_free mbedtls_ssl_free #define ssl_get_alpn_protocol mbedtls_ssl_get_alpn_protocol #define ssl_get_bytes_avail mbedtls_ssl_get_bytes_avail #define ssl_get_ciphersuite mbedtls_ssl_get_ciphersuite #define ssl_get_ciphersuite_id mbedtls_ssl_get_ciphersuite_id #define ssl_get_ciphersuite_name mbedtls_ssl_get_ciphersuite_name #define ssl_get_ciphersuite_sig_pk_alg mbedtls_ssl_get_ciphersuite_sig_pk_alg #define ssl_get_peer_cert mbedtls_ssl_get_peer_cert #define ssl_get_record_expansion mbedtls_ssl_get_record_expansion #define ssl_get_session mbedtls_ssl_get_session #define ssl_get_verify_result mbedtls_ssl_get_verify_result #define ssl_get_version mbedtls_ssl_get_version #define ssl_handshake mbedtls_ssl_handshake #define ssl_handshake_client_step mbedtls_ssl_handshake_client_step #define ssl_handshake_free mbedtls_ssl_handshake_free #define ssl_handshake_params mbedtls_ssl_handshake_params #define ssl_handshake_server_step mbedtls_ssl_handshake_server_step #define ssl_handshake_step mbedtls_ssl_handshake_step #define ssl_handshake_wrapup mbedtls_ssl_handshake_wrapup #define ssl_hdr_len mbedtls_ssl_hdr_len #define ssl_hs_hdr_len mbedtls_ssl_hs_hdr_len #define ssl_hw_record_activate mbedtls_ssl_hw_record_activate #define ssl_hw_record_finish mbedtls_ssl_hw_record_finish #define ssl_hw_record_init mbedtls_ssl_hw_record_init #define ssl_hw_record_read mbedtls_ssl_hw_record_read #define ssl_hw_record_reset mbedtls_ssl_hw_record_reset #define ssl_hw_record_write mbedtls_ssl_hw_record_write #define ssl_init mbedtls_ssl_init #define ssl_key_cert mbedtls_ssl_key_cert #define ssl_legacy_renegotiation mbedtls_ssl_conf_legacy_renegotiation #define ssl_list_ciphersuites mbedtls_ssl_list_ciphersuites #define ssl_md_alg_from_hash mbedtls_ssl_md_alg_from_hash #define ssl_optimize_checksum mbedtls_ssl_optimize_checksum #define ssl_own_cert mbedtls_ssl_own_cert #define ssl_own_key mbedtls_ssl_own_key #define ssl_parse_certificate mbedtls_ssl_parse_certificate #define ssl_parse_change_cipher_spec mbedtls_ssl_parse_change_cipher_spec #define ssl_parse_finished mbedtls_ssl_parse_finished #define ssl_pk_alg_from_sig mbedtls_ssl_pk_alg_from_sig #define ssl_pkcs11_decrypt mbedtls_ssl_pkcs11_decrypt #define ssl_pkcs11_key_len mbedtls_ssl_pkcs11_key_len #define ssl_pkcs11_sign mbedtls_ssl_pkcs11_sign #define ssl_psk_derive_premaster mbedtls_ssl_psk_derive_premaster #define ssl_read mbedtls_ssl_read #define ssl_read_record mbedtls_ssl_read_record #define ssl_read_version mbedtls_ssl_read_version #define ssl_recv_flight_completed mbedtls_ssl_recv_flight_completed #define ssl_renegotiate mbedtls_ssl_renegotiate #define ssl_resend mbedtls_ssl_resend #define ssl_reset_checksum mbedtls_ssl_reset_checksum #define ssl_send_alert_message mbedtls_ssl_send_alert_message #define ssl_send_fatal_handshake_failure mbedtls_ssl_send_fatal_handshake_failure #define ssl_send_flight_completed mbedtls_ssl_send_flight_completed #define ssl_session mbedtls_ssl_session #define ssl_session_free mbedtls_ssl_session_free #define ssl_session_init mbedtls_ssl_session_init #define ssl_session_reset mbedtls_ssl_session_reset #define ssl_set_alpn_protocols mbedtls_ssl_conf_alpn_protocols #define ssl_set_arc4_support mbedtls_ssl_conf_arc4_support #define ssl_set_authmode mbedtls_ssl_conf_authmode #define ssl_set_bio mbedtls_ssl_set_bio #define ssl_set_ca_chain mbedtls_ssl_conf_ca_chain #define ssl_set_cbc_record_splitting mbedtls_ssl_conf_cbc_record_splitting #define ssl_set_ciphersuites mbedtls_ssl_conf_ciphersuites #define ssl_set_ciphersuites_for_version mbedtls_ssl_conf_ciphersuites_for_version #define ssl_set_client_transport_id mbedtls_ssl_set_client_transport_id #define ssl_set_curves mbedtls_ssl_conf_curves #define ssl_set_dbg mbedtls_ssl_conf_dbg #define ssl_set_dh_param mbedtls_ssl_conf_dh_param #define ssl_set_dh_param_ctx mbedtls_ssl_conf_dh_param_ctx #define ssl_set_dtls_anti_replay mbedtls_ssl_conf_dtls_anti_replay #define ssl_set_dtls_badmac_limit mbedtls_ssl_conf_dtls_badmac_limit #define ssl_set_dtls_cookies mbedtls_ssl_conf_dtls_cookies #define ssl_set_encrypt_then_mac mbedtls_ssl_conf_encrypt_then_mac #define ssl_set_endpoint mbedtls_ssl_conf_endpoint #define ssl_set_extended_master_secret mbedtls_ssl_conf_extended_master_secret #define ssl_set_fallback mbedtls_ssl_conf_fallback #define ssl_set_handshake_timeout mbedtls_ssl_conf_handshake_timeout #define ssl_set_hostname mbedtls_ssl_set_hostname #define ssl_set_max_frag_len mbedtls_ssl_conf_max_frag_len #define ssl_set_max_version mbedtls_ssl_conf_max_version #define ssl_set_min_version mbedtls_ssl_conf_min_version #define ssl_set_own_cert mbedtls_ssl_conf_own_cert #define ssl_set_psk mbedtls_ssl_conf_psk #define ssl_set_psk_cb mbedtls_ssl_conf_psk_cb #define ssl_set_renegotiation mbedtls_ssl_conf_renegotiation #define ssl_set_renegotiation_enforced mbedtls_ssl_conf_renegotiation_enforced #define ssl_set_renegotiation_period mbedtls_ssl_conf_renegotiation_period #define ssl_set_rng mbedtls_ssl_conf_rng #define ssl_set_session mbedtls_ssl_set_session #define ssl_set_session_cache mbedtls_ssl_conf_session_cache #define ssl_set_session_tickets mbedtls_ssl_conf_session_tickets #define ssl_set_sni mbedtls_ssl_conf_sni #define ssl_set_transport mbedtls_ssl_conf_transport #define ssl_set_truncated_hmac mbedtls_ssl_conf_truncated_hmac #define ssl_set_verify mbedtls_ssl_conf_verify #define ssl_sig_from_pk mbedtls_ssl_sig_from_pk #define ssl_states mbedtls_ssl_states #define ssl_transform mbedtls_ssl_transform #define ssl_transform_free mbedtls_ssl_transform_free #define ssl_write mbedtls_ssl_write #define ssl_write_certificate mbedtls_ssl_write_certificate #define ssl_write_change_cipher_spec mbedtls_ssl_write_change_cipher_spec #define ssl_write_finished mbedtls_ssl_write_finished #define ssl_write_record mbedtls_ssl_write_record #define ssl_write_version mbedtls_ssl_write_version #define supported_ciphers mbedtls_cipher_supported #define t_sint mbedtls_mpi_sint #define t_udbl mbedtls_t_udbl #define t_uint mbedtls_mpi_uint #define test_ca_crt mbedtls_test_ca_crt #define test_ca_crt_ec mbedtls_test_ca_crt_ec #define test_ca_crt_rsa mbedtls_test_ca_crt_rsa #define test_ca_key mbedtls_test_ca_key #define test_ca_key_ec mbedtls_test_ca_key_ec #define test_ca_key_rsa mbedtls_test_ca_key_rsa #define test_ca_list mbedtls_test_cas_pem #define test_ca_pwd mbedtls_test_ca_pwd #define test_ca_pwd_ec mbedtls_test_ca_pwd_ec #define test_ca_pwd_rsa mbedtls_test_ca_pwd_rsa #define test_cli_crt mbedtls_test_cli_crt #define test_cli_crt_ec mbedtls_test_cli_crt_ec #define test_cli_crt_rsa mbedtls_test_cli_crt_rsa #define test_cli_key mbedtls_test_cli_key #define test_cli_key_ec mbedtls_test_cli_key_ec #define test_cli_key_rsa mbedtls_test_cli_key_rsa #define test_srv_crt mbedtls_test_srv_crt #define test_srv_crt_ec mbedtls_test_srv_crt_ec #define test_srv_crt_rsa mbedtls_test_srv_crt_rsa #define test_srv_key mbedtls_test_srv_key #define test_srv_key_ec mbedtls_test_srv_key_ec #define test_srv_key_rsa mbedtls_test_srv_key_rsa #define threading_mutex_t mbedtls_threading_mutex_t #define threading_set_alt mbedtls_threading_set_alt #define timing_self_test mbedtls_timing_self_test #define version_check_feature mbedtls_version_check_feature #define version_get_number mbedtls_version_get_number #define version_get_string mbedtls_version_get_string #define version_get_string_full mbedtls_version_get_string_full #define x509_bitstring mbedtls_x509_bitstring #define x509_buf mbedtls_x509_buf #define x509_crl mbedtls_x509_crl #define x509_crl_entry mbedtls_x509_crl_entry #define x509_crl_free mbedtls_x509_crl_free #define x509_crl_info mbedtls_x509_crl_info #define x509_crl_init mbedtls_x509_crl_init #define x509_crl_parse mbedtls_x509_crl_parse #define x509_crl_parse_der mbedtls_x509_crl_parse_der #define x509_crl_parse_file mbedtls_x509_crl_parse_file #define x509_crt mbedtls_x509_crt #define x509_crt_check_extended_key_usage mbedtls_x509_crt_check_extended_key_usage #define x509_crt_check_key_usage mbedtls_x509_crt_check_key_usage #define x509_crt_free mbedtls_x509_crt_free #define x509_crt_info mbedtls_x509_crt_info #define x509_crt_init mbedtls_x509_crt_init #define x509_crt_parse mbedtls_x509_crt_parse #define x509_crt_parse_der mbedtls_x509_crt_parse_der #define x509_crt_parse_file mbedtls_x509_crt_parse_file #define x509_crt_parse_path mbedtls_x509_crt_parse_path #define x509_crt_revoked mbedtls_x509_crt_is_revoked #define x509_crt_verify mbedtls_x509_crt_verify #define x509_csr mbedtls_x509_csr #define x509_csr_free mbedtls_x509_csr_free #define x509_csr_info mbedtls_x509_csr_info #define x509_csr_init mbedtls_x509_csr_init #define x509_csr_parse mbedtls_x509_csr_parse #define x509_csr_parse_der mbedtls_x509_csr_parse_der #define x509_csr_parse_file mbedtls_x509_csr_parse_file #define x509_dn_gets mbedtls_x509_dn_gets #define x509_get_alg mbedtls_x509_get_alg #define x509_get_alg_null mbedtls_x509_get_alg_null #define x509_get_ext mbedtls_x509_get_ext #define x509_get_name mbedtls_x509_get_name #define x509_get_rsassa_pss_params mbedtls_x509_get_rsassa_pss_params #define x509_get_serial mbedtls_x509_get_serial #define x509_get_sig mbedtls_x509_get_sig #define x509_get_sig_alg mbedtls_x509_get_sig_alg #define x509_get_time mbedtls_x509_get_time #define x509_key_size_helper mbedtls_x509_key_size_helper #define x509_name mbedtls_x509_name #define x509_self_test mbedtls_x509_self_test #define x509_sequence mbedtls_x509_sequence #define x509_serial_gets mbedtls_x509_serial_gets #define x509_set_extension mbedtls_x509_set_extension #define x509_sig_alg_gets mbedtls_x509_sig_alg_gets #define x509_string_to_names mbedtls_x509_string_to_names #define x509_time mbedtls_x509_time #define x509_time_expired mbedtls_x509_time_is_past #define x509_time_future mbedtls_x509_time_is_future #define x509_write_extensions mbedtls_x509_write_extensions #define x509_write_names mbedtls_x509_write_names #define x509_write_sig mbedtls_x509_write_sig #define x509write_cert mbedtls_x509write_cert #define x509write_crt_der mbedtls_x509write_crt_der #define x509write_crt_free mbedtls_x509write_crt_free #define x509write_crt_init mbedtls_x509write_crt_init #define x509write_crt_pem mbedtls_x509write_crt_pem #define x509write_crt_set_authority_key_identifier mbedtls_x509write_crt_set_authority_key_identifier #define x509write_crt_set_basic_constraints mbedtls_x509write_crt_set_basic_constraints #define x509write_crt_set_extension mbedtls_x509write_crt_set_extension #define x509write_crt_set_issuer_key mbedtls_x509write_crt_set_issuer_key #define x509write_crt_set_issuer_name mbedtls_x509write_crt_set_issuer_name #define x509write_crt_set_key_usage mbedtls_x509write_crt_set_key_usage #define x509write_crt_set_md_alg mbedtls_x509write_crt_set_md_alg #define x509write_crt_set_ns_cert_type mbedtls_x509write_crt_set_ns_cert_type #define x509write_crt_set_serial mbedtls_x509write_crt_set_serial #define x509write_crt_set_subject_key mbedtls_x509write_crt_set_subject_key #define x509write_crt_set_subject_key_identifier mbedtls_x509write_crt_set_subject_key_identifier #define x509write_crt_set_subject_name mbedtls_x509write_crt_set_subject_name #define x509write_crt_set_validity mbedtls_x509write_crt_set_validity #define x509write_crt_set_version mbedtls_x509write_crt_set_version #define x509write_csr mbedtls_x509write_csr #define x509write_csr_der mbedtls_x509write_csr_der #define x509write_csr_free mbedtls_x509write_csr_free #define x509write_csr_init mbedtls_x509write_csr_init #define x509write_csr_pem mbedtls_x509write_csr_pem #define x509write_csr_set_extension mbedtls_x509write_csr_set_extension #define x509write_csr_set_key mbedtls_x509write_csr_set_key #define x509write_csr_set_key_usage mbedtls_x509write_csr_set_key_usage #define x509write_csr_set_md_alg mbedtls_x509write_csr_set_md_alg #define x509write_csr_set_ns_cert_type mbedtls_x509write_csr_set_ns_cert_type #define x509write_csr_set_subject_name mbedtls_x509write_csr_set_subject_name #define xtea_context mbedtls_xtea_context #define xtea_crypt_cbc mbedtls_xtea_crypt_cbc #define xtea_crypt_ecb mbedtls_xtea_crypt_ecb #define xtea_free mbedtls_xtea_free #define xtea_init mbedtls_xtea_init #define xtea_self_test mbedtls_xtea_self_test #define xtea_setup mbedtls_xtea_setup #endif /* compat-1.3.h */ #endif /* MBEDTLS_DEPRECATED_REMOVED */ fldigi-4.2.05/src/include/mbedtls/ssl_cookie.h0000664000175000017500000000641414611711171016137 00000000000000/** * \file ssl_cookie.h * * \brief DTLS cookie callbacks implementation */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_COOKIE_H #define MBEDTLS_SSL_COOKIE_H #include "ssl.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #ifndef MBEDTLS_SSL_COOKIE_TIMEOUT #define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ #endif /* \} name SECTION: Module settings */ #ifdef __cplusplus extern "C" { #endif /** * \brief Context for the default cookie functions. */ typedef struct mbedtls_ssl_cookie_ctx { mbedtls_md_context_t hmac_ctx; /*!< context for the HMAC portion */ #if !defined(MBEDTLS_HAVE_TIME) unsigned long serial; /*!< serial number for expiration */ #endif unsigned long timeout; /*!< timeout delay, in seconds if HAVE_TIME, or in number of tickets issued */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } mbedtls_ssl_cookie_ctx; /** * \brief Initialize cookie context */ void mbedtls_ssl_cookie_init( mbedtls_ssl_cookie_ctx *ctx ); /** * \brief Setup cookie context (generate keys) */ int mbedtls_ssl_cookie_setup( mbedtls_ssl_cookie_ctx *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Set expiration delay for cookies * (Default MBEDTLS_SSL_COOKIE_TIMEOUT) * * \param ctx Cookie contex * \param delay Delay, in seconds if HAVE_TIME, or in number of cookies * issued in the meantime. * 0 to disable expiration (NOT recommended) */ void mbedtls_ssl_cookie_set_timeout( mbedtls_ssl_cookie_ctx *ctx, unsigned long delay ); /** * \brief Free cookie context */ void mbedtls_ssl_cookie_free( mbedtls_ssl_cookie_ctx *ctx ); /** * \brief Generate cookie, see \c mbedtls_ssl_cookie_write_t */ mbedtls_ssl_cookie_write_t mbedtls_ssl_cookie_write; /** * \brief Verify cookie, see \c mbedtls_ssl_cookie_write_t */ mbedtls_ssl_cookie_check_t mbedtls_ssl_cookie_check; #ifdef __cplusplus } #endif #endif /* ssl_cookie.h */ fldigi-4.2.05/src/include/mbedtls/sha256.h0000664000175000017500000002565714611711171015027 00000000000000/** * \file sha256.h * * \brief This file contains SHA-224 and SHA-256 definitions and functions. * * The Secure Hash Algorithms 224 and 256 (SHA-224 and SHA-256) cryptographic * hash functions are defined in FIPS 180-4: Secure Hash Standard (SHS). */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SHA256_H #define MBEDTLS_SHA256_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED -0x0037 /**< SHA-256 hardware accelerator failed */ #define MBEDTLS_ERR_SHA256_BAD_INPUT_DATA -0x0074 /**< SHA-256 input data was malformed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_SHA256_ALT) // Regular implementation // /** * \brief The SHA-256 context structure. * * The structure is used both for SHA-256 and for SHA-224 * checksum calculations. The choice between these two is * made in the call to mbedtls_sha256_starts_ret(). */ typedef struct mbedtls_sha256_context { uint32_t total[2]; /*!< The number of Bytes processed. */ uint32_t state[8]; /*!< The intermediate digest state. */ unsigned char buffer[64]; /*!< The data block being processed. */ int is224; /*!< Determines which function to use: 0: Use SHA-256, or 1: Use SHA-224. */ } mbedtls_sha256_context; #else /* MBEDTLS_SHA256_ALT */ #include "sha256_alt.h" #endif /* MBEDTLS_SHA256_ALT */ /** * \brief This function initializes a SHA-256 context. * * \param ctx The SHA-256 context to initialize. This must not be \c NULL. */ void mbedtls_sha256_init( mbedtls_sha256_context *ctx ); /** * \brief This function clears a SHA-256 context. * * \param ctx The SHA-256 context to clear. This may be \c NULL, in which * case this function returns immediately. If it is not \c NULL, * it must point to an initialized SHA-256 context. */ void mbedtls_sha256_free( mbedtls_sha256_context *ctx ); /** * \brief This function clones the state of a SHA-256 context. * * \param dst The destination context. This must be initialized. * \param src The context to clone. This must be initialized. */ void mbedtls_sha256_clone( mbedtls_sha256_context *dst, const mbedtls_sha256_context *src ); /** * \brief This function starts a SHA-224 or SHA-256 checksum * calculation. * * \param ctx The context to use. This must be initialized. * \param is224 This determines which function to use. This must be * either \c 0 for SHA-256, or \c 1 for SHA-224. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 ); /** * \brief This function feeds an input buffer into an ongoing * SHA-256 checksum calculation. * * \param ctx The SHA-256 context. This must be initialized * and have a hash operation started. * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-256 operation, and writes * the result to the output buffer. * * \param ctx The SHA-256 context. This must be initialized * and have a hash operation started. * \param output The SHA-224 or SHA-256 checksum result. * This must be a writable buffer of length \c 32 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx, unsigned char output[32] ); /** * \brief This function processes a single data block within * the ongoing SHA-256 computation. This function is for * internal use only. * * \param ctx The SHA-256 context. This must be initialized. * \param data The buffer holding one block of data. This must * be a readable buffer of length \c 64 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function starts a SHA-224 or SHA-256 checksum * calculation. * * \deprecated Superseded by mbedtls_sha256_starts_ret() in 2.7.0. * * \param ctx The context to use. This must be initialized. * \param is224 Determines which function to use. This must be * either \c 0 for SHA-256, or \c 1 for SHA-224. */ MBEDTLS_DEPRECATED void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 ); /** * \brief This function feeds an input buffer into an ongoing * SHA-256 checksum calculation. * * \deprecated Superseded by mbedtls_sha256_update_ret() in 2.7.0. * * \param ctx The SHA-256 context to use. This must be * initialized and have a hash operation started. * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-256 operation, and writes * the result to the output buffer. * * \deprecated Superseded by mbedtls_sha256_finish_ret() in 2.7.0. * * \param ctx The SHA-256 context. This must be initialized and * have a hash operation started. * \param output The SHA-224 or SHA-256 checksum result. This must be * a writable buffer of length \c 32 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] ); /** * \brief This function processes a single data block within * the ongoing SHA-256 computation. This function is for * internal use only. * * \deprecated Superseded by mbedtls_internal_sha256_process() in 2.7.0. * * \param ctx The SHA-256 context. This must be initialized. * \param data The buffer holding one block of data. This must be * a readable buffer of size \c 64 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief This function calculates the SHA-224 or SHA-256 * checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-256 result is calculated as * output = SHA-256(input buffer). * * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The SHA-224 or SHA-256 checksum result. This must * be a writable buffer of length \c 32 Bytes. * \param is224 Determines which function to use. This must be * either \c 0 for SHA-256, or \c 1 for SHA-224. */ int mbedtls_sha256_ret( const unsigned char *input, size_t ilen, unsigned char output[32], int is224 ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function calculates the SHA-224 or SHA-256 checksum * of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-256 result is calculated as * output = SHA-256(input buffer). * * \deprecated Superseded by mbedtls_sha256_ret() in 2.7.0. * * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The SHA-224 or SHA-256 checksum result. This must be * a writable buffer of length \c 32 Bytes. * \param is224 Determines which function to use. This must be either * \c 0 for SHA-256, or \c 1 for SHA-224. */ MBEDTLS_DEPRECATED void mbedtls_sha256( const unsigned char *input, size_t ilen, unsigned char output[32], int is224 ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief The SHA-224 and SHA-256 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_sha256_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_sha256.h */ fldigi-4.2.05/src/include/mbedtls/ecp_internal.h0000664000175000017500000002471514611711171016454 00000000000000/** * \file ecp_internal.h * * \brief Function declarations for alternative implementation of elliptic curve * point arithmetic. */ /* * Copyright (C) 2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * [1] BERNSTEIN, Daniel J. Curve25519: new Diffie-Hellman speed records. * * * [2] CORON, Jean-S'ebastien. Resistance against differential power analysis * for elliptic curve cryptosystems. In : Cryptographic Hardware and * Embedded Systems. Springer Berlin Heidelberg, 1999. p. 292-302. * * * [3] HEDABOU, Mustapha, PINEL, Pierre, et B'EN'ETEAU, Lucien. A comb method to * render ECC resistant against Side Channel Attacks. IACR Cryptology * ePrint Archive, 2004, vol. 2004, p. 342. * * * [4] Certicom Research. SEC 2: Recommended Elliptic Curve Domain Parameters. * * * [5] HANKERSON, Darrel, MENEZES, Alfred J., VANSTONE, Scott. Guide to Elliptic * Curve Cryptography. * * [6] Digital Signature Standard (DSS), FIPS 186-4. * * * [7] Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer * Security (TLS), RFC 4492. * * * [8] * * [9] COHEN, Henri. A Course in Computational Algebraic Number Theory. * Springer Science & Business Media, 1 Aug 2000 */ #ifndef MBEDTLS_ECP_INTERNAL_H #define MBEDTLS_ECP_INTERNAL_H #if defined(MBEDTLS_ECP_INTERNAL_ALT) /** * \brief Indicate if the Elliptic Curve Point module extension can * handle the group. * * \param grp The pointer to the elliptic curve group that will be the * basis of the cryptographic computations. * * \return Non-zero if successful. */ unsigned char mbedtls_internal_ecp_grp_capable( const mbedtls_ecp_group *grp ); /** * \brief Initialise the Elliptic Curve Point module extension. * * If mbedtls_internal_ecp_grp_capable returns true for a * group, this function has to be able to initialise the * module for it. * * This module can be a driver to a crypto hardware * accelerator, for which this could be an initialise function. * * \param grp The pointer to the group the module needs to be * initialised for. * * \return 0 if successful. */ int mbedtls_internal_ecp_init( const mbedtls_ecp_group *grp ); /** * \brief Frees and deallocates the Elliptic Curve Point module * extension. * * \param grp The pointer to the group the module was initialised for. */ void mbedtls_internal_ecp_free( const mbedtls_ecp_group *grp ); #if defined(ECP_SHORTWEIERSTRASS) #if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) /** * \brief Randomize jacobian coordinates: * (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l. * * \param grp Pointer to the group representing the curve. * * \param pt The point on the curve to be randomised, given with Jacobian * coordinates. * * \param f_rng A function pointer to the random number generator. * * \param p_rng A pointer to the random number generator state. * * \return 0 if successful. */ int mbedtls_internal_ecp_randomize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #endif #if defined(MBEDTLS_ECP_ADD_MIXED_ALT) /** * \brief Addition: R = P + Q, mixed affine-Jacobian coordinates. * * The coordinates of Q must be normalized (= affine), * but those of P don't need to. R is not normalized. * * This function is used only as a subrutine of * ecp_mul_comb(). * * Special cases: (1) P or Q is zero, (2) R is zero, * (3) P == Q. * None of these cases can happen as intermediate step in * ecp_mul_comb(): * - at each step, P, Q and R are multiples of the base * point, the factor being less than its order, so none of * them is zero; * - Q is an odd multiple of the base point, P an even * multiple, due to the choice of precomputed points in the * modified comb method. * So branches for these cases do not leak secret information. * * We accept Q->Z being unset (saving memory in tables) as * meaning 1. * * Cost in field operations if done by [5] 3.22: * 1A := 8M + 3S * * \param grp Pointer to the group representing the curve. * * \param R Pointer to a point structure to hold the result. * * \param P Pointer to the first summand, given with Jacobian * coordinates * * \param Q Pointer to the second summand, given with affine * coordinates. * * \return 0 if successful. */ int mbedtls_internal_ecp_add_mixed( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ); #endif /** * \brief Point doubling R = 2 P, Jacobian coordinates. * * Cost: 1D := 3M + 4S (A == 0) * 4M + 4S (A == -3) * 3M + 6S + 1a otherwise * when the implementation is based on the "dbl-1998-cmo-2" * doubling formulas in [8] and standard optimizations are * applied when curve parameter A is one of { 0, -3 }. * * \param grp Pointer to the group representing the curve. * * \param R Pointer to a point structure to hold the result. * * \param P Pointer to the point that has to be doubled, given with * Jacobian coordinates. * * \return 0 if successful. */ #if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) int mbedtls_internal_ecp_double_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *P ); #endif /** * \brief Normalize jacobian coordinates of an array of (pointers to) * points. * * Using Montgomery's trick to perform only one inversion mod P * the cost is: * 1N(t) := 1I + (6t - 3)M + 1S * (See for example Algorithm 10.3.4. in [9]) * * This function is used only as a subrutine of * ecp_mul_comb(). * * Warning: fails (returning an error) if one of the points is * zero! * This should never happen, see choice of w in ecp_mul_comb(). * * \param grp Pointer to the group representing the curve. * * \param T Array of pointers to the points to normalise. * * \param t_len Number of elements in the array. * * \return 0 if successful, * an error if one of the points is zero. */ #if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) int mbedtls_internal_ecp_normalize_jac_many( const mbedtls_ecp_group *grp, mbedtls_ecp_point *T[], size_t t_len ); #endif /** * \brief Normalize jacobian coordinates so that Z == 0 || Z == 1. * * Cost in field operations if done by [5] 3.2.1: * 1N := 1I + 3M + 1S * * \param grp Pointer to the group representing the curve. * * \param pt pointer to the point to be normalised. This is an * input/output parameter. * * \return 0 if successful. */ #if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) int mbedtls_internal_ecp_normalize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt ); #endif #endif /* ECP_SHORTWEIERSTRASS */ #if defined(ECP_MONTGOMERY) #if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) int mbedtls_internal_ecp_double_add_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, mbedtls_ecp_point *S, const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q, const mbedtls_mpi *d ); #endif /** * \brief Randomize projective x/z coordinates: * (X, Z) -> (l X, l Z) for random l * * \param grp pointer to the group representing the curve * * \param P the point on the curve to be randomised given with * projective coordinates. This is an input/output parameter. * * \param f_rng a function pointer to the random number generator * * \param p_rng a pointer to the random number generator state * * \return 0 if successful */ #if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) int mbedtls_internal_ecp_randomize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #endif /** * \brief Normalize Montgomery x/z coordinates: X = X/Z, Z = 1. * * \param grp pointer to the group representing the curve * * \param P pointer to the point to be normalised. This is an * input/output parameter. * * \return 0 if successful */ #if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) int mbedtls_internal_ecp_normalize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P ); #endif #endif /* ECP_MONTGOMERY */ #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #endif /* ecp_internal.h */ fldigi-4.2.05/src/include/mbedtls/x509.h0000664000175000017500000003626314611711171014517 00000000000000/** * \file x509.h * * \brief X.509 generic defines and structures */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_X509_H #define MBEDTLS_X509_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "asn1.h" #include "pk.h" #if defined(MBEDTLS_RSA_C) #include "rsa.h" #endif /** * \addtogroup x509_module * \{ */ #if !defined(MBEDTLS_X509_MAX_INTERMEDIATE_CA) /** * Maximum number of intermediate CAs in a verification chain. * That is, maximum length of the chain, excluding the end-entity certificate * and the trusted root certificate. * * Set this to a low value to prevent an adversary from making you waste * resources verifying an overlong certificate chain. */ #define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 #endif /** * \name X509 Error codes * \{ */ #define MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE -0x2080 /**< Unavailable feature, e.g. RSA hashing/encryption combination. */ #define MBEDTLS_ERR_X509_UNKNOWN_OID -0x2100 /**< Requested OID is unknown. */ #define MBEDTLS_ERR_X509_INVALID_FORMAT -0x2180 /**< The CRT/CRL/CSR format is invalid, e.g. different type expected. */ #define MBEDTLS_ERR_X509_INVALID_VERSION -0x2200 /**< The CRT/CRL/CSR version element is invalid. */ #define MBEDTLS_ERR_X509_INVALID_SERIAL -0x2280 /**< The serial tag or value is invalid. */ #define MBEDTLS_ERR_X509_INVALID_ALG -0x2300 /**< The algorithm tag or value is invalid. */ #define MBEDTLS_ERR_X509_INVALID_NAME -0x2380 /**< The name tag or value is invalid. */ #define MBEDTLS_ERR_X509_INVALID_DATE -0x2400 /**< The date tag or value is invalid. */ #define MBEDTLS_ERR_X509_INVALID_SIGNATURE -0x2480 /**< The signature tag or value invalid. */ #define MBEDTLS_ERR_X509_INVALID_EXTENSIONS -0x2500 /**< The extension tag or value is invalid. */ #define MBEDTLS_ERR_X509_UNKNOWN_VERSION -0x2580 /**< CRT/CRL/CSR has an unsupported version number. */ #define MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG -0x2600 /**< Signature algorithm (oid) is unsupported. */ #define MBEDTLS_ERR_X509_SIG_MISMATCH -0x2680 /**< Signature algorithms do not match. (see \c ::mbedtls_x509_crt sig_oid) */ #define MBEDTLS_ERR_X509_CERT_VERIFY_FAILED -0x2700 /**< Certificate verification failed, e.g. CRL, CA or signature check failed. */ #define MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT -0x2780 /**< Format not recognized as DER or PEM. */ #define MBEDTLS_ERR_X509_BAD_INPUT_DATA -0x2800 /**< Input invalid. */ #define MBEDTLS_ERR_X509_ALLOC_FAILED -0x2880 /**< Allocation of memory failed. */ #define MBEDTLS_ERR_X509_FILE_IO_ERROR -0x2900 /**< Read/write of file failed. */ #define MBEDTLS_ERR_X509_BUFFER_TOO_SMALL -0x2980 /**< Destination buffer is too small. */ #define MBEDTLS_ERR_X509_FATAL_ERROR -0x3000 /**< A fatal error occured, eg the chain is too long or the vrfy callback failed. */ /* \} name */ /** * \name X509 Verify codes * \{ */ /* Reminder: update x509_crt_verify_strings[] in library/x509_crt.c */ #define MBEDTLS_X509_BADCERT_EXPIRED 0x01 /**< The certificate validity has expired. */ #define MBEDTLS_X509_BADCERT_REVOKED 0x02 /**< The certificate has been revoked (is on a CRL). */ #define MBEDTLS_X509_BADCERT_CN_MISMATCH 0x04 /**< The certificate Common Name (CN) does not match with the expected CN. */ #define MBEDTLS_X509_BADCERT_NOT_TRUSTED 0x08 /**< The certificate is not correctly signed by the trusted CA. */ #define MBEDTLS_X509_BADCRL_NOT_TRUSTED 0x10 /**< The CRL is not correctly signed by the trusted CA. */ #define MBEDTLS_X509_BADCRL_EXPIRED 0x20 /**< The CRL is expired. */ #define MBEDTLS_X509_BADCERT_MISSING 0x40 /**< Certificate was missing. */ #define MBEDTLS_X509_BADCERT_SKIP_VERIFY 0x80 /**< Certificate verification was skipped. */ #define MBEDTLS_X509_BADCERT_OTHER 0x0100 /**< Other reason (can be used by verify callback) */ #define MBEDTLS_X509_BADCERT_FUTURE 0x0200 /**< The certificate validity starts in the future. */ #define MBEDTLS_X509_BADCRL_FUTURE 0x0400 /**< The CRL is from the future */ #define MBEDTLS_X509_BADCERT_KEY_USAGE 0x0800 /**< Usage does not match the keyUsage extension. */ #define MBEDTLS_X509_BADCERT_EXT_KEY_USAGE 0x1000 /**< Usage does not match the extendedKeyUsage extension. */ #define MBEDTLS_X509_BADCERT_NS_CERT_TYPE 0x2000 /**< Usage does not match the nsCertType extension. */ #define MBEDTLS_X509_BADCERT_BAD_MD 0x4000 /**< The certificate is signed with an unacceptable hash. */ #define MBEDTLS_X509_BADCERT_BAD_PK 0x8000 /**< The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ #define MBEDTLS_X509_BADCERT_BAD_KEY 0x010000 /**< The certificate is signed with an unacceptable key (eg bad curve, RSA too short). */ #define MBEDTLS_X509_BADCRL_BAD_MD 0x020000 /**< The CRL is signed with an unacceptable hash. */ #define MBEDTLS_X509_BADCRL_BAD_PK 0x040000 /**< The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ #define MBEDTLS_X509_BADCRL_BAD_KEY 0x080000 /**< The CRL is signed with an unacceptable key (eg bad curve, RSA too short). */ /* \} name */ /* \} addtogroup x509_module */ /* * X.509 v3 Key Usage Extension flags * Reminder: update x509_info_key_usage() when adding new flags. */ #define MBEDTLS_X509_KU_DIGITAL_SIGNATURE (0x80) /* bit 0 */ #define MBEDTLS_X509_KU_NON_REPUDIATION (0x40) /* bit 1 */ #define MBEDTLS_X509_KU_KEY_ENCIPHERMENT (0x20) /* bit 2 */ #define MBEDTLS_X509_KU_DATA_ENCIPHERMENT (0x10) /* bit 3 */ #define MBEDTLS_X509_KU_KEY_AGREEMENT (0x08) /* bit 4 */ #define MBEDTLS_X509_KU_KEY_CERT_SIGN (0x04) /* bit 5 */ #define MBEDTLS_X509_KU_CRL_SIGN (0x02) /* bit 6 */ #define MBEDTLS_X509_KU_ENCIPHER_ONLY (0x01) /* bit 7 */ #define MBEDTLS_X509_KU_DECIPHER_ONLY (0x8000) /* bit 8 */ /* * Netscape certificate types * (http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html) */ #define MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT (0x80) /* bit 0 */ #define MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER (0x40) /* bit 1 */ #define MBEDTLS_X509_NS_CERT_TYPE_EMAIL (0x20) /* bit 2 */ #define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING (0x10) /* bit 3 */ #define MBEDTLS_X509_NS_CERT_TYPE_RESERVED (0x08) /* bit 4 */ #define MBEDTLS_X509_NS_CERT_TYPE_SSL_CA (0x04) /* bit 5 */ #define MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA (0x02) /* bit 6 */ #define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA (0x01) /* bit 7 */ /* * X.509 extension types * * Comments refer to the status for using certificates. Status can be * different for writing certificates or reading CRLs or CSRs. */ #define MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER (1 << 0) #define MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER (1 << 1) #define MBEDTLS_X509_EXT_KEY_USAGE (1 << 2) #define MBEDTLS_X509_EXT_CERTIFICATE_POLICIES (1 << 3) #define MBEDTLS_X509_EXT_POLICY_MAPPINGS (1 << 4) #define MBEDTLS_X509_EXT_SUBJECT_ALT_NAME (1 << 5) /* Supported (DNS) */ #define MBEDTLS_X509_EXT_ISSUER_ALT_NAME (1 << 6) #define MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS (1 << 7) #define MBEDTLS_X509_EXT_BASIC_CONSTRAINTS (1 << 8) /* Supported */ #define MBEDTLS_X509_EXT_NAME_CONSTRAINTS (1 << 9) #define MBEDTLS_X509_EXT_POLICY_CONSTRAINTS (1 << 10) #define MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE (1 << 11) #define MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS (1 << 12) #define MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY (1 << 13) #define MBEDTLS_X509_EXT_FRESHEST_CRL (1 << 14) #define MBEDTLS_X509_EXT_NS_CERT_TYPE (1 << 16) /* * Storage format identifiers * Recognized formats: PEM and DER */ #define MBEDTLS_X509_FORMAT_DER 1 #define MBEDTLS_X509_FORMAT_PEM 2 #define MBEDTLS_X509_MAX_DN_NAME_SIZE 256 /**< Maximum value size of a DN entry */ #ifdef __cplusplus extern "C" { #endif /** * \addtogroup x509_module * \{ */ /** * \name Structures for parsing X.509 certificates, CRLs and CSRs * \{ */ /** * Type-length-value structure that allows for ASN1 using DER. */ typedef mbedtls_asn1_buf mbedtls_x509_buf; /** * Container for ASN1 bit strings. */ typedef mbedtls_asn1_bitstring mbedtls_x509_bitstring; /** * Container for ASN1 named information objects. * It allows for Relative Distinguished Names (e.g. cn=localhost,ou=code,etc.). */ typedef mbedtls_asn1_named_data mbedtls_x509_name; /** * Container for a sequence of ASN.1 items */ typedef mbedtls_asn1_sequence mbedtls_x509_sequence; /** Container for date and time (precision in seconds). */ typedef struct mbedtls_x509_time { int year, mon, day; /**< Date. */ int hour, min, sec; /**< Time. */ } mbedtls_x509_time; /** \} name Structures for parsing X.509 certificates, CRLs and CSRs */ /** \} addtogroup x509_module */ /** * \brief Store the certificate DN in printable form into buf; * no more than size characters will be written. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param dn The X509 name to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn ); /** * \brief Store the certificate serial in printable form into buf; * no more than size characters will be written. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param serial The X509 serial to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial ); /** * \brief Check a given mbedtls_x509_time against the system time * and tell if it's in the past. * * \note Intended usage is "if( is_past( valid_to ) ) ERROR". * Hence the return value of 1 if on internal errors. * * \param to mbedtls_x509_time to check * * \return 1 if the given time is in the past or an error occured, * 0 otherwise. */ int mbedtls_x509_time_is_past( const mbedtls_x509_time *to ); /** * \brief Check a given mbedtls_x509_time against the system time * and tell if it's in the future. * * \note Intended usage is "if( is_future( valid_from ) ) ERROR". * Hence the return value of 1 if on internal errors. * * \param from mbedtls_x509_time to check * * \return 1 if the given time is in the future or an error occured, * 0 otherwise. */ int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_x509_self_test( int verbose ); /* * Internal module functions. You probably do not want to use these unless you * know you do. */ int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, mbedtls_x509_name *cur ); int mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *alg ); int mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *alg, mbedtls_x509_buf *params ); #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params, mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md, int *salt_len ); #endif int mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig ); int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params, mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg, void **sig_opts ); int mbedtls_x509_get_time( unsigned char **p, const unsigned char *end, mbedtls_x509_time *t ); int mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *serial ); int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *ext, int tag ); int mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid, mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, const void *sig_opts ); int mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name ); int mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name ); int mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, int critical, const unsigned char *val, size_t val_len ); int mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *first ); int mbedtls_x509_write_names( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *first ); int mbedtls_x509_write_sig( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len, unsigned char *sig, size_t size ); #define MBEDTLS_X509_SAFE_SNPRINTF \ do { \ if( ret < 0 || (size_t) ret >= n ) \ return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL ); \ \ n -= (size_t) ret; \ p += (size_t) ret; \ } while( 0 ) #ifdef __cplusplus } #endif #endif /* x509.h */ fldigi-4.2.05/src/include/mbedtls/rsa.h0000664000175000017500000017571314611711171014603 00000000000000/** * \file rsa.h * * \brief This file provides an API for the RSA public-key cryptosystem. * * The RSA public-key cryptosystem is defined in Public-Key * Cryptography Standards (PKCS) #1 v1.5: RSA Encryption * and Public-Key Cryptography Standards (PKCS) #1 v2.1: * RSA Cryptography Specifications. * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_RSA_H #define MBEDTLS_RSA_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "bignum.h" #include "md.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif /* * RSA Error codes */ #define MBEDTLS_ERR_RSA_BAD_INPUT_DATA -0x4080 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_RSA_INVALID_PADDING -0x4100 /**< Input data contains invalid padding and is rejected. */ #define MBEDTLS_ERR_RSA_KEY_GEN_FAILED -0x4180 /**< Something failed during generation of a key. */ #define MBEDTLS_ERR_RSA_KEY_CHECK_FAILED -0x4200 /**< Key failed to pass the validity check of the library. */ #define MBEDTLS_ERR_RSA_PUBLIC_FAILED -0x4280 /**< The public key operation failed. */ #define MBEDTLS_ERR_RSA_PRIVATE_FAILED -0x4300 /**< The private key operation failed. */ #define MBEDTLS_ERR_RSA_VERIFY_FAILED -0x4380 /**< The PKCS#1 verification failed. */ #define MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE -0x4400 /**< The output buffer for decryption is not large enough. */ #define MBEDTLS_ERR_RSA_RNG_FAILED -0x4480 /**< The random generator failed to generate non-zeros. */ /* MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION is deprecated and should not be used. */ #define MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION -0x4500 /**< The implementation does not offer the requested operation, for example, because of security violations or lack of functionality. */ /* MBEDTLS_ERR_RSA_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_RSA_HW_ACCEL_FAILED -0x4580 /**< RSA hardware accelerator failed. */ /* * RSA constants */ #define MBEDTLS_RSA_PUBLIC 0 /**< Request private key operation. */ #define MBEDTLS_RSA_PRIVATE 1 /**< Request public key operation. */ #define MBEDTLS_RSA_PKCS_V15 0 /**< Use PKCS#1 v1.5 encoding. */ #define MBEDTLS_RSA_PKCS_V21 1 /**< Use PKCS#1 v2.1 encoding. */ #define MBEDTLS_RSA_SIGN 1 /**< Identifier for RSA signature operations. */ #define MBEDTLS_RSA_CRYPT 2 /**< Identifier for RSA encryption and decryption operations. */ #define MBEDTLS_RSA_SALT_LEN_ANY -1 /* * The above constants may be used even if the RSA module is compile out, * eg for alternative (PKCS#11) RSA implemenations in the PK layers. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_RSA_ALT) // Regular implementation // /** * \brief The RSA context structure. * * \note Direct manipulation of the members of this structure * is deprecated. All manipulation should instead be done through * the public interface functions. */ typedef struct mbedtls_rsa_context { int ver; /*!< Always 0.*/ size_t len; /*!< The size of \p N in Bytes. */ mbedtls_mpi N; /*!< The public modulus. */ mbedtls_mpi E; /*!< The public exponent. */ mbedtls_mpi D; /*!< The private exponent. */ mbedtls_mpi P; /*!< The first prime factor. */ mbedtls_mpi Q; /*!< The second prime factor. */ mbedtls_mpi DP; /*!< D % (P - 1). */ mbedtls_mpi DQ; /*!< D % (Q - 1). */ mbedtls_mpi QP; /*!< 1 / (Q % P). */ mbedtls_mpi RN; /*!< cached R^2 mod N. */ mbedtls_mpi RP; /*!< cached R^2 mod P. */ mbedtls_mpi RQ; /*!< cached R^2 mod Q. */ mbedtls_mpi Vi; /*!< The cached blinding value. */ mbedtls_mpi Vf; /*!< The cached un-blinding value. */ int padding; /*!< Selects padding mode: #MBEDTLS_RSA_PKCS_V15 for 1.5 padding and #MBEDTLS_RSA_PKCS_V21 for OAEP or PSS. */ int hash_id; /*!< Hash identifier of mbedtls_md_type_t type, as specified in md.h for use in the MGF mask generating function used in the EME-OAEP and EMSA-PSS encodings. */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; /*!< Thread-safety mutex. */ #endif } mbedtls_rsa_context; #else /* MBEDTLS_RSA_ALT */ #include "rsa_alt.h" #endif /* MBEDTLS_RSA_ALT */ /** * \brief This function initializes an RSA context. * * \note Set padding to #MBEDTLS_RSA_PKCS_V21 for the RSAES-OAEP * encryption scheme and the RSASSA-PSS signature scheme. * * \note The \p hash_id parameter is ignored when using * #MBEDTLS_RSA_PKCS_V15 padding. * * \note The choice of padding mode is strictly enforced for private key * operations, since there might be security concerns in * mixing padding modes. For public key operations it is * a default value, which can be overriden by calling specific * \c rsa_rsaes_xxx or \c rsa_rsassa_xxx functions. * * \note The hash selected in \p hash_id is always used for OEAP * encryption. For PSS signatures, it is always used for * making signatures, but can be overriden for verifying them. * If set to #MBEDTLS_MD_NONE, it is always overriden. * * \param ctx The RSA context to initialize. This must not be \c NULL. * \param padding The padding mode to use. This must be either * #MBEDTLS_RSA_PKCS_V15 or #MBEDTLS_RSA_PKCS_V21. * \param hash_id The hash identifier of ::mbedtls_md_type_t type, if * \p padding is #MBEDTLS_RSA_PKCS_V21. It is unused * otherwise. */ void mbedtls_rsa_init( mbedtls_rsa_context *ctx, int padding, int hash_id ); /** * \brief This function imports a set of core parameters into an * RSA context. * * \note This function can be called multiple times for successive * imports, if the parameters are not simultaneously present. * * Any sequence of calls to this function should be followed * by a call to mbedtls_rsa_complete(), which checks and * completes the provided information to a ready-for-use * public or private RSA key. * * \note See mbedtls_rsa_complete() for more information on which * parameters are necessary to set up a private or public * RSA key. * * \note The imported parameters are copied and need not be preserved * for the lifetime of the RSA context being set up. * * \param ctx The initialized RSA context to store the parameters in. * \param N The RSA modulus. This may be \c NULL. * \param P The first prime factor of \p N. This may be \c NULL. * \param Q The second prime factor of \p N. This may be \c NULL. * \param D The private exponent. This may be \c NULL. * \param E The public exponent. This may be \c NULL. * * \return \c 0 on success. * \return A non-zero error code on failure. */ int mbedtls_rsa_import( mbedtls_rsa_context *ctx, const mbedtls_mpi *N, const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *E ); /** * \brief This function imports core RSA parameters, in raw big-endian * binary format, into an RSA context. * * \note This function can be called multiple times for successive * imports, if the parameters are not simultaneously present. * * Any sequence of calls to this function should be followed * by a call to mbedtls_rsa_complete(), which checks and * completes the provided information to a ready-for-use * public or private RSA key. * * \note See mbedtls_rsa_complete() for more information on which * parameters are necessary to set up a private or public * RSA key. * * \note The imported parameters are copied and need not be preserved * for the lifetime of the RSA context being set up. * * \param ctx The initialized RSA context to store the parameters in. * \param N The RSA modulus. This may be \c NULL. * \param N_len The Byte length of \p N; it is ignored if \p N == NULL. * \param P The first prime factor of \p N. This may be \c NULL. * \param P_len The Byte length of \p P; it ns ignored if \p P == NULL. * \param Q The second prime factor of \p N. This may be \c NULL. * \param Q_len The Byte length of \p Q; it is ignored if \p Q == NULL. * \param D The private exponent. This may be \c NULL. * \param D_len The Byte length of \p D; it is ignored if \p D == NULL. * \param E The public exponent. This may be \c NULL. * \param E_len The Byte length of \p E; it is ignored if \p E == NULL. * * \return \c 0 on success. * \return A non-zero error code on failure. */ int mbedtls_rsa_import_raw( mbedtls_rsa_context *ctx, unsigned char const *N, size_t N_len, unsigned char const *P, size_t P_len, unsigned char const *Q, size_t Q_len, unsigned char const *D, size_t D_len, unsigned char const *E, size_t E_len ); /** * \brief This function completes an RSA context from * a set of imported core parameters. * * To setup an RSA public key, precisely \p N and \p E * must have been imported. * * To setup an RSA private key, sufficient information must * be present for the other parameters to be derivable. * * The default implementation supports the following: *
  • Derive \p P, \p Q from \p N, \p D, \p E.
  • *
  • Derive \p N, \p D from \p P, \p Q, \p E.
* Alternative implementations need not support these. * * If this function runs successfully, it guarantees that * the RSA context can be used for RSA operations without * the risk of failure or crash. * * \warning This function need not perform consistency checks * for the imported parameters. In particular, parameters that * are not needed by the implementation might be silently * discarded and left unchecked. To check the consistency * of the key material, see mbedtls_rsa_check_privkey(). * * \param ctx The initialized RSA context holding imported parameters. * * \return \c 0 on success. * \return #MBEDTLS_ERR_RSA_BAD_INPUT_DATA if the attempted derivations * failed. * */ int mbedtls_rsa_complete( mbedtls_rsa_context *ctx ); /** * \brief This function exports the core parameters of an RSA key. * * If this function runs successfully, the non-NULL buffers * pointed to by \p N, \p P, \p Q, \p D, and \p E are fully * written, with additional unused space filled leading by * zero Bytes. * * Possible reasons for returning * #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED:
    *
  • An alternative RSA implementation is in use, which * stores the key externally, and either cannot or should * not export it into RAM.
  • *
  • A SW or HW implementation might not support a certain * deduction. For example, \p P, \p Q from \p N, \p D, * and \p E if the former are not part of the * implementation.
* * If the function fails due to an unsupported operation, * the RSA context stays intact and remains usable. * * \param ctx The initialized RSA context. * \param N The MPI to hold the RSA modulus. * This may be \c NULL if this field need not be exported. * \param P The MPI to hold the first prime factor of \p N. * This may be \c NULL if this field need not be exported. * \param Q The MPI to hold the second prime factor of \p N. * This may be \c NULL if this field need not be exported. * \param D The MPI to hold the private exponent. * This may be \c NULL if this field need not be exported. * \param E The MPI to hold the public exponent. * This may be \c NULL if this field need not be exported. * * \return \c 0 on success. * \return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED if exporting the * requested parameters cannot be done due to missing * functionality or because of security policies. * \return A non-zero return code on any other failure. * */ int mbedtls_rsa_export( const mbedtls_rsa_context *ctx, mbedtls_mpi *N, mbedtls_mpi *P, mbedtls_mpi *Q, mbedtls_mpi *D, mbedtls_mpi *E ); /** * \brief This function exports core parameters of an RSA key * in raw big-endian binary format. * * If this function runs successfully, the non-NULL buffers * pointed to by \p N, \p P, \p Q, \p D, and \p E are fully * written, with additional unused space filled leading by * zero Bytes. * * Possible reasons for returning * #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED:
    *
  • An alternative RSA implementation is in use, which * stores the key externally, and either cannot or should * not export it into RAM.
  • *
  • A SW or HW implementation might not support a certain * deduction. For example, \p P, \p Q from \p N, \p D, * and \p E if the former are not part of the * implementation.
* If the function fails due to an unsupported operation, * the RSA context stays intact and remains usable. * * \note The length parameters are ignored if the corresponding * buffer pointers are NULL. * * \param ctx The initialized RSA context. * \param N The Byte array to store the RSA modulus, * or \c NULL if this field need not be exported. * \param N_len The size of the buffer for the modulus. * \param P The Byte array to hold the first prime factor of \p N, * or \c NULL if this field need not be exported. * \param P_len The size of the buffer for the first prime factor. * \param Q The Byte array to hold the second prime factor of \p N, * or \c NULL if this field need not be exported. * \param Q_len The size of the buffer for the second prime factor. * \param D The Byte array to hold the private exponent, * or \c NULL if this field need not be exported. * \param D_len The size of the buffer for the private exponent. * \param E The Byte array to hold the public exponent, * or \c NULL if this field need not be exported. * \param E_len The size of the buffer for the public exponent. * * \return \c 0 on success. * \return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED if exporting the * requested parameters cannot be done due to missing * functionality or because of security policies. * \return A non-zero return code on any other failure. */ int mbedtls_rsa_export_raw( const mbedtls_rsa_context *ctx, unsigned char *N, size_t N_len, unsigned char *P, size_t P_len, unsigned char *Q, size_t Q_len, unsigned char *D, size_t D_len, unsigned char *E, size_t E_len ); /** * \brief This function exports CRT parameters of a private RSA key. * * \note Alternative RSA implementations not using CRT-parameters * internally can implement this function based on * mbedtls_rsa_deduce_opt(). * * \param ctx The initialized RSA context. * \param DP The MPI to hold \c D modulo `P-1`, * or \c NULL if it need not be exported. * \param DQ The MPI to hold \c D modulo `Q-1`, * or \c NULL if it need not be exported. * \param QP The MPI to hold modular inverse of \c Q modulo \c P, * or \c NULL if it need not be exported. * * \return \c 0 on success. * \return A non-zero error code on failure. * */ int mbedtls_rsa_export_crt( const mbedtls_rsa_context *ctx, mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP ); /** * \brief This function sets padding for an already initialized RSA * context. See mbedtls_rsa_init() for details. * * \param ctx The initialized RSA context to be configured. * \param padding The padding mode to use. This must be either * #MBEDTLS_RSA_PKCS_V15 or #MBEDTLS_RSA_PKCS_V21. * \param hash_id The #MBEDTLS_RSA_PKCS_V21 hash identifier. */ void mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id ); /** * \brief This function retrieves the length of RSA modulus in Bytes. * * \param ctx The initialized RSA context. * * \return The length of the RSA modulus in Bytes. * */ size_t mbedtls_rsa_get_len( const mbedtls_rsa_context *ctx ); /** * \brief This function generates an RSA keypair. * * \note mbedtls_rsa_init() must be called before this function, * to set up the RSA context. * * \param ctx The initialized RSA context used to hold the key. * \param f_rng The RNG function to be used for key generation. * This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. * This may be \c NULL if \p f_rng doesn't need a context. * \param nbits The size of the public key in bits. * \param exponent The public exponent to use. For example, \c 65537. * This must be odd and greater than \c 1. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, unsigned int nbits, int exponent ); /** * \brief This function checks if a context contains at least an RSA * public key. * * If the function runs successfully, it is guaranteed that * enough information is present to perform an RSA public key * operation using mbedtls_rsa_public(). * * \param ctx The initialized RSA context to check. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. * */ int mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx ); /** * \brief This function checks if a context contains an RSA private key * and perform basic consistency checks. * * \note The consistency checks performed by this function not only * ensure that mbedtls_rsa_private() can be called successfully * on the given context, but that the various parameters are * mutually consistent with high probability, in the sense that * mbedtls_rsa_public() and mbedtls_rsa_private() are inverses. * * \warning This function should catch accidental misconfigurations * like swapping of parameters, but it cannot establish full * trust in neither the quality nor the consistency of the key * material that was used to setup the given RSA context: *
  • Consistency: Imported parameters that are irrelevant * for the implementation might be silently dropped. If dropped, * the current function does not have access to them, * and therefore cannot check them. See mbedtls_rsa_complete(). * If you want to check the consistency of the entire * content of an PKCS1-encoded RSA private key, for example, you * should use mbedtls_rsa_validate_params() before setting * up the RSA context. * Additionally, if the implementation performs empirical checks, * these checks substantiate but do not guarantee consistency.
  • *
  • Quality: This function is not expected to perform * extended quality assessments like checking that the prime * factors are safe. Additionally, it is the responsibility of the * user to ensure the trustworthiness of the source of his RSA * parameters, which goes beyond what is effectively checkable * by the library.
* * \param ctx The initialized RSA context to check. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx ); /** * \brief This function checks a public-private RSA key pair. * * It checks each of the contexts, and makes sure they match. * * \param pub The initialized RSA context holding the public key. * \param prv The initialized RSA context holding the private key. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, const mbedtls_rsa_context *prv ); /** * \brief This function performs an RSA public key operation. * * \param ctx The initialized RSA context to use. * \param input The input buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \note This function does not handle message padding. * * \note Make sure to set \p input[0] = 0 or ensure that * input is smaller than \p N. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_public( mbedtls_rsa_context *ctx, const unsigned char *input, unsigned char *output ); /** * \brief This function performs an RSA private key operation. * * \note Blinding is used if and only if a PRNG is provided. * * \note If blinding is used, both the base of exponentation * and the exponent are blinded, providing protection * against some side-channel attacks. * * \warning It is deprecated and a security risk to not provide * a PRNG here and thereby prevent the use of blinding. * Future versions of the library may enforce the presence * of a PRNG. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function, used for blinding. It is discouraged * and deprecated to pass \c NULL here, in which case * blinding will be omitted. * \param p_rng The RNG context to pass to \p f_rng. This may be \c NULL * if \p f_rng is \c NULL or if \p f_rng doesn't need a context. * \param input The input buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. * */ int mbedtls_rsa_private( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, const unsigned char *input, unsigned char *output ); /** * \brief This function adds the message padding, then performs an RSA * operation. * * It is the generic wrapper for performing a PKCS#1 encryption * operation using the \p mode from the context. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG to use. It is mandatory for PKCS#1 v2.1 padding * encoding, and for PKCS#1 v1.5 padding encoding when used * with \p mode set to #MBEDTLS_RSA_PUBLIC. For PKCS#1 v1.5 * padding encoding and \p mode set to #MBEDTLS_RSA_PRIVATE, * it is used for blinding and should be provided in this * case; see mbedtls_rsa_private() for more. * \param p_rng The RNG context to be passed to \p f_rng. May be * \c NULL if \p f_rng is \c NULL or if \p f_rng doesn't * need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param ilen The length of the plaintext in Bytes. * \param input The input data to encrypt. This must be a readable * buffer of size \p ilen Bytes. This must not be \c NULL. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t ilen, const unsigned char *input, unsigned char *output ); /** * \brief This function performs a PKCS#1 v1.5 encryption operation * (RSAES-PKCS1-v1_5-ENCRYPT). * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function to use. It is needed for padding generation * if \p mode is #MBEDTLS_RSA_PUBLIC. If \p mode is * #MBEDTLS_RSA_PRIVATE (discouraged), it is used for * blinding and should be provided; see mbedtls_rsa_private(). * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng is \c NULL or if \p f_rng * doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param ilen The length of the plaintext in Bytes. * \param input The input data to encrypt. This must be a readable * buffer of size \p ilen Bytes. This must not be \c NULL. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t ilen, const unsigned char *input, unsigned char *output ); /** * \brief This function performs a PKCS#1 v2.1 OAEP encryption * operation (RSAES-OAEP-ENCRYPT). * * \note The output buffer must be as large as the size * of ctx->N. For example, 128 Bytes if RSA-1024 is used. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initnialized RSA context to use. * \param f_rng The RNG function to use. This is needed for padding * generation and must be provided. * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param label The buffer holding the custom label to use. * This must be a readable buffer of length \p label_len * Bytes. It may be \c NULL if \p label_len is \c 0. * \param label_len The length of the label in Bytes. * \param ilen The length of the plaintext buffer \p input in Bytes. * \param input The input data to encrypt. This must be a readable * buffer of size \p ilen Bytes. This must not be \c NULL. * \param output The output buffer. This must be a writable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, const unsigned char *label, size_t label_len, size_t ilen, const unsigned char *input, unsigned char *output ); /** * \brief This function performs an RSA operation, then removes the * message padding. * * It is the generic wrapper for performing a PKCS#1 decryption * operation using the \p mode from the context. * * \note The output buffer length \c output_max_len should be * as large as the size \p ctx->len of \p ctx->N (for example, * 128 Bytes if RSA-1024 is used) to be able to hold an * arbitrary decrypted message. If it is not large enough to * hold the decryption of the particular ciphertext provided, * the function returns \c MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. If \p mode is * #MBEDTLS_RSA_PUBLIC, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param olen The address at which to store the length of * the plaintext. This must not be \c NULL. * \param input The ciphertext buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The buffer used to hold the plaintext. This must * be a writable buffer of length \p output_max_len Bytes. * \param output_max_len The length in Bytes of the output buffer \p output. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); /** * \brief This function performs a PKCS#1 v1.5 decryption * operation (RSAES-PKCS1-v1_5-DECRYPT). * * \note The output buffer length \c output_max_len should be * as large as the size \p ctx->len of \p ctx->N, for example, * 128 Bytes if RSA-1024 is used, to be able to hold an * arbitrary decrypted message. If it is not large enough to * hold the decryption of the particular ciphertext provided, * the function returns #MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. If \p mode is * #MBEDTLS_RSA_PUBLIC, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param olen The address at which to store the length of * the plaintext. This must not be \c NULL. * \param input The ciphertext buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The buffer used to hold the plaintext. This must * be a writable buffer of length \p output_max_len Bytes. * \param output_max_len The length in Bytes of the output buffer \p output. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. * */ int mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); /** * \brief This function performs a PKCS#1 v2.1 OAEP decryption * operation (RSAES-OAEP-DECRYPT). * * \note The output buffer length \c output_max_len should be * as large as the size \p ctx->len of \p ctx->N, for * example, 128 Bytes if RSA-1024 is used, to be able to * hold an arbitrary decrypted message. If it is not * large enough to hold the decryption of the particular * ciphertext provided, the function returns * #MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. If \p mode is * #MBEDTLS_RSA_PUBLIC, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param label The buffer holding the custom label to use. * This must be a readable buffer of length \p label_len * Bytes. It may be \c NULL if \p label_len is \c 0. * \param label_len The length of the label in Bytes. * \param olen The address at which to store the length of * the plaintext. This must not be \c NULL. * \param input The ciphertext buffer. This must be a readable buffer * of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * \param output The buffer used to hold the plaintext. This must * be a writable buffer of length \p output_max_len Bytes. * \param output_max_len The length in Bytes of the output buffer \p output. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, const unsigned char *label, size_t label_len, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); /** * \brief This function performs a private RSA operation to sign * a message digest using PKCS#1. * * It is the generic wrapper for performing a PKCS#1 * signature using the \p mode from the context. * * \note The \p sig buffer must be as large as the size * of \p ctx->N. For example, 128 Bytes if RSA-1024 is used. * * \note For PKCS#1 v2.1 encoding, see comments on * mbedtls_rsa_rsassa_pss_sign() for details on * \p md_alg and \p hash_id. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function to use. If the padding mode is PKCS#1 v2.1, * this must be provided. If the padding mode is PKCS#1 v1.5 and * \p mode is #MBEDTLS_RSA_PRIVATE, it is used for blinding * and should be provided; see mbedtls_rsa_private() for more * more. It is ignored otherwise. * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL * if \p f_rng is \c NULL or doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * Ths is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer to hold the signature. This must be a writable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the signing operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); /** * \brief This function performs a PKCS#1 v1.5 signature * operation (RSASSA-PKCS1-v1_5-SIGN). * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. If \p mode is * #MBEDTLS_RSA_PUBLIC, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL * if \p f_rng is \c NULL or doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * Ths is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer to hold the signature. This must be a writable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the signing operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); /** * \brief This function performs a PKCS#1 v2.1 PSS signature * operation (RSASSA-PSS-SIGN). * * \note The \p hash_id in the RSA context is the one used for the * encoding. \p md_alg in the function call is the type of hash * that is encoded. According to RFC-3447: Public-Key * Cryptography Standards (PKCS) #1 v2.1: RSA Cryptography * Specifications it is advised to keep both hashes the * same. * * \note This function always uses the maximum possible salt size, * up to the length of the payload hash. This choice of salt * size complies with FIPS 186-4 §5.5 (e) and RFC 8017 (PKCS#1 * v2.2) §9.1.1 step 3. Furthermore this function enforces a * minimum salt size which is the hash size minus 2 bytes. If * this minimum size is too large given the key size (the salt * size, plus the hash size, plus 2 bytes must be no more than * the key size in bytes), this function returns * #MBEDTLS_ERR_RSA_BAD_INPUT_DATA. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PUBLIC mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PRIVATE. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PUBLIC and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA context to use. * \param f_rng The RNG function. It must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL * if \p f_rng doesn't need a context argument. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PRIVATE or #MBEDTLS_RSA_PUBLIC (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * Ths is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer to hold the signature. This must be a writable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the signing operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); /** * \brief This function performs a public RSA operation and checks * the message digest. * * This is the generic wrapper for performing a PKCS#1 * verification using the mode from the context. * * \note For PKCS#1 v2.1 encoding, see comments on * mbedtls_rsa_rsassa_pss_verify() about \p md_alg and * \p hash_id. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA public key context to use. * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. Otherwise, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * This is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer holding the signature. This must be a readable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the verify operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ); /** * \brief This function performs a PKCS#1 v1.5 verification * operation (RSASSA-PKCS1-v1_5-VERIFY). * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA public key context to use. * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. Otherwise, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * This is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer holding the signature. This must be a readable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the verify operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ); /** * \brief This function performs a PKCS#1 v2.1 PSS verification * operation (RSASSA-PSS-VERIFY). * * The hash function for the MGF mask generating function * is that specified in the RSA context. * * \note The \p hash_id in the RSA context is the one used for the * verification. \p md_alg in the function call is the type of * hash that is verified. According to RFC-3447: Public-Key * Cryptography Standards (PKCS) #1 v2.1: RSA Cryptography * Specifications it is advised to keep both hashes the * same. If \p hash_id in the RSA context is unset, * the \p md_alg from the function call is used. * * \deprecated It is deprecated and discouraged to call this function * in #MBEDTLS_RSA_PRIVATE mode. Future versions of the library * are likely to remove the \p mode argument and have it * implicitly set to #MBEDTLS_RSA_PUBLIC. * * \note Alternative implementations of RSA need not support * mode being set to #MBEDTLS_RSA_PRIVATE and might instead * return #MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED. * * \param ctx The initialized RSA public key context to use. * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. Otherwise, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE (deprecated). * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * This is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param sig The buffer holding the signature. This must be a readable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the verify operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ); /** * \brief This function performs a PKCS#1 v2.1 PSS verification * operation (RSASSA-PSS-VERIFY). * * The hash function for the MGF mask generating function * is that specified in \p mgf1_hash_id. * * \note The \p sig buffer must be as large as the size * of \p ctx->N. For example, 128 Bytes if RSA-1024 is used. * * \note The \p hash_id in the RSA context is ignored. * * \param ctx The initialized RSA public key context to use. * \param f_rng The RNG function to use. If \p mode is #MBEDTLS_RSA_PRIVATE, * this is used for blinding and should be provided; see * mbedtls_rsa_private() for more. Otherwise, it is ignored. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a context. * \param mode The mode of operation. This must be either * #MBEDTLS_RSA_PUBLIC or #MBEDTLS_RSA_PRIVATE. * \param md_alg The message-digest algorithm used to hash the original data. * Use #MBEDTLS_MD_NONE for signing raw data. * \param hashlen The length of the message digest. * This is only used if \p md_alg is #MBEDTLS_MD_NONE. * \param hash The buffer holding the message digest or raw data. * If \p md_alg is #MBEDTLS_MD_NONE, this must be a readable * buffer of length \p hashlen Bytes. If \p md_alg is not * #MBEDTLS_MD_NONE, it must be a readable buffer of length * the size of the hash corresponding to \p md_alg. * \param mgf1_hash_id The message digest used for mask generation. * \param expected_salt_len The length of the salt used in padding. Use * #MBEDTLS_RSA_SALT_LEN_ANY to accept any salt length. * \param sig The buffer holding the signature. This must be a readable * buffer of length \c ctx->len Bytes. For example, \c 256 Bytes * for an 2048-bit RSA modulus. * * \return \c 0 if the verify operation was successful. * \return An \c MBEDTLS_ERR_RSA_XXX error code on failure. */ int mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, mbedtls_md_type_t mgf1_hash_id, int expected_salt_len, const unsigned char *sig ); /** * \brief This function copies the components of an RSA context. * * \param dst The destination context. This must be initialized. * \param src The source context. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory allocation failure. */ int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src ); /** * \brief This function frees the components of an RSA key. * * \param ctx The RSA context to free. May be \c NULL, in which case * this function is a no-op. If it is not \c NULL, it must * point to an initialized RSA context. */ void mbedtls_rsa_free( mbedtls_rsa_context *ctx ); /** * \brief The RSA checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_rsa_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* rsa.h */ fldigi-4.2.05/src/include/mbedtls/hmac_drbg.h0000664000175000017500000003001314611711171015703 00000000000000/** * \file hmac_drbg.h * * \brief HMAC_DRBG (NIST SP 800-90A) */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_HMAC_DRBG_H #define MBEDTLS_HMAC_DRBG_H #include "md.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif /* * Error codes */ #define MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG -0x0003 /**< Too many random requested in single call. */ #define MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG -0x0005 /**< Input too large (Entropy + additional). */ #define MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR -0x0007 /**< Read/write error in file. */ #define MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED -0x0009 /**< The entropy source failed. */ /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_HMAC_DRBG_RESEED_INTERVAL) #define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ #endif #if !defined(MBEDTLS_HMAC_DRBG_MAX_INPUT) #define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ #endif #if !defined(MBEDTLS_HMAC_DRBG_MAX_REQUEST) #define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ #endif #if !defined(MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT) #define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ #endif /* \} name SECTION: Module settings */ #define MBEDTLS_HMAC_DRBG_PR_OFF 0 /**< No prediction resistance */ #define MBEDTLS_HMAC_DRBG_PR_ON 1 /**< Prediction resistance enabled */ #ifdef __cplusplus extern "C" { #endif /** * HMAC_DRBG context. */ typedef struct mbedtls_hmac_drbg_context { /* Working state: the key K is not stored explicitely, * but is implied by the HMAC context */ mbedtls_md_context_t md_ctx; /*!< HMAC context (inc. K) */ unsigned char V[MBEDTLS_MD_MAX_SIZE]; /*!< V in the spec */ int reseed_counter; /*!< reseed counter */ /* Administrative state */ size_t entropy_len; /*!< entropy bytes grabbed on each (re)seed */ int prediction_resistance; /*!< enable prediction resistance (Automatic reseed before every random generation) */ int reseed_interval; /*!< reseed interval */ /* Callbacks */ int (*f_entropy)(void *, unsigned char *, size_t); /*!< entropy function */ void *p_entropy; /*!< context for the entropy function */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } mbedtls_hmac_drbg_context; /** * \brief HMAC_DRBG context initialization * Makes the context ready for mbedtls_hmac_drbg_seed(), * mbedtls_hmac_drbg_seed_buf() or * mbedtls_hmac_drbg_free(). * * \param ctx HMAC_DRBG context to be initialized */ void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx ); /** * \brief HMAC_DRBG initial seeding * Seed and setup entropy source for future reseeds. * * \param ctx HMAC_DRBG context to be seeded * \param md_info MD algorithm to use for HMAC_DRBG * \param f_entropy Entropy callback (p_entropy, buffer to fill, buffer * length) * \param p_entropy Entropy context * \param custom Personalization data (Device specific identifiers) * (Can be NULL) * \param len Length of personalization data * * \note The "security strength" as defined by NIST is set to: * 128 bits if md_alg is SHA-1, * 192 bits if md_alg is SHA-224, * 256 bits if md_alg is SHA-256 or higher. * Note that SHA-256 is just as efficient as SHA-224. * * \return 0 if successful, or * MBEDTLS_ERR_MD_BAD_INPUT_DATA, or * MBEDTLS_ERR_MD_ALLOC_FAILED, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED. */ int mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx, const mbedtls_md_info_t * md_info, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len ); /** * \brief Initilisation of simpified HMAC_DRBG (never reseeds). * (For use with deterministic ECDSA.) * * \param ctx HMAC_DRBG context to be initialised * \param md_info MD algorithm to use for HMAC_DRBG * \param data Concatenation of entropy string and additional data * \param data_len Length of data in bytes * * \return 0 if successful, or * MBEDTLS_ERR_MD_BAD_INPUT_DATA, or * MBEDTLS_ERR_MD_ALLOC_FAILED. */ int mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx, const mbedtls_md_info_t * md_info, const unsigned char *data, size_t data_len ); /** * \brief Enable / disable prediction resistance (Default: Off) * * Note: If enabled, entropy is used for ctx->entropy_len before each call! * Only use this if you have ample supply of good entropy! * * \param ctx HMAC_DRBG context * \param resistance MBEDTLS_HMAC_DRBG_PR_ON or MBEDTLS_HMAC_DRBG_PR_OFF */ void mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx, int resistance ); /** * \brief Set the amount of entropy grabbed on each reseed * (Default: given by the security strength, which * depends on the hash used, see \c mbedtls_hmac_drbg_init() ) * * \param ctx HMAC_DRBG context * \param len Amount of entropy to grab, in bytes */ void mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx, size_t len ); /** * \brief Set the reseed interval * (Default: MBEDTLS_HMAC_DRBG_RESEED_INTERVAL) * * \param ctx HMAC_DRBG context * \param interval Reseed interval */ void mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx, int interval ); /** * \brief HMAC_DRBG update state * * \param ctx HMAC_DRBG context * \param additional Additional data to update state with, or NULL * \param add_len Length of additional data, or 0 * * \return \c 0 on success, or an error from the underlying * hash calculation. * * \note Additional data is optional, pass NULL and 0 as second * third argument if no additional data is being used. */ int mbedtls_hmac_drbg_update_ret( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t add_len ); /** * \brief HMAC_DRBG reseeding (extracts data from entropy source) * * \param ctx HMAC_DRBG context * \param additional Additional data to add to state (Can be NULL) * \param len Length of additional data * * \return 0 if successful, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED */ int mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t len ); /** * \brief HMAC_DRBG generate random with additional update input * * Note: Automatically reseeds if reseed_counter is reached or PR is enabled. * * \param p_rng HMAC_DRBG context * \param output Buffer to fill * \param output_len Length of the buffer * \param additional Additional data to update with (can be NULL) * \param add_len Length of additional data (can be 0) * * \return 0 if successful, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or * MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG, or * MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG. */ int mbedtls_hmac_drbg_random_with_add( void *p_rng, unsigned char *output, size_t output_len, const unsigned char *additional, size_t add_len ); /** * \brief HMAC_DRBG generate random * * Note: Automatically reseeds if reseed_counter is reached or PR is enabled. * * \param p_rng HMAC_DRBG context * \param output Buffer to fill * \param out_len Length of the buffer * * \return 0 if successful, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or * MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG */ int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len ); /** * \brief Free an HMAC_DRBG context * * \param ctx HMAC_DRBG context to free. */ void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx ); #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief HMAC_DRBG update state * * \deprecated Superseded by mbedtls_hmac_drbg_update_ret() * in 2.16.0. * * \param ctx HMAC_DRBG context * \param additional Additional data to update state with, or NULL * \param add_len Length of additional data, or 0 * * \note Additional data is optional, pass NULL and 0 as second * third argument if no additional data is being used. */ MBEDTLS_DEPRECATED void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t add_len ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #if defined(MBEDTLS_FS_IO) /** * \brief Write a seed file * * \param ctx HMAC_DRBG context * \param path Name of the file * * \return 0 if successful, 1 on file error, or * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED */ int mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ); /** * \brief Read and update a seed file. Seed is added to this * instance * * \param ctx HMAC_DRBG context * \param path Name of the file * * \return 0 if successful, 1 on file error, * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED or * MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG */ int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ); #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_hmac_drbg_self_test( int verbose ); #endif #ifdef __cplusplus } #endif #endif /* hmac_drbg.h */ fldigi-4.2.05/src/include/mbedtls/threading.h0000664000175000017500000001102114611711171015740 00000000000000/** * \file threading.h * * \brief Threading abstraction layer */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_THREADING_H #define MBEDTLS_THREADING_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #ifdef __cplusplus extern "C" { #endif /* MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE is deprecated and should not be * used. */ #define MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE -0x001A /**< The selected feature is not available. */ #define MBEDTLS_ERR_THREADING_BAD_INPUT_DATA -0x001C /**< Bad input parameters to function. */ #define MBEDTLS_ERR_THREADING_MUTEX_ERROR -0x001E /**< Locking / unlocking / free failed with error code. */ #if defined(MBEDTLS_THREADING_PTHREAD) #include typedef struct mbedtls_threading_mutex_t { pthread_mutex_t mutex; char is_valid; } mbedtls_threading_mutex_t; #endif #if defined(MBEDTLS_THREADING_ALT) /* You should define the mbedtls_threading_mutex_t type in your header */ #include "threading_alt.h" /** * \brief Set your alternate threading implementation function * pointers and initialize global mutexes. If used, this * function must be called once in the main thread before any * other mbed TLS function is called, and * mbedtls_threading_free_alt() must be called once in the main * thread after all other mbed TLS functions. * * \note mutex_init() and mutex_free() don't return a status code. * If mutex_init() fails, it should leave its argument (the * mutex) in a state such that mutex_lock() will fail when * called with this argument. * * \param mutex_init the init function implementation * \param mutex_free the free function implementation * \param mutex_lock the lock function implementation * \param mutex_unlock the unlock function implementation */ void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ), void (*mutex_free)( mbedtls_threading_mutex_t * ), int (*mutex_lock)( mbedtls_threading_mutex_t * ), int (*mutex_unlock)( mbedtls_threading_mutex_t * ) ); /** * \brief Free global mutexes. */ void mbedtls_threading_free_alt( void ); #endif /* MBEDTLS_THREADING_ALT */ #if defined(MBEDTLS_THREADING_C) /* * The function pointers for mutex_init, mutex_free, mutex_ and mutex_unlock * * All these functions are expected to work or the result will be undefined. */ extern void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t *mutex ); extern void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t *mutex ); extern int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t *mutex ); extern int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t *mutex ); /* * Global mutexes */ #if defined(MBEDTLS_FS_IO) extern mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex; #endif #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) /* This mutex may or may not be used in the default definition of * mbedtls_platform_gmtime_r(), but in order to determine that, * we need to check POSIX features, hence modify _POSIX_C_SOURCE. * With the current approach, this declaration is orphaned, lacking * an accompanying definition, in case mbedtls_platform_gmtime_r() * doesn't need it, but that's not a problem. */ extern mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex; #endif /* MBEDTLS_HAVE_TIME_DATE && !MBEDTLS_PLATFORM_GMTIME_R_ALT */ #endif /* MBEDTLS_THREADING_C */ #ifdef __cplusplus } #endif #endif /* threading.h */ fldigi-4.2.05/src/include/mbedtls/ripemd160.h0000664000175000017500000001563314611711171015517 00000000000000/** * \file ripemd160.h * * \brief RIPE MD-160 message digest */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_RIPEMD160_H #define MBEDTLS_RIPEMD160_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED -0x0031 /**< RIPEMD160 hardware accelerator failed */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_RIPEMD160_ALT) // Regular implementation // /** * \brief RIPEMD-160 context structure */ typedef struct mbedtls_ripemd160_context { uint32_t total[2]; /*!< number of bytes processed */ uint32_t state[5]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ } mbedtls_ripemd160_context; #else /* MBEDTLS_RIPEMD160_ALT */ #include "ripemd160.h" #endif /* MBEDTLS_RIPEMD160_ALT */ /** * \brief Initialize RIPEMD-160 context * * \param ctx RIPEMD-160 context to be initialized */ void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx ); /** * \brief Clear RIPEMD-160 context * * \param ctx RIPEMD-160 context to be cleared */ void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx ); /** * \brief Clone (the state of) an RIPEMD-160 context * * \param dst The destination context * \param src The context to be cloned */ void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst, const mbedtls_ripemd160_context *src ); /** * \brief RIPEMD-160 context setup * * \param ctx context to be initialized * * \return 0 if successful */ int mbedtls_ripemd160_starts_ret( mbedtls_ripemd160_context *ctx ); /** * \brief RIPEMD-160 process buffer * * \param ctx RIPEMD-160 context * \param input buffer holding the data * \param ilen length of the input data * * \return 0 if successful */ int mbedtls_ripemd160_update_ret( mbedtls_ripemd160_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief RIPEMD-160 final digest * * \param ctx RIPEMD-160 context * \param output RIPEMD-160 checksum result * * \return 0 if successful */ int mbedtls_ripemd160_finish_ret( mbedtls_ripemd160_context *ctx, unsigned char output[20] ); /** * \brief RIPEMD-160 process data block (internal use only) * * \param ctx RIPEMD-160 context * \param data buffer holding one block of data * * \return 0 if successful */ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief RIPEMD-160 context setup * * \deprecated Superseded by mbedtls_ripemd160_starts_ret() in 2.7.0 * * \param ctx context to be initialized */ MBEDTLS_DEPRECATED void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx ); /** * \brief RIPEMD-160 process buffer * * \deprecated Superseded by mbedtls_ripemd160_update_ret() in 2.7.0 * * \param ctx RIPEMD-160 context * \param input buffer holding the data * \param ilen length of the input data */ MBEDTLS_DEPRECATED void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief RIPEMD-160 final digest * * \deprecated Superseded by mbedtls_ripemd160_finish_ret() in 2.7.0 * * \param ctx RIPEMD-160 context * \param output RIPEMD-160 checksum result */ MBEDTLS_DEPRECATED void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] ); /** * \brief RIPEMD-160 process data block (internal use only) * * \deprecated Superseded by mbedtls_internal_ripemd160_process() in 2.7.0 * * \param ctx RIPEMD-160 context * \param data buffer holding one block of data */ MBEDTLS_DEPRECATED void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Output = RIPEMD-160( input buffer ) * * \param input buffer holding the data * \param ilen length of the input data * \param output RIPEMD-160 checksum result * * \return 0 if successful */ int mbedtls_ripemd160_ret( const unsigned char *input, size_t ilen, unsigned char output[20] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Output = RIPEMD-160( input buffer ) * * \deprecated Superseded by mbedtls_ripemd160_ret() in 2.7.0 * * \param input buffer holding the data * \param ilen length of the input data * \param output RIPEMD-160 checksum result */ MBEDTLS_DEPRECATED void mbedtls_ripemd160( const unsigned char *input, size_t ilen, unsigned char output[20] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_ripemd160_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_ripemd160.h */ fldigi-4.2.05/src/include/mbedtls/nist_kw.h0000664000175000017500000001703314611711171015462 00000000000000/** * \file nist_kw.h * * \brief This file provides an API for key wrapping (KW) and key wrapping with * padding (KWP) as defined in NIST SP 800-38F. * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf * * Key wrapping specifies a deterministic authenticated-encryption mode * of operation, according to NIST SP 800-38F: Recommendation for * Block Cipher Modes of Operation: Methods for Key Wrapping. Its * purpose is to protect cryptographic keys. * * Its equivalent is RFC 3394 for KW, and RFC 5649 for KWP. * https://tools.ietf.org/html/rfc3394 * https://tools.ietf.org/html/rfc5649 * */ /* * Copyright (C) 2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_NIST_KW_H #define MBEDTLS_NIST_KW_H #include "cipher.h" #ifdef __cplusplus extern "C" { #endif typedef enum { MBEDTLS_KW_MODE_KW = 0, MBEDTLS_KW_MODE_KWP = 1 } mbedtls_nist_kw_mode_t; #if !defined(MBEDTLS_NIST_KW_ALT) // Regular implementation // /** * \brief The key wrapping context-type definition. The key wrapping context is passed * to the APIs called. * * \note The definition of this type may change in future library versions. * Don't make any assumptions on this context! */ typedef struct { mbedtls_cipher_context_t cipher_ctx; /*!< The cipher context used. */ } mbedtls_nist_kw_context; #else /* MBEDTLS_NIST_key wrapping_ALT */ #include "nist_kw_alt.h" #endif /* MBEDTLS_NIST_KW_ALT */ /** * \brief This function initializes the specified key wrapping context * to make references valid and prepare the context * for mbedtls_nist_kw_setkey() or mbedtls_nist_kw_free(). * * \param ctx The key wrapping context to initialize. * */ void mbedtls_nist_kw_init( mbedtls_nist_kw_context *ctx ); /** * \brief This function initializes the key wrapping context set in the * \p ctx parameter and sets the encryption key. * * \param ctx The key wrapping context. * \param cipher The 128-bit block cipher to use. Only AES is supported. * \param key The Key Encryption Key (KEK). * \param keybits The KEK size in bits. This must be acceptable by the cipher. * \param is_wrap Specify whether the operation within the context is wrapping or unwrapping * * \return \c 0 on success. * \return \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for any invalid input. * \return \c MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE for 128-bit block ciphers * which are not supported. * \return cipher-specific error code on failure of the underlying cipher. */ int mbedtls_nist_kw_setkey( mbedtls_nist_kw_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits, const int is_wrap ); /** * \brief This function releases and clears the specified key wrapping context * and underlying cipher sub-context. * * \param ctx The key wrapping context to clear. */ void mbedtls_nist_kw_free( mbedtls_nist_kw_context *ctx ); /** * \brief This function encrypts a buffer using key wrapping. * * \param ctx The key wrapping context to use for encryption. * \param mode The key wrapping mode to use (MBEDTLS_KW_MODE_KW or MBEDTLS_KW_MODE_KWP) * \param input The buffer holding the input data. * \param in_len The length of the input data in Bytes. * The input uses units of 8 Bytes called semiblocks. *
  • For KW mode: a multiple of 8 bytes between 16 and 2^57-8 inclusive.
  • *
  • For KWP mode: any length between 1 and 2^32-1 inclusive.
* \param[out] output The buffer holding the output data. *
  • For KW mode: Must be at least 8 bytes larger than \p in_len.
  • *
  • For KWP mode: Must be at least 8 bytes larger rounded up to a multiple of * 8 bytes for KWP (15 bytes at most).
* \param[out] out_len The number of bytes written to the output buffer. \c 0 on failure. * \param[in] out_size The capacity of the output buffer. * * \return \c 0 on success. * \return \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for invalid input length. * \return cipher-specific error code on failure of the underlying cipher. */ int mbedtls_nist_kw_wrap( mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, const unsigned char *input, size_t in_len, unsigned char *output, size_t* out_len, size_t out_size ); /** * \brief This function decrypts a buffer using key wrapping. * * \param ctx The key wrapping context to use for decryption. * \param mode The key wrapping mode to use (MBEDTLS_KW_MODE_KW or MBEDTLS_KW_MODE_KWP) * \param input The buffer holding the input data. * \param in_len The length of the input data in Bytes. * The input uses units of 8 Bytes called semiblocks. * The input must be a multiple of semiblocks. *
  • For KW mode: a multiple of 8 bytes between 24 and 2^57 inclusive.
  • *
  • For KWP mode: a multiple of 8 bytes between 16 and 2^32 inclusive.
* \param[out] output The buffer holding the output data. * The output buffer's minimal length is 8 bytes shorter than \p in_len. * \param[out] out_len The number of bytes written to the output buffer. \c 0 on failure. * For KWP mode, the length could be up to 15 bytes shorter than \p in_len, * depending on how much padding was added to the data. * \param[in] out_size The capacity of the output buffer. * * \return \c 0 on success. * \return \c MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA for invalid input length. * \return \c MBEDTLS_ERR_CIPHER_AUTH_FAILED for verification failure of the ciphertext. * \return cipher-specific error code on failure of the underlying cipher. */ int mbedtls_nist_kw_unwrap( mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, const unsigned char *input, size_t in_len, unsigned char *output, size_t* out_len, size_t out_size); #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) /** * \brief The key wrapping checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_nist_kw_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_NIST_KW_H */ fldigi-4.2.05/src/include/mbedtls/certs.h0000664000175000017500000000705414611711171015126 00000000000000/** * \file certs.h * * \brief Sample certificates and DHM parameters for testing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CERTS_H #define MBEDTLS_CERTS_H #include #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_PEM_PARSE_C) /* Concatenation of all CA certificates in PEM format if available */ extern const char mbedtls_test_cas_pem[]; extern const size_t mbedtls_test_cas_pem_len; #endif /* List of all CA certificates, terminated by NULL */ extern const char * mbedtls_test_cas[]; extern const size_t mbedtls_test_cas_len[]; /* * Convenience for users who just want a certificate: * RSA by default, or ECDSA if RSA is not available */ extern const char * mbedtls_test_ca_crt; extern const size_t mbedtls_test_ca_crt_len; extern const char * mbedtls_test_ca_key; extern const size_t mbedtls_test_ca_key_len; extern const char * mbedtls_test_ca_pwd; extern const size_t mbedtls_test_ca_pwd_len; extern const char * mbedtls_test_srv_crt; extern const size_t mbedtls_test_srv_crt_len; extern const char * mbedtls_test_srv_key; extern const size_t mbedtls_test_srv_key_len; extern const char * mbedtls_test_cli_crt; extern const size_t mbedtls_test_cli_crt_len; extern const char * mbedtls_test_cli_key; extern const size_t mbedtls_test_cli_key_len; #if defined(MBEDTLS_ECDSA_C) extern const char mbedtls_test_ca_crt_ec[]; extern const size_t mbedtls_test_ca_crt_ec_len; extern const char mbedtls_test_ca_key_ec[]; extern const size_t mbedtls_test_ca_key_ec_len; extern const char mbedtls_test_ca_pwd_ec[]; extern const size_t mbedtls_test_ca_pwd_ec_len; extern const char mbedtls_test_srv_crt_ec[]; extern const size_t mbedtls_test_srv_crt_ec_len; extern const char mbedtls_test_srv_key_ec[]; extern const size_t mbedtls_test_srv_key_ec_len; extern const char mbedtls_test_cli_crt_ec[]; extern const size_t mbedtls_test_cli_crt_ec_len; extern const char mbedtls_test_cli_key_ec[]; extern const size_t mbedtls_test_cli_key_ec_len; #endif #if defined(MBEDTLS_RSA_C) extern const char mbedtls_test_ca_crt_rsa[]; extern const size_t mbedtls_test_ca_crt_rsa_len; extern const char mbedtls_test_ca_key_rsa[]; extern const size_t mbedtls_test_ca_key_rsa_len; extern const char mbedtls_test_ca_pwd_rsa[]; extern const size_t mbedtls_test_ca_pwd_rsa_len; extern const char mbedtls_test_srv_crt_rsa[]; extern const size_t mbedtls_test_srv_crt_rsa_len; extern const char mbedtls_test_srv_key_rsa[]; extern const size_t mbedtls_test_srv_key_rsa_len; extern const char mbedtls_test_cli_crt_rsa[]; extern const size_t mbedtls_test_cli_crt_rsa_len; extern const char mbedtls_test_cli_key_rsa[]; extern const size_t mbedtls_test_cli_key_rsa_len; #endif #ifdef __cplusplus } #endif #endif /* certs.h */ fldigi-4.2.05/src/include/mbedtls/x509_crl.h0000664000175000017500000001254514611711171015354 00000000000000/** * \file x509_crl.h * * \brief X.509 certificate revocation list parsing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_X509_CRL_H #define MBEDTLS_X509_CRL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "x509.h" #ifdef __cplusplus extern "C" { #endif /** * \addtogroup x509_module * \{ */ /** * \name Structures and functions for parsing CRLs * \{ */ /** * Certificate revocation list entry. * Contains the CA-specific serial numbers and revocation dates. */ typedef struct mbedtls_x509_crl_entry { mbedtls_x509_buf raw; mbedtls_x509_buf serial; mbedtls_x509_time revocation_date; mbedtls_x509_buf entry_ext; struct mbedtls_x509_crl_entry *next; } mbedtls_x509_crl_entry; /** * Certificate revocation list structure. * Every CRL may have multiple entries. */ typedef struct mbedtls_x509_crl { mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ int version; /**< CRL version (1=v1, 2=v2) */ mbedtls_x509_buf sig_oid; /**< CRL signature type identifier */ mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). */ mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ mbedtls_x509_time this_update; mbedtls_x509_time next_update; mbedtls_x509_crl_entry entry; /**< The CRL entries containing the certificate revocation times for this CA. */ mbedtls_x509_buf crl_ext; mbedtls_x509_buf sig_oid2; mbedtls_x509_buf sig; mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ struct mbedtls_x509_crl *next; } mbedtls_x509_crl; /** * \brief Parse a DER-encoded CRL and append it to the chained list * * \param chain points to the start of the chain * \param buf buffer holding the CRL data in DER format * \param buflen size of the buffer * (including the terminating null byte for PEM data) * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ); /** * \brief Parse one or more CRLs and append them to the chained list * * \note Mutliple CRLs are accepted only if using PEM format * * \param chain points to the start of the chain * \param buf buffer holding the CRL data in PEM or DER format * \param buflen size of the buffer * (including the terminating null byte for PEM data) * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ); #if defined(MBEDTLS_FS_IO) /** * \brief Load one or more CRLs and append them to the chained list * * \note Mutliple CRLs are accepted only if using PEM format * * \param chain points to the start of the chain * \param path filename to read the CRLs from (in PEM or DER encoding) * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_crl_parse_file( mbedtls_x509_crl *chain, const char *path ); #endif /* MBEDTLS_FS_IO */ /** * \brief Returns an informational string about the CRL. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param prefix A line prefix * \param crl The X509 CRL to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_crl_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_crl *crl ); /** * \brief Initialize a CRL (chain) * * \param crl CRL chain to initialize */ void mbedtls_x509_crl_init( mbedtls_x509_crl *crl ); /** * \brief Unallocate all CRL data * * \param crl CRL chain to free */ void mbedtls_x509_crl_free( mbedtls_x509_crl *crl ); /* \} name */ /* \} addtogroup x509_module */ #ifdef __cplusplus } #endif #endif /* mbedtls_x509_crl.h */ fldigi-4.2.05/src/include/mbedtls/poly1305.h0000664000175000017500000001607014611711171015300 00000000000000/** * \file poly1305.h * * \brief This file contains Poly1305 definitions and functions. * * Poly1305 is a one-time message authenticator that can be used to * authenticate messages. Poly1305-AES was created by Daniel * Bernstein https://cr.yp.to/mac/poly1305-20050329.pdf The generic * Poly1305 algorithm (not tied to AES) was also standardized in RFC * 7539. * * \author Daniel King */ /* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved. * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_POLY1305_H #define MBEDTLS_POLY1305_H #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #define MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA -0x0057 /**< Invalid input parameter(s). */ /* MBEDTLS_ERR_POLY1305_FEATURE_UNAVAILABLE is deprecated and should not be * used. */ #define MBEDTLS_ERR_POLY1305_FEATURE_UNAVAILABLE -0x0059 /**< Feature not available. For example, s part of the API is not implemented. */ /* MBEDTLS_ERR_POLY1305_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_POLY1305_HW_ACCEL_FAILED -0x005B /**< Poly1305 hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_POLY1305_ALT) typedef struct mbedtls_poly1305_context { uint32_t r[4]; /** The value for 'r' (low 128 bits of the key). */ uint32_t s[4]; /** The value for 's' (high 128 bits of the key). */ uint32_t acc[5]; /** The accumulator number. */ uint8_t queue[16]; /** The current partial block of data. */ size_t queue_len; /** The number of bytes stored in 'queue'. */ } mbedtls_poly1305_context; #else /* MBEDTLS_POLY1305_ALT */ #include "poly1305_alt.h" #endif /* MBEDTLS_POLY1305_ALT */ /** * \brief This function initializes the specified Poly1305 context. * * It must be the first API called before using * the context. * * It is usually followed by a call to * \c mbedtls_poly1305_starts(), then one or more calls to * \c mbedtls_poly1305_update(), then one call to * \c mbedtls_poly1305_finish(), then finally * \c mbedtls_poly1305_free(). * * \param ctx The Poly1305 context to initialize. This must * not be \c NULL. */ void mbedtls_poly1305_init( mbedtls_poly1305_context *ctx ); /** * \brief This function releases and clears the specified * Poly1305 context. * * \param ctx The Poly1305 context to clear. This may be \c NULL, in which * case this function is a no-op. If it is not \c NULL, it must * point to an initialized Poly1305 context. */ void mbedtls_poly1305_free( mbedtls_poly1305_context *ctx ); /** * \brief This function sets the one-time authentication key. * * \warning The key must be unique and unpredictable for each * invocation of Poly1305. * * \param ctx The Poly1305 context to which the key should be bound. * This must be initialized. * \param key The buffer containing the \c 32 Byte (\c 256 Bit) key. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_poly1305_starts( mbedtls_poly1305_context *ctx, const unsigned char key[32] ); /** * \brief This functions feeds an input buffer into an ongoing * Poly1305 computation. * * It is called between \c mbedtls_cipher_poly1305_starts() and * \c mbedtls_cipher_poly1305_finish(). * It can be called repeatedly to process a stream of data. * * \param ctx The Poly1305 context to use for the Poly1305 operation. * This must be initialized and bound to a key. * \param ilen The length of the input data in Bytes. * Any value is accepted. * \param input The buffer holding the input data. * This pointer can be \c NULL if `ilen == 0`. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_poly1305_update( mbedtls_poly1305_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function generates the Poly1305 Message * Authentication Code (MAC). * * \param ctx The Poly1305 context to use for the Poly1305 operation. * This must be initialized and bound to a key. * \param mac The buffer to where the MAC is written. This must * be a writable buffer of length \c 16 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_poly1305_finish( mbedtls_poly1305_context *ctx, unsigned char mac[16] ); /** * \brief This function calculates the Poly1305 MAC of the input * buffer with the provided key. * * \warning The key must be unique and unpredictable for each * invocation of Poly1305. * * \param key The buffer containing the \c 32 Byte (\c 256 Bit) key. * \param ilen The length of the input data in Bytes. * Any value is accepted. * \param input The buffer holding the input data. * This pointer can be \c NULL if `ilen == 0`. * \param mac The buffer to where the MAC is written. This must be * a writable buffer of length \c 16 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_poly1305_mac( const unsigned char key[32], const unsigned char *input, size_t ilen, unsigned char mac[16] ); #if defined(MBEDTLS_SELF_TEST) /** * \brief The Poly1305 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_poly1305_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_POLY1305_H */ fldigi-4.2.05/src/include/mbedtls/check_config.h0000664000175000017500000006574014611711171016416 00000000000000/** * \file check_config.h * * \brief Consistency checks for configuration options */ /* * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * It is recommended to include this file from your config.h * in order to catch dependency issues early. */ #ifndef MBEDTLS_CHECK_CONFIG_H #define MBEDTLS_CHECK_CONFIG_H /* * We assume CHAR_BIT is 8 in many places. In practice, this is true on our * target platforms, so not an issue, but let's just be extra sure. */ #include #if CHAR_BIT != 8 #error "mbed TLS requires a platform with 8-bit chars" #endif #if defined(_WIN32) #if !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_C is required on Windows" #endif /* Fix the config here. Not convenient to put an #ifdef _WIN32 in config.h as * it would confuse config.pl. */ #if !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && \ !defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) #define MBEDTLS_PLATFORM_SNPRINTF_ALT #endif #endif /* _WIN32 */ #if defined(TARGET_LIKE_MBED) && \ ( defined(MBEDTLS_NET_C) || defined(MBEDTLS_TIMING_C) ) #error "The NET and TIMING modules are not available for mbed OS - please use the network and timing functions provided by mbed OS" #endif #if defined(MBEDTLS_DEPRECATED_WARNING) && \ !defined(__GNUC__) && !defined(__clang__) #error "MBEDTLS_DEPRECATED_WARNING only works with GCC and Clang" #endif #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_HAVE_TIME) #error "MBEDTLS_HAVE_TIME_DATE without MBEDTLS_HAVE_TIME does not make sense" #endif #if defined(MBEDTLS_AESNI_C) && !defined(MBEDTLS_HAVE_ASM) #error "MBEDTLS_AESNI_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_AES_C) #error "MBEDTLS_CTR_DRBG_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_DHM_C) && !defined(MBEDTLS_BIGNUM_C) #error "MBEDTLS_DHM_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) && !defined(MBEDTLS_SSL_TRUNCATED_HMAC) #error "MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT defined, but not all prerequisites" #endif #if defined(MBEDTLS_CMAC_C) && \ !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_DES_C) #error "MBEDTLS_CMAC_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_NIST_KW_C) && \ ( !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_CIPHER_C) ) #error "MBEDTLS_NIST_KW_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECDH_C) && !defined(MBEDTLS_ECP_C) #error "MBEDTLS_ECDH_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECDSA_C) && \ ( !defined(MBEDTLS_ECP_C) || \ !defined(MBEDTLS_ASN1_PARSE_C) || \ !defined(MBEDTLS_ASN1_WRITE_C) ) #error "MBEDTLS_ECDSA_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECJPAKE_C) && \ ( !defined(MBEDTLS_ECP_C) || !defined(MBEDTLS_MD_C) ) #error "MBEDTLS_ECJPAKE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_RESTARTABLE) && \ ( defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) || \ defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) || \ defined(MBEDTLS_ECDSA_SIGN_ALT) || \ defined(MBEDTLS_ECDSA_VERIFY_ALT) || \ defined(MBEDTLS_ECDSA_GENKEY_ALT) || \ defined(MBEDTLS_ECP_INTERNAL_ALT) || \ defined(MBEDTLS_ECP_ALT) ) #error "MBEDTLS_ECP_RESTARTABLE defined, but it cannot coexist with an alternative ECP implementation" #endif #if defined(MBEDTLS_ECDSA_DETERMINISTIC) && !defined(MBEDTLS_HMAC_DRBG_C) #error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_C) && ( !defined(MBEDTLS_BIGNUM_C) || ( \ !defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) && \ !defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) ) ) #error "MBEDTLS_ECP_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_ASN1_PARSE_C) #error "MBEDTLS_PK_PARSE_C defined, but not all prerequesites" #endif #if defined(MBEDTLS_ENTROPY_C) && (!defined(MBEDTLS_SHA512_C) && \ !defined(MBEDTLS_SHA256_C)) #error "MBEDTLS_ENTROPY_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_SHA512_C) && \ defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 64) #error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" #endif #if defined(MBEDTLS_ENTROPY_C) && \ ( !defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_ENTROPY_FORCE_SHA256) ) \ && defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 32) #error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" #endif #if defined(MBEDTLS_ENTROPY_C) && \ defined(MBEDTLS_ENTROPY_FORCE_SHA256) && !defined(MBEDTLS_SHA256_C) #error "MBEDTLS_ENTROPY_FORCE_SHA256 defined, but not all prerequisites" #endif #if defined(MBEDTLS_TEST_NULL_ENTROPY) && \ ( !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) ) #error "MBEDTLS_TEST_NULL_ENTROPY defined, but not all prerequisites" #endif #if defined(MBEDTLS_TEST_NULL_ENTROPY) && \ ( defined(MBEDTLS_ENTROPY_NV_SEED) || defined(MBEDTLS_ENTROPY_HARDWARE_ALT) || \ defined(MBEDTLS_HAVEGE_C) ) #error "MBEDTLS_TEST_NULL_ENTROPY defined, but entropy sources too" #endif #if defined(MBEDTLS_GCM_C) && ( \ !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_CAMELLIA_C) ) #error "MBEDTLS_GCM_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_RANDOMIZE_JAC_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_ADD_MIXED_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_ADD_MIXED_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_DOUBLE_JAC_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_NORMALIZE_JAC_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_RANDOMIZE_MXZ_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT) #error "MBEDTLS_ECP_NORMALIZE_MXZ_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_HAVEGE_C) && !defined(MBEDTLS_TIMING_C) #error "MBEDTLS_HAVEGE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_HKDF_C) && !defined(MBEDTLS_MD_C) #error "MBEDTLS_HKDF_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_HMAC_DRBG_C) && !defined(MBEDTLS_MD_C) #error "MBEDTLS_HMAC_DRBG_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) && \ ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) #error "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) #error "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) && !defined(MBEDTLS_DHM_C) #error "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) && \ !defined(MBEDTLS_ECDH_C) #error "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ ( !defined(MBEDTLS_DHM_C) || !defined(MBEDTLS_RSA_C) || \ !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_RSA_C) || \ !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \ ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_ECDSA_C) || \ !defined(MBEDTLS_X509_CRT_PARSE_C) ) #error "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \ ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) && \ ( !defined(MBEDTLS_ECJPAKE_C) || !defined(MBEDTLS_SHA256_C) || \ !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) ) #error "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED defined, but not all prerequisites" #endif #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \ ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) #error "MBEDTLS_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PADLOCK_C) && !defined(MBEDTLS_HAVE_ASM) #error "MBEDTLS_PADLOCK_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PEM_PARSE_C) && !defined(MBEDTLS_BASE64_C) #error "MBEDTLS_PEM_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PEM_WRITE_C) && !defined(MBEDTLS_BASE64_C) #error "MBEDTLS_PEM_WRITE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PK_C) && \ ( !defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_ECP_C) ) #error "MBEDTLS_PK_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_PK_C) #error "MBEDTLS_PK_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PK_WRITE_C) && !defined(MBEDTLS_PK_C) #error "MBEDTLS_PK_WRITE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PKCS11_C) && !defined(MBEDTLS_PK_C) #error "MBEDTLS_PKCS11_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_EXIT_ALT) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_EXIT_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_EXIT_MACRO) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_EXIT_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_EXIT_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_EXIT) ||\ defined(MBEDTLS_PLATFORM_EXIT_ALT) ) #error "MBEDTLS_PLATFORM_EXIT_MACRO and MBEDTLS_PLATFORM_STD_EXIT/MBEDTLS_PLATFORM_EXIT_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_TIME_ALT) &&\ ( !defined(MBEDTLS_PLATFORM_C) ||\ !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_TIME_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) ||\ !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_TIME_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) ||\ !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_TIME_TYPE_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\ defined(MBEDTLS_PLATFORM_TIME_ALT) ) #error "MBEDTLS_PLATFORM_TIME_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\ defined(MBEDTLS_PLATFORM_TIME_ALT) ) #error "MBEDTLS_PLATFORM_TIME_TYPE_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_FPRINTF_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_FPRINTF_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_FPRINTF) ||\ defined(MBEDTLS_PLATFORM_FPRINTF_ALT) ) #error "MBEDTLS_PLATFORM_FPRINTF_MACRO and MBEDTLS_PLATFORM_STD_FPRINTF/MBEDTLS_PLATFORM_FPRINTF_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) #error "MBEDTLS_PLATFORM_FREE_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ defined(MBEDTLS_PLATFORM_STD_FREE) #error "MBEDTLS_PLATFORM_FREE_MACRO and MBEDTLS_PLATFORM_STD_FREE cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_FREE_MACRO) && !defined(MBEDTLS_PLATFORM_CALLOC_MACRO) #error "MBEDTLS_PLATFORM_CALLOC_MACRO must be defined if MBEDTLS_PLATFORM_FREE_MACRO is" #endif #if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) #error "MBEDTLS_PLATFORM_CALLOC_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ defined(MBEDTLS_PLATFORM_STD_CALLOC) #error "MBEDTLS_PLATFORM_CALLOC_MACRO and MBEDTLS_PLATFORM_STD_CALLOC cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && !defined(MBEDTLS_PLATFORM_FREE_MACRO) #error "MBEDTLS_PLATFORM_FREE_MACRO must be defined if MBEDTLS_PLATFORM_CALLOC_MACRO is" #endif #if defined(MBEDTLS_PLATFORM_MEMORY) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_MEMORY defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_PRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_PRINTF_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_PRINTF_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_PRINTF) ||\ defined(MBEDTLS_PLATFORM_PRINTF_ALT) ) #error "MBEDTLS_PLATFORM_PRINTF_MACRO and MBEDTLS_PLATFORM_STD_PRINTF/MBEDTLS_PLATFORM_PRINTF_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_SNPRINTF_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) #error "MBEDTLS_PLATFORM_SNPRINTF_MACRO defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_SNPRINTF) ||\ defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) ) #error "MBEDTLS_PLATFORM_SNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_SNPRINTF/MBEDTLS_PLATFORM_SNPRINTF_ALT cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) &&\ !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) #error "MBEDTLS_PLATFORM_STD_MEM_HDR defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) #error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) #error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_FREE) && !defined(MBEDTLS_PLATFORM_MEMORY) #error "MBEDTLS_PLATFORM_STD_FREE defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_EXIT) &&\ !defined(MBEDTLS_PLATFORM_EXIT_ALT) #error "MBEDTLS_PLATFORM_STD_EXIT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_TIME) &&\ ( !defined(MBEDTLS_PLATFORM_TIME_ALT) ||\ !defined(MBEDTLS_HAVE_TIME) ) #error "MBEDTLS_PLATFORM_STD_TIME defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_FPRINTF) &&\ !defined(MBEDTLS_PLATFORM_FPRINTF_ALT) #error "MBEDTLS_PLATFORM_STD_FPRINTF defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_PRINTF) &&\ !defined(MBEDTLS_PLATFORM_PRINTF_ALT) #error "MBEDTLS_PLATFORM_STD_PRINTF defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_SNPRINTF) &&\ !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) #error "MBEDTLS_PLATFORM_STD_SNPRINTF defined, but not all prerequisites" #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) &&\ ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_ENTROPY_C) ) #error "MBEDTLS_ENTROPY_NV_SEED defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) &&\ !defined(MBEDTLS_ENTROPY_NV_SEED) #error "MBEDTLS_PLATFORM_NV_SEED_ALT defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) &&\ !defined(MBEDTLS_PLATFORM_NV_SEED_ALT) #error "MBEDTLS_PLATFORM_STD_NV_SEED_READ defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) &&\ !defined(MBEDTLS_PLATFORM_NV_SEED_ALT) #error "MBEDTLS_PLATFORM_STD_NV_SEED_WRITE defined, but not all prerequisites" #endif #if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) ||\ defined(MBEDTLS_PLATFORM_NV_SEED_ALT) ) #error "MBEDTLS_PLATFORM_NV_SEED_READ_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_READ cannot be defined simultaneously" #endif #if defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO) &&\ ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) ||\ defined(MBEDTLS_PLATFORM_NV_SEED_ALT) ) #error "MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_WRITE cannot be defined simultaneously" #endif #if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ !defined(MBEDTLS_OID_C) ) #error "MBEDTLS_RSA_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_PKCS1_V21) && \ !defined(MBEDTLS_PKCS1_V15) ) #error "MBEDTLS_RSA_C defined, but none of the PKCS1 versions enabled" #endif #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \ ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_PKCS1_V21) ) #error "MBEDTLS_X509_RSASSA_PSS_SUPPORT defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_SSL3) && ( !defined(MBEDTLS_MD5_C) || \ !defined(MBEDTLS_SHA1_C) ) #error "MBEDTLS_SSL_PROTO_SSL3 defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) && ( !defined(MBEDTLS_MD5_C) || \ !defined(MBEDTLS_SHA1_C) ) #error "MBEDTLS_SSL_PROTO_TLS1 defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_1) && ( !defined(MBEDTLS_MD5_C) || \ !defined(MBEDTLS_SHA1_C) ) #error "MBEDTLS_SSL_PROTO_TLS1_1 defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && ( !defined(MBEDTLS_SHA1_C) && \ !defined(MBEDTLS_SHA256_C) && !defined(MBEDTLS_SHA512_C) ) #error "MBEDTLS_SSL_PROTO_TLS1_2 defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_2) #error "MBEDTLS_SSL_PROTO_DTLS defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_CLI_C) && !defined(MBEDTLS_SSL_TLS_C) #error "MBEDTLS_SSL_CLI_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_TLS_C) && ( !defined(MBEDTLS_CIPHER_C) || \ !defined(MBEDTLS_MD_C) ) #error "MBEDTLS_SSL_TLS_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_SRV_C) && !defined(MBEDTLS_SSL_TLS_C) #error "MBEDTLS_SSL_SRV_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_TLS_C) && (!defined(MBEDTLS_SSL_PROTO_SSL3) && \ !defined(MBEDTLS_SSL_PROTO_TLS1) && !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_2)) #error "MBEDTLS_SSL_TLS_C defined, but no protocols are active" #endif #if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ defined(MBEDTLS_SSL_PROTO_TLS1_1) && !defined(MBEDTLS_SSL_PROTO_TLS1)) #error "Illegal protocol selection" #endif #if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_TLS1) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) && !defined(MBEDTLS_SSL_PROTO_TLS1_1)) #error "Illegal protocol selection" #endif #if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) && (!defined(MBEDTLS_SSL_PROTO_TLS1) || \ !defined(MBEDTLS_SSL_PROTO_TLS1_1))) #error "Illegal protocol selection" #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && !defined(MBEDTLS_SSL_PROTO_DTLS) #error "MBEDTLS_SSL_DTLS_HELLO_VERIFY defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && \ !defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) #error "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) && \ ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) #error "MBEDTLS_SSL_DTLS_ANTI_REPLAY defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) #error "MBEDTLS_SSL_DTLS_BADMAC_LIMIT defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \ !defined(MBEDTLS_SSL_PROTO_TLS1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_2) #error "MBEDTLS_SSL_ENCRYPT_THEN_MAC defined, but not all prerequsites" #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \ !defined(MBEDTLS_SSL_PROTO_TLS1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ !defined(MBEDTLS_SSL_PROTO_TLS1_2) #error "MBEDTLS_SSL_EXTENDED_MASTER_SECRET defined, but not all prerequsites" #endif #if defined(MBEDTLS_SSL_TICKET_C) && !defined(MBEDTLS_CIPHER_C) #error "MBEDTLS_SSL_TICKET_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) && \ !defined(MBEDTLS_SSL_PROTO_SSL3) && !defined(MBEDTLS_SSL_PROTO_TLS1) #error "MBEDTLS_SSL_CBC_RECORD_SPLITTING defined, but not all prerequisites" #endif #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \ !defined(MBEDTLS_X509_CRT_PARSE_C) #error "MBEDTLS_SSL_SERVER_NAME_INDICATION defined, but not all prerequisites" #endif #if defined(MBEDTLS_THREADING_PTHREAD) #if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) #error "MBEDTLS_THREADING_PTHREAD defined, but not all prerequisites" #endif #define MBEDTLS_THREADING_IMPL #endif #if defined(MBEDTLS_THREADING_ALT) #if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) #error "MBEDTLS_THREADING_ALT defined, but not all prerequisites" #endif #define MBEDTLS_THREADING_IMPL #endif #if defined(MBEDTLS_THREADING_C) && !defined(MBEDTLS_THREADING_IMPL) #error "MBEDTLS_THREADING_C defined, single threading implementation required" #endif #undef MBEDTLS_THREADING_IMPL #if defined(MBEDTLS_VERSION_FEATURES) && !defined(MBEDTLS_VERSION_C) #error "MBEDTLS_VERSION_FEATURES defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_USE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_PARSE_C) || \ !defined(MBEDTLS_PK_PARSE_C) ) #error "MBEDTLS_X509_USE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CREATE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_WRITE_C) || \ !defined(MBEDTLS_PK_WRITE_C) ) #error "MBEDTLS_X509_CREATE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) #error "MBEDTLS_X509_CRT_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CRL_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) #error "MBEDTLS_X509_CRL_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CSR_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) #error "MBEDTLS_X509_CSR_PARSE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CRT_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) #error "MBEDTLS_X509_CRT_WRITE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_X509_CSR_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) #error "MBEDTLS_X509_CSR_WRITE_C defined, but not all prerequisites" #endif #if defined(MBEDTLS_HAVE_INT32) && defined(MBEDTLS_HAVE_INT64) #error "MBEDTLS_HAVE_INT32 and MBEDTLS_HAVE_INT64 cannot be defined simultaneously" #endif /* MBEDTLS_HAVE_INT32 && MBEDTLS_HAVE_INT64 */ #if ( defined(MBEDTLS_HAVE_INT32) || defined(MBEDTLS_HAVE_INT64) ) && \ defined(MBEDTLS_HAVE_ASM) #error "MBEDTLS_HAVE_INT32/MBEDTLS_HAVE_INT64 and MBEDTLS_HAVE_ASM cannot be defined simultaneously" #endif /* (MBEDTLS_HAVE_INT32 || MBEDTLS_HAVE_INT64) && MBEDTLS_HAVE_ASM */ /* * Avoid warning from -pedantic. This is a convenient place for this * workaround since this is included by every single file before the * #if defined(MBEDTLS_xxx_C) that results in emtpy translation units. */ typedef int mbedtls_iso_c_forbids_empty_translation_units; #endif /* MBEDTLS_CHECK_CONFIG_H */ fldigi-4.2.05/src/include/mbedtls/gcm.h0000664000175000017500000003314014611711171014547 00000000000000/** * \file gcm.h * * \brief This file contains GCM definitions and functions. * * The Galois/Counter Mode (GCM) for 128-bit block ciphers is defined * in D. McGrew, J. Viega, The Galois/Counter Mode of Operation * (GCM), Natl. Inst. Stand. Technol. * * For more information on GCM, see NIST SP 800-38D: Recommendation for * Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC. * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_GCM_H #define MBEDTLS_GCM_H #include "cipher.h" #include #define MBEDTLS_GCM_ENCRYPT 1 #define MBEDTLS_GCM_DECRYPT 0 #define MBEDTLS_ERR_GCM_AUTH_FAILED -0x0012 /**< Authenticated decryption failed. */ /* MBEDTLS_ERR_GCM_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_GCM_HW_ACCEL_FAILED -0x0013 /**< GCM hardware accelerator failed. */ #define MBEDTLS_ERR_GCM_BAD_INPUT -0x0014 /**< Bad input parameters to function. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_GCM_ALT) /** * \brief The GCM context structure. */ typedef struct mbedtls_gcm_context { mbedtls_cipher_context_t cipher_ctx; /*!< The cipher context used. */ uint64_t HL[16]; /*!< Precalculated HTable low. */ uint64_t HH[16]; /*!< Precalculated HTable high. */ uint64_t len; /*!< The total length of the encrypted data. */ uint64_t add_len; /*!< The total length of the additional data. */ unsigned char base_ectr[16]; /*!< The first ECTR for tag. */ unsigned char y[16]; /*!< The Y working value. */ unsigned char buf[16]; /*!< The buf working value. */ int mode; /*!< The operation to perform: #MBEDTLS_GCM_ENCRYPT or #MBEDTLS_GCM_DECRYPT. */ } mbedtls_gcm_context; #else /* !MBEDTLS_GCM_ALT */ #include "gcm_alt.h" #endif /* !MBEDTLS_GCM_ALT */ /** * \brief This function initializes the specified GCM context, * to make references valid, and prepares the context * for mbedtls_gcm_setkey() or mbedtls_gcm_free(). * * The function does not bind the GCM context to a particular * cipher, nor set the key. For this purpose, use * mbedtls_gcm_setkey(). * * \param ctx The GCM context to initialize. This must not be \c NULL. */ void mbedtls_gcm_init( mbedtls_gcm_context *ctx ); /** * \brief This function associates a GCM context with a * cipher algorithm and a key. * * \param ctx The GCM context. This must be initialized. * \param cipher The 128-bit block cipher to use. * \param key The encryption key. This must be a readable buffer of at * least \p keybits bits. * \param keybits The key size in bits. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return A cipher-specific error code on failure. */ int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits ); /** * \brief This function performs GCM encryption or decryption of a buffer. * * \note For encryption, the output buffer can be the same as the * input buffer. For decryption, the output buffer cannot be * the same as input buffer. If the buffers overlap, the output * buffer must trail at least 8 Bytes behind the input buffer. * * \warning When this function performs a decryption, it outputs the * authentication tag and does not verify that the data is * authentic. You should use this function to perform encryption * only. For decryption, use mbedtls_gcm_auth_decrypt() instead. * * \param ctx The GCM context to use for encryption or decryption. This * must be initialized. * \param mode The operation to perform: * - #MBEDTLS_GCM_ENCRYPT to perform authenticated encryption. * The ciphertext is written to \p output and the * authentication tag is written to \p tag. * - #MBEDTLS_GCM_DECRYPT to perform decryption. * The plaintext is written to \p output and the * authentication tag is written to \p tag. * Note that this mode is not recommended, because it does * not verify the authenticity of the data. For this reason, * you should use mbedtls_gcm_auth_decrypt() instead of * calling this function in decryption mode. * \param length The length of the input data, which is equal to the length * of the output data. * \param iv The initialization vector. This must be a readable buffer of * at least \p iv_len Bytes. * \param iv_len The length of the IV. * \param add The buffer holding the additional data. This must be of at * least that size in Bytes. * \param add_len The length of the additional data. * \param input The buffer holding the input data. If \p length is greater * than zero, this must be a readable buffer of at least that * size in Bytes. * \param output The buffer for holding the output data. If \p length is greater * than zero, this must be a writable buffer of at least that * size in Bytes. * \param tag_len The length of the tag to generate. * \param tag The buffer for holding the tag. This must be a readable * buffer of at least \p tag_len Bytes. * * \return \c 0 if the encryption or decryption was performed * successfully. Note that in #MBEDTLS_GCM_DECRYPT mode, * this does not indicate that the data is authentic. * \return #MBEDTLS_ERR_GCM_BAD_INPUT if the lengths or pointers are * not valid or a cipher-specific error code if the encryption * or decryption failed. */ int mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx, int mode, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, size_t tag_len, unsigned char *tag ); /** * \brief This function performs a GCM authenticated decryption of a * buffer. * * \note For decryption, the output buffer cannot be the same as * input buffer. If the buffers overlap, the output buffer * must trail at least 8 Bytes behind the input buffer. * * \param ctx The GCM context. This must be initialized. * \param length The length of the ciphertext to decrypt, which is also * the length of the decrypted plaintext. * \param iv The initialization vector. This must be a readable buffer * of at least \p iv_len Bytes. * \param iv_len The length of the IV. * \param add The buffer holding the additional data. This must be of at * least that size in Bytes. * \param add_len The length of the additional data. * \param tag The buffer holding the tag to verify. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the tag to verify. * \param input The buffer holding the ciphertext. If \p length is greater * than zero, this must be a readable buffer of at least that * size. * \param output The buffer for holding the decrypted plaintext. If \p length * is greater than zero, this must be a writable buffer of at * least that size. * * \return \c 0 if successful and authenticated. * \return #MBEDTLS_ERR_GCM_AUTH_FAILED if the tag does not match. * \return #MBEDTLS_ERR_GCM_BAD_INPUT if the lengths or pointers are * not valid or a cipher-specific error code if the decryption * failed. */ int mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *tag, size_t tag_len, const unsigned char *input, unsigned char *output ); /** * \brief This function starts a GCM encryption or decryption * operation. * * \param ctx The GCM context. This must be initialized. * \param mode The operation to perform: #MBEDTLS_GCM_ENCRYPT or * #MBEDTLS_GCM_DECRYPT. * \param iv The initialization vector. This must be a readable buffer of * at least \p iv_len Bytes. * \param iv_len The length of the IV. * \param add The buffer holding the additional data, or \c NULL * if \p add_len is \c 0. * \param add_len The length of the additional data. If \c 0, * \p add may be \c NULL. * * \return \c 0 on success. */ int mbedtls_gcm_starts( mbedtls_gcm_context *ctx, int mode, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len ); /** * \brief This function feeds an input buffer into an ongoing GCM * encryption or decryption operation. * * ` The function expects input to be a multiple of 16 * Bytes. Only the last call before calling * mbedtls_gcm_finish() can be less than 16 Bytes. * * \note For decryption, the output buffer cannot be the same as * input buffer. If the buffers overlap, the output buffer * must trail at least 8 Bytes behind the input buffer. * * \param ctx The GCM context. This must be initialized. * \param length The length of the input data. This must be a multiple of * 16 except in the last call before mbedtls_gcm_finish(). * \param input The buffer holding the input data. If \p length is greater * than zero, this must be a readable buffer of at least that * size in Bytes. * \param output The buffer for holding the output data. If \p length is * greater than zero, this must be a writable buffer of at * least that size in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_GCM_BAD_INPUT on failure. */ int mbedtls_gcm_update( mbedtls_gcm_context *ctx, size_t length, const unsigned char *input, unsigned char *output ); /** * \brief This function finishes the GCM operation and generates * the authentication tag. * * It wraps up the GCM stream, and generates the * tag. The tag can have a maximum length of 16 Bytes. * * \param ctx The GCM context. This must be initialized. * \param tag The buffer for holding the tag. This must be a readable * buffer of at least \p tag_len Bytes. * \param tag_len The length of the tag to generate. This must be at least * four. * * \return \c 0 on success. * \return #MBEDTLS_ERR_GCM_BAD_INPUT on failure. */ int mbedtls_gcm_finish( mbedtls_gcm_context *ctx, unsigned char *tag, size_t tag_len ); /** * \brief This function clears a GCM context and the underlying * cipher sub-context. * * \param ctx The GCM context to clear. If this is \c NULL, the call has * no effect. Otherwise, this must be initialized. */ void mbedtls_gcm_free( mbedtls_gcm_context *ctx ); /** * \brief The GCM checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_gcm_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* gcm.h */ fldigi-4.2.05/src/include/mbedtls/ecdh.h0000664000175000017500000004425614611711171014716 00000000000000/** * \file ecdh.h * * \brief This file contains ECDH definitions and functions. * * The Elliptic Curve Diffie-Hellman (ECDH) protocol is an anonymous * key agreement protocol allowing two parties to establish a shared * secret over an insecure channel. Each party must have an * elliptic-curve public–private key pair. * * For more information, see NIST SP 800-56A Rev. 2: Recommendation for * Pair-Wise Key Establishment Schemes Using Discrete Logarithm * Cryptography. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ECDH_H #define MBEDTLS_ECDH_H #include "ecp.h" /* * Use a backward compatible ECDH context. * * This flag is always enabled for now and future versions might add a * configuration option that conditionally undefines this flag. * The configuration option in question may have a different name. * * Features undefining this flag, must have a warning in their description in * config.h stating that the feature breaks backward compatibility. */ #define MBEDTLS_ECDH_LEGACY_CONTEXT #ifdef __cplusplus extern "C" { #endif /** * Defines the source of the imported EC key. */ typedef enum { MBEDTLS_ECDH_OURS, /**< Our key. */ MBEDTLS_ECDH_THEIRS, /**< The key of the peer. */ } mbedtls_ecdh_side; #if !defined(MBEDTLS_ECDH_LEGACY_CONTEXT) /** * Defines the ECDH implementation used. * * Later versions of the library may add new variants, therefore users should * not make any assumptions about them. */ typedef enum { MBEDTLS_ECDH_VARIANT_NONE = 0, /*!< Implementation not defined. */ MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0,/*!< The default Mbed TLS implementation */ } mbedtls_ecdh_variant; /** * The context used by the default ECDH implementation. * * Later versions might change the structure of this context, therefore users * should not make any assumptions about the structure of * mbedtls_ecdh_context_mbed. */ typedef struct mbedtls_ecdh_context_mbed { mbedtls_ecp_group grp; /*!< The elliptic curve used. */ mbedtls_mpi d; /*!< The private key. */ mbedtls_ecp_point Q; /*!< The public key. */ mbedtls_ecp_point Qp; /*!< The value of the public key of the peer. */ mbedtls_mpi z; /*!< The shared secret. */ #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */ #endif } mbedtls_ecdh_context_mbed; #endif /** * * \warning Performing multiple operations concurrently on the same * ECDSA context is not supported; objects of this type * should not be shared between multiple threads. * \brief The ECDH context structure. */ typedef struct mbedtls_ecdh_context { #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) mbedtls_ecp_group grp; /*!< The elliptic curve used. */ mbedtls_mpi d; /*!< The private key. */ mbedtls_ecp_point Q; /*!< The public key. */ mbedtls_ecp_point Qp; /*!< The value of the public key of the peer. */ mbedtls_mpi z; /*!< The shared secret. */ int point_format; /*!< The format of point export in TLS messages. */ mbedtls_ecp_point Vi; /*!< The blinding value. */ mbedtls_ecp_point Vf; /*!< The unblinding value. */ mbedtls_mpi _d; /*!< The previous \p d. */ #if defined(MBEDTLS_ECP_RESTARTABLE) int restart_enabled; /*!< The flag for restartable mode. */ mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */ #endif /* MBEDTLS_ECP_RESTARTABLE */ #else uint8_t point_format; /*!< The format of point export in TLS messages as defined in RFC 4492. */ mbedtls_ecp_group_id grp_id;/*!< The elliptic curve used. */ mbedtls_ecdh_variant var; /*!< The ECDH implementation/structure used. */ union { mbedtls_ecdh_context_mbed mbed_ecdh; } ctx; /*!< Implementation-specific context. The context in use is specified by the \c var field. */ #if defined(MBEDTLS_ECP_RESTARTABLE) uint8_t restart_enabled; /*!< The flag for restartable mode. Functions of an alternative implementation not supporting restartable mode must return MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED error if this flag is set. */ #endif /* MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_ECDH_LEGACY_CONTEXT */ } mbedtls_ecdh_context; /** * \brief This function generates an ECDH keypair on an elliptic * curve. * * This function performs the first of two core computations * implemented during the ECDH key exchange. The second core * computation is performed by mbedtls_ecdh_compute_shared(). * * \see ecp.h * * \param grp The ECP group to use. This must be initialized and have * domain parameters loaded, for example through * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group(). * \param d The destination MPI (private key). * This must be initialized. * \param Q The destination point (public key). * This must be initialized. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL in case \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return Another \c MBEDTLS_ERR_ECP_XXX or * \c MBEDTLS_MPI_XXX error code on failure. */ int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function computes the shared secret. * * This function performs the second of two core computations * implemented during the ECDH key exchange. The first core * computation is performed by mbedtls_ecdh_gen_public(). * * \see ecp.h * * \note If \p f_rng is not NULL, it is used to implement * countermeasures against side-channel attacks. * For more information, see mbedtls_ecp_mul(). * * \param grp The ECP group to use. This must be initialized and have * domain parameters loaded, for example through * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group(). * \param z The destination MPI (shared secret). * This must be initialized. * \param Q The public key from another party. * This must be initialized. * \param d Our secret exponent (private key). * This must be initialized. * \param f_rng The RNG function. This may be \c NULL if randomization * of intermediate results during the ECP computations is * not needed (discouraged). See the documentation of * mbedtls_ecp_mul() for more. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't need a * context argument. * * \return \c 0 on success. * \return Another \c MBEDTLS_ERR_ECP_XXX or * \c MBEDTLS_MPI_XXX error code on failure. */ int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z, const mbedtls_ecp_point *Q, const mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function initializes an ECDH context. * * \param ctx The ECDH context to initialize. This must not be \c NULL. */ void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx ); /** * \brief This function sets up the ECDH context with the information * given. * * This function should be called after mbedtls_ecdh_init() but * before mbedtls_ecdh_make_params(). There is no need to call * this function before mbedtls_ecdh_read_params(). * * This is the first function used by a TLS server for ECDHE * ciphersuites. * * \param ctx The ECDH context to set up. This must be initialized. * \param grp_id The group id of the group to set up the context for. * * \return \c 0 on success. */ int mbedtls_ecdh_setup( mbedtls_ecdh_context *ctx, mbedtls_ecp_group_id grp_id ); /** * \brief This function frees a context. * * \param ctx The context to free. This may be \c NULL, in which * case this function does nothing. If it is not \c NULL, * it must point to an initialized ECDH context. */ void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx ); /** * \brief This function generates an EC key pair and exports its * in the format used in a TLS ServerKeyExchange handshake * message. * * This is the second function used by a TLS server for ECDHE * ciphersuites. (It is called after mbedtls_ecdh_setup().) * * \see ecp.h * * \param ctx The ECDH context to use. This must be initialized * and bound to a group, for example via mbedtls_ecdh_setup(). * \param olen The address at which to store the number of Bytes written. * \param buf The destination buffer. This must be a writable buffer of * length \p blen Bytes. * \param blen The length of the destination buffer \p buf in Bytes. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL in case \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. */ int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function parses the ECDHE parameters in a * TLS ServerKeyExchange handshake message. * * \note In a TLS handshake, this is the how the client * sets up its ECDHE context from the server's public * ECDHE key material. * * \see ecp.h * * \param ctx The ECDHE context to use. This must be initialized. * \param buf On input, \c *buf must be the start of the input buffer. * On output, \c *buf is updated to point to the end of the * data that has been read. On success, this is the first byte * past the end of the ServerKeyExchange parameters. * On error, this is the point at which an error has been * detected, which is usually not useful except to debug * failures. * \param end The end of the input buffer. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX error code on failure. * */ int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx, const unsigned char **buf, const unsigned char *end ); /** * \brief This function sets up an ECDH context from an EC key. * * It is used by clients and servers in place of the * ServerKeyEchange for static ECDH, and imports ECDH * parameters from the EC key information of a certificate. * * \see ecp.h * * \param ctx The ECDH context to set up. This must be initialized. * \param key The EC key to use. This must be initialized. * \param side Defines the source of the key. Possible values are: * - #MBEDTLS_ECDH_OURS: The key is ours. * - #MBEDTLS_ECDH_THEIRS: The key is that of the peer. * * \return \c 0 on success. * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. * */ int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key, mbedtls_ecdh_side side ); /** * \brief This function generates a public key and exports it * as a TLS ClientKeyExchange payload. * * This is the second function used by a TLS client for ECDH(E) * ciphersuites. * * \see ecp.h * * \param ctx The ECDH context to use. This must be initialized * and bound to a group, the latter usually by * mbedtls_ecdh_read_params(). * \param olen The address at which to store the number of Bytes written. * This must not be \c NULL. * \param buf The destination buffer. This must be a writable buffer * of length \p blen Bytes. * \param blen The size of the destination buffer \p buf in Bytes. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL in case \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. */ int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function parses and processes the ECDHE payload of a * TLS ClientKeyExchange message. * * This is the third function used by a TLS server for ECDH(E) * ciphersuites. (It is called after mbedtls_ecdh_setup() and * mbedtls_ecdh_make_params().) * * \see ecp.h * * \param ctx The ECDH context to use. This must be initialized * and bound to a group, for example via mbedtls_ecdh_setup(). * \param buf The pointer to the ClientKeyExchange payload. This must * be a readable buffer of length \p blen Bytes. * \param blen The length of the input buffer \p buf in Bytes. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX error code on failure. */ int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx, const unsigned char *buf, size_t blen ); /** * \brief This function derives and exports the shared secret. * * This is the last function used by both TLS client * and servers. * * \note If \p f_rng is not NULL, it is used to implement * countermeasures against side-channel attacks. * For more information, see mbedtls_ecp_mul(). * * \see ecp.h * \param ctx The ECDH context to use. This must be initialized * and have its own private key generated and the peer's * public key imported. * \param olen The address at which to store the total number of * Bytes written on success. This must not be \c NULL. * \param buf The buffer to write the generated shared key to. This * must be a writable buffer of size \p blen Bytes. * \param blen The length of the destination buffer \p buf in Bytes. * \param f_rng The RNG function, for blinding purposes. This may * b \c NULL if blinding isn't needed. * \param p_rng The RNG context. This may be \c NULL if \p f_rng * doesn't need a context argument. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX error code on failure. */ int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief This function enables restartable EC computations for this * context. (Default: disabled.) * * \see \c mbedtls_ecp_set_max_ops() * * \note It is not possible to safely disable restartable * computations once enabled, except by free-ing the context, * which cancels possible in-progress operations. * * \param ctx The ECDH context to use. This must be initialized. */ void mbedtls_ecdh_enable_restart( mbedtls_ecdh_context *ctx ); #endif /* MBEDTLS_ECP_RESTARTABLE */ #ifdef __cplusplus } #endif #endif /* ecdh.h */ fldigi-4.2.05/src/include/mbedtls/pk_internal.h0000664000175000017500000001122514611711171016307 00000000000000/** * \file pk_internal.h * * \brief Public Key abstraction layer: wrapper functions */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PK_WRAP_H #define MBEDTLS_PK_WRAP_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "pk.h" struct mbedtls_pk_info_t { /** Public key type */ mbedtls_pk_type_t type; /** Type name */ const char *name; /** Get key size in bits */ size_t (*get_bitlen)( const void * ); /** Tell if the context implements this type (e.g. ECKEY can do ECDSA) */ int (*can_do)( mbedtls_pk_type_t type ); /** Verify signature */ int (*verify_func)( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ); /** Make signature */ int (*sign_func)( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** Verify signature (restartable) */ int (*verify_rs_func)( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, void *rs_ctx ); /** Make signature (restartable) */ int (*sign_rs_func)( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, void *rs_ctx ); #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /** Decrypt message */ int (*decrypt_func)( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** Encrypt message */ int (*encrypt_func)( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** Check public-private key pair */ int (*check_pair_func)( const void *pub, const void *prv ); /** Allocate a new context */ void * (*ctx_alloc_func)( void ); /** Free the given context */ void (*ctx_free_func)( void *ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** Allocate the restart context */ void * (*rs_alloc_func)( void ); /** Free the restart context */ void (*rs_free_func)( void *rs_ctx ); #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /** Interface with the debug module */ void (*debug_func)( const void *ctx, mbedtls_pk_debug_item *items ); }; #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /* Container for RSA-alt */ typedef struct { void *key; mbedtls_pk_rsa_alt_decrypt_func decrypt_func; mbedtls_pk_rsa_alt_sign_func sign_func; mbedtls_pk_rsa_alt_key_len_func key_len_func; } mbedtls_rsa_alt_context; #endif #if defined(MBEDTLS_RSA_C) extern const mbedtls_pk_info_t mbedtls_rsa_info; #endif #if defined(MBEDTLS_ECP_C) extern const mbedtls_pk_info_t mbedtls_eckey_info; extern const mbedtls_pk_info_t mbedtls_eckeydh_info; #endif #if defined(MBEDTLS_ECDSA_C) extern const mbedtls_pk_info_t mbedtls_ecdsa_info; #endif #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) extern const mbedtls_pk_info_t mbedtls_rsa_alt_info; #endif #endif /* MBEDTLS_PK_WRAP_H */ fldigi-4.2.05/src/include/mbedtls/ssl_ticket.h0000664000175000017500000001061614611711171016150 00000000000000/** * \file ssl_ticket.h * * \brief TLS server ticket callbacks implementation */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_TICKET_H #define MBEDTLS_SSL_TICKET_H /* * This implementation of the session ticket callbacks includes key * management, rotating the keys periodically in order to preserve forward * secrecy, when MBEDTLS_HAVE_TIME is defined. */ #include "ssl.h" #include "cipher.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif #ifdef __cplusplus extern "C" { #endif /** * \brief Information for session ticket protection */ typedef struct mbedtls_ssl_ticket_key { unsigned char name[4]; /*!< random key identifier */ uint32_t generation_time; /*!< key generation timestamp (seconds) */ mbedtls_cipher_context_t ctx; /*!< context for auth enc/decryption */ } mbedtls_ssl_ticket_key; /** * \brief Context for session ticket handling functions */ typedef struct mbedtls_ssl_ticket_context { mbedtls_ssl_ticket_key keys[2]; /*!< ticket protection keys */ unsigned char active; /*!< index of the currently active key */ uint32_t ticket_lifetime; /*!< lifetime of tickets in seconds */ /** Callback for getting (pseudo-)random numbers */ int (*f_rng)(void *, unsigned char *, size_t); void *p_rng; /*!< context for the RNG function */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } mbedtls_ssl_ticket_context; /** * \brief Initialize a ticket context. * (Just make it ready for mbedtls_ssl_ticket_setup() * or mbedtls_ssl_ticket_free().) * * \param ctx Context to be initialized */ void mbedtls_ssl_ticket_init( mbedtls_ssl_ticket_context *ctx ); /** * \brief Prepare context to be actually used * * \param ctx Context to be set up * \param f_rng RNG callback function * \param p_rng RNG callback context * \param cipher AEAD cipher to use for ticket protection. * Recommended value: MBEDTLS_CIPHER_AES_256_GCM. * \param lifetime Tickets lifetime in seconds * Recommended value: 86400 (one day). * * \note It is highly recommended to select a cipher that is at * least as strong as the the strongest ciphersuite * supported. Usually that means a 256-bit key. * * \note The lifetime of the keys is twice the lifetime of tickets. * It is recommended to pick a reasonnable lifetime so as not * to negate the benefits of forward secrecy. * * \return 0 if successful, * or a specific MBEDTLS_ERR_XXX error code */ int mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_cipher_type_t cipher, uint32_t lifetime ); /** * \brief Implementation of the ticket write callback * * \note See \c mbedlts_ssl_ticket_write_t for description */ mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write; /** * \brief Implementation of the ticket parse callback * * \note See \c mbedlts_ssl_ticket_parse_t for description */ mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse; /** * \brief Free a context's content and zeroize it. * * \param ctx Context to be cleaned up */ void mbedtls_ssl_ticket_free( mbedtls_ssl_ticket_context *ctx ); #ifdef __cplusplus } #endif #endif /* ssl_ticket.h */ fldigi-4.2.05/src/include/mbedtls/padlock.h0000664000175000017500000000754614611711171015431 00000000000000/** * \file padlock.h * * \brief VIA PadLock ACE for HW encryption/decryption supported by some * processors * * \warning These functions are only for internal use by other library * functions; you must not call them directly. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PADLOCK_H #define MBEDTLS_PADLOCK_H #include "aes.h" #define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */ #if defined(__has_feature) #if __has_feature(address_sanitizer) #define MBEDTLS_HAVE_ASAN #endif #endif /* Some versions of ASan result in errors about not enough registers */ #if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && defined(__i386__) && \ !defined(MBEDTLS_HAVE_ASAN) #ifndef MBEDTLS_HAVE_X86 #define MBEDTLS_HAVE_X86 #endif #include #define MBEDTLS_PADLOCK_RNG 0x000C #define MBEDTLS_PADLOCK_ACE 0x00C0 #define MBEDTLS_PADLOCK_PHE 0x0C00 #define MBEDTLS_PADLOCK_PMM 0x3000 #define MBEDTLS_PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) x & ~15)) #ifdef __cplusplus extern "C" { #endif /** * \brief Internal PadLock detection routine * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param feature The feature to detect * * \return 1 if CPU has support for the feature, 0 otherwise */ int mbedtls_padlock_has_support( int feature ); /** * \brief Internal PadLock AES-ECB block en(de)cryption * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param ctx AES context * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT * \param input 16-byte input block * \param output 16-byte output block * * \return 0 if success, 1 if operation failed */ int mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ); /** * \brief Internal PadLock AES-CBC buffer en(de)cryption * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param ctx AES context * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT * \param length length of the input data * \param iv initialization vector (updated after use) * \param input buffer holding the input data * \param output buffer holding the output data * * \return 0 if success, 1 if operation failed */ int mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #ifdef __cplusplus } #endif #endif /* HAVE_X86 */ #endif /* padlock.h */ fldigi-4.2.05/src/include/mbedtls/timing.h0000664000175000017500000001137714611711171015300 00000000000000/** * \file timing.h * * \brief Portable interface to timeouts and to the CPU cycle counter */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_TIMING_H #define MBEDTLS_TIMING_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_TIMING_ALT) // Regular implementation // /** * \brief timer structure */ struct mbedtls_timing_hr_time { unsigned char opaque[32]; }; /** * \brief Context for mbedtls_timing_set/get_delay() */ typedef struct mbedtls_timing_delay_context { struct mbedtls_timing_hr_time timer; uint32_t int_ms; uint32_t fin_ms; } mbedtls_timing_delay_context; #else /* MBEDTLS_TIMING_ALT */ #include "timing_alt.h" #endif /* MBEDTLS_TIMING_ALT */ extern volatile int mbedtls_timing_alarmed; /** * \brief Return the CPU cycle counter value * * \warning This is only a best effort! Do not rely on this! * In particular, it is known to be unreliable on virtual * machines. * * \note This value starts at an unspecified origin and * may wrap around. */ unsigned long mbedtls_timing_hardclock( void ); /** * \brief Return the elapsed time in milliseconds * * \param val points to a timer structure * \param reset If 0, query the elapsed time. Otherwise (re)start the timer. * * \return Elapsed time since the previous reset in ms. When * restarting, this is always 0. * * \note To initialize a timer, call this function with reset=1. * * Determining the elapsed time and resetting the timer is not * atomic on all platforms, so after the sequence * `{ get_timer(1); ...; time1 = get_timer(1); ...; time2 = * get_timer(0) }` the value time1+time2 is only approximately * the delay since the first reset. */ unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset ); /** * \brief Setup an alarm clock * * \param seconds delay before the "mbedtls_timing_alarmed" flag is set * (must be >=0) * * \warning Only one alarm at a time is supported. In a threaded * context, this means one for the whole process, not one per * thread. */ void mbedtls_set_alarm( int seconds ); /** * \brief Set a pair of delays to watch * (See \c mbedtls_timing_get_delay().) * * \param data Pointer to timing data. * Must point to a valid \c mbedtls_timing_delay_context struct. * \param int_ms First (intermediate) delay in milliseconds. * The effect if int_ms > fin_ms is unspecified. * \param fin_ms Second (final) delay in milliseconds. * Pass 0 to cancel the current delay. * * \note To set a single delay, either use \c mbedtls_timing_set_timer * directly or use this function with int_ms == fin_ms. */ void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms ); /** * \brief Get the status of delays * (Memory helper: number of delays passed.) * * \param data Pointer to timing data * Must point to a valid \c mbedtls_timing_delay_context struct. * * \return -1 if cancelled (fin_ms = 0), * 0 if none of the delays are passed, * 1 if only the intermediate delay is passed, * 2 if the final delay is passed. */ int mbedtls_timing_get_delay( void *data ); #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * \return 0 if successful, or 1 if a test failed */ int mbedtls_timing_self_test( int verbose ); #endif #ifdef __cplusplus } #endif #endif /* timing.h */ fldigi-4.2.05/src/include/mbedtls/dhm.h0000664000175000017500000015313114611711171014554 00000000000000/** * \file dhm.h * * \brief This file contains Diffie-Hellman-Merkle (DHM) key exchange * definitions and functions. * * Diffie-Hellman-Merkle (DHM) key exchange is defined in * RFC-2631: Diffie-Hellman Key Agreement Method and * Public-Key Cryptography Standards (PKCS) #3: Diffie * Hellman Key Agreement Standard. * * RFC-3526: More Modular Exponential (MODP) Diffie-Hellman groups for * Internet Key Exchange (IKE) defines a number of standardized * Diffie-Hellman groups for IKE. * * RFC-5114: Additional Diffie-Hellman Groups for Use with IETF * Standards defines a number of standardized Diffie-Hellman * groups that can be used. * * \warning The security of the DHM key exchange relies on the proper choice * of prime modulus - optimally, it should be a safe prime. The usage * of non-safe primes both decreases the difficulty of the underlying * discrete logarithm problem and can lead to small subgroup attacks * leaking private exponent bits when invalid public keys are used * and not detected. This is especially relevant if the same DHM * parameters are reused for multiple key exchanges as in static DHM, * while the criticality of small-subgroup attacks is lower for * ephemeral DHM. * * \warning For performance reasons, the code does neither perform primality * nor safe primality tests, nor the expensive checks for invalid * subgroups. Moreover, even if these were performed, non-standardized * primes cannot be trusted because of the possibility of backdoors * that can't be effectively checked for. * * \warning Diffie-Hellman-Merkle is therefore a security risk when not using * standardized primes generated using a trustworthy ("nothing up * my sleeve") method, such as the RFC 3526 / 7919 primes. In the TLS * protocol, DH parameters need to be negotiated, so using the default * primes systematically is not always an option. If possible, use * Elliptic Curve Diffie-Hellman (ECDH), which has better performance, * and for which the TLS protocol mandates the use of standard * parameters. * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_DHM_H #define MBEDTLS_DHM_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "bignum.h" /* * DHM Error codes */ #define MBEDTLS_ERR_DHM_BAD_INPUT_DATA -0x3080 /**< Bad input parameters. */ #define MBEDTLS_ERR_DHM_READ_PARAMS_FAILED -0x3100 /**< Reading of the DHM parameters failed. */ #define MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED -0x3180 /**< Making of the DHM parameters failed. */ #define MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED -0x3200 /**< Reading of the public values failed. */ #define MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED -0x3280 /**< Making of the public value failed. */ #define MBEDTLS_ERR_DHM_CALC_SECRET_FAILED -0x3300 /**< Calculation of the DHM secret failed. */ #define MBEDTLS_ERR_DHM_INVALID_FORMAT -0x3380 /**< The ASN.1 data is not formatted correctly. */ #define MBEDTLS_ERR_DHM_ALLOC_FAILED -0x3400 /**< Allocation of memory failed. */ #define MBEDTLS_ERR_DHM_FILE_IO_ERROR -0x3480 /**< Read or write of file failed. */ /* MBEDTLS_ERR_DHM_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_DHM_HW_ACCEL_FAILED -0x3500 /**< DHM hardware accelerator failed. */ #define MBEDTLS_ERR_DHM_SET_GROUP_FAILED -0x3580 /**< Setting the modulus and generator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_DHM_ALT) /** * \brief The DHM context structure. */ typedef struct mbedtls_dhm_context { size_t len; /*!< The size of \p P in Bytes. */ mbedtls_mpi P; /*!< The prime modulus. */ mbedtls_mpi G; /*!< The generator. */ mbedtls_mpi X; /*!< Our secret value. */ mbedtls_mpi GX; /*!< Our public key = \c G^X mod \c P. */ mbedtls_mpi GY; /*!< The public key of the peer = \c G^Y mod \c P. */ mbedtls_mpi K; /*!< The shared secret = \c G^(XY) mod \c P. */ mbedtls_mpi RP; /*!< The cached value = \c R^2 mod \c P. */ mbedtls_mpi Vi; /*!< The blinding value. */ mbedtls_mpi Vf; /*!< The unblinding value. */ mbedtls_mpi pX; /*!< The previous \c X. */ } mbedtls_dhm_context; #else /* MBEDTLS_DHM_ALT */ #include "dhm_alt.h" #endif /* MBEDTLS_DHM_ALT */ /** * \brief This function initializes the DHM context. * * \param ctx The DHM context to initialize. */ void mbedtls_dhm_init( mbedtls_dhm_context *ctx ); /** * \brief This function parses the DHM parameters in a * TLS ServerKeyExchange handshake message * (DHM modulus, generator, and public key). * * \note In a TLS handshake, this is the how the client * sets up its DHM context from the server's public * DHM key material. * * \param ctx The DHM context to use. This must be initialized. * \param p On input, *p must be the start of the input buffer. * On output, *p is updated to point to the end of the data * that has been read. On success, this is the first byte * past the end of the ServerKeyExchange parameters. * On error, this is the point at which an error has been * detected, which is usually not useful except to debug * failures. * \param end The end of the input buffer. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_read_params( mbedtls_dhm_context *ctx, unsigned char **p, const unsigned char *end ); /** * \brief This function generates a DHM key pair and exports its * public part together with the DHM parameters in the format * used in a TLS ServerKeyExchange handshake message. * * \note This function assumes that the DHM parameters \c ctx->P * and \c ctx->G have already been properly set. For that, use * mbedtls_dhm_set_group() below in conjunction with * mbedtls_mpi_read_binary() and mbedtls_mpi_read_string(). * * \note In a TLS handshake, this is the how the server generates * and exports its DHM key material. * * \param ctx The DHM context to use. This must be initialized * and have the DHM parameters set. It may or may not * already have imported the peer's public key. * \param x_size The private key size in Bytes. * \param olen The address at which to store the number of Bytes * written on success. This must not be \c NULL. * \param output The destination buffer. This must be a writable buffer of * sufficient size to hold the reduced binary presentation of * the modulus, the generator and the public key, each wrapped * with a 2-byte length field. It is the responsibility of the * caller to ensure that enough space is available. Refer to * mbedtls_mpi_size() to computing the byte-size of an MPI. * \param f_rng The RNG function. Must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context parameter. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size, unsigned char *output, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function sets the prime modulus and generator. * * \note This function can be used to set \c ctx->P, \c ctx->G * in preparation for mbedtls_dhm_make_params(). * * \param ctx The DHM context to configure. This must be initialized. * \param P The MPI holding the DHM prime modulus. This must be * an initialized MPI. * \param G The MPI holding the DHM generator. This must be an * initialized MPI. * * \return \c 0 if successful. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_set_group( mbedtls_dhm_context *ctx, const mbedtls_mpi *P, const mbedtls_mpi *G ); /** * \brief This function imports the raw public value of the peer. * * \note In a TLS handshake, this is the how the server imports * the Client's public DHM key. * * \param ctx The DHM context to use. This must be initialized and have * its DHM parameters set, e.g. via mbedtls_dhm_set_group(). * It may or may not already have generated its own private key. * \param input The input buffer containing the \c G^Y value of the peer. * This must be a readable buffer of size \p ilen Bytes. * \param ilen The size of the input buffer \p input in Bytes. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_read_public( mbedtls_dhm_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function creates a DHM key pair and exports * the raw public key in big-endian format. * * \note The destination buffer is always fully written * so as to contain a big-endian representation of G^X mod P. * If it is larger than \c ctx->len, it is padded accordingly * with zero-bytes at the beginning. * * \param ctx The DHM context to use. This must be initialized and * have the DHM parameters set. It may or may not already * have imported the peer's public key. * \param x_size The private key size in Bytes. * \param output The destination buffer. This must be a writable buffer of * size \p olen Bytes. * \param olen The length of the destination buffer. This must be at least * equal to `ctx->len` (the size of \c P). * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be \c NULL * if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size, unsigned char *output, size_t olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function derives and exports the shared secret * \c (G^Y)^X mod \c P. * * \note If \p f_rng is not \c NULL, it is used to blind the input as * a countermeasure against timing attacks. Blinding is used * only if our private key \c X is re-used, and not used * otherwise. We recommend always passing a non-NULL * \p f_rng argument. * * \param ctx The DHM context to use. This must be initialized * and have its own private key generated and the peer's * public key imported. * \param output The buffer to write the generated shared key to. This * must be a writable buffer of size \p output_size Bytes. * \param output_size The size of the destination buffer. This must be at * least the size of \c ctx->len (the size of \c P). * \param olen On exit, holds the actual number of Bytes written. * \param f_rng The RNG function, for blinding purposes. This may * b \c NULL if blinding isn't needed. * \param p_rng The RNG context. This may be \c NULL if \p f_rng * doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX error code on failure. */ int mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx, unsigned char *output, size_t output_size, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function frees and clears the components * of a DHM context. * * \param ctx The DHM context to free and clear. This may be \c NULL, * in which case this function is a no-op. If it is not \c NULL, * it must point to an initialized DHM context. */ void mbedtls_dhm_free( mbedtls_dhm_context *ctx ); #if defined(MBEDTLS_ASN1_PARSE_C) /** \ingroup x509_module */ /** * \brief This function parses DHM parameters in PEM or DER format. * * \param dhm The DHM context to import the DHM parameters into. * This must be initialized. * \param dhmin The input buffer. This must be a readable buffer of * length \p dhminlen Bytes. * \param dhminlen The size of the input buffer \p dhmin, including the * terminating \c NULL Byte for PEM data. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX or \c MBEDTLS_ERR_PEM_XXX error * code on failure. */ int mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin, size_t dhminlen ); #if defined(MBEDTLS_FS_IO) /** \ingroup x509_module */ /** * \brief This function loads and parses DHM parameters from a file. * * \param dhm The DHM context to load the parameters to. * This must be initialized. * \param path The filename to read the DHM parameters from. * This must not be \c NULL. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_DHM_XXX or \c MBEDTLS_ERR_PEM_XXX * error code on failure. */ int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path ); #endif /* MBEDTLS_FS_IO */ #endif /* MBEDTLS_ASN1_PARSE_C */ /** * \brief The DMH checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_dhm_self_test( int verbose ); #ifdef __cplusplus } #endif /** * RFC 3526, RFC 5114 and RFC 7919 standardize a number of * Diffie-Hellman groups, some of which are included here * for use within the SSL/TLS module and the user's convenience * when configuring the Diffie-Hellman parameters by hand * through \c mbedtls_ssl_conf_dh_param. * * The following lists the source of the above groups in the standards: * - RFC 5114 section 2.2: 2048-bit MODP Group with 224-bit Prime Order Subgroup * - RFC 3526 section 3: 2048-bit MODP Group * - RFC 3526 section 4: 3072-bit MODP Group * - RFC 3526 section 5: 4096-bit MODP Group * - RFC 7919 section A.1: ffdhe2048 * - RFC 7919 section A.2: ffdhe3072 * - RFC 7919 section A.3: ffdhe4096 * - RFC 7919 section A.4: ffdhe6144 * - RFC 7919 section A.5: ffdhe8192 * * The constants with suffix "_p" denote the chosen prime moduli, while * the constants with suffix "_g" denote the chosen generator * of the associated prime field. * * The constants further suffixed with "_bin" are provided in binary format, * while all other constants represent null-terminated strings holding the * hexadecimal presentation of the respective numbers. * * The primes from RFC 3526 and RFC 7919 have been generating by the following * trust-worthy procedure: * - Fix N in { 2048, 3072, 4096, 6144, 8192 } and consider the N-bit number * the first and last 64 bits are all 1, and the remaining N - 128 bits of * which are 0x7ff...ff. * - Add the smallest multiple of the first N - 129 bits of the binary expansion * of pi (for RFC 5236) or e (for RFC 7919) to this intermediate bit-string * such that the resulting integer is a safe-prime. * - The result is the respective RFC 3526 / 7919 prime, and the corresponding * generator is always chosen to be 2 (which is a square for these prime, * hence the corresponding subgroup has order (p-1)/2 and avoids leaking a * bit in the private exponent). * */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) /** * \warning The origin of the primes in RFC 5114 is not documented and * their use therefore constitutes a security risk! * * \deprecated The hex-encoded primes from RFC 5114 are deprecated and are * likely to be removed in a future version of the library without * replacement. */ /** * The hexadecimal presentation of the prime underlying the * 2048-bit MODP Group with 224-bit Prime Order Subgroup, as defined * in RFC-5114: Additional Diffie-Hellman Groups for Use with * IETF Standards. */ #define MBEDTLS_DHM_RFC5114_MODP_2048_P \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1" \ "B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15" \ "EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212" \ "9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207" \ "C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708" \ "B3BF8A317091883681286130BC8985DB1602E714415D9330" \ "278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D" \ "CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8" \ "BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763" \ "C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71" \ "CF9DE5384E71B81C0AC4DFFE0C10E64F" ) /** * The hexadecimal presentation of the chosen generator of the 2048-bit MODP * Group with 224-bit Prime Order Subgroup, as defined in RFC-5114: * Additional Diffie-Hellman Groups for Use with IETF Standards. */ #define MBEDTLS_DHM_RFC5114_MODP_2048_G \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF" \ "74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA" \ "AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7" \ "C17669101999024AF4D027275AC1348BB8A762D0521BC98A" \ "E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE" \ "F180EB34118E98D119529A45D6F834566E3025E316A330EF" \ "BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB" \ "10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381" \ "B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269" \ "EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179" \ "81BC087F2A7065B384B890D3191F2BFA" ) /** * The hexadecimal presentation of the prime underlying the 2048-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). * * \deprecated The hex-encoded primes from RFC 3625 are deprecated and * superseded by the corresponding macros providing them as * binary constants. Their hex-encoded constants are likely * to be removed in a future version of the library. * */ #define MBEDTLS_DHM_RFC3526_MODP_2048_P \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ "15728E5A8AACAA68FFFFFFFFFFFFFFFF" ) /** * The hexadecimal presentation of the chosen generator of the 2048-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_2048_G \ MBEDTLS_DEPRECATED_STRING_CONSTANT( "02" ) /** * The hexadecimal presentation of the prime underlying the 3072-bit MODP * Group, as defined in RFC-3072: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_3072_P \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF" ) /** * The hexadecimal presentation of the chosen generator of the 3072-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_3072_G \ MBEDTLS_DEPRECATED_STRING_CONSTANT( "02" ) /** * The hexadecimal presentation of the prime underlying the 4096-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_4096_P \ MBEDTLS_DEPRECATED_STRING_CONSTANT( \ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" \ "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" \ "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" \ "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" \ "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" \ "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" \ "FFFFFFFFFFFFFFFF" ) /** * The hexadecimal presentation of the chosen generator of the 4096-bit MODP * Group, as defined in RFC-3526: More Modular Exponential (MODP) * Diffie-Hellman groups for Internet Key Exchange (IKE). */ #define MBEDTLS_DHM_RFC3526_MODP_4096_G \ MBEDTLS_DEPRECATED_STRING_CONSTANT( "02" ) #endif /* MBEDTLS_DEPRECATED_REMOVED */ /* * Trustworthy DHM parameters in binary form */ #define MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, \ 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, \ 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, \ 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, \ 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, \ 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, \ 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, \ 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, \ 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, \ 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, \ 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, \ 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, \ 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, \ 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, \ 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, \ 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, \ 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, \ 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, \ 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, \ 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, \ 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, \ 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, \ 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, \ 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, \ 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, \ 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, \ 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, \ 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, \ 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, \ 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC3526_MODP_3072_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, \ 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, \ 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, \ 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, \ 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, \ 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, \ 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, \ 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, \ 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, \ 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, \ 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, \ 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, \ 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, \ 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, \ 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, \ 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, \ 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, \ 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, \ 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, \ 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, \ 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, \ 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, \ 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, \ 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, \ 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, \ 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, \ 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, \ 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, \ 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, \ 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, \ 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, \ 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, \ 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, \ 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, \ 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, \ 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, \ 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, \ 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, \ 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, \ 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, \ 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, \ 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, \ 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, \ 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, \ 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, \ 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x3A, 0xD2, 0xCA, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC3526_MODP_3072_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC3526_MODP_4096_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, \ 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, \ 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, \ 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, \ 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, \ 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, \ 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, \ 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, \ 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, \ 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, \ 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, \ 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, \ 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, \ 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, \ 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, \ 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, \ 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, \ 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, \ 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, \ 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, \ 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, \ 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, \ 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, \ 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, \ 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, \ 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, \ 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, \ 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, \ 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, \ 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, \ 0xAD, 0x33, 0x17, 0x0D, 0x04, 0x50, 0x7A, 0x33, \ 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64, \ 0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, \ 0x8A, 0xEA, 0x71, 0x57, 0x5D, 0x06, 0x0C, 0x7D, \ 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7, \ 0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, \ 0x1E, 0x8C, 0x94, 0xE0, 0x4A, 0x25, 0x61, 0x9D, \ 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B, \ 0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, \ 0xD8, 0x76, 0x02, 0x73, 0x3E, 0xC8, 0x6A, 0x64, \ 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C, \ 0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, \ 0x77, 0x09, 0x88, 0xC0, 0xBA, 0xD9, 0x46, 0xE2, \ 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31, \ 0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, \ 0x4B, 0x82, 0xD1, 0x20, 0xA9, 0x21, 0x08, 0x01, \ 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7, \ 0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, \ 0x99, 0xC3, 0x27, 0x18, 0x6A, 0xF4, 0xE2, 0x3C, \ 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA, \ 0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, \ 0xDB, 0xBB, 0xC2, 0xDB, 0x04, 0xDE, 0x8E, 0xF9, \ 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6, \ 0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, \ 0x99, 0xB2, 0x96, 0x4F, 0xA0, 0x90, 0xC3, 0xA2, \ 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED, \ 0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, \ 0xB8, 0x1B, 0xDD, 0x76, 0x21, 0x70, 0x48, 0x1C, \ 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9, \ 0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, \ 0x86, 0xFF, 0xB7, 0xDC, 0x90, 0xA6, 0xC0, 0x8F, \ 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC3526_MODP_4096_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE2048_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x28, 0x5C, 0x97, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, } #define MBEDTLS_DHM_RFC7919_FFDHE2048_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE3072_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0xC6, 0x2E, 0x37, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC7919_FFDHE3072_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE4096_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1, \ 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB, \ 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, \ 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18, \ 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04, \ 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, \ 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A, \ 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32, \ 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, \ 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38, \ 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A, \ 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, \ 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC, \ 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF, \ 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, \ 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1, \ 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x65, 0x5F, 0x6A, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC7919_FFDHE4096_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE6144_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1, \ 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB, \ 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, \ 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18, \ 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04, \ 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, \ 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A, \ 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32, \ 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, \ 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38, \ 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A, \ 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, \ 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC, \ 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF, \ 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, \ 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1, \ 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02, \ 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A, \ 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A, \ 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6, \ 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8, \ 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C, \ 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A, \ 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71, \ 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F, \ 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77, \ 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10, \ 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8, \ 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3, \ 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E, \ 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3, \ 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4, \ 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1, \ 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92, \ 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6, \ 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82, \ 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE, \ 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C, \ 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E, \ 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46, \ 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A, \ 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17, \ 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03, \ 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04, \ 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6, \ 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69, \ 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1, \ 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4, \ 0xA4, 0x0E, 0x32, 0x9C, 0xD0, 0xE4, 0x0E, 0x65, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC7919_FFDHE6144_G_BIN { 0x02 } #define MBEDTLS_DHM_RFC7919_FFDHE8192_P_BIN { \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ 0xAD, 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, \ 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1, \ 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, \ 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, \ 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, \ 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, \ 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, 0x61, 0x7A, \ 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, \ 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, \ 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, \ 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, \ 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, \ 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, \ 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, \ 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, \ 0xBC, 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, \ 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, \ 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, \ 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, \ 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, \ 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, \ 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, \ 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, \ 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, \ 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, \ 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, \ 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, \ 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, \ 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, \ 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, \ 0xDE, 0x35, 0x5B, 0x3B, 0x65, 0x19, 0x03, 0x5B, \ 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38, \ 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, \ 0x7A, 0xD9, 0x1D, 0x26, 0x91, 0xF7, 0xF7, 0xEE, \ 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C, \ 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, \ 0xB4, 0x13, 0x0C, 0x93, 0xBC, 0x43, 0x79, 0x44, \ 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3, \ 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, \ 0x5C, 0xAE, 0x82, 0xAB, 0x9C, 0x9D, 0xF6, 0x9E, \ 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D, \ 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, \ 0x1D, 0xBF, 0x9A, 0x42, 0xD5, 0xC4, 0x48, 0x4E, \ 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF, \ 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, \ 0x25, 0xE4, 0x1D, 0x2B, 0x66, 0x9E, 0x1E, 0xF1, \ 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB, \ 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, \ 0xAC, 0x7D, 0x5F, 0x42, 0xD6, 0x9F, 0x6D, 0x18, \ 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04, \ 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, \ 0x71, 0x35, 0xC8, 0x86, 0xEF, 0xB4, 0x31, 0x8A, \ 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32, \ 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, \ 0x6D, 0xC7, 0x78, 0xF9, 0x71, 0xAD, 0x00, 0x38, \ 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A, \ 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, \ 0x2A, 0x4E, 0xCE, 0xA9, 0xF9, 0x8D, 0x0A, 0xCC, \ 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF, \ 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, \ 0x4D, 0xB5, 0xA8, 0x51, 0xF4, 0x41, 0x82, 0xE1, \ 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02, \ 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A, \ 0x4E, 0x67, 0x7D, 0x2C, 0x38, 0x53, 0x2A, 0x3A, \ 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6, \ 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8, \ 0x91, 0x7B, 0xDD, 0x64, 0xB1, 0xC0, 0xFD, 0x4C, \ 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A, \ 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71, \ 0x9B, 0x1F, 0x5C, 0x3E, 0x4E, 0x46, 0x04, 0x1F, \ 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77, \ 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10, \ 0xB8, 0x55, 0x32, 0x2E, 0xDB, 0x63, 0x40, 0xD8, \ 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3, \ 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E, \ 0x7F, 0xB2, 0x9F, 0x8C, 0x18, 0x30, 0x23, 0xC3, \ 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4, \ 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1, \ 0x94, 0xC6, 0x65, 0x1E, 0x77, 0xCA, 0xF9, 0x92, \ 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6, \ 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82, \ 0x0A, 0xE8, 0xDB, 0x58, 0x47, 0xA6, 0x7C, 0xBE, \ 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C, \ 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E, \ 0x62, 0x29, 0x2C, 0x31, 0x15, 0x62, 0xA8, 0x46, \ 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A, \ 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17, \ 0x8C, 0xCF, 0x2D, 0xD5, 0xCA, 0xCE, 0xF4, 0x03, \ 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04, \ 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6, \ 0x3F, 0xDD, 0x4A, 0x8E, 0x9A, 0xDB, 0x1E, 0x69, \ 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1, \ 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4, \ 0xA4, 0x0E, 0x32, 0x9C, 0xCF, 0xF4, 0x6A, 0xAA, \ 0x36, 0xAD, 0x00, 0x4C, 0xF6, 0x00, 0xC8, 0x38, \ 0x1E, 0x42, 0x5A, 0x31, 0xD9, 0x51, 0xAE, 0x64, \ 0xFD, 0xB2, 0x3F, 0xCE, 0xC9, 0x50, 0x9D, 0x43, \ 0x68, 0x7F, 0xEB, 0x69, 0xED, 0xD1, 0xCC, 0x5E, \ 0x0B, 0x8C, 0xC3, 0xBD, 0xF6, 0x4B, 0x10, 0xEF, \ 0x86, 0xB6, 0x31, 0x42, 0xA3, 0xAB, 0x88, 0x29, \ 0x55, 0x5B, 0x2F, 0x74, 0x7C, 0x93, 0x26, 0x65, \ 0xCB, 0x2C, 0x0F, 0x1C, 0xC0, 0x1B, 0xD7, 0x02, \ 0x29, 0x38, 0x88, 0x39, 0xD2, 0xAF, 0x05, 0xE4, \ 0x54, 0x50, 0x4A, 0xC7, 0x8B, 0x75, 0x82, 0x82, \ 0x28, 0x46, 0xC0, 0xBA, 0x35, 0xC3, 0x5F, 0x5C, \ 0x59, 0x16, 0x0C, 0xC0, 0x46, 0xFD, 0x82, 0x51, \ 0x54, 0x1F, 0xC6, 0x8C, 0x9C, 0x86, 0xB0, 0x22, \ 0xBB, 0x70, 0x99, 0x87, 0x6A, 0x46, 0x0E, 0x74, \ 0x51, 0xA8, 0xA9, 0x31, 0x09, 0x70, 0x3F, 0xEE, \ 0x1C, 0x21, 0x7E, 0x6C, 0x38, 0x26, 0xE5, 0x2C, \ 0x51, 0xAA, 0x69, 0x1E, 0x0E, 0x42, 0x3C, 0xFC, \ 0x99, 0xE9, 0xE3, 0x16, 0x50, 0xC1, 0x21, 0x7B, \ 0x62, 0x48, 0x16, 0xCD, 0xAD, 0x9A, 0x95, 0xF9, \ 0xD5, 0xB8, 0x01, 0x94, 0x88, 0xD9, 0xC0, 0xA0, \ 0xA1, 0xFE, 0x30, 0x75, 0xA5, 0x77, 0xE2, 0x31, \ 0x83, 0xF8, 0x1D, 0x4A, 0x3F, 0x2F, 0xA4, 0x57, \ 0x1E, 0xFC, 0x8C, 0xE0, 0xBA, 0x8A, 0x4F, 0xE8, \ 0xB6, 0x85, 0x5D, 0xFE, 0x72, 0xB0, 0xA6, 0x6E, \ 0xDE, 0xD2, 0xFB, 0xAB, 0xFB, 0xE5, 0x8A, 0x30, \ 0xFA, 0xFA, 0xBE, 0x1C, 0x5D, 0x71, 0xA8, 0x7E, \ 0x2F, 0x74, 0x1E, 0xF8, 0xC1, 0xFE, 0x86, 0xFE, \ 0xA6, 0xBB, 0xFD, 0xE5, 0x30, 0x67, 0x7F, 0x0D, \ 0x97, 0xD1, 0x1D, 0x49, 0xF7, 0xA8, 0x44, 0x3D, \ 0x08, 0x22, 0xE5, 0x06, 0xA9, 0xF4, 0x61, 0x4E, \ 0x01, 0x1E, 0x2A, 0x94, 0x83, 0x8F, 0xF8, 0x8C, \ 0xD6, 0x8C, 0x8B, 0xB7, 0xC5, 0xC6, 0x42, 0x4C, \ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } #define MBEDTLS_DHM_RFC7919_FFDHE8192_G_BIN { 0x02 } #endif /* dhm.h */ fldigi-4.2.05/src/include/mbedtls/platform.h0000664000175000017500000003126714611711171015635 00000000000000/** * \file platform.h * * \brief This file contains the definitions and functions of the * Mbed TLS platform abstraction layer. * * The platform abstraction layer removes the need for the library * to directly link to standard C library functions or operating * system services, making the library easier to port and embed. * Application developers and users of the library can provide their own * implementations of these functions, or implementations specific to * their platform, which can be statically linked to the library or * dynamically configured at runtime. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PLATFORM_H #define MBEDTLS_PLATFORM_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_HAVE_TIME) #include "platform_time.h" #endif #define MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED -0x0070 /**< Hardware accelerator failed */ #define MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED -0x0072 /**< The requested feature is not supported by the platform */ #ifdef __cplusplus extern "C" { #endif /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) #include #include #include #if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF) #if defined(_WIN32) #define MBEDTLS_PLATFORM_STD_SNPRINTF mbedtls_platform_win32_snprintf /**< The default \c snprintf function to use. */ #else #define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< The default \c snprintf function to use. */ #endif #endif #if !defined(MBEDTLS_PLATFORM_STD_PRINTF) #define MBEDTLS_PLATFORM_STD_PRINTF printf /**< The default \c printf function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_FPRINTF) #define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< The default \c fprintf function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_CALLOC) #define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< The default \c calloc function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_FREE) #define MBEDTLS_PLATFORM_STD_FREE free /**< The default \c free function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_EXIT) #define MBEDTLS_PLATFORM_STD_EXIT exit /**< The default \c exit function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_TIME) #define MBEDTLS_PLATFORM_STD_TIME time /**< The default \c time function to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS) #define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS EXIT_SUCCESS /**< The default exit value to use. */ #endif #if !defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE) #define MBEDTLS_PLATFORM_STD_EXIT_FAILURE EXIT_FAILURE /**< The default exit value to use. */ #endif #if defined(MBEDTLS_FS_IO) #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) #define MBEDTLS_PLATFORM_STD_NV_SEED_READ mbedtls_platform_std_nv_seed_read #endif #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write #endif #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_FILE) #define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" #endif #endif /* MBEDTLS_FS_IO */ #else /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ #if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) #include MBEDTLS_PLATFORM_STD_MEM_HDR #endif #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ /* \} name SECTION: Module settings */ /* * The function pointers for calloc and free. */ #if defined(MBEDTLS_PLATFORM_MEMORY) #if defined(MBEDTLS_PLATFORM_FREE_MACRO) && \ defined(MBEDTLS_PLATFORM_CALLOC_MACRO) #define mbedtls_free MBEDTLS_PLATFORM_FREE_MACRO #define mbedtls_calloc MBEDTLS_PLATFORM_CALLOC_MACRO #else /* For size_t */ #include extern void *mbedtls_calloc( size_t n, size_t size ); extern void mbedtls_free( void *ptr ); /** * \brief This function dynamically sets the memory-management * functions used by the library, during runtime. * * \param calloc_func The \c calloc function implementation. * \param free_func The \c free function implementation. * * \return \c 0. */ int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ), void (*free_func)( void * ) ); #endif /* MBEDTLS_PLATFORM_FREE_MACRO && MBEDTLS_PLATFORM_CALLOC_MACRO */ #else /* !MBEDTLS_PLATFORM_MEMORY */ #define mbedtls_free free #define mbedtls_calloc calloc #endif /* MBEDTLS_PLATFORM_MEMORY && !MBEDTLS_PLATFORM_{FREE,CALLOC}_MACRO */ /* * The function pointers for fprintf */ #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) /* We need FILE * */ #include extern int (*mbedtls_fprintf)( FILE *stream, const char *format, ... ); /** * \brief This function dynamically configures the fprintf * function that is called when the * mbedtls_fprintf() function is invoked by the library. * * \param fprintf_func The \c fprintf function implementation. * * \return \c 0. */ int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *stream, const char *, ... ) ); #else #if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) #define mbedtls_fprintf MBEDTLS_PLATFORM_FPRINTF_MACRO #else #define mbedtls_fprintf fprintf #endif /* MBEDTLS_PLATFORM_FPRINTF_MACRO */ #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ /* * The function pointers for printf */ #if defined(MBEDTLS_PLATFORM_PRINTF_ALT) extern int (*mbedtls_printf)( const char *format, ... ); /** * \brief This function dynamically configures the snprintf * function that is called when the mbedtls_snprintf() * function is invoked by the library. * * \param printf_func The \c printf function implementation. * * \return \c 0 on success. */ int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) ); #else /* !MBEDTLS_PLATFORM_PRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) #define mbedtls_printf MBEDTLS_PLATFORM_PRINTF_MACRO #else #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_PRINTF_MACRO */ #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ /* * The function pointers for snprintf * * The snprintf implementation should conform to C99: * - it *must* always correctly zero-terminate the buffer * (except when n == 0, then it must leave the buffer untouched) * - however it is acceptable to return -1 instead of the required length when * the destination buffer is too short. */ #if defined(_WIN32) /* For Windows (inc. MSYS2), we provide our own fixed implementation */ int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... ); #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) extern int (*mbedtls_snprintf)( char * s, size_t n, const char * format, ... ); /** * \brief This function allows configuring a custom * \c snprintf function pointer. * * \param snprintf_func The \c snprintf function implementation. * * \return \c 0 on success. */ int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n, const char * format, ... ) ); #else /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) #define mbedtls_snprintf MBEDTLS_PLATFORM_SNPRINTF_MACRO #else #define mbedtls_snprintf MBEDTLS_PLATFORM_STD_SNPRINTF #endif /* MBEDTLS_PLATFORM_SNPRINTF_MACRO */ #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ /* * The function pointers for exit */ #if defined(MBEDTLS_PLATFORM_EXIT_ALT) extern void (*mbedtls_exit)( int status ); /** * \brief This function dynamically configures the exit * function that is called when the mbedtls_exit() * function is invoked by the library. * * \param exit_func The \c exit function implementation. * * \return \c 0 on success. */ int mbedtls_platform_set_exit( void (*exit_func)( int status ) ); #else #if defined(MBEDTLS_PLATFORM_EXIT_MACRO) #define mbedtls_exit MBEDTLS_PLATFORM_EXIT_MACRO #else #define mbedtls_exit exit #endif /* MBEDTLS_PLATFORM_EXIT_MACRO */ #endif /* MBEDTLS_PLATFORM_EXIT_ALT */ /* * The default exit values */ #if defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS) #define MBEDTLS_EXIT_SUCCESS MBEDTLS_PLATFORM_STD_EXIT_SUCCESS #else #define MBEDTLS_EXIT_SUCCESS 0 #endif #if defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE) #define MBEDTLS_EXIT_FAILURE MBEDTLS_PLATFORM_STD_EXIT_FAILURE #else #define MBEDTLS_EXIT_FAILURE 1 #endif /* * The function pointers for reading from and writing a seed file to * Non-Volatile storage (NV) in a platform-independent way * * Only enabled when the NV seed entropy source is enabled */ #if defined(MBEDTLS_ENTROPY_NV_SEED) #if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO) /* Internal standard platform definitions */ int mbedtls_platform_std_nv_seed_read( unsigned char *buf, size_t buf_len ); int mbedtls_platform_std_nv_seed_write( unsigned char *buf, size_t buf_len ); #endif #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) extern int (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len ); extern int (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len ); /** * \brief This function allows configuring custom seed file writing and * reading functions. * * \param nv_seed_read_func The seed reading function implementation. * \param nv_seed_write_func The seed writing function implementation. * * \return \c 0 on success. */ int mbedtls_platform_set_nv_seed( int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ), int (*nv_seed_write_func)( unsigned char *buf, size_t buf_len ) ); #else #if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) && \ defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO) #define mbedtls_nv_seed_read MBEDTLS_PLATFORM_NV_SEED_READ_MACRO #define mbedtls_nv_seed_write MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO #else #define mbedtls_nv_seed_read mbedtls_platform_std_nv_seed_read #define mbedtls_nv_seed_write mbedtls_platform_std_nv_seed_write #endif #endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) /** * \brief The platform context structure. * * \note This structure may be used to assist platform-specific * setup or teardown operations. */ typedef struct mbedtls_platform_context { char dummy; /**< A placeholder member, as empty structs are not portable. */ } mbedtls_platform_context; #else #include "platform_alt.h" #endif /* !MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ /** * \brief This function performs any platform-specific initialization * operations. * * \note This function should be called before any other library functions. * * Its implementation is platform-specific, and unless * platform-specific code is provided, it does nothing. * * \note The usage and necessity of this function is dependent on the platform. * * \param ctx The platform context. * * \return \c 0 on success. */ int mbedtls_platform_setup( mbedtls_platform_context *ctx ); /** * \brief This function performs any platform teardown operations. * * \note This function should be called after every other Mbed TLS module * has been correctly freed using the appropriate free function. * * Its implementation is platform-specific, and unless * platform-specific code is provided, it does nothing. * * \note The usage and necessity of this function is dependent on the platform. * * \param ctx The platform context. * */ void mbedtls_platform_teardown( mbedtls_platform_context *ctx ); #ifdef __cplusplus } #endif #endif /* platform.h */ fldigi-4.2.05/src/include/mbedtls/config.h0000664000175000017500000032423314611711171015254 00000000000000/** * \file config.h * * \brief Configuration options (set of defines) * * This set of compile-time options may be used to enable * or disable features selectively, and reduce the global * memory footprint. */ /* * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CONFIG_H #define MBEDTLS_CONFIG_H #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) #define _CRT_SECURE_NO_DEPRECATE 1 #endif /** * \name SECTION: System support * * This section sets system specific settings. * \{ */ /** * \def MBEDTLS_HAVE_ASM * * The compiler has support for asm(). * * Requires support for asm() in compiler. * * Used in: * library/aria.c * library/timing.c * include/mbedtls/bn_mul.h * * Required by: * MBEDTLS_AESNI_C * MBEDTLS_PADLOCK_C * * Comment to disable the use of assembly code. */ #define MBEDTLS_HAVE_ASM /** * \def MBEDTLS_NO_UDBL_DIVISION * * The platform lacks support for double-width integer division (64-bit * division on a 32-bit platform, 128-bit division on a 64-bit platform). * * Used in: * include/mbedtls/bignum.h * library/bignum.c * * The bignum code uses double-width division to speed up some operations. * Double-width division is often implemented in software that needs to * be linked with the program. The presence of a double-width integer * type is usually detected automatically through preprocessor macros, * but the automatic detection cannot know whether the code needs to * and can be linked with an implementation of division for that type. * By default division is assumed to be usable if the type is present. * Uncomment this option to prevent the use of double-width division. * * Note that division for the native integer type is always required. * Furthermore, a 64-bit type is always required even on a 32-bit * platform, but it need not support multiplication or division. In some * cases it is also desirable to disable some double-width operations. For * example, if double-width division is implemented in software, disabling * it can reduce code size in some embedded targets. */ //#define MBEDTLS_NO_UDBL_DIVISION /** * \def MBEDTLS_NO_64BIT_MULTIPLICATION * * The platform lacks support for 32x32 -> 64-bit multiplication. * * Used in: * library/poly1305.c * * Some parts of the library may use multiplication of two unsigned 32-bit * operands with a 64-bit result in order to speed up computations. On some * platforms, this is not available in hardware and has to be implemented in * software, usually in a library provided by the toolchain. * * Sometimes it is not desirable to have to link to that library. This option * removes the dependency of that library on platforms that lack a hardware * 64-bit multiplier by embedding a software implementation in Mbed TLS. * * Note that depending on the compiler, this may decrease performance compared * to using the library function provided by the toolchain. */ //#define MBEDTLS_NO_64BIT_MULTIPLICATION /** * \def MBEDTLS_HAVE_SSE2 * * CPU supports SSE2 instruction set. * * Uncomment if the CPU supports SSE2 (IA-32 specific). */ //#define MBEDTLS_HAVE_SSE2 /** * \def MBEDTLS_HAVE_TIME * * System has time.h and time(). * The time does not need to be correct, only time differences are used, * by contrast with MBEDTLS_HAVE_TIME_DATE * * Defining MBEDTLS_HAVE_TIME allows you to specify MBEDTLS_PLATFORM_TIME_ALT, * MBEDTLS_PLATFORM_TIME_MACRO, MBEDTLS_PLATFORM_TIME_TYPE_MACRO and * MBEDTLS_PLATFORM_STD_TIME. * * Comment if your system does not support time functions */ #define MBEDTLS_HAVE_TIME /** * \def MBEDTLS_HAVE_TIME_DATE * * System has time.h, time(), and an implementation for * mbedtls_platform_gmtime_r() (see below). * The time needs to be correct (not necesarily very accurate, but at least * the date should be correct). This is used to verify the validity period of * X.509 certificates. * * Comment if your system does not have a correct clock. * * \note mbedtls_platform_gmtime_r() is an abstraction in platform_util.h that * behaves similarly to the gmtime_r() function from the C standard. Refer to * the documentation for mbedtls_platform_gmtime_r() for more information. * * \note It is possible to configure an implementation for * mbedtls_platform_gmtime_r() at compile-time by using the macro * MBEDTLS_PLATFORM_GMTIME_R_ALT. */ #define MBEDTLS_HAVE_TIME_DATE /** * \def MBEDTLS_PLATFORM_MEMORY * * Enable the memory allocation layer. * * By default mbed TLS uses the system-provided calloc() and free(). * This allows different allocators (self-implemented or provided) to be * provided to the platform abstraction layer. * * Enabling MBEDTLS_PLATFORM_MEMORY without the * MBEDTLS_PLATFORM_{FREE,CALLOC}_MACROs will provide * "mbedtls_platform_set_calloc_free()" allowing you to set an alternative calloc() and * free() function pointer at runtime. * * Enabling MBEDTLS_PLATFORM_MEMORY and specifying * MBEDTLS_PLATFORM_{CALLOC,FREE}_MACROs will allow you to specify the * alternate function at compile time. * * Requires: MBEDTLS_PLATFORM_C * * Enable this layer to allow use of alternative memory allocators. */ //#define MBEDTLS_PLATFORM_MEMORY /** * \def MBEDTLS_PLATFORM_NO_STD_FUNCTIONS * * Do not assign standard functions in the platform layer (e.g. calloc() to * MBEDTLS_PLATFORM_STD_CALLOC and printf() to MBEDTLS_PLATFORM_STD_PRINTF) * * This makes sure there are no linking errors on platforms that do not support * these functions. You will HAVE to provide alternatives, either at runtime * via the platform_set_xxx() functions or at compile time by setting * the MBEDTLS_PLATFORM_STD_XXX defines, or enabling a * MBEDTLS_PLATFORM_XXX_MACRO. * * Requires: MBEDTLS_PLATFORM_C * * Uncomment to prevent default assignment of standard functions in the * platform layer. */ //#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS /** * \def MBEDTLS_PLATFORM_EXIT_ALT * * MBEDTLS_PLATFORM_XXX_ALT: Uncomment a macro to let mbed TLS support the * function in the platform abstraction layer. * * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, mbed TLS will * provide a function "mbedtls_platform_set_printf()" that allows you to set an * alternative printf function pointer. * * All these define require MBEDTLS_PLATFORM_C to be defined! * * \note MBEDTLS_PLATFORM_SNPRINTF_ALT is required on Windows; * it will be enabled automatically by check_config.h * * \warning MBEDTLS_PLATFORM_XXX_ALT cannot be defined at the same time as * MBEDTLS_PLATFORM_XXX_MACRO! * * Requires: MBEDTLS_PLATFORM_TIME_ALT requires MBEDTLS_HAVE_TIME * * Uncomment a macro to enable alternate implementation of specific base * platform function */ //#define MBEDTLS_PLATFORM_EXIT_ALT //#define MBEDTLS_PLATFORM_TIME_ALT //#define MBEDTLS_PLATFORM_FPRINTF_ALT //#define MBEDTLS_PLATFORM_PRINTF_ALT //#define MBEDTLS_PLATFORM_SNPRINTF_ALT //#define MBEDTLS_PLATFORM_NV_SEED_ALT //#define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT /** * \def MBEDTLS_DEPRECATED_WARNING * * Mark deprecated functions so that they generate a warning if used. * Functions deprecated in one version will usually be removed in the next * version. You can enable this to help you prepare the transition to a new * major version by making sure your code is not using these functions. * * This only works with GCC and Clang. With other compilers, you may want to * use MBEDTLS_DEPRECATED_REMOVED * * Uncomment to get warnings on using deprecated functions. */ //#define MBEDTLS_DEPRECATED_WARNING /** * \def MBEDTLS_DEPRECATED_REMOVED * * Remove deprecated functions so that they generate an error if used. * Functions deprecated in one version will usually be removed in the next * version. You can enable this to help you prepare the transition to a new * major version by making sure your code is not using these functions. * * Uncomment to get errors on using deprecated functions. */ //#define MBEDTLS_DEPRECATED_REMOVED /** * \def MBEDTLS_CHECK_PARAMS * * This configuration option controls whether the library validates more of * the parameters passed to it. * * When this flag is not defined, the library only attempts to validate an * input parameter if: (1) they may come from the outside world (such as the * network, the filesystem, etc.) or (2) not validating them could result in * internal memory errors such as overflowing a buffer controlled by the * library. On the other hand, it doesn't attempt to validate parameters whose * values are fully controlled by the application (such as pointers). * * When this flag is defined, the library additionally attempts to validate * parameters that are fully controlled by the application, and should always * be valid if the application code is fully correct and trusted. * * For example, when a function accepts as input a pointer to a buffer that may * contain untrusted data, and its documentation mentions that this pointer * must not be NULL: * - the pointer is checked to be non-NULL only if this option is enabled * - the content of the buffer is always validated * * When this flag is defined, if a library function receives a parameter that * is invalid, it will: * - invoke the macro MBEDTLS_PARAM_FAILED() which by default expands to a * call to the function mbedtls_param_failed() * - immediately return (with a specific error code unless the function * returns void and can't communicate an error). * * When defining this flag, you also need to: * - either provide a definition of the function mbedtls_param_failed() in * your application (see platform_util.h for its prototype) as the library * calls that function, but does not provide a default definition for it, * - or provide a different definition of the macro MBEDTLS_PARAM_FAILED() * below if the above mechanism is not flexible enough to suit your needs. * See the documentation of this macro later in this file. * * Uncomment to enable validation of application-controlled parameters. */ //#define MBEDTLS_CHECK_PARAMS /* \} name SECTION: System support */ /** * \name SECTION: mbed TLS feature support * * This section sets support for features that are or are not needed * within the modules that are enabled. * \{ */ /** * \def MBEDTLS_TIMING_ALT * * Uncomment to provide your own alternate implementation for mbedtls_timing_hardclock(), * mbedtls_timing_get_timer(), mbedtls_set_alarm(), mbedtls_set/get_delay() * * Only works if you have MBEDTLS_TIMING_C enabled. * * You will need to provide a header "timing_alt.h" and an implementation at * compile time. */ //#define MBEDTLS_TIMING_ALT /** * \def MBEDTLS_AES_ALT * * MBEDTLS__MODULE_NAME__ALT: Uncomment a macro to let mbed TLS use your * alternate core implementation of a symmetric crypto, an arithmetic or hash * module (e.g. platform specific assembly optimized implementations). Keep * in mind that the function prototypes should remain the same. * * This replaces the whole module. If you only want to replace one of the * functions, use one of the MBEDTLS__FUNCTION_NAME__ALT flags. * * Example: In case you uncomment MBEDTLS_AES_ALT, mbed TLS will no longer * provide the "struct mbedtls_aes_context" definition and omit the base * function declarations and implementations. "aes_alt.h" will be included from * "aes.h" to include the new function definitions. * * Uncomment a macro to enable alternate implementation of the corresponding * module. * * \warning MD2, MD4, MD5, ARC4, DES and SHA-1 are considered weak and their * use constitutes a security risk. If possible, we recommend * avoiding dependencies on them, and considering stronger message * digests and ciphers instead. * */ //#define MBEDTLS_AES_ALT //#define MBEDTLS_ARC4_ALT //#define MBEDTLS_ARIA_ALT //#define MBEDTLS_BLOWFISH_ALT //#define MBEDTLS_CAMELLIA_ALT //#define MBEDTLS_CCM_ALT //#define MBEDTLS_CHACHA20_ALT //#define MBEDTLS_CHACHAPOLY_ALT //#define MBEDTLS_CMAC_ALT //#define MBEDTLS_DES_ALT //#define MBEDTLS_DHM_ALT //#define MBEDTLS_ECJPAKE_ALT //#define MBEDTLS_GCM_ALT //#define MBEDTLS_NIST_KW_ALT //#define MBEDTLS_MD2_ALT //#define MBEDTLS_MD4_ALT //#define MBEDTLS_MD5_ALT //#define MBEDTLS_POLY1305_ALT //#define MBEDTLS_RIPEMD160_ALT //#define MBEDTLS_RSA_ALT //#define MBEDTLS_SHA1_ALT //#define MBEDTLS_SHA256_ALT //#define MBEDTLS_SHA512_ALT //#define MBEDTLS_XTEA_ALT /* * When replacing the elliptic curve module, pleace consider, that it is * implemented with two .c files: * - ecp.c * - ecp_curves.c * You can replace them very much like all the other MBEDTLS__MODULE_NAME__ALT * macros as described above. The only difference is that you have to make sure * that you provide functionality for both .c files. */ //#define MBEDTLS_ECP_ALT /** * \def MBEDTLS_MD2_PROCESS_ALT * * MBEDTLS__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use you * alternate core implementation of symmetric crypto or hash function. Keep in * mind that function prototypes should remain the same. * * This replaces only one function. The header file from mbed TLS is still * used, in contrast to the MBEDTLS__MODULE_NAME__ALT flags. * * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, mbed TLS will * no longer provide the mbedtls_sha1_process() function, but it will still provide * the other function (using your mbedtls_sha1_process() function) and the definition * of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible * with this definition. * * \note Because of a signature change, the core AES encryption and decryption routines are * currently named mbedtls_aes_internal_encrypt and mbedtls_aes_internal_decrypt, * respectively. When setting up alternative implementations, these functions should * be overriden, but the wrapper functions mbedtls_aes_decrypt and mbedtls_aes_encrypt * must stay untouched. * * \note If you use the AES_xxx_ALT macros, then is is recommended to also set * MBEDTLS_AES_ROM_TABLES in order to help the linker garbage-collect the AES * tables. * * Uncomment a macro to enable alternate implementation of the corresponding * function. * * \warning MD2, MD4, MD5, DES and SHA-1 are considered weak and their use * constitutes a security risk. If possible, we recommend avoiding * dependencies on them, and considering stronger message digests * and ciphers instead. * */ //#define MBEDTLS_MD2_PROCESS_ALT //#define MBEDTLS_MD4_PROCESS_ALT //#define MBEDTLS_MD5_PROCESS_ALT //#define MBEDTLS_RIPEMD160_PROCESS_ALT //#define MBEDTLS_SHA1_PROCESS_ALT //#define MBEDTLS_SHA256_PROCESS_ALT //#define MBEDTLS_SHA512_PROCESS_ALT //#define MBEDTLS_DES_SETKEY_ALT //#define MBEDTLS_DES_CRYPT_ECB_ALT //#define MBEDTLS_DES3_CRYPT_ECB_ALT //#define MBEDTLS_AES_SETKEY_ENC_ALT //#define MBEDTLS_AES_SETKEY_DEC_ALT //#define MBEDTLS_AES_ENCRYPT_ALT //#define MBEDTLS_AES_DECRYPT_ALT //#define MBEDTLS_ECDH_GEN_PUBLIC_ALT //#define MBEDTLS_ECDH_COMPUTE_SHARED_ALT //#define MBEDTLS_ECDSA_VERIFY_ALT //#define MBEDTLS_ECDSA_SIGN_ALT //#define MBEDTLS_ECDSA_GENKEY_ALT /** * \def MBEDTLS_ECP_INTERNAL_ALT * * Expose a part of the internal interface of the Elliptic Curve Point module. * * MBEDTLS_ECP__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use your * alternative core implementation of elliptic curve arithmetic. Keep in mind * that function prototypes should remain the same. * * This partially replaces one function. The header file from mbed TLS is still * used, in contrast to the MBEDTLS_ECP_ALT flag. The original implementation * is still present and it is used for group structures not supported by the * alternative. * * Any of these options become available by defining MBEDTLS_ECP_INTERNAL_ALT * and implementing the following functions: * unsigned char mbedtls_internal_ecp_grp_capable( * const mbedtls_ecp_group *grp ) * int mbedtls_internal_ecp_init( const mbedtls_ecp_group *grp ) * void mbedtls_internal_ecp_free( const mbedtls_ecp_group *grp ) * The mbedtls_internal_ecp_grp_capable function should return 1 if the * replacement functions implement arithmetic for the given group and 0 * otherwise. * The functions mbedtls_internal_ecp_init and mbedtls_internal_ecp_free are * called before and after each point operation and provide an opportunity to * implement optimized set up and tear down instructions. * * Example: In case you uncomment MBEDTLS_ECP_INTERNAL_ALT and * MBEDTLS_ECP_DOUBLE_JAC_ALT, mbed TLS will still provide the ecp_double_jac * function, but will use your mbedtls_internal_ecp_double_jac if the group is * supported (your mbedtls_internal_ecp_grp_capable function returns 1 when * receives it as an argument). If the group is not supported then the original * implementation is used. The other functions and the definition of * mbedtls_ecp_group and mbedtls_ecp_point will not change, so your * implementation of mbedtls_internal_ecp_double_jac and * mbedtls_internal_ecp_grp_capable must be compatible with this definition. * * Uncomment a macro to enable alternate implementation of the corresponding * function. */ /* Required for all the functions in this section */ //#define MBEDTLS_ECP_INTERNAL_ALT /* Support for Weierstrass curves with Jacobi representation */ //#define MBEDTLS_ECP_RANDOMIZE_JAC_ALT //#define MBEDTLS_ECP_ADD_MIXED_ALT //#define MBEDTLS_ECP_DOUBLE_JAC_ALT //#define MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT //#define MBEDTLS_ECP_NORMALIZE_JAC_ALT /* Support for curves with Montgomery arithmetic */ //#define MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT //#define MBEDTLS_ECP_RANDOMIZE_MXZ_ALT //#define MBEDTLS_ECP_NORMALIZE_MXZ_ALT /** * \def MBEDTLS_TEST_NULL_ENTROPY * * Enables testing and use of mbed TLS without any configured entropy sources. * This permits use of the library on platforms before an entropy source has * been integrated (see for example the MBEDTLS_ENTROPY_HARDWARE_ALT or the * MBEDTLS_ENTROPY_NV_SEED switches). * * WARNING! This switch MUST be disabled in production builds, and is suitable * only for development. * Enabling the switch negates any security provided by the library. * * Requires MBEDTLS_ENTROPY_C, MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES * */ //#define MBEDTLS_TEST_NULL_ENTROPY /** * \def MBEDTLS_ENTROPY_HARDWARE_ALT * * Uncomment this macro to let mbed TLS use your own implementation of a * hardware entropy collector. * * Your function must be called \c mbedtls_hardware_poll(), have the same * prototype as declared in entropy_poll.h, and accept NULL as first argument. * * Uncomment to use your own hardware entropy collector. */ //#define MBEDTLS_ENTROPY_HARDWARE_ALT /** * \def MBEDTLS_AES_ROM_TABLES * * Use precomputed AES tables stored in ROM. * * Uncomment this macro to use precomputed AES tables stored in ROM. * Comment this macro to generate AES tables in RAM at runtime. * * Tradeoff: Using precomputed ROM tables reduces RAM usage by ~8kb * (or ~2kb if \c MBEDTLS_AES_FEWER_TABLES is used) and reduces the * initialization time before the first AES operation can be performed. * It comes at the cost of additional ~8kb ROM use (resp. ~2kb if \c * MBEDTLS_AES_FEWER_TABLES below is used), and potentially degraded * performance if ROM access is slower than RAM access. * * This option is independent of \c MBEDTLS_AES_FEWER_TABLES. * */ //#define MBEDTLS_AES_ROM_TABLES /** * \def MBEDTLS_AES_FEWER_TABLES * * Use less ROM/RAM for AES tables. * * Uncommenting this macro omits 75% of the AES tables from * ROM / RAM (depending on the value of \c MBEDTLS_AES_ROM_TABLES) * by computing their values on the fly during operations * (the tables are entry-wise rotations of one another). * * Tradeoff: Uncommenting this reduces the RAM / ROM footprint * by ~6kb but at the cost of more arithmetic operations during * runtime. Specifically, one has to compare 4 accesses within * different tables to 4 accesses with additional arithmetic * operations within the same table. The performance gain/loss * depends on the system and memory details. * * This option is independent of \c MBEDTLS_AES_ROM_TABLES. * */ //#define MBEDTLS_AES_FEWER_TABLES /** * \def MBEDTLS_CAMELLIA_SMALL_MEMORY * * Use less ROM for the Camellia implementation (saves about 768 bytes). * * Uncomment this macro to use less memory for Camellia. */ //#define MBEDTLS_CAMELLIA_SMALL_MEMORY /** * \def MBEDTLS_CIPHER_MODE_CBC * * Enable Cipher Block Chaining mode (CBC) for symmetric ciphers. */ #define MBEDTLS_CIPHER_MODE_CBC /** * \def MBEDTLS_CIPHER_MODE_CFB * * Enable Cipher Feedback mode (CFB) for symmetric ciphers. */ #define MBEDTLS_CIPHER_MODE_CFB /** * \def MBEDTLS_CIPHER_MODE_CTR * * Enable Counter Block Cipher mode (CTR) for symmetric ciphers. */ #define MBEDTLS_CIPHER_MODE_CTR /** * \def MBEDTLS_CIPHER_MODE_OFB * * Enable Output Feedback mode (OFB) for symmetric ciphers. */ #define MBEDTLS_CIPHER_MODE_OFB /** * \def MBEDTLS_CIPHER_MODE_XTS * * Enable Xor-encrypt-xor with ciphertext stealing mode (XTS) for AES. */ #define MBEDTLS_CIPHER_MODE_XTS /** * \def MBEDTLS_CIPHER_NULL_CIPHER * * Enable NULL cipher. * Warning: Only do so when you know what you are doing. This allows for * encryption or channels without any security! * * Requires MBEDTLS_ENABLE_WEAK_CIPHERSUITES as well to enable * the following ciphersuites: * MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA * MBEDTLS_TLS_RSA_WITH_NULL_SHA256 * MBEDTLS_TLS_RSA_WITH_NULL_SHA * MBEDTLS_TLS_RSA_WITH_NULL_MD5 * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA * MBEDTLS_TLS_PSK_WITH_NULL_SHA384 * MBEDTLS_TLS_PSK_WITH_NULL_SHA256 * MBEDTLS_TLS_PSK_WITH_NULL_SHA * * Uncomment this macro to enable the NULL cipher and ciphersuites */ //#define MBEDTLS_CIPHER_NULL_CIPHER /** * \def MBEDTLS_CIPHER_PADDING_PKCS7 * * MBEDTLS_CIPHER_PADDING_XXX: Uncomment or comment macros to add support for * specific padding modes in the cipher layer with cipher modes that support * padding (e.g. CBC) * * If you disable all padding modes, only full blocks can be used with CBC. * * Enable padding modes in the cipher layer. */ #define MBEDTLS_CIPHER_PADDING_PKCS7 #define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS #define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN #define MBEDTLS_CIPHER_PADDING_ZEROS /** * \def MBEDTLS_ENABLE_WEAK_CIPHERSUITES * * Enable weak ciphersuites in SSL / TLS. * Warning: Only do so when you know what you are doing. This allows for * channels with virtually no security at all! * * This enables the following ciphersuites: * MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA * * Uncomment this macro to enable weak ciphersuites * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers instead. */ //#define MBEDTLS_ENABLE_WEAK_CIPHERSUITES /** * \def MBEDTLS_REMOVE_ARC4_CIPHERSUITES * * Remove RC4 ciphersuites by default in SSL / TLS. * This flag removes the ciphersuites based on RC4 from the default list as * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible to * enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including them * explicitly. * * Uncomment this macro to remove RC4 ciphersuites by default. */ #define MBEDTLS_REMOVE_ARC4_CIPHERSUITES /** * \def MBEDTLS_ECP_DP_SECP192R1_ENABLED * * MBEDTLS_ECP_XXXX_ENABLED: Enables specific curves within the Elliptic Curve * module. By default all supported curves are enabled. * * Comment macros to disable the curve and functions for it */ #define MBEDTLS_ECP_DP_SECP192R1_ENABLED #define MBEDTLS_ECP_DP_SECP224R1_ENABLED #define MBEDTLS_ECP_DP_SECP256R1_ENABLED #define MBEDTLS_ECP_DP_SECP384R1_ENABLED #define MBEDTLS_ECP_DP_SECP521R1_ENABLED #define MBEDTLS_ECP_DP_SECP192K1_ENABLED #define MBEDTLS_ECP_DP_SECP224K1_ENABLED #define MBEDTLS_ECP_DP_SECP256K1_ENABLED #define MBEDTLS_ECP_DP_BP256R1_ENABLED #define MBEDTLS_ECP_DP_BP384R1_ENABLED #define MBEDTLS_ECP_DP_BP512R1_ENABLED #define MBEDTLS_ECP_DP_CURVE25519_ENABLED #define MBEDTLS_ECP_DP_CURVE448_ENABLED /** * \def MBEDTLS_ECP_NIST_OPTIM * * Enable specific 'modulo p' routines for each NIST prime. * Depending on the prime and architecture, makes operations 4 to 8 times * faster on the corresponding curve. * * Comment this macro to disable NIST curves optimisation. */ #define MBEDTLS_ECP_NIST_OPTIM /** * \def MBEDTLS_ECP_RESTARTABLE * * Enable "non-blocking" ECC operations that can return early and be resumed. * * This allows various functions to pause by returning * #MBEDTLS_ERR_ECP_IN_PROGRESS (or, for functions in the SSL module, * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) and then be called later again in * order to further progress and eventually complete their operation. This is * controlled through mbedtls_ecp_set_max_ops() which limits the maximum * number of ECC operations a function may perform before pausing; see * mbedtls_ecp_set_max_ops() for more information. * * This is useful in non-threaded environments if you want to avoid blocking * for too long on ECC (and, hence, X.509 or SSL/TLS) operations. * * Uncomment this macro to enable restartable ECC computations. * * \note This option only works with the default software implementation of * elliptic curve functionality. It is incompatible with * MBEDTLS_ECP_ALT, MBEDTLS_ECDH_XXX_ALT and MBEDTLS_ECDSA_XXX_ALT. */ //#define MBEDTLS_ECP_RESTARTABLE /** * \def MBEDTLS_ECDSA_DETERMINISTIC * * Enable deterministic ECDSA (RFC 6979). * Standard ECDSA is "fragile" in the sense that lack of entropy when signing * may result in a compromise of the long-term signing key. This is avoided by * the deterministic variant. * * Requires: MBEDTLS_HMAC_DRBG_C * * Comment this macro to disable deterministic ECDSA. */ #define MBEDTLS_ECDSA_DETERMINISTIC /** * \def MBEDTLS_KEY_EXCHANGE_PSK_ENABLED * * Enable the PSK based ciphersuite modes in SSL / TLS. * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED * * Enable the DHE-PSK based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_DHM_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA * * \warning Using DHE constitutes a security risk as it * is not possible to validate custom DH parameters. * If possible, it is recommended users should consider * preferring other methods of key exchange. * See dhm.h for more details. * */ #define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED * * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED * * Enable the RSA-PSK based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED * * Enable the RSA-only based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 */ #define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED * * Enable the DHE-RSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_DHM_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA * * \warning Using DHE constitutes a security risk as it * is not possible to validate custom DH parameters. * If possible, it is recommended users should consider * preferring other methods of key exchange. * See dhm.h for more details. * */ #define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED * * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, * MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED * * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C, * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA */ #define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED * * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 */ #define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED * * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS. * * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 */ #define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED /** * \def MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED * * Enable the ECJPAKE based ciphersuite modes in SSL / TLS. * * \warning This is currently experimental. EC J-PAKE support is based on the * Thread v1.0.0 specification; incompatible changes to the specification * might still happen. For this reason, this is disabled by default. * * Requires: MBEDTLS_ECJPAKE_C * MBEDTLS_SHA256_C * MBEDTLS_ECP_DP_SECP256R1_ENABLED * * This enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 */ //#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED /** * \def MBEDTLS_PK_PARSE_EC_EXTENDED * * Enhance support for reading EC keys using variants of SEC1 not allowed by * RFC 5915 and RFC 5480. * * Currently this means parsing the SpecifiedECDomain choice of EC * parameters (only known groups are supported, not arbitrary domains, to * avoid validation issues). * * Disable if you only need to support RFC 5915 + 5480 key formats. */ #define MBEDTLS_PK_PARSE_EC_EXTENDED /** * \def MBEDTLS_ERROR_STRERROR_DUMMY * * Enable a dummy error function to make use of mbedtls_strerror() in * third party libraries easier when MBEDTLS_ERROR_C is disabled * (no effect when MBEDTLS_ERROR_C is enabled). * * You can safely disable this if MBEDTLS_ERROR_C is enabled, or if you're * not using mbedtls_strerror() or error_strerror() in your application. * * Disable if you run into name conflicts and want to really remove the * mbedtls_strerror() */ #define MBEDTLS_ERROR_STRERROR_DUMMY /** * \def MBEDTLS_GENPRIME * * Enable the prime-number generation code. * * Requires: MBEDTLS_BIGNUM_C */ #define MBEDTLS_GENPRIME /** * \def MBEDTLS_FS_IO * * Enable functions that use the filesystem. */ #define MBEDTLS_FS_IO /** * \def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES * * Do not add default entropy sources. These are the platform specific, * mbedtls_timing_hardclock and HAVEGE based poll functions. * * This is useful to have more control over the added entropy sources in an * application. * * Uncomment this macro to prevent loading of default entropy functions. */ //#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES /** * \def MBEDTLS_NO_PLATFORM_ENTROPY * * Do not use built-in platform entropy functions. * This is useful if your platform does not support * standards like the /dev/urandom or Windows CryptoAPI. * * Uncomment this macro to disable the built-in platform entropy functions. */ //#define MBEDTLS_NO_PLATFORM_ENTROPY /** * \def MBEDTLS_ENTROPY_FORCE_SHA256 * * Force the entropy accumulator to use a SHA-256 accumulator instead of the * default SHA-512 based one (if both are available). * * Requires: MBEDTLS_SHA256_C * * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option * if you have performance concerns. * * This option is only useful if both MBEDTLS_SHA256_C and * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used. */ //#define MBEDTLS_ENTROPY_FORCE_SHA256 /** * \def MBEDTLS_ENTROPY_NV_SEED * * Enable the non-volatile (NV) seed file-based entropy source. * (Also enables the NV seed read/write functions in the platform layer) * * This is crucial (if not required) on systems that do not have a * cryptographic entropy source (in hardware or kernel) available. * * Requires: MBEDTLS_ENTROPY_C, MBEDTLS_PLATFORM_C * * \note The read/write functions that are used by the entropy source are * determined in the platform layer, and can be modified at runtime and/or * compile-time depending on the flags (MBEDTLS_PLATFORM_NV_SEED_*) used. * * \note If you use the default implementation functions that read a seedfile * with regular fopen(), please make sure you make a seedfile with the * proper name (defined in MBEDTLS_PLATFORM_STD_NV_SEED_FILE) and at * least MBEDTLS_ENTROPY_BLOCK_SIZE bytes in size that can be read from * and written to or you will get an entropy source error! The default * implementation will only use the first MBEDTLS_ENTROPY_BLOCK_SIZE * bytes from the file. * * \note The entropy collector will write to the seed file before entropy is * given to an external source, to update it. */ //#define MBEDTLS_ENTROPY_NV_SEED /** * \def MBEDTLS_MEMORY_DEBUG * * Enable debugging of buffer allocator memory issues. Automatically prints * (to stderr) all (fatal) messages on memory allocation issues. Enables * function for 'debug output' of allocated memory. * * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C * * Uncomment this macro to let the buffer allocator print out error messages. */ //#define MBEDTLS_MEMORY_DEBUG /** * \def MBEDTLS_MEMORY_BACKTRACE * * Include backtrace information with each allocated block. * * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C * GLIBC-compatible backtrace() an backtrace_symbols() support * * Uncomment this macro to include backtrace information */ //#define MBEDTLS_MEMORY_BACKTRACE /** * \def MBEDTLS_PK_RSA_ALT_SUPPORT * * Support external private RSA keys (eg from a HSM) in the PK layer. * * Comment this macro to disable support for external private RSA keys. */ #define MBEDTLS_PK_RSA_ALT_SUPPORT /** * \def MBEDTLS_PKCS1_V15 * * Enable support for PKCS#1 v1.5 encoding. * * Requires: MBEDTLS_RSA_C * * This enables support for PKCS#1 v1.5 operations. */ #define MBEDTLS_PKCS1_V15 /** * \def MBEDTLS_PKCS1_V21 * * Enable support for PKCS#1 v2.1 encoding. * * Requires: MBEDTLS_MD_C, MBEDTLS_RSA_C * * This enables support for RSAES-OAEP and RSASSA-PSS operations. */ #define MBEDTLS_PKCS1_V21 /** * \def MBEDTLS_RSA_NO_CRT * * Do not use the Chinese Remainder Theorem * for the RSA private operation. * * Uncomment this macro to disable the use of CRT in RSA. * */ //#define MBEDTLS_RSA_NO_CRT /** * \def MBEDTLS_SELF_TEST * * Enable the checkup functions (*_self_test). */ #define MBEDTLS_SELF_TEST /** * \def MBEDTLS_SHA256_SMALLER * * Enable an implementation of SHA-256 that has lower ROM footprint but also * lower performance. * * The default implementation is meant to be a reasonnable compromise between * performance and size. This version optimizes more aggressively for size at * the expense of performance. Eg on Cortex-M4 it reduces the size of * mbedtls_sha256_process() from ~2KB to ~0.5KB for a performance hit of about * 30%. * * Uncomment to enable the smaller implementation of SHA256. */ //#define MBEDTLS_SHA256_SMALLER /** * \def MBEDTLS_SSL_ALL_ALERT_MESSAGES * * Enable sending of alert messages in case of encountered errors as per RFC. * If you choose not to send the alert messages, mbed TLS can still communicate * with other servers, only debugging of failures is harder. * * The advantage of not sending alert messages, is that no information is given * about reasons for failures thus preventing adversaries of gaining intel. * * Enable sending of all alert messages */ #define MBEDTLS_SSL_ALL_ALERT_MESSAGES /** * \def MBEDTLS_SSL_ASYNC_PRIVATE * * Enable asynchronous external private key operations in SSL. This allows * you to configure an SSL connection to call an external cryptographic * module to perform private key operations instead of performing the * operation inside the library. * */ //#define MBEDTLS_SSL_ASYNC_PRIVATE /** * \def MBEDTLS_SSL_DEBUG_ALL * * Enable the debug messages in SSL module for all issues. * Debug messages have been disabled in some places to prevent timing * attacks due to (unbalanced) debugging function calls. * * If you need all error reporting you should enable this during debugging, * but remove this for production servers that should log as well. * * Uncomment this macro to report all debug messages on errors introducing * a timing side-channel. * */ //#define MBEDTLS_SSL_DEBUG_ALL /** \def MBEDTLS_SSL_ENCRYPT_THEN_MAC * * Enable support for Encrypt-then-MAC, RFC 7366. * * This allows peers that both support it to use a more robust protection for * ciphersuites using CBC, providing deep resistance against timing attacks * on the padding or underlying cipher. * * This only affects CBC ciphersuites, and is useless if none is defined. * * Requires: MBEDTLS_SSL_PROTO_TLS1 or * MBEDTLS_SSL_PROTO_TLS1_1 or * MBEDTLS_SSL_PROTO_TLS1_2 * * Comment this macro to disable support for Encrypt-then-MAC */ #define MBEDTLS_SSL_ENCRYPT_THEN_MAC /** \def MBEDTLS_SSL_EXTENDED_MASTER_SECRET * * Enable support for Extended Master Secret, aka Session Hash * (draft-ietf-tls-session-hash-02). * * This was introduced as "the proper fix" to the Triple Handshake familiy of * attacks, but it is recommended to always use it (even if you disable * renegotiation), since it actually fixes a more fundamental issue in the * original SSL/TLS design, and has implications beyond Triple Handshake. * * Requires: MBEDTLS_SSL_PROTO_TLS1 or * MBEDTLS_SSL_PROTO_TLS1_1 or * MBEDTLS_SSL_PROTO_TLS1_2 * * Comment this macro to disable support for Extended Master Secret. */ #define MBEDTLS_SSL_EXTENDED_MASTER_SECRET /** * \def MBEDTLS_SSL_FALLBACK_SCSV * * Enable support for FALLBACK_SCSV (draft-ietf-tls-downgrade-scsv-00). * * For servers, it is recommended to always enable this, unless you support * only one version of TLS, or know for sure that none of your clients * implements a fallback strategy. * * For clients, you only need this if you're using a fallback strategy, which * is not recommended in the first place, unless you absolutely need it to * interoperate with buggy (version-intolerant) servers. * * Comment this macro to disable support for FALLBACK_SCSV */ #define MBEDTLS_SSL_FALLBACK_SCSV /** * \def MBEDTLS_SSL_HW_RECORD_ACCEL * * Enable hooking functions in SSL module for hardware acceleration of * individual records. * * Uncomment this macro to enable hooking functions. */ //#define MBEDTLS_SSL_HW_RECORD_ACCEL /** * \def MBEDTLS_SSL_CBC_RECORD_SPLITTING * * Enable 1/n-1 record splitting for CBC mode in SSLv3 and TLS 1.0. * * This is a countermeasure to the BEAST attack, which also minimizes the risk * of interoperability issues compared to sending 0-length records. * * Comment this macro to disable 1/n-1 record splitting. */ #define MBEDTLS_SSL_CBC_RECORD_SPLITTING /** * \def MBEDTLS_SSL_RENEGOTIATION * * Enable support for TLS renegotiation. * * The two main uses of renegotiation are (1) refresh keys on long-lived * connections and (2) client authentication after the initial handshake. * If you don't need renegotiation, it's probably better to disable it, since * it has been associated with security issues in the past and is easy to * misuse/misunderstand. * * Comment this to disable support for renegotiation. * * \note Even if this option is disabled, both client and server are aware * of the Renegotiation Indication Extension (RFC 5746) used to * prevent the SSL renegotiation attack (see RFC 5746 Sect. 1). * (See \c mbedtls_ssl_conf_legacy_renegotiation for the * configuration of this extension). * */ #define MBEDTLS_SSL_RENEGOTIATION /** * \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO * * Enable support for receiving and parsing SSLv2 Client Hello messages for the * SSL Server module (MBEDTLS_SSL_SRV_C). * * Uncomment this macro to enable support for SSLv2 Client Hello messages. */ //#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO /** * \def MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE * * Pick the ciphersuite according to the client's preferences rather than ours * in the SSL Server module (MBEDTLS_SSL_SRV_C). * * Uncomment this macro to respect client's ciphersuite order */ //#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE /** * \def MBEDTLS_SSL_MAX_FRAGMENT_LENGTH * * Enable support for RFC 6066 max_fragment_length extension in SSL. * * Comment this macro to disable support for the max_fragment_length extension */ #define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH /** * \def MBEDTLS_SSL_PROTO_SSL3 * * Enable support for SSL 3.0. * * Requires: MBEDTLS_MD5_C * MBEDTLS_SHA1_C * * Comment this macro to disable support for SSL 3.0 */ //#define MBEDTLS_SSL_PROTO_SSL3 /** * \def MBEDTLS_SSL_PROTO_TLS1 * * Enable support for TLS 1.0. * * Requires: MBEDTLS_MD5_C * MBEDTLS_SHA1_C * * Comment this macro to disable support for TLS 1.0 */ #define MBEDTLS_SSL_PROTO_TLS1 /** * \def MBEDTLS_SSL_PROTO_TLS1_1 * * Enable support for TLS 1.1 (and DTLS 1.0 if DTLS is enabled). * * Requires: MBEDTLS_MD5_C * MBEDTLS_SHA1_C * * Comment this macro to disable support for TLS 1.1 / DTLS 1.0 */ #define MBEDTLS_SSL_PROTO_TLS1_1 /** * \def MBEDTLS_SSL_PROTO_TLS1_2 * * Enable support for TLS 1.2 (and DTLS 1.2 if DTLS is enabled). * * Requires: MBEDTLS_SHA1_C or MBEDTLS_SHA256_C or MBEDTLS_SHA512_C * (Depends on ciphersuites) * * Comment this macro to disable support for TLS 1.2 / DTLS 1.2 */ #define MBEDTLS_SSL_PROTO_TLS1_2 /** * \def MBEDTLS_SSL_PROTO_DTLS * * Enable support for DTLS (all available versions). * * Enable this and MBEDTLS_SSL_PROTO_TLS1_1 to enable DTLS 1.0, * and/or this and MBEDTLS_SSL_PROTO_TLS1_2 to enable DTLS 1.2. * * Requires: MBEDTLS_SSL_PROTO_TLS1_1 * or MBEDTLS_SSL_PROTO_TLS1_2 * * Comment this macro to disable support for DTLS */ #define MBEDTLS_SSL_PROTO_DTLS /** * \def MBEDTLS_SSL_ALPN * * Enable support for RFC 7301 Application Layer Protocol Negotiation. * * Comment this macro to disable support for ALPN. */ #define MBEDTLS_SSL_ALPN /** * \def MBEDTLS_SSL_DTLS_ANTI_REPLAY * * Enable support for the anti-replay mechanism in DTLS. * * Requires: MBEDTLS_SSL_TLS_C * MBEDTLS_SSL_PROTO_DTLS * * \warning Disabling this is often a security risk! * See mbedtls_ssl_conf_dtls_anti_replay() for details. * * Comment this to disable anti-replay in DTLS. */ #define MBEDTLS_SSL_DTLS_ANTI_REPLAY /** * \def MBEDTLS_SSL_DTLS_HELLO_VERIFY * * Enable support for HelloVerifyRequest on DTLS servers. * * This feature is highly recommended to prevent DTLS servers being used as * amplifiers in DoS attacks against other hosts. It should always be enabled * unless you know for sure amplification cannot be a problem in the * environment in which your server operates. * * \warning Disabling this can ba a security risk! (see above) * * Requires: MBEDTLS_SSL_PROTO_DTLS * * Comment this to disable support for HelloVerifyRequest. */ #define MBEDTLS_SSL_DTLS_HELLO_VERIFY /** * \def MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE * * Enable server-side support for clients that reconnect from the same port. * * Some clients unexpectedly close the connection and try to reconnect using the * same source port. This needs special support from the server to handle the * new connection securely, as described in section 4.2.8 of RFC 6347. This * flag enables that support. * * Requires: MBEDTLS_SSL_DTLS_HELLO_VERIFY * * Comment this to disable support for clients reusing the source port. */ #define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE /** * \def MBEDTLS_SSL_DTLS_BADMAC_LIMIT * * Enable support for a limit of records with bad MAC. * * See mbedtls_ssl_conf_dtls_badmac_limit(). * * Requires: MBEDTLS_SSL_PROTO_DTLS */ #define MBEDTLS_SSL_DTLS_BADMAC_LIMIT /** * \def MBEDTLS_SSL_SESSION_TICKETS * * Enable support for RFC 5077 session tickets in SSL. * Client-side, provides full support for session tickets (maintainance of a * session store remains the responsibility of the application, though). * Server-side, you also need to provide callbacks for writing and parsing * tickets, including authenticated encryption and key management. Example * callbacks are provided by MBEDTLS_SSL_TICKET_C. * * Comment this macro to disable support for SSL session tickets */ #define MBEDTLS_SSL_SESSION_TICKETS /** * \def MBEDTLS_SSL_EXPORT_KEYS * * Enable support for exporting key block and master secret. * This is required for certain users of TLS, e.g. EAP-TLS. * * Comment this macro to disable support for key export */ #define MBEDTLS_SSL_EXPORT_KEYS /** * \def MBEDTLS_SSL_SERVER_NAME_INDICATION * * Enable support for RFC 6066 server name indication (SNI) in SSL. * * Requires: MBEDTLS_X509_CRT_PARSE_C * * Comment this macro to disable support for server name indication in SSL */ #define MBEDTLS_SSL_SERVER_NAME_INDICATION /** * \def MBEDTLS_SSL_TRUNCATED_HMAC * * Enable support for RFC 6066 truncated HMAC in SSL. * * Comment this macro to disable support for truncated HMAC in SSL */ #define MBEDTLS_SSL_TRUNCATED_HMAC /** * \def MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT * * Fallback to old (pre-2.7), non-conforming implementation of the truncated * HMAC extension which also truncates the HMAC key. Note that this option is * only meant for a transitory upgrade period and is likely to be removed in * a future version of the library. * * \warning The old implementation is non-compliant and has a security weakness * (2^80 brute force attack on the HMAC key used for a single, * uninterrupted connection). This should only be enabled temporarily * when (1) the use of truncated HMAC is essential in order to save * bandwidth, and (2) the peer is an Mbed TLS stack that doesn't use * the fixed implementation yet (pre-2.7). * * \deprecated This option is deprecated and will likely be removed in a * future version of Mbed TLS. * * Uncomment to fallback to old, non-compliant truncated HMAC implementation. * * Requires: MBEDTLS_SSL_TRUNCATED_HMAC */ //#define MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT /** * \def MBEDTLS_THREADING_ALT * * Provide your own alternate threading implementation. * * Requires: MBEDTLS_THREADING_C * * Uncomment this to allow your own alternate threading implementation. */ //#define MBEDTLS_THREADING_ALT /** * \def MBEDTLS_THREADING_PTHREAD * * Enable the pthread wrapper layer for the threading layer. * * Requires: MBEDTLS_THREADING_C * * Uncomment this to enable pthread mutexes. */ //#define MBEDTLS_THREADING_PTHREAD /** * \def MBEDTLS_VERSION_FEATURES * * Allow run-time checking of compile-time enabled features. Thus allowing users * to check at run-time if the library is for instance compiled with threading * support via mbedtls_version_check_feature(). * * Requires: MBEDTLS_VERSION_C * * Comment this to disable run-time checking and save ROM space */ #define MBEDTLS_VERSION_FEATURES /** * \def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 * * If set, the X509 parser will not break-off when parsing an X509 certificate * and encountering an extension in a v1 or v2 certificate. * * Uncomment to prevent an error. */ //#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 /** * \def MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION * * If set, the X509 parser will not break-off when parsing an X509 certificate * and encountering an unknown critical extension. * * \warning Depending on your PKI use, enabling this can be a security risk! * * Uncomment to prevent an error. */ //#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION /** * \def MBEDTLS_X509_CHECK_KEY_USAGE * * Enable verification of the keyUsage extension (CA and leaf certificates). * * Disabling this avoids problems with mis-issued and/or misused * (intermediate) CA and leaf certificates. * * \warning Depending on your PKI use, disabling this can be a security risk! * * Comment to skip keyUsage checking for both CA and leaf certificates. */ #define MBEDTLS_X509_CHECK_KEY_USAGE /** * \def MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE * * Enable verification of the extendedKeyUsage extension (leaf certificates). * * Disabling this avoids problems with mis-issued and/or misused certificates. * * \warning Depending on your PKI use, disabling this can be a security risk! * * Comment to skip extendedKeyUsage checking for certificates. */ #define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE /** * \def MBEDTLS_X509_RSASSA_PSS_SUPPORT * * Enable parsing and verification of X.509 certificates, CRLs and CSRS * signed with RSASSA-PSS (aka PKCS#1 v2.1). * * Comment this macro to disallow using RSASSA-PSS in certificates. */ #define MBEDTLS_X509_RSASSA_PSS_SUPPORT /** * \def MBEDTLS_ZLIB_SUPPORT * * If set, the SSL/TLS module uses ZLIB to support compression and * decompression of packet data. * * \warning TLS-level compression MAY REDUCE SECURITY! See for example the * CRIME attack. Before enabling this option, you should examine with care if * CRIME or similar exploits may be a applicable to your use case. * * \note Currently compression can't be used with DTLS. * * \deprecated This feature is deprecated and will be removed * in the next major revision of the library. * * Used in: library/ssl_tls.c * library/ssl_cli.c * library/ssl_srv.c * * This feature requires zlib library and headers to be present. * * Uncomment to enable use of ZLIB */ //#define MBEDTLS_ZLIB_SUPPORT /* \} name SECTION: mbed TLS feature support */ /** * \name SECTION: mbed TLS modules * * This section enables or disables entire modules in mbed TLS * \{ */ /** * \def MBEDTLS_AESNI_C * * Enable AES-NI support on x86-64. * * Module: library/aesni.c * Caller: library/aes.c * * Requires: MBEDTLS_HAVE_ASM * * This modules adds support for the AES-NI instructions on x86-64 */ #define MBEDTLS_AESNI_C /** * \def MBEDTLS_AES_C * * Enable the AES block cipher. * * Module: library/aes.c * Caller: library/cipher.c * library/pem.c * library/ctr_drbg.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA * * PEM_PARSE uses AES for decrypting encrypted keys. */ #define MBEDTLS_AES_C /** * \def MBEDTLS_ARC4_C * * Enable the ARCFOUR stream cipher. * * Module: library/arc4.c * Caller: library/cipher.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. If possible, we recommend avoidng dependencies on * it, and considering stronger ciphers instead. * */ #define MBEDTLS_ARC4_C /** * \def MBEDTLS_ASN1_PARSE_C * * Enable the generic ASN1 parser. * * Module: library/asn1.c * Caller: library/x509.c * library/dhm.c * library/pkcs12.c * library/pkcs5.c * library/pkparse.c */ #define MBEDTLS_ASN1_PARSE_C /** * \def MBEDTLS_ASN1_WRITE_C * * Enable the generic ASN1 writer. * * Module: library/asn1write.c * Caller: library/ecdsa.c * library/pkwrite.c * library/x509_create.c * library/x509write_crt.c * library/x509write_csr.c */ #define MBEDTLS_ASN1_WRITE_C /** * \def MBEDTLS_BASE64_C * * Enable the Base64 module. * * Module: library/base64.c * Caller: library/pem.c * * This module is required for PEM support (required by X.509). */ #define MBEDTLS_BASE64_C /** * \def MBEDTLS_BIGNUM_C * * Enable the multi-precision integer library. * * Module: library/bignum.c * Caller: library/dhm.c * library/ecp.c * library/ecdsa.c * library/rsa.c * library/rsa_internal.c * library/ssl_tls.c * * This module is required for RSA, DHM and ECC (ECDH, ECDSA) support. */ #define MBEDTLS_BIGNUM_C /** * \def MBEDTLS_BLOWFISH_C * * Enable the Blowfish block cipher. * * Module: library/blowfish.c */ #define MBEDTLS_BLOWFISH_C /** * \def MBEDTLS_CAMELLIA_C * * Enable the Camellia block cipher. * * Module: library/camellia.c * Caller: library/cipher.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 */ #define MBEDTLS_CAMELLIA_C /** * \def MBEDTLS_ARIA_C * * Enable the ARIA block cipher. * * Module: library/aria.c * Caller: library/cipher.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * * MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 * MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 * MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 * MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 */ //#define MBEDTLS_ARIA_C /** * \def MBEDTLS_CCM_C * * Enable the Counter with CBC-MAC (CCM) mode for 128-bit block cipher. * * Module: library/ccm.c * * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C * * This module enables the AES-CCM ciphersuites, if other requisites are * enabled as well. */ #define MBEDTLS_CCM_C /** * \def MBEDTLS_CERTS_C * * Enable the test certificates. * * Module: library/certs.c * Caller: * * This module is used for testing (ssl_client/server). */ #define MBEDTLS_CERTS_C /** * \def MBEDTLS_CHACHA20_C * * Enable the ChaCha20 stream cipher. * * Module: library/chacha20.c */ #define MBEDTLS_CHACHA20_C /** * \def MBEDTLS_CHACHAPOLY_C * * Enable the ChaCha20-Poly1305 AEAD algorithm. * * Module: library/chachapoly.c * * This module requires: MBEDTLS_CHACHA20_C, MBEDTLS_POLY1305_C */ #define MBEDTLS_CHACHAPOLY_C /** * \def MBEDTLS_CIPHER_C * * Enable the generic cipher layer. * * Module: library/cipher.c * Caller: library/ssl_tls.c * * Uncomment to enable generic cipher wrappers. */ #define MBEDTLS_CIPHER_C /** * \def MBEDTLS_CMAC_C * * Enable the CMAC (Cipher-based Message Authentication Code) mode for block * ciphers. * * Module: library/cmac.c * * Requires: MBEDTLS_AES_C or MBEDTLS_DES_C * */ //#define MBEDTLS_CMAC_C /** * \def MBEDTLS_CTR_DRBG_C * * Enable the CTR_DRBG AES-based random generator. * The CTR_DRBG generator uses AES-256 by default. * To use AES-128 instead, enable MBEDTLS_CTR_DRBG_USE_128_BIT_KEY below. * * Module: library/ctr_drbg.c * Caller: * * Requires: MBEDTLS_AES_C * * This module provides the CTR_DRBG AES random number generator. */ #define MBEDTLS_CTR_DRBG_C /** * \def MBEDTLS_DEBUG_C * * Enable the debug functions. * * Module: library/debug.c * Caller: library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * * This module provides debugging functions. */ #define MBEDTLS_DEBUG_C /** * \def MBEDTLS_DES_C * * Enable the DES block cipher. * * Module: library/des.c * Caller: library/pem.c * library/cipher.c * * This module enables the following ciphersuites (if other requisites are * enabled as well): * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA * * PEM_PARSE uses DES/3DES for decrypting encrypted keys. * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers instead. */ #define MBEDTLS_DES_C /** * \def MBEDTLS_DHM_C * * Enable the Diffie-Hellman-Merkle module. * * Module: library/dhm.c * Caller: library/ssl_cli.c * library/ssl_srv.c * * This module is used by the following key exchanges: * DHE-RSA, DHE-PSK * * \warning Using DHE constitutes a security risk as it * is not possible to validate custom DH parameters. * If possible, it is recommended users should consider * preferring other methods of key exchange. * See dhm.h for more details. * */ #define MBEDTLS_DHM_C /** * \def MBEDTLS_ECDH_C * * Enable the elliptic curve Diffie-Hellman library. * * Module: library/ecdh.c * Caller: library/ssl_cli.c * library/ssl_srv.c * * This module is used by the following key exchanges: * ECDHE-ECDSA, ECDHE-RSA, DHE-PSK * * Requires: MBEDTLS_ECP_C */ #define MBEDTLS_ECDH_C /** * \def MBEDTLS_ECDSA_C * * Enable the elliptic curve DSA library. * * Module: library/ecdsa.c * Caller: * * This module is used by the following key exchanges: * ECDHE-ECDSA * * Requires: MBEDTLS_ECP_C, MBEDTLS_ASN1_WRITE_C, MBEDTLS_ASN1_PARSE_C */ #define MBEDTLS_ECDSA_C /** * \def MBEDTLS_ECJPAKE_C * * Enable the elliptic curve J-PAKE library. * * \warning This is currently experimental. EC J-PAKE support is based on the * Thread v1.0.0 specification; incompatible changes to the specification * might still happen. For this reason, this is disabled by default. * * Module: library/ecjpake.c * Caller: * * This module is used by the following key exchanges: * ECJPAKE * * Requires: MBEDTLS_ECP_C, MBEDTLS_MD_C */ //#define MBEDTLS_ECJPAKE_C /** * \def MBEDTLS_ECP_C * * Enable the elliptic curve over GF(p) library. * * Module: library/ecp.c * Caller: library/ecdh.c * library/ecdsa.c * library/ecjpake.c * * Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED */ #define MBEDTLS_ECP_C /** * \def MBEDTLS_ENTROPY_C * * Enable the platform-specific entropy code. * * Module: library/entropy.c * Caller: * * Requires: MBEDTLS_SHA512_C or MBEDTLS_SHA256_C * * This module provides a generic entropy pool */ #define MBEDTLS_ENTROPY_C /** * \def MBEDTLS_ERROR_C * * Enable error code to error string conversion. * * Module: library/error.c * Caller: * * This module enables mbedtls_strerror(). */ #define MBEDTLS_ERROR_C /** * \def MBEDTLS_GCM_C * * Enable the Galois/Counter Mode (GCM) for AES. * * Module: library/gcm.c * * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C * * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other * requisites are enabled as well. */ #define MBEDTLS_GCM_C /** * \def MBEDTLS_HAVEGE_C * * Enable the HAVEGE random generator. * * Warning: the HAVEGE random generator is not suitable for virtualized * environments * * Warning: the HAVEGE random generator is dependent on timing and specific * processor traits. It is therefore not advised to use HAVEGE as * your applications primary random generator or primary entropy pool * input. As a secondary input to your entropy pool, it IS able add * the (limited) extra entropy it provides. * * Module: library/havege.c * Caller: * * Requires: MBEDTLS_TIMING_C * * Uncomment to enable the HAVEGE random generator. */ //#define MBEDTLS_HAVEGE_C /** * \def MBEDTLS_HKDF_C * * Enable the HKDF algorithm (RFC 5869). * * Module: library/hkdf.c * Caller: * * Requires: MBEDTLS_MD_C * * This module adds support for the Hashed Message Authentication Code * (HMAC)-based key derivation function (HKDF). */ #define MBEDTLS_HKDF_C /** * \def MBEDTLS_HMAC_DRBG_C * * Enable the HMAC_DRBG random generator. * * Module: library/hmac_drbg.c * Caller: * * Requires: MBEDTLS_MD_C * * Uncomment to enable the HMAC_DRBG random number geerator. */ #define MBEDTLS_HMAC_DRBG_C /** * \def MBEDTLS_NIST_KW_C * * Enable the Key Wrapping mode for 128-bit block ciphers, * as defined in NIST SP 800-38F. Only KW and KWP modes * are supported. At the moment, only AES is approved by NIST. * * Module: library/nist_kw.c * * Requires: MBEDTLS_AES_C and MBEDTLS_CIPHER_C */ //#define MBEDTLS_NIST_KW_C /** * \def MBEDTLS_MD_C * * Enable the generic message digest layer. * * Module: library/md.c * Caller: * * Uncomment to enable generic message digest wrappers. */ #define MBEDTLS_MD_C /** * \def MBEDTLS_MD2_C * * Enable the MD2 hash algorithm. * * Module: library/md2.c * Caller: * * Uncomment to enable support for (rare) MD2-signed X.509 certs. * * \warning MD2 is considered a weak message digest and its use constitutes a * security risk. If possible, we recommend avoiding dependencies on * it, and considering stronger message digests instead. * */ //#define MBEDTLS_MD2_C /** * \def MBEDTLS_MD4_C * * Enable the MD4 hash algorithm. * * Module: library/md4.c * Caller: * * Uncomment to enable support for (rare) MD4-signed X.509 certs. * * \warning MD4 is considered a weak message digest and its use constitutes a * security risk. If possible, we recommend avoiding dependencies on * it, and considering stronger message digests instead. * */ //#define MBEDTLS_MD4_C /** * \def MBEDTLS_MD5_C * * Enable the MD5 hash algorithm. * * Module: library/md5.c * Caller: library/md.c * library/pem.c * library/ssl_tls.c * * This module is required for SSL/TLS up to version 1.1, and for TLS 1.2 * depending on the handshake parameters. Further, it is used for checking * MD5-signed certificates, and for PBKDF1 when decrypting PEM-encoded * encrypted keys. * * \warning MD5 is considered a weak message digest and its use constitutes a * security risk. If possible, we recommend avoiding dependencies on * it, and considering stronger message digests instead. * */ #define MBEDTLS_MD5_C /** * \def MBEDTLS_MEMORY_BUFFER_ALLOC_C * * Enable the buffer allocator implementation that makes use of a (stack) * based buffer to 'allocate' dynamic memory. (replaces calloc() and free() * calls) * * Module: library/memory_buffer_alloc.c * * Requires: MBEDTLS_PLATFORM_C * MBEDTLS_PLATFORM_MEMORY (to use it within mbed TLS) * * Enable this module to enable the buffer memory allocator. */ //#define MBEDTLS_MEMORY_BUFFER_ALLOC_C /** * \def MBEDTLS_NET_C * * Enable the TCP and UDP over IPv6/IPv4 networking routines. * * \note This module only works on POSIX/Unix (including Linux, BSD and OS X) * and Windows. For other platforms, you'll want to disable it, and write your * own networking callbacks to be passed to \c mbedtls_ssl_set_bio(). * * \note See also our Knowledge Base article about porting to a new * environment: * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS * * Module: library/net_sockets.c * * This module provides networking routines. */ #define MBEDTLS_NET_C /** * \def MBEDTLS_OID_C * * Enable the OID database. * * Module: library/oid.c * Caller: library/asn1write.c * library/pkcs5.c * library/pkparse.c * library/pkwrite.c * library/rsa.c * library/x509.c * library/x509_create.c * library/x509_crl.c * library/x509_crt.c * library/x509_csr.c * library/x509write_crt.c * library/x509write_csr.c * * This modules translates between OIDs and internal values. */ #define MBEDTLS_OID_C /** * \def MBEDTLS_PADLOCK_C * * Enable VIA Padlock support on x86. * * Module: library/padlock.c * Caller: library/aes.c * * Requires: MBEDTLS_HAVE_ASM * * This modules adds support for the VIA PadLock on x86. */ #define MBEDTLS_PADLOCK_C /** * \def MBEDTLS_PEM_PARSE_C * * Enable PEM decoding / parsing. * * Module: library/pem.c * Caller: library/dhm.c * library/pkparse.c * library/x509_crl.c * library/x509_crt.c * library/x509_csr.c * * Requires: MBEDTLS_BASE64_C * * This modules adds support for decoding / parsing PEM files. */ #define MBEDTLS_PEM_PARSE_C /** * \def MBEDTLS_PEM_WRITE_C * * Enable PEM encoding / writing. * * Module: library/pem.c * Caller: library/pkwrite.c * library/x509write_crt.c * library/x509write_csr.c * * Requires: MBEDTLS_BASE64_C * * This modules adds support for encoding / writing PEM files. */ #define MBEDTLS_PEM_WRITE_C /** * \def MBEDTLS_PK_C * * Enable the generic public (asymetric) key layer. * * Module: library/pk.c * Caller: library/ssl_tls.c * library/ssl_cli.c * library/ssl_srv.c * * Requires: MBEDTLS_RSA_C or MBEDTLS_ECP_C * * Uncomment to enable generic public key wrappers. */ #define MBEDTLS_PK_C /** * \def MBEDTLS_PK_PARSE_C * * Enable the generic public (asymetric) key parser. * * Module: library/pkparse.c * Caller: library/x509_crt.c * library/x509_csr.c * * Requires: MBEDTLS_PK_C * * Uncomment to enable generic public key parse functions. */ #define MBEDTLS_PK_PARSE_C /** * \def MBEDTLS_PK_WRITE_C * * Enable the generic public (asymetric) key writer. * * Module: library/pkwrite.c * Caller: library/x509write.c * * Requires: MBEDTLS_PK_C * * Uncomment to enable generic public key write functions. */ #define MBEDTLS_PK_WRITE_C /** * \def MBEDTLS_PKCS5_C * * Enable PKCS#5 functions. * * Module: library/pkcs5.c * * Requires: MBEDTLS_MD_C * * This module adds support for the PKCS#5 functions. */ #define MBEDTLS_PKCS5_C /** * \def MBEDTLS_PKCS11_C * * Enable wrapper for PKCS#11 smartcard support. * * Module: library/pkcs11.c * Caller: library/pk.c * * Requires: MBEDTLS_PK_C * * This module enables SSL/TLS PKCS #11 smartcard support. * Requires the presence of the PKCS#11 helper library (libpkcs11-helper) */ //#define MBEDTLS_PKCS11_C /** * \def MBEDTLS_PKCS12_C * * Enable PKCS#12 PBE functions. * Adds algorithms for parsing PKCS#8 encrypted private keys * * Module: library/pkcs12.c * Caller: library/pkparse.c * * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_CIPHER_C, MBEDTLS_MD_C * Can use: MBEDTLS_ARC4_C * * This module enables PKCS#12 functions. */ #define MBEDTLS_PKCS12_C /** * \def MBEDTLS_PLATFORM_C * * Enable the platform abstraction layer that allows you to re-assign * functions like calloc(), free(), snprintf(), printf(), fprintf(), exit(). * * Enabling MBEDTLS_PLATFORM_C enables to use of MBEDTLS_PLATFORM_XXX_ALT * or MBEDTLS_PLATFORM_XXX_MACRO directives, allowing the functions mentioned * above to be specified at runtime or compile time respectively. * * \note This abstraction layer must be enabled on Windows (including MSYS2) * as other module rely on it for a fixed snprintf implementation. * * Module: library/platform.c * Caller: Most other .c files * * This module enables abstraction of common (libc) functions. */ #define MBEDTLS_PLATFORM_C /** * \def MBEDTLS_POLY1305_C * * Enable the Poly1305 MAC algorithm. * * Module: library/poly1305.c * Caller: library/chachapoly.c */ #define MBEDTLS_POLY1305_C /** * \def MBEDTLS_RIPEMD160_C * * Enable the RIPEMD-160 hash algorithm. * * Module: library/ripemd160.c * Caller: library/md.c * */ #define MBEDTLS_RIPEMD160_C /** * \def MBEDTLS_RSA_C * * Enable the RSA public-key cryptosystem. * * Module: library/rsa.c * library/rsa_internal.c * Caller: library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * library/x509.c * * This module is used by the following key exchanges: * RSA, DHE-RSA, ECDHE-RSA, RSA-PSK * * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C */ #define MBEDTLS_RSA_C /** * \def MBEDTLS_SHA1_C * * Enable the SHA1 cryptographic hash algorithm. * * Module: library/sha1.c * Caller: library/md.c * library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * library/x509write_crt.c * * This module is required for SSL/TLS up to version 1.1, for TLS 1.2 * depending on the handshake parameters, and for SHA1-signed certificates. * * \warning SHA-1 is considered a weak message digest and its use constitutes * a security risk. If possible, we recommend avoiding dependencies * on it, and considering stronger message digests instead. * */ #define MBEDTLS_SHA1_C /** * \def MBEDTLS_SHA256_C * * Enable the SHA-224 and SHA-256 cryptographic hash algorithms. * * Module: library/sha256.c * Caller: library/entropy.c * library/md.c * library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * * This module adds support for SHA-224 and SHA-256. * This module is required for the SSL/TLS 1.2 PRF function. */ #define MBEDTLS_SHA256_C /** * \def MBEDTLS_SHA512_C * * Enable the SHA-384 and SHA-512 cryptographic hash algorithms. * * Module: library/sha512.c * Caller: library/entropy.c * library/md.c * library/ssl_cli.c * library/ssl_srv.c * * This module adds support for SHA-384 and SHA-512. */ #define MBEDTLS_SHA512_C /** * \def MBEDTLS_SSL_CACHE_C * * Enable simple SSL cache implementation. * * Module: library/ssl_cache.c * Caller: * * Requires: MBEDTLS_SSL_CACHE_C */ #define MBEDTLS_SSL_CACHE_C /** * \def MBEDTLS_SSL_COOKIE_C * * Enable basic implementation of DTLS cookies for hello verification. * * Module: library/ssl_cookie.c * Caller: */ #define MBEDTLS_SSL_COOKIE_C /** * \def MBEDTLS_SSL_TICKET_C * * Enable an implementation of TLS server-side callbacks for session tickets. * * Module: library/ssl_ticket.c * Caller: * * Requires: MBEDTLS_CIPHER_C */ #define MBEDTLS_SSL_TICKET_C /** * \def MBEDTLS_SSL_CLI_C * * Enable the SSL/TLS client code. * * Module: library/ssl_cli.c * Caller: * * Requires: MBEDTLS_SSL_TLS_C * * This module is required for SSL/TLS client support. */ #define MBEDTLS_SSL_CLI_C /** * \def MBEDTLS_SSL_SRV_C * * Enable the SSL/TLS server code. * * Module: library/ssl_srv.c * Caller: * * Requires: MBEDTLS_SSL_TLS_C * * This module is required for SSL/TLS server support. */ #define MBEDTLS_SSL_SRV_C /** * \def MBEDTLS_SSL_TLS_C * * Enable the generic SSL/TLS code. * * Module: library/ssl_tls.c * Caller: library/ssl_cli.c * library/ssl_srv.c * * Requires: MBEDTLS_CIPHER_C, MBEDTLS_MD_C * and at least one of the MBEDTLS_SSL_PROTO_XXX defines * * This module is required for SSL/TLS. */ #define MBEDTLS_SSL_TLS_C /** * \def MBEDTLS_THREADING_C * * Enable the threading abstraction layer. * By default mbed TLS assumes it is used in a non-threaded environment or that * contexts are not shared between threads. If you do intend to use contexts * between threads, you will need to enable this layer to prevent race * conditions. See also our Knowledge Base article about threading: * https://tls.mbed.org/kb/development/thread-safety-and-multi-threading * * Module: library/threading.c * * This allows different threading implementations (self-implemented or * provided). * * You will have to enable either MBEDTLS_THREADING_ALT or * MBEDTLS_THREADING_PTHREAD. * * Enable this layer to allow use of mutexes within mbed TLS */ //#define MBEDTLS_THREADING_C /** * \def MBEDTLS_TIMING_C * * Enable the semi-portable timing interface. * * \note The provided implementation only works on POSIX/Unix (including Linux, * BSD and OS X) and Windows. On other platforms, you can either disable that * module and provide your own implementations of the callbacks needed by * \c mbedtls_ssl_set_timer_cb() for DTLS, or leave it enabled and provide * your own implementation of the whole module by setting * \c MBEDTLS_TIMING_ALT in the current file. * * \note See also our Knowledge Base article about porting to a new * environment: * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS * * Module: library/timing.c * Caller: library/havege.c * * This module is used by the HAVEGE random number generator. */ #define MBEDTLS_TIMING_C /** * \def MBEDTLS_VERSION_C * * Enable run-time version information. * * Module: library/version.c * * This module provides run-time version information. */ #define MBEDTLS_VERSION_C /** * \def MBEDTLS_X509_USE_C * * Enable X.509 core for using certificates. * * Module: library/x509.c * Caller: library/x509_crl.c * library/x509_crt.c * library/x509_csr.c * * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, * MBEDTLS_PK_PARSE_C * * This module is required for the X.509 parsing modules. */ #define MBEDTLS_X509_USE_C /** * \def MBEDTLS_X509_CRT_PARSE_C * * Enable X.509 certificate parsing. * * Module: library/x509_crt.c * Caller: library/ssl_cli.c * library/ssl_srv.c * library/ssl_tls.c * * Requires: MBEDTLS_X509_USE_C * * This module is required for X.509 certificate parsing. */ #define MBEDTLS_X509_CRT_PARSE_C /** * \def MBEDTLS_X509_CRL_PARSE_C * * Enable X.509 CRL parsing. * * Module: library/x509_crl.c * Caller: library/x509_crt.c * * Requires: MBEDTLS_X509_USE_C * * This module is required for X.509 CRL parsing. */ #define MBEDTLS_X509_CRL_PARSE_C /** * \def MBEDTLS_X509_CSR_PARSE_C * * Enable X.509 Certificate Signing Request (CSR) parsing. * * Module: library/x509_csr.c * Caller: library/x509_crt_write.c * * Requires: MBEDTLS_X509_USE_C * * This module is used for reading X.509 certificate request. */ #define MBEDTLS_X509_CSR_PARSE_C /** * \def MBEDTLS_X509_CREATE_C * * Enable X.509 core for creating certificates. * * Module: library/x509_create.c * * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, MBEDTLS_PK_WRITE_C * * This module is the basis for creating X.509 certificates and CSRs. */ #define MBEDTLS_X509_CREATE_C /** * \def MBEDTLS_X509_CRT_WRITE_C * * Enable creating X.509 certificates. * * Module: library/x509_crt_write.c * * Requires: MBEDTLS_X509_CREATE_C * * This module is required for X.509 certificate creation. */ #define MBEDTLS_X509_CRT_WRITE_C /** * \def MBEDTLS_X509_CSR_WRITE_C * * Enable creating X.509 Certificate Signing Requests (CSR). * * Module: library/x509_csr_write.c * * Requires: MBEDTLS_X509_CREATE_C * * This module is required for X.509 certificate request writing. */ #define MBEDTLS_X509_CSR_WRITE_C /** * \def MBEDTLS_XTEA_C * * Enable the XTEA block cipher. * * Module: library/xtea.c * Caller: */ #define MBEDTLS_XTEA_C /* \} name SECTION: mbed TLS modules */ /** * \name SECTION: Module configuration options * * This section allows for the setting of module specific sizes and * configuration options. The default values are already present in the * relevant header files and should suffice for the regular use cases. * * Our advice is to enable options and change their values here * only if you have a good reason and know the consequences. * * Please check the respective header file for documentation on these * parameters (to prevent duplicate documentation). * \{ */ /* MPI / BIGNUM options */ //#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ //#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ /* CTR_DRBG options */ //#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ //#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ //#define MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ //#define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ //#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ //#define MBEDTLS_CTR_DRBG_USE_128_BIT_KEY /**< Use 128-bit key for CTR_DRBG - may reduce security (see ctr_drbg.h) */ /* HMAC_DRBG options */ //#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ //#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ //#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ //#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ /* ECP options */ //#define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups */ //#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< Maximum window size used */ //#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ /* Entropy options */ //#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ //#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ //#define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Default minimum number of bytes required for the hardware entropy source mbedtls_hardware_poll() before entropy is released */ /* Memory buffer allocator options */ //#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ /* Platform options */ //#define MBEDTLS_PLATFORM_STD_MEM_HDR /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't define if no header is needed. */ //#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_EXIT exit /**< Default exit to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_TIME time /**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use, can be undefined */ /* Note: your snprintf must correclty zero-terminate the buffer! */ //#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS 0 /**< Default exit value to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE 1 /**< Default exit value to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_NV_SEED_READ mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ //#define MBEDTLS_PLATFORM_STD_NV_SEED_FILE "seedfile" /**< Seed file to read/write with default implementation */ /* To Use Function Macros MBEDTLS_PLATFORM_C must be enabled */ /* MBEDTLS_PLATFORM_XXX_MACRO and MBEDTLS_PLATFORM_XXX_ALT cannot both be defined */ //#define MBEDTLS_PLATFORM_CALLOC_MACRO calloc /**< Default allocator macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_FREE_MACRO free /**< Default free macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_EXIT_MACRO exit /**< Default exit macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_TIME_MACRO time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_TIME_TYPE_MACRO time_t /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */ //#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ /* Note: your snprintf must correclty zero-terminate the buffer! */ //#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf /**< Default snprintf macro to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */ //#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */ /** * \brief This macro is invoked by the library when an invalid parameter * is detected that is only checked with MBEDTLS_CHECK_PARAMS * (see the documentation of that option for context). * * When you leave this undefined here, a default definition is * provided that invokes the function mbedtls_param_failed(), * which is declared in platform_util.h for the benefit of the * library, but that you need to define in your application. * * When you define this here, this replaces the default * definition in platform_util.h (which no longer declares the * function mbedtls_param_failed()) and it is your responsibility * to make sure this macro expands to something suitable (in * particular, that all the necessary declarations are visible * from within the library - you can ensure that by providing * them in this file next to the macro definition). * * Note that you may define this macro to expand to nothing, in * which case you don't have to worry about declarations or * definitions. However, you will then be notified about invalid * parameters only in non-void functions, and void function will * just silently return early on invalid parameters, which * partially negates the benefits of enabling * #MBEDTLS_CHECK_PARAMS in the first place, so is discouraged. * * \param cond The expression that should evaluate to true, but doesn't. */ //#define MBEDTLS_PARAM_FAILED( cond ) assert( cond ) /* SSL Cache options */ //#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */ //#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */ /* SSL options */ /** \def MBEDTLS_SSL_MAX_CONTENT_LEN * * Maximum length (in bytes) of incoming and outgoing plaintext fragments. * * This determines the size of both the incoming and outgoing TLS I/O buffers * in such a way that both are capable of holding the specified amount of * plaintext data, regardless of the protection mechanism used. * * To configure incoming and outgoing I/O buffers separately, use * #MBEDTLS_SSL_IN_CONTENT_LEN and #MBEDTLS_SSL_OUT_CONTENT_LEN, * which overwrite the value set by this option. * * \note When using a value less than the default of 16KB on the client, it is * recommended to use the Maximum Fragment Length (MFL) extension to * inform the server about this limitation. On the server, there * is no supported, standardized way of informing the client about * restriction on the maximum size of incoming messages, and unless * the limitation has been communicated by other means, it is recommended * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN * while keeping the default value of 16KB for the incoming buffer. * * Uncomment to set the maximum plaintext size of both * incoming and outgoing I/O buffers. */ //#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /** \def MBEDTLS_SSL_IN_CONTENT_LEN * * Maximum length (in bytes) of incoming plaintext fragments. * * This determines the size of the incoming TLS I/O buffer in such a way * that it is capable of holding the specified amount of plaintext data, * regardless of the protection mechanism used. * * If this option is undefined, it inherits its value from * #MBEDTLS_SSL_MAX_CONTENT_LEN. * * \note When using a value less than the default of 16KB on the client, it is * recommended to use the Maximum Fragment Length (MFL) extension to * inform the server about this limitation. On the server, there * is no supported, standardized way of informing the client about * restriction on the maximum size of incoming messages, and unless * the limitation has been communicated by other means, it is recommended * to only change the outgoing buffer size #MBEDTLS_SSL_OUT_CONTENT_LEN * while keeping the default value of 16KB for the incoming buffer. * * Uncomment to set the maximum plaintext size of the incoming I/O buffer * independently of the outgoing I/O buffer. */ //#define MBEDTLS_SSL_IN_CONTENT_LEN 16384 /** \def MBEDTLS_SSL_OUT_CONTENT_LEN * * Maximum length (in bytes) of outgoing plaintext fragments. * * This determines the size of the outgoing TLS I/O buffer in such a way * that it is capable of holding the specified amount of plaintext data, * regardless of the protection mechanism used. * * If this option undefined, it inherits its value from * #MBEDTLS_SSL_MAX_CONTENT_LEN. * * It is possible to save RAM by setting a smaller outward buffer, while keeping * the default inward 16384 byte buffer to conform to the TLS specification. * * The minimum required outward buffer size is determined by the handshake * protocol's usage. Handshaking will fail if the outward buffer is too small. * The specific size requirement depends on the configured ciphers and any * certificate data which is sent during the handshake. * * Uncomment to set the maximum plaintext size of the outgoing I/O buffer * independently of the incoming I/O buffer. */ //#define MBEDTLS_SSL_OUT_CONTENT_LEN 16384 /** \def MBEDTLS_SSL_DTLS_MAX_BUFFERING * * Maximum number of heap-allocated bytes for the purpose of * DTLS handshake message reassembly and future message buffering. * * This should be at least 9/8 * MBEDTLSSL_IN_CONTENT_LEN * to account for a reassembled handshake message of maximum size, * together with its reassembly bitmap. * * A value of 2 * MBEDTLS_SSL_IN_CONTENT_LEN (32768 by default) * should be sufficient for all practical situations as it allows * to reassembly a large handshake message (such as a certificate) * while buffering multiple smaller handshake messages. * */ //#define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 //#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ //#define MBEDTLS_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */ //#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ /** * Complete list of ciphersuites to use, in order of preference. * * \warning No dependency checking is done on that field! This option can only * be used to restrict the set of available ciphersuites. It is your * responsibility to make sure the needed modules are active. * * Use this to save a few hundred bytes of ROM (default ordering of all * available ciphersuites) and a few to a few hundred bytes of RAM. * * The value below is only an example, not the default. */ //#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 /* X509 options */ //#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 /**< Maximum number of intermediate CAs in a verification chain. */ //#define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 /**< Maximum length of a path/filename string in bytes including the null terminator character ('\0'). */ /** * Allow SHA-1 in the default TLS configuration for certificate signing. * Without this build-time option, SHA-1 support must be activated explicitly * through mbedtls_ssl_conf_cert_profile. Turning on this option is not * recommended because of it is possible to generate SHA-1 collisions, however * this may be safe for legacy infrastructure where additional controls apply. * * \warning SHA-1 is considered a weak message digest and its use constitutes * a security risk. If possible, we recommend avoiding dependencies * on it, and considering stronger message digests instead. * */ // #define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES /** * Allow SHA-1 in the default TLS configuration for TLS 1.2 handshake * signature and ciphersuite selection. Without this build-time option, SHA-1 * support must be activated explicitly through mbedtls_ssl_conf_sig_hashes. * The use of SHA-1 in TLS <= 1.1 and in HMAC-SHA-1 is always allowed by * default. At the time of writing, there is no practical attack on the use * of SHA-1 in handshake signatures, hence this option is turned on by default * to preserve compatibility with existing peers, but the general * warning applies nonetheless: * * \warning SHA-1 is considered a weak message digest and its use constitutes * a security risk. If possible, we recommend avoiding dependencies * on it, and considering stronger message digests instead. * */ #define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE /** * Uncomment the macro to let mbed TLS use your alternate implementation of * mbedtls_platform_zeroize(). This replaces the default implementation in * platform_util.c. * * mbedtls_platform_zeroize() is a widely used function across the library to * zero a block of memory. The implementation is expected to be secure in the * sense that it has been written to prevent the compiler from removing calls * to mbedtls_platform_zeroize() as part of redundant code elimination * optimizations. However, it is difficult to guarantee that calls to * mbedtls_platform_zeroize() will not be optimized by the compiler as older * versions of the C language standards do not provide a secure implementation * of memset(). Therefore, MBEDTLS_PLATFORM_ZEROIZE_ALT enables users to * configure their own implementation of mbedtls_platform_zeroize(), for * example by using directives specific to their compiler, features from newer * C standards (e.g using memset_s() in C11) or calling a secure memset() from * their system (e.g explicit_bzero() in BSD). */ //#define MBEDTLS_PLATFORM_ZEROIZE_ALT /** * Uncomment the macro to let Mbed TLS use your alternate implementation of * mbedtls_platform_gmtime_r(). This replaces the default implementation in * platform_util.c. * * gmtime() is not a thread-safe function as defined in the C standard. The * library will try to use safer implementations of this function, such as * gmtime_r() when available. However, if Mbed TLS cannot identify the target * system, the implementation of mbedtls_platform_gmtime_r() will default to * using the standard gmtime(). In this case, calls from the library to * gmtime() will be guarded by the global mutex mbedtls_threading_gmtime_mutex * if MBEDTLS_THREADING_C is enabled. We recommend that calls from outside the * library are also guarded with this mutex to avoid race conditions. However, * if the macro MBEDTLS_PLATFORM_GMTIME_R_ALT is defined, Mbed TLS will * unconditionally use the implementation for mbedtls_platform_gmtime_r() * supplied at compile time. */ //#define MBEDTLS_PLATFORM_GMTIME_R_ALT /* \} name SECTION: Customisation configuration options */ /* Target and application specific configurations * * Allow user to override any previous default. * */ #if defined(MBEDTLS_USER_CONFIG_FILE) #include MBEDTLS_USER_CONFIG_FILE #endif #include "check_config.h" #endif /* MBEDTLS_CONFIG_H */ fldigi-4.2.05/src/include/mbedtls/ecp.h0000664000175000017500000014310214611711171014550 00000000000000/** * \file ecp.h * * \brief This file provides an API for Elliptic Curves over GF(P) (ECP). * * The use of ECP in cryptography and TLS is defined in * Standards for Efficient Cryptography Group (SECG): SEC1 * Elliptic Curve Cryptography and * RFC-4492: Elliptic Curve Cryptography (ECC) Cipher Suites * for Transport Layer Security (TLS). * * RFC-2409: The Internet Key Exchange (IKE) defines ECP * group types. * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ECP_H #define MBEDTLS_ECP_H #include "bignum.h" /* * ECP error codes */ #define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 /**< The buffer is too small to write to. */ #define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 /**< The requested feature is not available, for example, the requested curve is not supported. */ #define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00 /**< The signature is not valid. */ #define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80 /**< Memory allocation failed. */ #define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00 /**< Generation of random value, such as ephemeral key, failed. */ #define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80 /**< Invalid private or public key. */ #define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 /**< The buffer contains a valid signature followed by more data. */ /* MBEDTLS_ERR_ECP_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80 /**< The ECP hardware accelerator failed. */ #define MBEDTLS_ERR_ECP_IN_PROGRESS -0x4B00 /**< Operation in progress, call again with the same parameters to continue. */ #ifdef __cplusplus extern "C" { #endif /** * Domain-parameter identifiers: curve, subgroup, and generator. * * \note Only curves over prime fields are supported. * * \warning This library does not support validation of arbitrary domain * parameters. Therefore, only standardized domain parameters from trusted * sources should be used. See mbedtls_ecp_group_load(). */ typedef enum { MBEDTLS_ECP_DP_NONE = 0, /*!< Curve not defined. */ MBEDTLS_ECP_DP_SECP192R1, /*!< Domain parameters for the 192-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_SECP224R1, /*!< Domain parameters for the 224-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_SECP256R1, /*!< Domain parameters for the 256-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_SECP384R1, /*!< Domain parameters for the 384-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_SECP521R1, /*!< Domain parameters for the 521-bit curve defined by FIPS 186-4 and SEC1. */ MBEDTLS_ECP_DP_BP256R1, /*!< Domain parameters for 256-bit Brainpool curve. */ MBEDTLS_ECP_DP_BP384R1, /*!< Domain parameters for 384-bit Brainpool curve. */ MBEDTLS_ECP_DP_BP512R1, /*!< Domain parameters for 512-bit Brainpool curve. */ MBEDTLS_ECP_DP_CURVE25519, /*!< Domain parameters for Curve25519. */ MBEDTLS_ECP_DP_SECP192K1, /*!< Domain parameters for 192-bit "Koblitz" curve. */ MBEDTLS_ECP_DP_SECP224K1, /*!< Domain parameters for 224-bit "Koblitz" curve. */ MBEDTLS_ECP_DP_SECP256K1, /*!< Domain parameters for 256-bit "Koblitz" curve. */ MBEDTLS_ECP_DP_CURVE448, /*!< Domain parameters for Curve448. */ } mbedtls_ecp_group_id; /** * The number of supported curves, plus one for #MBEDTLS_ECP_DP_NONE. * * \note Montgomery curves are currently excluded. */ #define MBEDTLS_ECP_DP_MAX 12 /** * Curve information, for use by other modules. */ typedef struct mbedtls_ecp_curve_info { mbedtls_ecp_group_id grp_id; /*!< An internal identifier. */ uint16_t tls_id; /*!< The TLS NamedCurve identifier. */ uint16_t bit_size; /*!< The curve size in bits. */ const char *name; /*!< A human-friendly name. */ } mbedtls_ecp_curve_info; /** * \brief The ECP point structure, in Jacobian coordinates. * * \note All functions expect and return points satisfying * the following condition: Z == 0 or * Z == 1. Other values of \p Z are * used only by internal functions. * The point is zero, or "at infinity", if Z == 0. * Otherwise, \p X and \p Y are its standard (affine) * coordinates. */ typedef struct mbedtls_ecp_point { mbedtls_mpi X; /*!< The X coordinate of the ECP point. */ mbedtls_mpi Y; /*!< The Y coordinate of the ECP point. */ mbedtls_mpi Z; /*!< The Z coordinate of the ECP point. */ } mbedtls_ecp_point; #if !defined(MBEDTLS_ECP_ALT) /* * default mbed TLS elliptic curve arithmetic implementation * * (in case MBEDTLS_ECP_ALT is defined then the developer has to provide an * alternative implementation for the whole module and it will replace this * one.) */ /** * \brief The ECP group structure. * * We consider two types of curve equations: *
  • Short Weierstrass: y^2 = x^3 + A x + B mod P * (SEC1 + RFC-4492)
  • *
  • Montgomery: y^2 = x^3 + A x^2 + x mod P (Curve25519, * Curve448)
* In both cases, the generator (\p G) for a prime-order subgroup is fixed. * * For Short Weierstrass, this subgroup is the whole curve, and its * cardinality is denoted by \p N. Our code requires that \p N is an * odd prime as mbedtls_ecp_mul() requires an odd number, and * mbedtls_ecdsa_sign() requires that it is prime for blinding purposes. * * For Montgomery curves, we do not store \p A, but (A + 2) / 4, * which is the quantity used in the formulas. Additionally, \p nbits is * not the size of \p N but the required size for private keys. * * If \p modp is NULL, reduction modulo \p P is done using a generic algorithm. * Otherwise, \p modp must point to a function that takes an \p mbedtls_mpi in the * range of 0..2^(2*pbits)-1, and transforms it in-place to an integer * which is congruent mod \p P to the given MPI, and is close enough to \p pbits * in size, so that it may be efficiently brought in the 0..P-1 range by a few * additions or subtractions. Therefore, it is only an approximative modular * reduction. It must return 0 on success and non-zero on failure. * * \note Alternative implementations must keep the group IDs distinct. If * two group structures have the same ID, then they must be * identical. * */ typedef struct mbedtls_ecp_group { mbedtls_ecp_group_id id; /*!< An internal group identifier. */ mbedtls_mpi P; /*!< The prime modulus of the base field. */ mbedtls_mpi A; /*!< For Short Weierstrass: \p A in the equation. For Montgomery curves: (A + 2) / 4. */ mbedtls_mpi B; /*!< For Short Weierstrass: \p B in the equation. For Montgomery curves: unused. */ mbedtls_ecp_point G; /*!< The generator of the subgroup used. */ mbedtls_mpi N; /*!< The order of \p G. */ size_t pbits; /*!< The number of bits in \p P.*/ size_t nbits; /*!< For Short Weierstrass: The number of bits in \p P. For Montgomery curves: the number of bits in the private keys. */ unsigned int h; /*!< \internal 1 if the constants are static. */ int (*modp)(mbedtls_mpi *); /*!< The function for fast pseudo-reduction mod \p P (see above).*/ int (*t_pre)(mbedtls_ecp_point *, void *); /*!< Unused. */ int (*t_post)(mbedtls_ecp_point *, void *); /*!< Unused. */ void *t_data; /*!< Unused. */ mbedtls_ecp_point *T; /*!< Pre-computed points for ecp_mul_comb(). */ size_t T_size; /*!< The number of pre-computed points. */ } mbedtls_ecp_group; #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Internal restart context for multiplication * * \note Opaque struct */ typedef struct mbedtls_ecp_restart_mul mbedtls_ecp_restart_mul_ctx; /** * \brief Internal restart context for ecp_muladd() * * \note Opaque struct */ typedef struct mbedtls_ecp_restart_muladd mbedtls_ecp_restart_muladd_ctx; /** * \brief General context for resuming ECC operations */ typedef struct { unsigned ops_done; /*!< current ops count */ unsigned depth; /*!< call depth (0 = top-level) */ mbedtls_ecp_restart_mul_ctx *rsm; /*!< ecp_mul_comb() sub-context */ mbedtls_ecp_restart_muladd_ctx *ma; /*!< ecp_muladd() sub-context */ } mbedtls_ecp_restart_ctx; /* * Operation counts for restartable functions */ #define MBEDTLS_ECP_OPS_CHK 3 /*!< basic ops count for ecp_check_pubkey() */ #define MBEDTLS_ECP_OPS_DBL 8 /*!< basic ops count for ecp_double_jac() */ #define MBEDTLS_ECP_OPS_ADD 11 /*!< basic ops count for see ecp_add_mixed() */ #define MBEDTLS_ECP_OPS_INV 120 /*!< empirical equivalent for mpi_mod_inv() */ /** * \brief Internal; for restartable functions in other modules. * Check and update basic ops budget. * * \param grp Group structure * \param rs_ctx Restart context * \param ops Number of basic ops to do * * \return \c 0 if doing \p ops basic ops is still allowed, * \return #MBEDTLS_ERR_ECP_IN_PROGRESS otherwise. */ int mbedtls_ecp_check_budget( const mbedtls_ecp_group *grp, mbedtls_ecp_restart_ctx *rs_ctx, unsigned ops ); /* Utility macro for checking and updating ops budget */ #define MBEDTLS_ECP_BUDGET( ops ) \ MBEDTLS_MPI_CHK( mbedtls_ecp_check_budget( grp, rs_ctx, \ (unsigned) (ops) ) ); #else /* MBEDTLS_ECP_RESTARTABLE */ #define MBEDTLS_ECP_BUDGET( ops ) /* no-op; for compatibility */ /* We want to declare restartable versions of existing functions anyway */ typedef void mbedtls_ecp_restart_ctx; #endif /* MBEDTLS_ECP_RESTARTABLE */ /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h, or define them using the compiler command line. * \{ */ #if !defined(MBEDTLS_ECP_MAX_BITS) /** * The maximum size of the groups, that is, of \c N and \c P. */ #define MBEDTLS_ECP_MAX_BITS 521 /**< The maximum size of groups, in bits. */ #endif #define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 ) #define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 ) #if !defined(MBEDTLS_ECP_WINDOW_SIZE) /* * Maximum "window" size used for point multiplication. * Default: 6. * Minimum value: 2. Maximum value: 7. * * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) * points used for point multiplication. This value is directly tied to EC * peak memory usage, so decreasing it by one should roughly cut memory usage * by two (if large curves are in use). * * Reduction in size may reduce speed, but larger curves are impacted first. * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1): * w-size: 6 5 4 3 2 * 521 145 141 135 120 97 * 384 214 209 198 177 146 * 256 320 320 303 262 226 * 224 475 475 453 398 342 * 192 640 640 633 587 476 */ #define MBEDTLS_ECP_WINDOW_SIZE 6 /**< The maximum window size used. */ #endif /* MBEDTLS_ECP_WINDOW_SIZE */ #if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM) /* * Trade memory for speed on fixed-point multiplication. * * This speeds up repeated multiplication of the generator (that is, the * multiplication in ECDSA signatures, and half of the multiplications in * ECDSA verification and ECDHE) by a factor roughly 3 to 4. * * The cost is increasing EC peak memory usage by a factor roughly 2. * * Change this value to 0 to reduce peak memory usage. */ #define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up. */ #endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */ /* \} name SECTION: Module settings */ #else /* MBEDTLS_ECP_ALT */ #include "ecp_alt.h" #endif /* MBEDTLS_ECP_ALT */ /** * \brief The ECP key-pair structure. * * A generic key-pair that may be used for ECDSA and fixed ECDH, for example. * * \note Members are deliberately in the same order as in the * ::mbedtls_ecdsa_context structure. */ typedef struct mbedtls_ecp_keypair { mbedtls_ecp_group grp; /*!< Elliptic curve and base point */ mbedtls_mpi d; /*!< our secret value */ mbedtls_ecp_point Q; /*!< our public value */ } mbedtls_ecp_keypair; /* * Point formats, from RFC 4492's enum ECPointFormat */ #define MBEDTLS_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format. */ #define MBEDTLS_ECP_PF_COMPRESSED 1 /**< Compressed point format. */ /* * Some other constants from RFC 4492 */ #define MBEDTLS_ECP_TLS_NAMED_CURVE 3 /**< The named_curve of ECCurveType. */ #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Set the maximum number of basic operations done in a row. * * If more operations are needed to complete a computation, * #MBEDTLS_ERR_ECP_IN_PROGRESS will be returned by the * function performing the computation. It is then the * caller's responsibility to either call again with the same * parameters until it returns 0 or an error code; or to free * the restart context if the operation is to be aborted. * * It is strictly required that all input parameters and the * restart context be the same on successive calls for the * same operation, but output parameters need not be the * same; they must not be used until the function finally * returns 0. * * This only applies to functions whose documentation * mentions they may return #MBEDTLS_ERR_ECP_IN_PROGRESS (or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS for functions in the * SSL module). For functions that accept a "restart context" * argument, passing NULL disables restart and makes the * function equivalent to the function with the same name * with \c _restartable removed. For functions in the ECDH * module, restart is disabled unless the function accepts * an "ECDH context" argument and * mbedtls_ecdh_enable_restart() was previously called on * that context. For function in the SSL module, restart is * only enabled for specific sides and key exchanges * (currently only for clients and ECDHE-ECDSA). * * \param max_ops Maximum number of basic operations done in a row. * Default: 0 (unlimited). * Lower (non-zero) values mean ECC functions will block for * a lesser maximum amount of time. * * \note A "basic operation" is defined as a rough equivalent of a * multiplication in GF(p) for the NIST P-256 curve. * As an indication, with default settings, a scalar * multiplication (full run of \c mbedtls_ecp_mul()) is: * - about 3300 basic operations for P-256 * - about 9400 basic operations for P-384 * * \note Very low values are not always respected: sometimes * functions need to block for a minimum number of * operations, and will do so even if max_ops is set to a * lower value. That minimum depends on the curve size, and * can be made lower by decreasing the value of * \c MBEDTLS_ECP_WINDOW_SIZE. As an indication, here is the * lowest effective value for various curves and values of * that parameter (w for short): * w=6 w=5 w=4 w=3 w=2 * P-256 208 208 160 136 124 * P-384 682 416 320 272 248 * P-521 1364 832 640 544 496 * * \note This setting is currently ignored by Curve25519. */ void mbedtls_ecp_set_max_ops( unsigned max_ops ); /** * \brief Check if restart is enabled (max_ops != 0) * * \return \c 0 if \c max_ops == 0 (restart disabled) * \return \c 1 otherwise (restart enabled) */ int mbedtls_ecp_restart_is_enabled( void ); #endif /* MBEDTLS_ECP_RESTARTABLE */ /** * \brief This function retrieves the information defined in * mbedtls_ecp_curve_info() for all supported curves in order * of preference. * * \return A statically allocated array. The last entry is 0. */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void ); /** * \brief This function retrieves the list of internal group * identifiers of all supported curves in the order of * preference. * * \return A statically allocated array, * terminated with MBEDTLS_ECP_DP_NONE. */ const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void ); /** * \brief This function retrieves curve information from an internal * group identifier. * * \param grp_id An \c MBEDTLS_ECP_DP_XXX value. * * \return The associated curve information on success. * \return NULL on failure. */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id ); /** * \brief This function retrieves curve information from a TLS * NamedCurve value. * * \param tls_id An \c MBEDTLS_ECP_DP_XXX value. * * \return The associated curve information on success. * \return NULL on failure. */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id ); /** * \brief This function retrieves curve information from a * human-readable name. * * \param name The human-readable name. * * \return The associated curve information on success. * \return NULL on failure. */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name ); /** * \brief This function initializes a point as zero. * * \param pt The point to initialize. */ void mbedtls_ecp_point_init( mbedtls_ecp_point *pt ); /** * \brief This function initializes an ECP group context * without loading any domain parameters. * * \note After this function is called, domain parameters * for various ECP groups can be loaded through the * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group() * functions. */ void mbedtls_ecp_group_init( mbedtls_ecp_group *grp ); /** * \brief This function initializes a key pair as an invalid one. * * \param key The key pair to initialize. */ void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key ); /** * \brief This function frees the components of a point. * * \param pt The point to free. */ void mbedtls_ecp_point_free( mbedtls_ecp_point *pt ); /** * \brief This function frees the components of an ECP group. * * \param grp The group to free. This may be \c NULL, in which * case this function returns immediately. If it is not * \c NULL, it must point to an initialized ECP group. */ void mbedtls_ecp_group_free( mbedtls_ecp_group *grp ); /** * \brief This function frees the components of a key pair. * * \param key The key pair to free. This may be \c NULL, in which * case this function returns immediately. If it is not * \c NULL, it must point to an initialized ECP key pair. */ void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key ); #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Initialize a restart context. * * \param ctx The restart context to initialize. This must * not be \c NULL. */ void mbedtls_ecp_restart_init( mbedtls_ecp_restart_ctx *ctx ); /** * \brief Free the components of a restart context. * * \param ctx The restart context to free. This may be \c NULL, in which * case this function returns immediately. If it is not * \c NULL, it must point to an initialized restart context. */ void mbedtls_ecp_restart_free( mbedtls_ecp_restart_ctx *ctx ); #endif /* MBEDTLS_ECP_RESTARTABLE */ /** * \brief This function copies the contents of point \p Q into * point \p P. * * \param P The destination point. This must be initialized. * \param Q The source point. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code for other kinds of failure. */ int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ); /** * \brief This function copies the contents of group \p src into * group \p dst. * * \param dst The destination group. This must be initialized. * \param src The source group. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src ); /** * \brief This function sets a point to the point at infinity. * * \param pt The point to set. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt ); /** * \brief This function checks if a point is the point at infinity. * * \param pt The point to test. This must be initialized. * * \return \c 1 if the point is zero. * \return \c 0 if the point is non-zero. * \return A negative error code on failure. */ int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt ); /** * \brief This function compares two points. * * \note This assumes that the points are normalized. Otherwise, * they may compare as "not equal" even if they are. * * \param P The first point to compare. This must be initialized. * \param Q The second point to compare. This must be initialized. * * \return \c 0 if the points are equal. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the points are not equal. */ int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ); /** * \brief This function imports a non-zero point from two ASCII * strings. * * \param P The destination point. This must be initialized. * \param radix The numeric base of the input. * \param x The first affine coordinate, as a null-terminated string. * \param y The second affine coordinate, as a null-terminated string. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_MPI_XXX error code on failure. */ int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix, const char *x, const char *y ); /** * \brief This function exports a point into unsigned binary data. * * \param grp The group to which the point should belong. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param P The point to export. This must be initialized. * \param format The point format. This must be either * #MBEDTLS_ECP_PF_COMPRESSED or #MBEDTLS_ECP_PF_UNCOMPRESSED. * \param olen The address at which to store the length of * the output in Bytes. This must not be \c NULL. * \param buf The output buffer. This must be a writable buffer * of length \p buflen Bytes. * \param buflen The length of the output buffer \p buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the output buffer * is too small to hold the point. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P, int format, size_t *olen, unsigned char *buf, size_t buflen ); /** * \brief This function imports a point from unsigned binary data. * * \note This function does not check that the point actually * belongs to the given group, see mbedtls_ecp_check_pubkey() * for that. * * \param grp The group to which the point should belong. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param P The destination context to import the point to. * This must be initialized. * \param buf The input buffer. This must be a readable buffer * of length \p ilen Bytes. * \param ilen The length of the input buffer \p buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the input is invalid. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format * is not implemented. */ int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, const unsigned char *buf, size_t ilen ); /** * \brief This function imports a point from a TLS ECPoint record. * * \note On function return, \p *buf is updated to point immediately * after the ECPoint record. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param pt The destination point. * \param buf The address of the pointer to the start of the input buffer. * \param len The length of the buffer. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization * failure. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. */ int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, const unsigned char **buf, size_t len ); /** * \brief This function exports a point as a TLS ECPoint record * defined in RFC 4492, Section 5.4. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param pt The point to be exported. This must be initialized. * \param format The point format to use. This must be either * #MBEDTLS_ECP_PF_COMPRESSED or #MBEDTLS_ECP_PF_UNCOMPRESSED. * \param olen The address at which to store the length in Bytes * of the data written. * \param buf The target buffer. This must be a writable buffer of * length \p blen Bytes. * \param blen The length of the target buffer \p buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the input is invalid. * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the target buffer * is too small to hold the exported point. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt, int format, size_t *olen, unsigned char *buf, size_t blen ); /** * \brief This function sets up an ECP group context * from a standardized set of domain parameters. * * \note The index should be a value of the NamedCurve enum, * as defined in RFC-4492: Elliptic Curve Cryptography * (ECC) Cipher Suites for Transport Layer Security (TLS), * usually in the form of an \c MBEDTLS_ECP_DP_XXX macro. * * \param grp The group context to setup. This must be initialized. * \param id The identifier of the domain parameter set to load. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if \p id doesn't * correspond to a known group. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id ); /** * \brief This function sets up an ECP group context from a TLS * ECParameters record as defined in RFC 4492, Section 5.4. * * \note The read pointer \p buf is updated to point right after * the ECParameters record on exit. * * \param grp The group context to setup. This must be initialized. * \param buf The address of the pointer to the start of the input buffer. * \param len The length of the input buffer \c *buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the group is not * recognized. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len ); /** * \brief This function extracts an elliptic curve group ID from a * TLS ECParameters record as defined in RFC 4492, Section 5.4. * * \note The read pointer \p buf is updated to point right after * the ECParameters record on exit. * * \param grp The address at which to store the group id. * This must not be \c NULL. * \param buf The address of the pointer to the start of the input buffer. * \param len The length of the input buffer \c *buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid. * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the group is not * recognized. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_tls_read_group_id( mbedtls_ecp_group_id *grp, const unsigned char **buf, size_t len ); /** * \brief This function exports an elliptic curve as a TLS * ECParameters record as defined in RFC 4492, Section 5.4. * * \param grp The ECP group to be exported. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param olen The address at which to store the number of Bytes written. * This must not be \c NULL. * \param buf The buffer to write to. This must be a writable buffer * of length \p blen Bytes. * \param blen The length of the output buffer \p buf in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the output * buffer is too small to hold the exported group. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen, unsigned char *buf, size_t blen ); /** * \brief This function performs a scalar multiplication of a point * by an integer: \p R = \p m * \p P. * * It is not thread-safe to use same group in multiple threads. * * \note To prevent timing attacks, this function * executes the exact same sequence of base-field * operations for any valid \p m. It avoids any if-branch or * array index depending on the value of \p m. * * \note If \p f_rng is not NULL, it is used to randomize * intermediate results to prevent potential timing attacks * targeting these results. We recommend always providing * a non-NULL \p f_rng. The overhead is negligible. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param R The point in which to store the result of the calculation. * This must be initialized. * \param m The integer by which to multiply. This must be initialized. * \param P The point to multiply. This must be initialized. * \param f_rng The RNG function. This may be \c NULL if randomization * of intermediate results isn't desired (discouraged). * \param p_rng The RNG context to be passed to \p p_rng. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private * key, or \p P is not a valid public key. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function performs multiplication of a point by * an integer: \p R = \p m * \p P in a restartable way. * * \see mbedtls_ecp_mul() * * \note This function does the same as \c mbedtls_ecp_mul(), but * it can return early and restart according to the limit set * with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param R The point in which to store the result of the calculation. * This must be initialized. * \param m The integer by which to multiply. This must be initialized. * \param P The point to multiply. This must be initialized. * \param f_rng The RNG function. This may be \c NULL if randomization * of intermediate results isn't desired (discouraged). * \param p_rng The RNG context to be passed to \p p_rng. * \param rs_ctx The restart context (NULL disables restart). * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private * key, or \p P is not a valid public key. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_mul_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ); /** * \brief This function performs multiplication and addition of two * points by integers: \p R = \p m * \p P + \p n * \p Q * * It is not thread-safe to use same group in multiple threads. * * \note In contrast to mbedtls_ecp_mul(), this function does not * guarantee a constant execution flow and timing. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param R The point in which to store the result of the calculation. * This must be initialized. * \param m The integer by which to multiply \p P. * This must be initialized. * \param P The point to multiply by \p m. This must be initialized. * \param n The integer by which to multiply \p Q. * This must be initialized. * \param Q The point to be multiplied by \p n. * This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not * valid private keys, or \p P or \p Q are not valid public * keys. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, const mbedtls_mpi *n, const mbedtls_ecp_point *Q ); /** * \brief This function performs multiplication and addition of two * points by integers: \p R = \p m * \p P + \p n * \p Q in a * restartable way. * * \see \c mbedtls_ecp_muladd() * * \note This function works the same as \c mbedtls_ecp_muladd(), * but it can return early and restart according to the limit * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param R The point in which to store the result of the calculation. * This must be initialized. * \param m The integer by which to multiply \p P. * This must be initialized. * \param P The point to multiply by \p m. This must be initialized. * \param n The integer by which to multiply \p Q. * This must be initialized. * \param Q The point to be multiplied by \p n. * This must be initialized. * \param rs_ctx The restart context (NULL disables restart). * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not * valid private keys, or \p P or \p Q are not valid public * keys. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_muladd_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, const mbedtls_mpi *n, const mbedtls_ecp_point *Q, mbedtls_ecp_restart_ctx *rs_ctx ); /** * \brief This function checks that a point is a valid public key * on this curve. * * It only checks that the point is non-zero, has * valid coordinates and lies on the curve. It does not verify * that it is indeed a multiple of \p G. This additional * check is computationally more expensive, is not required * by standards, and should not be necessary if the group * used has a small cofactor. In particular, it is useless for * the NIST groups which all have a cofactor of 1. * * \note This function uses bare components rather than an * ::mbedtls_ecp_keypair structure, to ease use with other * structures, such as ::mbedtls_ecdh_context or * ::mbedtls_ecdsa_context. * * \param grp The ECP group the point should belong to. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param pt The point to check. This must be initialized. * * \return \c 0 if the point is a valid public key. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if the point is not * a valid public key for the given curve. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ); /** * \brief This function checks that an \p mbedtls_mpi is a * valid private key for this curve. * * \note This function uses bare components rather than an * ::mbedtls_ecp_keypair structure to ease use with other * structures, such as ::mbedtls_ecdh_context or * ::mbedtls_ecdsa_context. * * \param grp The ECP group the private key should belong to. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param d The integer to check. This must be initialized. * * \return \c 0 if the point is a valid private key. * \return #MBEDTLS_ERR_ECP_INVALID_KEY if the point is not a valid * private key for the given curve. * \return Another negative error code on other kinds of failure. */ int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d ); /** * \brief This function generates a private key. * * \param grp The ECP group to generate a private key for. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param d The destination MPI (secret part). This must be initialized. * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code * on failure. */ int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp, mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function generates a keypair with a configurable base * point. * * \note This function uses bare components rather than an * ::mbedtls_ecp_keypair structure to ease use with other * structures, such as ::mbedtls_ecdh_context or * ::mbedtls_ecdsa_context. * * \param grp The ECP group to generate a key pair for. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param G The base point to use. This must be initialized * and belong to \p grp. It replaces the default base * point \c grp->G used by mbedtls_ecp_gen_keypair(). * \param d The destination MPI (secret part). * This must be initialized. * \param Q The destination point (public part). * This must be initialized. * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code * on failure. */ int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp, const mbedtls_ecp_point *G, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function generates an ECP keypair. * * \note This function uses bare components rather than an * ::mbedtls_ecp_keypair structure to ease use with other * structures, such as ::mbedtls_ecdh_context or * ::mbedtls_ecdsa_context. * * \param grp The ECP group to generate a key pair for. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param d The destination MPI (secret part). * This must be initialized. * \param Q The destination point (public part). * This must be initialized. * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code * on failure. */ int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function generates an ECP key. * * \param grp_id The ECP group identifier. * \param key The destination key. This must be initialized. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may * be \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code * on failure. */ int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function checks that the keypair objects * \p pub and \p prv have the same group and the * same public point, and that the private key in * \p prv is consistent with the public key. * * \param pub The keypair structure holding the public key. This * must be initialized. If it contains a private key, that * part is ignored. * \param prv The keypair structure holding the full keypair. * This must be initialized. * * \return \c 0 on success, meaning that the keys are valid and match. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the keys are invalid or do not match. * \return An \c MBEDTLS_ERR_ECP_XXX or an \c MBEDTLS_ERR_MPI_XXX * error code on calculation failure. */ int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv ); #if defined(MBEDTLS_SELF_TEST) /** * \brief The ECP checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_ecp_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* ecp.h */ fldigi-4.2.05/src/include/mbedtls/aesni.h0000664000175000017500000001102714611711171015100 00000000000000/** * \file aesni.h * * \brief AES-NI for hardware AES acceleration on some Intel processors * * \warning These functions are only for internal use by other library * functions; you must not call them directly. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_AESNI_H #define MBEDTLS_AESNI_H #include "aes.h" #define MBEDTLS_AESNI_AES 0x02000000u #define MBEDTLS_AESNI_CLMUL 0x00000002u #if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && \ ( defined(__amd64__) || defined(__x86_64__) ) && \ ! defined(MBEDTLS_HAVE_X86_64) #define MBEDTLS_HAVE_X86_64 #endif #if defined(MBEDTLS_HAVE_X86_64) #ifdef __cplusplus extern "C" { #endif /** * \brief Internal function to detect the AES-NI feature in CPUs. * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param what The feature to detect * (MBEDTLS_AESNI_AES or MBEDTLS_AESNI_CLMUL) * * \return 1 if CPU has support for the feature, 0 otherwise */ int mbedtls_aesni_has_support( unsigned int what ); /** * \brief Internal AES-NI AES-ECB block encryption and decryption * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param ctx AES context * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT * \param input 16-byte input block * \param output 16-byte output block * * \return 0 on success (cannot fail) */ int mbedtls_aesni_crypt_ecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ); /** * \brief Internal GCM multiplication: c = a * b in GF(2^128) * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param c Result * \param a First operand * \param b Second operand * * \note Both operands and result are bit strings interpreted as * elements of GF(2^128) as per the GCM spec. */ void mbedtls_aesni_gcm_mult( unsigned char c[16], const unsigned char a[16], const unsigned char b[16] ); /** * \brief Internal round key inversion. This function computes * decryption round keys from the encryption round keys. * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param invkey Round keys for the equivalent inverse cipher * \param fwdkey Original round keys (for encryption) * \param nr Number of rounds (that is, number of round keys minus one) */ void mbedtls_aesni_inverse_key( unsigned char *invkey, const unsigned char *fwdkey, int nr ); /** * \brief Internal key expansion for encryption * * \note This function is only for internal use by other library * functions; you must not call it directly. * * \param rk Destination buffer where the round keys are written * \param key Encryption key * \param bits Key size in bits (must be 128, 192 or 256) * * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH */ int mbedtls_aesni_setkey_enc( unsigned char *rk, const unsigned char *key, size_t bits ); #ifdef __cplusplus } #endif #endif /* MBEDTLS_HAVE_X86_64 */ #endif /* MBEDTLS_AESNI_H */ fldigi-4.2.05/src/include/mbedtls/pkcs5.h0000664000175000017500000000670514611711171015035 00000000000000/** * \file pkcs5.h * * \brief PKCS#5 functions * * \author Mathias Olsson */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PKCS5_H #define MBEDTLS_PKCS5_H #include "asn1.h" #include "md.h" #include #include #define MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA -0x2f80 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_PKCS5_INVALID_FORMAT -0x2f00 /**< Unexpected ASN.1 data. */ #define MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE -0x2e80 /**< Requested encryption or digest alg not available. */ #define MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH -0x2e00 /**< Given private key password does not allow for correct decryption. */ #define MBEDTLS_PKCS5_DECRYPT 0 #define MBEDTLS_PKCS5_ENCRYPT 1 #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_ASN1_PARSE_C) /** * \brief PKCS#5 PBES2 function * * \param pbe_params the ASN.1 algorithm parameters * \param mode either MBEDTLS_PKCS5_DECRYPT or MBEDTLS_PKCS5_ENCRYPT * \param pwd password to use when generating key * \param pwdlen length of password * \param data data to process * \param datalen length of data * \param output output buffer * * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. */ int mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode, const unsigned char *pwd, size_t pwdlen, const unsigned char *data, size_t datalen, unsigned char *output ); #endif /* MBEDTLS_ASN1_PARSE_C */ /** * \brief PKCS#5 PBKDF2 using HMAC * * \param ctx Generic HMAC context * \param password Password to use when generating key * \param plen Length of password * \param salt Salt to use when generating key * \param slen Length of salt * \param iteration_count Iteration count * \param key_length Length of generated key in bytes * \param output Generated key. Must be at least as big as key_length * * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. */ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *password, size_t plen, const unsigned char *salt, size_t slen, unsigned int iteration_count, uint32_t key_length, unsigned char *output ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_pkcs5_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* pkcs5.h */ fldigi-4.2.05/src/include/mbedtls/bn_mul.h0000664000175000017500000010654314611711171015265 00000000000000/** * \file bn_mul.h * * \brief Multi-precision integer library */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * Multiply source vector [s] with b, add result * to destination vector [d] and set carry c. * * Currently supports: * * . IA-32 (386+) . AMD64 / EM64T * . IA-32 (SSE2) . Motorola 68000 * . PowerPC, 32-bit . MicroBlaze * . PowerPC, 64-bit . TriCore * . SPARC v8 . ARM v3+ * . Alpha . MIPS32 * . C, longlong . C, generic */ #ifndef MBEDTLS_BN_MUL_H #define MBEDTLS_BN_MUL_H #include "bignum.h" #if defined(MBEDTLS_HAVE_ASM) #ifndef asm #define asm __asm #endif /* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ #if defined(__GNUC__) && \ ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) /* * Disable use of the i386 assembly code below if option -O0, to disable all * compiler optimisations, is passed, detected with __OPTIMIZE__ * This is done as the number of registers used in the assembly code doesn't * work with the -O0 option. */ #if defined(__i386__) && defined(__OPTIMIZE__) #define MULADDC_INIT \ asm( \ "movl %%ebx, %0 \n\t" \ "movl %5, %%esi \n\t" \ "movl %6, %%edi \n\t" \ "movl %7, %%ecx \n\t" \ "movl %8, %%ebx \n\t" #define MULADDC_CORE \ "lodsl \n\t" \ "mull %%ebx \n\t" \ "addl %%ecx, %%eax \n\t" \ "adcl $0, %%edx \n\t" \ "addl (%%edi), %%eax \n\t" \ "adcl $0, %%edx \n\t" \ "movl %%edx, %%ecx \n\t" \ "stosl \n\t" #if defined(MBEDTLS_HAVE_SSE2) #define MULADDC_HUIT \ "movd %%ecx, %%mm1 \n\t" \ "movd %%ebx, %%mm0 \n\t" \ "movd (%%edi), %%mm3 \n\t" \ "paddq %%mm3, %%mm1 \n\t" \ "movd (%%esi), %%mm2 \n\t" \ "pmuludq %%mm0, %%mm2 \n\t" \ "movd 4(%%esi), %%mm4 \n\t" \ "pmuludq %%mm0, %%mm4 \n\t" \ "movd 8(%%esi), %%mm6 \n\t" \ "pmuludq %%mm0, %%mm6 \n\t" \ "movd 12(%%esi), %%mm7 \n\t" \ "pmuludq %%mm0, %%mm7 \n\t" \ "paddq %%mm2, %%mm1 \n\t" \ "movd 4(%%edi), %%mm3 \n\t" \ "paddq %%mm4, %%mm3 \n\t" \ "movd 8(%%edi), %%mm5 \n\t" \ "paddq %%mm6, %%mm5 \n\t" \ "movd 12(%%edi), %%mm4 \n\t" \ "paddq %%mm4, %%mm7 \n\t" \ "movd %%mm1, (%%edi) \n\t" \ "movd 16(%%esi), %%mm2 \n\t" \ "pmuludq %%mm0, %%mm2 \n\t" \ "psrlq $32, %%mm1 \n\t" \ "movd 20(%%esi), %%mm4 \n\t" \ "pmuludq %%mm0, %%mm4 \n\t" \ "paddq %%mm3, %%mm1 \n\t" \ "movd 24(%%esi), %%mm6 \n\t" \ "pmuludq %%mm0, %%mm6 \n\t" \ "movd %%mm1, 4(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "movd 28(%%esi), %%mm3 \n\t" \ "pmuludq %%mm0, %%mm3 \n\t" \ "paddq %%mm5, %%mm1 \n\t" \ "movd 16(%%edi), %%mm5 \n\t" \ "paddq %%mm5, %%mm2 \n\t" \ "movd %%mm1, 8(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm7, %%mm1 \n\t" \ "movd 20(%%edi), %%mm5 \n\t" \ "paddq %%mm5, %%mm4 \n\t" \ "movd %%mm1, 12(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm2, %%mm1 \n\t" \ "movd 24(%%edi), %%mm5 \n\t" \ "paddq %%mm5, %%mm6 \n\t" \ "movd %%mm1, 16(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm4, %%mm1 \n\t" \ "movd 28(%%edi), %%mm5 \n\t" \ "paddq %%mm5, %%mm3 \n\t" \ "movd %%mm1, 20(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm6, %%mm1 \n\t" \ "movd %%mm1, 24(%%edi) \n\t" \ "psrlq $32, %%mm1 \n\t" \ "paddq %%mm3, %%mm1 \n\t" \ "movd %%mm1, 28(%%edi) \n\t" \ "addl $32, %%edi \n\t" \ "addl $32, %%esi \n\t" \ "psrlq $32, %%mm1 \n\t" \ "movd %%mm1, %%ecx \n\t" #define MULADDC_STOP \ "emms \n\t" \ "movl %4, %%ebx \n\t" \ "movl %%ecx, %1 \n\t" \ "movl %%edi, %2 \n\t" \ "movl %%esi, %3 \n\t" \ : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ : "eax", "ebx", "ecx", "edx", "esi", "edi" \ ); #else #define MULADDC_STOP \ "movl %4, %%ebx \n\t" \ "movl %%ecx, %1 \n\t" \ "movl %%edi, %2 \n\t" \ "movl %%esi, %3 \n\t" \ : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ : "eax", "ebx", "ecx", "edx", "esi", "edi" \ ); #endif /* SSE2 */ #endif /* i386 */ #if defined(__amd64__) || defined (__x86_64__) #define MULADDC_INIT \ asm( \ "xorq %%r8, %%r8\n" #define MULADDC_CORE \ "movq (%%rsi), %%rax\n" \ "mulq %%rbx\n" \ "addq $8, %%rsi\n" \ "addq %%rcx, %%rax\n" \ "movq %%r8, %%rcx\n" \ "adcq $0, %%rdx\n" \ "nop \n" \ "addq %%rax, (%%rdi)\n" \ "adcq %%rdx, %%rcx\n" \ "addq $8, %%rdi\n" #define MULADDC_STOP \ : "+c" (c), "+D" (d), "+S" (s) \ : "b" (b) \ : "rax", "rdx", "r8" \ ); #endif /* AMD64 */ #if defined(__mc68020__) || defined(__mcpu32__) #define MULADDC_INIT \ asm( \ "movl %3, %%a2 \n\t" \ "movl %4, %%a3 \n\t" \ "movl %5, %%d3 \n\t" \ "movl %6, %%d2 \n\t" \ "moveq #0, %%d0 \n\t" #define MULADDC_CORE \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "moveq #0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "addxl %%d4, %%d3 \n\t" #define MULADDC_STOP \ "movl %%d3, %0 \n\t" \ "movl %%a3, %1 \n\t" \ "movl %%a2, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "d0", "d1", "d2", "d3", "d4", "a2", "a3" \ ); #define MULADDC_HUIT \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addxl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d3:%%d1 \n\t" \ "addxl %%d4, %%d1 \n\t" \ "addxl %%d0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addxl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d3:%%d1 \n\t" \ "addxl %%d4, %%d1 \n\t" \ "addxl %%d0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addxl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d3:%%d1 \n\t" \ "addxl %%d4, %%d1 \n\t" \ "addxl %%d0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d4:%%d1 \n\t" \ "addxl %%d3, %%d1 \n\t" \ "addxl %%d0, %%d4 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "movel %%a2@+, %%d1 \n\t" \ "mulul %%d2, %%d3:%%d1 \n\t" \ "addxl %%d4, %%d1 \n\t" \ "addxl %%d0, %%d3 \n\t" \ "addl %%d1, %%a3@+ \n\t" \ "addxl %%d0, %%d3 \n\t" #endif /* MC68000 */ #if defined(__powerpc64__) || defined(__ppc64__) #if defined(__MACH__) && defined(__APPLE__) #define MULADDC_INIT \ asm( \ "ld r3, %3 \n\t" \ "ld r4, %4 \n\t" \ "ld r5, %5 \n\t" \ "ld r6, %6 \n\t" \ "addi r3, r3, -8 \n\t" \ "addi r4, r4, -8 \n\t" \ "addic r5, r5, 0 \n\t" #define MULADDC_CORE \ "ldu r7, 8(r3) \n\t" \ "mulld r8, r7, r6 \n\t" \ "mulhdu r9, r7, r6 \n\t" \ "adde r8, r8, r5 \n\t" \ "ld r7, 8(r4) \n\t" \ "addze r5, r9 \n\t" \ "addc r8, r8, r7 \n\t" \ "stdu r8, 8(r4) \n\t" #define MULADDC_STOP \ "addze r5, r5 \n\t" \ "addi r4, r4, 8 \n\t" \ "addi r3, r3, 8 \n\t" \ "std r5, %0 \n\t" \ "std r4, %1 \n\t" \ "std r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ ); #else /* __MACH__ && __APPLE__ */ #define MULADDC_INIT \ asm( \ "ld %%r3, %3 \n\t" \ "ld %%r4, %4 \n\t" \ "ld %%r5, %5 \n\t" \ "ld %%r6, %6 \n\t" \ "addi %%r3, %%r3, -8 \n\t" \ "addi %%r4, %%r4, -8 \n\t" \ "addic %%r5, %%r5, 0 \n\t" #define MULADDC_CORE \ "ldu %%r7, 8(%%r3) \n\t" \ "mulld %%r8, %%r7, %%r6 \n\t" \ "mulhdu %%r9, %%r7, %%r6 \n\t" \ "adde %%r8, %%r8, %%r5 \n\t" \ "ld %%r7, 8(%%r4) \n\t" \ "addze %%r5, %%r9 \n\t" \ "addc %%r8, %%r8, %%r7 \n\t" \ "stdu %%r8, 8(%%r4) \n\t" #define MULADDC_STOP \ "addze %%r5, %%r5 \n\t" \ "addi %%r4, %%r4, 8 \n\t" \ "addi %%r3, %%r3, 8 \n\t" \ "std %%r5, %0 \n\t" \ "std %%r4, %1 \n\t" \ "std %%r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ ); #endif /* __MACH__ && __APPLE__ */ #elif defined(__powerpc__) || defined(__ppc__) /* end PPC64/begin PPC32 */ #if defined(__MACH__) && defined(__APPLE__) #define MULADDC_INIT \ asm( \ "lwz r3, %3 \n\t" \ "lwz r4, %4 \n\t" \ "lwz r5, %5 \n\t" \ "lwz r6, %6 \n\t" \ "addi r3, r3, -4 \n\t" \ "addi r4, r4, -4 \n\t" \ "addic r5, r5, 0 \n\t" #define MULADDC_CORE \ "lwzu r7, 4(r3) \n\t" \ "mullw r8, r7, r6 \n\t" \ "mulhwu r9, r7, r6 \n\t" \ "adde r8, r8, r5 \n\t" \ "lwz r7, 4(r4) \n\t" \ "addze r5, r9 \n\t" \ "addc r8, r8, r7 \n\t" \ "stwu r8, 4(r4) \n\t" #define MULADDC_STOP \ "addze r5, r5 \n\t" \ "addi r4, r4, 4 \n\t" \ "addi r3, r3, 4 \n\t" \ "stw r5, %0 \n\t" \ "stw r4, %1 \n\t" \ "stw r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ ); #else /* __MACH__ && __APPLE__ */ #define MULADDC_INIT \ asm( \ "lwz %%r3, %3 \n\t" \ "lwz %%r4, %4 \n\t" \ "lwz %%r5, %5 \n\t" \ "lwz %%r6, %6 \n\t" \ "addi %%r3, %%r3, -4 \n\t" \ "addi %%r4, %%r4, -4 \n\t" \ "addic %%r5, %%r5, 0 \n\t" #define MULADDC_CORE \ "lwzu %%r7, 4(%%r3) \n\t" \ "mullw %%r8, %%r7, %%r6 \n\t" \ "mulhwu %%r9, %%r7, %%r6 \n\t" \ "adde %%r8, %%r8, %%r5 \n\t" \ "lwz %%r7, 4(%%r4) \n\t" \ "addze %%r5, %%r9 \n\t" \ "addc %%r8, %%r8, %%r7 \n\t" \ "stwu %%r8, 4(%%r4) \n\t" #define MULADDC_STOP \ "addze %%r5, %%r5 \n\t" \ "addi %%r4, %%r4, 4 \n\t" \ "addi %%r3, %%r3, 4 \n\t" \ "stw %%r5, %0 \n\t" \ "stw %%r4, %1 \n\t" \ "stw %%r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ ); #endif /* __MACH__ && __APPLE__ */ #endif /* PPC32 */ /* * The Sparc(64) assembly is reported to be broken. * Disable it for now, until we're able to fix it. */ #if 0 && defined(__sparc__) #if defined(__sparc64__) #define MULADDC_INIT \ asm( \ "ldx %3, %%o0 \n\t" \ "ldx %4, %%o1 \n\t" \ "ld %5, %%o2 \n\t" \ "ld %6, %%o3 \n\t" #define MULADDC_CORE \ "ld [%%o0], %%o4 \n\t" \ "inc 4, %%o0 \n\t" \ "ld [%%o1], %%o5 \n\t" \ "umul %%o3, %%o4, %%o4 \n\t" \ "addcc %%o4, %%o2, %%o4 \n\t" \ "rd %%y, %%g1 \n\t" \ "addx %%g1, 0, %%g1 \n\t" \ "addcc %%o4, %%o5, %%o4 \n\t" \ "st %%o4, [%%o1] \n\t" \ "addx %%g1, 0, %%o2 \n\t" \ "inc 4, %%o1 \n\t" #define MULADDC_STOP \ "st %%o2, %0 \n\t" \ "stx %%o1, %1 \n\t" \ "stx %%o0, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "g1", "o0", "o1", "o2", "o3", "o4", \ "o5" \ ); #else /* __sparc64__ */ #define MULADDC_INIT \ asm( \ "ld %3, %%o0 \n\t" \ "ld %4, %%o1 \n\t" \ "ld %5, %%o2 \n\t" \ "ld %6, %%o3 \n\t" #define MULADDC_CORE \ "ld [%%o0], %%o4 \n\t" \ "inc 4, %%o0 \n\t" \ "ld [%%o1], %%o5 \n\t" \ "umul %%o3, %%o4, %%o4 \n\t" \ "addcc %%o4, %%o2, %%o4 \n\t" \ "rd %%y, %%g1 \n\t" \ "addx %%g1, 0, %%g1 \n\t" \ "addcc %%o4, %%o5, %%o4 \n\t" \ "st %%o4, [%%o1] \n\t" \ "addx %%g1, 0, %%o2 \n\t" \ "inc 4, %%o1 \n\t" #define MULADDC_STOP \ "st %%o2, %0 \n\t" \ "st %%o1, %1 \n\t" \ "st %%o0, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "g1", "o0", "o1", "o2", "o3", "o4", \ "o5" \ ); #endif /* __sparc64__ */ #endif /* __sparc__ */ #if defined(__microblaze__) || defined(microblaze) #define MULADDC_INIT \ asm( \ "lwi r3, %3 \n\t" \ "lwi r4, %4 \n\t" \ "lwi r5, %5 \n\t" \ "lwi r6, %6 \n\t" \ "andi r7, r6, 0xffff \n\t" \ "bsrli r6, r6, 16 \n\t" #define MULADDC_CORE \ "lhui r8, r3, 0 \n\t" \ "addi r3, r3, 2 \n\t" \ "lhui r9, r3, 0 \n\t" \ "addi r3, r3, 2 \n\t" \ "mul r10, r9, r6 \n\t" \ "mul r11, r8, r7 \n\t" \ "mul r12, r9, r7 \n\t" \ "mul r13, r8, r6 \n\t" \ "bsrli r8, r10, 16 \n\t" \ "bsrli r9, r11, 16 \n\t" \ "add r13, r13, r8 \n\t" \ "add r13, r13, r9 \n\t" \ "bslli r10, r10, 16 \n\t" \ "bslli r11, r11, 16 \n\t" \ "add r12, r12, r10 \n\t" \ "addc r13, r13, r0 \n\t" \ "add r12, r12, r11 \n\t" \ "addc r13, r13, r0 \n\t" \ "lwi r10, r4, 0 \n\t" \ "add r12, r12, r10 \n\t" \ "addc r13, r13, r0 \n\t" \ "add r12, r12, r5 \n\t" \ "addc r5, r13, r0 \n\t" \ "swi r12, r4, 0 \n\t" \ "addi r4, r4, 4 \n\t" #define MULADDC_STOP \ "swi r5, %0 \n\t" \ "swi r4, %1 \n\t" \ "swi r3, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r3", "r4", "r5", "r6", "r7", "r8", \ "r9", "r10", "r11", "r12", "r13" \ ); #endif /* MicroBlaze */ #if defined(__tricore__) #define MULADDC_INIT \ asm( \ "ld.a %%a2, %3 \n\t" \ "ld.a %%a3, %4 \n\t" \ "ld.w %%d4, %5 \n\t" \ "ld.w %%d1, %6 \n\t" \ "xor %%d5, %%d5 \n\t" #define MULADDC_CORE \ "ld.w %%d0, [%%a2+] \n\t" \ "madd.u %%e2, %%e4, %%d0, %%d1 \n\t" \ "ld.w %%d0, [%%a3] \n\t" \ "addx %%d2, %%d2, %%d0 \n\t" \ "addc %%d3, %%d3, 0 \n\t" \ "mov %%d4, %%d3 \n\t" \ "st.w [%%a3+], %%d2 \n\t" #define MULADDC_STOP \ "st.w %0, %%d4 \n\t" \ "st.a %1, %%a3 \n\t" \ "st.a %2, %%a2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "d0", "d1", "e2", "d4", "a2", "a3" \ ); #endif /* TriCore */ /* * Note, gcc -O0 by default uses r7 for the frame pointer, so it complains about * our use of r7 below, unless -fomit-frame-pointer is passed. * * On the other hand, -fomit-frame-pointer is implied by any -Ox options with * x !=0, which we can detect using __OPTIMIZE__ (which is also defined by * clang and armcc5 under the same conditions). * * So, only use the optimized assembly below for optimized build, which avoids * the build error and is pretty reasonable anyway. */ #if defined(__GNUC__) && !defined(__OPTIMIZE__) #define MULADDC_CANNOT_USE_R7 #endif #if defined(__arm__) && !defined(MULADDC_CANNOT_USE_R7) #if defined(__thumb__) && !defined(__thumb2__) #define MULADDC_INIT \ asm( \ "ldr r0, %3 \n\t" \ "ldr r1, %4 \n\t" \ "ldr r2, %5 \n\t" \ "ldr r3, %6 \n\t" \ "lsr r7, r3, #16 \n\t" \ "mov r9, r7 \n\t" \ "lsl r7, r3, #16 \n\t" \ "lsr r7, r7, #16 \n\t" \ "mov r8, r7 \n\t" #define MULADDC_CORE \ "ldmia r0!, {r6} \n\t" \ "lsr r7, r6, #16 \n\t" \ "lsl r6, r6, #16 \n\t" \ "lsr r6, r6, #16 \n\t" \ "mov r4, r8 \n\t" \ "mul r4, r6 \n\t" \ "mov r3, r9 \n\t" \ "mul r6, r3 \n\t" \ "mov r5, r9 \n\t" \ "mul r5, r7 \n\t" \ "mov r3, r8 \n\t" \ "mul r7, r3 \n\t" \ "lsr r3, r6, #16 \n\t" \ "add r5, r5, r3 \n\t" \ "lsr r3, r7, #16 \n\t" \ "add r5, r5, r3 \n\t" \ "add r4, r4, r2 \n\t" \ "mov r2, #0 \n\t" \ "adc r5, r2 \n\t" \ "lsl r3, r6, #16 \n\t" \ "add r4, r4, r3 \n\t" \ "adc r5, r2 \n\t" \ "lsl r3, r7, #16 \n\t" \ "add r4, r4, r3 \n\t" \ "adc r5, r2 \n\t" \ "ldr r3, [r1] \n\t" \ "add r4, r4, r3 \n\t" \ "adc r2, r5 \n\t" \ "stmia r1!, {r4} \n\t" #define MULADDC_STOP \ "str r2, %0 \n\t" \ "str r1, %1 \n\t" \ "str r0, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r0", "r1", "r2", "r3", "r4", "r5", \ "r6", "r7", "r8", "r9", "cc" \ ); #elif defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1) #define MULADDC_INIT \ asm( #define MULADDC_CORE \ "ldr r0, [%0], #4 \n\t" \ "ldr r1, [%1] \n\t" \ "umaal r1, %2, %3, r0 \n\t" \ "str r1, [%1], #4 \n\t" #define MULADDC_STOP \ : "=r" (s), "=r" (d), "=r" (c) \ : "r" (b), "0" (s), "1" (d), "2" (c) \ : "r0", "r1", "memory" \ ); #else #define MULADDC_INIT \ asm( \ "ldr r0, %3 \n\t" \ "ldr r1, %4 \n\t" \ "ldr r2, %5 \n\t" \ "ldr r3, %6 \n\t" #define MULADDC_CORE \ "ldr r4, [r0], #4 \n\t" \ "mov r5, #0 \n\t" \ "ldr r6, [r1] \n\t" \ "umlal r2, r5, r3, r4 \n\t" \ "adds r7, r6, r2 \n\t" \ "adc r2, r5, #0 \n\t" \ "str r7, [r1], #4 \n\t" #define MULADDC_STOP \ "str r2, %0 \n\t" \ "str r1, %1 \n\t" \ "str r0, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "r0", "r1", "r2", "r3", "r4", "r5", \ "r6", "r7", "cc" \ ); #endif /* Thumb */ #endif /* ARMv3 */ #if defined(__alpha__) #define MULADDC_INIT \ asm( \ "ldq $1, %3 \n\t" \ "ldq $2, %4 \n\t" \ "ldq $3, %5 \n\t" \ "ldq $4, %6 \n\t" #define MULADDC_CORE \ "ldq $6, 0($1) \n\t" \ "addq $1, 8, $1 \n\t" \ "mulq $6, $4, $7 \n\t" \ "umulh $6, $4, $6 \n\t" \ "addq $7, $3, $7 \n\t" \ "cmpult $7, $3, $3 \n\t" \ "ldq $5, 0($2) \n\t" \ "addq $7, $5, $7 \n\t" \ "cmpult $7, $5, $5 \n\t" \ "stq $7, 0($2) \n\t" \ "addq $2, 8, $2 \n\t" \ "addq $6, $3, $3 \n\t" \ "addq $5, $3, $3 \n\t" #define MULADDC_STOP \ "stq $3, %0 \n\t" \ "stq $2, %1 \n\t" \ "stq $1, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "$1", "$2", "$3", "$4", "$5", "$6", "$7" \ ); #endif /* Alpha */ #if defined(__mips__) && !defined(__mips64) #define MULADDC_INIT \ asm( \ "lw $10, %3 \n\t" \ "lw $11, %4 \n\t" \ "lw $12, %5 \n\t" \ "lw $13, %6 \n\t" #define MULADDC_CORE \ "lw $14, 0($10) \n\t" \ "multu $13, $14 \n\t" \ "addi $10, $10, 4 \n\t" \ "mflo $14 \n\t" \ "mfhi $9 \n\t" \ "addu $14, $12, $14 \n\t" \ "lw $15, 0($11) \n\t" \ "sltu $12, $14, $12 \n\t" \ "addu $15, $14, $15 \n\t" \ "sltu $14, $15, $14 \n\t" \ "addu $12, $12, $9 \n\t" \ "sw $15, 0($11) \n\t" \ "addu $12, $12, $14 \n\t" \ "addi $11, $11, 4 \n\t" #define MULADDC_STOP \ "sw $12, %0 \n\t" \ "sw $11, %1 \n\t" \ "sw $10, %2 \n\t" \ : "=m" (c), "=m" (d), "=m" (s) \ : "m" (s), "m" (d), "m" (c), "m" (b) \ : "$9", "$10", "$11", "$12", "$13", "$14", "$15" \ ); #endif /* MIPS */ #endif /* GNUC */ #if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) #define MULADDC_INIT \ __asm mov esi, s \ __asm mov edi, d \ __asm mov ecx, c \ __asm mov ebx, b #define MULADDC_CORE \ __asm lodsd \ __asm mul ebx \ __asm add eax, ecx \ __asm adc edx, 0 \ __asm add eax, [edi] \ __asm adc edx, 0 \ __asm mov ecx, edx \ __asm stosd #if defined(MBEDTLS_HAVE_SSE2) #define EMIT __asm _emit #define MULADDC_HUIT \ EMIT 0x0F EMIT 0x6E EMIT 0xC9 \ EMIT 0x0F EMIT 0x6E EMIT 0xC3 \ EMIT 0x0F EMIT 0x6E EMIT 0x1F \ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ EMIT 0x0F EMIT 0x6E EMIT 0x16 \ EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x04 \ EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x08 \ EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ EMIT 0x0F EMIT 0x6E EMIT 0x7E EMIT 0x0C \ EMIT 0x0F EMIT 0xF4 EMIT 0xF8 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ EMIT 0x0F EMIT 0x6E EMIT 0x5F EMIT 0x04 \ EMIT 0x0F EMIT 0xD4 EMIT 0xDC \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x08 \ EMIT 0x0F EMIT 0xD4 EMIT 0xEE \ EMIT 0x0F EMIT 0x6E EMIT 0x67 EMIT 0x0C \ EMIT 0x0F EMIT 0xD4 EMIT 0xFC \ EMIT 0x0F EMIT 0x7E EMIT 0x0F \ EMIT 0x0F EMIT 0x6E EMIT 0x56 EMIT 0x10 \ EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x14 \ EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x18 \ EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x04 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0x6E EMIT 0x5E EMIT 0x1C \ EMIT 0x0F EMIT 0xF4 EMIT 0xD8 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCD \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x10 \ EMIT 0x0F EMIT 0xD4 EMIT 0xD5 \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x08 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCF \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x14 \ EMIT 0x0F EMIT 0xD4 EMIT 0xE5 \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x0C \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x18 \ EMIT 0x0F EMIT 0xD4 EMIT 0xF5 \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x10 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCC \ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x1C \ EMIT 0x0F EMIT 0xD4 EMIT 0xDD \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x14 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCE \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x18 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x1C \ EMIT 0x83 EMIT 0xC7 EMIT 0x20 \ EMIT 0x83 EMIT 0xC6 EMIT 0x20 \ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ EMIT 0x0F EMIT 0x7E EMIT 0xC9 #define MULADDC_STOP \ EMIT 0x0F EMIT 0x77 \ __asm mov c, ecx \ __asm mov d, edi \ __asm mov s, esi \ #else #define MULADDC_STOP \ __asm mov c, ecx \ __asm mov d, edi \ __asm mov s, esi \ #endif /* SSE2 */ #endif /* MSVC */ #endif /* MBEDTLS_HAVE_ASM */ #if !defined(MULADDC_CORE) #if defined(MBEDTLS_HAVE_UDBL) #define MULADDC_INIT \ { \ mbedtls_t_udbl r; \ mbedtls_mpi_uint r0, r1; #define MULADDC_CORE \ r = *(s++) * (mbedtls_t_udbl) b; \ r0 = (mbedtls_mpi_uint) r; \ r1 = (mbedtls_mpi_uint)( r >> biL ); \ r0 += c; r1 += (r0 < c); \ r0 += *d; r1 += (r0 < *d); \ c = r1; *(d++) = r0; #define MULADDC_STOP \ } #else #define MULADDC_INIT \ { \ mbedtls_mpi_uint s0, s1, b0, b1; \ mbedtls_mpi_uint r0, r1, rx, ry; \ b0 = ( b << biH ) >> biH; \ b1 = ( b >> biH ); #define MULADDC_CORE \ s0 = ( *s << biH ) >> biH; \ s1 = ( *s >> biH ); s++; \ rx = s0 * b1; r0 = s0 * b0; \ ry = s1 * b0; r1 = s1 * b1; \ r1 += ( rx >> biH ); \ r1 += ( ry >> biH ); \ rx <<= biH; ry <<= biH; \ r0 += rx; r1 += (r0 < rx); \ r0 += ry; r1 += (r0 < ry); \ r0 += c; r1 += (r0 < c); \ r0 += *d; r1 += (r0 < *d); \ c = r1; *(d++) = r0; #define MULADDC_STOP \ } #endif /* C (generic) */ #endif /* C (longlong) */ #endif /* bn_mul.h */ fldigi-4.2.05/src/include/mbedtls/asn1.h0000664000175000017500000003015514611711171014646 00000000000000/** * \file asn1.h * * \brief Generic ASN.1 parsing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ASN1_H #define MBEDTLS_ASN1_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #if defined(MBEDTLS_BIGNUM_C) #include "bignum.h" #endif /** * \addtogroup asn1_module * \{ */ /** * \name ASN1 Error codes * These error codes are OR'ed to X509 error codes for * higher error granularity. * ASN1 is a standard to specify data structures. * \{ */ #define MBEDTLS_ERR_ASN1_OUT_OF_DATA -0x0060 /**< Out of data when parsing an ASN1 data structure. */ #define MBEDTLS_ERR_ASN1_UNEXPECTED_TAG -0x0062 /**< ASN1 tag was of an unexpected value. */ #define MBEDTLS_ERR_ASN1_INVALID_LENGTH -0x0064 /**< Error when trying to determine the length or invalid length. */ #define MBEDTLS_ERR_ASN1_LENGTH_MISMATCH -0x0066 /**< Actual length differs from expected length. */ #define MBEDTLS_ERR_ASN1_INVALID_DATA -0x0068 /**< Data is invalid. (not used) */ #define MBEDTLS_ERR_ASN1_ALLOC_FAILED -0x006A /**< Memory allocation failed */ #define MBEDTLS_ERR_ASN1_BUF_TOO_SMALL -0x006C /**< Buffer too small when writing ASN.1 data structure. */ /* \} name */ /** * \name DER constants * These constants comply with the DER encoded ASN.1 type tags. * DER encoding uses hexadecimal representation. * An example DER sequence is:\n * - 0x02 -- tag indicating INTEGER * - 0x01 -- length in octets * - 0x05 -- value * Such sequences are typically read into \c ::mbedtls_x509_buf. * \{ */ #define MBEDTLS_ASN1_BOOLEAN 0x01 #define MBEDTLS_ASN1_INTEGER 0x02 #define MBEDTLS_ASN1_BIT_STRING 0x03 #define MBEDTLS_ASN1_OCTET_STRING 0x04 #define MBEDTLS_ASN1_NULL 0x05 #define MBEDTLS_ASN1_OID 0x06 #define MBEDTLS_ASN1_UTF8_STRING 0x0C #define MBEDTLS_ASN1_SEQUENCE 0x10 #define MBEDTLS_ASN1_SET 0x11 #define MBEDTLS_ASN1_PRINTABLE_STRING 0x13 #define MBEDTLS_ASN1_T61_STRING 0x14 #define MBEDTLS_ASN1_IA5_STRING 0x16 #define MBEDTLS_ASN1_UTC_TIME 0x17 #define MBEDTLS_ASN1_GENERALIZED_TIME 0x18 #define MBEDTLS_ASN1_UNIVERSAL_STRING 0x1C #define MBEDTLS_ASN1_BMP_STRING 0x1E #define MBEDTLS_ASN1_PRIMITIVE 0x00 #define MBEDTLS_ASN1_CONSTRUCTED 0x20 #define MBEDTLS_ASN1_CONTEXT_SPECIFIC 0x80 /* * Bit masks for each of the components of an ASN.1 tag as specified in * ITU X.690 (08/2015), section 8.1 "General rules for encoding", * paragraph 8.1.2.2: * * Bit 8 7 6 5 1 * +-------+-----+------------+ * | Class | P/C | Tag number | * +-------+-----+------------+ */ #define MBEDTLS_ASN1_TAG_CLASS_MASK 0xC0 #define MBEDTLS_ASN1_TAG_PC_MASK 0x20 #define MBEDTLS_ASN1_TAG_VALUE_MASK 0x1F /* \} name */ /* \} addtogroup asn1_module */ /** Returns the size of the binary string, without the trailing \\0 */ #define MBEDTLS_OID_SIZE(x) (sizeof(x) - 1) /** * Compares an mbedtls_asn1_buf structure to a reference OID. * * Only works for 'defined' oid_str values (MBEDTLS_OID_HMAC_SHA1), you cannot use a * 'unsigned char *oid' here! */ #define MBEDTLS_OID_CMP(oid_str, oid_buf) \ ( ( MBEDTLS_OID_SIZE(oid_str) != (oid_buf)->len ) || \ memcmp( (oid_str), (oid_buf)->p, (oid_buf)->len) != 0 ) #ifdef __cplusplus extern "C" { #endif /** * \name Functions to parse ASN.1 data structures * \{ */ /** * Type-length-value structure that allows for ASN1 using DER. */ typedef struct mbedtls_asn1_buf { int tag; /**< ASN1 type, e.g. MBEDTLS_ASN1_UTF8_STRING. */ size_t len; /**< ASN1 length, in octets. */ unsigned char *p; /**< ASN1 data, e.g. in ASCII. */ } mbedtls_asn1_buf; /** * Container for ASN1 bit strings. */ typedef struct mbedtls_asn1_bitstring { size_t len; /**< ASN1 length, in octets. */ unsigned char unused_bits; /**< Number of unused bits at the end of the string */ unsigned char *p; /**< Raw ASN1 data for the bit string */ } mbedtls_asn1_bitstring; /** * Container for a sequence of ASN.1 items */ typedef struct mbedtls_asn1_sequence { mbedtls_asn1_buf buf; /**< Buffer containing the given ASN.1 item. */ struct mbedtls_asn1_sequence *next; /**< The next entry in the sequence. */ } mbedtls_asn1_sequence; /** * Container for a sequence or list of 'named' ASN.1 data items */ typedef struct mbedtls_asn1_named_data { mbedtls_asn1_buf oid; /**< The object identifier. */ mbedtls_asn1_buf val; /**< The named value. */ struct mbedtls_asn1_named_data *next; /**< The next entry in the sequence. */ unsigned char next_merged; /**< Merge next item into the current one? */ } mbedtls_asn1_named_data; /** * \brief Get the length of an ASN.1 element. * Updates the pointer to immediately behind the length. * * \param p The position in the ASN.1 data * \param end End of data * \param len The variable that will receive the value * * \return 0 if successful, MBEDTLS_ERR_ASN1_OUT_OF_DATA on reaching * end of data, MBEDTLS_ERR_ASN1_INVALID_LENGTH if length is * unparseable. */ int mbedtls_asn1_get_len( unsigned char **p, const unsigned char *end, size_t *len ); /** * \brief Get the tag and length of the tag. Check for the requested tag. * Updates the pointer to immediately behind the tag and length. * * \param p The position in the ASN.1 data * \param end End of data * \param len The variable that will receive the length * \param tag The expected tag * * \return 0 if successful, MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if tag did * not match requested tag, or another specific ASN.1 error code. */ int mbedtls_asn1_get_tag( unsigned char **p, const unsigned char *end, size_t *len, int tag ); /** * \brief Retrieve a boolean ASN.1 tag and its value. * Updates the pointer to immediately behind the full tag. * * \param p The position in the ASN.1 data * \param end End of data * \param val The variable that will receive the value * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_bool( unsigned char **p, const unsigned char *end, int *val ); /** * \brief Retrieve an integer ASN.1 tag and its value. * Updates the pointer to immediately behind the full tag. * * \param p The position in the ASN.1 data * \param end End of data * \param val The variable that will receive the value * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_int( unsigned char **p, const unsigned char *end, int *val ); /** * \brief Retrieve a bitstring ASN.1 tag and its value. * Updates the pointer to immediately behind the full tag. * * \param p The position in the ASN.1 data * \param end End of data * \param bs The variable that will receive the value * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end, mbedtls_asn1_bitstring *bs); /** * \brief Retrieve a bitstring ASN.1 tag without unused bits and its * value. * Updates the pointer to the beginning of the bit/octet string. * * \param p The position in the ASN.1 data * \param end End of data * \param len Length of the actual bit/octect string in bytes * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end, size_t *len ); /** * \brief Parses and splits an ASN.1 "SEQUENCE OF " * Updated the pointer to immediately behind the full sequence tag. * * \param p The position in the ASN.1 data * \param end End of data * \param cur First variable in the chain to fill * \param tag Type of sequence * * \return 0 if successful or a specific ASN.1 error code. */ int mbedtls_asn1_get_sequence_of( unsigned char **p, const unsigned char *end, mbedtls_asn1_sequence *cur, int tag); #if defined(MBEDTLS_BIGNUM_C) /** * \brief Retrieve a MPI value from an integer ASN.1 tag. * Updates the pointer to immediately behind the full tag. * * \param p The position in the ASN.1 data * \param end End of data * \param X The MPI that will receive the value * * \return 0 if successful or a specific ASN.1 or MPI error code. */ int mbedtls_asn1_get_mpi( unsigned char **p, const unsigned char *end, mbedtls_mpi *X ); #endif /* MBEDTLS_BIGNUM_C */ /** * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence. * Updates the pointer to immediately behind the full * AlgorithmIdentifier. * * \param p The position in the ASN.1 data * \param end End of data * \param alg The buffer to receive the OID * \param params The buffer to receive the params (if any) * * \return 0 if successful or a specific ASN.1 or MPI error code. */ int mbedtls_asn1_get_alg( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params ); /** * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no * params. * Updates the pointer to immediately behind the full * AlgorithmIdentifier. * * \param p The position in the ASN.1 data * \param end End of data * \param alg The buffer to receive the OID * * \return 0 if successful or a specific ASN.1 or MPI error code. */ int mbedtls_asn1_get_alg_null( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg ); /** * \brief Find a specific named_data entry in a sequence or list based on * the OID. * * \param list The list to seek through * \param oid The OID to look for * \param len Size of the OID * * \return NULL if not found, or a pointer to the existing entry. */ mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list, const char *oid, size_t len ); /** * \brief Free a mbedtls_asn1_named_data entry * * \param entry The named data entry to free */ void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *entry ); /** * \brief Free all entries in a mbedtls_asn1_named_data list * Head will be set to NULL * * \param head Pointer to the head of the list of named data entries to free */ void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head ); #ifdef __cplusplus } #endif #endif /* asn1.h */ fldigi-4.2.05/src/include/mbedtls/des.h0000664000175000017500000002630614611711171014562 00000000000000/** * \file des.h * * \brief DES block cipher * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_DES_H #define MBEDTLS_DES_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #define MBEDTLS_DES_ENCRYPT 1 #define MBEDTLS_DES_DECRYPT 0 #define MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH -0x0032 /**< The data input has an invalid length. */ /* MBEDTLS_ERR_DES_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_DES_HW_ACCEL_FAILED -0x0033 /**< DES hardware accelerator failed. */ #define MBEDTLS_DES_KEY_SIZE 8 #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_DES_ALT) // Regular implementation // /** * \brief DES context structure * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ typedef struct mbedtls_des_context { uint32_t sk[32]; /*!< DES subkeys */ } mbedtls_des_context; /** * \brief Triple-DES context structure */ typedef struct mbedtls_des3_context { uint32_t sk[96]; /*!< 3DES subkeys */ } mbedtls_des3_context; #else /* MBEDTLS_DES_ALT */ #include "des_alt.h" #endif /* MBEDTLS_DES_ALT */ /** * \brief Initialize DES context * * \param ctx DES context to be initialized * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ void mbedtls_des_init( mbedtls_des_context *ctx ); /** * \brief Clear DES context * * \param ctx DES context to be cleared * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ void mbedtls_des_free( mbedtls_des_context *ctx ); /** * \brief Initialize Triple-DES context * * \param ctx DES3 context to be initialized */ void mbedtls_des3_init( mbedtls_des3_context *ctx ); /** * \brief Clear Triple-DES context * * \param ctx DES3 context to be cleared */ void mbedtls_des3_free( mbedtls_des3_context *ctx ); /** * \brief Set key parity on the given key to odd. * * DES keys are 56 bits long, but each byte is padded with * a parity bit to allow verification. * * \param key 8-byte secret key * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief Check that key parity on the given key is odd. * * DES keys are 56 bits long, but each byte is padded with * a parity bit to allow verification. * * \param key 8-byte secret key * * \return 0 is parity was ok, 1 if parity was not correct. * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief Check that key is not a weak or semi-weak DES key * * \param key 8-byte secret key * * \return 0 if no weak key was found, 1 if a weak key was identified. * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief DES key schedule (56-bit, encryption) * * \param ctx DES context to be initialized * \param key 8-byte secret key * * \return 0 * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief DES key schedule (56-bit, decryption) * * \param ctx DES context to be initialized * \param key 8-byte secret key * * \return 0 * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief Triple-DES key schedule (112-bit, encryption) * * \param ctx 3DES context to be initialized * \param key 16-byte secret key * * \return 0 */ int mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ); /** * \brief Triple-DES key schedule (112-bit, decryption) * * \param ctx 3DES context to be initialized * \param key 16-byte secret key * * \return 0 */ int mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ); /** * \brief Triple-DES key schedule (168-bit, encryption) * * \param ctx 3DES context to be initialized * \param key 24-byte secret key * * \return 0 */ int mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ); /** * \brief Triple-DES key schedule (168-bit, decryption) * * \param ctx 3DES context to be initialized * \param key 24-byte secret key * * \return 0 */ int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ); /** * \brief DES-ECB block encryption/decryption * * \param ctx DES context * \param input 64-bit input block * \param output 64-bit output block * * \return 0 if successful * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx, const unsigned char input[8], unsigned char output[8] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief DES-CBC buffer encryption/decryption * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx DES context * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT * \param length length of the input data * \param iv initialization vector (updated after use) * \param input buffer holding the input data * \param output buffer holding the output data * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ /** * \brief 3DES-ECB block encryption/decryption * * \param ctx 3DES context * \param input 64-bit input block * \param output 64-bit output block * * \return 0 if successful */ int mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx, const unsigned char input[8], unsigned char output[8] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief 3DES-CBC buffer encryption/decryption * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx 3DES context * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT * \param length length of the input data * \param iv initialization vector (updated after use) * \param input buffer holding the input data * \param output buffer holding the output data * * \return 0 if successful, or MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH */ int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ /** * \brief Internal function for key expansion. * (Only exposed to allow overriding it, * see MBEDTLS_DES_SETKEY_ALT) * * \param SK Round keys * \param key Base key * * \warning DES is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. */ void mbedtls_des_setkey( uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_des_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* des.h */ fldigi-4.2.05/src/include/mbedtls/chacha20.h0000664000175000017500000002142514611711171015355 00000000000000/** * \file chacha20.h * * \brief This file contains ChaCha20 definitions and functions. * * ChaCha20 is a stream cipher that can encrypt and decrypt * information. ChaCha was created by Daniel Bernstein as a variant of * its Salsa cipher https://cr.yp.to/chacha/chacha-20080128.pdf * ChaCha20 is the variant with 20 rounds, that was also standardized * in RFC 7539. * * \author Daniel King */ /* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved. * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CHACHA20_H #define MBEDTLS_CHACHA20_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #define MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA -0x0051 /**< Invalid input parameter(s). */ /* MBEDTLS_ERR_CHACHA20_FEATURE_UNAVAILABLE is deprecated and should not be * used. */ #define MBEDTLS_ERR_CHACHA20_FEATURE_UNAVAILABLE -0x0053 /**< Feature not available. For example, s part of the API is not implemented. */ /* MBEDTLS_ERR_CHACHA20_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CHACHA20_HW_ACCEL_FAILED -0x0055 /**< Chacha20 hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_CHACHA20_ALT) typedef struct mbedtls_chacha20_context { uint32_t state[16]; /*! The state (before round operations). */ uint8_t keystream8[64]; /*! Leftover keystream bytes. */ size_t keystream_bytes_used; /*! Number of keystream bytes already used. */ } mbedtls_chacha20_context; #else /* MBEDTLS_CHACHA20_ALT */ #include "chacha20_alt.h" #endif /* MBEDTLS_CHACHA20_ALT */ /** * \brief This function initializes the specified ChaCha20 context. * * It must be the first API called before using * the context. * * It is usually followed by calls to * \c mbedtls_chacha20_setkey() and * \c mbedtls_chacha20_starts(), then one or more calls to * to \c mbedtls_chacha20_update(), and finally to * \c mbedtls_chacha20_free(). * * \param ctx The ChaCha20 context to initialize. * This must not be \c NULL. */ void mbedtls_chacha20_init( mbedtls_chacha20_context *ctx ); /** * \brief This function releases and clears the specified * ChaCha20 context. * * \param ctx The ChaCha20 context to clear. This may be \c NULL, * in which case this function is a no-op. If it is not * \c NULL, it must point to an initialized context. * */ void mbedtls_chacha20_free( mbedtls_chacha20_context *ctx ); /** * \brief This function sets the encryption/decryption key. * * \note After using this function, you must also call * \c mbedtls_chacha20_starts() to set a nonce before you * start encrypting/decrypting data with * \c mbedtls_chacha_update(). * * \param ctx The ChaCha20 context to which the key should be bound. * It must be initialized. * \param key The encryption/decryption key. This must be \c 32 Bytes * in length. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA if ctx or key is NULL. */ int mbedtls_chacha20_setkey( mbedtls_chacha20_context *ctx, const unsigned char key[32] ); /** * \brief This function sets the nonce and initial counter value. * * \note A ChaCha20 context can be re-used with the same key by * calling this function to change the nonce. * * \warning You must never use the same nonce twice with the same key. * This would void any confidentiality guarantees for the * messages encrypted with the same nonce and key. * * \param ctx The ChaCha20 context to which the nonce should be bound. * It must be initialized and bound to a key. * \param nonce The nonce. This must be \c 12 Bytes in size. * \param counter The initial counter value. This is usually \c 0. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA if ctx or nonce is * NULL. */ int mbedtls_chacha20_starts( mbedtls_chacha20_context* ctx, const unsigned char nonce[12], uint32_t counter ); /** * \brief This function encrypts or decrypts data. * * Since ChaCha20 is a stream cipher, the same operation is * used for encrypting and decrypting data. * * \note The \p input and \p output pointers must either be equal or * point to non-overlapping buffers. * * \note \c mbedtls_chacha20_setkey() and * \c mbedtls_chacha20_starts() must be called at least once * to setup the context before this function can be called. * * \note This function can be called multiple times in a row in * order to encrypt of decrypt data piecewise with the same * key and nonce. * * \param ctx The ChaCha20 context to use for encryption or decryption. * It must be initialized and bound to a key and nonce. * \param size The length of the input data in Bytes. * \param input The buffer holding the input data. * This pointer can be \c NULL if `size == 0`. * \param output The buffer holding the output data. * This must be able to hold \p size Bytes. * This pointer can be \c NULL if `size == 0`. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chacha20_update( mbedtls_chacha20_context *ctx, size_t size, const unsigned char *input, unsigned char *output ); /** * \brief This function encrypts or decrypts data with ChaCha20 and * the given key and nonce. * * Since ChaCha20 is a stream cipher, the same operation is * used for encrypting and decrypting data. * * \warning You must never use the same (key, nonce) pair more than * once. This would void any confidentiality guarantees for * the messages encrypted with the same nonce and key. * * \note The \p input and \p output pointers must either be equal or * point to non-overlapping buffers. * * \param key The encryption/decryption key. * This must be \c 32 Bytes in length. * \param nonce The nonce. This must be \c 12 Bytes in size. * \param counter The initial counter value. This is usually \c 0. * \param size The length of the input data in Bytes. * \param input The buffer holding the input data. * This pointer can be \c NULL if `size == 0`. * \param output The buffer holding the output data. * This must be able to hold \p size Bytes. * This pointer can be \c NULL if `size == 0`. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chacha20_crypt( const unsigned char key[32], const unsigned char nonce[12], uint32_t counter, size_t size, const unsigned char* input, unsigned char* output ); #if defined(MBEDTLS_SELF_TEST) /** * \brief The ChaCha20 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_chacha20_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CHACHA20_H */ fldigi-4.2.05/src/include/mbedtls/ccm.h0000664000175000017500000003346014611711171014550 00000000000000/** * \file ccm.h * * \brief This file provides an API for the CCM authenticated encryption * mode for block ciphers. * * CCM combines Counter mode encryption with CBC-MAC authentication * for 128-bit block ciphers. * * Input to CCM includes the following elements: *
  • Payload - data that is both authenticated and encrypted.
  • *
  • Associated data (Adata) - data that is authenticated but not * encrypted, For example, a header.
  • *
  • Nonce - A unique value that is assigned to the payload and the * associated data.
* * Definition of CCM: * http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf * RFC 3610 "Counter with CBC-MAC (CCM)" * * Related: * RFC 5116 "An Interface and Algorithms for Authenticated Encryption" * * Definition of CCM*: * IEEE 802.15.4 - IEEE Standard for Local and metropolitan area networks * Integer representation is fixed most-significant-octet-first order and * the representation of octets is most-significant-bit-first order. This is * consistent with RFC 3610. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CCM_H #define MBEDTLS_CCM_H #include "cipher.h" #define MBEDTLS_ERR_CCM_BAD_INPUT -0x000D /**< Bad input parameters to the function. */ #define MBEDTLS_ERR_CCM_AUTH_FAILED -0x000F /**< Authenticated decryption failed. */ /* MBEDTLS_ERR_CCM_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CCM_HW_ACCEL_FAILED -0x0011 /**< CCM hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_CCM_ALT) // Regular implementation // /** * \brief The CCM context-type definition. The CCM context is passed * to the APIs called. */ typedef struct mbedtls_ccm_context { mbedtls_cipher_context_t cipher_ctx; /*!< The cipher context used. */ } mbedtls_ccm_context; #else /* MBEDTLS_CCM_ALT */ #include "ccm_alt.h" #endif /* MBEDTLS_CCM_ALT */ /** * \brief This function initializes the specified CCM context, * to make references valid, and prepare the context * for mbedtls_ccm_setkey() or mbedtls_ccm_free(). * * \param ctx The CCM context to initialize. This must not be \c NULL. */ void mbedtls_ccm_init( mbedtls_ccm_context *ctx ); /** * \brief This function initializes the CCM context set in the * \p ctx parameter and sets the encryption key. * * \param ctx The CCM context to initialize. This must be an initialized * context. * \param cipher The 128-bit block cipher to use. * \param key The encryption key. This must not be \c NULL. * \param keybits The key size in bits. This must be acceptable by the cipher. * * \return \c 0 on success. * \return A CCM or cipher-specific error code on failure. */ int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits ); /** * \brief This function releases and clears the specified CCM context * and underlying cipher sub-context. * * \param ctx The CCM context to clear. If this is \c NULL, the function * has no effect. Otherwise, this must be initialized. */ void mbedtls_ccm_free( mbedtls_ccm_context *ctx ); /** * \brief This function encrypts a buffer using CCM. * * \note The tag is written to a separate buffer. To concatenate * the \p tag with the \p output, as done in RFC-3610: * Counter with CBC-MAC (CCM), use * \p tag = \p output + \p length, and make sure that the * output buffer is at least \p length + \p tag_len wide. * * \param ctx The CCM context to use for encryption. This must be * initialized and bound to a key. * \param length The length of the input data in Bytes. * \param iv The initialization vector (nonce). This must be a readable * buffer of at least \p iv_len Bytes. * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, * or 13. The length L of the message length field is * 15 - \p iv_len. * \param add The additional data field. If \p add_len is greater than * zero, \p add must be a readable buffer of at least that * length. * \param add_len The length of additional data in Bytes. * This must be less than `2^16 - 2^8`. * \param input The buffer holding the input data. If \p length is greater * than zero, \p input must be a readable buffer of at least * that length. * \param output The buffer holding the output data. If \p length is greater * than zero, \p output must be a writable buffer of at least * that length. * \param tag The buffer holding the authentication field. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication field to generate in Bytes: * 4, 6, 8, 10, 12, 14 or 16. * * \return \c 0 on success. * \return A CCM or cipher-specific error code on failure. */ int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ); /** * \brief This function encrypts a buffer using CCM*. * * \note The tag is written to a separate buffer. To concatenate * the \p tag with the \p output, as done in RFC-3610: * Counter with CBC-MAC (CCM), use * \p tag = \p output + \p length, and make sure that the * output buffer is at least \p length + \p tag_len wide. * * \note When using this function in a variable tag length context, * the tag length has to be encoded into the \p iv passed to * this function. * * \param ctx The CCM context to use for encryption. This must be * initialized and bound to a key. * \param length The length of the input data in Bytes. * \param iv The initialization vector (nonce). This must be a readable * buffer of at least \p iv_len Bytes. * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, * or 13. The length L of the message length field is * 15 - \p iv_len. * \param add The additional data field. This must be a readable buffer of * at least \p add_len Bytes. * \param add_len The length of additional data in Bytes. * This must be less than 2^16 - 2^8. * \param input The buffer holding the input data. If \p length is greater * than zero, \p input must be a readable buffer of at least * that length. * \param output The buffer holding the output data. If \p length is greater * than zero, \p output must be a writable buffer of at least * that length. * \param tag The buffer holding the authentication field. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication field to generate in Bytes: * 0, 4, 6, 8, 10, 12, 14 or 16. * * \warning Passing \c 0 as \p tag_len means that the message is no * longer authenticated. * * \return \c 0 on success. * \return A CCM or cipher-specific error code on failure. */ int mbedtls_ccm_star_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ); /** * \brief This function performs a CCM authenticated decryption of a * buffer. * * \param ctx The CCM context to use for decryption. This must be * initialized and bound to a key. * \param length The length of the input data in Bytes. * \param iv The initialization vector (nonce). This must be a readable * buffer of at least \p iv_len Bytes. * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, * or 13. The length L of the message length field is * 15 - \p iv_len. * \param add The additional data field. This must be a readable buffer * of at least that \p add_len Bytes.. * \param add_len The length of additional data in Bytes. * This must be less than 2^16 - 2^8. * \param input The buffer holding the input data. If \p length is greater * than zero, \p input must be a readable buffer of at least * that length. * \param output The buffer holding the output data. If \p length is greater * than zero, \p output must be a writable buffer of at least * that length. * \param tag The buffer holding the authentication field. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication field to generate in Bytes: * 4, 6, 8, 10, 12, 14 or 16. * * \return \c 0 on success. This indicates that the message is authentic. * \return #MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match. * \return A cipher-specific error code on calculation failure. */ int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len ); /** * \brief This function performs a CCM* authenticated decryption of a * buffer. * * \note When using this function in a variable tag length context, * the tag length has to be decoded from \p iv and passed to * this function as \p tag_len. (\p tag needs to be adjusted * accordingly.) * * \param ctx The CCM context to use for decryption. This must be * initialized and bound to a key. * \param length The length of the input data in Bytes. * \param iv The initialization vector (nonce). This must be a readable * buffer of at least \p iv_len Bytes. * \param iv_len The length of the nonce in Bytes: 7, 8, 9, 10, 11, 12, * or 13. The length L of the message length field is * 15 - \p iv_len. * \param add The additional data field. This must be a readable buffer of * at least that \p add_len Bytes. * \param add_len The length of additional data in Bytes. * This must be less than 2^16 - 2^8. * \param input The buffer holding the input data. If \p length is greater * than zero, \p input must be a readable buffer of at least * that length. * \param output The buffer holding the output data. If \p length is greater * than zero, \p output must be a writable buffer of at least * that length. * \param tag The buffer holding the authentication field. This must be a * readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication field in Bytes. * 0, 4, 6, 8, 10, 12, 14 or 16. * * \warning Passing \c 0 as \p tag_len means that the message is nos * longer authenticated. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CCM_AUTH_FAILED if the tag does not match. * \return A cipher-specific error code on calculation failure. */ int mbedtls_ccm_star_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len ); #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) /** * \brief The CCM checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_ccm_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CCM_H */ fldigi-4.2.05/src/include/mbedtls/havege.h0000664000175000017500000000366014611711171015244 00000000000000/** * \file havege.h * * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_HAVEGE_H #define MBEDTLS_HAVEGE_H #include #define MBEDTLS_HAVEGE_COLLECT_SIZE 1024 #ifdef __cplusplus extern "C" { #endif /** * \brief HAVEGE state structure */ typedef struct mbedtls_havege_state { int PT1, PT2, offset[2]; int pool[MBEDTLS_HAVEGE_COLLECT_SIZE]; int WALK[8192]; } mbedtls_havege_state; /** * \brief HAVEGE initialization * * \param hs HAVEGE state to be initialized */ void mbedtls_havege_init( mbedtls_havege_state *hs ); /** * \brief Clear HAVEGE state * * \param hs HAVEGE state to be cleared */ void mbedtls_havege_free( mbedtls_havege_state *hs ); /** * \brief HAVEGE rand function * * \param p_rng A HAVEGE state * \param output Buffer to fill * \param len Length of buffer * * \return 0 */ int mbedtls_havege_random( void *p_rng, unsigned char *output, size_t len ); #ifdef __cplusplus } #endif #endif /* havege.h */ fldigi-4.2.05/src/include/mbedtls/bignum.h0000664000175000017500000011727414611711171015275 00000000000000/** * \file bignum.h * * \brief Multi-precision integer library */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_BIGNUM_H #define MBEDTLS_BIGNUM_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #if defined(MBEDTLS_FS_IO) #include #endif #define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002 /**< An error occurred while reading from or writing to a file. */ #define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006 /**< There is an invalid character in the digit string. */ #define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008 /**< The buffer is too small to write to. */ #define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A /**< The input arguments are negative or result in illegal output. */ #define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C /**< The input argument for division is zero, which is not allowed. */ #define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E /**< The input arguments are not acceptable. */ #define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010 /**< Memory allocation failed. */ #define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 ) /* * Maximum size MPIs are allowed to grow to in number of limbs. */ #define MBEDTLS_MPI_MAX_LIMBS 10000 #if !defined(MBEDTLS_MPI_WINDOW_SIZE) /* * Maximum window size used for modular exponentiation. Default: 6 * Minimum value: 1. Maximum value: 6. * * Result is an array of ( 2 << MBEDTLS_MPI_WINDOW_SIZE ) MPIs used * for the sliding window calculation. (So 64 by default) * * Reduction in size, reduces speed. */ #define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ #endif /* !MBEDTLS_MPI_WINDOW_SIZE */ #if !defined(MBEDTLS_MPI_MAX_SIZE) /* * Maximum size of MPIs allowed in bits and bytes for user-MPIs. * ( Default: 512 bytes => 4096 bits, Maximum tested: 2048 bytes => 16384 bits ) * * Note: Calculations can temporarily result in larger MPIs. So the number * of limbs required (MBEDTLS_MPI_MAX_LIMBS) is higher. */ #define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ #endif /* !MBEDTLS_MPI_MAX_SIZE */ #define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE ) /**< Maximum number of bits for usable MPIs. */ /* * When reading from files with mbedtls_mpi_read_file() and writing to files with * mbedtls_mpi_write_file() the buffer should have space * for a (short) label, the MPI (in the provided radix), the newline * characters and the '\0'. * * By default we assume at least a 10 char label, a minimum radix of 10 * (decimal) and a maximum of 4096 bit numbers (1234 decimal chars). * Autosized at compile time for at least a 10 char label, a minimum radix * of 10 (decimal) for a number of MBEDTLS_MPI_MAX_BITS size. * * This used to be statically sized to 1250 for a maximum of 4096 bit * numbers (1234 decimal chars). * * Calculate using the formula: * MBEDTLS_MPI_RW_BUFFER_SIZE = ceil(MBEDTLS_MPI_MAX_BITS / ln(10) * ln(2)) + * LabelSize + 6 */ #define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS ) #define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332 #define MBEDTLS_MPI_RW_BUFFER_SIZE ( ((MBEDTLS_MPI_MAX_BITS_SCALE100 + MBEDTLS_LN_2_DIV_LN_10_SCALE100 - 1) / MBEDTLS_LN_2_DIV_LN_10_SCALE100) + 10 + 6 ) /* * Define the base integer type, architecture-wise. * * 32 or 64-bit integer types can be forced regardless of the underlying * architecture by defining MBEDTLS_HAVE_INT32 or MBEDTLS_HAVE_INT64 * respectively and undefining MBEDTLS_HAVE_ASM. * * Double-width integers (e.g. 128-bit in 64-bit architectures) can be * disabled by defining MBEDTLS_NO_UDBL_DIVISION. */ #if !defined(MBEDTLS_HAVE_INT32) #if defined(_MSC_VER) && defined(_M_AMD64) /* Always choose 64-bit when using MSC */ #if !defined(MBEDTLS_HAVE_INT64) #define MBEDTLS_HAVE_INT64 #endif /* !MBEDTLS_HAVE_INT64 */ typedef int64_t mbedtls_mpi_sint; typedef uint64_t mbedtls_mpi_uint; #elif defined(__GNUC__) && ( \ defined(__amd64__) || defined(__x86_64__) || \ defined(__ppc64__) || defined(__powerpc64__) || \ defined(__ia64__) || defined(__alpha__) || \ ( defined(__sparc__) && defined(__arch64__) ) || \ defined(__s390x__) || defined(__mips64) ) #if !defined(MBEDTLS_HAVE_INT64) #define MBEDTLS_HAVE_INT64 #endif /* MBEDTLS_HAVE_INT64 */ typedef int64_t mbedtls_mpi_sint; typedef uint64_t mbedtls_mpi_uint; #if !defined(MBEDTLS_NO_UDBL_DIVISION) /* mbedtls_t_udbl defined as 128-bit unsigned int */ typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI))); #define MBEDTLS_HAVE_UDBL #endif /* !MBEDTLS_NO_UDBL_DIVISION */ #elif defined(__ARMCC_VERSION) && defined(__aarch64__) /* * __ARMCC_VERSION is defined for both armcc and armclang and * __aarch64__ is only defined by armclang when compiling 64-bit code */ #if !defined(MBEDTLS_HAVE_INT64) #define MBEDTLS_HAVE_INT64 #endif /* !MBEDTLS_HAVE_INT64 */ typedef int64_t mbedtls_mpi_sint; typedef uint64_t mbedtls_mpi_uint; #if !defined(MBEDTLS_NO_UDBL_DIVISION) /* mbedtls_t_udbl defined as 128-bit unsigned int */ typedef __uint128_t mbedtls_t_udbl; #define MBEDTLS_HAVE_UDBL #endif /* !MBEDTLS_NO_UDBL_DIVISION */ #elif defined(MBEDTLS_HAVE_INT64) /* Force 64-bit integers with unknown compiler */ typedef int64_t mbedtls_mpi_sint; typedef uint64_t mbedtls_mpi_uint; #endif #endif /* !MBEDTLS_HAVE_INT32 */ #if !defined(MBEDTLS_HAVE_INT64) /* Default to 32-bit compilation */ #if !defined(MBEDTLS_HAVE_INT32) #define MBEDTLS_HAVE_INT32 #endif /* !MBEDTLS_HAVE_INT32 */ typedef int32_t mbedtls_mpi_sint; typedef uint32_t mbedtls_mpi_uint; #if !defined(MBEDTLS_NO_UDBL_DIVISION) typedef uint64_t mbedtls_t_udbl; #define MBEDTLS_HAVE_UDBL #endif /* !MBEDTLS_NO_UDBL_DIVISION */ #endif /* !MBEDTLS_HAVE_INT64 */ #ifdef __cplusplus extern "C" { #endif /** * \brief MPI structure */ typedef struct mbedtls_mpi { int s; /*!< integer sign */ size_t n; /*!< total # of limbs */ mbedtls_mpi_uint *p; /*!< pointer to limbs */ } mbedtls_mpi; /** * \brief Initialize an MPI context. * * This makes the MPI ready to be set or freed, * but does not define a value for the MPI. * * \param X The MPI context to initialize. This must not be \c NULL. */ void mbedtls_mpi_init( mbedtls_mpi *X ); /** * \brief This function frees the components of an MPI context. * * \param X The MPI context to be cleared. This may be \c NULL, * in which case this function is a no-op. If it is * not \c NULL, it must point to an initialized MPI. */ void mbedtls_mpi_free( mbedtls_mpi *X ); /** * \brief Enlarge an MPI to the specified number of limbs. * * \note This function does nothing if the MPI is * already large enough. * * \param X The MPI to grow. It must be initialized. * \param nblimbs The target number of limbs. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs ); /** * \brief This function resizes an MPI downwards, keeping at least the * specified number of limbs. * * If \c X is smaller than \c nblimbs, it is resized up * instead. * * \param X The MPI to shrink. This must point to an initialized MPI. * \param nblimbs The minimum number of limbs to keep. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed * (this can only happen when resizing up). * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs ); /** * \brief Make a copy of an MPI. * * \param X The destination MPI. This must point to an initialized MPI. * \param Y The source MPI. This must point to an initialized MPI. * * \note The limb-buffer in the destination MPI is enlarged * if necessary to hold the value in the source MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y ); /** * \brief Swap the contents of two MPIs. * * \param X The first MPI. It must be initialized. * \param Y The second MPI. It must be initialized. */ void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ); /** * \brief Perform a safe conditional copy of MPI which doesn't * reveal whether the condition was true or not. * * \param X The MPI to conditionally assign to. This must point * to an initialized MPI. * \param Y The MPI to be assigned from. This must point to an * initialized MPI. * \param assign The condition deciding whether to perform the * assignment or not. Possible values: * * \c 1: Perform the assignment `X = Y`. * * \c 0: Keep the original value of \p X. * * \note This function is equivalent to * `if( assign ) mbedtls_mpi_copy( X, Y );` * except that it avoids leaking any information about whether * the assignment was done or not (the above code may leak * information through branch prediction and/or memory access * patterns analysis). * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign ); /** * \brief Perform a safe conditional swap which doesn't * reveal whether the condition was true or not. * * \param X The first MPI. This must be initialized. * \param Y The second MPI. This must be initialized. * \param assign The condition deciding whether to perform * the swap or not. Possible values: * * \c 1: Swap the values of \p X and \p Y. * * \c 0: Keep the original values of \p X and \p Y. * * \note This function is equivalent to * if( assign ) mbedtls_mpi_swap( X, Y ); * except that it avoids leaking any information about whether * the assignment was done or not (the above code may leak * information through branch prediction and/or memory access * patterns analysis). * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. * */ int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign ); /** * \brief Store integer value in MPI. * * \param X The MPI to set. This must be initialized. * \param z The value to use. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z ); /** * \brief Get a specific bit from an MPI. * * \param X The MPI to query. This must be initialized. * \param pos Zero-based index of the bit to query. * * \return \c 0 or \c 1 on success, depending on whether bit \c pos * of \c X is unset or set. * \return A negative error code on failure. */ int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos ); /** * \brief Modify a specific bit in an MPI. * * \note This function will grow the target MPI if necessary to set a * bit to \c 1 in a not yet existing limb. It will not grow if * the bit should be set to \c 0. * * \param X The MPI to modify. This must be initialized. * \param pos Zero-based index of the bit to modify. * \param val The desired value of bit \c pos: \c 0 or \c 1. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val ); /** * \brief Return the number of bits of value \c 0 before the * least significant bit of value \c 1. * * \note This is the same as the zero-based index of * the least significant bit of value \c 1. * * \param X The MPI to query. * * \return The number of bits of value \c 0 before the least significant * bit of value \c 1 in \p X. */ size_t mbedtls_mpi_lsb( const mbedtls_mpi *X ); /** * \brief Return the number of bits up to and including the most * significant bit of value \c 1. * * * \note This is same as the one-based index of the most * significant bit of value \c 1. * * \param X The MPI to query. This must point to an initialized MPI. * * \return The number of bits up to and including the most * significant bit of value \c 1. */ size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X ); /** * \brief Return the total size of an MPI value in bytes. * * \param X The MPI to use. This must point to an initialized MPI. * * \note The value returned by this function may be less than * the number of bytes used to store \p X internally. * This happens if and only if there are trailing bytes * of value zero. * * \return The least number of bytes capable of storing * the absolute value of \p X. */ size_t mbedtls_mpi_size( const mbedtls_mpi *X ); /** * \brief Import an MPI from an ASCII string. * * \param X The destination MPI. This must point to an initialized MPI. * \param radix The numeric base of the input string. * \param s Null-terminated string buffer. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s ); /** * \brief Export an MPI to an ASCII string. * * \param X The source MPI. This must point to an initialized MPI. * \param radix The numeric base of the output string. * \param buf The buffer to write the string to. This must be writable * buffer of length \p buflen Bytes. * \param buflen The available size in Bytes of \p buf. * \param olen The address at which to store the length of the string * written, including the final \c NULL byte. This must * not be \c NULL. * * \note You can call this function with `buflen == 0` to obtain the * minimum required buffer size in `*olen`. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if the target buffer \p buf * is too small to hold the value of \p X in the desired base. * In this case, `*olen` is nonetheless updated to contain the * size of \p buf required for a successful call. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, char *buf, size_t buflen, size_t *olen ); #if defined(MBEDTLS_FS_IO) /** * \brief Read an MPI from a line in an opened file. * * \param X The destination MPI. This must point to an initialized MPI. * \param radix The numeric base of the string representation used * in the source line. * \param fin The input file handle to use. This must not be \c NULL. * * \note On success, this function advances the file stream * to the end of the current line or to EOF. * * The function returns \c 0 on an empty line. * * Leading whitespaces are ignored, as is a * '0x' prefix for radix \c 16. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if the file read buffer * is too small. * \return Another negative error code on failure. */ int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin ); /** * \brief Export an MPI into an opened file. * * \param p A string prefix to emit prior to the MPI data. * For example, this might be a label, or "0x" when * printing in base \c 16. This may be \c NULL if no prefix * is needed. * \param X The source MPI. This must point to an initialized MPI. * \param radix The numeric base to be used in the emitted string. * \param fout The output file handle. This may be \c NULL, in which case * the output is written to \c stdout. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout ); #endif /* MBEDTLS_FS_IO */ /** * \brief Import an MPI from unsigned big endian binary data. * * \param X The destination MPI. This must point to an initialized MPI. * \param buf The input buffer. This must be a readable buffer of length * \p buflen Bytes. * \param buflen The length of the input buffer \p p in Bytes. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen ); /** * \brief Export an MPI into unsigned big endian binary data * of fixed size. * * \param X The source MPI. This must point to an initialized MPI. * \param buf The output buffer. This must be a writable buffer of length * \p buflen Bytes. * \param buflen The size of the output buffer \p buf in Bytes. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if \p buf isn't * large enough to hold the value of \p X. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen ); /** * \brief Perform a left-shift on an MPI: X <<= count * * \param X The MPI to shift. This must point to an initialized MPI. * \param count The number of bits to shift by. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count ); /** * \brief Perform a right-shift on an MPI: X >>= count * * \param X The MPI to shift. This must point to an initialized MPI. * \param count The number of bits to shift by. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count ); /** * \brief Compare the absolute values of two MPIs. * * \param X The left-hand MPI. This must point to an initialized MPI. * \param Y The right-hand MPI. This must point to an initialized MPI. * * \return \c 1 if `|X|` is greater than `|Y|`. * \return \c -1 if `|X|` is lesser than `|Y|`. * \return \c 0 if `|X|` is equal to `|Y|`. */ int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y ); /** * \brief Compare two MPIs. * * \param X The left-hand MPI. This must point to an initialized MPI. * \param Y The right-hand MPI. This must point to an initialized MPI. * * \return \c 1 if \p X is greater than \p Y. * \return \c -1 if \p X is lesser than \p Y. * \return \c 0 if \p X is equal to \p Y. */ int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y ); /** * \brief Compare an MPI with an integer. * * \param X The left-hand MPI. This must point to an initialized MPI. * \param z The integer value to compare \p X to. * * \return \c 1 if \p X is greater than \p z. * \return \c -1 if \p X is lesser than \p z. * \return \c 0 if \p X is equal to \p z. */ int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z ); /** * \brief Perform an unsigned addition of MPIs: X = |A| + |B| * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first summand. This must point to an initialized MPI. * \param B The second summand. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform an unsigned subtraction of MPIs: X = |A| - |B| * * \param X The destination MPI. This must point to an initialized MPI. * \param A The minuend. This must point to an initialized MPI. * \param B The subtrahend. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p B is greater than \p A. * \return Another negative error code on different kinds of failure. * */ int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a signed addition of MPIs: X = A + B * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first summand. This must point to an initialized MPI. * \param B The second summand. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a signed subtraction of MPIs: X = A - B * * \param X The destination MPI. This must point to an initialized MPI. * \param A The minuend. This must point to an initialized MPI. * \param B The subtrahend. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a signed addition of an MPI and an integer: X = A + b * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first summand. This must point to an initialized MPI. * \param b The second summand. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); /** * \brief Perform a signed subtraction of an MPI and an integer: * X = A - b * * \param X The destination MPI. This must point to an initialized MPI. * \param A The minuend. This must point to an initialized MPI. * \param b The subtrahend. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); /** * \brief Perform a multiplication of two MPIs: X = A * B * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first factor. This must point to an initialized MPI. * \param B The second factor. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. * */ int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a multiplication of an MPI with an unsigned integer: * X = A * b * * \param X The destination MPI. This must point to an initialized MPI. * \param A The first factor. This must point to an initialized MPI. * \param b The second factor. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. * */ int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b ); /** * \brief Perform a division with remainder of two MPIs: * A = Q * B + R * * \param Q The destination MPI for the quotient. * This may be \c NULL if the value of the * quotient is not needed. * \param R The destination MPI for the remainder value. * This may be \c NULL if the value of the * remainder is not needed. * \param A The dividend. This must point to an initialized MPi. * \param B The divisor. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p B equals zero. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a division with remainder of an MPI by an integer: * A = Q * b + R * * \param Q The destination MPI for the quotient. * This may be \c NULL if the value of the * quotient is not needed. * \param R The destination MPI for the remainder value. * This may be \c NULL if the value of the * remainder is not needed. * \param A The dividend. This must point to an initialized MPi. * \param b The divisor. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p b equals zero. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b ); /** * \brief Perform a modular reduction. R = A mod B * * \param R The destination MPI for the residue value. * This must point to an initialized MPI. * \param A The MPI to compute the residue of. * This must point to an initialized MPI. * \param B The base of the modular reduction. * This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p B equals zero. * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p B is negative. * \return Another negative error code on different kinds of failure. * */ int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Perform a modular reduction with respect to an integer. * r = A mod b * * \param r The address at which to store the residue. * This must not be \c NULL. * \param A The MPI to compute the residue of. * This must point to an initialized MPi. * \param b The integer base of the modular reduction. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if \p b equals zero. * \return #MBEDTLS_ERR_MPI_NEGATIVE_VALUE if \p b is negative. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b ); /** * \brief Perform a sliding-window exponentiation: X = A^E mod N * * \param X The destination MPI. This must point to an initialized MPI. * \param A The base of the exponentiation. * This must point to an initialized MPI. * \param E The exponent MPI. This must point to an initialized MPI. * \param N The base for the modular reduction. This must point to an * initialized MPI. * \param _RR A helper MPI depending solely on \p N which can be used to * speed-up multiple modular exponentiations for the same value * of \p N. This may be \c NULL. If it is not \c NULL, it must * point to an initialized MPI. If it hasn't been used after * the call to mbedtls_mpi_init(), this function will compute * the helper value and store it in \p _RR for reuse on * subsequent calls to this function. Otherwise, the function * will assume that \p _RR holds the helper value set by a * previous call to mbedtls_mpi_exp_mod(), and reuse it. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if \c N is negative or * even, or if \c E is negative. * \return Another negative error code on different kinds of failures. * */ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR ); /** * \brief Fill an MPI with a number of random bytes. * * \param X The destination MPI. This must point to an initialized MPI. * \param size The number of random bytes to generate. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on failure. * * \note The bytes obtained from the RNG are interpreted * as a big-endian representation of an MPI; this can * be relevant in applications like deterministic ECDSA. */ int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Compute the greatest common divisor: G = gcd(A, B) * * \param G The destination MPI. This must point to an initialized MPI. * \param A The first operand. This must point to an initialized MPI. * \param B The second operand. This must point to an initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return Another negative error code on different kinds of failure. */ int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B ); /** * \brief Compute the modular inverse: X = A^-1 mod N * * \param X The destination MPI. This must point to an initialized MPI. * \param A The MPI to calculate the modular inverse of. This must point * to an initialized MPI. * \param N The base of the modular inversion. This must point to an * initialized MPI. * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if \p N is less than * or equal to one. * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p has no modular inverse * with respect to \p N. */ int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Perform a Miller-Rabin primality test with error * probability of 2-80. * * \deprecated Superseded by mbedtls_mpi_is_prime_ext() which allows * specifying the number of Miller-Rabin rounds. * * \param X The MPI to check for primality. * This must point to an initialized MPI. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. * This may be \c NULL if \p f_rng doesn't use a * context parameter. * * \return \c 0 if successful, i.e. \p X is probably prime. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p X is not prime. * \return Another negative error code on other kinds of failure. */ MBEDTLS_DEPRECATED int mbedtls_mpi_is_prime( const mbedtls_mpi *X, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Miller-Rabin primality test. * * \warning If \p X is potentially generated by an adversary, for example * when validating cryptographic parameters that you didn't * generate yourself and that are supposed to be prime, then * \p rounds should be at least the half of the security * strength of the cryptographic algorithm. On the other hand, * if \p X is chosen uniformly or non-adversially (as is the * case when mbedtls_mpi_gen_prime calls this function), then * \p rounds can be much lower. * * \param X The MPI to check for primality. * This must point to an initialized MPI. * \param rounds The number of bases to perform the Miller-Rabin primality * test for. The probability of returning 0 on a composite is * at most 2-2*\p rounds. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. * This may be \c NULL if \p f_rng doesn't use * a context parameter. * * \return \c 0 if successful, i.e. \p X is probably prime. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if \p X is not prime. * \return Another negative error code on other kinds of failure. */ int mbedtls_mpi_is_prime_ext( const mbedtls_mpi *X, int rounds, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Flags for mbedtls_mpi_gen_prime() * * Each of these flags is a constraint on the result X returned by * mbedtls_mpi_gen_prime(). */ typedef enum { MBEDTLS_MPI_GEN_PRIME_FLAG_DH = 0x0001, /**< (X-1)/2 is prime too */ MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR = 0x0002, /**< lower error rate from 2-80 to 2-128 */ } mbedtls_mpi_gen_prime_flag_t; /** * \brief Generate a prime number. * * \param X The destination MPI to store the generated prime in. * This must point to an initialized MPi. * \param nbits The required size of the destination MPI in bits. * This must be between \c 3 and #MBEDTLS_MPI_MAX_BITS. * \param flags A mask of flags of type #mbedtls_mpi_gen_prime_flag_t. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. * This may be \c NULL if \p f_rng doesn't use * a context parameter. * * \return \c 0 if successful, in which case \p X holds a * probably prime number. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed. * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if `nbits` is not between * \c 3 and #MBEDTLS_MPI_MAX_BITS. */ int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int flags, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_mpi_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* bignum.h */ fldigi-4.2.05/src/include/mbedtls/entropy_poll.h0000664000175000017500000000662114611711171016533 00000000000000/** * \file entropy_poll.h * * \brief Platform-specific and custom entropy polling functions */ /* * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ENTROPY_POLL_H #define MBEDTLS_ENTROPY_POLL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #ifdef __cplusplus extern "C" { #endif /* * Default thresholds for built-in sources, in bytes */ #define MBEDTLS_ENTROPY_MIN_PLATFORM 32 /**< Minimum for platform source */ #define MBEDTLS_ENTROPY_MIN_HAVEGE 32 /**< Minimum for HAVEGE */ #define MBEDTLS_ENTROPY_MIN_HARDCLOCK 4 /**< Minimum for mbedtls_timing_hardclock() */ #if !defined(MBEDTLS_ENTROPY_MIN_HARDWARE) #define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Minimum for the hardware source */ #endif /** * \brief Entropy poll callback that provides 0 entropy. */ #if defined(MBEDTLS_TEST_NULL_ENTROPY) int mbedtls_null_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) /** * \brief Platform-specific entropy poll callback */ int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if defined(MBEDTLS_HAVEGE_C) /** * \brief HAVEGE based entropy poll callback * * Requires an HAVEGE state as its data pointer. */ int mbedtls_havege_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if defined(MBEDTLS_TIMING_C) /** * \brief mbedtls_timing_hardclock-based entropy poll callback */ int mbedtls_hardclock_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) /** * \brief Entropy poll callback for a hardware source * * \warning This is not provided by mbed TLS! * See \c MBEDTLS_ENTROPY_HARDWARE_ALT in config.h. * * \note This must accept NULL as its first argument. */ int mbedtls_hardware_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) /** * \brief Entropy poll callback for a non-volatile seed file * * \note This must accept NULL as its first argument. */ int mbedtls_nv_seed_poll( void *data, unsigned char *output, size_t len, size_t *olen ); #endif #ifdef __cplusplus } #endif #endif /* entropy_poll.h */ fldigi-4.2.05/src/include/mbedtls/ssl_internal.h0000664000175000017500000007437114611711171016511 00000000000000/** * \file ssl_internal.h * * \brief Internal functions shared by the SSL modules */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_INTERNAL_H #define MBEDTLS_SSL_INTERNAL_H #include "ssl.h" #include "cipher.h" #if defined(MBEDTLS_MD5_C) #include "md5.h" #endif #if defined(MBEDTLS_SHA1_C) #include "sha1.h" #endif #if defined(MBEDTLS_SHA256_C) #include "sha256.h" #endif #if defined(MBEDTLS_SHA512_C) #include "sha512.h" #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) #include "ecjpake.h" #endif #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* Determine minimum supported version */ #define MBEDTLS_SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 #if defined(MBEDTLS_SSL_PROTO_SSL3) #define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 #else #if defined(MBEDTLS_SSL_PROTO_TLS1) #define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 #else #if defined(MBEDTLS_SSL_PROTO_TLS1_1) #define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 #else #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ #endif /* MBEDTLS_SSL_PROTO_TLS1 */ #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #define MBEDTLS_SSL_MIN_VALID_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 #define MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 /* Determine maximum supported version */ #define MBEDTLS_SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 #else #if defined(MBEDTLS_SSL_PROTO_TLS1_1) #define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 #else #if defined(MBEDTLS_SSL_PROTO_TLS1) #define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 #else #if defined(MBEDTLS_SSL_PROTO_SSL3) #define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #endif /* MBEDTLS_SSL_PROTO_TLS1 */ #endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ /* Shorthand for restartable ECC */ #if defined(MBEDTLS_ECP_RESTARTABLE) && \ defined(MBEDTLS_SSL_CLI_C) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #define MBEDTLS_SSL__ECP_RESTARTABLE #endif #define MBEDTLS_SSL_INITIAL_HANDSHAKE 0 #define MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS 1 /* In progress */ #define MBEDTLS_SSL_RENEGOTIATION_DONE 2 /* Done or aborted */ #define MBEDTLS_SSL_RENEGOTIATION_PENDING 3 /* Requested (server only) */ /* * DTLS retransmission states, see RFC 6347 4.2.4 * * The SENDING state is merged in PREPARING for initial sends, * but is distinct for resends. * * Note: initial state is wrong for server, but is not used anyway. */ #define MBEDTLS_SSL_RETRANS_PREPARING 0 #define MBEDTLS_SSL_RETRANS_SENDING 1 #define MBEDTLS_SSL_RETRANS_WAITING 2 #define MBEDTLS_SSL_RETRANS_FINISHED 3 /* * Allow extra bytes for record, authentication and encryption overhead: * counter (8) + header (5) + IV(16) + MAC (16-48) + padding (0-256) * and allow for a maximum of 1024 of compression expansion if * enabled. */ #if defined(MBEDTLS_ZLIB_SUPPORT) #define MBEDTLS_SSL_COMPRESSION_ADD 1024 #else #define MBEDTLS_SSL_COMPRESSION_ADD 0 #endif #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_MODE_CBC) /* Ciphersuites using HMAC */ #if defined(MBEDTLS_SHA512_C) #define MBEDTLS_SSL_MAC_ADD 48 /* SHA-384 used for HMAC */ #elif defined(MBEDTLS_SHA256_C) #define MBEDTLS_SSL_MAC_ADD 32 /* SHA-256 used for HMAC */ #else #define MBEDTLS_SSL_MAC_ADD 20 /* SHA-1 used for HMAC */ #endif #else /* AEAD ciphersuites: GCM and CCM use a 128 bits tag */ #define MBEDTLS_SSL_MAC_ADD 16 #endif #if defined(MBEDTLS_CIPHER_MODE_CBC) #define MBEDTLS_SSL_PADDING_ADD 256 #else #define MBEDTLS_SSL_PADDING_ADD 0 #endif #define MBEDTLS_SSL_PAYLOAD_OVERHEAD ( MBEDTLS_SSL_COMPRESSION_ADD + \ MBEDTLS_MAX_IV_LENGTH + \ MBEDTLS_SSL_MAC_ADD + \ MBEDTLS_SSL_PADDING_ADD \ ) #define MBEDTLS_SSL_IN_PAYLOAD_LEN ( MBEDTLS_SSL_PAYLOAD_OVERHEAD + \ ( MBEDTLS_SSL_IN_CONTENT_LEN ) ) #define MBEDTLS_SSL_OUT_PAYLOAD_LEN ( MBEDTLS_SSL_PAYLOAD_OVERHEAD + \ ( MBEDTLS_SSL_OUT_CONTENT_LEN ) ) /* The maximum number of buffered handshake messages. */ #define MBEDTLS_SSL_MAX_BUFFERED_HS 4 /* Maximum length we can advertise as our max content length for RFC 6066 max_fragment_length extension negotiation purposes (the lesser of both sizes, if they are unequal.) */ #define MBEDTLS_TLS_EXT_ADV_CONTENT_LEN ( \ (MBEDTLS_SSL_IN_CONTENT_LEN > MBEDTLS_SSL_OUT_CONTENT_LEN) \ ? ( MBEDTLS_SSL_OUT_CONTENT_LEN ) \ : ( MBEDTLS_SSL_IN_CONTENT_LEN ) \ ) /* * Check that we obey the standard's message size bounds */ #if MBEDTLS_SSL_MAX_CONTENT_LEN > 16384 #error "Bad configuration - record content too large." #endif #if MBEDTLS_SSL_IN_CONTENT_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN #error "Bad configuration - incoming record content should not be larger than MBEDTLS_SSL_MAX_CONTENT_LEN." #endif #if MBEDTLS_SSL_OUT_CONTENT_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN #error "Bad configuration - outgoing record content should not be larger than MBEDTLS_SSL_MAX_CONTENT_LEN." #endif #if MBEDTLS_SSL_IN_PAYLOAD_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN + 2048 #error "Bad configuration - incoming protected record payload too large." #endif #if MBEDTLS_SSL_OUT_PAYLOAD_LEN > MBEDTLS_SSL_MAX_CONTENT_LEN + 2048 #error "Bad configuration - outgoing protected record payload too large." #endif /* Calculate buffer sizes */ /* Note: Even though the TLS record header is only 5 bytes long, we're internally using 8 bytes to store the implicit sequence number. */ #define MBEDTLS_SSL_HEADER_LEN 13 #define MBEDTLS_SSL_IN_BUFFER_LEN \ ( ( MBEDTLS_SSL_HEADER_LEN ) + ( MBEDTLS_SSL_IN_PAYLOAD_LEN ) ) #define MBEDTLS_SSL_OUT_BUFFER_LEN \ ( ( MBEDTLS_SSL_HEADER_LEN ) + ( MBEDTLS_SSL_OUT_PAYLOAD_LEN ) ) #ifdef MBEDTLS_ZLIB_SUPPORT /* Compression buffer holds both IN and OUT buffers, so should be size of the larger */ #define MBEDTLS_SSL_COMPRESS_BUFFER_LEN ( \ ( MBEDTLS_SSL_IN_BUFFER_LEN > MBEDTLS_SSL_OUT_BUFFER_LEN ) \ ? MBEDTLS_SSL_IN_BUFFER_LEN \ : MBEDTLS_SSL_OUT_BUFFER_LEN \ ) #endif /* * TLS extension flags (for extensions with outgoing ServerHello content * that need it (e.g. for RENEGOTIATION_INFO the server already knows because * of state of the renegotiation flag, so no indicator is required) */ #define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT (1 << 0) #define MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK (1 << 1) #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Abstraction for a grid of allowed signature-hash-algorithm pairs. */ struct mbedtls_ssl_sig_hash_set_t { /* At the moment, we only need to remember a single suitable * hash algorithm per signature algorithm. As long as that's * the case - and we don't need a general lookup function - * we can implement the sig-hash-set as a map from signatures * to hash algorithms. */ mbedtls_md_type_t rsa; mbedtls_md_type_t ecdsa; }; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ /* * This structure contains the parameters only needed during handshake. */ struct mbedtls_ssl_handshake_params { /* * Handshake specific crypto variables */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) mbedtls_ssl_sig_hash_set_t hash_algs; /*!< Set of suitable sig-hash pairs */ #endif #if defined(MBEDTLS_DHM_C) mbedtls_dhm_context dhm_ctx; /*!< DHM key exchange */ #endif #if defined(MBEDTLS_ECDH_C) mbedtls_ecdh_context ecdh_ctx; /*!< ECDH key exchange */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) mbedtls_ecjpake_context ecjpake_ctx; /*!< EC J-PAKE key exchange */ #if defined(MBEDTLS_SSL_CLI_C) unsigned char *ecjpake_cache; /*!< Cache for ClientHello ext */ size_t ecjpake_cache_len; /*!< Length of cached data */ #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) const mbedtls_ecp_curve_info **curves; /*!< Supported elliptic curves */ #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) unsigned char *psk; /*!< PSK from the callback */ size_t psk_len; /*!< Length of PSK from callback */ #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_ssl_key_cert *key_cert; /*!< chosen key/cert pair (server) */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) int sni_authmode; /*!< authmode from SNI callback */ mbedtls_ssl_key_cert *sni_key_cert; /*!< key/cert list from SNI */ mbedtls_x509_crt *sni_ca_chain; /*!< trusted CAs from SNI callback */ mbedtls_x509_crl *sni_ca_crl; /*!< trusted CAs CRLs from SNI */ #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) int ecrs_enabled; /*!< Handshake supports EC restart? */ mbedtls_x509_crt_restart_ctx ecrs_ctx; /*!< restart context */ enum { /* this complements ssl->state with info on intra-state operations */ ssl_ecrs_none = 0, /*!< nothing going on (yet) */ ssl_ecrs_crt_verify, /*!< Certificate: crt_verify() */ ssl_ecrs_ske_start_processing, /*!< ServerKeyExchange: pk_verify() */ ssl_ecrs_cke_ecdh_calc_secret, /*!< ClientKeyExchange: ECDH step 2 */ ssl_ecrs_crt_vrfy_sign, /*!< CertificateVerify: pk_sign() */ } ecrs_state; /*!< current (or last) operation */ size_t ecrs_n; /*!< place for saving a length */ #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) unsigned int out_msg_seq; /*!< Outgoing handshake sequence number */ unsigned int in_msg_seq; /*!< Incoming handshake sequence number */ unsigned char *verify_cookie; /*!< Cli: HelloVerifyRequest cookie Srv: unused */ unsigned char verify_cookie_len; /*!< Cli: cookie length Srv: flag for sending a cookie */ uint32_t retransmit_timeout; /*!< Current value of timeout */ unsigned char retransmit_state; /*!< Retransmission state */ mbedtls_ssl_flight_item *flight; /*!< Current outgoing flight */ mbedtls_ssl_flight_item *cur_msg; /*!< Current message in flight */ unsigned char *cur_msg_p; /*!< Position in current message */ unsigned int in_flight_start_seq; /*!< Minimum message sequence in the flight being received */ mbedtls_ssl_transform *alt_transform_out; /*!< Alternative transform for resending messages */ unsigned char alt_out_ctr[8]; /*!< Alternative record epoch/counter for resending messages */ struct { size_t total_bytes_buffered; /*!< Cumulative size of heap allocated * buffers used for message buffering. */ uint8_t seen_ccs; /*!< Indicates if a CCS message has * been seen in the current flight. */ struct mbedtls_ssl_hs_buffer { unsigned is_valid : 1; unsigned is_fragmented : 1; unsigned is_complete : 1; unsigned char *data; size_t data_len; } hs[MBEDTLS_SSL_MAX_BUFFERED_HS]; struct { unsigned char *data; size_t len; unsigned epoch; } future_record; } buffering; uint16_t mtu; /*!< Handshake mtu, used to fragment outgoing messages */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* * Checksum contexts */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_context fin_md5; mbedtls_sha1_context fin_sha1; #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_context fin_sha256; #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_context fin_sha512; #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ void (*update_checksum)(mbedtls_ssl_context *, const unsigned char *, size_t); void (*calc_verify)(mbedtls_ssl_context *, unsigned char *); void (*calc_finished)(mbedtls_ssl_context *, unsigned char *, int); int (*tls_prf)(const unsigned char *, size_t, const char *, const unsigned char *, size_t, unsigned char *, size_t); size_t pmslen; /*!< premaster length */ unsigned char randbytes[64]; /*!< random bytes */ unsigned char premaster[MBEDTLS_PREMASTER_SIZE]; /*!< premaster secret */ int resume; /*!< session resume indicator*/ int max_major_ver; /*!< max. major version client*/ int max_minor_ver; /*!< max. minor version client*/ int cli_exts; /*!< client extension presence*/ #if defined(MBEDTLS_SSL_SESSION_TICKETS) int new_session_ticket; /*!< use NewSessionTicket? */ #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) int extended_ms; /*!< use Extended Master Secret? */ #endif #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) unsigned int async_in_progress : 1; /*!< an asynchronous operation is in progress */ #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) /** Asynchronous operation context. This field is meant for use by the * asynchronous operation callbacks (mbedtls_ssl_config::f_async_sign_start, * mbedtls_ssl_config::f_async_decrypt_start, * mbedtls_ssl_config::f_async_resume, mbedtls_ssl_config::f_async_cancel). * The library does not use it internally. */ void *user_async_ctx; #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ }; typedef struct mbedtls_ssl_hs_buffer mbedtls_ssl_hs_buffer; /* * This structure contains a full set of runtime transform parameters * either in negotiation or active. */ struct mbedtls_ssl_transform { /* * Session specific crypto layer */ const mbedtls_ssl_ciphersuite_t *ciphersuite_info; /*!< Chosen cipersuite_info */ unsigned int keylen; /*!< symmetric key length (bytes) */ size_t minlen; /*!< min. ciphertext length */ size_t ivlen; /*!< IV length */ size_t fixed_ivlen; /*!< Fixed part of IV (AEAD) */ size_t maclen; /*!< MAC length */ unsigned char iv_enc[16]; /*!< IV (encryption) */ unsigned char iv_dec[16]; /*!< IV (decryption) */ #if defined(MBEDTLS_SSL_PROTO_SSL3) /* Needed only for SSL v3.0 secret */ unsigned char mac_enc[20]; /*!< SSL v3.0 secret (enc) */ unsigned char mac_dec[20]; /*!< SSL v3.0 secret (dec) */ #endif /* MBEDTLS_SSL_PROTO_SSL3 */ mbedtls_md_context_t md_ctx_enc; /*!< MAC (encryption) */ mbedtls_md_context_t md_ctx_dec; /*!< MAC (decryption) */ mbedtls_cipher_context_t cipher_ctx_enc; /*!< encryption context */ mbedtls_cipher_context_t cipher_ctx_dec; /*!< decryption context */ /* * Session specific compression layer */ #if defined(MBEDTLS_ZLIB_SUPPORT) z_stream ctx_deflate; /*!< compression context */ z_stream ctx_inflate; /*!< decompression context */ #endif }; #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * List of certificate + private key pairs */ struct mbedtls_ssl_key_cert { mbedtls_x509_crt *cert; /*!< cert */ mbedtls_pk_context *key; /*!< private key */ mbedtls_ssl_key_cert *next; /*!< next key/cert pair */ }; #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_PROTO_DTLS) /* * List of handshake messages kept around for resending */ struct mbedtls_ssl_flight_item { unsigned char *p; /*!< message, including handshake headers */ size_t len; /*!< length of p */ unsigned char type; /*!< type of the message: handshake or CCS */ mbedtls_ssl_flight_item *next; /*!< next handshake message(s) */ }; #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* Find an entry in a signature-hash set matching a given hash algorithm. */ mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set, mbedtls_pk_type_t sig_alg ); /* Add a signature-hash-pair to a signature-hash set */ void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set, mbedtls_pk_type_t sig_alg, mbedtls_md_type_t md_alg ); /* Allow exactly one hash algorithm for each signature. */ void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set, mbedtls_md_type_t md_alg ); /* Setup an empty signature-hash set */ static inline void mbedtls_ssl_sig_hash_set_init( mbedtls_ssl_sig_hash_set_t *set ) { mbedtls_ssl_sig_hash_set_const_hash( set, MBEDTLS_MD_NONE ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2) && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ /** * \brief Free referenced items in an SSL transform context and clear * memory * * \param transform SSL transform context */ void mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform ); /** * \brief Free referenced items in an SSL handshake context and clear * memory * * \param ssl SSL context */ void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl ); int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl ); int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl ); void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl ); int mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl ); void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl ); int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl ); int mbedtls_ssl_handle_message_type( mbedtls_ssl_context *ssl ); int mbedtls_ssl_prepare_handshake_record( mbedtls_ssl_context *ssl ); void mbedtls_ssl_update_handshake_status( mbedtls_ssl_context *ssl ); /** * \brief Update record layer * * This function roughly separates the implementation * of the logic of (D)TLS from the implementation * of the secure transport. * * \param ssl The SSL context to use. * \param update_hs_digest This indicates if the handshake digest * should be automatically updated in case * a handshake message is found. * * \return 0 or non-zero error code. * * \note A clarification on what is called 'record layer' here * is in order, as many sensible definitions are possible: * * The record layer takes as input an untrusted underlying * transport (stream or datagram) and transforms it into * a serially multiplexed, secure transport, which * conceptually provides the following: * * (1) Three datagram based, content-agnostic transports * for handshake, alert and CCS messages. * (2) One stream- or datagram-based transport * for application data. * (3) Functionality for changing the underlying transform * securing the contents. * * The interface to this functionality is given as follows: * * a Updating * [Currently implemented by mbedtls_ssl_read_record] * * Check if and on which of the four 'ports' data is pending: * Nothing, a controlling datagram of type (1), or application * data (2). In any case data is present, internal buffers * provide access to the data for the user to process it. * Consumption of type (1) datagrams is done automatically * on the next update, invalidating that the internal buffers * for previous datagrams, while consumption of application * data (2) is user-controlled. * * b Reading of application data * [Currently manual adaption of ssl->in_offt pointer] * * As mentioned in the last paragraph, consumption of data * is different from the automatic consumption of control * datagrams (1) because application data is treated as a stream. * * c Tracking availability of application data * [Currently manually through decreasing ssl->in_msglen] * * For efficiency and to retain datagram semantics for * application data in case of DTLS, the record layer * provides functionality for checking how much application * data is still available in the internal buffer. * * d Changing the transformation securing the communication. * * Given an opaque implementation of the record layer in the * above sense, it should be possible to implement the logic * of (D)TLS on top of it without the need to know anything * about the record layer's internals. This is done e.g. * in all the handshake handling functions, and in the * application data reading function mbedtls_ssl_read. * * \note The above tries to give a conceptual picture of the * record layer, but the current implementation deviates * from it in some places. For example, our implementation of * the update functionality through mbedtls_ssl_read_record * discards datagrams depending on the current state, which * wouldn't fall under the record layer's responsibility * following the above definition. * */ int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl, unsigned update_hs_digest ); int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want ); int mbedtls_ssl_write_handshake_msg( mbedtls_ssl_context *ssl ); int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush ); int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl ); int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ); int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ); int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ); int mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl ); int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ); int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl ); void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl, const mbedtls_ssl_ciphersuite_t *ciphersuite_info ); #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex ); #endif #if defined(MBEDTLS_PK_C) unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk ); unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type ); mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig ); #endif mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash ); unsigned char mbedtls_ssl_hash_from_md_alg( int md ); int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md ); #if defined(MBEDTLS_ECP_C) int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id ); #endif #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl, mbedtls_md_type_t md ); #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) static inline mbedtls_pk_context *mbedtls_ssl_own_key( mbedtls_ssl_context *ssl ) { mbedtls_ssl_key_cert *key_cert; if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL ) key_cert = ssl->handshake->key_cert; else key_cert = ssl->conf->key_cert; return( key_cert == NULL ? NULL : key_cert->key ); } static inline mbedtls_x509_crt *mbedtls_ssl_own_cert( mbedtls_ssl_context *ssl ) { mbedtls_ssl_key_cert *key_cert; if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL ) key_cert = ssl->handshake->key_cert; else key_cert = ssl->conf->key_cert; return( key_cert == NULL ? NULL : key_cert->cert ); } /* * Check usage of a certificate wrt extensions: * keyUsage, extendedKeyUsage (later), and nSCertType (later). * * Warning: cert_endpoint is the endpoint of the cert (ie, of our peer when we * check a cert we received from them)! * * Return 0 if everything is OK, -1 if not. */ int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert, const mbedtls_ssl_ciphersuite_t *ciphersuite, int cert_endpoint, uint32_t *flags ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ void mbedtls_ssl_write_version( int major, int minor, int transport, unsigned char ver[2] ); void mbedtls_ssl_read_version( int *major, int *minor, int transport, const unsigned char ver[2] ); static inline size_t mbedtls_ssl_hdr_len( const mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) return( 13 ); #else ((void) ssl); #endif return( 5 ); } static inline size_t mbedtls_ssl_hs_hdr_len( const mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) return( 12 ); #else ((void) ssl); #endif return( 4 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) void mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl ); void mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl ); int mbedtls_ssl_resend( mbedtls_ssl_context *ssl ); int mbedtls_ssl_flight_transmit( mbedtls_ssl_context *ssl ); #endif /* Visible for testing purposes only */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) int mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl ); void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl ); #endif /* constant-time buffer comparison */ static inline int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n ) { size_t i; volatile const unsigned char *A = (volatile const unsigned char *) a; volatile const unsigned char *B = (volatile const unsigned char *) b; volatile unsigned char diff = 0; for( i = 0; i < n; i++ ) { /* Read volatile data in order before computing diff. * This avoids IAR compiler warning: * 'the order of volatile accesses is undefined ..' */ unsigned char x = A[i], y = B[i]; diff |= x ^ y; } return( diff ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl, unsigned char *output, unsigned char *data, size_t data_len ); #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl, unsigned char *hash, size_t *hashlen, unsigned char *data, size_t data_len, mbedtls_md_type_t md_alg ); #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ #ifdef __cplusplus } #endif #endif /* ssl_internal.h */ fldigi-4.2.05/src/include/mbedtls/aes.h0000664000175000017500000007154314611711171014562 00000000000000/** * \file aes.h * * \brief This file contains AES definitions and functions. * * The Advanced Encryption Standard (AES) specifies a FIPS-approved * cryptographic algorithm that can be used to protect electronic * data. * * The AES algorithm is a symmetric block cipher that can * encrypt and decrypt information. For more information, see * FIPS Publication 197: Advanced Encryption Standard and * ISO/IEC 18033-2:2006: Information technology -- Security * techniques -- Encryption algorithms -- Part 2: Asymmetric * ciphers. * * The AES-XTS block mode is standardized by NIST SP 800-38E * * and described in detail by IEEE P1619 * . */ /* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved. * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_AES_H #define MBEDTLS_AES_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* padlock.c and aesni.c rely on these values! */ #define MBEDTLS_AES_ENCRYPT 1 /**< AES encryption. */ #define MBEDTLS_AES_DECRYPT 0 /**< AES decryption. */ /* Error codes in range 0x0020-0x0022 */ #define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH -0x0020 /**< Invalid key length. */ #define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH -0x0022 /**< Invalid data input length. */ /* Error codes in range 0x0021-0x0025 */ #define MBEDTLS_ERR_AES_BAD_INPUT_DATA -0x0021 /**< Invalid input data. */ /* MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE is deprecated and should not be used. */ #define MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE -0x0023 /**< Feature not available. For example, an unsupported AES key size. */ /* MBEDTLS_ERR_AES_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_AES_HW_ACCEL_FAILED -0x0025 /**< AES hardware accelerator failed. */ #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_AES_ALT) // Regular implementation // /** * \brief The AES context-type definition. */ typedef struct mbedtls_aes_context { int nr; /*!< The number of rounds. */ uint32_t *rk; /*!< AES round keys. */ uint32_t buf[68]; /*!< Unaligned data buffer. This buffer can hold 32 extra Bytes, which can be used for one of the following purposes:
  • Alignment if VIA padlock is used.
  • Simplifying key expansion in the 256-bit case by generating an extra round key.
*/ } mbedtls_aes_context; #if defined(MBEDTLS_CIPHER_MODE_XTS) /** * \brief The AES XTS context-type definition. */ typedef struct mbedtls_aes_xts_context { mbedtls_aes_context crypt; /*!< The AES context to use for AES block encryption or decryption. */ mbedtls_aes_context tweak; /*!< The AES context used for tweak computation. */ } mbedtls_aes_xts_context; #endif /* MBEDTLS_CIPHER_MODE_XTS */ #else /* MBEDTLS_AES_ALT */ #include "aes_alt.h" #endif /* MBEDTLS_AES_ALT */ /** * \brief This function initializes the specified AES context. * * It must be the first API called before using * the context. * * \param ctx The AES context to initialize. This must not be \c NULL. */ void mbedtls_aes_init( mbedtls_aes_context *ctx ); /** * \brief This function releases and clears the specified AES context. * * \param ctx The AES context to clear. * If this is \c NULL, this function does nothing. * Otherwise, the context must have been at least initialized. */ void mbedtls_aes_free( mbedtls_aes_context *ctx ); #if defined(MBEDTLS_CIPHER_MODE_XTS) /** * \brief This function initializes the specified AES XTS context. * * It must be the first API called before using * the context. * * \param ctx The AES XTS context to initialize. This must not be \c NULL. */ void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx ); /** * \brief This function releases and clears the specified AES XTS context. * * \param ctx The AES XTS context to clear. * If this is \c NULL, this function does nothing. * Otherwise, the context must have been at least initialized. */ void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx ); #endif /* MBEDTLS_CIPHER_MODE_XTS */ /** * \brief This function sets the encryption key. * * \param ctx The AES context to which the key should be bound. * It must be initialized. * \param key The encryption key. * This must be a readable buffer of size \p keybits bits. * \param keybits The size of data passed in bits. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief This function sets the decryption key. * * \param ctx The AES context to which the key should be bound. * It must be initialized. * \param key The decryption key. * This must be a readable buffer of size \p keybits bits. * \param keybits The size of data passed. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits ); #if defined(MBEDTLS_CIPHER_MODE_XTS) /** * \brief This function prepares an XTS context for encryption and * sets the encryption key. * * \param ctx The AES XTS context to which the key should be bound. * It must be initialized. * \param key The encryption key. This is comprised of the XTS key1 * concatenated with the XTS key2. * This must be a readable buffer of size \p keybits bits. * \param keybits The size of \p key passed in bits. Valid options are: *
  • 256 bits (each of key1 and key2 is a 128-bit key)
  • *
  • 512 bits (each of key1 and key2 is a 256-bit key)
* * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief This function prepares an XTS context for decryption and * sets the decryption key. * * \param ctx The AES XTS context to which the key should be bound. * It must be initialized. * \param key The decryption key. This is comprised of the XTS key1 * concatenated with the XTS key2. * This must be a readable buffer of size \p keybits bits. * \param keybits The size of \p key passed in bits. Valid options are: *
  • 256 bits (each of key1 and key2 is a 128-bit key)
  • *
  • 512 bits (each of key1 and key2 is a 256-bit key)
* * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure. */ int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx, const unsigned char *key, unsigned int keybits ); #endif /* MBEDTLS_CIPHER_MODE_XTS */ /** * \brief This function performs an AES single-block encryption or * decryption operation. * * It performs the operation defined in the \p mode parameter * (encrypt or decrypt), on the input data buffer defined in * the \p input parameter. * * mbedtls_aes_init(), and either mbedtls_aes_setkey_enc() or * mbedtls_aes_setkey_dec() must be called before the first * call to this API with the same context. * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT. * \param input The buffer holding the input data. * It must be readable and at least \c 16 Bytes long. * \param output The buffer where the output data will be written. * It must be writeable and at least \c 16 Bytes long. * \return \c 0 on success. */ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief This function performs an AES-CBC encryption or decryption operation * on full blocks. * * It performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer defined in * the \p input parameter. * * It can be called as many times as needed, until all the input * data is processed. mbedtls_aes_init(), and either * mbedtls_aes_setkey_enc() or mbedtls_aes_setkey_dec() must be called * before the first call to this API with the same context. * * \note This function operates on full blocks, that is, the input size * must be a multiple of the AES block size of \c 16 Bytes. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the IV, you should * either save it manually or use the cipher module instead. * * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT. * \param length The length of the input data in Bytes. This must be a * multiple of the block size (\c 16 Bytes). * \param iv Initialization vector (updated after use). * It must be a readable and writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH * on failure. */ int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_XTS) /** * \brief This function performs an AES-XTS encryption or decryption * operation for an entire XTS data unit. * * AES-XTS encrypts or decrypts blocks based on their location as * defined by a data unit number. The data unit number must be * provided by \p data_unit. * * NIST SP 800-38E limits the maximum size of a data unit to 2^20 * AES blocks. If the data unit is larger than this, this function * returns #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH. * * \param ctx The AES XTS context to use for AES XTS operations. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT. * \param length The length of a data unit in Bytes. This can be any * length between 16 bytes and 2^24 bytes inclusive * (between 1 and 2^20 block cipher blocks). * \param data_unit The address of the data unit encoded as an array of 16 * bytes in little-endian format. For disk encryption, this * is typically the index of the block device sector that * contains the data. * \param input The buffer holding the input data (which is an entire * data unit). This function reads \p length Bytes from \p * input. * \param output The buffer holding the output data (which is an entire * data unit). This function writes \p length Bytes to \p * output. * * \return \c 0 on success. * \return #MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH if \p length is * smaller than an AES block in size (16 Bytes) or if \p * length is larger than 2^20 blocks (16 MiB). */ int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx, int mode, size_t length, const unsigned char data_unit[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /** * \brief This function performs an AES-CFB128 encryption or decryption * operation. * * It performs the operation defined in the \p mode * parameter (encrypt or decrypt), on the input data buffer * defined in the \p input parameter. * * For CFB, you must set up the context with mbedtls_aes_setkey_enc(), * regardless of whether you are performing an encryption or decryption * operation, that is, regardless of the \p mode parameter. This is * because CFB mode uses the same key schedule for encryption and * decryption. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the * IV, you must either save it manually or use the cipher * module instead. * * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT. * \param length The length of the input data in Bytes. * \param iv_off The offset in IV (updated after use). * It must point to a valid \c size_t. * \param iv The initialization vector (updated after use). * It must be a readable and writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. */ int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ); /** * \brief This function performs an AES-CFB8 encryption or decryption * operation. * * It performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer defined * in the \p input parameter. * * Due to the nature of CFB, you must use the same key schedule for * both encryption and decryption operations. Therefore, you must * use the context initialized with mbedtls_aes_setkey_enc() for * both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or * #MBEDTLS_AES_DECRYPT * \param length The length of the input data. * \param iv The initialization vector (updated after use). * It must be a readable and writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. */ int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /*MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) /** * \brief This function performs an AES-OFB (Output Feedback Mode) * encryption or decryption operation. * * For OFB, you must set up the context with * mbedtls_aes_setkey_enc(), regardless of whether you are * performing an encryption or decryption operation. This is * because OFB mode uses the same key schedule for encryption and * decryption. * * The OFB operation is identical for encryption or decryption, * therefore no operation mode needs to be specified. * * \note Upon exit, the content of iv, the Initialisation Vector, is * updated so that you can call the same function again on the next * block(s) of data and get the same result as if it was encrypted * in one call. This allows a "streaming" usage, by initialising * iv_off to 0 before the first call, and preserving its value * between calls. * * For non-streaming use, the iv should be initialised on each call * to a unique value, and iv_off set to 0 on each call. * * If you need to retain the contents of the initialisation vector, * you must either save it manually or use the cipher module * instead. * * \warning For the OFB mode, the initialisation vector must be unique * every encryption operation. Reuse of an initialisation vector * will compromise security. * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param length The length of the input data. * \param iv_off The offset in IV (updated after use). * It must point to a valid \c size_t. * \param iv The initialization vector (updated after use). * It must be a readable and writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. */ int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /** * \brief This function performs an AES-CTR encryption or decryption * operation. * * This function performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer * defined in the \p input parameter. * * Due to the nature of CTR, you must use the same key schedule * for both encryption and decryption operations. Therefore, you * must use the context initialized with mbedtls_aes_setkey_enc() * for both #MBEDTLS_AES_ENCRYPT and #MBEDTLS_AES_DECRYPT. * * \warning You must never reuse a nonce value with the same key. Doing so * would void the encryption for the two messages encrypted with * the same nonce and key. * * There are two common strategies for managing nonces with CTR: * * 1. You can handle everything as a single message processed over * successive calls to this function. In that case, you want to * set \p nonce_counter and \p nc_off to 0 for the first call, and * then preserve the values of \p nonce_counter, \p nc_off and \p * stream_block across calls to this function as they will be * updated by this function. * * With this strategy, you must not encrypt more than 2**128 * blocks of data with the same key. * * 2. You can encrypt separate messages by dividing the \p * nonce_counter buffer in two areas: the first one used for a * per-message nonce, handled by yourself, and the second one * updated by this function internally. * * For example, you might reserve the first 12 bytes for the * per-message nonce, and the last 4 bytes for internal use. In that * case, before calling this function on a new message you need to * set the first 12 bytes of \p nonce_counter to your chosen nonce * value, the last 4 to 0, and \p nc_off to 0 (which will cause \p * stream_block to be ignored). That way, you can encrypt at most * 2**96 messages of up to 2**32 blocks each with the same key. * * The per-message nonce (or information sufficient to reconstruct * it) needs to be communicated with the ciphertext and must be unique. * The recommended way to ensure uniqueness is to use a message * counter. An alternative is to generate random nonces, but this * limits the number of messages that can be securely encrypted: * for example, with 96-bit random nonces, you should not encrypt * more than 2**32 messages with the same key. * * Note that for both stategies, sizes are measured in blocks and * that an AES block is 16 bytes. * * \warning Upon return, \p stream_block contains sensitive data. Its * content must not be written to insecure storage and should be * securely discarded as soon as it's no longer needed. * * \param ctx The AES context to use for encryption or decryption. * It must be initialized and bound to a key. * \param length The length of the input data. * \param nc_off The offset in the current \p stream_block, for * resuming within the current cipher stream. The * offset pointer should be 0 at the start of a stream. * It must point to a valid \c size_t. * \param nonce_counter The 128-bit nonce and counter. * It must be a readable-writeable buffer of \c 16 Bytes. * \param stream_block The saved stream block for resuming. This is * overwritten by the function. * It must be a readable-writeable buffer of \c 16 Bytes. * \param input The buffer holding the input data. * It must be readable and of size \p length Bytes. * \param output The buffer holding the output data. * It must be writeable and of size \p length Bytes. * * \return \c 0 on success. */ int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ /** * \brief Internal AES block encryption function. This is only * exposed to allow overriding it using * \c MBEDTLS_AES_ENCRYPT_ALT. * * \param ctx The AES context to use for encryption. * \param input The plaintext block. * \param output The output (ciphertext) block. * * \return \c 0 on success. */ int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ); /** * \brief Internal AES block decryption function. This is only * exposed to allow overriding it using see * \c MBEDTLS_AES_DECRYPT_ALT. * * \param ctx The AES context to use for decryption. * \param input The ciphertext block. * \param output The output (plaintext) block. * * \return \c 0 on success. */ int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Deprecated internal AES block encryption function * without return value. * * \deprecated Superseded by mbedtls_internal_aes_encrypt() * * \param ctx The AES context to use for encryption. * \param input Plaintext block. * \param output Output (ciphertext) block. */ MBEDTLS_DEPRECATED void mbedtls_aes_encrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ); /** * \brief Deprecated internal AES block decryption function * without return value. * * \deprecated Superseded by mbedtls_internal_aes_decrypt() * * \param ctx The AES context to use for decryption. * \param input Ciphertext block. * \param output Output (plaintext) block. */ MBEDTLS_DEPRECATED void mbedtls_aes_decrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_aes_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* aes.h */ fldigi-4.2.05/src/include/mbedtls/pkcs11.h0000664000175000017500000001325514611711171015110 00000000000000/** * \file pkcs11.h * * \brief Wrapper for PKCS#11 library libpkcs11-helper * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PKCS11_H #define MBEDTLS_PKCS11_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PKCS11_C) #include "x509_crt.h" #include #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #ifdef __cplusplus extern "C" { #endif /** * Context for PKCS #11 private keys. */ typedef struct mbedtls_pkcs11_context { pkcs11h_certificate_t pkcs11h_cert; int len; } mbedtls_pkcs11_context; /** * Initialize a mbedtls_pkcs11_context. * (Just making memory references valid.) */ void mbedtls_pkcs11_init( mbedtls_pkcs11_context *ctx ); /** * Fill in a mbed TLS certificate, based on the given PKCS11 helper certificate. * * \param cert X.509 certificate to fill * \param pkcs11h_cert PKCS #11 helper certificate * * \return 0 on success. */ int mbedtls_pkcs11_x509_cert_bind( mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11h_cert ); /** * Set up a mbedtls_pkcs11_context storing the given certificate. Note that the * mbedtls_pkcs11_context will take over control of the certificate, freeing it when * done. * * \param priv_key Private key structure to fill. * \param pkcs11_cert PKCS #11 helper certificate * * \return 0 on success */ int mbedtls_pkcs11_priv_key_bind( mbedtls_pkcs11_context *priv_key, pkcs11h_certificate_t pkcs11_cert ); /** * Free the contents of the given private key context. Note that the structure * itself is not freed. * * \param priv_key Private key structure to cleanup */ void mbedtls_pkcs11_priv_key_free( mbedtls_pkcs11_context *priv_key ); /** * \brief Do an RSA private key decrypt, then remove the message * padding * * \param ctx PKCS #11 context * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature * \param input buffer holding the encrypted data * \param output buffer that will hold the plaintext * \param olen will contain the plaintext length * \param output_max_len maximum length of the output buffer * * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code * * \note The output buffer must be as large as the size * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise * an error is thrown. */ int mbedtls_pkcs11_decrypt( mbedtls_pkcs11_context *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); /** * \brief Do a private RSA to sign a message digest * * \param ctx PKCS #11 context * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) * \param hashlen message digest length (for MBEDTLS_MD_NONE only) * \param hash buffer holding the message digest * \param sig buffer that will hold the ciphertext * * \return 0 if the signing operation was successful, * or an MBEDTLS_ERR_RSA_XXX error code * * \note The "sig" buffer must be as large as the size * of ctx->N (eg. 128 bytes if RSA-1024 is used). */ int mbedtls_pkcs11_sign( mbedtls_pkcs11_context *ctx, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); /** * SSL/TLS wrappers for PKCS#11 functions */ static inline int mbedtls_ssl_pkcs11_decrypt( void *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ) { return mbedtls_pkcs11_decrypt( (mbedtls_pkcs11_context *) ctx, mode, olen, input, output, output_max_len ); } static inline int mbedtls_ssl_pkcs11_sign( void *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { ((void) f_rng); ((void) p_rng); return mbedtls_pkcs11_sign( (mbedtls_pkcs11_context *) ctx, mode, md_alg, hashlen, hash, sig ); } static inline size_t mbedtls_ssl_pkcs11_key_len( void *ctx ) { return ( (mbedtls_pkcs11_context *) ctx )->len; } #ifdef __cplusplus } #endif #endif /* MBEDTLS_PKCS11_C */ #endif /* MBEDTLS_PKCS11_H */ fldigi-4.2.05/src/include/mbedtls/base64.h0000664000175000017500000000634714611711171015076 00000000000000/** * \file base64.h * * \brief RFC 1521 base64 encoding/decoding */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_BASE64_H #define MBEDTLS_BASE64_H #include #define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -0x002A /**< Output buffer too small. */ #define MBEDTLS_ERR_BASE64_INVALID_CHARACTER -0x002C /**< Invalid character in input. */ #ifdef __cplusplus extern "C" { #endif /** * \brief Encode a buffer into base64 format * * \param dst destination buffer * \param dlen size of the destination buffer * \param olen number of bytes written * \param src source buffer * \param slen amount of data to be encoded * * \return 0 if successful, or MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL. * *olen is always updated to reflect the amount * of data that has (or would have) been written. * If that length cannot be represented, then no data is * written to the buffer and *olen is set to the maximum * length representable as a size_t. * * \note Call this function with dlen = 0 to obtain the * required buffer size in *olen */ int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ); /** * \brief Decode a base64-formatted buffer * * \param dst destination buffer (can be NULL for checking size) * \param dlen size of the destination buffer * \param olen number of bytes written * \param src source buffer * \param slen amount of data to be decoded * * \return 0 if successful, MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL, or * MBEDTLS_ERR_BASE64_INVALID_CHARACTER if the input data is * not correct. *olen is always updated to reflect the amount * of data that has (or would have) been written. * * \note Call this function with *dst = NULL or dlen = 0 to obtain * the required buffer size in *olen */ int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_base64_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* base64.h */ fldigi-4.2.05/src/include/mbedtls/hkdf.h0000664000175000017500000001324514611711171014721 00000000000000/** * \file hkdf.h * * \brief This file contains the HKDF interface. * * The HMAC-based Extract-and-Expand Key Derivation Function (HKDF) is * specified by RFC 5869. */ /* * Copyright (C) 2016-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_HKDF_H #define MBEDTLS_HKDF_H #include "md.h" /** * \name HKDF Error codes * \{ */ #define MBEDTLS_ERR_HKDF_BAD_INPUT_DATA -0x5F80 /**< Bad input parameters to function. */ /* \} name */ #ifdef __cplusplus extern "C" { #endif /** * \brief This is the HMAC-based Extract-and-Expand Key Derivation Function * (HKDF). * * \param md A hash function; md.size denotes the length of the hash * function output in bytes. * \param salt An optional salt value (a non-secret random value); * if the salt is not provided, a string of all zeros of * md.size length is used as the salt. * \param salt_len The length in bytes of the optional \p salt. * \param ikm The input keying material. * \param ikm_len The length in bytes of \p ikm. * \param info An optional context and application specific information * string. This can be a zero-length string. * \param info_len The length of \p info in bytes. * \param okm The output keying material of \p okm_len bytes. * \param okm_len The length of the output keying material in bytes. This * must be less than or equal to 255 * md.size bytes. * * \return 0 on success. * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid. * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying * MD layer. */ int mbedtls_hkdf( const mbedtls_md_info_t *md, const unsigned char *salt, size_t salt_len, const unsigned char *ikm, size_t ikm_len, const unsigned char *info, size_t info_len, unsigned char *okm, size_t okm_len ); /** * \brief Take the input keying material \p ikm and extract from it a * fixed-length pseudorandom key \p prk. * * \warning This function should only be used if the security of it has been * studied and established in that particular context (eg. TLS 1.3 * key schedule). For standard HKDF security guarantees use * \c mbedtls_hkdf instead. * * \param md A hash function; md.size denotes the length of the * hash function output in bytes. * \param salt An optional salt value (a non-secret random value); * if the salt is not provided, a string of all zeros * of md.size length is used as the salt. * \param salt_len The length in bytes of the optional \p salt. * \param ikm The input keying material. * \param ikm_len The length in bytes of \p ikm. * \param[out] prk A pseudorandom key of at least md.size bytes. * * \return 0 on success. * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid. * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying * MD layer. */ int mbedtls_hkdf_extract( const mbedtls_md_info_t *md, const unsigned char *salt, size_t salt_len, const unsigned char *ikm, size_t ikm_len, unsigned char *prk ); /** * \brief Expand the supplied \p prk into several additional pseudorandom * keys, which is the output of the HKDF. * * \warning This function should only be used if the security of it has been * studied and established in that particular context (eg. TLS 1.3 * key schedule). For standard HKDF security guarantees use * \c mbedtls_hkdf instead. * * \param md A hash function; md.size denotes the length of the hash * function output in bytes. * \param prk A pseudorandom key of at least md.size bytes. \p prk is * usually the output from the HKDF extract step. * \param prk_len The length in bytes of \p prk. * \param info An optional context and application specific information * string. This can be a zero-length string. * \param info_len The length of \p info in bytes. * \param okm The output keying material of \p okm_len bytes. * \param okm_len The length of the output keying material in bytes. This * must be less than or equal to 255 * md.size bytes. * * \return 0 on success. * \return #MBEDTLS_ERR_HKDF_BAD_INPUT_DATA when the parameters are invalid. * \return An MBEDTLS_ERR_MD_* error for errors returned from the underlying * MD layer. */ int mbedtls_hkdf_expand( const mbedtls_md_info_t *md, const unsigned char *prk, size_t prk_len, const unsigned char *info, size_t info_len, unsigned char *okm, size_t okm_len ); #ifdef __cplusplus } #endif #endif /* hkdf.h */ fldigi-4.2.05/src/include/mbedtls/cipher.h0000664000175000017500000011477014611711171015264 00000000000000/** * \file cipher.h * * \brief This file contains an abstraction interface for use with the cipher * primitives provided by the library. It provides a common interface to all of * the available cipher operations. * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CIPHER_H #define MBEDTLS_CIPHER_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include "mbedtls/platform_util.h" #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C) #define MBEDTLS_CIPHER_MODE_AEAD #endif #if defined(MBEDTLS_CIPHER_MODE_CBC) #define MBEDTLS_CIPHER_MODE_WITH_PADDING #endif #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \ defined(MBEDTLS_CHACHA20_C) #define MBEDTLS_CIPHER_MODE_STREAM #endif #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE -0x6080 /**< The selected feature is not available. */ #define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA -0x6100 /**< Bad input parameters. */ #define MBEDTLS_ERR_CIPHER_ALLOC_FAILED -0x6180 /**< Failed to allocate memory. */ #define MBEDTLS_ERR_CIPHER_INVALID_PADDING -0x6200 /**< Input data contains invalid padding and is rejected. */ #define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED -0x6280 /**< Decryption of block requires a full block. */ #define MBEDTLS_ERR_CIPHER_AUTH_FAILED -0x6300 /**< Authentication failed (for AEAD modes). */ #define MBEDTLS_ERR_CIPHER_INVALID_CONTEXT -0x6380 /**< The context is invalid. For example, because it was freed. */ /* MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED -0x6400 /**< Cipher hardware accelerator failed. */ #define MBEDTLS_CIPHER_VARIABLE_IV_LEN 0x01 /**< Cipher accepts IVs of variable length. */ #define MBEDTLS_CIPHER_VARIABLE_KEY_LEN 0x02 /**< Cipher accepts keys of variable length. */ #ifdef __cplusplus extern "C" { #endif /** * \brief Supported cipher types. * * \warning RC4 and DES are considered weak ciphers and their use * constitutes a security risk. Arm recommends considering stronger * ciphers instead. */ typedef enum { MBEDTLS_CIPHER_ID_NONE = 0, /**< Placeholder to mark the end of cipher ID lists. */ MBEDTLS_CIPHER_ID_NULL, /**< The identity cipher, treated as a stream cipher. */ MBEDTLS_CIPHER_ID_AES, /**< The AES cipher. */ MBEDTLS_CIPHER_ID_DES, /**< The DES cipher. */ MBEDTLS_CIPHER_ID_3DES, /**< The Triple DES cipher. */ MBEDTLS_CIPHER_ID_CAMELLIA, /**< The Camellia cipher. */ MBEDTLS_CIPHER_ID_BLOWFISH, /**< The Blowfish cipher. */ MBEDTLS_CIPHER_ID_ARC4, /**< The RC4 cipher. */ MBEDTLS_CIPHER_ID_ARIA, /**< The Aria cipher. */ MBEDTLS_CIPHER_ID_CHACHA20, /**< The ChaCha20 cipher. */ } mbedtls_cipher_id_t; /** * \brief Supported {cipher type, cipher mode} pairs. * * \warning RC4 and DES are considered weak ciphers and their use * constitutes a security risk. Arm recommends considering stronger * ciphers instead. */ typedef enum { MBEDTLS_CIPHER_NONE = 0, /**< Placeholder to mark the end of cipher-pair lists. */ MBEDTLS_CIPHER_NULL, /**< The identity stream cipher. */ MBEDTLS_CIPHER_AES_128_ECB, /**< AES cipher with 128-bit ECB mode. */ MBEDTLS_CIPHER_AES_192_ECB, /**< AES cipher with 192-bit ECB mode. */ MBEDTLS_CIPHER_AES_256_ECB, /**< AES cipher with 256-bit ECB mode. */ MBEDTLS_CIPHER_AES_128_CBC, /**< AES cipher with 128-bit CBC mode. */ MBEDTLS_CIPHER_AES_192_CBC, /**< AES cipher with 192-bit CBC mode. */ MBEDTLS_CIPHER_AES_256_CBC, /**< AES cipher with 256-bit CBC mode. */ MBEDTLS_CIPHER_AES_128_CFB128, /**< AES cipher with 128-bit CFB128 mode. */ MBEDTLS_CIPHER_AES_192_CFB128, /**< AES cipher with 192-bit CFB128 mode. */ MBEDTLS_CIPHER_AES_256_CFB128, /**< AES cipher with 256-bit CFB128 mode. */ MBEDTLS_CIPHER_AES_128_CTR, /**< AES cipher with 128-bit CTR mode. */ MBEDTLS_CIPHER_AES_192_CTR, /**< AES cipher with 192-bit CTR mode. */ MBEDTLS_CIPHER_AES_256_CTR, /**< AES cipher with 256-bit CTR mode. */ MBEDTLS_CIPHER_AES_128_GCM, /**< AES cipher with 128-bit GCM mode. */ MBEDTLS_CIPHER_AES_192_GCM, /**< AES cipher with 192-bit GCM mode. */ MBEDTLS_CIPHER_AES_256_GCM, /**< AES cipher with 256-bit GCM mode. */ MBEDTLS_CIPHER_CAMELLIA_128_ECB, /**< Camellia cipher with 128-bit ECB mode. */ MBEDTLS_CIPHER_CAMELLIA_192_ECB, /**< Camellia cipher with 192-bit ECB mode. */ MBEDTLS_CIPHER_CAMELLIA_256_ECB, /**< Camellia cipher with 256-bit ECB mode. */ MBEDTLS_CIPHER_CAMELLIA_128_CBC, /**< Camellia cipher with 128-bit CBC mode. */ MBEDTLS_CIPHER_CAMELLIA_192_CBC, /**< Camellia cipher with 192-bit CBC mode. */ MBEDTLS_CIPHER_CAMELLIA_256_CBC, /**< Camellia cipher with 256-bit CBC mode. */ MBEDTLS_CIPHER_CAMELLIA_128_CFB128, /**< Camellia cipher with 128-bit CFB128 mode. */ MBEDTLS_CIPHER_CAMELLIA_192_CFB128, /**< Camellia cipher with 192-bit CFB128 mode. */ MBEDTLS_CIPHER_CAMELLIA_256_CFB128, /**< Camellia cipher with 256-bit CFB128 mode. */ MBEDTLS_CIPHER_CAMELLIA_128_CTR, /**< Camellia cipher with 128-bit CTR mode. */ MBEDTLS_CIPHER_CAMELLIA_192_CTR, /**< Camellia cipher with 192-bit CTR mode. */ MBEDTLS_CIPHER_CAMELLIA_256_CTR, /**< Camellia cipher with 256-bit CTR mode. */ MBEDTLS_CIPHER_CAMELLIA_128_GCM, /**< Camellia cipher with 128-bit GCM mode. */ MBEDTLS_CIPHER_CAMELLIA_192_GCM, /**< Camellia cipher with 192-bit GCM mode. */ MBEDTLS_CIPHER_CAMELLIA_256_GCM, /**< Camellia cipher with 256-bit GCM mode. */ MBEDTLS_CIPHER_DES_ECB, /**< DES cipher with ECB mode. */ MBEDTLS_CIPHER_DES_CBC, /**< DES cipher with CBC mode. */ MBEDTLS_CIPHER_DES_EDE_ECB, /**< DES cipher with EDE ECB mode. */ MBEDTLS_CIPHER_DES_EDE_CBC, /**< DES cipher with EDE CBC mode. */ MBEDTLS_CIPHER_DES_EDE3_ECB, /**< DES cipher with EDE3 ECB mode. */ MBEDTLS_CIPHER_DES_EDE3_CBC, /**< DES cipher with EDE3 CBC mode. */ MBEDTLS_CIPHER_BLOWFISH_ECB, /**< Blowfish cipher with ECB mode. */ MBEDTLS_CIPHER_BLOWFISH_CBC, /**< Blowfish cipher with CBC mode. */ MBEDTLS_CIPHER_BLOWFISH_CFB64, /**< Blowfish cipher with CFB64 mode. */ MBEDTLS_CIPHER_BLOWFISH_CTR, /**< Blowfish cipher with CTR mode. */ MBEDTLS_CIPHER_ARC4_128, /**< RC4 cipher with 128-bit mode. */ MBEDTLS_CIPHER_AES_128_CCM, /**< AES cipher with 128-bit CCM mode. */ MBEDTLS_CIPHER_AES_192_CCM, /**< AES cipher with 192-bit CCM mode. */ MBEDTLS_CIPHER_AES_256_CCM, /**< AES cipher with 256-bit CCM mode. */ MBEDTLS_CIPHER_CAMELLIA_128_CCM, /**< Camellia cipher with 128-bit CCM mode. */ MBEDTLS_CIPHER_CAMELLIA_192_CCM, /**< Camellia cipher with 192-bit CCM mode. */ MBEDTLS_CIPHER_CAMELLIA_256_CCM, /**< Camellia cipher with 256-bit CCM mode. */ MBEDTLS_CIPHER_ARIA_128_ECB, /**< Aria cipher with 128-bit key and ECB mode. */ MBEDTLS_CIPHER_ARIA_192_ECB, /**< Aria cipher with 192-bit key and ECB mode. */ MBEDTLS_CIPHER_ARIA_256_ECB, /**< Aria cipher with 256-bit key and ECB mode. */ MBEDTLS_CIPHER_ARIA_128_CBC, /**< Aria cipher with 128-bit key and CBC mode. */ MBEDTLS_CIPHER_ARIA_192_CBC, /**< Aria cipher with 192-bit key and CBC mode. */ MBEDTLS_CIPHER_ARIA_256_CBC, /**< Aria cipher with 256-bit key and CBC mode. */ MBEDTLS_CIPHER_ARIA_128_CFB128, /**< Aria cipher with 128-bit key and CFB-128 mode. */ MBEDTLS_CIPHER_ARIA_192_CFB128, /**< Aria cipher with 192-bit key and CFB-128 mode. */ MBEDTLS_CIPHER_ARIA_256_CFB128, /**< Aria cipher with 256-bit key and CFB-128 mode. */ MBEDTLS_CIPHER_ARIA_128_CTR, /**< Aria cipher with 128-bit key and CTR mode. */ MBEDTLS_CIPHER_ARIA_192_CTR, /**< Aria cipher with 192-bit key and CTR mode. */ MBEDTLS_CIPHER_ARIA_256_CTR, /**< Aria cipher with 256-bit key and CTR mode. */ MBEDTLS_CIPHER_ARIA_128_GCM, /**< Aria cipher with 128-bit key and GCM mode. */ MBEDTLS_CIPHER_ARIA_192_GCM, /**< Aria cipher with 192-bit key and GCM mode. */ MBEDTLS_CIPHER_ARIA_256_GCM, /**< Aria cipher with 256-bit key and GCM mode. */ MBEDTLS_CIPHER_ARIA_128_CCM, /**< Aria cipher with 128-bit key and CCM mode. */ MBEDTLS_CIPHER_ARIA_192_CCM, /**< Aria cipher with 192-bit key and CCM mode. */ MBEDTLS_CIPHER_ARIA_256_CCM, /**< Aria cipher with 256-bit key and CCM mode. */ MBEDTLS_CIPHER_AES_128_OFB, /**< AES 128-bit cipher in OFB mode. */ MBEDTLS_CIPHER_AES_192_OFB, /**< AES 192-bit cipher in OFB mode. */ MBEDTLS_CIPHER_AES_256_OFB, /**< AES 256-bit cipher in OFB mode. */ MBEDTLS_CIPHER_AES_128_XTS, /**< AES 128-bit cipher in XTS block mode. */ MBEDTLS_CIPHER_AES_256_XTS, /**< AES 256-bit cipher in XTS block mode. */ MBEDTLS_CIPHER_CHACHA20, /**< ChaCha20 stream cipher. */ MBEDTLS_CIPHER_CHACHA20_POLY1305, /**< ChaCha20-Poly1305 AEAD cipher. */ } mbedtls_cipher_type_t; /** Supported cipher modes. */ typedef enum { MBEDTLS_MODE_NONE = 0, /**< None. */ MBEDTLS_MODE_ECB, /**< The ECB cipher mode. */ MBEDTLS_MODE_CBC, /**< The CBC cipher mode. */ MBEDTLS_MODE_CFB, /**< The CFB cipher mode. */ MBEDTLS_MODE_OFB, /**< The OFB cipher mode. */ MBEDTLS_MODE_CTR, /**< The CTR cipher mode. */ MBEDTLS_MODE_GCM, /**< The GCM cipher mode. */ MBEDTLS_MODE_STREAM, /**< The stream cipher mode. */ MBEDTLS_MODE_CCM, /**< The CCM cipher mode. */ MBEDTLS_MODE_XTS, /**< The XTS cipher mode. */ MBEDTLS_MODE_CHACHAPOLY, /**< The ChaCha-Poly cipher mode. */ } mbedtls_cipher_mode_t; /** Supported cipher padding types. */ typedef enum { MBEDTLS_PADDING_PKCS7 = 0, /**< PKCS7 padding (default). */ MBEDTLS_PADDING_ONE_AND_ZEROS, /**< ISO/IEC 7816-4 padding. */ MBEDTLS_PADDING_ZEROS_AND_LEN, /**< ANSI X.923 padding. */ MBEDTLS_PADDING_ZEROS, /**< Zero padding (not reversible). */ MBEDTLS_PADDING_NONE, /**< Never pad (full blocks only). */ } mbedtls_cipher_padding_t; /** Type of operation. */ typedef enum { MBEDTLS_OPERATION_NONE = -1, MBEDTLS_DECRYPT = 0, MBEDTLS_ENCRYPT, } mbedtls_operation_t; enum { /** Undefined key length. */ MBEDTLS_KEY_LENGTH_NONE = 0, /** Key length, in bits (including parity), for DES keys. */ MBEDTLS_KEY_LENGTH_DES = 64, /** Key length in bits, including parity, for DES in two-key EDE. */ MBEDTLS_KEY_LENGTH_DES_EDE = 128, /** Key length in bits, including parity, for DES in three-key EDE. */ MBEDTLS_KEY_LENGTH_DES_EDE3 = 192, }; /** Maximum length of any IV, in Bytes. */ #define MBEDTLS_MAX_IV_LENGTH 16 /** Maximum block size of any cipher, in Bytes. */ #define MBEDTLS_MAX_BLOCK_LENGTH 16 /** * Base cipher information (opaque struct). */ typedef struct mbedtls_cipher_base_t mbedtls_cipher_base_t; /** * CMAC context (opaque struct). */ typedef struct mbedtls_cmac_context_t mbedtls_cmac_context_t; /** * Cipher information. Allows calling cipher functions * in a generic way. */ typedef struct mbedtls_cipher_info_t { /** Full cipher identifier. For example, * MBEDTLS_CIPHER_AES_256_CBC. */ mbedtls_cipher_type_t type; /** The cipher mode. For example, MBEDTLS_MODE_CBC. */ mbedtls_cipher_mode_t mode; /** The cipher key length, in bits. This is the * default length for variable sized ciphers. * Includes parity bits for ciphers like DES. */ unsigned int key_bitlen; /** Name of the cipher. */ const char * name; /** IV or nonce size, in Bytes. * For ciphers that accept variable IV sizes, * this is the recommended size. */ unsigned int iv_size; /** Bitflag comprised of MBEDTLS_CIPHER_VARIABLE_IV_LEN and * MBEDTLS_CIPHER_VARIABLE_KEY_LEN indicating whether the * cipher supports variable IV or variable key sizes, respectively. */ int flags; /** The block size, in Bytes. */ unsigned int block_size; /** Struct for base cipher information and functions. */ const mbedtls_cipher_base_t *base; } mbedtls_cipher_info_t; /** * Generic cipher context. */ typedef struct mbedtls_cipher_context_t { /** Information about the associated cipher. */ const mbedtls_cipher_info_t *cipher_info; /** Key length to use. */ int key_bitlen; /** Operation that the key of the context has been * initialized for. */ mbedtls_operation_t operation; #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) /** Padding functions to use, if relevant for * the specific cipher mode. */ void (*add_padding)( unsigned char *output, size_t olen, size_t data_len ); int (*get_padding)( unsigned char *input, size_t ilen, size_t *data_len ); #endif /** Buffer for input that has not been processed yet. */ unsigned char unprocessed_data[MBEDTLS_MAX_BLOCK_LENGTH]; /** Number of Bytes that have not been processed yet. */ size_t unprocessed_len; /** Current IV or NONCE_COUNTER for CTR-mode, data unit (or sector) number * for XTS-mode. */ unsigned char iv[MBEDTLS_MAX_IV_LENGTH]; /** IV size in Bytes, for ciphers with variable-length IVs. */ size_t iv_size; /** The cipher-specific context. */ void *cipher_ctx; #if defined(MBEDTLS_CMAC_C) /** CMAC-specific context. */ mbedtls_cmac_context_t *cmac_ctx; #endif } mbedtls_cipher_context_t; /** * \brief This function retrieves the list of ciphers supported by the generic * cipher module. * * \return A statically-allocated array of ciphers. The last entry * is zero. */ const int *mbedtls_cipher_list( void ); /** * \brief This function retrieves the cipher-information * structure associated with the given cipher name. * * \param cipher_name Name of the cipher to search for. This must not be * \c NULL. * * \return The cipher information structure associated with the * given \p cipher_name. * \return \c NULL if the associated cipher information is not found. */ const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name ); /** * \brief This function retrieves the cipher-information * structure associated with the given cipher type. * * \param cipher_type Type of the cipher to search for. * * \return The cipher information structure associated with the * given \p cipher_type. * \return \c NULL if the associated cipher information is not found. */ const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type ); /** * \brief This function retrieves the cipher-information * structure associated with the given cipher ID, * key size and mode. * * \param cipher_id The ID of the cipher to search for. For example, * #MBEDTLS_CIPHER_ID_AES. * \param key_bitlen The length of the key in bits. * \param mode The cipher mode. For example, #MBEDTLS_MODE_CBC. * * \return The cipher information structure associated with the * given \p cipher_id. * \return \c NULL if the associated cipher information is not found. */ const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id, int key_bitlen, const mbedtls_cipher_mode_t mode ); /** * \brief This function initializes a \p cipher_context as NONE. * * \param ctx The context to be initialized. This must not be \c NULL. */ void mbedtls_cipher_init( mbedtls_cipher_context_t *ctx ); /** * \brief This function frees and clears the cipher-specific * context of \p ctx. Freeing \p ctx itself remains the * responsibility of the caller. * * \param ctx The context to be freed. If this is \c NULL, the * function has no effect, otherwise this must point to an * initialized context. */ void mbedtls_cipher_free( mbedtls_cipher_context_t *ctx ); /** * \brief This function initializes and fills the cipher-context * structure with the appropriate values. It also clears * the structure. * * \param ctx The context to initialize. This must be initialized. * \param cipher_info The cipher to use. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the * cipher-specific context fails. * * \internal Currently, the function also clears the structure. * In future versions, the caller will be required to call * mbedtls_cipher_init() on the structure first. */ int mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info ); /** * \brief This function returns the block size of the given cipher. * * \param ctx The context of the cipher. This must be initialized. * * \return The block size of the underlying cipher. * \return \c 0 if \p ctx has not been initialized. */ static inline unsigned int mbedtls_cipher_get_block_size( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, 0 ); if( ctx->cipher_info == NULL ) return 0; return ctx->cipher_info->block_size; } /** * \brief This function returns the mode of operation for * the cipher. For example, MBEDTLS_MODE_CBC. * * \param ctx The context of the cipher. This must be initialized. * * \return The mode of operation. * \return #MBEDTLS_MODE_NONE if \p ctx has not been initialized. */ static inline mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, MBEDTLS_MODE_NONE ); if( ctx->cipher_info == NULL ) return MBEDTLS_MODE_NONE; return ctx->cipher_info->mode; } /** * \brief This function returns the size of the IV or nonce * of the cipher, in Bytes. * * \param ctx The context of the cipher. This must be initialized. * * \return The recommended IV size if no IV has been set. * \return \c 0 for ciphers not using an IV or a nonce. * \return The actual size if an IV has been set. */ static inline int mbedtls_cipher_get_iv_size( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, 0 ); if( ctx->cipher_info == NULL ) return 0; if( ctx->iv_size != 0 ) return (int) ctx->iv_size; return (int) ctx->cipher_info->iv_size; } /** * \brief This function returns the type of the given cipher. * * \param ctx The context of the cipher. This must be initialized. * * \return The type of the cipher. * \return #MBEDTLS_CIPHER_NONE if \p ctx has not been initialized. */ static inline mbedtls_cipher_type_t mbedtls_cipher_get_type( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, MBEDTLS_CIPHER_NONE ); if( ctx->cipher_info == NULL ) return MBEDTLS_CIPHER_NONE; return ctx->cipher_info->type; } /** * \brief This function returns the name of the given cipher * as a string. * * \param ctx The context of the cipher. This must be initialized. * * \return The name of the cipher. * \return NULL if \p ctx has not been not initialized. */ static inline const char *mbedtls_cipher_get_name( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, 0 ); if( ctx->cipher_info == NULL ) return 0; return ctx->cipher_info->name; } /** * \brief This function returns the key length of the cipher. * * \param ctx The context of the cipher. This must be initialized. * * \return The key length of the cipher in bits. * \return #MBEDTLS_KEY_LENGTH_NONE if ctx \p has not been * initialized. */ static inline int mbedtls_cipher_get_key_bitlen( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, MBEDTLS_KEY_LENGTH_NONE ); if( ctx->cipher_info == NULL ) return MBEDTLS_KEY_LENGTH_NONE; return (int) ctx->cipher_info->key_bitlen; } /** * \brief This function returns the operation of the given cipher. * * \param ctx The context of the cipher. This must be initialized. * * \return The type of operation: #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT. * \return #MBEDTLS_OPERATION_NONE if \p ctx has not been initialized. */ static inline mbedtls_operation_t mbedtls_cipher_get_operation( const mbedtls_cipher_context_t *ctx ) { MBEDTLS_INTERNAL_VALIDATE_RET( ctx != NULL, MBEDTLS_OPERATION_NONE ); if( ctx->cipher_info == NULL ) return MBEDTLS_OPERATION_NONE; return ctx->operation; } /** * \brief This function sets the key to use with the given context. * * \param ctx The generic cipher context. This must be initialized and * bound to a cipher information structure. * \param key The key to use. This must be a readable buffer of at * least \p key_bitlen Bits. * \param key_bitlen The key length to use, in Bits. * \param operation The operation that the key will be used for: * #MBEDTLS_ENCRYPT or #MBEDTLS_DECRYPT. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key, int key_bitlen, const mbedtls_operation_t operation ); #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) /** * \brief This function sets the padding mode, for cipher modes * that use padding. * * The default passing mode is PKCS7 padding. * * \param ctx The generic cipher context. This must be initialized and * bound to a cipher information structure. * \param mode The padding mode. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE * if the selected padding mode is not supported. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode * does not support padding. */ int mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode ); #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ /** * \brief This function sets the initialization vector (IV) * or nonce. * * \note Some ciphers do not use IVs nor nonce. For these * ciphers, this function has no effect. * * \param ctx The generic cipher context. This must be initialized and * bound to a cipher information structure. * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. This * must be a readable buffer of at least \p iv_len Bytes. * \param iv_len The IV length for ciphers with variable-size IV. * This parameter is discarded by ciphers with fixed-size IV. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. */ int mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len ); /** * \brief This function resets the cipher state. * * \param ctx The generic cipher context. This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. */ int mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx ); #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) /** * \brief This function adds additional data for AEAD ciphers. * Currently supported with GCM and ChaCha20+Poly1305. * This must be called exactly once, after * mbedtls_cipher_reset(). * * \param ctx The generic cipher context. This must be initialized. * \param ad The additional data to use. This must be a readable * buffer of at least \p ad_len Bytes. * \param ad_len the Length of \p ad Bytes. * * \return \c 0 on success. * \return A specific error code on failure. */ int mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx, const unsigned char *ad, size_t ad_len ); #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ /** * \brief The generic cipher update function. It encrypts or * decrypts using the given cipher context. Writes as * many block-sized blocks of data as possible to output. * Any data that cannot be written immediately is either * added to the next block, or flushed when * mbedtls_cipher_finish() is called. * Exception: For MBEDTLS_MODE_ECB, expects a single block * in size. For example, 16 Bytes for AES. * * \note If the underlying cipher is used in GCM mode, all calls * to this function, except for the last one before * mbedtls_cipher_finish(), must have \p ilen as a * multiple of the block size of the cipher. * * \param ctx The generic cipher context. This must be initialized and * bound to a key. * \param input The buffer holding the input data. This must be a * readable buffer of at least \p ilen Bytes. * \param ilen The length of the input data. * \param output The buffer for the output data. This must be able to * hold at least `ilen + block_size`. This must not be the * same buffer as \p input. * \param olen The length of the output data, to be updated with the * actual number of Bytes written. This must not be * \c NULL. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an * unsupported mode for a cipher. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen ); /** * \brief The generic cipher finalization function. If data still * needs to be flushed from an incomplete block, the data * contained in it is padded to the size of * the last block, and written to the \p output buffer. * * \param ctx The generic cipher context. This must be initialized and * bound to a key. * \param output The buffer to write data to. This needs to be a writable * buffer of at least \p block_size Bytes. * \param olen The length of the data written to the \p output buffer. * This may not be \c NULL. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption * expecting a full block but not receiving one. * \return #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding * while decrypting. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx, unsigned char *output, size_t *olen ); #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) /** * \brief This function writes a tag for AEAD ciphers. * Currently supported with GCM and ChaCha20+Poly1305. * This must be called after mbedtls_cipher_finish(). * * \param ctx The generic cipher context. This must be initialized, * bound to a key, and have just completed a cipher * operation through mbedtls_cipher_finish() the tag for * which should be written. * \param tag The buffer to write the tag to. This must be a writable * buffer of at least \p tag_len Bytes. * \param tag_len The length of the tag to write. * * \return \c 0 on success. * \return A specific error code on failure. */ int mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx, unsigned char *tag, size_t tag_len ); /** * \brief This function checks the tag for AEAD ciphers. * Currently supported with GCM and ChaCha20+Poly1305. * This must be called after mbedtls_cipher_finish(). * * \param ctx The generic cipher context. This must be initialized. * \param tag The buffer holding the tag. This must be a readable * buffer of at least \p tag_len Bytes. * \param tag_len The length of the tag to check. * * \return \c 0 on success. * \return A specific error code on failure. */ int mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx, const unsigned char *tag, size_t tag_len ); #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ /** * \brief The generic all-in-one encryption/decryption function, * for all ciphers except AEAD constructs. * * \param ctx The generic cipher context. This must be initialized. * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. * This must be a readable buffer of at least \p iv_len * Bytes. * \param iv_len The IV length for ciphers with variable-size IV. * This parameter is discarded by ciphers with fixed-size * IV. * \param input The buffer holding the input data. This must be a * readable buffer of at least \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The buffer for the output data. This must be able to * hold at least `ilen + block_size`. This must not be the * same buffer as \p input. * \param olen The length of the output data, to be updated with the * actual number of Bytes written. This must not be * \c NULL. * * \note Some ciphers do not use IVs nor nonce. For these * ciphers, use \p iv = NULL and \p iv_len = 0. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED on decryption * expecting a full block but not receiving one. * \return #MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding * while decrypting. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen ); #if defined(MBEDTLS_CIPHER_MODE_AEAD) /** * \brief The generic autenticated encryption (AEAD) function. * * \param ctx The generic cipher context. This must be initialized and * bound to a key. * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. * This must be a readable buffer of at least \p iv_len * Bytes. * \param iv_len The IV length for ciphers with variable-size IV. * This parameter is discarded by ciphers with fixed-size IV. * \param ad The additional data to authenticate. This must be a * readable buffer of at least \p ad_len Bytes. * \param ad_len The length of \p ad. * \param input The buffer holding the input data. This must be a * readable buffer of at least \p ilen Bytes. * \param ilen The length of the input data. * \param output The buffer for the output data. This must be able to * hold at least \p ilen Bytes. * \param olen The length of the output data, to be updated with the * actual number of Bytes written. This must not be * \c NULL. * \param tag The buffer for the authentication tag. This must be a * writable buffer of at least \p tag_len Bytes. * \param tag_len The desired length of the authentication tag. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, unsigned char *tag, size_t tag_len ); /** * \brief The generic autenticated decryption (AEAD) function. * * \note If the data is not authentic, then the output buffer * is zeroed out to prevent the unauthentic plaintext being * used, making this interface safer. * * \param ctx The generic cipher context. This must be initialized and * and bound to a key. * \param iv The IV to use, or NONCE_COUNTER for CTR-mode ciphers. * This must be a readable buffer of at least \p iv_len * Bytes. * \param iv_len The IV length for ciphers with variable-size IV. * This parameter is discarded by ciphers with fixed-size IV. * \param ad The additional data to be authenticated. This must be a * readable buffer of at least \p ad_len Bytes. * \param ad_len The length of \p ad. * \param input The buffer holding the input data. This must be a * readable buffer of at least \p ilen Bytes. * \param ilen The length of the input data. * \param output The buffer for the output data. * This must be able to hold at least \p ilen Bytes. * \param olen The length of the output data, to be updated with the * actual number of Bytes written. This must not be * \c NULL. * \param tag The buffer holding the authentication tag. This must be * a readable buffer of at least \p tag_len Bytes. * \param tag_len The length of the authentication tag. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on * parameter-verification failure. * \return #MBEDTLS_ERR_CIPHER_AUTH_FAILED if data is not authentic. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, const unsigned char *tag, size_t tag_len ); #endif /* MBEDTLS_CIPHER_MODE_AEAD */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CIPHER_H */ fldigi-4.2.05/src/include/mbedtls/cmac.h0000664000175000017500000001757614611711171014723 00000000000000/** * \file cmac.h * * \brief This file contains CMAC definitions and functions. * * The Cipher-based Message Authentication Code (CMAC) Mode for * Authentication is defined in RFC-4493: The AES-CMAC Algorithm. */ /* * Copyright (C) 2015-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CMAC_H #define MBEDTLS_CMAC_H #include "cipher.h" #ifdef __cplusplus extern "C" { #endif /* MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED -0x007A /**< CMAC hardware accelerator failed. */ #define MBEDTLS_AES_BLOCK_SIZE 16 #define MBEDTLS_DES3_BLOCK_SIZE 8 #if defined(MBEDTLS_AES_C) #define MBEDTLS_CIPHER_BLKSIZE_MAX 16 /**< The longest block used by CMAC is that of AES. */ #else #define MBEDTLS_CIPHER_BLKSIZE_MAX 8 /**< The longest block used by CMAC is that of 3DES. */ #endif #if !defined(MBEDTLS_CMAC_ALT) /** * The CMAC context structure. */ struct mbedtls_cmac_context_t { /** The internal state of the CMAC algorithm. */ unsigned char state[MBEDTLS_CIPHER_BLKSIZE_MAX]; /** Unprocessed data - either data that was not block aligned and is still * pending processing, or the final block. */ unsigned char unprocessed_block[MBEDTLS_CIPHER_BLKSIZE_MAX]; /** The length of data pending processing. */ size_t unprocessed_len; }; #else /* !MBEDTLS_CMAC_ALT */ #include "cmac_alt.h" #endif /* !MBEDTLS_CMAC_ALT */ /** * \brief This function sets the CMAC key, and prepares to authenticate * the input data. * Must be called with an initialized cipher context. * * \param ctx The cipher context used for the CMAC operation, initialized * as one of the following types: MBEDTLS_CIPHER_AES_128_ECB, * MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_CIPHER_AES_256_ECB, * or MBEDTLS_CIPHER_DES_EDE3_ECB. * \param key The CMAC key. * \param keybits The length of the CMAC key in bits. * Must be supported by the cipher. * * \return \c 0 on success. * \return A cipher-specific error code on failure. */ int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx, const unsigned char *key, size_t keybits ); /** * \brief This function feeds an input buffer into an ongoing CMAC * computation. * * It is called between mbedtls_cipher_cmac_starts() or * mbedtls_cipher_cmac_reset(), and mbedtls_cipher_cmac_finish(). * Can be called repeatedly. * * \param ctx The cipher context used for the CMAC operation. * \param input The buffer holding the input data. * \param ilen The length of the input data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA * if parameter verification fails. */ int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the CMAC operation, and writes * the result to the output buffer. * * It is called after mbedtls_cipher_cmac_update(). * It can be followed by mbedtls_cipher_cmac_reset() and * mbedtls_cipher_cmac_update(), or mbedtls_cipher_free(). * * \param ctx The cipher context used for the CMAC operation. * \param output The output buffer for the CMAC checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA * if parameter verification fails. */ int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx, unsigned char *output ); /** * \brief This function prepares the authentication of another * message with the same key as the previous CMAC * operation. * * It is called after mbedtls_cipher_cmac_finish() * and before mbedtls_cipher_cmac_update(). * * \param ctx The cipher context used for the CMAC operation. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA * if parameter verification fails. */ int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx ); /** * \brief This function calculates the full generic CMAC * on the input buffer with the provided key. * * The function allocates the context, performs the * calculation, and frees the context. * * The CMAC result is calculated as * output = generic CMAC(cmac key, input buffer). * * * \param cipher_info The cipher information. * \param key The CMAC key. * \param keylen The length of the CMAC key in bits. * \param input The buffer holding the input data. * \param ilen The length of the input data. * \param output The buffer for the generic CMAC result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA * if parameter verification fails. */ int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info, const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char *output ); #if defined(MBEDTLS_AES_C) /** * \brief This function implements the AES-CMAC-PRF-128 pseudorandom * function, as defined in * RFC-4615: The Advanced Encryption Standard-Cipher-based * Message Authentication Code-Pseudo-Random Function-128 * (AES-CMAC-PRF-128) Algorithm for the Internet Key * Exchange Protocol (IKE). * * \param key The key to use. * \param key_len The key length in Bytes. * \param input The buffer holding the input data. * \param in_len The length of the input data in Bytes. * \param output The buffer holding the generated 16 Bytes of * pseudorandom output. * * \return \c 0 on success. */ int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_len, const unsigned char *input, size_t in_len, unsigned char output[16] ); #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_SELF_TEST) && ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) ) /** * \brief The CMAC checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_cmac_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CMAC_H */ fldigi-4.2.05/src/include/mbedtls/net.h0000664000175000017500000000242114611711171014565 00000000000000/** * \file net.h * * \brief Deprecated header file that includes net_sockets.h * * \deprecated Superseded by mbedtls/net_sockets.h */ /* * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) #include "net_sockets.h" #if defined(MBEDTLS_DEPRECATED_WARNING) #warning "Deprecated header file: Superseded by mbedtls/net_sockets.h" #endif /* MBEDTLS_DEPRECATED_WARNING */ #endif /* !MBEDTLS_DEPRECATED_REMOVED */ fldigi-4.2.05/src/include/mbedtls/asn1write.h0000664000175000017500000003222414611711171015720 00000000000000/** * \file asn1write.h * * \brief ASN.1 buffer writing functionality */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ASN1_WRITE_H #define MBEDTLS_ASN1_WRITE_H #include "asn1.h" #define MBEDTLS_ASN1_CHK_ADD(g, f) \ do { \ if( ( ret = f ) < 0 ) \ return( ret ); \ else \ g += ret; \ } while( 0 ) #ifdef __cplusplus extern "C" { #endif /** * \brief Write a length field in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param len The length value to write. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len ); /** * \brief Write an ASN.1 tag in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param tag The tag to write. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag ); /** * \brief Write raw buffer data. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param buf The data buffer to write. * \param size The length of the data buffer. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t size ); #if defined(MBEDTLS_BIGNUM_C) /** * \brief Write a arbitrary-precision number (#MBEDTLS_ASN1_INTEGER) * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param X The MPI to write. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X ); #endif /* MBEDTLS_BIGNUM_C */ /** * \brief Write a NULL tag (#MBEDTLS_ASN1_NULL) with zero data * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_null( unsigned char **p, unsigned char *start ); /** * \brief Write an OID tag (#MBEDTLS_ASN1_OID) and data * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param oid The OID to write. * \param oid_len The length of the OID. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len ); /** * \brief Write an AlgorithmIdentifier sequence in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param oid The OID of the algorithm to write. * \param oid_len The length of the algorithm's OID. * \param par_len The length of the parameters, which must be already written. * If 0, NULL parameters are added * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len, size_t par_len ); /** * \brief Write a boolean tag (#MBEDTLS_ASN1_BOOLEAN) and value * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param boolean The boolean value to write, either \c 0 or \c 1. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean ); /** * \brief Write an int tag (#MBEDTLS_ASN1_INTEGER) and value * in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param val The integer value to write. * * \return The number of bytes written to \p p on success. * \return A negative \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val ); /** * \brief Write a string in ASN.1 format using a specific * string encoding tag. * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param tag The string encoding tag to write, e.g. * #MBEDTLS_ASN1_UTF8_STRING. * \param text The string to write. * \param text_len The length of \p text in bytes (which might * be strictly larger than the number of characters). * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_tagged_string( unsigned char **p, unsigned char *start, int tag, const char *text, size_t text_len ); /** * \brief Write a string in ASN.1 format using the PrintableString * string encoding tag (#MBEDTLS_ASN1_PRINTABLE_STRING). * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param text The string to write. * \param text_len The length of \p text in bytes (which might * be strictly larger than the number of characters). * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ); /** * \brief Write a UTF8 string in ASN.1 format using the UTF8String * string encoding tag (#MBEDTLS_ASN1_PRINTABLE_STRING). * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param text The string to write. * \param text_len The length of \p text in bytes (which might * be strictly larger than the number of characters). * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_utf8_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ); /** * \brief Write a string in ASN.1 format using the IA5String * string encoding tag (#MBEDTLS_ASN1_IA5_STRING). * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param text The string to write. * \param text_len The length of \p text in bytes (which might * be strictly larger than the number of characters). * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ); /** * \brief Write a bitstring tag (#MBEDTLS_ASN1_BIT_STRING) and * value in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param buf The bitstring to write. * \param bits The total number of bits in the bitstring. * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t bits ); /** * \brief Write an octet string tag (#MBEDTLS_ASN1_OCTET_STRING) * and value in ASN.1 format. * * \note This function works backwards in data buffer. * * \param p The reference to the current position pointer. * \param start The start of the buffer, for bounds-checking. * \param buf The buffer holding the data to write. * \param size The length of the data buffer \p buf. * * \return The number of bytes written to \p p on success. * \return A negative error code on failure. */ int mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t size ); /** * \brief Create or find a specific named_data entry for writing in a * sequence or list based on the OID. If not already in there, * a new entry is added to the head of the list. * Warning: Destructive behaviour for the val data! * * \param list The pointer to the location of the head of the list to seek * through (will be updated in case of a new entry). * \param oid The OID to look for. * \param oid_len The size of the OID. * \param val The data to store (can be \c NULL if you want to fill * it by hand). * \param val_len The minimum length of the data buffer needed. * * \return A pointer to the new / existing entry on success. * \return \c NULL if if there was a memory allocation error. */ mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **list, const char *oid, size_t oid_len, const unsigned char *val, size_t val_len ); #ifdef __cplusplus } #endif #endif /* MBEDTLS_ASN1_WRITE_H */ fldigi-4.2.05/src/include/mbedtls/memory_buffer_alloc.h0000664000175000017500000001227114611711171020016 00000000000000/** * \file memory_buffer_alloc.h * * \brief Buffer-based memory allocator */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_MEMORY_BUFFER_ALLOC_H #define MBEDTLS_MEMORY_BUFFER_ALLOC_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_MEMORY_ALIGN_MULTIPLE) #define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ #endif /* \} name SECTION: Module settings */ #define MBEDTLS_MEMORY_VERIFY_NONE 0 #define MBEDTLS_MEMORY_VERIFY_ALLOC (1 << 0) #define MBEDTLS_MEMORY_VERIFY_FREE (1 << 1) #define MBEDTLS_MEMORY_VERIFY_ALWAYS (MBEDTLS_MEMORY_VERIFY_ALLOC | MBEDTLS_MEMORY_VERIFY_FREE) #ifdef __cplusplus extern "C" { #endif /** * \brief Initialize use of stack-based memory allocator. * The stack-based allocator does memory management inside the * presented buffer and does not call calloc() and free(). * It sets the global mbedtls_calloc() and mbedtls_free() pointers * to its own functions. * (Provided mbedtls_calloc() and mbedtls_free() are thread-safe if * MBEDTLS_THREADING_C is defined) * * \note This code is not optimized and provides a straight-forward * implementation of a stack-based memory allocator. * * \param buf buffer to use as heap * \param len size of the buffer */ void mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len ); /** * \brief Free the mutex for thread-safety and clear remaining memory */ void mbedtls_memory_buffer_alloc_free( void ); /** * \brief Determine when the allocator should automatically verify the state * of the entire chain of headers / meta-data. * (Default: MBEDTLS_MEMORY_VERIFY_NONE) * * \param verify One of MBEDTLS_MEMORY_VERIFY_NONE, MBEDTLS_MEMORY_VERIFY_ALLOC, * MBEDTLS_MEMORY_VERIFY_FREE or MBEDTLS_MEMORY_VERIFY_ALWAYS */ void mbedtls_memory_buffer_set_verify( int verify ); #if defined(MBEDTLS_MEMORY_DEBUG) /** * \brief Print out the status of the allocated memory (primarily for use * after a program should have de-allocated all memory) * Prints out a list of 'still allocated' blocks and their stack * trace if MBEDTLS_MEMORY_BACKTRACE is defined. */ void mbedtls_memory_buffer_alloc_status( void ); /** * \brief Get the peak heap usage so far * * \param max_used Peak number of bytes in use or committed. This * includes bytes in allocated blocks too small to split * into smaller blocks but larger than the requested size. * \param max_blocks Peak number of blocks in use, including free and used */ void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks ); /** * \brief Reset peak statistics */ void mbedtls_memory_buffer_alloc_max_reset( void ); /** * \brief Get the current heap usage * * \param cur_used Current number of bytes in use or committed. This * includes bytes in allocated blocks too small to split * into smaller blocks but larger than the requested size. * \param cur_blocks Current number of blocks in use, including free and used */ void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks ); #endif /* MBEDTLS_MEMORY_DEBUG */ /** * \brief Verifies that all headers in the memory buffer are correct * and contain sane values. Helps debug buffer-overflow errors. * * Prints out first failure if MBEDTLS_MEMORY_DEBUG is defined. * Prints out full header information if MBEDTLS_MEMORY_DEBUG * is defined. (Includes stack trace information for each block if * MBEDTLS_MEMORY_BACKTRACE is defined as well). * * \return 0 if verified, 1 otherwise */ int mbedtls_memory_buffer_alloc_verify( void ); #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * \return 0 if successful, or 1 if a test failed */ int mbedtls_memory_buffer_alloc_self_test( int verbose ); #endif #ifdef __cplusplus } #endif #endif /* memory_buffer_alloc.h */ fldigi-4.2.05/src/include/mbedtls/rsa_internal.h0000664000175000017500000002171614611711171016470 00000000000000/** * \file rsa_internal.h * * \brief Context-independent RSA helper functions * * This module declares some RSA-related helper functions useful when * implementing the RSA interface. These functions are provided in a separate * compilation unit in order to make it easy for designers of alternative RSA * implementations to use them in their own code, as it is conceived that the * functionality they provide will be necessary for most complete * implementations. * * End-users of Mbed TLS who are not providing their own alternative RSA * implementations should not use these functions directly, and should instead * use only the functions declared in rsa.h. * * The interface provided by this module will be maintained through LTS (Long * Term Support) branches of Mbed TLS, but may otherwise be subject to change, * and must be considered an internal interface of the library. * * There are two classes of helper functions: * * (1) Parameter-generating helpers. These are: * - mbedtls_rsa_deduce_primes * - mbedtls_rsa_deduce_private_exponent * - mbedtls_rsa_deduce_crt * Each of these functions takes a set of core RSA parameters and * generates some other, or CRT related parameters. * * (2) Parameter-checking helpers. These are: * - mbedtls_rsa_validate_params * - mbedtls_rsa_validate_crt * They take a set of core or CRT related RSA parameters and check their * validity. * */ /* * Copyright (C) 2006-2017, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_RSA_INTERNAL_H #define MBEDTLS_RSA_INTERNAL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "bignum.h" #ifdef __cplusplus extern "C" { #endif /** * \brief Compute RSA prime moduli P, Q from public modulus N=PQ * and a pair of private and public key. * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param N RSA modulus N = PQ, with P, Q to be found * \param E RSA public exponent * \param D RSA private exponent * \param P Pointer to MPI holding first prime factor of N on success * \param Q Pointer to MPI holding second prime factor of N on success * * \return * - 0 if successful. In this case, P and Q constitute a * factorization of N. * - A non-zero error code otherwise. * * \note It is neither checked that P, Q are prime nor that * D, E are modular inverses wrt. P-1 and Q-1. For that, * use the helper function \c mbedtls_rsa_validate_params. * */ int mbedtls_rsa_deduce_primes( mbedtls_mpi const *N, mbedtls_mpi const *E, mbedtls_mpi const *D, mbedtls_mpi *P, mbedtls_mpi *Q ); /** * \brief Compute RSA private exponent from * prime moduli and public key. * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param P First prime factor of RSA modulus * \param Q Second prime factor of RSA modulus * \param E RSA public exponent * \param D Pointer to MPI holding the private exponent on success. * * \return * - 0 if successful. In this case, D is set to a simultaneous * modular inverse of E modulo both P-1 and Q-1. * - A non-zero error code otherwise. * * \note This function does not check whether P and Q are primes. * */ int mbedtls_rsa_deduce_private_exponent( mbedtls_mpi const *P, mbedtls_mpi const *Q, mbedtls_mpi const *E, mbedtls_mpi *D ); /** * \brief Generate RSA-CRT parameters * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param P First prime factor of N * \param Q Second prime factor of N * \param D RSA private exponent * \param DP Output variable for D modulo P-1 * \param DQ Output variable for D modulo Q-1 * \param QP Output variable for the modular inverse of Q modulo P. * * \return 0 on success, non-zero error code otherwise. * * \note This function does not check whether P, Q are * prime and whether D is a valid private exponent. * */ int mbedtls_rsa_deduce_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP ); /** * \brief Check validity of core RSA parameters * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param N RSA modulus N = PQ * \param P First prime factor of N * \param Q Second prime factor of N * \param D RSA private exponent * \param E RSA public exponent * \param f_rng PRNG to be used for primality check, or NULL * \param p_rng PRNG context for f_rng, or NULL * * \return * - 0 if the following conditions are satisfied * if all relevant parameters are provided: * - P prime if f_rng != NULL (%) * - Q prime if f_rng != NULL (%) * - 1 < N = P * Q * - 1 < D, E < N * - D and E are modular inverses modulo P-1 and Q-1 * (%) This is only done if MBEDTLS_GENPRIME is defined. * - A non-zero error code otherwise. * * \note The function can be used with a restricted set of arguments * to perform specific checks only. E.g., calling it with * (-,P,-,-,-) and a PRNG amounts to a primality check for P. */ int mbedtls_rsa_validate_params( const mbedtls_mpi *N, const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *E, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Check validity of RSA CRT parameters * * \note This is a 'static' helper function not operating on * an RSA context. Alternative implementations need not * overwrite it. * * \param P First prime factor of RSA modulus * \param Q Second prime factor of RSA modulus * \param D RSA private exponent * \param DP MPI to check for D modulo P-1 * \param DQ MPI to check for D modulo P-1 * \param QP MPI to check for the modular inverse of Q modulo P. * * \return * - 0 if the following conditions are satisfied: * - D = DP mod P-1 if P, D, DP != NULL * - Q = DQ mod P-1 if P, D, DQ != NULL * - QP = Q^-1 mod P if P, Q, QP != NULL * - \c MBEDTLS_ERR_RSA_KEY_CHECK_FAILED if check failed, * potentially including \c MBEDTLS_ERR_MPI_XXX if some * MPI calculations failed. * - \c MBEDTLS_ERR_RSA_BAD_INPUT_DATA if insufficient * data was provided to check DP, DQ or QP. * * \note The function can be used with a restricted set of arguments * to perform specific checks only. E.g., calling it with the * parameters (P, -, D, DP, -, -) will check DP = D mod P-1. */ int mbedtls_rsa_validate_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *DP, const mbedtls_mpi *DQ, const mbedtls_mpi *QP ); #ifdef __cplusplus } #endif #endif /* rsa_internal.h */ fldigi-4.2.05/src/include/mbedtls/pk.h0000664000175000017500000007051214611711171014417 00000000000000/** * \file pk.h * * \brief Public Key abstraction layer */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PK_H #define MBEDTLS_PK_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "md.h" #if defined(MBEDTLS_RSA_C) #include "rsa.h" #endif #if defined(MBEDTLS_ECP_C) #include "ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "ecdsa.h" #endif #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #define MBEDTLS_ERR_PK_ALLOC_FAILED -0x3F80 /**< Memory allocation failed. */ #define MBEDTLS_ERR_PK_TYPE_MISMATCH -0x3F00 /**< Type mismatch, eg attempt to encrypt with an ECDSA key */ #define MBEDTLS_ERR_PK_BAD_INPUT_DATA -0x3E80 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_PK_FILE_IO_ERROR -0x3E00 /**< Read/write of file failed. */ #define MBEDTLS_ERR_PK_KEY_INVALID_VERSION -0x3D80 /**< Unsupported key version */ #define MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -0x3D00 /**< Invalid key tag or value. */ #define MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -0x3C80 /**< Key algorithm is unsupported (only RSA and EC are supported). */ #define MBEDTLS_ERR_PK_PASSWORD_REQUIRED -0x3C00 /**< Private key password can't be empty. */ #define MBEDTLS_ERR_PK_PASSWORD_MISMATCH -0x3B80 /**< Given private key password does not allow for correct decryption. */ #define MBEDTLS_ERR_PK_INVALID_PUBKEY -0x3B00 /**< The pubkey tag or value is invalid (only RSA and EC are supported). */ #define MBEDTLS_ERR_PK_INVALID_ALG -0x3A80 /**< The algorithm tag or value is invalid. */ #define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00 /**< Elliptic curve is unsupported (only NIST curves are supported). */ #define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980 /**< Unavailable feature, e.g. RSA disabled for RSA key. */ #define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -0x3900 /**< The buffer contains a valid signature followed by more data. */ /* MBEDTLS_ERR_PK_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_PK_HW_ACCEL_FAILED -0x3880 /**< PK hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif /** * \brief Public key types */ typedef enum { MBEDTLS_PK_NONE=0, MBEDTLS_PK_RSA, MBEDTLS_PK_ECKEY, MBEDTLS_PK_ECKEY_DH, MBEDTLS_PK_ECDSA, MBEDTLS_PK_RSA_ALT, MBEDTLS_PK_RSASSA_PSS, } mbedtls_pk_type_t; /** * \brief Options for RSASSA-PSS signature verification. * See \c mbedtls_rsa_rsassa_pss_verify_ext() */ typedef struct mbedtls_pk_rsassa_pss_options { mbedtls_md_type_t mgf1_hash_id; int expected_salt_len; } mbedtls_pk_rsassa_pss_options; /** * \brief Types for interfacing with the debug module */ typedef enum { MBEDTLS_PK_DEBUG_NONE = 0, MBEDTLS_PK_DEBUG_MPI, MBEDTLS_PK_DEBUG_ECP, } mbedtls_pk_debug_type; /** * \brief Item to send to the debug module */ typedef struct mbedtls_pk_debug_item { mbedtls_pk_debug_type type; const char *name; void *value; } mbedtls_pk_debug_item; /** Maximum number of item send for debugging, plus 1 */ #define MBEDTLS_PK_DEBUG_MAX_ITEMS 3 /** * \brief Public key information and operations */ typedef struct mbedtls_pk_info_t mbedtls_pk_info_t; /** * \brief Public key container */ typedef struct mbedtls_pk_context { const mbedtls_pk_info_t * pk_info; /**< Public key information */ void * pk_ctx; /**< Underlying public key context */ } mbedtls_pk_context; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Context for resuming operations */ typedef struct { const mbedtls_pk_info_t * pk_info; /**< Public key information */ void * rs_ctx; /**< Underlying restart context */ } mbedtls_pk_restart_ctx; #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /* Now we can declare functions that take a pointer to that */ typedef void mbedtls_pk_restart_ctx; #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ #if defined(MBEDTLS_RSA_C) /** * Quick access to an RSA context inside a PK context. * * \warning You must make sure the PK context actually holds an RSA context * before using this function! */ static inline mbedtls_rsa_context *mbedtls_pk_rsa( const mbedtls_pk_context pk ) { return( (mbedtls_rsa_context *) (pk).pk_ctx ); } #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /** * Quick access to an EC context inside a PK context. * * \warning You must make sure the PK context actually holds an EC context * before using this function! */ static inline mbedtls_ecp_keypair *mbedtls_pk_ec( const mbedtls_pk_context pk ) { return( (mbedtls_ecp_keypair *) (pk).pk_ctx ); } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /** * \brief Types for RSA-alt abstraction */ typedef int (*mbedtls_pk_rsa_alt_decrypt_func)( void *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ); typedef int (*mbedtls_pk_rsa_alt_sign_func)( void *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ); typedef size_t (*mbedtls_pk_rsa_alt_key_len_func)( void *ctx ); #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ /** * \brief Return information associated with the given PK type * * \param pk_type PK type to search for. * * \return The PK info associated with the type or NULL if not found. */ const mbedtls_pk_info_t *mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type ); /** * \brief Initialize a #mbedtls_pk_context (as NONE). * * \param ctx The context to initialize. * This must not be \c NULL. */ void mbedtls_pk_init( mbedtls_pk_context *ctx ); /** * \brief Free the components of a #mbedtls_pk_context. * * \param ctx The context to clear. It must have been initialized. * If this is \c NULL, this function does nothing. */ void mbedtls_pk_free( mbedtls_pk_context *ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Initialize a restart context * * \param ctx The context to initialize. * This must not be \c NULL. */ void mbedtls_pk_restart_init( mbedtls_pk_restart_ctx *ctx ); /** * \brief Free the components of a restart context * * \param ctx The context to clear. It must have been initialized. * If this is \c NULL, this function does nothing. */ void mbedtls_pk_restart_free( mbedtls_pk_restart_ctx *ctx ); #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /** * \brief Initialize a PK context with the information given * and allocates the type-specific PK subcontext. * * \param ctx Context to initialize. It must not have been set * up yet (type #MBEDTLS_PK_NONE). * \param info Information to use * * \return 0 on success, * MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input, * MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure. * * \note For contexts holding an RSA-alt key, use * \c mbedtls_pk_setup_rsa_alt() instead. */ int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info ); #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /** * \brief Initialize an RSA-alt context * * \param ctx Context to initialize. It must not have been set * up yet (type #MBEDTLS_PK_NONE). * \param key RSA key pointer * \param decrypt_func Decryption function * \param sign_func Signing function * \param key_len_func Function returning key length in bytes * * \return 0 on success, or MBEDTLS_ERR_PK_BAD_INPUT_DATA if the * context wasn't already initialized as RSA_ALT. * * \note This function replaces \c mbedtls_pk_setup() for RSA-alt. */ int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key, mbedtls_pk_rsa_alt_decrypt_func decrypt_func, mbedtls_pk_rsa_alt_sign_func sign_func, mbedtls_pk_rsa_alt_key_len_func key_len_func ); #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ /** * \brief Get the size in bits of the underlying key * * \param ctx The context to query. It must have been initialized. * * \return Key size in bits, or 0 on error */ size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx ); /** * \brief Get the length in bytes of the underlying key * * \param ctx The context to query. It must have been initialized. * * \return Key length in bytes, or 0 on error */ static inline size_t mbedtls_pk_get_len( const mbedtls_pk_context *ctx ) { return( ( mbedtls_pk_get_bitlen( ctx ) + 7 ) / 8 ); } /** * \brief Tell if a context can do the operation given by type * * \param ctx The context to query. It must have been initialized. * \param type The desired type. * * \return 1 if the context can do operations on the given type. * \return 0 if the context cannot do the operations on the given * type. This is always the case for a context that has * been initialized but not set up, or that has been * cleared with mbedtls_pk_free(). */ int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type ); /** * \brief Verify signature (including padding if relevant). * * \param ctx The PK context to use. It must have been set up. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Signature to verify * \param sig_len Signature length * * \return 0 on success (signature is valid), * #MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid * signature in sig but its length is less than \p siglen, * or a specific error code. * * \note For RSA keys, the default padding type is PKCS#1 v1.5. * Use \c mbedtls_pk_verify_ext( MBEDTLS_PK_RSASSA_PSS, ... ) * to verify RSASSA_PSS signatures. * * \note If hash_len is 0, then the length associated with md_alg * is used instead, or an error returned if it is invalid. * * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 */ int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ); /** * \brief Restartable version of \c mbedtls_pk_verify() * * \note Performs the same job as \c mbedtls_pk_verify(), but can * return early and restart according to the limit set with * \c mbedtls_ecp_set_max_ops() to reduce blocking for ECC * operations. For RSA, same as \c mbedtls_pk_verify(). * * \param ctx The PK context to use. It must have been set up. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Signature to verify * \param sig_len Signature length * \param rs_ctx Restart context (NULL to disable restart) * * \return See \c mbedtls_pk_verify(), or * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). */ int mbedtls_pk_verify_restartable( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, mbedtls_pk_restart_ctx *rs_ctx ); /** * \brief Verify signature, with options. * (Includes verification of the padding depending on type.) * * \param type Signature type (inc. possible padding type) to verify * \param options Pointer to type-specific options, or NULL * \param ctx The PK context to use. It must have been set up. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Signature to verify * \param sig_len Signature length * * \return 0 on success (signature is valid), * #MBEDTLS_ERR_PK_TYPE_MISMATCH if the PK context can't be * used for this type of signatures, * #MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid * signature in sig but its length is less than \p siglen, * or a specific error code. * * \note If hash_len is 0, then the length associated with md_alg * is used instead, or an error returned if it is invalid. * * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 * * \note If type is MBEDTLS_PK_RSASSA_PSS, then options must point * to a mbedtls_pk_rsassa_pss_options structure, * otherwise it must be NULL. */ int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options, mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ); /** * \brief Make signature, including padding if relevant. * * \param ctx The PK context to use. It must have been set up * with a private key. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Place to write the signature * \param sig_len Number of bytes written * \param f_rng RNG function * \param p_rng RNG parameter * * \return 0 on success, or a specific error code. * * \note For RSA keys, the default padding type is PKCS#1 v1.5. * There is no interface in the PK module to make RSASSA-PSS * signatures yet. * * \note If hash_len is 0, then the length associated with md_alg * is used instead, or an error returned if it is invalid. * * \note For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0. * For ECDSA, md_alg may never be MBEDTLS_MD_NONE. */ int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Restartable version of \c mbedtls_pk_sign() * * \note Performs the same job as \c mbedtls_pk_sign(), but can * return early and restart according to the limit set with * \c mbedtls_ecp_set_max_ops() to reduce blocking for ECC * operations. For RSA, same as \c mbedtls_pk_sign(). * * \param ctx The PK context to use. It must have been set up * with a private key. * \param md_alg Hash algorithm used (see notes) * \param hash Hash of the message to sign * \param hash_len Hash length or 0 (see notes) * \param sig Place to write the signature * \param sig_len Number of bytes written * \param f_rng RNG function * \param p_rng RNG parameter * \param rs_ctx Restart context (NULL to disable restart) * * \return See \c mbedtls_pk_sign(), or * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). */ int mbedtls_pk_sign_restartable( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_pk_restart_ctx *rs_ctx ); /** * \brief Decrypt message (including padding if relevant). * * \param ctx The PK context to use. It must have been set up * with a private key. * \param input Input to decrypt * \param ilen Input size * \param output Decrypted output * \param olen Decrypted message length * \param osize Size of the output buffer * \param f_rng RNG function * \param p_rng RNG parameter * * \note For RSA keys, the default padding type is PKCS#1 v1.5. * * \return 0 on success, or a specific error code. */ int mbedtls_pk_decrypt( mbedtls_pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Encrypt message (including padding if relevant). * * \param ctx The PK context to use. It must have been set up. * \param input Message to encrypt * \param ilen Message size * \param output Encrypted output * \param olen Encrypted output length * \param osize Size of the output buffer * \param f_rng RNG function * \param p_rng RNG parameter * * \note For RSA keys, the default padding type is PKCS#1 v1.5. * * \return 0 on success, or a specific error code. */ int mbedtls_pk_encrypt( mbedtls_pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Check if a public-private pair of keys matches. * * \param pub Context holding a public key. * \param prv Context holding a private (and public) key. * * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA */ int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv ); /** * \brief Export debug information * * \param ctx The PK context to use. It must have been initialized. * \param items Place to write debug items * * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA */ int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items ); /** * \brief Access the type name * * \param ctx The PK context to use. It must have been initialized. * * \return Type name on success, or "invalid PK" */ const char * mbedtls_pk_get_name( const mbedtls_pk_context *ctx ); /** * \brief Get the key type * * \param ctx The PK context to use. It must have been initialized. * * \return Type on success. * \return #MBEDTLS_PK_NONE for a context that has not been set up. */ mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx ); #if defined(MBEDTLS_PK_PARSE_C) /** \ingroup pk_module */ /** * \brief Parse a private key in PEM or DER format * * \param ctx The PK context to fill. It must have been initialized * but not set up. * \param key Input buffer to parse. * The buffer must contain the input exactly, with no * extra trailing material. For PEM, the buffer must * contain a null-terminated string. * \param keylen Size of \b key in bytes. * For PEM data, this includes the terminating null byte, * so \p keylen must be equal to `strlen(key) + 1`. * \param pwd Optional password for decryption. * Pass \c NULL if expecting a non-encrypted key. * Pass a string of \p pwdlen bytes if expecting an encrypted * key; a non-encrypted key will also be accepted. * The empty password is not supported. * \param pwdlen Size of the password in bytes. * Ignored if \p pwd is \c NULL. * * \note On entry, ctx must be empty, either freshly initialised * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a * specific key type, check the result with mbedtls_pk_can_do(). * * \note The key is also checked for correctness. * * \return 0 if successful, or a specific PK or PEM error code */ int mbedtls_pk_parse_key( mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen ); /** \ingroup pk_module */ /** * \brief Parse a public key in PEM or DER format * * \param ctx The PK context to fill. It must have been initialized * but not set up. * \param key Input buffer to parse. * The buffer must contain the input exactly, with no * extra trailing material. For PEM, the buffer must * contain a null-terminated string. * \param keylen Size of \b key in bytes. * For PEM data, this includes the terminating null byte, * so \p keylen must be equal to `strlen(key) + 1`. * * \note On entry, ctx must be empty, either freshly initialised * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a * specific key type, check the result with mbedtls_pk_can_do(). * * \note The key is also checked for correctness. * * \return 0 if successful, or a specific PK or PEM error code */ int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen ); #if defined(MBEDTLS_FS_IO) /** \ingroup pk_module */ /** * \brief Load and parse a private key * * \param ctx The PK context to fill. It must have been initialized * but not set up. * \param path filename to read the private key from * \param password Optional password to decrypt the file. * Pass \c NULL if expecting a non-encrypted key. * Pass a null-terminated string if expecting an encrypted * key; a non-encrypted key will also be accepted. * The empty password is not supported. * * \note On entry, ctx must be empty, either freshly initialised * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a * specific key type, check the result with mbedtls_pk_can_do(). * * \note The key is also checked for correctness. * * \return 0 if successful, or a specific PK or PEM error code */ int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx, const char *path, const char *password ); /** \ingroup pk_module */ /** * \brief Load and parse a public key * * \param ctx The PK context to fill. It must have been initialized * but not set up. * \param path filename to read the public key from * * \note On entry, ctx must be empty, either freshly initialised * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If * you need a specific key type, check the result with * mbedtls_pk_can_do(). * * \note The key is also checked for correctness. * * \return 0 if successful, or a specific PK or PEM error code */ int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path ); #endif /* MBEDTLS_FS_IO */ #endif /* MBEDTLS_PK_PARSE_C */ #if defined(MBEDTLS_PK_WRITE_C) /** * \brief Write a private key to a PKCS#1 or SEC1 DER structure * Note: data is written at the end of the buffer! Use the * return value to determine where you should start * using the buffer * * \param ctx PK context which must contain a valid private key. * \param buf buffer to write to * \param size size of the buffer * * \return length of data written if successful, or a specific * error code */ int mbedtls_pk_write_key_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); /** * \brief Write a public key to a SubjectPublicKeyInfo DER structure * Note: data is written at the end of the buffer! Use the * return value to determine where you should start * using the buffer * * \param ctx PK context which must contain a valid public or private key. * \param buf buffer to write to * \param size size of the buffer * * \return length of data written if successful, or a specific * error code */ int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); #if defined(MBEDTLS_PEM_WRITE_C) /** * \brief Write a public key to a PEM string * * \param ctx PK context which must contain a valid public or private key. * \param buf Buffer to write to. The output includes a * terminating null byte. * \param size Size of the buffer in bytes. * * \return 0 if successful, or a specific error code */ int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); /** * \brief Write a private key to a PKCS#1 or SEC1 PEM string * * \param ctx PK context which must contain a valid private key. * \param buf Buffer to write to. The output includes a * terminating null byte. * \param size Size of the buffer in bytes. * * \return 0 if successful, or a specific error code */ int mbedtls_pk_write_key_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_PK_WRITE_C */ /* * WARNING: Low-level functions. You probably do not want to use these unless * you are certain you do ;) */ #if defined(MBEDTLS_PK_PARSE_C) /** * \brief Parse a SubjectPublicKeyInfo DER structure * * \param p the position in the ASN.1 data * \param end end of the buffer * \param pk The PK context to fill. It must have been initialized * but not set up. * * \return 0 if successful, or a specific PK error code */ int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end, mbedtls_pk_context *pk ); #endif /* MBEDTLS_PK_PARSE_C */ #if defined(MBEDTLS_PK_WRITE_C) /** * \brief Write a subjectPublicKey to ASN.1 data * Note: function works backwards in data buffer * * \param p reference to current position pointer * \param start start of the buffer (for bounds-checking) * \param key PK context which must contain a valid public or private key. * * \return the length written or a negative error code */ int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start, const mbedtls_pk_context *key ); #endif /* MBEDTLS_PK_WRITE_C */ /* * Internal module functions. You probably do not want to use these unless you * know you do. */ #if defined(MBEDTLS_FS_IO) int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n ); #endif #ifdef __cplusplus } #endif #endif /* MBEDTLS_PK_H */ fldigi-4.2.05/src/include/mbedtls/error.h0000664000175000017500000001002714611711171015131 00000000000000/** * \file error.h * * \brief Error to string translation */ /* * Copyright (C) 2006-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ERROR_H #define MBEDTLS_ERROR_H #include /** * Error code layout. * * Currently we try to keep all error codes within the negative space of 16 * bits signed integers to support all platforms (-0x0001 - -0x7FFF). In * addition we'd like to give two layers of information on the error if * possible. * * For that purpose the error codes are segmented in the following manner: * * 16 bit error code bit-segmentation * * 1 bit - Unused (sign bit) * 3 bits - High level module ID * 5 bits - Module-dependent error code * 7 bits - Low level module errors * * For historical reasons, low-level error codes are divided in even and odd, * even codes were assigned first, and -1 is reserved for other errors. * * Low-level module errors (0x0002-0x007E, 0x0003-0x007F) * * Module Nr Codes assigned * MPI 7 0x0002-0x0010 * GCM 3 0x0012-0x0014 0x0013-0x0013 * BLOWFISH 3 0x0016-0x0018 0x0017-0x0017 * THREADING 3 0x001A-0x001E * AES 5 0x0020-0x0022 0x0021-0x0025 * CAMELLIA 3 0x0024-0x0026 0x0027-0x0027 * XTEA 2 0x0028-0x0028 0x0029-0x0029 * BASE64 2 0x002A-0x002C * OID 1 0x002E-0x002E 0x000B-0x000B * PADLOCK 1 0x0030-0x0030 * DES 2 0x0032-0x0032 0x0033-0x0033 * CTR_DBRG 4 0x0034-0x003A * ENTROPY 3 0x003C-0x0040 0x003D-0x003F * NET 13 0x0042-0x0052 0x0043-0x0049 * ARIA 4 0x0058-0x005E * ASN1 7 0x0060-0x006C * CMAC 1 0x007A-0x007A * PBKDF2 1 0x007C-0x007C * HMAC_DRBG 4 0x0003-0x0009 * CCM 3 0x000D-0x0011 * ARC4 1 0x0019-0x0019 * MD2 1 0x002B-0x002B * MD4 1 0x002D-0x002D * MD5 1 0x002F-0x002F * RIPEMD160 1 0x0031-0x0031 * SHA1 1 0x0035-0x0035 0x0073-0x0073 * SHA256 1 0x0037-0x0037 0x0074-0x0074 * SHA512 1 0x0039-0x0039 0x0075-0x0075 * CHACHA20 3 0x0051-0x0055 * POLY1305 3 0x0057-0x005B * CHACHAPOLY 2 0x0054-0x0056 * PLATFORM 1 0x0070-0x0072 * * High-level module nr (3 bits - 0x0...-0x7...) * Name ID Nr of Errors * PEM 1 9 * PKCS#12 1 4 (Started from top) * X509 2 20 * PKCS5 2 4 (Started from top) * DHM 3 11 * PK 3 15 (Started from top) * RSA 4 11 * ECP 4 10 (Started from top) * MD 5 5 * HKDF 5 1 (Started from top) * CIPHER 6 8 * SSL 6 23 (Started from top) * SSL 7 32 * * Module dependent error code (5 bits 0x.00.-0x.F8.) */ #ifdef __cplusplus extern "C" { #endif /** * \brief Translate a mbed TLS error code into a string representation, * Result is truncated if necessary and always includes a terminating * null byte. * * \param errnum error code * \param buffer buffer to place representation in * \param buflen length of the buffer */ void mbedtls_strerror( int errnum, char *buffer, size_t buflen ); #ifdef __cplusplus } #endif #endif /* error.h */ fldigi-4.2.05/src/include/mbedtls/oid.h0000664000175000017500000007701114611711171014561 00000000000000/** * \file oid.h * * \brief Object Identifier (OID) database */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_OID_H #define MBEDTLS_OID_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "asn1.h" #include "pk.h" #include #if defined(MBEDTLS_CIPHER_C) #include "cipher.h" #endif #if defined(MBEDTLS_MD_C) #include "md.h" #endif #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) #include "x509.h" #endif #define MBEDTLS_ERR_OID_NOT_FOUND -0x002E /**< OID is not found. */ #define MBEDTLS_ERR_OID_BUF_TOO_SMALL -0x000B /**< output buffer is too small */ /* * Top level OID tuples */ #define MBEDTLS_OID_ISO_MEMBER_BODIES "\x2a" /* {iso(1) member-body(2)} */ #define MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x2b" /* {iso(1) identified-organization(3)} */ #define MBEDTLS_OID_ISO_CCITT_DS "\x55" /* {joint-iso-ccitt(2) ds(5)} */ #define MBEDTLS_OID_ISO_ITU_COUNTRY "\x60" /* {joint-iso-itu-t(2) country(16)} */ /* * ISO Member bodies OID parts */ #define MBEDTLS_OID_COUNTRY_US "\x86\x48" /* {us(840)} */ #define MBEDTLS_OID_ORG_RSA_DATA_SECURITY "\x86\xf7\x0d" /* {rsadsi(113549)} */ #define MBEDTLS_OID_RSA_COMPANY MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ MBEDTLS_OID_ORG_RSA_DATA_SECURITY /* {iso(1) member-body(2) us(840) rsadsi(113549)} */ #define MBEDTLS_OID_ORG_ANSI_X9_62 "\xce\x3d" /* ansi-X9-62(10045) */ #define MBEDTLS_OID_ANSI_X9_62 MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ MBEDTLS_OID_ORG_ANSI_X9_62 /* * ISO Identified organization OID parts */ #define MBEDTLS_OID_ORG_DOD "\x06" /* {dod(6)} */ #define MBEDTLS_OID_ORG_OIW "\x0e" #define MBEDTLS_OID_OIW_SECSIG MBEDTLS_OID_ORG_OIW "\x03" #define MBEDTLS_OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG "\x02" #define MBEDTLS_OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_ALG "\x1a" #define MBEDTLS_OID_ORG_CERTICOM "\x81\x04" /* certicom(132) */ #define MBEDTLS_OID_CERTICOM MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_CERTICOM #define MBEDTLS_OID_ORG_TELETRUST "\x24" /* teletrust(36) */ #define MBEDTLS_OID_TELETRUST MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_TELETRUST /* * ISO ITU OID parts */ #define MBEDTLS_OID_ORGANIZATION "\x01" /* {organization(1)} */ #define MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_COUNTRY MBEDTLS_OID_COUNTRY_US MBEDTLS_OID_ORGANIZATION /* {joint-iso-itu-t(2) country(16) us(840) organization(1)} */ #define MBEDTLS_OID_ORG_GOV "\x65" /* {gov(101)} */ #define MBEDTLS_OID_GOV MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_GOV /* {joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101)} */ #define MBEDTLS_OID_ORG_NETSCAPE "\x86\xF8\x42" /* {netscape(113730)} */ #define MBEDTLS_OID_NETSCAPE MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_NETSCAPE /* Netscape OID {joint-iso-itu-t(2) country(16) us(840) organization(1) netscape(113730)} */ /* ISO arc for standard certificate and CRL extensions */ #define MBEDTLS_OID_ID_CE MBEDTLS_OID_ISO_CCITT_DS "\x1D" /**< id-ce OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 29} */ #define MBEDTLS_OID_NIST_ALG MBEDTLS_OID_GOV "\x03\x04" /** { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistAlgorithm(4) */ /** * Private Internet Extensions * { iso(1) identified-organization(3) dod(6) internet(1) * security(5) mechanisms(5) pkix(7) } */ #define MBEDTLS_OID_PKIX MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_DOD "\x01\x05\x05\x07" /* * Arc for standard naming attributes */ #define MBEDTLS_OID_AT MBEDTLS_OID_ISO_CCITT_DS "\x04" /**< id-at OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 4} */ #define MBEDTLS_OID_AT_CN MBEDTLS_OID_AT "\x03" /**< id-at-commonName AttributeType:= {id-at 3} */ #define MBEDTLS_OID_AT_SUR_NAME MBEDTLS_OID_AT "\x04" /**< id-at-surName AttributeType:= {id-at 4} */ #define MBEDTLS_OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT "\x05" /**< id-at-serialNumber AttributeType:= {id-at 5} */ #define MBEDTLS_OID_AT_COUNTRY MBEDTLS_OID_AT "\x06" /**< id-at-countryName AttributeType:= {id-at 6} */ #define MBEDTLS_OID_AT_LOCALITY MBEDTLS_OID_AT "\x07" /**< id-at-locality AttributeType:= {id-at 7} */ #define MBEDTLS_OID_AT_STATE MBEDTLS_OID_AT "\x08" /**< id-at-state AttributeType:= {id-at 8} */ #define MBEDTLS_OID_AT_ORGANIZATION MBEDTLS_OID_AT "\x0A" /**< id-at-organizationName AttributeType:= {id-at 10} */ #define MBEDTLS_OID_AT_ORG_UNIT MBEDTLS_OID_AT "\x0B" /**< id-at-organizationalUnitName AttributeType:= {id-at 11} */ #define MBEDTLS_OID_AT_TITLE MBEDTLS_OID_AT "\x0C" /**< id-at-title AttributeType:= {id-at 12} */ #define MBEDTLS_OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT "\x10" /**< id-at-postalAddress AttributeType:= {id-at 16} */ #define MBEDTLS_OID_AT_POSTAL_CODE MBEDTLS_OID_AT "\x11" /**< id-at-postalCode AttributeType:= {id-at 17} */ #define MBEDTLS_OID_AT_GIVEN_NAME MBEDTLS_OID_AT "\x2A" /**< id-at-givenName AttributeType:= {id-at 42} */ #define MBEDTLS_OID_AT_INITIALS MBEDTLS_OID_AT "\x2B" /**< id-at-initials AttributeType:= {id-at 43} */ #define MBEDTLS_OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT "\x2C" /**< id-at-generationQualifier AttributeType:= {id-at 44} */ #define MBEDTLS_OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT "\x2D" /**< id-at-uniqueIdentifier AttributType:= {id-at 45} */ #define MBEDTLS_OID_AT_DN_QUALIFIER MBEDTLS_OID_AT "\x2E" /**< id-at-dnQualifier AttributeType:= {id-at 46} */ #define MBEDTLS_OID_AT_PSEUDONYM MBEDTLS_OID_AT "\x41" /**< id-at-pseudonym AttributeType:= {id-at 65} */ #define MBEDTLS_OID_DOMAIN_COMPONENT "\x09\x92\x26\x89\x93\xF2\x2C\x64\x01\x19" /** id-domainComponent AttributeType:= {itu-t(0) data(9) pss(2342) ucl(19200300) pilot(100) pilotAttributeType(1) domainComponent(25)} */ /* * OIDs for standard certificate extensions */ #define MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x23" /**< id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } */ #define MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x0E" /**< id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } */ #define MBEDTLS_OID_KEY_USAGE MBEDTLS_OID_ID_CE "\x0F" /**< id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } */ #define MBEDTLS_OID_CERTIFICATE_POLICIES MBEDTLS_OID_ID_CE "\x20" /**< id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } */ #define MBEDTLS_OID_POLICY_MAPPINGS MBEDTLS_OID_ID_CE "\x21" /**< id-ce-policyMappings OBJECT IDENTIFIER ::= { id-ce 33 } */ #define MBEDTLS_OID_SUBJECT_ALT_NAME MBEDTLS_OID_ID_CE "\x11" /**< id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } */ #define MBEDTLS_OID_ISSUER_ALT_NAME MBEDTLS_OID_ID_CE "\x12" /**< id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } */ #define MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_ID_CE "\x09" /**< id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::= { id-ce 9 } */ #define MBEDTLS_OID_BASIC_CONSTRAINTS MBEDTLS_OID_ID_CE "\x13" /**< id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } */ #define MBEDTLS_OID_NAME_CONSTRAINTS MBEDTLS_OID_ID_CE "\x1E" /**< id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } */ #define MBEDTLS_OID_POLICY_CONSTRAINTS MBEDTLS_OID_ID_CE "\x24" /**< id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 } */ #define MBEDTLS_OID_EXTENDED_KEY_USAGE MBEDTLS_OID_ID_CE "\x25" /**< id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } */ #define MBEDTLS_OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_ID_CE "\x1F" /**< id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 } */ #define MBEDTLS_OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_ID_CE "\x36" /**< id-ce-inhibitAnyPolicy OBJECT IDENTIFIER ::= { id-ce 54 } */ #define MBEDTLS_OID_FRESHEST_CRL MBEDTLS_OID_ID_CE "\x2E" /**< id-ce-freshestCRL OBJECT IDENTIFIER ::= { id-ce 46 } */ /* * Netscape certificate extensions */ #define MBEDTLS_OID_NS_CERT MBEDTLS_OID_NETSCAPE "\x01" #define MBEDTLS_OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT "\x01" #define MBEDTLS_OID_NS_BASE_URL MBEDTLS_OID_NS_CERT "\x02" #define MBEDTLS_OID_NS_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x03" #define MBEDTLS_OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x04" #define MBEDTLS_OID_NS_RENEWAL_URL MBEDTLS_OID_NS_CERT "\x07" #define MBEDTLS_OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CERT "\x08" #define MBEDTLS_OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_CERT "\x0C" #define MBEDTLS_OID_NS_COMMENT MBEDTLS_OID_NS_CERT "\x0D" #define MBEDTLS_OID_NS_DATA_TYPE MBEDTLS_OID_NETSCAPE "\x02" #define MBEDTLS_OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_DATA_TYPE "\x05" /* * OIDs for CRL extensions */ #define MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_ID_CE "\x10" #define MBEDTLS_OID_CRL_NUMBER MBEDTLS_OID_ID_CE "\x14" /**< id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } */ /* * X.509 v3 Extended key usage OIDs */ #define MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE "\x00" /**< anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } */ #define MBEDTLS_OID_KP MBEDTLS_OID_PKIX "\x03" /**< id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } */ #define MBEDTLS_OID_SERVER_AUTH MBEDTLS_OID_KP "\x01" /**< id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } */ #define MBEDTLS_OID_CLIENT_AUTH MBEDTLS_OID_KP "\x02" /**< id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } */ #define MBEDTLS_OID_CODE_SIGNING MBEDTLS_OID_KP "\x03" /**< id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } */ #define MBEDTLS_OID_EMAIL_PROTECTION MBEDTLS_OID_KP "\x04" /**< id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } */ #define MBEDTLS_OID_TIME_STAMPING MBEDTLS_OID_KP "\x08" /**< id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } */ #define MBEDTLS_OID_OCSP_SIGNING MBEDTLS_OID_KP "\x09" /**< id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } */ /* * PKCS definition OIDs */ #define MBEDTLS_OID_PKCS MBEDTLS_OID_RSA_COMPANY "\x01" /**< pkcs OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) 1 } */ #define MBEDTLS_OID_PKCS1 MBEDTLS_OID_PKCS "\x01" /**< pkcs-1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } */ #define MBEDTLS_OID_PKCS5 MBEDTLS_OID_PKCS "\x05" /**< pkcs-5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 } */ #define MBEDTLS_OID_PKCS9 MBEDTLS_OID_PKCS "\x09" /**< pkcs-9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } */ #define MBEDTLS_OID_PKCS12 MBEDTLS_OID_PKCS "\x0c" /**< pkcs-12 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 } */ /* * PKCS#1 OIDs */ #define MBEDTLS_OID_PKCS1_RSA MBEDTLS_OID_PKCS1 "\x01" /**< rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } */ #define MBEDTLS_OID_PKCS1_MD2 MBEDTLS_OID_PKCS1 "\x02" /**< md2WithRSAEncryption ::= { pkcs-1 2 } */ #define MBEDTLS_OID_PKCS1_MD4 MBEDTLS_OID_PKCS1 "\x03" /**< md4WithRSAEncryption ::= { pkcs-1 3 } */ #define MBEDTLS_OID_PKCS1_MD5 MBEDTLS_OID_PKCS1 "\x04" /**< md5WithRSAEncryption ::= { pkcs-1 4 } */ #define MBEDTLS_OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1 "\x05" /**< sha1WithRSAEncryption ::= { pkcs-1 5 } */ #define MBEDTLS_OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1 "\x0e" /**< sha224WithRSAEncryption ::= { pkcs-1 14 } */ #define MBEDTLS_OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1 "\x0b" /**< sha256WithRSAEncryption ::= { pkcs-1 11 } */ #define MBEDTLS_OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1 "\x0c" /**< sha384WithRSAEncryption ::= { pkcs-1 12 } */ #define MBEDTLS_OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1 "\x0d" /**< sha512WithRSAEncryption ::= { pkcs-1 13 } */ #define MBEDTLS_OID_RSA_SHA_OBS "\x2B\x0E\x03\x02\x1D" #define MBEDTLS_OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9 "\x01" /**< emailAddress AttributeType ::= { pkcs-9 1 } */ /* RFC 4055 */ #define MBEDTLS_OID_RSASSA_PSS MBEDTLS_OID_PKCS1 "\x0a" /**< id-RSASSA-PSS ::= { pkcs-1 10 } */ #define MBEDTLS_OID_MGF1 MBEDTLS_OID_PKCS1 "\x08" /**< id-mgf1 ::= { pkcs-1 8 } */ /* * Digest algorithms */ #define MBEDTLS_OID_DIGEST_ALG_MD2 MBEDTLS_OID_RSA_COMPANY "\x02\x02" /**< id-mbedtls_md2 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } */ #define MBEDTLS_OID_DIGEST_ALG_MD4 MBEDTLS_OID_RSA_COMPANY "\x02\x04" /**< id-mbedtls_md4 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 4 } */ #define MBEDTLS_OID_DIGEST_ALG_MD5 MBEDTLS_OID_RSA_COMPANY "\x02\x05" /**< id-mbedtls_md5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA1 MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_SHA1 /**< id-mbedtls_sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA224 MBEDTLS_OID_NIST_ALG "\x02\x04" /**< id-sha224 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 4 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA256 MBEDTLS_OID_NIST_ALG "\x02\x01" /**< id-mbedtls_sha256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 1 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA384 MBEDTLS_OID_NIST_ALG "\x02\x02" /**< id-sha384 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 2 } */ #define MBEDTLS_OID_DIGEST_ALG_SHA512 MBEDTLS_OID_NIST_ALG "\x02\x03" /**< id-mbedtls_sha512 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 3 } */ #define MBEDTLS_OID_HMAC_SHA1 MBEDTLS_OID_RSA_COMPANY "\x02\x07" /**< id-hmacWithSHA1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 7 } */ #define MBEDTLS_OID_HMAC_SHA224 MBEDTLS_OID_RSA_COMPANY "\x02\x08" /**< id-hmacWithSHA224 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 8 } */ #define MBEDTLS_OID_HMAC_SHA256 MBEDTLS_OID_RSA_COMPANY "\x02\x09" /**< id-hmacWithSHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 9 } */ #define MBEDTLS_OID_HMAC_SHA384 MBEDTLS_OID_RSA_COMPANY "\x02\x0A" /**< id-hmacWithSHA384 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 10 } */ #define MBEDTLS_OID_HMAC_SHA512 MBEDTLS_OID_RSA_COMPANY "\x02\x0B" /**< id-hmacWithSHA512 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 11 } */ /* * Encryption algorithms */ #define MBEDTLS_OID_DES_CBC MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_ALG "\x07" /**< desCBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7 } */ #define MBEDTLS_OID_DES_EDE3_CBC MBEDTLS_OID_RSA_COMPANY "\x03\x07" /**< des-ede3-cbc OBJECT IDENTIFIER ::= { iso(1) member-body(2) -- us(840) rsadsi(113549) encryptionAlgorithm(3) 7 } */ #define MBEDTLS_OID_AES MBEDTLS_OID_NIST_ALG "\x01" /** aes OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistAlgorithm(4) 1 } */ /* * Key Wrapping algorithms */ /* * RFC 5649 */ #define MBEDTLS_OID_AES128_KW MBEDTLS_OID_AES "\x05" /** id-aes128-wrap OBJECT IDENTIFIER ::= { aes 5 } */ #define MBEDTLS_OID_AES128_KWP MBEDTLS_OID_AES "\x08" /** id-aes128-wrap-pad OBJECT IDENTIFIER ::= { aes 8 } */ #define MBEDTLS_OID_AES192_KW MBEDTLS_OID_AES "\x19" /** id-aes192-wrap OBJECT IDENTIFIER ::= { aes 25 } */ #define MBEDTLS_OID_AES192_KWP MBEDTLS_OID_AES "\x1c" /** id-aes192-wrap-pad OBJECT IDENTIFIER ::= { aes 28 } */ #define MBEDTLS_OID_AES256_KW MBEDTLS_OID_AES "\x2d" /** id-aes256-wrap OBJECT IDENTIFIER ::= { aes 45 } */ #define MBEDTLS_OID_AES256_KWP MBEDTLS_OID_AES "\x30" /** id-aes256-wrap-pad OBJECT IDENTIFIER ::= { aes 48 } */ /* * PKCS#5 OIDs */ #define MBEDTLS_OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5 "\x0c" /**< id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} */ #define MBEDTLS_OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5 "\x0d" /**< id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13} */ #define MBEDTLS_OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5 "\x0e" /**< id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14} */ /* * PKCS#5 PBES1 algorithms */ #define MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5 "\x01" /**< pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1} */ #define MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5 "\x04" /**< pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4} */ #define MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5 "\x03" /**< pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3} */ #define MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5 "\x06" /**< pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6} */ #define MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5 "\x0a" /**< pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10} */ #define MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5 "\x0b" /**< pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11} */ /* * PKCS#8 OIDs */ #define MBEDTLS_OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9 "\x0e" /**< extensionRequest OBJECT IDENTIFIER ::= {pkcs-9 14} */ /* * PKCS#12 PBE OIDs */ #define MBEDTLS_OID_PKCS12_PBE MBEDTLS_OID_PKCS12 "\x01" /**< pkcs-12PbeIds OBJECT IDENTIFIER ::= {pkcs-12 1} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE "\x01" /**< pbeWithSHAAnd128BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 1} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE "\x02" /**< pbeWithSHAAnd40BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 2} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x03" /**< pbeWithSHAAnd3-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 3} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x04" /**< pbeWithSHAAnd2-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 4} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE "\x05" /**< pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} */ #define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE "\x06" /**< pbeWithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6} */ /* * EC key algorithms from RFC 5480 */ /* id-ecPublicKey OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } */ #define MBEDTLS_OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_ANSI_X9_62 "\x02\01" /* id-ecDH OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) * schemes(1) ecdh(12) } */ #define MBEDTLS_OID_EC_ALG_ECDH MBEDTLS_OID_CERTICOM "\x01\x0c" /* * ECParameters namedCurve identifiers, from RFC 5480, RFC 5639, and SEC2 */ /* secp192r1 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 1 } */ #define MBEDTLS_OID_EC_GRP_SECP192R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x01" /* secp224r1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 33 } */ #define MBEDTLS_OID_EC_GRP_SECP224R1 MBEDTLS_OID_CERTICOM "\x00\x21" /* secp256r1 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 7 } */ #define MBEDTLS_OID_EC_GRP_SECP256R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x07" /* secp384r1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 34 } */ #define MBEDTLS_OID_EC_GRP_SECP384R1 MBEDTLS_OID_CERTICOM "\x00\x22" /* secp521r1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 35 } */ #define MBEDTLS_OID_EC_GRP_SECP521R1 MBEDTLS_OID_CERTICOM "\x00\x23" /* secp192k1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 31 } */ #define MBEDTLS_OID_EC_GRP_SECP192K1 MBEDTLS_OID_CERTICOM "\x00\x1f" /* secp224k1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 32 } */ #define MBEDTLS_OID_EC_GRP_SECP224K1 MBEDTLS_OID_CERTICOM "\x00\x20" /* secp256k1 OBJECT IDENTIFIER ::= { * iso(1) identified-organization(3) certicom(132) curve(0) 10 } */ #define MBEDTLS_OID_EC_GRP_SECP256K1 MBEDTLS_OID_CERTICOM "\x00\x0a" /* RFC 5639 4.1 * ecStdCurvesAndGeneration OBJECT IDENTIFIER::= {iso(1) * identified-organization(3) teletrust(36) algorithm(3) signature- * algorithm(3) ecSign(2) 8} * ellipticCurve OBJECT IDENTIFIER ::= {ecStdCurvesAndGeneration 1} * versionOne OBJECT IDENTIFIER ::= {ellipticCurve 1} */ #define MBEDTLS_OID_EC_BRAINPOOL_V1 MBEDTLS_OID_TELETRUST "\x03\x03\x02\x08\x01\x01" /* brainpoolP256r1 OBJECT IDENTIFIER ::= {versionOne 7} */ #define MBEDTLS_OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x07" /* brainpoolP384r1 OBJECT IDENTIFIER ::= {versionOne 11} */ #define MBEDTLS_OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0B" /* brainpoolP512r1 OBJECT IDENTIFIER ::= {versionOne 13} */ #define MBEDTLS_OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0D" /* * SEC1 C.1 * * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 } * id-fieldType OBJECT IDENTIFIER ::= { ansi-X9-62 fieldType(1)} */ #define MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62 "\x01" #define MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE "\x01" /* * ECDSA signature identifiers, from RFC 5480 */ #define MBEDTLS_OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62 "\x04" /* signatures(4) */ #define MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG "\x03" /* ecdsa-with-SHA2(3) */ /* ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) 1 } */ #define MBEDTLS_OID_ECDSA_SHA1 MBEDTLS_OID_ANSI_X9_62_SIG "\x01" /* ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) * ecdsa-with-SHA2(3) 1 } */ #define MBEDTLS_OID_ECDSA_SHA224 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x01" /* ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) * ecdsa-with-SHA2(3) 2 } */ #define MBEDTLS_OID_ECDSA_SHA256 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x02" /* ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) * ecdsa-with-SHA2(3) 3 } */ #define MBEDTLS_OID_ECDSA_SHA384 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x03" /* ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) * ecdsa-with-SHA2(3) 4 } */ #define MBEDTLS_OID_ECDSA_SHA512 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x04" #ifdef __cplusplus extern "C" { #endif /** * \brief Base OID descriptor structure */ typedef struct mbedtls_oid_descriptor_t { const char *asn1; /*!< OID ASN.1 representation */ size_t asn1_len; /*!< length of asn1 */ const char *name; /*!< official name (e.g. from RFC) */ const char *description; /*!< human friendly description */ } mbedtls_oid_descriptor_t; /** * \brief Translate an ASN.1 OID into its numeric representation * (e.g. "\x2A\x86\x48\x86\xF7\x0D" into "1.2.840.113549") * * \param buf buffer to put representation in * \param size size of the buffer * \param oid OID to translate * * \return Length of the string written (excluding final NULL) or * MBEDTLS_ERR_OID_BUF_TOO_SMALL in case of error */ int mbedtls_oid_get_numeric_string( char *buf, size_t size, const mbedtls_asn1_buf *oid ); #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) /** * \brief Translate an X.509 extension OID into local values * * \param oid OID to use * \param ext_type place to store the extension type * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_x509_ext_type( const mbedtls_asn1_buf *oid, int *ext_type ); #endif /** * \brief Translate an X.509 attribute type OID into the short name * (e.g. the OID for an X520 Common Name into "CN") * * \param oid OID to use * \param short_name place to store the string pointer * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_attr_short_name( const mbedtls_asn1_buf *oid, const char **short_name ); /** * \brief Translate PublicKeyAlgorithm OID into pk_type * * \param oid OID to use * \param pk_alg place to store public key algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_pk_alg( const mbedtls_asn1_buf *oid, mbedtls_pk_type_t *pk_alg ); /** * \brief Translate pk_type into PublicKeyAlgorithm OID * * \param pk_alg Public key type to look for * \param oid place to store ASN.1 OID string pointer * \param olen length of the OID * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_type_t pk_alg, const char **oid, size_t *olen ); #if defined(MBEDTLS_ECP_C) /** * \brief Translate NamedCurve OID into an EC group identifier * * \param oid OID to use * \param grp_id place to store group id * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_ec_grp( const mbedtls_asn1_buf *oid, mbedtls_ecp_group_id *grp_id ); /** * \brief Translate EC group identifier into NamedCurve OID * * \param grp_id EC group identifier * \param oid place to store ASN.1 OID string pointer * \param olen length of the OID * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_oid_by_ec_grp( mbedtls_ecp_group_id grp_id, const char **oid, size_t *olen ); #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_MD_C) /** * \brief Translate SignatureAlgorithm OID into md_type and pk_type * * \param oid OID to use * \param md_alg place to store message digest algorithm * \param pk_alg place to store public key algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_sig_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg ); /** * \brief Translate SignatureAlgorithm OID into description * * \param oid OID to use * \param desc place to store string pointer * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_sig_alg_desc( const mbedtls_asn1_buf *oid, const char **desc ); /** * \brief Translate md_type and pk_type into SignatureAlgorithm OID * * \param md_alg message digest algorithm * \param pk_alg public key algorithm * \param oid place to store ASN.1 OID string pointer * \param olen length of the OID * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_oid_by_sig_alg( mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, const char **oid, size_t *olen ); /** * \brief Translate hash algorithm OID into md_type * * \param oid OID to use * \param md_alg place to store message digest algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_md_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg ); /** * \brief Translate hmac algorithm OID into md_type * * \param oid OID to use * \param md_hmac place to store message hmac algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_md_hmac( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_hmac ); #endif /* MBEDTLS_MD_C */ /** * \brief Translate Extended Key Usage OID into description * * \param oid OID to use * \param desc place to store string pointer * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_extended_key_usage( const mbedtls_asn1_buf *oid, const char **desc ); /** * \brief Translate md_type into hash algorithm OID * * \param md_alg message digest algorithm * \param oid place to store ASN.1 OID string pointer * \param olen length of the OID * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_oid_by_md( mbedtls_md_type_t md_alg, const char **oid, size_t *olen ); #if defined(MBEDTLS_CIPHER_C) /** * \brief Translate encryption algorithm OID into cipher_type * * \param oid OID to use * \param cipher_alg place to store cipher algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_cipher_alg( const mbedtls_asn1_buf *oid, mbedtls_cipher_type_t *cipher_alg ); #endif /* MBEDTLS_CIPHER_C */ #if defined(MBEDTLS_PKCS12_C) /** * \brief Translate PKCS#12 PBE algorithm OID into md_type and * cipher_type * * \param oid OID to use * \param md_alg place to store message digest algorithm * \param cipher_alg place to store cipher algorithm * * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND */ int mbedtls_oid_get_pkcs12_pbe_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg, mbedtls_cipher_type_t *cipher_alg ); #endif /* MBEDTLS_PKCS12_C */ #ifdef __cplusplus } #endif #endif /* oid.h */ fldigi-4.2.05/src/include/mbedtls/ctr_drbg.h0000664000175000017500000003367014611711171015577 00000000000000/** * \file ctr_drbg.h * * \brief This file contains CTR_DRBG definitions and functions. * * CTR_DRBG is a standardized way of building a PRNG from a block-cipher * in counter mode operation, as defined in NIST SP 800-90A: * Recommendation for Random Number Generation Using Deterministic Random * Bit Generators. * * The Mbed TLS implementation of CTR_DRBG uses AES-256 (default) or AES-128 * as the underlying block cipher. * * \warning Using 128-bit keys for CTR_DRBG limits the security of generated * keys and operations that use random values generated to 128-bit security. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CTR_DRBG_H #define MBEDTLS_CTR_DRBG_H #include "aes.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif #define MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED -0x0034 /**< The entropy source failed. */ #define MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG -0x0036 /**< The requested random buffer length is too big. */ #define MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG -0x0038 /**< The input (entropy + additional data) is too large. */ #define MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR -0x003A /**< Read or write error in file. */ #define MBEDTLS_CTR_DRBG_BLOCKSIZE 16 /**< The block size used by the cipher. */ #if defined(MBEDTLS_CTR_DRBG_USE_128_BIT_KEY) #define MBEDTLS_CTR_DRBG_KEYSIZE 16 /**< The key size used by the cipher (compile-time choice: 128 bits). */ #else #define MBEDTLS_CTR_DRBG_KEYSIZE 32 /**< The key size used by the cipher (compile-time choice: 256 bits). */ #endif #define MBEDTLS_CTR_DRBG_KEYBITS ( MBEDTLS_CTR_DRBG_KEYSIZE * 8 ) /**< The key size for the DRBG operation, in bits. */ #define MBEDTLS_CTR_DRBG_SEEDLEN ( MBEDTLS_CTR_DRBG_KEYSIZE + MBEDTLS_CTR_DRBG_BLOCKSIZE ) /**< The seed length, calculated as (counter + AES key). */ /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them using the compiler command * line. * \{ */ #if !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) #define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< The amount of entropy used per seed by default: *
  • 48 with SHA-512.
  • *
  • 32 with SHA-256.
*/ #else #define MBEDTLS_CTR_DRBG_ENTROPY_LEN 32 /**< Amount of entropy used per seed by default: *
  • 48 with SHA-512.
  • *
  • 32 with SHA-256.
*/ #endif #endif #if !defined(MBEDTLS_CTR_DRBG_RESEED_INTERVAL) #define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< The interval before reseed is performed by default. */ #endif #if !defined(MBEDTLS_CTR_DRBG_MAX_INPUT) #define MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< The maximum number of additional input Bytes. */ #endif #if !defined(MBEDTLS_CTR_DRBG_MAX_REQUEST) #define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< The maximum number of requested Bytes per call. */ #endif #if !defined(MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) #define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< The maximum size of seed or reseed buffer. */ #endif /* \} name SECTION: Module settings */ #define MBEDTLS_CTR_DRBG_PR_OFF 0 /**< Prediction resistance is disabled. */ #define MBEDTLS_CTR_DRBG_PR_ON 1 /**< Prediction resistance is enabled. */ #ifdef __cplusplus extern "C" { #endif /** * \brief The CTR_DRBG context structure. */ typedef struct mbedtls_ctr_drbg_context { unsigned char counter[16]; /*!< The counter (V). */ int reseed_counter; /*!< The reseed counter. */ int prediction_resistance; /*!< This determines whether prediction resistance is enabled, that is whether to systematically reseed before each random generation. */ size_t entropy_len; /*!< The amount of entropy grabbed on each seed or reseed operation. */ int reseed_interval; /*!< The reseed interval. */ mbedtls_aes_context aes_ctx; /*!< The AES context. */ /* * Callbacks (Entropy) */ int (*f_entropy)(void *, unsigned char *, size_t); /*!< The entropy callback function. */ void *p_entropy; /*!< The context for the entropy function. */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } mbedtls_ctr_drbg_context; /** * \brief This function initializes the CTR_DRBG context, * and prepares it for mbedtls_ctr_drbg_seed() * or mbedtls_ctr_drbg_free(). * * \param ctx The CTR_DRBG context to initialize. */ void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ); /** * \brief This function seeds and sets up the CTR_DRBG * entropy source for future reseeds. * * \note Personalization data can be provided in addition to the more generic * entropy source, to make this instantiation as unique as possible. * * \param ctx The CTR_DRBG context to seed. * \param f_entropy The entropy callback, taking as arguments the * \p p_entropy context, the buffer to fill, and the length of the buffer. * \param p_entropy The entropy context. * \param custom Personalization data, that is device-specific identifiers. Can be NULL. * \param len The length of the personalization data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure. */ int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len ); /** * \brief This function clears CTR_CRBG context data. * * \param ctx The CTR_DRBG context to clear. */ void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx ); /** * \brief This function turns prediction resistance on or off. * The default value is off. * * \note If enabled, entropy is gathered at the beginning of * every call to mbedtls_ctr_drbg_random_with_add(). * Only use this if your entropy source has sufficient * throughput. * * \param ctx The CTR_DRBG context. * \param resistance #MBEDTLS_CTR_DRBG_PR_ON or #MBEDTLS_CTR_DRBG_PR_OFF. */ void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, int resistance ); /** * \brief This function sets the amount of entropy grabbed on each * seed or reseed. The default value is * #MBEDTLS_CTR_DRBG_ENTROPY_LEN. * * \param ctx The CTR_DRBG context. * \param len The amount of entropy to grab. */ void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx, size_t len ); /** * \brief This function sets the reseed interval. * The default value is #MBEDTLS_CTR_DRBG_RESEED_INTERVAL. * * \param ctx The CTR_DRBG context. * \param interval The reseed interval. */ void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx, int interval ); /** * \brief This function reseeds the CTR_DRBG context, that is * extracts data from the entropy source. * * \param ctx The CTR_DRBG context. * \param additional Additional data to add to the state. Can be NULL. * \param len The length of the additional data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on failure. */ int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t len ); /** * \brief This function updates the state of the CTR_DRBG context. * * \param ctx The CTR_DRBG context. * \param additional The data to update the state with. * \param add_len Length of \p additional in bytes. This must be at * most #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG if * \p add_len is more than * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT. * \return An error from the underlying AES cipher on failure. */ int mbedtls_ctr_drbg_update_ret( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t add_len ); /** * \brief This function updates a CTR_DRBG instance with additional * data and uses it to generate random data. * * \note The function automatically reseeds if the reseed counter is exceeded. * * \param p_rng The CTR_DRBG context. This must be a pointer to a * #mbedtls_ctr_drbg_context structure. * \param output The buffer to fill. * \param output_len The length of the buffer. * \param additional Additional data to update. Can be NULL. * \param add_len The length of the additional data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or * #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure. */ int mbedtls_ctr_drbg_random_with_add( void *p_rng, unsigned char *output, size_t output_len, const unsigned char *additional, size_t add_len ); /** * \brief This function uses CTR_DRBG to generate random data. * * \note The function automatically reseeds if the reseed counter is exceeded. * * \param p_rng The CTR_DRBG context. This must be a pointer to a * #mbedtls_ctr_drbg_context structure. * \param output The buffer to fill. * \param output_len The length of the buffer. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or * #MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG on failure. */ int mbedtls_ctr_drbg_random( void *p_rng, unsigned char *output, size_t output_len ); #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function updates the state of the CTR_DRBG context. * * \deprecated Superseded by mbedtls_ctr_drbg_update_ret() * in 2.16.0. * * \note If \p add_len is greater than * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT, only the first * #MBEDTLS_CTR_DRBG_MAX_SEED_INPUT Bytes are used. * The remaining Bytes are silently discarded. * * \param ctx The CTR_DRBG context. * \param additional The data to update the state with. * \param add_len Length of \p additional data. */ MBEDTLS_DEPRECATED void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t add_len ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #if defined(MBEDTLS_FS_IO) /** * \brief This function writes a seed file. * * \param ctx The CTR_DRBG context. * \param path The name of the file. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED on * failure. */ int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); /** * \brief This function reads and updates a seed file. The seed * is added to this instance. * * \param ctx The CTR_DRBG context. * \param path The name of the file. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error. * \return #MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or * #MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG on failure. */ int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); #endif /* MBEDTLS_FS_IO */ /** * \brief The CTR_DRBG checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_ctr_drbg_self_test( int verbose ); /* Internal functions (do not call directly) */ int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *, int (*)(void *, unsigned char *, size_t), void *, const unsigned char *, size_t, size_t ); #ifdef __cplusplus } #endif #endif /* ctr_drbg.h */ fldigi-4.2.05/src/include/mbedtls/ecdsa.h0000664000175000017500000006051114611711171015062 00000000000000/** * \file ecdsa.h * * \brief This file contains ECDSA definitions and functions. * * The Elliptic Curve Digital Signature Algorithm (ECDSA) is defined in * Standards for Efficient Cryptography Group (SECG): * SEC1 Elliptic Curve Cryptography. * The use of ECDSA for TLS is defined in RFC-4492: Elliptic Curve * Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS). * */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ECDSA_H #define MBEDTLS_ECDSA_H #include "ecp.h" #include "md.h" /* * RFC-4492 page 20: * * Ecdsa-Sig-Value ::= SEQUENCE { * r INTEGER, * s INTEGER * } * * Size is at most * 1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s, * twice that + 1 (tag) + 2 (len) for the sequence * (assuming ECP_MAX_BYTES is less than 126 for r and s, * and less than 124 (total len <= 255) for the sequence) */ #if MBEDTLS_ECP_MAX_BYTES > 124 #error "MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN" #endif /** The maximal size of an ECDSA signature in Bytes. */ #define MBEDTLS_ECDSA_MAX_LEN ( 3 + 2 * ( 3 + MBEDTLS_ECP_MAX_BYTES ) ) #ifdef __cplusplus extern "C" { #endif /** * \brief The ECDSA context structure. * * \warning Performing multiple operations concurrently on the same * ECDSA context is not supported; objects of this type * should not be shared between multiple threads. */ typedef mbedtls_ecp_keypair mbedtls_ecdsa_context; #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Internal restart context for ecdsa_verify() * * \note Opaque struct, defined in ecdsa.c */ typedef struct mbedtls_ecdsa_restart_ver mbedtls_ecdsa_restart_ver_ctx; /** * \brief Internal restart context for ecdsa_sign() * * \note Opaque struct, defined in ecdsa.c */ typedef struct mbedtls_ecdsa_restart_sig mbedtls_ecdsa_restart_sig_ctx; #if defined(MBEDTLS_ECDSA_DETERMINISTIC) /** * \brief Internal restart context for ecdsa_sign_det() * * \note Opaque struct, defined in ecdsa.c */ typedef struct mbedtls_ecdsa_restart_det mbedtls_ecdsa_restart_det_ctx; #endif /** * \brief General context for resuming ECDSA operations */ typedef struct { mbedtls_ecp_restart_ctx ecp; /*!< base context for ECP restart and shared administrative info */ mbedtls_ecdsa_restart_ver_ctx *ver; /*!< ecdsa_verify() sub-context */ mbedtls_ecdsa_restart_sig_ctx *sig; /*!< ecdsa_sign() sub-context */ #if defined(MBEDTLS_ECDSA_DETERMINISTIC) mbedtls_ecdsa_restart_det_ctx *det; /*!< ecdsa_sign_det() sub-context */ #endif } mbedtls_ecdsa_restart_ctx; #else /* MBEDTLS_ECP_RESTARTABLE */ /* Now we can declare functions that take a pointer to that */ typedef void mbedtls_ecdsa_restart_ctx; #endif /* MBEDTLS_ECP_RESTARTABLE */ /** * \brief This function computes the ECDSA signature of a * previously-hashed message. * * \note The deterministic version implemented in * mbedtls_ecdsa_sign_det() is usually preferred. * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated * as defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.3, step 5. * * \see ecp.h * * \param grp The context for the elliptic curve to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param r The MPI context in which to store the first part * the signature. This must be initialized. * \param s The MPI context in which to store the second part * the signature. This must be initialized. * \param d The private signing key. This must be initialized. * \param buf The content to be signed. This is usually the hash of * the original data to be signed. This must be a readable * buffer of length \p blen Bytes. It may be \c NULL if * \p blen is zero. * \param blen The length of \p buf in Bytes. * \param f_rng The RNG function. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context parameter. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX * or \c MBEDTLS_MPI_XXX error code on failure. */ int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_ECDSA_DETERMINISTIC) /** * \brief This function computes the ECDSA signature of a * previously-hashed message, deterministic version. * * For more information, see RFC-6979: Deterministic * Usage of the Digital Signature Algorithm (DSA) and Elliptic * Curve Digital Signature Algorithm (ECDSA). * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.3, step 5. * * \see ecp.h * * \param grp The context for the elliptic curve to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param r The MPI context in which to store the first part * the signature. This must be initialized. * \param s The MPI context in which to store the second part * the signature. This must be initialized. * \param d The private signing key. This must be initialized * and setup, for example through mbedtls_ecp_gen_privkey(). * \param buf The hashed content to be signed. This must be a readable * buffer of length \p blen Bytes. It may be \c NULL if * \p blen is zero. * \param blen The length of \p buf in Bytes. * \param md_alg The hash algorithm used to hash the original data. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX * error code on failure. */ int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, mbedtls_md_type_t md_alg ); #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ /** * \brief This function verifies the ECDSA signature of a * previously-hashed message. * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.4, step 3. * * \see ecp.h * * \param grp The ECP group to use. * This must be initialized and have group parameters * set, for example through mbedtls_ecp_group_load(). * \param buf The hashed content that was signed. This must be a readable * buffer of length \p blen Bytes. It may be \c NULL if * \p blen is zero. * \param blen The length of \p buf in Bytes. * \param Q The public key to use for verification. This must be * initialized and setup. * \param r The first integer of the signature. * This must be initialized. * \param s The second integer of the signature. * This must be initialized. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the signature * is invalid. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX * error code on failure for any other reason. */ int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp, const unsigned char *buf, size_t blen, const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s); /** * \brief This function computes the ECDSA signature and writes it * to a buffer, serialized as defined in RFC-4492: * Elliptic Curve Cryptography (ECC) Cipher Suites for * Transport Layer Security (TLS). * * \warning It is not thread-safe to use the same context in * multiple threads. * * \note The deterministic version is used if * #MBEDTLS_ECDSA_DETERMINISTIC is defined. For more * information, see RFC-6979: Deterministic Usage * of the Digital Signature Algorithm (DSA) and Elliptic * Curve Digital Signature Algorithm (ECDSA). * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.3, step 5. * * \see ecp.h * * \param ctx The ECDSA context to use. This must be initialized * and have a group and private key bound to it, for example * via mbedtls_ecdsa_genkey() or mbedtls_ecdsa_from_keypair(). * \param md_alg The message digest that was used to hash the message. * \param hash The message hash to be signed. This must be a readable * buffer of length \p blen Bytes. * \param hlen The length of the hash \p hash in Bytes. * \param sig The buffer to which to write the signature. This must be a * writable buffer of length at least twice as large as the * size of the curve used, plus 9. For example, 73 Bytes if * a 256-bit curve is used. A buffer length of * #MBEDTLS_ECDSA_MAX_LEN is always safe. * \param slen The address at which to store the actual length of * the signature written. Must not be \c NULL. * \param f_rng The RNG function. This must not be \c NULL if * #MBEDTLS_ECDSA_DETERMINISTIC is unset. Otherwise, * it is unused and may be set to \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't use a context. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or * \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function computes the ECDSA signature and writes it * to a buffer, in a restartable way. * * \see \c mbedtls_ecdsa_write_signature() * * \note This function is like \c mbedtls_ecdsa_write_signature() * but it can return early and restart according to the limit * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param ctx The ECDSA context to use. This must be initialized * and have a group and private key bound to it, for example * via mbedtls_ecdsa_genkey() or mbedtls_ecdsa_from_keypair(). * \param md_alg The message digest that was used to hash the message. * \param hash The message hash to be signed. This must be a readable * buffer of length \p blen Bytes. * \param hlen The length of the hash \p hash in Bytes. * \param sig The buffer to which to write the signature. This must be a * writable buffer of length at least twice as large as the * size of the curve used, plus 9. For example, 73 Bytes if * a 256-bit curve is used. A buffer length of * #MBEDTLS_ECDSA_MAX_LEN is always safe. * \param slen The address at which to store the actual length of * the signature written. Must not be \c NULL. * \param f_rng The RNG function. This must not be \c NULL if * #MBEDTLS_ECDSA_DETERMINISTIC is unset. Otherwise, * it is unused and may be set to \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng is \c NULL or doesn't use a context. * \param rs_ctx The restart context to use. This may be \c NULL to disable * restarting. If it is not \c NULL, it must point to an * initialized restart context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or * \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_ecdsa_write_signature_restartable( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecdsa_restart_ctx *rs_ctx ); #if defined(MBEDTLS_ECDSA_DETERMINISTIC) #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function computes an ECDSA signature and writes * it to a buffer, serialized as defined in RFC-4492: * Elliptic Curve Cryptography (ECC) Cipher Suites for * Transport Layer Security (TLS). * * The deterministic version is defined in RFC-6979: * Deterministic Usage of the Digital Signature Algorithm (DSA) * and Elliptic Curve Digital Signature Algorithm (ECDSA). * * \warning It is not thread-safe to use the same context in * multiple threads. * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.3, step 5. * * \see ecp.h * * \deprecated Superseded by mbedtls_ecdsa_write_signature() in * Mbed TLS version 2.0 and later. * * \param ctx The ECDSA context to use. This must be initialized * and have a group and private key bound to it, for example * via mbedtls_ecdsa_genkey() or mbedtls_ecdsa_from_keypair(). * \param hash The message hash to be signed. This must be a readable * buffer of length \p blen Bytes. * \param hlen The length of the hash \p hash in Bytes. * \param sig The buffer to which to write the signature. This must be a * writable buffer of length at least twice as large as the * size of the curve used, plus 9. For example, 73 Bytes if * a 256-bit curve is used. A buffer length of * #MBEDTLS_ECDSA_MAX_LEN is always safe. * \param slen The address at which to store the actual length of * the signature written. Must not be \c NULL. * \param md_alg The message digest that was used to hash the message. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or * \c MBEDTLS_ERR_ASN1_XXX error code on failure. */ int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED; #undef MBEDTLS_DEPRECATED #endif /* MBEDTLS_DEPRECATED_REMOVED */ #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ /** * \brief This function reads and verifies an ECDSA signature. * * \note If the bitlength of the message hash is larger than the * bitlength of the group order, then the hash is truncated as * defined in Standards for Efficient Cryptography Group * (SECG): SEC1 Elliptic Curve Cryptography, section * 4.1.4, step 3. * * \see ecp.h * * \param ctx The ECDSA context to use. This must be initialized * and have a group and public key bound to it. * \param hash The message hash that was signed. This must be a readable * buffer of length \p size Bytes. * \param hlen The size of the hash \p hash. * \param sig The signature to read and verify. This must be a readable * buffer of length \p slen Bytes. * \param slen The size of \p sig in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid. * \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid * signature in \p sig, but its length is less than \p siglen. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX * error code on failure for any other reason. */ int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, const unsigned char *sig, size_t slen ); /** * \brief This function reads and verifies an ECDSA signature, * in a restartable way. * * \see \c mbedtls_ecdsa_read_signature() * * \note This function is like \c mbedtls_ecdsa_read_signature() * but it can return early and restart according to the limit * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param ctx The ECDSA context to use. This must be initialized * and have a group and public key bound to it. * \param hash The message hash that was signed. This must be a readable * buffer of length \p size Bytes. * \param hlen The size of the hash \p hash. * \param sig The signature to read and verify. This must be a readable * buffer of length \p slen Bytes. * \param slen The size of \p sig in Bytes. * \param rs_ctx The restart context to use. This may be \c NULL to disable * restarting. If it is not \c NULL, it must point to an * initialized restart context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid. * \return #MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if there is a valid * signature in \p sig, but its length is less than \p siglen. * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). * \return Another \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_ERR_MPI_XXX * error code on failure for any other reason. */ int mbedtls_ecdsa_read_signature_restartable( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, const unsigned char *sig, size_t slen, mbedtls_ecdsa_restart_ctx *rs_ctx ); /** * \brief This function generates an ECDSA keypair on the given curve. * * \see ecp.h * * \param ctx The ECDSA context to store the keypair in. * This must be initialized. * \param gid The elliptic curve to use. One of the various * \c MBEDTLS_ECP_DP_XXX macros depending on configuration. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG context to be passed to \p f_rng. This may be * \c NULL if \p f_rng doesn't need a context argument. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX code on failure. */ int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This function sets up an ECDSA context from an EC key pair. * * \see ecp.h * * \param ctx The ECDSA context to setup. This must be initialized. * \param key The EC key to use. This must be initialized and hold * a private-public key pair or a public key. In the former * case, the ECDSA context may be used for signature creation * and verification after this call. In the latter case, it * may be used for signature verification. * * \return \c 0 on success. * \return An \c MBEDTLS_ERR_ECP_XXX code on failure. */ int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key ); /** * \brief This function initializes an ECDSA context. * * \param ctx The ECDSA context to initialize. * This must not be \c NULL. */ void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx ); /** * \brief This function frees an ECDSA context. * * \param ctx The ECDSA context to free. This may be \c NULL, * in which case this function does nothing. If it * is not \c NULL, it must be initialized. */ void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx ); #if defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Initialize a restart context. * * \param ctx The restart context to initialize. * This must not be \c NULL. */ void mbedtls_ecdsa_restart_init( mbedtls_ecdsa_restart_ctx *ctx ); /** * \brief Free the components of a restart context. * * \param ctx The restart context to free. This may be \c NULL, * in which case this function does nothing. If it * is not \c NULL, it must be initialized. */ void mbedtls_ecdsa_restart_free( mbedtls_ecdsa_restart_ctx *ctx ); #endif /* MBEDTLS_ECP_RESTARTABLE */ #ifdef __cplusplus } #endif #endif /* ecdsa.h */ fldigi-4.2.05/src/include/mbedtls/debug.h0000664000175000017500000002411714611711171015073 00000000000000/** * \file debug.h * * \brief Functions for controlling and providing debug output from the library. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_DEBUG_H #define MBEDTLS_DEBUG_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "ssl.h" #if defined(MBEDTLS_ECP_C) #include "ecp.h" #endif #if defined(MBEDTLS_DEBUG_C) #define MBEDTLS_DEBUG_STRIP_PARENS( ... ) __VA_ARGS__ #define MBEDTLS_SSL_DEBUG_MSG( level, args ) \ mbedtls_debug_print_msg( ssl, level, __FILE__, __LINE__, \ MBEDTLS_DEBUG_STRIP_PARENS args ) #define MBEDTLS_SSL_DEBUG_RET( level, text, ret ) \ mbedtls_debug_print_ret( ssl, level, __FILE__, __LINE__, text, ret ) #define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len ) \ mbedtls_debug_print_buf( ssl, level, __FILE__, __LINE__, text, buf, len ) #if defined(MBEDTLS_BIGNUM_C) #define MBEDTLS_SSL_DEBUG_MPI( level, text, X ) \ mbedtls_debug_print_mpi( ssl, level, __FILE__, __LINE__, text, X ) #endif #if defined(MBEDTLS_ECP_C) #define MBEDTLS_SSL_DEBUG_ECP( level, text, X ) \ mbedtls_debug_print_ecp( ssl, level, __FILE__, __LINE__, text, X ) #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) #define MBEDTLS_SSL_DEBUG_CRT( level, text, crt ) \ mbedtls_debug_print_crt( ssl, level, __FILE__, __LINE__, text, crt ) #endif #if defined(MBEDTLS_ECDH_C) #define MBEDTLS_SSL_DEBUG_ECDH( level, ecdh, attr ) \ mbedtls_debug_printf_ecdh( ssl, level, __FILE__, __LINE__, ecdh, attr ) #endif #else /* MBEDTLS_DEBUG_C */ #define MBEDTLS_SSL_DEBUG_MSG( level, args ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_RET( level, text, ret ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_MPI( level, text, X ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_ECP( level, text, X ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_CRT( level, text, crt ) do { } while( 0 ) #define MBEDTLS_SSL_DEBUG_ECDH( level, ecdh, attr ) do { } while( 0 ) #endif /* MBEDTLS_DEBUG_C */ #ifdef __cplusplus extern "C" { #endif /** * \brief Set the threshold error level to handle globally all debug output. * Debug messages that have a level over the threshold value are * discarded. * (Default value: 0 = No debug ) * * \param threshold theshold level of messages to filter on. Messages at a * higher level will be discarded. * - Debug levels * - 0 No debug * - 1 Error * - 2 State change * - 3 Informational * - 4 Verbose */ void mbedtls_debug_set_threshold( int threshold ); /** * \brief Print a message to the debug output. This function is always used * through the MBEDTLS_SSL_DEBUG_MSG() macro, which supplies the ssl * context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the message has occurred in * \param line line number the message has occurred at * \param format format specifier, in printf format * \param ... variables used by the format specifier * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *format, ... ); /** * \brief Print the return value of a function to the debug output. This * function is always used through the MBEDTLS_SSL_DEBUG_RET() macro, * which supplies the ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text the name of the function that returned the error * \param ret the return code value * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, int ret ); /** * \brief Output a buffer of size len bytes to the debug output. This function * is always used through the MBEDTLS_SSL_DEBUG_BUF() macro, * which supplies the ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text a name or label for the buffer being dumped. Normally the * variable or buffer name * \param buf the buffer to be outputted * \param len length of the buffer * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const unsigned char *buf, size_t len ); #if defined(MBEDTLS_BIGNUM_C) /** * \brief Print a MPI variable to the debug output. This function is always * used through the MBEDTLS_SSL_DEBUG_MPI() macro, which supplies the * ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text a name or label for the MPI being output. Normally the * variable name * \param X the MPI variable * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_mpi *X ); #endif #if defined(MBEDTLS_ECP_C) /** * \brief Print an ECP point to the debug output. This function is always * used through the MBEDTLS_SSL_DEBUG_ECP() macro, which supplies the * ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text a name or label for the ECP point being output. Normally the * variable name * \param X the ECP point * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_ecp_point *X ); #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Print a X.509 certificate structure to the debug output. This * function is always used through the MBEDTLS_SSL_DEBUG_CRT() macro, * which supplies the ssl context, file and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param text a name or label for the certificate being output * \param crt X.509 certificate structure * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_x509_crt *crt ); #endif #if defined(MBEDTLS_ECDH_C) typedef enum { MBEDTLS_DEBUG_ECDH_Q, MBEDTLS_DEBUG_ECDH_QP, MBEDTLS_DEBUG_ECDH_Z, } mbedtls_debug_ecdh_attr; /** * \brief Print a field of the ECDH structure in the SSL context to the debug * output. This function is always used through the * MBEDTLS_SSL_DEBUG_ECDH() macro, which supplies the ssl context, file * and line number parameters. * * \param ssl SSL context * \param level error level of the debug message * \param file file the error has occurred in * \param line line number the error has occurred in * \param ecdh the ECDH context * \param attr the identifier of the attribute being output * * \attention This function is intended for INTERNAL usage within the * library only. */ void mbedtls_debug_printf_ecdh( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const mbedtls_ecdh_context *ecdh, mbedtls_debug_ecdh_attr attr ); #endif #ifdef __cplusplus } #endif #endif /* debug.h */ fldigi-4.2.05/src/include/mbedtls/x509_crt.h0000664000175000017500000007571714611711171015376 00000000000000/** * \file x509_crt.h * * \brief X.509 certificate parsing and writing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_X509_CRT_H #define MBEDTLS_X509_CRT_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "x509.h" #include "x509_crl.h" /** * \addtogroup x509_module * \{ */ #ifdef __cplusplus extern "C" { #endif /** * \name Structures and functions for parsing and writing X.509 certificates * \{ */ /** * Container for an X.509 certificate. The certificate may be chained. */ typedef struct mbedtls_x509_crt { mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ int version; /**< The X.509 version. (1=v1, 2=v2, 3=v3) */ mbedtls_x509_buf serial; /**< Unique id for certificate issued by a specific CA. */ mbedtls_x509_buf sig_oid; /**< Signature algorithm, e.g. sha1RSA */ mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). Used for quick comparison. */ mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). Used for quick comparison. */ mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ mbedtls_x509_time valid_from; /**< Start time of certificate validity. */ mbedtls_x509_time valid_to; /**< End time of certificate validity. */ mbedtls_pk_context pk; /**< Container for the public key context. */ mbedtls_x509_buf issuer_id; /**< Optional X.509 v2/v3 issuer unique identifier. */ mbedtls_x509_buf subject_id; /**< Optional X.509 v2/v3 subject unique identifier. */ mbedtls_x509_buf v3_ext; /**< Optional X.509 v3 extensions. */ mbedtls_x509_sequence subject_alt_names; /**< Optional list of Subject Alternative Names (Only dNSName supported). */ int ext_types; /**< Bit string containing detected and parsed extensions */ int ca_istrue; /**< Optional Basic Constraint extension value: 1 if this certificate belongs to a CA, 0 otherwise. */ int max_pathlen; /**< Optional Basic Constraint extension value: The maximum path length to the root certificate. Path length is 1 higher than RFC 5280 'meaning', so 1+ */ unsigned int key_usage; /**< Optional key usage extension value: See the values in x509.h */ mbedtls_x509_sequence ext_key_usage; /**< Optional list of extended key usage OIDs. */ unsigned char ns_cert_type; /**< Optional Netscape certificate type extension value: See the values in x509.h */ mbedtls_x509_buf sig; /**< Signature: hash of the tbs part signed with the private key. */ mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ struct mbedtls_x509_crt *next; /**< Next certificate in the CA-chain. */ } mbedtls_x509_crt; /** * Build flag from an algorithm/curve identifier (pk, md, ecp) * Since 0 is always XXX_NONE, ignore it. */ #define MBEDTLS_X509_ID_FLAG( id ) ( 1 << ( id - 1 ) ) /** * Security profile for certificate verification. * * All lists are bitfields, built by ORing flags from MBEDTLS_X509_ID_FLAG(). */ typedef struct mbedtls_x509_crt_profile { uint32_t allowed_mds; /**< MDs for signatures */ uint32_t allowed_pks; /**< PK algs for signatures */ uint32_t allowed_curves; /**< Elliptic curves for ECDSA */ uint32_t rsa_min_bitlen; /**< Minimum size for RSA keys */ } mbedtls_x509_crt_profile; #define MBEDTLS_X509_CRT_VERSION_1 0 #define MBEDTLS_X509_CRT_VERSION_2 1 #define MBEDTLS_X509_CRT_VERSION_3 2 #define MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN 32 #define MBEDTLS_X509_RFC5280_UTC_TIME_LEN 15 #if !defined( MBEDTLS_X509_MAX_FILE_PATH_LEN ) #define MBEDTLS_X509_MAX_FILE_PATH_LEN 512 #endif /** * Container for writing a certificate (CRT) */ typedef struct mbedtls_x509write_cert { int version; mbedtls_mpi serial; mbedtls_pk_context *subject_key; mbedtls_pk_context *issuer_key; mbedtls_asn1_named_data *subject; mbedtls_asn1_named_data *issuer; mbedtls_md_type_t md_alg; char not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; char not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; mbedtls_asn1_named_data *extensions; } mbedtls_x509write_cert; /** * Item in a verification chain: cert and flags for it */ typedef struct { mbedtls_x509_crt *crt; uint32_t flags; } mbedtls_x509_crt_verify_chain_item; /** * Max size of verification chain: end-entity + intermediates + trusted root */ #define MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE ( MBEDTLS_X509_MAX_INTERMEDIATE_CA + 2 ) /** * Verification chain as built by \c mbedtls_crt_verify_chain() */ typedef struct { mbedtls_x509_crt_verify_chain_item items[MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE]; unsigned len; } mbedtls_x509_crt_verify_chain; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Context for resuming X.509 verify operations */ typedef struct { /* for check_signature() */ mbedtls_pk_restart_ctx pk; /* for find_parent_in() */ mbedtls_x509_crt *parent; /* non-null iff parent_in in progress */ mbedtls_x509_crt *fallback_parent; int fallback_signature_is_good; /* for find_parent() */ int parent_is_trusted; /* -1 if find_parent is not in progress */ /* for verify_chain() */ enum { x509_crt_rs_none, x509_crt_rs_find_parent, } in_progress; /* none if no operation is in progress */ int self_cnt; mbedtls_x509_crt_verify_chain ver_chain; } mbedtls_x509_crt_restart_ctx; #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /* Now we can declare functions that take a pointer to that */ typedef void mbedtls_x509_crt_restart_ctx; #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * Default security profile. Should provide a good balance between security * and compatibility with current deployments. */ extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default; /** * Expected next default profile. Recommended for new deployments. * Currently targets a 128-bit security level, except for RSA-2048. */ extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next; /** * NSA Suite B profile. */ extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb; /** * \brief Parse a single DER formatted certificate and add it * to the chained list. * * \param chain points to the start of the chain * \param buf buffer holding the certificate DER data * \param buflen size of the buffer * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ); /** * \brief Parse one DER-encoded or one or more concatenated PEM-encoded * certificates and add them to the chained list. * * For CRTs in PEM encoding, the function parses permissively: * if at least one certificate can be parsed, the function * returns the number of certificates for which parsing failed * (hence \c 0 if all certificates were parsed successfully). * If no certificate could be parsed, the function returns * the first (negative) error encountered during parsing. * * PEM encoded certificates may be interleaved by other data * such as human readable descriptions of their content, as * long as the certificates are enclosed in the PEM specific * '-----{BEGIN/END} CERTIFICATE-----' delimiters. * * \param chain The chain to which to add the parsed certificates. * \param buf The buffer holding the certificate data in PEM or DER format. * For certificates in PEM encoding, this may be a concatenation * of multiple certificates; for DER encoding, the buffer must * comprise exactly one certificate. * \param buflen The size of \p buf, including the terminating \c NULL byte * in case of PEM encoded data. * * \return \c 0 if all certificates were parsed successfully. * \return The (positive) number of certificates that couldn't * be parsed if parsing was partly successful (see above). * \return A negative X509 or PEM error code otherwise. * */ int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ); #if defined(MBEDTLS_FS_IO) /** * \brief Load one or more certificates and add them * to the chained list. Parses permissively. If some * certificates can be parsed, the result is the number * of failed certificates it encountered. If none complete * correctly, the first error is returned. * * \param chain points to the start of the chain * \param path filename to read the certificates from * * \return 0 if all certificates parsed successfully, a positive number * if partly successful or a specific X509 or PEM error code */ int mbedtls_x509_crt_parse_file( mbedtls_x509_crt *chain, const char *path ); /** * \brief Load one or more certificate files from a path and add them * to the chained list. Parses permissively. If some * certificates can be parsed, the result is the number * of failed certificates it encountered. If none complete * correctly, the first error is returned. * * \param chain points to the start of the chain * \param path directory / folder to read the certificate files from * * \return 0 if all certificates parsed successfully, a positive number * if partly successful or a specific X509 or PEM error code */ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ); #endif /* MBEDTLS_FS_IO */ /** * \brief Returns an informational string about the * certificate. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param prefix A line prefix * \param crt The X509 certificate to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_crt_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_crt *crt ); /** * \brief Returns an informational string about the * verification status of a certificate. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param prefix A line prefix * \param flags Verification flags created by mbedtls_x509_crt_verify() * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix, uint32_t flags ); /** * \brief Verify the certificate signature * * The verify callback is a user-supplied callback that * can clear / modify / add flags for a certificate. If set, * the verification callback is called for each * certificate in the chain (from the trust-ca down to the * presented crt). The parameters for the callback are: * (void *parameter, mbedtls_x509_crt *crt, int certificate_depth, * int *flags). With the flags representing current flags for * that specific certificate and the certificate depth from * the bottom (Peer cert depth = 0). * * All flags left after returning from the callback * are also returned to the application. The function should * return 0 for anything (including invalid certificates) * other than fatal error, as a non-zero return code * immediately aborts the verification process. For fatal * errors, a specific error code should be used (different * from MBEDTLS_ERR_X509_CERT_VERIFY_FAILED which should not * be returned at this point), or MBEDTLS_ERR_X509_FATAL_ERROR * can be used if no better code is available. * * \note In case verification failed, the results can be displayed * using \c mbedtls_x509_crt_verify_info() * * \note Same as \c mbedtls_x509_crt_verify_with_profile() with the * default security profile. * * \note It is your responsibility to provide up-to-date CRLs for * all trusted CAs. If no CRL is provided for the CA that was * used to sign the certificate, CRL verification is skipped * silently, that is *without* setting any flag. * * \note The \c trust_ca list can contain two types of certificates: * (1) those of trusted root CAs, so that certificates * chaining up to those CAs will be trusted, and (2) * self-signed end-entity certificates to be trusted (for * specific peers you know) - in that case, the self-signed * certificate doesn't need to have the CA bit set. * * \param crt a certificate (chain) to be verified * \param trust_ca the list of trusted CAs (see note above) * \param ca_crl the list of CRLs for trusted CAs (see note above) * \param cn expected Common Name (can be set to * NULL if the CN must not be verified) * \param flags result of the verification * \param f_vrfy verification function * \param p_vrfy verification parameter * * \return 0 (and flags set to 0) if the chain was verified and valid, * MBEDTLS_ERR_X509_CERT_VERIFY_FAILED if the chain was verified * but found to be invalid, in which case *flags will have one * or more MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX * flags set, or another error (and flags set to 0xffffffff) * in case of a fatal error encountered during the * verification process. */ int mbedtls_x509_crt_verify( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ); /** * \brief Verify the certificate signature according to profile * * \note Same as \c mbedtls_x509_crt_verify(), but with explicit * security profile. * * \note The restrictions on keys (RSA minimum size, allowed curves * for ECDSA) apply to all certificates: trusted root, * intermediate CAs if any, and end entity certificate. * * \param crt a certificate (chain) to be verified * \param trust_ca the list of trusted CAs * \param ca_crl the list of CRLs for trusted CAs * \param profile security profile for verification * \param cn expected Common Name (can be set to * NULL if the CN must not be verified) * \param flags result of the verification * \param f_vrfy verification function * \param p_vrfy verification parameter * * \return 0 if successful or MBEDTLS_ERR_X509_CERT_VERIFY_FAILED * in which case *flags will have one or more * MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX flags * set, * or another error in case of a fatal error encountered * during the verification process. */ int mbedtls_x509_crt_verify_with_profile( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ); /** * \brief Restartable version of \c mbedtls_crt_verify_with_profile() * * \note Performs the same job as \c mbedtls_crt_verify_with_profile() * but can return early and restart according to the limit * set with \c mbedtls_ecp_set_max_ops() to reduce blocking. * * \param crt a certificate (chain) to be verified * \param trust_ca the list of trusted CAs * \param ca_crl the list of CRLs for trusted CAs * \param profile security profile for verification * \param cn expected Common Name (can be set to * NULL if the CN must not be verified) * \param flags result of the verification * \param f_vrfy verification function * \param p_vrfy verification parameter * \param rs_ctx restart context (NULL to disable restart) * * \return See \c mbedtls_crt_verify_with_profile(), or * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of * operations was reached: see \c mbedtls_ecp_set_max_ops(). */ int mbedtls_x509_crt_verify_restartable( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy, mbedtls_x509_crt_restart_ctx *rs_ctx ); #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) /** * \brief Check usage of certificate against keyUsage extension. * * \param crt Leaf certificate used. * \param usage Intended usage(s) (eg MBEDTLS_X509_KU_KEY_ENCIPHERMENT * before using the certificate to perform an RSA key * exchange). * * \note Except for decipherOnly and encipherOnly, a bit set in the * usage argument means this bit MUST be set in the * certificate. For decipherOnly and encipherOnly, it means * that bit MAY be set. * * \return 0 is these uses of the certificate are allowed, * MBEDTLS_ERR_X509_BAD_INPUT_DATA if the keyUsage extension * is present but does not match the usage argument. * * \note You should only call this function on leaf certificates, on * (intermediate) CAs the keyUsage extension is automatically * checked by \c mbedtls_x509_crt_verify(). */ int mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt, unsigned int usage ); #endif /* MBEDTLS_X509_CHECK_KEY_USAGE) */ #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) /** * \brief Check usage of certificate against extendedKeyUsage. * * \param crt Leaf certificate used. * \param usage_oid Intended usage (eg MBEDTLS_OID_SERVER_AUTH or * MBEDTLS_OID_CLIENT_AUTH). * \param usage_len Length of usage_oid (eg given by MBEDTLS_OID_SIZE()). * * \return 0 if this use of the certificate is allowed, * MBEDTLS_ERR_X509_BAD_INPUT_DATA if not. * * \note Usually only makes sense on leaf certificates. */ int mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt, const char *usage_oid, size_t usage_len ); #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ #if defined(MBEDTLS_X509_CRL_PARSE_C) /** * \brief Verify the certificate revocation status * * \param crt a certificate to be verified * \param crl the CRL to verify against * * \return 1 if the certificate is revoked, 0 otherwise * */ int mbedtls_x509_crt_is_revoked( const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl ); #endif /* MBEDTLS_X509_CRL_PARSE_C */ /** * \brief Initialize a certificate (chain) * * \param crt Certificate chain to initialize */ void mbedtls_x509_crt_init( mbedtls_x509_crt *crt ); /** * \brief Unallocate all certificate data * * \param crt Certificate chain to free */ void mbedtls_x509_crt_free( mbedtls_x509_crt *crt ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /** * \brief Initialize a restart context */ void mbedtls_x509_crt_restart_init( mbedtls_x509_crt_restart_ctx *ctx ); /** * \brief Free the components of a restart context */ void mbedtls_x509_crt_restart_free( mbedtls_x509_crt_restart_ctx *ctx ); #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ /* \} name */ /* \} addtogroup x509_module */ #if defined(MBEDTLS_X509_CRT_WRITE_C) /** * \brief Initialize a CRT writing context * * \param ctx CRT context to initialize */ void mbedtls_x509write_crt_init( mbedtls_x509write_cert *ctx ); /** * \brief Set the verion for a Certificate * Default: MBEDTLS_X509_CRT_VERSION_3 * * \param ctx CRT context to use * \param version version to set (MBEDTLS_X509_CRT_VERSION_1, MBEDTLS_X509_CRT_VERSION_2 or * MBEDTLS_X509_CRT_VERSION_3) */ void mbedtls_x509write_crt_set_version( mbedtls_x509write_cert *ctx, int version ); /** * \brief Set the serial number for a Certificate. * * \param ctx CRT context to use * \param serial serial number to set * * \return 0 if successful */ int mbedtls_x509write_crt_set_serial( mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial ); /** * \brief Set the validity period for a Certificate * Timestamps should be in string format for UTC timezone * i.e. "YYYYMMDDhhmmss" * e.g. "20131231235959" for December 31st 2013 * at 23:59:59 * * \param ctx CRT context to use * \param not_before not_before timestamp * \param not_after not_after timestamp * * \return 0 if timestamp was parsed successfully, or * a specific error code */ int mbedtls_x509write_crt_set_validity( mbedtls_x509write_cert *ctx, const char *not_before, const char *not_after ); /** * \brief Set the issuer name for a Certificate * Issuer names should contain a comma-separated list * of OID types and values: * e.g. "C=UK,O=ARM,CN=mbed TLS CA" * * \param ctx CRT context to use * \param issuer_name issuer name to set * * \return 0 if issuer name was parsed successfully, or * a specific error code */ int mbedtls_x509write_crt_set_issuer_name( mbedtls_x509write_cert *ctx, const char *issuer_name ); /** * \brief Set the subject name for a Certificate * Subject names should contain a comma-separated list * of OID types and values: * e.g. "C=UK,O=ARM,CN=mbed TLS Server 1" * * \param ctx CRT context to use * \param subject_name subject name to set * * \return 0 if subject name was parsed successfully, or * a specific error code */ int mbedtls_x509write_crt_set_subject_name( mbedtls_x509write_cert *ctx, const char *subject_name ); /** * \brief Set the subject public key for the certificate * * \param ctx CRT context to use * \param key public key to include */ void mbedtls_x509write_crt_set_subject_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ); /** * \brief Set the issuer key used for signing the certificate * * \param ctx CRT context to use * \param key private key to sign with */ void mbedtls_x509write_crt_set_issuer_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ); /** * \brief Set the MD algorithm to use for the signature * (e.g. MBEDTLS_MD_SHA1) * * \param ctx CRT context to use * \param md_alg MD algorithm to use */ void mbedtls_x509write_crt_set_md_alg( mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg ); /** * \brief Generic function to add to or replace an extension in the * CRT * * \param ctx CRT context to use * \param oid OID of the extension * \param oid_len length of the OID * \param critical if the extension is critical (per the RFC's definition) * \param val value of the extension OCTET STRING * \param val_len length of the value data * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_extension( mbedtls_x509write_cert *ctx, const char *oid, size_t oid_len, int critical, const unsigned char *val, size_t val_len ); /** * \brief Set the basicConstraints extension for a CRT * * \param ctx CRT context to use * \param is_ca is this a CA certificate * \param max_pathlen maximum length of certificate chains below this * certificate (only for CA certificates, -1 is * inlimited) * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_basic_constraints( mbedtls_x509write_cert *ctx, int is_ca, int max_pathlen ); #if defined(MBEDTLS_SHA1_C) /** * \brief Set the subjectKeyIdentifier extension for a CRT * Requires that mbedtls_x509write_crt_set_subject_key() has been * called before * * \param ctx CRT context to use * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ctx ); /** * \brief Set the authorityKeyIdentifier extension for a CRT * Requires that mbedtls_x509write_crt_set_issuer_key() has been * called before * * \param ctx CRT context to use * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *ctx ); #endif /* MBEDTLS_SHA1_C */ /** * \brief Set the Key Usage Extension flags * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) * * \param ctx CRT context to use * \param key_usage key usage flags to set * * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx, unsigned int key_usage ); /** * \brief Set the Netscape Cert Type flags * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) * * \param ctx CRT context to use * \param ns_cert_type Netscape Cert Type flags to set * * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx, unsigned char ns_cert_type ); /** * \brief Free the contents of a CRT write context * * \param ctx CRT context to free */ void mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx ); /** * \brief Write a built up certificate to a X509 DER structure * Note: data is written at the end of the buffer! Use the * return value to determine where you should start * using the buffer * * \param ctx certificate to write away * \param buf buffer to write to * \param size size of the buffer * \param f_rng RNG function (for signature, see note) * \param p_rng RNG parameter * * \return length of data written if successful, or a specific * error code * * \note f_rng may be NULL if RSA is used for signature and the * signature is made offline (otherwise f_rng is desirable * for countermeasures against timing attacks). * ECDSA signatures always require a non-NULL f_rng. */ int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_PEM_WRITE_C) /** * \brief Write a built up certificate to a X509 PEM string * * \param ctx certificate to write away * \param buf buffer to write to * \param size size of the buffer * \param f_rng RNG function (for signature, see note) * \param p_rng RNG parameter * * \return 0 if successful, or a specific error code * * \note f_rng may be NULL if RSA is used for signature and the * signature is made offline (otherwise f_rng is desirable * for countermeasures against timing attacks). * ECDSA signatures always require a non-NULL f_rng. */ int mbedtls_x509write_crt_pem( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_X509_CRT_WRITE_C */ #ifdef __cplusplus } #endif #endif /* mbedtls_x509_crt.h */ fldigi-4.2.05/src/include/mbedtls/md_internal.h0000664000175000017500000000626014611711171016300 00000000000000/** * \file md_internal.h * * \brief Message digest wrappers. * * \warning This in an internal header. Do not include directly. * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_MD_WRAP_H #define MBEDTLS_MD_WRAP_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "md.h" #ifdef __cplusplus extern "C" { #endif /** * Message digest information. * Allows message digest functions to be called in a generic way. */ struct mbedtls_md_info_t { /** Digest identifier */ mbedtls_md_type_t type; /** Name of the message digest */ const char * name; /** Output length of the digest function in bytes */ int size; /** Block length of the digest function in bytes */ int block_size; /** Digest initialisation function */ int (*starts_func)( void *ctx ); /** Digest update function */ int (*update_func)( void *ctx, const unsigned char *input, size_t ilen ); /** Digest finalisation function */ int (*finish_func)( void *ctx, unsigned char *output ); /** Generic digest function */ int (*digest_func)( const unsigned char *input, size_t ilen, unsigned char *output ); /** Allocate a new context */ void * (*ctx_alloc_func)( void ); /** Free the given context */ void (*ctx_free_func)( void *ctx ); /** Clone state from a context */ void (*clone_func)( void *dst, const void *src ); /** Internal use only */ int (*process_func)( void *ctx, const unsigned char *input ); }; #if defined(MBEDTLS_MD2_C) extern const mbedtls_md_info_t mbedtls_md2_info; #endif #if defined(MBEDTLS_MD4_C) extern const mbedtls_md_info_t mbedtls_md4_info; #endif #if defined(MBEDTLS_MD5_C) extern const mbedtls_md_info_t mbedtls_md5_info; #endif #if defined(MBEDTLS_RIPEMD160_C) extern const mbedtls_md_info_t mbedtls_ripemd160_info; #endif #if defined(MBEDTLS_SHA1_C) extern const mbedtls_md_info_t mbedtls_sha1_info; #endif #if defined(MBEDTLS_SHA256_C) extern const mbedtls_md_info_t mbedtls_sha224_info; extern const mbedtls_md_info_t mbedtls_sha256_info; #endif #if defined(MBEDTLS_SHA512_C) extern const mbedtls_md_info_t mbedtls_sha384_info; extern const mbedtls_md_info_t mbedtls_sha512_info; #endif #ifdef __cplusplus } #endif #endif /* MBEDTLS_MD_WRAP_H */ fldigi-4.2.05/src/include/mbedtls/pem.h0000664000175000017500000001175414611711171014571 00000000000000/** * \file pem.h * * \brief Privacy Enhanced Mail (PEM) decoding */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PEM_H #define MBEDTLS_PEM_H #include /** * \name PEM Error codes * These error codes are returned in case of errors reading the * PEM data. * \{ */ #define MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT -0x1080 /**< No PEM header or footer found. */ #define MBEDTLS_ERR_PEM_INVALID_DATA -0x1100 /**< PEM string is not as expected. */ #define MBEDTLS_ERR_PEM_ALLOC_FAILED -0x1180 /**< Failed to allocate memory. */ #define MBEDTLS_ERR_PEM_INVALID_ENC_IV -0x1200 /**< RSA IV is not in hex-format. */ #define MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG -0x1280 /**< Unsupported key encryption algorithm. */ #define MBEDTLS_ERR_PEM_PASSWORD_REQUIRED -0x1300 /**< Private key password can't be empty. */ #define MBEDTLS_ERR_PEM_PASSWORD_MISMATCH -0x1380 /**< Given private key password does not allow for correct decryption. */ #define MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE -0x1400 /**< Unavailable feature, e.g. hashing/encryption combination. */ #define MBEDTLS_ERR_PEM_BAD_INPUT_DATA -0x1480 /**< Bad input parameters to function. */ /* \} name */ #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_PEM_PARSE_C) /** * \brief PEM context structure */ typedef struct mbedtls_pem_context { unsigned char *buf; /*!< buffer for decoded data */ size_t buflen; /*!< length of the buffer */ unsigned char *info; /*!< buffer for extra header information */ } mbedtls_pem_context; /** * \brief PEM context setup * * \param ctx context to be initialized */ void mbedtls_pem_init( mbedtls_pem_context *ctx ); /** * \brief Read a buffer for PEM information and store the resulting * data into the specified context buffers. * * \param ctx context to use * \param header header string to seek and expect * \param footer footer string to seek and expect * \param data source data to look in (must be nul-terminated) * \param pwd password for decryption (can be NULL) * \param pwdlen length of password * \param use_len destination for total length used (set after header is * correctly read, so unless you get * MBEDTLS_ERR_PEM_BAD_INPUT_DATA or * MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT, use_len is * the length to skip) * * \note Attempts to check password correctness by verifying if * the decrypted text starts with an ASN.1 sequence of * appropriate length * * \return 0 on success, or a specific PEM error code */ int mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer, const unsigned char *data, const unsigned char *pwd, size_t pwdlen, size_t *use_len ); /** * \brief PEM context memory freeing * * \param ctx context to be freed */ void mbedtls_pem_free( mbedtls_pem_context *ctx ); #endif /* MBEDTLS_PEM_PARSE_C */ #if defined(MBEDTLS_PEM_WRITE_C) /** * \brief Write a buffer of PEM information from a DER encoded * buffer. * * \param header header string to write * \param footer footer string to write * \param der_data DER data to write * \param der_len length of the DER data * \param buf buffer to write to * \param buf_len length of output buffer * \param olen total length written / required (if buf_len is not enough) * * \return 0 on success, or a specific PEM or BASE64 error code. On * MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL olen is the required * size. */ int mbedtls_pem_write_buffer( const char *header, const char *footer, const unsigned char *der_data, size_t der_len, unsigned char *buf, size_t buf_len, size_t *olen ); #endif /* MBEDTLS_PEM_WRITE_C */ #ifdef __cplusplus } #endif #endif /* pem.h */ fldigi-4.2.05/src/include/mbedtls/ssl.h0000664000175000017500000045071014611711171014610 00000000000000/** * \file ssl.h * * \brief SSL/TLS functions. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_H #define MBEDTLS_SSL_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "bignum.h" #include "ecp.h" #include "ssl_ciphersuites.h" #if defined(MBEDTLS_X509_CRT_PARSE_C) #include "x509_crt.h" #include "x509_crl.h" #endif #if defined(MBEDTLS_DHM_C) #include "dhm.h" #endif #if defined(MBEDTLS_ECDH_C) #include "ecdh.h" #endif #if defined(MBEDTLS_ZLIB_SUPPORT) #if defined(MBEDTLS_DEPRECATED_WARNING) #warning "Record compression support via MBEDTLS_ZLIB_SUPPORT is deprecated and will be removed in the next major revision of the library" #endif #if defined(MBEDTLS_DEPRECATED_REMOVED) #error "Record compression support via MBEDTLS_ZLIB_SUPPORT is deprecated and cannot be used if MBEDTLS_DEPRECATED_REMOVED is set" #endif #include "zlib.h" #endif #if defined(MBEDTLS_HAVE_TIME) #include "platform_time.h" #endif /* * SSL Error codes */ #define MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE -0x7080 /**< The requested feature is not available. */ #define MBEDTLS_ERR_SSL_BAD_INPUT_DATA -0x7100 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_SSL_INVALID_MAC -0x7180 /**< Verification of the message MAC failed. */ #define MBEDTLS_ERR_SSL_INVALID_RECORD -0x7200 /**< An invalid SSL record was received. */ #define MBEDTLS_ERR_SSL_CONN_EOF -0x7280 /**< The connection indicated an EOF. */ #define MBEDTLS_ERR_SSL_UNKNOWN_CIPHER -0x7300 /**< An unknown cipher was received. */ #define MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN -0x7380 /**< The server has no ciphersuites in common with the client. */ #define MBEDTLS_ERR_SSL_NO_RNG -0x7400 /**< No RNG was provided to the SSL module. */ #define MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE -0x7480 /**< No client certification received from the client, but required by the authentication mode. */ #define MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE -0x7500 /**< Our own certificate(s) is/are too large to send in an SSL message. */ #define MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED -0x7580 /**< The own certificate is not set, but needed by the server. */ #define MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED -0x7600 /**< The own private key or pre-shared key is not set, but needed. */ #define MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED -0x7680 /**< No CA Chain is set, but required to operate. */ #define MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE -0x7700 /**< An unexpected message was received from our peer. */ #define MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE -0x7780 /**< A fatal alert message was received from our peer. */ #define MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED -0x7800 /**< Verification of our peer failed. */ #define MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY -0x7880 /**< The peer notified us that the connection is going to be closed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO -0x7900 /**< Processing of the ClientHello handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO -0x7980 /**< Processing of the ServerHello handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE -0x7A00 /**< Processing of the Certificate handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST -0x7A80 /**< Processing of the CertificateRequest handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE -0x7B00 /**< Processing of the ServerKeyExchange handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -0x7B80 /**< Processing of the ServerHelloDone handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -0x7C00 /**< Processing of the ClientKeyExchange handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP -0x7C80 /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public. */ #define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS -0x7D00 /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret. */ #define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -0x7D80 /**< Processing of the CertificateVerify handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -0x7E00 /**< Processing of the ChangeCipherSpec handshake message failed. */ #define MBEDTLS_ERR_SSL_BAD_HS_FINISHED -0x7E80 /**< Processing of the Finished handshake message failed. */ #define MBEDTLS_ERR_SSL_ALLOC_FAILED -0x7F00 /**< Memory allocation failed */ #define MBEDTLS_ERR_SSL_HW_ACCEL_FAILED -0x7F80 /**< Hardware acceleration function returned with error */ #define MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH -0x6F80 /**< Hardware acceleration function skipped / left alone data */ #define MBEDTLS_ERR_SSL_COMPRESSION_FAILED -0x6F00 /**< Processing of the compression / decompression failed */ #define MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION -0x6E80 /**< Handshake protocol not within min/max boundaries */ #define MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET -0x6E00 /**< Processing of the NewSessionTicket handshake message failed. */ #define MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED -0x6D80 /**< Session ticket has expired. */ #define MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH -0x6D00 /**< Public key type mismatch (eg, asked for RSA key exchange and presented EC key) */ #define MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY -0x6C80 /**< Unknown identity received (eg, PSK identity) */ #define MBEDTLS_ERR_SSL_INTERNAL_ERROR -0x6C00 /**< Internal error (eg, unexpected failure in lower-level module) */ #define MBEDTLS_ERR_SSL_COUNTER_WRAPPING -0x6B80 /**< A counter would wrap (eg, too many messages exchanged). */ #define MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO -0x6B00 /**< Unexpected message at ServerHello in renegotiation. */ #define MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED -0x6A80 /**< DTLS client must retry for hello verification */ #define MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL -0x6A00 /**< A buffer is too small to receive or write a message */ #define MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE -0x6980 /**< None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages). */ #define MBEDTLS_ERR_SSL_WANT_READ -0x6900 /**< No data of requested type currently available on underlying transport. */ #define MBEDTLS_ERR_SSL_WANT_WRITE -0x6880 /**< Connection requires a write call. */ #define MBEDTLS_ERR_SSL_TIMEOUT -0x6800 /**< The operation timed out. */ #define MBEDTLS_ERR_SSL_CLIENT_RECONNECT -0x6780 /**< The client initiated a reconnect from the same port. */ #define MBEDTLS_ERR_SSL_UNEXPECTED_RECORD -0x6700 /**< Record header looks valid but is not expected. */ #define MBEDTLS_ERR_SSL_NON_FATAL -0x6680 /**< The alert message received indicates a non-fatal error. */ #define MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH -0x6600 /**< Couldn't set the hash for verifying CertificateVerify */ #define MBEDTLS_ERR_SSL_CONTINUE_PROCESSING -0x6580 /**< Internal-only message signaling that further message-processing should be done */ #define MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS -0x6500 /**< The asynchronous operation is not completed yet. */ #define MBEDTLS_ERR_SSL_EARLY_MESSAGE -0x6480 /**< Internal-only message signaling that a message arrived early. */ #define MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS -0x7000 /**< A cryptographic operation is in progress. Try again later. */ /* * Various constants */ #define MBEDTLS_SSL_MAJOR_VERSION_3 3 #define MBEDTLS_SSL_MINOR_VERSION_0 0 /*!< SSL v3.0 */ #define MBEDTLS_SSL_MINOR_VERSION_1 1 /*!< TLS v1.0 */ #define MBEDTLS_SSL_MINOR_VERSION_2 2 /*!< TLS v1.1 */ #define MBEDTLS_SSL_MINOR_VERSION_3 3 /*!< TLS v1.2 */ #define MBEDTLS_SSL_TRANSPORT_STREAM 0 /*!< TLS */ #define MBEDTLS_SSL_TRANSPORT_DATAGRAM 1 /*!< DTLS */ #define MBEDTLS_SSL_MAX_HOST_NAME_LEN 255 /*!< Maximum host name defined in RFC 1035 */ /* RFC 6066 section 4, see also mfl_code_to_length in ssl_tls.c * NONE must be zero so that memset()ing structure to zero works */ #define MBEDTLS_SSL_MAX_FRAG_LEN_NONE 0 /*!< don't use this extension */ #define MBEDTLS_SSL_MAX_FRAG_LEN_512 1 /*!< MaxFragmentLength 2^9 */ #define MBEDTLS_SSL_MAX_FRAG_LEN_1024 2 /*!< MaxFragmentLength 2^10 */ #define MBEDTLS_SSL_MAX_FRAG_LEN_2048 3 /*!< MaxFragmentLength 2^11 */ #define MBEDTLS_SSL_MAX_FRAG_LEN_4096 4 /*!< MaxFragmentLength 2^12 */ #define MBEDTLS_SSL_MAX_FRAG_LEN_INVALID 5 /*!< first invalid value */ #define MBEDTLS_SSL_IS_CLIENT 0 #define MBEDTLS_SSL_IS_SERVER 1 #define MBEDTLS_SSL_IS_NOT_FALLBACK 0 #define MBEDTLS_SSL_IS_FALLBACK 1 #define MBEDTLS_SSL_EXTENDED_MS_DISABLED 0 #define MBEDTLS_SSL_EXTENDED_MS_ENABLED 1 #define MBEDTLS_SSL_ETM_DISABLED 0 #define MBEDTLS_SSL_ETM_ENABLED 1 #define MBEDTLS_SSL_COMPRESS_NULL 0 #define MBEDTLS_SSL_COMPRESS_DEFLATE 1 #define MBEDTLS_SSL_VERIFY_NONE 0 #define MBEDTLS_SSL_VERIFY_OPTIONAL 1 #define MBEDTLS_SSL_VERIFY_REQUIRED 2 #define MBEDTLS_SSL_VERIFY_UNSET 3 /* Used only for sni_authmode */ #define MBEDTLS_SSL_LEGACY_RENEGOTIATION 0 #define MBEDTLS_SSL_SECURE_RENEGOTIATION 1 #define MBEDTLS_SSL_RENEGOTIATION_DISABLED 0 #define MBEDTLS_SSL_RENEGOTIATION_ENABLED 1 #define MBEDTLS_SSL_ANTI_REPLAY_DISABLED 0 #define MBEDTLS_SSL_ANTI_REPLAY_ENABLED 1 #define MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED -1 #define MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT 16 #define MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION 0 #define MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION 1 #define MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE 2 #define MBEDTLS_SSL_TRUNC_HMAC_DISABLED 0 #define MBEDTLS_SSL_TRUNC_HMAC_ENABLED 1 #define MBEDTLS_SSL_TRUNCATED_HMAC_LEN 10 /* 80 bits, rfc 6066 section 7 */ #define MBEDTLS_SSL_SESSION_TICKETS_DISABLED 0 #define MBEDTLS_SSL_SESSION_TICKETS_ENABLED 1 #define MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED 0 #define MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED 1 #define MBEDTLS_SSL_ARC4_ENABLED 0 #define MBEDTLS_SSL_ARC4_DISABLED 1 #define MBEDTLS_SSL_PRESET_DEFAULT 0 #define MBEDTLS_SSL_PRESET_SUITEB 2 #define MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED 1 #define MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED 0 /* * Default range for DTLS retransmission timer value, in milliseconds. * RFC 6347 4.2.4.1 says from 1 second to 60 seconds. */ #define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN 1000 #define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX 60000 /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME) #define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ #endif /* * Maximum fragment length in bytes, * determines the size of each of the two internal I/O buffers. * * Note: the RFC defines the default size of SSL / TLS messages. If you * change the value here, other clients / servers may not be able to * communicate with you anymore. Only change this value if you control * both sides of the connection and have it reduced at both sides, or * if you're using the Max Fragment Length extension and you know all your * peers are using it too! */ #if !defined(MBEDTLS_SSL_MAX_CONTENT_LEN) #define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ #endif #if !defined(MBEDTLS_SSL_IN_CONTENT_LEN) #define MBEDTLS_SSL_IN_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN #endif #if !defined(MBEDTLS_SSL_OUT_CONTENT_LEN) #define MBEDTLS_SSL_OUT_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN #endif /* * Maximum number of heap-allocated bytes for the purpose of * DTLS handshake message reassembly and future message buffering. */ #if !defined(MBEDTLS_SSL_DTLS_MAX_BUFFERING) #define MBEDTLS_SSL_DTLS_MAX_BUFFERING 32768 #endif /* \} name SECTION: Module settings */ /* * Length of the verify data for secure renegotiation */ #if defined(MBEDTLS_SSL_PROTO_SSL3) #define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 36 #else #define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 12 #endif /* * Signaling ciphersuite values (SCSV) */ #define MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO 0xFF /**< renegotiation info ext */ #define MBEDTLS_SSL_FALLBACK_SCSV_VALUE 0x5600 /**< RFC 7507 section 2 */ /* * Supported Signature and Hash algorithms (For TLS 1.2) * RFC 5246 section 7.4.1.4.1 */ #define MBEDTLS_SSL_HASH_NONE 0 #define MBEDTLS_SSL_HASH_MD5 1 #define MBEDTLS_SSL_HASH_SHA1 2 #define MBEDTLS_SSL_HASH_SHA224 3 #define MBEDTLS_SSL_HASH_SHA256 4 #define MBEDTLS_SSL_HASH_SHA384 5 #define MBEDTLS_SSL_HASH_SHA512 6 #define MBEDTLS_SSL_SIG_ANON 0 #define MBEDTLS_SSL_SIG_RSA 1 #define MBEDTLS_SSL_SIG_ECDSA 3 /* * Client Certificate Types * RFC 5246 section 7.4.4 plus RFC 4492 section 5.5 */ #define MBEDTLS_SSL_CERT_TYPE_RSA_SIGN 1 #define MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN 64 /* * Message, alert and handshake types */ #define MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC 20 #define MBEDTLS_SSL_MSG_ALERT 21 #define MBEDTLS_SSL_MSG_HANDSHAKE 22 #define MBEDTLS_SSL_MSG_APPLICATION_DATA 23 #define MBEDTLS_SSL_ALERT_LEVEL_WARNING 1 #define MBEDTLS_SSL_ALERT_LEVEL_FATAL 2 #define MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY 0 /* 0x00 */ #define MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE 10 /* 0x0A */ #define MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC 20 /* 0x14 */ #define MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED 21 /* 0x15 */ #define MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW 22 /* 0x16 */ #define MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30 /* 0x1E */ #define MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE 40 /* 0x28 */ #define MBEDTLS_SSL_ALERT_MSG_NO_CERT 41 /* 0x29 */ #define MBEDTLS_SSL_ALERT_MSG_BAD_CERT 42 /* 0x2A */ #define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT 43 /* 0x2B */ #define MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED 44 /* 0x2C */ #define MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED 45 /* 0x2D */ #define MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN 46 /* 0x2E */ #define MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER 47 /* 0x2F */ #define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA 48 /* 0x30 */ #define MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED 49 /* 0x31 */ #define MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR 50 /* 0x32 */ #define MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR 51 /* 0x33 */ #define MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION 60 /* 0x3C */ #define MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION 70 /* 0x46 */ #define MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71 /* 0x47 */ #define MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR 80 /* 0x50 */ #define MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK 86 /* 0x56 */ #define MBEDTLS_SSL_ALERT_MSG_USER_CANCELED 90 /* 0x5A */ #define MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION 100 /* 0x64 */ #define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT 110 /* 0x6E */ #define MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME 112 /* 0x70 */ #define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY 115 /* 0x73 */ #define MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL 120 /* 0x78 */ #define MBEDTLS_SSL_HS_HELLO_REQUEST 0 #define MBEDTLS_SSL_HS_CLIENT_HELLO 1 #define MBEDTLS_SSL_HS_SERVER_HELLO 2 #define MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST 3 #define MBEDTLS_SSL_HS_NEW_SESSION_TICKET 4 #define MBEDTLS_SSL_HS_CERTIFICATE 11 #define MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE 12 #define MBEDTLS_SSL_HS_CERTIFICATE_REQUEST 13 #define MBEDTLS_SSL_HS_SERVER_HELLO_DONE 14 #define MBEDTLS_SSL_HS_CERTIFICATE_VERIFY 15 #define MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE 16 #define MBEDTLS_SSL_HS_FINISHED 20 /* * TLS extensions */ #define MBEDTLS_TLS_EXT_SERVERNAME 0 #define MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME 0 #define MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH 1 #define MBEDTLS_TLS_EXT_TRUNCATED_HMAC 4 #define MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES 10 #define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS 11 #define MBEDTLS_TLS_EXT_SIG_ALG 13 #define MBEDTLS_TLS_EXT_ALPN 16 #define MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC 22 /* 0x16 */ #define MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET 0x0017 /* 23 */ #define MBEDTLS_TLS_EXT_SESSION_TICKET 35 #define MBEDTLS_TLS_EXT_ECJPAKE_KKPP 256 /* experimental */ #define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO 0xFF01 /* * Size defines */ #if !defined(MBEDTLS_PSK_MAX_LEN) #define MBEDTLS_PSK_MAX_LEN 32 /* 256 bits */ #endif /* Dummy type used only for its size */ union mbedtls_ssl_premaster_secret { #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) unsigned char _pms_rsa[48]; /* RFC 5246 8.1.1 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) unsigned char _pms_dhm[MBEDTLS_MPI_MAX_SIZE]; /* RFC 5246 8.1.2 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES]; /* RFC 4492 5.10 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) unsigned char _pms_psk[4 + 2 * MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 2 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) unsigned char _pms_dhe_psk[4 + MBEDTLS_MPI_MAX_SIZE + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 3 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) unsigned char _pms_rsa_psk[52 + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 4 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES + MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */ #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) unsigned char _pms_ecjpake[32]; /* Thread spec: SHA-256 output */ #endif }; #define MBEDTLS_PREMASTER_SIZE sizeof( union mbedtls_ssl_premaster_secret ) #ifdef __cplusplus extern "C" { #endif /* * SSL state machine */ typedef enum { MBEDTLS_SSL_HELLO_REQUEST, MBEDTLS_SSL_CLIENT_HELLO, MBEDTLS_SSL_SERVER_HELLO, MBEDTLS_SSL_SERVER_CERTIFICATE, MBEDTLS_SSL_SERVER_KEY_EXCHANGE, MBEDTLS_SSL_CERTIFICATE_REQUEST, MBEDTLS_SSL_SERVER_HELLO_DONE, MBEDTLS_SSL_CLIENT_CERTIFICATE, MBEDTLS_SSL_CLIENT_KEY_EXCHANGE, MBEDTLS_SSL_CERTIFICATE_VERIFY, MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC, MBEDTLS_SSL_CLIENT_FINISHED, MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC, MBEDTLS_SSL_SERVER_FINISHED, MBEDTLS_SSL_FLUSH_BUFFERS, MBEDTLS_SSL_HANDSHAKE_WRAPUP, MBEDTLS_SSL_HANDSHAKE_OVER, MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET, MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT, } mbedtls_ssl_states; /** * \brief Callback type: send data on the network. * * \note That callback may be either blocking or non-blocking. * * \param ctx Context for the send callback (typically a file descriptor) * \param buf Buffer holding the data to send * \param len Length of the data to send * * \return The callback must return the number of bytes sent if any, * or a non-zero error code. * If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_WRITE * must be returned when the operation would block. * * \note The callback is allowed to send fewer bytes than requested. * It must always return the number of bytes actually sent. */ typedef int mbedtls_ssl_send_t( void *ctx, const unsigned char *buf, size_t len ); /** * \brief Callback type: receive data from the network. * * \note That callback may be either blocking or non-blocking. * * \param ctx Context for the receive callback (typically a file * descriptor) * \param buf Buffer to write the received data to * \param len Length of the receive buffer * * \return The callback must return the number of bytes received, * or a non-zero error code. * If performing non-blocking I/O, \c MBEDTLS_ERR_SSL_WANT_READ * must be returned when the operation would block. * * \note The callback may receive fewer bytes than the length of the * buffer. It must always return the number of bytes actually * received and written to the buffer. */ typedef int mbedtls_ssl_recv_t( void *ctx, unsigned char *buf, size_t len ); /** * \brief Callback type: receive data from the network, with timeout * * \note That callback must block until data is received, or the * timeout delay expires, or the operation is interrupted by a * signal. * * \param ctx Context for the receive callback (typically a file descriptor) * \param buf Buffer to write the received data to * \param len Length of the receive buffer * \param timeout Maximum nomber of millisecondes to wait for data * 0 means no timeout (potentially waiting forever) * * \return The callback must return the number of bytes received, * or a non-zero error code: * \c MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out, * \c MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. * * \note The callback may receive fewer bytes than the length of the * buffer. It must always return the number of bytes actually * received and written to the buffer. */ typedef int mbedtls_ssl_recv_timeout_t( void *ctx, unsigned char *buf, size_t len, uint32_t timeout ); /** * \brief Callback type: set a pair of timers/delays to watch * * \param ctx Context pointer * \param int_ms Intermediate delay in milliseconds * \param fin_ms Final delay in milliseconds * 0 cancels the current timer. * * \note This callback must at least store the necessary information * for the associated \c mbedtls_ssl_get_timer_t callback to * return correct information. * * \note If using a event-driven style of programming, an event must * be generated when the final delay is passed. The event must * cause a call to \c mbedtls_ssl_handshake() with the proper * SSL context to be scheduled. Care must be taken to ensure * that at most one such call happens at a time. * * \note Only one timer at a time must be running. Calling this * function while a timer is running must cancel it. Cancelled * timers must not generate any event. */ typedef void mbedtls_ssl_set_timer_t( void * ctx, uint32_t int_ms, uint32_t fin_ms ); /** * \brief Callback type: get status of timers/delays * * \param ctx Context pointer * * \return This callback must return: * -1 if cancelled (fin_ms == 0), * 0 if none of the delays have passed, * 1 if only the intermediate delay has passed, * 2 if the final delay has passed. */ typedef int mbedtls_ssl_get_timer_t( void * ctx ); /* Defined below */ typedef struct mbedtls_ssl_session mbedtls_ssl_session; typedef struct mbedtls_ssl_context mbedtls_ssl_context; typedef struct mbedtls_ssl_config mbedtls_ssl_config; /* Defined in ssl_internal.h */ typedef struct mbedtls_ssl_transform mbedtls_ssl_transform; typedef struct mbedtls_ssl_handshake_params mbedtls_ssl_handshake_params; typedef struct mbedtls_ssl_sig_hash_set_t mbedtls_ssl_sig_hash_set_t; #if defined(MBEDTLS_X509_CRT_PARSE_C) typedef struct mbedtls_ssl_key_cert mbedtls_ssl_key_cert; #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) typedef struct mbedtls_ssl_flight_item mbedtls_ssl_flight_item; #endif #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Callback type: start external signature operation. * * This callback is called during an SSL handshake to start * a signature decryption operation using an * external processor. The parameter \p cert contains * the public key; it is up to the callback function to * determine how to access the associated private key. * * This function typically sends or enqueues a request, and * does not wait for the operation to complete. This allows * the handshake step to be non-blocking. * * The parameters \p ssl and \p cert are guaranteed to remain * valid throughout the handshake. On the other hand, this * function must save the contents of \p hash if the value * is needed for later processing, because the \p hash buffer * is no longer valid after this function returns. * * This function may call mbedtls_ssl_set_async_operation_data() * to store an operation context for later retrieval * by the resume or cancel callback. * * \note For RSA signatures, this function must produce output * that is consistent with PKCS#1 v1.5 in the same way as * mbedtls_rsa_pkcs1_sign(). Before the private key operation, * apply the padding steps described in RFC 8017, section 9.2 * "EMSA-PKCS1-v1_5" as follows. * - If \p md_alg is #MBEDTLS_MD_NONE, apply the PKCS#1 v1.5 * encoding, treating \p hash as the DigestInfo to be * padded. In other words, apply EMSA-PKCS1-v1_5 starting * from step 3, with `T = hash` and `tLen = hash_len`. * - If `md_alg != MBEDTLS_MD_NONE`, apply the PKCS#1 v1.5 * encoding, treating \p hash as the hash to be encoded and * padded. In other words, apply EMSA-PKCS1-v1_5 starting * from step 2, with `digestAlgorithm` obtained by calling * mbedtls_oid_get_oid_by_md() on \p md_alg. * * \note For ECDSA signatures, the output format is the DER encoding * `Ecdsa-Sig-Value` defined in * [RFC 4492 section 5.4](https://tools.ietf.org/html/rfc4492#section-5.4). * * \param ssl The SSL connection instance. It should not be * modified other than via * mbedtls_ssl_set_async_operation_data(). * \param cert Certificate containing the public key. * In simple cases, this is one of the pointers passed to * mbedtls_ssl_conf_own_cert() when configuring the SSL * connection. However, if other callbacks are used, this * property may not hold. For example, if an SNI callback * is registered with mbedtls_ssl_conf_sni(), then * this callback determines what certificate is used. * \param md_alg Hash algorithm. * \param hash Buffer containing the hash. This buffer is * no longer valid when the function returns. * \param hash_len Size of the \c hash buffer in bytes. * * \return 0 if the operation was started successfully and the SSL * stack should call the resume callback immediately. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation * was started successfully and the SSL stack should return * immediately without calling the resume callback yet. * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external * processor does not support this key. The SSL stack will * use the private key object instead. * \return Any other error indicates a fatal failure and is * propagated up the call chain. The callback should * use \c MBEDTLS_ERR_PK_xxx error codes, and must not * use \c MBEDTLS_ERR_SSL_xxx error codes except as * directed in the documentation of this callback. */ typedef int mbedtls_ssl_async_sign_t( mbedtls_ssl_context *ssl, mbedtls_x509_crt *cert, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len ); /** * \brief Callback type: start external decryption operation. * * This callback is called during an SSL handshake to start * an RSA decryption operation using an * external processor. The parameter \p cert contains * the public key; it is up to the callback function to * determine how to access the associated private key. * * This function typically sends or enqueues a request, and * does not wait for the operation to complete. This allows * the handshake step to be non-blocking. * * The parameters \p ssl and \p cert are guaranteed to remain * valid throughout the handshake. On the other hand, this * function must save the contents of \p input if the value * is needed for later processing, because the \p input buffer * is no longer valid after this function returns. * * This function may call mbedtls_ssl_set_async_operation_data() * to store an operation context for later retrieval * by the resume or cancel callback. * * \warning RSA decryption as used in TLS is subject to a potential * timing side channel attack first discovered by Bleichenbacher * in 1998. This attack can be remotely exploitable * in practice. To avoid this attack, you must ensure that * if the callback performs an RSA decryption, the time it * takes to execute and return the result does not depend * on whether the RSA decryption succeeded or reported * invalid padding. * * \param ssl The SSL connection instance. It should not be * modified other than via * mbedtls_ssl_set_async_operation_data(). * \param cert Certificate containing the public key. * In simple cases, this is one of the pointers passed to * mbedtls_ssl_conf_own_cert() when configuring the SSL * connection. However, if other callbacks are used, this * property may not hold. For example, if an SNI callback * is registered with mbedtls_ssl_conf_sni(), then * this callback determines what certificate is used. * \param input Buffer containing the input ciphertext. This buffer * is no longer valid when the function returns. * \param input_len Size of the \p input buffer in bytes. * * \return 0 if the operation was started successfully and the SSL * stack should call the resume callback immediately. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation * was started successfully and the SSL stack should return * immediately without calling the resume callback yet. * \return #MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH if the external * processor does not support this key. The SSL stack will * use the private key object instead. * \return Any other error indicates a fatal failure and is * propagated up the call chain. The callback should * use \c MBEDTLS_ERR_PK_xxx error codes, and must not * use \c MBEDTLS_ERR_SSL_xxx error codes except as * directed in the documentation of this callback. */ typedef int mbedtls_ssl_async_decrypt_t( mbedtls_ssl_context *ssl, mbedtls_x509_crt *cert, const unsigned char *input, size_t input_len ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ /** * \brief Callback type: resume external operation. * * This callback is called during an SSL handshake to resume * an external operation started by the * ::mbedtls_ssl_async_sign_t or * ::mbedtls_ssl_async_decrypt_t callback. * * This function typically checks the status of a pending * request or causes the request queue to make progress, and * does not wait for the operation to complete. This allows * the handshake step to be non-blocking. * * This function may call mbedtls_ssl_get_async_operation_data() * to retrieve an operation context set by the start callback. * It may call mbedtls_ssl_set_async_operation_data() to modify * this context. * * Note that when this function returns a status other than * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, it must free any * resources associated with the operation. * * \param ssl The SSL connection instance. It should not be * modified other than via * mbedtls_ssl_set_async_operation_data(). * \param output Buffer containing the output (signature or decrypted * data) on success. * \param output_len On success, number of bytes written to \p output. * \param output_size Size of the \p output buffer in bytes. * * \return 0 if output of the operation is available in the * \p output buffer. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if the operation * is still in progress. Subsequent requests for progress * on the SSL connection will call the resume callback * again. * \return Any other error means that the operation is aborted. * The SSL handshake is aborted. The callback should * use \c MBEDTLS_ERR_PK_xxx error codes, and must not * use \c MBEDTLS_ERR_SSL_xxx error codes except as * directed in the documentation of this callback. */ typedef int mbedtls_ssl_async_resume_t( mbedtls_ssl_context *ssl, unsigned char *output, size_t *output_len, size_t output_size ); /** * \brief Callback type: cancel external operation. * * This callback is called if an SSL connection is closed * while an asynchronous operation is in progress. Note that * this callback is not called if the * ::mbedtls_ssl_async_resume_t callback has run and has * returned a value other than * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, since in that case * the asynchronous operation has already completed. * * This function may call mbedtls_ssl_get_async_operation_data() * to retrieve an operation context set by the start callback. * * \param ssl The SSL connection instance. It should not be * modified. */ typedef void mbedtls_ssl_async_cancel_t( mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ /* * This structure is used for storing current session data. */ struct mbedtls_ssl_session { #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t start; /*!< starting time */ #endif int ciphersuite; /*!< chosen ciphersuite */ int compression; /*!< chosen compression */ size_t id_len; /*!< session id length */ unsigned char id[32]; /*!< session identifier */ unsigned char master[48]; /*!< the master secret */ #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_x509_crt *peer_cert; /*!< peer X.509 cert chain */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ uint32_t verify_result; /*!< verification result */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) unsigned char *ticket; /*!< RFC 5077 session ticket */ size_t ticket_len; /*!< session ticket length */ uint32_t ticket_lifetime; /*!< ticket lifetime hint */ #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) unsigned char mfl_code; /*!< MaxFragmentLength negotiated by peer */ #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) int trunc_hmac; /*!< flag for truncated hmac activation */ #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) int encrypt_then_mac; /*!< flag for EtM activation */ #endif }; /** * SSL/TLS configuration to be shared between mbedtls_ssl_context structures. */ struct mbedtls_ssl_config { /* Group items by size (largest first) to minimize padding overhead */ /* * Pointers */ const int *ciphersuite_list[4]; /*!< allowed ciphersuites per version */ /** Callback for printing debug output */ void (*f_dbg)(void *, int, const char *, int, const char *); void *p_dbg; /*!< context for the debug function */ /** Callback for getting (pseudo-)random numbers */ int (*f_rng)(void *, unsigned char *, size_t); void *p_rng; /*!< context for the RNG function */ /** Callback to retrieve a session from the cache */ int (*f_get_cache)(void *, mbedtls_ssl_session *); /** Callback to store a session into the cache */ int (*f_set_cache)(void *, const mbedtls_ssl_session *); void *p_cache; /*!< context for cache callbacks */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) /** Callback for setting cert according to SNI extension */ int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); void *p_sni; /*!< context for SNI callback */ #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) /** Callback to customize X.509 certificate chain verification */ int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *); void *p_vrfy; /*!< context for X.509 verify calllback */ #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) /** Callback to retrieve PSK key from identity */ int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); void *p_psk; /*!< context for PSK callback */ #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) /** Callback to create & write a cookie for ClientHello veirifcation */ int (*f_cookie_write)( void *, unsigned char **, unsigned char *, const unsigned char *, size_t ); /** Callback to verify validity of a ClientHello cookie */ int (*f_cookie_check)( void *, const unsigned char *, size_t, const unsigned char *, size_t ); void *p_cookie; /*!< context for the cookie callbacks */ #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) /** Callback to create & write a session ticket */ int (*f_ticket_write)( void *, const mbedtls_ssl_session *, unsigned char *, const unsigned char *, size_t *, uint32_t * ); /** Callback to parse a session ticket into a session structure */ int (*f_ticket_parse)( void *, mbedtls_ssl_session *, unsigned char *, size_t); void *p_ticket; /*!< context for the ticket callbacks */ #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) /** Callback to export key block and master secret */ int (*f_export_keys)( void *, const unsigned char *, const unsigned char *, size_t, size_t, size_t ); void *p_export_keys; /*!< context for key export callback */ #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */ mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s) */ mbedtls_x509_crt *ca_chain; /*!< trusted CAs */ mbedtls_x509_crl *ca_crl; /*!< trusted CAs CRLs */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_ssl_async_sign_t *f_async_sign_start; /*!< start asynchronous signature operation */ mbedtls_ssl_async_decrypt_t *f_async_decrypt_start; /*!< start asynchronous decryption operation */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ mbedtls_ssl_async_resume_t *f_async_resume; /*!< resume asynchronous operation */ mbedtls_ssl_async_cancel_t *f_async_cancel; /*!< cancel asynchronous operation */ void *p_async_config_data; /*!< Configuration data set by mbedtls_ssl_conf_async_private_cb(). */ #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) const int *sig_hashes; /*!< allowed signature hashes */ #endif #if defined(MBEDTLS_ECP_C) const mbedtls_ecp_group_id *curve_list; /*!< allowed curves */ #endif #if defined(MBEDTLS_DHM_C) mbedtls_mpi dhm_P; /*!< prime modulus for DHM */ mbedtls_mpi dhm_G; /*!< generator for DHM */ #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) unsigned char *psk; /*!< pre-shared key. This field should only be set via mbedtls_ssl_conf_psk() */ size_t psk_len; /*!< length of the pre-shared key. This field should only be set via mbedtls_ssl_conf_psk() */ unsigned char *psk_identity; /*!< identity for PSK negotiation. This field should only be set via mbedtls_ssl_conf_psk() */ size_t psk_identity_len;/*!< length of identity. This field should only be set via mbedtls_ssl_conf_psk() */ #endif #if defined(MBEDTLS_SSL_ALPN) const char **alpn_list; /*!< ordered list of protocols */ #endif /* * Numerical settings (int then char) */ uint32_t read_timeout; /*!< timeout for mbedtls_ssl_read (ms) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) uint32_t hs_timeout_min; /*!< initial value of the handshake retransmission timeout (ms) */ uint32_t hs_timeout_max; /*!< maximum value of the handshake retransmission timeout (ms) */ #endif #if defined(MBEDTLS_SSL_RENEGOTIATION) int renego_max_records; /*!< grace period for renegotiation */ unsigned char renego_period[8]; /*!< value of the record counters that triggers renegotiation */ #endif #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) unsigned int badmac_limit; /*!< limit of records with a bad MAC */ #endif #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) unsigned int dhm_min_bitlen; /*!< min. bit length of the DHM prime */ #endif unsigned char max_major_ver; /*!< max. major version used */ unsigned char max_minor_ver; /*!< max. minor version used */ unsigned char min_major_ver; /*!< min. major version used */ unsigned char min_minor_ver; /*!< min. minor version used */ /* * Flags (bitfields) */ unsigned int endpoint : 1; /*!< 0: client, 1: server */ unsigned int transport : 1; /*!< stream (TLS) or datagram (DTLS) */ unsigned int authmode : 2; /*!< MBEDTLS_SSL_VERIFY_XXX */ /* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE */ unsigned int allow_legacy_renegotiation : 2 ; /*!< MBEDTLS_LEGACY_XXX */ #if defined(MBEDTLS_ARC4_C) unsigned int arc4_disabled : 1; /*!< blacklist RC4 ciphersuites? */ #endif #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) unsigned int mfl_code : 3; /*!< desired fragment length */ #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) unsigned int encrypt_then_mac : 1 ; /*!< negotiate encrypt-then-mac? */ #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) unsigned int extended_ms : 1; /*!< negotiate extended master secret? */ #endif #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) unsigned int anti_replay : 1; /*!< detect and prevent replay? */ #endif #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) unsigned int cbc_record_splitting : 1; /*!< do cbc record splitting */ #endif #if defined(MBEDTLS_SSL_RENEGOTIATION) unsigned int disable_renegotiation : 1; /*!< disable renegotiation? */ #endif #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) unsigned int trunc_hmac : 1; /*!< negotiate truncated hmac? */ #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) unsigned int session_tickets : 1; /*!< use session tickets? */ #endif #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) unsigned int fallback : 1; /*!< is this a fallback? */ #endif #if defined(MBEDTLS_SSL_SRV_C) unsigned int cert_req_ca_list : 1; /*!< enable sending CA list in Certificate Request messages? */ #endif }; struct mbedtls_ssl_context { const mbedtls_ssl_config *conf; /*!< configuration information */ /* * Miscellaneous */ int state; /*!< SSL handshake: current state */ #if defined(MBEDTLS_SSL_RENEGOTIATION) int renego_status; /*!< Initial, in progress, pending? */ int renego_records_seen; /*!< Records since renego request, or with DTLS, number of retransmissions of request if renego_max_records is < 0 */ #endif /* MBEDTLS_SSL_RENEGOTIATION */ int major_ver; /*!< equal to MBEDTLS_SSL_MAJOR_VERSION_3 */ int minor_ver; /*!< either 0 (SSL3) or 1 (TLS1.0) */ #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) unsigned badmac_seen; /*!< records with a bad MAC received */ #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ mbedtls_ssl_send_t *f_send; /*!< Callback for network send */ mbedtls_ssl_recv_t *f_recv; /*!< Callback for network receive */ mbedtls_ssl_recv_timeout_t *f_recv_timeout; /*!< Callback for network receive with timeout */ void *p_bio; /*!< context for I/O operations */ /* * Session layer */ mbedtls_ssl_session *session_in; /*!< current session data (in) */ mbedtls_ssl_session *session_out; /*!< current session data (out) */ mbedtls_ssl_session *session; /*!< negotiated session data */ mbedtls_ssl_session *session_negotiate; /*!< session data in negotiation */ mbedtls_ssl_handshake_params *handshake; /*!< params required only during the handshake process */ /* * Record layer transformations */ mbedtls_ssl_transform *transform_in; /*!< current transform params (in) */ mbedtls_ssl_transform *transform_out; /*!< current transform params (in) */ mbedtls_ssl_transform *transform; /*!< negotiated transform params */ mbedtls_ssl_transform *transform_negotiate; /*!< transform params in negotiation */ /* * Timers */ void *p_timer; /*!< context for the timer callbacks */ mbedtls_ssl_set_timer_t *f_set_timer; /*!< set timer callback */ mbedtls_ssl_get_timer_t *f_get_timer; /*!< get timer callback */ /* * Record layer (incoming data) */ unsigned char *in_buf; /*!< input buffer */ unsigned char *in_ctr; /*!< 64-bit incoming message counter TLS: maintained by us DTLS: read from peer */ unsigned char *in_hdr; /*!< start of record header */ unsigned char *in_len; /*!< two-bytes message length field */ unsigned char *in_iv; /*!< ivlen-byte IV */ unsigned char *in_msg; /*!< message contents (in_iv+ivlen) */ unsigned char *in_offt; /*!< read offset in application data */ int in_msgtype; /*!< record header: message type */ size_t in_msglen; /*!< record header: message length */ size_t in_left; /*!< amount of data read so far */ #if defined(MBEDTLS_SSL_PROTO_DTLS) uint16_t in_epoch; /*!< DTLS epoch for incoming records */ size_t next_record_offset; /*!< offset of the next record in datagram (equal to in_left if none) */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) uint64_t in_window_top; /*!< last validated record seq_num */ uint64_t in_window; /*!< bitmask for replay detection */ #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ size_t in_hslen; /*!< current handshake message length, including the handshake header */ int nb_zero; /*!< # of 0-length encrypted messages */ int keep_current_message; /*!< drop or reuse current message on next call to record layer? */ #if defined(MBEDTLS_SSL_PROTO_DTLS) uint8_t disable_datagram_packing; /*!< Disable packing multiple records * within a single datagram. */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* * Record layer (outgoing data) */ unsigned char *out_buf; /*!< output buffer */ unsigned char *out_ctr; /*!< 64-bit outgoing message counter */ unsigned char *out_hdr; /*!< start of record header */ unsigned char *out_len; /*!< two-bytes message length field */ unsigned char *out_iv; /*!< ivlen-byte IV */ unsigned char *out_msg; /*!< message contents (out_iv+ivlen) */ int out_msgtype; /*!< record header: message type */ size_t out_msglen; /*!< record header: message length */ size_t out_left; /*!< amount of data not yet written */ unsigned char cur_out_ctr[8]; /*!< Outgoing record sequence number. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) uint16_t mtu; /*!< path mtu, used to fragment outgoing messages */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_ZLIB_SUPPORT) unsigned char *compress_buf; /*!< zlib data buffer */ #endif /* MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) signed char split_done; /*!< current record already splitted? */ #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ /* * PKI layer */ int client_auth; /*!< flag for client auth. */ /* * User settings */ #if defined(MBEDTLS_X509_CRT_PARSE_C) char *hostname; /*!< expected peer CN for verification (and SNI if available) */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_ALPN) const char *alpn_chosen; /*!< negotiated protocol */ #endif /* MBEDTLS_SSL_ALPN */ /* * Information for DTLS hello verify */ #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) unsigned char *cli_id; /*!< transport-level ID of the client */ size_t cli_id_len; /*!< length of cli_id */ #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ /* * Secure renegotiation */ /* needed to know when to send extension on server */ int secure_renegotiation; /*!< does peer support legacy or secure renegotiation */ #if defined(MBEDTLS_SSL_RENEGOTIATION) size_t verify_data_len; /*!< length of verify data stored */ char own_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ char peer_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ #endif /* MBEDTLS_SSL_RENEGOTIATION */ }; #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) #define MBEDTLS_SSL_CHANNEL_OUTBOUND 0 #define MBEDTLS_SSL_CHANNEL_INBOUND 1 extern int (*mbedtls_ssl_hw_record_init)(mbedtls_ssl_context *ssl, const unsigned char *key_enc, const unsigned char *key_dec, size_t keylen, const unsigned char *iv_enc, const unsigned char *iv_dec, size_t ivlen, const unsigned char *mac_enc, const unsigned char *mac_dec, size_t maclen); extern int (*mbedtls_ssl_hw_record_activate)(mbedtls_ssl_context *ssl, int direction); extern int (*mbedtls_ssl_hw_record_reset)(mbedtls_ssl_context *ssl); extern int (*mbedtls_ssl_hw_record_write)(mbedtls_ssl_context *ssl); extern int (*mbedtls_ssl_hw_record_read)(mbedtls_ssl_context *ssl); extern int (*mbedtls_ssl_hw_record_finish)(mbedtls_ssl_context *ssl); #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ /** * \brief Return the name of the ciphersuite associated with the * given ID * * \param ciphersuite_id SSL ciphersuite ID * * \return a string containing the ciphersuite name */ const char *mbedtls_ssl_get_ciphersuite_name( const int ciphersuite_id ); /** * \brief Return the ID of the ciphersuite associated with the * given name * * \param ciphersuite_name SSL ciphersuite name * * \return the ID with the ciphersuite or 0 if not found */ int mbedtls_ssl_get_ciphersuite_id( const char *ciphersuite_name ); /** * \brief Initialize an SSL context * Just makes the context ready for mbedtls_ssl_setup() or * mbedtls_ssl_free() * * \param ssl SSL context */ void mbedtls_ssl_init( mbedtls_ssl_context *ssl ); /** * \brief Set up an SSL context for use * * \note No copy of the configuration context is made, it can be * shared by many mbedtls_ssl_context structures. * * \warning The conf structure will be accessed during the session. * It must not be modified or freed as long as the session * is active. * * \warning This function must be called exactly once per context. * Calling mbedtls_ssl_setup again is not supported, even * if no session is active. * * \param ssl SSL context * \param conf SSL configuration to use * * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED if * memory allocation failed */ int mbedtls_ssl_setup( mbedtls_ssl_context *ssl, const mbedtls_ssl_config *conf ); /** * \brief Reset an already initialized SSL context for re-use * while retaining application-set variables, function * pointers and data. * * \param ssl SSL context * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED, MBEDTLS_ERR_SSL_HW_ACCEL_FAILED or * MBEDTLS_ERR_SSL_COMPRESSION_FAILED */ int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl ); /** * \brief Set the current endpoint type * * \param conf SSL configuration * \param endpoint must be MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER */ void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint ); /** * \brief Set the transport type (TLS or DTLS). * Default: TLS * * \note For DTLS, you must either provide a recv callback that * doesn't block, or one that handles timeouts, see * \c mbedtls_ssl_set_bio(). You also need to provide timer * callbacks with \c mbedtls_ssl_set_timer_cb(). * * \param conf SSL configuration * \param transport transport type: * MBEDTLS_SSL_TRANSPORT_STREAM for TLS, * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS. */ void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport ); /** * \brief Set the certificate verification mode * Default: NONE on server, REQUIRED on client * * \param conf SSL configuration * \param authmode can be: * * MBEDTLS_SSL_VERIFY_NONE: peer certificate is not checked * (default on server) * (insecure on client) * * MBEDTLS_SSL_VERIFY_OPTIONAL: peer certificate is checked, however the * handshake continues even if verification failed; * mbedtls_ssl_get_verify_result() can be called after the * handshake is complete. * * MBEDTLS_SSL_VERIFY_REQUIRED: peer *must* present a valid certificate, * handshake is aborted if verification failed. * (default on client) * * \note On client, MBEDTLS_SSL_VERIFY_REQUIRED is the recommended mode. * With MBEDTLS_SSL_VERIFY_OPTIONAL, the user needs to call mbedtls_ssl_get_verify_result() at * the right time(s), which may not be obvious, while REQUIRED always perform * the verification as soon as possible. For example, REQUIRED was protecting * against the "triple handshake" attack even before it was found. */ void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode ); #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Set the verification callback (Optional). * * If set, the verify callback is called for each * certificate in the chain. For implementation * information, please see \c mbedtls_x509_crt_verify() * * \param conf SSL configuration * \param f_vrfy verification function * \param p_vrfy verification parameter */ void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ /** * \brief Set the random number generator callback * * \param conf SSL configuration * \param f_rng RNG function * \param p_rng RNG parameter */ void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Set the debug callback * * The callback has the following argument: * void * opaque context for the callback * int debug level * const char * file name * int line number * const char * message * * \param conf SSL configuration * \param f_dbg debug function * \param p_dbg debug parameter */ void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf, void (*f_dbg)(void *, int, const char *, int, const char *), void *p_dbg ); /** * \brief Set the underlying BIO callbacks for write, read and * read-with-timeout. * * \param ssl SSL context * \param p_bio parameter (context) shared by BIO callbacks * \param f_send write callback * \param f_recv read callback * \param f_recv_timeout blocking read callback with timeout. * * \note One of f_recv or f_recv_timeout can be NULL, in which case * the other is used. If both are non-NULL, f_recv_timeout is * used and f_recv is ignored (as if it were NULL). * * \note The two most common use cases are: * - non-blocking I/O, f_recv != NULL, f_recv_timeout == NULL * - blocking I/O, f_recv == NULL, f_recv_timout != NULL * * \note For DTLS, you need to provide either a non-NULL * f_recv_timeout callback, or a f_recv that doesn't block. * * \note See the documentations of \c mbedtls_ssl_sent_t, * \c mbedtls_ssl_recv_t and \c mbedtls_ssl_recv_timeout_t for * the conventions those callbacks must follow. * * \note On some platforms, net_sockets.c provides * \c mbedtls_net_send(), \c mbedtls_net_recv() and * \c mbedtls_net_recv_timeout() that are suitable to be used * here. */ void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl, void *p_bio, mbedtls_ssl_send_t *f_send, mbedtls_ssl_recv_t *f_recv, mbedtls_ssl_recv_timeout_t *f_recv_timeout ); #if defined(MBEDTLS_SSL_PROTO_DTLS) /** * \brief Set the Maximum Tranport Unit (MTU). * Special value: 0 means unset (no limit). * This represents the maximum size of a datagram payload * handled by the transport layer (usually UDP) as determined * by the network link and stack. In practice, this controls * the maximum size datagram the DTLS layer will pass to the * \c f_send() callback set using \c mbedtls_ssl_set_bio(). * * \note The limit on datagram size is converted to a limit on * record payload by subtracting the current overhead of * encapsulation and encryption/authentication if any. * * \note This can be called at any point during the connection, for * example when a Path Maximum Transfer Unit (PMTU) * estimate becomes available from other sources, * such as lower (or higher) protocol layers. * * \note This setting only controls the size of the packets we send, * and does not restrict the size of the datagrams we're * willing to receive. Client-side, you can request the * server to use smaller records with \c * mbedtls_ssl_conf_max_frag_len(). * * \note If both a MTU and a maximum fragment length have been * configured (or negotiated with the peer), the resulting * lower limit on record payload (see first note) is used. * * \note This can only be used to decrease the maximum size * of datagrams (hence records, see first note) sent. It * cannot be used to increase the maximum size of records over * the limit set by #MBEDTLS_SSL_OUT_CONTENT_LEN. * * \note Values lower than the current record layer expansion will * result in an error when trying to send data. * * \note Using record compression together with a non-zero MTU value * will result in an error when trying to send data. * * \param ssl SSL context * \param mtu Value of the path MTU in bytes */ void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu ); #endif /* MBEDTLS_SSL_PROTO_DTLS */ /** * \brief Set the timeout period for mbedtls_ssl_read() * (Default: no timeout.) * * \param conf SSL configuration context * \param timeout Timeout value in milliseconds. * Use 0 for no timeout (default). * * \note With blocking I/O, this will only work if a non-NULL * \c f_recv_timeout was set with \c mbedtls_ssl_set_bio(). * With non-blocking I/O, this will only work if timer * callbacks were set with \c mbedtls_ssl_set_timer_cb(). * * \note With non-blocking I/O, you may also skip this function * altogether and handle timeouts at the application layer. */ void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout ); /** * \brief Set the timer callbacks (Mandatory for DTLS.) * * \param ssl SSL context * \param p_timer parameter (context) shared by timer callbacks * \param f_set_timer set timer callback * \param f_get_timer get timer callback. Must return: * * \note See the documentation of \c mbedtls_ssl_set_timer_t and * \c mbedtls_ssl_get_timer_t for the conventions this pair of * callbacks must follow. * * \note On some platforms, timing.c provides * \c mbedtls_timing_set_delay() and * \c mbedtls_timing_get_delay() that are suitable for using * here, except if using an event-driven style. * * \note See also the "DTLS tutorial" article in our knowledge base. * https://tls.mbed.org/kb/how-to/dtls-tutorial */ void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl, void *p_timer, mbedtls_ssl_set_timer_t *f_set_timer, mbedtls_ssl_get_timer_t *f_get_timer ); /** * \brief Callback type: generate and write session ticket * * \note This describes what a callback implementation should do. * This callback should generate an encrypted and * authenticated ticket for the session and write it to the * output buffer. Here, ticket means the opaque ticket part * of the NewSessionTicket structure of RFC 5077. * * \param p_ticket Context for the callback * \param session SSL session to be written in the ticket * \param start Start of the output buffer * \param end End of the output buffer * \param tlen On exit, holds the length written * \param lifetime On exit, holds the lifetime of the ticket in seconds * * \return 0 if successful, or * a specific MBEDTLS_ERR_XXX code. */ typedef int mbedtls_ssl_ticket_write_t( void *p_ticket, const mbedtls_ssl_session *session, unsigned char *start, const unsigned char *end, size_t *tlen, uint32_t *lifetime ); #if defined(MBEDTLS_SSL_EXPORT_KEYS) /** * \brief Callback type: Export key block and master secret * * \note This is required for certain uses of TLS, e.g. EAP-TLS * (RFC 5216) and Thread. The key pointers are ephemeral and * therefore must not be stored. The master secret and keys * should not be used directly except as an input to a key * derivation function. * * \param p_expkey Context for the callback * \param ms Pointer to master secret (fixed length: 48 bytes) * \param kb Pointer to key block, see RFC 5246 section 6.3 * (variable length: 2 * maclen + 2 * keylen + 2 * ivlen). * \param maclen MAC length * \param keylen Key length * \param ivlen IV length * * \return 0 if successful, or * a specific MBEDTLS_ERR_XXX code. */ typedef int mbedtls_ssl_export_keys_t( void *p_expkey, const unsigned char *ms, const unsigned char *kb, size_t maclen, size_t keylen, size_t ivlen ); #endif /* MBEDTLS_SSL_EXPORT_KEYS */ /** * \brief Callback type: parse and load session ticket * * \note This describes what a callback implementation should do. * This callback should parse a session ticket as generated * by the corresponding mbedtls_ssl_ticket_write_t function, * and, if the ticket is authentic and valid, load the * session. * * \note The implementation is allowed to modify the first len * bytes of the input buffer, eg to use it as a temporary * area for the decrypted ticket contents. * * \param p_ticket Context for the callback * \param session SSL session to be loaded * \param buf Start of the buffer containing the ticket * \param len Length of the ticket. * * \return 0 if successful, or * MBEDTLS_ERR_SSL_INVALID_MAC if not authentic, or * MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED if expired, or * any other non-zero code for other failures. */ typedef int mbedtls_ssl_ticket_parse_t( void *p_ticket, mbedtls_ssl_session *session, unsigned char *buf, size_t len ); #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) /** * \brief Configure SSL session ticket callbacks (server only). * (Default: none.) * * \note On server, session tickets are enabled by providing * non-NULL callbacks. * * \note On client, use \c mbedtls_ssl_conf_session_tickets(). * * \param conf SSL configuration context * \param f_ticket_write Callback for writing a ticket * \param f_ticket_parse Callback for parsing a ticket * \param p_ticket Context shared by the two callbacks */ void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf, mbedtls_ssl_ticket_write_t *f_ticket_write, mbedtls_ssl_ticket_parse_t *f_ticket_parse, void *p_ticket ); #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) /** * \brief Configure key export callback. * (Default: none.) * * \note See \c mbedtls_ssl_export_keys_t. * * \param conf SSL configuration context * \param f_export_keys Callback for exporting keys * \param p_export_keys Context for the callback */ void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf, mbedtls_ssl_export_keys_t *f_export_keys, void *p_export_keys ); #endif /* MBEDTLS_SSL_EXPORT_KEYS */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) /** * \brief Configure asynchronous private key operation callbacks. * * \param conf SSL configuration context * \param f_async_sign Callback to start a signature operation. See * the description of ::mbedtls_ssl_async_sign_t * for more information. This may be \c NULL if the * external processor does not support any signature * operation; in this case the private key object * associated with the certificate will be used. * \param f_async_decrypt Callback to start a decryption operation. See * the description of ::mbedtls_ssl_async_decrypt_t * for more information. This may be \c NULL if the * external processor does not support any decryption * operation; in this case the private key object * associated with the certificate will be used. * \param f_async_resume Callback to resume an asynchronous operation. See * the description of ::mbedtls_ssl_async_resume_t * for more information. This may not be \c NULL unless * \p f_async_sign and \p f_async_decrypt are both * \c NULL. * \param f_async_cancel Callback to cancel an asynchronous operation. See * the description of ::mbedtls_ssl_async_cancel_t * for more information. This may be \c NULL if * no cleanup is needed. * \param config_data A pointer to configuration data which can be * retrieved with * mbedtls_ssl_conf_get_async_config_data(). The * library stores this value without dereferencing it. */ void mbedtls_ssl_conf_async_private_cb( mbedtls_ssl_config *conf, mbedtls_ssl_async_sign_t *f_async_sign, mbedtls_ssl_async_decrypt_t *f_async_decrypt, mbedtls_ssl_async_resume_t *f_async_resume, mbedtls_ssl_async_cancel_t *f_async_cancel, void *config_data ); /** * \brief Retrieve the configuration data set by * mbedtls_ssl_conf_async_private_cb(). * * \param conf SSL configuration context * \return The configuration data set by * mbedtls_ssl_conf_async_private_cb(). */ void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf ); /** * \brief Retrieve the asynchronous operation user context. * * \note This function may only be called while a handshake * is in progress. * * \param ssl The SSL context to access. * * \return The asynchronous operation user context that was last * set during the current handshake. If * mbedtls_ssl_set_async_operation_data() has not yet been * called during the current handshake, this function returns * \c NULL. */ void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl ); /** * \brief Retrieve the asynchronous operation user context. * * \note This function may only be called while a handshake * is in progress. * * \param ssl The SSL context to access. * \param ctx The new value of the asynchronous operation user context. * Call mbedtls_ssl_get_async_operation_data() later during the * same handshake to retrieve this value. */ void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl, void *ctx ); #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ /** * \brief Callback type: generate a cookie * * \param ctx Context for the callback * \param p Buffer to write to, * must be updated to point right after the cookie * \param end Pointer to one past the end of the output buffer * \param info Client ID info that was passed to * \c mbedtls_ssl_set_client_transport_id() * \param ilen Length of info in bytes * * \return The callback must return 0 on success, * or a negative error code. */ typedef int mbedtls_ssl_cookie_write_t( void *ctx, unsigned char **p, unsigned char *end, const unsigned char *info, size_t ilen ); /** * \brief Callback type: verify a cookie * * \param ctx Context for the callback * \param cookie Cookie to verify * \param clen Length of cookie * \param info Client ID info that was passed to * \c mbedtls_ssl_set_client_transport_id() * \param ilen Length of info in bytes * * \return The callback must return 0 if cookie is valid, * or a negative error code. */ typedef int mbedtls_ssl_cookie_check_t( void *ctx, const unsigned char *cookie, size_t clen, const unsigned char *info, size_t ilen ); #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) /** * \brief Register callbacks for DTLS cookies * (Server only. DTLS only.) * * Default: dummy callbacks that fail, in order to force you to * register working callbacks (and initialize their context). * * To disable HelloVerifyRequest, register NULL callbacks. * * \warning Disabling hello verification allows your server to be used * for amplification in DoS attacks against other hosts. * Only disable if you known this can't happen in your * particular environment. * * \note See comments on \c mbedtls_ssl_handshake() about handling * the MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED that is expected * on the first handshake attempt when this is enabled. * * \note This is also necessary to handle client reconnection from * the same port as described in RFC 6347 section 4.2.8 (only * the variant with cookies is supported currently). See * comments on \c mbedtls_ssl_read() for details. * * \param conf SSL configuration * \param f_cookie_write Cookie write callback * \param f_cookie_check Cookie check callback * \param p_cookie Context for both callbacks */ void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf, mbedtls_ssl_cookie_write_t *f_cookie_write, mbedtls_ssl_cookie_check_t *f_cookie_check, void *p_cookie ); /** * \brief Set client's transport-level identification info. * (Server only. DTLS only.) * * This is usually the IP address (and port), but could be * anything identify the client depending on the underlying * network stack. Used for HelloVerifyRequest with DTLS. * This is *not* used to route the actual packets. * * \param ssl SSL context * \param info Transport-level info identifying the client (eg IP + port) * \param ilen Length of info in bytes * * \note An internal copy is made, so the info buffer can be reused. * * \return 0 on success, * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used on client, * MBEDTLS_ERR_SSL_ALLOC_FAILED if out of memory. */ int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl, const unsigned char *info, size_t ilen ); #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) /** * \brief Enable or disable anti-replay protection for DTLS. * (DTLS only, no effect on TLS.) * Default: enabled. * * \param conf SSL configuration * \param mode MBEDTLS_SSL_ANTI_REPLAY_ENABLED or MBEDTLS_SSL_ANTI_REPLAY_DISABLED. * * \warning Disabling this is a security risk unless the application * protocol handles duplicated packets in a safe way. You * should not disable this without careful consideration. * However, if your application already detects duplicated * packets and needs information about them to adjust its * transmission strategy, then you'll want to disable this. */ void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ); #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) /** * \brief Set a limit on the number of records with a bad MAC * before terminating the connection. * (DTLS only, no effect on TLS.) * Default: 0 (disabled). * * \param conf SSL configuration * \param limit Limit, or 0 to disable. * * \note If the limit is N, then the connection is terminated when * the Nth non-authentic record is seen. * * \note Records with an invalid header are not counted, only the * ones going through the authentication-decryption phase. * * \note This is a security trade-off related to the fact that it's * often relatively easy for an active attacker ot inject UDP * datagrams. On one hand, setting a low limit here makes it * easier for such an attacker to forcibly terminated a * connection. On the other hand, a high limit or no limit * might make us waste resources checking authentication on * many bogus packets. */ void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit ); #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ #if defined(MBEDTLS_SSL_PROTO_DTLS) /** * \brief Allow or disallow packing of multiple handshake records * within a single datagram. * * \param ssl The SSL context to configure. * \param allow_packing This determines whether datagram packing may * be used or not. A value of \c 0 means that every * record will be sent in a separate datagram; a * value of \c 1 means that, if space permits, * multiple handshake messages (including CCS) belonging to * a single flight may be packed within a single datagram. * * \note This is enabled by default and should only be disabled * for test purposes, or if datagram packing causes * interoperability issues with peers that don't support it. * * \note Allowing datagram packing reduces the network load since * there's less overhead if multiple messages share the same * datagram. Also, it increases the handshake efficiency * since messages belonging to a single datagram will not * be reordered in transit, and so future message buffering * or flight retransmission (if no buffering is used) as * means to deal with reordering are needed less frequently. * * \note Application records are not affected by this option and * are currently always sent in separate datagrams. * */ void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl, unsigned allow_packing ); /** * \brief Set retransmit timeout values for the DTLS handshake. * (DTLS only, no effect on TLS.) * * \param conf SSL configuration * \param min Initial timeout value in milliseconds. * Default: 1000 (1 second). * \param max Maximum timeout value in milliseconds. * Default: 60000 (60 seconds). * * \note Default values are from RFC 6347 section 4.2.4.1. * * \note The 'min' value should typically be slightly above the * expected round-trip time to your peer, plus whatever time * it takes for the peer to process the message. For example, * if your RTT is about 600ms and you peer needs up to 1s to * do the cryptographic operations in the handshake, then you * should set 'min' slightly above 1600. Lower values of 'min' * might cause spurious resends which waste network resources, * while larger value of 'min' will increase overall latency * on unreliable network links. * * \note The more unreliable your network connection is, the larger * your max / min ratio needs to be in order to achieve * reliable handshakes. * * \note Messages are retransmitted up to log2(ceil(max/min)) times. * For example, if min = 1s and max = 5s, the retransmit plan * goes: send ... 1s -> resend ... 2s -> resend ... 4s -> * resend ... 5s -> give up and return a timeout error. */ void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max ); #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_SRV_C) /** * \brief Set the session cache callbacks (server-side only) * If not set, no session resuming is done (except if session * tickets are enabled too). * * The session cache has the responsibility to check for stale * entries based on timeout. See RFC 5246 for recommendations. * * Warning: session.peer_cert is cleared by the SSL/TLS layer on * connection shutdown, so do not cache the pointer! Either set * it to NULL or make a full copy of the certificate. * * The get callback is called once during the initial handshake * to enable session resuming. The get function has the * following parameters: (void *parameter, mbedtls_ssl_session *session) * If a valid entry is found, it should fill the master of * the session object with the cached values and return 0, * return 1 otherwise. Optionally peer_cert can be set as well * if it is properly present in cache entry. * * The set callback is called once during the initial handshake * to enable session resuming after the entire handshake has * been finished. The set function has the following parameters: * (void *parameter, const mbedtls_ssl_session *session). The function * should create a cache entry for future retrieval based on * the data in the session structure and should keep in mind * that the mbedtls_ssl_session object presented (and all its referenced * data) is cleared by the SSL/TLS layer when the connection is * terminated. It is recommended to add metadata to determine if * an entry is still valid in the future. Return 0 if * successfully cached, return 1 otherwise. * * \param conf SSL configuration * \param p_cache parmater (context) for both callbacks * \param f_get_cache session get callback * \param f_set_cache session set callback */ void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf, void *p_cache, int (*f_get_cache)(void *, mbedtls_ssl_session *), int (*f_set_cache)(void *, const mbedtls_ssl_session *) ); #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_CLI_C) /** * \brief Request resumption of session (client-side only) * Session data is copied from presented session structure. * * \param ssl SSL context * \param session session context * * \return 0 if successful, * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or * arguments are otherwise invalid * * \sa mbedtls_ssl_get_session() */ int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session ); #endif /* MBEDTLS_SSL_CLI_C */ /** * \brief Set the list of allowed ciphersuites and the preference * order. First in the list has the highest preference. * (Overrides all version-specific lists) * * The ciphersuites array is not copied, and must remain * valid for the lifetime of the ssl_config. * * Note: The server uses its own preferences * over the preference of the client unless * MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE is defined! * * \param conf SSL configuration * \param ciphersuites 0-terminated list of allowed ciphersuites */ void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf, const int *ciphersuites ); /** * \brief Set the list of allowed ciphersuites and the * preference order for a specific version of the protocol. * (Only useful on the server side) * * The ciphersuites array is not copied, and must remain * valid for the lifetime of the ssl_config. * * \param conf SSL configuration * \param ciphersuites 0-terminated list of allowed ciphersuites * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 * supported) * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, * MBEDTLS_SSL_MINOR_VERSION_3 supported) * * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 * and MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 */ void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf, const int *ciphersuites, int major, int minor ); #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Set the X.509 security profile used for verification * * \note The restrictions are enforced for all certificates in the * chain. However, signatures in the handshake are not covered * by this setting but by \b mbedtls_ssl_conf_sig_hashes(). * * \param conf SSL configuration * \param profile Profile to use */ void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf, const mbedtls_x509_crt_profile *profile ); /** * \brief Set the data required to verify peer certificate * * \note See \c mbedtls_x509_crt_verify() for notes regarding the * parameters ca_chain (maps to trust_ca for that function) * and ca_crl. * * \param conf SSL configuration * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) * \param ca_crl trusted CA CRLs */ void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf, mbedtls_x509_crt *ca_chain, mbedtls_x509_crl *ca_crl ); /** * \brief Set own certificate chain and private key * * \note own_cert should contain in order from the bottom up your * certificate chain. The top certificate (self-signed) * can be omitted. * * \note On server, this function can be called multiple times to * provision more than one cert/key pair (eg one ECDSA, one * RSA with SHA-256, one RSA with SHA-1). An adequate * certificate will be selected according to the client's * advertised capabilities. In case mutliple certificates are * adequate, preference is given to the one set by the first * call to this function, then second, etc. * * \note On client, only the first call has any effect. That is, * only one client certificate can be provisioned. The * server's preferences in its CertficateRequest message will * be ignored and our only cert will be sent regardless of * whether it matches those preferences - the server can then * decide what it wants to do with it. * * \note The provided \p pk_key needs to match the public key in the * first certificate in \p own_cert, or all handshakes using * that certificate will fail. It is your responsibility * to ensure that; this function will not perform any check. * You may use mbedtls_pk_check_pair() in order to perform * this check yourself, but be aware that this function can * be computationally expensive on some key types. * * \param conf SSL configuration * \param own_cert own public certificate chain * \param pk_key own private key * * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED */ int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf, mbedtls_x509_crt *own_cert, mbedtls_pk_context *pk_key ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) /** * \brief Set the Pre Shared Key (PSK) and the expected identity name * * \note This is mainly useful for clients. Servers will usually * want to use \c mbedtls_ssl_conf_psk_cb() instead. * * \note Currently clients can only register one pre-shared key. * In other words, the servers' identity hint is ignored. * Support for setting multiple PSKs on clients and selecting * one based on the identity hint is not a planned feature but * feedback is welcomed. * * \param conf SSL configuration * \param psk pointer to the pre-shared key * \param psk_len pre-shared key length * \param psk_identity pointer to the pre-shared key identity * \param psk_identity_len identity key length * * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED */ int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf, const unsigned char *psk, size_t psk_len, const unsigned char *psk_identity, size_t psk_identity_len ); /** * \brief Set the Pre Shared Key (PSK) for the current handshake * * \note This should only be called inside the PSK callback, * ie the function passed to \c mbedtls_ssl_conf_psk_cb(). * * \param ssl SSL context * \param psk pointer to the pre-shared key * \param psk_len pre-shared key length * * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED */ int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl, const unsigned char *psk, size_t psk_len ); /** * \brief Set the PSK callback (server-side only). * * If set, the PSK callback is called for each * handshake where a PSK ciphersuite was negotiated. * The caller provides the identity received and wants to * receive the actual PSK data and length. * * The callback has the following parameters: (void *parameter, * mbedtls_ssl_context *ssl, const unsigned char *psk_identity, * size_t identity_len) * If a valid PSK identity is found, the callback should use * \c mbedtls_ssl_set_hs_psk() on the ssl context to set the * correct PSK and return 0. * Any other return value will result in a denied PSK identity. * * \note If you set a PSK callback using this function, then you * don't need to set a PSK key and identity using * \c mbedtls_ssl_conf_psk(). * * \param conf SSL configuration * \param f_psk PSK identity function * \param p_psk PSK identity parameter */ void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf, int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t), void *p_psk ); #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Set the Diffie-Hellman public P and G values, * read as hexadecimal strings (server-side only) * (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]) * * \param conf SSL configuration * \param dhm_P Diffie-Hellman-Merkle modulus * \param dhm_G Diffie-Hellman-Merkle generator * * \deprecated Superseded by \c mbedtls_ssl_conf_dh_param_bin. * * \return 0 if successful */ MBEDTLS_DEPRECATED int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G ); #endif /* MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Set the Diffie-Hellman public P and G values * from big-endian binary presentations. * (Default values: MBEDTLS_DHM_RFC3526_MODP_2048_[PG]_BIN) * * \param conf SSL configuration * \param dhm_P Diffie-Hellman-Merkle modulus in big-endian binary form * \param P_len Length of DHM modulus * \param dhm_G Diffie-Hellman-Merkle generator in big-endian binary form * \param G_len Length of DHM generator * * \return 0 if successful */ int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf, const unsigned char *dhm_P, size_t P_len, const unsigned char *dhm_G, size_t G_len ); /** * \brief Set the Diffie-Hellman public P and G values, * read from existing context (server-side only) * * \param conf SSL configuration * \param dhm_ctx Diffie-Hellman-Merkle context * * \return 0 if successful */ int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx ); #endif /* MBEDTLS_DHM_C && defined(MBEDTLS_SSL_SRV_C) */ #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) /** * \brief Set the minimum length for Diffie-Hellman parameters. * (Client-side only.) * (Default: 1024 bits.) * * \param conf SSL configuration * \param bitlen Minimum bit length of the DHM prime */ void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf, unsigned int bitlen ); #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_ECP_C) /** * \brief Set the allowed curves in order of preference. * (Default: all defined curves.) * * On server: this only affects selection of the ECDHE curve; * the curves used for ECDH and ECDSA are determined by the * list of available certificates instead. * * On client: this affects the list of curves offered for any * use. The server can override our preference order. * * Both sides: limits the set of curves accepted for use in * ECDHE and in the peer's end-entity certificate. * * \note This has no influence on which curves are allowed inside the * certificate chains, see \c mbedtls_ssl_conf_cert_profile() * for that. For the end-entity certificate however, the key * will be accepted only if it is allowed both by this list * and by the cert profile. * * \note This list should be ordered by decreasing preference * (preferred curve first). * * \param conf SSL configuration * \param curves Ordered list of allowed curves, * terminated by MBEDTLS_ECP_DP_NONE. */ void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf, const mbedtls_ecp_group_id *curves ); #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /** * \brief Set the allowed hashes for signatures during the handshake. * (Default: all available hashes except MD5.) * * \note This only affects which hashes are offered and can be used * for signatures during the handshake. Hashes for message * authentication and the TLS PRF are controlled by the * ciphersuite, see \c mbedtls_ssl_conf_ciphersuites(). Hashes * used for certificate signature are controlled by the * verification profile, see \c mbedtls_ssl_conf_cert_profile(). * * \note This list should be ordered by decreasing preference * (preferred hash first). * * \param conf SSL configuration * \param hashes Ordered list of allowed signature hashes, * terminated by \c MBEDTLS_MD_NONE. */ void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf, const int *hashes ); #endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Set or reset the hostname to check against the received * server certificate. It sets the ServerName TLS extension, * too, if that extension is enabled. (client-side only) * * \param ssl SSL context * \param hostname the server hostname, may be NULL to clear hostname * \note Maximum hostname length MBEDTLS_SSL_MAX_HOST_NAME_LEN. * * \return 0 if successful, MBEDTLS_ERR_SSL_ALLOC_FAILED on * allocation failure, MBEDTLS_ERR_SSL_BAD_INPUT_DATA on * too long input hostname. * * Hostname set to the one provided on success (cleared * when NULL). On allocation failure hostname is cleared. * On too long input failure, old hostname is unchanged. */ int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) /** * \brief Set own certificate and key for the current handshake * * \note Same as \c mbedtls_ssl_conf_own_cert() but for use within * the SNI callback. * * \param ssl SSL context * \param own_cert own public certificate chain * \param pk_key own private key * * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED */ int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl, mbedtls_x509_crt *own_cert, mbedtls_pk_context *pk_key ); /** * \brief Set the data required to verify peer certificate for the * current handshake * * \note Same as \c mbedtls_ssl_conf_ca_chain() but for use within * the SNI callback. * * \param ssl SSL context * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) * \param ca_crl trusted CA CRLs */ void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl, mbedtls_x509_crt *ca_chain, mbedtls_x509_crl *ca_crl ); /** * \brief Set authmode for the current handshake. * * \note Same as \c mbedtls_ssl_conf_authmode() but for use within * the SNI callback. * * \param ssl SSL context * \param authmode MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL or * MBEDTLS_SSL_VERIFY_REQUIRED */ void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl, int authmode ); /** * \brief Set server side ServerName TLS extension callback * (optional, server-side only). * * If set, the ServerName callback is called whenever the * server receives a ServerName TLS extension from the client * during a handshake. The ServerName callback has the * following parameters: (void *parameter, mbedtls_ssl_context *ssl, * const unsigned char *hostname, size_t len). If a suitable * certificate is found, the callback must set the * certificate(s) and key(s) to use with \c * mbedtls_ssl_set_hs_own_cert() (can be called repeatedly), * and may optionally adjust the CA and associated CRL with \c * mbedtls_ssl_set_hs_ca_chain() as well as the client * authentication mode with \c mbedtls_ssl_set_hs_authmode(), * then must return 0. If no matching name is found, the * callback must either set a default cert, or * return non-zero to abort the handshake at this point. * * \param conf SSL configuration * \param f_sni verification function * \param p_sni verification parameter */ void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf, int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t), void *p_sni ); #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) /** * \brief Set the EC J-PAKE password for current handshake. * * \note An internal copy is made, and destroyed as soon as the * handshake is completed, or when the SSL context is reset or * freed. * * \note The SSL context needs to be already set up. The right place * to call this function is between \c mbedtls_ssl_setup() or * \c mbedtls_ssl_reset() and \c mbedtls_ssl_handshake(). * * \param ssl SSL context * \param pw EC J-PAKE password (pre-shared secret) * \param pw_len length of pw in bytes * * \return 0 on success, or a negative error code. */ int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl, const unsigned char *pw, size_t pw_len ); #endif /*MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_ALPN) /** * \brief Set the supported Application Layer Protocols. * * \param conf SSL configuration * \param protos Pointer to a NULL-terminated list of supported protocols, * in decreasing preference order. The pointer to the list is * recorded by the library for later reference as required, so * the lifetime of the table must be atleast as long as the * lifetime of the SSL configuration structure. * * \return 0 on success, or MBEDTLS_ERR_SSL_BAD_INPUT_DATA. */ int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos ); /** * \brief Get the name of the negotiated Application Layer Protocol. * This function should be called after the handshake is * completed. * * \param ssl SSL context * * \return Protcol name, or NULL if no protocol was negotiated. */ const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_SSL_ALPN */ /** * \brief Set the maximum supported version sent from the client side * and/or accepted at the server side * (Default: MBEDTLS_SSL_MAX_MAJOR_VERSION, MBEDTLS_SSL_MAX_MINOR_VERSION) * * \note This ignores ciphersuites from higher versions. * * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 * * \param conf SSL configuration * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, * MBEDTLS_SSL_MINOR_VERSION_3 supported) */ void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor ); /** * \brief Set the minimum accepted SSL/TLS protocol version * (Default: TLS 1.0) * * \note Input outside of the SSL_MAX_XXXXX_VERSION and * SSL_MIN_XXXXX_VERSION range is ignored. * * \note MBEDTLS_SSL_MINOR_VERSION_0 (SSL v3) should be avoided. * * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 * * \param conf SSL configuration * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, * MBEDTLS_SSL_MINOR_VERSION_3 supported) */ void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor ); #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) /** * \brief Set the fallback flag (client-side only). * (Default: MBEDTLS_SSL_IS_NOT_FALLBACK). * * \note Set to MBEDTLS_SSL_IS_FALLBACK when preparing a fallback * connection, that is a connection with max_version set to a * lower value than the value you're willing to use. Such * fallback connections are not recommended but are sometimes * necessary to interoperate with buggy (version-intolerant) * servers. * * \warning You should NOT set this to MBEDTLS_SSL_IS_FALLBACK for * non-fallback connections! This would appear to work for a * while, then cause failures when the server is upgraded to * support a newer TLS version. * * \param conf SSL configuration * \param fallback MBEDTLS_SSL_IS_NOT_FALLBACK or MBEDTLS_SSL_IS_FALLBACK */ void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback ); #endif /* MBEDTLS_SSL_FALLBACK_SCSV && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) /** * \brief Enable or disable Encrypt-then-MAC * (Default: MBEDTLS_SSL_ETM_ENABLED) * * \note This should always be enabled, it is a security * improvement, and should not cause any interoperability * issue (used only if the peer supports it too). * * \param conf SSL configuration * \param etm MBEDTLS_SSL_ETM_ENABLED or MBEDTLS_SSL_ETM_DISABLED */ void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm ); #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) /** * \brief Enable or disable Extended Master Secret negotiation. * (Default: MBEDTLS_SSL_EXTENDED_MS_ENABLED) * * \note This should always be enabled, it is a security fix to the * protocol, and should not cause any interoperability issue * (used only if the peer supports it too). * * \param conf SSL configuration * \param ems MBEDTLS_SSL_EXTENDED_MS_ENABLED or MBEDTLS_SSL_EXTENDED_MS_DISABLED */ void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems ); #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_ARC4_C) /** * \brief Disable or enable support for RC4 * (Default: MBEDTLS_SSL_ARC4_DISABLED) * * \warning Use of RC4 in DTLS/TLS has been prohibited by RFC 7465 * for security reasons. Use at your own risk. * * \note This function is deprecated and will likely be removed in * a future version of the library. * RC4 is disabled by default at compile time and needs to be * actively enabled for use with legacy systems. * * \param conf SSL configuration * \param arc4 MBEDTLS_SSL_ARC4_ENABLED or MBEDTLS_SSL_ARC4_DISABLED */ void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 ); #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_SSL_SRV_C) /** * \brief Whether to send a list of acceptable CAs in * CertificateRequest messages. * (Default: do send) * * \param conf SSL configuration * \param cert_req_ca_list MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED or * MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED */ void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf, char cert_req_ca_list ); #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) /** * \brief Set the maximum fragment length to emit and/or negotiate * (Default: the smaller of MBEDTLS_SSL_IN_CONTENT_LEN and * MBEDTLS_SSL_OUT_CONTENT_LEN, usually 2^14 bytes) * (Server: set maximum fragment length to emit, * usually negotiated by the client during handshake * (Client: set maximum fragment length to emit *and* * negotiate with the server during handshake) * * \note With TLS, this currently only affects ApplicationData (sent * with \c mbedtls_ssl_read()), not handshake messages. * With DTLS, this affects both ApplicationData and handshake. * * \note This sets the maximum length for a record's payload, * excluding record overhead that will be added to it, see * \c mbedtls_ssl_get_record_expansion(). * * \note For DTLS, it is also possible to set a limit for the total * size of daragrams passed to the transport layer, including * record overhead, see \c mbedtls_ssl_set_mtu(). * * \param conf SSL configuration * \param mfl_code Code for maximum fragment length (allowed values: * MBEDTLS_SSL_MAX_FRAG_LEN_512, MBEDTLS_SSL_MAX_FRAG_LEN_1024, * MBEDTLS_SSL_MAX_FRAG_LEN_2048, MBEDTLS_SSL_MAX_FRAG_LEN_4096) * * \return 0 if successful or MBEDTLS_ERR_SSL_BAD_INPUT_DATA */ int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code ); #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) /** * \brief Activate negotiation of truncated HMAC * (Default: MBEDTLS_SSL_TRUNC_HMAC_DISABLED) * * \param conf SSL configuration * \param truncate Enable or disable (MBEDTLS_SSL_TRUNC_HMAC_ENABLED or * MBEDTLS_SSL_TRUNC_HMAC_DISABLED) */ void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate ); #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) /** * \brief Enable / Disable 1/n-1 record splitting * (Default: MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED) * * \note Only affects SSLv3 and TLS 1.0, not higher versions. * Does not affect non-CBC ciphersuites in any version. * * \param conf SSL configuration * \param split MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED or * MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED */ void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split ); #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) /** * \brief Enable / Disable session tickets (client only). * (Default: MBEDTLS_SSL_SESSION_TICKETS_ENABLED.) * * \note On server, use \c mbedtls_ssl_conf_session_tickets_cb(). * * \param conf SSL configuration * \param use_tickets Enable or disable (MBEDTLS_SSL_SESSION_TICKETS_ENABLED or * MBEDTLS_SSL_SESSION_TICKETS_DISABLED) */ void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets ); #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_RENEGOTIATION) /** * \brief Enable / Disable renegotiation support for connection when * initiated by peer * (Default: MBEDTLS_SSL_RENEGOTIATION_DISABLED) * * \warning It is recommended to always disable renegotation unless you * know you need it and you know what you're doing. In the * past, there have been several issues associated with * renegotiation or a poor understanding of its properties. * * \note Server-side, enabling renegotiation also makes the server * susceptible to a resource DoS by a malicious client. * * \param conf SSL configuration * \param renegotiation Enable or disable (MBEDTLS_SSL_RENEGOTIATION_ENABLED or * MBEDTLS_SSL_RENEGOTIATION_DISABLED) */ void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation ); #endif /* MBEDTLS_SSL_RENEGOTIATION */ /** * \brief Prevent or allow legacy renegotiation. * (Default: MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) * * MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION allows connections to * be established even if the peer does not support * secure renegotiation, but does not allow renegotiation * to take place if not secure. * (Interoperable and secure option) * * MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations * with non-upgraded peers. Allowing legacy renegotiation * makes the connection vulnerable to specific man in the * middle attacks. (See RFC 5746) * (Most interoperable and least secure option) * * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE breaks off connections * if peer does not support secure renegotiation. Results * in interoperability issues with non-upgraded peers * that do not support renegotiation altogether. * (Most secure option, interoperability issues) * * \param conf SSL configuration * \param allow_legacy Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION, * SSL_ALLOW_LEGACY_RENEGOTIATION or * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) */ void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy ); #if defined(MBEDTLS_SSL_RENEGOTIATION) /** * \brief Enforce renegotiation requests. * (Default: enforced, max_records = 16) * * When we request a renegotiation, the peer can comply or * ignore the request. This function allows us to decide * whether to enforce our renegotiation requests by closing * the connection if the peer doesn't comply. * * However, records could already be in transit from the peer * when the request is emitted. In order to increase * reliability, we can accept a number of records before the * expected handshake records. * * The optimal value is highly dependent on the specific usage * scenario. * * \note With DTLS and server-initiated renegotiation, the * HelloRequest is retransmited every time mbedtls_ssl_read() times * out or receives Application Data, until: * - max_records records have beens seen, if it is >= 0, or * - the number of retransmits that would happen during an * actual handshake has been reached. * Please remember the request might be lost a few times * if you consider setting max_records to a really low value. * * \warning On client, the grace period can only happen during * mbedtls_ssl_read(), as opposed to mbedtls_ssl_write() and mbedtls_ssl_renegotiate() * which always behave as if max_record was 0. The reason is, * if we receive application data from the server, we need a * place to write it, which only happens during mbedtls_ssl_read(). * * \param conf SSL configuration * \param max_records Use MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED if you don't want to * enforce renegotiation, or a non-negative value to enforce * it but allow for a grace period of max_records records. */ void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records ); /** * \brief Set record counter threshold for periodic renegotiation. * (Default: 2^48 - 1) * * Renegotiation is automatically triggered when a record * counter (outgoing or ingoing) crosses the defined * threshold. The default value is meant to prevent the * connection from being closed when the counter is about to * reached its maximal value (it is not allowed to wrap). * * Lower values can be used to enforce policies such as "keys * must be refreshed every N packets with cipher X". * * The renegotiation period can be disabled by setting * conf->disable_renegotiation to * MBEDTLS_SSL_RENEGOTIATION_DISABLED. * * \note When the configured transport is * MBEDTLS_SSL_TRANSPORT_DATAGRAM the maximum renegotiation * period is 2^48 - 1, and for MBEDTLS_SSL_TRANSPORT_STREAM, * the maximum renegotiation period is 2^64 - 1. * * \param conf SSL configuration * \param period The threshold value: a big-endian 64-bit number. */ void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf, const unsigned char period[8] ); #endif /* MBEDTLS_SSL_RENEGOTIATION */ /** * \brief Check if there is data already read from the * underlying transport but not yet processed. * * \param ssl SSL context * * \return 0 if nothing's pending, 1 otherwise. * * \note This is different in purpose and behaviour from * \c mbedtls_ssl_get_bytes_avail in that it considers * any kind of unprocessed data, not only unread * application data. If \c mbedtls_ssl_get_bytes * returns a non-zero value, this function will * also signal pending data, but the converse does * not hold. For example, in DTLS there might be * further records waiting to be processed from * the current underlying transport's datagram. * * \note If this function returns 1 (data pending), this * does not imply that a subsequent call to * \c mbedtls_ssl_read will provide any data; * e.g., the unprocessed data might turn out * to be an alert or a handshake message. * * \note This function is useful in the following situation: * If the SSL/TLS module successfully returns from an * operation - e.g. a handshake or an application record * read - and you're awaiting incoming data next, you * must not immediately idle on the underlying transport * to have data ready, but you need to check the value * of this function first. The reason is that the desired * data might already be read but not yet processed. * If, in contrast, a previous call to the SSL/TLS module * returned MBEDTLS_ERR_SSL_WANT_READ, it is not necessary * to call this function, as the latter error code entails * that all internal data has been processed. * */ int mbedtls_ssl_check_pending( const mbedtls_ssl_context *ssl ); /** * \brief Return the number of application data bytes * remaining to be read from the current record. * * \param ssl SSL context * * \return How many bytes are available in the application * data record read buffer. * * \note When working over a datagram transport, this is * useful to detect the current datagram's boundary * in case \c mbedtls_ssl_read has written the maximal * amount of data fitting into the input buffer. * */ size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl ); /** * \brief Return the result of the certificate verification * * \param ssl The SSL context to use. * * \return \c 0 if the certificate verification was successful. * \return \c -1u if the result is not available. This may happen * e.g. if the handshake aborts early, or a verification * callback returned a fatal error. * \return A bitwise combination of \c MBEDTLS_X509_BADCERT_XXX * and \c MBEDTLS_X509_BADCRL_XXX failure flags; see x509.h. */ uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl ); /** * \brief Return the name of the current ciphersuite * * \param ssl SSL context * * \return a string containing the ciphersuite name */ const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl ); /** * \brief Return the current SSL version (SSLv3/TLSv1/etc) * * \param ssl SSL context * * \return a string containing the SSL version */ const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl ); /** * \brief Return the (maximum) number of bytes added by the record * layer: header + encryption/MAC overhead (inc. padding) * * \note This function is not available (always returns an error) * when record compression is enabled. * * \param ssl SSL context * * \return Current maximum record expansion in bytes, or * MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if compression is * enabled, which makes expansion much less predictable */ int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl ); #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) /** * \brief Return the maximum fragment length (payload, in bytes). * This is the value negotiated with peer if any, * or the locally configured value. * * \sa mbedtls_ssl_conf_max_frag_len() * \sa mbedtls_ssl_get_max_record_payload() * * \param ssl SSL context * * \return Current maximum fragment length. */ size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ /** * \brief Return the current maximum outgoing record payload in bytes. * This takes into account the config.h setting \c * MBEDTLS_SSL_OUT_CONTENT_LEN, the configured and negotiated * max fragment length extension if used, and for DTLS the * path MTU as configured and current record expansion. * * \note With DTLS, \c mbedtls_ssl_write() will return an error if * called with a larger length value. * With TLS, \c mbedtls_ssl_write() will fragment the input if * necessary and return the number of bytes written; it is up * to the caller to call \c mbedtls_ssl_write() again in * order to send the remaining bytes if any. * * \note This function is not available (always returns an error) * when record compression is enabled. * * \sa mbedtls_ssl_set_mtu() * \sa mbedtls_ssl_get_max_frag_len() * \sa mbedtls_ssl_get_record_expansion() * * \param ssl SSL context * * \return Current maximum payload for an outgoing record, * or a negative error code. */ int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl ); #if defined(MBEDTLS_X509_CRT_PARSE_C) /** * \brief Return the peer certificate from the current connection * * Note: Can be NULL in case no certificate was sent during * the handshake. Different calls for the same connection can * return the same or different pointers for the same * certificate and even a different certificate altogether. * The peer cert CAN change in a single connection if * renegotiation is performed. * * \param ssl SSL context * * \return the current peer certificate */ const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_CLI_C) /** * \brief Save session in order to resume it later (client-side only) * Session data is copied to presented session structure. * * * \param ssl SSL context * \param session session context * * \return 0 if successful, * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or * arguments are otherwise invalid. * * \note Only the server certificate is copied, and not the full chain, * so you should not attempt to validate the certificate again * by calling \c mbedtls_x509_crt_verify() on it. * Instead, you should use the results from the verification * in the original handshake by calling \c mbedtls_ssl_get_verify_result() * after loading the session again into a new SSL context * using \c mbedtls_ssl_set_session(). * * \note Once the session object is not needed anymore, you should * free it by calling \c mbedtls_ssl_session_free(). * * \sa mbedtls_ssl_set_session() */ int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *session ); #endif /* MBEDTLS_SSL_CLI_C */ /** * \brief Perform the SSL handshake * * \param ssl SSL context * * \return \c 0 if successful. * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE * if the handshake is incomplete and waiting for data to * be available for reading from or writing to the underlying * transport - in this case you must call this function again * when the underlying transport is ready for the operation. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous * operation is in progress (see * mbedtls_ssl_conf_async_private_cb()) - in this case you * must call this function again when the operation is ready. * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic * operation is in progress (see mbedtls_ecp_set_max_ops()) - * in this case you must call this function again to complete * the handshake when you're done attending other tasks. * \return #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED if DTLS is in use * and the client did not demonstrate reachability yet - in * this case you must stop using the context (see below). * \return Another SSL error code - in this case you must stop using * the context (see below). * * \warning If this function returns something other than * \c 0, * #MBEDTLS_ERR_SSL_WANT_READ, * #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, * you must stop using the SSL context for reading or writing, * and either free it or call \c mbedtls_ssl_session_reset() * on it before re-using it for a new connection; the current * connection must be closed. * * \note If DTLS is in use, then you may choose to handle * #MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED specially for logging * purposes, as it is an expected return value rather than an * actual error, but you still need to reset/free the context. * * \note Remarks regarding event-driven DTLS: * If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram * from the underlying transport layer is currently being processed, * and it is safe to idle until the timer or the underlying transport * signal a new event. This is not true for a successful handshake, * in which case the datagram of the underlying transport that is * currently being processed might or might not contain further * DTLS records. */ int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl ); /** * \brief Perform a single step of the SSL handshake * * \note The state of the context (ssl->state) will be at * the next state after this function returns \c 0. Do not * call this function if state is MBEDTLS_SSL_HANDSHAKE_OVER. * * \param ssl SSL context * * \return See mbedtls_ssl_handshake(). * * \warning If this function returns something other than \c 0, * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, you must stop using * the SSL context for reading or writing, and either free it * or call \c mbedtls_ssl_session_reset() on it before * re-using it for a new connection; the current connection * must be closed. */ int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl ); #if defined(MBEDTLS_SSL_RENEGOTIATION) /** * \brief Initiate an SSL renegotiation on the running connection. * Client: perform the renegotiation right now. * Server: request renegotiation, which will be performed * during the next call to mbedtls_ssl_read() if honored by * client. * * \param ssl SSL context * * \return 0 if successful, or any mbedtls_ssl_handshake() return * value except #MBEDTLS_ERR_SSL_CLIENT_RECONNECT that can't * happen during a renegotiation. * * \warning If this function returns something other than \c 0, * #MBEDTLS_ERR_SSL_WANT_READ, #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, you must stop using * the SSL context for reading or writing, and either free it * or call \c mbedtls_ssl_session_reset() on it before * re-using it for a new connection; the current connection * must be closed. * */ int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl ); #endif /* MBEDTLS_SSL_RENEGOTIATION */ /** * \brief Read at most 'len' application data bytes * * \param ssl SSL context * \param buf buffer that will hold the data * \param len maximum number of bytes to read * * \return The (positive) number of bytes read if successful. * \return \c 0 if the read end of the underlying transport was closed * - in this case you must stop using the context (see below). * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE * if the handshake is incomplete and waiting for data to * be available for reading from or writing to the underlying * transport - in this case you must call this function again * when the underlying transport is ready for the operation. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous * operation is in progress (see * mbedtls_ssl_conf_async_private_cb()) - in this case you * must call this function again when the operation is ready. * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic * operation is in progress (see mbedtls_ecp_set_max_ops()) - * in this case you must call this function again to complete * the handshake when you're done attending other tasks. * \return #MBEDTLS_ERR_SSL_CLIENT_RECONNECT if we're at the server * side of a DTLS connection and the client is initiating a * new connection using the same source port. See below. * \return Another SSL error code - in this case you must stop using * the context (see below). * * \warning If this function returns something other than * a positive value, * #MBEDTLS_ERR_SSL_WANT_READ, * #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS, * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CLIENT_RECONNECT, * you must stop using the SSL context for reading or writing, * and either free it or call \c mbedtls_ssl_session_reset() * on it before re-using it for a new connection; the current * connection must be closed. * * \note When this function returns #MBEDTLS_ERR_SSL_CLIENT_RECONNECT * (which can only happen server-side), it means that a client * is initiating a new connection using the same source port. * You can either treat that as a connection close and wait * for the client to resend a ClientHello, or directly * continue with \c mbedtls_ssl_handshake() with the same * context (as it has been reset internally). Either way, you * must make sure this is seen by the application as a new * connection: application state, if any, should be reset, and * most importantly the identity of the client must be checked * again. WARNING: not validating the identity of the client * again, or not transmitting the new identity to the * application layer, would allow authentication bypass! * * \note Remarks regarding event-driven DTLS: * - If the function returns #MBEDTLS_ERR_SSL_WANT_READ, no datagram * from the underlying transport layer is currently being processed, * and it is safe to idle until the timer or the underlying transport * signal a new event. * - This function may return MBEDTLS_ERR_SSL_WANT_READ even if data was * initially available on the underlying transport, as this data may have * been only e.g. duplicated messages or a renegotiation request. * Therefore, you must be prepared to receive MBEDTLS_ERR_SSL_WANT_READ even * when reacting to an incoming-data event from the underlying transport. * - On success, the datagram of the underlying transport that is currently * being processed may contain further DTLS records. You should call * \c mbedtls_ssl_check_pending to check for remaining records. * */ int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len ); /** * \brief Try to write exactly 'len' application data bytes * * \warning This function will do partial writes in some cases. If the * return value is non-negative but less than length, the * function must be called again with updated arguments: * buf + ret, len - ret (if ret is the return value) until * it returns a value equal to the last 'len' argument. * * \param ssl SSL context * \param buf buffer holding the data * \param len how many bytes must be written * * \return The (non-negative) number of bytes actually written if * successful (may be less than \p len). * \return #MBEDTLS_ERR_SSL_WANT_READ or #MBEDTLS_ERR_SSL_WANT_WRITE * if the handshake is incomplete and waiting for data to * be available for reading from or writing to the underlying * transport - in this case you must call this function again * when the underlying transport is ready for the operation. * \return #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS if an asynchronous * operation is in progress (see * mbedtls_ssl_conf_async_private_cb()) - in this case you * must call this function again when the operation is ready. * \return #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS if a cryptographic * operation is in progress (see mbedtls_ecp_set_max_ops()) - * in this case you must call this function again to complete * the handshake when you're done attending other tasks. * \return Another SSL error code - in this case you must stop using * the context (see below). * * \warning If this function returns something other than * a non-negative value, * #MBEDTLS_ERR_SSL_WANT_READ, * #MBEDTLS_ERR_SSL_WANT_WRITE, * #MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS or * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS, * you must stop using the SSL context for reading or writing, * and either free it or call \c mbedtls_ssl_session_reset() * on it before re-using it for a new connection; the current * connection must be closed. * * \note When this function returns #MBEDTLS_ERR_SSL_WANT_WRITE/READ, * it must be called later with the *same* arguments, * until it returns a value greater that or equal to 0. When * the function returns #MBEDTLS_ERR_SSL_WANT_WRITE there may be * some partial data in the output buffer, however this is not * yet sent. * * \note If the requested length is greater than the maximum * fragment length (either the built-in limit or the one set * or negotiated with the peer), then: * - with TLS, less bytes than requested are written. * - with DTLS, MBEDTLS_ERR_SSL_BAD_INPUT_DATA is returned. * \c mbedtls_ssl_get_max_frag_len() may be used to query the * active maximum fragment length. * * \note Attempting to write 0 bytes will result in an empty TLS * application record being sent. */ int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ); /** * \brief Send an alert message * * \param ssl SSL context * \param level The alert level of the message * (MBEDTLS_SSL_ALERT_LEVEL_WARNING or MBEDTLS_SSL_ALERT_LEVEL_FATAL) * \param message The alert message (SSL_ALERT_MSG_*) * * \return 0 if successful, or a specific SSL error code. * * \note If this function returns something other than 0 or * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using * the SSL context for reading or writing, and either free it or * call \c mbedtls_ssl_session_reset() on it before re-using it * for a new connection; the current connection must be closed. */ int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl, unsigned char level, unsigned char message ); /** * \brief Notify the peer that the connection is being closed * * \param ssl SSL context * * \return 0 if successful, or a specific SSL error code. * * \note If this function returns something other than 0 or * MBEDTLS_ERR_SSL_WANT_READ/WRITE, you must stop using * the SSL context for reading or writing, and either free it or * call \c mbedtls_ssl_session_reset() on it before re-using it * for a new connection; the current connection must be closed. */ int mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl ); /** * \brief Free referenced items in an SSL context and clear memory * * \param ssl SSL context */ void mbedtls_ssl_free( mbedtls_ssl_context *ssl ); /** * \brief Initialize an SSL configuration context * Just makes the context ready for * mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free(). * * \note You need to call mbedtls_ssl_config_defaults() unless you * manually set all of the relevent fields yourself. * * \param conf SSL configuration context */ void mbedtls_ssl_config_init( mbedtls_ssl_config *conf ); /** * \brief Load reasonnable default SSL configuration values. * (You need to call mbedtls_ssl_config_init() first.) * * \param conf SSL configuration context * \param endpoint MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER * \param transport MBEDTLS_SSL_TRANSPORT_STREAM for TLS, or * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS * \param preset a MBEDTLS_SSL_PRESET_XXX value * * \note See \c mbedtls_ssl_conf_transport() for notes on DTLS. * * \return 0 if successful, or * MBEDTLS_ERR_XXX_ALLOC_FAILED on memory allocation error. */ int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf, int endpoint, int transport, int preset ); /** * \brief Free an SSL configuration context * * \param conf SSL configuration context */ void mbedtls_ssl_config_free( mbedtls_ssl_config *conf ); /** * \brief Initialize SSL session structure * * \param session SSL session */ void mbedtls_ssl_session_init( mbedtls_ssl_session *session ); /** * \brief Free referenced items in an SSL session including the * peer certificate and clear memory * * \note A session object can be freed even if the SSL context * that was used to retrieve the session is still in use. * * \param session SSL session */ void mbedtls_ssl_session_free( mbedtls_ssl_session *session ); #ifdef __cplusplus } #endif #endif /* ssl.h */ fldigi-4.2.05/src/include/mbedtls/ssl_ciphersuites.h0000664000175000017500000006277114611711171017405 00000000000000/** * \file ssl_ciphersuites.h * * \brief SSL Ciphersuites for mbed TLS */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_CIPHERSUITES_H #define MBEDTLS_SSL_CIPHERSUITES_H #include "pk.h" #include "cipher.h" #include "md.h" #ifdef __cplusplus extern "C" { #endif /* * Supported ciphersuites (Official IANA names) */ #define MBEDTLS_TLS_RSA_WITH_NULL_MD5 0x01 /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_NULL_SHA 0x02 /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 0x04 #define MBEDTLS_TLS_RSA_WITH_RC4_128_SHA 0x05 #define MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA 0x09 /**< Weak! Not in TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x0A #define MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA 0x15 /**< Weak! Not in TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x16 #define MBEDTLS_TLS_PSK_WITH_NULL_SHA 0x2C /**< Weak! */ #define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA 0x2D /**< Weak! */ #define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA 0x2E /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA 0x2F #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x33 #define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA 0x35 #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x39 #define MBEDTLS_TLS_RSA_WITH_NULL_SHA256 0x3B /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 0x3C /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 0x3D /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA 0x41 #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x45 #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 0x67 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 0x6B /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA 0x84 #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x88 #define MBEDTLS_TLS_PSK_WITH_RC4_128_SHA 0x8A #define MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA 0x8B #define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA 0x8C #define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA 0x8D #define MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA 0x8E #define MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA 0x8F #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA 0x90 #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA 0x91 #define MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA 0x92 #define MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA 0x93 #define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA 0x94 #define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA 0x95 #define MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 0x9C /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 0x9D /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x9E /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 0x9F /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 0xA8 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 0xA9 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 0xAA /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 0xAB /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 0xAC /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 0xAD /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 0xAE #define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 0xAF #define MBEDTLS_TLS_PSK_WITH_NULL_SHA256 0xB0 /**< Weak! */ #define MBEDTLS_TLS_PSK_WITH_NULL_SHA384 0xB1 /**< Weak! */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 0xB2 #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 0xB3 #define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 0xB4 /**< Weak! */ #define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 0xB5 /**< Weak! */ #define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 0xB6 #define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 0xB7 #define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 0xB8 /**< Weak! */ #define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 0xB9 /**< Weak! */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBA /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBE /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC0 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC4 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA 0xC001 /**< Weak! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA 0xC002 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC003 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0xC004 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0xC005 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA 0xC006 /**< Weak! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 0xC007 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC008 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0xC009 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0xC00A /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA 0xC00B /**< Weak! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA 0xC00C /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA 0xC00D /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA 0xC00E /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 0xC00F /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA 0xC010 /**< Weak! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA 0xC011 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 0xC012 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 0xC013 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 0xC014 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC023 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 0xC024 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 0xC025 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 0xC026 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC027 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 0xC028 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 0xC029 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 0xC02A /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xC02C /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0xC02D /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0xC02E /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xC030 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 0xC031 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 0xC032 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA 0xC033 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA 0xC034 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA 0xC035 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA 0xC036 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 0xC037 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 0xC038 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA 0xC039 /**< Weak! No SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 0xC03A /**< Weak! No SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 0xC03B /**< Weak! No SSL3! */ #define MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256 0xC03C /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384 0xC03D /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 0xC044 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 0xC045 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 0xC048 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 0xC049 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 0xC04A /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 0xC04B /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 0xC04C /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 0xC04D /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 0xC04E /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 0xC04F /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256 0xC050 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384 0xC051 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 0xC052 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 0xC053 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 0xC05C /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 0xC05D /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 0xC05E /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 0xC05F /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 0xC060 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 0xC061 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 0xC062 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 0xC063 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256 0xC064 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384 0xC065 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 0xC066 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 0xC067 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 0xC068 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 0xC069 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256 0xC06A /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384 0xC06B /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 0xC06C /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 0xC06D /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 0xC06E /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 0xC06F /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 0xC070 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 0xC071 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC072 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC073 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC074 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC075 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC076 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC077 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC078 /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC079 /**< Not in SSL3! */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07A /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07B /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07C /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07D /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC086 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC087 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC088 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC089 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08A /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08B /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08C /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08D /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC08E /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC08F /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC090 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC091 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC092 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC093 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC094 #define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC095 #define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC096 #define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC097 #define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC098 #define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC099 #define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC09A /**< Not in SSL3! */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC09B /**< Not in SSL3! */ #define MBEDTLS_TLS_RSA_WITH_AES_128_CCM 0xC09C /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_256_CCM 0xC09D /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM 0xC09E /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM 0xC09F /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 0xC0A0 /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 0xC0A1 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 0xC0A2 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 0xC0A3 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_128_CCM 0xC0A4 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_256_CCM 0xC0A5 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM 0xC0A6 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM 0xC0A7 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 0xC0A8 /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 0xC0A9 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 0xC0AA /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 0xC0AB /**< TLS 1.2 */ /* The last two are named with PSK_DHE in the RFC, which looks like a typo */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM 0xC0AC /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM 0xC0AD /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 0xC0AE /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 0xC0AF /**< TLS 1.2 */ #define MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8 0xC0FF /**< experimental */ /* RFC 7905 */ #define MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA8 /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 0xCCA9 /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 0xCCAA /**< TLS 1.2 */ #define MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAB /**< TLS 1.2 */ #define MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAC /**< TLS 1.2 */ #define MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAD /**< TLS 1.2 */ #define MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 0xCCAE /**< TLS 1.2 */ /* Reminder: update mbedtls_ssl_premaster_secret when adding a new key exchange. * Reminder: update MBEDTLS_KEY_EXCHANGE__xxx below */ typedef enum { MBEDTLS_KEY_EXCHANGE_NONE = 0, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_KEY_EXCHANGE_ECJPAKE, } mbedtls_key_exchange_type_t; /* Key exchanges using a certificate */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) #define MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED #endif /* Key exchanges allowing client certificate requests */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #define MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED #endif /* Key exchanges involving server signature in ServerKeyExchange */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #define MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED #endif /* Key exchanges using ECDH */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED #endif /* Key exchanges that don't involve ephemeral keys */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED #endif /* Key exchanges that involve ephemeral keys */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED #endif /* Key exchanges using a PSK */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED #endif /* Key exchanges using DHE */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED #endif /* Key exchanges using ECDHE */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #define MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED #endif typedef struct mbedtls_ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t; #define MBEDTLS_CIPHERSUITE_WEAK 0x01 /**< Weak ciphersuite flag */ #define MBEDTLS_CIPHERSUITE_SHORT_TAG 0x02 /**< Short authentication tag, eg for CCM_8 */ #define MBEDTLS_CIPHERSUITE_NODTLS 0x04 /**< Can't be used with DTLS */ /** * \brief This structure is used for storing ciphersuite information */ struct mbedtls_ssl_ciphersuite_t { int id; const char * name; mbedtls_cipher_type_t cipher; mbedtls_md_type_t mac; mbedtls_key_exchange_type_t key_exchange; int min_major_ver; int min_minor_ver; int max_major_ver; int max_minor_ver; unsigned char flags; }; const int *mbedtls_ssl_list_ciphersuites( void ); const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string( const char *ciphersuite_name ); const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id( int ciphersuite_id ); #if defined(MBEDTLS_PK_C) mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg( const mbedtls_ssl_ciphersuite_t *info ); mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_alg( const mbedtls_ssl_ciphersuite_t *info ); #endif int mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info ); int mbedtls_ssl_ciphersuite_uses_psk( const mbedtls_ssl_ciphersuite_t *info ); #if defined(MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED) static inline int mbedtls_ssl_ciphersuite_has_pfs( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECJPAKE: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED) static inline int mbedtls_ssl_ciphersuite_no_pfs( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_PSK: case MBEDTLS_KEY_EXCHANGE_RSA_PSK: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED) static inline int mbedtls_ssl_ciphersuite_uses_ecdh( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED */ static inline int mbedtls_ssl_ciphersuite_cert_req_allowed( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: return( 1 ); default: return( 0 ); } } #if defined(MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED) static inline int mbedtls_ssl_ciphersuite_uses_dhe( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_PSK: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED) */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED) static inline int mbedtls_ssl_ciphersuite_uses_ecdhe( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED) */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) static inline int mbedtls_ssl_ciphersuite_uses_server_signature( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ #ifdef __cplusplus } #endif #endif /* ssl_ciphersuites.h */ fldigi-4.2.05/src/include/mbedtls/md5.h0000664000175000017500000002264314611711171014474 00000000000000/** * \file md5.h * * \brief MD5 message digest algorithm (hash function) * * \warning MD5 is considered a weak message digest and its use constitutes a * security risk. We recommend considering stronger message * digests instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_MD5_H #define MBEDTLS_MD5_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_MD5_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_MD5_HW_ACCEL_FAILED -0x002F /**< MD5 hardware accelerator failed */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_MD5_ALT) // Regular implementation // /** * \brief MD5 context structure * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef struct mbedtls_md5_context { uint32_t total[2]; /*!< number of bytes processed */ uint32_t state[4]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ } mbedtls_md5_context; #else /* MBEDTLS_MD5_ALT */ #include "md5_alt.h" #endif /* MBEDTLS_MD5_ALT */ /** * \brief Initialize MD5 context * * \param ctx MD5 context to be initialized * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md5_init( mbedtls_md5_context *ctx ); /** * \brief Clear MD5 context * * \param ctx MD5 context to be cleared * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md5_free( mbedtls_md5_context *ctx ); /** * \brief Clone (the state of) an MD5 context * * \param dst The destination context * \param src The context to be cloned * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md5_clone( mbedtls_md5_context *dst, const mbedtls_md5_context *src ); /** * \brief MD5 context setup * * \param ctx context to be initialized * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_starts_ret( mbedtls_md5_context *ctx ); /** * \brief MD5 process buffer * * \param ctx MD5 context * \param input buffer holding the data * \param ilen length of the input data * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_update_ret( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD5 final digest * * \param ctx MD5 context * \param output MD5 checksum result * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_finish_ret( mbedtls_md5_context *ctx, unsigned char output[16] ); /** * \brief MD5 process data block (internal use only) * * \param ctx MD5 context * \param data buffer holding one block of data * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_internal_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief MD5 context setup * * \deprecated Superseded by mbedtls_md5_starts_ret() in 2.7.0 * * \param ctx context to be initialized * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5_starts( mbedtls_md5_context *ctx ); /** * \brief MD5 process buffer * * \deprecated Superseded by mbedtls_md5_update_ret() in 2.7.0 * * \param ctx MD5 context * \param input buffer holding the data * \param ilen length of the input data * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD5 final digest * * \deprecated Superseded by mbedtls_md5_finish_ret() in 2.7.0 * * \param ctx MD5 context * \param output MD5 checksum result * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] ); /** * \brief MD5 process data block (internal use only) * * \deprecated Superseded by mbedtls_internal_md5_process() in 2.7.0 * * \param ctx MD5 context * \param data buffer holding one block of data * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Output = MD5( input buffer ) * * \param input buffer holding the data * \param ilen length of the input data * \param output MD5 checksum result * * \return 0 if successful * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Output = MD5( input buffer ) * * \deprecated Superseded by mbedtls_md5_ret() in 2.7.0 * * \param input buffer holding the data * \param ilen length of the input data * \param output MD5 checksum result * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed * * \warning MD5 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md5_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_md5.h */ fldigi-4.2.05/src/include/mbedtls/x509_csr.h0000664000175000017500000002370614611711171015364 00000000000000/** * \file x509_csr.h * * \brief X.509 certificate signing request parsing and writing */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_X509_CSR_H #define MBEDTLS_X509_CSR_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "x509.h" #ifdef __cplusplus extern "C" { #endif /** * \addtogroup x509_module * \{ */ /** * \name Structures and functions for X.509 Certificate Signing Requests (CSR) * \{ */ /** * Certificate Signing Request (CSR) structure. */ typedef struct mbedtls_x509_csr { mbedtls_x509_buf raw; /**< The raw CSR data (DER). */ mbedtls_x509_buf cri; /**< The raw CertificateRequestInfo body (DER). */ int version; /**< CSR version (1=v1). */ mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). */ mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ mbedtls_pk_context pk; /**< Container for the public key context. */ mbedtls_x509_buf sig_oid; mbedtls_x509_buf sig; mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ } mbedtls_x509_csr; /** * Container for writing a CSR */ typedef struct mbedtls_x509write_csr { mbedtls_pk_context *key; mbedtls_asn1_named_data *subject; mbedtls_md_type_t md_alg; mbedtls_asn1_named_data *extensions; } mbedtls_x509write_csr; #if defined(MBEDTLS_X509_CSR_PARSE_C) /** * \brief Load a Certificate Signing Request (CSR) in DER format * * \note CSR attributes (if any) are currently silently ignored. * * \param csr CSR context to fill * \param buf buffer holding the CRL data * \param buflen size of the buffer * * \return 0 if successful, or a specific X509 error code */ int mbedtls_x509_csr_parse_der( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ); /** * \brief Load a Certificate Signing Request (CSR), DER or PEM format * * \note See notes for \c mbedtls_x509_csr_parse_der() * * \param csr CSR context to fill * \param buf buffer holding the CRL data * \param buflen size of the buffer * (including the terminating null byte for PEM data) * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ); #if defined(MBEDTLS_FS_IO) /** * \brief Load a Certificate Signing Request (CSR) * * \note See notes for \c mbedtls_x509_csr_parse() * * \param csr CSR context to fill * \param path filename to read the CSR from * * \return 0 if successful, or a specific X509 or PEM error code */ int mbedtls_x509_csr_parse_file( mbedtls_x509_csr *csr, const char *path ); #endif /* MBEDTLS_FS_IO */ /** * \brief Returns an informational string about the * CSR. * * \param buf Buffer to write to * \param size Maximum size of buffer * \param prefix A line prefix * \param csr The X509 CSR to represent * * \return The length of the string written (not including the * terminated nul byte), or a negative error code. */ int mbedtls_x509_csr_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_csr *csr ); /** * \brief Initialize a CSR * * \param csr CSR to initialize */ void mbedtls_x509_csr_init( mbedtls_x509_csr *csr ); /** * \brief Unallocate all CSR data * * \param csr CSR to free */ void mbedtls_x509_csr_free( mbedtls_x509_csr *csr ); #endif /* MBEDTLS_X509_CSR_PARSE_C */ /* \} name */ /* \} addtogroup x509_module */ #if defined(MBEDTLS_X509_CSR_WRITE_C) /** * \brief Initialize a CSR context * * \param ctx CSR context to initialize */ void mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx ); /** * \brief Set the subject name for a CSR * Subject names should contain a comma-separated list * of OID types and values: * e.g. "C=UK,O=ARM,CN=mbed TLS Server 1" * * \param ctx CSR context to use * \param subject_name subject name to set * * \return 0 if subject name was parsed successfully, or * a specific error code */ int mbedtls_x509write_csr_set_subject_name( mbedtls_x509write_csr *ctx, const char *subject_name ); /** * \brief Set the key for a CSR (public key will be included, * private key used to sign the CSR when writing it) * * \param ctx CSR context to use * \param key Asymetric key to include */ void mbedtls_x509write_csr_set_key( mbedtls_x509write_csr *ctx, mbedtls_pk_context *key ); /** * \brief Set the MD algorithm to use for the signature * (e.g. MBEDTLS_MD_SHA1) * * \param ctx CSR context to use * \param md_alg MD algorithm to use */ void mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg ); /** * \brief Set the Key Usage Extension flags * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) * * \param ctx CSR context to use * \param key_usage key usage flags to set * * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage ); /** * \brief Set the Netscape Cert Type flags * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) * * \param ctx CSR context to use * \param ns_cert_type Netscape Cert Type flags to set * * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx, unsigned char ns_cert_type ); /** * \brief Generic function to add to or replace an extension in the * CSR * * \param ctx CSR context to use * \param oid OID of the extension * \param oid_len length of the OID * \param val value of the extension OCTET STRING * \param val_len length of the value data * * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED */ int mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx, const char *oid, size_t oid_len, const unsigned char *val, size_t val_len ); /** * \brief Free the contents of a CSR context * * \param ctx CSR context to free */ void mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx ); /** * \brief Write a CSR (Certificate Signing Request) to a * DER structure * Note: data is written at the end of the buffer! Use the * return value to determine where you should start * using the buffer * * \param ctx CSR to write away * \param buf buffer to write to * \param size size of the buffer * \param f_rng RNG function (for signature, see note) * \param p_rng RNG parameter * * \return length of data written if successful, or a specific * error code * * \note f_rng may be NULL if RSA is used for signature and the * signature is made offline (otherwise f_rng is desirable * for countermeasures against timing attacks). * ECDSA signatures always require a non-NULL f_rng. */ int mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #if defined(MBEDTLS_PEM_WRITE_C) /** * \brief Write a CSR (Certificate Signing Request) to a * PEM string * * \param ctx CSR to write away * \param buf buffer to write to * \param size size of the buffer * \param f_rng RNG function (for signature, see note) * \param p_rng RNG parameter * * \return 0 if successful, or a specific error code * * \note f_rng may be NULL if RSA is used for signature and the * signature is made offline (otherwise f_rng is desirable * for countermeasures against timing attacks). * ECDSA signatures always require a non-NULL f_rng. */ int mbedtls_x509write_csr_pem( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_X509_CSR_WRITE_C */ #ifdef __cplusplus } #endif #endif /* mbedtls_x509_csr.h */ fldigi-4.2.05/src/include/mbedtls/ecjpake.h0000664000175000017500000002620514611711171015407 00000000000000/** * \file ecjpake.h * * \brief Elliptic curve J-PAKE */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ECJPAKE_H #define MBEDTLS_ECJPAKE_H /* * J-PAKE is a password-authenticated key exchange that allows deriving a * strong shared secret from a (potentially low entropy) pre-shared * passphrase, with forward secrecy and mutual authentication. * https://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling * * This file implements the Elliptic Curve variant of J-PAKE, * as defined in Chapter 7.4 of the Thread v1.0 Specification, * available to members of the Thread Group http://threadgroup.org/ * * As the J-PAKE algorithm is inherently symmetric, so is our API. * Each party needs to send its first round message, in any order, to the * other party, then each sends its second round message, in any order. * The payloads are serialized in a way suitable for use in TLS, but could * also be use outside TLS. */ #include "ecp.h" #include "md.h" #ifdef __cplusplus extern "C" { #endif /** * Roles in the EC J-PAKE exchange */ typedef enum { MBEDTLS_ECJPAKE_CLIENT = 0, /**< Client */ MBEDTLS_ECJPAKE_SERVER, /**< Server */ } mbedtls_ecjpake_role; #if !defined(MBEDTLS_ECJPAKE_ALT) /** * EC J-PAKE context structure. * * J-PAKE is a symmetric protocol, except for the identifiers used in * Zero-Knowledge Proofs, and the serialization of the second message * (KeyExchange) as defined by the Thread spec. * * In order to benefit from this symmetry, we choose a different naming * convetion from the Thread v1.0 spec. Correspondance is indicated in the * description as a pair C: client name, S: server name */ typedef struct mbedtls_ecjpake_context { const mbedtls_md_info_t *md_info; /**< Hash to use */ mbedtls_ecp_group grp; /**< Elliptic curve */ mbedtls_ecjpake_role role; /**< Are we client or server? */ int point_format; /**< Format for point export */ mbedtls_ecp_point Xm1; /**< My public key 1 C: X1, S: X3 */ mbedtls_ecp_point Xm2; /**< My public key 2 C: X2, S: X4 */ mbedtls_ecp_point Xp1; /**< Peer public key 1 C: X3, S: X1 */ mbedtls_ecp_point Xp2; /**< Peer public key 2 C: X4, S: X2 */ mbedtls_ecp_point Xp; /**< Peer public key C: Xs, S: Xc */ mbedtls_mpi xm1; /**< My private key 1 C: x1, S: x3 */ mbedtls_mpi xm2; /**< My private key 2 C: x2, S: x4 */ mbedtls_mpi s; /**< Pre-shared secret (passphrase) */ } mbedtls_ecjpake_context; #else /* MBEDTLS_ECJPAKE_ALT */ #include "ecjpake_alt.h" #endif /* MBEDTLS_ECJPAKE_ALT */ /** * \brief Initialize an ECJPAKE context. * * \param ctx The ECJPAKE context to initialize. * This must not be \c NULL. */ void mbedtls_ecjpake_init( mbedtls_ecjpake_context *ctx ); /** * \brief Set up an ECJPAKE context for use. * * \note Currently the only values for hash/curve allowed by the * standard are #MBEDTLS_MD_SHA256/#MBEDTLS_ECP_DP_SECP256R1. * * \param ctx The ECJPAKE context to set up. This must be initialized. * \param role The role of the caller. This must be either * #MBEDTLS_ECJPAKE_CLIENT or #MBEDTLS_ECJPAKE_SERVER. * \param hash The identifier of the hash function to use, * for example #MBEDTLS_MD_SHA256. * \param curve The identifier of the elliptic curve to use, * for example #MBEDTLS_ECP_DP_SECP256R1. * \param secret The pre-shared secret (passphrase). This must be * a readable buffer of length \p len Bytes. It need * only be valid for the duration of this call. * \param len The length of the pre-shared secret \p secret. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_setup( mbedtls_ecjpake_context *ctx, mbedtls_ecjpake_role role, mbedtls_md_type_t hash, mbedtls_ecp_group_id curve, const unsigned char *secret, size_t len ); /** * \brief Check if an ECJPAKE context is ready for use. * * \param ctx The ECJPAKE context to check. This must be * initialized. * * \return \c 0 if the context is ready for use. * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA otherwise. */ int mbedtls_ecjpake_check( const mbedtls_ecjpake_context *ctx ); /** * \brief Generate and write the first round message * (TLS: contents of the Client/ServerHello extension, * excluding extension type and length bytes). * * \param ctx The ECJPAKE context to use. This must be * initialized and set up. * \param buf The buffer to write the contents to. This must be a * writable buffer of length \p len Bytes. * \param len The length of \p buf in Bytes. * \param olen The address at which to store the total number * of Bytes written to \p buf. This must not be \c NULL. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This * may be \c NULL if \p f_rng doesn't use a context. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_write_round_one( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Read and process the first round message * (TLS: contents of the Client/ServerHello extension, * excluding extension type and length bytes). * * \param ctx The ECJPAKE context to use. This must be initialized * and set up. * \param buf The buffer holding the first round message. This must * be a readable buffer of length \p len Bytes. * \param len The length in Bytes of \p buf. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_read_round_one( mbedtls_ecjpake_context *ctx, const unsigned char *buf, size_t len ); /** * \brief Generate and write the second round message * (TLS: contents of the Client/ServerKeyExchange). * * \param ctx The ECJPAKE context to use. This must be initialized, * set up, and already have performed round one. * \param buf The buffer to write the round two contents to. * This must be a writable buffer of length \p len Bytes. * \param len The size of \p buf in Bytes. * \param olen The address at which to store the total number of Bytes * written to \p buf. This must not be \c NULL. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This * may be \c NULL if \p f_rng doesn't use a context. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief Read and process the second round message * (TLS: contents of the Client/ServerKeyExchange). * * \param ctx The ECJPAKE context to use. This must be initialized * and set up and already have performed round one. * \param buf The buffer holding the second round message. This must * be a readable buffer of length \p len Bytes. * \param len The length in Bytes of \p buf. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx, const unsigned char *buf, size_t len ); /** * \brief Derive the shared secret * (TLS: Pre-Master Secret). * * \param ctx The ECJPAKE context to use. This must be initialized, * set up and have performed both round one and two. * \param buf The buffer to write the derived secret to. This must * be a writable buffer of length \p len Bytes. * \param len The length of \p buf in Bytes. * \param olen The address at which to store the total number of Bytes * written to \p buf. This must not be \c NULL. * \param f_rng The RNG function to use. This must not be \c NULL. * \param p_rng The RNG parameter to be passed to \p f_rng. This * may be \c NULL if \p f_rng doesn't use a context. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); /** * \brief This clears an ECJPAKE context and frees any * embedded data structure. * * \param ctx The ECJPAKE context to free. This may be \c NULL, * in which case this function does nothing. If it is not * \c NULL, it must point to an initialized ECJPAKE context. */ void mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx ); #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * \return 0 if successful, or 1 if a test failed */ int mbedtls_ecjpake_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* ecjpake.h */ fldigi-4.2.05/src/include/mbedtls/chachapoly.h0000664000175000017500000003774714611711171016135 00000000000000/** * \file chachapoly.h * * \brief This file contains the AEAD-ChaCha20-Poly1305 definitions and * functions. * * ChaCha20-Poly1305 is an algorithm for Authenticated Encryption * with Associated Data (AEAD) that can be used to encrypt and * authenticate data. It is based on ChaCha20 and Poly1305 by Daniel * Bernstein and was standardized in RFC 7539. * * \author Daniel King */ /* Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved. * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CHACHAPOLY_H #define MBEDTLS_CHACHAPOLY_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif /* for shared error codes */ #include "poly1305.h" #define MBEDTLS_ERR_CHACHAPOLY_BAD_STATE -0x0054 /**< The requested operation is not permitted in the current state. */ #define MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED -0x0056 /**< Authenticated decryption failed: data was not authentic. */ #ifdef __cplusplus extern "C" { #endif typedef enum { MBEDTLS_CHACHAPOLY_ENCRYPT, /**< The mode value for performing encryption. */ MBEDTLS_CHACHAPOLY_DECRYPT /**< The mode value for performing decryption. */ } mbedtls_chachapoly_mode_t; #if !defined(MBEDTLS_CHACHAPOLY_ALT) #include "chacha20.h" typedef struct mbedtls_chachapoly_context { mbedtls_chacha20_context chacha20_ctx; /**< The ChaCha20 context. */ mbedtls_poly1305_context poly1305_ctx; /**< The Poly1305 context. */ uint64_t aad_len; /**< The length (bytes) of the Additional Authenticated Data. */ uint64_t ciphertext_len; /**< The length (bytes) of the ciphertext. */ int state; /**< The current state of the context. */ mbedtls_chachapoly_mode_t mode; /**< Cipher mode (encrypt or decrypt). */ } mbedtls_chachapoly_context; #else /* !MBEDTLS_CHACHAPOLY_ALT */ #include "chachapoly_alt.h" #endif /* !MBEDTLS_CHACHAPOLY_ALT */ /** * \brief This function initializes the specified ChaCha20-Poly1305 context. * * It must be the first API called before using * the context. It must be followed by a call to * \c mbedtls_chachapoly_setkey() before any operation can be * done, and to \c mbedtls_chachapoly_free() once all * operations with that context have been finished. * * In order to encrypt or decrypt full messages at once, for * each message you should make a single call to * \c mbedtls_chachapoly_crypt_and_tag() or * \c mbedtls_chachapoly_auth_decrypt(). * * In order to encrypt messages piecewise, for each * message you should make a call to * \c mbedtls_chachapoly_starts(), then 0 or more calls to * \c mbedtls_chachapoly_update_aad(), then 0 or more calls to * \c mbedtls_chachapoly_update(), then one call to * \c mbedtls_chachapoly_finish(). * * \warning Decryption with the piecewise API is discouraged! Always * use \c mbedtls_chachapoly_auth_decrypt() when possible! * * If however this is not possible because the data is too * large to fit in memory, you need to: * * - call \c mbedtls_chachapoly_starts() and (if needed) * \c mbedtls_chachapoly_update_aad() as above, * - call \c mbedtls_chachapoly_update() multiple times and * ensure its output (the plaintext) is NOT used in any other * way than placing it in temporary storage at this point, * - call \c mbedtls_chachapoly_finish() to compute the * authentication tag and compared it in constant time to the * tag received with the ciphertext. * * If the tags are not equal, you must immediately discard * all previous outputs of \c mbedtls_chachapoly_update(), * otherwise you can now safely use the plaintext. * * \param ctx The ChachaPoly context to initialize. Must not be \c NULL. */ void mbedtls_chachapoly_init( mbedtls_chachapoly_context *ctx ); /** * \brief This function releases and clears the specified * ChaCha20-Poly1305 context. * * \param ctx The ChachaPoly context to clear. This may be \c NULL, in which * case this function is a no-op. */ void mbedtls_chachapoly_free( mbedtls_chachapoly_context *ctx ); /** * \brief This function sets the ChaCha20-Poly1305 * symmetric encryption key. * * \param ctx The ChaCha20-Poly1305 context to which the key should be * bound. This must be initialized. * \param key The \c 256 Bit (\c 32 Bytes) key. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chachapoly_setkey( mbedtls_chachapoly_context *ctx, const unsigned char key[32] ); /** * \brief This function starts a ChaCha20-Poly1305 encryption or * decryption operation. * * \warning You must never use the same nonce twice with the same key. * This would void any confidentiality and authenticity * guarantees for the messages encrypted with the same nonce * and key. * * \note If the context is being used for AAD only (no data to * encrypt or decrypt) then \p mode can be set to any value. * * \warning Decryption with the piecewise API is discouraged, see the * warning on \c mbedtls_chachapoly_init(). * * \param ctx The ChaCha20-Poly1305 context. This must be initialized * and bound to a key. * \param nonce The nonce/IV to use for the message. * This must be a redable buffer of length \c 12 Bytes. * \param mode The operation to perform: #MBEDTLS_CHACHAPOLY_ENCRYPT or * #MBEDTLS_CHACHAPOLY_DECRYPT (discouraged, see warning). * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chachapoly_starts( mbedtls_chachapoly_context *ctx, const unsigned char nonce[12], mbedtls_chachapoly_mode_t mode ); /** * \brief This function feeds additional data to be authenticated * into an ongoing ChaCha20-Poly1305 operation. * * The Additional Authenticated Data (AAD), also called * Associated Data (AD) is only authenticated but not * encrypted nor included in the encrypted output. It is * usually transmitted separately from the ciphertext or * computed locally by each party. * * \note This function is called before data is encrypted/decrypted. * I.e. call this function to process the AAD before calling * \c mbedtls_chachapoly_update(). * * You may call this function multiple times to process * an arbitrary amount of AAD. It is permitted to call * this function 0 times, if no AAD is used. * * This function cannot be called any more if data has * been processed by \c mbedtls_chachapoly_update(), * or if the context has been finished. * * \warning Decryption with the piecewise API is discouraged, see the * warning on \c mbedtls_chachapoly_init(). * * \param ctx The ChaCha20-Poly1305 context. This must be initialized * and bound to a key. * \param aad_len The length in Bytes of the AAD. The length has no * restrictions. * \param aad Buffer containing the AAD. * This pointer can be \c NULL if `aad_len == 0`. * * \return \c 0 on success. * \return #MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA * if \p ctx or \p aad are NULL. * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE * if the operations has not been started or has been * finished, or if the AAD has been finished. */ int mbedtls_chachapoly_update_aad( mbedtls_chachapoly_context *ctx, const unsigned char *aad, size_t aad_len ); /** * \brief Thus function feeds data to be encrypted or decrypted * into an on-going ChaCha20-Poly1305 * operation. * * The direction (encryption or decryption) depends on the * mode that was given when calling * \c mbedtls_chachapoly_starts(). * * You may call this function multiple times to process * an arbitrary amount of data. It is permitted to call * this function 0 times, if no data is to be encrypted * or decrypted. * * \warning Decryption with the piecewise API is discouraged, see the * warning on \c mbedtls_chachapoly_init(). * * \param ctx The ChaCha20-Poly1305 context to use. This must be initialized. * \param len The length (in bytes) of the data to encrypt or decrypt. * \param input The buffer containing the data to encrypt or decrypt. * This pointer can be \c NULL if `len == 0`. * \param output The buffer to where the encrypted or decrypted data is * written. This must be able to hold \p len bytes. * This pointer can be \c NULL if `len == 0`. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE * if the operation has not been started or has been * finished. * \return Another negative error code on other kinds of failure. */ int mbedtls_chachapoly_update( mbedtls_chachapoly_context *ctx, size_t len, const unsigned char *input, unsigned char *output ); /** * \brief This function finished the ChaCha20-Poly1305 operation and * generates the MAC (authentication tag). * * \param ctx The ChaCha20-Poly1305 context to use. This must be initialized. * \param mac The buffer to where the 128-bit (16 bytes) MAC is written. * * \warning Decryption with the piecewise API is discouraged, see the * warning on \c mbedtls_chachapoly_init(). * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE * if the operation has not been started or has been * finished. * \return Another negative error code on other kinds of failure. */ int mbedtls_chachapoly_finish( mbedtls_chachapoly_context *ctx, unsigned char mac[16] ); /** * \brief This function performs a complete ChaCha20-Poly1305 * authenticated encryption with the previously-set key. * * \note Before using this function, you must set the key with * \c mbedtls_chachapoly_setkey(). * * \warning You must never use the same nonce twice with the same key. * This would void any confidentiality and authenticity * guarantees for the messages encrypted with the same nonce * and key. * * \param ctx The ChaCha20-Poly1305 context to use (holds the key). * This must be initialized. * \param length The length (in bytes) of the data to encrypt or decrypt. * \param nonce The 96-bit (12 bytes) nonce/IV to use. * \param aad The buffer containing the additional authenticated * data (AAD). This pointer can be \c NULL if `aad_len == 0`. * \param aad_len The length (in bytes) of the AAD data to process. * \param input The buffer containing the data to encrypt or decrypt. * This pointer can be \c NULL if `ilen == 0`. * \param output The buffer to where the encrypted or decrypted data * is written. This pointer can be \c NULL if `ilen == 0`. * \param tag The buffer to where the computed 128-bit (16 bytes) MAC * is written. This must not be \c NULL. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_chachapoly_encrypt_and_tag( mbedtls_chachapoly_context *ctx, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char *input, unsigned char *output, unsigned char tag[16] ); /** * \brief This function performs a complete ChaCha20-Poly1305 * authenticated decryption with the previously-set key. * * \note Before using this function, you must set the key with * \c mbedtls_chachapoly_setkey(). * * \param ctx The ChaCha20-Poly1305 context to use (holds the key). * \param length The length (in Bytes) of the data to decrypt. * \param nonce The \c 96 Bit (\c 12 bytes) nonce/IV to use. * \param aad The buffer containing the additional authenticated data (AAD). * This pointer can be \c NULL if `aad_len == 0`. * \param aad_len The length (in bytes) of the AAD data to process. * \param tag The buffer holding the authentication tag. * This must be a readable buffer of length \c 16 Bytes. * \param input The buffer containing the data to decrypt. * This pointer can be \c NULL if `ilen == 0`. * \param output The buffer to where the decrypted data is written. * This pointer can be \c NULL if `ilen == 0`. * * \return \c 0 on success. * \return #MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED * if the data was not authentic. * \return Another negative error code on other kinds of failure. */ int mbedtls_chachapoly_auth_decrypt( mbedtls_chachapoly_context *ctx, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char tag[16], const unsigned char *input, unsigned char *output ); #if defined(MBEDTLS_SELF_TEST) /** * \brief The ChaCha20-Poly1305 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_chachapoly_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* MBEDTLS_CHACHAPOLY_H */ fldigi-4.2.05/src/include/mbedtls/md.h0000664000175000017500000004343514611711171014411 00000000000000 /** * \file md.h * * \brief This file contains the generic message-digest wrapper. * * \author Adriaan de Jong */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_MD_H #define MBEDTLS_MD_H #include #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */ #define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */ #define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */ /* MBEDTLS_ERR_MD_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_MD_HW_ACCEL_FAILED -0x5280 /**< MD hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif /** * \brief Supported message digests. * * \warning MD2, MD4, MD5 and SHA-1 are considered weak message digests and * their use constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef enum { MBEDTLS_MD_NONE=0, /**< None. */ MBEDTLS_MD_MD2, /**< The MD2 message digest. */ MBEDTLS_MD_MD4, /**< The MD4 message digest. */ MBEDTLS_MD_MD5, /**< The MD5 message digest. */ MBEDTLS_MD_SHA1, /**< The SHA-1 message digest. */ MBEDTLS_MD_SHA224, /**< The SHA-224 message digest. */ MBEDTLS_MD_SHA256, /**< The SHA-256 message digest. */ MBEDTLS_MD_SHA384, /**< The SHA-384 message digest. */ MBEDTLS_MD_SHA512, /**< The SHA-512 message digest. */ MBEDTLS_MD_RIPEMD160, /**< The RIPEMD-160 message digest. */ } mbedtls_md_type_t; #if defined(MBEDTLS_SHA512_C) #define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ #else #define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ #endif /** * Opaque struct defined in md_internal.h. */ typedef struct mbedtls_md_info_t mbedtls_md_info_t; /** * The generic message-digest context. */ typedef struct mbedtls_md_context_t { /** Information about the associated message digest. */ const mbedtls_md_info_t *md_info; /** The digest-specific context. */ void *md_ctx; /** The HMAC part of the context. */ void *hmac_ctx; } mbedtls_md_context_t; /** * \brief This function returns the list of digests supported by the * generic digest module. * * \return A statically allocated array of digests. Each element * in the returned list is an integer belonging to the * message-digest enumeration #mbedtls_md_type_t. * The last entry is 0. */ const int *mbedtls_md_list( void ); /** * \brief This function returns the message-digest information * associated with the given digest name. * * \param md_name The name of the digest to search for. * * \return The message-digest information associated with \p md_name. * \return NULL if the associated message-digest information is not found. */ const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ); /** * \brief This function returns the message-digest information * associated with the given digest type. * * \param md_type The type of digest to search for. * * \return The message-digest information associated with \p md_type. * \return NULL if the associated message-digest information is not found. */ const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ); /** * \brief This function initializes a message-digest context without * binding it to a particular message-digest algorithm. * * This function should always be called first. It prepares the * context for mbedtls_md_setup() for binding it to a * message-digest algorithm. */ void mbedtls_md_init( mbedtls_md_context_t *ctx ); /** * \brief This function clears the internal structure of \p ctx and * frees any embedded internal structure, but does not free * \p ctx itself. * * If you have called mbedtls_md_setup() on \p ctx, you must * call mbedtls_md_free() when you are no longer using the * context. * Calling this function if you have previously * called mbedtls_md_init() and nothing else is optional. * You must not call this function if you have not called * mbedtls_md_init(). */ void mbedtls_md_free( mbedtls_md_context_t *ctx ); #if ! defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function selects the message digest algorithm to use, * and allocates internal structures. * * It should be called after mbedtls_md_init() or mbedtls_md_free(). * Makes it necessary to call mbedtls_md_free() later. * * \deprecated Superseded by mbedtls_md_setup() in 2.0.0 * * \param ctx The context to set up. * \param md_info The information structure of the message-digest algorithm * to use. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. */ int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED; #undef MBEDTLS_DEPRECATED #endif /* MBEDTLS_DEPRECATED_REMOVED */ /** * \brief This function selects the message digest algorithm to use, * and allocates internal structures. * * It should be called after mbedtls_md_init() or * mbedtls_md_free(). Makes it necessary to call * mbedtls_md_free() later. * * \param ctx The context to set up. * \param md_info The information structure of the message-digest algorithm * to use. * \param hmac Defines if HMAC is used. 0: HMAC is not used (saves some memory), * or non-zero: HMAC is used with this context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. * \return #MBEDTLS_ERR_MD_ALLOC_FAILED on memory-allocation failure. */ int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ); /** * \brief This function clones the state of an message-digest * context. * * \note You must call mbedtls_md_setup() on \c dst before calling * this function. * * \note The two contexts must have the same type, * for example, both are SHA-256. * * \warning This function clones the message-digest state, not the * HMAC state. * * \param dst The destination context. * \param src The context to be cloned. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification failure. */ int mbedtls_md_clone( mbedtls_md_context_t *dst, const mbedtls_md_context_t *src ); /** * \brief This function extracts the message-digest size from the * message-digest information structure. * * \param md_info The information structure of the message-digest algorithm * to use. * * \return The size of the message-digest output in Bytes. */ unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ); /** * \brief This function extracts the message-digest type from the * message-digest information structure. * * \param md_info The information structure of the message-digest algorithm * to use. * * \return The type of the message digest. */ mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ); /** * \brief This function extracts the message-digest name from the * message-digest information structure. * * \param md_info The information structure of the message-digest algorithm * to use. * * \return The name of the message digest. */ const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ); /** * \brief This function starts a message-digest computation. * * You must call this function after setting up the context * with mbedtls_md_setup(), and before passing data with * mbedtls_md_update(). * * \param ctx The generic message-digest context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_starts( mbedtls_md_context_t *ctx ); /** * \brief This function feeds an input buffer into an ongoing * message-digest computation. * * You must call mbedtls_md_starts() before calling this * function. You may call this function multiple times. * Afterwards, call mbedtls_md_finish(). * * \param ctx The generic message-digest context. * \param input The buffer holding the input data. * \param ilen The length of the input data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the digest operation, * and writes the result to the output buffer. * * Call this function after a call to mbedtls_md_starts(), * followed by any number of calls to mbedtls_md_update(). * Afterwards, you may either clear the context with * mbedtls_md_free(), or call mbedtls_md_starts() to reuse * the context for another digest operation with the same * algorithm. * * \param ctx The generic message-digest context. * \param output The buffer for the generic message-digest checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ); /** * \brief This function calculates the message-digest of a buffer, * with respect to a configurable message-digest algorithm * in a single call. * * The result is calculated as * Output = message_digest(input buffer). * * \param md_info The information structure of the message-digest algorithm * to use. * \param input The buffer holding the data. * \param ilen The length of the input data. * \param output The generic message-digest checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, unsigned char *output ); #if defined(MBEDTLS_FS_IO) /** * \brief This function calculates the message-digest checksum * result of the contents of the provided file. * * The result is calculated as * Output = message_digest(file contents). * * \param md_info The information structure of the message-digest algorithm * to use. * \param path The input file name. * \param output The generic message-digest checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_FILE_IO_ERROR on an I/O error accessing * the file pointed by \p path. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA if \p md_info was NULL. */ int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigned char *output ); #endif /* MBEDTLS_FS_IO */ /** * \brief This function sets the HMAC key and prepares to * authenticate a new message. * * Call this function after mbedtls_md_setup(), to use * the MD context for an HMAC calculation, then call * mbedtls_md_hmac_update() to provide the input data, and * mbedtls_md_hmac_finish() to get the HMAC value. * * \param ctx The message digest context containing an embedded HMAC * context. * \param key The HMAC secret key. * \param keylen The length of the HMAC key in Bytes. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen ); /** * \brief This function feeds an input buffer into an ongoing HMAC * computation. * * Call mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() * before calling this function. * You may call this function multiple times to pass the * input piecewise. * Afterwards, call mbedtls_md_hmac_finish(). * * \param ctx The message digest context containing an embedded HMAC * context. * \param input The buffer holding the input data. * \param ilen The length of the input data. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the HMAC operation, and writes * the result to the output buffer. * * Call this function after mbedtls_md_hmac_starts() and * mbedtls_md_hmac_update() to get the HMAC value. Afterwards * you may either call mbedtls_md_free() to clear the context, * or call mbedtls_md_hmac_reset() to reuse the context with * the same HMAC key. * * \param ctx The message digest context containing an embedded HMAC * context. * \param output The generic HMAC checksum result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output); /** * \brief This function prepares to authenticate a new message with * the same key as the previous HMAC operation. * * You may call this function after mbedtls_md_hmac_finish(). * Afterwards call mbedtls_md_hmac_update() to pass the new * input. * * \param ctx The message digest context containing an embedded HMAC * context. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ); /** * \brief This function calculates the full generic HMAC * on the input buffer with the provided key. * * The function allocates the context, performs the * calculation, and frees the context. * * The HMAC result is calculated as * output = generic HMAC(hmac key, input buffer). * * \param md_info The information structure of the message-digest algorithm * to use. * \param key The HMAC secret key. * \param keylen The length of the HMAC secret key in Bytes. * \param input The buffer holding the input data. * \param ilen The length of the input data. * \param output The generic HMAC result. * * \return \c 0 on success. * \return #MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter-verification * failure. */ int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char *output ); /* Internal use */ int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ); #ifdef __cplusplus } #endif #endif /* MBEDTLS_MD_H */ fldigi-4.2.05/src/include/mbedtls/aria.h0000664000175000017500000004013714611711171014721 00000000000000/** * \file aria.h * * \brief ARIA block cipher * * The ARIA algorithm is a symmetric block cipher that can encrypt and * decrypt information. It is defined by the Korean Agency for * Technology and Standards (KATS) in KS X 1213:2004 (in * Korean, but see http://210.104.33.10/ARIA/index-e.html in English) * and also described by the IETF in RFC 5794. */ /* Copyright (C) 2006-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ARIA_H #define MBEDTLS_ARIA_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #include "platform_util.h" #define MBEDTLS_ARIA_ENCRYPT 1 /**< ARIA encryption. */ #define MBEDTLS_ARIA_DECRYPT 0 /**< ARIA decryption. */ #define MBEDTLS_ARIA_BLOCKSIZE 16 /**< ARIA block size in bytes. */ #define MBEDTLS_ARIA_MAX_ROUNDS 16 /**< Maxiumum number of rounds in ARIA. */ #define MBEDTLS_ARIA_MAX_KEYSIZE 32 /**< Maximum size of an ARIA key in bytes. */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) #define MBEDTLS_ERR_ARIA_INVALID_KEY_LENGTH MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( -0x005C ) #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #define MBEDTLS_ERR_ARIA_BAD_INPUT_DATA -0x005C /**< Bad input data. */ #define MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH -0x005E /**< Invalid data input length. */ /* MBEDTLS_ERR_ARIA_FEATURE_UNAVAILABLE is deprecated and should not be used. */ #define MBEDTLS_ERR_ARIA_FEATURE_UNAVAILABLE -0x005A /**< Feature not available. For example, an unsupported ARIA key size. */ /* MBEDTLS_ERR_ARIA_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_ARIA_HW_ACCEL_FAILED -0x0058 /**< ARIA hardware accelerator failed. */ #if !defined(MBEDTLS_ARIA_ALT) // Regular implementation // #ifdef __cplusplus extern "C" { #endif /** * \brief The ARIA context-type definition. */ typedef struct mbedtls_aria_context { unsigned char nr; /*!< The number of rounds (12, 14 or 16) */ /*! The ARIA round keys. */ uint32_t rk[MBEDTLS_ARIA_MAX_ROUNDS + 1][MBEDTLS_ARIA_BLOCKSIZE / 4]; } mbedtls_aria_context; #else /* MBEDTLS_ARIA_ALT */ #include "aria_alt.h" #endif /* MBEDTLS_ARIA_ALT */ /** * \brief This function initializes the specified ARIA context. * * It must be the first API called before using * the context. * * \param ctx The ARIA context to initialize. This must not be \c NULL. */ void mbedtls_aria_init( mbedtls_aria_context *ctx ); /** * \brief This function releases and clears the specified ARIA context. * * \param ctx The ARIA context to clear. This may be \c NULL, in which * case this function returns immediately. If it is not \c NULL, * it must point to an initialized ARIA context. */ void mbedtls_aria_free( mbedtls_aria_context *ctx ); /** * \brief This function sets the encryption key. * * \param ctx The ARIA context to which the key should be bound. * This must be initialized. * \param key The encryption key. This must be a readable buffer * of size \p keybits Bits. * \param keybits The size of \p key in Bits. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief This function sets the decryption key. * * \param ctx The ARIA context to which the key should be bound. * This must be initialized. * \param key The decryption key. This must be a readable buffer * of size \p keybits Bits. * \param keybits The size of data passed. Valid options are: *
  • 128 bits
  • *
  • 192 bits
  • *
  • 256 bits
* * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief This function performs an ARIA single-block encryption or * decryption operation. * * It performs encryption or decryption (depending on whether * the key was set for encryption on decryption) on the input * data buffer defined in the \p input parameter. * * mbedtls_aria_init(), and either mbedtls_aria_setkey_enc() or * mbedtls_aria_setkey_dec() must be called before the first * call to this API with the same context. * * \param ctx The ARIA context to use for encryption or decryption. * This must be initialized and bound to a key. * \param input The 16-Byte buffer holding the input data. * \param output The 16-Byte buffer holding the output data. * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx, const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE], unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief This function performs an ARIA-CBC encryption or decryption operation * on full blocks. * * It performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer defined in * the \p input parameter. * * It can be called as many times as needed, until all the input * data is processed. mbedtls_aria_init(), and either * mbedtls_aria_setkey_enc() or mbedtls_aria_setkey_dec() must be called * before the first call to this API with the same context. * * \note This function operates on aligned blocks, that is, the input size * must be a multiple of the ARIA block size of 16 Bytes. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the IV, you should * either save it manually or use the cipher module instead. * * * \param ctx The ARIA context to use for encryption or decryption. * This must be initialized and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_ARIA_ENCRYPT for encryption, or * #MBEDTLS_ARIA_DECRYPT for decryption. * \param length The length of the input data in Bytes. This must be a * multiple of the block size (16 Bytes). * \param iv Initialization vector (updated after use). * This must be a readable buffer of size 16 Bytes. * \param input The buffer holding the input data. This must * be a readable buffer of length \p length Bytes. * \param output The buffer holding the output data. This must * be a writable buffer of length \p length Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx, int mode, size_t length, unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /** * \brief This function performs an ARIA-CFB128 encryption or decryption * operation. * * It performs the operation defined in the \p mode * parameter (encrypt or decrypt), on the input data buffer * defined in the \p input parameter. * * For CFB, you must set up the context with mbedtls_aria_setkey_enc(), * regardless of whether you are performing an encryption or decryption * operation, that is, regardless of the \p mode parameter. This is * because CFB mode uses the same key schedule for encryption and * decryption. * * \note Upon exit, the content of the IV is updated so that you can * call the same function again on the next * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If you need to retain the contents of the * IV, you must either save it manually or use the cipher * module instead. * * * \param ctx The ARIA context to use for encryption or decryption. * This must be initialized and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_ARIA_ENCRYPT for encryption, or * #MBEDTLS_ARIA_DECRYPT for decryption. * \param length The length of the input data \p input in Bytes. * \param iv_off The offset in IV (updated after use). * This must not be larger than 15. * \param iv The initialization vector (updated after use). * This must be a readable buffer of size 16 Bytes. * \param input The buffer holding the input data. This must * be a readable buffer of length \p length Bytes. * \param output The buffer holding the output data. This must * be a writable buffer of length \p length Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /** * \brief This function performs an ARIA-CTR encryption or decryption * operation. * * This function performs the operation defined in the \p mode * parameter (encrypt/decrypt), on the input data buffer * defined in the \p input parameter. * * Due to the nature of CTR, you must use the same key schedule * for both encryption and decryption operations. Therefore, you * must use the context initialized with mbedtls_aria_setkey_enc() * for both #MBEDTLS_ARIA_ENCRYPT and #MBEDTLS_ARIA_DECRYPT. * * \warning You must never reuse a nonce value with the same key. Doing so * would void the encryption for the two messages encrypted with * the same nonce and key. * * There are two common strategies for managing nonces with CTR: * * 1. You can handle everything as a single message processed over * successive calls to this function. In that case, you want to * set \p nonce_counter and \p nc_off to 0 for the first call, and * then preserve the values of \p nonce_counter, \p nc_off and \p * stream_block across calls to this function as they will be * updated by this function. * * With this strategy, you must not encrypt more than 2**128 * blocks of data with the same key. * * 2. You can encrypt separate messages by dividing the \p * nonce_counter buffer in two areas: the first one used for a * per-message nonce, handled by yourself, and the second one * updated by this function internally. * * For example, you might reserve the first 12 bytes for the * per-message nonce, and the last 4 bytes for internal use. In that * case, before calling this function on a new message you need to * set the first 12 bytes of \p nonce_counter to your chosen nonce * value, the last 4 to 0, and \p nc_off to 0 (which will cause \p * stream_block to be ignored). That way, you can encrypt at most * 2**96 messages of up to 2**32 blocks each with the same key. * * The per-message nonce (or information sufficient to reconstruct * it) needs to be communicated with the ciphertext and must be unique. * The recommended way to ensure uniqueness is to use a message * counter. An alternative is to generate random nonces, but this * limits the number of messages that can be securely encrypted: * for example, with 96-bit random nonces, you should not encrypt * more than 2**32 messages with the same key. * * Note that for both stategies, sizes are measured in blocks and * that an ARIA block is 16 bytes. * * \warning Upon return, \p stream_block contains sensitive data. Its * content must not be written to insecure storage and should be * securely discarded as soon as it's no longer needed. * * \param ctx The ARIA context to use for encryption or decryption. * This must be initialized and bound to a key. * \param length The length of the input data \p input in Bytes. * \param nc_off The offset in Bytes in the current \p stream_block, * for resuming within the current cipher stream. The * offset pointer should be \c 0 at the start of a * stream. This must not be larger than \c 15 Bytes. * \param nonce_counter The 128-bit nonce and counter. This must point to * a read/write buffer of length \c 16 bytes. * \param stream_block The saved stream block for resuming. This must * point to a read/write buffer of length \c 16 bytes. * This is overwritten by the function. * \param input The buffer holding the input data. This must * be a readable buffer of length \p length Bytes. * \param output The buffer holding the output data. This must * be a writable buffer of length \p length Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE], unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine. * * \return \c 0 on success, or \c 1 on failure. */ int mbedtls_aria_self_test( int verbose ); #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* aria.h */ fldigi-4.2.05/src/include/mbedtls/ssl_cache.h0000664000175000017500000001040714611711171015726 00000000000000/** * \file ssl_cache.h * * \brief SSL session cache implementation */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SSL_CACHE_H #define MBEDTLS_SSL_CACHE_H #include "ssl.h" #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT) #define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /*!< 1 day */ #endif #if !defined(MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES) #define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /*!< Maximum entries in cache */ #endif /* \} name SECTION: Module settings */ #ifdef __cplusplus extern "C" { #endif typedef struct mbedtls_ssl_cache_context mbedtls_ssl_cache_context; typedef struct mbedtls_ssl_cache_entry mbedtls_ssl_cache_entry; /** * \brief This structure is used for storing cache entries */ struct mbedtls_ssl_cache_entry { #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t timestamp; /*!< entry timestamp */ #endif mbedtls_ssl_session session; /*!< entry session */ #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_x509_buf peer_cert; /*!< entry peer_cert */ #endif mbedtls_ssl_cache_entry *next; /*!< chain pointer */ }; /** * \brief Cache context */ struct mbedtls_ssl_cache_context { mbedtls_ssl_cache_entry *chain; /*!< start of the chain */ int timeout; /*!< cache entry timeout */ int max_entries; /*!< maximum entries */ #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; /*!< mutex */ #endif }; /** * \brief Initialize an SSL cache context * * \param cache SSL cache context */ void mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache ); /** * \brief Cache get callback implementation * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param data SSL cache context * \param session session to retrieve entry for */ int mbedtls_ssl_cache_get( void *data, mbedtls_ssl_session *session ); /** * \brief Cache set callback implementation * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param data SSL cache context * \param session session to store entry for */ int mbedtls_ssl_cache_set( void *data, const mbedtls_ssl_session *session ); #if defined(MBEDTLS_HAVE_TIME) /** * \brief Set the cache timeout * (Default: MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT (1 day)) * * A timeout of 0 indicates no timeout. * * \param cache SSL cache context * \param timeout cache entry timeout in seconds */ void mbedtls_ssl_cache_set_timeout( mbedtls_ssl_cache_context *cache, int timeout ); #endif /* MBEDTLS_HAVE_TIME */ /** * \brief Set the maximum number of cache entries * (Default: MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES (50)) * * \param cache SSL cache context * \param max cache entry maximum */ void mbedtls_ssl_cache_set_max_entries( mbedtls_ssl_cache_context *cache, int max ); /** * \brief Free referenced items in a cache context and clear memory * * \param cache SSL cache context */ void mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache ); #ifdef __cplusplus } #endif #endif /* ssl_cache.h */ fldigi-4.2.05/src/include/mbedtls/md2.h0000664000175000017500000002226614611711171014472 00000000000000/** * \file md2.h * * \brief MD2 message digest algorithm (hash function) * * \warning MD2 is considered a weak message digest and its use constitutes a * security risk. We recommend considering stronger message digests * instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_MD2_H #define MBEDTLS_MD2_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include /* MBEDTLS_ERR_MD2_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_MD2_HW_ACCEL_FAILED -0x002B /**< MD2 hardware accelerator failed */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_MD2_ALT) // Regular implementation // /** * \brief MD2 context structure * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef struct mbedtls_md2_context { unsigned char cksum[16]; /*!< checksum of the data block */ unsigned char state[48]; /*!< intermediate digest state */ unsigned char buffer[16]; /*!< data block being processed */ size_t left; /*!< amount of data in buffer */ } mbedtls_md2_context; #else /* MBEDTLS_MD2_ALT */ #include "md2_alt.h" #endif /* MBEDTLS_MD2_ALT */ /** * \brief Initialize MD2 context * * \param ctx MD2 context to be initialized * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md2_init( mbedtls_md2_context *ctx ); /** * \brief Clear MD2 context * * \param ctx MD2 context to be cleared * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md2_free( mbedtls_md2_context *ctx ); /** * \brief Clone (the state of) an MD2 context * * \param dst The destination context * \param src The context to be cloned * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md2_clone( mbedtls_md2_context *dst, const mbedtls_md2_context *src ); /** * \brief MD2 context setup * * \param ctx context to be initialized * * \return 0 if successful * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_starts_ret( mbedtls_md2_context *ctx ); /** * \brief MD2 process buffer * * \param ctx MD2 context * \param input buffer holding the data * \param ilen length of the input data * * \return 0 if successful * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_update_ret( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD2 final digest * * \param ctx MD2 context * \param output MD2 checksum result * * \return 0 if successful * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx, unsigned char output[16] ); /** * \brief MD2 process data block (internal use only) * * \param ctx MD2 context * * \return 0 if successful * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_internal_md2_process( mbedtls_md2_context *ctx ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief MD2 context setup * * \deprecated Superseded by mbedtls_md2_starts_ret() in 2.7.0 * * \param ctx context to be initialized * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2_starts( mbedtls_md2_context *ctx ); /** * \brief MD2 process buffer * * \deprecated Superseded by mbedtls_md2_update_ret() in 2.7.0 * * \param ctx MD2 context * \param input buffer holding the data * \param ilen length of the input data * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD2 final digest * * \deprecated Superseded by mbedtls_md2_finish_ret() in 2.7.0 * * \param ctx MD2 context * \param output MD2 checksum result * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] ); /** * \brief MD2 process data block (internal use only) * * \deprecated Superseded by mbedtls_internal_md2_process() in 2.7.0 * * \param ctx MD2 context * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2_process( mbedtls_md2_context *ctx ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Output = MD2( input buffer ) * * \param input buffer holding the data * \param ilen length of the input data * \param output MD2 checksum result * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Output = MD2( input buffer ) * * \deprecated Superseded by mbedtls_md2_ret() in 2.7.0 * * \param input buffer holding the data * \param ilen length of the input data * \param output MD2 checksum result * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed * * \warning MD2 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md2_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_md2.h */ fldigi-4.2.05/src/include/mbedtls/md4.h0000664000175000017500000002263514611711171014474 00000000000000/** * \file md4.h * * \brief MD4 message digest algorithm (hash function) * * \warning MD4 is considered a weak message digest and its use constitutes a * security risk. We recommend considering stronger message digests * instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_MD4_H #define MBEDTLS_MD4_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_MD4_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_MD4_HW_ACCEL_FAILED -0x002D /**< MD4 hardware accelerator failed */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_MD4_ALT) // Regular implementation // /** * \brief MD4 context structure * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef struct mbedtls_md4_context { uint32_t total[2]; /*!< number of bytes processed */ uint32_t state[4]; /*!< intermediate digest state */ unsigned char buffer[64]; /*!< data block being processed */ } mbedtls_md4_context; #else /* MBEDTLS_MD4_ALT */ #include "md4_alt.h" #endif /* MBEDTLS_MD4_ALT */ /** * \brief Initialize MD4 context * * \param ctx MD4 context to be initialized * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md4_init( mbedtls_md4_context *ctx ); /** * \brief Clear MD4 context * * \param ctx MD4 context to be cleared * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md4_free( mbedtls_md4_context *ctx ); /** * \brief Clone (the state of) an MD4 context * * \param dst The destination context * \param src The context to be cloned * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ void mbedtls_md4_clone( mbedtls_md4_context *dst, const mbedtls_md4_context *src ); /** * \brief MD4 context setup * * \param ctx context to be initialized * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. */ int mbedtls_md4_starts_ret( mbedtls_md4_context *ctx ); /** * \brief MD4 process buffer * * \param ctx MD4 context * \param input buffer holding the data * \param ilen length of the input data * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md4_update_ret( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD4 final digest * * \param ctx MD4 context * \param output MD4 checksum result * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md4_finish_ret( mbedtls_md4_context *ctx, unsigned char output[16] ); /** * \brief MD4 process data block (internal use only) * * \param ctx MD4 context * \param data buffer holding one block of data * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_internal_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief MD4 context setup * * \deprecated Superseded by mbedtls_md4_starts_ret() in 2.7.0 * * \param ctx context to be initialized * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4_starts( mbedtls_md4_context *ctx ); /** * \brief MD4 process buffer * * \deprecated Superseded by mbedtls_md4_update_ret() in 2.7.0 * * \param ctx MD4 context * \param input buffer holding the data * \param ilen length of the input data * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief MD4 final digest * * \deprecated Superseded by mbedtls_md4_finish_ret() in 2.7.0 * * \param ctx MD4 context * \param output MD4 checksum result * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] ); /** * \brief MD4 process data block (internal use only) * * \deprecated Superseded by mbedtls_internal_md4_process() in 2.7.0 * * \param ctx MD4 context * \param data buffer holding one block of data * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Output = MD4( input buffer ) * * \param input buffer holding the data * \param ilen length of the input data * \param output MD4 checksum result * * \return 0 if successful * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md4_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief Output = MD4( input buffer ) * * \deprecated Superseded by mbedtls_md4_ret() in 2.7.0 * * \param input buffer holding the data * \param ilen length of the input data * \param output MD4 checksum result * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ MBEDTLS_DEPRECATED void mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed * * \warning MD4 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ int mbedtls_md4_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_md4.h */ fldigi-4.2.05/src/include/mbedtls/pkcs12.h0000664000175000017500000001220614611711171015104 00000000000000/** * \file pkcs12.h * * \brief PKCS#12 Personal Information Exchange Syntax */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PKCS12_H #define MBEDTLS_PKCS12_H #include "md.h" #include "cipher.h" #include "asn1.h" #include #define MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA -0x1F80 /**< Bad input parameters to function. */ #define MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE -0x1F00 /**< Feature not available, e.g. unsupported encryption scheme. */ #define MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT -0x1E80 /**< PBE ASN.1 data not as expected. */ #define MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH -0x1E00 /**< Given private key password does not allow for correct decryption. */ #define MBEDTLS_PKCS12_DERIVE_KEY 1 /**< encryption/decryption key */ #define MBEDTLS_PKCS12_DERIVE_IV 2 /**< initialization vector */ #define MBEDTLS_PKCS12_DERIVE_MAC_KEY 3 /**< integrity / MAC key */ #define MBEDTLS_PKCS12_PBE_DECRYPT 0 #define MBEDTLS_PKCS12_PBE_ENCRYPT 1 #ifdef __cplusplus extern "C" { #endif #if defined(MBEDTLS_ASN1_PARSE_C) /** * \brief PKCS12 Password Based function (encryption / decryption) * for pbeWithSHAAnd128BitRC4 * * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure * \param mode either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT * \param pwd the password used (may be NULL if no password is used) * \param pwdlen length of the password (may be 0) * \param input the input data * \param len data length * \param output the output buffer * * \return 0 if successful, or a MBEDTLS_ERR_XXX code */ int mbedtls_pkcs12_pbe_sha1_rc4_128( mbedtls_asn1_buf *pbe_params, int mode, const unsigned char *pwd, size_t pwdlen, const unsigned char *input, size_t len, unsigned char *output ); /** * \brief PKCS12 Password Based function (encryption / decryption) * for cipher-based and mbedtls_md-based PBE's * * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure * \param mode either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT * \param cipher_type the cipher used * \param md_type the mbedtls_md used * \param pwd the password used (may be NULL if no password is used) * \param pwdlen length of the password (may be 0) * \param input the input data * \param len data length * \param output the output buffer * * \return 0 if successful, or a MBEDTLS_ERR_XXX code */ int mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode, mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, const unsigned char *pwd, size_t pwdlen, const unsigned char *input, size_t len, unsigned char *output ); #endif /* MBEDTLS_ASN1_PARSE_C */ /** * \brief The PKCS#12 derivation function uses a password and a salt * to produce pseudo-random bits for a particular "purpose". * * Depending on the given id, this function can produce an * encryption/decryption key, an nitialization vector or an * integrity key. * * \param data buffer to store the derived data in * \param datalen length to fill * \param pwd password to use (may be NULL if no password is used) * \param pwdlen length of the password (may be 0) * \param salt salt buffer to use * \param saltlen length of the salt * \param mbedtls_md mbedtls_md type to use during the derivation * \param id id that describes the purpose (can be MBEDTLS_PKCS12_DERIVE_KEY, * MBEDTLS_PKCS12_DERIVE_IV or MBEDTLS_PKCS12_DERIVE_MAC_KEY) * \param iterations number of iterations * * \return 0 if successful, or a MD, BIGNUM type error. */ int mbedtls_pkcs12_derivation( unsigned char *data, size_t datalen, const unsigned char *pwd, size_t pwdlen, const unsigned char *salt, size_t saltlen, mbedtls_md_type_t mbedtls_md, int id, int iterations ); #ifdef __cplusplus } #endif #endif /* pkcs12.h */ fldigi-4.2.05/src/include/mbedtls/sha1.h0000664000175000017500000003126714611711171014645 00000000000000/** * \file sha1.h * * \brief This file contains SHA-1 definitions and functions. * * The Secure Hash Algorithm 1 (SHA-1) cryptographic hash function is defined in * FIPS 180-4: Secure Hash Standard (SHS). * * \warning SHA-1 is considered a weak message digest and its use constitutes * a security risk. We recommend considering stronger message * digests instead. */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SHA1_H #define MBEDTLS_SHA1_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED -0x0035 /**< SHA-1 hardware accelerator failed */ #define MBEDTLS_ERR_SHA1_BAD_INPUT_DATA -0x0073 /**< SHA-1 input data was malformed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_SHA1_ALT) // Regular implementation // /** * \brief The SHA-1 context structure. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * */ typedef struct mbedtls_sha1_context { uint32_t total[2]; /*!< The number of Bytes processed. */ uint32_t state[5]; /*!< The intermediate digest state. */ unsigned char buffer[64]; /*!< The data block being processed. */ } mbedtls_sha1_context; #else /* MBEDTLS_SHA1_ALT */ #include "sha1_alt.h" #endif /* MBEDTLS_SHA1_ALT */ /** * \brief This function initializes a SHA-1 context. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to initialize. * This must not be \c NULL. * */ void mbedtls_sha1_init( mbedtls_sha1_context *ctx ); /** * \brief This function clears a SHA-1 context. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to clear. This may be \c NULL, * in which case this function does nothing. If it is * not \c NULL, it must point to an initialized * SHA-1 context. * */ void mbedtls_sha1_free( mbedtls_sha1_context *ctx ); /** * \brief This function clones the state of a SHA-1 context. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param dst The SHA-1 context to clone to. This must be initialized. * \param src The SHA-1 context to clone from. This must be initialized. * */ void mbedtls_sha1_clone( mbedtls_sha1_context *dst, const mbedtls_sha1_context *src ); /** * \brief This function starts a SHA-1 checksum calculation. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to initialize. This must be initialized. * * \return \c 0 on success. * \return A negative error code on failure. * */ int mbedtls_sha1_starts_ret( mbedtls_sha1_context *ctx ); /** * \brief This function feeds an input buffer into an ongoing SHA-1 * checksum calculation. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context. This must be initialized * and have a hash operation started. * \param input The buffer holding the input data. * This must be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data \p input in Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha1_update_ret( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-1 operation, and writes * the result to the output buffer. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to use. This must be initialized and * have a hash operation started. * \param output The SHA-1 checksum result. This must be a writable * buffer of length \c 20 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha1_finish_ret( mbedtls_sha1_context *ctx, unsigned char output[20] ); /** * \brief SHA-1 process data block (internal use only). * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param ctx The SHA-1 context to use. This must be initialized. * \param data The data block being processed. This must be a * readable buffer of length \c 64 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. * */ int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function starts a SHA-1 checksum calculation. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_sha1_starts_ret() in 2.7.0. * * \param ctx The SHA-1 context to initialize. This must be initialized. * */ MBEDTLS_DEPRECATED void mbedtls_sha1_starts( mbedtls_sha1_context *ctx ); /** * \brief This function feeds an input buffer into an ongoing SHA-1 * checksum calculation. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_sha1_update_ret() in 2.7.0. * * \param ctx The SHA-1 context. This must be initialized and * have a hash operation started. * \param input The buffer holding the input data. * This must be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data \p input in Bytes. * */ MBEDTLS_DEPRECATED void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-1 operation, and writes * the result to the output buffer. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_sha1_finish_ret() in 2.7.0. * * \param ctx The SHA-1 context. This must be initialized and * have a hash operation started. * \param output The SHA-1 checksum result. * This must be a writable buffer of length \c 20 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] ); /** * \brief SHA-1 process data block (internal use only). * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_internal_sha1_process() in 2.7.0. * * \param ctx The SHA-1 context. This must be initialized. * \param data The data block being processed. * This must be a readable buffer of length \c 64 bytes. * */ MBEDTLS_DEPRECATED void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief This function calculates the SHA-1 checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-1 result is calculated as * output = SHA-1(input buffer). * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \param input The buffer holding the input data. * This must be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data \p input in Bytes. * \param output The SHA-1 checksum result. * This must be a writable buffer of length \c 20 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. * */ int mbedtls_sha1_ret( const unsigned char *input, size_t ilen, unsigned char output[20] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function calculates the SHA-1 checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-1 result is calculated as * output = SHA-1(input buffer). * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \deprecated Superseded by mbedtls_sha1_ret() in 2.7.0 * * \param input The buffer holding the input data. * This must be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data \p input in Bytes. * \param output The SHA-1 checksum result. This must be a writable * buffer of size \c 20 Bytes. * */ MBEDTLS_DEPRECATED void mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief The SHA-1 checkup routine. * * \warning SHA-1 is considered a weak message digest and its use * constitutes a security risk. We recommend considering * stronger message digests instead. * * \return \c 0 on success. * \return \c 1 on failure. * */ int mbedtls_sha1_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_sha1.h */ fldigi-4.2.05/src/include/mbedtls/sha512.h0000664000175000017500000002610014611711171015002 00000000000000/** * \file sha512.h * \brief This file contains SHA-384 and SHA-512 definitions and functions. * * The Secure Hash Algorithms 384 and 512 (SHA-384 and SHA-512) cryptographic * hash functions are defined in FIPS 180-4: Secure Hash Standard (SHS). */ /* * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_SHA512_H #define MBEDTLS_SHA512_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include /* MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED -0x0039 /**< SHA-512 hardware accelerator failed */ #define MBEDTLS_ERR_SHA512_BAD_INPUT_DATA -0x0075 /**< SHA-512 input data was malformed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_SHA512_ALT) // Regular implementation // /** * \brief The SHA-512 context structure. * * The structure is used both for SHA-384 and for SHA-512 * checksum calculations. The choice between these two is * made in the call to mbedtls_sha512_starts_ret(). */ typedef struct mbedtls_sha512_context { uint64_t total[2]; /*!< The number of Bytes processed. */ uint64_t state[8]; /*!< The intermediate digest state. */ unsigned char buffer[128]; /*!< The data block being processed. */ int is384; /*!< Determines which function to use: 0: Use SHA-512, or 1: Use SHA-384. */ } mbedtls_sha512_context; #else /* MBEDTLS_SHA512_ALT */ #include "sha512_alt.h" #endif /* MBEDTLS_SHA512_ALT */ /** * \brief This function initializes a SHA-512 context. * * \param ctx The SHA-512 context to initialize. This must * not be \c NULL. */ void mbedtls_sha512_init( mbedtls_sha512_context *ctx ); /** * \brief This function clears a SHA-512 context. * * \param ctx The SHA-512 context to clear. This may be \c NULL, * in which case this function does nothing. If it * is not \c NULL, it must point to an initialized * SHA-512 context. */ void mbedtls_sha512_free( mbedtls_sha512_context *ctx ); /** * \brief This function clones the state of a SHA-512 context. * * \param dst The destination context. This must be initialized. * \param src The context to clone. This must be initialized. */ void mbedtls_sha512_clone( mbedtls_sha512_context *dst, const mbedtls_sha512_context *src ); /** * \brief This function starts a SHA-384 or SHA-512 checksum * calculation. * * \param ctx The SHA-512 context to use. This must be initialized. * \param is384 Determines which function to use. This must be * either \c for SHA-512, or \c 1 for SHA-384. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha512_starts_ret( mbedtls_sha512_context *ctx, int is384 ); /** * \brief This function feeds an input buffer into an ongoing * SHA-512 checksum calculation. * * \param ctx The SHA-512 context. This must be initialized * and have a hash operation started. * \param input The buffer holding the input data. This must * be a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-512 operation, and writes * the result to the output buffer. This function is for * internal use only. * * \param ctx The SHA-512 context. This must be initialized * and have a hash operation started. * \param output The SHA-384 or SHA-512 checksum result. * This must be a writable buffer of length \c 64 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx, unsigned char *output ); /** * \brief This function processes a single data block within * the ongoing SHA-512 computation. * * \param ctx The SHA-512 context. This must be initialized. * \param data The buffer holding one block of data. This * must be a readable buffer of length \c 128 Bytes. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function starts a SHA-384 or SHA-512 checksum * calculation. * * \deprecated Superseded by mbedtls_sha512_starts_ret() in 2.7.0 * * \param ctx The SHA-512 context to use. This must be initialized. * \param is384 Determines which function to use. This must be either * \c 0 for SHA-512 or \c 1 for SHA-384. */ MBEDTLS_DEPRECATED void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 ); /** * \brief This function feeds an input buffer into an ongoing * SHA-512 checksum calculation. * * \deprecated Superseded by mbedtls_sha512_update_ret() in 2.7.0. * * \param ctx The SHA-512 context. This must be initialized * and have a hash operation started. * \param input The buffer holding the data. This must be a readable * buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen ); /** * \brief This function finishes the SHA-512 operation, and writes * the result to the output buffer. * * \deprecated Superseded by mbedtls_sha512_finish_ret() in 2.7.0. * * \param ctx The SHA-512 context. This must be initialized * and have a hash operation started. * \param output The SHA-384 or SHA-512 checksum result. This must * be a writable buffer of size \c 64 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] ); /** * \brief This function processes a single data block within * the ongoing SHA-512 computation. This function is for * internal use only. * * \deprecated Superseded by mbedtls_internal_sha512_process() in 2.7.0. * * \param ctx The SHA-512 context. This must be initialized. * \param data The buffer holding one block of data. This must be * a readable buffer of length \c 128 Bytes. */ MBEDTLS_DEPRECATED void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief This function calculates the SHA-512 or SHA-384 * checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-512 result is calculated as * output = SHA-512(input buffer). * * \param input The buffer holding the input data. This must be * a readable buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The SHA-384 or SHA-512 checksum result. * This must be a writable buffer of length \c 64 Bytes. * \param is384 Determines which function to use. This must be either * \c 0 for SHA-512, or \c 1 for SHA-384. * * \return \c 0 on success. * \return A negative error code on failure. */ int mbedtls_sha512_ret( const unsigned char *input, size_t ilen, unsigned char output[64], int is384 ); #if !defined(MBEDTLS_DEPRECATED_REMOVED) #if defined(MBEDTLS_DEPRECATED_WARNING) #define MBEDTLS_DEPRECATED __attribute__((deprecated)) #else #define MBEDTLS_DEPRECATED #endif /** * \brief This function calculates the SHA-512 or SHA-384 * checksum of a buffer. * * The function allocates the context, performs the * calculation, and frees the context. * * The SHA-512 result is calculated as * output = SHA-512(input buffer). * * \deprecated Superseded by mbedtls_sha512_ret() in 2.7.0 * * \param input The buffer holding the data. This must be a * readable buffer of length \p ilen Bytes. * \param ilen The length of the input data in Bytes. * \param output The SHA-384 or SHA-512 checksum result. This must * be a writable buffer of length \c 64 Bytes. * \param is384 Determines which function to use. This must be either * \c 0 for SHA-512, or \c 1 for SHA-384. */ MBEDTLS_DEPRECATED void mbedtls_sha512( const unsigned char *input, size_t ilen, unsigned char output[64], int is384 ); #undef MBEDTLS_DEPRECATED #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /** * \brief The SHA-384 or SHA-512 checkup routine. * * \return \c 0 on success. * \return \c 1 on failure. */ int mbedtls_sha512_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* mbedtls_sha512.h */ fldigi-4.2.05/src/include/mbedtls/net_sockets.h0000664000175000017500000002547214611711171016333 00000000000000/** * \file net_sockets.h * * \brief Network sockets abstraction layer to integrate Mbed TLS into a * BSD-style sockets API. * * The network sockets module provides an example integration of the * Mbed TLS library into a BSD sockets implementation. The module is * intended to be an example of how Mbed TLS can be integrated into a * networking stack, as well as to be Mbed TLS's network integration * for its supported platforms. * * The module is intended only to be used with the Mbed TLS library and * is not intended to be used by third party application software * directly. * * The supported platforms are as follows: * * Microsoft Windows and Windows CE * * POSIX/Unix platforms including Linux, OS X * */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_NET_SOCKETS_H #define MBEDTLS_NET_SOCKETS_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "ssl.h" #include #include #define MBEDTLS_ERR_NET_SOCKET_FAILED -0x0042 /**< Failed to open a socket. */ #define MBEDTLS_ERR_NET_CONNECT_FAILED -0x0044 /**< The connection to the given server / port failed. */ #define MBEDTLS_ERR_NET_BIND_FAILED -0x0046 /**< Binding of the socket failed. */ #define MBEDTLS_ERR_NET_LISTEN_FAILED -0x0048 /**< Could not listen on the socket. */ #define MBEDTLS_ERR_NET_ACCEPT_FAILED -0x004A /**< Could not accept the incoming connection. */ #define MBEDTLS_ERR_NET_RECV_FAILED -0x004C /**< Reading information from the socket failed. */ #define MBEDTLS_ERR_NET_SEND_FAILED -0x004E /**< Sending information through the socket failed. */ #define MBEDTLS_ERR_NET_CONN_RESET -0x0050 /**< Connection was reset by peer. */ #define MBEDTLS_ERR_NET_UNKNOWN_HOST -0x0052 /**< Failed to get an IP address for the given hostname. */ #define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL -0x0043 /**< Buffer is too small to hold the data. */ #define MBEDTLS_ERR_NET_INVALID_CONTEXT -0x0045 /**< The context is invalid, eg because it was free()ed. */ #define MBEDTLS_ERR_NET_POLL_FAILED -0x0047 /**< Polling the net context failed. */ #define MBEDTLS_ERR_NET_BAD_INPUT_DATA -0x0049 /**< Input invalid. */ #define MBEDTLS_NET_LISTEN_BACKLOG 10 /**< The backlog that listen() should use. */ #define MBEDTLS_NET_PROTO_TCP 0 /**< The TCP transport protocol */ #define MBEDTLS_NET_PROTO_UDP 1 /**< The UDP transport protocol */ #define MBEDTLS_NET_POLL_READ 1 /**< Used in \c mbedtls_net_poll to check for pending data */ #define MBEDTLS_NET_POLL_WRITE 2 /**< Used in \c mbedtls_net_poll to check if write possible */ #ifdef __cplusplus extern "C" { #endif /** * Wrapper type for sockets. * * Currently backed by just a file descriptor, but might be more in the future * (eg two file descriptors for combined IPv4 + IPv6 support, or additional * structures for hand-made UDP demultiplexing). */ typedef struct mbedtls_net_context { int fd; /**< The underlying file descriptor */ } mbedtls_net_context; /** * \brief Initialize a context * Just makes the context ready to be used or freed safely. * * \param ctx Context to initialize */ void mbedtls_net_init( mbedtls_net_context *ctx ); /** * \brief Initiate a connection with host:port in the given protocol * * \param ctx Socket to use * \param host Host to connect to * \param port Port to connect to * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP * * \return 0 if successful, or one of: * MBEDTLS_ERR_NET_SOCKET_FAILED, * MBEDTLS_ERR_NET_UNKNOWN_HOST, * MBEDTLS_ERR_NET_CONNECT_FAILED * * \note Sets the socket in connected mode even with UDP. */ int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto ); /** * \brief Create a receiving socket on bind_ip:port in the chosen * protocol. If bind_ip == NULL, all interfaces are bound. * * \param ctx Socket to use * \param bind_ip IP to bind to, can be NULL * \param port Port number to use * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP * * \return 0 if successful, or one of: * MBEDTLS_ERR_NET_SOCKET_FAILED, * MBEDTLS_ERR_NET_BIND_FAILED, * MBEDTLS_ERR_NET_LISTEN_FAILED * * \note Regardless of the protocol, opens the sockets and binds it. * In addition, make the socket listening if protocol is TCP. */ int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto ); /** * \brief Accept a connection from a remote client * * \param bind_ctx Relevant socket * \param client_ctx Will contain the connected client socket * \param client_ip Will contain the client IP address, can be NULL * \param buf_size Size of the client_ip buffer * \param ip_len Will receive the size of the client IP written, * can be NULL if client_ip is null * * \return 0 if successful, or * MBEDTLS_ERR_NET_ACCEPT_FAILED, or * MBEDTLS_ERR_NET_BUFFER_TOO_SMALL if buf_size is too small, * MBEDTLS_ERR_SSL_WANT_READ if bind_fd was set to * non-blocking and accept() would block. */ int mbedtls_net_accept( mbedtls_net_context *bind_ctx, mbedtls_net_context *client_ctx, void *client_ip, size_t buf_size, size_t *ip_len ); /** * \brief Check and wait for the context to be ready for read/write * * \param ctx Socket to check * \param rw Bitflag composed of MBEDTLS_NET_POLL_READ and * MBEDTLS_NET_POLL_WRITE specifying the events * to wait for: * - If MBEDTLS_NET_POLL_READ is set, the function * will return as soon as the net context is available * for reading. * - If MBEDTLS_NET_POLL_WRITE is set, the function * will return as soon as the net context is available * for writing. * \param timeout Maximal amount of time to wait before returning, * in milliseconds. If \c timeout is zero, the * function returns immediately. If \c timeout is * -1u, the function blocks potentially indefinitely. * * \return Bitmask composed of MBEDTLS_NET_POLL_READ/WRITE * on success or timeout, or a negative return code otherwise. */ int mbedtls_net_poll( mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout ); /** * \brief Set the socket blocking * * \param ctx Socket to set * * \return 0 if successful, or a non-zero error code */ int mbedtls_net_set_block( mbedtls_net_context *ctx ); /** * \brief Set the socket non-blocking * * \param ctx Socket to set * * \return 0 if successful, or a non-zero error code */ int mbedtls_net_set_nonblock( mbedtls_net_context *ctx ); /** * \brief Portable usleep helper * * \param usec Amount of microseconds to sleep * * \note Real amount of time slept will not be less than * select()'s timeout granularity (typically, 10ms). */ void mbedtls_net_usleep( unsigned long usec ); /** * \brief Read at most 'len' characters. If no error occurs, * the actual amount read is returned. * * \param ctx Socket * \param buf The buffer to write to * \param len Maximum length of the buffer * * \return the number of bytes received, * or a non-zero error code; with a non-blocking socket, * MBEDTLS_ERR_SSL_WANT_READ indicates read() would block. */ int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len ); /** * \brief Write at most 'len' characters. If no error occurs, * the actual amount read is returned. * * \param ctx Socket * \param buf The buffer to read from * \param len The length of the buffer * * \return the number of bytes sent, * or a non-zero error code; with a non-blocking socket, * MBEDTLS_ERR_SSL_WANT_WRITE indicates write() would block. */ int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len ); /** * \brief Read at most 'len' characters, blocking for at most * 'timeout' seconds. If no error occurs, the actual amount * read is returned. * * \param ctx Socket * \param buf The buffer to write to * \param len Maximum length of the buffer * \param timeout Maximum number of milliseconds to wait for data * 0 means no timeout (wait forever) * * \return the number of bytes received, * or a non-zero error code: * MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out, * MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. * * \note This function will block (until data becomes available or * timeout is reached) even if the socket is set to * non-blocking. Handling timeouts with non-blocking reads * requires a different strategy. */ int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len, uint32_t timeout ); /** * \brief Gracefully shutdown the connection and free associated data * * \param ctx The context to free */ void mbedtls_net_free( mbedtls_net_context *ctx ); #ifdef __cplusplus } #endif #endif /* net_sockets.h */ fldigi-4.2.05/src/include/mbedtls/blowfish.h0000664000175000017500000003066614611711171015630 00000000000000/** * \file blowfish.h * * \brief Blowfish block cipher */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_BLOWFISH_H #define MBEDTLS_BLOWFISH_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #include "platform_util.h" #define MBEDTLS_BLOWFISH_ENCRYPT 1 #define MBEDTLS_BLOWFISH_DECRYPT 0 #define MBEDTLS_BLOWFISH_MAX_KEY_BITS 448 #define MBEDTLS_BLOWFISH_MIN_KEY_BITS 32 #define MBEDTLS_BLOWFISH_ROUNDS 16 /**< Rounds to use. When increasing this value, make sure to extend the initialisation vectors */ #define MBEDTLS_BLOWFISH_BLOCKSIZE 8 /* Blowfish uses 64 bit blocks */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) #define MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( -0x0016 ) #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #define MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA -0x0016 /**< Bad input data. */ #define MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH -0x0018 /**< Invalid data input length. */ /* MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED -0x0017 /**< Blowfish hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_BLOWFISH_ALT) // Regular implementation // /** * \brief Blowfish context structure */ typedef struct mbedtls_blowfish_context { uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2]; /*!< Blowfish round keys */ uint32_t S[4][256]; /*!< key dependent S-boxes */ } mbedtls_blowfish_context; #else /* MBEDTLS_BLOWFISH_ALT */ #include "blowfish_alt.h" #endif /* MBEDTLS_BLOWFISH_ALT */ /** * \brief Initialize a Blowfish context. * * \param ctx The Blowfish context to be initialized. * This must not be \c NULL. */ void mbedtls_blowfish_init( mbedtls_blowfish_context *ctx ); /** * \brief Clear a Blowfish context. * * \param ctx The Blowfish context to be cleared. * This may be \c NULL, in which case this function * returns immediately. If it is not \c NULL, it must * point to an initialized Blowfish context. */ void mbedtls_blowfish_free( mbedtls_blowfish_context *ctx ); /** * \brief Perform a Blowfish key schedule operation. * * \param ctx The Blowfish context to perform the key schedule on. * \param key The encryption key. This must be a readable buffer of * length \p keybits Bits. * \param keybits The length of \p key in Bits. This must be between * \c 32 and \c 448 and a multiple of \c 8. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief Perform a Blowfish-ECB block encryption/decryption operation. * * \param ctx The Blowfish context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. Possible values are * #MBEDTLS_BLOWFISH_ENCRYPT for encryption, or * #MBEDTLS_BLOWFISH_DECRYPT for decryption. * \param input The input block. This must be a readable buffer * of size \c 8 Bytes. * \param output The output block. This must be a writable buffer * of size \c 8 Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx, int mode, const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE], unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief Perform a Blowfish-CBC buffer encryption/decryption operation. * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx The Blowfish context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. Possible values are * #MBEDTLS_BLOWFISH_ENCRYPT for encryption, or * #MBEDTLS_BLOWFISH_DECRYPT for decryption. * \param length The length of the input data in Bytes. This must be * multiple of \c 8. * \param iv The initialization vector. This must be a read/write buffer * of length \c 8 Bytes. It is updated by this function. * \param input The input data. This must be a readable buffer of length * \p length Bytes. * \param output The output data. This must be a writable buffer of length * \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx, int mode, size_t length, unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /** * \brief Perform a Blowfish CFB buffer encryption/decryption operation. * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx The Blowfish context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. Possible values are * #MBEDTLS_BLOWFISH_ENCRYPT for encryption, or * #MBEDTLS_BLOWFISH_DECRYPT for decryption. * \param length The length of the input data in Bytes. * \param iv_off The offset in the initialiation vector. * The value pointed to must be smaller than \c 8 Bytes. * It is updated by this function to support the aforementioned * streaming usage. * \param iv The initialization vector. This must be a read/write buffer * of size \c 8 Bytes. It is updated after use. * \param input The input data. This must be a readable buffer of length * \p length Bytes. * \param output The output data. This must be a writable buffer of length * \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /*MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /** * \brief Perform a Blowfish-CTR buffer encryption/decryption operation. * * \warning You must never reuse a nonce value with the same key. Doing so * would void the encryption for the two messages encrypted with * the same nonce and key. * * There are two common strategies for managing nonces with CTR: * * 1. You can handle everything as a single message processed over * successive calls to this function. In that case, you want to * set \p nonce_counter and \p nc_off to 0 for the first call, and * then preserve the values of \p nonce_counter, \p nc_off and \p * stream_block across calls to this function as they will be * updated by this function. * * With this strategy, you must not encrypt more than 2**64 * blocks of data with the same key. * * 2. You can encrypt separate messages by dividing the \p * nonce_counter buffer in two areas: the first one used for a * per-message nonce, handled by yourself, and the second one * updated by this function internally. * * For example, you might reserve the first 4 bytes for the * per-message nonce, and the last 4 bytes for internal use. In that * case, before calling this function on a new message you need to * set the first 4 bytes of \p nonce_counter to your chosen nonce * value, the last 4 to 0, and \p nc_off to 0 (which will cause \p * stream_block to be ignored). That way, you can encrypt at most * 2**32 messages of up to 2**32 blocks each with the same key. * * The per-message nonce (or information sufficient to reconstruct * it) needs to be communicated with the ciphertext and must be unique. * The recommended way to ensure uniqueness is to use a message * counter. * * Note that for both stategies, sizes are measured in blocks and * that a Blowfish block is 8 bytes. * * \warning Upon return, \p stream_block contains sensitive data. Its * content must not be written to insecure storage and should be * securely discarded as soon as it's no longer needed. * * \param ctx The Blowfish context to use. This must be initialized * and bound to a key. * \param length The length of the input data in Bytes. * \param nc_off The offset in the current stream_block (for resuming * within current cipher stream). The offset pointer * should be \c 0 at the start of a stream and must be * smaller than \c 8. It is updated by this function. * \param nonce_counter The 64-bit nonce and counter. This must point to a * read/write buffer of length \c 8 Bytes. * \param stream_block The saved stream-block for resuming. This must point to * a read/write buffer of length \c 8 Bytes. * \param input The input data. This must be a readable buffer of * length \p length Bytes. * \param output The output data. This must be a writable buffer of * length \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE], unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ #ifdef __cplusplus } #endif #endif /* blowfish.h */ fldigi-4.2.05/src/include/mbedtls/arc4.h0000664000175000017500000001020614611711171014630 00000000000000/** * \file arc4.h * * \brief The ARCFOUR stream cipher * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers instead. */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #ifndef MBEDTLS_ARC4_H #define MBEDTLS_ARC4_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include /* MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED -0x0019 /**< ARC4 hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_ARC4_ALT) // Regular implementation // /** * \brief ARC4 context structure * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers instead. * */ typedef struct mbedtls_arc4_context { int x; /*!< permutation index */ int y; /*!< permutation index */ unsigned char m[256]; /*!< permutation table */ } mbedtls_arc4_context; #else /* MBEDTLS_ARC4_ALT */ #include "arc4_alt.h" #endif /* MBEDTLS_ARC4_ALT */ /** * \brief Initialize ARC4 context * * \param ctx ARC4 context to be initialized * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ void mbedtls_arc4_init( mbedtls_arc4_context *ctx ); /** * \brief Clear ARC4 context * * \param ctx ARC4 context to be cleared * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ void mbedtls_arc4_free( mbedtls_arc4_context *ctx ); /** * \brief ARC4 key schedule * * \param ctx ARC4 context to be setup * \param key the secret key * \param keylen length of the key, in bytes * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key, unsigned int keylen ); /** * \brief ARC4 cipher function * * \param ctx ARC4 context * \param length length of the input data * \param input buffer holding the input data * \param output buffer for the output data * * \return 0 if successful * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, unsigned char *output ); /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed * * \warning ARC4 is considered a weak cipher and its use constitutes a * security risk. We recommend considering stronger ciphers * instead. * */ int mbedtls_arc4_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* arc4.h */ fldigi-4.2.05/src/include/mbedtls/camellia.h0000664000175000017500000003355714611711171015564 00000000000000/** * \file camellia.h * * \brief Camellia block cipher */ /* * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_CAMELLIA_H #define MBEDTLS_CAMELLIA_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #include #include "platform_util.h" #define MBEDTLS_CAMELLIA_ENCRYPT 1 #define MBEDTLS_CAMELLIA_DECRYPT 0 #if !defined(MBEDTLS_DEPRECATED_REMOVED) #define MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_DEPRECATED_NUMERIC_CONSTANT( -0x0024 ) #endif /* !MBEDTLS_DEPRECATED_REMOVED */ #define MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA -0x0024 /**< Bad input data. */ #define MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH -0x0026 /**< Invalid data input length. */ /* MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED is deprecated and should not be used. */ #define MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED -0x0027 /**< Camellia hardware accelerator failed. */ #ifdef __cplusplus extern "C" { #endif #if !defined(MBEDTLS_CAMELLIA_ALT) // Regular implementation // /** * \brief CAMELLIA context structure */ typedef struct mbedtls_camellia_context { int nr; /*!< number of rounds */ uint32_t rk[68]; /*!< CAMELLIA round keys */ } mbedtls_camellia_context; #else /* MBEDTLS_CAMELLIA_ALT */ #include "camellia_alt.h" #endif /* MBEDTLS_CAMELLIA_ALT */ /** * \brief Initialize a CAMELLIA context. * * \param ctx The CAMELLIA context to be initialized. * This must not be \c NULL. */ void mbedtls_camellia_init( mbedtls_camellia_context *ctx ); /** * \brief Clear a CAMELLIA context. * * \param ctx The CAMELLIA context to be cleared. This may be \c NULL, * in which case this function returns immediately. If it is not * \c NULL, it must be initialized. */ void mbedtls_camellia_free( mbedtls_camellia_context *ctx ); /** * \brief Perform a CAMELLIA key schedule operation for encryption. * * \param ctx The CAMELLIA context to use. This must be initialized. * \param key The encryption key to use. This must be a readable buffer * of size \p keybits Bits. * \param keybits The length of \p key in Bits. This must be either \c 128, * \c 192 or \c 256. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief Perform a CAMELLIA key schedule operation for decryption. * * \param ctx The CAMELLIA context to use. This must be initialized. * \param key The decryption key. This must be a readable buffer * of size \p keybits Bits. * \param keybits The length of \p key in Bits. This must be either \c 128, * \c 192 or \c 256. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key, unsigned int keybits ); /** * \brief Perform a CAMELLIA-ECB block encryption/decryption operation. * * \param ctx The CAMELLIA context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * \param input The input block. This must be a readable buffer * of size \c 16 Bytes. * \param output The output block. This must be a writable buffer * of size \c 16 Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /** * \brief Perform a CAMELLIA-CBC buffer encryption/decryption operation. * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx The CAMELLIA context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * \param length The length in Bytes of the input data \p input. * This must be a multiple of \c 16 Bytes. * \param iv The initialization vector. This must be a read/write buffer * of length \c 16 Bytes. It is updated to allow streaming * use as explained above. * \param input The buffer holding the input data. This must point to a * readable buffer of length \p length Bytes. * \param output The buffer holding the output data. This must point to a * writable buffer of length \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /** * \brief Perform a CAMELLIA-CFB128 buffer encryption/decryption * operation. * * \note Due to the nature of CFB mode, you should use the same * key for both encryption and decryption. In particular, calls * to this function should be preceded by a key-schedule via * mbedtls_camellia_setkey_enc() regardless of whether \p mode * is #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * * \note Upon exit, the content of the IV is updated so that you can * call the function same function again on the following * block(s) of data and get the same result as if it was * encrypted in one call. This allows a "streaming" usage. * If on the other hand you need to retain the contents of the * IV, you should either save it manually or use the cipher * module instead. * * \param ctx The CAMELLIA context to use. This must be initialized * and bound to a key. * \param mode The mode of operation. This must be either * #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * \param length The length of the input data \p input. Any value is allowed. * \param iv_off The current offset in the IV. This must be smaller * than \c 16 Bytes. It is updated after this call to allow * the aforementioned streaming usage. * \param iv The initialization vector. This must be a read/write buffer * of length \c 16 Bytes. It is updated after this call to * allow the aforementioned streaming usage. * \param input The buffer holding the input data. This must be a readable * buffer of size \p length Bytes. * \param output The buffer to hold the output data. This must be a writable * buffer of length \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /** * \brief Perform a CAMELLIA-CTR buffer encryption/decryption operation. * * *note Due to the nature of CTR mode, you should use the same * key for both encryption and decryption. In particular, calls * to this function should be preceded by a key-schedule via * mbedtls_camellia_setkey_enc() regardless of whether \p mode * is #MBEDTLS_CAMELLIA_ENCRYPT or #MBEDTLS_CAMELLIA_DECRYPT. * * \warning You must never reuse a nonce value with the same key. Doing so * would void the encryption for the two messages encrypted with * the same nonce and key. * * There are two common strategies for managing nonces with CTR: * * 1. You can handle everything as a single message processed over * successive calls to this function. In that case, you want to * set \p nonce_counter and \p nc_off to 0 for the first call, and * then preserve the values of \p nonce_counter, \p nc_off and \p * stream_block across calls to this function as they will be * updated by this function. * * With this strategy, you must not encrypt more than 2**128 * blocks of data with the same key. * * 2. You can encrypt separate messages by dividing the \p * nonce_counter buffer in two areas: the first one used for a * per-message nonce, handled by yourself, and the second one * updated by this function internally. * * For example, you might reserve the first \c 12 Bytes for the * per-message nonce, and the last \c 4 Bytes for internal use. * In that case, before calling this function on a new message you * need to set the first \c 12 Bytes of \p nonce_counter to your * chosen nonce value, the last four to \c 0, and \p nc_off to \c 0 * (which will cause \p stream_block to be ignored). That way, you * can encrypt at most \c 2**96 messages of up to \c 2**32 blocks * each with the same key. * * The per-message nonce (or information sufficient to reconstruct * it) needs to be communicated with the ciphertext and must be * unique. The recommended way to ensure uniqueness is to use a * message counter. An alternative is to generate random nonces, * but this limits the number of messages that can be securely * encrypted: for example, with 96-bit random nonces, you should * not encrypt more than 2**32 messages with the same key. * * Note that for both stategies, sizes are measured in blocks and * that a CAMELLIA block is \c 16 Bytes. * * \warning Upon return, \p stream_block contains sensitive data. Its * content must not be written to insecure storage and should be * securely discarded as soon as it's no longer needed. * * \param ctx The CAMELLIA context to use. This must be initialized * and bound to a key. * \param length The length of the input data \p input in Bytes. * Any value is allowed. * \param nc_off The offset in the current \p stream_block (for resuming * within current cipher stream). The offset pointer to * should be \c 0 at the start of a stream. It is updated * at the end of this call. * \param nonce_counter The 128-bit nonce and counter. This must be a read/write * buffer of length \c 16 Bytes. * \param stream_block The saved stream-block for resuming. This must be a * read/write buffer of length \c 16 Bytes. * \param input The input data stream. This must be a readable buffer of * size \p length Bytes. * \param output The output data stream. This must be a writable buffer * of size \p length Bytes. * * \return \c 0 if successful. * \return A negative error code on failure. */ int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ /** * \brief Checkup routine * * \return 0 if successful, or 1 if the test failed */ int mbedtls_camellia_self_test( int verbose ); #ifdef __cplusplus } #endif #endif /* camellia.h */ fldigi-4.2.05/src/include/mbedtls/platform_time.h0000664000175000017500000000435714611711171016653 00000000000000/** * \file platform_time.h * * \brief mbed TLS Platform time abstraction */ /* * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_PLATFORM_TIME_H #define MBEDTLS_PLATFORM_TIME_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #ifdef __cplusplus extern "C" { #endif /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ /* * The time_t datatype */ #if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) typedef MBEDTLS_PLATFORM_TIME_TYPE_MACRO mbedtls_time_t; #else /* For time_t */ #include typedef time_t mbedtls_time_t; #endif /* MBEDTLS_PLATFORM_TIME_TYPE_MACRO */ /* * The function pointers for time */ #if defined(MBEDTLS_PLATFORM_TIME_ALT) extern mbedtls_time_t (*mbedtls_time)( mbedtls_time_t* time ); /** * \brief Set your own time function pointer * * \param time_func the time function implementation * * \return 0 */ int mbedtls_platform_set_time( mbedtls_time_t (*time_func)( mbedtls_time_t* time ) ); #else #if defined(MBEDTLS_PLATFORM_TIME_MACRO) #define mbedtls_time MBEDTLS_PLATFORM_TIME_MACRO #else #define mbedtls_time time #endif /* MBEDTLS_PLATFORM_TIME_MACRO */ #endif /* MBEDTLS_PLATFORM_TIME_ALT */ #ifdef __cplusplus } #endif #endif /* platform_time.h */ fldigi-4.2.05/src/include/mbedtls/entropy.h0000664000175000017500000002321214611711171015500 00000000000000/** * \file entropy.h * * \brief Entropy accumulator implementation */ /* * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #ifndef MBEDTLS_ENTROPY_H #define MBEDTLS_ENTROPY_H #if !defined(MBEDTLS_CONFIG_FILE) #include "config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) #include "sha512.h" #define MBEDTLS_ENTROPY_SHA512_ACCUMULATOR #else #if defined(MBEDTLS_SHA256_C) #define MBEDTLS_ENTROPY_SHA256_ACCUMULATOR #include "sha256.h" #endif #endif #if defined(MBEDTLS_THREADING_C) #include "threading.h" #endif #if defined(MBEDTLS_HAVEGE_C) #include "havege.h" #endif #define MBEDTLS_ERR_ENTROPY_SOURCE_FAILED -0x003C /**< Critical entropy source failure. */ #define MBEDTLS_ERR_ENTROPY_MAX_SOURCES -0x003E /**< No more sources can be added. */ #define MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED -0x0040 /**< No sources have been added to poll. */ #define MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE -0x003D /**< No strong sources have been added to poll. */ #define MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR -0x003F /**< Read/write error in file. */ /** * \name SECTION: Module settings * * The configuration options you can set for this module are in this section. * Either change them in config.h or define them on the compiler command line. * \{ */ #if !defined(MBEDTLS_ENTROPY_MAX_SOURCES) #define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ #endif #if !defined(MBEDTLS_ENTROPY_MAX_GATHER) #define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ #endif /* \} name SECTION: Module settings */ #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) #define MBEDTLS_ENTROPY_BLOCK_SIZE 64 /**< Block size of entropy accumulator (SHA-512) */ #else #define MBEDTLS_ENTROPY_BLOCK_SIZE 32 /**< Block size of entropy accumulator (SHA-256) */ #endif #define MBEDTLS_ENTROPY_MAX_SEED_SIZE 1024 /**< Maximum size of seed we read from seed file */ #define MBEDTLS_ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_MAX_SOURCES #define MBEDTLS_ENTROPY_SOURCE_STRONG 1 /**< Entropy source is strong */ #define MBEDTLS_ENTROPY_SOURCE_WEAK 0 /**< Entropy source is weak */ #ifdef __cplusplus extern "C" { #endif /** * \brief Entropy poll callback pointer * * \param data Callback-specific data pointer * \param output Data to fill * \param len Maximum size to provide * \param olen The actual amount of bytes put into the buffer (Can be 0) * * \return 0 if no critical failures occurred, * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED otherwise */ typedef int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, size_t len, size_t *olen); /** * \brief Entropy source state */ typedef struct mbedtls_entropy_source_state { mbedtls_entropy_f_source_ptr f_source; /**< The entropy source callback */ void * p_source; /**< The callback data pointer */ size_t size; /**< Amount received in bytes */ size_t threshold; /**< Minimum bytes required before release */ int strong; /**< Is the source strong? */ } mbedtls_entropy_source_state; /** * \brief Entropy context structure */ typedef struct mbedtls_entropy_context { int accumulator_started; #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) mbedtls_sha512_context accumulator; #else mbedtls_sha256_context accumulator; #endif int source_count; mbedtls_entropy_source_state source[MBEDTLS_ENTROPY_MAX_SOURCES]; #if defined(MBEDTLS_HAVEGE_C) mbedtls_havege_state havege_data; #endif #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; /*!< mutex */ #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) int initial_entropy_run; #endif } mbedtls_entropy_context; /** * \brief Initialize the context * * \param ctx Entropy context to initialize */ void mbedtls_entropy_init( mbedtls_entropy_context *ctx ); /** * \brief Free the data in the context * * \param ctx Entropy context to free */ void mbedtls_entropy_free( mbedtls_entropy_context *ctx ); /** * \brief Adds an entropy source to poll * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param ctx Entropy context * \param f_source Entropy function * \param p_source Function data * \param threshold Minimum required from source before entropy is released * ( with mbedtls_entropy_func() ) (in bytes) * \param strong MBEDTLS_ENTROPY_SOURCE_STRONG or * MBEDTLS_ENTROPY_SOURCE_WEAK. * At least one strong source needs to be added. * Weaker sources (such as the cycle counter) can be used as * a complement. * * \return 0 if successful or MBEDTLS_ERR_ENTROPY_MAX_SOURCES */ int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx, mbedtls_entropy_f_source_ptr f_source, void *p_source, size_t threshold, int strong ); /** * \brief Trigger an extra gather poll for the accumulator * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param ctx Entropy context * * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED */ int mbedtls_entropy_gather( mbedtls_entropy_context *ctx ); /** * \brief Retrieve entropy from the accumulator * (Maximum length: MBEDTLS_ENTROPY_BLOCK_SIZE) * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param data Entropy context * \param output Buffer to fill * \param len Number of bytes desired, must be at most MBEDTLS_ENTROPY_BLOCK_SIZE * * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED */ int mbedtls_entropy_func( void *data, unsigned char *output, size_t len ); /** * \brief Add data to the accumulator manually * (Thread-safe if MBEDTLS_THREADING_C is enabled) * * \param ctx Entropy context * \param data Data to add * \param len Length of data * * \return 0 if successful */ int mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx, const unsigned char *data, size_t len ); #if defined(MBEDTLS_ENTROPY_NV_SEED) /** * \brief Trigger an update of the seed file in NV by using the * current entropy pool. * * \param ctx Entropy context * * \return 0 if successful */ int mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx ); #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if defined(MBEDTLS_FS_IO) /** * \brief Write a seed file * * \param ctx Entropy context * \param path Name of the file * * \return 0 if successful, * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, or * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED */ int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path ); /** * \brief Read and update a seed file. Seed is added to this * instance. No more than MBEDTLS_ENTROPY_MAX_SEED_SIZE bytes are * read from the seed file. The rest is ignored. * * \param ctx Entropy context * \param path Name of the file * * \return 0 if successful, * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED */ int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path ); #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) /** * \brief Checkup routine * * This module self-test also calls the entropy self-test, * mbedtls_entropy_source_self_test(); * * \return 0 if successful, or 1 if a test failed */ int mbedtls_entropy_self_test( int verbose ); #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) /** * \brief Checkup routine * * Verifies the integrity of the hardware entropy source * provided by the function 'mbedtls_hardware_poll()'. * * Note this is the only hardware entropy source that is known * at link time, and other entropy sources configured * dynamically at runtime by the function * mbedtls_entropy_add_source() will not be tested. * * \return 0 if successful, or 1 if a test failed */ int mbedtls_entropy_source_self_test( int verbose ); #endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ #endif /* MBEDTLS_SELF_TEST */ #ifdef __cplusplus } #endif #endif /* entropy.h */ fldigi-4.2.05/src/include/log.h0000664000175000017500000000236614532252172013141 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _LOG_H #define _LOG_H #include #include class cLogfile { public: enum log_t { LOG_RX, LOG_TX, LOG_START, LOG_STOP }; private: FILE* logfile; bool retflag; log_t logtype; public: cLogfile(const std::string& fname); ~cLogfile(); void log_to_file(log_t type, const std::string& s); void log_to_file_start(); void log_to_file_stop(); }; #endif fldigi-4.2.05/src/include/nco.h0000664000175000017500000000621114532252172013130 00000000000000// --------------------------------------------------------------------- // nco.h -- a generic NCO class // // // This file is a proposed part of fldigi. // // Copyright (C) 2010 // Dave Freese, W1HKJ // Chris Sylvain, KB3CS // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #ifndef NCO_H #define NCO_H #include "complex.h" class NCO { #define NCO_SINETABLE_LEN (1<<8) // == 256 private: double SampleRate; double Frequency; double Phase; double Phase_incr; bool sinetable_ready; double sinetable[NCO_SINETABLE_LEN+1]; public: NCO() { sinetable_ready = false; } ~NCO() { }; void init(double freq, double phase, double sr) { SampleRate = sr; Frequency = freq; Phase = phase / TWOPI; // normalize radians to [0,1] Phase_incr = freq / sr; if (sinetable_ready == false) { double step = 1.0 / NCO_SINETABLE_LEN; for (int i = 0; i < NCO_SINETABLE_LEN; i++) sinetable[i] = sin(step * i * TWOPI); sinetable[NCO_SINETABLE_LEN] = sinetable[0]; /* == 0.0 */ sinetable_ready = true; } } inline void setfreq(double freq) { Frequency = freq; Phase_incr = freq / SampleRate; } inline double getfreq() { return Frequency; } inline void setphase(double phase) { Phase = phase / TWOPI; } inline double getphase() { return Phase * TWOPI; } inline void setphaseacc(double phase) { Phase = phase; } inline double getphaseacc() { return Phase; } #ifndef NDEBUG double interpolate(double phase) { #else inline double interpolate(double phase) { #endif int iphase; double frac1, frac2; iphase = (int) floor(phase * NCO_SINETABLE_LEN); frac1 = (phase * NCO_SINETABLE_LEN) - iphase; frac2 = 1.0 - frac1; iphase %= NCO_SINETABLE_LEN; return (sinetable[iphase] * frac2) + (sinetable[iphase+1] * frac1); } double sample() { double sample = interpolate(Phase); Phase += Phase_incr; if (Phase > 1) { Phase -= 1; // Phase might be .le. abs(machine-epsilon) if (Phase < 0.0) Phase = 0.0; } return sample; } cmplx cmplx_sample() { cmplx sample; // M_PI_2 / TWOPI = M_PI / 2 / 2 / M_PI = 1 / 4 double t = Phase + 0.25; if (t > 1.0) { t -= 1; // Phase might be .le. abs(machine-epsilon) if (t < 0.0) t = 0.0; } sample = cmplx(interpolate(t), interpolate(Phase)); Phase += Phase_incr; if (Phase > 1.0) { Phase -= 1; if (Phase < 0.0) Phase = 0.0; } return sample; } }; #endif fldigi-4.2.05/src/include/hid_lin.h0000664000175000017500000002332214611711171013756 00000000000000/*********************************************************************** HIDAPI - Multi-Platform library for communication with HID devices. hid_lin.h Alan Ott Signal 11 Software Copyright 2009, All Rights Reserved. C++ implementation * Copyright 2021 * David Freese, W1HKJ * for use in fldigi This software is licensed under the terms of the GNU General Public License v3. ***********************************************************************/ #ifndef HIDAPI_H__ #define HIDAPI_H__ #include #include #include #include #include #include #include #include #include class hid_device { public: int device_handle; int blocking; int uses_numbered_reports; hid_device() { device_handle = -1; blocking = 1; uses_numbered_reports = 0; } ~hid_device() {} /** @brief Write an Output report to a HID device. The first byte of @p data[] must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to hid_write() will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to hid_write(), the Report ID (or 0x0, for devices with a single report), followed by the report data (16 bytes). In this example, the length passed in would be 17. hid_write() will send the data on the first OUT endpoint, if one exists. If it does not, it will send the data through the Control Endpoint (Endpoint 0). @ingroup API @param data The data to send, including the report number as the first byte. @param length The length in bytes of the data to send. @returns This function returns the actual number of bytes written and -1 on error. */ int hid_write(const unsigned char *data, size_t length); /** @brief Read an Input report from a HID device with timeout. Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports. @ingroup API @param data A buffer to put the read data into. @param length The number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number. @param milliseconds timeout in milliseconds or -1 for blocking wait. @returns This function returns the actual number of bytes read and -1 on error. If no packet was available to be read within the timeout period, this function returns 0. */ int hid_read_timeout(unsigned char *data, size_t length, int milliseconds); /** @brief Read an Input report from a HID device. Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports. @ingroup API @param device A device handle returned from hid_open(). @param data A buffer to put the read data into. @param length The number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number. @returns This function returns the actual number of bytes read and -1 on error. If no packet was available to be read and the handle is in non-blocking mode, this function returns 0. */ int hid_read(unsigned char *data, size_t length); /** @brief Get a feature report from a HID device. Set the first byte of @p data[] to the Report ID of the report to be read. Make sure to allow space for this extra byte in @p data[]. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1]. @ingroup API @param device A device handle returned from hid_open(). @param data A buffer to put the read data into, including the Report ID. Set the first byte of @p data[] to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports. @param length The number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report. @returns This function returns the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on error. */ int hid_get_feature_report(unsigned char *data, size_t length); /** @brief Set the device handle to be non-blocking. In non-blocking mode calls to hid_read() will return immediately with a value of 0 if there is no data to be read. In blocking mode, hid_read() will wait (block) until there is data to read before returning. Nonblocking can be turned on and off at any time. @ingroup API @param device A device handle returned from hid_open(). @param nonblock enable or not the nonblocking reads - 1 to enable nonblocking - 0 to disable nonblocking. @returns This function returns 0 on success and -1 on error. */ int hid_set_nonblocking(int nonblock); /** @brief Send a Feature report to the device. Feature reports are sent over the Control endpoint as a Set_Report transfer. The first byte of @p data[] must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to hid_send_feature_report() will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to hid_send_feature_report(): the Report ID (or 0x0, for devices which do not use numbered reports), followed by the report data (16 bytes). In this example, the length passed in would be 17. @ingroup API @param device A device handle returned from hid_open(). @param data The data to send, including the report number as the first byte. @param length The length in bytes of the data to send, including the report number. @returns This function returns the actual number of bytes written and -1 on error. */ int hid_send_feature_report(const unsigned char *data, size_t length); /** @brief Close a HID device. @ingroup API @param device A device handle returned from hid_open(). */ void hid_close(); const char* hid_error(); }; /// hidapi info structure class hid_device_info { public: std::string path; unsigned short vendor_id; unsigned short product_id; unsigned short release_number; std::string str_serial_number; std::string str_manufacturer_string; std::string str_product_string; unsigned short usage_page; // Usage Page for this Device/Interface (Windows/Mac only). unsigned short usage;// Usage for this Device/Interface (Windows/Mac only).*/ /** The USB interface which this logical device represents. Valid on both Linux implementations in all cases, and valid on the Windows implementation only if the device contains more than one interface. */ int interface_number; hid_device_info *next; hid_device_info() {} ~hid_device_info() {} }; /** @brief Enumerate the HID Devices. This function returns a linked list of all the HID devices attached to the system which match vendor_id and product_id. If @p vendor_id is set to 0 then any vendor matches. If @p product_id is set to 0 then any product matches. If @p vendor_id and @p product_id are both set to 0, then all HID devices will be returned. @ingroup API @param vendor_id The Vendor ID (VID) of the types of device to open. @param product_id The Product ID (PID) of the types of device to open. @returns This function returns a pointer to a linked list of type struct #hid_device, containing information about the HID devices attached to the system, or NULL in the case of failure. Free this linked list by calling hid_free_enumeration(). */ hid_device_info *hid_enumerate(unsigned short vendor_id, unsigned short product_id); /** @brief Free an enumeration Linked List This function frees a linked list created by hid_enumerate(). @ingroup API @param devs Pointer to a list of struct_device returned from hid_enumerate(). */ void hid_free_enumeration(hid_device_info *devs); /** @brief Initialize the HIDAPI library. This function initializes the HIDAPI library. Calling it is not strictly necessary, as it will be called automatically by hid_enumerate() and any of the hid_open_*() functions if it is needed. This function should be called at the beginning of execution however, if there is a chance of HIDAPI handles being opened by different threads simultaneously. @ingroup API @returns This function returns 0 on success and -1 on error. */ int hid_init(void); /** @brief Finalize the HIDAPI library. This function frees all of the static data associated with HIDAPI. It should be called at the end of execution to avoid memory leaks. @ingroup API @returns This function returns 0 on success and -1 on error. */ /** @brief Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally a serial number. If @p serial_number is NULL, the first device with the specified VID and PID is opened. @ingroup API @param vendor_id The Vendor ID (VID) of the device to open. @param product_id The Product ID (PID) of the device to open. @param serial_number The Serial Number of the device to open (Optionally NULL). @returns This function returns a pointer to a #hid_device object on success or NULL on failure. */ hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, std::string serial_number = ""); /** @brief Open a HID device by its path name. The path name be determined by calling hid_enumerate(), or a platform-specific path name can be used (eg: /dev/hidraw0 on Linux). @ingroup API @param path The path name of the device to open @returns This function returns a pointer to a #hid_device object on success or NULL on failure. */ hid_device * hid_open_path(std::string path); int hid_exit(void); #endif fldigi-4.2.05/src/include/fft-monitor.h0000664000175000017500000000361014611711171014612 00000000000000// ---------------------------------------------------------------------------- // fftmon.h -- frequency fftmon modem // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _fftmon_H #define _fftmon_H #include #include #include #include #include "filters.h" #include "fftfilt.h" #include "modem.h" #include "mbuffer.h" #include "gfft.h" extern void writeFile(); class fftmon : public modem { friend void toggle_scans(void *); public: #define fftmonFFT_LEN 8192 // approximately 1 sec of bpf'd audio stream #define LENdiv2 4096 private: double *fftbuff; double *dftbuff; double *buffer; cmplx *cmplxbuf; Cmovavg *fftfilt[LENdiv2]; double bshape[fftmonFFT_LEN]; int fftmon_sr; g_fft *scanfft; bool scans_stable; int numscans; inline double blackman(double x) { return (0.42 - 0.50 * cos(2 * M_PI * x) + 0.08 * cos(4 * M_PI * x)); } void update_fftscope(); public: fftmon(); ~fftmon(); void init(); void rx_init() {} void tx_init() {} void restart(); int rx_process(const double *buf, int len); int cmplx_process(const cmplx *buf, int len); int tx_process() { return -1; } }; #endif fldigi-4.2.05/src/include/digiscope.h0000664000175000017500000001002714611711171014314 00000000000000// ---------------------------------------------------------------------------- // digiscope.h, Miniature Oscilloscope/Phasescope Widget // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted in part from code contained in // gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef DIGISCOPE_H #define DIGISCOPE_H #include #include "complex.h" class Digiscope : public Fl_Widget { public: #define DEFAULT_WIDTH 100 #define DEFAULT_HEIGHT 100 #define MAX_LEN 4096 //1024 #define MAX_ZLEN 1024 #define NUM_GRIDS 100 enum scope_mode { SCOPE, PHASE, PHASE1, PHASE2, PHASE3, RTTY, XHAIRS, WWV, DOMDATA, DOMWF, BLANK }; private: scope_mode _mode; double _buf[MAX_LEN]; cmplx _zdata[MAX_ZLEN]; //int _zlen; int _zptr; unsigned char *vidbuf; unsigned char *vidline; int _len; int linecnt; double _phase; double _quality; double _flo, _fhi, _amp; double _x[NUM_GRIDS], _y[NUM_GRIDS]; bool _highlight; scope_mode phase_mode; protected: double _y_user1, _y_user2; double _x_user1, _x_user2; bool _x_graticule; bool _y_graticule; Fl_Color _bk_color; Fl_Color _axis_color; Fl_Color _color_1; Fl_Color _color_2; Fl_Color _color_3; Fl_Color _color_4; public: Digiscope(int, int, int, int, const char *label = ""); ~Digiscope(); int handle(int); void resize(int x, int y, int w, int h); void draw(); void draw_scope(); void draw_phase(); void draw_rtty(); void draw_xy(); void draw_video(); void data(double *data, int len, bool scale = true); void phase(double ph, double ql, bool hl); void video(double *data, int len, bool dir ); void zdata(cmplx *z, int len); void rtty(double flo, double fhi, double amp); void mode(scope_mode md); scope_mode mode() { return _mode;};\ void xaxis(int n, double y1) { if (n < NUM_GRIDS) _y[n] = y1; } void yaxis(int n, double x1) { if (n < NUM_GRIDS) _x[n] = x1; } void xaxis_1(double y1) { _y[1] = y1; } void xaxis_2(double y2) { _y[2] = y2; } void yaxis_1(double x1) { _x[1] = x1; } void yaxis_2(double x2) { _x[2] = x2; } void clear_axis() { for (int i = 0; i < NUM_GRIDS; i++) _x[i] = _y[i] = 0; } double x_user1() { return _x_user1; } void x_user1(double val) { _x_user1 = val; } double x_user2() { return _x_user2; } void x_user2(double val) { _x_user2 = val; } double y_user1() { return _y_user1; } void y_user1(double val) { _y_user1 = val; } double y_user2() { return _y_user2; } void y_user2(double val) { _y_user2 = val; } bool x_graticule() { return _x_graticule; } void x_graticule(bool b) { _x_graticule = b; } bool y_graticule() { return _y_graticule; } void y_graticule(bool b) { _y_graticule = b; } void bk_color(Fl_Color c) { _bk_color = c; } Fl_Color bk_color() { return _bk_color; } void axis_color(Fl_Color c) { _axis_color = c; } Fl_Color axis_color() { return _axis_color; } void user_color_1(Fl_Color c) { _color_1 = c; } Fl_Color user_color_1() { return _color_1; } void user_color_2(Fl_Color c) { _color_2 = c; } Fl_Color user_color_2() { return _color_2; } void user_color_3(Fl_Color c) { _color_3 = c; } Fl_Color user_color_3() { return _color_3; } void user_color_4(Fl_Color c) { _color_4 = c; } Fl_Color user_color_4() { return _color_4; } }; #endif fldigi-4.2.05/src/include/debug.h0000664000175000017500000000753214611711171013443 00000000000000// ---------------------------------------------------------------------------- // debug.h // // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _DEBUG_H_ #define _DEBUG_H_ #define DEBUG_PSKMAIL 0 #include #include #include #include "util.h" extern void rotate_log(std::string); class debug { public: enum level_e { QUIET_LEVEL, ERROR_LEVEL, WARN_LEVEL, INFO_LEVEL, VERBOSE_LEVEL, DEBUG_LEVEL, LOG_NLEVELS }; #ifdef FLARQ_DEBUG enum source_e { LOG_ARQCONTROL = 1 << 0, LOG_RPC_SERVER = 1 << 1, LOG_OTHER = 1 << 2 }; #else enum source_e { LOG_ARQCONTROL = 1 << 0, LOG_AUDIO = 1 << 1, LOG_MODEM = 1 << 2, LOG_RIGCONTROL = 1 << 3, LOG_RPC_CLIENT = 1 << 4, LOG_RPC_SERVER = 1 << 5, LOG_SPOTTER = 1 << 6, LOG_DATASOURCES = 1 << 7, LOG_SYNOP = 1 << 8, LOG_KML = 1 << 9, LOG_KISSCONTROL = 1 << 10, LOG_MACLOGGER = 1 << 11, LOG_FD = 1 << 12, LOG_N3FJP = 1 << 13, LOG_OTHER = 1 << 14 }; #endif static void start(const char* filename); static void stop(void); static void hex_dump(const char * func, const char * data, int len); static void log(level_e level, const char* func, const char* srcf, int line, const char* format, ...) format__(printf, 5, 6); static void elog(const char* func, const char* srcf, int line, const char* text); static void show(void); static level_e level; static unsigned int mask; private: static void sync_text(void*); debug(const char* filename); debug(const debug&); debug& operator=(const debug&); ~debug(); static debug* inst; }; #define LOG(level__, source__, ...) \ do { \ if (level__ <= debug::level && source__ & debug::mask) \ debug::log(level__, __func__, __FILE__, __LINE__, __VA_ARGS__); \ } while (0) #define LOG_DEBUG(...) LOG(debug::DEBUG_LEVEL, log_source_, __VA_ARGS__) #define LOG_VERBOSE(...) LOG(debug::VERBOSE_LEVEL, log_source_, __VA_ARGS__) #define LOG_INFO(...) LOG(debug::INFO_LEVEL, log_source_, __VA_ARGS__) #define LOG_WARN(...) LOG(debug::WARN_LEVEL, log_source_, __VA_ARGS__) #define LOG_ERROR(...) LOG(debug::ERROR_LEVEL, log_source_, __VA_ARGS__) #define LOG_HD(source__, a, b) \ do { \ if (source__ & debug::mask) \ debug::hex_dump(__func__, a, b); \ } while (0) #define LOG_HEX(a,b) LOG_HD(log_source_, a, b) #define LOG_PERROR(msg__) \ do { \ if (debug::ERROR_LEVEL <= debug::level && log_source_ & debug::mask) \ debug::elog(__func__, __FILE__, __LINE__, msg__); \ } while (0) unused__ static unsigned int log_source_ = debug::LOG_OTHER; #if defined(__GNUC__) && (__GNUC__ >= 3) # define LOG_FILE_SOURCE(source__) \ __attribute__((constructor)) \ static void log_set_source_(void) { log_source_ = source__; } #else # define LOG_FILE_SOURCE(source__) #endif #define LOG_SET_SOURCE(source__) log_source_ = source__ extern void mnu_debug_level_cb(); extern void btn_debug_source_cb(int n); extern void clear_debug(); extern void set_debug_mask(int mask); #endif // _DEBUG_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/notify.h0000664000175000017500000000244014611711171013656 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef NOTIFY_H_ #define NOTIFY_H_ #include "globals.h" extern void notify_start(void); extern void notify_stop(void); extern void notify_show(void); extern void notify_dxcc_show(bool readonly = true); extern void notify_change_callsign(void); extern void notify_rsid(trx_mode mode, int afreq); extern void notify_rsid_eot(trx_mode mode, int afreq); extern void notify_create_rsid_event(bool val); #endif // NOTIFY_H_ fldigi-4.2.05/src/include/stacktrace.h0000664000175000017500000000200714611711171014471 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef STACKTRACE_H #define STACKTRACE_H void pstack_maybe(void); void diediedie(void); void handle_signal(int s); #endif // STACKTRACE_H fldigi-4.2.05/src/include/YAESUkeying.h0000664000175000017500000000211314611711171014440 00000000000000// ---------------------------------------------------------------------------- // FTkeying.h serial string CW interface to Elecraft transceivers // // Copyright (C) 2020 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FTKEYING_H #define _FTKEYING_H extern bool use_FTkeyer; extern int FTwpm; extern void set_FTkeyer(); extern void FTkeyer_send_char(int); #endif fldigi-4.2.05/src/include/contest.h0000664000175000017500000000530614611711171014031 00000000000000// ---------------------------------------------------------------------------- // contest.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CONTEST_H #define _CONTEST_H #include enum CONTEST_FIELD { cCALL, cMODE, cNAME, cQTH, cSTATE, cVE_PROV, cDIST, cGRIDSQUARE, cCNTY, cCOUNTRY, cCQZ, cDXCC, cIOTA, cITUZ, cCONT, cSRX, cXCHG1, cSS_SERNO, cSS_PREC, cSS_CHK, cSS_SEC, cROOKIE, cCHECK, cKD_XCHG, cARR_XCHG, c1010, cRST, cNUMERIC, cCLASS, cFD_CLASS, cWFD_CLASS, cASCR_CLASS, cARRL_SECT, cFD_SECTION, cITALIAN }; struct CONTESTS { std::string name; std::string notes; }; // Contest, ST, TEST, rRST , rST, rCY, rSERNO, rXCHG, rNAME, rCAT, rSTCTY, Notes struct QSOP { const char *contest; const char *state; const char *instate; const char *rst; const char *st; const char *cnty; const char *serno; const char *xchg; const char *name; const char *cat; const char *stcty; const char *notes; }; class Ccontests { private: public: static struct QSOP qso_parties[]; Ccontests() {}; ~Ccontests() {}; const std::string names(); char rst(std::string party); char st(std::string party); char cnty(std::string party); char serno(std::string party); char sect(std::string party); char xchg(std::string party); char name(std::string party); char cat(std::string party); char stcty(std::string party); const char *notes(std::string party); }; extern Ccontests QSOparties; extern bool cut_numeric_test(std::string s); extern std::string cut_to_numeric(std::string s); extern int check_field(std::string s1, CONTEST_FIELD, std::string s2=""); extern void adjust_for_contest(void *); extern CONTESTS contests[]; extern std::string contest_names(); extern std::string country_match; extern bool state_test(std::string s); extern bool province_test(std::string s); extern bool country_test(std::string s); extern bool county_test(std::string st, std::string cty); extern bool section_test(std::string s); #endif fldigi-4.2.05/src/include/xmlreader.h0000664000175000017500000000300114532252172014326 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "irrXML.h" using namespace irr; using namespace io; class IIrrXMLStringReader: public IFileReadCallBack { const char *s; int len; int p; public: IIrrXMLStringReader(const char *szStr) { s = szStr; len = strlen(s); p=0; } IIrrXMLStringReader(const std::string &str) { s=str.c_str(); len = strlen(s); p=0; } int read(void * buffer, int sizeToRead) { char *sss = (char *)buffer; if (p >= len) return 0; int j = 0; for (int i = p; i < len && j < sizeToRead; ) { sss[j++] = s[i++]; } return 1; } int getSize() { return len-p; } }; fldigi-4.2.05/src/include/strutil.h0000664000175000017500000001327114611711171014060 00000000000000// ---------------------------------------------------------------------------- // strutil.h // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef STRUTIL_H_ #define STRUTIL_H_ #include #include #include #include #include #include #include std::vector split(const char* re_str, const char* str, unsigned max_split = UINT_MAX); // Fills a string with snprintf format string. std::string strformat( const char * fmt, ... ); // Eliminates spaces and tabs at the beginning and the end. void strtrim( std::string & str ); // First letter of each word in ucasestr, the rest in lowercase. void strcapitalize( std::string & str ); // Returns the replacement of all occurences of a given string by another. std::string strreplace( const std::string & inp, const std::string & from, const std::string & to ); /// Edit distance: Returns an integer which is the distance between the two strings. size_t levenshtein(const std::string & source, const std::string & target); // Conversion to ucasestr. std::string ucasestr( std::string str ); std::string ucasestr( const char *str); // find independent of case size_t ufind(std::string s1, std::string s2, size_t idx = 0); // ---------------------------------------------------------------------------- /// This is a read-only replacement for std::stringstream. struct imemstream : public std::streambuf, public std::istream { /// Faster than stringstream because no copy. imemstream(char* s, std::size_t n) : std::istream( this ) { setg(s, s, s + n); } /// Faster than stringstream because no copy. imemstream(const std::string & r) : std::istream( this ) { char * s = const_cast< char * >( r.c_str() ); setg(s, s, s + r.size()); } }; // ---------------------------------------------------------------------------- /// Tells if type is a char[]. Used for SFINAE. template< class T > struct DtTyp { /// In the general case, data types are not char arrays. struct Any {}; }; /// Matches if the type is a char[]. template< size_t N > struct DtTyp< char[N] > { struct Array {}; static const size_t Size = N ; }; /// Reads all chars until after the delimiter. bool read_until_delim( char delim, std::istream & istrm ); /// Reads a char followed by the delimiter. bool read_until_delim( char delim, std::istream & istrm, char & ref, const char dflt ); /// Reads a double up to the given delimiter. inline bool read_until_delim( char delim, std::istream & istrm, double & ref ) { istrm >> ref ; if( ! istrm ) return false ; char tmp = istrm.get(); if( istrm.eof() ) { /// Resets to good to mean that it worked fine. istrm.clear(); return true ; } return tmp == delim ; } /// Reads a string up to the given delimiter. inline bool read_until_delim( char delim, std::istream & istrm, std::string & ref ) { std::getline( istrm, ref, delim ); if ( (istrm.rdstate() & std::istream::goodbit) == 0 ) return true ; else return false ; } /// For reading from a string with tokens separated by a char. Used to load CSV files. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, typename DtTyp< Tp >::Any = typename DtTyp< Tp >::Any() ) { std::string parsed_str ; std::getline( istrm, parsed_str, delim ); if( ! ((istrm.rdstate() & std::istream::goodbit) == 0)) { return false ; } imemstream sstrm( parsed_str ); sstrm >> ref ; return true ; } /// Same, with a default value if there is nothing to read. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, const Tp dflt, typename DtTyp< Tp >::Any = typename DtTyp< Tp >::Any() ) { std::string parsed_str ; std::getline( istrm, parsed_str, delim ) ; if( ! ((istrm.rdstate() & std::istream::goodbit) == 0) ) { return false ; } if( parsed_str.empty() ) { ref = dflt ; return true; } imemstream sstrm( parsed_str ); sstrm >> ref ; return true ; } /// For reading from a string with tokens separated by a char to a fixed-size array. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, typename DtTyp< Tp >::Array = typename DtTyp< Tp >::Array() ) { istrm.getline( ref, DtTyp< Tp >::Size, delim ); // Should we return an error if buffer is too small? return( (istrm.rdstate() & std::istream::goodbit) == 0 ); } /// Same, with a default value if there is nothing to read. Fixed-size array. template< typename Tp > bool read_until_delim( char delim, std::istream & istrm, Tp & ref, const Tp dflt, typename DtTyp< Tp >::Array = typename DtTyp< Tp >::Array() ) { istrm.getline( ref, DtTyp< Tp >::Size, delim ); // If nothing to read, copy the default value. if( ref[0] == '\0' ) { strncpy( ref, dflt, DtTyp< Tp >::Size - 1 ); } // Should we return an error if buffer is too small? return ((istrm.rdstate() & std::istream::goodbit) == 0 ); } // ---------------------------------------------------------------------------- #endif // STRUTIL_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/squelch_status.h0000664000175000017500000000506114611711171015417 00000000000000// ---------------------------------------------------------------------------- // // squelch_status.h // // Copyright (C) 2021 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef MODE_STATUS_H #define MODE_STATUS_H #include #include "configuration.h" #include "status.h" #include "main.h" #include "fl_digi.h" #include "trx.h" #include "globals.h" #include "qrunner.h" extern void show_band_mode_change(); // C++ code support class ModeBand { #define SS_160 1800000 #define SS_80 3500000 #define SS_75 3800000 #define SS_40 7000000 #define SS_30 10100000 #define SS_20 14000000 #define SS_17 18068000 #define SS_15 21000000 #define SS_12 24890000 #define SS_10 28000000 #define SS_6 50000000 #define SS_2 144000000 #define SS_220 222000000 #define SS_440 420000000 #define SS_HI 902000000 struct MODEBAND { int txlevel; int rev; int afc; int sqstate; int sqlevel; }; enum SQL_STATE { STATE_OFF, STATE_ON }; enum BANDS { BND_LO, BND_160, BND_80, BND_75, BND_40, BND_30, BND_20, BND_17, BND_15, BND_12, BND_10, BND_6, BND_2, BND_220, BND_440, BND_HI, NUMBANDS }; static const char *bands[]; private: MODEBAND mode_bands[NUM_MODES][NUMBANDS]; trx_mode mode_in_use; int band_in_use; bool band_changed(); bool mode_changed(); void init(); public: ModeBand() { mode_in_use = -1; band_in_use = -1; init(); load_mode_state(); } ~ModeBand() { save_mode_state(); } void set_mode_squelch( double sqlch); double get_mode_squelch(); void set_mode_squelch_onoff(int sql); int get_mode_squelch_onoff(); void set_mode_txlevel(double sqlch); double get_mode_txlevel(); void set_mode_afc(int sql); int get_mode_afc(); void set_mode_reverse(int rev ); int get_mode_reverse(); void band_mode_change(); void save_mode_state(); void load_mode_state(); }; extern ModeBand modeband; #endif fldigi-4.2.05/src/include/socket.h0000664000175000017500000001272414611711171013644 00000000000000// ---------------------------------------------------------------------------- // socket.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef SOCKET_H_ #define SOCKET_H_ #include #include #ifndef __MINGW32__ # include # include # if defined(__OpenBSD__) && defined(nitems) # undef nitems # endif # include #else #undef _WINSOCKAPI_ # include # include # ifndef ENOTCONN # define ENOTCONN WSAENOTCONN # endif #endif #include #include #include #define S_BUFSIZ 16384 class SocketException : public std::exception { public: SocketException(int err_ = 0) : err(err_), msg(err_to_str(err_)) { } SocketException(const char* msg_) : err(1), msg(msg_) { } SocketException(int err_, const std::string& prefix) : err(err_), msg(std::string(prefix).append(": ").append(err_to_str(err_))) { } virtual ~SocketException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: const char* err_to_str(int e) { #if HAVE_GETADDRINFO if (e < 0) return gai_strerror(e); else #endif return strerror(e); } int err; std::string msg; }; #if HAVE_GETADDRINFO typedef struct addrinfo addr_info_t; #else struct addr_info_t { int ai_family; int ai_socktype; int ai_protocol; int ai_addrlen; struct sockaddr * ai_addr; }; #endif class Address { public: Address(const char* host = "", int port = 0, const char* proto_name = "tcp"); Address(const char* host, const char* port_name, const char* proto_name = "tcp"); Address(const Address& addr); ~Address(); Address& operator=(const Address& rhs); size_t size(void) const; const addr_info_t* get(size_t n = 0) const; const addr_info_t* udp_get_recv_addr(void); static std::string get_str(const addr_info_t* addr); unsigned int get_udp_io_port() {return port_io;}; unsigned int get_udp_o_port() {return port_out;}; std::string get_service() {return service;}; std::string get_node() {return node;}; private: void lookup(const char* proto_name); std::string node; std::string service; unsigned int port_io; unsigned int port_out; #if HAVE_GETADDRINFO struct addrinfo* info; #else struct hostent host_entry; struct servent service_entry; mutable addr_info_t addr; mutable struct sockaddr_in saddr; #endif bool copied; }; class Socket { public: Socket(const Address& addr); Socket(int fd = -1); Socket(const Socket& s); ~Socket(); Socket& operator=(const Socket& rhs); void open(const Address& addr); void close(void); bool wait(int dir); // Server void bind(void); void bindUDP(void); void listen(int backlog = SOMAXCONN); Socket accept(void); Socket accept1(void); Socket * accept2(void); // Client int connect(const Address& addr); int connect(void); bool connect1(void); // Data Transimission size_t send(const void* buf, size_t len); size_t send(const std::string& buf); size_t recv(void* buf, size_t len); size_t recv(std::string& buf); // Unconnected Data Transmission size_t sendTo(const void* buf, size_t len); size_t sendTo(const std::string& buf); size_t recvFrom(void* buf, size_t len); size_t recvFrom(std::string& buf); // Options int get_bufsize(int dir); void set_bufsize(int dir, int len); void set_nonblocking(bool v = true); void set_nodelay(bool v = true); void set_timeout(const struct timeval& t); void set_timeout(double t); void set_autoclose(bool v) const; void set_close_on_exec(bool v, int fd = -1); void broadcast(bool flag); // Other unsigned int get_port(struct sockaddr *sa); void set_port(struct sockaddr *sa, unsigned int port); unsigned long get_address4(struct sockaddr *sa); void dual_port(int * dual_port); void set_dual_port_number(unsigned int dual_port_number); void set_dual_port_number(std::string port); unsigned int get_dual_port_number(void) { return dual_port_number; }; unsigned int get_local_port() { return (unsigned int) atoi(address.get_service().c_str()); }; unsigned long get_to_address(void); int use_dual_port(void) { if(use_kiss_dual_port) return *use_kiss_dual_port; else return 0; }; bool is_connected(void); int fd(void); void shut_down(void); private: int sockfd; Address address; size_t anum; const addr_info_t* ainfo; char* buffer; struct timeval timeout; bool nonblocking; mutable bool autoclose; struct sockaddr_storage saddr; struct sockaddr_storage saddr_dp; unsigned int saddr_size; int *use_kiss_dual_port; unsigned int dual_port_number; bool connected_flag; }; #endif // SOCKET_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/pkg.h0000664000175000017500000000261114532252172013132 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PKG_H_ #define PKG_H_ #include #if BUILD_FLDIGI # define PACKAGE_AUTHORS FLDIGI_AUTHORS #else # define PACKAGE_AUTHORS FLARQ_AUTHORS # undef PACKAGE # define PACKAGE "flarq" # undef PACKAGE_NAME # define PACKAGE_NAME "flarq" # undef PACKAGE_TARNAME # define PACKAGE_TARNAME "flarq" # undef PACKAGE_VERSION # define PACKAGE_VERSION FLARQ_VERSION # undef PACKAGE_STRING # define PACKAGE_STRING PACKAGE_TARNAME " " PACKAGE_VERSION # undef VERSION # define VERSION PACKAGE_VERSION #endif #endif fldigi-4.2.05/src/include/rigclass.h0000664000175000017500000000527514532252172014171 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _RIGCLASS_H #define _RIGCLASS_H #include #include #include class RigException : public std::exception { public: RigException(int e = 0) : err(e), msg(rigerror(e)) { } RigException(const char* m) : err(0), msg(m) { } RigException(const char* prefix, int e) : err(e), msg(std::string(prefix).append(": ").append(rigerror(e))) { } virtual ~RigException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: int err; std::string msg; }; class Rig { protected: RIG *rig; // Global ref. to the rig freq_t fnull; public: Rig(); Rig(rig_model_t rig_model); virtual ~Rig(); void init(rig_model_t rig_model); bool isOnLine() { return rig; } // This method open the communication port to the rig void open(void); // This method close the communication port to the rig void close(bool abort = false); void setFreq(freq_t freq, vfo_t vfo = RIG_VFO_CURR); freq_t getFreq(vfo_t vfo = RIG_VFO_CURR); bool canSetFreq(); bool canGetFreq(); void setMode(rmode_t, pbwidth_t width = RIG_PASSBAND_NORMAL, vfo_t vfo = RIG_VFO_CURR); rmode_t getMode(pbwidth_t&, vfo_t vfo = RIG_VFO_CURR); bool canSetMode(); bool canGetMode(); void setPTT (ptt_t ptt, vfo_t vfo = RIG_VFO_CURR); ptt_t getPTT (vfo_t vfo = RIG_VFO_CURR); bool canSetPTT(); bool canGetPTT(); void setVFO(vfo_t); vfo_t getVFO(); void setConf(token_t token, const char *val); void setConf(const char *name, const char *val); void getConf(token_t token, char *val); void getConf(const char *name, char *val); const char *getName(); const struct rig_caps* getCaps(void); token_t tokenLookup(const char *name); pbwidth_t passbandNormal (rmode_t mode); pbwidth_t passbandNarrow (rmode_t mode); pbwidth_t passbandWide (rmode_t mode); }; #endif fldigi-4.2.05/src/include/thor.h0000664000175000017500000001216314611711171013325 00000000000000// ---------------------------------------------------------------------------- // thor.h -- thor modem // // Copyright (C) 2008-2012 // David Freese // John Douyere // John Phelps // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _thor_H #define _thor_H #include #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "dominovar.h" #include "mbuffer.h" #include "picture.h" #include // NASA coefficients for viterbi encode/decode algorithms #define THOR_K 7 #define THOR_POLY1 0x6d #define THOR_POLY2 0x4f //VK2ETA high speed modes // IEEE coefficients for viterbi encode/decode algorithms #define THOR_K15 15 #define K15_POLY1 044735 #define K15_POLY2 063057 //#include "mfskvaricode.h" #include "interleave.h" #include "viterbi.h" #define THORNUMTONES 18 #define THORMAXFFTS 8 #define THORBASEFREQ 1500.0 #define THORFIRSTIF 2000.0 #define THORSCOPESIZE 64 #define THORSLOWPATHS 3 #define THORFASTPATHS 5 #define THOR_IMAGESPP 10 // the following constant changes if a mode with more tones than 25x4 is // created #define MAXPATHS (8 * THORFASTPATHS * THORNUMTONES ) struct THORrxpipe { cmplx vector[THORMAXFFTS * THORNUMTONES * 6]; }; class thor : public modem { public: enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_IMAGE, TX_STATE_AVATAR, TX_STATE_FLUSH, TX_STATE_RECEIVE }; enum THOR_STATE { TEXT, IMAGE_START, IMAGE_SYNC, IMAGE }; protected: // common variables double phase[THORMAXFFTS + 1]; double txphase; int symlen; int doublespaced; double tonespacing; int counter; unsigned int twosym; int paths; int numbins; bool slowcpu; int basetone; int lotone; int hitone; int extones; // rx variables C_FIR_filter *hilbert; sfft *binsfft[THORMAXFFTS]; fftfilt *fft; Cmovavg *vidfilter[THORSCOPESIZE]; Cmovavg *syncfilter; THORrxpipe *pipe; unsigned int pipeptr; unsigned int datashreg; mbuffer scopedata; mbuffer videodata; cmplx currvector; int currsymbol; int prev1symbol; int prev2symbol; double currmag; double prev1mag; double prev2mag; double met1; double met2; double sig; double noise; double s2n; int synccounter; unsigned char symbolbuf[MAX_VARICODE_LEN]; int symcounter; int symbolbit; bool filter_reset; bool staticburst; int fec_confidence; // tx variables int txstate; int txprevtone; unsigned int bitshreg; std::string strSecXmtText; unsigned int cptr; viterbi *Dec; interleave *Rxinlv; encoder *Enc; interleave *Txinlv; int bitstate; unsigned char symbolpair[2]; int flushlength; private: cmplx mixer(int n, const cmplx& in); // Rx void recvchar(int c); void decodesymbol(); void softdecodesymbol(); int harddecode(); int softdecode(); void update_syncscope(); void synchronize(); void reset_afc(); void eval_s2n(); int get_secondary_char(); void reset_filters(); void decodePairs(unsigned char symbol); bool preambledetect(int c); void softflushrx(); void parse_pic(int); // Tx void sendtone(int tone, int duration); void sendsymbol(int sym); void sendchar(unsigned char c, int secondary); void sendidle(); void sendsecondary(); void flushtx(); void Clearbits(); protected: void s2nreport(void); public: thor (trx_mode md); ~thor (); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); // support for thor image transfers private: double amplitude; double pixel; double sync; double img_phase; unsigned char tx_pixel; int tx_pixelnbr; int image_mode; public: int byte; double picf; double picpeak; C_FIR_filter *picfilter; Cmovavg *pixfilter; Cmovavg *pixsyncfilter; double phidiff; double pic_phase; cmplx prevz; cmplx currz; double image_freq[10]; int image_counter; int picW; int picH; int row; int col; int rgb; int pixelnbr; static int IMAGEspp; int TXspp; static std::string imageheader; static std::string avatarheader; std::string pic_str; THOR_STATE state; bool b_ava; void recvpic(double smpl); void send_image(); void send_avatar(); void thor_send_avatar(); void m_thor_send_avatar(); void thor_send_image(std::string s = "", bool gray = false); }; extern void init_def_thor_avatar(Fl_Group *w); #endif fldigi-4.2.05/src/include/ascii.h0000664000175000017500000000241214532252172013440 00000000000000// ---------------------------------------------------------------------------- // ascii.h -- ASCII table // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef ASCII_H #define ASCII_H extern const char *ascii[]; extern const char *ascii2[]; extern const char *ascii3[]; #define SOH 0x01 // SOH ascii character #define EOT 0x04 // EOT ascii character #endif fldigi-4.2.05/src/include/Fl_Text_Editor_mod.H0000664000175000017500000001305714532252172016031 00000000000000// // "$Id: Fl_Text_Editor_mod.H 7903 2010-11-28 21:06:39Z matt $" // // Header file for Fl_Text_Editor_mod class. // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* \file Fl_Text_Editor_mod widget . */ #ifndef Fl_Text_Editor_mod_H #define Fl_Text_Editor_mod_H #include "Fl_Text_Display_mod.H" // key will match in any state #define Fl_Text_Editor_mod_ANY_STATE (-1L) /** This is the FLTK text editor widget. It allows the user to edit multiple lines of text and supports highlighting and scrolling. The buffer that is displayed in the widget is managed by the Fl_Text_Buffer_mod class. */ class FL_EXPORT Fl_Text_Editor_mod : public Fl_Text_Display_mod { public: /** Key function binding callback type */ typedef int (*Key_Func)(int key, Fl_Text_Editor_mod* editor); /** Simple linked list associating a key/state to a function */ struct Key_Binding { int key; ///< the key pressed int state; ///< the state of key modifiers Key_Func function; ///< associated function Key_Binding* next; ///< next key binding in the list }; Fl_Text_Editor_mod(int X, int Y, int W, int H, const char* l = 0); ~Fl_Text_Editor_mod() { remove_all_key_bindings(); } virtual int handle(int e); /** Sets the current insert mode; if non-zero, new text is inserted before the current cursor position. Otherwise, new text replaces text at the current cursor position. */ void insert_mode(int b) { insert_mode_ = b; } /** Gets the current insert mode; if non-zero, new text is inserted before the current cursor position. Otherwise, new text replaces text at the current cursor position. */ int insert_mode() { return insert_mode_; } void add_key_binding(int key, int state, Key_Func f, Key_Binding** list); /** Adds a key of state "state" with the function "function" */ void add_key_binding(int key, int state, Key_Func f) { add_key_binding(key, state, f, &key_bindings); } void remove_key_binding(int key, int state, Key_Binding** list); /** Removes the key binding associated with the key "key" of state "state". */ void remove_key_binding(int key, int state) { remove_key_binding(key, state, &key_bindings); } void remove_all_key_bindings(Key_Binding** list); /** Removes all of the key bindings associated with the text editor or list. */ void remove_all_key_bindings() { remove_all_key_bindings(&key_bindings); } void add_default_key_bindings(Key_Binding** list); Key_Func bound_key_function(int key, int state, Key_Binding* list); /** Returns the function associated with a key binding. */ Key_Func bound_key_function(int key, int state) { return bound_key_function(key, state, key_bindings); } /** Sets the default key function for unassigned keys. */ void default_key_function(Key_Func f) { default_key_function_ = f; } // functions for the built in default bindings static int kf_default(int c, Fl_Text_Editor_mod* e); static int kf_ignore(int c, Fl_Text_Editor_mod* e); static int kf_backspace(int c, Fl_Text_Editor_mod* e); static int kf_enter(int c, Fl_Text_Editor_mod* e); static int kf_move(int c, Fl_Text_Editor_mod* e); static int kf_shift_move(int c, Fl_Text_Editor_mod* e); static int kf_ctrl_move(int c, Fl_Text_Editor_mod* e); static int kf_c_s_move(int c, Fl_Text_Editor_mod* e); static int kf_meta_move(int c, Fl_Text_Editor_mod* e); static int kf_m_s_move(int c, Fl_Text_Editor_mod* e); static int kf_home(int, Fl_Text_Editor_mod* e); static int kf_end(int c, Fl_Text_Editor_mod* e); static int kf_left(int c, Fl_Text_Editor_mod* e); static int kf_up(int c, Fl_Text_Editor_mod* e); static int kf_right(int c, Fl_Text_Editor_mod* e); static int kf_down(int c, Fl_Text_Editor_mod* e); static int kf_page_up(int c, Fl_Text_Editor_mod* e); static int kf_page_down(int c, Fl_Text_Editor_mod* e); static int kf_insert(int c, Fl_Text_Editor_mod* e); static int kf_delete(int c, Fl_Text_Editor_mod* e); static int kf_copy(int c, Fl_Text_Editor_mod* e); static int kf_cut(int c, Fl_Text_Editor_mod* e); static int kf_paste(int c, Fl_Text_Editor_mod* e); static int kf_select_all(int c, Fl_Text_Editor_mod* e); static int kf_undo(int c, Fl_Text_Editor_mod* e); protected: int handle_key(); void maybe_do_callback(); #ifndef FL_DOXYGEN int insert_mode_; Key_Binding* key_bindings; static Key_Binding* global_key_bindings; Key_Func default_key_function_; #endif }; #endif // // End of "$Id: Fl_Text_Editor_mod.H 7903 2010-11-28 21:06:39Z matt $". // fldigi-4.2.05/src/include/notifydialog.h0000664000175000017500000000410714611711171015040 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef notifydialog_h #define notifydialog_h #include #include "table.h" #include "flinput2.h" #include "flslider2.h" #include #include extern Fl_Group *grpNotifyEvent; #include extern Fl_Choice *mnuNotifyEvent; #include extern Fl_Light_Button *btnNotifyEnabled; extern Fl_Input2 *inpNotifyRE; extern Fl_Group *grpNotifyFilter; #include extern Fl_Round_Button *chkNotifyFilterCall; extern Fl_Input2 *inpNotifyFilterCall; extern Fl_Round_Button *chkNotifyFilterDXCC; #include extern Fl_Button *btnNotifyFilterDXCC; #include extern Fl_Check_Button *chkNotifyFilterNWB; extern Fl_Check_Button *chkNotifyFilterLOTW; extern Fl_Check_Button *chkNotifyFilterEQSL; extern Fl_Group *grpNotifyDup; extern Fl_Check_Button *chkNotifyDupIgnore; extern Fl_Choice *mnuNotifyDupWhich; extern Fl_Spinner2 *cntNotifyDupTime; extern Fl_Check_Button *chkNotifyDupBand; extern Fl_Check_Button *chkNotifyDupMode; extern Fl_Group *grpNotifyAction; extern Fl_Spinner2 *cntNotifyActionLimit; extern Fl_Input2 *inpNotifyActionDialog; extern Fl_Button *btnNotifyActionDialogDefault; extern Fl_Spinner2 *cntNotifyActionDialogTimeout; extern Fl_Input2 *inpNotifyActionRXMarker; extern Fl_Button *btnNotifyActionMarkerDefault; extern Fl_Input2 *inpNotifyActionMacro; extern Fl_Button *btnNotifyActionMacro; extern Fl_Input2 *inpNotifyActionProgram; extern Fl_Button *btnNotifyActionProgram; extern Fl_Button *btnNotifyAdd; extern Fl_Button *btnNotifyRemove; extern Fl_Button *btnNotifyUpdate; extern Fl_Button *btnNotifyTest; extern Fl_Button *btnNotifyClose; extern Table *tblNotifyList; Fl_Double_Window* make_notify_window(); extern Table *tblNotifyFilterDXCC; extern Fl_Input2 *inpNotifyDXCCSearchCountry; extern Fl_Input2 *inpNotifyDXCCSearchCallsign; extern Fl_Button *btnNotifyDXCCSelect; extern Fl_Button *btnNotifyDXCCDeselect; extern Fl_Button *btnNotifyDXCCClose; Fl_Double_Window* make_dxcc_window(); #endif fldigi-4.2.05/src/include/hid_mac.h0000664000175000017500000002751514611711171013744 00000000000000/*********************************************************************** HIDAPI - Multi-Platform library for communication with HID devices. hid_mac.h Alan Ott Signal 11 Software Copyright 2009, All Rights Reserved. C++ implementation * Copyright 2021 * David Freese, W1HKJ * for use in fldigi This software is licensed under the terms of the GNU General Public License v3. ***********************************************************************/ /** @file * @defgroup API hidapi API */ #ifndef HIDAPI_H__ #define HIDAPI_H__ #include #include #include #include #include #include #include #include #include #include #include #include #include /* Linked List of input reports received from the device. */ class input_report { public: uint8_t *data; size_t len; input_report *next; }; /* Barrier implementation because Mac OSX doesn't have pthread_barrier. It also doesn't have clock_gettime(). So much for POSIX and SUSv2. This implementation came from Brent Priddy and was posted on StackOverflow. It is used with his permission. */ typedef int pthread_barrierattr_t; typedef struct pthread_barrier { pthread_mutex_t mutex; pthread_cond_t cond; int count; int trip_count; } pthread_barrier_t; extern int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count); extern int pthread_barrier_destroy(pthread_barrier_t *barrier); extern int pthread_barrier_wait(pthread_barrier_t *barrier); class hid_device { public: IOHIDDeviceRef device_handle; int blocking; int uses_numbered_reports; int disconnected; CFStringRef run_loop_mode; CFRunLoopRef run_loop; CFRunLoopSourceRef source; uint8_t *input_report_buf; CFIndex max_input_report_len; input_report *input_reports; pthread_t thread; pthread_mutex_t mutex; /* Protects input_reports */ pthread_cond_t condition; pthread_barrier_t barrier; /* Ensures correct startup sequence */ pthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */ int shutdown_thread; hid_device() { device_handle = NULL; blocking = 1; uses_numbered_reports = 0; disconnected = 0; run_loop_mode = NULL; run_loop = NULL; source = NULL; input_report_buf = NULL; input_reports = NULL; shutdown_thread = 0; /* Thread objects */ pthread_mutex_init(&mutex, NULL); pthread_cond_init(&condition, NULL); pthread_barrier_init(&barrier, NULL, 2); pthread_barrier_init(&shutdown_barrier, NULL, 2); } ~hid_device() { hid_close(); } /** @brief Write an Output report to a HID device. The first byte of @p data[] must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to hid_write() will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to hid_write(), the Report ID (or 0x0, for devices with a single report), followed by the report data (16 bytes). In this example, the length passed in would be 17. hid_write() will send the data on the first OUT endpoint, if one exists. If it does not, it will send the data through the Control Endpoint (Endpoint 0). @ingroup API @param data The data to send, including the report number as the first byte. @param length The length in bytes of the data to send. @returns This function returns the actual number of bytes written and -1 on error. */ int hid_write(const unsigned char *data, size_t length); /** @brief Read an Input report from a HID device with timeout. Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports. @ingroup API @param data A buffer to put the read data into. @param length The number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number. @param milliseconds timeout in milliseconds or -1 for blocking wait. @returns This function returns the actual number of bytes read and -1 on error. If no packet was available to be read within the timeout period, this function returns 0. */ int hid_read_timeout(unsigned char *data, size_t length, int milliseconds); /** @brief Read an Input report from a HID device. Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports. @ingroup API @param device A device handle returned from hid_open(). @param data A buffer to put the read data into. @param length The number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number. @returns This function returns the actual number of bytes read and -1 on error. If no packet was available to be read and the handle is in non-blocking mode, this function returns 0. */ int hid_read(unsigned char *data, size_t length); /** @brief Get a feature report from a HID device. Set the first byte of @p data[] to the Report ID of the report to be read. Make sure to allow space for this extra byte in @p data[]. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1]. @ingroup API @param device A device handle returned from hid_open(). @param data A buffer to put the read data into, including the Report ID. Set the first byte of @p data[] to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports. @param length The number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report. @returns This function returns the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on error. */ int hid_get_feature_report(unsigned char *data, size_t length); /** @brief Set the device handle to be non-blocking. In non-blocking mode calls to hid_read() will return immediately with a value of 0 if there is no data to be read. In blocking mode, hid_read() will wait (block) until there is data to read before returning. Nonblocking can be turned on and off at any time. @ingroup API @param device A device handle returned from hid_open(). @param nonblock enable or not the nonblocking reads - 1 to enable nonblocking - 0 to disable nonblocking. @returns This function returns 0 on success and -1 on error. */ int hid_set_nonblocking(int nonblock); /** @brief Send a Feature report to the device. Feature reports are sent over the Control endpoint as a Set_Report transfer. The first byte of @p data[] must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to hid_send_feature_report() will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to hid_send_feature_report(): the Report ID (or 0x0, for devices which do not use numbered reports), followed by the report data (16 bytes). In this example, the length passed in would be 17. @ingroup API @param device A device handle returned from hid_open(). @param data The data to send, including the report number as the first byte. @param length The length in bytes of the data to send, including the report number. @returns This function returns the actual number of bytes written and -1 on error. */ int hid_send_feature_report(const unsigned char *data, size_t length); int cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); int cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime); int return_data(unsigned char *data, size_t length); int set_report(IOHIDReportType type, const unsigned char *data, size_t length); void register_error(const char *op); void hid_close(); const char* hid_error(); }; /// hidapi info structure class hid_device_info { public: std::string path; unsigned short vendor_id; unsigned short product_id; unsigned short release_number; std::string str_serial_number; std::string str_manufacturer_string; std::string str_product_string; unsigned short usage_page; // Usage Page for this Device/Interface (Windows/Mac only). unsigned short usage;// Usage for this Device/Interface (Windows/Mac only).*/ /** The USB interface which this logical device represents. Valid on both Linux implementations in all cases, and valid on the Windows implementation only if the device contains more than one interface. */ int interface_number; hid_device_info *next; hid_device_info() { } ~hid_device_info() { } }; /** @brief Initialize the HIDAPI library. This function initializes the HIDAPI library. Calling it is not strictly necessary, as it will be called automatically by hid_enumerate() and any of the hid_open_*() functions if it is needed. This function should be called at the beginning of execution however, if there is a chance of HIDAPI handles being opened by different threads simultaneously. @ingroup API @returns This function returns 0 on success and -1 on error. */ int hid_init(void); /** @brief Finalize the HIDAPI library. This function frees all of the static data associated with HIDAPI. It should be called at the end of execution to avoid memory leaks. @ingroup API @returns This function returns 0 on success and -1 on error. */ int hid_exit(void); /** @brief Enumerate the HID Devices. This function returns a linked list of all the HID devices attached to the system which match vendor_id and product_id. If @p vendor_id is set to 0 then any vendor matches. If @p product_id is set to 0 then any product matches. If @p vendor_id and @p product_id are both set to 0, then all HID devices will be returned. @ingroup API @param vendor_id The Vendor ID (VID) of the types of device to open. @param product_id The Product ID (PID) of the types of device to open. @returns This function returns a pointer to a linked list of type struct #hid_device, containing information about the HID devices attached to the system, or NULL in the case of failure. Free this linked list by calling hid_free_enumeration(). */ hid_device_info *hid_enumerate(unsigned short vendor_id, unsigned short product_id); /** @brief Free an enumeration Linked List This function frees a linked list created by hid_enumerate(). @ingroup API @param devs Pointer to a list of struct_device returned from hid_enumerate(). */ void hid_free_enumeration(hid_device_info *devs); /** @brief Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally a serial number. If @p serial_number is NULL, the first device with the specified VID and PID is opened. @ingroup API @param vendor_id The Vendor ID (VID) of the device to open. @param product_id The Product ID (PID) of the device to open. @param serial_number The Serial Number of the device to open (Optionally NULL). @returns This function returns a pointer to a #hid_device object on success or NULL on failure. */ hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, std::string serial_number = ""); /** @brief Open a HID device by its path name. The path name be determined by calling hid_enumerate(), or a platform-specific path name can be used (eg: /dev/hidraw0 on Linux). @ingroup API @param path The path name of the device to open @returns This function returns a pointer to a #hid_device object on success or NULL on failure. */ hid_device * hid_open_path(std::string path); /** @brief Close a HID device. @ingroup API @param device A device handle returned from hid_open(). */ #endif fldigi-4.2.05/src/include/ifkp.h0000664000175000017500000000771714611711171013313 00000000000000// ---------------------------------------------------------------------------- // ifkp.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _IFKP_H #define _IFKP_H #include #include "trx.h" #include "modem.h" #include "complex.h" #include "filters.h" #include "picture.h" #include class ifkp : public modem { #define IFKP_FFTSIZE 4096 #define IFKP_SYMLEN 4096 #define IFKP_BLOCK_SIZE IFKP_FFTSIZE #define IFKP_SHIFT_SIZE (IFKP_SYMLEN / 16) //#define IFKP_SR 8000 //16000 #define IFKP_SPACING 3 #define IFKP_OFFSET 1 #define IFKP_NUMBINS 151 // 3 bin spacing #define IMAGESPP 8 //16 , 12, 8 enum IFKP_STATE {TEXT, IMAGE_START, IMAGE_SYNC, IMAGE}; public: int symlen; protected: // Rx double rx_stream[IFKP_BLOCK_SIZE + IFKP_SHIFT_SIZE]; cmplx fft_data[2*IFKP_FFTSIZE]; double a_blackman[IFKP_BLOCK_SIZE]; C_FIR_filter *rxfilter; double tones[IFKP_NUMBINS]; Cmovavg *binfilt[IFKP_NUMBINS]; int movavg_size; int bkptr; g_fft *fft; Cmovavg *snfilt; double val; double max; double noise; double noisepower; int peak; int prev_peak; int last_peak; int peak_counter; int peak_hits; int symbol; int prev_symbol; int curr_nibble; int prev_nibble; int nibbles[199]; void process_symbol(int); void parse_pic(int); double s2n; char szestimate[40]; std::string station_calling; std::string rx_text; std::string toprint; std::string pic_str; IFKP_STATE state; // Tx // C_FIR_filter *xmtfilt; double baud; int tone; int prevtone; double txphase; bool send_bot; void transmit(double *buf, int len); void send_char (int); void send_idle (); void send_symbol(int sym); void send_tone(int tone); std::string xmt_string; double xmtdelay(); // RxTx int basetone; double metric; bool ch_sqlch_open; std::string mycall; void show_mode(); void process_tones(); bool valid_char(int); std::string heard_log_fname; std::string audit_log_fname; std::ofstream heard_log; std::ofstream audit_log; static std::string imageheader; static std::string avatarheader; public: //---- // virtual in base class ifkp (trx_mode md); ~ifkp (); void init (); void rx_init (); void rx_reset (); void restart (); void tx_init (); int rx_process (const double *buf, int len); int tx_process (); void set_freq(double); void init_nibbles(); //---- // support for ifkp image transfers private: double pixel; double sync; bool TX_IMAGE; bool TX_AVATAR; unsigned char tx_pixel; int tx_pixelnbr; int image_mode; bool b_ava; public: int byte; double picf; double picpeak; C_FIR_filter *picfilter; Cmovavg *pixfilter; Cmovavg *ampfilter; Cmovavg *syncfilter; double phidiff; double phase; cmplx prevz; cmplx currz; double image_freq[10]; int image_counter; int picW; int picH; int row; int col; int rgb; int pixelnbr; static int IMAGEspp; int TXspp; void recvpic(double smpl); void send_image(); void send_avatar(); void ifkp_send_avatar(); void m_ifkp_send_avatar(); void ifkp_send_image(std::string s = "", bool grey = false); void toggle_logs(); }; extern void init_def_ifkp_avatar(Fl_Group *w); #endif fldigi-4.2.05/src/include/kiss_io.h0000664000175000017500000000716714611711171014021 00000000000000// ---------------------------------------------------------------------------- // kiss_io.h // // Support for KISS interface // // Copyright (c) 2014, 2016 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef KISSIO_H #define KISSIO_H #include #include #include "threads.h" #include "socket.h" #include "modem.h" #include "psm/psm.h" #define HDLC_CNT_OFFSET 32 #define HDLC_CNT 0xDE #define HDLC_TCNT 0xE0 #define KISS_FEND 0xC0 #define KISS_FESC 0xDB #define KISS_TFEND 0xDC #define KISS_TFESC 0xDD #define KISS_DATA 0x00 #define KISS_TXDELAY 0x01 #define KISS_PERSIST 0x02 #define KISS_SLOTTIME 0x03 #define KISS_TXTAIL 0x04 #define KISS_DUPLEX 0x05 #define KISS_HARDWARE 0x06 #define KISS_RAW 0x07 // Non standard frame type for ARQ use #define KISS_RETURN 0x0F #define KISS_RAW_DISABLED 0x00 #define KISS_RAW_ONLY 0x01 #define KISS_RAW_ON 0x02 #define KISS_CMD(a) (a & 0x0F) #define KISS_PORT(a) ((a & 0xF0) >> 4) #define SET_KISS_TYPE_PORT(t,p) ((t & 0x0F) | ((p << 4) & 0xF0)) #define SMACK_CRC(a) (a & 0x08) #define SMACK_CRC_MASK(a) (a & 0xF7) #define SMACK_CRC_ASSIGN(a) ((a | 0x08) & 0xFF) #define CRC_LOW(a) (a & 0xFF) #define CRC_HIGH(a) ((a >> 8) & 0xFF) #define CRC_LOW_HIGH(l,h) (((h << 8) & 0xFF00) | (l & 0xFF)) #define CRC16_NONE 0 #define CRC16_CCITT 1 #define CRC16_FCS 2 #define CRC8_XOR 3 #define KISS_INVALID 512 #define KISS_HALF_DUPLEX 0 #define KISS_FULL_DUPLEX 1 #define BUFFER_PADDING 32 #define KISS_BUFFER_FACTOR 2 #define HDLC_BUFFER_FACTOR 3 #define KISS_CONNECT_RETRY_COUNT 10 #define KISS_RETRY_WAIT_TIME 1000 #define MAX_TEMP_BUFFER_SIZE 32000 #define TX_BUFFER_TIMEOUT (60 * 10) // Ten minute timeout #define DISABLE_TX_INHIBIT_DURATION 5 #define KPSQL_MIN_BANDWIDTH 400 #define TEST_INTERVAL_SECONDS 15 typedef struct { char *data; size_t size; } KISS_QUEUE_FRAME; typedef struct { char *cmd; void (*cmd_func) (char *arg); } EXEC_HARDWARE_CMD_MATCH; #define AX25_FRAME_MARKER 0xFF extern time_t temp_disable_tx_inhibit; extern time_t temp_disable_tx_duration; extern void AbortKiss(); extern bool bcast_rsid_kiss_frame(int new_wf_pos, int new_mode, int old_wf_pos, int old_mode, int notify); extern bool valid_kiss_modem(std::string _modem); extern void check_kiss_modem(void); extern void bcast_trxs_kiss_frame(int state); extern void bcast_tx_buffer_empty_kiss_frame(void); extern bool tcp_init(bool connect_flag); extern bool udp_init(void); extern void kiss_init(bool connect_flag); extern void kiss_close(bool override_flag); extern void connect_to_kiss_io(bool user_requested); extern bool kiss_thread_running(void); extern int kiss_get_char(void); extern void ax25_decode(unsigned char *buffer, size_t count, bool pad, bool tx_flag); extern void flush_kiss_tx_buffer(void); #endif // KISSIO_H fldigi-4.2.05/src/include/FTextView.h0000664000175000017500000001250314611711171014234 00000000000000// ---------------------------------------------------------------------------- // FTextView.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FTextView_H_ #define FTextView_H_ #include #include #include #include #include #include #include "Fl_Text_Editor_mod.H" /// /// The text widgets base class. /// This class implements a basic text editing widget based on Fl_Text_Editor_mod. /// class FTextBase : public Fl_Text_Editor_mod { public: // CLICK_START: same as first clickable style // NATTR: number of styles (last style + 1) enum TEXT_ATTR { RECV, XMIT, CTRL, SKIP, ALTR, FSQ_TX, FSQ_DIR, FSQ_UND, CLICK_START, QSY = CLICK_START, /* FOO, BAR, ..., */ NATTR }; FTextBase(int x, int y, int w, int h, const char *l = 0); virtual ~FTextBase() { delete tbuf; delete sbuf; } #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR >= 3 virtual void add(unsigned int c, int attr = RECV); #else virtual void add(unsigned char c, int attr = RECV); #endif virtual void add(const char *text, int attr = RECV); void addstr(std::string text, int attr = RECV) { add(text.c_str(), attr); } void addchr(unsigned char c, int attr = RECV) { add(c, attr); } virtual int handle(int event); virtual void handle_context_menu(void) { } virtual void clear(void);//{ tbuf->text(""); sbuf->text(""); } void set_word_wrap(bool b, bool b2 = false); bool get_word_wrap(void) { return wrap; } virtual void setFont(Fl_Font f, int attr = NATTR); void setFontSize(int s, int attr = NATTR); void setFontColor(Fl_Color c, int attr = NATTR); // Override Fl_Text_Display, which stores the font number in an unsigned // character and therefore cannot represent all fonts Fl_Font textfont(void) { return styles[0].font; } void textfont(Fl_Font f) { setFont(f); } void textfont(uchar s) { textfont((Fl_Font)s); } void cursorON(void) { show_cursor(); } virtual void resize(int X, int Y, int W, int H); static bool wheight_mult_tsize(void *arg, int xd, int yd); protected: void set_style(int attr, Fl_Font f, int s, Fl_Color c, int set = SET_FONT | SET_SIZE | SET_COLOR); int readFile(const char* fn = 0); void saveFile(void); char* get_word(int x, int y, const char* nwchars = "", int n = 1, bool ontext = true); void init_context_menu(void); void show_context_menu(void); virtual void menu_cb(size_t item) { } int reset_wrap_col(void); void reset_styles(int set); private: FTextBase(); FTextBase(const FTextBase &t); protected: enum { FTEXT_DEF = 'A' }; enum set_style_op_e { SET_FONT = 1 << 0, SET_SIZE = 1 << 1, SET_COLOR = 1 << 2 }; Fl_Text_Buffer_mod *tbuf; ///< text buffer Fl_Text_Buffer_mod *sbuf; ///< style buffer Fl_Text_Display_mod::Style_Table_Entry styles[NATTR]; Fl_Menu_Item *context_menu; int popx, popy; bool wrap; int wrap_col; int max_lines; bool scroll_hint; bool restore_wrap; // bool wrap_restore; private: int oldw, oldh, olds; Fl_Font oldf; }; /// /// A TextBase subclass to display received & transmitted text /// class FTextView : public FTextBase { public: FTextView(int x, int y, int w, int h, const char *l = 0); ~FTextView() { } virtual int handle(int event); protected: enum { VIEW_MENU_COPY, VIEW_MENU_CLEAR, VIEW_MENU_SELECT_ALL, VIEW_MENU_SAVE, VIEW_MENU_WRAP }; virtual void handle_context_menu(void); virtual void menu_cb(size_t item); static void changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg); void change_keybindings(void); private: FTextView(); FTextView(const FTextView &t); protected: static Fl_Menu_Item menu[]; bool quick_entry; }; /// /// A FTextBase subclass to display and edit text to be transmitted /// class FTextEdit : public FTextBase { public: FTextEdit(int x, int y, int w, int h, const char *l = 0); virtual int handle(int event); protected: enum { EDIT_MENU_CUT, EDIT_MENU_COPY, EDIT_MENU_PASTE, EDIT_MENU_CLEAR, EDIT_MENU_READ, EDIT_MENU_WRAP }; virtual int handle_key(int key); int handle_key_ascii(int key); virtual int handle_dnd_drag(int pos); int handle_dnd_drop(void); virtual void handle_context_menu(void); virtual void menu_cb(size_t item); static void changed_cb(int pos, int nins, int ndel, int nsty, const char *dtext, void *arg); private: FTextEdit(); FTextEdit(const FTextEdit &t); protected: static Fl_Menu_Item menu[]; char ascii_cnt; unsigned ascii_chr; bool dnd_paste; }; #endif // FTextView_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/view_rtty.h0000664000175000017500000000761614611711171014414 00000000000000// ---------------------------------------------------------------------------- // rtty.h -- RTTY modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef VIEW_RTTY_H #define VIEW_RTTY_H //#include "rtty.h" #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #define VIEW_RTTY_SampleRate 8000 #define VIEW_MAXPIPE 1024 #define VIEW_RTTY_MAXBITS (2 * VIEW_RTTY_SampleRate / 23 + 1) #define MAX_CHANNELS 30 class view_rtty : public modem { public: enum CHANNEL_STATE {IDLE, SRCHG, RCVNG, WAITING}; enum RTTY_RX_STATE { RTTY_RX_STATE_IDLE = 0, RTTY_RX_STATE_START, RTTY_RX_STATE_DATA, RTTY_RX_STATE_PARITY, RTTY_RX_STATE_STOP, RTTY_RX_STATE_STOP2 }; enum RTTY_PARITY { RTTY_PARITY_NONE = 0, RTTY_PARITY_EVEN, RTTY_PARITY_ODD, RTTY_PARITY_ZERO, RTTY_PARITY_ONE }; static const double SHIFT[]; static const double BAUD[]; static const int BITS[]; static const int FILTLEN[]; static const int numshifts; static const int numbauds; int filter_length; private: struct RTTY_CHANNEL { int state; double phaseacc; fftfilt *mark_filt; fftfilt *space_filt; Cmovavg *bits; bool nubit; bool bit; bool bit_buf[VIEW_RTTY_MAXBITS]; double mark_phase; double space_phase; double metric; int rxmode; RTTY_RX_STATE rxstate; double frequency; double freqerr; double phase; double posfreq; double negfreq; double freqerrhi; double freqerrlo; double poserr; double negerr; int poscnt; int negcnt; int timeout; double mark_mag; double space_mag; double mark_env; double space_env; double noise_floor; double mark_noise; double space_noise; double sigpwr; double noisepwr; double avgsig; double prevsymbol; cmplx prevsmpl; int counter; int bitcntr; int rxdata; int inp_ptr; cmplx mark_history[VIEW_MAXPIPE]; cmplx space_history[VIEW_MAXPIPE]; int sigsearch; }; double shift; int symbollen; int nbits; int stoplen; int msb; bool useFSK; RTTY_CHANNEL channel[MAX_CHANNELS]; double rtty_squelch; double rtty_shift; double rtty_BW; double rtty_baud; int rtty_bits; RTTY_PARITY rtty_parity; int rtty_stop; bool rtty_msbfirst; int bflen; double bp_filt_lo; double bp_filt_hi; int txmode; int preamble; void clear_syncscope(); void update_syncscope(); cmplx mixer(double &phase, double f, cmplx in); unsigned char bitreverse(unsigned char in, int n); int decode_char(int ch); int rttyparity(unsigned int); bool rx(int ch, bool bit); int rttyxprocess(); char baudot_dec(int ch, unsigned char data); void Metric(int ch); public: view_rtty(trx_mode mode); ~view_rtty(); void init(); void rx_init(); void tx_init() {} void restart(); void reset_filters(int ch); int rx_process(const double *buf, int len); int tx_process(); void find_signals(); void clearch(int ch); void clear(); int get_freq(int n) { return (int)channel[n].frequency;} bool is_mark_space(int ch, int &); bool is_mark(int ch); }; //extern view_rtty *rttyviewer; #endif fldigi-4.2.05/src/include/progress.h0000664000175000017500000000336414532252172014223 00000000000000// // progress.h // // Progress bar widget routines. // // Based on Fl_Progress widget, Copyright 2000-2005 by Michael Sweet. // // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _Progress_H_ # define _Progress_H_ // // Include necessary headers. // #include // // Progress class... // class Progress : public Fl_Widget { public: enum PTYPE {HORIZONTAL, VERTICAL}; private: double value_, minimum_, maximum_; PTYPE direction; protected: virtual void draw(); public: Progress(int x, int y, int w, int h, const char *l = 0); void type(PTYPE direc) { direction = direc;} void maximum(double v) { maximum_ = v; redraw(); } double maximum() const { return (maximum_); } void minimum(double v) { minimum_ = v; redraw(); } double minimum() const { return (minimum_); } void value(double v) { value_ = v; redraw(); } double value() const { return (value_); } }; #endif // !_Progress_H_ fldigi-4.2.05/src/include/modem.h0000664000175000017500000003173214611711171013455 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _MODEM_H #define _MODEM_H #include #include "threads.h" #include "sound.h" #include "digiscope.h" #include "globals.h" #include "morse.h" #include "ascii.h" #include "filters.h" #include "plot_xy.h" #define OUTBUFSIZE 65536 // needed for 5 WPM Farsnworth CW buffers // Constants for signal searching & s/n threshold #define SIGSEARCH 5 // How many samples to average the signal-quality value over #define QUALITYDEPTH 5 #define TWOPI (2.0 * M_PI) class modem { public: static double frequency; static double tx_frequency; static bool freqlock; static unsigned long tx_sample_count; static unsigned int tx_sample_rate; static bool XMLRPC_CPS_TEST; protected: cMorse *morse; trx_mode mode; SoundBase *scard; bool stopflag; int fragmentsize; int samplerate; bool reverse; int sigsearch; bool sig_start; bool sig_stop; double bandwidth; double freqerr; double rx_corr; double tx_corr; double PTTphaseacc; double PTTchannel[OUTBUFSIZE]; // for CW modem use only bool cwTrack; bool cwLock; double cwRcvWPM; double cwXmtWPM; double squelch; double metric; double syncpos; int backspaces; unsigned char *txstr; unsigned char *txptr; double outbuf[OUTBUFSIZE]; bool historyON; Digiscope::scope_mode scopemode; int scptr; // extended s/n reporting double s2n_ncount, s2n_sum, s2n_sum2, s2n_metric; bool s2n_valid; unsigned cap; // Audio output std::string audio_filename; bool play_audio; // CWID bool CW_EOT; public: modem(); virtual ~modem(){ delete morse; } // these processes must be declared in the derived class virtual void init(); virtual void tx_init () = 0; virtual void rx_init () = 0; virtual void restart () = 0; virtual void rx_flush() {}; virtual int tx_process (); virtual int rx_process (const double *, int len) = 0; virtual void Audio_filename(std::string nm) { audio_filename = nm; play_audio = true; } virtual void shutdown(){}; virtual void set1(int, int){}; virtual void set2(int, int){}; virtual void makeTxViewer(int W, int H){}; virtual void searchDown() {}; virtual void searchUp() {}; void HistoryON(bool val) {historyON = val;} bool HistoryON() const { return historyON;} /// Inlined const getters are faster and smaller. trx_mode get_mode() const { return mode; }; const char *get_mode_name() const { return mode_info[get_mode()].sname;} unsigned int iface_io() const { return mode_info[get_mode()].iface_io;} virtual void set_freq(double); /// Inlining small formulas is still faster and shorter. int get_freq() const { return (int)( frequency + 0.5 ); } void init_freqlock(); void set_freqlock(bool); void set_sigsearch(int n) { sigsearch = n; freqerr = 0.0;}; bool freqlocked() const { return freqlock;} /// Getters are semantically const. double get_txfreq() const; double get_txfreq_woffset() const; void set_metric(double); void display_metric(double); double get_metric() const { return metric;} void set_reverse(bool on); bool get_reverse() const { return reverse;} double get_bandwidth() const { return bandwidth;} void set_bandwidth(double); int get_samplerate() const { return samplerate;} void set_samplerate(int); void init_queues(); void ModulateXmtr(double *, int); void ModulateStereo(double *, double *, int, bool sample_flag = true); void ModulateVideo(double *, int); void ModulateVideoStereo(double *, double *, int, bool sample_flag = true); void videoText(); void pretone(); virtual void send_color_image(std::string) {} virtual void send_Grey_image(std::string) {} virtual void ifkp_send_image(std::string s = "", bool grey = false){} virtual void ifkp_send_avatar(){} virtual void m_ifkp_send_avatar(){} virtual void thor_send_image(std::string s = "", bool grey = false){} virtual void thor_send_avatar(){} virtual void m_thor_send_avatar(){} void set_stopflag(bool b) { stopflag = b;}; bool get_stopflag() const { return stopflag; }; unsigned get_cap(void) const { return cap; } enum { CAP_AFC = 1 << 0, CAP_AFC_SR = 1 << 1, CAP_REV = 1 << 2, CAP_IMG = 1 << 3, CAP_BW = 1 << 4, CAP_RX = 1 << 5, CAP_TX = 1 << 6 }; // for CW modem use only bool get_cwTrack(); void set_cwTrack(bool); bool get_cwLock(); void set_cwLock(bool); double get_cwXmtWPM(); void set_cwXmtWPM(double); double get_cwRcvWPM(); virtual void CW_KEYLINE(bool) {}; virtual void incWPM() {}; virtual void decWPM() {}; virtual void toggleWPM() {}; virtual void sync_parameters() {}; virtual void reset_rx_filter() {}; virtual void update_Status() {}; // for waterfall id transmission private: static double wfid_w[]; static double wfid_outbuf[]; int vidwidth; void wfid_make_tones(int numchars); void wfid_send(int numchars); void wfid_sendchars(std::string s); double PTTnco(); public: std::string macro_video_text; void wfid_text(const std::string& s); // for CW ID transmission private: double cwid_keyshape[128]; double cwid_phaseacc; int RT; int cwid_symbollen; int cwid_lastsym; public: void cwid_makeshape(); double cwid_nco(double freq); void cwid_send_symbol(int bits); void cwid_send_ch(int ch); void cwid_sendtext (const std::string& s); void cwid(); void set_CW_EOT() { CW_EOT = true; } void clear_CW_EOT() { CW_EOT = false; } double calWPM() {return 20;} void calWPM(double) {}; // for FSK keyline void resetFSK() {}; // for fft scan modem public: virtual void refresh_scope() {} // for multi-channel modems public: virtual void clear_viewer() {} virtual void clear_ch(int n) {} virtual int viewer_get_freq(int n) {return 0; } // for noise tests private: void add_noise(double *, int); double sigmaN (double es_ovr_n0); double gauss(double sigma); protected: virtual void s2nreport(void); // JD & DF for multiple carriers public: int numcarriers; //Number of parallel carriers for M CAR PSK and PSKR and QPSKR int symbols; //JD for multiple carriers int acc_symbols; int char_symbols; int xmt_symbols; int ovhd_symbols; int acc_samples; int char_samples; int xmt_samples; int ovhd_samples; // analysis / fmt modes PLOT_XY *unk_pipe; PLOT_XY *ref_pipe; bool write_to_csv; virtual void reset_unknown() {} virtual void reset_reference() {} virtual void clear_ref_pipe() {} virtual void clear_unk_pipe() {} virtual void start_csv() {} virtual void stop_csv() {} // fsq mode bool fsq_tx_image; std::string xmt_string; virtual double fsq_xmtdelay() {return 0;}; virtual void send_ack(std::string relay) {}; virtual void fsq_send_image(std::string s){} virtual std::string fsq_mycall() {return "";} virtual bool fsq_squelch_open() {return false;} virtual void fsq_transmit(void *) {} virtual bool fsq_is_rx() { return false; } // modem decode-quality data and statistics public: int update_quality(int value, int mode=0); // for displaying signal-quality in the GUI int get_quality(int mode=0); // return an average of the quality values private: int quality[QUALITYDEPTH]; // array containining a 0-100 number representing the signal-quality }; extern modem *null_modem; extern modem *cw_modem; extern modem *mfsk8_modem; extern modem *mfsk16_modem; extern modem *mfsk32_modem; // experimental modes extern modem *mfsk4_modem; extern modem *mfsk11_modem; extern modem *mfsk22_modem; extern modem *mfsk31_modem; extern modem *mfsk64_modem; extern modem *mfsk128_modem; extern modem *mfsk64l_modem; extern modem *mfsk128l_modem; extern modem *wefax576_modem; extern modem *wefax288_modem; extern modem *navtex_modem; extern modem *sitorb_modem; extern modem *mt63_500S_modem; extern modem *mt63_1000S_modem; extern modem *mt63_2000S_modem; extern modem *mt63_500L_modem; extern modem *mt63_1000L_modem; extern modem *mt63_2000L_modem; extern modem *feld_modem; extern modem *feld_slowmodem; extern modem *feld_x5modem; extern modem *feld_x9modem; extern modem *feld_FMmodem; extern modem *feld_FM105modem; extern modem *feld_80modem; extern modem *feld_CMTmodem; extern modem *psk31_modem; extern modem *psk63_modem; extern modem *psk63f_modem; extern modem *psk125_modem; extern modem *psk250_modem; extern modem *psk500_modem; extern modem *psk1000_modem; extern modem *qpsk31_modem; extern modem *qpsk63_modem; extern modem *qpsk125_modem; extern modem *qpsk250_modem; extern modem *qpsk500_modem; extern modem *_8psk125_modem; extern modem *_8psk250_modem; extern modem *_8psk500_modem; extern modem *_8psk1000_modem; extern modem *_8psk1200_modem; extern modem *_8psk125fl_modem; extern modem *_8psk125f_modem; extern modem *_8psk250fl_modem; extern modem *_8psk250f_modem; extern modem *_8psk500f_modem; extern modem *_8psk1000f_modem; extern modem *_8psk1200f_modem; extern modem *ofdm_500f_modem; extern modem *ofdm_750f_modem; extern modem *ofdm_2000f_modem; extern modem *ofdm_2000_modem; extern modem *ofdm_3500_modem; extern modem *psk125r_modem; extern modem *psk250r_modem; extern modem *psk500r_modem; extern modem *psk1000r_modem; extern modem *psk800_c2_modem; extern modem *psk800r_c2_modem; extern modem *psk1000_c2_modem; extern modem *psk1000r_c2_modem; extern modem *psk63r_c4_modem; extern modem *psk63r_c5_modem; extern modem *psk63r_c10_modem; extern modem *psk63r_c20_modem; extern modem *psk63r_c32_modem; extern modem *psk125r_c4_modem; extern modem *psk125r_c5_modem; extern modem *psk125r_c10_modem; extern modem *psk125_c12_modem; extern modem *psk125r_c12_modem; extern modem *psk125r_c16_modem; extern modem *psk250r_c2_modem; extern modem *psk250r_c3_modem; extern modem *psk250r_c5_modem; extern modem *psk250_c6_modem; extern modem *psk250r_c6_modem; extern modem *psk250r_c7_modem; extern modem *psk500_c2_modem; extern modem *psk500_c4_modem; extern modem *psk500r_c2_modem; extern modem *psk500r_c3_modem; extern modem *psk500r_c4_modem; extern modem *rtty_modem; //extern modem *pkt_modem; extern modem *olivia_modem; extern modem *olivia_4_125_modem; extern modem *olivia_4_250_modem; extern modem *olivia_4_500_modem; extern modem *olivia_4_1000_modem; extern modem *olivia_4_2000_modem; extern modem *olivia_8_125_modem; extern modem *olivia_8_250_modem; extern modem *olivia_8_500_modem; extern modem *olivia_8_1000_modem; extern modem *olivia_8_2000_modem; extern modem *olivia_16_500_modem; extern modem *olivia_16_1000_modem; extern modem *olivia_16_2000_modem; extern modem *olivia_32_1000_modem; extern modem *olivia_32_2000_modem; extern modem *olivia_64_500_modem; extern modem *olivia_64_1000_modem; extern modem *olivia_64_2000_modem; extern modem *contestia_modem; extern modem *contestia_4_125_modem; extern modem *contestia_4_250_modem; extern modem *contestia_4_500_modem; extern modem *contestia_4_1000_modem; extern modem *contestia_4_2000_modem; extern modem *contestia_8_125_modem; extern modem *contestia_8_250_modem; extern modem *contestia_8_500_modem; extern modem *contestia_8_1000_modem; extern modem *contestia_8_2000_modem; extern modem *contestia_16_250_modem; extern modem *contestia_16_500_modem; extern modem *contestia_16_1000_modem; extern modem *contestia_16_2000_modem; extern modem *contestia_32_1000_modem; extern modem *contestia_32_2000_modem; extern modem *contestia_64_500_modem; extern modem *contestia_64_1000_modem; extern modem *contestia_64_2000_modem; extern modem *thormicro_modem; extern modem *thor4_modem; extern modem *thor5_modem; extern modem *thor8_modem; extern modem *thor11_modem; extern modem *thor16_modem; extern modem *thor22_modem; extern modem *thor32_modem; extern modem *thor44_modem; extern modem *thor56_modem; extern modem *thor25x4_modem; extern modem *thor50x1_modem; extern modem *thor50x2_modem; extern modem *thor100_modem; extern modem *dominoexmicro_modem; extern modem *dominoex4_modem; extern modem *dominoex5_modem; extern modem *dominoex8_modem; extern modem *dominoex11_modem; extern modem *dominoex16_modem; extern modem *dominoex22_modem; extern modem *dominoex44_modem; extern modem *dominoex88_modem; extern modem *throb1_modem; extern modem *throb2_modem; extern modem *throb4_modem; extern modem *throbx1_modem; extern modem *throbx2_modem; extern modem *throbx4_modem; extern modem *wwv_modem; extern modem *anal_modem; extern modem *fmt_modem; extern modem *ssb_modem; extern modem *fsq_modem; extern modem *ifkp_modem; #endif fldigi-4.2.05/src/include/arq_io.h0000664000175000017500000000314014611711171013616 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef ARQIO_H #define ARQIO_H class Socket; extern void WriteARQsocket(unsigned char* data, size_t len); extern bool Socket_arqRx(); extern void AbortARQ(); extern void pskmail_notify_rsid(trx_mode mode); extern void pskmail_notify_s2n(double s2n_count, double s2n_avg, double s2n_stddev); extern void flush_arq_tx_buffer(void); class ARQ_SOCKET_Server { public: static bool start(const char* node, const char* service); static void stop(void); private: ARQ_SOCKET_Server(); ~ARQ_SOCKET_Server(); ARQ_SOCKET_Server(const ARQ_SOCKET_Server&); ARQ_SOCKET_Server operator=(const ARQ_SOCKET_Server&); static void* thread_func(void*); private: static ARQ_SOCKET_Server* inst; bool run; Socket* server_socket; }; #endif // ARQIO_H fldigi-4.2.05/src/include/locator.h0000664000175000017500000000316614532252172014022 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef LOCATOR_H_ #define LOCATOR_H_ #include namespace QRB { enum {QRB_OK, QRB_EINVAL}; int qrb(double lon1, double lat1, double lon2, double lat2, double *distance, double *azimuth); double distance_long_path(double distance); double azimuth_long_path(double azimuth); int longlat2locator(double longitude, double latitude, char *locator_res, int pair_count); int locator2longlat(double *longitude, double *latitude, const char *locator); double dms2dec(int degrees, int minutes, double seconds, int sw); int dec2dms(double dec, int *degrees, int *minutes, double *seconds, int *sw); int dec2dmmm(double dec, int *degrees, double *minutes, int *sw); double dmmm2dec(int degrees, double minutes, int sw); } #endif /* LOCATOR_H_ */ fldigi-4.2.05/src/include/ringbuffer.h0000664000175000017500000001456014611711171014505 00000000000000// ---------------------------------------------------------------------------- // ringbuffer.h // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // C++ version of PortAudio's ringbuffer code. The copying read/write methods // use memcpy, so it generally safe to use them only for POD types. Thread safe // for one reader and one writer. // // Licensed according to original copyright notice: // // Author: Phil Burk, http://www.softsynth.com // modified for SMP safety on OS X by Bjorn Roche. // also allowed for const where possible. // Note that this is safe only for a single-thread reader // and a single-thread writer. // // This program is distributed with the PortAudio Portable Audio Library. // For more information see: http://www.portaudio.com // Copyright (c) 1999-2000 Ross Bencina and Phil Burk // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files // (the "Software"), to deal in the Software without restriction, // including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, // and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR // ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /** The class template ringbuffer is used to transport data elements between different execution contexts (threads, OS callbacks, interrupt handlers) without requiring the use of any locks. This only works when there is a single reader and a single writer (ie. one thread or callback writes to the ring buffer, another thread or callback reads from it). The ringbuffer class manages a first-in-first-out buffer containing N elements, where N must be a power of two. An element may be any size (specified in bytes). Buffer storage is instantiated when the class Type is created and released when the class Type is deleted. */ #ifndef RINGBUFFER_H #define RINGBUFFER_H #include #include #include "util.h" template class ringbuffer { protected: size_t size, // size of buffer, a power of two big_mask, // Used for wrapping indices with extra bit to distinguish full/empty. small_mask; // Used for fitting indices to buffer. T* buf; // Pointer to the buffer containing the actual data. volatile size_t ridx; // Index of next readable element. volatile size_t widx; // Index of next writable element. public: typedef T value_type; typedef struct { value_type* buf; size_t len; } vector_type; public: // Instantiate ringbuffer to empty state ready to have elements written to it. // buffer size, s, must be a power of two ringbuffer(size_t s) : ridx(0), widx(0) { assert(powerof2(s)); size = s; big_mask = size * 2 - 1; small_mask = size - 1; buf = new T[2 * size]; } // Delete ringbuffer and all internal storage ~ringbuffer() { delete [] buf; } // number of elements available for reading. size_t read_space(void) { read_memory_barrier(); return (widx - ridx) & big_mask; } // number of elements available for writing. size_t write_space(void) { return size - read_space(); } // advance read index by n number of elements void read_advance(size_t n) { write_memory_barrier(); ridx = (ridx + n) & big_mask; } // advance write index by n number of elements void write_advance(size_t n) { write_memory_barrier(); widx = (widx + n) & big_mask; } size_t get_rv(vector_type v[2], size_t n = 0) { size_t rspace = read_space(); size_t index = ridx & small_mask; if (n == 0 || n > rspace) n = rspace; if (index + n > size) { // two part vector v[0].buf = buf + index; v[0].len = size - index; v[1].buf = buf; v[1].len = n - v[0].len; } else { v[0].buf = buf + index; v[0].len = n; v[1].len = 0; } return n; } // read n elements from buffer, constrained by read/write indices size_t read(T* dst, size_t n) { vector_type v[2] = { {0,0}, {0,0} }; n = get_rv(v, n); memcpy(dst, v[0].buf, v[0].len * sizeof(T)); if (v[1].len) memcpy(dst + v[0].len, v[1].buf, v[1].len * sizeof(T)); read_advance(n); return n; } size_t peek(T* dst, size_t n) { vector_type v[2] = { {0,0}, {0,0} }; n = get_rv(v, n); memcpy(dst, v[0].buf, v[0].len * sizeof(T)); if (v[1].len) memcpy(dst + v[0].len, v[1].buf, v[1].len * sizeof(T)); return n; } size_t get_wv(vector_type v[2], size_t n = 0) { size_t wspace = write_space(); size_t index = widx & small_mask; if (n == 0 || n > wspace) n = wspace; if (index + n > size) { // two part vector v[0].buf = buf + index; v[0].len = size - index; v[1].buf = buf; v[1].len = n - v[0].len; } else { v[0].buf = buf + index; v[0].len = n; v[1].len = 0; } return n; } // write n elements to buffer, constrained by read/write indices size_t write(const T* src, size_t n) { vector_type v[2] = { {0,0}, {0,0} }; n = get_wv(v, n); memcpy(v[0].buf, src, v[0].len * sizeof(T)); if (v[1].len) memcpy(v[1].buf, src + v[0].len, v[1].len * sizeof(T)); write_advance(n); return n; } // fill buffer with elements with value v void fill(const value_type& v) { reset(); for (size_t i = 0; i < size; i++) buf[i] = v; write_advance(size); } // fill buffer with elements whose value is zero void zero(void) { reset(); memset(buf, 0, size * sizeof(T)); write_advance(size); } // reset the read/write indices void reset(void) { ridx = widx = 0; } // return maximum number of T elements that buffer can contain size_t length(void) { return size; } // return number of memory bytes used by ringbuffer buffer store size_t bytes(void) { return size * sizeof(T); } size_t rbr_index() { return ridx; } size_t rbw_index() { return widx; } }; #endif // RINGBUFFER_H // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/fsq.h0000664000175000017500000001157214611711171013145 00000000000000// ---------------------------------------------------------------------------- // fsq.h -- FSQCALL compatible modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FSQ_H #define _FSQ_H #include #include #include #include "trx.h" #include "modem.h" #include "complex.h" #include "filters.h" #include "crc8.h" #include "picture.h" #include class fsq : public modem { #define SR 12000 #define FFTSIZE 4096 #define FSQ_SYMLEN 4096 #define NUMBINS 144 // 200 //((FFTSIZE / 4) - 2) #define BLOCK_SIZE FFTSIZE #define SHIFT_SIZE (FSQ_SYMLEN / 16) #define MOVAVGLIMIT 15 enum STATE {TEXT, IMAGE}; friend void timed_xmt(void *); friend void aging(void *); friend void fsq_add_tx_timeout(void *); friend void fsq_stop_aging(); friend void try_transmit(void *); friend void fsq_transmit(void *); public: protected: // Rx double rx_stream[BLOCK_SIZE + SHIFT_SIZE]; cmplx fft_data[2*FFTSIZE]; double a_blackman[BLOCK_SIZE]; double tones[NUMBINS]; Cmovavg *binfilt[NUMBINS]; int movavg_size; int bkptr; g_fft *fft; Cmovavg *snfilt; Cmovavg *sigfilt; Cmovavg *noisefilt; Cmovavg *baudfilt; double val; double max; double noise; int peak; int prev_peak; int last_peak; int peak_counter; int peak_hits; int symbol; int prev_symbol; int curr_nibble; int prev_nibble; int nibbles[199]; void lf_check(int); void process_symbol(int); double s2n; char szestimate[40]; std::string rx_text; std::string toprint; int valid_callsign(std::string s); void parse_rx_text(); void parse_space(bool); void parse_qmark(std::string relay = ""); void parse_star(); void parse_repeat(); void parse_delayed_repeat(); void parse_pound(std::string relay = ""); void parse_dollar(std::string relay = ""); void parse_at(std::string relay = ""); void parse_amp(std::string relay = ""); void parse_carat(std::string relay = ""); void parse_pcnt(); void parse_vline(std::string relay = ""); void parse_greater(std::string relay = ""); void parse_less(std::string relay = ""); void parse_plus(std::string relay = ""); void parse_minus(); void parse_relay(); void parse_relayed(); bool b_bot; bool b_eol; bool b_eot; // Tx // C_FIR_filter *xmtfilt; int tone; int prevtone; double txphase; void send_string(std::string); bool send_bot; void flush_buffer (); void send_char (int); void send_idle (); void send_symbol(int sym); void send_tone(int tone); void reply(std::string); void delayed_reply(std::string, int delay); void send_ack(std::string relay = ""); // Sounder double sounder_interval; void start_sounder(int); // 0, 1, 2, 3 void stop_sounder(); // Aging void start_aging(); void stop_aging(); // RxTx int fsq_frequency; // 0 / 1 int spacing; int basetone; int tx_basetone; double speed; double metric; bool ch_sqlch_open; CRC8 crc; std::string station_calling; std::string mycall; std::string heard_log_fname; std::string audit_log_fname; std::ofstream heard_log; std::ofstream audit_log; void show_mode(); void adjust_for_speed(); void process_tones(); void init_nibbles(); void set_freq(double); bool valid_char(int); STATE state; public: fsq (trx_mode md); ~fsq (); void init (); void rx_init (); void restart (); void tx_init (); int rx_process (const double *buf, int len); int tx_process (); std::string fsq_mycall() { return mycall; } bool fsq_squelch_open(); bool fsq_is_rx() { return ch_sqlch_open; } static int symlen; // support for fsq image transfers private: double amplitude; double pixel; unsigned char tx_pixel; int tx_pixelnbr; int image_mode; public: int byte; double picf; double picpeak; C_FIR_filter *picfilter; double phidiff; double phase; cmplx prevz; cmplx currz; double image_freq[10]; int image_counter; int picW; int picH; int row; int col; int rgb; int pixelnbr; int RXspp; int TXspp; void recvpic(double smpl); void send_image(); void fsq_send_image(std::string s); void toggle_logs(); }; #endif fldigi-4.2.05/src/include/globals.h0000664000175000017500000001653114611711171013777 00000000000000// ---------------------------------------------------------------------------- // globals.h -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _GLOBALS_H #define _GLOBALS_H #include #include enum state_t { STATE_PAUSE = 0, STATE_RX, STATE_TX, STATE_RESTART, STATE_TUNE, STATE_ABORT, STATE_FLUSH, STATE_NOOP, STATE_EXIT, STATE_ENDED, STATE_IDLE, STATE_NEW_MODEM }; enum { MODE_PREV = -2, MODE_NEXT, MODE_NULL, MODE_CW, MODE_CONTESTIA, MODE_CONTESTIA_4_125, MODE_CONTESTIA_4_250, MODE_CONTESTIA_4_500, MODE_CONTESTIA_4_1000, MODE_CONTESTIA_4_2000, MODE_CONTESTIA_8_125, MODE_CONTESTIA_8_250, MODE_CONTESTIA_8_500, MODE_CONTESTIA_8_1000, MODE_CONTESTIA_8_2000, MODE_CONTESTIA_16_250, MODE_CONTESTIA_16_500, MODE_CONTESTIA_16_1000, MODE_CONTESTIA_16_2000, MODE_CONTESTIA_32_1000, MODE_CONTESTIA_32_2000, MODE_CONTESTIA_64_500, MODE_CONTESTIA_64_1000, MODE_CONTESTIA_64_2000, MODE_CONTESTIA_FIRST = MODE_CONTESTIA_4_125, MODE_CONTESTIA_LAST = MODE_CONTESTIA_64_2000, MODE_DOMINOEXMICRO, MODE_DOMINOEX4, MODE_DOMINOEX5, MODE_DOMINOEX8, MODE_DOMINOEX11, MODE_DOMINOEX16, MODE_DOMINOEX22, MODE_DOMINOEX44, MODE_DOMINOEX88, MODE_DOMINOEX_FIRST = MODE_DOMINOEXMICRO, MODE_DOMINOEX_LAST = MODE_DOMINOEX88, MODE_FELDHELL, MODE_SLOWHELL, MODE_HELLX5, MODE_HELLX9, MODE_FSKH245, MODE_FSKH105, MODE_HELL80, MODE_HELL_FIRST = MODE_FELDHELL, MODE_HELL_LAST = MODE_HELL80, MODE_MFSK8, MODE_MFSK16, MODE_MFSK32, MODE_MFSK4, MODE_MFSK11, MODE_MFSK22, MODE_MFSK31, MODE_MFSK64, MODE_MFSK128, MODE_MFSK64L, MODE_MFSK128L, MODE_MFSK_FIRST = MODE_MFSK8, MODE_MFSK_LAST = MODE_MFSK128L, MODE_WEFAX_576, MODE_WEFAX_288, MODE_WEFAX_FIRST = MODE_WEFAX_576, MODE_WEFAX_LAST = MODE_WEFAX_288, MODE_NAVTEX, MODE_SITORB, MODE_NAVTEX_FIRST = MODE_NAVTEX, MODE_NAVTEX_LAST = MODE_SITORB, MODE_MT63_500S, MODE_MT63_500L, MODE_MT63_1000S, MODE_MT63_1000L, MODE_MT63_2000S, MODE_MT63_2000L, MODE_MT63_FIRST = MODE_MT63_500S, MODE_MT63_LAST = MODE_MT63_2000L, MODE_PSK31, MODE_PSK63, MODE_PSK63F, MODE_PSK125, MODE_PSK250, MODE_PSK500, MODE_PSK1000, MODE_12X_PSK125, MODE_6X_PSK250, MODE_2X_PSK500, MODE_4X_PSK500, MODE_2X_PSK800, MODE_2X_PSK1000, MODE_PSK_FIRST = MODE_PSK31, MODE_PSK_LAST = MODE_2X_PSK1000, MODE_QPSK31, MODE_QPSK63, MODE_QPSK125, MODE_QPSK250, MODE_QPSK500, MODE_QPSK_FIRST = MODE_QPSK31, MODE_QPSK_LAST = MODE_QPSK500, MODE_8PSK125, MODE_8PSK125FL, MODE_8PSK125F, MODE_8PSK250, MODE_8PSK250FL, MODE_8PSK250F, MODE_8PSK500, MODE_8PSK500F, MODE_8PSK1000, MODE_8PSK1000F, MODE_8PSK1200F, MODE_8PSK_FIRST = MODE_8PSK125, MODE_8PSK_LAST = MODE_8PSK1200F, MODE_OFDM_500F, MODE_OFDM_750F, // MODE_OFDM_2000F, // MODE_OFDM_2000, MODE_OFDM_3500, MODE_OLIVIA, MODE_OLIVIA_4_125, MODE_OLIVIA_4_250, MODE_OLIVIA_4_500, MODE_OLIVIA_4_1000, MODE_OLIVIA_4_2000, MODE_OLIVIA_8_125, MODE_OLIVIA_8_250, MODE_OLIVIA_8_500, MODE_OLIVIA_8_1000, MODE_OLIVIA_8_2000, MODE_OLIVIA_16_500, MODE_OLIVIA_16_1000, MODE_OLIVIA_16_2000, MODE_OLIVIA_32_1000, MODE_OLIVIA_32_2000, MODE_OLIVIA_64_500, MODE_OLIVIA_64_1000, MODE_OLIVIA_64_2000, MODE_OLIVIA_FIRST = MODE_OLIVIA, MODE_OLIVIA_LAST = MODE_OLIVIA_64_2000, MODE_RTTY, MODE_THORMICRO, MODE_THOR4, MODE_THOR5, MODE_THOR8, MODE_THOR11, MODE_THOR16, MODE_THOR22, MODE_THOR32, MODE_THOR44, MODE_THOR56, MODE_THOR25x4, MODE_THOR50x1, MODE_THOR50x2, MODE_THOR100, MODE_THOR_FIRST = MODE_THORMICRO, MODE_THOR_LAST = MODE_THOR100, MODE_THROB1, MODE_THROB2, MODE_THROB4, MODE_THROBX1, MODE_THROBX2, MODE_THROBX4, MODE_THROB_FIRST = MODE_THROB1, MODE_THROB_LAST = MODE_THROBX4, // MODE_PACKET, // high speed && multiple carrier modes MODE_PSK125R, MODE_PSK250R, MODE_PSK500R, MODE_PSK1000R, MODE_4X_PSK63R, MODE_5X_PSK63R, MODE_10X_PSK63R, MODE_20X_PSK63R, MODE_32X_PSK63R, MODE_4X_PSK125R, MODE_5X_PSK125R, MODE_10X_PSK125R, MODE_12X_PSK125R, MODE_16X_PSK125R, MODE_2X_PSK250R, MODE_3X_PSK250R, MODE_5X_PSK250R, MODE_6X_PSK250R, MODE_7X_PSK250R, MODE_2X_PSK500R, MODE_3X_PSK500R, MODE_4X_PSK500R, MODE_2X_PSK800R, MODE_2X_PSK1000R, MODE_PSKR_FIRST = MODE_PSK125R, MODE_PSKR_LAST = MODE_2X_PSK1000R, MODE_FSQ, MODE_IFKP, MODE_SSB, MODE_WWV, MODE_ANALYSIS, MODE_FMT, MODE_EOT, // a dummy mode used to invoke transmission of RsID-EOT code NUM_MODES, NUM_RXTX_MODES = MODE_SSB }; typedef intptr_t trx_mode; struct mode_info_t { trx_mode mode; class modem **modem; const char *sname; const char *name; const char *pskmail_name; const char *adif_name; const char *export_mode; const char *export_submode; const char *vid_name; const unsigned int iface_io; // Some modes are not usable for a given interface. }; extern const struct mode_info_t mode_info[NUM_MODES]; class qrg_mode_t { public: unsigned long long rfcarrier; std::string rmode; int carrier; trx_mode mode; std::string usage; qrg_mode_t() : rfcarrier(0), rmode("NONE"), carrier(0), mode(NUM_MODES), usage("") { } qrg_mode_t(unsigned long long rfc_, std::string rm_, int c_, trx_mode m_, std::string use_ = "") : rfcarrier(rfc_), rmode(rm_), carrier(c_), mode(m_), usage(use_) { } bool operator<(const qrg_mode_t& rhs) const { return rfcarrier < rhs.rfcarrier; } bool operator==(const qrg_mode_t& rhs) const { return rfcarrier == rhs.rfcarrier && rmode == rhs.rmode && carrier == rhs.carrier && mode == rhs.mode; } std::string str(void); }; std::ostream& operator<<(std::ostream& s, const qrg_mode_t& m); std::istream& operator>>(std::istream& s, qrg_mode_t& m); #include class mode_set_t : public std::bitset {}; enum band_t { BAND_160M, BAND_80M, BAND_75M, BAND_60M, BAND_40M, BAND_30M, BAND_20M, BAND_17M, BAND_15M, BAND_12M, BAND_10M, BAND_6M, BAND_4M, BAND_2M, BAND_125CM, BAND_70CM, BAND_33CM, BAND_23CM, BAND_13CM, BAND_9CM, BAND_6CM, BAND_3CM, BAND_125MM, BAND_6MM, BAND_4MM, BAND_2P5MM, BAND_2MM, BAND_1MM, BAND_OTHER, NUM_BANDS }; band_t band(long long freq_hz); band_t band(const char* freq_mhz); const char* band_name(band_t b); const char* band_name(const char* freq_mhz); const char* band_freq(band_t b); const char* band_freq(const char* band_name); // psk_browser enums enum { VIEWER_LABEL_OFF, VIEWER_LABEL_AF, VIEWER_LABEL_RF, VIEWER_LABEL_CH, VIEWER_LABEL_NTYPES }; extern std::string adif2export(std::string adif); extern std::string adif2submode(std::string adif); #endif fldigi-4.2.05/src/include/dx_cluster.h0000664000175000017500000000610114611711171014520 00000000000000// ---------------------------------------------------------------------------- // dx_cluster.h -- constants, variables, arrays & functions that need to be // outside of any thread // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted in part from code contained in gmfsk // source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef DX_CLUSTER_H #define DX_CLUSTER_H #include extern void DXcluster_init(void); extern void DXcluster_close(void); extern void DXcluster_connect(bool); extern void DXcluster_submit(); extern void DXcluster_select(); extern void dxc_wwv_query(); extern void dxc_wwv_clear(); extern void dxc_help_query(); extern void dxc_help_clear(); extern void DXcluster_logoff(); extern void DXcluster_add_record(); extern void DXcluster_mode_check(); extern void DXcluster_band_check(); extern bool DXcluster_dupcheck(); extern bool DXcluster_connected; extern void send_DXcluster_spot(); extern void dxcluster_hosts_save(); extern void dxcluster_hosts_load(); extern void dxcluster_hosts_clear_setup(Fl_Button*, void*); extern void dxcluster_hosts_load_setup(Fl_Button*, void*); extern void dxcluster_hosts_save_setup(Fl_Button*, void*); extern void dxcluster_hosts_send_setup(Fl_Button*, void*); extern void dxcluster_ccc_help(Fl_Button*, void*); extern void dxcluster_arc_help(Fl_Button*, void*); extern void dxcluster_dxc_help(Fl_Button*, void*); extern void dxcluser_servers(Fl_Button*, void*); extern void dxcluster_hosts_load(); extern void dxc_lines(); extern void dxc_lines_redraw(); extern void dxc_click_m1(Fl_Button*, void*); extern void dxc_click_m2(Fl_Button*, void*); extern void dxc_click_m3(Fl_Button*, void*); extern void dxc_click_m4(Fl_Button*, void*); extern void dxc_click_m5(Fl_Button*, void*); extern void dxc_click_m6(Fl_Button*, void*); extern void dxc_click_m7(Fl_Button*, void*); extern void dxc_click_m8(Fl_Button*, void*); struct dxinfo { std::string spotter; std::string freq; std::string dxcall; std::string remark; std::string time; std::string info; std::string state; std::string country; std::string toall; bool dx; dxinfo() { clear(); } void clear() { spotter.clear(); freq.clear(); dxcall.clear(); remark.clear(); time.clear(); info.clear(); country.clear(); toall.clear(); dx = false; } ~dxinfo() {} }; #endif fldigi-4.2.05/src/include/combo.h0000664000175000017500000001033314611711171013445 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _FL_COMBOBOX_H #define _FL_COMBOBOX_H #include #include #include #include #include #include #include #include #define FL_COMBO_UNIQUE 1 #define FL_COMBO_UNIQUE_NOCASE 2 #define FL_COMBO_LIST_INCR 100 class Fl_ComboBox; enum {COMBOBOX, LISTBOX}; struct datambr { char *s; void *d; }; class Fl_PopBrowser : public Fl_Double_Window { friend void popbrwsr_cb(Fl_Widget *, long); Fl_Select_Browser *popbrwsr; int hRow; int wRow; std::string keystrokes; public: Fl_PopBrowser (int x, int y, int w, int h, const char *label); ~Fl_PopBrowser (); void popshow (int, int); void pophide (); void popbrwsr_cb_i (Fl_Widget *, long); void add (char *s, void *d = 0); void clear (); void sort (); int handle (int); void clear_kbd() { keystrokes.clear(); } Fl_Select_Browser *sb() { return popbrwsr; } Fl_ComboBox *parentCB; Fl_Widget *parentWindow; }; class Fl_ComboBox : public Fl_Group { friend int DataCompare (const void *, const void *); friend class Fl_PopBrowser; friend void val_callback(Fl_Widget *, void *); Fl_Button *btn; Fl_Box *valbox; Fl_Input *val; Fl_PopBrowser *Brwsr; datambr **datalist; int listsize; int maxsize; int listtype; int numrows_; int type_; int width; int height; void *retdata; int idx; Fl_Color _color; void insert(const char *, void *); public: Fl_ComboBox (int x, int y, int w, int h, const char *lbl = 0, int wtype = COMBOBOX); ~Fl_ComboBox(); const char *value (); void value (std::string); void put_value( const char *); void fl_popbrwsr(Fl_Widget *); void type (int = 0); void add (const char *s, void *d = 0); void clear (); void clear_entry() { if (type_ == LISTBOX) { valbox->label(""); valbox->redraw_label(); } else { val->value(""); val->redraw(); } } void sort (); int index (); void index (int i); int find_index(const char *str); void *data (); void textfont (int); void textsize (uchar); void textcolor (Fl_Color c); void color (Fl_Color c); void readonly(bool yes = true); int numrows() { return numrows_; } void numrows(int n) { numrows_ = n; } int lsize() { return listsize; } void set_focus() { Fl::focus(btn); }; void position(int n); void labelfont(Fl_Font fnt) { Fl_Group::labelfont(fnt); } Fl_Font labelfont() { return Fl_Group::labelfont(); } void labelsize(Fl_Fontsize n) { Fl_Group::labelsize(n); } Fl_Fontsize labelsize() { return Fl_Group::labelsize(); } int handle(int); // Custom resize behavior -- input stretches, button doesn't inline int val_x() { return x(); } inline int val_y() { return y(); } inline int val_w() { return w() - h(); } inline int val_h() { return h(); } inline int btn_x() { return x() + w() - h(); } inline int btn_y() { return y(); } inline int btn_w() { return h(); } inline int btn_h() { return h(); } void resize(int X, int Y, int W, int H) { Fl_Group::resize(X,Y,W,H); if (type_ == LISTBOX) valbox->resize(val_x(), val_y(), val_w(), val_h()); else val->resize(val_x(), val_y(), val_w(), val_h()); btn->resize(btn_x(), btn_y(), btn_w(), btn_h()); } }; class Fl_ListBox : public Fl_ComboBox { public: Fl_ListBox (int x, int y, int w, int h, const char *lbl = 0) : Fl_ComboBox(x,y,w,h,lbl,LISTBOX) {}; ~Fl_ListBox() {}; }; #endif fldigi-4.2.05/src/include/winkeyer.h0000664000175000017500000000436514611711171014213 00000000000000// ---------------------------------------------------------------------------- // winkeyer.h -- Interface to k1el WinKeyer hardware // // Copyright (C) 2017 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _WINKEYER_H #define _WINKEYER_H extern void WK_change_btn_swap(); extern void WK_change_btn_auto_space(); extern void WK_change_btn_ct_space(); extern void WK_change_btn_paddledog(); extern void WK_change_btn_cut_zeronine(); extern void WK_change_btn_paddle_echo(); extern void WK_change_btn_serial_echo(); extern void WK_change_btn_sidetone_on(); extern void WK_change_btn_tone_on(); extern void WK_change_btn_ptt_on(); extern void WK_change_cntr_min_wpm(); extern void WK_change_cntr_rng_wpm(); extern void WK_change_cntr_farnsworth(); extern void WK_change_cntr_cmd_wpm(); extern void WK_change_cntr_ratio(); extern void WK_change_cntr_comp(); extern void WK_change_cntr_first_ext(); extern void WK_change_cntr_sample(); extern void WK_change_cntr_weight(); extern void WK_change_cntr_leadin(); extern void WK_change_cntr_tail(); extern void WK_change_choice_keyer_mode(); extern void WK_change_choice_hang(); extern void WK_change_choice_sidetone(); extern void WK_change_choice_output_pins(); extern void WK_use_pot_changed(); extern void WKCW_connect(bool start); extern void WK_reset_timing(); extern void WK_set_comp(); extern int WK_send_char(int c); extern void WK_set_wpm(); extern void WK_tune(bool on); extern void WK_exit(); extern void WKFSK_init(); extern void WKFSK_connect(bool start); extern void WKFSK_send_char(int ch); #endif fldigi-4.2.05/src/include/logsupport.h0000664000175000017500000001043414611711171014566 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef LOG_SUPPORT_H #define LOG_SUPPORT_H #include #include #include #include "qso_db.h" #include "adif_io.h" #include "lgbook.h" #ifdef __WOE32__ # define ADIF_SUFFIX "adi" #else # define ADIF_SUFFIX "adif" #endif enum savetype {ADIF, CSV, TEXT, LOTW, LO}; enum sorttype {NONE, SORTCALL, SORTDATE, SORTFREQ, SORTMODE}; enum logtype { LOG_QSO, // No Contest LOG_GENERIC, // Generic contest LOG_AIDX, // Africa International DX LOG_FD, // ARRL Field Day LOG_AICW, // ARRL International DX (Cw) LOG_JOTA, // ARRL Jamboree On The Air LOG_KD, // ARRL Kids Day LOG_ARR, // ARRL Rookie Roundup LOG_RTTY, // ARRL RTTY LOG_ASCR, // ARRL School Club Roundup LOG_CWSS, // ARRL November Sweepstakes LOG_WFD, // ARRL Winter Field Day LOG_BART, // BARTG RTTY contest LOG_CQ_WPX, // CQ WPX LOG_CQWW_DX, // CQ WW Dx LOG_CQWW_RTTY, // CQ WW RTTY LOG_IARI, // Italian ARI International DX LOG_NAQP, // North American QSO Party LOG_NAS, // North American Sprint LOG_1010, // Ten Ten LOG_VHF, // VHF // LOG_WAE, // Worked All Europe LOG_SQSO // State QSO parties }; extern cQsoDb qsodb; extern cAdifIO adifFile; extern std::string logbook_filename; extern std::string sDate_on; extern std::string sDate_off; extern std::string sTime_on; extern std::string sTime_off; extern void loadBrowser(bool keep_pos = false); extern void Export_log(); extern void cb_SortByCall(); extern void cb_SortByDate(); extern void cb_SortByMode(); extern void cb_SortByFreq(); extern void cb_browser(Fl_Widget *, void *); extern void cb_mnuNewLogbook(Fl_Menu_* m, void* d); extern void cb_mnuOpenLogbook(Fl_Menu_* m, void* d); extern void cb_mnuSaveLogbook(Fl_Menu_*m, void* d); extern void cb_mnuMergeADIF_log(Fl_Menu_* m, void* d); extern void cb_mnuExportADIF_log(Fl_Menu_* m, void* d); extern void cb_mnuExportCSV_log(Fl_Menu_* m, void* d); extern void cb_mnuExportTEXT_log(Fl_Menu_* m, void* d); extern std::string lotw_rec(cQsoRec &rec); extern void cb_btnExportLoTW(); extern Fl_Double_Window *lotw_review_dialog; extern void cb_review_lotw(); extern void cb_send_lotw(); extern void send_to_lotw(void *); extern void cb_btn_verify_lotw(Fl_Button *, void *); extern void cb_btn_verify_eqsl(Fl_Button *, void *); extern void cb_btn_view_unmatched(Fl_Button *, void *); extern void cb_Export_Cabrillo(Fl_Menu_* m, void* d); extern void cb_export_date_select(); extern void saveLogbook(bool force = false); extern void cb_mnuShowLogbook(Fl_Menu_ *m, void* d); extern void activateButtons(); extern void saveRecord (); extern void clearRecord (); extern void updateRecord (); extern void deleteRecord (); extern void AddRecord (); extern void DisplayRecord (int idxRec); extern void SearchLastQSO (const char *); extern cQsoRec* SearchLog(const char *callsign); extern void DupCheck(); extern void show_dup(void *); extern void cb_search(Fl_Widget* w, void*); extern int log_search_handler(int); extern void reload_browser(); extern void restore_sort(); extern void cb_doExport(); extern void WriteCabrillo(); extern void dxcc_entity_cache_enable(bool v); extern bool qsodb_dxcc_entity_find(const char* country); extern void adif_read_OK(); extern std::string adif_record(cQsoRec *rec); extern std::string last_adif_record(); extern std::string all_adif_records(); extern void writeLog(std::string fname, cQsoDb *db); extern const char* log_power(); #endif fldigi-4.2.05/src/include/psk.h0000664000175000017500000001206114611711171013143 00000000000000// ---------------------------------------------------------------------------- // psk.h -- psk modem // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _PSK_H #define _PSK_H #include "complex.h" #include "modem.h" #include "globals.h" #include "viterbi.h" #include "filters.h" #include "pskcoeff.h" #include "pskvaricode.h" #include "viewpsk.h" #include "pskeval.h" #include "interleave.h" //MFSK varicode instead of psk for PSKR modes #include "mfskvaricode.h" //===================================================================== #define PipeLen (64) #define SNTHRESHOLD 6.0 #define AFCDECAYSLOW 8 #define NUM_FILTERS 4 #define MAX_CARRIERS 32 //===================================================================== class psk : public modem { private: // tx & rx int symbollen; int symbits; bool _qpsk; bool _pskr; bool _16psk; bool _8psk; bool _xpsk; bool _disablefec; bool _puncturing; int flushlength; double separation; double phaseacc[MAX_CARRIERS]; cmplx prevsymbol[MAX_CARRIERS]; unsigned int shreg; //FEC: 2nd stream unsigned int shreg2; int numinterleavers; //interleaver size (speed dependant) //double numcarriers; //Number of parallel carriers for M CAR PSK and PSKR and QPSKR int numcarriers; //Number of parallel carriers for M CAR PSK and PSKR and QPSKR double inter_carrier; // Frequency gap betweeb carriers // rx variables & functions C_FIR_filter *fir1[MAX_CARRIERS]; C_FIR_filter *fir2[MAX_CARRIERS]; double *fir1c; double *fir2c; Cmovavg *e0_filt; Cmovavg *e1_filt; Cmovavg *e2_filt; Cmovavg *e3_filt; bool displaysn; goertzel *re_Gbin[NUM_FILTERS]; goertzel *im_Gbin[NUM_FILTERS]; encoder *enc; viterbi *dec; //PSKR modes - 2nd Viterbi decoder and 2 receive de-interleaver for comparison viterbi *dec2; interleave *Rxinlv; interleave *Rxinlv2; interleave *Txinlv; unsigned int bitshreg; int rxbitstate; //PSKR modes - Soft decoding unsigned char symbolpair[2]; double fecmet; double fecmet2; bool vestigial; int sfft_size; sfft *vestigial_sfft; cmplx sfft_bins[11]; double phase; double freqerr; int bits; double bitclk; double syncbuf[16]; double scope_pipe[2*PipeLen];//[PipeLen]; unsigned int pipeptr; unsigned int dcdshreg; //PSKR modes - 2nd stream unsigned int dcdshreg2; int dcd; int dcdbits; cmplx quality; int acquire; int idepth; viewpsk* pskviewer; pskeval* evalpsk; void rx_symbol(cmplx symbol, int car); void rx_bit(int bit); void rx_bit2(int bit); void rx_qpsk(int bits); void rx_pskr(unsigned char symbol); double scopedata[16]; // IMD & s/n variables double k0, k1, k2; double I11, I12, I21, I22, I31, I32; double snratio, s2n, imdratio, imd; double afcmetric; //PSKR modes bool firstbit; bool startpreamble; //PSKR & 8PSK modes bool PSKviterbi; double vphase; double maxamp; //MULTI-CARRIER double sc_bw; // single carrier bandwidth // cmplx thirdorder; // tx variables & functions int accumulated_bits; //JD for multiple carriers int txsymbols[MAX_CARRIERS]; double *tx_shape; double *imd_shape; int preamble; void transmit(double *buf, int len); void tx_carriers(); void tx_symbol(int sym); void tx_bit(int bit); void tx_xpsk(int bit); void tx_char(unsigned char c); void tx_flush(); void update_syncscope(); void signalquality(); void findsignal(); void phaseafc(); void afc(); void coreafc(); void vestigial_afc(); void initSN_IMD(); void resetSN_IMD(); void calcSN_IMD(cmplx z); //PSKR modes - for Tx interleaver priming void clearbits(); protected: void s2nreport(void); public: psk(trx_mode mode); ~psk(); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); void searchDown(); void searchUp(); bool viewer_mode(); void clear_viewer() { if (pskviewer) pskviewer->clear(); // if ((mode >= MODE_PSK31 && mode <= MODE_PSK125) || // (mode >= MODE_QPSK31 && mode <= MODE_QPSK125)) pskviewer->clear(); } void clear_ch(int n) { pskviewer->clearch(n); } int viewer_get_freq(int n) { if (pskviewer) pskviewer->get_freq(n); return 0; } }; #endif fldigi-4.2.05/src/include/record_browse.h0000664000175000017500000000106214611711171015204 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef record_browse_h #define record_browse_h #include #include "record_loader_gui.h" #include #include #include extern Fl_Group *tabDataFiles; #include extern Fl_Input_Choice *inpDataSources; #include extern Fl_Light_Button *btnDataSourceUpdate; #include extern Fl_Button *btnDataSourceReset; Fl_Double_Window* make_record_loader_window(); #endif fldigi-4.2.05/src/include/pixmaps.h0000664000175000017500000000665314532252172014044 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PIXMAPS_H_ #define PIXMAPS_H_ extern const char *address_book_icon[]; extern const char *edit_undo_icon[]; extern const char *edit_select_all_icon[]; extern const char *edit_clear_icon[]; extern const char *edit_copy_icon[]; extern const char *edit_cut_icon[]; extern const char *edit_paste_icon[]; extern const char *file_open_icon[]; extern const char *format_indent_more_icon[]; extern const char *left_arrow_icon[]; extern const char *log_out_icon[]; extern const char *minus_icon[]; extern const char *net_icon[]; extern const char *plus_icon[]; extern const char *process_stop_icon[]; extern const char *right_arrow_icon[]; extern const char *save_as_icon[]; extern const char *save_icon[]; extern const char *time_icon[]; extern const char *trash_icon[]; extern const char *image_icon[]; extern const char *weather_clear_icon[]; extern const char *start_here_icon[]; extern const char *help_browser_icon[]; extern const char *system_search_icon[]; extern const char *system_software_update_icon[]; extern const char *utilities_terminal_icon[]; extern const char *emblem_symbolic_link_icon[]; extern const char *emblems_system_icon[]; extern const char *dialog_information_icon[]; extern const char *executable_icon[]; extern const char *other_icon[]; extern const char *folder_open_icon[]; extern const char *preferences_system_icon[]; extern const char *preferences_desktop_font_icon[]; extern const char *system_users_icon[]; extern const char *utilities_system_monitor_icon[]; extern const char *multimedia_player_icon[]; extern const char *chat_icon[]; extern const char *dialog_information_48_icon[]; extern const char *dialog_warning_48_icon[]; extern const char *refresh_icon[]; extern const char *text_editor_icon[]; extern const char *text_icon[]; extern const char *shutdown_icon[]; extern const char *applications_system_icon[]; extern const char *audio_card_icon[]; extern const char *help_about_icon[]; extern const char *insert_link_icon[]; extern const char *close_icon[]; extern const char *apply_icon[]; extern const char *enter_key_icon[]; extern const char *dialog_question_48_icon[]; extern const char *clear_sq_icon[]; extern const char *clear_row_icon[]; extern const char *rx1_icon[]; extern const char *tx1_icon[]; extern const char *rx2_icon[]; extern const char *tx2_icon[]; extern const char *rx_icon[]; extern const char *tx_icon[]; extern const char *fldigi_icon[]; extern const char *flarq_icon[]; extern const char *waterfall_icon[]; extern const char *dice_icon[]; extern const char *pskr_icon[]; extern const char *tango_view_refresh[]; #endif // PIXMAPS_H_ fldigi-4.2.05/src/include/counties.h0000664000175000017500000000420214611711171014175 00000000000000// ---------------------------------------------------------------------------- // states.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // Extracted from FIPS 2010 census data #ifndef _COUNTIES_H #define _COUNTIES_H #include #include struct STATE_COUNTY_QUAD { std::string state; // state long name std::string ST; // state abbreviated std::string county; // county long name std::string CTY; // county abbreviated }; class Cstates { private: size_t next; public: Cstates() {} ~Cstates(){} // static struct STATE_COUNTY_QUAD vec_SQSO[]; bool valid_county( std::string st, std::string cty ); const std::string names(); const std::string counties(std::string st); const std::string county(std::string st, std::string cnty); const std::string cnty_short(std::string st, std::string cnty); const std::string state(std::string ST); const std::string state_short(std::string ST); }; extern Cstates states; extern const std::string counties(); //extern const std::string six_qp_counties(); //extern const std::string seven_qp_counties(); extern void load_counties(); extern void save_counties(); extern std::vector vec_SQSO; extern std::vector vec_6QP; extern std::vector vec_7QP; extern const char *szSQSO; extern const char *sz7QP; extern const char *szNEQP; #endif fldigi-4.2.05/src/include/hidapi.h0000664000175000017500000000175714611711171013616 00000000000000/*********************************************************************** HIDAPI - Multi-Platform library for communication with HID devices. Alan Ott Signal 11 Software Copyright 2009, All Rights Reserved. C++ implementation * Copyright 2021 * David Freese, W1HKJ * for use in fldigi This software is licensed under the terms of the GNU General Public License v3. ***********************************************************************/ #include #define HID_API_VERSION_MAJOR 0 #define HID_API_VERSION_MINOR 10 #define HID_API_VERSION_PATCH 1 /* Helper macros */ #define HID_API_AS_STR_IMPL(x) #x #define HID_API_AS_STR(x) HID_API_AS_STR_IMPL(x) #define HID_API_TO_VERSION_STR(v1, v2, v3) HID_API_AS_STR(v1.v2.v3) #define HID_API_VERSION_STR HID_API_TO_VERSION_STR(HID_API_VERSION_MAJOR, HID_API_VERSION_MINOR, HID_API_VERSION_PATCH) #ifdef __WIN32__ # include "hid_win.h" # else # ifdef __APPLE__ # include "hid_mac.h" # else # include "hid_lin.h" # endif #endif fldigi-4.2.05/src/include/dxcc.h0000664000175000017500000000376014611711171013275 00000000000000// ---------------------------------------------------------------------------- // dxcc.h // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef DXCC_H_ #define DXCC_H_ #include #include #include struct dxcc { const char* country; int cq_zone; int itu_zone; char continent[3]; float latitude; float longitude; float gmt_offset; dxcc(const char* cn = "", int cq = 0, int itu = 0, const char* ct = "", float lat = 0.0f, float lon = 0.0f, float tz = 0.0f); void print() { std::cout << country << ", " << cq_zone << ", " << itu_zone << ", " << continent << ", " << latitude << ", " << longitude << ", " << gmt_offset << "\n"; } }; enum qsl_t { QSL_LOTW, QSL_EQSL, QSL_END }; extern const char* qsl_names[]; bool dxcc_open(const char* filename); bool dxcc_is_open(void); void dxcc_close(void); const dxcc* dxcc_lookup(const char* callsign); const std::vector* dxcc_entity_list(void); extern std::string cbolist; bool qsl_open(const char* filename, qsl_t qsl_type); unsigned char qsl_is_open(void); void qsl_close(void); unsigned char qsl_lookup(const char* callsign); extern void reload_cty_dat(); extern void default_cty_dat_pathname(); extern void select_cty_dat_pathname(); #endif // DXCC_H_ fldigi-4.2.05/src/include/mbuffer.h0000664000175000017500000002326214532252172014004 00000000000000// ---------------------------------------------------------------------------- // mbuffer.h // // Copyright (C) 2007 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // A simple vector wrapper for fldigi's double-buffering needs. // Most vector operations are provided for mbuffers by redirecting them to the // current vector. // The template arguments are // 1) T - the type // 2) S - the apparent mbuffer size, i.e., the size of each vector. Defaults to 0. // A mbuffer instantiated with S == 0 is not very useful until resized // with alloc(). // 3) N - the number of vectors that we can cycle between. Defaults to 1. // Things to note: // 1) There is a T* conversion operator // 2) Operations that modify the length of the container are not provided // 3) Comparison operators are not implemented (but see (1)!) // 4) mbuffer is meant to be used when we don't know the size at // compile time, in which case we resize with alloc. The compiler will treat // mbuffers resized to different lengths in this way as objects of the same type. #ifndef MBUFFER_H #define MBUFFER_H #include #include #ifndef NDEBUG #include #include #endif #ifndef NDEBUG template class mbuffer; template std::ostream& operator<<(std::ostream& o, const mbuffer& b); #endif // NDEBUG template class mbuffer { protected: std::vector data[N]; mutable std::size_t cur; public: explicit mbuffer(void) { alloc(S); } explicit mbuffer(std::size_t n) { alloc(n); } mbuffer(const std::vector& v) { data[0] = v; // resize 1 to N only alloc(data[0].size(), 1); } mbuffer(const T* a, std::size_t n) { data[0].assign(a, a + n); // resize 1 to N only alloc(n, 1); } void alloc(std::size_t n, std::size_t start = 0) { for (size_t i = start; i < N; ++i) data[i].resize(n); cur = 0; } typedef typename std::vector::iterator iterator; typedef typename std::vector::const_iterator const_iterator; iterator begin(void) { return data[cur].begin(); } const_iterator begin(void) const { return data[cur].begin(); } iterator end(void) { return data[cur].end(); } const_iterator end(void) const { return data[cur].end(); } typedef typename std::vector::reverse_iterator reverse_iterator; typedef typename std::vector::const_reverse_iterator const_reverse_iterator; reverse_iterator rbegin(void) { return reverse_iterator(end()); } const_reverse_iterator rbegin(void) const { return const_reverse_iterator(end()); } reverse_iterator rend(void) { return reverse_iterator(begin()); } const_reverse_iterator rend(void) const { return const_reverse_iterator(begin()); } typedef typename std::vector::value_type value_type; typedef typename std::vector::reference reference; typedef typename std::vector::const_reference const_reference; typedef typename std::vector::size_type size_type; typedef typename std::vector::difference_type difference_type; // These should be the same for all vectors in data[] size_type size(void) { return data[0].size(); } size_type max_size(void) { return data[0].max_size(); } size_type capacity(void) { return data[0].capacity(); } bool empty(void) { return data[0].empty(); } // Instead of these, we provide a conversion operator for T* // reference operator[](size_type i) { return data[cur][i]; } // const_reference operator[](size_type i) const { return data[cur][i]; } reference at(size_type i) { return data[cur].at(i); } const_reference at(size_type i) const { return data[cur].at(i); } reference front(void) { return data[cur].front(); } const_reference front(void) const { return data[cur].front(); } reference back(void) { return data[cur].back(); } const_reference back(void) const { return data[cur].back(); } // Operations that modify the size of data[cur] might invalidate // pointers to internal buffers. The rest of the data vectors would need // to be resized, e.g. with check_size below. For this reason these // operations are not provided, but are included here for completeness // void check_size(void) // { // for (size_t i = 0; i < N; ++i) // if (data[i].size() != data[cur].size()) // data[i].resize(data[cur].size()); // } // mbuffer& operator=(const mbuffer& o) // { // for (int i = 0; i < N; ++i) // std::copy(o.data[i].begin(), o.data[i].end(), data[i].begin()); // return *this; // } // std::vector& operator=(const std::vector& o) // { // std::copy(o.begin(), o.end(), data[cur].begin()); // check_size(); // return data[cur]; // } // The methods below would modify the length of the vector. // We would need to check_size() before returning from them. // There is no vector::assign; the one provided here fills the vector // with copies of the same value without causing a resize. void assign(const_reference v) { std::fill_n(begin(), size(), v); } // template // void assign(input_iterator first, input_iterator last) // { // data[cur].assign(first, last); // } // void push_back(const_reference v) { data[cur].push_back(v); } // void pop_back(void) { data[cur].pop_back(); } // iterator insert(iterator pos, const_reference v) // { // return data[cur].insert(pos, v); // } // iterator insert(iterator pos, size_type n, const_reference v) // { // return data[cur].insert(pos, n, v); // } // template // void insert(iterator pos, input_iterator first, input_iterator last) // { // data[cur].insert(pos, first, last); // } // iterator erase(iterator pos) { return data[cur].erase(pos); } // iterator erase(iterator first, iterator last) { return data[cur].erase(first, last); } // void clear(void) { data[cur].clear(); } void swap(mbuffer& o) { for (int i = 0; i < N; ++i) std::swap(data[i].begin(), data[i].end(), o.data[i].begin()); } // void swap(std::vector& o) // { // std::swap(data[cur].begin(), data[cur].end(), o.begin()); // check_size(); // o.check_size(); // } // and now for something completely different void next(void) const { if (++cur == N) cur = 0; } void prev(void) const { if (cur > 0) --cur; } void reset(void) const { cur = 0; } T* c_array(void) { return &data[cur][0]; } operator T*(void) { return c_array(); } const T* c_array(void) const { return &data[cur][0]; } operator const T*(void) const { return c_array(); } std::vector& vec(void) { return data[cur]; } const std::vector& vec(void) const { return data[cur]; } // We also do not provide vector conversions // operator std::vector&(void) { return vec(); } // operator const std::vector&(void) const { return vec(); } std::size_t idx(void) { return cur; } std::size_t nvec(void) { return N; } std::vector* vecp(std::size_t i) { return &data[i]; } #ifndef NDEBUG friend std::ostream& operator<<<>(std::ostream& o, const mbuffer& b); #endif // NDEBUG }; #ifndef NDEBUG template std::ostream& operator<<(std::ostream& o, const mbuffer& b) { for (std::size_t i = 0; i < N; ++i) { o << '<' << i << ">\n"; copy(b.data[i].begin(), b.data[i].end(), std::ostream_iterator(o, "\n")); } return o; } #endif // NDEBUG template inline void swap(mbuffer& a, mbuffer& b) { a.swap(b); } #endif // MBUFFER_H // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/analysis.h0000664000175000017500000000406314611711171014174 00000000000000// ---------------------------------------------------------------------------- // anal.h -- frequency analysis modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Modified for data file creation / analysis JC Gibbons N8OBJ 5/14/19 // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _anal_H #define _anal_H #include #include #include #include "complex.h" #include "filters.h" #include "fftfilt.h" #include "modem.h" #define ANAL_SAMPLERATE 8000 #define FILT_LEN 4 //seconds #define PIPE_LEN 120 #define DSP_CNT 1 //seconds #define ANAL_BW 4 class anal : public modem { private: double phaseacc; fftfilt *bpfilt; Cmovavg *ffilt; Cmovavg *afilt; double pipe[PIPE_LEN]; double prevsymbol; cmplx prevsmpl; double fout; double amp; long int wf_freq; double dspcnt; long int passno; int rxcorr; struct timespec start_time; struct tm File_Start_Date; double elapsed; void clear_syncscope(); inline cmplx mixer(cmplx in); int rx(bool bit); double nco(double freq); void writeFile(); void createfilename(); char FileDate [20]; char FileData [20]; public: anal(); ~anal(); void init(); void rx_init(); void tx_init(); void restart(); void start_csv(); void stop_csv(); int rx_process(const double *buf, int len); int tx_process(); std::string analysisFilename; std::string OpenAnalalysisFile; }; #endif fldigi-4.2.05/src/include/spectrum.h0000664000175000017500000000352514611711171014215 00000000000000// ---------------------------------------------------------------------------- // digiscope.h, Miniature Oscilloscope/Phasescope Widget // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted in part from code contained in // gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef SPECTRUM_H #define SPECTRUM_H #include #include "digiscope.h" class spectrum : public Digiscope { public: private: bool _paused; double _freq; double _db; double _db_diff; double _f_diff; double _gofreq; void handle_shift_leftclick(int x); void handle_leftclick( int x, int y); void handle_rightclick( int x, int y); public: spectrum(int, int, int, int); ~spectrum(); bool paused() { return _paused; } void paused(bool on) { _paused = on; } double freq() { return _freq; } double db() { return _db; } double db_diff() { return _db_diff; } double f_diff() { return _f_diff; } double gofreq() { return _gofreq; } void gofreq(double f) { _gofreq = f; } int handle(int); }; #endif fldigi-4.2.05/src/include/pskcoeff.h0000664000175000017500000000224114611711171014145 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _COEFF_H #define _COEFF_H #define FIRLEN 64 extern double gmfir1c[]; extern double gmfir2c[]; extern double pskcore_filter[]; extern double syncfilt[16]; extern void raisedcosfilt(double *, int len); extern void wsincfilt(double *, double fc, int len, bool blackman = true); #endif fldigi-4.2.05/src/include/rtty.h0000664000175000017500000001306314611711171013353 00000000000000// ---------------------------------------------------------------------------- // rtty.h -- RTTY modem // // Copyright (C) 2012 // Dave Freese, W1HKJ // Stefan Fendt, DL1SMF // // This file is part of fldigi. // // This code bears some resemblance to code contained in gmfsk from which // it originated. Much has been changed, but credit should still be // given to Tomi Manninen (oh2bns@sral.fi), who so graciously distributed // his gmfsk modem under the GPL. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _RTTY_H #define _RTTY_H #include #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #include "view_rtty.h" #include "serial.h" #include "fsk.h" #define RTTY_SampleRate 8000 //#define RTTY_SampleRate 11025 //#define RTTY_SampleRate 12000 #define MAXPIPE 1024 #define MAXBITS (2 * RTTY_SampleRate / 23 + 1) #define LETTERS 0x100 #define FIGURES 0x200 #define dispwidth 100 // simple oscillator-class class Oscillator { public: Oscillator( double samplerate ); ~Oscillator() {} double Update( double frequency ); private: double m_phase; double m_samplerate; }; class SymbolShaper { public: SymbolShaper(double baud = 45.45, double sr = 8000.0); ~SymbolShaper(); void reset(); void Preset(double baud, double sr); void print_sinc_table(); double Update( bool state ); private: int m_table_size; double* m_sinc_table; bool m_State; double m_Accumulator; long m_Counter0; long m_Counter1; long m_Counter2; long m_Counter3; long m_Counter4; long m_Counter5; double m_Factor0; double m_Factor1; double m_Factor2; double m_Factor3; double m_Factor4; double m_Factor5; double m_SincTable[1024]; double baudrate; double samplerate; }; //enum TTY_MODE { LETTERS, FIGURES }; class rtty : public modem { public: enum RTTY_RX_STATE { RTTY_RX_STATE_IDLE = 0, RTTY_RX_STATE_START, RTTY_RX_STATE_DATA, RTTY_RX_STATE_PARITY, RTTY_RX_STATE_STOP, RTTY_RX_STATE_STOP2 }; enum RTTY_PARITY { RTTY_PARITY_NONE = 0, RTTY_PARITY_EVEN, RTTY_PARITY_ODD, RTTY_PARITY_ZERO, RTTY_PARITY_ONE }; static const double SHIFT[]; static const double BAUD[]; static const int BITS[]; static const int FILTLEN[]; static const int numshifts; static const int numbauds; private: Oscillator *m_Osc1; Oscillator *m_Osc2; SymbolShaper *m_SymShaper1; SymbolShaper *m_SymShaper2; double shift; int symbollen; int nbits; int stoplen; int msb; double phaseacc; double rtty_squelch; double rtty_shift; double rtty_BW; double rtty_baud; int rtty_bits; RTTY_PARITY rtty_parity; int rtty_stop; bool rtty_msbfirst; double mark_noise; double space_noise; Cmovavg *bits; bool nubit; bool bit; bool bit_buf[MAXBITS]; double mark_phase; double space_phase; fftfilt *mark_filt; fftfilt *space_filt; int filter_length; double *pipe; double *dsppipe; int pipeptr; cmplx mark_history[MAXPIPE]; cmplx space_history[MAXPIPE]; RTTY_RX_STATE rxstate; int counter; int bitcntr; int rxdata; double cfreq; // center frequency between MARK/SPACE tones double shift_offset; // 1/2 rtty_shift double prevsymbol; cmplx prevsmpl; double xy_phase; double rotate; cmplx QI[MAXPIPE]; int inp_ptr; cmplx xy; bool clear_zdata; double sigpwr; double noisepwr; double avgsig; double mark_mag; double space_mag; double mark_env; double space_env; double noise_floor; double FSKbuf[OUTBUFSIZE]; // signal array for qrq drive double FSKphaseacc; double FSKnco(); unsigned char lastchar; int rxmode; int shift_state; bool preamble; void Clear_syncscope(); void Update_syncscope(); double IF_freq; inline cmplx mixer(double &phase, double f, cmplx in); unsigned char Bit_reverse(unsigned char in, int n); int decode_char(); bool rx(bool bit); view_rtty *rttyviewer; // transmit double nco(double freq); void send_symbol(int symbol, int len); void send_stop(); void send_char(int c); void send_idle(); int rttyxprocess(); int baudot_enc(unsigned char data); char baudot_dec(unsigned char data); void Metric(); bool is_mark_space(int &); bool is_mark(); //---------------------------------------------------------------------- // FSK via signal control line [serial DTR or RTS pin] //---------------------------------------------------------------------- FSK *fsk_tty; void send_FSK(int); // FSK via flrig DTR/RTS void flrig_fsk_send(char c); double rtty_now(); int rtty_sleep (double); public: rtty(trx_mode mode); ~rtty(); void init(); void rx_init(); void tx_init(); void restart(); void reset_filters(); int rx_process(const double *buf, int len); int tx_process(); void flush_stream(); void clear_viewer() { rttyviewer->clear(); } void clear_ch(int n) { rttyviewer->clearch(n); } int viewer_get_freq(int n) { return rttyviewer->get_freq(n); } void searchDown(); void searchUp(); void resetFSK(); }; int rttyparity(unsigned int, int); #endif fldigi-4.2.05/src/include/cw.h0000664000175000017500000001621614611711171012765 00000000000000// ---------------------------------------------------------------------------- // cw.h -- morse code modem // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted in part from code contained in // gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _CW_H #define _CW_H #include #include #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "mbuffer.h" #include "view_cw.h" #define CW_SAMPLERATE 8000 #define CWMaxSymLen 4096 // AG1LE: - was 4096 #define MAX_MORSE_ELEMENTS 6 // maximum of 6 elements in a Morse character 256 // CW function return status codes. #define CW_SUCCESS 0 #define CW_ERROR -1 #define ASC_NUL '\0' // End of string #define ASC_SPACE ' ' // ASCII space char // Tone and timing magic numbers. #define KWPM (12 * CW_SAMPLERATE/10) // # samples in dot = KWPM / WPM #define CWKNUM ((KWPM) / 10) // 640, 1/2 dot length at 5 wpm #define TONE_SILENT 0 // 0Hz = silent 'tone' #define USECS_PER_SEC 1000000 // Microseconds in a second #define INITIAL_SEND_SPEED 18 // Initial send speed in WPM #define INITIAL_RECEIVE_SPEED 18 // Initial receive speed in WPM // Initial adaptive speed threshold #define INITIAL_THRESHOLD (((KWPM) / INITIAL_RECEIVE_SPEED) * 2) // Initial noise filter threshold #define INITIAL_NOISE_THRESHOLD (((KWPM) / CW_MAX_SPEED) / 2) #define TRACKING_FILTER_SIZE 16 #define MAX_PIPE_SIZE (22 * CW_SAMPLERATE * 12 / 800) enum CW_RX_STATE { RS_IDLE = 0, RS_IN_TONE, RS_AFTER_TONE }; enum CW_EVENT { CW_RESET_EVENT, CW_KEYDOWN_EVENT, CW_KEYUP_EVENT, CW_QUERY_EVENT }; class cw : public modem { #define CLRCOUNT 16 #define DEC_RATIO 16 // Maximum number of signs (dit or dah) in a Morse char. #define WGT_SIZE 7 struct SOM_TABLE { std::string rpr; // The printable representation of the character float wgt[WGT_SIZE]; // Dot-dash weight vector }; protected: int symbollen; // length of a dot in sound samples (tx) int fsymlen; // length of extra interelement space (farnsworth) double phaseacc; // used by NCO for rx/tx tones double FFTphase; double FFTvalue; unsigned int smpl_ctr; // sample counter for timing cw rx double agc_peak; // threshold for tone detection bool use_matched_filter; double upper_threshold; double lower_threshold; fftfilt *cw_FFT_filter; // sinc / matched filter Cmovavg *bitfilter; Cmovavg *trackingfilter; int bitfilterlen; CW_RX_STATE cw_receive_state; // Indicates receive state CW_RX_STATE old_cw_receive_state; CW_EVENT cw_event; // functions used by cw process routine double pipe[MAX_PIPE_SIZE+1]; // storage for sync scope data double clearpipe[MAX_PIPE_SIZE+1]; mbuffer scopedata; int pipeptr; int pipesize; bool scope_clear; // user configurable data - local copy passed in from gui int cw_speed; int cw_bandwidth; int cw_squelch; int cw_send_speed; // Initially 18 WPM int cw_receive_speed; // Initially 18 WPM bool usedefaultWPM; // use default WPM int cw_upper_limit; int cw_lower_limit; long int cw_noise_spike_threshold; // Initially ignore any tone < 10mS int cw_in_sync; // Synchronization flag // Sending parameters: long int cw_send_dot_length; // Length of a send Dot, in Usec long int cw_send_dash_length; // Length of a send Dash, in Usec int lastsym; // last symbol sent double risetime; // leading/trailing edge rise time (msec) int knum; // number of samples on edges int qnum; // number of samples on QSK signal edges int QSKshape; // leading/trailing edge shape factor double qskbuf[OUTBUFSIZE]; // signal array for qsk drive double qskphase; // bool firstelement; bool lastelement; double maxval; // double *keyshape; // array defining leading edge // Receiving parameters: long int cw_receive_dot_length; // Length of a receive Dot, in Usec long int cw_receive_dash_length; // Length of a receive Dash, in Usec // Receive buffering std::string rx_rep_buf; int cw_rr_current; // Receive buffer current location unsigned int cw_rr_start_timestamp; // Tone start timestamp unsigned int cw_rr_end_timestamp; // Tone end timestamp long int two_dots; // 2-dot threshold for adaptive speed int in_replay; //AG1LE: if we have replay even, set to 1 otherwise = 0 ; // Receive adaptive speed tracking. double dot_tracking; double dash_tracking; inline double nco(double freq); inline double qsknco(); void update_syncscope(); void clear_syncscope(); void update_Status(); void sync_parameters(); void reset_rx_filter(); int handle_event(int cw_event, std::string &sc); inline int usec_diff(unsigned int earlier, unsigned int later); void send_symbol(int symbol, int len, int state); void send_ch(int c); bool tables_init(); unsigned int tokenize_representation(char *representation); void update_tracking(int dot, int dash); static const SOM_TABLE som_table[]; float cw_buffer[512]; int cw_ptr; int clrcount; double lowerwpm; double upperwpm; int synchscope; double noise_floor; double sig_avg; double siglevel; bool use_paren; std::string prosigns; cmplx mixer(cmplx in); // transmit wave shaping int nusymbollen; int nufsymlen; int kpre; int kpost; double wpm; double fwpm; double cal_wpm; void create_edges(); void sync_transmit_parameters(); void flush_audio(); void send_CW(int); view_cw viewcw; public: cw(); ~cw(); void init(); void rx_init(); void tx_init(); void restart() {}; int rx_process(const double *buf, int len); void rx_FFTprocess(const double *buf, int len); void rx_FIRprocess(const double *buf, int len); void decode_stream(double); int tx_process(); void incWPM(); void decWPM(); void toggleWPM(); double calWPM() { return cal_wpm; } void calWPM(double val) { cal_wpm = val; } int normalize(float *v, int n, int twodots); std::string find_winner (float *inbuf, int twodots); }; extern bool CW_table_changed; extern bool CW_KEYLINE_isopen; extern void close_CW_KEYLINE(); extern int open_CW_KEYLINE(); extern bool CW_KEYLINE_isopen; extern void cwio_ptt(int on); extern void cwio_key(int on); extern void cal_cwio(); extern void cwio_display_calibration(); extern void calibrate_cwio(); extern void CAT_keying_calibrate(); extern void flrig_cwio_send(char); extern pthread_mutex_t cwio_ptt_mutex; #endif fldigi-4.2.05/src/include/confdialog.h0000664000175000017500000012224414611711171014460 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef confdialog_h #define confdialog_h #include #include "font_browser.h" #include "globals.h" #include "modem.h" #include "configuration.h" #include "combo.h" #include "flinput2.h" #include "flslider2.h" #include "flmisc.h" extern Fl_Double_Window *dlgConfig; extern Mode_Browser* mode_browser; struct CONFIG_PAGE {Fl_Group *grp; std::string label; CONFIG_PAGE(Fl_Group *_grp = 0, std::string _lbl = "") { grp = _grp; label = _lbl; } ~CONFIG_PAGE() { if (grp) delete grp; } }; extern std::vector config_pages; void SelectItem_CB(Fl_Widget *w); void cbWaterfallFontBrowser(Fl_Widget*, void*); void cbViewerFontBrowser(Fl_Widget*, void*); void cbFreqControlFontBrowser(Fl_Widget*, void*); void set_qrzxml_buttons(Fl_Button* b); void set_qrzweb_buttons(Fl_Button* b); class Fl_File_Chooser ; void createConfig(); #include #include #include extern Fl_Tree *tab_tree; #include extern Fl_Button *btn_collapse_tab_tree; #include extern Fl_Round_Button *btnQRZWEBnotavailable; extern Fl_Round_Button *btnQRZonline; extern Fl_Round_Button *btnHAMCALLonline; extern Fl_Round_Button *btnHamQTHonline; extern Fl_Round_Button *btnCallookOnline; extern Fl_Input2 *inp_qrzurl; extern Fl_Input2 *inp_hamcallurl; extern Fl_Input2 *inp_hamqthurl; extern Fl_Input2 *inp_callook_url; extern Fl_Round_Button *btnQRZXMLnotavailable; extern Fl_Round_Button *btnQRZcdrom; extern Fl_Round_Button *btnQRZsub; extern Fl_Round_Button *btnHamcall; extern Fl_Round_Button *btnHamQTH; extern Fl_Round_Button *btnCALLOOK; extern Fl_Input2 *txtQRZpathname; extern Fl_Input2 *inpQRZusername; extern Fl_Input2 *inpQRZuserpassword; extern Fl_Button *btnQRZpasswordShow; #include extern Fl_Check_Button *btn_notes_address; extern Fl_Check_Button *btn_clear_notes; #include "dxcc.h" extern Fl_Input2 *txt_cty_dat_pathname; extern Fl_Button *btn_select_cty_dat; extern Fl_Button *btn_default_cty_dat; extern Fl_Button *btn_reload_cty_dat; extern Fl_Button *btnSpotColor; extern Fl_Button *btnRevColor; extern Fl_Button *btnTuneColor; extern Fl_Button *btnRxIDColor; extern Fl_Button *btnLkColor; extern Fl_Button *btnSql1Color; extern Fl_Button *btnXmtColor; extern Fl_Button *btnRxIDwideColor; extern Fl_Button *btnAfcColor; extern Fl_Button *btnSql2Color; extern Fl_Button *btnTxIDColor; #include extern Fl_Box *spotcolor; extern Fl_Box *revcolor; extern Fl_Box *tunecolor; extern Fl_Box *rxidcolor; extern Fl_Box *lockcolor; extern Fl_Box *sql1color; extern Fl_Box *rxidcolorwide; extern Fl_Box *xmtcolor; extern Fl_Box *afccolor; extern Fl_Box *sql2color; extern Fl_Box *txidcolor; extern Fl_Button *btn_default_btn_color; extern Fl_Box *default_btn_color; extern Fl_Button *btn_check_btn_color; extern Fl_Box *default_check_btn_color; extern Fl_Button *btn_default_round_btn_color; extern Fl_Box *default_round_btn_color; extern Fl_Button *btnMenuFont; extern Fl_Box *FDdisplay; extern Fl_Button *btn_freq_control_font; extern Fl_Button *btnBackgroundColor; extern Fl_Button *btnForegroundColor; extern Fl_Button *btnFD_SystemColor; extern Fl_Button *btnSmeter_bg_color; extern Fl_Button *btnSmeter_scale_color; extern Fl_Button *btnSmeter_meter_color; extern Fl_Button *btnPWR_bg_color; extern Fl_Button *btnPWR_scale_color; extern Fl_Button *btnPWR_meter_Color; extern Fl_ListBox *listboxPWRselect; extern Fl_Check_Button *btnUseGroupColors; extern Fl_Button *btnGroup1; extern Fl_Button *btnGroup2; extern Fl_Button *btnGroup3; extern Fl_Button *btnFkeyDEfaults; extern Fl_Button *btnMacroBtnFont; #include extern Fl_Output *LOGGINGdisplay; extern Fl_Button *btnLOGGING_color; extern Fl_Button *btn_LOGGING_font; extern Fl_Button *btnLOGGINGdefault_colors_font; extern Fl_Output *LOGBOOKdisplay; extern Fl_Button *btnLOGBOOK_color; extern Fl_Button *btn_LOGBOOK_font; extern Fl_Button *btnLOGBOOKdefault_colors_font; extern Fl_Output *DXC_display; extern Fl_Button *btn_DXC_font; extern Fl_Button *btnDXCdefault_colors_font; extern Fl_Button *btn_DXC_even_lines; extern Fl_Button *btn_DXC_odd_lines; #include extern Fl_Input *StreamText; extern Fl_Button *btnDXcolor; extern Fl_Button *btnDXfont; extern Fl_Button *btnDXalt_color; extern Fl_Button *btnDXdefault_colors_font; #include "fl_digi.h" extern Fl_ListBox *listbox_charset_status; extern Fl_Input *RxText; extern Fl_Button *btnRxColor; extern Fl_Button *btnTxColor; extern Fl_Input *TxText; extern Fl_Button *btnRxFont; extern Fl_Button *btnTxFont; extern Fl_Input *MacroText; extern Fl_Button *btnMacroEditFont; extern Fl_Button *btnXMIT; extern Fl_Button *btnCTRL; extern Fl_Button *btnSKIP; extern Fl_Button *btnALTR; extern Fl_Button *btnSEL; extern Fl_Button *btnNoTextColor; extern Fl_Button *btnTextDefaults; extern Fl_Check_Button *btn_show_all_codes; extern Fl_Button *btnTabColor; extern Fl_Button *btnTabDefaultColor; extern Fl_Box *lowcolor; extern Fl_Button *btnLowSignal; extern Fl_Box *normalcolor; #include extern Fl_Counter *cnt_normal_signal_level; extern Fl_Button *btnNormalSignal; extern Fl_Box *highcolor; extern Fl_Counter *cnt_high_signal_level; extern Fl_Button *btnHighSignal; extern Fl_Box *overcolor; extern Fl_Counter *cnt_over_signal_level; extern Fl_Button *btnOverSignal; #include #include "vumeter.h" extern vumeter *sig_vumeter; extern Fl_Button *btn_default_signal_levels; extern Fl_Check_Button *btn_use_wsjtx_vumeter_scale; extern Fl_Box *scope_background; extern Fl_Button *btnScopeBackground; extern Fl_Box *scope_axis; extern Fl_Button *btnScopeAxis; extern Fl_Box *scope_color_1; extern Fl_Button *btnScopeColor_1; extern Fl_Box *scope_color_2; extern Fl_Button *btnScopeColor_2; extern Fl_Button *btn_default_scope_colors; extern Fl_Box *scope_color_3; extern Fl_Button *btnScopeColor_3; extern Fl_Box *scope_color_4; extern Fl_Button *btnScopeColor_4; #include "contest.h" extern Fl_ListBox *listbox_contest; extern Fl_ListBox *listbox_QP_contests; extern Fl_Input2 *inp_contest_notes; #include extern Fl_Light_Button *btnDupCheckOn; extern Fl_Check_Button *btnDupBand; extern Fl_Check_Button *btnDupMode; extern Fl_Check_Button *btnDupTimeSpan; #include extern Fl_Button *btnDupColor; extern Fl_Button *btnPossibleDupColor; extern Fl_Check_Button *btnDupXchg1; extern Fl_Check_Button *btnDupState; extern Fl_Value_Input2 *nbrTimeSpan; extern Fl_Input2 *inpSend1; extern Fl_Check_Button *btn599; extern Fl_Check_Button *btnCutNbrs; extern Fl_Value_Input2 *nbrContestStart; extern Fl_Value_Input2 *nbrContestDigits; extern Fl_Check_Button *btnUseLeadingZeros; extern Fl_Button *btnResetSerNbr; extern Fl_Input2 *inp_my_FD_call; extern Fl_Input2 *inp_my_FD_section; extern Fl_Input2 *inp_my_FD_class; extern Fl_Input2 *inp_my_SCR_class; extern Fl_Input2 *inp_my_JOTA_troop; extern Fl_Input2 *inp_my_JOTA_scout; extern Fl_Group *sld; extern Fl_Check_Button *btnCWID; extern Fl_Value_Slider2 *sldrCWIDwpm; extern Fl_Button *bCWIDModes; extern Fl_Check_Button *chkRSidNotifyOnly; extern Fl_Button *bRSIDRxModes; extern Fl_Check_Button *chkRSidMark; extern Fl_ListBox *listbox_rsid_errors; extern Fl_Check_Button *chkRSidShowAlert; extern Fl_Check_Button *chkRSidAutoDisable; extern Fl_Check_Button *chkRetainFreqLock; extern Fl_Check_Button *chkDisableFreqChange; extern Fl_Check_Button *chk_RSID_EOT; extern Fl_Counter *val_RSIDsquelch; extern Fl_Counter *val_pretone; extern Fl_Button *bRSIDTxModes; extern Fl_Check_Button *btn_post_rsid; extern Fl_Counter *val_rsid_min_bw; extern Fl_Check_Button *chkRSidWideSearch; extern Fl_Button *btn_rsid_default_bw; extern Fl_Check_Button *btnsendid; extern Fl_Check_Button *btnsendvideotext; extern Fl_Input2 *valVideotext; extern Fl_Check_Button *chkID_SMALL; extern Fl_Value_Slider2 *sldrVideowidth; extern Fl_Check_Button *btn_vidlimit; extern Fl_Check_Button *btn_vidmodelimit; extern Fl_Button *bVideoIDModes; #include "maclogger.h" extern Fl_Check_Button *btnConnectToMaclogger; extern Fl_Check_Button *btn_capture_maclogger_radio; extern Fl_Check_Button *btn_capture_maclogger_log; extern Fl_Check_Button *btn_capture_maclogger_lookup; extern Fl_Check_Button *btn_capture_maclogger_spot_tune; extern Fl_Check_Button *btn_capture_maclogger_spot_report; extern Fl_Check_Button *btn_enable_maclogger_log; #include extern Fl_Text_Display *txt_UDP_data; extern Fl_Output *txt_maclogger_log_filename; extern Fl_Check_Button *btn_maclogger_spot_rx; extern Fl_Text_Display *txt_N3FJP_data; extern Fl_Input2 *txt_N3FJP_ip_address; extern Fl_Input2 *txt_N3FJP_ip_port_no; extern Fl_Button *btn_default_N3FJP_ip; extern Fl_Check_Button *btn_enable_N3FJP_log; extern Fl_Check_Button *btn_connect_to_n3fjp; extern Fl_Box *box_n3fjp_connected; extern Fl_Check_Button *btn_N3FJP_sweet_spot; extern Fl_Check_Button *btn_N3FJP_modem_carrier; extern Fl_Check_Button *btn_enable_N3FJP_RIGTX; extern Fl_Input2 *inpEQSL_www_url; extern Fl_Input2 *inpEQSL_id; extern Fl_Input2 *inpEQSL_pwd; extern Fl_Button *btnEQSL_pwd_show; extern Fl_Input2 *inpEQSL_nick; extern void cb_btn_verify_eqsl(Fl_Button*, void*); extern Fl_Button *btn_verify_eqsl; extern Fl_Check_Button *btn_send_when_logged; extern Fl_Check_Button *btn_send_datetime_off; extern Fl_Check_Button *btn_show_eqsl_delivery; extern Fl_Input2 *txt_eqsl_default_message; extern Fl_Box *eqsl_txt1; extern Fl_Box *eqsl_txt2; extern Fl_Box *eqsl_txt3; extern Fl_Input2 *txt_lotw_pathname; extern Fl_Input2 *inpLOTW_pwd; extern Fl_Check_Button *btn_submit_lotw_password; extern Fl_Input2 *inpLOTW_location; extern Fl_Button *btn_select_lotw; extern Fl_Check_Button *btn_lotw_quiet_mode; extern Fl_Check_Button *btn_submit_lotw; extern Fl_Check_Button *btn_show_lotw_delivery; extern Fl_Button *btn_export_lotw; extern Fl_Button *btn_review_lotw; extern Fl_Button *btn_send_lotw; extern Fl_Button *btnLOTW_pwd_show; extern void cb_btn_verify_lotw(Fl_Button*, void*); extern Fl_Button *btn_verify_lotw; extern void cb_btn_view_unmatched(Fl_Button*, void*); extern Fl_Button *btn_view_unmatched; extern Fl_Counter *cnt_tracefile_timeout; extern Fl_Check_Button *btnEnCloudlog; extern Fl_Input2 *txt_cloudlog_api_url; extern Fl_Input2 *txt_cloudlog_api_key; #include extern Fl_Spinner *sp_cloudlog_station_id; extern Fl_Button *btnTestApiKey; extern Fl_Check_Button *btnNagMe; extern Fl_Check_Button *btnClearOnSave; extern Fl_Check_Button *btnCallUpperCase; extern Fl_Check_Button *btnAutoFillQSO; extern Fl_Check_Button *btnDateTimeSort; extern Fl_Check_Button *btndate_time_force; extern Fl_Check_Button *btnRSTindefault; extern Fl_Check_Button *btnRSTdefault; extern Fl_Input2 *inpMyPower; extern Fl_Check_Button *btnDisplayLogbookRead; extern Fl_Check_Button *btn_log_power_meter; extern Fl_Check_Button *btnCWuseSOMdecoding; extern Fl_Check_Button *btnCWrcvTrack; extern Fl_Value_Slider2 *sldrCWbandwidth; extern Fl_Check_Button *btnCWmfilt; #include extern Fl_Value_Output *valCWrcvWPM; extern Fl_Progress *prgsCWrcvWPM; extern Fl_Counter2 *cntLower; extern Fl_Counter2 *cntUpper; extern Fl_Counter2 *cntCWrange; #include extern Fl_Choice *mnu_cwrx_attack; extern Fl_Choice *mnu_cwrx_decay; extern Fl_Button *btn_cw_tracking_defaults; extern Fl_Value_Slider2 *sldrCWxmtWPM; extern Fl_Counter2 *cntCWdefWPM; extern Fl_Counter *cntCWlowerlimit; extern Fl_Counter *cntCWupperlimit; extern Fl_Value_Slider2 *sldrCWfarnsworth; extern Fl_Check_Button *btnCWusefarnsworth; extern Fl_Value_Slider2 *sldrCWwordsworth; extern Fl_Check_Button *btnCWusewordsworth; extern Fl_Counter2 *cntCWdash2dot; extern Fl_Counter2 *cntCWrisetime; extern Fl_ListBox *i_listboxQSKshape; extern Fl_Check_Button *btnQSK; extern Fl_Counter2 *cntQSKfrequency; extern Fl_Counter2 *cntPreTiming; extern Fl_Counter2 *cntPostTiming; extern Fl_Counter2 *cntQSKamp; extern Fl_Counter2 *cntQSKrisetime; extern char szTestChar[]; extern Fl_ListBox *i_listbox_test_char; extern Fl_Check_Button *btnQSKadjust; extern Fl_ListBox *listbox_prosign[9]; extern Fl_Check_Button *btnCW_use_paren; extern Fl_Check_Button *btnCW_prosign_display; #include "cw.h" extern Fl_Check_Button *btn_A_aelig; extern Fl_Check_Button *btn_A_umlaut; extern Fl_Check_Button *btn_A_ring; extern Fl_Check_Button *btn_O_acute; extern Fl_Check_Button *btn_O_slash; extern Fl_Check_Button *btn_O_umlaut; extern Fl_Check_Button *btn_C_cedilla; extern Fl_Check_Button *btn_E_grave; extern Fl_Check_Button *btn_E_acute; extern Fl_Check_Button *btn_N_tilde; extern Fl_Check_Button *btn_U_umlaut; extern Fl_Check_Button *btn_U_circ; extern Fl_Check_Button *btn_CW_backslash; extern Fl_Check_Button *btn_CW_apostrophe; extern Fl_Check_Button *btn_CW_quote; extern Fl_Check_Button *btn_CW_dollar_sign; extern Fl_Check_Button *btn_CW_open_paren; extern Fl_Check_Button *btn_CW_close_paren; extern Fl_Check_Button *btn_CW_colon; extern Fl_Check_Button *btn_CW_semi_colon; extern Fl_Check_Button *btn_CW_underscore; extern Fl_Check_Button *btn_CW_at_symbol; extern Fl_Check_Button *btn_CW_exclamation; extern Fl_Check_Button *btn_CW_noise0; extern Fl_Check_Button *btn_CW_noise1; extern Fl_Check_Button *btn_CW_noise2; extern Fl_Check_Button *btn_CW_noise3; #include "combo.h" #include "winkeyer.h" extern Fl_ComboBox *select_WK_CommPort; extern Fl_Light_Button *btn_WKCW_connect; extern Fl_Box *box_WK_wait; extern Fl_Box *box_WK_break_in; extern Fl_Box *box_WK_busy; extern Fl_Box *box_WK_xoff; extern Fl_Box *box_WK_keydown; extern Fl_ComboBox *choice_WK_keyer_mode; extern Fl_ComboBox *choice_WK_hang; extern Fl_ComboBox *choice_WK_sidetone; extern Fl_ComboBox *choice_WK_output_pins; extern Fl_Check_Button *btn_WK_use_pot; extern Fl_Output *txt_WK_wpm; extern Fl_Check_Button *btn_WK_swap; extern Fl_Check_Button *btn_WK_auto_space; extern Fl_Check_Button *btn_WK_ct_space; extern Fl_Check_Button *btn_WK_paddledog; extern Fl_Check_Button *btn_WK_cut_zeronine; extern Fl_Check_Button *btn_WK_paddle_echo; extern Fl_Check_Button *btn_WK_serial_echo; extern Fl_Check_Button *btn_WK_sidetone_on; extern Fl_Check_Button *btn_WK_tone_on; extern Fl_Check_Button *btn_WK_ptt_on; extern Fl_Counter *cntr_WK_min_wpm; extern Fl_Counter *cntr_WK_rng_wpm; extern Fl_Counter *cntr_WK_farnsworth; extern Fl_Counter *cntr_WK_cmd_wpm; extern Fl_Counter *cntr_WK_ratio; extern Fl_Counter *cntr_WK_comp; extern Fl_Counter *cntr_WK_first_ext; extern Fl_Counter *cntr_WK_sample; extern Fl_Counter *cntr_WK_weight; extern Fl_Counter *cntr_WK_leadin; extern Fl_Counter *cntr_WK_tail; extern Fl_Check_Button *btnK3NG; #include "nanoIO.h" extern Fl_ComboBox *select_nanoCW_CommPort; extern Fl_Light_Button *btn_nanoCW_connect; extern Fl_Counter *cntr_nanoCW_paddle_WPM; #include "FTextRXTX.h" extern FTextView *txt_nano_CW_io; extern Fl_Counter *cntr_nanoCW_WPM; extern Fl_Counter2 *cnt_nanoCWdash2dot; extern Fl_ListBox *listbox_nanoIO_serbaud; extern Fl_ListBox *listbox_nano_keyer; extern Fl_ListBox *listbox_incr; extern Fl_Button *btn_cwfsk_save; extern Fl_Button *btn_cwfsk_query; extern Fl_Check_Button *btn_nanoIO_pot; extern Fl_Counter *cntr_nanoIO_min_wpm; extern Fl_Counter *cntr_nanoIO_rng_wpm; extern Fl_Check_Button *btn_disable_CW_PTT; extern Fl_Counter *cntrWPMtest; extern Fl_Button *btn_cal_variable; #include extern Fl_Value_Input *corr_var_wpm; extern Fl_Value_Input *usec_correc; extern Fl_Button *btn_correction; extern Fl_Check_Button *chk_nanoIO_CW_io; extern Fl_Check_Button *btn_CW_KEYLINE_flrig; extern Fl_Check_Button *btn_FLRIG_CW_disable_ptt; extern Fl_Check_Button *btn_CW_KEYLINE_catport; extern Fl_Check_Button *btn_CW_KEYLINE_shared_PTT; extern Fl_ListBox *listbox_CW_KEYLINE; extern Fl_Counter2 *cntCWkeycomp; extern Fl_ListBox *listbox_PTT_KEYLINE; extern Fl_ComboBox *select_CW_KEYLINE_CommPort; extern Fl_Light_Button *btn_CW_KEYLINE_connect; extern Fl_Light_Button *btn_cw_dtr_calibrate; extern Fl_Output *cwio_test_result; extern Fl_Check_Button *btn_use_ICOMkeying; extern Fl_Input *val_ICOMcivaddr; extern Fl_Check_Button *btn_use_ELCTkeying; extern Fl_Check_Button *btn_use_KNWDkeying; extern Fl_Check_Button *btn_use_YAESUkeying; extern Fl_Check_Button *btn_CAT_CW_disable_ptt; extern void CAT_keying_calibrate(); extern Fl_Button *btn_CAT_keying_calibrate; extern Fl_Value_Input *out_CATkeying_compensation; extern Fl_Button *btn_CAT_keying_clear; extern void CAT_keying_test(); extern Fl_Button *btn_CAT_keying_test; extern Fl_Value_Input *out_CATkeying_test_result; extern Fl_Input2 *txtSecondary; extern Fl_Check_Button *valDominoEX_FILTER; extern Fl_Counter2 *valDominoEX_BW; extern Fl_Check_Button *chkDominoEX_FEC; extern Fl_Value_Slider2 *valDomCWI; extern Fl_Counter2 *valDominoEX_PATHS; #include "fontdef.h" extern Fl_ListBox *listboxHellFont; extern Fl_ListBox *listboxHellPulse; extern Fl_Check_Button *btnFeldHellIdle; #include extern Fl_Value_Slider *valHellXmtWidth; extern Fl_Check_Button *btnBlackboard; extern Fl_Check_Button *btnHellMarquee; extern Fl_Value_Slider *valHellRcvWidth; extern Fl_Value_Slider *valHellRcvHeight; extern Fl_Value_Slider2 *sldrHellBW; extern Fl_Value_Slider *val_hellagc; #include "fmt_dialog.h" extern Fl_ListBox *listbox_fmt_sr; extern Fl_Counter *cnt_fmt_rx_ppm; extern Fl_Button *btnFMT_plot_background; extern Fl_Button *btnFMT_unk_color; extern Fl_Button *btnFMT_plot_ref_color; extern Fl_Button *btnFMT_plot_axis; extern Fl_Button *btnFMT_legend_color; extern Fl_Check_Button *btn_fmt_plot_over_axis; extern Fl_Check_Button *btn_fmt_thick_lines; extern Fl_Counter *cnt_fmt_freq_corr; extern Fl_Button *bnt_FMT_dec_corr; extern Fl_Button *btn_FMT_incr_corr; extern Fl_Counter *cnt_fmt_freq_err; extern Fl_Counter *cnt_FMT_movavg_len; extern Fl_ListBox *listbox_fmt_dft_rate; extern Fl_Counter *cnt_FMT_bpf; extern Fl_Check_Button *btn_fmt_unk_bpf_on; extern Fl_Check_Button *btn_fmt_ref_bpf_on; extern Fl_Check_Button *btn_fmt_autorecord; extern Fl_Counter *cnt_fmt_auto_record_time; extern Fl_Check_Button *btn_fmt_record_wav; extern Fl_Check_Button *btn_fmt_sync_wav; extern Fl_Output *txt_fmt_wav_filename; extern Fl_Check_Button *btn_fmt_center_on_unknown; extern Fl_Check_Button *btn_fmt_center_on_reference; extern Fl_Check_Button *btn_fmt_center_on_median; extern Fl_Check_Button *btn_fmt_use_tabs; extern Fl_Value_Slider *valhits; extern Fl_Choice *sel_fsq_lpf; extern Fl_Value_Slider *sldrMovAvg; extern Fl_Choice *sel_fsq_heard_aging; extern Fl_Round_Button *btn_fsqbaud[5]; extern Fl_Choice *sel_fsq_frequency; extern Fl_Choice *sel_fsq_sounder; extern Fl_Counter *cntr_FSQ_time_out; extern Fl_Check_Button *btn_fsq_lowercase; extern Fl_Input2 *inpMyFSQQth; extern Fl_Check_Button *btn_fsq_msg_dt_stamp; extern Fl_Check_Button *btn_fsq_msg_append; extern Fl_Counter *cntr_FSQ_notify_time_out; extern Fl_Output *txtAuditLog; extern Fl_Light_Button *btn_enable_auditlog; extern Fl_Button *btn_select_auditlog; extern Fl_Output *txtHeardLog; extern Fl_Light_Button *btn_enable_fsq_heard_log; extern Fl_Button *btn_select_fsq_heard_log; extern Fl_Button *btn_fsq_xmt_color; extern Fl_Button *btn_fsq_directed_color; extern Fl_Button *btn_fsq_undirected_color; extern Fl_Button *btn_fsq_color_defaults; extern Fl_Round_Button *btn_ifkpbaud[3]; extern Fl_Check_Button *btn_ifkp_lowercase; extern Fl_Check_Button *btn_ifkp_lowercase_call; #include "trx.h" extern Fl_Check_Button *btn_ifkp_freqlock; extern Fl_Output *txt_ifkp_audit_log; extern Fl_Light_Button *btn_enable_ifkp_audit_log; extern Fl_Button *btn_ifkp_select_auditlog; extern Fl_Output *txt_ifkp_heard_log; extern Fl_Light_Button *btn_enable_ifkp_heard_log; extern Fl_Button *btn_select_ifkp_heard_log; extern Fl_Group *ifkp_image_box; extern Fl_Check_Button *btnMT63_8bit; extern Fl_Check_Button *btnMT63_rx_integration; extern Fl_Check_Button *btnMT63_usetones; extern Fl_Check_Button *btnMT63_upper_lower; extern Fl_Spinner2 *MT63_tone_duration; extern Fl_Check_Button *btnMT63_at500; extern Fl_Check_Button *btnMT63_centered; extern Fl_Check_Button *btnMT63_manual; extern Fl_ListBox *i_listbox_contestia_bandwidth; extern Fl_ListBox *i_listbox_contestia_tones; extern Fl_Counter2 *cntContestia_smargin; extern Fl_Counter2 *cntContestia_sinteg; extern Fl_Check_Button *btnContestia_8bit; extern Fl_Check_Button *btnContestia_start_stop_tones; extern Fl_ListBox *i_listbox_olivia_bandwidth; extern Fl_ListBox *i_listbox_olivia_tones; extern Fl_Counter2 *cntOlivia_smargin; extern Fl_Counter2 *cntOlivia_sinteg; extern Fl_Check_Button *btn_olivia_reset_fec; extern Fl_Check_Button *btnOlivia_8bit; extern Fl_Check_Button *btnOlivia_start_stop_tones; extern Fl_Counter2 *cntSearchRange; extern Fl_Counter2 *cntACQsn; extern Fl_ListBox *listbox_psk_status_timeout; extern Fl_Check_Button *btnEnablePSKbrowsing; extern Fl_Check_Button *btnPSKpilot; extern Fl_Counter2 *cnt_pilot_power; extern Fl_Check_Button *btnPSK8Preamble; extern Fl_ListBox *i_listbox_rtty_afc_speed; extern Fl_Check_Button *chkUOSrx; extern Fl_Value_Input *rtty_rx_shape; extern Fl_Check_Button *btnRxTones[3]; extern Fl_Check_Button *btnPreferXhairScope; extern Fl_Check_Button *chk_true_scope; extern Fl_Check_Button *chk_useMARKfreq; extern Fl_Button *btnRTTY_mark_color; extern Fl_Check_Button *chk_audibleBELL; extern Fl_Check_Button *chk_visibleBELL; #include extern Fl_File_Input *inp_wav_fname_bell_ring; extern Fl_Button *btn_select_bell_ring_wav; extern Fl_Choice *mnu_bell_ring_menu; extern Fl_Button *btn_test_bell_ring_wav; extern Fl_ListBox *selShift; extern Fl_Counter2 *selCustomShift; extern Fl_ListBox *selBaud; extern Fl_ListBox *selBits; extern Fl_ListBox *selParity; extern Fl_ListBox *selStopBits; extern Fl_Check_Button *btnAUTOCRLF; extern Fl_Counter2 *cntrAUTOCRLF; extern Fl_Check_Button *btnCRCRLF; extern Fl_Check_Button *chkUOStx; extern Fl_Check_Button *chk_shaped_rtty; extern Fl_Check_Button *chkPseudoFSK; extern Fl_Counter *cnt_TTY_LTRS; extern Fl_Check_Button *btnFSKenabled; extern Fl_Check_Button *btnFSKshared; extern Fl_ComboBox *select_FSK_CommPort; extern Fl_Check_Button *btnFSKreverse; extern Fl_Check_Button *btnFSKuseDTR; extern Fl_Button *btnFSKreset; extern Fl_Counter *cntr_xcvr_FSK_MARK; extern Fl_ListBox *sel_xcvr_FSK_shift; extern Fl_Check_Button *btnFSK_STOPBITS; extern Fl_Check_Button *btn_FSK_KEYLINE_flrig; extern Fl_ComboBox *select_nanoIO_CommPort; extern Fl_Light_Button *btn_nanoIO_connect; extern Fl_ListBox *listbox_nanoIO_serbaud2; extern FTextView *txt_nano_io; extern Fl_Button *btn_nanofsk_save; extern Fl_Button *btn_nanofsk_query; extern Fl_Check_Button *chk_nanoIO_polarity; extern Fl_ListBox *sel_nanoIO_baud; extern Fl_Group *grp_nanoio_debug; #include extern Fl_Browser *brws_nanoio_sent; extern Fl_Browser *brws_nanoio_rcvd; extern Fl_Button *btn_nanoio_clear_sent; extern Fl_Button *btn_nanoio_clear_both; extern Fl_Button *btn_nanoio_clear_rcvd; extern Fl_Light_Button *btn_nanoio_debug; extern Fl_Check_Button *chk_nanoIO_FSK_io; #include "Nav.h" extern Fl_ComboBox *select_USN_FSK_port; extern Fl_Light_Button *btn_Nav_connect; extern Fl_ComboBox *select_Nav_config_port; extern Fl_ListBox *sel_Nav_ch1; extern Fl_ListBox *sel_Nav_ch2; extern Fl_ListBox *sel_Nav_rf_att; extern Fl_ListBox *sel_Nav_wk_ptt; extern Fl_ListBox *sel_Nav_LED; extern Fl_ListBox *sel_Nav_CAT_LED; extern Fl_ListBox *sel_Nav_FSK_baud; extern Fl_ListBox *sel_Nav_FSK_stopbits; extern Fl_ListBox *sel_Nav_FSK_polarity; extern Fl_ListBox *sel_Nav_FSK_sidetone; extern Fl_ListBox *sel_Nav_FSK_ptt; extern Fl_Light_Button *btn_Nav_config; extern Fl_Check_Button *btnSynopAdifDecoding; extern Fl_Check_Button *btnSynopKmlDecoding; extern Fl_Check_Button *btnSynopInterleaved; extern Fl_ComboBox *select_WKFSK_CommPort; extern Fl_Light_Button *btn_WKFSK_connect; extern Fl_ListBox *sel_WKFSK_baud; extern Fl_ListBox *sel_WKFSK_stopbits; extern Fl_ListBox *sel_WKFSK_ptt; extern Fl_ListBox *sel_WKFSK_polarity; extern Fl_ListBox *sel_WKFSK_sidetone; extern Fl_ListBox *sel_WKFSK_auto_crlf; extern Fl_ListBox *sel_WKFSK_diddle; extern Fl_ListBox *sel_WKFSK_diddle_char; extern Fl_ListBox *sel_WKFSK_usos; extern Fl_ListBox *sel_WKFSK_monitor; extern Fl_Input2 *txtTHORSecondary; extern Fl_Check_Button *valTHOR_FILTER; extern Fl_Counter2 *valTHOR_BW; extern Fl_Value_Slider2 *valThorCWI; extern Fl_Check_Button *valTHOR_PREAMBLE; extern Fl_Check_Button *valTHOR_SOFTSYMBOLS; extern Fl_Check_Button *valTHOR_SOFTBITS; extern Fl_Counter2 *valTHOR_PATHS; extern Fl_Group *thor_image_box; extern Fl_Check_Button *btnNvtxAdifLog; extern Fl_Check_Button *btnNvtxKmlLog; extern Fl_Counter *cntrWEFAX_Shift; extern Fl_Counter *cntrWEFAX_Center; extern Fl_Counter *cntrWEFAX_MaxRows; extern Fl_Input *btnWefaxSaveDir; extern Fl_Button *btnSelectFaxDestDir; extern Fl_Check_Button *btnWefaxAdifLog; extern Fl_Choice *wefax_choice_rx_filter; extern Fl_Counter *auto_after_nrows; extern Fl_Counter *align_stop_after; extern Fl_Counter *align_every_nrows; extern Fl_Counter *wefax_correlation; extern Fl_Counter *cntr_correlation_rows; extern Fl_Input2 *txt_auto_flrig_pathname; extern Fl_Button *btn_select_flrig; extern Fl_Input2 *txt_auto_flamp_pathname; extern Fl_Button *btn_select_auto_flamp; extern Fl_Input2 *txt_auto_flnet_pathname; extern Fl_Button *btn_select_auto_flnet; extern Fl_Input2 *txt_auto_fllog_pathname; extern Fl_Button *btn_select_fllog; extern Fl_Input2 *txt_auto_prog1_pathname; extern Fl_Button *btn_select_prog1; extern Fl_Input2 *txt_auto_prog2_pathname; extern Fl_Button *btn_select_prog2; extern Fl_Input2 *txt_auto_prog3_pathname; extern Fl_Button *btn_select_prog3; extern Fl_Check_Button *btn_flrig_auto_enable; extern Fl_Check_Button *btn_flamp_auto_enable; extern Fl_Check_Button *btn_flnet_auto_enable; extern Fl_Check_Button *btn_fllog_auto_enable; extern Fl_Check_Button *btn_prog1_auto_enable; extern Fl_Check_Button *btn_prog2_auto_enable; extern Fl_Check_Button *btn_prog3_auto_enable; extern Fl_Button *btn_test_flrig; extern Fl_Button *btn_test_flamp; extern Fl_Button *btn_test_flnet; extern Fl_Button *btn_test_fllog; extern Fl_Button *btn_test_prog1; extern Fl_Button *btn_test_prog2; extern Fl_Button *btn_test_prog3; extern Fl_Check_Button *chkSlowCpu; extern Fl_Check_Button *chkDTMFdecode; extern Fl_Input *btnKmlSaveDir; extern Fl_Input *inputKmlRootFile; extern Fl_Counter *cntKmlMergeDistance; extern Fl_Counter *cntKmlRetentionTime; extern Fl_Spinner2 *cntKmlRefreshInterval; extern Fl_ListBox *listbox_kml_balloon_style; extern Fl_Input *btnKmlCommand; extern Fl_Button *btlTestKmlCommand; extern Fl_Button *btnSelectKmlDestDir; extern Fl_Button *btlPurge; extern Fl_Check_Button *btnKmlPurgeOnStartup; extern Fl_Check_Button *btn_kml_enabled; extern Fl_Check_Button *chkAutoExtract; extern Fl_Check_Button *chk_open_wrap_folder; extern Fl_Check_Button *chk_open_flmsg; extern Fl_Check_Button *chk_open_flmsg_print; extern Fl_Input2 *txt_flmsg_pathname; extern Fl_Button *btn_select_flmsg; extern Fl_Value_Slider *sldr_extract_timeout; extern Fl_Check_Button *chk_transfer__to_open_flmsg; extern Fl_Check_Button *btnPSKRepAuto; extern Fl_Check_Button *btnPSKRepLog; extern Fl_Check_Button *btnPSKRepQRG; extern Fl_Check_Button *btn_report_when_visible; extern Fl_Check_Button *btn_pskrep_autostart; extern Fl_Box *box_connected_to_pskrep; extern Fl_Input2 *inpPSKRepHost; extern Fl_Input2 *inpPSKRepPort; extern Fl_Button *btnPSKRepInit; extern Fl_Box *boxPSKRepMsg; extern Fl_Counter *cntBusyChannelSeconds; extern Fl_Check_Button *btnEnableBusyChannel; extern Fl_Counter *cntPSMTXBufferFlushTimer; extern Fl_Counter *cntPSMBandwidthMargins; extern Fl_Counter *cntPSMValidSamplePeriod; extern Fl_Check_Button *btnEnable_csma; extern Fl_Counter *cntPersistance; extern Fl_Counter *cntSlotTime; extern Fl_Counter *cntTransmitDelay; extern Fl_Output *OutputSlotTimeMS; extern Fl_Output *OutputTransmitDelayMS; extern Fl_Output *OutputPersistancePercent; extern Fl_Check_Button *btnEnable_histogram; extern Fl_Counter *cntPSMThreshold; extern Fl_Counter *cntKPSQLAttenuation; extern Fl_Check_Button *btn_show_psm_button; extern Fl_Button *btnBuyChannelDefaults; extern Fl_Group *grpTalker; extern void open_talker(); extern void close_talker(); extern Fl_Light_Button *btnConnectTalker; extern Fl_Check_Button *btn_auto_talk; extern Fl_Check_Button *chkRxStream; extern Fl_Check_Button *btnTXLEVEL_by_mode; extern Fl_Check_Button *btnSQLCH_by_mode; extern Fl_Check_Button *btnAFC_by_mode; extern Fl_Check_Button *btnREVERSE_by_mode; extern Fl_Value_Input2 *valCWsweetspot; extern Fl_Value_Input2 *valRTTYsweetspot; extern Fl_Value_Input2 *valPSKsweetspot; extern Fl_Check_Button *btnStartAtSweetSpot; extern Fl_Check_Button *btnCWIsLSB; extern Fl_Check_Button *btnDisable_p2p_io_widgets; extern Fl_Check_Button *btnEnable_arq; extern Fl_Check_Button *btnEnable_kiss; extern Fl_Input2 *txtKiss_ip_address; extern Fl_Input2 *txtKiss_ip_io_port_no; extern Fl_Input2 *txtKiss_ip_out_port_no; extern Fl_Check_Button *btnEnable_dual_port; extern Fl_Button *btn_restart_kiss; extern Fl_Button *btn_connect_kiss_io; extern Fl_Button *btnDefault_kiss_ip; extern Fl_Check_Button *btnKissTCPIO; extern Fl_Check_Button *btnKissUDPIO; extern Fl_Check_Button *btnKissTCPListen; extern Fl_Check_Button *btnEnable_7bit_modem_inhibit; extern Fl_Check_Button *btnEnable_auto_connect; extern Fl_Check_Button *btnEnable_ax25_decode; extern Fl_Input2 *txtArq_ip_address; extern Fl_Input2 *txtArq_ip_port_no; extern Fl_Button *btnDefault_arq_ip; extern Fl_Button *btn_restart_arq; extern Fl_Button *btnDefault_xmlrpc_ip; extern Fl_Input2 *txtXmlrpc_ip_address; extern Fl_Input2 *txtXmlrpc_ip_port_no; extern Fl_Button *btn_restart_xml; extern Fl_Button *btnDefault_flrig_ip; extern Fl_Input2 *txt_flrig_ip_address; extern Fl_Input2 *txt_flrig_ip_port; #include "rigsupport.h" extern Fl_Button *btn_reconnect_flrig_server; extern Fl_Input *txt_fllog_ip_address; extern Fl_Input *txt_fllog_ip_port; extern Fl_Button *btn_reconnect_log_server; extern Fl_Button *btnDefault_fllog_ip; extern Fl_Group *grpOperator; extern Fl_Input2 *inpMyCallsign; extern Fl_Input2 *inpOperCallsign; extern Fl_Input2 *inpMyName; extern Fl_Input2 *inpMyAntenna; extern Fl_Input2 *inpMyQth; extern Fl_Input2 *inpMyLocator; #include "counties.h" extern Fl_ListBox *listbox_states; extern Fl_Input2 *inp_QP_state_short; extern Fl_ListBox *listbox_counties; extern Fl_Input2 *inp_QP_short_county; extern Fl_Group *grpRigFlrig; extern Fl_Check_Button *chk_flrig_keys_modem; extern Fl_Button *btnDefault_flrig_ip_mirror; extern Fl_Input2 *txt_flrig_ip_address_mirror; extern Fl_Input2 *txt_flrig_ip_port_mirror; extern Fl_Button *btn_reconnect_flrig_server_mirror; extern Fl_Check_Button *btn_fldigi_client_to_flrig; extern Fl_Check_Button *btn_flrig_auto_shutdown; extern Fl_Counter2 *val_flrig_poll; extern Fl_Group *grpRigCat; extern Fl_Check_Button *chkUSERIGCAT; extern Fl_Group *grpRigCAT; extern Fl_Output *txtXmlRigFilename; extern Fl_Button *btnSelectRigXmlFile; extern Fl_ComboBox *inpXmlRigDevice; extern Fl_Value_Input2 *cntRigCatRetries; extern Fl_Value_Input2 *cntRigCatTimeout; extern Fl_Value_Input2 *cntRigCatWait; extern Fl_ListBox *listbox_xml_rig_baudrate; extern Fl_Counter2 *valRigCatStopbits; extern Fl_Button *btnInitRIGCAT; extern Fl_Check_Button *btnRigCatEcho; extern Fl_Round_Button *btnRigCatCMDptt; extern Fl_Round_Button *btnRigCatRTSptt; extern Fl_Round_Button *btnRigCatDTRptt; extern Fl_Check_Button *btnRigCatRTSplus; extern Fl_Check_Button *btnRigCatDTRplus; extern Fl_Check_Button *chkRigCatRTSCTSflow; extern Fl_Check_Button *chk_restore_tio; extern Fl_Check_Button *chkRigCatVSP; extern Fl_Value_Input2 *cntRigCatInitDelay; extern Fl_Group *grpRigGPIO; extern Fl_Check_Button *btn_gpio_ptt2; extern Fl_Button *btnInitHWPTT2; extern Fl_Check_Button *btn_enable_gpio[17]; extern Fl_Check_Button *btn_gpio_on[17]; extern Fl_Counter *cnt_gpio_pulse_width; extern Fl_Group *grpRigHamlib; extern Fl_Check_Button *chkUSEHAMLIB; extern Fl_Group *grpHamlib; extern Fl_ListBox *cboHamlibRig; extern Fl_ComboBox *inpRIGdev; extern Fl_Value_Input2 *cntHamlibRetries; extern Fl_Value_Input2 *cntHamlibTimeout; extern Fl_Value_Input2 *cntHamlibWriteDelay; extern Fl_Value_Input2 *cntHamlibWait; extern Fl_ListBox *listbox_baudrate; extern Fl_Counter2 *valHamRigStopbits; extern Fl_Counter2 *valHamRigPollrate; extern Fl_Check_Button *btnHamlibCMDptt; extern Fl_Check_Button *btnHamlibPTT_ON_DATA; extern Fl_Check_Button *btnHamlibDTRplus; extern Fl_Check_Button *chkHamlibRTSplus; extern Fl_Check_Button *chkHamlibRTSCTSflow; extern Fl_Check_Button *chkHamlibXONXOFFflow; extern Fl_Check_Button *chk_hamlib_cw_is_lsb; extern Fl_Check_Button *chk_hamlib_rtty_is_usb; extern Fl_Counter2 *val_hamlib_mode_delay; extern Fl_ListBox *listbox_sideband; extern Fl_Input2 *inpHamlibConfig; extern Fl_Button *btnInitHAMLIB; extern Fl_Button *btn_hamlib_get_defaults; extern Fl_Group *grpRigHardware; extern Fl_Check_Button *btnPTTrightchannel; extern Fl_Round_Button *btnTTYptt; extern Fl_ComboBox *inpTTYdev; extern Fl_Round_Button *btnSCU_17; extern Fl_Round_Button *btnUsePPortPTT; extern Fl_Round_Button *btnUseUHrouterPTT; extern Fl_Round_Button *btnRTSptt; extern Fl_Round_Button *btnRTSplusV; extern Fl_Round_Button *btnDTRptt; extern Fl_Round_Button *btnDTRplusV; extern Fl_Check_Button *btn_gpio_ptt; extern Fl_Button *btnInitHWPTT; extern Fl_Group *grpPTTdelays; extern Fl_Counter *cntPTT_on_delay; extern Fl_Counter *cntPTT_off_delay; extern Fl_Group *grp_cmedia_ptt; extern Fl_Round_Button *btn_use_cmedia_PTT; extern Fl_ComboBox *inp_cmedia_dev; extern Fl_ComboBox *inp_cmedia_GPIO_line; extern Fl_Button *btn_init_cmedia_PTT; #include "cmedia.h" extern Fl_Button *btn_test_cmedia; extern Fl_File_Input *inp_wav_fname_regex; #include extern Fl_Button *btn_select_regex_wav; extern Fl_Choice *mnu_regex_alert_menu; extern Fl_Check_Button *btn_enable_regex_match_wa; #include "audio_alert.h" extern Fl_Button *btn_test_regex_wav; extern Fl_File_Input *inp_wav_fname_mycall; extern Fl_Button *btn_select_mycall_wav; extern Fl_Choice *mnu_mycall_alert_menu; extern Fl_Check_Button *btn_enable_mycall_match_wav; extern Fl_Button *btn_test_mycall_wav; extern Fl_File_Input *inp_wav_fname_rsid; extern Fl_Button *btn_select_rsid_wav; extern Fl_Choice *mnu_rsid_alert_menu; extern Fl_Check_Button *btn_enable_rsid_match_wav; extern Fl_Button *btn_test_rsid_wav; extern Fl_File_Input *inp_wav_flmsg_rcvd; extern Fl_Button *btn_select_rx_extract_msg; extern Fl_Choice *mnu_rx_extract_alert_menu; extern Fl_Check_Button *btn_enable_flmsg_wav; extern Fl_Button *btn_test_flmsg_extract_wav; extern Fl_File_Input *inp_wav_flmsg_timed_out; extern Fl_Button *btn_select_rx_extract_timed_out; extern Fl_Choice *mnu_rx_timed_out_alert_menu; extern Fl_Button *btn_test_rx_extract_timed_out; extern Fl_Check_Button *btn_enable_flmsg_time_out_wav; extern Fl_Value_Slider2 *sldrAlertVolume; extern Fl_Group *grpSoundDevices; extern Fl_Group *AudioOSS; #include extern Fl_Input_Choice *menuOSSDev; extern Fl_Group *AudioPort; extern Fl_Choice *menuPortInDev; extern Fl_Choice *menuPortOutDev; extern Fl_Group *AudioPulse; extern Fl_Input2 *inpPulseServer; extern Fl_Group *AudioNull; extern Fl_Round_Button *btnAudioIO[4]; extern Fl_Group *AudioDuplex; extern Fl_Round_Button *btn_is_full_duplex; extern Fl_Group *AudioAlerts; extern Fl_Choice *menuAlertsDev; extern Fl_Round_Button *btn_enable_audio_alerts; extern Fl_Check_Button *chkAudioStereoOut; extern Fl_Check_Button *chkReverseAudio; extern Fl_Check_Button *btnPTTrightchannel2; extern Fl_Check_Button *btnQSK2; extern Fl_Check_Button *chkPseudoFSK2; extern Fl_Check_Button *chkReverseRxAudio; extern Fl_Group *grpAudioSampleRate; extern Fl_ListBox *menuInSampleRate; extern Fl_ListBox *menuOutSampleRate; #include extern Fl_ListBox *menuSampleConverter; extern Fl_Spinner2 *cntRxRateCorr; extern Fl_Spinner2 *cntTxRateCorr; extern Fl_Spinner2 *cntTxOffset; extern Fl_Button *bnt_dec_rit; extern Fl_Counter *cntRIT; extern Fl_Button *btn_incr_rit; extern Fl_Box *lowcolor2; extern Fl_Button *btnLowSignal2; extern Fl_Box *normalcolor2; extern Fl_Counter *cnt_normal_signal_level2; extern Fl_Button *btnNormalSignal2; extern Fl_Box *highcolor2; extern Fl_Counter *cnt_high_signal_level2; extern Fl_Button *btnHighSignal2; extern Fl_Box *overcolor2; extern Fl_Counter *cnt_over_signal_level2; extern Fl_Button *btnOverSignal2; extern vumeter *sig_vumeter2; extern Fl_Button *btn_default_signal_levels2; extern Fl_Check_Button *btn_use_wsjtx_vumeter_scale2; extern Fl_ListBox *listbox_wav_samplerate; extern Fl_Check_Button *btn_record_both; extern Fl_Spinner2 *cntChannels; extern Fl_Spinner2 *cntTimeout; extern Fl_ListBox *listboxViewerLabel; extern Fl_Button *btnViewerFont; extern Fl_Check_Button *btnFixedIntervals; extern Fl_Check_Button *btnMarquee; extern Fl_Check_Button *btnAscend; extern Fl_Check_Button *btnBrowserHistory; #include "Viewer.h" extern Fl_Button *bwsrHiLite_1_color; extern Fl_Button *bwsrHiLite_2_color; extern Fl_Button *bwsrHiLite_even_lines; extern Fl_Button *bwsrHiLite_odd_lines; extern Fl_Button *bwsrHiLite_select; extern Fl_Button *bwsrSliderColor; extern Fl_Button *bwsrSldrSelColor; extern Fl_Check_Button *btnShowTooltips; extern Fl_Check_Button *chkMenuIcons; extern Fl_ListBox *listboxScheme; extern Fl_Button *bVisibleModes; extern Fl_ListBox *listbox_language; extern Fl_Check_Button *btn_rx_lowercase; extern Fl_Check_Button *btn_tx_lowercase; extern Fl_Check_Button *btn_save_config_on_exit; extern Fl_Check_Button *btn2_save_macros_on_exit; extern Fl_Check_Button *btn2NagMe; extern Fl_Check_Button *btn2_confirm_exit; extern Fl_Check_Button *btn_check_for_updates; extern Fl_Check_Button *btn_tx_show_timer; extern Fl_Spinner *val_tx_timeout; extern Fl_Check_Button *btnMacroMouseWheel; extern Fl_Counter *cnt_macro_height; extern Fl_Round_Button *btn_scheme_0; extern Fl_Round_Button *btn_scheme_1; extern Fl_Round_Button *btn_scheme_2; extern Fl_Round_Button *btn_scheme_3; extern Fl_Round_Button *btn_scheme_4; extern Fl_Round_Button *btn_scheme_5; extern Fl_Round_Button *btn_scheme_6; extern Fl_Round_Button *btn_scheme_7; extern Fl_Round_Button *btn_scheme_8; extern Fl_Round_Button *btn_scheme_9; extern Fl_Round_Button *btn_scheme_10; extern Fl_Round_Button *btn_scheme_11; extern Fl_Round_Button *btn_scheme_12; extern Fl_Check_Button *btnUseLastMacro; extern Fl_Check_Button *btnDisplayMacroFilename; extern Fl_Check_Button *btn_save_macros_on_exit; extern Fl_Check_Button *btn_macro_post; extern Fl_Check_Button *btn_4bar_position; extern Fl_Check_Button *btnRXClicks; extern Fl_Check_Button *btnRXTooltips; extern Fl_Input2 *inpNonword; extern Fl_Check_Button *btnUSunits; extern Fl_Check_Button *btn_clear_fields; extern Fl_Choice *sel_lsd; extern Fl_Check_Button *btn_rxtx_swap; extern Fl_Check_Button *btnWF_UIrev; extern Fl_Check_Button *btnWF_UIx1; extern Fl_Check_Button *btnWF_UIwfcarrier; extern Fl_Check_Button *btnWF_UIwfshift; extern Fl_Check_Button *btnWF_UIwfreflevel; extern Fl_Check_Button *btnWF_UIwfdrop; extern Fl_Check_Button *btnWF_UIwfampspan; extern Fl_Check_Button *btnWF_UIwfstore; extern Fl_Check_Button *btnWF_UIwfmode; extern Fl_Check_Button *btnWF_UIqsy; extern Fl_Check_Button *btnWF_UIxmtlock; extern Fl_Button *btn_wf_enable_all; extern Fl_Button *btn_wf_disable_all; #include "colorbox.h" extern colorbox *WF_Palette; extern Fl_Button *btnColor[9]; extern Fl_Button *btnLoadPalette; extern Fl_Button *btnSavePalette; extern Fl_Check_Button *btnUseCursorLines; extern Fl_Button *btnCursorBWcolor; extern Fl_Check_Button *btnUseWideCursor; extern Fl_Check_Button *btnUseCursorCenterLine; extern Fl_Button *btnCursorCenterLineColor; extern Fl_Check_Button *btnUseWideCenter; extern Fl_Check_Button *btnUseBWTracks; extern Fl_Button *btnBwTracksColor; extern Fl_Check_Button *btnUseWideTracks; extern Fl_Button *btnNotchColor; extern Fl_Button *btnRsIDZoneColor; extern Fl_Button *btnMonitorColor; extern Fl_Check_Button *btnUseWideMonitor; extern Fl_Check_Button *chkShowAudioScale; extern Fl_Button *btnWaterfallFont; extern Fl_Check_Button *btnViewXmtSignal; extern Fl_Counter *valTxMonitorLevel; extern Fl_Counter2 *cntLowFreqCutoff; extern Fl_Check_Button *btnWFaveraging; extern Fl_ListBox *listboxFFTPrefilter; extern Fl_Counter2 *cntrWfwidth; extern Fl_Counter2 *wf_latency; extern Fl_Counter *cntr_drop_speed; extern Fl_Counter2 *cntrWfheight; extern Fl_Check_Button *btnWaterfallHistoryDefault; extern Fl_Check_Button *btnWaterfallQSY; extern Fl_Check_Button *btnWaterfallClickInsert; extern Fl_Input2 *inpWaterfallClickText; extern Fl_ListBox *listboxWaterfallWheelAction; extern Fl_Check_Button *btnWFspectrum_center; extern Fl_Check_Button *btnWFspectrum_dbvals; extern Fl_Counter *cntr_spectrum_freq_scale; extern Fl_Check_Button *btn_spectrum_modem_scale; extern Fl_Counter2 *cntServerCarrier; extern Fl_Counter2 *cntServerOffset; extern Fl_Counter2 *cntServerACQsn; extern Fl_Counter2 *cntServerAFCrange; extern Fl_Check_Button *btnPSKmailSweetSpot; extern Fl_Check_Button *btn_arq_s2n_report; extern Fl_Input *txt_wx_url; extern Fl_Button *btn_default_wx_url; extern Fl_Input *inpWXsta; #include "weather.h" extern Fl_Button *btn_metar_search; extern Fl_Check_Button *btn_wx_full; extern Fl_Check_Button *btn_wx_station_name; extern Fl_Check_Button *btn_wx_condx; extern Fl_Check_Button *btn_wx_fahrenheit; extern Fl_Check_Button *btn_wx_celsius; extern Fl_Check_Button *btn_wx_mph; extern Fl_Check_Button *btn_wx_kph; extern Fl_Check_Button *btn_wx_inches; extern Fl_Check_Button *btn_wx_mbars; extern Fl_Check_Button *btn_wx_raw; extern Fl_Button *btnSaveConfig; #include extern Fl_Return_Button *btnCloseConfig; extern Fl_Button *btnResetConfig; Fl_Double_Window* ConfigureDialog(); void openConfig(); void closeDialog(); void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata); void KmlDestDirSet(Fl_File_Chooser *w, void *userdata); #endif fldigi-4.2.05/src/include/macros.h0000664000175000017500000000532414611711171013636 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _MACROS_H #define _MACROS_H #include #define NUMMACKEYS 12 #define NUMKEYROWS 2 #define MAXKEYROWS 4 #define MAXMACROS (MAXKEYROWS * NUMMACKEYS) extern void CPS_report(int); extern bool PERFORM_CPS_TEST; extern int num_cps_chars; extern struct timeval tv_cps_start; struct CONTESTCNTR { int count; char szCount[20]; char szDisp[40]; std::string fmt; CONTESTCNTR() { count = 0; fmt = "%04d"; } void Format(int ndigits, bool lz) { char c; fmt = '%'; if (lz) fmt = fmt + '0'; c = '0' + ndigits; fmt = fmt + c; fmt = fmt + 'd'; } }; struct MACROTEXT { bool changed; std::string name[MAXMACROS]; std::string text[MAXMACROS]; int loadMacros(const std::string& filename); void loadDefault(); void openMacroFile(); void writeMacroFile(); void saveMacroFile(); void saveMacros(const std::string& fname); std::string expandMacro(std::string &s, bool recurse); void execute(int n); void repeat(int n); void timed_execute(); MACROTEXT(); private: std::string expanded; void loadnewMACROS(std::string& s, size_t &i, size_t endbracket); void savecurrentMACROS(std::string& s, size_t &i, size_t endbracket); }; extern MACROTEXT macros; extern CONTESTCNTR contest_count; extern std::string info1msg; extern std::string info2msg; extern std::string qso_time; extern std::string qso_exchange; extern std::string exec_date; extern std::string exec_time; extern std::string exec_string; extern std::string text2repeat; extern std::string macrochar; extern bool local_timed_exec; extern bool macro_idle_on; extern size_t repeatchar; extern bool do_tune_on; void set_macro_env(void); void queue_reset(); void Tx_queue_execute(); void Rx_queue_execute(); bool queue_must_rx(); void idleTimer(void *); extern void TxQueINSERTIMAGE(std::string s); extern void clear_buffered_text(); extern char next_buffered_macro_char(); #endif fldigi-4.2.05/src/include/dominoex.h0000664000175000017500000000734714611711171014203 00000000000000// ---------------------------------------------------------------------------- // dominoex.h -- DominoEX modem // // Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2006 // Hamish Moffatt (hamish@debian.org) // Copyright (C) 2006 // David Freese (w1hkj@w1hkj.com) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _DOMINOEX_H #define _DOMINOEX_H #include #include "complex.h" #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "dominovar.h" #include "mbuffer.h" // NASA coefficients for viterbi encode/decode algorithms #define NASA_K 7 #define POLY1 0x6d #define POLY2 0x4f //#include "mfskvaricode.h" #include "interleave.h" #include "viterbi.h" #define NUMTONES 18 #define MAXFFTS 8 #define BASEFREQ 1000.0 #define FIRSTIF 1500.0 #define SCOPESIZE 64 struct domrxpipe { cmplx vector[MAXFFTS * NUMTONES * 6]; }; class dominoex : public modem { public: enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_FLUSH }; protected: // common variables double phase[MAXFFTS + 1]; double txphase; int symlen; int doublespaced; double tonespacing; int counter; unsigned int twosym; int paths; int numbins; bool slowcpu; int basetone; int lotone; int hitone; int extones; // rx variables C_FIR_filter *hilbert; sfft *binsfft[MAXFFTS]; fftfilt *fft; Cmovavg *vidfilter[SCOPESIZE]; Cmovavg *syncfilter; domrxpipe *pipe; unsigned int pipeptr; mbuffer scopedata; mbuffer videodata; cmplx currvector; int currsymbol; int prev1symbol; int prev2symbol; double met1; double met2; double sig; double noise; double s2n; int synccounter; unsigned char symbolbuf[MAX_VARICODE_LEN]; int symcounter; int symbolbit; bool filter_reset; bool staticburst; bool outofrange; // tx variables int txstate; int txprevtone; unsigned int bitshreg; std::string strSecXmtText; // FEC variables viterbi *MuPskDec; interleave *MuPskRxinlv; encoder *MuPskEnc; interleave *MuPskTxinlv; int Mu_bitstate; unsigned char Mu_symbolpair[2]; unsigned int Mu_datashreg; int Mu_symcounter; private: cmplx mixer(int n, cmplx in); void recvchar(int c); void decodesymbol(); void decodeDomino(int c); int harddecode(); void update_syncscope(); void synchronize(); void afc(); void reset_afc(); void eval_s2n(); void sendtone(int tone, int duration); void sendsymbol(int sym); void sendchar(unsigned char c, int secondary); void sendidle(); void sendsecondary(); void flushtx(); int get_secondary_char(); void reset_filters(); // MultiPsk FEC scheme // Rx unsigned int MuPskPriSecChar(unsigned int c); void decodeMuPskSymbol(unsigned char symbol); void decodeMuPskEX(int c); // Tx unsigned char MuPskSec2Pri(int c); void sendMuPskEX(unsigned char c, int secondary); void MuPskClearbits(); void MuPskFlushTx(); void MuPsk_sec2pri_init(void); public: dominoex (trx_mode md); ~dominoex (); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); }; #endif fldigi-4.2.05/src/include/coordinate.h0000664000175000017500000000530114532252172014477 00000000000000// ---------------------------------------------------------------------------- // coordinate.h -- Handling of longitude and latitude. // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _COORDINATE_H #define _COORDINATE_H #include // Models a longitude or latitude. class CoordinateT { // Precision is: 360 * 3600 = 1296000, 21 bits. A float might be enough. double m_angle ; // In decimal degrees, between -180.0 and 180.0. bool m_is_lon ; // Longitude or latitude. // TODO: Consider adding a big offset to m_angle, instead of an extra flag. void Check(void) const ; void Init( char direction, double degrees ); public: CoordinateT(bool ll=true) : m_angle(0.0), m_is_lon(ll) {}; CoordinateT( double degrees, bool is_lon ); CoordinateT( char direction, double degrees ); CoordinateT( char direction, int degree, int minute, int second ); double angle(void) const { return m_angle ; } bool is_lon(void) const { return m_is_lon; } // Specific for reading from the file of navtex or wmo stations. // Navtex: "57 06 N" // Wmo : "69-36N", "013-27E", "009-25E" friend std::istream & operator>>( std::istream & istrm, CoordinateT & ref ); friend std::ostream & operator<<( std::ostream & ostrm, const CoordinateT & ref ); class Pair ; }; // CoordinateT // Longitude , latitude. class CoordinateT::Pair { CoordinateT m_lon, m_lat ; public: Pair() {} Pair( const CoordinateT & coo1, const CoordinateT & coo2 ); Pair( double lon, double lat ); Pair( const std::string & locator ); CoordinateT longitude() const { return m_lon ; } CoordinateT latitude() const { return m_lat ; } CoordinateT & longitude() { return m_lon ; } CoordinateT & latitude() { return m_lat ; } double distance( const Pair & a ) const; std::string locator() const ; friend std::istream & operator>>( std::istream & istrm, Pair & ref ); friend std::ostream & operator<<( std::ostream & ostrm, const Pair & ref ); }; // CoordinateT::Pair #endif // _COORDINATE_H fldigi-4.2.05/src/include/fl_digi.h0000664000175000017500000005760614611711171013761 00000000000000// ---------------------------------------------------------------------------- // // fl_digi.h // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_DIGI_H #define FL_DIGI_H #include #include #include #include #include #include "combo.h" //#include "Fl_Tile_Check.h" #include "Panel.h" #include "FTextRXTX.h" #include "raster.h" #include "waterfall.h" #include "digiscope.h" #include "globals.h" #include "progress.h" #include "FreqControl.h" #include "flinput2.h" #include "flslider2.h" #include "psk_browser.h" #include "re.h" #include "smeter.h" #include "pwrmeter.h" #include "picture.h" #include "qso_db.h" #include "vumeter.h" #include "status_box.h" #include extern fre_t seek_re; extern Fl_Double_Window *fl_digi_main; extern Fl_Double_Window *scopeview; extern Fl_Double_Window *dlgRecordLoader; extern Fl_Double_Window *dxcluster_viewer; extern Fl_Double_Window *rxaudio_dialog; extern Fl_Double_Window *fsqMonitor; extern Fl_Double_Window *fsqDebug; extern Fl_Double_Window *fsqpicRxWin; extern Fl_Double_Window *fsqpicTxWin; extern Fl_Double_Window *ifkppicRxWin; extern Fl_Double_Window *ifkppicTxWin; extern Fl_Double_Window *notify_window; extern Fl_Double_Window *dxcc_window; extern Fl_Double_Window *dxcluster_viewer; extern Fl_Double_Window *rxaudio_dialog; extern Fl_Menu_Item menu_[]; extern int main_menu_size; extern Fl_Group *mnuFrame;; extern void change_menu_fonts( Fl_Font font, int size); extern bool first_use; extern bool bEXITING; extern FTextRX *ReceiveText; extern FTextTX *TransmitText; extern Raster *FHdisp; extern pskBrowser *mainViewer; extern Fl_Input2 *txtInpSeek; extern Fl_Box *hideViewer; extern Fl_Group *mvgroup; extern Fl_Group *text_group; extern Fl_Group *wefax_group; extern Panel *text_panel; extern Fl_Box *minbox; extern int oix; extern Fl_Box *Status2; extern Fl_Box *Status1; extern status_box *StatusBar; extern vumeter *VuMeter; extern Fl_Box *VuBox; extern void VuMeter_cb(vumeter *vu, void *d); extern void StatusBar_cb(Fl_Box *bx, void *d); extern Fl_Counter2 *cntCW_WPM; extern Fl_Counter2 *cntTxLevel; extern Fl_Button *MODEstatus; extern Fl_Slider2 *sldrSquelch; extern Progress *pgrsSquelch; extern Smeter *smeter; extern PWRmeter *pwrmeter; extern Fl_Value_Slider2 *pwr_level; extern Fl_Group *pwrlevel_grp; extern Fl_Button *btnMacro[]; extern Fl_Button *btnAltMacros1; extern Fl_Button *btnAltMacros2; extern Fl_Button *btnDockMacro[]; extern Fl_Button *btnMacroTimer; extern Fl_Group *macroFrame1; extern Fl_Group *macroFrame2; extern Fl_Input2 *inpFreq; extern Fl_Input2 *inpTimeOff; extern Fl_Input2 *inpTimeOff1; extern Fl_Input2 *inpTimeOff2; extern Fl_Input2 *inpTimeOff3; extern Fl_Input2 *inpTimeOn; extern Fl_Input2 *inpTimeOn1; extern Fl_Input2 *inpTimeOn2; extern Fl_Input2 *inpTimeOn3; extern Fl_Input2 *inpTimeOn4; extern Fl_Input2 *inpTimeOn5; extern Fl_Input2 *inpCall; extern Fl_Input2 *inpName; extern Fl_Input2 *inpRstIn; extern Fl_Input2 *inpRstIn1; extern Fl_Input2 *inpRstIn2; extern Fl_Input2 *inpRstIn3; extern Fl_Input2 *inpRstIn4; extern Fl_Input2 *inpRstOut; extern Fl_Input2 *inpRstOut1; extern Fl_Input2 *inpRstOut2; extern Fl_Input2 *inpRstOut3; extern Fl_Input2 *inpRstOut4; extern Fl_Input2 *inpQTH; extern Fl_Input2 *inpQth; extern Fl_Input2 *inpState; extern Fl_Input2 *inpState1; extern Fl_ComboBox *cboCountry; extern Fl_Input2 *inpCounty; extern Fl_ComboBox *cboCountryQSO; extern Fl_ComboBox *cboCountyQSO; extern Fl_Input2 *inpSerNo; extern Fl_Input2 *inpSerNo1; extern Fl_Input2 *inpSerNo2; extern Fl_Input2 *inpSerNo3; extern Fl_Input2 *inpSerNo4; extern Fl_Input2 *outSerNo; extern Fl_Input2 *outSerNo1; extern Fl_Input2 *outSerNo2; extern Fl_Input2 *outSerNo3; extern Fl_Input2 *outSerNo4; extern Fl_Input2 *inpXchgIn; extern Fl_Input2 *inpXchgIn1; extern Fl_Input2 *inpXchgIn2; extern Fl_Input2 *inpVEprov; extern Fl_Input2 *inpLoc; extern Fl_Input2 *inpLoc1; extern Fl_Input2 *inpNotes; extern Fl_Input2 *inpAZ; // WA5ZNU extern Fl_Button *qsoSave; extern Fl_Box *txtRigName; extern cFreqControl *qsoFreqDisp1; extern cFreqControl *qsoFreqDisp2; extern cFreqControl *qsoFreqDisp3; extern Fl_Input2 *inpFreq2; extern Fl_Input2 *inpCall1; extern Fl_Input2 *inpCall2; extern Fl_Input2 *inpCall3; extern Fl_Input2 *inpCall4; extern Fl_Input2 *inpName1; extern Fl_Input2 *inpName2; extern Fl_Group *QsoInfoFrame1B; extern Fl_Group *qsoFrameView; extern Fl_Group *QsoInfoFrame; extern cFreqControl *qsoFreqDisp; extern Fl_Group *qso_combos; extern Fl_ListBox *qso_opMODE; extern Fl_Group *qso_opGROUP; extern Fl_ListBox *qso_opBW; extern Fl_Button *qso_btnBW1; extern Fl_ListBox *qso_opBW1; extern Fl_Button *qso_btnBW2; extern Fl_ListBox *qso_opBW2; extern Fl_Button *qso_opPICK; extern Fl_Browser *qso_opBrowser; extern Fl_Group *fsq_group; extern FTextRX *fsq_rx_text; extern FTextTX *fsq_tx_text; extern Fl_Browser *fsq_heard; extern FTextRX *fsq_monitor; extern FTextRX *fsq_que; extern Fl_Double_Window *create_fsqMonitor(); extern void open_fsqMonitor(); extern void close_fsqMonitor(); extern Fl_Double_Window *create_fsqDebug(); extern void open_fsqDebug(); extern void close_fsqDebug(); extern void write_fsqDebug(int ch, int style = FTextBase::RECV); extern void write_fsqDebug(std::string s, int style = FTextBase::RECV); extern void fsq_que_clear(); extern void write_fsq_que(std::string s); extern Fl_Box *tx_timer; extern void start_tx_timer(); extern void stop_tx_timer(); extern void fsq_disableshift(); extern void fsq_enableshift(); extern void fsq_updateRxPic(unsigned char data, int pos); extern void fsq_createRxViewer(); extern void fsq_showRxViewer(int W, int H, char c); extern int fsq_load_image(const char *n, int W = 320, int H = 240); extern void fsq_updateTxPic(unsigned char data, int pos); extern void cb_fsqpicTxLoad(Fl_Widget *, void *); extern void cb_fsqpicTxClose( Fl_Widget *w, void *); extern int fsqpic_TxGetPixel(int pos, int color); extern void cb_fsqpicTxSendColor( Fl_Widget *w, void *); extern void cb_fsqpicTxSendGrey( Fl_Widget *w, void *); extern void cb_fsqpicTxSendAbort( Fl_Widget *w, void *); extern void cb_fsqpicTxSPP( Fl_Widget *w, void *); extern void fsq_createTxViewer(); extern void fsq_TxViewerResize(int W, int H); extern void fsq_showTxViewer(char c); extern void fsq_deleteTxViewer(); extern void fsq_deleteRxViewer(); extern int fsq_print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix); extern void fsq_transmit(void *); extern Fl_Light_Button *btn_FSQCALL; extern Fl_Light_Button *btn_SELCAL; extern Fl_Light_Button *btn_MONITOR; extern Fl_Button *btn_FSQQTH; extern Fl_Button *btn_FSQQTC; extern Progress *ind_fsq_speed; extern Progress *ind_fsq_s2n; extern std::string fsq_selected_call; extern bool in_heard(std::string); extern void cb_fsq_heard(Fl_Browser*, void*); extern std::string heard_list(); extern void clear_heard_list(); extern void age_heard_list(); extern void add_to_heard_list(std::string, std::string); extern void fsq_transmit_string(std::string s); extern void fsq_xmt_mt(void *s); extern void fsq_xmt(std::string s); extern void fsq_repeat_last_heard(); extern void fsq_repeat_last_command(); extern void display_fsq_rx_text(std::string text, int style = FTextBase::SKIP); extern void display_fsq_mon_text(std::string text, int style = FTextBase::SKIP); extern void combo_color_font(Fl_ComboBox *cbo); extern Fl_Group *ifkp_group; extern Fl_Group *ifkp_upper; extern Fl_Group *ifkp_upper_left; extern FTextRX *ifkp_rx_text; extern Fl_Group *ifkp_upper_right; extern Fl_Browser *ifkp_heard; extern Progress *ifkp_s2n_progress; extern Fl_Group *ifkp_lower; extern FTextTX *ifkp_tx_text; extern picture *ifkp_avatar; extern int ifkp_load_avatar(std::string image_fname = "", int W=59, int H=74); extern void ifkp_clear_avatar(); extern void ifkp_update_avatar(unsigned char data, int pos); extern int ifkp_get_avatar_pixel(int pos, int color); extern void cb_ifkp_send_avatar( Fl_Widget *w, void *); extern void ifkp_load_raw_video(); extern void activate_ifkp_image_item(bool); extern void cb_ifkp_heard(Fl_Browser*, void*); extern void enableSELCAL(); extern unsigned char tux_img[59*74*3]; extern void cbFSQQTC(Fl_Widget *w, void *d); extern void cbFSQQTH(Fl_Widget *w, void *d); extern void cbFSQCQ(Fl_Widget *w, void *d); extern void cbMONITOR(Fl_Widget *w, void *d); extern void cbSELCAL(Fl_Widget *w, void *d); extern void cbFSQCALL(Fl_Widget *w, void *d); extern void ifkp_showTxViewer(char C = 'S'); extern void ifkp_load_scaled_image(std::string, bool gray = false); #include extern Fl_Bitmap image_s2n; //------------------------------------------------------------------------------ // fsq images //------------------------------------------------------------------------------ extern Fl_Double_Window *picRxWin; extern picture *picRx; extern Fl_Button *btnpicRxSave; extern Fl_Button *btnpicRxAbort; extern Fl_Button *btnpicRxClose; extern Fl_Double_Window *picTxWin; extern picture *picTx; extern Fl_Button *btnpicTxSPP; extern Fl_Button *btnpicTxSendColor; extern Fl_Button *btnpicTxSendGrey; extern Fl_Button *btnpicTxSendAbort; extern Fl_Button *btnpicTxLoad; extern Fl_Button *btnpicTxClose; //------------------------------------------------------------------------------ extern Fl_Value_Slider2 *mvsquelch; extern Fl_Light_Button *btnAFC; extern Fl_Light_Button *btnSQL; extern Fl_Light_Button *btnPSQL; extern Fl_Box *rsid_status; extern Fl_Light_Button *btnRSID; extern Fl_Light_Button *btnTxRSID; extern Fl_Light_Button *btnTune; extern Fl_Light_Button *btnAutoSpot; extern bool bWF_only; extern int altMacros; extern waterfall *wf; extern Digiscope *digiscope; extern std::string argv_window_title; extern std::string main_window_title; extern std::string xcvr_title; extern int Qwait_time; extern int Qidle_time; extern bool idling; extern bool csma_idling; extern void toggleRSID(); extern int rightof(Fl_Widget* w); extern int leftof(Fl_Widget* w); extern int above(Fl_Widget* w); extern int below(Fl_Widget* w); extern void set_menus(); extern void create_fl_digi_main(int argc, char** argv); extern void update_main_title(); extern void activate_rig_menu_item(bool b); extern void activate_test_menu_item(bool b); extern void activate_mfsk_image_item(bool b); extern void activate_wefax_image_item(bool b); extern void activate_thor_image_item(bool b); extern void WF_UI(); extern void set_macroLabels(); extern void UI_select(); extern void cb_mnuVisitURL(Fl_Widget*, void* arg); extern void put_freq(double frequency); extern void put_Bandwidth(int bandwidth); extern void callback_set_metric(double metric); extern void put_cwRcvWPM(double wpm); extern void set_scope_mode(Digiscope::scope_mode md); extern void set_scope(double *data, int len, bool autoscale = true); extern void set_phase(double phase, double quality, bool highlight); extern void set_rtty(double, double, double); extern void set_video(double *, int, bool = true); extern void set_zdata(cmplx *, int); extern void set_scope_xaxis_1(double y1); extern void set_scope_xaxis_2(double y2); extern void set_scope_yaxis_1(double x1); extern void set_scope_yaxis_2(double x2); extern void set_scope_clear_axis(); extern void set_scope_colors(); extern void set_CWwpm(); extern void put_rx_char(unsigned int data, int style = FTextBase::RECV); extern void put_rx_processed_char(unsigned int data, int style = FTextBase::RECV); extern void put_sec_char( char chr ); enum status_timeout { STATUS_CLEAR, STATUS_DIM, STATUS_NUM }; extern const char *zshowtime(); extern void put_status(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void clear_StatusMessages(); extern void put_MODEstatus(const char* fmt, ...) format__(printf, 1, 2); extern void put_MODEstatus(trx_mode mode); extern void put_Status1(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void put_Status2(const char *msg, double timeout = 0.0, status_timeout action = STATUS_CLEAR); extern void show_clock(bool); extern void show_frequency(unsigned long long); extern void show_mode(const std::string sMode); extern void show_bw(const std::string sWidth); extern void show_bw1(const std::string sVal); extern void show_bw2(const std::string sVal); extern void show_spot(bool v); extern void showMacroSet(); extern void setwfrange(); extern void showDTMF(const std::string s); extern void * set_xmtrcv_button_false(void); extern void * set_xmtrcv_button_true(void); extern void * set_xmtrcv_selection_color_pending(void); extern void * set_xmtrcv_selection_color_transmitting(void); extern void xmtrcv_selection_color(Fl_Color clr); extern void xmtrcv_selection_color(); extern void rev_selection_color(); extern void xmtlock_selection_color(); extern void sql_selection_color(); extern void afc_selection_color(); extern void rxid_selection_color(); extern void txid_selection_color(); extern void tune_selection_color(); extern void spot_selection_color(); extern void set_default_btn_color(); extern void put_WARNstatus(double); extern void qsoSave_cb(Fl_Widget *b, void *); extern bool que_ok; extern bool tx_queue_done; extern void post_queue_execute(void*); extern void queue_execute_after_rx(void*); extern time_t program_start_time; extern bool xmlrpc_address_override_flag; extern bool xmlrpc_port_override_flag; extern bool arq_address_override_flag; extern bool arq_port_override_flag; extern bool kiss_address_override_flag; extern std::string override_xmlrpc_address; extern std::string override_xmlrpc_port; extern std::string override_arq_address; extern std::string override_arq_port; extern std::string override_kiss_address; extern std::string override_kiss_io_port; extern std::string override_kiss_out_port; extern int override_kiss_dual_port_enabled; extern int override_data_io_enabled; extern int rxtx_charset; extern void put_rx_data(int *data, int len); // Values returned by get_tx_char() to signal various conditions to the // modems. These values need to be negative so they don't interfere with // normal TX data (which is always byte-sized and positive). #define GET_TX_CHAR_NODATA -1 // no data available #define GET_TX_CHAR_ETX -3 // end of transmission requested // Last single macro bar option index #define MACRO_SINGLE_BAR_MAX 2 extern int get_tx_char(); extern int get_secondary_char(); extern void put_echo_char(unsigned int data, int style = FTextBase::XMIT); extern char *get_rxtx_data(); extern char *get_rx_data(); extern char *get_tx_data(); extern void resetRTTY(); extern void resetFSK(); extern void resetOLIVIA(); extern void resetCONTESTIA(); extern void resetTHOR(); extern void resetDOMEX(); extern void updatePACKET(); extern void resetSoundCard(); extern void restoreFocus(int n = 0); extern void setReverse(int); extern void clearQSO(); extern void clear_log_fields(); extern void set_log_colors(); extern void closeRigDialog(); extern void CloseQsoView(); extern void setAfcOnOff(bool b); extern void setSqlOnOff(bool b); extern bool QueryAfcOnOff(); extern bool QuerySqlOnOff(); extern void init_modem(trx_mode mode, int freq = 0); extern void init_modem_sync(trx_mode mode, int freq = 0); extern void init_modem_squelch(trx_mode mode, int freq = 0); extern void rsid_eot_squelch(); extern void start_tx(); extern void abort_tx(); extern void set_rx_tx(); extern void set_rx_only(); extern void connect_to_fdserver(bool); extern void LOGGING_colors_font(); extern void LOGBOOK_colors_font(); extern void colorize_macro(int i); extern void colorize_macros(); extern void set_rtty_tab_widgets(); extern void set_olivia_tab_widgets(); extern void set_olivia_default_integ(); extern void set_dominoex_tab_widgets(); extern void set_contestia_tab_widgets(); extern void set_contestia_default_integ(); extern void startMacroTimer(); extern void stopMacroTimer(); extern void macro_timer(void *); extern void macro_timed_execute(void *); extern void startTimedExecute(std::string &); extern void cb_ResetSerNbr(); extern void updateOutSerNo(); extern void connect_to_log_server(void *p = NULL); extern void set_server_label(bool); extern void activate_menu_item(const char *caption, bool val); extern int xml_check_dup(); extern bool xml_get_record(const char *); extern cQsoRec* search_fllog(const char *callsign); extern void xml_update_eqsl(); extern void xml_update_lotw(); extern const char* zdate(void); extern const char* ztime(void); extern const char* ldate(void); extern const char* ltime(void); //extern void ztimer(void* first_call); extern const double zusec(void); extern const timeval tmval(void); extern const unsigned long zmsec(void); extern void start_macro_time(); extern int stop_macro_time(); extern void setTabColors(); extern void toggle_visible_modes(Fl_Widget*, void*); extern void qsy(unsigned long long rfc, int fmid = -1); extern void note_qrg(bool no_dup = true, const char* prefix = " ", const char* suffix = " ", trx_mode mode = NUM_MODES, unsigned long long rfc = 0ULL, int afreq = 0); extern void set_olivia_bw(int bw); extern void set_olivia_tones(int tones); extern void set_contestia_bw(int bw); extern void set_contestia_tones(int tones); extern void set_rtty_shift(int shift); extern void set_rtty_baud(float baud); extern void set_rtty_bits(int bits); extern void set_rtty_bw(float bw); extern void enable_rtty_quickchange(); extern void disable_rtty_quickchange(); extern void sync_cw_parameters(); extern void open_recv_folder(const char *fname); extern void reset_mnuPlayback(); // character set extern void set_charset_listbox(Fl_Widget *, void *charset); extern void cb_listbox_charset(Fl_Widget *, void *); extern void populate_charset_listbox(void); extern void set_default_charset(void); // set notch parameter on flrig extern int notch_frequency; extern void notch_on(int); extern void notch_off(); // Set IO port extern void enable_kiss(void); extern void enable_arq(void); // PSM Configuration. extern void psm_set_defaults(void); extern void update_csma_io_config(int which); // thread terminators extern void ADIF_RW_close(void); extern void EQSL_close(void); extern void cb_mnuCheckUpdate(Fl_Widget *, void *); bool ask_dir_creation( const std::string & dir ); extern void set_CSV(int how); extern void set_freq_control_lsd(); extern void set_smeter_colors(); extern void log_callback(Fl_Widget *); extern void set599(); // thor images extern void thor_showTxViewer(char C = 'S'); extern Fl_Double_Window *thorpicRxWin; extern Fl_Double_Window *thorpicTxWin; extern int thor_load_avatar(std::string image_fname = "", int W=59, int H=74); extern void thor_clear_avatar(); extern void thor_update_avatar(unsigned char data, int pos); extern int thor_get_avatar_pixel(int pos, int color); extern void cb_thor_send_avatar( Fl_Widget *w, void *); extern picture *thor_avatar; extern void thor_load_scaled_image(std::string fname, bool gray = false); extern void thor_load_raw_video(); // field day extern Fl_Input2 *inpClass; extern Fl_Input2 *inpSection; extern Fl_Input2 *inp_FD_class1; extern Fl_Input2 *inp_FD_section1; extern Fl_Input2 *inp_FD_class2; extern Fl_Input2 *inp_FD_section2; // CQWW DX extern Fl_Input2 *inp_CQDX_RSTin2; extern Fl_Input2 *inp_CQDX_RSTout2; extern Fl_ComboBox *cboCountryCQDX2; extern Fl_Input2 *inp_CQDXzone1; extern Fl_Input2 *inp_CQDXzone2; // CQWW RTTY extern Fl_Input2 *inp_CQzone; extern Fl_Input2 *inp_CQzone1; extern Fl_Input2 *inp_CQzone2; extern Fl_Input2 *inp_CQstate; extern Fl_Input2 *inp_CQstate1; extern Fl_Input2 *inp_CQstate2; extern Fl_ComboBox *cboCountryCQ2; extern Fl_Input2 *inp_CQ_RSTin2; extern Fl_Input2 *inp_CQ_RSTout2; // CW Sweepstakes extern Fl_Input2 *inp_SS_SerialNoR; extern Fl_Input2 *inp_SS_Precedence; extern Fl_Input2 *inp_SS_Check; extern Fl_Input2 *inp_SS_Section; // LOG_ARR extern Fl_Input2 *inp_ARR_check; extern Fl_Input2 *inp_ARR_check1; extern Fl_Input2 *inp_ARR_check2; extern Fl_Input2 *inp_ARR_XchgIn1; extern Fl_Input2 *inp_ARR_XchgIn2; extern Fl_Input2 *inp_ARR_Name2; // LOG_KD extern Fl_Input2 *inp_KD_age; extern Fl_Input2 *inp_KD_XchgIn1; extern Fl_Input2 *inp_KD_XchgIn2; extern Fl_Input2 *inp_KD_state1; extern Fl_Input2 *inp_KD_state2; extern Fl_Input2 *inp_KD_VEprov1; extern Fl_Input2 *inp_KD_VEprov2; // LOG_1010 extern Fl_Input2 *inp_1010_nr; extern Fl_Input2 *inp_1010_name2; extern Fl_Input2 *inp_1010_XchgIn1; extern Fl_Input2 *inp_1010_XchgIn2; // LOG_ASCR extern Fl_Input2 *inp_ASCR_class1; extern Fl_Input2 *inp_ASCR_XchgIn1; extern Fl_Input2 *inp_ASCR_name2; extern Fl_Input2 *inp_ASCR_class2; extern Fl_Input2 *inp_ASCR_XchgIn2; extern Fl_Input2 *inp_ASCR_RSTin2; extern Fl_Input2 *inp_ASCR_RSTout2; // LOG_NAQP extern Fl_Input2 *inpSPCnum; extern Fl_Input2 *inpSPCnum_NAQP1; extern Fl_Input2 *inpSPCnum_NAQP2; extern Fl_Input2 *inpNAQPname2; // LOG_RTTY extern Fl_Input2 *inpRTU_stpr1; extern Fl_Input2 *inpRTU_stpr2; extern Fl_ComboBox *cboCountryRTU2; extern Fl_Input2 *inpRTU_RSTin2; extern Fl_Input2 *inpRTU_RSTout2; extern Fl_Input2 *inpRTU_serno1; extern Fl_Input2 *inpRTU_serno2; // LOG_JOTA extern Fl_Input2 *inpRstIn4; extern Fl_Input2 *inpRstOut4; extern Fl_Input2 *inp_JOTA_scout; extern Fl_Input2 *inp_JOTA_scout1; extern Fl_Input2 *inp_JOTA_scout2; extern Fl_Input2 *inp_JOTA_troop; extern Fl_Input2 *inp_JOTA_troop1; extern Fl_Input2 *inp_JOTA_troop2; extern Fl_Input2 *inp_JOTA_spc; extern Fl_Input2 *inp_JOTA_spc1; extern Fl_Input2 *inp_JOTA_spc2; // LOG_AICW extern Fl_Input2 *inpSPCnum_AICW1; extern Fl_Input2 *inpSPCnum_AICW2; extern Fl_Input2 *inpRstIn_AICW2; extern Fl_Input2 *inpRstOut_AICW2; extern Fl_ComboBox *cboCountryAICW2; //LOG_AIDX extern Fl_ComboBox *cboCountryAIDX; extern Fl_ComboBox *cboCountryAIDX2; // LOG_IARI - Italian International DX extern Fl_Input2 *inp_IARI_PR1; extern Fl_Input2 *inp_IARI_RSTin2; extern Fl_Input2 *inp_IARI_RSTout2; extern Fl_Input2 *out_IARI_SerNo1; extern Fl_Input2 *inp_IARI_SerNo1; extern Fl_Input2 *out_IARI_SerNo2; extern Fl_Input2 *inp_IARI_SerNo2; extern Fl_Input2 *inp_IARI_PR2; extern Fl_ComboBox *cboCountryIARI2; // LOG_WPX extern Fl_Input2 *inpSerNo_WPX1; extern Fl_Input2 *inpSerNo_WPX2; extern Fl_Input2 *outSerNo_WPX1; extern Fl_Input2 *outSerNo_WPX2; extern Fl_Input2 *inpRstIn_WPX2; extern Fl_Input2 *inpRstOut_WPX2; // LOG_SQSO extern Fl_Input2 *inpSQSO_state1; extern Fl_Input2 *inpSQSO_state2; extern Fl_Input2 *inpSQSO_county1; extern Fl_Input2 *inpSQSO_county2; extern Fl_Input2 *inpSQSO_serno1; extern Fl_Input2 *inpSQSO_serno2; extern Fl_Input2 *inpSQSO_name2; extern Fl_Input2 *outSQSO_serno1; extern Fl_Input2 *outSQSO_serno2; extern Fl_Input2 *inpRstIn_SQSO2; extern Fl_Input2 *inpRstOut_SQSO2; extern Fl_Input2 *inpSQSO_category; extern Fl_Input2 *inpSQSO_category1; extern Fl_Input2 *inpSQSO_category2; extern Fl_Double_Window *nano_calibration_dialog();; // TOD clock extern void TOD_init(); extern void TOD_close(); extern void start_deadman(); extern void stop_deadman(); extern void disable_deadman(); //====================================================================== //FeldHell resizable Rx character height //====================================================================== extern void FHdisp_char_height(); extern bool clean_exit(bool); #endif fldigi-4.2.05/src/include/FreqControl.h0000664000175000017500000001243014611711171014604 00000000000000// ---------------------------------------------------------------------------- // // Frequency Control Widget for the Fast Light Tool Kit // // Copyright (C) 2023 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // flrig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // // Usage: // Create a multi-digit receiver / transceiver frequency control widget // // 'lbl' param used to specify # digits to display // The widget can be used in Fluid & initialized with the // number of digits as the label string // default is 7; min number is 4, max number is 10. // // cFreqControl myFreqControl(x0, y0, w0, h0, "N"); where N is # digits // cFreqControl *pMyFreqControl = new cFreqControl(x0,y0,w0,h0,"N"); #ifndef _FREQCONTROL_H_ #define _FREQCONTROL_H_ #include #include #include #include #include #include #include #include #include #ifdef MAX_DIGITS #undef MAX_DIGITS #endif #define MAX_DIGITS 10 #ifdef MIN_DIGITS #undef MIN_DIGITS #endif #define MIN_DIGITS 4 class cFreqControl : public Fl_Group { friend void cbSelectDigit (Fl_Widget *btn, void * nbr); public: cFreqControl(int x, int y, int w, int h, const char *lbl = "7"); ~cFreqControl(); void updatevalue(); void value(unsigned long long lv); unsigned long long value() {return val;}; std::string strval() { char szfreq[20]; snprintf(szfreq, sizeof(szfreq), "%f", val / 1e6); return szfreq; } unsigned long long maximum(void); void font(Fl_Font fnt); void SetBGCOLOR (uchar r, uchar g, uchar b); void GetBGCOLOR (uchar &r, uchar &g, uchar &b) { Fl::get_color(BGCOLOR, r, g, b); }; void SetLBLCOLOR (uchar r, uchar g, uchar b); void GetLBLCOLOR (uchar &r, uchar &g, uchar &b) { Fl::get_color(LBLCOLOR, r, g, b); }; void SetCOLORS(Fl_Color, Fl_Color); void UpdateCOLORS(Fl_Color, Fl_Color); void callback (void (*cbf)(Fl_Widget *, void *) ){ cbFunc = cbf;} void do_callback() { if (cbFunc) cbFunc(this, (void*)0); } int handle(int event); void visual_beep(); void set_hrd(bool b) {hrd_buttons = b;} void reverse_colors(); void restore_colors(); bool is_reversed_colors() { return colors_reversed; } void resize (int X, int Y, int W, int H); void set_ndigits(int nbr); void set_lsd(int lsd) { if (lsd < 0) return; if (lsd > 3) return; set_precision ((int) pow(10, lsd)); } void set_precision(int prec) { switch (prec) { case 1000: dpoint = 0; precision = lsd = 1000; break; case 100: dpoint = 1; precision = lsd = 100; break; case 10: dpoint = 2; precision = lsd = 10; break; default: dpoint = 3; precision = lsd = 1; break; } set_ndigits(nD); } void activate() { active = true; } // This function overrides the standard fltk widget func of same name void deactivate() { active = false; } // This function overrides the standard fltk widget func of same name bool isactive() { return active; } bool numeric_entry_mode() { return numeric_entry_active; } void numeric_entry_mode(bool); private: Fl_Repeat_Button *Digit[MAX_DIGITS]; Fl_Boxtype Digit_box_type; Fl_Float_Input *finp; static const char *Label[]; unsigned long long mult[MAX_DIGITS]; Fl_Box *decbx; Fl_Box *hfill; Fl_Font font_number; Fl_Color LBLCOLOR; Fl_Color BGCOLOR; Fl_Color REVBGCOLOR; Fl_Color REVLBLCOLOR; Fl_Color SELCOLOR; int nD; unsigned long long maxVal; // Hz unsigned long long minVal; // Hz bool active; int X, Y, W, H; // Usable space inside FreqControl border int bdr_x, bdr_y; // Thickness of X and Y Freq Control box borders in pixels int fw; // font width - pixels int fh; // font height - pixels int fs; // font size - pixels int dw; // (Fl_Repeat_Button) digit box width - pixels int pw; // (Fl_Box) decimal point box width - pixels void DecFreq(int n); void IncFreq(int n); void (*cbFunc)(Fl_Widget *, void *); static void freq_input_cb(Fl_Widget* input, void* arg); void cancel_kb_entry(void); protected: unsigned long long val, oldval; // Value displayed in Repeat Button boxes; units are Hz int precision; // Really, resolution - Number of Hz represented by least sig digit displayed; for flrig compatibility int dpoint; // Number of digits to the right of decimal point int lsd; // Least significant digit value displayed is 10^lsd Hz bool hrd_buttons; // Toggle between Left/Right mouse click for inc/dec and click top/bottom of digit bool colors_reversed; // Colors (label and background) are reversed to indicate control has focus bool numeric_entry_active; // User pressed numeric keys for freq entry }; #endif fldigi-4.2.05/src/include/view_cw.h0000664000175000017500000000572314611711171014020 00000000000000// ---------------------------------------------------------------------------- // view_cw.h -- cw modem // // Copyright (C) 2008 // Dave Freese, W1HKJ // Modified for CW decoder // Copyright (C) 2014 // Mauri Niininen, AG1LE // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _VIEWCW_H #define _VIEWCW_H #include #include "complex.h" #include "modem.h" #include "globals.h" #include "filters.h" #include "fftfilt.h" #include "morse.h" #define VCW_MAXCH 30 class view_cw; struct CW_CHANNEL { static cMorse *morse; fftfilt *VCW_filter; // linear phase finite impulse response bpf Cmovavg bitfilter; Cmovavg trackingfilter; int ch; double phase; double phase_increment; double ch_freq; double agc_peak; double sig_avg; double value; double phi1; double phi2; int smpl_ctr; int dec_ctr; cmplx zout; int timeout; std::string decode_str; std::string rx_rep_buf; int cw_receive_state; int two_dots; double norm_sig; double CWupper; double CWlower; double noise_floor; int cw_rr_start_timestamp; int cw_rr_end_timestamp; int curr_element; int last_element; int space_sent; int clrcount; int _ch; double metric; double lowerwpm; double upperwpm; CW_CHANNEL(); ~CW_CHANNEL(); int cw_lower_limit; int cw_upper_limit; void init(int ch, double freq); void update_tracking(int dot, int dash); inline int sample_count(unsigned int earlier, unsigned int later); void sync_parameters(); void reset(); int decode_state(int cw_event); void detect_tone(); void rx_process(const double *value, int len); double avg_signal() { return sig_avg; } double get_metric() { return metric; } void set_noise_floor(double nf) { noise_floor = nf; } double get_chfreq() { return ch_freq; } }; #define PEAKS_SIZE 4000 struct PEAKS { double mx[PEAKS_SIZE]; double mn[PEAKS_SIZE]; int mxpos[PEAKS_SIZE]; int mnpos[PEAKS_SIZE]; int mxcount; int mncount; }; class view_cw { private: trx_mode viewmode; double bandwidth; int nchannels; public: CW_CHANNEL channel[VCW_MAXCH]; view_cw(); ~view_cw(); void init(); void restart(); void rx_init(){}; void tx_init(SoundBase *sc){}; int rx_process(const double *buf, int len); int get_freq(int n); void clear(); void clearch(int n); }; #endif fldigi-4.2.05/src/include/qso_db.h0000664000175000017500000000764214611711171013626 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef QSO_DB #define QSO_DB #include #include #include #include "adif_def.h" enum COMPTYPE {COMPTIME, COMPDATE, COMPCALL, COMPFREQ, COMPMODE}; class cQsoDb; class cQsoRec; class cQsoRec { friend int compareCalls (const cQsoRec &, const cQsoRec &); friend int compareDates (const cQsoRec &, const cQsoRec &); friend int compareTimes (const cQsoRec &, const cQsoRec &); friend int compareModes (const cQsoRec &, const cQsoRec &); friend int compareFreqs (const cQsoRec &, const cQsoRec &); friend std::ostream &operator<<( std::ostream &, const cQsoRec &); friend std::istream &operator>>( std::istream &, cQsoRec & ); private: std::string *qsofield[NUMFIELDS]; //bool normal; // sort ordering public: cQsoRec (); ~cQsoRec (); void putField (int, const char *); void putField (int, const char *, int); void addtoField (int, const char *); const char *getField (int) const; void trimFields(); void clearRec (); int validRec(); void checkBand(); void checkDateTimes(); void setDateTime(bool dtOn); void setFrequency(unsigned long long freq); // operator overloads const cQsoRec &operator=(const cQsoRec &); bool operator==(const cQsoRec &) const; bool operator<(const cQsoRec &) const; bool operator!=(const cQsoRec &right) const { return !( *this == right); } bool operator<=(const cQsoRec &right) const { if (*this < right || *this == right) return true; return false; } bool operator>(const cQsoRec &right) const { return !(*this <= right); } }; class cQsoDb { private: cQsoRec * qsorec; int maxrecs; int nbrrecs; int dirty; static const int jdays[][13]; bool isleapyear( int y ) const; int dayofyear (int year, int mon, int mday); unsigned long epoch_dt (const char *szdate, const char *sztime); public: cQsoDb (); cQsoDb (cQsoDb *); ~cQsoDb (); static bool reverse; void deleteRecs(); void clearDatabase(); void isdirty(int n) {dirty = n;} int isdirty() const {return dirty;} void qsoNewRec (cQsoRec *); cQsoRec *newrec(); void qsoDelRec (int); void qsoUpdRec (int, cQsoRec *); int qsoFindRec (cQsoRec *); cQsoRec *getRec (int n) {return &qsorec[n];}; int nbrRecs () const {return nbrrecs;}; bool qsoIsValidFile(const char *); int qsoReadFile (const char *); int qsoWriteFile (const char *); void SortByDate(bool); void SortByCall (); void SortByMode (); void SortByFreq (); void sort_reverse(bool rev) { reverse = rev;} const cQsoRec *recarray() { return qsorec; } int duplicate( const char *callsign, const char *date = NULL, const char *time = NULL, unsigned int interval = 0, bool chkdatetime = false, const char *freq = NULL, bool chkfreq = false, const char *state = NULL, bool chkstate = false, const char *mode = NULL, bool chkmode = false, const char *xchg1 = NULL, bool chkxchg1 = false); int matched( cQsoRec *rec ); }; extern int comparebydate(const void *p1, const void *p2); extern int comparebymode(const void *p1, const void *p2); extern int comparebycall(const void *p1, const void *p2); extern int comparebyfreq(const void *p1, const void *p2); #endif fldigi-4.2.05/src/include/hamlib.h0000664000175000017500000000314014611711171013600 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _HAMLIB_H #define _HAMLIB_H #include extern void hamlib_get_rigs(void); extern size_t hamlib_get_index(rig_model_t model); extern rig_model_t hamlib_get_rig_model(size_t i); extern rig_model_t hamlib_get_rig_model_compat(const char* name); extern void hamlib_get_rig_str(int (*func)(const char*)); extern void hamlib_close(); extern bool hamlib_init(bool bPtt); extern void hamlib_set_ptt(int); extern void hamlib_set_qsy(unsigned long long f); extern int hamlib_setfreq(unsigned long long); extern int hamlib_setmode(rmode_t); extern rmode_t hamlib_getmode(); extern int hamlib_setwidth(pbwidth_t); extern pbwidth_t hamlib_getwidth(); extern void hamlib_get_defaults(); extern void hamlib_init_defaults(); #endif fldigi-4.2.05/src/include/htmlstrings.h0000664000175000017500000000175714532252172014741 00000000000000// ---------------------------------------------------------------------------- // // htmlstrings.h // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef HTMLSTRINGS_H #define HTMLSTRINGS_H extern const char* szBeginner; extern const char* szAbout; #endif fldigi-4.2.05/src/include/network.h0000664000175000017500000001202614611711171014040 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014...2019 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef NETWORK_H_ #define NETWORK_H_ #include #include #include #include #include #include #include #include #include "mbedtls/config.h" #include "mbedtls/net.h" #include "mbedtls/net_sockets.h" #include "mbedtls/debug.h" #include "mbedtls/ssl.h" #include "mbedtls/entropy.h" #include "mbedtls/ctr_drbg.h" #include "mbedtls/error.h" #include "mbedtls/certs.h" extern bool get_http(const std::string& url, std::string& reply, double timeout = 0.0); extern bool post_http(const std::string& url, const std::string& apikey, int profile_id, std::string adifdata, std::string& reply, double timeout = 0.0); extern int test_api_key(std::string url, const std::string& apiKey, double timeout = 0.0); extern char ca_crt_rsa[]; extern size_t ca_crt_rsa_size; //---------------------------------------------------------------------- //#define DEBUG_LEVEL 1 #define MBEDTLS_EXIT_SUCCESS 0 #define MBEDTLS_EXIT_FAILURE 1 #define MBEDTLS_DEBUG_C #define MBEDTLS_CHECK_PARAMS #define H_FIELD_SIZE 512 #define H_READ_SIZE 2048 typedef struct { char method[8]; int status; char content_type[H_FIELD_SIZE]; long content_length; bool chunked; bool close; char location[H_FIELD_SIZE]; char referrer[H_FIELD_SIZE]; char cookie[H_FIELD_SIZE]; char boundary[H_FIELD_SIZE]; } HTTP_HEADER; typedef struct { bool verify; mbedtls_net_context ssl_fd; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; } HTTP_SSL; typedef struct { bool https; char host[256]; char port[8]; char path[H_FIELD_SIZE]; } HTTP_URL; typedef struct { HTTP_URL url; HTTP_HEADER request; HTTP_HEADER response; HTTP_SSL tls; long length; char r_buf[H_READ_SIZE]; long r_len; bool header_end; char *body; long body_size; long body_len; } HTTP_INFO; //---------------------------------------------------------------------- class Url { std::string _url; std::string _host; std::string _port; std::string _request; std::string _data; std::string _pers; std::string server_port; bool _https; int _err; char err_string[1024]; char buf[4096]; mbedtls_net_context server_fd; uint32_t flags; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; bool _debug; static int _rotate_log; double _timeout; std::ofstream debug_file; int http_get(std::string &response); int https_get(std::string &response); int http_post(std::string apikey, int profile_id, std::string adifdata, std::string &response); int http_test(std::string apikey); int https_post(std::string apikey, int profile_id, std::string adifdata, std::string &response); int https_test(std::string apikey); public: Url() { init(); }; Url(std::string url) { init(); _url = url; parse(url); } ~Url() { if (debug_file) { debug_file.close(); } }; void init() { _https = false; server_port.clear(); _url.clear(); _host.clear(); _port.clear(); _request.clear(); _data.clear(); _pers = "fldigi"; _timeout = 5.0; debug(); } void parse(std::string url); std::string host() { return _host; } std::string port() { return _port; } std::string request() { return _request; } std::string data() { return _data; } std::string url() { return _url; } std::string strerr() { return err_string; }; int error() { return _err; } bool https() { return _https; } std::string str_https() { if (_https) return "true"; return "false"; } int get(std::string response); int get(std::string url, std::string &response); int post(std::string response); int post(std::string url, std::string apikey, int profile_id, std::string adifdata, std::string &response); int test(std::string url, std::string apikey); void timeout(double t) { _timeout = t; } double timeout() { return _timeout; } void debug(); }; #endif // NETWORK_H_ fldigi-4.2.05/src/include/https.h0000664000175000017500000000445214611711171013515 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2019 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef HTTPS_CLIENT_HTTPS_H #define HTTPS_CLIENT_HTTPS_H /* #include "mbedtls/net.h" #include "mbedtls/entropy.h" #include "mbedtls/ctr_drbg.h" #include "mbedtls/error.h" #include "mbedtls/certs.h" #define H_FIELD_SIZE 512 #define H_READ_SIZE 2048 //#undef TRUE //#undef FALSE //#define TRUE 1 //#define FALSE 0 //extern char ca_crt_rsa[]; //extern size_t ca_crt_rsa_size; typedef struct { char method[8]; int status; char content_type[H_FIELD_SIZE]; long content_length; bool chunked; bool close; char location[H_FIELD_SIZE]; char referrer[H_FIELD_SIZE]; char cookie[H_FIELD_SIZE]; char boundary[H_FIELD_SIZE]; } HTTP_HEADER; typedef struct { bool verify; mbedtls_net_context ssl_fd; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; } HTTP_SSL; typedef struct { bool https; char host[256]; char port[8]; char path[H_FIELD_SIZE]; } HTTP_URL; typedef struct { HTTP_URL url; HTTP_HEADER request; HTTP_HEADER response; HTTP_SSL tls; long length; char r_buf[H_READ_SIZE]; long r_len; bool header_end; char *body; long body_size; long body_len; } HTTP_INFO; */ #endif //HTTPS_CLIENT_HTTPS_H fldigi-4.2.05/src/include/main.h0000664000175000017500000000673314611711171013303 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef MAIN_H_ #define MAIN_H_ #include // FreeBSD needs this #include #include #include "ptt.h" #include "log.h" #include "data_io.h" #if USE_HAMLIB # include "rigclass.h" #endif extern std::string appname; extern std::string BaseDir; extern std::string HomeDir; extern std::string RigsDir; extern std::string ScriptsDir; extern std::string PalettesDir; extern std::string LogsDir; extern std::string PicsDir; extern std::string AvatarDir; extern std::string HelpDir; extern std::string MacrosDir; extern std::string AnalysisDir; extern std::string FMTDir; extern std::string WrapDir; extern std::string TalkDir; extern std::string TempDir; extern std::string DebugDir; extern std::string LoTWDir; extern std::string KmlDir; extern std::string PskMailDir; extern std::string DATA_dir; extern std::string NBEMS_dir; extern std::string ARQ_dir; extern std::string ARQ_files_dir; extern std::string ARQ_recv_dir; extern std::string ARQ_send; extern std::string WRAP_dir; extern std::string WRAP_recv_dir; extern std::string WRAP_send_dir; extern std::string WRAP_auto_dir; extern std::string ICS_dir; extern std::string ICS_msg_dir; extern std::string ICS_tmp_dir; extern std::string FLMSG_dir; extern std::string FLMSG_WRAP_dir; extern std::string FLMSG_WRAP_recv_dir; extern std::string FLMSG_WRAP_send_dir; extern std::string FLMSG_WRAP_auto_dir; extern std::string FLMSG_ICS_dir; extern std::string FLMSG_ICS_msg_dir; extern std::string FLMSG_ICS_tmp_dir; extern std::string FLAMP_dir; extern std::string FLAMP_rx_dir; extern std::string FLAMP_tx_dir; extern std::string xmlfname; extern std::string scDevice[2]; extern PTT *push2talk; #if USE_HAMLIB extern Rig *xcvr; #endif extern cLogfile *Maillogfile; extern cLogfile *logfile; extern bool gmfskmail; extern bool arqmode; extern std::string ArqFilename; extern bool mailclient; extern bool mailserver; extern bool tlfio; extern bool arq_text_available; extern int arq_get_char(); // ARQ mail implementation extern void arq_init(); extern void arq_close(); extern void arq_restart(); extern void WriteARQ(unsigned char); extern void checkTLF(); void check_nbems_dirs(void); void check_data_dir(void); extern bool nbems_dirs_checked; // This inits or reinits everything related to KML: Reloads params etc... void kml_init(bool load_files = false); // close down remaining threads just before exiting UI extern void exit_process(); int directory_is_created( const char * strdir ); // autostart an external program extern void start_process(std::string executable); #endif fldigi-4.2.05/src/include/status.h0000664000175000017500000001522514611711171013676 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _status_H #define _status_H #ifndef BUILD_FLARQ #include #include "globals.h" #include "squelch_status.h" struct status { trx_mode lastmode; std::string mode_name; int mainX; int mainY; int mainW; int mainH; bool WF_UI; bool NO_RIGLOG; bool Rig_Log_UI; bool Rig_Contest_UI; bool DOCKEDSCOPE; bool tbar_is_docked; // int RxTextHeight; int tiled_group_x; bool show_channels; int rigX; int rigY; int rigW; int rigH; int carrier; unsigned long long noCATfreq; std::string noCATmode; std::string noCATwidth; int mag; int offset; int speed; double reflevel; int int_reflevel; double ampspan; int int_ampspan; unsigned int VIEWERxpos; unsigned int VIEWERypos; unsigned int VIEWERwidth; unsigned int VIEWERheight; double VIEWER_psksquelch; int int_VIEWER_psksquelch; double VIEWER_rttysquelch; int int_VIEWER_rttysquelch; double VIEWER_cwsquelch; int int_VIEWER_cwsquelch; bool VIEWERvisible; unsigned int fsqMONITORxpos; unsigned int fsqMONITORypos; unsigned int fsqMONITORwidth; unsigned int fsqMONITORheight; int tile_x; int tile_w; int tile_y; int tile_h; double tile_y_ratio; double fsq_ratio; double ifkp_ratio; int int_tile_y_ratio; int int_fsq_ratio; int int_ifkp_ratio; bool LOGenabled; double sldrSquelchValue; int int_sldrSquelchValue; double sldrPwrSquelchValue; int int_sldrPwrSquelchValue; bool afconoff; bool sqlonoff; bool reverse; double txlevel; int scopeX; int scopeY; bool scopeVisible; int scopeW; int scopeH; int svX; // spectrum viewer X, Y, W, H int svY; int svW; int svH; bool x_graticule; bool y_graticule; bool xy_graticule; int repeatMacro; float repeatIdleTime; int timer; int timerMacro; bool skip_sked_macro; std::string LastMacroFile; std::string default_frequencies_filename; int n_rsids; bool spot_recv; bool spot_log; bool contest; bool quick_entry; bool rx_scroll_hints; bool rx_word_wrap; bool tx_word_wrap; bool cluster_connected; int logbook_x; int logbook_y; int logbook_w; int logbook_h; bool logbook_reverse; int logbook_col_0; int logbook_col_1; int logbook_col_2; int logbook_col_3; int logbook_col_4; int logbook_col_5; int dxdialog_x; int dxdialog_y; int dxdialog_w; int dxdialog_h; // Contestia, Olivia, RTTY state values int contestiatones; int contestiabw; int contestiamargin; int contestiainteg; bool contestia8bit; int oliviatones; int oliviabw; int oliviamargin; int oliviainteg; bool olivia8bit; int rtty_shift; int rtty_custom_shift; int rtty_baud; int rtty_bits; int rtty_parity; int rtty_stop; bool rtty_reverse; bool rtty_crcrlf; bool rtty_autocrlf; int rtty_autocount; int rtty_afcspeed; bool rtty_filter_changed; bool PreferXhairScope; bool shaped_rtty; bool UOSrx; bool UOStx; // end Contestia, Olivia, RTTY state values std::string xmlrpc_address; std::string xmlrpc_port; std::string arq_address; std::string arq_port; std::string kiss_address; std::string kiss_io_port; std::string kiss_out_port; int kiss_dual_port_enabled; int data_io_enabled; bool ax25_decode_enabled; bool enableBusyChannel; int busyChannelSeconds; int kpsql_attenuation; bool csma_enabled; bool kiss_tcp_io; bool kiss_tcp_listen; bool kpsql_enabled; int csma_persistance; int csma_slot_time; int csma_transmit_delay; int psm_flush_buffer_timeout; int psm_minimum_bandwidth; int psm_minimum_bandwidth_margin; bool psm_use_histogram; int psm_histogram_offset_threshold; int psm_hit_time_window; int tx_buffer_timeout; bool kiss_io_modem_change_inhibit; bool ip_lock; double squelch_value; int int_squelch_value; bool psk8DCDShortFlag; std::string browser_search; bool meters; bool fsq_rx_abort; bool ifkp_rx_abort; //---------------------------------------------------------------------- // winkeyer status values //---------------------------------------------------------------------- std::string WK_serial_port_name; int WK_comm_baudrate; int WK_stopbits; int WK_comm_retries; int WK_comm_wait; int WK_comm_timeout; bool WK_comm_echo; // wkeyer values unsigned char WK_mode_register; unsigned char WK_speed_wpm; unsigned char WK_sidetone; unsigned char WK_weight; unsigned char WK_lead_in_time; unsigned char WK_tail_time; unsigned char WK_min_wpm; unsigned char WK_rng_wpm; unsigned char WK_first_extension; unsigned char WK_key_compensation; unsigned char WK_farnsworth_wpm; unsigned char WK_paddle_setpoint; unsigned char WK_dit_dah_ratio; unsigned char WK_pin_configuration; unsigned char WK_dont_care; bool WK_cut_zeronine; unsigned char WK_cmd_wpm; bool WK_use_pot; bool WK_online; int WK_version; int WKFSK_mode; // 0 = cw, 1 = fsk/cw int WKFSK_baud; int WKFSK_stopbits; int WKFSK_ptt; int WKFSK_polarity; int WKFSK_sidetone; int WKFSK_auto_crlf; int WKFSK_diddle; int WKFSK_diddle_char; int WKFSK_usos; int WKFSK_monitor; bool Nav_online; bool Nav_config_online; bool nanoCW_online; bool nanoFSK_online; bool useCW_KEYLINE; //---------------------------------------------------------------------- // FMT saved controls double FMT_ref_freq; int int_FMT_ref_freq; double FMT_unk_freq; int int_FMT_unk_freq; int FMT_rec_interval; int FMT_trk_scale; int FMT_minutes; //---------------------------------------------------------------------- int debug_mask; int debug_level; //---------------------------------------------------------------------- int vumeter_shown; //---------------------------------------------------------------------- bool bLastStateRead; void initLastState(); void saveLastState(); void loadLastState(); }; extern status progStatus; #endif // BUILD_FLARQ #endif fldigi-4.2.05/src/include/wefax_map.h0000664000175000017500000000606714611711171014326 00000000000000// ---------------------------------------------------------------------------- // wefax_map.h // // Copyright (C) 2006-2017 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef wefax_map_H #define wefax_map_H #include #include #include class wefax_map : public Fl_Widget { private: unsigned char *vidbuf; int bufsize; int width; int height; int numcol; int slantdir; void slant_corr(int x, int y); void slant_undo(); int zoom ; int background ; bool binary ; unsigned char binary_threshold ; inline unsigned char pix2bin( unsigned char x ) const { return x < binary_threshold ? 0 : 255 ; } static void draw_cb(void *data, int x, int y, int w, uchar *buf); void resize_zoom(int, int, int, int); public: wefax_map(int, int, int, int, int bg_col = 0); ~wefax_map(); void video(unsigned char const *, int); void pixel(unsigned char data, int pos) { if (pos < 0 || pos >= bufsize) { return ; } vidbuf[pos] = data; if (pos % (width * depth) == 0) redraw(); } unsigned char pixel(int); int handle(int); void draw(); void clear(); void image(Fl_Image *img) {Fl_Widget::image(img);} void resize(int, int, int, int); void resize_height(int new_height, bool clear_img); void shift_horizontal_center(int hShift); void stretch(double the_ratio); int save_png(const char * filename, const char * extra_comments = NULL); void set_zoom(int the_zoom); void set_binary(bool bin_mode) { binary = bin_mode ;} int pix_width(void) const { return width ; } int pix_height(void) const { return height ; } const unsigned char * buffer(void) const { return vidbuf; } /// Sometimes the row number goes back of one due to rounding error. /// If this happens, noise removal does not work. static const int noise_height_margin = 5 ; void remove_noise( int row, int half_len, int noise_margin ); static const int depth = 3; private: bool restore( int row, int margin ); public: void erosion( int row ); void set_binary_threshold(unsigned char thres) { binary_threshold = thres ; } unsigned char get_binary_threshold() const { return binary_threshold ; } }; class wefax_picbox : public Fl_Box { public: wefax_picbox(int x, int y, int w, int h, const char* l = 0) : Fl_Box(x, y, w, h, l) { } int handle(int event); }; #endif fldigi-4.2.05/src/include/filters.h0000664000175000017500000001066214611711171014023 00000000000000// ---------------------------------------------------------------------------- // // filters.h -- Several Digital Filter classes used in fldigi // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters are based on the // gmfsk design and the design notes given in // "Digital Signal Processing", A Practical Guid for Engineers and Scientists // by Steven W. Smith. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FILTER_H #define _FILTER_H #include "complex.h" #ifndef M_PI #define M_PI (3.1415926535897932385) #endif //===================================================================== // FIR filters //===================================================================== class C_FIR_filter { #define FIRBufferLen 4096 private: int length; int decimateratio; double *ifilter; double *qfilter; double ffreq; double ibuffer[FIRBufferLen]; double qbuffer[FIRBufferLen]; int pointer; int counter; cmplx fu; inline double sinc(double x) { if (fabs(x) < 1e-10) return 1.0; else return sin(M_PI * x) / (M_PI * x); } inline double cosc(double x) { if (fabs(x) < 1e-10) return 0.0; else return (1.0 - cos(M_PI * x)) / (M_PI * x); } inline double hamming(double x) { return 0.54 - 0.46 * cos(2 * M_PI * x); } inline double mac(const double *a, const double *b, unsigned int size) { double sum = 0.0; double sum2 = 0.0; double sum3 = 0.0; double sum4 = 0.0; // Reduces read-after-write dependencies : Each subsum does not wait for the others. // The CPU can therefore schedule each line independently. for (; size > 3; size -= 4, a += 4, b+=4) { sum += a[0] * b[0]; sum2 += a[1] * b[1]; sum3 += a[2] * b[2]; sum4 += a[3] * b[3]; } for (; size; --size) sum += (*a++) * (*b++); return sum + sum2 + sum3 + sum4 ; } protected: public: C_FIR_filter (); ~C_FIR_filter (); void init (int len, int dec, double *ifil, double *qfil); void init_lowpass (int len, int dec, double freq ); void init_bandpass (int len, int dec, double freq1, double freq2); void init_hilbert (int len, int dec); double *bp_FIR(int len, int hilbert, double f1, double f2); void clear(); int run (const cmplx &in, cmplx &out); int Irun (const double &in, double &out); int Qrun (const double &in, double &out); }; //===================================================================== // Moving average filter //===================================================================== class Cmovavg { #define MAXMOVAVG 2048 private: double *in; double out; int len, pint; bool empty; public: Cmovavg(int filtlen = 64); ~Cmovavg(); double run(double a); void setLength(int filtlen); void reset(); double value() { return out / (len > 0 ? len : 1); } }; //===================================================================== // Sliding FFT //===================================================================== class sfft { #define K1 0.99999999999L private: int fftlen; int first; int last; int ptr; struct vrot_bins_pair ; vrot_bins_pair * __restrict__ vrot_bins ; cmplx * __restrict__ delay; double k2; int count; public: sfft(int len, int first, int last); ~sfft(); bool is_stable(); void reset(); void run(const cmplx& input, cmplx * __restrict__ result, int stride ); }; //============================================================================= // Goertzel DFT //============================================================================= class goertzel { private: int N; int count; double Q0; double Q1; double Q2; double k1; double k2; double k3; public: goertzel(int n, double freq, double sr); ~goertzel(); void reset(); void reset(int n, double freq, double sr); bool run(double v); double real(); double imag(); double mag(); }; #endif /* _FILTER_H */ fldigi-4.2.05/src/include/pskrep.h0000664000175000017500000000262414532252172013661 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef PSKREP_H_ #define PSKREP_H_ bool pskrep_start(void); void pskrep_stop(); const char* pskrep_error(void); unsigned pskrep_count(void); // The regular expression that matches the spotter's buffer when it calls us. // It must define at least two capturing groups, the second of which is the // spotted callsign. #define CALLSIGN_RE "[[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+" #define PSKREP_RE "(de|cq|qrz)[^[:alnum:]/\n]+" "(" CALLSIGN_RE ")" " +(.* +)?\\2[^[:alnum:]]+$" #define PSKREP_RE_INDEX 2 #endif // PSKREP_H_ fldigi-4.2.05/src/include/pskeval.h0000664000175000017500000000264514611711171014022 00000000000000// ---------------------------------------------------------------------------- // pskeval.cxx -- psk signal evaluator // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _PSKEVAL_H #define _PSKEVAL_H #include "complex.h" #include "filters.h" #include "waterfall.h" #define FLOWER 200 #define FUPPER 4000 class pskeval { private: double sigpwr[WF_FFTLEN]; double sigmin; double bw; public: pskeval(); ~pskeval(); void clear(); void setbw(double w) { bw = w;} void sigdensity(); double sigpeak(int &f, int f1, int f2); double peak(int &f, int f1, int f2, double level); double power(int f1, int f2); }; #endif fldigi-4.2.05/src/include/benchmark.h0000664000175000017500000000237414532252172014311 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef BENCHMARK_H_ #define BENCHMARK_H_ #include #include #include "globals.h" struct benchmark_params { trx_mode modem; int freq; bool afc, sql; double sqlevel; double src_ratio; int src_type; std::string input, output, buffer; size_t samples; }; extern struct benchmark_params benchmark; int setup_benchmark(void); void do_benchmark(void); #endif fldigi-4.2.05/src/include/sound.h0000664000175000017500000002336514611711171013507 00000000000000// ---------------------------------------------------------------------------- // // sound.h // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _SOUND_H #define _SOUND_H #include #include #include #include # include #include #define SCBLOCKSIZE 512 class SndException : public std::exception { public: SndException(int err_ = 0) : err(err_), msg(std::string("Sound error: ") + err_to_str(err_)) { } SndException(const char* msg_) : err(1), msg(msg_) { } SndException(int err_, const std::string& msg_) : err(err_), msg(msg_) { } virtual ~SndException() throw() { } const char* what(void) const throw() { return msg.c_str(); } int error(void) const { return err; } protected: const char* err_to_str(int e) { return strerror(e); } int err; std::string msg; }; class SoundBase { protected: int sample_frequency; int txppm; int rxppm; // for interface to the samplerate resampling library SRC_STATE *tx_src_state; SRC_STATE *rx_src_state; double *wrt_buffer; SNDFILE* ofCapture; SNDFILE* ifPlayback; SNDFILE* ofGenerate; // 2 channel writes SRC_STATE *writ_src_state_left; SRC_STATE *writ_src_state_right; SRC_DATA *writ_src_data_left; SRC_DATA *writ_src_data_right; float *src_write_buffer_left; float *src_write_buffer_right; // 1 channel reads SRC_STATE *play_src_state; SRC_DATA *play_src_data; float *src_rd_out_buffer; float *src_rd_inp_buffer; float *out_pointer; double req_sample_rate; SF_INFO play_info; float modem_wr_sr; float modem_play_sr; bool new_playback; sf_count_t read_file(SNDFILE* file, float* buf, size_t count); void write_file(SNDFILE* file, float* buf_left, float *buf_right, size_t count); void write_file(SNDFILE* file, double* buf_left, double *buf_right, size_t count); public: SoundBase(); virtual ~SoundBase(); virtual int Open(int mode, int freq = 8000) = 0; virtual void Close(unsigned dir = UINT_MAX) = 0; virtual void Abort(unsigned dir = UINT_MAX) = 0; virtual size_t Write(double *, size_t) = 0; virtual size_t Write_stereo(double *, double *, size_t) = 0; virtual size_t resample_write(float *buf, size_t count) = 0; virtual size_t Read(float *, size_t) = 0; virtual void flush(unsigned dir = UINT_MAX) = 0; virtual bool must_close(int dir = 0) = 0; int startCapture(std::string fname, int format); void stopCapture(); int startPlayback(std::string fname, int format); void stopPlayback(); int startGenerate(std::string fname, int format); void stopGenerate(); int AudioMP3(std::string fname); int AudioWAV(std::string fname); int Audio(std::string fname); }; #if USE_OSS class SoundOSS : public SoundBase { private: std::string device; int device_fd; int version; int capability_mask; int format_mask; int channels; int play_format; int mode; bool formatok; unsigned char *cbuff; SRC_DATA *rx_src_data; SRC_DATA *tx_src_data; float *snd_buffer; float *src_buffer; void getVersion(); void getCapabilities(); void getFormats(); void setfragsize(); void Channels(int); void Frequency(int); void Format(int); int BufferSize(int); bool wait_till_finished(); bool reset_device(); public: SoundOSS(const char *dev = "/dev/dsp"); ~SoundOSS(); int Open(int mode, int freq = 8000); void Close(unsigned dir = UINT_MAX); void Abort(unsigned dir = UINT_MAX) { Close(dir); } size_t Write(double *, size_t); size_t Write_stereo(double *, double *, size_t); size_t resample_write(float *buf, size_t count); size_t Read(float *, size_t); bool must_close(int dir = 0) { return true; } void flush(unsigned dir = UINT_MAX) { wait_till_finished(); } private: int Fd() { return device_fd; } int Frequency() { return sample_frequency;}; int Version() {return version;}; int Capabilities() {return capability_mask;}; int Formats() { return format_mask;}; int Channels() { return channels;}; int Format() { return play_format;}; bool FormatOK() { return formatok;}; }; #endif // USE_OSS #if USE_PORTAUDIO # include # include # include # include # include "ringbuffer.h" class SoundPort : public SoundBase { public: typedef std::vector::const_iterator device_iterator; static void initialize(void); static void terminate(void); static const std::vector& devices(void); static void devices_info(std::string& in, std::string& out); static const std::vector& get_supported_rates(const std::string& name, unsigned dir); public: SoundPort(const char *in_dev, const char *out_dev); ~SoundPort(); int Open(int mode, int freq = 8000); void Close(unsigned dir = UINT_MAX); void Abort(unsigned dir = UINT_MAX); size_t Write(double *buf, size_t count); size_t Write_stereo(double *bufleft, double *bufright, size_t count); size_t Read(float *buf, size_t count); bool must_close(int dir = 0); void flush(unsigned dir = UINT_MAX); private: void src_data_reset(unsigned dir); static long src_read_cb(void* arg, float** data); size_t resample_write(float* buf, size_t count); device_iterator name_to_device(std::string& name, unsigned dir); void init_stream(unsigned dir); void start_stream(unsigned dir); void pause_stream(unsigned dir); bool stream_active(unsigned dir); bool full_duplex_device(const PaDeviceInfo* dev); double find_srate(unsigned dir); static void probe_supported_rates(const device_iterator& idev); void pa_perror(int err, const char* str = 0); static void init_hostapi_ext(void); static PaStreamCallback stream_process; static PaStreamFinishedCallback stream_stopped; private: static bool pa_init; static std::vector devs; float* fbuf; float* src_buffer; SRC_DATA *tx_src_data; enum { spa_continue = paContinue, spa_complete = paComplete, spa_abort = paAbort, spa_drain, spa_pause }; struct stream_data { std::string device; device_iterator idev; PaStream* stream; PaStreamParameters params; unsigned frames_per_buffer; double dev_sample_rate; double src_ratio; sem_t* rwsem; pthread_mutex_t* cmutex; pthread_cond_t* ccond; int state; ringbuffer* rb; size_t blocksize; size_t advance; } sd[2]; }; class SndPortException : public SndException { public: SndPortException(int err_ = 0) : SndException(err_, std::string("PortAudio error: ") + err_to_str(err_)) { } SndPortException(const char* msg_) : SndException(msg_) { } protected: const char* err_to_str(int e) { return Pa_GetErrorText(e); } }; #endif // USE_PORTAUDIO #if USE_PULSEAUDIO # include # include extern "C" { const char* pa_get_library_version(void); }; class SoundPulse : public SoundBase { public: SoundPulse(const char* dev); virtual ~SoundPulse(); int Open(int mode, int freq = 8000); void Close(unsigned dir = UINT_MAX); void Abort(unsigned dir = UINT_MAX); size_t Write(double* buf, size_t count); size_t Write_stereo(double* bufleft, double* bufright, size_t count); size_t Read(float *buf, size_t count); bool must_close(int dir = 0) { return false; } void flush(unsigned dir = UINT_MAX); private: void src_data_reset(int mode); static long src_read_cb(void* arg, float** data); size_t resample_write(float* buf, size_t count); private: struct stream_data { pa_simple* stream; pa_sample_spec stream_params; pa_buffer_attr buffer_attrs; pa_stream_direction_t dir; double src_ratio; size_t blocksize; } sd[2]; SRC_DATA* tx_src_data; float* fbuf; float* rbuf; float* snd_buffer; float* src_buffer; }; class SndPulseException : public SndException { public: SndPulseException(int err_ = 0) : SndException(err_, std::string("PulseAudio error: ") + err_to_str(err_)) { } SndPulseException(const char* msg_) : SndException(msg_) { } protected: const char* err_to_str(int e) { return pa_strerror(e); } }; #endif // USE_PULSEAUDIO class SoundNull : public SoundBase { public: int Open(int mode, int freq = 44100) { sample_frequency = freq; return 0; } void Close(unsigned) { } void Abort(unsigned) { } size_t Write(double* buf, size_t count); size_t Write_stereo(double* bufleft, double* bufright, size_t count); size_t Read(float *buf, size_t count); size_t resample_write(float* buf, size_t count){return 0;}; bool must_close(int dir = 0) { return false; } void flush(unsigned); }; namespace SND_SUPPORT { bool format_supported(int format); void get_file_params(std::string def_fname, std::string &fname, int &format, bool check); void tag_file(SNDFILE *sndfile, const char *title); }; #endif // SOUND_H fldigi-4.2.05/src/include/feld.h0000664000175000017500000000477414611711171013274 00000000000000// ---------------------------------------------------------------------------- // feld.h -- FELDHELL modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _FELD_H #define _FELD_H #include "modem.h" #include "filters.h" #include "fftfilt.h" #include "mbuffer.h" #define FeldSampleRate 8000 #define FeldMaxSymLen 1024 #define MAXLEN 512 #define FELD_COLUMN_LEN 14 #define MAX_RX_COLUMN_LEN 42 class feld : public modem { enum FELD_STATE {PREAMBLE, POSTAMBLE, DATA}; protected: int RxColumnLen; int TxColumnLen; //rx double rxphacc; double rxdelta; double rxcounter; double agc; double peakval; double peakhold; double rxpixrate; double txpixrate; double downsampleinc; double upsampleinc; double phi2freq; C_FIR_filter *hilbert; fftfilt *lpfilt; Cmovavg *bbfilt; Cmovavg *average; //tx FELD_STATE tx_state; double txphacc; double txcounter; double hell_bandwidth; double filter_bandwidth; int depth; double feldcolumnrate; int hardkeying; int preamble; int postamble; int prevsymb; cmplx prev; double OnShape[MAXLEN]; double OffShape[MAXLEN]; mbuffer col_data; int col_pointer; int fntnbr; cmplx mixer(cmplx); double nco(double); void rx(cmplx); void FSKH_rx(cmplx); void send_symbol(int currsymbol, int nextsymbol); void send_null_column(); void tx_char(char); void initKeyWaveform(); public: feld(trx_mode); ~feld(); void init(); void rx_init(); void tx_init(); void restart(); int rx_process(const double *buf, int len); int tx_process(); int get_font_data(unsigned char c, int col); }; #endif fldigi-4.2.05/src/include/plot_xy.h0000664000175000017500000000671314611711171014053 00000000000000// --------------------------------------------------------------------- // plot_xy.h // // Copyright (C) 2019 // David Freese, W1HKJ // // This is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // --------------------------------------------------------------------- #ifndef plot_xy_H #define plot_xy_H #include #include #include #include "threads.h" struct PLOT_XY {double x; double y;}; class plot_xy : public Fl_Widget { public: #define PLOT_XY_DEFAULT_WIDTH 100 #define PLOT_XY_DEFAULT_HEIGHT 100 #define PLOT_XY_MAX_LEN 8192 #define PLOT_XY_NUM_GRIDS 100 private: PLOT_XY *buf_1; PLOT_XY *buf_2; int _len_1; int _len_2; int linecnt; bool xreverse; bool x_legend; bool y_legend; std::string sx_legend; std::string sy_legend; bool _show_1; bool _show_2; bool _thick_lines; bool _plot_over_axis; protected: double xmin, xmax; double ymin, ymax; double x_graticule; double y_graticule; Fl_Color _bk_color; Fl_Color _axis_color; Fl_Color _color_1; Fl_Color _color_2; Fl_Color _legend_color; public: plot_xy(int, int, int, int, const char *); ~plot_xy(); int handle(int); void resize(int x, int y, int w, int h); void draw(); void data_1 (PLOT_XY *data_1, int len_1); void data_2 (PLOT_XY *data_2, int len_2); void x_scale( double _xmin, double _xmax, double _x_graticule) { xmin = _xmin; xmax = _xmax; x_graticule = _x_graticule; } void get_x_scale( double &_xmin, double &_xmax, double &_x_graticule) { _xmin = xmin; _xmax = xmax; _x_graticule = x_graticule; } void y_scale( double _ymin, double _ymax, double _y_graticule) { ymin = _ymin; ymax = _ymax; y_graticule = _y_graticule; } void get_y_scale( double _ymin, double _ymax, double _y_graticule) { _ymin = ymin; _ymax = ymax; _y_graticule = y_graticule; } void draw_x_legend(bool on = true) { x_legend = on; } void draw_y_legend(bool on = true) { y_legend = on; } void legends(bool on = true) { x_legend = on; y_legend = on; } void set_x_legend(std::string legend) { sx_legend = legend; } void set_y_legend(std::string legend) { sy_legend = legend; } void bk_color(Fl_Color c) { _bk_color = c; } Fl_Color bk_color() { return _bk_color; } void axis_color(Fl_Color c) { _axis_color = c; } Fl_Color axis_color() { return _axis_color; } void line_color_1(Fl_Color c) { _color_1 = c; } Fl_Color line_color_1() { return _color_1; } void line_color_2(Fl_Color c) { _color_2 = c; } Fl_Color line_color() { return _color_2; } void legend_color(Fl_Color c) { _legend_color = c; } Fl_Color legend_color() { return _legend_color; } void reverse_x(bool val) { xreverse = val; } void show_1(bool on) { _show_1 = on; } bool show_1() { return _show_1; } void show_2(bool on) { _show_2 = on; } bool show_2() { return _show_2; } void thick_lines(bool yes) { _thick_lines = yes; }; void plot_over_axis(bool yes) { _plot_over_axis = yes; }; }; #endif fldigi-4.2.05/src/include/charsetlist.h0000664000175000017500000000212114532252172014672 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef CHARSETLIST_H #define CHARSETLIST_H struct charset_info { const char *name; int tiniconv_id; }; extern const struct charset_info charset_list[]; extern const unsigned int number_of_charsets; #endif fldigi-4.2.05/src/include/mfskvaricode.h0000664000175000017500000000213114532252172015023 00000000000000// ---------------------------------------------------------------------------- // mfskvaricode.h -- MFSK Varicode // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _MFSKVARICODE_H #define _MFSKVARICODE_H extern const char *varienc(int c); extern int varidec(unsigned int symbol); #endif fldigi-4.2.05/src/include/ptt.h0000664000175000017500000000506214611711171013160 00000000000000// ---------------------------------------------------------------------------- // // ptt.h -- PTT control // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef PTT_H_ #define PTT_H_ #include #if HAVE_LINUX_PPDEV_H || HAVE_DEV_PPBUS_PPI_H # define HAVE_PARPORT 1 #else # define HAVE_PARPORT 0 #endif #ifdef __APPLE__ # define HAVE_UHROUTER 1 # define UHROUTER_FIFO_PREFIX "/tmp/microHamRouter" #else # define HAVE_UHROUTER 0 #endif #if HAVE_TERMIOS_H # define HAVE_TTYPORT 1 #else # define HAVE_TTYPORT 0 #endif struct termios; //#ifdef __MINGW32__ # include "serial.h" //#endif class PTT { public: // The ptt_t enums must be defined even if the corresponding // code is not compiled. New tags go to the end of the list. enum ptt_t { PTT_INVALID = -1, PTT_NONE, PTT_HAMLIB, PTT_RIGCAT, PTT_TTY, PTT_PARPORT, PTT_UHROUTER, PTT_GPIO, PTT_CMEDIA }; PTT(ptt_t dev = PTT_NONE); ~PTT(); void set(bool on); void reset(ptt_t dev); Cserial serPort; private: ptt_t pttdev; // tty and parport int pttfd; struct termios* oldtio; #if HAVE_UHROUTER // uhrouter int uhkfd[2]; // keyer int uhfd[2]; // ptt #endif void close_all(void); void open_tty(void); void set_tty(bool ptt); void close_tty(void); void open_gpio(void); void set_gpio(bool ptt); void close_gpio(void); #if HAVE_PARPORT void open_parport(void); void set_parport(bool ptt); void close_parport(void); #endif #if HAVE_UHROUTER void open_uhrouter(void); void set_uhrouter(bool ptt); void close_uhrouter(void); #endif }; #endif // PTT_H_ fldigi-4.2.05/src/include/misc.h0000664000175000017500000001044214611711171013302 00000000000000// ---------------------------------------------------------------------------- // misc.h -- Miscellaneous helper functions // // Copyright (C) 2006-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters were adapted from code contained // in the gmfsk source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _MISC_H #define _MISC_H #include extern unsigned long hweight32(unsigned long w); extern unsigned short int hweight16(unsigned short int w); extern unsigned char hweight8(unsigned char w); extern int parity(unsigned long w); extern unsigned long rbits32(unsigned long w); extern unsigned short int rbits16(unsigned short int w); extern unsigned char rbits8(unsigned char w); extern unsigned int log2u(unsigned int x); extern unsigned char graydecode(unsigned char data); extern unsigned char grayencode(unsigned char data); extern void MilliSleep(long msecs); inline double sinc(double x) { return (fabs(x) < 1e-10) ? 1.0 : (sin(M_PI * x) / (M_PI * x)); } inline double cosc(double x) { return (fabs(x) < 1e-10) ? 0.0 : ((1.0 - cos(M_PI * x)) / (M_PI * x)); } inline double clamp(double x, double min, double max) { return (x < min) ? min : ((x > max) ? max : x); } /// This is always called with an int weight inline double decayavg(double average, double input, int weight) { if (weight <= 1) return input; return ( ( input - average ) / (double)weight ) + average ; } // following are defined inline to provide best performance inline double blackman(double x) { return (0.42 - 0.50 * cos(2 * M_PI * x) + 0.08 * cos(4 * M_PI * x)); } inline double hamming(double x) { return 0.54 - 0.46 * cos(2 * M_PI * x); } inline double hanning(double x) { return 0.5 - 0.5 * cos(2 * M_PI * x); } inline double rcos( double t, double T, double alpha=1.0 ) { if( t == 0 ) return 1.0; double taT = T / (2.0 * alpha); if( fabs(t) == taT ) return ((alpha/2.0) * sin(M_PI/(2.0*alpha))); return (sin(M_PI*t/T)/(M_PI*t/T))*cos(alpha*M_PI*t/T)/(1.0-(t/taT)*(t/taT)); } // ---------------------------------------------------------------------------- // Rectangular - no pre filtering of data array template void RectWindow(X *array, int n) { for (int i = 0; i < n; i++) array[i] = 1.0; } // Hamming - used by gmfsk template void HammingWindow(X *array, int n) { double pwr = 0.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n; i++) { array[i] = hamming((double)i * inv_n); pwr += array[i] * array[i]; } pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } // Hanning - used by winpsk template void HanningWindow(X *array, int n) { double pwr = 0.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n; i++) { array[i] = hanning((double)i * inv_n); pwr += array[i] * array[i]; } pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } // Best lob suppression - least in band ripple template void BlackmanWindow(X *array, int n) { double pwr = 0.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n; i++) { array[i] = blackman((double)i * inv_n); pwr += array[i] * array[i]; } pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } // Simple about effective as Hamming or Hanning template void TriangularWindow(X *array, int n) { double pwr = 0.0; for (int i = 0; i < n; i++) array[i] = 1.0; double inv_n = 1.0 / (double)n; for (int i = 0; i < n / 4; i++) { array[i] = 4.0 * (double)i * inv_n ; array[n-i] = array[i]; } for (int i = 0; i < n; i++) pwr += array[i] * array[i]; pwr = sqrt((double)n/pwr); for (int i = 0; i < n; i++) array[i] *= pwr; } #endif fldigi-4.2.05/src/include/kmlserver.h0000664000175000017500000000672314532252172014373 00000000000000// ---------------------------------------------------------------------------- // kmlserver.h -- KML Server // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _KMLSERVER_H #define _KMLSERVER_H #include #include #include #include #include /// Keyhole Markup Language: This publishes a complete message, localisation+time+weather etc... class KmlServer { protected: /// Counts the number of complete messages written. int m_nb_broadcasts ; int exit_kml_server; int request_broadcast; public: /// List of key-value pairs displayed for example in Google Earth balloons. struct CustomDataT : public std::vector< std::pair< std::string, std::string > > { /// Also used when reloading a KML file. void Push( const char * k, const std::string & v ); /// TODO: Most of keys are duplicated. Should store them in a hash to reduce memory footprint. void Push( const char * k, const char * v ) { Push( k, std::string(v) ); } /// This helper makes insertions simpler. template< class Type > void Push( const char * k, const Type & v ) { std::stringstream strm ; strm << v ; Push( k, strm.str() ); } }; KmlServer() : m_nb_broadcasts(0), exit_kml_server(0), request_broadcast(0) {} virtual ~KmlServer() {} /// BEWARE: Will work until 2038. static const time_t UniqueEvent = INT_MAX ; /// This can for example go to a NMEA client. virtual void Broadcast( const std::string & category, time_t evtTim, const CoordinateT::Pair & refCoo, double altitude, const std::string & kml_name, const std::string & styleNam, const std::string & descrTxt, const CustomDataT & custDat ) = 0; /// Singleton. static KmlServer * GetInstance(void); /// Number of calls to Broadcast(). Debugging purpose only. int NbBroadcasts(void) const { return m_nb_broadcasts; } /// Debugging only, just to check what happens inside. void ResetCounter() { m_nb_broadcasts = 0;} virtual void Reset() = 0; /// TODO: Maybe have one display style per category, instead of the same for all. virtual void InitParams( const std::string & kml_command, const std::string & kml_dir, double kml_merge = 10000, int kml_retention = 0, // Keep all data. int kml_refresh = 120, int kml_balloon_style = 0) = 0; virtual void ReloadKmlFiles() = 0; /// Creates the process for the command to be run when KML data is saved. static void SpawnProcess(); /// Stops the sub-thread, flush KML data to the files. static void Exit(); static std::string Tm2Time( time_t tim ); /// No value means, now. static std::string Tm2Time(void); }; #endif // _KMLSERVER_H fldigi-4.2.05/src/include/rigsupport.h0000664000175000017500000000657314611711171014577 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RIG_SUPPORT_H #define RIG_SUPPORT_H #include #include #include "serial.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "xmlrpcpp/XmlRpc.h" #include "xmlrpcpp/XmlRpcValue.h" #define DEFAULT_RIGXML_FILENAME "rig-not-assigned.xml" extern std::string windowTitle; extern Cserial rigio; extern void initOptionMenus(); extern void clearList(); extern void updateSelect(); extern size_t addtoList(long val); extern void build_frequencies2_list(); extern void qso_movFreq(Fl_Widget* w, void*); extern int cb_qso_opMODE(); extern int cb_qso_opBW(); extern int cb_qso_btnBW1(); extern int cb_qso_opBW1(); extern int cb_qso_btnBW2(); extern int cb_qso_opBW2(); extern void qso_setMode(); extern void setTitle(); extern int fwidths[]; extern void sendFreq(unsigned long long f); extern void qso_addFreq(); extern void qso_delFreq(); extern void qso_selectFreq(); extern void qso_selectFreq(unsigned long long rfcarrier, int carrier); extern void qso_setFreq(); extern void qso_setFreq(unsigned long long f); extern void qso_clearList(); extern void qso_updateEntry(int i, std::string usage); extern bool readRigXML(); extern bool init_Xml_RigDialog(); extern bool init_NoRig_RigDialog(); extern bool ModeIsLSB(std::string); #if USE_HAMLIB extern bool init_Hamlib_RigDialog(); extern void selMode(rmode_t m); extern std::string modeString(rmode_t m); extern bool hamlib_USB(); extern bool hamlib_active(); #endif // xmlrpc_rig specific extern bool connected_to_flrig; extern void xmlrpc_rig_set_qsy(unsigned long long rfc); extern bool xmlrpc_USB(); extern void xmlrpc_send_command(std::string cmd); extern void xmlrpc_priority(std::string cmd); extern void xmlrpc_shutdown_flrig(); extern void FLRIG_set_flrig_ab(int n); extern void FLRIG_start_flrig_thread(); extern void stop_flrig_thread(); extern void reconnect_to_flrig(); extern void set_flrig_ptt(int on); extern void set_flrig_freq(unsigned long long fr); extern void set_flrig_mode(const char *md); extern void set_flrig_bw(int bw1, int bw2 = 0); extern void set_flrig_notch(); extern void flrig_set_wpm(); extern void flrig_get_wpm(); //extern void flrig_cwio_ptt(int); extern void flrig_cwio_send_text(std::string); extern void flrig_fskio_send_text(std::string s); // GPIO export/unexport pin # extern void export_gpio(int); extern void unexport_gpio(int); extern bool readFreqList(bool bdef = false); extern void saveFreqList(bool bdef = false); //------------------------------------------------------------------------------ #endif fldigi-4.2.05/src/include/metar.h0000664000175000017500000000614514611711171013464 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2019 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef METAR_H #define METAR_H #include "network.h" class Metar { Url url; std::string _wx_text_full; std::string _wx_text_parsed; std::string _metar_station; std::string _metar_text; std::string _station_name; std::string _field; std::string _conditions; std::string _temp; std::string _winds; std::string _baro; bool _inches; bool _mbars; bool _fahrenheit; bool _celsius; bool _mph; bool _kph; bool _condx; bool _name; bool _wx_raw; bool _debug; public: Metar() { init(); } Metar(std::string _station) { init(); _metar_station = _station; } ~Metar() {} void init() { _metar_station.clear(); _metar_text.clear(); _wx_text_full.clear(); _wx_text_parsed.clear(); _station_name.clear(); _field.clear(); _conditions.clear(); _temp.clear(); _winds.clear(); _baro.clear(); _inches = _mbars = _fahrenheit = _celsius = _mph = _kph = _condx = _name = _wx_raw = true; _debug = false; } void parse(); int get(); int get(std::string station) { _metar_station = station; return get(); } void station(std::string s) { _metar_station = s; } std::string station() { return _metar_station; } std::string station_name() { return _station_name; } std::string full() { return _wx_text_full; } std::string parsed() { return _wx_text_parsed; } void params( bool inches, bool mbars, bool fahrenheit, bool celsius, bool mph, bool kph, bool condx, bool name, bool wx_raw) { _inches = inches; _mbars = mbars; _fahrenheit= fahrenheit; _celsius = celsius; _mph = mph; _kph = kph; _condx = condx; _name = name; _wx_raw = wx_raw; } void inches(bool b) { _inches = b; } bool inches() { return _inches; } void mbars(bool b) { _mbars = b; } bool mbars() { return _mbars; } void fahrenheit(bool b) { _fahrenheit = b; } bool fahrenheit() { return _fahrenheit; } void celsius(bool b) { _celsius = b; } bool celsius() { return _celsius; } void mph(bool b) { _mph = b; } bool mph() { return _mph; } void kph(bool b) { _kph = b; } bool kph() { return _kph; } void condx(bool b) { _condx = b; } bool condx() { return _condx; } void name(bool b) { _name = b; } bool name() { return _name; } void debug(bool on) { };//_debug = on; url.debug(on); } }; #endif //METAR_H fldigi-4.2.05/src/include/testsigs.h0000664000175000017500000000100514611711171014207 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #ifndef testsigs_h #define testsigs_h #include #include #include "flslider2.h" extern Fl_Counter2 *noiseDB; #include extern Fl_Check_Button *btnNoiseOn; #include extern Fl_Counter *ctrl_freq_offset; extern Fl_Check_Button *btnOffsetOn; extern Fl_Counter2 *xmtimd; extern Fl_Check_Button *btn_imd_on; #include Fl_Double_Window* make_testdialog(); #endif fldigi-4.2.05/src/include/re.h0000664000175000017500000000422314532252172012760 00000000000000// ---------------------------------------------------------------------------- // re.h // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RE_H_ #define RE_H_ #if HAVE_REGEX_H # include #else # include "compat/regex.h" #endif #include #include class re_t { public: re_t(const char* pattern_ = "", int cflags_ = 0); re_t(const re_t& re); ~re_t(); re_t& operator=(const re_t& rhs); void recompile(const char* pattern_); operator bool(void) const { return !error; } bool operator==(const re_t& o) const { return o.cflags == cflags && o.pattern == pattern; } bool match(const char* str, int eflags_ = 0); const std::string& submatch(size_t n) const; void suboff(size_t n, int* start, int* end) const; const std::vector& suboff(void) const { return suboffsets; } size_t nsub(void) const { return suboffsets.size(); } const std::string& re(void) const { return pattern; } int cf(void) const { return cflags; } size_t hash(void) const; protected: void compile(void); std::string pattern; int cflags, eflags; regex_t preg; std::vector suboffsets; std::vector substrings; bool error; bool need_substr; }; class fre_t : public re_t { public: fre_t(const char* pattern_, int cflags_ = 0); bool match(const char* str, int eflags_ = 0); }; #endif // RE_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/include/crc8.h0000664000175000017500000000117514532252172013214 00000000000000#ifndef __CRC8_H #define __CRC8_H #include #include #include #include class CRC8 { private: unsigned char val; unsigned char table[256]; char ss[3]; public: CRC8() { val = 0x00; unsigned char crc; for ( int i = 0; i < 256; i++) { crc = i; for (int j = 0; j < 8; j++) crc = (crc << 1) ^ ((crc & 0x80) ? 0x07 : 0); table[i] = crc & 0xFF; } } ~CRC8() {}; std::string sval(std::string s) { val = 0x00; for ( size_t i = 0; i < s.length(); i++ ) { val = table[(val) ^ s[i]]; val &= 0xFF; } snprintf(ss, sizeof(ss), "%02x", val); return ss; } }; #endif fldigi-4.2.05/src/include/data_io.h0000664000175000017500000000720214532252172013752 00000000000000// ---------------------------------------------------------------------------- // // data_io.h // // support for ARQ server/client system such as pskmail and fl_arq // support for KISS server/client system such as BPQ and JNOS // // Copyright (C) 2014 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef fldigi_data_io_h #define fldigi_data_io_h #include "gettext.h" #define IO_START_STR _("Start") #define IO_STOP_STR _("Stop") #define DEFAULT_ARQ_IP_ADDRESS "127.0.0.1" #define DEFAULT_ARQ_IP_PORT "7322" #define DEFAULT_KISS_IP_ADDRESS "127.0.0.1" #define DEFAULT_KISS_IP_IO_PORT "7342" #define DEFAULT_KISS_IP_OUT_PORT "7343" #define DEFAULT_XMLPRC_IP_ADDRESS "127.0.0.1" #define DEFAULT_XMLRPC_IP_PORT "7362" #define DEFAULT_FLRIG_IP_ADDRESS "127.0.0.1" #define DEFAULT_FLRIG_IP_PORT "12345" #define DEFAULT_FLLOG_IP_ADDRESS "127.0.0.1" #define DEFAULT_FLLOG_IP_PORT "8421" enum {DISABLED_IO, ARQ_IO, KISS_IO, XMLRPC_IO, FLRIG_IO, FLLOG_IO}; #define RSID_KISS_NOTIFY 0x01 #define RSID_KISS_ACTIVE 0x02 #define RSID_KISS_USER 0x03 #define DATA_IO_NA 0x00 #define DATA_IO_TCP 0x01 #define DATA_IO_UDP 0x02 // This variable indepent of progdefaults.data_io_enabled // and progStatus.data_io_enabled // Only on start do we assign this variable with progStatus.data_io_enabled. // This is one way assignment as we dont want to save all of the available states // this variable will have. extern int data_io_enabled; // Located in kiss_io.cxx extern int data_io_type; // Located in kiss_io.cxx extern void disable_config_p2p_io_widgets(void); extern void enable_config_p2p_io_widgets(void); extern void set_ip_to_default(int which_io); // KISS implementation extern void kiss_init(bool connect_flag); extern void kiss_close(bool override_flag); extern void kiss_reset(void); extern void WriteKISS(const char data); extern void WriteKISS(const char *data); extern void WriteKISS(const char *data, size_t size); extern void WriteKISS(std::string data); extern bool kiss_thread_running(void); extern bool kiss_auto_connect(void); extern void check_kiss_modem(void); extern int kiss_get_char(void); extern bool kiss_text_available; // Located in kiss_io.cxx extern bool kiss_bcast_rsid_reception; extern bool kiss_bcast_trx_toggle; extern bool bcast_rsid_kiss_frame(int new_wf_pos, int new_mode, int old_wf_pos, int old_mode, int notify); extern void bcast_trxc_kiss_frame(void); extern void kiss_io_set_button_state(void *); extern void connect_to_kiss_io(bool); // ARQ implementation extern void arq_init(void); extern void arq_close(void); extern bool arq_state(void); extern void WriteARQ(unsigned char); extern void checkTLF(void); extern int arq_get_char(void); extern bool arq_text_available; extern bool gmfskmail; extern std::string ArqFilename; extern bool mailclient; extern bool mailserver; extern bool tlfio; extern time_t inhibit_tx_seconds; // Misc calls extern void enable_disable_kpsql(void); #endif fldigi-4.2.05/src/include/rsid.h0000664000175000017500000000772714611711171013324 00000000000000// ---------------------------------------------------------------------------- // // rsid.h // // Copyright (C) 2008, 2009 // Dave Freese, W1HKJ // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // Tone separation: 10.766Hz // Integer tone separator (x 16): 172 // Error on 16 tones: 0.25Hz // Tone duration: 0.093 sec // Tone duration, #samples at 8ksps: 743 // Error on 15 tones: negligible // 1024 samples -> 512 tones // 2048 samples, second half zeros // each 512 samples new FFT // ---------------------------------------------------------------------------- #ifndef RSID_H #define RSID_H #include #include #include "ringbuffer.h" #include "globals.h" #include "modem.h" #include "gfft.h" #define RSID_SAMPLE_RATE 11025.0 #define RSID_FFT_SAMPLES 512 #define RSID_FFT_SIZE 1024 #define RSID_ARRAY_SIZE (RSID_FFT_SIZE * 2) #define RSID_BUFFER_SIZE (RSID_ARRAY_SIZE * 2) #define RSID_NSYMBOLS 15 #define RSID_NTIMES (RSID_NSYMBOLS * 2) #define RSID_PRECISION 2.7 // detected frequency precision in Hz // each rsid symbol has a duration equal to 1024 samples at 11025 Hz smpl rate #define RSID_SYMLEN (1024.0 / RSID_SAMPLE_RATE) // 0.09288 // duration of each rsid symbol enum { RSID_BANDWIDTH_500 = 0, RSID_BANDWIDTH_1K, RSID_BANDWIDTH_WIDE, }; typedef double rs_fft_type; typedef std::complex rs_cpx_type; struct RSIDs { unsigned short rs; trx_mode mode; const char* name; }; class cRsId { protected: enum { INITIAL, EXTENDED, WAIT }; private: // Table of precalculated Reed Solomon symbols unsigned char *pCodes1; unsigned char *pCodes2; bool found1; bool found2; static const RSIDs rsid_ids_1[]; static const int rsid_ids_size1; static const int Squares[]; static const int indices[]; static const RSIDs rsid_ids_2[]; static const int rsid_ids_size2; double rsid_secondary_time_out; int hamming_resolution; // Span of FFT bins, in which the RSID will be searched for int nBinLow; int nBinHigh; float aInputSamples[RSID_ARRAY_SIZE * 2]; rs_fft_type fftwindow[RSID_ARRAY_SIZE]; rs_cpx_type aFFTcmplx[RSID_ARRAY_SIZE]; rs_fft_type aFFTAmpl[RSID_FFT_SIZE]; g_fft *rsfft; bool bPrevTimeSliceValid; int iPrevDistance; int iPrevBin; int iPrevSymbol; int fft_buckets[RSID_NTIMES][RSID_FFT_SIZE]; bool bPrevTimeSliceValid2; int iPrevDistance2; int iPrevBin2; int iPrevSymbol2; // resample SRC_STATE* src_state; SRC_DATA src_data; int inptr; static long src_callback(void* cb_data, float** data); // transmit double *outbuf; size_t symlen; unsigned short rmode; unsigned short rmode2; private: void Encode(int code, unsigned char *rsid); void search(void); void setup_mode(int m); void CalculateBuckets(const rs_fft_type *pSpectrum, int iBegin, int iEnd); inline int HammingDistance(int iBucket, unsigned char *p2); bool search_amp( int &bin_out, int &symbol_out, unsigned char *pcode_table ); void apply ( int iBin, int iSymbol, int extended ); public: cRsId(); ~cRsId(); void reset(); void receive(const float* buf, size_t len); void send(bool postidle); void send_eot(); bool assigned(trx_mode mode); friend void reset_rsid(void *who); }; #endif fldigi-4.2.05/src/include/adif_def.h0000664000175000017500000000216614611711171014074 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef ADIF_DEF #define ADIF_DEF #include #include #include #include "field_def.h" struct FIELD { int type; int fsize; const char *name; Fl_Check_Button **btn; }; extern FIELD fields[]; #endif fldigi-4.2.05/src/include/logbook.h0000664000175000017500000000225114532252172014005 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FL_LOGBOOK_H #define FL_LOGBOOK_H #include #include "lgbook.h" #include "logsupport.h" #include "threads.h" extern std::string log_checksum; extern pthread_t logbook_thread; extern pthread_mutex_t logbook_mutex; extern void start_logbook(); extern void close_logbook(); #endif fldigi-4.2.05/src/include/compat.h0000664000175000017500000000417214532252172013640 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef COMPAT_H #define COMPAT_H /* adapted from compat.h in git-1.6.1.2 */ #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && !defined(_M_UNIX) # define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */ # define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */ #endif #define _ALL_SOURCE 1 #define _GNU_SOURCE 1 #define _BSD_SOURCE 1 #include #include #include #include #include #include #include #include #include #include #include #include #include // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #ifdef __MINGW32__ # if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 # undef dirent # include # else # include # endif #define WSA_MAJOR 2 #define WSA_MINOR 0 #else # include #endif #include #include #include #include #include "compat/mingw.h" #endif // MINGW32_H fldigi-4.2.05/src/include/pskvaricode.h0000664000175000017500000000216214532252172014664 00000000000000// ---------------------------------------------------------------------------- // varicode.h -- PSK31 Varicode // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _VARICODE_H #define _VARICODE_H extern const char *psk_varicode_encode(unsigned char c); extern int psk_varicode_decode(unsigned int symbol); #endif fldigi-4.2.05/src/include/Fl_Text_Buffer_mod.H0000664000175000017500000006670114611711171016015 00000000000000// // "$Id: Fl_Text_Buffer_mod.H 8148 2010-12-31 22:38:03Z matt $" // // Header file for Fl_Text_Buffer_mod class. // // Copyright 2001-2010 by Bill Spitzak and others. // Original code Copyright Mark Edel. Permission to distribute under // the LGPL for the FLTK library granted by Mark Edel. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // Please report all bugs and problems on the following page: // // http://www.fltk.org/str.php // /* \file Fl_Text_Buffer_mod, Fl_Text_Selection_mod widget . */ #ifndef Fl_Text_Buffer_mod_H #define Fl_Text_Buffer_mod_H #undef ASSERT_UTF8 #ifdef ASSERT_UTF8 # include # define IS_UTF8_ALIGNED(a) if (a && *a) assert(fl_utf8len(*(a))>0); # define IS_UTF8_ALIGNED2(a, b) if (b>=0 && blength()) assert(fl_utf8len(a->byte_at(b))>0); #else # define IS_UTF8_ALIGNED(a) # define IS_UTF8_ALIGNED2(a, b) #endif /* "character size" is the size of a UTF-8 character in bytes "character width" is the width of a Unicode character in pixels "column" was orginally defined as a character offset from the left margin. It was identical to the byte offset. In UTF-8, we have neither a byte offset nor truly fixed width fonts (*). Column could be a pixel value multiplied with an average character width (which is a bearable approximation). * in Unicode, there are no fixed width fonts! Even if the ASCII characters may happen to be all the same width in pixels, chinese charcaters surely are not. There are plenty of exceptions, like ligatures, that make special handling of "fixed" character widths a nightmare. I decided to remove all references to fixed fonts and see "columns" as a multiple of the average width of a character in the main font. - Matthias */ /* Maximum length in characters of a tab or control character expansion of a single buffer character */ #define FL_TEXT_MAX_EXP_CHAR_LEN 20 #include /** \class Fl_Text_Selection_mod \brief This is an internal class for Fl_Text_Buffer_mod to manage text selections. This class works correctly with utf-8 strings assuming that the parameters for all calls are on character boundaries. */ class FL_EXPORT Fl_Text_Selection_mod { friend class Fl_Text_Buffer_mod; public: /** \brief Set the selection range. \param start byte offset to first selected character \param end byte offset pointing after last selected character */ void set(int start, int end); /** \brief Updates a selection afer text was modified. Updates an individual selection for changes in the corresponding text \param pos byte offset into text buffer at which the change occured \param nDeleted number of bytes deleted from the buffer \param nInserted number of bytes inserted into the buffer */ void update(int pos, int nDeleted, int nInserted); /** \brief Return the byte offset to the first selected character. \return byte offset */ int start() const { return mStart; } /** \brief Return the byte ofsset to the character after the last selected character. \return byte offset */ int end() const { return mEnd; } /** \brief Returns true if any text is selected. \return a non-zero number if any text has been selected, or 0 if no text is selected. */ bool selected() const { return mSelected; } /** \brief Modify the 'selected' flag. \param b new flag */ void selected(bool b) { mSelected = b; } /** Return true if position \p pos with indentation \p dispIndex is in the Fl_Text_Selection_mod. */ int includes(int pos) const; /** \brief Return the positions of this selection. \param start retrun byte offset to first selected character \param end retrun byte offset pointing after last selected character \return true if selected */ int position(int* start, int* end) const; protected: int mStart; ///< byte offset to the first selected character int mEnd; ///< byte offset to the character after the last selected character bool mSelected; ///< this flag is set if any text is selected }; typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted, int nRestyled, const char* deletedText, void* cbArg); typedef void (*Fl_Text_Predelete_Cb)(int pos, int nDeleted, void* cbArg); /** \brief This class manages unicode displayed in one or more Fl_Text_Display_mod widgets. All text in Fl_Text_Buffer_modmust be encoded in UTF-8. All indices used in the function calls must be aligned to the start of a UTF-8 sequence. All indices and pointers returned will be aligned. All functions that return a single character will return that in an unsiged int in UCS-4 encoding. The Fl_Text_Buffer_mod class is used by the Fl_Text_Display_mod and Fl_Text_Editor_mod to manage complex text data and is based upon the excellent NEdit text editor engine - see http://www.nedit.org/. */ class FL_EXPORT Fl_Text_Buffer_mod { public: /** Create an empty text buffer of a pre-determined size. \param requestedSize use this to avoid unnecessary re-allocation if you know exactly how much the buffer will need to hold \param preferredGapSize Initial size for the buffer gap (empty space in the buffer where text might be inserted if the user is typing sequential chars) */ Fl_Text_Buffer_mod(int requestedSize = 0, int preferredGapSize = 1024); /** Frees a text buffer */ ~Fl_Text_Buffer_mod(); /** \brief Returns the number of bytes in the buffer. \return size of text in bytes */ int length() const { return mLength; } /** \brief Get a copy of the entire contents of the text buffer. Memory is allocated to contain the returned string, which the caller must free. \return newly allocated text buffer - must be free'd, text is utf8 */ char* text() const; /** Replaces the entire contents of the text buffer. \param text Text must be valid utf8. */ void text(const char* text); /** \brief Get a copy of a part of the text buffer. Return a copy of the text between \p start and \p end character positions from text buffer \p buf. Positions start at 0, and the range does not include the character pointed to by \p end. When you are done with the text, free it using the free() function. \param start byte offset to first character \param end byte offset after last character in range \return newly allocated text buffer - must be free'd, text is utf8 */ char* text_range(int start, int end) const; /** Returns the UCS-4 character at the specified position pos in the buffer. Positions start at 0 \param pos byte offset into buffer, pos must be at a character boundary \return Unicode UCS-4 encoded character */ unsigned int char_at(int pos) const; /** Returns the UTF-8 character at the specified position pos in the buffer. Positions start at 0 param pos byte offset into buffer, pos must be at a character boundary return Unicode UTF-8 encoded character return length of Unicode encoded character in len */ unsigned int get_char_at(int pos, int &len) const; /** Returns the raw byte at the specified position pos in the buffer. Positions start at 0 \param pos byte offset into buffer \return unencoded raw byte */ char byte_at(int pos) const; /** Convert a byte offset in buffer into a memory address. \param pos byte offset into buffer \return byte offset converted to a memory address */ const char *address(int pos) const { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; } /** Convert a byte offset in buffer into a memory address. \param pos byte offset into buffer \return byte offset converted to a memory address */ char *address(int pos) { return (pos < mGapStart) ? mBuf+pos : mBuf+pos+mGapEnd-mGapStart; } /** Inserts null-terminated string \p text at position \p pos. \param pos insertion position as byte offset (must be utf-8 character aligned) \param text utf-8 encoded and nul terminated text */ void insert(int pos, const char* text); /** Appends the text string to the end of the buffer. \param t utf-8 encoded and nul terminated text */ void append(const char* t) { insert(length(), t); } /** Deletes a range of characters in the buffer. \param start byte offset to first character to be removed \param end byte offset to charcatre after last character to be removed */ void remove(int start, int end); /** Deletes the characters between \p start and \p end, and inserts the null-terminated string \p text in their place in the buffer. \param start byte offset to first character to be removed and new insert position \param end byte offset to charcatre after last character to be removed \param text utf-8 encoded and nul terminated text */ void replace(int start, int end, const char *text); /** Copies text from one buffer to this one. \param fromBuf source text buffer may be the same as this \param fromStart byte offset into buffer \param fromEnd byte offset into buffer \param toPos destination byte offset into buffer */ void copy(Fl_Text_Buffer_mod* fromBuf, int fromStart, int fromEnd, int toPos); /** Undo text modification according to the undo variables or insert text from the undo buffer */ int undo(int *cp=0); /** Lets the undo system know if we can undo changes */ void canUndo(char flag=1); /** Inserts a file at the specified position. Returns 0 on success, non-zero on error (strerror() contains reason). 1 indicates open for read failed (no data loaded). 2 indicates error occurred while reading data (data was partially loaded). File can be UTF-8 or CP1252-encoded. If the input file is not UTF-8-encoded, the Fl_Text_Buffer_mod widget will contain UTF-8-transcoded data. By default, the message Fl_Text_Buffer_mod::file_encoding_warning_message will warn the user about this. \see input_file_was_transcoded and transcoding_warning_action. */ int insertfile(const char *file, int pos, int buflen = 128*1024); /** Appends the named file to the end of the buffer. See also insertfile(). */ int appendfile(const char *file, int buflen = 128*1024) { return insertfile(file, length(), buflen); } /** Loads a text file into the buffer. See also insertfile(). */ int loadfile(const char *file, int buflen = 128*1024) { select(0, length()); remove_selection(); return appendfile(file, buflen); } /** Writes the specified portions of the file to a file. Returns 0 on success, non-zero on error (strerror() contains reason). 1 indicates open for write failed (no data saved). 2 indicates error occurred while writing data (data was partially saved). */ int outputfile(const char *file, int start, int end, int buflen = 128*1024); /** Saves a text file from the current buffer */ int savefile(const char *file, int buflen = 128*1024) { return outputfile(file, 0, length(), buflen); } /** Gets the tab width. */ int tab_distance() const { return mTabDist; } /** Set the hardware tab distance (width) used by all displays for this buffer, and used in computing offsets for rectangular selection operations. */ void tab_distance(int tabDist); /** Selects a range of characters in the buffer. */ void select(int start, int end); /** Returns a non 0 value if text has been selected, 0 otherwise */ int selected() const { return mPrimary.selected(); } /** Cancels any previous selection on the primary text selection object */ void unselect(); /** Gets the selection position */ int selection_position(int* start, int* end); /** Returns the currently selected text. When you are done with the text, free it using the free() function. */ char* selection_text(); /** Removes the text in the primary selection. */ void remove_selection(); /** Replaces the text in the primary selection. */ void replace_selection(const char* text); /** Selects a range of characters in the secondary selection. */ void secondary_select(int start, int end); /** Returns a non 0 value if text has been selected in the secondary text selection, 0 otherwise */ int secondary_selected() { return mSecondary.selected(); } /** Clears any selection in the secondary text selection object. */ void secondary_unselect(); /** Returns the current selection in the secondary text selection object. */ int secondary_selection_position(int* start, int* end); /** Returns the text in the secondary selection. When you are done with the text, free it using the free() function. */ char* secondary_selection_text(); /** Removes the text from the buffer corresponding to the secondary text selection object. */ void remove_secondary_selection(); /** Replaces the text from the buffer corresponding to the secondary text selection object with the new string \p text. */ void replace_secondary_selection(const char* text); /** Highlights the specified text within the buffer. */ void highlight(int start, int end); /** Returns the highlighted text. When you are done with the text, free it using the free() function. */ int highlight() { return mHighlight.selected(); } /** Unhighlights text in the buffer. */ void unhighlight(); /** Highlights the specified text between \p start and \p end within the buffer. */ int highlight_position(int* start, int* end); /** Returns the highlighted text. When you are done with the text, free it using the free() function. */ char* highlight_text(); /** Adds a callback function that is called whenever the text buffer is modified. The callback function is declared as follows: \code typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted, int nRestyled, const char* deletedText, void* cbArg); \endcode */ void add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg); /** Removes a modify callback. */ void remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg); /** Calls all modify callbacks that have been registered using the add_modify_callback() method. */ void call_modify_callbacks() { call_modify_callbacks(0, 0, 0, 0, 0); } /** Adds a callback routine to be called before text is deleted from the buffer. */ void add_predelete_callback(Fl_Text_Predelete_Cb bufPredelCB, void* cbArg); /** Removes a callback routine \p bufPreDeleteCB associated with argument \p cbArg to be called before text is deleted from the buffer. */ void remove_predelete_callback(Fl_Text_Predelete_Cb predelCB, void* cbArg); /** Calls the stored pre-delete callback procedure(s) for this buffer to update the changed area(s) on the screen and any other listeners. */ void call_predelete_callbacks() { call_predelete_callbacks(0, 0); } /** Returns the text from the entire line containing the specified character position. When you are done with the text, free it using the free() function. \param pos byte index into buffer \return copy of utf8 text, must be free'd */ char* line_text(int pos) const; /** Returns the position of the start of the line containing position \p pos. \param pos byte index into buffer \return byte offset to line start */ int line_start(int pos) const; /** Finds and returns the position of the end of the line containing position \p pos (which is either a pointer to the newline character ending the line, or a pointer to one character beyond the end of the buffer) \param pos byte index into buffer \return byte offset to line end */ int line_end(int pos) const; /** Returns the position corresponding to the start of the word \param pos byte index into buffer \return byte offset to word start */ int word_start(int pos) const; /** Returns the position corresponding to the end of the word. \param pos byte index into buffer \return byte offset to word end */ int word_end(int pos) const; /** Count the number of displayed characters between buffer position \p lineStartPos and \p targetPos. (displayed characters are the characters shown on the screen to represent characters in the buffer, where tabs and control characters are expanded) */ int count_displayed_characters(int lineStartPos, int targetPos) const; /** Count forward from buffer position \p startPos in displayed characters (displayed characters are the characters shown on the screen to represent characters in the buffer, where tabs and control characters are expanded) \param lineStartPos byte offset into buffer \param nChars number of bytes that are sent to the display \return byte offset in input after all output bytes are sent */ int skip_displayed_characters(int lineStartPos, int nChars); /** Counts the number of newlines between \p startPos and \p endPos in buffer. The character at position \p endPos is not counted. */ int count_lines(int startPos, int endPos) const; /** Finds the first character of the line \p nLines forward from \p startPos in the buffer and returns its position */ int skip_lines(int startPos, int nLines); /** Finds and returns the position of the first character of the line \p nLines backwards from \p startPos (not counting the character pointed to by \p startpos if that is a newline) in the buffer. \p nLines == 0 means find the beginning of the line */ int rewind_lines(int startPos, int nLines); /** Finds the next occurrence of the specified character. Search forwards in buffer for character \p searchChar, starting with the character \p startPos, and returning the result in \p foundPos returns 1 if found, 0 if not. (The difference between this and BufSearchForward is that it's optimized for single characters. The overall performance of the text widget is dependent on its ability to count lines quickly, hence searching for a single character: newline) \param startPos byte offset to start position \param searchChar UCS-4 character that we want to find \param foundPos byte offset where the character was found \return 1 if found, 0 if not */ int findchar_forward(int startPos, unsigned searchChar, int* foundPos) const; /** Search backwards in buffer \p buf for character \p searchChar, starting with the character BEFORE \p startPos, returning the result in \p foundPos returns 1 if found, 0 if not. (The difference between this and BufSearchBackward is that it's optimized for single characters. The overall performance of the text widget is dependent on its ability to count lines quickly, hence searching for a single character: newline) \param startPos byte offset to start position \param searchChar UCS-4 character that we want to find \param foundPos byte offset where the character was found \return 1 if found, 0 if not */ int findchar_backward(int startPos, unsigned int searchChar, int* foundPos) const; /** Finds the next nth occurrence of the specified character. Search forwards in buffer for character \p searchChar, starting with the character \p startPos, and returning the result in \p foundPos returns 1 if found, 0 if not. (The difference between this and BufSearchForward is that it's optimized for single characters. The overall performance of the text widget is dependent on its ability to count lines quickly, hence searching for a single character: newline) \param startPos byte offset to start position \param searchChar UCS-4 character that we want to find \param foundPos byte offset where the character was found \return 1 if found, 0 if not */ int findchars_forward(int startPos, const char* searchString, int* foundPos, int n = 1) const; int search_forward(int startPos, const char* searchString, int* foundPos, int matchCase = 0) const; /** Search backwards in buffer for string searchCharssearchString, starting with the character BEFORE \p startPos, returning the result in \p foundPos returns 1 if found, 0 if not. \param startPos byte offset to start position \param searchString utf8 string that we want to find \param foundPos byte offset where the string was found \param matchCase if set, match character case \return 1 if found, 0 if not */ int search_backward(int startPos, const char* searchString, int* foundPos, int matchCase = 0) const; int findchars_backward(int startPos, const char* searchChars, int* foundPos); /** Returns the primary selection. */ const Fl_Text_Selection_mod* primary_selection() const { return &mPrimary; } /** Returns the primary selection. */ Fl_Text_Selection_mod* primary_selection() { return &mPrimary; } /** Returns the secondary selection. */ const Fl_Text_Selection_mod* secondary_selection() const { return &mSecondary; } /** Returns the current highlight selection. */ const Fl_Text_Selection_mod* highlight_selection() const { return &mHighlight; } /** Returns the index of the previous character. \param ix index to the current char */ int prev_char(int ix) const; int prev_char_clipped(int ix) const; /** Returns the index of the next character. \param ix index to the current char */ int next_char(int ix) const; int next_char_clipped(int ix) const; /** Align an index into the buffer to the current or previous utf8 boundary. */ int utf8_align(int) const; /** \brief true iff the loaded file has been transcoded to UTF-8 */ int input_file_was_transcoded; /** This message may be displayed using the fl_alert() function when a file which was not UTF-8 encoded is input. */ static const char* file_encoding_warning_message; /** \brief Pointer to a function called after reading a non UTF-8 encoded file. This function is called after reading a file if the file content was transcoded to UTF-8. Its default implementation calls fl_alert() with the text of \ref file_encoding_warning_message. No warning message is displayed if this pointer is set to NULL. Use \ref input_file_was_transcoded to be informed if file input required transcoding to UTF-8. */ void (*transcoding_warning_action)(Fl_Text_Buffer_mod*); protected: /** Calls the stored modify callback procedure(s) for this buffer to update the changed area(s) on the screen and any other listeners. */ void call_modify_callbacks(int pos, int nDeleted, int nInserted, int nRestyled, const char* deletedText) const; /** Calls the stored pre-delete callback procedure(s) for this buffer to update the changed area(s) on the screen and any other listeners. */ void call_predelete_callbacks(int pos, int nDeleted) const; /** Internal (non-redisplaying) version of BufInsert. Returns the length of text inserted (this is just strlen(\p text), however this calculation can be expensive and the length will be required by any caller who will continue on to call redisplay). \p pos must be contiguous with the existing text in the buffer (i.e. not past the end). \return the number of bytes inserted */ int insert_(int pos, const char* text); /** Internal (non-redisplaying) version of BufRemove. Removes the contents of the buffer between start and end (and moves the gap to the site of the delete). */ void remove_(int start, int end); /** Calls the stored redisplay procedure(s) for this buffer to update the screen for a change in a selection. */ void redisplay_selection(Fl_Text_Selection_mod* oldSelection, Fl_Text_Selection_mod* newSelection) const; /** Move the gap to start at a new position. */ void move_gap(int pos); /** Reallocates the text storage in the buffer to have a gap starting at \p newGapStart and a gap size of \p newGapLen, preserving the buffer's current contents. */ void reallocate_with_gap(int newGapStart, int newGapLen); char* selection_text_(Fl_Text_Selection_mod* sel) const; /** Removes the text from the buffer corresponding to \p sel. */ void remove_selection_(Fl_Text_Selection_mod* sel); /** Replaces the \p text in selection \p sel. */ void replace_selection_(Fl_Text_Selection_mod* sel, const char* text); /** Updates all of the selections in the buffer for changes in the buffer's text */ void update_selections(int pos, int nDeleted, int nInserted); Fl_Text_Selection_mod mPrimary; /**< highlighted areas */ Fl_Text_Selection_mod mSecondary; /**< highlighted areas */ Fl_Text_Selection_mod mHighlight; /**< highlighted areas */ int mLength; /**< length of the text in the buffer (the length of the buffer itself must be calculated: gapEnd - gapStart + length) */ char* mBuf; /**< allocated memory where the text is stored */ int mGapStart; /**< points to the first character of the gap */ int mGapEnd; /**< points to the first char after the gap */ // The hardware tab distance used by all displays for this buffer, // and used in computing offsets for rectangular selection operations. int mTabDist; /**< equiv. number of characters in a tab */ int mNModifyProcs; /**< number of modify-redisplay procs attached */ Fl_Text_Modify_Cb *mModifyProcs;/**< procedures to call when buffer is modified to redisplay contents */ void** mCbArgs; /**< caller arguments for modifyProcs above */ int mNPredeleteProcs; /**< number of pre-delete procs attached */ Fl_Text_Predelete_Cb *mPredeleteProcs; /**< procedure to call before text is deleted from the buffer; at most one is supported. */ void **mPredeleteCbArgs; /**< caller argument for pre-delete proc above */ int mCursorPosHint; /**< hint for reasonable cursor position after a buffer modification operation */ char mCanUndo; /**< if this buffer is used for attributes, it must not do any undo calls */ int mPreferredGapSize; /**< the default allocation for the text gap is 1024 bytes and should only be increased if frequent and large changes in buffer size are expected */ }; #endif // // End of "$Id: Fl_Text_Buffer_mod.H 8148 2010-12-31 22:38:03Z matt $". // fldigi-4.2.05/src/include/rigio.h0000664000175000017500000000461614611711171013466 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef RIGIO_H #define RIGIO_H #include #include "threads.h" #include "serial.h" extern Cserial rigio; extern pthread_mutex_t rigCAT_mutex; extern bool hexout(const std::string&); extern bool sendCommand(std::string cmd, std::string catstr, int retnbr, int waitval); extern void add_to_cmdque( std::string cmd, std::string s, int retnbr, int waitval); extern unsigned long long rigCAT_getfreq(int retries, bool &failed, int waitval = 0); extern void rigCAT_setfreq(unsigned long long); extern std::string rigCAT_getmode(); extern void rigCAT_setmode(const std::string&); extern std::string rigCAT_getwidth(); extern void rigCAT_setwidth(const std::string&); extern void rigCAT_get_notch(); extern void rigCAT_set_notch(int val); extern void rigCAT_get_smeter(); extern void rigCAT_get_pwrmeter(); extern void rigCAT_set_pwrlevel(int); extern void rigCAT_get_pwrlevel(); extern void rigCAT_close(); extern bool rigCAT_init(); extern bool rigCAT_active(); extern void rigCAT_sendINIT(const std::string& icmd, int multiplier = 1); extern void rigCAT_set_ptt(int); extern void rigCAT_set_qsy(unsigned long long f); extern void rigCAT_defaults(); //extern void rigCAT_restore_defaults(); // no xcvr extern unsigned long long noCAT_getfreq(); extern void noCAT_setfreq(unsigned long long f); extern std::string noCAT_getmode(); extern void noCAT_setmode(const std::string &md); extern std::string noCAT_getwidth(); extern void noCAT_setwidth(const std::string &w); extern void noCAT_setPTT(bool val); extern void noCAT_init(); #endif fldigi-4.2.05/src/include/Viewer.h0000664000175000017500000000313614532252172013615 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef Viewer_h #define Viewer_h #include #include #include #include #include #include #include "viewpsk.h" #include "psk_browser.h" #include "flslider2.h" #include "flinput2.h" extern Fl_Double_Window *dlgViewer; extern Fl_Value_Slider2 *sldrViewerSquelch; extern Fl_Double_Window* createViewer(); extern Fl_Input2 *viewer_inp_seek; extern pskBrowser *brwsViewer; extern void openViewer(); extern void viewaddchr(int ch, int freq, char c, int md); extern void viewerswap(int, int); extern void initViewer(); extern void viewclearchannel(int ch); extern void viewer_paste_freq(int freq); extern void viewer_redraw(); #endif fldigi-4.2.05/src/ssb/0000775000175000017500000000000014611714005011420 500000000000000fldigi-4.2.05/src/ssb/ssb.cxx0000664000175000017500000000316614611711171012662 00000000000000// ---------------------------------------------------------------------------- // ssb.cxx -- ssb modem // // Copyright (C) 2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "ssb.h" #include "modem.h" #include "digiscope.h" #include "fl_digi.h" #include "debug.h" #define ssb_bw 4 void ssb::tx_init() { } void ssb::rx_init() { put_MODEstatus(mode); } void ssb::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::BLANK); } ssb::~ssb() { } void ssb::restart() { set_bandwidth(ssb_bw); } ssb::ssb() { mode = MODE_SSB; samplerate = 44100; cap &= ~CAP_TX; restart(); } // dummy process int ssb::rx_process(const double *buf, int len) { return 0; } //===================================================================== // ssb transmit // dummy process //===================================================================== int ssb::tx_process() { return -1; } fldigi-4.2.05/src/qrunner/0000775000175000017500000000000014611714005012323 500000000000000fldigi-4.2.05/src/qrunner/fqueue.h0000664000175000017500000000631214532252172013714 00000000000000// ---------------------------------------------------------------------------- // fqueue.h // // Copyright (C) 2007-2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef FQUEUE_H_ #define FQUEUE_H_ #include #include #include "ringbuffer.h" #include "util.h" // #include // #include // #include #define FQUEUE_SIZE 2048 #define FIFO_SIZE (FQUEUE_SIZE * 4) class func_base { public: virtual void destroy(bool run) = 0; virtual ~func_base() { } }; template class func_wrap : public func_base { public: explicit func_wrap(const F &f_) : f(f_) { } virtual void destroy(bool run) { if (run) f(); this->~func_wrap(); } private: F f; }; class fqueue { typedef ringbuffer fqueue_ringbuffer_t; public: fqueue(size_t count = FQUEUE_SIZE, size_t blocksize_ = 128) : blocksize(blocksize_) { rb = new fqueue_ringbuffer_t(blocksize * count); } ~fqueue() { drop(); delete rb; } bool empty(void) { return rb->read_space() == 0; } bool full(void) { return rb->write_space() == 0; } size_t size(void) { return rb->read_space() / blocksize; } template bool push(const T& t) { // If we have any space left at all, it will be at least // a blocksize. It will not wrap around the end of the rb. if (unlikely(rb->get_wv(wvec, blocksize) < blocksize)) return false; assert(blocksize >= sizeof(func_wrap)); // we assume a no-throw ctor! new (wvec[0].buf) func_wrap(t); rb->write_advance(blocksize); return true; } bool pop(bool exec = false) { if (rb->get_rv(rvec, blocksize) < blocksize) return false; reinterpret_cast(rvec[0].buf)->destroy(exec); rb->read_advance(blocksize); return true; } bool execute(void) { return pop(true); } size_t drop(void) { size_t n = 0; while (pop(false)) ++n; return n; } protected: fqueue_ringbuffer_t* rb; fqueue_ringbuffer_t::vector_type rvec[2], wvec[2]; size_t blocksize; }; #endif // FQUEUE_H_ // Local Variables: // mode: c++ // c-file-style: "linux" // End: fldigi-4.2.05/src/qrunner/qrunner.cxx0000664000175000017500000000656214611711171014473 00000000000000// ---------------------------------------------------------------------------- // qrunner.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #if defined(__CYGWIN__) # include # include #elif defined(__MINGW32__) # include "compat.h" #endif #include #include #include "fqueue.h" #include "qrunner.h" #ifndef __MINGW32__ # define QRUNNER_EAGAIN() (errno == EAGAIN) #else # define QRUNNER_EAGAIN() ((errno = WSAGetLastError()) == WSAEWOULDBLOCK) #endif // qrunner threads const char *sztid[] = { "INVALID_TID", "TRX_TID", "TOD_TID", "QRZ_TID", "RIGCTL_TID", "NORIGCTL_TID", "EQSL_TID", "ADIF_RW_TID", "ADIF_MERGE_TID", "XMLRPC_TID", "ARQ_TID", "ARQSOCKET_TID", "MACLOGGER_TID", "KISS_TID", "KISSSOCKET_TID", "PSM_TID", "AUDIO_ALERT_TID", "FD_TID", "N3FJP_TID", "DXCC_TID", "WKEY_TID", "CWIO_TID", "FSK_TID", "FMT_TID", "ACTIVITY_TID", "FSQ_SOUNDER_TID", "FLMAIN_TID" }; void qrunner_debug(int tid, const char *name) { if (tid > ((int)sizeof(sztid)-1)) tid = 0; else tid++; if (tid < 2) return; FILE *fd = (FILE *)0; fd = fl_fopen("qrunner.txt", "a"); if(fd) { fprintf(fd, "%s, %s\n", sztid[tid], name); fclose(fd); } } qrunner::qrunner() : attached(false), inprog(false), drop_flag(false) { fifo = new fqueue(FIFO_SIZE); #ifndef __WOE32__ if (pipe(pfd) == -1) #else if (socketpair(PF_INET, SOCK_STREAM, 0, pfd) == -1) #endif throw qexception(errno); set_cloexec(pfd[0], 1); set_cloexec(pfd[1], 1); if (set_nonblock(pfd[0], 1) == -1) throw qexception(errno); #ifdef __WOE32__ set_nodelay(pfd[1], 1); #endif } qrunner::~qrunner() { detach(); close(pfd[0]); close(pfd[1]); delete fifo; } void qrunner::attach(int id_no, std::string id_string) { Fl::add_fd(pfd[0], FL_READ, reinterpret_cast(qrunner::execute), this); attached = true; _id_no = id_no; _id_string.assign(id_string); } void qrunner::attach(void) { Fl::add_fd(pfd[0], FL_READ, reinterpret_cast(qrunner::execute), this); attached = true; } void qrunner::detach(void) { attached = false; Fl::remove_fd(pfd[0], FL_READ); } static unsigned char rbuf[FIFO_SIZE]; void qrunner::execute(int fd, void *arg) { qrunner *qr = reinterpret_cast(arg); if (qr->inprog) return; qr->inprog = true; long n = QRUNNER_READ(fd, rbuf, FIFO_SIZE); switch (n) { case -1: if (!QRUNNER_EAGAIN()) { throw qexception(errno); } // else fall through case 0: break; default: while (n--) { qr->fifo->execute(); } } qr->inprog = false; } void qrunner::flush(void) { execute(pfd[0], this); } fldigi-4.2.05/src/irrxml/0000775000175000017500000000000014611714005012146 500000000000000fldigi-4.2.05/src/irrxml/CXMLReaderImpl.h0000664000175000017500000004331614532252172014762 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __ICXML_READER_IMPL_H_INCLUDED__ #define __ICXML_READER_IMPL_H_INCLUDED__ #include "irrXML.h" #include "irrString.h" #include "irrArray.h" #include "fast_atof.h" #ifdef _DEBUG #ifndef __WOE32__ #define IRR_DEBUGPRINT(x) printf((x)); #endif #else // _DEBUG #define IRR_DEBUGPRINT(x) #endif // _DEBUG namespace irr { namespace io { //! implementation of the IrrXMLReader template class CXMLReaderImpl : public IIrrXMLReader { public: //! Constructor CXMLReaderImpl(IFileReadCallBack* callback, bool deleteCallBack = true) : TextData(0), P(0), TextBegin(0), TextSize(0), CurrentNodeType(EXN_NONE), SourceFormat(ETF_ASCII), TargetFormat(ETF_ASCII) { if (!callback) return; storeTargetFormat(); // read whole xml file readFile(callback); // clean up if (deleteCallBack) delete callback; // create list with special characters createSpecialCharacterList(); // set pointer to text begin P = TextBegin; } //! Destructor virtual ~CXMLReaderImpl() { delete [] TextData; } //! Reads forward to the next xml node. //! \return Returns false, if there was no further node. virtual bool read() { // if not end reached, parse the node if (P && (unsigned int)(P - TextBegin) < TextSize - 1 && *P != 0) { parseCurrentNode(); return true; } _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX; return false; } //! Returns the type of the current XML node. virtual EXML_NODE getNodeType() const { return CurrentNodeType; } //! Returns attribute count of the current XML node. virtual int getAttributeCount() const { return Attributes.size(); } //! Returns name of an attribute. virtual const char_type* getAttributeName(int idx) const { if (idx < 0 || idx >= (int)Attributes.size()) return 0; return Attributes[idx].Name.c_str(); } //! Returns the value of an attribute. virtual const char_type* getAttributeValue(int idx) const { if (idx < 0 || idx >= (int)Attributes.size()) return 0; return Attributes[idx].Value.c_str(); } //! Returns the value of an attribute. virtual const char_type* getAttributeValue(const char_type* name) const { const SAttribute* attr = getAttributeByName(name); if (!attr) return 0; return attr->Value.c_str(); } //! Returns the value of an attribute virtual const char_type* getAttributeValueSafe(const char_type* name) const { const SAttribute* attr = getAttributeByName(name); if (!attr) return EmptyString.c_str(); return attr->Value.c_str(); } //! Returns the value of an attribute as integer. int getAttributeValueAsInt(const char_type* name) const { return (int)getAttributeValueAsFloat(name); } //! Returns the value of an attribute as integer. int getAttributeValueAsInt(int idx) const { return (int)getAttributeValueAsFloat(idx); } //! Returns the value of an attribute as float. float getAttributeValueAsFloat(const char_type* name) const { const SAttribute* attr = getAttributeByName(name); if (!attr) return 0; core::stringc c = attr->Value.c_str(); return core::fast_atof(c.c_str()); } //! Returns the value of an attribute as float. float getAttributeValueAsFloat(int idx) const { const char_type* attrvalue = getAttributeValue(idx); if (!attrvalue) return 0; core::stringc c = attrvalue; return core::fast_atof(c.c_str()); } //! Returns the name of the current node. virtual const char_type* getNodeName() const { return NodeName.c_str(); } //! Returns data of the current node. virtual const char_type* getNodeData() const { return NodeName.c_str(); } //! Returns if an element is an empty element, like virtual bool isEmptyElement() const { return IsEmptyElement; } //! Returns format of the source xml file. virtual ETEXT_FORMAT getSourceFormat() const { return SourceFormat; } //! Returns format of the strings returned by the parser. virtual ETEXT_FORMAT getParserFormat() const { return TargetFormat; } private: // Reads the current xml node void parseCurrentNode() { char_type* start = P; // more forward until '<' found while(*P != L'<' && *P) ++P; if (!*P) return; if (P - start > 0) { // we found some text, store it if (setText(start, P)) return; } ++P; // based on current token, parse and report next element switch(*P) { case L'/': parseClosingXMLElement(); break; case L'?': ignoreDefinition(); break; case L'!': if (!parseCDATA()) parseComment(); break; default: parseOpeningXMLElement(); break; } } //! sets the state that text was found. Returns true if set should be set bool setText(char_type* start, char_type* end) { // check if text is more than 2 characters, and if not, check if there is // only white space, so that this text won't be reported /* if (end - start < 3) { char_type* p = start; for(; p != end; ++p) if (!isWhiteSpace(*p)) break; if (p == end) return false; } */ // set current text to the parsed text, and replace xml special characters core::string s(start, (int)(end - start)); NodeName = replaceSpecialCharacters(s); // current XML node type is text CurrentNodeType = EXN_TEXT; return true; } //! ignores an xml definition like void ignoreDefinition() { CurrentNodeType = EXN_UNKNOWN; // move until end marked with '>' reached while(*P != L'>') ++P; ++P; } //! parses a comment void parseComment() { CurrentNodeType = EXN_COMMENT; P += 1; char_type *pCommentBegin = P; int count = 1; // move until end of comment reached while(count) { if (*P == L'>') --count; else if (*P == L'<') ++count; ++P; } P -= 3; NodeName = core::string(pCommentBegin+2, (int)(P - pCommentBegin-2)); P += 3; } //! parses an opening xml element and reads attributes void parseOpeningXMLElement() { CurrentNodeType = EXN_ELEMENT; IsEmptyElement = false; Attributes.clear(); // find name const char_type* startName = P; // find end of element while(*P != L'>' && !isWhiteSpace(*P)) ++P; const char_type* endName = P; // find Attributes while(*P != L'>') { if (isWhiteSpace(*P)) ++P; else { if (*P != L'/') { // we've got an attribute // read the attribute names const char_type* attributeNameBegin = P; while(!isWhiteSpace(*P) && *P != L'=') ++P; const char_type* attributeNameEnd = P; ++P; // read the attribute value // check for quotes and single quotes, thx to murphy while( (*P != L'\"') && (*P != L'\'') && *P) ++P; if (!*P) // malformatted xml file return; const char_type attributeQuoteChar = *P; ++P; const char_type* attributeValueBegin = P; while(*P != attributeQuoteChar && *P) ++P; if (!*P) // malformatted xml file return; const char_type* attributeValueEnd = P; ++P; SAttribute attr; attr.Name = core::string(attributeNameBegin, (int)(attributeNameEnd - attributeNameBegin)); core::string s(attributeValueBegin, (int)(attributeValueEnd - attributeValueBegin)); attr.Value = replaceSpecialCharacters(s); Attributes.push_back(attr); } else { // tag is closed directly ++P; IsEmptyElement = true; break; } } } // check if this tag is closing directly if (endName > startName && *(endName-1) == L'/') { // directly closing tag IsEmptyElement = true; endName--; } NodeName = core::string(startName, (int)(endName - startName)); ++P; } //! parses an closing xml tag void parseClosingXMLElement() { CurrentNodeType = EXN_ELEMENT_END; IsEmptyElement = false; Attributes.clear(); ++P; const char_type* pBeginClose = P; while(*P != L'>') ++P; NodeName = core::string(pBeginClose, (int)(P - pBeginClose)); ++P; } //! parses a possible CDATA section, returns false if begin was not a CDATA section bool parseCDATA() { if (*(P+1) != L'[') return false; CurrentNodeType = EXN_CDATA; // skip '' && (*(P-1) == L']') && (*(P-2) == L']')) { cDataEnd = P - 2; } ++P; } if ( cDataEnd ) NodeName = core::string(cDataBegin, (int)(cDataEnd - cDataBegin)); else NodeName = ""; return true; } // structure for storing attribute-name pairs struct SAttribute { core::string Name; core::string Value; }; // finds a current attribute by name, returns 0 if not found const SAttribute* getAttributeByName(const char_type* name) const { if (!name) return 0; core::string n = name; for (int i=0; i<(int)Attributes.size(); ++i) if (Attributes[i].Name == n) return &Attributes[i]; return 0; } // replaces xml special characters in a string and creates a new one core::string replaceSpecialCharacters( core::string& origstr) { int pos = origstr.findFirst(L'&'); int oldPos = 0; if (pos == -1) return origstr; core::string newstr; while(pos != -1 && pos < origstr.size()-2) { // check if it is one of the special characters int specialChar = -1; for (int i=0; i<(int)SpecialCharacters.size(); ++i) { const char_type* p = &origstr.c_str()[pos]+1; if (equalsn(&SpecialCharacters[i][1], p, SpecialCharacters[i].size()-1)) { specialChar = i; break; } } if (specialChar != -1) { newstr.append(origstr.subString(oldPos, pos - oldPos)); newstr.append(SpecialCharacters[specialChar][0]); pos += SpecialCharacters[specialChar].size(); } else { newstr.append(origstr.subString(oldPos, pos - oldPos + 1)); pos += 1; } // find next & oldPos = pos; pos = origstr.findNext(L'&', pos); } if (oldPos < origstr.size()) newstr.append(origstr.subString(oldPos, origstr.size()-oldPos)); return newstr; } //! reads the xml file and converts it into the wanted character format. bool readFile(IFileReadCallBack* callback) { int size = callback->getSize(); size += 4; // We need two terminating 0's at the end. // For ASCII we need 1 0's, for UTF-16 2, for UTF-32 4. char* data8 = new char[size]; if (!callback->read(data8, size-4)) { delete [] data8; return false; } // add zeros at end data8[size-1] = 0; data8[size-2] = 0; data8[size-3] = 0; data8[size-4] = 0; char16* data16 = reinterpret_cast(data8); char32* data32 = reinterpret_cast(data8); // now we need to convert the data to the desired target format // based on the byte order mark. const unsigned char UTF8[] = {0xEF, 0xBB, 0xBF}; // 0xEFBBBF; const int UTF16_BE = 0xFFFE; const int UTF16_LE = 0xFEFF; const int UTF32_BE = 0xFFFE0000; const int UTF32_LE = 0x0000FEFF; // check source for all utf versions and convert to target data format if (size >= 4 && data32[0] == (char32)UTF32_BE) { // UTF-32, big endian SourceFormat = ETF_UTF32_BE; convertTextData(data32+1, data8, (size/4)); // data32+1 because we need to skip the header } else if (size >= 4 && data32[0] == (char32)UTF32_LE) { // UTF-32, little endian SourceFormat = ETF_UTF32_LE; convertTextData(data32+1, data8, (size/4)); // data32+1 because we need to skip the header } else if (size >= 2 && data16[0] == UTF16_BE) { // UTF-16, big endian SourceFormat = ETF_UTF16_BE; convertTextData(data16+1, data8, (size/2)); // data16+1 because we need to skip the header } else if (size >= 2 && data16[0] == UTF16_LE) { // UTF-16, little endian SourceFormat = ETF_UTF16_LE; convertTextData(data16+1, data8, (size/2)); // data16+1 because we need to skip the header } else if (size >= 3 && data8[0] == UTF8[0] && data8[1] == UTF8[1] && data8[2] == UTF8[2]) { // UTF-8 SourceFormat = ETF_UTF8; convertTextData(data8+3, data8, size); // data8+3 because we need to skip the header } else { // ASCII SourceFormat = ETF_ASCII; convertTextData(data8, data8, size); } return true; } //! converts the text file into the desired format. //! \param source: begin of the text (without byte order mark) //! \param pointerToStore: pointer to text data block which can be //! stored or deleted based on the nesessary conversion. //! \param sizeWithoutHeader: Text size in characters without header template void convertTextData(src_char_type* source, char* pointerToStore, int sizeWithoutHeader) { // convert little to big endian if necessary if (sizeof(src_char_type) > 1 && isLittleEndian(TargetFormat) != isLittleEndian(SourceFormat)) convertToLittleEndian(source); // check if conversion is necessary: if (sizeof(src_char_type) == sizeof(char_type)) { // no need to convert TextBegin = (char_type*)source; TextData = (char_type*)pointerToStore; TextSize = sizeWithoutHeader; } else { // convert source into target data format. // TODO: implement a real conversion. This one just // copies bytes. This is a problem when there are // unicode symbols using more than one character. TextData = new char_type[sizeWithoutHeader]; for (int i=0; i void convertToLittleEndian(src_char_type* t) { if (sizeof(src_char_type) == 4) { // 32 bit while(*t) { *t = ((*t & 0xff000000) >> 24) | ((*t & 0x00ff0000) >> 8) | ((*t & 0x0000ff00) << 8) | ((*t & 0x000000ff) << 24); ++t; } } else { // 16 bit while(*t) { *t = (*t >> 8) | (*t << 8); ++t; } } } //! returns if a format is little endian inline bool isLittleEndian(ETEXT_FORMAT f) { return f == ETF_ASCII || f == ETF_UTF8 || f == ETF_UTF16_LE || f == ETF_UTF32_LE; } //! returns true if a character is whitespace inline bool isWhiteSpace(char_type c) { return (c==' ' || c=='\t' || c=='\n' || c=='\r'); } //! generates a list with xml special characters void createSpecialCharacterList() { // list of strings containing special symbols, // the first character is the special character, // the following is the symbol string without trailing &. SpecialCharacters.push_back("&"); SpecialCharacters.push_back("gt;"); SpecialCharacters.push_back("\"quot;"); SpecialCharacters.push_back("'apos;"); } //! compares the first n characters of the strings bool equalsn(const char_type* str1, const char_type* str2, int len) { int i; for(i=0; str1[i] && str2[i] && i < len; ++i) if (str1[i] != str2[i]) return false; // if one (or both) of the strings was smaller then they // are only equal if they have the same lenght return (i == len) || (str1[i] == 0 && str2[i] == 0); } //! stores the target text format void storeTargetFormat() { // get target format. We could have done this using template specialization, // but VisualStudio 6 don't like it and we want to support it. switch(sizeof(char_type)) { case 1: TargetFormat = ETF_UTF8; break; case 2: TargetFormat = ETF_UTF16_LE; break; case 4: TargetFormat = ETF_UTF32_LE; break; default: TargetFormat = ETF_ASCII; // should never happen. } } // instance variables: char_type* TextData; // data block of the text file char_type* P; // current point in text to parse char_type* TextBegin; // start of text to parse unsigned int TextSize; // size of text to parse in characters, not bytes EXML_NODE CurrentNodeType; // type of the currently parsed node ETEXT_FORMAT SourceFormat; // source format of the xml file ETEXT_FORMAT TargetFormat; // output format of this parser core::string NodeName; // name of the node currently in core::string EmptyString; // empty string to be returned by getSafe() methods bool IsEmptyElement; // is the currently parsed node empty? core::array< core::string > SpecialCharacters; // see createSpecialCharacterList() core::array Attributes; // attributes of current element }; // end CXMLReaderImpl } // end namespace } // end namespace #endif fldigi-4.2.05/src/irrxml/irrTypes.h0000664000175000017500000000774614532252172014102 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __IRR_TYPES_H_INCLUDED__ #define __IRR_TYPES_H_INCLUDED__ namespace irr { //! 8 bit unsigned variable. /** This is a typedef for unsigned char, it ensures portability of the engine. */ typedef unsigned char u8; //! 8 bit signed variable. /** This is a typedef for signed char, it ensures portability of the engine. */ typedef signed char s8; //! 8 bit character variable. /** This is a typedef for char, it ensures portability of the engine. */ typedef char c8; //! 16 bit unsigned variable. /** This is a typedef for unsigned short, it ensures portability of the engine. */ typedef unsigned short u16; //! 16 bit signed variable. /** This is a typedef for signed short, it ensures portability of the engine. */ typedef signed short s16; //! 32 bit unsigned variable. /** This is a typedef for unsigned int, it ensures portability of the engine. */ typedef unsigned int u32; //! 32 bit signed variable. /** This is a typedef for signed int, it ensures portability of the engine. */ typedef signed int s32; // 64 bit signed variable. // This is a typedef for __int64, it ensures portability of the engine. // This type is currently not used by the engine and not supported by compilers // other than Microsoft Compilers, so it is outcommented. //typedef __int64 s64; //! 32 bit floating point variable. /** This is a typedef for float, it ensures portability of the engine. */ typedef float f32; //! 64 bit floating point variable. /** This is a typedef for double, it ensures portability of the engine. */ typedef double f64; } // end namespace // define the wchar_t type if not already built in. #ifdef _MSC_VER #ifndef _WCHAR_T_DEFINED //! A 16 bit wide character type. /** Defines the wchar_t-type. In VS6, its not possible to tell the standard compiler to treat wchar_t as a built-in type, and sometimes we just don't want to include the huge stdlib.h or wchar.h, so we'll use this. */ typedef unsigned short wchar_t; #define _WCHAR_T_DEFINED #endif // wchar is not defined #endif // microsoft compiler //! define a break macro for debugging only in Win32 mode. #if defined(WIN32) && defined(_MSC_VER) && defined(_DEBUG) #define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) if (_CONDITION_) {_asm int 3} #else #define _IRR_DEBUG_BREAK_IF( _CONDITION_ ) #endif //! Defines a small statement to work around a microsoft compiler bug. /** The microsft compiler 7.0 - 7.1 has a bug: When you call unmanaged code that returns a bool type value of false from managed code, the return value may appear as true. See http://support.microsoft.com/default.aspx?kbid=823071 for details. Compiler version defines: VC6.0 : 1200, VC7.0 : 1300, VC7.1 : 1310, VC8.0 : 1400*/ #if defined(WIN32) && defined(_MSC_VER) && (_MSC_VER > 1299) && (_MSC_VER < 1400) #define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX __asm mov eax,100 #else #define _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX #endif // _IRR_MANAGED_MARSHALLING_BUGFIX #endif // __IRR_TYPES_H_INCLUDED__ fldigi-4.2.05/src/irrxml/irrXML.h0000664000175000017500000005515714532252172013435 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and/or irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __IRR_XML_H_INCLUDED__ #define __IRR_XML_H_INCLUDED__ #include /** irrXML 1.2 API documentation
\section intro Introduction Welcome to the irrXML API documentation. Here you'll find any information you'll need to develop applications with irrXML. If you look for a tutorial on how to start, take a look at the \ref irrxmlexample, at the homepage of irrXML at xml.irrlicht3d.org or into the SDK in the directory \example. irrXML is intended to be a high speed and easy-to-use XML Parser for C++, and this documentation is an important part of it. If you have any questions or suggestions, just send a email to the author of the engine, Nikolaus Gebhardt (niko (at) irrlicht3d.org). For more informations about this parser, see \ref history. \section features Features irrXML provides forward-only, read-only access to a stream of non validated XML data. It was fully implemented by Nikolaus Gebhardt. Its current features are: - It it fast as lighting and has very low memory usage. It was developed with the intention of being used in 3D games, as it already has been. - irrXML is very small: It only consists of 60 KB of code and can be added easily to your existing project. - Of course, it is platform independent and works with lots of compilers. - It is able to parse ASCII, UTF-8, UTF-16 and UTF-32 text files, both in little and big endian format. - Independent of the input file format, the parser can return all strings in ASCII, UTF-8, UTF-16 and UTF-32 format. - With its optional file access abstraction it has the advantage that it can read not only from files but from any type of data (memory, network, ...). For example when used with the Irrlicht Engine, it directly reads from compressed .zip files. - Just like the Irrlicht Engine for which it was originally created, it is extremely easy to use. - It has no external dependencies, it does not even need the STL. Although irrXML has some strenghts, it currently also has the following limitations: - The input xml file is not validated and assumed to be correct. \section irrxmlexample Example The following code demonstrates the basic usage of irrXML. A simple xml file like this is parsed: \code Welcome to the Mesh Viewer of the "Irrlicht Engine". \endcode The code for parsing this file would look like this: \code #include using namespace irr; // irrXML is located in the namespace irr::io using namespace io; #include // we use STL strings to store data in this example void main() { // create the reader using one of the factory functions IrrXMLReader* xml = createIrrXMLReader("config.xml"); // strings for storing the data we want to get out of the file std::string modelFile; std::string messageText; std::string caption; // parse the file until end reached while(xml && xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: // in this xml file, the only text which occurs is the messageText messageText = xml->getNodeData(); break; case EXN_ELEMENT: { if (!strcmp("model", xml->getNodeName())) modelFile = xml->getAttributeValue("file"); else if (!strcmp("messageText", xml->getNodeName())) caption = xml->getAttributeValue("caption"); } break; } } // delete the xml parser after usage delete xml; } \endcode \section howto How to use Simply add the source files in the /src directory of irrXML to your project. Done. \section license License The irrXML license is based on the zlib license. Basicly, this means you can do with irrXML whatever you want: Copyright (C) 2002-2005 Nikolaus Gebhardt This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. \section history History As lots of references in this documentation and the source show, this xml parser has originally been a part of the Irrlicht Engine. But because the parser has become very useful with the latest release, people asked for a separate version of it, to be able to use it in non Irrlicht projects. With irrXML 1.0, this has now been done. */ namespace irr { namespace io { //! Enumeration of all supported source text file formats enum ETEXT_FORMAT { //! ASCII, file without byte order mark, or not a text file ETF_ASCII, //! UTF-8 format ETF_UTF8, //! UTF-16 format, big endian ETF_UTF16_BE, //! UTF-16 format, little endian ETF_UTF16_LE, //! UTF-32 format, big endian ETF_UTF32_BE, //! UTF-32 format, little endian ETF_UTF32_LE, }; //! Enumeration for all xml nodes which are parsed by IrrXMLReader enum EXML_NODE { //! No xml node. This is usually the node if you did not read anything yet. EXN_NONE, //! A xml element, like EXN_ELEMENT, //! End of an xml element, like EXN_ELEMENT_END, //! Text within a xml element: this is the text. EXN_TEXT, //! An xml comment like <!-- I am a comment --> or a DTD definition. EXN_COMMENT, //! An xml cdata section like <![CDATA[ this is some CDATA ]]> EXN_CDATA, //! Unknown element. EXN_UNKNOWN }; //! Callback class for file read abstraction. /** With this, it is possible to make the xml parser read in other things than just files. The Irrlicht engine is using this for example to read xml from compressed .zip files. To make the parser read in any other data, derive a class from this interface, implement the two methods to read your data and give a pointer to an instance of your implementation when calling createIrrXMLReader(), createIrrXMLReaderUTF16() or createIrrXMLReaderUTF32() */ class IFileReadCallBack { public: //! virtual destructor virtual ~IFileReadCallBack() {}; //! Reads an amount of bytes from the file. /** \param buffer: Pointer to buffer where to read bytes will be written to. \param sizeToRead: Amount of bytes to read from the file. \return Returns how much bytes were read. */ virtual int read(void* buffer, int sizeToRead) = 0; //! Returns size of file in bytes virtual int getSize() = 0; }; //! Empty class to be used as parent class for IrrXMLReader. /** If you need another class as base class for the xml reader, you can do this by creating the reader using for example new CXMLReaderImpl(yourcallback); The Irrlicht Engine for example needs IUnknown as base class for every object to let it automaticly reference countend, hence it replaces IXMLBase with IUnknown. See irrXML.cpp on how this can be done in detail. */ class IXMLBase { }; //! Interface providing easy read access to a XML file. /** You can create an instance of this reader using one of the factory functions createIrrXMLReader(), createIrrXMLReaderUTF16() and createIrrXMLReaderUTF32(). If using the parser from the Irrlicht Engine, please use IFileSystem::createXMLReader() instead. For a detailed intro how to use the parser, see \ref irrxmlexample and \ref features. The typical usage of this parser looks like this: \code #include using namespace irr; // irrXML is located in the namespace irr::io using namespace io; void main() { // create the reader using one of the factory functions IrrXMLReader* xml = createIrrXMLReader("config.xml"); if (xml == 0) return; // file could not be opened // parse the file until end reached while(xml->read()) { // based on xml->getNodeType(), do something. } // delete the xml parser after usage delete xml; } \endcode See \ref irrxmlexample for a more detailed example. */ template class IIrrXMLReader : public super_class { public: //! Destructor virtual ~IIrrXMLReader() {}; //! Reads forward to the next xml node. /** \return Returns false, if there was no further node. */ virtual bool read() = 0; //! Returns the type of the current XML node. virtual EXML_NODE getNodeType() const = 0; //! Returns attribute count of the current XML node. /** This is usually non null if the current node is EXN_ELEMENT, and the element has attributes. \return Returns amount of attributes of this xml node. */ virtual int getAttributeCount() const = 0; //! Returns name of an attribute. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Name of the attribute, 0 if an attribute with this index does not exist. */ virtual const char_type* getAttributeName(int idx) const = 0; //! Returns the value of an attribute. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Value of the attribute, 0 if an attribute with this index does not exist. */ virtual const char_type* getAttributeValue(int idx) const = 0; //! Returns the value of an attribute. /** \param name: Name of the attribute. \return Value of the attribute, 0 if an attribute with this name does not exist. */ virtual const char_type* getAttributeValue(const char_type* name) const = 0; //! Returns the value of an attribute in a safe way. /** Like getAttributeValue(), but does not return 0 if the attribute does not exist. An empty string ("") is returned then. \param name: Name of the attribute. \return Value of the attribute, and "" if an attribute with this name does not exist */ virtual const char_type* getAttributeValueSafe(const char_type* name) const = 0; //! Returns the value of an attribute as integer. /** \param name Name of the attribute. \return Value of the attribute as integer, and 0 if an attribute with this name does not exist or the value could not be interpreted as integer. */ virtual int getAttributeValueAsInt(const char_type* name) const = 0; //! Returns the value of an attribute as integer. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Value of the attribute as integer, and 0 if an attribute with this index does not exist or the value could not be interpreted as integer. */ virtual int getAttributeValueAsInt(int idx) const = 0; //! Returns the value of an attribute as float. /** \param name: Name of the attribute. \return Value of the attribute as float, and 0 if an attribute with this name does not exist or the value could not be interpreted as float. */ virtual float getAttributeValueAsFloat(const char_type* name) const = 0; //! Returns the value of an attribute as float. /** \param idx: Zero based index, should be something between 0 and getAttributeCount()-1. \return Value of the attribute as float, and 0 if an attribute with this index does not exist or the value could not be interpreted as float. */ virtual float getAttributeValueAsFloat(int idx) const = 0; //! Returns the name of the current node. /** Only non null, if the node type is EXN_ELEMENT. \return Name of the current node or 0 if the node has no name. */ virtual const char_type* getNodeName() const = 0; //! Returns data of the current node. /** Only non null if the node has some data and it is of type EXN_TEXT or EXN_UNKNOWN. */ virtual const char_type* getNodeData() const = 0; //! Returns if an element is an empty element, like virtual bool isEmptyElement() const = 0; //! Returns format of the source xml file. /** It is not necessary to use this method because the parser will convert the input file format to the format wanted by the user when creating the parser. This method is useful to get/display additional informations. */ virtual ETEXT_FORMAT getSourceFormat() const = 0; //! Returns format of the strings returned by the parser. /** This will be UTF8 for example when you created a parser with IrrXMLReaderUTF8() and UTF32 when it has been created using IrrXMLReaderUTF32. It should not be necessary to call this method and only exists for informational purposes. */ virtual ETEXT_FORMAT getParserFormat() const = 0; }; //! defines the utf-16 type. /** Not using wchar_t for this because wchar_t has 16 bit on windows and 32 bit on other operating systems. */ typedef unsigned short char16; //! defines the utf-32 type. /** Not using wchar_t for this because wchar_t has 16 bit on windows and 32 bit on other operating systems. */ typedef unsigned long char32; //! A UTF-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8 by this parser. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. Create an instance of this with createIrrXMLReader(); See IIrrXMLReader for description on how to use it. */ typedef IIrrXMLReader IrrXMLReader; //! A UTF-16 xml parser. /** This means that all character data will be returned in UTF-16 by this parser. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. Create an instance of this with createIrrXMLReaderUTF16(); See IIrrXMLReader for description on how to use it. */ typedef IIrrXMLReader IrrXMLReaderUTF16; //! A UTF-32 xml parser. /** This means that all character data will be returned in UTF-32 by this parser. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. Create an instance of this with createIrrXMLReaderUTF32(); See IIrrXMLReader for description on how to use it. */ typedef IIrrXMLReader IrrXMLReaderUTF32; //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReaderUTF8() instead. \param filename: Name of file to be opened. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReader* createIrrXMLReader(const char* filename); //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReaderUTF8() instead. \param file: Pointer to opened file, must have been opened in binary mode, e.g. using fopen("foo.bar", "wb"); The file will not be closed after it has been read. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReader* createIrrXMLReader(FILE* file); //! Creates an instance of an UFT-8 or ASCII character xml parser. /** This means that all character data will be returned in 8 bit ASCII or UTF-8. The file to read can be in any format, it will be converted to UTF-8 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReaderUTF8() instead. \param callback: Callback for file read abstraction. Implement your own callback to make the xml parser read in other things than just files. See IFileReadCallBack for more information about this. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param filename: Name of file to be opened. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param file: Pointer to opened file, must have been opened in binary mode, e.g. using fopen("foo.bar", "wb"); The file will not be closed after it has been read. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file); //! Creates an instance of an UFT-16 xml parser. /** This means that all character data will be returned in UTF-16. The file to read can be in any format, it will be converted to UTF-16 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param callback: Callback for file read abstraction. Implement your own callback to make the xml parser read in other things than just files. See IFileReadCallBack for more information about this. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param filename: Name of file to be opened. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. if you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param file: Pointer to opened file, must have been opened in binary mode, e.g. using fopen("foo.bar", "wb"); The file will not be closed after it has been read. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file); //! Creates an instance of an UFT-32 xml parser. /** This means that all character data will be returned in UTF-32. The file to read can be in any format, it will be converted to UTF-32 if it is not in this format. If you are using the Irrlicht Engine, it is better not to use this function but IFileSystem::createXMLReader() instead. \param callback: Callback for file read abstraction. Implement your own callback to make the xml parser read in other things than just files. See IFileReadCallBack for more information about this. \return Returns a pointer to the created xml parser. This pointer should be deleted using 'delete' after no longer needed. Returns 0 if an error occured and the file could not be opened. */ IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback); /*! \file irrxml.h \brief Header file of the irrXML, the Irrlicht XML parser. This file includes everything needed for using irrXML, the XML parser of the Irrlicht Engine. To use irrXML, you only need to include this file in your project: \code #include \endcode It is also common to use the two namespaces in which irrXML is included, directly after #including irrXML.h: \code #include using namespace irr; using namespace io; \endcode */ } // end namespace io } // end namespace irr #endif // __IRR_XML_H_INCLUDED__ fldigi-4.2.05/src/irrxml/fast_atof.h0000664000175000017500000000642214532252172014215 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __FAST_A_TO_F_H_INCLUDED__ #define __FAST_A_TO_F_H_INCLUDED__ #include #include namespace irr { namespace core { // Disable the use of powf(3) on mingw32 because it breaks cross compilation // on Debian unstable. #ifndef __MINGW32__ const float fast_atof_table[] = { 0.f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f, 0.0000000001f, 0.00000000001f, 0.000000000001f, 0.0000000000001f, 0.00000000000001f, 0.000000000000001f }; //! Provides a fast function for converting a string into a float, //! about 6 times faster than atof in win32. // If you find any bugs, please send them to me, niko (at) irrlicht3d.org. inline char* fast_atof_move(char* c, float& out) { bool inv = false; char *t; float f; if (*c=='-') { c++; inv = true; } f = (float)strtol(c, &t, 10); c = t; if (*c == '.') { c++; float pl = (float)strtol(c, &t, 10); pl *= fast_atof_table[t-c]; f += pl; c = t; if (*c == 'e') { ++c; float exp = (float)strtol(c, &t, 10); f *= (float)pow(10.0f, exp); c = t; } } if (inv) f *= -1.0f; out = f; return c; } //! Provides a fast function for converting a string into a float, //! about 6 times faster than atof in win32. // If you find any bugs, please send them to me, niko (at) irrlicht3d.org. inline const char* fast_atof_move_const(const char* c, float& out) { bool inv = false; char *t; float f; if (*c=='-') { c++; inv = true; } f = (float)strtol(c, &t, 10); c = t; if (*c == '.') { c++; float pl = (float)strtol(c, &t, 10); pl *= fast_atof_table[t-c]; f += pl; c = t; if (*c == 'e') { ++c; f32 exp = (f32)strtol(c, &t, 10); f *= (f32)powf(10.0f, exp); c = t; } } if (inv) f *= -1.0f; out = f; return c; } inline float fast_atof(const char* c) { float ret; fast_atof_move_const(c, ret); return ret; } #else // __MINGW32__ inline float fast_atof(const char* c) { return atof(c); } #endif // !__MINGW32__ } // end namespace core }// end namespace irr #endif fldigi-4.2.05/src/irrxml/irrArray.h0000664000175000017500000002414214532252172014041 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __IRR_ARRAY_H_INCLUDED__ #define __IRR_ARRAY_H_INCLUDED__ #include "irrTypes.h" #include "heapsort.h" namespace irr { namespace core { //! Self reallocating template array (like stl vector) with additional features. /** Some features are: Heap sorting, binary search methods, easier debugging. */ template class array { public: array() : data(0), allocated(0), used(0), free_when_destroyed(true), is_sorted(true) { } //! Constructs a array and allocates an initial chunk of memory. //! \param start_count: Amount of elements to allocate. array(u32 start_count) : data(0), used(0), allocated(0), free_when_destroyed(true), is_sorted(true) { reallocate(start_count); } //! Copy constructor array(const array& other) : data(0) { *this = other; } //! Destructor. Frees allocated memory, if set_free_when_destroyed //! was not set to false by the user before. ~array() { if (free_when_destroyed) delete [] data; } //! Reallocates the array, make it bigger or smaller. //! \param new_size: New size of array. void reallocate(u32 new_size) { T* old_data = data; data = new T[new_size]; allocated = new_size; s32 end = used < new_size ? used : new_size; for (s32 i=0; i allocated) { // reallocate(used * 2 +1); // this doesn't work if the element is in the same array. So // we'll copy the element first to be sure we'll get no data // corruption T e; e = element; // copy element reallocate(used * 2 +1); // increase data block data[used++] = e; // push_back is_sorted = false; return; } data[used++] = element; is_sorted = false; } //! Adds an element at the front of the array. If the array is to small to //! add this new element, the array is made bigger. Please note that this //! is slow, because the whole array needs to be copied for this. //! \param element: Element to add at the back of the array. void push_front(const T& element) { if (used + 1 > allocated) reallocate(used * 2 +1); for (int i=(int)used; i>0; --i) data[i] = data[i-1]; data[0] = element; is_sorted = false; ++used; } //! Insert item into array at specified position. Please use this //! only if you know what you are doing (possible performance loss). //! The preferred method of adding elements should be push_back(). //! \param element: Element to be inserted //! \param index: Where position to insert the new element. void insert(const T& element, u32 index=0) { _IRR_DEBUG_BREAK_IF(index>used) // access violation if (used + 1 > allocated) reallocate(used * 2 +1); for (u32 i=used++; i>index; i--) data[i] = data[i-1]; data[index] = element; is_sorted = false; } //! Clears the array and deletes all allocated memory. void clear() { delete [] data; data = 0; used = 0; allocated = 0; is_sorted = true; } //! Sets pointer to new array, using this as new workspace. //! \param newPointer: Pointer to new array of elements. //! \param size: Size of the new array. void set_pointer(T* newPointer, u32 size) { delete [] data; data = newPointer; allocated = size; used = size; is_sorted = false; } //! Sets if the array should delete the memory it used. //! \param f: If true, the array frees the allocated memory in its //! destructor, otherwise not. The default is true. void set_free_when_destroyed(bool f) { free_when_destroyed = f; } //! Sets the size of the array. //! \param usedNow: Amount of elements now used. void set_used(u32 usedNow) { if (allocated < usedNow) reallocate(usedNow); used = usedNow; } //! Assignement operator void operator=(const array& other) { if (data) delete [] data; //if (allocated < other.allocated) if (other.allocated == 0) data = 0; else data = new T[other.allocated]; used = other.used; free_when_destroyed = other.free_when_destroyed; is_sorted = other.is_sorted; allocated = other.allocated; for (u32 i=0; i=used) // access violation return data[index]; } //! Direct access operator const T& operator [](u32 index) const { _IRR_DEBUG_BREAK_IF(index>=used) // access violation return data[index]; } //! Gets last frame const T& getLast() const { _IRR_DEBUG_BREAK_IF(!used) // access violation return data[used-1]; } //! Gets last frame T& getLast() { _IRR_DEBUG_BREAK_IF(!used) // access violation return data[used-1]; } //! Returns a pointer to the array. //! \return Pointer to the array. T* pointer() { return data; } //! Returns a const pointer to the array. //! \return Pointer to the array. const T* const_pointer() const { return data; } //! Returns size of used array. //! \return Size of elements in the array. u32 size() const { return used; } //! Returns amount memory allocated. //! \return Returns amount of memory allocated. The amount of bytes //! allocated would be allocated_size() * sizeof(ElementsUsed); u32 allocated_size() const { return allocated; } //! Returns true if array is empty //! \return True if the array is empty, false if not. bool empty() const { return used == 0; } //! Sorts the array using heapsort. There is no additional memory waste and //! the algorithm performs (O) n log n in worst case. void sort() { if (is_sorted || used<2) return; heapsort(data, used); is_sorted = true; } //! Performs a binary search for an element, returns -1 if not found. //! The array will be sorted before the binary search if it is not //! already sorted. //! \param element: Element to search for. //! \return Returns position of the searched element if it was found, //! otherwise -1 is returned. s32 binary_search(const T& element) { return binary_search(element, 0, used-1); } //! Performs a binary search for an element, returns -1 if not found. //! The array will be sorted before the binary search if it is not //! already sorted. //! \param element: Element to search for. //! \param left: First left index //! \param right: Last right index. //! \return Returns position of the searched element if it was found, //! otherwise -1 is returned. s32 binary_search(const T& element, s32 left, s32 right) { if (!used) return -1; sort(); s32 m; do { m = (left+right)>>1; if (element < data[m]) right = m - 1; else left = m + 1; } while((element < data[m] || data[m] < element) && left<=right); // this last line equals to: // " while((element != array[m]) && left<=right);" // but we only want to use the '<' operator. // the same in next line, it is "(element == array[m])" if (!(element < data[m]) && !(data[m] < element)) return m; return -1; } //! Finds an element in linear time, which is very slow. Use //! binary_search for faster finding. Only works if =operator is implemented. //! \param element: Element to search for. //! \return Returns position of the searched element if it was found, //! otherwise -1 is returned. s32 linear_search(T& element) { for (u32 i=0; i=0; --i) if (data[i] == element) return (s32)i; return -1; } //! Erases an element from the array. May be slow, because all elements //! following after the erased element have to be copied. //! \param index: Index of element to be erased. void erase(u32 index) { _IRR_DEBUG_BREAK_IF(index>=used || index<0) // access violation for (u32 i=index+1; i=used || index<0 || count<1 || index+count>used) // access violation for (u32 i=index+count; i. // ---------------------------------------------------------------------------- #include #include "irrXML.h" #include "irrString.h" #include "irrArray.h" #include "fast_atof.h" #include "CXMLReaderImpl.h" namespace irr { namespace io { //! Implementation of the file read callback for ordinary files class CFileReadCallBack : public IFileReadCallBack { public: //! construct from filename CFileReadCallBack(const char* filename) : File(0), Size(0), Close(true) { // open file File = fopen(filename, "rb"); if (File) getFileSize(); } //! construct from FILE pointer CFileReadCallBack(FILE* file) : File(file), Size(0), Close(false) { if (File) getFileSize(); } //! destructor virtual ~CFileReadCallBack() { if (Close && File) fclose(File); } //! Reads an amount of bytes from the file. virtual int read(void* buffer, int sizeToRead) { if (!File) return 0; return (int)fread(buffer, 1, sizeToRead, File); } //! Returns size of file in bytes virtual int getSize() { return Size; } private: //! retrieves the file size of the open file void getFileSize() { fseek(File, 0, SEEK_END); Size = ftell(File); fseek(File, 0, SEEK_SET); } FILE* File; int Size; bool Close; }; // end class CFileReadCallBack // FACTORY FUNCTIONS: //! Creates an instance of an UFT-8 or ASCII character xml parser. IrrXMLReader* createIrrXMLReader(const char* filename) { return new CXMLReaderImpl(new CFileReadCallBack(filename)); } //! Creates an instance of an UFT-8 or ASCII character xml parser. IrrXMLReader* createIrrXMLReader(FILE* file) { return new CXMLReaderImpl(new CFileReadCallBack(file)); } //! Creates an instance of an UFT-8 or ASCII character xml parser. IrrXMLReader* createIrrXMLReader(IFileReadCallBack* callback) { return new CXMLReaderImpl(callback, false); } //! Creates an instance of an UTF-16 xml parser. IrrXMLReaderUTF16* createIrrXMLReaderUTF16(const char* filename) { return new CXMLReaderImpl(new CFileReadCallBack(filename)); } //! Creates an instance of an UTF-16 xml parser. IrrXMLReaderUTF16* createIrrXMLReaderUTF16(FILE* file) { return new CXMLReaderImpl(new CFileReadCallBack(file)); } //! Creates an instance of an UTF-16 xml parser. IrrXMLReaderUTF16* createIrrXMLReaderUTF16(IFileReadCallBack* callback) { return new CXMLReaderImpl(callback, false); } //! Creates an instance of an UTF-32 xml parser. IrrXMLReaderUTF32* createIrrXMLReaderUTF32(const char* filename) { return new CXMLReaderImpl(new CFileReadCallBack(filename)); } //! Creates an instance of an UTF-32 xml parser. IrrXMLReaderUTF32* createIrrXMLReaderUTF32(FILE* file) { return new CXMLReaderImpl(new CFileReadCallBack(file)); } //! Creates an instance of an UTF-32 xml parser. IrrXMLReaderUTF32* createIrrXMLReaderUTF32(IFileReadCallBack* callback) { return new CXMLReaderImpl(callback, false); } } // end namespace io } // end namespace irr fldigi-4.2.05/src/irrxml/heapsort.h0000664000175000017500000000436714532252172014102 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine". // For conditions of distribution and use, see copyright notice in irrlicht.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __IRR_HEAPSORT_H_INCLUDED__ #define __IRR_HEAPSORT_H_INCLUDED__ #include "irrTypes.h" namespace irr { namespace core { //! Sinks an element into the heap. template inline void heapsink(T*array, s32 element, s32 max) { while ((element<<1) < max) // there is a left child { s32 j = (element<<1); if (j+1 < max && array[j] < array[j+1]) j = j+1; // take right child if (array[element] < array[j]) { T t = array[j]; // swap elements array[j] = array[element]; array[element] = t; element = j; } else return; } } //! Sorts an array with size 'size' using heapsort. template inline void heapsort(T* array_, s32 size) { // for heapsink we pretent this is not c++, where // arrays start with index 0. So we decrease the array pointer, // the maximum always +2 and the element always +1 T* virtualArray = array_ - 1; s32 virtualSize = size + 2; s32 i; // build heap for (i=((size-1)/2); i>=0; --i) heapsink(virtualArray, i+1, virtualSize-1); // sort array for (i=size-1; i>=0; --i) { T t = array_[0]; array_[0] = array_[i]; array_[i] = t; heapsink(virtualArray, 1, i + 1); } } } // end namespace core } // end namespace irr #endif fldigi-4.2.05/src/irrxml/irrString.h0000664000175000017500000003236514532252172014237 00000000000000// Copyright (C) 2002-2005 Nikolaus Gebhardt // This file is part of the "Irrlicht Engine" and the "irrXML" project. // For conditions of distribution and use, see copyright notice in irrlicht.h and irrXML.h // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __IRR_STRING_H_INCLUDED__ #define __IRR_STRING_H_INCLUDED__ #include "irrTypes.h" namespace irr { namespace core { //! Very simple string class with some useful features. /** string and string work both with unicode AND ascii, so you can assign unicode to string and ascii to string (and the other way round) if your ever would want to. Note that the conversation between both is not done using an encoding. Known bugs: Special characters like '', '' and '' are ignored in the methods make_upper, make_lower and equals_ignore_case. */ template class string { public: //! Default constructor string() : array(0), allocated(1), used(1) { array = new T[1]; array[0] = 0x0; } //! Constructor string(const string& other) : array(0), allocated(0), used(0) { *this = other; } //! Constructs a string from an int string(int number) : array(0), allocated(0), used(0) { // store if negative and make positive bool negative = false; if (number < 0) { number *= -1; negative = true; } // temporary buffer for 16 numbers c8 tmpbuf[16]; tmpbuf[15] = 0; s32 idx = 15; // special case '0' if (!number) { tmpbuf[14] = '0'; *this = &tmpbuf[14]; return; } // add numbers while(number && idx) { idx--; tmpbuf[idx] = (c8)('0' + (number % 10)); number = number / 10; } // add sign if (negative) { idx--; tmpbuf[idx] = '-'; } *this = &tmpbuf[idx]; } //! Constructor for copying a string from a pointer with a given lenght template string(const B* c, s32 lenght) : array(0), allocated(0), used(0) { if (!c) return; allocated = used = lenght+1; array = new T[used]; for (s32 l = 0; l string(const B* c) : array(0), allocated(0), used(0) { *this = c; } //! destructor ~string() { delete [] array; } //! Assignment operator string& operator=(const string& other) { if (this == &other) return *this; delete [] array; allocated = used = other.size()+1; array = new T[used]; const T* p = other.c_str(); for (s32 i=0; i string& operator=(const B* c) { if (!c) { if (!array) { array = new T[1]; allocated = 1; used = 1; } array[0] = 0x0; return *this; } if ((void*)c == (void*)array) return *this; s32 len = 0; const B* p = c; while(*p) { ++len; ++p; } // we'll take the old string for a while, because the new string could be // a part of the current string. T* oldArray = array; allocated = used = len+1; array = new T[used]; for (s32 l = 0; l operator+(const string& other) { string str(*this); str.append(other); return str; } //! Add operator for strings, ascii and unicode template string operator+(const B* c) { string str(*this); str.append(c); return str; } //! Direct access operator T& operator [](const s32 index) const { _IRR_DEBUG_BREAK_IF(index>=used) // bad index return array[index]; } //! Comparison operator bool operator ==(const T* str) const { int i; for(i=0; array[i] && str[i]; ++i) if (array[i] != str[i]) return false; return !array[i] && !str[i]; } //! Comparison operator bool operator ==(const string& other) const { for(s32 i=0; array[i] && other.array[i]; ++i) if (array[i] != other.array[i]) return false; return used == other.used; } //! Is smaller operator bool operator <(const string& other) const { for(s32 i=0; array[i] && other.array[i]; ++i) if (array[i] != other.array[i]) return (array[i] < other.array[i]); return used < other.used; } //! Equals not operator bool operator !=(const string& other) const { return !(*this == other); } //! Returns length of string /** \return Returns length of the string in characters. */ s32 size() const { return used-1; } //! Returns character string /** \return Returns pointer to C-style zero terminated string. */ const T* c_str() const { return array; } //! Makes the string lower case. void make_lower() { const T A = (T)'A'; const T Z = (T)'Z'; const T diff = (T)'a' - A; for (s32 i=0; i=A && array[i]<=Z) array[i] += diff; } } //! Makes the string upper case. void make_upper() { const T a = (T)'a'; const T z = (T)'z'; const T diff = (T)'A' - a; for (s32 i=0; i=a && array[i]<=z) array[i] += diff; } } //! Compares the string ignoring case. /** \param other: Other string to compare. \return Returns true if the string are equal ignoring case. */ bool equals_ignore_case(const string& other) const { for(s32 i=0; array[i] && other[i]; ++i) if (toLower(array[i]) != toLower(other[i])) return false; return used == other.used; } //! compares the first n characters of the strings bool equalsn(const string& other, int len) { int i; for(i=0; array[i] && other[i] && i < len; ++i) if (array[i] != other[i]) return false; // if one (or both) of the strings was smaller then they // are only equal if they have the same lenght return (i == len) || (used == other.used); } //! compares the first n characters of the strings bool equalsn(const T* str, int len) { int i; for(i=0; array[i] && str[i] && i < len; ++i) if (array[i] != str[i]) return false; // if one (or both) of the strings was smaller then they // are only equal if they have the same lenght return (i == len) || (array[i] == 0 && str[i] == 0); } //! Appends a character to this string /** \param character: Character to append. */ void append(T character) { if (used + 1 > allocated) reallocate((s32)used + 1); used += 1; array[used-2] = character; array[used-1] = 0; } //! Appends a string to this string /** \param other: String to append. */ void append(const string& other) { --used; s32 len = other.size(); if (used + len + 1 > allocated) reallocate((s32)used + (s32)len + 1); for (s32 l=0; l& other, s32 length) { s32 len = other.size(); if (len < length) { append(other); return; } len = length; --used; if (used + len > allocated) reallocate((s32)used + (s32)len); for (s32 l=0; l s32 findFirstCharNotInList(B* c, int count) const { for (int i=0; i s32 findLastCharNotInList(B* c, int count) const { for (int i=used-2; i>=0; --i) { int j; for (j=0; j=0; --i) if (array[i] == c) return i; return -1; } //! Returns a substring //! \param begin: Start of substring. //! \param length: Length of substring. string subString(s32 begin, s32 length) { if (length <= 0) return string(""); string o; o.reserve(length+1); for (s32 i=0; i& other) { append(other); } void operator += (int i) { append(string(i)); } //! replaces all characters of a special type with another one void replace(T toReplace, T replaceWith) { for (s32 i=0; i=used || index<0) // access violation for (int i=index+1; i=(T)'A' && t<=(T)'Z') return t + ((T)'a' - (T)'A'); else return t; } //! Reallocate the array, make it bigger or smaler void reallocate(s32 new_size) { T* old_array = array; array = new T[new_size]; allocated = new_size; s32 amount = used < new_size ? used : new_size; for (s32 i=0; i stringc; //! Typedef for wide character strings typedef string stringw; } // end namespace core } // end namespace irr #endif fldigi-4.2.05/src/logger/0000775000175000017500000000000014611714005012110 500000000000000fldigi-4.2.05/src/logger/speak.cxx0000664000175000017500000000726714611711171013674 00000000000000// ---------------------------------------------------------------------------- // speak.cxx rx text data stream to file // rx text data stream to client socket on MS // // Copyright 2009 W1HKJ, Dave Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "gettext.h" #include "speak.h" #include "main.h" #include "status.h" #include "fl_digi.h" #include "configuration.h" #include "debug.h" #include "socket.h" #include "icons.h" const char *txtTalkInfo = _("\ Save all received text, one character at a time to the following file:\n\n\ fldigi.files\\talk\\textout.txt (Windows)\n\ ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)"); std::string speakfname = ""; std::ofstream speakout; std::string speakbuffer = ""; #ifndef __WIN32__ void open_talker() {} void close_talker() {} void toggle_talker() {} #endif #ifdef __WIN32__ #include "confdialog.h" std::string talkbuffer = ""; Socket *talker_tcpip = 0; std::string talker_address = "127.0.0.1"; std::string talker_port = "1111"; bool can_talk = true; void open_talker() { try { talker_tcpip = new Socket(Address(talker_address.c_str(), talker_port.c_str())); talker_tcpip->set_timeout(0.01); talker_tcpip->connect(); btnConnectTalker->value(1); btnConnectTalker->redraw(); can_talk = true; } catch (const SocketException& e) { LOG_INFO("Talker Server not available"); btnConnectTalker->value(0); btnConnectTalker->redraw(); can_talk = false; } } void close_talker() { talker_tcpip->close(); btnConnectTalker->value(0); btnConnectTalker->redraw(); can_talk = false; } void toggle_talker() { if (can_talk) close_talker(); else open_talker(); } void speak(int c) { if (progdefaults.speak) { if (speakfname.empty()) { speakfname = TalkDir; speakfname.append("textout.txt"); } speakbuffer += (char)c; // Windows is not able to handle continuously open/close of the append file // the file might or might not be written to. if (!speakout) speakout.open(speakfname.c_str(), std::ios::app); if (speakout) { for (size_t i = 0; i < speakbuffer.length(); i++) speakout.put(speakbuffer[i]); speakbuffer.clear(); } } if (can_talk && !talker_tcpip) open_talker(); if (!talker_tcpip) return; if (c < ' ' || c > 'z') c = ','; talkbuffer += c; try { talker_tcpip->send(talkbuffer); } catch (const SocketException& e) { LOG_INFO("Talker server not available"); delete talker_tcpip; talker_tcpip = 0; btnConnectTalker->labelcolor(FL_RED); btnConnectTalker->redraw_label(); can_talk = false; } talkbuffer.clear(); } #else void speak(int c) { if (!progdefaults.speak) return; if (speakfname.empty()) { speakfname = TalkDir; speakfname.append("textout.txt"); } speakbuffer += c; speakout.open(speakfname.c_str(), std::ios::app); if (!speakout) return; for (size_t i = 0; i < speakbuffer.length(); i++) speakout.put(speakbuffer[i]); speakbuffer.clear(); speakout.flush(); speakout.close(); } #endif fldigi-4.2.05/src/logger/logger.cxx0000664000175000017500000005500614611711171014042 00000000000000// ---------------------------------------------------------------------------- // logger.cxx Remote Log Interface for fldigi // // Copyright 2006-2009 W1HKJ, Dave Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #if !defined(__WOE32__) && !defined(__APPLE__) # include # include #endif #include #include #include #include #include "icons.h" #include "logger.h" #include "lgbook.h" #include "main.h" #include "modem.h" #include "waterfall.h" #include "fl_digi.h" #include "trx.h" #include "debug.h" #include "macros.h" #include "status.h" #include "spot.h" #include "adif_io.h" #include "date.h" #include "configuration.h" #include "flmisc.h" #include "strutil.h" #include "qrunner.h" #include "logsupport.h" #include "lookupcall.h" #include "fd_logger.h" #include "n3fjp_logger.h" #include "dx_cluster.h" #include "network.h" #include //--------------------------------------------------------------------- const char *logmode; static std::string log_msg; static std::string errmsg; static std::string notes; //====================================================================== // LoTW static std::string lotw_fname; static std::string lotw_logfname; static std::string lotw_send_fname; static std::string lotw_log_fname; static int tracefile_timeout = 0; std::string str_lotw; //====================================================================== // eQSL void submit_eQSL(cQsoRec &rec, std::string msg); //====================================================================== //====================================================================== // Cloudlog void submit_cloudlog(cQsoRec &rec); //====================================================================== // static std::string adif; void writeADIF () { // open the adif file FILE *adiFile; std::string fname; fname = TempDir; fname.append("log.adif"); adiFile = fl_fopen (fname.c_str(), "a"); if (adiFile) { // write the current record to the file fprintf(adiFile,"%s\n", adif.c_str()); fclose (adiFile); } } void putadif(int num, const char *s, std::string &str = adif) { char tempstr[100]; int slen = strlen(s); int n = snprintf(tempstr, sizeof(tempstr), "<%s:%d>", fields[num].name, slen); if (n == -1) { LOG_PERROR("snprintf"); return; } str.append(tempstr).append(s); } std::vector lotw_recs_sent; void clear_lotw_recs_sent() { lotw_recs_sent.clear(); } void restore_lotwsdates() { extern int editNbr; if (lotw_recs_sent.empty()) return; int recnbr; cQsoRec *rec; for (size_t n = 0; n < lotw_recs_sent.size(); n++) { recnbr = lotw_recs_sent[n]; rec = qsodb.getRec(recnbr); rec->putField(LOTWSDATE, ""); if (recnbr == editNbr) { inpLOTWsentdate_log->value(""); inpLOTWsentdate_log->redraw(); } } clear_lotw_recs_sent(); } static notify_dialog *lotw_alert_window = 0; void check_lotw_log(void *) { FILE * logfile = fl_fopen(lotw_log_fname.c_str(), "rb"); if (!logfile) { tracefile_timeout--; if (!tracefile_timeout) { LOG_ERROR(_("NO tqsl log file in %d seconds!"), progdefaults.tracefile_timeout); restore_lotwsdates(); clear_lotw_recs_sent(); return; } Fl::repeat_timeout(1.0, check_lotw_log); return; } std::string trace_text; fseek(logfile, 0, SEEK_END); size_t logfile_size = ftell(logfile); rewind(logfile); if (logfile_size == 0) { tracefile_timeout--; if (!tracefile_timeout) { LOG_ERROR(_("Tqsl log file empty! waited %d seconds!"), progdefaults.tracefile_timeout); restore_lotwsdates(); clear_lotw_recs_sent(); return; } Fl::repeat_timeout(1.0, check_lotw_log); return; } int ch; for (size_t n = 0; n < logfile_size; n++) { ch = fgetc(logfile); if (ch >= 0x20 && ch <= 0x7F) trace_text += char(ch); else trace_text.append(ascii3[ch & 0xFF]); } fclose(logfile); size_t p1 = trace_text.find("UploadFile returns 0"); size_t p2 = trace_text.find("Final Status: Success"); if ((p1 == std::string::npos) && (p2 == std::string::npos)) { tracefile_timeout--; if (!tracefile_timeout) { LOG_ERROR("%s", "TQSL trace file failed!"); if (progdefaults.lotw_quiet_mode) { std::string alert; alert.assign(_("LoTW upload error!")); alert.append(_("\nView LoTW trace log:\n")); alert.append(lotw_log_fname); if (!lotw_alert_window) lotw_alert_window = new notify_dialog; lotw_alert_window->notify(alert.c_str(), 15.0); REQ(show_notifier, lotw_alert_window); } restore_lotwsdates(); clear_lotw_recs_sent(); return; } Fl::repeat_timeout(1.0, check_lotw_log); return; } if (progdefaults.lotw_quiet_mode && progdefaults.lotw_show_delivery) { if (!lotw_alert_window) lotw_alert_window = new notify_dialog; std::string alert; alert.assign(_("LoTW upload OK")); if (p2 != std::string::npos) { alert.append("\n").append(trace_text.substr(p2)); p1 = alert.find(""); if (p1 != std::string::npos) alert.erase(p1); } lotw_alert_window->notify(alert.c_str(), 5.0); REQ(show_notifier, lotw_alert_window); LOG_INFO("%s", alert.c_str()); } if (progdefaults.xml_logbook) xml_update_lotw(); clear_lotw_recs_sent(); return; } void send_to_lotw(void *) { if (progdefaults.lotw_pathname.empty()) return; if (str_lotw.empty()) return; lotw_send_fname = LoTWDir; lotw_send_fname.append("fldigi_lotw_").append(zdate()); lotw_send_fname.append("_").append(ztime()); lotw_send_fname.append(".adi"); std::ofstream outfile(lotw_send_fname.c_str()); outfile << str_lotw; outfile.close(); str_lotw.clear(); lotw_log_fname = LoTWDir; lotw_log_fname.append("lotw_trace.txt"); // LoTW trace file rotate_log(lotw_log_fname); remove(lotw_log_fname.c_str()); std::string pstring; pstring.assign("\"").append(progdefaults.lotw_pathname).append("\""); pstring.append(" -d -u -a compliant"); if (progdefaults.submit_lotw_password) pstring.append(" -p \"").append(progdefaults.lotw_pwd).append("\""); if (!progdefaults.lotw_location.empty()) pstring.append(" -l \"").append(progdefaults.lotw_location).append("\""); pstring.append(" -t \"").append(lotw_log_fname).append("\""); pstring.append(" \"").append(lotw_send_fname).append("\""); if (progdefaults.lotw_quiet_mode) pstring.append(" -q"); LOG_DEBUG("LoTW command std::string: %s", pstring.c_str()); start_process(pstring); tracefile_timeout = progdefaults.tracefile_timeout; Fl::add_timeout(0, check_lotw_log); } std::string lotw_rec(cQsoRec &rec) { std::string temp; std::string strrec; putadif(CALL, rec.getField(CALL), strrec); putadif(ADIF_MODE, adif2export(rec.getField(ADIF_MODE)).c_str(), strrec); std::string sm = adif2submode(rec.getField(ADIF_MODE)); if (!sm.empty()) putadif(SUBMODE, sm.c_str(), strrec); temp = rec.getField(FREQ); temp.resize(7); putadif(FREQ, temp.c_str(), strrec); putadif(QSO_DATE, rec.getField(QSO_DATE), strrec); putadif(BAND, rec.getField(BAND), strrec); temp = rec.getField(TIME_ON); if (temp.length() > 4) temp.erase(4); putadif(TIME_ON, temp.c_str(), strrec); strrec.append("\n"); return strrec; } void submit_lotw(cQsoRec &rec) { std::string adifrec = lotw_rec(rec); if (adifrec.empty()) return; if (progdefaults.submit_lotw) { if (str_lotw.empty()) str_lotw = "Fldigi LoTW upload file\n2.2.7\n\n"; str_lotw.append(adifrec); Fl::awake(send_to_lotw); } } void submit_ADIF(cQsoRec &rec) { adif.erase(); putadif(QSO_DATE, rec.getField(QSO_DATE)); putadif(TIME_ON, rec.getField(TIME_ON)); putadif(QSO_DATE_OFF, rec.getField(QSO_DATE_OFF)); putadif(TIME_OFF, rec.getField(TIME_OFF)); putadif(CALL, rec.getField(CALL)); putadif(FREQ, rec.getField(FREQ)); putadif(ADIF_MODE, adif2export(rec.getField(ADIF_MODE)).c_str()); std::string sm = adif2submode(rec.getField(ADIF_MODE)); if (!sm.empty()) putadif(SUBMODE, sm.c_str()); putadif(RST_SENT, rec.getField(RST_SENT)); putadif(RST_RCVD, rec.getField(RST_RCVD)); putadif(TX_PWR, rec.getField(TX_PWR)); putadif(NAME, rec.getField(NAME)); putadif(QTH, rec.getField(QTH)); putadif(STATE, rec.getField(STATE)); putadif(VE_PROV, rec.getField(VE_PROV)); putadif(COUNTRY, rec.getField(COUNTRY)); putadif(GRIDSQUARE, rec.getField(GRIDSQUARE)); putadif(STX, rec.getField(STX)); putadif(SRX, rec.getField(SRX)); putadif(XCHG1, rec.getField(XCHG1)); putadif(MYXCHG, rec.getField(MYXCHG)); putadif(TEN_TEN, rec.getField(TEN_TEN)); notes = rec.getField(NOTES); for (size_t i = 0; i < notes.length(); i++) if (notes[i] == '\n') notes[i] = ';'; putadif(NOTES, notes.c_str()); // these fields will always be blank unless they are added to the main // QSO log area. putadif(IOTA, rec.getField(IOTA)); putadif(DXCC, rec.getField(DXCC)); putadif(QSL_VIA, rec.getField(QSL_VIA)); putadif(QSLRDATE, rec.getField(QSLRDATE)); putadif(QSLSDATE, rec.getField(QSLSDATE)); putadif(EQSLRDATE, rec.getField(EQSLRDATE)); putadif(EQSLSDATE, rec.getField(EQSLSDATE)); putadif(LOTWRDATE, rec.getField(LOTWRDATE)); putadif(LOTWSDATE, rec.getField(LOTWSDATE)); writeADIF(); } //--------------------------------------------------------------------- // the following IPC message is compatible with xlog remote data spec. //--------------------------------------------------------------------- #if !defined(__WOE32__) && !defined(__APPLE__) #define addtomsg(x, y) log_msg = log_msg + (x) + (y) + LOG_MSEPARATOR static void send_IPC_log(cQsoRec &rec) { msgtype msgbuf; const char LOG_MSEPARATOR[2] = {1,0}; int msqid, len; int mm, dd, yyyy; char szdate[9]; char sztime[5]; strncpy(szdate, rec.getField(QSO_DATE), 8); szdate[8] = 0; sscanf(&szdate[6], "%d", &dd); szdate[6] = 0; sscanf(&szdate[4], "%d", &mm); szdate[4] = 0; sscanf(szdate, "%d", &yyyy); Date logdate(mm, dd, yyyy); log_msg.clear(); log_msg = std::string("program:") + PACKAGE_NAME + std::string(" v ") + PACKAGE_VERSION + LOG_MSEPARATOR; addtomsg("version:", LOG_MVERSION); addtomsg("date:", logdate.szDate(5)); memset(sztime, 0, sizeof(sztime) / sizeof(char)); strncpy(sztime, rec.getField(TIME_ON), (sizeof(sztime) / sizeof(char)) - 1); addtomsg("TIME:", sztime); memset(sztime, 0, 5); strncpy(sztime, rec.getField(TIME_OFF), 4); addtomsg("endtime:", sztime); addtomsg("call:", rec.getField(CALL)); addtomsg("mhz:", rec.getField(FREQ)); addtomsg("mode:", adif2export(rec.getField(ADIF_MODE))); std::string sm = adif2submode(rec.getField(ADIF_MODE)); if (!sm.empty()) addtomsg("submode:", sm.c_str()); addtomsg("tx:", rec.getField(RST_SENT)); addtomsg("rx:", rec.getField(RST_RCVD)); addtomsg("name:", rec.getField(NAME)); addtomsg("qth:", rec.getField(QTH)); addtomsg("state:", rec.getField(STATE)); addtomsg("province:", rec.getField(VE_PROV)); addtomsg("country:", rec.getField(COUNTRY)); addtomsg("locator:", rec.getField(GRIDSQUARE)); addtomsg("serialout:", rec.getField(STX)); addtomsg("serialin:", rec.getField(SRX)); addtomsg("free1:", rec.getField(XCHG1)); notes = rec.getField(NOTES); for (size_t i = 0; i < notes.length(); i++) if (notes[i] == '\n') notes[i] = ';'; addtomsg("notes:", notes.c_str()); addtomsg("power:", rec.getField(TX_PWR)); strncpy(msgbuf.mtext, log_msg.c_str(), sizeof(msgbuf.mtext)); msgbuf.mtext[sizeof(msgbuf.mtext) - 1] = '\0'; if ((msqid = msgget(LOG_MKEY, 0666 | IPC_CREAT)) == -1) { LOG_PERROR("msgget"); return; } msgbuf.mtype = LOG_MTYPE; len = strlen(msgbuf.mtext) + 1; if (msgsnd(msqid, &msgbuf, len, IPC_NOWAIT) < 0) LOG_PERROR("msgsnd"); } #endif void submit_record(cQsoRec &rec) { #if !defined(__WOE32__) && !defined(__APPLE__) send_IPC_log(rec); #endif submit_ADIF(rec); if (progdefaults.submit_lotw) submit_lotw(rec); if (progdefaults.eqsl_when_logged) submit_eQSL(rec, ""); if (progdefaults.EnCloudlog) submit_cloudlog(rec); n3fjp_add_record(rec); } //--------------------------------------------------------------------- extern void xml_add_record(); void submit_log(void) { if (progdefaults.spot_when_logged) { if (!dxcluster_viewer->visible()) dxcluster_viewer->show(); send_DXcluster_spot(); } if (progdefaults.pskrep_log) spot_log( inpCall->value(), inpLoc->value()); logmode = mode_info[active_modem->get_mode()].adif_name; if (progdefaults.xml_logbook && qsodb.isdirty()) { xml_add_record(); qsodb.isdirty(0); } else AddRecord(); if (FD_logged_on) FD_add_record(); // if (progdefaults.eqsl_when_logged) // makeEQSL(""); } //====================================================================== // thread to support sending log entry to eQSL //====================================================================== pthread_t* EQSLthread = 0; pthread_mutex_t EQSLmutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t EQSLcond = PTHREAD_COND_INITIALIZER; static void *EQSL_loop(void *args); static void EQSL_init(void); void EQSL_close(void); void EQSL_send(); static std::string EQSL_url = ""; static std::string SEND_url = ""; static std::string EQSL_xmlpage = ""; static bool EQSLEXIT = false; static notify_dialog *eqsl_alert_window = 0; void update_eQSL_fields(void *) { std::string call; std::string date; std::string mode = "MODE"; size_t p = EQSL_url.find("", p); if (p == std::string::npos) return; p++; size_t p2 = EQSL_url.find("<", p); if (p2 == std::string::npos) return; call = EQSL_url.substr(p, p2 - p); p = EQSL_url.find("", p); if (p == std::string::npos) return; p++; p2 = EQSL_url.find("<", p); if (p2 == std::string::npos) return; date = EQSL_url.substr(p, p2 - p); p = EQSL_url.find("", p); if (p != std::string::npos) { p2 = EQSL_url.find("<", ++p); if (p2 != std::string::npos) mode = EQSL_url.substr(p, p2 - p); } } p = EQSL_url.find("", p); if (p != std::string::npos) { p2 = EQSL_url.find("<", ++p); if (p2 != std::string::npos) { std::string submode = EQSL_url.substr(p, p2 - p); if (!submode.empty()) mode = submode; } } } inpEQSLsentdate_log->value(date.c_str()); if (progdefaults.xml_logbook) xml_update_eqsl(); else updateRecord(); std::string qsl_logged = "eQSL logged: "; qsl_logged.append(call).append(" on ").append(mode); if (progdefaults.eqsl_show_delivery) { if (!eqsl_alert_window) eqsl_alert_window = new notify_dialog; eqsl_alert_window->notify(qsl_logged.c_str(), 5.0); REQ(show_notifier, eqsl_alert_window); } LOG_INFO("%s", qsl_logged.c_str()); } static void cannot_connect_to_eqsl(void *) { std::string msg = "Cannot connect to www.eQSL.cc"; if (!eqsl_alert_window) eqsl_alert_window = new notify_dialog; eqsl_alert_window->notify(msg.c_str(), 5.0); REQ(show_notifier, eqsl_alert_window); } static void eqsl_error(void *) { size_t p = EQSL_xmlpage.find("Error:"); size_t p2 = EQSL_xmlpage.find('\n', p); std::string errstr = "eQSL error:"; errstr.append("testing 1.2.3"); errstr.append(EQSL_xmlpage.substr(p, p2 - p - 1)); errstr.append("\n").append(EQSL_url.substr(0,40)); if (!eqsl_alert_window) eqsl_alert_window = new notify_dialog; eqsl_alert_window->notify(errstr.c_str(), 5.0); REQ(show_notifier, eqsl_alert_window); LOG_ERROR("%s", errstr.c_str()); } static void *EQSL_loop(void *args) { SET_THREAD_ID(EQSL_TID); SET_THREAD_CANCEL(); for (;;) { TEST_THREAD_CANCEL(); pthread_mutex_lock(&EQSLmutex); pthread_cond_wait(&EQSLcond, &EQSLmutex); pthread_mutex_unlock(&EQSLmutex); if (EQSLEXIT) return NULL; size_t p; if (get_http(SEND_url, EQSL_xmlpage, 5.0) <= 0) { REQ(cannot_connect_to_eqsl, (void *)0); } else if ((p = EQSL_xmlpage.find("Error:")) != std::string::npos) { REQ(eqsl_error, (void *)0); } else { REQ(update_eQSL_fields, (void *)0); } } return NULL; } void EQSL_close(void) { ENSURE_THREAD(FLMAIN_TID); if (!EQSLthread) return; CANCEL_THREAD(*EQSLthread); pthread_mutex_lock(&EQSLmutex); EQSLEXIT = true; pthread_cond_signal(&EQSLcond); pthread_mutex_unlock(&EQSLmutex); pthread_join(*EQSLthread, NULL); delete EQSLthread; EQSLthread = 0; } static void EQSL_init(void) { ENSURE_THREAD(FLMAIN_TID); if (EQSLthread) return; EQSLthread = new pthread_t; EQSLEXIT = false; if (pthread_create(EQSLthread, NULL, EQSL_loop, NULL) != 0) { LOG_PERROR("pthread_create"); return; } MilliSleep(10); } void submit_eQSL(cQsoRec &rec, std::string msg) { std::string eQSL_data; std::string tempstr; char sztemp[100]; eQSL_data = "upload 4.0 "; snprintf(sztemp, sizeof(sztemp),"%s%s", static_cast(progdefaults.eqsl_id.length()), ucasestr(progdefaults.eqsl_id).c_str(), static_cast(progdefaults.eqsl_pwd.length()), progdefaults.eqsl_pwd.c_str()); eQSL_data.append(sztemp); eQSL_data.append("FLDIGI"); if (!progdefaults.eqsl_nick.empty()) { snprintf(sztemp, sizeof(sztemp), "%s", static_cast(progdefaults.eqsl_nick.length()), progdefaults.eqsl_nick.c_str()); eQSL_data.append(sztemp); } putadif(CALL, rec.getField(CALL), eQSL_data); putadif(ADIF_MODE, adif2export(rec.getField(ADIF_MODE)).c_str(), eQSL_data); std::string sm = adif2submode(rec.getField(ADIF_MODE)); if (!sm.empty()) putadif(SUBMODE, sm.c_str(), eQSL_data); tempstr = rec.getField(FREQ); tempstr.resize(7); putadif(FREQ, tempstr.c_str(), eQSL_data); putadif(BAND, rec.getField(BAND), eQSL_data); putadif(QSO_DATE, sDate_on.c_str(), eQSL_data); tempstr = rec.getField(TIME_ON); if (tempstr.length() > 4) tempstr.erase(4); putadif(TIME_ON, tempstr.c_str(), eQSL_data); putadif(RST_SENT, rec.getField(RST_SENT), eQSL_data); size_t p = 0; if (msg.empty()) msg = progdefaults.eqsl_default_message; if (!msg.empty()) { // replace message tags {CALL}, {NAME}, {MODE} while ((p = msg.find("{CALL}")) != std::string::npos) msg.replace(p, 6, inpCall->value()); while ((p = msg.find("{NAME}")) != std::string::npos) msg.replace(p, 6, inpName->value()); while ((p = msg.find("{MODE}")) != std::string::npos) { tempstr.assign(mode_info[active_modem->get_mode()].export_mode); sm = mode_info[active_modem->get_mode()].export_submode; if (!sm.empty()) tempstr.append("/").append(sm); msg.replace(p, 6, tempstr); } snprintf(sztemp, sizeof(sztemp), "%s", static_cast(msg.length()), msg.c_str()); eQSL_data.append(sztemp); } eQSL_data.append("\n"); std::string eQSL_header = progdefaults.eqsl_www_url; EQSL_url.assign(eQSL_header).append(eQSL_data); tempstr.clear(); for (size_t n = 0; n < eQSL_data.length(); n++) { if (eQSL_data[n] == ' ' || eQSL_data[n] == '\n') tempstr.append("%20"); else if (eQSL_data[n] == '<') tempstr.append("%3C"); else if (eQSL_data[n] == '>') tempstr.append("%3E"); else if (eQSL_data[n] == '_') tempstr.append("%5F"); else if (eQSL_data[n] == ':') tempstr.append("%3A"); else if (eQSL_data[n] > ' ' && eQSL_data[n] <= '}') tempstr += eQSL_data[n]; } eQSL_data = eQSL_header; eQSL_data.append(tempstr); sendEQSL(eQSL_data.c_str()); } void sendEQSL(const char *url) { ENSURE_THREAD(FLMAIN_TID); if (!EQSLthread) EQSL_init(); pthread_mutex_lock(&EQSLmutex); SEND_url = url; pthread_cond_signal(&EQSLcond); pthread_mutex_unlock(&EQSLmutex); } // this function may be called from several places including macro // expansion and execution void makeEQSL(const char *message) { cQsoRec *rec; if (qsodb.nbrRecs() <= 0) return; bool rev = progStatus.logbook_reverse; qsodb.reverse = false; qsodb.SortByDate(progdefaults.sort_date_time_off); rec = qsodb.getRec(qsodb.nbrRecs() - 1); // last record submit_eQSL(*rec, message); extern sorttype lastsort; switch (lastsort) { case SORTCALL : cQsoDb::reverse = rev; qsodb.SortByCall(); break; case SORTDATE : cQsoDb::reverse = rev; qsodb.SortByDate(progdefaults.sort_date_time_off); break; case SORTFREQ : cQsoDb::reverse = rev; qsodb.SortByFreq(); break; case SORTMODE : cQsoDb::reverse = rev; qsodb.SortByMode(); break; default: break; } } void submit_cloudlog(cQsoRec &rec) { std::string cloudlog_data; std::string tempstr; cloudlog_data = ""; putadif(CALL, rec.getField(CALL), cloudlog_data); putadif(ADIF_MODE, adif2export(rec.getField(ADIF_MODE)).c_str(), cloudlog_data); std::string sm = adif2submode(rec.getField(ADIF_MODE)); if (!sm.empty()) putadif(SUBMODE, sm.c_str(), cloudlog_data); tempstr = rec.getField(FREQ); tempstr.resize(7); size_t p = 0; if ((p = tempstr.find(",")) != std::string::npos) tempstr.replace(p, 1, "."); putadif(FREQ, tempstr.c_str(), cloudlog_data); putadif(BAND, rec.getField(BAND), cloudlog_data); putadif(QSO_DATE, sDate_on.c_str(), cloudlog_data); tempstr = rec.getField(TIME_ON); if (tempstr.length() > 4) tempstr.erase(4); putadif(TIME_ON, tempstr.c_str(), cloudlog_data); putadif(QSO_DATE_OFF, rec.getField(QSO_DATE_OFF), cloudlog_data); putadif(TIME_OFF, rec.getField(TIME_OFF), cloudlog_data); putadif(GRIDSQUARE, rec.getField(GRIDSQUARE), cloudlog_data); putadif(NAME, rec.getField(NAME), cloudlog_data); putadif(QTH, rec.getField(QTH), cloudlog_data); putadif(STATE, rec.getField(STATE), cloudlog_data); putadif(VE_PROV, rec.getField(VE_PROV), cloudlog_data); putadif(COUNTRY, rec.getField(COUNTRY), cloudlog_data); putadif(RST_SENT, rec.getField(RST_SENT), cloudlog_data); putadif(RST_RCVD, rec.getField(RST_RCVD), cloudlog_data); putadif(STX, rec.getField(STX), cloudlog_data); putadif(SRX, rec.getField(SRX), cloudlog_data); cloudlog_data.append(""); tempstr.clear(); std::string cloudlogUrl = progdefaults.cloudlog_api_url; cloudlogUrl = cloudlogUrl + "/index.php/api/qso"; std::string cloudlogApiKey = progdefaults.cloudlog_api_key; int cloudlogStationId = progdefaults.cloudlog_station_id; post_http(cloudlogUrl.c_str(), cloudlogApiKey.c_str(), cloudlogStationId, cloudlog_data.c_str(), EQSL_xmlpage, 5.0); } fldigi-4.2.05/src/logger/rx_extract.cxx0000664000175000017500000003300014611711171014734 00000000000000// ---------------------------------------------------------------------------- // rx_extract.cxx extract delineated data stream to file // // Copyright 2009 W1HKJ, Dave Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "fileselect.h" #include "gettext.h" #include "rx_extract.h" #include "main.h" #include "status.h" #include "fl_digi.h" #include "configuration.h" #include "confdialog.h" #include "debug.h" #include "icons.h" #include "qrunner.h" #include "timeops.h" #include "xmlrpc.h" #include "audio_alert.h" static const char *wrap_beg = "[WRAP:beg]"; static const char *wrap_end = "[WRAP:end]"; static const char *flmsg = ""; static const char flamp_beg[] = ">FLAMP"; static const char flamp_end[] = ":EOT}"; #ifdef __WIN32__ const char *txtWrapInfo = _("\ Detect the occurance of [WRAP:beg] and [WRAP:end]\n\ Save tags and all enclosed text to date-time stamped file, ie:\n\ NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap"); #else const char *txtWrapInfo = _("\ Detect the occurance of [WRAP:beg] and [WRAP:end]\n\ Save tags and all enclosed text to date-time stamped file, ie:\n\ ~/.nbems/WRAP/recv/extract-20090127-092515.wrap"); #endif #define bufsize 64 std::string rx_extract_buff; std::string rx_buff; std::string rx_extract_msg; bool extract_wrap = false; bool extract_flamp = false; bool extract_arq = false; bool bInit = false; char dttm[64]; void rx_extract_reset() { rx_buff.clear(); rx_extract_buff.assign(' ', bufsize); extract_wrap = false; extract_flamp = false; extract_arq = false; put_status(""); } void rx_extract_timer(void *) { rx_extract_msg = "Extract timed out"; put_status(rx_extract_msg.c_str(), 20, STATUS_CLEAR); rx_extract_reset(); if (trx_state != STATE_RX) return; if (audio_alert && progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT) audio_alert->alert(progdefaults.RX_EXTRACT_TIMED_OUT); } void rx_add_timer() { Fl::add_timeout(progdefaults.extract_timeout, rx_extract_timer, NULL); } void rx_remove_timer() { Fl::remove_timeout(rx_extract_timer); } void invoke_flmsg() { std::string cmd = progdefaults.flmsg_pathname; REQ(rx_remove_timer); struct tm tim; time_t t; time(&t); gmtime_r(&t, &tim); strftime(dttm, sizeof(dttm), "%Y%m%d-%H%M%S", &tim); std::string outfilename = FLMSG_WRAP_recv_dir; outfilename.append("extract-"); outfilename.append(dttm); outfilename.append(".wrap"); std::ofstream extractstream(outfilename.c_str(), std::ios::binary); if (extractstream) { extractstream << rx_buff; extractstream.close(); } rx_extract_msg = "File saved in "; rx_extract_msg.append(FLMSG_WRAP_recv_dir); put_status(rx_extract_msg.c_str(), 20, STATUS_CLEAR); if (trx_state != STATE_RX) return; if (audio_alert && progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD) audio_alert->alert(progdefaults.RX_EXTRACT_MSG_RCVD); if (flmsg_is_online && progdefaults.flmsg_transfer_direct) { guard_lock autolock(server_mutex); flmsg_data.append(rx_buff); return; } if (progdefaults.open_nbems_folder) open_recv_folder(FLMSG_WRAP_recv_dir.c_str()); if ((progdefaults.open_flmsg || progdefaults.open_flmsg_print) && (rx_buff.find(flmsg) != std::string::npos) && !progdefaults.flmsg_pathname.empty()) { #ifdef __MINGW32__ cmd.append(" -title ").append(dttm); cmd.append(" --flmsg-dir ").append("\"").append(FLMSG_dir).append("\""); if (progdefaults.open_flmsg_print && progdefaults.open_flmsg) cmd.append(" --b"); else if (progdefaults.open_flmsg_print) cmd.append(" --p"); cmd.append(" \"").append(outfilename).append("\""); char *cmdstr = strdup(cmd.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess( NULL, cmdstr, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free (cmdstr); #else std::string params = ""; static std::string ap[10];// = cmd;//""; std::string param = ""; size_t p = cmd.find(" -"); if (p != std::string::npos) { param.assign(cmd.substr(p)); cmd = cmd.substr(0,p); } for (int i = 0; i < 10; i++) ap[i].clear(); int n = 0; ap[n++] = "-title"; ap[n++] = dttm; ap[n++] = "--flmsg-dir"; ap[n++] = FLMSG_dir; if (progdefaults.open_flmsg_print && progdefaults.open_flmsg) ap[n++] = " --b";//params = " --b"; else if (progdefaults.open_flmsg_print) ap[n++] = " --p";//params = " --p"; ap[n++] = outfilename; switch (fork()) { case 0: # ifndef NDEBUG unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); # endif switch (n) { case 1: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)0); break; case 2: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)0); break; case 3: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)0); break; case 4: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)0); break; case 5: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)0); break; case 6: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)0); break; case 7: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)0); break; case 8: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)ap[7].c_str(), (char*)0); break; case 9: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)ap[7].c_str(), (char*)ap[8].c_str(), (char*)0); break; case 10: execlp( (char*)cmd.c_str(), (char*)cmd.c_str(), (char*)ap[0].c_str(), (char*)ap[1].c_str(), (char*)ap[2].c_str(), (char*)ap[3].c_str(), (char*)ap[4].c_str(), (char*)ap[5].c_str(), (char*)ap[6].c_str(), (char*)ap[7].c_str(), (char*)ap[8].c_str(), (char*)ap[9].c_str(), (char*)0); break; default : ; } exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not start flmsg")); } #endif } } void start_flmsg() { std::string cmd = progdefaults.flmsg_pathname; #ifdef __MINGW32__ char *cmdstr = strdup(cmd.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess( NULL, cmdstr, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free (cmdstr); #else switch (fork()) { case 0: execlp((char*)cmd.c_str(), (char*)cmd.c_str(), (char*)0, (char*)0); exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not start flmsg")); default: ; } #endif } void rx_extract_add(int c) { if (!c) return; check_nbems_dirs(); if (!bInit) { rx_extract_reset(); bInit = true; } char ch = (char)c; rx_extract_buff = rx_extract_buff.substr(1); rx_extract_buff += ch; // rx_extract_buff must contain in order: // ~1c - arq_soh + connect request // ; - arq_dle character // ~4 - arq_eoh // before auto starting flmsg size_t p1 = rx_extract_buff.find("~1c"); size_t p2 = rx_extract_buff.find(";"); size_t p3 = rx_extract_buff.find("~4"); if ( (p1 != std::string::npos) && (p2 != std::string::npos) && (p3 != std::string::npos) && (p1 < p2) && (p2 < p3)) { if (!flmsg_is_online) start_flmsg(); rx_extract_buff.assign(' ', bufsize); return; } if (!extract_arq && (rx_extract_buff.find("ARQ:FILE::FLMSG_XFR") != std::string::npos) ) { extract_arq = true; REQ(rx_remove_timer); REQ(rx_add_timer); rx_extract_buff.assign(' ', bufsize); rx_extract_msg = "Extracting ARQ msg"; put_status(rx_extract_msg.c_str()); return; } else if (extract_arq) { REQ(rx_remove_timer); REQ(rx_add_timer); if (rx_extract_buff.find("ARQ::ETX")) rx_extract_reset(); return; } else if (!extract_flamp && (rx_extract_buff.find(flamp_beg) != std::string::npos) ) { extract_flamp = true; rx_extract_buff.assign(' ', bufsize); rx_extract_msg = "Extracting FLAMP"; put_status(rx_extract_msg.c_str()); return; } else if (extract_flamp) { REQ(rx_remove_timer); REQ(rx_add_timer); if (rx_extract_buff.find(flamp_end) != std::string::npos) rx_extract_reset(); return; } else if (!extract_wrap && (rx_extract_buff.find(wrap_beg) != std::string::npos) ) { rx_buff.assign(wrap_beg); rx_extract_msg = "Extracting WRAP/FLMSG"; put_status(rx_extract_msg.c_str()); extract_wrap = true; REQ(rx_remove_timer); REQ(rx_add_timer); return; } else if (extract_wrap) { rx_buff += ch; REQ(rx_remove_timer); REQ(rx_add_timer); if (rx_extract_buff.find(wrap_end) != std::string::npos) { invoke_flmsg(); rx_extract_reset(); } } } void select_flmsg_pathname() { txt_flmsg_pathname->value(progdefaults.flmsg_pathname.c_str()); txt_flmsg_pathname->redraw(); #ifdef __APPLE__ open_recv_folder("/Applications/"); return; #else std::string deffilename = progdefaults.flmsg_pathname; # ifdef __MINGW32__ if (deffilename.empty()) deffilename = "C:\\Program Files\\"; const char *p = FSEL::select(_("Locate flmsg executable"), _("flmsg.exe\t*.exe"), deffilename.c_str()); # else if (deffilename.empty()) deffilename = "/usr/local/bin/"; const char *p = FSEL::select(_("Locate flmsg executable"), _("flmsg\t*"), deffilename.c_str()); # endif if (!p) return; if (!*p) return; progdefaults.flmsg_pathname = p; progdefaults.changed = true; txt_flmsg_pathname->value(p); #endif } // this only works on Linux and Unix // not Windoze or // OS X to find binaries in the /Applications/ directory structure bool find_pathto_exectable(std::string &binpath, std::string executable) { size_t endindex = 0; binpath.clear(); // Get the PATH environment variable as pointer to std::string // The std::strings in the environment list are of the form name=value. // As typically implemented, getenv() returns a pointer to a std::string within // the environment list. The caller must take care not to modify this std::string, // since that would change the environment of the process. // // The implementation of getenv() is not required to be reentrant. The std::string // pointed to by the return value of getenv() may be statically allocated, and // can be modified by a subsequent call to getenv(), putenv(3), setenv(3), or // unsetenv(3). char *environment = getenv("PATH"); if (environment == NULL) return false; std::string env = environment; std::string testpath = ""; char endchar = ':'; // Parse single PATH std::string into directories while (!env.empty()) { endindex = env.find(endchar); testpath = env.substr(0, endindex); testpath.append("/"); // insert linux, unix, osx OS-correct delimiter testpath.append(executable); // append executable name // Most portable way to check if a file exists: Try to open it. FILE *checkexists = NULL; checkexists = fl_fopen( testpath.c_str(), "r" ); // try to open file readonly if (checkexists) { // if the file successfully opened, it exists. fclose(checkexists); binpath = testpath; return true; } if (endindex == std::string::npos) env.clear(); else env.erase(0, endindex + 1); } return false; } std::string select_binary_pathname(std::string deffilename) { #ifdef __APPLE__ open_recv_folder("/Applications/"); return ""; #else # ifdef __MINGW32__ deffilename = "C:\\Program Files\\"; const char *p = FSEL::select(_("Locate executable"), _("*.exe"), deffilename.c_str()); # else deffilename = "/usr/local/bin/"; const char *p = FSEL::select(_("Locate binary"), _("*"), deffilename.c_str()); # endif std::string executable = ""; if (p && *p) executable = p; // do not allow recursion !! if (executable.find("fldigi") != std::string::npos) return ""; return executable; #endif } fldigi-4.2.05/src/throb/0000775000175000017500000000000014611714005011747 500000000000000fldigi-4.2.05/src/throb/throb.cxx0000664000175000017500000004657314611711171013551 00000000000000// ---------------------------------------------------------------------------- // throb.cxx -- throb modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // ThrobX additions by Joe Veldhuis, KD8ATU // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "throb.h" #include "ascii.h" #include "configuration.h" #include "fl_digi.h" #include "status.h" #define MAX_TONES 15 #undef CLAMP #define CLAMP(x,low,high) (((x)>(high))?(high):(((x)<(low))?(low):(x))) char throbmsg[80]; void throb::tx_init() { preamble = 4; reset_syms(); videoText(); } void throb::rx_init() { rxcntr = rxsymlen; waitsync = 1; deccntr = 0; symptr = 0; shift = 0; lastchar = '\0'; reset_syms(); put_MODEstatus(mode); } void throb::init() { modem::init(); rx_init(); set_scope_mode(Digiscope::SCOPE); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } throb::~throb() { if (hilbert) delete hilbert; if (syncfilt) delete syncfilt; if (fftfilter) delete fftfilter; if (snfilter) delete snfilter; if (scope_data) delete [] scope_data; if (txpulse) delete [] txpulse; if (outbuf) delete[] outbuf; for (int i = 0; i < num_tones; i++) if (rxtone[i]) delete [] rxtone[i]; } void throb::flip_syms() //call this whenever a space or idle is sent or received { switch(mode) { case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: if (idlesym == 0) { idlesym = 1; spacesym = 0; } else { idlesym = 0; spacesym = 1; } break; default: //if we're not running a ThrobX mode, do nothing break; } } void throb::reset_syms() //call when switching from TX to RX or vice versa { switch(mode) { case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: idlesym = 0; spacesym = 1; break; default: //paranoia idlesym = 0; spacesym = 44; break; } } throb::throb(trx_mode throb_mode) : modem() { cap |= CAP_AFC | CAP_REV; double bw; double *fp = 0; mode = throb_mode; switch (mode) { case MODE_THROB1: symlen = SYMLEN_1; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 9; num_chars = 45; idlesym = 0; spacesym = 44; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobToneFreqsNar[i]; bw = 36.0 / THROB_SAMPLE_RATE; break; case MODE_THROB2: symlen = SYMLEN_2; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 9; num_chars = 45; idlesym = 0; spacesym = 44; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobToneFreqsNar[i]; bw = 36.0 / THROB_SAMPLE_RATE; break; case MODE_THROB4: default: symlen = SYMLEN_4; txpulse = mk_full_pulse(symlen); fp = mk_full_pulse(symlen / DOWN_SAMPLE); num_tones = 9; num_chars = 45; idlesym = 0; spacesym = 44; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobToneFreqsWid[i]; bw = 72.0 / THROB_SAMPLE_RATE; break; case MODE_THROBX1: symlen = SYMLEN_1; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 11; num_chars = 55; idlesym = 0; spacesym = 1; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobXToneFreqsNar[i]; bw = 47.0 / THROB_SAMPLE_RATE; break; case MODE_THROBX2: symlen = SYMLEN_2; txpulse = mk_semi_pulse(symlen); fp = mk_semi_pulse(symlen / DOWN_SAMPLE); num_tones = 11; num_chars = 55; idlesym = 0; spacesym = 1; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobXToneFreqsNar[i]; bw = 47.0 / THROB_SAMPLE_RATE; break; case MODE_THROBX4: //NONSTANDARD symlen = SYMLEN_4; txpulse = mk_full_pulse(symlen); fp = mk_full_pulse(symlen / DOWN_SAMPLE); num_tones = 11; num_chars = 55; idlesym = 0; spacesym = 1; for (int i = 0; i < num_tones; i++) freqs[i] = ThrobXToneFreqsWid[i]; bw = 94.0 / THROB_SAMPLE_RATE; break; } outbuf = new double[symlen]; rxsymlen = symlen / DOWN_SAMPLE; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); fftfilter = new fftfilt(0, bw, FilterFFTLen); syncfilt = new C_FIR_filter(); syncfilt->init(symlen / DOWN_SAMPLE, 1, fp, NULL); delete [] fp; snfilter = new Cmovavg(16); for (int i = 0; i < num_tones; i++) rxtone[i] = mk_rxtone(freqs[i], txpulse, symlen); reverse = 0; samplerate = THROB_SAMPLE_RATE; fragmentsize = symlen; bandwidth = freqs[num_tones - 1] - freqs[0]; syncpos = 0.5; scope_data = new double [SCOPE_DATA_LEN]; phaseacc = 0.0; metric = 0.0; symptr = 0; for (int i = 0; i < MAX_RX_SYMLEN; i++) syncbuf[i] = dispbuf[i] = 0.0; // init(); } //===================================================================== // receive processing //===================================================================== // Make a 32 times down sampled cmplx prototype tone for rx. cmplx *throb::mk_rxtone(double freq, double *pulse, int len) { cmplx *tone; double x; int i; tone = new cmplx [len / DOWN_SAMPLE]; for (i = 0; i < len; i += DOWN_SAMPLE) { x = -2.0 * M_PI * freq * i / THROB_SAMPLE_RATE; tone[i / DOWN_SAMPLE] = cmplx ( pulse[i] * cos(x), pulse[i] * sin(x) ); } return tone; } cmplx throb::mixer(cmplx in) { double f; cmplx z (cos(phaseacc), sin(phaseacc)); z = z * in; f = frequency; phaseacc -= 2.0 * M_PI * f / THROB_SAMPLE_RATE; if (phaseacc < 0) phaseacc += TWOPI; return z; } int throb::findtones(cmplx *word, int &tone1, int &tone2) { double max1, max2; int maxtone, i; max1 = 0; tone1 = 0; for (i = 0; i < num_tones; i++) { if ( abs(word[i]) > max1 ) { max1 = abs(word[i]); tone1 = i; } } maxtone = tone1; max2 = 0; tone2 = 0; for (i = 0; i < num_tones; i++) { if (i == tone1) continue; if ( abs(word[i]) > max2) { max2 = abs(word[i]); tone2 = i; } } //handle single-tone symbols (Throb only) if (mode == MODE_THROB1 || mode == MODE_THROB2 || mode == MODE_THROB4) if (max1 > max2 * 2) tone2 = tone1; if (tone1 > tone2) { i = tone1; tone1 = tone2; tone2 = i; } signal = noise = 0.0; for (i = 0; i < num_tones; i++) { if ( i == tone1 || i == tone2) signal += abs(word[i]) / 2.0; else noise += abs(word[i]) / (num_tones - 2.0); } metric = snfilter->run( signal / (noise + 1e-6)); s2n = CLAMP( 10.0*log10( metric ) - 3.0, 0.0, 100.0); return maxtone; } void throb::show_char(int c) { if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c); } void throb::decodechar(int tone1, int tone2) { int i; switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: if (shift == true) { if (tone1 == 0 && tone2 == 8) show_char('?'); if (tone1 == 1 && tone2 == 7) show_char('@'); if (tone1 == 2 && tone2 == 6) show_char('='); if (tone1 == 4 && tone2 == 4) show_char('\n'); shift = false; return; } if (tone1 == 3 && tone2 == 5) { shift = true; return; } for (i = 0; i < num_chars; i++) { if (ThrobTonePairs[i][0] == tone1 + 1 && ThrobTonePairs[i][1] == tone2 + 1) { show_char(ThrobCharSet[i]); break; } } break; //ThrobX mode. No shifted case, but idle and space symbols alternate default: for (i = 0; i < num_chars; i++) { if (ThrobXTonePairs[i][0] == tone1 + 1 && ThrobXTonePairs[i][1] == tone2 + 1) { if (i == spacesym || i == idlesym) { if (lastchar != '\0' && lastchar != ' ') { show_char(ThrobXCharSet[1]); lastchar = ' '; } else { lastchar = '\0'; } flip_syms(); } else { show_char(ThrobXCharSet[i]); lastchar = ThrobXCharSet[i]; } } } break; } return; } void throb::rx(cmplx in) { cmplx rxword[MAX_TONES]; int i, tone1, tone2, maxtone; symbol[symptr] = in; if (rxcntr > 0.0) return; // correlate against all tones for (i = 0; i < num_tones; i++) rxword[i] = cmac(rxtone[i], symbol, symptr + 1, rxsymlen); // find the strongest tones maxtone = findtones(rxword, tone1, tone2); // decode if (reverse) decodechar (num_tones - 1 - tone2, num_tones - 1 - tone1); else decodechar (tone1, tone2); if (progStatus.afconoff == true && (metric >= progStatus.sldrSquelchValue || progStatus.sqlonoff == false)) { cmplx z1, z2; double f; z1 = rxword[maxtone]; z2 = cmac(rxtone[maxtone], symbol, symptr + 2, rxsymlen); f = arg( conj(z1) * z2 ) / (2 * DOWN_SAMPLE * M_PI / THROB_SAMPLE_RATE); f -= freqs[maxtone]; set_freq(frequency + f / (num_tones - 1)); } /* done with this symbol, start over */ rxcntr = rxsymlen; waitsync = 1; snprintf(throbmsg, sizeof(throbmsg), "S/N: %3d dB", (int)(floor(s2n))); put_Status1(throbmsg); display_metric(metric); } void throb::sync(cmplx in) { double f, maxval = 0; double mag; int i, maxpos = 0; /* "rectify", filter and store input */ mag = abs(in); syncfilt->Irun( mag, f); syncbuf[symptr] = f; /* check counter if we are waiting for sync */ if (waitsync == 0 || rxcntr > (rxsymlen / 2.0)) return; for (i = 0; i < rxsymlen; i++) { f = syncbuf[(i + symptr + 1) % rxsymlen]; dispbuf[i] = f; } for (i = 0; i < rxsymlen; i++) { if (dispbuf[i] > maxval) { maxpos = i; maxval = dispbuf[i]; } } /* correct sync */ rxcntr += (maxpos - rxsymlen / 2) / (num_tones - 1); waitsync = 0; if (metric >= progStatus.sldrSquelchValue || progStatus.sqlonoff == false) set_scope(dispbuf, rxsymlen); else { dispbuf[0] = 0.0; set_scope(dispbuf, 1); } dispbuf.next(); // change buffers } int throb::rx_process(const double *buf, int len) { cmplx z, *zp; int i, n; while (len-- > 0) { z = cmplx( *buf, *buf ); buf++; hilbert->run(z, z); z = mixer(z); n = fftfilter->run(z, &zp); /* DOWN_SAMPLE by 32 and push to the receiver */ for (i = 0; i < n; i++) { if (++deccntr >= DOWN_SAMPLE) { rxcntr -= 1.0; /* do symbol sync */ sync(zp[i]); /* decode */ rx(zp[i]); symptr = (symptr + 1) % rxsymlen; deccntr = 0; } } } return 0; } //===================================================================== // transmit processing //===================================================================== double *throb::mk_semi_pulse(int len) { double *pulse, x; int i, j; pulse = new double [len]; for (i = 0; i < len; i++) { if (i < len / 5) { x = M_PI * i / (len / 5.0); pulse[i] = 0.5 * (1 - cos(x)); } if (i >= len / 5 && i < len * 4 / 5) pulse[i] = 1.0; if (i >= len * 4 / 5) { j = i - len * 4 / 5; x = M_PI * j / (len / 5.0); pulse[i] = 0.5 * (1 + cos(x)); } } return pulse; } double *throb::mk_full_pulse(int len) { double *pulse; int i; pulse = new double [len]; for (i = 0; i < len; i++) pulse[i] = 0.5 * (1 - cos(2 * M_PI * i / len)); return pulse; } void throb::send(int symbol) { int tone1, tone2; double w1, w2; int i; if (symbol < 0 || symbol >= num_chars) return; switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: tone1 = ThrobTonePairs[symbol][0] - 1; tone2 = ThrobTonePairs[symbol][1] - 1; break; default: tone1 = ThrobXTonePairs[symbol][0] -1; tone2 = ThrobXTonePairs[symbol][1] -1; break; } if (reverse) { tone1 = (num_tones - 1) - tone1; tone2 = (num_tones - 1) - tone2; } w1 = 2.0 * M_PI * (get_txfreq_woffset() + freqs[tone1]) / THROB_SAMPLE_RATE; w2 = 2.0 * M_PI * (get_txfreq_woffset() + freqs[tone2]) / THROB_SAMPLE_RATE; for (i = 0; i < symlen; i++) outbuf[i] = txpulse[i] * (sin(w1 * i) + sin(w2 * i)) / 2.0; ModulateXmtr(outbuf, symlen); } int throb::tx_process() { modem::tx_process(); int i, c, sym; if (preamble > 0) { send(idlesym); /* send idle throbs */ flip_syms(); preamble--; return 0; } c = get_tx_char(); // end of transmission if (c == GET_TX_CHAR_ETX || stopflag) { send(idlesym); // reset_syms(); //prepare RX. idle/space syms always start as 0 and 1, respectively. return -1; } // TX buffer empty if (c == GET_TX_CHAR_NODATA) { send(idlesym); /* send idle throbs */ flip_syms(); return 0; } switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: /* handle the special cases first, if we're doing regular Throb */ switch (c) { case '?': send(5); /* shift */ send(20); put_echo_char(c); return 0; case '@': send(5); /* shift */ send(13); put_echo_char(c); return 0; case '-': send(5); /* shift */ send(9); put_echo_char(c); return 0; case '\r': return 0; case '\n': send(5); /* shift */ send(0); put_echo_char(c); return 0; default: break; } break; default: //If we're doing ThrobX, no need to handle shifts break; } /* map lower case character to upper case */ if (islower(c)) c = toupper(c); /* see if the character can be found in our character set */ switch(mode) { case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: for (sym = -1, i = 0; i < num_chars; i++) if (c == ThrobCharSet[i]) sym = i; break; default: for (sym = -1, i = 0; i < num_chars; i++) if (c == ThrobXCharSet[i]) sym = i; break; } // send a space for unknown chars if (sym == -1) c = ' '; // handle spaces for throbx if (c == ' ') { sym = spacesym; flip_syms(); } send(sym); put_echo_char(progdefaults.rx_lowercase ? tolower(c) : c); return 0; } //===================================================================== // throb static declarations //===================================================================== int throb::ThrobTonePairs[45][2] = { {5, 5}, /* idle... no print */ {4, 5}, /* A */ {1, 2}, /* B */ {1, 3}, /* C */ {1, 4}, /* D */ {4, 6}, /* SHIFT (was E) */ {1, 5}, /* F */ {1, 6}, /* G */ {1, 7}, /* H */ {3, 7}, /* I */ {1, 8}, /* J */ {2, 3}, /* K */ {2, 4}, /* L */ {2, 8}, /* M */ {2, 5}, /* N */ {5, 6}, /* O */ {2, 6}, /* P */ {2, 9}, /* Q */ {3, 4}, /* R */ {3, 5}, /* S */ {1, 9}, /* T */ {3, 6}, /* U */ {8, 9}, /* V */ {3, 8}, /* W */ {3, 3}, /* X */ {2, 2}, /* Y */ {1, 1}, /* Z */ {3, 9}, /* 1 */ {4, 7}, /* 2 */ {4, 8}, /* 3 */ {4, 9}, /* 4 */ {5, 7}, /* 5 */ {5, 8}, /* 6 */ {5, 9}, /* 7 */ {6, 7}, /* 8 */ {6, 8}, /* 9 */ {6, 9}, /* 0 */ {7, 8}, /* , */ {7, 9}, /* . */ {8, 8}, /* ' */ {7, 7}, /* / */ {6, 6}, /* ) */ {4, 4}, /* ( */ {9, 9}, /* E */ {2, 7} /* space */ }; int throb::ThrobXTonePairs[55][2] = { {6, 11}, /* idle (initially) */ {1, 6}, /* space (initially) */ {2, 6}, /* A */ {2, 5}, /* B */ {2, 7}, /* C */ {2, 8}, /* D */ {5, 6}, /* E */ {2, 9}, /* F */ {2, 10}, /* G */ {4, 8}, /* H */ {4, 6}, /* I */ {2, 11}, /* J */ {3, 4}, /* K */ {3, 5}, /* L */ {3, 6}, /* M */ {6, 9}, /* N */ {6, 10}, /* O */ {3, 7}, /* P */ {3, 8}, /* Q */ {3, 9}, /* R */ {6, 8}, /* S */ {6, 7}, /* T */ {3, 10}, /* U */ {3, 11}, /* V */ {4, 5}, /* W */ {4, 7}, /* X */ {4, 9}, /* Y */ {4, 10}, /* Z */ {1, 2}, /* 1 */ {1, 3}, /* 2 */ {1, 4}, /* 3 */ {1, 5}, /* 4 */ {1, 7}, /* 5 */ {1, 8}, /* 6 */ {1, 9}, /* 7 */ {1, 10}, /* 8 */ {2, 3}, /* 9 */ {2, 4}, /* 0 */ {4, 11}, /* , */ {5, 7}, /* . */ {5, 8}, /* ' */ {5, 9}, /* / */ {5, 10}, /* ) */ {5, 11}, /* ( */ {7, 8}, /* # */ {7, 9}, /* " */ {7, 10}, /* + */ {7, 11}, /* - */ {8, 9}, /* ; */ {8, 10}, /* : */ {8, 11}, /* ? */ {9, 10}, /* ! */ {9, 11}, /* @ */ {10, 11}, /* = */ {1, 11} /* cr */ //FIXME: !!COMPLETELY NONSTANDARD!! }; unsigned char throb::ThrobCharSet[45] = { '\0', /* idle */ 'A', 'B', 'C', 'D', '\0', /* shift */ 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', '\'', '/', ')', '(', 'E', ' ' }; unsigned char throb::ThrobXCharSet[55] = { '\0', /* idle (initially) */ ' ', /* space (initially) */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', '\'', '/', ')', '(', '#', '"', '+', '-', ';', ':', '?', '!', '@', '=', '\n' }; double throb::ThrobToneFreqsNar[9] = {-32, -24, -16, -8, 0, 8, 16, 24, 32}; double throb::ThrobToneFreqsWid[9] = {-64, -48, -32, -16, 0, 16, 32, 48, 64}; double throb::ThrobXToneFreqsNar[11] = {-39.0625, -31.25, -23.4375, -15.625, -7.8125, 0, 7.8125, 15.625, 23.4375, 31.25, 39.0625}; double throb::ThrobXToneFreqsWid[11] = {-78.125, -62.5, -46.875, -31.25, -15.625, 0, 15.625, 31.25, 46.875, 62.5, 78.125}; fldigi-4.2.05/src/waterfall/0000775000175000017500000000000014611714005012612 500000000000000fldigi-4.2.05/src/waterfall/raster.cxx0000664000175000017500000001211614611711171014560 00000000000000// ---------------------------------------------------------------------------- // raster.cxx, Raster scan Widget for display of fuzzy modes // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "raster.h" #include "modem.h" #include #include #include "raster.h" #include "qrunner.h" #include "threads.h" static pthread_mutex_t raster_mutex = PTHREAD_MUTEX_INITIALIZER; bool active = false; Raster::Raster (int X, int Y, int W, int H, int rh, bool rv) : Fl_Widget (X, Y, W, H) { width = W - 4; if (width <= 0) width = 1; height = H - 4; if (height <= 0) height = 1; space = 1; rowheight = 2 * rh; rhs = rowheight + space; Nrows = 0; while ((Nrows * rhs) < height) Nrows++; Nrows--; vidbuf = new unsigned char[width * height]; _reverse = rv; if (_reverse) memset(vidbuf, 0, width * height); else memset(vidbuf, 255, width * height); col = 0; box(FL_DOWN_BOX); marquee = false; } Raster::~Raster() { delete [] vidbuf; } int Raster::change_rowheight( int rh ) { guard_lock raster_lock(&raster_mutex); while ( (2*rh+space) > height) rh--; rowheight = 2 * rh; rhs = rowheight + space; Nrows = 0; while ((Nrows * rhs) < height) Nrows++; Nrows--; if (_reverse) memset(vidbuf, 0, width * height); else memset(vidbuf, 255, width * height); col = 0; REQ_DROP(&Raster::redraw, this); return rh; } void Raster::data(int data[], int len) { guard_lock raster_lock(&raster_mutex); if (data == NULL || len == 0 || (len > rowheight)) { return; } if (marquee) { for (int row = 0; row < Nrows; row++) { int rowstart = width * rhs * row; int nextrow = width * rhs * (row + 1); for (int i = 0; i < len; i++) { memmove(vidbuf + rowstart + i*width, vidbuf + rowstart + i*width + 1, width - 1); if (row < (Nrows - 1)) { vidbuf[rowstart + i*width + width - 1] = vidbuf[nextrow + i* width]; } } } int toppixel = width * (Nrows - 1) * rhs + width - 1; for (int i = 0; i < len; i++) { vidbuf[toppixel + width * (len - i)] = (unsigned char) data[i]; } } else { int pos = 0; int zeropos = (Nrows - 1) * rhs * width; for (int i = 0; i < len; i++) { pos = zeropos + width * (len - i - 1) + col; vidbuf[pos] = (unsigned char)data[i]; } if (++col >= width) { unsigned char *from = vidbuf + rhs * width; int numtocopy = (Nrows -1) * rhs * width; memmove(vidbuf, from, numtocopy); if (_reverse) memset(vidbuf + zeropos, 0, rhs * width); else memset(vidbuf + zeropos, 255, rhs * width); col = 0; } } REQ_DROP(&Raster::redraw, this); } void Raster::clear() { guard_lock raster_lock(&raster_mutex); if (_reverse) memset(vidbuf, 0, width * height); else memset(vidbuf, 255, width * height); col = 0; REQ_DROP(&Raster::redraw, this); } void Raster::resize(int x, int y, int w, int h) { guard_lock raster_lock(&raster_mutex); if (w < 14) w = 14; if (h < (4 + rhs)) h = 4 + rhs; int Wdest = w - 4; int Hdest = h - 4; int Ndest = 0; while ((Ndest * rhs) < Hdest) Ndest++; Ndest--; unsigned char *tempbuf = new unsigned char [Wdest * Hdest]; unsigned char *oldbuf = vidbuf; if (_reverse) memset(tempbuf, 0, Wdest * Hdest); else memset(tempbuf, 255, Wdest * Hdest); int Ato = Wdest * Hdest; int Afm = width * height; if (Ato >= Afm) { } else { } int xfrcols, xfrrows; int from, to; if (Wdest >= width) xfrcols = width; else xfrcols = Wdest; if (Ndest <= Nrows) { xfrrows = Ndest * rhs; from = (Nrows - Ndest) * rhs; to = 0; for (int r = 0; r < xfrrows; r++) for (int c = 0; c < xfrcols; c++) tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c]; } else { xfrrows = Nrows * rhs; from = 0; to = (Ndest - Nrows) * rhs; for (int r = 0; r < xfrrows; r++) for (int c = 0; c < xfrcols; c++) tempbuf[(to + r) * Wdest + c] = vidbuf[(from + r) * width + c]; } width = Wdest; height = Hdest; Nrows = Ndest; vidbuf = tempbuf; delete [] oldbuf; Fl_Widget::resize(x,y,w,h); redraw(); } void Raster::draw() { draw_box(); fl_draw_image_mono( vidbuf, x() + 2, y() + 2, width, height, 1); } int Raster::handle(int event) { if (Fl::event_inside( this )) { if (event == FL_PUSH) { if (Fl::event_button() == FL_RIGHT_MOUSE) { clear(); return 1; } } } return Fl_Widget::handle(event); } fldigi-4.2.05/src/waterfall/digiscope.cxx0000664000175000017500000003031514611711171015227 00000000000000// ---------------------------------------------------------------------------- // digiscope.cxx, Miniature Oscilloscope/Phasescope Widget // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "digiscope.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "qrunner.h" Digiscope::Digiscope (int X, int Y, int W, int H, const char *label) : Fl_Widget (X, Y, W, H, label) { _phase = _quality = _flo = _fhi = _amp = 0.0; box(FL_DOWN_BOX); vidbuf = new unsigned char[ 3 * (W-4) * (H-4)]; vidline = new unsigned char[ 3 * (W-4)]; memset(vidbuf, 0, 3*(W-4)*(H-4) * sizeof(unsigned char)); memset(vidline, 0, 3 * (W-4) * sizeof(unsigned char)); _highlight = false; _len = MAX_LEN; _zptr = 0; for (int i = 0; i < NUM_GRIDS; i++) _x[i] = _y[i] = 0; _y_user1 = _y_user2 = -1; _x_user1 = _x_user2 = -1; _x_graticule = _y_graticule = false; _bk_color = FL_BLACK; _axis_color = FL_WHITE; _color_1 = FL_GREEN; _color_2 = FL_YELLOW; _color_3 = FL_CYAN; _color_4 = FL_MAGENTA; phase_mode = PHASE1; } Digiscope::~Digiscope() { if (vidbuf) delete [] vidbuf; if (vidline) delete [] vidline; } void Digiscope::video(double *data, int len , bool dir) { if (active_modem->HistoryON()) return; if (data == NULL || len == 0) return; int W = w() - 4; int H = h() - 4; for (int i = 0; i < W; i++) vidline[3*i] = vidline[3*i+1] = vidline[3*i+2] = (unsigned char)(data[i * len / W]); vidline[3*W/2] = 255; vidline[3*W/2+1] = 0; vidline[3*W/2+2] = 0; if (dir) { if (linecnt == H) { linecnt--; unsigned char *p = &vidbuf[3*W]; memmove (vidbuf, p, 3*(W * (H-1))*sizeof(unsigned char)); memcpy (&vidbuf[3*W*(H-1)], vidline, 3*W * sizeof (unsigned char)); } else memcpy (&vidbuf[3*W*linecnt], vidline, 3*W * sizeof(unsigned char)); linecnt++; } else { unsigned char *p = &vidbuf[3*W]; memmove (p, vidbuf, 3 * (W * (H-1)) * sizeof(unsigned char)); memcpy(vidbuf, vidline, 3 * W * sizeof(unsigned char)); } REQ_DROP(&Digiscope::redraw, this); } void Digiscope::zdata(cmplx *zarray, int len ) { if (active_modem->HistoryON()) return; if (zarray == NULL || len == 0) return; for (int i = 0; i < len; i++) { _zdata[_zptr++] = zarray[i]; if (_zptr == MAX_ZLEN) _zptr = 0; } REQ_DROP(&Digiscope::redraw, this); } void Digiscope::data(double *data, int len, bool scale) { if (active_modem->HistoryON()) return; if (data == 0) { memset(_buf, 0, MAX_LEN * sizeof(*_buf)); REQ_DROP(&Digiscope::redraw, this); return; } if (len == 0) return; if (len > MAX_LEN) _len = MAX_LEN; else _len = len; memcpy(_buf, data, len * sizeof(double)); if (scale) { double max = 1E-6; double min = 1E6; for (int i = 0; i < _len; i++) { max = MAX(max, _buf[i]); min = MIN(min, _buf[i]); } if (max == min) max *= 1.001; for (int i = 0; i < _len; i++) _buf[i] = (_buf[i] - min) / (max - min); } REQ_DROP(&Digiscope::redraw, this); } void Digiscope::phase(double ph, double ql, bool hl) { if (active_modem->HistoryON()) return; _phase = ph; _quality = ql; _highlight = hl; REQ_DROP(&Digiscope::redraw, this); } void Digiscope::rtty(double flo, double fhi, double amp) { if (active_modem->HistoryON()) return; _flo = flo; _fhi = fhi; _amp = amp; REQ_DROP(&Digiscope::redraw, this); } void Digiscope::mode(scope_mode md) { if (md == PHASE) { if (phase_mode >= PHASE1 && phase_mode <= PHASE3) md = phase_mode; else md = phase_mode = PHASE1; } int W = w() - 4; int H = h() - 4; _mode = md; memset(_buf, 0, MAX_LEN * sizeof(double)); linecnt = 0; memset(vidbuf, 0, 3*W*H * sizeof(unsigned char)); memset(vidline, 0, 3 * W * sizeof(unsigned char)); vidline[3*W/2] = 255; vidline[3*W/2+1] = 0; vidline[3*W/2+2] = 0; for (int i = 0; i < H; i++) memcpy(&vidbuf[3*W*i], vidline, 3*W*sizeof(unsigned char) ); REQ_DROP(&Digiscope::redraw, this); } void Digiscope::draw_phase() { // max number of shown vectors is first dimension static double pvecstack[8][2]; static const size_t psz = sizeof(pvecstack)/sizeof(*pvecstack); static unsigned pszn = 0; fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(_bk_color); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); fl_translate(x() + w() / 2.0, y() + w() / 2.0); fl_scale( 0.9*w()/2, -0.9*w()/2); fl_color(_axis_color); fl_circle( 0.0, 0.0, 1.0); fl_begin_line(); fl_vertex(-1.0, 0.0); fl_vertex(-0.9, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(1.0, 0.0); fl_vertex(0.9, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(0.0, -1.0); fl_vertex(0.0, -0.9); fl_end_line(); fl_begin_line(); fl_vertex(0.0, 1.0); fl_vertex(0.0, 0.9); fl_end_line(); if (_highlight) { if (_mode > PHASE1) { if (pszn == psz - 1) memmove(pvecstack, pvecstack + 1, (psz - 1) * sizeof(*pvecstack)); else pszn++; pvecstack[pszn][0] = _phase; pvecstack[pszn][1] = _quality; // draw the stack in progressively brighter green for (unsigned i = 0; i <= pszn; i++) { // fl_color(fl_color_average(FL_GREEN, _bk_color, 1.0 - 0.8 * (n-i)/ pszn)); fl_color(fl_color_average(_color_1, _bk_color, 0.2 + 0.8 * i / pszn)); fl_begin_line(); fl_vertex(0.0, 0.0); if (_mode == PHASE3) // scale length by quality fl_vertex(0.9 * cos(pvecstack[i][0] - M_PI / 2) * pvecstack[i][1], 0.9 * sin(pvecstack[i][0] - M_PI / 2) * pvecstack[i][1]); else fl_vertex(0.9 * cos(pvecstack[i][0] - M_PI / 2), 0.9 * sin(pvecstack[i][0] - M_PI / 2)); fl_end_line(); } } else { // original style fl_color(_color_1); fl_begin_line(); fl_vertex(0.0, 0.0); fl_vertex(0.9 * cos(_phase - M_PI / 2), 0.9 * sin( _phase - M_PI / 2)); fl_end_line(); } } else { fl_color(_color_1); fl_circle( 0.0, 0.0, 0.1); } fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_scope() { int npts, np; fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(_bk_color); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); npts = MIN(w(), _len); npts = MAX(1, npts); fl_translate(x()+2, y() + h() - 2); fl_scale ((w()-4), - (h() - 4)); fl_color(_color_1); fl_begin_line(); for (int i = 0; i < npts; i++) { np = i * _len / npts; np = np < MAX_LEN ? np : MAX_LEN - 1; fl_vertex( (double)i / npts, _buf[np] ); } fl_end_line(); // x & y axis' for (int i = 0; i < NUM_GRIDS; i++) { if (_x[i]) { fl_color(_axis_color); fl_begin_line(); fl_vertex(_x[i], 0.0); fl_vertex(_x[i], 1.0); fl_end_line(); } if (_y[i]) { fl_color(_axis_color); fl_begin_line(); fl_vertex(0.0, _y[i]); fl_vertex(1.0, _y[i]); fl_end_line(); } } if (_x_graticule) { if (_y_user1 > 0 && _y_user1 < 1.0) { fl_color(_color_3); fl_begin_line(); fl_vertex(0.0, 1.0 - _y_user1); fl_vertex(1.0, 1.0 - _y_user1); fl_end_line(); } if (_y_user2 > 0 && _y_user2 < 1.0) { fl_color(_color_4); fl_begin_line(); fl_vertex(0.0, 1.0 - _y_user2); fl_vertex(1.0, 1.0 - _y_user2); fl_end_line(); } } if (_y_graticule) { if (_x_user1 > 0 && _x_user1 < 1.0) { fl_color(_color_3); fl_begin_line(); fl_vertex(_x_user1, 0.0); fl_vertex(_x_user1, 1.0); fl_end_line(); } if (_x_user2 > 0 && _x_user2 < 1.0) { fl_color(_color_4); fl_begin_line(); fl_vertex(_x_user2, 0.0); fl_vertex(_x_user2, 1.0); fl_end_line(); } } fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_xy() { fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(_bk_color); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); fl_translate(x() + w() / 2.0, y() + w() / 2.0); fl_scale( w()/2.0, -w()/2.0); // x & y axis fl_color(_axis_color); fl_begin_line(); fl_vertex(-0.6, 0.0); fl_vertex(-1.0, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(0.6, 0.0); fl_vertex(1.0, 0.0); fl_end_line(); fl_begin_line(); fl_vertex(0.0, -0.6); fl_vertex(0.0, -1.0); fl_end_line(); fl_begin_line(); fl_vertex(0.0, 0.6); fl_vertex(0.0, 1.0); fl_end_line(); // data int W = w() / 2; int H = h() / 2; int X = x(); int Y = y(); int xp, yp, xp1, yp1; int j = _zptr; if (++j == MAX_ZLEN) j = 0; xp = X + (int)((_zdata[j].real() + 1.0) * W); yp = Y + (int)((_zdata[j].imag() + 1.0) * H); fl_color(_color_1); for (int i = 0; i < MAX_ZLEN; i++ ) { if (++j == MAX_ZLEN) j = 0; xp1 = X + (int)((_zdata[j].real() + 1.0) * W); yp1 = Y + (int)((_zdata[j].imag() + 1.0) * H); fl_line(xp, yp, xp1, yp1); xp = xp1; yp = yp1; } fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_rtty() { int npts, np; fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(_bk_color); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); npts = MIN(w(), _len); npts = MAX(1, npts); fl_translate(x()+2, y() + h() - 2); fl_scale ((w()-4), - (h() - 4)); fl_color(_color_2); fl_begin_line(); fl_vertex( 0.0, 0.9); fl_vertex( 1.0, 0.9); fl_end_line(); fl_begin_line(); fl_vertex( 0.0, 0.1); fl_vertex( 1.0, 0.1); fl_end_line(); fl_color(_axis_color); fl_begin_line(); fl_vertex( 0.0, 0.5); fl_vertex( 1.0, 0.5); fl_end_line(); fl_color(_color_1); fl_begin_line(); double value = 0.0; for (int i = 0; i < npts; i++) { np = round(1.0 * i * _len / npts); if (np >= MAX_LEN) np = MAX_LEN - 1; value = _buf[np]; fl_vertex( 1.0 * i / (npts - 1), 0.5 + 0.75 * value ); } fl_end_line(); fl_pop_matrix(); fl_pop_clip(); } void Digiscope::draw_video() { fl_draw_image( vidbuf, x() + 2, y() + 2, w() - 4, h() - 4); } void Digiscope::draw() { draw_box(); if (_mode == WWV || _mode == DOMWF) draw_video(); else { switch (_mode) { case SCOPE : draw_scope(); break; case PHASE1: case PHASE2: case PHASE3: draw_phase(); break; case RTTY : draw_rtty(); break; case XHAIRS : draw_xy(); break; case DOMDATA : draw_scope(); break; case BLANK : default: fl_clip(x()+2,y()+2,w()-4,h()-4); fl_color(_bk_color); fl_rectf(x()+2,y()+2,w()-4,h()-4); fl_push_matrix(); fl_pop_matrix(); fl_pop_clip(); break; } } } int Digiscope::handle(int event) { if (!Fl::event_inside(this)) return 0; switch (event) { case FL_RELEASE: switch (_mode) { case PHASE1: case PHASE2: _mode = (scope_mode)((int)_mode + 1); phase_mode = _mode; redraw(); break; case PHASE3: _mode = PHASE1; phase_mode = _mode; redraw(); break; case RTTY: _mode = XHAIRS; redraw(); break; case XHAIRS: _mode = RTTY; redraw(); break; case DOMDATA: _mode = DOMWF; redraw(); break; case DOMWF: _mode = DOMDATA; redraw(); break; case WWV: event = Fl::event_button(); if (event == FL_LEFT_MOUSE) wwv_modem->set1(Fl::event_x() - x(), w()); else if (event == FL_RIGHT_MOUSE) wwv_modem->set2(Fl::event_x() - x(), Fl::event_y() - y()); break; default: break; } return 1; case FL_MOUSEWHEEL: if ((event = Fl::event_dy()) || (event = Fl::event_dx())) wf->handle_mouse_wheel(waterfall::WF_AFC_BW, event); break; default: break; } return 1; } void Digiscope::resize(int x, int y, int w, int h) { delete [] vidbuf; delete [] vidline; vidbuf = new unsigned char[ 3 * (w-4) * (h-4)]; vidline = new unsigned char[ 3 * (w-4)]; memset(vidbuf, 0, 3*(w-4)*(h-4) * sizeof(unsigned char)); memset(vidline, 0, 3*(w-4) * sizeof(unsigned char)); Fl_Widget::resize(x, y, w, h); } fldigi-4.2.05/src/waterfall/colorbox.cxx0000664000175000017500000000724714611711171015120 00000000000000// ---------------------------------------------------------------------------- // colorbox.cxx // // Copyright (C) 2007-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "gettext.h" #include "colorbox.h" #include "waterfall.h" #include "confdialog.h" #include "main.h" #include "fl_digi.h" #include "fileselect.h" #include "debug.h" void colorbox::draw() { int ypos = y() + 2; int xpos; int ht = h() - 4; int wd = w() - 4; draw_box(); for(int i = 0; i < wd; i++){ xpos = x() + 2 + i; int xc = i * 256 / wd; fl_rectf (xpos, ypos, 1, ht, mag2RGBI[xc].R, mag2RGBI[xc].G, mag2RGBI[xc].B); } } void setColorButtons() { for (int i = 0; i < 9; i++) { btnColor[i]->color( fl_rgb_color( palette[i].R, palette[i].G, palette[i].B ) ); btnColor[i]->redraw(); } } void selectColor(int n) { uchar r, g, b; r = palette[n].R; g = palette[n].G; b = palette[n].B; fl_color_chooser("Spectrum", r, g, b); palette[n].R = r; palette[n].G = g; palette[n].B = b; btnColor[n]->color( fl_rgb_color( palette[n].R, palette[n].G, palette[n].B ) ); btnColor[n]->redraw(); wf->setcolors(); WF_Palette->redraw(); } static std::string palfilename = ""; static std::string palLabelStr; void loadPalette() { int r,g,b; FILE *clrfile = NULL; if (palfilename.size() == 0) { palfilename = PalettesDir; palfilename.append ("fldigi.pal"); } const char *p = FSEL::select(_("Open palette"), _("Fldigi palette\t*.pal"), palfilename.c_str()); if (!p) return; if (!*p) return; if ((clrfile = fl_fopen(p, "r")) != NULL) { for (int i = 0; i < 9; i++) { if (fscanf(clrfile, "%d;%d;%d\n", &r, &g, &b) == EOF) { if (ferror(clrfile)) LOG_PERROR("fscanf"); else LOG_ERROR("unexpected EOF"); fclose(clrfile); return; } palette[i].R = r; palette[i].G = g; palette[i].B = b; } fclose(clrfile); wf->setcolors(); setColorButtons(); palfilename = p; palLabelStr = p; size_t pos = palLabelStr.find_last_of('/'); if (pos != std::string::npos) palLabelStr.erase(0, pos+1); palLabelStr = _("Palette: ") + palLabelStr; WF_Palette->label(palLabelStr.c_str()); WF_Palette->redraw(); progdefaults.PaletteName = palLabelStr; } } void savePalette() { FILE *clrfile = NULL; if (palfilename.size() == 0) { palfilename = PalettesDir; palfilename.append ("fldigi.pal"); } const char *p = FSEL::saveas(_("Save palette"), _("Fldigi palette\t*.pal"), palfilename.c_str()); if (!p) return; if ((clrfile = fl_fopen(p, "w")) != NULL) { for (int i = 0; i < 9; i++) { fprintf(clrfile, "%3d;%3d;%3d\n", palette[i].R, palette[i].G, palette[i].B ); } fclose(clrfile); palfilename = p; palLabelStr = p; size_t pos = palLabelStr.find_last_of('/'); if (pos != std::string::npos) palLabelStr.erase(0, pos+1); palLabelStr = _("Palette: ") + palLabelStr; WF_Palette->label(palLabelStr.c_str()); WF_Palette->redraw(); progdefaults.PaletteName = palLabelStr; } } fldigi-4.2.05/src/waterfall/waterfall.cxx0000664000175000017500000021000614611711171015237 00000000000000// ---------------------------------------------------------------------------- // waterfall.cxx - Waterfall Spectrum Analyzer Widget // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- //#define USE_BLACKMAN //#define USE_HAMMING //#define USE_HANNING #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "trx.h" #include "misc.h" #include "waterfall.h" #include "main.h" #include "modem.h" #include "qrunner.h" #include "threads.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "rigio.h" #include "fldigi-config.h" #include "configuration.h" #include "status.h" #include "squelch_status.h" #include "Viewer.h" #include "macros.h" #include "arq_io.h" #include "confdialog.h" #include "flmisc.h" #include "gettext.h" #include "rtty.h" #include "flslider2.h" #include "debug.h" #include "rigsupport.h" #include "xmlrpc.h" #include "psm/psm.h" #include "kiss_io.h" #include "fmt_dialog.h" #include "spectrum_viewer.h" //pthread_mutex_t draw_mutex = PTHREAD_MUTEX_INITIALIZER; #define bwFFT 30 #define cwRef 50 #define bwX1 25 #define bwMov 18 #define bwRate 45 #define cwCnt 92 #define bwQsy 32 #define bwXmtLock 32 #define bwRev 32 #define bwMem 40 #define bwXmtRcv 40 #define wSpace 1 #define bwdths (wSpace + bwFFT + wSpace + cwRef + wSpace + cwRef + wSpace + bwX1 + \ wSpace + 3*bwMov + wSpace + bwRate + wSpace + \ cwCnt + wSpace + bwQsy + wSpace + bwMem + wSpace + \ bwXmtLock + wSpace + bwRev + wSpace + bwXmtRcv + wSpace) extern modem *active_modem; static RGB RGByellow = {254,254,0}; //static RGB RGBgreen = {0,254,0}; //static RGB RGBdkgreen = {0,128,0}; //static RGB RGBblue = {0,0,255}; static RGB RGBred = {254,0,0}; static RGB RGBwhite = {254,254,254}; //static RGB RGBblack = {0,0,0}; //static RGB RGBmagenta = {196,0,196}; // RGBI is a structure consisting of the values RED, GREEN, BLUE, INTENSITY // each value can range from 0 (extinguished) to 255 (full on) // the INTENSITY value is used for the grayscale waterfall display RGBI mag2RGBI[256]; RGB palette[9]; short int *tmp_fft_db; static pthread_mutex_t waterfall_mutex = PTHREAD_MUTEX_INITIALIZER; WFdisp::WFdisp (int x0, int y0, int w0, int h0, char *lbl) : Fl_Widget(x0,y0,w0,h0,"") { disp_width = w(); if (disp_width > progdefaults.HighFreqCutoff/4) disp_width = progdefaults.HighFreqCutoff/4; scale_width = IMAGE_WIDTH * 2; image_height = h() - WFTEXT - WFSCALE - WFMARKER; image_area = IMAGE_WIDTH * image_height; sig_image_area = IMAGE_WIDTH * h(); RGBsize = sizeof(RGB); RGBwidth = RGBsize * scale_width; fft_img = new RGBI[image_area]; markerimage = new RGB[scale_width * WFMARKER]; scaleimage = new uchar[scale_width * WFSCALE]; scline = new uchar[scale_width]; fft_sig_img = new uchar[image_area]; sig_img = new uchar[sig_image_area]; pwr = new wf_fft_type[IMAGE_WIDTH]; fft_db = new short int[image_area]; tmp_fft_db = new short int[image_area]; circbuff = new wf_fft_type[WF_FFTLEN]; wfbuf = new wf_cpx_type[WF_FFTLEN]; wfft = new g_fft(WF_FFTLEN); fftwindow = new wf_fft_type[WF_FFTLEN]; setPrefilter(progdefaults.wfPreFilter); memset(circbuff, 0, WF_FFTLEN * sizeof(double)); mag = 1; step = 4; offset = 0; sigoffset = 0; ampspan = 75; // reflevel = -10; initmaps(); bandwidth = 32; RGBmarker = RGBred; RGBcursor = RGByellow; RGBInotch.I = progdefaults.notchRGBI.I; RGBInotch.R = progdefaults.notchRGBI.R; RGBInotch.G = progdefaults.notchRGBI.G; RGBInotch.B = progdefaults.notchRGBI.B; mode = WATERFALL; centercarrier = false; overload = false; rfc = 0L; usb = true; wfspeed = NORMAL; wfspdcnt = 0; dispcnt = 1.0 * WF_BLOCKSIZE / WF_SAMPLERATE; dispdec = 1.0 * WF_BLOCKSIZE / WF_SAMPLERATE; wantcursor = false; cursormoved = false; for (int i = 0; i < IMAGE_WIDTH; i++) pwr[i] = 0.0; carrier(1500); oldcarrier = newcarrier = 0; tmp_carrier = false; ptrCB = 0; ptrFFTbuff = 0; for (int i = 0; i < 256; i++) mag2RGBI[i].I = mag2RGBI[i].R = mag2RGBI[i].G = mag2RGBI[i].B = 0; int error = 0; // use fastest sync converter // SRC_SINC_BEST_QUALITY = 0, // SRC_SINC_MEDIUM_QUALITY = 1, // SRC_SINC_FASTEST = 2, // SRC_ZERO_ORDER_HOLD = 3, // SRC_LINEAR = 4, src_state = src_new(2, 1, &error); if (error) { LOG_ERROR("src_new error %d: %s", error, src_strerror(error)); abort(); } error = src_reset(src_state); if (error) LOG_ERROR("src_reset error %d: %s", error, src_strerror(error)); src_data.end_of_input = 0; src_data.src_ratio = 0.0; genptr = 0; } WFdisp::~WFdisp() { delete wfft; delete [] fft_img; delete [] scaleimage; delete [] markerimage; delete [] fft_sig_img; delete [] sig_img; delete [] pwr; delete [] scline; delete [] fft_db; delete [] tmp_fft_db; } void WFdisp::initMarkers() { memset(markerimage, 224, RGBwidth * WFMARKER); } // draw a marker of specified width and colour centred at freq and clrM inline void WFdisp::makeMarker_(int width, const RGB* color, int freq, const RGB* clrMin, RGB* clrM, const RGB* clrMax) { if (!active_modem) return; trx_mode marker_mode = active_modem->get_mode(); if (marker_mode == MODE_RTTY) { // rtty has two bandwidth indicators on the waterfall // upper and lower frequency int shift = static_cast( (progdefaults.rtty_shift < rtty::numshifts ? rtty::SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift)); int bw_limit_hi = (int)(shift / 2 + progdefaults.RTTY_BW / 2.0); int bw_limit_lo = (int)(shift / 2 - progdefaults.RTTY_BW / 2.0); int bw_freq = static_cast(freq + 0.5); int bw_lower1 = -bw_limit_hi; int bw_upper1 = -bw_limit_lo; int bw_lower2 = bw_limit_lo; int bw_upper2 = bw_limit_hi; if (bw_lower1 + bw_freq < 0) bw_lower1 -= bw_lower1 + bw_freq; if (bw_upper1 + bw_freq < 0) bw_lower2 -= bw_lower2 + bw_freq; if (bw_upper2 + bw_freq > scale_width) bw_upper2 -= bw_upper2 + bw_freq - scale_width; if (bw_lower2 + bw_freq > scale_width) bw_lower2 -= bw_lower2 + bw_freq - scale_width; // draw it RGB* clrPos; for (int y = 0; y < WFMARKER - 2; y++) { for (int x = bw_lower1; x < bw_upper1; x++) { clrPos = clrM + x + y * scale_width; if (clrPos > clrMin && clrPos < clrMax) *clrPos = *color; } for (int x = bw_lower2; x < bw_upper2; x++) { clrPos = clrM + x + y * scale_width; if (clrPos > clrMin && clrPos < clrMax) *clrPos = *color; } } return; } int bw_lower = -width, bw_upper = width; if (marker_mode >= MODE_MT63_500S && marker_mode <= MODE_MT63_2000L) bw_upper = (int)(width * 31 / 32); if (marker_mode == MODE_FSQ || marker_mode == MODE_IFKP) bw_upper = (int)(width * 32 / 33); if (bw_lower + static_cast(freq+0.5) < 0) bw_lower -= bw_lower + static_cast(freq+0.5); if (bw_upper + static_cast(freq+0.5) > scale_width) bw_upper -= bw_upper + static_cast(freq+0.5) - scale_width; // draw it RGB* clrPos; for (int y = 0; y < WFMARKER - 2; y++) { for (int x = bw_lower; x < bw_upper; x++) { clrPos = clrM + x + y * scale_width; if (clrPos > clrMin && clrPos < clrMax) *clrPos = *color; } } } void WFdisp::make_fmt_marker () { RGB unk_trk_color, ref_trk_color; memset(markerimage + scale_width, 0, RGBwidth * (WFMARKER - 2)); Fl::get_color(progdefaults.FMT_unk_color, unk_trk_color.R, unk_trk_color.G, unk_trk_color.B); Fl::get_color(progdefaults.FMT_ref_color, ref_trk_color.R, ref_trk_color.G, ref_trk_color.B); int fmt_bw = progdefaults.FMT_filter; RGB *mrkr_U = markerimage + scale_width + int(round(cnt_unk_freq->value())); RGB *mrkr_R = markerimage + scale_width + int(round(cnt_ref_freq->value())); // draw marker for (int y = 0; y < WFMARKER - 2; y++) { for (int x = -fmt_bw; x <= fmt_bw; x++) { *(mrkr_U + x + y * scale_width) = unk_trk_color; *(mrkr_R + x + y * scale_width) = ref_trk_color; } } } void WFdisp::makeMarker() { if (unlikely(!active_modem)) return; int mode = active_modem->get_mode(); RGB *clrMin, *clrMax, *clrM; int marker_width = bandwidth; if (mode == MODE_FMT) { make_fmt_marker (); marker_width = progdefaults.FMT_filter; } else { clrMin = markerimage + scale_width; clrMax = clrMin + (WFMARKER - 2) * scale_width; memset(clrMin, 0, RGBwidth * (WFMARKER - 2)); clrM = clrMin + (int)((double)carrierfreq + 0.5); if (mode >= MODE_PSK_FIRST && mode <= MODE_PSK_LAST) marker_width += mailserver ? progdefaults.ServerOffset : progdefaults.SearchRange; else if (mode >= MODE_FELDHELL && mode <= MODE_HELL80) marker_width = (int)progdefaults.HELL_BW; else if (mode == MODE_RTTY) marker_width = static_cast((progdefaults.rtty_shift < rtty::numshifts ? rtty::SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift)); marker_width = (int)(marker_width / 2.0 + 1); RGBmarker.R = progdefaults.bwTrackRGBI.R; RGBmarker.G = progdefaults.bwTrackRGBI.G; RGBmarker.B = progdefaults.bwTrackRGBI.B; makeMarker_(marker_width, &RGBmarker, carrierfreq, clrMin, clrM, clrMax); if (unlikely(active_modem->freqlocked() || mode == MODE_FSQ)) { int txfreq = static_cast(active_modem->get_txfreq()); adjust_color_inv(RGBmarker.R, RGBmarker.G, RGBmarker.B, FL_BLACK, FL_RED); makeMarker_( static_cast(bandwidth / 2.0 + 1), &RGBmarker, txfreq, clrMin, clrMin + (int)((double)txfreq + 0.5), clrMax); } } if (!wantcursor) return; if (cursorpos > progdefaults.HighFreqCutoff - bandwidth / 2 / step) cursorpos = progdefaults.HighFreqCutoff - bandwidth / 2 / step; if (cursorpos >= (progdefaults.HighFreqCutoff - offset - bandwidth/2)/step) cursorpos = (progdefaults.HighFreqCutoff - offset - bandwidth/2)/step; if (cursorpos < (progdefaults.LowFreqCutoff + bandwidth / 2) / step) cursorpos = (progdefaults.LowFreqCutoff + bandwidth / 2) / step; // Create the cursor marker double xp = offset + step * cursorpos; if (xp < bandwidth / 2.0 || xp > (progdefaults.HighFreqCutoff - bandwidth / 2.0)) return; clrM = markerimage + scale_width + (int)(xp + 0.5); RGBcursor.R = progdefaults.cursorLineRGBI.R; RGBcursor.G = progdefaults.cursorLineRGBI.G; RGBcursor.B = progdefaults.cursorLineRGBI.B; int bw_lo = marker_width; int bw_hi = marker_width; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; if (mode == MODE_FSQ || mode == MODE_IFKP) bw_hi = bw_hi * 32 / 33; for (int y = 0; y < WFMARKER - 2; y++) { int incr = y * scale_width; int msize = (y + 1) * RGBsize * step / 4; for (int i = -msize; i <= msize; i++) *(clrM + i + incr) = RGBwhite; if (xp - (bw_lo + msize) > 0) for (int i = bw_lo - msize; i <= bw_lo + msize; i++) *(clrM - i + incr) = RGBcursor; if (xp + (bw_hi + msize) < scale_width) for (int i = bw_hi - msize; i <= bw_hi + msize; i++) *(clrM + i + incr) = RGBcursor; } } void WFdisp::makeScale() { uchar *gmap = scaleimage; memset(scline, 0, scale_width); for (int tic = 500; tic < scale_width; tic += 500) { scline[tic] = 255; for (int ticn = 1; ticn < step; ticn++) if (tic + ticn < scale_width) scline[tic + ticn] = 255; } for (int i = 0; i < WFSCALE - 5; i++) { memcpy(gmap, scline, scale_width); gmap += (scale_width); } for (int tic = 100; tic < scale_width ; tic += 100) { scline[tic] = 255; for (int ticn = 1; ticn < step; ticn++) if (tic + ticn < scale_width) scline[tic + ticn] = 255; } for (int i = 0; i < 5; i++) { memcpy(gmap, scline, scale_width); gmap += (scale_width); } } void WFdisp::setcolors() { double di; int r, g, b; for (int i = 0; i < 256; i++) { di = sqrt((double)i / 256.0); mag2RGBI[i].I = (uchar)(200*di); } for (int n = 0; n < 8; n++) { for (int i = 0; i < 32; i++) { r = palette[n].R + (int)(1.0 * i * (palette[n+1].R - palette[n].R) / 32.0); g = palette[n].G + (int)(1.0 * i * (palette[n+1].G - palette[n].G) / 32.0); b = palette[n].B + (int)(1.0 * i * (palette[n+1].B - palette[n].B) / 32.0); mag2RGBI[i + 32*n].R = r; mag2RGBI[i + 32*n].G = g; mag2RGBI[i + 32*n].B = b; } } } void WFdisp::initmaps() { for (int i = 0; i < image_area; i++) fft_db[i] = tmp_fft_db[i] = log2disp(-1000); memset (fft_img, 0, image_area * sizeof(RGBI) ); memset (scaleimage, 0, scale_width * WFSCALE); memset (markerimage, 0, RGBwidth * WFMARKER); memset (fft_sig_img, 0, image_area); memset (sig_img, 0, sig_image_area); memset (mag2RGBI, 0, sizeof(mag2RGBI)); initMarkers(); makeScale(); setcolors(); } int WFdisp::peakFreq(int f0, int delta) { guard_lock waterfall_lock(&waterfall_mutex); double threshold = 0.0; int f1, fmin = (int)((f0 - delta)), f2, fmax = (int)((f0 + delta)); f1 = fmin; f2 = fmax; if (fmin < 0 || fmax > IMAGE_WIDTH) return f0; for (int f = fmin; f <= fmax; f++) threshold += pwr[f]; threshold /= delta; for (int f = fmin; f <= fmax; f++) if (pwr[f] > threshold) { f2 = f; } for (int f = fmax; f >= fmin; f--) if (pwr[f] > threshold) { f1 = f; } return (f1 + f2) / 2; } double WFdisp::powerDensity(double f0, double bw) { double pwrdensity = 0.0; int flower = (int)((f0 - bw/2)), fupper = (int)((f0 + bw/2)); if (flower < 0 || fupper > IMAGE_WIDTH) return 0.0; { guard_lock waterfall_lock(&waterfall_mutex); for (int i = flower; i <= fupper; i++) pwrdensity += pwr[i]; } return pwrdensity/(bw+1); } /// Frequency of the maximum power for a given bandwidth. Used for AFC. double WFdisp::powerDensityMaximum(int bw_nb, const int (*bw)[2]) const { if (bw_nb < 1) return carrierfreq; int fmax[bw_nb]; double pnbw[bw_nb]; int f_lowest = carrierfreq; int f_highest = carrierfreq; double max_pwr = 0; for (int i = 0; i < bw_nb; i++) { fmax[i] = carrierfreq; pnbw[i] = 0; } { guard_lock waterfall_lock(&waterfall_mutex); for (int i = 0; i < bw_nb; i++) { f_lowest = carrierfreq + bw[i][0]; if (f_lowest <= 0) f_lowest = 0; f_highest = carrierfreq + bw[i][1]; if (f_highest > IMAGE_WIDTH) f_highest = IMAGE_WIDTH; max_pwr = 0; pnbw[i] = 0; for (int n = f_lowest; n < f_highest; n++) { if (pwr[n] > max_pwr) { max_pwr = pwr[n]; fmax[i] = n; } pnbw[i] += pwr[n]; } if (pnbw[i] == 0) return carrierfreq; } } int fmid = 0; double total_pwr = 0; for (int i = 0; i < bw_nb; i++) total_pwr += pnbw[i]; for (int i = 0; i < bw_nb; i++) fmid += fmax[i] * pnbw[i] / total_pwr; return fmid; } void WFdisp::setPrefilter(int v) { switch (v) { case WF_FFT_RECTANGULAR: RectWindow(fftwindow, WF_FFTLEN); break; case WF_FFT_BLACKMAN: BlackmanWindow(fftwindow, WF_FFTLEN); break; case WF_FFT_HAMMING: HammingWindow(fftwindow, WF_FFTLEN); break; case WF_FFT_HANNING: HanningWindow(fftwindow, WF_FFTLEN); break; case WF_FFT_TRIANGULAR: TriangularWindow(fftwindow, WF_FFTLEN); break; } // BlackmanWindow(fftwindow, WF_FFTLEN); prefilter = v; } int WFdisp::log2disp(int v) { double val = -255.0 * v / ampspan; if (val < 0) return 255; if (val > 255 ) return 0; return (int)(255 - val); } void WFdisp::processFFT() { if (prefilter != progdefaults.wfPreFilter) setPrefilter(progdefaults.wfPreFilter); wf_fft_type scale = WF_FFTLEN / 8000.0; if ((wfspeed != PAUSE) && ((dispcnt -= dispdec) <= 0)) { static const int log2disp100 = log2disp(-100); double vscale = 2.0 / WF_FFTLEN; for (int i = 0; i < WF_FFTLEN; i++) wfbuf[i] = 0; void *pv = static_cast(wfbuf); wf_fft_type *pbuf = static_cast(pv); int latency = progdefaults.wf_latency; if (latency < 1) latency = 1; if (latency > 16) latency = 16; int nsamples = WF_FFTLEN * latency / 16; vscale *= sqrt(16.0 / latency); for (int i = 0; i < nsamples; i++) pbuf[i] = fftwindow[i * 16 / latency] * circbuff[i] * vscale; for (int i = 0; i < WF_FFTLEN; i++) pbuf[i] = fftwindow[i] * circbuff[i] * vscale; wfft->RealFFT(wfbuf); memset(pwr, 0, progdefaults.LowFreqCutoff * sizeof(wf_fft_type)); memset(&fft_db[ptrFFTbuff * IMAGE_WIDTH], log2disp100, progdefaults.LowFreqCutoff * sizeof(*fft_db)); int n = 0; for (int i = progdefaults.LowFreqCutoff + 1; i < IMAGE_WIDTH; i++) { n = round(scale * i); pwr[i] = norm(wfbuf[n]); int ffth = round(10.0 * log10(pwr[i] + 1e-10) ); fft_db[ptrFFTbuff * IMAGE_WIDTH + i] = log2disp(ffth); } ptrFFTbuff--; if (ptrFFTbuff < 0) ptrFFTbuff += image_height; for (int i = 0; i < image_height; i++) { int j = (i + 1 + ptrFFTbuff) % image_height; memmove( (void *)(tmp_fft_db + i * IMAGE_WIDTH), (void *)(fft_db + j * IMAGE_WIDTH), IMAGE_WIDTH * sizeof(short int)); } dispdec = 1.0 * WF_BLOCKSIZE / WF_SAMPLERATE; dispcnt = 1.0 * WF_BLOCKSIZE / WF_SAMPLERATE; // FAST if (wfspeed == NORMAL) dispcnt *= NORMAL; if (wfspeed == SLOW) dispcnt *= progdefaults.drop_speed; } redraw(); } void WFdisp::process_analog (wf_fft_type *sig, int len) { int h1, h2, h3; int sigy, sigpixel, ynext, graylevel; h1 = h()/8 - 1; h2 = h()/2 - 1; h3 = h()*7/8 + 1; graylevel = 220; // clear the signal display area sigy = 0; sigpixel = IMAGE_WIDTH*h2; memset (sig_img, 0, sig_image_area); memset (&sig_img[h1*IMAGE_WIDTH], 160, IMAGE_WIDTH); memset (&sig_img[h2*IMAGE_WIDTH], 255, IMAGE_WIDTH); memset (&sig_img[h3*IMAGE_WIDTH], 160, IMAGE_WIDTH); int cbc = ptrCB; for (int c = 0; c < IMAGE_WIDTH; c++) { ynext = (int)(h2 * sig[cbc]); if (ynext < -h2) ynext = -h2; if (ynext > h2) ynext = h2; cbc = (cbc + 1) % (WF_FFTLEN); for (; sigy < ynext; sigy++) sig_img[sigpixel -= IMAGE_WIDTH] = graylevel; for (; sigy > ynext; sigy--) sig_img[sigpixel += IMAGE_WIDTH] = graylevel; sig_img[sigpixel++] = graylevel; } redraw(); } //---------------------------------------------------------------------- // queue audio_blocks used to separate audio stream process timing // from GUI processing and timing // mutex guards the audio_blocks data //---------------------------------------------------------------------- extern state_t trx_state; static pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER; struct AUDIO_BLOCK { wf_fft_type sig[WF_BLOCKSIZE]; }; bool clear_audio_blocks; std::queue audio_blocks; void WFdisp::sig_data( double *sig, int len ) { double src_ratio = 1.0 * WF_SAMPLERATE / active_modem->get_samplerate(); if (audio_blocks.size() > 32) { //8) { clear_audio_blocks = true; // LOG_ERROR("%s", "audio_blocks overflow"); return; } if ((len * src_ratio) > WF_BLOCKSIZE * 2) { LOG_ERROR("%s", "len * src_ratio > WFBLOCKSIZE * 2"); return; } AUDIO_BLOCK audio_block; buf = insamples; srclen = len; int error; if (src_data.src_ratio != src_ratio) { src_data.src_ratio = src_ratio; src_set_ratio(src_state, src_data.src_ratio); LOG_INFO("Waterfall sample rate ratio %f", src_ratio); } for (int n = 0; n < len; n++) insamples[n] = sig[n]; while (srclen > 0) { src_data.data_in = insamples; src_data.input_frames = srclen; src_data.data_out = &outsamples[genptr]; src_data.output_frames = WF_BLOCKSIZE * 2 - genptr; src_data.input_frames_used = 0; if (unlikely(error = src_process(src_state, &src_data))) { LOG_ERROR("src_process error %d: %s", error, src_strerror(error)); return; } size_t gend = src_data.output_frames_gen; size_t used = src_data.input_frames_used; genptr += gend; buf += used; srclen -= used; while (genptr >= WF_BLOCKSIZE) { for (int n = 0; n < WF_BLOCKSIZE; n++) audio_block.sig[n] = outsamples[n]; { guard_lock data_lock (&data_mutex); audio_blocks.push(audio_block); } for (int n = 0; n < WF_BLOCKSIZE; n++) outsamples[n] = outsamples[n+WF_BLOCKSIZE]; genptr -= WF_BLOCKSIZE; } } return; } // this method must be called from main thread void WFdisp::handle_sig_data() { ENSURE_THREAD(FLMAIN_TID); double gain = pow(10, progdefaults.wfRefLevel / -20.0); AUDIO_BLOCK current; while (1) {//!audio_blocks.empty()) { if (clear_audio_blocks) { guard_lock data_lock(&data_mutex); while ( !audio_blocks.empty() ) audio_blocks.pop(); clear_audio_blocks = false; } if (audio_blocks.empty()) return; for (int n = 0; n < WF_FFTLEN - WF_BLOCKSIZE; n++) circbuff[n] = circbuff[n + WF_BLOCKSIZE]; { // this block guarded by data_mutex guard_lock data_lock(&data_mutex); current = audio_blocks.front(); audio_blocks.pop(); } double fftavg = 0; for (int n = 0; n < WF_BLOCKSIZE; n++) fftavg += fabs(circbuff[n + WF_FFTLEN - WF_BLOCKSIZE - 1] = current.sig[n]); { sig_vumeter->wsjtx_meter_face( progdefaults.use_wsjtx_vumeter_scale ); sig_vumeter2->wsjtx_meter_face( progdefaults.use_wsjtx_vumeter_scale ); VuMeter->wsjtx_meter_face( progdefaults.use_wsjtx_vumeter_scale ); fftavg /= WF_BLOCKSIZE; sig_vumeter->value(fftavg); sig_vumeter2->value(fftavg); VuMeter->value(fftavg); } overload = false; double overval = 0.0, peak = 0.0; for (int i = WF_FFTLEN - WF_BLOCKSIZE; i < WF_FFTLEN; i++) { overval = fabs(circbuff[i]); if (overval > peak) peak = overval; circbuff[i] *= gain; } if (mode == SCOPE) process_analog(circbuff, WF_FFTLEN); else processFFT(); put_WARNstatus(peak); static char szFrequency[14]; if (active_modem && rfc != 0) { int offset = 0; double afreq = active_modem->get_txfreq(); trx_mode mode = active_modem->get_mode(); std::string testmode = qso_opMODE->value(); bool xcvr_useFSK = ((testmode.find("RTTY") != std::string::npos) || (testmode.find("FSK") != std::string::npos) || ((testmode.find("DATA") != std::string::npos) && (use_nanoIO || progdefaults.PseudoFSK)) ); usb = !ModeIsLSB(testmode); if ((testmode.find("DATA") != std::string::npos) && xcvr_useFSK) usb = !usb; if (mode == MODE_RTTY && progdefaults.useMARKfreq && !xcvr_useFSK) { offset = (progdefaults.rtty_shift < rtty::numshifts ? rtty::SHIFT[progdefaults.rtty_shift] : progdefaults.rtty_custom_shift); offset /= 2; if (active_modem->get_reverse()) offset *= -1; } if (testmode.find("CW") != std::string::npos) afreq = 0; if (xcvr_useFSK) afreq = 0; if (mode == MODE_ANALYSIS) { dfreq = 0; } else { if (usb) dfreq = rfc + afreq + offset; else dfreq = rfc - afreq - offset; } snprintf(szFrequency, sizeof(szFrequency), "%-.3lf", dfreq / 1000.0); } else { dfreq = active_modem->get_txfreq(); snprintf(szFrequency, sizeof(szFrequency), "%-.0lf", dfreq); } inpFreq->value(szFrequency); } } // Check the display offset & limit to 0 to max IMAGE_WIDTH displayed void WFdisp::checkoffset() { if (mode == SCOPE) { if (sigoffset < 0) sigoffset = 0; if (sigoffset > (IMAGE_WIDTH - disp_width)) sigoffset = IMAGE_WIDTH - disp_width; } else { if (offset > (int)(progdefaults.HighFreqCutoff - step * disp_width)) offset = (int)(progdefaults.HighFreqCutoff - step * disp_width); if (offset < 0) offset = 0; } } void WFdisp::setOffset(int v) { offset = v; checkoffset(); } void WFdisp::slew(int dir) { if (mode == SCOPE) sigoffset += dir; else offset += dir; checkoffset(); } void WFdisp::movetocenter() { if (mode == SCOPE) { sigoffset = IMAGE_WIDTH / 2; } else if (active_modem->get_mode() == MODE_FMT) { if (progdefaults.fmt_center_on_unknown) offset = cnt_unk_freq->value() - (disp_width * step / 2); else if (progdefaults.fmt_center_on_reference) offset = cnt_ref_freq->value() - (disp_width * step / 2); else if (progdefaults.fmt_center_on_median) offset = (cnt_unk_freq->value() + cnt_ref_freq->value())/2 - (disp_width * step / 2); else offset = progdefaults.PSKsweetspot - (disp_width * step / 2); } else offset = carrierfreq - (disp_width * step / 2); checkoffset(); } void WFdisp::carrier(int cf) { if (cf >= bandwidth / 2 && cf < (IMAGE_WIDTH - bandwidth / 2)) { carrierfreq = cf; makeMarker(); } } int WFdisp::carrier() { return carrierfreq; } void WFdisp::checkWidth() { disp_width = w(); if (mag == MAG_1) step = 4; if (mag == MAG_1 && disp_width > progdefaults.HighFreqCutoff/4) disp_width = progdefaults.HighFreqCutoff/4; if (mag == MAG_2) step = 2; if (mag == MAG_2 && disp_width > progdefaults.HighFreqCutoff/2) disp_width = progdefaults.HighFreqCutoff/2; if (mag == MAG_4) step = 1; } int WFdisp::checkMag() { checkWidth(); makeScale(); return mag; } int WFdisp::setMag(int m) { int mid = offset + (disp_width * step / 2); mag = m; checkMag(); if (centercarrier || Fl::event_shift()) { offset = mid - (disp_width * step / 2); } else { movetocenter(); } return mag; } int WFdisp::wfmag() { int mid = offset + (disp_width * step / 2); if (mag == MAG_1) mag = MAG_2; else if (mag == MAG_2) mag = MAG_4; else mag = MAG_1; checkMag(); if (centercarrier || Fl::event_shift()) { offset = mid - (disp_width * step / 2); } else { movetocenter(); } return mag; } void WFdisp::drawScale() { int fw = 60, xoff; static char szFreq[20]; double fr; uchar *pixmap; if (progdefaults.wf_audioscale) { pixmap = (scaleimage + (int)offset); fl_draw_image_mono( pixmap, x(), y() + WFTEXT, w(), WFSCALE, step, scale_width); fl_color(0xFFFFFF00); fl_font(progdefaults.WaterfallFontnbr, progdefaults.WaterfallFontsize); for (int i = 1; ; i++) { fr = 500.0 * i; snprintf(szFreq, sizeof(szFreq), "%7.0f", fr); fw = (int)fl_width(szFreq); xoff = (int) (( (1000.0/step) * i - fw) / 2.0 - offset /step ); if (xoff > 0 && xoff < w() - fw) fl_draw(szFreq, x() + xoff, y() + 10 ); if (xoff > w() - fw) break; } return; } int mdoffset = 0; std::string testmode = qso_opMODE->value(); bool xcvr_useFSK = ((testmode.find("RTTY") != std::string::npos) || (testmode.find("FSK") != std::string::npos) || ((testmode.find("DATA") != std::string::npos) && (use_nanoIO ||progdefaults.PseudoFSK)) ); usb = !ModeIsLSB(testmode); if ((testmode.find("DATA") != std::string::npos) && xcvr_useFSK) usb = !usb; if (testmode.find("CW") != std::string::npos) mdoffset = progdefaults.CWsweetspot; if (xcvr_useFSK) { if (progdefaults.useFSK) { if (usb) mdoffset = progdefaults.RTTYsweetspot + 170 / 2; // 45.45 baud 170 Hz shift else mdoffset = progdefaults.RTTYsweetspot - 170 / 2; } else { if (usb) mdoffset = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_baud] * 2; else mdoffset = progdefaults.xcvr_FSK_MARK; } } if (usb) pixmap = (scaleimage + (int)(((rfc - mdoffset) % 1000 + offset)) ); else pixmap = (scaleimage + (int)((1000 - (rfc + mdoffset) % 1000 + offset))); fl_draw_image_mono( pixmap, x(), y() + WFTEXT, w(), WFSCALE, step, scale_width); fl_color(0xFFFFFF00); fl_font(progdefaults.WaterfallFontnbr, progdefaults.WaterfallFontsize); for (int i = 1; ; i++) { if (usb) fr = (rfc - mdoffset - (rfc - mdoffset) % 500 + 500 * i)/1000.0; else fr = (rfc + mdoffset - (rfc + mdoffset) % 500 - 500 * i + 500)/1000.0; snprintf(szFreq, sizeof(szFreq), "%7.1f", fr); fw = (int)fl_width(szFreq); if (usb) xoff = (int) ( ( (1000.0/step) * i - fw) / 2.0 - (offset + (rfc - mdoffset) % 500) / step ); else xoff = (int) ( ( (1000.0/step) * i - fw) / 2.0 - (offset + 500 - (rfc + mdoffset) % 500) / step ); if (xoff > 0 && xoff < w() - fw) fl_draw(szFreq, x() + xoff, y() + 10 ); if (xoff > w() - fw) break; } } void WFdisp::drawMarker() { if (mode == SCOPE) return; int msize = RGBsize * scale_width; uchar *pixmap = (uchar *)(markerimage + (int)(offset)); uchar map[msize]; memset(map, 0, sizeof(map)); int y1 = y() + WFSCALE + WFTEXT; for (int yp = 0; yp < WFMARKER; yp++) { for (int xp = 0; xp < scale_width; xp++) { map[RGBsize * xp] = pixmap[RGBsize * (yp * scale_width + xp * step)]; map[RGBsize * xp + 1] = pixmap[RGBsize * (yp * scale_width + xp * step) + 1]; map[RGBsize * xp + 2] = pixmap[RGBsize * (yp * scale_width + xp * step) + 2]; } fl_draw_image((const uchar *)map, x(), y1 + yp, w(), 1, RGBsize, 0); } return; } void WFdisp::update_waterfall() { // transfer the fft history data into the WF image short int * __restrict__ p1, * __restrict__ p2; RGBI * __restrict__ p3, * __restrict__ p4; p1 = tmp_fft_db + offset + step/2; p2 = p1; p3 = fft_img; p4 = p3; short* __restrict__ limit = tmp_fft_db + image_area - step + 1; #define UPD_LOOP( Step, Operation ) \ case Step: for (int row = 0; row < image_height; row++) { \ p2 = p1; \ p4 = p3; \ for ( const short * __restrict__ last_p2 = std::min( p2 + Step * disp_width, limit +1 ); p2 < last_p2; p2 += Step ) { \ *(p4++) = mag2RGBI[ Operation ]; \ } \ p1 += IMAGE_WIDTH; \ p3 += disp_width; \ }; break if (progdefaults.WFaveraging) { switch(step) { UPD_LOOP( 4, (*p2 + *(p2+1) + *(p2+2) + *(p2-1) + *(p2-1))/5 ); UPD_LOOP( 2, (*p2 + *(p2+1) + *(p2-1))/3 ); UPD_LOOP( 1, *p2 ); default:; } } else { switch(step) { UPD_LOOP( 4, MAX( MAX( MAX ( MAX ( *p2, *(p2+1) ), *(p2+2) ), *(p2-2) ), *(p2-1) ) ); UPD_LOOP( 2, MAX( MAX( *p2, *(p2+1) ), *(p2-1) ) ); UPD_LOOP( 1, *p2 ); default:; } } #undef UPD_LOOP if (progdefaults.mon_wf_display && progdefaults.mon_xcvr_audio && progdefaults.mon_dsp_audio) { int trk_low = progdefaults.RxFilt_low; int trk_high = progdefaults.RxFilt_high; RGBI *pos1 = fft_img + trk_low / step; RGBI *pos2 = fft_img + trk_high / step; if (likely(pos1 >= fft_img && pos2 < fft_img + disp_width)) { if (progdefaults.mon_wide_tracks) { for (int y = 0; y < image_height; y ++) { *(pos1 + 1) = *pos1 = progdefaults.monitorRGBI; *(pos2 - 1) = *pos2 = progdefaults.monitorRGBI; pos1 += disp_width; pos2 += disp_width; } } else { for (int y = 0; y < image_height; y ++) { *pos1 = progdefaults.monitorRGBI; *pos2 = progdefaults.monitorRGBI; pos1 += disp_width; pos2 += disp_width; } } } } // draw RsID detection zone if ( progdefaults.rsid && !progdefaults.rsidWideSearch && ( (carrierfreq - progdefaults.rsid_min_bw / 2) > 1) && ( (carrierfreq + progdefaults.rsid_min_bw / 2) < (progdefaults.HighFreqCutoff - 1))) { RGBI RGBIrsid; RGBIrsid.I = progdefaults.rsidRGBI.I; RGBIrsid.R = progdefaults.rsidRGBI.R; RGBIrsid.G = progdefaults.rsidRGBI.G; RGBIrsid.B = progdefaults.rsidRGBI.B; RGBI *pos1 = fft_img + (carrierfreq - offset - progdefaults.rsid_min_bw / 2) / step; RGBI *pos2 = fft_img + (carrierfreq - offset + progdefaults.rsid_min_bw / 2) / step; int dash = 0; for (int y = 0; y < image_height; y++) { dash = (dash + 1) % 6; if (dash == 0 || dash == 1 || dash == 2) { *(pos1) = RGBIrsid; *(pos2) = RGBIrsid; } pos1 += disp_width; pos2 += disp_width; } } if (active_modem && progdefaults.UseBWTracks) { trx_mode mode = active_modem->get_mode(); if (mode == MODE_FMT) { int bw =progdefaults.FMT_filter; int trk = int(round(cnt_unk_freq->value())); RGBI *pos1 = fft_img + (trk - offset - bw) / step; RGBI *pos2 = fft_img + (trk - offset + bw) / step; RGBI unk_trk_color, ref_trk_color; Fl::get_color(progdefaults.FMT_unk_color, unk_trk_color.R, unk_trk_color.G, unk_trk_color.B); Fl::get_color(progdefaults.FMT_ref_color, ref_trk_color.R, ref_trk_color.G, ref_trk_color.B); if (likely(pos1 >= fft_img && pos2 < fft_img + disp_width)) { if (progdefaults.UseWideTracks) { for (int y = 0; y < image_height; y ++) { *(pos1 + 1) = *pos1 = unk_trk_color; *(pos2 - 1) = *pos2 = unk_trk_color; pos1 += disp_width; pos2 += disp_width; } } else { for (int y = 0; y < image_height; y ++) { *pos1 = unk_trk_color; *pos2 = unk_trk_color; pos1 += disp_width; pos2 += disp_width; } } } trk = int(round(cnt_ref_freq->value())); pos1 = fft_img + (trk - offset - bw) / step; pos2 = fft_img + (trk - offset + bw) / step; if (likely(pos1 >= fft_img && pos2 < fft_img + disp_width)) { if (progdefaults.UseWideTracks) { for (int y = 0; y < image_height; y ++) { *(pos1 + 1) = *pos1 = ref_trk_color; *(pos2 - 1) = *pos2 = ref_trk_color; pos1 += disp_width; pos2 += disp_width; } } else { for (int y = 0; y < image_height; y ++) { *pos1 = ref_trk_color; *pos2 = ref_trk_color; pos1 += disp_width; pos2 += disp_width; } } } } else { int bw_lo = bandwidth / 2; int bw_hi = bandwidth / 2; trx_mode mode = active_modem->get_mode(); if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; if (mode == MODE_FSQ || mode == MODE_IFKP) { bw_hi = bw_lo = 69 * bandwidth / 100; } RGBI *pos1 = fft_img + (carrierfreq - offset - bw_lo) / step; RGBI *pos2 = fft_img + (carrierfreq - offset + bw_hi) / step; if (unlikely(pos2 == fft_img + disp_width)) pos2--; if (likely(pos1 >= fft_img && pos2 < fft_img + disp_width)) { RGBI rgbi1, rgbi2 ; if (mode == MODE_RTTY && progdefaults.useMARKfreq) { if (active_modem->get_reverse()) { rgbi1 = progdefaults.rttymarkRGBI; rgbi2 = progdefaults.bwTrackRGBI; } else { rgbi1 = progdefaults.bwTrackRGBI; rgbi2 = progdefaults.rttymarkRGBI; } } else { rgbi1 = progdefaults.bwTrackRGBI; rgbi2 = progdefaults.bwTrackRGBI; } if (progdefaults.UseWideTracks) { for (int y = 0; y < image_height; y ++) { *(pos1 + 1) = *pos1 = rgbi1; *(pos2 - 1) = *pos2 = rgbi2; pos1 += disp_width; pos2 += disp_width; } } else { for (int y = 0; y < image_height; y ++) { *pos1 = rgbi1; *pos2 = rgbi2; pos1 += disp_width; pos2 += disp_width; } } } } } // draw notch if ((notch_frequency > 1) && (notch_frequency < progdefaults.HighFreqCutoff - 1)) { RGBInotch.I = progdefaults.notchRGBI.I; RGBInotch.R = progdefaults.notchRGBI.R; RGBInotch.G = progdefaults.notchRGBI.G; RGBInotch.B = progdefaults.notchRGBI.B; RGBI *notch = fft_img + (notch_frequency - offset) / step; int dash = 0; for (int y = 0; y < image_height; y++) { dash = (dash + 1) % 6; if (dash == 0 || dash == 1 || dash == 2) *(notch-1) = *notch = *(notch+1) = RGBInotch; notch += disp_width; } } if (progdefaults.show_psm_btn && progStatus.kpsql_enabled && (trx_state == STATE_RX)) signal_psm(); } void WFdisp::drawcolorWF() { uchar *pixmap = (uchar *)fft_img; update_waterfall(); if (active_modem && wantcursor && (progdefaults.UseCursorLines || progdefaults.UseCursorCenterLine) ) { trx_mode mode = active_modem->get_mode(); int bw_lo = bandwidth / 2; int bw_hi = bandwidth / 2; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; if (mode == MODE_FSQ || mode == MODE_IFKP) bw_hi = bw_hi * 32 / 33; if (mode == MODE_FMT) { bw_lo = bw_hi = progdefaults.FMT_filter; } RGBI *pos0 = (fft_img + cursorpos); RGBI *pos1 = (fft_img + cursorpos - bw_lo/step); RGBI *pos2 = (fft_img + cursorpos + bw_hi/step); if (pos1 >= fft_img && pos2 < fft_img + disp_width) { for (int y = 0; y < image_height; y ++) { if (progdefaults.UseCursorLines) { *pos1 = *pos2 = progdefaults.cursorLineRGBI; if (progdefaults.UseWideCursor) *(pos1 + 1) = *(pos2 - 1) = *pos1; } if (progdefaults.UseCursorCenterLine) { *pos0 = progdefaults.cursorCenterRGBI; if (progdefaults.UseWideCenter) *(pos0 - 1) = *(pos0 + 1) = *pos0; } pos0 += disp_width; pos1 += disp_width; pos2 += disp_width; } } } fl_color(FL_BLACK); fl_rectf(x(), y(), w(), WFSCALE + WFMARKER + WFTEXT); fl_color(fl_rgb_color(palette[0].R, palette[0].G, palette[0].B)); fl_rectf(x(), y() + WFSCALE + WFMARKER + WFTEXT, w(), image_height); fl_draw_image( pixmap, x(), y() + WFSCALE + WFMARKER + WFTEXT, disp_width, image_height, sizeof(RGBI), disp_width * sizeof(RGBI) ); drawScale(); } void WFdisp::drawspectrum() { int sig; long offset_idx = 0; long ynext, h1 = image_height - 1, ffty = 0, fftpixel = IMAGE_WIDTH * h1, graylevel = 220; uchar *pixmap = (uchar *)fft_sig_img + offset / step; memset (fft_sig_img, 0, image_area); fftpixel /= step; for (int c = 0; c < IMAGE_WIDTH; c += step) { sig = tmp_fft_db[c]; if (step == 1) sig = tmp_fft_db[c]; else if (step == 2) sig = MAX(tmp_fft_db[c], tmp_fft_db[c+1]); else sig = MAX( MAX ( MAX ( tmp_fft_db[c], tmp_fft_db[c+1] ), tmp_fft_db[c+2] ), tmp_fft_db[c+3]); ynext = h1 * sig / 256; offset_idx = (IMAGE_WIDTH/step); while ((ffty < ynext)) { fft_sig_img[fftpixel -= offset_idx] = graylevel; ffty++; if (fftpixel < offset_idx) { std::cout << "corrupt index 1\n"; break; } } while ((ffty > ynext)) { fft_sig_img[fftpixel += offset_idx] = graylevel; ffty--; if (fftpixel >= (image_area - 1)) { std::cout << "corrupt index 2\n"; break; } } if (fftpixel >= 0 && fftpixel <= image_area) fft_sig_img[fftpixel++] = graylevel; else std::cout << "fft_sig_image index out of bounds: " << fftpixel << std::endl; } if (progdefaults.UseBWTracks) { if (active_modem == fmt_modem) { uchar *pos1; uchar *pos2; int trk1 = int(round(cnt_unk_freq->value())); int trk2 = int(round(cnt_ref_freq->value())); int bw = int(round(progdefaults.FMT_filter)); pos1 = pixmap + (trk1 - offset - bw) / step; pos2 = pixmap + (trk1 - offset + bw) / step; if (pos1 >= pixmap && pos2 < pixmap + disp_width) for (int y = 0; y < image_height; y ++) { *pos1 = *pos2 = 255; if (progdefaults.UseWideTracks) { *(pos1 + 1) = *(pos2 - 1) = 255; } pos1 += IMAGE_WIDTH/step; pos2 += IMAGE_WIDTH/step; } pos1 = pixmap + (trk2 - offset - bw) / step; pos2 = pixmap + (trk2 - offset + bw) / step; if (pos1 >= pixmap && pos2 < pixmap + disp_width) { for (int y = 0; y < image_height; y ++) { *pos1 = *pos2 = 255; if (progdefaults.UseWideTracks) { *(pos1 + 1) = *(pos2 - 1) = 255; } pos1 += IMAGE_WIDTH/step; pos2 += IMAGE_WIDTH/step; } } } else { uchar *pos1 = pixmap + (carrierfreq - offset - bandwidth/2) / step; uchar *pos2 = pixmap + (carrierfreq - offset + bandwidth/2) / step; if (pos1 >= pixmap && pos2 < pixmap + disp_width) { for (int y = 0; y < image_height; y ++) { *pos1 = *pos2 = 255; if (progdefaults.UseWideTracks) { *(pos1 + 1) = 255; *(pos2 - 1) = 255; } pos1 += IMAGE_WIDTH/step; pos2 += IMAGE_WIDTH/step; } } } } if (active_modem && wantcursor && (progdefaults.UseCursorLines || progdefaults.UseCursorCenterLine)) { trx_mode mode = active_modem->get_mode(); int bw_lo = bandwidth / 2; int bw_hi = bandwidth / 2; if (mode >= MODE_MT63_500S && mode <= MODE_MT63_2000L) bw_hi = bw_hi * 31 / 32; if (mode == MODE_FSQ || mode == MODE_IFKP) bw_hi = bw_hi * 32 / 33; uchar *pos0 = pixmap + cursorpos; uchar *pos1 = (pixmap + cursorpos - bw_lo/step); uchar *pos2 = (pixmap + cursorpos + bw_hi/step); for (int y = 0; y < h1; y ++) { if (progdefaults.UseCursorLines) { *pos1 = *pos2 = 255; if (progdefaults.UseWideCursor) *(pos1 + 1) = *(pos2 - 1) = *pos1; } if (progdefaults.UseCursorCenterLine) { *pos0 = 255; if (progdefaults.UseWideCenter) *(pos0-1) = *(pos0+1) = *(pos0); } pos0 += IMAGE_WIDTH/step; pos1 += IMAGE_WIDTH/step; pos2 += IMAGE_WIDTH/step; } } // draw notch if ((notch_frequency > 1) && (notch_frequency < progdefaults.HighFreqCutoff - 1)) { uchar *notch = pixmap + (notch_frequency - offset) / step; int dash = 0; for (int y = 0; y < image_height; y++) { dash = (dash + 1) % 6; if (dash == 0 || dash == 1 || dash == 2) *(notch-1) = *notch = *(notch+1) = 255; notch += IMAGE_WIDTH/step; } } fl_color(FL_BLACK); fl_rectf(x(), y(), w(), WFSCALE + WFMARKER + WFTEXT + image_height); fl_draw_image_mono( pixmap, x(), y() + WFSCALE + WFMARKER + WFTEXT, disp_width, image_height, 1, IMAGE_WIDTH / step); drawScale(); } void WFdisp::drawsignal() { uchar *pixmap = (uchar *)(sig_img + sigoffset); fl_color(FL_BLACK); fl_rectf(x() + disp_width, y(), w() - disp_width, h()); fl_draw_image_mono(pixmap, x(), y(), disp_width, h(), 1, IMAGE_WIDTH); } void WFdisp::draw() { checkoffset(); checkWidth(); if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { drawcolorWF(); drawMarker(); return; } switch (mode) { case SPECTRUM : drawspectrum(); drawMarker(); break; case SCOPE : drawsignal(); break; case WATERFALL : default: drawcolorWF(); drawMarker(); } } //======================================================================= // waterfall //======================================================================= void x1_cb(Fl_Widget *w, void* v) { waterfall *wf = (waterfall *)w->parent(); int m = wf->wfdisp->wfmag(); if (m == MAG_1) w->label("x1"); if (m == MAG_2) w->label("x2"); if (m == MAG_4) w->label("x4"); restoreFocus(); } void slew_left(Fl_Widget *w, void * v) { waterfall *wf = (waterfall *)w->parent(); wf->wfdisp->slew(-100); restoreFocus(); } void slew_right(Fl_Widget *w, void * v) { waterfall *wf = (waterfall *)w->parent(); wf->wfdisp->slew(100); restoreFocus(); } void center_cb(Fl_Widget *w, void *v) { waterfall *wf = (waterfall *)w->parent(); wf->wfdisp->movetocenter(); restoreFocus(); } void killMacroTimer() { stopMacroTimer(); } void carrier_cb(Fl_Widget *w, void *v) { Fl_Counter *cntr = (Fl_Counter *)w; waterfall *wf = (waterfall *)w->parent(); int selfreq = (int) cntr->value(); if (selfreq > progdefaults.HighFreqCutoff) selfreq = progdefaults.HighFreqCutoff - wf->wfdisp->Bandwidth() / 2; killMacroTimer(); if (active_modem) active_modem->set_freq(selfreq); wf->wfdisp->carrier(selfreq); restoreFocus(); } void do_qsy(bool dir) { if (!active_modem) return; static std::vector qsy_stack; qrg_mode_t m; wf->xmtlock->value(0); wf->xmtlock->do_callback(); if (dir) { // store m.rfcarrier = wf->rfcarrier(); int wfc = m.carrier = active_modem->get_freq(); qsy_stack.push_back(m); m.rmode = qso_opMODE->value(); trx_mode md = active_modem->get_mode(); std::string testmode = qso_opMODE->value(); bool xcvr_useFSK = ((testmode.find("RTTY") != std::string::npos) || (testmode.find("FSK") != std::string::npos) || ((testmode.find("DATA") != std::string::npos) && (use_nanoIO)) ); // qsy to the sweet spot frequency that is the center of the PBF in the rig switch (md) { case MODE_CW: m.carrier = progdefaults.CWsweetspot; break; case MODE_RTTY: if (xcvr_useFSK) { // qsy operates on change in audio center track m.carrier = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift]/2; } else m.carrier = progdefaults.RTTYsweetspot; break; case MODE_FMT: if (progdefaults.fmt_center_on_unknown) m.carrier = cnt_unk_freq->value(); else if (progdefaults.fmt_center_on_reference) m.carrier = cnt_ref_freq->value(); else if (progdefaults.fmt_center_on_median) m.carrier = (cnt_unk_freq->value() + cnt_ref_freq->value())/2; else m.carrier = progdefaults.PSKsweetspot; break; default: m.carrier = progdefaults.PSKsweetspot; break; } if (m.rmode.find("CW") != std::string::npos) { if (wf->USB()) m.rfcarrier += (wfc - m.carrier); else m.rfcarrier -= (wfc - m.carrier); } else if ( (md == MODE_RTTY) && xcvr_useFSK ) { if (wf->USB()) { m.rfcarrier += (wfc - m.carrier); } else { m.rfcarrier -= (wfc - m.carrier); } } else { if (wf->USB()) m.rfcarrier += (wf->carrier() - m.carrier); else m.rfcarrier -= (wf->carrier() - m.carrier); } } else { // qsy to top of stack if (qsy_stack.size()) { m = qsy_stack.back(); qsy_stack.pop_back(); } } if (m.carrier > 0) qsy(m.rfcarrier, m.carrier); } void qsy_cb(Fl_Widget *w, void *v) { if (Fl::event_button() != FL_RIGHT_MOUSE) do_qsy(true); else do_qsy(false); restoreFocus(); } void rate_cb(Fl_Widget *w, void *v) { waterfall* wf = static_cast(w->parent()); WFspeed new_speed; switch (wf->wfdisp->Speed()) { case SLOW: new_speed = NORMAL; break; case NORMAL: default: new_speed = FAST; break; case FAST: new_speed = PAUSE; break; case PAUSE: new_speed = SLOW; break; } wf->Speed(new_speed); restoreFocus(); } //extern void reset_xmlchars(); void xmtrcv_cb(Fl_Widget *w, void *vi) { if (!active_modem) return; Fl_Light_Button *b = (Fl_Light_Button *)w; int v = b->value(); if (!(active_modem->get_cap() & modem::CAP_TX)) { b->value(0); restoreFocus(); return; } if (v == 1) { killMacroTimer(); active_modem->set_stopflag(false); if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) set_xmtrcv_selection_color_pending(); trx_transmit(); } else { if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { psm_transmit_ended(PSM_ABORT); xmtrcv_selection_color(progdefaults.XmtColor); } if (btnTune->value()) { btnTune->value(0); btnTune->do_callback(); } else { TransmitText->clear(); if (active_modem->get_mode() == MODE_FSQ && fsq_tx_text) fsq_tx_text->clear(); else if (active_modem->get_mode() == MODE_IFKP && ifkp_tx_text) ifkp_tx_text->clear(); if (arq_text_available) AbortARQ(); if(xmltest_char_available) reset_xmlchars(); if(kiss_text_available) flush_kiss_tx_buffer(); if (progStatus.timer) { progStatus.timer = 0; } queue_reset(); active_modem->set_stopflag(true); } } restoreFocus(); } void xmtlock_cb(Fl_Widget *w, void *vi) { if (!active_modem) return; Fl_Light_Button *b = (Fl_Light_Button *)w; int v = b->value(); active_modem->set_freqlock(v ? true : false ); restoreFocus(); } void waterfall::set_XmtRcvBtn(bool val) { xmtrcv->value(val); if (!val && btnTune->value()) { btnTune->value(0); btnTune->labelcolor(FL_FOREGROUND_COLOR); } } void set_wf_mode(void) { static const char* names[NUM_WF_MODES] = { "WF", "FFT", "SIG" }; int m = 0; if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { if(wf->wfdisp->Mode() == WATERFALL) { return; } m = WATERFALL; } else { m = wf->wfdisp->Mode() + (Fl::event_button() == FL_LEFT_MOUSE ? 1 : -1); } m = WCLAMP(m, WATERFALL, NUM_WF_MODES-1); if (m == SCOPE) wf->x1->deactivate(); else wf->x1->activate(); wf->wfdisp->Mode(static_cast(m)); wf->mode->label(names[m]); restoreFocus(); } void mode_cb(Fl_Widget* w, void*) { set_wf_mode(); } void reflevel_cb(Fl_Widget *w, void *v) { waterfall *wf = (waterfall *)w->parent(); double val = wf->wfRefLevel->value(); progdefaults.wfRefLevel = val; restoreFocus(); } void ampspan_cb(Fl_Widget *w, void *v) { waterfall *wf = (waterfall *)w->parent(); double val = wf->wfAmpSpan->value(); wf->wfdisp->Ampspan(val); progdefaults.wfAmpSpan = val; restoreFocus(); } void btnRev_cb(Fl_Widget *w, void *v) { if (!active_modem) return; waterfall *wf = (waterfall *)w->parent(); Fl_Light_Button *b = (Fl_Light_Button *)w; wf->Reverse(b->value()); progdefaults.rtty_reverse = wf->Reverse(); active_modem->set_reverse(wf->Reverse()); modeband.set_mode_reverse(wf->Reverse()); progdefaults.changed = true; restoreFocus(); } void btnMem_cb(Fl_Widget *, void *menu_event) { if (!active_modem) return; static std::vector qrg_list; enum { SELECT, APPEND, REPLACE, REMOVE, CLEAR }; int op = SELECT, elem = 0; if (menu_event) { // event on popup menu elem = wf->mbtnMem->value(); switch (Fl::event_button()) { case FL_MIDDLE_MOUSE: op = REPLACE; break; case FL_LEFT_MOUSE: case FL_RIGHT_MOUSE: default: op = (Fl::event_state() & FL_SHIFT) ? REMOVE : SELECT; break; } } else { // button press switch (Fl::event_button()) { case FL_RIGHT_MOUSE: return; case FL_MIDDLE_MOUSE: // select last if ((elem = qrg_list.size() - 1) < 0) return; op = SELECT; break; case FL_LEFT_MOUSE: default: op = (Fl::event_state() & FL_SHIFT) ? CLEAR : APPEND; break; } } qrg_mode_t m; switch (op) { case SELECT: m = qrg_list[elem]; if (active_modem != *mode_info[m.mode].modem) { init_modem_sync(m.mode); } if (m.rfcarrier && m.rfcarrier != wf->rfcarrier()) qsy(m.rfcarrier, m.carrier); else active_modem->set_freq(m.carrier); break; case REMOVE: wf->mbtnMem->remove(elem); qrg_list.erase(qrg_list.begin() + elem); break; case CLEAR: wf->mbtnMem->clear(); qrg_list.clear(); break; case APPEND: case REPLACE: m.rfcarrier = wf->rfcarrier(); m.carrier = active_modem->get_freq(); m.mode = active_modem->get_mode(); if (op == APPEND) { if (find(qrg_list.begin(), qrg_list.end(), m) == qrg_list.end()) qrg_list.push_back(m); else break; } else qrg_list[elem] = m; // write the menu item text { std::ostringstream o; o << mode_info[m.mode].name << " @@ "; if (m.rfcarrier > 0) { // write 1000s separators char s[20], *p = s + sizeof(s) - 1; int i = 0; *p = '\0'; do { if (i % 3 == 0 && i) *--p = '.'; *--p = '0' + m.rfcarrier % 10; ++i; } while ((m.rfcarrier /= 10) && p > s); o << p << (wf->USB() ? " + " : " - "); } o << m.carrier; if (op == APPEND) { wf->mbtnMem->add(o.str().c_str()); } else { wf->mbtnMem->replace(elem, o.str().c_str()); } } break; } restoreFocus(); } void waterfall::opmode() { if (!active_modem) return; int val = (int)active_modem->get_bandwidth(); wfdisp->carrier((int)CLAMP( wfdisp->carrier(), progdefaults.LowFreqCutoff + val / 2, progdefaults.HighFreqCutoff - val / 2)); wfdisp->Bandwidth( val ); wfcarrier->range(progdefaults.LowFreqCutoff + val/2, progdefaults.HighFreqCutoff - val/2); } void waterfall::carrier(int f) { wfdisp->carrier(f); wfcarrier->value(f); wfcarrier->damage(FL_DAMAGE_ALL); } int waterfall::Speed() { return (int)wfdisp->Speed(); } void waterfall::Speed(int rate) { WFspeed speed = static_cast(rate); wfdisp->Speed(speed); const char* label; switch (speed) { case SLOW: label = "SLOW"; break; case NORMAL: default: label = "NORM"; break; case FAST: label = "FAST"; break; case PAUSE: label = "PAUSE"; break; } wfrate->label(label); wfrate->redraw_label(); } int waterfall::Mag() { return wfdisp->Mag(); } void waterfall::Mag(int m) { wfdisp->Mag(m); if (m == MAG_1) x1->label("x1"); if (m == MAG_2) x1->label("x2"); if (m == MAG_4) x1->label("x4"); x1->redraw_label(); } int waterfall::Offset() { return wfdisp->Offset(); } void waterfall::Offset(int v) { wfdisp->Offset(v); } int waterfall::Carrier() { return wfdisp->carrier(); } void waterfall::Carrier(int f) { if (active_modem) active_modem->set_freq(f); } void waterfall::rfcarrier(unsigned long long cf) { wfdisp->rfcarrier(cf); } unsigned long long waterfall::rfcarrier() { return wfdisp->rfcarrier(); } void waterfall::setRefLevel() { wfRefLevel->value(progdefaults.wfRefLevel); } void waterfall::setAmpSpan() { wfAmpSpan->value(progdefaults.wfAmpSpan); wfdisp->Ampspan(progdefaults.wfAmpSpan); } void waterfall::USB(bool b) { if (wfdisp->USB() == b) return; wfdisp->USB(b); if (active_modem) active_modem->set_reverse(reverse); REQ(&viewer_redraw); } bool waterfall::USB() { return wfdisp->USB(); } void waterfall::show_scope(bool on) { if (on) { wfscope->show(); wfscope->position(wf->x() + wf->w() - wf_dim - BEZEL, wf->y()); wfdisp->size( wf->w() - 2 * BEZEL - wf_dim, wf_dim - 2 * BEZEL); rs1->init_sizes(); } else { wfscope->hide(); wfscope->position(wf->x() + wf->w(), wf->y()); wfdisp->size( wf->w() - 2 * BEZEL, wf_dim - 2 * BEZEL); rs1->init_sizes(); } wfscope->redraw(); } waterfall::waterfall(int x0, int y0, int w0, int h0, char *lbl) : Fl_Group(x0,y0,w0,h0,lbl) { int xpos; float ratio; ratio = w0 * 1.0 / bwdths; wf_dim = h() - BTN_HEIGHT - 4; buttonrow = h() + y() - BTN_HEIGHT - 1; rs1 = new Fl_Group(x(), y(), w(), wf_dim); rs1->box(FL_DOWN_BOX); wfdisp = new WFdisp( x() + BEZEL, y() + BEZEL, w() - 2 * BEZEL, wf_dim - 2 * BEZEL); wfscope = new Digiscope (x() + w(), y(), wf_dim, wf_dim); wfscope->bk_color(progdefaults.digi_background); wfscope->axis_color(progdefaults.digi_axis_color); wfscope->user_color_1(progdefaults.digi_color_1); wfscope->user_color_2(progdefaults.digi_color_2); wfscope->user_color_3(progdefaults.digi_color_3); wfscope->user_color_4(progdefaults.digi_color_4); rs1->resizable(wfdisp); rs1->end(); wfscope->hide(); xpos = x() + wSpace; mode = new Fl_Button(xpos, buttonrow, (int)(bwFFT*ratio), BTN_HEIGHT, "WF"); mode->callback(mode_cb, 0); mode->tooltip(_("Waterfall / FFT / Scope")); xpos = xpos + (int)(bwFFT*ratio) + wSpace; wfRefLevel = new Fl_Counter2(xpos, buttonrow, (int)(cwRef*ratio), BTN_HEIGHT ); wfRefLevel->callback(reflevel_cb, 0); wfRefLevel->step(1.0); wfRefLevel->precision(0); wfRefLevel->range(-80.0, 0.0);//(-40.0, 0.0); wfRefLevel->value(0.0);//(-20.0); wfRefLevel->tooltip(_("Upper signal level (dB)")); wfRefLevel->type(FL_SIMPLE_COUNTER); xpos = xpos + (int)(cwRef*ratio) + wSpace; wfAmpSpan = new Fl_Counter2(xpos, buttonrow, (int)(cwRef*ratio), BTN_HEIGHT ); wfAmpSpan->callback(ampspan_cb, 0); wfAmpSpan->step(1.0); wfAmpSpan->precision(0); wfAmpSpan->range(6.0, 90.0); wfAmpSpan->value(70.0); wfdisp->Ampspan(70.0); wfAmpSpan->tooltip(_("Signal range (dB)")); wfAmpSpan->type(FL_SIMPLE_COUNTER); xpos = xpos + (int)(cwRef*ratio) + wSpace; x1 = new Fl_Button(xpos, buttonrow, (int)(bwX1*ratio), BTN_HEIGHT, "x1"); x1->callback(x1_cb, 0); x1->tooltip(_("Change waterfall scale")); xpos = xpos + (int)(bwX1*ratio) + wSpace; left = new Fl_Repeat_Button(xpos, buttonrow, (int)(bwMov*ratio), BTN_HEIGHT, "@<"); left->callback(slew_left, 0); left->tooltip(_("Slew display lower in frequency")); xpos = xpos + (int)(bwMov*ratio); center = new Fl_Button(xpos, buttonrow, (int)(bwMov*ratio), BTN_HEIGHT, "@||"); center->callback(center_cb, 0); center->tooltip(_("Center display on signal")); xpos = xpos + (int)(bwMov*ratio); right = new Fl_Repeat_Button(xpos, buttonrow, (int)(bwMov*ratio), BTN_HEIGHT, "@>"); right->callback(slew_right, 0); right->tooltip(_("Slew display higher in frequency")); xpos = xpos + (int)(bwMov*ratio) + wSpace; wfrate = new Fl_Button(xpos, buttonrow, (int)(bwRate*ratio), BTN_HEIGHT, "Norm"); wfrate->callback(rate_cb, 0); wfrate->tooltip(_("Waterfall drop speed")); xpos = xpos + (int)(bwRate*ratio) + wSpace; wfcarrier = new Fl_Counter2(xpos, buttonrow, (int)(cwCnt*ratio), BTN_HEIGHT ); wfcarrier->callback(carrier_cb, 0); wfcarrier->step(1.0); wfcarrier->lstep(10.0); wfcarrier->precision(0); wfcarrier->range(16.0, progdefaults.HighFreqCutoff - 16.0); wfcarrier->value(wfdisp->carrier()); wfcarrier->tooltip(_("Adjust cursor frequency")); xpos = xpos + (int)(cwCnt*ratio) + wSpace; qsy = new Fl_Button(xpos, buttonrow, (int)(bwQsy*ratio), BTN_HEIGHT, "QSY"); qsy->callback(qsy_cb, 0); qsy->tooltip(_("Center in passband\nRight click to undo")); qsy->deactivate(); xpos = xpos + (int)(bwQsy*ratio) + wSpace; btnMem = new Fl_Button(xpos, buttonrow, (int)(bwMem*ratio), BTN_HEIGHT, "Store"); btnMem->callback(btnMem_cb, 0); btnMem->tooltip(_("Store mode and frequency\nRight click for list")); mbtnMem = new Fl_Menu_Button(btnMem->x(), btnMem->y(), btnMem->w(), btnMem->h(), 0); mbtnMem->callback(btnMem->callback(), mbtnMem); mbtnMem->type(Fl_Menu_Button::POPUP3); xpos = xpos + (int)(bwMem*ratio) + wSpace; xmtlock = new Fl_Light_Button(xpos, buttonrow, (int)(bwXmtLock*ratio), BTN_HEIGHT, "Lk"); xmtlock->callback(xmtlock_cb, 0); xmtlock->value(0); xmtlock->selection_color(progdefaults.LkColor); xmtlock->tooltip(_("Lock transmit frequency")); /// We save this flag which is used by rtty decoding. xpos = xpos + (int)(bwXmtLock*ratio) + wSpace; btnRev = new Fl_Light_Button(xpos, buttonrow, (int)(bwRev*ratio), BTN_HEIGHT, "Rv"); btnRev->callback(btnRev_cb, 0); reverse = progdefaults.rtty_reverse; btnRev->value(reverse); btnRev->selection_color(progdefaults.RevColor); btnRev->tooltip(_("Reverse")); xpos = w() - (int)(bwXmtRcv*ratio) - wSpace; xmtrcv = new Fl_Light_Button(xpos, buttonrow, (int)(bwXmtRcv*ratio) - BEZEL, BTN_HEIGHT, "T/R"); xmtrcv->callback(xmtrcv_cb, 0); xmtrcv->selection_color(progdefaults.XmtColor); xmtrcv->value(0); xmtrcv->tooltip(_("Transmit/Receive")); end(); } void waterfall::UI_select(bool on) { if (on) { if (!progdefaults.WF_UIrev) btnRev->hide(); else btnRev->show(); if (!progdefaults.WF_UIwfcarrier) wfcarrier->hide(); else wfcarrier->show(); if (!progdefaults.WF_UIwfreflevel) wfRefLevel->hide(); else wfRefLevel->show(); if (!progdefaults.WF_UIwfampspan) wfAmpSpan->hide(); else wfAmpSpan->show(); if (!progdefaults.WF_UIxmtlock) xmtlock->hide(); else xmtlock->show(); if (!progdefaults.WF_UIqsy) qsy->hide(); else qsy->show(); if (!progdefaults.WF_UIwfmode) mode->hide(); else mode->show(); if (!progdefaults.WF_UIx1) x1->hide(); else x1->show(); if (!progdefaults.WF_UIwfshift) { left->hide(); center->hide(); right->hide(); } else { left->show(); center->show(); right->show(); } if (!progdefaults.WF_UIwfdrop) wfrate->hide(); else wfrate->show(); if (!progdefaults.WF_UIwfstore) { btnMem->hide(); mbtnMem->hide(); } else { btnMem->show(); mbtnMem->show(); } //if (noUI) xmtrcv->hide(); } else { // btnRev->show(); if (!progdefaults.WF_UIrev) btnRev->hide(); else btnRev->show(); wfcarrier->show(); wfRefLevel->show(); wfAmpSpan->show(); xmtlock->show(); qsy->show(); mode->show(); x1->show(); left->show(); center->show(); right->show(); wfrate->show(); btnMem->show(); mbtnMem->show(); } btnRev->redraw(); wfcarrier->redraw(); wfRefLevel->redraw(); wfAmpSpan->redraw(); xmtlock->redraw(); qsy->redraw(); mode->redraw(); x1->redraw(); left->redraw(); center->redraw(); right->redraw(); wfrate->redraw(); btnMem->redraw(); mbtnMem->redraw(); } int waterfall::handle(int event) { if (event != FL_MOUSEWHEEL || Fl::event_inside(wfdisp)) return Fl_Group::handle(event); int d; if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) ) return 1; // this does not belong here, but we don't have access to this widget's // handle method (or its parent's) if (active_modem && Fl::event_inside(MODEstatus)) { trx_mode mode = active_modem->get_mode(); for (;;) { mode = WCLAMP(mode + d, 0, NUM_MODES - 1); if ((mode >= NUM_RXTX_MODES && mode < NUM_MODES) || progdefaults.visible_modes.test(mode)) break; } init_modem(mode); return 1; } // as above; handle wheel events for the macro bar extern void altmacro_cb(Fl_Widget *w, void *v); if (progdefaults.macro_wheel) { if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (Fl::event_inside(macroFrame2)) { altmacro_cb(btnAltMacros2, reinterpret_cast(d)); return 1; } } else { if (Fl::event_inside(macroFrame1)) { altmacro_cb(btnAltMacros1, reinterpret_cast(d)); return 1; } } } return Fl_Group::handle(event); } static Fl_Cursor cursor = FL_CURSOR_DEFAULT; static void hide_cursor(void *w) { if (cursor != FL_CURSOR_NONE) reinterpret_cast(w)->window()->cursor(cursor = FL_CURSOR_NONE); } void waterfall::insert_text(bool check) { if (active_modem && check) { qrg_mode_t m; m.rfcarrier = wf->rfcarrier(); m.carrier = active_modem->get_freq(); m.mode = active_modem->get_mode(); extern qrg_mode_t last_marked_qrg; if (last_marked_qrg.mode == m.mode && last_marked_qrg.rfcarrier == m.rfcarrier && abs(last_marked_qrg.carrier - m.carrier) <= 16) return; last_marked_qrg = m; } std::string::size_type i; if ((i = progdefaults.WaterfallClickText.find("")) != std::string::npos) { std::string s = progdefaults.WaterfallClickText; s[i] = '\0'; ReceiveText->addstr(s); note_qrg(false); // ReceiveText->addstr(s); // ReceiveText->addstr(s.c_str() + i + strlen("")); } else ReceiveText->addstr(progdefaults.WaterfallClickText, FTextView::SKIP); } static void find_signal_text(void) { if (!active_modem) return; int freq = active_modem->get_freq(); trx_mode mode = active_modem->get_mode(); extern std::map qrg_marks; std::map::const_iterator i; for (i = qrg_marks.begin(); i != qrg_marks.end(); ++i) if (i->second.mode == mode && abs(i->second.carrier - freq) <= 20) break; if (i != qrg_marks.end()) { // Search backward from the current text cursor position, then // try the other direction int pos = ReceiveText->insert_position(); if (ReceiveText->buffer()->search_backward(pos, i->first.c_str(), &pos, 1) || ReceiveText->buffer()->search_forward(pos, i->first.c_str(), &pos, 1)) { ReceiveText->insert_position(pos); ReceiveText->show_insert_position(); } } } int WFdisp::handle(int event) { static int pxpos, push; if (!(event == FL_LEAVE || Fl::event_inside(this))) { if (event == FL_RELEASE) push = 0; return 0; } if (trx_state != STATE_RX) return 1; int xpos = Fl::event_x() - x(); int ypos = Fl::event_y() - y(); int eb; if (active_modem == fmt_modem) { int nuf = cursorFreq(xpos); if ((Fl::event_state() & (FL_SHIFT)) == FL_SHIFT) { set_unk_freq_value(nuf); } else if ((Fl::event_state() & (FL_CTRL)) == FL_CTRL) { set_ref_freq_value(nuf); } return 1; } switch (event) { case FL_MOVE: if (progdefaults.WaterfallQSY && ypos < WFTEXT + WFSCALE) { Fl::remove_timeout(hide_cursor, this); if (cursor != FL_CURSOR_WE) window()->cursor(cursor = FL_CURSOR_WE); if (wantcursor) { wantcursor = false; makeMarker(); } break; } if (cursor != FL_CURSOR_DEFAULT) window()->cursor(cursor = FL_CURSOR_DEFAULT); if (!Fl::has_timeout(hide_cursor, this)) Fl::add_timeout(1, hide_cursor, this); wantcursor = true; cursorpos = xpos; makeMarker(); break; case FL_DRAG: case FL_PUSH: killMacroTimer(); switch (eb = Fl::event_button()) { case FL_RIGHT_MOUSE: wantcursor = false; if (event == FL_PUSH) { tmp_carrier = true; oldcarrier = carrier(); if (progdefaults.WaterfallHistoryDefault) bHistory = true; } goto lrclick; case FL_LEFT_MOUSE: if ((Fl::event_state() & (FL_ALT | FL_CTRL)) == (FL_ALT | FL_CTRL)) { if (notch_frequency) notch_off(); else notch_on(cursorFreq(xpos)); return 1; } if (event == FL_PUSH) { push = ypos; pxpos = xpos; if (Fl::event_clicks()) return 1; } if (progdefaults.WaterfallQSY && push < WFTEXT + WFSCALE) { long long newrfc = (pxpos - xpos) * step; if (!USB()) newrfc = -newrfc; newrfc += rfcarrier(); qsy(newrfc, active_modem ? active_modem->get_freq() : 1500); pxpos = xpos; return 1; } lrclick: if (Fl::event_state() & FL_CTRL) { if (event == FL_DRAG) break; if (!progdefaults.WaterfallHistoryDefault) bHistory = true; if (eb == FL_LEFT_MOUSE) { restoreFocus(); break; } } if (progdefaults.WaterfallHistoryDefault) bHistory = true; newcarrier = cursorFreq(xpos); if (active_modem) { newcarrier = (int)CLAMP( newcarrier, progdefaults.LowFreqCutoff + active_modem->get_bandwidth() / 2, progdefaults.HighFreqCutoff - active_modem->get_bandwidth() / 2); active_modem->set_freq(newcarrier); viewer_paste_freq(newcarrier); if (!(Fl::event_state() & FL_SHIFT)) active_modem->set_sigsearch(SIGSEARCH); } restoreFocus(); break; case FL_MIDDLE_MOUSE: if (event == FL_DRAG) break; btnAFC->value(!btnAFC->value()); btnAFC->do_callback(); } break; case FL_RELEASE: switch (eb = Fl::event_button()) { case FL_RIGHT_MOUSE: tmp_carrier = false; if (active_modem) active_modem->set_freq(oldcarrier); restoreFocus(); // fall through case FL_LEFT_MOUSE: push = 0; oldcarrier = newcarrier; if (eb != FL_LEFT_MOUSE || !ReceiveText->visible()) break; if (eb == FL_LEFT_MOUSE) recenter_spectrum_viewer(); if (!(Fl::event_state() & (FL_CTRL | FL_META | FL_ALT | FL_SHIFT))) { if (Fl::event_clicks() == 1) note_qrg(true, "\n", "\n"); else if (progdefaults.WaterfallClickInsert) wf->insert_text(true); } else if (Fl::event_state() & (FL_META | FL_ALT)) find_signal_text(); break; } break; case FL_MOUSEWHEEL: { killMacroTimer(); int d; if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) ) break; int state = Fl::event_state(); if (state & FL_CTRL) wf->handle_mouse_wheel(waterfall::WF_AFC_BW, d); else if (state & (FL_META | FL_ALT)) wf->handle_mouse_wheel(waterfall::WF_SIGNAL_SEARCH, d); else if (state & FL_SHIFT) wf->handle_mouse_wheel(waterfall::WF_SQUELCH, d); else { if (progdefaults.WaterfallQSY && Fl::event_inside(x(), y(), w(), WFTEXT+WFSCALE+WFMARKER)) qsy(wf->rfcarrier() - 500*d); else wf->handle_mouse_wheel(progdefaults.WaterfallWheelAction, d); } return handle(FL_MOVE); } case FL_SHORTCUT: if (Fl::event_inside(this)) take_focus(); break; case FL_KEYBOARD: { killMacroTimer(); int d = (Fl::event_state() & FL_CTRL) ? 10 : 1; int k = Fl::event_key(); switch (k) { case FL_Left: case FL_Right: if (k == FL_Left) d = -d; if (active_modem) { oldcarrier = newcarrier = (int)CLAMP( carrier() + d, progdefaults.LowFreqCutoff + active_modem->get_bandwidth() / 2, progdefaults.HighFreqCutoff - active_modem->get_bandwidth() / 2); active_modem->set_freq(newcarrier); } break; case FL_Tab: restoreFocus(); break; default: restoreFocus(); return TransmitText->handle(event); } break; } case FL_KEYUP: { if (Fl::event_inside(this)) { int k = Fl::event_key(); if (k == FL_Shift_L || k == FL_Shift_R || k == FL_Control_L || k == FL_Control_R || k == FL_Meta_L || k == FL_Meta_R || k == FL_Alt_L || k == FL_Alt_R) restoreFocus(); } break; } case FL_LEAVE: Fl::remove_timeout(hide_cursor, this); if (cursor != FL_CURSOR_DEFAULT) window()->cursor(cursor = FL_CURSOR_DEFAULT); wantcursor = false; makeMarker(); break; } return 1; } void waterfall::handle_mouse_wheel(int what, int d) { if (d == 0) return; Fl_Valuator *val = 0; const char* msg_fmt = 0, *msg_label = 0; switch (what) { case WF_NOP: return; case WF_AFC_BW: { if (active_modem) { trx_mode m = active_modem->get_mode(); if (m >= MODE_PSK_FIRST && m <= MODE_PSK_LAST) { val = mailserver ? cntServerOffset : cntSearchRange; msg_label = "Srch Rng"; } else if (m >= MODE_HELL_FIRST && m <= MODE_HELL_LAST) { val = sldrHellBW; msg_label = "BW"; } else if (m == MODE_CW) { val = sldrCWbandwidth; msg_label = "BW"; } else return; msg_fmt = "%s: %2.0f Hz"; } break; } case WF_SIGNAL_SEARCH: if (d > 0) { if (active_modem) active_modem->searchDown(); } else { if (active_modem) active_modem->searchUp(); } return; case WF_SQUELCH: val = sldrSquelch; d = -d; msg_fmt = "%s = %2.0f %%"; msg_label = "Squelch"; break; case WF_CARRIER: val = wfcarrier; break; case WF_MODEM: init_modem(d > 0 ? MODE_NEXT : MODE_PREV); return; case WF_SCROLL: (d > 0 ? right : left)->do_callback(); return; } val->value(val->clamp(val->increment(val->value(), -d))); bool changed_save = progdefaults.changed; val->do_callback(); progdefaults.changed = changed_save; if (val == cntServerOffset || val == cntSearchRange) { if (active_modem) active_modem->set_sigsearch(SIGSEARCH); } else if (val == sldrSquelch) { // sldrSquelch gives focus to TransmitText take_focus(); } if (msg_fmt) { char msg[60]; snprintf(msg, sizeof(msg), msg_fmt, msg_label, val->value()); put_status(msg, 2.0); } } const char* waterfall::wf_wheel_action[] = { _("None"), _("AFC range or BW"), _("Signal search"), _("Squelch level"), _("Modem carrier"), _("Modem"), _("Scroll") }; fldigi-4.2.05/src/Makefile.in0000664000175000017500000360634214611713712012640 00000000000000# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (c) 2008 Dave Freese, W1HKJ (w1hkj AT w1hkj DOT com) # Copyright (c) 2012 Remi Chateauneu, F4ECW (remi dot chateauneu AT gmail DOT com) # License: GPLv3+: GNU GPL version 3 or later. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) @WANT_FLDIGI_TRUE@am__append_1 = fldigi @WANT_FLARQ_TRUE@am__append_2 = flarq @WIN32_TRUE@am__append_3 = -fno-var-tracking @WIN32_TRUE@am__append_4 = -fno-var-tracking @ENABLE_FLXMLRPC_FALSE@am__append_5 = $(XMLRPCPP_SRC) @ENABLE_FLXMLRPC_FALSE@am__append_6 = $(XMLRPCPP_SRC) @ENABLE_FLXMLRPC_TRUE@am__append_7 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_8 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_9 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_10 = @FLXMLRPC_LIBS@ @ENABLE_FLXMLRPC_TRUE@am__append_11 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_12 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_13 = @FLXMLRPC_CFLAGS@ @ENABLE_FLXMLRPC_TRUE@am__append_14 = @FLXMLRPC_LIBS@ @ENABLE_LIBMBEDTLS_FALSE@am__append_15 = $(LIBMBEDTLS_SRC) @ENABLE_LIBMBEDTLS_TRUE@am__append_16 = @LIBMBEDTLS_CFLAGS@ @ENABLE_LIBMBEDTLS_TRUE@am__append_17 = @LIBMBEDTLS_CFLAGS@ @ENABLE_LIBMBEDTLS_TRUE@am__append_18 = @LIBMBEDTLS_CFLAGS@ @ENABLE_LIBMBEDTLS_TRUE@am__append_19 = @LIBMBEDTLS_LIBS@ @ENABLE_HAMLIB_TRUE@am__append_20 = $(HAMLIB_SRC) @NEED_HAMLIB_LOCATOR_TRUE@am__append_21 = $(LOCATOR_SRC) @ENABLE_BENCHMARK_TRUE@am__append_22 = $(BENCHMARK_SRC) @COMPAT_REGEX_TRUE@am__append_23 = $(REGEX_SRC) @COMPAT_REGEX_TRUE@am__append_24 = $(REGEX_SRC) @COMPAT_STACK_TRUE@am__append_25 = $(STACK_SRC) @COMPAT_STACK_TRUE@am__append_26 = $(STACK_SRC) @MINGW32_TRUE@am__append_27 = $(MINGW32_SRC) @MINGW32_TRUE@am__append_28 = $(MINGW32_SRC) @USE_NLS_TRUE@am__append_29 = $(NLS_SRC) @USE_NLS_TRUE@am__append_30 = $(NLS_SRC) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__append_31 = $(FLDIGI_WIN32_RES_SRC) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__append_32 = $(FLARQ_WIN32_RES_SRC) @DARWIN_TRUE@am__append_33 = $(APPBUNDLE_NOLIBS) $(APPBUNDLE) $(APPBUNDLE)*.dmg @HAVE_NSIS_TRUE@am__append_34 = $(INSTALLER_FILE) @USE_NLS_TRUE@am__append_35 = share subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/benchmark.m4 $(top_srcdir)/m4/bind.m4 \ $(top_srcdir)/m4/build.m4 $(top_srcdir)/m4/c++11.m4 \ $(top_srcdir)/m4/debug.m4 $(top_srcdir)/m4/docs.m4 \ $(top_srcdir)/m4/fltk.m4 $(top_srcdir)/m4/funcs.m4 \ $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/hash.m4 \ $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ $(top_srcdir)/m4/libintl.m4 $(top_srcdir)/m4/macosx.m4 \ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/np-compat.m4 \ $(top_srcdir)/m4/opt.m4 $(top_srcdir)/m4/oss.m4 \ $(top_srcdir)/m4/pkg-config.m4 $(top_srcdir)/m4/po.m4 \ $(top_srcdir)/m4/progs.m4 $(top_srcdir)/m4/progtest.m4 \ $(top_srcdir)/m4/static.m4 $(top_srcdir)/m4/tls.m4 \ $(top_srcdir)/m4/win32.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @WANT_FLDIGI_TRUE@am__EXEEXT_1 = fldigi$(EXEEXT) @WANT_FLARQ_TRUE@am__EXEEXT_2 = flarq$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__flarq_SOURCES_DIST = xmlrpcpp/XmlRpcBase64.h \ xmlrpcpp/XmlRpcClient.cpp xmlrpcpp/XmlRpcClient.h \ xmlrpcpp/XmlRpcDispatch.cpp xmlrpcpp/XmlRpcDispatch.h \ xmlrpcpp/XmlRpcException.h xmlrpcpp/XmlRpc.h \ xmlrpcpp/XmlRpcMutex.cpp xmlrpcpp/XmlRpcMutex.h \ xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h xmlrpcpp/XmlRpcServerMethod.cpp \ xmlrpcpp/XmlRpcServerMethod.h xmlrpcpp/XmlRpcSocket.cpp \ xmlrpcpp/XmlRpcSocket.h xmlrpcpp/XmlRpcSource.cpp \ xmlrpcpp/XmlRpcSource.h xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h compat/regex.h compat/regex.c \ include/stack.h misc/stack.cxx include/compat.h \ compat/getsysinfo.c compat/mingw.c compat/mingw.h misc/nls.cxx \ include/nls.h flarq-src/flarqrc.rc dialogs/font_browser.cxx \ flarq-src/arq.cxx flarq-src/arqdialogs.cxx \ flarq-src/arqhelp.cxx flarq-src/b64.cxx flarq-src/flarq.cxx \ flarq-src/flarqenv.cxx flarq-src/xml_server.cxx \ flarq-src/include/arq.h flarq-src/include/arqdialogs.h \ flarq-src/include/b64.h flarq-src/include/flarq.h \ flarq-src/include/flarqenv.h flarq-src/include/xml_server.h \ include/F_Edit.h include/fileselect.h include/flinput2.h \ include/flmisc.h include/flslider2.h include/font_browser.h \ include/icons.h include/pixmaps.h include/re.h \ include/socket.h include/stacktrace.h include/threads.h \ include/table.h include/util.h combo/combo.cxx \ fileselector/fileselect.cxx logbook/table.cxx misc/ascii.cxx \ misc/stacktrace.cxx misc/threads.cxx misc/timeops.cxx \ network/socket.cxx widgets/flinput2.cxx widgets/flmisc.cxx \ widgets/flslider2.cxx misc/icons.cxx misc/pixmaps.cxx \ misc/pixmaps_tango.cxx misc/re.cxx misc/util.cxx \ widgets/Fl_Text_Buffer_mod.cxx widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx widgets/FTextView.cxx \ widgets/F_Edit.cxx am__dirstamp = $(am__leading_dot)dirstamp am__objects_1 = xmlrpcpp/flarq-XmlRpcClient.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcDispatch.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcMutex.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcServerConnection.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcServer.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcServerMethod.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcSocket.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcSource.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcUtil.$(OBJEXT) \ xmlrpcpp/flarq-XmlRpcValue.$(OBJEXT) @ENABLE_FLXMLRPC_FALSE@am__objects_2 = $(am__objects_1) am__objects_3 = compat/flarq-regex.$(OBJEXT) @COMPAT_REGEX_TRUE@am__objects_4 = $(am__objects_3) am__objects_5 = misc/flarq-stack.$(OBJEXT) @COMPAT_STACK_TRUE@am__objects_6 = $(am__objects_5) am__objects_7 = compat/flarq-getsysinfo.$(OBJEXT) \ compat/flarq-mingw.$(OBJEXT) @MINGW32_TRUE@am__objects_8 = $(am__objects_7) am__objects_9 = misc/flarq-nls.$(OBJEXT) @USE_NLS_TRUE@am__objects_10 = $(am__objects_9) am__objects_11 = flarq-src/flarqrc.$(OBJEXT) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__objects_12 = $(am__objects_11) am_flarq_OBJECTS = $(am__objects_2) $(am__objects_4) $(am__objects_6) \ $(am__objects_8) $(am__objects_10) $(am__objects_12) \ dialogs/flarq-font_browser.$(OBJEXT) \ flarq-src/flarq-arq.$(OBJEXT) \ flarq-src/flarq-arqdialogs.$(OBJEXT) \ flarq-src/flarq-arqhelp.$(OBJEXT) \ flarq-src/flarq-b64.$(OBJEXT) flarq-src/flarq-flarq.$(OBJEXT) \ flarq-src/flarq-flarqenv.$(OBJEXT) \ flarq-src/flarq-xml_server.$(OBJEXT) \ combo/flarq-combo.$(OBJEXT) \ fileselector/flarq-fileselect.$(OBJEXT) \ logbook/flarq-table.$(OBJEXT) misc/flarq-ascii.$(OBJEXT) \ misc/flarq-stacktrace.$(OBJEXT) misc/flarq-threads.$(OBJEXT) \ misc/flarq-timeops.$(OBJEXT) network/flarq-socket.$(OBJEXT) \ widgets/flarq-flinput2.$(OBJEXT) \ widgets/flarq-flmisc.$(OBJEXT) \ widgets/flarq-flslider2.$(OBJEXT) misc/flarq-icons.$(OBJEXT) \ misc/flarq-pixmaps.$(OBJEXT) \ misc/flarq-pixmaps_tango.$(OBJEXT) misc/flarq-re.$(OBJEXT) \ misc/flarq-util.$(OBJEXT) \ widgets/flarq-Fl_Text_Buffer_mod.$(OBJEXT) \ widgets/flarq-Fl_Text_Display_mod.$(OBJEXT) \ widgets/flarq-Fl_Text_Editor_mod.$(OBJEXT) \ widgets/flarq-FTextView.$(OBJEXT) \ widgets/flarq-F_Edit.$(OBJEXT) flarq_OBJECTS = $(am_flarq_OBJECTS) flarq_DEPENDENCIES = flarq_LINK = $(CXXLD) $(flarq_CXXFLAGS) $(CXXFLAGS) $(flarq_LDFLAGS) \ $(LDFLAGS) -o $@ am__fldigi_SOURCES_DIST = include/xmlrpc.h network/xmlrpc.cxx \ xmlrpcpp/XmlRpcBase64.h xmlrpcpp/XmlRpcClient.cpp \ xmlrpcpp/XmlRpcClient.h xmlrpcpp/XmlRpcDispatch.cpp \ xmlrpcpp/XmlRpcDispatch.h xmlrpcpp/XmlRpcException.h \ xmlrpcpp/XmlRpc.h xmlrpcpp/XmlRpcMutex.cpp \ xmlrpcpp/XmlRpcMutex.h xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h xmlrpcpp/XmlRpcServerMethod.cpp \ xmlrpcpp/XmlRpcServerMethod.h xmlrpcpp/XmlRpcSocket.cpp \ xmlrpcpp/XmlRpcSocket.h xmlrpcpp/XmlRpcSource.cpp \ xmlrpcpp/XmlRpcSource.h xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h mbedtls/aes.c mbedtls/aesni.c \ mbedtls/arc4.c mbedtls/aria.c mbedtls/asn1parse.c \ mbedtls/asn1write.c mbedtls/base64.c mbedtls/bignum.c \ mbedtls/blowfish.c mbedtls/camellia.c mbedtls/ccm.c \ mbedtls/certs.c mbedtls/chacha20.c mbedtls/chachapoly.c \ mbedtls/cipher.c mbedtls/cipher_wrap.c mbedtls/cmac.c \ mbedtls/ctr_drbg.c mbedtls/debug.c mbedtls/des.c mbedtls/dhm.c \ mbedtls/ecdh.c mbedtls/ecdsa.c mbedtls/ecjpake.c mbedtls/ecp.c \ mbedtls/ecp_curves.c mbedtls/entropy.c mbedtls/entropy_poll.c \ mbedtls/error.c mbedtls/gcm.c mbedtls/havege.c mbedtls/hkdf.c \ mbedtls/hmac_drbg.c mbedtls/md2.c mbedtls/md4.c mbedtls/md5.c \ mbedtls/md.c mbedtls/md_wrap.c mbedtls/memory_buffer_alloc.c \ mbedtls/net_sockets.c mbedtls/nist_kw.c mbedtls/oid.c \ mbedtls/padlock.c mbedtls/pem.c mbedtls/pk.c mbedtls/pkcs11.c \ mbedtls/pkcs12.c mbedtls/pkcs5.c mbedtls/pkparse.c \ mbedtls/pk_wrap.c mbedtls/pkwrite.c mbedtls/platform.c \ mbedtls/platform_util.c mbedtls/poly1305.c mbedtls/ripemd160.c \ mbedtls/rsa.c mbedtls/rsa_internal.c mbedtls/sha1.c \ mbedtls/sha256.c mbedtls/sha512.c mbedtls/ssl_cache.c \ mbedtls/ssl_ciphersuites.c mbedtls/ssl_cli.c \ mbedtls/ssl_cookie.c mbedtls/ssl_srv.c mbedtls/ssl_ticket.c \ mbedtls/ssl_tls.c mbedtls/threading.c mbedtls/timing.c \ mbedtls/version.c mbedtls/version_features.c mbedtls/x509.c \ mbedtls/x509_create.c mbedtls/x509_crl.c mbedtls/x509_crt.c \ mbedtls/x509_csr.c mbedtls/x509write_crt.c \ mbedtls/x509write_csr.c mbedtls/xtea.c include/mbedtls/aes.h \ include/mbedtls/aesni.h include/mbedtls/arc4.h \ include/mbedtls/aria.h include/mbedtls/asn1.h \ include/mbedtls/asn1write.h include/mbedtls/base64.h \ include/mbedtls/bignum.h include/mbedtls/blowfish.h \ include/mbedtls/bn_mul.h include/mbedtls/camellia.h \ include/mbedtls/ccm.h include/mbedtls/certs.h \ include/mbedtls/chacha20.h include/mbedtls/chachapoly.h \ include/mbedtls/check_config.h include/mbedtls/cipher.h \ include/mbedtls/cipher_internal.h include/mbedtls/cmac.h \ include/mbedtls/compat-1.3.h include/mbedtls/config.h \ include/mbedtls/ctr_drbg.h include/mbedtls/debug.h \ include/mbedtls/des.h include/mbedtls/dhm.h \ include/mbedtls/ecdh.h include/mbedtls/ecdsa.h \ include/mbedtls/ecjpake.h include/mbedtls/ecp.h \ include/mbedtls/ecp_internal.h include/mbedtls/entropy.h \ include/mbedtls/entropy_poll.h include/mbedtls/error.h \ include/mbedtls/gcm.h include/mbedtls/havege.h \ include/mbedtls/hkdf.h include/mbedtls/hmac_drbg.h \ include/mbedtls/md2.h include/mbedtls/md4.h \ include/mbedtls/md5.h include/mbedtls/md.h \ include/mbedtls/md_internal.h \ include/mbedtls/memory_buffer_alloc.h include/mbedtls/net.h \ include/mbedtls/net_sockets.h include/mbedtls/nist_kw.h \ include/mbedtls/oid.h include/mbedtls/padlock.h \ include/mbedtls/pem.h include/mbedtls/pkcs11.h \ include/mbedtls/pkcs12.h include/mbedtls/pkcs5.h \ include/mbedtls/pk.h include/mbedtls/pk_internal.h \ include/mbedtls/platform.h include/mbedtls/platform_time.h \ include/mbedtls/platform_util.h include/mbedtls/poly1305.h \ include/mbedtls/ripemd160.h include/mbedtls/rsa.h \ include/mbedtls/rsa_internal.h include/mbedtls/sha1.h \ include/mbedtls/sha256.h include/mbedtls/sha512.h \ include/mbedtls/ssl_cache.h include/mbedtls/ssl_ciphersuites.h \ include/mbedtls/ssl_cookie.h include/mbedtls/ssl.h \ include/mbedtls/ssl_internal.h include/mbedtls/ssl_ticket.h \ include/mbedtls/threading.h include/mbedtls/timing.h \ include/mbedtls/version.h include/mbedtls/x509_crl.h \ include/mbedtls/x509_crt.h include/mbedtls/x509_csr.h \ include/mbedtls/x509.h include/mbedtls/xtea.h include/hamlib.h \ rigcontrol/hamlib.cxx include/rigclass.h \ rigcontrol/rigclass.cxx include/benchmark.h misc/benchmark.cxx \ compat/regex.h compat/regex.c include/stack.h misc/stack.cxx \ include/compat.h compat/getsysinfo.c compat/mingw.c \ compat/mingw.h misc/nls.cxx include/nls.h fldigirc.rc \ cmedia/cmedia.cxx cmedia/hid.cxx combo/combo.cxx \ config_script/create_default_script.cxx \ config_script/run_script.h config_script/run_scripts.cxx \ config_script/script_parsing.cxx \ config_script/script_parsing.h contestia/contestia.cxx \ cw/cw.cxx cw/ICOMkeying.cxx cw/KYkeying.cxx cw/morse.cxx \ cw/nanoIO.cxx cw/Nav.cxx cw/view_cw.cxx cw/winkeyer.cxx \ cw/YAESUkeying.cxx rtty/fsk.cxx rtty/rtty.cxx \ rtty/view_rtty.cxx debug/debug.cxx debug/debug_dialog.cxx \ dialogs/confdialog.cxx dialogs/fl_digi.cxx \ dialogs/font_browser.cxx dialogs/htmlstrings.cxx \ dialogs/notifydialog.cxx dialogs/record_browse.cxx \ dialogs/rxmon.cxx dialogs/testsigs.cxx dialogs/tod_clock.cxx \ dialogs/Viewer.cxx dominoex/dominoex.cxx \ dominoex/dominovar.cxx dtmf/dtmf.cxx dxcluster/dxcluster.cxx \ dxcluster/dx_dialog.cxx feld/feld.cxx feld/feldfonts.cxx \ fft-monitor/fft-monitor.cxx fft-monitor/spectrum.cxx \ fft-monitor/spectrum_viewer.cxx fileselector/fileselect.cxx \ filters/fftfilt.cxx filters/filters.cxx filters/viterbi.cxx \ fmt/fmt.cxx fmt/fmt_dialog.cxx fsq/fsq.cxx fsq/fsq_monitor.cxx \ globals/globals.cxx ifkp/ifkp.cxx ifkp/tux.cxx \ irrxml/CXMLReaderImpl.h irrxml/fast_atof.h irrxml/heapsort.h \ irrxml/irrArray.h irrxml/irrString.h irrxml/irrTypes.h \ irrxml/irrXML.cpp irrxml/irrXML.h kml/kmlserver.cxx \ libtiniconv/tiniconv.c libtiniconv/tiniconv_desc.c \ logbook/adif_io.cxx logbook/calendar.cxx logbook/contest.cxx \ logbook/counties.cxx logbook/county_lists.cxx \ logbook/cty-dat.cxx logbook/date.cxx logbook/fd_logger.cxx \ logbook/fd_view.cxx logbook/lgbook.cxx logbook/logbook.cxx \ logbook/logsupport.cxx logbook/lookupcall.cxx \ logbook/maclogger.cxx logbook/n3fjp_logger.cxx \ logbook/qrzlib.cxx logbook/qso_db.cxx logbook/table.cxx \ logbook/textio.cxx logbook/xmlrpc_log.cxx logger/logger.cxx \ logger/rx_extract.cxx logger/speak.cxx main.cxx \ mfsk/interleave.cxx mfsk/mfsk.cxx mfsk/mfskvaricode.cxx \ misc/arq_io.cxx misc/ascii.cxx misc/ax25_decode.cxx \ misc/charsetdistiller.cxx misc/charsetlist.cxx \ misc/configuration.cxx misc/coordinate.cxx misc/dxcc.cxx \ misc/estrings.cxx misc/icons.cxx misc/kiss_io.cxx \ misc/locator.cxx misc/log.cxx misc/macroedit.cxx \ misc/macros.cxx misc/misc.cxx misc/newinstall.cxx \ misc/outputencoder.cxx misc/pixmaps.cxx misc/pixmaps_tango.cxx \ misc/record_loader.cxx misc/re.cxx misc/stacktrace.cxx \ misc/strutil.cxx misc/threads.cxx misc/timeops.cxx \ misc/utf8file_io.cxx misc/util.cxx mt63/dsp.cxx \ mt63/mt63base.cxx mt63/mt63.cxx navtex/navtex.cxx \ network/ca_cert.cxx network/metar.cxx network/network.cxx \ network/socket.cxx network/weather.cxx olivia/olivia.cxx \ psk/pskcoeff.cxx psk/psk.cxx psk/pskeval.cxx \ psk/pskvaricode.cxx psk/viewpsk.cxx psm/psm.cxx psm/psm.h \ qrunner/fqueue.h qrunner/qrunner.cxx \ rigcontrol/FreqControl.cxx rigcontrol/norig.cxx \ rigcontrol/ptt.cxx rigcontrol/rigio.cxx \ rigcontrol/rigsupport.cxx rigcontrol/rigxml.cxx \ rigcontrol/serial.cxx rigcontrol/xmlrpc_rig.cxx rsid/rsid.cxx \ soundcard/audio_alert.cxx soundcard/bark.cxx \ soundcard/checkout.cxx soundcard/diesel.cxx \ soundcard/dinnerbell.cxx soundcard/doesnot.cxx \ soundcard/play.pa.cxx soundcard/soundconf.cxx \ soundcard/sound.cxx soundcard/steam_train.cxx \ soundcard/ttybell.cxx spot/notify.cxx spot/pskrep.cxx \ spot/spot.cxx ssb/ssb.cxx status/squelch_status.cxx \ status/status.cxx synop-src/synop.cxx thor/thor.cxx \ thor/thorvaricode.cxx throb/throb.cxx trx/modem.cxx \ trx/nullmodem.cxx trx/test_signal.cxx trx/trx.cxx \ waterfall/colorbox.cxx waterfall/digiscope.cxx \ waterfall/raster.cxx waterfall/waterfall.cxx wefax/wefax.cxx \ wefax/wefax_map.cxx wefax/wefax-pic.cxx widgets/flinput2.cxx \ widgets/flmisc.cxx widgets/flslider2.cxx \ widgets/Fl_Text_Buffer_mod.cxx widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx widgets/FTextRXTX.cxx \ widgets/FTextView.cxx widgets/Panel.cxx widgets/picture.cxx \ widgets/plot_xy.cxx widgets/progress.cxx \ widgets/psk_browser.cxx widgets/pwrmeter.cxx \ widgets/smeter.cxx widgets/vumeter.cxx wwv/analysis.cxx \ wwv/wwv.cxx am__objects_13 = network/fldigi-xmlrpc.$(OBJEXT) am__objects_14 = xmlrpcpp/fldigi-XmlRpcClient.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcDispatch.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcMutex.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcServerConnection.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcServer.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcServerMethod.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcSocket.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcSource.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcUtil.$(OBJEXT) \ xmlrpcpp/fldigi-XmlRpcValue.$(OBJEXT) @ENABLE_FLXMLRPC_FALSE@am__objects_15 = $(am__objects_14) am__objects_16 = mbedtls/fldigi-aes.$(OBJEXT) \ mbedtls/fldigi-aesni.$(OBJEXT) mbedtls/fldigi-arc4.$(OBJEXT) \ mbedtls/fldigi-aria.$(OBJEXT) \ mbedtls/fldigi-asn1parse.$(OBJEXT) \ mbedtls/fldigi-asn1write.$(OBJEXT) \ mbedtls/fldigi-base64.$(OBJEXT) \ mbedtls/fldigi-bignum.$(OBJEXT) \ mbedtls/fldigi-blowfish.$(OBJEXT) \ mbedtls/fldigi-camellia.$(OBJEXT) mbedtls/fldigi-ccm.$(OBJEXT) \ mbedtls/fldigi-certs.$(OBJEXT) \ mbedtls/fldigi-chacha20.$(OBJEXT) \ mbedtls/fldigi-chachapoly.$(OBJEXT) \ mbedtls/fldigi-cipher.$(OBJEXT) \ mbedtls/fldigi-cipher_wrap.$(OBJEXT) \ mbedtls/fldigi-cmac.$(OBJEXT) \ mbedtls/fldigi-ctr_drbg.$(OBJEXT) \ mbedtls/fldigi-debug.$(OBJEXT) mbedtls/fldigi-des.$(OBJEXT) \ mbedtls/fldigi-dhm.$(OBJEXT) mbedtls/fldigi-ecdh.$(OBJEXT) \ mbedtls/fldigi-ecdsa.$(OBJEXT) \ mbedtls/fldigi-ecjpake.$(OBJEXT) mbedtls/fldigi-ecp.$(OBJEXT) \ mbedtls/fldigi-ecp_curves.$(OBJEXT) \ mbedtls/fldigi-entropy.$(OBJEXT) \ mbedtls/fldigi-entropy_poll.$(OBJEXT) \ mbedtls/fldigi-error.$(OBJEXT) mbedtls/fldigi-gcm.$(OBJEXT) \ mbedtls/fldigi-havege.$(OBJEXT) mbedtls/fldigi-hkdf.$(OBJEXT) \ mbedtls/fldigi-hmac_drbg.$(OBJEXT) \ mbedtls/fldigi-md2.$(OBJEXT) mbedtls/fldigi-md4.$(OBJEXT) \ mbedtls/fldigi-md5.$(OBJEXT) mbedtls/fldigi-md.$(OBJEXT) \ mbedtls/fldigi-md_wrap.$(OBJEXT) \ mbedtls/fldigi-memory_buffer_alloc.$(OBJEXT) \ mbedtls/fldigi-net_sockets.$(OBJEXT) \ mbedtls/fldigi-nist_kw.$(OBJEXT) mbedtls/fldigi-oid.$(OBJEXT) \ mbedtls/fldigi-padlock.$(OBJEXT) mbedtls/fldigi-pem.$(OBJEXT) \ mbedtls/fldigi-pk.$(OBJEXT) mbedtls/fldigi-pkcs11.$(OBJEXT) \ mbedtls/fldigi-pkcs12.$(OBJEXT) mbedtls/fldigi-pkcs5.$(OBJEXT) \ mbedtls/fldigi-pkparse.$(OBJEXT) \ mbedtls/fldigi-pk_wrap.$(OBJEXT) \ mbedtls/fldigi-pkwrite.$(OBJEXT) \ mbedtls/fldigi-platform.$(OBJEXT) \ mbedtls/fldigi-platform_util.$(OBJEXT) \ mbedtls/fldigi-poly1305.$(OBJEXT) \ mbedtls/fldigi-ripemd160.$(OBJEXT) \ mbedtls/fldigi-rsa.$(OBJEXT) \ mbedtls/fldigi-rsa_internal.$(OBJEXT) \ mbedtls/fldigi-sha1.$(OBJEXT) mbedtls/fldigi-sha256.$(OBJEXT) \ mbedtls/fldigi-sha512.$(OBJEXT) \ mbedtls/fldigi-ssl_cache.$(OBJEXT) \ mbedtls/fldigi-ssl_ciphersuites.$(OBJEXT) \ mbedtls/fldigi-ssl_cli.$(OBJEXT) \ mbedtls/fldigi-ssl_cookie.$(OBJEXT) \ mbedtls/fldigi-ssl_srv.$(OBJEXT) \ mbedtls/fldigi-ssl_ticket.$(OBJEXT) \ mbedtls/fldigi-ssl_tls.$(OBJEXT) \ mbedtls/fldigi-threading.$(OBJEXT) \ mbedtls/fldigi-timing.$(OBJEXT) \ mbedtls/fldigi-version.$(OBJEXT) \ mbedtls/fldigi-version_features.$(OBJEXT) \ mbedtls/fldigi-x509.$(OBJEXT) \ mbedtls/fldigi-x509_create.$(OBJEXT) \ mbedtls/fldigi-x509_crl.$(OBJEXT) \ mbedtls/fldigi-x509_crt.$(OBJEXT) \ mbedtls/fldigi-x509_csr.$(OBJEXT) \ mbedtls/fldigi-x509write_crt.$(OBJEXT) \ mbedtls/fldigi-x509write_csr.$(OBJEXT) \ mbedtls/fldigi-xtea.$(OBJEXT) @ENABLE_LIBMBEDTLS_FALSE@am__objects_17 = $(am__objects_16) am__objects_18 = rigcontrol/fldigi-hamlib.$(OBJEXT) \ rigcontrol/fldigi-rigclass.$(OBJEXT) @ENABLE_HAMLIB_TRUE@am__objects_19 = $(am__objects_18) am__objects_20 = am__objects_21 = misc/fldigi-benchmark.$(OBJEXT) @ENABLE_BENCHMARK_TRUE@am__objects_22 = $(am__objects_21) am__objects_23 = compat/fldigi-regex.$(OBJEXT) @COMPAT_REGEX_TRUE@am__objects_24 = $(am__objects_23) am__objects_25 = misc/fldigi-stack.$(OBJEXT) @COMPAT_STACK_TRUE@am__objects_26 = $(am__objects_25) am__objects_27 = compat/fldigi-getsysinfo.$(OBJEXT) \ compat/fldigi-mingw.$(OBJEXT) @MINGW32_TRUE@am__objects_28 = $(am__objects_27) am__objects_29 = misc/fldigi-nls.$(OBJEXT) @USE_NLS_TRUE@am__objects_30 = $(am__objects_29) am__objects_31 = fldigirc.$(OBJEXT) @HAVE_WINDRES_TRUE@@WIN32_TRUE@am__objects_32 = $(am__objects_31) am_fldigi_OBJECTS = $(am__objects_13) $(am__objects_15) \ $(am__objects_17) $(am__objects_19) $(am__objects_20) \ $(am__objects_22) $(am__objects_24) $(am__objects_26) \ $(am__objects_28) $(am__objects_30) $(am__objects_32) \ cmedia/fldigi-cmedia.$(OBJEXT) cmedia/fldigi-hid.$(OBJEXT) \ combo/fldigi-combo.$(OBJEXT) \ config_script/fldigi-create_default_script.$(OBJEXT) \ config_script/fldigi-run_scripts.$(OBJEXT) \ config_script/fldigi-script_parsing.$(OBJEXT) \ contestia/fldigi-contestia.$(OBJEXT) cw/fldigi-cw.$(OBJEXT) \ cw/fldigi-ICOMkeying.$(OBJEXT) cw/fldigi-KYkeying.$(OBJEXT) \ cw/fldigi-morse.$(OBJEXT) cw/fldigi-nanoIO.$(OBJEXT) \ cw/fldigi-Nav.$(OBJEXT) cw/fldigi-view_cw.$(OBJEXT) \ cw/fldigi-winkeyer.$(OBJEXT) cw/fldigi-YAESUkeying.$(OBJEXT) \ rtty/fldigi-fsk.$(OBJEXT) rtty/fldigi-rtty.$(OBJEXT) \ rtty/fldigi-view_rtty.$(OBJEXT) debug/fldigi-debug.$(OBJEXT) \ debug/fldigi-debug_dialog.$(OBJEXT) \ dialogs/fldigi-confdialog.$(OBJEXT) \ dialogs/fldigi-fl_digi.$(OBJEXT) \ dialogs/fldigi-font_browser.$(OBJEXT) \ dialogs/fldigi-htmlstrings.$(OBJEXT) \ dialogs/fldigi-notifydialog.$(OBJEXT) \ dialogs/fldigi-record_browse.$(OBJEXT) \ dialogs/fldigi-rxmon.$(OBJEXT) \ dialogs/fldigi-testsigs.$(OBJEXT) \ dialogs/fldigi-tod_clock.$(OBJEXT) \ dialogs/fldigi-Viewer.$(OBJEXT) \ dominoex/fldigi-dominoex.$(OBJEXT) \ dominoex/fldigi-dominovar.$(OBJEXT) dtmf/fldigi-dtmf.$(OBJEXT) \ dxcluster/fldigi-dxcluster.$(OBJEXT) \ dxcluster/fldigi-dx_dialog.$(OBJEXT) \ feld/fldigi-feld.$(OBJEXT) feld/fldigi-feldfonts.$(OBJEXT) \ fft-monitor/fldigi-fft-monitor.$(OBJEXT) \ fft-monitor/fldigi-spectrum.$(OBJEXT) \ fft-monitor/fldigi-spectrum_viewer.$(OBJEXT) \ fileselector/fldigi-fileselect.$(OBJEXT) \ filters/fldigi-fftfilt.$(OBJEXT) \ filters/fldigi-filters.$(OBJEXT) \ filters/fldigi-viterbi.$(OBJEXT) fmt/fldigi-fmt.$(OBJEXT) \ fmt/fldigi-fmt_dialog.$(OBJEXT) fsq/fldigi-fsq.$(OBJEXT) \ fsq/fldigi-fsq_monitor.$(OBJEXT) \ globals/fldigi-globals.$(OBJEXT) ifkp/fldigi-ifkp.$(OBJEXT) \ ifkp/fldigi-tux.$(OBJEXT) irrxml/fldigi-irrXML.$(OBJEXT) \ kml/fldigi-kmlserver.$(OBJEXT) \ libtiniconv/fldigi-tiniconv.$(OBJEXT) \ libtiniconv/fldigi-tiniconv_desc.$(OBJEXT) \ logbook/fldigi-adif_io.$(OBJEXT) \ logbook/fldigi-calendar.$(OBJEXT) \ logbook/fldigi-contest.$(OBJEXT) \ logbook/fldigi-counties.$(OBJEXT) \ logbook/fldigi-county_lists.$(OBJEXT) \ logbook/fldigi-cty-dat.$(OBJEXT) logbook/fldigi-date.$(OBJEXT) \ logbook/fldigi-fd_logger.$(OBJEXT) \ logbook/fldigi-fd_view.$(OBJEXT) \ logbook/fldigi-lgbook.$(OBJEXT) \ logbook/fldigi-logbook.$(OBJEXT) \ logbook/fldigi-logsupport.$(OBJEXT) \ logbook/fldigi-lookupcall.$(OBJEXT) \ logbook/fldigi-maclogger.$(OBJEXT) \ logbook/fldigi-n3fjp_logger.$(OBJEXT) \ logbook/fldigi-qrzlib.$(OBJEXT) \ logbook/fldigi-qso_db.$(OBJEXT) logbook/fldigi-table.$(OBJEXT) \ logbook/fldigi-textio.$(OBJEXT) \ logbook/fldigi-xmlrpc_log.$(OBJEXT) \ logger/fldigi-logger.$(OBJEXT) \ logger/fldigi-rx_extract.$(OBJEXT) \ logger/fldigi-speak.$(OBJEXT) fldigi-main.$(OBJEXT) \ mfsk/fldigi-interleave.$(OBJEXT) mfsk/fldigi-mfsk.$(OBJEXT) \ mfsk/fldigi-mfskvaricode.$(OBJEXT) \ misc/fldigi-arq_io.$(OBJEXT) misc/fldigi-ascii.$(OBJEXT) \ misc/fldigi-ax25_decode.$(OBJEXT) \ misc/fldigi-charsetdistiller.$(OBJEXT) \ misc/fldigi-charsetlist.$(OBJEXT) \ misc/fldigi-configuration.$(OBJEXT) \ misc/fldigi-coordinate.$(OBJEXT) misc/fldigi-dxcc.$(OBJEXT) \ misc/fldigi-estrings.$(OBJEXT) misc/fldigi-icons.$(OBJEXT) \ misc/fldigi-kiss_io.$(OBJEXT) misc/fldigi-locator.$(OBJEXT) \ misc/fldigi-log.$(OBJEXT) misc/fldigi-macroedit.$(OBJEXT) \ misc/fldigi-macros.$(OBJEXT) misc/fldigi-misc.$(OBJEXT) \ misc/fldigi-newinstall.$(OBJEXT) \ misc/fldigi-outputencoder.$(OBJEXT) \ misc/fldigi-pixmaps.$(OBJEXT) \ misc/fldigi-pixmaps_tango.$(OBJEXT) \ misc/fldigi-record_loader.$(OBJEXT) misc/fldigi-re.$(OBJEXT) \ misc/fldigi-stacktrace.$(OBJEXT) misc/fldigi-strutil.$(OBJEXT) \ misc/fldigi-threads.$(OBJEXT) misc/fldigi-timeops.$(OBJEXT) \ misc/fldigi-utf8file_io.$(OBJEXT) misc/fldigi-util.$(OBJEXT) \ mt63/fldigi-dsp.$(OBJEXT) mt63/fldigi-mt63base.$(OBJEXT) \ mt63/fldigi-mt63.$(OBJEXT) navtex/fldigi-navtex.$(OBJEXT) \ network/fldigi-ca_cert.$(OBJEXT) \ network/fldigi-metar.$(OBJEXT) \ network/fldigi-network.$(OBJEXT) \ network/fldigi-socket.$(OBJEXT) \ network/fldigi-weather.$(OBJEXT) \ olivia/fldigi-olivia.$(OBJEXT) psk/fldigi-pskcoeff.$(OBJEXT) \ psk/fldigi-psk.$(OBJEXT) psk/fldigi-pskeval.$(OBJEXT) \ psk/fldigi-pskvaricode.$(OBJEXT) psk/fldigi-viewpsk.$(OBJEXT) \ psm/fldigi-psm.$(OBJEXT) qrunner/fldigi-qrunner.$(OBJEXT) \ rigcontrol/fldigi-FreqControl.$(OBJEXT) \ rigcontrol/fldigi-norig.$(OBJEXT) \ rigcontrol/fldigi-ptt.$(OBJEXT) \ rigcontrol/fldigi-rigio.$(OBJEXT) \ rigcontrol/fldigi-rigsupport.$(OBJEXT) \ rigcontrol/fldigi-rigxml.$(OBJEXT) \ rigcontrol/fldigi-serial.$(OBJEXT) \ rigcontrol/fldigi-xmlrpc_rig.$(OBJEXT) \ rsid/fldigi-rsid.$(OBJEXT) \ soundcard/fldigi-audio_alert.$(OBJEXT) \ soundcard/fldigi-bark.$(OBJEXT) \ soundcard/fldigi-checkout.$(OBJEXT) \ soundcard/fldigi-diesel.$(OBJEXT) \ soundcard/fldigi-dinnerbell.$(OBJEXT) \ soundcard/fldigi-doesnot.$(OBJEXT) \ soundcard/fldigi-play.pa.$(OBJEXT) \ soundcard/fldigi-soundconf.$(OBJEXT) \ soundcard/fldigi-sound.$(OBJEXT) \ soundcard/fldigi-steam_train.$(OBJEXT) \ soundcard/fldigi-ttybell.$(OBJEXT) \ spot/fldigi-notify.$(OBJEXT) spot/fldigi-pskrep.$(OBJEXT) \ spot/fldigi-spot.$(OBJEXT) ssb/fldigi-ssb.$(OBJEXT) \ status/fldigi-squelch_status.$(OBJEXT) \ status/fldigi-status.$(OBJEXT) \ synop-src/fldigi-synop.$(OBJEXT) thor/fldigi-thor.$(OBJEXT) \ thor/fldigi-thorvaricode.$(OBJEXT) \ throb/fldigi-throb.$(OBJEXT) trx/fldigi-modem.$(OBJEXT) \ trx/fldigi-nullmodem.$(OBJEXT) \ trx/fldigi-test_signal.$(OBJEXT) trx/fldigi-trx.$(OBJEXT) \ waterfall/fldigi-colorbox.$(OBJEXT) \ waterfall/fldigi-digiscope.$(OBJEXT) \ waterfall/fldigi-raster.$(OBJEXT) \ waterfall/fldigi-waterfall.$(OBJEXT) \ wefax/fldigi-wefax.$(OBJEXT) wefax/fldigi-wefax_map.$(OBJEXT) \ wefax/fldigi-wefax-pic.$(OBJEXT) \ widgets/fldigi-flinput2.$(OBJEXT) \ widgets/fldigi-flmisc.$(OBJEXT) \ widgets/fldigi-flslider2.$(OBJEXT) \ widgets/fldigi-Fl_Text_Buffer_mod.$(OBJEXT) \ widgets/fldigi-Fl_Text_Display_mod.$(OBJEXT) \ widgets/fldigi-Fl_Text_Editor_mod.$(OBJEXT) \ widgets/fldigi-FTextRXTX.$(OBJEXT) \ widgets/fldigi-FTextView.$(OBJEXT) \ widgets/fldigi-Panel.$(OBJEXT) \ widgets/fldigi-picture.$(OBJEXT) \ widgets/fldigi-plot_xy.$(OBJEXT) \ widgets/fldigi-progress.$(OBJEXT) \ widgets/fldigi-psk_browser.$(OBJEXT) \ widgets/fldigi-pwrmeter.$(OBJEXT) \ widgets/fldigi-smeter.$(OBJEXT) \ widgets/fldigi-vumeter.$(OBJEXT) wwv/fldigi-analysis.$(OBJEXT) \ wwv/fldigi-wwv.$(OBJEXT) nodist_fldigi_OBJECTS = $(am__objects_20) fldigi_OBJECTS = $(am_fldigi_OBJECTS) $(nodist_fldigi_OBJECTS) fldigi_DEPENDENCIES = fldigi_LINK = $(CXXLD) $(fldigi_CXXFLAGS) $(CXXFLAGS) \ $(fldigi_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/fldigi-main.Po \ blank/$(DEPDIR)/fldigi-blank.Po \ cmedia/$(DEPDIR)/fldigi-cmedia.Po \ cmedia/$(DEPDIR)/fldigi-hid.Po \ cmedia/$(DEPDIR)/fldigi-hid_lin.Po \ cmedia/$(DEPDIR)/fldigi-hid_mac.Po \ cmedia/$(DEPDIR)/fldigi-hid_win.Po \ combo/$(DEPDIR)/flarq-combo.Po combo/$(DEPDIR)/fldigi-combo.Po \ compat/$(DEPDIR)/flarq-getsysinfo.Po \ compat/$(DEPDIR)/flarq-mingw.Po \ compat/$(DEPDIR)/flarq-regex.Po \ compat/$(DEPDIR)/fldigi-getsysinfo.Po \ compat/$(DEPDIR)/fldigi-mingw.Po \ compat/$(DEPDIR)/fldigi-regex.Po \ config_script/$(DEPDIR)/fldigi-create_default_script.Po \ config_script/$(DEPDIR)/fldigi-run_scripts.Po \ config_script/$(DEPDIR)/fldigi-script_parsing.Po \ contestia/$(DEPDIR)/fldigi-contestia.Po \ cw/$(DEPDIR)/fldigi-ICOMkeying.Po \ cw/$(DEPDIR)/fldigi-KYkeying.Po cw/$(DEPDIR)/fldigi-Nav.Po \ cw/$(DEPDIR)/fldigi-YAESUkeying.Po cw/$(DEPDIR)/fldigi-cw.Po \ cw/$(DEPDIR)/fldigi-morse.Po cw/$(DEPDIR)/fldigi-nanoIO.Po \ cw/$(DEPDIR)/fldigi-view_cw.Po cw/$(DEPDIR)/fldigi-winkeyer.Po \ debug/$(DEPDIR)/fldigi-debug.Po \ debug/$(DEPDIR)/fldigi-debug_dialog.Po \ dialogs/$(DEPDIR)/flarq-font_browser.Po \ dialogs/$(DEPDIR)/fldigi-Viewer.Po \ dialogs/$(DEPDIR)/fldigi-confdialog.Po \ dialogs/$(DEPDIR)/fldigi-fl_digi.Po \ dialogs/$(DEPDIR)/fldigi-fl_digi_main.Po \ dialogs/$(DEPDIR)/fldigi-font_browser.Po \ dialogs/$(DEPDIR)/fldigi-guide.Po \ dialogs/$(DEPDIR)/fldigi-htmlstrings.Po \ dialogs/$(DEPDIR)/fldigi-notifydialog.Po \ dialogs/$(DEPDIR)/fldigi-record_browse.Po \ dialogs/$(DEPDIR)/fldigi-rxmon.Po \ dialogs/$(DEPDIR)/fldigi-testsigs.Po \ dialogs/$(DEPDIR)/fldigi-tod_clock.Po \ dominoex/$(DEPDIR)/fldigi-dominoex.Po \ dominoex/$(DEPDIR)/fldigi-dominovar.Po \ dtmf/$(DEPDIR)/fldigi-dtmf.Po \ dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Po \ dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Po \ dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Po \ dxcluster/$(DEPDIR)/fldigi-arc-help.Po \ dxcluster/$(DEPDIR)/fldigi-dx_dialog.Po \ dxcluster/$(DEPDIR)/fldigi-dxcluster.Po \ feld/$(DEPDIR)/fldigi-Feld7x7-14.Po \ feld/$(DEPDIR)/fldigi-Feld7x7n-14.Po \ feld/$(DEPDIR)/fldigi-FeldDx-14.Po \ feld/$(DEPDIR)/fldigi-FeldFat-14.Po \ feld/$(DEPDIR)/fldigi-FeldHell-12.Po \ feld/$(DEPDIR)/fldigi-FeldLittle-12.Po \ feld/$(DEPDIR)/fldigi-FeldLo8-14.Po \ feld/$(DEPDIR)/fldigi-FeldLow-14.Po \ feld/$(DEPDIR)/fldigi-FeldModern-14.Po \ feld/$(DEPDIR)/fldigi-FeldModern8-14.Po \ feld/$(DEPDIR)/fldigi-FeldNarr-14.Po \ feld/$(DEPDIR)/fldigi-FeldReal-14.Po \ feld/$(DEPDIR)/fldigi-FeldStyl-14.Po \ feld/$(DEPDIR)/fldigi-FeldVert-14.Po \ feld/$(DEPDIR)/fldigi-FeldWide-14.Po \ feld/$(DEPDIR)/fldigi-feld.Po \ feld/$(DEPDIR)/fldigi-feldfonts.Po \ fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Po \ fft-monitor/$(DEPDIR)/fldigi-spectrum.Po \ fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Po \ fileselector/$(DEPDIR)/flarq-fileselect.Po \ fileselector/$(DEPDIR)/fldigi-fileselect.Po \ fileselector/$(DEPDIR)/fldigi-flnfc_common.Po \ filters/$(DEPDIR)/fldigi-fftfilt.Po \ filters/$(DEPDIR)/fldigi-filters.Po \ filters/$(DEPDIR)/fldigi-viterbi.Po \ flarq-src/$(DEPDIR)/flarq-arq.Po \ flarq-src/$(DEPDIR)/flarq-arqdialogs.Po \ flarq-src/$(DEPDIR)/flarq-arqhelp.Po \ flarq-src/$(DEPDIR)/flarq-b64.Po \ flarq-src/$(DEPDIR)/flarq-flarq.Po \ flarq-src/$(DEPDIR)/flarq-flarqenv.Po \ flarq-src/$(DEPDIR)/flarq-xml_server.Po \ fmt/$(DEPDIR)/fldigi-fmt.Po fmt/$(DEPDIR)/fldigi-fmt_dialog.Po \ fsq/$(DEPDIR)/fldigi-bitmaps.Po \ fsq/$(DEPDIR)/fldigi-fsq-pic.Po fsq/$(DEPDIR)/fldigi-fsq.Po \ fsq/$(DEPDIR)/fldigi-fsq_monitor.Po \ fsq/$(DEPDIR)/fldigi-fsq_varicode.Po \ globals/$(DEPDIR)/fldigi-globals.Po \ ifkp/$(DEPDIR)/fldigi-ifkp-pic.Po \ ifkp/$(DEPDIR)/fldigi-ifkp.Po \ ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Po \ ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Po \ ifkp/$(DEPDIR)/fldigi-tux.Po irrxml/$(DEPDIR)/fldigi-irrXML.Po \ kml/$(DEPDIR)/fldigi-kmlserver.Po \ libtiniconv/$(DEPDIR)/fldigi-tiniconv.Po \ libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Po \ logbook/$(DEPDIR)/flarq-table.Po \ logbook/$(DEPDIR)/fldigi-adif_io.Po \ logbook/$(DEPDIR)/fldigi-calendar.Po \ logbook/$(DEPDIR)/fldigi-contest.Po \ logbook/$(DEPDIR)/fldigi-counties.Po \ logbook/$(DEPDIR)/fldigi-county_lists.Po \ logbook/$(DEPDIR)/fldigi-cty-dat.Po \ logbook/$(DEPDIR)/fldigi-date.Po \ logbook/$(DEPDIR)/fldigi-fd_logger.Po \ logbook/$(DEPDIR)/fldigi-fd_view.Po \ logbook/$(DEPDIR)/fldigi-lgbook.Po \ logbook/$(DEPDIR)/fldigi-logbook.Po \ logbook/$(DEPDIR)/fldigi-logsupport.Po \ logbook/$(DEPDIR)/fldigi-lookupcall.Po \ logbook/$(DEPDIR)/fldigi-maclogger.Po \ logbook/$(DEPDIR)/fldigi-n3fjp_logger.Po \ logbook/$(DEPDIR)/fldigi-qrzlib.Po \ logbook/$(DEPDIR)/fldigi-qso_db.Po \ logbook/$(DEPDIR)/fldigi-table.Po \ logbook/$(DEPDIR)/fldigi-textio.Po \ logbook/$(DEPDIR)/fldigi-xmlrpc_log.Po \ logger/$(DEPDIR)/fldigi-logger.Po \ logger/$(DEPDIR)/fldigi-rx_extract.Po \ logger/$(DEPDIR)/fldigi-speak.Po \ mbedtls/$(DEPDIR)/fldigi-aes.Po \ mbedtls/$(DEPDIR)/fldigi-aesni.Po \ mbedtls/$(DEPDIR)/fldigi-arc4.Po \ mbedtls/$(DEPDIR)/fldigi-aria.Po \ mbedtls/$(DEPDIR)/fldigi-asn1parse.Po \ mbedtls/$(DEPDIR)/fldigi-asn1write.Po \ mbedtls/$(DEPDIR)/fldigi-base64.Po \ mbedtls/$(DEPDIR)/fldigi-bignum.Po \ mbedtls/$(DEPDIR)/fldigi-blowfish.Po \ mbedtls/$(DEPDIR)/fldigi-camellia.Po \ mbedtls/$(DEPDIR)/fldigi-ccm.Po \ mbedtls/$(DEPDIR)/fldigi-certs.Po \ mbedtls/$(DEPDIR)/fldigi-chacha20.Po \ mbedtls/$(DEPDIR)/fldigi-chachapoly.Po \ mbedtls/$(DEPDIR)/fldigi-cipher.Po \ mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Po \ mbedtls/$(DEPDIR)/fldigi-cmac.Po \ mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Po \ mbedtls/$(DEPDIR)/fldigi-debug.Po \ mbedtls/$(DEPDIR)/fldigi-des.Po \ mbedtls/$(DEPDIR)/fldigi-dhm.Po \ mbedtls/$(DEPDIR)/fldigi-ecdh.Po \ mbedtls/$(DEPDIR)/fldigi-ecdsa.Po \ mbedtls/$(DEPDIR)/fldigi-ecjpake.Po \ mbedtls/$(DEPDIR)/fldigi-ecp.Po \ mbedtls/$(DEPDIR)/fldigi-ecp_curves.Po \ mbedtls/$(DEPDIR)/fldigi-entropy.Po \ mbedtls/$(DEPDIR)/fldigi-entropy_poll.Po \ mbedtls/$(DEPDIR)/fldigi-error.Po \ mbedtls/$(DEPDIR)/fldigi-gcm.Po \ mbedtls/$(DEPDIR)/fldigi-havege.Po \ mbedtls/$(DEPDIR)/fldigi-hkdf.Po \ mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Po \ mbedtls/$(DEPDIR)/fldigi-md.Po mbedtls/$(DEPDIR)/fldigi-md2.Po \ mbedtls/$(DEPDIR)/fldigi-md4.Po \ mbedtls/$(DEPDIR)/fldigi-md5.Po \ mbedtls/$(DEPDIR)/fldigi-md_wrap.Po \ mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Po \ mbedtls/$(DEPDIR)/fldigi-net_sockets.Po \ mbedtls/$(DEPDIR)/fldigi-nist_kw.Po \ mbedtls/$(DEPDIR)/fldigi-oid.Po \ mbedtls/$(DEPDIR)/fldigi-padlock.Po \ mbedtls/$(DEPDIR)/fldigi-pem.Po mbedtls/$(DEPDIR)/fldigi-pk.Po \ mbedtls/$(DEPDIR)/fldigi-pk_wrap.Po \ mbedtls/$(DEPDIR)/fldigi-pkcs11.Po \ mbedtls/$(DEPDIR)/fldigi-pkcs12.Po \ mbedtls/$(DEPDIR)/fldigi-pkcs5.Po \ mbedtls/$(DEPDIR)/fldigi-pkparse.Po \ mbedtls/$(DEPDIR)/fldigi-pkwrite.Po \ mbedtls/$(DEPDIR)/fldigi-platform.Po \ mbedtls/$(DEPDIR)/fldigi-platform_util.Po \ mbedtls/$(DEPDIR)/fldigi-poly1305.Po \ mbedtls/$(DEPDIR)/fldigi-ripemd160.Po \ mbedtls/$(DEPDIR)/fldigi-rsa.Po \ mbedtls/$(DEPDIR)/fldigi-rsa_internal.Po \ mbedtls/$(DEPDIR)/fldigi-sha1.Po \ mbedtls/$(DEPDIR)/fldigi-sha256.Po \ mbedtls/$(DEPDIR)/fldigi-sha512.Po \ mbedtls/$(DEPDIR)/fldigi-ssl_cache.Po \ mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Po \ mbedtls/$(DEPDIR)/fldigi-ssl_cli.Po \ mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Po \ mbedtls/$(DEPDIR)/fldigi-ssl_srv.Po \ mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Po \ mbedtls/$(DEPDIR)/fldigi-ssl_tls.Po \ mbedtls/$(DEPDIR)/fldigi-threading.Po \ mbedtls/$(DEPDIR)/fldigi-timing.Po \ mbedtls/$(DEPDIR)/fldigi-version.Po \ mbedtls/$(DEPDIR)/fldigi-version_features.Po \ mbedtls/$(DEPDIR)/fldigi-x509.Po \ mbedtls/$(DEPDIR)/fldigi-x509_create.Po \ mbedtls/$(DEPDIR)/fldigi-x509_crl.Po \ mbedtls/$(DEPDIR)/fldigi-x509_crt.Po \ mbedtls/$(DEPDIR)/fldigi-x509_csr.Po \ mbedtls/$(DEPDIR)/fldigi-x509write_crt.Po \ mbedtls/$(DEPDIR)/fldigi-x509write_csr.Po \ mbedtls/$(DEPDIR)/fldigi-xtea.Po \ mfsk/$(DEPDIR)/fldigi-interleave.Po \ mfsk/$(DEPDIR)/fldigi-mfsk-pic.Po \ mfsk/$(DEPDIR)/fldigi-mfsk.Po \ mfsk/$(DEPDIR)/fldigi-mfskvaricode.Po \ misc/$(DEPDIR)/flarq-ascii.Po misc/$(DEPDIR)/flarq-icons.Po \ misc/$(DEPDIR)/flarq-nls.Po misc/$(DEPDIR)/flarq-pixmaps.Po \ misc/$(DEPDIR)/flarq-pixmaps_tango.Po \ misc/$(DEPDIR)/flarq-re.Po misc/$(DEPDIR)/flarq-stack.Po \ misc/$(DEPDIR)/flarq-stacktrace.Po \ misc/$(DEPDIR)/flarq-threads.Po \ misc/$(DEPDIR)/flarq-timeops.Po misc/$(DEPDIR)/flarq-util.Po \ misc/$(DEPDIR)/fldigi-arq_io.Po misc/$(DEPDIR)/fldigi-ascii.Po \ misc/$(DEPDIR)/fldigi-ax25_decode.Po \ misc/$(DEPDIR)/fldigi-benchmark.Po \ misc/$(DEPDIR)/fldigi-charsetdistiller.Po \ misc/$(DEPDIR)/fldigi-charsetlist.Po \ misc/$(DEPDIR)/fldigi-configuration.Po \ misc/$(DEPDIR)/fldigi-coordinate.Po \ misc/$(DEPDIR)/fldigi-dxcc.Po \ misc/$(DEPDIR)/fldigi-estrings.Po \ misc/$(DEPDIR)/fldigi-icons.Po \ misc/$(DEPDIR)/fldigi-kiss_io.Po \ misc/$(DEPDIR)/fldigi-locator.Po misc/$(DEPDIR)/fldigi-log.Po \ misc/$(DEPDIR)/fldigi-macroedit.Po \ misc/$(DEPDIR)/fldigi-macros.Po misc/$(DEPDIR)/fldigi-misc.Po \ misc/$(DEPDIR)/fldigi-newinstall.Po \ misc/$(DEPDIR)/fldigi-nls.Po \ misc/$(DEPDIR)/fldigi-outputencoder.Po \ misc/$(DEPDIR)/fldigi-pixmaps.Po \ misc/$(DEPDIR)/fldigi-pixmaps_tango.Po \ misc/$(DEPDIR)/fldigi-re.Po \ misc/$(DEPDIR)/fldigi-record_loader.Po \ misc/$(DEPDIR)/fldigi-stack.Po \ misc/$(DEPDIR)/fldigi-stacktrace.Po \ misc/$(DEPDIR)/fldigi-strutil.Po \ misc/$(DEPDIR)/fldigi-threads.Po \ misc/$(DEPDIR)/fldigi-timeops.Po \ misc/$(DEPDIR)/fldigi-utf8file_io.Po \ misc/$(DEPDIR)/fldigi-util.Po mt63/$(DEPDIR)/fldigi-dsp.Po \ mt63/$(DEPDIR)/fldigi-mt63.Po \ mt63/$(DEPDIR)/fldigi-mt63base.Po \ navtex/$(DEPDIR)/fldigi-navtex.Po \ network/$(DEPDIR)/flarq-socket.Po \ network/$(DEPDIR)/fldigi-ca_cert.Po \ network/$(DEPDIR)/fldigi-metar.Po \ network/$(DEPDIR)/fldigi-network.Po \ network/$(DEPDIR)/fldigi-socket.Po \ network/$(DEPDIR)/fldigi-weather.Po \ network/$(DEPDIR)/fldigi-xmlrpc.Po \ olivia/$(DEPDIR)/fldigi-olivia.Po psk/$(DEPDIR)/fldigi-psk.Po \ psk/$(DEPDIR)/fldigi-pskcoeff.Po \ psk/$(DEPDIR)/fldigi-pskeval.Po \ psk/$(DEPDIR)/fldigi-pskvaricode.Po \ psk/$(DEPDIR)/fldigi-viewpsk.Po psm/$(DEPDIR)/fldigi-psm.Po \ qrunner/$(DEPDIR)/fldigi-qrunner.Po \ rigcontrol/$(DEPDIR)/fldigi-FreqControl.Po \ rigcontrol/$(DEPDIR)/fldigi-hamlib.Po \ rigcontrol/$(DEPDIR)/fldigi-norig.Po \ rigcontrol/$(DEPDIR)/fldigi-ptt.Po \ rigcontrol/$(DEPDIR)/fldigi-rigclass.Po \ rigcontrol/$(DEPDIR)/fldigi-rigio.Po \ rigcontrol/$(DEPDIR)/fldigi-rigsupport.Po \ rigcontrol/$(DEPDIR)/fldigi-rigxml.Po \ rigcontrol/$(DEPDIR)/fldigi-serial.Po \ rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Po \ rsid/$(DEPDIR)/fldigi-rsid.Po \ rsid/$(DEPDIR)/fldigi-rsid_defs.Po \ rtty/$(DEPDIR)/fldigi-fsk.Po rtty/$(DEPDIR)/fldigi-rtty.Po \ rtty/$(DEPDIR)/fldigi-view_rtty.Po \ soundcard/$(DEPDIR)/fldigi-audio_alert.Po \ soundcard/$(DEPDIR)/fldigi-bark.Po \ soundcard/$(DEPDIR)/fldigi-checkout.Po \ soundcard/$(DEPDIR)/fldigi-diesel.Po \ soundcard/$(DEPDIR)/fldigi-dinnerbell.Po \ soundcard/$(DEPDIR)/fldigi-doesnot.Po \ soundcard/$(DEPDIR)/fldigi-play.pa.Po \ soundcard/$(DEPDIR)/fldigi-sound.Po \ soundcard/$(DEPDIR)/fldigi-soundconf.Po \ soundcard/$(DEPDIR)/fldigi-steam_train.Po \ soundcard/$(DEPDIR)/fldigi-ttybell.Po \ spot/$(DEPDIR)/fldigi-notify.Po \ spot/$(DEPDIR)/fldigi-pskrep.Po spot/$(DEPDIR)/fldigi-spot.Po \ ssb/$(DEPDIR)/fldigi-ssb.Po \ status/$(DEPDIR)/fldigi-squelch_status.Po \ status/$(DEPDIR)/fldigi-status.Po \ synop-src/$(DEPDIR)/fldigi-synop.Po \ thor/$(DEPDIR)/fldigi-thor-pic.Po \ thor/$(DEPDIR)/fldigi-thor.Po \ thor/$(DEPDIR)/fldigi-thorvaricode.Po \ throb/$(DEPDIR)/fldigi-throb.Po trx/$(DEPDIR)/fldigi-modem.Po \ trx/$(DEPDIR)/fldigi-nullmodem.Po \ trx/$(DEPDIR)/fldigi-test_signal.Po \ trx/$(DEPDIR)/fldigi-trx.Po trx/$(DEPDIR)/fldigi-tune.Po \ waterfall/$(DEPDIR)/fldigi-colorbox.Po \ waterfall/$(DEPDIR)/fldigi-digiscope.Po \ waterfall/$(DEPDIR)/fldigi-raster.Po \ waterfall/$(DEPDIR)/fldigi-waterfall.Po \ wefax/$(DEPDIR)/fldigi-wefax-pic.Po \ wefax/$(DEPDIR)/fldigi-wefax.Po \ wefax/$(DEPDIR)/fldigi-wefax_map.Po \ widgets/$(DEPDIR)/flarq-FTextView.Po \ widgets/$(DEPDIR)/flarq-F_Edit.Po \ widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po \ widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Po \ widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po \ widgets/$(DEPDIR)/flarq-flinput2.Po \ widgets/$(DEPDIR)/flarq-flmisc.Po \ widgets/$(DEPDIR)/flarq-flslider2.Po \ widgets/$(DEPDIR)/fldigi-FTextRXTX.Po \ widgets/$(DEPDIR)/fldigi-FTextView.Po \ widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po \ widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po \ widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po \ widgets/$(DEPDIR)/fldigi-Panel.Po \ widgets/$(DEPDIR)/fldigi-flinput2.Po \ widgets/$(DEPDIR)/fldigi-flmisc.Po \ widgets/$(DEPDIR)/fldigi-flslider2.Po \ widgets/$(DEPDIR)/fldigi-picture.Po \ widgets/$(DEPDIR)/fldigi-plot_xy.Po \ widgets/$(DEPDIR)/fldigi-progress.Po \ widgets/$(DEPDIR)/fldigi-psk_browser.Po \ widgets/$(DEPDIR)/fldigi-pwrmeter.Po \ widgets/$(DEPDIR)/fldigi-smeter.Po \ widgets/$(DEPDIR)/fldigi-vumeter.Po \ wwv/$(DEPDIR)/fldigi-analysis.Po wwv/$(DEPDIR)/fldigi-wwv.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Po \ xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Po \ xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(flarq_SOURCES) $(EXTRA_flarq_SOURCES) $(fldigi_SOURCES) \ $(EXTRA_fldigi_SOURCES) $(nodist_fldigi_SOURCES) DIST_SOURCES = $(am__flarq_SOURCES_DIST) $(EXTRA_flarq_SOURCES) \ $(am__fldigi_SOURCES_DIST) $(EXTRA_fldigi_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ check recheck distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" A2X = @A2X@ ACLOCAL = @ACLOCAL@ AC_CONFIG_ARGS = @AC_CONFIG_ARGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ASCIIDOC = @ASCIIDOC@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BFD_CFLAGS = @BFD_CFLAGS@ BFD_LIBS = @BFD_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXX11_SWITCH = @CXX11_SWITCH@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEBUG_CFLAGS = @DEBUG_CFLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ EXTRA_LIBS = @EXTRA_LIBS@ FLARQ_AUTHORS = @FLARQ_AUTHORS@ FLARQ_BUILD_CPPFLAGS = @FLARQ_BUILD_CPPFLAGS@ FLARQ_BUILD_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ FLARQ_BUILD_LDADD = @FLARQ_BUILD_LDADD@ FLARQ_BUILD_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ FLARQ_DOCS = @FLARQ_DOCS@ FLARQ_VERSION = @FLARQ_VERSION@ FLARQ_VERSION_MAJOR = @FLARQ_VERSION_MAJOR@ FLARQ_VERSION_MINOR = @FLARQ_VERSION_MINOR@ FLARQ_VERSION_PATCH = @FLARQ_VERSION_PATCH@ FLDIGI_AUTHORS = @FLDIGI_AUTHORS@ FLDIGI_BUILD_CFLAGS = @FLDIGI_BUILD_CFLAGS@ FLDIGI_BUILD_CPPFLAGS = @FLDIGI_BUILD_CPPFLAGS@ FLDIGI_BUILD_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ FLDIGI_BUILD_LDADD = @FLDIGI_BUILD_LDADD@ FLDIGI_BUILD_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ FLDIGI_VERSION = @FLDIGI_VERSION@ ######################################################################## FLDIGI_VERSION_MAJOR = @FLDIGI_VERSION_MAJOR@ FLDIGI_VERSION_MINOR = @FLDIGI_VERSION_MINOR@ FLDIGI_VERSION_PATCH = @FLDIGI_VERSION_PATCH@ FLTK_CFLAGS = @FLTK_CFLAGS@ FLTK_CONFIG = @FLTK_CONFIG@ FLTK_LIBS = @FLTK_LIBS@ FLUID = @FLUID@ FLXMLRPC_CFLAGS = @FLXMLRPC_CFLAGS@ FLXMLRPC_LIBS = @FLXMLRPC_LIBS@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ HAMLIB_CFLAGS = @HAMLIB_CFLAGS@ HAMLIB_LIBS = @HAMLIB_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_CFLAGS = @INTL_CFLAGS@ INTL_LIBS = @INTL_LIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBMBEDTLS_CFLAGS = @LIBMBEDTLS_CFLAGS@ LIBMBEDTLS_LIBS = @LIBMBEDTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAC_UNIVERSAL_CFLAGS = @MAC_UNIVERSAL_CFLAGS@ MAC_UNIVERSAL_LDFLAGS = @MAC_UNIVERSAL_LDFLAGS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MAKENSIS = @MAKENSIS@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ OBJEXT = @OBJEXT@ OPT_CFLAGS = @OPT_CFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_DL = @PACKAGE_DL@ PACKAGE_DOCS = @PACKAGE_DOCS@ PACKAGE_GUIDE = @PACKAGE_GUIDE@ PACKAGE_HOME = @PACKAGE_HOME@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NEWBUG = @PACKAGE_NEWBUG@ PACKAGE_PROJ = @PACKAGE_PROJ@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ PORTAUDIO_CFLAGS = @PORTAUDIO_CFLAGS@ PORTAUDIO_LIBS = @PORTAUDIO_LIBS@ POSUB = @POSUB@ POW_LIB = @POW_LIB@ PTW32_CFLAGS = @PTW32_CFLAGS@ PTW32_LIBS = @PTW32_LIBS@ PULSEAUDIO_CFLAGS = @PULSEAUDIO_CFLAGS@ PULSEAUDIO_LIBS = @PULSEAUDIO_LIBS@ RDYNAMIC = @RDYNAMIC@ SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@ SAMPLERATE_LIBS = @SAMPLERATE_LIBS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNDFILE_CFLAGS = @SNDFILE_CFLAGS@ SNDFILE_LIBS = @SNDFILE_LIBS@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = # The BUILD_* variables are defined in build.m4 fldigi_CPPFLAGS = -DBUILD_FLDIGI -DLOCALEDIR=\"$(localedir)\" \ @FLDIGI_BUILD_CPPFLAGS@ -DPKGDATADIR=\"$(pkgdatadir)\" \ $(am__append_3) $(am__append_7) $(am__append_16) fldigi_CXXFLAGS = @FLDIGI_BUILD_CXXFLAGS@ $(am__append_4) \ $(am__append_8) $(am__append_17) fldigi_CFLAGS = @FLDIGI_BUILD_CFLAGS@ $(am__append_9) $(am__append_18) fldigi_LDFLAGS = @FLDIGI_BUILD_LDFLAGS@ $(am__append_10) \ $(am__append_19) fldigi_LDADD = @FLDIGI_BUILD_LDADD@ flarq_CPPFLAGS = -DBUILD_FLARQ -DLOCALEDIR=\"$(localedir)\" \ @FLARQ_BUILD_CPPFLAGS@ $(am__append_11) flarq_CXXFLAGS = @FLARQ_BUILD_CXXFLAGS@ $(am__append_12) flarq_CFLAGS = $(fldigi_CFLAGS) $(am__append_13) flarq_LDFLAGS = @FLARQ_BUILD_LDFLAGS@ $(am__append_14) flarq_LDADD = @FLARQ_BUILD_LDADD@ HAMLIB_SRC = \ include/hamlib.h \ rigcontrol/hamlib.cxx \ include/rigclass.h \ rigcontrol/rigclass.cxx XMLRPC_SRC = \ include/xmlrpc.h \ network/xmlrpc.cxx FLDIGI_WIN32_RES_SRC = fldigirc.rc FLARQ_WIN32_RES_SRC = flarq-src/flarqrc.rc COMMON_WIN32_RES_SRC = common.rc BENCHMARK_SRC = include/benchmark.h misc/benchmark.cxx REGEX_SRC = compat/regex.h compat/regex.c STACK_SRC = include/stack.h misc/stack.cxx MINGW32_SRC = include/compat.h compat/getsysinfo.c compat/mingw.c compat/mingw.h NLS_SRC = misc/nls.cxx include/nls.h # We distribute these but do not always compile them # Build the xmlrpcpp source if libflxmlrpc is not found XMLRPCPP_SRC = \ xmlrpcpp/XmlRpcBase64.h \ xmlrpcpp/XmlRpcClient.cpp \ xmlrpcpp/XmlRpcClient.h \ xmlrpcpp/XmlRpcDispatch.cpp \ xmlrpcpp/XmlRpcDispatch.h \ xmlrpcpp/XmlRpcException.h \ xmlrpcpp/XmlRpc.h \ xmlrpcpp/XmlRpcMutex.cpp \ xmlrpcpp/XmlRpcMutex.h \ xmlrpcpp/XmlRpcServerConnection.cpp \ xmlrpcpp/XmlRpcServerConnection.h \ xmlrpcpp/XmlRpcServer.cpp \ xmlrpcpp/XmlRpcServer.h \ xmlrpcpp/XmlRpcServerMethod.cpp \ xmlrpcpp/XmlRpcServerMethod.h \ xmlrpcpp/XmlRpcSocket.cpp \ xmlrpcpp/XmlRpcSocket.h \ xmlrpcpp/XmlRpcSource.cpp \ xmlrpcpp/XmlRpcSource.h \ xmlrpcpp/XmlRpcUtil.cpp \ xmlrpcpp/XmlRpcUtil.h \ xmlrpcpp/XmlRpcValue.cpp \ xmlrpcpp/XmlRpcValue.h # Build the libmbedtls source if libmbedtls is not found LIBMBEDTLS_SRC = \ mbedtls/aes.c \ mbedtls/aesni.c \ mbedtls/arc4.c \ mbedtls/aria.c \ mbedtls/asn1parse.c \ mbedtls/asn1write.c \ mbedtls/base64.c \ mbedtls/bignum.c \ mbedtls/blowfish.c \ mbedtls/camellia.c \ mbedtls/ccm.c \ mbedtls/certs.c \ mbedtls/chacha20.c \ mbedtls/chachapoly.c \ mbedtls/cipher.c \ mbedtls/cipher_wrap.c \ mbedtls/cmac.c \ mbedtls/ctr_drbg.c \ mbedtls/debug.c \ mbedtls/des.c \ mbedtls/dhm.c \ mbedtls/ecdh.c \ mbedtls/ecdsa.c \ mbedtls/ecjpake.c \ mbedtls/ecp.c \ mbedtls/ecp_curves.c \ mbedtls/entropy.c \ mbedtls/entropy_poll.c \ mbedtls/error.c \ mbedtls/gcm.c \ mbedtls/havege.c \ mbedtls/hkdf.c \ mbedtls/hmac_drbg.c \ mbedtls/md2.c \ mbedtls/md4.c \ mbedtls/md5.c \ mbedtls/md.c \ mbedtls/md_wrap.c \ mbedtls/memory_buffer_alloc.c \ mbedtls/net_sockets.c \ mbedtls/nist_kw.c \ mbedtls/oid.c \ mbedtls/padlock.c \ mbedtls/pem.c \ mbedtls/pk.c \ mbedtls/pkcs11.c \ mbedtls/pkcs12.c \ mbedtls/pkcs5.c \ mbedtls/pkparse.c \ mbedtls/pk_wrap.c \ mbedtls/pkwrite.c \ mbedtls/platform.c \ mbedtls/platform_util.c \ mbedtls/poly1305.c \ mbedtls/ripemd160.c \ mbedtls/rsa.c \ mbedtls/rsa_internal.c \ mbedtls/sha1.c \ mbedtls/sha256.c \ mbedtls/sha512.c \ mbedtls/ssl_cache.c \ mbedtls/ssl_ciphersuites.c \ mbedtls/ssl_cli.c \ mbedtls/ssl_cookie.c \ mbedtls/ssl_srv.c \ mbedtls/ssl_ticket.c \ mbedtls/ssl_tls.c \ mbedtls/threading.c \ mbedtls/timing.c \ mbedtls/version.c \ mbedtls/version_features.c \ mbedtls/x509.c \ mbedtls/x509_create.c \ mbedtls/x509_crl.c \ mbedtls/x509_crt.c \ mbedtls/x509_csr.c \ mbedtls/x509write_crt.c \ mbedtls/x509write_csr.c \ mbedtls/xtea.c \ include/mbedtls/aes.h \ include/mbedtls/aesni.h \ include/mbedtls/arc4.h \ include/mbedtls/aria.h \ include/mbedtls/asn1.h \ include/mbedtls/asn1write.h \ include/mbedtls/base64.h \ include/mbedtls/bignum.h \ include/mbedtls/blowfish.h \ include/mbedtls/bn_mul.h \ include/mbedtls/camellia.h \ include/mbedtls/ccm.h \ include/mbedtls/certs.h \ include/mbedtls/chacha20.h \ include/mbedtls/chachapoly.h \ include/mbedtls/check_config.h \ include/mbedtls/cipher.h \ include/mbedtls/cipher_internal.h \ include/mbedtls/cmac.h \ include/mbedtls/compat-1.3.h \ include/mbedtls/config.h \ include/mbedtls/ctr_drbg.h \ include/mbedtls/debug.h \ include/mbedtls/des.h \ include/mbedtls/dhm.h \ include/mbedtls/ecdh.h \ include/mbedtls/ecdsa.h \ include/mbedtls/ecjpake.h \ include/mbedtls/ecp.h \ include/mbedtls/ecp_internal.h \ include/mbedtls/entropy.h \ include/mbedtls/entropy_poll.h \ include/mbedtls/error.h \ include/mbedtls/gcm.h \ include/mbedtls/havege.h \ include/mbedtls/hkdf.h \ include/mbedtls/hmac_drbg.h \ include/mbedtls/md2.h \ include/mbedtls/md4.h \ include/mbedtls/md5.h \ include/mbedtls/md.h \ include/mbedtls/md_internal.h \ include/mbedtls/memory_buffer_alloc.h \ include/mbedtls/net.h \ include/mbedtls/net_sockets.h \ include/mbedtls/nist_kw.h \ include/mbedtls/oid.h \ include/mbedtls/padlock.h \ include/mbedtls/pem.h \ include/mbedtls/pkcs11.h \ include/mbedtls/pkcs12.h \ include/mbedtls/pkcs5.h \ include/mbedtls/pk.h \ include/mbedtls/pk_internal.h \ include/mbedtls/platform.h \ include/mbedtls/platform_time.h \ include/mbedtls/platform_util.h \ include/mbedtls/poly1305.h \ include/mbedtls/ripemd160.h \ include/mbedtls/rsa.h \ include/mbedtls/rsa_internal.h \ include/mbedtls/sha1.h \ include/mbedtls/sha256.h \ include/mbedtls/sha512.h \ include/mbedtls/ssl_cache.h \ include/mbedtls/ssl_ciphersuites.h \ include/mbedtls/ssl_cookie.h \ include/mbedtls/ssl.h \ include/mbedtls/ssl_internal.h \ include/mbedtls/ssl_ticket.h \ include/mbedtls/threading.h \ include/mbedtls/timing.h \ include/mbedtls/version.h \ include/mbedtls/x509_crl.h \ include/mbedtls/x509_crt.h \ include/mbedtls/x509_csr.h \ include/mbedtls/x509.h \ include/mbedtls/xtea.h # packet/pkt.cxx # include/pkt.h # Sources that are part of the distribution but are not compiled directly EXTRA_fldigi_SOURCES = $(HAMLIB_SRC) $(XMLRPC_SRC) \ $(FLDIGI_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) \ $(BENCHMARK_SRC) $(REGEX_SRC) $(STACK_SRC) $(MINGW32_SRC) \ $(NLS_SRC) $(XMLRPCPP_SRC) $(LIBMBEDTLS_SRC) blank/blank.cxx \ blank/blank.h cmedia/hid_lin.cxx cmedia/hid_mac.cxx \ cmedia/hid_win.cxx dialogs/fl_digi_main.cxx \ dxcluster/arc-help.cxx dxcluster/CCC_Commands.cxx \ dxcluster/DXClusterServers.cxx \ dxcluster/DXSpiderCommandReference.cxx \ fileselector/flnfc_common.cxx feld/Feld7x7-14.cxx \ feld/Feld7x7n-14.cxx feld/FeldDx-14.cxx feld/FeldFat-14.cxx \ feld/FeldHell-12.cxx feld/FeldLittle-12.cxx \ feld/FeldLo8-14.cxx feld/FeldLow-14.cxx feld/FeldModern-14.cxx \ feld/FeldModern8-14.cxx feld/FeldNarr-14.cxx \ feld/FeldReal-14.cxx feld/FeldStyl-14.cxx feld/FeldVert-14.cxx \ feld/FeldWide-14.cxx fsq/fsq_varicode.cxx include/crc8.h \ include/Fl_Text_Buffer_mod.H include/Fl_Text_Display_mod.H \ include/Fl_Text_Editor_mod.H fsq/fsq-pic.cxx fsq/bitmaps.cxx \ ifkp/ifkp_bitmaps.cxx ifkp/ifkp_varicode.cxx ifkp/ifkp-pic.cxx \ mfsk/mfsk-pic.cxx mt63/alias_1k.dat mt63/alias_2k.dat \ mt63/morse.dat mt63/symbol.dat mt63/alias_k5.dat \ mt63/mt63intl.dat rsid/rsid_defs.cxx thor/thor-pic.cxx \ trx/tune.cxx dialogs/guide.cxx include/adif_def.h \ include/adif_io.h include/analysis.h include/arq_io.h \ include/ascii.h include/audio_alert.h include/ax25_decode.h \ include/calendar.h include/charsetdistiller.h \ include/charsetlist.h include/cmedia.h include/colorbox.h \ include/combo.h include/complex.h include/confdialog.h \ include/configuration.h include/contest.h include/contestia.h \ include/coordinate.h include/counties.h include/cw.h \ include/data_io.h include/date.h include/debug.h \ include/debug_dialog.h include/digiscope.h include/dominoex.h \ include/dominovar.h include/dr_mp3.h include/dsp.h \ include/dtmf.h include/dxcc.h include/dx_cluster.h \ include/dx_dialog.h include/estrings.h include/fd_logger.h \ include/fd_view.h include/feld.h include/fftfilt.h \ include/fft-monitor.h include/field_def.h include/fileselect.h \ include/filters.h include/fldigi-config.h include/fl_digi.h \ include/flinput2.h include/flmisc.h include/flslider2.h \ include/fmt.h include/fmt_dialog.h include/font_browser.h \ include/fontdef.h include/FreqControl.h include/fsk.h \ include/fsq.h include/FTextRXTX.h include/FTextView.h \ include/gettext.h include/gfft.h include/globals.h \ include/hidapi.h include/hid_lin.h include/hid_mac.h \ include/hid_win.h include/htmlstrings.h include/https.h \ include/icons.h include/ifkp.h include/interleave.h \ include/jalocha/pj_cmpx.h include/jalocha/pj_fft.h \ include/jalocha/pj_fht.h include/jalocha/pj_fifo.h \ include/jalocha/pj_gray.h include/jalocha/pj_lowpass3.h \ include/jalocha/pj_mfsk.h include/jalocha/pj_struc.h \ include/kiss_io.h include/kmlserver.h include/ICOMkeying.h \ include/KYkeying.h include/YAESUkeying.h include/lgbook.h \ include/locator.h include/logbook.h include/logger.h \ include/log.h include/logsupport.h include/lookupcall.h \ include/maclogger.h include/macroedit.h include/macros.h \ include/main.h include/mbuffer.h include/metar.h \ include/mfsk.h include/mfskvaricode.h include/misc.h \ include/modem.h include/morse.h include/mt63base.h \ include/mt63.h include/n3fjp_logger.h include/nanoIO.h \ include/Nav.h include/navtex.h include/navtex.h include/nco.h \ include/network.h include/newinstall.h include/notifydialog.h \ include/notify.h include/nullmodem.h include/olivia.h \ include/outputencoder.h include/Panel.h include/picture.h \ include/plot_xy.h include/pixmaps.h include/pkg.h \ include/play.pa.h include/progress.h include/psk_browser.h \ include/pskcoeff.h include/pskeval.h include/psk.h \ include/pskrep.h include/pskvaricode.h include/ptt.h \ include/pwrmeter.h include/qrunner.h include/qrzlib.h \ include/qso_db.h include/raster.h include/record_browse.h \ include/record_loader_gui.h include/record_loader.h \ include/re.h include/rigCAT.h include/rigio.h \ include/rigsupport.h include/rigxml.h include/ringbuffer.h \ include/rsid.h include/rtty.h include/rx_extract.h \ include/rxmon.h include/serial.h include/smeter.h \ include/squelch_status.h include/vumeter.h include/socket.h \ include/soundconf.h include/sound.h include/speak.h \ include/spectrum.h include/spectrum_viewer.h include/spot.h \ include/ssb.h include/stacktrace.h include/status.h \ include/status_box.h include/strutil.h include/synop.h \ include/tabdefs.h include/table.h include/testmodem.h \ include/test_signal.h include/testsigs.h include/textio.h \ include/thor.h include/thorvaricode.h include/threads.h \ include/throb.h include/timeops.h include/trx.h \ include/utf8file_io.h include/util.h include/view_cw.h \ include/Viewer.h include/viewpsk.h include/view_rtty.h \ include/viterbi.h include/waterfall.h include/weather.h \ include/wefax.h include/wefax_map.h include/wefax-pic.h \ include/winkeyer.h include/wwv.h include/xmlreader.h \ libtiniconv/tiniconv.h libtiniconv/tiniconv_int.h \ libtiniconv/encdec/ascii.h libtiniconv/encdec/big5.h \ libtiniconv/encdec/ces_big5.h libtiniconv/encdec/ces_gbk.h \ libtiniconv/encdec/cp1250.h libtiniconv/encdec/cp1251.h \ libtiniconv/encdec/cp1252.h libtiniconv/encdec/cp1253.h \ libtiniconv/encdec/cp1254.h libtiniconv/encdec/cp1255.h \ libtiniconv/encdec/cp1256.h libtiniconv/encdec/cp1257.h \ libtiniconv/encdec/cp1258.h libtiniconv/encdec/cp866.h \ libtiniconv/encdec/cp936ext.h libtiniconv/encdec/cp936.h \ libtiniconv/encdec/euc_cn.h libtiniconv/encdec/flushwc.h \ libtiniconv/encdec/gb2312.h libtiniconv/encdec/gbkext1.h \ libtiniconv/encdec/gbkext2.h libtiniconv/encdec/gbkext_inv.h \ libtiniconv/encdec/gbk.h libtiniconv/encdec/iso2022_jp.h \ libtiniconv/encdec/iso8859_10.h \ libtiniconv/encdec/iso8859_11.h \ libtiniconv/encdec/iso8859_13.h \ libtiniconv/encdec/iso8859_14.h \ libtiniconv/encdec/iso8859_15.h \ libtiniconv/encdec/iso8859_16.h libtiniconv/encdec/iso8859_1.h \ libtiniconv/encdec/iso8859_2.h libtiniconv/encdec/iso8859_3.h \ libtiniconv/encdec/iso8859_4.h libtiniconv/encdec/iso8859_5.h \ libtiniconv/encdec/iso8859_6.h libtiniconv/encdec/iso8859_7.h \ libtiniconv/encdec/iso8859_8.h libtiniconv/encdec/iso8859_9.h \ libtiniconv/encdec/jisx0201.h libtiniconv/encdec/jisx0208.h \ libtiniconv/encdec/koi8_r.h libtiniconv/encdec/koi8_ru.h \ libtiniconv/encdec/koi8_u.h libtiniconv/encdec/mac_cyrillic.h \ libtiniconv/encdec/ucs2.h libtiniconv/encdec/utf7.h \ libtiniconv/encdec/utf8.h libtiniconv/encdec/vietcomb.h EXTRA_flarq_SOURCES = $(FLARQ_WIN32_RES_SRC) $(COMMON_WIN32_RES_SRC) $(XMLRPCPP_SRC) # Sources that we build. It is OK to have headers here. fldigi_SOURCES = $(XMLRPC_SRC) $(am__append_5) $(am__append_15) \ $(am__append_20) $(am__append_21) $(am__append_22) \ $(am__append_23) $(am__append_25) $(am__append_27) \ $(am__append_29) $(am__append_31) cmedia/cmedia.cxx \ cmedia/hid.cxx combo/combo.cxx \ config_script/create_default_script.cxx \ config_script/run_script.h config_script/run_scripts.cxx \ config_script/script_parsing.cxx \ config_script/script_parsing.h contestia/contestia.cxx \ cw/cw.cxx cw/ICOMkeying.cxx cw/KYkeying.cxx cw/morse.cxx \ cw/nanoIO.cxx cw/Nav.cxx cw/view_cw.cxx cw/winkeyer.cxx \ cw/YAESUkeying.cxx rtty/fsk.cxx rtty/rtty.cxx \ rtty/view_rtty.cxx debug/debug.cxx debug/debug_dialog.cxx \ dialogs/confdialog.cxx dialogs/fl_digi.cxx \ dialogs/font_browser.cxx dialogs/htmlstrings.cxx \ dialogs/notifydialog.cxx dialogs/record_browse.cxx \ dialogs/rxmon.cxx dialogs/testsigs.cxx dialogs/tod_clock.cxx \ dialogs/Viewer.cxx dominoex/dominoex.cxx \ dominoex/dominovar.cxx dtmf/dtmf.cxx dxcluster/dxcluster.cxx \ dxcluster/dx_dialog.cxx feld/feld.cxx feld/feldfonts.cxx \ fft-monitor/fft-monitor.cxx fft-monitor/spectrum.cxx \ fft-monitor/spectrum_viewer.cxx fileselector/fileselect.cxx \ filters/fftfilt.cxx filters/filters.cxx filters/viterbi.cxx \ fmt/fmt.cxx fmt/fmt_dialog.cxx fsq/fsq.cxx fsq/fsq_monitor.cxx \ globals/globals.cxx ifkp/ifkp.cxx ifkp/tux.cxx \ irrxml/CXMLReaderImpl.h irrxml/fast_atof.h irrxml/heapsort.h \ irrxml/irrArray.h irrxml/irrString.h irrxml/irrTypes.h \ irrxml/irrXML.cpp irrxml/irrXML.h kml/kmlserver.cxx \ libtiniconv/tiniconv.c libtiniconv/tiniconv_desc.c \ logbook/adif_io.cxx logbook/calendar.cxx logbook/contest.cxx \ logbook/counties.cxx logbook/county_lists.cxx \ logbook/cty-dat.cxx logbook/date.cxx logbook/fd_logger.cxx \ logbook/fd_view.cxx logbook/lgbook.cxx logbook/logbook.cxx \ logbook/logsupport.cxx logbook/lookupcall.cxx \ logbook/maclogger.cxx logbook/n3fjp_logger.cxx \ logbook/qrzlib.cxx logbook/qso_db.cxx logbook/table.cxx \ logbook/textio.cxx logbook/xmlrpc_log.cxx logger/logger.cxx \ logger/rx_extract.cxx logger/speak.cxx main.cxx \ mfsk/interleave.cxx mfsk/mfsk.cxx mfsk/mfskvaricode.cxx \ misc/arq_io.cxx misc/ascii.cxx misc/ax25_decode.cxx \ misc/charsetdistiller.cxx misc/charsetlist.cxx \ misc/configuration.cxx misc/coordinate.cxx misc/dxcc.cxx \ misc/estrings.cxx misc/icons.cxx misc/kiss_io.cxx \ misc/locator.cxx misc/log.cxx misc/macroedit.cxx \ misc/macros.cxx misc/misc.cxx misc/newinstall.cxx \ misc/outputencoder.cxx misc/pixmaps.cxx misc/pixmaps_tango.cxx \ misc/record_loader.cxx misc/re.cxx misc/stacktrace.cxx \ misc/strutil.cxx misc/threads.cxx misc/timeops.cxx \ misc/utf8file_io.cxx misc/util.cxx mt63/dsp.cxx \ mt63/mt63base.cxx mt63/mt63.cxx navtex/navtex.cxx \ network/ca_cert.cxx network/metar.cxx network/network.cxx \ network/socket.cxx network/weather.cxx olivia/olivia.cxx \ psk/pskcoeff.cxx psk/psk.cxx psk/pskeval.cxx \ psk/pskvaricode.cxx psk/viewpsk.cxx psm/psm.cxx psm/psm.h \ qrunner/fqueue.h qrunner/qrunner.cxx \ rigcontrol/FreqControl.cxx rigcontrol/norig.cxx \ rigcontrol/ptt.cxx rigcontrol/rigio.cxx \ rigcontrol/rigsupport.cxx rigcontrol/rigxml.cxx \ rigcontrol/serial.cxx rigcontrol/xmlrpc_rig.cxx rsid/rsid.cxx \ soundcard/audio_alert.cxx soundcard/bark.cxx \ soundcard/checkout.cxx soundcard/diesel.cxx \ soundcard/dinnerbell.cxx soundcard/doesnot.cxx \ soundcard/play.pa.cxx soundcard/soundconf.cxx \ soundcard/sound.cxx soundcard/steam_train.cxx \ soundcard/ttybell.cxx spot/notify.cxx spot/pskrep.cxx \ spot/spot.cxx ssb/ssb.cxx status/squelch_status.cxx \ status/status.cxx synop-src/synop.cxx thor/thor.cxx \ thor/thorvaricode.cxx throb/throb.cxx trx/modem.cxx \ trx/nullmodem.cxx trx/test_signal.cxx trx/trx.cxx \ waterfall/colorbox.cxx waterfall/digiscope.cxx \ waterfall/raster.cxx waterfall/waterfall.cxx wefax/wefax.cxx \ wefax/wefax_map.cxx wefax/wefax-pic.cxx widgets/flinput2.cxx \ widgets/flmisc.cxx widgets/flslider2.cxx \ widgets/Fl_Text_Buffer_mod.cxx widgets/Fl_Text_Display_mod.cxx \ widgets/Fl_Text_Editor_mod.cxx widgets/FTextRXTX.cxx \ widgets/FTextView.cxx widgets/Panel.cxx widgets/picture.cxx \ widgets/plot_xy.cxx widgets/progress.cxx \ widgets/psk_browser.cxx widgets/pwrmeter.cxx \ widgets/smeter.cxx widgets/vumeter.cxx wwv/analysis.cxx \ wwv/wwv.cxx flarq_SOURCES = $(am__append_6) $(am__append_24) $(am__append_26) \ $(am__append_28) $(am__append_30) $(am__append_32) \ dialogs/font_browser.cxx flarq-src/arq.cxx \ flarq-src/arqdialogs.cxx flarq-src/arqhelp.cxx \ flarq-src/b64.cxx flarq-src/flarq.cxx flarq-src/flarqenv.cxx \ flarq-src/xml_server.cxx flarq-src/include/arq.h \ flarq-src/include/arqdialogs.h flarq-src/include/b64.h \ flarq-src/include/flarq.h flarq-src/include/flarqenv.h \ flarq-src/include/xml_server.h include/F_Edit.h \ include/fileselect.h include/flinput2.h include/flmisc.h \ include/flslider2.h include/font_browser.h include/icons.h \ include/pixmaps.h include/re.h include/socket.h \ include/stacktrace.h include/threads.h include/table.h \ include/util.h combo/combo.cxx fileselector/fileselect.cxx \ logbook/table.cxx misc/ascii.cxx misc/stacktrace.cxx \ misc/threads.cxx misc/timeops.cxx network/socket.cxx \ widgets/flinput2.cxx widgets/flmisc.cxx widgets/flslider2.cxx \ misc/icons.cxx misc/pixmaps.cxx misc/pixmaps_tango.cxx \ misc/re.cxx misc/util.cxx widgets/Fl_Text_Buffer_mod.cxx \ widgets/Fl_Text_Display_mod.cxx widgets/Fl_Text_Editor_mod.cxx \ widgets/FTextView.cxx widgets/F_Edit.cxx # Sources that are generated, BUILT_SOURCES = # not distributed, nodist_fldigi_SOURCES = $(BUILT_SOURCES) # and deleted by the clean targets CLEANFILES = $(BUILT_SOURCES) $(am__append_34) CLEAN_LOCAL = $(am__append_33) $(am__append_35) FLDIGI_FL_SRC = \ debug/debug_dialog.fl \ dialogs/confdialog.fl \ dialogs/notifydialog.fl \ dialogs/record_browse.fl \ dialogs/rxmon.fl \ dialogs/testsigs.fl \ logbook/lgbook.fl \ logbook/fd_view.fl \ dxcluster/dx_dialog.fl FLARQ_FL_SRC = flarq-src/arqdialogs.fl @WANT_FLDIGI_TRUE@WANT_FLDIGI = yes @WANT_FLARQ_TRUE@@WANT_FLDIGI_FALSE@INSTALLER_FILE = flarq-$(FLARQ_VERSION)_setup.exe @WANT_FLDIGI_TRUE@INSTALLER_FILE = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)_setup.exe @WANT_FLARQ_TRUE@@WANT_FLDIGI_FALSE@APPBUNDLE = flarq-$(FLARQ_VERSION) @WANT_FLDIGI_TRUE@APPBUNDLE = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION) @WANT_FLARQ_TRUE@@WANT_FLDIGI_FALSE@APPBUNDLE_NOLIBS = $(APPBUNDLE)-nolibs @WANT_FLDIGI_TRUE@APPBUNDLE_NOLIBS = $(APPBUNDLE)-nolibs @WANT_FLARQ_TRUE@WANT_FLARQ = yes tmp_srcdir_var = $(srcdir) TESTS = $(tmp_srcdir_var)/../scripts/tests/config-h.sh $(tmp_srcdir_var)/../scripts/tests/cr.sh # Additional files that we distribute EXTRA_DIST = \ $(srcdir)/../build-aux/config.rpath \ $(srcdir)/../scripts/mkappbundle.sh \ $(srcdir)/../scripts/mkhamlibstatic.sh \ $(srcdir)/../scripts/mknsisinst.sh \ $(srcdir)/../scripts/buildmxe.sh \ $(srcdir)/../scripts/builddist.sh \ $(srcdir)/../scripts/tests/cr.sh \ $(srcdir)/../scripts/tests/config-h.sh \ $(srcdir)/../data/fldigi-psk.png \ $(srcdir)/../data/fldigi-rtty.png \ $(srcdir)/../data/fldigi.xpm \ $(srcdir)/../data/fldigi.desktop \ $(srcdir)/../data/NAVTEX_Stations.csv \ $(srcdir)/../data/nsd_bbsss.txt \ $(srcdir)/../data/station_table.txt \ $(srcdir)/../data/ToR-Stats-SHIP.csv \ $(srcdir)/../data/mac/Info.plist.in \ $(srcdir)/../data/mac/fldigi.icns \ $(srcdir)/../data/win32/fldigi.ico \ $(srcdir)/../data/win32/fldigi.nsi \ $(srcdir)/../data/flarq.desktop \ $(srcdir)/../data/flarq.xpm \ $(srcdir)/../data/mac/flarq.icns \ $(srcdir)/../data/win32/flarq.ico \ $(srcdir)/mbedtls/libmbedtls.pc \ $(srcdir)/mbedtls/LICENSE \ $(srcdir)/mbedtls/gpl-2.0.txt \ $(srcdir)/synop-src/synop_tool.cxx \ $(srcdir)/synop-src/README \ $(srcdir)/synop-src/Makefile \ $(FLDIGI_FL_SRC) \ $(FLARQ_FL_SRC) all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .cpp .cxx .log .o .obj .rc .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) installcheck-binPROGRAMS: $(bin_PROGRAMS) bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ esac; \ f=`echo "$$p" | \ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ for opt in --help --version; do \ if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \ 2>c$${pid}_.err &2; bad=1; fi; \ done; \ done; rm -f c$${pid}_.???; exit $$bad xmlrpcpp/$(am__dirstamp): @$(MKDIR_P) xmlrpcpp @: > xmlrpcpp/$(am__dirstamp) xmlrpcpp/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) xmlrpcpp/$(DEPDIR) @: > xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcClient.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcDispatch.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcMutex.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcServerConnection.$(OBJEXT): \ xmlrpcpp/$(am__dirstamp) xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcServer.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcServerMethod.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcSocket.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcSource.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcUtil.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/flarq-XmlRpcValue.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) compat/$(am__dirstamp): @$(MKDIR_P) compat @: > compat/$(am__dirstamp) compat/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) compat/$(DEPDIR) @: > compat/$(DEPDIR)/$(am__dirstamp) compat/flarq-regex.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) misc/$(am__dirstamp): @$(MKDIR_P) misc @: > misc/$(am__dirstamp) misc/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) misc/$(DEPDIR) @: > misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-stack.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) compat/flarq-getsysinfo.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) compat/flarq-mingw.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) misc/flarq-nls.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) flarq-src/$(am__dirstamp): @$(MKDIR_P) flarq-src @: > flarq-src/$(am__dirstamp) flarq-src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) flarq-src/$(DEPDIR) @: > flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarqrc.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) dialogs/$(am__dirstamp): @$(MKDIR_P) dialogs @: > dialogs/$(am__dirstamp) dialogs/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) dialogs/$(DEPDIR) @: > dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/flarq-font_browser.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-arq.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-arqdialogs.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-arqhelp.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-b64.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-flarq.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-flarqenv.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) flarq-src/flarq-xml_server.$(OBJEXT): flarq-src/$(am__dirstamp) \ flarq-src/$(DEPDIR)/$(am__dirstamp) combo/$(am__dirstamp): @$(MKDIR_P) combo @: > combo/$(am__dirstamp) combo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) combo/$(DEPDIR) @: > combo/$(DEPDIR)/$(am__dirstamp) combo/flarq-combo.$(OBJEXT): combo/$(am__dirstamp) \ combo/$(DEPDIR)/$(am__dirstamp) fileselector/$(am__dirstamp): @$(MKDIR_P) fileselector @: > fileselector/$(am__dirstamp) fileselector/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fileselector/$(DEPDIR) @: > fileselector/$(DEPDIR)/$(am__dirstamp) fileselector/flarq-fileselect.$(OBJEXT): fileselector/$(am__dirstamp) \ fileselector/$(DEPDIR)/$(am__dirstamp) logbook/$(am__dirstamp): @$(MKDIR_P) logbook @: > logbook/$(am__dirstamp) logbook/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) logbook/$(DEPDIR) @: > logbook/$(DEPDIR)/$(am__dirstamp) logbook/flarq-table.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) misc/flarq-ascii.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-stacktrace.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-threads.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-timeops.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) network/$(am__dirstamp): @$(MKDIR_P) network @: > network/$(am__dirstamp) network/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) network/$(DEPDIR) @: > network/$(DEPDIR)/$(am__dirstamp) network/flarq-socket.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) widgets/$(am__dirstamp): @$(MKDIR_P) widgets @: > widgets/$(am__dirstamp) widgets/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) widgets/$(DEPDIR) @: > widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-flinput2.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-flmisc.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-flslider2.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) misc/flarq-icons.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-pixmaps.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-pixmaps_tango.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-re.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/flarq-util.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) widgets/flarq-Fl_Text_Buffer_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-Fl_Text_Display_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-Fl_Text_Editor_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-FTextView.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/flarq-F_Edit.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) flarq$(EXEEXT): $(flarq_OBJECTS) $(flarq_DEPENDENCIES) $(EXTRA_flarq_DEPENDENCIES) @rm -f flarq$(EXEEXT) $(AM_V_CXXLD)$(flarq_LINK) $(flarq_OBJECTS) $(flarq_LDADD) $(LIBS) network/fldigi-xmlrpc.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcClient.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcDispatch.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcMutex.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcServerConnection.$(OBJEXT): \ xmlrpcpp/$(am__dirstamp) xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcServer.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcServerMethod.$(OBJEXT): \ xmlrpcpp/$(am__dirstamp) xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcSocket.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcSource.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcUtil.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) xmlrpcpp/fldigi-XmlRpcValue.$(OBJEXT): xmlrpcpp/$(am__dirstamp) \ xmlrpcpp/$(DEPDIR)/$(am__dirstamp) mbedtls/$(am__dirstamp): @$(MKDIR_P) mbedtls @: > mbedtls/$(am__dirstamp) mbedtls/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) mbedtls/$(DEPDIR) @: > mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-aes.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-aesni.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-arc4.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-aria.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-asn1parse.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-asn1write.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-base64.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-bignum.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-blowfish.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-camellia.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ccm.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-certs.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-chacha20.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-chachapoly.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-cipher.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-cipher_wrap.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-cmac.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ctr_drbg.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-debug.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-des.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-dhm.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecdh.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecdsa.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecjpake.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecp.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ecp_curves.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-entropy.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-entropy_poll.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-error.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-gcm.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-havege.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-hkdf.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-hmac_drbg.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md2.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md4.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md5.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-md_wrap.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-memory_buffer_alloc.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-net_sockets.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-nist_kw.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-oid.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-padlock.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pem.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pk.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkcs11.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkcs12.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkcs5.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkparse.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pk_wrap.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-pkwrite.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-platform.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-platform_util.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-poly1305.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ripemd160.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-rsa.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-rsa_internal.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-sha1.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-sha256.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-sha512.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_cache.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_ciphersuites.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_cli.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_cookie.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_srv.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_ticket.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-ssl_tls.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-threading.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-timing.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-version.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-version_features.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509_create.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509_crl.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509_crt.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509_csr.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509write_crt.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-x509write_csr.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) mbedtls/fldigi-xtea.$(OBJEXT): mbedtls/$(am__dirstamp) \ mbedtls/$(DEPDIR)/$(am__dirstamp) rigcontrol/$(am__dirstamp): @$(MKDIR_P) rigcontrol @: > rigcontrol/$(am__dirstamp) rigcontrol/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) rigcontrol/$(DEPDIR) @: > rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-hamlib.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-rigclass.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) misc/fldigi-benchmark.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) compat/fldigi-regex.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) misc/fldigi-stack.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) compat/fldigi-getsysinfo.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) compat/fldigi-mingw.$(OBJEXT): compat/$(am__dirstamp) \ compat/$(DEPDIR)/$(am__dirstamp) misc/fldigi-nls.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) cmedia/$(am__dirstamp): @$(MKDIR_P) cmedia @: > cmedia/$(am__dirstamp) cmedia/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) cmedia/$(DEPDIR) @: > cmedia/$(DEPDIR)/$(am__dirstamp) cmedia/fldigi-cmedia.$(OBJEXT): cmedia/$(am__dirstamp) \ cmedia/$(DEPDIR)/$(am__dirstamp) cmedia/fldigi-hid.$(OBJEXT): cmedia/$(am__dirstamp) \ cmedia/$(DEPDIR)/$(am__dirstamp) combo/fldigi-combo.$(OBJEXT): combo/$(am__dirstamp) \ combo/$(DEPDIR)/$(am__dirstamp) config_script/$(am__dirstamp): @$(MKDIR_P) config_script @: > config_script/$(am__dirstamp) config_script/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) config_script/$(DEPDIR) @: > config_script/$(DEPDIR)/$(am__dirstamp) config_script/fldigi-create_default_script.$(OBJEXT): \ config_script/$(am__dirstamp) \ config_script/$(DEPDIR)/$(am__dirstamp) config_script/fldigi-run_scripts.$(OBJEXT): \ config_script/$(am__dirstamp) \ config_script/$(DEPDIR)/$(am__dirstamp) config_script/fldigi-script_parsing.$(OBJEXT): \ config_script/$(am__dirstamp) \ config_script/$(DEPDIR)/$(am__dirstamp) contestia/$(am__dirstamp): @$(MKDIR_P) contestia @: > contestia/$(am__dirstamp) contestia/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) contestia/$(DEPDIR) @: > contestia/$(DEPDIR)/$(am__dirstamp) contestia/fldigi-contestia.$(OBJEXT): contestia/$(am__dirstamp) \ contestia/$(DEPDIR)/$(am__dirstamp) cw/$(am__dirstamp): @$(MKDIR_P) cw @: > cw/$(am__dirstamp) cw/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) cw/$(DEPDIR) @: > cw/$(DEPDIR)/$(am__dirstamp) cw/fldigi-cw.$(OBJEXT): cw/$(am__dirstamp) \ cw/$(DEPDIR)/$(am__dirstamp) cw/fldigi-ICOMkeying.$(OBJEXT): cw/$(am__dirstamp) \ cw/$(DEPDIR)/$(am__dirstamp) cw/fldigi-KYkeying.$(OBJEXT): cw/$(am__dirstamp) \ cw/$(DEPDIR)/$(am__dirstamp) cw/fldigi-morse.$(OBJEXT): cw/$(am__dirstamp) \ cw/$(DEPDIR)/$(am__dirstamp) cw/fldigi-nanoIO.$(OBJEXT): cw/$(am__dirstamp) \ cw/$(DEPDIR)/$(am__dirstamp) cw/fldigi-Nav.$(OBJEXT): cw/$(am__dirstamp) \ cw/$(DEPDIR)/$(am__dirstamp) cw/fldigi-view_cw.$(OBJEXT): cw/$(am__dirstamp) \ cw/$(DEPDIR)/$(am__dirstamp) cw/fldigi-winkeyer.$(OBJEXT): cw/$(am__dirstamp) \ cw/$(DEPDIR)/$(am__dirstamp) cw/fldigi-YAESUkeying.$(OBJEXT): cw/$(am__dirstamp) \ cw/$(DEPDIR)/$(am__dirstamp) rtty/$(am__dirstamp): @$(MKDIR_P) rtty @: > rtty/$(am__dirstamp) rtty/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) rtty/$(DEPDIR) @: > rtty/$(DEPDIR)/$(am__dirstamp) rtty/fldigi-fsk.$(OBJEXT): rtty/$(am__dirstamp) \ rtty/$(DEPDIR)/$(am__dirstamp) rtty/fldigi-rtty.$(OBJEXT): rtty/$(am__dirstamp) \ rtty/$(DEPDIR)/$(am__dirstamp) rtty/fldigi-view_rtty.$(OBJEXT): rtty/$(am__dirstamp) \ rtty/$(DEPDIR)/$(am__dirstamp) debug/$(am__dirstamp): @$(MKDIR_P) debug @: > debug/$(am__dirstamp) debug/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) debug/$(DEPDIR) @: > debug/$(DEPDIR)/$(am__dirstamp) debug/fldigi-debug.$(OBJEXT): debug/$(am__dirstamp) \ debug/$(DEPDIR)/$(am__dirstamp) debug/fldigi-debug_dialog.$(OBJEXT): debug/$(am__dirstamp) \ debug/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-confdialog.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-fl_digi.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-font_browser.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-htmlstrings.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-notifydialog.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-record_browse.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-rxmon.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-testsigs.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-tod_clock.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-Viewer.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dominoex/$(am__dirstamp): @$(MKDIR_P) dominoex @: > dominoex/$(am__dirstamp) dominoex/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) dominoex/$(DEPDIR) @: > dominoex/$(DEPDIR)/$(am__dirstamp) dominoex/fldigi-dominoex.$(OBJEXT): dominoex/$(am__dirstamp) \ dominoex/$(DEPDIR)/$(am__dirstamp) dominoex/fldigi-dominovar.$(OBJEXT): dominoex/$(am__dirstamp) \ dominoex/$(DEPDIR)/$(am__dirstamp) dtmf/$(am__dirstamp): @$(MKDIR_P) dtmf @: > dtmf/$(am__dirstamp) dtmf/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) dtmf/$(DEPDIR) @: > dtmf/$(DEPDIR)/$(am__dirstamp) dtmf/fldigi-dtmf.$(OBJEXT): dtmf/$(am__dirstamp) \ dtmf/$(DEPDIR)/$(am__dirstamp) dxcluster/$(am__dirstamp): @$(MKDIR_P) dxcluster @: > dxcluster/$(am__dirstamp) dxcluster/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) dxcluster/$(DEPDIR) @: > dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-dxcluster.$(OBJEXT): dxcluster/$(am__dirstamp) \ dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-dx_dialog.$(OBJEXT): dxcluster/$(am__dirstamp) \ dxcluster/$(DEPDIR)/$(am__dirstamp) feld/$(am__dirstamp): @$(MKDIR_P) feld @: > feld/$(am__dirstamp) feld/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) feld/$(DEPDIR) @: > feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-feld.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-feldfonts.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) fft-monitor/$(am__dirstamp): @$(MKDIR_P) fft-monitor @: > fft-monitor/$(am__dirstamp) fft-monitor/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fft-monitor/$(DEPDIR) @: > fft-monitor/$(DEPDIR)/$(am__dirstamp) fft-monitor/fldigi-fft-monitor.$(OBJEXT): fft-monitor/$(am__dirstamp) \ fft-monitor/$(DEPDIR)/$(am__dirstamp) fft-monitor/fldigi-spectrum.$(OBJEXT): fft-monitor/$(am__dirstamp) \ fft-monitor/$(DEPDIR)/$(am__dirstamp) fft-monitor/fldigi-spectrum_viewer.$(OBJEXT): \ fft-monitor/$(am__dirstamp) \ fft-monitor/$(DEPDIR)/$(am__dirstamp) fileselector/fldigi-fileselect.$(OBJEXT): \ fileselector/$(am__dirstamp) \ fileselector/$(DEPDIR)/$(am__dirstamp) filters/$(am__dirstamp): @$(MKDIR_P) filters @: > filters/$(am__dirstamp) filters/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) filters/$(DEPDIR) @: > filters/$(DEPDIR)/$(am__dirstamp) filters/fldigi-fftfilt.$(OBJEXT): filters/$(am__dirstamp) \ filters/$(DEPDIR)/$(am__dirstamp) filters/fldigi-filters.$(OBJEXT): filters/$(am__dirstamp) \ filters/$(DEPDIR)/$(am__dirstamp) filters/fldigi-viterbi.$(OBJEXT): filters/$(am__dirstamp) \ filters/$(DEPDIR)/$(am__dirstamp) fmt/$(am__dirstamp): @$(MKDIR_P) fmt @: > fmt/$(am__dirstamp) fmt/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fmt/$(DEPDIR) @: > fmt/$(DEPDIR)/$(am__dirstamp) fmt/fldigi-fmt.$(OBJEXT): fmt/$(am__dirstamp) \ fmt/$(DEPDIR)/$(am__dirstamp) fmt/fldigi-fmt_dialog.$(OBJEXT): fmt/$(am__dirstamp) \ fmt/$(DEPDIR)/$(am__dirstamp) fsq/$(am__dirstamp): @$(MKDIR_P) fsq @: > fsq/$(am__dirstamp) fsq/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fsq/$(DEPDIR) @: > fsq/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-fsq.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-fsq_monitor.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) globals/$(am__dirstamp): @$(MKDIR_P) globals @: > globals/$(am__dirstamp) globals/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) globals/$(DEPDIR) @: > globals/$(DEPDIR)/$(am__dirstamp) globals/fldigi-globals.$(OBJEXT): globals/$(am__dirstamp) \ globals/$(DEPDIR)/$(am__dirstamp) ifkp/$(am__dirstamp): @$(MKDIR_P) ifkp @: > ifkp/$(am__dirstamp) ifkp/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ifkp/$(DEPDIR) @: > ifkp/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-ifkp.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-tux.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) irrxml/$(am__dirstamp): @$(MKDIR_P) irrxml @: > irrxml/$(am__dirstamp) irrxml/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) irrxml/$(DEPDIR) @: > irrxml/$(DEPDIR)/$(am__dirstamp) irrxml/fldigi-irrXML.$(OBJEXT): irrxml/$(am__dirstamp) \ irrxml/$(DEPDIR)/$(am__dirstamp) kml/$(am__dirstamp): @$(MKDIR_P) kml @: > kml/$(am__dirstamp) kml/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) kml/$(DEPDIR) @: > kml/$(DEPDIR)/$(am__dirstamp) kml/fldigi-kmlserver.$(OBJEXT): kml/$(am__dirstamp) \ kml/$(DEPDIR)/$(am__dirstamp) libtiniconv/$(am__dirstamp): @$(MKDIR_P) libtiniconv @: > libtiniconv/$(am__dirstamp) libtiniconv/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libtiniconv/$(DEPDIR) @: > libtiniconv/$(DEPDIR)/$(am__dirstamp) libtiniconv/fldigi-tiniconv.$(OBJEXT): libtiniconv/$(am__dirstamp) \ libtiniconv/$(DEPDIR)/$(am__dirstamp) libtiniconv/fldigi-tiniconv_desc.$(OBJEXT): \ libtiniconv/$(am__dirstamp) \ libtiniconv/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-adif_io.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-calendar.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-contest.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-counties.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-county_lists.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-cty-dat.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-date.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-fd_logger.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-fd_view.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-lgbook.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-logbook.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-logsupport.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-lookupcall.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-maclogger.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-n3fjp_logger.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-qrzlib.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-qso_db.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-table.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-textio.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logbook/fldigi-xmlrpc_log.$(OBJEXT): logbook/$(am__dirstamp) \ logbook/$(DEPDIR)/$(am__dirstamp) logger/$(am__dirstamp): @$(MKDIR_P) logger @: > logger/$(am__dirstamp) logger/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) logger/$(DEPDIR) @: > logger/$(DEPDIR)/$(am__dirstamp) logger/fldigi-logger.$(OBJEXT): logger/$(am__dirstamp) \ logger/$(DEPDIR)/$(am__dirstamp) logger/fldigi-rx_extract.$(OBJEXT): logger/$(am__dirstamp) \ logger/$(DEPDIR)/$(am__dirstamp) logger/fldigi-speak.$(OBJEXT): logger/$(am__dirstamp) \ logger/$(DEPDIR)/$(am__dirstamp) mfsk/$(am__dirstamp): @$(MKDIR_P) mfsk @: > mfsk/$(am__dirstamp) mfsk/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) mfsk/$(DEPDIR) @: > mfsk/$(DEPDIR)/$(am__dirstamp) mfsk/fldigi-interleave.$(OBJEXT): mfsk/$(am__dirstamp) \ mfsk/$(DEPDIR)/$(am__dirstamp) mfsk/fldigi-mfsk.$(OBJEXT): mfsk/$(am__dirstamp) \ mfsk/$(DEPDIR)/$(am__dirstamp) mfsk/fldigi-mfskvaricode.$(OBJEXT): mfsk/$(am__dirstamp) \ mfsk/$(DEPDIR)/$(am__dirstamp) misc/fldigi-arq_io.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-ascii.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-ax25_decode.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-charsetdistiller.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-charsetlist.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-configuration.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-coordinate.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-dxcc.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-estrings.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-icons.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-kiss_io.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-locator.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-log.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-macroedit.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-macros.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-misc.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-newinstall.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-outputencoder.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-pixmaps.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-pixmaps_tango.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-record_loader.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-re.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-stacktrace.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-strutil.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-threads.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-timeops.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-utf8file_io.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) misc/fldigi-util.$(OBJEXT): misc/$(am__dirstamp) \ misc/$(DEPDIR)/$(am__dirstamp) mt63/$(am__dirstamp): @$(MKDIR_P) mt63 @: > mt63/$(am__dirstamp) mt63/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) mt63/$(DEPDIR) @: > mt63/$(DEPDIR)/$(am__dirstamp) mt63/fldigi-dsp.$(OBJEXT): mt63/$(am__dirstamp) \ mt63/$(DEPDIR)/$(am__dirstamp) mt63/fldigi-mt63base.$(OBJEXT): mt63/$(am__dirstamp) \ mt63/$(DEPDIR)/$(am__dirstamp) mt63/fldigi-mt63.$(OBJEXT): mt63/$(am__dirstamp) \ mt63/$(DEPDIR)/$(am__dirstamp) navtex/$(am__dirstamp): @$(MKDIR_P) navtex @: > navtex/$(am__dirstamp) navtex/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) navtex/$(DEPDIR) @: > navtex/$(DEPDIR)/$(am__dirstamp) navtex/fldigi-navtex.$(OBJEXT): navtex/$(am__dirstamp) \ navtex/$(DEPDIR)/$(am__dirstamp) network/fldigi-ca_cert.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) network/fldigi-metar.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) network/fldigi-network.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) network/fldigi-socket.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) network/fldigi-weather.$(OBJEXT): network/$(am__dirstamp) \ network/$(DEPDIR)/$(am__dirstamp) olivia/$(am__dirstamp): @$(MKDIR_P) olivia @: > olivia/$(am__dirstamp) olivia/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) olivia/$(DEPDIR) @: > olivia/$(DEPDIR)/$(am__dirstamp) olivia/fldigi-olivia.$(OBJEXT): olivia/$(am__dirstamp) \ olivia/$(DEPDIR)/$(am__dirstamp) psk/$(am__dirstamp): @$(MKDIR_P) psk @: > psk/$(am__dirstamp) psk/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) psk/$(DEPDIR) @: > psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-pskcoeff.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-psk.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-pskeval.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-pskvaricode.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psk/fldigi-viewpsk.$(OBJEXT): psk/$(am__dirstamp) \ psk/$(DEPDIR)/$(am__dirstamp) psm/$(am__dirstamp): @$(MKDIR_P) psm @: > psm/$(am__dirstamp) psm/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) psm/$(DEPDIR) @: > psm/$(DEPDIR)/$(am__dirstamp) psm/fldigi-psm.$(OBJEXT): psm/$(am__dirstamp) \ psm/$(DEPDIR)/$(am__dirstamp) qrunner/$(am__dirstamp): @$(MKDIR_P) qrunner @: > qrunner/$(am__dirstamp) qrunner/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) qrunner/$(DEPDIR) @: > qrunner/$(DEPDIR)/$(am__dirstamp) qrunner/fldigi-qrunner.$(OBJEXT): qrunner/$(am__dirstamp) \ qrunner/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-FreqControl.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-norig.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-ptt.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-rigio.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-rigsupport.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-rigxml.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-serial.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rigcontrol/fldigi-xmlrpc_rig.$(OBJEXT): rigcontrol/$(am__dirstamp) \ rigcontrol/$(DEPDIR)/$(am__dirstamp) rsid/$(am__dirstamp): @$(MKDIR_P) rsid @: > rsid/$(am__dirstamp) rsid/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) rsid/$(DEPDIR) @: > rsid/$(DEPDIR)/$(am__dirstamp) rsid/fldigi-rsid.$(OBJEXT): rsid/$(am__dirstamp) \ rsid/$(DEPDIR)/$(am__dirstamp) soundcard/$(am__dirstamp): @$(MKDIR_P) soundcard @: > soundcard/$(am__dirstamp) soundcard/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) soundcard/$(DEPDIR) @: > soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-audio_alert.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-bark.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-checkout.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-diesel.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-dinnerbell.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-doesnot.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-play.pa.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-soundconf.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-sound.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-steam_train.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) soundcard/fldigi-ttybell.$(OBJEXT): soundcard/$(am__dirstamp) \ soundcard/$(DEPDIR)/$(am__dirstamp) spot/$(am__dirstamp): @$(MKDIR_P) spot @: > spot/$(am__dirstamp) spot/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) spot/$(DEPDIR) @: > spot/$(DEPDIR)/$(am__dirstamp) spot/fldigi-notify.$(OBJEXT): spot/$(am__dirstamp) \ spot/$(DEPDIR)/$(am__dirstamp) spot/fldigi-pskrep.$(OBJEXT): spot/$(am__dirstamp) \ spot/$(DEPDIR)/$(am__dirstamp) spot/fldigi-spot.$(OBJEXT): spot/$(am__dirstamp) \ spot/$(DEPDIR)/$(am__dirstamp) ssb/$(am__dirstamp): @$(MKDIR_P) ssb @: > ssb/$(am__dirstamp) ssb/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ssb/$(DEPDIR) @: > ssb/$(DEPDIR)/$(am__dirstamp) ssb/fldigi-ssb.$(OBJEXT): ssb/$(am__dirstamp) \ ssb/$(DEPDIR)/$(am__dirstamp) status/$(am__dirstamp): @$(MKDIR_P) status @: > status/$(am__dirstamp) status/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) status/$(DEPDIR) @: > status/$(DEPDIR)/$(am__dirstamp) status/fldigi-squelch_status.$(OBJEXT): status/$(am__dirstamp) \ status/$(DEPDIR)/$(am__dirstamp) status/fldigi-status.$(OBJEXT): status/$(am__dirstamp) \ status/$(DEPDIR)/$(am__dirstamp) synop-src/$(am__dirstamp): @$(MKDIR_P) synop-src @: > synop-src/$(am__dirstamp) synop-src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) synop-src/$(DEPDIR) @: > synop-src/$(DEPDIR)/$(am__dirstamp) synop-src/fldigi-synop.$(OBJEXT): synop-src/$(am__dirstamp) \ synop-src/$(DEPDIR)/$(am__dirstamp) thor/$(am__dirstamp): @$(MKDIR_P) thor @: > thor/$(am__dirstamp) thor/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) thor/$(DEPDIR) @: > thor/$(DEPDIR)/$(am__dirstamp) thor/fldigi-thor.$(OBJEXT): thor/$(am__dirstamp) \ thor/$(DEPDIR)/$(am__dirstamp) thor/fldigi-thorvaricode.$(OBJEXT): thor/$(am__dirstamp) \ thor/$(DEPDIR)/$(am__dirstamp) throb/$(am__dirstamp): @$(MKDIR_P) throb @: > throb/$(am__dirstamp) throb/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) throb/$(DEPDIR) @: > throb/$(DEPDIR)/$(am__dirstamp) throb/fldigi-throb.$(OBJEXT): throb/$(am__dirstamp) \ throb/$(DEPDIR)/$(am__dirstamp) trx/$(am__dirstamp): @$(MKDIR_P) trx @: > trx/$(am__dirstamp) trx/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) trx/$(DEPDIR) @: > trx/$(DEPDIR)/$(am__dirstamp) trx/fldigi-modem.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) trx/fldigi-nullmodem.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) trx/fldigi-test_signal.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) trx/fldigi-trx.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) waterfall/$(am__dirstamp): @$(MKDIR_P) waterfall @: > waterfall/$(am__dirstamp) waterfall/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) waterfall/$(DEPDIR) @: > waterfall/$(DEPDIR)/$(am__dirstamp) waterfall/fldigi-colorbox.$(OBJEXT): waterfall/$(am__dirstamp) \ waterfall/$(DEPDIR)/$(am__dirstamp) waterfall/fldigi-digiscope.$(OBJEXT): waterfall/$(am__dirstamp) \ waterfall/$(DEPDIR)/$(am__dirstamp) waterfall/fldigi-raster.$(OBJEXT): waterfall/$(am__dirstamp) \ waterfall/$(DEPDIR)/$(am__dirstamp) waterfall/fldigi-waterfall.$(OBJEXT): waterfall/$(am__dirstamp) \ waterfall/$(DEPDIR)/$(am__dirstamp) wefax/$(am__dirstamp): @$(MKDIR_P) wefax @: > wefax/$(am__dirstamp) wefax/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) wefax/$(DEPDIR) @: > wefax/$(DEPDIR)/$(am__dirstamp) wefax/fldigi-wefax.$(OBJEXT): wefax/$(am__dirstamp) \ wefax/$(DEPDIR)/$(am__dirstamp) wefax/fldigi-wefax_map.$(OBJEXT): wefax/$(am__dirstamp) \ wefax/$(DEPDIR)/$(am__dirstamp) wefax/fldigi-wefax-pic.$(OBJEXT): wefax/$(am__dirstamp) \ wefax/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-flinput2.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-flmisc.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-flslider2.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-Fl_Text_Buffer_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-Fl_Text_Display_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-Fl_Text_Editor_mod.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-FTextRXTX.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-FTextView.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-Panel.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-picture.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-plot_xy.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-progress.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-psk_browser.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-pwrmeter.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-smeter.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) widgets/fldigi-vumeter.$(OBJEXT): widgets/$(am__dirstamp) \ widgets/$(DEPDIR)/$(am__dirstamp) wwv/$(am__dirstamp): @$(MKDIR_P) wwv @: > wwv/$(am__dirstamp) wwv/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) wwv/$(DEPDIR) @: > wwv/$(DEPDIR)/$(am__dirstamp) wwv/fldigi-analysis.$(OBJEXT): wwv/$(am__dirstamp) \ wwv/$(DEPDIR)/$(am__dirstamp) wwv/fldigi-wwv.$(OBJEXT): wwv/$(am__dirstamp) \ wwv/$(DEPDIR)/$(am__dirstamp) blank/$(am__dirstamp): @$(MKDIR_P) blank @: > blank/$(am__dirstamp) blank/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) blank/$(DEPDIR) @: > blank/$(DEPDIR)/$(am__dirstamp) blank/fldigi-blank.$(OBJEXT): blank/$(am__dirstamp) \ blank/$(DEPDIR)/$(am__dirstamp) cmedia/fldigi-hid_lin.$(OBJEXT): cmedia/$(am__dirstamp) \ cmedia/$(DEPDIR)/$(am__dirstamp) cmedia/fldigi-hid_mac.$(OBJEXT): cmedia/$(am__dirstamp) \ cmedia/$(DEPDIR)/$(am__dirstamp) cmedia/fldigi-hid_win.$(OBJEXT): cmedia/$(am__dirstamp) \ cmedia/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-fl_digi_main.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-arc-help.$(OBJEXT): dxcluster/$(am__dirstamp) \ dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-CCC_Commands.$(OBJEXT): dxcluster/$(am__dirstamp) \ dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-DXClusterServers.$(OBJEXT): \ dxcluster/$(am__dirstamp) dxcluster/$(DEPDIR)/$(am__dirstamp) dxcluster/fldigi-DXSpiderCommandReference.$(OBJEXT): \ dxcluster/$(am__dirstamp) dxcluster/$(DEPDIR)/$(am__dirstamp) fileselector/fldigi-flnfc_common.$(OBJEXT): \ fileselector/$(am__dirstamp) \ fileselector/$(DEPDIR)/$(am__dirstamp) feld/fldigi-Feld7x7-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-Feld7x7n-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldDx-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldFat-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldHell-12.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldLittle-12.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldLo8-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldLow-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldModern-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldModern8-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldNarr-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldReal-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldStyl-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldVert-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) feld/fldigi-FeldWide-14.$(OBJEXT): feld/$(am__dirstamp) \ feld/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-fsq_varicode.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-fsq-pic.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) fsq/fldigi-bitmaps.$(OBJEXT): fsq/$(am__dirstamp) \ fsq/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-ifkp_bitmaps.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-ifkp_varicode.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) ifkp/fldigi-ifkp-pic.$(OBJEXT): ifkp/$(am__dirstamp) \ ifkp/$(DEPDIR)/$(am__dirstamp) mfsk/fldigi-mfsk-pic.$(OBJEXT): mfsk/$(am__dirstamp) \ mfsk/$(DEPDIR)/$(am__dirstamp) rsid/fldigi-rsid_defs.$(OBJEXT): rsid/$(am__dirstamp) \ rsid/$(DEPDIR)/$(am__dirstamp) thor/fldigi-thor-pic.$(OBJEXT): thor/$(am__dirstamp) \ thor/$(DEPDIR)/$(am__dirstamp) trx/fldigi-tune.$(OBJEXT): trx/$(am__dirstamp) \ trx/$(DEPDIR)/$(am__dirstamp) dialogs/fldigi-guide.$(OBJEXT): dialogs/$(am__dirstamp) \ dialogs/$(DEPDIR)/$(am__dirstamp) fldigi$(EXEEXT): $(fldigi_OBJECTS) $(fldigi_DEPENDENCIES) $(EXTRA_fldigi_DEPENDENCIES) @rm -f fldigi$(EXEEXT) $(AM_V_CXXLD)$(fldigi_LINK) $(fldigi_OBJECTS) $(fldigi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f blank/*.$(OBJEXT) -rm -f cmedia/*.$(OBJEXT) -rm -f combo/*.$(OBJEXT) -rm -f compat/*.$(OBJEXT) -rm -f config_script/*.$(OBJEXT) -rm -f contestia/*.$(OBJEXT) -rm -f cw/*.$(OBJEXT) -rm -f debug/*.$(OBJEXT) -rm -f dialogs/*.$(OBJEXT) -rm -f dominoex/*.$(OBJEXT) -rm -f dtmf/*.$(OBJEXT) -rm -f dxcluster/*.$(OBJEXT) -rm -f feld/*.$(OBJEXT) -rm -f fft-monitor/*.$(OBJEXT) -rm -f fileselector/*.$(OBJEXT) -rm -f filters/*.$(OBJEXT) -rm -f flarq-src/*.$(OBJEXT) -rm -f fmt/*.$(OBJEXT) -rm -f fsq/*.$(OBJEXT) -rm -f globals/*.$(OBJEXT) -rm -f ifkp/*.$(OBJEXT) -rm -f irrxml/*.$(OBJEXT) -rm -f kml/*.$(OBJEXT) -rm -f libtiniconv/*.$(OBJEXT) -rm -f logbook/*.$(OBJEXT) -rm -f logger/*.$(OBJEXT) -rm -f mbedtls/*.$(OBJEXT) -rm -f mfsk/*.$(OBJEXT) -rm -f misc/*.$(OBJEXT) -rm -f mt63/*.$(OBJEXT) -rm -f navtex/*.$(OBJEXT) -rm -f network/*.$(OBJEXT) -rm -f olivia/*.$(OBJEXT) -rm -f psk/*.$(OBJEXT) -rm -f psm/*.$(OBJEXT) -rm -f qrunner/*.$(OBJEXT) -rm -f rigcontrol/*.$(OBJEXT) -rm -f rsid/*.$(OBJEXT) -rm -f rtty/*.$(OBJEXT) -rm -f soundcard/*.$(OBJEXT) -rm -f spot/*.$(OBJEXT) -rm -f ssb/*.$(OBJEXT) -rm -f status/*.$(OBJEXT) -rm -f synop-src/*.$(OBJEXT) -rm -f thor/*.$(OBJEXT) -rm -f throb/*.$(OBJEXT) -rm -f trx/*.$(OBJEXT) -rm -f waterfall/*.$(OBJEXT) -rm -f wefax/*.$(OBJEXT) -rm -f widgets/*.$(OBJEXT) -rm -f wwv/*.$(OBJEXT) -rm -f xmlrpcpp/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fldigi-main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@blank/$(DEPDIR)/fldigi-blank.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cmedia/$(DEPDIR)/fldigi-cmedia.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cmedia/$(DEPDIR)/fldigi-hid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cmedia/$(DEPDIR)/fldigi-hid_lin.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cmedia/$(DEPDIR)/fldigi-hid_mac.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cmedia/$(DEPDIR)/fldigi-hid_win.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@combo/$(DEPDIR)/flarq-combo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@combo/$(DEPDIR)/fldigi-combo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/flarq-getsysinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/flarq-mingw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/flarq-regex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/fldigi-getsysinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/fldigi-mingw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/fldigi-regex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@config_script/$(DEPDIR)/fldigi-create_default_script.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@config_script/$(DEPDIR)/fldigi-run_scripts.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@config_script/$(DEPDIR)/fldigi-script_parsing.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@contestia/$(DEPDIR)/fldigi-contestia.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cw/$(DEPDIR)/fldigi-ICOMkeying.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cw/$(DEPDIR)/fldigi-KYkeying.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cw/$(DEPDIR)/fldigi-Nav.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cw/$(DEPDIR)/fldigi-YAESUkeying.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cw/$(DEPDIR)/fldigi-cw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cw/$(DEPDIR)/fldigi-morse.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cw/$(DEPDIR)/fldigi-nanoIO.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cw/$(DEPDIR)/fldigi-view_cw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@cw/$(DEPDIR)/fldigi-winkeyer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@debug/$(DEPDIR)/fldigi-debug.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@debug/$(DEPDIR)/fldigi-debug_dialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/flarq-font_browser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-Viewer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-confdialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-fl_digi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-fl_digi_main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-font_browser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-guide.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-htmlstrings.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-notifydialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-record_browse.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-rxmon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-testsigs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dialogs/$(DEPDIR)/fldigi-tod_clock.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dominoex/$(DEPDIR)/fldigi-dominoex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dominoex/$(DEPDIR)/fldigi-dominovar.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dtmf/$(DEPDIR)/fldigi-dtmf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-arc-help.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-dx_dialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@dxcluster/$(DEPDIR)/fldigi-dxcluster.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-Feld7x7-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-Feld7x7n-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldDx-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldFat-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldHell-12.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldLittle-12.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldLo8-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldLow-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldModern-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldModern8-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldNarr-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldReal-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldStyl-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldVert-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-FeldWide-14.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-feld.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@feld/$(DEPDIR)/fldigi-feldfonts.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fft-monitor/$(DEPDIR)/fldigi-spectrum.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fileselector/$(DEPDIR)/flarq-fileselect.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fileselector/$(DEPDIR)/fldigi-fileselect.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fileselector/$(DEPDIR)/fldigi-flnfc_common.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@filters/$(DEPDIR)/fldigi-fftfilt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@filters/$(DEPDIR)/fldigi-filters.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@filters/$(DEPDIR)/fldigi-viterbi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-arq.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-arqdialogs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-arqhelp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-b64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-flarq.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-flarqenv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@flarq-src/$(DEPDIR)/flarq-xml_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fmt/$(DEPDIR)/fldigi-fmt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fmt/$(DEPDIR)/fldigi-fmt_dialog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-bitmaps.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-fsq-pic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-fsq.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-fsq_monitor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fsq/$(DEPDIR)/fldigi-fsq_varicode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@globals/$(DEPDIR)/fldigi-globals.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-ifkp-pic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-ifkp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ifkp/$(DEPDIR)/fldigi-tux.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@irrxml/$(DEPDIR)/fldigi-irrXML.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@kml/$(DEPDIR)/fldigi-kmlserver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libtiniconv/$(DEPDIR)/fldigi-tiniconv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/flarq-table.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-adif_io.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-calendar.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-contest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-counties.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-county_lists.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-cty-dat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-date.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-fd_logger.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-fd_view.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-lgbook.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-logbook.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-logsupport.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-lookupcall.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-maclogger.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-n3fjp_logger.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-qrzlib.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-qso_db.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-table.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-textio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logbook/$(DEPDIR)/fldigi-xmlrpc_log.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logger/$(DEPDIR)/fldigi-logger.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logger/$(DEPDIR)/fldigi-rx_extract.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@logger/$(DEPDIR)/fldigi-speak.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-aes.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-aesni.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-arc4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-aria.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-asn1parse.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-asn1write.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-base64.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-bignum.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-blowfish.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-camellia.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ccm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-certs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-chacha20.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-chachapoly.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-cipher.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-cmac.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-debug.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-des.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-dhm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecdh.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecdsa.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecjpake.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ecp_curves.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-entropy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-entropy_poll.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-error.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-gcm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-havege.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-hkdf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md5.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-md_wrap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-net_sockets.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-nist_kw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-oid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-padlock.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pem.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pk_wrap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkcs11.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkcs12.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkcs5.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkparse.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-pkwrite.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-platform.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-platform_util.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-poly1305.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ripemd160.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-rsa.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-rsa_internal.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-sha1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-sha256.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-sha512.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_cache.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_cli.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_srv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-ssl_tls.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-threading.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-timing.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-version.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-version_features.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509_create.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509_crl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509_crt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509_csr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509write_crt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-x509write_csr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mbedtls/$(DEPDIR)/fldigi-xtea.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mfsk/$(DEPDIR)/fldigi-interleave.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mfsk/$(DEPDIR)/fldigi-mfsk-pic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mfsk/$(DEPDIR)/fldigi-mfsk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mfsk/$(DEPDIR)/fldigi-mfskvaricode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-ascii.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-icons.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-nls.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-pixmaps.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-pixmaps_tango.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-re.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-stack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-stacktrace.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-threads.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-timeops.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/flarq-util.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-arq_io.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-ascii.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-ax25_decode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-benchmark.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-charsetdistiller.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-charsetlist.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-configuration.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-coordinate.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-dxcc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-estrings.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-icons.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-kiss_io.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-locator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-log.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-macroedit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-macros.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-misc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-newinstall.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-nls.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-outputencoder.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-pixmaps.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-pixmaps_tango.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-re.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-record_loader.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-stack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-stacktrace.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-strutil.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-threads.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-timeops.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-utf8file_io.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@misc/$(DEPDIR)/fldigi-util.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mt63/$(DEPDIR)/fldigi-dsp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mt63/$(DEPDIR)/fldigi-mt63.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mt63/$(DEPDIR)/fldigi-mt63base.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@navtex/$(DEPDIR)/fldigi-navtex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/flarq-socket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-ca_cert.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-metar.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-network.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-socket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-weather.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@network/$(DEPDIR)/fldigi-xmlrpc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@olivia/$(DEPDIR)/fldigi-olivia.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-psk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-pskcoeff.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-pskeval.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-pskvaricode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@psk/$(DEPDIR)/fldigi-viewpsk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@psm/$(DEPDIR)/fldigi-psm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@qrunner/$(DEPDIR)/fldigi-qrunner.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-FreqControl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-hamlib.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-norig.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-ptt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-rigclass.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-rigio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-rigsupport.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-rigxml.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-serial.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rsid/$(DEPDIR)/fldigi-rsid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rsid/$(DEPDIR)/fldigi-rsid_defs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rtty/$(DEPDIR)/fldigi-fsk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rtty/$(DEPDIR)/fldigi-rtty.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@rtty/$(DEPDIR)/fldigi-view_rtty.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-audio_alert.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-bark.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-checkout.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-diesel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-dinnerbell.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-doesnot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-play.pa.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-sound.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-soundconf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-steam_train.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@soundcard/$(DEPDIR)/fldigi-ttybell.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@spot/$(DEPDIR)/fldigi-notify.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@spot/$(DEPDIR)/fldigi-pskrep.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@spot/$(DEPDIR)/fldigi-spot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ssb/$(DEPDIR)/fldigi-ssb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@status/$(DEPDIR)/fldigi-squelch_status.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@status/$(DEPDIR)/fldigi-status.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@synop-src/$(DEPDIR)/fldigi-synop.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@thor/$(DEPDIR)/fldigi-thor-pic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@thor/$(DEPDIR)/fldigi-thor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@thor/$(DEPDIR)/fldigi-thorvaricode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@throb/$(DEPDIR)/fldigi-throb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-modem.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-nullmodem.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-test_signal.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-trx.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@trx/$(DEPDIR)/fldigi-tune.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@waterfall/$(DEPDIR)/fldigi-colorbox.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@waterfall/$(DEPDIR)/fldigi-digiscope.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@waterfall/$(DEPDIR)/fldigi-raster.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@waterfall/$(DEPDIR)/fldigi-waterfall.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@wefax/$(DEPDIR)/fldigi-wefax-pic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@wefax/$(DEPDIR)/fldigi-wefax.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@wefax/$(DEPDIR)/fldigi-wefax_map.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-FTextView.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-F_Edit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-flinput2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-flmisc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/flarq-flslider2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-FTextRXTX.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-FTextView.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-Panel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-flinput2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-flmisc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-flslider2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-picture.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-plot_xy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-progress.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-psk_browser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-pwrmeter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-smeter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@widgets/$(DEPDIR)/fldigi-vumeter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@wwv/$(DEPDIR)/fldigi-analysis.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@wwv/$(DEPDIR)/fldigi-wwv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` compat/flarq-regex.o: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-regex.o -MD -MP -MF compat/$(DEPDIR)/flarq-regex.Tpo -c -o compat/flarq-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-regex.Tpo compat/$(DEPDIR)/flarq-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='compat/flarq-regex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c compat/flarq-regex.obj: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-regex.obj -MD -MP -MF compat/$(DEPDIR)/flarq-regex.Tpo -c -o compat/flarq-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-regex.Tpo compat/$(DEPDIR)/flarq-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='compat/flarq-regex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` compat/flarq-getsysinfo.o: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-getsysinfo.o -MD -MP -MF compat/$(DEPDIR)/flarq-getsysinfo.Tpo -c -o compat/flarq-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-getsysinfo.Tpo compat/$(DEPDIR)/flarq-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='compat/flarq-getsysinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c compat/flarq-getsysinfo.obj: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-getsysinfo.obj -MD -MP -MF compat/$(DEPDIR)/flarq-getsysinfo.Tpo -c -o compat/flarq-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-getsysinfo.Tpo compat/$(DEPDIR)/flarq-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='compat/flarq-getsysinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` compat/flarq-mingw.o: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-mingw.o -MD -MP -MF compat/$(DEPDIR)/flarq-mingw.Tpo -c -o compat/flarq-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-mingw.Tpo compat/$(DEPDIR)/flarq-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='compat/flarq-mingw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c compat/flarq-mingw.obj: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -MT compat/flarq-mingw.obj -MD -MP -MF compat/$(DEPDIR)/flarq-mingw.Tpo -c -o compat/flarq-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/flarq-mingw.Tpo compat/$(DEPDIR)/flarq-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='compat/flarq-mingw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CFLAGS) $(CFLAGS) -c -o compat/flarq-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` mbedtls/fldigi-aes.o: mbedtls/aes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aes.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aes.Tpo -c -o mbedtls/fldigi-aes.o `test -f 'mbedtls/aes.c' || echo '$(srcdir)/'`mbedtls/aes.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aes.Tpo mbedtls/$(DEPDIR)/fldigi-aes.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aes.c' object='mbedtls/fldigi-aes.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aes.o `test -f 'mbedtls/aes.c' || echo '$(srcdir)/'`mbedtls/aes.c mbedtls/fldigi-aes.obj: mbedtls/aes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aes.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aes.Tpo -c -o mbedtls/fldigi-aes.obj `if test -f 'mbedtls/aes.c'; then $(CYGPATH_W) 'mbedtls/aes.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aes.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aes.Tpo mbedtls/$(DEPDIR)/fldigi-aes.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aes.c' object='mbedtls/fldigi-aes.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aes.obj `if test -f 'mbedtls/aes.c'; then $(CYGPATH_W) 'mbedtls/aes.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aes.c'; fi` mbedtls/fldigi-aesni.o: mbedtls/aesni.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aesni.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aesni.Tpo -c -o mbedtls/fldigi-aesni.o `test -f 'mbedtls/aesni.c' || echo '$(srcdir)/'`mbedtls/aesni.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aesni.Tpo mbedtls/$(DEPDIR)/fldigi-aesni.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aesni.c' object='mbedtls/fldigi-aesni.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aesni.o `test -f 'mbedtls/aesni.c' || echo '$(srcdir)/'`mbedtls/aesni.c mbedtls/fldigi-aesni.obj: mbedtls/aesni.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aesni.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aesni.Tpo -c -o mbedtls/fldigi-aesni.obj `if test -f 'mbedtls/aesni.c'; then $(CYGPATH_W) 'mbedtls/aesni.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aesni.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aesni.Tpo mbedtls/$(DEPDIR)/fldigi-aesni.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aesni.c' object='mbedtls/fldigi-aesni.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aesni.obj `if test -f 'mbedtls/aesni.c'; then $(CYGPATH_W) 'mbedtls/aesni.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aesni.c'; fi` mbedtls/fldigi-arc4.o: mbedtls/arc4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-arc4.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-arc4.Tpo -c -o mbedtls/fldigi-arc4.o `test -f 'mbedtls/arc4.c' || echo '$(srcdir)/'`mbedtls/arc4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-arc4.Tpo mbedtls/$(DEPDIR)/fldigi-arc4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/arc4.c' object='mbedtls/fldigi-arc4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-arc4.o `test -f 'mbedtls/arc4.c' || echo '$(srcdir)/'`mbedtls/arc4.c mbedtls/fldigi-arc4.obj: mbedtls/arc4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-arc4.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-arc4.Tpo -c -o mbedtls/fldigi-arc4.obj `if test -f 'mbedtls/arc4.c'; then $(CYGPATH_W) 'mbedtls/arc4.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/arc4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-arc4.Tpo mbedtls/$(DEPDIR)/fldigi-arc4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/arc4.c' object='mbedtls/fldigi-arc4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-arc4.obj `if test -f 'mbedtls/arc4.c'; then $(CYGPATH_W) 'mbedtls/arc4.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/arc4.c'; fi` mbedtls/fldigi-aria.o: mbedtls/aria.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aria.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aria.Tpo -c -o mbedtls/fldigi-aria.o `test -f 'mbedtls/aria.c' || echo '$(srcdir)/'`mbedtls/aria.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aria.Tpo mbedtls/$(DEPDIR)/fldigi-aria.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aria.c' object='mbedtls/fldigi-aria.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aria.o `test -f 'mbedtls/aria.c' || echo '$(srcdir)/'`mbedtls/aria.c mbedtls/fldigi-aria.obj: mbedtls/aria.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-aria.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-aria.Tpo -c -o mbedtls/fldigi-aria.obj `if test -f 'mbedtls/aria.c'; then $(CYGPATH_W) 'mbedtls/aria.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aria.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-aria.Tpo mbedtls/$(DEPDIR)/fldigi-aria.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/aria.c' object='mbedtls/fldigi-aria.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-aria.obj `if test -f 'mbedtls/aria.c'; then $(CYGPATH_W) 'mbedtls/aria.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/aria.c'; fi` mbedtls/fldigi-asn1parse.o: mbedtls/asn1parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-asn1parse.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-asn1parse.Tpo -c -o mbedtls/fldigi-asn1parse.o `test -f 'mbedtls/asn1parse.c' || echo '$(srcdir)/'`mbedtls/asn1parse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-asn1parse.Tpo mbedtls/$(DEPDIR)/fldigi-asn1parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/asn1parse.c' object='mbedtls/fldigi-asn1parse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-asn1parse.o `test -f 'mbedtls/asn1parse.c' || echo '$(srcdir)/'`mbedtls/asn1parse.c mbedtls/fldigi-asn1parse.obj: mbedtls/asn1parse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-asn1parse.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-asn1parse.Tpo -c -o mbedtls/fldigi-asn1parse.obj `if test -f 'mbedtls/asn1parse.c'; then $(CYGPATH_W) 'mbedtls/asn1parse.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/asn1parse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-asn1parse.Tpo mbedtls/$(DEPDIR)/fldigi-asn1parse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/asn1parse.c' object='mbedtls/fldigi-asn1parse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-asn1parse.obj `if test -f 'mbedtls/asn1parse.c'; then $(CYGPATH_W) 'mbedtls/asn1parse.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/asn1parse.c'; fi` mbedtls/fldigi-asn1write.o: mbedtls/asn1write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-asn1write.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-asn1write.Tpo -c -o mbedtls/fldigi-asn1write.o `test -f 'mbedtls/asn1write.c' || echo '$(srcdir)/'`mbedtls/asn1write.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-asn1write.Tpo mbedtls/$(DEPDIR)/fldigi-asn1write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/asn1write.c' object='mbedtls/fldigi-asn1write.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-asn1write.o `test -f 'mbedtls/asn1write.c' || echo '$(srcdir)/'`mbedtls/asn1write.c mbedtls/fldigi-asn1write.obj: mbedtls/asn1write.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-asn1write.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-asn1write.Tpo -c -o mbedtls/fldigi-asn1write.obj `if test -f 'mbedtls/asn1write.c'; then $(CYGPATH_W) 'mbedtls/asn1write.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/asn1write.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-asn1write.Tpo mbedtls/$(DEPDIR)/fldigi-asn1write.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/asn1write.c' object='mbedtls/fldigi-asn1write.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-asn1write.obj `if test -f 'mbedtls/asn1write.c'; then $(CYGPATH_W) 'mbedtls/asn1write.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/asn1write.c'; fi` mbedtls/fldigi-base64.o: mbedtls/base64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-base64.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-base64.Tpo -c -o mbedtls/fldigi-base64.o `test -f 'mbedtls/base64.c' || echo '$(srcdir)/'`mbedtls/base64.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-base64.Tpo mbedtls/$(DEPDIR)/fldigi-base64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/base64.c' object='mbedtls/fldigi-base64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-base64.o `test -f 'mbedtls/base64.c' || echo '$(srcdir)/'`mbedtls/base64.c mbedtls/fldigi-base64.obj: mbedtls/base64.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-base64.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-base64.Tpo -c -o mbedtls/fldigi-base64.obj `if test -f 'mbedtls/base64.c'; then $(CYGPATH_W) 'mbedtls/base64.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/base64.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-base64.Tpo mbedtls/$(DEPDIR)/fldigi-base64.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/base64.c' object='mbedtls/fldigi-base64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-base64.obj `if test -f 'mbedtls/base64.c'; then $(CYGPATH_W) 'mbedtls/base64.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/base64.c'; fi` mbedtls/fldigi-bignum.o: mbedtls/bignum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-bignum.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-bignum.Tpo -c -o mbedtls/fldigi-bignum.o `test -f 'mbedtls/bignum.c' || echo '$(srcdir)/'`mbedtls/bignum.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-bignum.Tpo mbedtls/$(DEPDIR)/fldigi-bignum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/bignum.c' object='mbedtls/fldigi-bignum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-bignum.o `test -f 'mbedtls/bignum.c' || echo '$(srcdir)/'`mbedtls/bignum.c mbedtls/fldigi-bignum.obj: mbedtls/bignum.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-bignum.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-bignum.Tpo -c -o mbedtls/fldigi-bignum.obj `if test -f 'mbedtls/bignum.c'; then $(CYGPATH_W) 'mbedtls/bignum.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/bignum.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-bignum.Tpo mbedtls/$(DEPDIR)/fldigi-bignum.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/bignum.c' object='mbedtls/fldigi-bignum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-bignum.obj `if test -f 'mbedtls/bignum.c'; then $(CYGPATH_W) 'mbedtls/bignum.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/bignum.c'; fi` mbedtls/fldigi-blowfish.o: mbedtls/blowfish.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-blowfish.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-blowfish.Tpo -c -o mbedtls/fldigi-blowfish.o `test -f 'mbedtls/blowfish.c' || echo '$(srcdir)/'`mbedtls/blowfish.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-blowfish.Tpo mbedtls/$(DEPDIR)/fldigi-blowfish.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/blowfish.c' object='mbedtls/fldigi-blowfish.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-blowfish.o `test -f 'mbedtls/blowfish.c' || echo '$(srcdir)/'`mbedtls/blowfish.c mbedtls/fldigi-blowfish.obj: mbedtls/blowfish.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-blowfish.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-blowfish.Tpo -c -o mbedtls/fldigi-blowfish.obj `if test -f 'mbedtls/blowfish.c'; then $(CYGPATH_W) 'mbedtls/blowfish.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/blowfish.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-blowfish.Tpo mbedtls/$(DEPDIR)/fldigi-blowfish.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/blowfish.c' object='mbedtls/fldigi-blowfish.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-blowfish.obj `if test -f 'mbedtls/blowfish.c'; then $(CYGPATH_W) 'mbedtls/blowfish.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/blowfish.c'; fi` mbedtls/fldigi-camellia.o: mbedtls/camellia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-camellia.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-camellia.Tpo -c -o mbedtls/fldigi-camellia.o `test -f 'mbedtls/camellia.c' || echo '$(srcdir)/'`mbedtls/camellia.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-camellia.Tpo mbedtls/$(DEPDIR)/fldigi-camellia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/camellia.c' object='mbedtls/fldigi-camellia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-camellia.o `test -f 'mbedtls/camellia.c' || echo '$(srcdir)/'`mbedtls/camellia.c mbedtls/fldigi-camellia.obj: mbedtls/camellia.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-camellia.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-camellia.Tpo -c -o mbedtls/fldigi-camellia.obj `if test -f 'mbedtls/camellia.c'; then $(CYGPATH_W) 'mbedtls/camellia.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/camellia.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-camellia.Tpo mbedtls/$(DEPDIR)/fldigi-camellia.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/camellia.c' object='mbedtls/fldigi-camellia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-camellia.obj `if test -f 'mbedtls/camellia.c'; then $(CYGPATH_W) 'mbedtls/camellia.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/camellia.c'; fi` mbedtls/fldigi-ccm.o: mbedtls/ccm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ccm.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ccm.Tpo -c -o mbedtls/fldigi-ccm.o `test -f 'mbedtls/ccm.c' || echo '$(srcdir)/'`mbedtls/ccm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ccm.Tpo mbedtls/$(DEPDIR)/fldigi-ccm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ccm.c' object='mbedtls/fldigi-ccm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ccm.o `test -f 'mbedtls/ccm.c' || echo '$(srcdir)/'`mbedtls/ccm.c mbedtls/fldigi-ccm.obj: mbedtls/ccm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ccm.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ccm.Tpo -c -o mbedtls/fldigi-ccm.obj `if test -f 'mbedtls/ccm.c'; then $(CYGPATH_W) 'mbedtls/ccm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ccm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ccm.Tpo mbedtls/$(DEPDIR)/fldigi-ccm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ccm.c' object='mbedtls/fldigi-ccm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ccm.obj `if test -f 'mbedtls/ccm.c'; then $(CYGPATH_W) 'mbedtls/ccm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ccm.c'; fi` mbedtls/fldigi-certs.o: mbedtls/certs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-certs.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-certs.Tpo -c -o mbedtls/fldigi-certs.o `test -f 'mbedtls/certs.c' || echo '$(srcdir)/'`mbedtls/certs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-certs.Tpo mbedtls/$(DEPDIR)/fldigi-certs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/certs.c' object='mbedtls/fldigi-certs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-certs.o `test -f 'mbedtls/certs.c' || echo '$(srcdir)/'`mbedtls/certs.c mbedtls/fldigi-certs.obj: mbedtls/certs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-certs.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-certs.Tpo -c -o mbedtls/fldigi-certs.obj `if test -f 'mbedtls/certs.c'; then $(CYGPATH_W) 'mbedtls/certs.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/certs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-certs.Tpo mbedtls/$(DEPDIR)/fldigi-certs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/certs.c' object='mbedtls/fldigi-certs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-certs.obj `if test -f 'mbedtls/certs.c'; then $(CYGPATH_W) 'mbedtls/certs.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/certs.c'; fi` mbedtls/fldigi-chacha20.o: mbedtls/chacha20.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-chacha20.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-chacha20.Tpo -c -o mbedtls/fldigi-chacha20.o `test -f 'mbedtls/chacha20.c' || echo '$(srcdir)/'`mbedtls/chacha20.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-chacha20.Tpo mbedtls/$(DEPDIR)/fldigi-chacha20.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/chacha20.c' object='mbedtls/fldigi-chacha20.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-chacha20.o `test -f 'mbedtls/chacha20.c' || echo '$(srcdir)/'`mbedtls/chacha20.c mbedtls/fldigi-chacha20.obj: mbedtls/chacha20.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-chacha20.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-chacha20.Tpo -c -o mbedtls/fldigi-chacha20.obj `if test -f 'mbedtls/chacha20.c'; then $(CYGPATH_W) 'mbedtls/chacha20.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/chacha20.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-chacha20.Tpo mbedtls/$(DEPDIR)/fldigi-chacha20.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/chacha20.c' object='mbedtls/fldigi-chacha20.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-chacha20.obj `if test -f 'mbedtls/chacha20.c'; then $(CYGPATH_W) 'mbedtls/chacha20.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/chacha20.c'; fi` mbedtls/fldigi-chachapoly.o: mbedtls/chachapoly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-chachapoly.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-chachapoly.Tpo -c -o mbedtls/fldigi-chachapoly.o `test -f 'mbedtls/chachapoly.c' || echo '$(srcdir)/'`mbedtls/chachapoly.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-chachapoly.Tpo mbedtls/$(DEPDIR)/fldigi-chachapoly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/chachapoly.c' object='mbedtls/fldigi-chachapoly.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-chachapoly.o `test -f 'mbedtls/chachapoly.c' || echo '$(srcdir)/'`mbedtls/chachapoly.c mbedtls/fldigi-chachapoly.obj: mbedtls/chachapoly.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-chachapoly.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-chachapoly.Tpo -c -o mbedtls/fldigi-chachapoly.obj `if test -f 'mbedtls/chachapoly.c'; then $(CYGPATH_W) 'mbedtls/chachapoly.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/chachapoly.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-chachapoly.Tpo mbedtls/$(DEPDIR)/fldigi-chachapoly.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/chachapoly.c' object='mbedtls/fldigi-chachapoly.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-chachapoly.obj `if test -f 'mbedtls/chachapoly.c'; then $(CYGPATH_W) 'mbedtls/chachapoly.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/chachapoly.c'; fi` mbedtls/fldigi-cipher.o: mbedtls/cipher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cipher.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cipher.Tpo -c -o mbedtls/fldigi-cipher.o `test -f 'mbedtls/cipher.c' || echo '$(srcdir)/'`mbedtls/cipher.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cipher.Tpo mbedtls/$(DEPDIR)/fldigi-cipher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cipher.c' object='mbedtls/fldigi-cipher.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cipher.o `test -f 'mbedtls/cipher.c' || echo '$(srcdir)/'`mbedtls/cipher.c mbedtls/fldigi-cipher.obj: mbedtls/cipher.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cipher.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cipher.Tpo -c -o mbedtls/fldigi-cipher.obj `if test -f 'mbedtls/cipher.c'; then $(CYGPATH_W) 'mbedtls/cipher.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cipher.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cipher.Tpo mbedtls/$(DEPDIR)/fldigi-cipher.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cipher.c' object='mbedtls/fldigi-cipher.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cipher.obj `if test -f 'mbedtls/cipher.c'; then $(CYGPATH_W) 'mbedtls/cipher.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cipher.c'; fi` mbedtls/fldigi-cipher_wrap.o: mbedtls/cipher_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cipher_wrap.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Tpo -c -o mbedtls/fldigi-cipher_wrap.o `test -f 'mbedtls/cipher_wrap.c' || echo '$(srcdir)/'`mbedtls/cipher_wrap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cipher_wrap.c' object='mbedtls/fldigi-cipher_wrap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cipher_wrap.o `test -f 'mbedtls/cipher_wrap.c' || echo '$(srcdir)/'`mbedtls/cipher_wrap.c mbedtls/fldigi-cipher_wrap.obj: mbedtls/cipher_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cipher_wrap.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Tpo -c -o mbedtls/fldigi-cipher_wrap.obj `if test -f 'mbedtls/cipher_wrap.c'; then $(CYGPATH_W) 'mbedtls/cipher_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cipher_wrap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cipher_wrap.c' object='mbedtls/fldigi-cipher_wrap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cipher_wrap.obj `if test -f 'mbedtls/cipher_wrap.c'; then $(CYGPATH_W) 'mbedtls/cipher_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cipher_wrap.c'; fi` mbedtls/fldigi-cmac.o: mbedtls/cmac.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cmac.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cmac.Tpo -c -o mbedtls/fldigi-cmac.o `test -f 'mbedtls/cmac.c' || echo '$(srcdir)/'`mbedtls/cmac.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cmac.Tpo mbedtls/$(DEPDIR)/fldigi-cmac.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cmac.c' object='mbedtls/fldigi-cmac.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cmac.o `test -f 'mbedtls/cmac.c' || echo '$(srcdir)/'`mbedtls/cmac.c mbedtls/fldigi-cmac.obj: mbedtls/cmac.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-cmac.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-cmac.Tpo -c -o mbedtls/fldigi-cmac.obj `if test -f 'mbedtls/cmac.c'; then $(CYGPATH_W) 'mbedtls/cmac.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cmac.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-cmac.Tpo mbedtls/$(DEPDIR)/fldigi-cmac.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/cmac.c' object='mbedtls/fldigi-cmac.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-cmac.obj `if test -f 'mbedtls/cmac.c'; then $(CYGPATH_W) 'mbedtls/cmac.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/cmac.c'; fi` mbedtls/fldigi-ctr_drbg.o: mbedtls/ctr_drbg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ctr_drbg.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Tpo -c -o mbedtls/fldigi-ctr_drbg.o `test -f 'mbedtls/ctr_drbg.c' || echo '$(srcdir)/'`mbedtls/ctr_drbg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Tpo mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ctr_drbg.c' object='mbedtls/fldigi-ctr_drbg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ctr_drbg.o `test -f 'mbedtls/ctr_drbg.c' || echo '$(srcdir)/'`mbedtls/ctr_drbg.c mbedtls/fldigi-ctr_drbg.obj: mbedtls/ctr_drbg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ctr_drbg.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Tpo -c -o mbedtls/fldigi-ctr_drbg.obj `if test -f 'mbedtls/ctr_drbg.c'; then $(CYGPATH_W) 'mbedtls/ctr_drbg.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ctr_drbg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Tpo mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ctr_drbg.c' object='mbedtls/fldigi-ctr_drbg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ctr_drbg.obj `if test -f 'mbedtls/ctr_drbg.c'; then $(CYGPATH_W) 'mbedtls/ctr_drbg.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ctr_drbg.c'; fi` mbedtls/fldigi-debug.o: mbedtls/debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-debug.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-debug.Tpo -c -o mbedtls/fldigi-debug.o `test -f 'mbedtls/debug.c' || echo '$(srcdir)/'`mbedtls/debug.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-debug.Tpo mbedtls/$(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/debug.c' object='mbedtls/fldigi-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-debug.o `test -f 'mbedtls/debug.c' || echo '$(srcdir)/'`mbedtls/debug.c mbedtls/fldigi-debug.obj: mbedtls/debug.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-debug.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-debug.Tpo -c -o mbedtls/fldigi-debug.obj `if test -f 'mbedtls/debug.c'; then $(CYGPATH_W) 'mbedtls/debug.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/debug.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-debug.Tpo mbedtls/$(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/debug.c' object='mbedtls/fldigi-debug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-debug.obj `if test -f 'mbedtls/debug.c'; then $(CYGPATH_W) 'mbedtls/debug.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/debug.c'; fi` mbedtls/fldigi-des.o: mbedtls/des.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-des.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-des.Tpo -c -o mbedtls/fldigi-des.o `test -f 'mbedtls/des.c' || echo '$(srcdir)/'`mbedtls/des.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-des.Tpo mbedtls/$(DEPDIR)/fldigi-des.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/des.c' object='mbedtls/fldigi-des.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-des.o `test -f 'mbedtls/des.c' || echo '$(srcdir)/'`mbedtls/des.c mbedtls/fldigi-des.obj: mbedtls/des.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-des.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-des.Tpo -c -o mbedtls/fldigi-des.obj `if test -f 'mbedtls/des.c'; then $(CYGPATH_W) 'mbedtls/des.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/des.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-des.Tpo mbedtls/$(DEPDIR)/fldigi-des.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/des.c' object='mbedtls/fldigi-des.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-des.obj `if test -f 'mbedtls/des.c'; then $(CYGPATH_W) 'mbedtls/des.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/des.c'; fi` mbedtls/fldigi-dhm.o: mbedtls/dhm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-dhm.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-dhm.Tpo -c -o mbedtls/fldigi-dhm.o `test -f 'mbedtls/dhm.c' || echo '$(srcdir)/'`mbedtls/dhm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-dhm.Tpo mbedtls/$(DEPDIR)/fldigi-dhm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/dhm.c' object='mbedtls/fldigi-dhm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-dhm.o `test -f 'mbedtls/dhm.c' || echo '$(srcdir)/'`mbedtls/dhm.c mbedtls/fldigi-dhm.obj: mbedtls/dhm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-dhm.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-dhm.Tpo -c -o mbedtls/fldigi-dhm.obj `if test -f 'mbedtls/dhm.c'; then $(CYGPATH_W) 'mbedtls/dhm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/dhm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-dhm.Tpo mbedtls/$(DEPDIR)/fldigi-dhm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/dhm.c' object='mbedtls/fldigi-dhm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-dhm.obj `if test -f 'mbedtls/dhm.c'; then $(CYGPATH_W) 'mbedtls/dhm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/dhm.c'; fi` mbedtls/fldigi-ecdh.o: mbedtls/ecdh.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecdh.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecdh.Tpo -c -o mbedtls/fldigi-ecdh.o `test -f 'mbedtls/ecdh.c' || echo '$(srcdir)/'`mbedtls/ecdh.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecdh.Tpo mbedtls/$(DEPDIR)/fldigi-ecdh.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecdh.c' object='mbedtls/fldigi-ecdh.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecdh.o `test -f 'mbedtls/ecdh.c' || echo '$(srcdir)/'`mbedtls/ecdh.c mbedtls/fldigi-ecdh.obj: mbedtls/ecdh.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecdh.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecdh.Tpo -c -o mbedtls/fldigi-ecdh.obj `if test -f 'mbedtls/ecdh.c'; then $(CYGPATH_W) 'mbedtls/ecdh.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecdh.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecdh.Tpo mbedtls/$(DEPDIR)/fldigi-ecdh.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecdh.c' object='mbedtls/fldigi-ecdh.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecdh.obj `if test -f 'mbedtls/ecdh.c'; then $(CYGPATH_W) 'mbedtls/ecdh.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecdh.c'; fi` mbedtls/fldigi-ecdsa.o: mbedtls/ecdsa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecdsa.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecdsa.Tpo -c -o mbedtls/fldigi-ecdsa.o `test -f 'mbedtls/ecdsa.c' || echo '$(srcdir)/'`mbedtls/ecdsa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecdsa.Tpo mbedtls/$(DEPDIR)/fldigi-ecdsa.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecdsa.c' object='mbedtls/fldigi-ecdsa.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecdsa.o `test -f 'mbedtls/ecdsa.c' || echo '$(srcdir)/'`mbedtls/ecdsa.c mbedtls/fldigi-ecdsa.obj: mbedtls/ecdsa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecdsa.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecdsa.Tpo -c -o mbedtls/fldigi-ecdsa.obj `if test -f 'mbedtls/ecdsa.c'; then $(CYGPATH_W) 'mbedtls/ecdsa.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecdsa.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecdsa.Tpo mbedtls/$(DEPDIR)/fldigi-ecdsa.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecdsa.c' object='mbedtls/fldigi-ecdsa.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecdsa.obj `if test -f 'mbedtls/ecdsa.c'; then $(CYGPATH_W) 'mbedtls/ecdsa.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecdsa.c'; fi` mbedtls/fldigi-ecjpake.o: mbedtls/ecjpake.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecjpake.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecjpake.Tpo -c -o mbedtls/fldigi-ecjpake.o `test -f 'mbedtls/ecjpake.c' || echo '$(srcdir)/'`mbedtls/ecjpake.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecjpake.Tpo mbedtls/$(DEPDIR)/fldigi-ecjpake.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecjpake.c' object='mbedtls/fldigi-ecjpake.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecjpake.o `test -f 'mbedtls/ecjpake.c' || echo '$(srcdir)/'`mbedtls/ecjpake.c mbedtls/fldigi-ecjpake.obj: mbedtls/ecjpake.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecjpake.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecjpake.Tpo -c -o mbedtls/fldigi-ecjpake.obj `if test -f 'mbedtls/ecjpake.c'; then $(CYGPATH_W) 'mbedtls/ecjpake.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecjpake.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecjpake.Tpo mbedtls/$(DEPDIR)/fldigi-ecjpake.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecjpake.c' object='mbedtls/fldigi-ecjpake.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecjpake.obj `if test -f 'mbedtls/ecjpake.c'; then $(CYGPATH_W) 'mbedtls/ecjpake.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecjpake.c'; fi` mbedtls/fldigi-ecp.o: mbedtls/ecp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecp.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecp.Tpo -c -o mbedtls/fldigi-ecp.o `test -f 'mbedtls/ecp.c' || echo '$(srcdir)/'`mbedtls/ecp.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecp.Tpo mbedtls/$(DEPDIR)/fldigi-ecp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecp.c' object='mbedtls/fldigi-ecp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecp.o `test -f 'mbedtls/ecp.c' || echo '$(srcdir)/'`mbedtls/ecp.c mbedtls/fldigi-ecp.obj: mbedtls/ecp.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecp.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecp.Tpo -c -o mbedtls/fldigi-ecp.obj `if test -f 'mbedtls/ecp.c'; then $(CYGPATH_W) 'mbedtls/ecp.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecp.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecp.Tpo mbedtls/$(DEPDIR)/fldigi-ecp.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecp.c' object='mbedtls/fldigi-ecp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecp.obj `if test -f 'mbedtls/ecp.c'; then $(CYGPATH_W) 'mbedtls/ecp.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecp.c'; fi` mbedtls/fldigi-ecp_curves.o: mbedtls/ecp_curves.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecp_curves.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecp_curves.Tpo -c -o mbedtls/fldigi-ecp_curves.o `test -f 'mbedtls/ecp_curves.c' || echo '$(srcdir)/'`mbedtls/ecp_curves.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecp_curves.Tpo mbedtls/$(DEPDIR)/fldigi-ecp_curves.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecp_curves.c' object='mbedtls/fldigi-ecp_curves.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecp_curves.o `test -f 'mbedtls/ecp_curves.c' || echo '$(srcdir)/'`mbedtls/ecp_curves.c mbedtls/fldigi-ecp_curves.obj: mbedtls/ecp_curves.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ecp_curves.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ecp_curves.Tpo -c -o mbedtls/fldigi-ecp_curves.obj `if test -f 'mbedtls/ecp_curves.c'; then $(CYGPATH_W) 'mbedtls/ecp_curves.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecp_curves.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ecp_curves.Tpo mbedtls/$(DEPDIR)/fldigi-ecp_curves.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ecp_curves.c' object='mbedtls/fldigi-ecp_curves.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ecp_curves.obj `if test -f 'mbedtls/ecp_curves.c'; then $(CYGPATH_W) 'mbedtls/ecp_curves.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ecp_curves.c'; fi` mbedtls/fldigi-entropy.o: mbedtls/entropy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-entropy.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-entropy.Tpo -c -o mbedtls/fldigi-entropy.o `test -f 'mbedtls/entropy.c' || echo '$(srcdir)/'`mbedtls/entropy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-entropy.Tpo mbedtls/$(DEPDIR)/fldigi-entropy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/entropy.c' object='mbedtls/fldigi-entropy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-entropy.o `test -f 'mbedtls/entropy.c' || echo '$(srcdir)/'`mbedtls/entropy.c mbedtls/fldigi-entropy.obj: mbedtls/entropy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-entropy.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-entropy.Tpo -c -o mbedtls/fldigi-entropy.obj `if test -f 'mbedtls/entropy.c'; then $(CYGPATH_W) 'mbedtls/entropy.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/entropy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-entropy.Tpo mbedtls/$(DEPDIR)/fldigi-entropy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/entropy.c' object='mbedtls/fldigi-entropy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-entropy.obj `if test -f 'mbedtls/entropy.c'; then $(CYGPATH_W) 'mbedtls/entropy.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/entropy.c'; fi` mbedtls/fldigi-entropy_poll.o: mbedtls/entropy_poll.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-entropy_poll.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-entropy_poll.Tpo -c -o mbedtls/fldigi-entropy_poll.o `test -f 'mbedtls/entropy_poll.c' || echo '$(srcdir)/'`mbedtls/entropy_poll.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-entropy_poll.Tpo mbedtls/$(DEPDIR)/fldigi-entropy_poll.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/entropy_poll.c' object='mbedtls/fldigi-entropy_poll.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-entropy_poll.o `test -f 'mbedtls/entropy_poll.c' || echo '$(srcdir)/'`mbedtls/entropy_poll.c mbedtls/fldigi-entropy_poll.obj: mbedtls/entropy_poll.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-entropy_poll.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-entropy_poll.Tpo -c -o mbedtls/fldigi-entropy_poll.obj `if test -f 'mbedtls/entropy_poll.c'; then $(CYGPATH_W) 'mbedtls/entropy_poll.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/entropy_poll.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-entropy_poll.Tpo mbedtls/$(DEPDIR)/fldigi-entropy_poll.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/entropy_poll.c' object='mbedtls/fldigi-entropy_poll.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-entropy_poll.obj `if test -f 'mbedtls/entropy_poll.c'; then $(CYGPATH_W) 'mbedtls/entropy_poll.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/entropy_poll.c'; fi` mbedtls/fldigi-error.o: mbedtls/error.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-error.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-error.Tpo -c -o mbedtls/fldigi-error.o `test -f 'mbedtls/error.c' || echo '$(srcdir)/'`mbedtls/error.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-error.Tpo mbedtls/$(DEPDIR)/fldigi-error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/error.c' object='mbedtls/fldigi-error.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-error.o `test -f 'mbedtls/error.c' || echo '$(srcdir)/'`mbedtls/error.c mbedtls/fldigi-error.obj: mbedtls/error.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-error.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-error.Tpo -c -o mbedtls/fldigi-error.obj `if test -f 'mbedtls/error.c'; then $(CYGPATH_W) 'mbedtls/error.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/error.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-error.Tpo mbedtls/$(DEPDIR)/fldigi-error.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/error.c' object='mbedtls/fldigi-error.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-error.obj `if test -f 'mbedtls/error.c'; then $(CYGPATH_W) 'mbedtls/error.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/error.c'; fi` mbedtls/fldigi-gcm.o: mbedtls/gcm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-gcm.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-gcm.Tpo -c -o mbedtls/fldigi-gcm.o `test -f 'mbedtls/gcm.c' || echo '$(srcdir)/'`mbedtls/gcm.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-gcm.Tpo mbedtls/$(DEPDIR)/fldigi-gcm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/gcm.c' object='mbedtls/fldigi-gcm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-gcm.o `test -f 'mbedtls/gcm.c' || echo '$(srcdir)/'`mbedtls/gcm.c mbedtls/fldigi-gcm.obj: mbedtls/gcm.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-gcm.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-gcm.Tpo -c -o mbedtls/fldigi-gcm.obj `if test -f 'mbedtls/gcm.c'; then $(CYGPATH_W) 'mbedtls/gcm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/gcm.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-gcm.Tpo mbedtls/$(DEPDIR)/fldigi-gcm.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/gcm.c' object='mbedtls/fldigi-gcm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-gcm.obj `if test -f 'mbedtls/gcm.c'; then $(CYGPATH_W) 'mbedtls/gcm.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/gcm.c'; fi` mbedtls/fldigi-havege.o: mbedtls/havege.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-havege.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-havege.Tpo -c -o mbedtls/fldigi-havege.o `test -f 'mbedtls/havege.c' || echo '$(srcdir)/'`mbedtls/havege.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-havege.Tpo mbedtls/$(DEPDIR)/fldigi-havege.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/havege.c' object='mbedtls/fldigi-havege.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-havege.o `test -f 'mbedtls/havege.c' || echo '$(srcdir)/'`mbedtls/havege.c mbedtls/fldigi-havege.obj: mbedtls/havege.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-havege.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-havege.Tpo -c -o mbedtls/fldigi-havege.obj `if test -f 'mbedtls/havege.c'; then $(CYGPATH_W) 'mbedtls/havege.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/havege.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-havege.Tpo mbedtls/$(DEPDIR)/fldigi-havege.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/havege.c' object='mbedtls/fldigi-havege.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-havege.obj `if test -f 'mbedtls/havege.c'; then $(CYGPATH_W) 'mbedtls/havege.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/havege.c'; fi` mbedtls/fldigi-hkdf.o: mbedtls/hkdf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-hkdf.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-hkdf.Tpo -c -o mbedtls/fldigi-hkdf.o `test -f 'mbedtls/hkdf.c' || echo '$(srcdir)/'`mbedtls/hkdf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-hkdf.Tpo mbedtls/$(DEPDIR)/fldigi-hkdf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/hkdf.c' object='mbedtls/fldigi-hkdf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-hkdf.o `test -f 'mbedtls/hkdf.c' || echo '$(srcdir)/'`mbedtls/hkdf.c mbedtls/fldigi-hkdf.obj: mbedtls/hkdf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-hkdf.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-hkdf.Tpo -c -o mbedtls/fldigi-hkdf.obj `if test -f 'mbedtls/hkdf.c'; then $(CYGPATH_W) 'mbedtls/hkdf.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/hkdf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-hkdf.Tpo mbedtls/$(DEPDIR)/fldigi-hkdf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/hkdf.c' object='mbedtls/fldigi-hkdf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-hkdf.obj `if test -f 'mbedtls/hkdf.c'; then $(CYGPATH_W) 'mbedtls/hkdf.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/hkdf.c'; fi` mbedtls/fldigi-hmac_drbg.o: mbedtls/hmac_drbg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-hmac_drbg.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Tpo -c -o mbedtls/fldigi-hmac_drbg.o `test -f 'mbedtls/hmac_drbg.c' || echo '$(srcdir)/'`mbedtls/hmac_drbg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Tpo mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/hmac_drbg.c' object='mbedtls/fldigi-hmac_drbg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-hmac_drbg.o `test -f 'mbedtls/hmac_drbg.c' || echo '$(srcdir)/'`mbedtls/hmac_drbg.c mbedtls/fldigi-hmac_drbg.obj: mbedtls/hmac_drbg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-hmac_drbg.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Tpo -c -o mbedtls/fldigi-hmac_drbg.obj `if test -f 'mbedtls/hmac_drbg.c'; then $(CYGPATH_W) 'mbedtls/hmac_drbg.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/hmac_drbg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Tpo mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/hmac_drbg.c' object='mbedtls/fldigi-hmac_drbg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-hmac_drbg.obj `if test -f 'mbedtls/hmac_drbg.c'; then $(CYGPATH_W) 'mbedtls/hmac_drbg.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/hmac_drbg.c'; fi` mbedtls/fldigi-md2.o: mbedtls/md2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md2.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md2.Tpo -c -o mbedtls/fldigi-md2.o `test -f 'mbedtls/md2.c' || echo '$(srcdir)/'`mbedtls/md2.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md2.Tpo mbedtls/$(DEPDIR)/fldigi-md2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md2.c' object='mbedtls/fldigi-md2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md2.o `test -f 'mbedtls/md2.c' || echo '$(srcdir)/'`mbedtls/md2.c mbedtls/fldigi-md2.obj: mbedtls/md2.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md2.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md2.Tpo -c -o mbedtls/fldigi-md2.obj `if test -f 'mbedtls/md2.c'; then $(CYGPATH_W) 'mbedtls/md2.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md2.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md2.Tpo mbedtls/$(DEPDIR)/fldigi-md2.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md2.c' object='mbedtls/fldigi-md2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md2.obj `if test -f 'mbedtls/md2.c'; then $(CYGPATH_W) 'mbedtls/md2.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md2.c'; fi` mbedtls/fldigi-md4.o: mbedtls/md4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md4.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md4.Tpo -c -o mbedtls/fldigi-md4.o `test -f 'mbedtls/md4.c' || echo '$(srcdir)/'`mbedtls/md4.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md4.Tpo mbedtls/$(DEPDIR)/fldigi-md4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md4.c' object='mbedtls/fldigi-md4.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md4.o `test -f 'mbedtls/md4.c' || echo '$(srcdir)/'`mbedtls/md4.c mbedtls/fldigi-md4.obj: mbedtls/md4.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md4.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md4.Tpo -c -o mbedtls/fldigi-md4.obj `if test -f 'mbedtls/md4.c'; then $(CYGPATH_W) 'mbedtls/md4.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md4.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md4.Tpo mbedtls/$(DEPDIR)/fldigi-md4.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md4.c' object='mbedtls/fldigi-md4.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md4.obj `if test -f 'mbedtls/md4.c'; then $(CYGPATH_W) 'mbedtls/md4.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md4.c'; fi` mbedtls/fldigi-md5.o: mbedtls/md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md5.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md5.Tpo -c -o mbedtls/fldigi-md5.o `test -f 'mbedtls/md5.c' || echo '$(srcdir)/'`mbedtls/md5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md5.Tpo mbedtls/$(DEPDIR)/fldigi-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md5.c' object='mbedtls/fldigi-md5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md5.o `test -f 'mbedtls/md5.c' || echo '$(srcdir)/'`mbedtls/md5.c mbedtls/fldigi-md5.obj: mbedtls/md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md5.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md5.Tpo -c -o mbedtls/fldigi-md5.obj `if test -f 'mbedtls/md5.c'; then $(CYGPATH_W) 'mbedtls/md5.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md5.Tpo mbedtls/$(DEPDIR)/fldigi-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md5.c' object='mbedtls/fldigi-md5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md5.obj `if test -f 'mbedtls/md5.c'; then $(CYGPATH_W) 'mbedtls/md5.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md5.c'; fi` mbedtls/fldigi-md.o: mbedtls/md.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md.Tpo -c -o mbedtls/fldigi-md.o `test -f 'mbedtls/md.c' || echo '$(srcdir)/'`mbedtls/md.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md.Tpo mbedtls/$(DEPDIR)/fldigi-md.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md.c' object='mbedtls/fldigi-md.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md.o `test -f 'mbedtls/md.c' || echo '$(srcdir)/'`mbedtls/md.c mbedtls/fldigi-md.obj: mbedtls/md.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md.Tpo -c -o mbedtls/fldigi-md.obj `if test -f 'mbedtls/md.c'; then $(CYGPATH_W) 'mbedtls/md.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md.Tpo mbedtls/$(DEPDIR)/fldigi-md.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md.c' object='mbedtls/fldigi-md.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md.obj `if test -f 'mbedtls/md.c'; then $(CYGPATH_W) 'mbedtls/md.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md.c'; fi` mbedtls/fldigi-md_wrap.o: mbedtls/md_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md_wrap.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md_wrap.Tpo -c -o mbedtls/fldigi-md_wrap.o `test -f 'mbedtls/md_wrap.c' || echo '$(srcdir)/'`mbedtls/md_wrap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-md_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md_wrap.c' object='mbedtls/fldigi-md_wrap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md_wrap.o `test -f 'mbedtls/md_wrap.c' || echo '$(srcdir)/'`mbedtls/md_wrap.c mbedtls/fldigi-md_wrap.obj: mbedtls/md_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-md_wrap.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-md_wrap.Tpo -c -o mbedtls/fldigi-md_wrap.obj `if test -f 'mbedtls/md_wrap.c'; then $(CYGPATH_W) 'mbedtls/md_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md_wrap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-md_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-md_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/md_wrap.c' object='mbedtls/fldigi-md_wrap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-md_wrap.obj `if test -f 'mbedtls/md_wrap.c'; then $(CYGPATH_W) 'mbedtls/md_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/md_wrap.c'; fi` mbedtls/fldigi-memory_buffer_alloc.o: mbedtls/memory_buffer_alloc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-memory_buffer_alloc.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Tpo -c -o mbedtls/fldigi-memory_buffer_alloc.o `test -f 'mbedtls/memory_buffer_alloc.c' || echo '$(srcdir)/'`mbedtls/memory_buffer_alloc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Tpo mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/memory_buffer_alloc.c' object='mbedtls/fldigi-memory_buffer_alloc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-memory_buffer_alloc.o `test -f 'mbedtls/memory_buffer_alloc.c' || echo '$(srcdir)/'`mbedtls/memory_buffer_alloc.c mbedtls/fldigi-memory_buffer_alloc.obj: mbedtls/memory_buffer_alloc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-memory_buffer_alloc.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Tpo -c -o mbedtls/fldigi-memory_buffer_alloc.obj `if test -f 'mbedtls/memory_buffer_alloc.c'; then $(CYGPATH_W) 'mbedtls/memory_buffer_alloc.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/memory_buffer_alloc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Tpo mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/memory_buffer_alloc.c' object='mbedtls/fldigi-memory_buffer_alloc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-memory_buffer_alloc.obj `if test -f 'mbedtls/memory_buffer_alloc.c'; then $(CYGPATH_W) 'mbedtls/memory_buffer_alloc.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/memory_buffer_alloc.c'; fi` mbedtls/fldigi-net_sockets.o: mbedtls/net_sockets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-net_sockets.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-net_sockets.Tpo -c -o mbedtls/fldigi-net_sockets.o `test -f 'mbedtls/net_sockets.c' || echo '$(srcdir)/'`mbedtls/net_sockets.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-net_sockets.Tpo mbedtls/$(DEPDIR)/fldigi-net_sockets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/net_sockets.c' object='mbedtls/fldigi-net_sockets.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-net_sockets.o `test -f 'mbedtls/net_sockets.c' || echo '$(srcdir)/'`mbedtls/net_sockets.c mbedtls/fldigi-net_sockets.obj: mbedtls/net_sockets.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-net_sockets.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-net_sockets.Tpo -c -o mbedtls/fldigi-net_sockets.obj `if test -f 'mbedtls/net_sockets.c'; then $(CYGPATH_W) 'mbedtls/net_sockets.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/net_sockets.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-net_sockets.Tpo mbedtls/$(DEPDIR)/fldigi-net_sockets.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/net_sockets.c' object='mbedtls/fldigi-net_sockets.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-net_sockets.obj `if test -f 'mbedtls/net_sockets.c'; then $(CYGPATH_W) 'mbedtls/net_sockets.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/net_sockets.c'; fi` mbedtls/fldigi-nist_kw.o: mbedtls/nist_kw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-nist_kw.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-nist_kw.Tpo -c -o mbedtls/fldigi-nist_kw.o `test -f 'mbedtls/nist_kw.c' || echo '$(srcdir)/'`mbedtls/nist_kw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-nist_kw.Tpo mbedtls/$(DEPDIR)/fldigi-nist_kw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/nist_kw.c' object='mbedtls/fldigi-nist_kw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-nist_kw.o `test -f 'mbedtls/nist_kw.c' || echo '$(srcdir)/'`mbedtls/nist_kw.c mbedtls/fldigi-nist_kw.obj: mbedtls/nist_kw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-nist_kw.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-nist_kw.Tpo -c -o mbedtls/fldigi-nist_kw.obj `if test -f 'mbedtls/nist_kw.c'; then $(CYGPATH_W) 'mbedtls/nist_kw.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/nist_kw.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-nist_kw.Tpo mbedtls/$(DEPDIR)/fldigi-nist_kw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/nist_kw.c' object='mbedtls/fldigi-nist_kw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-nist_kw.obj `if test -f 'mbedtls/nist_kw.c'; then $(CYGPATH_W) 'mbedtls/nist_kw.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/nist_kw.c'; fi` mbedtls/fldigi-oid.o: mbedtls/oid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-oid.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-oid.Tpo -c -o mbedtls/fldigi-oid.o `test -f 'mbedtls/oid.c' || echo '$(srcdir)/'`mbedtls/oid.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-oid.Tpo mbedtls/$(DEPDIR)/fldigi-oid.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/oid.c' object='mbedtls/fldigi-oid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-oid.o `test -f 'mbedtls/oid.c' || echo '$(srcdir)/'`mbedtls/oid.c mbedtls/fldigi-oid.obj: mbedtls/oid.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-oid.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-oid.Tpo -c -o mbedtls/fldigi-oid.obj `if test -f 'mbedtls/oid.c'; then $(CYGPATH_W) 'mbedtls/oid.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/oid.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-oid.Tpo mbedtls/$(DEPDIR)/fldigi-oid.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/oid.c' object='mbedtls/fldigi-oid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-oid.obj `if test -f 'mbedtls/oid.c'; then $(CYGPATH_W) 'mbedtls/oid.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/oid.c'; fi` mbedtls/fldigi-padlock.o: mbedtls/padlock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-padlock.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-padlock.Tpo -c -o mbedtls/fldigi-padlock.o `test -f 'mbedtls/padlock.c' || echo '$(srcdir)/'`mbedtls/padlock.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-padlock.Tpo mbedtls/$(DEPDIR)/fldigi-padlock.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/padlock.c' object='mbedtls/fldigi-padlock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-padlock.o `test -f 'mbedtls/padlock.c' || echo '$(srcdir)/'`mbedtls/padlock.c mbedtls/fldigi-padlock.obj: mbedtls/padlock.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-padlock.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-padlock.Tpo -c -o mbedtls/fldigi-padlock.obj `if test -f 'mbedtls/padlock.c'; then $(CYGPATH_W) 'mbedtls/padlock.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/padlock.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-padlock.Tpo mbedtls/$(DEPDIR)/fldigi-padlock.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/padlock.c' object='mbedtls/fldigi-padlock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-padlock.obj `if test -f 'mbedtls/padlock.c'; then $(CYGPATH_W) 'mbedtls/padlock.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/padlock.c'; fi` mbedtls/fldigi-pem.o: mbedtls/pem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pem.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pem.Tpo -c -o mbedtls/fldigi-pem.o `test -f 'mbedtls/pem.c' || echo '$(srcdir)/'`mbedtls/pem.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pem.Tpo mbedtls/$(DEPDIR)/fldigi-pem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pem.c' object='mbedtls/fldigi-pem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pem.o `test -f 'mbedtls/pem.c' || echo '$(srcdir)/'`mbedtls/pem.c mbedtls/fldigi-pem.obj: mbedtls/pem.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pem.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pem.Tpo -c -o mbedtls/fldigi-pem.obj `if test -f 'mbedtls/pem.c'; then $(CYGPATH_W) 'mbedtls/pem.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pem.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pem.Tpo mbedtls/$(DEPDIR)/fldigi-pem.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pem.c' object='mbedtls/fldigi-pem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pem.obj `if test -f 'mbedtls/pem.c'; then $(CYGPATH_W) 'mbedtls/pem.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pem.c'; fi` mbedtls/fldigi-pk.o: mbedtls/pk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pk.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pk.Tpo -c -o mbedtls/fldigi-pk.o `test -f 'mbedtls/pk.c' || echo '$(srcdir)/'`mbedtls/pk.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pk.Tpo mbedtls/$(DEPDIR)/fldigi-pk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pk.c' object='mbedtls/fldigi-pk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pk.o `test -f 'mbedtls/pk.c' || echo '$(srcdir)/'`mbedtls/pk.c mbedtls/fldigi-pk.obj: mbedtls/pk.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pk.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pk.Tpo -c -o mbedtls/fldigi-pk.obj `if test -f 'mbedtls/pk.c'; then $(CYGPATH_W) 'mbedtls/pk.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pk.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pk.Tpo mbedtls/$(DEPDIR)/fldigi-pk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pk.c' object='mbedtls/fldigi-pk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pk.obj `if test -f 'mbedtls/pk.c'; then $(CYGPATH_W) 'mbedtls/pk.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pk.c'; fi` mbedtls/fldigi-pkcs11.o: mbedtls/pkcs11.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs11.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs11.Tpo -c -o mbedtls/fldigi-pkcs11.o `test -f 'mbedtls/pkcs11.c' || echo '$(srcdir)/'`mbedtls/pkcs11.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs11.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs11.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs11.c' object='mbedtls/fldigi-pkcs11.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs11.o `test -f 'mbedtls/pkcs11.c' || echo '$(srcdir)/'`mbedtls/pkcs11.c mbedtls/fldigi-pkcs11.obj: mbedtls/pkcs11.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs11.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs11.Tpo -c -o mbedtls/fldigi-pkcs11.obj `if test -f 'mbedtls/pkcs11.c'; then $(CYGPATH_W) 'mbedtls/pkcs11.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs11.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs11.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs11.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs11.c' object='mbedtls/fldigi-pkcs11.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs11.obj `if test -f 'mbedtls/pkcs11.c'; then $(CYGPATH_W) 'mbedtls/pkcs11.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs11.c'; fi` mbedtls/fldigi-pkcs12.o: mbedtls/pkcs12.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs12.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs12.Tpo -c -o mbedtls/fldigi-pkcs12.o `test -f 'mbedtls/pkcs12.c' || echo '$(srcdir)/'`mbedtls/pkcs12.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs12.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs12.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs12.c' object='mbedtls/fldigi-pkcs12.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs12.o `test -f 'mbedtls/pkcs12.c' || echo '$(srcdir)/'`mbedtls/pkcs12.c mbedtls/fldigi-pkcs12.obj: mbedtls/pkcs12.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs12.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs12.Tpo -c -o mbedtls/fldigi-pkcs12.obj `if test -f 'mbedtls/pkcs12.c'; then $(CYGPATH_W) 'mbedtls/pkcs12.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs12.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs12.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs12.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs12.c' object='mbedtls/fldigi-pkcs12.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs12.obj `if test -f 'mbedtls/pkcs12.c'; then $(CYGPATH_W) 'mbedtls/pkcs12.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs12.c'; fi` mbedtls/fldigi-pkcs5.o: mbedtls/pkcs5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs5.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs5.Tpo -c -o mbedtls/fldigi-pkcs5.o `test -f 'mbedtls/pkcs5.c' || echo '$(srcdir)/'`mbedtls/pkcs5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs5.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs5.c' object='mbedtls/fldigi-pkcs5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs5.o `test -f 'mbedtls/pkcs5.c' || echo '$(srcdir)/'`mbedtls/pkcs5.c mbedtls/fldigi-pkcs5.obj: mbedtls/pkcs5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkcs5.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkcs5.Tpo -c -o mbedtls/fldigi-pkcs5.obj `if test -f 'mbedtls/pkcs5.c'; then $(CYGPATH_W) 'mbedtls/pkcs5.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkcs5.Tpo mbedtls/$(DEPDIR)/fldigi-pkcs5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkcs5.c' object='mbedtls/fldigi-pkcs5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkcs5.obj `if test -f 'mbedtls/pkcs5.c'; then $(CYGPATH_W) 'mbedtls/pkcs5.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkcs5.c'; fi` mbedtls/fldigi-pkparse.o: mbedtls/pkparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkparse.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkparse.Tpo -c -o mbedtls/fldigi-pkparse.o `test -f 'mbedtls/pkparse.c' || echo '$(srcdir)/'`mbedtls/pkparse.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkparse.Tpo mbedtls/$(DEPDIR)/fldigi-pkparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkparse.c' object='mbedtls/fldigi-pkparse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkparse.o `test -f 'mbedtls/pkparse.c' || echo '$(srcdir)/'`mbedtls/pkparse.c mbedtls/fldigi-pkparse.obj: mbedtls/pkparse.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkparse.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkparse.Tpo -c -o mbedtls/fldigi-pkparse.obj `if test -f 'mbedtls/pkparse.c'; then $(CYGPATH_W) 'mbedtls/pkparse.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkparse.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkparse.Tpo mbedtls/$(DEPDIR)/fldigi-pkparse.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkparse.c' object='mbedtls/fldigi-pkparse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkparse.obj `if test -f 'mbedtls/pkparse.c'; then $(CYGPATH_W) 'mbedtls/pkparse.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkparse.c'; fi` mbedtls/fldigi-pk_wrap.o: mbedtls/pk_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pk_wrap.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pk_wrap.Tpo -c -o mbedtls/fldigi-pk_wrap.o `test -f 'mbedtls/pk_wrap.c' || echo '$(srcdir)/'`mbedtls/pk_wrap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pk_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-pk_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pk_wrap.c' object='mbedtls/fldigi-pk_wrap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pk_wrap.o `test -f 'mbedtls/pk_wrap.c' || echo '$(srcdir)/'`mbedtls/pk_wrap.c mbedtls/fldigi-pk_wrap.obj: mbedtls/pk_wrap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pk_wrap.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pk_wrap.Tpo -c -o mbedtls/fldigi-pk_wrap.obj `if test -f 'mbedtls/pk_wrap.c'; then $(CYGPATH_W) 'mbedtls/pk_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pk_wrap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pk_wrap.Tpo mbedtls/$(DEPDIR)/fldigi-pk_wrap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pk_wrap.c' object='mbedtls/fldigi-pk_wrap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pk_wrap.obj `if test -f 'mbedtls/pk_wrap.c'; then $(CYGPATH_W) 'mbedtls/pk_wrap.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pk_wrap.c'; fi` mbedtls/fldigi-pkwrite.o: mbedtls/pkwrite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkwrite.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkwrite.Tpo -c -o mbedtls/fldigi-pkwrite.o `test -f 'mbedtls/pkwrite.c' || echo '$(srcdir)/'`mbedtls/pkwrite.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkwrite.Tpo mbedtls/$(DEPDIR)/fldigi-pkwrite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkwrite.c' object='mbedtls/fldigi-pkwrite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkwrite.o `test -f 'mbedtls/pkwrite.c' || echo '$(srcdir)/'`mbedtls/pkwrite.c mbedtls/fldigi-pkwrite.obj: mbedtls/pkwrite.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-pkwrite.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-pkwrite.Tpo -c -o mbedtls/fldigi-pkwrite.obj `if test -f 'mbedtls/pkwrite.c'; then $(CYGPATH_W) 'mbedtls/pkwrite.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkwrite.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-pkwrite.Tpo mbedtls/$(DEPDIR)/fldigi-pkwrite.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/pkwrite.c' object='mbedtls/fldigi-pkwrite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-pkwrite.obj `if test -f 'mbedtls/pkwrite.c'; then $(CYGPATH_W) 'mbedtls/pkwrite.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/pkwrite.c'; fi` mbedtls/fldigi-platform.o: mbedtls/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-platform.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-platform.Tpo -c -o mbedtls/fldigi-platform.o `test -f 'mbedtls/platform.c' || echo '$(srcdir)/'`mbedtls/platform.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-platform.Tpo mbedtls/$(DEPDIR)/fldigi-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/platform.c' object='mbedtls/fldigi-platform.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-platform.o `test -f 'mbedtls/platform.c' || echo '$(srcdir)/'`mbedtls/platform.c mbedtls/fldigi-platform.obj: mbedtls/platform.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-platform.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-platform.Tpo -c -o mbedtls/fldigi-platform.obj `if test -f 'mbedtls/platform.c'; then $(CYGPATH_W) 'mbedtls/platform.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/platform.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-platform.Tpo mbedtls/$(DEPDIR)/fldigi-platform.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/platform.c' object='mbedtls/fldigi-platform.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-platform.obj `if test -f 'mbedtls/platform.c'; then $(CYGPATH_W) 'mbedtls/platform.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/platform.c'; fi` mbedtls/fldigi-platform_util.o: mbedtls/platform_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-platform_util.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-platform_util.Tpo -c -o mbedtls/fldigi-platform_util.o `test -f 'mbedtls/platform_util.c' || echo '$(srcdir)/'`mbedtls/platform_util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-platform_util.Tpo mbedtls/$(DEPDIR)/fldigi-platform_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/platform_util.c' object='mbedtls/fldigi-platform_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-platform_util.o `test -f 'mbedtls/platform_util.c' || echo '$(srcdir)/'`mbedtls/platform_util.c mbedtls/fldigi-platform_util.obj: mbedtls/platform_util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-platform_util.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-platform_util.Tpo -c -o mbedtls/fldigi-platform_util.obj `if test -f 'mbedtls/platform_util.c'; then $(CYGPATH_W) 'mbedtls/platform_util.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/platform_util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-platform_util.Tpo mbedtls/$(DEPDIR)/fldigi-platform_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/platform_util.c' object='mbedtls/fldigi-platform_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-platform_util.obj `if test -f 'mbedtls/platform_util.c'; then $(CYGPATH_W) 'mbedtls/platform_util.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/platform_util.c'; fi` mbedtls/fldigi-poly1305.o: mbedtls/poly1305.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-poly1305.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-poly1305.Tpo -c -o mbedtls/fldigi-poly1305.o `test -f 'mbedtls/poly1305.c' || echo '$(srcdir)/'`mbedtls/poly1305.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-poly1305.Tpo mbedtls/$(DEPDIR)/fldigi-poly1305.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/poly1305.c' object='mbedtls/fldigi-poly1305.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-poly1305.o `test -f 'mbedtls/poly1305.c' || echo '$(srcdir)/'`mbedtls/poly1305.c mbedtls/fldigi-poly1305.obj: mbedtls/poly1305.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-poly1305.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-poly1305.Tpo -c -o mbedtls/fldigi-poly1305.obj `if test -f 'mbedtls/poly1305.c'; then $(CYGPATH_W) 'mbedtls/poly1305.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/poly1305.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-poly1305.Tpo mbedtls/$(DEPDIR)/fldigi-poly1305.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/poly1305.c' object='mbedtls/fldigi-poly1305.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-poly1305.obj `if test -f 'mbedtls/poly1305.c'; then $(CYGPATH_W) 'mbedtls/poly1305.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/poly1305.c'; fi` mbedtls/fldigi-ripemd160.o: mbedtls/ripemd160.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ripemd160.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ripemd160.Tpo -c -o mbedtls/fldigi-ripemd160.o `test -f 'mbedtls/ripemd160.c' || echo '$(srcdir)/'`mbedtls/ripemd160.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ripemd160.Tpo mbedtls/$(DEPDIR)/fldigi-ripemd160.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ripemd160.c' object='mbedtls/fldigi-ripemd160.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ripemd160.o `test -f 'mbedtls/ripemd160.c' || echo '$(srcdir)/'`mbedtls/ripemd160.c mbedtls/fldigi-ripemd160.obj: mbedtls/ripemd160.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ripemd160.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ripemd160.Tpo -c -o mbedtls/fldigi-ripemd160.obj `if test -f 'mbedtls/ripemd160.c'; then $(CYGPATH_W) 'mbedtls/ripemd160.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ripemd160.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ripemd160.Tpo mbedtls/$(DEPDIR)/fldigi-ripemd160.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ripemd160.c' object='mbedtls/fldigi-ripemd160.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ripemd160.obj `if test -f 'mbedtls/ripemd160.c'; then $(CYGPATH_W) 'mbedtls/ripemd160.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ripemd160.c'; fi` mbedtls/fldigi-rsa.o: mbedtls/rsa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-rsa.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-rsa.Tpo -c -o mbedtls/fldigi-rsa.o `test -f 'mbedtls/rsa.c' || echo '$(srcdir)/'`mbedtls/rsa.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-rsa.Tpo mbedtls/$(DEPDIR)/fldigi-rsa.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/rsa.c' object='mbedtls/fldigi-rsa.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-rsa.o `test -f 'mbedtls/rsa.c' || echo '$(srcdir)/'`mbedtls/rsa.c mbedtls/fldigi-rsa.obj: mbedtls/rsa.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-rsa.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-rsa.Tpo -c -o mbedtls/fldigi-rsa.obj `if test -f 'mbedtls/rsa.c'; then $(CYGPATH_W) 'mbedtls/rsa.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/rsa.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-rsa.Tpo mbedtls/$(DEPDIR)/fldigi-rsa.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/rsa.c' object='mbedtls/fldigi-rsa.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-rsa.obj `if test -f 'mbedtls/rsa.c'; then $(CYGPATH_W) 'mbedtls/rsa.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/rsa.c'; fi` mbedtls/fldigi-rsa_internal.o: mbedtls/rsa_internal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-rsa_internal.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-rsa_internal.Tpo -c -o mbedtls/fldigi-rsa_internal.o `test -f 'mbedtls/rsa_internal.c' || echo '$(srcdir)/'`mbedtls/rsa_internal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-rsa_internal.Tpo mbedtls/$(DEPDIR)/fldigi-rsa_internal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/rsa_internal.c' object='mbedtls/fldigi-rsa_internal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-rsa_internal.o `test -f 'mbedtls/rsa_internal.c' || echo '$(srcdir)/'`mbedtls/rsa_internal.c mbedtls/fldigi-rsa_internal.obj: mbedtls/rsa_internal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-rsa_internal.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-rsa_internal.Tpo -c -o mbedtls/fldigi-rsa_internal.obj `if test -f 'mbedtls/rsa_internal.c'; then $(CYGPATH_W) 'mbedtls/rsa_internal.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/rsa_internal.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-rsa_internal.Tpo mbedtls/$(DEPDIR)/fldigi-rsa_internal.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/rsa_internal.c' object='mbedtls/fldigi-rsa_internal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-rsa_internal.obj `if test -f 'mbedtls/rsa_internal.c'; then $(CYGPATH_W) 'mbedtls/rsa_internal.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/rsa_internal.c'; fi` mbedtls/fldigi-sha1.o: mbedtls/sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha1.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha1.Tpo -c -o mbedtls/fldigi-sha1.o `test -f 'mbedtls/sha1.c' || echo '$(srcdir)/'`mbedtls/sha1.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha1.Tpo mbedtls/$(DEPDIR)/fldigi-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha1.c' object='mbedtls/fldigi-sha1.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha1.o `test -f 'mbedtls/sha1.c' || echo '$(srcdir)/'`mbedtls/sha1.c mbedtls/fldigi-sha1.obj: mbedtls/sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha1.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha1.Tpo -c -o mbedtls/fldigi-sha1.obj `if test -f 'mbedtls/sha1.c'; then $(CYGPATH_W) 'mbedtls/sha1.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha1.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha1.Tpo mbedtls/$(DEPDIR)/fldigi-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha1.c' object='mbedtls/fldigi-sha1.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha1.obj `if test -f 'mbedtls/sha1.c'; then $(CYGPATH_W) 'mbedtls/sha1.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha1.c'; fi` mbedtls/fldigi-sha256.o: mbedtls/sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha256.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha256.Tpo -c -o mbedtls/fldigi-sha256.o `test -f 'mbedtls/sha256.c' || echo '$(srcdir)/'`mbedtls/sha256.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha256.Tpo mbedtls/$(DEPDIR)/fldigi-sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha256.c' object='mbedtls/fldigi-sha256.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha256.o `test -f 'mbedtls/sha256.c' || echo '$(srcdir)/'`mbedtls/sha256.c mbedtls/fldigi-sha256.obj: mbedtls/sha256.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha256.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha256.Tpo -c -o mbedtls/fldigi-sha256.obj `if test -f 'mbedtls/sha256.c'; then $(CYGPATH_W) 'mbedtls/sha256.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha256.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha256.Tpo mbedtls/$(DEPDIR)/fldigi-sha256.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha256.c' object='mbedtls/fldigi-sha256.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha256.obj `if test -f 'mbedtls/sha256.c'; then $(CYGPATH_W) 'mbedtls/sha256.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha256.c'; fi` mbedtls/fldigi-sha512.o: mbedtls/sha512.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha512.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha512.Tpo -c -o mbedtls/fldigi-sha512.o `test -f 'mbedtls/sha512.c' || echo '$(srcdir)/'`mbedtls/sha512.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha512.Tpo mbedtls/$(DEPDIR)/fldigi-sha512.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha512.c' object='mbedtls/fldigi-sha512.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha512.o `test -f 'mbedtls/sha512.c' || echo '$(srcdir)/'`mbedtls/sha512.c mbedtls/fldigi-sha512.obj: mbedtls/sha512.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-sha512.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-sha512.Tpo -c -o mbedtls/fldigi-sha512.obj `if test -f 'mbedtls/sha512.c'; then $(CYGPATH_W) 'mbedtls/sha512.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha512.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-sha512.Tpo mbedtls/$(DEPDIR)/fldigi-sha512.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/sha512.c' object='mbedtls/fldigi-sha512.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-sha512.obj `if test -f 'mbedtls/sha512.c'; then $(CYGPATH_W) 'mbedtls/sha512.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/sha512.c'; fi` mbedtls/fldigi-ssl_cache.o: mbedtls/ssl_cache.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cache.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cache.Tpo -c -o mbedtls/fldigi-ssl_cache.o `test -f 'mbedtls/ssl_cache.c' || echo '$(srcdir)/'`mbedtls/ssl_cache.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cache.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cache.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cache.c' object='mbedtls/fldigi-ssl_cache.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cache.o `test -f 'mbedtls/ssl_cache.c' || echo '$(srcdir)/'`mbedtls/ssl_cache.c mbedtls/fldigi-ssl_cache.obj: mbedtls/ssl_cache.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cache.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cache.Tpo -c -o mbedtls/fldigi-ssl_cache.obj `if test -f 'mbedtls/ssl_cache.c'; then $(CYGPATH_W) 'mbedtls/ssl_cache.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cache.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cache.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cache.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cache.c' object='mbedtls/fldigi-ssl_cache.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cache.obj `if test -f 'mbedtls/ssl_cache.c'; then $(CYGPATH_W) 'mbedtls/ssl_cache.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cache.c'; fi` mbedtls/fldigi-ssl_ciphersuites.o: mbedtls/ssl_ciphersuites.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_ciphersuites.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Tpo -c -o mbedtls/fldigi-ssl_ciphersuites.o `test -f 'mbedtls/ssl_ciphersuites.c' || echo '$(srcdir)/'`mbedtls/ssl_ciphersuites.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_ciphersuites.c' object='mbedtls/fldigi-ssl_ciphersuites.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_ciphersuites.o `test -f 'mbedtls/ssl_ciphersuites.c' || echo '$(srcdir)/'`mbedtls/ssl_ciphersuites.c mbedtls/fldigi-ssl_ciphersuites.obj: mbedtls/ssl_ciphersuites.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_ciphersuites.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Tpo -c -o mbedtls/fldigi-ssl_ciphersuites.obj `if test -f 'mbedtls/ssl_ciphersuites.c'; then $(CYGPATH_W) 'mbedtls/ssl_ciphersuites.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_ciphersuites.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_ciphersuites.c' object='mbedtls/fldigi-ssl_ciphersuites.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_ciphersuites.obj `if test -f 'mbedtls/ssl_ciphersuites.c'; then $(CYGPATH_W) 'mbedtls/ssl_ciphersuites.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_ciphersuites.c'; fi` mbedtls/fldigi-ssl_cli.o: mbedtls/ssl_cli.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cli.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cli.Tpo -c -o mbedtls/fldigi-ssl_cli.o `test -f 'mbedtls/ssl_cli.c' || echo '$(srcdir)/'`mbedtls/ssl_cli.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cli.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cli.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cli.c' object='mbedtls/fldigi-ssl_cli.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cli.o `test -f 'mbedtls/ssl_cli.c' || echo '$(srcdir)/'`mbedtls/ssl_cli.c mbedtls/fldigi-ssl_cli.obj: mbedtls/ssl_cli.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cli.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cli.Tpo -c -o mbedtls/fldigi-ssl_cli.obj `if test -f 'mbedtls/ssl_cli.c'; then $(CYGPATH_W) 'mbedtls/ssl_cli.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cli.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cli.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cli.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cli.c' object='mbedtls/fldigi-ssl_cli.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cli.obj `if test -f 'mbedtls/ssl_cli.c'; then $(CYGPATH_W) 'mbedtls/ssl_cli.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cli.c'; fi` mbedtls/fldigi-ssl_cookie.o: mbedtls/ssl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cookie.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Tpo -c -o mbedtls/fldigi-ssl_cookie.o `test -f 'mbedtls/ssl_cookie.c' || echo '$(srcdir)/'`mbedtls/ssl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cookie.c' object='mbedtls/fldigi-ssl_cookie.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cookie.o `test -f 'mbedtls/ssl_cookie.c' || echo '$(srcdir)/'`mbedtls/ssl_cookie.c mbedtls/fldigi-ssl_cookie.obj: mbedtls/ssl_cookie.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_cookie.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Tpo -c -o mbedtls/fldigi-ssl_cookie.obj `if test -f 'mbedtls/ssl_cookie.c'; then $(CYGPATH_W) 'mbedtls/ssl_cookie.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cookie.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_cookie.c' object='mbedtls/fldigi-ssl_cookie.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_cookie.obj `if test -f 'mbedtls/ssl_cookie.c'; then $(CYGPATH_W) 'mbedtls/ssl_cookie.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_cookie.c'; fi` mbedtls/fldigi-ssl_srv.o: mbedtls/ssl_srv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_srv.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_srv.Tpo -c -o mbedtls/fldigi-ssl_srv.o `test -f 'mbedtls/ssl_srv.c' || echo '$(srcdir)/'`mbedtls/ssl_srv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_srv.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_srv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_srv.c' object='mbedtls/fldigi-ssl_srv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_srv.o `test -f 'mbedtls/ssl_srv.c' || echo '$(srcdir)/'`mbedtls/ssl_srv.c mbedtls/fldigi-ssl_srv.obj: mbedtls/ssl_srv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_srv.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_srv.Tpo -c -o mbedtls/fldigi-ssl_srv.obj `if test -f 'mbedtls/ssl_srv.c'; then $(CYGPATH_W) 'mbedtls/ssl_srv.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_srv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_srv.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_srv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_srv.c' object='mbedtls/fldigi-ssl_srv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_srv.obj `if test -f 'mbedtls/ssl_srv.c'; then $(CYGPATH_W) 'mbedtls/ssl_srv.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_srv.c'; fi` mbedtls/fldigi-ssl_ticket.o: mbedtls/ssl_ticket.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_ticket.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Tpo -c -o mbedtls/fldigi-ssl_ticket.o `test -f 'mbedtls/ssl_ticket.c' || echo '$(srcdir)/'`mbedtls/ssl_ticket.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_ticket.c' object='mbedtls/fldigi-ssl_ticket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_ticket.o `test -f 'mbedtls/ssl_ticket.c' || echo '$(srcdir)/'`mbedtls/ssl_ticket.c mbedtls/fldigi-ssl_ticket.obj: mbedtls/ssl_ticket.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_ticket.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Tpo -c -o mbedtls/fldigi-ssl_ticket.obj `if test -f 'mbedtls/ssl_ticket.c'; then $(CYGPATH_W) 'mbedtls/ssl_ticket.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_ticket.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_ticket.c' object='mbedtls/fldigi-ssl_ticket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_ticket.obj `if test -f 'mbedtls/ssl_ticket.c'; then $(CYGPATH_W) 'mbedtls/ssl_ticket.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_ticket.c'; fi` mbedtls/fldigi-ssl_tls.o: mbedtls/ssl_tls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_tls.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_tls.Tpo -c -o mbedtls/fldigi-ssl_tls.o `test -f 'mbedtls/ssl_tls.c' || echo '$(srcdir)/'`mbedtls/ssl_tls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_tls.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_tls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_tls.c' object='mbedtls/fldigi-ssl_tls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_tls.o `test -f 'mbedtls/ssl_tls.c' || echo '$(srcdir)/'`mbedtls/ssl_tls.c mbedtls/fldigi-ssl_tls.obj: mbedtls/ssl_tls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-ssl_tls.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-ssl_tls.Tpo -c -o mbedtls/fldigi-ssl_tls.obj `if test -f 'mbedtls/ssl_tls.c'; then $(CYGPATH_W) 'mbedtls/ssl_tls.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_tls.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-ssl_tls.Tpo mbedtls/$(DEPDIR)/fldigi-ssl_tls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/ssl_tls.c' object='mbedtls/fldigi-ssl_tls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-ssl_tls.obj `if test -f 'mbedtls/ssl_tls.c'; then $(CYGPATH_W) 'mbedtls/ssl_tls.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/ssl_tls.c'; fi` mbedtls/fldigi-threading.o: mbedtls/threading.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-threading.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-threading.Tpo -c -o mbedtls/fldigi-threading.o `test -f 'mbedtls/threading.c' || echo '$(srcdir)/'`mbedtls/threading.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-threading.Tpo mbedtls/$(DEPDIR)/fldigi-threading.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/threading.c' object='mbedtls/fldigi-threading.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-threading.o `test -f 'mbedtls/threading.c' || echo '$(srcdir)/'`mbedtls/threading.c mbedtls/fldigi-threading.obj: mbedtls/threading.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-threading.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-threading.Tpo -c -o mbedtls/fldigi-threading.obj `if test -f 'mbedtls/threading.c'; then $(CYGPATH_W) 'mbedtls/threading.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/threading.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-threading.Tpo mbedtls/$(DEPDIR)/fldigi-threading.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/threading.c' object='mbedtls/fldigi-threading.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-threading.obj `if test -f 'mbedtls/threading.c'; then $(CYGPATH_W) 'mbedtls/threading.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/threading.c'; fi` mbedtls/fldigi-timing.o: mbedtls/timing.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-timing.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-timing.Tpo -c -o mbedtls/fldigi-timing.o `test -f 'mbedtls/timing.c' || echo '$(srcdir)/'`mbedtls/timing.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-timing.Tpo mbedtls/$(DEPDIR)/fldigi-timing.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/timing.c' object='mbedtls/fldigi-timing.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-timing.o `test -f 'mbedtls/timing.c' || echo '$(srcdir)/'`mbedtls/timing.c mbedtls/fldigi-timing.obj: mbedtls/timing.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-timing.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-timing.Tpo -c -o mbedtls/fldigi-timing.obj `if test -f 'mbedtls/timing.c'; then $(CYGPATH_W) 'mbedtls/timing.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/timing.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-timing.Tpo mbedtls/$(DEPDIR)/fldigi-timing.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/timing.c' object='mbedtls/fldigi-timing.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-timing.obj `if test -f 'mbedtls/timing.c'; then $(CYGPATH_W) 'mbedtls/timing.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/timing.c'; fi` mbedtls/fldigi-version.o: mbedtls/version.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-version.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-version.Tpo -c -o mbedtls/fldigi-version.o `test -f 'mbedtls/version.c' || echo '$(srcdir)/'`mbedtls/version.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-version.Tpo mbedtls/$(DEPDIR)/fldigi-version.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/version.c' object='mbedtls/fldigi-version.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-version.o `test -f 'mbedtls/version.c' || echo '$(srcdir)/'`mbedtls/version.c mbedtls/fldigi-version.obj: mbedtls/version.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-version.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-version.Tpo -c -o mbedtls/fldigi-version.obj `if test -f 'mbedtls/version.c'; then $(CYGPATH_W) 'mbedtls/version.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/version.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-version.Tpo mbedtls/$(DEPDIR)/fldigi-version.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/version.c' object='mbedtls/fldigi-version.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-version.obj `if test -f 'mbedtls/version.c'; then $(CYGPATH_W) 'mbedtls/version.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/version.c'; fi` mbedtls/fldigi-version_features.o: mbedtls/version_features.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-version_features.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-version_features.Tpo -c -o mbedtls/fldigi-version_features.o `test -f 'mbedtls/version_features.c' || echo '$(srcdir)/'`mbedtls/version_features.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-version_features.Tpo mbedtls/$(DEPDIR)/fldigi-version_features.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/version_features.c' object='mbedtls/fldigi-version_features.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-version_features.o `test -f 'mbedtls/version_features.c' || echo '$(srcdir)/'`mbedtls/version_features.c mbedtls/fldigi-version_features.obj: mbedtls/version_features.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-version_features.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-version_features.Tpo -c -o mbedtls/fldigi-version_features.obj `if test -f 'mbedtls/version_features.c'; then $(CYGPATH_W) 'mbedtls/version_features.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/version_features.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-version_features.Tpo mbedtls/$(DEPDIR)/fldigi-version_features.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/version_features.c' object='mbedtls/fldigi-version_features.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-version_features.obj `if test -f 'mbedtls/version_features.c'; then $(CYGPATH_W) 'mbedtls/version_features.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/version_features.c'; fi` mbedtls/fldigi-x509.o: mbedtls/x509.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509.Tpo -c -o mbedtls/fldigi-x509.o `test -f 'mbedtls/x509.c' || echo '$(srcdir)/'`mbedtls/x509.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509.Tpo mbedtls/$(DEPDIR)/fldigi-x509.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509.c' object='mbedtls/fldigi-x509.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509.o `test -f 'mbedtls/x509.c' || echo '$(srcdir)/'`mbedtls/x509.c mbedtls/fldigi-x509.obj: mbedtls/x509.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509.Tpo -c -o mbedtls/fldigi-x509.obj `if test -f 'mbedtls/x509.c'; then $(CYGPATH_W) 'mbedtls/x509.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509.Tpo mbedtls/$(DEPDIR)/fldigi-x509.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509.c' object='mbedtls/fldigi-x509.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509.obj `if test -f 'mbedtls/x509.c'; then $(CYGPATH_W) 'mbedtls/x509.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509.c'; fi` mbedtls/fldigi-x509_create.o: mbedtls/x509_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_create.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_create.Tpo -c -o mbedtls/fldigi-x509_create.o `test -f 'mbedtls/x509_create.c' || echo '$(srcdir)/'`mbedtls/x509_create.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_create.Tpo mbedtls/$(DEPDIR)/fldigi-x509_create.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_create.c' object='mbedtls/fldigi-x509_create.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_create.o `test -f 'mbedtls/x509_create.c' || echo '$(srcdir)/'`mbedtls/x509_create.c mbedtls/fldigi-x509_create.obj: mbedtls/x509_create.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_create.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_create.Tpo -c -o mbedtls/fldigi-x509_create.obj `if test -f 'mbedtls/x509_create.c'; then $(CYGPATH_W) 'mbedtls/x509_create.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_create.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_create.Tpo mbedtls/$(DEPDIR)/fldigi-x509_create.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_create.c' object='mbedtls/fldigi-x509_create.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_create.obj `if test -f 'mbedtls/x509_create.c'; then $(CYGPATH_W) 'mbedtls/x509_create.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_create.c'; fi` mbedtls/fldigi-x509_crl.o: mbedtls/x509_crl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_crl.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_crl.Tpo -c -o mbedtls/fldigi-x509_crl.o `test -f 'mbedtls/x509_crl.c' || echo '$(srcdir)/'`mbedtls/x509_crl.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_crl.Tpo mbedtls/$(DEPDIR)/fldigi-x509_crl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_crl.c' object='mbedtls/fldigi-x509_crl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_crl.o `test -f 'mbedtls/x509_crl.c' || echo '$(srcdir)/'`mbedtls/x509_crl.c mbedtls/fldigi-x509_crl.obj: mbedtls/x509_crl.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_crl.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_crl.Tpo -c -o mbedtls/fldigi-x509_crl.obj `if test -f 'mbedtls/x509_crl.c'; then $(CYGPATH_W) 'mbedtls/x509_crl.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_crl.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_crl.Tpo mbedtls/$(DEPDIR)/fldigi-x509_crl.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_crl.c' object='mbedtls/fldigi-x509_crl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_crl.obj `if test -f 'mbedtls/x509_crl.c'; then $(CYGPATH_W) 'mbedtls/x509_crl.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_crl.c'; fi` mbedtls/fldigi-x509_crt.o: mbedtls/x509_crt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_crt.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_crt.Tpo -c -o mbedtls/fldigi-x509_crt.o `test -f 'mbedtls/x509_crt.c' || echo '$(srcdir)/'`mbedtls/x509_crt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_crt.Tpo mbedtls/$(DEPDIR)/fldigi-x509_crt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_crt.c' object='mbedtls/fldigi-x509_crt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_crt.o `test -f 'mbedtls/x509_crt.c' || echo '$(srcdir)/'`mbedtls/x509_crt.c mbedtls/fldigi-x509_crt.obj: mbedtls/x509_crt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_crt.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_crt.Tpo -c -o mbedtls/fldigi-x509_crt.obj `if test -f 'mbedtls/x509_crt.c'; then $(CYGPATH_W) 'mbedtls/x509_crt.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_crt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_crt.Tpo mbedtls/$(DEPDIR)/fldigi-x509_crt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_crt.c' object='mbedtls/fldigi-x509_crt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_crt.obj `if test -f 'mbedtls/x509_crt.c'; then $(CYGPATH_W) 'mbedtls/x509_crt.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_crt.c'; fi` mbedtls/fldigi-x509_csr.o: mbedtls/x509_csr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_csr.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_csr.Tpo -c -o mbedtls/fldigi-x509_csr.o `test -f 'mbedtls/x509_csr.c' || echo '$(srcdir)/'`mbedtls/x509_csr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_csr.Tpo mbedtls/$(DEPDIR)/fldigi-x509_csr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_csr.c' object='mbedtls/fldigi-x509_csr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_csr.o `test -f 'mbedtls/x509_csr.c' || echo '$(srcdir)/'`mbedtls/x509_csr.c mbedtls/fldigi-x509_csr.obj: mbedtls/x509_csr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509_csr.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509_csr.Tpo -c -o mbedtls/fldigi-x509_csr.obj `if test -f 'mbedtls/x509_csr.c'; then $(CYGPATH_W) 'mbedtls/x509_csr.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_csr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509_csr.Tpo mbedtls/$(DEPDIR)/fldigi-x509_csr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509_csr.c' object='mbedtls/fldigi-x509_csr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509_csr.obj `if test -f 'mbedtls/x509_csr.c'; then $(CYGPATH_W) 'mbedtls/x509_csr.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509_csr.c'; fi` mbedtls/fldigi-x509write_crt.o: mbedtls/x509write_crt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509write_crt.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509write_crt.Tpo -c -o mbedtls/fldigi-x509write_crt.o `test -f 'mbedtls/x509write_crt.c' || echo '$(srcdir)/'`mbedtls/x509write_crt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509write_crt.Tpo mbedtls/$(DEPDIR)/fldigi-x509write_crt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509write_crt.c' object='mbedtls/fldigi-x509write_crt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509write_crt.o `test -f 'mbedtls/x509write_crt.c' || echo '$(srcdir)/'`mbedtls/x509write_crt.c mbedtls/fldigi-x509write_crt.obj: mbedtls/x509write_crt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509write_crt.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509write_crt.Tpo -c -o mbedtls/fldigi-x509write_crt.obj `if test -f 'mbedtls/x509write_crt.c'; then $(CYGPATH_W) 'mbedtls/x509write_crt.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509write_crt.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509write_crt.Tpo mbedtls/$(DEPDIR)/fldigi-x509write_crt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509write_crt.c' object='mbedtls/fldigi-x509write_crt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509write_crt.obj `if test -f 'mbedtls/x509write_crt.c'; then $(CYGPATH_W) 'mbedtls/x509write_crt.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509write_crt.c'; fi` mbedtls/fldigi-x509write_csr.o: mbedtls/x509write_csr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509write_csr.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509write_csr.Tpo -c -o mbedtls/fldigi-x509write_csr.o `test -f 'mbedtls/x509write_csr.c' || echo '$(srcdir)/'`mbedtls/x509write_csr.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509write_csr.Tpo mbedtls/$(DEPDIR)/fldigi-x509write_csr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509write_csr.c' object='mbedtls/fldigi-x509write_csr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509write_csr.o `test -f 'mbedtls/x509write_csr.c' || echo '$(srcdir)/'`mbedtls/x509write_csr.c mbedtls/fldigi-x509write_csr.obj: mbedtls/x509write_csr.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-x509write_csr.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-x509write_csr.Tpo -c -o mbedtls/fldigi-x509write_csr.obj `if test -f 'mbedtls/x509write_csr.c'; then $(CYGPATH_W) 'mbedtls/x509write_csr.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509write_csr.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-x509write_csr.Tpo mbedtls/$(DEPDIR)/fldigi-x509write_csr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/x509write_csr.c' object='mbedtls/fldigi-x509write_csr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-x509write_csr.obj `if test -f 'mbedtls/x509write_csr.c'; then $(CYGPATH_W) 'mbedtls/x509write_csr.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/x509write_csr.c'; fi` mbedtls/fldigi-xtea.o: mbedtls/xtea.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-xtea.o -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-xtea.Tpo -c -o mbedtls/fldigi-xtea.o `test -f 'mbedtls/xtea.c' || echo '$(srcdir)/'`mbedtls/xtea.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-xtea.Tpo mbedtls/$(DEPDIR)/fldigi-xtea.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/xtea.c' object='mbedtls/fldigi-xtea.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-xtea.o `test -f 'mbedtls/xtea.c' || echo '$(srcdir)/'`mbedtls/xtea.c mbedtls/fldigi-xtea.obj: mbedtls/xtea.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT mbedtls/fldigi-xtea.obj -MD -MP -MF mbedtls/$(DEPDIR)/fldigi-xtea.Tpo -c -o mbedtls/fldigi-xtea.obj `if test -f 'mbedtls/xtea.c'; then $(CYGPATH_W) 'mbedtls/xtea.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/xtea.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) mbedtls/$(DEPDIR)/fldigi-xtea.Tpo mbedtls/$(DEPDIR)/fldigi-xtea.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mbedtls/xtea.c' object='mbedtls/fldigi-xtea.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o mbedtls/fldigi-xtea.obj `if test -f 'mbedtls/xtea.c'; then $(CYGPATH_W) 'mbedtls/xtea.c'; else $(CYGPATH_W) '$(srcdir)/mbedtls/xtea.c'; fi` compat/fldigi-regex.o: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-regex.o -MD -MP -MF compat/$(DEPDIR)/fldigi-regex.Tpo -c -o compat/fldigi-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-regex.Tpo compat/$(DEPDIR)/fldigi-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='compat/fldigi-regex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-regex.o `test -f 'compat/regex.c' || echo '$(srcdir)/'`compat/regex.c compat/fldigi-regex.obj: compat/regex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-regex.obj -MD -MP -MF compat/$(DEPDIR)/fldigi-regex.Tpo -c -o compat/fldigi-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-regex.Tpo compat/$(DEPDIR)/fldigi-regex.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/regex.c' object='compat/fldigi-regex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-regex.obj `if test -f 'compat/regex.c'; then $(CYGPATH_W) 'compat/regex.c'; else $(CYGPATH_W) '$(srcdir)/compat/regex.c'; fi` compat/fldigi-getsysinfo.o: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-getsysinfo.o -MD -MP -MF compat/$(DEPDIR)/fldigi-getsysinfo.Tpo -c -o compat/fldigi-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-getsysinfo.Tpo compat/$(DEPDIR)/fldigi-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='compat/fldigi-getsysinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-getsysinfo.o `test -f 'compat/getsysinfo.c' || echo '$(srcdir)/'`compat/getsysinfo.c compat/fldigi-getsysinfo.obj: compat/getsysinfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-getsysinfo.obj -MD -MP -MF compat/$(DEPDIR)/fldigi-getsysinfo.Tpo -c -o compat/fldigi-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-getsysinfo.Tpo compat/$(DEPDIR)/fldigi-getsysinfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/getsysinfo.c' object='compat/fldigi-getsysinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-getsysinfo.obj `if test -f 'compat/getsysinfo.c'; then $(CYGPATH_W) 'compat/getsysinfo.c'; else $(CYGPATH_W) '$(srcdir)/compat/getsysinfo.c'; fi` compat/fldigi-mingw.o: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-mingw.o -MD -MP -MF compat/$(DEPDIR)/fldigi-mingw.Tpo -c -o compat/fldigi-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-mingw.Tpo compat/$(DEPDIR)/fldigi-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='compat/fldigi-mingw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-mingw.o `test -f 'compat/mingw.c' || echo '$(srcdir)/'`compat/mingw.c compat/fldigi-mingw.obj: compat/mingw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT compat/fldigi-mingw.obj -MD -MP -MF compat/$(DEPDIR)/fldigi-mingw.Tpo -c -o compat/fldigi-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) compat/$(DEPDIR)/fldigi-mingw.Tpo compat/$(DEPDIR)/fldigi-mingw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='compat/mingw.c' object='compat/fldigi-mingw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o compat/fldigi-mingw.obj `if test -f 'compat/mingw.c'; then $(CYGPATH_W) 'compat/mingw.c'; else $(CYGPATH_W) '$(srcdir)/compat/mingw.c'; fi` libtiniconv/fldigi-tiniconv.o: libtiniconv/tiniconv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT libtiniconv/fldigi-tiniconv.o -MD -MP -MF libtiniconv/$(DEPDIR)/fldigi-tiniconv.Tpo -c -o libtiniconv/fldigi-tiniconv.o `test -f 'libtiniconv/tiniconv.c' || echo '$(srcdir)/'`libtiniconv/tiniconv.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtiniconv/$(DEPDIR)/fldigi-tiniconv.Tpo libtiniconv/$(DEPDIR)/fldigi-tiniconv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv.c' object='libtiniconv/fldigi-tiniconv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o libtiniconv/fldigi-tiniconv.o `test -f 'libtiniconv/tiniconv.c' || echo '$(srcdir)/'`libtiniconv/tiniconv.c libtiniconv/fldigi-tiniconv.obj: libtiniconv/tiniconv.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT libtiniconv/fldigi-tiniconv.obj -MD -MP -MF libtiniconv/$(DEPDIR)/fldigi-tiniconv.Tpo -c -o libtiniconv/fldigi-tiniconv.obj `if test -f 'libtiniconv/tiniconv.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtiniconv/$(DEPDIR)/fldigi-tiniconv.Tpo libtiniconv/$(DEPDIR)/fldigi-tiniconv.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv.c' object='libtiniconv/fldigi-tiniconv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o libtiniconv/fldigi-tiniconv.obj `if test -f 'libtiniconv/tiniconv.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv.c'; fi` libtiniconv/fldigi-tiniconv_desc.o: libtiniconv/tiniconv_desc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT libtiniconv/fldigi-tiniconv_desc.o -MD -MP -MF libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Tpo -c -o libtiniconv/fldigi-tiniconv_desc.o `test -f 'libtiniconv/tiniconv_desc.c' || echo '$(srcdir)/'`libtiniconv/tiniconv_desc.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Tpo libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv_desc.c' object='libtiniconv/fldigi-tiniconv_desc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o libtiniconv/fldigi-tiniconv_desc.o `test -f 'libtiniconv/tiniconv_desc.c' || echo '$(srcdir)/'`libtiniconv/tiniconv_desc.c libtiniconv/fldigi-tiniconv_desc.obj: libtiniconv/tiniconv_desc.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -MT libtiniconv/fldigi-tiniconv_desc.obj -MD -MP -MF libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Tpo -c -o libtiniconv/fldigi-tiniconv_desc.obj `if test -f 'libtiniconv/tiniconv_desc.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv_desc.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv_desc.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Tpo libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtiniconv/tiniconv_desc.c' object='libtiniconv/fldigi-tiniconv_desc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CFLAGS) $(CFLAGS) -c -o libtiniconv/fldigi-tiniconv_desc.obj `if test -f 'libtiniconv/tiniconv_desc.c'; then $(CYGPATH_W) 'libtiniconv/tiniconv_desc.c'; else $(CYGPATH_W) '$(srcdir)/libtiniconv/tiniconv_desc.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` xmlrpcpp/flarq-XmlRpcClient.o: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcClient.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Tpo -c -o xmlrpcpp/flarq-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='xmlrpcpp/flarq-XmlRpcClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp xmlrpcpp/flarq-XmlRpcClient.obj: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcClient.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Tpo -c -o xmlrpcpp/flarq-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='xmlrpcpp/flarq-XmlRpcClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` xmlrpcpp/flarq-XmlRpcDispatch.o: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcDispatch.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Tpo -c -o xmlrpcpp/flarq-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='xmlrpcpp/flarq-XmlRpcDispatch.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp xmlrpcpp/flarq-XmlRpcDispatch.obj: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcDispatch.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Tpo -c -o xmlrpcpp/flarq-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='xmlrpcpp/flarq-XmlRpcDispatch.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` xmlrpcpp/flarq-XmlRpcMutex.o: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcMutex.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Tpo -c -o xmlrpcpp/flarq-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='xmlrpcpp/flarq-XmlRpcMutex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp xmlrpcpp/flarq-XmlRpcMutex.obj: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcMutex.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Tpo -c -o xmlrpcpp/flarq-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='xmlrpcpp/flarq-XmlRpcMutex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` xmlrpcpp/flarq-XmlRpcServerConnection.o: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServerConnection.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Tpo -c -o xmlrpcpp/flarq-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='xmlrpcpp/flarq-XmlRpcServerConnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp xmlrpcpp/flarq-XmlRpcServerConnection.obj: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServerConnection.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Tpo -c -o xmlrpcpp/flarq-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='xmlrpcpp/flarq-XmlRpcServerConnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` xmlrpcpp/flarq-XmlRpcServer.o: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServer.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Tpo -c -o xmlrpcpp/flarq-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='xmlrpcpp/flarq-XmlRpcServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp xmlrpcpp/flarq-XmlRpcServer.obj: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServer.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Tpo -c -o xmlrpcpp/flarq-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='xmlrpcpp/flarq-XmlRpcServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` xmlrpcpp/flarq-XmlRpcServerMethod.o: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServerMethod.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Tpo -c -o xmlrpcpp/flarq-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='xmlrpcpp/flarq-XmlRpcServerMethod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp xmlrpcpp/flarq-XmlRpcServerMethod.obj: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcServerMethod.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Tpo -c -o xmlrpcpp/flarq-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='xmlrpcpp/flarq-XmlRpcServerMethod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` xmlrpcpp/flarq-XmlRpcSocket.o: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcSocket.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Tpo -c -o xmlrpcpp/flarq-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='xmlrpcpp/flarq-XmlRpcSocket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp xmlrpcpp/flarq-XmlRpcSocket.obj: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcSocket.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Tpo -c -o xmlrpcpp/flarq-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='xmlrpcpp/flarq-XmlRpcSocket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` xmlrpcpp/flarq-XmlRpcSource.o: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcSource.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Tpo -c -o xmlrpcpp/flarq-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='xmlrpcpp/flarq-XmlRpcSource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp xmlrpcpp/flarq-XmlRpcSource.obj: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcSource.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Tpo -c -o xmlrpcpp/flarq-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='xmlrpcpp/flarq-XmlRpcSource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` xmlrpcpp/flarq-XmlRpcUtil.o: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcUtil.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Tpo -c -o xmlrpcpp/flarq-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='xmlrpcpp/flarq-XmlRpcUtil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp xmlrpcpp/flarq-XmlRpcUtil.obj: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcUtil.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Tpo -c -o xmlrpcpp/flarq-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='xmlrpcpp/flarq-XmlRpcUtil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` xmlrpcpp/flarq-XmlRpcValue.o: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcValue.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Tpo -c -o xmlrpcpp/flarq-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='xmlrpcpp/flarq-XmlRpcValue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp xmlrpcpp/flarq-XmlRpcValue.obj: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/flarq-XmlRpcValue.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Tpo -c -o xmlrpcpp/flarq-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Tpo xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='xmlrpcpp/flarq-XmlRpcValue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/flarq-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` misc/flarq-stack.o: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-stack.o -MD -MP -MF misc/$(DEPDIR)/flarq-stack.Tpo -c -o misc/flarq-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-stack.Tpo misc/$(DEPDIR)/flarq-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='misc/flarq-stack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx misc/flarq-stack.obj: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-stack.obj -MD -MP -MF misc/$(DEPDIR)/flarq-stack.Tpo -c -o misc/flarq-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-stack.Tpo misc/$(DEPDIR)/flarq-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='misc/flarq-stack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` misc/flarq-nls.o: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-nls.o -MD -MP -MF misc/$(DEPDIR)/flarq-nls.Tpo -c -o misc/flarq-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-nls.Tpo misc/$(DEPDIR)/flarq-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='misc/flarq-nls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx misc/flarq-nls.obj: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-nls.obj -MD -MP -MF misc/$(DEPDIR)/flarq-nls.Tpo -c -o misc/flarq-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-nls.Tpo misc/$(DEPDIR)/flarq-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='misc/flarq-nls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` dialogs/flarq-font_browser.o: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT dialogs/flarq-font_browser.o -MD -MP -MF dialogs/$(DEPDIR)/flarq-font_browser.Tpo -c -o dialogs/flarq-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/flarq-font_browser.Tpo dialogs/$(DEPDIR)/flarq-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='dialogs/flarq-font_browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/flarq-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx dialogs/flarq-font_browser.obj: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT dialogs/flarq-font_browser.obj -MD -MP -MF dialogs/$(DEPDIR)/flarq-font_browser.Tpo -c -o dialogs/flarq-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/flarq-font_browser.Tpo dialogs/$(DEPDIR)/flarq-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='dialogs/flarq-font_browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/flarq-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` flarq-src/flarq-arq.o: flarq-src/arq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arq.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arq.Tpo -c -o flarq-src/flarq-arq.o `test -f 'flarq-src/arq.cxx' || echo '$(srcdir)/'`flarq-src/arq.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arq.Tpo flarq-src/$(DEPDIR)/flarq-arq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arq.cxx' object='flarq-src/flarq-arq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arq.o `test -f 'flarq-src/arq.cxx' || echo '$(srcdir)/'`flarq-src/arq.cxx flarq-src/flarq-arq.obj: flarq-src/arq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arq.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arq.Tpo -c -o flarq-src/flarq-arq.obj `if test -f 'flarq-src/arq.cxx'; then $(CYGPATH_W) 'flarq-src/arq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arq.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arq.Tpo flarq-src/$(DEPDIR)/flarq-arq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arq.cxx' object='flarq-src/flarq-arq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arq.obj `if test -f 'flarq-src/arq.cxx'; then $(CYGPATH_W) 'flarq-src/arq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arq.cxx'; fi` flarq-src/flarq-arqdialogs.o: flarq-src/arqdialogs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arqdialogs.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arqdialogs.Tpo -c -o flarq-src/flarq-arqdialogs.o `test -f 'flarq-src/arqdialogs.cxx' || echo '$(srcdir)/'`flarq-src/arqdialogs.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arqdialogs.Tpo flarq-src/$(DEPDIR)/flarq-arqdialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqdialogs.cxx' object='flarq-src/flarq-arqdialogs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arqdialogs.o `test -f 'flarq-src/arqdialogs.cxx' || echo '$(srcdir)/'`flarq-src/arqdialogs.cxx flarq-src/flarq-arqdialogs.obj: flarq-src/arqdialogs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arqdialogs.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arqdialogs.Tpo -c -o flarq-src/flarq-arqdialogs.obj `if test -f 'flarq-src/arqdialogs.cxx'; then $(CYGPATH_W) 'flarq-src/arqdialogs.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqdialogs.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arqdialogs.Tpo flarq-src/$(DEPDIR)/flarq-arqdialogs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqdialogs.cxx' object='flarq-src/flarq-arqdialogs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arqdialogs.obj `if test -f 'flarq-src/arqdialogs.cxx'; then $(CYGPATH_W) 'flarq-src/arqdialogs.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqdialogs.cxx'; fi` flarq-src/flarq-arqhelp.o: flarq-src/arqhelp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arqhelp.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arqhelp.Tpo -c -o flarq-src/flarq-arqhelp.o `test -f 'flarq-src/arqhelp.cxx' || echo '$(srcdir)/'`flarq-src/arqhelp.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arqhelp.Tpo flarq-src/$(DEPDIR)/flarq-arqhelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqhelp.cxx' object='flarq-src/flarq-arqhelp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arqhelp.o `test -f 'flarq-src/arqhelp.cxx' || echo '$(srcdir)/'`flarq-src/arqhelp.cxx flarq-src/flarq-arqhelp.obj: flarq-src/arqhelp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-arqhelp.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-arqhelp.Tpo -c -o flarq-src/flarq-arqhelp.obj `if test -f 'flarq-src/arqhelp.cxx'; then $(CYGPATH_W) 'flarq-src/arqhelp.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqhelp.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-arqhelp.Tpo flarq-src/$(DEPDIR)/flarq-arqhelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/arqhelp.cxx' object='flarq-src/flarq-arqhelp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-arqhelp.obj `if test -f 'flarq-src/arqhelp.cxx'; then $(CYGPATH_W) 'flarq-src/arqhelp.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/arqhelp.cxx'; fi` flarq-src/flarq-b64.o: flarq-src/b64.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-b64.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-b64.Tpo -c -o flarq-src/flarq-b64.o `test -f 'flarq-src/b64.cxx' || echo '$(srcdir)/'`flarq-src/b64.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-b64.Tpo flarq-src/$(DEPDIR)/flarq-b64.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/b64.cxx' object='flarq-src/flarq-b64.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-b64.o `test -f 'flarq-src/b64.cxx' || echo '$(srcdir)/'`flarq-src/b64.cxx flarq-src/flarq-b64.obj: flarq-src/b64.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-b64.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-b64.Tpo -c -o flarq-src/flarq-b64.obj `if test -f 'flarq-src/b64.cxx'; then $(CYGPATH_W) 'flarq-src/b64.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/b64.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-b64.Tpo flarq-src/$(DEPDIR)/flarq-b64.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/b64.cxx' object='flarq-src/flarq-b64.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-b64.obj `if test -f 'flarq-src/b64.cxx'; then $(CYGPATH_W) 'flarq-src/b64.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/b64.cxx'; fi` flarq-src/flarq-flarq.o: flarq-src/flarq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-flarq.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-flarq.Tpo -c -o flarq-src/flarq-flarq.o `test -f 'flarq-src/flarq.cxx' || echo '$(srcdir)/'`flarq-src/flarq.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-flarq.Tpo flarq-src/$(DEPDIR)/flarq-flarq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarq.cxx' object='flarq-src/flarq-flarq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-flarq.o `test -f 'flarq-src/flarq.cxx' || echo '$(srcdir)/'`flarq-src/flarq.cxx flarq-src/flarq-flarq.obj: flarq-src/flarq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-flarq.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-flarq.Tpo -c -o flarq-src/flarq-flarq.obj `if test -f 'flarq-src/flarq.cxx'; then $(CYGPATH_W) 'flarq-src/flarq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarq.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-flarq.Tpo flarq-src/$(DEPDIR)/flarq-flarq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarq.cxx' object='flarq-src/flarq-flarq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-flarq.obj `if test -f 'flarq-src/flarq.cxx'; then $(CYGPATH_W) 'flarq-src/flarq.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarq.cxx'; fi` flarq-src/flarq-flarqenv.o: flarq-src/flarqenv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-flarqenv.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-flarqenv.Tpo -c -o flarq-src/flarq-flarqenv.o `test -f 'flarq-src/flarqenv.cxx' || echo '$(srcdir)/'`flarq-src/flarqenv.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-flarqenv.Tpo flarq-src/$(DEPDIR)/flarq-flarqenv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarqenv.cxx' object='flarq-src/flarq-flarqenv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-flarqenv.o `test -f 'flarq-src/flarqenv.cxx' || echo '$(srcdir)/'`flarq-src/flarqenv.cxx flarq-src/flarq-flarqenv.obj: flarq-src/flarqenv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-flarqenv.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-flarqenv.Tpo -c -o flarq-src/flarq-flarqenv.obj `if test -f 'flarq-src/flarqenv.cxx'; then $(CYGPATH_W) 'flarq-src/flarqenv.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarqenv.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-flarqenv.Tpo flarq-src/$(DEPDIR)/flarq-flarqenv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/flarqenv.cxx' object='flarq-src/flarq-flarqenv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-flarqenv.obj `if test -f 'flarq-src/flarqenv.cxx'; then $(CYGPATH_W) 'flarq-src/flarqenv.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/flarqenv.cxx'; fi` flarq-src/flarq-xml_server.o: flarq-src/xml_server.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-xml_server.o -MD -MP -MF flarq-src/$(DEPDIR)/flarq-xml_server.Tpo -c -o flarq-src/flarq-xml_server.o `test -f 'flarq-src/xml_server.cxx' || echo '$(srcdir)/'`flarq-src/xml_server.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-xml_server.Tpo flarq-src/$(DEPDIR)/flarq-xml_server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/xml_server.cxx' object='flarq-src/flarq-xml_server.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-xml_server.o `test -f 'flarq-src/xml_server.cxx' || echo '$(srcdir)/'`flarq-src/xml_server.cxx flarq-src/flarq-xml_server.obj: flarq-src/xml_server.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT flarq-src/flarq-xml_server.obj -MD -MP -MF flarq-src/$(DEPDIR)/flarq-xml_server.Tpo -c -o flarq-src/flarq-xml_server.obj `if test -f 'flarq-src/xml_server.cxx'; then $(CYGPATH_W) 'flarq-src/xml_server.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/xml_server.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) flarq-src/$(DEPDIR)/flarq-xml_server.Tpo flarq-src/$(DEPDIR)/flarq-xml_server.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='flarq-src/xml_server.cxx' object='flarq-src/flarq-xml_server.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o flarq-src/flarq-xml_server.obj `if test -f 'flarq-src/xml_server.cxx'; then $(CYGPATH_W) 'flarq-src/xml_server.cxx'; else $(CYGPATH_W) '$(srcdir)/flarq-src/xml_server.cxx'; fi` combo/flarq-combo.o: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT combo/flarq-combo.o -MD -MP -MF combo/$(DEPDIR)/flarq-combo.Tpo -c -o combo/flarq-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) combo/$(DEPDIR)/flarq-combo.Tpo combo/$(DEPDIR)/flarq-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='combo/flarq-combo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o combo/flarq-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx combo/flarq-combo.obj: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT combo/flarq-combo.obj -MD -MP -MF combo/$(DEPDIR)/flarq-combo.Tpo -c -o combo/flarq-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) combo/$(DEPDIR)/flarq-combo.Tpo combo/$(DEPDIR)/flarq-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='combo/flarq-combo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o combo/flarq-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` fileselector/flarq-fileselect.o: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT fileselector/flarq-fileselect.o -MD -MP -MF fileselector/$(DEPDIR)/flarq-fileselect.Tpo -c -o fileselector/flarq-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/flarq-fileselect.Tpo fileselector/$(DEPDIR)/flarq-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fileselector/flarq-fileselect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/flarq-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx fileselector/flarq-fileselect.obj: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT fileselector/flarq-fileselect.obj -MD -MP -MF fileselector/$(DEPDIR)/flarq-fileselect.Tpo -c -o fileselector/flarq-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/flarq-fileselect.Tpo fileselector/$(DEPDIR)/flarq-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fileselector/flarq-fileselect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/flarq-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` logbook/flarq-table.o: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT logbook/flarq-table.o -MD -MP -MF logbook/$(DEPDIR)/flarq-table.Tpo -c -o logbook/flarq-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/flarq-table.Tpo logbook/$(DEPDIR)/flarq-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='logbook/flarq-table.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o logbook/flarq-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx logbook/flarq-table.obj: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT logbook/flarq-table.obj -MD -MP -MF logbook/$(DEPDIR)/flarq-table.Tpo -c -o logbook/flarq-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/flarq-table.Tpo logbook/$(DEPDIR)/flarq-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='logbook/flarq-table.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o logbook/flarq-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` misc/flarq-ascii.o: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-ascii.o -MD -MP -MF misc/$(DEPDIR)/flarq-ascii.Tpo -c -o misc/flarq-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-ascii.Tpo misc/$(DEPDIR)/flarq-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='misc/flarq-ascii.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx misc/flarq-ascii.obj: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-ascii.obj -MD -MP -MF misc/$(DEPDIR)/flarq-ascii.Tpo -c -o misc/flarq-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-ascii.Tpo misc/$(DEPDIR)/flarq-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='misc/flarq-ascii.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` misc/flarq-stacktrace.o: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-stacktrace.o -MD -MP -MF misc/$(DEPDIR)/flarq-stacktrace.Tpo -c -o misc/flarq-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-stacktrace.Tpo misc/$(DEPDIR)/flarq-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='misc/flarq-stacktrace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx misc/flarq-stacktrace.obj: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-stacktrace.obj -MD -MP -MF misc/$(DEPDIR)/flarq-stacktrace.Tpo -c -o misc/flarq-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-stacktrace.Tpo misc/$(DEPDIR)/flarq-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='misc/flarq-stacktrace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` misc/flarq-threads.o: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-threads.o -MD -MP -MF misc/$(DEPDIR)/flarq-threads.Tpo -c -o misc/flarq-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-threads.Tpo misc/$(DEPDIR)/flarq-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='misc/flarq-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx misc/flarq-threads.obj: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-threads.obj -MD -MP -MF misc/$(DEPDIR)/flarq-threads.Tpo -c -o misc/flarq-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-threads.Tpo misc/$(DEPDIR)/flarq-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='misc/flarq-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` misc/flarq-timeops.o: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-timeops.o -MD -MP -MF misc/$(DEPDIR)/flarq-timeops.Tpo -c -o misc/flarq-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-timeops.Tpo misc/$(DEPDIR)/flarq-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='misc/flarq-timeops.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx misc/flarq-timeops.obj: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-timeops.obj -MD -MP -MF misc/$(DEPDIR)/flarq-timeops.Tpo -c -o misc/flarq-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-timeops.Tpo misc/$(DEPDIR)/flarq-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='misc/flarq-timeops.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` network/flarq-socket.o: network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT network/flarq-socket.o -MD -MP -MF network/$(DEPDIR)/flarq-socket.Tpo -c -o network/flarq-socket.o `test -f 'network/socket.cxx' || echo '$(srcdir)/'`network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/flarq-socket.Tpo network/$(DEPDIR)/flarq-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/socket.cxx' object='network/flarq-socket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o network/flarq-socket.o `test -f 'network/socket.cxx' || echo '$(srcdir)/'`network/socket.cxx network/flarq-socket.obj: network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT network/flarq-socket.obj -MD -MP -MF network/$(DEPDIR)/flarq-socket.Tpo -c -o network/flarq-socket.obj `if test -f 'network/socket.cxx'; then $(CYGPATH_W) 'network/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/network/socket.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/flarq-socket.Tpo network/$(DEPDIR)/flarq-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/socket.cxx' object='network/flarq-socket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o network/flarq-socket.obj `if test -f 'network/socket.cxx'; then $(CYGPATH_W) 'network/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/network/socket.cxx'; fi` widgets/flarq-flinput2.o: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flinput2.o -MD -MP -MF widgets/$(DEPDIR)/flarq-flinput2.Tpo -c -o widgets/flarq-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flinput2.Tpo widgets/$(DEPDIR)/flarq-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='widgets/flarq-flinput2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx widgets/flarq-flinput2.obj: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flinput2.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-flinput2.Tpo -c -o widgets/flarq-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flinput2.Tpo widgets/$(DEPDIR)/flarq-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='widgets/flarq-flinput2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` widgets/flarq-flmisc.o: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flmisc.o -MD -MP -MF widgets/$(DEPDIR)/flarq-flmisc.Tpo -c -o widgets/flarq-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flmisc.Tpo widgets/$(DEPDIR)/flarq-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='widgets/flarq-flmisc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx widgets/flarq-flmisc.obj: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flmisc.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-flmisc.Tpo -c -o widgets/flarq-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flmisc.Tpo widgets/$(DEPDIR)/flarq-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='widgets/flarq-flmisc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` widgets/flarq-flslider2.o: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flslider2.o -MD -MP -MF widgets/$(DEPDIR)/flarq-flslider2.Tpo -c -o widgets/flarq-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flslider2.Tpo widgets/$(DEPDIR)/flarq-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='widgets/flarq-flslider2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx widgets/flarq-flslider2.obj: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-flslider2.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-flslider2.Tpo -c -o widgets/flarq-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-flslider2.Tpo widgets/$(DEPDIR)/flarq-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='widgets/flarq-flslider2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` misc/flarq-icons.o: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-icons.o -MD -MP -MF misc/$(DEPDIR)/flarq-icons.Tpo -c -o misc/flarq-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-icons.Tpo misc/$(DEPDIR)/flarq-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='misc/flarq-icons.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx misc/flarq-icons.obj: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-icons.obj -MD -MP -MF misc/$(DEPDIR)/flarq-icons.Tpo -c -o misc/flarq-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-icons.Tpo misc/$(DEPDIR)/flarq-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='misc/flarq-icons.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` misc/flarq-pixmaps.o: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-pixmaps.o -MD -MP -MF misc/$(DEPDIR)/flarq-pixmaps.Tpo -c -o misc/flarq-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-pixmaps.Tpo misc/$(DEPDIR)/flarq-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='misc/flarq-pixmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx misc/flarq-pixmaps.obj: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-pixmaps.obj -MD -MP -MF misc/$(DEPDIR)/flarq-pixmaps.Tpo -c -o misc/flarq-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-pixmaps.Tpo misc/$(DEPDIR)/flarq-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='misc/flarq-pixmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` misc/flarq-pixmaps_tango.o: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-pixmaps_tango.o -MD -MP -MF misc/$(DEPDIR)/flarq-pixmaps_tango.Tpo -c -o misc/flarq-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-pixmaps_tango.Tpo misc/$(DEPDIR)/flarq-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='misc/flarq-pixmaps_tango.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx misc/flarq-pixmaps_tango.obj: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-pixmaps_tango.obj -MD -MP -MF misc/$(DEPDIR)/flarq-pixmaps_tango.Tpo -c -o misc/flarq-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-pixmaps_tango.Tpo misc/$(DEPDIR)/flarq-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='misc/flarq-pixmaps_tango.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` misc/flarq-re.o: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-re.o -MD -MP -MF misc/$(DEPDIR)/flarq-re.Tpo -c -o misc/flarq-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-re.Tpo misc/$(DEPDIR)/flarq-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='misc/flarq-re.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx misc/flarq-re.obj: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-re.obj -MD -MP -MF misc/$(DEPDIR)/flarq-re.Tpo -c -o misc/flarq-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-re.Tpo misc/$(DEPDIR)/flarq-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='misc/flarq-re.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` misc/flarq-util.o: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-util.o -MD -MP -MF misc/$(DEPDIR)/flarq-util.Tpo -c -o misc/flarq-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-util.Tpo misc/$(DEPDIR)/flarq-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='misc/flarq-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx misc/flarq-util.obj: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT misc/flarq-util.obj -MD -MP -MF misc/$(DEPDIR)/flarq-util.Tpo -c -o misc/flarq-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/flarq-util.Tpo misc/$(DEPDIR)/flarq-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='misc/flarq-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o misc/flarq-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` widgets/flarq-Fl_Text_Buffer_mod.o: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Buffer_mod.o -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo -c -o widgets/flarq-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='widgets/flarq-Fl_Text_Buffer_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx widgets/flarq-Fl_Text_Buffer_mod.obj: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Buffer_mod.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo -c -o widgets/flarq-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='widgets/flarq-Fl_Text_Buffer_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` widgets/flarq-Fl_Text_Display_mod.o: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Display_mod.o -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo -c -o widgets/flarq-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='widgets/flarq-Fl_Text_Display_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx widgets/flarq-Fl_Text_Display_mod.obj: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Display_mod.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo -c -o widgets/flarq-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='widgets/flarq-Fl_Text_Display_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` widgets/flarq-Fl_Text_Editor_mod.o: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Editor_mod.o -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo -c -o widgets/flarq-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='widgets/flarq-Fl_Text_Editor_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx widgets/flarq-Fl_Text_Editor_mod.obj: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-Fl_Text_Editor_mod.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo -c -o widgets/flarq-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Tpo widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='widgets/flarq-Fl_Text_Editor_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` widgets/flarq-FTextView.o: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-FTextView.o -MD -MP -MF widgets/$(DEPDIR)/flarq-FTextView.Tpo -c -o widgets/flarq-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-FTextView.Tpo widgets/$(DEPDIR)/flarq-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='widgets/flarq-FTextView.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx widgets/flarq-FTextView.obj: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-FTextView.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-FTextView.Tpo -c -o widgets/flarq-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-FTextView.Tpo widgets/$(DEPDIR)/flarq-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='widgets/flarq-FTextView.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` widgets/flarq-F_Edit.o: widgets/F_Edit.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-F_Edit.o -MD -MP -MF widgets/$(DEPDIR)/flarq-F_Edit.Tpo -c -o widgets/flarq-F_Edit.o `test -f 'widgets/F_Edit.cxx' || echo '$(srcdir)/'`widgets/F_Edit.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-F_Edit.Tpo widgets/$(DEPDIR)/flarq-F_Edit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/F_Edit.cxx' object='widgets/flarq-F_Edit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-F_Edit.o `test -f 'widgets/F_Edit.cxx' || echo '$(srcdir)/'`widgets/F_Edit.cxx widgets/flarq-F_Edit.obj: widgets/F_Edit.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -MT widgets/flarq-F_Edit.obj -MD -MP -MF widgets/$(DEPDIR)/flarq-F_Edit.Tpo -c -o widgets/flarq-F_Edit.obj `if test -f 'widgets/F_Edit.cxx'; then $(CYGPATH_W) 'widgets/F_Edit.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/F_Edit.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/flarq-F_Edit.Tpo widgets/$(DEPDIR)/flarq-F_Edit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/F_Edit.cxx' object='widgets/flarq-F_Edit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(flarq_CPPFLAGS) $(CPPFLAGS) $(flarq_CXXFLAGS) $(CXXFLAGS) -c -o widgets/flarq-F_Edit.obj `if test -f 'widgets/F_Edit.cxx'; then $(CYGPATH_W) 'widgets/F_Edit.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/F_Edit.cxx'; fi` network/fldigi-xmlrpc.o: network/xmlrpc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-xmlrpc.o -MD -MP -MF network/$(DEPDIR)/fldigi-xmlrpc.Tpo -c -o network/fldigi-xmlrpc.o `test -f 'network/xmlrpc.cxx' || echo '$(srcdir)/'`network/xmlrpc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-xmlrpc.Tpo network/$(DEPDIR)/fldigi-xmlrpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/xmlrpc.cxx' object='network/fldigi-xmlrpc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-xmlrpc.o `test -f 'network/xmlrpc.cxx' || echo '$(srcdir)/'`network/xmlrpc.cxx network/fldigi-xmlrpc.obj: network/xmlrpc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-xmlrpc.obj -MD -MP -MF network/$(DEPDIR)/fldigi-xmlrpc.Tpo -c -o network/fldigi-xmlrpc.obj `if test -f 'network/xmlrpc.cxx'; then $(CYGPATH_W) 'network/xmlrpc.cxx'; else $(CYGPATH_W) '$(srcdir)/network/xmlrpc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-xmlrpc.Tpo network/$(DEPDIR)/fldigi-xmlrpc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/xmlrpc.cxx' object='network/fldigi-xmlrpc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-xmlrpc.obj `if test -f 'network/xmlrpc.cxx'; then $(CYGPATH_W) 'network/xmlrpc.cxx'; else $(CYGPATH_W) '$(srcdir)/network/xmlrpc.cxx'; fi` xmlrpcpp/fldigi-XmlRpcClient.o: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcClient.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Tpo -c -o xmlrpcpp/fldigi-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='xmlrpcpp/fldigi-XmlRpcClient.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcClient.o `test -f 'xmlrpcpp/XmlRpcClient.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcClient.cpp xmlrpcpp/fldigi-XmlRpcClient.obj: xmlrpcpp/XmlRpcClient.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcClient.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Tpo -c -o xmlrpcpp/fldigi-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcClient.cpp' object='xmlrpcpp/fldigi-XmlRpcClient.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcClient.obj `if test -f 'xmlrpcpp/XmlRpcClient.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcClient.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcClient.cpp'; fi` xmlrpcpp/fldigi-XmlRpcDispatch.o: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcDispatch.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Tpo -c -o xmlrpcpp/fldigi-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='xmlrpcpp/fldigi-XmlRpcDispatch.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcDispatch.o `test -f 'xmlrpcpp/XmlRpcDispatch.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcDispatch.cpp xmlrpcpp/fldigi-XmlRpcDispatch.obj: xmlrpcpp/XmlRpcDispatch.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcDispatch.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Tpo -c -o xmlrpcpp/fldigi-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcDispatch.cpp' object='xmlrpcpp/fldigi-XmlRpcDispatch.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcDispatch.obj `if test -f 'xmlrpcpp/XmlRpcDispatch.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcDispatch.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcDispatch.cpp'; fi` xmlrpcpp/fldigi-XmlRpcMutex.o: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcMutex.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Tpo -c -o xmlrpcpp/fldigi-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='xmlrpcpp/fldigi-XmlRpcMutex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcMutex.o `test -f 'xmlrpcpp/XmlRpcMutex.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcMutex.cpp xmlrpcpp/fldigi-XmlRpcMutex.obj: xmlrpcpp/XmlRpcMutex.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcMutex.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Tpo -c -o xmlrpcpp/fldigi-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcMutex.cpp' object='xmlrpcpp/fldigi-XmlRpcMutex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcMutex.obj `if test -f 'xmlrpcpp/XmlRpcMutex.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcMutex.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcMutex.cpp'; fi` xmlrpcpp/fldigi-XmlRpcServerConnection.o: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServerConnection.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='xmlrpcpp/fldigi-XmlRpcServerConnection.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServerConnection.o `test -f 'xmlrpcpp/XmlRpcServerConnection.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerConnection.cpp xmlrpcpp/fldigi-XmlRpcServerConnection.obj: xmlrpcpp/XmlRpcServerConnection.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServerConnection.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerConnection.cpp' object='xmlrpcpp/fldigi-XmlRpcServerConnection.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServerConnection.obj `if test -f 'xmlrpcpp/XmlRpcServerConnection.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerConnection.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerConnection.cpp'; fi` xmlrpcpp/fldigi-XmlRpcServer.o: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServer.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='xmlrpcpp/fldigi-XmlRpcServer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServer.o `test -f 'xmlrpcpp/XmlRpcServer.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServer.cpp xmlrpcpp/fldigi-XmlRpcServer.obj: xmlrpcpp/XmlRpcServer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServer.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServer.cpp' object='xmlrpcpp/fldigi-XmlRpcServer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServer.obj `if test -f 'xmlrpcpp/XmlRpcServer.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServer.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServer.cpp'; fi` xmlrpcpp/fldigi-XmlRpcServerMethod.o: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServerMethod.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='xmlrpcpp/fldigi-XmlRpcServerMethod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServerMethod.o `test -f 'xmlrpcpp/XmlRpcServerMethod.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcServerMethod.cpp xmlrpcpp/fldigi-XmlRpcServerMethod.obj: xmlrpcpp/XmlRpcServerMethod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcServerMethod.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo -c -o xmlrpcpp/fldigi-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcServerMethod.cpp' object='xmlrpcpp/fldigi-XmlRpcServerMethod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcServerMethod.obj `if test -f 'xmlrpcpp/XmlRpcServerMethod.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcServerMethod.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcServerMethod.cpp'; fi` xmlrpcpp/fldigi-XmlRpcSocket.o: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcSocket.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Tpo -c -o xmlrpcpp/fldigi-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='xmlrpcpp/fldigi-XmlRpcSocket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcSocket.o `test -f 'xmlrpcpp/XmlRpcSocket.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSocket.cpp xmlrpcpp/fldigi-XmlRpcSocket.obj: xmlrpcpp/XmlRpcSocket.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcSocket.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Tpo -c -o xmlrpcpp/fldigi-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSocket.cpp' object='xmlrpcpp/fldigi-XmlRpcSocket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcSocket.obj `if test -f 'xmlrpcpp/XmlRpcSocket.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSocket.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSocket.cpp'; fi` xmlrpcpp/fldigi-XmlRpcSource.o: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcSource.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Tpo -c -o xmlrpcpp/fldigi-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='xmlrpcpp/fldigi-XmlRpcSource.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcSource.o `test -f 'xmlrpcpp/XmlRpcSource.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcSource.cpp xmlrpcpp/fldigi-XmlRpcSource.obj: xmlrpcpp/XmlRpcSource.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcSource.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Tpo -c -o xmlrpcpp/fldigi-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcSource.cpp' object='xmlrpcpp/fldigi-XmlRpcSource.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcSource.obj `if test -f 'xmlrpcpp/XmlRpcSource.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcSource.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcSource.cpp'; fi` xmlrpcpp/fldigi-XmlRpcUtil.o: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcUtil.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Tpo -c -o xmlrpcpp/fldigi-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='xmlrpcpp/fldigi-XmlRpcUtil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcUtil.o `test -f 'xmlrpcpp/XmlRpcUtil.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcUtil.cpp xmlrpcpp/fldigi-XmlRpcUtil.obj: xmlrpcpp/XmlRpcUtil.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcUtil.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Tpo -c -o xmlrpcpp/fldigi-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcUtil.cpp' object='xmlrpcpp/fldigi-XmlRpcUtil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcUtil.obj `if test -f 'xmlrpcpp/XmlRpcUtil.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcUtil.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcUtil.cpp'; fi` xmlrpcpp/fldigi-XmlRpcValue.o: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcValue.o -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Tpo -c -o xmlrpcpp/fldigi-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='xmlrpcpp/fldigi-XmlRpcValue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcValue.o `test -f 'xmlrpcpp/XmlRpcValue.cpp' || echo '$(srcdir)/'`xmlrpcpp/XmlRpcValue.cpp xmlrpcpp/fldigi-XmlRpcValue.obj: xmlrpcpp/XmlRpcValue.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT xmlrpcpp/fldigi-XmlRpcValue.obj -MD -MP -MF xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Tpo -c -o xmlrpcpp/fldigi-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Tpo xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='xmlrpcpp/XmlRpcValue.cpp' object='xmlrpcpp/fldigi-XmlRpcValue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o xmlrpcpp/fldigi-XmlRpcValue.obj `if test -f 'xmlrpcpp/XmlRpcValue.cpp'; then $(CYGPATH_W) 'xmlrpcpp/XmlRpcValue.cpp'; else $(CYGPATH_W) '$(srcdir)/xmlrpcpp/XmlRpcValue.cpp'; fi` rigcontrol/fldigi-hamlib.o: rigcontrol/hamlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-hamlib.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-hamlib.Tpo -c -o rigcontrol/fldigi-hamlib.o `test -f 'rigcontrol/hamlib.cxx' || echo '$(srcdir)/'`rigcontrol/hamlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-hamlib.Tpo rigcontrol/$(DEPDIR)/fldigi-hamlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/hamlib.cxx' object='rigcontrol/fldigi-hamlib.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-hamlib.o `test -f 'rigcontrol/hamlib.cxx' || echo '$(srcdir)/'`rigcontrol/hamlib.cxx rigcontrol/fldigi-hamlib.obj: rigcontrol/hamlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-hamlib.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-hamlib.Tpo -c -o rigcontrol/fldigi-hamlib.obj `if test -f 'rigcontrol/hamlib.cxx'; then $(CYGPATH_W) 'rigcontrol/hamlib.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/hamlib.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-hamlib.Tpo rigcontrol/$(DEPDIR)/fldigi-hamlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/hamlib.cxx' object='rigcontrol/fldigi-hamlib.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-hamlib.obj `if test -f 'rigcontrol/hamlib.cxx'; then $(CYGPATH_W) 'rigcontrol/hamlib.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/hamlib.cxx'; fi` rigcontrol/fldigi-rigclass.o: rigcontrol/rigclass.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigclass.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigclass.Tpo -c -o rigcontrol/fldigi-rigclass.o `test -f 'rigcontrol/rigclass.cxx' || echo '$(srcdir)/'`rigcontrol/rigclass.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigclass.Tpo rigcontrol/$(DEPDIR)/fldigi-rigclass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigclass.cxx' object='rigcontrol/fldigi-rigclass.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigclass.o `test -f 'rigcontrol/rigclass.cxx' || echo '$(srcdir)/'`rigcontrol/rigclass.cxx rigcontrol/fldigi-rigclass.obj: rigcontrol/rigclass.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigclass.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigclass.Tpo -c -o rigcontrol/fldigi-rigclass.obj `if test -f 'rigcontrol/rigclass.cxx'; then $(CYGPATH_W) 'rigcontrol/rigclass.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigclass.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigclass.Tpo rigcontrol/$(DEPDIR)/fldigi-rigclass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigclass.cxx' object='rigcontrol/fldigi-rigclass.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigclass.obj `if test -f 'rigcontrol/rigclass.cxx'; then $(CYGPATH_W) 'rigcontrol/rigclass.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigclass.cxx'; fi` misc/fldigi-benchmark.o: misc/benchmark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-benchmark.o -MD -MP -MF misc/$(DEPDIR)/fldigi-benchmark.Tpo -c -o misc/fldigi-benchmark.o `test -f 'misc/benchmark.cxx' || echo '$(srcdir)/'`misc/benchmark.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-benchmark.Tpo misc/$(DEPDIR)/fldigi-benchmark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/benchmark.cxx' object='misc/fldigi-benchmark.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-benchmark.o `test -f 'misc/benchmark.cxx' || echo '$(srcdir)/'`misc/benchmark.cxx misc/fldigi-benchmark.obj: misc/benchmark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-benchmark.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-benchmark.Tpo -c -o misc/fldigi-benchmark.obj `if test -f 'misc/benchmark.cxx'; then $(CYGPATH_W) 'misc/benchmark.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/benchmark.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-benchmark.Tpo misc/$(DEPDIR)/fldigi-benchmark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/benchmark.cxx' object='misc/fldigi-benchmark.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-benchmark.obj `if test -f 'misc/benchmark.cxx'; then $(CYGPATH_W) 'misc/benchmark.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/benchmark.cxx'; fi` misc/fldigi-stack.o: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-stack.o -MD -MP -MF misc/$(DEPDIR)/fldigi-stack.Tpo -c -o misc/fldigi-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-stack.Tpo misc/$(DEPDIR)/fldigi-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='misc/fldigi-stack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-stack.o `test -f 'misc/stack.cxx' || echo '$(srcdir)/'`misc/stack.cxx misc/fldigi-stack.obj: misc/stack.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-stack.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-stack.Tpo -c -o misc/fldigi-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-stack.Tpo misc/$(DEPDIR)/fldigi-stack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stack.cxx' object='misc/fldigi-stack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-stack.obj `if test -f 'misc/stack.cxx'; then $(CYGPATH_W) 'misc/stack.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stack.cxx'; fi` misc/fldigi-nls.o: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-nls.o -MD -MP -MF misc/$(DEPDIR)/fldigi-nls.Tpo -c -o misc/fldigi-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-nls.Tpo misc/$(DEPDIR)/fldigi-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='misc/fldigi-nls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-nls.o `test -f 'misc/nls.cxx' || echo '$(srcdir)/'`misc/nls.cxx misc/fldigi-nls.obj: misc/nls.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-nls.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-nls.Tpo -c -o misc/fldigi-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-nls.Tpo misc/$(DEPDIR)/fldigi-nls.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/nls.cxx' object='misc/fldigi-nls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-nls.obj `if test -f 'misc/nls.cxx'; then $(CYGPATH_W) 'misc/nls.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/nls.cxx'; fi` cmedia/fldigi-cmedia.o: cmedia/cmedia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-cmedia.o -MD -MP -MF cmedia/$(DEPDIR)/fldigi-cmedia.Tpo -c -o cmedia/fldigi-cmedia.o `test -f 'cmedia/cmedia.cxx' || echo '$(srcdir)/'`cmedia/cmedia.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-cmedia.Tpo cmedia/$(DEPDIR)/fldigi-cmedia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/cmedia.cxx' object='cmedia/fldigi-cmedia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-cmedia.o `test -f 'cmedia/cmedia.cxx' || echo '$(srcdir)/'`cmedia/cmedia.cxx cmedia/fldigi-cmedia.obj: cmedia/cmedia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-cmedia.obj -MD -MP -MF cmedia/$(DEPDIR)/fldigi-cmedia.Tpo -c -o cmedia/fldigi-cmedia.obj `if test -f 'cmedia/cmedia.cxx'; then $(CYGPATH_W) 'cmedia/cmedia.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/cmedia.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-cmedia.Tpo cmedia/$(DEPDIR)/fldigi-cmedia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/cmedia.cxx' object='cmedia/fldigi-cmedia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-cmedia.obj `if test -f 'cmedia/cmedia.cxx'; then $(CYGPATH_W) 'cmedia/cmedia.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/cmedia.cxx'; fi` cmedia/fldigi-hid.o: cmedia/hid.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-hid.o -MD -MP -MF cmedia/$(DEPDIR)/fldigi-hid.Tpo -c -o cmedia/fldigi-hid.o `test -f 'cmedia/hid.cxx' || echo '$(srcdir)/'`cmedia/hid.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-hid.Tpo cmedia/$(DEPDIR)/fldigi-hid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/hid.cxx' object='cmedia/fldigi-hid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-hid.o `test -f 'cmedia/hid.cxx' || echo '$(srcdir)/'`cmedia/hid.cxx cmedia/fldigi-hid.obj: cmedia/hid.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-hid.obj -MD -MP -MF cmedia/$(DEPDIR)/fldigi-hid.Tpo -c -o cmedia/fldigi-hid.obj `if test -f 'cmedia/hid.cxx'; then $(CYGPATH_W) 'cmedia/hid.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/hid.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-hid.Tpo cmedia/$(DEPDIR)/fldigi-hid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/hid.cxx' object='cmedia/fldigi-hid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-hid.obj `if test -f 'cmedia/hid.cxx'; then $(CYGPATH_W) 'cmedia/hid.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/hid.cxx'; fi` combo/fldigi-combo.o: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT combo/fldigi-combo.o -MD -MP -MF combo/$(DEPDIR)/fldigi-combo.Tpo -c -o combo/fldigi-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) combo/$(DEPDIR)/fldigi-combo.Tpo combo/$(DEPDIR)/fldigi-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='combo/fldigi-combo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o combo/fldigi-combo.o `test -f 'combo/combo.cxx' || echo '$(srcdir)/'`combo/combo.cxx combo/fldigi-combo.obj: combo/combo.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT combo/fldigi-combo.obj -MD -MP -MF combo/$(DEPDIR)/fldigi-combo.Tpo -c -o combo/fldigi-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) combo/$(DEPDIR)/fldigi-combo.Tpo combo/$(DEPDIR)/fldigi-combo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='combo/combo.cxx' object='combo/fldigi-combo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o combo/fldigi-combo.obj `if test -f 'combo/combo.cxx'; then $(CYGPATH_W) 'combo/combo.cxx'; else $(CYGPATH_W) '$(srcdir)/combo/combo.cxx'; fi` config_script/fldigi-create_default_script.o: config_script/create_default_script.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-create_default_script.o -MD -MP -MF config_script/$(DEPDIR)/fldigi-create_default_script.Tpo -c -o config_script/fldigi-create_default_script.o `test -f 'config_script/create_default_script.cxx' || echo '$(srcdir)/'`config_script/create_default_script.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-create_default_script.Tpo config_script/$(DEPDIR)/fldigi-create_default_script.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/create_default_script.cxx' object='config_script/fldigi-create_default_script.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-create_default_script.o `test -f 'config_script/create_default_script.cxx' || echo '$(srcdir)/'`config_script/create_default_script.cxx config_script/fldigi-create_default_script.obj: config_script/create_default_script.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-create_default_script.obj -MD -MP -MF config_script/$(DEPDIR)/fldigi-create_default_script.Tpo -c -o config_script/fldigi-create_default_script.obj `if test -f 'config_script/create_default_script.cxx'; then $(CYGPATH_W) 'config_script/create_default_script.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/create_default_script.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-create_default_script.Tpo config_script/$(DEPDIR)/fldigi-create_default_script.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/create_default_script.cxx' object='config_script/fldigi-create_default_script.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-create_default_script.obj `if test -f 'config_script/create_default_script.cxx'; then $(CYGPATH_W) 'config_script/create_default_script.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/create_default_script.cxx'; fi` config_script/fldigi-run_scripts.o: config_script/run_scripts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-run_scripts.o -MD -MP -MF config_script/$(DEPDIR)/fldigi-run_scripts.Tpo -c -o config_script/fldigi-run_scripts.o `test -f 'config_script/run_scripts.cxx' || echo '$(srcdir)/'`config_script/run_scripts.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-run_scripts.Tpo config_script/$(DEPDIR)/fldigi-run_scripts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/run_scripts.cxx' object='config_script/fldigi-run_scripts.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-run_scripts.o `test -f 'config_script/run_scripts.cxx' || echo '$(srcdir)/'`config_script/run_scripts.cxx config_script/fldigi-run_scripts.obj: config_script/run_scripts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-run_scripts.obj -MD -MP -MF config_script/$(DEPDIR)/fldigi-run_scripts.Tpo -c -o config_script/fldigi-run_scripts.obj `if test -f 'config_script/run_scripts.cxx'; then $(CYGPATH_W) 'config_script/run_scripts.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/run_scripts.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-run_scripts.Tpo config_script/$(DEPDIR)/fldigi-run_scripts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/run_scripts.cxx' object='config_script/fldigi-run_scripts.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-run_scripts.obj `if test -f 'config_script/run_scripts.cxx'; then $(CYGPATH_W) 'config_script/run_scripts.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/run_scripts.cxx'; fi` config_script/fldigi-script_parsing.o: config_script/script_parsing.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-script_parsing.o -MD -MP -MF config_script/$(DEPDIR)/fldigi-script_parsing.Tpo -c -o config_script/fldigi-script_parsing.o `test -f 'config_script/script_parsing.cxx' || echo '$(srcdir)/'`config_script/script_parsing.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-script_parsing.Tpo config_script/$(DEPDIR)/fldigi-script_parsing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/script_parsing.cxx' object='config_script/fldigi-script_parsing.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-script_parsing.o `test -f 'config_script/script_parsing.cxx' || echo '$(srcdir)/'`config_script/script_parsing.cxx config_script/fldigi-script_parsing.obj: config_script/script_parsing.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT config_script/fldigi-script_parsing.obj -MD -MP -MF config_script/$(DEPDIR)/fldigi-script_parsing.Tpo -c -o config_script/fldigi-script_parsing.obj `if test -f 'config_script/script_parsing.cxx'; then $(CYGPATH_W) 'config_script/script_parsing.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/script_parsing.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) config_script/$(DEPDIR)/fldigi-script_parsing.Tpo config_script/$(DEPDIR)/fldigi-script_parsing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='config_script/script_parsing.cxx' object='config_script/fldigi-script_parsing.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o config_script/fldigi-script_parsing.obj `if test -f 'config_script/script_parsing.cxx'; then $(CYGPATH_W) 'config_script/script_parsing.cxx'; else $(CYGPATH_W) '$(srcdir)/config_script/script_parsing.cxx'; fi` contestia/fldigi-contestia.o: contestia/contestia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT contestia/fldigi-contestia.o -MD -MP -MF contestia/$(DEPDIR)/fldigi-contestia.Tpo -c -o contestia/fldigi-contestia.o `test -f 'contestia/contestia.cxx' || echo '$(srcdir)/'`contestia/contestia.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) contestia/$(DEPDIR)/fldigi-contestia.Tpo contestia/$(DEPDIR)/fldigi-contestia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='contestia/contestia.cxx' object='contestia/fldigi-contestia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o contestia/fldigi-contestia.o `test -f 'contestia/contestia.cxx' || echo '$(srcdir)/'`contestia/contestia.cxx contestia/fldigi-contestia.obj: contestia/contestia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT contestia/fldigi-contestia.obj -MD -MP -MF contestia/$(DEPDIR)/fldigi-contestia.Tpo -c -o contestia/fldigi-contestia.obj `if test -f 'contestia/contestia.cxx'; then $(CYGPATH_W) 'contestia/contestia.cxx'; else $(CYGPATH_W) '$(srcdir)/contestia/contestia.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) contestia/$(DEPDIR)/fldigi-contestia.Tpo contestia/$(DEPDIR)/fldigi-contestia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='contestia/contestia.cxx' object='contestia/fldigi-contestia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o contestia/fldigi-contestia.obj `if test -f 'contestia/contestia.cxx'; then $(CYGPATH_W) 'contestia/contestia.cxx'; else $(CYGPATH_W) '$(srcdir)/contestia/contestia.cxx'; fi` cw/fldigi-cw.o: cw/cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-cw.o -MD -MP -MF cw/$(DEPDIR)/fldigi-cw.Tpo -c -o cw/fldigi-cw.o `test -f 'cw/cw.cxx' || echo '$(srcdir)/'`cw/cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-cw.Tpo cw/$(DEPDIR)/fldigi-cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/cw.cxx' object='cw/fldigi-cw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-cw.o `test -f 'cw/cw.cxx' || echo '$(srcdir)/'`cw/cw.cxx cw/fldigi-cw.obj: cw/cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-cw.obj -MD -MP -MF cw/$(DEPDIR)/fldigi-cw.Tpo -c -o cw/fldigi-cw.obj `if test -f 'cw/cw.cxx'; then $(CYGPATH_W) 'cw/cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/cw.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-cw.Tpo cw/$(DEPDIR)/fldigi-cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/cw.cxx' object='cw/fldigi-cw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-cw.obj `if test -f 'cw/cw.cxx'; then $(CYGPATH_W) 'cw/cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/cw.cxx'; fi` cw/fldigi-ICOMkeying.o: cw/ICOMkeying.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-ICOMkeying.o -MD -MP -MF cw/$(DEPDIR)/fldigi-ICOMkeying.Tpo -c -o cw/fldigi-ICOMkeying.o `test -f 'cw/ICOMkeying.cxx' || echo '$(srcdir)/'`cw/ICOMkeying.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-ICOMkeying.Tpo cw/$(DEPDIR)/fldigi-ICOMkeying.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/ICOMkeying.cxx' object='cw/fldigi-ICOMkeying.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-ICOMkeying.o `test -f 'cw/ICOMkeying.cxx' || echo '$(srcdir)/'`cw/ICOMkeying.cxx cw/fldigi-ICOMkeying.obj: cw/ICOMkeying.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-ICOMkeying.obj -MD -MP -MF cw/$(DEPDIR)/fldigi-ICOMkeying.Tpo -c -o cw/fldigi-ICOMkeying.obj `if test -f 'cw/ICOMkeying.cxx'; then $(CYGPATH_W) 'cw/ICOMkeying.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/ICOMkeying.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-ICOMkeying.Tpo cw/$(DEPDIR)/fldigi-ICOMkeying.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/ICOMkeying.cxx' object='cw/fldigi-ICOMkeying.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-ICOMkeying.obj `if test -f 'cw/ICOMkeying.cxx'; then $(CYGPATH_W) 'cw/ICOMkeying.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/ICOMkeying.cxx'; fi` cw/fldigi-KYkeying.o: cw/KYkeying.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-KYkeying.o -MD -MP -MF cw/$(DEPDIR)/fldigi-KYkeying.Tpo -c -o cw/fldigi-KYkeying.o `test -f 'cw/KYkeying.cxx' || echo '$(srcdir)/'`cw/KYkeying.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-KYkeying.Tpo cw/$(DEPDIR)/fldigi-KYkeying.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/KYkeying.cxx' object='cw/fldigi-KYkeying.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-KYkeying.o `test -f 'cw/KYkeying.cxx' || echo '$(srcdir)/'`cw/KYkeying.cxx cw/fldigi-KYkeying.obj: cw/KYkeying.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-KYkeying.obj -MD -MP -MF cw/$(DEPDIR)/fldigi-KYkeying.Tpo -c -o cw/fldigi-KYkeying.obj `if test -f 'cw/KYkeying.cxx'; then $(CYGPATH_W) 'cw/KYkeying.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/KYkeying.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-KYkeying.Tpo cw/$(DEPDIR)/fldigi-KYkeying.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/KYkeying.cxx' object='cw/fldigi-KYkeying.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-KYkeying.obj `if test -f 'cw/KYkeying.cxx'; then $(CYGPATH_W) 'cw/KYkeying.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/KYkeying.cxx'; fi` cw/fldigi-morse.o: cw/morse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-morse.o -MD -MP -MF cw/$(DEPDIR)/fldigi-morse.Tpo -c -o cw/fldigi-morse.o `test -f 'cw/morse.cxx' || echo '$(srcdir)/'`cw/morse.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-morse.Tpo cw/$(DEPDIR)/fldigi-morse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/morse.cxx' object='cw/fldigi-morse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-morse.o `test -f 'cw/morse.cxx' || echo '$(srcdir)/'`cw/morse.cxx cw/fldigi-morse.obj: cw/morse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-morse.obj -MD -MP -MF cw/$(DEPDIR)/fldigi-morse.Tpo -c -o cw/fldigi-morse.obj `if test -f 'cw/morse.cxx'; then $(CYGPATH_W) 'cw/morse.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/morse.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-morse.Tpo cw/$(DEPDIR)/fldigi-morse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/morse.cxx' object='cw/fldigi-morse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-morse.obj `if test -f 'cw/morse.cxx'; then $(CYGPATH_W) 'cw/morse.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/morse.cxx'; fi` cw/fldigi-nanoIO.o: cw/nanoIO.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-nanoIO.o -MD -MP -MF cw/$(DEPDIR)/fldigi-nanoIO.Tpo -c -o cw/fldigi-nanoIO.o `test -f 'cw/nanoIO.cxx' || echo '$(srcdir)/'`cw/nanoIO.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-nanoIO.Tpo cw/$(DEPDIR)/fldigi-nanoIO.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/nanoIO.cxx' object='cw/fldigi-nanoIO.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-nanoIO.o `test -f 'cw/nanoIO.cxx' || echo '$(srcdir)/'`cw/nanoIO.cxx cw/fldigi-nanoIO.obj: cw/nanoIO.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-nanoIO.obj -MD -MP -MF cw/$(DEPDIR)/fldigi-nanoIO.Tpo -c -o cw/fldigi-nanoIO.obj `if test -f 'cw/nanoIO.cxx'; then $(CYGPATH_W) 'cw/nanoIO.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/nanoIO.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-nanoIO.Tpo cw/$(DEPDIR)/fldigi-nanoIO.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/nanoIO.cxx' object='cw/fldigi-nanoIO.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-nanoIO.obj `if test -f 'cw/nanoIO.cxx'; then $(CYGPATH_W) 'cw/nanoIO.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/nanoIO.cxx'; fi` cw/fldigi-Nav.o: cw/Nav.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-Nav.o -MD -MP -MF cw/$(DEPDIR)/fldigi-Nav.Tpo -c -o cw/fldigi-Nav.o `test -f 'cw/Nav.cxx' || echo '$(srcdir)/'`cw/Nav.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-Nav.Tpo cw/$(DEPDIR)/fldigi-Nav.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/Nav.cxx' object='cw/fldigi-Nav.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-Nav.o `test -f 'cw/Nav.cxx' || echo '$(srcdir)/'`cw/Nav.cxx cw/fldigi-Nav.obj: cw/Nav.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-Nav.obj -MD -MP -MF cw/$(DEPDIR)/fldigi-Nav.Tpo -c -o cw/fldigi-Nav.obj `if test -f 'cw/Nav.cxx'; then $(CYGPATH_W) 'cw/Nav.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/Nav.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-Nav.Tpo cw/$(DEPDIR)/fldigi-Nav.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/Nav.cxx' object='cw/fldigi-Nav.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-Nav.obj `if test -f 'cw/Nav.cxx'; then $(CYGPATH_W) 'cw/Nav.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/Nav.cxx'; fi` cw/fldigi-view_cw.o: cw/view_cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-view_cw.o -MD -MP -MF cw/$(DEPDIR)/fldigi-view_cw.Tpo -c -o cw/fldigi-view_cw.o `test -f 'cw/view_cw.cxx' || echo '$(srcdir)/'`cw/view_cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-view_cw.Tpo cw/$(DEPDIR)/fldigi-view_cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/view_cw.cxx' object='cw/fldigi-view_cw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-view_cw.o `test -f 'cw/view_cw.cxx' || echo '$(srcdir)/'`cw/view_cw.cxx cw/fldigi-view_cw.obj: cw/view_cw.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-view_cw.obj -MD -MP -MF cw/$(DEPDIR)/fldigi-view_cw.Tpo -c -o cw/fldigi-view_cw.obj `if test -f 'cw/view_cw.cxx'; then $(CYGPATH_W) 'cw/view_cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/view_cw.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-view_cw.Tpo cw/$(DEPDIR)/fldigi-view_cw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/view_cw.cxx' object='cw/fldigi-view_cw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-view_cw.obj `if test -f 'cw/view_cw.cxx'; then $(CYGPATH_W) 'cw/view_cw.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/view_cw.cxx'; fi` cw/fldigi-winkeyer.o: cw/winkeyer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-winkeyer.o -MD -MP -MF cw/$(DEPDIR)/fldigi-winkeyer.Tpo -c -o cw/fldigi-winkeyer.o `test -f 'cw/winkeyer.cxx' || echo '$(srcdir)/'`cw/winkeyer.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-winkeyer.Tpo cw/$(DEPDIR)/fldigi-winkeyer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/winkeyer.cxx' object='cw/fldigi-winkeyer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-winkeyer.o `test -f 'cw/winkeyer.cxx' || echo '$(srcdir)/'`cw/winkeyer.cxx cw/fldigi-winkeyer.obj: cw/winkeyer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-winkeyer.obj -MD -MP -MF cw/$(DEPDIR)/fldigi-winkeyer.Tpo -c -o cw/fldigi-winkeyer.obj `if test -f 'cw/winkeyer.cxx'; then $(CYGPATH_W) 'cw/winkeyer.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/winkeyer.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-winkeyer.Tpo cw/$(DEPDIR)/fldigi-winkeyer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/winkeyer.cxx' object='cw/fldigi-winkeyer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-winkeyer.obj `if test -f 'cw/winkeyer.cxx'; then $(CYGPATH_W) 'cw/winkeyer.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/winkeyer.cxx'; fi` cw/fldigi-YAESUkeying.o: cw/YAESUkeying.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-YAESUkeying.o -MD -MP -MF cw/$(DEPDIR)/fldigi-YAESUkeying.Tpo -c -o cw/fldigi-YAESUkeying.o `test -f 'cw/YAESUkeying.cxx' || echo '$(srcdir)/'`cw/YAESUkeying.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-YAESUkeying.Tpo cw/$(DEPDIR)/fldigi-YAESUkeying.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/YAESUkeying.cxx' object='cw/fldigi-YAESUkeying.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-YAESUkeying.o `test -f 'cw/YAESUkeying.cxx' || echo '$(srcdir)/'`cw/YAESUkeying.cxx cw/fldigi-YAESUkeying.obj: cw/YAESUkeying.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cw/fldigi-YAESUkeying.obj -MD -MP -MF cw/$(DEPDIR)/fldigi-YAESUkeying.Tpo -c -o cw/fldigi-YAESUkeying.obj `if test -f 'cw/YAESUkeying.cxx'; then $(CYGPATH_W) 'cw/YAESUkeying.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/YAESUkeying.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cw/$(DEPDIR)/fldigi-YAESUkeying.Tpo cw/$(DEPDIR)/fldigi-YAESUkeying.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cw/YAESUkeying.cxx' object='cw/fldigi-YAESUkeying.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cw/fldigi-YAESUkeying.obj `if test -f 'cw/YAESUkeying.cxx'; then $(CYGPATH_W) 'cw/YAESUkeying.cxx'; else $(CYGPATH_W) '$(srcdir)/cw/YAESUkeying.cxx'; fi` rtty/fldigi-fsk.o: rtty/fsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rtty/fldigi-fsk.o -MD -MP -MF rtty/$(DEPDIR)/fldigi-fsk.Tpo -c -o rtty/fldigi-fsk.o `test -f 'rtty/fsk.cxx' || echo '$(srcdir)/'`rtty/fsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rtty/$(DEPDIR)/fldigi-fsk.Tpo rtty/$(DEPDIR)/fldigi-fsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rtty/fsk.cxx' object='rtty/fldigi-fsk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rtty/fldigi-fsk.o `test -f 'rtty/fsk.cxx' || echo '$(srcdir)/'`rtty/fsk.cxx rtty/fldigi-fsk.obj: rtty/fsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rtty/fldigi-fsk.obj -MD -MP -MF rtty/$(DEPDIR)/fldigi-fsk.Tpo -c -o rtty/fldigi-fsk.obj `if test -f 'rtty/fsk.cxx'; then $(CYGPATH_W) 'rtty/fsk.cxx'; else $(CYGPATH_W) '$(srcdir)/rtty/fsk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rtty/$(DEPDIR)/fldigi-fsk.Tpo rtty/$(DEPDIR)/fldigi-fsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rtty/fsk.cxx' object='rtty/fldigi-fsk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rtty/fldigi-fsk.obj `if test -f 'rtty/fsk.cxx'; then $(CYGPATH_W) 'rtty/fsk.cxx'; else $(CYGPATH_W) '$(srcdir)/rtty/fsk.cxx'; fi` rtty/fldigi-rtty.o: rtty/rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rtty/fldigi-rtty.o -MD -MP -MF rtty/$(DEPDIR)/fldigi-rtty.Tpo -c -o rtty/fldigi-rtty.o `test -f 'rtty/rtty.cxx' || echo '$(srcdir)/'`rtty/rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rtty/$(DEPDIR)/fldigi-rtty.Tpo rtty/$(DEPDIR)/fldigi-rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rtty/rtty.cxx' object='rtty/fldigi-rtty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rtty/fldigi-rtty.o `test -f 'rtty/rtty.cxx' || echo '$(srcdir)/'`rtty/rtty.cxx rtty/fldigi-rtty.obj: rtty/rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rtty/fldigi-rtty.obj -MD -MP -MF rtty/$(DEPDIR)/fldigi-rtty.Tpo -c -o rtty/fldigi-rtty.obj `if test -f 'rtty/rtty.cxx'; then $(CYGPATH_W) 'rtty/rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/rtty/rtty.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rtty/$(DEPDIR)/fldigi-rtty.Tpo rtty/$(DEPDIR)/fldigi-rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rtty/rtty.cxx' object='rtty/fldigi-rtty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rtty/fldigi-rtty.obj `if test -f 'rtty/rtty.cxx'; then $(CYGPATH_W) 'rtty/rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/rtty/rtty.cxx'; fi` rtty/fldigi-view_rtty.o: rtty/view_rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rtty/fldigi-view_rtty.o -MD -MP -MF rtty/$(DEPDIR)/fldigi-view_rtty.Tpo -c -o rtty/fldigi-view_rtty.o `test -f 'rtty/view_rtty.cxx' || echo '$(srcdir)/'`rtty/view_rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rtty/$(DEPDIR)/fldigi-view_rtty.Tpo rtty/$(DEPDIR)/fldigi-view_rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rtty/view_rtty.cxx' object='rtty/fldigi-view_rtty.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rtty/fldigi-view_rtty.o `test -f 'rtty/view_rtty.cxx' || echo '$(srcdir)/'`rtty/view_rtty.cxx rtty/fldigi-view_rtty.obj: rtty/view_rtty.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rtty/fldigi-view_rtty.obj -MD -MP -MF rtty/$(DEPDIR)/fldigi-view_rtty.Tpo -c -o rtty/fldigi-view_rtty.obj `if test -f 'rtty/view_rtty.cxx'; then $(CYGPATH_W) 'rtty/view_rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/rtty/view_rtty.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rtty/$(DEPDIR)/fldigi-view_rtty.Tpo rtty/$(DEPDIR)/fldigi-view_rtty.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rtty/view_rtty.cxx' object='rtty/fldigi-view_rtty.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rtty/fldigi-view_rtty.obj `if test -f 'rtty/view_rtty.cxx'; then $(CYGPATH_W) 'rtty/view_rtty.cxx'; else $(CYGPATH_W) '$(srcdir)/rtty/view_rtty.cxx'; fi` debug/fldigi-debug.o: debug/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT debug/fldigi-debug.o -MD -MP -MF debug/$(DEPDIR)/fldigi-debug.Tpo -c -o debug/fldigi-debug.o `test -f 'debug/debug.cxx' || echo '$(srcdir)/'`debug/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) debug/$(DEPDIR)/fldigi-debug.Tpo debug/$(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='debug/debug.cxx' object='debug/fldigi-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o debug/fldigi-debug.o `test -f 'debug/debug.cxx' || echo '$(srcdir)/'`debug/debug.cxx debug/fldigi-debug.obj: debug/debug.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT debug/fldigi-debug.obj -MD -MP -MF debug/$(DEPDIR)/fldigi-debug.Tpo -c -o debug/fldigi-debug.obj `if test -f 'debug/debug.cxx'; then $(CYGPATH_W) 'debug/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/debug/debug.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) debug/$(DEPDIR)/fldigi-debug.Tpo debug/$(DEPDIR)/fldigi-debug.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='debug/debug.cxx' object='debug/fldigi-debug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o debug/fldigi-debug.obj `if test -f 'debug/debug.cxx'; then $(CYGPATH_W) 'debug/debug.cxx'; else $(CYGPATH_W) '$(srcdir)/debug/debug.cxx'; fi` debug/fldigi-debug_dialog.o: debug/debug_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT debug/fldigi-debug_dialog.o -MD -MP -MF debug/$(DEPDIR)/fldigi-debug_dialog.Tpo -c -o debug/fldigi-debug_dialog.o `test -f 'debug/debug_dialog.cxx' || echo '$(srcdir)/'`debug/debug_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) debug/$(DEPDIR)/fldigi-debug_dialog.Tpo debug/$(DEPDIR)/fldigi-debug_dialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='debug/debug_dialog.cxx' object='debug/fldigi-debug_dialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o debug/fldigi-debug_dialog.o `test -f 'debug/debug_dialog.cxx' || echo '$(srcdir)/'`debug/debug_dialog.cxx debug/fldigi-debug_dialog.obj: debug/debug_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT debug/fldigi-debug_dialog.obj -MD -MP -MF debug/$(DEPDIR)/fldigi-debug_dialog.Tpo -c -o debug/fldigi-debug_dialog.obj `if test -f 'debug/debug_dialog.cxx'; then $(CYGPATH_W) 'debug/debug_dialog.cxx'; else $(CYGPATH_W) '$(srcdir)/debug/debug_dialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) debug/$(DEPDIR)/fldigi-debug_dialog.Tpo debug/$(DEPDIR)/fldigi-debug_dialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='debug/debug_dialog.cxx' object='debug/fldigi-debug_dialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o debug/fldigi-debug_dialog.obj `if test -f 'debug/debug_dialog.cxx'; then $(CYGPATH_W) 'debug/debug_dialog.cxx'; else $(CYGPATH_W) '$(srcdir)/debug/debug_dialog.cxx'; fi` dialogs/fldigi-confdialog.o: dialogs/confdialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-confdialog.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-confdialog.Tpo -c -o dialogs/fldigi-confdialog.o `test -f 'dialogs/confdialog.cxx' || echo '$(srcdir)/'`dialogs/confdialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-confdialog.Tpo dialogs/$(DEPDIR)/fldigi-confdialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/confdialog.cxx' object='dialogs/fldigi-confdialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-confdialog.o `test -f 'dialogs/confdialog.cxx' || echo '$(srcdir)/'`dialogs/confdialog.cxx dialogs/fldigi-confdialog.obj: dialogs/confdialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-confdialog.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-confdialog.Tpo -c -o dialogs/fldigi-confdialog.obj `if test -f 'dialogs/confdialog.cxx'; then $(CYGPATH_W) 'dialogs/confdialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/confdialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-confdialog.Tpo dialogs/$(DEPDIR)/fldigi-confdialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/confdialog.cxx' object='dialogs/fldigi-confdialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-confdialog.obj `if test -f 'dialogs/confdialog.cxx'; then $(CYGPATH_W) 'dialogs/confdialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/confdialog.cxx'; fi` dialogs/fldigi-fl_digi.o: dialogs/fl_digi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-fl_digi.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-fl_digi.Tpo -c -o dialogs/fldigi-fl_digi.o `test -f 'dialogs/fl_digi.cxx' || echo '$(srcdir)/'`dialogs/fl_digi.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-fl_digi.Tpo dialogs/$(DEPDIR)/fldigi-fl_digi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi.cxx' object='dialogs/fldigi-fl_digi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-fl_digi.o `test -f 'dialogs/fl_digi.cxx' || echo '$(srcdir)/'`dialogs/fl_digi.cxx dialogs/fldigi-fl_digi.obj: dialogs/fl_digi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-fl_digi.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-fl_digi.Tpo -c -o dialogs/fldigi-fl_digi.obj `if test -f 'dialogs/fl_digi.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-fl_digi.Tpo dialogs/$(DEPDIR)/fldigi-fl_digi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi.cxx' object='dialogs/fldigi-fl_digi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-fl_digi.obj `if test -f 'dialogs/fl_digi.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi.cxx'; fi` dialogs/fldigi-font_browser.o: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-font_browser.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-font_browser.Tpo -c -o dialogs/fldigi-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-font_browser.Tpo dialogs/$(DEPDIR)/fldigi-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='dialogs/fldigi-font_browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-font_browser.o `test -f 'dialogs/font_browser.cxx' || echo '$(srcdir)/'`dialogs/font_browser.cxx dialogs/fldigi-font_browser.obj: dialogs/font_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-font_browser.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-font_browser.Tpo -c -o dialogs/fldigi-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-font_browser.Tpo dialogs/$(DEPDIR)/fldigi-font_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/font_browser.cxx' object='dialogs/fldigi-font_browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-font_browser.obj `if test -f 'dialogs/font_browser.cxx'; then $(CYGPATH_W) 'dialogs/font_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/font_browser.cxx'; fi` dialogs/fldigi-htmlstrings.o: dialogs/htmlstrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-htmlstrings.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-htmlstrings.Tpo -c -o dialogs/fldigi-htmlstrings.o `test -f 'dialogs/htmlstrings.cxx' || echo '$(srcdir)/'`dialogs/htmlstrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-htmlstrings.Tpo dialogs/$(DEPDIR)/fldigi-htmlstrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/htmlstrings.cxx' object='dialogs/fldigi-htmlstrings.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-htmlstrings.o `test -f 'dialogs/htmlstrings.cxx' || echo '$(srcdir)/'`dialogs/htmlstrings.cxx dialogs/fldigi-htmlstrings.obj: dialogs/htmlstrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-htmlstrings.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-htmlstrings.Tpo -c -o dialogs/fldigi-htmlstrings.obj `if test -f 'dialogs/htmlstrings.cxx'; then $(CYGPATH_W) 'dialogs/htmlstrings.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/htmlstrings.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-htmlstrings.Tpo dialogs/$(DEPDIR)/fldigi-htmlstrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/htmlstrings.cxx' object='dialogs/fldigi-htmlstrings.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-htmlstrings.obj `if test -f 'dialogs/htmlstrings.cxx'; then $(CYGPATH_W) 'dialogs/htmlstrings.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/htmlstrings.cxx'; fi` dialogs/fldigi-notifydialog.o: dialogs/notifydialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-notifydialog.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-notifydialog.Tpo -c -o dialogs/fldigi-notifydialog.o `test -f 'dialogs/notifydialog.cxx' || echo '$(srcdir)/'`dialogs/notifydialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-notifydialog.Tpo dialogs/$(DEPDIR)/fldigi-notifydialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/notifydialog.cxx' object='dialogs/fldigi-notifydialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-notifydialog.o `test -f 'dialogs/notifydialog.cxx' || echo '$(srcdir)/'`dialogs/notifydialog.cxx dialogs/fldigi-notifydialog.obj: dialogs/notifydialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-notifydialog.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-notifydialog.Tpo -c -o dialogs/fldigi-notifydialog.obj `if test -f 'dialogs/notifydialog.cxx'; then $(CYGPATH_W) 'dialogs/notifydialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/notifydialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-notifydialog.Tpo dialogs/$(DEPDIR)/fldigi-notifydialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/notifydialog.cxx' object='dialogs/fldigi-notifydialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-notifydialog.obj `if test -f 'dialogs/notifydialog.cxx'; then $(CYGPATH_W) 'dialogs/notifydialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/notifydialog.cxx'; fi` dialogs/fldigi-record_browse.o: dialogs/record_browse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-record_browse.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-record_browse.Tpo -c -o dialogs/fldigi-record_browse.o `test -f 'dialogs/record_browse.cxx' || echo '$(srcdir)/'`dialogs/record_browse.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-record_browse.Tpo dialogs/$(DEPDIR)/fldigi-record_browse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/record_browse.cxx' object='dialogs/fldigi-record_browse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-record_browse.o `test -f 'dialogs/record_browse.cxx' || echo '$(srcdir)/'`dialogs/record_browse.cxx dialogs/fldigi-record_browse.obj: dialogs/record_browse.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-record_browse.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-record_browse.Tpo -c -o dialogs/fldigi-record_browse.obj `if test -f 'dialogs/record_browse.cxx'; then $(CYGPATH_W) 'dialogs/record_browse.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/record_browse.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-record_browse.Tpo dialogs/$(DEPDIR)/fldigi-record_browse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/record_browse.cxx' object='dialogs/fldigi-record_browse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-record_browse.obj `if test -f 'dialogs/record_browse.cxx'; then $(CYGPATH_W) 'dialogs/record_browse.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/record_browse.cxx'; fi` dialogs/fldigi-rxmon.o: dialogs/rxmon.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-rxmon.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-rxmon.Tpo -c -o dialogs/fldigi-rxmon.o `test -f 'dialogs/rxmon.cxx' || echo '$(srcdir)/'`dialogs/rxmon.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-rxmon.Tpo dialogs/$(DEPDIR)/fldigi-rxmon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/rxmon.cxx' object='dialogs/fldigi-rxmon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-rxmon.o `test -f 'dialogs/rxmon.cxx' || echo '$(srcdir)/'`dialogs/rxmon.cxx dialogs/fldigi-rxmon.obj: dialogs/rxmon.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-rxmon.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-rxmon.Tpo -c -o dialogs/fldigi-rxmon.obj `if test -f 'dialogs/rxmon.cxx'; then $(CYGPATH_W) 'dialogs/rxmon.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/rxmon.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-rxmon.Tpo dialogs/$(DEPDIR)/fldigi-rxmon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/rxmon.cxx' object='dialogs/fldigi-rxmon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-rxmon.obj `if test -f 'dialogs/rxmon.cxx'; then $(CYGPATH_W) 'dialogs/rxmon.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/rxmon.cxx'; fi` dialogs/fldigi-testsigs.o: dialogs/testsigs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-testsigs.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-testsigs.Tpo -c -o dialogs/fldigi-testsigs.o `test -f 'dialogs/testsigs.cxx' || echo '$(srcdir)/'`dialogs/testsigs.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-testsigs.Tpo dialogs/$(DEPDIR)/fldigi-testsigs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/testsigs.cxx' object='dialogs/fldigi-testsigs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-testsigs.o `test -f 'dialogs/testsigs.cxx' || echo '$(srcdir)/'`dialogs/testsigs.cxx dialogs/fldigi-testsigs.obj: dialogs/testsigs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-testsigs.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-testsigs.Tpo -c -o dialogs/fldigi-testsigs.obj `if test -f 'dialogs/testsigs.cxx'; then $(CYGPATH_W) 'dialogs/testsigs.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/testsigs.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-testsigs.Tpo dialogs/$(DEPDIR)/fldigi-testsigs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/testsigs.cxx' object='dialogs/fldigi-testsigs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-testsigs.obj `if test -f 'dialogs/testsigs.cxx'; then $(CYGPATH_W) 'dialogs/testsigs.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/testsigs.cxx'; fi` dialogs/fldigi-tod_clock.o: dialogs/tod_clock.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-tod_clock.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-tod_clock.Tpo -c -o dialogs/fldigi-tod_clock.o `test -f 'dialogs/tod_clock.cxx' || echo '$(srcdir)/'`dialogs/tod_clock.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-tod_clock.Tpo dialogs/$(DEPDIR)/fldigi-tod_clock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/tod_clock.cxx' object='dialogs/fldigi-tod_clock.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-tod_clock.o `test -f 'dialogs/tod_clock.cxx' || echo '$(srcdir)/'`dialogs/tod_clock.cxx dialogs/fldigi-tod_clock.obj: dialogs/tod_clock.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-tod_clock.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-tod_clock.Tpo -c -o dialogs/fldigi-tod_clock.obj `if test -f 'dialogs/tod_clock.cxx'; then $(CYGPATH_W) 'dialogs/tod_clock.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/tod_clock.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-tod_clock.Tpo dialogs/$(DEPDIR)/fldigi-tod_clock.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/tod_clock.cxx' object='dialogs/fldigi-tod_clock.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-tod_clock.obj `if test -f 'dialogs/tod_clock.cxx'; then $(CYGPATH_W) 'dialogs/tod_clock.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/tod_clock.cxx'; fi` dialogs/fldigi-Viewer.o: dialogs/Viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-Viewer.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-Viewer.Tpo -c -o dialogs/fldigi-Viewer.o `test -f 'dialogs/Viewer.cxx' || echo '$(srcdir)/'`dialogs/Viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-Viewer.Tpo dialogs/$(DEPDIR)/fldigi-Viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/Viewer.cxx' object='dialogs/fldigi-Viewer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-Viewer.o `test -f 'dialogs/Viewer.cxx' || echo '$(srcdir)/'`dialogs/Viewer.cxx dialogs/fldigi-Viewer.obj: dialogs/Viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-Viewer.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-Viewer.Tpo -c -o dialogs/fldigi-Viewer.obj `if test -f 'dialogs/Viewer.cxx'; then $(CYGPATH_W) 'dialogs/Viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/Viewer.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-Viewer.Tpo dialogs/$(DEPDIR)/fldigi-Viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/Viewer.cxx' object='dialogs/fldigi-Viewer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-Viewer.obj `if test -f 'dialogs/Viewer.cxx'; then $(CYGPATH_W) 'dialogs/Viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/Viewer.cxx'; fi` dominoex/fldigi-dominoex.o: dominoex/dominoex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dominoex/fldigi-dominoex.o -MD -MP -MF dominoex/$(DEPDIR)/fldigi-dominoex.Tpo -c -o dominoex/fldigi-dominoex.o `test -f 'dominoex/dominoex.cxx' || echo '$(srcdir)/'`dominoex/dominoex.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dominoex/$(DEPDIR)/fldigi-dominoex.Tpo dominoex/$(DEPDIR)/fldigi-dominoex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominoex.cxx' object='dominoex/fldigi-dominoex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dominoex/fldigi-dominoex.o `test -f 'dominoex/dominoex.cxx' || echo '$(srcdir)/'`dominoex/dominoex.cxx dominoex/fldigi-dominoex.obj: dominoex/dominoex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dominoex/fldigi-dominoex.obj -MD -MP -MF dominoex/$(DEPDIR)/fldigi-dominoex.Tpo -c -o dominoex/fldigi-dominoex.obj `if test -f 'dominoex/dominoex.cxx'; then $(CYGPATH_W) 'dominoex/dominoex.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominoex.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dominoex/$(DEPDIR)/fldigi-dominoex.Tpo dominoex/$(DEPDIR)/fldigi-dominoex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominoex.cxx' object='dominoex/fldigi-dominoex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dominoex/fldigi-dominoex.obj `if test -f 'dominoex/dominoex.cxx'; then $(CYGPATH_W) 'dominoex/dominoex.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominoex.cxx'; fi` dominoex/fldigi-dominovar.o: dominoex/dominovar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dominoex/fldigi-dominovar.o -MD -MP -MF dominoex/$(DEPDIR)/fldigi-dominovar.Tpo -c -o dominoex/fldigi-dominovar.o `test -f 'dominoex/dominovar.cxx' || echo '$(srcdir)/'`dominoex/dominovar.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dominoex/$(DEPDIR)/fldigi-dominovar.Tpo dominoex/$(DEPDIR)/fldigi-dominovar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominovar.cxx' object='dominoex/fldigi-dominovar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dominoex/fldigi-dominovar.o `test -f 'dominoex/dominovar.cxx' || echo '$(srcdir)/'`dominoex/dominovar.cxx dominoex/fldigi-dominovar.obj: dominoex/dominovar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dominoex/fldigi-dominovar.obj -MD -MP -MF dominoex/$(DEPDIR)/fldigi-dominovar.Tpo -c -o dominoex/fldigi-dominovar.obj `if test -f 'dominoex/dominovar.cxx'; then $(CYGPATH_W) 'dominoex/dominovar.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominovar.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dominoex/$(DEPDIR)/fldigi-dominovar.Tpo dominoex/$(DEPDIR)/fldigi-dominovar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dominoex/dominovar.cxx' object='dominoex/fldigi-dominovar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dominoex/fldigi-dominovar.obj `if test -f 'dominoex/dominovar.cxx'; then $(CYGPATH_W) 'dominoex/dominovar.cxx'; else $(CYGPATH_W) '$(srcdir)/dominoex/dominovar.cxx'; fi` dtmf/fldigi-dtmf.o: dtmf/dtmf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dtmf/fldigi-dtmf.o -MD -MP -MF dtmf/$(DEPDIR)/fldigi-dtmf.Tpo -c -o dtmf/fldigi-dtmf.o `test -f 'dtmf/dtmf.cxx' || echo '$(srcdir)/'`dtmf/dtmf.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dtmf/$(DEPDIR)/fldigi-dtmf.Tpo dtmf/$(DEPDIR)/fldigi-dtmf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dtmf/dtmf.cxx' object='dtmf/fldigi-dtmf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dtmf/fldigi-dtmf.o `test -f 'dtmf/dtmf.cxx' || echo '$(srcdir)/'`dtmf/dtmf.cxx dtmf/fldigi-dtmf.obj: dtmf/dtmf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dtmf/fldigi-dtmf.obj -MD -MP -MF dtmf/$(DEPDIR)/fldigi-dtmf.Tpo -c -o dtmf/fldigi-dtmf.obj `if test -f 'dtmf/dtmf.cxx'; then $(CYGPATH_W) 'dtmf/dtmf.cxx'; else $(CYGPATH_W) '$(srcdir)/dtmf/dtmf.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dtmf/$(DEPDIR)/fldigi-dtmf.Tpo dtmf/$(DEPDIR)/fldigi-dtmf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dtmf/dtmf.cxx' object='dtmf/fldigi-dtmf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dtmf/fldigi-dtmf.obj `if test -f 'dtmf/dtmf.cxx'; then $(CYGPATH_W) 'dtmf/dtmf.cxx'; else $(CYGPATH_W) '$(srcdir)/dtmf/dtmf.cxx'; fi` dxcluster/fldigi-dxcluster.o: dxcluster/dxcluster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-dxcluster.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-dxcluster.Tpo -c -o dxcluster/fldigi-dxcluster.o `test -f 'dxcluster/dxcluster.cxx' || echo '$(srcdir)/'`dxcluster/dxcluster.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-dxcluster.Tpo dxcluster/$(DEPDIR)/fldigi-dxcluster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/dxcluster.cxx' object='dxcluster/fldigi-dxcluster.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-dxcluster.o `test -f 'dxcluster/dxcluster.cxx' || echo '$(srcdir)/'`dxcluster/dxcluster.cxx dxcluster/fldigi-dxcluster.obj: dxcluster/dxcluster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-dxcluster.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-dxcluster.Tpo -c -o dxcluster/fldigi-dxcluster.obj `if test -f 'dxcluster/dxcluster.cxx'; then $(CYGPATH_W) 'dxcluster/dxcluster.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/dxcluster.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-dxcluster.Tpo dxcluster/$(DEPDIR)/fldigi-dxcluster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/dxcluster.cxx' object='dxcluster/fldigi-dxcluster.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-dxcluster.obj `if test -f 'dxcluster/dxcluster.cxx'; then $(CYGPATH_W) 'dxcluster/dxcluster.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/dxcluster.cxx'; fi` dxcluster/fldigi-dx_dialog.o: dxcluster/dx_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-dx_dialog.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-dx_dialog.Tpo -c -o dxcluster/fldigi-dx_dialog.o `test -f 'dxcluster/dx_dialog.cxx' || echo '$(srcdir)/'`dxcluster/dx_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-dx_dialog.Tpo dxcluster/$(DEPDIR)/fldigi-dx_dialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/dx_dialog.cxx' object='dxcluster/fldigi-dx_dialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-dx_dialog.o `test -f 'dxcluster/dx_dialog.cxx' || echo '$(srcdir)/'`dxcluster/dx_dialog.cxx dxcluster/fldigi-dx_dialog.obj: dxcluster/dx_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-dx_dialog.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-dx_dialog.Tpo -c -o dxcluster/fldigi-dx_dialog.obj `if test -f 'dxcluster/dx_dialog.cxx'; then $(CYGPATH_W) 'dxcluster/dx_dialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/dx_dialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-dx_dialog.Tpo dxcluster/$(DEPDIR)/fldigi-dx_dialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/dx_dialog.cxx' object='dxcluster/fldigi-dx_dialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-dx_dialog.obj `if test -f 'dxcluster/dx_dialog.cxx'; then $(CYGPATH_W) 'dxcluster/dx_dialog.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/dx_dialog.cxx'; fi` feld/fldigi-feld.o: feld/feld.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-feld.o -MD -MP -MF feld/$(DEPDIR)/fldigi-feld.Tpo -c -o feld/fldigi-feld.o `test -f 'feld/feld.cxx' || echo '$(srcdir)/'`feld/feld.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-feld.Tpo feld/$(DEPDIR)/fldigi-feld.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feld.cxx' object='feld/fldigi-feld.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-feld.o `test -f 'feld/feld.cxx' || echo '$(srcdir)/'`feld/feld.cxx feld/fldigi-feld.obj: feld/feld.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-feld.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-feld.Tpo -c -o feld/fldigi-feld.obj `if test -f 'feld/feld.cxx'; then $(CYGPATH_W) 'feld/feld.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feld.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-feld.Tpo feld/$(DEPDIR)/fldigi-feld.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feld.cxx' object='feld/fldigi-feld.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-feld.obj `if test -f 'feld/feld.cxx'; then $(CYGPATH_W) 'feld/feld.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feld.cxx'; fi` feld/fldigi-feldfonts.o: feld/feldfonts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-feldfonts.o -MD -MP -MF feld/$(DEPDIR)/fldigi-feldfonts.Tpo -c -o feld/fldigi-feldfonts.o `test -f 'feld/feldfonts.cxx' || echo '$(srcdir)/'`feld/feldfonts.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-feldfonts.Tpo feld/$(DEPDIR)/fldigi-feldfonts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feldfonts.cxx' object='feld/fldigi-feldfonts.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-feldfonts.o `test -f 'feld/feldfonts.cxx' || echo '$(srcdir)/'`feld/feldfonts.cxx feld/fldigi-feldfonts.obj: feld/feldfonts.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-feldfonts.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-feldfonts.Tpo -c -o feld/fldigi-feldfonts.obj `if test -f 'feld/feldfonts.cxx'; then $(CYGPATH_W) 'feld/feldfonts.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feldfonts.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-feldfonts.Tpo feld/$(DEPDIR)/fldigi-feldfonts.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/feldfonts.cxx' object='feld/fldigi-feldfonts.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-feldfonts.obj `if test -f 'feld/feldfonts.cxx'; then $(CYGPATH_W) 'feld/feldfonts.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/feldfonts.cxx'; fi` fft-monitor/fldigi-fft-monitor.o: fft-monitor/fft-monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-fft-monitor.o -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Tpo -c -o fft-monitor/fldigi-fft-monitor.o `test -f 'fft-monitor/fft-monitor.cxx' || echo '$(srcdir)/'`fft-monitor/fft-monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Tpo fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/fft-monitor.cxx' object='fft-monitor/fldigi-fft-monitor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-fft-monitor.o `test -f 'fft-monitor/fft-monitor.cxx' || echo '$(srcdir)/'`fft-monitor/fft-monitor.cxx fft-monitor/fldigi-fft-monitor.obj: fft-monitor/fft-monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-fft-monitor.obj -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Tpo -c -o fft-monitor/fldigi-fft-monitor.obj `if test -f 'fft-monitor/fft-monitor.cxx'; then $(CYGPATH_W) 'fft-monitor/fft-monitor.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/fft-monitor.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Tpo fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/fft-monitor.cxx' object='fft-monitor/fldigi-fft-monitor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-fft-monitor.obj `if test -f 'fft-monitor/fft-monitor.cxx'; then $(CYGPATH_W) 'fft-monitor/fft-monitor.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/fft-monitor.cxx'; fi` fft-monitor/fldigi-spectrum.o: fft-monitor/spectrum.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-spectrum.o -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-spectrum.Tpo -c -o fft-monitor/fldigi-spectrum.o `test -f 'fft-monitor/spectrum.cxx' || echo '$(srcdir)/'`fft-monitor/spectrum.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-spectrum.Tpo fft-monitor/$(DEPDIR)/fldigi-spectrum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/spectrum.cxx' object='fft-monitor/fldigi-spectrum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-spectrum.o `test -f 'fft-monitor/spectrum.cxx' || echo '$(srcdir)/'`fft-monitor/spectrum.cxx fft-monitor/fldigi-spectrum.obj: fft-monitor/spectrum.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-spectrum.obj -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-spectrum.Tpo -c -o fft-monitor/fldigi-spectrum.obj `if test -f 'fft-monitor/spectrum.cxx'; then $(CYGPATH_W) 'fft-monitor/spectrum.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/spectrum.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-spectrum.Tpo fft-monitor/$(DEPDIR)/fldigi-spectrum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/spectrum.cxx' object='fft-monitor/fldigi-spectrum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-spectrum.obj `if test -f 'fft-monitor/spectrum.cxx'; then $(CYGPATH_W) 'fft-monitor/spectrum.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/spectrum.cxx'; fi` fft-monitor/fldigi-spectrum_viewer.o: fft-monitor/spectrum_viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-spectrum_viewer.o -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Tpo -c -o fft-monitor/fldigi-spectrum_viewer.o `test -f 'fft-monitor/spectrum_viewer.cxx' || echo '$(srcdir)/'`fft-monitor/spectrum_viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Tpo fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/spectrum_viewer.cxx' object='fft-monitor/fldigi-spectrum_viewer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-spectrum_viewer.o `test -f 'fft-monitor/spectrum_viewer.cxx' || echo '$(srcdir)/'`fft-monitor/spectrum_viewer.cxx fft-monitor/fldigi-spectrum_viewer.obj: fft-monitor/spectrum_viewer.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fft-monitor/fldigi-spectrum_viewer.obj -MD -MP -MF fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Tpo -c -o fft-monitor/fldigi-spectrum_viewer.obj `if test -f 'fft-monitor/spectrum_viewer.cxx'; then $(CYGPATH_W) 'fft-monitor/spectrum_viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/spectrum_viewer.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Tpo fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fft-monitor/spectrum_viewer.cxx' object='fft-monitor/fldigi-spectrum_viewer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fft-monitor/fldigi-spectrum_viewer.obj `if test -f 'fft-monitor/spectrum_viewer.cxx'; then $(CYGPATH_W) 'fft-monitor/spectrum_viewer.cxx'; else $(CYGPATH_W) '$(srcdir)/fft-monitor/spectrum_viewer.cxx'; fi` fileselector/fldigi-fileselect.o: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fileselector/fldigi-fileselect.o -MD -MP -MF fileselector/$(DEPDIR)/fldigi-fileselect.Tpo -c -o fileselector/fldigi-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/fldigi-fileselect.Tpo fileselector/$(DEPDIR)/fldigi-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fileselector/fldigi-fileselect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/fldigi-fileselect.o `test -f 'fileselector/fileselect.cxx' || echo '$(srcdir)/'`fileselector/fileselect.cxx fileselector/fldigi-fileselect.obj: fileselector/fileselect.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fileselector/fldigi-fileselect.obj -MD -MP -MF fileselector/$(DEPDIR)/fldigi-fileselect.Tpo -c -o fileselector/fldigi-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/fldigi-fileselect.Tpo fileselector/$(DEPDIR)/fldigi-fileselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/fileselect.cxx' object='fileselector/fldigi-fileselect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/fldigi-fileselect.obj `if test -f 'fileselector/fileselect.cxx'; then $(CYGPATH_W) 'fileselector/fileselect.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/fileselect.cxx'; fi` filters/fldigi-fftfilt.o: filters/fftfilt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-fftfilt.o -MD -MP -MF filters/$(DEPDIR)/fldigi-fftfilt.Tpo -c -o filters/fldigi-fftfilt.o `test -f 'filters/fftfilt.cxx' || echo '$(srcdir)/'`filters/fftfilt.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-fftfilt.Tpo filters/$(DEPDIR)/fldigi-fftfilt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/fftfilt.cxx' object='filters/fldigi-fftfilt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-fftfilt.o `test -f 'filters/fftfilt.cxx' || echo '$(srcdir)/'`filters/fftfilt.cxx filters/fldigi-fftfilt.obj: filters/fftfilt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-fftfilt.obj -MD -MP -MF filters/$(DEPDIR)/fldigi-fftfilt.Tpo -c -o filters/fldigi-fftfilt.obj `if test -f 'filters/fftfilt.cxx'; then $(CYGPATH_W) 'filters/fftfilt.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/fftfilt.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-fftfilt.Tpo filters/$(DEPDIR)/fldigi-fftfilt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/fftfilt.cxx' object='filters/fldigi-fftfilt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-fftfilt.obj `if test -f 'filters/fftfilt.cxx'; then $(CYGPATH_W) 'filters/fftfilt.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/fftfilt.cxx'; fi` filters/fldigi-filters.o: filters/filters.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-filters.o -MD -MP -MF filters/$(DEPDIR)/fldigi-filters.Tpo -c -o filters/fldigi-filters.o `test -f 'filters/filters.cxx' || echo '$(srcdir)/'`filters/filters.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-filters.Tpo filters/$(DEPDIR)/fldigi-filters.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/filters.cxx' object='filters/fldigi-filters.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-filters.o `test -f 'filters/filters.cxx' || echo '$(srcdir)/'`filters/filters.cxx filters/fldigi-filters.obj: filters/filters.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-filters.obj -MD -MP -MF filters/$(DEPDIR)/fldigi-filters.Tpo -c -o filters/fldigi-filters.obj `if test -f 'filters/filters.cxx'; then $(CYGPATH_W) 'filters/filters.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/filters.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-filters.Tpo filters/$(DEPDIR)/fldigi-filters.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/filters.cxx' object='filters/fldigi-filters.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-filters.obj `if test -f 'filters/filters.cxx'; then $(CYGPATH_W) 'filters/filters.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/filters.cxx'; fi` filters/fldigi-viterbi.o: filters/viterbi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-viterbi.o -MD -MP -MF filters/$(DEPDIR)/fldigi-viterbi.Tpo -c -o filters/fldigi-viterbi.o `test -f 'filters/viterbi.cxx' || echo '$(srcdir)/'`filters/viterbi.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-viterbi.Tpo filters/$(DEPDIR)/fldigi-viterbi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/viterbi.cxx' object='filters/fldigi-viterbi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-viterbi.o `test -f 'filters/viterbi.cxx' || echo '$(srcdir)/'`filters/viterbi.cxx filters/fldigi-viterbi.obj: filters/viterbi.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT filters/fldigi-viterbi.obj -MD -MP -MF filters/$(DEPDIR)/fldigi-viterbi.Tpo -c -o filters/fldigi-viterbi.obj `if test -f 'filters/viterbi.cxx'; then $(CYGPATH_W) 'filters/viterbi.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/viterbi.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) filters/$(DEPDIR)/fldigi-viterbi.Tpo filters/$(DEPDIR)/fldigi-viterbi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='filters/viterbi.cxx' object='filters/fldigi-viterbi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o filters/fldigi-viterbi.obj `if test -f 'filters/viterbi.cxx'; then $(CYGPATH_W) 'filters/viterbi.cxx'; else $(CYGPATH_W) '$(srcdir)/filters/viterbi.cxx'; fi` fmt/fldigi-fmt.o: fmt/fmt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fmt/fldigi-fmt.o -MD -MP -MF fmt/$(DEPDIR)/fldigi-fmt.Tpo -c -o fmt/fldigi-fmt.o `test -f 'fmt/fmt.cxx' || echo '$(srcdir)/'`fmt/fmt.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fmt/$(DEPDIR)/fldigi-fmt.Tpo fmt/$(DEPDIR)/fldigi-fmt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fmt/fmt.cxx' object='fmt/fldigi-fmt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fmt/fldigi-fmt.o `test -f 'fmt/fmt.cxx' || echo '$(srcdir)/'`fmt/fmt.cxx fmt/fldigi-fmt.obj: fmt/fmt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fmt/fldigi-fmt.obj -MD -MP -MF fmt/$(DEPDIR)/fldigi-fmt.Tpo -c -o fmt/fldigi-fmt.obj `if test -f 'fmt/fmt.cxx'; then $(CYGPATH_W) 'fmt/fmt.cxx'; else $(CYGPATH_W) '$(srcdir)/fmt/fmt.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fmt/$(DEPDIR)/fldigi-fmt.Tpo fmt/$(DEPDIR)/fldigi-fmt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fmt/fmt.cxx' object='fmt/fldigi-fmt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fmt/fldigi-fmt.obj `if test -f 'fmt/fmt.cxx'; then $(CYGPATH_W) 'fmt/fmt.cxx'; else $(CYGPATH_W) '$(srcdir)/fmt/fmt.cxx'; fi` fmt/fldigi-fmt_dialog.o: fmt/fmt_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fmt/fldigi-fmt_dialog.o -MD -MP -MF fmt/$(DEPDIR)/fldigi-fmt_dialog.Tpo -c -o fmt/fldigi-fmt_dialog.o `test -f 'fmt/fmt_dialog.cxx' || echo '$(srcdir)/'`fmt/fmt_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fmt/$(DEPDIR)/fldigi-fmt_dialog.Tpo fmt/$(DEPDIR)/fldigi-fmt_dialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fmt/fmt_dialog.cxx' object='fmt/fldigi-fmt_dialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fmt/fldigi-fmt_dialog.o `test -f 'fmt/fmt_dialog.cxx' || echo '$(srcdir)/'`fmt/fmt_dialog.cxx fmt/fldigi-fmt_dialog.obj: fmt/fmt_dialog.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fmt/fldigi-fmt_dialog.obj -MD -MP -MF fmt/$(DEPDIR)/fldigi-fmt_dialog.Tpo -c -o fmt/fldigi-fmt_dialog.obj `if test -f 'fmt/fmt_dialog.cxx'; then $(CYGPATH_W) 'fmt/fmt_dialog.cxx'; else $(CYGPATH_W) '$(srcdir)/fmt/fmt_dialog.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fmt/$(DEPDIR)/fldigi-fmt_dialog.Tpo fmt/$(DEPDIR)/fldigi-fmt_dialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fmt/fmt_dialog.cxx' object='fmt/fldigi-fmt_dialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fmt/fldigi-fmt_dialog.obj `if test -f 'fmt/fmt_dialog.cxx'; then $(CYGPATH_W) 'fmt/fmt_dialog.cxx'; else $(CYGPATH_W) '$(srcdir)/fmt/fmt_dialog.cxx'; fi` fsq/fldigi-fsq.o: fsq/fsq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq.Tpo -c -o fsq/fldigi-fsq.o `test -f 'fsq/fsq.cxx' || echo '$(srcdir)/'`fsq/fsq.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq.Tpo fsq/$(DEPDIR)/fldigi-fsq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq.cxx' object='fsq/fldigi-fsq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq.o `test -f 'fsq/fsq.cxx' || echo '$(srcdir)/'`fsq/fsq.cxx fsq/fldigi-fsq.obj: fsq/fsq.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq.Tpo -c -o fsq/fldigi-fsq.obj `if test -f 'fsq/fsq.cxx'; then $(CYGPATH_W) 'fsq/fsq.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq.Tpo fsq/$(DEPDIR)/fldigi-fsq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq.cxx' object='fsq/fldigi-fsq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq.obj `if test -f 'fsq/fsq.cxx'; then $(CYGPATH_W) 'fsq/fsq.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq.cxx'; fi` fsq/fldigi-fsq_monitor.o: fsq/fsq_monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq_monitor.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq_monitor.Tpo -c -o fsq/fldigi-fsq_monitor.o `test -f 'fsq/fsq_monitor.cxx' || echo '$(srcdir)/'`fsq/fsq_monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq_monitor.Tpo fsq/$(DEPDIR)/fldigi-fsq_monitor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq_monitor.cxx' object='fsq/fldigi-fsq_monitor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq_monitor.o `test -f 'fsq/fsq_monitor.cxx' || echo '$(srcdir)/'`fsq/fsq_monitor.cxx fsq/fldigi-fsq_monitor.obj: fsq/fsq_monitor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq_monitor.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq_monitor.Tpo -c -o fsq/fldigi-fsq_monitor.obj `if test -f 'fsq/fsq_monitor.cxx'; then $(CYGPATH_W) 'fsq/fsq_monitor.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq_monitor.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq_monitor.Tpo fsq/$(DEPDIR)/fldigi-fsq_monitor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq_monitor.cxx' object='fsq/fldigi-fsq_monitor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq_monitor.obj `if test -f 'fsq/fsq_monitor.cxx'; then $(CYGPATH_W) 'fsq/fsq_monitor.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq_monitor.cxx'; fi` globals/fldigi-globals.o: globals/globals.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT globals/fldigi-globals.o -MD -MP -MF globals/$(DEPDIR)/fldigi-globals.Tpo -c -o globals/fldigi-globals.o `test -f 'globals/globals.cxx' || echo '$(srcdir)/'`globals/globals.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) globals/$(DEPDIR)/fldigi-globals.Tpo globals/$(DEPDIR)/fldigi-globals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='globals/globals.cxx' object='globals/fldigi-globals.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o globals/fldigi-globals.o `test -f 'globals/globals.cxx' || echo '$(srcdir)/'`globals/globals.cxx globals/fldigi-globals.obj: globals/globals.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT globals/fldigi-globals.obj -MD -MP -MF globals/$(DEPDIR)/fldigi-globals.Tpo -c -o globals/fldigi-globals.obj `if test -f 'globals/globals.cxx'; then $(CYGPATH_W) 'globals/globals.cxx'; else $(CYGPATH_W) '$(srcdir)/globals/globals.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) globals/$(DEPDIR)/fldigi-globals.Tpo globals/$(DEPDIR)/fldigi-globals.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='globals/globals.cxx' object='globals/fldigi-globals.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o globals/fldigi-globals.obj `if test -f 'globals/globals.cxx'; then $(CYGPATH_W) 'globals/globals.cxx'; else $(CYGPATH_W) '$(srcdir)/globals/globals.cxx'; fi` ifkp/fldigi-ifkp.o: ifkp/ifkp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp.Tpo -c -o ifkp/fldigi-ifkp.o `test -f 'ifkp/ifkp.cxx' || echo '$(srcdir)/'`ifkp/ifkp.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp.Tpo ifkp/$(DEPDIR)/fldigi-ifkp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp.cxx' object='ifkp/fldigi-ifkp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp.o `test -f 'ifkp/ifkp.cxx' || echo '$(srcdir)/'`ifkp/ifkp.cxx ifkp/fldigi-ifkp.obj: ifkp/ifkp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp.Tpo -c -o ifkp/fldigi-ifkp.obj `if test -f 'ifkp/ifkp.cxx'; then $(CYGPATH_W) 'ifkp/ifkp.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp.Tpo ifkp/$(DEPDIR)/fldigi-ifkp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp.cxx' object='ifkp/fldigi-ifkp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp.obj `if test -f 'ifkp/ifkp.cxx'; then $(CYGPATH_W) 'ifkp/ifkp.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp.cxx'; fi` ifkp/fldigi-tux.o: ifkp/tux.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-tux.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-tux.Tpo -c -o ifkp/fldigi-tux.o `test -f 'ifkp/tux.cxx' || echo '$(srcdir)/'`ifkp/tux.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-tux.Tpo ifkp/$(DEPDIR)/fldigi-tux.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/tux.cxx' object='ifkp/fldigi-tux.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-tux.o `test -f 'ifkp/tux.cxx' || echo '$(srcdir)/'`ifkp/tux.cxx ifkp/fldigi-tux.obj: ifkp/tux.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-tux.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-tux.Tpo -c -o ifkp/fldigi-tux.obj `if test -f 'ifkp/tux.cxx'; then $(CYGPATH_W) 'ifkp/tux.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/tux.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-tux.Tpo ifkp/$(DEPDIR)/fldigi-tux.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/tux.cxx' object='ifkp/fldigi-tux.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-tux.obj `if test -f 'ifkp/tux.cxx'; then $(CYGPATH_W) 'ifkp/tux.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/tux.cxx'; fi` irrxml/fldigi-irrXML.o: irrxml/irrXML.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT irrxml/fldigi-irrXML.o -MD -MP -MF irrxml/$(DEPDIR)/fldigi-irrXML.Tpo -c -o irrxml/fldigi-irrXML.o `test -f 'irrxml/irrXML.cpp' || echo '$(srcdir)/'`irrxml/irrXML.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) irrxml/$(DEPDIR)/fldigi-irrXML.Tpo irrxml/$(DEPDIR)/fldigi-irrXML.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='irrxml/irrXML.cpp' object='irrxml/fldigi-irrXML.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o irrxml/fldigi-irrXML.o `test -f 'irrxml/irrXML.cpp' || echo '$(srcdir)/'`irrxml/irrXML.cpp irrxml/fldigi-irrXML.obj: irrxml/irrXML.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT irrxml/fldigi-irrXML.obj -MD -MP -MF irrxml/$(DEPDIR)/fldigi-irrXML.Tpo -c -o irrxml/fldigi-irrXML.obj `if test -f 'irrxml/irrXML.cpp'; then $(CYGPATH_W) 'irrxml/irrXML.cpp'; else $(CYGPATH_W) '$(srcdir)/irrxml/irrXML.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) irrxml/$(DEPDIR)/fldigi-irrXML.Tpo irrxml/$(DEPDIR)/fldigi-irrXML.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='irrxml/irrXML.cpp' object='irrxml/fldigi-irrXML.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o irrxml/fldigi-irrXML.obj `if test -f 'irrxml/irrXML.cpp'; then $(CYGPATH_W) 'irrxml/irrXML.cpp'; else $(CYGPATH_W) '$(srcdir)/irrxml/irrXML.cpp'; fi` kml/fldigi-kmlserver.o: kml/kmlserver.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT kml/fldigi-kmlserver.o -MD -MP -MF kml/$(DEPDIR)/fldigi-kmlserver.Tpo -c -o kml/fldigi-kmlserver.o `test -f 'kml/kmlserver.cxx' || echo '$(srcdir)/'`kml/kmlserver.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) kml/$(DEPDIR)/fldigi-kmlserver.Tpo kml/$(DEPDIR)/fldigi-kmlserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='kml/kmlserver.cxx' object='kml/fldigi-kmlserver.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o kml/fldigi-kmlserver.o `test -f 'kml/kmlserver.cxx' || echo '$(srcdir)/'`kml/kmlserver.cxx kml/fldigi-kmlserver.obj: kml/kmlserver.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT kml/fldigi-kmlserver.obj -MD -MP -MF kml/$(DEPDIR)/fldigi-kmlserver.Tpo -c -o kml/fldigi-kmlserver.obj `if test -f 'kml/kmlserver.cxx'; then $(CYGPATH_W) 'kml/kmlserver.cxx'; else $(CYGPATH_W) '$(srcdir)/kml/kmlserver.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) kml/$(DEPDIR)/fldigi-kmlserver.Tpo kml/$(DEPDIR)/fldigi-kmlserver.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='kml/kmlserver.cxx' object='kml/fldigi-kmlserver.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o kml/fldigi-kmlserver.obj `if test -f 'kml/kmlserver.cxx'; then $(CYGPATH_W) 'kml/kmlserver.cxx'; else $(CYGPATH_W) '$(srcdir)/kml/kmlserver.cxx'; fi` logbook/fldigi-adif_io.o: logbook/adif_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-adif_io.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-adif_io.Tpo -c -o logbook/fldigi-adif_io.o `test -f 'logbook/adif_io.cxx' || echo '$(srcdir)/'`logbook/adif_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-adif_io.Tpo logbook/$(DEPDIR)/fldigi-adif_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/adif_io.cxx' object='logbook/fldigi-adif_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-adif_io.o `test -f 'logbook/adif_io.cxx' || echo '$(srcdir)/'`logbook/adif_io.cxx logbook/fldigi-adif_io.obj: logbook/adif_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-adif_io.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-adif_io.Tpo -c -o logbook/fldigi-adif_io.obj `if test -f 'logbook/adif_io.cxx'; then $(CYGPATH_W) 'logbook/adif_io.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/adif_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-adif_io.Tpo logbook/$(DEPDIR)/fldigi-adif_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/adif_io.cxx' object='logbook/fldigi-adif_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-adif_io.obj `if test -f 'logbook/adif_io.cxx'; then $(CYGPATH_W) 'logbook/adif_io.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/adif_io.cxx'; fi` logbook/fldigi-calendar.o: logbook/calendar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-calendar.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-calendar.Tpo -c -o logbook/fldigi-calendar.o `test -f 'logbook/calendar.cxx' || echo '$(srcdir)/'`logbook/calendar.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-calendar.Tpo logbook/$(DEPDIR)/fldigi-calendar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/calendar.cxx' object='logbook/fldigi-calendar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-calendar.o `test -f 'logbook/calendar.cxx' || echo '$(srcdir)/'`logbook/calendar.cxx logbook/fldigi-calendar.obj: logbook/calendar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-calendar.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-calendar.Tpo -c -o logbook/fldigi-calendar.obj `if test -f 'logbook/calendar.cxx'; then $(CYGPATH_W) 'logbook/calendar.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/calendar.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-calendar.Tpo logbook/$(DEPDIR)/fldigi-calendar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/calendar.cxx' object='logbook/fldigi-calendar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-calendar.obj `if test -f 'logbook/calendar.cxx'; then $(CYGPATH_W) 'logbook/calendar.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/calendar.cxx'; fi` logbook/fldigi-contest.o: logbook/contest.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-contest.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-contest.Tpo -c -o logbook/fldigi-contest.o `test -f 'logbook/contest.cxx' || echo '$(srcdir)/'`logbook/contest.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-contest.Tpo logbook/$(DEPDIR)/fldigi-contest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/contest.cxx' object='logbook/fldigi-contest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-contest.o `test -f 'logbook/contest.cxx' || echo '$(srcdir)/'`logbook/contest.cxx logbook/fldigi-contest.obj: logbook/contest.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-contest.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-contest.Tpo -c -o logbook/fldigi-contest.obj `if test -f 'logbook/contest.cxx'; then $(CYGPATH_W) 'logbook/contest.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/contest.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-contest.Tpo logbook/$(DEPDIR)/fldigi-contest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/contest.cxx' object='logbook/fldigi-contest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-contest.obj `if test -f 'logbook/contest.cxx'; then $(CYGPATH_W) 'logbook/contest.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/contest.cxx'; fi` logbook/fldigi-counties.o: logbook/counties.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-counties.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-counties.Tpo -c -o logbook/fldigi-counties.o `test -f 'logbook/counties.cxx' || echo '$(srcdir)/'`logbook/counties.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-counties.Tpo logbook/$(DEPDIR)/fldigi-counties.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/counties.cxx' object='logbook/fldigi-counties.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-counties.o `test -f 'logbook/counties.cxx' || echo '$(srcdir)/'`logbook/counties.cxx logbook/fldigi-counties.obj: logbook/counties.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-counties.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-counties.Tpo -c -o logbook/fldigi-counties.obj `if test -f 'logbook/counties.cxx'; then $(CYGPATH_W) 'logbook/counties.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/counties.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-counties.Tpo logbook/$(DEPDIR)/fldigi-counties.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/counties.cxx' object='logbook/fldigi-counties.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-counties.obj `if test -f 'logbook/counties.cxx'; then $(CYGPATH_W) 'logbook/counties.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/counties.cxx'; fi` logbook/fldigi-county_lists.o: logbook/county_lists.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-county_lists.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-county_lists.Tpo -c -o logbook/fldigi-county_lists.o `test -f 'logbook/county_lists.cxx' || echo '$(srcdir)/'`logbook/county_lists.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-county_lists.Tpo logbook/$(DEPDIR)/fldigi-county_lists.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/county_lists.cxx' object='logbook/fldigi-county_lists.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-county_lists.o `test -f 'logbook/county_lists.cxx' || echo '$(srcdir)/'`logbook/county_lists.cxx logbook/fldigi-county_lists.obj: logbook/county_lists.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-county_lists.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-county_lists.Tpo -c -o logbook/fldigi-county_lists.obj `if test -f 'logbook/county_lists.cxx'; then $(CYGPATH_W) 'logbook/county_lists.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/county_lists.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-county_lists.Tpo logbook/$(DEPDIR)/fldigi-county_lists.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/county_lists.cxx' object='logbook/fldigi-county_lists.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-county_lists.obj `if test -f 'logbook/county_lists.cxx'; then $(CYGPATH_W) 'logbook/county_lists.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/county_lists.cxx'; fi` logbook/fldigi-cty-dat.o: logbook/cty-dat.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-cty-dat.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-cty-dat.Tpo -c -o logbook/fldigi-cty-dat.o `test -f 'logbook/cty-dat.cxx' || echo '$(srcdir)/'`logbook/cty-dat.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-cty-dat.Tpo logbook/$(DEPDIR)/fldigi-cty-dat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/cty-dat.cxx' object='logbook/fldigi-cty-dat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-cty-dat.o `test -f 'logbook/cty-dat.cxx' || echo '$(srcdir)/'`logbook/cty-dat.cxx logbook/fldigi-cty-dat.obj: logbook/cty-dat.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-cty-dat.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-cty-dat.Tpo -c -o logbook/fldigi-cty-dat.obj `if test -f 'logbook/cty-dat.cxx'; then $(CYGPATH_W) 'logbook/cty-dat.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/cty-dat.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-cty-dat.Tpo logbook/$(DEPDIR)/fldigi-cty-dat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/cty-dat.cxx' object='logbook/fldigi-cty-dat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-cty-dat.obj `if test -f 'logbook/cty-dat.cxx'; then $(CYGPATH_W) 'logbook/cty-dat.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/cty-dat.cxx'; fi` logbook/fldigi-date.o: logbook/date.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-date.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-date.Tpo -c -o logbook/fldigi-date.o `test -f 'logbook/date.cxx' || echo '$(srcdir)/'`logbook/date.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-date.Tpo logbook/$(DEPDIR)/fldigi-date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/date.cxx' object='logbook/fldigi-date.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-date.o `test -f 'logbook/date.cxx' || echo '$(srcdir)/'`logbook/date.cxx logbook/fldigi-date.obj: logbook/date.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-date.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-date.Tpo -c -o logbook/fldigi-date.obj `if test -f 'logbook/date.cxx'; then $(CYGPATH_W) 'logbook/date.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/date.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-date.Tpo logbook/$(DEPDIR)/fldigi-date.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/date.cxx' object='logbook/fldigi-date.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-date.obj `if test -f 'logbook/date.cxx'; then $(CYGPATH_W) 'logbook/date.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/date.cxx'; fi` logbook/fldigi-fd_logger.o: logbook/fd_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-fd_logger.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-fd_logger.Tpo -c -o logbook/fldigi-fd_logger.o `test -f 'logbook/fd_logger.cxx' || echo '$(srcdir)/'`logbook/fd_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-fd_logger.Tpo logbook/$(DEPDIR)/fldigi-fd_logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/fd_logger.cxx' object='logbook/fldigi-fd_logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-fd_logger.o `test -f 'logbook/fd_logger.cxx' || echo '$(srcdir)/'`logbook/fd_logger.cxx logbook/fldigi-fd_logger.obj: logbook/fd_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-fd_logger.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-fd_logger.Tpo -c -o logbook/fldigi-fd_logger.obj `if test -f 'logbook/fd_logger.cxx'; then $(CYGPATH_W) 'logbook/fd_logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/fd_logger.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-fd_logger.Tpo logbook/$(DEPDIR)/fldigi-fd_logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/fd_logger.cxx' object='logbook/fldigi-fd_logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-fd_logger.obj `if test -f 'logbook/fd_logger.cxx'; then $(CYGPATH_W) 'logbook/fd_logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/fd_logger.cxx'; fi` logbook/fldigi-fd_view.o: logbook/fd_view.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-fd_view.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-fd_view.Tpo -c -o logbook/fldigi-fd_view.o `test -f 'logbook/fd_view.cxx' || echo '$(srcdir)/'`logbook/fd_view.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-fd_view.Tpo logbook/$(DEPDIR)/fldigi-fd_view.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/fd_view.cxx' object='logbook/fldigi-fd_view.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-fd_view.o `test -f 'logbook/fd_view.cxx' || echo '$(srcdir)/'`logbook/fd_view.cxx logbook/fldigi-fd_view.obj: logbook/fd_view.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-fd_view.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-fd_view.Tpo -c -o logbook/fldigi-fd_view.obj `if test -f 'logbook/fd_view.cxx'; then $(CYGPATH_W) 'logbook/fd_view.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/fd_view.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-fd_view.Tpo logbook/$(DEPDIR)/fldigi-fd_view.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/fd_view.cxx' object='logbook/fldigi-fd_view.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-fd_view.obj `if test -f 'logbook/fd_view.cxx'; then $(CYGPATH_W) 'logbook/fd_view.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/fd_view.cxx'; fi` logbook/fldigi-lgbook.o: logbook/lgbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-lgbook.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-lgbook.Tpo -c -o logbook/fldigi-lgbook.o `test -f 'logbook/lgbook.cxx' || echo '$(srcdir)/'`logbook/lgbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-lgbook.Tpo logbook/$(DEPDIR)/fldigi-lgbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lgbook.cxx' object='logbook/fldigi-lgbook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-lgbook.o `test -f 'logbook/lgbook.cxx' || echo '$(srcdir)/'`logbook/lgbook.cxx logbook/fldigi-lgbook.obj: logbook/lgbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-lgbook.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-lgbook.Tpo -c -o logbook/fldigi-lgbook.obj `if test -f 'logbook/lgbook.cxx'; then $(CYGPATH_W) 'logbook/lgbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lgbook.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-lgbook.Tpo logbook/$(DEPDIR)/fldigi-lgbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lgbook.cxx' object='logbook/fldigi-lgbook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-lgbook.obj `if test -f 'logbook/lgbook.cxx'; then $(CYGPATH_W) 'logbook/lgbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lgbook.cxx'; fi` logbook/fldigi-logbook.o: logbook/logbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-logbook.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-logbook.Tpo -c -o logbook/fldigi-logbook.o `test -f 'logbook/logbook.cxx' || echo '$(srcdir)/'`logbook/logbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-logbook.Tpo logbook/$(DEPDIR)/fldigi-logbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logbook.cxx' object='logbook/fldigi-logbook.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-logbook.o `test -f 'logbook/logbook.cxx' || echo '$(srcdir)/'`logbook/logbook.cxx logbook/fldigi-logbook.obj: logbook/logbook.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-logbook.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-logbook.Tpo -c -o logbook/fldigi-logbook.obj `if test -f 'logbook/logbook.cxx'; then $(CYGPATH_W) 'logbook/logbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logbook.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-logbook.Tpo logbook/$(DEPDIR)/fldigi-logbook.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logbook.cxx' object='logbook/fldigi-logbook.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-logbook.obj `if test -f 'logbook/logbook.cxx'; then $(CYGPATH_W) 'logbook/logbook.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logbook.cxx'; fi` logbook/fldigi-logsupport.o: logbook/logsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-logsupport.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-logsupport.Tpo -c -o logbook/fldigi-logsupport.o `test -f 'logbook/logsupport.cxx' || echo '$(srcdir)/'`logbook/logsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-logsupport.Tpo logbook/$(DEPDIR)/fldigi-logsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logsupport.cxx' object='logbook/fldigi-logsupport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-logsupport.o `test -f 'logbook/logsupport.cxx' || echo '$(srcdir)/'`logbook/logsupport.cxx logbook/fldigi-logsupport.obj: logbook/logsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-logsupport.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-logsupport.Tpo -c -o logbook/fldigi-logsupport.obj `if test -f 'logbook/logsupport.cxx'; then $(CYGPATH_W) 'logbook/logsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logsupport.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-logsupport.Tpo logbook/$(DEPDIR)/fldigi-logsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/logsupport.cxx' object='logbook/fldigi-logsupport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-logsupport.obj `if test -f 'logbook/logsupport.cxx'; then $(CYGPATH_W) 'logbook/logsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/logsupport.cxx'; fi` logbook/fldigi-lookupcall.o: logbook/lookupcall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-lookupcall.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-lookupcall.Tpo -c -o logbook/fldigi-lookupcall.o `test -f 'logbook/lookupcall.cxx' || echo '$(srcdir)/'`logbook/lookupcall.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-lookupcall.Tpo logbook/$(DEPDIR)/fldigi-lookupcall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lookupcall.cxx' object='logbook/fldigi-lookupcall.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-lookupcall.o `test -f 'logbook/lookupcall.cxx' || echo '$(srcdir)/'`logbook/lookupcall.cxx logbook/fldigi-lookupcall.obj: logbook/lookupcall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-lookupcall.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-lookupcall.Tpo -c -o logbook/fldigi-lookupcall.obj `if test -f 'logbook/lookupcall.cxx'; then $(CYGPATH_W) 'logbook/lookupcall.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lookupcall.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-lookupcall.Tpo logbook/$(DEPDIR)/fldigi-lookupcall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/lookupcall.cxx' object='logbook/fldigi-lookupcall.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-lookupcall.obj `if test -f 'logbook/lookupcall.cxx'; then $(CYGPATH_W) 'logbook/lookupcall.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/lookupcall.cxx'; fi` logbook/fldigi-maclogger.o: logbook/maclogger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-maclogger.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-maclogger.Tpo -c -o logbook/fldigi-maclogger.o `test -f 'logbook/maclogger.cxx' || echo '$(srcdir)/'`logbook/maclogger.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-maclogger.Tpo logbook/$(DEPDIR)/fldigi-maclogger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/maclogger.cxx' object='logbook/fldigi-maclogger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-maclogger.o `test -f 'logbook/maclogger.cxx' || echo '$(srcdir)/'`logbook/maclogger.cxx logbook/fldigi-maclogger.obj: logbook/maclogger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-maclogger.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-maclogger.Tpo -c -o logbook/fldigi-maclogger.obj `if test -f 'logbook/maclogger.cxx'; then $(CYGPATH_W) 'logbook/maclogger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/maclogger.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-maclogger.Tpo logbook/$(DEPDIR)/fldigi-maclogger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/maclogger.cxx' object='logbook/fldigi-maclogger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-maclogger.obj `if test -f 'logbook/maclogger.cxx'; then $(CYGPATH_W) 'logbook/maclogger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/maclogger.cxx'; fi` logbook/fldigi-n3fjp_logger.o: logbook/n3fjp_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-n3fjp_logger.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-n3fjp_logger.Tpo -c -o logbook/fldigi-n3fjp_logger.o `test -f 'logbook/n3fjp_logger.cxx' || echo '$(srcdir)/'`logbook/n3fjp_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-n3fjp_logger.Tpo logbook/$(DEPDIR)/fldigi-n3fjp_logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/n3fjp_logger.cxx' object='logbook/fldigi-n3fjp_logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-n3fjp_logger.o `test -f 'logbook/n3fjp_logger.cxx' || echo '$(srcdir)/'`logbook/n3fjp_logger.cxx logbook/fldigi-n3fjp_logger.obj: logbook/n3fjp_logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-n3fjp_logger.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-n3fjp_logger.Tpo -c -o logbook/fldigi-n3fjp_logger.obj `if test -f 'logbook/n3fjp_logger.cxx'; then $(CYGPATH_W) 'logbook/n3fjp_logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/n3fjp_logger.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-n3fjp_logger.Tpo logbook/$(DEPDIR)/fldigi-n3fjp_logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/n3fjp_logger.cxx' object='logbook/fldigi-n3fjp_logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-n3fjp_logger.obj `if test -f 'logbook/n3fjp_logger.cxx'; then $(CYGPATH_W) 'logbook/n3fjp_logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/n3fjp_logger.cxx'; fi` logbook/fldigi-qrzlib.o: logbook/qrzlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-qrzlib.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-qrzlib.Tpo -c -o logbook/fldigi-qrzlib.o `test -f 'logbook/qrzlib.cxx' || echo '$(srcdir)/'`logbook/qrzlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-qrzlib.Tpo logbook/$(DEPDIR)/fldigi-qrzlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qrzlib.cxx' object='logbook/fldigi-qrzlib.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-qrzlib.o `test -f 'logbook/qrzlib.cxx' || echo '$(srcdir)/'`logbook/qrzlib.cxx logbook/fldigi-qrzlib.obj: logbook/qrzlib.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-qrzlib.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-qrzlib.Tpo -c -o logbook/fldigi-qrzlib.obj `if test -f 'logbook/qrzlib.cxx'; then $(CYGPATH_W) 'logbook/qrzlib.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qrzlib.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-qrzlib.Tpo logbook/$(DEPDIR)/fldigi-qrzlib.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qrzlib.cxx' object='logbook/fldigi-qrzlib.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-qrzlib.obj `if test -f 'logbook/qrzlib.cxx'; then $(CYGPATH_W) 'logbook/qrzlib.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qrzlib.cxx'; fi` logbook/fldigi-qso_db.o: logbook/qso_db.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-qso_db.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-qso_db.Tpo -c -o logbook/fldigi-qso_db.o `test -f 'logbook/qso_db.cxx' || echo '$(srcdir)/'`logbook/qso_db.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-qso_db.Tpo logbook/$(DEPDIR)/fldigi-qso_db.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qso_db.cxx' object='logbook/fldigi-qso_db.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-qso_db.o `test -f 'logbook/qso_db.cxx' || echo '$(srcdir)/'`logbook/qso_db.cxx logbook/fldigi-qso_db.obj: logbook/qso_db.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-qso_db.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-qso_db.Tpo -c -o logbook/fldigi-qso_db.obj `if test -f 'logbook/qso_db.cxx'; then $(CYGPATH_W) 'logbook/qso_db.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qso_db.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-qso_db.Tpo logbook/$(DEPDIR)/fldigi-qso_db.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/qso_db.cxx' object='logbook/fldigi-qso_db.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-qso_db.obj `if test -f 'logbook/qso_db.cxx'; then $(CYGPATH_W) 'logbook/qso_db.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/qso_db.cxx'; fi` logbook/fldigi-table.o: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-table.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-table.Tpo -c -o logbook/fldigi-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-table.Tpo logbook/$(DEPDIR)/fldigi-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='logbook/fldigi-table.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-table.o `test -f 'logbook/table.cxx' || echo '$(srcdir)/'`logbook/table.cxx logbook/fldigi-table.obj: logbook/table.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-table.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-table.Tpo -c -o logbook/fldigi-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-table.Tpo logbook/$(DEPDIR)/fldigi-table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/table.cxx' object='logbook/fldigi-table.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-table.obj `if test -f 'logbook/table.cxx'; then $(CYGPATH_W) 'logbook/table.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/table.cxx'; fi` logbook/fldigi-textio.o: logbook/textio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-textio.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-textio.Tpo -c -o logbook/fldigi-textio.o `test -f 'logbook/textio.cxx' || echo '$(srcdir)/'`logbook/textio.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-textio.Tpo logbook/$(DEPDIR)/fldigi-textio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/textio.cxx' object='logbook/fldigi-textio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-textio.o `test -f 'logbook/textio.cxx' || echo '$(srcdir)/'`logbook/textio.cxx logbook/fldigi-textio.obj: logbook/textio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-textio.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-textio.Tpo -c -o logbook/fldigi-textio.obj `if test -f 'logbook/textio.cxx'; then $(CYGPATH_W) 'logbook/textio.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/textio.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-textio.Tpo logbook/$(DEPDIR)/fldigi-textio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/textio.cxx' object='logbook/fldigi-textio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-textio.obj `if test -f 'logbook/textio.cxx'; then $(CYGPATH_W) 'logbook/textio.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/textio.cxx'; fi` logbook/fldigi-xmlrpc_log.o: logbook/xmlrpc_log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-xmlrpc_log.o -MD -MP -MF logbook/$(DEPDIR)/fldigi-xmlrpc_log.Tpo -c -o logbook/fldigi-xmlrpc_log.o `test -f 'logbook/xmlrpc_log.cxx' || echo '$(srcdir)/'`logbook/xmlrpc_log.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-xmlrpc_log.Tpo logbook/$(DEPDIR)/fldigi-xmlrpc_log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/xmlrpc_log.cxx' object='logbook/fldigi-xmlrpc_log.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-xmlrpc_log.o `test -f 'logbook/xmlrpc_log.cxx' || echo '$(srcdir)/'`logbook/xmlrpc_log.cxx logbook/fldigi-xmlrpc_log.obj: logbook/xmlrpc_log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logbook/fldigi-xmlrpc_log.obj -MD -MP -MF logbook/$(DEPDIR)/fldigi-xmlrpc_log.Tpo -c -o logbook/fldigi-xmlrpc_log.obj `if test -f 'logbook/xmlrpc_log.cxx'; then $(CYGPATH_W) 'logbook/xmlrpc_log.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/xmlrpc_log.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logbook/$(DEPDIR)/fldigi-xmlrpc_log.Tpo logbook/$(DEPDIR)/fldigi-xmlrpc_log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logbook/xmlrpc_log.cxx' object='logbook/fldigi-xmlrpc_log.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logbook/fldigi-xmlrpc_log.obj `if test -f 'logbook/xmlrpc_log.cxx'; then $(CYGPATH_W) 'logbook/xmlrpc_log.cxx'; else $(CYGPATH_W) '$(srcdir)/logbook/xmlrpc_log.cxx'; fi` logger/fldigi-logger.o: logger/logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-logger.o -MD -MP -MF logger/$(DEPDIR)/fldigi-logger.Tpo -c -o logger/fldigi-logger.o `test -f 'logger/logger.cxx' || echo '$(srcdir)/'`logger/logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-logger.Tpo logger/$(DEPDIR)/fldigi-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/logger.cxx' object='logger/fldigi-logger.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-logger.o `test -f 'logger/logger.cxx' || echo '$(srcdir)/'`logger/logger.cxx logger/fldigi-logger.obj: logger/logger.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-logger.obj -MD -MP -MF logger/$(DEPDIR)/fldigi-logger.Tpo -c -o logger/fldigi-logger.obj `if test -f 'logger/logger.cxx'; then $(CYGPATH_W) 'logger/logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/logger.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-logger.Tpo logger/$(DEPDIR)/fldigi-logger.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/logger.cxx' object='logger/fldigi-logger.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-logger.obj `if test -f 'logger/logger.cxx'; then $(CYGPATH_W) 'logger/logger.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/logger.cxx'; fi` logger/fldigi-rx_extract.o: logger/rx_extract.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-rx_extract.o -MD -MP -MF logger/$(DEPDIR)/fldigi-rx_extract.Tpo -c -o logger/fldigi-rx_extract.o `test -f 'logger/rx_extract.cxx' || echo '$(srcdir)/'`logger/rx_extract.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-rx_extract.Tpo logger/$(DEPDIR)/fldigi-rx_extract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/rx_extract.cxx' object='logger/fldigi-rx_extract.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-rx_extract.o `test -f 'logger/rx_extract.cxx' || echo '$(srcdir)/'`logger/rx_extract.cxx logger/fldigi-rx_extract.obj: logger/rx_extract.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-rx_extract.obj -MD -MP -MF logger/$(DEPDIR)/fldigi-rx_extract.Tpo -c -o logger/fldigi-rx_extract.obj `if test -f 'logger/rx_extract.cxx'; then $(CYGPATH_W) 'logger/rx_extract.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/rx_extract.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-rx_extract.Tpo logger/$(DEPDIR)/fldigi-rx_extract.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/rx_extract.cxx' object='logger/fldigi-rx_extract.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-rx_extract.obj `if test -f 'logger/rx_extract.cxx'; then $(CYGPATH_W) 'logger/rx_extract.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/rx_extract.cxx'; fi` logger/fldigi-speak.o: logger/speak.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-speak.o -MD -MP -MF logger/$(DEPDIR)/fldigi-speak.Tpo -c -o logger/fldigi-speak.o `test -f 'logger/speak.cxx' || echo '$(srcdir)/'`logger/speak.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-speak.Tpo logger/$(DEPDIR)/fldigi-speak.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/speak.cxx' object='logger/fldigi-speak.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-speak.o `test -f 'logger/speak.cxx' || echo '$(srcdir)/'`logger/speak.cxx logger/fldigi-speak.obj: logger/speak.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT logger/fldigi-speak.obj -MD -MP -MF logger/$(DEPDIR)/fldigi-speak.Tpo -c -o logger/fldigi-speak.obj `if test -f 'logger/speak.cxx'; then $(CYGPATH_W) 'logger/speak.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/speak.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) logger/$(DEPDIR)/fldigi-speak.Tpo logger/$(DEPDIR)/fldigi-speak.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='logger/speak.cxx' object='logger/fldigi-speak.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o logger/fldigi-speak.obj `if test -f 'logger/speak.cxx'; then $(CYGPATH_W) 'logger/speak.cxx'; else $(CYGPATH_W) '$(srcdir)/logger/speak.cxx'; fi` fldigi-main.o: main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-main.o -MD -MP -MF $(DEPDIR)/fldigi-main.Tpo -c -o fldigi-main.o `test -f 'main.cxx' || echo '$(srcdir)/'`main.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-main.Tpo $(DEPDIR)/fldigi-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cxx' object='fldigi-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-main.o `test -f 'main.cxx' || echo '$(srcdir)/'`main.cxx fldigi-main.obj: main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fldigi-main.obj -MD -MP -MF $(DEPDIR)/fldigi-main.Tpo -c -o fldigi-main.obj `if test -f 'main.cxx'; then $(CYGPATH_W) 'main.cxx'; else $(CYGPATH_W) '$(srcdir)/main.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fldigi-main.Tpo $(DEPDIR)/fldigi-main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='main.cxx' object='fldigi-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fldigi-main.obj `if test -f 'main.cxx'; then $(CYGPATH_W) 'main.cxx'; else $(CYGPATH_W) '$(srcdir)/main.cxx'; fi` mfsk/fldigi-interleave.o: mfsk/interleave.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-interleave.o -MD -MP -MF mfsk/$(DEPDIR)/fldigi-interleave.Tpo -c -o mfsk/fldigi-interleave.o `test -f 'mfsk/interleave.cxx' || echo '$(srcdir)/'`mfsk/interleave.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-interleave.Tpo mfsk/$(DEPDIR)/fldigi-interleave.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/interleave.cxx' object='mfsk/fldigi-interleave.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-interleave.o `test -f 'mfsk/interleave.cxx' || echo '$(srcdir)/'`mfsk/interleave.cxx mfsk/fldigi-interleave.obj: mfsk/interleave.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-interleave.obj -MD -MP -MF mfsk/$(DEPDIR)/fldigi-interleave.Tpo -c -o mfsk/fldigi-interleave.obj `if test -f 'mfsk/interleave.cxx'; then $(CYGPATH_W) 'mfsk/interleave.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/interleave.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-interleave.Tpo mfsk/$(DEPDIR)/fldigi-interleave.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/interleave.cxx' object='mfsk/fldigi-interleave.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-interleave.obj `if test -f 'mfsk/interleave.cxx'; then $(CYGPATH_W) 'mfsk/interleave.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/interleave.cxx'; fi` mfsk/fldigi-mfsk.o: mfsk/mfsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfsk.o -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfsk.Tpo -c -o mfsk/fldigi-mfsk.o `test -f 'mfsk/mfsk.cxx' || echo '$(srcdir)/'`mfsk/mfsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfsk.Tpo mfsk/$(DEPDIR)/fldigi-mfsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk.cxx' object='mfsk/fldigi-mfsk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfsk.o `test -f 'mfsk/mfsk.cxx' || echo '$(srcdir)/'`mfsk/mfsk.cxx mfsk/fldigi-mfsk.obj: mfsk/mfsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfsk.obj -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfsk.Tpo -c -o mfsk/fldigi-mfsk.obj `if test -f 'mfsk/mfsk.cxx'; then $(CYGPATH_W) 'mfsk/mfsk.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfsk.Tpo mfsk/$(DEPDIR)/fldigi-mfsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk.cxx' object='mfsk/fldigi-mfsk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfsk.obj `if test -f 'mfsk/mfsk.cxx'; then $(CYGPATH_W) 'mfsk/mfsk.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk.cxx'; fi` mfsk/fldigi-mfskvaricode.o: mfsk/mfskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfskvaricode.o -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfskvaricode.Tpo -c -o mfsk/fldigi-mfskvaricode.o `test -f 'mfsk/mfskvaricode.cxx' || echo '$(srcdir)/'`mfsk/mfskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfskvaricode.Tpo mfsk/$(DEPDIR)/fldigi-mfskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfskvaricode.cxx' object='mfsk/fldigi-mfskvaricode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfskvaricode.o `test -f 'mfsk/mfskvaricode.cxx' || echo '$(srcdir)/'`mfsk/mfskvaricode.cxx mfsk/fldigi-mfskvaricode.obj: mfsk/mfskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfskvaricode.obj -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfskvaricode.Tpo -c -o mfsk/fldigi-mfskvaricode.obj `if test -f 'mfsk/mfskvaricode.cxx'; then $(CYGPATH_W) 'mfsk/mfskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfskvaricode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfskvaricode.Tpo mfsk/$(DEPDIR)/fldigi-mfskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfskvaricode.cxx' object='mfsk/fldigi-mfskvaricode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfskvaricode.obj `if test -f 'mfsk/mfskvaricode.cxx'; then $(CYGPATH_W) 'mfsk/mfskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfskvaricode.cxx'; fi` misc/fldigi-arq_io.o: misc/arq_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-arq_io.o -MD -MP -MF misc/$(DEPDIR)/fldigi-arq_io.Tpo -c -o misc/fldigi-arq_io.o `test -f 'misc/arq_io.cxx' || echo '$(srcdir)/'`misc/arq_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-arq_io.Tpo misc/$(DEPDIR)/fldigi-arq_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/arq_io.cxx' object='misc/fldigi-arq_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-arq_io.o `test -f 'misc/arq_io.cxx' || echo '$(srcdir)/'`misc/arq_io.cxx misc/fldigi-arq_io.obj: misc/arq_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-arq_io.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-arq_io.Tpo -c -o misc/fldigi-arq_io.obj `if test -f 'misc/arq_io.cxx'; then $(CYGPATH_W) 'misc/arq_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/arq_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-arq_io.Tpo misc/$(DEPDIR)/fldigi-arq_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/arq_io.cxx' object='misc/fldigi-arq_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-arq_io.obj `if test -f 'misc/arq_io.cxx'; then $(CYGPATH_W) 'misc/arq_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/arq_io.cxx'; fi` misc/fldigi-ascii.o: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-ascii.o -MD -MP -MF misc/$(DEPDIR)/fldigi-ascii.Tpo -c -o misc/fldigi-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-ascii.Tpo misc/$(DEPDIR)/fldigi-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='misc/fldigi-ascii.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-ascii.o `test -f 'misc/ascii.cxx' || echo '$(srcdir)/'`misc/ascii.cxx misc/fldigi-ascii.obj: misc/ascii.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-ascii.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-ascii.Tpo -c -o misc/fldigi-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-ascii.Tpo misc/$(DEPDIR)/fldigi-ascii.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ascii.cxx' object='misc/fldigi-ascii.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-ascii.obj `if test -f 'misc/ascii.cxx'; then $(CYGPATH_W) 'misc/ascii.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ascii.cxx'; fi` misc/fldigi-ax25_decode.o: misc/ax25_decode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-ax25_decode.o -MD -MP -MF misc/$(DEPDIR)/fldigi-ax25_decode.Tpo -c -o misc/fldigi-ax25_decode.o `test -f 'misc/ax25_decode.cxx' || echo '$(srcdir)/'`misc/ax25_decode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-ax25_decode.Tpo misc/$(DEPDIR)/fldigi-ax25_decode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ax25_decode.cxx' object='misc/fldigi-ax25_decode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-ax25_decode.o `test -f 'misc/ax25_decode.cxx' || echo '$(srcdir)/'`misc/ax25_decode.cxx misc/fldigi-ax25_decode.obj: misc/ax25_decode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-ax25_decode.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-ax25_decode.Tpo -c -o misc/fldigi-ax25_decode.obj `if test -f 'misc/ax25_decode.cxx'; then $(CYGPATH_W) 'misc/ax25_decode.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ax25_decode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-ax25_decode.Tpo misc/$(DEPDIR)/fldigi-ax25_decode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/ax25_decode.cxx' object='misc/fldigi-ax25_decode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-ax25_decode.obj `if test -f 'misc/ax25_decode.cxx'; then $(CYGPATH_W) 'misc/ax25_decode.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/ax25_decode.cxx'; fi` misc/fldigi-charsetdistiller.o: misc/charsetdistiller.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-charsetdistiller.o -MD -MP -MF misc/$(DEPDIR)/fldigi-charsetdistiller.Tpo -c -o misc/fldigi-charsetdistiller.o `test -f 'misc/charsetdistiller.cxx' || echo '$(srcdir)/'`misc/charsetdistiller.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-charsetdistiller.Tpo misc/$(DEPDIR)/fldigi-charsetdistiller.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetdistiller.cxx' object='misc/fldigi-charsetdistiller.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-charsetdistiller.o `test -f 'misc/charsetdistiller.cxx' || echo '$(srcdir)/'`misc/charsetdistiller.cxx misc/fldigi-charsetdistiller.obj: misc/charsetdistiller.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-charsetdistiller.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-charsetdistiller.Tpo -c -o misc/fldigi-charsetdistiller.obj `if test -f 'misc/charsetdistiller.cxx'; then $(CYGPATH_W) 'misc/charsetdistiller.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetdistiller.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-charsetdistiller.Tpo misc/$(DEPDIR)/fldigi-charsetdistiller.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetdistiller.cxx' object='misc/fldigi-charsetdistiller.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-charsetdistiller.obj `if test -f 'misc/charsetdistiller.cxx'; then $(CYGPATH_W) 'misc/charsetdistiller.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetdistiller.cxx'; fi` misc/fldigi-charsetlist.o: misc/charsetlist.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-charsetlist.o -MD -MP -MF misc/$(DEPDIR)/fldigi-charsetlist.Tpo -c -o misc/fldigi-charsetlist.o `test -f 'misc/charsetlist.cxx' || echo '$(srcdir)/'`misc/charsetlist.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-charsetlist.Tpo misc/$(DEPDIR)/fldigi-charsetlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetlist.cxx' object='misc/fldigi-charsetlist.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-charsetlist.o `test -f 'misc/charsetlist.cxx' || echo '$(srcdir)/'`misc/charsetlist.cxx misc/fldigi-charsetlist.obj: misc/charsetlist.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-charsetlist.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-charsetlist.Tpo -c -o misc/fldigi-charsetlist.obj `if test -f 'misc/charsetlist.cxx'; then $(CYGPATH_W) 'misc/charsetlist.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetlist.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-charsetlist.Tpo misc/$(DEPDIR)/fldigi-charsetlist.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/charsetlist.cxx' object='misc/fldigi-charsetlist.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-charsetlist.obj `if test -f 'misc/charsetlist.cxx'; then $(CYGPATH_W) 'misc/charsetlist.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/charsetlist.cxx'; fi` misc/fldigi-configuration.o: misc/configuration.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-configuration.o -MD -MP -MF misc/$(DEPDIR)/fldigi-configuration.Tpo -c -o misc/fldigi-configuration.o `test -f 'misc/configuration.cxx' || echo '$(srcdir)/'`misc/configuration.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-configuration.Tpo misc/$(DEPDIR)/fldigi-configuration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/configuration.cxx' object='misc/fldigi-configuration.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-configuration.o `test -f 'misc/configuration.cxx' || echo '$(srcdir)/'`misc/configuration.cxx misc/fldigi-configuration.obj: misc/configuration.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-configuration.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-configuration.Tpo -c -o misc/fldigi-configuration.obj `if test -f 'misc/configuration.cxx'; then $(CYGPATH_W) 'misc/configuration.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/configuration.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-configuration.Tpo misc/$(DEPDIR)/fldigi-configuration.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/configuration.cxx' object='misc/fldigi-configuration.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-configuration.obj `if test -f 'misc/configuration.cxx'; then $(CYGPATH_W) 'misc/configuration.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/configuration.cxx'; fi` misc/fldigi-coordinate.o: misc/coordinate.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-coordinate.o -MD -MP -MF misc/$(DEPDIR)/fldigi-coordinate.Tpo -c -o misc/fldigi-coordinate.o `test -f 'misc/coordinate.cxx' || echo '$(srcdir)/'`misc/coordinate.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-coordinate.Tpo misc/$(DEPDIR)/fldigi-coordinate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/coordinate.cxx' object='misc/fldigi-coordinate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-coordinate.o `test -f 'misc/coordinate.cxx' || echo '$(srcdir)/'`misc/coordinate.cxx misc/fldigi-coordinate.obj: misc/coordinate.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-coordinate.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-coordinate.Tpo -c -o misc/fldigi-coordinate.obj `if test -f 'misc/coordinate.cxx'; then $(CYGPATH_W) 'misc/coordinate.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/coordinate.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-coordinate.Tpo misc/$(DEPDIR)/fldigi-coordinate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/coordinate.cxx' object='misc/fldigi-coordinate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-coordinate.obj `if test -f 'misc/coordinate.cxx'; then $(CYGPATH_W) 'misc/coordinate.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/coordinate.cxx'; fi` misc/fldigi-dxcc.o: misc/dxcc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-dxcc.o -MD -MP -MF misc/$(DEPDIR)/fldigi-dxcc.Tpo -c -o misc/fldigi-dxcc.o `test -f 'misc/dxcc.cxx' || echo '$(srcdir)/'`misc/dxcc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-dxcc.Tpo misc/$(DEPDIR)/fldigi-dxcc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/dxcc.cxx' object='misc/fldigi-dxcc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-dxcc.o `test -f 'misc/dxcc.cxx' || echo '$(srcdir)/'`misc/dxcc.cxx misc/fldigi-dxcc.obj: misc/dxcc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-dxcc.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-dxcc.Tpo -c -o misc/fldigi-dxcc.obj `if test -f 'misc/dxcc.cxx'; then $(CYGPATH_W) 'misc/dxcc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/dxcc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-dxcc.Tpo misc/$(DEPDIR)/fldigi-dxcc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/dxcc.cxx' object='misc/fldigi-dxcc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-dxcc.obj `if test -f 'misc/dxcc.cxx'; then $(CYGPATH_W) 'misc/dxcc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/dxcc.cxx'; fi` misc/fldigi-estrings.o: misc/estrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-estrings.o -MD -MP -MF misc/$(DEPDIR)/fldigi-estrings.Tpo -c -o misc/fldigi-estrings.o `test -f 'misc/estrings.cxx' || echo '$(srcdir)/'`misc/estrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-estrings.Tpo misc/$(DEPDIR)/fldigi-estrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/estrings.cxx' object='misc/fldigi-estrings.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-estrings.o `test -f 'misc/estrings.cxx' || echo '$(srcdir)/'`misc/estrings.cxx misc/fldigi-estrings.obj: misc/estrings.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-estrings.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-estrings.Tpo -c -o misc/fldigi-estrings.obj `if test -f 'misc/estrings.cxx'; then $(CYGPATH_W) 'misc/estrings.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/estrings.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-estrings.Tpo misc/$(DEPDIR)/fldigi-estrings.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/estrings.cxx' object='misc/fldigi-estrings.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-estrings.obj `if test -f 'misc/estrings.cxx'; then $(CYGPATH_W) 'misc/estrings.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/estrings.cxx'; fi` misc/fldigi-icons.o: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-icons.o -MD -MP -MF misc/$(DEPDIR)/fldigi-icons.Tpo -c -o misc/fldigi-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-icons.Tpo misc/$(DEPDIR)/fldigi-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='misc/fldigi-icons.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-icons.o `test -f 'misc/icons.cxx' || echo '$(srcdir)/'`misc/icons.cxx misc/fldigi-icons.obj: misc/icons.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-icons.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-icons.Tpo -c -o misc/fldigi-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-icons.Tpo misc/$(DEPDIR)/fldigi-icons.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/icons.cxx' object='misc/fldigi-icons.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-icons.obj `if test -f 'misc/icons.cxx'; then $(CYGPATH_W) 'misc/icons.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/icons.cxx'; fi` misc/fldigi-kiss_io.o: misc/kiss_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-kiss_io.o -MD -MP -MF misc/$(DEPDIR)/fldigi-kiss_io.Tpo -c -o misc/fldigi-kiss_io.o `test -f 'misc/kiss_io.cxx' || echo '$(srcdir)/'`misc/kiss_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-kiss_io.Tpo misc/$(DEPDIR)/fldigi-kiss_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/kiss_io.cxx' object='misc/fldigi-kiss_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-kiss_io.o `test -f 'misc/kiss_io.cxx' || echo '$(srcdir)/'`misc/kiss_io.cxx misc/fldigi-kiss_io.obj: misc/kiss_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-kiss_io.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-kiss_io.Tpo -c -o misc/fldigi-kiss_io.obj `if test -f 'misc/kiss_io.cxx'; then $(CYGPATH_W) 'misc/kiss_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/kiss_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-kiss_io.Tpo misc/$(DEPDIR)/fldigi-kiss_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/kiss_io.cxx' object='misc/fldigi-kiss_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-kiss_io.obj `if test -f 'misc/kiss_io.cxx'; then $(CYGPATH_W) 'misc/kiss_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/kiss_io.cxx'; fi` misc/fldigi-locator.o: misc/locator.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-locator.o -MD -MP -MF misc/$(DEPDIR)/fldigi-locator.Tpo -c -o misc/fldigi-locator.o `test -f 'misc/locator.cxx' || echo '$(srcdir)/'`misc/locator.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-locator.Tpo misc/$(DEPDIR)/fldigi-locator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/locator.cxx' object='misc/fldigi-locator.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-locator.o `test -f 'misc/locator.cxx' || echo '$(srcdir)/'`misc/locator.cxx misc/fldigi-locator.obj: misc/locator.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-locator.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-locator.Tpo -c -o misc/fldigi-locator.obj `if test -f 'misc/locator.cxx'; then $(CYGPATH_W) 'misc/locator.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/locator.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-locator.Tpo misc/$(DEPDIR)/fldigi-locator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/locator.cxx' object='misc/fldigi-locator.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-locator.obj `if test -f 'misc/locator.cxx'; then $(CYGPATH_W) 'misc/locator.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/locator.cxx'; fi` misc/fldigi-log.o: misc/log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-log.o -MD -MP -MF misc/$(DEPDIR)/fldigi-log.Tpo -c -o misc/fldigi-log.o `test -f 'misc/log.cxx' || echo '$(srcdir)/'`misc/log.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-log.Tpo misc/$(DEPDIR)/fldigi-log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/log.cxx' object='misc/fldigi-log.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-log.o `test -f 'misc/log.cxx' || echo '$(srcdir)/'`misc/log.cxx misc/fldigi-log.obj: misc/log.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-log.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-log.Tpo -c -o misc/fldigi-log.obj `if test -f 'misc/log.cxx'; then $(CYGPATH_W) 'misc/log.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/log.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-log.Tpo misc/$(DEPDIR)/fldigi-log.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/log.cxx' object='misc/fldigi-log.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-log.obj `if test -f 'misc/log.cxx'; then $(CYGPATH_W) 'misc/log.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/log.cxx'; fi` misc/fldigi-macroedit.o: misc/macroedit.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-macroedit.o -MD -MP -MF misc/$(DEPDIR)/fldigi-macroedit.Tpo -c -o misc/fldigi-macroedit.o `test -f 'misc/macroedit.cxx' || echo '$(srcdir)/'`misc/macroedit.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-macroedit.Tpo misc/$(DEPDIR)/fldigi-macroedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macroedit.cxx' object='misc/fldigi-macroedit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-macroedit.o `test -f 'misc/macroedit.cxx' || echo '$(srcdir)/'`misc/macroedit.cxx misc/fldigi-macroedit.obj: misc/macroedit.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-macroedit.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-macroedit.Tpo -c -o misc/fldigi-macroedit.obj `if test -f 'misc/macroedit.cxx'; then $(CYGPATH_W) 'misc/macroedit.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macroedit.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-macroedit.Tpo misc/$(DEPDIR)/fldigi-macroedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macroedit.cxx' object='misc/fldigi-macroedit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-macroedit.obj `if test -f 'misc/macroedit.cxx'; then $(CYGPATH_W) 'misc/macroedit.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macroedit.cxx'; fi` misc/fldigi-macros.o: misc/macros.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-macros.o -MD -MP -MF misc/$(DEPDIR)/fldigi-macros.Tpo -c -o misc/fldigi-macros.o `test -f 'misc/macros.cxx' || echo '$(srcdir)/'`misc/macros.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-macros.Tpo misc/$(DEPDIR)/fldigi-macros.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macros.cxx' object='misc/fldigi-macros.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-macros.o `test -f 'misc/macros.cxx' || echo '$(srcdir)/'`misc/macros.cxx misc/fldigi-macros.obj: misc/macros.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-macros.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-macros.Tpo -c -o misc/fldigi-macros.obj `if test -f 'misc/macros.cxx'; then $(CYGPATH_W) 'misc/macros.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macros.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-macros.Tpo misc/$(DEPDIR)/fldigi-macros.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/macros.cxx' object='misc/fldigi-macros.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-macros.obj `if test -f 'misc/macros.cxx'; then $(CYGPATH_W) 'misc/macros.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/macros.cxx'; fi` misc/fldigi-misc.o: misc/misc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-misc.o -MD -MP -MF misc/$(DEPDIR)/fldigi-misc.Tpo -c -o misc/fldigi-misc.o `test -f 'misc/misc.cxx' || echo '$(srcdir)/'`misc/misc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-misc.Tpo misc/$(DEPDIR)/fldigi-misc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/misc.cxx' object='misc/fldigi-misc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-misc.o `test -f 'misc/misc.cxx' || echo '$(srcdir)/'`misc/misc.cxx misc/fldigi-misc.obj: misc/misc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-misc.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-misc.Tpo -c -o misc/fldigi-misc.obj `if test -f 'misc/misc.cxx'; then $(CYGPATH_W) 'misc/misc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/misc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-misc.Tpo misc/$(DEPDIR)/fldigi-misc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/misc.cxx' object='misc/fldigi-misc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-misc.obj `if test -f 'misc/misc.cxx'; then $(CYGPATH_W) 'misc/misc.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/misc.cxx'; fi` misc/fldigi-newinstall.o: misc/newinstall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-newinstall.o -MD -MP -MF misc/$(DEPDIR)/fldigi-newinstall.Tpo -c -o misc/fldigi-newinstall.o `test -f 'misc/newinstall.cxx' || echo '$(srcdir)/'`misc/newinstall.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-newinstall.Tpo misc/$(DEPDIR)/fldigi-newinstall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/newinstall.cxx' object='misc/fldigi-newinstall.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-newinstall.o `test -f 'misc/newinstall.cxx' || echo '$(srcdir)/'`misc/newinstall.cxx misc/fldigi-newinstall.obj: misc/newinstall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-newinstall.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-newinstall.Tpo -c -o misc/fldigi-newinstall.obj `if test -f 'misc/newinstall.cxx'; then $(CYGPATH_W) 'misc/newinstall.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/newinstall.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-newinstall.Tpo misc/$(DEPDIR)/fldigi-newinstall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/newinstall.cxx' object='misc/fldigi-newinstall.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-newinstall.obj `if test -f 'misc/newinstall.cxx'; then $(CYGPATH_W) 'misc/newinstall.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/newinstall.cxx'; fi` misc/fldigi-outputencoder.o: misc/outputencoder.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-outputencoder.o -MD -MP -MF misc/$(DEPDIR)/fldigi-outputencoder.Tpo -c -o misc/fldigi-outputencoder.o `test -f 'misc/outputencoder.cxx' || echo '$(srcdir)/'`misc/outputencoder.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-outputencoder.Tpo misc/$(DEPDIR)/fldigi-outputencoder.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/outputencoder.cxx' object='misc/fldigi-outputencoder.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-outputencoder.o `test -f 'misc/outputencoder.cxx' || echo '$(srcdir)/'`misc/outputencoder.cxx misc/fldigi-outputencoder.obj: misc/outputencoder.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-outputencoder.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-outputencoder.Tpo -c -o misc/fldigi-outputencoder.obj `if test -f 'misc/outputencoder.cxx'; then $(CYGPATH_W) 'misc/outputencoder.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/outputencoder.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-outputencoder.Tpo misc/$(DEPDIR)/fldigi-outputencoder.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/outputencoder.cxx' object='misc/fldigi-outputencoder.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-outputencoder.obj `if test -f 'misc/outputencoder.cxx'; then $(CYGPATH_W) 'misc/outputencoder.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/outputencoder.cxx'; fi` misc/fldigi-pixmaps.o: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-pixmaps.o -MD -MP -MF misc/$(DEPDIR)/fldigi-pixmaps.Tpo -c -o misc/fldigi-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-pixmaps.Tpo misc/$(DEPDIR)/fldigi-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='misc/fldigi-pixmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-pixmaps.o `test -f 'misc/pixmaps.cxx' || echo '$(srcdir)/'`misc/pixmaps.cxx misc/fldigi-pixmaps.obj: misc/pixmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-pixmaps.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-pixmaps.Tpo -c -o misc/fldigi-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-pixmaps.Tpo misc/$(DEPDIR)/fldigi-pixmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps.cxx' object='misc/fldigi-pixmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-pixmaps.obj `if test -f 'misc/pixmaps.cxx'; then $(CYGPATH_W) 'misc/pixmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps.cxx'; fi` misc/fldigi-pixmaps_tango.o: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-pixmaps_tango.o -MD -MP -MF misc/$(DEPDIR)/fldigi-pixmaps_tango.Tpo -c -o misc/fldigi-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-pixmaps_tango.Tpo misc/$(DEPDIR)/fldigi-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='misc/fldigi-pixmaps_tango.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-pixmaps_tango.o `test -f 'misc/pixmaps_tango.cxx' || echo '$(srcdir)/'`misc/pixmaps_tango.cxx misc/fldigi-pixmaps_tango.obj: misc/pixmaps_tango.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-pixmaps_tango.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-pixmaps_tango.Tpo -c -o misc/fldigi-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-pixmaps_tango.Tpo misc/$(DEPDIR)/fldigi-pixmaps_tango.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/pixmaps_tango.cxx' object='misc/fldigi-pixmaps_tango.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-pixmaps_tango.obj `if test -f 'misc/pixmaps_tango.cxx'; then $(CYGPATH_W) 'misc/pixmaps_tango.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/pixmaps_tango.cxx'; fi` misc/fldigi-record_loader.o: misc/record_loader.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-record_loader.o -MD -MP -MF misc/$(DEPDIR)/fldigi-record_loader.Tpo -c -o misc/fldigi-record_loader.o `test -f 'misc/record_loader.cxx' || echo '$(srcdir)/'`misc/record_loader.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-record_loader.Tpo misc/$(DEPDIR)/fldigi-record_loader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/record_loader.cxx' object='misc/fldigi-record_loader.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-record_loader.o `test -f 'misc/record_loader.cxx' || echo '$(srcdir)/'`misc/record_loader.cxx misc/fldigi-record_loader.obj: misc/record_loader.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-record_loader.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-record_loader.Tpo -c -o misc/fldigi-record_loader.obj `if test -f 'misc/record_loader.cxx'; then $(CYGPATH_W) 'misc/record_loader.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/record_loader.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-record_loader.Tpo misc/$(DEPDIR)/fldigi-record_loader.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/record_loader.cxx' object='misc/fldigi-record_loader.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-record_loader.obj `if test -f 'misc/record_loader.cxx'; then $(CYGPATH_W) 'misc/record_loader.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/record_loader.cxx'; fi` misc/fldigi-re.o: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-re.o -MD -MP -MF misc/$(DEPDIR)/fldigi-re.Tpo -c -o misc/fldigi-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-re.Tpo misc/$(DEPDIR)/fldigi-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='misc/fldigi-re.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-re.o `test -f 'misc/re.cxx' || echo '$(srcdir)/'`misc/re.cxx misc/fldigi-re.obj: misc/re.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-re.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-re.Tpo -c -o misc/fldigi-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-re.Tpo misc/$(DEPDIR)/fldigi-re.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/re.cxx' object='misc/fldigi-re.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-re.obj `if test -f 'misc/re.cxx'; then $(CYGPATH_W) 'misc/re.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/re.cxx'; fi` misc/fldigi-stacktrace.o: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-stacktrace.o -MD -MP -MF misc/$(DEPDIR)/fldigi-stacktrace.Tpo -c -o misc/fldigi-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-stacktrace.Tpo misc/$(DEPDIR)/fldigi-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='misc/fldigi-stacktrace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-stacktrace.o `test -f 'misc/stacktrace.cxx' || echo '$(srcdir)/'`misc/stacktrace.cxx misc/fldigi-stacktrace.obj: misc/stacktrace.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-stacktrace.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-stacktrace.Tpo -c -o misc/fldigi-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-stacktrace.Tpo misc/$(DEPDIR)/fldigi-stacktrace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/stacktrace.cxx' object='misc/fldigi-stacktrace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-stacktrace.obj `if test -f 'misc/stacktrace.cxx'; then $(CYGPATH_W) 'misc/stacktrace.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/stacktrace.cxx'; fi` misc/fldigi-strutil.o: misc/strutil.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-strutil.o -MD -MP -MF misc/$(DEPDIR)/fldigi-strutil.Tpo -c -o misc/fldigi-strutil.o `test -f 'misc/strutil.cxx' || echo '$(srcdir)/'`misc/strutil.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-strutil.Tpo misc/$(DEPDIR)/fldigi-strutil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/strutil.cxx' object='misc/fldigi-strutil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-strutil.o `test -f 'misc/strutil.cxx' || echo '$(srcdir)/'`misc/strutil.cxx misc/fldigi-strutil.obj: misc/strutil.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-strutil.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-strutil.Tpo -c -o misc/fldigi-strutil.obj `if test -f 'misc/strutil.cxx'; then $(CYGPATH_W) 'misc/strutil.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/strutil.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-strutil.Tpo misc/$(DEPDIR)/fldigi-strutil.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/strutil.cxx' object='misc/fldigi-strutil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-strutil.obj `if test -f 'misc/strutil.cxx'; then $(CYGPATH_W) 'misc/strutil.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/strutil.cxx'; fi` misc/fldigi-threads.o: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-threads.o -MD -MP -MF misc/$(DEPDIR)/fldigi-threads.Tpo -c -o misc/fldigi-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-threads.Tpo misc/$(DEPDIR)/fldigi-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='misc/fldigi-threads.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-threads.o `test -f 'misc/threads.cxx' || echo '$(srcdir)/'`misc/threads.cxx misc/fldigi-threads.obj: misc/threads.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-threads.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-threads.Tpo -c -o misc/fldigi-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-threads.Tpo misc/$(DEPDIR)/fldigi-threads.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/threads.cxx' object='misc/fldigi-threads.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-threads.obj `if test -f 'misc/threads.cxx'; then $(CYGPATH_W) 'misc/threads.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/threads.cxx'; fi` misc/fldigi-timeops.o: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-timeops.o -MD -MP -MF misc/$(DEPDIR)/fldigi-timeops.Tpo -c -o misc/fldigi-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-timeops.Tpo misc/$(DEPDIR)/fldigi-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='misc/fldigi-timeops.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-timeops.o `test -f 'misc/timeops.cxx' || echo '$(srcdir)/'`misc/timeops.cxx misc/fldigi-timeops.obj: misc/timeops.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-timeops.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-timeops.Tpo -c -o misc/fldigi-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-timeops.Tpo misc/$(DEPDIR)/fldigi-timeops.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/timeops.cxx' object='misc/fldigi-timeops.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-timeops.obj `if test -f 'misc/timeops.cxx'; then $(CYGPATH_W) 'misc/timeops.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/timeops.cxx'; fi` misc/fldigi-utf8file_io.o: misc/utf8file_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-utf8file_io.o -MD -MP -MF misc/$(DEPDIR)/fldigi-utf8file_io.Tpo -c -o misc/fldigi-utf8file_io.o `test -f 'misc/utf8file_io.cxx' || echo '$(srcdir)/'`misc/utf8file_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-utf8file_io.Tpo misc/$(DEPDIR)/fldigi-utf8file_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/utf8file_io.cxx' object='misc/fldigi-utf8file_io.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-utf8file_io.o `test -f 'misc/utf8file_io.cxx' || echo '$(srcdir)/'`misc/utf8file_io.cxx misc/fldigi-utf8file_io.obj: misc/utf8file_io.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-utf8file_io.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-utf8file_io.Tpo -c -o misc/fldigi-utf8file_io.obj `if test -f 'misc/utf8file_io.cxx'; then $(CYGPATH_W) 'misc/utf8file_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/utf8file_io.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-utf8file_io.Tpo misc/$(DEPDIR)/fldigi-utf8file_io.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/utf8file_io.cxx' object='misc/fldigi-utf8file_io.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-utf8file_io.obj `if test -f 'misc/utf8file_io.cxx'; then $(CYGPATH_W) 'misc/utf8file_io.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/utf8file_io.cxx'; fi` misc/fldigi-util.o: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-util.o -MD -MP -MF misc/$(DEPDIR)/fldigi-util.Tpo -c -o misc/fldigi-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-util.Tpo misc/$(DEPDIR)/fldigi-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='misc/fldigi-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-util.o `test -f 'misc/util.cxx' || echo '$(srcdir)/'`misc/util.cxx misc/fldigi-util.obj: misc/util.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT misc/fldigi-util.obj -MD -MP -MF misc/$(DEPDIR)/fldigi-util.Tpo -c -o misc/fldigi-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) misc/$(DEPDIR)/fldigi-util.Tpo misc/$(DEPDIR)/fldigi-util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='misc/util.cxx' object='misc/fldigi-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o misc/fldigi-util.obj `if test -f 'misc/util.cxx'; then $(CYGPATH_W) 'misc/util.cxx'; else $(CYGPATH_W) '$(srcdir)/misc/util.cxx'; fi` mt63/fldigi-dsp.o: mt63/dsp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-dsp.o -MD -MP -MF mt63/$(DEPDIR)/fldigi-dsp.Tpo -c -o mt63/fldigi-dsp.o `test -f 'mt63/dsp.cxx' || echo '$(srcdir)/'`mt63/dsp.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-dsp.Tpo mt63/$(DEPDIR)/fldigi-dsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/dsp.cxx' object='mt63/fldigi-dsp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-dsp.o `test -f 'mt63/dsp.cxx' || echo '$(srcdir)/'`mt63/dsp.cxx mt63/fldigi-dsp.obj: mt63/dsp.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-dsp.obj -MD -MP -MF mt63/$(DEPDIR)/fldigi-dsp.Tpo -c -o mt63/fldigi-dsp.obj `if test -f 'mt63/dsp.cxx'; then $(CYGPATH_W) 'mt63/dsp.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/dsp.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-dsp.Tpo mt63/$(DEPDIR)/fldigi-dsp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/dsp.cxx' object='mt63/fldigi-dsp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-dsp.obj `if test -f 'mt63/dsp.cxx'; then $(CYGPATH_W) 'mt63/dsp.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/dsp.cxx'; fi` mt63/fldigi-mt63base.o: mt63/mt63base.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-mt63base.o -MD -MP -MF mt63/$(DEPDIR)/fldigi-mt63base.Tpo -c -o mt63/fldigi-mt63base.o `test -f 'mt63/mt63base.cxx' || echo '$(srcdir)/'`mt63/mt63base.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-mt63base.Tpo mt63/$(DEPDIR)/fldigi-mt63base.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63base.cxx' object='mt63/fldigi-mt63base.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-mt63base.o `test -f 'mt63/mt63base.cxx' || echo '$(srcdir)/'`mt63/mt63base.cxx mt63/fldigi-mt63base.obj: mt63/mt63base.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-mt63base.obj -MD -MP -MF mt63/$(DEPDIR)/fldigi-mt63base.Tpo -c -o mt63/fldigi-mt63base.obj `if test -f 'mt63/mt63base.cxx'; then $(CYGPATH_W) 'mt63/mt63base.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63base.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-mt63base.Tpo mt63/$(DEPDIR)/fldigi-mt63base.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63base.cxx' object='mt63/fldigi-mt63base.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-mt63base.obj `if test -f 'mt63/mt63base.cxx'; then $(CYGPATH_W) 'mt63/mt63base.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63base.cxx'; fi` mt63/fldigi-mt63.o: mt63/mt63.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-mt63.o -MD -MP -MF mt63/$(DEPDIR)/fldigi-mt63.Tpo -c -o mt63/fldigi-mt63.o `test -f 'mt63/mt63.cxx' || echo '$(srcdir)/'`mt63/mt63.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-mt63.Tpo mt63/$(DEPDIR)/fldigi-mt63.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63.cxx' object='mt63/fldigi-mt63.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-mt63.o `test -f 'mt63/mt63.cxx' || echo '$(srcdir)/'`mt63/mt63.cxx mt63/fldigi-mt63.obj: mt63/mt63.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mt63/fldigi-mt63.obj -MD -MP -MF mt63/$(DEPDIR)/fldigi-mt63.Tpo -c -o mt63/fldigi-mt63.obj `if test -f 'mt63/mt63.cxx'; then $(CYGPATH_W) 'mt63/mt63.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mt63/$(DEPDIR)/fldigi-mt63.Tpo mt63/$(DEPDIR)/fldigi-mt63.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mt63/mt63.cxx' object='mt63/fldigi-mt63.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mt63/fldigi-mt63.obj `if test -f 'mt63/mt63.cxx'; then $(CYGPATH_W) 'mt63/mt63.cxx'; else $(CYGPATH_W) '$(srcdir)/mt63/mt63.cxx'; fi` navtex/fldigi-navtex.o: navtex/navtex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT navtex/fldigi-navtex.o -MD -MP -MF navtex/$(DEPDIR)/fldigi-navtex.Tpo -c -o navtex/fldigi-navtex.o `test -f 'navtex/navtex.cxx' || echo '$(srcdir)/'`navtex/navtex.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) navtex/$(DEPDIR)/fldigi-navtex.Tpo navtex/$(DEPDIR)/fldigi-navtex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='navtex/navtex.cxx' object='navtex/fldigi-navtex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o navtex/fldigi-navtex.o `test -f 'navtex/navtex.cxx' || echo '$(srcdir)/'`navtex/navtex.cxx navtex/fldigi-navtex.obj: navtex/navtex.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT navtex/fldigi-navtex.obj -MD -MP -MF navtex/$(DEPDIR)/fldigi-navtex.Tpo -c -o navtex/fldigi-navtex.obj `if test -f 'navtex/navtex.cxx'; then $(CYGPATH_W) 'navtex/navtex.cxx'; else $(CYGPATH_W) '$(srcdir)/navtex/navtex.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) navtex/$(DEPDIR)/fldigi-navtex.Tpo navtex/$(DEPDIR)/fldigi-navtex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='navtex/navtex.cxx' object='navtex/fldigi-navtex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o navtex/fldigi-navtex.obj `if test -f 'navtex/navtex.cxx'; then $(CYGPATH_W) 'navtex/navtex.cxx'; else $(CYGPATH_W) '$(srcdir)/navtex/navtex.cxx'; fi` network/fldigi-ca_cert.o: network/ca_cert.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-ca_cert.o -MD -MP -MF network/$(DEPDIR)/fldigi-ca_cert.Tpo -c -o network/fldigi-ca_cert.o `test -f 'network/ca_cert.cxx' || echo '$(srcdir)/'`network/ca_cert.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-ca_cert.Tpo network/$(DEPDIR)/fldigi-ca_cert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/ca_cert.cxx' object='network/fldigi-ca_cert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-ca_cert.o `test -f 'network/ca_cert.cxx' || echo '$(srcdir)/'`network/ca_cert.cxx network/fldigi-ca_cert.obj: network/ca_cert.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-ca_cert.obj -MD -MP -MF network/$(DEPDIR)/fldigi-ca_cert.Tpo -c -o network/fldigi-ca_cert.obj `if test -f 'network/ca_cert.cxx'; then $(CYGPATH_W) 'network/ca_cert.cxx'; else $(CYGPATH_W) '$(srcdir)/network/ca_cert.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-ca_cert.Tpo network/$(DEPDIR)/fldigi-ca_cert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/ca_cert.cxx' object='network/fldigi-ca_cert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-ca_cert.obj `if test -f 'network/ca_cert.cxx'; then $(CYGPATH_W) 'network/ca_cert.cxx'; else $(CYGPATH_W) '$(srcdir)/network/ca_cert.cxx'; fi` network/fldigi-metar.o: network/metar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-metar.o -MD -MP -MF network/$(DEPDIR)/fldigi-metar.Tpo -c -o network/fldigi-metar.o `test -f 'network/metar.cxx' || echo '$(srcdir)/'`network/metar.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-metar.Tpo network/$(DEPDIR)/fldigi-metar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/metar.cxx' object='network/fldigi-metar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-metar.o `test -f 'network/metar.cxx' || echo '$(srcdir)/'`network/metar.cxx network/fldigi-metar.obj: network/metar.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-metar.obj -MD -MP -MF network/$(DEPDIR)/fldigi-metar.Tpo -c -o network/fldigi-metar.obj `if test -f 'network/metar.cxx'; then $(CYGPATH_W) 'network/metar.cxx'; else $(CYGPATH_W) '$(srcdir)/network/metar.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-metar.Tpo network/$(DEPDIR)/fldigi-metar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/metar.cxx' object='network/fldigi-metar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-metar.obj `if test -f 'network/metar.cxx'; then $(CYGPATH_W) 'network/metar.cxx'; else $(CYGPATH_W) '$(srcdir)/network/metar.cxx'; fi` network/fldigi-network.o: network/network.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-network.o -MD -MP -MF network/$(DEPDIR)/fldigi-network.Tpo -c -o network/fldigi-network.o `test -f 'network/network.cxx' || echo '$(srcdir)/'`network/network.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-network.Tpo network/$(DEPDIR)/fldigi-network.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/network.cxx' object='network/fldigi-network.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-network.o `test -f 'network/network.cxx' || echo '$(srcdir)/'`network/network.cxx network/fldigi-network.obj: network/network.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-network.obj -MD -MP -MF network/$(DEPDIR)/fldigi-network.Tpo -c -o network/fldigi-network.obj `if test -f 'network/network.cxx'; then $(CYGPATH_W) 'network/network.cxx'; else $(CYGPATH_W) '$(srcdir)/network/network.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-network.Tpo network/$(DEPDIR)/fldigi-network.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/network.cxx' object='network/fldigi-network.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-network.obj `if test -f 'network/network.cxx'; then $(CYGPATH_W) 'network/network.cxx'; else $(CYGPATH_W) '$(srcdir)/network/network.cxx'; fi` network/fldigi-socket.o: network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-socket.o -MD -MP -MF network/$(DEPDIR)/fldigi-socket.Tpo -c -o network/fldigi-socket.o `test -f 'network/socket.cxx' || echo '$(srcdir)/'`network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-socket.Tpo network/$(DEPDIR)/fldigi-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/socket.cxx' object='network/fldigi-socket.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-socket.o `test -f 'network/socket.cxx' || echo '$(srcdir)/'`network/socket.cxx network/fldigi-socket.obj: network/socket.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-socket.obj -MD -MP -MF network/$(DEPDIR)/fldigi-socket.Tpo -c -o network/fldigi-socket.obj `if test -f 'network/socket.cxx'; then $(CYGPATH_W) 'network/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/network/socket.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-socket.Tpo network/$(DEPDIR)/fldigi-socket.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/socket.cxx' object='network/fldigi-socket.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-socket.obj `if test -f 'network/socket.cxx'; then $(CYGPATH_W) 'network/socket.cxx'; else $(CYGPATH_W) '$(srcdir)/network/socket.cxx'; fi` network/fldigi-weather.o: network/weather.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-weather.o -MD -MP -MF network/$(DEPDIR)/fldigi-weather.Tpo -c -o network/fldigi-weather.o `test -f 'network/weather.cxx' || echo '$(srcdir)/'`network/weather.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-weather.Tpo network/$(DEPDIR)/fldigi-weather.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/weather.cxx' object='network/fldigi-weather.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-weather.o `test -f 'network/weather.cxx' || echo '$(srcdir)/'`network/weather.cxx network/fldigi-weather.obj: network/weather.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT network/fldigi-weather.obj -MD -MP -MF network/$(DEPDIR)/fldigi-weather.Tpo -c -o network/fldigi-weather.obj `if test -f 'network/weather.cxx'; then $(CYGPATH_W) 'network/weather.cxx'; else $(CYGPATH_W) '$(srcdir)/network/weather.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) network/$(DEPDIR)/fldigi-weather.Tpo network/$(DEPDIR)/fldigi-weather.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='network/weather.cxx' object='network/fldigi-weather.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o network/fldigi-weather.obj `if test -f 'network/weather.cxx'; then $(CYGPATH_W) 'network/weather.cxx'; else $(CYGPATH_W) '$(srcdir)/network/weather.cxx'; fi` olivia/fldigi-olivia.o: olivia/olivia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT olivia/fldigi-olivia.o -MD -MP -MF olivia/$(DEPDIR)/fldigi-olivia.Tpo -c -o olivia/fldigi-olivia.o `test -f 'olivia/olivia.cxx' || echo '$(srcdir)/'`olivia/olivia.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) olivia/$(DEPDIR)/fldigi-olivia.Tpo olivia/$(DEPDIR)/fldigi-olivia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='olivia/olivia.cxx' object='olivia/fldigi-olivia.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o olivia/fldigi-olivia.o `test -f 'olivia/olivia.cxx' || echo '$(srcdir)/'`olivia/olivia.cxx olivia/fldigi-olivia.obj: olivia/olivia.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT olivia/fldigi-olivia.obj -MD -MP -MF olivia/$(DEPDIR)/fldigi-olivia.Tpo -c -o olivia/fldigi-olivia.obj `if test -f 'olivia/olivia.cxx'; then $(CYGPATH_W) 'olivia/olivia.cxx'; else $(CYGPATH_W) '$(srcdir)/olivia/olivia.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) olivia/$(DEPDIR)/fldigi-olivia.Tpo olivia/$(DEPDIR)/fldigi-olivia.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='olivia/olivia.cxx' object='olivia/fldigi-olivia.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o olivia/fldigi-olivia.obj `if test -f 'olivia/olivia.cxx'; then $(CYGPATH_W) 'olivia/olivia.cxx'; else $(CYGPATH_W) '$(srcdir)/olivia/olivia.cxx'; fi` psk/fldigi-pskcoeff.o: psk/pskcoeff.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskcoeff.o -MD -MP -MF psk/$(DEPDIR)/fldigi-pskcoeff.Tpo -c -o psk/fldigi-pskcoeff.o `test -f 'psk/pskcoeff.cxx' || echo '$(srcdir)/'`psk/pskcoeff.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskcoeff.Tpo psk/$(DEPDIR)/fldigi-pskcoeff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskcoeff.cxx' object='psk/fldigi-pskcoeff.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskcoeff.o `test -f 'psk/pskcoeff.cxx' || echo '$(srcdir)/'`psk/pskcoeff.cxx psk/fldigi-pskcoeff.obj: psk/pskcoeff.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskcoeff.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-pskcoeff.Tpo -c -o psk/fldigi-pskcoeff.obj `if test -f 'psk/pskcoeff.cxx'; then $(CYGPATH_W) 'psk/pskcoeff.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskcoeff.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskcoeff.Tpo psk/$(DEPDIR)/fldigi-pskcoeff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskcoeff.cxx' object='psk/fldigi-pskcoeff.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskcoeff.obj `if test -f 'psk/pskcoeff.cxx'; then $(CYGPATH_W) 'psk/pskcoeff.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskcoeff.cxx'; fi` psk/fldigi-psk.o: psk/psk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-psk.o -MD -MP -MF psk/$(DEPDIR)/fldigi-psk.Tpo -c -o psk/fldigi-psk.o `test -f 'psk/psk.cxx' || echo '$(srcdir)/'`psk/psk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-psk.Tpo psk/$(DEPDIR)/fldigi-psk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/psk.cxx' object='psk/fldigi-psk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-psk.o `test -f 'psk/psk.cxx' || echo '$(srcdir)/'`psk/psk.cxx psk/fldigi-psk.obj: psk/psk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-psk.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-psk.Tpo -c -o psk/fldigi-psk.obj `if test -f 'psk/psk.cxx'; then $(CYGPATH_W) 'psk/psk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/psk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-psk.Tpo psk/$(DEPDIR)/fldigi-psk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/psk.cxx' object='psk/fldigi-psk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-psk.obj `if test -f 'psk/psk.cxx'; then $(CYGPATH_W) 'psk/psk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/psk.cxx'; fi` psk/fldigi-pskeval.o: psk/pskeval.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskeval.o -MD -MP -MF psk/$(DEPDIR)/fldigi-pskeval.Tpo -c -o psk/fldigi-pskeval.o `test -f 'psk/pskeval.cxx' || echo '$(srcdir)/'`psk/pskeval.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskeval.Tpo psk/$(DEPDIR)/fldigi-pskeval.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskeval.cxx' object='psk/fldigi-pskeval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskeval.o `test -f 'psk/pskeval.cxx' || echo '$(srcdir)/'`psk/pskeval.cxx psk/fldigi-pskeval.obj: psk/pskeval.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskeval.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-pskeval.Tpo -c -o psk/fldigi-pskeval.obj `if test -f 'psk/pskeval.cxx'; then $(CYGPATH_W) 'psk/pskeval.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskeval.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskeval.Tpo psk/$(DEPDIR)/fldigi-pskeval.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskeval.cxx' object='psk/fldigi-pskeval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskeval.obj `if test -f 'psk/pskeval.cxx'; then $(CYGPATH_W) 'psk/pskeval.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskeval.cxx'; fi` psk/fldigi-pskvaricode.o: psk/pskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskvaricode.o -MD -MP -MF psk/$(DEPDIR)/fldigi-pskvaricode.Tpo -c -o psk/fldigi-pskvaricode.o `test -f 'psk/pskvaricode.cxx' || echo '$(srcdir)/'`psk/pskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskvaricode.Tpo psk/$(DEPDIR)/fldigi-pskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskvaricode.cxx' object='psk/fldigi-pskvaricode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskvaricode.o `test -f 'psk/pskvaricode.cxx' || echo '$(srcdir)/'`psk/pskvaricode.cxx psk/fldigi-pskvaricode.obj: psk/pskvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-pskvaricode.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-pskvaricode.Tpo -c -o psk/fldigi-pskvaricode.obj `if test -f 'psk/pskvaricode.cxx'; then $(CYGPATH_W) 'psk/pskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskvaricode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-pskvaricode.Tpo psk/$(DEPDIR)/fldigi-pskvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/pskvaricode.cxx' object='psk/fldigi-pskvaricode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-pskvaricode.obj `if test -f 'psk/pskvaricode.cxx'; then $(CYGPATH_W) 'psk/pskvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/pskvaricode.cxx'; fi` psk/fldigi-viewpsk.o: psk/viewpsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-viewpsk.o -MD -MP -MF psk/$(DEPDIR)/fldigi-viewpsk.Tpo -c -o psk/fldigi-viewpsk.o `test -f 'psk/viewpsk.cxx' || echo '$(srcdir)/'`psk/viewpsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-viewpsk.Tpo psk/$(DEPDIR)/fldigi-viewpsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/viewpsk.cxx' object='psk/fldigi-viewpsk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-viewpsk.o `test -f 'psk/viewpsk.cxx' || echo '$(srcdir)/'`psk/viewpsk.cxx psk/fldigi-viewpsk.obj: psk/viewpsk.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psk/fldigi-viewpsk.obj -MD -MP -MF psk/$(DEPDIR)/fldigi-viewpsk.Tpo -c -o psk/fldigi-viewpsk.obj `if test -f 'psk/viewpsk.cxx'; then $(CYGPATH_W) 'psk/viewpsk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/viewpsk.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psk/$(DEPDIR)/fldigi-viewpsk.Tpo psk/$(DEPDIR)/fldigi-viewpsk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psk/viewpsk.cxx' object='psk/fldigi-viewpsk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psk/fldigi-viewpsk.obj `if test -f 'psk/viewpsk.cxx'; then $(CYGPATH_W) 'psk/viewpsk.cxx'; else $(CYGPATH_W) '$(srcdir)/psk/viewpsk.cxx'; fi` psm/fldigi-psm.o: psm/psm.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psm/fldigi-psm.o -MD -MP -MF psm/$(DEPDIR)/fldigi-psm.Tpo -c -o psm/fldigi-psm.o `test -f 'psm/psm.cxx' || echo '$(srcdir)/'`psm/psm.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psm/$(DEPDIR)/fldigi-psm.Tpo psm/$(DEPDIR)/fldigi-psm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psm/psm.cxx' object='psm/fldigi-psm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psm/fldigi-psm.o `test -f 'psm/psm.cxx' || echo '$(srcdir)/'`psm/psm.cxx psm/fldigi-psm.obj: psm/psm.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT psm/fldigi-psm.obj -MD -MP -MF psm/$(DEPDIR)/fldigi-psm.Tpo -c -o psm/fldigi-psm.obj `if test -f 'psm/psm.cxx'; then $(CYGPATH_W) 'psm/psm.cxx'; else $(CYGPATH_W) '$(srcdir)/psm/psm.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) psm/$(DEPDIR)/fldigi-psm.Tpo psm/$(DEPDIR)/fldigi-psm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='psm/psm.cxx' object='psm/fldigi-psm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o psm/fldigi-psm.obj `if test -f 'psm/psm.cxx'; then $(CYGPATH_W) 'psm/psm.cxx'; else $(CYGPATH_W) '$(srcdir)/psm/psm.cxx'; fi` qrunner/fldigi-qrunner.o: qrunner/qrunner.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT qrunner/fldigi-qrunner.o -MD -MP -MF qrunner/$(DEPDIR)/fldigi-qrunner.Tpo -c -o qrunner/fldigi-qrunner.o `test -f 'qrunner/qrunner.cxx' || echo '$(srcdir)/'`qrunner/qrunner.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) qrunner/$(DEPDIR)/fldigi-qrunner.Tpo qrunner/$(DEPDIR)/fldigi-qrunner.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='qrunner/qrunner.cxx' object='qrunner/fldigi-qrunner.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o qrunner/fldigi-qrunner.o `test -f 'qrunner/qrunner.cxx' || echo '$(srcdir)/'`qrunner/qrunner.cxx qrunner/fldigi-qrunner.obj: qrunner/qrunner.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT qrunner/fldigi-qrunner.obj -MD -MP -MF qrunner/$(DEPDIR)/fldigi-qrunner.Tpo -c -o qrunner/fldigi-qrunner.obj `if test -f 'qrunner/qrunner.cxx'; then $(CYGPATH_W) 'qrunner/qrunner.cxx'; else $(CYGPATH_W) '$(srcdir)/qrunner/qrunner.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) qrunner/$(DEPDIR)/fldigi-qrunner.Tpo qrunner/$(DEPDIR)/fldigi-qrunner.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='qrunner/qrunner.cxx' object='qrunner/fldigi-qrunner.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o qrunner/fldigi-qrunner.obj `if test -f 'qrunner/qrunner.cxx'; then $(CYGPATH_W) 'qrunner/qrunner.cxx'; else $(CYGPATH_W) '$(srcdir)/qrunner/qrunner.cxx'; fi` rigcontrol/fldigi-FreqControl.o: rigcontrol/FreqControl.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-FreqControl.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-FreqControl.Tpo -c -o rigcontrol/fldigi-FreqControl.o `test -f 'rigcontrol/FreqControl.cxx' || echo '$(srcdir)/'`rigcontrol/FreqControl.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-FreqControl.Tpo rigcontrol/$(DEPDIR)/fldigi-FreqControl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/FreqControl.cxx' object='rigcontrol/fldigi-FreqControl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-FreqControl.o `test -f 'rigcontrol/FreqControl.cxx' || echo '$(srcdir)/'`rigcontrol/FreqControl.cxx rigcontrol/fldigi-FreqControl.obj: rigcontrol/FreqControl.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-FreqControl.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-FreqControl.Tpo -c -o rigcontrol/fldigi-FreqControl.obj `if test -f 'rigcontrol/FreqControl.cxx'; then $(CYGPATH_W) 'rigcontrol/FreqControl.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/FreqControl.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-FreqControl.Tpo rigcontrol/$(DEPDIR)/fldigi-FreqControl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/FreqControl.cxx' object='rigcontrol/fldigi-FreqControl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-FreqControl.obj `if test -f 'rigcontrol/FreqControl.cxx'; then $(CYGPATH_W) 'rigcontrol/FreqControl.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/FreqControl.cxx'; fi` rigcontrol/fldigi-norig.o: rigcontrol/norig.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-norig.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-norig.Tpo -c -o rigcontrol/fldigi-norig.o `test -f 'rigcontrol/norig.cxx' || echo '$(srcdir)/'`rigcontrol/norig.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-norig.Tpo rigcontrol/$(DEPDIR)/fldigi-norig.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/norig.cxx' object='rigcontrol/fldigi-norig.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-norig.o `test -f 'rigcontrol/norig.cxx' || echo '$(srcdir)/'`rigcontrol/norig.cxx rigcontrol/fldigi-norig.obj: rigcontrol/norig.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-norig.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-norig.Tpo -c -o rigcontrol/fldigi-norig.obj `if test -f 'rigcontrol/norig.cxx'; then $(CYGPATH_W) 'rigcontrol/norig.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/norig.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-norig.Tpo rigcontrol/$(DEPDIR)/fldigi-norig.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/norig.cxx' object='rigcontrol/fldigi-norig.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-norig.obj `if test -f 'rigcontrol/norig.cxx'; then $(CYGPATH_W) 'rigcontrol/norig.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/norig.cxx'; fi` rigcontrol/fldigi-ptt.o: rigcontrol/ptt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-ptt.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-ptt.Tpo -c -o rigcontrol/fldigi-ptt.o `test -f 'rigcontrol/ptt.cxx' || echo '$(srcdir)/'`rigcontrol/ptt.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-ptt.Tpo rigcontrol/$(DEPDIR)/fldigi-ptt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/ptt.cxx' object='rigcontrol/fldigi-ptt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-ptt.o `test -f 'rigcontrol/ptt.cxx' || echo '$(srcdir)/'`rigcontrol/ptt.cxx rigcontrol/fldigi-ptt.obj: rigcontrol/ptt.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-ptt.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-ptt.Tpo -c -o rigcontrol/fldigi-ptt.obj `if test -f 'rigcontrol/ptt.cxx'; then $(CYGPATH_W) 'rigcontrol/ptt.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/ptt.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-ptt.Tpo rigcontrol/$(DEPDIR)/fldigi-ptt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/ptt.cxx' object='rigcontrol/fldigi-ptt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-ptt.obj `if test -f 'rigcontrol/ptt.cxx'; then $(CYGPATH_W) 'rigcontrol/ptt.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/ptt.cxx'; fi` rigcontrol/fldigi-rigio.o: rigcontrol/rigio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigio.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigio.Tpo -c -o rigcontrol/fldigi-rigio.o `test -f 'rigcontrol/rigio.cxx' || echo '$(srcdir)/'`rigcontrol/rigio.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigio.Tpo rigcontrol/$(DEPDIR)/fldigi-rigio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigio.cxx' object='rigcontrol/fldigi-rigio.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigio.o `test -f 'rigcontrol/rigio.cxx' || echo '$(srcdir)/'`rigcontrol/rigio.cxx rigcontrol/fldigi-rigio.obj: rigcontrol/rigio.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigio.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigio.Tpo -c -o rigcontrol/fldigi-rigio.obj `if test -f 'rigcontrol/rigio.cxx'; then $(CYGPATH_W) 'rigcontrol/rigio.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigio.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigio.Tpo rigcontrol/$(DEPDIR)/fldigi-rigio.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigio.cxx' object='rigcontrol/fldigi-rigio.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigio.obj `if test -f 'rigcontrol/rigio.cxx'; then $(CYGPATH_W) 'rigcontrol/rigio.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigio.cxx'; fi` rigcontrol/fldigi-rigsupport.o: rigcontrol/rigsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigsupport.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigsupport.Tpo -c -o rigcontrol/fldigi-rigsupport.o `test -f 'rigcontrol/rigsupport.cxx' || echo '$(srcdir)/'`rigcontrol/rigsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigsupport.Tpo rigcontrol/$(DEPDIR)/fldigi-rigsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigsupport.cxx' object='rigcontrol/fldigi-rigsupport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigsupport.o `test -f 'rigcontrol/rigsupport.cxx' || echo '$(srcdir)/'`rigcontrol/rigsupport.cxx rigcontrol/fldigi-rigsupport.obj: rigcontrol/rigsupport.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigsupport.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigsupport.Tpo -c -o rigcontrol/fldigi-rigsupport.obj `if test -f 'rigcontrol/rigsupport.cxx'; then $(CYGPATH_W) 'rigcontrol/rigsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigsupport.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigsupport.Tpo rigcontrol/$(DEPDIR)/fldigi-rigsupport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigsupport.cxx' object='rigcontrol/fldigi-rigsupport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigsupport.obj `if test -f 'rigcontrol/rigsupport.cxx'; then $(CYGPATH_W) 'rigcontrol/rigsupport.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigsupport.cxx'; fi` rigcontrol/fldigi-rigxml.o: rigcontrol/rigxml.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigxml.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigxml.Tpo -c -o rigcontrol/fldigi-rigxml.o `test -f 'rigcontrol/rigxml.cxx' || echo '$(srcdir)/'`rigcontrol/rigxml.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigxml.Tpo rigcontrol/$(DEPDIR)/fldigi-rigxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigxml.cxx' object='rigcontrol/fldigi-rigxml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigxml.o `test -f 'rigcontrol/rigxml.cxx' || echo '$(srcdir)/'`rigcontrol/rigxml.cxx rigcontrol/fldigi-rigxml.obj: rigcontrol/rigxml.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-rigxml.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-rigxml.Tpo -c -o rigcontrol/fldigi-rigxml.obj `if test -f 'rigcontrol/rigxml.cxx'; then $(CYGPATH_W) 'rigcontrol/rigxml.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigxml.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-rigxml.Tpo rigcontrol/$(DEPDIR)/fldigi-rigxml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/rigxml.cxx' object='rigcontrol/fldigi-rigxml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-rigxml.obj `if test -f 'rigcontrol/rigxml.cxx'; then $(CYGPATH_W) 'rigcontrol/rigxml.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/rigxml.cxx'; fi` rigcontrol/fldigi-serial.o: rigcontrol/serial.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-serial.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-serial.Tpo -c -o rigcontrol/fldigi-serial.o `test -f 'rigcontrol/serial.cxx' || echo '$(srcdir)/'`rigcontrol/serial.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-serial.Tpo rigcontrol/$(DEPDIR)/fldigi-serial.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/serial.cxx' object='rigcontrol/fldigi-serial.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-serial.o `test -f 'rigcontrol/serial.cxx' || echo '$(srcdir)/'`rigcontrol/serial.cxx rigcontrol/fldigi-serial.obj: rigcontrol/serial.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-serial.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-serial.Tpo -c -o rigcontrol/fldigi-serial.obj `if test -f 'rigcontrol/serial.cxx'; then $(CYGPATH_W) 'rigcontrol/serial.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/serial.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-serial.Tpo rigcontrol/$(DEPDIR)/fldigi-serial.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/serial.cxx' object='rigcontrol/fldigi-serial.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-serial.obj `if test -f 'rigcontrol/serial.cxx'; then $(CYGPATH_W) 'rigcontrol/serial.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/serial.cxx'; fi` rigcontrol/fldigi-xmlrpc_rig.o: rigcontrol/xmlrpc_rig.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-xmlrpc_rig.o -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Tpo -c -o rigcontrol/fldigi-xmlrpc_rig.o `test -f 'rigcontrol/xmlrpc_rig.cxx' || echo '$(srcdir)/'`rigcontrol/xmlrpc_rig.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Tpo rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/xmlrpc_rig.cxx' object='rigcontrol/fldigi-xmlrpc_rig.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-xmlrpc_rig.o `test -f 'rigcontrol/xmlrpc_rig.cxx' || echo '$(srcdir)/'`rigcontrol/xmlrpc_rig.cxx rigcontrol/fldigi-xmlrpc_rig.obj: rigcontrol/xmlrpc_rig.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rigcontrol/fldigi-xmlrpc_rig.obj -MD -MP -MF rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Tpo -c -o rigcontrol/fldigi-xmlrpc_rig.obj `if test -f 'rigcontrol/xmlrpc_rig.cxx'; then $(CYGPATH_W) 'rigcontrol/xmlrpc_rig.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/xmlrpc_rig.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Tpo rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rigcontrol/xmlrpc_rig.cxx' object='rigcontrol/fldigi-xmlrpc_rig.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rigcontrol/fldigi-xmlrpc_rig.obj `if test -f 'rigcontrol/xmlrpc_rig.cxx'; then $(CYGPATH_W) 'rigcontrol/xmlrpc_rig.cxx'; else $(CYGPATH_W) '$(srcdir)/rigcontrol/xmlrpc_rig.cxx'; fi` rsid/fldigi-rsid.o: rsid/rsid.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rsid/fldigi-rsid.o -MD -MP -MF rsid/$(DEPDIR)/fldigi-rsid.Tpo -c -o rsid/fldigi-rsid.o `test -f 'rsid/rsid.cxx' || echo '$(srcdir)/'`rsid/rsid.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rsid/$(DEPDIR)/fldigi-rsid.Tpo rsid/$(DEPDIR)/fldigi-rsid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid.cxx' object='rsid/fldigi-rsid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rsid/fldigi-rsid.o `test -f 'rsid/rsid.cxx' || echo '$(srcdir)/'`rsid/rsid.cxx rsid/fldigi-rsid.obj: rsid/rsid.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rsid/fldigi-rsid.obj -MD -MP -MF rsid/$(DEPDIR)/fldigi-rsid.Tpo -c -o rsid/fldigi-rsid.obj `if test -f 'rsid/rsid.cxx'; then $(CYGPATH_W) 'rsid/rsid.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rsid/$(DEPDIR)/fldigi-rsid.Tpo rsid/$(DEPDIR)/fldigi-rsid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid.cxx' object='rsid/fldigi-rsid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rsid/fldigi-rsid.obj `if test -f 'rsid/rsid.cxx'; then $(CYGPATH_W) 'rsid/rsid.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid.cxx'; fi` soundcard/fldigi-audio_alert.o: soundcard/audio_alert.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-audio_alert.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-audio_alert.Tpo -c -o soundcard/fldigi-audio_alert.o `test -f 'soundcard/audio_alert.cxx' || echo '$(srcdir)/'`soundcard/audio_alert.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-audio_alert.Tpo soundcard/$(DEPDIR)/fldigi-audio_alert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/audio_alert.cxx' object='soundcard/fldigi-audio_alert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-audio_alert.o `test -f 'soundcard/audio_alert.cxx' || echo '$(srcdir)/'`soundcard/audio_alert.cxx soundcard/fldigi-audio_alert.obj: soundcard/audio_alert.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-audio_alert.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-audio_alert.Tpo -c -o soundcard/fldigi-audio_alert.obj `if test -f 'soundcard/audio_alert.cxx'; then $(CYGPATH_W) 'soundcard/audio_alert.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/audio_alert.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-audio_alert.Tpo soundcard/$(DEPDIR)/fldigi-audio_alert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/audio_alert.cxx' object='soundcard/fldigi-audio_alert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-audio_alert.obj `if test -f 'soundcard/audio_alert.cxx'; then $(CYGPATH_W) 'soundcard/audio_alert.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/audio_alert.cxx'; fi` soundcard/fldigi-bark.o: soundcard/bark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-bark.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-bark.Tpo -c -o soundcard/fldigi-bark.o `test -f 'soundcard/bark.cxx' || echo '$(srcdir)/'`soundcard/bark.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-bark.Tpo soundcard/$(DEPDIR)/fldigi-bark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/bark.cxx' object='soundcard/fldigi-bark.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-bark.o `test -f 'soundcard/bark.cxx' || echo '$(srcdir)/'`soundcard/bark.cxx soundcard/fldigi-bark.obj: soundcard/bark.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-bark.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-bark.Tpo -c -o soundcard/fldigi-bark.obj `if test -f 'soundcard/bark.cxx'; then $(CYGPATH_W) 'soundcard/bark.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/bark.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-bark.Tpo soundcard/$(DEPDIR)/fldigi-bark.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/bark.cxx' object='soundcard/fldigi-bark.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-bark.obj `if test -f 'soundcard/bark.cxx'; then $(CYGPATH_W) 'soundcard/bark.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/bark.cxx'; fi` soundcard/fldigi-checkout.o: soundcard/checkout.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-checkout.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-checkout.Tpo -c -o soundcard/fldigi-checkout.o `test -f 'soundcard/checkout.cxx' || echo '$(srcdir)/'`soundcard/checkout.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-checkout.Tpo soundcard/$(DEPDIR)/fldigi-checkout.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/checkout.cxx' object='soundcard/fldigi-checkout.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-checkout.o `test -f 'soundcard/checkout.cxx' || echo '$(srcdir)/'`soundcard/checkout.cxx soundcard/fldigi-checkout.obj: soundcard/checkout.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-checkout.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-checkout.Tpo -c -o soundcard/fldigi-checkout.obj `if test -f 'soundcard/checkout.cxx'; then $(CYGPATH_W) 'soundcard/checkout.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/checkout.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-checkout.Tpo soundcard/$(DEPDIR)/fldigi-checkout.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/checkout.cxx' object='soundcard/fldigi-checkout.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-checkout.obj `if test -f 'soundcard/checkout.cxx'; then $(CYGPATH_W) 'soundcard/checkout.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/checkout.cxx'; fi` soundcard/fldigi-diesel.o: soundcard/diesel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-diesel.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-diesel.Tpo -c -o soundcard/fldigi-diesel.o `test -f 'soundcard/diesel.cxx' || echo '$(srcdir)/'`soundcard/diesel.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-diesel.Tpo soundcard/$(DEPDIR)/fldigi-diesel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/diesel.cxx' object='soundcard/fldigi-diesel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-diesel.o `test -f 'soundcard/diesel.cxx' || echo '$(srcdir)/'`soundcard/diesel.cxx soundcard/fldigi-diesel.obj: soundcard/diesel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-diesel.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-diesel.Tpo -c -o soundcard/fldigi-diesel.obj `if test -f 'soundcard/diesel.cxx'; then $(CYGPATH_W) 'soundcard/diesel.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/diesel.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-diesel.Tpo soundcard/$(DEPDIR)/fldigi-diesel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/diesel.cxx' object='soundcard/fldigi-diesel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-diesel.obj `if test -f 'soundcard/diesel.cxx'; then $(CYGPATH_W) 'soundcard/diesel.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/diesel.cxx'; fi` soundcard/fldigi-dinnerbell.o: soundcard/dinnerbell.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-dinnerbell.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-dinnerbell.Tpo -c -o soundcard/fldigi-dinnerbell.o `test -f 'soundcard/dinnerbell.cxx' || echo '$(srcdir)/'`soundcard/dinnerbell.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-dinnerbell.Tpo soundcard/$(DEPDIR)/fldigi-dinnerbell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/dinnerbell.cxx' object='soundcard/fldigi-dinnerbell.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-dinnerbell.o `test -f 'soundcard/dinnerbell.cxx' || echo '$(srcdir)/'`soundcard/dinnerbell.cxx soundcard/fldigi-dinnerbell.obj: soundcard/dinnerbell.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-dinnerbell.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-dinnerbell.Tpo -c -o soundcard/fldigi-dinnerbell.obj `if test -f 'soundcard/dinnerbell.cxx'; then $(CYGPATH_W) 'soundcard/dinnerbell.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/dinnerbell.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-dinnerbell.Tpo soundcard/$(DEPDIR)/fldigi-dinnerbell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/dinnerbell.cxx' object='soundcard/fldigi-dinnerbell.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-dinnerbell.obj `if test -f 'soundcard/dinnerbell.cxx'; then $(CYGPATH_W) 'soundcard/dinnerbell.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/dinnerbell.cxx'; fi` soundcard/fldigi-doesnot.o: soundcard/doesnot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-doesnot.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-doesnot.Tpo -c -o soundcard/fldigi-doesnot.o `test -f 'soundcard/doesnot.cxx' || echo '$(srcdir)/'`soundcard/doesnot.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-doesnot.Tpo soundcard/$(DEPDIR)/fldigi-doesnot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/doesnot.cxx' object='soundcard/fldigi-doesnot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-doesnot.o `test -f 'soundcard/doesnot.cxx' || echo '$(srcdir)/'`soundcard/doesnot.cxx soundcard/fldigi-doesnot.obj: soundcard/doesnot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-doesnot.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-doesnot.Tpo -c -o soundcard/fldigi-doesnot.obj `if test -f 'soundcard/doesnot.cxx'; then $(CYGPATH_W) 'soundcard/doesnot.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/doesnot.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-doesnot.Tpo soundcard/$(DEPDIR)/fldigi-doesnot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/doesnot.cxx' object='soundcard/fldigi-doesnot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-doesnot.obj `if test -f 'soundcard/doesnot.cxx'; then $(CYGPATH_W) 'soundcard/doesnot.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/doesnot.cxx'; fi` soundcard/fldigi-play.pa.o: soundcard/play.pa.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-play.pa.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-play.pa.Tpo -c -o soundcard/fldigi-play.pa.o `test -f 'soundcard/play.pa.cxx' || echo '$(srcdir)/'`soundcard/play.pa.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-play.pa.Tpo soundcard/$(DEPDIR)/fldigi-play.pa.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/play.pa.cxx' object='soundcard/fldigi-play.pa.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-play.pa.o `test -f 'soundcard/play.pa.cxx' || echo '$(srcdir)/'`soundcard/play.pa.cxx soundcard/fldigi-play.pa.obj: soundcard/play.pa.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-play.pa.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-play.pa.Tpo -c -o soundcard/fldigi-play.pa.obj `if test -f 'soundcard/play.pa.cxx'; then $(CYGPATH_W) 'soundcard/play.pa.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/play.pa.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-play.pa.Tpo soundcard/$(DEPDIR)/fldigi-play.pa.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/play.pa.cxx' object='soundcard/fldigi-play.pa.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-play.pa.obj `if test -f 'soundcard/play.pa.cxx'; then $(CYGPATH_W) 'soundcard/play.pa.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/play.pa.cxx'; fi` soundcard/fldigi-soundconf.o: soundcard/soundconf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-soundconf.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-soundconf.Tpo -c -o soundcard/fldigi-soundconf.o `test -f 'soundcard/soundconf.cxx' || echo '$(srcdir)/'`soundcard/soundconf.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-soundconf.Tpo soundcard/$(DEPDIR)/fldigi-soundconf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/soundconf.cxx' object='soundcard/fldigi-soundconf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-soundconf.o `test -f 'soundcard/soundconf.cxx' || echo '$(srcdir)/'`soundcard/soundconf.cxx soundcard/fldigi-soundconf.obj: soundcard/soundconf.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-soundconf.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-soundconf.Tpo -c -o soundcard/fldigi-soundconf.obj `if test -f 'soundcard/soundconf.cxx'; then $(CYGPATH_W) 'soundcard/soundconf.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/soundconf.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-soundconf.Tpo soundcard/$(DEPDIR)/fldigi-soundconf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/soundconf.cxx' object='soundcard/fldigi-soundconf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-soundconf.obj `if test -f 'soundcard/soundconf.cxx'; then $(CYGPATH_W) 'soundcard/soundconf.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/soundconf.cxx'; fi` soundcard/fldigi-sound.o: soundcard/sound.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-sound.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-sound.Tpo -c -o soundcard/fldigi-sound.o `test -f 'soundcard/sound.cxx' || echo '$(srcdir)/'`soundcard/sound.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-sound.Tpo soundcard/$(DEPDIR)/fldigi-sound.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/sound.cxx' object='soundcard/fldigi-sound.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-sound.o `test -f 'soundcard/sound.cxx' || echo '$(srcdir)/'`soundcard/sound.cxx soundcard/fldigi-sound.obj: soundcard/sound.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-sound.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-sound.Tpo -c -o soundcard/fldigi-sound.obj `if test -f 'soundcard/sound.cxx'; then $(CYGPATH_W) 'soundcard/sound.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/sound.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-sound.Tpo soundcard/$(DEPDIR)/fldigi-sound.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/sound.cxx' object='soundcard/fldigi-sound.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-sound.obj `if test -f 'soundcard/sound.cxx'; then $(CYGPATH_W) 'soundcard/sound.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/sound.cxx'; fi` soundcard/fldigi-steam_train.o: soundcard/steam_train.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-steam_train.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-steam_train.Tpo -c -o soundcard/fldigi-steam_train.o `test -f 'soundcard/steam_train.cxx' || echo '$(srcdir)/'`soundcard/steam_train.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-steam_train.Tpo soundcard/$(DEPDIR)/fldigi-steam_train.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/steam_train.cxx' object='soundcard/fldigi-steam_train.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-steam_train.o `test -f 'soundcard/steam_train.cxx' || echo '$(srcdir)/'`soundcard/steam_train.cxx soundcard/fldigi-steam_train.obj: soundcard/steam_train.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-steam_train.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-steam_train.Tpo -c -o soundcard/fldigi-steam_train.obj `if test -f 'soundcard/steam_train.cxx'; then $(CYGPATH_W) 'soundcard/steam_train.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/steam_train.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-steam_train.Tpo soundcard/$(DEPDIR)/fldigi-steam_train.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/steam_train.cxx' object='soundcard/fldigi-steam_train.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-steam_train.obj `if test -f 'soundcard/steam_train.cxx'; then $(CYGPATH_W) 'soundcard/steam_train.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/steam_train.cxx'; fi` soundcard/fldigi-ttybell.o: soundcard/ttybell.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-ttybell.o -MD -MP -MF soundcard/$(DEPDIR)/fldigi-ttybell.Tpo -c -o soundcard/fldigi-ttybell.o `test -f 'soundcard/ttybell.cxx' || echo '$(srcdir)/'`soundcard/ttybell.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-ttybell.Tpo soundcard/$(DEPDIR)/fldigi-ttybell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/ttybell.cxx' object='soundcard/fldigi-ttybell.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-ttybell.o `test -f 'soundcard/ttybell.cxx' || echo '$(srcdir)/'`soundcard/ttybell.cxx soundcard/fldigi-ttybell.obj: soundcard/ttybell.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT soundcard/fldigi-ttybell.obj -MD -MP -MF soundcard/$(DEPDIR)/fldigi-ttybell.Tpo -c -o soundcard/fldigi-ttybell.obj `if test -f 'soundcard/ttybell.cxx'; then $(CYGPATH_W) 'soundcard/ttybell.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/ttybell.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) soundcard/$(DEPDIR)/fldigi-ttybell.Tpo soundcard/$(DEPDIR)/fldigi-ttybell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='soundcard/ttybell.cxx' object='soundcard/fldigi-ttybell.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o soundcard/fldigi-ttybell.obj `if test -f 'soundcard/ttybell.cxx'; then $(CYGPATH_W) 'soundcard/ttybell.cxx'; else $(CYGPATH_W) '$(srcdir)/soundcard/ttybell.cxx'; fi` spot/fldigi-notify.o: spot/notify.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-notify.o -MD -MP -MF spot/$(DEPDIR)/fldigi-notify.Tpo -c -o spot/fldigi-notify.o `test -f 'spot/notify.cxx' || echo '$(srcdir)/'`spot/notify.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-notify.Tpo spot/$(DEPDIR)/fldigi-notify.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/notify.cxx' object='spot/fldigi-notify.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-notify.o `test -f 'spot/notify.cxx' || echo '$(srcdir)/'`spot/notify.cxx spot/fldigi-notify.obj: spot/notify.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-notify.obj -MD -MP -MF spot/$(DEPDIR)/fldigi-notify.Tpo -c -o spot/fldigi-notify.obj `if test -f 'spot/notify.cxx'; then $(CYGPATH_W) 'spot/notify.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/notify.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-notify.Tpo spot/$(DEPDIR)/fldigi-notify.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/notify.cxx' object='spot/fldigi-notify.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-notify.obj `if test -f 'spot/notify.cxx'; then $(CYGPATH_W) 'spot/notify.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/notify.cxx'; fi` spot/fldigi-pskrep.o: spot/pskrep.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-pskrep.o -MD -MP -MF spot/$(DEPDIR)/fldigi-pskrep.Tpo -c -o spot/fldigi-pskrep.o `test -f 'spot/pskrep.cxx' || echo '$(srcdir)/'`spot/pskrep.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-pskrep.Tpo spot/$(DEPDIR)/fldigi-pskrep.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/pskrep.cxx' object='spot/fldigi-pskrep.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-pskrep.o `test -f 'spot/pskrep.cxx' || echo '$(srcdir)/'`spot/pskrep.cxx spot/fldigi-pskrep.obj: spot/pskrep.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-pskrep.obj -MD -MP -MF spot/$(DEPDIR)/fldigi-pskrep.Tpo -c -o spot/fldigi-pskrep.obj `if test -f 'spot/pskrep.cxx'; then $(CYGPATH_W) 'spot/pskrep.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/pskrep.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-pskrep.Tpo spot/$(DEPDIR)/fldigi-pskrep.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/pskrep.cxx' object='spot/fldigi-pskrep.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-pskrep.obj `if test -f 'spot/pskrep.cxx'; then $(CYGPATH_W) 'spot/pskrep.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/pskrep.cxx'; fi` spot/fldigi-spot.o: spot/spot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-spot.o -MD -MP -MF spot/$(DEPDIR)/fldigi-spot.Tpo -c -o spot/fldigi-spot.o `test -f 'spot/spot.cxx' || echo '$(srcdir)/'`spot/spot.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-spot.Tpo spot/$(DEPDIR)/fldigi-spot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/spot.cxx' object='spot/fldigi-spot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-spot.o `test -f 'spot/spot.cxx' || echo '$(srcdir)/'`spot/spot.cxx spot/fldigi-spot.obj: spot/spot.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT spot/fldigi-spot.obj -MD -MP -MF spot/$(DEPDIR)/fldigi-spot.Tpo -c -o spot/fldigi-spot.obj `if test -f 'spot/spot.cxx'; then $(CYGPATH_W) 'spot/spot.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/spot.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) spot/$(DEPDIR)/fldigi-spot.Tpo spot/$(DEPDIR)/fldigi-spot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='spot/spot.cxx' object='spot/fldigi-spot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o spot/fldigi-spot.obj `if test -f 'spot/spot.cxx'; then $(CYGPATH_W) 'spot/spot.cxx'; else $(CYGPATH_W) '$(srcdir)/spot/spot.cxx'; fi` ssb/fldigi-ssb.o: ssb/ssb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ssb/fldigi-ssb.o -MD -MP -MF ssb/$(DEPDIR)/fldigi-ssb.Tpo -c -o ssb/fldigi-ssb.o `test -f 'ssb/ssb.cxx' || echo '$(srcdir)/'`ssb/ssb.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ssb/$(DEPDIR)/fldigi-ssb.Tpo ssb/$(DEPDIR)/fldigi-ssb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ssb/ssb.cxx' object='ssb/fldigi-ssb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ssb/fldigi-ssb.o `test -f 'ssb/ssb.cxx' || echo '$(srcdir)/'`ssb/ssb.cxx ssb/fldigi-ssb.obj: ssb/ssb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ssb/fldigi-ssb.obj -MD -MP -MF ssb/$(DEPDIR)/fldigi-ssb.Tpo -c -o ssb/fldigi-ssb.obj `if test -f 'ssb/ssb.cxx'; then $(CYGPATH_W) 'ssb/ssb.cxx'; else $(CYGPATH_W) '$(srcdir)/ssb/ssb.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ssb/$(DEPDIR)/fldigi-ssb.Tpo ssb/$(DEPDIR)/fldigi-ssb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ssb/ssb.cxx' object='ssb/fldigi-ssb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ssb/fldigi-ssb.obj `if test -f 'ssb/ssb.cxx'; then $(CYGPATH_W) 'ssb/ssb.cxx'; else $(CYGPATH_W) '$(srcdir)/ssb/ssb.cxx'; fi` status/fldigi-squelch_status.o: status/squelch_status.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT status/fldigi-squelch_status.o -MD -MP -MF status/$(DEPDIR)/fldigi-squelch_status.Tpo -c -o status/fldigi-squelch_status.o `test -f 'status/squelch_status.cxx' || echo '$(srcdir)/'`status/squelch_status.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) status/$(DEPDIR)/fldigi-squelch_status.Tpo status/$(DEPDIR)/fldigi-squelch_status.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='status/squelch_status.cxx' object='status/fldigi-squelch_status.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o status/fldigi-squelch_status.o `test -f 'status/squelch_status.cxx' || echo '$(srcdir)/'`status/squelch_status.cxx status/fldigi-squelch_status.obj: status/squelch_status.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT status/fldigi-squelch_status.obj -MD -MP -MF status/$(DEPDIR)/fldigi-squelch_status.Tpo -c -o status/fldigi-squelch_status.obj `if test -f 'status/squelch_status.cxx'; then $(CYGPATH_W) 'status/squelch_status.cxx'; else $(CYGPATH_W) '$(srcdir)/status/squelch_status.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) status/$(DEPDIR)/fldigi-squelch_status.Tpo status/$(DEPDIR)/fldigi-squelch_status.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='status/squelch_status.cxx' object='status/fldigi-squelch_status.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o status/fldigi-squelch_status.obj `if test -f 'status/squelch_status.cxx'; then $(CYGPATH_W) 'status/squelch_status.cxx'; else $(CYGPATH_W) '$(srcdir)/status/squelch_status.cxx'; fi` status/fldigi-status.o: status/status.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT status/fldigi-status.o -MD -MP -MF status/$(DEPDIR)/fldigi-status.Tpo -c -o status/fldigi-status.o `test -f 'status/status.cxx' || echo '$(srcdir)/'`status/status.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) status/$(DEPDIR)/fldigi-status.Tpo status/$(DEPDIR)/fldigi-status.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='status/status.cxx' object='status/fldigi-status.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o status/fldigi-status.o `test -f 'status/status.cxx' || echo '$(srcdir)/'`status/status.cxx status/fldigi-status.obj: status/status.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT status/fldigi-status.obj -MD -MP -MF status/$(DEPDIR)/fldigi-status.Tpo -c -o status/fldigi-status.obj `if test -f 'status/status.cxx'; then $(CYGPATH_W) 'status/status.cxx'; else $(CYGPATH_W) '$(srcdir)/status/status.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) status/$(DEPDIR)/fldigi-status.Tpo status/$(DEPDIR)/fldigi-status.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='status/status.cxx' object='status/fldigi-status.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o status/fldigi-status.obj `if test -f 'status/status.cxx'; then $(CYGPATH_W) 'status/status.cxx'; else $(CYGPATH_W) '$(srcdir)/status/status.cxx'; fi` synop-src/fldigi-synop.o: synop-src/synop.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT synop-src/fldigi-synop.o -MD -MP -MF synop-src/$(DEPDIR)/fldigi-synop.Tpo -c -o synop-src/fldigi-synop.o `test -f 'synop-src/synop.cxx' || echo '$(srcdir)/'`synop-src/synop.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) synop-src/$(DEPDIR)/fldigi-synop.Tpo synop-src/$(DEPDIR)/fldigi-synop.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='synop-src/synop.cxx' object='synop-src/fldigi-synop.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o synop-src/fldigi-synop.o `test -f 'synop-src/synop.cxx' || echo '$(srcdir)/'`synop-src/synop.cxx synop-src/fldigi-synop.obj: synop-src/synop.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT synop-src/fldigi-synop.obj -MD -MP -MF synop-src/$(DEPDIR)/fldigi-synop.Tpo -c -o synop-src/fldigi-synop.obj `if test -f 'synop-src/synop.cxx'; then $(CYGPATH_W) 'synop-src/synop.cxx'; else $(CYGPATH_W) '$(srcdir)/synop-src/synop.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) synop-src/$(DEPDIR)/fldigi-synop.Tpo synop-src/$(DEPDIR)/fldigi-synop.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='synop-src/synop.cxx' object='synop-src/fldigi-synop.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o synop-src/fldigi-synop.obj `if test -f 'synop-src/synop.cxx'; then $(CYGPATH_W) 'synop-src/synop.cxx'; else $(CYGPATH_W) '$(srcdir)/synop-src/synop.cxx'; fi` thor/fldigi-thor.o: thor/thor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thor.o -MD -MP -MF thor/$(DEPDIR)/fldigi-thor.Tpo -c -o thor/fldigi-thor.o `test -f 'thor/thor.cxx' || echo '$(srcdir)/'`thor/thor.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thor.Tpo thor/$(DEPDIR)/fldigi-thor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor.cxx' object='thor/fldigi-thor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thor.o `test -f 'thor/thor.cxx' || echo '$(srcdir)/'`thor/thor.cxx thor/fldigi-thor.obj: thor/thor.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thor.obj -MD -MP -MF thor/$(DEPDIR)/fldigi-thor.Tpo -c -o thor/fldigi-thor.obj `if test -f 'thor/thor.cxx'; then $(CYGPATH_W) 'thor/thor.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thor.Tpo thor/$(DEPDIR)/fldigi-thor.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor.cxx' object='thor/fldigi-thor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thor.obj `if test -f 'thor/thor.cxx'; then $(CYGPATH_W) 'thor/thor.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor.cxx'; fi` thor/fldigi-thorvaricode.o: thor/thorvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thorvaricode.o -MD -MP -MF thor/$(DEPDIR)/fldigi-thorvaricode.Tpo -c -o thor/fldigi-thorvaricode.o `test -f 'thor/thorvaricode.cxx' || echo '$(srcdir)/'`thor/thorvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thorvaricode.Tpo thor/$(DEPDIR)/fldigi-thorvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thorvaricode.cxx' object='thor/fldigi-thorvaricode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thorvaricode.o `test -f 'thor/thorvaricode.cxx' || echo '$(srcdir)/'`thor/thorvaricode.cxx thor/fldigi-thorvaricode.obj: thor/thorvaricode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thorvaricode.obj -MD -MP -MF thor/$(DEPDIR)/fldigi-thorvaricode.Tpo -c -o thor/fldigi-thorvaricode.obj `if test -f 'thor/thorvaricode.cxx'; then $(CYGPATH_W) 'thor/thorvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thorvaricode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thorvaricode.Tpo thor/$(DEPDIR)/fldigi-thorvaricode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thorvaricode.cxx' object='thor/fldigi-thorvaricode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thorvaricode.obj `if test -f 'thor/thorvaricode.cxx'; then $(CYGPATH_W) 'thor/thorvaricode.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thorvaricode.cxx'; fi` throb/fldigi-throb.o: throb/throb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT throb/fldigi-throb.o -MD -MP -MF throb/$(DEPDIR)/fldigi-throb.Tpo -c -o throb/fldigi-throb.o `test -f 'throb/throb.cxx' || echo '$(srcdir)/'`throb/throb.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) throb/$(DEPDIR)/fldigi-throb.Tpo throb/$(DEPDIR)/fldigi-throb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='throb/throb.cxx' object='throb/fldigi-throb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o throb/fldigi-throb.o `test -f 'throb/throb.cxx' || echo '$(srcdir)/'`throb/throb.cxx throb/fldigi-throb.obj: throb/throb.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT throb/fldigi-throb.obj -MD -MP -MF throb/$(DEPDIR)/fldigi-throb.Tpo -c -o throb/fldigi-throb.obj `if test -f 'throb/throb.cxx'; then $(CYGPATH_W) 'throb/throb.cxx'; else $(CYGPATH_W) '$(srcdir)/throb/throb.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) throb/$(DEPDIR)/fldigi-throb.Tpo throb/$(DEPDIR)/fldigi-throb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='throb/throb.cxx' object='throb/fldigi-throb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o throb/fldigi-throb.obj `if test -f 'throb/throb.cxx'; then $(CYGPATH_W) 'throb/throb.cxx'; else $(CYGPATH_W) '$(srcdir)/throb/throb.cxx'; fi` trx/fldigi-modem.o: trx/modem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-modem.o -MD -MP -MF trx/$(DEPDIR)/fldigi-modem.Tpo -c -o trx/fldigi-modem.o `test -f 'trx/modem.cxx' || echo '$(srcdir)/'`trx/modem.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-modem.Tpo trx/$(DEPDIR)/fldigi-modem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/modem.cxx' object='trx/fldigi-modem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-modem.o `test -f 'trx/modem.cxx' || echo '$(srcdir)/'`trx/modem.cxx trx/fldigi-modem.obj: trx/modem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-modem.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-modem.Tpo -c -o trx/fldigi-modem.obj `if test -f 'trx/modem.cxx'; then $(CYGPATH_W) 'trx/modem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/modem.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-modem.Tpo trx/$(DEPDIR)/fldigi-modem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/modem.cxx' object='trx/fldigi-modem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-modem.obj `if test -f 'trx/modem.cxx'; then $(CYGPATH_W) 'trx/modem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/modem.cxx'; fi` trx/fldigi-nullmodem.o: trx/nullmodem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-nullmodem.o -MD -MP -MF trx/$(DEPDIR)/fldigi-nullmodem.Tpo -c -o trx/fldigi-nullmodem.o `test -f 'trx/nullmodem.cxx' || echo '$(srcdir)/'`trx/nullmodem.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-nullmodem.Tpo trx/$(DEPDIR)/fldigi-nullmodem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/nullmodem.cxx' object='trx/fldigi-nullmodem.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-nullmodem.o `test -f 'trx/nullmodem.cxx' || echo '$(srcdir)/'`trx/nullmodem.cxx trx/fldigi-nullmodem.obj: trx/nullmodem.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-nullmodem.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-nullmodem.Tpo -c -o trx/fldigi-nullmodem.obj `if test -f 'trx/nullmodem.cxx'; then $(CYGPATH_W) 'trx/nullmodem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/nullmodem.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-nullmodem.Tpo trx/$(DEPDIR)/fldigi-nullmodem.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/nullmodem.cxx' object='trx/fldigi-nullmodem.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-nullmodem.obj `if test -f 'trx/nullmodem.cxx'; then $(CYGPATH_W) 'trx/nullmodem.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/nullmodem.cxx'; fi` trx/fldigi-test_signal.o: trx/test_signal.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-test_signal.o -MD -MP -MF trx/$(DEPDIR)/fldigi-test_signal.Tpo -c -o trx/fldigi-test_signal.o `test -f 'trx/test_signal.cxx' || echo '$(srcdir)/'`trx/test_signal.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-test_signal.Tpo trx/$(DEPDIR)/fldigi-test_signal.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/test_signal.cxx' object='trx/fldigi-test_signal.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-test_signal.o `test -f 'trx/test_signal.cxx' || echo '$(srcdir)/'`trx/test_signal.cxx trx/fldigi-test_signal.obj: trx/test_signal.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-test_signal.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-test_signal.Tpo -c -o trx/fldigi-test_signal.obj `if test -f 'trx/test_signal.cxx'; then $(CYGPATH_W) 'trx/test_signal.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/test_signal.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-test_signal.Tpo trx/$(DEPDIR)/fldigi-test_signal.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/test_signal.cxx' object='trx/fldigi-test_signal.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-test_signal.obj `if test -f 'trx/test_signal.cxx'; then $(CYGPATH_W) 'trx/test_signal.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/test_signal.cxx'; fi` trx/fldigi-trx.o: trx/trx.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-trx.o -MD -MP -MF trx/$(DEPDIR)/fldigi-trx.Tpo -c -o trx/fldigi-trx.o `test -f 'trx/trx.cxx' || echo '$(srcdir)/'`trx/trx.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-trx.Tpo trx/$(DEPDIR)/fldigi-trx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/trx.cxx' object='trx/fldigi-trx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-trx.o `test -f 'trx/trx.cxx' || echo '$(srcdir)/'`trx/trx.cxx trx/fldigi-trx.obj: trx/trx.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-trx.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-trx.Tpo -c -o trx/fldigi-trx.obj `if test -f 'trx/trx.cxx'; then $(CYGPATH_W) 'trx/trx.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/trx.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-trx.Tpo trx/$(DEPDIR)/fldigi-trx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/trx.cxx' object='trx/fldigi-trx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-trx.obj `if test -f 'trx/trx.cxx'; then $(CYGPATH_W) 'trx/trx.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/trx.cxx'; fi` waterfall/fldigi-colorbox.o: waterfall/colorbox.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-colorbox.o -MD -MP -MF waterfall/$(DEPDIR)/fldigi-colorbox.Tpo -c -o waterfall/fldigi-colorbox.o `test -f 'waterfall/colorbox.cxx' || echo '$(srcdir)/'`waterfall/colorbox.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-colorbox.Tpo waterfall/$(DEPDIR)/fldigi-colorbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/colorbox.cxx' object='waterfall/fldigi-colorbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-colorbox.o `test -f 'waterfall/colorbox.cxx' || echo '$(srcdir)/'`waterfall/colorbox.cxx waterfall/fldigi-colorbox.obj: waterfall/colorbox.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-colorbox.obj -MD -MP -MF waterfall/$(DEPDIR)/fldigi-colorbox.Tpo -c -o waterfall/fldigi-colorbox.obj `if test -f 'waterfall/colorbox.cxx'; then $(CYGPATH_W) 'waterfall/colorbox.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/colorbox.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-colorbox.Tpo waterfall/$(DEPDIR)/fldigi-colorbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/colorbox.cxx' object='waterfall/fldigi-colorbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-colorbox.obj `if test -f 'waterfall/colorbox.cxx'; then $(CYGPATH_W) 'waterfall/colorbox.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/colorbox.cxx'; fi` waterfall/fldigi-digiscope.o: waterfall/digiscope.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-digiscope.o -MD -MP -MF waterfall/$(DEPDIR)/fldigi-digiscope.Tpo -c -o waterfall/fldigi-digiscope.o `test -f 'waterfall/digiscope.cxx' || echo '$(srcdir)/'`waterfall/digiscope.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-digiscope.Tpo waterfall/$(DEPDIR)/fldigi-digiscope.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/digiscope.cxx' object='waterfall/fldigi-digiscope.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-digiscope.o `test -f 'waterfall/digiscope.cxx' || echo '$(srcdir)/'`waterfall/digiscope.cxx waterfall/fldigi-digiscope.obj: waterfall/digiscope.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-digiscope.obj -MD -MP -MF waterfall/$(DEPDIR)/fldigi-digiscope.Tpo -c -o waterfall/fldigi-digiscope.obj `if test -f 'waterfall/digiscope.cxx'; then $(CYGPATH_W) 'waterfall/digiscope.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/digiscope.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-digiscope.Tpo waterfall/$(DEPDIR)/fldigi-digiscope.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/digiscope.cxx' object='waterfall/fldigi-digiscope.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-digiscope.obj `if test -f 'waterfall/digiscope.cxx'; then $(CYGPATH_W) 'waterfall/digiscope.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/digiscope.cxx'; fi` waterfall/fldigi-raster.o: waterfall/raster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-raster.o -MD -MP -MF waterfall/$(DEPDIR)/fldigi-raster.Tpo -c -o waterfall/fldigi-raster.o `test -f 'waterfall/raster.cxx' || echo '$(srcdir)/'`waterfall/raster.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-raster.Tpo waterfall/$(DEPDIR)/fldigi-raster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/raster.cxx' object='waterfall/fldigi-raster.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-raster.o `test -f 'waterfall/raster.cxx' || echo '$(srcdir)/'`waterfall/raster.cxx waterfall/fldigi-raster.obj: waterfall/raster.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-raster.obj -MD -MP -MF waterfall/$(DEPDIR)/fldigi-raster.Tpo -c -o waterfall/fldigi-raster.obj `if test -f 'waterfall/raster.cxx'; then $(CYGPATH_W) 'waterfall/raster.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/raster.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-raster.Tpo waterfall/$(DEPDIR)/fldigi-raster.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/raster.cxx' object='waterfall/fldigi-raster.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-raster.obj `if test -f 'waterfall/raster.cxx'; then $(CYGPATH_W) 'waterfall/raster.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/raster.cxx'; fi` waterfall/fldigi-waterfall.o: waterfall/waterfall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-waterfall.o -MD -MP -MF waterfall/$(DEPDIR)/fldigi-waterfall.Tpo -c -o waterfall/fldigi-waterfall.o `test -f 'waterfall/waterfall.cxx' || echo '$(srcdir)/'`waterfall/waterfall.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-waterfall.Tpo waterfall/$(DEPDIR)/fldigi-waterfall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/waterfall.cxx' object='waterfall/fldigi-waterfall.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-waterfall.o `test -f 'waterfall/waterfall.cxx' || echo '$(srcdir)/'`waterfall/waterfall.cxx waterfall/fldigi-waterfall.obj: waterfall/waterfall.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT waterfall/fldigi-waterfall.obj -MD -MP -MF waterfall/$(DEPDIR)/fldigi-waterfall.Tpo -c -o waterfall/fldigi-waterfall.obj `if test -f 'waterfall/waterfall.cxx'; then $(CYGPATH_W) 'waterfall/waterfall.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/waterfall.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) waterfall/$(DEPDIR)/fldigi-waterfall.Tpo waterfall/$(DEPDIR)/fldigi-waterfall.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='waterfall/waterfall.cxx' object='waterfall/fldigi-waterfall.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o waterfall/fldigi-waterfall.obj `if test -f 'waterfall/waterfall.cxx'; then $(CYGPATH_W) 'waterfall/waterfall.cxx'; else $(CYGPATH_W) '$(srcdir)/waterfall/waterfall.cxx'; fi` wefax/fldigi-wefax.o: wefax/wefax.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax.o -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax.Tpo -c -o wefax/fldigi-wefax.o `test -f 'wefax/wefax.cxx' || echo '$(srcdir)/'`wefax/wefax.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax.Tpo wefax/$(DEPDIR)/fldigi-wefax.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax.cxx' object='wefax/fldigi-wefax.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax.o `test -f 'wefax/wefax.cxx' || echo '$(srcdir)/'`wefax/wefax.cxx wefax/fldigi-wefax.obj: wefax/wefax.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax.obj -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax.Tpo -c -o wefax/fldigi-wefax.obj `if test -f 'wefax/wefax.cxx'; then $(CYGPATH_W) 'wefax/wefax.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax.Tpo wefax/$(DEPDIR)/fldigi-wefax.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax.cxx' object='wefax/fldigi-wefax.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax.obj `if test -f 'wefax/wefax.cxx'; then $(CYGPATH_W) 'wefax/wefax.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax.cxx'; fi` wefax/fldigi-wefax_map.o: wefax/wefax_map.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax_map.o -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax_map.Tpo -c -o wefax/fldigi-wefax_map.o `test -f 'wefax/wefax_map.cxx' || echo '$(srcdir)/'`wefax/wefax_map.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax_map.Tpo wefax/$(DEPDIR)/fldigi-wefax_map.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax_map.cxx' object='wefax/fldigi-wefax_map.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax_map.o `test -f 'wefax/wefax_map.cxx' || echo '$(srcdir)/'`wefax/wefax_map.cxx wefax/fldigi-wefax_map.obj: wefax/wefax_map.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax_map.obj -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax_map.Tpo -c -o wefax/fldigi-wefax_map.obj `if test -f 'wefax/wefax_map.cxx'; then $(CYGPATH_W) 'wefax/wefax_map.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax_map.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax_map.Tpo wefax/$(DEPDIR)/fldigi-wefax_map.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax_map.cxx' object='wefax/fldigi-wefax_map.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax_map.obj `if test -f 'wefax/wefax_map.cxx'; then $(CYGPATH_W) 'wefax/wefax_map.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax_map.cxx'; fi` wefax/fldigi-wefax-pic.o: wefax/wefax-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax-pic.o -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax-pic.Tpo -c -o wefax/fldigi-wefax-pic.o `test -f 'wefax/wefax-pic.cxx' || echo '$(srcdir)/'`wefax/wefax-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax-pic.Tpo wefax/$(DEPDIR)/fldigi-wefax-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax-pic.cxx' object='wefax/fldigi-wefax-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax-pic.o `test -f 'wefax/wefax-pic.cxx' || echo '$(srcdir)/'`wefax/wefax-pic.cxx wefax/fldigi-wefax-pic.obj: wefax/wefax-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wefax/fldigi-wefax-pic.obj -MD -MP -MF wefax/$(DEPDIR)/fldigi-wefax-pic.Tpo -c -o wefax/fldigi-wefax-pic.obj `if test -f 'wefax/wefax-pic.cxx'; then $(CYGPATH_W) 'wefax/wefax-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wefax/$(DEPDIR)/fldigi-wefax-pic.Tpo wefax/$(DEPDIR)/fldigi-wefax-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wefax/wefax-pic.cxx' object='wefax/fldigi-wefax-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wefax/fldigi-wefax-pic.obj `if test -f 'wefax/wefax-pic.cxx'; then $(CYGPATH_W) 'wefax/wefax-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/wefax/wefax-pic.cxx'; fi` widgets/fldigi-flinput2.o: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flinput2.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-flinput2.Tpo -c -o widgets/fldigi-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flinput2.Tpo widgets/$(DEPDIR)/fldigi-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='widgets/fldigi-flinput2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flinput2.o `test -f 'widgets/flinput2.cxx' || echo '$(srcdir)/'`widgets/flinput2.cxx widgets/fldigi-flinput2.obj: widgets/flinput2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flinput2.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-flinput2.Tpo -c -o widgets/fldigi-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flinput2.Tpo widgets/$(DEPDIR)/fldigi-flinput2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flinput2.cxx' object='widgets/fldigi-flinput2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flinput2.obj `if test -f 'widgets/flinput2.cxx'; then $(CYGPATH_W) 'widgets/flinput2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flinput2.cxx'; fi` widgets/fldigi-flmisc.o: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flmisc.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-flmisc.Tpo -c -o widgets/fldigi-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flmisc.Tpo widgets/$(DEPDIR)/fldigi-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='widgets/fldigi-flmisc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flmisc.o `test -f 'widgets/flmisc.cxx' || echo '$(srcdir)/'`widgets/flmisc.cxx widgets/fldigi-flmisc.obj: widgets/flmisc.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flmisc.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-flmisc.Tpo -c -o widgets/fldigi-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flmisc.Tpo widgets/$(DEPDIR)/fldigi-flmisc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flmisc.cxx' object='widgets/fldigi-flmisc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flmisc.obj `if test -f 'widgets/flmisc.cxx'; then $(CYGPATH_W) 'widgets/flmisc.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flmisc.cxx'; fi` widgets/fldigi-flslider2.o: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flslider2.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-flslider2.Tpo -c -o widgets/fldigi-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flslider2.Tpo widgets/$(DEPDIR)/fldigi-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='widgets/fldigi-flslider2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flslider2.o `test -f 'widgets/flslider2.cxx' || echo '$(srcdir)/'`widgets/flslider2.cxx widgets/fldigi-flslider2.obj: widgets/flslider2.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-flslider2.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-flslider2.Tpo -c -o widgets/fldigi-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-flslider2.Tpo widgets/$(DEPDIR)/fldigi-flslider2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/flslider2.cxx' object='widgets/fldigi-flslider2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-flslider2.obj `if test -f 'widgets/flslider2.cxx'; then $(CYGPATH_W) 'widgets/flslider2.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/flslider2.cxx'; fi` widgets/fldigi-Fl_Text_Buffer_mod.o: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Buffer_mod.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo -c -o widgets/fldigi-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='widgets/fldigi-Fl_Text_Buffer_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Buffer_mod.o `test -f 'widgets/Fl_Text_Buffer_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Buffer_mod.cxx widgets/fldigi-Fl_Text_Buffer_mod.obj: widgets/Fl_Text_Buffer_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Buffer_mod.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo -c -o widgets/fldigi-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Buffer_mod.cxx' object='widgets/fldigi-Fl_Text_Buffer_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Buffer_mod.obj `if test -f 'widgets/Fl_Text_Buffer_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Buffer_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Buffer_mod.cxx'; fi` widgets/fldigi-Fl_Text_Display_mod.o: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Display_mod.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo -c -o widgets/fldigi-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='widgets/fldigi-Fl_Text_Display_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Display_mod.o `test -f 'widgets/Fl_Text_Display_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Display_mod.cxx widgets/fldigi-Fl_Text_Display_mod.obj: widgets/Fl_Text_Display_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Display_mod.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo -c -o widgets/fldigi-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Display_mod.cxx' object='widgets/fldigi-Fl_Text_Display_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Display_mod.obj `if test -f 'widgets/Fl_Text_Display_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Display_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Display_mod.cxx'; fi` widgets/fldigi-Fl_Text_Editor_mod.o: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Editor_mod.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo -c -o widgets/fldigi-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='widgets/fldigi-Fl_Text_Editor_mod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Editor_mod.o `test -f 'widgets/Fl_Text_Editor_mod.cxx' || echo '$(srcdir)/'`widgets/Fl_Text_Editor_mod.cxx widgets/fldigi-Fl_Text_Editor_mod.obj: widgets/Fl_Text_Editor_mod.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Fl_Text_Editor_mod.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo -c -o widgets/fldigi-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Tpo widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Fl_Text_Editor_mod.cxx' object='widgets/fldigi-Fl_Text_Editor_mod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Fl_Text_Editor_mod.obj `if test -f 'widgets/Fl_Text_Editor_mod.cxx'; then $(CYGPATH_W) 'widgets/Fl_Text_Editor_mod.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Fl_Text_Editor_mod.cxx'; fi` widgets/fldigi-FTextRXTX.o: widgets/FTextRXTX.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-FTextRXTX.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-FTextRXTX.Tpo -c -o widgets/fldigi-FTextRXTX.o `test -f 'widgets/FTextRXTX.cxx' || echo '$(srcdir)/'`widgets/FTextRXTX.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-FTextRXTX.Tpo widgets/$(DEPDIR)/fldigi-FTextRXTX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextRXTX.cxx' object='widgets/fldigi-FTextRXTX.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-FTextRXTX.o `test -f 'widgets/FTextRXTX.cxx' || echo '$(srcdir)/'`widgets/FTextRXTX.cxx widgets/fldigi-FTextRXTX.obj: widgets/FTextRXTX.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-FTextRXTX.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-FTextRXTX.Tpo -c -o widgets/fldigi-FTextRXTX.obj `if test -f 'widgets/FTextRXTX.cxx'; then $(CYGPATH_W) 'widgets/FTextRXTX.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextRXTX.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-FTextRXTX.Tpo widgets/$(DEPDIR)/fldigi-FTextRXTX.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextRXTX.cxx' object='widgets/fldigi-FTextRXTX.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-FTextRXTX.obj `if test -f 'widgets/FTextRXTX.cxx'; then $(CYGPATH_W) 'widgets/FTextRXTX.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextRXTX.cxx'; fi` widgets/fldigi-FTextView.o: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-FTextView.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-FTextView.Tpo -c -o widgets/fldigi-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-FTextView.Tpo widgets/$(DEPDIR)/fldigi-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='widgets/fldigi-FTextView.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-FTextView.o `test -f 'widgets/FTextView.cxx' || echo '$(srcdir)/'`widgets/FTextView.cxx widgets/fldigi-FTextView.obj: widgets/FTextView.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-FTextView.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-FTextView.Tpo -c -o widgets/fldigi-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-FTextView.Tpo widgets/$(DEPDIR)/fldigi-FTextView.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/FTextView.cxx' object='widgets/fldigi-FTextView.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-FTextView.obj `if test -f 'widgets/FTextView.cxx'; then $(CYGPATH_W) 'widgets/FTextView.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/FTextView.cxx'; fi` widgets/fldigi-Panel.o: widgets/Panel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Panel.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-Panel.Tpo -c -o widgets/fldigi-Panel.o `test -f 'widgets/Panel.cxx' || echo '$(srcdir)/'`widgets/Panel.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Panel.Tpo widgets/$(DEPDIR)/fldigi-Panel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Panel.cxx' object='widgets/fldigi-Panel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Panel.o `test -f 'widgets/Panel.cxx' || echo '$(srcdir)/'`widgets/Panel.cxx widgets/fldigi-Panel.obj: widgets/Panel.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-Panel.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-Panel.Tpo -c -o widgets/fldigi-Panel.obj `if test -f 'widgets/Panel.cxx'; then $(CYGPATH_W) 'widgets/Panel.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Panel.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-Panel.Tpo widgets/$(DEPDIR)/fldigi-Panel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/Panel.cxx' object='widgets/fldigi-Panel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-Panel.obj `if test -f 'widgets/Panel.cxx'; then $(CYGPATH_W) 'widgets/Panel.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/Panel.cxx'; fi` widgets/fldigi-picture.o: widgets/picture.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-picture.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-picture.Tpo -c -o widgets/fldigi-picture.o `test -f 'widgets/picture.cxx' || echo '$(srcdir)/'`widgets/picture.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-picture.Tpo widgets/$(DEPDIR)/fldigi-picture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/picture.cxx' object='widgets/fldigi-picture.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-picture.o `test -f 'widgets/picture.cxx' || echo '$(srcdir)/'`widgets/picture.cxx widgets/fldigi-picture.obj: widgets/picture.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-picture.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-picture.Tpo -c -o widgets/fldigi-picture.obj `if test -f 'widgets/picture.cxx'; then $(CYGPATH_W) 'widgets/picture.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/picture.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-picture.Tpo widgets/$(DEPDIR)/fldigi-picture.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/picture.cxx' object='widgets/fldigi-picture.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-picture.obj `if test -f 'widgets/picture.cxx'; then $(CYGPATH_W) 'widgets/picture.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/picture.cxx'; fi` widgets/fldigi-plot_xy.o: widgets/plot_xy.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-plot_xy.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-plot_xy.Tpo -c -o widgets/fldigi-plot_xy.o `test -f 'widgets/plot_xy.cxx' || echo '$(srcdir)/'`widgets/plot_xy.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-plot_xy.Tpo widgets/$(DEPDIR)/fldigi-plot_xy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/plot_xy.cxx' object='widgets/fldigi-plot_xy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-plot_xy.o `test -f 'widgets/plot_xy.cxx' || echo '$(srcdir)/'`widgets/plot_xy.cxx widgets/fldigi-plot_xy.obj: widgets/plot_xy.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-plot_xy.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-plot_xy.Tpo -c -o widgets/fldigi-plot_xy.obj `if test -f 'widgets/plot_xy.cxx'; then $(CYGPATH_W) 'widgets/plot_xy.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/plot_xy.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-plot_xy.Tpo widgets/$(DEPDIR)/fldigi-plot_xy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/plot_xy.cxx' object='widgets/fldigi-plot_xy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-plot_xy.obj `if test -f 'widgets/plot_xy.cxx'; then $(CYGPATH_W) 'widgets/plot_xy.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/plot_xy.cxx'; fi` widgets/fldigi-progress.o: widgets/progress.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-progress.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-progress.Tpo -c -o widgets/fldigi-progress.o `test -f 'widgets/progress.cxx' || echo '$(srcdir)/'`widgets/progress.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-progress.Tpo widgets/$(DEPDIR)/fldigi-progress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/progress.cxx' object='widgets/fldigi-progress.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-progress.o `test -f 'widgets/progress.cxx' || echo '$(srcdir)/'`widgets/progress.cxx widgets/fldigi-progress.obj: widgets/progress.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-progress.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-progress.Tpo -c -o widgets/fldigi-progress.obj `if test -f 'widgets/progress.cxx'; then $(CYGPATH_W) 'widgets/progress.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/progress.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-progress.Tpo widgets/$(DEPDIR)/fldigi-progress.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/progress.cxx' object='widgets/fldigi-progress.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-progress.obj `if test -f 'widgets/progress.cxx'; then $(CYGPATH_W) 'widgets/progress.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/progress.cxx'; fi` widgets/fldigi-psk_browser.o: widgets/psk_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-psk_browser.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-psk_browser.Tpo -c -o widgets/fldigi-psk_browser.o `test -f 'widgets/psk_browser.cxx' || echo '$(srcdir)/'`widgets/psk_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-psk_browser.Tpo widgets/$(DEPDIR)/fldigi-psk_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/psk_browser.cxx' object='widgets/fldigi-psk_browser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-psk_browser.o `test -f 'widgets/psk_browser.cxx' || echo '$(srcdir)/'`widgets/psk_browser.cxx widgets/fldigi-psk_browser.obj: widgets/psk_browser.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-psk_browser.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-psk_browser.Tpo -c -o widgets/fldigi-psk_browser.obj `if test -f 'widgets/psk_browser.cxx'; then $(CYGPATH_W) 'widgets/psk_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/psk_browser.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-psk_browser.Tpo widgets/$(DEPDIR)/fldigi-psk_browser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/psk_browser.cxx' object='widgets/fldigi-psk_browser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-psk_browser.obj `if test -f 'widgets/psk_browser.cxx'; then $(CYGPATH_W) 'widgets/psk_browser.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/psk_browser.cxx'; fi` widgets/fldigi-pwrmeter.o: widgets/pwrmeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-pwrmeter.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-pwrmeter.Tpo -c -o widgets/fldigi-pwrmeter.o `test -f 'widgets/pwrmeter.cxx' || echo '$(srcdir)/'`widgets/pwrmeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-pwrmeter.Tpo widgets/$(DEPDIR)/fldigi-pwrmeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/pwrmeter.cxx' object='widgets/fldigi-pwrmeter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-pwrmeter.o `test -f 'widgets/pwrmeter.cxx' || echo '$(srcdir)/'`widgets/pwrmeter.cxx widgets/fldigi-pwrmeter.obj: widgets/pwrmeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-pwrmeter.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-pwrmeter.Tpo -c -o widgets/fldigi-pwrmeter.obj `if test -f 'widgets/pwrmeter.cxx'; then $(CYGPATH_W) 'widgets/pwrmeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/pwrmeter.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-pwrmeter.Tpo widgets/$(DEPDIR)/fldigi-pwrmeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/pwrmeter.cxx' object='widgets/fldigi-pwrmeter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-pwrmeter.obj `if test -f 'widgets/pwrmeter.cxx'; then $(CYGPATH_W) 'widgets/pwrmeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/pwrmeter.cxx'; fi` widgets/fldigi-smeter.o: widgets/smeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-smeter.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-smeter.Tpo -c -o widgets/fldigi-smeter.o `test -f 'widgets/smeter.cxx' || echo '$(srcdir)/'`widgets/smeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-smeter.Tpo widgets/$(DEPDIR)/fldigi-smeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/smeter.cxx' object='widgets/fldigi-smeter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-smeter.o `test -f 'widgets/smeter.cxx' || echo '$(srcdir)/'`widgets/smeter.cxx widgets/fldigi-smeter.obj: widgets/smeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-smeter.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-smeter.Tpo -c -o widgets/fldigi-smeter.obj `if test -f 'widgets/smeter.cxx'; then $(CYGPATH_W) 'widgets/smeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/smeter.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-smeter.Tpo widgets/$(DEPDIR)/fldigi-smeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/smeter.cxx' object='widgets/fldigi-smeter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-smeter.obj `if test -f 'widgets/smeter.cxx'; then $(CYGPATH_W) 'widgets/smeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/smeter.cxx'; fi` widgets/fldigi-vumeter.o: widgets/vumeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-vumeter.o -MD -MP -MF widgets/$(DEPDIR)/fldigi-vumeter.Tpo -c -o widgets/fldigi-vumeter.o `test -f 'widgets/vumeter.cxx' || echo '$(srcdir)/'`widgets/vumeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-vumeter.Tpo widgets/$(DEPDIR)/fldigi-vumeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/vumeter.cxx' object='widgets/fldigi-vumeter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-vumeter.o `test -f 'widgets/vumeter.cxx' || echo '$(srcdir)/'`widgets/vumeter.cxx widgets/fldigi-vumeter.obj: widgets/vumeter.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT widgets/fldigi-vumeter.obj -MD -MP -MF widgets/$(DEPDIR)/fldigi-vumeter.Tpo -c -o widgets/fldigi-vumeter.obj `if test -f 'widgets/vumeter.cxx'; then $(CYGPATH_W) 'widgets/vumeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/vumeter.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) widgets/$(DEPDIR)/fldigi-vumeter.Tpo widgets/$(DEPDIR)/fldigi-vumeter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='widgets/vumeter.cxx' object='widgets/fldigi-vumeter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o widgets/fldigi-vumeter.obj `if test -f 'widgets/vumeter.cxx'; then $(CYGPATH_W) 'widgets/vumeter.cxx'; else $(CYGPATH_W) '$(srcdir)/widgets/vumeter.cxx'; fi` wwv/fldigi-analysis.o: wwv/analysis.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wwv/fldigi-analysis.o -MD -MP -MF wwv/$(DEPDIR)/fldigi-analysis.Tpo -c -o wwv/fldigi-analysis.o `test -f 'wwv/analysis.cxx' || echo '$(srcdir)/'`wwv/analysis.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wwv/$(DEPDIR)/fldigi-analysis.Tpo wwv/$(DEPDIR)/fldigi-analysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/analysis.cxx' object='wwv/fldigi-analysis.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wwv/fldigi-analysis.o `test -f 'wwv/analysis.cxx' || echo '$(srcdir)/'`wwv/analysis.cxx wwv/fldigi-analysis.obj: wwv/analysis.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wwv/fldigi-analysis.obj -MD -MP -MF wwv/$(DEPDIR)/fldigi-analysis.Tpo -c -o wwv/fldigi-analysis.obj `if test -f 'wwv/analysis.cxx'; then $(CYGPATH_W) 'wwv/analysis.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/analysis.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wwv/$(DEPDIR)/fldigi-analysis.Tpo wwv/$(DEPDIR)/fldigi-analysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/analysis.cxx' object='wwv/fldigi-analysis.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wwv/fldigi-analysis.obj `if test -f 'wwv/analysis.cxx'; then $(CYGPATH_W) 'wwv/analysis.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/analysis.cxx'; fi` wwv/fldigi-wwv.o: wwv/wwv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wwv/fldigi-wwv.o -MD -MP -MF wwv/$(DEPDIR)/fldigi-wwv.Tpo -c -o wwv/fldigi-wwv.o `test -f 'wwv/wwv.cxx' || echo '$(srcdir)/'`wwv/wwv.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wwv/$(DEPDIR)/fldigi-wwv.Tpo wwv/$(DEPDIR)/fldigi-wwv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/wwv.cxx' object='wwv/fldigi-wwv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wwv/fldigi-wwv.o `test -f 'wwv/wwv.cxx' || echo '$(srcdir)/'`wwv/wwv.cxx wwv/fldigi-wwv.obj: wwv/wwv.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT wwv/fldigi-wwv.obj -MD -MP -MF wwv/$(DEPDIR)/fldigi-wwv.Tpo -c -o wwv/fldigi-wwv.obj `if test -f 'wwv/wwv.cxx'; then $(CYGPATH_W) 'wwv/wwv.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/wwv.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wwv/$(DEPDIR)/fldigi-wwv.Tpo wwv/$(DEPDIR)/fldigi-wwv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wwv/wwv.cxx' object='wwv/fldigi-wwv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o wwv/fldigi-wwv.obj `if test -f 'wwv/wwv.cxx'; then $(CYGPATH_W) 'wwv/wwv.cxx'; else $(CYGPATH_W) '$(srcdir)/wwv/wwv.cxx'; fi` blank/fldigi-blank.o: blank/blank.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT blank/fldigi-blank.o -MD -MP -MF blank/$(DEPDIR)/fldigi-blank.Tpo -c -o blank/fldigi-blank.o `test -f 'blank/blank.cxx' || echo '$(srcdir)/'`blank/blank.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) blank/$(DEPDIR)/fldigi-blank.Tpo blank/$(DEPDIR)/fldigi-blank.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='blank/blank.cxx' object='blank/fldigi-blank.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o blank/fldigi-blank.o `test -f 'blank/blank.cxx' || echo '$(srcdir)/'`blank/blank.cxx blank/fldigi-blank.obj: blank/blank.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT blank/fldigi-blank.obj -MD -MP -MF blank/$(DEPDIR)/fldigi-blank.Tpo -c -o blank/fldigi-blank.obj `if test -f 'blank/blank.cxx'; then $(CYGPATH_W) 'blank/blank.cxx'; else $(CYGPATH_W) '$(srcdir)/blank/blank.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) blank/$(DEPDIR)/fldigi-blank.Tpo blank/$(DEPDIR)/fldigi-blank.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='blank/blank.cxx' object='blank/fldigi-blank.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o blank/fldigi-blank.obj `if test -f 'blank/blank.cxx'; then $(CYGPATH_W) 'blank/blank.cxx'; else $(CYGPATH_W) '$(srcdir)/blank/blank.cxx'; fi` cmedia/fldigi-hid_lin.o: cmedia/hid_lin.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-hid_lin.o -MD -MP -MF cmedia/$(DEPDIR)/fldigi-hid_lin.Tpo -c -o cmedia/fldigi-hid_lin.o `test -f 'cmedia/hid_lin.cxx' || echo '$(srcdir)/'`cmedia/hid_lin.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-hid_lin.Tpo cmedia/$(DEPDIR)/fldigi-hid_lin.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/hid_lin.cxx' object='cmedia/fldigi-hid_lin.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-hid_lin.o `test -f 'cmedia/hid_lin.cxx' || echo '$(srcdir)/'`cmedia/hid_lin.cxx cmedia/fldigi-hid_lin.obj: cmedia/hid_lin.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-hid_lin.obj -MD -MP -MF cmedia/$(DEPDIR)/fldigi-hid_lin.Tpo -c -o cmedia/fldigi-hid_lin.obj `if test -f 'cmedia/hid_lin.cxx'; then $(CYGPATH_W) 'cmedia/hid_lin.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/hid_lin.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-hid_lin.Tpo cmedia/$(DEPDIR)/fldigi-hid_lin.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/hid_lin.cxx' object='cmedia/fldigi-hid_lin.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-hid_lin.obj `if test -f 'cmedia/hid_lin.cxx'; then $(CYGPATH_W) 'cmedia/hid_lin.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/hid_lin.cxx'; fi` cmedia/fldigi-hid_mac.o: cmedia/hid_mac.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-hid_mac.o -MD -MP -MF cmedia/$(DEPDIR)/fldigi-hid_mac.Tpo -c -o cmedia/fldigi-hid_mac.o `test -f 'cmedia/hid_mac.cxx' || echo '$(srcdir)/'`cmedia/hid_mac.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-hid_mac.Tpo cmedia/$(DEPDIR)/fldigi-hid_mac.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/hid_mac.cxx' object='cmedia/fldigi-hid_mac.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-hid_mac.o `test -f 'cmedia/hid_mac.cxx' || echo '$(srcdir)/'`cmedia/hid_mac.cxx cmedia/fldigi-hid_mac.obj: cmedia/hid_mac.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-hid_mac.obj -MD -MP -MF cmedia/$(DEPDIR)/fldigi-hid_mac.Tpo -c -o cmedia/fldigi-hid_mac.obj `if test -f 'cmedia/hid_mac.cxx'; then $(CYGPATH_W) 'cmedia/hid_mac.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/hid_mac.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-hid_mac.Tpo cmedia/$(DEPDIR)/fldigi-hid_mac.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/hid_mac.cxx' object='cmedia/fldigi-hid_mac.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-hid_mac.obj `if test -f 'cmedia/hid_mac.cxx'; then $(CYGPATH_W) 'cmedia/hid_mac.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/hid_mac.cxx'; fi` cmedia/fldigi-hid_win.o: cmedia/hid_win.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-hid_win.o -MD -MP -MF cmedia/$(DEPDIR)/fldigi-hid_win.Tpo -c -o cmedia/fldigi-hid_win.o `test -f 'cmedia/hid_win.cxx' || echo '$(srcdir)/'`cmedia/hid_win.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-hid_win.Tpo cmedia/$(DEPDIR)/fldigi-hid_win.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/hid_win.cxx' object='cmedia/fldigi-hid_win.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-hid_win.o `test -f 'cmedia/hid_win.cxx' || echo '$(srcdir)/'`cmedia/hid_win.cxx cmedia/fldigi-hid_win.obj: cmedia/hid_win.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT cmedia/fldigi-hid_win.obj -MD -MP -MF cmedia/$(DEPDIR)/fldigi-hid_win.Tpo -c -o cmedia/fldigi-hid_win.obj `if test -f 'cmedia/hid_win.cxx'; then $(CYGPATH_W) 'cmedia/hid_win.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/hid_win.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) cmedia/$(DEPDIR)/fldigi-hid_win.Tpo cmedia/$(DEPDIR)/fldigi-hid_win.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmedia/hid_win.cxx' object='cmedia/fldigi-hid_win.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o cmedia/fldigi-hid_win.obj `if test -f 'cmedia/hid_win.cxx'; then $(CYGPATH_W) 'cmedia/hid_win.cxx'; else $(CYGPATH_W) '$(srcdir)/cmedia/hid_win.cxx'; fi` dialogs/fldigi-fl_digi_main.o: dialogs/fl_digi_main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-fl_digi_main.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-fl_digi_main.Tpo -c -o dialogs/fldigi-fl_digi_main.o `test -f 'dialogs/fl_digi_main.cxx' || echo '$(srcdir)/'`dialogs/fl_digi_main.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-fl_digi_main.Tpo dialogs/$(DEPDIR)/fldigi-fl_digi_main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi_main.cxx' object='dialogs/fldigi-fl_digi_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-fl_digi_main.o `test -f 'dialogs/fl_digi_main.cxx' || echo '$(srcdir)/'`dialogs/fl_digi_main.cxx dialogs/fldigi-fl_digi_main.obj: dialogs/fl_digi_main.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-fl_digi_main.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-fl_digi_main.Tpo -c -o dialogs/fldigi-fl_digi_main.obj `if test -f 'dialogs/fl_digi_main.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi_main.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi_main.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-fl_digi_main.Tpo dialogs/$(DEPDIR)/fldigi-fl_digi_main.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/fl_digi_main.cxx' object='dialogs/fldigi-fl_digi_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-fl_digi_main.obj `if test -f 'dialogs/fl_digi_main.cxx'; then $(CYGPATH_W) 'dialogs/fl_digi_main.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/fl_digi_main.cxx'; fi` dxcluster/fldigi-arc-help.o: dxcluster/arc-help.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-arc-help.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-arc-help.Tpo -c -o dxcluster/fldigi-arc-help.o `test -f 'dxcluster/arc-help.cxx' || echo '$(srcdir)/'`dxcluster/arc-help.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-arc-help.Tpo dxcluster/$(DEPDIR)/fldigi-arc-help.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/arc-help.cxx' object='dxcluster/fldigi-arc-help.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-arc-help.o `test -f 'dxcluster/arc-help.cxx' || echo '$(srcdir)/'`dxcluster/arc-help.cxx dxcluster/fldigi-arc-help.obj: dxcluster/arc-help.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-arc-help.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-arc-help.Tpo -c -o dxcluster/fldigi-arc-help.obj `if test -f 'dxcluster/arc-help.cxx'; then $(CYGPATH_W) 'dxcluster/arc-help.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/arc-help.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-arc-help.Tpo dxcluster/$(DEPDIR)/fldigi-arc-help.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/arc-help.cxx' object='dxcluster/fldigi-arc-help.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-arc-help.obj `if test -f 'dxcluster/arc-help.cxx'; then $(CYGPATH_W) 'dxcluster/arc-help.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/arc-help.cxx'; fi` dxcluster/fldigi-CCC_Commands.o: dxcluster/CCC_Commands.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-CCC_Commands.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Tpo -c -o dxcluster/fldigi-CCC_Commands.o `test -f 'dxcluster/CCC_Commands.cxx' || echo '$(srcdir)/'`dxcluster/CCC_Commands.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Tpo dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/CCC_Commands.cxx' object='dxcluster/fldigi-CCC_Commands.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-CCC_Commands.o `test -f 'dxcluster/CCC_Commands.cxx' || echo '$(srcdir)/'`dxcluster/CCC_Commands.cxx dxcluster/fldigi-CCC_Commands.obj: dxcluster/CCC_Commands.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-CCC_Commands.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Tpo -c -o dxcluster/fldigi-CCC_Commands.obj `if test -f 'dxcluster/CCC_Commands.cxx'; then $(CYGPATH_W) 'dxcluster/CCC_Commands.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/CCC_Commands.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Tpo dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/CCC_Commands.cxx' object='dxcluster/fldigi-CCC_Commands.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-CCC_Commands.obj `if test -f 'dxcluster/CCC_Commands.cxx'; then $(CYGPATH_W) 'dxcluster/CCC_Commands.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/CCC_Commands.cxx'; fi` dxcluster/fldigi-DXClusterServers.o: dxcluster/DXClusterServers.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-DXClusterServers.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Tpo -c -o dxcluster/fldigi-DXClusterServers.o `test -f 'dxcluster/DXClusterServers.cxx' || echo '$(srcdir)/'`dxcluster/DXClusterServers.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Tpo dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/DXClusterServers.cxx' object='dxcluster/fldigi-DXClusterServers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-DXClusterServers.o `test -f 'dxcluster/DXClusterServers.cxx' || echo '$(srcdir)/'`dxcluster/DXClusterServers.cxx dxcluster/fldigi-DXClusterServers.obj: dxcluster/DXClusterServers.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-DXClusterServers.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Tpo -c -o dxcluster/fldigi-DXClusterServers.obj `if test -f 'dxcluster/DXClusterServers.cxx'; then $(CYGPATH_W) 'dxcluster/DXClusterServers.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/DXClusterServers.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Tpo dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/DXClusterServers.cxx' object='dxcluster/fldigi-DXClusterServers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-DXClusterServers.obj `if test -f 'dxcluster/DXClusterServers.cxx'; then $(CYGPATH_W) 'dxcluster/DXClusterServers.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/DXClusterServers.cxx'; fi` dxcluster/fldigi-DXSpiderCommandReference.o: dxcluster/DXSpiderCommandReference.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-DXSpiderCommandReference.o -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Tpo -c -o dxcluster/fldigi-DXSpiderCommandReference.o `test -f 'dxcluster/DXSpiderCommandReference.cxx' || echo '$(srcdir)/'`dxcluster/DXSpiderCommandReference.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Tpo dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/DXSpiderCommandReference.cxx' object='dxcluster/fldigi-DXSpiderCommandReference.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-DXSpiderCommandReference.o `test -f 'dxcluster/DXSpiderCommandReference.cxx' || echo '$(srcdir)/'`dxcluster/DXSpiderCommandReference.cxx dxcluster/fldigi-DXSpiderCommandReference.obj: dxcluster/DXSpiderCommandReference.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dxcluster/fldigi-DXSpiderCommandReference.obj -MD -MP -MF dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Tpo -c -o dxcluster/fldigi-DXSpiderCommandReference.obj `if test -f 'dxcluster/DXSpiderCommandReference.cxx'; then $(CYGPATH_W) 'dxcluster/DXSpiderCommandReference.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/DXSpiderCommandReference.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Tpo dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dxcluster/DXSpiderCommandReference.cxx' object='dxcluster/fldigi-DXSpiderCommandReference.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dxcluster/fldigi-DXSpiderCommandReference.obj `if test -f 'dxcluster/DXSpiderCommandReference.cxx'; then $(CYGPATH_W) 'dxcluster/DXSpiderCommandReference.cxx'; else $(CYGPATH_W) '$(srcdir)/dxcluster/DXSpiderCommandReference.cxx'; fi` fileselector/fldigi-flnfc_common.o: fileselector/flnfc_common.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fileselector/fldigi-flnfc_common.o -MD -MP -MF fileselector/$(DEPDIR)/fldigi-flnfc_common.Tpo -c -o fileselector/fldigi-flnfc_common.o `test -f 'fileselector/flnfc_common.cxx' || echo '$(srcdir)/'`fileselector/flnfc_common.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/fldigi-flnfc_common.Tpo fileselector/$(DEPDIR)/fldigi-flnfc_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/flnfc_common.cxx' object='fileselector/fldigi-flnfc_common.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/fldigi-flnfc_common.o `test -f 'fileselector/flnfc_common.cxx' || echo '$(srcdir)/'`fileselector/flnfc_common.cxx fileselector/fldigi-flnfc_common.obj: fileselector/flnfc_common.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fileselector/fldigi-flnfc_common.obj -MD -MP -MF fileselector/$(DEPDIR)/fldigi-flnfc_common.Tpo -c -o fileselector/fldigi-flnfc_common.obj `if test -f 'fileselector/flnfc_common.cxx'; then $(CYGPATH_W) 'fileselector/flnfc_common.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/flnfc_common.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fileselector/$(DEPDIR)/fldigi-flnfc_common.Tpo fileselector/$(DEPDIR)/fldigi-flnfc_common.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileselector/flnfc_common.cxx' object='fileselector/fldigi-flnfc_common.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fileselector/fldigi-flnfc_common.obj `if test -f 'fileselector/flnfc_common.cxx'; then $(CYGPATH_W) 'fileselector/flnfc_common.cxx'; else $(CYGPATH_W) '$(srcdir)/fileselector/flnfc_common.cxx'; fi` feld/fldigi-Feld7x7-14.o: feld/Feld7x7-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-Feld7x7-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-Feld7x7-14.Tpo -c -o feld/fldigi-Feld7x7-14.o `test -f 'feld/Feld7x7-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-Feld7x7-14.Tpo feld/$(DEPDIR)/fldigi-Feld7x7-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7-14.cxx' object='feld/fldigi-Feld7x7-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-Feld7x7-14.o `test -f 'feld/Feld7x7-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7-14.cxx feld/fldigi-Feld7x7-14.obj: feld/Feld7x7-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-Feld7x7-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-Feld7x7-14.Tpo -c -o feld/fldigi-Feld7x7-14.obj `if test -f 'feld/Feld7x7-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-Feld7x7-14.Tpo feld/$(DEPDIR)/fldigi-Feld7x7-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7-14.cxx' object='feld/fldigi-Feld7x7-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-Feld7x7-14.obj `if test -f 'feld/Feld7x7-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7-14.cxx'; fi` feld/fldigi-Feld7x7n-14.o: feld/Feld7x7n-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-Feld7x7n-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-Feld7x7n-14.Tpo -c -o feld/fldigi-Feld7x7n-14.o `test -f 'feld/Feld7x7n-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7n-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-Feld7x7n-14.Tpo feld/$(DEPDIR)/fldigi-Feld7x7n-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7n-14.cxx' object='feld/fldigi-Feld7x7n-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-Feld7x7n-14.o `test -f 'feld/Feld7x7n-14.cxx' || echo '$(srcdir)/'`feld/Feld7x7n-14.cxx feld/fldigi-Feld7x7n-14.obj: feld/Feld7x7n-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-Feld7x7n-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-Feld7x7n-14.Tpo -c -o feld/fldigi-Feld7x7n-14.obj `if test -f 'feld/Feld7x7n-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7n-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7n-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-Feld7x7n-14.Tpo feld/$(DEPDIR)/fldigi-Feld7x7n-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/Feld7x7n-14.cxx' object='feld/fldigi-Feld7x7n-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-Feld7x7n-14.obj `if test -f 'feld/Feld7x7n-14.cxx'; then $(CYGPATH_W) 'feld/Feld7x7n-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/Feld7x7n-14.cxx'; fi` feld/fldigi-FeldDx-14.o: feld/FeldDx-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldDx-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldDx-14.Tpo -c -o feld/fldigi-FeldDx-14.o `test -f 'feld/FeldDx-14.cxx' || echo '$(srcdir)/'`feld/FeldDx-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldDx-14.Tpo feld/$(DEPDIR)/fldigi-FeldDx-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldDx-14.cxx' object='feld/fldigi-FeldDx-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldDx-14.o `test -f 'feld/FeldDx-14.cxx' || echo '$(srcdir)/'`feld/FeldDx-14.cxx feld/fldigi-FeldDx-14.obj: feld/FeldDx-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldDx-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldDx-14.Tpo -c -o feld/fldigi-FeldDx-14.obj `if test -f 'feld/FeldDx-14.cxx'; then $(CYGPATH_W) 'feld/FeldDx-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldDx-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldDx-14.Tpo feld/$(DEPDIR)/fldigi-FeldDx-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldDx-14.cxx' object='feld/fldigi-FeldDx-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldDx-14.obj `if test -f 'feld/FeldDx-14.cxx'; then $(CYGPATH_W) 'feld/FeldDx-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldDx-14.cxx'; fi` feld/fldigi-FeldFat-14.o: feld/FeldFat-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldFat-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldFat-14.Tpo -c -o feld/fldigi-FeldFat-14.o `test -f 'feld/FeldFat-14.cxx' || echo '$(srcdir)/'`feld/FeldFat-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldFat-14.Tpo feld/$(DEPDIR)/fldigi-FeldFat-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldFat-14.cxx' object='feld/fldigi-FeldFat-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldFat-14.o `test -f 'feld/FeldFat-14.cxx' || echo '$(srcdir)/'`feld/FeldFat-14.cxx feld/fldigi-FeldFat-14.obj: feld/FeldFat-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldFat-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldFat-14.Tpo -c -o feld/fldigi-FeldFat-14.obj `if test -f 'feld/FeldFat-14.cxx'; then $(CYGPATH_W) 'feld/FeldFat-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldFat-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldFat-14.Tpo feld/$(DEPDIR)/fldigi-FeldFat-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldFat-14.cxx' object='feld/fldigi-FeldFat-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldFat-14.obj `if test -f 'feld/FeldFat-14.cxx'; then $(CYGPATH_W) 'feld/FeldFat-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldFat-14.cxx'; fi` feld/fldigi-FeldHell-12.o: feld/FeldHell-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldHell-12.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldHell-12.Tpo -c -o feld/fldigi-FeldHell-12.o `test -f 'feld/FeldHell-12.cxx' || echo '$(srcdir)/'`feld/FeldHell-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldHell-12.Tpo feld/$(DEPDIR)/fldigi-FeldHell-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldHell-12.cxx' object='feld/fldigi-FeldHell-12.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldHell-12.o `test -f 'feld/FeldHell-12.cxx' || echo '$(srcdir)/'`feld/FeldHell-12.cxx feld/fldigi-FeldHell-12.obj: feld/FeldHell-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldHell-12.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldHell-12.Tpo -c -o feld/fldigi-FeldHell-12.obj `if test -f 'feld/FeldHell-12.cxx'; then $(CYGPATH_W) 'feld/FeldHell-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldHell-12.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldHell-12.Tpo feld/$(DEPDIR)/fldigi-FeldHell-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldHell-12.cxx' object='feld/fldigi-FeldHell-12.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldHell-12.obj `if test -f 'feld/FeldHell-12.cxx'; then $(CYGPATH_W) 'feld/FeldHell-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldHell-12.cxx'; fi` feld/fldigi-FeldLittle-12.o: feld/FeldLittle-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLittle-12.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLittle-12.Tpo -c -o feld/fldigi-FeldLittle-12.o `test -f 'feld/FeldLittle-12.cxx' || echo '$(srcdir)/'`feld/FeldLittle-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLittle-12.Tpo feld/$(DEPDIR)/fldigi-FeldLittle-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLittle-12.cxx' object='feld/fldigi-FeldLittle-12.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLittle-12.o `test -f 'feld/FeldLittle-12.cxx' || echo '$(srcdir)/'`feld/FeldLittle-12.cxx feld/fldigi-FeldLittle-12.obj: feld/FeldLittle-12.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLittle-12.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLittle-12.Tpo -c -o feld/fldigi-FeldLittle-12.obj `if test -f 'feld/FeldLittle-12.cxx'; then $(CYGPATH_W) 'feld/FeldLittle-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLittle-12.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLittle-12.Tpo feld/$(DEPDIR)/fldigi-FeldLittle-12.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLittle-12.cxx' object='feld/fldigi-FeldLittle-12.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLittle-12.obj `if test -f 'feld/FeldLittle-12.cxx'; then $(CYGPATH_W) 'feld/FeldLittle-12.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLittle-12.cxx'; fi` feld/fldigi-FeldLo8-14.o: feld/FeldLo8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLo8-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLo8-14.Tpo -c -o feld/fldigi-FeldLo8-14.o `test -f 'feld/FeldLo8-14.cxx' || echo '$(srcdir)/'`feld/FeldLo8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLo8-14.Tpo feld/$(DEPDIR)/fldigi-FeldLo8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLo8-14.cxx' object='feld/fldigi-FeldLo8-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLo8-14.o `test -f 'feld/FeldLo8-14.cxx' || echo '$(srcdir)/'`feld/FeldLo8-14.cxx feld/fldigi-FeldLo8-14.obj: feld/FeldLo8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLo8-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLo8-14.Tpo -c -o feld/fldigi-FeldLo8-14.obj `if test -f 'feld/FeldLo8-14.cxx'; then $(CYGPATH_W) 'feld/FeldLo8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLo8-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLo8-14.Tpo feld/$(DEPDIR)/fldigi-FeldLo8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLo8-14.cxx' object='feld/fldigi-FeldLo8-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLo8-14.obj `if test -f 'feld/FeldLo8-14.cxx'; then $(CYGPATH_W) 'feld/FeldLo8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLo8-14.cxx'; fi` feld/fldigi-FeldLow-14.o: feld/FeldLow-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLow-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLow-14.Tpo -c -o feld/fldigi-FeldLow-14.o `test -f 'feld/FeldLow-14.cxx' || echo '$(srcdir)/'`feld/FeldLow-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLow-14.Tpo feld/$(DEPDIR)/fldigi-FeldLow-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLow-14.cxx' object='feld/fldigi-FeldLow-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLow-14.o `test -f 'feld/FeldLow-14.cxx' || echo '$(srcdir)/'`feld/FeldLow-14.cxx feld/fldigi-FeldLow-14.obj: feld/FeldLow-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldLow-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldLow-14.Tpo -c -o feld/fldigi-FeldLow-14.obj `if test -f 'feld/FeldLow-14.cxx'; then $(CYGPATH_W) 'feld/FeldLow-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLow-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldLow-14.Tpo feld/$(DEPDIR)/fldigi-FeldLow-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldLow-14.cxx' object='feld/fldigi-FeldLow-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldLow-14.obj `if test -f 'feld/FeldLow-14.cxx'; then $(CYGPATH_W) 'feld/FeldLow-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldLow-14.cxx'; fi` feld/fldigi-FeldModern-14.o: feld/FeldModern-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldModern-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldModern-14.Tpo -c -o feld/fldigi-FeldModern-14.o `test -f 'feld/FeldModern-14.cxx' || echo '$(srcdir)/'`feld/FeldModern-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldModern-14.Tpo feld/$(DEPDIR)/fldigi-FeldModern-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern-14.cxx' object='feld/fldigi-FeldModern-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldModern-14.o `test -f 'feld/FeldModern-14.cxx' || echo '$(srcdir)/'`feld/FeldModern-14.cxx feld/fldigi-FeldModern-14.obj: feld/FeldModern-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldModern-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldModern-14.Tpo -c -o feld/fldigi-FeldModern-14.obj `if test -f 'feld/FeldModern-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldModern-14.Tpo feld/$(DEPDIR)/fldigi-FeldModern-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern-14.cxx' object='feld/fldigi-FeldModern-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldModern-14.obj `if test -f 'feld/FeldModern-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern-14.cxx'; fi` feld/fldigi-FeldModern8-14.o: feld/FeldModern8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldModern8-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldModern8-14.Tpo -c -o feld/fldigi-FeldModern8-14.o `test -f 'feld/FeldModern8-14.cxx' || echo '$(srcdir)/'`feld/FeldModern8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldModern8-14.Tpo feld/$(DEPDIR)/fldigi-FeldModern8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern8-14.cxx' object='feld/fldigi-FeldModern8-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldModern8-14.o `test -f 'feld/FeldModern8-14.cxx' || echo '$(srcdir)/'`feld/FeldModern8-14.cxx feld/fldigi-FeldModern8-14.obj: feld/FeldModern8-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldModern8-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldModern8-14.Tpo -c -o feld/fldigi-FeldModern8-14.obj `if test -f 'feld/FeldModern8-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern8-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldModern8-14.Tpo feld/$(DEPDIR)/fldigi-FeldModern8-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldModern8-14.cxx' object='feld/fldigi-FeldModern8-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldModern8-14.obj `if test -f 'feld/FeldModern8-14.cxx'; then $(CYGPATH_W) 'feld/FeldModern8-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldModern8-14.cxx'; fi` feld/fldigi-FeldNarr-14.o: feld/FeldNarr-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldNarr-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldNarr-14.Tpo -c -o feld/fldigi-FeldNarr-14.o `test -f 'feld/FeldNarr-14.cxx' || echo '$(srcdir)/'`feld/FeldNarr-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldNarr-14.Tpo feld/$(DEPDIR)/fldigi-FeldNarr-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldNarr-14.cxx' object='feld/fldigi-FeldNarr-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldNarr-14.o `test -f 'feld/FeldNarr-14.cxx' || echo '$(srcdir)/'`feld/FeldNarr-14.cxx feld/fldigi-FeldNarr-14.obj: feld/FeldNarr-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldNarr-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldNarr-14.Tpo -c -o feld/fldigi-FeldNarr-14.obj `if test -f 'feld/FeldNarr-14.cxx'; then $(CYGPATH_W) 'feld/FeldNarr-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldNarr-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldNarr-14.Tpo feld/$(DEPDIR)/fldigi-FeldNarr-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldNarr-14.cxx' object='feld/fldigi-FeldNarr-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldNarr-14.obj `if test -f 'feld/FeldNarr-14.cxx'; then $(CYGPATH_W) 'feld/FeldNarr-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldNarr-14.cxx'; fi` feld/fldigi-FeldReal-14.o: feld/FeldReal-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldReal-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldReal-14.Tpo -c -o feld/fldigi-FeldReal-14.o `test -f 'feld/FeldReal-14.cxx' || echo '$(srcdir)/'`feld/FeldReal-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldReal-14.Tpo feld/$(DEPDIR)/fldigi-FeldReal-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldReal-14.cxx' object='feld/fldigi-FeldReal-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldReal-14.o `test -f 'feld/FeldReal-14.cxx' || echo '$(srcdir)/'`feld/FeldReal-14.cxx feld/fldigi-FeldReal-14.obj: feld/FeldReal-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldReal-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldReal-14.Tpo -c -o feld/fldigi-FeldReal-14.obj `if test -f 'feld/FeldReal-14.cxx'; then $(CYGPATH_W) 'feld/FeldReal-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldReal-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldReal-14.Tpo feld/$(DEPDIR)/fldigi-FeldReal-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldReal-14.cxx' object='feld/fldigi-FeldReal-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldReal-14.obj `if test -f 'feld/FeldReal-14.cxx'; then $(CYGPATH_W) 'feld/FeldReal-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldReal-14.cxx'; fi` feld/fldigi-FeldStyl-14.o: feld/FeldStyl-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldStyl-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldStyl-14.Tpo -c -o feld/fldigi-FeldStyl-14.o `test -f 'feld/FeldStyl-14.cxx' || echo '$(srcdir)/'`feld/FeldStyl-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldStyl-14.Tpo feld/$(DEPDIR)/fldigi-FeldStyl-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldStyl-14.cxx' object='feld/fldigi-FeldStyl-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldStyl-14.o `test -f 'feld/FeldStyl-14.cxx' || echo '$(srcdir)/'`feld/FeldStyl-14.cxx feld/fldigi-FeldStyl-14.obj: feld/FeldStyl-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldStyl-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldStyl-14.Tpo -c -o feld/fldigi-FeldStyl-14.obj `if test -f 'feld/FeldStyl-14.cxx'; then $(CYGPATH_W) 'feld/FeldStyl-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldStyl-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldStyl-14.Tpo feld/$(DEPDIR)/fldigi-FeldStyl-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldStyl-14.cxx' object='feld/fldigi-FeldStyl-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldStyl-14.obj `if test -f 'feld/FeldStyl-14.cxx'; then $(CYGPATH_W) 'feld/FeldStyl-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldStyl-14.cxx'; fi` feld/fldigi-FeldVert-14.o: feld/FeldVert-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldVert-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldVert-14.Tpo -c -o feld/fldigi-FeldVert-14.o `test -f 'feld/FeldVert-14.cxx' || echo '$(srcdir)/'`feld/FeldVert-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldVert-14.Tpo feld/$(DEPDIR)/fldigi-FeldVert-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldVert-14.cxx' object='feld/fldigi-FeldVert-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldVert-14.o `test -f 'feld/FeldVert-14.cxx' || echo '$(srcdir)/'`feld/FeldVert-14.cxx feld/fldigi-FeldVert-14.obj: feld/FeldVert-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldVert-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldVert-14.Tpo -c -o feld/fldigi-FeldVert-14.obj `if test -f 'feld/FeldVert-14.cxx'; then $(CYGPATH_W) 'feld/FeldVert-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldVert-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldVert-14.Tpo feld/$(DEPDIR)/fldigi-FeldVert-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldVert-14.cxx' object='feld/fldigi-FeldVert-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldVert-14.obj `if test -f 'feld/FeldVert-14.cxx'; then $(CYGPATH_W) 'feld/FeldVert-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldVert-14.cxx'; fi` feld/fldigi-FeldWide-14.o: feld/FeldWide-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldWide-14.o -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldWide-14.Tpo -c -o feld/fldigi-FeldWide-14.o `test -f 'feld/FeldWide-14.cxx' || echo '$(srcdir)/'`feld/FeldWide-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldWide-14.Tpo feld/$(DEPDIR)/fldigi-FeldWide-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldWide-14.cxx' object='feld/fldigi-FeldWide-14.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldWide-14.o `test -f 'feld/FeldWide-14.cxx' || echo '$(srcdir)/'`feld/FeldWide-14.cxx feld/fldigi-FeldWide-14.obj: feld/FeldWide-14.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT feld/fldigi-FeldWide-14.obj -MD -MP -MF feld/$(DEPDIR)/fldigi-FeldWide-14.Tpo -c -o feld/fldigi-FeldWide-14.obj `if test -f 'feld/FeldWide-14.cxx'; then $(CYGPATH_W) 'feld/FeldWide-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldWide-14.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) feld/$(DEPDIR)/fldigi-FeldWide-14.Tpo feld/$(DEPDIR)/fldigi-FeldWide-14.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='feld/FeldWide-14.cxx' object='feld/fldigi-FeldWide-14.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o feld/fldigi-FeldWide-14.obj `if test -f 'feld/FeldWide-14.cxx'; then $(CYGPATH_W) 'feld/FeldWide-14.cxx'; else $(CYGPATH_W) '$(srcdir)/feld/FeldWide-14.cxx'; fi` fsq/fldigi-fsq_varicode.o: fsq/fsq_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq_varicode.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq_varicode.Tpo -c -o fsq/fldigi-fsq_varicode.o `test -f 'fsq/fsq_varicode.cxx' || echo '$(srcdir)/'`fsq/fsq_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq_varicode.Tpo fsq/$(DEPDIR)/fldigi-fsq_varicode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq_varicode.cxx' object='fsq/fldigi-fsq_varicode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq_varicode.o `test -f 'fsq/fsq_varicode.cxx' || echo '$(srcdir)/'`fsq/fsq_varicode.cxx fsq/fldigi-fsq_varicode.obj: fsq/fsq_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq_varicode.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq_varicode.Tpo -c -o fsq/fldigi-fsq_varicode.obj `if test -f 'fsq/fsq_varicode.cxx'; then $(CYGPATH_W) 'fsq/fsq_varicode.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq_varicode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq_varicode.Tpo fsq/$(DEPDIR)/fldigi-fsq_varicode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq_varicode.cxx' object='fsq/fldigi-fsq_varicode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq_varicode.obj `if test -f 'fsq/fsq_varicode.cxx'; then $(CYGPATH_W) 'fsq/fsq_varicode.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq_varicode.cxx'; fi` fsq/fldigi-fsq-pic.o: fsq/fsq-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq-pic.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq-pic.Tpo -c -o fsq/fldigi-fsq-pic.o `test -f 'fsq/fsq-pic.cxx' || echo '$(srcdir)/'`fsq/fsq-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq-pic.Tpo fsq/$(DEPDIR)/fldigi-fsq-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq-pic.cxx' object='fsq/fldigi-fsq-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq-pic.o `test -f 'fsq/fsq-pic.cxx' || echo '$(srcdir)/'`fsq/fsq-pic.cxx fsq/fldigi-fsq-pic.obj: fsq/fsq-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-fsq-pic.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-fsq-pic.Tpo -c -o fsq/fldigi-fsq-pic.obj `if test -f 'fsq/fsq-pic.cxx'; then $(CYGPATH_W) 'fsq/fsq-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-fsq-pic.Tpo fsq/$(DEPDIR)/fldigi-fsq-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/fsq-pic.cxx' object='fsq/fldigi-fsq-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-fsq-pic.obj `if test -f 'fsq/fsq-pic.cxx'; then $(CYGPATH_W) 'fsq/fsq-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/fsq-pic.cxx'; fi` fsq/fldigi-bitmaps.o: fsq/bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-bitmaps.o -MD -MP -MF fsq/$(DEPDIR)/fldigi-bitmaps.Tpo -c -o fsq/fldigi-bitmaps.o `test -f 'fsq/bitmaps.cxx' || echo '$(srcdir)/'`fsq/bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-bitmaps.Tpo fsq/$(DEPDIR)/fldigi-bitmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/bitmaps.cxx' object='fsq/fldigi-bitmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-bitmaps.o `test -f 'fsq/bitmaps.cxx' || echo '$(srcdir)/'`fsq/bitmaps.cxx fsq/fldigi-bitmaps.obj: fsq/bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT fsq/fldigi-bitmaps.obj -MD -MP -MF fsq/$(DEPDIR)/fldigi-bitmaps.Tpo -c -o fsq/fldigi-bitmaps.obj `if test -f 'fsq/bitmaps.cxx'; then $(CYGPATH_W) 'fsq/bitmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/bitmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) fsq/$(DEPDIR)/fldigi-bitmaps.Tpo fsq/$(DEPDIR)/fldigi-bitmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fsq/bitmaps.cxx' object='fsq/fldigi-bitmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o fsq/fldigi-bitmaps.obj `if test -f 'fsq/bitmaps.cxx'; then $(CYGPATH_W) 'fsq/bitmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/fsq/bitmaps.cxx'; fi` ifkp/fldigi-ifkp_bitmaps.o: ifkp/ifkp_bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp_bitmaps.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Tpo -c -o ifkp/fldigi-ifkp_bitmaps.o `test -f 'ifkp/ifkp_bitmaps.cxx' || echo '$(srcdir)/'`ifkp/ifkp_bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Tpo ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp_bitmaps.cxx' object='ifkp/fldigi-ifkp_bitmaps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp_bitmaps.o `test -f 'ifkp/ifkp_bitmaps.cxx' || echo '$(srcdir)/'`ifkp/ifkp_bitmaps.cxx ifkp/fldigi-ifkp_bitmaps.obj: ifkp/ifkp_bitmaps.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp_bitmaps.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Tpo -c -o ifkp/fldigi-ifkp_bitmaps.obj `if test -f 'ifkp/ifkp_bitmaps.cxx'; then $(CYGPATH_W) 'ifkp/ifkp_bitmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp_bitmaps.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Tpo ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp_bitmaps.cxx' object='ifkp/fldigi-ifkp_bitmaps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp_bitmaps.obj `if test -f 'ifkp/ifkp_bitmaps.cxx'; then $(CYGPATH_W) 'ifkp/ifkp_bitmaps.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp_bitmaps.cxx'; fi` ifkp/fldigi-ifkp_varicode.o: ifkp/ifkp_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp_varicode.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Tpo -c -o ifkp/fldigi-ifkp_varicode.o `test -f 'ifkp/ifkp_varicode.cxx' || echo '$(srcdir)/'`ifkp/ifkp_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Tpo ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp_varicode.cxx' object='ifkp/fldigi-ifkp_varicode.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp_varicode.o `test -f 'ifkp/ifkp_varicode.cxx' || echo '$(srcdir)/'`ifkp/ifkp_varicode.cxx ifkp/fldigi-ifkp_varicode.obj: ifkp/ifkp_varicode.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp_varicode.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Tpo -c -o ifkp/fldigi-ifkp_varicode.obj `if test -f 'ifkp/ifkp_varicode.cxx'; then $(CYGPATH_W) 'ifkp/ifkp_varicode.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp_varicode.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Tpo ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp_varicode.cxx' object='ifkp/fldigi-ifkp_varicode.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp_varicode.obj `if test -f 'ifkp/ifkp_varicode.cxx'; then $(CYGPATH_W) 'ifkp/ifkp_varicode.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp_varicode.cxx'; fi` ifkp/fldigi-ifkp-pic.o: ifkp/ifkp-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp-pic.o -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp-pic.Tpo -c -o ifkp/fldigi-ifkp-pic.o `test -f 'ifkp/ifkp-pic.cxx' || echo '$(srcdir)/'`ifkp/ifkp-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp-pic.Tpo ifkp/$(DEPDIR)/fldigi-ifkp-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp-pic.cxx' object='ifkp/fldigi-ifkp-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp-pic.o `test -f 'ifkp/ifkp-pic.cxx' || echo '$(srcdir)/'`ifkp/ifkp-pic.cxx ifkp/fldigi-ifkp-pic.obj: ifkp/ifkp-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT ifkp/fldigi-ifkp-pic.obj -MD -MP -MF ifkp/$(DEPDIR)/fldigi-ifkp-pic.Tpo -c -o ifkp/fldigi-ifkp-pic.obj `if test -f 'ifkp/ifkp-pic.cxx'; then $(CYGPATH_W) 'ifkp/ifkp-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) ifkp/$(DEPDIR)/fldigi-ifkp-pic.Tpo ifkp/$(DEPDIR)/fldigi-ifkp-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ifkp/ifkp-pic.cxx' object='ifkp/fldigi-ifkp-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o ifkp/fldigi-ifkp-pic.obj `if test -f 'ifkp/ifkp-pic.cxx'; then $(CYGPATH_W) 'ifkp/ifkp-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/ifkp/ifkp-pic.cxx'; fi` mfsk/fldigi-mfsk-pic.o: mfsk/mfsk-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfsk-pic.o -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfsk-pic.Tpo -c -o mfsk/fldigi-mfsk-pic.o `test -f 'mfsk/mfsk-pic.cxx' || echo '$(srcdir)/'`mfsk/mfsk-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfsk-pic.Tpo mfsk/$(DEPDIR)/fldigi-mfsk-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk-pic.cxx' object='mfsk/fldigi-mfsk-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfsk-pic.o `test -f 'mfsk/mfsk-pic.cxx' || echo '$(srcdir)/'`mfsk/mfsk-pic.cxx mfsk/fldigi-mfsk-pic.obj: mfsk/mfsk-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT mfsk/fldigi-mfsk-pic.obj -MD -MP -MF mfsk/$(DEPDIR)/fldigi-mfsk-pic.Tpo -c -o mfsk/fldigi-mfsk-pic.obj `if test -f 'mfsk/mfsk-pic.cxx'; then $(CYGPATH_W) 'mfsk/mfsk-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mfsk/$(DEPDIR)/fldigi-mfsk-pic.Tpo mfsk/$(DEPDIR)/fldigi-mfsk-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mfsk/mfsk-pic.cxx' object='mfsk/fldigi-mfsk-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o mfsk/fldigi-mfsk-pic.obj `if test -f 'mfsk/mfsk-pic.cxx'; then $(CYGPATH_W) 'mfsk/mfsk-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/mfsk/mfsk-pic.cxx'; fi` rsid/fldigi-rsid_defs.o: rsid/rsid_defs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rsid/fldigi-rsid_defs.o -MD -MP -MF rsid/$(DEPDIR)/fldigi-rsid_defs.Tpo -c -o rsid/fldigi-rsid_defs.o `test -f 'rsid/rsid_defs.cxx' || echo '$(srcdir)/'`rsid/rsid_defs.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rsid/$(DEPDIR)/fldigi-rsid_defs.Tpo rsid/$(DEPDIR)/fldigi-rsid_defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid_defs.cxx' object='rsid/fldigi-rsid_defs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rsid/fldigi-rsid_defs.o `test -f 'rsid/rsid_defs.cxx' || echo '$(srcdir)/'`rsid/rsid_defs.cxx rsid/fldigi-rsid_defs.obj: rsid/rsid_defs.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT rsid/fldigi-rsid_defs.obj -MD -MP -MF rsid/$(DEPDIR)/fldigi-rsid_defs.Tpo -c -o rsid/fldigi-rsid_defs.obj `if test -f 'rsid/rsid_defs.cxx'; then $(CYGPATH_W) 'rsid/rsid_defs.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid_defs.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) rsid/$(DEPDIR)/fldigi-rsid_defs.Tpo rsid/$(DEPDIR)/fldigi-rsid_defs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='rsid/rsid_defs.cxx' object='rsid/fldigi-rsid_defs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o rsid/fldigi-rsid_defs.obj `if test -f 'rsid/rsid_defs.cxx'; then $(CYGPATH_W) 'rsid/rsid_defs.cxx'; else $(CYGPATH_W) '$(srcdir)/rsid/rsid_defs.cxx'; fi` thor/fldigi-thor-pic.o: thor/thor-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thor-pic.o -MD -MP -MF thor/$(DEPDIR)/fldigi-thor-pic.Tpo -c -o thor/fldigi-thor-pic.o `test -f 'thor/thor-pic.cxx' || echo '$(srcdir)/'`thor/thor-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thor-pic.Tpo thor/$(DEPDIR)/fldigi-thor-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor-pic.cxx' object='thor/fldigi-thor-pic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thor-pic.o `test -f 'thor/thor-pic.cxx' || echo '$(srcdir)/'`thor/thor-pic.cxx thor/fldigi-thor-pic.obj: thor/thor-pic.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT thor/fldigi-thor-pic.obj -MD -MP -MF thor/$(DEPDIR)/fldigi-thor-pic.Tpo -c -o thor/fldigi-thor-pic.obj `if test -f 'thor/thor-pic.cxx'; then $(CYGPATH_W) 'thor/thor-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor-pic.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) thor/$(DEPDIR)/fldigi-thor-pic.Tpo thor/$(DEPDIR)/fldigi-thor-pic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='thor/thor-pic.cxx' object='thor/fldigi-thor-pic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o thor/fldigi-thor-pic.obj `if test -f 'thor/thor-pic.cxx'; then $(CYGPATH_W) 'thor/thor-pic.cxx'; else $(CYGPATH_W) '$(srcdir)/thor/thor-pic.cxx'; fi` trx/fldigi-tune.o: trx/tune.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-tune.o -MD -MP -MF trx/$(DEPDIR)/fldigi-tune.Tpo -c -o trx/fldigi-tune.o `test -f 'trx/tune.cxx' || echo '$(srcdir)/'`trx/tune.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-tune.Tpo trx/$(DEPDIR)/fldigi-tune.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/tune.cxx' object='trx/fldigi-tune.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-tune.o `test -f 'trx/tune.cxx' || echo '$(srcdir)/'`trx/tune.cxx trx/fldigi-tune.obj: trx/tune.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT trx/fldigi-tune.obj -MD -MP -MF trx/$(DEPDIR)/fldigi-tune.Tpo -c -o trx/fldigi-tune.obj `if test -f 'trx/tune.cxx'; then $(CYGPATH_W) 'trx/tune.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/tune.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) trx/$(DEPDIR)/fldigi-tune.Tpo trx/$(DEPDIR)/fldigi-tune.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='trx/tune.cxx' object='trx/fldigi-tune.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o trx/fldigi-tune.obj `if test -f 'trx/tune.cxx'; then $(CYGPATH_W) 'trx/tune.cxx'; else $(CYGPATH_W) '$(srcdir)/trx/tune.cxx'; fi` dialogs/fldigi-guide.o: dialogs/guide.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-guide.o -MD -MP -MF dialogs/$(DEPDIR)/fldigi-guide.Tpo -c -o dialogs/fldigi-guide.o `test -f 'dialogs/guide.cxx' || echo '$(srcdir)/'`dialogs/guide.cxx @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-guide.Tpo dialogs/$(DEPDIR)/fldigi-guide.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/guide.cxx' object='dialogs/fldigi-guide.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-guide.o `test -f 'dialogs/guide.cxx' || echo '$(srcdir)/'`dialogs/guide.cxx dialogs/fldigi-guide.obj: dialogs/guide.cxx @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -MT dialogs/fldigi-guide.obj -MD -MP -MF dialogs/$(DEPDIR)/fldigi-guide.Tpo -c -o dialogs/fldigi-guide.obj `if test -f 'dialogs/guide.cxx'; then $(CYGPATH_W) 'dialogs/guide.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/guide.cxx'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) dialogs/$(DEPDIR)/fldigi-guide.Tpo dialogs/$(DEPDIR)/fldigi-guide.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dialogs/guide.cxx' object='dialogs/fldigi-guide.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fldigi_CPPFLAGS) $(CPPFLAGS) $(fldigi_CXXFLAGS) $(CXXFLAGS) -c -o dialogs/fldigi-guide.obj `if test -f 'dialogs/guide.cxx'; then $(CYGPATH_W) 'dialogs/guide.cxx'; else $(CYGPATH_W) '$(srcdir)/dialogs/guide.cxx'; fi` .cxx.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? $(tmp_srcdir_var)/../scripts/tests/config-h.sh.log: $(tmp_srcdir_var)/../scripts/tests/config-h.sh @p='$(tmp_srcdir_var)/../scripts/tests/config-h.sh'; \ b='$(tmp_srcdir_var)/../scripts/tests/config-h.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) $(tmp_srcdir_var)/../scripts/tests/cr.sh.log: $(tmp_srcdir_var)/../scripts/tests/cr.sh @p='$(tmp_srcdir_var)/../scripts/tests/cr.sh'; \ b='$(tmp_srcdir_var)/../scripts/tests/cr.sh'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f blank/$(DEPDIR)/$(am__dirstamp) -rm -f blank/$(am__dirstamp) -rm -f cmedia/$(DEPDIR)/$(am__dirstamp) -rm -f cmedia/$(am__dirstamp) -rm -f combo/$(DEPDIR)/$(am__dirstamp) -rm -f combo/$(am__dirstamp) -rm -f compat/$(DEPDIR)/$(am__dirstamp) -rm -f compat/$(am__dirstamp) -rm -f config_script/$(DEPDIR)/$(am__dirstamp) -rm -f config_script/$(am__dirstamp) -rm -f contestia/$(DEPDIR)/$(am__dirstamp) -rm -f contestia/$(am__dirstamp) -rm -f cw/$(DEPDIR)/$(am__dirstamp) -rm -f cw/$(am__dirstamp) -rm -f debug/$(DEPDIR)/$(am__dirstamp) -rm -f debug/$(am__dirstamp) -rm -f dialogs/$(DEPDIR)/$(am__dirstamp) -rm -f dialogs/$(am__dirstamp) -rm -f dominoex/$(DEPDIR)/$(am__dirstamp) -rm -f dominoex/$(am__dirstamp) -rm -f dtmf/$(DEPDIR)/$(am__dirstamp) -rm -f dtmf/$(am__dirstamp) -rm -f dxcluster/$(DEPDIR)/$(am__dirstamp) -rm -f dxcluster/$(am__dirstamp) -rm -f feld/$(DEPDIR)/$(am__dirstamp) -rm -f feld/$(am__dirstamp) -rm -f fft-monitor/$(DEPDIR)/$(am__dirstamp) -rm -f fft-monitor/$(am__dirstamp) -rm -f fileselector/$(DEPDIR)/$(am__dirstamp) -rm -f fileselector/$(am__dirstamp) -rm -f filters/$(DEPDIR)/$(am__dirstamp) -rm -f filters/$(am__dirstamp) -rm -f flarq-src/$(DEPDIR)/$(am__dirstamp) -rm -f flarq-src/$(am__dirstamp) -rm -f fmt/$(DEPDIR)/$(am__dirstamp) -rm -f fmt/$(am__dirstamp) -rm -f fsq/$(DEPDIR)/$(am__dirstamp) -rm -f fsq/$(am__dirstamp) -rm -f globals/$(DEPDIR)/$(am__dirstamp) -rm -f globals/$(am__dirstamp) -rm -f ifkp/$(DEPDIR)/$(am__dirstamp) -rm -f ifkp/$(am__dirstamp) -rm -f irrxml/$(DEPDIR)/$(am__dirstamp) -rm -f irrxml/$(am__dirstamp) -rm -f kml/$(DEPDIR)/$(am__dirstamp) -rm -f kml/$(am__dirstamp) -rm -f libtiniconv/$(DEPDIR)/$(am__dirstamp) -rm -f libtiniconv/$(am__dirstamp) -rm -f logbook/$(DEPDIR)/$(am__dirstamp) -rm -f logbook/$(am__dirstamp) -rm -f logger/$(DEPDIR)/$(am__dirstamp) -rm -f logger/$(am__dirstamp) -rm -f mbedtls/$(DEPDIR)/$(am__dirstamp) -rm -f mbedtls/$(am__dirstamp) -rm -f mfsk/$(DEPDIR)/$(am__dirstamp) -rm -f mfsk/$(am__dirstamp) -rm -f misc/$(DEPDIR)/$(am__dirstamp) -rm -f misc/$(am__dirstamp) -rm -f mt63/$(DEPDIR)/$(am__dirstamp) -rm -f mt63/$(am__dirstamp) -rm -f navtex/$(DEPDIR)/$(am__dirstamp) -rm -f navtex/$(am__dirstamp) -rm -f network/$(DEPDIR)/$(am__dirstamp) -rm -f network/$(am__dirstamp) -rm -f olivia/$(DEPDIR)/$(am__dirstamp) -rm -f olivia/$(am__dirstamp) -rm -f psk/$(DEPDIR)/$(am__dirstamp) -rm -f psk/$(am__dirstamp) -rm -f psm/$(DEPDIR)/$(am__dirstamp) -rm -f psm/$(am__dirstamp) -rm -f qrunner/$(DEPDIR)/$(am__dirstamp) -rm -f qrunner/$(am__dirstamp) -rm -f rigcontrol/$(DEPDIR)/$(am__dirstamp) -rm -f rigcontrol/$(am__dirstamp) -rm -f rsid/$(DEPDIR)/$(am__dirstamp) -rm -f rsid/$(am__dirstamp) -rm -f rtty/$(DEPDIR)/$(am__dirstamp) -rm -f rtty/$(am__dirstamp) -rm -f soundcard/$(DEPDIR)/$(am__dirstamp) -rm -f soundcard/$(am__dirstamp) -rm -f spot/$(DEPDIR)/$(am__dirstamp) -rm -f spot/$(am__dirstamp) -rm -f ssb/$(DEPDIR)/$(am__dirstamp) -rm -f ssb/$(am__dirstamp) -rm -f status/$(DEPDIR)/$(am__dirstamp) -rm -f status/$(am__dirstamp) -rm -f synop-src/$(DEPDIR)/$(am__dirstamp) -rm -f synop-src/$(am__dirstamp) -rm -f thor/$(DEPDIR)/$(am__dirstamp) -rm -f thor/$(am__dirstamp) -rm -f throb/$(DEPDIR)/$(am__dirstamp) -rm -f throb/$(am__dirstamp) -rm -f trx/$(DEPDIR)/$(am__dirstamp) -rm -f trx/$(am__dirstamp) -rm -f waterfall/$(DEPDIR)/$(am__dirstamp) -rm -f waterfall/$(am__dirstamp) -rm -f wefax/$(DEPDIR)/$(am__dirstamp) -rm -f wefax/$(am__dirstamp) -rm -f widgets/$(DEPDIR)/$(am__dirstamp) -rm -f widgets/$(am__dirstamp) -rm -f wwv/$(DEPDIR)/$(am__dirstamp) -rm -f wwv/$(am__dirstamp) -rm -f xmlrpcpp/$(DEPDIR)/$(am__dirstamp) -rm -f xmlrpcpp/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) @HAVE_ASCIIDOC_FALSE@distclean-local: clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/fldigi-main.Po -rm -f blank/$(DEPDIR)/fldigi-blank.Po -rm -f cmedia/$(DEPDIR)/fldigi-cmedia.Po -rm -f cmedia/$(DEPDIR)/fldigi-hid.Po -rm -f cmedia/$(DEPDIR)/fldigi-hid_lin.Po -rm -f cmedia/$(DEPDIR)/fldigi-hid_mac.Po -rm -f cmedia/$(DEPDIR)/fldigi-hid_win.Po -rm -f combo/$(DEPDIR)/flarq-combo.Po -rm -f combo/$(DEPDIR)/fldigi-combo.Po -rm -f compat/$(DEPDIR)/flarq-getsysinfo.Po -rm -f compat/$(DEPDIR)/flarq-mingw.Po -rm -f compat/$(DEPDIR)/flarq-regex.Po -rm -f compat/$(DEPDIR)/fldigi-getsysinfo.Po -rm -f compat/$(DEPDIR)/fldigi-mingw.Po -rm -f compat/$(DEPDIR)/fldigi-regex.Po -rm -f config_script/$(DEPDIR)/fldigi-create_default_script.Po -rm -f config_script/$(DEPDIR)/fldigi-run_scripts.Po -rm -f config_script/$(DEPDIR)/fldigi-script_parsing.Po -rm -f contestia/$(DEPDIR)/fldigi-contestia.Po -rm -f cw/$(DEPDIR)/fldigi-ICOMkeying.Po -rm -f cw/$(DEPDIR)/fldigi-KYkeying.Po -rm -f cw/$(DEPDIR)/fldigi-Nav.Po -rm -f cw/$(DEPDIR)/fldigi-YAESUkeying.Po -rm -f cw/$(DEPDIR)/fldigi-cw.Po -rm -f cw/$(DEPDIR)/fldigi-morse.Po -rm -f cw/$(DEPDIR)/fldigi-nanoIO.Po -rm -f cw/$(DEPDIR)/fldigi-view_cw.Po -rm -f cw/$(DEPDIR)/fldigi-winkeyer.Po -rm -f debug/$(DEPDIR)/fldigi-debug.Po -rm -f debug/$(DEPDIR)/fldigi-debug_dialog.Po -rm -f dialogs/$(DEPDIR)/flarq-font_browser.Po -rm -f dialogs/$(DEPDIR)/fldigi-Viewer.Po -rm -f dialogs/$(DEPDIR)/fldigi-confdialog.Po -rm -f dialogs/$(DEPDIR)/fldigi-fl_digi.Po -rm -f dialogs/$(DEPDIR)/fldigi-fl_digi_main.Po -rm -f dialogs/$(DEPDIR)/fldigi-font_browser.Po -rm -f dialogs/$(DEPDIR)/fldigi-guide.Po -rm -f dialogs/$(DEPDIR)/fldigi-htmlstrings.Po -rm -f dialogs/$(DEPDIR)/fldigi-notifydialog.Po -rm -f dialogs/$(DEPDIR)/fldigi-record_browse.Po -rm -f dialogs/$(DEPDIR)/fldigi-rxmon.Po -rm -f dialogs/$(DEPDIR)/fldigi-testsigs.Po -rm -f dialogs/$(DEPDIR)/fldigi-tod_clock.Po -rm -f dominoex/$(DEPDIR)/fldigi-dominoex.Po -rm -f dominoex/$(DEPDIR)/fldigi-dominovar.Po -rm -f dtmf/$(DEPDIR)/fldigi-dtmf.Po -rm -f dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Po -rm -f dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Po -rm -f dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Po -rm -f dxcluster/$(DEPDIR)/fldigi-arc-help.Po -rm -f dxcluster/$(DEPDIR)/fldigi-dx_dialog.Po -rm -f dxcluster/$(DEPDIR)/fldigi-dxcluster.Po -rm -f feld/$(DEPDIR)/fldigi-Feld7x7-14.Po -rm -f feld/$(DEPDIR)/fldigi-Feld7x7n-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldDx-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldFat-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldHell-12.Po -rm -f feld/$(DEPDIR)/fldigi-FeldLittle-12.Po -rm -f feld/$(DEPDIR)/fldigi-FeldLo8-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldLow-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldModern-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldModern8-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldNarr-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldReal-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldStyl-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldVert-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldWide-14.Po -rm -f feld/$(DEPDIR)/fldigi-feld.Po -rm -f feld/$(DEPDIR)/fldigi-feldfonts.Po -rm -f fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Po -rm -f fft-monitor/$(DEPDIR)/fldigi-spectrum.Po -rm -f fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Po -rm -f fileselector/$(DEPDIR)/flarq-fileselect.Po -rm -f fileselector/$(DEPDIR)/fldigi-fileselect.Po -rm -f fileselector/$(DEPDIR)/fldigi-flnfc_common.Po -rm -f filters/$(DEPDIR)/fldigi-fftfilt.Po -rm -f filters/$(DEPDIR)/fldigi-filters.Po -rm -f filters/$(DEPDIR)/fldigi-viterbi.Po -rm -f flarq-src/$(DEPDIR)/flarq-arq.Po -rm -f flarq-src/$(DEPDIR)/flarq-arqdialogs.Po -rm -f flarq-src/$(DEPDIR)/flarq-arqhelp.Po -rm -f flarq-src/$(DEPDIR)/flarq-b64.Po -rm -f flarq-src/$(DEPDIR)/flarq-flarq.Po -rm -f flarq-src/$(DEPDIR)/flarq-flarqenv.Po -rm -f flarq-src/$(DEPDIR)/flarq-xml_server.Po -rm -f fmt/$(DEPDIR)/fldigi-fmt.Po -rm -f fmt/$(DEPDIR)/fldigi-fmt_dialog.Po -rm -f fsq/$(DEPDIR)/fldigi-bitmaps.Po -rm -f fsq/$(DEPDIR)/fldigi-fsq-pic.Po -rm -f fsq/$(DEPDIR)/fldigi-fsq.Po -rm -f fsq/$(DEPDIR)/fldigi-fsq_monitor.Po -rm -f fsq/$(DEPDIR)/fldigi-fsq_varicode.Po -rm -f globals/$(DEPDIR)/fldigi-globals.Po -rm -f ifkp/$(DEPDIR)/fldigi-ifkp-pic.Po -rm -f ifkp/$(DEPDIR)/fldigi-ifkp.Po -rm -f ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Po -rm -f ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Po -rm -f ifkp/$(DEPDIR)/fldigi-tux.Po -rm -f irrxml/$(DEPDIR)/fldigi-irrXML.Po -rm -f kml/$(DEPDIR)/fldigi-kmlserver.Po -rm -f libtiniconv/$(DEPDIR)/fldigi-tiniconv.Po -rm -f libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Po -rm -f logbook/$(DEPDIR)/flarq-table.Po -rm -f logbook/$(DEPDIR)/fldigi-adif_io.Po -rm -f logbook/$(DEPDIR)/fldigi-calendar.Po -rm -f logbook/$(DEPDIR)/fldigi-contest.Po -rm -f logbook/$(DEPDIR)/fldigi-counties.Po -rm -f logbook/$(DEPDIR)/fldigi-county_lists.Po -rm -f logbook/$(DEPDIR)/fldigi-cty-dat.Po -rm -f logbook/$(DEPDIR)/fldigi-date.Po -rm -f logbook/$(DEPDIR)/fldigi-fd_logger.Po -rm -f logbook/$(DEPDIR)/fldigi-fd_view.Po -rm -f logbook/$(DEPDIR)/fldigi-lgbook.Po -rm -f logbook/$(DEPDIR)/fldigi-logbook.Po -rm -f logbook/$(DEPDIR)/fldigi-logsupport.Po -rm -f logbook/$(DEPDIR)/fldigi-lookupcall.Po -rm -f logbook/$(DEPDIR)/fldigi-maclogger.Po -rm -f logbook/$(DEPDIR)/fldigi-n3fjp_logger.Po -rm -f logbook/$(DEPDIR)/fldigi-qrzlib.Po -rm -f logbook/$(DEPDIR)/fldigi-qso_db.Po -rm -f logbook/$(DEPDIR)/fldigi-table.Po -rm -f logbook/$(DEPDIR)/fldigi-textio.Po -rm -f logbook/$(DEPDIR)/fldigi-xmlrpc_log.Po -rm -f logger/$(DEPDIR)/fldigi-logger.Po -rm -f logger/$(DEPDIR)/fldigi-rx_extract.Po -rm -f logger/$(DEPDIR)/fldigi-speak.Po -rm -f mbedtls/$(DEPDIR)/fldigi-aes.Po -rm -f mbedtls/$(DEPDIR)/fldigi-aesni.Po -rm -f mbedtls/$(DEPDIR)/fldigi-arc4.Po -rm -f mbedtls/$(DEPDIR)/fldigi-aria.Po -rm -f mbedtls/$(DEPDIR)/fldigi-asn1parse.Po -rm -f mbedtls/$(DEPDIR)/fldigi-asn1write.Po -rm -f mbedtls/$(DEPDIR)/fldigi-base64.Po -rm -f mbedtls/$(DEPDIR)/fldigi-bignum.Po -rm -f mbedtls/$(DEPDIR)/fldigi-blowfish.Po -rm -f mbedtls/$(DEPDIR)/fldigi-camellia.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ccm.Po -rm -f mbedtls/$(DEPDIR)/fldigi-certs.Po -rm -f mbedtls/$(DEPDIR)/fldigi-chacha20.Po -rm -f mbedtls/$(DEPDIR)/fldigi-chachapoly.Po -rm -f mbedtls/$(DEPDIR)/fldigi-cipher.Po -rm -f mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Po -rm -f mbedtls/$(DEPDIR)/fldigi-cmac.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Po -rm -f mbedtls/$(DEPDIR)/fldigi-debug.Po -rm -f mbedtls/$(DEPDIR)/fldigi-des.Po -rm -f mbedtls/$(DEPDIR)/fldigi-dhm.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecdh.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecdsa.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecjpake.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecp.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecp_curves.Po -rm -f mbedtls/$(DEPDIR)/fldigi-entropy.Po -rm -f mbedtls/$(DEPDIR)/fldigi-entropy_poll.Po -rm -f mbedtls/$(DEPDIR)/fldigi-error.Po -rm -f mbedtls/$(DEPDIR)/fldigi-gcm.Po -rm -f mbedtls/$(DEPDIR)/fldigi-havege.Po -rm -f mbedtls/$(DEPDIR)/fldigi-hkdf.Po -rm -f mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md2.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md4.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md5.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md_wrap.Po -rm -f mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Po -rm -f mbedtls/$(DEPDIR)/fldigi-net_sockets.Po -rm -f mbedtls/$(DEPDIR)/fldigi-nist_kw.Po -rm -f mbedtls/$(DEPDIR)/fldigi-oid.Po -rm -f mbedtls/$(DEPDIR)/fldigi-padlock.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pem.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pk.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pk_wrap.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkcs11.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkcs12.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkcs5.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkparse.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkwrite.Po -rm -f mbedtls/$(DEPDIR)/fldigi-platform.Po -rm -f mbedtls/$(DEPDIR)/fldigi-platform_util.Po -rm -f mbedtls/$(DEPDIR)/fldigi-poly1305.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ripemd160.Po -rm -f mbedtls/$(DEPDIR)/fldigi-rsa.Po -rm -f mbedtls/$(DEPDIR)/fldigi-rsa_internal.Po -rm -f mbedtls/$(DEPDIR)/fldigi-sha1.Po -rm -f mbedtls/$(DEPDIR)/fldigi-sha256.Po -rm -f mbedtls/$(DEPDIR)/fldigi-sha512.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_cache.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_cli.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_srv.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_tls.Po -rm -f mbedtls/$(DEPDIR)/fldigi-threading.Po -rm -f mbedtls/$(DEPDIR)/fldigi-timing.Po -rm -f mbedtls/$(DEPDIR)/fldigi-version.Po -rm -f mbedtls/$(DEPDIR)/fldigi-version_features.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509_create.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509_crl.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509_crt.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509_csr.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509write_crt.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509write_csr.Po -rm -f mbedtls/$(DEPDIR)/fldigi-xtea.Po -rm -f mfsk/$(DEPDIR)/fldigi-interleave.Po -rm -f mfsk/$(DEPDIR)/fldigi-mfsk-pic.Po -rm -f mfsk/$(DEPDIR)/fldigi-mfsk.Po -rm -f mfsk/$(DEPDIR)/fldigi-mfskvaricode.Po -rm -f misc/$(DEPDIR)/flarq-ascii.Po -rm -f misc/$(DEPDIR)/flarq-icons.Po -rm -f misc/$(DEPDIR)/flarq-nls.Po -rm -f misc/$(DEPDIR)/flarq-pixmaps.Po -rm -f misc/$(DEPDIR)/flarq-pixmaps_tango.Po -rm -f misc/$(DEPDIR)/flarq-re.Po -rm -f misc/$(DEPDIR)/flarq-stack.Po -rm -f misc/$(DEPDIR)/flarq-stacktrace.Po -rm -f misc/$(DEPDIR)/flarq-threads.Po -rm -f misc/$(DEPDIR)/flarq-timeops.Po -rm -f misc/$(DEPDIR)/flarq-util.Po -rm -f misc/$(DEPDIR)/fldigi-arq_io.Po -rm -f misc/$(DEPDIR)/fldigi-ascii.Po -rm -f misc/$(DEPDIR)/fldigi-ax25_decode.Po -rm -f misc/$(DEPDIR)/fldigi-benchmark.Po -rm -f misc/$(DEPDIR)/fldigi-charsetdistiller.Po -rm -f misc/$(DEPDIR)/fldigi-charsetlist.Po -rm -f misc/$(DEPDIR)/fldigi-configuration.Po -rm -f misc/$(DEPDIR)/fldigi-coordinate.Po -rm -f misc/$(DEPDIR)/fldigi-dxcc.Po -rm -f misc/$(DEPDIR)/fldigi-estrings.Po -rm -f misc/$(DEPDIR)/fldigi-icons.Po -rm -f misc/$(DEPDIR)/fldigi-kiss_io.Po -rm -f misc/$(DEPDIR)/fldigi-locator.Po -rm -f misc/$(DEPDIR)/fldigi-log.Po -rm -f misc/$(DEPDIR)/fldigi-macroedit.Po -rm -f misc/$(DEPDIR)/fldigi-macros.Po -rm -f misc/$(DEPDIR)/fldigi-misc.Po -rm -f misc/$(DEPDIR)/fldigi-newinstall.Po -rm -f misc/$(DEPDIR)/fldigi-nls.Po -rm -f misc/$(DEPDIR)/fldigi-outputencoder.Po -rm -f misc/$(DEPDIR)/fldigi-pixmaps.Po -rm -f misc/$(DEPDIR)/fldigi-pixmaps_tango.Po -rm -f misc/$(DEPDIR)/fldigi-re.Po -rm -f misc/$(DEPDIR)/fldigi-record_loader.Po -rm -f misc/$(DEPDIR)/fldigi-stack.Po -rm -f misc/$(DEPDIR)/fldigi-stacktrace.Po -rm -f misc/$(DEPDIR)/fldigi-strutil.Po -rm -f misc/$(DEPDIR)/fldigi-threads.Po -rm -f misc/$(DEPDIR)/fldigi-timeops.Po -rm -f misc/$(DEPDIR)/fldigi-utf8file_io.Po -rm -f misc/$(DEPDIR)/fldigi-util.Po -rm -f mt63/$(DEPDIR)/fldigi-dsp.Po -rm -f mt63/$(DEPDIR)/fldigi-mt63.Po -rm -f mt63/$(DEPDIR)/fldigi-mt63base.Po -rm -f navtex/$(DEPDIR)/fldigi-navtex.Po -rm -f network/$(DEPDIR)/flarq-socket.Po -rm -f network/$(DEPDIR)/fldigi-ca_cert.Po -rm -f network/$(DEPDIR)/fldigi-metar.Po -rm -f network/$(DEPDIR)/fldigi-network.Po -rm -f network/$(DEPDIR)/fldigi-socket.Po -rm -f network/$(DEPDIR)/fldigi-weather.Po -rm -f network/$(DEPDIR)/fldigi-xmlrpc.Po -rm -f olivia/$(DEPDIR)/fldigi-olivia.Po -rm -f psk/$(DEPDIR)/fldigi-psk.Po -rm -f psk/$(DEPDIR)/fldigi-pskcoeff.Po -rm -f psk/$(DEPDIR)/fldigi-pskeval.Po -rm -f psk/$(DEPDIR)/fldigi-pskvaricode.Po -rm -f psk/$(DEPDIR)/fldigi-viewpsk.Po -rm -f psm/$(DEPDIR)/fldigi-psm.Po -rm -f qrunner/$(DEPDIR)/fldigi-qrunner.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-FreqControl.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-hamlib.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-norig.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-ptt.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-rigclass.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-rigio.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-rigsupport.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-rigxml.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-serial.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Po -rm -f rsid/$(DEPDIR)/fldigi-rsid.Po -rm -f rsid/$(DEPDIR)/fldigi-rsid_defs.Po -rm -f rtty/$(DEPDIR)/fldigi-fsk.Po -rm -f rtty/$(DEPDIR)/fldigi-rtty.Po -rm -f rtty/$(DEPDIR)/fldigi-view_rtty.Po -rm -f soundcard/$(DEPDIR)/fldigi-audio_alert.Po -rm -f soundcard/$(DEPDIR)/fldigi-bark.Po -rm -f soundcard/$(DEPDIR)/fldigi-checkout.Po -rm -f soundcard/$(DEPDIR)/fldigi-diesel.Po -rm -f soundcard/$(DEPDIR)/fldigi-dinnerbell.Po -rm -f soundcard/$(DEPDIR)/fldigi-doesnot.Po -rm -f soundcard/$(DEPDIR)/fldigi-play.pa.Po -rm -f soundcard/$(DEPDIR)/fldigi-sound.Po -rm -f soundcard/$(DEPDIR)/fldigi-soundconf.Po -rm -f soundcard/$(DEPDIR)/fldigi-steam_train.Po -rm -f soundcard/$(DEPDIR)/fldigi-ttybell.Po -rm -f spot/$(DEPDIR)/fldigi-notify.Po -rm -f spot/$(DEPDIR)/fldigi-pskrep.Po -rm -f spot/$(DEPDIR)/fldigi-spot.Po -rm -f ssb/$(DEPDIR)/fldigi-ssb.Po -rm -f status/$(DEPDIR)/fldigi-squelch_status.Po -rm -f status/$(DEPDIR)/fldigi-status.Po -rm -f synop-src/$(DEPDIR)/fldigi-synop.Po -rm -f thor/$(DEPDIR)/fldigi-thor-pic.Po -rm -f thor/$(DEPDIR)/fldigi-thor.Po -rm -f thor/$(DEPDIR)/fldigi-thorvaricode.Po -rm -f throb/$(DEPDIR)/fldigi-throb.Po -rm -f trx/$(DEPDIR)/fldigi-modem.Po -rm -f trx/$(DEPDIR)/fldigi-nullmodem.Po -rm -f trx/$(DEPDIR)/fldigi-test_signal.Po -rm -f trx/$(DEPDIR)/fldigi-trx.Po -rm -f trx/$(DEPDIR)/fldigi-tune.Po -rm -f waterfall/$(DEPDIR)/fldigi-colorbox.Po -rm -f waterfall/$(DEPDIR)/fldigi-digiscope.Po -rm -f waterfall/$(DEPDIR)/fldigi-raster.Po -rm -f waterfall/$(DEPDIR)/fldigi-waterfall.Po -rm -f wefax/$(DEPDIR)/fldigi-wefax-pic.Po -rm -f wefax/$(DEPDIR)/fldigi-wefax.Po -rm -f wefax/$(DEPDIR)/fldigi-wefax_map.Po -rm -f widgets/$(DEPDIR)/flarq-FTextView.Po -rm -f widgets/$(DEPDIR)/flarq-F_Edit.Po -rm -f widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po -rm -f widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Po -rm -f widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po -rm -f widgets/$(DEPDIR)/flarq-flinput2.Po -rm -f widgets/$(DEPDIR)/flarq-flmisc.Po -rm -f widgets/$(DEPDIR)/flarq-flslider2.Po -rm -f widgets/$(DEPDIR)/fldigi-FTextRXTX.Po -rm -f widgets/$(DEPDIR)/fldigi-FTextView.Po -rm -f widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po -rm -f widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po -rm -f widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po -rm -f widgets/$(DEPDIR)/fldigi-Panel.Po -rm -f widgets/$(DEPDIR)/fldigi-flinput2.Po -rm -f widgets/$(DEPDIR)/fldigi-flmisc.Po -rm -f widgets/$(DEPDIR)/fldigi-flslider2.Po -rm -f widgets/$(DEPDIR)/fldigi-picture.Po -rm -f widgets/$(DEPDIR)/fldigi-plot_xy.Po -rm -f widgets/$(DEPDIR)/fldigi-progress.Po -rm -f widgets/$(DEPDIR)/fldigi-psk_browser.Po -rm -f widgets/$(DEPDIR)/fldigi-pwrmeter.Po -rm -f widgets/$(DEPDIR)/fldigi-smeter.Po -rm -f widgets/$(DEPDIR)/fldigi-vumeter.Po -rm -f wwv/$(DEPDIR)/fldigi-analysis.Po -rm -f wwv/$(DEPDIR)/fldigi-wwv.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-data-local install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS install-exec-local install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: installcheck-binPROGRAMS maintainer-clean: maintainer-clean-recursive -rm -f ./$(DEPDIR)/fldigi-main.Po -rm -f blank/$(DEPDIR)/fldigi-blank.Po -rm -f cmedia/$(DEPDIR)/fldigi-cmedia.Po -rm -f cmedia/$(DEPDIR)/fldigi-hid.Po -rm -f cmedia/$(DEPDIR)/fldigi-hid_lin.Po -rm -f cmedia/$(DEPDIR)/fldigi-hid_mac.Po -rm -f cmedia/$(DEPDIR)/fldigi-hid_win.Po -rm -f combo/$(DEPDIR)/flarq-combo.Po -rm -f combo/$(DEPDIR)/fldigi-combo.Po -rm -f compat/$(DEPDIR)/flarq-getsysinfo.Po -rm -f compat/$(DEPDIR)/flarq-mingw.Po -rm -f compat/$(DEPDIR)/flarq-regex.Po -rm -f compat/$(DEPDIR)/fldigi-getsysinfo.Po -rm -f compat/$(DEPDIR)/fldigi-mingw.Po -rm -f compat/$(DEPDIR)/fldigi-regex.Po -rm -f config_script/$(DEPDIR)/fldigi-create_default_script.Po -rm -f config_script/$(DEPDIR)/fldigi-run_scripts.Po -rm -f config_script/$(DEPDIR)/fldigi-script_parsing.Po -rm -f contestia/$(DEPDIR)/fldigi-contestia.Po -rm -f cw/$(DEPDIR)/fldigi-ICOMkeying.Po -rm -f cw/$(DEPDIR)/fldigi-KYkeying.Po -rm -f cw/$(DEPDIR)/fldigi-Nav.Po -rm -f cw/$(DEPDIR)/fldigi-YAESUkeying.Po -rm -f cw/$(DEPDIR)/fldigi-cw.Po -rm -f cw/$(DEPDIR)/fldigi-morse.Po -rm -f cw/$(DEPDIR)/fldigi-nanoIO.Po -rm -f cw/$(DEPDIR)/fldigi-view_cw.Po -rm -f cw/$(DEPDIR)/fldigi-winkeyer.Po -rm -f debug/$(DEPDIR)/fldigi-debug.Po -rm -f debug/$(DEPDIR)/fldigi-debug_dialog.Po -rm -f dialogs/$(DEPDIR)/flarq-font_browser.Po -rm -f dialogs/$(DEPDIR)/fldigi-Viewer.Po -rm -f dialogs/$(DEPDIR)/fldigi-confdialog.Po -rm -f dialogs/$(DEPDIR)/fldigi-fl_digi.Po -rm -f dialogs/$(DEPDIR)/fldigi-fl_digi_main.Po -rm -f dialogs/$(DEPDIR)/fldigi-font_browser.Po -rm -f dialogs/$(DEPDIR)/fldigi-guide.Po -rm -f dialogs/$(DEPDIR)/fldigi-htmlstrings.Po -rm -f dialogs/$(DEPDIR)/fldigi-notifydialog.Po -rm -f dialogs/$(DEPDIR)/fldigi-record_browse.Po -rm -f dialogs/$(DEPDIR)/fldigi-rxmon.Po -rm -f dialogs/$(DEPDIR)/fldigi-testsigs.Po -rm -f dialogs/$(DEPDIR)/fldigi-tod_clock.Po -rm -f dominoex/$(DEPDIR)/fldigi-dominoex.Po -rm -f dominoex/$(DEPDIR)/fldigi-dominovar.Po -rm -f dtmf/$(DEPDIR)/fldigi-dtmf.Po -rm -f dxcluster/$(DEPDIR)/fldigi-CCC_Commands.Po -rm -f dxcluster/$(DEPDIR)/fldigi-DXClusterServers.Po -rm -f dxcluster/$(DEPDIR)/fldigi-DXSpiderCommandReference.Po -rm -f dxcluster/$(DEPDIR)/fldigi-arc-help.Po -rm -f dxcluster/$(DEPDIR)/fldigi-dx_dialog.Po -rm -f dxcluster/$(DEPDIR)/fldigi-dxcluster.Po -rm -f feld/$(DEPDIR)/fldigi-Feld7x7-14.Po -rm -f feld/$(DEPDIR)/fldigi-Feld7x7n-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldDx-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldFat-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldHell-12.Po -rm -f feld/$(DEPDIR)/fldigi-FeldLittle-12.Po -rm -f feld/$(DEPDIR)/fldigi-FeldLo8-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldLow-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldModern-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldModern8-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldNarr-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldReal-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldStyl-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldVert-14.Po -rm -f feld/$(DEPDIR)/fldigi-FeldWide-14.Po -rm -f feld/$(DEPDIR)/fldigi-feld.Po -rm -f feld/$(DEPDIR)/fldigi-feldfonts.Po -rm -f fft-monitor/$(DEPDIR)/fldigi-fft-monitor.Po -rm -f fft-monitor/$(DEPDIR)/fldigi-spectrum.Po -rm -f fft-monitor/$(DEPDIR)/fldigi-spectrum_viewer.Po -rm -f fileselector/$(DEPDIR)/flarq-fileselect.Po -rm -f fileselector/$(DEPDIR)/fldigi-fileselect.Po -rm -f fileselector/$(DEPDIR)/fldigi-flnfc_common.Po -rm -f filters/$(DEPDIR)/fldigi-fftfilt.Po -rm -f filters/$(DEPDIR)/fldigi-filters.Po -rm -f filters/$(DEPDIR)/fldigi-viterbi.Po -rm -f flarq-src/$(DEPDIR)/flarq-arq.Po -rm -f flarq-src/$(DEPDIR)/flarq-arqdialogs.Po -rm -f flarq-src/$(DEPDIR)/flarq-arqhelp.Po -rm -f flarq-src/$(DEPDIR)/flarq-b64.Po -rm -f flarq-src/$(DEPDIR)/flarq-flarq.Po -rm -f flarq-src/$(DEPDIR)/flarq-flarqenv.Po -rm -f flarq-src/$(DEPDIR)/flarq-xml_server.Po -rm -f fmt/$(DEPDIR)/fldigi-fmt.Po -rm -f fmt/$(DEPDIR)/fldigi-fmt_dialog.Po -rm -f fsq/$(DEPDIR)/fldigi-bitmaps.Po -rm -f fsq/$(DEPDIR)/fldigi-fsq-pic.Po -rm -f fsq/$(DEPDIR)/fldigi-fsq.Po -rm -f fsq/$(DEPDIR)/fldigi-fsq_monitor.Po -rm -f fsq/$(DEPDIR)/fldigi-fsq_varicode.Po -rm -f globals/$(DEPDIR)/fldigi-globals.Po -rm -f ifkp/$(DEPDIR)/fldigi-ifkp-pic.Po -rm -f ifkp/$(DEPDIR)/fldigi-ifkp.Po -rm -f ifkp/$(DEPDIR)/fldigi-ifkp_bitmaps.Po -rm -f ifkp/$(DEPDIR)/fldigi-ifkp_varicode.Po -rm -f ifkp/$(DEPDIR)/fldigi-tux.Po -rm -f irrxml/$(DEPDIR)/fldigi-irrXML.Po -rm -f kml/$(DEPDIR)/fldigi-kmlserver.Po -rm -f libtiniconv/$(DEPDIR)/fldigi-tiniconv.Po -rm -f libtiniconv/$(DEPDIR)/fldigi-tiniconv_desc.Po -rm -f logbook/$(DEPDIR)/flarq-table.Po -rm -f logbook/$(DEPDIR)/fldigi-adif_io.Po -rm -f logbook/$(DEPDIR)/fldigi-calendar.Po -rm -f logbook/$(DEPDIR)/fldigi-contest.Po -rm -f logbook/$(DEPDIR)/fldigi-counties.Po -rm -f logbook/$(DEPDIR)/fldigi-county_lists.Po -rm -f logbook/$(DEPDIR)/fldigi-cty-dat.Po -rm -f logbook/$(DEPDIR)/fldigi-date.Po -rm -f logbook/$(DEPDIR)/fldigi-fd_logger.Po -rm -f logbook/$(DEPDIR)/fldigi-fd_view.Po -rm -f logbook/$(DEPDIR)/fldigi-lgbook.Po -rm -f logbook/$(DEPDIR)/fldigi-logbook.Po -rm -f logbook/$(DEPDIR)/fldigi-logsupport.Po -rm -f logbook/$(DEPDIR)/fldigi-lookupcall.Po -rm -f logbook/$(DEPDIR)/fldigi-maclogger.Po -rm -f logbook/$(DEPDIR)/fldigi-n3fjp_logger.Po -rm -f logbook/$(DEPDIR)/fldigi-qrzlib.Po -rm -f logbook/$(DEPDIR)/fldigi-qso_db.Po -rm -f logbook/$(DEPDIR)/fldigi-table.Po -rm -f logbook/$(DEPDIR)/fldigi-textio.Po -rm -f logbook/$(DEPDIR)/fldigi-xmlrpc_log.Po -rm -f logger/$(DEPDIR)/fldigi-logger.Po -rm -f logger/$(DEPDIR)/fldigi-rx_extract.Po -rm -f logger/$(DEPDIR)/fldigi-speak.Po -rm -f mbedtls/$(DEPDIR)/fldigi-aes.Po -rm -f mbedtls/$(DEPDIR)/fldigi-aesni.Po -rm -f mbedtls/$(DEPDIR)/fldigi-arc4.Po -rm -f mbedtls/$(DEPDIR)/fldigi-aria.Po -rm -f mbedtls/$(DEPDIR)/fldigi-asn1parse.Po -rm -f mbedtls/$(DEPDIR)/fldigi-asn1write.Po -rm -f mbedtls/$(DEPDIR)/fldigi-base64.Po -rm -f mbedtls/$(DEPDIR)/fldigi-bignum.Po -rm -f mbedtls/$(DEPDIR)/fldigi-blowfish.Po -rm -f mbedtls/$(DEPDIR)/fldigi-camellia.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ccm.Po -rm -f mbedtls/$(DEPDIR)/fldigi-certs.Po -rm -f mbedtls/$(DEPDIR)/fldigi-chacha20.Po -rm -f mbedtls/$(DEPDIR)/fldigi-chachapoly.Po -rm -f mbedtls/$(DEPDIR)/fldigi-cipher.Po -rm -f mbedtls/$(DEPDIR)/fldigi-cipher_wrap.Po -rm -f mbedtls/$(DEPDIR)/fldigi-cmac.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ctr_drbg.Po -rm -f mbedtls/$(DEPDIR)/fldigi-debug.Po -rm -f mbedtls/$(DEPDIR)/fldigi-des.Po -rm -f mbedtls/$(DEPDIR)/fldigi-dhm.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecdh.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecdsa.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecjpake.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecp.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ecp_curves.Po -rm -f mbedtls/$(DEPDIR)/fldigi-entropy.Po -rm -f mbedtls/$(DEPDIR)/fldigi-entropy_poll.Po -rm -f mbedtls/$(DEPDIR)/fldigi-error.Po -rm -f mbedtls/$(DEPDIR)/fldigi-gcm.Po -rm -f mbedtls/$(DEPDIR)/fldigi-havege.Po -rm -f mbedtls/$(DEPDIR)/fldigi-hkdf.Po -rm -f mbedtls/$(DEPDIR)/fldigi-hmac_drbg.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md2.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md4.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md5.Po -rm -f mbedtls/$(DEPDIR)/fldigi-md_wrap.Po -rm -f mbedtls/$(DEPDIR)/fldigi-memory_buffer_alloc.Po -rm -f mbedtls/$(DEPDIR)/fldigi-net_sockets.Po -rm -f mbedtls/$(DEPDIR)/fldigi-nist_kw.Po -rm -f mbedtls/$(DEPDIR)/fldigi-oid.Po -rm -f mbedtls/$(DEPDIR)/fldigi-padlock.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pem.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pk.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pk_wrap.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkcs11.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkcs12.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkcs5.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkparse.Po -rm -f mbedtls/$(DEPDIR)/fldigi-pkwrite.Po -rm -f mbedtls/$(DEPDIR)/fldigi-platform.Po -rm -f mbedtls/$(DEPDIR)/fldigi-platform_util.Po -rm -f mbedtls/$(DEPDIR)/fldigi-poly1305.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ripemd160.Po -rm -f mbedtls/$(DEPDIR)/fldigi-rsa.Po -rm -f mbedtls/$(DEPDIR)/fldigi-rsa_internal.Po -rm -f mbedtls/$(DEPDIR)/fldigi-sha1.Po -rm -f mbedtls/$(DEPDIR)/fldigi-sha256.Po -rm -f mbedtls/$(DEPDIR)/fldigi-sha512.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_cache.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_ciphersuites.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_cli.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_cookie.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_srv.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_ticket.Po -rm -f mbedtls/$(DEPDIR)/fldigi-ssl_tls.Po -rm -f mbedtls/$(DEPDIR)/fldigi-threading.Po -rm -f mbedtls/$(DEPDIR)/fldigi-timing.Po -rm -f mbedtls/$(DEPDIR)/fldigi-version.Po -rm -f mbedtls/$(DEPDIR)/fldigi-version_features.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509_create.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509_crl.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509_crt.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509_csr.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509write_crt.Po -rm -f mbedtls/$(DEPDIR)/fldigi-x509write_csr.Po -rm -f mbedtls/$(DEPDIR)/fldigi-xtea.Po -rm -f mfsk/$(DEPDIR)/fldigi-interleave.Po -rm -f mfsk/$(DEPDIR)/fldigi-mfsk-pic.Po -rm -f mfsk/$(DEPDIR)/fldigi-mfsk.Po -rm -f mfsk/$(DEPDIR)/fldigi-mfskvaricode.Po -rm -f misc/$(DEPDIR)/flarq-ascii.Po -rm -f misc/$(DEPDIR)/flarq-icons.Po -rm -f misc/$(DEPDIR)/flarq-nls.Po -rm -f misc/$(DEPDIR)/flarq-pixmaps.Po -rm -f misc/$(DEPDIR)/flarq-pixmaps_tango.Po -rm -f misc/$(DEPDIR)/flarq-re.Po -rm -f misc/$(DEPDIR)/flarq-stack.Po -rm -f misc/$(DEPDIR)/flarq-stacktrace.Po -rm -f misc/$(DEPDIR)/flarq-threads.Po -rm -f misc/$(DEPDIR)/flarq-timeops.Po -rm -f misc/$(DEPDIR)/flarq-util.Po -rm -f misc/$(DEPDIR)/fldigi-arq_io.Po -rm -f misc/$(DEPDIR)/fldigi-ascii.Po -rm -f misc/$(DEPDIR)/fldigi-ax25_decode.Po -rm -f misc/$(DEPDIR)/fldigi-benchmark.Po -rm -f misc/$(DEPDIR)/fldigi-charsetdistiller.Po -rm -f misc/$(DEPDIR)/fldigi-charsetlist.Po -rm -f misc/$(DEPDIR)/fldigi-configuration.Po -rm -f misc/$(DEPDIR)/fldigi-coordinate.Po -rm -f misc/$(DEPDIR)/fldigi-dxcc.Po -rm -f misc/$(DEPDIR)/fldigi-estrings.Po -rm -f misc/$(DEPDIR)/fldigi-icons.Po -rm -f misc/$(DEPDIR)/fldigi-kiss_io.Po -rm -f misc/$(DEPDIR)/fldigi-locator.Po -rm -f misc/$(DEPDIR)/fldigi-log.Po -rm -f misc/$(DEPDIR)/fldigi-macroedit.Po -rm -f misc/$(DEPDIR)/fldigi-macros.Po -rm -f misc/$(DEPDIR)/fldigi-misc.Po -rm -f misc/$(DEPDIR)/fldigi-newinstall.Po -rm -f misc/$(DEPDIR)/fldigi-nls.Po -rm -f misc/$(DEPDIR)/fldigi-outputencoder.Po -rm -f misc/$(DEPDIR)/fldigi-pixmaps.Po -rm -f misc/$(DEPDIR)/fldigi-pixmaps_tango.Po -rm -f misc/$(DEPDIR)/fldigi-re.Po -rm -f misc/$(DEPDIR)/fldigi-record_loader.Po -rm -f misc/$(DEPDIR)/fldigi-stack.Po -rm -f misc/$(DEPDIR)/fldigi-stacktrace.Po -rm -f misc/$(DEPDIR)/fldigi-strutil.Po -rm -f misc/$(DEPDIR)/fldigi-threads.Po -rm -f misc/$(DEPDIR)/fldigi-timeops.Po -rm -f misc/$(DEPDIR)/fldigi-utf8file_io.Po -rm -f misc/$(DEPDIR)/fldigi-util.Po -rm -f mt63/$(DEPDIR)/fldigi-dsp.Po -rm -f mt63/$(DEPDIR)/fldigi-mt63.Po -rm -f mt63/$(DEPDIR)/fldigi-mt63base.Po -rm -f navtex/$(DEPDIR)/fldigi-navtex.Po -rm -f network/$(DEPDIR)/flarq-socket.Po -rm -f network/$(DEPDIR)/fldigi-ca_cert.Po -rm -f network/$(DEPDIR)/fldigi-metar.Po -rm -f network/$(DEPDIR)/fldigi-network.Po -rm -f network/$(DEPDIR)/fldigi-socket.Po -rm -f network/$(DEPDIR)/fldigi-weather.Po -rm -f network/$(DEPDIR)/fldigi-xmlrpc.Po -rm -f olivia/$(DEPDIR)/fldigi-olivia.Po -rm -f psk/$(DEPDIR)/fldigi-psk.Po -rm -f psk/$(DEPDIR)/fldigi-pskcoeff.Po -rm -f psk/$(DEPDIR)/fldigi-pskeval.Po -rm -f psk/$(DEPDIR)/fldigi-pskvaricode.Po -rm -f psk/$(DEPDIR)/fldigi-viewpsk.Po -rm -f psm/$(DEPDIR)/fldigi-psm.Po -rm -f qrunner/$(DEPDIR)/fldigi-qrunner.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-FreqControl.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-hamlib.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-norig.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-ptt.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-rigclass.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-rigio.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-rigsupport.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-rigxml.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-serial.Po -rm -f rigcontrol/$(DEPDIR)/fldigi-xmlrpc_rig.Po -rm -f rsid/$(DEPDIR)/fldigi-rsid.Po -rm -f rsid/$(DEPDIR)/fldigi-rsid_defs.Po -rm -f rtty/$(DEPDIR)/fldigi-fsk.Po -rm -f rtty/$(DEPDIR)/fldigi-rtty.Po -rm -f rtty/$(DEPDIR)/fldigi-view_rtty.Po -rm -f soundcard/$(DEPDIR)/fldigi-audio_alert.Po -rm -f soundcard/$(DEPDIR)/fldigi-bark.Po -rm -f soundcard/$(DEPDIR)/fldigi-checkout.Po -rm -f soundcard/$(DEPDIR)/fldigi-diesel.Po -rm -f soundcard/$(DEPDIR)/fldigi-dinnerbell.Po -rm -f soundcard/$(DEPDIR)/fldigi-doesnot.Po -rm -f soundcard/$(DEPDIR)/fldigi-play.pa.Po -rm -f soundcard/$(DEPDIR)/fldigi-sound.Po -rm -f soundcard/$(DEPDIR)/fldigi-soundconf.Po -rm -f soundcard/$(DEPDIR)/fldigi-steam_train.Po -rm -f soundcard/$(DEPDIR)/fldigi-ttybell.Po -rm -f spot/$(DEPDIR)/fldigi-notify.Po -rm -f spot/$(DEPDIR)/fldigi-pskrep.Po -rm -f spot/$(DEPDIR)/fldigi-spot.Po -rm -f ssb/$(DEPDIR)/fldigi-ssb.Po -rm -f status/$(DEPDIR)/fldigi-squelch_status.Po -rm -f status/$(DEPDIR)/fldigi-status.Po -rm -f synop-src/$(DEPDIR)/fldigi-synop.Po -rm -f thor/$(DEPDIR)/fldigi-thor-pic.Po -rm -f thor/$(DEPDIR)/fldigi-thor.Po -rm -f thor/$(DEPDIR)/fldigi-thorvaricode.Po -rm -f throb/$(DEPDIR)/fldigi-throb.Po -rm -f trx/$(DEPDIR)/fldigi-modem.Po -rm -f trx/$(DEPDIR)/fldigi-nullmodem.Po -rm -f trx/$(DEPDIR)/fldigi-test_signal.Po -rm -f trx/$(DEPDIR)/fldigi-trx.Po -rm -f trx/$(DEPDIR)/fldigi-tune.Po -rm -f waterfall/$(DEPDIR)/fldigi-colorbox.Po -rm -f waterfall/$(DEPDIR)/fldigi-digiscope.Po -rm -f waterfall/$(DEPDIR)/fldigi-raster.Po -rm -f waterfall/$(DEPDIR)/fldigi-waterfall.Po -rm -f wefax/$(DEPDIR)/fldigi-wefax-pic.Po -rm -f wefax/$(DEPDIR)/fldigi-wefax.Po -rm -f wefax/$(DEPDIR)/fldigi-wefax_map.Po -rm -f widgets/$(DEPDIR)/flarq-FTextView.Po -rm -f widgets/$(DEPDIR)/flarq-F_Edit.Po -rm -f widgets/$(DEPDIR)/flarq-Fl_Text_Buffer_mod.Po -rm -f widgets/$(DEPDIR)/flarq-Fl_Text_Display_mod.Po -rm -f widgets/$(DEPDIR)/flarq-Fl_Text_Editor_mod.Po -rm -f widgets/$(DEPDIR)/flarq-flinput2.Po -rm -f widgets/$(DEPDIR)/flarq-flmisc.Po -rm -f widgets/$(DEPDIR)/flarq-flslider2.Po -rm -f widgets/$(DEPDIR)/fldigi-FTextRXTX.Po -rm -f widgets/$(DEPDIR)/fldigi-FTextView.Po -rm -f widgets/$(DEPDIR)/fldigi-Fl_Text_Buffer_mod.Po -rm -f widgets/$(DEPDIR)/fldigi-Fl_Text_Display_mod.Po -rm -f widgets/$(DEPDIR)/fldigi-Fl_Text_Editor_mod.Po -rm -f widgets/$(DEPDIR)/fldigi-Panel.Po -rm -f widgets/$(DEPDIR)/fldigi-flinput2.Po -rm -f widgets/$(DEPDIR)/fldigi-flmisc.Po -rm -f widgets/$(DEPDIR)/fldigi-flslider2.Po -rm -f widgets/$(DEPDIR)/fldigi-picture.Po -rm -f widgets/$(DEPDIR)/fldigi-plot_xy.Po -rm -f widgets/$(DEPDIR)/fldigi-progress.Po -rm -f widgets/$(DEPDIR)/fldigi-psk_browser.Po -rm -f widgets/$(DEPDIR)/fldigi-pwrmeter.Po -rm -f widgets/$(DEPDIR)/fldigi-smeter.Po -rm -f widgets/$(DEPDIR)/fldigi-vumeter.Po -rm -f wwv/$(DEPDIR)/fldigi-analysis.Po -rm -f wwv/$(DEPDIR)/fldigi-wwv.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcClient.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcDispatch.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcMutex.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServer.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerConnection.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcServerMethod.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSocket.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcSource.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcUtil.Po -rm -f xmlrpcpp/$(DEPDIR)/flarq-XmlRpcValue.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcClient.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcDispatch.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcMutex.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServer.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerConnection.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcServerMethod.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSocket.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcSource.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcUtil.Po -rm -f xmlrpcpp/$(DEPDIR)/fldigi-XmlRpcValue.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-local .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-exec install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles check check-TESTS check-am clean \ clean-binPROGRAMS clean-generic clean-local cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-hdr distclean-local distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am \ install-data-local install-dvi install-dvi-am install-exec \ install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am \ installcheck-binPROGRAMS installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-local .PRECIOUS: Makefile # Define the custom silent rule function @SILENT_CMDS@ .EXPORT_ALL_VARIABLES: appbundle nsisinst hamlib-static @HAVE_WINDRES_TRUE@@WIN32_TRUE@.rc.o: @HAVE_WINDRES_TRUE@@WIN32_TRUE@ $(call silent,WRES ,$@)$(WINDRES) -DRC_BUILD_TIME=\\\"$(shell date +%s)\\\" -I$(srcdir) -I$(srcdir)/include -I$(srcdir)/../data/win32 $< -O coff $@ install-exec-local: @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../scripts/ftp_kml_files.sh; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(bindir); \ @WANT_FLDIGI_TRUE@ $(INSTALL_SCRIPT) $(srcdir)/../scripts/ftp_kml_files.sh $(DESTDIR)/$(bindir); \ @WANT_FLDIGI_TRUE@ fi # TODO: xpm files should probably go to $(datadir)/pixmaps/fldigi instead of $(datadir)/pixmaps install-data-local: @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/fldigi.xpm; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/fldigi.xpm $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/fldigi.desktop; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/fldigi.desktop $(DESTDIR)/$(datadir)/applications; \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/NAVTEX_Stations.csv; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/NAVTEX_Stations.csv $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/nsd_bbsss.txt; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/nsd_bbsss.txt $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/station_table.txt; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/station_table.txt $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/ToR-Stats-SHIP.csv; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/ToR-Stats-SHIP.csv $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../data/wmo_list.txt; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/fldigi; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/wmo_list.txt $(DESTDIR)/$(pkgdatadir); \ @WANT_FLDIGI_TRUE@ fi @WANT_FLDIGI_TRUE@ if test -f $(srcdir)/../kml/styles.kml; then \ @WANT_FLDIGI_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(pkgdatadir)/kml; \ @WANT_FLDIGI_TRUE@ $(INSTALL_DATA) $(srcdir)/../kml/styles.kml $(DESTDIR)/$(pkgdatadir)/kml; \ @WANT_FLDIGI_TRUE@ fi @WANT_FLARQ_TRUE@ if test -f $(srcdir)/../data/flarq.xpm; then \ @WANT_FLARQ_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLARQ_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/flarq.xpm $(DESTDIR)/$(datadir)/pixmaps; \ @WANT_FLARQ_TRUE@ fi @WANT_FLARQ_TRUE@ if test -f $(srcdir)/../data/flarq.desktop; then \ @WANT_FLARQ_TRUE@ $(mkinstalldirs) $(DESTDIR)/$(datadir)/applications; \ @WANT_FLARQ_TRUE@ $(INSTALL_DATA) $(srcdir)/../data/flarq.desktop $(DESTDIR)/$(datadir)/applications; \ @WANT_FLARQ_TRUE@ fi uninstall-local: @WANT_FLDIGI_TRUE@ rm -f $(DESTDIR)/$(datadir)/pixmaps/fldigi.xpm @WANT_FLDIGI_TRUE@ rm -f $(DESTDIR)/$(datadir)/applications/fldigi.desktop @WANT_FLDIGI_TRUE@ rm -fr $(DESTDIR)/$(datadir)/fldigi @WANT_FLARQ_TRUE@ rm -f $(DESTDIR)/$(datadir)/pixmaps/flarq.xpm @WANT_FLARQ_TRUE@ rm -f $(DESTDIR)/$(datadir)/applications/flarq.desktop @HAVE_FLUID_TRUE@flgen: $(FLDIGI_FL_SRC) $(FLARQ_FL_SRC) @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ $(call silent,FLUID ,$(FLDIGI_FL_SRC))(cd $(srcdir)/include; \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ for f in $(FLDIGI_FL_SRC); do \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ $(FLUID) -c -o ../$$c -h $$h ../$$f; \ @HAVE_FLUID_TRUE@@WANT_FLDIGI_TRUE@ done) @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ $(call silent,FLUID ,$(FLARQ_FL_SRC))(cd $(srcdir)/flarq-src/include; \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ for f in $(FLARQ_FL_SRC); do \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ c=$${f%.fl}.cxx; h=$${f%.fl}.h; h=$${h##*/}; \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ $(FLUID) -c -o ../../$$c -h $$h ../../$$f; \ @HAVE_FLUID_TRUE@@WANT_FLARQ_TRUE@ done) @DARWIN_TRUE@appbundle: $(bin_PROGRAMS) @DARWIN_TRUE@ $(call silent,APPB ,$(APPBUNDLE_NOLIBS) $(APPBUNDLE))sh $(srcdir)/../scripts/mkappbundle.sh "$(srcdir)/../data" . @HAVE_NSIS_TRUE@nsisinst: $(bin_PROGRAMS) @HAVE_NSIS_TRUE@ $(call silent,NSIS ,$(INSTALLER_FILE))sh $(srcdir)/../scripts/mknsisinst.sh "$(srcdir)/../data" . @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@hamlib-static: $(fldigi_OBJECTS) @ENABLE_HAMLIB_TRUE@@WANT_FLDIGI_TRUE@ $(call silent,HLS ,fldigi$(EXEEXT))sh $(srcdir)/../scripts/mkhamlibstatic.sh fldigi @HAVE_ASCIIDOC_TRUE@$(builddir)/../doc/guide.html: $(builddir)/../doc/guide.txt @HAVE_ASCIIDOC_TRUE@ @$(MAKE) -C $(builddir)/../doc $(AM_MAKEFLAGS) guide.html @HAVE_ASCIIDOC_TRUE@$(builddir)/dialogs/guide.cxx: $(builddir)/../doc/guide.html @HAVE_ASCIIDOC_TRUE@ @mkdir -p $(builddir)/dialogs @HAVE_ASCIIDOC_TRUE@ $(call silent,GUIDE ,$@)sed 's/\\/\\\\/g; s/"/\\"/g; s/$$/\\n\\/g; 1 s/.*/const char* szBeginner = "&/; $$ s/.*/&n";/' $< > $@ @HAVE_ASCIIDOC_TRUE@dialogs/htmlstrings.cxx: $(builddir)/dialogs/guide.cxx @HAVE_ASCIIDOC_TRUE@distclean-local: @HAVE_ASCIIDOC_TRUE@ @if test "$(builddir)" != "$(srcdir)"; then \ @HAVE_ASCIIDOC_TRUE@ rm -f $(builddir)/dialogs/guide.cxx; \ @HAVE_ASCIIDOC_TRUE@ fi clean-local: -rm -rf $(CLEAN_LOCAL) # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fldigi-4.2.05/src/config.h.in0000664000175000017500000004155314463050271012607 00000000000000/* src/config.h.in. Generated from configure.ac by autoheader. */ #ifndef CONFIG_H_ #define CONFIG_H_ /* Defined if we are building for benchmarking */ #undef BENCHMARK_MODE /* Build platform */ #undef BUILD_BUILD_PLATFORM /* Compiler */ #undef BUILD_COMPILER /* Configure arguments */ #undef BUILD_CONFIGURE_ARGS /* Build date */ #undef BUILD_DATE /* Build host */ #undef BUILD_HOST /* Host platform */ #undef BUILD_HOST_PLATFORM /* Target platform */ #undef BUILD_TARGET_PLATFORM /* Build user */ #undef BUILD_USER /* Define to 1 if the `closedir' function returns void instead of int. */ #undef CLOSEDIR_VOID /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Flarq authors */ #undef FLARQ_AUTHORS /* Flarq compiler flags */ #undef FLARQ_BUILD_CXXFLAGS /* Flarq linker flags */ #undef FLARQ_BUILD_LDFLAGS /* Flarq Docs index */ #undef FLARQ_DOCS /* Flarq version string */ #undef FLARQ_VERSION /* Flarq major version number */ #undef FLARQ_VERSION_MAJOR /* Flarq minor version number */ #undef FLARQ_VERSION_MINOR /* Flarq patch/alpha version string */ #undef FLARQ_VERSION_PATCH /* Fldigi authors */ #undef FLDIGI_AUTHORS /* Fldigi cc compiler flags */ #undef FLDIGI_BUILD_CFLAGS /* Fldigi cpp compiler flags */ #undef FLDIGI_BUILD_CXXFLAGS /* Fldigi linker flags */ #undef FLDIGI_BUILD_LDFLAGS /* FLTK API major version */ #undef FLDIGI_FLTK_API_MAJOR /* FLTK API minor version */ #undef FLDIGI_FLTK_API_MINOR /* FLTK API patch */ #undef FLDIGI_FLTK_API_PATCH /* Fldigi version string */ #undef FLDIGI_VERSION /* Fldigi major version number */ #undef FLDIGI_VERSION_MAJOR /* Fldigi minor version number */ #undef FLDIGI_VERSION_MINOR /* Fldigi patch/alpha version string */ #undef FLDIGI_VERSION_PATCH /* FLTK version */ #undef FLTK_BUILD_VERSION /* flxmlrpc version */ #undef FLXMLRPC_BUILD_VERSION /* Define to 0 if gcc < 4.1.0 */ #undef GCC_VER_OK /* hamlib version */ #undef HAMLIB_BUILD_VERSION /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the Mac OS X function CFLocaleCopyPreferredLanguages in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYPREFERREDLANGUAGES /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define to 1 if we have clock_gettime */ #undef HAVE_CLOCK_GETTIME /* define if the compiler supports basic C++11 syntax */ #undef HAVE_CXX11 /* Define to 0 if not using dbg::stack */ #undef HAVE_DBG_STACK /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DEV_PPBUS_PPI_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if we have dlopen */ #undef HAVE_DLOPEN /* Define to 1 if you have the header file. */ #undef HAVE_EXECINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `getaddrinfo' function. */ #undef HAVE_GETADDRINFO /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the `gmtime_r' function. */ #undef HAVE_GMTIME_R /* Define to 1 if you have the `hstrerror' function. */ #undef HAVE_HSTRERROR /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_PPDEV_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the header file. */ #undef HAVE_MINIX_CONFIG_H /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have O_CLOEXEC defined */ #undef HAVE_O_CLOEXEC /* Define to 1 if you have the header file. */ #undef HAVE_REGEX_H /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if we have sem_timedwait */ #undef HAVE_SEM_TIMEDWAIT /* Define to 1 if we have sem_unlink */ #undef HAVE_SEM_UNLINK /* Define to 1 if you have the `setenv' function. */ #undef HAVE_SETENV /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Define to 1 if you have the `socketpair' function. */ #undef HAVE_SOCKETPAIR /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Defined 0 if we do not have std::bind in */ #undef HAVE_STD_BIND /* Defined 0 if we do not have std::bind in */ #undef HAVE_STD_HASH /* Defined 0 if we do not have std::tr1::bind in */ #undef HAVE_STD_TR1_BIND /* Defined 0 if we do not have std::tr1::hash in */ #undef HAVE_STD_TR1_HASH /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strcasestr' function. */ #undef HAVE_STRCASESTR /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strlcpy' function. */ #undef HAVE_STRLCPY /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the `strncmp' function. */ #undef HAVE_STRNCMP /* Define to 1 if you have the `strncpy' function. */ #undef HAVE_STRNCPY /* Define to 1 if you have the `strnlen' function. */ #undef HAVE_STRNLEN /* Define to 1 if you have the `strrchr' function. */ #undef HAVE_STRRCHR /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_UTSNAME_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if you have the `uname' function. */ #undef HAVE_UNAME /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `unsetenv' function. */ #undef HAVE_UNSETENV /* Define to 1 if you have the header file. */ #undef HAVE_VALUES_H /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* libmbedtls version */ #undef LIBMBEDTLS_BUILD_VERSION /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Download page */ #undef PACKAGE_DL /* Docs index */ #undef PACKAGE_DOCS /* Beginners guide */ #undef PACKAGE_GUIDE /* Home page */ #undef PACKAGE_HOME /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Trac new ticket page */ #undef PACKAGE_NEWBUG /* Sourceforge page */ #undef PACKAGE_PROJ /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* png version */ #undef PNG_BUILD_VERSION /* portaudio version */ #undef PORTAUDIO_BUILD_VERSION /* pulseaudio version */ #undef PULSEAUDIO_BUILD_VERSION /* samplerate version */ #undef SAMPLERATE_BUILD_VERSION /* Define to the type of arg 1 for `select'. */ #undef SELECT_TYPE_ARG1 /* Define to the type of args 2, 3 and 4 for `select'. */ #undef SELECT_TYPE_ARG234 /* Define to the type of arg 5 for `select'. */ #undef SELECT_TYPE_ARG5 /* sndfile version */ #undef SNDFILE_BUILD_VERSION /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Define to 1 if we are using flxmlrpc */ #undef USE_FLXMLRPC /* Define to 1 if we are using hamlib */ #undef USE_HAMLIB /* Define to 1 if we are using libmbedtls */ #undef USE_LIBMBEDTLS /* Defined if we are using OSS */ #undef USE_OSS /* Define to 1 if we are using png */ #undef USE_PNG /* Define to 1 if we are using portaudio */ #undef USE_PORTAUDIO /* Define to 1 if we are using pulseaudio */ #undef USE_PULSEAUDIO /* Define to 1 if we are using samplerate */ #undef USE_SAMPLERATE /* Define to 1 if we are using sndfile */ #undef USE_SNDFILE /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable general extensions on macOS. */ #ifndef _DARWIN_C_SOURCE # undef _DARWIN_C_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable X/Open compliant socket functions that do not require linking with -lxnet on HP-UX 11.11. */ #ifndef _HPUX_ALT_XOPEN_SOCKET_API # undef _HPUX_ALT_XOPEN_SOCKET_API #endif /* Identify the host operating system as Minix. This macro does not affect the system headers' behavior. A future release of Autoconf may stop defining this macro. */ #ifndef _MINIX # undef _MINIX #endif /* Enable general extensions on NetBSD. Enable NetBSD compatibility extensions on Minix. */ #ifndef _NETBSD_SOURCE # undef _NETBSD_SOURCE #endif /* Enable OpenBSD compatibility extensions on NetBSD. Oddly enough, this does nothing on OpenBSD. */ #ifndef _OPENBSD_SOURCE # undef _OPENBSD_SOURCE #endif /* Define to 1 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_SOURCE # undef _POSIX_SOURCE #endif /* Define to 2 if needed for POSIX-compatible behavior. */ #ifndef _POSIX_1_SOURCE # undef _POSIX_1_SOURCE #endif /* Enable POSIX-compatible threading on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ #ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ # undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__ # undef __STDC_WANT_IEC_60559_BFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ #ifndef __STDC_WANT_IEC_60559_DFP_EXT__ # undef __STDC_WANT_IEC_60559_DFP_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ #ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ # undef __STDC_WANT_IEC_60559_FUNCS_EXT__ #endif /* Enable extensions specified by ISO/IEC TS 18661-3:2015. */ #ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ # undef __STDC_WANT_IEC_60559_TYPES_EXT__ #endif /* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ #ifndef __STDC_WANT_LIB_EXT2__ # undef __STDC_WANT_LIB_EXT2__ #endif /* Enable extensions specified by ISO/IEC 24747:2009. */ #ifndef __STDC_WANT_MATH_SPEC_FUNCS__ # undef __STDC_WANT_MATH_SPEC_FUNCS__ #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable X/Open extensions. Define to 500 only if necessary to make mbstate_t available. */ #ifndef _XOPEN_SOURCE # undef _XOPEN_SOURCE #endif /* Defined if we are using TLS */ #undef USE_TLS /* Define to 1 if we are using x */ #undef USE_X /* Version number of package */ #undef VERSION /* x version */ #undef X_BUILD_VERSION /* Define for Solaris 2.5.1 so the uint32_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT32_T /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define for Solaris 2.5.1 so the uint8_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT8_T /* Define to 1 if we are building on cygwin or mingw */ #undef _WINDOWS /* Define to 1 if we are building on cygwin or mingw */ #undef __MINGW32__ /* Define to 1 if we are building on cygwin or mingw */ #undef __WOE32__ /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to the type of a signed integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef int16_t /* Define to the type of a signed integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef int32_t /* Define to the type of a signed integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef int64_t /* Define to the type of a signed integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef int8_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported only directly. */ #undef restrict /* Work around a bug in older versions of Sun C++, which did not #define __restrict__ or support _Restrict or __restrict__ even though the corresponding Sun C compiler ended up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. This workaround can be removed once we assume Oracle Developer Studio 12.5 (2016) or later. */ #if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__ # define _Restrict # define __restrict__ #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 16 bits if such a type exists and the standard includes do not define it. */ #undef uint16_t /* Define to the type of an unsigned integer type of width exactly 32 bits if such a type exists and the standard includes do not define it. */ #undef uint32_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ #undef uint8_t /* Define to empty if the keyword `volatile' does not work. Warning: valid code using `volatile' can become incorrect without. Disable with care. */ #undef volatile #include "pkg.h" #include "util.h" #endif /* CONFIG_H_ */ fldigi-4.2.05/src/olivia/0000775000175000017500000000000014611714005012114 500000000000000fldigi-4.2.05/src/olivia/olivia.cxx0000664000175000017500000003056714611711171014057 00000000000000// ---------------------------------------------------------------------------- // olivia.cxx -- OLIVIA modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "olivia.h" #include "modem.h" #include "fl_digi.h" #include "misc.h" #include "confdialog.h" #include "status.h" #include "debug.h" #include "qrunner.h" //------------------------------------------------------------------------------ #include "threads.h" static pthread_mutex_t olivia_mutex = PTHREAD_MUTEX_INITIALIZER; //------------------------------------------------------------------------------ LOG_FILE_SOURCE(debug::LOG_MODEM); double olivia::nco(double freq) { preamblephase += 2.0 * M_PI * freq / samplerate; if (preamblephase > M_PI) preamblephase -= 2.0 * M_PI; return cos(preamblephase); } void olivia::tx_init() { phaseacc = 0; prevsymbol = cmplx (1.0, 0.0); preamble = 32; shreg = 0; preamblesent = 0; postamblesent = 0; txbasefreq = get_txfreq_woffset(); rx_flush(); { // critical section guard_lock dsp_lock(&olivia_mutex); double fc_offset = Tx->Bandwidth*(1.0 - 0.5/Tx->Tones)/2.0; if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + fc_offset)/500.0; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - fc_offset)/500.0; Tx->Reverse = 0; } Tx->Preset(); Tx->Start(); } // end critical section videoText(); escape = 0; } void olivia::rx_flush() { guard_lock dsp_lock(&olivia_mutex); unsigned char c; Rx->Flush(); while (Rx->GetChar(c) > 0) put_rx_char(c); } void olivia::send_tones() { if (!progdefaults.olivia_start_tones) return; double freqa, freqb; tone_bw = bandwidth; tone_midfreq = txbasefreq; if (reverse) { freqa = tone_midfreq + (tone_bw / 2.0); freqb = tone_midfreq - (tone_bw / 2.0); } else { freqa = tone_midfreq - (tone_bw / 2.0); freqb = tone_midfreq + (tone_bw / 2.0); } preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[2*SR4 + i] = tonebuff[i] = nco(freqa) * ampshape[i]; preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = nco(freqb) * ampshape[i]; for (int j = 0; j < TONE_DURATION; j += SCBLOCKSIZE) ModulateXmtr(&tonebuff[j], SCBLOCKSIZE); } void olivia::rx_init() { guard_lock dsp_lock(&olivia_mutex); Rx->Reset(); escape = 0; } int olivia::unescape(int c) { if (progdefaults.olivia8bit == 0) return c; if (escape) { escape = 0; return c + 128; } if (c == 127) { escape = 1; return -1; } return c; } int olivia::tx_process() { modem::tx_process(); int c = 0, len = 0; if ((mode == MODE_OLIVIA && (tones != progdefaults.oliviatones || bw != progdefaults.oliviabw)) || smargin != progdefaults.oliviasmargin || sinteg != progdefaults.oliviasinteg ) restart(); { // critical section guard_lock dsp_lock(&olivia_mutex); if (preamblesent != 1) { send_tones(); preamblesent = 1; // Olivia Transmitter class requires at least character Tx->PutChar(0); } // The encoder works with BitsPerSymbol length blocks. If the // modem already has that many characters buffered, don't try // to read any more. If stopflag is set, we will always read // whatever there is. if (stopflag || (Tx->GetReadReady() < Tx->BitsPerSymbol)) { if (!stopflag && (c = get_tx_char()) == GET_TX_CHAR_ETX) stopflag = true; if (stopflag) Tx->Stop(); else { if (c == GET_TX_CHAR_NODATA) c = 0; if (c > 127) { if (progdefaults.olivia8bit && c <= 255) { Tx->PutChar(127); Tx->PutChar(c & 127); } else { c = '.'; Tx->PutChar(c); } } else Tx->PutChar(c); } } if (c > 0) put_echo_char(c); if ((len = Tx->Output(txfbuffer)) > 0) ModulateXmtr(txfbuffer, len); if (stopflag && Tx->DoPostambleYet() == 1 && postamblesent != 1) { postamblesent = 1; send_tones(); memset(tonebuff, 0, sizeof(*tonebuff) * SCBLOCKSIZE); ModulateXmtr(tonebuff, SCBLOCKSIZE); } if (!Tx->Running()) { stopflag = false; return -1; } } // end critical section return 0; } int olivia::rx_process(const double *buf, int len) { int c; unsigned char ch = 0; static double snr = 1e-3; static char msg1[20]; static char msg2[20]; double rxf_offset = 0; double rx_bw = 0; double rx_tones = 0; double rx_snr = 0; int fc_offset = 0; bool gotchar = false; if ((mode == MODE_OLIVIA && (tones != progdefaults.oliviatones || bw != progdefaults.oliviabw)) || smargin != progdefaults.oliviasmargin || sinteg != progdefaults.oliviasinteg ) restart(); { // critical section guard_lock dsp_lock(&olivia_mutex); fc_offset = Tx->Bandwidth*(1.0 - 0.5/Tx->Tones)/2.0; if ((lastfreq != frequency || Rx->Reverse) && !reverse) { Rx->FirstCarrierMultiplier = (frequency - fc_offset)/500.0; Rx->Reverse = 0; lastfreq = frequency; Rx->Preset(); } else if ((lastfreq != frequency || !Rx->Reverse) && reverse) { Rx->FirstCarrierMultiplier = (frequency + fc_offset)/500.0; Rx->Reverse = 1; lastfreq = frequency; Rx->Preset(); } Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 0, 90.0) : 0.0; Rx->Process(buf, len); while (Rx->GetChar(ch) > 0) { if ((c = unescape(ch)) != -1 && c > 7) { put_rx_char(c); gotchar = true; } } rxf_offset = Rx->FrequencyOffset(); rx_bw = Rx->Bandwidth; rx_tones = Rx->Tones; rx_snr = Rx->SignalToNoiseRatio(); } // end critical section sp = 0; for (int i = frequency - fc_offset; i < frequency + fc_offset; i++) if (wf->Pwr(i) > sp) sp = wf->Pwr(i); np = wf->Pwr(static_cast(frequency + rx_bw/2 + 2*rx_bw/rx_tones)); if (np == 0) np = sp + 1e-8; sigpwr = decayavg( sigpwr, sp, 10); noisepwr = decayavg( noisepwr, np, 50); snr = CLAMP(sigpwr / noisepwr, 0.001, 100000); metric = clamp( 5.0 * (rx_snr - 3.0), 0, 100); display_metric(metric); if (gotchar) { snprintf(msg1, sizeof(msg1), "s/n: %4.1f dB", 10*log10(snr) - 20); put_Status1(msg1, 5, STATUS_CLEAR); snprintf(msg2, sizeof(msg2), "f/o %+4.1f Hz", rxf_offset); put_Status2(msg2, 5, STATUS_CLEAR); } return 0; } void olivia::restart() { if (mode == MODE_OLIVIA) { tones = progdefaults.oliviatones; bw = progdefaults.oliviabw; } smargin = progdefaults.oliviasmargin; sinteg = progdefaults.oliviasinteg; samplerate = 8000; bandwidth = 125 * (1 << bw); Tx->Tones = 2 * (1 << tones); Tx->Bandwidth = bandwidth; Tx->SampleRate = samplerate; Tx->OutputSampleRate = samplerate; txbasefreq = get_txfreq_woffset(); { // critical section guard_lock dsp_lock(&olivia_mutex); int fc_offset = Tx->Bandwidth * (1.0 - 0.5/Tx->Tones) / 2.0; if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + fc_offset)/500.0; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - fc_offset)/500.0; Tx->Reverse = 0; } if (Tx->Preset() < 0) { LOG_ERROR("olivia: transmitter preset failed!"); return; } txbufferlen = Tx->MaxOutputLen; if (txfbuffer) delete [] txfbuffer; txfbuffer = new double[txbufferlen]; Rx->Tones = Tx->Tones; Rx->Bandwidth = bandwidth; Rx->SyncMargin = smargin; Rx->SyncIntegLen = sinteg; Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 0, 90.0) : 0.0; Rx->SampleRate = samplerate; Rx->InputSampleRate = samplerate; fc_offset = Rx->Bandwidth * (1.0 - 0.5/Rx->Tones) / 2.0; if (reverse) { Rx->FirstCarrierMultiplier = (frequency + fc_offset)/500.0; Rx->Reverse = 1; } else { Rx->FirstCarrierMultiplier = (frequency - fc_offset)/500.0; Rx->Reverse = 0; } if (Rx->Preset() < 0) { LOG_ERROR("olivia: receiver preset failed!"); return; } fragmentsize = 1024; set_bandwidth(Tx->Bandwidth - Tx->Bandwidth / Tx->Tones); std::stringstream info; info << mode_info[mode].sname; put_MODEstatus("%s", info.str().c_str()); metric = 0; sigpwr = 1e-10; noisepwr = 1e-8; LOG_DEBUG("\nOlivia Rx parameters:\n%s", Rx->PrintParameters()); } // end critical section } void olivia::init() { restart(); modem::init(); set_scope_mode(Digiscope::BLANK); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } olivia::olivia(trx_mode omode) { mode = omode; cap |= CAP_REV; txfbuffer = 0; samplerate = 8000; switch (mode) { case MODE_OLIVIA_4_125: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 0; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_4_250: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 1; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_4_500: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_4_1000: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_4_2000: progdefaults.oliviatones = tones = 1; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_125: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 0; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_250: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 1; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_500: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_1000: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_8_2000: progdefaults.oliviatones = tones = 2; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_16_500: progdefaults.oliviatones = tones = 3; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_16_1000: progdefaults.oliviatones = tones = 3; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_16_2000: progdefaults.oliviatones = tones = 3; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_32_1000: progdefaults.oliviatones = tones = 4; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_32_2000: progdefaults.oliviatones = tones = 4; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_64_500: progdefaults.oliviatones = tones = 5; progdefaults.oliviabw = bw = 2; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_64_1000: progdefaults.oliviatones = tones = 5; progdefaults.oliviabw = bw = 3; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA_64_2000: progdefaults.oliviatones = tones = 5; progdefaults.oliviabw = bw = 4; REQ(set_olivia_tab_widgets); break; case MODE_OLIVIA: default: tones = progdefaults.oliviatones; bw = progdefaults.oliviabw; REQ(set_olivia_tab_widgets); break; } Tx = new MFSK_Transmitter< double >; Rx = new MFSK_Receiver< double >; lastfreq = 0; for (int i = 0; i < SR4; i++) ampshape[i] = 1.0; for (int i = 0; i < SR4 / 8; i++) ampshape[i] = ampshape[SR4 - 1 - i] = 0.5 * (1.0 - cos(M_PI * i / (SR4/8))); for (int i = 0; i < TONE_DURATION; i++) tonebuff[i] = 0; tone_bw = -1; tone_midfreq = -1; } olivia::~olivia() { guard_lock dsp_lock(&olivia_mutex); if (Tx) delete Tx; if (Rx) delete Rx; if (txfbuffer) delete [] txfbuffer; } fldigi-4.2.05/src/ifkp/0000775000175000017500000000000014611714005011562 500000000000000fldigi-4.2.05/src/ifkp/ifkp.cxx0000664000175000017500000006327314611711171013173 00000000000000// ---------------------------------------------------------------------------- // ifkp.cxx -- ifkp modem // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "progress.h" #include "ifkp.h" #include "complex.h" #include "fl_digi.h" #include "ascii.h" #include "misc.h" #include "fileselect.h" #include "threads.h" #include "debug.h" #include "configuration.h" #include "qrunner.h" #include "fl_digi.h" #include "status.h" #include "main.h" #include "icons.h" #include "confdialog.h" #include "test_signal.h" #include "ifkp_varicode.cxx" #define IFKP_SR 16000 #include "ifkp-pic.cxx" static fre_t call("([[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+)", REG_EXTENDED); static std::string teststr = ""; static std::string allowed = " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/"; static char sz[21]; static bool enable_audit_log = false; static bool enable_heard_log = false; int ifkp::IMAGEspp = IMAGESPP; static std::string valid_callsign(char ch) { if (allowed.find(ch) == std::string::npos) ch = ' '; teststr += tolower(ch); if (teststr.length() > 20) teststr.erase(0,1); // wait for ' de ' size_t p1; if ((p1 = teststr.find(" de ")) != std::string::npos) { // test for callsign p1 += 4; if (p1 >= teststr.length()) return ""; while (p1 < teststr.length() && teststr[p1] == ' ') p1++; if (p1 == teststr.length()) return ""; size_t p2 = teststr.rfind(' '); if ((p2 > p1) && (p2 - p1 < 21)) { // found a word, test for callsign memset(sz, 0, 21); strcpy(sz, teststr.substr(p1, p2-p1).c_str()); teststr.erase(0, p2); if (call.match(sz)) { return sz; } return ""; } } return ""; } // nibbles table used for fast conversion from tone difference to symbol void ifkp::init_nibbles() { int nibble = 0; for (int i = 0; i < 199; i++) { nibble = floor(0.5 + (i - 99.0)/IFKP_SPACING); // allow for wrap-around (33 tones for 32 tone differences) if (nibble < 0) nibble += 33; if (nibble > 32) nibble -= 33; // adjust for +1 symbol at the transmitter nibble--; nibbles[i] = nibble; } } ifkp::ifkp(trx_mode md) : modem() { samplerate = IFKP_SR; symlen = IFKP_SYMLEN; cap |= CAP_IMG; if (progdefaults.StartAtSweetSpot) { frequency = progdefaults.PSKsweetspot; } else frequency = wf->Carrier(); REQ(put_freq, frequency); mode = md; fft = new g_fft(IFKP_FFTSIZE); snfilt = new Cmovavg(32); movavg_size = 4; for (int i = 0; i < IFKP_NUMBINS; i++) binfilt[i] = new Cmovavg(movavg_size); txphase = 0; basetone = 197; float lo = frequency - 0.75 * bandwidth; float hi = frequency + 0.75 * bandwidth; rxfilter = new C_FIR_filter(); rxfilter->init_bandpass(129, 1, lo/samplerate, hi/samplerate); picfilter = new C_FIR_filter(); picfilter->init_lowpass(129, 1, 2.0 * bandwidth / samplerate); phase = 0; phidiff = 2.0 * M_PI * frequency / samplerate; IMAGEspp = IMAGESPP; pixfilter = new Cmovavg(IMAGEspp / 2); ampfilter = new Cmovavg(IMAGEspp); syncfilter = new Cmovavg(IMAGEspp / 2); bkptr = 0; peak_counter = 0; peak = last_peak = 0; max = 0; curr_nibble = prev_nibble = 0; s2n = 0; memset(rx_stream, 0, sizeof(rx_stream)); rx_text.clear(); for (int i = 0; i < IFKP_BLOCK_SIZE; i++) a_blackman[i] = blackman(1.0 * i / IFKP_BLOCK_SIZE); state = TEXT; init_nibbles(); TX_IMAGE = TX_AVATAR = false; restart(); toggle_logs(); activate_ifkp_image_item(true); } ifkp::~ifkp() { delete fft; delete snfilt; delete rxfilter; delete picfilter; for (int i = 0; i < IFKP_NUMBINS; i++) delete binfilt[i]; ifkp_deleteTxViewer(); ifkp_deleteRxViewer(); heard_log.close(); audit_log.close(); activate_ifkp_image_item(false); } void ifkp::tx_init() { tone = prevtone = 0; txphase = 0; send_bot = true; mycall = progdefaults.myCall; if (progdefaults.ifkp_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); videoText(); } void ifkp::rx_init() { bkptr = 0; peak_counter = 0; peak = last_peak = 0; max = 0; curr_nibble = prev_nibble = 0; s2n = 0; memset(rx_stream, 0, sizeof(rx_stream)); prevz = cmplx(0,0); image_counter = 0; state = TEXT; rx_text.clear(); for (int i = 0; i < IFKP_NUMBINS; i++) { tones[i] = 0.0; binfilt[i]->reset(); } pixel = 0; pic_str = " "; } void ifkp::rx_reset() { prevz = cmplx(0,0); image_counter = 0; pixel = 0; pic_str = " "; snfilt->reset(); state = TEXT; } void ifkp::init() { peak_hits = 4; mycall = progdefaults.myCall; if (progdefaults.ifkp_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); movavg_size = 3; for (int i = 0; i < IFKP_NUMBINS; i++) binfilt[i]->setLength(movavg_size); rx_init(); } void ifkp::set_freq(double f) { if (progdefaults.ifkp_freqlock) frequency = 1500; else frequency = f; if (frequency < 100 + 0.5 * bandwidth) frequency = 100 + 0.5 * bandwidth; if (frequency > 3900 - 0.5 * bandwidth) frequency = 3900 - 0.5 * bandwidth; tx_frequency = frequency; REQ(put_freq, frequency); set_bandwidth(33 * IFKP_SPACING * samplerate / symlen); basetone = ceil((frequency - bandwidth / 2.0) * symlen / samplerate); float lo = frequency - 0.75 * bandwidth; float hi = frequency + 0.75 * bandwidth; rxfilter->init_bandpass(129, 1, lo/samplerate, hi/samplerate); picfilter->init_lowpass(129, 1, 2.0 * bandwidth / samplerate); phase = 0; phidiff = 2.0 * M_PI * frequency / samplerate; std::ostringstream it; it << "\nSamplerate..... " << samplerate; it << "\nBandwidth...... " << bandwidth; it << "\nlower cutoff... " << lo; it << "\nupper cutoff... " << hi; it << "\ncenter ........ " << frequency; it << "\nSymbol length.. " << symlen << "\nBlock size..... " << IFKP_SHIFT_SIZE; it << "\nMinimum Hits... " << peak_hits << "\nBasetone....... " << basetone << "\n"; LOG_VERBOSE("%s", it.str().c_str()); } void ifkp::show_mode() { if (progdefaults.ifkp_baud == 0) put_MODEstatus("IFKP 0.5"); else if (progdefaults.ifkp_baud == 1) put_MODEstatus("IFKP 1.0"); else put_MODEstatus("IFKP 2.0"); return; } void ifkp::toggle_logs() { if (enable_audit_log != progdefaults.ifkp_enable_audit_log){ enable_audit_log = progdefaults.ifkp_enable_audit_log; if (audit_log.is_open()) audit_log.close(); } if (enable_heard_log != progdefaults.ifkp_enable_heard_log) { enable_heard_log = progdefaults.ifkp_enable_heard_log; if (heard_log.is_open()) heard_log.close(); } if (enable_heard_log) { heard_log_fname = progdefaults.ifkp_heard_log; std::string sheard = TempDir; sheard.append(heard_log_fname); heard_log.open(sheard.c_str(), std::ios::app); heard_log << "==================================================\n"; heard_log << "Heard log: " << zdate() << ", " << ztime() << "\n"; heard_log << "==================================================\n"; heard_log.flush(); } if (enable_audit_log) { audit_log_fname = progdefaults.ifkp_audit_log; std::string saudit = TempDir; saudit.append(audit_log_fname); audit_log.close(); audit_log.open(saudit.c_str(), std::ios::app); audit_log << "==================================================\n"; audit_log << "Audit log: " << zdate() << ", " << ztime() << "\n"; audit_log << "==================================================\n"; audit_log.flush(); } } void ifkp::restart() { set_freq(wf->Carrier()); peak_hits = 4; mycall = progdefaults.myCall; if (progdefaults.ifkp_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); movavg_size = progdefaults.ifkp_baud == 2 ? 3 : 4; for (int i = 0; i < IFKP_NUMBINS; i++) binfilt[i]->setLength(movavg_size); show_mode(); } // valid printable character bool ifkp::valid_char(int ch) { if ( ! (ch == 10 || ch == 163 || ch == 176 || ch == 177 || ch == 215 || ch == 247 || (ch > 31 && ch < 128))) return false; return true; } //===================================================================== // receive processing //===================================================================== void ifkp::parse_pic(int ch) { b_ava = false; image_mode = 0; pic_str.erase(0,1); pic_str += ch; if (pic_str.find("pic%") == 0) { switch (pic_str[4]) { case 'A': picW = 59; picH = 74; b_ava = true; break; case 'T': picW = 59; picH = 74; break; case 't': picW = 59; picH = 74; image_mode = 1; break; case 'S': picW = 160; picH = 120; break; case 's': picW = 160; picH = 120; image_mode = 1; break; case 'L': picW = 320; picH = 240; break; case 'l': picW = 320; picH = 240; image_mode = 1; break; case 'V': picW = 640; picH = 480; break; case 'v': picW = 640; picH = 480; image_mode = 1; break; case 'F': picW = 640; picH = 480; image_mode = 1; break; case 'P': picW = 240; picH = 300; break; case 'p': picW = 240; picH = 300; image_mode = 1; break; case 'M': picW = 120; picH = 150; break; case 'm': picW = 120; picH = 150; image_mode = 1; break; default: syncfilter->reset(); pixfilter->reset(); ampfilter->reset(); return; } } else return; if (!b_ava) REQ( ifkp_showRxViewer, pic_str[4]); else REQ( ifkp_clear_avatar ); image_counter = -symlen / 2; col = row = rgb = 0; syncfilter->reset(); pixfilter->reset(); // ampfilter->reset(); state = IMAGE_START; } void ifkp::process_symbol(int sym) { int nibble = 0; int curr_ch = -1 ; symbol = sym; nibble = symbol - prev_symbol; if (nibble < -99 || nibble > 99) { prev_symbol = symbol; return; } nibble = nibbles[nibble + 99]; if (nibble >= 0) { // process nibble curr_nibble = nibble; // single-nibble characters if ((prev_nibble < 29) & (curr_nibble < 29)) { curr_ch = ifkp_varidecode[prev_nibble]; // double-nibble characters } else if ( (prev_nibble < 29) && (curr_nibble > 28) && (curr_nibble < 32)) { curr_ch = ifkp_varidecode[prev_nibble * 32 + curr_nibble]; } if (curr_ch > 0) { if (ch_sqlch_open || metric >= progStatus.sldrSquelchValue) { // if (metric >= progStatus.sldrSquelchValue) { put_rx_char(curr_ch, FTextBase::RECV); if (enable_audit_log) { audit_log << ifkp_ascii[curr_ch]; if (curr_ch == '\n') audit_log << '\n'; } parse_pic(curr_ch); if (state != IMAGE_START) { station_calling = valid_callsign(curr_ch); if (!station_calling.empty()) { snprintf(szestimate, sizeof(szestimate), "%.0f db", s2n ); REQ(add_to_heard_list, station_calling.c_str(), szestimate); if (enable_heard_log) { std::string sheard = zdate(); sheard.append(":").append(ztime()); sheard.append(",").append(station_calling); sheard.append(",").append(szestimate).append("\n"); heard_log << sheard; heard_log.flush(); } } } } } prev_nibble = curr_nibble; } prev_symbol = symbol; } int no_signal = 0; void ifkp::process_tones() { max = 0; peak = 0; max = 0; peak = IFKP_NUMBINS / 2; int firstbin = frequency * IFKP_SYMLEN / samplerate - IFKP_NUMBINS / 2; double sigval = 0; double min = 3.0e8; for (int i = 0; i < IFKP_NUMBINS; ++i) { val = norm(fft_data[i + firstbin]); // search for minimum and maximum signalx tones[i] = binfilt[i]->run(val); if (tones[i] > max) { max = tones[i]; peak = i; } if (tones[i] < min) { min = tones[i]; } } if (peak == prev_peak) { peak_counter++; } else { peak_counter = 0; } if ((peak_counter >= peak_hits) && (peak != last_peak)) { sigval = (tones[peak-1] + tones[peak] + tones[peak+1]); if (min == 0) min = max / 1000; if (min > 0 && max > 0) { s2n = 20 * log10( snfilt->run(sigval/min)); s2n -= 64; s2n *= 40; s2n /= 75; s2n -= 20; } else s2n = -25; //scale to -25 to +45 db range // -25 -> 0 linear // 0 - > 45 compressed by 2 if (s2n <= 0) metric = 2 * (25 + s2n); if (s2n > 0) metric = 50 * ( 1 + s2n / 45); metric = clamp(metric, 0, 100); display_metric(metric); if (metric >= progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { //) { process_symbol(peak); } peak_counter = 0; last_peak = peak; no_signal = 0; } else if (++no_signal > 128) { // reset the filter and zero the s/n display snfilt->reset(); display_metric(0); } prev_peak = peak; } void ifkp::recvpic(double smpl) { phidiff = 2.0 * M_PI * frequency / samplerate; phase -= phidiff; if (phase < 0) phase += 2.0 * M_PI; cmplx z = smpl * cmplx( cos(phase), sin(phase ) ); picfilter->run( z, currz); pixel = (samplerate / TWOPI) * pixfilter->run(arg(conj(prevz) * currz)); sync = (samplerate / TWOPI) * syncfilter->run(arg(conj(prevz) * currz)); prevz = currz; image_counter++; if (image_counter < 0) return; if (state == IMAGE_START) { if (sync < -0.59 * bandwidth) { state = IMAGE_SYNC; } return; } if (state == IMAGE_SYNC) { if (sync > -0.51 * bandwidth) { state = IMAGE; } return; } if ((image_counter % IMAGEspp) == 0) { byte = pixel * 256.0 / bandwidth + 128; byte = (int)CLAMP( byte, 0.0, 255.0); if (image_mode == 1) { // bw transmission pixelnbr = 3 * (col + row * picW); if (b_ava) { REQ(ifkp_update_avatar, byte, pixelnbr); REQ(ifkp_update_avatar, byte, pixelnbr + 1); REQ(ifkp_update_avatar, byte, pixelnbr + 2); } else { REQ(ifkp_updateRxPic, byte, pixelnbr); REQ(ifkp_updateRxPic, byte, pixelnbr + 1); REQ(ifkp_updateRxPic, byte, pixelnbr + 2); } if (++ col == picW) { col = 0; row++; if (row >= picH) { rx_reset(); REQ(ifkp_enableshift); } } } else { // color transmission pixelnbr = rgb + 3 * (col + row * picW); if (b_ava) REQ(ifkp_update_avatar, byte, pixelnbr); else REQ(ifkp_updateRxPic, byte, pixelnbr); if (++col == picW) { col = 0; if (++rgb == 3) { rgb = 0; ++row; } } if (row >= picH) { rx_reset(); REQ(ifkp_enableshift); } } } } int ifkp::rx_process(const double *buf, int len) { double val; cmplx zin, z; if (enable_audit_log != progdefaults.ifkp_enable_audit_log || enable_heard_log != progdefaults.ifkp_enable_heard_log) toggle_logs(); if (bkptr < 0) bkptr = 0; if (bkptr >= IFKP_SHIFT_SIZE) bkptr = 0; if (progStatus.ifkp_rx_abort) { state = TEXT; progStatus.ifkp_rx_abort = false; REQ(ifkp_clear_rximage); } while (len) { if (state == TEXT) { rxfilter->Irun(*buf, val); rx_stream[IFKP_BLOCK_SIZE + bkptr] = val; bkptr++; if (bkptr == IFKP_SHIFT_SIZE) { bkptr = 0; memmove(rx_stream, // to &rx_stream[IFKP_SHIFT_SIZE], // from IFKP_BLOCK_SIZE*sizeof(*rx_stream)); // # bytes for (int n = 0; n < 2*IFKP_FFTSIZE; n++) fft_data[n] = cmplx(0,0); for (int i = 0; i < IFKP_BLOCK_SIZE; i++) { double d = rx_stream[i] * a_blackman[i]; fft_data[i] = cmplx(d,d); } fft->ComplexFFT(fft_data); process_tones(); } } else recvpic(*buf); len--; buf++; } return 0; } //===================================================================== // transmit processing //===================================================================== void ifkp::transmit(double *buf, int len) { // if (xmtfilt && progdefaults.ifkp_xmtfilter) // for (int i = 0; i < len; i++) xmtfilt->Irun(buf[i], buf[i]); ModulateXmtr(buf, len); } void ifkp::send_tone(int tone) { double phaseincr; double frequency; frequency = (basetone + tone * IFKP_SPACING) * samplerate / symlen; if (test_signal_window && test_signal_window->visible() && btnOffsetOn->value()) frequency += ctrl_freq_offset->value(); phaseincr = 2.0 * M_PI * frequency / samplerate; prevtone = tone; int send_symlen = symlen * ( progdefaults.ifkp_baud == 2 ? 0.5 : progdefaults.ifkp_baud == 0 ? 2.0 : 1.0); for (int i = 0; i < send_symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, send_symlen); } void ifkp::send_symbol(int sym) { tone = (prevtone + sym + IFKP_OFFSET) % 33; send_tone(tone); } void ifkp::send_idle() { send_symbol(0); } void ifkp::send_char(int ch) { if (ch <= 0) return send_idle(); int sym1 = ifkp_varicode[ch][0]; int sym2 = ifkp_varicode[ch][1]; send_symbol(sym1); if (sym2 > 28) send_symbol(sym2); put_echo_char(ch); } void ifkp::send_avatar() { int W = 59, H = 74; // grey scale transfer (FAX) float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; freq = frequency - 0.6 * bandwidth; #define PHASE_CORR (3 * symlen / 2) phaseincr = radians * freq; for (int n = 0; n < PHASE_CORR; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, PHASE_CORR); for (int row = 0; row < H; row++) { for (int color = 0; color < 3; color++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = ifkp_get_avatar_pixel(tx_pixelnbr, color); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, IMAGEspp); } Fl::awake(); } } } static bool send_color = true; void ifkp::send_image() { int W = 640, H = 480; // grey scale transfer (FAX) float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; if (!ifkppicTxWin || !ifkppicTxWin->visible()) { return; } switch (selifkppicSize->value()) { case 0 : W = 59; H = 74; break; case 1 : W = 120; H = 150; break; case 2 : W = 240; H = 300; break; case 3 : W = 160; H = 120; break; case 4 : W = 320; H = 240; break; case 5 : W = 640; H = 480; break; } REQ(ifkp_clear_tximage); stop_deadman(); for (size_t n = 0; n < imageheader.length(); n++) send_char(imageheader[n]); send_char(0); // needed to flush the header at the Rx decoder freq = frequency - 0.6 * bandwidth; // black-black phaseincr = radians * freq; for (int j = 0; j < 7; j++) { for (int i = 0; i < symlen/2; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, symlen/2); } if (send_color == false) { // grey scale image for (int row = 0; row < H; row++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) goto end_image; tx_pixelnbr = col + row * W; tx_pixel = 0.3 * ifkppic_TxGetPixel(tx_pixelnbr, 0) + // red 0.6 * ifkppic_TxGetPixel(tx_pixelnbr, 1) + // green 0.1 * ifkppic_TxGetPixel(tx_pixelnbr, 2); // blue REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + 0); REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + 1); REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + 2); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, IMAGEspp); Fl::awake(); } } } else { for (int row = 0; row < H; row++) { for (int color = 0; color < 3; color++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) goto end_image; tx_pixelnbr = col + row * W; tx_pixel = ifkppic_TxGetPixel(tx_pixelnbr, color); REQ(ifkp_updateTxPic, tx_pixel, tx_pixelnbr*3 + color); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } transmit(outbuf, IMAGEspp); } Fl::awake(); if (stopflag) goto end_image; } } } end_image: start_deadman(); } std::string img_str; void ifkp::ifkp_send_image(std::string image_str, bool gray) { send_color = !gray; imageheader = image_str; TX_IMAGE = true; start_tx(); } void ifkp::ifkp_send_avatar() { img_str = "\npic%A"; TX_AVATAR = true; start_tx(); } static picture *def_ifkp_avatar = (picture *)0; void load_default_ifkp_image(std::string fname, int W, int H) { static Fl_Shared_Image *shared_image = (Fl_Shared_Image *)0; static unsigned char *image_array = (unsigned char *)0; int D = 0; unsigned char *img_data; shared_image = Fl_Shared_Image::get(fname.c_str(), W, H); if (!shared_image) { def_ifkp_avatar->video(tux_img, W * H * 3); return; } // force image to be retrieved from hard drive vice shared image memory shared_image->reload(); if (shared_image->count() > 1) { shared_image->release(); shared_image = 0; def_ifkp_avatar->video(tux_img, W * H * 3); return; } img_data = (unsigned char *)shared_image->data()[0]; D = shared_image->d(); if (image_array) delete [] image_array; image_array = new unsigned char [W * H * 3]; if (D == 3) memcpy(image_array, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; image_array[j] = img_data[k]; image_array[j+1] = img_data[k+1]; image_array[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; image_array[j] = image_array[j+1] = image_array[j+2] = img_data[i]; } } else { def_ifkp_avatar->video(tux_img, W * H * 3); return; } def_ifkp_avatar->video(image_array, W * H * 3); shared_image->release(); shared_image = 0; return; } void select_ifkp_avatar(Fl_Widget *w, void *d) { const char *p = FSEL::select( _("Select operator avatar image"), "Avatar\t*.{gif,jpg,jpeg,png}\n", AvatarDir.c_str()); if (!p || !*p) return; std::string avatar_file; avatar_file.assign(p); load_default_ifkp_image(avatar_file, 59, 74); progdefaults.ifkp_avatar_image_file = avatar_file; } void init_def_ifkp_avatar(Fl_Group *w) { if (def_ifkp_avatar == (picture *)0) { def_ifkp_avatar = new picture(w->x(), w->y(), w->w(), w->h()); def_ifkp_avatar->noslant(); def_ifkp_avatar->callback(select_ifkp_avatar); def_ifkp_avatar->tooltip(_("Select operator avatar")); w->add(def_ifkp_avatar); } def_ifkp_avatar->show(); int W = w->w(); int H = w->h(); std::string image_fname = progdefaults.ifkp_avatar_image_file; if (image_fname.empty()) { image_fname = progdefaults.operCall; if (image_fname.empty()) { image_fname = progdefaults.myCall; if (image_fname.empty()) { def_ifkp_avatar->video(tux_img, W * H * 3); return; } } } if (image_fname.find(".gif") == std::string::npos && image_fname.find(".png") == std::string::npos && image_fname.find(".PNG") == std::string::npos && image_fname.find(".jp") == std::string::npos && // jpg, jpeg image_fname.find(".JP") == std::string::npos ) { // JPG, JPEG for (size_t n = 0; n < image_fname.length(); n++) image_fname[n] = tolower(image_fname[n]); std::string fname = AvatarDir; fname.append(image_fname).append(".png"); } load_default_ifkp_image(image_fname, 59, 74); } void ifkp::m_ifkp_send_avatar() { std::string image_fname = progdefaults.ifkp_avatar_image_file; if (image_fname.empty()) { image_fname = progdefaults.operCall; if (image_fname.empty()) { image_fname = progdefaults.myCall; if (image_fname.empty()) { def_ifkp_avatar->video(tux_img, 59 * 74 * 3); return; } } } if (image_fname.find(".gif") == std::string::npos && image_fname.find(".png") == std::string::npos && image_fname.find(".PNG") == std::string::npos && image_fname.find(".jp") == std::string::npos && // jpg, jpeg image_fname.find(".JP") == std::string::npos ) { // JPG, JPEG for (size_t n = 0; n < image_fname.length(); n++) image_fname[n] = tolower(image_fname[n]); std::string fname = AvatarDir; fname.append(image_fname).append(".png"); } my_avatar_img = Fl_Shared_Image::get(image_fname.c_str(), 59, 74); if (!my_avatar_img) { return; } unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; memset(avatar, 0, sizeof(avatar)); int D = my_avatar_img->d(); if (D == 3) memcpy(avatar, img_data, 59 * 74 * 3); else if (D == 4) { int i, j, k; for (i = 0; i < 59 * 74; i++) { j = i * 3; k = i * 4; avatar[j] = img_data[k]; avatar[j+1] = img_data[k+1]; avatar[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < 59 * 74; i++) { j = i * 3; avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; } } else { return; } ifkp_send_avatar(); } int ifkp::tx_process() { modem::tx_process(); if (send_bot) { send_bot = false; send_char(0); send_char(0); } int c = get_tx_char(); // if (c == GET_TX_CHAR_ETX || enable_image) { if (TX_IMAGE || TX_AVATAR) { if (img_str.length()) { for (size_t n = 0; n < img_str.length(); n++) send_char(img_str[n]); } img_str.clear(); if (TX_IMAGE) { stopflag = false; send_image(); ifkppicTxWin->hide(); } if (TX_AVATAR) { stopflag = false; send_avatar(); } send_char(0); TX_IMAGE = false; TX_AVATAR = false; ifkppicTxWin->hide(); return 0; } if ( stopflag || c == GET_TX_CHAR_ETX) { // aborts transmission send_char(0); // TX_IMAGE = false; // TX_AVATAR = false; stopflag = false; return -1; } send_char(c); return 0; } fldigi-4.2.05/src/ifkp/ifkp_bitmaps.cxx0000664000175000017500000000566614611711171014714 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of flrig. // // flrig is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // flrig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include static unsigned char s2n_data[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x60, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0xc0, 0x12, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xa0, 0x12, 0x00, 0x00, 0x46, 0x12, 0x00, 0x00, 0x4c, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0xf0, 0x12, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; Fl_Bitmap image_s2n(s2n_data, 160, 16); fldigi-4.2.05/src/ifkp/tux.cxx0000664000175000017500000023314214532252172013057 00000000000000// tux avatar unsigned char tux_img[59*74*3] = { 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 36, 36, 36, 74, 74, 76, 44, 44, 44, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 36, 36, 36, 124, 124, 124, 86, 86, 84, 28, 28, 27, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 44, 44, 44, 92, 92, 92, 60, 60, 60, 36, 36, 36, 10, 6, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 10, 6, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 12, 12, 12, 10, 6, 4, 44, 44, 44, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 52, 52, 52, 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 20, 20, 19, 131, 131, 132, 2, 2, 4, 52, 52, 52, 2, 2, 4, 2, 2, 4, 12, 12, 12, 2, 2, 4, 86, 86, 84, 141, 141, 140, 156, 156, 156, 68, 68, 68, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 148, 148, 148, 204, 204, 204, 156, 156, 156, 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 100, 100, 100, 172, 172, 172, 196, 196, 196, 204, 204, 204, 181, 180, 179, 28, 28, 27, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 10, 6, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 228, 228, 228, 2, 2, 4, 2, 2, 4, 2, 2, 4, 221, 221, 220, 254, 254, 252, 228, 228, 228, 212, 212, 212, 244, 244, 244, 164, 164, 164, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 60, 60, 60, 124, 124, 124, 60, 60, 60, 148, 148, 148, 254, 254, 252, 12, 12, 12, 12, 12, 12, 2, 2, 4, 244, 244, 244, 244, 244, 244, 2, 2, 4, 148, 148, 148, 212, 212, 212, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 86, 86, 84, 2, 2, 4, 2, 2, 4, 44, 44, 44, 254, 254, 252, 12, 12, 12, 12, 12, 12, 12, 12, 12, 236, 236, 236, 36, 36, 36, 2, 2, 4, 12, 12, 12, 12, 12, 12, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 52, 52, 52, 12, 12, 12, 2, 2, 4, 2, 2, 4, 164, 164, 164, 182, 140, 8, 172, 140, 4, 142, 106, 7, 156, 156, 156, 60, 60, 60, 2, 2, 4, 2, 2, 4, 2, 2, 4, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 254, 254, 252, 2, 2, 4, 173, 120, 10, 173, 120, 10, 235, 188, 11, 225, 180, 10, 142, 106, 7, 225, 180, 10, 225, 180, 10, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 228, 228, 228, 173, 120, 10, 218, 163, 9, 236, 180, 11, 235, 188, 11, 235, 196, 12, 235, 205, 40, 244, 213, 67, 241, 212, 42, 243, 196, 11, 215, 172, 9, 196, 196, 196, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 165, 114, 10, 201, 142, 7, 229, 172, 9, 236, 180, 11, 235, 196, 12, 237, 204, 14, 242, 218, 44, 246, 218, 74, 246, 218, 20, 246, 213, 13, 246, 218, 20, 243, 205, 12, 235, 179, 22, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 73, 48, 6, 192, 133, 7, 216, 156, 8, 236, 180, 11, 235, 188, 11, 235, 196, 12, 235, 205, 40, 246, 218, 74, 246, 218, 20, 246, 218, 20, 246, 213, 13, 246, 213, 13, 150, 114, 11, 229, 172, 9, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 106, 75, 6, 201, 142, 7, 223, 165, 9, 242, 182, 12, 235, 188, 11, 237, 204, 14, 244, 213, 67, 246, 218, 20, 246, 213, 13, 246, 213, 13, 208, 164, 13, 206, 142, 8, 218, 163, 9, 216, 156, 8, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 116, 73, 4, 215, 172, 9, 245, 189, 12, 235, 196, 12, 235, 205, 40, 241, 211, 17, 246, 213, 13, 237, 204, 14, 106, 75, 6, 207, 148, 7, 216, 156, 8, 216, 156, 8, 199, 138, 8, 2, 2, 4, 2, 2, 4, 124, 124, 124, 28, 28, 27, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 164, 164, 164, 136, 95, 7, 142, 106, 7, 189, 157, 4, 189, 157, 4, 154, 119, 11, 164, 109, 5, 192, 133, 7, 206, 142, 8, 207, 148, 7, 192, 133, 7, 190, 189, 188, 190, 189, 188, 2, 2, 4, 2, 2, 4, 36, 36, 36, 131, 131, 132, 52, 52, 52, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 190, 189, 188, 190, 189, 188, 155, 102, 5, 193, 139, 10, 223, 165, 9, 215, 150, 13, 206, 142, 8, 192, 133, 7, 192, 133, 7, 184, 173, 150, 190, 189, 188, 196, 196, 196, 196, 196, 196, 28, 28, 27, 2, 2, 4, 2, 2, 4, 124, 124, 124, 74, 74, 76, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 190, 189, 188, 190, 189, 188, 190, 189, 188, 144, 96, 7, 164, 109, 5, 164, 109, 5, 155, 102, 5, 171, 114, 5, 190, 189, 188, 181, 180, 179, 196, 196, 196, 244, 244, 244, 244, 244, 244, 212, 212, 212, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 236, 236, 236, 204, 204, 204, 190, 189, 188, 190, 189, 188, 181, 180, 179, 184, 173, 150, 190, 189, 188, 190, 189, 188, 190, 189, 188, 204, 204, 204, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 28, 28, 27, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 12, 12, 12, 2, 2, 4, 108, 108, 107, 254, 254, 252, 236, 236, 236, 190, 189, 188, 190, 189, 188, 190, 189, 188, 190, 189, 188, 190, 189, 188, 190, 189, 188, 212, 212, 212, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 12, 12, 12, 20, 20, 19, 254, 254, 252, 254, 254, 252, 254, 254, 252, 204, 204, 204, 190, 189, 188, 190, 189, 188, 190, 189, 188, 212, 212, 212, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 10, 6, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 228, 228, 228, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 164, 164, 164, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 236, 236, 236, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 221, 221, 220, 228, 228, 228, 52, 52, 52, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 156, 156, 156, 196, 196, 196, 228, 228, 228, 244, 244, 244, 244, 244, 244, 244, 244, 244, 228, 228, 228, 228, 228, 228, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 212, 212, 212, 204, 204, 204, 196, 196, 196, 196, 196, 196, 190, 189, 188, 196, 196, 196, 244, 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 172, 172, 172, 228, 228, 228, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 221, 221, 220, 204, 204, 204, 196, 196, 196, 190, 189, 188, 204, 204, 204, 100, 100, 100, 2, 2, 4, 60, 60, 60, 36, 36, 36, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 12, 12, 12, 2, 2, 4, 164, 164, 164, 228, 228, 228, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 212, 212, 212, 190, 189, 188, 244, 244, 244, 2, 2, 4, 2, 2, 4, 2, 2, 4, 52, 52, 52, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 196, 196, 196, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 68, 68, 68, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 12, 12, 12, 2, 2, 4, 181, 180, 179, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 212, 212, 212, 2, 2, 4, 12, 12, 12, 44, 44, 44, 12, 12, 12, 10, 6, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 44, 44, 44, 20, 20, 19, 80, 80, 80, 28, 28, 27, 80, 80, 80, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 10, 6, 4, 2, 2, 4, 204, 204, 204, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 244, 244, 244, 20, 20, 19, 28, 28, 27, 12, 12, 12, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 12, 12, 12, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 244, 244, 244, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 36, 36, 36, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 100, 100, 100, 2, 2, 4, 28, 28, 27, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 10, 6, 4, 2, 2, 4, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 80, 80, 80, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 10, 6, 4, 2, 2, 4, 2, 2, 4, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 10, 6, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 44, 44, 44, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 20, 20, 19, 2, 2, 4, 20, 20, 19, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 36, 36, 36, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 28, 28, 27, 2, 2, 4, 28, 28, 27, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 221, 221, 220, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 60, 60, 60, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 60, 60, 60, 2, 2, 4, 60, 60, 60, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 228, 228, 228, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 68, 68, 68, 2, 2, 4, 2, 2, 4, 68, 68, 68, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 36, 36, 36, 100, 100, 100, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 60, 60, 60, 2, 2, 4, 2, 2, 4, 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 92, 92, 92, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 244, 244, 244, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 244, 244, 244, 2, 2, 4, 12, 12, 12, 60, 60, 60, 10, 6, 4, 36, 36, 36, 44, 44, 44, 12, 12, 12, 2, 2, 4, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 207, 148, 7, 245, 189, 12, 223, 165, 9, 2, 2, 4, 80, 80, 80, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 124, 124, 124, 2, 2, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 193, 139, 10, 242, 182, 12, 245, 189, 12, 245, 189, 12, 229, 172, 9, 2, 2, 4, 68, 68, 68, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 223, 172, 66, 236, 180, 11, 235, 179, 22, 126, 98, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 60, 60, 60, 28, 28, 27, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 215, 150, 13, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, 189, 12, 165, 114, 10, 2, 2, 4, 108, 108, 107, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 229, 172, 9, 243, 196, 11, 246, 213, 13, 148, 108, 9, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 20, 20, 19, 164, 119, 10, 226, 188, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 199, 138, 8, 223, 165, 9, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 145, 102, 10, 2, 2, 4, 20, 20, 19, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 223, 165, 9, 245, 189, 12, 226, 188, 12, 92, 67, 9, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 235, 196, 12, 243, 205, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 182, 126, 10, 216, 156, 8, 218, 163, 9, 209, 155, 9, 207, 148, 7, 229, 172, 9, 236, 180, 11, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 237, 204, 14, 2, 2, 4, 2, 2, 4, 10, 6, 4, 228, 228, 228, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 221, 221, 220, 223, 165, 9, 242, 182, 12, 229, 172, 9, 173, 120, 10, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 223, 165, 9, 235, 188, 11, 245, 189, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 215, 150, 13, 235, 179, 22, 236, 180, 11, 229, 172, 9, 236, 180, 11, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 196, 11, 170, 126, 10, 2, 2, 4, 2, 2, 4, 2, 2, 4, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 204, 204, 204, 196, 196, 196, 216, 156, 8, 236, 180, 11, 223, 165, 9, 185, 131, 9, 73, 48, 6, 2, 2, 4, 2, 2, 4, 2, 2, 4, 41, 28, 4, 185, 131, 9, 229, 172, 9, 235, 188, 11, 245, 189, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 181, 126, 47, 218, 163, 9, 236, 180, 11, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 226, 188, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 181, 180, 179, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 196, 196, 196, 196, 196, 196, 215, 150, 13, 229, 172, 9, 229, 172, 9, 207, 148, 7, 185, 131, 9, 179, 121, 7, 173, 120, 10, 179, 121, 7, 192, 133, 7, 216, 156, 8, 242, 182, 12, 245, 189, 12, 245, 189, 12, 215, 172, 9, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 218, 163, 9, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 196, 11, 194, 147, 11, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 204, 204, 204, 196, 196, 196, 201, 142, 7, 229, 172, 9, 236, 180, 11, 218, 163, 9, 207, 148, 7, 207, 148, 7, 207, 148, 7, 207, 148, 7, 223, 165, 9, 236, 180, 11, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 216, 156, 8, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 205, 12, 20, 20, 19, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 221, 221, 220, 196, 196, 196, 185, 131, 9, 223, 165, 9, 242, 182, 12, 236, 180, 11, 223, 165, 9, 223, 165, 9, 223, 165, 9, 229, 172, 9, 236, 180, 11, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 207, 148, 24, 236, 180, 11, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 216, 156, 8, 2, 2, 4, 2, 2, 4, 2, 2, 4, 12, 12, 12, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 228, 228, 228, 190, 189, 188, 185, 131, 9, 223, 165, 9, 242, 182, 12, 245, 189, 12, 236, 180, 11, 236, 180, 11, 236, 180, 11, 242, 182, 12, 245, 189, 12, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 235, 188, 11, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 206, 142, 8, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 243, 205, 12, 164, 119, 10, 2, 2, 4, 2, 2, 4, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 190, 189, 188, 2, 2, 4, 185, 131, 9, 223, 165, 9, 235, 188, 11, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 229, 172, 9, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 206, 142, 8, 229, 172, 9, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 235, 188, 11, 235, 196, 12, 236, 236, 236, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 236, 236, 236, 2, 2, 4, 10, 6, 4, 185, 131, 9, 223, 165, 9, 242, 182, 12, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 206, 142, 8, 235, 179, 22, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 235, 196, 12, 207, 148, 24, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 12, 12, 12, 2, 2, 4, 2, 2, 4, 31, 22, 4, 182, 126, 10, 223, 165, 9, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 229, 172, 9, 223, 165, 9, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 179, 121, 7, 207, 148, 7, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 242, 182, 12, 225, 180, 10, 218, 163, 9, 106, 75, 6, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 244, 244, 244, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 212, 212, 212, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 49, 35, 5, 182, 126, 10, 229, 172, 9, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 235, 179, 22, 215, 150, 13, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 199, 138, 8, 223, 165, 9, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 236, 180, 11, 223, 165, 9, 164, 109, 5, 12, 12, 12, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 254, 254, 252, 228, 228, 228, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 64, 44, 7, 182, 126, 10, 223, 165, 9, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 242, 182, 12, 223, 165, 9, 206, 142, 8, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 199, 138, 8, 223, 165, 9, 242, 182, 12, 242, 182, 12, 242, 182, 12, 245, 189, 12, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 218, 163, 9, 179, 121, 7, 41, 28, 4, 2, 2, 4, 2, 2, 4, 20, 20, 19, 52, 52, 52, 20, 20, 19, 12, 12, 12, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 85, 59, 6, 185, 131, 9, 223, 165, 9, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 242, 182, 12, 223, 165, 9, 199, 138, 8, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 192, 133, 7, 192, 133, 7, 215, 150, 13, 216, 156, 8, 223, 165, 9, 229, 172, 9, 229, 172, 9, 235, 179, 22, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 236, 180, 11, 209, 155, 9, 164, 109, 5, 91, 58, 5, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 91, 58, 5, 182, 126, 10, 216, 156, 8, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 242, 182, 12, 235, 179, 22, 223, 165, 9, 216, 156, 8, 192, 133, 7, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 144, 96, 7, 164, 109, 5, 179, 121, 7, 182, 126, 10, 192, 133, 7, 201, 142, 7, 206, 142, 8, 216, 156, 8, 223, 165, 9, 229, 172, 9, 235, 179, 22, 242, 182, 12, 245, 189, 12, 245, 189, 12, 245, 189, 12, 235, 179, 22, 223, 165, 9, 182, 126, 10, 151, 97, 5, 91, 58, 5, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 83, 54, 6, 171, 114, 5, 199, 138, 8, 223, 165, 9, 242, 182, 12, 242, 182, 12, 242, 182, 12, 242, 182, 12, 229, 172, 9, 216, 156, 8, 199, 138, 8, 171, 114, 5, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 135, 88, 5, 151, 97, 5, 157, 106, 7, 164, 109, 5, 179, 121, 7, 179, 121, 7, 192, 133, 7, 207, 148, 7, 216, 156, 8, 223, 165, 9, 236, 180, 11, 236, 180, 11, 223, 165, 9, 201, 142, 7, 164, 109, 5, 131, 82, 4, 73, 48, 6, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 2, 2, 4, 73, 48, 6, 155, 102, 5, 182, 126, 10, 215, 150, 13, 229, 172, 9, 236, 180, 11, 229, 172, 9, 216, 156, 8, 207, 148, 7, 179, 121, 7, 144, 96, 7, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 108, 69, 5, 125, 83, 5, 144, 96, 7, 155, 102, 5, 179, 121, 7, 182, 126, 10, 193, 139, 10, 199, 138, 8, 182, 126, 10, 155, 102, 5, 131, 82, 4, 96, 62, 5, 20, 13, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 64, 44, 7, 143, 90, 4, 171, 114, 5, 182, 126, 10, 192, 133, 7, 201, 142, 7, 199, 138, 8, 179, 121, 7, 171, 114, 5, 116, 73, 4, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 101, 67, 7, 125, 83, 5, 131, 82, 4, 131, 82, 4, 131, 82, 4, 116, 73, 4, 91, 58, 5, 57, 38, 32, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 83, 54, 6, 131, 82, 4, 157, 106, 7, 164, 109, 5, 164, 109, 5, 164, 109, 5, 135, 88, 5, 83, 54, 6, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 73, 48, 6, 96, 62, 5, 91, 58, 5, 73, 48, 6, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 64, 44, 7, 96, 62, 5, 108, 69, 5, 101, 67, 7, 96, 62, 5, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156 }; fldigi-4.2.05/src/ifkp/ifkp_varicode.cxx0000664000175000017500000002221014532252172015034 00000000000000int ifkp_varicode[][2] = { { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {27,31}, { 0, 0}, {28,30}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {28, 0}, {11,30}, {12,30}, {13,30}, {14,30}, {15,30}, {16,30}, {17,30},//' '!-' {18,30}, {19,30}, {20,30}, {21,30}, {27,29}, {22,30}, {27, 0}, {23,30}, {10,30}, { 1,30}, { 2,30}, { 3,30}, { 4,30}, { 5,30}, { 6,30}, { 7,30},// 0 - 7 { 8,30}, { 9,30}, {24,30}, {25,30}, {26,30}, { 0,31}, {27,30}, {28,29},// 8, 9 { 0,29}, { 1,29}, { 2,29}, { 3,29}, { 4,29}, { 5,29}, { 6,29}, { 7,29}, { 8,29}, { 9,29}, {10,29}, {11,29}, {12,29}, {13,29}, {14,29}, {15,29}, {16,29}, {17,29}, {18,29}, {19,29}, {20,29}, {21,29}, {22,29}, {23,29}, // ... : {24,29}, {25,29}, {26,29}, { 1,31}, { 2,31}, { 3,31}, { 4,31}, { 5,31}, { 9,31}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 0}, { 5, 0}, { 6, 0}, { 7, 0},// @ - g { 8, 0}, { 9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0},// h - o {16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0},// p - w {24, 0}, {25, 0}, {26, 0}, { 6,31}, { 7,31}, { 8,31}, { 0,30}, {28,31},// x - 127 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//135 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//143 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//151 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//159 { 0, 0}, { 0, 0}, { 0, 0}, {14,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//167 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//175 {12,31}, {10,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//183 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//191 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//199 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//207 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {13,31},//215 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//223 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//231 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//239 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {11,31},//247 {12,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0} //255 }; /* * The same in a format more suitable for decoding. * The index is the varicode symbol, being 1-2 nibbles. The value is the * ASCII character. * NB. Do NOT use CR as a line feed, as you will get an extra space and the * new line will be indented. Use LF = ascii 10 instead. */ // decode [ prev * 32 + curr] ; 0 < prev < 29; curr == 29, 30, 31 int ifkp_varidecode[] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 00, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122, 46, 32, 64,126, 61, // 0 - 31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 49, 91, // 32 - 63 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 50, 92, // 2 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 51, 93, // 3 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, 52, 94, // 4 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, 53, 95, // 5 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 54,123, // 6 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, 55,124, // 7 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 72, 56,125, // 8 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 73, 57, 96, // 9 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 48,177, // 10 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, 33,247, // 11 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, 34,176, // 12 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, 35,215, // 13 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 78, 36,163, // 14 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 79, 37, -1, // 15 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, 38, -1, // 16 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 39, -1, // 17 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, 40, -1, // 18 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, 41, -1, // 19 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 42, -1, // 20 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, 43, -1, // 21 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, 45, -1, // 22 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 47, -1, // 23 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, 58, -1, // 24 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, 59, -1, // 25 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, 60, -1, // 26 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 62, 8, // 27 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, 10,127, // 28 }; const char *ifkp_ascii[256] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", "<160>", "<161>", "<162>", "£", "<164>", "<165>", "<166>", "<167>", "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", "°", "±", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "×", "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "÷", "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" }; fldigi-4.2.05/src/ifkp/ifkp-pic.cxx0000664000175000017500000006233514611711171013742 00000000000000// ---------------------------------------------------------------------------- // ifkppic.cxx -- ifkp image support functions // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gifkp source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "gettext.h" #include "fileselect.h" #include "timeops.h" Fl_Double_Window *ifkppicRxWin = (Fl_Double_Window *)0; picture *ifkppicRx = (picture *)0; Fl_Button *btnifkpRxReset = (Fl_Button *)0; Fl_Button *btnifkpRxSave = (Fl_Button *)0; Fl_Button *btnifkpRxClose = (Fl_Button *)0; Fl_Counter *ifkpcnt_phase = (Fl_Counter *)0; Fl_Counter *ifkpcnt_slant = (Fl_Counter *)0; Fl_Double_Window *ifkppicTxWin = (Fl_Double_Window *)0; picture *ifkppicTx = (picture *)0; Fl_Button *btnifkppicTransmit = (Fl_Button *)0; Fl_Button *btnifkppicTxSendAbort = (Fl_Button *)0; Fl_Button *btnifkppicTxLoad = (Fl_Button *)0; Fl_Button *btnifkppicTxClose = (Fl_Button *)0; Fl_Choice *selifkppicSize = (Fl_Choice *)0; Fl_Check_Button *btnifkppicTxGrey = (Fl_Check_Button *)0; void ifkp_showRxViewer(char c); void ifkp_createRxViewer(); Fl_Shared_Image *ifkpTxImg = (Fl_Shared_Image *)0; unsigned char *ifkpxmtimg = (unsigned char *)0; unsigned char *ifkpxmtpicbuff = (unsigned char *)0; #define RAWSIZE 640*(480 + 8)*3*ifkp::IMAGEspp #define RAWSTART 640*4*3*ifkp::IMAGEspp unsigned char *ifkp_rawvideo = 0;//[RAWSIZE + 1]; int ifkp_numpixels; int ifkp_pixelptr; int ifkp_rawcol; int ifkp_rawrow; int ifkp_rawrgb; char ifkp_image_type = 'S'; char ifkp_txclr_tooltip[24]; char ifkp_txgry_tooltip[24]; static int translate = 0; static bool enabled = false; static std::string ifkp_fname; std::string ifkp::imageheader; std::string ifkp::avatarheader; void ifkp_correct_video() { int W = ifkppicRx->w(); int H = ifkppicRx->h(); int slant = ifkpcnt_slant->value(); int vidsize = W * H; int index, rowptr, colptr; float ratio = (((float)vidsize - (float)slant)/(float)vidsize); unsigned char vid[W * H * 3]; for (int row = 0; row < H; row++) { rowptr = W * 3 * row * ifkp::IMAGEspp; for (int col = 0; col < W; col++) { colptr = ifkp::IMAGEspp*col; for (int rgb = 0; rgb < 3; rgb++) { index = ratio*(rowptr + colptr + ifkp::IMAGEspp*W*rgb); index += RAWSTART - ifkp::IMAGEspp*ifkp_pixelptr; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[rgb + 3 * (col + row * W)] = ifkp_rawvideo[index]; } } } ifkppicRx->video(vid, W*H*3); } void ifkp_updateRxPic(unsigned char data, int pos) { if (!ifkppicRxWin->shown()) ifkppicRx->show(); ifkppicRx->pixel(data, pos); int W = ifkppicRx->w(); if (ifkp_image_type == 'F' || ifkp_image_type == 'p' || ifkp_image_type == 'm' || ifkp_image_type == 'l' || ifkp_image_type == 's' || ifkp_image_type == 'v') { int n = RAWSTART + ifkp::IMAGEspp*(ifkp_rawcol + W * (ifkp_rawrgb + 3 * ifkp_rawrow)); if (n < RAWSIZE) for (int i = 0; i < ifkp::IMAGEspp; i++) ifkp_rawvideo[n + i] = data; ifkp_rawrgb++; if (ifkp_rawrgb == 3) { ifkp_rawrgb = 0; ifkp_rawcol++; if (ifkp_rawcol == W) { ifkp_rawcol = 0; ifkp_rawrow++; } } } else for (int i = 0; i < ifkp::IMAGEspp; i++) ifkp_rawvideo[RAWSTART + ifkp::IMAGEspp*ifkp_numpixels + i] = data; ifkp_numpixels++; if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) ifkp_numpixels = RAWSIZE - RAWSTART - ifkp::IMAGEspp; } void cb_btnifkpRxReset(Fl_Widget *, void *) { progStatus.ifkp_rx_abort = true; } void cb_btnifkpRxSave(Fl_Widget *, void *) { ifkppicRx->save_png(std::string(ifkp_fname).append(".png").c_str()); } void cb_btnifkpRxClose(Fl_Widget *, void *) { ifkppicRxWin->hide(); progStatus.ifkp_rx_abort = true; } void ifkp_save_raw_video() { time_t time_sec = time(0); struct tm ztime; (void)gmtime_r(&time_sec, &ztime); char sztime[20]; strftime(sztime, sizeof(sztime), "%Y%m%d%H%M%Sz", &ztime); ifkp_fname.assign(PicsDir).append("IFKP").append(sztime); FILE *raw = fl_fopen(std::string(ifkp_fname).append(".raw").c_str(), "wb"); fwrite(&ifkp_image_type, 1, 1, raw); fwrite(ifkp_rawvideo, 1, RAWSIZE, raw); fclose(raw); } void ifkp_load_raw_video() { // abort & close any Rx video processing int image_type = 0; std::string image_types = "TtSsLlFVvPpMm"; if (!ifkppicRxWin) ifkp_createRxViewer(); else ifkppicRxWin->hide(); const char *p = FSEL::select( _("Load raw image file"), "Image\t*.raw\n", PicsDir.c_str()); if (!p || !*p) return; ifkp_fname.assign(p); size_t p_raw = ifkp_fname.find(".raw"); if (p_raw != std::string::npos) ifkp_fname.erase(p_raw); FILE *raw = fl_fopen(p, "rb"); int numread = fread(&image_type, 1, 1, raw); if (numread != 1) { fclose(raw); return; } if (image_types.find(ifkp_image_type) != std::string::npos) { ifkp_showRxViewer(image_type); numread = fread(ifkp_rawvideo, 1, RAWSIZE, raw); if (numread == RAWSIZE) { ifkpcnt_phase->activate(); ifkpcnt_slant->activate(); btnifkpRxSave->activate(); ifkp_correct_video(); ifkppicRxWin->redraw(); } } fclose(raw); } void cb_ifkp_cnt_phase(Fl_Widget *, void *data) { ifkp_pixelptr = ifkpcnt_phase->value(); if (ifkp_pixelptr >= RAWSTART/ifkp::IMAGEspp) { ifkp_pixelptr = RAWSTART/ifkp::IMAGEspp - 1; ifkpcnt_phase->value(ifkp_pixelptr); } if (ifkp_pixelptr < -RAWSTART/ifkp::IMAGEspp) { ifkp_pixelptr = -RAWSTART/ifkp::IMAGEspp; ifkpcnt_phase->value(ifkp_pixelptr); } ifkp_correct_video(); } void cb_ifkp_cnt_slant(Fl_Widget *, void *) { ifkp_correct_video(); } void ifkp_disableshift() { if (!ifkppicRxWin) return; ifkpcnt_phase->deactivate(); ifkpcnt_slant->deactivate(); btnifkpRxSave->deactivate(); ifkppicRxWin->redraw(); } void ifkp_enableshift() { if (!ifkppicRxWin) return; ifkpcnt_phase->activate(); ifkpcnt_slant->activate(); btnifkpRxSave->activate(); ifkp_save_raw_video(); ifkppicRxWin->redraw(); } void ifkp_createRxViewer() { ifkppicRxWin = new Fl_Double_Window(324, 274, _("IFKP Rx Image")); ifkppicRxWin->xclass(PACKAGE_NAME); ifkppicRxWin->begin(); ifkppicRx = new picture(2, 2, 320, 240); ifkppicRx->noslant(); Fl_Group *buttons = new Fl_Group(0, ifkppicRxWin->h() - 26, ifkppicRxWin->w(), 26, ""); buttons->box(FL_FLAT_BOX); btnifkpRxReset = new Fl_Button(2, ifkppicRxWin->h() - 26, 40, 24, "Reset"); btnifkpRxReset->callback(cb_btnifkpRxReset, 0); ifkpcnt_phase = new Fl_Counter(46, ifkppicRxWin->h() - 24, 80, 20, ""); ifkpcnt_phase->step(1); ifkpcnt_phase->lstep(10); ifkpcnt_phase->minimum(-RAWSTART + 1); ifkpcnt_phase->maximum(RAWSTART - 1); ifkpcnt_phase->value(0); ifkpcnt_phase->callback(cb_ifkp_cnt_phase, 0); ifkpcnt_phase->tooltip(_("Phase correction")); ifkpcnt_slant = new Fl_Counter(140, ifkppicRxWin->h() - 24, 80, 20, ""); ifkpcnt_slant->step(1); ifkpcnt_slant->lstep(10); ifkpcnt_slant->minimum(-200); ifkpcnt_slant->maximum(200); ifkpcnt_slant->value(0); ifkpcnt_slant->callback(cb_ifkp_cnt_slant, 0); ifkpcnt_slant->tooltip(_("Slant correction")); btnifkpRxSave = new Fl_Button(226, ifkppicRxWin->h() - 26, 45, 24, _("Save")); btnifkpRxSave->callback(cb_btnifkpRxSave, 0); btnifkpRxClose = new Fl_Button(273, ifkppicRxWin->h() - 26, 45, 24, _("Close")); btnifkpRxClose->callback(cb_btnifkpRxClose, 0); buttons->end(); ifkppicRxWin->end(); ifkppicRxWin->resizable(ifkppicRx); ifkp_numpixels = 0; } void ifkp_showRxViewer(char itype) { int W = 320; int H = 240; switch (itype) { case 'L' : case 'l' : W = 320; H = 240; break; case 'S' : case 's' : W = 160; H = 120; break; case 'V' : case 'F' : W = 640; H = 480; break; case 'P' : case 'p' : W = 240; H = 300; break; case 'M' : case 'm' : W = 120; H = 150; break; case 'T' : W = 59; H = 74; break; } if (!ifkppicRxWin) ifkp_createRxViewer(); int winW, winH; int ifkppicX, ifkppicY; winW = W < 320 ? 324 : W + 4; winH = H < 240 ? 274 : H + 34; ifkppicX = (winW - W) / 2; ifkppicY = (winH - 30 - H) / 2; ifkppicRxWin->size(winW, winH); ifkppicRx->resize(ifkppicX, ifkppicY, W, H); ifkppicRxWin->init_sizes(); ifkppicRx->clear(); ifkppicRxWin->show(); ifkp_disableshift(); if (ifkp_rawvideo == 0) ifkp_rawvideo = new unsigned char [RAWSIZE + 1]; memset(ifkp_rawvideo, 0, RAWSIZE); ifkp_numpixels = 0; ifkp_pixelptr = 0; ifkp_rawrow = ifkp_rawrgb = ifkp_rawcol = 0; ifkp_image_type = itype; } void ifkp_clear_rximage() { ifkppicRx->clear(); ifkp_disableshift(); translate = 0; enabled = false; ifkp_numpixels = 0; ifkp_pixelptr = 0; ifkpcnt_phase->value(0); ifkpcnt_slant->value(0); ifkp_rawrow = ifkp_rawrgb = ifkp_rawcol = 0; } //------------------------------------------------------------------------------ // image transmit functions //------------------------------------------------------------------------------ int ifkp_load_image(const char *n) { int D = 0; unsigned char *img_data; int W = 640; int H = 480; switch (selifkppicSize->value()) { case 0 : W = 59; H = 74; break; case 1 : W = 120; H = 150; break; case 2 : W = 240; H = 300; break; case 3 : W = 160; H = 120; break; case 4 : W = 320; H = 240; break; case 5 : W = 640; H = 480; break; } if (ifkpTxImg) { ifkpTxImg->release(); ifkpTxImg = 0; } ifkpTxImg = Fl_Shared_Image::get(n, W, H); if (!ifkpTxImg) return 0; if (ifkpTxImg->count() > 1) { ifkpTxImg->release(); ifkpTxImg = 0; return 0; } ifkppicTx->hide(); ifkppicTx->clear(); img_data = (unsigned char *)ifkpTxImg->data()[0]; D = ifkpTxImg->d(); if (ifkpxmtimg) delete [] ifkpxmtimg; ifkpxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(ifkpxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; ifkpxmtimg[j] = img_data[k]; ifkpxmtimg[j+1] = img_data[k+1]; ifkpxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; ifkpxmtimg[j] = ifkpxmtimg[j+1] = ifkpxmtimg[j+2] = img_data[i]; } } else return 0; // ifkp_showTxViewer(W, H); char* label = strdup(n); ifkppicTxWin->copy_label(basename(label)); free(label); // load the ifkppicture widget with the rgb image ifkppicTx->show(); ifkppicTxWin->redraw(); ifkppicTx->video(ifkpxmtimg, W * H * 3); btnifkppicTransmit->activate(); return 1; } void ifkp_updateTxPic(unsigned char data, int pos) { if (!ifkppicTxWin->shown()) ifkppicTx->show(); ifkppicTx->pixel(data, pos); } void cb_ifkppicTxLoad(Fl_Widget *, void *) { const char *fn = FSEL::select(_("Load image file"), "Image\t*.{png,,gif,jpg,jpeg}\n", PicsDir.c_str()); if (!fn) return; if (!*fn) return; ifkp_load_image(fn); } void ifkp_clear_tximage() { ifkppicTx->clear(); } void cb_ifkppicTxClose( Fl_Widget *w, void *) { ifkppicTxWin->hide(); } int ifkppic_TxGetPixel(int pos, int color) { return ifkpxmtimg[3*pos + color]; // color = {RED, GREEN, BLUE} } void cb_ifkppicTransmit( Fl_Widget *w, void *) { bool grey = btnifkppicTxGrey->value(); char ch = ' '; std::string picmode = " pic%"; switch (selifkppicSize->value()) { case 0 : ifkp_showTxViewer(ch = (grey ? 't' : 'T')); break; // 59 x 74 case 1 : ifkp_showTxViewer(ch = (grey ? 'm' : 'M')); break; // 120 x 150 case 2 : ifkp_showTxViewer(ch = (grey ? 'p' : 'P')); break; // 240 x 300 case 3 : ifkp_showTxViewer(ch = (grey ? 's' : 'S')); break; // 160 x 120 case 4 : ifkp_showTxViewer(ch = (grey ? 'l' : 'L')); break; // 320 x 240 case 5 : ifkp_showTxViewer(ch = (grey ? 'F' : 'V')); break; // 640 x 480 } picmode += ch; active_modem->ifkp_send_image(picmode, grey); } void cb_ifkppicTxSendAbort( Fl_Widget *w, void *) { } void cb_selifkppicSize( Fl_Widget *w, void *) { switch (selifkppicSize->value()) { case 0 : ifkp_showTxViewer('T'); break; case 1 : ifkp_showTxViewer('M'); break; case 2 : ifkp_showTxViewer('P'); break; case 3 : ifkp_showTxViewer('S'); break; case 4 : ifkp_showTxViewer('L'); break; case 5 : ifkp_showTxViewer('V'); break; } } void ifkp_createTxViewer() { ifkppicTxWin = new Fl_Double_Window(324, 270, _("IFKP Send image")); ifkppicTxWin->xclass(PACKAGE_NAME); ifkppicTxWin->begin(); ifkppicTx = new picture (2, 2, 320, 240); ifkppicTx->noslant(); ifkppicTx->hide(); selifkppicSize = new Fl_Choice(5, 244, 90, 24); selifkppicSize->add("59 x 74"); selifkppicSize->add("120x150"); selifkppicSize->add("240x300"); selifkppicSize->add("160x120"); selifkppicSize->add("320x240"); selifkppicSize->add("640x480"); selifkppicSize->value(1); selifkppicSize->callback(cb_selifkppicSize, 0); btnifkppicTxGrey = new Fl_Check_Button(99, 247, 18, 18); btnifkppicTxGrey->tooltip(_("Send grey scale image")); btnifkppicTxGrey->value(0); btnifkppicTxLoad = new Fl_Button(120, 244, 60, 24, _("Load")); btnifkppicTxLoad->callback(cb_ifkppicTxLoad, 0); btnifkppicTransmit = new Fl_Button(ifkppicTxWin->w() - 130, 244, 60, 24, "Xmt"); btnifkppicTransmit->callback(cb_ifkppicTransmit, 0); btnifkppicTxSendAbort = new Fl_Button(ifkppicTxWin->w() - 130, 244, 60, 24, "Abort Xmt"); btnifkppicTxSendAbort->callback(cb_ifkppicTxSendAbort, 0); btnifkppicTxClose = new Fl_Button(ifkppicTxWin->w() - 65, 244, 60, 24, _("Close")); btnifkppicTxClose->callback(cb_ifkppicTxClose, 0); btnifkppicTxSendAbort->hide(); btnifkppicTransmit->deactivate(); ifkppicTxWin->end(); } void ifkp_load_scaled_image(std::string fname, bool gray) { if (!ifkppicTxWin) ifkp_createTxViewer(); int D = 0; unsigned char *img_data; int W = 160; int H = 120; int winW = 644; int winH = 512; int ifkppicX = 0; int ifkppicY = 0; std::string picmode = "pic% \n"; if (ifkpTxImg) { ifkpTxImg->release(); ifkpTxImg = 0; } ifkpTxImg = Fl_Shared_Image::get(fname.c_str()); if (!ifkpTxImg) return; int iW = ifkpTxImg->w(); int iH = ifkpTxImg->h(); int aspect = 0; if (iW > iH ) { if (iW >= 640) { W = 640; H = 480; winW = 644; winH = 484; aspect = 5; picmode[4] = 'V'; if (gray) picmode[4] = 'F'; } else if (iW >= 320) { W = 320; H = 240; winW = 324; winH = 244; aspect = 4; picmode[4] = 'L'; if (gray) picmode[4] = 'l'; } else { W = 160; H = 120; winW = 164; winH = 124; aspect = 3; picmode[4] = 'S'; if (gray) picmode[4] = 's'; } } else { if (iH >= 300) { W = 240; H = 300; winW = 244; winH = 304; aspect = 2; picmode[4] = 'P'; if (gray) picmode[4] = 'p'; } else if (iH >= 150) { W = 120; H = 150; winW = 124; winH = 154; aspect = 1; picmode[4] = 'M'; if (gray) picmode[4] = 'm'; } else { W = 59; H = 74; winW = 67; winH = 82; aspect = 0; picmode[4] = 'T'; if (gray) picmode[4] = 't'; } } { Fl_Image *temp; selifkppicSize->value(aspect); temp = ifkpTxImg->copy(W, H); ifkpTxImg->release(); ifkpTxImg = (Fl_Shared_Image *)temp; } if (ifkpTxImg->count() > 1) { ifkpTxImg->release(); ifkpTxImg = 0; return; } ifkppicTx->hide(); ifkppicTx->clear(); img_data = (unsigned char *)ifkpTxImg->data()[0]; D = ifkpTxImg->d(); if (ifkpxmtimg) delete [] ifkpxmtimg; ifkpxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(ifkpxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; ifkpxmtimg[j] = img_data[k]; ifkpxmtimg[j+1] = img_data[k+1]; ifkpxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; ifkpxmtimg[j] = ifkpxmtimg[j+1] = ifkpxmtimg[j+2] = img_data[i]; } } else return; char* label = strdup(fname.c_str()); ifkppicTxWin->copy_label(basename(label)); free(label); // load the ifkppicture widget with the rgb image ifkppicTxWin->size(winW, winH); ifkppicX = (winW - W) / 2; ifkppicY = (winH - H) / 2; ifkppicTx->resize(ifkppicX, ifkppicY, W, H); selifkppicSize->hide(); btnifkppicTransmit->hide(); btnifkppicTxLoad->hide(); btnifkppicTxClose->hide(); btnifkppicTxSendAbort->hide(); ifkppicTx->video(ifkpxmtimg, W * H * 3); ifkppicTx->show(); ifkppicTxWin->show(); active_modem->ifkp_send_image(picmode, gray); return; } void ifkp_showTxViewer(char c) { if (!ifkppicTxWin) ifkp_createTxViewer(); int winW = 644, winH = 512, W = 480, H = 320; int ifkppicX, ifkppicY; ifkppicTx->clear(); switch (c) { case 'T' : case 't' : W = 59; H = 74; winW = 324; winH = 184; selifkppicSize->value(0); break; case 'S' : case 's' : W = 160; H = 120; winW = 324; winH = 154; selifkppicSize->value(3); break; case 'L' : case 'l' : W = 320; H = 240; winW = 324; winH = 274; selifkppicSize->value(4); break; case 'F' : case 'V' : W = 640; H = 480; winW = 644; winH = 514; selifkppicSize->value(5); break; case 'P' : case 'p' : W = 240; H = 300; winW = 324; winH = 334; selifkppicSize->value(2); break; case 'M' : case 'm' : W = 120; H = 150; winW = 324; winH = 184; selifkppicSize->value(1); break; } ifkppicTxWin->size(winW, winH); ifkppicX = (winW - W) / 2; ifkppicY = (winH - 26 - H) / 2; ifkppicTx->resize(ifkppicX, ifkppicY, W, H); selifkppicSize->resize(5, winH - 26, 90, 24); btnifkppicTxGrey->resize(selifkppicSize->x() + selifkppicSize->w() + 4, winH - 23, 18, 18); btnifkppicTxLoad->resize(btnifkppicTxGrey->x() + btnifkppicTxGrey->w() + 4, winH - 26, 60, 24); btnifkppicTransmit->resize(winW - 130, winH - 26, 60, 24); btnifkppicTxSendAbort->resize(winW - 130, winH - 26, 60, 24); btnifkppicTxClose->resize(winW -65, winH - 26, 60, 24); selifkppicSize->show(); btnifkppicTransmit->show(); btnifkppicTxLoad->show(); btnifkppicTxClose->show(); btnifkppicTxSendAbort->hide(); ifkppicTxWin->show(); } void ifkp_deleteTxViewer() { if (ifkppicTxWin) ifkppicTxWin->hide(); if (ifkppicTx) { delete ifkppicTx; ifkppicTx = 0; } delete [] ifkpxmtimg; ifkpxmtimg = 0; delete [] ifkpxmtpicbuff; ifkpxmtpicbuff = 0; if (ifkppicTxWin) delete ifkppicTxWin; ifkppicTxWin = 0; } void ifkp_deleteRxViewer() { if (ifkppicRxWin) ifkppicRxWin->hide(); if (ifkppicRx) { delete ifkppicRx; ifkppicRx = 0; } if (ifkppicRxWin) { delete ifkppicRxWin; ifkppicRxWin = 0; } } int ifkp_print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix) { int time_min = (int)(time_sec / 60); time_sec -= time_min * 60; if (time_min) return snprintf(str, len, "%s %02dm %2.1fs%s", prefix, time_min, time_sec, suffix); else return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); } // ----------------------------------------------------------------------------- // avatar send/recv // ----------------------------------------------------------------------------- static Fl_Shared_Image *shared_avatar_img = (Fl_Shared_Image *)0; static unsigned char *avatar_img = (unsigned char *)0; static Fl_Shared_Image *my_avatar_img = (Fl_Shared_Image *)0; static int avatar_phase_correction = 0; static unsigned char avatar[59 * 74 * 3]; void ifkp_clear_avatar() { ifkp_avatar->clear(); avatar_phase_correction = 0; ifkp_numpixels = 0; ifkp_rawrow = ifkp_rawrgb = ifkp_rawcol = 0; ifkp_avatar->video(tux_img, sizeof(tux_img)); } // W always 59, H always 74 int ifkp_load_avatar(std::string image_fname, int W, int H) { W = 59; H = 74; if (image_fname.empty()) { ifkp_clear_avatar(); return 1; } int D = 0; unsigned char *img_data; if (shared_avatar_img) { shared_avatar_img->release(); shared_avatar_img = 0; } for (size_t n = 0; n < image_fname.length(); n++) image_fname[n] = tolower(image_fname[n]); std::string fname = AvatarDir; fname.append(image_fname).append(".png"); FILE *temp = fl_fopen(fname.c_str(), "rb"); if (temp) { fseek(temp, 0L, SEEK_SET); fclose(temp); } else { ifkp_avatar->video(tux_img, 59 * 74 * 3); return 1; } shared_avatar_img = Fl_Shared_Image::get(fname.c_str(), W, H); // force image to be retrieved from hard drive vice shared image memory shared_avatar_img->reload(); if (!shared_avatar_img) { ifkp_avatar->video(tux_img, 59 * 74 * 3); return 1; } if (shared_avatar_img->count() > 1) { shared_avatar_img->release(); shared_avatar_img = 0; ifkp_avatar->video(tux_img, 59 * 74 * 3); return 0; } img_data = (unsigned char *)shared_avatar_img->data()[0]; D = shared_avatar_img->d(); if (avatar_img) delete [] avatar_img; avatar_img = new unsigned char [W * H * 3]; if (D == 3) memcpy(avatar_img, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; avatar_img[j] = img_data[k]; avatar_img[j+1] = img_data[k+1]; avatar_img[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; avatar_img[j] = avatar_img[j+1] = avatar_img[j+2] = img_data[i]; } } else { ifkp_avatar->video(tux_img, W * H * 3); return 0; } ifkp_avatar->video(avatar_img, W * H * 3); shared_avatar_img->release(); shared_avatar_img = 0; return 1; } void correct_avatar() { int W = 59; int H = 74; int index, rowptr, colptr; unsigned char vid[W * H * 3]; if (avatar_phase_correction >= RAWSTART/ifkp::IMAGEspp) { avatar_phase_correction = RAWSTART/ifkp::IMAGEspp - 1; } if (avatar_phase_correction < -RAWSTART/ifkp::IMAGEspp) { avatar_phase_correction = -RAWSTART/ifkp::IMAGEspp; } for (int row = 0; row < H; row++) { rowptr = W * 3 * row * ifkp::IMAGEspp; for (int col = 0; col < W; col++) { colptr = ifkp::IMAGEspp*col; for (int rgb = 0; rgb < 3; rgb++) { index = rowptr + colptr + W*rgb*ifkp::IMAGEspp; index += RAWSTART - ifkp::IMAGEspp * avatar_phase_correction; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[rgb + 3 * (col + row * W)] = ifkp_rawvideo[index]; } } } ifkp_avatar->video(vid, W*H*3); } void ifkp_update_avatar(unsigned char data, int pos) { if (ifkp_rawvideo == 0) { ifkp_rawvideo = new unsigned char [RAWSIZE + 1]; memset(ifkp_rawvideo, 0, RAWSIZE); } ifkp_avatar->pixel(data, pos); for (int i = 0; i < ifkp::IMAGEspp; i++) ifkp_rawvideo[RAWSTART + ifkp::IMAGEspp*ifkp_numpixels + i] = data; ifkp_numpixels++; if (ifkp_numpixels >= (RAWSIZE - RAWSTART - ifkp::IMAGEspp)) ifkp_numpixels = RAWSIZE - RAWSTART - ifkp::IMAGEspp; } int ifkp_get_avatar_pixel(int pos, int color) { // color = {RED, GREEN, BLUE} return (int)avatar[3*pos + color]; } // ADD CALLBACK HANDLING OF PHASE CORRECTIONS void cb_ifkp_send_avatar( Fl_Widget *w, void *) { if (Fl::event_button() == FL_RIGHT_MOUSE) { if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { if (ifkp_numpixels == 0) return; avatar_phase_correction += 5; correct_avatar(); return; } if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { if (ifkp_numpixels == 0) return; avatar_phase_correction++; correct_avatar(); return; } std::string image_fname = progdefaults.ifkp_avatar_image_file; if (image_fname.empty()) { image_fname = progdefaults.operCall; if (image_fname.empty()) { image_fname = progdefaults.myCall; if (image_fname.empty()) { ifkp_avatar->video(tux_img, 59 * 74 * 3); return; } } } if (image_fname.find(".gif") == std::string::npos && image_fname.find(".png") == std::string::npos && image_fname.find(".PNG") == std::string::npos && image_fname.find(".jp") == std::string::npos && // jpg, jpeg image_fname.find(".JP") == std::string::npos ) { // JPG, JPEG for (size_t n = 0; n < image_fname.length(); n++) image_fname[n] = tolower(image_fname[n]); std::string fname = AvatarDir; fname.append(image_fname).append(".png"); } my_avatar_img = Fl_Shared_Image::get(image_fname.c_str(), 59, 74); if (!my_avatar_img) { return; } unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; memset(avatar, 0, sizeof(avatar)); int D = my_avatar_img->d(); if (D == 3) memcpy(avatar, img_data, 59*74*3); else if (D == 4) { int i, j, k; for (i = 0; i < 59*74; i++) { j = i*3; k = i*4; avatar[j] = img_data[k]; avatar[j+1] = img_data[k+1]; avatar[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < 59*74; i++) { j = i * 3; avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; } } else { return; } if (!ifkppicTxWin) ifkp_createTxViewer(); active_modem->ifkp_send_avatar(); return; } if (Fl::event_button() == FL_LEFT_MOUSE) { if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { if (ifkp_numpixels == 0) return; avatar_phase_correction -= 5; correct_avatar(); return; } if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { if (ifkp_numpixels == 0) return; avatar_phase_correction--; correct_avatar(); return; } std::string mycall = inpCall->value(); if (mycall.empty()) return; for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); std::string fname = AvatarDir; fname.append(mycall).append(".png"); ifkp_avatar->save_png(fname.c_str()); } } fldigi-4.2.05/src/fldigirc.rc0000664000175000017500000000041614532252172012667 00000000000000#define BUILD_FLDIGI 1 #include "config.h" #define IDI_ICON 101 IDI_ICON ICON DISCARDABLE "fldigi.ico" #define RC_FILE_VERSION_QUAD FLDIGI_VERSION_MAJOR,FLDIGI_VERSION_MINOR,0,0 #define RC_FILE_DESCRIPTION "Fast Light Digital Modem Application" #include "common.rc" fldigi-4.2.05/src/combo/0000775000175000017500000000000014611714004011727 500000000000000fldigi-4.2.05/src/combo/combo.cxx0000664000175000017500000003615614611711171013507 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "config.h" #include "combo.h" void popbrwsr_cb (Fl_Widget *v, long d); Fl_PopBrowser::Fl_PopBrowser (int X, int Y, int W, int H, const char *label) : Fl_Double_Window (X, Y, W, H, label) { hRow = H; wRow = W; clear_border(); box(FL_BORDER_BOX); align(FL_ALIGN_INSIDE); popbrwsr = new Fl_Select_Browser(0,0,wRow,hRow, ""); popbrwsr->callback ( (Fl_Callback*)popbrwsr_cb); popbrwsr->align(FL_ALIGN_INSIDE); // DST Need to mark the Fl_Select_Browser as INVISIBLE at initialization by calling 'hide'. // The 'visible_r' test will initially indicate that this // widget is visible because both it and its parent window // i.e., the PopBrowser/Fl_Window, do not have their INVISIBLE flag // set, even though the Fl_Select_Browser has not been shown. // The CB handle function needs to respond to the FL_KEYUP // associated with the user pressing down-arrow over the // input box IF and ONLY IF the Fl_Select_Browser is not shown. popbrwsr->hide(); parentCB = 0; parentWindow = 0; end(); set_modal(); } Fl_PopBrowser::~Fl_PopBrowser () { delete popbrwsr; } int Fl_PopBrowser::handle(int event) { Fl_ComboBox *cbx = (Fl_ComboBox*)this->parent(); // Can't use 'event_inside(widget *)' because the PopBrowser is a // (sub)window and the event_x and event_y coordinates are translated // to the subwindow frame origin before this 'handle' function is called. if (!Fl::event_inside(0, 0, this->w(), this->h()) && event == FL_PUSH) { pophide(); return 1; } if (event == FL_KEYDOWN) { int kbd = Fl::event_key(); char key = Fl::event_text()[0]; if (kbd == FL_Down) { if (popbrwsr->value() < popbrwsr->size()) popbrwsr->select(popbrwsr->value() + 1); return 1; } if (kbd == FL_Up && popbrwsr->value() > 1) { popbrwsr->select(popbrwsr->value() - 1); return 1; } if (key == '\r' || kbd == FL_Enter) { // kbd test for OS X int n = popbrwsr->value() - 1; pophide(); cbx->index(n); cbx->do_callback(); return 1; } if (key == '\b' || kbd == FL_BackSpace) { // kbd test for OS X if (!keystrokes.empty()) keystrokes.erase(keystrokes.length() - 1, 1); return 1; } if (key == 0x1b || kbd == FL_Escape) { // kbd test for OS X pophide(); return 1; } if (key >= ' ' && key <= 0x7f) { keystrokes += key; for (int i = 0; i < cbx->listsize; i++) { if (strncasecmp(keystrokes.c_str(), cbx->datalist[i]->s, keystrokes.length()) == 0) { popbrwsr->select(i+1); popbrwsr->show(i+1); return 1; } } return 0; } } return Fl_Group::handle(event); } void Fl_PopBrowser::add(char *s, void *d) { popbrwsr->add(s,d); } void Fl_PopBrowser::clear() { popbrwsr->clear(); } void Fl_PopBrowser::sort() { return; } void Fl_PopBrowser::popshow (int x, int y) { int nRows = parentCB->numrows(); int fh = fl_height(); int height = nRows * fh + 4; if (popbrwsr->size() == 0) return; if (nRows > parentCB->lsize()) nRows = parentCB->lsize(); // Resize and reposition the popup to insure that it is within the bounds // of the uppermost parent widget. // Preferred position is just below and at the same x position as the // parent widget. Fl_Widget *gparent = parentCB; int hp = gparent->h(); while ((gparent = gparent->parent())) { hp = gparent->h(); parentWindow = gparent; } int nu = nRows, nl = nRows; int hu = nu * fh + 4, hl = nl * fh + 4; int yu = parentCB->y() - hu; int yl = y; while (nl > 1 && (yl + hl > hp)) { nl--; hl -= fh; } while (nu > 1 && yu < 0) { nu--; yu += fh; hu -= fh; } y = yl; height = hl; if (nl < nu) { y = yu; height = hu; } wRow = parentCB->w(); popbrwsr->size (wRow, height); resize (x, y, wRow, height); popbrwsr->redraw(); // Locate first occurrence of input string value in the list // and ensure it's in view when browser pops up; starts list // at beginning if no match. // This search needs to respect the uniqueness and case sensitivity spec int i = parentCB->index(); if (i >= 0 && i < parentCB->listsize) { for (i = 0; i < parentCB->listsize; i++) { if (parentCB->type_ == COMBOBOX) { if ((parentCB->listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { if (!strcasecmp(parentCB->val->value(), parentCB->datalist[i]->s)) break; } else { // case sensitive test if (!strcmp(parentCB->val->value(), parentCB->datalist[i]->s)) break; } } else { // LISTBOX case if ((parentCB->listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { if (!strcasecmp(parentCB->valbox->label(), parentCB->datalist[i]->s)) break; } else { // case sensitive test if (!strcmp(parentCB->valbox->label(), parentCB->datalist[i]->s)) break; } } } if (i == parentCB->listsize) i = 0; } popbrwsr->select (i+1); keystrokes.clear(); popbrwsr->show(); show(); for (const Fl_Widget* o = popbrwsr; o; o = o->parent()) ((Fl_Widget *)o)->set_visible(); if (parentWindow) { parentWindow->damage(FL_DAMAGE_ALL); parentWindow->redraw(); } // 'Grab' mouse events so that we can close the // Fl_Select_Browser if user clicks outside its window. Fl::grab(this); } void Fl_PopBrowser::pophide () { hide (); if (parentWindow) { parentWindow->damage(FL_DAMAGE_ALL); parentWindow->redraw(); } Fl::grab(0); Fl::focus(((Fl_ComboBox*)parent())->btn); } void Fl_PopBrowser::popbrwsr_cb_i (Fl_Widget *v, long d) { // update the return values Fl_Select_Browser *SB = (Fl_Select_Browser *)(v); Fl_PopBrowser *PB = (Fl_PopBrowser *)(SB->parent()); Fl_ComboBox *CB = (Fl_ComboBox *)(PB->parent()); int row = SB->value(); if (row == 0) return; SB->deselect(); CB->index(row - 1); PB->pophide(); CB->do_callback(); return; } void popbrwsr_cb (Fl_Widget *v, long d) { ((Fl_PopBrowser *)(v))->popbrwsr_cb_i (v, d); return; } void Fl_ComboBox::fl_popbrwsr(Fl_Widget *p) { int xpos = p->x(), ypos = p->h() + p->y(); // pass the calling widget to the popup browser so that the // correct callback function can be called when the user selects an item // from the browser list Brwsr->parentCB = (Fl_ComboBox *) p; Brwsr->clear_kbd(); Brwsr->popshow(xpos, ypos); return; } void btnComboBox_cb (Fl_Widget *v, void *d) { Fl_ComboBox *p = (Fl_ComboBox *)(v->parent()); p->fl_popbrwsr (p); return; } void val_callback(Fl_Widget *w, void *d) { Fl_Input *inp = (Fl_Input *)(w); Fl_ComboBox *cbx = (Fl_ComboBox *)(d); if (!inp->readonly()) { cbx->add(inp->value()); cbx->sort(); } } Fl_ComboBox::Fl_ComboBox (int X,int Y,int W,int H, const char *lbl, int wtype) : Fl_Group (X, Y, W, H, lbl) { width = W; height = H; type_ = wtype; valbox = new Fl_Box (FL_DOWN_BOX, X, Y, W-H, H, ""); valbox->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT); valbox->color(FL_BACKGROUND2_COLOR); val = new Fl_Input (X, Y, W-H, H, ""); val->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT); val->callback((Fl_Callback *)val_callback, this); val->when(FL_WHEN_RELEASE); val->value(""); if (type_ == LISTBOX) { valbox->show(); val->hide(); } else { val->show(); valbox->hide(); } btn = new Fl_Button (X + W - H + 1, Y, H - 1, H, "@2>"); btn->callback ((Fl_Callback *)btnComboBox_cb, 0); Brwsr = 0; datalist = new datambr *[FL_COMBO_LIST_INCR]; maxsize = FL_COMBO_LIST_INCR; for (int i = 0; i < FL_COMBO_LIST_INCR; i++) datalist[i] = 0; listsize = 0; listtype = FL_COMBO_UNIQUE_NOCASE; Brwsr = new Fl_PopBrowser(X, Y, W, H, ""); Brwsr->align(FL_ALIGN_INSIDE); idx = 0; end(); numrows_ = 8; } Fl_ComboBox::~Fl_ComboBox() { delete Brwsr; for (int i = 0; i < listsize; i++) { if (datalist[i]) { if (datalist[i]->s) delete [] datalist[i]->s; delete datalist[i]; } } delete [] datalist; } int Fl_ComboBox::handle(int event) { if (Fl::event_inside(this)) { // The 'down arrow' can be used to pop up the browser if the browser // is not already visible. If the browser IS visible, IT will use // the 'down arrow' keypress to scroll its list. bool sb_visible_r = Brwsr->sb()->visible_r(); if (event == FL_KEYUP && !sb_visible_r) { int kbd = Fl::event_key(); if (kbd == FL_Down) { fl_popbrwsr (this); return 1; } } if (event == FL_MOUSEWHEEL) { if (listsize == 0) return 0; int d = Fl::event_dy(); if (d) { if (d > 0) idx ++; else idx--; if (idx < 0) idx = 0; if (idx >= listsize) idx = listsize - 1; if (type_ == LISTBOX) { valbox->label(datalist[idx]->s); valbox->redraw_label(); } else { val->value( datalist[idx]->s); val->redraw(); } Fl_Group::do_callback(); return 1; } } } return Fl_Group::handle(event); } void Fl_ComboBox::type (int t) { listtype = t; } void Fl_ComboBox::readonly(bool yes) { if (type_ == LISTBOX) return; val->readonly(yes); if (yes) val->selection_color(fl_rgb_color(173,216,230)); else val->selection_color(FL_SELECTION_COLOR); } // ComboBox value is contained in the val widget const char *Fl_ComboBox::value() { if (type_ == LISTBOX) return valbox->label(); else return val->value(); } void Fl_ComboBox::value( std::string s ) { while (s[0] == ' ') { s.erase(0,1); } if (s.empty()) { if (type_ == LISTBOX) { valbox->label(""); valbox->redraw_label(); } else { val->value(""); val->redraw(); } return; } int i; if ((listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { for (i = 0; i < listsize; i++) { if (strcasecmp (s.c_str(), datalist[i]->s) == 0) break; } } else { for (i = 0; i < listsize; i++) { if (strcmp (s.c_str(), datalist[i]->s) == 0) break; } } if ( i < listsize) { idx = i; if (type_ == LISTBOX) { valbox->label(datalist[idx]->s); valbox->redraw_label(); } else { val->value(datalist[idx]->s); val->redraw(); } } else { if (type_ == LISTBOX) { valbox->label(""); valbox->redraw_label(); } else if (type_ != LISTBOX && !val->readonly()) { insert(s.c_str(), 0); for (i = 0; i < listsize; i++) { if (strcmp (s.c_str(), datalist[i]->s) == 0) { idx = i; val->value(datalist[idx]->s); break; } val->redraw(); } } else { val->value(""); val->redraw(); } } } void Fl_ComboBox::put_value(const char *s) { value(s); } void Fl_ComboBox::index(int i) { if (i >= 0 && i < listsize) { idx = i; if (type_ == LISTBOX) { valbox->label(datalist[idx]->s); valbox->redraw_label(); } else { val->value( datalist[idx]->s); val->redraw(); } } } int Fl_ComboBox::index() { return idx; } void * Fl_ComboBox::data() { return retdata; } void Fl_ComboBox::insert(const char *str, void *d) { datalist[listsize] = new datambr; datalist[listsize]->s = new char [strlen(str) + 1]; datalist[listsize]->s[0] = 0; strcpy (datalist[listsize]->s, str); datalist[listsize]->d = 0; Brwsr->add(datalist[listsize]->s,d); listsize++; if (listsize == maxsize) { int nusize = maxsize + FL_COMBO_LIST_INCR; datambr **temparray = new datambr *[nusize]; for (int i = 0; i < listsize; i++) temparray[i] = datalist[i]; delete [] datalist; datalist = temparray; maxsize = nusize; } } // Add a single value, or a '|' delimited set of values, to // the datalist depending on the uniqueness and case comparision specification. void Fl_ComboBox::add( const char *s, void * d) { std::string str = s; std::string sinsert; size_t p = str.find("|"); bool found = false; bool last_one = false; if (p != std::string::npos) { while (true) { sinsert = str.substr(0, p); found = false; // test for in list for (int i = 0; i < listsize; i++) { if ((listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { if (strcasecmp (sinsert.c_str(), datalist[i]->s) == 0) { found = true; break; } } else // case sensitive test if (strcmp (sinsert.c_str(), datalist[i]->s) == 0) { found = true; break; } } // not in list, so add this entry if (!found) insert(sinsert.c_str(), 0); // if not the last item, erase entry in original string if (last_one) break; str.erase(0, p+1); // Look for another entry; note that there should // always be another entry past the last delimiter. if (str.find('|') == std::string::npos) { p = str.length(); last_one = true; } else p = str.find("|"); } } else { // Single entry case // Still need to test a single entry to avoid duplication in the list for (int i = 0; i < listsize; i++) { if ((listtype & FL_COMBO_UNIQUE_NOCASE) == FL_COMBO_UNIQUE_NOCASE) { if (strcasecmp (str.c_str(), datalist[i]->s) == 0) { found = true; break; } } else // case sensitive test if (strcmp (str.c_str(), datalist[i]->s) == 0) { found = true; break; } } // Single entry - not in list, so add this entry if (!found) insert(str.c_str(), 0); } } void Fl_ComboBox::clear() { Brwsr->clear(); if (listsize == 0) return; for (int i = 0; i < listsize; i++) { delete [] datalist[i]->s; delete datalist[i]; } listsize = 0; } int DataCompare( const void *x1, const void *x2 ) { int cmp; datambr *X1, *X2; X1 = *(datambr **)(x1); X2 = *(datambr **)(x2); cmp = strcasecmp (X1->s, X2->s); if (cmp < 0) return -1; if (cmp > 0) return 1; return 0; } void Fl_ComboBox::sort() { Brwsr->clear (); qsort (&datalist[0], listsize, sizeof (datambr *), DataCompare); for (int i = 0; i < listsize; i++) Brwsr->add (datalist[i]->s, datalist[i]->d); } void Fl_ComboBox::textfont (int fnt) { if (type_ == LISTBOX) valbox->labelfont (fnt); else val->textfont (fnt); } void Fl_ComboBox::textsize (uchar n) { if (type_ == LISTBOX) valbox->labelsize(n); else val->textsize (n); } void Fl_ComboBox::textcolor( Fl_Color c) { if (type_ == LISTBOX) valbox->labelcolor (c); else val->textcolor (c); } void Fl_ComboBox::color(Fl_Color c) { _color = c; if (type_ == LISTBOX) { valbox->color(c); valbox->redraw(); } else { val->color(c); val->redraw(); } if (Brwsr) Brwsr->color(c); } int Fl_ComboBox::find_index(const char *str) { if((listsize < 1) || !str) return -1; for (int i = 0; i < listsize; i++) { if(datalist[i]->s) if(strncmp(datalist[i]->s, str, FILENAME_MAX) == 0) return i; } return -1; } void Fl_ComboBox::position(int n) { if (type_ != LISTBOX) #if FLDIGI_FLTK_API_MINOR < 4 val->position(n, n); #else val->Fl_Widget::position(n, n); #endif } fldigi-4.2.05/src/feld/0000775000175000017500000000000014611714005011543 500000000000000fldigi-4.2.05/src/feld/FeldLo8-14.cxx0000664000175000017500000003101514532252172013672 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld Lo8-14 font fntchr feldlo8_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000 }, }, {'$', { 0x2000, 0x7800, 0xF800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF800, 0xF000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x4000, 0xE000, 0xE000, 0xA000, 0x4000, 0x4000, 0xE000, 0xA000, 0xB000, 0xB000, 0xF800, 0x7800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8C00, 0x8C00, 0xB400, 0xB400, 0xC400, 0xC400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x7000, 0x7000, 0x7000, 0x0000 }, }, {'2', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x7C00, 0xF800, 0x8000, 0x8000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'3', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x3C00, 0x3C00, 0x0400, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x8800, 0x8800, 0x8800, 0x8800, 0xFC00, 0xFC00, 0xFC00, 0x0800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {'5', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x0400, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'6', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'7', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x7800, 0x7800, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'9', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0x0400, 0x7C00, 0x7C00, 0x7800, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x0800, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0x8000 }, }, {'?', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x0400, 0x0C00, 0x1800, 0x3000, 0x0000, 0x0000, 0x3000, 0x3000, 0x3000 }, }, {'@', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xBC00, 0xBC00, 0x8000, 0xC000, 0xFC00, 0x7C00, 0x3C00, 0x0000 }, }, {'A', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x0000 }, }, {'B', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xF800, 0xF800, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'C', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x7C00, 0x0000 }, }, {'D', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'E', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'F', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0x9C00, 0x9C00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'H', { 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000 }, }, {'I', { 0x0000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'J', { 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'K', { 0x0000, 0x8400, 0x8400, 0x8C00, 0x9C00, 0xB800, 0xF000, 0xF000, 0xB800, 0x9C00, 0x8C00, 0x8400, 0x8400, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'M', { 0x0000, 0x8200, 0xC600, 0xEE00, 0xFE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000 }, }, {'N', { 0x0000, 0x8400, 0xC400, 0xC400, 0xE400, 0xA400, 0xB400, 0x9400, 0x9C00, 0x8C00, 0x8C00, 0x8400, 0x8400, 0x0000 }, }, {'O', { 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'P', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xF800, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x9400, 0x9400, 0xFC00, 0xFE00, 0x7E00, 0x0600, 0x0000 }, }, {'R', { 0x0000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xF800, 0xF800, 0x8C00, 0x8C00, 0x8C00, 0x0000 }, }, {'S', { 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0x7C00, 0x0400, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000 }, }, {'T', { 0x0000, 0xFE00, 0xFE00, 0xFE00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'U', { 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'V', { 0x0000, 0x8400, 0x8400, 0x8C00, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'W', { 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFE00, 0xFE00, 0x6C00, 0x0000 }, }, {'X', { 0x0000, 0x8200, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0x8200, 0x8200, 0x0000 }, }, {'Y', { 0x0000, 0x8200, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'Z', { 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x0C00, 0x0C00, 0x3800, 0x7000, 0xC000, 0xC000, 0xFC00, 0xFC00, 0xFC00, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xE000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7800, 0x7C00, 0x7C00, 0x0400, 0x7C00, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'b', { 0x8000, 0x8000, 0x8000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'d', { 0x0400, 0x0400, 0x0400, 0x7C00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x8000, 0xFC00, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x3800, 0x7800, 0x7800, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0xF000, 0xF000, 0xF000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0xFC00, 0xFC00, 0x7800 }, }, {'h', { 0x8000, 0x8000, 0x8000, 0xF800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'i', { 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0xF000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'j', { 0x0800, 0x0800, 0x0000, 0x1800, 0x1800, 0x1800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'k', { 0x8000, 0x8000, 0x8800, 0x9800, 0xB800, 0xF000, 0xE000, 0xE000, 0xB000, 0xB800, 0x9800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0xEC00, 0xFE00, 0xFE00, 0x9200, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0xB800, 0xFC00, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x7800, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xF800, 0xFC00, 0xFC00, 0x4400, 0x4400, 0x7C00, 0x7C00, 0x7800, 0x4000, 0x4000, 0x4000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0xDC00, 0xFC00, 0xFC00, 0x6000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7C00, 0xFC00, 0xFC00, 0x8000, 0xF800, 0x7C00, 0x0400, 0xFC00, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'t', { 0x4000, 0x4000, 0xF000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0xFC00, 0x7400, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0xC400, 0xE400, 0x7C00, 0x3C00, 0x0400, 0xFC00, 0xFC00, 0x7800, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0xFC00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0xC000, 0x4000, 0x6000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x6000, 0x4000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0xD800, 0xF800, 0x6C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldModern-14.cxx0000664000175000017500000003102314532252172014453 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld modern-14 font fntchr feldmodern_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xF000, 0x7800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x4000, 0xE400, 0xE400, 0x4C00, 0x1800, 0x3000, 0x6000, 0xC800, 0x9C00, 0x9C00, 0x8800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4800, 0x7000, 0xF400, 0x8C00, 0x8800, 0xFC00, 0x7400, 0x0000, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x9800, 0xB800, 0xE800, 0xC800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x3800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3000, 0x7000, 0x5000, 0xD000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0xD800, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x7800, 0x7000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0xB400, 0xBC00, 0xB800, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF000, 0xF000, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3000, 0x7800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0x7800, 0x3000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3800, 0x7800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0x7800, 0x3000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xF800, 0x7000, 0x1000, 0x1000 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8000, 0xF000, 0x7800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x7800, 0xF800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0xF800, 0xF800, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x7800, 0x7000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x4000, 0x4000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8000, 0x9000, 0xB000, 0xE000, 0xC000, 0xE000, 0xB000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0xF000, 0x7800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x7800, 0x7000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9800, 0xFC00, 0x6400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldStyl-14.cxx0000664000175000017500000003101714532252172014165 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld styl-14 font fntchr feldstyl_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0xE000, 0x6000, 0x6800, 0xD800, 0x9000, 0x9000, 0xF800, 0x6800, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x9800, 0xB800, 0xE800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000 }, }, {'2', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'3', { 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x3000, 0x1800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3000, 0x7000, 0x5000, 0xD000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'6', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x0800, 0x7800, 0x7000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x1000, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1000, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xB800, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000 }, }, {'A', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'B', { 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'C', { 0x0000, 0x3800, 0x7800, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000 }, }, {'D', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x3800, 0x7800, 0xC000, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xC800, 0x7800, 0x3000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'M', { 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'O', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000 }, }, {'P', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xB800, 0xF800, 0x7C00, 0x0C00 }, }, {'R', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x9800, 0xF000, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'S', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x0000 }, }, {'W', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x0800, 0x7800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'b', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000 }, }, {'d', { 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF800, 0x7800, 0x0000 }, }, {'f', { 0x0000, 0x3800, 0x7800, 0x4000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000 }, }, {'h', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0xF000, 0xE000, 0x0000 }, }, {'k', { 0x0000, 0x8000, 0x8000, 0x9000, 0x9000, 0xB000, 0xE000, 0xC000, 0xC000, 0xE000, 0xB000, 0x9000, 0x9000, 0x0000 }, }, {'l', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'t', { 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9000, 0xF800, 0x6800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldWide-14.cxx0000664000175000017500000003101714532252172014122 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld wide-14 font fntchr feldwide_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x4800, 0x4800, 0xFE00, 0xFE00, 0x4800, 0x4800, 0xFE00, 0xFE00, 0x4800, 0x4800, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x1000, 0x7C00, 0xFE00, 0x9200, 0x9000, 0xFC00, 0x7E00, 0x1200, 0x9200, 0xFE00, 0x7C00, 0x1000, 0x0000 }, }, {'%', { 0x0000, 0xC200, 0xC200, 0xC200, 0x0600, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8600, 0x8600, 0x8600, 0x0000 }, }, {'&', { 0x0000, 0x1800, 0x3C00, 0x6400, 0x6000, 0x3000, 0x7A00, 0x5E00, 0xCC00, 0x8400, 0x8600, 0xFE00, 0x7C00, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xE000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x1800, 0x3800, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x3800, 0x1800, 0x0000 }, }, {')', { 0x0000, 0xC000, 0xE000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0xE000, 0xC000, 0x0000 }, }, {'*', { 0x0000, 0x1000, 0x1000, 0x1000, 0xFE00, 0xFE00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0xFE00, 0xFE00, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7E00, 0xFF00, 0x8D00, 0x8D00, 0x9900, 0x9900, 0xB100, 0xB100, 0xFF00, 0x7E00, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x3000, 0x7000, 0xD000, 0x9000, 0x1000, 0x1000, 0x1000, 0x1000, 0x7C00, 0x7C00, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x0200, 0x3E00, 0x7C00, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8600, 0x0600, 0x1C00, 0x1C00, 0x0600, 0x8600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xFE00, 0xFE00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x7E00, 0x7E00, 0x4000, 0x4000, 0x7C00, 0x7E00, 0x0200, 0x0200, 0x0600, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'6', { 0x3C00, 0x7C00, 0xC000, 0x8000, 0x8000, 0xBC00, 0xFE00, 0xC200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'8', { 0x7C00, 0xFE00, 0x8200, 0x8200, 0xC600, 0x7C00, 0x7C00, 0xC600, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xFE00, 0x7E00, 0x0200, 0x0200, 0x0600, 0x7C00, 0x7800, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7C00, 0xFE00, 0x8200, 0x0200, 0x0E00, 0x1C00, 0x3000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xBA00, 0xBE00, 0xBC00, 0x8000, 0xC000, 0x7C00, 0x3C00, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xC600, 0x8200, 0x8200, 0xFE00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0x4200, 0x4200, 0x7C00, 0x7C00, 0x4200, 0x4200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x4600, 0x4200, 0x4200, 0x4200, 0x4200, 0x4600, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x8000, 0x8000, 0xF800, 0xF800, 0x8000, 0x8000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x8000, 0x8000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8000, 0x8000, 0x8E00, 0x8E00, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0E00, 0x0E00, 0x0200, 0x0200, 0x0200, 0x0200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8600, 0x8600, 0x8C00, 0x9800, 0xF000, 0xF000, 0x9800, 0x8C00, 0x8600, 0x8600, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8200, 0xC200, 0xE200, 0xB200, 0x9A00, 0x8E00, 0x8600, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0x4200, 0x4200, 0x7E00, 0x7C00, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0x8A00, 0x8A00, 0xFE00, 0x7C00, 0x0400, 0x0400 }, }, {'R', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0x8200, 0x8200, 0xFE00, 0xFC00, 0x8400, 0x8600, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8000, 0x8000, 0xFC00, 0x7E00, 0x0200, 0x0200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8600, 0x8C00, 0x9800, 0xB000, 0xE000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x1800, 0x3000, 0x6000, 0x6000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x7E00, 0x0200, 0x7E00, 0xFE00, 0x8200, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xC000, 0xC000, 0x5C00, 0x7E00, 0x6200, 0x4200, 0x4200, 0x4200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0600, 0x0600, 0x7400, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0xFE00, 0xFE00, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8200, 0x8200, 0x8600, 0xFE00, 0x7A00, 0x0200, 0x7E00, 0x7C00, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0xC000, 0xC000, 0x5C00, 0x7E00, 0x6200, 0x4200, 0x4200, 0x4200, 0xC200, 0xC200, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0800, 0x0800, 0x0000, 0x3800, 0x3800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x9800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8C00, 0x8C00, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0x9200, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xBC00, 0xFE00, 0xC200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0x8200, 0x8200, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xFC00, 0xFE00, 0x4200, 0x4200, 0x6200, 0x7E00, 0x5C00, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x1E00, 0x1E00, 0x0000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xDC00, 0xFE00, 0x6200, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0x8000, 0xFC00, 0x7E00, 0x0200, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8600, 0xFE00, 0x7A00, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3000, 0x6000, 0xC000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldVert-14.cxx0000664000175000017500000003101714532252172014152 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld vert-14 font fntchr feldvert_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0xE000, 0x6000, 0x6800, 0xD800, 0x9000, 0x9000, 0xF800, 0x6800, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x9800, 0xB800, 0xE800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x7000, 0x7000, 0x0000 }, }, {'2', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x0800, 0x3800, 0x7000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'3', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x3000, 0x1800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'6', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x0800, 0x7800, 0x7000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x1000, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1000, 0x0000, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xB800, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000 }, }, {'A', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'B', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x9800, 0xF000, 0xF000, 0x9800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'C', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000 }, }, {'D', { 0x0000, 0xE000, 0xF000, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF000, 0xE000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'M', { 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'O', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'P', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xB800, 0xF800, 0x7C00, 0x0C00 }, }, {'R', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'S', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'V', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'W', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x0800, 0x7800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'b', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000 }, }, {'d', { 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000 }, }, {'f', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'h', { 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0x6000 }, }, {'k', { 0x0000, 0x8000, 0x8000, 0x9000, 0x9000, 0xB000, 0xE000, 0xC000, 0xC000, 0xE000, 0xB000, 0x9000, 0x9000, 0x0000 }, }, {'l', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800, 0x0000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0xD800, 0xF800, 0x6000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000 }, }, {'t', { 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xC800, 0x6800, 0x3800, 0x3000, 0x6000, 0xC000, 0x8000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xF800, 0xF800, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9000, 0xF800, 0x6800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldModern8-14.cxx0000664000175000017500000003102714532252172014547 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld modern -8-14 font fntchr feldmodern8_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x2000, 0x7800, 0xF800, 0xA000, 0xF000, 0x7800, 0x2800, 0xF800, 0xF000, 0x2000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x4000, 0xE400, 0xE400, 0x4C00, 0x1800, 0x3000, 0x6000, 0xC800, 0x9C00, 0x9C00, 0x8800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x3000, 0x7800, 0x4800, 0x4800, 0x7000, 0xF400, 0x8C00, 0x8800, 0xFC00, 0x7400, 0x0000, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8C00, 0x9C00, 0xB400, 0xE400, 0xC400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0C00, 0x1800, 0x1C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4800, 0xC800, 0x8800, 0xFC00, 0xFC00, 0x0800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF800, 0xFC00, 0x0400, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0400, 0x0400, 0x0C00, 0x1800, 0x3000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0400, 0x0400, 0x7C00, 0x7800, 0x0000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0x8200, 0x8200, 0xB200, 0xBE00, 0xBC00, 0x8000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xF800, 0xF800, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x8000, 0x8000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0xC000, 0x8000, 0x8C00, 0x8C00, 0x8400, 0xC400, 0x7C00, 0x3800, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8C00, 0x9800, 0xF000, 0xF000, 0x9800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8400, 0xC400, 0xE400, 0xB400, 0x9C00, 0x8C00, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x3000, 0x7800, 0xCC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xCC00, 0x7800, 0x3000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0x9400, 0x9400, 0xFC00, 0x7800, 0x0800, 0x0800 }, }, {'R', { 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xFC00, 0xF800, 0x8800, 0x8C00, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8000, 0xF800, 0x7C00, 0x0400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0xC600, 0x4400, 0x6C00, 0x2800, 0x3800, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7C00, 0x0400, 0x7C00, 0xFC00, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0400, 0x0400, 0x7400, 0xFC00, 0x8C00, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0xFC00, 0xFC00, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x4000, 0x4000, 0xF800, 0xF800, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x2000, 0x2000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0800, 0x0800, 0x0000, 0x3800, 0x3800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0xF800, 0x7000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0x9200, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xFC00, 0x8400, 0x8400, 0x8400, 0x8400, 0xFC00, 0x7800, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xFC00, 0x8400, 0x8400, 0xC400, 0xFC00, 0xB800, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x0400, 0x0400 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB800, 0xFC00, 0xC400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0x8000, 0xF800, 0x7C00, 0x0400, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xF000, 0xF000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x8200, 0xC600, 0x6C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0x8200, 0x8200, 0x9200, 0x9200, 0x9200, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8200, 0xC600, 0x6C00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8400, 0x8400, 0x8400, 0x8400, 0x8C00, 0xFC00, 0x7400, 0x0400, 0x7C00, 0x7800 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFC00, 0xFC00, 0x1800, 0x3000, 0x6000, 0xC000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x9800, 0xFC00, 0x6400, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldDx-14.cxx0000664000175000017500000003101214532252172013600 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feldDx-14 font fntchr feldDx_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0x7800, 0x7800, 0x4000, 0x4000, 0x7000, 0x7800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x1800, 0x7000, 0x6000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x0C00, 0x3F00, 0xF3C0, 0xC0C0, 0xC0C0, 0xFFC0, 0xFFC0, 0xC0C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xFF80, 0xFFE0, 0x3060, 0x3060, 0x3F80, 0x3F80, 0x3060, 0x3060, 0xFFE0, 0xFF80, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3F00, 0xFFC0, 0xF0C0, 0xC000, 0xC000, 0xC000, 0xC000, 0xF0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xFF00, 0xFFC0, 0x30C0, 0x30C0, 0x30C0, 0x30C0, 0x30C0, 0x30C0, 0xFFC0, 0xFF00, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0xC000, 0xC000, 0xFFC0, 0xFFC0, 0xC000, 0xC000, 0xFFC0, 0xFFC0, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0xC000, 0xC000, 0xFC00, 0xFC00, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3FC0, 0xFFC0, 0xF000, 0xC000, 0xC3C0, 0xC3C0, 0xC0C0, 0xF0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xFFC0, 0xFFC0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0xC0C0, 0xC0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC3C0, 0xCF00, 0xFC00, 0xFC00, 0xCF00, 0xC3C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xFFC0, 0xFFC0, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0xC00C, 0xF03C, 0xFCFC, 0xCFCC, 0xC30C, 0xC00C, 0xC00C, 0xC00C, 0xC00C, 0xC00C, 0x000C, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0xC0C0, 0xF0C0, 0xF0C0, 0xFCC0, 0xCCC0, 0xCFC0, 0xC3C0, 0xC3C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x3F00, 0xFFC0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xFF00, 0xFFC0, 0x30C0, 0x30C0, 0x3FC0, 0x3F00, 0x3000, 0x3000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x3F00, 0xFFC0, 0xF3C0, 0xC0C0, 0xC0C0, 0xCCC0, 0xCCC0, 0xCFC0, 0xFF00, 0x3F00, 0x03C0, 0x00C0 }, }, {'R', { 0x0000, 0x0000, 0xFF80, 0xFFE0, 0xC060, 0xC060, 0xFFE0, 0xFF80, 0xC180, 0xC1E0, 0xC060, 0xC060, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x3FC0, 0xFFC0, 0xC000, 0xC000, 0xFF00, 0x3FC0, 0x00C0, 0x00C0, 0xFFC0, 0xFF00, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xC0C0, 0xFFC0, 0x3F00, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xC3C0, 0xC300, 0xCF00, 0xCC00, 0xFC00, 0xF000, 0xF000, 0xC000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xC30C, 0xCFCC, 0xFCFC, 0x3030, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xF3C0, 0x3F00, 0x0C00, 0x0C00, 0x3F00, 0xF3C0, 0xC0C0, 0xC0C0, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0xC0C0, 0xC0C0, 0xF3C0, 0x3300, 0x3F00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFFC0, 0xFFC0, 0x03C0, 0x0300, 0x0F00, 0x3C00, 0x30C0, 0xF0C0, 0xFFC0, 0xFFC0, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x7800, 0xF800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'k', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xBA00, 0xEE00, 0x4400, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4800, 0xC800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000 }, }, {'~', { 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/feld.cxx0000664000175000017500000004137314611711171013132 00000000000000// // feld.cxx -- FELDHELL modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This modem code owes much to the efforts of Joe Veldhuis, N8FQ // // Adapted from code contained in gmfsk source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "feld.h" #include "fl_digi.h" #include "fontdef.h" #include "confdialog.h" #include "qrunner.h" #include "status.h" #include "debug.h" #include "threads.h" #include #include LOG_FILE_SOURCE(debug::LOG_MODEM); pthread_mutex_t feld_mutex = PTHREAD_MUTEX_INITIALIZER; char feldmsg[80]; void feld::tx_init() { txcounter = 0.0; tx_state = PREAMBLE; preamble = 3; prevsymb = false; videoText(); return; } void feld::rx_init() { rxcounter = 0.0; peakhold = 0.0; for (int i = 0; i < 2 * MAX_RX_COLUMN_LEN; i++ ) col_data[i] = 0; col_pointer = 0; peakhold = 0.0; agc = 0.0; RxColumnLen = progdefaults.HellRcvHeight; switch (mode) { // Amplitude modulation modes case MODE_FELDHELL: rxpixrate = (RxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); break; case MODE_SLOWHELL: rxpixrate = (RxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); break; case MODE_HELLX5: rxpixrate = (RxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); break; case MODE_HELLX9: rxpixrate = (RxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); break; // Frequency modulation modes case MODE_FSKH245: rxpixrate = (RxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); break; case MODE_FSKH105: rxpixrate = (RxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); break; case MODE_HELL80: rxpixrate = (RxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); break; default : rxpixrate = (RxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); break; } return; } void feld::init() { modem::init(); initKeyWaveform(); set_scope_mode(Digiscope::BLANK); put_MODEstatus(mode); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); rx_init(); } static void set_HellBW(double val) { sldrHellBW->value(val); } void feld::restart() { RxColumnLen = progdefaults.HellRcvHeight; TxColumnLen = FELD_COLUMN_LEN; switch (mode) { // Amplitude modulation modes case MODE_FELDHELL: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = 5 * round(1.2 * hell_bandwidth / 5.0); progdefaults.HELL_BW_FH = filter_bandwidth; break; case MODE_SLOWHELL: feldcolumnrate = 2.1875; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = 5 * round(1.2 * hell_bandwidth / 5.0); progdefaults.HELL_BW_FH = filter_bandwidth; break; case MODE_HELLX5: feldcolumnrate = 87.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = 5 * round(1.2 * hell_bandwidth / 5.0); progdefaults.HELL_BW_X5 = filter_bandwidth; break; case MODE_HELLX9: feldcolumnrate = 157.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = txpixrate; filter_bandwidth = 5 * round(1.2 * hell_bandwidth / 5.0); progdefaults.HELL_BW_X9 = filter_bandwidth; break; // Frequency modulation modes case MODE_FSKH245: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 122.5; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); filter_bandwidth = 5 * round(4.0 * hell_bandwidth / 5.0); progdefaults.HELL_BW_FSKH245 = filter_bandwidth; cap |= CAP_REV; break; case MODE_FSKH105: feldcolumnrate = 17.5; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 55; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); filter_bandwidth = 5 * round(4.0 * hell_bandwidth / 5.0); progdefaults.HELL_BW_FSKH105 = filter_bandwidth; cap |= CAP_REV; break; case MODE_HELL80: feldcolumnrate = 35; rxpixrate = (RxColumnLen * feldcolumnrate); txpixrate = (TxColumnLen * feldcolumnrate); downsampleinc = (double)(rxpixrate/samplerate); upsampleinc = (double)(txpixrate/samplerate); hell_bandwidth = 300; phi2freq = samplerate / M_PI / (hell_bandwidth / 2.0); filter_bandwidth = 5 * round(4.0 * hell_bandwidth / 5.0); progdefaults.HELL_BW_HELL80 = filter_bandwidth; cap |= CAP_REV; break; default : feldcolumnrate = 17.5; break; } set_bandwidth(hell_bandwidth); lpfilt->create_filter(0, 1.0 * filter_bandwidth / samplerate);//0.5 * filter_bandwidth / samplerate); average->setLength( 500 * samplerate / rxpixrate); rx_init(); wf->redraw_marker(); REQ(set_HellBW, filter_bandwidth); /* std::cout << "HellRcvHeight: " << progdefaults.HellRcvHeight << "\n" << "rx column length: " << RxColumnLen << "\n" << "tx column length: " << TxColumnLen << "\n" << "feldcolumrate: " << feldcolumnrate << "\n" << "rxpixrate: " << rxpixrate << "\n" << "txpixrate: " << txpixrate << "\n" << "downsampleinc: " << downsampleinc << "\n" << "upsampleinc: " << upsampleinc << "\n" << "hell_bandwidth: " << hell_bandwidth << "\n" << "filter bandwidth: " << filter_bandwidth << "\n" << "baud: " << 0.5 * txpixrate << "\n"; */ } feld::~feld() { if (hilbert) delete hilbert; if (lpfilt) delete lpfilt; if (average) delete average; } feld::feld(trx_mode m) { mode = m; samplerate = FeldSampleRate; cap |= CAP_BW; lpfilt = new fftfilt (0, 0.5, 1024); average = new Cmovavg (200); bbfilt = new Cmovavg(8); hilbert = new C_FIR_filter(); hilbert->init_hilbert (37, 1); rxphacc = 0.0; txphacc = 0.0; wf->redraw_marker(); REQ(&Raster::set_marquee, FHdisp, progdefaults.HellMarquee); col_data.alloc(2 * MAX_RX_COLUMN_LEN); restart(); } // rx section cmplx feld::mixer(cmplx in) { cmplx z; z = cmplx( cos(rxphacc), sin(rxphacc) ); z = z * in; rxphacc -= 2.0 * M_PI * frequency / samplerate; if (rxphacc < 0) rxphacc += TWOPI; return z; } void feld::FSKH_rx(cmplx z) { guard_lock raster_lock(&feld_mutex); double f; double vid; double avg; f = arg(conj(prev) * z) * phi2freq; prev = z; f = bbfilt->run(f); avg = average->run(abs(z)); rxcounter += downsampleinc; if (rxcounter < 1.0) return; rxcounter -= 1.0; if (avg > agc) agc = avg; else switch (progdefaults.hellagc) { case 3: agc *= (1.0 - 0.2 / RxColumnLen); break; case 2: agc *= (1.0 - 0.075 / RxColumnLen); break; case 1: default: agc *= (1.0 - 0.01 / RxColumnLen); } metric = CLAMP(1000*agc, 0.0, 100.0); display_metric(metric); vid = CLAMP(0.5*(f + 1), 0.0, 1.0); if (reverse) vid = 1.0 - vid; if (progdefaults.HellBlackboard) vid = 1.0 - vid; col_data[col_pointer + RxColumnLen] = (int)(vid * 255.0); col_pointer++; if (col_pointer == RxColumnLen) { if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { switch (progdefaults.HellRcvWidth) { case 4: REQ(put_rx_data, col_data, 2 * RxColumnLen); case 3: REQ(put_rx_data, col_data, 2 * RxColumnLen); case 2: REQ(put_rx_data, col_data, 2 * RxColumnLen); case 1: default: REQ(put_rx_data, col_data, 2 * RxColumnLen); } } col_pointer = 0; for (int i = 0; i < RxColumnLen; i++) col_data[i] = col_data[i + RxColumnLen]; } } void feld::rx(cmplx z) { guard_lock raster_lock(&feld_mutex); double x, avg; int ix; x = abs(z); if (x > peakval) peakval = x; avg = average->run(x); rxcounter += downsampleinc; if (rxcounter < 1.0) return; rxcounter -= 1.0; x = peakval; peakval = 0; if (x > peakhold) peakhold = x; else peakhold *= (1.0 - 0.02 / RxColumnLen); ix = CLAMP(255 * x / peakhold, 0, 255); if (avg > agc) agc = avg; else switch (progdefaults.hellagc) { case 3: agc *= (1.0 - 0.2 / RxColumnLen); break; case 2: agc *= (1.0 - 0.075 / RxColumnLen); break; case 1: default: agc *= (1.0 - 0.01 / RxColumnLen); } metric = CLAMP(1000*agc, 0.0, 100.0); display_metric(metric); if (!progdefaults.HellBlackboard) ix = 255 - ix; col_data[col_pointer + RxColumnLen] = ix; col_pointer++; if (col_pointer >= RxColumnLen) { if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { switch (progdefaults.HellRcvWidth) { case 4: REQ(put_rx_data, col_data, 2 * RxColumnLen); case 3: REQ(put_rx_data, col_data, 2 * RxColumnLen); case 2: REQ(put_rx_data, col_data, 2 * RxColumnLen); case 1: default: REQ(put_rx_data, col_data, 2 * RxColumnLen); } } col_pointer = 0; for (int i = 0; i < RxColumnLen; i++) col_data[i] = col_data[i + RxColumnLen]; } } int feld::rx_process(const double *buf, int len) { cmplx z, *zp; int i, n; if (progdefaults.HELL_BW != filter_bandwidth) { filter_bandwidth = progdefaults.HELL_BW; switch (mode) { case MODE_FELDHELL: progdefaults.HELL_BW_FH = filter_bandwidth; break; case MODE_SLOWHELL: progdefaults.HELL_BW_SH = filter_bandwidth; break; case MODE_HELLX5: progdefaults.HELL_BW_X5 = filter_bandwidth; break; case MODE_HELLX9: progdefaults.HELL_BW_X9 = filter_bandwidth; break; case MODE_FSKH245: progdefaults.HELL_BW_FSKH245 = filter_bandwidth; break; case MODE_FSKH105: progdefaults.HELL_BW_FSKH105 = filter_bandwidth; break; case MODE_HELL80: progdefaults.HELL_BW_HELL80 = filter_bandwidth; } lpfilt->create_filter(0, 0.5 * filter_bandwidth / samplerate); wf->redraw_marker(); } while (len-- > 0) { /* create analytic signal... */ z = cmplx( *buf, *buf ); buf++; /// hilbert transform need for complex frequency shift hilbert->run(z, z); z = mixer(z); n = lpfilt->run(z, &zp); switch (mode) { case MODE_FSKH245: case MODE_FSKH105: case MODE_HELL80: for (i = 0; i < n; i++) { FSKH_rx(zp[i]); } break; default: for (i = 0; i < n; i++) rx(zp[i]); break; } } return 0; } //===================================================================== // tx section // returns value = column bits with b0 ... b13 the transmit rows respecfully // 1 = on, 0 = off // if all bits are 0 // and no lesser bits are set then character is complete // then return -1; int feld::get_font_data(unsigned char c, int col) { int bits = 0; int mask; int bin; int ordbits = 0; fntchr *font = 0; if (col > 15 || c < ' ' || c > '~') return -1; mask = 1 << (15 - col); switch (progdefaults.feldfontnbr) { case 0: font = feld7x7_14; break; case 1: font = feld7x7n_14; break; case 2: font = feldDx_14; break; case 3: font = feldfat_14; break; case 4: font = feldhell_12; break; case 5: font = feldlittle_12; break; case 6: font = feldlo8_14; break; case 7: font = feldlow_14; break; case 8: font = feldmodern_14; break; case 9: font = feldmodern8_14; break; case 10: font = feldnarr_14; break; case 11: font = feldreal_14; break; case 12: font = feldstyl_14; break; case 13: font = feldvert_14; break; case 14: font = feldwide_14; break; default: font = feld7x7_14; } for (int i = 0; i < 14; i++) ordbits |= font[c-' '].byte[i]; for (int row = 0; row < 14; row ++) { bin = font[c - ' '].byte[13 - row] & mask; if ( bin != 0) bits |= 1 << row; } int testval = (1 << (15 - col)) - 1; if ( (bits == 0) && ((ordbits & testval) == 0) ) return -1; return bits; } double feld::nco(double freq) { double x = sin(txphacc); txphacc += 2.0 * M_PI * freq / samplerate; if (txphacc > TWOPI) txphacc -= TWOPI; return x; } void feld::send_symbol(int currsymb, int nextsymb) { int outlen = 0; double Amp = 1.0; double tone = get_txfreq_woffset(); if (hardkeying != progdefaults.HellPulseFast) { hardkeying = progdefaults.HellPulseFast; initKeyWaveform(); } if (mode == MODE_FSKH245 || mode == MODE_FSKH105 || mode == MODE_HELL80) tone += (reverse ? -1 : 1) * (currsymb ? -1 : 1) * bandwidth / 2.0; for (;;) { switch (mode) { case MODE_FSKH245 : case MODE_FSKH105 : case MODE_HELL80 : break; case MODE_HELLX5 : case MODE_HELLX9 : Amp = currsymb; break; case MODE_FELDHELL : case MODE_SLOWHELL : default : if (prevsymb == 0 && currsymb == 1) { Amp = OnShape[outlen]; } else if (currsymb == 1 && nextsymb == 0) { Amp = OffShape[outlen]; } else Amp = currsymb; break; } outbuf[outlen++] = Amp * nco(tone); if (outlen >= OUTBUFSIZE) { LOG_DEBUG("feld reset"); outlen = 0; break; } txcounter += upsampleinc; if (txcounter < 1.0) continue; txcounter -= 1.0; break; } prevsymb = currsymb; // write to soundcard & display ModulateXmtr(outbuf, outlen); rx_process(outbuf, outlen); } void feld::send_null_column() { for (int i = 0; i < 14; i++) send_symbol(0, 0); } void feld::tx_char(char c) { int column = 0; int bits, colbits; int currbit, nextbit; send_null_column(); if (c == ' ') { send_null_column(); send_null_column(); send_null_column(); } else { while ((bits = get_font_data(c, column)) != -1) { for (int col = 0; col < progdefaults.HellXmtWidth; col++) { colbits = bits; for (int i = 0; i < 14; i++) { currbit = colbits & 1; colbits = colbits >> 1; nextbit = colbits & 1; send_symbol(currbit, nextbit); } } column++; } } send_null_column(); return; } int feld::tx_process() { modem::tx_process(); int c; if (hardkeying != progdefaults.HellPulseFast) { hardkeying = progdefaults.HellPulseFast; initKeyWaveform(); } if (tx_state == PREAMBLE) { if (preamble-- > 0) { tx_char('.'); return 0; } tx_state = DATA; } if (tx_state == POSTAMBLE) { if (postamble-- > 0) { tx_char('.'); return 0; } tx_char(' '); tx_state = PREAMBLE; return -1; } c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { tx_state = POSTAMBLE; postamble = 3; return 0; } // if TX buffer empty // send idle character if (c == GET_TX_CHAR_NODATA) { if (progdefaults.HellXmtIdle == true) c = '.'; else { send_null_column(); send_null_column(); return 0; } } if (c == '\r' || c == '\n') c = ' '; tx_char(c); return 0; } void feld::initKeyWaveform() { for (int i = 0; i < MAXLEN; i++) { OnShape[i] = 1.0; OffShape[i] = 0.0; } for (int i = 0; i < 32; i++) { switch (hardkeying) { case 0: OnShape[i] = 0.5*(1.0 - cos(M_PI * i / 33)); // raised cosine with 4 msec rise break; case 1: if (i < 16) OnShape[i] = 0.5*(1.0 - cos(M_PI * i / 16)); // raised cosine with 2 msec rise break; case 2: if (i < 8) OnShape[i] = 0.5*(1.0 - cos(M_PI * i / 8)); // raised cosine with 1 msec rise case 3: default: // square shaped pulse break; } OffShape[31 - i] = OnShape[i]; } } fldigi-4.2.05/src/feld/FeldLittle-12.cxx0000664000175000017500000003102514532252172014464 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld little - 12 font fntchr feldlittle_12[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xE000, 0xF000, 0x1000, 0x1000, 0x7000, 0x7000, 0x1000, 0x1000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xF000, 0x1000, 0x1000, 0x3000, 0xE000, 0xC000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xA000, 0xF000, 0xD000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000 }, }, {'7', { 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0xF000, 0x6000, 0x6000, 0xF000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0xF000, 0x7000, 0x1000, 0x1000, 0x3000, 0x6000, 0x4000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x1000, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0xE000, 0xE000, 0x9000, 0x9000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x8000, 0x8000, 0x8000, 0x8000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0xB000, 0xB000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0xB000, 0xE000, 0xE000, 0xB000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x9000, 0xD000, 0xF000, 0xB000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0xF000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0xD000, 0xF000, 0xB000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'R', { 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0xF000, 0xE000, 0xA000, 0xB000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0xE000, 0x7000, 0x1000, 0x1000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0xA000, 0xA000, 0xA000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x3000, 0x6000, 0xC000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x7000, 0x1000, 0x7000, 0xF000, 0x9000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0x6000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x1000, 0x1000, 0x7000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0xF000, 0xF000, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x9000, 0x9000, 0xB000, 0xF000, 0x5000, 0x1000, 0x7000, 0x6000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x2000, 0x2000, 0x0000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xA000, 0xE000, 0x4000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8000, 0xA000, 0xA000, 0xE000, 0xC000, 0xC000, 0xE000, 0xA000, 0xA000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, 0xF000, 0xD000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x6000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0xE000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x9000, 0x9000, 0x9000, 0xF000, 0x7000, 0x1000, 0x1000, 0x1000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0xE000, 0x7000, 0x1000, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xE000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0xA000, 0xA000, 0xE000, 0x4000, 0x4000, 0xE000, 0xA000, 0xA000, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0xD000, 0x7000, 0x2000, 0x2000, 0x6000, 0xC000, 0x8000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF000, 0x3000, 0x2000, 0x6000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldLow-14.cxx0000664000175000017500000003101514532252172013771 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld low-14 font fntchr feldlow_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000 }, }, {'$', { 0x2000, 0x7800, 0xF800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF800, 0xF000, 0x2000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xD800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x4000, 0xE000, 0xE000, 0xA000, 0x4000, 0x4000, 0xE000, 0xA000, 0xB000, 0xB000, 0xF800, 0x7800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0xC000, 0xE000, 0x6000, 0x2000, 0x2000, 0x2000, 0x2000, 0x6000, 0xE000, 0xC000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x1000, 0xFE00, 0x7C00, 0x3800, 0x6C00, 0x4400, 0x0000, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x2000, 0xE000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'2', { 0x0000, 0xF000, 0xF800, 0xF800, 0x0800, 0x0800, 0x7800, 0xF000, 0x8000, 0x8000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'3', { 0x0000, 0xF000, 0xF800, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0xF800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x0800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'6', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x7000, 0x7000, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x7800, 0x7800, 0x7000, 0x0000 }, }, {':', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x0800, 0x0000 }, }, {'=', { 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0x8000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x0800, 0x0800, 0x3800, 0x3000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'B', { 0x0000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0xF000, 0xF000, 0x8800, 0x8800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'C', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x7800, 0x0000 }, }, {'D', { 0x0000, 0xF000, 0xF800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'G', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x9800, 0xB800, 0xF000, 0xE000, 0xE000, 0xF000, 0xB800, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'M', { 0x0000, 0x8800, 0xD800, 0xF800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xE800, 0xE800, 0xB800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000 }, }, {'O', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'P', { 0x0000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0xFC00, 0x7C00, 0x0C00 }, }, {'R', { 0x0000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0xF000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'S', { 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'V', { 0x0000, 0x8800, 0x8800, 0x8800, 0x9800, 0x9800, 0xB000, 0xB000, 0xE000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'W', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x2000, 0x2000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0x8800, 0xD800, 0xD800, 0x7000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xE000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7000, 0x7800, 0x7800, 0x0800, 0x7800, 0xF800, 0x8800, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'b', { 0x8000, 0x8000, 0x8000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x7000, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0800, 0x0800, 0x0800, 0x7800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0xF800, 0xF800, 0x8000, 0xF800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x3000, 0x7000, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0xF800, 0xF800, 0x7000, 0x0000 }, }, {'h', { 0x8000, 0x8000, 0x8000, 0xF000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0xC000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0xF000, 0x6000, 0x0000 }, }, {'k', { 0x0000, 0x8000, 0x8000, 0x9000, 0x9000, 0xB000, 0xE000, 0xE000, 0xE000, 0xB000, 0xB000, 0x9000, 0x9000, 0x0000 }, }, {'l', { 0x0000, 0xE000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0xF800, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0xD000, 0xF800, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0xB000, 0xF800, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x7000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0xF800, 0x4800, 0x4800, 0x7800, 0x7800, 0x7000, 0x4000, 0x4000, 0x4000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x7000, 0x1000, 0x1000 }, }, {'r', { 0x0000, 0x0000, 0xD800, 0xF800, 0xF800, 0x6000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7800, 0xF800, 0xF800, 0x8000, 0xF000, 0x7800, 0x0800, 0xF800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x7000, 0x3000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0xF800, 0x6800, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0xF800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0x7000, 0x2000, 0x2000, 0x7000, 0xF800, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xC800, 0xE800, 0x7800, 0x3800, 0x3000, 0x6000, 0xC000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0xC000, 0x4000, 0x6000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x6000, 0x3000, 0x3000, 0x1800, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x6000, 0x4000, 0xC000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0xD800, 0xF800, 0x6C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldNarr-14.cxx0000664000175000017500000003102114532252172014127 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld narrow-14 font fntchr feldnarr_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0x7800, 0x7800, 0x4000, 0x4000, 0x7000, 0x7800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x1800, 0x7000, 0x6000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'<', { 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7800, 0x0800, 0x7800, 0xF800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0800, 0x0800, 0x6800, 0xF800, 0x9800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0xF800, 0xF800, 0x8000, 0xF800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3800, 0x7800, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x7800, 0x7000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x4000, 0x4000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x1000, 0x1000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0xF000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x8000, 0x8000, 0x9000, 0xB000, 0xE000, 0xE000, 0xA000, 0xB000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xF800, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xC800, 0xF800, 0xB000, 0x8000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD800, 0xF800, 0x6000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0xF000, 0x7800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x7000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x9800, 0xF800, 0x6800, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xC800, 0x7800, 0x3000, 0x2000, 0x6000, 0xC000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x3000, 0x6000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x6800, 0xF800, 0xB000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/Feld7x7n-14.cxx0000664000175000017500000003101714532252172014035 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld 7x7n-14 font fntchr feld7x7n_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7800, 0x7800, 0xA000, 0xA000, 0x7000, 0x7000, 0x2800, 0x2800, 0xF000, 0xF000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x0000, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x6800, 0x6800, 0x9000, 0x9000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x6000, 0x6000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0xC000, 0xC000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0xA800, 0xA800, 0x7000, 0x7000, 0xF800, 0xF800, 0x7000, 0x7000, 0xA800, 0xA800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0000, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x6000, 0x6000, 0xA000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x1000, 0x1000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3000, 0x3000, 0x5000, 0x5000, 0x9000, 0x9000, 0xF000, 0xF000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x1000, 0x1000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0xE000, 0xE000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x6000, 0x6000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x7000, 0x7000, 0x1000, 0x1000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x0800, 0x3000, 0x3000, 0xC000, 0xC000, 0x3000, 0x3000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0x8000, 0x6000, 0x6000, 0x1800, 0x1800, 0x6000, 0x6000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0xB000, 0xB000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0xB000, 0xB000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0xD800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x9000, 0x9000, 0xD000, 0xD000, 0xB000, 0xB000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xB000, 0x7000, 0x7000, 0x1000, 0x1000 }, }, {'R', { 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0xE000, 0xE000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x6000, 0x6000, 0x1000, 0x1000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x2000, 0x2000, 0x4000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0x4000, 0x4000, 0x2000, 0x2000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0x8000, 0x8000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x1000, 0x1000, 0xF000, 0xF000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x1000, 0x1000, 0x7000, 0x7000, 0x9000, 0x9000, 0x9000, 0x9000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0xF000, 0xF000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3000, 0x3000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x9000, 0x9000, 0x7000, 0x7000, 0x1000, 0x1000, 0x6000, 0x6000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0x6000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xD000, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x9000, 0x9000, 0x9000, 0x9000, 0xE000, 0xE000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x9000, 0x9000, 0x9000, 0x9000, 0x7000, 0x7000, 0x1000, 0x1000 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xB000, 0xC000, 0xC000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0xC000, 0xC000, 0x3000, 0x3000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x6000, 0x6000, 0x6000, 0x6000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9000, 0x5000, 0x5000, 0x2000, 0x2000, 0x2000, 0x2000, 0x4000, 0x4000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x0000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldReal-14.cxx0000664000175000017500000003101714532252172014115 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld real-14 font fntchr feldreal_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0x9000, 0x9000, 0xD800, 0x4800, 0x4800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7800, 0xF800, 0xA000, 0xA000, 0xF000, 0x7800, 0x2800, 0x2800, 0xF800, 0xF000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC400, 0xC400, 0xC400, 0x0C00, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x8C00, 0x8C00, 0x8C00, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA800, 0xA800, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x2000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x2000, 0x0000 }, }, {')', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x7000, 0x7000, 0x1000, 0x1000, 0x3000, 0x3800, 0x0800, 0x0800, 0x1800, 0x3000, 0xE000, 0xC000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x3800, 0x3800, 0x2000, 0x2000, 0x3000, 0x3800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0xE800, 0x6800, 0x0800, 0x1800, 0x3000, 0x6000, 0x4000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0xF000, 0xF000, 0x1000, 0x1000, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xB000, 0xF800, 0xF800, 0x0800, 0x0800 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x4000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'k', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x8800, 0xD800, 0xF800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'q', { 0x0000, 0x0000, 0xF000, 0xF000, 0x9000, 0x9000, 0x9000, 0x9000, 0xB000, 0xB000, 0xF800, 0xF800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0xF800, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldFat-14.cxx0000664000175000017500000003101214611711171013734 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld-fat font fntchr feldfat_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000 }, }, {'"', { 0x0000, 0x0000, 0xD800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x6C00, 0x6C00, 0xFE00, 0xFE00, 0x6C00, 0x6C00, 0xFE00, 0xFE00, 0x6C00, 0x6C00, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x1000, 0x7E00, 0xFE00, 0xD000, 0xD000, 0xFC00, 0x7E00, 0x1600, 0x1600, 0xFE00, 0xFC00, 0x1000, 0x0000 }, }, {'%', { 0x0000, 0xE600, 0xE600, 0xE600, 0x0600, 0x0E00, 0x1C00, 0x3800, 0x7000, 0xE000, 0xCE00, 0xCE00, 0xCE00, 0x0000 }, }, {'&', { 0x0000, 0x1800, 0x3E00, 0x6600, 0x6000, 0x3000, 0x7B00, 0x7F00, 0xCE00, 0xC600, 0xC700, 0xFF00, 0x7C00, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0xC000, 0xC000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x0000 }, }, {')', { 0x0000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, 0x3800, 0x7000, 0xE000, 0xC000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x1000, 0x1000, 0x1000, 0xFE00, 0xFE00, 0x3800, 0x3800, 0x6C00, 0xC600, 0x8200, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x0000, 0x1800, 0x1800, 0x1800, 0xFF00, 0xFF00, 0x1800, 0x1800, 0x1800, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x6000, 0x6000, 0xE000, 0xC000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0C00, 0x0C00, 0x1C00, 0x1800, 0x3800, 0x3000, 0x7000, 0x6000, 0xE000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xCE00, 0xCE00, 0xD600, 0xD600, 0xE600, 0xE600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x3000, 0x7000, 0xF000, 0xF000, 0x3000, 0x3000, 0x3000, 0x3000, 0xFC00, 0xFC00, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0x0600, 0x3E00, 0x7C00, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0x0600, 0x1C00, 0x1C00, 0x0600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0xEC00, 0xCC00, 0xCC00, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0xC000, 0xC000, 0xFC00, 0xFE00, 0x0600, 0x0600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7C00, 0xFC00, 0xC000, 0xC000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x0C00, 0x1800, 0x1800, 0x3000, 0x3000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0x7C00, 0x7C00, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0x7E00, 0x0600, 0x0600, 0x7E00, 0x7C00, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0C00, 0x1C00, 0x3800, 0x7000, 0xE000, 0xE000, 0x7000, 0x3800, 0x1C00, 0x0C00, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0xC000, 0xE000, 0x7000, 0x3800, 0x1C00, 0x1C00, 0x3800, 0x7000, 0xE000, 0xC000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0x7800, 0xFC00, 0xCC00, 0x0C00, 0x3800, 0x7000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x0000 }, }, {'@', { 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xDE00, 0xDE00, 0xDC00, 0xC000, 0xC000, 0x7C00, 0x3C00, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xEE00, 0xC600, 0xC600, 0xFE00, 0xFE00, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFC00, 0xFC00, 0xC600, 0xC600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x3C00, 0x7E00, 0xE600, 0xC000, 0xC000, 0xC000, 0xC000, 0xE600, 0x7E00, 0x3C00, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF800, 0xFC00, 0xCE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xCE00, 0xFC00, 0xF800, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0xC000, 0xC000, 0xF800, 0xF800, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0xC000, 0xC000, 0xF800, 0xF800, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x3E00, 0x7E00, 0xE000, 0xC000, 0xCE00, 0xCE00, 0xC600, 0xE600, 0x7E00, 0x3C00, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xFE00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xF000, 0xF000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0E00, 0x0E00, 0x0600, 0x0600, 0x0600, 0x0600, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0xC600, 0xC600, 0xCE00, 0xDC00, 0xF800, 0xF800, 0xDC00, 0xCE00, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0xC600, 0xEE00, 0xFE00, 0xFE00, 0xD600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0xC600, 0xE600, 0xF600, 0xFE00, 0xDE00, 0xCE00, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x3800, 0x7C00, 0xEE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0xFC00, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xDE00, 0xDE00, 0xFE00, 0x7C00, 0x0C00, 0x0C00 }, }, {'R', { 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xFE00, 0xFC00, 0xCC00, 0xCE00, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC000, 0xC000, 0xFC00, 0x7E00, 0x0600, 0x0600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xFC00, 0xFC00, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0x6C00, 0x6C00, 0x3800, 0x3800, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xD600, 0xD600, 0xD600, 0xFE00, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0xCC00, 0xCC00, 0xCC00, 0xFC00, 0x7800, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0E00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xE000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xF000, 0xF000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0xC000, 0xC000, 0xE000, 0x6000, 0x7000, 0x3000, 0x3800, 0x1800, 0x1C00, 0x0C00, 0x0C00, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xF000, 0xF000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0x3000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x7000, 0x7000, 0xF800, 0xD800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0x7E00, 0x0600, 0x7E00, 0xFE00, 0xC600, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0xC000, 0xC000, 0xDC00, 0xFE00, 0xE600, 0xC600, 0xC600, 0xC600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFC00, 0xC000, 0xC000, 0xC000, 0xC000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0600, 0x0600, 0x7600, 0xFE00, 0xCE00, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7E00, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xFE00, 0xFE00, 0xC000, 0xFC00, 0x7C00, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3C00, 0x7C00, 0x6000, 0x6000, 0xF800, 0xF800, 0x6000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7E00, 0x0600, 0x7E00, 0x7C00 }, }, {'h', { 0x0000, 0x0000, 0xC000, 0xC000, 0xDC00, 0xFE00, 0xEE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0x6000, 0x6000, 0x0000, 0xE000, 0xE000, 0x6000, 0x6000, 0x6000, 0x6000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'j', { 0x1800, 0x1800, 0x0000, 0x3800, 0x3800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0xD800, 0xF800, 0x7000, 0x0000 }, }, {'k', { 0x0000, 0x0000, 0xC000, 0xCC00, 0xDC00, 0xF800, 0xF000, 0xF000, 0xF800, 0xDC00, 0xCC00, 0xCC00, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xEC00, 0xFE00, 0xFE00, 0xD600, 0xD600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xDC00, 0xFE00, 0xEE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7C00, 0xFE00, 0xC600, 0xC600, 0xC600, 0xC600, 0xFE00, 0x7C00, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFC00, 0xFE00, 0xC600, 0xC600, 0xE600, 0xFE00, 0xDC00, 0xC000, 0xC000, 0xC000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC600, 0xC600, 0xCE00, 0xFE00, 0x7600, 0x0600, 0x0600, 0x0600 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xDC00, 0xFE00, 0xE600, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7E00, 0xFE00, 0xC000, 0xFC00, 0x7E00, 0x0600, 0xFE00, 0xFC00, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x6000, 0x6000, 0xF000, 0xF000, 0x6000, 0x6000, 0x6000, 0x6000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xC600, 0xCE00, 0xFE00, 0x7600, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x1000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xD600, 0xD600, 0xD600, 0xFE00, 0xFE00, 0x6C00, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3800, 0x7C00, 0xEE00, 0xC600, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC600, 0xC600, 0xC600, 0xEE00, 0x7C00, 0x3800, 0x3000, 0x7000, 0xE000, 0xC000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xFE00, 0xFE00, 0x0C00, 0x1800, 0x3000, 0x6000, 0xFE00, 0xFE00, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x3000, 0x7000, 0x6000, 0x6000, 0x6000, 0xE000, 0xE000, 0x6000, 0x6000, 0x7000, 0x7000, 0x3000, 0x0000 }, }, {'|', { 0x0000, 0xC000, 0xC000, 0xE000, 0x6000, 0x7000, 0x3000, 0x3800, 0x1800, 0x1C00, 0x0C00, 0x0C00, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0xC000, 0xE000, 0x6000, 0x6000, 0x6000, 0x7000, 0x7000, 0x6000, 0x6000, 0x6000, 0xE000, 0xC000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x2000, 0x7000, 0xF800, 0xD800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/Feld7x7-14.cxx0000664000175000017500000003101614532252172013656 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feld 7x7-14 font fntchr feld7x7_14[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'"', { 0x0000, 0x0000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7800, 0x7800, 0xA000, 0xA000, 0x7000, 0x7000, 0x2800, 0x2800, 0xF000, 0xF000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0x0000, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x0000, 0x0000 }, }, {'&', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x6800, 0x6800, 0x9000, 0x9000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, { 39, { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x6000, 0x6000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0xC000, 0xC000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0xA800, 0xA800, 0x7000, 0x7000, 0xF800, 0xF800, 0x7000, 0x7000, 0xA800, 0xA800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0000, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x0000, 0x7000, 0x7000, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x0000, 0x6000, 0x6000, 0xA000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0x0000, 0xF000, 0xF000, 0x0800, 0x0800, 0x3000, 0x3000, 0x0800, 0x0800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x0000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF000, 0xF000, 0x0800, 0x0800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0xF000, 0xF000, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'7', { 0x0000, 0x0000, 0xF800, 0xF800, 0x0800, 0x0800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x7000, 0x7000, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'9', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x7800, 0x7800, 0x0800, 0x0800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x8000, 0x8000, 0x0000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x0800, 0x3000, 0x3000, 0xC000, 0xC000, 0x3000, 0x3000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0x8000, 0x6000, 0x6000, 0x1800, 0x1800, 0x6000, 0x6000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'@', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0xB000, 0xB000, 0x8000, 0x8000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0x0000, 0xF000, 0xF000, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x0000, 0x7800, 0x7800, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0x0000, 0xF000, 0xF000, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x0000, 0x7800, 0x7800, 0x8000, 0x8000, 0x9800, 0x9800, 0x8800, 0x8800, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9000, 0x9000, 0xE000, 0xE000, 0x9000, 0x9000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x0000, 0x8800, 0x8800, 0xD800, 0xD800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x0000, 0x8800, 0x8800, 0xC800, 0xC800, 0xA800, 0xA800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8800, 0x8800, 0xF000, 0xF000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0x7000, 0x7000, 0x1000, 0x1000 }, }, {'R', { 0x0000, 0x0000, 0xF000, 0xF000, 0x8800, 0x8800, 0xF000, 0xF000, 0x9000, 0x9000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x0000, 0x7800, 0x7800, 0x8000, 0x8000, 0x7000, 0x7000, 0x0800, 0x0800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x0000, 0x8800, 0x8800, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x5000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x5000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0x0000, 0xF800, 0xF800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x0000, 0x8000, 0x8000, 0x4000, 0x4000, 0x2000, 0x2000, 0x1000, 0x1000, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0x0000, 0xC000, 0xC000, 0x8000, 0x8000, 0x4000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x0000, 0x0000, 0x0000, 0xE000, 0xE000, 0x1000, 0x1000, 0xF000, 0xF000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0xF000, 0xF000, 0x8800, 0x8800, 0x8800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x8000, 0x8000, 0x8000, 0x8000, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0x0000, 0x0800, 0x0800, 0x7800, 0x7800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0xF800, 0xF800, 0x8000, 0x8000, 0x7800, 0x7800, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0x0000, 0x3800, 0x3800, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x0000, 0x0000, 0x7800, 0x7800, 0x8800, 0x8800, 0x7800, 0x7800, 0x0800, 0x0800, 0x7000, 0x7000, 0x0000 }, }, {'h', { 0x0000, 0x0000, 0x8000, 0x8000, 0xF000, 0xF000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'i', { 0x4000, 0x4000, 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'j', { 0x1000, 0x1000, 0x0000, 0x0000, 0x3000, 0x3000, 0x1000, 0x1000, 0x1000, 0x1000, 0x9000, 0x9000, 0x6000, 0x6000 }, }, {'k', { 0x0000, 0x0000, 0x9000, 0x9000, 0xA000, 0xA000, 0xC000, 0xC000, 0xA000, 0xA000, 0x9000, 0x9000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD000, 0xD000, 0xA800, 0xA800, 0xA800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x0000, 0x0000, 0x0000, 0xB000, 0xB000, 0xC800, 0xC800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7000, 0x7000, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF000, 0xF000, 0x8800, 0x8800, 0xC800, 0xC800, 0xB000, 0xB000, 0x8000, 0x8000 }, }, {'q', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7800, 0x8800, 0x8800, 0x9800, 0x9800, 0x6800, 0x6800, 0x0800, 0x0800 }, }, {'r', { 0x0000, 0x0000, 0x0000, 0x0000, 0xD800, 0xD800, 0x6000, 0x6000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x0000, 0x0000, 0x0000, 0x7800, 0x7800, 0xC000, 0xC000, 0x3800, 0x3800, 0xF000, 0xF000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0x0000, 0x4000, 0x4000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x3000, 0x3000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x7000, 0x7000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x5000, 0x5000, 0x2000, 0x2000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x8800, 0xA800, 0xA800, 0xA800, 0x5000, 0x5000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x7000, 0x7000, 0x7000, 0x7000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x8800, 0x4800, 0x4800, 0x3000, 0x3000, 0x2000, 0x2000, 0x4000, 0x4000 }, }, {'z', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x1000, 0x1000, 0x6000, 0x6000, 0xF800, 0xF800, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x0000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x0000, 0x0000 }, }, {'|', { 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x0000, 0xC000, 0xC000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'~', { 0x0000, 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x5000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/FeldHell-12.cxx0000664000175000017500000003101614532252172014113 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- // feldhell-12 font fntchr feldhell_12[] = { {' ', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'!', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0xC000, 0xC000, 0x0000 }, }, {'"', { 0x0000, 0xA000, 0xA000, 0xA000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'#', { 0x0000, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0xF800, 0xF800, 0x5000, 0x5000, 0x0000, 0x0000, 0x0000 }, }, {'$', { 0x0000, 0x2000, 0x7000, 0xF800, 0xA800, 0xA000, 0xF000, 0x7800, 0x2800, 0xA800, 0xF800, 0x7000, 0x2000, 0x0000 }, }, {'%', { 0x0000, 0xC800, 0xC800, 0xC800, 0x1000, 0x1000, 0x2000, 0x2000, 0x4000, 0x4000, 0x9800, 0x9800, 0x9800, 0x0000 }, }, {'&', { 0x0000, 0x4000, 0xE000, 0xA000, 0xA000, 0x4000, 0x4000, 0xA000, 0xA000, 0x9000, 0x9000, 0xF800, 0x7800, 0x0000 }, }, { 39, { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'(', { 0x0000, 0x0000, 0x2000, 0x6000, 0xC000, 0xC000, 0x8000, 0x8000, 0xC000, 0xC000, 0x6000, 0x2000, 0x0000, 0x0000 }, }, {')', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x6000, 0x2000, 0x2000, 0x6000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'*', { 0x0000, 0x0000, 0x8800, 0x8800, 0x5000, 0x7000, 0xF800, 0xF800, 0x7000, 0x5000, 0x8800, 0x8800, 0x0000, 0x0000 }, }, {'+', { 0x0000, 0x0000, 0x0000, 0x2000, 0x2000, 0x2000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {',', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000, 0xC000 }, }, {'-', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'.', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {'/', { 0x0000, 0x0800, 0x0800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'0', { 0x0000, 0x7000, 0xF800, 0x9800, 0x9800, 0xA800, 0xA800, 0xC800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'1', { 0x0000, 0x2000, 0x6000, 0xE000, 0xA000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'2', { 0x0000, 0x6000, 0xF000, 0x9000, 0x1000, 0x3000, 0x2000, 0x4000, 0xC000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'3', { 0x0000, 0xF000, 0xF800, 0x0800, 0x0800, 0x3800, 0x3800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'4', { 0x0000, 0x8000, 0x9000, 0x9000, 0x9000, 0x9000, 0x9000, 0xF800, 0xF800, 0x1000, 0x1000, 0x1000, 0x0000, 0x0000 }, }, {'5', { 0x0000, 0x7800, 0x7800, 0x4000, 0x4000, 0x7000, 0x7800, 0x0800, 0x0800, 0x1800, 0xF000, 0xE000, 0x0000, 0x0000 }, }, {'6', { 0x0000, 0x2000, 0x6000, 0xC000, 0x8000, 0x8000, 0xB000, 0xF800, 0xC800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'7', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x8000, 0x0000, 0x0000 }, }, {'8', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xD800, 0x7000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000 }, }, {'9', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xF800, 0x7800, 0x0800, 0x0800, 0x1800, 0x7000, 0x6000, 0x0000, 0x0000 }, }, {':', { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0xC000, 0xC000, 0xC000, 0x0000, 0x0000 }, }, {';', { 0x0000, 0x0000, 0xC000, 0x0000, 0x6000, 0x6000, 0x6000, 0x0000, 0x0000, 0x6000, 0x6000, 0x2000, 0x2000, 0xE000 }, }, {'<', { 0x0000, 0x0000, 0x0800, 0x1800, 0x3000, 0x6000, 0xC000, 0xC000, 0x6000, 0x3000, 0x1800, 0x0800, 0x0000, 0x0000 }, }, {'=', { 0x0000, 0x0000, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'>', { 0x0000, 0x0000, 0x8000, 0xC000, 0x6000, 0x3000, 0x1800, 0x1800, 0x3000, 0x6000, 0xC000, 0x8000, 0x0000, 0x0000 }, }, {'?', { 0x0000, 0x7000, 0xF800, 0x8800, 0x0800, 0x1800, 0x3000, 0x2000, 0x2000, 0x0000, 0x0000, 0x2000, 0x2000, 0x0000 }, }, {'@', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0xB800, 0xB800, 0xB000, 0x8000, 0xC000, 0x7800, 0x3800, 0x0000, 0x0000 }, }, {'A', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'B', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7000, 0x7000, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'C', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'D', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'E', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'F', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'G', { 0x0000, 0x7800, 0xF800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'H', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'I', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'J', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'K', { 0x0000, 0x8800, 0x8800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'L', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'M', { 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000, 0x0000 }, }, {'N', { 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'O', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'P', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'Q', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800, 0x0000 }, }, {'R', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'S', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'T', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'U', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'V', { 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'W', { 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xBA00, 0xEE00, 0x4400, 0x0000, 0x0000, 0x0000 }, }, {'X', { 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'Y', { 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'Z', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4800, 0xC800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'[', { 0x0000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'\\', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {']', { 0x0000, 0xE000, 0xE000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'^', { 0x0000, 0x2000, 0x2000, 0x7000, 0x5000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'_', { 0x0000, 0xFE00, 0xFE00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'`', { 0x0000, 0xC000, 0xC000, 0xC000, 0xC000, 0x6000, 0x6000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, }, {'a', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'b', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'c', { 0x0000, 0x7000, 0xF800, 0xC800, 0x8000, 0x8000, 0x8000, 0x8000, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'d', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0x4800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'e', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF800, 0xF800, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'f', { 0x0000, 0xF800, 0xF800, 0x8000, 0x8000, 0xE000, 0xE000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'g', { 0x0000, 0x7800, 0xF800, 0xC000, 0x8000, 0x9800, 0x9800, 0x8800, 0xC800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'h', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'i', { 0x0000, 0xE000, 0xE000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'j', { 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'k', { 0x0000, 0x8800, 0x9800, 0x9800, 0xB000, 0xE000, 0xE000, 0xB000, 0x9800, 0x9800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'l', { 0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'m', { 0x0000, 0x8200, 0xC600, 0xEE00, 0xBA00, 0x9200, 0x8200, 0x8200, 0x8200, 0x8200, 0x8200, 0x0000, 0x0000, 0x0000 }, }, {'n', { 0x0000, 0x8800, 0xC800, 0xC800, 0xE800, 0xA800, 0xB800, 0x9800, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'o', { 0x0000, 0x7000, 0xF800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'p', { 0x0000, 0xF000, 0xF800, 0x4800, 0x4800, 0x7800, 0x7000, 0x4000, 0x4000, 0xE000, 0xE000, 0x0000, 0x0000, 0x0000 }, }, {'q', { 0x0000, 0x7000, 0xF800, 0xD800, 0x8800, 0x8800, 0xA800, 0xA800, 0xB800, 0xF000, 0x7000, 0x1800, 0x0800, 0x0000 }, }, {'r', { 0x0000, 0xF000, 0xF800, 0x8800, 0x8800, 0xF800, 0xF000, 0x9000, 0x9800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'s', { 0x0000, 0x7800, 0xF800, 0x8000, 0x8000, 0xF000, 0x7800, 0x0800, 0x0800, 0xF800, 0xF000, 0x0000, 0x0000, 0x0000 }, }, {'t', { 0x0000, 0xF800, 0xF800, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'u', { 0x0000, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0x8800, 0xF800, 0x7000, 0x0000, 0x0000, 0x0000 }, }, {'v', { 0x0000, 0x8800, 0x8800, 0x9800, 0x9000, 0xB000, 0xA000, 0xE000, 0xC000, 0xC000, 0x8000, 0x0000, 0x0000, 0x0000 }, }, {'w', { 0x0000, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0x9200, 0xBA00, 0xEE00, 0x4400, 0x0000, 0x0000, 0x0000 }, }, {'x', { 0x0000, 0x8800, 0x8800, 0xD800, 0x7000, 0x2000, 0x2000, 0x7000, 0xD800, 0x8800, 0x8800, 0x0000, 0x0000, 0x0000 }, }, {'y', { 0x0000, 0x8800, 0x8800, 0xD800, 0x5000, 0x7000, 0x2000, 0x2000, 0x2000, 0x2000, 0x2000, 0x0000, 0x0000, 0x0000 }, }, {'z', { 0x0000, 0xF800, 0xF800, 0x1800, 0x1000, 0x3000, 0x6000, 0x4800, 0xC800, 0xF800, 0xF800, 0x0000, 0x0000, 0x0000 }, }, {'{', { 0x0000, 0x2000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x2000, 0x0000 }, }, {'|', { 0x0000, 0x8000, 0x8000, 0xC000, 0x4000, 0x6000, 0x2000, 0x3000, 0x1000, 0x1800, 0x0800, 0x0800, 0x0000, 0x0000 }, }, {'}', { 0x0000, 0x8000, 0xC000, 0x4000, 0x4000, 0x4000, 0x6000, 0x6000, 0x4000, 0x4000, 0x4000, 0xC000, 0x8000, 0x0000 }, }, {'~', { 0x0000, 0x2000, 0x7000, 0xD800, 0x8800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, } }; fldigi-4.2.05/src/feld/feldfonts.cxx0000664000175000017500000000303014532252172014173 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "fontdef.h" #include "Feld7x7-14.cxx" #include "Feld7x7n-14.cxx" #include "FeldDx-14.cxx" #include "FeldFat-14.cxx" #include "FeldHell-12.cxx" #include "FeldLittle-12.cxx" #include "FeldLo8-14.cxx" #include "FeldLow-14.cxx" #include "FeldModern-14.cxx" #include "FeldModern8-14.cxx" #include "FeldNarr-14.cxx" #include "FeldReal-14.cxx" #include "FeldStyl-14.cxx" #include "FeldVert-14.cxx" #include "FeldWide-14.cxx" char szFeldFonts[] = "\ 7x7 14|\ 7x7n 14|\ Dx 14|\ fat 14|\ hell 12|\ little 12|\ lo8 14|\ low 14|\ modern 14|\ modern8 14|\ narr 14|\ real 14|\ style 14|\ vert 14|\ wide 14"; fldigi-4.2.05/src/dtmf/0000775000175000017500000000000014611714005011563 500000000000000fldigi-4.2.05/src/dtmf/dtmf.cxx0000664000175000017500000001526614532252172013177 00000000000000// ---------------------------------------------------------------------------- // // DTMF.cxx // // Copyright (C) 2011 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "trx.h" #include "dtmf.h" #include "misc.h" #include "fl_digi.h" #include "configuration.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "main.h" LOG_FILE_SOURCE(debug::LOG_MODEM); // tones in 4x4 array // 697 770 842 941 1209 1336 1447 1633 int cDTMF::row[] = {697, 770, 852, 941}; int cDTMF::col[] = {1209, 1336, 1477, 1633}; const char cDTMF::rc[] = "123A456B789C*0#D"; //====================================================================== // DTMF tone receive //====================================================================== // tone #s and coefficients // 8000 Hz sampling N == 240 // 11025 Hz sampling N == 331 /* * calculate the power of each tone using Goertzel filters */ void cDTMF::calc_power() { double sr = active_modem->get_samplerate(); // reset row freq filters for (int i = 0; i < 4; i++) filt[i]->reset(240, row[i], sr); // reset col freq filters for (int i = 0; i < 4; i++) filt[i+4]->reset(240, col[i], sr); for (int i = 0; i < framesize; i++) for (int j = 0; j < NUMTONES; j++) filt[j]->run(data[i]); for (int i = 0; i < NUMTONES; i++) power[i] = filt[i]->mag(); maxpower = 0; minpower = 1e6; for (int i = 0; i < NUMTONES;i++) { if (power[i] > maxpower) maxpower = power[i]; if (power[i] < minpower) minpower = power[i]; } if ( minpower == 0 ) minpower = 1e-3; } /* * detect which signals are present. * */ int cDTMF::decode() { calc_power(); if (maxpower < (10 * progStatus.sldrSquelchValue)) return ' '; int r = -1, c = -1; double pwr = 0; for (int i = 0; i < 4; i++) if (power[i] > pwr) { pwr = power[i]; r = i; } pwr = 0; for (int i = 0; i < 4; i++) if (power[i+4] > pwr) { pwr = power[i+4]; c = i; } if (r == -1 || c == -1) return ' '; return rc[r*4 + c]; } /* * read in frames, output the decoded * results */ void cDTMF::receive(const float* buf, size_t len) { int x; static size_t dptr = 0; size_t bufptr = 0; if (!progdefaults.DTMFdecode) return; framesize = (active_modem->get_samplerate() == 8000) ? 240 : 331; while (1) { int i; for ( i = dptr; i < framesize; i++) { data[i] = buf[bufptr]; bufptr++; if (bufptr == len) break; } if (i < framesize) { dptr = i + 1; return; } dptr = 0; x = decode(); if (x == ' ') { silence_time++; if (silence_time == 4 && !dtmfchars.empty()) dtmfchars += ' '; if (silence_time == FLUSH_TIME) { if (!dtmfchars.empty()) { REQ(showDTMF, dtmfchars); dtmfchars.clear(); } silence_time = 0; } } else { silence_time = 0; if (x != last && last == ' ') dtmfchars += x; } last = x; } } //====================================================================== // DTMF tone transmit //====================================================================== void cDTMF::makeshape() { for (int i = 0; i < 128; i++) shape[i] = 1.0; for (int i = 0; i < RT; i++) shape[i] = 0.5 * (1.0 - cos (M_PI * i / RT)); } //---------------------------------------------------------------------- // transmit silence for specified time duration in milliseconds //---------------------------------------------------------------------- void cDTMF::silence(int len) { double sr = active_modem->get_samplerate(); int length = len * sr / 1000; if (length > 16384) length = 16384; memset(outbuf, 0, length * sizeof(*outbuf)); active_modem->ModulateXmtr(outbuf, length); } //---------------------------------------------------------------------- // transmit DTMF tones for specific time interval //---------------------------------------------------------------------- void cDTMF::two_tones(int ch) { if (!strchr(rc, ch)) return; int pos = strchr(rc, ch) - rc; int r = pos / 4; int c = pos % 4; double sr = active_modem->get_samplerate(); double phaseincr = 2.0 * M_PI * row[r] / sr; double phase = 0; int length = duration * sr / 1000; if (length > 16384) length = 16384; for (int i = 0; i < length; i++) { outbuf[i] = 0.5 * sin(phase); phase += phaseincr; } phaseincr = 2.0 * M_PI * col[c] / sr; phase = 0; for (int i = 0; i < length; i++) { outbuf[i] += 0.5 * sin(phase); phase += phaseincr; } for (int i = 0; i < RT; i++) { outbuf[i] *= shape[i]; outbuf[length - 1 - i] *= shape[i]; } active_modem->ModulateXmtr(outbuf, length); } //---------------------------------------------------------------------- // transmit the string contained in progdefaults.DTMFstr and output as // dtmf valid characters, 0-9, *, #, A-D // each pair of tones is separated by 50ms silence // 500 msec silence for ' ', ',' or '-' // 50 msec silence for invalid characters //---------------------------------------------------------------------- void cDTMF::send() { int c = 0, delay = 0; duration = 50; RT = (int)(active_modem->get_samplerate() * 4 / 1000.0); // 4 msec edge makeshape(); size_t colon = std::string::npos; size_t modifier = progdefaults.DTMFstr.find("W"); if (modifier != std::string::npos) { delay = atoi(&progdefaults.DTMFstr[modifier + 1]); colon = progdefaults.DTMFstr.find(':', modifier); progdefaults.DTMFstr.erase(modifier, colon - modifier + 1); } modifier = progdefaults.DTMFstr.find('L'); if (modifier != std::string::npos) { duration = atoi(&progdefaults.DTMFstr[modifier + 1]); colon = progdefaults.DTMFstr.find(':', modifier); progdefaults.DTMFstr.erase(modifier, colon - modifier + 1); } while (delay > 50) { silence(50); delay -= 50;} if (delay) silence(delay); for(size_t i = 0; i < progdefaults.DTMFstr.length(); i++) { c = progdefaults.DTMFstr[i]; if (c == ' ' || c == ',' || c == '-') silence(duration); else if ( (c >= '0' && c <= '9') || c == '*' || c == '#' || (c >= 'A' && c <= 'D') ) two_tones(c); silence(duration); } progdefaults.DTMFstr.clear(); } fldigi-4.2.05/src/fsq/0000775000175000017500000000000014611714005011422 500000000000000fldigi-4.2.05/src/fsq/fsq_monitor.cxx0000664000175000017500000001270414611711171014433 00000000000000// ---------------------------------------------------------------------------- // // Viewer.cxx -- PSK browser // // Copyright (C) 2015 // David Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "Viewer.h" #include "trx.h" #include "main.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "waterfall.h" #include "fl_digi.h" #include "re.h" #include "gettext.h" #include "flmisc.h" #include "spot.h" #include "icons.h" #include "qrunner.h" // // External fsq monitor dialog // Fl_Double_Window *fsqMonitor = 0; static Fl_Button *btnCloseMonitor; FTextRX *fsq_monitor = 0; FTextRX *fsq_que = 0; static void cb_btnCloseMonitor(Fl_Button*, void*) { progStatus.fsqMONITORxpos = fsqMonitor->x(); progStatus.fsqMONITORypos = fsqMonitor->y(); progStatus.fsqMONITORwidth = fsqMonitor->w(); progStatus.fsqMONITORheight = fsqMonitor->h(); btn_MONITOR->value(0); btn_MONITOR->redraw(); fsqMonitor->hide(); } Fl_Double_Window* create_fsqMonitor(void) { Fl_Double_Window* w = new Fl_Double_Window( progStatus.fsqMONITORxpos, progStatus.fsqMONITORypos, progStatus.fsqMONITORwidth, progStatus.fsqMONITORheight, _("FSQ monitor")); Panel *monitor_panel = new Panel( 2, 2, w->w() - 4, w->h() - 28); fsq_monitor = new FTextRX( monitor_panel->x(), monitor_panel->y(), monitor_panel->w(), 7*monitor_panel->h()/8); fsq_monitor->color( fl_rgb_color( 0.98*progdefaults.RxColor.R, 0.98*progdefaults.RxColor.G, 0.98*progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); fsq_monitor->setFont(progdefaults.RxFontnbr); fsq_monitor->setFontSize(progdefaults.RxFontsize); fsq_monitor->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_que = new FTextRX( fsq_monitor->x(), fsq_monitor->y() + fsq_monitor->h(), fsq_monitor->w(), monitor_panel->h() - fsq_monitor->h()); fsq_que->color( fl_rgb_color( 0.98*progdefaults.RxColor.R, 0.98*progdefaults.RxColor.G, 0.98*progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); fsq_que->setFont(progdefaults.RxFontnbr); fsq_que->setFontSize(progdefaults.RxFontsize); fsq_que->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); Fl_Box *minbox = new Fl_Box( monitor_panel->x(), monitor_panel->y() + 66, monitor_panel->w(), monitor_panel->h() - 132); minbox->hide(); monitor_panel->resizable(minbox); monitor_panel->end(); Fl_Group *g = new Fl_Group( fsq_monitor->x(), monitor_panel->y() + monitor_panel->h() + 2, fsq_monitor->w(), 22); Fl_Group *g1 = new Fl_Group( g->x(), g->y() + 2, g->w() - 80, g->h()); g1->box(FL_FLAT_BOX); g1->end(); // close button btnCloseMonitor = new Fl_Button( g->x() + g->w() - 82, g->y(), 80, g->h(), icons::make_icon_label(_("Close"), close_icon)); btnCloseMonitor->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); icons::set_icon_label(btnCloseMonitor); btnCloseMonitor->callback((Fl_Callback*)cb_btnCloseMonitor); g->resizable(g1); g->end(); w->end(); w->callback((Fl_Callback*)cb_btnCloseMonitor); w->resizable(monitor_panel); w->size_range( 300, 200 ); w->xclass(PACKAGE_NAME); w->hide(); return w; } void open_fsqMonitor() { if (!fsqMonitor) fsqMonitor = create_fsqMonitor(); fsqMonitor->show(); fsqMonitor->redraw(); } #if (FSQDEBUG == 1) Fl_Double_Window *fsqDebug = 0; FTextRX *fsq_debug = 0; void close_fsqDebug() { if (fsqDebug) fsqDebug->hide(); } static void cb_CloseDebug(Fl_Button*, void*) { fsqDebug->hide(); } Fl_Double_Window* create_fsqDebug(void) { Fl_Double_Window* w = new Fl_Double_Window( 50, 50, 500, 300, "FSQ debug"); fsq_debug = new FTextRX( 2, 2, w->w() - 4, w->h() - 4); fsq_debug->color( FL_WHITE); fsq_debug->setFont(progdefaults.RxFontnbr); fsq_debug->setFontSize(progdefaults.RxFontsize); fsq_debug->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_debug->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); fsq_debug->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); fsq_debug->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); fsq_debug->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); w->end(); w->callback((Fl_Callback*)cb_CloseDebug); w->resizable(fsq_debug); w->size_range( 200, 200 ); w->xclass(PACKAGE_NAME); w->hide(); return w; } void open_fsqDebug() { if (!fsqDebug) fsqDebug = create_fsqDebug(); fsqDebug->show(); fsqDebug->redraw(); } void write_fsqDebug(std::string s, int style) { if (!fsq_debug) return; REQ(&FTextRX::addstr, fsq_debug, s, style); } #endif void fsq_que_clear() { REQ(&FTextRX::clear, fsq_que); } void write_fsq_que(std::string s) { if (!fsq_que) return; // REQ(&FTextRX::clear, fsq_que); REQ(&FTextRX::addstr, fsq_que, s, FTextBase::ALTR); } fldigi-4.2.05/src/fsq/fsq.cxx0000664000175000017500000013216714611711171012672 00000000000000// ---------------------------------------------------------------------------- // fsq.cxx -- fsq modem // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "progress.h" #include "fsq.h" #include "complex.h" #include "fl_digi.h" #include "misc.h" #include "fileselect.h" #include "threads.h" #include "debug.h" #include "re.h" #include "configuration.h" #include "qrunner.h" #include "fl_digi.h" #include "status.h" #include "main.h" #include "icons.h" #include "ascii.h" #include "timeops.h" #include "flmisc.h" #include "test_signal.h" #include "fsq_varicode.cxx" void clear_xmt_arrays(); void disp_sounder(void *); void sounder(); void SOUNDER_start(); void SOUNDER_close(); #define SQLFILT_SIZE 64 #define NIT std::string::npos #define txcenterfreq 1500.0 int fsq::symlen = 4096; // nominal symbol length; 3 baud static const char *FSQBOL = " \n"; static const char *FSQEOL = "\n "; static const char *FSQEOT = " \b "; static const char *fsq_lf = "\n"; static const char *fsq_bot = ""; static const char *fsq_eol = ""; static const char *fsq_eot = ""; static std::string fsq_string; static std::string fsq_delayed_string; static bool enable_audit_log = false; static bool enable_heard_log = false; #include "fsq-pic.cxx" static notify_dialog *alert_window = 0; void post_alert(std::string s1, double timeout = 0.0, std::string s2 = "") { if (active_modem && (active_modem->get_mode() == MODE_FSQ) && !s2.empty()) { active_modem->send_ack(s2); } if (!alert_window) alert_window = new notify_dialog; alert_window->notify(s1.c_str(), timeout); REQ(show_notifier, alert_window); display_fsq_mon_text(s1, FTextBase::ALTR); } // nibbles table used for fast conversion from tone difference to symbol static std::string sz2utf8(std::string s) { char dest[4*s.length() + 1]; // if every char were utf8 int numbytes = fl_utf8froma(dest, sizeof(dest) - 1, s.c_str(), s.length()); if (numbytes > 0) return dest; return s; } //static int nibbles[199]; void fsq::init_nibbles() { int nibble = 0; for (int i = 0; i < 199; i++) { nibble = floor(0.5 + (i - 99)/3.0); // allow for wrap-around (33 tones for 32 tone differences) if (nibble < 0) nibble += 33; if (nibble > 32) nibble -= 33; // adjust for +1 symbol at the transmitter nibble--; nibbles[i] = nibble; } } // note: // display_fsq_rx_text and // display_fsq_mon_text // use a REQ(...) access to the UI // it is not necessary to indirectly call either write_rx_mon_char or // write_mon_tx_char using the REQ access mechanism void write_rx_mon_char(int ch) { int ach = ch & 0xFF; if (!progdefaults.fsq_directed) { display_fsq_rx_text(fsq_ascii[ach], FTextBase::FSQ_UND) ; if (ach == '\n') display_fsq_rx_text(fsq_lf, FTextBase::FSQ_UND); } display_fsq_mon_text(fsq_ascii[ach], FTextBase::RECV); if (ach == '\n') display_fsq_mon_text(fsq_lf, FTextBase::RECV); } void write_mon_tx_char(int ch) { int ach = ch & 0xFF; display_fsq_mon_text(fsq_ascii[ach], FTextBase::FSQ_TX); if (ach == '\n') display_fsq_mon_text(fsq_lf, FTextBase::FSQ_TX); } void printit(double speed, int bandwidth, int symlen, int bksize, int peak_hits, int tone) { std::ostringstream it; it << "\nSpeed.......... " << speed << "\nBandwidth...... " << bandwidth; it << "\nSymbol length.. " << symlen << "\nBlock size..... " << bksize; it << "\nMinimum Hits... " << peak_hits << "\nBasetone....... " << tone << "\n"; display_fsq_mon_text(it.str(), FTextBase::ALTR); } fsq::fsq(trx_mode md) : modem() { modem::set_freq(1500); // default Rx/Tx center frequency mode = md; samplerate = SR; fft = new g_fft(FFTSIZE); snfilt = new Cmovavg(SQLFILT_SIZE); noisefilt = new Cmovavg(32); sigfilt = new Cmovavg(8); // baudfilt = new Cmovavg(3); movavg_size = progdefaults.fsq_movavg; if (movavg_size < 1) movavg_size = progdefaults.fsq_movavg = 1; if (movavg_size > MOVAVGLIMIT) movavg_size = progdefaults.fsq_movavg = MOVAVGLIMIT; for (int i = 0; i < NUMBINS; i++) binfilt[i] = new Cmovavg(movavg_size); spacing = 3; txphase = 0; basetone = 333; picfilter = new C_FIR_filter(); picfilter->init_lowpass(257, 1, 500.0 / samplerate); phase = 0; phidiff = 2.0 * M_PI * frequency / samplerate; prevz = cmplx(0,0); bkptr = 0; peak_counter = 0; peak = last_peak = 0; max = 0; curr_nibble = prev_nibble = 0; s2n = 0; ch_sqlch_open = false; metric = 0; memset(rx_stream, 0, sizeof(rx_stream)); rx_text.clear(); for (int i = 0; i < BLOCK_SIZE; i++) a_blackman[i] = blackman(1.0 * i / BLOCK_SIZE); fsq_tx_image = false; init_nibbles(); start_aging(); show_mode(); restart(); toggle_logs(); } fsq::~fsq() { delete fft; delete snfilt; delete sigfilt; delete noisefilt; for (int i = 0; i < NUMBINS; i++) delete binfilt[i]; // delete baudfilt; delete picfilter; REQ(close_fsqMonitor); SOUNDER_close(); stop_aging(); if (enable_audit_log) audit_log.close(); if (enable_heard_log) heard_log.close(); }; void fsq::tx_init() { tone = prevtone = 0; txphase = 0; send_bot = true; mycall = progdefaults.myCall; if (progdefaults.fsq_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); videoText(); } void fsq::rx_init() { set_freq(frequency); bandwidth = 33 * spacing * samplerate / FSQ_SYMLEN; bkptr = 0; peak_counter = 0; peak = last_peak = 0; max = 0; curr_nibble = prev_nibble = 0; s2n = 0; ch_sqlch_open = false; metric = 0; memset(rx_stream, 0, sizeof(rx_stream)); rx_text.clear(); for (int i = 0; i < NUMBINS; i++) { tones[i] = 0.0; binfilt[i]->reset(); } pixel = 0; amplitude = 0; phase = 0; prevz = cmplx(0,0); image_counter = 0; RXspp = 10; // 10 samples per pixel state = TEXT; } void fsq::init() { modem::init(); sounder_interval = progdefaults.fsq_sounder; start_sounder(sounder_interval); rx_init(); } void fsq::set_freq(double f) { frequency = f; modem::set_freq(frequency); basetone = ceil(1.0*(frequency - bandwidth / 2) * FSQ_SYMLEN / samplerate); tx_basetone = ceil((get_txfreq() - bandwidth / 2) * FSQ_SYMLEN / samplerate ); int incr = basetone % spacing; basetone -= incr; tx_basetone -= incr; } void fsq::show_mode() { if (speed == 1.5 ) put_MODEstatus("FSQ-1.5"); else if (speed == 2.0) put_MODEstatus("FSQ-2"); else if (speed == 3.0) put_MODEstatus("FSQ-3"); else if (speed == 4.5) put_MODEstatus("FSQ-4.5"); else put_MODEstatus("FSQ-6"); } void fsq::adjust_for_speed() { speed = progdefaults.fsqbaud; if( speed == 1.5 ) { symlen = 8192; } else if (speed == 2.0) { symlen = 6144; } else if (speed == 3.0) { symlen = 4096; } else if (speed == 4.5) { symlen = 3072; } else { // speed == 6 symlen = 2048; } show_mode(); } void fsq::toggle_logs() { if (enable_heard_log != progdefaults.fsq_enable_heard_log) { enable_heard_log = progdefaults.fsq_enable_heard_log; if (heard_log.is_open()) heard_log.close(); } if (enable_audit_log != progdefaults.fsq_enable_audit_log) { enable_audit_log = progdefaults.fsq_enable_audit_log; if (audit_log.is_open()) audit_log.close(); } if (enable_heard_log) { heard_log_fname = progdefaults.fsq_heard_log; std::string sheard = TempDir; sheard.append(heard_log_fname); heard_log.open(sheard.c_str(), std::ios::app); heard_log << "==================================================\n"; heard_log << "Heard log: " << zdate() << ", " << ztime() << "\n"; heard_log << "==================================================\n"; } if (enable_audit_log) { audit_log_fname = progdefaults.fsq_audit_log; std::string saudit = TempDir; saudit.append(audit_log_fname); audit_log.close(); audit_log.open(saudit.c_str(), std::ios::app); audit_log << "==================================================\n"; audit_log << "Audit log: " << zdate() << ", " << ztime() << "\n"; audit_log << "==================================================\n"; } } void fsq::restart() { set_freq(frequency); peak_hits = progdefaults.fsqhits; adjust_for_speed(); mycall = progdefaults.myCall; if (progdefaults.fsq_lowercase) for (size_t n = 0; n < mycall.length(); n++) mycall[n] = tolower(mycall[n]); movavg_size = progdefaults.fsq_movavg; if (movavg_size < 1) movavg_size = progdefaults.fsq_movavg = 1; if (movavg_size > MOVAVGLIMIT) movavg_size = progdefaults.fsq_movavg = MOVAVGLIMIT; for (int i = 0; i < NUMBINS; i++) binfilt[i]->setLength(movavg_size); printit(speed, bandwidth, symlen, SHIFT_SIZE, peak_hits, basetone); } bool fsq::valid_char(int ch) { if ( ch == 10 || ch == 163 || ch == 176 || ch == 177 || ch == 215 || ch == 247 || (ch > 31 && ch < 128)) return true; return false; } //===================================================================== // receive processing //===================================================================== bool fsq::fsq_squelch_open() { return (ch_sqlch_open || metric >= progStatus.sldrSquelchValue || state == IMAGE); } static std::string triggers = " !#$%&'()*+,-.;<=>?@[\\]^_{|}~"; static std::string allcall = "allcall"; static std::string cqcqcq = "cqcqcq"; static fre_t call("([[:alnum:]]?[[:alpha:]/]+[[:digit:]]+[[:alnum:]/]+)", REG_EXTENDED); // test for valid callsign // returns: // 0 - not a callsign // 1 - mycall // 2 - allcall // 4 - cqcqcq // 8 - any other valid call int fsq::valid_callsign(std::string s) { if (s.length() < 3) return 0; if (s.length() > 20) return 0; if (s == allcall) return 2; if (s == cqcqcq) return 4; if (s == mycall) return 1; if (s.find("Heard") != std::string::npos) return 0; static char sz[21]; memset(sz, 0, 21); strcpy(sz, s.c_str()); bool matches = call.match(sz); return (matches ? 8 : 0); } void fsq::parse_rx_text() { char ztbuf[20]; struct timeval tv; gettimeofday(&tv, NULL); struct tm tm; time_t t_temp; t_temp=(time_t)tv.tv_sec; gmtime_r(&t_temp, &tm); strftime(ztbuf, sizeof(ztbuf), "%Y%m%d,%H%M%S", &tm); toprint.clear(); if (rx_text.empty()) return; if (rx_text.length() > 65536) { rx_text.clear(); return; } state = TEXT; size_t p = rx_text.find(':'); if (p == 0) { rx_text.erase(0,1); return; } if (p == std::string::npos || rx_text.length() < p + 2) { return; } std::string rxcrc = rx_text.substr(p+1,2); station_calling.clear(); int max = p+1; if (max > 20) max = 20; std::string substr; for (int i = 1; i < max; i++) { if (rx_text[p-i] <= ' ' || rx_text[p-i] > 'z') { rx_text.erase(0, p+1); return; } substr = rx_text.substr(p-i, i); if ((crc.sval(substr) == rxcrc) && valid_callsign(substr)) { station_calling = substr; break; } } if (station_calling == mycall) { // do not display any of own rx stream LOG_ERROR("Station calling is mycall: %s", station_calling.c_str()); rx_text.erase(0, p+3); return; } if (!station_calling.empty()) { REQ(add_to_heard_list, station_calling, szestimate); if (enable_heard_log) { std::string sheard = ztbuf; sheard.append(",").append(station_calling); sheard.append(",").append(szestimate).append("\n"); heard_log << sheard; heard_log.flush(); } } // remove station_calling, colon and checksum rx_text.erase(0, p+3); // extract all directed callsigns // look for 'allcall', 'cqcqcq' or mycall bool all = false; bool directed = false; // test next word in std::string size_t tr_pos = 0; char tr = rx_text[tr_pos]; size_t trigger = triggers.find(tr); // strip any leading spaces before either text or first directed callsign while (rx_text.length() > 1 && triggers.find(rx_text[0]) != std::string::npos) rx_text.erase(0,1); // find first word while ( tr_pos < rx_text.length() && ((trigger = triggers.find(rx_text[tr_pos])) == std::string::npos) ) { tr_pos++; } while (trigger != std::string::npos && tr_pos < rx_text.length()) { int word_is = valid_callsign(rx_text.substr(0, tr_pos)); if (word_is == 0) { rx_text.insert(0," "); break; // not a callsign } if (word_is == 1) { directed = true; // mycall } // test for cqcqcq and allcall else if (word_is != 8) all = true; rx_text.erase(0, tr_pos); while (rx_text.length() > 1 && (rx_text[0] == ' ' && rx_text[1] == ' ')) rx_text.erase(0,1); if (rx_text[0] != ' ') break; rx_text.erase(0, 1); tr_pos = 0; tr = rx_text[tr_pos]; trigger = triggers.find(tr); while ( tr_pos < rx_text.length() && (trigger == std::string::npos) ) { tr_pos++; tr = rx_text[tr_pos]; trigger = triggers.find(tr); } } if ( (all == false) && (directed == false)) { rx_text.clear(); return; } // remove eot if present if (rx_text.length() > 3) rx_text.erase(rx_text.length() - 3); toprint.assign(station_calling).append(":"); // test for trigger tr = rx_text[0]; trigger = triggers.find(tr); if (trigger == NIT) { tr = ' '; // force to be text line rx_text.insert(0, " "); } // if asleep suppress all but the * trigger if (btn_SELCAL->value() == 0) { if (tr == '*') parse_star(); rx_text.clear(); return; } // now process own call triggers if (directed) { switch (tr) { case ' ': parse_space(false); break; case '?': parse_qmark(); break; case '*': parse_star(); break; case '+': parse_plus(); break; case '-': break;//parse_minus(); break; case ';': parse_relay(); break; case '!': parse_repeat(); break; case '~': parse_delayed_repeat(); break; case '#': parse_pound(); break; case '$': parse_dollar(); break; case '@': parse_at(); break; case '&': parse_amp(); break; case '^': parse_carat(); break; case '%': parse_pcnt(); break; case '|': parse_vline(); break; case '>': parse_greater(); break; case '<': parse_less(); break; case '[': parse_relayed(); break; } } // if allcall; only respond to the ' ', '*', '#', '%', and '[' triggers else { switch (tr) { case ' ': parse_space(true); break; case '*': parse_star(); break; case '#': parse_pound(); break; case '%': parse_pcnt(); break; case '[': parse_relayed(); break; } } rx_text.clear(); } void fsq::parse_space(bool all) { display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_qmark(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" snr=").append(szestimate); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_dollar(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" Heard:\n"); response.append(heard_list()); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_star() { REQ(enableSELCAL); reply(std::string(station_calling).append(" ack")); } // immediate repeat of msg void fsq::parse_repeat() { std::string response; rx_text.erase(0, 1); if (rx_text[0] != ' ') rx_text.insert(0, " "); response.assign(" "); response.append(rx_text); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } // delayed repeat of msg void fsq::parse_delayed_repeat() { std::string response; rx_text.erase(0, 1); if (rx_text[0] != ' ') rx_text.insert(0, " "); response.assign(" "); response.append(rx_text); delayed_reply(response, 15); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } // extended relay of msg // k2a sees : k1a:; k3a hi // k2a sends: k2a:22k3a[k1a] hi void fsq::parse_relay() { std::string send_txt = rx_text; send_txt.erase(0,1); // remove ';' if (send_txt.empty()) return; while (send_txt[0] == ' ' && !send_txt.empty()) send_txt.erase(0,1); // remove leading spaces // find trigger size_t p = 0; while ((triggers.find(send_txt[p]) == NIT) && p < send_txt.length()) p++; std::string response = std::string("[").append(station_calling).append("]"); send_txt.insert(p, response); if ((p = send_txt.find('^')) != NIT) send_txt.insert(p, "^"); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); reply(send_txt); } // k3a sees : k2a: [k1a]@ // or : k2a:[k1a]@ void fsq::parse_relayed() { std::string relayed = ""; size_t p1 = rx_text.find('['); if (p1 == NIT) { LOG_ERROR("%s", "missing open bracket"); return; } rx_text.erase(0,p1 + 1); if (rx_text.empty()) return; size_t p2 = rx_text.find(']'); if (p2 == NIT) { LOG_ERROR("%s", "missing end bracket"); return; } relayed = rx_text.substr(0, p2); rx_text.erase(0, p2 + 1); if (rx_text.empty()) return; if (triggers.find(rx_text[0]) == NIT) { LOG_ERROR("%s", "invalid relay trigger"); return; } // execute trigger switch (rx_text[0]) { case ' ' : { std::string response = station_calling; response.append(";").append(relayed).append(rx_text); display_fsq_rx_text(toprint.append(response).append("\n"), FTextBase::FSQ_DIR); } break; case '$' : parse_dollar(relayed); break; case '&' : parse_amp(relayed); break; case '?' : parse_qmark(relayed); break; case '@' : parse_at(relayed); break; case '^' : parse_carat(relayed); break; case '|' : parse_vline(relayed); break; case '#' : parse_pound(relayed); break; case '<' : parse_less(relayed); break; case '>' : parse_greater(relayed); break; default : break; } } // rx_text[0] will be '#' void fsq::parse_pound(std::string relay) { size_t p1 = NIT, p2 = NIT; std::string fname = ""; p1 = rx_text.find('['); if (p1 != NIT) { p2 = rx_text.find(']', p1); if (p2 != NIT) { fname = rx_text.substr(p1 + 1, p2 - p1 - 1); fname = fl_filename_name(fname.c_str()); } else p2 = 0; } else p2 = 0; if (fname.empty()) { if (!relay.empty()) fname = relay; else fname = station_calling; fname.append(".txt"); } if (fname.find(".txt") == std::string::npos) fname.append(".txt"); if (rx_text[rx_text.length() -1] != '\n') rx_text.append("\n"); size_t p3 = NIT; while( (p3 = fname.find("/")) != NIT) fname[p3] = '.'; while( (p3 = fname.find("\\")) != NIT) fname[p3] = '.'; std::ofstream rxfile; fname.insert(0, TempDir); if (progdefaults.always_append) { rxfile.open(fname.c_str(), std::ios::app); } else { rxfile.open(fname.c_str(), std::ios::out); } if (!rxfile) return; if (progdefaults.add_fsq_msg_dt) { rxfile << "Received: " << zdate() << ", " << ztime() << "\n"; rxfile << rx_text.substr(p2+1) << "\n"; } else rxfile << rx_text.substr(p2+1); rxfile.close(); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" ack"); reply(response); } void fsq::parse_plus(std::string relay) { size_t p1 = NIT, p2 = NIT; std::string fname = ""; p1 = rx_text.find('['); if (p1 != NIT) { p2 = rx_text.find(']', p1); if (p2 != NIT) { fname = rx_text.substr(p1 + 1, p2 - p1 - 1); fname = fl_filename_name(fname.c_str()); } else p2 = 0; } if (fname.empty()) { if (!relay.empty()) fname = relay; else fname = station_calling; fname.append(".txt"); } std::ifstream txfile; bool append = (fname == station_calling); std::string pathname = TempDir; if (append) { pathname.append(fname).append(".txt"); txfile.open(pathname.c_str()); } else { pathname.append(fname); txfile.open(pathname.c_str()); } if (!txfile) { reply(std::string(station_calling).append(" not found")); return; } std::stringstream outtext(station_calling); outtext << " [" << fname << "]\n"; char ch = txfile.get(); while (!txfile.eof()) { outtext << ch; ch = txfile.get(); } txfile.close(); std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(outtext.str()); reply(response); } void fsq::parse_minus() { display_fsq_rx_text(toprint.append(rx_text).append(" nia\n"), FTextBase::FSQ_DIR); reply(std::string(station_calling).append(" not supported")); } void fsq::parse_at(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" ").append(progdefaults.myQth); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_amp(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" ").append(progdefaults.fsqQTCtext); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_carat(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" fldigi ").append(PACKAGE_VERSION); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_pcnt() { switch (rx_text[2]) { case 'L' : image_mode = 0; picW = 320; picH = 240; break; case 'S' : image_mode = 1; picW = 160; picH = 120; break; case 'F' : image_mode = 2; picW = 640; picH = 480; break; case 'V' : image_mode = 3; picW = 640; picH = 480; break; case 'P' : image_mode = 4; picW = 240; picH = 300; break; case 'p' : image_mode = 5; picW = 240; picH = 300; break; case 'M' : image_mode = 6; picW = 120; picH = 150; break; case 'm' : image_mode = 7; picW = 120; picH = 150; break; } REQ( fsq_showRxViewer, picW, picH, rx_text[2] ); image_counter = 0; picf = 0; row = col = rgb = 0; state = IMAGE; display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_vline(std::string relay) { display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); std::string alert = "Message received from "; if (relay.empty()) alert.append(station_calling); else alert.append(relay); alert.append("\n").append("at: ").append(zshowtime()).append("\n"); alert.append(rx_text.substr(1)); REQ(post_alert, alert, progdefaults.fsq_notify_time_out, relay); } void fsq::send_ack(std::string relay) { std::string response = station_calling; if (!relay.empty()) response.append(";").append(relay); response.append(" ack"); reply(response); } void fsq::parse_greater(std::string relay) { std::string response; response.assign(station_calling); if (!relay.empty()) response.append(";").append(relay); double spd = progdefaults.fsqbaud; if (spd == 1.5 ) { spd = 2.0; response.append(" 2.0 baud"); } else if (spd == 2.0) { spd = 3.0; response.append(" 3.0 baud"); } else if (spd == 3.0) { spd = 4.5; response.append(" 4.5 baud"); } else if (spd == 4.5) { spd = 6.0; response.append(" 6.0 baud"); } else if (spd == 6.0) { response.append(" 6.0 baud"); } progdefaults.fsqbaud = spd; adjust_for_speed(); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::parse_less(std::string relay) { std::string response; response.assign(station_calling); if (!relay.empty()) response.append(";").append(relay); double spd = progdefaults.fsqbaud; if (spd == 2.0) { spd = 1.5; response.append(" 1.5 baud"); } else if (spd == 3.0) { spd = 2.0; response.append(" 2.0 baud"); } else if (spd == 4.5) { spd = 3.0; response.append(" 3.0 baud"); } else if (spd == 6.0) { spd = 4.5; response.append(" 4.5 baud"); } progdefaults.fsqbaud = spd; adjust_for_speed(); reply(response); display_fsq_rx_text(toprint.append(rx_text).append("\n"), FTextBase::FSQ_DIR); } void fsq::lf_check(int ch) { static char lfpair[3] = "01"; static char bstrng[4] = "012"; lfpair[0] = lfpair[1]; lfpair[1] = 0xFF & ch; bstrng[0] = bstrng[1]; bstrng[1] = bstrng[2]; bstrng[2] = 0xFF & ch; b_bot = b_eol = b_eot = false; if (bstrng[0] == FSQEOT[0] // find SP SP BS SP && bstrng[1] == FSQEOT[1] && bstrng[2] == FSQEOT[2] ) { b_eot = true; } else if (lfpair[0] == FSQBOL[0] && lfpair[1] == FSQBOL[1]) { b_bot = true; } else if (lfpair[0] == FSQEOL[0] && lfpair[1] == FSQEOL[1]) { b_eol = true; } } void fsq::process_symbol(int sym) { int nibble = 0; int curr_ch = -1; symbol = sym; nibble = symbol - prev_symbol; if (nibble < -99 || nibble > 99) { prev_symbol = symbol; return; } nibble = nibbles[nibble + 99]; // -1 is our idle symbol, indicating we already have our symbol if (nibble >= 0) { // process nibble curr_nibble = nibble; // single-nibble characters if ((prev_nibble < 29) & (curr_nibble < 29)) { curr_ch = wsq_varidecode[prev_nibble]; // double-nibble characters } else if ( (prev_nibble < 29) && (curr_nibble > 28) && (curr_nibble < 32)) { curr_ch = wsq_varidecode[prev_nibble * 32 + curr_nibble]; } if (curr_ch > 0) { if (enable_audit_log) { audit_log << fsq_ascii[curr_ch];// & 0xFF]; if (curr_ch == '\n') audit_log << '\n'; audit_log.flush(); } lf_check(curr_ch); if (b_bot) { ch_sqlch_open = true; rx_text.clear(); } if (fsq_squelch_open()) { write_rx_mon_char(curr_ch); if (b_bot) { char ztbuf[20]; struct timeval tv; gettimeofday(&tv,NULL); struct tm tm; time_t t_temp; t_temp=(time_t)tv.tv_sec; gmtime_r(&t_temp, &tm); strftime(ztbuf,sizeof(ztbuf),"%m/%d %H:%M:%S ",&tm); display_fsq_mon_text( ztbuf, FTextBase::CTRL); display_fsq_mon_text( fsq_bot, FTextBase::CTRL); } if (b_eol) { display_fsq_mon_text( fsq_eol, FTextBase::CTRL); noisefilt->reset(); noisefilt->run(1); sigfilt->reset(); sigfilt->run(1); snprintf(szestimate, sizeof(szestimate), "%.0f db", s2n ); } if (b_eot) { snprintf(szestimate, sizeof(szestimate), "%.0f db", s2n ); noisefilt->reset(); noisefilt->run(1); sigfilt->reset(); sigfilt->run(1); display_fsq_mon_text( fsq_eot, FTextBase::CTRL); } } if ( valid_char(curr_ch) || b_eol || b_eot ) { if (rx_text.length() > 32768) rx_text.clear(); if ( fsq_squelch_open() || !progStatus.sqlonoff ) { rx_text += curr_ch; if (b_eot) { parse_rx_text(); if (state == TEXT) { ch_sqlch_open = false; metric = 0; } } } } if (fsq_squelch_open() && (b_eot || b_eol)) { ch_sqlch_open = false; metric = 0; } } prev_nibble = curr_nibble; } prev_symbol = symbol; } // find the maximum bin // 908 Hz and 1351 Hz respectively for original center frequency of 1145 Hz // 1280 to 1720 for a 1500 Hz center frequency void fsq::process_tones() { max = 0; peak = NUMBINS / 2; // examine FFT bin contents over bandwidth +/- ~ 50 Hz int firstbin = frequency * FSQ_SYMLEN / samplerate - NUMBINS / 2; double sigval = 0; double min = 3.0e8; int minbin = NUMBINS / 2; for (int i = 0; i < NUMBINS; ++i) { val = norm(fft_data[i + firstbin]); // looking for maximum signal tones[i] = binfilt[i]->run(val); if (tones[i] > max) { max = tones[i]; peak = i; } // looking for minimum signal in a 3 bin sequence if (tones[i] < min) { min = tones[i]; minbin = i; } } sigval = tones[(peak-1) < 0 ? (NUMBINS - 1) : (peak - 1)] + tones[peak] + tones[(peak+1) == NUMBINS ? 0 : (peak + 1)]; min = tones[(minbin-1) < 0 ? (NUMBINS - 1) : (minbin - 1)] + tones[minbin] + tones[(minbin+1) == NUMBINS ? 0 : (minbin + 1)]; if (min == 0) min = 1e-10; s2n = 10 * log10( snfilt->run(sigval/min)) - 34.0 + movavg_size / 4; if (s2n <= 0) metric = 2 * (25 + s2n); if (s2n > 0) metric = 50 * ( 1 + s2n / 45); metric = clamp(metric, 0, 100); display_metric(metric); if (metric < progStatus.sldrSquelchValue && ch_sqlch_open) ch_sqlch_open = false; // requires consecutive hits if (peak == prev_peak) { peak_counter++; } else { peak_counter = 0; } if ((peak_counter >= peak_hits) && (peak != last_peak) && (fsq_squelch_open() || !progStatus.sqlonoff)) { process_symbol(peak); peak_counter = 0; last_peak = peak; } prev_peak = peak; } void fsq::recvpic(double smpl) { phase -= phidiff; if (phase < 0) phase += 2.0 * M_PI; cmplx z = smpl * cmplx( cos(phase), sin(phase ) ); picfilter->run( z, currz); pixel += arg(conj(prevz) * currz);// * samplerate / TWOPI; amplitude += norm(currz); prevz = currz; if (image_counter <= -RXspp) { pixel = 0; amplitude = 0; image_counter++; return; } if ((image_counter++ % RXspp) == 0) { amplitude /= RXspp; pixel /= RXspp; pixel *= (samplerate / TWOPI); byte = pixel / 1.5 + 128; byte = (int)CLAMP( byte, 0.0, 255.0); // FSQCAL sends blue-green-red static int RGB[] = {2, 1, 0}; if (image_mode == 2 || image_mode == 5 || image_mode == 7) { // grey scale pixelnbr = 3 * (col + row * picW); REQ(fsq_updateRxPic, byte, pixelnbr); REQ(fsq_updateRxPic, byte, pixelnbr + 1); REQ(fsq_updateRxPic, byte, pixelnbr + 2); if (++ col == picW) { col = 0; row++; if (row >= picH) { state = TEXT; REQ(fsq_enableshift); metric = 0; } } } else { pixelnbr = RGB[rgb] + 3 * (col + row * picW); REQ(fsq_updateRxPic, byte, pixelnbr); if (++col == picW) { col = 0; if (++rgb == 3) { rgb = 0; row ++; } } if (row >= picH) { state = TEXT; REQ(fsq_enableshift); metric = 0; } } pixel = 0; amplitude = 0; } } int fsq::rx_process(const double *buf, int len) { if (peak_hits != progdefaults.fsqhits) restart(); if (movavg_size != progdefaults.fsq_movavg) restart(); if (speed != progdefaults.fsqbaud) restart(); if (enable_heard_log != progdefaults.fsq_enable_heard_log || enable_audit_log != progdefaults.fsq_enable_audit_log) toggle_logs(); if (sounder_interval != progdefaults.fsq_sounder) { sounder_interval = progdefaults.fsq_sounder; start_sounder(sounder_interval); } if (bkptr < 0) bkptr = 0; if (bkptr >= SHIFT_SIZE) bkptr = 0; if (len > 512) { LOG_ERROR("fsq rx stream overrun %d", len); } if (progStatus.fsq_rx_abort) { state = TEXT; progStatus.fsq_rx_abort = false; REQ(fsq_clear_rximage); } while (len) { if (state == IMAGE) { recvpic(*buf); len--; buf++; } else { rx_stream[BLOCK_SIZE + bkptr] = *buf; len--; buf++; bkptr++; if (bkptr == SHIFT_SIZE) { bkptr = 0; memmove(rx_stream, // to &rx_stream[SHIFT_SIZE], // from BLOCK_SIZE*sizeof(*rx_stream)); // # bytes // fft_data gets overwritten each time with a fixed number of // elements. Do we need to zero it out? //memset(fft_data, 0, sizeof(fft_data)); for (int i = 0; i < BLOCK_SIZE; i++) { double d = rx_stream[i] * a_blackman[i]; fft_data[i] = cmplx(d, d); } fft->ComplexFFT(fft_data); process_tones(); } } } return 0; } //===================================================================== // transmit processing //===================================================================== // implement the symbol counter using a new thread whose thread loop // time is equal to a symbol length 4096/12000 = 341 milliseconds // symbol loop decrements symbol counts and send_symbol increments them // flush_buffer will then awake for the symbol count to be zero // have not observed a remaining count > 1 so this might be an over kill! // typical awake period is 90 msec void fsq::flush_buffer() { for (int i = 0; i < 64; i++) outbuf[i] = 0; ModulateXmtr(outbuf, 64); return; } #include "confdialog.h" void fsq::send_tone(int tone) { double phaseincr; double freq; if (speed != progdefaults.fsqbaud) restart(); freq = (tx_basetone + tone * spacing) * samplerate / FSQ_SYMLEN; if (test_signal_window && test_signal_window->visible() && btnOffsetOn->value()) freq += ctrl_freq_offset->value(); phaseincr = 2.0 * M_PI * freq / samplerate; prevtone = tone; int send_symlen = symlen; if (fsq_tx_image) send_symlen = 4096; // must use 3 baud symlen for image xfrs for (int i = 0; i < send_symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, send_symlen); } void fsq::send_symbol(int sym) { tone = (prevtone + sym + 1) % 33; send_tone(tone); } void fsq::send_idle() { send_symbol(28); send_symbol(30); } static bool send_eot = false; void fsq::send_char(int ch) { if (!ch) return send_idle(); int sym1 = fsq_varicode[ch][0]; int sym2 = fsq_varicode[ch][1]; send_symbol(sym1); if (sym2 > 28) send_symbol(sym2); if (valid_char(ch) && !(send_bot || send_eot)) put_echo_char(ch); write_mon_tx_char(ch); } void fsq::send_image() { int W = 640, H = 480; // grey scale transfer (FAX) bool color = true; float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; if (!fsqpicTxWin || !fsqpicTxWin->visible()) { return; } switch (selfsqpicSize->value()) { case 0 : W = 160; H = 120; break; case 1 : W = 320; H = 240; break; case 2 : W = 640; H = 480; color = false; break; case 3 : W = 640; H = 480; break; case 4 : W = 240; H = 300; break; case 5 : W = 240; H = 300; color = false; break; case 6 : W = 120; H = 150; break; case 7 : W = 120; H = 150; color = false; break; } REQ(fsq_clear_tximage); stop_deadman(); freq = frequency - 200; #define PHASE_CORR 200 phaseincr = radians * freq; for (int n = 0; n < PHASE_CORR; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, 10); if (color == false) { // grey scale image for (int row = 0; row < H; row++) { memset(outbuf, 0, 10 * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = 0.3 * fsqpic_TxGetPixel(tx_pixelnbr, 0) + // red 0.6 * fsqpic_TxGetPixel(tx_pixelnbr, 1) + // green 0.1 * fsqpic_TxGetPixel(tx_pixelnbr, 2); // blue REQ(fsq_updateTxPic, tx_pixel, tx_pixelnbr*3 + 0); REQ(fsq_updateTxPic, tx_pixel, tx_pixelnbr*3 + 1); REQ(fsq_updateTxPic, tx_pixel, tx_pixelnbr*3 + 2); freq = frequency - 200 + tx_pixel * 1.5; phaseincr = radians * freq; for (int n = 0; n < 10; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, 10); Fl::awake(); } } } else { for (int row = 0; row < H; row++) { for (int color = 2; color >= 0; color--) { memset(outbuf, 0, 10 * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = fsqpic_TxGetPixel(tx_pixelnbr, color); REQ(fsq_updateTxPic, tx_pixel, tx_pixelnbr*3 + color); freq = frequency - 200 + tx_pixel * 1.5; phaseincr = radians * freq; for (int n = 0; n < 10; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, 10); } Fl::awake(); } } } start_deadman(); } void fsq::send_string(std::string s) { for (size_t n = 0; n < s.length(); n++) send_char(s[n]); if ((s == FSQEOT || s == FSQEOL) && fsq_tx_image) send_image(); } void fsq::fsq_send_image(std::string s) { fsq_tx_image = true; fsq_string = std::string("IMAGE:").append(s); write_fsq_que(fsq_string); fsq_xmt(s); } int fsq::tx_process() { modem::tx_process(); if (send_bot) { std::string send; send.assign(" ").append(FSQBOL).append(mycall).append(":"); if (progdefaults.fsq_directed) send.append(crc.sval(mycall)); send_string(send); send_bot = false; } int c = get_tx_char(); if (c == GET_TX_CHAR_ETX || c == -1) { // end of text or empty tx buffer send_eot = true; if (progdefaults.fsq_directed) send_string(std::string(FSQEOT)); else send_string(std::string(FSQEOL)); send_eot = false; put_echo_char('\n'); if (c == -1) REQ(&FTextTX::clear, TransmitText); flush_buffer(); stopflag = false; fsq_tx_image = false; return -1; } if ( stopflag ) { // aborts transmission static std::string aborted = " !ABORTED!\n"; for (size_t n = 0; n < aborted.length(); n++) put_echo_char(aborted[n]); fsq_tx_image = false; stopflag = false; clear_xmt_arrays(); return -1; } send_char(c); return 0; } //============================================================================== // delayed transmit //============================================================================== static pthread_mutex_t fsq_tx_mutex = PTHREAD_MUTEX_INITIALIZER; static float xmt_repeat_try = 6.0; static std::string tx_text_queue = ""; static std::vector commands; #define NUMCOMMANDS 10 static size_t next = 0; void clear_xmt_arrays() { commands.erase(commands.begin(), commands.begin()); tx_text_queue.clear(); fsq_tx_text->clear(); } int fsq_xmtdelay() // 500 >= val <= 1000 in milliseconds { #define MIN_DELAY 50 #define MAX_DELAY 500 srand((int)clock()); double scaled = (double)rand()/RAND_MAX; int delay = round(((MAX_DELAY - MIN_DELAY + 1 ) * scaled + MIN_DELAY)); if (delay < MIN_DELAY) delay = MIN_DELAY; if (delay > MAX_DELAY) delay = MAX_DELAY; return delay + 500; } void fsq_repeat_last_command() { using ::next; // disambiguate from std::next if (commands.empty()) return; fsq_tx_text->clear(); fsq_tx_text->addstr(sz2utf8(commands[next].c_str())); next++; if (next == commands.size()) { next = 0; } } int get_fsq_tx_char(void) { guard_lock tx_proc_lock(&fsq_tx_mutex); if (tx_text_queue.empty()) return (GET_TX_CHAR_NODATA); int c = tx_text_queue[0]; tx_text_queue.erase(0,1); if (c == GET_TX_CHAR_ETX) { return c; } if (c == -1) return(GET_TX_CHAR_NODATA); if (c == '^') { c = tx_text_queue[0]; tx_text_queue.erase(0,1); if (c == -1) return(GET_TX_CHAR_NODATA); switch (c) { case 'r': return(GET_TX_CHAR_ETX); break; case 'R': return(GET_TX_CHAR_ETX); break; default: ; } } start_deadman(); return(c); } void try_transmit(void *) { if (active_modem != fsq_modem) return; if (!active_modem->fsq_squelch_open() && trx_state == STATE_RX) { ::next = 0; fsq_que_clear(); MilliSleep(fsq_xmtdelay()); start_tx(); return; } if (xmt_repeat_try > 0) { xmt_repeat_try -= 0.5; static char szwaiting[50]; snprintf(szwaiting, sizeof(szwaiting), "Waiting %4.2f", xmt_repeat_try); fsq_que_clear(); write_fsq_que(std::string(szwaiting).append("\n").append(fsq_string)); LOG_INFO("%s", szwaiting); Fl::add_timeout(0.5, try_transmit); return; } else { static const char szsquelch[50] = "Squelch open. Transmit timed out!"; display_fsq_rx_text(std::string("\n").append(szsquelch).append("\n").c_str(), FTextBase::ALTR); LOG_WARN("%s", szsquelch); tx_text_queue.clear(); fsq_que_clear(); if (active_modem->fsq_tx_image) active_modem->fsq_tx_image = false; return; } return; } inline void _fsq_xmt(std::string s) { tx_text_queue.clear(); if (commands.size() > NUMCOMMANDS) commands.pop_back(); commands.insert(commands.begin(), 1, s); s.append("^r"); tx_text_queue = s; xmt_repeat_try = progdefaults.fsq_time_out; Fl::awake(try_transmit); } void fsq_xmt_mt(void *cs = (void *)0) { guard_lock tx_proc_lock(&fsq_tx_mutex); if (active_modem != fsq_modem) return; if (!cs) return; std::string s; s.assign((char *) cs); delete (char *) cs; if(!s.empty()) { _fsq_xmt(s); } } void fsq_xmt(std::string s) { guard_lock tx_proc_lock(&fsq_tx_mutex); if (active_modem != fsq_modem) return; if(!s.empty()) { _fsq_xmt(s); } } void fsq_transmit(void *a = (void *)0) { guard_lock tx_proc_lock(&fsq_tx_mutex); if (active_modem != fsq_modem) return; if (!tx_text_queue.empty()) { size_t p = tx_text_queue.find("^r"); tx_text_queue.erase(p); tx_text_queue += ' '; int nxt = fsq_tx_text->nextChar(); while (nxt != -1) { tx_text_queue += nxt; nxt = fsq_tx_text->nextChar(); } commands.erase(commands.begin(), commands.begin()); commands.insert(commands.begin(), 1, tx_text_queue); tx_text_queue.append("^r"); fsq_tx_text->clear(); //printf("A: '%s'\n", tx_text_queue.c_str()); return; } int nxt = fsq_tx_text->nextChar(); while (nxt != -1) { tx_text_queue += nxt; nxt = fsq_tx_text->nextChar(); } if (commands.size() > NUMCOMMANDS) commands.pop_back(); commands.insert(commands.begin(), 1, tx_text_queue); tx_text_queue.append("^r"); fsq_tx_text->clear(); //printf("B: '%s'\n", tx_text_queue.c_str()); xmt_repeat_try = progdefaults.fsq_time_out; Fl::awake(try_transmit); } void timed_xmt(void *) { fsq_xmt(fsq_delayed_string); } static float secs = 0; void fsq_add_tx_timeout(void *a = 0) { Fl::add_timeout(secs, timed_xmt); } void fsq::reply(std::string s) { fsq_string = std::string("SEND: ").append(s); write_fsq_que(fsq_string); char *cs = (char *)0; cs = new char[s.size() + 1]; if(!cs) return; cs[s.size()] = 0; memcpy(cs, s.c_str(), s.size()); Fl::awake(fsq_xmt_mt, (void *) cs); } void fsq::delayed_reply(std::string s, int delay) { fsq_string = std::string("DELAYED SEND: ").append(s); write_fsq_que(fsq_string); fsq_delayed_string = s; secs = delay; Fl::awake(fsq_add_tx_timeout, 0); } //============================================================================== // Heard list aging //============================================================================== void aging(void *who) { fsq *me = (fsq *)who; if (me != active_modem) return; age_heard_list(); Fl::repeat_timeout(60.0, aging, me); } void fsq_start_aging(void *who) { fsq *me = (fsq *)who; Fl::remove_timeout(aging); Fl::add_timeout(60.0, aging, me); } void fsq::start_aging() { Fl::awake(fsq_start_aging, this); } void fsq_stop_aging(void *) { Fl::remove_timeout(aging); } void fsq::stop_aging() { Fl::awake(fsq_stop_aging); } //============================================================================== // Sounder support //============================================================================== static int sounder_msecs = 0; static int sounder_ticks = 0; void disp_sounder(void *) { //012345 //01:23:45 std::string stime = ztime(); stime.insert(2,":"); // stime.insert(5,":"); stime.erase(5); std::string sndx = "Sounded @ "; sndx.append(stime);//.append("\n"); display_fsq_rx_text(sndx, FTextBase::ALTR); } void disp_busy(void *) { char report[80]; snprintf(report, sizeof(report), "Squelch open, retry sounding in %d secs", sounder_ticks / 100); LOG_INFO("%s", report); } void disp_tx_active(void *) { char report[80]; snprintf(report, sizeof(report), "TX active, retry sounding in %d secs", sounder_ticks / 100); LOG_INFO("%s", report); } std::string xmtstr; int xmtmsecs = 0; void sounder() { if (active_modem != fsq_modem) return; if (trx_state == STATE_TX || trx_state == STATE_TUNE) { sounder_ticks = sounder_msecs; // wait until next interval Fl::awake(disp_tx_active); return; } if (active_modem->fsq_squelch_open()) { sounder_ticks = 2000; // wait 20 seconds Fl::awake(disp_busy); return; } if (xmtstr.empty()) { xmtstr.assign(FSQBOL).append(active_modem->fsq_mycall()).append(":").append(" ").append(FSQEOT); } xmtmsecs = round(((100000.0 * xmtstr.length() * fsq::symlen) / 4096.0) / SR); Fl::awake(disp_sounder); fsq_xmt(" "); sounder_ticks = sounder_msecs - xmtmsecs; } //====================================================================== // SOUNDER Thread loop //====================================================================== static pthread_t SOUNDER_thread; static pthread_mutex_t SOUNDER_mutex = PTHREAD_MUTEX_INITIALIZER; bool SOUNDER_exit = false; bool SOUNDER_enabled = false; void *SOUNDER_loop(void *args) { SET_THREAD_ID(FSQ_SOUNDER_TID); #define LOOP 10 sounder_ticks = sounder_msecs; while(1) { if (SOUNDER_exit) break; { guard_lock lock(&SOUNDER_mutex); if (sounder_ticks > 0) { --sounder_ticks; if (sounder_ticks == 0) sounder(); } } MilliSleep(LOOP); } // exit the SOUNDER thread SET_THREAD_CANCEL(); return NULL; } void SOUNDER_start() { SOUNDER_exit = false; if (pthread_create(&SOUNDER_thread, NULL, SOUNDER_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); return; } LOG_INFO("%s", "Time Of Day thread started"); SOUNDER_enabled = true; } void SOUNDER_close() { if (!SOUNDER_enabled) return; SOUNDER_exit = true; pthread_join(SOUNDER_thread, NULL); SOUNDER_enabled = false; LOG_INFO("%s", "FSQ sounder thread terminated. "); } void fsq::start_sounder(int interval) { if (!SOUNDER_enabled) SOUNDER_start(); guard_lock txlock(&SOUNDER_mutex); switch (interval) { case 0: sounder_msecs = 0; break; // sounder disabled case 1: sounder_msecs = 6000; break; // 1 minute case 2: sounder_msecs = 60000; break; // 10 minutes case 3: sounder_msecs = 180000; break; // 30 minutes case 4: sounder_msecs = 360000; break; // 60 minutes default: sounder_msecs = 60000; } sounder_ticks = sounder_msecs; } #include "bitmaps.cxx" fldigi-4.2.05/src/fsq/fsq-pic.cxx0000664000175000017500000003230214611711171013431 00000000000000// ---------------------------------------------------------------------------- // fsqpic.cxx -- fsq image support functions // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gfsq source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "gettext.h" #include "fileselect.h" Fl_Double_Window *fsqpicRxWin = (Fl_Double_Window *)0; picture *fsqpicRx = (picture *)0; Fl_Button *btnfsqRxReset = (Fl_Button *)0; Fl_Button *btnfsqRxSave = (Fl_Button *)0; Fl_Button *btnfsqRxClose = (Fl_Button *)0; Fl_Counter *cnt_phase = (Fl_Counter *)0; Fl_Counter *cnt_slant = (Fl_Counter *)0; Fl_Double_Window *fsqpicTxWin = (Fl_Double_Window *)0; picture *fsqpicTx = (picture *)0; Fl_Button *btnfsqpicTransmit = (Fl_Button *)0; Fl_Button *btnfsqpicTxSendAbort = (Fl_Button *)0; Fl_Button *btnfsqpicTxLoad = (Fl_Button *)0; Fl_Button *btnfsqpicTxClose = (Fl_Button *)0; Fl_Choice *selfsqpicSize = (Fl_Choice *)0; Fl_Shared_Image *fsqTxImg = (Fl_Shared_Image *)0; unsigned char *fsqxmtimg = (unsigned char *)0; unsigned char *fsqxmtpicbuff = (unsigned char *)0; #define RAWSIZE 640*(480 + 8)*3*10 #define RAWSTART 640*4*3*10 unsigned char rawvideo[RAWSIZE + 1]; int numpixels; int pixelptr; int rawcol; int rawrow; int rawrgb; char image_type = 'S'; int fsq_txSPP = 8; char fsq_txclr_tooltip[24]; char fsq_txgry_tooltip[24]; static int translate = 0; static bool enabled = false; void correct_video() { int W = fsqpicRx->w(); int H = fsqpicRx->h(); int slant = cnt_slant->value(); int vidsize = W * H; int index, rowptr, colptr; float ratio = (((float)vidsize - (float)slant)/(float)vidsize); unsigned char vid[W * H * 3]; for (int row = 0; row < H; row++) { rowptr = W * 3 * row * 10; for (int col = 0; col < W; col++) { colptr = 10*col; for (int rgb = 0; rgb < 3; rgb++) { index = ratio*(rowptr + colptr + 10*W*rgb); index += RAWSTART - 10*pixelptr; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[2 - rgb + 3 * (col + row * W)] = rawvideo[index]; } } } fsqpicRx->video(vid, W*H*3); } void fsq_updateRxPic(unsigned char data, int pos) { if (!fsqpicRxWin->shown()) fsqpicRx->show(); fsqpicRx->pixel(data, pos); int W = fsqpicRx->w(); if (image_type == 'F' || image_type == 'p' || image_type == 'm') { int n = RAWSTART + 10*(rawcol + W * (rawrgb + 3 * rawrow)); if (n < RAWSIZE) for (int i = 0; i < 10; i++) rawvideo[n + i] = data; rawrgb++; if (rawrgb == 3) { rawrgb = 0; rawcol++; if (rawcol == W) { rawcol = 0; rawrow++; } } } else for (int i = 0; i < 10; i++) rawvideo[RAWSTART + 10*numpixels + i] = data; numpixels++; if (numpixels >= (RAWSIZE - RAWSTART - 10)) numpixels = RAWSIZE - RAWSTART - 10; } void cb_btnfsqRxReset(Fl_Widget *, void *) { progStatus.fsq_rx_abort = true; } void cb_btnfsqRxSave(Fl_Widget *, void *) { fsqpicRx->save_png(PicsDir.c_str()); } void cb_btnfsqRxClose(Fl_Widget *, void *) { fsqpicRxWin->hide(); progStatus.fsq_rx_abort = true; } void cb_cnt_phase(Fl_Widget *, void *data) { pixelptr = cnt_phase->value(); if (pixelptr >= RAWSTART/10) { pixelptr = RAWSTART/10 - 1; cnt_phase->value(pixelptr); } if (pixelptr < -RAWSTART/10) { pixelptr = -RAWSTART/10; cnt_phase->value(pixelptr); } correct_video(); } void cb_cnt_slant(Fl_Widget *, void *) { correct_video(); } void fsq_disableshift() { if (!fsqpicRxWin) return; cnt_phase->deactivate(); cnt_slant->deactivate(); btnfsqRxSave->deactivate(); fsqpicRxWin->redraw(); } void fsq_enableshift() { if (!fsqpicRxWin) return; cnt_phase->activate(); cnt_slant->activate(); btnfsqRxSave->activate(); fsqpicRxWin->redraw(); } void fsq_createRxViewer() { fsqpicRxWin = new Fl_Double_Window(324, 274, _("FSQ Rx Image")); fsqpicRxWin->xclass(PACKAGE_NAME); fsqpicRxWin->begin(); fsqpicRx = new picture(2, 2, 320, 240); fsqpicRx->noslant(); Fl_Group *buttons = new Fl_Group(0, fsqpicRxWin->h() - 26, fsqpicRxWin->w(), 26, ""); buttons->box(FL_FLAT_BOX); btnfsqRxReset = new Fl_Button(2, fsqpicRxWin->h() - 26, 40, 24, "Reset"); btnfsqRxReset->callback(cb_btnfsqRxReset, 0); cnt_phase = new Fl_Counter(46, fsqpicRxWin->h() - 24, 80, 20, ""); cnt_phase->step(1); cnt_phase->lstep(10); cnt_phase->minimum(-RAWSTART + 1); cnt_phase->maximum(RAWSTART - 1); cnt_phase->value(0); cnt_phase->callback(cb_cnt_phase, 0); cnt_phase->tooltip(_("Phase correction")); cnt_slant = new Fl_Counter(140, fsqpicRxWin->h() - 24, 80, 20, ""); cnt_slant->step(1); cnt_slant->lstep(10); cnt_slant->minimum(-200); cnt_slant->maximum(200); cnt_slant->value(0); cnt_slant->callback(cb_cnt_slant, 0); cnt_slant->tooltip(_("Slant correction")); btnfsqRxSave = new Fl_Button(226, fsqpicRxWin->h() - 26, 45, 24, _("Save")); btnfsqRxSave->callback(cb_btnfsqRxSave, 0); btnfsqRxClose = new Fl_Button(273, fsqpicRxWin->h() - 26, 45, 24, _("Close")); btnfsqRxClose->callback(cb_btnfsqRxClose, 0); buttons->end(); fsqpicRxWin->end(); fsqpicRxWin->resizable(fsqpicRx); numpixels = 0; } void fsq_showRxViewer(int W, int H, char itype) { if (!fsqpicRxWin) fsq_createRxViewer(); int winW, winH; int fsqpicX, fsqpicY; winW = W < 320 ? 324 : W + 4; winH = H < 240 ? 274 : H + 34; fsqpicX = (winW - W) / 2; fsqpicY = (winH - 30 - H) / 2; fsqpicRxWin->size(winW, winH); fsqpicRx->resize(fsqpicX, fsqpicY, W, H); fsqpicRxWin->init_sizes(); fsqpicRx->clear(); fsqpicRxWin->show(); fsq_disableshift(); memset(rawvideo, 0, RAWSIZE); numpixels = 0; pixelptr = 0; rawrow = rawrgb = rawcol = 0; image_type = itype; } void fsq_clear_rximage() { fsqpicRx->clear(); fsq_disableshift(); translate = 0; enabled = false; numpixels = 0; pixelptr = 0; cnt_phase->value(0); cnt_slant->value(0); rawrow = rawrgb = rawcol = 0; } //------------------------------------------------------------------------------ // image transmit functions //------------------------------------------------------------------------------ int fsq_load_image(const char *n, int W, int H) { int D = 0; unsigned char *img_data; switch (selfsqpicSize->value()) { case 0 : W = 160; H = 120; break; case 1 : W = 320; H = 240; break; case 2 : W = 640; H = 480; break; case 3 : W = 640; H = 480; break; case 4 : W = 240; H = 300; break; case 5 : W = 240; H = 300; break; case 6 : W = 120; H = 150; break; case 7 : W = 120; H = 150; break; } if (fsqTxImg) { fsqTxImg->release(); fsqTxImg = 0; } fsqTxImg = Fl_Shared_Image::get(n, W, H); if (!fsqTxImg) return 0; if (fsqTxImg->count() > 1) { fsqTxImg->release(); fsqTxImg = 0; return 0; } fsqpicTx->hide(); fsqpicTx->clear(); img_data = (unsigned char *)fsqTxImg->data()[0]; D = fsqTxImg->d(); if (fsqxmtimg) delete [] fsqxmtimg; fsqxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(fsqxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; fsqxmtimg[j] = img_data[k]; fsqxmtimg[j+1] = img_data[k+1]; fsqxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; fsqxmtimg[j] = fsqxmtimg[j+1] = fsqxmtimg[j+2] = img_data[i]; } } else return 0; // fsq_showTxViewer(W, H); char* label = strdup(n); fsqpicTxWin->copy_label(basename(label)); free(label); // load the fsqpicture widget with the rgb image fsqpicTx->show(); fsqpicTxWin->redraw(); fsqpicTx->video(fsqxmtimg, W * H * 3); btnfsqpicTransmit->activate(); return 1; } void fsq_updateTxPic(unsigned char data, int pos) { if (!fsqpicTxWin->shown()) fsqpicTx->show(); fsqpicTx->pixel(data, pos); } void cb_fsqpicTxLoad(Fl_Widget *, void *) { const char *fn = FSEL::select(_("Load image file"), "Image\t*.{png,,gif,jpg,jpeg}\n", PicsDir.c_str()); if (!fn) return; if (!*fn) return; fsq_load_image(fn); } void fsq_clear_tximage() { fsqpicTx->clear(); } void cb_fsqpicTxClose( Fl_Widget *w, void *) { fsqpicTxWin->hide(); } int fsqpic_TxGetPixel(int pos, int color) { return fsqxmtimg[3*pos + color]; // color = {RED, GREEN, BLUE} } void cb_fsqpicTransmit( Fl_Widget *w, void *) { std::string image_txt; image_txt.assign(fsq_selected_call.c_str()); switch (selfsqpicSize->value()) { case 0: image_txt.append("% S"); break; case 1: image_txt.append("% L"); break; case 2: image_txt.append("% F"); break; case 3: image_txt.append("% V"); break; case 4: image_txt.append("% P"); break; case 5: image_txt.append("% p"); break; case 6: image_txt.append("% M"); break; case 7: image_txt.append("% m"); break; } active_modem->fsq_send_image(image_txt); } void cb_fsqpicTxSendAbort( Fl_Widget *w, void *) { } void cb_selfsqpicSize( Fl_Widget *w, void *) { switch (selfsqpicSize->value()) { case 0 : fsq_showTxViewer('S'); break; case 1 : fsq_showTxViewer('L'); break; case 2 : fsq_showTxViewer('F'); break; case 3 : fsq_showTxViewer('V'); break; case 4 : fsq_showTxViewer('P'); break; case 5 : fsq_showTxViewer('p'); break; case 6 : fsq_showTxViewer('M'); break; case 7 : fsq_showTxViewer('m'); break; } } void fsq_createTxViewer() { fsqpicTxWin = new Fl_Double_Window(324, 270, _("Send image")); fsqpicTxWin->xclass(PACKAGE_NAME); fsqpicTxWin->begin(); fsqpicTx = new picture (2, 2, 320, 240); fsqpicTx->noslant(); fsqpicTx->hide(); selfsqpicSize = new Fl_Choice(5, 244, 110, 24); selfsqpicSize->add("160x120 clr"); // case 0 selfsqpicSize->add("320x240 clr"); // case 1 selfsqpicSize->add("640x480 gry"); // case 2 selfsqpicSize->add("640x480 clr"); // case 3 selfsqpicSize->add("240x300 clr"); // case 4 selfsqpicSize->add("240x300 gry"); // case 5 selfsqpicSize->add("120x150 clr"); // case 6 selfsqpicSize->add("120x150 gry"); // case 7 selfsqpicSize->value(1); selfsqpicSize->callback(cb_selfsqpicSize, 0); btnfsqpicTxLoad = new Fl_Button(120, 244, 60, 24, _("Load")); btnfsqpicTxLoad->callback(cb_fsqpicTxLoad, 0); btnfsqpicTransmit = new Fl_Button(fsqpicTxWin->w() - 130, 244, 60, 24, "Xmt"); btnfsqpicTransmit->callback(cb_fsqpicTransmit, 0); btnfsqpicTxSendAbort = new Fl_Button(fsqpicTxWin->w() - 130, 244, 60, 24, "Abort Xmt"); btnfsqpicTxSendAbort->callback(cb_fsqpicTxSendAbort, 0); btnfsqpicTxClose = new Fl_Button(fsqpicTxWin->w() - 65, 244, 60, 24, _("Close")); btnfsqpicTxClose->callback(cb_fsqpicTxClose, 0); btnfsqpicTxSendAbort->hide(); btnfsqpicTransmit->deactivate(); fsqpicTxWin->end(); } void fsq_showTxViewer(char c) { if (!fsqpicTxWin) fsq_createTxViewer(); int winW = 644, winH = 512, W = 480, H = 320; int fsqpicX, fsqpicY; fsqpicTx->clear(); switch (c) { case 'S' : case 's' : W = 160; H = 120; winW = 324; winH = 154; selfsqpicSize->value(0); break; case 'L' : case 'l' : W = 320; H = 240; winW = 324; winH = 274; selfsqpicSize->value(1); break; case 'F' : W = 640; H = 480; winW = 644; winH = 514; selfsqpicSize->value(2); break; case 'V' : W = 640; H = 480; winW = 644; winH = 514; selfsqpicSize->value(3); break; case 'P' : W = 240; H = 300; winW = 324; winH = 334; selfsqpicSize->value(4); break; case 'p' : W = 240; H = 300; winW = 324; winH = 334; selfsqpicSize->value(5); break; case 'M' : W = 120; H = 150; winW = 324; winH = 184; selfsqpicSize->value(6); break; case 'm' : W = 120; H = 150; winW = 324; winH = 184; selfsqpicSize->value(7); } fsqpicTxWin->size(winW, winH); fsqpicX = (winW - W) / 2; fsqpicY = (winH - 26 - H) / 2; fsqpicTx->resize(fsqpicX, fsqpicY, W, H); selfsqpicSize->resize(5, winH - 26, 110, 24); btnfsqpicTxLoad->resize(120, winH - 26, 60, 24); btnfsqpicTransmit->resize(winW - 130, winH - 26, 60, 24); btnfsqpicTxSendAbort->resize(winW - 130, winH - 26, 60, 24); btnfsqpicTxClose->resize(winW -65, winH - 26, 60, 24); selfsqpicSize->show(); btnfsqpicTransmit->show(); btnfsqpicTxLoad->show(); btnfsqpicTxClose->show(); btnfsqpicTxSendAbort->hide(); fsqpicTxWin->show(); } void fsq_deleteTxViewer() { fsqpicTxWin->hide(); if (fsqpicTx) delete fsqpicTx; delete [] fsqxmtimg; fsqxmtimg = 0; delete [] fsqxmtpicbuff; fsqxmtpicbuff = 0; delete fsqpicTxWin; fsqpicTxWin = 0; } void fsq_deleteRxViewer() { fsqpicRxWin->hide(); if (fsqpicRx) { delete fsqpicRx; fsqpicRx = 0; } delete fsqpicRxWin; fsqpicRxWin = 0; } int fsq_print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix) { int time_min = (int)(time_sec / 60); time_sec -= time_min * 60; if (time_min) return snprintf(str, len, "%s %02dm %2.1fs%s", prefix, time_min, time_sec, suffix); else return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); } fldigi-4.2.05/src/fsq/fsq_varicode.cxx0000664000175000017500000002220214532252172014535 00000000000000int fsq_varicode[][2] = { { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {27,31}, { 0, 0}, {28, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {11,30}, {12,30}, {13,30}, {14,30}, {15,30}, {16,30}, {17,30}, {18,30}, {19,30}, {20,30}, {21,30}, {27,29}, {22,30}, {27, 0}, {23,30}, {10,30}, { 1,30}, { 2,30}, { 3,30}, { 4,30}, { 5,30}, { 6,30}, { 7,30}, { 8,30}, { 9,30}, {24,30}, {25,30}, {26,30}, { 0,31}, {27,30}, {28,29}, { 0,29}, { 1,29}, { 2,29}, { 3,29}, { 4,29}, { 5,29}, { 6,29}, { 7,29},// ' ' - 7 { 8,29}, { 9,29}, {10,29}, {11,29}, {12,29}, {13,29}, {14,29}, {15,29},// 8, 9, 0 {16,29}, {17,29}, {18,29}, {19,29}, {20,29}, {21,29}, {22,29}, {23,29}, // ... : {24,29}, {25,29}, {26,29}, { 1,31}, { 2,31}, { 3,31}, { 4,31}, { 5,31}, { 9,31}, { 1, 0}, { 2, 0}, { 3, 0}, { 4, 0}, { 5, 0}, { 6, 0}, { 7, 0},// @ - g { 8, 0}, { 9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0},// h - o {16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0},// p - w {24, 0}, {25, 0}, {26, 0}, { 6,31}, { 7,31}, { 8,31}, { 0,30}, {28,31},// x - 127 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//135 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//143 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//151 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//159 { 0, 0}, { 0, 0}, { 0, 0}, {14,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//167 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//175 {12,31}, {10,31}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//183 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//191 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//199 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//207 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {13,31},//215 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//223 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//231 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0},//239 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, {11,31},//247 { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0} //255 }; /* * The same in a format more suitable for decoding. * The index is the varicode symbol, being 1-2 nibbles. The value is the * ASCII character. * NB. Do NOT use CR as a line feed, as you will get an extra space and the * new line will be indented. Use LF = ascii 10 instead. */ // decode [ prev * 32 + curr] ; 0 < prev < 29; curr == 29, 30, 31 int wsq_varidecode[] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122, 46, 10, 64,126, 61, // 0 - 31 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65, 49, 91, // 32 - 63 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 50, 92, // 2 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67, 51, 93, // 3 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, 52, 94, // 4 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, 53, 95, // 5 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 54,123, // 6 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 71, 55,124, // 7 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 72, 56,125, // 8 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 73, 57, 96, // 9 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, 48,177, // 10 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, 33,247, // 11 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, 34,176, // 12 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 77, 35,215, // 13 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 78, 36,163, // 14 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 79, 37, -1, // 15 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, 38, -1, // 16 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, 39, -1, // 17 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, 40, -1, // 18 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 83, 41, -1, // 19 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, 42, -1, // 20 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, 43, -1, // 21 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, 45, -1, // 22 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 87, 47, -1, // 23 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, 58, -1, // 24 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 89, 59, -1, // 25 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 90, 60, -1, // 26 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 62, 8, // 27 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 63, 0,127, // 28 }; const char *fsq_ascii[256] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", "<160>", "<161>", "<162>", "£", "<164>", "<165>", "<166>", "<167>", "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", "°", "±", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "×", "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "÷", "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" }; fldigi-4.2.05/src/fsq/bitmaps.cxx0000664000175000017500000000566714611711171013544 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of flrig. // // flrig is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // flrig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include static unsigned char s2n_data[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x60, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0xc0, 0x12, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xa0, 0x12, 0x00, 0x00, 0x46, 0x12, 0x00, 0x00, 0x4c, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x90, 0x12, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0xf0, 0x12, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x40, 0x12, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x10, 0x12, 0x00, 0x00, 0x80, 0x12, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0xf0, 0x0c, 0x00, 0x00, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; Fl_Bitmap image_s2n(s2n_data, 160, 16); fldigi-4.2.05/src/rigcontrol/0000775000175000017500000000000014611714005013013 500000000000000fldigi-4.2.05/src/rigcontrol/norig.cxx0000664000175000017500000000502214611711171014575 00000000000000// ---------------------------------------------------------------------------- // norig.cxx // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #ifdef RIGCATTEST #include "rigCAT.h" #else #include "fl_digi.h" #include "misc.h" #include "configuration.h" #endif #include "rigsupport.h" #include "rigxml.h" #include "trx.h" #include "serial.h" #include "rigio.h" #include "debug.h" #include "threads.h" #include "qrunner.h" #include "confdialog.h" #include "status.h" //---------------------------------------------------------------------- // functions used when no xcvr control is in use //---------------------------------------------------------------------- unsigned long long noCAT_getfreq() { return progStatus.noCATfreq; } void noCAT_setfreq(unsigned long long f) { progStatus.noCATfreq = f; wf->rfcarrier(f); } std::string noCAT_getmode() { return progStatus.noCATmode; } void noCAT_setmode(const std::string &md) { progStatus.noCATmode = md; if (ModeIsLSB(md)) wf->USB(false); else wf->USB(true); } std::string noCAT_getwidth() { return progStatus.noCATwidth; } void noCAT_setwidth(const std::string &w) { progStatus.noCATwidth = w; show_bw(w); } void noCAT_setPTT(bool val) { rigio.SetPTT(val); // always execute the h/w ptt if enabled } void noCAT_init() { qso_setFreq(progStatus.noCATfreq); wf->rfcarrier(progStatus.noCATfreq); init_NoRig_RigDialog(); qso_opMODE->value(progStatus.noCATmode.c_str()); chkUSEHAMLIB->value(0); chkUSEHAMLIB->redraw(); btnInitHAMLIB->labelcolor(FL_BLACK); btnInitHAMLIB->redraw_label(); chkUSERIGCAT->value(0); chkUSERIGCAT->redraw(); btnInitRIGCAT->labelcolor(FL_BLACK); btnInitRIGCAT->redraw_label(); return; } fldigi-4.2.05/src/rigcontrol/xmlrpc_rig.cxx0000664000175000017500000007150114611711171015632 00000000000000// ===================================================================== // // xmlrpc_rig.cxx // // connect to flrig xmlrpc server // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "squelch_status.h" #include "icons.h" LOG_FILE_SOURCE(debug::debug::LOG_RPC_CLIENT); using namespace XmlRpc; static int xmlrpc_verbosity = 0; //====================================================================== // flrig xmlrpc client //====================================================================== pthread_t *flrig_thread = 0; pthread_mutex_t mutex_flrig = PTHREAD_MUTEX_INITIALIZER; void movFreq(Fl_Widget *w, void *d); void show_freq(void *); void flrig_get_vfo(); void flrig_get_frequency(); void post_mode(void *); void flrig_get_mode(); void post_modes(void *); void flrig_get_modes(); void post_bw(void *); void flrig_get_bw(); void post_bws(void *); void flrig_get_bws(); void flrig_get_notch(); void flrig_set_notch(int); bool flrig_get_xcvr(); void flrig_connection(); void set_ptt(); void connect_to_flrig(); XmlRpcClient *flrig_client = (XmlRpcClient *)0; //---------------------------------------------------------------------- // declared as extern in rigsupport.h //---------------------------------------------------------------------- bool connected_to_flrig = false; //---------------------------------------------------------------------- static bool bws_posted = false; static bool modes_posted = false; static bool freq_posted = true; static std::string xcvr_name; static std::string str_freq; static std::string mode_result; static XmlRpcValue modes_result; static XmlRpcValue bws_result; static XmlRpcValue bw_result; static XmlRpcValue notch_result; static double timeout = 5.0; static int wait_bws_timeout = 0; static unsigned long long fr_show = 0; //====================================================================== void xmlrpc_rig_set_qsy(unsigned long long rfc) { set_flrig_freq(rfc); wf->rfcarrier(rfc); wf->movetocenter(); show_frequency(rfc); #ifdef __WIN32__ // this subterfuge is necessary due to a bug in mingw gcc macro parser char dummy[50]; snprintf(dummy, sizeof(dummy), "set qsy: %llu", rfc); LOG_VERBOSE("%s", dummy); #else LOG_VERBOSE("set qsy: %llu", rfc); #endif } //====================================================================== // set / get pairs //====================================================================== //---------------------------------------------------------------------- // push to talk //---------------------------------------------------------------------- static int ptt_state = 0; static int new_ptt = -1; void exec_flrig_ptt() { if (!connected_to_flrig) { new_ptt = -1; return; } XmlRpcValue val, result, result2; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.set_ptt", new_ptt, result, timeout); } if (ret) { LOG_VERBOSE("ptt %s", ptt_state ? "ON" : "OFF"); new_ptt = -1; return; } } catch (...) { new_ptt = -1; return; } LOG_ERROR("fldigi/flrig PTT %s failure", new_ptt ? "ON" : "OFF"); new_ptt = -1; return; } void set_flrig_ptt(int on) { if (!active_modem) return; if (active_modem->get_mode() == MODE_CW) { if (progdefaults.CATkeying_disable_ptt && active_modem->get_mode() == MODE_CW && ( progdefaults.use_ELCTkeying || progdefaults.use_ICOMkeying || progdefaults.use_KNWDkeying || progdefaults.use_YAESUkeying || progStatus.nanoCW_online ) ) { return; } else if (progdefaults.use_FLRIGkeying) { if (progdefaults.CATkeying_disable_ptt) return; if (on) flrig_cwio_send_text("["); else flrig_cwio_send_text("]"); } } new_ptt = on; } pthread_mutex_t mutex_flrig_ptt = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_show_ptt(void *data) { guard_lock flrig_lock(&mutex_flrig_ptt); int on = reinterpret_cast(data); if (wf && (trx_state != STATE_TUNE)) { wf->xmtrcv->value(on); wf->xmtrcv->do_callback(); } } void flrig_get_ptt() { try { XmlRpcValue result; bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_ptt", XmlRpcValue(), result, timeout); } if (ret) { int val = (int)result; ptt_state = val; LOG_VERBOSE("get_ptt: %s", ptt_state ? "ON" : "OFF"); return; } connected_to_flrig = false; LOG_ERROR("%s", "get_ptt failed!"); } catch (...) {} } void updateWPM(void *) { set_CWwpm(); } void flrig_get_wpm() { if (!connected_to_flrig) { return; } try { XmlRpcValue result; bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.cwio_get_wpm", XmlRpcValue(), result, timeout); } if (ret) { int val = (int)result; progdefaults.CWspeed = val; LOG_VERBOSE("rig.cwio_get_wpm = %d", val); Fl::awake(updateWPM); return; } connected_to_flrig = false; LOG_ERROR("%s failed!", "flrig_get_wpm"); } catch (...) { LOG_ERROR("rig.cwio_get_wpm FAILED"); } } void flrig_set_wpm() { if (!connected_to_flrig) { return; } XmlRpcValue val, result; try { bool ret; val = (int)static_cast(progdefaults.CWspeed); { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.cwio_set_wpm", val, result, timeout); } if (ret) { LOG_VERBOSE("set wpm %f", progdefaults.CWspeed); return; } } catch (...) { } LOG_ERROR("set wpm failed"); return; } //---------------------------------------------------------------------- // transceiver radio frequency //---------------------------------------------------------------------- static bool wait_freq = false; // wait for transceiver to respond static int wait_freq_timeout = 5; // 5 polls and then disable wait static unsigned long long xcvr_freq = 0; pthread_mutex_t mutex_flrig_freq = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_show_freq(void * fr) { guard_lock flrig_lock(&mutex_flrig_freq); if (!wf) return; unsigned long long freq = *(static_cast(fr)); #ifdef __WIN32__ // this subterfuge is necessary due to a bug in mingw gcc macro parser char dummy[100]; snprintf(dummy, sizeof(dummy), "xmlrpc_rig_show_freq %llu", freq); LOG_VERBOSE("%s", dummy); #else LOG_VERBOSE("xmlrpc_rig_show_freq %llu", freq); #endif wf->rfcarrier(freq); wf->movetocenter(); show_frequency(freq); modeband.band_mode_change(); } void set_flrig_freq(unsigned long long fr) { if (!connected_to_flrig) return; XmlRpcValue val, result; try { val = (double)fr; bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.set_vfo", val, result, timeout); } if (ret) { char dummy[100]; snprintf(dummy, sizeof(dummy), "set freq: %llu", fr); LOG_VERBOSE("%s", dummy); return; } LOG_ERROR("%s", "rig.set_vfo failed"); wait_freq = false; wait_freq_timeout = 0; } catch (...) { LOG_ERROR("rig.set_vfo FAILED"); } } void flrig_get_frequency() { XmlRpcValue result; try { if (!freq_posted) return; bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_vfo", XmlRpcValue(), result, timeout); } if (ret) { str_freq = (std::string)result; fr_show = strtoull(str_freq.c_str(), NULL, 10); if (!wait_freq && (fr_show != xcvr_freq)) { xcvr_freq = fr_show; guard_lock flrig_lock(&mutex_flrig_freq); Fl::awake(xmlrpc_rig_show_freq, static_cast(&fr_show)); char dummy[200]; snprintf(dummy, sizeof(dummy), "get freq: %llu", fr_show); LOG_VERBOSE("%s", dummy); } else if (wait_freq && (fr_show == xcvr_freq)) { wait_freq = false; wait_freq_timeout = 0; } else if (wait_freq_timeout == 0) { wait_freq = false; } else if (wait_freq_timeout) --wait_freq_timeout; } else { connected_to_flrig = false; wait_freq = false; wait_freq_timeout = 5; LOG_ERROR("%s", "get freq failed"); } } catch (...) {} } //---------------------------------------------------------------------- // transceiver set / get mode // transceiver get modes (mode table) //---------------------------------------------------------------------- static bool wait_mode = false; // wait for transceiver to respond static int wait_mode_timeout = 5; // 5 polls and then disable wait static std::string posted_mode = ""; static bool wait_bw = false; // wait for transceiver to respond static int wait_bw_timeout = 5; // 5 polls and then disable wait static bool need_sideband = false; static std::string posted_bw = ""; static std::string posted_bw1 = ""; static std::string posted_bw2 = ""; void set_flrig_mode(const char *md) { if (!connected_to_flrig) return; XmlRpcValue val, result; try { val = std::string(md); bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.set_mode", val, result, timeout); } if (ret) { posted_mode = md; need_sideband = true; bws_posted = false; wait_mode = true; wait_mode_timeout = 10; wait_bws_timeout = 5; qso_opBW->hide(); qso_opGROUP->hide(); LOG_VERBOSE("set mode: %s", md); } else { LOG_ERROR("%s", "rig.set_mode failed"); wait_mode = false; wait_mode_timeout = 10; } } catch (...) {} } pthread_mutex_t mutex_flrig_mode = PTHREAD_MUTEX_INITIALIZER; static bool xml_USB = true; bool xmlrpc_USB() { return xml_USB; } void xmlrpc_rig_post_mode(void *data) { guard_lock flrig_lock(&mutex_flrig_mode); if (!qso_opMODE) return; std::string *s = reinterpret_cast(data); qso_opMODE->value(s->c_str()); bws_posted = false; need_sideband = false; } void flrig_get_mode() { XmlRpcValue res; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_mode", XmlRpcValue(), res, timeout); } if (ret) { static std::string md; md = (std::string)res; bool posted = (md == posted_mode); if (!wait_mode && (!posted || need_sideband)) { posted_mode = md; guard_lock flrig_modelock(&mutex_flrig_mode); { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_sideband", XmlRpcValue(), res, timeout); } if (ret) { static std::string sb; sb = (std::string)res; xml_USB = (sb[0] == 'U'); } else { xml_USB = true; } if (posted) { need_sideband = false; return; } Fl::awake(xmlrpc_rig_post_mode, reinterpret_cast(&md)); LOG_VERBOSE("get mode: %s:%s", md.c_str(), xml_USB ? "USB" : "LSB"); } else if (wait_mode && posted) { wait_mode = false; wait_mode_timeout = 0; } else if (wait_mode_timeout == 0) { wait_mode = false; } else if (wait_mode_timeout) --wait_mode_timeout; } else { connected_to_flrig = false; wait_mode = false; wait_freq_timeout = 0; LOG_ERROR("%s", "get mode failed"); } } catch (...) {} } pthread_mutex_t mutex_flrig_modes = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_post_modes(void *) { guard_lock flrig_lock(&mutex_flrig_modes); if (!qso_opMODE) return; int nargs = modes_result.size(); qso_opMODE->clear(); if (nargs == 0) { qso_opMODE->add(""); qso_opMODE->index(0); qso_opMODE->deactivate(); return; } std::string smodes; for (int i = 0; i < nargs; i++) smodes.append((std::string)modes_result[i]).append("|"); qso_opMODE->add(smodes.c_str()); qso_opMODE->index(0); qso_opMODE->activate(); modes_posted = true; bws_posted = false; } void flrig_get_modes() { try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_modes", XmlRpcValue(), modes_result, timeout); } if (ret) { guard_lock flrig_lock(&mutex_flrig_modes); Fl::awake(xmlrpc_rig_post_modes); posted_mode = posted_bw = posted_bw1 = posted_bw2 = "GETME"; { int nargs = modes_result.size(); static std::string debugstr; debugstr.assign("Mode table: "); for (int i = 0; i < nargs - 1; i++) debugstr.append((std::string)modes_result[i]).append(","); debugstr.append(modes_result[nargs-1]); LOG_VERBOSE("%s", debugstr.c_str()); } } else { LOG_ERROR("%s", "get modes failed"); } } catch (...) {} } //---------------------------------------------------------------------- // transceiver get / set bandwidth // transceiver get bandwidth table //---------------------------------------------------------------------- void set_flrig_bw(int bw2, int bw1) { if (!connected_to_flrig) return; XmlRpcValue val, result; try { int ival = bw2; if (bw1 > -1) ival = 256*(bw1+128) + bw2; val = ival; LOG_VERBOSE("set_flrig_bw %04X", ival); bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.set_bw", val, result, timeout); } if (ret) { wait_bw = true; wait_bw_timeout = 5; } else { LOG_ERROR("%s", "rig.set_bw failed"); wait_bw = false; wait_bw_timeout = 0; } } catch (...) {} } pthread_mutex_t mutex_flrig_bw = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_post_bw(void *) { guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW) return; if (posted_bw != (std::string)(qso_opBW->value())) { qso_opBW->value(posted_bw);//.c_str()); qso_opBW->redraw(); LOG_VERBOSE("Update BW %s", posted_bw.c_str()); } qso_opBW->show(); } void xmlrpc_rig_post_bw1(void *) { guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW1) return; if (posted_bw1 != (std::string)(qso_opBW1->value())) { qso_opBW1->value(posted_bw1);//.c_str()); qso_opBW1->redraw(); LOG_VERBOSE("Update combo BW1 %s", posted_bw1.c_str()); } qso_opGROUP->show(); } void xmlrpc_rig_post_bw2(void *) { guard_lock flrig_lock(&mutex_flrig_bw); if (!qso_opBW2) return; if (posted_bw2 != (std::string)(qso_opBW2->value())) { qso_opBW2->value(posted_bw2);//.c_str()); qso_opBW2->redraw(); LOG_VERBOSE("Update combo BW2 %s", posted_bw2.c_str()); } qso_opGROUP->show(); } void do_flrig_get_bw() { XmlRpcValue res; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_bw", XmlRpcValue(), res, timeout); } if (ret) { static std::string s1; static std::string s2; s2 = (std::string)res[0]; s1 = (std::string)res[1]; if (!s1.empty()) { posted_bw1 = s1; Fl::awake(xmlrpc_rig_post_bw1); posted_bw2 = s2; Fl::awake(xmlrpc_rig_post_bw2); } else { if (!s2.empty()) { posted_bw = s2; Fl::awake(xmlrpc_rig_post_bw); } } wait_bw_timeout = 0; } else { connected_to_flrig = false; wait_bw_timeout = 0; LOG_ERROR("%s", "get bw failed!"); } } catch (...) { } } void flrig_get_bw() { if (wait_bw_timeout) { wait_bw_timeout--; return; } do_flrig_get_bw(); } pthread_mutex_t mutex_flrig_bws = PTHREAD_MUTEX_INITIALIZER; void xmlrpc_rig_post_bws(void *) { if (!qso_opBW || !qso_opBW1 || !qso_opBW2) return; int nargs; try { // two BW controls nargs = bws_result[1].size(); static std::string bwstr; qso_opBW1->clear(); for (int i = 1; i < nargs; i++) { bwstr = (std::string)bws_result[1][i]; qso_opBW1->add(bwstr.c_str()); } std::string labels1 = (std::string)bws_result[1][0]; static char btn1_label[2]; btn1_label[0] = labels1[0]; btn1_label[1] = 0; qso_btnBW1->label(btn1_label); qso_btnBW1->redraw_label(); qso_btnBW1->redraw(); static char tooltip1[20]; snprintf(tooltip1,sizeof(tooltip1),"%s",labels1.substr(2).c_str()); qso_opBW1->tooltip(tooltip1); qso_opBW1->index(0); qso_opBW1->redraw(); { static std::string debugstr; debugstr.assign("\nBW1 table: "); for (int i = 1; i < nargs-1; i++) debugstr.append((std::string)bws_result[1][i]).append(", "); debugstr.append((std::string)bws_result[1][nargs - 1]).append("\n"); debugstr.append(labels1); LOG_VERBOSE("%s", debugstr.c_str()); } try { nargs = bws_result[0].size(); static std::string bwstr; qso_opBW2->clear(); for (int i = 1; i < nargs; i++) { bwstr = (std::string)bws_result[0][i]; qso_opBW2->add(bwstr.c_str()); } std::string labels2 = (std::string)bws_result[0][0]; static char btn2_label[2]; btn2_label[0] = labels2[0]; btn2_label[1] = 0; qso_btnBW2->label(btn2_label); qso_btnBW2->redraw_label(); qso_btnBW2->redraw(); static char tooltip2[20]; snprintf(tooltip2,sizeof(tooltip2),"%s",labels2.substr(2).c_str()); qso_opBW2->tooltip(tooltip2); qso_opBW2->index(0); qso_opBW2->redraw(); { static std::string debugstr; debugstr.assign("\nBW2 table: "); for (int i = 1; i < nargs-1; i++) debugstr.append((std::string)bws_result[0][i]).append(", "); debugstr.append((std::string)bws_result[0][nargs - 1]).append("\n"); debugstr.append(labels2); LOG_VERBOSE("%s", debugstr.c_str()); } } catch ( XmlRpcException err) { bws_posted = false; return; } qso_opBW->hide(); bws_posted = true; return; } catch (XmlRpcException err) { try { // one BW control nargs = bws_result[0].size(); std::string bwstr; qso_opBW->clear(); for (int i = 1; i < nargs; i++) { bwstr.append((std::string)bws_result[0][i]).append("|"); } qso_opBW->add(bwstr.c_str()); qso_opBW->index(0); qso_opBW->activate(); qso_opBW->tooltip("xcvr bandwidth"); qso_opGROUP->hide(); { static std::string debugstr; debugstr.assign("BW table: "); for (int i = 1; i < nargs-1; i++) debugstr.append((std::string)bws_result[0][i]).append(", "); debugstr.append((std::string)bws_result[0][nargs - 1]); LOG_VERBOSE("%s", debugstr.c_str()); } } catch (XmlRpcException err) { LOG_ERROR("%s", "no bandwidths specified"); qso_opBW->add(""); qso_opBW->index(0); qso_opBW->deactivate(); return; } } bws_posted = true; do_flrig_get_bw(); } void flrig_get_bws() { if (bws_posted) return; if (wait_bws_timeout) { wait_bws_timeout--; return; } XmlRpcValue result; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_bws", XmlRpcValue(), bws_result, timeout); } if (ret) { bws_posted = false; wait_bw = true; wait_bw_timeout = 5; posted_bw.clear(); Fl::awake(xmlrpc_rig_post_bws); } else { LOG_ERROR("%s", "get bws failed"); } } catch (...) {} } //---------------------------------------------------------------------- // transceiver get / set vfo A / B //---------------------------------------------------------------------- void set_flrig_ab(int n) { } void show_A(void *) { } void show_B(void *) { } void flrig_get_vfo() { XmlRpcValue result; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_AB", XmlRpcValue(), result, timeout); } if (ret) { } else { connected_to_flrig = false; } } catch (...) {} } //============================================================================== // transceiver set / get notch //============================================================================== static int wait_notch_timeout = 0; // # polls and then disable wait void set_flrig_notch() { if (!connected_to_flrig) return; XmlRpcValue val, result; try { val = (int)notch_frequency; bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.set_notch", val, result, timeout); } if (ret) { wait_notch_timeout = 2; } else { LOG_ERROR("%s", "rig.set_notch failed"); wait_notch_timeout = 0; } } catch (...) {} } void flrig_get_notch() { if (wait_notch_timeout == 0) try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_notch", XmlRpcValue(), notch_result, timeout); } if (ret) { notch_frequency = (int)notch_result; LOG_VERBOSE("rig_get_notch: %d", notch_frequency); } } catch (...) { LOG_ERROR("rig.get_notch FAILED"); } else wait_notch_timeout--; } //============================================================================== // transceiver get smeter // transceiver get power meter //============================================================================== pthread_mutex_t mutex_flrig_smeter = PTHREAD_MUTEX_INITIALIZER; static void xmlrpc_rig_set_smeter(void *data) { guard_lock flrig_lock(&mutex_flrig_smeter); if (smeter && progStatus.meters) { if (!smeter->visible()) { if (pwrmeter) pwrmeter->hide(); smeter->show(); } int val = reinterpret_cast(data); LOG_VERBOSE("xmlrpc_rig_set_smeter: %d", val); smeter->value(val); } } void flrig_get_smeter() { XmlRpcValue result; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_smeter", XmlRpcValue(), result, timeout); } if (ret) { std::string smeter = (std::string)result; int sm = atoll(smeter.c_str()); guard_lock lck(&mutex_flrig_smeter); Fl::awake(xmlrpc_rig_set_smeter, reinterpret_cast(sm)); LOG_VERBOSE("rig.get_smeter: %d", sm); } } catch (...) { LOG_ERROR("rig.get_smeter FAILED"); } } pthread_mutex_t mutex_flrig_pwrmeter = PTHREAD_MUTEX_INITIALIZER; static void xmlrpc_rig_set_pwrmeter(void *data) { guard_lock flrig_lock(&mutex_flrig_pwrmeter); if (pwrmeter) { int val = reinterpret_cast(data); pwrmeter->value(val); if (pwrlevel_grp->visible()) return; if (progStatus.meters) { if (!pwrmeter->visible()) { if (smeter) smeter->hide(); pwrmeter->show(); } pwrmeter->redraw(); } } } void flrig_get_pwrmeter() { XmlRpcValue val, result; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_pwrmeter", val, result, timeout); } if (ret) { std::string meter = (std::string)result; int sm = atoll(meter.c_str()); guard_lock lck(&mutex_flrig_pwrmeter); Fl::awake(xmlrpc_rig_set_pwrmeter, reinterpret_cast(sm)); } } catch (...) { LOG_ERROR("rig.get_pwrmeter FAILED"); } } //============================================================================== // transceiver get name //============================================================================== static void xmlrpc_rig_show_xcvr_name(void *) { xcvr_title = xcvr_name; setTitle(); } static void no_rig_init(void *) { init_NoRig_RigDialog(); } bool flrig_get_xcvr() { XmlRpcValue result; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("rig.get_xcvr", XmlRpcValue(), result, timeout); } if (ret) { std::string nuxcvr = (std::string)result; if (nuxcvr != xcvr_name) { xcvr_name = nuxcvr; modes_posted = false; bws_posted = false; flrig_get_modes(); flrig_get_bws(); flrig_get_mode(); flrig_get_bw(); Fl::awake(xmlrpc_rig_show_xcvr_name); LOG_VERBOSE("flrig_get_xcvr %s", nuxcvr.c_str()); } return true; } else { if (xcvr_name != "") { xcvr_name = ""; Fl::awake(xmlrpc_rig_show_xcvr_name); Fl::awake(no_rig_init); } connected_to_flrig = false; } } catch (XmlRpcException *err) { if (xcvr_name != "") { xcvr_name = ""; Fl::awake(xmlrpc_rig_show_xcvr_name); Fl::awake(no_rig_init); LOG_ERROR("rig.get_xcvr FAILED"); } connected_to_flrig = false; } return false; } //====================================================================== // xmlrpc read polling thread //====================================================================== static bool run_flrig_thread = true; static int poll_interval = 1000; // 1 second //---------------------------------------------------------------------- // Set QSY to true if xmlrpc client connection is OK //---------------------------------------------------------------------- void flrig_setQSY(void *) { if (!wf) return; wf->setQSY(true); } void flrig_connection() { XmlRpcValue noArgs, result; try { bool ret; { guard_lock flrig_lock(&mutex_flrig); ret = flrig_client->execute("system.listMethods", noArgs, result, timeout); } if (ret) { int nargs = result.size(); std::string method_str = "\nMethods:\n"; for (int i = 0; i < nargs; i++) method_str.append(" ").append(result[i]).append("\n"); LOG_VERBOSE("%s", method_str.c_str()); connected_to_flrig = true; poll_interval = progdefaults.flrig_poll; flrig_get_xcvr(); Fl::awake(flrig_setQSY); } else { LOG_VERBOSE("%s", "Waiting for flrig"); connected_to_flrig = false; poll_interval = 2000; // every 2 seconds } } catch (...) { LOG_ERROR("%s", "failure in flrig_client"); } } void connect_to_flrig() { XmlRpc::setVerbosity(xmlrpc_verbosity); if (flrig_client) { delete flrig_client; flrig_client = (XmlRpcClient *)0; } try { flrig_client = new XmlRpcClient( progdefaults.flrig_ip_address.c_str(), atol(progdefaults.flrig_ip_port.c_str())); LOG_VERBOSE("created flrig xmlrpc client %s, %ld", progdefaults.flrig_ip_address.c_str(), atol(progdefaults.flrig_ip_port.c_str())); flrig_connection(); } catch (...) { LOG_ERROR("Cannot create flrig xmlrpc client %s, %s", progdefaults.flrig_ip_address.c_str(), progdefaults.flrig_ip_port.c_str()); } } void * flrig_thread_loop(void *d) { int poll = poll_interval; while (run_flrig_thread) { MilliSleep(10); if (connected_to_flrig) { if (new_ptt > -1) { exec_flrig_ptt(); continue; } } if (connected_to_flrig && poll_interval != progdefaults.flrig_poll) poll_interval = progdefaults.flrig_poll; if ((poll -= 10) <= 0) { poll = poll_interval; if (progdefaults.fldigi_client_to_flrig) { if (!flrig_client) connect_to_flrig(); else { if (!connected_to_flrig) flrig_connection(); else { if (progdefaults.flrig_keys_modem) flrig_get_ptt(); if (trx_state == STATE_RX) { flrig_get_frequency(); flrig_get_smeter(); flrig_get_notch(); flrig_get_wpm(); if (modes_posted) flrig_get_mode(); else flrig_get_modes(); if (bws_posted) flrig_get_bw(); else flrig_get_bws(); } else { flrig_get_pwrmeter(); flrig_get_wpm(); } } } } } } return NULL; } void FLRIG_start_flrig_thread() { flrig_thread = new pthread_t; poll_interval = 1000; // every second if (pthread_create(flrig_thread, NULL, flrig_thread_loop, NULL)) { LOG_ERROR("%s", "flrig_thread create"); exit(EXIT_FAILURE); } } void stop_flrig_thread() { if (!flrig_client) return; LOG_INFO("%s", "lock mutex_flrig"); pthread_mutex_lock(&mutex_flrig); run_flrig_thread = false; pthread_mutex_unlock(&mutex_flrig); LOG_INFO("%s", "wait for joined thread"); pthread_join(*flrig_thread, NULL); LOG_INFO("%s", "flrig thread closed"); LOG_INFO("%s", "flrig_client->close()"); flrig_client->close(); } void reconnect_to_flrig() { flrig_client->close(); guard_lock flrig_lock(&mutex_flrig); delete flrig_client; flrig_client = (XmlRpcClient *)0; connected_to_flrig = false; } unsigned long st, et; void xmlrpc_send_command(std::string cmd) { if (!connected_to_flrig) return; XmlRpcValue val, result; try { guard_lock flrig_lock(&mutex_flrig); val = std::string(cmd); flrig_client->execute("rig.cat_string", val, result, timeout); std::string ans = std::string(result); } catch (...) {} return; } void xmlrpc_priority(std::string cmd) { if (!connected_to_flrig) return; XmlRpcValue val, result; try { guard_lock flrig_lock(&mutex_flrig); val = std::string(cmd); flrig_client->execute("rig.cat_priority", val, result, 0.20);//timeout); } catch (...) {} return; } void xmlrpc_shutdown_flrig() { if (!connected_to_flrig) return; XmlRpcValue val, result; try { guard_lock flrig_lock(&mutex_flrig); if (!flrig_client->execute("rig.shutdown", XmlRpcValue(), result, timeout)) { LOG_ERROR("%s", "rig.shutdown failed"); } else { LOG_VERBOSE("%s", "rig.shutdown OK"); } } catch (...) {} } void flrig_cwio_send_text(std::string s) { if (!connected_to_flrig) return; XmlRpcValue val, result; try { guard_lock flrig_lock(&mutex_flrig); val = std::string(s); flrig_client->execute("rig.cwio_text", val, result, 0.20);//timeout); } catch (...) { } return; } void flrig_fskio_send_text(std::string s) { if (!connected_to_flrig) return; XmlRpcValue val, result; try { guard_lock flrig_lock(&mutex_flrig); val = std::string(s); flrig_client->execute("rig.fskio_text", val, result, 0.20); } catch (...) { } return; } fldigi-4.2.05/src/rigcontrol/rigio.cxx0000664000175000017500000015651514611711171014606 00000000000000// ---------------------------------------------------------------------------- // rigio.cxx // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #ifdef RIGCATTEST #include "rigCAT.h" #else #include "fl_digi.h" #include "misc.h" #include "configuration.h" #endif #include "rigsupport.h" #include "rigxml.h" #include "trx.h" #include "serial.h" #include "rigio.h" #include "debug.h" #include "qrunner.h" #include "confdialog.h" #include "status.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); Cserial rigio; static pthread_t rigCAT_thread; pthread_mutex_t rigCAT_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t cmdque_mutex = PTHREAD_MUTEX_INITIALIZER; static bool rigCAT_exit = false; static bool rigCAT_open = false; static std::string sRigWidth = ""; static std::string sRigMode = ""; static void *rigCAT_loop(void *args); #define RXBUFFSIZE 2000 static unsigned char replybuff[RXBUFFSIZE+1]; //static unsigned char retbuf[3]; struct CMDQUEUE { std::string cmd; std::string s; int retnbr; int waitval; CMDQUEUE(std::string _cmd, std::string _s, int _retnbr, int _waitval) { cmd = _cmd; s = _s; retnbr = _retnbr; waitval = _waitval; } CMDQUEUE() {cmd.clear(); s.clear(); retnbr = 0; waitval = 0;} ~CMDQUEUE() {}; }; std::queue cmdque; void add_to_cmdque( std::string cmd, std::string s, int retnbr, int waitval) { guard_lock quelock(&cmdque_mutex); cmdque.push(CMDQUEUE(cmd, s, retnbr, waitval)); } void cmdque_exec() { bool sendcmd = false; CMDQUEUE cmdq; { guard_lock quelock(&cmdque_mutex); if (!cmdque.empty()) { cmdq = cmdque.front(); cmdque.pop(); sendcmd = true; } } if (sendcmd) sendCommand(cmdq.cmd, cmdq.s, cmdq.retnbr, cmdq.waitval); } bool sendCommand (std::string cmd, std::string s, int retnbr, int waitval) { static char traceinfo[5000]; xmlrig.ascii = true; int numwrite = (int)s.length(); int readafter = 0; int numread = 0; int retval = 0; numread = retnbr; if (progdefaults.RigCatECHO) numread += numwrite; readafter = waitval + (int) ceilf ( numread * (9 + progdefaults.RigCatStopbits) * 1000.0 / rigio.Baud() ); snprintf(traceinfo, sizeof(traceinfo), "%s: '%s', Expect: %d after %d msec", cmd.c_str(), (xmlrig.ascii ? s.c_str() : str2hex(s.data(), s.length())), numread, readafter); if (xmlrig.debug) LOG_INFO("%s", traceinfo); if (xmlrig.noserial) { memset(replybuff, 0, RXBUFFSIZE + 1); numread = 0; return true; } retval = rigio.WriteBuffer((unsigned char *)s.c_str(), numwrite); if (retval <= 0) LOG_ERROR("Write error %d", retval); if (retnbr == 0) return true; memset(replybuff, 0, RXBUFFSIZE + 1); numread = 0; while (readafter > 50) { MilliSleep(50); Fl::awake(); readafter -= 50; } if (readafter) { MilliSleep(readafter); Fl::awake(); } numread = rigio.ReadBuffer(replybuff, retnbr); snprintf(traceinfo, sizeof(traceinfo), "Reply (%d): '%s'", numread, (xmlrig.ascii ? reinterpret_cast(replybuff) : str2hex(reinterpret_cast(replybuff), numread))); if (xmlrig.debug) LOG_INFO( "%s", traceinfo ); return (numread == retnbr); } std::string to_bcd_be(unsigned long long freq, int len) { std::string bcd = ""; unsigned char a; int numchars = len / 2; if (len & 1) numchars ++; for (int i = 0; i < numchars; i++) { a = 0; a |= freq%10; freq /= 10; a |= (freq%10)<<4; freq /= 10; bcd += a; } return bcd; } std::string to_bcd(unsigned long long freq, int len) { std::string bcd = ""; std::string bcd_be = to_bcd_be(freq, len); int bcdlen = bcd_be.size(); for (int i = bcdlen - 1; i >= 0; i--) bcd += bcd_be[i]; return bcd; } unsigned long long fm_bcd (size_t p, int len) { int i; unsigned long long f = 0; int numchars = len/2; if (len & 1) numchars ++; for (i = 0; i < numchars; i++) { f *=10; f += (replybuff[p + i] >> 4) & 0x0F; f *= 10; f += replybuff[p + i] & 0x0F; } return f; } unsigned long long fm_bcd_be(size_t p, int len) { unsigned char temp; int numchars = len/2; if (len & 1) numchars++; for (int i = 0; i < numchars / 2; i++) { temp = replybuff[p + i]; replybuff[p + i] = replybuff[p + numchars -1 - i]; replybuff[p + numchars -1 - i] = temp; } return fm_bcd(p, len); } std::string to_binary_be(unsigned long long freq, int len) { std::string bin = ""; for (int i = 0; i < len; i++) { bin += freq & 0xFF; freq >>= 8; } return bin; } std::string to_binary(unsigned long long freq, int len) { std::string bin = ""; std::string bin_be = to_binary_be(freq, len); int binlen = bin_be.size(); for (int i = binlen - 1; i >= 0; i--) bin += bin_be[i]; return bin; } unsigned long long fm_binary(size_t p, int len) { int i; unsigned long long f = 0; for (i = 0; i < len; i++) { f *= 256; f += replybuff[p + i]; } return f; } unsigned long long fm_binary_be(size_t p, int len) { unsigned char temp; int numchars = len/2; if (len & 1) numchars++; for (int i = 0; i < numchars / 2; i++) { temp = replybuff[p + i]; replybuff[p + i] = replybuff[p + numchars -1 - i]; replybuff[p + numchars -1 - i] = temp; } return fm_binary(p, len); } std::string to_decimal_be(unsigned long long d, int len) { std::string sdec_be = ""; for (int i = 0; i < len; i++) { sdec_be += (char)((d % 10) + '0'); d /= 10; } return sdec_be; } std::string to_decimal(unsigned long long d, int len) { std::string sdec = ""; std::string sdec_be = to_decimal_be(d, len); int bcdlen = sdec_be.size(); for (int i = bcdlen - 1; i >= 0; i--) sdec += sdec_be[i]; return sdec; } unsigned long long fm_decimal(size_t p, int len) { unsigned long long d = 0; for (int i = 0; i < len; i++) { d *= 10; d += replybuff[p + i] - '0'; } return d; } unsigned long long fm_decimal_be(size_t p, int len) { unsigned char temp; int numchars = len/2; if (len & 1) numchars++; for (int i = 0; i < numchars / 2; i++) { temp = replybuff[p + i]; replybuff[p + i] = replybuff[p + numchars -1 - i]; replybuff[p + numchars -1 - i] = temp; } return fm_decimal(p, len); } std::string to_freqdata(DATA d, unsigned long long f) { int num, den; num = 100; den = (int)(d.resolution * 100); if (d.size == 0) return ""; if (d.dtype == "BCD") { if (d.reverse == true) return to_bcd_be((unsigned long long)(f * num / den), d.size); else return to_bcd((unsigned long long)(f * num / den), d.size); } else if (d.dtype == "BINARY") { if (d.reverse == true) return to_binary_be((unsigned long long)(f * num / den), d.size); else return to_binary((unsigned long long)(f * num / den), d.size); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) return to_decimal_be((unsigned long long)(f * num / den), d.size); else return to_decimal((unsigned long long)(f * num / den), d.size); } return ""; } unsigned long long fm_freqdata(DATA d, size_t p) { int num, den; num = (int)(d.resolution * 100); den = 100; unsigned long long fret = 0; if (d.dtype == "BCD") { if (d.reverse == true) fret = (unsigned long long)(fm_bcd_be(p, d.size) * num / den); else fret = (unsigned long long)(fm_bcd(p, d.size) * num / den); } else if (d.dtype == "BINARY") { if (d.reverse == true) fret = (unsigned long long)(fm_binary_be(p, d.size) * num / den); else fret = (unsigned long long)(fm_binary(p, d.size) * num / den); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) fret = (unsigned long long)(fm_decimal_be(p, d.size) * num / den); else fret = (unsigned long long)(fm_decimal(p, d.size) * num / den); } return fret; } unsigned long long rigCAT_getfreq(int retries, bool &failed, int waitval) { const char symbol[] = "GETFREQ"; LOG_VERBOSE("rigCAT_getfreq()"); failed = false; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) { failed = true; return progStatus.noCATfreq; } if (waitval == 0) waitval = progdefaults.RigCatWait; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; unsigned long long f = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { failed = true; if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return progStatus.noCATfreq; // get_freq command is not defined! } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) { failed = true; return 0; } for (std::list::iterator preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL != modeCmd.info) continue; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); for (int n = 0; n < retries; n++) { if (n && progdefaults.RigCatTimeout > 0) { int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, waitval); } if ( !sendok ) { if (xmlrig.debug) LOG_INFO("sendCommand failed"); goto retry_get_freq; } // check the pre data std::string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); goto retry_get_freq; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); goto retry_get_freq; } } // convert the data field f = fm_freqdata(rTemp.data, pData); if ( f >= rTemp.data.min && f <= rTemp.data.max) { char dummy[100]; snprintf(dummy, sizeof(dummy), "%llu", f); LOG_DEBUG("%s", dummy); return f; } else { char dummy[200]; snprintf(dummy, sizeof(dummy), "Retrieved freq %llu Hz outside bounds specified in .xml file" " of %llu to %llu", f, rTemp.data.min, rTemp.data.max); LOG_ERROR("%s", dummy); return 0; } retry_get_freq: ; } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); failed = true; return 0; } void rigCAT_setfreq(unsigned long long f) { const char symbol[] = "SETFREQ"; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) { progStatus.noCATfreq = f; } if (rigCAT_exit || !xmlrig.xmlok) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( f < modeCmd.data.min || f > modeCmd.data.max) { char dummy[200]; snprintf(dummy, sizeof(dummy), "Ordered freq %llu Hz outside bounds specified in .xml file of %llu to %llu", f, modeCmd.data.min, modeCmd.data.max); LOG_ERROR("%s", dummy); return; } wf->rfcarrier(f); if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); strCmd.append( to_freqdata(modeCmd.data, f) ); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); } std::string rigCAT_getmode() { const char symbol[] = "GETMODE"; LOG_VERBOSE("rigCAT_getmode()"); if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) return progStatus.noCATmode; XMLIOS modeCmd; std::list::iterator itrCmd; std::list::iterator mode; std::list *pmode; std::string strCmd, mData; size_t len; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return progStatus.noCATmode; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (!modeCmd.info.size()) return ""; for (std::list::iterator preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL != modeCmd.info) continue; XMLIOS rTemp = *preply; for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (progdefaults.RigCatTimeout > 50) { int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } } size_t p = 0, pData = 0; // send the command { guard_lock ser_guard(&rigCAT_mutex); if (!sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) goto retry_get_mode; } // check the pre data string len = rTemp.str1.size(); if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); goto retry_get_mode; } p = len; } if (rTemp.fill1) p += rTemp.fill1; pData = p; // check the post data string p += rTemp.data.size; len = rTemp.str2.size(); if (rTemp.fill2) p += rTemp.fill2; if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) goto retry_get_mode; } // convert the data field mData = ""; for (int i = 0; i < rTemp.data.size; i++) mData += (char)replybuff[pData + i]; // for FT100 and the ilk that use bit fields if (rTemp.data.size == 1) { unsigned char d = mData[0]; if (rTemp.data.shiftbits) d >>= rTemp.data.shiftbits; d &= rTemp.data.andmask; mData[0] = d; } if (lmodes.empty() == false) pmode = &lmodes; else if (lmodeREPLY.empty() == false) pmode = &lmodeREPLY; else goto retry_get_mode; mode = pmode->begin(); while (mode != pmode->end()) { if ((*mode).BYTES == mData) break; mode++; } if (mode != pmode->end()) return ((*mode).SYMBOL); retry_get_mode: ; } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); return ""; } void rigCAT_setmode(const std::string& md) { const char symbol[] = "SETMODE"; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) progStatus.noCATmode = md; if (rigCAT_exit || !xmlrig.xmlok) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if ( modeCmd.data.size > 0 ) { std::list::iterator mode; std::list *pmode; if (lmodes.empty() == false) pmode = &lmodes; else if (lmodeCMD.empty() == false) pmode = &lmodeCMD; else return; mode = pmode->begin(); while (mode != pmode->end()) { if ((*mode).SYMBOL == md) break; mode++; } if (mode != pmode->end()) strCmd.append( (*mode).BYTES ); } if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); } std::string rigCAT_getwidth() { const char symbol[] = "GETBW"; LOG_VERBOSE("rigCAT_getwidth()"); if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) return progStatus.noCATwidth; XMLIOS widthCmd; std::list::iterator itrCmd; std::list::iterator bw; std::list *pbw; std::string strCmd, mData; size_t len = 0, p = 0, pData = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return ""; } widthCmd = *itrCmd; if ( widthCmd.str1.empty() == false) strCmd.append(widthCmd.str1); if (widthCmd.str2.empty() == false) strCmd.append(widthCmd.str2); if (!widthCmd.info.size()) return ""; for (std::list::iterator preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL != widthCmd.info) continue; XMLIOS rTemp = *preply; for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (progdefaults.RigCatTimeout > 50) { int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } } p = 0; pData = 0; // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait); } if ( !sendok ) { goto retry_get_width; } // check the pre data string len = rTemp.str1.size(); if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); goto retry_get_width; } p = pData = len; } if (rTemp.fill1) p += rTemp.fill1; pData = p; p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; len = rTemp.str2.size(); if (len) { for (size_t i = 0; i < len; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); goto retry_get_width; } } // convert the data field mData = ""; for (int i = 0; i < rTemp.data.size; i++) mData += (char)replybuff[pData + i]; // new for FT100 and the ilk that use bit fields if (rTemp.data.size == 1) { unsigned char d = mData[0]; if (rTemp.data.shiftbits) d >>= rTemp.data.shiftbits; d &= rTemp.data.andmask; mData[0] = d; } if (!lbwREPLY.empty()) pbw = &lbwREPLY; else if (lbws.empty() == false) pbw = &lbws; else goto retry_get_width; bw = pbw->begin(); while (bw != pbw->end()) { if ((*bw).BYTES == mData) break; bw++; } if (bw != pbw->end()) return ((*bw).SYMBOL); retry_get_width: ; } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); return ""; } void rigCAT_setwidth(const std::string& w) { const char symbol[] = "SETBW"; if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) progStatus.noCATwidth = w; if (rigCAT_exit || !xmlrig.xmlok) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); progStatus.noCATwidth = w; return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if ( modeCmd.data.size > 0 ) { std::list::iterator bw; std::list *pbw; if (lbws.empty() == false) pbw = &lbws; else if (lbwCMD.empty() == false) pbw = &lbwCMD; else return; bw = pbw->begin(); while (bw != pbw->end()) { if ((*bw).SYMBOL == w) break; bw++; } if (bw != pbw->end()) strCmd.append( (*bw).BYTES ); } if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_ERROR("%s failed", symbol); } void rigCAT_pttON() { const char symbol[] = "PTTON"; if (rigCAT_exit) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; rigio.SetPTT(1); // always execute the h/w ptt if enabled itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { // if (xmlrig.debug) // LOG_INFO("OK string: %s", str2hex(modeCmd.ok.c_str(), modeCmd.ok.size()) ); std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_VERBOSE("%s failed", symbol); } void rigCAT_pttOFF() { const char symbol[] = "PTTOFF"; if (rigCAT_exit) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; rigio.SetPTT(0); // always execute the h/w ptt if enabled itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_ERROR("%s failed", symbol); } void rigCAT_sendINIT(const std::string& icmd, int multiplier) { if (rigCAT_exit) return; const char symbol[] = "INIT"; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == icmd) break; ++itrCmd; } if (itrCmd == commands.end()) return; modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatInitDelay)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatInitDelay)) return; MilliSleep(50); } } LOG_ERROR("INIT failed"); } void rigCAT_defaults() { listbox_xml_rig_baudrate->index(xmlrig.baud); valRigCatStopbits->value(xmlrig.stopbits); btnRigCatRTSplus->value(xmlrig.rts); btnRigCatDTRplus->value(xmlrig.dtr); btnRigCatRTSptt->value(xmlrig.rtsptt); btnRigCatDTRptt->value(xmlrig.dtrptt); chk_restore_tio->value(xmlrig.restore_tio); chkRigCatRTSCTSflow->value(xmlrig.rtscts); cntRigCatRetries->value(xmlrig.retries); cntRigCatTimeout->value(xmlrig.timeout); cntRigCatWait->value(xmlrig.write_delay); cntRigCatInitDelay->value(xmlrig.init_delay); // cntRigCatWaitForDevice->value(xmlrig.wait_for_device); btnRigCatEcho->value(xmlrig.echo); btnRigCatCMDptt->value(xmlrig.cmdptt); chkRigCatVSP->value(xmlrig.vsp); } void rigCAT_init_defaults() { progdefaults.XmlRigDevice = inpXmlRigDevice->value(); progdefaults.XmlRigBaudrate = listbox_xml_rig_baudrate->index(); progdefaults.RigCatStopbits = static_cast(valRigCatStopbits->value()); progdefaults.RigCatRTSplus = btnRigCatRTSplus->value(); progdefaults.RigCatDTRplus = btnRigCatDTRplus->value(); progdefaults.RigCatRTSptt = btnRigCatRTSptt->value(); progdefaults.RigCatDTRptt = btnRigCatDTRptt->value(); progdefaults.RigCatRestoreTIO = chk_restore_tio->value(); progdefaults.RigCatRTSCTSflow = chkRigCatRTSCTSflow->value(); progdefaults.RigCatRetries = static_cast(cntRigCatRetries->value()); progdefaults.RigCatTimeout = static_cast(cntRigCatTimeout->value()); progdefaults.RigCatWait = static_cast(cntRigCatWait->value()); progdefaults.RigCatInitDelay = static_cast(cntRigCatInitDelay->value()); progdefaults.RigCatECHO = btnRigCatEcho->value(); progdefaults.RigCatCMDptt = btnRigCatCMDptt->value(); progdefaults.RigCatVSP = chkRigCatVSP->value(); } bool rigCAT_init() { if (rigCAT_open == true) { LOG_ERROR("RigCAT already open"); return false; } sRigMode = ""; sRigWidth = ""; rigCAT_init_defaults(); rigio.Device(progdefaults.XmlRigDevice); rigio.Baud(progdefaults.BaudRate(progdefaults.XmlRigBaudrate)); rigio.RTS(progdefaults.RigCatRTSplus); rigio.DTR(progdefaults.RigCatDTRplus); rigio.RTSptt(progdefaults.RigCatRTSptt); rigio.DTRptt(progdefaults.RigCatDTRptt); rigio.RestoreTIO(progdefaults.RigCatRestoreTIO); rigio.RTSCTS(progdefaults.RigCatRTSCTSflow); rigio.Stopbits(progdefaults.RigCatStopbits); LOG_INFO("\n\ Serial port parameters:\n\ device : %s\n\ baudrate : %d\n\ stopbits : %d\n\ retries : %d\n\ timeout : %d\n\ wait : %d\n\ initial rts: %+d\n\ use rts ptt: %c\n\ initial dtr: %+d\n\ use dtr ptt: %c\n\ restore tio: %c\n\ flowcontrol: %c\n\ echo : %c\n", rigio.Device().c_str(), rigio.Baud(), rigio.Stopbits(), progdefaults.RigCatRetries, progdefaults.RigCatTimeout, progdefaults.RigCatWait, (rigio.RTS() ? +12 : -12), (rigio.RTSptt() ? 'T' : 'F'), (rigio.DTR() ? +12 : -12), (rigio.DTRptt() ? 'T' : 'F'), (rigio.RestoreTIO() ? 'T' : 'F'), (rigio.RTSCTS() ? 'T' : 'F'), progdefaults.RigCatECHO ? 'T' : 'F'); if (xmlrig.noserial == false && xmlrig.xmlok) { if (rigio.OpenPort() == false) { LOG_ERROR("Cannot open serial port %s", rigio.Device().c_str()); xmlrig.xmlok = true; } } sRigMode = ""; sRigWidth = ""; if (xmlrig.wait_for_device) { int delay = xmlrig.wait_for_device / 10; while (delay) { MilliSleep(10); if (delay % 10) Fl::awake(); delay--; } } rigCAT_sendINIT("INIT", progdefaults.RigCatInitDelay); bool failed = false; if (xmlrig.noserial) rigCAT_getfreq(1, failed, 0); else if (xmlrig.xmlok) { rigCAT_getfreq(3, failed, progdefaults.RigCatInitDelay); if (failed) { LOG_ERROR("*****************Failed to read xcvr frequency"); if (xmlrig.noserial == false) rigio.ClosePort(); xmlrig.xmlok = false; } else LOG_INFO("Passed serial port test"); } if (pthread_create(&rigCAT_thread, NULL, rigCAT_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); if (xmlrig.xmlok && !xmlrig.noserial) rigio.ClosePort(); xmlrig.xmlok = false; return false; } LOG_INFO("Created rigCAT thread"); rigCAT_open = true; init_Xml_RigDialog(); return true; } void rigCAT_close(void) { if ( rigCAT_open == false || rigCAT_exit == true) return; rigCAT_sendINIT("CLOSE"); { guard_lock ser_guard( &rigCAT_mutex ); rigCAT_exit = true; } LOG_INFO("%s", "Waiting for rigCAT_thread"); pthread_join(rigCAT_thread, NULL); rigio.ClosePort(); rigCAT_exit = false; rigCAT_open = false; wf->USB(true); } bool rigCAT_active(void) { return (rigCAT_open); } void rigCAT_set_ptt(int ptt) { if (progdefaults.CATkeying_disable_ptt && ( progdefaults.use_ELCTkeying || progdefaults.use_ICOMkeying || progdefaults.use_KNWDkeying || progdefaults.use_YAESUkeying ) && active_modem->get_mode() == MODE_CW ) return; if (rigCAT_open == false) return; if (ptt) { rigCAT_pttON(); } else{ rigCAT_pttOFF(); } } #ifndef RIGCATTEST void rigCAT_set_qsy(unsigned long long f) { if (rigCAT_open == false) return; // send new freq to rig rigCAT_setfreq(f); wf->rfcarrier(f); wf->movetocenter(); } #endif bool ModeIsLSB(std::string s) { if (connected_to_flrig) return !xmlrpc_USB(); #if USE_HAMLIB if (hamlib_active()) return !hamlib_USB(); #endif std::list::iterator pM = LSBmodes.begin(); while (pM != LSBmodes.end() ) { if (*pM == s) return true; pM++; } return false; } int smeter_data(DATA d, size_t p) { int val = 0; if (d.dtype == "BCD") { if (d.reverse == true) val = (int)(fm_bcd_be(p, d.size)); else val = (int)(fm_bcd(p, d.size)); } else if (d.dtype == "BINARY") { if (d.reverse == true) val = (int)(fm_binary_be(p, d.size)); else val = (int)(fm_binary(p, d.size)); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) val = (int)(fm_decimal_be(p, d.size)); else val = (int)(fm_decimal(p, d.size)); } size_t n; int sm1, sm2, val1, val2; for (n = 0; n < xmlrig.smeter.size() - 1; n++) { if ((val >= xmlrig.smeter[n].val) && (val < xmlrig.smeter[n+1].val)) break; } if (n == xmlrig.smeter.size() - 1) return 0; sm1 = xmlrig.smeter[n].mtr; sm2 = xmlrig.smeter[n+1].mtr; val1 = xmlrig.smeter[n].val; val2 = xmlrig.smeter[n+1].val; if (val1 == val2) return 0; int mtr = sm1 + (val - val1) * (sm2 - sm1) / (val2 - val1); return mtr; } static void rigcat_set_smeter(void *data) { if (smeter) { int val = reinterpret_cast(data); smeter->value(val); if (pwrlevel_grp->visible()) return; if (progStatus.meters && !smeter->visible()) { if (pwrmeter) pwrmeter->hide(); smeter->show(); } } } void rigCAT_get_smeter() { const char symbol[] = "GET_SMETER"; LOG_VERBOSE("rigCAT_smeter()"); if (rigCAT_exit || xmlrig.noserial) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long mtr = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return; std::list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait); } if ( !sendok ) { LOG_ERROR("sendCommand failed"); return; } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); return; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); return; } } // convert the data field mtr = smeter_data(rTemp.data, pData); // if (xmlrig.debug) LOG_INFO("Converted %s value to %d", symbol, (int)mtr); REQ(rigcat_set_smeter, reinterpret_cast(mtr)); } int pmeter_data(DATA d, size_t p) { int val = 0; if (d.dtype == "BCD") { if (d.reverse == true) val = (int)(fm_bcd_be(p, d.size)); else val = (int)(fm_bcd(p, d.size)); } else if (d.dtype == "BINARY") { if (d.reverse == true) val = (int)(fm_binary_be(p, d.size)); else val = (int)(fm_binary(p, d.size)); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) val = (int)(fm_decimal_be(p, d.size)); else val = (int)(fm_decimal(p, d.size)); } size_t n; int pm1, pm2, val1, val2; for (n = 0; n < xmlrig.pmeter.size() - 1; n++) { if ((val > xmlrig.pmeter[n].val) && (val <= xmlrig.pmeter[n+1].val)) break; } if (n == xmlrig.pmeter.size() - 1) return 0; pm1 = xmlrig.pmeter[n].mtr; pm2 = xmlrig.pmeter[n+1].mtr; val1 = xmlrig.pmeter[n].val; val2 = xmlrig.pmeter[n+1].val; if (val1 == val2) return 0; int mtr = pm1 + (val - val1) * (pm2 - pm1) / (val2 - val1); return mtr; } static void rigcat_set_pmeter(void *data) { if (pwrmeter) { int val = reinterpret_cast(data); pwrmeter->value(val); if (pwrlevel_grp->visible()) return; if (progStatus.meters) { if (smeter) smeter->hide(); pwrmeter->show(); pwrmeter->redraw(); } } } void rigCAT_get_pwrmeter() { const char symbol[] = "GET_PWRMETER"; if (rigCAT_exit || xmlrig.noserial) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long mtr = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return; std::list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait); } if ( !sendok ) { LOG_ERROR("sendCommand failed"); return; } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); return; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); return; } } // convert the data field mtr = pmeter_data(rTemp.data, pData); if (xmlrig.debug) LOG_INFO("Converted %s to %d", symbol, (int)mtr); REQ(rigcat_set_pmeter, reinterpret_cast(mtr)); } static void rigcat_notch(void *data) { int val = reinterpret_cast(data); notch_frequency = val; } int notch_data(DATA d, size_t p) { int val = 0; if (d.dtype == "BCD") { if (d.reverse == true) val = (int)(fm_bcd_be(p, d.size)); else val = (int)(fm_bcd(p, d.size)); } else if (d.dtype == "BINARY") { if (d.reverse == true) val = (int)(fm_binary_be(p, d.size)); else val = (int)(fm_binary(p, d.size)); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) val = (int)(fm_decimal_be(p, d.size)); else val = (int)(fm_decimal(p, d.size)); } size_t n; int ntch1, ntch2, val1, val2; for (n = 0; n < xmlrig.notch.size() - 1; n++) { if ((val > xmlrig.notch[n].val) && (val <= xmlrig.notch[n+1].val)) break; } if (n == xmlrig.notch.size() - 1) return 0; val1 = xmlrig.notch[n].val; val2 = xmlrig.notch[n+1].val; if (val1 == val2) return 0; ntch1 = xmlrig.notch[n].mtr; ntch2 = xmlrig.notch[n+1].mtr; return ntch1 + (val - val1) * (ntch2 - ntch1) / (val2 - val1); } int notch_val(int freq) { size_t n; int val1, val2, freq1, freq2; for (n = 0; n < xmlrig.notch.size() - 1; n++) { if ((freq > xmlrig.notch[n].mtr) && (freq <= xmlrig.notch[n+1].mtr)) break; } if (n == xmlrig.notch.size() - 1) return 0; freq1 = xmlrig.notch[n].mtr; freq2 = xmlrig.notch[n+1].mtr; if (freq1 == freq2) return 0; val1 = xmlrig.notch[n].val; val2 = xmlrig.notch[n+1].val; return val1 + (freq - freq1) * (val2 - val1) / (freq2 - freq1); } bool rigCAT_notchON() { const char symbol[] = "GET_NOTCH_ON"; if (rigCAT_exit) return 0; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; size_t len1 = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return 0; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return 0; std::list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return 0; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait ); } if ( !sendok ) { LOG_ERROR("sendCommand failed"); return 0; } bool is_on = true; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { is_on = false; break; } } } else is_on = false; // if (xmlrig.debug) LOG_INFO("%s is %s", symbol, is_on ? "ON" : "OFF"); return is_on; } void rigCAT_get_notch() { const char symbol[] = "GET_NOTCH"; LOG_VERBOSE("rigCAT_getnotch()"); if (rigCAT_exit) return; if (!rigCAT_notchON()) { REQ(rigcat_notch, reinterpret_cast(0)); return; } XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long ntch = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return; std::list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command int sendok; { guard_lock ser_guard(&rigCAT_mutex); sendok = sendCommand(symbol, strCmd, rTemp.size,progdefaults.RigCatWait); } if ( !sendok ) { LOG_ERROR("sendCommand failed"); return; } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); return; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); return; } } // convert the data field ntch = notch_data(rTemp.data, pData); if (xmlrig.debug) LOG_INFO("%s converted to %d", symbol, (int)ntch); REQ(rigcat_notch, reinterpret_cast(ntch)); } void rigCAT_notch_ON() { const char symbol[] = "SET_NOTCH_ON"; if (rigCAT_exit) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_ERROR("%s failed", symbol); } void rigCAT_notch_OFF() { const char symbol[] = "SET_NOTCH_OFF"; if (rigCAT_exit) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } LOG_ERROR("%s failed", symbol); } void rigCAT_set_notch(int freq) { const char symbol[] = "SET_NOTCH_VAL"; if (rigCAT_exit) return; if (!freq) { rigCAT_notch_OFF(); return; } rigCAT_notch_ON(); XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); std::string strval = ""; long long int val = notch_val(freq); if (modeCmd.data.size != 0) { if (modeCmd.data.dtype == "BCD") { if (modeCmd.data.reverse == true) strval = to_bcd_be(val, modeCmd.data.size); else strval = to_bcd(val, modeCmd.data.size); } else if (modeCmd.data.dtype == "BINARY") { if (modeCmd.data.reverse == true) strval = to_binary_be(val, modeCmd.data.size); else strval = to_binary(val, modeCmd.data.size); } else if (modeCmd.data.dtype == "DECIMAL") { if (modeCmd.data.reverse == true) strval = to_decimal_be(val, modeCmd.data.size); else strval = to_decimal(val, modeCmd.data.size); } } strCmd.append(strval); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) return; MilliSleep(50); } return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) return; MilliSleep(50); } } if (progdefaults.RigCatVSP == false) LOG_ERROR("%s failed", symbol); } long pwrlevel_data(DATA d, size_t p) { long val = 0; if (d.dtype == "BCD") { if (d.reverse == true) val = (int)(fm_bcd_be(p, d.size)); else val = (int)(fm_bcd(p, d.size)); } else if (d.dtype == "BINARY") { if (d.reverse == true) val = (int)(fm_binary_be(p, d.size)); else val = (int)(fm_binary(p, d.size)); } else if (d.dtype == "DECIMAL") { if (d.reverse == true) val = (int)(fm_decimal_be(p, d.size)); else val = (int)(fm_decimal(p, d.size)); } size_t n; long pwr1, pwr2, val1, val2; for (n = 0; n < xmlrig.pwrlevel.size() - 1; n++) { if ((val > xmlrig.pwrlevel[n].val) && (val <= xmlrig.pwrlevel[n+1].val)) break; } if (n == xmlrig.pwrlevel.size() - 1) return 0; val1 = xmlrig.pwrlevel[n].val; val2 = xmlrig.pwrlevel[n+1].val; if (val1 == val2) return 0; pwr1 = xmlrig.pwrlevel[n].mtr; pwr2 = xmlrig.pwrlevel[n+1].mtr; return pwr1 + (val - val1) * (pwr2 - pwr1) / (val2 - val1); } int pwrlevel_val(int pwr) { size_t n; int val1, val2, pwr1, pwr2; for (n = 0; n < xmlrig.pwrlevel.size() - 1; n++) { if ((pwr >= xmlrig.pwrlevel[n].mtr) && (pwr <= xmlrig.pwrlevel[n+1].mtr)) break; } if (n == xmlrig.pwrlevel.size() - 1) return 0; pwr1 = xmlrig.pwrlevel[n].mtr; pwr2 = xmlrig.pwrlevel[n+1].mtr; if (pwr1 == pwr2) return 0; val1 = xmlrig.pwrlevel[n].val; val2 = xmlrig.pwrlevel[n+1].val; return val1 + (pwr - pwr1) * (val2 - val1) / (pwr2 - pwr1); } // called by rigio thread // must use REQ(...) to set the power level control static void rigCAT_update_pwrlevel(const long v) { long pwr = v; pwr_level->value(pwr); } void rigCAT_get_pwrlevel() { const char symbol[] = "GET_PWRLEVEL"; LOG_VERBOSE("rigCAT_get_pwrlevel()"); if (rigCAT_exit || xmlrig.noserial || !xmlrig.xmlok) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; size_t p = 0, len1 = 0, len2 = 0, pData = 0; long pwr = 0; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( !modeCmd.str1.empty() ) strCmd.append(modeCmd.str1); if ( !modeCmd.str2.empty() ) strCmd.append(modeCmd.str2); if ( !modeCmd.info.size() ) return; std::list::iterator preply; for (preply = reply.begin(); preply != reply.end(); ++preply) { if (preply->SYMBOL == modeCmd.info) break; } if (preply == reply.end()) return; XMLIOS rTemp = *preply; len1 = rTemp.str1.size(); len2 = rTemp.str2.size(); int timeout = progdefaults.RigCatTimeout; while (timeout > 50) { MilliSleep(50); Fl::awake(); timeout -= 50; } if (timeout) { MilliSleep(timeout); Fl::awake(); } // send the command { guard_lock ser_guard( &rigCAT_mutex ); if ( !sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait) ) { LOG_ERROR("sendCommand failed"); return; } } // check the pre data string p = 0; pData = 0; if (len1) { for (size_t i = 0; i < len1; i++) { if ((char)rTemp.str1[i] != (char)replybuff[i]) { unsigned int ui = i; LOG_ERROR("failed pre data string test @ %u", ui); return; } } p = len1; } if (rTemp.fill1) p += rTemp.fill1; pData = p; if (rTemp.data.dtype == "BCD") { p += rTemp.data.size / 2; if (rTemp.data.size & 1) p++; } else p += rTemp.data.size; // check the post data string if (rTemp.fill2) p += rTemp.fill2; if (len2) { for (size_t i = 0; i < len2; i++) if ((char)rTemp.str2[i] != (char)replybuff[p + i]) { LOG_ERROR("failed post data string test @ %d", static_cast(i)); return; } } // convert the data field pwr = pwrlevel_data(rTemp.data, pData); REQ(rigCAT_update_pwrlevel, pwr); } void rigCAT_set_pwrlevel(int pwr) { const char symbol[] = "SET_PWRLEVEL"; if (rigCAT_exit || !xmlrig.use_pwrlevel) return; XMLIOS modeCmd; std::list::iterator itrCmd; std::string strCmd; itrCmd = commands.begin(); while (itrCmd != commands.end()) { if ((*itrCmd).SYMBOL == symbol) break; ++itrCmd; } if (itrCmd == commands.end()) { if (xmlrig.debug) LOG_INFO("%s not defined", symbol); return; } modeCmd = *itrCmd; if ( modeCmd.str1.empty() == false) strCmd.append(modeCmd.str1); std::string strval = ""; int val = pwrlevel_val(pwr); if (modeCmd.data.size != 0) { if (modeCmd.data.dtype == "BCD") { if (modeCmd.data.reverse == true) strval = to_bcd_be(val, modeCmd.data.size); else strval = to_bcd(val, modeCmd.data.size); } else if (modeCmd.data.dtype == "BINARY") { if (modeCmd.data.reverse == true) strval = to_binary_be(val, modeCmd.data.size); else strval = to_binary(val, modeCmd.data.size); } else if (modeCmd.data.dtype == "DECIMAL") { if (modeCmd.data.reverse == true) strval = to_decimal_be(val, modeCmd.data.size); else strval = to_decimal(val, modeCmd.data.size); } } strCmd.append(strval); if (modeCmd.str2.empty() == false) strCmd.append(modeCmd.str2); if (modeCmd.ok.size()) { std::list::iterator preply = reply.begin(); while (preply != reply.end()) { if (preply->SYMBOL == modeCmd.ok) { XMLIOS rTemp = *preply; // send the command for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, rTemp.size, progdefaults.RigCatWait)) { if (xmlrig.debug) LOG_INFO("Power set to %s", strval.c_str()); return; } MilliSleep(50); } if (xmlrig.debug) LOG_ERROR("%s failed", symbol); return; } preply++; } } else { for (int n = 0; n < progdefaults.RigCatRetries; n++) { if (rigCAT_exit) return; guard_lock ser_guard( &rigCAT_mutex ); if (sendCommand(symbol, strCmd, 0, progdefaults.RigCatWait)) { if (xmlrig.debug) LOG_INFO("Power set to %s", strval.c_str()); return; MilliSleep(50); } } } if (progdefaults.RigCatVSP == false) if (xmlrig.debug) LOG_ERROR("%s failed", symbol); } static void *rigCAT_loop(void *args) { SET_THREAD_ID(RIGCTL_TID); unsigned long long freq = 0UL; std::string sWidth, sMode; bool failed; for (;;) { for (int i = 0; i < xmlrig.pollinterval / 10; i++) { MilliSleep(10); if (rigCAT_exit == true) { LOG_INFO("%s", "Exited rigCAT loop"); return NULL; } } if (trx_state == STATE_RX) { cmdque_exec(); freq = rigCAT_getfreq(progdefaults.RigCatRetries, failed); if (rigCAT_exit) continue; if ((freq > 0) && (freq != qsoFreqDisp->value())) { show_frequency(freq); wf->rfcarrier(freq); } sWidth = rigCAT_getwidth(); if (rigCAT_exit) continue; if (sWidth.size() && sWidth != sRigWidth) { sRigWidth = sWidth; show_bw(sWidth); } sMode = rigCAT_getmode(); if (rigCAT_exit) continue; if (sMode.size() && sMode != sRigMode) { sRigMode = sMode; if (ModeIsLSB(sMode)) wf->USB(false); else wf->USB(true); show_mode(sMode); } if (xmlrig.use_pwrlevel) rigCAT_get_pwrlevel(); if (xmlrig.use_smeter) rigCAT_get_smeter(); if (xmlrig.use_notch) rigCAT_get_notch(); } else { if ( (trx_state == STATE_TUNE) || (trx_state == STATE_TX) ) if (xmlrig.use_pwrmeter) rigCAT_get_pwrmeter(); } } return NULL; } fldigi-4.2.05/src/rigcontrol/rigclass.cxx0000664000175000017500000001211014611711171015262 00000000000000// ---------------------------------------------------------------------------- // rigclass.cxx // // Hamlib C++ interface is a frontend implementing wrapper functions // to the hamlib library // // derived from rigclass.cc distributed with hamlib // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "rigclass.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); #define NUMTRIES 10 Rig::Rig() : rig(0) { } Rig::Rig(rig_model_t rig_model) { rig = rig_init(rig_model); fnull = 3580.0; if (!rig) throw RigException ("Could not initialize rig"); } Rig::~Rig() { LOG_INFO("Rig destroy %p", rig); if (!rig) return; close(); } void Rig::init(rig_model_t rig_model) { close(); if ((rig = rig_init(rig_model)) == NULL) throw RigException ("Could not initialize rig"); LOG_INFO("Initialised rig model %d: %s", rig_model, getName()); } const char *Rig::getName() { return rig ? rig->caps->model_name : ""; } const struct rig_caps* Rig::getCaps(void) { return rig ? rig->caps : 0; } void Rig::open(void) { int err = rig_open(rig); if (err != RIG_OK) throw RigException(err); } void Rig::close(bool abort) { if (abort) rig = NULL; else if (rig) { rig_close(rig); rig_cleanup(rig); rig = NULL; } } bool Rig::canSetFreq() { if (!rig) return false; return (rig->caps->set_freq != NULL); } bool Rig::canGetFreq() { if (!rig) return false; return (rig->caps->get_freq != NULL); } bool Rig::canSetMode() { if (!rig) return false; return (rig->caps->set_mode != NULL); } bool Rig::canGetMode() { if (!rig) return false; return (rig->caps->get_mode != NULL); } bool Rig::canSetPTT() { if (!rig) return false; return (rig->caps->set_ptt != NULL); } bool Rig::canGetPTT() { if (!rig) return false; return (rig->caps->get_ptt != NULL); } void Rig::setFreq(freq_t freq, vfo_t vfo) { fnull = freq; if (!canSetFreq()) { // rig does not support set_freq return; } int err; for (int i = 0; i < NUMTRIES; i++) { err = rig_set_freq(rig, vfo, freq); if (err == RIG_OK) return; } throw RigException(err); } freq_t Rig::getFreq(vfo_t vfo) { if (!canGetFreq()) { // rig does not support get_freq return fnull; } freq_t freq = fnull; int ret; for (int i = 0; i < NUMTRIES; i++) { ret = rig_get_freq(rig, vfo, &freq); if (ret == RIG_OK && freq != 0) { break; } } return freq; } void Rig::setMode(rmode_t mode, pbwidth_t width, vfo_t vfo) { if (!canSetMode()) throw RigException(RIG_ENAVAIL); int err; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_set_mode(rig, vfo, mode, width)) == RIG_OK) return; } throw RigException(err); } rmode_t Rig::getMode(pbwidth_t& width, vfo_t vfo) { if (!canGetMode()) throw RigException(RIG_ENAVAIL); int err; rmode_t mode; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_get_mode(rig, vfo, &mode, &width)) == RIG_OK) return mode; } throw RigException(err); } void Rig::setPTT(ptt_t ptt, vfo_t vfo) { if (!canSetPTT()) throw RigException(RIG_ENAVAIL); int err; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_set_ptt(rig, vfo, ptt)) == RIG_OK) return; } throw RigException(err); } ptt_t Rig::getPTT(vfo_t vfo) { if (!canGetPTT()) throw RigException(RIG_ENAVAIL); int err; ptt_t ptt; for (int i = 0; i < NUMTRIES; i++) { if ((err = rig_get_ptt(rig, vfo, &ptt)) == RIG_OK) return ptt; } throw RigException(err); } void Rig::setConf(token_t token, const char *val) { int err = rig_set_conf(rig, token, val); if (err != RIG_OK) throw RigException(err); } void Rig::setConf(const char *name, const char *val) { LOG_INFO("setting \"%s\" to \"%s\"", name, val); int err = rig_set_conf(rig, tokenLookup(name), val); if (err != RIG_OK) throw RigException(name, err); } void Rig::getConf(token_t token, char *val) { int err = rig_get_conf(rig, token, val); if (err != RIG_OK) throw RigException(err); } void Rig::getConf(const char *name, char *val) { int err = rig_get_conf(rig, tokenLookup(name), val); if (err != RIG_OK) throw RigException(name, err); } token_t Rig::tokenLookup(const char *name) { return rig_token_lookup(rig, name); } pbwidth_t Rig::passbandNormal (rmode_t mode) { return rig_passband_normal(rig, mode); } pbwidth_t Rig::passbandNarrow (rmode_t mode) { return rig_passband_narrow(rig, mode); } pbwidth_t Rig::passbandWide (rmode_t mode) { return rig_passband_wide(rig, mode); } fldigi-4.2.05/src/rigcontrol/hamlib.cxx0000664000175000017500000003637714611711171014734 00000000000000// ---------------------------------------------------------------------------- // hamlib.cxx -- Hamlib (rig control) interface for fldigi // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "trx.h" #include "configuration.h" #include "confdialog.h" #include "rigclass.h" #include "threads.h" #include "misc.h" #include "fl_digi.h" #include "main.h" #include "misc.h" #include "rigsupport.h" #include "stacktrace.h" #ifdef __WOE32__ # include "serial.h" #endif #include "debug.h" #include "re.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); static pthread_mutex_t hamlib_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_t *hamlib_thread = 0; static bool hamlib_exit = false; static bool hamlib_ptt = false; static bool hamlib_qsy = false; static bool need_freq = false; static bool need_mode = false; static bool hamlib_bypass = false; static bool hamlib_closed = true;//false; static int hamlib_passes = 20; static unsigned long long hamlib_freq; static rmode_t hamlib_rmode = RIG_MODE_USB; static pbwidth_t hamlib_pbwidth = 3000; typedef std::vector rig_list_t; rig_list_t hamlib_rigs; enum { SIDEBAND_RIG, SIDEBAND_LSB, SIDEBAND_USB }; static void *hamlib_loop(void *args); void show_error(const char* msg1, const char* msg2 = 0) { std::string error = msg1; if (msg2) error.append(": ").append(msg2); put_status(error.c_str(), 10.0); LOG_ERROR("%s", error.c_str()); } void hamlib_get_defaults() { char szParam[40]; int i; Rig testrig; rig_model_t rigmodel; rigmodel = hamlib_get_rig_model(cboHamlibRig->index()); testrig.init(rigmodel); testrig.getConf("timeout", szParam); sscanf(szParam, "%d", &i); cntHamlibTimeout->value(i); LOG_VERBOSE("Hamlib default Timeout: %d", i); testrig.getConf("retry", szParam); sscanf(szParam, "%d", &i); cntHamlibRetries->value(i); LOG_VERBOSE("Hamlib default Retry: %d", i); testrig.getConf("post_write_delay", szParam); sscanf(szParam, "%d", &i); cntHamlibWait->value(i); LOG_VERBOSE("Hamlib default Post write delay: %d", i); testrig.getConf("write_delay", szParam); sscanf(szParam, "%d", &i); cntHamlibWriteDelay->value(i); LOG_VERBOSE("Hamlib default Write delay: %d", i); if (testrig.getCaps()->port_type == RIG_PORT_SERIAL) { testrig.getConf("serial_speed", szParam); listbox_baudrate->value(szParam); LOG_VERBOSE("Hamlib default serial speed: %s", szParam); testrig.getConf("rts_state", szParam); chkHamlibRTSplus->value( strcmp(szParam, "ON") == 0 ? true : false); LOG_VERBOSE("Hamlib default RTS state: %s", szParam); testrig.getConf("dtr_state", szParam); btnHamlibDTRplus->value( strcmp(szParam, "ON") == 0 ? true : false); LOG_VERBOSE("Hamlib default DTR state: %s", szParam); testrig.getConf("serial_handshake", szParam); chkHamlibRTSCTSflow->value(strcmp(szParam, "Hardware") == 0 ? true : false); chkHamlibXONXOFFflow->value(strcmp(szParam, "XONXOFF") == 0 ? true : false); LOG_VERBOSE("Hamlib default serial handshake: %s", szParam); testrig.getConf("stop_bits", szParam); valHamRigStopbits->value(strcmp(szParam, "1") == 0 ? 1 : 2); LOG_VERBOSE("Hamlib default stop bits: %s", szParam); } if (!testrig.canSetPTT()) { btnHamlibCMDptt->value(0); btnHamlibCMDptt->deactivate(); } else { btnHamlibCMDptt->value(1); btnHamlibCMDptt->activate(); } inpHamlibConfig->value(""); testrig.close(); } void hamlib_init_defaults() { progdefaults.HamRigModel = hamlib_get_rig_model(cboHamlibRig->index()); progdefaults.HamRigDevice = inpRIGdev->value(); progdefaults.HamlibRetries = static_cast(cntHamlibRetries->value()); progdefaults.HamlibTimeout = static_cast(cntHamlibTimeout->value()); progdefaults.HamlibWriteDelay = static_cast(cntHamlibWriteDelay->value()); progdefaults.HamlibWait = static_cast(cntHamlibWait->value()); progdefaults.HamlibCMDptt = btnHamlibCMDptt->value(); progdefaults.HamlibDTRplus = btnHamlibDTRplus->value(); progdefaults.HamlibRTSCTSflow = chkHamlibRTSCTSflow->value(); progdefaults.HamlibRTSplus = chkHamlibRTSplus->value(); progdefaults.HamlibXONXOFFflow = chkHamlibXONXOFFflow->value(); progdefaults.HamlibSideband = listbox_sideband->index(); progdefaults.HamRigStopbits = static_cast(valHamRigStopbits->value()); progdefaults.HamRigBaudrate = listbox_baudrate->index(); progdefaults.HamlibCMDptt = btnHamlibCMDptt->value(); progdefaults.HamConfig = inpHamlibConfig->value(); } bool hamlib_init(bool bPtt) { freq_t freq; hamlib_ptt = bPtt; hamlib_init_defaults(); #ifdef __CYGWIN__ std::string port = progdefaults.HamRigDevice; com_to_tty(port); #endif if (progdefaults.HamRigModel == 0) { LOG_ERROR("No such hamlib rig model"); return false; } try { char szParam[20]; xcvr->init(progdefaults.HamRigModel); #ifdef __CYGWIN__ xcvr->setConf("rig_pathname", port.c_str()); #else xcvr->setConf("rig_pathname", progdefaults.HamRigDevice.c_str()); #endif snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibWait); xcvr->setConf("post_write_delay", szParam); snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibWriteDelay); xcvr->setConf("write_delay", szParam); snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibTimeout); xcvr->setConf("timeout", szParam); snprintf(szParam, sizeof(szParam), "%d", progdefaults.HamlibRetries); xcvr->setConf("retry", szParam); if (xcvr->getCaps()->port_type == RIG_PORT_SERIAL) { xcvr->setConf("serial_speed", progdefaults.strBaudRate()); if (progdefaults.HamlibDTRplus) xcvr->setConf("dtr_state", "ON"); else xcvr->setConf("dtr_state", "OFF"); if (progdefaults.HamlibRTSCTSflow) { xcvr->setConf("serial_handshake", "Hardware"); } else if (progdefaults.HamlibXONXOFFflow) { xcvr->setConf("serial_handshake", "XONXOFF"); } else { xcvr->setConf("serial_handshake", "None"); } if (!progdefaults.HamlibRTSCTSflow) { if (progdefaults.HamlibRTSplus) xcvr->setConf("rts_state", "ON"); else xcvr->setConf("rts_state", "OFF"); } xcvr->setConf("stop_bits", progdefaults.HamRigStopbits == 1 ? "1" : "2"); } std::string::size_type c = progdefaults.HamConfig.find('#'); if (c != std::string::npos) progdefaults.HamConfig.erase(c); if (!progdefaults.HamConfig.empty()) { re_t re("([^, =]+) *= *([^, =]+)", REG_EXTENDED); const char* conf = progdefaults.HamConfig.c_str(); int end; while (re.match(conf)) { xcvr->setConf(re.submatch(1).c_str(), re.submatch(2).c_str()); re.suboff(0, NULL, &end); conf += end; } } xcvr->open(); } catch (const RigException& Ex) { show_error(__func__, Ex.what()); xcvr->close(); return false; } try { if ( !xcvr->canGetFreq() ) need_freq = false; // getFreq will return setFreq value else { need_freq = true; freq = xcvr->getFreq(RIG_VFO_A); if ((long)freq < 0) { //<= 0) { xcvr->close(true); LOG_ERROR("%s","Hamlib xcvr not responding"); return false; } } } catch (const RigException& Ex) { show_error("Get Freq", Ex.what()); need_freq = false; } if (!need_freq) { xcvr->close(true); LOG_INFO("Failed freq test"); return false; } LOG_INFO("trying mode request"); try { need_mode = xcvr->canGetMode(); } catch (const RigException& Ex) { LOG_ERROR("Get Mode %s", Ex.what()); need_mode = false; } try { if (hamlib_ptt == true) { LOG_INFO("trying PTT"); if (!xcvr->canSetPTT()) hamlib_ptt = false; else xcvr->setPTT(RIG_PTT_OFF); } } catch (const RigException& Ex) { LOG_ERROR("Set Ptt %s", Ex.what()); hamlib_ptt = false; } hamlib_freq = 0; hamlib_rmode = RIG_MODE_NONE; hamlib_exit = false; hamlib_bypass = false; hamlib_thread = new pthread_t; if (pthread_create(hamlib_thread, NULL, hamlib_loop, NULL) < 0) { show_error(__func__, "pthread_create failed"); xcvr->close(); hamlib_thread = 0; return false; } init_Hamlib_RigDialog(); hamlib_closed = false; return true; } void hamlib_close(void) { ENSURE_THREAD(FLMAIN_TID); if (hamlib_closed) return; pthread_mutex_lock(&hamlib_mutex); hamlib_exit = true; pthread_mutex_unlock(&hamlib_mutex); pthread_join(*hamlib_thread, NULL); delete hamlib_thread; hamlib_thread = 0; if (xcvr->isOnLine()) xcvr->close(); wf->USB(true); } bool hamlib_active(void) { if (!xcvr) return false; return (xcvr->isOnLine()); } void hamlib_set_ptt(int ptt) { if (xcvr->isOnLine() == false) return; if (!hamlib_ptt) return; guard_lock hamlib(&hamlib_mutex); try { xcvr->setPTT( ptt ? (progdefaults.hamlib_ptt_on_data ? RIG_PTT_ON_DATA : RIG_PTT_ON_MIC) : RIG_PTT_OFF ); hamlib_bypass = ptt ? true : false; } catch (const RigException& Ex) { show_error("Rig PTT", Ex.what()); hamlib_ptt = false; } } void hamlib_set_qsy(unsigned long long f) { if (xcvr->isOnLine() == false) return; guard_lock hamlib(&hamlib_mutex); double fdbl = f; hamlib_qsy = false; try { xcvr->setFreq(fdbl); wf->rfcarrier(f); wf->movetocenter(); } catch (const RigException& Ex) { show_error("QSY", Ex.what()); hamlib_passes = 0; } } int hamlib_setfreq(unsigned long long f) { if (xcvr->isOnLine() == false) return -1; guard_lock hamlib(&hamlib_mutex); try { char dummy[20]; snprintf(dummy, sizeof(dummy), "%llu", f); LOG_DEBUG("%s", dummy); xcvr->setFreq((freq_t) f); } catch (const RigException& Ex) { show_error("SetFreq", Ex.what()); hamlib_passes = 0; } return 1; } static int hamlib_wait = 0; int hamlib_setmode(rmode_t m) { if (need_mode == false) return -1; if (xcvr->isOnLine() == false) return -1; guard_lock hamlib(&hamlib_mutex); try { hamlib_rmode = xcvr->getMode(hamlib_pbwidth); xcvr->setMode(m, hamlib_pbwidth); hamlib_rmode = m; } catch (const RigException& Ex) { show_error("Set Mode", Ex.what()); hamlib_passes = 0; } hamlib_wait = progdefaults.hamlib_mode_delay / 50; return 1; } // width control via hamlib is not implemented int hamlib_setwidth(pbwidth_t w) { if (xcvr->isOnLine() == false) return -1; guard_lock hamlib(&hamlib_mutex); try { hamlib_rmode = xcvr->getMode(hamlib_pbwidth); xcvr->setMode(hamlib_rmode, w); hamlib_pbwidth = w; } catch (const RigException& Ex) { show_error("Set Width", Ex.what()); hamlib_passes = 0; } return 1; } rmode_t hamlib_getmode() { return hamlib_rmode; } pbwidth_t hamlib_getwidth() { return hamlib_pbwidth; } bool hamlib_USB() { if (hamlib_wait) return wf->USB(); bool islsb = false; if (progdefaults.HamlibSideband == SIDEBAND_RIG) { islsb = (hamlib_rmode == RIG_MODE_LSB || hamlib_rmode == RIG_MODE_PKTLSB || hamlib_rmode == RIG_MODE_ECSSLSB); if (hamlib_rmode == RIG_MODE_CW) { if (progdefaults.hamlib_cw_islsb) islsb = true; else islsb = false; } if (hamlib_rmode == RIG_MODE_CWR) { if (progdefaults.hamlib_cw_islsb) islsb = false; else islsb = true; } if (hamlib_rmode == RIG_MODE_RTTY) { if (progdefaults.hamlib_rtty_isusb) islsb = false; else islsb = true; } if (hamlib_rmode == RIG_MODE_RTTYR) { if (progdefaults.hamlib_rtty_isusb) islsb = true; else islsb = false; } } else if (progdefaults.HamlibSideband == SIDEBAND_LSB) islsb = true; return !islsb; } static void *hamlib_loop(void *args) { SET_THREAD_ID(RIGCTL_TID); unsigned long long freq = 0ULL; rmode_t numode = RIG_MODE_NONE; int skips = 0; for (;;) { bool cont = false; MilliSleep(50); if (skips) { skips--; cont = true; } if (hamlib_wait) { hamlib_wait--; cont = true; } if (cont) continue; else { skips = valHamRigPollrate->value() / 50; } if (hamlib_exit) break; if (hamlib_bypass) continue; { guard_lock hamlib(&hamlib_mutex); if (need_freq) { freq_t f; try { f = xcvr->getFreq(); freq = (unsigned long long) f; if (freq == 0) continue; hamlib_freq = freq; show_frequency(hamlib_freq); wf->rfcarrier(hamlib_freq); } catch (const RigException& Ex) { show_error(__func__, "Rig not responding: freq"); } } } if (hamlib_exit) break; if (hamlib_bypass) continue; { guard_lock hamlib(&hamlib_mutex); if (need_mode) { try { numode = xcvr->getMode(hamlib_pbwidth); if (numode != hamlib_rmode) { hamlib_rmode = numode; show_mode(modeString(hamlib_rmode)); wf->USB(hamlib_USB()); } } catch (const RigException& Ex) { show_error(__func__, "Rig not responding: mode"); } } } if (hamlib_exit) break; if (hamlib_bypass) continue; } hamlib_closed = true; return NULL; } #ifdef RIGCAPS_NOT_CONST static int add_to_list(struct rig_caps* rc, void*) #else static int add_to_list(const struct rig_caps* rc, void*) #endif { hamlib_rigs.push_back(rc); return 1; } static bool rig_cmp(const struct rig_caps* rig1, const struct rig_caps* rig2) { int ret; ret = strcasecmp(rig1->mfg_name, rig2->mfg_name); if (ret > 0) return false; if (ret < 0) return true; ret = strcasecmp(rig1->model_name, rig2->model_name); if (ret > 0) return false; if (ret < 0) return true; if (rig1->rig_model < rig2->rig_model) return true; return false; } void hamlib_get_rigs(void) { if (!hamlib_rigs.empty()) return; enum rig_debug_level_e dblv = RIG_DEBUG_NONE; #ifndef NDEBUG const char* hd = getenv("FLDIGI_HAMLIB_DEBUG"); if (hd) { dblv = static_cast(strtol(hd, NULL, 10)); dblv = CLAMP(dblv, RIG_DEBUG_NONE, RIG_DEBUG_TRACE); } #endif rig_set_debug(dblv); rig_load_all_backends(); rig_list_foreach(add_to_list, 0); sort(hamlib_rigs.begin(), hamlib_rigs.end(), rig_cmp); } rig_model_t hamlib_get_rig_model_compat(const char* name) { for (rig_list_t::const_iterator i = hamlib_rigs.begin(); i != hamlib_rigs.end(); ++i) if (strstr(name, (*i)->mfg_name) && strstr(name, (*i)->model_name)) return (*i)->rig_model; return 0; } size_t hamlib_get_index(rig_model_t model) { for (rig_list_t::const_iterator i = hamlib_rigs.begin(); i != hamlib_rigs.end(); ++i) if ((*i)->rig_model == model) return i - hamlib_rigs.begin(); return hamlib_rigs.size(); } rig_model_t hamlib_get_rig_model(size_t i) { try { return hamlib_rigs.at(i)->rig_model; } catch (...) { return 0; } } void hamlib_get_rig_str(int (*func)(const char*)) { std::string rigstr; for (rig_list_t::const_iterator i = hamlib_rigs.begin(); i != hamlib_rigs.end(); ++i) { rigstr.clear(); rigstr.append((*i)->mfg_name).append(" ").append((*i)->model_name); rigstr.append(" (").append(rig_strstatus((*i)->status)).append(")"); if (!(*func)(rigstr.c_str())) break; } } fldigi-4.2.05/src/rigcontrol/rigxml.cxx0000664000175000017500000005612314611711171014771 00000000000000// ---------------------------------------------------------------------------- // rigxml.cxx - parse a rig control xml file // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "gettext.h" #include "rigio.h" #include "rigxml.h" #include "rigsupport.h" #ifdef RIGCATTEST #include "rigCAT.h" #else #include "main.h" #endif #include "debug.h" #include "configuration.h" #include "fileselect.h" #include "confdialog.h" #include "icons.h" #include "fl_digi.h" //#define DEBUGXML 1 void parseRIGDEF(size_t &); void parseRIG(size_t &); void parseCOMMAND(size_t &); void parseREPLY(size_t &); void parseMODES(size_t &); void parseBANDWIDTHS(size_t &); void parseBWCMD(size_t &); void parseBWREPLY(size_t &); void parseMODECMD(size_t &); void parseMODEREPLY(size_t &); void parseTITLE(size_t &); void parseLSBMODES(size_t &); void parseDISCARD(size_t &); void parseDEBUG(size_t &); void parseNOSERIAL(size_t &); void parseASCII(size_t &); void parseWRITE_DELAY(size_t &); void parseINIT_DELAY(size_t &); void parseWAIT_FOR_DEVICE(size_t &); void parsePOST_WRITE_DELAY(size_t &); void parseRETRIES(size_t &); void parseTIMEOUT(size_t &); void parseBAUDRATE(size_t &); void parseSTOPBITS(size_t &); void parseRTSCTS(size_t &); void parseCMDPTT(size_t &); void parseRTSPLUS(size_t &); void parseDTRPLUS(size_t &); void parseRTSPTT(size_t &); void parseDTRPTT(size_t &); void parseRESTORE_TIO(size_t &); void parseECHO(size_t &); void parseVSP(size_t &); void parseLOGSTR(size_t &); void parsePOLLINT(size_t &); void parseSMETER(size_t &); void parsePMETER(size_t &); void parseNOTCH(size_t &); void parsePWRLEVEL(size_t &); void parseIOSsymbol(size_t &); void parseIOSsize(size_t &); void parseIOSbytes(size_t &); void parseIOSbyte(size_t &); void parseIOSdata(size_t &); void parseIOSinfo(size_t &); void parseIOSok(size_t &); void parseIOSbad(size_t &); void parseIOSstring(size_t &); void parseIOSint(size_t &); void parseIOSfill(size_t &); void parseDTYPE(size_t &); void parseDSIZE(size_t &); void parseDMAX(size_t &); void parseDMIN(size_t &); void parseDRESOL(size_t &); void parseDREV(size_t &); void parseDMAKS(size_t &); void parseDSHIFT(size_t &); void print(size_t &); std::list commands; std::list reply; std::list lmodes; std::list lbws; std::list lbwCMD; std::list lbwREPLY; std::list lmodeCMD; std::list lmodeREPLY; std::list LSBmodes; XMLRIG xmlrig; XMLIOS iosTemp; std::string strXML; TAGS rigdeftags[] = { {"", p0); LOG_INFO("%s%s", istr.c_str(), strXML.substr(p0, tend - p0 + 1).c_str()); #endif } size_t tagEnd(size_t p0) { size_t p1, p2, p3; p1 = p0; std::string strtag = "", p0); p3 = strXML.find(" ", p0); if (p2 == std::string::npos) { return p2; } if (p3 < p2) p2 = p3; strtag.append(strXML.substr(p1 + 1, p2 - p1 - 1)); strtag.append(">"); p3 = strXML.find(strtag, p1); return p3; } size_t nextTag(size_t p0) { p0 = strXML.find("<", p0+1); return p0; } std::string getElement(size_t p0) { size_t p1 = strXML.find(">",p0), p2 = nextTag(p1+1); if (p1 == std::string::npos || p2 == std::string::npos) return ""; p1++; p2--; while (p1 < p2 && strXML[p1] == ' ') p1++; // skip leading spaces while (p1 < p2 && strXML[p2] == ' ') p2--; // skip trailing spaces return strXML.substr(p1, p2 - p1 + 1); } int getInt(size_t p0) { std::string stemp = getElement(p0); if (stemp.length() == 0) return 0; return atoi(stemp.c_str()); } int getUnsignedLongLong(size_t p0) { std::string stemp = getElement(p0); if (stemp.length() == 0) return 0; return strtoull(stemp.c_str(), NULL, 10); } float getFloat(size_t p0) { std::string stemp = getElement(p0); if (stemp.length() == 0) return 0; return atof(stemp.c_str()); } bool getBool( size_t p0) { std::string stemp = getElement(p0); if (stemp.length() == 0) return false; if (strcasecmp(stemp.c_str(), "true") == 0) return true; if (stemp == "1") return true; return false; } char getByte(size_t p0) { unsigned int val; if (sscanf( getElement(p0).c_str(), "%x", &val ) != 1) return 0; return (val & 0xFF); } std::string getBytes(size_t p0) { unsigned int val; size_t space; std::string stemp = getElement(p0); std::string s; while ( stemp.length() ) { if (sscanf( stemp.c_str(), "%x", &val) != 1) { s = ""; return s; } s += (char)(val & 0xFF); space = stemp.find(" "); if (space == std::string::npos) break; stemp.erase(0, space + 1); } return s; } bool isInt(size_t p0, int &i) { // p0 = nextTag(p0); if (strXML.find(" &lmd) { size_t pend = tagEnd(p0); size_t elend; char ch; int n; std::string stemp; std::string strELEMENT; if (pend == std::string::npos) { p0++; return; } print(p0,0); p0 = nextTag(p0); while (p0 != std::string::npos && p0 < pend && tagIs(p0, " &lbw) { size_t pend = tagEnd(p0); size_t elend; char ch; int n; std::string strELEMENT; std::string stemp; if (pend == std::string::npos) { LOG_ERROR("Unmatched tag %s", strXML.substr(p0, 10).c_str()); p0++; return; } print(p0,0); size_t p1 = nextTag(p0); while (p1 != std::string::npos && p1 < pend && tagIs(p1, " pend) { LOG_ERROR("Unmatched tag %s", " 2) val = 2; xmlrig.stopbits = val; size_t pend = tagEnd(p0); p0 = pend; } void parseWRITE_DELAY(size_t &p0){ int val = getInt(p0); xmlrig.write_delay = val; size_t pend = tagEnd(p0); p0 = pend; } void parseINIT_DELAY(size_t &p0){ int val = getInt(p0); xmlrig.init_delay = val; size_t pend = tagEnd(p0); p0 = pend; } void parseWAIT_FOR_DEVICE(size_t &p0){ int val = getInt(p0); xmlrig.wait_for_device = val; size_t pend = tagEnd(p0); p0 = pend; } void parsePOST_WRITE_DELAY(size_t &p0){ int val = getInt(p0); xmlrig.post_write_delay = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRETRIES(size_t &p0){ int val = getInt(p0); xmlrig.retries = val; size_t pend = tagEnd(p0); p0 = pend; } void parseTIMEOUT(size_t &p0){ int val = getInt(p0); xmlrig.timeout = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRTSCTS(size_t &p0){ bool val = getBool(p0); xmlrig.rtscts = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRTSPLUS(size_t &p0) { bool val = getBool(p0); xmlrig.rts = val; size_t pend = tagEnd(p0); p0 = pend; } void parseDTRPLUS(size_t &p0) { bool val = getBool(p0); xmlrig.dtr = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRTSPTT(size_t &p0) { bool val = getBool(p0); xmlrig.rtsptt = val; size_t pend = tagEnd(p0); p0 = pend; } void parseDTRPTT(size_t &p0) { bool val = getBool(p0); xmlrig.dtrptt = val; size_t pend = tagEnd(p0); p0 = pend; } void parseRESTORE_TIO(size_t &p0) { bool val = getBool(p0); xmlrig.restore_tio = val; size_t pend = tagEnd(p0); p0 = pend; } void parseCMDPTT(size_t &p0) { bool val = getBool(p0); xmlrig.cmdptt = val; size_t pend = tagEnd(p0); p0 = pend; } void parseECHO(size_t &p0) { bool val = getBool(p0); xmlrig.echo = val; size_t pend = tagEnd(p0); p0 = pend; } void parseVSP(size_t &p0) { bool val = getBool(p0); xmlrig.vsp = val; size_t pend = tagEnd(p0); p0 = pend; } void parseLOGSTR(size_t &p0) { bool val = getBool(p0); xmlrig.logstr = val; size_t pend = tagEnd(p0); p0 = pend; } void parsePOLLINT(size_t &p0) { int val = getInt(p0); if (val < 100) val = 1000; if (val > 20000) val = 20000; xmlrig.pollinterval = val; size_t pend = tagEnd(p0); p0 = pend; } void parseSMETER(size_t &p0) { std::string strmeter = getElement(p0); size_t pend = tagEnd(p0); p0 = pend; xmlrig.smeter.clear(); int val, sm; size_t p = strmeter.find(","); while ( !strmeter.empty() && (p != std::string::npos) ) { val = atoi(&strmeter[0]); sm = atoi(&strmeter[p+1]); xmlrig.smeter.push_back(PAIR(val,sm)); p = strmeter.find(";"); if (p == std::string::npos) strmeter.clear(); else { strmeter.erase(0, p+1); p = strmeter.find(","); } } xmlrig.use_smeter = true; } void parsePMETER(size_t &p0) { std::string strmeter = getElement(p0); size_t pend = tagEnd(p0); p0 = pend; xmlrig.pmeter.clear(); int val, sm; size_t p = strmeter.find(","); while ( !strmeter.empty() && (p != std::string::npos) ) { val = atoi(&strmeter[0]); sm = atoi(&strmeter[p+1]); xmlrig.pmeter.push_back(PAIR(val,sm)); p = strmeter.find(";"); if (p == std::string::npos) strmeter.clear(); else { strmeter.erase(0, p+1); p = strmeter.find(","); } } xmlrig.use_pwrmeter = true; } void parseNOTCH(size_t &p0) { std::string strnotch = getElement(p0); size_t pend = tagEnd(p0); p0 = pend; xmlrig.notch.clear(); int val, ntch; size_t p = strnotch.find(","); while ( !strnotch.empty() && (p != std::string::npos) ) { val = atoi(&strnotch[0]); ntch = atoi(&strnotch[p+1]); xmlrig.notch.push_back(PAIR(val,ntch)); p = strnotch.find(";"); if (p == std::string::npos) strnotch.clear(); else { strnotch.erase(0, p+1); p = strnotch.find(","); } } xmlrig.use_notch = true; } void parsePWRLEVEL(size_t &p0) { std::string strpwrlevel = getElement(p0); size_t pend = tagEnd(p0); p0 = pend; xmlrig.pwrlevel.clear(); int val, pwr; float min = 500, max = 0; size_t p = strpwrlevel.find(","); while ( !strpwrlevel.empty() && (p != std::string::npos) ) { val = atoi(&strpwrlevel[0]); pwr = atoi(&strpwrlevel[p+1]); if (pwr < min) min = pwr; if (pwr > max) max = pwr; xmlrig.pwrlevel.push_back(PAIR(val,pwr)); p = strpwrlevel.find(";"); if (p == std::string::npos) strpwrlevel.clear(); else { strpwrlevel.erase(0, p+1); p = strpwrlevel.find(","); } } pwr_level->range(min, max); xmlrig.use_pwrlevel = true; } //--------------------------------------------------------------------- // Parse IOS (serial stream format) definitions //--------------------------------------------------------------------- void parseIOSsize(size_t &p0) { iosTemp.size = getInt(p0); } void parseIOSbytes(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1.append(getBytes(p0)); else iosTemp.str2.append(getBytes(p0)); } void parseIOSbyte(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1 += getByte(p0); else iosTemp.str2 += getByte(p0); } void parseIOSstring(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1 += getElement(p0); else iosTemp.str2 += getElement(p0); } void parseIOSint(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.str1 += (char)(getInt(p0) & 0xFF); else iosTemp.str2 += (char)(getInt(p0) & 0xFF); } void parseDTYPE(size_t &p1) { print(p1,2); iosTemp.data.dtype = getElement(p1); } void parseDSIZE(size_t &p1) { print(p1,2); iosTemp.data.size = getInt(p1); } void parseDMAX(size_t &p1) { print(p1,2); iosTemp.data.max = getUnsignedLongLong(p1); } void parseDMIN(size_t &p1) { print(p1,2); iosTemp.data.min = getUnsignedLongLong(p1); } void parseDRESOL(size_t &p1) { print(p1,2); iosTemp.data.resolution = getFloat(p1); } void parseDREV(size_t &p1) { print(p1,2); iosTemp.data.reverse = getBool(p1); } void parseDMAKS(size_t &p1) { print(p1,2); iosTemp.data.andmask = getInt(p1); } void parseDSHIFT(size_t &p1) { print(p1,2); iosTemp.data.shiftbits = getInt(p1); } void parseIOSdata(size_t &p0) { size_t pend = tagEnd(p0); size_t p1; TAGS *pv; p1 = nextTag(p0); while (p1 < pend) { pv = datatags; while (pv->tag) { if (strXML.find(pv->tag, p1) == p1) break; pv++; } if (pv->fp) { print(p1, 1); (pv->fp)(p1); p1 = tagEnd(p1); } else { LOG_ERROR("Invalid tag: %s", strXML.substr(p1, 10).c_str()); parseDISCARD(p1); } p1 = nextTag(p1); } } void parseIOSinfo(size_t &p0) { std::string strR = getElement(p0); if (strR.empty()) return; iosTemp.info = strR; } void parseIOSok(size_t &p0) { std::string strR = getElement(p0); if (strR.empty()) return; iosTemp.ok = strR; } void parseIOSbad(size_t &p0) { std::string strR = getElement(p0); if (strR.empty()) return; iosTemp.bad = strR; } void parseIOSsymbol(size_t &p0) { std::string strR = getElement(p0); if (strR.empty()) return; iosTemp.SYMBOL = strR; } void parseIOSfill(size_t &p0) { if (iosTemp.data.size == 0) iosTemp.fill1 = getInt(p0); else iosTemp.fill2 = getInt(p0); } //======================================================================= bool parseIOS(size_t &p0, TAGS *valid) { size_t pend = tagEnd(p0); size_t p1; TAGS *pv; print(p0,0); iosTemp.clear(); p1 = nextTag(p0); while (p1 < pend) { pv = valid; while (pv->tag) { if (strXML.find(pv->tag, p1) == p1) break; pv++; } if (pv->fp) { print(p1, 1); (pv->fp)(p1); p1 = tagEnd(p1); } else { LOG_ERROR("Invalid tag: %s", strXML.substr(p1, 10).c_str()); parseDISCARD(p1); } p1 = nextTag(p1); } p0 = pend; return (!iosTemp.SYMBOL.empty()); } void parseCOMMAND(size_t &p0) { if (parseIOS(p0, commandtags)) commands.push_back(iosTemp); } void parseREPLY(size_t &p0) { if (parseIOS(p0, replytags)) reply.push_back(iosTemp); } void parseRIGDEF(size_t &p0) { print(p0,0); size_t p1 = tagEnd(p0); if (p1 != std::string::npos) strXML.erase(p1); } void parseDISCARD(size_t &p0) { size_t pend = tagEnd(p0); if (pend == std::string::npos) p0++; else p0 = pend; } void parseXML() { size_t p0 = 0; TAGS *pValid = rigdeftags; p0 = strXML.find("<"); while (p0 != std::string::npos) { pValid = rigdeftags; while (pValid->tag) { if (strXML.find(pValid->tag, p0) == p0) break; pValid++; } if (pValid->tag) { (pValid->fp)(p0); } else { LOG_ERROR("Invalid tag: %s", strXML.substr(p0, 10).c_str()); parseDISCARD(p0); } p0 = nextTag(p0); } } bool remove_comments() { size_t p0 = 0; size_t p1 = 0; // remove comments from xml text while ((p0 = strXML.find("", p0); if (p1 == std::string::npos) { fl_alert2("Corrupt rig XML definition file\nMismatched comment tags!"); return false; } strXML.erase(p0, p1 - p0 + 3); } if (strXML.find("-->") != std::string::npos) { fl_alert2("Corrupt rig XML definition file\nMismatched comment tags!"); return false; } return true; } bool testXML() { if (!remove_comments()) return false; return true; } bool readRigXML() { char szLine[256]; int lines = 0; commands.clear(); reply.clear(); lmodes.clear(); lmodeCMD.clear(); lmodeREPLY.clear(); lbws.clear(); lbwCMD.clear(); lbwREPLY.clear(); LSBmodes.clear(); strXML = ""; std::ifstream xmlfile(progdefaults.XmlRigFilename.c_str(), std::ios::in); if (xmlfile) { while (!xmlfile.eof()) { lines++; memset(szLine, 0, sizeof(szLine)); xmlfile.getline(szLine,255); strXML.append(szLine); } xmlfile.close(); if (testXML()) { parseXML(); xmlrig.xmlok = true; return true; } } return false; } void selectRigXmlFilename() { std::string deffilename; deffilename = progdefaults.XmlRigFilename; const char *p = FSEL::select(_("Open rig xml file"), _("Fldigi rig xml definition file\t*.xml"), deffilename.c_str()); if (!p) return; if (!*p) return; progdefaults.XmlRigFilename = p; txtXmlRigFilename->value(fl_filename_name(p)); loadRigXmlFile(); } void loadRigXmlFile(void) { rigCAT_close(); readRigXML(); rigCAT_defaults(); } fldigi-4.2.05/src/rigcontrol/serial.cxx0000664000175000017500000006474114611712135014754 00000000000000// ---------------------------------------------------------------------------- // serial.cxx - Serial I/O class // // Copyright (C) 2007-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "serial.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); extern const double zusec(void); char traceinfo[1000]; #ifndef __MINGW32__ #include #include #include #include #include #include #include #include bool check_hex(const void *s, size_t len) { unsigned char *str = (unsigned char *)s; for (size_t n = 0; n < len; n++) { if (str[n] == '\r' || str[n] == '\n') continue; if (str[n] < 0x20) return true; if (str[n] > 0x7F) return true; } return false; } Cserial::Cserial() { device = "/dev/ttyS0"; baud = 1200; timeout = 50; //msec retries = 5; rts = dtr = false; rtsptt = dtrptt = false; rtscts = false; status = 0; stopbits = 2; fd = -1; restore_tio = true; } Cserial::~Cserial() { ClosePort(); } /////////////////////////////////////////////////////// // Function name : Cserial::OpenPort // Description : Opens the port specified by strPortName // Return type : BOOL // Argument : c_string strPortName /////////////////////////////////////////////////////// bool Cserial::OpenPort() { #ifdef __CYGWIN__ com_to_tty(device); #endif int oflags = O_RDWR | O_NOCTTY | O_NDELAY; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif fd = fl_open( device.c_str(), oflags); if (fd < 0) return false; // the status port must be set before any other control attributes are // changed. Failure to do so will cause DTR/RTS h/w transients !! ioctl(fd, TIOCMGET, &status); origstatus = status; if (dtr) status |= TIOCM_DTR; // set the DTR bit else status &= ~TIOCM_DTR; // clear the DTR bit if (rtscts == false) { // rts OK for ptt if RTSCTS not used if (rts) status |= TIOCM_RTS; // set the RTS bit else status &= ~TIOCM_RTS; // clear the RTS bit } ioctl(fd, TIOCMSET, &status); // save current port settings tcflush (fd, TCIFLUSH); tcgetattr (fd, &oldtio); // newtio = oldtio; // 8 data bits newtio.c_cflag &= ~CSIZE; newtio.c_cflag |= CS8; // enable receiver, set local mode newtio.c_cflag |= (CLOCAL | CREAD); // no parity newtio.c_cflag &= ~PARENB; if (stopbits == 1) // 1 stop bit newtio.c_cflag &= ~CSTOPB; else // 2 stop bit newtio.c_cflag |= CSTOPB; if (rtscts) // h/w handshake newtio.c_cflag |= CRTSCTS; else // no h/w handshake newtio.c_cflag &= ~CRTSCTS; // raw input newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // raw output newtio.c_oflag &= ~OPOST; // software flow control disabled newtio.c_iflag &= ~IXON; // do not translate CR to NL newtio.c_iflag &= ~ICRNL; switch(baud) { case 50: speed = B50; break; case 300: speed = B300; break; case 1200: speed = B1200; break; case 2400: speed = B2400; break; case 4800: speed = B4800; break; case 9600: speed = B9600; break; case 19200: speed = B19200; break; case 38400: speed = B38400; break; case 57600: speed = B57600; break; case 115200: speed = B115200; break; default: speed = B1200; } cfsetispeed(&newtio, speed); cfsetospeed(&newtio, speed); tcsetattr (fd, TCSANOW, &newtio); return true; } void Cserial::SetDTR(bool b) { ioctl(fd, TIOCMGET, &status); origstatus = status; if (b) status |= TIOCM_DTR; // set the DTR bit else status &= ~TIOCM_DTR; // clear the DTR bit ioctl(fd, TIOCMSET, &status); } void Cserial::SetRTS(bool b) { ioctl(fd, TIOCMGET, &status); origstatus = status; if (b) status |= TIOCM_RTS; // set the RTS bit else status &= ~TIOCM_RTS; // clear the RTS bit ioctl(fd, TIOCMSET, &status); } /////////////////////////////////////////////////////// // Function name : Cserial::setPTT // Return type : void /////////////////////////////////////////////////////// void Cserial::SetPTT(bool b) { if (fd < 0) { LOG_DEBUG("PTT fd < 0"); return; } if (dtrptt || rtsptt) { ioctl(fd, TIOCMGET, &status); LOG_DEBUG("H/W PTT %d, status %X", b, status); if (b == true) { // ptt enabled if (dtrptt && dtr) status &= ~TIOCM_DTR; // toggle low if (dtrptt && !dtr) status |= TIOCM_DTR; // toggle high if (rtscts == false) { if (rtsptt && rts) status &= ~TIOCM_RTS; // toggle low if (rtsptt && !rts) status |= TIOCM_RTS; // toggle high } } else { // ptt disabled if (dtrptt && dtr) status |= TIOCM_DTR; // toggle high if (dtrptt && !dtr) status &= ~TIOCM_DTR; // toggle low if (rtscts == false) { if (rtsptt && rts) status |= TIOCM_RTS; // toggle high if (rtsptt && !rts) status &= ~TIOCM_RTS; // toggle low } } LOG_DEBUG("Status %02X, %s", status & 0xFF, uint2bin(status, 8)); ioctl(fd, TIOCMSET, &status); } // LOG_DEBUG("No PTT specified"); LOG_VERBOSE("No PTT specified"); } /////////////////////////////////////////////////////// // Function name : Cserial::ClosePort // Description : Closes the Port // Return type : void /////////////////////////////////////////////////////// void Cserial::ClosePort() { if (fd < 0) return; if (restore_tio) { // Some serial drivers force RTS and DTR high immediately upon // opening the port, so our origstatus will indicate those bits // high (though the lines weren't actually high before we opened). // But then when we "restore" RTS and DTR from origstatus here // it can result in PTT activation upon program exit! To avoid // this possibility, we ignore the apparentl initial settings, and // instead force RTS and DTR low before closing the port. (Just // omitting the ioctl(TIOCMSET) would also resolve the problem). // Kamal Mostafa origstatus &= ~(TIOCM_RTS|TIOCM_DTR); ioctl(fd, TIOCMSET, &origstatus); tcsetattr (fd, TCSANOW, &oldtio); } close(fd); fd = -1; LOG_VERBOSE("Serial port closed, fd = %d", fd); return; } bool Cserial::IOselect () { fd_set rfds; struct timeval tv; int retval; FD_ZERO (&rfds); FD_SET (fd, &rfds); tv.tv_sec = timeout/1000; tv.tv_usec = (timeout % 1000) * 1000; retval = select (FD_SETSIZE, &rfds, (fd_set *)0, (fd_set *)0, &tv); if (retval <= 0) // no response from serial port or error returned return false; return true; } /////////////////////////////////////////////////////// // Function name : Cserial::ReadByte // Description : Reads 1 char from the selected port // Return type : 1 - success, 0 - failure // Argument : reference to character /////////////////////////////////////////////////////// bool Cserial::ReadByte(unsigned char &c) { static char ch[2]; c = ch[0] = ch[1] = 0; if (fd < 0) return 0; if (!IOselect()) return 0; if (read (fd, (void *)ch, 1) < 0) return 0; c = ch[0]; return 1; } /////////////////////////////////////////////////////// // Function name : Cserial::ReadBuffer // Description : Reads upto nchars from the selected port // Return type : # characters received // Argument : pointer to buffer; # chars to read /////////////////////////////////////////////////////// int Cserial::ReadBuffer (unsigned char *buf, int nchars) { if (fd < 0) return 0; int retnum, nread = 0; size_t start = zusec(); unsigned char buffer[500]; while (((zusec() - start) < (size_t)(timeout * 1000))) { if (IOselect()) { retnum = read (fd, (char *)(buffer + nread), 500 - nread); if (retnum > 0) nread += retnum; if (nread >= nchars) break; } else MilliSleep(1); } if (nread == 0) return 0; std::string buff; for (int n = 0; n < nread; n++) buff += buffer[n]; // remove any ICOM echo bytes if (((int)buff.length() >= bytes_written) && ((buff[0] & 0xFF) == 0xFE) && ((buff[1] & 0xFF) == 0xFE) && ((buff[3] & 0xFF) == 0xE0) ) { buff = buff.substr(bytes_written); if (!buff.length()) { LOG_ERROR("READ failed (%0.2f msec)", ((zusec() - start)/1000.0)); return 0; } } memcpy(buf, buff.c_str(), buff.length()); if (check_hex(buff.c_str(), buff.length())) LOG_VERBOSE("ReadData (%0.2f msec) [%lu]: %s", (zusec() - start) / 1000.0, buff.length(), str2hex(buff.c_str(), buff.length())); else LOG_VERBOSE("ReadData (%0.2f msec) [%lu]: %s", (zusec() - start) / 1000.0, buff.length(), buff.c_str()); return buff.length(); } /////////////////////////////////////////////////////// // Function name : Cserial::WriteBuffer // Description : Writes a string to the selected port // Return type : BOOL // Argument : BYTE by /////////////////////////////////////////////////////// int Cserial::WriteBuffer(unsigned char *buff, int n) { if (fd < 0) { LOG_DEBUG("%s", "WriteBuffer(...) fd < 0"); bytes_written = 0; return 0; } if ( isalnum(buff[0] & 0xFF) ) LOG_VERBOSE("WriteBuffer: %s", buff); else LOG_VERBOSE("WriteBuffer: %s", str2hex(buff, n) ); int ret = write (fd, buff, n); bytes_written = n; return ret; } /////////////////////////////////////////////////////// // Function name : Cserial::FlushBuffer // Description : flushes the pending rx chars // Return type : void /////////////////////////////////////////////////////// void Cserial::FlushBuffer() { if (fd < 0) return; tcflush (fd, TCIFLUSH); } #else // __MINGW32__ //====================================================================== // Win32 support code //====================================================================== #include #include "estrings.h" /////////////////////////////////////////////////////// // Function name : Cserial::OpenPort // Description : Opens the port specified by strPortName // Return type : BOOL // Argument : CString strPortName /////////////////////////////////////////////////////// BOOL Cserial::OpenPort() { std::string COMportname = "//./"; tty_to_com(device); COMportname += device; hComm = CreateFile( COMportname.c_str(), // lpFileName GENERIC_READ | GENERIC_WRITE, // dwDesiredAccess 0, // dwSharedMode 0, // lpSecurityAttributes OPEN_EXISTING, // dwCreationDisposition 0, // dwFlagAndAttributes 0); // hTemplateFile LOG_INFO("Open COM port %s, handle = %p", device.c_str(), hComm); if(hComm == INVALID_HANDLE_VALUE) { errno = GetLastError(); LOG_ERROR("%s", win_error_string(errno).c_str()); return FALSE; } if (!ConfigurePort( baud, 8, FALSE, NOPARITY, stopbits)) { errno = GetLastError(); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; LOG_ERROR("%s", win_error_string(errno).c_str()); return FALSE; } // FlushBuffer(); return TRUE; } /////////////////////////////////////////////////////// // Function name : Cserial::ClosePort // Description : Closes the Port // Return type : void /////////////////////////////////////////////////////// void Cserial::ClosePort() { LOG_INFO("Close port, handle = %p", hComm); if (hComm == INVALID_HANDLE_VALUE) return; if (restore_tio) { LOG_VERBOSE("Closing COM port#1, handle = %p", hComm); bPortReady = SetCommTimeouts (hComm, &CommTimeoutsSaved); } if (CloseHandle(hComm) == 0) { LOG_VERBOSE("ERROR Closing COM port, handle = %p", hComm); } LOG_INFO("COM, handle = %p closed", hComm); hComm = INVALID_HANDLE_VALUE; return; } /* BOOL ReadFile( [in] HANDLE hFile, [out] LPVOID lpBuffer, [in] DWORD nNumberOfBytesToRead, [out, optional] LPDWORD lpNumberOfBytesRead, [in, out, optional] LPOVERLAPPED lpOverlapped [in] hFile A handle to the device (for example, a file, file stream, physical disk, volume, console buffer, tape drive, socket, communications resource, mailslot, or pipe). The hFile parameter must have been created with read access. [out] lpBuffer A pointer to the buffer that receives the data read from a file or device. This buffer must remain valid for the duration of the read operation. The caller must not use this buffer until the read operation is completed. [in] nNumberOfBytesToRead); The maximum number of bytes to be read. If the function succeeds, the return value is nonzero (TRUE). If the function fails, or is completing asynchronously, the return value is zero (FALSE). To get extended error information, call the GetLastError function. The GetLastError code ERROR_IO_PENDING is not a failure; it designates the read operation is pending completion asynchronously. */ int Cserial::ReadData (unsigned char *buf, int nchars) { if (hComm == INVALID_HANDLE_VALUE) return 0; DWORD thisread = 0; unsigned int maxchars = nchars + nBytesWritten; unsigned char uctemp[maxchars + 1]; bool echo = false; bool retval = false; double start = zusec(); std::string sbuf; sbuf.clear(); while ( (zusec() - start) < (timeout * 1000.0) ) { memset(uctemp, 0, sizeof(uctemp)); if ( (retval = ReadFile (hComm, uctemp, maxchars, &thisread, NULL)) > 0 ) { for (size_t n = 0; n < thisread; n++) sbuf += uctemp[n]; } // test for icom echo if ((sbuf.length() >= (size_t)nchars) && ((sbuf[3] & 0xFF) == 0xE0)) echo = true; if (sbuf.length() >= (echo ? maxchars : nchars)) break; if (!thisread || !retval) MilliSleep(1); } if (echo) sbuf = sbuf.substr(nBytesWritten); if (sbuf.length() > (size_t)nchars) sbuf.erase(nchars); if (!sbuf.empty()) memcpy(buf, sbuf.c_str(), sbuf.length()); else { LOG_VERBOSE("ReadData FAILED [%0.3f]", (zusec() -start) / 1000.0); return 0; } LOG_VERBOSE("ReadData [%0.3f]: %s", (zusec() - start) / 1000.0, (sbuf[0] & 0xFF) == 0xFE ? str2hex(sbuf.c_str(), sbuf.length()) : sbuf.c_str()); return sbuf.length(); } BOOL Cserial::ReadByte(unsigned char & by) { static BYTE byResByte[2]; int got_one = ReadData(byResByte, 1); LOG_INFO("Read %d byte on handle %p", got_one, hComm); if (got_one == 1) { by = byResByte[0]; return true; } return false; } void Cserial::FlushBuffer() { unsigned char c; nBytesWritten = 0; while (ReadByte(c) == true); } /////////////////////////////////////////////////////// // Function name : Cserial::WriteByte // Description : Writes a Byte to teh selected port // Return type : BOOL // Argument : BYTE by /////////////////////////////////////////////////////// BOOL Cserial::WriteByte(UCHAR by) { if (hComm == INVALID_HANDLE_VALUE) return FALSE; nBytesWritten = 0; if (WriteFile(hComm,&by,1,&nBytesWritten,NULL)==0) { errno = GetLastError(); LOG_PERROR(win_error_string(errno).c_str()); return FALSE; } return TRUE; } /////////////////////////////////////////////////////// // Function name : Cserial::WriteBuffer // Description : Writes a string to the selected port // Return type : BOOL // Argument : BYTE by /////////////////////////////////////////////////////// int Cserial::WriteBuffer(unsigned char *buff, int n) { if (hComm == INVALID_HANDLE_VALUE) return 0; LOG_INFO("WRITE: %s", str2hex((char *)buff, n)); if (WriteFile (hComm, buff, n, &nBytesWritten, NULL) == 0) { errno = GetLastError(); LOG_PERROR(win_error_string(errno).c_str()); return 0; } return nBytesWritten; } /////////////////////////////////////////////////////// // Function name : Cserial::SetCommunicationTimeouts // Description : Sets the timeout for the selected port // Return type : BOOL // Argument : DWORD ReadIntervalTimeout // Argument : DWORD ReadTotalTimeoutMultiplier // Argument : DWORD ReadTotalTimeoutConstant // Argument : DWORD WriteTotalTimeoutMultiplierCOMM // Argument : DWORD WriteTotalTimeoutConstant /////////////////////////////////////////////////////// BOOL Cserial::SetCommunicationTimeouts( DWORD ReadIntervalTimeout, // msec DWORD ReadTotalTimeoutMultiplier, DWORD ReadTotalTimeoutConstant, DWORD WriteTotalTimeoutMultiplier, DWORD WriteTotalTimeoutConstant ) { CommTimeouts.ReadIntervalTimeout = ReadIntervalTimeout; CommTimeouts.ReadTotalTimeoutMultiplier = ReadTotalTimeoutMultiplier; CommTimeouts.ReadTotalTimeoutConstant = ReadTotalTimeoutConstant; CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant; CommTimeouts.WriteTotalTimeoutMultiplier = WriteTotalTimeoutMultiplier; LOG_INFO("\n\ Read Interval Timeout............... %8ld %8ld\n\ Read Total Timeout Multiplier....... %8ld %8ld\n\ Read Total Timeout Constant Timeout. %8ld %8ld\n\ Write Total Timeout Constant........ %8ld %8ld\n\ Write Total Timeout Multiplier...... %8ld %8ld", CommTimeoutsSaved.ReadIntervalTimeout, CommTimeouts.ReadIntervalTimeout, CommTimeoutsSaved.ReadTotalTimeoutMultiplier, CommTimeouts.ReadTotalTimeoutMultiplier, CommTimeoutsSaved.ReadTotalTimeoutConstant, CommTimeouts.ReadTotalTimeoutConstant, CommTimeoutsSaved.WriteTotalTimeoutConstant, CommTimeouts.WriteTotalTimeoutConstant, CommTimeoutsSaved.WriteTotalTimeoutMultiplier, CommTimeouts.WriteTotalTimeoutMultiplier); bPortReady = SetCommTimeouts (hComm, &CommTimeouts); if(bPortReady ==0) { LOG_PERROR(win_error_string(GetLastError()).c_str()); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; return FALSE; } return TRUE; } /* * ReadIntervalTimeout * * The maximum time allowed to elapse between the arrival of two bytes on the * communications line, in milliseconds. During a ReadFile operation, the time * period begins when the first byte is received. If the interval between the * arrival of any two bytes exceeds this amount, the ReadFile operation is * completed and any buffered data is returned. A value of zero indicates that * interval time-outs are not used. * * A value of MAXDWORD, combined with zero values for both the * ReadTotalTimeoutConstant and ReadTotalTimeoutMultiplier members, specifies * that the read operation is to return immediately with the bytes that have * already been received, even if no bytes have been received. * * ReadTotalTimeoutMultiplier * * The multiplier used to calculate the total time-out period for read * operations, in milliseconds. For each read operation, this value is * multiplied by the requested number of bytes to be read. * * ReadTotalTimeoutConstant * * A constant used to calculate the total time-out period for read operations, * in milliseconds. For each read operation, this value is added to the product * of the ReadTotalTimeoutMultiplier member and the requested number of bytes. * * A value of zero for both the ReadTotalTimeoutMultiplier and * ReadTotalTimeoutConstant members indicates that total time-outs are not * used for read operations. * * WriteTotalTimeoutMultiplier * * The multiplier used to calculate the total time-out period for write * operations, in milliseconds. For each write operation, this value is * multiplied by the number of bytes to be written. * * WriteTotalTimeoutConstant * * A constant used to calculate the total time-out period for write operations, * in milliseconds. For each write operation, this value is added to the product * of the WriteTotalTimeoutMultiplier member and the number of bytes to be * written. * * A value of zero for both the WriteTotalTimeoutMultiplier and * WriteTotalTimeoutConstant members indicates that total time-outs are not * used for write operations. * * Remarks * * If an application sets ReadIntervalTimeout and ReadTotalTimeoutMultiplier to * MAXDWORD and sets ReadTotalTimeoutConstant to a value greater than zero and * less than MAXDWORD, one of the following occurs when the ReadFile function * is called: * * If there are any bytes in the input buffer, ReadFile returns immediately * with the bytes in the buffer. * * If there are no bytes in the input buffer, ReadFile waits until a byte * arrives and then returns immediately. * * If no bytes arrive within the time specified by ReadTotalTimeoutConstant, * ReadFile times out. */ BOOL Cserial::SetCommTimeout() { return SetCommunicationTimeouts ( MAXDWORD, // Read Interval Timeout MAXDWORD, // Read Total Timeout Multiplier 10, // Read Total Timeout Constant 50, // Write Total Timeout Constant 5 // Write Total Timeout Multiplier ); } /////////////////////////////////////////////////////// // Function name : ConfigurePort // Description : Configures the Port // Return type : BOOL // Argument : DWORD BaudRate // Argument : BYTE ByteSize // Argument : DWORD fParity // Argument : BYTE Parity // Argument : BYTE StopBits /////////////////////////////////////////////////////// BOOL Cserial::ConfigurePort ( DWORD BaudRate, BYTE ByteSize, DWORD dwParity, BYTE Parity, BYTE StopBits) { LOG_INFO("Try ConfigurePort: %p", hComm); if (hComm == INVALID_HANDLE_VALUE) return false; if((bPortReady = GetCommState(hComm, &dcb))==0) { errno = GetLastError(); LOG_ERROR( "GetCommState: %s", win_error_string(errno).c_str()); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; return FALSE; } LOG_INFO("\n\ Get Comm State:\n\ hComm %p\n\ DCB.DCBlength %d\n\ DCB.Baudrate %d\n\ DCB.ByteSize %d\n\ DCB.Parity %d\n\ DCB.StopBits %d\n\ DCB.Binary %d\n\ DCB.fDtrControl %d\n\ DCB.fRtsControl %d\n\ DCB.fDsrSensitivity %d\n\ DCB.fParity %d\n\ DCB.fOutX %d\n\ DCB.fInX %d\n\ DCB.fNull %d\n\ DCB.XonChar %d\n\ DCB.XoffChar %d\n\ DCB.fAbortOnError %d\n\ DCB.fOutxCtsFlow %d\n\ DCB.fOutxDsrFlow %d\n", hComm, (int)dcb.DCBlength, (int)dcb.BaudRate, (int)dcb.ByteSize, (int)dcb.Parity, (int)dcb.StopBits, (int)dcb.fBinary, (int)dcb.fDtrControl, (int)dcb.fRtsControl, (int)dcb.fDsrSensitivity, (int)dcb.fParity, (int)dcb.fOutX, (int)dcb.fInX, (int)dcb.fNull, (int)dcb.XonChar, (int)dcb.XoffChar, (int)dcb.fAbortOnError, (int)dcb.fOutxCtsFlow, (int)dcb.fOutxDsrFlow); dcb.DCBlength = sizeof (dcb); dcb.BaudRate = BaudRate; dcb.ByteSize = ByteSize; dcb.Parity = Parity ; if (dcb.StopBits) // corrects a driver malfunction in the Yaesu SCU-17 dcb.StopBits = (StopBits == 1 ? ONESTOPBIT : TWOSTOPBITS); dcb.fBinary = true; dcb.fDsrSensitivity = false; dcb.fParity = false; dcb.fOutX = false; dcb.fInX = false; dcb.fNull = false; dcb.fAbortOnError = false; dcb.fOutxCtsFlow = false; dcb.fOutxDsrFlow = false; dcb.fErrorChar = false; if (dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE; else dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = FALSE; if (rtscts) dcb.fRtsControl = RTS_CONTROL_ENABLE; else { if (rts) dcb.fRtsControl = RTS_CONTROL_ENABLE; else dcb.fRtsControl = RTS_CONTROL_DISABLE; } LOG_INFO("\n\ Set Comm State:\n\ hComm %p\n\ DCB.DCBlength %d\n\ DCB.Baudrate %d\n\ DCB.ByteSize %d\n\ DCB.Parity %d\n\ DCB.StopBits %d\n\ DCB.Binary %d\n\ DCB.fDtrControl %d\n\ DCB.fRtsControl %d\n\ DCB.fDsrSensitivity %d\n\ DCB.fParity %d\n\ DCB.fOutX %d\n\ DCB.fInX %d\n\ DCB.fNull %d\n\ DCB.XonChar %d\n\ DCB.XoffChar %d\n\ DCB.fAbortOnError %d\n\ DCB.fOutxCtsFlow %d\n\ DCB.fOutxDsrFlow %d\n", hComm, (int)dcb.DCBlength, (int)dcb.BaudRate, (int)dcb.ByteSize, (int)dcb.Parity, (int)dcb.StopBits, (int)dcb.fBinary, (int)dcb.fDtrControl, (int)dcb.fRtsControl, (int)dcb.fDsrSensitivity, (int)dcb.fParity, (int)dcb.fOutX, (int)dcb.fInX, (int)dcb.fNull, (int)dcb.XonChar, (int)dcb.XoffChar, (int)dcb.fAbortOnError, (int)dcb.fOutxCtsFlow, (int)dcb.fOutxDsrFlow); bPortReady = SetCommState(hComm, &dcb); if(bPortReady == 0) { errno = GetLastError(); LOG_ERROR("SetCommState: %s", win_error_string(errno).c_str()); CloseHandle(hComm); hComm = INVALID_HANDLE_VALUE; return FALSE; } // if ( (bPortReady = GetCommTimeouts (hComm, &CommTimeoutsSaved) ) == 0) // return FALSE; return SetCommTimeout(); } /////////////////////////////////////////////////////// // Function name : Cserial::setPTT // Return type : void /////////////////////////////////////////////////////// void Cserial::SetPTT(bool ON) { if(hComm == INVALID_HANDLE_VALUE) { LOG_PERROR("Invalid handle"); return; } LOG_INFO("PTT = %d, hcomm = %p, DTRptt = %d, DTR = %d, RTSptt = %d, RTS = %d", ON, hComm, dtrptt, dtr, rtsptt, rts); if (ON) { if (dtrptt && dtr) dcb.fDtrControl = DTR_CONTROL_DISABLE; if (dtrptt && !dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE; if (!rtscts) { if (rtsptt && rts) dcb.fRtsControl = RTS_CONTROL_DISABLE; if (rtsptt && !rts) dcb.fRtsControl = RTS_CONTROL_ENABLE; } } else { if (dtrptt && dtr) dcb.fDtrControl = DTR_CONTROL_ENABLE; if (dtrptt && !dtr) dcb.fDtrControl = DTR_CONTROL_DISABLE; if (!rtscts) { if (rtsptt && rts) dcb.fRtsControl = RTS_CONTROL_ENABLE; if (rtsptt && !rts) dcb.fRtsControl = RTS_CONTROL_DISABLE; } } SetCommState(hComm, &dcb); } void Cserial::SetDTR(bool b) { if(hComm == INVALID_HANDLE_VALUE) { LOG_PERROR("Invalid handle"); return; } if (b) EscapeCommFunction(hComm, SETDTR); else EscapeCommFunction(hComm, CLRDTR); } void Cserial::SetRTS(bool b) { if(hComm == INVALID_HANDLE_VALUE) { LOG_PERROR("Invalid handle"); return; } if (b) EscapeCommFunction(hComm, SETRTS); else EscapeCommFunction(hComm, CLRRTS); } //====================================================================== // end Win32 code //====================================================================== #endif //__MINGW32__ #ifdef __WOE32__ #include #include "re.h" // convert COMx to /dev/ttySy with y = x - 1 void com_to_tty(std::string& port) { re_t re("com([0-9]+)", REG_EXTENDED | REG_ICASE); if (!(re.match(port.c_str()) && re.nsub() == 2)) return; std::stringstream ss; int n; ss << re.submatch(1); ss >> n; if (--n < 0) n = 0; ss.clear(); ss.str(""); ss << "/dev/ttyS" << n; ss.seekp(0); port = ss.str(); } // convert /dev/ttySx to COMy with y = x + 1 void tty_to_com(std::string& port) { re_t re("/dev/tty.([0-9]+)", REG_EXTENDED | REG_ICASE); if (!(re.match(port.c_str()) && re.nsub() == 2)) return; std::stringstream ss; int n; ss << re.submatch(1); ss >> n; ss.clear(); ss.str(""); ss << "COM" << n + 1; ss.seekp(0); port = ss.str(); } #endif fldigi-4.2.05/src/rigcontrol/ptt.cxx0000664000175000017500000004206214611711171014273 00000000000000// ---------------------------------------------------------------------------- // // ptt.cxx -- PTT control // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2009 // Diane Bruce, VA3DB // // Added gpio for PTT (Lior KK6BWA) // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // Copyright (C) 2004 // Lawrence Glaister (ve7it@shaw.ca) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #if HAVE_SYS_SELECT_H # include #endif #include #include #if HAVE_SYS_IOCTL_H # include #endif #if HAVE_TERMIOS_H # include #endif #include #include #include #include "trx.h" #include "ptt.h" #include "configuration.h" #include "rigio.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "serial.h" #include "re.h" #include "debug.h" #include "fl_digi.h" #include "confdialog.h" #include "n3fjp_logger.h" #include "cmedia.h" LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); extern Cserial CW_KEYLINE_serial; int cmedia_fd = -1; PTT::PTT(ptt_t dev) : pttdev(PTT_INVALID), oldtio(0) { reset(dev); } PTT::~PTT() { close_all(); } void PTT::reset(ptt_t dev) { close_all(); switch (pttdev = dev) { #if HAVE_UHROUTER case PTT_UHROUTER: if (progdefaults.PTTdev.find(UHROUTER_FIFO_PREFIX) == 0) { pttdev = PTT_UHROUTER; open_uhrouter(); break; } else { pttdev = PTT_NONE; break; } #endif #if HAVE_PARPORT case PTT_PARPORT: open_parport(); if (pttfd < 0) pttdev = PTT_NONE; break; #endif case PTT_TTY: open_tty(); break; case PTT_CMEDIA: cmedia_fd = open_cmedia(progdefaults.cmedia_device); break; default: break; // nothing to open } open_gpio(); set(false); } void PTT::set(bool ptt) { std::string ptt_temp = pttdev == PTT_NONE ? "NONE" : pttdev == PTT_HAMLIB ? "HAMLIB" : pttdev == PTT_RIGCAT ? "RIGCAT" : pttdev == PTT_TTY ? "TTY" : pttdev == PTT_GPIO ? "GPIO" : pttdev == PTT_CMEDIA ? "CMEDIA" : pttdev == PTT_PARPORT ? "PARPORT" : pttdev == PTT_UHROUTER ? "UHROUTER" : "UNKNOWN"; LOG_INFO("PTT via %s : %s", ptt_temp.c_str(), ptt ? "ON" : "OFF"); // add milliseconds - no audio to clear virtual audio card used by Flex systems if (!ptt && progdefaults.PTT_off_delay) MilliSleep(progdefaults.PTT_off_delay); if (active_modem == cw_modem && (CW_KEYLINE_isopen || progdefaults.CW_KEYLINE_on_cat_port)) { guard_lock lk(&cwio_ptt_mutex); } switch (pttdev) { case PTT_NONE: if (n3fjp_connected) n3fjp_set_ptt(ptt); else noCAT_setPTT(ptt); break; #if USE_HAMLIB case PTT_HAMLIB: hamlib_set_ptt(ptt); break; #endif case PTT_RIGCAT: rigCAT_set_ptt(ptt); break; case PTT_TTY: set_tty(ptt); break; case PTT_GPIO: set_gpio(ptt); break; #if HAVE_PARPORT case PTT_PARPORT: set_parport(ptt); break; #else btnUsePPortPTT->hide(); #endif #if HAVE_UHROUTER case PTT_UHROUTER: set_uhrouter(ptt); break; #endif case PTT_CMEDIA: if (cmedia_fd != -1) { int bitnbr = 2; if (progdefaults.cmedia_gpio_line == "GPIO-1") bitnbr = 0; else if (progdefaults.cmedia_gpio_line == "GPIO-2") bitnbr = 1; else if (progdefaults.cmedia_gpio_line == "GPIO-3") bitnbr = 2; else if (progdefaults.cmedia_gpio_line == "GPIO-4") bitnbr = 3; set_cmedia(bitnbr, ptt); } break; default: break; } nano_PTT(ptt); if (ptt && progdefaults.PTT_on_delay) MilliSleep(progdefaults.PTT_on_delay); if (ptt) start_tx_timer(); else stop_tx_timer(); } void PTT::close_all(void) { set(false); switch (pttdev) { case PTT_TTY: close_tty(); break; #if HAVE_PARPORT case PTT_PARPORT: close_parport(); break; #endif #if HAVE_UHROUTER case PTT_UHROUTER: close_uhrouter(); break; #endif default: break; } close_gpio(); pttfd = -1; } //-------------------- gpio port PTT --------------------// #ifndef __MINGW32__ static void gpioEXEC(std::string execstr) { int pfd[2]; if (pipe(pfd) == -1) { LOG_PERROR("pipe"); return; } pid_t pid; switch (pid = fork()) { case -1: LOG_PERROR("fork"); return; case 0: // child close(pfd[0]); if (dup2(pfd[1], STDOUT_FILENO) != STDOUT_FILENO) { LOG_PERROR("dup2"); exit(EXIT_FAILURE); } close(pfd[1]); execl("/bin/sh", "sh", "-c", execstr.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } // parent close(pfd[1]); } #else // !__MINGW32__ static void gpioEXEC(std::string execstr) { char* cmd = strdup(execstr.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd); } #endif // !__MINGW32__ static const char *gpio_name[] = { "17", "18", "27", "22", "23", "24", "25", "4", "5", "6", "13", "19", "26", "12", "16", "20", "21"}; void export_gpio(int bcm) { if (bcm < 0 || bcm > 16) return; std::string exec_str = "echo "; exec_str.append(gpio_name[bcm]).append(" >/sys/class/gpio/export"); gpioEXEC(exec_str); LOG_INFO("%s", exec_str.c_str()); // Wait a bit for OS to set file permissions MilliSleep(100); exec_str = "echo 'out' >/sys/class/gpio/gpio"; exec_str.append(gpio_name[bcm]).append("/direction"); gpioEXEC(exec_str); LOG_INFO("%s", exec_str.c_str()); } void unexport_gpio(int bcm) { if (bcm < 0 || bcm > 16) return; std::string exec_str = "echo "; exec_str.append(gpio_name[bcm]).append(" >/sys/class/gpio/unexport"); gpioEXEC(exec_str); LOG_INFO("%s", exec_str.c_str()); } void PTT::open_gpio(void) { bool enabled = false; for (int i = 0; i < 17; i++) { enabled = (progdefaults.enable_gpio >> i) & 0x01; if (enabled) export_gpio(i); } } void PTT::close_gpio(void) { bool enabled = false; for (int i = 0; i < 17; i++) { enabled = (progdefaults.enable_gpio >> i) & 0x01; if (enabled) unexport_gpio(i); } } void PTT::set_gpio(bool ptt) { #define VALUE_MAX 30 static const char s_values_str[] = "01"; std::string portname = "/sys/class/gpio/gpio"; std::string ctrlport; bool enabled = false; int val = 0; int fd; for (int i = 0; i < 17; i++) { enabled = (progdefaults.enable_gpio >> i) & 0x01; if (enabled) { val = (progdefaults.gpio_on >> i) & 0x01; ctrlport = portname; ctrlport.append(gpio_name[i]); ctrlport.append("/value"); fd = fl_open(ctrlport.c_str(), O_WRONLY); bool ok = false; if (fd == -1) { LOG_ERROR("Failed to open gpio (%s) for writing!", ctrlport.c_str()); } else { if (progdefaults.gpio_pulse_width == 0) { if (ptt) { if (val == 1) val = 1; else val = 0;} if (!ptt) { if (val == 1) val = 0; else val = 1;} if (write(fd, &s_values_str[val], 1) == 1) ok = true; } else { if (write(fd, &s_values_str[val], 1) == 1) { MilliSleep(progdefaults.gpio_pulse_width); if (write(fd, &s_values_str[val == 0 ? 1 : 0], 1) == 1) ok = true; } } if (ok) LOG_INFO("Set GPIO ptt on %s %s%s", ctrlport.c_str(), (progdefaults.gpio_pulse_width > 0) ? "pulsed " : "", (val == 1 ? "HIGH" : "LOW") ); else LOG_ERROR("Failed to write value!"); close(fd); } } } } //-------------------- serial port PTT --------------------// void PTT::open_tty(void) { serPort.Baud(progdefaults.BaudRate(progdefaults.XmlRigBaudrate)); serPort.Device(progdefaults.PTTdev); serPort.RTS(progdefaults.RTSplus); serPort.DTR(progdefaults.DTRplus); serPort.RTSptt(progdefaults.RTSptt); serPort.DTRptt(progdefaults.DTRptt); if (progdefaults.SCU_17) serPort.Stopbits(0);//1); else serPort.Stopbits(2); if (serPort.OpenPort() == false) { LOG_ERROR("Cannot open PTT port %s", progdefaults.PTTdev.c_str()); pttfd = -1; return; } LOG_INFO("PTT port %s open", progdefaults.PTTdev.c_str()); } void PTT::close_tty(void) { serPort.ClosePort(); pttfd = -1; LOG_DEBUG("Serial port %s closed", progdefaults.PTTdev.c_str()); } void PTT::set_tty(bool ptt) { serPort.SetPTT(ptt); } #if HAVE_PARPORT //-------------------- parallel port PTT --------------------// #if HAVE_LINUX_PPDEV_H # include # include #elif HAVE_DEV_PPBUS_PPI_H # include # include #endif void PTT::open_parport(void) { if (progdefaults.PTTdev.find("tty") != std::string::npos) return; int oflags = O_RDWR | O_NDELAY; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((pttfd = fl_open(progdefaults.PTTdev.c_str(), oflags)) == -1) { LOG_ERROR("Could not open %s: %s", progdefaults.PTTdev.c_str(), strerror(errno)); return; } bool isparport = false; struct stat st; int status; #if HAVE_LINUX_PPDEV_H // Linux (ppdev) isparport = (fstat(pttfd, &st) == 0 && S_ISCHR(st.st_mode) && ioctl(pttfd, PPGETMODE, &status) != -1); #elif HAVE_DEV_PPBUS_PPI_H // FreeBSD (ppbus/ppi) */ isparport = (fstat(pttfd, &st) == 0 && S_ISCHR(st.st_mode) && ioctl(pttfd, PPISSTATUS, &status) != -1); #else // Fallback (nothing) isparport = false; #endif if (!isparport) { LOG_VERBOSE("%s: not a supported parallel port device", progdefaults.PTTdev.c_str()); close_parport(); pttfd = -1; } } void PTT::close_parport(void) { close(pttfd); } void PTT::set_parport(bool ptt) { #ifdef HAVE_LINUX_PPDEV_H struct ppdev_frob_struct frob; frob.mask = PARPORT_CONTROL_INIT; frob.val = !ptt; ioctl(pttfd, PPFCONTROL, &frob); #elif HAVE_DEV_PPBUS_PPI_H u_int8_t val; ioctl(pttfd, PPIGCTRL, &val); if (ptt) val |= nINIT; else val &= ~nINIT; ioctl(pttfd, PPISCTRL, &val); #endif } #endif // HAVE_PARPORT #if HAVE_UHROUTER //-------------------- uhRouter PTT --------------------// // See interface documentation at: // http://homepage.mac.com/chen/w7ay/Router/Contents/routerInterface.html #define FUNCTIONMASK 0x1f #define ROUTERFUNCTION 0x80 #define OPENMICROKEYER (ROUTERFUNCTION + 0x01) // get a port to the microKEYER router #define OPENCWKEYER (ROUTERFUNCTION + 0x02) // get a port to the CW KEYER router #define OPENDIGIKEYER (ROUTERFUNCTION + 0x03) // get a port to the DIGI KEYER router #define QUITIFNOKEYER (ROUTERFUNCTION + 0x1f) // quit if there are no keyers #define QUITIFNOTINUSE (ROUTERFUNCTION + 0x1e) // quit if not connected #define QUITALWAYS (ROUTERFUNCTION + 0x1d) // quit #define CLOSEKEYER (ROUTERFUNCTION + FUNCTIONMASK) #define KEYERFUNCTION 0x40 #define OPENPTT (KEYERFUNCTION + 0x04) // get a port to the PTT flag bit #ifndef PATH_MAX # define PATH_MAX 1024 #endif static ssize_t tm_read(int fd, void* buf, size_t len, const struct timeval* to) { fd_set s; FD_ZERO(&s); FD_SET(fd, &s); struct timeval t; memcpy(&t, to, sizeof(t)); ssize_t n; if ((n = select(fd + 1, &s, 0, 0, &t)) != 1) return n; return read(fd, buf, len); } static ssize_t tm_write(int fd, const void* buf, size_t len, const struct timeval* to) { fd_set s; FD_ZERO(&s); FD_SET(fd, &s); struct timeval t; memcpy(&t, to, sizeof(t)); ssize_t n; if ((n = select(fd + 1, 0, &s, 0, &t)) != 1) return n; return write(fd, buf, len); } static bool open_fifos(const char* base, int fd[2]) { struct stat st; std::string fifo = base; size_t len = fifo.length(); fifo += "Read"; if (stat(fifo.c_str(), &st) == -1 || !S_ISFIFO(st.st_mode)) { LOG_ERROR("%s is not a fifo", fifo.c_str()); return false; } int oflags = O_RDONLY | O_NONBLOCK; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((fd[0] = fl_open(fifo.c_str(), oflags)) == -1) { LOG_ERROR("Could not open %s: %s", fifo.c_str(), strerror(errno)); return false; } fifo.erase(len); fifo += "Write"; if (stat(fifo.c_str(), &st) == -1 || !S_ISFIFO(st.st_mode)) { LOG_ERROR("%s is not a fifo", fifo.c_str()); return false; } oflags = O_WRONLY | O_NONBLOCK; # ifdef HAVE_O_CLOEXEC oflags = oflags | O_CLOEXEC; # endif if ((fd[1] = fl_open(fifo.c_str(), oflags)) == -1) { LOG_ERROR("Could not open %s: %s", fifo.c_str(), strerror(errno)); return false; } return true; } static bool get_fifos(const int fd[2], const unsigned char* msg, size_t msglen, char* base, size_t baselen) { struct timeval to = { 2, 0 }; if (tm_write(fd[1], msg, msglen, &to) < (ssize_t)msglen) { LOG_PERROR("Could not write request"); return false; } ssize_t r; if ((r = tm_read(fd[0], base, baselen-1, &to)) <= 0) { LOG_PERROR("Could not read FIFO name"); return false; } base[r] = '\0'; return true; } #ifdef __APPLE__ #include #include #include #endif static bool start_uhrouter(void) { bool found = false; #ifdef __APPLE__ FILE *fd = (FILE *)0; std::string appPath; std::string buffer; appPath.assign("/Applications/µH Router.app/Contents/MacOS/µH Router"); fd = fl_fopen(appPath.c_str(), "r"); if(fd) { found = true; fclose(fd); } if(found) { buffer.clear(); buffer.assign("\""); buffer.append(appPath); buffer.append("\" & "); system(buffer.c_str()); } else { LOG_ERROR("File: /Applications/\265H Router.app Not Found!"); } #endif // __APPLE__ return found; } void PTT::open_uhrouter(void) { struct { unsigned char keyer; const char* name; const char* abbrev; } keyers[] = { { OPENMICROKEYER, "microKeyer", "MK" }, { OPENCWKEYER, "CWKeyer", "CK" }, { OPENDIGIKEYER, "DigiKeyer", "DK" } }; size_t start = 0, end = sizeof(keyers)/sizeof(*keyers); // If the device string is something like /tmp/microHamRouter/microKeyer, // or /tmp/microHamRouter/MK, try that keyer only. re_t keyer_re("^" UHROUTER_FIFO_PREFIX "/(.+)$", REG_EXTENDED); if (keyer_re.match(progdefaults.PTTdev.c_str()) && keyer_re.nsub() == 2) { const char* keyer = keyer_re.submatch(1).c_str(); // do we recognise this keyer name? for (size_t i = 0; i < sizeof(keyers)/sizeof(*keyers); i++) { if (!strcasecmp(keyers[i].name, keyer) || !strcasecmp(keyers[i].abbrev, keyer)) { start = i; end = start + 1; break; } } } LOG_VERBOSE("Will try %s", (start == end ? keyers[start].name : "all keyers")); int uhrfd[2]; uhrfd[0] = uhrfd[1] = uhkfd[0] = uhkfd[1] = uhfd[0] = uhfd[1] = -1; if (!open_fifos(UHROUTER_FIFO_PREFIX, uhrfd)) { // if we just started uhrouter we will retry open_fifos a few times unsigned retries = start_uhrouter() ? 30 : 0; while (retries-- && !open_fifos(UHROUTER_FIFO_PREFIX, uhrfd)) MilliSleep(100); if (uhrfd[0] == -1 || uhrfd[1] == -1) { LOG_ERROR("Could not open router"); return; } } char fifo_name[PATH_MAX]; size_t len = PATH_MAX - 8; memset(fifo_name, 0, sizeof(fifo_name)); for (size_t i = start; i < end; i++) { // open keyer if (!get_fifos(uhrfd, &keyers[i].keyer, 1, fifo_name, len) || *fifo_name == '\0') { LOG_VERBOSE("Keyer \"%s\" not found", keyers[i].name); continue; } // open ptt port if (!open_fifos(fifo_name, uhkfd)) { LOG_ERROR("Could not open keyer %s", keyers[i].name); continue; } LOG_VERBOSE("Opened keyer %s", keyers[i].name); unsigned char port = OPENPTT; if (!get_fifos(uhkfd, &port, 1, fifo_name, len)) { LOG_ERROR("Could not get PTT port"); continue; } if (!open_fifos(fifo_name, uhfd)) { LOG_ERROR("Could not open PTT port %s", fifo_name); continue; } LOG_VERBOSE("Successfully opened PTT port of keyer %s", keyers[i].name); break; } // close router FIFOs close(uhrfd[0]); close(uhrfd[1]); } void PTT::close_uhrouter(void) { close(uhfd[0]); close(uhfd[1]); unsigned char c = QUITIFNOTINUSE; write(uhkfd[1], &c, 1); close(uhkfd[0]); close(uhkfd[1]); } void PTT::set_uhrouter(bool ptt) { if (uhfd[0] == -1 || uhfd[1] == -1) return; unsigned char buf[_POSIX_PIPE_BUF]; // empty the fifo while (read(uhfd[0], buf, sizeof(buf)) > 0); // send command *buf = '0' + ptt; LOG_VERBOSE("Sending PTT=%uc", *buf); struct timeval t = { 2, 0 }; if (tm_write(uhfd[1], buf, 1, &t) != 1) { LOG_ERROR("Could not set PTT: %s", strerror(errno)); return; } // wait for status ssize_t n = tm_read(uhfd[0], buf, sizeof(buf), &t); switch (n) { case -1: LOG_PERROR("tm_read"); break; case 0: LOG_ERROR("No reply to PTT command within %jd seconds", (intmax_t)t.tv_sec); break; default: LOG_VERBOSE("Received \"%s\"", str2hex(buf, n)); // last received char should be '1'(?) break; } } #endif // HAVE_UHROUTER fldigi-4.2.05/src/rigcontrol/FreqControl.cxx0000664000175000017500000004751714611711171015734 00000000000000// ---------------------------------------------------------------------------- // Frequency Control Widget // // Copyright (C) 2014-2023 // David Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // flrig is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #define GCC_VERSION (__GNUC__ * 10000 \ + __GNUC_MINOR__ * 100 \ + __GNUC_PATCHLEVEL__) #include #include #include #include #include #if GCC_VERSION > 40201 # include #endif #include #include "FreqControl.h" #include "gettext.h" std::string old_input_buffer; // Hold contents of Fl_Float_Input widget prior to change in case of need to revert const char *cFreqControl::Label[10] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static void blink_point(Fl_Widget* w) { w->label(*w->label() ? "" : "."); Fl::repeat_timeout(0.5, (Fl_Timeout_Handler)blink_point, w); } void cFreqControl::IncFreq (int nbr) { unsigned long long v = val; v += mult[nbr] * precision; if (v <= maxVal) { val = v; updatevalue(); numeric_entry_mode(false); do_callback(); } } void cFreqControl::DecFreq (int nbr) { unsigned long long requested_decrement = mult[nbr] * precision; if (requested_decrement > val) { // Handle case where user clicks low (decrement) on // high value blank digit leading to underflow return; } else { val -= requested_decrement; updatevalue(); numeric_entry_mode(false); do_callback(); } } void cbSelectDigit (Fl_Widget *btn, void * nbr) { Fl_Button *b = (Fl_Button *)btn; int Nbr = reinterpret_cast (nbr); cFreqControl *fc = (cFreqControl *)b->parent(); if (fc->hrd_buttons) { int yclick = Fl::event_y(); int fc_yc = fc->y() + fc->h()/2; if (yclick <= fc_yc) fc->IncFreq(Nbr); else fc->DecFreq(Nbr); } else { if (Fl::event_button1()) fc->IncFreq(Nbr); else if (Fl::event_button3()) fc->DecFreq(Nbr); } fc->redraw(); } void cFreqControl::set_ndigits(int nbr) { // If number of digits change, remove/delete prior constructs if any // and create desired number. if (nbr > MAX_DIGITS) nbr = MAX_DIGITS; if (nbr < MIN_DIGITS) nbr = MIN_DIGITS; if (nD && nbr != nD) { for (int n = 0; n < nD; n++) { this->remove(Digit[n]); delete Digit[n]; } } if (nbr != nD) { for (int n = 0; n < nbr; n++) { Digit[n] = new Fl_Repeat_Button(0, 0, 1, 1, " "); Digit[n]->box(Digit_box_type); Digit[n]->labelcolor(LBLCOLOR); Digit[n]->color(BGCOLOR, SELCOLOR); Digit[n]->align(FL_ALIGN_INSIDE); Digit[n]->callback(cbSelectDigit, reinterpret_cast(n)); this->add(Digit[n]); } } nD = nbr; // Usable space inside FreqControl box border X = this->x() + bdr_x; Y = this->y() + bdr_y; W = this->w() - 2 * bdr_x; H = this->h() - 2 * bdr_y; // While we allow user to select a font, we pay no attention // to the user's selection of font size; we size the font // to fill the available height in the Fl_Repeat_Button box, // constrained by the maximum width allowable per digit. fs = H; fl_font(font_number, fs); fw = fl_width("0"); // Assumes the '0' numeral is the widest fh = fl_height(); while ( fs && ((fh - fl_descent() >= H) || ((nD + 0.5) * fw >= W))) { if (--fs <= 1) break; fl_font(font_number, fs); fh = fl_height(); fw = fl_width("0"); } dw = fw; pw = dw / 2; // Number display will be right-justified in available space. // Working from right to left: // Right-of-decimal Repeat Buttons (digits) // Decimal box // Left-of-decimal Repeat Buttons (digits) // Fill box int xpos = X + W; for (int n = 0; n < dpoint; n++) { xpos -= dw; Digit[n]->resize (xpos, Y, dw, H); Digit[n]->labelfont(font_number); Digit[n]->labelsize(fs); } xpos -= pw; decbx->resize(xpos, Y, pw, H); decbx->labelfont(font_number); decbx->labelsize(fs); for (int n = dpoint; n < nD; n++) { xpos -= dw; Digit[n]->resize(xpos, Y, dw, H); Digit[n]->labelfont(font_number); Digit[n]->labelsize(fs); } hfill->resize(X, Y, xpos - X, H); redraw(); // Compute max freq value double fmaxval_hz, fmaxval_khz; minVal = 0; fmaxval_hz = (pow(10.0, nD) - 1) * precision; unsigned long long UMAX = maximum();//(unsigned long int)(pow(2.0, 32) - 1); if (fmaxval_hz > UMAX) fmaxval_hz = UMAX; maxVal = fmaxval_hz; fmaxval_khz = (fmaxval_hz / 1000); // For tooltip use; not used elsewhere const char* freq_steps[] = { "1", "10", "100", "1k", "10k", "100k", "1M", "10M", "100M", "1G", "10G", "100G"}; static char tt[1000]; snprintf(tt, sizeof(tt), "Set Frequency: (Max val: %.3f kHz)\n\ Mouse cursor over digit\n\ . Left/Right Click to incr/decr digit by one\n\ . Hold L/R Click for repeat (digit reverses colors)\n\ . Middle Mouse click: paste from clipboard\n\ . SHIFT Left Click to set focus - colors reverse - then:\n\ - R/L arrow +/- %s; w/SHIFT %s; w/CTRL %s\n\ - U/D arrow +/- %s; w/SHIFT %s; w/CTRL %s\n\ - Pg U/D +/- %s; w/SHIFT %s; w/CTRL %s\n\ - L/R mouse click (hold for rpt) in top/bot half of digit\n\ - Ctrl/Meta-v: paste from clipboard\n\ or \n\ - Enter frequency with number keys or Keypad\n\ (decimal point blinks once entry has started)\n\ . BSP/Ctrl-BSP erase last digit/all digits entered\n\ . ENTER to confirm and send to rig and release focus\n\ . ESC to abort and revert to previous value", fmaxval_khz, freq_steps[3-dpoint], freq_steps[4-dpoint], freq_steps[5-dpoint], freq_steps[6-dpoint], freq_steps[7-dpoint], freq_steps[8-dpoint], freq_steps[9-dpoint], freq_steps[10-dpoint], freq_steps[11-dpoint]); tooltip(tt); } cFreqControl::cFreqControl(int x, int y, int w, int h, const char *lbl): Fl_Group(x,y,w,h,"") { end(); // End automatic child widget addition to Group parent; // child widgets will be added explicitly as appropriate. font_number = FL_HELVETICA; // Font will be overridden with stored preference BGCOLOR = REVLBLCOLOR = fl_rgb_color ( 255, 253, 222); // Light yellow; LBLCOLOR = REVBGCOLOR = FL_BLACK; SELCOLOR = fl_rgb_color ( 100, 100, 100); // Light gray oldval = val = 0; // Hz precision = 1; // Hz; Resolution of Frequency Control display; internal resolution always 1 Hz dpoint = 3; // Number of digits to the right of decimal nD = 0; // Number of digits to display // FreqControl box type and box border thicknesses box(FL_DOWN_BOX); color(BGCOLOR); bdr_x = Fl::box_dx(box()); bdr_y = Fl::box_dy(box()); // Repeat Button, decimal, and fill boxes Digit_box_type = FL_FLAT_BOX; // "Box" for decimal point - Created once; position and size will change as necessary decbx = new Fl_Box(0, 0, 1, 1, "."); decbx->box(Digit_box_type); decbx->color(BGCOLOR); decbx->labelcolor(LBLCOLOR); decbx->align(FL_ALIGN_INSIDE); add(decbx); // "Box" to fill empty space to the left of most significant digit - Created once; position and size will change as necessary hfill = new Fl_Box(0, 0, 1, 1, ""); hfill->box(Digit_box_type); hfill->labelcolor(LBLCOLOR); hfill->color(BGCOLOR); add(hfill); mult[0] = 1; for (int n = 1; n < MAX_DIGITS; n++ ) mult[n] = 10 * mult[n-1]; // Create Repeat Buttons; size and position widgets set_ndigits(atoi(lbl)); cbFunc = NULL; // Hidden widget used for managing text input and paste actions finp = new Fl_Float_Input(0, 0, 24,24); finp->callback(freq_input_cb, this); finp->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED); finp->hide(); // true - either mouse button upper half of digit to inc; lower half to dec // false - Left mouse button increments; right mouse button decrements hrd_buttons = true; colors_reversed = false; active = true; // Frequency Control will accept changes numeric_entry_active = false; // User is NOT in the process of entering numbers by keyboard } cFreqControl::~cFreqControl() { delete decbx; delete hfill; delete finp; if (nD > 0) { for (int i = 0; i < nD; i++) { delete Digit[i]; } } } void cFreqControl::updatevalue() { unsigned long long v = val / precision; int i; if (v > 0ULL) { for (i = 0; i < nD; i++) { Digit[i]->label((v == 0 && i > dpoint) ? "" : Label[v % 10]); v /= 10; } } else { for (i = 0; i < (dpoint + 1); i++) Digit[i]->label("0"); for (; i < nD; i++) Digit[i]->label(""); } redraw(); } void cFreqControl::font(Fl_Font fnt) { font_number = fnt; set_ndigits(nD); updatevalue(); } void cFreqControl::SetCOLORS( Fl_Color LBLcolor, Fl_Color BGcolor) { if (this->contains(Fl::focus())) return; // Protect against calls from highlight_vfo // that would restore colors while freq entry in progress LBLCOLOR = REVBGCOLOR = LBLcolor; BGCOLOR = REVLBLCOLOR = BGcolor; UpdateCOLORS(LBLCOLOR, BGCOLOR); } void cFreqControl::SetBGCOLOR (uchar r, uchar g, uchar b) { BGCOLOR = fl_rgb_color (r, g, b); REVLBLCOLOR = BGCOLOR; UpdateCOLORS(LBLCOLOR, BGCOLOR); } void cFreqControl::SetLBLCOLOR (uchar r, uchar g, uchar b) { LBLCOLOR = fl_rgb_color (r, g, b); REVBGCOLOR = LBLCOLOR; UpdateCOLORS(LBLCOLOR, BGCOLOR); } void cFreqControl::restore_colors() { colors_reversed = false; UpdateCOLORS(LBLCOLOR, BGCOLOR); } void cFreqControl::reverse_colors() { colors_reversed = true; UpdateCOLORS(REVLBLCOLOR, REVBGCOLOR); } void cFreqControl::UpdateCOLORS(Fl_Color lbl, Fl_Color bg) { for (int n = 0; n < nD; n++) { Digit[n]->labelcolor(lbl); Digit[n]->color(bg); } decbx->labelcolor(lbl); decbx->color(bg); decbx->redraw(); decbx->redraw_label(); hfill->labelcolor(lbl); hfill->color(bg); hfill->redraw(); hfill->redraw_label(); color(bg); redraw(); } void cFreqControl::value(unsigned long long lv) { if (numeric_entry_mode()) return; // Don't allow third party to assign a value while user is entering via keyboard. if (lv > maxVal) return; // Assume this is an erroneous entry and reject it. oldval = val = lv; numeric_entry_mode(false); updatevalue(); } unsigned long long cFreqControl::maximum(void) { return 9999999999ULL; // Extreme frequency limit intended for non-rig control microwave case } void cFreqControl::cancel_kb_entry(void) { val = oldval; numeric_entry_mode(false); updatevalue(); do_callback(); // If user changes freq at rig while user is in the middle of keyboard freq entry, // and user aborts freq entry, FC-displayed freq will revert to original value // and the callback is needed to return the rig to the original value. } int cFreqControl::handle(int event) { // std::cerr << this << ": " << time(NULL) << " :handle: with event: " << fl_eventnames[event] << ", Fl::focus(): " << Fl::focus() << std::endl; // Use for debugging event processing // if (Fl::focus()) { // std::cerr << this << " The focus widget label: " << (Fl::focus()->label() ? Fl::focus()->label() : "no label") << std::endl; // std::cerr << this << " The focus widget tooltip: " << (Fl::focus()->tooltip() ? Fl::focus()->tooltip() : "no tooltip") << std::endl; // } if (event == FL_LEAVE && !numeric_entry_mode() && this->contains(Fl::focus())) { // not in numeric entry and either the FC or one of its children has focus) Fl::focus((Fl_Widget*)Fl::first_window()); return 1; } if (!active) { if (event == FL_MOUSEWHEEL) { return 1; // Prevent MW action over us from propagating } else { return 0; } } switch (event) { case FL_FOCUS: if (!Fl::focus()) return 0; // Reject a FOCUS event when no other widget has focus; // fltk platform variation shim principally to address the // click-outside-application-and-return case. // Upon application start, fltk sends FL_FOCUS to each widget in creation order until one accepts it. // Accept focus only if event is inside FC (this is the event triggering the FOCUS offer, which // should be the button click in the FC). if (Fl::event_inside(this)) { reverse_colors(); return 1; // Accept focus } return 0; //NOTREACHED case FL_UNFOCUS: if (Fl::focus() != this && this->contains(Fl::focus())) { // Repeat button took focus so cancel numeric entry if (numeric_entry_mode()) cancel_kb_entry(); return 1; } else if (!this->contains(Fl::focus())) { // Some other widget took focus; cancel numeric entry and restore colors. if (numeric_entry_mode()) cancel_kb_entry(); if (colors_reversed) restore_colors(); return 1; } return 0; //NOTREACHED case FL_KEYBOARD: if (Fl::focus() != this) return 1; // Discard keyboard events when an RB has focus. switch (Fl::event_key()) { case FL_Right: if (numeric_entry_mode()) return 1; if (Fl::event_ctrl()) IncFreq(2); else if (Fl::event_shift()) IncFreq(1); else IncFreq(0); return 1; //NOTREACHED case FL_Left: if (numeric_entry_mode()) return 1; if (Fl::event_ctrl()) DecFreq(2); else if (Fl::event_shift()) DecFreq(1); else DecFreq(0); return 1; //NOTREACHED case FL_Up: if (numeric_entry_mode()) return 1; if (Fl::event_ctrl()) IncFreq(5); else if (Fl::event_shift()) IncFreq(4); else IncFreq(3); return 1; //NOTREACHED case FL_Down: if (numeric_entry_mode()) return 1; if (Fl::event_ctrl()) DecFreq(5); else if (Fl::event_shift()) DecFreq(4); else DecFreq(3); return 1; //NOTREACHED case FL_Page_Up: if (numeric_entry_mode()) return 1; if (Fl::event_ctrl()) IncFreq(8); else if (Fl::event_shift()) IncFreq(7); else IncFreq(6); return 1; //NOTREACHED case FL_Page_Down: if (numeric_entry_mode()) return 1; if (Fl::event_ctrl()) DecFreq(8); else if (Fl::event_shift()) DecFreq(7); else DecFreq(6); return 1; //NOTREACHED case FL_BackSpace: if (numeric_entry_mode()) { return finp->handle(event); } else return 0; //NOTREACHED case FL_Enter: case FL_KP_Enter: if (numeric_entry_mode()) { finp->do_callback(); numeric_entry_mode(false); } do_callback(); Fl::focus((Fl_Widget*)Fl::first_window()); return 1; //NOTREACHED case FL_Escape: if (numeric_entry_mode()) cancel_kb_entry(); do_callback(); Fl::focus((Fl_Widget*)Fl::first_window()); return 1; //NOTREACHED case 'v': if (Fl::event_command()) { // FL_CTRL or OSX FL_META if (numeric_entry_mode()) { // Ignore Ctrl/Meta-v while in numeric entry mode return 1; } else { old_input_buffer = finp->value(); // Protect against paste value > max allowed Fl::paste(*(this->finp), 1); // 1 = Paste from clipboard do_callback(); } Fl::focus((Fl_Widget*)Fl::first_window()); } return 1; //NOTREACHED default: // Keyboard entry processing // Accept numbers, decimal point, and 'e' or 'E' to indicate exponential notation only int ch = Fl::event_text()[0]; if ((ch < '0' || ch > '9') && ch != '.' && ch != 'e' && ch!= 'E') return 1; if (!numeric_entry_mode()) { // User has begun entering a frequency numeric_entry_mode(true); // Set blinking decimal point to signify user is in numeric frequency entry mode finp->static_value(""); // Clear Fl_Float_Input string contents oldval = val; // Preserve current FC-internal integer val in case restoral is needed } old_input_buffer = finp->value(); // Preserve current Fl_Float_Input string value in case restoral is needed // if user entry > max allowed; pre-checks don't cover all cases. // If an exponent has been indicated ('e' or 'E' entered), allow one digit of exponent const char *e; if ((e = strchr(finp->value(), 'e')) || (e = strchr(finp->value(), 'E'))) { if (strlen(e) == 1) { return finp->handle(event); // Allow entry of digit } else { return 1; } } // If decimal already entered, limit additional digits to those being displayed. const char *p = strchr(finp->value(), '.'); if (p) { if (strlen(p) <= (size_t) dpoint) { return finp->handle(event); } else { // Allow the entry of 'e' or 'E' following the max decimal digits if (strlen(p) == (size_t) dpoint + 1 && (ch == 'e' || ch == 'E')) { return finp->handle(event); } else { return 1; } } } // Ignore excess digits left of decimal size_t inp_len = strlen(finp->value()); if ((inp_len == (unsigned long) (nD - dpoint)) && (ch != '.')) return 1; // Otherwise, accept entry return finp->handle(event); }// End FL_KEYBOARD event processing //NOTREACHED case FL_MOUSEWHEEL: if (Fl::event_inside(this)) { // Reject fltk's attempts to give us events that don't belong to us if (numeric_entry_mode()) { // Ignore mousewheel in numeric entry mode return 1; } else { int d; if ( !((d = Fl::event_dy()) || (d = Fl::event_dx())) ) return 1; for (int i = 0; i < nD; i++) { if (Fl::event_inside(Digit[i])) { d > 0 ? DecFreq(i) : IncFreq(i); return 1; } } } } return 1; // Consume but ignore mousewheel action outside FreqControl or inside FreqControl but not over digit //NOTREACHED case FL_PUSH: { if (colors_reversed) // Ignore mouse click if colors reversed return 1; int ev = Fl::event_button(); if (ev == FL_MIDDLE_MOUSE) { Fl::paste(*(this->finp), 0); // Send FL_PASTE to the Fl_Float_Input widget; its parent // Fl_Input_::handle checks for valid floating point entry. // 0 = Paste from selection, not clipboard do_callback(); return 1; } else if (ev == FL_LEFT_MOUSE && Fl::event_shift()) { reverse_colors(); Fl::focus(this); return 1; } else { return Fl_Group::handle(event); // The appropriate Repeat Button will handle the event } //NOTREACHED } default: return Fl_Group::handle(event); } } // Hidden Fl_Float_Input widget's callback called on keyboard number entry and on PASTE and ENTER actions. // // Compute the integer Hz representation of the Fl_Float_Input widget string value // and update the values shown on the Repeat Button labels. void cFreqControl::freq_input_cb(Fl_Widget*, void* arg) { cFreqControl* fc = reinterpret_cast(arg); double finp_val = strtod(fc->finp->value(), NULL); finp_val *= 1000; // Frequency string is in kHz - convert here to Hz used internally by FreqControl finp_val += 0.5; unsigned long long lval = (unsigned long long) finp_val; if (lval <= fc->maxVal) { fc->val = lval; fc->updatevalue(); } else { // Need to revert entry because we overran our max value fc->finp->value(old_input_buffer.c_str()); } } void cFreqControl::numeric_entry_mode(bool flag) { if (flag) { numeric_entry_active = true; Fl::add_timeout(0.0, (Fl_Timeout_Handler)blink_point, decbx); } else { numeric_entry_active = false; Fl::remove_timeout((Fl_Timeout_Handler)blink_point, decbx); // Ensure we have a visible decimal point after completion of keyboard entry; // might otherwise be blank due to uncertain ending state of 'blink_point' function. decbx->label("."); decbx->redraw_label(); } } static void restore_color(void* w) { cFreqControl *fc = (cFreqControl *)w; fc->restore_colors(); } static void reverse_color(void* w) { cFreqControl *fc = (cFreqControl *)w; fc->reverse_colors(); } void cFreqControl::visual_beep() { if (this->colors_reversed) { restore_color(this); Fl::add_timeout(0.1, reverse_color, this); } else { reverse_colors(); Fl::add_timeout(0.1, restore_color, this); } } void cFreqControl::resize(int x, int y, int w, int h) { Fl_Group::resize(x,y,w,h); set_ndigits(nD); return; } fldigi-4.2.05/src/rigcontrol/rigsupport.cxx0000664000175000017500000003474414611711171015712 00000000000000// ---------------------------------------------------------------------------- // rigsupport.cxx - support functions file // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "rigsupport.h" #include "rigxml.h" #include "rigio.h" #include "threads.h" #include "main.h" #include "fl_digi.h" #include "trx.h" #include "configuration.h" #include "globals.h" #include "debug.h" #include "gettext.h" #include "status.h" #include "fileselect.h" extern void n3fjp_set_freq(unsigned long long); extern bool n3fjp_connected; LOG_FILE_SOURCE(debug::LOG_RIGCONTROL); std::string windowTitle; std::vector freqlist; const unsigned char nfields = 5;//4; int fwidths[nfields]; enum { max_rfcarrier, max_rmode, max_mode, max_carrier }; #if !USE_HAMLIB typedef enum { RIG_MODE_NONE = 0, /*!< '' -- None */ RIG_MODE_AM = (1<<0), /*!< \c AM -- Amplitude Modulation */ RIG_MODE_CW = (1<<1), /*!< \c CW -- CW "normal" sideband */ RIG_MODE_USB = (1<<2), /*!< \c USB -- Upper Side Band */ RIG_MODE_LSB = (1<<3), /*!< \c LSB -- Lower Side Band */ RIG_MODE_RTTY = (1<<4), /*!< \c RTTY -- Radio Teletype */ RIG_MODE_FM = (1<<5), /*!< \c FM -- "narrow" band FM */ RIG_MODE_WFM = (1<<6), /*!< \c WFM -- broadcast wide FM */ RIG_MODE_CWR = (1<<7), /*!< \c CWR -- CW "reverse" sideband */ RIG_MODE_RTTYR = (1<<8), /*!< \c RTTYR -- RTTY "reverse" sideband */ RIG_MODE_AMS = (1<<9), /*!< \c AMS -- Amplitude Modulation Synchronous */ RIG_MODE_PKTLSB = (1<<10),/*!< \c PKTLSB -- Packet/Digital LSB mode (dedicated port) */ RIG_MODE_PKTUSB = (1<<11),/*!< \c PKTUSB -- Packet/Digital USB mode (dedicated port) */ RIG_MODE_PKTFM = (1<<12),/*!< \c PKTFM -- Packet/Digital FM mode (dedicated port) */ RIG_MODE_ECSSUSB = (1<<13),/*!< \c ECSSUSB -- Exalted Carrier Single Sideband USB */ RIG_MODE_ECSSLSB = (1<<14),/*!< \c ECSSLSB -- Exalted Carrier Single Sideband LSB */ RIG_MODE_FAX = (1<<15),/*!< \c FAX -- Facsimile Mode */ RIG_MODE_SAM = (1<<16),/*!< \c SAM -- Synchronous AM double sideband */ RIG_MODE_SAL = (1<<17),/*!< \c SAL -- Synchronous AM lower sideband */ RIG_MODE_SAH = (1<<18),/*!< \c SAH -- Synchronous AM upper (higher) sideband */ RIG_MODE_DSB = (1<<19), /*!< \c DSB -- Double sideband suppressed carrier */ } rmode_t; #endif struct rmode_name_t { rmode_t mode; const char *name; } modes[] = { { RIG_MODE_NONE, "NONE" }, { RIG_MODE_AM, "AM" }, { RIG_MODE_CW, "CW" }, { RIG_MODE_USB, "USB" }, { RIG_MODE_LSB, "LSB" }, { RIG_MODE_RTTY, "RTTY" }, { RIG_MODE_FM, "FM" }, { RIG_MODE_WFM, "WFM" }, { RIG_MODE_CWR, "CWR" }, { RIG_MODE_RTTYR, "RTTYR" }, { RIG_MODE_AMS, "AMS" }, { RIG_MODE_PKTLSB, "PKTLSB" }, { RIG_MODE_PKTUSB, "PKTUSB" }, { RIG_MODE_PKTFM, "PKTFM" } //, // C99 trailing commas in enumerations not yet in the C++ standard // { RIG_MODE_ECSSUSB, "ECSSUSB" }, // { RIG_MODE_ECSSLSB, "ECSSLSB" }, // { RIG_MODE_FAX, "FAX" } // the above are covered by our requirement that hamlib be >= 1.2.4 #if (defined(RIG_MODE_SAM) && defined(RIG_MODE_SAL) && defined(RIG_MODE_SAH)) , // C99 trailing commas in enumerations not yet in the C++ standard { RIG_MODE_SAM, "SAM" }, { RIG_MODE_SAL, "SAL" }, { RIG_MODE_SAH, "SAH" } #endif }; std::map mode_nums; std::map mode_names; void qso_selMode(rmode_t m) { qso_opMODE->value(mode_names[m].c_str()); } std::string modeString(rmode_t m) { return mode_names[m].c_str(); } void initOptionMenus() { qso_opMODE->clear(); std::list::iterator MD; std::list *pMD = 0; if (lmodes.empty() == false) pMD = &lmodes; else if (lmodeCMD.empty() == false) pMD = &lmodeCMD; //printf("initOptionMenus()\n"); if (pMD) { MD = pMD->begin(); while (MD != pMD->end()) { //printf("adding mode: %s\n", (*MD).SYMBOL.c_str()); qso_opMODE->add( (*MD).SYMBOL.c_str()); MD++; } qso_opMODE->activate(); qso_opMODE->index(0); } else { qso_opMODE->deactivate(); } qso_opBW->clear(); std::list::iterator bw; std::list *pBW = 0; if (lbws.empty() == false) pBW = &lbws; else if (lbwCMD.empty() == false) pBW = &lbwCMD; if (pBW) { bw = pBW->begin(); while (bw != pBW->end()) { //printf("adding BW: %s\n", (*bw).SYMBOL.c_str()); qso_opBW->add( (*bw).SYMBOL.c_str()); bw++; } qso_opBW->activate(); qso_opBW->index(0); } else { qso_opBW->deactivate(); } } void clearList() { freqlist.clear(); qso_opBrowser->clear(); } void updateSelect() { if (freqlist.empty()) return; for (size_t i = 0; i < freqlist.size(); i++) { qso_opBrowser->add(freqlist[i].str().c_str()); } } size_t updateList(unsigned long long rf, int freq, std::string rmd, trx_mode md, std::string usage = "") { qrg_mode_t m; m.rmode = rmd; m.mode = md; m.rfcarrier = rf; m.carrier = freq; m.usage = usage; freqlist.push_back(m); sort(freqlist.begin(), freqlist.end()); std::vector::const_iterator pos = find(freqlist.begin(), freqlist.end(), m); if (pos != freqlist.end()) return pos - freqlist.begin(); else return 0; } size_t addtoList(unsigned long long val) { qrg_mode_t m; m.rfcarrier = val; if (strlen(qso_opMODE->value())) m.rmode = qso_opMODE->value(); if (active_modem) { m.carrier = active_modem->get_freq(); m.mode = active_modem->get_mode(); } return updateList(val, m.carrier, m.rmode, m.mode); } bool readFreqList(bool bdef) { std::string fname = HomeDir + progStatus.default_frequencies_filename; if (bdef) { std::string defname = FSEL::select( "Load from frequency list file", "*.txt", fname.c_str()); if (defname.empty()) return false; fname = defname; } std::ifstream freqfile((fname).c_str()); if (!freqfile) { LOG_ERROR("Could not open %s", (fname).c_str()); return false; } std::string line; qrg_mode_t m; while (!getline(freqfile, line).eof()) { LOG_INFO("%s", line.c_str()); if (line[0] == '#') continue; std::istringstream is(line); is >> m; freqlist.push_back(m); } sort(freqlist.begin(), freqlist.end()); updateSelect(); freqfile.close(); progStatus.default_frequencies_filename = fl_filename_name(fname.c_str()); return freqlist.size(); } void saveFreqList(bool bdef) { if (freqlist.empty()) return; std::string fname = HomeDir + progStatus.default_frequencies_filename; if (bdef) { std::string defname = FSEL::saveas( "Save to frequency list file", "*.txt", fname.c_str()); if (defname.empty()) return; fname = defname; } std::ofstream freqfile((fname).c_str()); if (!freqfile) { LOG_ERROR("Could not open %s", (fname).c_str()); return; } freqfile << "# rfcarrier rig_mode carrier mode usage\n"; copy( freqlist.begin(), freqlist.end(), std::ostream_iterator(freqfile, "\n") ); freqfile.close(); progStatus.default_frequencies_filename = fl_filename_name(fname.c_str()); } void build_frequencies2_list() { if (!freqlist.empty()) saveFreqList(); clearList(); // calculate the column widths memset(fwidths, 0, sizeof(fwidths)); // these need to be a little wider than fl_width thinks fwidths[max_rmode] = fwidths[max_mode] = fwidths[max_carrier] = fwidths[max_rfcarrier]= 15; fwidths[max_rfcarrier] += (int)ceil(fl_width("999999.999")); fwidths[max_rmode] += (int)ceil(fl_width("XXXXXX")); fwidths[max_carrier] += (int)ceil(fl_width("8888")); // find mode with longest shortname size_t s, smax = 0, mmax = 0; for (size_t i = 0; i < NUM_MODES; i++) { s = strlen(mode_info[i].sname); if (smax < s) { smax = s; mmax = i; } } fwidths[max_mode] += (int)ceil(fl_width(mode_info[mmax].sname)); if (readFreqList()) return; updateList (1807000ULL, 1000, "USB", MODE_PSK31 ); updateList (3505000ULL, 800, "USB", MODE_CW); updateList (3580000ULL, 1000, "USB", MODE_PSK31 ); updateList (7005000ULL, 800, "USB", MODE_CW); updateList (7030000ULL, 1000, "USB", MODE_PSK31 ); updateList (7070000ULL, 1000, "USB", MODE_PSK31 ); updateList (10105000ULL, 800, "USB", MODE_CW); updateList (10135000ULL, 1000, "USB", MODE_PSK31 ); updateList (14005000ULL, 800, "USB", MODE_CW); updateList (14070000ULL, 1000, "USB", MODE_PSK31 ); updateList (18100000ULL, 1000, "USB", MODE_PSK31 ); updateList (21005000ULL, 800, "USB", MODE_CW); updateList (21070000ULL, 1000, "USB", MODE_PSK31 ); updateList (24920000ULL, 1000, "USB", MODE_PSK31 ); updateList (28005000ULL, 800, "USB", MODE_CW); updateList (28120000ULL, 1000, "USB", MODE_PSK31 ); updateSelect(); } int cb_qso_opMODE() { if (connected_to_flrig) { set_flrig_mode(qso_opMODE->value()); return 0; } #if USE_HAMLIB if (progdefaults.chkUSEHAMLIBis) hamlib_setmode(mode_nums[qso_opMODE->value()]); else #endif if (progdefaults.chkUSERIGCATis) rigCAT_setmode(qso_opMODE->value()); else noCAT_setmode(qso_opMODE->value()); return 0; } int cb_qso_opBW() { if (connected_to_flrig) set_flrig_bw(qso_opBW->index(), -1); else if (progdefaults.chkUSERIGCATis) rigCAT_setwidth(qso_opBW->value()); else noCAT_setwidth(qso_opBW->value()); return 0; } int cb_qso_btnBW1() { qso_btnBW1->hide(); qso_opBW1->hide(); qso_btnBW2->show(); qso_opBW2->show(); return 0; } int cb_qso_btnBW2() { qso_btnBW2->hide(); qso_opBW2->hide(); qso_btnBW1->show(); qso_opBW1->show(); return 0; } int cb_qso_opBW1() { //printf("opBW1 %d:%s\n", qso_opBW1->index(), qso_opBW1->value()); set_flrig_bw(qso_opBW2->index(), qso_opBW1->index()); return 0; } int cb_qso_opBW2() { //printf("opBW2 %d:%s\n", qso_opBW2->index(), qso_opBW2->value()); set_flrig_bw(qso_opBW2->index(), qso_opBW1->index()); return 0; } void sendFreq(unsigned long long f) { if (connected_to_flrig) set_flrig_freq(f); #if USE_HAMLIB else if (progdefaults.chkUSEHAMLIBis) hamlib_setfreq(f); #endif else if (progdefaults.chkUSERIGCATis) rigCAT_setfreq(f); else noCAT_setfreq(f); if (n3fjp_connected) n3fjp_set_freq(f); } void qso_movFreq(Fl_Widget* w, void *data) { cFreqControl *fc = (cFreqControl *)w; unsigned long long f; long restore = reinterpret_cast(data); f = fc->value(); if (fc == qsoFreqDisp1) { qsoFreqDisp2->value(f); qsoFreqDisp3->value(f); } else if (fc == qsoFreqDisp2) { qsoFreqDisp1->value(f); qsoFreqDisp3->value(f); } else { qsoFreqDisp1->value(f); qsoFreqDisp2->value(f); } sendFreq(f); modeband.band_mode_change(); if (restore == 1) restoreFocus(); return; } void qso_selectFreq(unsigned long long rfcarrier, int carrier) { if (rfcarrier > 0) { qsoFreqDisp1->value(rfcarrier); qsoFreqDisp2->value(rfcarrier); qsoFreqDisp3->value(rfcarrier); sendFreq(rfcarrier); } if (carrier > 0) { active_modem->set_freq((double)carrier); } } void qso_selectFreq() { int n = qso_opBrowser->value(); if (!n) return; n -= 1; // transceiver mode if (freqlist[n].rmode != "NONE") { qso_opMODE->value(freqlist[n].rmode.c_str()); cb_qso_opMODE(); } // transceiver frequency if (freqlist[n].rfcarrier > 0) { qsoFreqDisp1->value(freqlist[n].rfcarrier); qsoFreqDisp2->value(freqlist[n].rfcarrier); qsoFreqDisp3->value(freqlist[n].rfcarrier); sendFreq(freqlist[n].rfcarrier); } // modem type & audio sub carrier if (freqlist[n].mode != NUM_MODES) { if (freqlist[n].mode != active_modem->get_mode()) init_modem_sync(freqlist[n].mode); if (freqlist[n].carrier > 0) active_modem->set_freq(freqlist[n].carrier); } } void qso_setFreq(unsigned long long f) { // transceiver frequency if (f > 0) { qsoFreqDisp->value(f); sendFreq(f); } } void qso_setFreq() { int n = qso_opBrowser->value(); if (!n) return; n -= 1; // transceiver frequency qso_setFreq(freqlist[n].rfcarrier); } void qso_delFreq() { int v = qso_opBrowser->value() - 1; if (v >= 0) { freqlist.erase(freqlist.begin() + v); qso_opBrowser->remove(v + 1); } } void qso_addFreq() { unsigned long long freq = qsoFreqDisp->value(); if (freq) { size_t pos = addtoList(freq); qso_opBrowser->insert(pos+1, freqlist[pos].str().c_str()); } } void qso_updateEntry(int i, std::string usage) { int v = i - 1; int sz = (int)freqlist.size(); if ((v >= 0) && (v < sz)) { freqlist[v].usage = usage; } } void setTitle() { update_main_title(); } bool init_Xml_RigDialog() { LOG_DEBUG("xml rig"); initOptionMenus(); xcvr_title = xmlrig.rigTitle; setTitle(); return true; } bool init_NoRig_RigDialog() { LOG_DEBUG("no rig"); qso_opBW->clear(); qso_opBW->add(" "); qso_opBW->index(0); qso_opBW->redraw(); qso_opBW->deactivate(); qso_opMODE->clear(); //printf("init_NoRig_RigDialog()\n"); for (size_t i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) { //printf("adding %s\n", modes[i].name); qso_opMODE->add(modes[i].name); } // list of LSB type modes that various xcvrs report via flrig LSBmodes.clear(); LSBmodes.push_back("LSB"); LSBmodes.push_back("LSB-D"); LSBmodes.push_back("LSB-D1"); LSBmodes.push_back("LSB-D2"); LSBmodes.push_back("LSB-D3"); LSBmodes.push_back("CW"); LSBmodes.push_back("LCW"); LSBmodes.push_back("CW-N"); LSBmodes.push_back("CWL"); LSBmodes.push_back("RTTY"); LSBmodes.push_back("RTTY-L"); LSBmodes.push_back("PKTLSB"); LSBmodes.push_back("PKT-L"); LSBmodes.push_back("USER-L"); LSBmodes.push_back("DATA-L"); LSBmodes.push_back("DATA"); LSBmodes.push_back("D-LSB"); qso_opMODE->index(3); qso_opMODE->activate(); xcvr_title.clear(); setTitle(); return true; } #if USE_HAMLIB bool init_Hamlib_RigDialog() { LOG_DEBUG("hamlib"); qso_opBW->deactivate(); qso_opMODE->clear(); for (size_t i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) { mode_nums[modes[i].name] = modes[i].mode; mode_names[modes[i].mode] = modes[i].name; qso_opMODE->add(modes[i].name); } xcvr_title = "Hamlib "; xcvr_title.append(xcvr->getName()); setTitle(); return true; } #endif fldigi-4.2.05/src/spot/0000775000175000017500000000000014611714005011616 500000000000000fldigi-4.2.05/src/spot/pskrep.cxx0000664000175000017500000006557714611711171013613 00000000000000// ---------------------------------------------------------------------------- // pskrep.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This is a client for N1DQ's PSK Automatic Propagation Reporter // (see http://pskreporter.info/). Philip Gladstone, N1DQ, is // thanked for his helpful explanation of the protocol. // // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #if HAVE_SYS_UTSNAME_H # include #endif #include #if HAVE_ARPA_INET_H # include #endif #include #include #include #include #include #include #include #include #include #if GCC_VER_OK # if HAVE_STD_HASH # define MAP_TYPE std::unordered_map # define HASH_TYPE std::hash # include # else # if HAVE_STD_TR1_HASH # define MAP_TYPE std::tr1::unordered_map # define HASH_TYPE std::tr1::hash # include # endif # endif #else // use the non-standard gnu hash_map on gcc < 4.1.0 // which has a broken tr1::unordered_map::operator= # define MAP_TYPE __gnu_cxx::hash_map # define HASH_TYPE __gnu_cxx::hash # include namespace __gnu_cxx { // define the missing hash specialisation for std::string // using the 'const char*' hash function template<> struct hash { size_t operator()(const std::string& s) const { return __stl_hash_string(s.c_str()); } }; } #endif #include #include "socket.h" #include "re.h" #include "debug.h" #include "util.h" #include "trx.h" #include "fl_digi.h" #include "main.h" #include "configuration.h" #include "globals.h" #include "spot.h" #include "pskrep.h" LOG_FILE_SOURCE(debug::LOG_SPOTTER); //------------------------------------------------------------------------------ #include "threads.h" static pthread_mutex_t pskrep_mutex = PTHREAD_MUTEX_INITIALIZER; //------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------- // Try to flush the report queue every SEND_INTERVAL seconds. #define SEND_INTERVAL 300 // Ignore reports that are less than DUP_INTERVAL seconds older than // a previously sent report for the same callsign and frequency band. // Sent reports are also garbage-collected after DUP_INTERVAL seconds. #define DUP_INTERVAL 1800 // The first TEMPLATE_THRESHOLD packets will contain the long templates; // the next TEMPLATE_THRESHOLD packets will include the short templates #define TEMPLATE_THRESHOLD 3 // Resend short templates every TEMPLATE_INTERVAL seconds #define TEMPLATE_INTERVAL 1800 // Maximum send size #define DGRAM_MAX (1500-14-24-8) #define PSKREP_QUEUE_FILE "pskrqueue.txt" #define PSKREP_ID_FILE "pskrkey.txt" // ------------------------------------------------------------------------------------------------- enum status_t { PSKR_STATUS_NEW, PSKR_STATUS_PENDING, PSKR_STATUS_SENT }; enum rtype_t { PSKREP_AUTO = 1, PSKREP_LOG = 2, PSKREP_MANUAL = 3 }; struct rcpt_report_t { rcpt_report_t(trx_mode m = 0, long long f = 0, time_t t = 0, rtype_t p = PSKREP_AUTO, std::string loc = "") : mode(m), freq(f), rtime(t), rtype(p), status(PSKR_STATUS_NEW), locator(loc) { } trx_mode mode; long long freq; time_t rtime; rtype_t rtype; status_t status; std::string locator; }; // A band_map_t holds a list of reception reports (for a particular callsign and band) typedef std::deque band_map_t; // A call_map_t holds reception reports for a particular callsign typedef MAP_TYPE > call_map_t; // A container of this type holds all reception reports, sorted by callsign and band typedef MAP_TYPE queue_t; class pskrep_sender { public: pskrep_sender(const std::string& call, const std::string& loc, const std::string& ant, const std::string& host_, const std::string& port_, const std::string& long_id_, const std::string& short_id_); ~pskrep_sender(); bool append(const std::string& callsign, const band_map_t::value_type& r); bool send(void); private: void write_station_info(void); void write_preamble(void); std::string recv_callsign, recv_locator, recv_antenna; std::string host, port; std::string long_id, short_id; static const unsigned char long_station_info_template[]; static const unsigned char short_station_info_template[]; static const unsigned char rcpt_record_template[]; std::vector long_station_info; std::vector short_station_info; //uint32_t identifier; uint32_t sequence_number; unsigned template_count; time_t last_template; Socket* send_socket; unsigned char* dgram; size_t dgram_size; size_t report_offset; void create_socket(void); pthread_t resolver_thread; static void* resolver(void* obj); static const char hexsym[]; static size_t pad(size_t len, size_t mult); }; class pskrep { public: pskrep(const std::string& call, const std::string& loc, const std::string& ant, const std::string& host, const std::string& port, const std::string& long_id, const std::string& short_id, bool reg_auto, bool reg_log, bool reg_manual); ~pskrep(); static void recv(trx_mode mode, int afreq, const char* str, const regmatch_t* calls, size_t len, void* obj); static void log(const char* call, const char* loc, unsigned long long freq, trx_mode mode, time_t rtime, void* obj); static void manual(const char* call, const char* loc, unsigned long long freq, trx_mode mode, time_t rtime, void* obj); bool progress(void); unsigned count(void) { return new_count; } static fre_t locator_re; private: void append(std::string call, const char* loc, unsigned long long freq, trx_mode mode, time_t rtime, rtype_t rtype); void gc(void); void load_queue(void); void save_queue(void); static bool not_sent(const band_map_t::value_type& r) { return r.status != PSKR_STATUS_SENT; } queue_t queue; pskrep_sender sender; unsigned new_count; }; fre_t pskrep::locator_re("[a-r]{2}[0-9]{2}[a-x]{2}", REG_EXTENDED | REG_NOSUB | REG_ICASE); #define SHORT_ID_SIZE 4 #define LONG_ID_SIZE 8 // ------------------------------------------------------------------------------------------------- static std::string error_string; static bool pskrep_check(void) { struct { const std::string* var; const char* msg; } check[] = { { &progdefaults.myCall, "callsign" }, { &progdefaults.myLocator, "locator" }, { &progdefaults.myAntenna, "antenna info" }, }; for (size_t i = 0; i < sizeof(check)/sizeof(*check); i++) { if (check[i].var->empty()) { error_string.assign("Error: missing ").append(check[i].msg); return false; } } if (!pskrep::locator_re.match(progdefaults.myLocator.c_str())) { error_string = "Error: bad Maidenhead locator\ncheck Configure->Operator->Locator"; return false; } return true; } const char* pskrep_error(void) { return error_string.c_str(); } static void pskrep_progress(void* obj) { if (reinterpret_cast(obj)->progress()) Fl::add_timeout(SEND_INTERVAL, pskrep_progress, obj); else pskrep_stop(); } static void pskrep_make_id(std::string& id, size_t len) { id.resize(len); std::ifstream f("/dev/urandom"); if (f) { for (size_t i = 0; i < len; i++) while ((id[i] = f.get()) != EOF && !isgraph(id[i])); f.close(); } else { unsigned seed = time(NULL); if (!progdefaults.myCall.empty()) seed ^= simple_hash_str((const unsigned char*)progdefaults.myCall.c_str()); srand(seed); for (size_t i = 0; i < len; i++) while (!isgraph(id[i] = rand() % 0x7F)); } } static pskrep* pskr = 0; bool pskrep_start(void) { if (pskr) return true; else if (!pskrep_check()) return false; // get identifier std::string fname = TempDir; fname.append(PSKREP_ID_FILE); std::ifstream in(fname.c_str()); std::string long_id, short_id; if (in) in >> long_id >> short_id; if (!in || in.eof()) { in.close(); pskrep_make_id(long_id, LONG_ID_SIZE); pskrep_make_id(short_id, SHORT_ID_SIZE); std::ofstream out(fname.c_str()); if (out) out << long_id << ' ' << short_id << '\n'; else LOG_ERROR("Could not write identifiers (\"%s\", \"%s\") to %s", long_id.c_str(), short_id.c_str(), fname.c_str()); } pskr = new pskrep(progdefaults.myCall, progdefaults.myLocator, progdefaults.myAntenna, progdefaults.pskrep_host, progdefaults.pskrep_port, long_id, short_id, progdefaults.pskrep_auto, progdefaults.pskrep_log, true); Fl::add_timeout(SEND_INTERVAL, pskrep_progress, pskr); return true; } void pskrep_stop(void) { Fl::remove_timeout(pskrep_progress, pskr); delete pskr; pskr = 0; } unsigned pskrep_count(void) { return pskr ? pskr->count() : 0; } // ------------------------------------------------------------------------------------------------- pskrep::pskrep(const std::string& call, const std::string& loc, const std::string& ant, const std::string& host, const std::string& port, const std::string& long_id, const std::string& short_id, bool reg_auto, bool reg_log, bool reg_manual) : sender(call, loc, ant, host, port, long_id, short_id), new_count(0) { if (reg_auto) spot_register_recv(pskrep::recv, this, PSKREP_RE, REG_EXTENDED | REG_ICASE); if (reg_log) spot_register_log(pskrep::log, this); if (reg_manual) spot_register_manual(pskrep::manual, this); load_queue(); } pskrep::~pskrep() { spot_unregister_recv(pskrep::recv, this); spot_unregister_log(pskrep::log, this); spot_unregister_manual(pskrep::manual, this); save_queue(); } // This function is called by spot_recv() when its buffer matches our PSKREP_RE void pskrep::recv(trx_mode mode, int afreq, const char* str, const regmatch_t* calls, size_t len, void* obj) { if (unlikely(calls[PSKREP_RE_INDEX].rm_so == -1 || calls[PSKREP_RE_INDEX].rm_eo == -1)) return; std::string call(str + calls[PSKREP_RE_INDEX].rm_so, calls[PSKREP_RE_INDEX].rm_eo - calls[PSKREP_RE_INDEX].rm_so); unsigned long long freq = afreq; if (!wf->USB()) freq = -freq; freq += wf->rfcarrier(); LOG_VERBOSE("Spotted \"%s\" in buffer \"%s\"", call.c_str(), str); reinterpret_cast(obj)->append(call.c_str(), "", freq, active_modem->get_mode(), time(NULL), PSKREP_AUTO); } // This function is called by spot_log() void pskrep::log(const char* call, const char* loc, unsigned long long freq, trx_mode mode, time_t rtime, void* obj) { reinterpret_cast(obj)->append(call, loc, freq, mode, rtime, PSKREP_LOG); } // This function is called by spot_manual() void pskrep::manual(const char* call, const char* loc, unsigned long long freq, trx_mode mode, time_t rtime, void* obj) { reinterpret_cast(obj)->append(call, loc, freq, mode, rtime, PSKREP_MANUAL); } void pskrep::append(std::string call, const char* loc, unsigned long long freq, trx_mode mode, time_t rtime, rtype_t rtype) { if (unlikely(call.empty())) return; transform(call.begin(), call.end(), call.begin(), static_cast(toupper)); if (!progdefaults.pskrep_qrg) freq = 0LL; if (*loc && !locator_re.match(loc)) loc = ""; band_map_t& bandq = queue[call][band(freq)]; if (bandq.empty() || rtime - bandq.back().rtime >= DUP_INTERVAL) { // add new bandq.push_back(rcpt_report_t(mode, freq, rtime, rtype, loc)); LOG_VERBOSE("Added (call=\"%s\", loc=\"%s\", mode=\"%s\", freq=%d, time=%d, type=%u)", call.c_str(), loc, mode_info[mode].adif_name, static_cast(freq), static_cast(rtime), rtype); new_count++; save_queue(); } else if (!bandq.empty()) { band_map_t::value_type& r = bandq.back(); if (r.status != PSKR_STATUS_SENT && *loc && r.locator != loc) { // update last r.locator = loc; r.rtype = rtype; LOG_VERBOSE("Updated (call=\"%s\", loc=\"%s\", mode=\"%s\", freq=%d, time=%d, type=%u)", call.c_str(), loc, mode_info[r.mode].adif_name, static_cast(r.freq), static_cast(r.rtime), rtype); save_queue(); } } } // Handle queued reports bool pskrep::progress(void) { if (queue.empty()) return true; unsigned nrep = 0; bool sender_full = false; for (queue_t::iterator i = queue.begin(); i != queue.end(); ++i) { for (call_map_t::iterator j = i->second.begin(); j != i->second.end(); ++j) { for (band_map_t::iterator k = j->second.begin(); k != j->second.end(); ++k) { switch (k->status) { case PSKR_STATUS_NEW: if ((sender_full = !sender.append(i->first, *k))) goto send_reports; k->status = PSKR_STATUS_PENDING; nrep++; break; case PSKR_STATUS_PENDING: // sent in last cycle k->status = PSKR_STATUS_SENT; default: break; } } } } send_reports: LOG_VERBOSE("Found %u new report(s)", nrep); if (nrep) { if (!sender.send()) { LOG_ERROR("Sender failed, disabling pskreporter"); return false; } return progress(); } gc(); save_queue(); return true; } // Delete sent reports that are older than DUP_INTERVAL seconds void pskrep::gc(void) { time_t threshold = time(NULL) - DUP_INTERVAL; unsigned rm = 0; for (queue_t::iterator i = queue.begin(); i != queue.end() ; ) { for (call_map_t::iterator j = i->second.begin(); j != i->second.end() ; ) { band_map_t& b = j->second; band_map_t::iterator k = find_if(b.begin(), b.end(), not_sent); if (k != b.begin() && k == b.end()) --k; rm += k - b.begin(); k = b.erase(b.begin(), k); if (k != b.end() && k->status == PSKR_STATUS_SENT && k->rtime <= threshold) { b.erase(k); rm++; } if (b.empty()) i->second.erase(j++); else ++j; } if (i->second.empty()) queue.erase(i++); else ++i; } LOG_VERBOSE("Removed %u sent report(s)", rm); } static std::ostream& operator<<(std::ostream& out, const rcpt_report_t& r); static std::istream& operator>>(std::istream& in, rcpt_report_t& r); static std::ostream& operator<<(std::ostream& out, const queue_t& q); static std::istream& operator>>(std::istream& in, queue_t& q); void pskrep::save_queue(void) { std::string fname = TempDir; fname.append(PSKREP_QUEUE_FILE); std::ofstream out(fname.c_str()); if (out) out << queue; else LOG_ERROR("Could not write %s", fname.c_str()); } void pskrep::load_queue(void) { std::string fname = TempDir; fname.append(PSKREP_QUEUE_FILE); std::ifstream in(fname.c_str()); if (!in) return; in >> queue; // restore pending reports as new for (queue_t::iterator i = queue.begin(); i != queue.end(); ++i) for (call_map_t::iterator j = i->second.begin(); j != i->second.end(); ++j) for (band_map_t::iterator k = j->second.begin(); k != j->second.end(); ++k) if (k->status == PSKR_STATUS_PENDING) k->status = PSKR_STATUS_NEW; } // ------------------------------------------------------------------------------------------------- // Text fields must be <= 254 bytes #define MAX_TEXT_SIZE 254 // Records must be padded to a multiple of 4 #define PAD 4 pskrep_sender::pskrep_sender(const std::string& call, const std::string& loc, const std::string& ant, const std::string& host_, const std::string& port_, const std::string& long_id_, const std::string& short_id_) : recv_callsign(call, 0, MAX_TEXT_SIZE), recv_locator(loc, 0, MAX_TEXT_SIZE), recv_antenna(ant, 0, MAX_TEXT_SIZE), host(host_, 0, MAX_TEXT_SIZE), port(port_, 0, MAX_TEXT_SIZE), long_id(long_id_, 0, LONG_ID_SIZE), short_id(short_id_, 0, SHORT_ID_SIZE), sequence_number(0), template_count(2 * TEMPLATE_THRESHOLD), last_template(0), send_socket(0), dgram_size(0), report_offset(0) { create_socket(); dgram = new unsigned char[DGRAM_MAX]; write_station_info(); } pskrep_sender::~pskrep_sender() { delete send_socket; delete [] dgram; } // fldigi uses 0x0219 as the long station info template id (bytes 4,5) const unsigned char pskrep_sender::long_station_info_template[] = { 0x00, 0x03, 0x00, 0x34, 0x02, 0x19, 0x00, 0x05, 0x00, 0x00, 0x80, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverCallsign 0x80, 0x04, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverLocator 0x80, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x76, 0x8F, // persistentIdentifier 0x80, 0x08, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // decoderSoftware 0x80, 0x09, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // anntennaInformation 0x00, 0x00 }; // fldigi uses 0x0218 as the short station info template id (bytes 4,5) const unsigned char pskrep_sender::short_station_info_template[] = { 0x00, 0x03, 0x00, 0x24, 0x02, 0x18, 0x00, 0x03, 0x00, 0x00, 0x80, 0x02, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverCallsign 0x80, 0x04, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // receiverLocator 0x80, 0x0C, 0x00, 0x08, 0x00, 0x00, 0x76, 0x8F, // persistentIdentifier 0x00, 0x00 }; void pskrep_sender::write_station_info(void) { char prog_info[MAX_TEXT_SIZE]; size_t prog_len; prog_len = snprintf(prog_info, sizeof(prog_info), "%s", PACKAGE_TARNAME "-" PACKAGE_VERSION); prog_len = MIN(prog_len, sizeof(prog_info)); struct utsname u; if (uname(&u) != -1) { prog_len += snprintf(prog_info+prog_len, sizeof(prog_info)-prog_len, "/%s-%s", u.sysname, u.machine); prog_len = MIN(prog_len, sizeof(prog_info)); } size_t call_len = recv_callsign.length(), loc_len = recv_locator.length(), ant_len = recv_antenna.length(); size_t long_len, short_len; // Long station info length long_len = 4 + // 4-byte header 1 + call_len + // 1-byte call length + call string length 1 + loc_len + // 1-byte loc length + loc string length 8 + // 8-byte identifier 1 + prog_len + // 1-byte prog length + prog string length 1 + ant_len; // 1-byte ant length + ant string length long_len = pad(long_len, PAD); // Short station info length short_len = 4 + // 4-byte header 1 + call_len + // 1-byte call length + call string length 1 + loc_len + // 1-byte loc length + loc string length 8; // 8-byte identifier short_len = pad(short_len, PAD); long_station_info.resize(long_len); short_station_info.resize(short_len); unsigned char* p; size_t npad; // Write the long station info p = &long_station_info[0]; // header memcpy(p, long_station_info_template + 4, 2); p += 2; *reinterpret_cast(p) = htons(long_len); p += sizeof(uint16_t); // call *p++ = call_len; memcpy(p, recv_callsign.data(), call_len); p += call_len; // locator *p++ = loc_len; memcpy(p, recv_locator.data(), loc_len); p += loc_len; // identifier memcpy(p, long_id.data(), LONG_ID_SIZE); p += LONG_ID_SIZE; // program *p++ = prog_len; memcpy(p, prog_info, prog_len); p += prog_len; // antenna *p++ = ant_len; memcpy(p, recv_antenna.data(), ant_len); p += ant_len; // pad npad = &long_station_info[0] + long_len - p; if (npad) memset(p, 0, npad); LOG_VERBOSE("long_station_info=\"%s\"", str2hex(&long_station_info[0], long_len)); // Write the short station info p = &short_station_info[0]; // header memcpy(p, short_station_info_template + 4, 2); p += 2; *reinterpret_cast(p) = htons(short_len); p += sizeof(uint16_t); // call *p++ = call_len; memcpy(p, recv_callsign.data(), call_len); p += call_len; // locator *p++ = loc_len; memcpy(p, recv_locator.data(), loc_len); p += loc_len; // identifier memcpy(p, long_id.data(), LONG_ID_SIZE); p += LONG_ID_SIZE; // pad npad = &short_station_info[0] + short_len - p; if (npad) memset(p, 0, npad); LOG_VERBOSE("short_station_info=\"%s\"", str2hex(&short_station_info[0], short_len)); } // fldigi uses 0x022C as the reception record template id (bytes 4,5) const unsigned char pskrep_sender::rcpt_record_template[] = { 0x00, 0x02, 0x00, 0x34, 0x02, 0x2C, 0x00, 0x06, 0x80, 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // senderCallsign 0x00, 0x96, 0x00, 0x04, // flowStartSeconds 0x80, 0x05, 0x00, 0x04, 0x00, 0x00, 0x76, 0x8F, // frequency 0x80, 0x0A, 0xFF, 0xFF, 0x00, 0x00, 0x76, 0x8F, // mode (adif string) 0x80, 0x03, 0xff, 0xff, 0x00, 0x00, 0x76, 0x8F, // senderLocator (if known) 0x80, 0x0B, 0x00, 0x01, 0x00, 0x00, 0x76, 0x8F // flags (informationSource) }; void pskrep_sender::write_preamble(void) { time_t now = time(NULL); unsigned char* p = dgram; // header *p++ = 0x00; *p++ = 0x0A; /* length written later */ p += 2; /* time written later */ p += sizeof(uint32_t); *reinterpret_cast(p) = htonl(sequence_number); p += sizeof(uint32_t); memcpy(p, short_id.data(), SHORT_ID_SIZE); p += SHORT_ID_SIZE; const unsigned char* station_info_template(long_station_info_template); size_t tlen; std::vector* station_info(&long_station_info); if (template_count == 0 && now - last_template >= TEMPLATE_INTERVAL) template_count = TEMPLATE_THRESHOLD; if (template_count > TEMPLATE_THRESHOLD) { station_info_template = long_station_info_template; tlen = sizeof(long_station_info_template); station_info = &long_station_info; } else if (template_count != 0) { station_info_template = short_station_info_template; tlen = sizeof(short_station_info_template); station_info = &short_station_info; } if (template_count > 0) { memcpy(p, rcpt_record_template, sizeof(rcpt_record_template)); p += sizeof(rcpt_record_template); memcpy(p, station_info_template, tlen); p += tlen; template_count--; last_template = now; } // station info record memcpy(p, &(*station_info)[0], station_info->size()); p += station_info->size(); report_offset = p - dgram; // write report record header memcpy(p, rcpt_record_template + 4, 2); p += 2; /* length written later */ p += sizeof(uint16_t); dgram_size = p - dgram; } bool pskrep_sender::append(const std::string& callsign, const band_map_t::value_type& r) { guard_lock dsp_lock(&pskrep_mutex); if (dgram_size == 0) write_preamble(); size_t call_len = callsign.length(); call_len = MIN(MAX_TEXT_SIZE, call_len); const char* mode = mode_info[r.mode].adif_name; size_t mode_len = strlen(mode); mode_len = MIN(MAX_TEXT_SIZE, mode_len); size_t loc_len = MIN(MAX_TEXT_SIZE, r.locator.length()); // call_len + call + time + freq + mode_len + mode + loc_len + loc + info size_t rlen = 1 + call_len + 4 + 4 + 1 + mode_len + 1 + loc_len + 1; if (pad(rlen, PAD) + dgram_size > DGRAM_MAX) // datagram full return false; LOG_INFO("Appending report (call=%s mode=%s freq=%d time=%d type=%u)", callsign.c_str(), mode, //mode_info[r.mode].adif_name, static_cast(r.freq), static_cast(r.rtime), r.rtype); unsigned char* start = dgram + dgram_size; unsigned char* p = start; // call *p++ = call_len; memcpy(p, callsign.data(), call_len); p += call_len; // 4-byte reception time *reinterpret_cast(p) = htonl(r.rtime); p += sizeof(uint32_t); // 4-byte freq *reinterpret_cast(p) = htonl(r.freq); p += sizeof(uint32_t); // mode *p++ = mode_len; memcpy(p, mode, mode_len); p += mode_len; // locator *p++ = loc_len; memcpy(p, r.locator.data(), loc_len); p += loc_len; // info source *p++ = r.rtype; LOG_VERBOSE(" \"%s\"", str2hex(start, p - start)); dgram_size += rlen; return true; } void* pskrep_sender::resolver(void* obj) { pskrep_sender* s = reinterpret_cast(obj); try { s->send_socket = new Socket(Address(s->host.c_str(), s->port.c_str(), "udp")); s->send_socket->connect(); } catch (const SocketException& e) { LOG_ERROR("Could not resolve %s: %s", s->host.c_str(), e.what()); } return NULL; } void pskrep_sender::create_socket(void) { if (pthread_create(&resolver_thread, NULL, resolver, this) != 0) LOG_PERROR("pthread_create"); } bool pskrep_sender::send(void) { if (!send_socket) return false; // empty dgram or no reports (shouldn't happen) if (dgram_size == 0 || dgram_size == report_offset + 4) { std::stringstream info; info << dgram_size << " " << report_offset; LOG_VERBOSE("Not sending empty dgram: %s", info.str().c_str()); return false; } // Finish writing the report record: // do we need padding? size_t npad = (dgram_size - report_offset) % PAD; if (npad) { npad = PAD - npad; memset(dgram + dgram_size, 0x0, npad); dgram_size += npad; } // write length *reinterpret_cast(dgram + report_offset + 2) = htons(dgram_size - report_offset); // finish writing the datagram *reinterpret_cast(dgram + 2) = htons(dgram_size); *reinterpret_cast(dgram + 4) = htonl(time(NULL)); bool ret; { std::stringstream info; info << "(" << dgram_size << "): \"" << str2hex(dgram, dgram_size) << "\""; LOG_VERBOSE("Sending datgram %s", info.str().c_str()); } try { if ((size_t)send_socket->send(dgram, dgram_size) != dgram_size) throw SocketException("short write"); ret = true; } catch (const SocketException& e) { LOG_ERROR("Could not send datagram to %s port %s: %s", host.c_str(), port.c_str(), e.what()); ret = false; } // increment this regardless of any errors sequence_number++; dgram_size = 0; return ret; } // Pad len to a multiple of mult size_t pskrep_sender::pad(size_t len, size_t mult) { size_t r = len % mult; return r ? len + mult - r : len; } // ------------------------------------------------------------------------------------------------- static std::istream& operator>>(std::istream& in, rtype_t& t) { int i; in >> i; t = static_cast(i); return in; } static std::istream& operator>>(std::istream& in, status_t& t) { int i; in >> i; t = static_cast(i); return in; } static std::istream& operator>>(std::istream& in, rcpt_report_t& r) { in >> r.mode >> r.freq >> r.rtime >> r.rtype >> r.status >> r.locator; if (*r.locator.c_str() == '?') r.locator.clear(); return in; } static std::ostream& operator<<(std::ostream& out, const rcpt_report_t& r) { return out << r.mode << ' ' << r.freq << ' ' << r.rtime << ' ' << r.rtype << ' ' << r.status << ' ' << (r.locator.empty() ? "?" : r.locator); } static std::ostream& operator<<(std::ostream& out, const queue_t& q) { for (queue_t::const_iterator i = q.begin(); i != q.end(); ++i) for (call_map_t::const_iterator j = i->second.begin(); j != i->second.end(); ++j) for (band_map_t::const_iterator k = j->second.begin(); k != j->second.end(); ++k) out << *k << " " << j->first << " " << i->first << '\n'; return out; } static std::istream& operator>>(std::istream& in, queue_t& q) { rcpt_report_t rep; int band; std::string call; while (in >> rep >> band >> call) q[call][static_cast(band)].push_back(rep); return in; } fldigi-4.2.05/src/spot/notify.cxx0000664000175000017500000015330514611711171013602 00000000000000// ---------------------------------------------------------------------------- // notify.cxx // // Copyright (C) 2009-2010 // Stelios Bounanos, M0GLD // // Generic notifier // // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "timeops.h" #if HAVE_STD_HASH # define MAP_TYPE std::unordered_map # define HASH_TYPE std::hash # include #else # if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) # define MAP_TYPE std::tr1::unordered_map # include # else // use the non-standard gnu hash_map on gcc <= 4.0.x, // which has a broken tr1::unordered_map::operator= # define MAP_TYPE __gnu_cxx::hash_map # include namespace __gnu_cxx { // define the missing hash specialisation for std::string // using the 'const char*' hash function template<> struct hash { size_t operator()(const std::string& s) const { return __stl_hash_string(s.c_str()); } }; } # endif #endif #include #include #include #ifdef __MINGW32__ # include #endif #include #include #include #include #include #include #include "flinput2.h" #include "flmisc.h" #include "macros.h" #include "debug.h" #include "dxcc.h" #include "spot.h" #include "pskrep.h" #include "logsupport.h" #include "re.h" #include "fileselect.h" #include "icons.h" #include "configuration.h" #include "macroedit.h" #include "main.h" #include "fl_digi.h" #include "waterfall.h" #include "globals.h" #include "trx.h" #include "rsid.h" #include "gettext.h" #include "notifydialog.h" #include "notify.h" #include "qrunner.h" struct notify_action_t { std::string alert; std::string rx_marker; std::string macro; std::string program; time_t alert_timeout; time_t trigger_limit; }; enum notify_filter_match_t { NOTIFY_FILTER_CALLSIGN, NOTIFY_FILTER_DXCC }; typedef MAP_TYPE notify_filter_dxcc_t; struct notify_filter_t { notify_filter_match_t match; std::string callsign; notify_filter_dxcc_t dxcc; std::string dxcc_last; bool nwb, lotw, eqsl; }; struct notify_dup_t { time_t when; band_t band; trx_mode mode; unsigned long long freq; }; typedef MAP_TYPE notify_seen_t; enum notify_event_t { NOTIFY_EVENT_MYCALL, NOTIFY_EVENT_STATION, NOTIFY_EVENT_CUSTOM, NOTIFY_EVENT_RSID, NOTIFY_EVENT_RSID_EOT }; struct notify_t { notify_event_t event; time_t last_trigger; std::string re; bool enabled; int afreq; unsigned long long rfreq; trx_mode mode; const char* match_string; const regmatch_t* submatch_offsets; size_t submatch_length; notify_dup_t dup; bool dup_ignore; size_t dup_ref; notify_seen_t last_seen; notify_action_t action; notify_filter_t filter; }; typedef std::list notify_list_t; static void notify_init_window(void); static void notify_save(void); static void notify_load(void); static void notify_register(notify_t& n); static void notify_unregister(const notify_t& n); static void notify_set_qsodb_cache(void); static void notify_event_cb(Fl_Widget* w, void* arg); static void notify_select_cb(Fl_Widget* w, void* arg); static void notify_dxcc_browse_cb(Fl_Widget* w, void* arg); static void notify_add_cb(Fl_Widget* w, void* arg); static void notify_remove_cb(Fl_Widget* w, void* arg); static void notify_update_cb(Fl_Widget* w, void* arg); static void notify_dialog_default_cb(Fl_Widget* w, void* arg); static void notify_rx_default_cb(Fl_Widget* w, void* arg); static void notify_macro_edit_cb(Fl_Widget* w, void* arg); static void notify_program_select_cb(Fl_Widget* w, void* arg); static void notify_dxcc_check_cb(Fl_Widget* w, void* arg); static void notify_test_cb(Fl_Widget* w, void* arg); static void notify_filter_dxcc_select_cb(Fl_Widget* w, void* arg); static void notify_filter_dxcc_search(Fl_Widget* w, void* arg); static void notify_dup_ignore_cb(Fl_Widget* w, void* arg); static void notify_re_cb(Fl_Widget* w, void* arg); static void notify_recv(trx_mode mode, int afreq, const char* str, const regmatch_t* sub, size_t len, void* data); static void notify_table_append(const notify_t& n); //////////////////////////////////////////////////////////////////////////////// struct event_regex_t { const char* regex; size_t index; }; static Fl_Menu_Item notify_event_menu[] = { { _("My callsign de CALL") }, { _("Station heard twice") }, { _("Custom text search") }, { _("RSID reception") }, { _("RSID EOT") }, { 0 } }; #define NOTIFY_SET_DUP_MENU (void*)1 enum { NOTIFY_LIST_MENU_TOGGLE, NOTIFY_LIST_MENU_UPDATE, NOTIFY_LIST_MENU_REMOVE }; static Fl_Menu_Item notify_list_context_menu[] = { { icons::make_icon_label(_("Toggle"), shutdown_icon), 0, notify_update_cb, (void*)NOTIFY_LIST_MENU_TOGGLE }, { icons::make_icon_label(_("Update"), refresh_icon), 0, notify_update_cb, (void*)NOTIFY_LIST_MENU_UPDATE }, { icons::make_icon_label(_("Remove"), minus_icon), 0, notify_remove_cb, (void*)NOTIFY_LIST_MENU_REMOVE }, { 0 } }; enum { NOTIFY_DXCC_SELECT_CONT, NOTIFY_DXCC_SELECT_ITU, NOTIFY_DXCC_SELECT_CQ, NOTIFY_DXCC_SELECT_ALL, NOTIFY_DXCC_DESELECT_CONT, NOTIFY_DXCC_DESELECT_ITU, NOTIFY_DXCC_DESELECT_CQ, NOTIFY_DXCC_DESELECT_ALL }; static Fl_Menu_Item notify_dxcc_context_menu[] = { { _("Select"), 0, 0, 0, FL_SUBMENU }, { _("Continent"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_CONT }, { _("ITU zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_ITU }, { _("CQ zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_CQ, FL_MENU_DIVIDER }, { _("All"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_ALL }, { 0 }, { _("Deselect"), 0, 0, 0, FL_SUBMENU }, { _("Continent"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_CONT }, { _("ITU zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_ITU }, { _("CQ zone"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_CQ, FL_MENU_DIVIDER }, { _("All"), 0, notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_ALL }, { 0 }, { 0 } }; static event_regex_t event_regex[] = { { ".+de[[:space:]]+()", 1 }, { PSKREP_RE, PSKREP_RE_INDEX }, { "", 0 }, { "", 1 }, { "", 0 } }; static const char* default_alert_text[] = { "$CALLSIGN is calling you\n $TEXT\nTime: %X %Z (%z)\nMode: $MODEM @ $RF_KHZ KHz", "Heard $CALLSIGN ($COUNTRY)\n $TEXT\nTime: %X %Z (%z)\nMode: $MODEM @ $RF_KHZ KHz", "", "RSID received\nMode: $MODEM @ $RF_KHZ KHz\nTime: %X %Z (%z)", "RSID End of Transmission", }; static Fl_Menu_Item notify_dup_callsign_menu[] = { { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { "" }, { 0 } }; static Fl_Menu_Item notify_dup_refs_menu[] = { { "Substring \\0" }, { "Substring \\1" }, { "Substring \\2" }, { "Substring \\3" }, { "Substring \\4" }, { "Substring \\5" }, { "Substring \\6" }, { "Substring \\7" }, { "Substring \\8" }, { "Substring \\9" }, { 0 } }; enum { NOTIFY_DXCC_COL_SEL, NOTIFY_DXCC_COL_CN, NOTIFY_DXCC_COL_CT, NOTIFY_DXCC_COL_ITU, NOTIFY_DXCC_COL_CQ, NOTIFY_DXCC_NUMCOL }; template static T& advli(T& i, int n) { advance(i, n); return i; } template static T advli(T i, U n) { advance(i, n); return i; } static notify_list_t notify_list; static notify_t notify_tmp; static const std::vector* dxcc_list; Fl_Double_Window* notify_window; Fl_Double_Window* dxcc_window; //////////////////////////////////////////////////////////////////////////////// // public interface //////////////////////////////////////////////////////////////////////////////// void notify_start(void) { if (!notify_window) notify_init_window(); notify_load(); if (!notify_list.empty()) { for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->enabled) notify_register(*i); tblNotifyList->value(0); tblNotifyList->do_callback(); notify_set_qsodb_cache(); } } void notify_stop(void) { for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) notify_unregister(*i); notify_list.clear(); notify_set_qsodb_cache(); tblNotifyList->clear(); } void notify_show(void) { if (!notify_window) notify_window = make_notify_window(); notify_window->show(); } // display the dxcc window void notify_dxcc_show(bool readonly) { if (!dxcc_list) return; if (readonly) { btnNotifyDXCCSelect->hide(); btnNotifyDXCCDeselect->hide(); tblNotifyFilterDXCC->callback(Fl_Widget::default_callback); tblNotifyFilterDXCC->menu(0); btnNotifyDXCCDeselect->do_callback(); // deselect all if (dxcc_window->shown()) dxcc_window->hide(); if (dxcc_window->modal()) dxcc_window->set_non_modal(); } else { btnNotifyDXCCSelect->show(); btnNotifyDXCCDeselect->show(); tblNotifyFilterDXCC->callback(notify_dxcc_check_cb); tblNotifyFilterDXCC->menu(notify_dxcc_context_menu); dxcc_window->set_modal(); } dxcc_window->show(); } // called by the myCall callback when the operator callsign is changed void notify_change_callsign(void) { for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) { if (i->event == NOTIFY_EVENT_MYCALL) { // re-register notify_unregister(*i); notify_register(*i); } } } // called by the RSID decoder void notify_rsid(trx_mode mode, int afreq) { const char* mode_name = mode_info[mode].name; regmatch_t sub[2] = { { 0, (regoff_t)strlen(mode_name) } }; sub[1] = sub[0]; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->event == NOTIFY_EVENT_RSID) notify_recv(mode, afreq, mode_name, sub, 2, &*i); } // called by the RSID decoder void notify_rsid_eot(trx_mode mode, int afreq) { const char* mode_name = mode_info[mode].name; regmatch_t sub[2] = { { 0, (regoff_t)strlen(mode_name) } }; sub[1] = sub[0]; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->event == NOTIFY_EVENT_RSID_EOT) notify_recv(mode, afreq, mode_name, sub, 2, &*i); } // called by the config dialog when the "notifications only" // rsid option is selected void notify_create_rsid_event(bool val) { if (!val) return; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) if (i->event == NOTIFY_EVENT_RSID || i->event == NOTIFY_EVENT_RSID_EOT) return; notify_t rsid_event = { NOTIFY_EVENT_RSID, 0, "", true, 0, 0LL, NUM_MODES, NULL, NULL, 0, { 0, NUM_BANDS, NUM_MODES, 0LL }, false, 0 }; notify_action_t rsid_action = { default_alert_text[NOTIFY_EVENT_RSID], "", "", "", 30, 1 }; rsid_event.action = rsid_action; notify_list.push_back(rsid_event); notify_table_append(notify_list.back()); tblNotifyList->do_callback(); notify_save(); } //////////////////////////////////////////////////////////////////////////////// // misc utility functions //////////////////////////////////////////////////////////////////////////////// static void notify_set_event_dup(const notify_t& n); static void notify_set_event_dup_menu(const char* re); static bool notify_dxcc_row_checked(int i); // return actual regular expression for event n static std::string notify_get_re(const notify_t& n) { std::string::size_type pos; std::string s = n.re; struct { const char* str; const char* rep; } subst[] = { { "", progdefaults.myCall.c_str() }, { "", CALLSIGN_RE } }; for (size_t i = 0; i < sizeof(subst)/sizeof(*subst); i++) if ((pos = s.find(subst[i].str)) != std::string::npos) s.replace(pos, strlen(subst[i].str), subst[i].rep); return s; } // set the widget values using event n static void notify_event_to_gui(const notify_t& n) { // event mnuNotifyEvent->value(n.event); notify_event_cb(mnuNotifyEvent, 0); if (!n.re.empty() && inpNotifyRE->visible()) inpNotifyRE->value(n.re.c_str()); btnNotifyEnabled->value(n.enabled); // action inpNotifyActionDialog->value(n.action.alert.c_str()); inpNotifyActionRXMarker->value(n.action.rx_marker.c_str()); inpNotifyActionMacro->value(n.action.macro.c_str()); inpNotifyActionProgram->value(n.action.program.c_str()); cntNotifyActionLimit->value(n.action.trigger_limit); cntNotifyActionDialogTimeout->value(n.action.alert_timeout); // dup chkNotifyDupIgnore->value(n.dup_ignore); chkNotifyDupIgnore->do_callback(); notify_set_event_dup(n); cntNotifyDupTime->value(n.dup.when); chkNotifyDupBand->value(n.dup.band); chkNotifyDupMode->value(n.dup.mode); // filter btnNotifyDXCCDeselect->do_callback(); // deselect all if (!grpNotifyFilter->active()) return; chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); inpNotifyFilterCall->value(0); if (n.filter.match == NOTIFY_FILTER_CALLSIGN) { chkNotifyFilterCall->value(1); inpNotifyFilterCall->show(); inpNotifyFilterCall->value(n.filter.callsign.c_str()); } else if (n.filter.match == NOTIFY_FILTER_DXCC) { chkNotifyFilterDXCC->value(1); btnNotifyFilterDXCC->show(); } chkNotifyFilterNWB->value(n.filter.nwb); chkNotifyFilterLOTW->value(n.filter.lotw); chkNotifyFilterEQSL->value(n.filter.eqsl); } // copy widget values to event n static void notify_gui_to_event(notify_t& n) { // event n.event = static_cast(mnuNotifyEvent->value()); n.last_trigger = 0; if (n.event == NOTIFY_EVENT_CUSTOM) n.re = inpNotifyRE->value(); else if (n.event != NOTIFY_EVENT_RSID_EOT) n.re = event_regex[n.event].regex; n.enabled = btnNotifyEnabled->value(); n.afreq = 0; n.rfreq = 0; n.match_string = 0; n.submatch_offsets = 0; n.submatch_length = 0; // action n.action.alert = inpNotifyActionDialog->value(); n.action.rx_marker = inpNotifyActionRXMarker->value(); n.action.macro = inpNotifyActionMacro->value(); n.action.program = inpNotifyActionProgram->value(); n.action.trigger_limit = static_cast(cntNotifyActionLimit->value()); n.action.alert_timeout = static_cast(cntNotifyActionDialogTimeout->value()); // filter if (chkNotifyFilterCall->value()) { n.filter.callsign = inpNotifyFilterCall->value(); n.filter.match = NOTIFY_FILTER_CALLSIGN; } else if (chkNotifyFilterDXCC->value()) { n.filter.match = NOTIFY_FILTER_DXCC; n.filter.dxcc.clear(); for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) { if (notify_dxcc_row_checked(i)) n.filter.dxcc[tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_CN)] = true; } } n.filter.nwb = chkNotifyFilterNWB->value(); n.filter.lotw = chkNotifyFilterLOTW->value(); n.filter.eqsl = chkNotifyFilterEQSL->value(); // dup n.dup_ignore = chkNotifyDupIgnore->value(); n.dup_ref = mnuNotifyDupWhich->value(); n.dup.when = static_cast(cntNotifyDupTime->value()); n.dup.band = chkNotifyDupBand->value() ? NUM_BANDS : static_cast(0); n.dup.mode = chkNotifyDupMode->value() ? NUM_MODES : static_cast(0); } // initialise the notifications window static void notify_init_window(void) { notify_window = make_notify_window(); notify_window->xclass(PACKAGE_TARNAME); dxcc_window = make_dxcc_window(); dxcc_window->xclass(PACKAGE_TARNAME); struct { Fl_Button* button; const char* label; } buttons[] = { { btnNotifyAdd, icons::make_icon_label(_("Add"), plus_icon) }, { btnNotifyRemove, icons::make_icon_label(_("Remove"), minus_icon) }, { btnNotifyUpdate, icons::make_icon_label(_("Update"), refresh_icon) }, { btnNotifyTest, icons::make_icon_label(_("Test..."), applications_system_icon) }, { btnNotifyClose, icons::make_icon_label(_("Close"), close_icon) }, { btnNotifyDXCCSelect, icons::make_icon_label(_("Select All"), edit_select_all_icon) }, { btnNotifyDXCCDeselect, icons::make_icon_label(_("Clear All"), edit_clear_icon) }, { btnNotifyDXCCClose, icons::make_icon_label(_("Close"), close_icon) }, }; for (size_t i = 0; i < sizeof(buttons)/sizeof(*buttons); i++) { buttons[i].button->label(buttons[i].label); icons::set_icon_label(buttons[i].button); buttons[i].button->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); } struct { Fl_Button* button; const char** icon; } buttons2[] = { { btnNotifyFilterDXCC, text_editor_icon }, { btnNotifyActionDialogDefault, text_icon }, { btnNotifyActionMarkerDefault, text_icon }, { btnNotifyActionMacro, text_editor_icon }, { btnNotifyActionProgram, folder_open_icon } }; for (size_t i = 0; i < sizeof(buttons2)/sizeof(*buttons2); i++) buttons2[i].button->image(new Fl_Pixmap(buttons2[i].icon)); inpNotifyRE->hide(); grpNotifyFilter->deactivate(); mnuNotifyEvent->menu(notify_event_menu); btnNotifyEnabled->value(1); inpNotifyRE->callback(notify_re_cb); int w = (tblNotifyList->w() - Fl::box_dw(tblNotifyList->box())) / 4; struct col_info_t { const char* label; int width; }; col_info_t ncols[] = { { "Event", w + 30 }, { "Filter", w + 30 }, { "Action", w - 30 }, { "Enabled", w - 30 }, }; for (size_t i = 0; i < sizeof(ncols)/sizeof(*ncols); i++) { tblNotifyList->addColumn(ncols[i].label, ncols[i].width, static_cast(FL_ALIGN_CENTER | FL_ALIGN_CLIP)); } tblNotifyList->rowSize(FL_NORMAL_SIZE); tblNotifyList->headerSize(FL_NORMAL_SIZE); tblNotifyList->allowSort(false); tblNotifyList->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED); tblNotifyList->menu(notify_list_context_menu); for (int i = 0; i < notify_list_context_menu->size(); i++) icons::set_icon_label(¬ify_list_context_menu[i]); w = (tblNotifyFilterDXCC->w() - Fl::box_dw(tblNotifyFilterDXCC->box()) - tblNotifyFilterDXCC->scrollbSize()) / NOTIFY_DXCC_NUMCOL; col_info_t dcols[NOTIFY_DXCC_NUMCOL] = { { "", 25 }, { _("Country"), w + w - 25 + 2*(w - 45) }, { _("Continent"), w }, { "ITU", 45 }, { "CQ", 45 } }; for (size_t i = 0; i < NOTIFY_DXCC_NUMCOL; i++) { tblNotifyFilterDXCC->addColumn(dcols[i].label, dcols[i].width, static_cast(FL_ALIGN_CENTER | FL_ALIGN_CLIP), strcmp); } tblNotifyFilterDXCC->columnAlign(NOTIFY_DXCC_COL_CN, static_cast(FL_ALIGN_LEFT | FL_ALIGN_CLIP)); tblNotifyFilterDXCC->rowSize(FL_NORMAL_SIZE); tblNotifyFilterDXCC->headerSize(FL_NORMAL_SIZE); tblNotifyFilterDXCC->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED); tblNotifyFilterDXCC->menu(notify_dxcc_context_menu); btnNotifyDXCCSelect->callback(notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_SELECT_ALL); btnNotifyDXCCDeselect->callback(notify_filter_dxcc_select_cb, (void*)NOTIFY_DXCC_DESELECT_ALL); inpNotifyDXCCSearchCountry->callback(notify_filter_dxcc_search); inpNotifyDXCCSearchCountry->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED | FL_WHEN_ENTER_KEY); inpNotifyDXCCSearchCallsign->callback(notify_filter_dxcc_search); inpNotifyDXCCSearchCallsign->when(FL_WHEN_CHANGED); inpNotifyDXCCSearchCallsign->textfont(FL_HELVETICA); inpNotifyActionDialog->textfont(FL_HELVETICA); inpNotifyActionRXMarker->textfont(FL_HELVETICA); inpNotifyActionMacro->textfont(FL_HELVETICA); inpNotifyActionProgram->textfont(FL_HELVETICA); inpNotifyRE->textfont(FL_HELVETICA); inpNotifyFilterCall->textfont(FL_HELVETICA); tblNotifyList->callback(notify_select_cb); mnuNotifyEvent->callback(notify_event_cb, NOTIFY_SET_DUP_MENU); btnNotifyFilterDXCC->callback(notify_dxcc_browse_cb); btnNotifyAdd->callback(notify_add_cb); btnNotifyRemove->callback(notify_remove_cb); btnNotifyUpdate->callback(notify_update_cb, (void*)NOTIFY_LIST_MENU_UPDATE); btnNotifyActionDialogDefault->callback(notify_dialog_default_cb); btnNotifyActionMarkerDefault->callback(notify_rx_default_cb); btnNotifyActionProgram->callback(notify_program_select_cb); btnNotifyActionMacro->callback(notify_macro_edit_cb); btnNotifyTest->callback(notify_test_cb); tblNotifyFilterDXCC->callback(notify_dxcc_check_cb); chkNotifyDupIgnore->callback(notify_dup_ignore_cb); mnuNotifyDupWhich->menu(notify_dup_refs_menu); chkNotifyFilterCall->value(0); chkNotifyFilterDXCC->value(0); inpNotifyFilterCall->hide(); btnNotifyFilterDXCC->hide(); chkNotifyDupIgnore->value(1); chkNotifyDupIgnore->do_callback(); chkNotifyDupBand->value(1); chkNotifyDupMode->value(1); cntNotifyDupTime->value(3600); mnuNotifyEvent->do_callback(); // for the dup menu dxcc_list = dxcc_entity_list(); if (dxcc_list) { char cq[5], itu[5]; for (std::vector::const_iterator i = dxcc_list->begin(); i != dxcc_list->end(); ++i) { snprintf(itu, sizeof(itu), "%02d", (*i)->itu_zone); snprintf(cq, sizeof(cq), "%02d", (*i)->cq_zone); tblNotifyFilterDXCC->addRow(NOTIFY_DXCC_NUMCOL, "[x]", (*i)->country, (*i)->continent, itu, cq); } } else { chkNotifyFilterDXCC->deactivate(); btnNotifyFilterDXCC->deactivate(); } unsigned char q = qsl_is_open(); if (!(q & (1 << QSL_LOTW))) chkNotifyFilterLOTW->deactivate(); if (!(q & (1 << QSL_EQSL))) chkNotifyFilterEQSL->deactivate(); } // append event n to the table widget static void notify_table_append(const notify_t& n) { // add to table std::string fcol, acol; if (n.event == NOTIFY_EVENT_MYCALL) fcol = "My callsign"; else if (n.event == NOTIFY_EVENT_STATION) { if (n.filter.match == NOTIFY_FILTER_CALLSIGN) fcol += "Callsign"; else if (n.filter.match == NOTIFY_FILTER_DXCC) fcol += "DXCC"; } else if (n.event == NOTIFY_EVENT_CUSTOM) fcol = n.re; if (n.filter.nwb) fcol += ", N"; if (n.filter.lotw) fcol += ", L"; if (n.filter.eqsl) fcol += ", E"; if (!n.action.alert.empty()) acol = "A"; if (!n.action.rx_marker.empty()) { if (!acol.empty()) acol += ", "; acol += "RX"; } if (!n.action.macro.empty()) { if (!acol.empty()) acol += ", "; acol += "TX"; } if (!n.action.program.empty()) { if (!acol.empty()) acol += ", "; acol += "P"; } tblNotifyList->addRow(4, notify_event_menu[n.event].label(), fcol.c_str(), acol.c_str(), n.enabled ? "Y" : "N"); tblNotifyList->value(tblNotifyList->rows() - 1); tblNotifyList->redraw(); } // clear and reload the event table static void notify_table_reload(void) { tblNotifyList->clear(); for (notify_list_t::const_iterator i = notify_list.begin(); i != notify_list.end(); ++i) notify_table_append(*i); } //////////////////////////////////////////////////////////////////////////////// // spotter and notification functions //////////////////////////////////////////////////////////////////////////////// static notify_dialog *alert_window = 0; static void notify_goto_freq_cb(Fl_Widget* w, void* arg) { const notify_t* n = static_cast(arg); if (progdefaults.rsid_mark && n->event != NOTIFY_EVENT_RSID_EOT) // mark current modem & freq REQ(note_qrg, false, "\nBefore RSID: ", "\n\n", active_modem->get_mode(), 0LL, active_modem->get_freq()); if (active_modem->get_mode() != n->mode) init_modem_sync(n->mode); qsy(n->rfreq, n->afreq); if (n->event == NOTIFY_EVENT_RSID && btnRSID->value() && progdefaults.rsid_auto_disable && progdefaults.rsid_notify_only) toggleRSID(); w->parent()->hide(); } static void notify_alert_window_cb(Fl_Widget* w, void* arg) { delete static_cast(arg); w->hide(); } static void notify_show_alert(const notify_t& n, const char* msg) { if (!alert_window) alert_window = new notify_dialog; if (alert_window->visible()) return; Fl_Button* goto_freq = alert_window->make_button(120); if (goto_freq) { char label[32]; snprintf(label, sizeof(label), "Go to %d Hz", n.afreq); goto_freq->copy_label(label); goto_freq->callback(notify_goto_freq_cb, new notify_t(n)); alert_window->callback(notify_alert_window_cb, goto_freq->user_data()); } alert_window->notify(msg, n.action.alert_timeout); REQ(show_notifier, alert_window); } struct replace_refs { enum { REF_MODEM, REF_DF_HZ, REF_RF_HZ, REF_RF_KHZ, REF_AF_HZ, REF_LF_KHZ, REF_CALLSIGN, REF_COUNTRY, REF_MATCHED_TEXT, REF_TEXT }; static void replace_var(const notify_t& n, int t, char* str, size_t len) { switch (t) { case REF_MODEM: strncpy(str, mode_info[n.mode].sname, len-1); str[len - 1] = '\0'; break; case REF_DF_HZ: snprintf(str, len, "%llu", wf->rfcarrier()); break; case REF_RF_HZ: case REF_RF_KHZ: { unsigned long long hz = wf->rfcarrier() + (wf->USB() ? n.afreq : -n.afreq); if (t == REF_RF_HZ) snprintf(str, len, "%llu", hz); else // REF_RF_KHZ snprintf(str, len, "%.3f", (double)hz / 1000.0); break; } case REF_AF_HZ: snprintf(str, len, "%d", n.afreq); break; case REF_LF_KHZ: strncpy(str, inpFreq->value(), len-1); str[len - 1] = '\0'; break; case REF_CALLSIGN: if (n.event == NOTIFY_EVENT_MYCALL || n.event == NOTIFY_EVENT_STATION) { std::stringstream info; info << "\\" << event_regex[n.event].index; strncpy(str, info.str().c_str(), len-1); } break; case REF_COUNTRY: if (n.event == NOTIFY_EVENT_STATION) { strncpy(str, n.filter.dxcc_last.c_str(), len-1); str[len - 1] = '\0'; } break; case REF_MATCHED_TEXT: snprintf(str, len, "\\0"); break; case REF_TEXT: strncpy(str, n.match_string, len-1); str[len - 1] = '\0'; break; } } void operator()(const notify_t& n, std::string& edit) { char buf[128]; std::string::size_type p; // replace $VARIABLES const char* vars[] = { "$MODEM", "$DF_HZ", "$RF_HZ", "$RF_KHZ", "$AF_HZ", "$LF_KHZ", "$CALLSIGN", "$COUNTRY", "$MATCHED_TEXT", "$TEXT" }; for (size_t i = 0; i < sizeof(vars)/sizeof(*vars); i++) { if ((p = edit.find(vars[i])) != std::string::npos) { replace_var(n, i, buf, sizeof(buf)); edit.replace(p, strlen(vars[i]), buf); } } // replace \X refs with regex substrings strcpy(buf, "\\0"); for (size_t i = 0; i < n.submatch_length; i++, buf[1]++) for (p = 0; (p = edit.find(buf, p)) != std::string::npos; p = 0) edit.replace(p, 2, n.match_string + n.submatch_offsets[i].rm_so, n.submatch_offsets[i].rm_eo - n.submatch_offsets[i].rm_so); } }; // perform the actions for event n static void notify_notify(const notify_t& n) { // show alert window with timeout if (!n.action.alert.empty()) { std::string alert = n.action.alert; replace_refs()(n, alert); if (alert.find('%') == std::string::npos) notify_show_alert(n, alert.c_str()); else { // treat alert text as strftime format string size_t len = alert.length() + 256; char* buf = new char[len]; time_t t = time(NULL); struct tm ts; if (localtime_r(&t, &ts) && strftime(buf, len, alert.c_str(), &ts)) notify_show_alert(n, buf); delete [] buf; } } // append to receive text if (!n.action.rx_marker.empty()) { std::string text = n.action.rx_marker; replace_refs()(n, text); std::string::size_type p; if ((p = text.find("$RX_MARKER")) != std::string::npos) { text[p] = '\0'; note_qrg(false, text.c_str(), text.c_str() + p + strlen("$RX_MARKER"), n.mode, 0LL, n.afreq); } else ReceiveText->addstr(text); } // expand macros and append to transmit text if (!n.action.macro.empty()) { MACROTEXT m; m.text[0] = n.action.macro; replace_refs()(n, m.text[0]); m.execute(0); } // define substring & macro variables and run program if (!n.action.program.empty()) { #ifndef __MINGW32__ switch (fork()) { case -1: LOG_PERROR("fork"); // fall through default: break; case 0: #endif char var[] = "FLDIGI_NOTIFY_STR_0"; std::string val; for (size_t i = 0; i < n.submatch_length; i++, var[sizeof(var) - 2]++) { val.assign(n.match_string + n.submatch_offsets[i].rm_so, n.submatch_offsets[i].rm_eo - n.submatch_offsets[i].rm_so); setenv(var, val.c_str(), 1); if (i == event_regex[n.event].index) setenv("FLDIGI_NOTIFY_CALLSIGN", val.c_str(), 1); } setenv("FLDIGI_NOTIFY_TEXT", n.match_string, 1); unsigned int un = n.submatch_length; snprintf(var, sizeof(var), "%u", un); setenv("FLDIGI_NOTIFY_STR_NUM", var, 1); snprintf(var, sizeof(var), "%d", n.afreq); setenv("FLDIGI_NOTIFY_AUDIO_FREQUENCY", var, 1); snprintf(var, sizeof(var), "%u", (unsigned)n.event); setenv("FLDIGI_NOTIFY_EVENT", var, 1); if (n.event == NOTIFY_EVENT_STATION) setenv("FLDIGI_NOTIFY_COUNTRY", n.filter.dxcc_last.c_str(), 1); set_macro_env(); // also set macro variables #ifdef __MINGW32__ char* cmd = strdup(n.action.program.c_str()); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd); #else execl("/bin/sh", "sh", "-c", n.action.program.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } #endif } } // return true if the event n is a dup static bool notify_is_dup(notify_t& n, const char* str, const regmatch_t* sub, size_t len, time_t now, int afreq, trx_mode mode) { if (n.event == NOTIFY_EVENT_RSID_EOT) return false; if (!n.dup_ignore) return false; if (n.dup_ref == 0 || n.dup_ref >= len) { std::stringstream info; info << "Bad dup_ref: " << n.dup_ref << " >= " << len; LOG_ERROR("%s", info.str().c_str()); return false; } const regmatch_t& subidx = sub[n.dup_ref]; std::string dupstr(subidx.rm_eo - subidx.rm_so, '\0'); transform(str + subidx.rm_so, str + subidx.rm_eo, dupstr.begin(), static_cast(toupper)); notify_dup_t cur = { now, band(wf->rfcarrier()), mode }; if (n.event == NOTIFY_EVENT_RSID) cur.freq = wf->rfcarrier() + (wf->USB() ? afreq : -afreq); notify_seen_t::iterator i; bool is_dup = false; if ((i = n.last_seen.find(dupstr)) != n.last_seen.end()) { const notify_dup_t& prev = i->second; is_dup = (cur.when - prev.when < n.dup.when); if (n.event == NOTIFY_EVENT_RSID) is_dup = is_dup && ::llabs(cur.freq - prev.freq) <= ceil(RSID_PRECISION); if (n.dup.band) is_dup = is_dup && cur.band == prev.band; if (n.dup.mode) is_dup = is_dup && cur.mode == prev.mode; } if (is_dup) return true; n.last_seen[dupstr] = cur; if (n.last_seen.size() > 1) { // remove old data for (i = n.last_seen.begin(); i != n.last_seen.end();) { if (now - i->second.when > n.dup.when) n.last_seen.erase(i++); else ++i; } } return false; } static fre_t notify_filter_call_re("", REG_EXTENDED | REG_NOSUB | REG_ICASE); // Called by the spotter when an event's regular expression matches the decoded text. // Also called by notify_rsid for RSID recepction with: the frequency in afreq, // the mode name in str, the str bounds in the sub array, and len = 1. static void notify_recv(trx_mode mode, int afreq, const char* str, const regmatch_t* sub, size_t len, void* data) { notify_t* n = reinterpret_cast(data); time_t now = time(0); // check if we may trigger this event if (!n->enabled || now - n->last_trigger < n->action.trigger_limit) return; switch (n->event) { case NOTIFY_EVENT_MYCALL: case NOTIFY_EVENT_CUSTOM: case NOTIFY_EVENT_RSID: case NOTIFY_EVENT_RSID_EOT: break; case NOTIFY_EVENT_STATION: size_t re_idx = event_regex[n->event].index; std::string call(str + sub[re_idx].rm_so, sub[re_idx].rm_eo - sub[re_idx].rm_so); const dxcc* e = dxcc_lookup(call.c_str()); if (n->filter.match == NOTIFY_FILTER_CALLSIGN) { if (e) // remember the country name we found n->filter.dxcc_last = e->country; if (!n->filter.callsign.empty()) { // the callsign must match if (notify_filter_call_re.re() != n->filter.callsign) // compile new re notify_filter_call_re.recompile(n->filter.callsign.c_str()); if (!notify_filter_call_re.match(call.c_str())) return; } else { // check for nwb, lotw, eqsl if (n->filter.nwb && SearchLog(call.c_str())) return; if ((n->filter.lotw || n->filter.eqsl) && qsl_is_open() && !(qsl_lookup(call.c_str()) & (1 << QSL_LOTW | 1 << QSL_EQSL))) return; } } else if (n->filter.match == NOTIFY_FILTER_DXCC) { if (e) { n->filter.dxcc_last = e->country; // if the dxcc filter is not empty, it must contain the country for call if (!n->filter.dxcc.empty() && n->filter.dxcc.find(e->country) == n->filter.dxcc.end()) return; if (n->filter.nwb && qsodb_dxcc_entity_find(e->country)) return; } if ((n->filter.lotw || n->filter.eqsl) && qsl_is_open() && !(qsl_lookup(call.c_str()) & (1 << QSL_LOTW | 1 << QSL_EQSL))) return; } break; } if (!notify_is_dup(*n, str, sub, len, now, afreq, mode)) { n->last_trigger = now; n->afreq = afreq; n->rfreq = wf->rfcarrier(); n->mode = mode; n->match_string = str; n->submatch_offsets = sub; n->submatch_length = std::min(len, (size_t)10); // whole string + up to 9 user-specified backrefs std::cout << "trigger: " << n->last_trigger << "\n" << "audio freq: " << n->afreq << "\n" << "rf carrier: " << n->rfreq << "\n" << "mode #: " << n->mode << "\n" << "mode: " << mode_info[n->mode].name << "\n" << "match: " << n->match_string << "\n" << "offsets: " << n->submatch_offsets << "\n" << "length: " << n->submatch_length << std::endl; notify_notify(*n); } } static void notify_set_qsodb_cache(void) { bool v = false; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) { if (i->event == NOTIFY_EVENT_STATION && i->filter.match == NOTIFY_FILTER_DXCC && i->enabled) { v = true; break; } } dxcc_entity_cache_enable(v); } // register event n with the spotter static void notify_register(notify_t& n) { if (n.event == NOTIFY_EVENT_RSID || n.event == NOTIFY_EVENT_RSID_EOT) return; spot_register_recv(notify_recv, &n, notify_get_re(n).c_str(), REG_EXTENDED | REG_ICASE); } // unregister event n static void notify_unregister(const notify_t& n) { if (n.event == NOTIFY_EVENT_RSID || n.event == NOTIFY_EVENT_RSID_EOT) return; spot_unregister_recv(notify_recv, &n); } //////////////////////////////////////////////////////////////////////////////// // callbacks //////////////////////////////////////////////////////////////////////////////// // the event table callback static void notify_select_cb(Fl_Widget* w, void* arg) { int v = tblNotifyList->value(); if (v >= 0) notify_event_to_gui(notify_tmp = *advli(notify_list.begin(), v)); } // the remove button/menu item callback static void notify_remove_cb(Fl_Widget* w, void*) { int v = tblNotifyList->value(); if (v < 0) return; // unregister notify_unregister(*advli(notify_list.begin(), v)); // remove from list notify_list.erase(advli(notify_list.begin(), v)); // remove from table tblNotifyList->removeRow(tblNotifyList->value()); // select next row if (w == btnNotifyRemove) { if (v >= tblNotifyList->rows()) v = tblNotifyList->rows() - 1; if (v >= 0) { tblNotifyList->value(v); notify_select_cb(tblNotifyList, 0); } } notify_save(); } enum { NOTIFY_CHECK_CUSTOM_RE_EMPTY = 1 << 0, NOTIFY_CHECK_CUSTOM_RE_VALID = 1 << 1, NOTIFY_CHECK_MYCALL_NOT_EMPTY = 1 << 2 }; // do some sanity checks on the widget values before adding/updating an event static bool notify_check(unsigned check) { if (mnuNotifyEvent->value() == NOTIFY_EVENT_CUSTOM) { if (check & NOTIFY_CHECK_CUSTOM_RE_EMPTY) { if (!inpNotifyRE->size()) { fl_alert2(_("The regular expression field must not be empty.")); return false; } } if (check & NOTIFY_CHECK_CUSTOM_RE_VALID) { if (!fre_t(inpNotifyRE->value(), REG_EXTENDED | REG_ICASE)) { fl_alert2(_("The regular expression must be valid.")); return false; } } } if ((check & NOTIFY_CHECK_MYCALL_NOT_EMPTY) && mnuNotifyEvent->value() == NOTIFY_EVENT_MYCALL) { if (progdefaults.myCall.empty()) { fl_alert2(_("Please set your callsign first.")); return false; } } // ... return true; } // the add button callback static void notify_add_cb(Fl_Widget* w, void* arg) { if (!notify_check(~0)) return; notify_gui_to_event(notify_tmp); // add to list notify_list.push_back(notify_tmp); // add to table notify_table_append(notify_list.back()); // register with spotter notify_register(notify_list.back()); // save file notify_save(); } // the update button/menu item callback static void notify_update_cb(Fl_Widget* w, void* arg) { int v = tblNotifyList->value(); if (v < 0) return; if (!notify_check(~0)) return; notify_t& nv = *advli(notify_list.begin(), v); if ((intptr_t)arg != NOTIFY_LIST_MENU_TOGGLE) { notify_gui_to_event(notify_tmp); nv = notify_tmp; if (nv.dup_ignore) nv.last_seen.clear(); } else { // only toggle the enabled status nv.enabled = !nv.enabled; btnNotifyEnabled->value(nv.enabled); } if (!nv.enabled) notify_unregister(nv); else { notify_unregister(nv); notify_register(nv); } notify_table_reload(); tblNotifyList->value(v); notify_save(); } // the event selection menu callback static void notify_event_cb(Fl_Widget* w, void* arg) { notify_event_t e = static_cast(reinterpret_cast(w)->value()); switch (e) { case NOTIFY_EVENT_MYCALL: mnuNotifyDupWhich->activate(); chkNotifyDupBand->activate(); chkNotifyDupMode->activate(); grpNotifyFilter->deactivate(); chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); chkNotifyFilterNWB->value(0); chkNotifyFilterLOTW->value(0); chkNotifyFilterEQSL->value(0); inpNotifyRE->value(0); inpNotifyRE->hide(); btnNotifyActionDialogDefault->show(); break; case NOTIFY_EVENT_STATION: mnuNotifyDupWhich->activate(); chkNotifyDupBand->activate(); chkNotifyDupMode->activate(); grpNotifyFilter->activate(); if (!chkNotifyFilterCall->value() && !chkNotifyFilterDXCC->value()) { chkNotifyFilterCall->value(1); inpNotifyFilterCall->show(); } inpNotifyRE->value(0); inpNotifyRE->hide(); btnNotifyActionDialogDefault->show(); break; case NOTIFY_EVENT_CUSTOM: mnuNotifyDupWhich->activate(); chkNotifyDupBand->activate(); chkNotifyDupMode->activate(); grpNotifyFilter->deactivate(); chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); chkNotifyFilterNWB->value(0); chkNotifyFilterLOTW->value(0); chkNotifyFilterEQSL->value(0); inpNotifyRE->show(); break; case NOTIFY_EVENT_RSID: case NOTIFY_EVENT_RSID_EOT: grpNotifyFilter->deactivate(); chkNotifyFilterCall->value(0); inpNotifyFilterCall->hide(); chkNotifyFilterDXCC->value(0); btnNotifyFilterDXCC->hide(); chkNotifyFilterNWB->value(0); chkNotifyFilterLOTW->value(0); chkNotifyFilterEQSL->value(0); inpNotifyRE->value(0); inpNotifyRE->hide(); btnNotifyActionDialogDefault->show(); // limited dup handling mnuNotifyDupWhich->deactivate(); chkNotifyDupBand->value(0); chkNotifyDupBand->deactivate(); chkNotifyDupMode->value(1); chkNotifyDupMode->deactivate(); break; } if (arg == NOTIFY_SET_DUP_MENU) { notify_gui_to_event(notify_tmp); notify_set_event_dup(notify_tmp); } w->parent()->redraw(); } // the program filesystem browse button callback static void notify_program_select_cb(Fl_Widget* w, void* arg) { const char* fn = FSEL::select(_("Run program"), "", 0, 0); if (!fn) return; if (!*fn) return; inpNotifyActionProgram->value(fn); // quote program path inpNotifyActionProgram->position(0); inpNotifyActionProgram->insert("\"", 1); inpNotifyActionProgram->position(inpNotifyActionProgram->size()); inpNotifyActionProgram->insert("\"", 1); } // the test button callback static void notify_test_cb(Fl_Widget* w, void* arg) { notify_gui_to_event(notify_tmp); if (notify_tmp.event == NOTIFY_EVENT_RSID || notify_tmp.event == NOTIFY_EVENT_RSID_EOT) { notify_tmp.mode = active_modem->get_mode(); regmatch_t sub[2] = { { 0, (regoff_t)strlen(mode_info[notify_tmp.mode].name) } }; sub[1] = sub[0]; notify_recv(notify_tmp.mode, active_modem->get_freq(), mode_info[notify_tmp.mode].name, sub, 2, ¬ify_tmp); return; } std::string test_strings[3]; test_strings[NOTIFY_EVENT_MYCALL].assign(progdefaults.myCall).append(" de n0call"); test_strings[NOTIFY_EVENT_STATION] = "cq de n0call n0call "; static std::string test; if (test.empty()) test = test_strings[notify_tmp.event]; std::string msg; msg.assign(_("Default test string is:\n \"")).append(test_strings[notify_tmp.event]).append("\"\n") .append(_("Enter test string or leave blank for default:")); const char* s = fl_input2("%s", msg.c_str(), test.c_str()); if (s) { if (test.assign(s).empty()) // empty input test = test_strings[notify_tmp.event]; } else // cancelled return; fre_t re(notify_get_re(notify_tmp).c_str(), REG_EXTENDED | REG_ICASE); if (!re) fl_alert2(_("This event's regular expression is invalid.")); else if (re.match(test.c_str())) { const std::vector& o = re.suboff(); notify_recv(active_modem->get_mode(), active_modem->get_freq(), test.c_str(), &o[0], o.size(), ¬ify_tmp); } else fl_message2(_("The test string did not match this event's search pattern.")); } // the macro editor button callback static void notify_macro_edit_cb(Fl_Widget* w, void* arg) { editMacro(0, MACRO_EDIT_INPUT, inpNotifyActionMacro); } // the insert default alert text button callback static void notify_dialog_default_cb(Fl_Widget* w, void* arg) { size_t i = CLAMP((size_t)mnuNotifyEvent->value(), 0, sizeof(default_alert_text)/sizeof(*default_alert_text) - 1); std::string s = default_alert_text[i]; if (s.empty()) { // custom search; count and list refs size_t nsub = std::min(fre_t(inpNotifyRE->value(), REG_EXTENDED | REG_ICASE).nsub(), (size_t)9); if (nsub) { s.assign(_("Available substrings")).append(":\n\\0\n"); char ref[] = "\\1"; for (size_t i = 1; i < nsub; i++, ref[1]++) s.append(ref).append("\n"); } } inpNotifyActionDialog->value(s.c_str()); } // the insert default RX text button callback static void notify_rx_default_cb(Fl_Widget* w, void* arg) { if (mnuNotifyEvent->value() == NOTIFY_EVENT_RSID) inpNotifyActionRXMarker->value("\nRSID: $RX_MARKER\n"); else if (mnuNotifyEvent->value() == NOTIFY_EVENT_RSID_EOT) inpNotifyActionRXMarker->value("\nRSID EOT\n"); else inpNotifyActionRXMarker->value("\n$RX_MARKER\n"); } // the ignore duplicates check button callback void notify_dup_ignore_cb(Fl_Widget* w, void* arg) { if (static_cast(w)->value()) { mnuNotifyDupWhich->show(); cntNotifyDupTime->show(); chkNotifyDupBand->show(); chkNotifyDupMode->show(); } else { mnuNotifyDupWhich->hide(); cntNotifyDupTime->hide(); chkNotifyDupBand->hide(); chkNotifyDupMode->hide(); } w->parent()->redraw(); } // the custom re field callback static void notify_re_cb(Fl_Widget* w, void* arg) { notify_set_event_dup_menu(static_cast(w)->value()); } //////////////////////////////////////////////////////////////////////////////// // dup widget handling //////////////////////////////////////////////////////////////////////////////// // set the dup menu substrings for regular epxression string re static void notify_set_event_dup_menu(const char* re) { int v = mnuNotifyDupWhich->value(); size_t nref = fre_t(re, REG_EXTENDED).nsub(); for (size_t i = 0; i < sizeof(notify_dup_refs_menu)/sizeof(*notify_dup_refs_menu); i++) notify_dup_refs_menu[i].hide(); if (nref) { size_t i; for (i = 1; i < nref; i++) notify_dup_refs_menu[i].show(); if ((size_t)v == nref) v = mnuNotifyDupWhich->size() - 1; else v = 1; } else v = 0; mnuNotifyDupWhich->value(v); mnuNotifyDupWhich->redraw(); } // set the dup group widgets for event n static void notify_set_event_dup(const notify_t& n) { size_t i; for (i = 0; i < sizeof(notify_dup_refs_menu)/sizeof(*notify_dup_refs_menu); i++) notify_dup_refs_menu[i].hide(); switch (n.event) { case NOTIFY_EVENT_MYCALL: case NOTIFY_EVENT_STATION: case NOTIFY_EVENT_RSID: i = event_regex[n.event].index; mnuNotifyDupWhich->menu(notify_dup_callsign_menu); for (size_t j = 0; j < sizeof(notify_dup_callsign_menu)/sizeof(*notify_dup_callsign_menu) - 1; j++) notify_dup_callsign_menu[j].hide(); notify_dup_callsign_menu[i].show(); if (n.event == NOTIFY_EVENT_RSID) notify_dup_callsign_menu[i].label(_("Frequency")); else notify_dup_callsign_menu[i].label(_("Callsign")); mnuNotifyDupWhich->value(i); break; case NOTIFY_EVENT_CUSTOM: mnuNotifyDupWhich->menu(notify_dup_refs_menu); notify_set_event_dup_menu(notify_get_re(n).c_str()); break; case NOTIFY_EVENT_RSID_EOT: default: break; } } //////////////////////////////////////////////////////////////////////////////// // DXCC list //////////////////////////////////////////////////////////////////////////////// // set the toggle status of row i to cond static void notify_dxcc_row_check(int i, bool cond = true) { *tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_SEL) = "["[!cond]; } // toggle the checked status of row i, return new status static bool notify_dxcc_row_toggle(int i) { char* p = tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_SEL); return (*p = "["[!!*p]); } // return checked status of row i static bool notify_dxcc_row_checked(int i) { return *tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_SEL); } // the dxcc list select/deselect callback static void notify_filter_dxcc_select_cb(Fl_Widget* w, void* arg) { bool val; const char* str; int row = tblNotifyFilterDXCC->value(); int col; intptr_t iarg = (intptr_t)arg; switch (iarg) { case NOTIFY_DXCC_SELECT_CONT: case NOTIFY_DXCC_DESELECT_CONT: str = tblNotifyFilterDXCC->valueAt(row, col = NOTIFY_DXCC_COL_CT); val = (iarg == NOTIFY_DXCC_SELECT_CONT); break; case NOTIFY_DXCC_SELECT_ITU: case NOTIFY_DXCC_DESELECT_ITU: str = tblNotifyFilterDXCC->valueAt(row, col = NOTIFY_DXCC_COL_ITU); val = (iarg == NOTIFY_DXCC_SELECT_ITU); break; case NOTIFY_DXCC_SELECT_CQ: case NOTIFY_DXCC_DESELECT_CQ: str = tblNotifyFilterDXCC->valueAt(row, col = NOTIFY_DXCC_COL_CQ); val = (iarg == NOTIFY_DXCC_SELECT_CQ); break; case NOTIFY_DXCC_SELECT_ALL: for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) notify_dxcc_row_check(i); goto redraw; case NOTIFY_DXCC_DESELECT_ALL: for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) notify_dxcc_row_check(i, false); goto redraw; default: return; } for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) { if (!strcmp(tblNotifyFilterDXCC->valueAt(i, col), str)) notify_dxcc_row_check(i, val); } redraw: tblNotifyFilterDXCC->redraw(); } // the dxcc search field callback static void notify_filter_dxcc_search(Fl_Widget* w, void* arg) { if (w == inpNotifyDXCCSearchCallsign) { const dxcc* e = dxcc_lookup(inpNotifyDXCCSearchCallsign->value()); if (e) { inpNotifyDXCCSearchCountry->value(e->country); inpNotifyDXCCSearchCountry->do_callback(); inpNotifyDXCCSearchCountry->position(0); } return; } if (unlikely(!inpNotifyDXCCSearchCountry->size())) return; int col = 1, row = tblNotifyFilterDXCC->value() + 1; row = WCLAMP(row, 0, tblNotifyFilterDXCC->rows() - 1); if (tblNotifyFilterDXCC->search(row, col, false, inpNotifyDXCCSearchCountry->value())) { int when = tblNotifyFilterDXCC->when(); tblNotifyFilterDXCC->when(FL_WHEN_NEVER); tblNotifyFilterDXCC->GotoRow(row); tblNotifyFilterDXCC->when(when); inpNotifyDXCCSearchCountry->textcolor(FL_FOREGROUND_COLOR); } else inpNotifyDXCCSearchCountry->textcolor(FL_RED); inpNotifyDXCCSearchCountry->redraw(); } // the dxcc filter selection button callback static void notify_dxcc_browse_cb(Fl_Widget* w, void* arg) { int v = tblNotifyList->value(); if (v < 0) // no selection, uncheck all rows btnNotifyDXCCDeselect->do_callback(); else { const notify_t& n = *advli(notify_list.begin(), v); for (int i = 0; i < tblNotifyFilterDXCC->rows(); i++) notify_dxcc_row_check(i, n.filter.dxcc.find(tblNotifyFilterDXCC->valueAt(i, NOTIFY_DXCC_COL_CN)) != n.filter.dxcc.end()); } notify_dxcc_show(false); } // the dxcc table callback static void notify_dxcc_check_cb(Fl_Widget* w, void* arg) { if (Fl::event_button() != FL_LEFT_MOUSE || (Fl::event() == FL_KEYDOWN && !Fl::event_shift())) return; int sel = tblNotifyFilterDXCC->value(); const char* country = tblNotifyFilterDXCC->valueAt(sel, NOTIFY_DXCC_COL_CN); if (notify_dxcc_row_toggle(sel)) notify_tmp.filter.dxcc[country] = true; else notify_tmp.filter.dxcc.erase(country); } //////////////////////////////////////////////////////////////////////////////// // storage functions //////////////////////////////////////////////////////////////////////////////// // save the event list static void notify_save(void) { notify_set_qsodb_cache(); remove(std::string(HomeDir).append("/").append("notify.prefs").c_str()); Fl_Preferences ndata(HomeDir.c_str(), PACKAGE_TARNAME, "notify"); ndata.set("items", static_cast(notify_list.size())); size_t num = 0; std::stringstream group; for (notify_list_t::iterator i = notify_list.begin(); i != notify_list.end(); ++i) { group << "item" << num++; ndata.set(Fl_Preferences::Name("%s/event", group.str().c_str()), i->event); if (i->event >= NOTIFY_EVENT_CUSTOM) ndata.set(Fl_Preferences::Name("%s/re", group.str().c_str()), i->re.c_str()); ndata.set(Fl_Preferences::Name("%s/enabled", group.str().c_str()), i->enabled); ndata.set(Fl_Preferences::Name("%s/action/alert", group.str().c_str()), i->action.alert.c_str()); ndata.set(Fl_Preferences::Name("%s/action/rx_marker", group.str().c_str()), i->action.rx_marker.c_str()); ndata.set(Fl_Preferences::Name("%s/action/macro", group.str().c_str()), i->action.macro.c_str()); ndata.set(Fl_Preferences::Name("%s/action/program", group.str().c_str()), i->action.program.c_str()); ndata.set(Fl_Preferences::Name("%s/action/trigger_limit", group.str().c_str()), static_cast(i->action.trigger_limit)); ndata.set(Fl_Preferences::Name("%s/action/alert_timeout", group.str().c_str()), static_cast(i->action.alert_timeout)); ndata.set(Fl_Preferences::Name("%s/filter/match", group.str().c_str()), i->filter.match); ndata.set(Fl_Preferences::Name("%s/filter/callsign", group.str().c_str()), i->filter.callsign.c_str()); ndata.set(Fl_Preferences::Name("%s/filter/nwb", group.str().c_str()), i->filter.nwb); ndata.set(Fl_Preferences::Name("%s/filter/lotw", group.str().c_str()), i->filter.lotw); ndata.set(Fl_Preferences::Name("%s/filter/eqsl", group.str().c_str()), i->filter.eqsl); int k = 0; for (notify_filter_dxcc_t::const_iterator j = i->filter.dxcc.begin(); j != i->filter.dxcc.end() && j->second; ++j) { ndata.set(Fl_Preferences::Name("%s/filter/dxcc/%d", group.str().c_str(), k++), j->first.c_str()); } ndata.set(Fl_Preferences::Name("%s/dup/ignore", group.str().c_str()), i->dup_ignore); ndata.set(Fl_Preferences::Name("%s/dup/ref", group.str().c_str()), static_cast(i->dup_ref)); ndata.set(Fl_Preferences::Name("%s/dup/when", group.str().c_str()), static_cast(i->dup.when)); ndata.set(Fl_Preferences::Name("%s/dup/band", group.str().c_str()), i->dup.band); ndata.set(Fl_Preferences::Name("%s/dup/mode", group.str().c_str()), static_cast(i->dup.mode)); } } // load the event list static void notify_load(void) { int x; char s[512]; s[sizeof(s)-1] = '\0'; Fl_Preferences ndata(HomeDir.c_str(), PACKAGE_TARNAME, "notify"); if (!ndata.get("items", x, 0) || x <= 0) return; size_t n = static_cast(x); std::stringstream group; for (size_t i = 0; i < n; i++) { notify_t nitem; group << "item" << i; ndata.get(Fl_Preferences::Name("%s/event", group.str().c_str()), x, 0); nitem.event = static_cast(x); nitem.last_trigger = 0; if (nitem.event >= NOTIFY_EVENT_CUSTOM) { ndata.get(Fl_Preferences::Name("%s/re", group.str().c_str()), s, "", sizeof(s)-1); nitem.re = s; } else nitem.re = event_regex[nitem.event].regex; ndata.get(Fl_Preferences::Name("%s/enabled", group.str().c_str()), x, 1); nitem.enabled = x; ndata.get(Fl_Preferences::Name("%s/action/alert", group.str().c_str()), s, "", sizeof(s)-1); nitem.action.alert = s; ndata.get(Fl_Preferences::Name("%s/action/macro", group.str().c_str()), s, "", sizeof(s)-1); nitem.action.macro = s; ndata.get(Fl_Preferences::Name("%s/action/rx_marker", group.str().c_str()), s, "", sizeof(s)-1); nitem.action.rx_marker = s; ndata.get(Fl_Preferences::Name("%s/action/program", group.str().c_str()), s, "", sizeof(s)-1); nitem.action.program = s; ndata.get(Fl_Preferences::Name("%s/action/trigger_limit", group.str().c_str()), x, 0); nitem.action.trigger_limit = x; ndata.get(Fl_Preferences::Name("%s/action/alert_timeout", group.str().c_str()), x, 5); nitem.action.alert_timeout = x; ndata.get(Fl_Preferences::Name("%s/filter/match", group.str().c_str()), x, 0); nitem.filter.match = static_cast(x); ndata.get(Fl_Preferences::Name("%s/filter/callsign", group.str().c_str()), s, "", sizeof(s)-1); nitem.filter.callsign = s; ndata.get(Fl_Preferences::Name("%s/filter/nwb", group.str().c_str()), x, 0); nitem.filter.nwb = x; ndata.get(Fl_Preferences::Name("%s/filter/lotw", group.str().c_str()), x, 0); nitem.filter.lotw = x; ndata.get(Fl_Preferences::Name("%s/filter/eqsl", group.str().c_str()), x, 0); nitem.filter.eqsl = x; for (int k = 0; ndata.get(Fl_Preferences::Name("%s/filter/dxcc/%d", group.str().c_str(), k), s, "", sizeof(s)-1); k++) nitem.filter.dxcc[s] = true; ndata.get(Fl_Preferences::Name("%s/dup/ignore", group.str().c_str()), x, 0); nitem.dup_ignore = x; ndata.get(Fl_Preferences::Name("%s/dup/ref", group.str().c_str()), x, 0); nitem.dup_ref = x; ndata.get(Fl_Preferences::Name("%s/dup/when", group.str().c_str()), x, 600); nitem.dup.when = x; ndata.get(Fl_Preferences::Name("%s/dup/band", group.str().c_str()), x, 0); nitem.dup.band = static_cast(x); ndata.get(Fl_Preferences::Name("%s/dup/mode", group.str().c_str()), x, 0); nitem.dup.mode = static_cast(x); notify_list.push_back(nitem); } notify_table_reload(); } fldigi-4.2.05/src/spot/spot.cxx0000664000175000017500000001634614611711171013262 00000000000000// ---------------------------------------------------------------------------- // spot.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #if HAVE_STD_HASH # include #elif HAVE_STD_TR1_HASH # include #else # error "No std::hash or std::tr1::hash support" #endif #include "trx.h" #include "globals.h" #include "re.h" #include "fl_digi.h" #include "debug.h" #include "spot.h" // the number of characters that we match our REs against #define SEARCHLEN 32 #define DECBUFSIZE 8 * SEARCHLEN struct callback_t { void* data; spot_log_cb_t lcb; spot_log_cb_t mcb; spot_recv_cb_t rcb; }; typedef std::list cblist_t; #if ( (__GNUC__ > 11) || ((__GNUC__ == 11) && (__GNUC_MINOR >= 4) ) ) struct fre_hash { size_t operator()(const fre_t* r) const { return r->hash(); } }; struct fre_comp { size_t operator()(const fre_t* l, const fre_t* r) const { return *l == *r; } }; #else struct fre_hash : std::unary_function { size_t operator()(const fre_t* r) const { return r->hash(); } }; struct fre_comp : std::unary_function { size_t operator()(const fre_t* l, const fre_t* r) const { return *l == *r; } }; #endif typedef std::list callback_p_list_t; #if HAVE_STD_HASH typedef std::unordered_map rcblist_t; static std::unordered_map buffers; #elif HAVE_STD_TR1_HASH typedef std::tr1::unordered_map rcblist_t; static std::tr1::unordered_map buffers; #endif static cblist_t cblist; static rcblist_t rcblist; void spot_recv(char c, int decoder, int afreq, int md) { static trx_mode last_mode = NUM_MODES + 1; if (decoder == -1) { // mode without multiple decoders decoder = active_modem->get_mode(); if (last_mode != active_modem->get_mode()) { buffers.clear(); last_mode = active_modem->get_mode(); } } else if (last_mode != md) { buffers.clear(); last_mode = md; } if (afreq == 0) afreq = active_modem->get_freq(); std::string& buf = buffers[decoder]; if (unlikely(buf.capacity() < DECBUFSIZE)) buf.reserve(DECBUFSIZE); buf += c; std::string::size_type n = buf.length(); if (n == DECBUFSIZE) buf.erase(0, DECBUFSIZE - SEARCHLEN); const char* search = buf.c_str() + (n > SEARCHLEN ? n - SEARCHLEN : 0); bool matched = false; for (rcblist_t::iterator i = rcblist.begin(); i != rcblist.end(); ++i) { if (unlikely(i->first->match(search))) { matched = true; const std::vector& m = i->first->suboff(); for (std::list::iterator j = i->second.begin(); j != i->second.end() && (*j)->rcb; ++j) { if (m.empty()) (*j)->rcb(last_mode, afreq, search, NULL, 0, (*j)->data); else (*j)->rcb(last_mode, afreq, search, &m[0], m.size(), (*j)->data); } } } if (matched) buf.clear(); } static void get_log_details(unsigned long long& freq, trx_mode& mode, time_t& rtime) { if (mode == NUM_MODES) mode = active_modem->get_mode(); if (mode >= MODE_WWV) return; if (freq == 0LL) freq = active_modem->get_freq(); if (!wf->USB()) freq = -freq; freq += wf->rfcarrier(); if (rtime == -1L) rtime = time(NULL); } void spot_log(const char* callsign, const char* locator, unsigned long long freq, trx_mode mode, time_t rtime) { get_log_details(freq, mode, rtime); std::cout << callsign << ", " << locator << ", " << freq << ", " << mode_info[mode].adif_name << ", " << mode_info[mode].adif_name << std::endl; for (cblist_t::const_iterator i = cblist.begin(); i != cblist.end(); ++i) if (i->lcb) i->lcb(callsign, locator, freq, mode, rtime, i->data); } void spot_manual(const char* callsign, const char* locator, unsigned long long freq, trx_mode mode, time_t rtime) { get_log_details(freq, mode, rtime); for (cblist_t::const_iterator i = cblist.begin(); i != cblist.end(); ++i) if (i->mcb) i->mcb(callsign, locator, freq, mode, rtime, i->data); } // // A callback of type spot_log_cb_t is registered with a data argument. // The callback is invoked every time a QSO is logged. // void spot_register_log(spot_log_cb_t lcb, void* ldata) { callback_t c = { ldata, lcb, 0, 0 }; cblist.push_back(c); } // // A callback of type spot_log_cb_t is registered with a data argument. // The callback is invoked every time the user manually spots a callsign. // void spot_register_manual(spot_log_cb_t mcb, void* mdata) { callback_t c = { mdata, 0, mcb, 0 }; cblist.push_back(c); } // // A callback of type spot_recv_cb_t is registered with a regular // expression (RE, RE_flags). If the RE matches the spotter's search // buffer, the callback is invoked with offsets into the search buffer // indicating substring matches, if the RE defines any, and with its // data argument. The offset format is described in regexec(3). The // buffer and offsets are only valid during that particular invocation. // Clients should use anchoring to avoid repeated calls. // void spot_register_recv(spot_recv_cb_t rcb, void* rdata, const char* re, int reflags) { callback_t c = { rdata, 0, 0, rcb }; cblist.push_back(c); fre_t* fre = new fre_t(re, reflags); rcblist_t::iterator i = rcblist.find(fre); if (i != rcblist.end()) { i->second.push_back(&cblist.back()); delete fre; } else rcblist[fre].push_back(&cblist.back()); show_spot(true); } void spot_unregister_log(spot_log_cb_t lcb, const void* ldata) { for (cblist_t::iterator i = cblist.begin(); i != cblist.end(); ++i) { if (lcb == i->lcb && ldata == i->data) { cblist.erase(i); break; } } } void spot_unregister_manual(spot_log_cb_t mcb, const void* mdata) { for (cblist_t::iterator i = cblist.begin(); i != cblist.end(); ++i) { if (mcb == i->mcb && mdata == i->data) { cblist.erase(i); break; } } } void spot_unregister_recv(spot_recv_cb_t rcb, const void* rdata) { cblist_t::iterator i; callback_t* p = 0; for (i = cblist.begin(); i != cblist.end(); ++i) { if (rcb == i->rcb && rdata == i->data) { p = &*i; cblist.erase(i); break; } } if (!p) return; // remove pointer from rcblist for (rcblist_t::iterator j = rcblist.begin(); j != rcblist.end(); ++j) { for (std::list::iterator k = j->second.begin(); k != j->second.end(); ++k) { if (*k == p) { j->second.erase(k); if (j->second.empty()) { delete j->first; rcblist.erase(j); } goto out; } } } out: for (i = cblist.begin(); i != cblist.end(); ++i) if (i->rcb) break; show_spot(i != cblist.end()); } fldigi-4.2.05/src/mbedtls/0000775000175000017500000000000014611714005012263 500000000000000fldigi-4.2.05/src/mbedtls/xtea.c0000664000175000017500000001657514611711171013327 00000000000000/* * An 32-bit implementation of the XTEA algorithm * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_XTEA_C) #include "mbedtls/xtea.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_XTEA_ALT) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif void mbedtls_xtea_init( mbedtls_xtea_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_xtea_context ) ); } void mbedtls_xtea_free( mbedtls_xtea_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_xtea_context ) ); } /* * XTEA key schedule */ void mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] ) { int i; memset( ctx, 0, sizeof(mbedtls_xtea_context) ); for( i = 0; i < 4; i++ ) { GET_UINT32_BE( ctx->k[i], key, i << 2 ); } } /* * XTEA encrypt function */ int mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx, int mode, const unsigned char input[8], unsigned char output[8]) { uint32_t *k, v0, v1, i; k = ctx->k; GET_UINT32_BE( v0, input, 0 ); GET_UINT32_BE( v1, input, 4 ); if( mode == MBEDTLS_XTEA_ENCRYPT ) { uint32_t sum = 0, delta = 0x9E3779B9; for( i = 0; i < 32; i++ ) { v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); sum += delta; v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); } } else /* MBEDTLS_XTEA_DECRYPT */ { uint32_t delta = 0x9E3779B9, sum = delta * 32; for( i = 0; i < 32; i++ ) { v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]); sum -= delta; v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]); } } PUT_UINT32_BE( v0, output, 0 ); PUT_UINT32_BE( v1, output, 4 ); return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * XTEA-CBC buffer encryption/decryption */ int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output) { int i; unsigned char temp[8]; if( length % 8 ) return( MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_XTEA_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, 8 ); mbedtls_xtea_crypt_ecb( ctx, mode, input, output ); for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 8 ); input += 8; output += 8; length -= 8; } } else { while( length > 0 ) { for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_xtea_crypt_ecb( ctx, mode, output, output ); memcpy( iv, output, 8 ); input += 8; output += 8; length -= 8; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* !MBEDTLS_XTEA_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * XTEA tests vectors (non-official) */ static const unsigned char xtea_test_key[6][16] = { { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; static const unsigned char xtea_test_pt[6][8] = { { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, { 0x5a, 0x5b, 0x6e, 0x27, 0x89, 0x48, 0xd7, 0x7f }, { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, { 0x70, 0xe1, 0x22, 0x5d, 0x6e, 0x4e, 0x76, 0x55 } }; static const unsigned char xtea_test_ct[6][8] = { { 0x49, 0x7d, 0xf3, 0xd0, 0x72, 0x61, 0x2c, 0xb5 }, { 0xe7, 0x8f, 0x2d, 0x13, 0x74, 0x43, 0x41, 0xd8 }, { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, { 0xa0, 0x39, 0x05, 0x89, 0xf8, 0xb8, 0xef, 0xa5 }, { 0xed, 0x23, 0x37, 0x5a, 0x82, 0x1a, 0x8c, 0x2d }, { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 } }; /* * Checkup routine */ int mbedtls_xtea_self_test( int verbose ) { int i, ret = 0; unsigned char buf[8]; mbedtls_xtea_context ctx; mbedtls_xtea_init( &ctx ); for( i = 0; i < 6; i++ ) { if( verbose != 0 ) mbedtls_printf( " XTEA test #%d: ", i + 1 ); memcpy( buf, xtea_test_pt[i], 8 ); mbedtls_xtea_setup( &ctx, xtea_test_key[i] ); mbedtls_xtea_crypt_ecb( &ctx, MBEDTLS_XTEA_ENCRYPT, buf, buf ); if( memcmp( buf, xtea_test_ct[i], 8 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); exit: mbedtls_xtea_free( &ctx ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_XTEA_C */ fldigi-4.2.05/src/mbedtls/sha512.c0000664000175000017500000004464314611711171013366 00000000000000/* * FIPS-180-2 compliant SHA-384/512 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The SHA-512 Secure Hash Standard was published by NIST in 2002. * * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SHA512_C) #include "mbedtls/sha512.h" #include "mbedtls/platform_util.h" #if defined(_MSC_VER) || defined(__WATCOMC__) #define UL64(x) x##ui64 #else #define UL64(x) x##ULL #endif #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #define SHA512_VALIDATE_RET(cond) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA512_BAD_INPUT_DATA ) #define SHA512_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond ) #if !defined(MBEDTLS_SHA512_ALT) /* * 64-bit integer manipulation macros (big endian) */ #ifndef GET_UINT64_BE #define GET_UINT64_BE(n,b,i) \ { \ (n) = ( (uint64_t) (b)[(i) ] << 56 ) \ | ( (uint64_t) (b)[(i) + 1] << 48 ) \ | ( (uint64_t) (b)[(i) + 2] << 40 ) \ | ( (uint64_t) (b)[(i) + 3] << 32 ) \ | ( (uint64_t) (b)[(i) + 4] << 24 ) \ | ( (uint64_t) (b)[(i) + 5] << 16 ) \ | ( (uint64_t) (b)[(i) + 6] << 8 ) \ | ( (uint64_t) (b)[(i) + 7] ); \ } #endif /* GET_UINT64_BE */ #ifndef PUT_UINT64_BE #define PUT_UINT64_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 56 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 48 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 40 ); \ (b)[(i) + 3] = (unsigned char) ( (n) >> 32 ); \ (b)[(i) + 4] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 5] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 6] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 7] = (unsigned char) ( (n) ); \ } #endif /* PUT_UINT64_BE */ void mbedtls_sha512_init( mbedtls_sha512_context *ctx ) { SHA512_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_sha512_context ) ); } void mbedtls_sha512_free( mbedtls_sha512_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha512_context ) ); } void mbedtls_sha512_clone( mbedtls_sha512_context *dst, const mbedtls_sha512_context *src ) { SHA512_VALIDATE( dst != NULL ); SHA512_VALIDATE( src != NULL ); *dst = *src; } /* * SHA-512 context setup */ int mbedtls_sha512_starts_ret( mbedtls_sha512_context *ctx, int is384 ) { SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 ); ctx->total[0] = 0; ctx->total[1] = 0; if( is384 == 0 ) { /* SHA-512 */ ctx->state[0] = UL64(0x6A09E667F3BCC908); ctx->state[1] = UL64(0xBB67AE8584CAA73B); ctx->state[2] = UL64(0x3C6EF372FE94F82B); ctx->state[3] = UL64(0xA54FF53A5F1D36F1); ctx->state[4] = UL64(0x510E527FADE682D1); ctx->state[5] = UL64(0x9B05688C2B3E6C1F); ctx->state[6] = UL64(0x1F83D9ABFB41BD6B); ctx->state[7] = UL64(0x5BE0CD19137E2179); } else { /* SHA-384 */ ctx->state[0] = UL64(0xCBBB9D5DC1059ED8); ctx->state[1] = UL64(0x629A292A367CD507); ctx->state[2] = UL64(0x9159015A3070DD17); ctx->state[3] = UL64(0x152FECD8F70E5939); ctx->state[4] = UL64(0x67332667FFC00B31); ctx->state[5] = UL64(0x8EB44A8768581511); ctx->state[6] = UL64(0xDB0C2E0D64F98FA7); ctx->state[7] = UL64(0x47B5481DBEFA4FA4); } ctx->is384 = is384; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 ) { mbedtls_sha512_starts_ret( ctx, is384 ); } #endif #if !defined(MBEDTLS_SHA512_PROCESS_ALT) /* * Round constants */ static const uint64_t K[80] = { UL64(0x428A2F98D728AE22), UL64(0x7137449123EF65CD), UL64(0xB5C0FBCFEC4D3B2F), UL64(0xE9B5DBA58189DBBC), UL64(0x3956C25BF348B538), UL64(0x59F111F1B605D019), UL64(0x923F82A4AF194F9B), UL64(0xAB1C5ED5DA6D8118), UL64(0xD807AA98A3030242), UL64(0x12835B0145706FBE), UL64(0x243185BE4EE4B28C), UL64(0x550C7DC3D5FFB4E2), UL64(0x72BE5D74F27B896F), UL64(0x80DEB1FE3B1696B1), UL64(0x9BDC06A725C71235), UL64(0xC19BF174CF692694), UL64(0xE49B69C19EF14AD2), UL64(0xEFBE4786384F25E3), UL64(0x0FC19DC68B8CD5B5), UL64(0x240CA1CC77AC9C65), UL64(0x2DE92C6F592B0275), UL64(0x4A7484AA6EA6E483), UL64(0x5CB0A9DCBD41FBD4), UL64(0x76F988DA831153B5), UL64(0x983E5152EE66DFAB), UL64(0xA831C66D2DB43210), UL64(0xB00327C898FB213F), UL64(0xBF597FC7BEEF0EE4), UL64(0xC6E00BF33DA88FC2), UL64(0xD5A79147930AA725), UL64(0x06CA6351E003826F), UL64(0x142929670A0E6E70), UL64(0x27B70A8546D22FFC), UL64(0x2E1B21385C26C926), UL64(0x4D2C6DFC5AC42AED), UL64(0x53380D139D95B3DF), UL64(0x650A73548BAF63DE), UL64(0x766A0ABB3C77B2A8), UL64(0x81C2C92E47EDAEE6), UL64(0x92722C851482353B), UL64(0xA2BFE8A14CF10364), UL64(0xA81A664BBC423001), UL64(0xC24B8B70D0F89791), UL64(0xC76C51A30654BE30), UL64(0xD192E819D6EF5218), UL64(0xD69906245565A910), UL64(0xF40E35855771202A), UL64(0x106AA07032BBD1B8), UL64(0x19A4C116B8D2D0C8), UL64(0x1E376C085141AB53), UL64(0x2748774CDF8EEB99), UL64(0x34B0BCB5E19B48A8), UL64(0x391C0CB3C5C95A63), UL64(0x4ED8AA4AE3418ACB), UL64(0x5B9CCA4F7763E373), UL64(0x682E6FF3D6B2B8A3), UL64(0x748F82EE5DEFB2FC), UL64(0x78A5636F43172F60), UL64(0x84C87814A1F0AB72), UL64(0x8CC702081A6439EC), UL64(0x90BEFFFA23631E28), UL64(0xA4506CEBDE82BDE9), UL64(0xBEF9A3F7B2C67915), UL64(0xC67178F2E372532B), UL64(0xCA273ECEEA26619C), UL64(0xD186B8C721C0C207), UL64(0xEADA7DD6CDE0EB1E), UL64(0xF57D4F7FEE6ED178), UL64(0x06F067AA72176FBA), UL64(0x0A637DC5A2C898A6), UL64(0x113F9804BEF90DAE), UL64(0x1B710B35131C471B), UL64(0x28DB77F523047D84), UL64(0x32CAAB7B40C72493), UL64(0x3C9EBE0A15C9BEBC), UL64(0x431D67C49C100D4C), UL64(0x4CC5D4BECB3E42B6), UL64(0x597F299CFC657E2A), UL64(0x5FCB6FAB3AD6FAEC), UL64(0x6C44198C4A475817) }; int mbedtls_internal_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ) { int i; uint64_t temp1, temp2, W[80]; uint64_t A, B, C, D, E, F, G, H; SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( (const unsigned char *)data != NULL ); #define SHR(x,n) (x >> n) #define ROTR(x,n) (SHR(x,n) | (x << (64 - n))) #define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7)) #define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^ SHR(x, 6)) #define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39)) #define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41)) #define F0(x,y,z) ((x & y) | (z & (x | y))) #define F1(x,y,z) (z ^ (x & (y ^ z))) #define P(a,b,c,d,e,f,g,h,x,K) \ { \ temp1 = h + S3(e) + F1(e,f,g) + K + x; \ temp2 = S2(a) + F0(a,b,c); \ d += temp1; h = temp1 + temp2; \ } for( i = 0; i < 16; i++ ) { GET_UINT64_BE( W[i], data, i << 3 ); } for( ; i < 80; i++ ) { W[i] = S1(W[i - 2]) + W[i - 7] + S0(W[i - 15]) + W[i - 16]; } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; E = ctx->state[4]; F = ctx->state[5]; G = ctx->state[6]; H = ctx->state[7]; i = 0; do { P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++; P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++; P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++; P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++; P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++; P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++; P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++; P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++; } while( i < 80 ); ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; ctx->state[4] += E; ctx->state[5] += F; ctx->state[6] += G; ctx->state[7] += H; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ) { mbedtls_internal_sha512_process( ctx, data ); } #endif #endif /* !MBEDTLS_SHA512_PROCESS_ALT */ /* * SHA-512 process buffer */ int mbedtls_sha512_update_ret( mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; unsigned int left; SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( ilen == 0 || input != NULL ); if( ilen == 0 ) return( 0 ); left = (unsigned int) (ctx->total[0] & 0x7F); fill = 128 - left; ctx->total[0] += (uint64_t) ilen; if( ctx->total[0] < (uint64_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 128 ) { if( ( ret = mbedtls_internal_sha512_process( ctx, input ) ) != 0 ) return( ret ); input += 128; ilen -= 128; } if( ilen > 0 ) memcpy( (void *) (ctx->buffer + left), input, ilen ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_sha512_update_ret( ctx, input, ilen ); } #endif /* * SHA-512 final digest */ int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx, unsigned char *output ) { int ret; unsigned used; uint64_t high, low; SHA512_VALIDATE_RET( ctx != NULL ); SHA512_VALIDATE_RET( (unsigned char *)output != NULL ); /* * Add padding: 0x80 then 0x00 until 16 bytes remain for the length */ used = ctx->total[0] & 0x7F; ctx->buffer[used++] = 0x80; if( used <= 112 ) { /* Enough room for padding + length in current block */ memset( ctx->buffer + used, 0, 112 - used ); } else { /* We'll need an extra block */ memset( ctx->buffer + used, 0, 128 - used ); if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); memset( ctx->buffer, 0, 112 ); } /* * Add message length */ high = ( ctx->total[0] >> 61 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT64_BE( high, ctx->buffer, 112 ); PUT_UINT64_BE( low, ctx->buffer, 120 ); if( ( ret = mbedtls_internal_sha512_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); /* * Output final state */ PUT_UINT64_BE( ctx->state[0], output, 0 ); PUT_UINT64_BE( ctx->state[1], output, 8 ); PUT_UINT64_BE( ctx->state[2], output, 16 ); PUT_UINT64_BE( ctx->state[3], output, 24 ); PUT_UINT64_BE( ctx->state[4], output, 32 ); PUT_UINT64_BE( ctx->state[5], output, 40 ); if( ctx->is384 == 0 ) { PUT_UINT64_BE( ctx->state[6], output, 48 ); PUT_UINT64_BE( ctx->state[7], output, 56 ); } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] ) { mbedtls_sha512_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_SHA512_ALT */ /* * output = SHA-512( input buffer ) */ int mbedtls_sha512_ret( const unsigned char *input, size_t ilen, unsigned char output[64], int is384 ) { int ret; mbedtls_sha512_context ctx; SHA512_VALIDATE_RET( is384 == 0 || is384 == 1 ); SHA512_VALIDATE_RET( ilen == 0 || input != NULL ); SHA512_VALIDATE_RET( (unsigned char *)output != NULL ); mbedtls_sha512_init( &ctx ); if( ( ret = mbedtls_sha512_starts_ret( &ctx, is384 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha512_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha512_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_sha512_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha512( const unsigned char *input, size_t ilen, unsigned char output[64], int is384 ) { mbedtls_sha512_ret( input, ilen, output, is384 ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * FIPS-180-2 test vectors */ static const unsigned char sha512_test_buf[3][113] = { { "abc" }, { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn" "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" }, { "" } }; static const size_t sha512_test_buflen[3] = { 3, 112, 1000 }; static const unsigned char sha512_test_sum[6][64] = { /* * SHA-384 test vectors */ { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B, 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07, 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63, 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED, 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23, 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 }, { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8, 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47, 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2, 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12, 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9, 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 }, { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB, 0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C, 0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52, 0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B, 0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB, 0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 }, /* * SHA-512 test vectors */ { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA, 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31, 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2, 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A, 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8, 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD, 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E, 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F }, { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA, 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F, 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1, 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18, 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4, 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A, 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54, 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 }, { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64, 0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63, 0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28, 0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB, 0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A, 0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B, 0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E, 0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B } }; /* * Checkup routine */ int mbedtls_sha512_self_test( int verbose ) { int i, j, k, buflen, ret = 0; unsigned char *buf; unsigned char sha512sum[64]; mbedtls_sha512_context ctx; buf = mbedtls_calloc( 1024, sizeof(unsigned char) ); if( NULL == buf ) { if( verbose != 0 ) mbedtls_printf( "Buffer allocation failed\n" ); return( 1 ); } mbedtls_sha512_init( &ctx ); for( i = 0; i < 6; i++ ) { j = i % 3; k = i < 3; if( verbose != 0 ) mbedtls_printf( " SHA-%d test #%d: ", 512 - k * 128, j + 1 ); if( ( ret = mbedtls_sha512_starts_ret( &ctx, k ) ) != 0 ) goto fail; if( j == 2 ) { memset( buf, 'a', buflen = 1000 ); for( j = 0; j < 1000; j++ ) { ret = mbedtls_sha512_update_ret( &ctx, buf, buflen ); if( ret != 0 ) goto fail; } } else { ret = mbedtls_sha512_update_ret( &ctx, sha512_test_buf[j], sha512_test_buflen[j] ); if( ret != 0 ) goto fail; } if( ( ret = mbedtls_sha512_finish_ret( &ctx, sha512sum ) ) != 0 ) goto fail; if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); goto exit; fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); exit: mbedtls_sha512_free( &ctx ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_SHA512_C */ fldigi-4.2.05/src/mbedtls/platform.c0000664000175000017500000002316614611711171014204 00000000000000/* * Platform abstraction layer * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #include "mbedtls/platform_util.h" /* The compile time configuration of memory allocation via the macros * MBEDTLS_PLATFORM_{FREE/CALLOC}_MACRO takes precedence over the runtime * configuration via mbedtls_platform_set_calloc_free(). So, omit everything * related to the latter if MBEDTLS_PLATFORM_{FREE/CALLOC}_MACRO are defined. */ #if defined(MBEDTLS_PLATFORM_MEMORY) && \ !( defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && \ defined(MBEDTLS_PLATFORM_FREE_MACRO) ) #if !defined(MBEDTLS_PLATFORM_STD_CALLOC) static void *platform_calloc_uninit( size_t n, size_t size ) { ((void) n); ((void) size); return( NULL ); } #define MBEDTLS_PLATFORM_STD_CALLOC platform_calloc_uninit #endif /* !MBEDTLS_PLATFORM_STD_CALLOC */ #if !defined(MBEDTLS_PLATFORM_STD_FREE) static void platform_free_uninit( void *ptr ) { ((void) ptr); } #define MBEDTLS_PLATFORM_STD_FREE platform_free_uninit #endif /* !MBEDTLS_PLATFORM_STD_FREE */ static void * (*mbedtls_calloc_func)( size_t, size_t ) = MBEDTLS_PLATFORM_STD_CALLOC; static void (*mbedtls_free_func)( void * ) = MBEDTLS_PLATFORM_STD_FREE; void * mbedtls_calloc( size_t nmemb, size_t size ) { return (*mbedtls_calloc_func)( nmemb, size ); } void mbedtls_free( void * ptr ) { (*mbedtls_free_func)( ptr ); } int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ), void (*free_func)( void * ) ) { mbedtls_calloc_func = calloc_func; mbedtls_free_func = free_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_MEMORY && !( defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && defined(MBEDTLS_PLATFORM_FREE_MACRO) ) */ #if defined(_WIN32) #include int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... ) { int ret; va_list argp; /* Avoid calling the invalid parameter handler by checking ourselves */ if( s == NULL || n == 0 || fmt == NULL ) return( -1 ); va_start( argp, fmt ); #if defined(_TRUNCATE) && !defined(__MINGW32__) ret = _vsnprintf_s( s, n, _TRUNCATE, fmt, argp ); #else ret = _vsnprintf( s, n, fmt, argp ); if( ret < 0 || (size_t) ret == n ) { s[n-1] = '\0'; ret = -1; } #endif va_end( argp ); return( ret ); } #endif #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) #if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_snprintf_uninit( char * s, size_t n, const char * format, ... ) { ((void) s); ((void) n); ((void) format); return( 0 ); } #define MBEDTLS_PLATFORM_STD_SNPRINTF platform_snprintf_uninit #endif /* !MBEDTLS_PLATFORM_STD_SNPRINTF */ int (*mbedtls_snprintf)( char * s, size_t n, const char * format, ... ) = MBEDTLS_PLATFORM_STD_SNPRINTF; int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n, const char * format, ... ) ) { mbedtls_snprintf = snprintf_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_PRINTF_ALT) #if !defined(MBEDTLS_PLATFORM_STD_PRINTF) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_printf_uninit( const char *format, ... ) { ((void) format); return( 0 ); } #define MBEDTLS_PLATFORM_STD_PRINTF platform_printf_uninit #endif /* !MBEDTLS_PLATFORM_STD_PRINTF */ int (*mbedtls_printf)( const char *, ... ) = MBEDTLS_PLATFORM_STD_PRINTF; int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) ) { mbedtls_printf = printf_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) #if !defined(MBEDTLS_PLATFORM_STD_FPRINTF) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_fprintf_uninit( FILE *stream, const char *format, ... ) { ((void) stream); ((void) format); return( 0 ); } #define MBEDTLS_PLATFORM_STD_FPRINTF platform_fprintf_uninit #endif /* !MBEDTLS_PLATFORM_STD_FPRINTF */ int (*mbedtls_fprintf)( FILE *, const char *, ... ) = MBEDTLS_PLATFORM_STD_FPRINTF; int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *, const char *, ... ) ) { mbedtls_fprintf = fprintf_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_EXIT_ALT) #if !defined(MBEDTLS_PLATFORM_STD_EXIT) /* * Make dummy function to prevent NULL pointer dereferences */ static void platform_exit_uninit( int status ) { ((void) status); } #define MBEDTLS_PLATFORM_STD_EXIT platform_exit_uninit #endif /* !MBEDTLS_PLATFORM_STD_EXIT */ void (*mbedtls_exit)( int status ) = MBEDTLS_PLATFORM_STD_EXIT; int mbedtls_platform_set_exit( void (*exit_func)( int status ) ) { mbedtls_exit = exit_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_EXIT_ALT */ #if defined(MBEDTLS_HAVE_TIME) #if defined(MBEDTLS_PLATFORM_TIME_ALT) #if !defined(MBEDTLS_PLATFORM_STD_TIME) /* * Make dummy function to prevent NULL pointer dereferences */ static mbedtls_time_t platform_time_uninit( mbedtls_time_t* timer ) { ((void) timer); return( 0 ); } #define MBEDTLS_PLATFORM_STD_TIME platform_time_uninit #endif /* !MBEDTLS_PLATFORM_STD_TIME */ mbedtls_time_t (*mbedtls_time)( mbedtls_time_t* timer ) = MBEDTLS_PLATFORM_STD_TIME; int mbedtls_platform_set_time( mbedtls_time_t (*time_func)( mbedtls_time_t* timer ) ) { mbedtls_time = time_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_TIME_ALT */ #endif /* MBEDTLS_HAVE_TIME */ #if defined(MBEDTLS_ENTROPY_NV_SEED) #if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO) /* Default implementations for the platform independent seed functions use * standard libc file functions to read from and write to a pre-defined filename */ int mbedtls_platform_std_nv_seed_read( unsigned char *buf, size_t buf_len ) { FILE *file; size_t n; if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "rb" ) ) == NULL ) return( -1 ); if( ( n = fread( buf, 1, buf_len, file ) ) != buf_len ) { fclose( file ); mbedtls_platform_zeroize( buf, buf_len ); return( -1 ); } fclose( file ); return( (int)n ); } int mbedtls_platform_std_nv_seed_write( unsigned char *buf, size_t buf_len ) { FILE *file; size_t n; if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, "w" ) ) == NULL ) return -1; if( ( n = fwrite( buf, 1, buf_len, file ) ) != buf_len ) { fclose( file ); return -1; } fclose( file ); return( (int)n ); } #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_nv_seed_read_uninit( unsigned char *buf, size_t buf_len ) { ((void) buf); ((void) buf_len); return( -1 ); } #define MBEDTLS_PLATFORM_STD_NV_SEED_READ platform_nv_seed_read_uninit #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_READ */ #if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) /* * Make dummy function to prevent NULL pointer dereferences */ static int platform_nv_seed_write_uninit( unsigned char *buf, size_t buf_len ) { ((void) buf); ((void) buf_len); return( -1 ); } #define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE platform_nv_seed_write_uninit #endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_WRITE */ int (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len ) = MBEDTLS_PLATFORM_STD_NV_SEED_READ; int (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len ) = MBEDTLS_PLATFORM_STD_NV_SEED_WRITE; int mbedtls_platform_set_nv_seed( int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ), int (*nv_seed_write_func)( unsigned char *buf, size_t buf_len ) ) { mbedtls_nv_seed_read = nv_seed_read_func; mbedtls_nv_seed_write = nv_seed_write_func; return( 0 ); } #endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) /* * Placeholder platform setup that does nothing by default */ int mbedtls_platform_setup( mbedtls_platform_context *ctx ) { (void)ctx; return( 0 ); } /* * Placeholder platform teardown that does nothing by default */ void mbedtls_platform_teardown( mbedtls_platform_context *ctx ) { (void)ctx; } #endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ #endif /* MBEDTLS_PLATFORM_C */ fldigi-4.2.05/src/mbedtls/aes.c0000664000175000017500000021575714611711171013141 00000000000000/* * FIPS-197 compliant AES implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The AES block cipher was designed by Vincent Rijmen and Joan Daemen. * * http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf * http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_AES_C) #include #include "mbedtls/aes.h" #include "mbedtls/platform.h" #include "mbedtls/platform_util.h" #if defined(MBEDTLS_PADLOCK_C) #include "mbedtls/padlock.h" #endif #if defined(MBEDTLS_AESNI_C) #include "mbedtls/aesni.h" #endif #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_AES_ALT) /* Parameter validation macros based on platform_util.h */ #define AES_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_AES_BAD_INPUT_DATA ) #define AES_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif #if defined(MBEDTLS_PADLOCK_C) && \ ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) ) static int aes_padlock_ace = -1; #endif #if defined(MBEDTLS_AES_ROM_TABLES) /* * Forward S-box */ static const unsigned char FSb[256] = { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 }; /* * Forward tables */ #define FT \ \ V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \ V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \ V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \ V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \ V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \ V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \ V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \ V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \ V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \ V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \ V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \ V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \ V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \ V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \ V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \ V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \ V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \ V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \ V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \ V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \ V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \ V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \ V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \ V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \ V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \ V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \ V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \ V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \ V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \ V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \ V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \ V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \ V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \ V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \ V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \ V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \ V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \ V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \ V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \ V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \ V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \ V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \ V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \ V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \ V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \ V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \ V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \ V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \ V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \ V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \ V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \ V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \ V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \ V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \ V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \ V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \ V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \ V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \ V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \ V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \ V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \ V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \ V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \ V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C) #define V(a,b,c,d) 0x##a##b##c##d static const uint32_t FT0[256] = { FT }; #undef V #if !defined(MBEDTLS_AES_FEWER_TABLES) #define V(a,b,c,d) 0x##b##c##d##a static const uint32_t FT1[256] = { FT }; #undef V #define V(a,b,c,d) 0x##c##d##a##b static const uint32_t FT2[256] = { FT }; #undef V #define V(a,b,c,d) 0x##d##a##b##c static const uint32_t FT3[256] = { FT }; #undef V #endif /* !MBEDTLS_AES_FEWER_TABLES */ #undef FT /* * Reverse S-box */ static const unsigned char RSb[256] = { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D }; /* * Reverse tables */ #define RT \ \ V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \ V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \ V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \ V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \ V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \ V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \ V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \ V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \ V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \ V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \ V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \ V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \ V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \ V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \ V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \ V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \ V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \ V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \ V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \ V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \ V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \ V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \ V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \ V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \ V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \ V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \ V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \ V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \ V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \ V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \ V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \ V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \ V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \ V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \ V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \ V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \ V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \ V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \ V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \ V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \ V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \ V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \ V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \ V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \ V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \ V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \ V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \ V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \ V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \ V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \ V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \ V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \ V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \ V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \ V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \ V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \ V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \ V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \ V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \ V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \ V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \ V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \ V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \ V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0) #define V(a,b,c,d) 0x##a##b##c##d static const uint32_t RT0[256] = { RT }; #undef V #if !defined(MBEDTLS_AES_FEWER_TABLES) #define V(a,b,c,d) 0x##b##c##d##a static const uint32_t RT1[256] = { RT }; #undef V #define V(a,b,c,d) 0x##c##d##a##b static const uint32_t RT2[256] = { RT }; #undef V #define V(a,b,c,d) 0x##d##a##b##c static const uint32_t RT3[256] = { RT }; #undef V #endif /* !MBEDTLS_AES_FEWER_TABLES */ #undef RT /* * Round constants */ static const uint32_t RCON[10] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080, 0x0000001B, 0x00000036 }; #else /* MBEDTLS_AES_ROM_TABLES */ /* * Forward S-box & tables */ static unsigned char FSb[256]; static uint32_t FT0[256]; #if !defined(MBEDTLS_AES_FEWER_TABLES) static uint32_t FT1[256]; static uint32_t FT2[256]; static uint32_t FT3[256]; #endif /* !MBEDTLS_AES_FEWER_TABLES */ /* * Reverse S-box & tables */ static unsigned char RSb[256]; static uint32_t RT0[256]; #if !defined(MBEDTLS_AES_FEWER_TABLES) static uint32_t RT1[256]; static uint32_t RT2[256]; static uint32_t RT3[256]; #endif /* !MBEDTLS_AES_FEWER_TABLES */ /* * Round constants */ static uint32_t RCON[10]; /* * Tables generation code */ #define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 ) #define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) ) #define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 ) static int aes_init_done = 0; static void aes_gen_tables( void ) { int i, x, y, z; int pow[256]; int log[256]; /* * compute pow and log tables over GF(2^8) */ for( i = 0, x = 1; i < 256; i++ ) { pow[i] = x; log[x] = i; x = ( x ^ XTIME( x ) ) & 0xFF; } /* * calculate the round constants */ for( i = 0, x = 1; i < 10; i++ ) { RCON[i] = (uint32_t) x; x = XTIME( x ) & 0xFF; } /* * generate the forward and reverse S-boxes */ FSb[0x00] = 0x63; RSb[0x63] = 0x00; for( i = 1; i < 256; i++ ) { x = pow[255 - log[i]]; y = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF; x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF; x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF; x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF; x ^= y ^ 0x63; FSb[i] = (unsigned char) x; RSb[x] = (unsigned char) i; } /* * generate the forward and reverse tables */ for( i = 0; i < 256; i++ ) { x = FSb[i]; y = XTIME( x ) & 0xFF; z = ( y ^ x ) & 0xFF; FT0[i] = ( (uint32_t) y ) ^ ( (uint32_t) x << 8 ) ^ ( (uint32_t) x << 16 ) ^ ( (uint32_t) z << 24 ); #if !defined(MBEDTLS_AES_FEWER_TABLES) FT1[i] = ROTL8( FT0[i] ); FT2[i] = ROTL8( FT1[i] ); FT3[i] = ROTL8( FT2[i] ); #endif /* !MBEDTLS_AES_FEWER_TABLES */ x = RSb[i]; RT0[i] = ( (uint32_t) MUL( 0x0E, x ) ) ^ ( (uint32_t) MUL( 0x09, x ) << 8 ) ^ ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^ ( (uint32_t) MUL( 0x0B, x ) << 24 ); #if !defined(MBEDTLS_AES_FEWER_TABLES) RT1[i] = ROTL8( RT0[i] ); RT2[i] = ROTL8( RT1[i] ); RT3[i] = ROTL8( RT2[i] ); #endif /* !MBEDTLS_AES_FEWER_TABLES */ } } #undef ROTL8 #endif /* MBEDTLS_AES_ROM_TABLES */ #if defined(MBEDTLS_AES_FEWER_TABLES) #define ROTL8(x) ( (uint32_t)( ( x ) << 8 ) + (uint32_t)( ( x ) >> 24 ) ) #define ROTL16(x) ( (uint32_t)( ( x ) << 16 ) + (uint32_t)( ( x ) >> 16 ) ) #define ROTL24(x) ( (uint32_t)( ( x ) << 24 ) + (uint32_t)( ( x ) >> 8 ) ) #define AES_RT0(idx) RT0[idx] #define AES_RT1(idx) ROTL8( RT0[idx] ) #define AES_RT2(idx) ROTL16( RT0[idx] ) #define AES_RT3(idx) ROTL24( RT0[idx] ) #define AES_FT0(idx) FT0[idx] #define AES_FT1(idx) ROTL8( FT0[idx] ) #define AES_FT2(idx) ROTL16( FT0[idx] ) #define AES_FT3(idx) ROTL24( FT0[idx] ) #else /* MBEDTLS_AES_FEWER_TABLES */ #define AES_RT0(idx) RT0[idx] #define AES_RT1(idx) RT1[idx] #define AES_RT2(idx) RT2[idx] #define AES_RT3(idx) RT3[idx] #define AES_FT0(idx) FT0[idx] #define AES_FT1(idx) FT1[idx] #define AES_FT2(idx) FT2[idx] #define AES_FT3(idx) FT3[idx] #endif /* MBEDTLS_AES_FEWER_TABLES */ void mbedtls_aes_init( mbedtls_aes_context *ctx ) { AES_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_aes_context ) ); } void mbedtls_aes_free( mbedtls_aes_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aes_context ) ); } #if defined(MBEDTLS_CIPHER_MODE_XTS) void mbedtls_aes_xts_init( mbedtls_aes_xts_context *ctx ) { AES_VALIDATE( ctx != NULL ); mbedtls_aes_init( &ctx->crypt ); mbedtls_aes_init( &ctx->tweak ); } void mbedtls_aes_xts_free( mbedtls_aes_xts_context *ctx ) { if( ctx == NULL ) return; mbedtls_aes_free( &ctx->crypt ); mbedtls_aes_free( &ctx->tweak ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ /* * AES key schedule (encryption) */ #if !defined(MBEDTLS_AES_SETKEY_ENC_ALT) int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits ) { unsigned int i; uint32_t *RK; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( key != NULL ); switch( keybits ) { case 128: ctx->nr = 10; break; case 192: ctx->nr = 12; break; case 256: ctx->nr = 14; break; default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH ); } #if !defined(MBEDTLS_AES_ROM_TABLES) if( aes_init_done == 0 ) { aes_gen_tables(); aes_init_done = 1; } #endif #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16) if( aes_padlock_ace == -1 ) aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE ); if( aes_padlock_ace ) ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf ); else #endif ctx->rk = RK = ctx->buf; #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) ) return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) ); #endif for( i = 0; i < ( keybits >> 5 ); i++ ) { GET_UINT32_LE( RK[i], key, i << 2 ); } switch( ctx->nr ) { case 10: for( i = 0; i < 10; i++, RK += 4 ) { RK[4] = RK[0] ^ RCON[i] ^ ( (uint32_t) FSb[ ( RK[3] >> 8 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( RK[3] ) & 0xFF ] << 24 ); RK[5] = RK[1] ^ RK[4]; RK[6] = RK[2] ^ RK[5]; RK[7] = RK[3] ^ RK[6]; } break; case 12: for( i = 0; i < 8; i++, RK += 6 ) { RK[6] = RK[0] ^ RCON[i] ^ ( (uint32_t) FSb[ ( RK[5] >> 8 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( RK[5] ) & 0xFF ] << 24 ); RK[7] = RK[1] ^ RK[6]; RK[8] = RK[2] ^ RK[7]; RK[9] = RK[3] ^ RK[8]; RK[10] = RK[4] ^ RK[9]; RK[11] = RK[5] ^ RK[10]; } break; case 14: for( i = 0; i < 7; i++, RK += 8 ) { RK[8] = RK[0] ^ RCON[i] ^ ( (uint32_t) FSb[ ( RK[7] >> 8 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( RK[7] ) & 0xFF ] << 24 ); RK[9] = RK[1] ^ RK[8]; RK[10] = RK[2] ^ RK[9]; RK[11] = RK[3] ^ RK[10]; RK[12] = RK[4] ^ ( (uint32_t) FSb[ ( RK[11] ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( RK[11] >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 ); RK[13] = RK[5] ^ RK[12]; RK[14] = RK[6] ^ RK[13]; RK[15] = RK[7] ^ RK[14]; } break; } return( 0 ); } #endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */ /* * AES key schedule (decryption) */ #if !defined(MBEDTLS_AES_SETKEY_DEC_ALT) int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key, unsigned int keybits ) { int i, j, ret; mbedtls_aes_context cty; uint32_t *RK; uint32_t *SK; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( key != NULL ); mbedtls_aes_init( &cty ); #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16) if( aes_padlock_ace == -1 ) aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE ); if( aes_padlock_ace ) ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf ); else #endif ctx->rk = RK = ctx->buf; /* Also checks keybits */ if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 ) goto exit; ctx->nr = cty.nr; #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) ) { mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk, (const unsigned char *) cty.rk, ctx->nr ); goto exit; } #endif SK = cty.rk + cty.nr * 4; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 ) { for( j = 0; j < 4; j++, SK++ ) { *RK++ = AES_RT0( FSb[ ( *SK ) & 0xFF ] ) ^ AES_RT1( FSb[ ( *SK >> 8 ) & 0xFF ] ) ^ AES_RT2( FSb[ ( *SK >> 16 ) & 0xFF ] ) ^ AES_RT3( FSb[ ( *SK >> 24 ) & 0xFF ] ); } } *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; exit: mbedtls_aes_free( &cty ); return( ret ); } #if defined(MBEDTLS_CIPHER_MODE_XTS) static int mbedtls_aes_xts_decode_keys( const unsigned char *key, unsigned int keybits, const unsigned char **key1, unsigned int *key1bits, const unsigned char **key2, unsigned int *key2bits ) { const unsigned int half_keybits = keybits / 2; const unsigned int half_keybytes = half_keybits / 8; switch( keybits ) { case 256: break; case 512: break; default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH ); } *key1bits = half_keybits; *key2bits = half_keybits; *key1 = &key[0]; *key2 = &key[half_keybytes]; return 0; } int mbedtls_aes_xts_setkey_enc( mbedtls_aes_xts_context *ctx, const unsigned char *key, unsigned int keybits) { int ret; const unsigned char *key1, *key2; unsigned int key1bits, key2bits; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( key != NULL ); ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits, &key2, &key2bits ); if( ret != 0 ) return( ret ); /* Set the tweak key. Always set tweak key for the encryption mode. */ ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits ); if( ret != 0 ) return( ret ); /* Set crypt key for encryption. */ return mbedtls_aes_setkey_enc( &ctx->crypt, key1, key1bits ); } int mbedtls_aes_xts_setkey_dec( mbedtls_aes_xts_context *ctx, const unsigned char *key, unsigned int keybits) { int ret; const unsigned char *key1, *key2; unsigned int key1bits, key2bits; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( key != NULL ); ret = mbedtls_aes_xts_decode_keys( key, keybits, &key1, &key1bits, &key2, &key2bits ); if( ret != 0 ) return( ret ); /* Set the tweak key. Always set tweak key for encryption. */ ret = mbedtls_aes_setkey_enc( &ctx->tweak, key2, key2bits ); if( ret != 0 ) return( ret ); /* Set crypt key for decryption. */ return mbedtls_aes_setkey_dec( &ctx->crypt, key1, key1bits ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ #endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */ #define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ { \ X0 = *RK++ ^ AES_FT0( ( Y0 ) & 0xFF ) ^ \ AES_FT1( ( Y1 >> 8 ) & 0xFF ) ^ \ AES_FT2( ( Y2 >> 16 ) & 0xFF ) ^ \ AES_FT3( ( Y3 >> 24 ) & 0xFF ); \ \ X1 = *RK++ ^ AES_FT0( ( Y1 ) & 0xFF ) ^ \ AES_FT1( ( Y2 >> 8 ) & 0xFF ) ^ \ AES_FT2( ( Y3 >> 16 ) & 0xFF ) ^ \ AES_FT3( ( Y0 >> 24 ) & 0xFF ); \ \ X2 = *RK++ ^ AES_FT0( ( Y2 ) & 0xFF ) ^ \ AES_FT1( ( Y3 >> 8 ) & 0xFF ) ^ \ AES_FT2( ( Y0 >> 16 ) & 0xFF ) ^ \ AES_FT3( ( Y1 >> 24 ) & 0xFF ); \ \ X3 = *RK++ ^ AES_FT0( ( Y3 ) & 0xFF ) ^ \ AES_FT1( ( Y0 >> 8 ) & 0xFF ) ^ \ AES_FT2( ( Y1 >> 16 ) & 0xFF ) ^ \ AES_FT3( ( Y2 >> 24 ) & 0xFF ); \ } #define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ { \ X0 = *RK++ ^ AES_RT0( ( Y0 ) & 0xFF ) ^ \ AES_RT1( ( Y3 >> 8 ) & 0xFF ) ^ \ AES_RT2( ( Y2 >> 16 ) & 0xFF ) ^ \ AES_RT3( ( Y1 >> 24 ) & 0xFF ); \ \ X1 = *RK++ ^ AES_RT0( ( Y1 ) & 0xFF ) ^ \ AES_RT1( ( Y0 >> 8 ) & 0xFF ) ^ \ AES_RT2( ( Y3 >> 16 ) & 0xFF ) ^ \ AES_RT3( ( Y2 >> 24 ) & 0xFF ); \ \ X2 = *RK++ ^ AES_RT0( ( Y2 ) & 0xFF ) ^ \ AES_RT1( ( Y1 >> 8 ) & 0xFF ) ^ \ AES_RT2( ( Y0 >> 16 ) & 0xFF ) ^ \ AES_RT3( ( Y3 >> 24 ) & 0xFF ); \ \ X3 = *RK++ ^ AES_RT0( ( Y3 ) & 0xFF ) ^ \ AES_RT1( ( Y2 >> 8 ) & 0xFF ) ^ \ AES_RT2( ( Y1 >> 16 ) & 0xFF ) ^ \ AES_RT3( ( Y0 >> 24 ) & 0xFF ); \ } /* * AES-ECB block encryption */ #if !defined(MBEDTLS_AES_ENCRYPT_ALT) int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ) { int i; uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; RK = ctx->rk; GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++; GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++; GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++; GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++; for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- ) { AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); } AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); X0 = *RK++ ^ \ ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); X1 = *RK++ ^ \ ( (uint32_t) FSb[ ( Y1 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); X2 = *RK++ ^ \ ( (uint32_t) FSb[ ( Y2 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); X3 = *RK++ ^ \ ( (uint32_t) FSb[ ( Y3 ) & 0xFF ] ) ^ ( (uint32_t) FSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); PUT_UINT32_LE( X0, output, 0 ); PUT_UINT32_LE( X1, output, 4 ); PUT_UINT32_LE( X2, output, 8 ); PUT_UINT32_LE( X3, output, 12 ); return( 0 ); } #endif /* !MBEDTLS_AES_ENCRYPT_ALT */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_aes_encrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ) { mbedtls_internal_aes_encrypt( ctx, input, output ); } #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /* * AES-ECB block decryption */ #if !defined(MBEDTLS_AES_DECRYPT_ALT) int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ) { int i; uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; RK = ctx->rk; GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++; GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++; GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++; GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++; for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- ) { AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); } AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); X0 = *RK++ ^ \ ( (uint32_t) RSb[ ( Y0 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( Y3 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 ); X1 = *RK++ ^ \ ( (uint32_t) RSb[ ( Y1 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( Y0 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 ); X2 = *RK++ ^ \ ( (uint32_t) RSb[ ( Y2 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( Y1 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 ); X3 = *RK++ ^ \ ( (uint32_t) RSb[ ( Y3 ) & 0xFF ] ) ^ ( (uint32_t) RSb[ ( Y2 >> 8 ) & 0xFF ] << 8 ) ^ ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^ ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 ); PUT_UINT32_LE( X0, output, 0 ); PUT_UINT32_LE( X1, output, 4 ); PUT_UINT32_LE( X2, output, 8 ); PUT_UINT32_LE( X3, output, 12 ); return( 0 ); } #endif /* !MBEDTLS_AES_DECRYPT_ALT */ #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_aes_decrypt( mbedtls_aes_context *ctx, const unsigned char input[16], unsigned char output[16] ) { mbedtls_internal_aes_decrypt( ctx, input, output ); } #endif /* !MBEDTLS_DEPRECATED_REMOVED */ /* * AES-ECB block encryption/decryption */ int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ) { AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) ) return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) ); #endif #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86) if( aes_padlock_ace ) { if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 ) return( 0 ); // If padlock data misaligned, we just fall back to // unaccelerated mode // } #endif if( mode == MBEDTLS_AES_ENCRYPT ) return( mbedtls_internal_aes_encrypt( ctx, input, output ) ); else return( mbedtls_internal_aes_decrypt( ctx, input, output ) ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * AES-CBC buffer encryption/decryption */ int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[16]; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); AES_VALIDATE_RET( iv != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); if( length % 16 ) return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH ); #if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86) if( aes_padlock_ace ) { if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 ) return( 0 ); // If padlock data misaligned, we just fall back to // unaccelerated mode // } #endif if( mode == MBEDTLS_AES_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, 16 ); mbedtls_aes_crypt_ecb( ctx, mode, input, output ); for( i = 0; i < 16; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 16 ); input += 16; output += 16; length -= 16; } } else { while( length > 0 ) { for( i = 0; i < 16; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_aes_crypt_ecb( ctx, mode, output, output ); memcpy( iv, output, 16 ); input += 16; output += 16; length -= 16; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_XTS) /* Endianess with 64 bits values */ #ifndef GET_UINT64_LE #define GET_UINT64_LE(n,b,i) \ { \ (n) = ( (uint64_t) (b)[(i) + 7] << 56 ) \ | ( (uint64_t) (b)[(i) + 6] << 48 ) \ | ( (uint64_t) (b)[(i) + 5] << 40 ) \ | ( (uint64_t) (b)[(i) + 4] << 32 ) \ | ( (uint64_t) (b)[(i) + 3] << 24 ) \ | ( (uint64_t) (b)[(i) + 2] << 16 ) \ | ( (uint64_t) (b)[(i) + 1] << 8 ) \ | ( (uint64_t) (b)[(i) ] ); \ } #endif #ifndef PUT_UINT64_LE #define PUT_UINT64_LE(n,b,i) \ { \ (b)[(i) + 7] = (unsigned char) ( (n) >> 56 ); \ (b)[(i) + 6] = (unsigned char) ( (n) >> 48 ); \ (b)[(i) + 5] = (unsigned char) ( (n) >> 40 ); \ (b)[(i) + 4] = (unsigned char) ( (n) >> 32 ); \ (b)[(i) + 3] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) ] = (unsigned char) ( (n) ); \ } #endif typedef unsigned char mbedtls_be128[16]; /* * GF(2^128) multiplication function * * This function multiplies a field element by x in the polynomial field * representation. It uses 64-bit word operations to gain speed but compensates * for machine endianess and hence works correctly on both big and little * endian machines. */ static void mbedtls_gf128mul_x_ble( unsigned char r[16], const unsigned char x[16] ) { uint64_t a, b, ra, rb; GET_UINT64_LE( a, x, 0 ); GET_UINT64_LE( b, x, 8 ); ra = ( a << 1 ) ^ 0x0087 >> ( 8 - ( ( b >> 63 ) << 3 ) ); rb = ( a >> 63 ) | ( b << 1 ); PUT_UINT64_LE( ra, r, 0 ); PUT_UINT64_LE( rb, r, 8 ); } /* * AES-XTS buffer encryption/decryption */ int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx, int mode, size_t length, const unsigned char data_unit[16], const unsigned char *input, unsigned char *output ) { int ret; size_t blocks = length / 16; size_t leftover = length % 16; unsigned char tweak[16]; unsigned char prev_tweak[16]; unsigned char tmp[16]; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); AES_VALIDATE_RET( data_unit != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); /* Data units must be at least 16 bytes long. */ if( length < 16 ) return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH; /* NIST SP 800-38E disallows data units larger than 2**20 blocks. */ if( length > ( 1 << 20 ) * 16 ) return MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH; /* Compute the tweak. */ ret = mbedtls_aes_crypt_ecb( &ctx->tweak, MBEDTLS_AES_ENCRYPT, data_unit, tweak ); if( ret != 0 ) return( ret ); while( blocks-- ) { size_t i; if( leftover && ( mode == MBEDTLS_AES_DECRYPT ) && blocks == 0 ) { /* We are on the last block in a decrypt operation that has * leftover bytes, so we need to use the next tweak for this block, * and this tweak for the lefover bytes. Save the current tweak for * the leftovers and then update the current tweak for use on this, * the last full block. */ memcpy( prev_tweak, tweak, sizeof( tweak ) ); mbedtls_gf128mul_x_ble( tweak, tweak ); } for( i = 0; i < 16; i++ ) tmp[i] = input[i] ^ tweak[i]; ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp ); if( ret != 0 ) return( ret ); for( i = 0; i < 16; i++ ) output[i] = tmp[i] ^ tweak[i]; /* Update the tweak for the next block. */ mbedtls_gf128mul_x_ble( tweak, tweak ); output += 16; input += 16; } if( leftover ) { /* If we are on the leftover bytes in a decrypt operation, we need to * use the previous tweak for these bytes (as saved in prev_tweak). */ unsigned char *t = mode == MBEDTLS_AES_DECRYPT ? prev_tweak : tweak; /* We are now on the final part of the data unit, which doesn't divide * evenly by 16. It's time for ciphertext stealing. */ size_t i; unsigned char *prev_output = output - 16; /* Copy ciphertext bytes from the previous block to our output for each * byte of cyphertext we won't steal. At the same time, copy the * remainder of the input for this final round (since the loop bounds * are the same). */ for( i = 0; i < leftover; i++ ) { output[i] = prev_output[i]; tmp[i] = input[i] ^ t[i]; } /* Copy ciphertext bytes from the previous block for input in this * round. */ for( ; i < 16; i++ ) tmp[i] = prev_output[i] ^ t[i]; ret = mbedtls_aes_crypt_ecb( &ctx->crypt, mode, tmp, tmp ); if( ret != 0 ) return ret; /* Write the result back to the previous block, overriding the previous * output we copied. */ for( i = 0; i < 16; i++ ) prev_output[i] = tmp[i] ^ t[i]; } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * AES-CFB128 buffer encryption/decryption */ int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int c; size_t n; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); AES_VALIDATE_RET( iv_off != NULL ); AES_VALIDATE_RET( iv != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); n = *iv_off; if( n > 15 ) return( MBEDTLS_ERR_AES_BAD_INPUT_DATA ); if( mode == MBEDTLS_AES_DECRYPT ) { while( length-- ) { if( n == 0 ) mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv ); c = *input++; *output++ = (unsigned char)( c ^ iv[n] ); iv[n] = (unsigned char) c; n = ( n + 1 ) & 0x0F; } } else { while( length-- ) { if( n == 0 ) mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv ); iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); n = ( n + 1 ) & 0x0F; } } *iv_off = n; return( 0 ); } /* * AES-CFB8 buffer encryption/decryption */ int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { unsigned char c; unsigned char ov[17]; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( mode == MBEDTLS_AES_ENCRYPT || mode == MBEDTLS_AES_DECRYPT ); AES_VALIDATE_RET( iv != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); while( length-- ) { memcpy( ov, iv, 16 ); mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv ); if( mode == MBEDTLS_AES_DECRYPT ) ov[16] = *input; c = *output++ = (unsigned char)( iv[0] ^ *input++ ); if( mode == MBEDTLS_AES_ENCRYPT ) ov[16] = c; memcpy( iv, ov + 1, 16 ); } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) /* * AES-OFB (Output Feedback Mode) buffer encryption/decryption */ int mbedtls_aes_crypt_ofb( mbedtls_aes_context *ctx, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int ret = 0; size_t n; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( iv_off != NULL ); AES_VALIDATE_RET( iv != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); n = *iv_off; if( n > 15 ) return( MBEDTLS_ERR_AES_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { ret = mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv ); if( ret != 0 ) goto exit; } *output++ = *input++ ^ iv[n]; n = ( n + 1 ) & 0x0F; } *iv_off = n; exit: return( ret ); } #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * AES-CTR buffer encryption/decryption */ int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output ) { int c, i; size_t n; AES_VALIDATE_RET( ctx != NULL ); AES_VALIDATE_RET( nc_off != NULL ); AES_VALIDATE_RET( nonce_counter != NULL ); AES_VALIDATE_RET( stream_block != NULL ); AES_VALIDATE_RET( input != NULL ); AES_VALIDATE_RET( output != NULL ); n = *nc_off; if ( n > 0x0F ) return( MBEDTLS_ERR_AES_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block ); for( i = 16; i > 0; i-- ) if( ++nonce_counter[i - 1] != 0 ) break; } c = *input++; *output++ = (unsigned char)( c ^ stream_block[n] ); n = ( n + 1 ) & 0x0F; } *nc_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #endif /* !MBEDTLS_AES_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * AES test vectors from: * * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip */ static const unsigned char aes_test_ecb_dec[3][16] = { { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58, 0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 }, { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2, 0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 }, { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D, 0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE } }; static const unsigned char aes_test_ecb_enc[3][16] = { { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73, 0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F }, { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11, 0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 }, { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D, 0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 } }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const unsigned char aes_test_cbc_dec[3][16] = { { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73, 0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 }, { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75, 0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B }, { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75, 0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 } }; static const unsigned char aes_test_cbc_enc[3][16] = { { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84, 0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D }, { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB, 0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 }, { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5, 0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 } }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * AES-CFB128 test vectors from: * * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf */ static const unsigned char aes_test_cfb128_key[3][32] = { { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }, { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }, { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } }; static const unsigned char aes_test_cfb128_iv[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; static const unsigned char aes_test_cfb128_pt[64] = { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51, 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF, 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17, 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10 }; static const unsigned char aes_test_cfb128_ct[3][64] = { { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A, 0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F, 0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B, 0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40, 0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF, 0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E, 0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 }, { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB, 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74, 0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21, 0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A, 0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1, 0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9, 0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0, 0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF }, { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B, 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60, 0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8, 0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B, 0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92, 0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9, 0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8, 0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 } }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) /* * AES-OFB test vectors from: * * https://csrc.nist.gov/publications/detail/sp/800-38a/final */ static const unsigned char aes_test_ofb_key[3][32] = { { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }, { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }, { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } }; static const unsigned char aes_test_ofb_iv[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; static const unsigned char aes_test_ofb_pt[64] = { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A, 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51, 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF, 0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17, 0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10 }; static const unsigned char aes_test_ofb_ct[3][64] = { { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20, 0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A, 0x77, 0x89, 0x50, 0x8d, 0x16, 0x91, 0x8f, 0x03, 0xf5, 0x3c, 0x52, 0xda, 0xc5, 0x4e, 0xd8, 0x25, 0x97, 0x40, 0x05, 0x1e, 0x9c, 0x5f, 0xec, 0xf6, 0x43, 0x44, 0xf7, 0xa8, 0x22, 0x60, 0xed, 0xcc, 0x30, 0x4c, 0x65, 0x28, 0xf6, 0x59, 0xc7, 0x78, 0x66, 0xa5, 0x10, 0xd9, 0xc1, 0xd6, 0xae, 0x5e }, { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB, 0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74, 0xfc, 0xc2, 0x8b, 0x8d, 0x4c, 0x63, 0x83, 0x7c, 0x09, 0xe8, 0x17, 0x00, 0xc1, 0x10, 0x04, 0x01, 0x8d, 0x9a, 0x9a, 0xea, 0xc0, 0xf6, 0x59, 0x6f, 0x55, 0x9c, 0x6d, 0x4d, 0xaf, 0x59, 0xa5, 0xf2, 0x6d, 0x9f, 0x20, 0x08, 0x57, 0xca, 0x6c, 0x3e, 0x9c, 0xac, 0x52, 0x4b, 0xd9, 0xac, 0xc9, 0x2a }, { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B, 0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60, 0x4f, 0xeb, 0xdc, 0x67, 0x40, 0xd2, 0x0b, 0x3a, 0xc8, 0x8f, 0x6a, 0xd8, 0x2a, 0x4f, 0xb0, 0x8d, 0x71, 0xab, 0x47, 0xa0, 0x86, 0xe8, 0x6e, 0xed, 0xf3, 0x9d, 0x1c, 0x5b, 0xba, 0x97, 0xc4, 0x08, 0x01, 0x26, 0x14, 0x1d, 0x67, 0xf3, 0x7b, 0xe8, 0x53, 0x8f, 0x5a, 0x8b, 0xe7, 0x40, 0xe4, 0x84 } }; #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * AES-CTR test vectors from: * * http://www.faqs.org/rfcs/rfc3686.html */ static const unsigned char aes_test_ctr_key[3][16] = { { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E }, { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 }, { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC } }; static const unsigned char aes_test_ctr_nonce_counter[3][16] = { { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 }, { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 } }; static const unsigned char aes_test_ctr_pt[3][48] = { { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23 } }; static const unsigned char aes_test_ctr_ct[3][48] = { { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79, 0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 }, { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9, 0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88, 0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8, 0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 }, { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9, 0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7, 0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36, 0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53, 0x25, 0xB2, 0x07, 0x2F } }; static const int aes_test_ctr_len[3] = { 16, 32, 36 }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) /* * AES-XTS test vectors from: * * IEEE P1619/D16 Annex B * https://web.archive.org/web/20150629024421/http://grouper.ieee.org/groups/1619/email/pdf00086.pdf * (Archived from original at http://grouper.ieee.org/groups/1619/email/pdf00086.pdf) */ static const unsigned char aes_test_xts_key[][32] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 }, { 0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 }, }; static const unsigned char aes_test_xts_pt32[][32] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 }, { 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44 }, }; static const unsigned char aes_test_xts_ct32[][32] = { { 0x91, 0x7c, 0xf6, 0x9e, 0xbd, 0x68, 0xb2, 0xec, 0x9b, 0x9f, 0xe9, 0xa3, 0xea, 0xdd, 0xa6, 0x92, 0xcd, 0x43, 0xd2, 0xf5, 0x95, 0x98, 0xed, 0x85, 0x8c, 0x02, 0xc2, 0x65, 0x2f, 0xbf, 0x92, 0x2e }, { 0xc4, 0x54, 0x18, 0x5e, 0x6a, 0x16, 0x93, 0x6e, 0x39, 0x33, 0x40, 0x38, 0xac, 0xef, 0x83, 0x8b, 0xfb, 0x18, 0x6f, 0xff, 0x74, 0x80, 0xad, 0xc4, 0x28, 0x93, 0x82, 0xec, 0xd6, 0xd3, 0x94, 0xf0 }, { 0xaf, 0x85, 0x33, 0x6b, 0x59, 0x7a, 0xfc, 0x1a, 0x90, 0x0b, 0x2e, 0xb2, 0x1e, 0xc9, 0x49, 0xd2, 0x92, 0xdf, 0x4c, 0x04, 0x7e, 0x0b, 0x21, 0x53, 0x21, 0x86, 0xa5, 0x97, 0x1a, 0x22, 0x7a, 0x89 }, }; static const unsigned char aes_test_xts_data_unit[][16] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, }; #endif /* MBEDTLS_CIPHER_MODE_XTS */ /* * Checkup routine */ int mbedtls_aes_self_test( int verbose ) { int ret = 0, i, j, u, mode; unsigned int keybits; unsigned char key[32]; unsigned char buf[64]; const unsigned char *aes_tests; #if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) unsigned char iv[16]; #endif #if defined(MBEDTLS_CIPHER_MODE_CBC) unsigned char prv[16]; #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB) || \ defined(MBEDTLS_CIPHER_MODE_OFB) size_t offset; #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_XTS) int len; #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) unsigned char nonce_counter[16]; unsigned char stream_block[16]; #endif mbedtls_aes_context ctx; memset( key, 0, 32 ); mbedtls_aes_init( &ctx ); /* * ECB mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; keybits = 128 + u * 64; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-ECB-%3d (%s): ", keybits, ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memset( buf, 0, 16 ); if( mode == MBEDTLS_AES_DECRYPT ) { ret = mbedtls_aes_setkey_dec( &ctx, key, keybits ); aes_tests = aes_test_ecb_dec[u]; } else { ret = mbedtls_aes_setkey_enc( &ctx, key, keybits ); aes_tests = aes_test_ecb_enc[u]; } /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 ) { mbedtls_printf( "skipped\n" ); continue; } else if( ret != 0 ) { goto exit; } for( j = 0; j < 10000; j++ ) { ret = mbedtls_aes_crypt_ecb( &ctx, mode, buf, buf ); if( ret != 0 ) goto exit; } if( memcmp( buf, aes_tests, 16 ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * CBC mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; keybits = 128 + u * 64; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-CBC-%3d (%s): ", keybits, ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memset( iv , 0, 16 ); memset( prv, 0, 16 ); memset( buf, 0, 16 ); if( mode == MBEDTLS_AES_DECRYPT ) { ret = mbedtls_aes_setkey_dec( &ctx, key, keybits ); aes_tests = aes_test_cbc_dec[u]; } else { ret = mbedtls_aes_setkey_enc( &ctx, key, keybits ); aes_tests = aes_test_cbc_enc[u]; } /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 ) { mbedtls_printf( "skipped\n" ); continue; } else if( ret != 0 ) { goto exit; } for( j = 0; j < 10000; j++ ) { if( mode == MBEDTLS_AES_ENCRYPT ) { unsigned char tmp[16]; memcpy( tmp, prv, 16 ); memcpy( prv, buf, 16 ); memcpy( buf, tmp, 16 ); } ret = mbedtls_aes_crypt_cbc( &ctx, mode, 16, iv, buf, buf ); if( ret != 0 ) goto exit; } if( memcmp( buf, aes_tests, 16 ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * CFB128 mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; keybits = 128 + u * 64; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-CFB128-%3d (%s): ", keybits, ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memcpy( iv, aes_test_cfb128_iv, 16 ); memcpy( key, aes_test_cfb128_key[u], keybits / 8 ); offset = 0; ret = mbedtls_aes_setkey_enc( &ctx, key, keybits ); /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 ) { mbedtls_printf( "skipped\n" ); continue; } else if( ret != 0 ) { goto exit; } if( mode == MBEDTLS_AES_DECRYPT ) { memcpy( buf, aes_test_cfb128_ct[u], 64 ); aes_tests = aes_test_cfb128_pt; } else { memcpy( buf, aes_test_cfb128_pt, 64 ); aes_tests = aes_test_cfb128_ct[u]; } ret = mbedtls_aes_crypt_cfb128( &ctx, mode, 64, &offset, iv, buf, buf ); if( ret != 0 ) goto exit; if( memcmp( buf, aes_tests, 64 ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) /* * OFB mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; keybits = 128 + u * 64; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-OFB-%3d (%s): ", keybits, ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memcpy( iv, aes_test_ofb_iv, 16 ); memcpy( key, aes_test_ofb_key[u], keybits / 8 ); offset = 0; ret = mbedtls_aes_setkey_enc( &ctx, key, keybits ); /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && keybits == 192 ) { mbedtls_printf( "skipped\n" ); continue; } else if( ret != 0 ) { goto exit; } if( mode == MBEDTLS_AES_DECRYPT ) { memcpy( buf, aes_test_ofb_ct[u], 64 ); aes_tests = aes_test_ofb_pt; } else { memcpy( buf, aes_test_ofb_pt, 64 ); aes_tests = aes_test_ofb_ct[u]; } ret = mbedtls_aes_crypt_ofb( &ctx, 64, &offset, iv, buf, buf ); if( ret != 0 ) goto exit; if( memcmp( buf, aes_tests, 64 ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * CTR mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-CTR-128 (%s): ", ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 ); memcpy( key, aes_test_ctr_key[u], 16 ); offset = 0; if( ( ret = mbedtls_aes_setkey_enc( &ctx, key, 128 ) ) != 0 ) goto exit; len = aes_test_ctr_len[u]; if( mode == MBEDTLS_AES_DECRYPT ) { memcpy( buf, aes_test_ctr_ct[u], len ); aes_tests = aes_test_ctr_pt[u]; } else { memcpy( buf, aes_test_ctr_pt[u], len ); aes_tests = aes_test_ctr_ct[u]; } ret = mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); if( ret != 0 ) goto exit; if( memcmp( buf, aes_tests, len ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) { static const int num_tests = sizeof(aes_test_xts_key) / sizeof(*aes_test_xts_key); mbedtls_aes_xts_context ctx_xts; /* * XTS mode */ mbedtls_aes_xts_init( &ctx_xts ); for( i = 0; i < num_tests << 1; i++ ) { const unsigned char *data_unit; u = i >> 1; mode = i & 1; if( verbose != 0 ) mbedtls_printf( " AES-XTS-128 (%s): ", ( mode == MBEDTLS_AES_DECRYPT ) ? "dec" : "enc" ); memset( key, 0, sizeof( key ) ); memcpy( key, aes_test_xts_key[u], 32 ); data_unit = aes_test_xts_data_unit[u]; len = sizeof( *aes_test_xts_ct32 ); if( mode == MBEDTLS_AES_DECRYPT ) { ret = mbedtls_aes_xts_setkey_dec( &ctx_xts, key, 256 ); if( ret != 0) goto exit; memcpy( buf, aes_test_xts_ct32[u], len ); aes_tests = aes_test_xts_pt32[u]; } else { ret = mbedtls_aes_xts_setkey_enc( &ctx_xts, key, 256 ); if( ret != 0) goto exit; memcpy( buf, aes_test_xts_pt32[u], len ); aes_tests = aes_test_xts_ct32[u]; } ret = mbedtls_aes_crypt_xts( &ctx_xts, mode, len, data_unit, buf, buf ); if( ret != 0 ) goto exit; if( memcmp( buf, aes_tests, len ) != 0 ) { ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); mbedtls_aes_xts_free( &ctx_xts ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ ret = 0; exit: if( ret != 0 && verbose != 0 ) mbedtls_printf( "failed\n" ); mbedtls_aes_free( &ctx ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_AES_C */ fldigi-4.2.05/src/mbedtls/cipher_wrap.c0000664000175000017500000015376314611711171014672 00000000000000/** * \file cipher_wrap.c * * \brief Generic cipher wrapper for mbed TLS * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CIPHER_C) #include "mbedtls/cipher_internal.h" #if defined(MBEDTLS_CHACHAPOLY_C) #include "mbedtls/chachapoly.h" #endif #if defined(MBEDTLS_AES_C) #include "mbedtls/aes.h" #endif #if defined(MBEDTLS_ARC4_C) #include "mbedtls/arc4.h" #endif #if defined(MBEDTLS_CAMELLIA_C) #include "mbedtls/camellia.h" #endif #if defined(MBEDTLS_ARIA_C) #include "mbedtls/aria.h" #endif #if defined(MBEDTLS_DES_C) #include "mbedtls/des.h" #endif #if defined(MBEDTLS_BLOWFISH_C) #include "mbedtls/blowfish.h" #endif #if defined(MBEDTLS_CHACHA20_C) #include "mbedtls/chacha20.h" #endif #if defined(MBEDTLS_GCM_C) #include "mbedtls/gcm.h" #endif #if defined(MBEDTLS_CCM_C) #include "mbedtls/ccm.h" #endif #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #include #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #if defined(MBEDTLS_GCM_C) /* shared by all GCM ciphers */ static void *gcm_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_gcm_context ) ); if( ctx != NULL ) mbedtls_gcm_init( (mbedtls_gcm_context *) ctx ); return( ctx ); } static void gcm_ctx_free( void *ctx ) { mbedtls_gcm_free( ctx ); mbedtls_free( ctx ); } #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) /* shared by all CCM ciphers */ static void *ccm_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ccm_context ) ); if( ctx != NULL ) mbedtls_ccm_init( (mbedtls_ccm_context *) ctx ); return( ctx ); } static void ccm_ctx_free( void *ctx ) { mbedtls_ccm_free( ctx ); mbedtls_free( ctx ); } #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_AES_C) static int aes_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_ecb( (mbedtls_aes_context *) ctx, operation, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int aes_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_cbc( (mbedtls_aes_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static int aes_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_cfb128( (mbedtls_aes_context *) ctx, operation, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) static int aes_crypt_ofb_wrap( void *ctx, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_ofb( (mbedtls_aes_context *) ctx, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static int aes_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_ctr( (mbedtls_aes_context *) ctx, length, nc_off, nonce_counter, stream_block, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) static int aes_crypt_xts_wrap( void *ctx, mbedtls_operation_t operation, size_t length, const unsigned char data_unit[16], const unsigned char *input, unsigned char *output ) { mbedtls_aes_xts_context *xts_ctx = ctx; int mode; switch( operation ) { case MBEDTLS_ENCRYPT: mode = MBEDTLS_AES_ENCRYPT; break; case MBEDTLS_DECRYPT: mode = MBEDTLS_AES_DECRYPT; break; default: return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; } return mbedtls_aes_crypt_xts( xts_ctx, mode, length, data_unit, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ static int aes_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_aes_setkey_dec( (mbedtls_aes_context *) ctx, key, key_bitlen ); } static int aes_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_aes_setkey_enc( (mbedtls_aes_context *) ctx, key, key_bitlen ); } static void * aes_ctx_alloc( void ) { mbedtls_aes_context *aes = mbedtls_calloc( 1, sizeof( mbedtls_aes_context ) ); if( aes == NULL ) return( NULL ); mbedtls_aes_init( aes ); return( aes ); } static void aes_ctx_free( void *ctx ) { mbedtls_aes_free( (mbedtls_aes_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t aes_info = { MBEDTLS_CIPHER_ID_AES, aes_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) aes_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) aes_crypt_cfb128_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) aes_crypt_ofb_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) aes_crypt_ctr_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif aes_setkey_enc_wrap, aes_setkey_dec_wrap, aes_ctx_alloc, aes_ctx_free }; static const mbedtls_cipher_info_t aes_128_ecb_info = { MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_MODE_ECB, 128, "AES-128-ECB", 0, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_ecb_info = { MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_MODE_ECB, 192, "AES-192-ECB", 0, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_ecb_info = { MBEDTLS_CIPHER_AES_256_ECB, MBEDTLS_MODE_ECB, 256, "AES-256-ECB", 0, 0, 16, &aes_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t aes_128_cbc_info = { MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MODE_CBC, 128, "AES-128-CBC", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_cbc_info = { MBEDTLS_CIPHER_AES_192_CBC, MBEDTLS_MODE_CBC, 192, "AES-192-CBC", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_cbc_info = { MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MODE_CBC, 256, "AES-256-CBC", 16, 0, 16, &aes_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const mbedtls_cipher_info_t aes_128_cfb128_info = { MBEDTLS_CIPHER_AES_128_CFB128, MBEDTLS_MODE_CFB, 128, "AES-128-CFB128", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_cfb128_info = { MBEDTLS_CIPHER_AES_192_CFB128, MBEDTLS_MODE_CFB, 192, "AES-192-CFB128", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_cfb128_info = { MBEDTLS_CIPHER_AES_256_CFB128, MBEDTLS_MODE_CFB, 256, "AES-256-CFB128", 16, 0, 16, &aes_info }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) static const mbedtls_cipher_info_t aes_128_ofb_info = { MBEDTLS_CIPHER_AES_128_OFB, MBEDTLS_MODE_OFB, 128, "AES-128-OFB", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_ofb_info = { MBEDTLS_CIPHER_AES_192_OFB, MBEDTLS_MODE_OFB, 192, "AES-192-OFB", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_ofb_info = { MBEDTLS_CIPHER_AES_256_OFB, MBEDTLS_MODE_OFB, 256, "AES-256-OFB", 16, 0, 16, &aes_info }; #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const mbedtls_cipher_info_t aes_128_ctr_info = { MBEDTLS_CIPHER_AES_128_CTR, MBEDTLS_MODE_CTR, 128, "AES-128-CTR", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_192_ctr_info = { MBEDTLS_CIPHER_AES_192_CTR, MBEDTLS_MODE_CTR, 192, "AES-192-CTR", 16, 0, 16, &aes_info }; static const mbedtls_cipher_info_t aes_256_ctr_info = { MBEDTLS_CIPHER_AES_256_CTR, MBEDTLS_MODE_CTR, 256, "AES-256-CTR", 16, 0, 16, &aes_info }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) static int xts_aes_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { mbedtls_aes_xts_context *xts_ctx = ctx; return( mbedtls_aes_xts_setkey_enc( xts_ctx, key, key_bitlen ) ); } static int xts_aes_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { mbedtls_aes_xts_context *xts_ctx = ctx; return( mbedtls_aes_xts_setkey_dec( xts_ctx, key, key_bitlen ) ); } static void *xts_aes_ctx_alloc( void ) { mbedtls_aes_xts_context *xts_ctx = mbedtls_calloc( 1, sizeof( *xts_ctx ) ); if( xts_ctx != NULL ) mbedtls_aes_xts_init( xts_ctx ); return( xts_ctx ); } static void xts_aes_ctx_free( void *ctx ) { mbedtls_aes_xts_context *xts_ctx = ctx; if( xts_ctx == NULL ) return; mbedtls_aes_xts_free( xts_ctx ); mbedtls_free( xts_ctx ); } static const mbedtls_cipher_base_t xts_aes_info = { MBEDTLS_CIPHER_ID_AES, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) aes_crypt_xts_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif xts_aes_setkey_enc_wrap, xts_aes_setkey_dec_wrap, xts_aes_ctx_alloc, xts_aes_ctx_free }; static const mbedtls_cipher_info_t aes_128_xts_info = { MBEDTLS_CIPHER_AES_128_XTS, MBEDTLS_MODE_XTS, 256, "AES-128-XTS", 16, 0, 16, &xts_aes_info }; static const mbedtls_cipher_info_t aes_256_xts_info = { MBEDTLS_CIPHER_AES_256_XTS, MBEDTLS_MODE_XTS, 512, "AES-256-XTS", 16, 0, 16, &xts_aes_info }; #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_GCM_C) static int gcm_aes_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES, key, key_bitlen ); } static const mbedtls_cipher_base_t gcm_aes_info = { MBEDTLS_CIPHER_ID_AES, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif gcm_aes_setkey_wrap, gcm_aes_setkey_wrap, gcm_ctx_alloc, gcm_ctx_free, }; static const mbedtls_cipher_info_t aes_128_gcm_info = { MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MODE_GCM, 128, "AES-128-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aes_info }; static const mbedtls_cipher_info_t aes_192_gcm_info = { MBEDTLS_CIPHER_AES_192_GCM, MBEDTLS_MODE_GCM, 192, "AES-192-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aes_info }; static const mbedtls_cipher_info_t aes_256_gcm_info = { MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MODE_GCM, 256, "AES-256-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aes_info }; #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) static int ccm_aes_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES, key, key_bitlen ); } static const mbedtls_cipher_base_t ccm_aes_info = { MBEDTLS_CIPHER_ID_AES, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif ccm_aes_setkey_wrap, ccm_aes_setkey_wrap, ccm_ctx_alloc, ccm_ctx_free, }; static const mbedtls_cipher_info_t aes_128_ccm_info = { MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MODE_CCM, 128, "AES-128-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aes_info }; static const mbedtls_cipher_info_t aes_192_ccm_info = { MBEDTLS_CIPHER_AES_192_CCM, MBEDTLS_MODE_CCM, 192, "AES-192-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aes_info }; static const mbedtls_cipher_info_t aes_256_ccm_info = { MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MODE_CCM, 256, "AES-256-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aes_info }; #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) static int camellia_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { return mbedtls_camellia_crypt_ecb( (mbedtls_camellia_context *) ctx, operation, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int camellia_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_camellia_crypt_cbc( (mbedtls_camellia_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static int camellia_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_camellia_crypt_cfb128( (mbedtls_camellia_context *) ctx, operation, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static int camellia_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ) { return mbedtls_camellia_crypt_ctr( (mbedtls_camellia_context *) ctx, length, nc_off, nonce_counter, stream_block, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ static int camellia_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_camellia_setkey_dec( (mbedtls_camellia_context *) ctx, key, key_bitlen ); } static int camellia_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_camellia_setkey_enc( (mbedtls_camellia_context *) ctx, key, key_bitlen ); } static void * camellia_ctx_alloc( void ) { mbedtls_camellia_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_camellia_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_camellia_init( ctx ); return( ctx ); } static void camellia_ctx_free( void *ctx ) { mbedtls_camellia_free( (mbedtls_camellia_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t camellia_info = { MBEDTLS_CIPHER_ID_CAMELLIA, camellia_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) camellia_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) camellia_crypt_cfb128_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) camellia_crypt_ctr_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif camellia_setkey_enc_wrap, camellia_setkey_dec_wrap, camellia_ctx_alloc, camellia_ctx_free }; static const mbedtls_cipher_info_t camellia_128_ecb_info = { MBEDTLS_CIPHER_CAMELLIA_128_ECB, MBEDTLS_MODE_ECB, 128, "CAMELLIA-128-ECB", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_192_ecb_info = { MBEDTLS_CIPHER_CAMELLIA_192_ECB, MBEDTLS_MODE_ECB, 192, "CAMELLIA-192-ECB", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_256_ecb_info = { MBEDTLS_CIPHER_CAMELLIA_256_ECB, MBEDTLS_MODE_ECB, 256, "CAMELLIA-256-ECB", 16, 0, 16, &camellia_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t camellia_128_cbc_info = { MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MODE_CBC, 128, "CAMELLIA-128-CBC", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_192_cbc_info = { MBEDTLS_CIPHER_CAMELLIA_192_CBC, MBEDTLS_MODE_CBC, 192, "CAMELLIA-192-CBC", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_256_cbc_info = { MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MODE_CBC, 256, "CAMELLIA-256-CBC", 16, 0, 16, &camellia_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const mbedtls_cipher_info_t camellia_128_cfb128_info = { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, MBEDTLS_MODE_CFB, 128, "CAMELLIA-128-CFB128", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_192_cfb128_info = { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, MBEDTLS_MODE_CFB, 192, "CAMELLIA-192-CFB128", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_256_cfb128_info = { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, MBEDTLS_MODE_CFB, 256, "CAMELLIA-256-CFB128", 16, 0, 16, &camellia_info }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const mbedtls_cipher_info_t camellia_128_ctr_info = { MBEDTLS_CIPHER_CAMELLIA_128_CTR, MBEDTLS_MODE_CTR, 128, "CAMELLIA-128-CTR", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_192_ctr_info = { MBEDTLS_CIPHER_CAMELLIA_192_CTR, MBEDTLS_MODE_CTR, 192, "CAMELLIA-192-CTR", 16, 0, 16, &camellia_info }; static const mbedtls_cipher_info_t camellia_256_ctr_info = { MBEDTLS_CIPHER_CAMELLIA_256_CTR, MBEDTLS_MODE_CTR, 256, "CAMELLIA-256-CTR", 16, 0, 16, &camellia_info }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_GCM_C) static int gcm_camellia_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA, key, key_bitlen ); } static const mbedtls_cipher_base_t gcm_camellia_info = { MBEDTLS_CIPHER_ID_CAMELLIA, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif gcm_camellia_setkey_wrap, gcm_camellia_setkey_wrap, gcm_ctx_alloc, gcm_ctx_free, }; static const mbedtls_cipher_info_t camellia_128_gcm_info = { MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MODE_GCM, 128, "CAMELLIA-128-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_camellia_info }; static const mbedtls_cipher_info_t camellia_192_gcm_info = { MBEDTLS_CIPHER_CAMELLIA_192_GCM, MBEDTLS_MODE_GCM, 192, "CAMELLIA-192-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_camellia_info }; static const mbedtls_cipher_info_t camellia_256_gcm_info = { MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MODE_GCM, 256, "CAMELLIA-256-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_camellia_info }; #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) static int ccm_camellia_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA, key, key_bitlen ); } static const mbedtls_cipher_base_t ccm_camellia_info = { MBEDTLS_CIPHER_ID_CAMELLIA, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif ccm_camellia_setkey_wrap, ccm_camellia_setkey_wrap, ccm_ctx_alloc, ccm_ctx_free, }; static const mbedtls_cipher_info_t camellia_128_ccm_info = { MBEDTLS_CIPHER_CAMELLIA_128_CCM, MBEDTLS_MODE_CCM, 128, "CAMELLIA-128-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_camellia_info }; static const mbedtls_cipher_info_t camellia_192_ccm_info = { MBEDTLS_CIPHER_CAMELLIA_192_CCM, MBEDTLS_MODE_CCM, 192, "CAMELLIA-192-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_camellia_info }; static const mbedtls_cipher_info_t camellia_256_ccm_info = { MBEDTLS_CIPHER_CAMELLIA_256_CCM, MBEDTLS_MODE_CCM, 256, "CAMELLIA-256-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_camellia_info }; #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_ARIA_C) static int aria_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { (void) operation; return mbedtls_aria_crypt_ecb( (mbedtls_aria_context *) ctx, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int aria_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aria_crypt_cbc( (mbedtls_aria_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static int aria_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aria_crypt_cfb128( (mbedtls_aria_context *) ctx, operation, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static int aria_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ) { return mbedtls_aria_crypt_ctr( (mbedtls_aria_context *) ctx, length, nc_off, nonce_counter, stream_block, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ static int aria_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_aria_setkey_dec( (mbedtls_aria_context *) ctx, key, key_bitlen ); } static int aria_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_aria_setkey_enc( (mbedtls_aria_context *) ctx, key, key_bitlen ); } static void * aria_ctx_alloc( void ) { mbedtls_aria_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_aria_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_aria_init( ctx ); return( ctx ); } static void aria_ctx_free( void *ctx ) { mbedtls_aria_free( (mbedtls_aria_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t aria_info = { MBEDTLS_CIPHER_ID_ARIA, aria_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) aria_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) aria_crypt_cfb128_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) aria_crypt_ctr_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif aria_setkey_enc_wrap, aria_setkey_dec_wrap, aria_ctx_alloc, aria_ctx_free }; static const mbedtls_cipher_info_t aria_128_ecb_info = { MBEDTLS_CIPHER_ARIA_128_ECB, MBEDTLS_MODE_ECB, 128, "ARIA-128-ECB", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_192_ecb_info = { MBEDTLS_CIPHER_ARIA_192_ECB, MBEDTLS_MODE_ECB, 192, "ARIA-192-ECB", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_256_ecb_info = { MBEDTLS_CIPHER_ARIA_256_ECB, MBEDTLS_MODE_ECB, 256, "ARIA-256-ECB", 16, 0, 16, &aria_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t aria_128_cbc_info = { MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MODE_CBC, 128, "ARIA-128-CBC", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_192_cbc_info = { MBEDTLS_CIPHER_ARIA_192_CBC, MBEDTLS_MODE_CBC, 192, "ARIA-192-CBC", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_256_cbc_info = { MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MODE_CBC, 256, "ARIA-256-CBC", 16, 0, 16, &aria_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const mbedtls_cipher_info_t aria_128_cfb128_info = { MBEDTLS_CIPHER_ARIA_128_CFB128, MBEDTLS_MODE_CFB, 128, "ARIA-128-CFB128", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_192_cfb128_info = { MBEDTLS_CIPHER_ARIA_192_CFB128, MBEDTLS_MODE_CFB, 192, "ARIA-192-CFB128", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_256_cfb128_info = { MBEDTLS_CIPHER_ARIA_256_CFB128, MBEDTLS_MODE_CFB, 256, "ARIA-256-CFB128", 16, 0, 16, &aria_info }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const mbedtls_cipher_info_t aria_128_ctr_info = { MBEDTLS_CIPHER_ARIA_128_CTR, MBEDTLS_MODE_CTR, 128, "ARIA-128-CTR", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_192_ctr_info = { MBEDTLS_CIPHER_ARIA_192_CTR, MBEDTLS_MODE_CTR, 192, "ARIA-192-CTR", 16, 0, 16, &aria_info }; static const mbedtls_cipher_info_t aria_256_ctr_info = { MBEDTLS_CIPHER_ARIA_256_CTR, MBEDTLS_MODE_CTR, 256, "ARIA-256-CTR", 16, 0, 16, &aria_info }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_GCM_C) static int gcm_aria_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA, key, key_bitlen ); } static const mbedtls_cipher_base_t gcm_aria_info = { MBEDTLS_CIPHER_ID_ARIA, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif gcm_aria_setkey_wrap, gcm_aria_setkey_wrap, gcm_ctx_alloc, gcm_ctx_free, }; static const mbedtls_cipher_info_t aria_128_gcm_info = { MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MODE_GCM, 128, "ARIA-128-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aria_info }; static const mbedtls_cipher_info_t aria_192_gcm_info = { MBEDTLS_CIPHER_ARIA_192_GCM, MBEDTLS_MODE_GCM, 192, "ARIA-192-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aria_info }; static const mbedtls_cipher_info_t aria_256_gcm_info = { MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MODE_GCM, 256, "ARIA-256-GCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &gcm_aria_info }; #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) static int ccm_aria_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA, key, key_bitlen ); } static const mbedtls_cipher_base_t ccm_aria_info = { MBEDTLS_CIPHER_ID_ARIA, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif ccm_aria_setkey_wrap, ccm_aria_setkey_wrap, ccm_ctx_alloc, ccm_ctx_free, }; static const mbedtls_cipher_info_t aria_128_ccm_info = { MBEDTLS_CIPHER_ARIA_128_CCM, MBEDTLS_MODE_CCM, 128, "ARIA-128-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aria_info }; static const mbedtls_cipher_info_t aria_192_ccm_info = { MBEDTLS_CIPHER_ARIA_192_CCM, MBEDTLS_MODE_CCM, 192, "ARIA-192-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aria_info }; static const mbedtls_cipher_info_t aria_256_ccm_info = { MBEDTLS_CIPHER_ARIA_256_CCM, MBEDTLS_MODE_CCM, 256, "ARIA-256-CCM", 12, MBEDTLS_CIPHER_VARIABLE_IV_LEN, 16, &ccm_aria_info }; #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_ARIA_C */ #if defined(MBEDTLS_DES_C) static int des_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { ((void) operation); return mbedtls_des_crypt_ecb( (mbedtls_des_context *) ctx, input, output ); } static int des3_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { ((void) operation); return mbedtls_des3_crypt_ecb( (mbedtls_des3_context *) ctx, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int des_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_des_crypt_cbc( (mbedtls_des_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CBC) static int des3_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_des3_crypt_cbc( (mbedtls_des3_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ static int des_setkey_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des_setkey_dec( (mbedtls_des_context *) ctx, key ); } static int des_setkey_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des_setkey_enc( (mbedtls_des_context *) ctx, key ); } static int des3_set2key_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des3_set2key_dec( (mbedtls_des3_context *) ctx, key ); } static int des3_set2key_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des3_set2key_enc( (mbedtls_des3_context *) ctx, key ); } static int des3_set3key_dec_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des3_set3key_dec( (mbedtls_des3_context *) ctx, key ); } static int des3_set3key_enc_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) key_bitlen); return mbedtls_des3_set3key_enc( (mbedtls_des3_context *) ctx, key ); } static void * des_ctx_alloc( void ) { mbedtls_des_context *des = mbedtls_calloc( 1, sizeof( mbedtls_des_context ) ); if( des == NULL ) return( NULL ); mbedtls_des_init( des ); return( des ); } static void des_ctx_free( void *ctx ) { mbedtls_des_free( (mbedtls_des_context *) ctx ); mbedtls_free( ctx ); } static void * des3_ctx_alloc( void ) { mbedtls_des3_context *des3; des3 = mbedtls_calloc( 1, sizeof( mbedtls_des3_context ) ); if( des3 == NULL ) return( NULL ); mbedtls_des3_init( des3 ); return( des3 ); } static void des3_ctx_free( void *ctx ) { mbedtls_des3_free( (mbedtls_des3_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t des_info = { MBEDTLS_CIPHER_ID_DES, des_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) des_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif des_setkey_enc_wrap, des_setkey_dec_wrap, des_ctx_alloc, des_ctx_free }; static const mbedtls_cipher_info_t des_ecb_info = { MBEDTLS_CIPHER_DES_ECB, MBEDTLS_MODE_ECB, MBEDTLS_KEY_LENGTH_DES, "DES-ECB", 8, 0, 8, &des_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t des_cbc_info = { MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MODE_CBC, MBEDTLS_KEY_LENGTH_DES, "DES-CBC", 8, 0, 8, &des_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ static const mbedtls_cipher_base_t des_ede_info = { MBEDTLS_CIPHER_ID_DES, des3_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) des3_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif des3_set2key_enc_wrap, des3_set2key_dec_wrap, des3_ctx_alloc, des3_ctx_free }; static const mbedtls_cipher_info_t des_ede_ecb_info = { MBEDTLS_CIPHER_DES_EDE_ECB, MBEDTLS_MODE_ECB, MBEDTLS_KEY_LENGTH_DES_EDE, "DES-EDE-ECB", 8, 0, 8, &des_ede_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t des_ede_cbc_info = { MBEDTLS_CIPHER_DES_EDE_CBC, MBEDTLS_MODE_CBC, MBEDTLS_KEY_LENGTH_DES_EDE, "DES-EDE-CBC", 8, 0, 8, &des_ede_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ static const mbedtls_cipher_base_t des_ede3_info = { MBEDTLS_CIPHER_ID_3DES, des3_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) des3_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif des3_set3key_enc_wrap, des3_set3key_dec_wrap, des3_ctx_alloc, des3_ctx_free }; static const mbedtls_cipher_info_t des_ede3_ecb_info = { MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_MODE_ECB, MBEDTLS_KEY_LENGTH_DES_EDE3, "DES-EDE3-ECB", 8, 0, 8, &des_ede3_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t des_ede3_cbc_info = { MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MODE_CBC, MBEDTLS_KEY_LENGTH_DES_EDE3, "DES-EDE3-CBC", 8, 0, 8, &des_ede3_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_BLOWFISH_C) static int blowfish_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation, const unsigned char *input, unsigned char *output ) { return mbedtls_blowfish_crypt_ecb( (mbedtls_blowfish_context *) ctx, operation, input, output ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) static int blowfish_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_blowfish_crypt_cbc( (mbedtls_blowfish_context *) ctx, operation, length, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static int blowfish_crypt_cfb64_wrap( void *ctx, mbedtls_operation_t operation, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_blowfish_crypt_cfb64( (mbedtls_blowfish_context *) ctx, operation, length, iv_off, iv, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static int blowfish_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off, unsigned char *nonce_counter, unsigned char *stream_block, const unsigned char *input, unsigned char *output ) { return mbedtls_blowfish_crypt_ctr( (mbedtls_blowfish_context *) ctx, length, nc_off, nonce_counter, stream_block, input, output ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ static int blowfish_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { return mbedtls_blowfish_setkey( (mbedtls_blowfish_context *) ctx, key, key_bitlen ); } static void * blowfish_ctx_alloc( void ) { mbedtls_blowfish_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_blowfish_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_blowfish_init( ctx ); return( ctx ); } static void blowfish_ctx_free( void *ctx ) { mbedtls_blowfish_free( (mbedtls_blowfish_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t blowfish_info = { MBEDTLS_CIPHER_ID_BLOWFISH, blowfish_crypt_ecb_wrap, #if defined(MBEDTLS_CIPHER_MODE_CBC) blowfish_crypt_cbc_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) blowfish_crypt_cfb64_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) blowfish_crypt_ctr_wrap, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif blowfish_setkey_wrap, blowfish_setkey_wrap, blowfish_ctx_alloc, blowfish_ctx_free }; static const mbedtls_cipher_info_t blowfish_ecb_info = { MBEDTLS_CIPHER_BLOWFISH_ECB, MBEDTLS_MODE_ECB, 128, "BLOWFISH-ECB", 8, MBEDTLS_CIPHER_VARIABLE_KEY_LEN, 8, &blowfish_info }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const mbedtls_cipher_info_t blowfish_cbc_info = { MBEDTLS_CIPHER_BLOWFISH_CBC, MBEDTLS_MODE_CBC, 128, "BLOWFISH-CBC", 8, MBEDTLS_CIPHER_VARIABLE_KEY_LEN, 8, &blowfish_info }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const mbedtls_cipher_info_t blowfish_cfb64_info = { MBEDTLS_CIPHER_BLOWFISH_CFB64, MBEDTLS_MODE_CFB, 128, "BLOWFISH-CFB64", 8, MBEDTLS_CIPHER_VARIABLE_KEY_LEN, 8, &blowfish_info }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const mbedtls_cipher_info_t blowfish_ctr_info = { MBEDTLS_CIPHER_BLOWFISH_CTR, MBEDTLS_MODE_CTR, 128, "BLOWFISH-CTR", 8, MBEDTLS_CIPHER_VARIABLE_KEY_LEN, 8, &blowfish_info }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ #endif /* MBEDTLS_BLOWFISH_C */ #if defined(MBEDTLS_ARC4_C) static int arc4_crypt_stream_wrap( void *ctx, size_t length, const unsigned char *input, unsigned char *output ) { return( mbedtls_arc4_crypt( (mbedtls_arc4_context *) ctx, length, input, output ) ); } static int arc4_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { /* we get key_bitlen in bits, arc4 expects it in bytes */ if( key_bitlen % 8 != 0 ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); mbedtls_arc4_setup( (mbedtls_arc4_context *) ctx, key, key_bitlen / 8 ); return( 0 ); } static void * arc4_ctx_alloc( void ) { mbedtls_arc4_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_arc4_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_arc4_init( ctx ); return( ctx ); } static void arc4_ctx_free( void *ctx ) { mbedtls_arc4_free( (mbedtls_arc4_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t arc4_base_info = { MBEDTLS_CIPHER_ID_ARC4, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) arc4_crypt_stream_wrap, #endif arc4_setkey_wrap, arc4_setkey_wrap, arc4_ctx_alloc, arc4_ctx_free }; static const mbedtls_cipher_info_t arc4_128_info = { MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MODE_STREAM, 128, "ARC4-128", 0, 0, 1, &arc4_base_info }; #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CHACHA20_C) static int chacha20_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { if( key_bitlen != 256U ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if ( 0 != mbedtls_chacha20_setkey( (mbedtls_chacha20_context*)ctx, key ) ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); return( 0 ); } static int chacha20_stream_wrap( void *ctx, size_t length, const unsigned char *input, unsigned char *output ) { int ret; ret = mbedtls_chacha20_update( ctx, length, input, output ); if( ret == MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); return( ret ); } static void * chacha20_ctx_alloc( void ) { mbedtls_chacha20_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_chacha20_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_chacha20_init( ctx ); return( ctx ); } static void chacha20_ctx_free( void *ctx ) { mbedtls_chacha20_free( (mbedtls_chacha20_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t chacha20_base_info = { MBEDTLS_CIPHER_ID_CHACHA20, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) chacha20_stream_wrap, #endif chacha20_setkey_wrap, chacha20_setkey_wrap, chacha20_ctx_alloc, chacha20_ctx_free }; static const mbedtls_cipher_info_t chacha20_info = { MBEDTLS_CIPHER_CHACHA20, MBEDTLS_MODE_STREAM, 256, "CHACHA20", 12, 0, 1, &chacha20_base_info }; #endif /* MBEDTLS_CHACHA20_C */ #if defined(MBEDTLS_CHACHAPOLY_C) static int chachapoly_setkey_wrap( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { if( key_bitlen != 256U ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if ( 0 != mbedtls_chachapoly_setkey( (mbedtls_chachapoly_context*)ctx, key ) ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); return( 0 ); } static void * chachapoly_ctx_alloc( void ) { mbedtls_chachapoly_context *ctx; ctx = mbedtls_calloc( 1, sizeof( mbedtls_chachapoly_context ) ); if( ctx == NULL ) return( NULL ); mbedtls_chachapoly_init( ctx ); return( ctx ); } static void chachapoly_ctx_free( void *ctx ) { mbedtls_chachapoly_free( (mbedtls_chachapoly_context *) ctx ); mbedtls_free( ctx ); } static const mbedtls_cipher_base_t chachapoly_base_info = { MBEDTLS_CIPHER_ID_CHACHA20, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) NULL, #endif chachapoly_setkey_wrap, chachapoly_setkey_wrap, chachapoly_ctx_alloc, chachapoly_ctx_free }; static const mbedtls_cipher_info_t chachapoly_info = { MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MODE_CHACHAPOLY, 256, "CHACHA20-POLY1305", 12, 0, 1, &chachapoly_base_info }; #endif /* MBEDTLS_CHACHAPOLY_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) static int null_crypt_stream( void *ctx, size_t length, const unsigned char *input, unsigned char *output ) { ((void) ctx); memmove( output, input, length ); return( 0 ); } static int null_setkey( void *ctx, const unsigned char *key, unsigned int key_bitlen ) { ((void) ctx); ((void) key); ((void) key_bitlen); return( 0 ); } static void * null_ctx_alloc( void ) { return( (void *) 1 ); } static void null_ctx_free( void *ctx ) { ((void) ctx); } static const mbedtls_cipher_base_t null_base_info = { MBEDTLS_CIPHER_ID_NULL, NULL, #if defined(MBEDTLS_CIPHER_MODE_CBC) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) NULL, #endif #if defined(MBEDTLS_CIPHER_MODE_STREAM) null_crypt_stream, #endif null_setkey, null_setkey, null_ctx_alloc, null_ctx_free }; static const mbedtls_cipher_info_t null_cipher_info = { MBEDTLS_CIPHER_NULL, MBEDTLS_MODE_STREAM, 0, "NULL", 0, 0, 1, &null_base_info }; #endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */ const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] = { #if defined(MBEDTLS_AES_C) { MBEDTLS_CIPHER_AES_128_ECB, &aes_128_ecb_info }, { MBEDTLS_CIPHER_AES_192_ECB, &aes_192_ecb_info }, { MBEDTLS_CIPHER_AES_256_ECB, &aes_256_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_AES_128_CBC, &aes_128_cbc_info }, { MBEDTLS_CIPHER_AES_192_CBC, &aes_192_cbc_info }, { MBEDTLS_CIPHER_AES_256_CBC, &aes_256_cbc_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) { MBEDTLS_CIPHER_AES_128_CFB128, &aes_128_cfb128_info }, { MBEDTLS_CIPHER_AES_192_CFB128, &aes_192_cfb128_info }, { MBEDTLS_CIPHER_AES_256_CFB128, &aes_256_cfb128_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_OFB) { MBEDTLS_CIPHER_AES_128_OFB, &aes_128_ofb_info }, { MBEDTLS_CIPHER_AES_192_OFB, &aes_192_ofb_info }, { MBEDTLS_CIPHER_AES_256_OFB, &aes_256_ofb_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) { MBEDTLS_CIPHER_AES_128_CTR, &aes_128_ctr_info }, { MBEDTLS_CIPHER_AES_192_CTR, &aes_192_ctr_info }, { MBEDTLS_CIPHER_AES_256_CTR, &aes_256_ctr_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_XTS) { MBEDTLS_CIPHER_AES_128_XTS, &aes_128_xts_info }, { MBEDTLS_CIPHER_AES_256_XTS, &aes_256_xts_info }, #endif #if defined(MBEDTLS_GCM_C) { MBEDTLS_CIPHER_AES_128_GCM, &aes_128_gcm_info }, { MBEDTLS_CIPHER_AES_192_GCM, &aes_192_gcm_info }, { MBEDTLS_CIPHER_AES_256_GCM, &aes_256_gcm_info }, #endif #if defined(MBEDTLS_CCM_C) { MBEDTLS_CIPHER_AES_128_CCM, &aes_128_ccm_info }, { MBEDTLS_CIPHER_AES_192_CCM, &aes_192_ccm_info }, { MBEDTLS_CIPHER_AES_256_CCM, &aes_256_ccm_info }, #endif #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_ARC4_C) { MBEDTLS_CIPHER_ARC4_128, &arc4_128_info }, #endif #if defined(MBEDTLS_BLOWFISH_C) { MBEDTLS_CIPHER_BLOWFISH_ECB, &blowfish_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_BLOWFISH_CBC, &blowfish_cbc_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) { MBEDTLS_CIPHER_BLOWFISH_CFB64, &blowfish_cfb64_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) { MBEDTLS_CIPHER_BLOWFISH_CTR, &blowfish_ctr_info }, #endif #endif /* MBEDTLS_BLOWFISH_C */ #if defined(MBEDTLS_CAMELLIA_C) { MBEDTLS_CIPHER_CAMELLIA_128_ECB, &camellia_128_ecb_info }, { MBEDTLS_CIPHER_CAMELLIA_192_ECB, &camellia_192_ecb_info }, { MBEDTLS_CIPHER_CAMELLIA_256_ECB, &camellia_256_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_CAMELLIA_128_CBC, &camellia_128_cbc_info }, { MBEDTLS_CIPHER_CAMELLIA_192_CBC, &camellia_192_cbc_info }, { MBEDTLS_CIPHER_CAMELLIA_256_CBC, &camellia_256_cbc_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, &camellia_128_cfb128_info }, { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, &camellia_192_cfb128_info }, { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, &camellia_256_cfb128_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) { MBEDTLS_CIPHER_CAMELLIA_128_CTR, &camellia_128_ctr_info }, { MBEDTLS_CIPHER_CAMELLIA_192_CTR, &camellia_192_ctr_info }, { MBEDTLS_CIPHER_CAMELLIA_256_CTR, &camellia_256_ctr_info }, #endif #if defined(MBEDTLS_GCM_C) { MBEDTLS_CIPHER_CAMELLIA_128_GCM, &camellia_128_gcm_info }, { MBEDTLS_CIPHER_CAMELLIA_192_GCM, &camellia_192_gcm_info }, { MBEDTLS_CIPHER_CAMELLIA_256_GCM, &camellia_256_gcm_info }, #endif #if defined(MBEDTLS_CCM_C) { MBEDTLS_CIPHER_CAMELLIA_128_CCM, &camellia_128_ccm_info }, { MBEDTLS_CIPHER_CAMELLIA_192_CCM, &camellia_192_ccm_info }, { MBEDTLS_CIPHER_CAMELLIA_256_CCM, &camellia_256_ccm_info }, #endif #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_ARIA_C) { MBEDTLS_CIPHER_ARIA_128_ECB, &aria_128_ecb_info }, { MBEDTLS_CIPHER_ARIA_192_ECB, &aria_192_ecb_info }, { MBEDTLS_CIPHER_ARIA_256_ECB, &aria_256_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_ARIA_128_CBC, &aria_128_cbc_info }, { MBEDTLS_CIPHER_ARIA_192_CBC, &aria_192_cbc_info }, { MBEDTLS_CIPHER_ARIA_256_CBC, &aria_256_cbc_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CFB) { MBEDTLS_CIPHER_ARIA_128_CFB128, &aria_128_cfb128_info }, { MBEDTLS_CIPHER_ARIA_192_CFB128, &aria_192_cfb128_info }, { MBEDTLS_CIPHER_ARIA_256_CFB128, &aria_256_cfb128_info }, #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) { MBEDTLS_CIPHER_ARIA_128_CTR, &aria_128_ctr_info }, { MBEDTLS_CIPHER_ARIA_192_CTR, &aria_192_ctr_info }, { MBEDTLS_CIPHER_ARIA_256_CTR, &aria_256_ctr_info }, #endif #if defined(MBEDTLS_GCM_C) { MBEDTLS_CIPHER_ARIA_128_GCM, &aria_128_gcm_info }, { MBEDTLS_CIPHER_ARIA_192_GCM, &aria_192_gcm_info }, { MBEDTLS_CIPHER_ARIA_256_GCM, &aria_256_gcm_info }, #endif #if defined(MBEDTLS_CCM_C) { MBEDTLS_CIPHER_ARIA_128_CCM, &aria_128_ccm_info }, { MBEDTLS_CIPHER_ARIA_192_CCM, &aria_192_ccm_info }, { MBEDTLS_CIPHER_ARIA_256_CCM, &aria_256_ccm_info }, #endif #endif /* MBEDTLS_ARIA_C */ #if defined(MBEDTLS_DES_C) { MBEDTLS_CIPHER_DES_ECB, &des_ecb_info }, { MBEDTLS_CIPHER_DES_EDE_ECB, &des_ede_ecb_info }, { MBEDTLS_CIPHER_DES_EDE3_ECB, &des_ede3_ecb_info }, #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_CIPHER_DES_CBC, &des_cbc_info }, { MBEDTLS_CIPHER_DES_EDE_CBC, &des_ede_cbc_info }, { MBEDTLS_CIPHER_DES_EDE3_CBC, &des_ede3_cbc_info }, #endif #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_CHACHA20_C) { MBEDTLS_CIPHER_CHACHA20, &chacha20_info }, #endif #if defined(MBEDTLS_CHACHAPOLY_C) { MBEDTLS_CIPHER_CHACHA20_POLY1305, &chachapoly_info }, #endif #if defined(MBEDTLS_CIPHER_NULL_CIPHER) { MBEDTLS_CIPHER_NULL, &null_cipher_info }, #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ { MBEDTLS_CIPHER_NONE, NULL } }; #define NUM_CIPHERS sizeof mbedtls_cipher_definitions / sizeof mbedtls_cipher_definitions[0] int mbedtls_cipher_supported[NUM_CIPHERS]; #endif /* MBEDTLS_CIPHER_C */ fldigi-4.2.05/src/mbedtls/md2.c0000664000175000017500000002254614611711171013043 00000000000000/* * RFC 1115/1319 compliant MD2 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The MD2 algorithm was designed by Ron Rivest in 1989. * * http://www.ietf.org/rfc/rfc1115.txt * http://www.ietf.org/rfc/rfc1319.txt */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD2_C) #include "mbedtls/md2.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_MD2_ALT) static const unsigned char PI_SUBST[256] = { 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21, 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F, 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A, 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14 }; void mbedtls_md2_init( mbedtls_md2_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_md2_context ) ); } void mbedtls_md2_free( mbedtls_md2_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md2_context ) ); } void mbedtls_md2_clone( mbedtls_md2_context *dst, const mbedtls_md2_context *src ) { *dst = *src; } /* * MD2 context setup */ int mbedtls_md2_starts_ret( mbedtls_md2_context *ctx ) { memset( ctx->cksum, 0, 16 ); memset( ctx->state, 0, 46 ); memset( ctx->buffer, 0, 16 ); ctx->left = 0; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2_starts( mbedtls_md2_context *ctx ) { mbedtls_md2_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_MD2_PROCESS_ALT) int mbedtls_internal_md2_process( mbedtls_md2_context *ctx ) { int i, j; unsigned char t = 0; for( i = 0; i < 16; i++ ) { ctx->state[i + 16] = ctx->buffer[i]; ctx->state[i + 32] = (unsigned char)( ctx->buffer[i] ^ ctx->state[i]); } for( i = 0; i < 18; i++ ) { for( j = 0; j < 48; j++ ) { ctx->state[j] = (unsigned char) ( ctx->state[j] ^ PI_SUBST[t] ); t = ctx->state[j]; } t = (unsigned char)( t + i ); } t = ctx->cksum[15]; for( i = 0; i < 16; i++ ) { ctx->cksum[i] = (unsigned char) ( ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t] ); t = ctx->cksum[i]; } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2_process( mbedtls_md2_context *ctx ) { mbedtls_internal_md2_process( ctx ); } #endif #endif /* !MBEDTLS_MD2_PROCESS_ALT */ /* * MD2 process buffer */ int mbedtls_md2_update_ret( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; while( ilen > 0 ) { if( ilen > 16 - ctx->left ) fill = 16 - ctx->left; else fill = ilen; memcpy( ctx->buffer + ctx->left, input, fill ); ctx->left += fill; input += fill; ilen -= fill; if( ctx->left == 16 ) { ctx->left = 0; if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 ) return( ret ); } } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_md2_update_ret( ctx, input, ilen ); } #endif /* * MD2 final digest */ int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx, unsigned char output[16] ) { int ret; size_t i; unsigned char x; x = (unsigned char)( 16 - ctx->left ); for( i = ctx->left; i < 16; i++ ) ctx->buffer[i] = x; if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 ) return( ret ); memcpy( ctx->buffer, ctx->cksum, 16 ); if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 ) return( ret ); memcpy( output, ctx->state, 16 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] ) { mbedtls_md2_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_MD2_ALT */ /* * output = MD2( input buffer ) */ int mbedtls_md2_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ) { int ret; mbedtls_md2_context ctx; mbedtls_md2_init( &ctx ); if( ( ret = mbedtls_md2_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md2_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md2_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_md2_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] ) { mbedtls_md2_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * RFC 1319 test vectors */ static const unsigned char md2_test_str[7][81] = { { "" }, { "a" }, { "abc" }, { "message digest" }, { "abcdefghijklmnopqrstuvwxyz" }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, { "12345678901234567890123456789012345678901234567890123456789012" "345678901234567890" } }; static const size_t md2_test_strlen[7] = { 0, 1, 3, 14, 26, 62, 80 }; static const unsigned char md2_test_sum[7][16] = { { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D, 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 }, { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72, 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 }, { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B, 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB }, { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B, 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 }, { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB, 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B }, { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39, 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD }, { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D, 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 } }; /* * Checkup routine */ int mbedtls_md2_self_test( int verbose ) { int i, ret = 0; unsigned char md2sum[16]; for( i = 0; i < 7; i++ ) { if( verbose != 0 ) mbedtls_printf( " MD2 test #%d: ", i + 1 ); ret = mbedtls_md2_ret( md2_test_str[i], md2_test_strlen[i], md2sum ); if( ret != 0 ) goto fail; if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_MD2_C */ fldigi-4.2.05/src/mbedtls/x509_create.c0000664000175000017500000003127314611711171014406 00000000000000/* * X.509 base functions for creating certificates / CSRs * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CREATE_C) #include "mbedtls/x509.h" #include "mbedtls/asn1write.h" #include "mbedtls/oid.h" #include /* Structure linking OIDs for X.509 DN AttributeTypes to their * string representations and default string encodings used by Mbed TLS. */ typedef struct { const char *name; /* String representation of AttributeType, e.g. * "CN" or "emailAddress". */ size_t name_len; /* Length of 'name', without trailing 0 byte. */ const char *oid; /* String representation of OID of AttributeType, * as per RFC 5280, Appendix A.1. */ int default_tag; /* The default character encoding used for the * given attribute type, e.g. * MBEDTLS_ASN1_UTF8_STRING for UTF-8. */ } x509_attr_descriptor_t; #define ADD_STRLEN( s ) s, sizeof( s ) - 1 /* X.509 DN attributes from RFC 5280, Appendix A.1. */ static const x509_attr_descriptor_t x509_attrs[] = { { ADD_STRLEN( "CN" ), MBEDTLS_OID_AT_CN, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "commonName" ), MBEDTLS_OID_AT_CN, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "C" ), MBEDTLS_OID_AT_COUNTRY, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "countryName" ), MBEDTLS_OID_AT_COUNTRY, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "O" ), MBEDTLS_OID_AT_ORGANIZATION, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "organizationName" ), MBEDTLS_OID_AT_ORGANIZATION, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "L" ), MBEDTLS_OID_AT_LOCALITY, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "locality" ), MBEDTLS_OID_AT_LOCALITY, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "R" ), MBEDTLS_OID_PKCS9_EMAIL, MBEDTLS_ASN1_IA5_STRING }, { ADD_STRLEN( "OU" ), MBEDTLS_OID_AT_ORG_UNIT, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "organizationalUnitName" ), MBEDTLS_OID_AT_ORG_UNIT, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "ST" ), MBEDTLS_OID_AT_STATE, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "stateOrProvinceName" ), MBEDTLS_OID_AT_STATE, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "emailAddress" ), MBEDTLS_OID_PKCS9_EMAIL, MBEDTLS_ASN1_IA5_STRING }, { ADD_STRLEN( "serialNumber" ), MBEDTLS_OID_AT_SERIAL_NUMBER, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "postalAddress" ), MBEDTLS_OID_AT_POSTAL_ADDRESS, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "postalCode" ), MBEDTLS_OID_AT_POSTAL_CODE, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "dnQualifier" ), MBEDTLS_OID_AT_DN_QUALIFIER, MBEDTLS_ASN1_PRINTABLE_STRING }, { ADD_STRLEN( "title" ), MBEDTLS_OID_AT_TITLE, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "surName" ), MBEDTLS_OID_AT_SUR_NAME, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "SN" ), MBEDTLS_OID_AT_SUR_NAME, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "givenName" ), MBEDTLS_OID_AT_GIVEN_NAME, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "GN" ), MBEDTLS_OID_AT_GIVEN_NAME, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "initials" ), MBEDTLS_OID_AT_INITIALS, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "pseudonym" ), MBEDTLS_OID_AT_PSEUDONYM, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "generationQualifier" ), MBEDTLS_OID_AT_GENERATION_QUALIFIER, MBEDTLS_ASN1_UTF8_STRING }, { ADD_STRLEN( "domainComponent" ), MBEDTLS_OID_DOMAIN_COMPONENT, MBEDTLS_ASN1_IA5_STRING }, { ADD_STRLEN( "DC" ), MBEDTLS_OID_DOMAIN_COMPONENT, MBEDTLS_ASN1_IA5_STRING }, { NULL, 0, NULL, MBEDTLS_ASN1_NULL } }; static const x509_attr_descriptor_t *x509_attr_descr_from_name( const char *name, size_t name_len ) { const x509_attr_descriptor_t *cur; for( cur = x509_attrs; cur->name != NULL; cur++ ) if( cur->name_len == name_len && strncmp( cur->name, name, name_len ) == 0 ) break; if ( cur->name == NULL ) return( NULL ); return( cur ); } int mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name ) { int ret = 0; const char *s = name, *c = s; const char *end = s + strlen( s ); const char *oid = NULL; const x509_attr_descriptor_t* attr_descr = NULL; int in_tag = 1; char data[MBEDTLS_X509_MAX_DN_NAME_SIZE]; char *d = data; /* Clear existing chain if present */ mbedtls_asn1_free_named_data_list( head ); while( c <= end ) { if( in_tag && *c == '=' ) { if( ( attr_descr = x509_attr_descr_from_name( s, c - s ) ) == NULL ) { ret = MBEDTLS_ERR_X509_UNKNOWN_OID; goto exit; } oid = attr_descr->oid; s = c + 1; in_tag = 0; d = data; } if( !in_tag && *c == '\\' && c != end ) { c++; /* Check for valid escaped characters */ if( c == end || *c != ',' ) { ret = MBEDTLS_ERR_X509_INVALID_NAME; goto exit; } } else if( !in_tag && ( *c == ',' || c == end ) ) { mbedtls_asn1_named_data* cur = mbedtls_asn1_store_named_data( head, oid, strlen( oid ), (unsigned char *) data, d - data ); if(cur == NULL ) { return( MBEDTLS_ERR_X509_ALLOC_FAILED ); } // set tagType cur->val.tag = attr_descr->default_tag; while( c < end && *(c + 1) == ' ' ) c++; s = c + 1; in_tag = 1; } if( !in_tag && s != c + 1 ) { *(d++) = *c; if( d - data == MBEDTLS_X509_MAX_DN_NAME_SIZE ) { ret = MBEDTLS_ERR_X509_INVALID_NAME; goto exit; } } c++; } exit: return( ret ); } /* The first byte of the value in the mbedtls_asn1_named_data structure is reserved * to store the critical boolean for us */ int mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, int critical, const unsigned char *val, size_t val_len ) { mbedtls_asn1_named_data *cur; if( ( cur = mbedtls_asn1_store_named_data( head, oid, oid_len, NULL, val_len + 1 ) ) == NULL ) { return( MBEDTLS_ERR_X509_ALLOC_FAILED ); } cur->val.p[0] = critical; memcpy( cur->val.p + 1, val, val_len ); return( 0 ); } /* * RelativeDistinguishedName ::= * SET OF AttributeTypeAndValue * * AttributeTypeAndValue ::= SEQUENCE { * type AttributeType, * value AttributeValue } * * AttributeType ::= OBJECT IDENTIFIER * * AttributeValue ::= ANY DEFINED BY AttributeType */ static int x509_write_name( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data* cur_name) { int ret; size_t len = 0; const char *oid = (const char*)cur_name->oid.p; size_t oid_len = cur_name->oid.len; const unsigned char *name = cur_name->val.p; size_t name_len = cur_name->val.len; // Write correct string tag and value MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tagged_string( p, start, cur_name->val.tag, (const char *) name, name_len ) ); // Write OID // MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ); return( (int) len ); } int mbedtls_x509_write_names( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *first ) { int ret; size_t len = 0; mbedtls_asn1_named_data *cur = first; while( cur != NULL ) { MBEDTLS_ASN1_CHK_ADD( len, x509_write_name( p, start, cur ) ); cur = cur->next; } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } int mbedtls_x509_write_sig( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len, unsigned char *sig, size_t size ) { int ret; size_t len = 0; if( *p < start || (size_t)( *p - start ) < size ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); len = size; (*p) -= len; memcpy( *p, sig, len ); if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = 0; len += 1; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) ); // Write OID // MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( p, start, oid, oid_len, 0 ) ); return( (int) len ); } static int x509_write_extension( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *ext ) { int ret; size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, ext->val.p + 1, ext->val.len - 1 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, ext->val.len - 1 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OCTET_STRING ) ); if( ext->val.p[0] != 0 ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_bool( p, start, 1 ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, ext->oid.p, ext->oid.len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, ext->oid.len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OID ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } /* * Extension ::= SEQUENCE { * extnID OBJECT IDENTIFIER, * critical BOOLEAN DEFAULT FALSE, * extnValue OCTET STRING * -- contains the DER encoding of an ASN.1 value * -- corresponding to the extension type identified * -- by extnID * } */ int mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start, mbedtls_asn1_named_data *first ) { int ret; size_t len = 0; mbedtls_asn1_named_data *cur_ext = first; while( cur_ext != NULL ) { MBEDTLS_ASN1_CHK_ADD( len, x509_write_extension( p, start, cur_ext ) ); cur_ext = cur_ext->next; } return( (int) len ); } #endif /* MBEDTLS_X509_CREATE_C */ fldigi-4.2.05/src/mbedtls/x509.c0000664000175000017500000007033014611711171013060 00000000000000/* * X.509 common functions for parsing and verification * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ITU-T X.509 standard defines a certificate format for PKI. * * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) * * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_USE_C) #include "mbedtls/x509.h" #include "mbedtls/asn1.h" #include "mbedtls/oid.h" #include #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_free free #define mbedtls_calloc calloc #define mbedtls_printf printf #define mbedtls_snprintf snprintf #endif #if defined(MBEDTLS_HAVE_TIME) #include "mbedtls/platform_time.h" #endif #if defined(MBEDTLS_HAVE_TIME_DATE) #include "mbedtls/platform_util.h" #include #endif #define CHECK(code) if( ( ret = code ) != 0 ){ return( ret ); } #define CHECK_RANGE(min, max, val) if( val < min || val > max ){ return( ret ); } /* * CertificateSerialNumber ::= INTEGER */ int mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *serial ) { int ret; if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_SERIAL + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( **p != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_PRIMITIVE | 2 ) && **p != MBEDTLS_ASN1_INTEGER ) return( MBEDTLS_ERR_X509_INVALID_SERIAL + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); serial->tag = *(*p)++; if( ( ret = mbedtls_asn1_get_len( p, end, &serial->len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_SERIAL + ret ); serial->p = *p; *p += serial->len; return( 0 ); } /* Get an algorithm identifier without parameters (eg for signatures) * * AlgorithmIdentifier ::= SEQUENCE { * algorithm OBJECT IDENTIFIER, * parameters ANY DEFINED BY algorithm OPTIONAL } */ int mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *alg ) { int ret; if( ( ret = mbedtls_asn1_get_alg_null( p, end, alg ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); return( 0 ); } /* * Parse an algorithm identifier with (optional) paramaters */ int mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *alg, mbedtls_x509_buf *params ) { int ret; if( ( ret = mbedtls_asn1_get_alg( p, end, alg, params ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); return( 0 ); } #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) /* * HashAlgorithm ::= AlgorithmIdentifier * * AlgorithmIdentifier ::= SEQUENCE { * algorithm OBJECT IDENTIFIER, * parameters ANY DEFINED BY algorithm OPTIONAL } * * For HashAlgorithm, parameters MUST be NULL or absent. */ static int x509_get_hash_alg( const mbedtls_x509_buf *alg, mbedtls_md_type_t *md_alg ) { int ret; unsigned char *p; const unsigned char *end; mbedtls_x509_buf md_oid; size_t len; /* Make sure we got a SEQUENCE and setup bounds */ if( alg->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); p = (unsigned char *) alg->p; end = p + alg->len; if( p >= end ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); /* Parse md_oid */ md_oid.tag = *p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &md_oid.len, MBEDTLS_ASN1_OID ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); md_oid.p = p; p += md_oid.len; /* Get md_alg from md_oid */ if( ( ret = mbedtls_oid_get_md_alg( &md_oid, md_alg ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); /* Make sure params is absent of NULL */ if( p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_NULL ) ) != 0 || len != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * RSASSA-PSS-params ::= SEQUENCE { * hashAlgorithm [0] HashAlgorithm DEFAULT sha1Identifier, * maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1Identifier, * saltLength [2] INTEGER DEFAULT 20, * trailerField [3] INTEGER DEFAULT 1 } * -- Note that the tags in this Sequence are explicit. * * RFC 4055 (which defines use of RSASSA-PSS in PKIX) states that the value * of trailerField MUST be 1, and PKCS#1 v2.2 doesn't even define any other * option. Enfore this at parsing time. */ int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params, mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md, int *salt_len ) { int ret; unsigned char *p; const unsigned char *end, *end2; size_t len; mbedtls_x509_buf alg_id, alg_params; /* First set everything to defaults */ *md_alg = MBEDTLS_MD_SHA1; *mgf_md = MBEDTLS_MD_SHA1; *salt_len = 20; /* Make sure params is a SEQUENCE and setup bounds */ if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); p = (unsigned char *) params->p; end = p + params->len; if( p == end ) return( 0 ); /* * HashAlgorithm */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) == 0 ) { end2 = p + len; /* HashAlgorithm ::= AlgorithmIdentifier (without parameters) */ if( ( ret = mbedtls_x509_get_alg_null( &p, end2, &alg_id ) ) != 0 ) return( ret ); if( ( ret = mbedtls_oid_get_md_alg( &alg_id, md_alg ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end2 ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p == end ) return( 0 ); /* * MaskGenAlgorithm */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ) == 0 ) { end2 = p + len; /* MaskGenAlgorithm ::= AlgorithmIdentifier (params = HashAlgorithm) */ if( ( ret = mbedtls_x509_get_alg( &p, end2, &alg_id, &alg_params ) ) != 0 ) return( ret ); /* Only MFG1 is recognised for now */ if( MBEDTLS_OID_CMP( MBEDTLS_OID_MGF1, &alg_id ) != 0 ) return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE + MBEDTLS_ERR_OID_NOT_FOUND ); /* Parse HashAlgorithm */ if( ( ret = x509_get_hash_alg( &alg_params, mgf_md ) ) != 0 ) return( ret ); if( p != end2 ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p == end ) return( 0 ); /* * salt_len */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 2 ) ) == 0 ) { end2 = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end2, salt_len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end2 ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p == end ) return( 0 ); /* * trailer_field (if present, must be 1) */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 3 ) ) == 0 ) { int trailer_field; end2 = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end2, &trailer_field ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end2 ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); if( trailer_field != 1 ) return( MBEDTLS_ERR_X509_INVALID_ALG ); } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_X509_INVALID_ALG + ret ); if( p != end ) return( MBEDTLS_ERR_X509_INVALID_ALG + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ /* * AttributeTypeAndValue ::= SEQUENCE { * type AttributeType, * value AttributeValue } * * AttributeType ::= OBJECT IDENTIFIER * * AttributeValue ::= ANY DEFINED BY AttributeType */ static int x509_get_attr_type_value( unsigned char **p, const unsigned char *end, mbedtls_x509_name *cur ) { int ret; size_t len; mbedtls_x509_buf *oid; mbedtls_x509_buf *val; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_NAME + ret ); if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_NAME + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); oid = &cur->oid; oid->tag = **p; if( ( ret = mbedtls_asn1_get_tag( p, end, &oid->len, MBEDTLS_ASN1_OID ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_NAME + ret ); oid->p = *p; *p += oid->len; if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_NAME + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( **p != MBEDTLS_ASN1_BMP_STRING && **p != MBEDTLS_ASN1_UTF8_STRING && **p != MBEDTLS_ASN1_T61_STRING && **p != MBEDTLS_ASN1_PRINTABLE_STRING && **p != MBEDTLS_ASN1_IA5_STRING && **p != MBEDTLS_ASN1_UNIVERSAL_STRING && **p != MBEDTLS_ASN1_BIT_STRING ) return( MBEDTLS_ERR_X509_INVALID_NAME + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); val = &cur->val; val->tag = *(*p)++; if( ( ret = mbedtls_asn1_get_len( p, end, &val->len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_NAME + ret ); val->p = *p; *p += val->len; cur->next = NULL; return( 0 ); } /* * Name ::= CHOICE { -- only one possibility for now -- * rdnSequence RDNSequence } * * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName * * RelativeDistinguishedName ::= * SET OF AttributeTypeAndValue * * AttributeTypeAndValue ::= SEQUENCE { * type AttributeType, * value AttributeValue } * * AttributeType ::= OBJECT IDENTIFIER * * AttributeValue ::= ANY DEFINED BY AttributeType * * The data structure is optimized for the common case where each RDN has only * one element, which is represented as a list of AttributeTypeAndValue. * For the general case we still use a flat list, but we mark elements of the * same set so that they are "merged" together in the functions that consume * this list, eg mbedtls_x509_dn_gets(). */ int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, mbedtls_x509_name *cur ) { int ret; size_t set_len; const unsigned char *end_set; /* don't use recursion, we'd risk stack overflow if not optimized */ while( 1 ) { /* * parse SET */ if( ( ret = mbedtls_asn1_get_tag( p, end, &set_len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_NAME + ret ); end_set = *p + set_len; while( 1 ) { if( ( ret = x509_get_attr_type_value( p, end_set, cur ) ) != 0 ) return( ret ); if( *p == end_set ) break; /* Mark this item as being no the only one in a set */ cur->next_merged = 1; cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) ); if( cur->next == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); cur = cur->next; } /* * continue until end of SEQUENCE is reached */ if( *p == end ) return( 0 ); cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) ); if( cur->next == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); cur = cur->next; } } static int x509_parse_int( unsigned char **p, size_t n, int *res ) { *res = 0; for( ; n > 0; --n ) { if( ( **p < '0') || ( **p > '9' ) ) return ( MBEDTLS_ERR_X509_INVALID_DATE ); *res *= 10; *res += ( *(*p)++ - '0' ); } return( 0 ); } static int x509_date_is_valid(const mbedtls_x509_time *t ) { int ret = MBEDTLS_ERR_X509_INVALID_DATE; int month_len; CHECK_RANGE( 0, 9999, t->year ); CHECK_RANGE( 0, 23, t->hour ); CHECK_RANGE( 0, 59, t->min ); CHECK_RANGE( 0, 59, t->sec ); switch( t->mon ) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: month_len = 31; break; case 4: case 6: case 9: case 11: month_len = 30; break; case 2: if( ( !( t->year % 4 ) && t->year % 100 ) || !( t->year % 400 ) ) month_len = 29; else month_len = 28; break; default: return( ret ); } CHECK_RANGE( 1, month_len, t->day ); return( 0 ); } /* * Parse an ASN1_UTC_TIME (yearlen=2) or ASN1_GENERALIZED_TIME (yearlen=4) * field. */ static int x509_parse_time( unsigned char **p, size_t len, size_t yearlen, mbedtls_x509_time *tm ) { int ret; /* * Minimum length is 10 or 12 depending on yearlen */ if ( len < yearlen + 8 ) return ( MBEDTLS_ERR_X509_INVALID_DATE ); len -= yearlen + 8; /* * Parse year, month, day, hour, minute */ CHECK( x509_parse_int( p, yearlen, &tm->year ) ); if ( 2 == yearlen ) { if ( tm->year < 50 ) tm->year += 100; tm->year += 1900; } CHECK( x509_parse_int( p, 2, &tm->mon ) ); CHECK( x509_parse_int( p, 2, &tm->day ) ); CHECK( x509_parse_int( p, 2, &tm->hour ) ); CHECK( x509_parse_int( p, 2, &tm->min ) ); /* * Parse seconds if present */ if ( len >= 2 ) { CHECK( x509_parse_int( p, 2, &tm->sec ) ); len -= 2; } else return ( MBEDTLS_ERR_X509_INVALID_DATE ); /* * Parse trailing 'Z' if present */ if ( 1 == len && 'Z' == **p ) { (*p)++; len--; } /* * We should have parsed all characters at this point */ if ( 0 != len ) return ( MBEDTLS_ERR_X509_INVALID_DATE ); CHECK( x509_date_is_valid( tm ) ); return ( 0 ); } /* * Time ::= CHOICE { * utcTime UTCTime, * generalTime GeneralizedTime } */ int mbedtls_x509_get_time( unsigned char **p, const unsigned char *end, mbedtls_x509_time *tm ) { int ret; size_t len, year_len; unsigned char tag; if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); tag = **p; if( tag == MBEDTLS_ASN1_UTC_TIME ) year_len = 2; else if( tag == MBEDTLS_ASN1_GENERALIZED_TIME ) year_len = 4; else return( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); (*p)++; ret = mbedtls_asn1_get_len( p, end, &len ); if( ret != 0 ) return( MBEDTLS_ERR_X509_INVALID_DATE + ret ); return x509_parse_time( p, len, year_len, tm ); } int mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig ) { int ret; size_t len; int tag_type; if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_SIGNATURE + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); tag_type = **p; if( ( ret = mbedtls_asn1_get_bitstring_null( p, end, &len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_SIGNATURE + ret ); sig->tag = tag_type; sig->len = len; sig->p = *p; *p += len; return( 0 ); } /* * Get signature algorithm from alg OID and optional parameters */ int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params, mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg, void **sig_opts ) { int ret; if( *sig_opts != NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); if( ( ret = mbedtls_oid_get_sig_alg( sig_oid, md_alg, pk_alg ) ) != 0 ) return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + ret ); #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) if( *pk_alg == MBEDTLS_PK_RSASSA_PSS ) { mbedtls_pk_rsassa_pss_options *pss_opts; pss_opts = mbedtls_calloc( 1, sizeof( mbedtls_pk_rsassa_pss_options ) ); if( pss_opts == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); ret = mbedtls_x509_get_rsassa_pss_params( sig_params, md_alg, &pss_opts->mgf1_hash_id, &pss_opts->expected_salt_len ); if( ret != 0 ) { mbedtls_free( pss_opts ); return( ret ); } *sig_opts = (void *) pss_opts; } else #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ { /* Make sure parameters are absent or NULL */ if( ( sig_params->tag != MBEDTLS_ASN1_NULL && sig_params->tag != 0 ) || sig_params->len != 0 ) return( MBEDTLS_ERR_X509_INVALID_ALG ); } return( 0 ); } /* * X.509 Extensions (No parsing of extensions, pointer should * be either manually updated or extensions should be parsed!) */ int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *ext, int tag ) { int ret; size_t len; if( *p == end ) return( 0 ); ext->tag = **p; if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag ) ) != 0 ) return( ret ); ext->p = *p; end = *p + ext->len; /* * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension * * Extension ::= SEQUENCE { * extnID OBJECT IDENTIFIER, * critical BOOLEAN DEFAULT FALSE, * extnValue OCTET STRING } */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( end != *p + len ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * Store the name in printable form into buf; no more * than size characters will be written */ int mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn ) { int ret; size_t i, n; unsigned char c, merge = 0; const mbedtls_x509_name *name; const char *short_name = NULL; char s[MBEDTLS_X509_MAX_DN_NAME_SIZE], *p; memset( s, 0, sizeof( s ) ); name = dn; p = buf; n = size; while( name != NULL ) { if( !name->oid.p ) { name = name->next; continue; } if( name != dn ) { ret = mbedtls_snprintf( p, n, merge ? " + " : ", " ); MBEDTLS_X509_SAFE_SNPRINTF; } ret = mbedtls_oid_get_attr_short_name( &name->oid, &short_name ); if( ret == 0 ) ret = mbedtls_snprintf( p, n, "%s=", short_name ); else ret = mbedtls_snprintf( p, n, "\?\?=" ); MBEDTLS_X509_SAFE_SNPRINTF; for( i = 0; i < name->val.len; i++ ) { if( i >= sizeof( s ) - 1 ) break; c = name->val.p[i]; if( c < 32 || c == 127 || ( c > 128 && c < 160 ) ) s[i] = '?'; else s[i] = c; } s[i] = '\0'; ret = mbedtls_snprintf( p, n, "%s", s ); MBEDTLS_X509_SAFE_SNPRINTF; merge = name->next_merged; name = name->next; } return( (int) ( size - n ) ); } /* * Store the serial in printable form into buf; no more * than size characters will be written */ int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial ) { int ret; size_t i, n, nr; char *p; p = buf; n = size; nr = ( serial->len <= 32 ) ? serial->len : 28; for( i = 0; i < nr; i++ ) { if( i == 0 && nr > 1 && serial->p[i] == 0x0 ) continue; ret = mbedtls_snprintf( p, n, "%02X%s", serial->p[i], ( i < nr - 1 ) ? ":" : "" ); MBEDTLS_X509_SAFE_SNPRINTF; } if( nr != serial->len ) { ret = mbedtls_snprintf( p, n, "...." ); MBEDTLS_X509_SAFE_SNPRINTF; } return( (int) ( size - n ) ); } /* * Helper for writing signature algorithms */ int mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid, mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, const void *sig_opts ) { int ret; char *p = buf; size_t n = size; const char *desc = NULL; ret = mbedtls_oid_get_sig_alg_desc( sig_oid, &desc ); if( ret != 0 ) ret = mbedtls_snprintf( p, n, "???" ); else ret = mbedtls_snprintf( p, n, "%s", desc ); MBEDTLS_X509_SAFE_SNPRINTF; #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) if( pk_alg == MBEDTLS_PK_RSASSA_PSS ) { const mbedtls_pk_rsassa_pss_options *pss_opts; const mbedtls_md_info_t *md_info, *mgf_md_info; pss_opts = (const mbedtls_pk_rsassa_pss_options *) sig_opts; md_info = mbedtls_md_info_from_type( md_alg ); mgf_md_info = mbedtls_md_info_from_type( pss_opts->mgf1_hash_id ); ret = mbedtls_snprintf( p, n, " (%s, MGF1-%s, 0x%02X)", md_info ? mbedtls_md_get_name( md_info ) : "???", mgf_md_info ? mbedtls_md_get_name( mgf_md_info ) : "???", pss_opts->expected_salt_len ); MBEDTLS_X509_SAFE_SNPRINTF; } #else ((void) pk_alg); ((void) md_alg); ((void) sig_opts); #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ return( (int)( size - n ) ); } /* * Helper for writing "RSA key size", "EC key size", etc */ int mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name ) { char *p = buf; size_t n = buf_size; int ret; ret = mbedtls_snprintf( p, n, "%s key size", name ); MBEDTLS_X509_SAFE_SNPRINTF; return( 0 ); } #if defined(MBEDTLS_HAVE_TIME_DATE) /* * Set the time structure to the current time. * Return 0 on success, non-zero on failure. */ static int x509_get_current_time( mbedtls_x509_time *now ) { struct tm *lt, tm_buf; mbedtls_time_t tt; int ret = 0; tt = mbedtls_time( NULL ); lt = mbedtls_platform_gmtime_r( &tt, &tm_buf ); if( lt == NULL ) ret = -1; else { now->year = lt->tm_year + 1900; now->mon = lt->tm_mon + 1; now->day = lt->tm_mday; now->hour = lt->tm_hour; now->min = lt->tm_min; now->sec = lt->tm_sec; } return( ret ); } /* * Return 0 if before <= after, 1 otherwise */ static int x509_check_time( const mbedtls_x509_time *before, const mbedtls_x509_time *after ) { if( before->year > after->year ) return( 1 ); if( before->year == after->year && before->mon > after->mon ) return( 1 ); if( before->year == after->year && before->mon == after->mon && before->day > after->day ) return( 1 ); if( before->year == after->year && before->mon == after->mon && before->day == after->day && before->hour > after->hour ) return( 1 ); if( before->year == after->year && before->mon == after->mon && before->day == after->day && before->hour == after->hour && before->min > after->min ) return( 1 ); if( before->year == after->year && before->mon == after->mon && before->day == after->day && before->hour == after->hour && before->min == after->min && before->sec > after->sec ) return( 1 ); return( 0 ); } int mbedtls_x509_time_is_past( const mbedtls_x509_time *to ) { mbedtls_x509_time now; if( x509_get_current_time( &now ) != 0 ) return( 1 ); return( x509_check_time( &now, to ) ); } int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ) { mbedtls_x509_time now; if( x509_get_current_time( &now ) != 0 ) return( 1 ); return( x509_check_time( from, &now ) ); } #else /* MBEDTLS_HAVE_TIME_DATE */ int mbedtls_x509_time_is_past( const mbedtls_x509_time *to ) { ((void) to); return( 0 ); } int mbedtls_x509_time_is_future( const mbedtls_x509_time *from ) { ((void) from); return( 0 ); } #endif /* MBEDTLS_HAVE_TIME_DATE */ #if defined(MBEDTLS_SELF_TEST) #include "mbedtls/x509_crt.h" #include "mbedtls/certs.h" /* * Checkup routine */ int mbedtls_x509_self_test( int verbose ) { #if defined(MBEDTLS_CERTS_C) && defined(MBEDTLS_SHA256_C) int ret; uint32_t flags; mbedtls_x509_crt cacert; mbedtls_x509_crt clicert; if( verbose != 0 ) mbedtls_printf( " X.509 certificate load: " ); mbedtls_x509_crt_init( &clicert ); ret = mbedtls_x509_crt_parse( &clicert, (const unsigned char *) mbedtls_test_cli_crt, mbedtls_test_cli_crt_len ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } mbedtls_x509_crt_init( &cacert ); ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_ca_crt, mbedtls_test_ca_crt_len ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } if( verbose != 0 ) mbedtls_printf( "passed\n X.509 signature verify: "); ret = mbedtls_x509_crt_verify( &clicert, &cacert, NULL, NULL, &flags, NULL, NULL ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } if( verbose != 0 ) mbedtls_printf( "passed\n\n"); mbedtls_x509_crt_free( &cacert ); mbedtls_x509_crt_free( &clicert ); return( 0 ); #else ((void) verbose); return( 0 ); #endif /* MBEDTLS_CERTS_C && MBEDTLS_SHA1_C */ } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_X509_USE_C */ fldigi-4.2.05/src/mbedtls/ssl_cookie.c0000664000175000017500000001646414611711171014515 00000000000000/* * DTLS cookie callbacks implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * These session callbacks use a simple chained list * to store and retrieve the session information. */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_COOKIE_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/ssl_cookie.h" #include "mbedtls/ssl_internal.h" #include "mbedtls/platform_util.h" #include /* * If DTLS is in use, then at least one of SHA-1, SHA-256, SHA-512 is * available. Try SHA-256 first, 512 wastes resources since we need to stay * with max 32 bytes of cookie for DTLS 1.0 */ #if defined(MBEDTLS_SHA256_C) #define COOKIE_MD MBEDTLS_MD_SHA224 #define COOKIE_MD_OUTLEN 32 #define COOKIE_HMAC_LEN 28 #elif defined(MBEDTLS_SHA512_C) #define COOKIE_MD MBEDTLS_MD_SHA384 #define COOKIE_MD_OUTLEN 48 #define COOKIE_HMAC_LEN 28 #elif defined(MBEDTLS_SHA1_C) #define COOKIE_MD MBEDTLS_MD_SHA1 #define COOKIE_MD_OUTLEN 20 #define COOKIE_HMAC_LEN 20 #else #error "DTLS hello verify needs SHA-1 or SHA-2" #endif /* * Cookies are formed of a 4-bytes timestamp (or serial number) and * an HMAC of timestemp and client ID. */ #define COOKIE_LEN ( 4 + COOKIE_HMAC_LEN ) void mbedtls_ssl_cookie_init( mbedtls_ssl_cookie_ctx *ctx ) { mbedtls_md_init( &ctx->hmac_ctx ); #if !defined(MBEDTLS_HAVE_TIME) ctx->serial = 0; #endif ctx->timeout = MBEDTLS_SSL_COOKIE_TIMEOUT; #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } void mbedtls_ssl_cookie_set_timeout( mbedtls_ssl_cookie_ctx *ctx, unsigned long delay ) { ctx->timeout = delay; } void mbedtls_ssl_cookie_free( mbedtls_ssl_cookie_ctx *ctx ) { mbedtls_md_free( &ctx->hmac_ctx ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ssl_cookie_ctx ) ); } int mbedtls_ssl_cookie_setup( mbedtls_ssl_cookie_ctx *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char key[COOKIE_MD_OUTLEN]; if( ( ret = f_rng( p_rng, key, sizeof( key ) ) ) != 0 ) return( ret ); ret = mbedtls_md_setup( &ctx->hmac_ctx, mbedtls_md_info_from_type( COOKIE_MD ), 1 ); if( ret != 0 ) return( ret ); ret = mbedtls_md_hmac_starts( &ctx->hmac_ctx, key, sizeof( key ) ); if( ret != 0 ) return( ret ); mbedtls_platform_zeroize( key, sizeof( key ) ); return( 0 ); } /* * Generate the HMAC part of a cookie */ static int ssl_cookie_hmac( mbedtls_md_context_t *hmac_ctx, const unsigned char time[4], unsigned char **p, unsigned char *end, const unsigned char *cli_id, size_t cli_id_len ) { unsigned char hmac_out[COOKIE_MD_OUTLEN]; if( (size_t)( end - *p ) < COOKIE_HMAC_LEN ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); if( mbedtls_md_hmac_reset( hmac_ctx ) != 0 || mbedtls_md_hmac_update( hmac_ctx, time, 4 ) != 0 || mbedtls_md_hmac_update( hmac_ctx, cli_id, cli_id_len ) != 0 || mbedtls_md_hmac_finish( hmac_ctx, hmac_out ) != 0 ) { return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } memcpy( *p, hmac_out, COOKIE_HMAC_LEN ); *p += COOKIE_HMAC_LEN; return( 0 ); } /* * Generate cookie for DTLS ClientHello verification */ int mbedtls_ssl_cookie_write( void *p_ctx, unsigned char **p, unsigned char *end, const unsigned char *cli_id, size_t cli_id_len ) { int ret; mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx; unsigned long t; if( ctx == NULL || cli_id == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( (size_t)( end - *p ) < COOKIE_LEN ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); #if defined(MBEDTLS_HAVE_TIME) t = (unsigned long) mbedtls_time( NULL ); #else t = ctx->serial++; #endif (*p)[0] = (unsigned char)( t >> 24 ); (*p)[1] = (unsigned char)( t >> 16 ); (*p)[2] = (unsigned char)( t >> 8 ); (*p)[3] = (unsigned char)( t ); *p += 4; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + ret ); #endif ret = ssl_cookie_hmac( &ctx->hmac_ctx, *p - 4, p, end, cli_id, cli_id_len ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Check a cookie */ int mbedtls_ssl_cookie_check( void *p_ctx, const unsigned char *cookie, size_t cookie_len, const unsigned char *cli_id, size_t cli_id_len ) { unsigned char ref_hmac[COOKIE_HMAC_LEN]; int ret = 0; unsigned char *p = ref_hmac; mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx; unsigned long cur_time, cookie_time; if( ctx == NULL || cli_id == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( cookie_len != COOKIE_LEN ) return( -1 ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + ret ); #endif if( ssl_cookie_hmac( &ctx->hmac_ctx, cookie, &p, p + sizeof( ref_hmac ), cli_id, cli_id_len ) != 0 ) ret = -1; #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif if( ret != 0 ) return( ret ); if( mbedtls_ssl_safer_memcmp( cookie + 4, ref_hmac, sizeof( ref_hmac ) ) != 0 ) return( -1 ); #if defined(MBEDTLS_HAVE_TIME) cur_time = (unsigned long) mbedtls_time( NULL ); #else cur_time = ctx->serial; #endif cookie_time = ( (unsigned long) cookie[0] << 24 ) | ( (unsigned long) cookie[1] << 16 ) | ( (unsigned long) cookie[2] << 8 ) | ( (unsigned long) cookie[3] ); if( ctx->timeout != 0 && cur_time - cookie_time > ctx->timeout ) return( -1 ); return( 0 ); } #endif /* MBEDTLS_SSL_COOKIE_C */ fldigi-4.2.05/src/mbedtls/nist_kw.c0000664000175000017500000005767114611711171014046 00000000000000/* * Implementation of NIST SP 800-38F key wrapping, supporting KW and KWP modes * only * * Copyright (C) 2018, Arm Limited (or its affiliates), All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ /* * Definition of Key Wrapping: * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38F.pdf * RFC 3394 "Advanced Encryption Standard (AES) Key Wrap Algorithm" * RFC 5649 "Advanced Encryption Standard (AES) Key Wrap with Padding Algorithm" * * Note: RFC 3394 defines different methodology for intermediate operations for * the wrapping and unwrapping operation than the definition in NIST SP 800-38F. */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_NIST_KW_C) #include "mbedtls/nist_kw.h" #include "mbedtls/platform_util.h" #include #include #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #if !defined(MBEDTLS_NIST_KW_ALT) #define KW_SEMIBLOCK_LENGTH 8 #define MIN_SEMIBLOCKS_COUNT 3 /* constant-time buffer comparison */ static inline unsigned char mbedtls_nist_kw_safer_memcmp( const void *a, const void *b, size_t n ) { size_t i; volatile const unsigned char *A = (volatile const unsigned char *) a; volatile const unsigned char *B = (volatile const unsigned char *) b; volatile unsigned char diff = 0; for( i = 0; i < n; i++ ) { /* Read volatile data in order before computing diff. * This avoids IAR compiler warning: * 'the order of volatile accesses is undefined ..' */ unsigned char x = A[i], y = B[i]; diff |= x ^ y; } return( diff ); } /*! The 64-bit default integrity check value (ICV) for KW mode. */ static const unsigned char NIST_KW_ICV1[] = {0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6, 0xA6}; /*! The 32-bit default integrity check value (ICV) for KWP mode. */ static const unsigned char NIST_KW_ICV2[] = {0xA6, 0x59, 0x59, 0xA6}; #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ do { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } while( 0 ) #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ do { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } while( 0 ) #endif /* * Initialize context */ void mbedtls_nist_kw_init( mbedtls_nist_kw_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_nist_kw_context ) ); } int mbedtls_nist_kw_setkey( mbedtls_nist_kw_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits, const int is_wrap ) { int ret; const mbedtls_cipher_info_t *cipher_info; cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB ); if( cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( cipher_info->block_size != 16 ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); /* * SP 800-38F currently defines AES cipher as the only block cipher allowed: * "For KW and KWP, the underlying block cipher shall be approved, and the * block size shall be 128 bits. Currently, the AES block cipher, with key * lengths of 128, 192, or 256 bits, is the only block cipher that fits * this profile." * Currently we don't support other 128 bit block ciphers for key wrapping, * such as Camellia and Aria. */ if( cipher != MBEDTLS_CIPHER_ID_AES ) return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); mbedtls_cipher_free( &ctx->cipher_ctx ); if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits, is_wrap ? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT ) ) != 0 ) { return( ret ); } return( 0 ); } /* * Free context */ void mbedtls_nist_kw_free( mbedtls_nist_kw_context *ctx ) { mbedtls_cipher_free( &ctx->cipher_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_nist_kw_context ) ); } /* * Helper function for Xoring the uint64_t "t" with the encrypted A. * Defined in NIST SP 800-38F section 6.1 */ static void calc_a_xor_t( unsigned char A[KW_SEMIBLOCK_LENGTH], uint64_t t ) { size_t i = 0; for( i = 0; i < sizeof( t ); i++ ) { A[i] ^= ( t >> ( ( sizeof( t ) - 1 - i ) * 8 ) ) & 0xff; } } /* * KW-AE as defined in SP 800-38F section 6.2 * KWP-AE as defined in SP 800-38F section 6.3 */ int mbedtls_nist_kw_wrap( mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, const unsigned char *input, size_t in_len, unsigned char *output, size_t *out_len, size_t out_size ) { int ret = 0; size_t semiblocks = 0; size_t s; size_t olen, padlen = 0; uint64_t t = 0; unsigned char outbuff[KW_SEMIBLOCK_LENGTH * 2]; unsigned char inbuff[KW_SEMIBLOCK_LENGTH * 2]; unsigned char *R2 = output + KW_SEMIBLOCK_LENGTH; unsigned char *A = output; *out_len = 0; /* * Generate the String to work on */ if( mode == MBEDTLS_KW_MODE_KW ) { if( out_size < in_len + KW_SEMIBLOCK_LENGTH ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } /* * According to SP 800-38F Table 1, the plaintext length for KW * must be between 2 to 2^54-1 semiblocks inclusive. */ if( in_len < 16 || #if SIZE_MAX > 0x1FFFFFFFFFFFFF8 in_len > 0x1FFFFFFFFFFFFF8 || #endif in_len % KW_SEMIBLOCK_LENGTH != 0 ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } memcpy( output, NIST_KW_ICV1, KW_SEMIBLOCK_LENGTH ); memmove( output + KW_SEMIBLOCK_LENGTH, input, in_len ); } else { if( in_len % 8 != 0 ) { padlen = ( 8 - ( in_len % 8 ) ); } if( out_size < in_len + KW_SEMIBLOCK_LENGTH + padlen ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } /* * According to SP 800-38F Table 1, the plaintext length for KWP * must be between 1 and 2^32-1 octets inclusive. */ if( in_len < 1 #if SIZE_MAX > 0xFFFFFFFF || in_len > 0xFFFFFFFF #endif ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } memcpy( output, NIST_KW_ICV2, KW_SEMIBLOCK_LENGTH / 2 ); PUT_UINT32_BE( ( in_len & 0xffffffff ), output, KW_SEMIBLOCK_LENGTH / 2 ); memcpy( output + KW_SEMIBLOCK_LENGTH, input, in_len ); memset( output + KW_SEMIBLOCK_LENGTH + in_len, 0, padlen ); } semiblocks = ( ( in_len + padlen ) / KW_SEMIBLOCK_LENGTH ) + 1; s = 6 * ( semiblocks - 1 ); if( mode == MBEDTLS_KW_MODE_KWP && in_len <= KW_SEMIBLOCK_LENGTH ) { memcpy( inbuff, output, 16 ); ret = mbedtls_cipher_update( &ctx->cipher_ctx, inbuff, 16, output, &olen ); if( ret != 0 ) goto cleanup; } else { /* * Do the wrapping function W, as defined in RFC 3394 section 2.2.1 */ if( semiblocks < MIN_SEMIBLOCKS_COUNT ) { ret = MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA; goto cleanup; } /* Calculate intermediate values */ for( t = 1; t <= s; t++ ) { memcpy( inbuff, A, KW_SEMIBLOCK_LENGTH ); memcpy( inbuff + KW_SEMIBLOCK_LENGTH, R2, KW_SEMIBLOCK_LENGTH ); ret = mbedtls_cipher_update( &ctx->cipher_ctx, inbuff, 16, outbuff, &olen ); if( ret != 0 ) goto cleanup; memcpy( A, outbuff, KW_SEMIBLOCK_LENGTH ); calc_a_xor_t( A, t ); memcpy( R2, outbuff + KW_SEMIBLOCK_LENGTH, KW_SEMIBLOCK_LENGTH ); R2 += KW_SEMIBLOCK_LENGTH; if( R2 >= output + ( semiblocks * KW_SEMIBLOCK_LENGTH ) ) R2 = output + KW_SEMIBLOCK_LENGTH; } } *out_len = semiblocks * KW_SEMIBLOCK_LENGTH; cleanup: if( ret != 0) { memset( output, 0, semiblocks * KW_SEMIBLOCK_LENGTH ); } mbedtls_platform_zeroize( inbuff, KW_SEMIBLOCK_LENGTH * 2 ); mbedtls_platform_zeroize( outbuff, KW_SEMIBLOCK_LENGTH * 2 ); return( ret ); } /* * W-1 function as defined in RFC 3394 section 2.2.2 * This function assumes the following: * 1. Output buffer is at least of size ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH. * 2. The input buffer is of size semiblocks * KW_SEMIBLOCK_LENGTH. * 3. Minimal number of semiblocks is 3. * 4. A is a buffer to hold the first semiblock of the input buffer. */ static int unwrap( mbedtls_nist_kw_context *ctx, const unsigned char *input, size_t semiblocks, unsigned char A[KW_SEMIBLOCK_LENGTH], unsigned char *output, size_t* out_len ) { int ret = 0; const size_t s = 6 * ( semiblocks - 1 ); size_t olen; uint64_t t = 0; unsigned char outbuff[KW_SEMIBLOCK_LENGTH * 2]; unsigned char inbuff[KW_SEMIBLOCK_LENGTH * 2]; unsigned char *R = output + ( semiblocks - 2 ) * KW_SEMIBLOCK_LENGTH; *out_len = 0; if( semiblocks < MIN_SEMIBLOCKS_COUNT ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } memcpy( A, input, KW_SEMIBLOCK_LENGTH ); memmove( output, input + KW_SEMIBLOCK_LENGTH, ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH ); /* Calculate intermediate values */ for( t = s; t >= 1; t-- ) { calc_a_xor_t( A, t ); memcpy( inbuff, A, KW_SEMIBLOCK_LENGTH ); memcpy( inbuff + KW_SEMIBLOCK_LENGTH, R, KW_SEMIBLOCK_LENGTH ); ret = mbedtls_cipher_update( &ctx->cipher_ctx, inbuff, 16, outbuff, &olen ); if( ret != 0 ) goto cleanup; memcpy( A, outbuff, KW_SEMIBLOCK_LENGTH ); /* Set R as LSB64 of outbuff */ memcpy( R, outbuff + KW_SEMIBLOCK_LENGTH, KW_SEMIBLOCK_LENGTH ); if( R == output ) R = output + ( semiblocks - 2 ) * KW_SEMIBLOCK_LENGTH; else R -= KW_SEMIBLOCK_LENGTH; } *out_len = ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH; cleanup: if( ret != 0) memset( output, 0, ( semiblocks - 1 ) * KW_SEMIBLOCK_LENGTH ); mbedtls_platform_zeroize( inbuff, sizeof( inbuff ) ); mbedtls_platform_zeroize( outbuff, sizeof( outbuff ) ); return( ret ); } /* * KW-AD as defined in SP 800-38F section 6.2 * KWP-AD as defined in SP 800-38F section 6.3 */ int mbedtls_nist_kw_unwrap( mbedtls_nist_kw_context *ctx, mbedtls_nist_kw_mode_t mode, const unsigned char *input, size_t in_len, unsigned char *output, size_t *out_len, size_t out_size ) { int ret = 0; size_t i, olen; unsigned char A[KW_SEMIBLOCK_LENGTH]; unsigned char diff, bad_padding = 0; *out_len = 0; if( out_size < in_len - KW_SEMIBLOCK_LENGTH ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } if( mode == MBEDTLS_KW_MODE_KW ) { /* * According to SP 800-38F Table 1, the ciphertext length for KW * must be between 3 to 2^54 semiblocks inclusive. */ if( in_len < 24 || #if SIZE_MAX > 0x200000000000000 in_len > 0x200000000000000 || #endif in_len % KW_SEMIBLOCK_LENGTH != 0 ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } ret = unwrap( ctx, input, in_len / KW_SEMIBLOCK_LENGTH, A, output, out_len ); if( ret != 0 ) goto cleanup; /* Check ICV in "constant-time" */ diff = mbedtls_nist_kw_safer_memcmp( NIST_KW_ICV1, A, KW_SEMIBLOCK_LENGTH ); if( diff != 0 ) { ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; goto cleanup; } } else if( mode == MBEDTLS_KW_MODE_KWP ) { size_t padlen = 0; uint32_t Plen; /* * According to SP 800-38F Table 1, the ciphertext length for KWP * must be between 2 to 2^29 semiblocks inclusive. */ if( in_len < KW_SEMIBLOCK_LENGTH * 2 || #if SIZE_MAX > 0x100000000 in_len > 0x100000000 || #endif in_len % KW_SEMIBLOCK_LENGTH != 0 ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } if( in_len == KW_SEMIBLOCK_LENGTH * 2 ) { unsigned char outbuff[KW_SEMIBLOCK_LENGTH * 2]; ret = mbedtls_cipher_update( &ctx->cipher_ctx, input, 16, outbuff, &olen ); if( ret != 0 ) goto cleanup; memcpy( A, outbuff, KW_SEMIBLOCK_LENGTH ); memcpy( output, outbuff + KW_SEMIBLOCK_LENGTH, KW_SEMIBLOCK_LENGTH ); mbedtls_platform_zeroize( outbuff, sizeof( outbuff ) ); *out_len = KW_SEMIBLOCK_LENGTH; } else { /* in_len >= KW_SEMIBLOCK_LENGTH * 3 */ ret = unwrap( ctx, input, in_len / KW_SEMIBLOCK_LENGTH, A, output, out_len ); if( ret != 0 ) goto cleanup; } /* Check ICV in "constant-time" */ diff = mbedtls_nist_kw_safer_memcmp( NIST_KW_ICV2, A, KW_SEMIBLOCK_LENGTH / 2 ); if( diff != 0 ) { ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; } GET_UINT32_BE( Plen, A, KW_SEMIBLOCK_LENGTH / 2 ); /* * Plen is the length of the plaintext, when the input is valid. * If Plen is larger than the plaintext and padding, padlen will be * larger than 8, because of the type wrap around. */ padlen = in_len - KW_SEMIBLOCK_LENGTH - Plen; if ( padlen > 7 ) { padlen &= 7; ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; } /* Check padding in "constant-time" */ for( diff = 0, i = 0; i < KW_SEMIBLOCK_LENGTH; i++ ) { if( i >= KW_SEMIBLOCK_LENGTH - padlen ) diff |= output[*out_len - KW_SEMIBLOCK_LENGTH + i]; else bad_padding |= output[*out_len - KW_SEMIBLOCK_LENGTH + i]; } if( diff != 0 ) { ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; } if( ret != 0 ) { goto cleanup; } memset( output + Plen, 0, padlen ); *out_len = Plen; } else { ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; goto cleanup; } cleanup: if( ret != 0 ) { memset( output, 0, *out_len ); *out_len = 0; } mbedtls_platform_zeroize( &bad_padding, sizeof( bad_padding) ); mbedtls_platform_zeroize( &diff, sizeof( diff ) ); mbedtls_platform_zeroize( A, sizeof( A ) ); return( ret ); } #endif /* !MBEDTLS_NIST_KW_ALT */ #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) #define KW_TESTS 3 /* * Test vectors taken from NIST * https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/CAVP-TESTING-BLOCK-CIPHER-MODES#KW */ static const unsigned int key_len[KW_TESTS] = { 16, 24, 32 }; static const unsigned char kw_key[KW_TESTS][32] = { { 0x75, 0x75, 0xda, 0x3a, 0x93, 0x60, 0x7c, 0xc2, 0xbf, 0xd8, 0xce, 0xc7, 0xaa, 0xdf, 0xd9, 0xa6 }, { 0x2d, 0x85, 0x26, 0x08, 0x1d, 0x02, 0xfb, 0x5b, 0x85, 0xf6, 0x9a, 0xc2, 0x86, 0xec, 0xd5, 0x7d, 0x40, 0xdf, 0x5d, 0xf3, 0x49, 0x47, 0x44, 0xd3 }, { 0x11, 0x2a, 0xd4, 0x1b, 0x48, 0x56, 0xc7, 0x25, 0x4a, 0x98, 0x48, 0xd3, 0x0f, 0xdd, 0x78, 0x33, 0x5b, 0x03, 0x9a, 0x48, 0xa8, 0x96, 0x2c, 0x4d, 0x1c, 0xb7, 0x8e, 0xab, 0xd5, 0xda, 0xd7, 0x88 } }; static const unsigned char kw_msg[KW_TESTS][40] = { { 0x42, 0x13, 0x6d, 0x3c, 0x38, 0x4a, 0x3e, 0xea, 0xc9, 0x5a, 0x06, 0x6f, 0xd2, 0x8f, 0xed, 0x3f }, { 0x95, 0xc1, 0x1b, 0xf5, 0x35, 0x3a, 0xfe, 0xdb, 0x98, 0xfd, 0xd6, 0xc8, 0xca, 0x6f, 0xdb, 0x6d, 0xa5, 0x4b, 0x74, 0xb4, 0x99, 0x0f, 0xdc, 0x45, 0xc0, 0x9d, 0x15, 0x8f, 0x51, 0xce, 0x62, 0x9d, 0xe2, 0xaf, 0x26, 0xe3, 0x25, 0x0e, 0x6b, 0x4c }, { 0x1b, 0x20, 0xbf, 0x19, 0x90, 0xb0, 0x65, 0xd7, 0x98, 0xe1, 0xb3, 0x22, 0x64, 0xad, 0x50, 0xa8, 0x74, 0x74, 0x92, 0xba, 0x09, 0xa0, 0x4d, 0xd1 } }; static const size_t kw_msg_len[KW_TESTS] = { 16, 40, 24 }; static const size_t kw_out_len[KW_TESTS] = { 24, 48, 32 }; static const unsigned char kw_res[KW_TESTS][48] = { { 0x03, 0x1f, 0x6b, 0xd7, 0xe6, 0x1e, 0x64, 0x3d, 0xf6, 0x85, 0x94, 0x81, 0x6f, 0x64, 0xca, 0xa3, 0xf5, 0x6f, 0xab, 0xea, 0x25, 0x48, 0xf5, 0xfb }, { 0x44, 0x3c, 0x6f, 0x15, 0x09, 0x83, 0x71, 0x91, 0x3e, 0x5c, 0x81, 0x4c, 0xa1, 0xa0, 0x42, 0xec, 0x68, 0x2f, 0x7b, 0x13, 0x6d, 0x24, 0x3a, 0x4d, 0x6c, 0x42, 0x6f, 0xc6, 0x97, 0x15, 0x63, 0xe8, 0xa1, 0x4a, 0x55, 0x8e, 0x09, 0x64, 0x16, 0x19, 0xbf, 0x03, 0xfc, 0xaf, 0x90, 0xb1, 0xfc, 0x2d }, { 0xba, 0x8a, 0x25, 0x9a, 0x47, 0x1b, 0x78, 0x7d, 0xd5, 0xd5, 0x40, 0xec, 0x25, 0xd4, 0x3d, 0x87, 0x20, 0x0f, 0xda, 0xdc, 0x6d, 0x1f, 0x05, 0xd9, 0x16, 0x58, 0x4f, 0xa9, 0xf6, 0xcb, 0xf5, 0x12 } }; static const unsigned char kwp_key[KW_TESTS][32] = { { 0x78, 0x65, 0xe2, 0x0f, 0x3c, 0x21, 0x65, 0x9a, 0xb4, 0x69, 0x0b, 0x62, 0x9c, 0xdf, 0x3c, 0xc4 }, { 0xf5, 0xf8, 0x96, 0xa3, 0xbd, 0x2f, 0x4a, 0x98, 0x23, 0xef, 0x16, 0x2b, 0x00, 0xb8, 0x05, 0xd7, 0xde, 0x1e, 0xa4, 0x66, 0x26, 0x96, 0xa2, 0x58 }, { 0x95, 0xda, 0x27, 0x00, 0xca, 0x6f, 0xd9, 0xa5, 0x25, 0x54, 0xee, 0x2a, 0x8d, 0xf1, 0x38, 0x6f, 0x5b, 0x94, 0xa1, 0xa6, 0x0e, 0xd8, 0xa4, 0xae, 0xf6, 0x0a, 0x8d, 0x61, 0xab, 0x5f, 0x22, 0x5a } }; static const unsigned char kwp_msg[KW_TESTS][31] = { { 0xbd, 0x68, 0x43, 0xd4, 0x20, 0x37, 0x8d, 0xc8, 0x96 }, { 0x6c, 0xcd, 0xd5, 0x85, 0x18, 0x40, 0x97, 0xeb, 0xd5, 0xc3, 0xaf, 0x3e, 0x47, 0xd0, 0x2c, 0x19, 0x14, 0x7b, 0x4d, 0x99, 0x5f, 0x96, 0x43, 0x66, 0x91, 0x56, 0x75, 0x8c, 0x13, 0x16, 0x8f }, { 0xd1 } }; static const size_t kwp_msg_len[KW_TESTS] = { 9, 31, 1 }; static const unsigned char kwp_res[KW_TESTS][48] = { { 0x41, 0xec, 0xa9, 0x56, 0xd4, 0xaa, 0x04, 0x7e, 0xb5, 0xcf, 0x4e, 0xfe, 0x65, 0x96, 0x61, 0xe7, 0x4d, 0xb6, 0xf8, 0xc5, 0x64, 0xe2, 0x35, 0x00 }, { 0x4e, 0x9b, 0xc2, 0xbc, 0xbc, 0x6c, 0x1e, 0x13, 0xd3, 0x35, 0xbc, 0xc0, 0xf7, 0x73, 0x6a, 0x88, 0xfa, 0x87, 0x53, 0x66, 0x15, 0xbb, 0x8e, 0x63, 0x8b, 0xcc, 0x81, 0x66, 0x84, 0x68, 0x17, 0x90, 0x67, 0xcf, 0xa9, 0x8a, 0x9d, 0x0e, 0x33, 0x26 }, { 0x06, 0xba, 0x7a, 0xe6, 0xf3, 0x24, 0x8c, 0xfd, 0xcf, 0x26, 0x75, 0x07, 0xfa, 0x00, 0x1b, 0xc4 } }; static const size_t kwp_out_len[KW_TESTS] = { 24, 40, 16 }; int mbedtls_nist_kw_self_test( int verbose ) { mbedtls_nist_kw_context ctx; unsigned char out[48]; size_t olen; int i; int ret = 0; mbedtls_nist_kw_init( &ctx ); for( i = 0; i < KW_TESTS; i++ ) { if( verbose != 0 ) mbedtls_printf( " KW-AES-%u ", (unsigned int) key_len[i] * 8 ); ret = mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, kw_key[i], key_len[i] * 8, 1 ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( " KW: setup failed " ); goto end; } ret = mbedtls_nist_kw_wrap( &ctx, MBEDTLS_KW_MODE_KW, kw_msg[i], kw_msg_len[i], out, &olen, sizeof( out ) ); if( ret != 0 || kw_out_len[i] != olen || memcmp( out, kw_res[i], kw_out_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed. "); ret = 1; goto end; } if( ( ret = mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, kw_key[i], key_len[i] * 8, 0 ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( " KW: setup failed "); goto end; } ret = mbedtls_nist_kw_unwrap( &ctx, MBEDTLS_KW_MODE_KW, out, olen, out, &olen, sizeof( out ) ); if( ret != 0 || olen != kw_msg_len[i] || memcmp( out, kw_msg[i], kw_msg_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto end; } if( verbose != 0 ) mbedtls_printf( " passed\n" ); } for( i = 0; i < KW_TESTS; i++ ) { olen = sizeof( out ); if( verbose != 0 ) mbedtls_printf( " KWP-AES-%u ", (unsigned int) key_len[i] * 8 ); ret = mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, kwp_key[i], key_len[i] * 8, 1 ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( " KWP: setup failed " ); goto end; } ret = mbedtls_nist_kw_wrap( &ctx, MBEDTLS_KW_MODE_KWP, kwp_msg[i], kwp_msg_len[i], out, &olen, sizeof( out ) ); if( ret != 0 || kwp_out_len[i] != olen || memcmp( out, kwp_res[i], kwp_out_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed. "); ret = 1; goto end; } if( ( ret = mbedtls_nist_kw_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, kwp_key[i], key_len[i] * 8, 0 ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( " KWP: setup failed "); goto end; } ret = mbedtls_nist_kw_unwrap( &ctx, MBEDTLS_KW_MODE_KWP, out, olen, out, &olen, sizeof( out ) ); if( ret != 0 || olen != kwp_msg_len[i] || memcmp( out, kwp_msg[i], kwp_msg_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed. "); ret = 1; goto end; } if( verbose != 0 ) mbedtls_printf( " passed\n" ); } end: mbedtls_nist_kw_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #endif /* MBEDTLS_NIST_KW_C */ fldigi-4.2.05/src/mbedtls/platform_util.c0000664000175000017500000001204714611711171015235 00000000000000/* * Common and shared functions used by multiple modules in the Mbed TLS * library. * * Copyright (C) 2018, Arm Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of Mbed TLS (https://tls.mbed.org) */ /* * Ensure gmtime_r is available even with -std=c99; must be defined before * config.h, which pulls in glibc's features.h. Harmless on other platforms. */ #if !defined(_POSIX_C_SOURCE) #define _POSIX_C_SOURCE 200112L #endif #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "mbedtls/platform_util.h" #include "mbedtls/platform.h" #include "mbedtls/threading.h" #include #include #if !defined(MBEDTLS_PLATFORM_ZEROIZE_ALT) /* * This implementation should never be optimized out by the compiler * * This implementation for mbedtls_platform_zeroize() was inspired from Colin * Percival's blog article at: * * http://www.daemonology.net/blog/2014-09-04-how-to-zero-a-buffer.html * * It uses a volatile function pointer to the standard memset(). Because the * pointer is volatile the compiler expects it to change at * any time and will not optimize out the call that could potentially perform * other operations on the input buffer instead of just setting it to 0. * Nevertheless, as pointed out by davidtgoldblatt on Hacker News * (refer to http://www.daemonology.net/blog/2014-09-05-erratum.html for * details), optimizations of the following form are still possible: * * if( memset_func != memset ) * memset_func( buf, 0, len ); * * Note that it is extremely difficult to guarantee that * mbedtls_platform_zeroize() will not be optimized out by aggressive compilers * in a portable way. For this reason, Mbed TLS also provides the configuration * option MBEDTLS_PLATFORM_ZEROIZE_ALT, which allows users to configure * mbedtls_platform_zeroize() to use a suitable implementation for their * platform and needs. */ static void * (* const volatile memset_func)( void *, int, size_t ) = memset; void mbedtls_platform_zeroize( void *buf, size_t len ) { memset_func( buf, 0, len ); } #endif /* MBEDTLS_PLATFORM_ZEROIZE_ALT */ #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) #include #if !defined(_WIN32) && (defined(unix) || \ defined(__unix) || defined(__unix__) || (defined(__APPLE__) && \ defined(__MACH__))) #include #endif /* !_WIN32 && (unix || __unix || __unix__ || * (__APPLE__ && __MACH__)) */ #if !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) /* * This is a convenience shorthand macro to avoid checking the long * preprocessor conditions above. Ideally, we could expose this macro in * platform_util.h and simply use it in platform_util.c, threading.c and * threading.h. However, this macro is not part of the Mbed TLS public API, so * we keep it private by only defining it in this file */ #if ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) #define PLATFORM_UTIL_USE_GMTIME #endif /* ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) */ #endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) */ struct tm *mbedtls_platform_gmtime_r( const mbedtls_time_t *tt, struct tm *tm_buf ) { #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) return( ( gmtime_s( tm_buf, tt ) == 0 ) ? tm_buf : NULL ); #elif !defined(PLATFORM_UTIL_USE_GMTIME) return( gmtime_r( tt, tm_buf ) ); #else struct tm *lt; #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_lock( &mbedtls_threading_gmtime_mutex ) != 0 ) return( NULL ); #endif /* MBEDTLS_THREADING_C */ lt = gmtime( tt ); if( lt != NULL ) { memcpy( tm_buf, lt, sizeof( struct tm ) ); } #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &mbedtls_threading_gmtime_mutex ) != 0 ) return( NULL ); #endif /* MBEDTLS_THREADING_C */ return( ( lt == NULL ) ? NULL : tm_buf ); #endif /* _WIN32 && !EFIX64 && !EFI32 */ } #endif /* MBEDTLS_HAVE_TIME_DATE && MBEDTLS_PLATFORM_GMTIME_R_ALT */ fldigi-4.2.05/src/mbedtls/asn1write.c0000664000175000017500000002656114611711171014277 00000000000000/* * ASN.1 buffer writing functionality * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ASN1_WRITE_C) #include "mbedtls/asn1write.h" #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len ) { if( len < 0x80 ) { if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = (unsigned char) len; return( 1 ); } if( len <= 0xFF ) { if( *p - start < 2 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = (unsigned char) len; *--(*p) = 0x81; return( 2 ); } if( len <= 0xFFFF ) { if( *p - start < 3 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = ( len ) & 0xFF; *--(*p) = ( len >> 8 ) & 0xFF; *--(*p) = 0x82; return( 3 ); } if( len <= 0xFFFFFF ) { if( *p - start < 4 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = ( len ) & 0xFF; *--(*p) = ( len >> 8 ) & 0xFF; *--(*p) = ( len >> 16 ) & 0xFF; *--(*p) = 0x83; return( 4 ); } #if SIZE_MAX > 0xFFFFFFFF if( len <= 0xFFFFFFFF ) #endif { if( *p - start < 5 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = ( len ) & 0xFF; *--(*p) = ( len >> 8 ) & 0xFF; *--(*p) = ( len >> 16 ) & 0xFF; *--(*p) = ( len >> 24 ) & 0xFF; *--(*p) = 0x84; return( 5 ); } #if SIZE_MAX > 0xFFFFFFFF return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); #endif } int mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag ) { if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = tag; return( 1 ); } int mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t size ) { size_t len = 0; if( *p < start || (size_t)( *p - start ) < size ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); len = size; (*p) -= len; memcpy( *p, buf, len ); return( (int) len ); } #if defined(MBEDTLS_BIGNUM_C) int mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X ) { int ret; size_t len = 0; // Write the MPI // len = mbedtls_mpi_size( X ); if( *p < start || (size_t)( *p - start ) < len ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); (*p) -= len; MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( X, *p, len ) ); // DER format assumes 2s complement for numbers, so the leftmost bit // should be 0 for positive numbers and 1 for negative numbers. // if( X->s ==1 && **p & 0x80 ) { if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = 0x00; len += 1; } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) ); ret = (int) len; cleanup: return( ret ); } #endif /* MBEDTLS_BIGNUM_C */ int mbedtls_asn1_write_null( unsigned char **p, unsigned char *start ) { int ret; size_t len = 0; // Write NULL // MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, 0) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_NULL ) ); return( (int) len ); } int mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len ) { int ret; size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, (const unsigned char *) oid, oid_len ) ); MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OID ) ); return( (int) len ); } int mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start, const char *oid, size_t oid_len, size_t par_len ) { int ret; size_t len = 0; if( par_len == 0 ) MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_null( p, start ) ); else len += par_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } int mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean ) { int ret; size_t len = 0; if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = (boolean) ? 255 : 0; len++; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BOOLEAN ) ); return( (int) len ); } int mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val ) { int ret; size_t len = 0; if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); len += 1; *--(*p) = val; if( val > 0 && **p & 0x80 ) { if( *p - start < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--(*p) = 0x00; len += 1; } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) ); return( (int) len ); } int mbedtls_asn1_write_tagged_string( unsigned char **p, unsigned char *start, int tag, const char *text, size_t text_len ) { int ret; size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, (const unsigned char *) text, text_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, tag ) ); return( (int) len ); } int mbedtls_asn1_write_utf8_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ) { return( mbedtls_asn1_write_tagged_string(p, start, MBEDTLS_ASN1_UTF8_STRING, text, text_len) ); } int mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ) { return( mbedtls_asn1_write_tagged_string(p, start, MBEDTLS_ASN1_PRINTABLE_STRING, text, text_len) ); } int mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start, const char *text, size_t text_len ) { return( mbedtls_asn1_write_tagged_string(p, start, MBEDTLS_ASN1_IA5_STRING, text, text_len) ); } int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t bits ) { int ret; size_t len = 0, size; size = ( bits / 8 ) + ( ( bits % 8 ) ? 1 : 0 ); // Calculate byte length // if( *p < start || (size_t)( *p - start ) < size + 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); len = size + 1; (*p) -= size; memcpy( *p, buf, size ); // Write unused bits // *--(*p) = (unsigned char) (size * 8 - bits); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) ); return( (int) len ); } int mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start, const unsigned char *buf, size_t size ) { int ret; size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, buf, size ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OCTET_STRING ) ); return( (int) len ); } /* This is a copy of the ASN.1 parsing function mbedtls_asn1_find_named_data(), * which is replicated to avoid a dependency ASN1_WRITE_C on ASN1_PARSE_C. */ static mbedtls_asn1_named_data *asn1_find_named_data( mbedtls_asn1_named_data *list, const char *oid, size_t len ) { while( list != NULL ) { if( list->oid.len == len && memcmp( list->oid.p, oid, len ) == 0 ) { break; } list = list->next; } return( list ); } mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, const unsigned char *val, size_t val_len ) { mbedtls_asn1_named_data *cur; if( ( cur = asn1_find_named_data( *head, oid, oid_len ) ) == NULL ) { // Add new entry if not present yet based on OID // cur = (mbedtls_asn1_named_data*)mbedtls_calloc( 1, sizeof(mbedtls_asn1_named_data) ); if( cur == NULL ) return( NULL ); cur->oid.len = oid_len; cur->oid.p = mbedtls_calloc( 1, oid_len ); if( cur->oid.p == NULL ) { mbedtls_free( cur ); return( NULL ); } memcpy( cur->oid.p, oid, oid_len ); cur->val.len = val_len; cur->val.p = mbedtls_calloc( 1, val_len ); if( cur->val.p == NULL ) { mbedtls_free( cur->oid.p ); mbedtls_free( cur ); return( NULL ); } cur->next = *head; *head = cur; } else if( cur->val.len < val_len ) { /* * Enlarge existing value buffer if needed * Preserve old data until the allocation succeeded, to leave list in * a consistent state in case allocation fails. */ void *p = mbedtls_calloc( 1, val_len ); if( p == NULL ) return( NULL ); mbedtls_free( cur->val.p ); cur->val.p = p; cur->val.len = val_len; } if( val != NULL ) memcpy( cur->val.p, val, val_len ); return( cur ); } #endif /* MBEDTLS_ASN1_WRITE_C */ fldigi-4.2.05/src/mbedtls/version.c0000664000175000017500000000300314611711171014031 00000000000000/* * Version information * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_VERSION_C) #include "mbedtls/version.h" #include unsigned int mbedtls_version_get_number( void ) { return( MBEDTLS_VERSION_NUMBER ); } void mbedtls_version_get_string( char *string ) { memcpy( string, MBEDTLS_VERSION_STRING, sizeof( MBEDTLS_VERSION_STRING ) ); } void mbedtls_version_get_string_full( char *string ) { memcpy( string, MBEDTLS_VERSION_STRING_FULL, sizeof( MBEDTLS_VERSION_STRING_FULL ) ); } #endif /* MBEDTLS_VERSION_C */ fldigi-4.2.05/src/mbedtls/pkcs12.c0000664000175000017500000002544214611711171013462 00000000000000/* * PKCS#12 Personal Information Exchange Syntax * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The PKCS #12 Personal Information Exchange Syntax Standard v1.1 * * http://www.rsa.com/rsalabs/pkcs/files/h11301-wp-pkcs-12v1-1-personal-information-exchange-syntax.pdf * ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12v1-1.asn */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PKCS12_C) #include "mbedtls/pkcs12.h" #include "mbedtls/asn1.h" #include "mbedtls/cipher.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_ARC4_C) #include "mbedtls/arc4.h" #endif #if defined(MBEDTLS_DES_C) #include "mbedtls/des.h" #endif #if defined(MBEDTLS_ASN1_PARSE_C) static int pkcs12_parse_pbe_params( mbedtls_asn1_buf *params, mbedtls_asn1_buf *salt, int *iterations ) { int ret; unsigned char **p = ¶ms->p; const unsigned char *end = params->p + params->len; /* * pkcs-12PbeParams ::= SEQUENCE { * salt OCTET STRING, * iterations INTEGER * } * */ if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); if( ( ret = mbedtls_asn1_get_tag( p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + ret ); salt->p = *p; *p += salt->len; if( ( ret = mbedtls_asn1_get_int( p, end, iterations ) ) != 0 ) return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + ret ); if( *p != end ) return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } #define PKCS12_MAX_PWDLEN 128 static int pkcs12_pbe_derive_key_iv( mbedtls_asn1_buf *pbe_params, mbedtls_md_type_t md_type, const unsigned char *pwd, size_t pwdlen, unsigned char *key, size_t keylen, unsigned char *iv, size_t ivlen ) { int ret, iterations = 0; mbedtls_asn1_buf salt; size_t i; unsigned char unipwd[PKCS12_MAX_PWDLEN * 2 + 2]; if( pwdlen > PKCS12_MAX_PWDLEN ) return( MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA ); memset( &salt, 0, sizeof(mbedtls_asn1_buf) ); memset( &unipwd, 0, sizeof(unipwd) ); if( ( ret = pkcs12_parse_pbe_params( pbe_params, &salt, &iterations ) ) != 0 ) return( ret ); for( i = 0; i < pwdlen; i++ ) unipwd[i * 2 + 1] = pwd[i]; if( ( ret = mbedtls_pkcs12_derivation( key, keylen, unipwd, pwdlen * 2 + 2, salt.p, salt.len, md_type, MBEDTLS_PKCS12_DERIVE_KEY, iterations ) ) != 0 ) { return( ret ); } if( iv == NULL || ivlen == 0 ) return( 0 ); if( ( ret = mbedtls_pkcs12_derivation( iv, ivlen, unipwd, pwdlen * 2 + 2, salt.p, salt.len, md_type, MBEDTLS_PKCS12_DERIVE_IV, iterations ) ) != 0 ) { return( ret ); } return( 0 ); } #undef PKCS12_MAX_PWDLEN int mbedtls_pkcs12_pbe_sha1_rc4_128( mbedtls_asn1_buf *pbe_params, int mode, const unsigned char *pwd, size_t pwdlen, const unsigned char *data, size_t len, unsigned char *output ) { #if !defined(MBEDTLS_ARC4_C) ((void) pbe_params); ((void) mode); ((void) pwd); ((void) pwdlen); ((void) data); ((void) len); ((void) output); return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE ); #else int ret; unsigned char key[16]; mbedtls_arc4_context ctx; ((void) mode); mbedtls_arc4_init( &ctx ); if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, MBEDTLS_MD_SHA1, pwd, pwdlen, key, 16, NULL, 0 ) ) != 0 ) { return( ret ); } mbedtls_arc4_setup( &ctx, key, 16 ); if( ( ret = mbedtls_arc4_crypt( &ctx, len, data, output ) ) != 0 ) goto exit; exit: mbedtls_platform_zeroize( key, sizeof( key ) ); mbedtls_arc4_free( &ctx ); return( ret ); #endif /* MBEDTLS_ARC4_C */ } int mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode, mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, const unsigned char *pwd, size_t pwdlen, const unsigned char *data, size_t len, unsigned char *output ) { int ret, keylen = 0; unsigned char key[32]; unsigned char iv[16]; const mbedtls_cipher_info_t *cipher_info; mbedtls_cipher_context_t cipher_ctx; size_t olen = 0; cipher_info = mbedtls_cipher_info_from_type( cipher_type ); if( cipher_info == NULL ) return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE ); keylen = cipher_info->key_bitlen / 8; if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, md_type, pwd, pwdlen, key, keylen, iv, cipher_info->iv_size ) ) != 0 ) { return( ret ); } mbedtls_cipher_init( &cipher_ctx ); if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_setkey( &cipher_ctx, key, 8 * keylen, (mbedtls_operation_t) mode ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_set_iv( &cipher_ctx, iv, cipher_info->iv_size ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_reset( &cipher_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_update( &cipher_ctx, data, len, output, &olen ) ) != 0 ) { goto exit; } if( ( ret = mbedtls_cipher_finish( &cipher_ctx, output + olen, &olen ) ) != 0 ) ret = MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH; exit: mbedtls_platform_zeroize( key, sizeof( key ) ); mbedtls_platform_zeroize( iv, sizeof( iv ) ); mbedtls_cipher_free( &cipher_ctx ); return( ret ); } #endif /* MBEDTLS_ASN1_PARSE_C */ static void pkcs12_fill_buffer( unsigned char *data, size_t data_len, const unsigned char *filler, size_t fill_len ) { unsigned char *p = data; size_t use_len; while( data_len > 0 ) { use_len = ( data_len > fill_len ) ? fill_len : data_len; memcpy( p, filler, use_len ); p += use_len; data_len -= use_len; } } int mbedtls_pkcs12_derivation( unsigned char *data, size_t datalen, const unsigned char *pwd, size_t pwdlen, const unsigned char *salt, size_t saltlen, mbedtls_md_type_t md_type, int id, int iterations ) { int ret; unsigned int j; unsigned char diversifier[128]; unsigned char salt_block[128], pwd_block[128], hash_block[128]; unsigned char hash_output[MBEDTLS_MD_MAX_SIZE]; unsigned char *p; unsigned char c; size_t hlen, use_len, v, i; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; // This version only allows max of 64 bytes of password or salt if( datalen > 128 || pwdlen > 64 || saltlen > 64 ) return( MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA ); md_info = mbedtls_md_info_from_type( md_type ); if( md_info == NULL ) return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE ); mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) return( ret ); hlen = mbedtls_md_get_size( md_info ); if( hlen <= 32 ) v = 64; else v = 128; memset( diversifier, (unsigned char) id, v ); pkcs12_fill_buffer( salt_block, v, salt, saltlen ); pkcs12_fill_buffer( pwd_block, v, pwd, pwdlen ); p = data; while( datalen > 0 ) { // Calculate hash( diversifier || salt_block || pwd_block ) if( ( ret = mbedtls_md_starts( &md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, diversifier, v ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, salt_block, v ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, pwd_block, v ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_finish( &md_ctx, hash_output ) ) != 0 ) goto exit; // Perform remaining ( iterations - 1 ) recursive hash calculations for( i = 1; i < (size_t) iterations; i++ ) { if( ( ret = mbedtls_md( md_info, hash_output, hlen, hash_output ) ) != 0 ) goto exit; } use_len = ( datalen > hlen ) ? hlen : datalen; memcpy( p, hash_output, use_len ); datalen -= use_len; p += use_len; if( datalen == 0 ) break; // Concatenating copies of hash_output into hash_block (B) pkcs12_fill_buffer( hash_block, v, hash_output, hlen ); // B += 1 for( i = v; i > 0; i-- ) if( ++hash_block[i - 1] != 0 ) break; // salt_block += B c = 0; for( i = v; i > 0; i-- ) { j = salt_block[i - 1] + hash_block[i - 1] + c; c = (unsigned char) (j >> 8); salt_block[i - 1] = j & 0xFF; } // pwd_block += B c = 0; for( i = v; i > 0; i-- ) { j = pwd_block[i - 1] + hash_block[i - 1] + c; c = (unsigned char) (j >> 8); pwd_block[i - 1] = j & 0xFF; } } ret = 0; exit: mbedtls_platform_zeroize( salt_block, sizeof( salt_block ) ); mbedtls_platform_zeroize( pwd_block, sizeof( pwd_block ) ); mbedtls_platform_zeroize( hash_block, sizeof( hash_block ) ); mbedtls_platform_zeroize( hash_output, sizeof( hash_output ) ); mbedtls_md_free( &md_ctx ); return( ret ); } #endif /* MBEDTLS_PKCS12_C */ fldigi-4.2.05/src/mbedtls/x509_crt.c0000664000175000017500000023670214611711171013737 00000000000000/* * X.509 certificate parsing and verification * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ITU-T X.509 standard defines a certificate format for PKI. * * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) * * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf * * [SIRO] https://cabforum.org/wp-content/uploads/Chunghwatelecom201503cabforumV4.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) #include "mbedtls/x509_crt.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_free free #define mbedtls_calloc calloc #define mbedtls_snprintf snprintf #endif #if defined(MBEDTLS_THREADING_C) #include "mbedtls/threading.h" #endif #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #include #else #include #endif #if defined(MBEDTLS_FS_IO) #include #if !defined(_WIN32) || defined(EFIX64) || defined(EFI32) #include #include #include #endif /* !_WIN32 || EFIX64 || EFI32 */ #endif /* * Item in a verification chain: cert and flags for it */ typedef struct { mbedtls_x509_crt *crt; uint32_t flags; } x509_crt_verify_chain_item; /* * Max size of verification chain: end-entity + intermediates + trusted root */ #define X509_MAX_VERIFY_CHAIN_SIZE ( MBEDTLS_X509_MAX_INTERMEDIATE_CA + 2 ) /* * Default profile */ const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default = { #if defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES) /* Allow SHA-1 (weak, but still safe in controlled environments) */ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA1 ) | #endif /* Only SHA-2 hashes */ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA224 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ), 0xFFFFFFF, /* Any PK alg */ 0xFFFFFFF, /* Any curve */ 2048, }; /* * Next-default profile */ const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next = { /* Hashes from SHA-256 and above */ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ), 0xFFFFFFF, /* Any PK alg */ #if defined(MBEDTLS_ECP_C) /* Curves at or above 128-bit security level */ MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP521R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP256R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP384R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP512R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256K1 ), #else 0, #endif 2048, }; /* * NSA Suite B Profile */ const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb = { /* Only SHA-256 and 384 */ MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ), /* Only ECDSA */ MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECDSA ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECKEY ), #if defined(MBEDTLS_ECP_C) /* Only NIST P-256 and P-384 */ MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256R1 ) | MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ), #else 0, #endif 0, }; /* * Check md_alg against profile * Return 0 if md_alg is acceptable for this profile, -1 otherwise */ static int x509_profile_check_md_alg( const mbedtls_x509_crt_profile *profile, mbedtls_md_type_t md_alg ) { if( md_alg == MBEDTLS_MD_NONE ) return( -1 ); if( ( profile->allowed_mds & MBEDTLS_X509_ID_FLAG( md_alg ) ) != 0 ) return( 0 ); return( -1 ); } /* * Check pk_alg against profile * Return 0 if pk_alg is acceptable for this profile, -1 otherwise */ static int x509_profile_check_pk_alg( const mbedtls_x509_crt_profile *profile, mbedtls_pk_type_t pk_alg ) { if( pk_alg == MBEDTLS_PK_NONE ) return( -1 ); if( ( profile->allowed_pks & MBEDTLS_X509_ID_FLAG( pk_alg ) ) != 0 ) return( 0 ); return( -1 ); } /* * Check key against profile * Return 0 if pk is acceptable for this profile, -1 otherwise */ static int x509_profile_check_key( const mbedtls_x509_crt_profile *profile, const mbedtls_pk_context *pk ) { const mbedtls_pk_type_t pk_alg = mbedtls_pk_get_type( pk ); #if defined(MBEDTLS_RSA_C) if( pk_alg == MBEDTLS_PK_RSA || pk_alg == MBEDTLS_PK_RSASSA_PSS ) { if( mbedtls_pk_get_bitlen( pk ) >= profile->rsa_min_bitlen ) return( 0 ); return( -1 ); } #endif #if defined(MBEDTLS_ECP_C) if( pk_alg == MBEDTLS_PK_ECDSA || pk_alg == MBEDTLS_PK_ECKEY || pk_alg == MBEDTLS_PK_ECKEY_DH ) { const mbedtls_ecp_group_id gid = mbedtls_pk_ec( *pk )->grp.id; if( gid == MBEDTLS_ECP_DP_NONE ) return( -1 ); if( ( profile->allowed_curves & MBEDTLS_X509_ID_FLAG( gid ) ) != 0 ) return( 0 ); return( -1 ); } #endif return( -1 ); } /* * Like memcmp, but case-insensitive and always returns -1 if different */ static int x509_memcasecmp( const void *s1, const void *s2, size_t len ) { size_t i; unsigned char diff; const unsigned char *n1 = s1, *n2 = s2; for( i = 0; i < len; i++ ) { diff = n1[i] ^ n2[i]; if( diff == 0 ) continue; if( diff == 32 && ( ( n1[i] >= 'a' && n1[i] <= 'z' ) || ( n1[i] >= 'A' && n1[i] <= 'Z' ) ) ) { continue; } return( -1 ); } return( 0 ); } /* * Return 0 if name matches wildcard, -1 otherwise */ static int x509_check_wildcard( const char *cn, const mbedtls_x509_buf *name ) { size_t i; size_t cn_idx = 0, cn_len = strlen( cn ); /* We can't have a match if there is no wildcard to match */ if( name->len < 3 || name->p[0] != '*' || name->p[1] != '.' ) return( -1 ); for( i = 0; i < cn_len; ++i ) { if( cn[i] == '.' ) { cn_idx = i; break; } } if( cn_idx == 0 ) return( -1 ); if( cn_len - cn_idx == name->len - 1 && x509_memcasecmp( name->p + 1, cn + cn_idx, name->len - 1 ) == 0 ) { return( 0 ); } return( -1 ); } /* * Compare two X.509 strings, case-insensitive, and allowing for some encoding * variations (but not all). * * Return 0 if equal, -1 otherwise. */ static int x509_string_cmp( const mbedtls_x509_buf *a, const mbedtls_x509_buf *b ) { if( a->tag == b->tag && a->len == b->len && memcmp( a->p, b->p, b->len ) == 0 ) { return( 0 ); } if( ( a->tag == MBEDTLS_ASN1_UTF8_STRING || a->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) && ( b->tag == MBEDTLS_ASN1_UTF8_STRING || b->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) && a->len == b->len && x509_memcasecmp( a->p, b->p, b->len ) == 0 ) { return( 0 ); } return( -1 ); } /* * Compare two X.509 Names (aka rdnSequence). * * See RFC 5280 section 7.1, though we don't implement the whole algorithm: * we sometimes return unequal when the full algorithm would return equal, * but never the other way. (In particular, we don't do Unicode normalisation * or space folding.) * * Return 0 if equal, -1 otherwise. */ static int x509_name_cmp( const mbedtls_x509_name *a, const mbedtls_x509_name *b ) { /* Avoid recursion, it might not be optimised by the compiler */ while( a != NULL || b != NULL ) { if( a == NULL || b == NULL ) return( -1 ); /* type */ if( a->oid.tag != b->oid.tag || a->oid.len != b->oid.len || memcmp( a->oid.p, b->oid.p, b->oid.len ) != 0 ) { return( -1 ); } /* value */ if( x509_string_cmp( &a->val, &b->val ) != 0 ) return( -1 ); /* structure of the list of sets */ if( a->next_merged != b->next_merged ) return( -1 ); a = a->next; b = b->next; } /* a == NULL == b */ return( 0 ); } /* * Reset (init or clear) a verify_chain */ static void x509_crt_verify_chain_reset( mbedtls_x509_crt_verify_chain *ver_chain ) { size_t i; for( i = 0; i < MBEDTLS_X509_MAX_VERIFY_CHAIN_SIZE; i++ ) { ver_chain->items[i].crt = NULL; ver_chain->items[i].flags = -1; } ver_chain->len = 0; } /* * Version ::= INTEGER { v1(0), v2(1), v3(2) } */ static int x509_get_version( unsigned char **p, const unsigned char *end, int *ver ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { *ver = 0; return( 0 ); } return( ret ); } end = *p + len; if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_VERSION + ret ); if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_VERSION + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * Validity ::= SEQUENCE { * notBefore Time, * notAfter Time } */ static int x509_get_dates( unsigned char **p, const unsigned char *end, mbedtls_x509_time *from, mbedtls_x509_time *to ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_DATE + ret ); end = *p + len; if( ( ret = mbedtls_x509_get_time( p, end, from ) ) != 0 ) return( ret ); if( ( ret = mbedtls_x509_get_time( p, end, to ) ) != 0 ) return( ret ); if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * X.509 v2/v3 unique identifier (not parsed) */ static int x509_get_uid( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *uid, int n ) { int ret; if( *p == end ) return( 0 ); uid->tag = **p; if( ( ret = mbedtls_asn1_get_tag( p, end, &uid->len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | n ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( 0 ); return( ret ); } uid->p = *p; *p += uid->len; return( 0 ); } static int x509_get_basic_constraints( unsigned char **p, const unsigned char *end, int *ca_istrue, int *max_pathlen ) { int ret; size_t len; /* * BasicConstraints ::= SEQUENCE { * cA BOOLEAN DEFAULT FALSE, * pathLenConstraint INTEGER (0..MAX) OPTIONAL } */ *ca_istrue = 0; /* DEFAULT FALSE */ *max_pathlen = 0; /* endless */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( *p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_bool( p, end, ca_istrue ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) ret = mbedtls_asn1_get_int( p, end, ca_istrue ); if( ret != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( *ca_istrue != 0 ) *ca_istrue = 1; } if( *p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_int( p, end, max_pathlen ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); (*max_pathlen)++; return( 0 ); } static int x509_get_ns_cert_type( unsigned char **p, const unsigned char *end, unsigned char *ns_cert_type) { int ret; mbedtls_x509_bitstring bs = { 0, 0, NULL }; if( ( ret = mbedtls_asn1_get_bitstring( p, end, &bs ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( bs.len != 1 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_INVALID_LENGTH ); /* Get actual bitstring */ *ns_cert_type = *bs.p; return( 0 ); } static int x509_get_key_usage( unsigned char **p, const unsigned char *end, unsigned int *key_usage) { int ret; size_t i; mbedtls_x509_bitstring bs = { 0, 0, NULL }; if( ( ret = mbedtls_asn1_get_bitstring( p, end, &bs ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( bs.len < 1 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_INVALID_LENGTH ); /* Get actual bitstring */ *key_usage = 0; for( i = 0; i < bs.len && i < sizeof( unsigned int ); i++ ) { *key_usage |= (unsigned int) bs.p[i] << (8*i); } return( 0 ); } /* * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId * * KeyPurposeId ::= OBJECT IDENTIFIER */ static int x509_get_ext_key_usage( unsigned char **p, const unsigned char *end, mbedtls_x509_sequence *ext_key_usage) { int ret; if( ( ret = mbedtls_asn1_get_sequence_of( p, end, ext_key_usage, MBEDTLS_ASN1_OID ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); /* Sequence length must be >= 1 */ if( ext_key_usage->buf.p == NULL ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_INVALID_LENGTH ); return( 0 ); } /* * SubjectAltName ::= GeneralNames * * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName * * GeneralName ::= CHOICE { * otherName [0] OtherName, * rfc822Name [1] IA5String, * dNSName [2] IA5String, * x400Address [3] ORAddress, * directoryName [4] Name, * ediPartyName [5] EDIPartyName, * uniformResourceIdentifier [6] IA5String, * iPAddress [7] OCTET STRING, * registeredID [8] OBJECT IDENTIFIER } * * OtherName ::= SEQUENCE { * type-id OBJECT IDENTIFIER, * value [0] EXPLICIT ANY DEFINED BY type-id } * * EDIPartyName ::= SEQUENCE { * nameAssigner [0] DirectoryString OPTIONAL, * partyName [1] DirectoryString } * * NOTE: we only parse and use dNSName at this point. */ static int x509_get_subject_alt_name( unsigned char **p, const unsigned char *end, mbedtls_x509_sequence *subject_alt_name ) { int ret; size_t len, tag_len; mbedtls_asn1_buf *buf; unsigned char tag; mbedtls_asn1_sequence *cur = subject_alt_name; /* Get main sequence tag */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( *p + len != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); while( *p < end ) { if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); tag = **p; (*p)++; if( ( ret = mbedtls_asn1_get_len( p, end, &tag_len ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); if( ( tag & MBEDTLS_ASN1_TAG_CLASS_MASK ) != MBEDTLS_ASN1_CONTEXT_SPECIFIC ) { return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); } /* Skip everything but DNS name */ if( tag != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | 2 ) ) { *p += tag_len; continue; } /* Allocate and assign next pointer */ if( cur->buf.p != NULL ) { if( cur->next != NULL ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS ); cur->next = mbedtls_calloc( 1, sizeof( mbedtls_asn1_sequence ) ); if( cur->next == NULL ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_ALLOC_FAILED ); cur = cur->next; } buf = &(cur->buf); buf->tag = tag; buf->p = *p; buf->len = tag_len; *p += buf->len; } /* Set final sequence entry's next pointer to NULL */ cur->next = NULL; if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * X.509 v3 extensions * */ static int x509_get_crt_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_crt *crt ) { int ret; size_t len; unsigned char *end_ext_data, *end_ext_octet; if( ( ret = mbedtls_x509_get_ext( p, end, &crt->v3_ext, 3 ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( 0 ); return( ret ); } while( *p < end ) { /* * Extension ::= SEQUENCE { * extnID OBJECT IDENTIFIER, * critical BOOLEAN DEFAULT FALSE, * extnValue OCTET STRING } */ mbedtls_x509_buf extn_oid = {0, 0, NULL}; int is_critical = 0; /* DEFAULT FALSE */ int ext_type = 0; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); end_ext_data = *p + len; /* Get extension ID */ if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &extn_oid.len, MBEDTLS_ASN1_OID ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); extn_oid.tag = MBEDTLS_ASN1_OID; extn_oid.p = *p; *p += extn_oid.len; /* Get optional critical */ if( ( ret = mbedtls_asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 && ( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); /* Data should be octet string type */ if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); end_ext_octet = *p + len; if( end_ext_octet != end_ext_data ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* * Detect supported extensions */ ret = mbedtls_oid_get_x509_ext_type( &extn_oid, &ext_type ); if( ret != 0 ) { /* No parser found, skip extension */ *p = end_ext_octet; #if !defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) if( is_critical ) { /* Data is marked as critical: fail */ return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); } #endif continue; } /* Forbid repeated extensions */ if( ( crt->ext_types & ext_type ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS ); crt->ext_types |= ext_type; switch( ext_type ) { case MBEDTLS_X509_EXT_BASIC_CONSTRAINTS: /* Parse basic constraints */ if( ( ret = x509_get_basic_constraints( p, end_ext_octet, &crt->ca_istrue, &crt->max_pathlen ) ) != 0 ) return( ret ); break; case MBEDTLS_X509_EXT_KEY_USAGE: /* Parse key usage */ if( ( ret = x509_get_key_usage( p, end_ext_octet, &crt->key_usage ) ) != 0 ) return( ret ); break; case MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE: /* Parse extended key usage */ if( ( ret = x509_get_ext_key_usage( p, end_ext_octet, &crt->ext_key_usage ) ) != 0 ) return( ret ); break; case MBEDTLS_X509_EXT_SUBJECT_ALT_NAME: /* Parse subject alt name */ if( ( ret = x509_get_subject_alt_name( p, end_ext_octet, &crt->subject_alt_names ) ) != 0 ) return( ret ); break; case MBEDTLS_X509_EXT_NS_CERT_TYPE: /* Parse netscape certificate type */ if( ( ret = x509_get_ns_cert_type( p, end_ext_octet, &crt->ns_cert_type ) ) != 0 ) return( ret ); break; default: return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE ); } } if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * Parse and fill a single X.509 certificate in DER format */ static int x509_crt_parse_der_core( mbedtls_x509_crt *crt, const unsigned char *buf, size_t buflen ) { int ret; size_t len; unsigned char *p, *end, *crt_end; mbedtls_x509_buf sig_params1, sig_params2, sig_oid2; memset( &sig_params1, 0, sizeof( mbedtls_x509_buf ) ); memset( &sig_params2, 0, sizeof( mbedtls_x509_buf ) ); memset( &sig_oid2, 0, sizeof( mbedtls_x509_buf ) ); /* * Check for valid input */ if( crt == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); // Use the original buffer until we figure out actual length p = (unsigned char*) buf; len = buflen; end = p + len; /* * Certificate ::= SEQUENCE { * tbsCertificate TBSCertificate, * signatureAlgorithm AlgorithmIdentifier, * signatureValue BIT STRING } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT ); } if( len > (size_t) ( end - p ) ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } crt_end = p + len; // Create and populate a new buffer for the raw field crt->raw.len = crt_end - buf; crt->raw.p = p = mbedtls_calloc( 1, crt->raw.len ); if( p == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); memcpy( p, buf, crt->raw.len ); // Direct pointers to the new buffer p += crt->raw.len - len; end = crt_end = p + len; /* * TBSCertificate ::= SEQUENCE { */ crt->tbs.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } end = p + len; crt->tbs.len = end - crt->tbs.p; /* * Version ::= INTEGER { v1(0), v2(1), v3(2) } * * CertificateSerialNumber ::= INTEGER * * signature AlgorithmIdentifier */ if( ( ret = x509_get_version( &p, end, &crt->version ) ) != 0 || ( ret = mbedtls_x509_get_serial( &p, end, &crt->serial ) ) != 0 || ( ret = mbedtls_x509_get_alg( &p, end, &crt->sig_oid, &sig_params1 ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } if( crt->version < 0 || crt->version > 2 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_UNKNOWN_VERSION ); } crt->version++; if( ( ret = mbedtls_x509_get_sig_alg( &crt->sig_oid, &sig_params1, &crt->sig_md, &crt->sig_pk, &crt->sig_opts ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } /* * issuer Name */ crt->issuer_raw.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } if( ( ret = mbedtls_x509_get_name( &p, p + len, &crt->issuer ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } crt->issuer_raw.len = p - crt->issuer_raw.p; /* * Validity ::= SEQUENCE { * notBefore Time, * notAfter Time } * */ if( ( ret = x509_get_dates( &p, end, &crt->valid_from, &crt->valid_to ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } /* * subject Name */ crt->subject_raw.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } if( len && ( ret = mbedtls_x509_get_name( &p, p + len, &crt->subject ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } crt->subject_raw.len = p - crt->subject_raw.p; /* * SubjectPublicKeyInfo */ if( ( ret = mbedtls_pk_parse_subpubkey( &p, end, &crt->pk ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } /* * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, * -- If present, version shall be v2 or v3 * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, * -- If present, version shall be v2 or v3 * extensions [3] EXPLICIT Extensions OPTIONAL * -- If present, version shall be v3 */ if( crt->version == 2 || crt->version == 3 ) { ret = x509_get_uid( &p, end, &crt->issuer_id, 1 ); if( ret != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } } if( crt->version == 2 || crt->version == 3 ) { ret = x509_get_uid( &p, end, &crt->subject_id, 2 ); if( ret != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } } #if !defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3) if( crt->version == 3 ) #endif { ret = x509_get_crt_ext( &p, end, crt ); if( ret != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } } if( p != end ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } end = crt_end; /* * } * -- end of TBSCertificate * * signatureAlgorithm AlgorithmIdentifier, * signatureValue BIT STRING */ if( ( ret = mbedtls_x509_get_alg( &p, end, &sig_oid2, &sig_params2 ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } if( crt->sig_oid.len != sig_oid2.len || memcmp( crt->sig_oid.p, sig_oid2.p, crt->sig_oid.len ) != 0 || sig_params1.len != sig_params2.len || ( sig_params1.len != 0 && memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_SIG_MISMATCH ); } if( ( ret = mbedtls_x509_get_sig( &p, end, &crt->sig ) ) != 0 ) { mbedtls_x509_crt_free( crt ); return( ret ); } if( p != end ) { mbedtls_x509_crt_free( crt ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } return( 0 ); } /* * Parse one X.509 certificate in DER format from a buffer and add them to a * chained list */ int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ) { int ret; mbedtls_x509_crt *crt = chain, *prev = NULL; /* * Check for valid input */ if( crt == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); while( crt->version != 0 && crt->next != NULL ) { prev = crt; crt = crt->next; } /* * Add new certificate on the end of the chain if needed. */ if( crt->version != 0 && crt->next == NULL ) { crt->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) ); if( crt->next == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); prev = crt; mbedtls_x509_crt_init( crt->next ); crt = crt->next; } if( ( ret = x509_crt_parse_der_core( crt, buf, buflen ) ) != 0 ) { if( prev ) prev->next = NULL; if( crt != chain ) mbedtls_free( crt ); return( ret ); } return( 0 ); } /* * Parse one or more PEM certificates from a buffer and add them to the chained * list */ int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ) { #if defined(MBEDTLS_PEM_PARSE_C) int success = 0, first_error = 0, total_failed = 0; int buf_format = MBEDTLS_X509_FORMAT_DER; #endif /* * Check for valid input */ if( chain == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); /* * Determine buffer content. Buffer contains either one DER certificate or * one or more PEM certificates. */ #if defined(MBEDTLS_PEM_PARSE_C) if( buflen != 0 && buf[buflen - 1] == '\0' && strstr( (const char *) buf, "-----BEGIN CERTIFICATE-----" ) != NULL ) { buf_format = MBEDTLS_X509_FORMAT_PEM; } if( buf_format == MBEDTLS_X509_FORMAT_DER ) return mbedtls_x509_crt_parse_der( chain, buf, buflen ); #else return mbedtls_x509_crt_parse_der( chain, buf, buflen ); #endif #if defined(MBEDTLS_PEM_PARSE_C) if( buf_format == MBEDTLS_X509_FORMAT_PEM ) { int ret; mbedtls_pem_context pem; /* 1 rather than 0 since the terminating NULL byte is counted in */ while( buflen > 1 ) { size_t use_len; mbedtls_pem_init( &pem ); /* If we get there, we know the string is null-terminated */ ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE-----", buf, NULL, 0, &use_len ); if( ret == 0 ) { /* * Was PEM encoded */ buflen -= use_len; buf += use_len; } else if( ret == MBEDTLS_ERR_PEM_BAD_INPUT_DATA ) { return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) { mbedtls_pem_free( &pem ); /* * PEM header and footer were found */ buflen -= use_len; buf += use_len; if( first_error == 0 ) first_error = ret; total_failed++; continue; } else break; ret = mbedtls_x509_crt_parse_der( chain, pem.buf, pem.buflen ); mbedtls_pem_free( &pem ); if( ret != 0 ) { /* * Quit parsing on a memory error */ if( ret == MBEDTLS_ERR_X509_ALLOC_FAILED ) return( ret ); if( first_error == 0 ) first_error = ret; total_failed++; continue; } success = 1; } } if( success ) return( total_failed ); else if( first_error ) return( first_error ); else return( MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT ); #endif /* MBEDTLS_PEM_PARSE_C */ } #if defined(MBEDTLS_FS_IO) /* * Load one or more certificates and add them to the chained list */ int mbedtls_x509_crt_parse_file( mbedtls_x509_crt *chain, const char *path ) { int ret; size_t n; unsigned char *buf; if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_x509_crt_parse( chain, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) { int ret = 0; #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) int w_ret; WCHAR szDir[MAX_PATH]; char filename[MAX_PATH]; char *p; size_t len = strlen( path ); WIN32_FIND_DATAW file_data; HANDLE hFind; if( len > MAX_PATH - 3 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); memset( szDir, 0, sizeof(szDir) ); memset( filename, 0, MAX_PATH ); memcpy( filename, path, len ); filename[len++] = '\\'; p = filename + len; filename[len++] = '*'; w_ret = MultiByteToWideChar( CP_ACP, 0, filename, (int)len, szDir, MAX_PATH - 3 ); if( w_ret == 0 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); hFind = FindFirstFileW( szDir, &file_data ); if( hFind == INVALID_HANDLE_VALUE ) return( MBEDTLS_ERR_X509_FILE_IO_ERROR ); len = MAX_PATH - len; do { memset( p, 0, len ); if( file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) continue; w_ret = WideCharToMultiByte( CP_ACP, 0, file_data.cFileName, lstrlenW( file_data.cFileName ), p, (int) len - 1, NULL, NULL ); if( w_ret == 0 ) { ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; goto cleanup; } w_ret = mbedtls_x509_crt_parse_file( chain, filename ); if( w_ret < 0 ) ret++; else ret += w_ret; } while( FindNextFileW( hFind, &file_data ) != 0 ); if( GetLastError() != ERROR_NO_MORE_FILES ) ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; cleanup: FindClose( hFind ); #else /* _WIN32 */ int t_ret; int snp_ret; struct stat sb; struct dirent *entry; char entry_name[MBEDTLS_X509_MAX_FILE_PATH_LEN]; DIR *dir = opendir( path ); if( dir == NULL ) return( MBEDTLS_ERR_X509_FILE_IO_ERROR ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &mbedtls_threading_readdir_mutex ) ) != 0 ) { closedir( dir ); return( ret ); } #endif /* MBEDTLS_THREADING_C */ while( ( entry = readdir( dir ) ) != NULL ) { snp_ret = mbedtls_snprintf( entry_name, sizeof entry_name, "%s/%s", path, entry->d_name ); if( snp_ret < 0 || (size_t)snp_ret >= sizeof entry_name ) { ret = MBEDTLS_ERR_X509_BUFFER_TOO_SMALL; goto cleanup; } else if( stat( entry_name, &sb ) == -1 ) { ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; goto cleanup; } if( !S_ISREG( sb.st_mode ) ) continue; // Ignore parse errors // t_ret = mbedtls_x509_crt_parse_file( chain, entry_name ); if( t_ret < 0 ) ret++; else ret += t_ret; } cleanup: closedir( dir ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &mbedtls_threading_readdir_mutex ) != 0 ) ret = MBEDTLS_ERR_THREADING_MUTEX_ERROR; #endif /* MBEDTLS_THREADING_C */ #endif /* _WIN32 */ return( ret ); } #endif /* MBEDTLS_FS_IO */ static int x509_info_subject_alt_name( char **buf, size_t *size, const mbedtls_x509_sequence *subject_alt_name ) { size_t i; size_t n = *size; char *p = *buf; const mbedtls_x509_sequence *cur = subject_alt_name; const char *sep = ""; size_t sep_len = 0; while( cur != NULL ) { if( cur->buf.len + sep_len >= n ) { *p = '\0'; return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL ); } n -= cur->buf.len + sep_len; for( i = 0; i < sep_len; i++ ) *p++ = sep[i]; for( i = 0; i < cur->buf.len; i++ ) *p++ = cur->buf.p[i]; sep = ", "; sep_len = 2; cur = cur->next; } *p = '\0'; *size = n; *buf = p; return( 0 ); } #define PRINT_ITEM(i) \ { \ ret = mbedtls_snprintf( p, n, "%s" i, sep ); \ MBEDTLS_X509_SAFE_SNPRINTF; \ sep = ", "; \ } #define CERT_TYPE(type,name) \ if( ns_cert_type & type ) \ PRINT_ITEM( name ); static int x509_info_cert_type( char **buf, size_t *size, unsigned char ns_cert_type ) { int ret; size_t n = *size; char *p = *buf; const char *sep = ""; CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT, "SSL Client" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER, "SSL Server" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_EMAIL, "Email" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING, "Object Signing" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_RESERVED, "Reserved" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_CA, "SSL CA" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA, "Email CA" ); CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA, "Object Signing CA" ); *size = n; *buf = p; return( 0 ); } #define KEY_USAGE(code,name) \ if( key_usage & code ) \ PRINT_ITEM( name ); static int x509_info_key_usage( char **buf, size_t *size, unsigned int key_usage ) { int ret; size_t n = *size; char *p = *buf; const char *sep = ""; KEY_USAGE( MBEDTLS_X509_KU_DIGITAL_SIGNATURE, "Digital Signature" ); KEY_USAGE( MBEDTLS_X509_KU_NON_REPUDIATION, "Non Repudiation" ); KEY_USAGE( MBEDTLS_X509_KU_KEY_ENCIPHERMENT, "Key Encipherment" ); KEY_USAGE( MBEDTLS_X509_KU_DATA_ENCIPHERMENT, "Data Encipherment" ); KEY_USAGE( MBEDTLS_X509_KU_KEY_AGREEMENT, "Key Agreement" ); KEY_USAGE( MBEDTLS_X509_KU_KEY_CERT_SIGN, "Key Cert Sign" ); KEY_USAGE( MBEDTLS_X509_KU_CRL_SIGN, "CRL Sign" ); KEY_USAGE( MBEDTLS_X509_KU_ENCIPHER_ONLY, "Encipher Only" ); KEY_USAGE( MBEDTLS_X509_KU_DECIPHER_ONLY, "Decipher Only" ); *size = n; *buf = p; return( 0 ); } static int x509_info_ext_key_usage( char **buf, size_t *size, const mbedtls_x509_sequence *extended_key_usage ) { int ret; const char *desc; size_t n = *size; char *p = *buf; const mbedtls_x509_sequence *cur = extended_key_usage; const char *sep = ""; while( cur != NULL ) { if( mbedtls_oid_get_extended_key_usage( &cur->buf, &desc ) != 0 ) desc = "???"; ret = mbedtls_snprintf( p, n, "%s%s", sep, desc ); MBEDTLS_X509_SAFE_SNPRINTF; sep = ", "; cur = cur->next; } *size = n; *buf = p; return( 0 ); } /* * Return an informational string about the certificate. */ #define BEFORE_COLON 18 #define BC "18" int mbedtls_x509_crt_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_crt *crt ) { int ret; size_t n; char *p; char key_size_str[BEFORE_COLON]; p = buf; n = size; if( NULL == crt ) { ret = mbedtls_snprintf( p, n, "\nCertificate is uninitialised!\n" ); MBEDTLS_X509_SAFE_SNPRINTF; return( (int) ( size - n ) ); } ret = mbedtls_snprintf( p, n, "%scert. version : %d\n", prefix, crt->version ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "%sserial number : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_serial_gets( p, n, &crt->serial ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sissuer name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_dn_gets( p, n, &crt->issuer ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%ssubject name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_dn_gets( p, n, &crt->subject ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sissued on : " \ "%04d-%02d-%02d %02d:%02d:%02d", prefix, crt->valid_from.year, crt->valid_from.mon, crt->valid_from.day, crt->valid_from.hour, crt->valid_from.min, crt->valid_from.sec ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sexpires on : " \ "%04d-%02d-%02d %02d:%02d:%02d", prefix, crt->valid_to.year, crt->valid_to.mon, crt->valid_to.day, crt->valid_to.hour, crt->valid_to.min, crt->valid_to.sec ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%ssigned using : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_sig_alg_gets( p, n, &crt->sig_oid, crt->sig_pk, crt->sig_md, crt->sig_opts ); MBEDTLS_X509_SAFE_SNPRINTF; /* Key size */ if( ( ret = mbedtls_x509_key_size_helper( key_size_str, BEFORE_COLON, mbedtls_pk_get_name( &crt->pk ) ) ) != 0 ) { return( ret ); } ret = mbedtls_snprintf( p, n, "\n%s%-" BC "s: %d bits", prefix, key_size_str, (int) mbedtls_pk_get_bitlen( &crt->pk ) ); MBEDTLS_X509_SAFE_SNPRINTF; /* * Optional extensions */ if( crt->ext_types & MBEDTLS_X509_EXT_BASIC_CONSTRAINTS ) { ret = mbedtls_snprintf( p, n, "\n%sbasic constraints : CA=%s", prefix, crt->ca_istrue ? "true" : "false" ); MBEDTLS_X509_SAFE_SNPRINTF; if( crt->max_pathlen > 0 ) { ret = mbedtls_snprintf( p, n, ", max_pathlen=%d", crt->max_pathlen - 1 ); MBEDTLS_X509_SAFE_SNPRINTF; } } if( crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME ) { ret = mbedtls_snprintf( p, n, "\n%ssubject alt name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = x509_info_subject_alt_name( &p, &n, &crt->subject_alt_names ) ) != 0 ) return( ret ); } if( crt->ext_types & MBEDTLS_X509_EXT_NS_CERT_TYPE ) { ret = mbedtls_snprintf( p, n, "\n%scert. type : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = x509_info_cert_type( &p, &n, crt->ns_cert_type ) ) != 0 ) return( ret ); } if( crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE ) { ret = mbedtls_snprintf( p, n, "\n%skey usage : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = x509_info_key_usage( &p, &n, crt->key_usage ) ) != 0 ) return( ret ); } if( crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE ) { ret = mbedtls_snprintf( p, n, "\n%sext key usage : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = x509_info_ext_key_usage( &p, &n, &crt->ext_key_usage ) ) != 0 ) return( ret ); } ret = mbedtls_snprintf( p, n, "\n" ); MBEDTLS_X509_SAFE_SNPRINTF; return( (int) ( size - n ) ); } struct x509_crt_verify_string { int code; const char *string; }; static const struct x509_crt_verify_string x509_crt_verify_strings[] = { { MBEDTLS_X509_BADCERT_EXPIRED, "The certificate validity has expired" }, { MBEDTLS_X509_BADCERT_REVOKED, "The certificate has been revoked (is on a CRL)" }, { MBEDTLS_X509_BADCERT_CN_MISMATCH, "The certificate Common Name (CN) does not match with the expected CN" }, { MBEDTLS_X509_BADCERT_NOT_TRUSTED, "The certificate is not correctly signed by the trusted CA" }, { MBEDTLS_X509_BADCRL_NOT_TRUSTED, "The CRL is not correctly signed by the trusted CA" }, { MBEDTLS_X509_BADCRL_EXPIRED, "The CRL is expired" }, { MBEDTLS_X509_BADCERT_MISSING, "Certificate was missing" }, { MBEDTLS_X509_BADCERT_SKIP_VERIFY, "Certificate verification was skipped" }, { MBEDTLS_X509_BADCERT_OTHER, "Other reason (can be used by verify callback)" }, { MBEDTLS_X509_BADCERT_FUTURE, "The certificate validity starts in the future" }, { MBEDTLS_X509_BADCRL_FUTURE, "The CRL is from the future" }, { MBEDTLS_X509_BADCERT_KEY_USAGE, "Usage does not match the keyUsage extension" }, { MBEDTLS_X509_BADCERT_EXT_KEY_USAGE, "Usage does not match the extendedKeyUsage extension" }, { MBEDTLS_X509_BADCERT_NS_CERT_TYPE, "Usage does not match the nsCertType extension" }, { MBEDTLS_X509_BADCERT_BAD_MD, "The certificate is signed with an unacceptable hash." }, { MBEDTLS_X509_BADCERT_BAD_PK, "The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA)." }, { MBEDTLS_X509_BADCERT_BAD_KEY, "The certificate is signed with an unacceptable key (eg bad curve, RSA too short)." }, { MBEDTLS_X509_BADCRL_BAD_MD, "The CRL is signed with an unacceptable hash." }, { MBEDTLS_X509_BADCRL_BAD_PK, "The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA)." }, { MBEDTLS_X509_BADCRL_BAD_KEY, "The CRL is signed with an unacceptable key (eg bad curve, RSA too short)." }, { 0, NULL } }; int mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix, uint32_t flags ) { int ret; const struct x509_crt_verify_string *cur; char *p = buf; size_t n = size; for( cur = x509_crt_verify_strings; cur->string != NULL ; cur++ ) { if( ( flags & cur->code ) == 0 ) continue; ret = mbedtls_snprintf( p, n, "%s%s\n", prefix, cur->string ); MBEDTLS_X509_SAFE_SNPRINTF; flags ^= cur->code; } if( flags != 0 ) { ret = mbedtls_snprintf( p, n, "%sUnknown reason " "(this should not happen)\n", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; } return( (int) ( size - n ) ); } #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) int mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt, unsigned int usage ) { unsigned int usage_must, usage_may; unsigned int may_mask = MBEDTLS_X509_KU_ENCIPHER_ONLY | MBEDTLS_X509_KU_DECIPHER_ONLY; if( ( crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE ) == 0 ) return( 0 ); usage_must = usage & ~may_mask; if( ( ( crt->key_usage & ~may_mask ) & usage_must ) != usage_must ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); usage_may = usage & may_mask; if( ( ( crt->key_usage & may_mask ) | usage_may ) != usage_may ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); return( 0 ); } #endif #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) int mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt, const char *usage_oid, size_t usage_len ) { const mbedtls_x509_sequence *cur; /* Extension is not mandatory, absent means no restriction */ if( ( crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE ) == 0 ) return( 0 ); /* * Look for the requested usage (or wildcard ANY) in our list */ for( cur = &crt->ext_key_usage; cur != NULL; cur = cur->next ) { const mbedtls_x509_buf *cur_oid = &cur->buf; if( cur_oid->len == usage_len && memcmp( cur_oid->p, usage_oid, usage_len ) == 0 ) { return( 0 ); } if( MBEDTLS_OID_CMP( MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE, cur_oid ) == 0 ) return( 0 ); } return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); } #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ #if defined(MBEDTLS_X509_CRL_PARSE_C) /* * Return 1 if the certificate is revoked, or 0 otherwise. */ int mbedtls_x509_crt_is_revoked( const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl ) { const mbedtls_x509_crl_entry *cur = &crl->entry; while( cur != NULL && cur->serial.len != 0 ) { if( crt->serial.len == cur->serial.len && memcmp( crt->serial.p, cur->serial.p, crt->serial.len ) == 0 ) { if( mbedtls_x509_time_is_past( &cur->revocation_date ) ) return( 1 ); } cur = cur->next; } return( 0 ); } /* * Check that the given certificate is not revoked according to the CRL. * Skip validation if no CRL for the given CA is present. */ static int x509_crt_verifycrl( mbedtls_x509_crt *crt, mbedtls_x509_crt *ca, mbedtls_x509_crl *crl_list, const mbedtls_x509_crt_profile *profile ) { int flags = 0; unsigned char hash[MBEDTLS_MD_MAX_SIZE]; const mbedtls_md_info_t *md_info; if( ca == NULL ) return( flags ); while( crl_list != NULL ) { if( crl_list->version == 0 || x509_name_cmp( &crl_list->issuer, &ca->subject ) != 0 ) { crl_list = crl_list->next; continue; } /* * Check if the CA is configured to sign CRLs */ #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) if( mbedtls_x509_crt_check_key_usage( ca, MBEDTLS_X509_KU_CRL_SIGN ) != 0 ) { flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED; break; } #endif /* * Check if CRL is correctly signed by the trusted CA */ if( x509_profile_check_md_alg( profile, crl_list->sig_md ) != 0 ) flags |= MBEDTLS_X509_BADCRL_BAD_MD; if( x509_profile_check_pk_alg( profile, crl_list->sig_pk ) != 0 ) flags |= MBEDTLS_X509_BADCRL_BAD_PK; md_info = mbedtls_md_info_from_type( crl_list->sig_md ); if( mbedtls_md( md_info, crl_list->tbs.p, crl_list->tbs.len, hash ) != 0 ) { /* Note: this can't happen except after an internal error */ flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED; break; } if( x509_profile_check_key( profile, &ca->pk ) != 0 ) flags |= MBEDTLS_X509_BADCERT_BAD_KEY; if( mbedtls_pk_verify_ext( crl_list->sig_pk, crl_list->sig_opts, &ca->pk, crl_list->sig_md, hash, mbedtls_md_get_size( md_info ), crl_list->sig.p, crl_list->sig.len ) != 0 ) { flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED; break; } /* * Check for validity of CRL (Do not drop out) */ if( mbedtls_x509_time_is_past( &crl_list->next_update ) ) flags |= MBEDTLS_X509_BADCRL_EXPIRED; if( mbedtls_x509_time_is_future( &crl_list->this_update ) ) flags |= MBEDTLS_X509_BADCRL_FUTURE; /* * Check if certificate is revoked */ if( mbedtls_x509_crt_is_revoked( crt, crl_list ) ) { flags |= MBEDTLS_X509_BADCERT_REVOKED; break; } crl_list = crl_list->next; } return( flags ); } #endif /* MBEDTLS_X509_CRL_PARSE_C */ /* * Check the signature of a certificate by its parent */ static int x509_crt_check_signature( const mbedtls_x509_crt *child, mbedtls_x509_crt *parent, mbedtls_x509_crt_restart_ctx *rs_ctx ) { const mbedtls_md_info_t *md_info; unsigned char hash[MBEDTLS_MD_MAX_SIZE]; md_info = mbedtls_md_info_from_type( child->sig_md ); if( mbedtls_md( md_info, child->tbs.p, child->tbs.len, hash ) != 0 ) { /* Note: this can't happen except after an internal error */ return( -1 ); } /* Skip expensive computation on obvious mismatch */ if( ! mbedtls_pk_can_do( &parent->pk, child->sig_pk ) ) return( -1 ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && child->sig_pk == MBEDTLS_PK_ECDSA ) { return( mbedtls_pk_verify_restartable( &parent->pk, child->sig_md, hash, mbedtls_md_get_size( md_info ), child->sig.p, child->sig.len, &rs_ctx->pk ) ); } #else (void) rs_ctx; #endif return( mbedtls_pk_verify_ext( child->sig_pk, child->sig_opts, &parent->pk, child->sig_md, hash, mbedtls_md_get_size( md_info ), child->sig.p, child->sig.len ) ); } /* * Check if 'parent' is a suitable parent (signing CA) for 'child'. * Return 0 if yes, -1 if not. * * top means parent is a locally-trusted certificate */ static int x509_crt_check_parent( const mbedtls_x509_crt *child, const mbedtls_x509_crt *parent, int top ) { int need_ca_bit; /* Parent must be the issuer */ if( x509_name_cmp( &child->issuer, &parent->subject ) != 0 ) return( -1 ); /* Parent must have the basicConstraints CA bit set as a general rule */ need_ca_bit = 1; /* Exception: v1/v2 certificates that are locally trusted. */ if( top && parent->version < 3 ) need_ca_bit = 0; if( need_ca_bit && ! parent->ca_istrue ) return( -1 ); #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) if( need_ca_bit && mbedtls_x509_crt_check_key_usage( parent, MBEDTLS_X509_KU_KEY_CERT_SIGN ) != 0 ) { return( -1 ); } #endif return( 0 ); } /* * Find a suitable parent for child in candidates, or return NULL. * * Here suitable is defined as: * 1. subject name matches child's issuer * 2. if necessary, the CA bit is set and key usage allows signing certs * 3. for trusted roots, the signature is correct * (for intermediates, the signature is checked and the result reported) * 4. pathlen constraints are satisfied * * If there's a suitable candidate which is also time-valid, return the first * such. Otherwise, return the first suitable candidate (or NULL if there is * none). * * The rationale for this rule is that someone could have a list of trusted * roots with two versions on the same root with different validity periods. * (At least one user reported having such a list and wanted it to just work.) * The reason we don't just require time-validity is that generally there is * only one version, and if it's expired we want the flags to state that * rather than NOT_TRUSTED, as would be the case if we required it here. * * The rationale for rule 3 (signature for trusted roots) is that users might * have two versions of the same CA with different keys in their list, and the * way we select the correct one is by checking the signature (as we don't * rely on key identifier extensions). (This is one way users might choose to * handle key rollover, another relies on self-issued certs, see [SIRO].) * * Arguments: * - [in] child: certificate for which we're looking for a parent * - [in] candidates: chained list of potential parents * - [out] r_parent: parent found (or NULL) * - [out] r_signature_is_good: 1 if child signature by parent is valid, or 0 * - [in] top: 1 if candidates consists of trusted roots, ie we're at the top * of the chain, 0 otherwise * - [in] path_cnt: number of intermediates seen so far * - [in] self_cnt: number of self-signed intermediates seen so far * (will never be greater than path_cnt) * - [in-out] rs_ctx: context for restarting operations * * Return value: * - 0 on success * - MBEDTLS_ERR_ECP_IN_PROGRESS otherwise */ static int x509_crt_find_parent_in( mbedtls_x509_crt *child, mbedtls_x509_crt *candidates, mbedtls_x509_crt **r_parent, int *r_signature_is_good, int top, unsigned path_cnt, unsigned self_cnt, mbedtls_x509_crt_restart_ctx *rs_ctx ) { int ret; mbedtls_x509_crt *parent, *fallback_parent; int signature_is_good, fallback_signature_is_good; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* did we have something in progress? */ if( rs_ctx != NULL && rs_ctx->parent != NULL ) { /* restore saved state */ parent = rs_ctx->parent; fallback_parent = rs_ctx->fallback_parent; fallback_signature_is_good = rs_ctx->fallback_signature_is_good; /* clear saved state */ rs_ctx->parent = NULL; rs_ctx->fallback_parent = NULL; rs_ctx->fallback_signature_is_good = 0; /* resume where we left */ goto check_signature; } #endif fallback_parent = NULL; fallback_signature_is_good = 0; for( parent = candidates; parent != NULL; parent = parent->next ) { /* basic parenting skills (name, CA bit, key usage) */ if( x509_crt_check_parent( child, parent, top ) != 0 ) continue; /* +1 because stored max_pathlen is 1 higher that the actual value */ if( parent->max_pathlen > 0 && (size_t) parent->max_pathlen < 1 + path_cnt - self_cnt ) { continue; } /* Signature */ #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) check_signature: #endif ret = x509_crt_check_signature( child, parent, rs_ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { /* save state */ rs_ctx->parent = parent; rs_ctx->fallback_parent = fallback_parent; rs_ctx->fallback_signature_is_good = fallback_signature_is_good; return( ret ); } #else (void) ret; #endif signature_is_good = ret == 0; if( top && ! signature_is_good ) continue; /* optional time check */ if( mbedtls_x509_time_is_past( &parent->valid_to ) || mbedtls_x509_time_is_future( &parent->valid_from ) ) { if( fallback_parent == NULL ) { fallback_parent = parent; fallback_signature_is_good = signature_is_good; } continue; } break; } if( parent != NULL ) { *r_parent = parent; *r_signature_is_good = signature_is_good; } else { *r_parent = fallback_parent; *r_signature_is_good = fallback_signature_is_good; } return( 0 ); } /* * Find a parent in trusted CAs or the provided chain, or return NULL. * * Searches in trusted CAs first, and return the first suitable parent found * (see find_parent_in() for definition of suitable). * * Arguments: * - [in] child: certificate for which we're looking for a parent, followed * by a chain of possible intermediates * - [in] trust_ca: list of locally trusted certificates * - [out] parent: parent found (or NULL) * - [out] parent_is_trusted: 1 if returned `parent` is trusted, or 0 * - [out] signature_is_good: 1 if child signature by parent is valid, or 0 * - [in] path_cnt: number of links in the chain so far (EE -> ... -> child) * - [in] self_cnt: number of self-signed certs in the chain so far * (will always be no greater than path_cnt) * - [in-out] rs_ctx: context for restarting operations * * Return value: * - 0 on success * - MBEDTLS_ERR_ECP_IN_PROGRESS otherwise */ static int x509_crt_find_parent( mbedtls_x509_crt *child, mbedtls_x509_crt *trust_ca, mbedtls_x509_crt **parent, int *parent_is_trusted, int *signature_is_good, unsigned path_cnt, unsigned self_cnt, mbedtls_x509_crt_restart_ctx *rs_ctx ) { int ret; mbedtls_x509_crt *search_list; *parent_is_trusted = 1; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* restore then clear saved state if we have some stored */ if( rs_ctx != NULL && rs_ctx->parent_is_trusted != -1 ) { *parent_is_trusted = rs_ctx->parent_is_trusted; rs_ctx->parent_is_trusted = -1; } #endif while( 1 ) { search_list = *parent_is_trusted ? trust_ca : child->next; ret = x509_crt_find_parent_in( child, search_list, parent, signature_is_good, *parent_is_trusted, path_cnt, self_cnt, rs_ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { /* save state */ rs_ctx->parent_is_trusted = *parent_is_trusted; return( ret ); } #else (void) ret; #endif /* stop here if found or already in second iteration */ if( *parent != NULL || *parent_is_trusted == 0 ) break; /* prepare second iteration */ *parent_is_trusted = 0; } /* extra precaution against mistakes in the caller */ if( *parent == NULL ) { *parent_is_trusted = 0; *signature_is_good = 0; } return( 0 ); } /* * Check if an end-entity certificate is locally trusted * * Currently we require such certificates to be self-signed (actually only * check for self-issued as self-signatures are not checked) */ static int x509_crt_check_ee_locally_trusted( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca ) { mbedtls_x509_crt *cur; /* must be self-issued */ if( x509_name_cmp( &crt->issuer, &crt->subject ) != 0 ) return( -1 ); /* look for an exact match with trusted cert */ for( cur = trust_ca; cur != NULL; cur = cur->next ) { if( crt->raw.len == cur->raw.len && memcmp( crt->raw.p, cur->raw.p, crt->raw.len ) == 0 ) { return( 0 ); } } /* too bad */ return( -1 ); } /* * Build and verify a certificate chain * * Given a peer-provided list of certificates EE, C1, ..., Cn and * a list of trusted certs R1, ... Rp, try to build and verify a chain * EE, Ci1, ... Ciq [, Rj] * such that every cert in the chain is a child of the next one, * jumping to a trusted root as early as possible. * * Verify that chain and return it with flags for all issues found. * * Special cases: * - EE == Rj -> return a one-element list containing it * - EE, Ci1, ..., Ciq cannot be continued with a trusted root * -> return that chain with NOT_TRUSTED set on Ciq * * Tests for (aspects of) this function should include at least: * - trusted EE * - EE -> trusted root * - EE -> intermedate CA -> trusted root * - if relevant: EE untrusted * - if relevant: EE -> intermediate, untrusted * with the aspect under test checked at each relevant level (EE, int, root). * For some aspects longer chains are required, but usually length 2 is * enough (but length 1 is not in general). * * Arguments: * - [in] crt: the cert list EE, C1, ..., Cn * - [in] trust_ca: the trusted list R1, ..., Rp * - [in] ca_crl, profile: as in verify_with_profile() * - [out] ver_chain: the built and verified chain * Only valid when return value is 0, may contain garbage otherwise! * Restart note: need not be the same when calling again to resume. * - [in-out] rs_ctx: context for restarting operations * * Return value: * - non-zero if the chain could not be fully built and examined * - 0 is the chain was successfully built and examined, * even if it was found to be invalid */ static int x509_crt_verify_chain( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, mbedtls_x509_crt_verify_chain *ver_chain, mbedtls_x509_crt_restart_ctx *rs_ctx ) { /* Don't initialize any of those variables here, so that the compiler can * catch potential issues with jumping ahead when restarting */ int ret; uint32_t *flags; mbedtls_x509_crt_verify_chain_item *cur; mbedtls_x509_crt *child; mbedtls_x509_crt *parent; int parent_is_trusted; int child_is_trusted; int signature_is_good; unsigned self_cnt; #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* resume if we had an operation in progress */ if( rs_ctx != NULL && rs_ctx->in_progress == x509_crt_rs_find_parent ) { /* restore saved state */ *ver_chain = rs_ctx->ver_chain; /* struct copy */ self_cnt = rs_ctx->self_cnt; /* restore derived state */ cur = &ver_chain->items[ver_chain->len - 1]; child = cur->crt; flags = &cur->flags; goto find_parent; } #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ child = crt; self_cnt = 0; parent_is_trusted = 0; child_is_trusted = 0; while( 1 ) { /* Add certificate to the verification chain */ cur = &ver_chain->items[ver_chain->len]; cur->crt = child; cur->flags = 0; ver_chain->len++; flags = &cur->flags; /* Check time-validity (all certificates) */ if( mbedtls_x509_time_is_past( &child->valid_to ) ) *flags |= MBEDTLS_X509_BADCERT_EXPIRED; if( mbedtls_x509_time_is_future( &child->valid_from ) ) *flags |= MBEDTLS_X509_BADCERT_FUTURE; /* Stop here for trusted roots (but not for trusted EE certs) */ if( child_is_trusted ) return( 0 ); /* Check signature algorithm: MD & PK algs */ if( x509_profile_check_md_alg( profile, child->sig_md ) != 0 ) *flags |= MBEDTLS_X509_BADCERT_BAD_MD; if( x509_profile_check_pk_alg( profile, child->sig_pk ) != 0 ) *flags |= MBEDTLS_X509_BADCERT_BAD_PK; /* Special case: EE certs that are locally trusted */ if( ver_chain->len == 1 && x509_crt_check_ee_locally_trusted( child, trust_ca ) == 0 ) { return( 0 ); } #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) find_parent: #endif /* Look for a parent in trusted CAs or up the chain */ ret = x509_crt_find_parent( child, trust_ca, &parent, &parent_is_trusted, &signature_is_good, ver_chain->len - 1, self_cnt, rs_ctx ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { /* save state */ rs_ctx->in_progress = x509_crt_rs_find_parent; rs_ctx->self_cnt = self_cnt; rs_ctx->ver_chain = *ver_chain; /* struct copy */ return( ret ); } #else (void) ret; #endif /* No parent? We're done here */ if( parent == NULL ) { *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED; return( 0 ); } /* Count intermediate self-issued (not necessarily self-signed) certs. * These can occur with some strategies for key rollover, see [SIRO], * and should be excluded from max_pathlen checks. */ if( ver_chain->len != 1 && x509_name_cmp( &child->issuer, &child->subject ) == 0 ) { self_cnt++; } /* path_cnt is 0 for the first intermediate CA, * and if parent is trusted it's not an intermediate CA */ if( ! parent_is_trusted && ver_chain->len > MBEDTLS_X509_MAX_INTERMEDIATE_CA ) { /* return immediately to avoid overflow the chain array */ return( MBEDTLS_ERR_X509_FATAL_ERROR ); } /* signature was checked while searching parent */ if( ! signature_is_good ) *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED; /* check size of signing key */ if( x509_profile_check_key( profile, &parent->pk ) != 0 ) *flags |= MBEDTLS_X509_BADCERT_BAD_KEY; #if defined(MBEDTLS_X509_CRL_PARSE_C) /* Check trusted CA's CRL for the given crt */ *flags |= x509_crt_verifycrl( child, parent, ca_crl, profile ); #else (void) ca_crl; #endif /* prepare for next iteration */ child = parent; parent = NULL; child_is_trusted = parent_is_trusted; signature_is_good = 0; } } /* * Check for CN match */ static int x509_crt_check_cn( const mbedtls_x509_buf *name, const char *cn, size_t cn_len ) { /* try exact match */ if( name->len == cn_len && x509_memcasecmp( cn, name->p, cn_len ) == 0 ) { return( 0 ); } /* try wildcard match */ if( x509_check_wildcard( cn, name ) == 0 ) { return( 0 ); } return( -1 ); } /* * Verify the requested CN - only call this if cn is not NULL! */ static void x509_crt_verify_name( const mbedtls_x509_crt *crt, const char *cn, uint32_t *flags ) { const mbedtls_x509_name *name; const mbedtls_x509_sequence *cur; size_t cn_len = strlen( cn ); if( crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME ) { for( cur = &crt->subject_alt_names; cur != NULL; cur = cur->next ) { if( x509_crt_check_cn( &cur->buf, cn, cn_len ) == 0 ) break; } if( cur == NULL ) *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; } else { for( name = &crt->subject; name != NULL; name = name->next ) { if( MBEDTLS_OID_CMP( MBEDTLS_OID_AT_CN, &name->oid ) == 0 && x509_crt_check_cn( &name->val, cn, cn_len ) == 0 ) { break; } } if( name == NULL ) *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH; } } /* * Merge the flags for all certs in the chain, after calling callback */ static int x509_crt_merge_flags_with_cb( uint32_t *flags, const mbedtls_x509_crt_verify_chain *ver_chain, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ) { int ret; unsigned i; uint32_t cur_flags; const mbedtls_x509_crt_verify_chain_item *cur; for( i = ver_chain->len; i != 0; --i ) { cur = &ver_chain->items[i-1]; cur_flags = cur->flags; if( NULL != f_vrfy ) if( ( ret = f_vrfy( p_vrfy, cur->crt, (int) i-1, &cur_flags ) ) != 0 ) return( ret ); *flags |= cur_flags; } return( 0 ); } /* * Verify the certificate validity (default profile, not restartable) */ int mbedtls_x509_crt_verify( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ) { return( mbedtls_x509_crt_verify_restartable( crt, trust_ca, ca_crl, &mbedtls_x509_crt_profile_default, cn, flags, f_vrfy, p_vrfy, NULL ) ); } /* * Verify the certificate validity (user-chosen profile, not restartable) */ int mbedtls_x509_crt_verify_with_profile( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ) { return( mbedtls_x509_crt_verify_restartable( crt, trust_ca, ca_crl, profile, cn, flags, f_vrfy, p_vrfy, NULL ) ); } /* * Verify the certificate validity, with profile, restartable version * * This function: * - checks the requested CN (if any) * - checks the type and size of the EE cert's key, * as that isn't done as part of chain building/verification currently * - builds and verifies the chain * - then calls the callback and merges the flags */ int mbedtls_x509_crt_verify_restartable( mbedtls_x509_crt *crt, mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl, const mbedtls_x509_crt_profile *profile, const char *cn, uint32_t *flags, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy, mbedtls_x509_crt_restart_ctx *rs_ctx ) { int ret; mbedtls_pk_type_t pk_type; mbedtls_x509_crt_verify_chain ver_chain; uint32_t ee_flags; *flags = 0; ee_flags = 0; x509_crt_verify_chain_reset( &ver_chain ); if( profile == NULL ) { ret = MBEDTLS_ERR_X509_BAD_INPUT_DATA; goto exit; } /* check name if requested */ if( cn != NULL ) x509_crt_verify_name( crt, cn, &ee_flags ); /* Check the type and size of the key */ pk_type = mbedtls_pk_get_type( &crt->pk ); if( x509_profile_check_pk_alg( profile, pk_type ) != 0 ) ee_flags |= MBEDTLS_X509_BADCERT_BAD_PK; if( x509_profile_check_key( profile, &crt->pk ) != 0 ) ee_flags |= MBEDTLS_X509_BADCERT_BAD_KEY; /* Check the chain */ ret = x509_crt_verify_chain( crt, trust_ca, ca_crl, profile, &ver_chain, rs_ctx ); if( ret != 0 ) goto exit; /* Merge end-entity flags */ ver_chain.items[0].flags |= ee_flags; /* Build final flags, calling callback on the way if any */ ret = x509_crt_merge_flags_with_cb( flags, &ver_chain, f_vrfy, p_vrfy ); exit: #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) mbedtls_x509_crt_restart_free( rs_ctx ); #endif /* prevent misuse of the vrfy callback - VERIFY_FAILED would be ignored by * the SSL module for authmode optional, but non-zero return from the * callback means a fatal error so it shouldn't be ignored */ if( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ) ret = MBEDTLS_ERR_X509_FATAL_ERROR; if( ret != 0 ) { *flags = (uint32_t) -1; return( ret ); } if( *flags != 0 ) return( MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ); return( 0 ); } /* * Initialize a certificate chain */ void mbedtls_x509_crt_init( mbedtls_x509_crt *crt ) { memset( crt, 0, sizeof(mbedtls_x509_crt) ); } /* * Unallocate all certificate data */ void mbedtls_x509_crt_free( mbedtls_x509_crt *crt ) { mbedtls_x509_crt *cert_cur = crt; mbedtls_x509_crt *cert_prv; mbedtls_x509_name *name_cur; mbedtls_x509_name *name_prv; mbedtls_x509_sequence *seq_cur; mbedtls_x509_sequence *seq_prv; if( crt == NULL ) return; do { mbedtls_pk_free( &cert_cur->pk ); #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) mbedtls_free( cert_cur->sig_opts ); #endif name_cur = cert_cur->issuer.next; while( name_cur != NULL ) { name_prv = name_cur; name_cur = name_cur->next; mbedtls_platform_zeroize( name_prv, sizeof( mbedtls_x509_name ) ); mbedtls_free( name_prv ); } name_cur = cert_cur->subject.next; while( name_cur != NULL ) { name_prv = name_cur; name_cur = name_cur->next; mbedtls_platform_zeroize( name_prv, sizeof( mbedtls_x509_name ) ); mbedtls_free( name_prv ); } seq_cur = cert_cur->ext_key_usage.next; while( seq_cur != NULL ) { seq_prv = seq_cur; seq_cur = seq_cur->next; mbedtls_platform_zeroize( seq_prv, sizeof( mbedtls_x509_sequence ) ); mbedtls_free( seq_prv ); } seq_cur = cert_cur->subject_alt_names.next; while( seq_cur != NULL ) { seq_prv = seq_cur; seq_cur = seq_cur->next; mbedtls_platform_zeroize( seq_prv, sizeof( mbedtls_x509_sequence ) ); mbedtls_free( seq_prv ); } if( cert_cur->raw.p != NULL ) { mbedtls_platform_zeroize( cert_cur->raw.p, cert_cur->raw.len ); mbedtls_free( cert_cur->raw.p ); } cert_cur = cert_cur->next; } while( cert_cur != NULL ); cert_cur = crt; do { cert_prv = cert_cur; cert_cur = cert_cur->next; mbedtls_platform_zeroize( cert_prv, sizeof( mbedtls_x509_crt ) ); if( cert_prv != crt ) mbedtls_free( cert_prv ); } while( cert_cur != NULL ); } #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* * Initialize a restart context */ void mbedtls_x509_crt_restart_init( mbedtls_x509_crt_restart_ctx *ctx ) { mbedtls_pk_restart_init( &ctx->pk ); ctx->parent = NULL; ctx->fallback_parent = NULL; ctx->fallback_signature_is_good = 0; ctx->parent_is_trusted = -1; ctx->in_progress = x509_crt_rs_none; ctx->self_cnt = 0; x509_crt_verify_chain_reset( &ctx->ver_chain ); } /* * Free the components of a restart context */ void mbedtls_x509_crt_restart_free( mbedtls_x509_crt_restart_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_pk_restart_free( &ctx->pk ); mbedtls_x509_crt_restart_init( ctx ); } #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_X509_CRT_PARSE_C */ fldigi-4.2.05/src/mbedtls/chacha20.c0000664000175000017500000004734014611711171013731 00000000000000/** * \file chacha20.c * * \brief ChaCha20 cipher. * * \author Daniel King * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CHACHA20_C) #include "mbedtls/chacha20.h" #include "mbedtls/platform_util.h" #include #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_CHACHA20_ALT) #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* Parameter validation macros */ #define CHACHA20_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA ) #define CHACHA20_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define BYTES_TO_U32_LE( data, offset ) \ ( (uint32_t) data[offset] \ | (uint32_t) ( (uint32_t) data[( offset ) + 1] << 8 ) \ | (uint32_t) ( (uint32_t) data[( offset ) + 2] << 16 ) \ | (uint32_t) ( (uint32_t) data[( offset ) + 3] << 24 ) \ ) #define ROTL32( value, amount ) \ ( (uint32_t) ( value << amount ) | ( value >> ( 32 - amount ) ) ) #define CHACHA20_CTR_INDEX ( 12U ) #define CHACHA20_BLOCK_SIZE_BYTES ( 4U * 16U ) /** * \brief ChaCha20 quarter round operation. * * The quarter round is defined as follows (from RFC 7539): * 1. a += b; d ^= a; d <<<= 16; * 2. c += d; b ^= c; b <<<= 12; * 3. a += b; d ^= a; d <<<= 8; * 4. c += d; b ^= c; b <<<= 7; * * \param state ChaCha20 state to modify. * \param a The index of 'a' in the state. * \param b The index of 'b' in the state. * \param c The index of 'c' in the state. * \param d The index of 'd' in the state. */ static inline void chacha20_quarter_round( uint32_t state[16], size_t a, size_t b, size_t c, size_t d ) { /* a += b; d ^= a; d <<<= 16; */ state[a] += state[b]; state[d] ^= state[a]; state[d] = ROTL32( state[d], 16 ); /* c += d; b ^= c; b <<<= 12 */ state[c] += state[d]; state[b] ^= state[c]; state[b] = ROTL32( state[b], 12 ); /* a += b; d ^= a; d <<<= 8; */ state[a] += state[b]; state[d] ^= state[a]; state[d] = ROTL32( state[d], 8 ); /* c += d; b ^= c; b <<<= 7; */ state[c] += state[d]; state[b] ^= state[c]; state[b] = ROTL32( state[b], 7 ); } /** * \brief Perform the ChaCha20 inner block operation. * * This function performs two rounds: the column round and the * diagonal round. * * \param state The ChaCha20 state to update. */ static void chacha20_inner_block( uint32_t state[16] ) { chacha20_quarter_round( state, 0, 4, 8, 12 ); chacha20_quarter_round( state, 1, 5, 9, 13 ); chacha20_quarter_round( state, 2, 6, 10, 14 ); chacha20_quarter_round( state, 3, 7, 11, 15 ); chacha20_quarter_round( state, 0, 5, 10, 15 ); chacha20_quarter_round( state, 1, 6, 11, 12 ); chacha20_quarter_round( state, 2, 7, 8, 13 ); chacha20_quarter_round( state, 3, 4, 9, 14 ); } /** * \brief Generates a keystream block. * * \param initial_state The initial ChaCha20 state (key, nonce, counter). * \param keystream Generated keystream bytes are written to this buffer. */ static void chacha20_block( const uint32_t initial_state[16], unsigned char keystream[64] ) { uint32_t working_state[16]; size_t i; memcpy( working_state, initial_state, CHACHA20_BLOCK_SIZE_BYTES ); for( i = 0U; i < 10U; i++ ) chacha20_inner_block( working_state ); working_state[ 0] += initial_state[ 0]; working_state[ 1] += initial_state[ 1]; working_state[ 2] += initial_state[ 2]; working_state[ 3] += initial_state[ 3]; working_state[ 4] += initial_state[ 4]; working_state[ 5] += initial_state[ 5]; working_state[ 6] += initial_state[ 6]; working_state[ 7] += initial_state[ 7]; working_state[ 8] += initial_state[ 8]; working_state[ 9] += initial_state[ 9]; working_state[10] += initial_state[10]; working_state[11] += initial_state[11]; working_state[12] += initial_state[12]; working_state[13] += initial_state[13]; working_state[14] += initial_state[14]; working_state[15] += initial_state[15]; for( i = 0U; i < 16; i++ ) { size_t offset = i * 4U; keystream[offset ] = (unsigned char)( working_state[i] ); keystream[offset + 1U] = (unsigned char)( working_state[i] >> 8 ); keystream[offset + 2U] = (unsigned char)( working_state[i] >> 16 ); keystream[offset + 3U] = (unsigned char)( working_state[i] >> 24 ); } mbedtls_platform_zeroize( working_state, sizeof( working_state ) ); } void mbedtls_chacha20_init( mbedtls_chacha20_context *ctx ) { CHACHA20_VALIDATE( ctx != NULL ); mbedtls_platform_zeroize( ctx->state, sizeof( ctx->state ) ); mbedtls_platform_zeroize( ctx->keystream8, sizeof( ctx->keystream8 ) ); /* Initially, there's no keystream bytes available */ ctx->keystream_bytes_used = CHACHA20_BLOCK_SIZE_BYTES; } void mbedtls_chacha20_free( mbedtls_chacha20_context *ctx ) { if( ctx != NULL ) { mbedtls_platform_zeroize( ctx, sizeof( mbedtls_chacha20_context ) ); } } int mbedtls_chacha20_setkey( mbedtls_chacha20_context *ctx, const unsigned char key[32] ) { CHACHA20_VALIDATE_RET( ctx != NULL ); CHACHA20_VALIDATE_RET( key != NULL ); /* ChaCha20 constants - the string "expand 32-byte k" */ ctx->state[0] = 0x61707865; ctx->state[1] = 0x3320646e; ctx->state[2] = 0x79622d32; ctx->state[3] = 0x6b206574; /* Set key */ ctx->state[4] = BYTES_TO_U32_LE( key, 0 ); ctx->state[5] = BYTES_TO_U32_LE( key, 4 ); ctx->state[6] = BYTES_TO_U32_LE( key, 8 ); ctx->state[7] = BYTES_TO_U32_LE( key, 12 ); ctx->state[8] = BYTES_TO_U32_LE( key, 16 ); ctx->state[9] = BYTES_TO_U32_LE( key, 20 ); ctx->state[10] = BYTES_TO_U32_LE( key, 24 ); ctx->state[11] = BYTES_TO_U32_LE( key, 28 ); return( 0 ); } int mbedtls_chacha20_starts( mbedtls_chacha20_context* ctx, const unsigned char nonce[12], uint32_t counter ) { CHACHA20_VALIDATE_RET( ctx != NULL ); CHACHA20_VALIDATE_RET( nonce != NULL ); /* Counter */ ctx->state[12] = counter; /* Nonce */ ctx->state[13] = BYTES_TO_U32_LE( nonce, 0 ); ctx->state[14] = BYTES_TO_U32_LE( nonce, 4 ); ctx->state[15] = BYTES_TO_U32_LE( nonce, 8 ); mbedtls_platform_zeroize( ctx->keystream8, sizeof( ctx->keystream8 ) ); /* Initially, there's no keystream bytes available */ ctx->keystream_bytes_used = CHACHA20_BLOCK_SIZE_BYTES; return( 0 ); } int mbedtls_chacha20_update( mbedtls_chacha20_context *ctx, size_t size, const unsigned char *input, unsigned char *output ) { size_t offset = 0U; size_t i; CHACHA20_VALIDATE_RET( ctx != NULL ); CHACHA20_VALIDATE_RET( size == 0 || input != NULL ); CHACHA20_VALIDATE_RET( size == 0 || output != NULL ); /* Use leftover keystream bytes, if available */ while( size > 0U && ctx->keystream_bytes_used < CHACHA20_BLOCK_SIZE_BYTES ) { output[offset] = input[offset] ^ ctx->keystream8[ctx->keystream_bytes_used]; ctx->keystream_bytes_used++; offset++; size--; } /* Process full blocks */ while( size >= CHACHA20_BLOCK_SIZE_BYTES ) { /* Generate new keystream block and increment counter */ chacha20_block( ctx->state, ctx->keystream8 ); ctx->state[CHACHA20_CTR_INDEX]++; for( i = 0U; i < 64U; i += 8U ) { output[offset + i ] = input[offset + i ] ^ ctx->keystream8[i ]; output[offset + i+1] = input[offset + i+1] ^ ctx->keystream8[i+1]; output[offset + i+2] = input[offset + i+2] ^ ctx->keystream8[i+2]; output[offset + i+3] = input[offset + i+3] ^ ctx->keystream8[i+3]; output[offset + i+4] = input[offset + i+4] ^ ctx->keystream8[i+4]; output[offset + i+5] = input[offset + i+5] ^ ctx->keystream8[i+5]; output[offset + i+6] = input[offset + i+6] ^ ctx->keystream8[i+6]; output[offset + i+7] = input[offset + i+7] ^ ctx->keystream8[i+7]; } offset += CHACHA20_BLOCK_SIZE_BYTES; size -= CHACHA20_BLOCK_SIZE_BYTES; } /* Last (partial) block */ if( size > 0U ) { /* Generate new keystream block and increment counter */ chacha20_block( ctx->state, ctx->keystream8 ); ctx->state[CHACHA20_CTR_INDEX]++; for( i = 0U; i < size; i++) { output[offset + i] = input[offset + i] ^ ctx->keystream8[i]; } ctx->keystream_bytes_used = size; } return( 0 ); } int mbedtls_chacha20_crypt( const unsigned char key[32], const unsigned char nonce[12], uint32_t counter, size_t data_len, const unsigned char* input, unsigned char* output ) { mbedtls_chacha20_context ctx; int ret; CHACHA20_VALIDATE_RET( key != NULL ); CHACHA20_VALIDATE_RET( nonce != NULL ); CHACHA20_VALIDATE_RET( data_len == 0 || input != NULL ); CHACHA20_VALIDATE_RET( data_len == 0 || output != NULL ); mbedtls_chacha20_init( &ctx ); ret = mbedtls_chacha20_setkey( &ctx, key ); if( ret != 0 ) goto cleanup; ret = mbedtls_chacha20_starts( &ctx, nonce, counter ); if( ret != 0 ) goto cleanup; ret = mbedtls_chacha20_update( &ctx, data_len, input, output ); cleanup: mbedtls_chacha20_free( &ctx ); return( ret ); } #endif /* !MBEDTLS_CHACHA20_ALT */ #if defined(MBEDTLS_SELF_TEST) static const unsigned char test_keys[2][32] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } }; static const unsigned char test_nonces[2][12] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 } }; static const uint32_t test_counters[2] = { 0U, 1U }; static const unsigned char test_input[2][375] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x41, 0x6e, 0x79, 0x20, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2d, 0x44, 0x72, 0x61, 0x66, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x52, 0x46, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x22, 0x49, 0x45, 0x54, 0x46, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x20, 0x53, 0x75, 0x63, 0x68, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x20, 0x61, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f } }; static const unsigned char test_output[2][375] = { { 0x76, 0xb8, 0xe0, 0xad, 0xa0, 0xf1, 0x3d, 0x90, 0x40, 0x5d, 0x6a, 0xe5, 0x53, 0x86, 0xbd, 0x28, 0xbd, 0xd2, 0x19, 0xb8, 0xa0, 0x8d, 0xed, 0x1a, 0xa8, 0x36, 0xef, 0xcc, 0x8b, 0x77, 0x0d, 0xc7, 0xda, 0x41, 0x59, 0x7c, 0x51, 0x57, 0x48, 0x8d, 0x77, 0x24, 0xe0, 0x3f, 0xb8, 0xd8, 0x4a, 0x37, 0x6a, 0x43, 0xb8, 0xf4, 0x15, 0x18, 0xa1, 0x1c, 0xc3, 0x87, 0xb6, 0x69, 0xb2, 0xee, 0x65, 0x86 }, { 0xa3, 0xfb, 0xf0, 0x7d, 0xf3, 0xfa, 0x2f, 0xde, 0x4f, 0x37, 0x6c, 0xa2, 0x3e, 0x82, 0x73, 0x70, 0x41, 0x60, 0x5d, 0x9f, 0x4f, 0x4f, 0x57, 0xbd, 0x8c, 0xff, 0x2c, 0x1d, 0x4b, 0x79, 0x55, 0xec, 0x2a, 0x97, 0x94, 0x8b, 0xd3, 0x72, 0x29, 0x15, 0xc8, 0xf3, 0xd3, 0x37, 0xf7, 0xd3, 0x70, 0x05, 0x0e, 0x9e, 0x96, 0xd6, 0x47, 0xb7, 0xc3, 0x9f, 0x56, 0xe0, 0x31, 0xca, 0x5e, 0xb6, 0x25, 0x0d, 0x40, 0x42, 0xe0, 0x27, 0x85, 0xec, 0xec, 0xfa, 0x4b, 0x4b, 0xb5, 0xe8, 0xea, 0xd0, 0x44, 0x0e, 0x20, 0xb6, 0xe8, 0xdb, 0x09, 0xd8, 0x81, 0xa7, 0xc6, 0x13, 0x2f, 0x42, 0x0e, 0x52, 0x79, 0x50, 0x42, 0xbd, 0xfa, 0x77, 0x73, 0xd8, 0xa9, 0x05, 0x14, 0x47, 0xb3, 0x29, 0x1c, 0xe1, 0x41, 0x1c, 0x68, 0x04, 0x65, 0x55, 0x2a, 0xa6, 0xc4, 0x05, 0xb7, 0x76, 0x4d, 0x5e, 0x87, 0xbe, 0xa8, 0x5a, 0xd0, 0x0f, 0x84, 0x49, 0xed, 0x8f, 0x72, 0xd0, 0xd6, 0x62, 0xab, 0x05, 0x26, 0x91, 0xca, 0x66, 0x42, 0x4b, 0xc8, 0x6d, 0x2d, 0xf8, 0x0e, 0xa4, 0x1f, 0x43, 0xab, 0xf9, 0x37, 0xd3, 0x25, 0x9d, 0xc4, 0xb2, 0xd0, 0xdf, 0xb4, 0x8a, 0x6c, 0x91, 0x39, 0xdd, 0xd7, 0xf7, 0x69, 0x66, 0xe9, 0x28, 0xe6, 0x35, 0x55, 0x3b, 0xa7, 0x6c, 0x5c, 0x87, 0x9d, 0x7b, 0x35, 0xd4, 0x9e, 0xb2, 0xe6, 0x2b, 0x08, 0x71, 0xcd, 0xac, 0x63, 0x89, 0x39, 0xe2, 0x5e, 0x8a, 0x1e, 0x0e, 0xf9, 0xd5, 0x28, 0x0f, 0xa8, 0xca, 0x32, 0x8b, 0x35, 0x1c, 0x3c, 0x76, 0x59, 0x89, 0xcb, 0xcf, 0x3d, 0xaa, 0x8b, 0x6c, 0xcc, 0x3a, 0xaf, 0x9f, 0x39, 0x79, 0xc9, 0x2b, 0x37, 0x20, 0xfc, 0x88, 0xdc, 0x95, 0xed, 0x84, 0xa1, 0xbe, 0x05, 0x9c, 0x64, 0x99, 0xb9, 0xfd, 0xa2, 0x36, 0xe7, 0xe8, 0x18, 0xb0, 0x4b, 0x0b, 0xc3, 0x9c, 0x1e, 0x87, 0x6b, 0x19, 0x3b, 0xfe, 0x55, 0x69, 0x75, 0x3f, 0x88, 0x12, 0x8c, 0xc0, 0x8a, 0xaa, 0x9b, 0x63, 0xd1, 0xa1, 0x6f, 0x80, 0xef, 0x25, 0x54, 0xd7, 0x18, 0x9c, 0x41, 0x1f, 0x58, 0x69, 0xca, 0x52, 0xc5, 0xb8, 0x3f, 0xa3, 0x6f, 0xf2, 0x16, 0xb9, 0xc1, 0xd3, 0x00, 0x62, 0xbe, 0xbc, 0xfd, 0x2d, 0xc5, 0xbc, 0xe0, 0x91, 0x19, 0x34, 0xfd, 0xa7, 0x9a, 0x86, 0xf6, 0xe6, 0x98, 0xce, 0xd7, 0x59, 0xc3, 0xff, 0x9b, 0x64, 0x77, 0x33, 0x8f, 0x3d, 0xa4, 0xf9, 0xcd, 0x85, 0x14, 0xea, 0x99, 0x82, 0xcc, 0xaf, 0xb3, 0x41, 0xb2, 0x38, 0x4d, 0xd9, 0x02, 0xf3, 0xd1, 0xab, 0x7a, 0xc6, 0x1d, 0xd2, 0x9c, 0x6f, 0x21, 0xba, 0x5b, 0x86, 0x2f, 0x37, 0x30, 0xe3, 0x7c, 0xfd, 0xc4, 0xfd, 0x80, 0x6c, 0x22, 0xf2, 0x21 } }; static const size_t test_lengths[2] = { 64U, 375U }; #define ASSERT( cond, args ) \ do \ { \ if( ! ( cond ) ) \ { \ if( verbose != 0 ) \ mbedtls_printf args; \ \ return( -1 ); \ } \ } \ while( 0 ) int mbedtls_chacha20_self_test( int verbose ) { unsigned char output[381]; unsigned i; int ret; for( i = 0U; i < 2U; i++ ) { if( verbose != 0 ) mbedtls_printf( " ChaCha20 test %u ", i ); ret = mbedtls_chacha20_crypt( test_keys[i], test_nonces[i], test_counters[i], test_lengths[i], test_input[i], output ); ASSERT( 0 == ret, ( "error code: %i\n", ret ) ); ASSERT( 0 == memcmp( output, test_output[i], test_lengths[i] ), ( "failed (output)\n" ) ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* !MBEDTLS_CHACHA20_C */ fldigi-4.2.05/src/mbedtls/memory_buffer_alloc.c0000664000175000017500000004612314611711171016371 00000000000000/* * Buffer-based memory allocator * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) #include "mbedtls/memory_buffer_alloc.h" /* No need for the header guard as MBEDTLS_MEMORY_BUFFER_ALLOC_C is dependent upon MBEDTLS_PLATFORM_C */ #include "mbedtls/platform.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_MEMORY_BACKTRACE) #include #endif #if defined(MBEDTLS_THREADING_C) #include "mbedtls/threading.h" #endif #define MAGIC1 0xFF00AA55 #define MAGIC2 0xEE119966 #define MAX_BT 20 typedef struct _memory_header memory_header; struct _memory_header { size_t magic1; size_t size; size_t alloc; memory_header *prev; memory_header *next; memory_header *prev_free; memory_header *next_free; #if defined(MBEDTLS_MEMORY_BACKTRACE) char **trace; size_t trace_count; #endif size_t magic2; }; typedef struct { unsigned char *buf; size_t len; memory_header *first; memory_header *first_free; int verify; #if defined(MBEDTLS_MEMORY_DEBUG) size_t alloc_count; size_t free_count; size_t total_used; size_t maximum_used; size_t header_count; size_t maximum_header_count; #endif #if defined(MBEDTLS_THREADING_C) mbedtls_threading_mutex_t mutex; #endif } buffer_alloc_ctx; static buffer_alloc_ctx heap; #if defined(MBEDTLS_MEMORY_DEBUG) static void debug_header( memory_header *hdr ) { #if defined(MBEDTLS_MEMORY_BACKTRACE) size_t i; #endif mbedtls_fprintf( stderr, "HDR: PTR(%10zu), PREV(%10zu), NEXT(%10zu), " "ALLOC(%zu), SIZE(%10zu)\n", (size_t) hdr, (size_t) hdr->prev, (size_t) hdr->next, hdr->alloc, hdr->size ); mbedtls_fprintf( stderr, " FPREV(%10zu), FNEXT(%10zu)\n", (size_t) hdr->prev_free, (size_t) hdr->next_free ); #if defined(MBEDTLS_MEMORY_BACKTRACE) mbedtls_fprintf( stderr, "TRACE: \n" ); for( i = 0; i < hdr->trace_count; i++ ) mbedtls_fprintf( stderr, "%s\n", hdr->trace[i] ); mbedtls_fprintf( stderr, "\n" ); #endif } static void debug_chain( void ) { memory_header *cur = heap.first; mbedtls_fprintf( stderr, "\nBlock list\n" ); while( cur != NULL ) { debug_header( cur ); cur = cur->next; } mbedtls_fprintf( stderr, "Free list\n" ); cur = heap.first_free; while( cur != NULL ) { debug_header( cur ); cur = cur->next_free; } } #endif /* MBEDTLS_MEMORY_DEBUG */ static int verify_header( memory_header *hdr ) { if( hdr->magic1 != MAGIC1 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: MAGIC1 mismatch\n" ); #endif return( 1 ); } if( hdr->magic2 != MAGIC2 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: MAGIC2 mismatch\n" ); #endif return( 1 ); } if( hdr->alloc > 1 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: alloc has illegal value\n" ); #endif return( 1 ); } if( hdr->prev != NULL && hdr->prev == hdr->next ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: prev == next\n" ); #endif return( 1 ); } if( hdr->prev_free != NULL && hdr->prev_free == hdr->next_free ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: prev_free == next_free\n" ); #endif return( 1 ); } return( 0 ); } static int verify_chain( void ) { memory_header *prv = heap.first, *cur; if( prv == NULL || verify_header( prv ) != 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: verification of first header " "failed\n" ); #endif return( 1 ); } if( heap.first->prev != NULL ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: verification failed: " "first->prev != NULL\n" ); #endif return( 1 ); } cur = heap.first->next; while( cur != NULL ) { if( verify_header( cur ) != 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: verification of header " "failed\n" ); #endif return( 1 ); } if( cur->prev != prv ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: verification failed: " "cur->prev != prv\n" ); #endif return( 1 ); } prv = cur; cur = cur->next; } return( 0 ); } static void *buffer_alloc_calloc( size_t n, size_t size ) { memory_header *new, *cur = heap.first_free; unsigned char *p; void *ret; size_t original_len, len; #if defined(MBEDTLS_MEMORY_BACKTRACE) void *trace_buffer[MAX_BT]; size_t trace_cnt; #endif if( heap.buf == NULL || heap.first == NULL ) return( NULL ); original_len = len = n * size; if( n == 0 || size == 0 || len / n != size ) return( NULL ); else if( len > (size_t)-MBEDTLS_MEMORY_ALIGN_MULTIPLE ) return( NULL ); if( len % MBEDTLS_MEMORY_ALIGN_MULTIPLE ) { len -= len % MBEDTLS_MEMORY_ALIGN_MULTIPLE; len += MBEDTLS_MEMORY_ALIGN_MULTIPLE; } // Find block that fits // while( cur != NULL ) { if( cur->size >= len ) break; cur = cur->next_free; } if( cur == NULL ) return( NULL ); if( cur->alloc != 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: block in free_list but allocated " "data\n" ); #endif mbedtls_exit( 1 ); } #if defined(MBEDTLS_MEMORY_DEBUG) heap.alloc_count++; #endif // Found location, split block if > memory_header + 4 room left // if( cur->size - len < sizeof(memory_header) + MBEDTLS_MEMORY_ALIGN_MULTIPLE ) { cur->alloc = 1; // Remove from free_list // if( cur->prev_free != NULL ) cur->prev_free->next_free = cur->next_free; else heap.first_free = cur->next_free; if( cur->next_free != NULL ) cur->next_free->prev_free = cur->prev_free; cur->prev_free = NULL; cur->next_free = NULL; #if defined(MBEDTLS_MEMORY_DEBUG) heap.total_used += cur->size; if( heap.total_used > heap.maximum_used ) heap.maximum_used = heap.total_used; #endif #if defined(MBEDTLS_MEMORY_BACKTRACE) trace_cnt = backtrace( trace_buffer, MAX_BT ); cur->trace = backtrace_symbols( trace_buffer, trace_cnt ); cur->trace_count = trace_cnt; #endif if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 ) mbedtls_exit( 1 ); ret = (unsigned char *) cur + sizeof( memory_header ); memset( ret, 0, original_len ); return( ret ); } p = ( (unsigned char *) cur ) + sizeof(memory_header) + len; new = (memory_header *) p; new->size = cur->size - len - sizeof(memory_header); new->alloc = 0; new->prev = cur; new->next = cur->next; #if defined(MBEDTLS_MEMORY_BACKTRACE) new->trace = NULL; new->trace_count = 0; #endif new->magic1 = MAGIC1; new->magic2 = MAGIC2; if( new->next != NULL ) new->next->prev = new; // Replace cur with new in free_list // new->prev_free = cur->prev_free; new->next_free = cur->next_free; if( new->prev_free != NULL ) new->prev_free->next_free = new; else heap.first_free = new; if( new->next_free != NULL ) new->next_free->prev_free = new; cur->alloc = 1; cur->size = len; cur->next = new; cur->prev_free = NULL; cur->next_free = NULL; #if defined(MBEDTLS_MEMORY_DEBUG) heap.header_count++; if( heap.header_count > heap.maximum_header_count ) heap.maximum_header_count = heap.header_count; heap.total_used += cur->size; if( heap.total_used > heap.maximum_used ) heap.maximum_used = heap.total_used; #endif #if defined(MBEDTLS_MEMORY_BACKTRACE) trace_cnt = backtrace( trace_buffer, MAX_BT ); cur->trace = backtrace_symbols( trace_buffer, trace_cnt ); cur->trace_count = trace_cnt; #endif if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 ) mbedtls_exit( 1 ); ret = (unsigned char *) cur + sizeof( memory_header ); memset( ret, 0, original_len ); return( ret ); } static void buffer_alloc_free( void *ptr ) { memory_header *hdr, *old = NULL; unsigned char *p = (unsigned char *) ptr; if( ptr == NULL || heap.buf == NULL || heap.first == NULL ) return; if( p < heap.buf || p >= heap.buf + heap.len ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: mbedtls_free() outside of managed " "space\n" ); #endif mbedtls_exit( 1 ); } p -= sizeof(memory_header); hdr = (memory_header *) p; if( verify_header( hdr ) != 0 ) mbedtls_exit( 1 ); if( hdr->alloc != 1 ) { #if defined(MBEDTLS_MEMORY_DEBUG) mbedtls_fprintf( stderr, "FATAL: mbedtls_free() on unallocated " "data\n" ); #endif mbedtls_exit( 1 ); } hdr->alloc = 0; #if defined(MBEDTLS_MEMORY_DEBUG) heap.free_count++; heap.total_used -= hdr->size; #endif #if defined(MBEDTLS_MEMORY_BACKTRACE) free( hdr->trace ); hdr->trace = NULL; hdr->trace_count = 0; #endif // Regroup with block before // if( hdr->prev != NULL && hdr->prev->alloc == 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) heap.header_count--; #endif hdr->prev->size += sizeof(memory_header) + hdr->size; hdr->prev->next = hdr->next; old = hdr; hdr = hdr->prev; if( hdr->next != NULL ) hdr->next->prev = hdr; memset( old, 0, sizeof(memory_header) ); } // Regroup with block after // if( hdr->next != NULL && hdr->next->alloc == 0 ) { #if defined(MBEDTLS_MEMORY_DEBUG) heap.header_count--; #endif hdr->size += sizeof(memory_header) + hdr->next->size; old = hdr->next; hdr->next = hdr->next->next; if( hdr->prev_free != NULL || hdr->next_free != NULL ) { if( hdr->prev_free != NULL ) hdr->prev_free->next_free = hdr->next_free; else heap.first_free = hdr->next_free; if( hdr->next_free != NULL ) hdr->next_free->prev_free = hdr->prev_free; } hdr->prev_free = old->prev_free; hdr->next_free = old->next_free; if( hdr->prev_free != NULL ) hdr->prev_free->next_free = hdr; else heap.first_free = hdr; if( hdr->next_free != NULL ) hdr->next_free->prev_free = hdr; if( hdr->next != NULL ) hdr->next->prev = hdr; memset( old, 0, sizeof(memory_header) ); } // Prepend to free_list if we have not merged // (Does not have to stay in same order as prev / next list) // if( old == NULL ) { hdr->next_free = heap.first_free; if( heap.first_free != NULL ) heap.first_free->prev_free = hdr; heap.first_free = hdr; } if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_FREE ) && verify_chain() != 0 ) mbedtls_exit( 1 ); } void mbedtls_memory_buffer_set_verify( int verify ) { heap.verify = verify; } int mbedtls_memory_buffer_alloc_verify( void ) { return verify_chain(); } #if defined(MBEDTLS_MEMORY_DEBUG) void mbedtls_memory_buffer_alloc_status( void ) { mbedtls_fprintf( stderr, "Current use: %zu blocks / %zu bytes, max: %zu blocks / " "%zu bytes (total %zu bytes), alloc / free: %zu / %zu\n", heap.header_count, heap.total_used, heap.maximum_header_count, heap.maximum_used, heap.maximum_header_count * sizeof( memory_header ) + heap.maximum_used, heap.alloc_count, heap.free_count ); if( heap.first->next == NULL ) { mbedtls_fprintf( stderr, "All memory de-allocated in stack buffer\n" ); } else { mbedtls_fprintf( stderr, "Memory currently allocated:\n" ); debug_chain(); } } void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks ) { *max_used = heap.maximum_used; *max_blocks = heap.maximum_header_count; } void mbedtls_memory_buffer_alloc_max_reset( void ) { heap.maximum_used = 0; heap.maximum_header_count = 0; } void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks ) { *cur_used = heap.total_used; *cur_blocks = heap.header_count; } #endif /* MBEDTLS_MEMORY_DEBUG */ #if defined(MBEDTLS_THREADING_C) static void *buffer_alloc_calloc_mutexed( size_t n, size_t size ) { void *buf; if( mbedtls_mutex_lock( &heap.mutex ) != 0 ) return( NULL ); buf = buffer_alloc_calloc( n, size ); if( mbedtls_mutex_unlock( &heap.mutex ) ) return( NULL ); return( buf ); } static void buffer_alloc_free_mutexed( void *ptr ) { /* We have to good option here, but corrupting the heap seems * worse than loosing memory. */ if( mbedtls_mutex_lock( &heap.mutex ) ) return; buffer_alloc_free( ptr ); (void) mbedtls_mutex_unlock( &heap.mutex ); } #endif /* MBEDTLS_THREADING_C */ void mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len ) { memset( &heap, 0, sizeof( buffer_alloc_ctx ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &heap.mutex ); mbedtls_platform_set_calloc_free( buffer_alloc_calloc_mutexed, buffer_alloc_free_mutexed ); #else mbedtls_platform_set_calloc_free( buffer_alloc_calloc, buffer_alloc_free ); #endif if( len < sizeof( memory_header ) + MBEDTLS_MEMORY_ALIGN_MULTIPLE ) return; else if( (size_t)buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE ) { /* Adjust len first since buf is used in the computation */ len -= MBEDTLS_MEMORY_ALIGN_MULTIPLE - (size_t)buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; buf += MBEDTLS_MEMORY_ALIGN_MULTIPLE - (size_t)buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE; } memset( buf, 0, len ); heap.buf = buf; heap.len = len; heap.first = (memory_header *)buf; heap.first->size = len - sizeof( memory_header ); heap.first->magic1 = MAGIC1; heap.first->magic2 = MAGIC2; heap.first_free = heap.first; } void mbedtls_memory_buffer_alloc_free( void ) { #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &heap.mutex ); #endif mbedtls_platform_zeroize( &heap, sizeof(buffer_alloc_ctx) ); } #if defined(MBEDTLS_SELF_TEST) static int check_pointer( void *p ) { if( p == NULL ) return( -1 ); if( (size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0 ) return( -1 ); return( 0 ); } static int check_all_free( void ) { if( #if defined(MBEDTLS_MEMORY_DEBUG) heap.total_used != 0 || #endif heap.first != heap.first_free || (void *) heap.first != (void *) heap.buf ) { return( -1 ); } return( 0 ); } #define TEST_ASSERT( condition ) \ if( ! (condition) ) \ { \ if( verbose != 0 ) \ mbedtls_printf( "failed\n" ); \ \ ret = 1; \ goto cleanup; \ } int mbedtls_memory_buffer_alloc_self_test( int verbose ) { unsigned char buf[1024]; unsigned char *p, *q, *r, *end; int ret = 0; if( verbose != 0 ) mbedtls_printf( " MBA test #1 (basic alloc-free cycle): " ); mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) ); p = mbedtls_calloc( 1, 1 ); q = mbedtls_calloc( 1, 128 ); r = mbedtls_calloc( 1, 16 ); TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 && check_pointer( r ) == 0 ); mbedtls_free( r ); mbedtls_free( q ); mbedtls_free( p ); TEST_ASSERT( check_all_free( ) == 0 ); /* Memorize end to compare with the next test */ end = heap.buf + heap.len; mbedtls_memory_buffer_alloc_free( ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " MBA test #2 (buf not aligned): " ); mbedtls_memory_buffer_alloc_init( buf + 1, sizeof( buf ) - 1 ); TEST_ASSERT( heap.buf + heap.len == end ); p = mbedtls_calloc( 1, 1 ); q = mbedtls_calloc( 1, 128 ); r = mbedtls_calloc( 1, 16 ); TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 && check_pointer( r ) == 0 ); mbedtls_free( r ); mbedtls_free( q ); mbedtls_free( p ); TEST_ASSERT( check_all_free( ) == 0 ); mbedtls_memory_buffer_alloc_free( ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " MBA test #3 (full): " ); mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) ); p = mbedtls_calloc( 1, sizeof( buf ) - sizeof( memory_header ) ); TEST_ASSERT( check_pointer( p ) == 0 ); TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL ); mbedtls_free( p ); p = mbedtls_calloc( 1, sizeof( buf ) - 2 * sizeof( memory_header ) - 16 ); q = mbedtls_calloc( 1, 16 ); TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 ); TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL ); mbedtls_free( q ); TEST_ASSERT( mbedtls_calloc( 1, 17 ) == NULL ); mbedtls_free( p ); TEST_ASSERT( check_all_free( ) == 0 ); mbedtls_memory_buffer_alloc_free( ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); cleanup: mbedtls_memory_buffer_alloc_free( ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */ fldigi-4.2.05/src/mbedtls/gpl-2.0.txt0000664000175000017500000004325414611711171014034 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. fldigi-4.2.05/src/mbedtls/sha1.c0000664000175000017500000003435014611711171013211 00000000000000/* * FIPS-180-1 compliant SHA-1 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The SHA-1 standard was published by NIST in 1993. * * http://www.itl.nist.gov/fipspubs/fip180-1.htm */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SHA1_C) #include "mbedtls/sha1.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #define SHA1_VALIDATE_RET(cond) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA1_BAD_INPUT_DATA ) #define SHA1_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond ) #if !defined(MBEDTLS_SHA1_ALT) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif void mbedtls_sha1_init( mbedtls_sha1_context *ctx ) { SHA1_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_sha1_context ) ); } void mbedtls_sha1_free( mbedtls_sha1_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha1_context ) ); } void mbedtls_sha1_clone( mbedtls_sha1_context *dst, const mbedtls_sha1_context *src ) { SHA1_VALIDATE( dst != NULL ); SHA1_VALIDATE( src != NULL ); *dst = *src; } /* * SHA-1 context setup */ int mbedtls_sha1_starts_ret( mbedtls_sha1_context *ctx ) { SHA1_VALIDATE_RET( ctx != NULL ); ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; ctx->state[4] = 0xC3D2E1F0; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1_starts( mbedtls_sha1_context *ctx ) { mbedtls_sha1_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_SHA1_PROCESS_ALT) int mbedtls_internal_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ) { uint32_t temp, W[16], A, B, C, D, E; SHA1_VALIDATE_RET( ctx != NULL ); SHA1_VALIDATE_RET( (const unsigned char *)data != NULL ); GET_UINT32_BE( W[ 0], data, 0 ); GET_UINT32_BE( W[ 1], data, 4 ); GET_UINT32_BE( W[ 2], data, 8 ); GET_UINT32_BE( W[ 3], data, 12 ); GET_UINT32_BE( W[ 4], data, 16 ); GET_UINT32_BE( W[ 5], data, 20 ); GET_UINT32_BE( W[ 6], data, 24 ); GET_UINT32_BE( W[ 7], data, 28 ); GET_UINT32_BE( W[ 8], data, 32 ); GET_UINT32_BE( W[ 9], data, 36 ); GET_UINT32_BE( W[10], data, 40 ); GET_UINT32_BE( W[11], data, 44 ); GET_UINT32_BE( W[12], data, 48 ); GET_UINT32_BE( W[13], data, 52 ); GET_UINT32_BE( W[14], data, 56 ); GET_UINT32_BE( W[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define R(t) \ ( \ temp = W[( t - 3 ) & 0x0F] ^ W[( t - 8 ) & 0x0F] ^ \ W[( t - 14 ) & 0x0F] ^ W[ t & 0x0F], \ ( W[t & 0x0F] = S(temp,1) ) \ ) #define P(a,b,c,d,e,x) \ { \ e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; E = ctx->state[4]; #define F(x,y,z) (z ^ (x & (y ^ z))) #define K 0x5A827999 P( A, B, C, D, E, W[0] ); P( E, A, B, C, D, W[1] ); P( D, E, A, B, C, W[2] ); P( C, D, E, A, B, W[3] ); P( B, C, D, E, A, W[4] ); P( A, B, C, D, E, W[5] ); P( E, A, B, C, D, W[6] ); P( D, E, A, B, C, W[7] ); P( C, D, E, A, B, W[8] ); P( B, C, D, E, A, W[9] ); P( A, B, C, D, E, W[10] ); P( E, A, B, C, D, W[11] ); P( D, E, A, B, C, W[12] ); P( C, D, E, A, B, W[13] ); P( B, C, D, E, A, W[14] ); P( A, B, C, D, E, W[15] ); P( E, A, B, C, D, R(16) ); P( D, E, A, B, C, R(17) ); P( C, D, E, A, B, R(18) ); P( B, C, D, E, A, R(19) ); #undef K #undef F #define F(x,y,z) (x ^ y ^ z) #define K 0x6ED9EBA1 P( A, B, C, D, E, R(20) ); P( E, A, B, C, D, R(21) ); P( D, E, A, B, C, R(22) ); P( C, D, E, A, B, R(23) ); P( B, C, D, E, A, R(24) ); P( A, B, C, D, E, R(25) ); P( E, A, B, C, D, R(26) ); P( D, E, A, B, C, R(27) ); P( C, D, E, A, B, R(28) ); P( B, C, D, E, A, R(29) ); P( A, B, C, D, E, R(30) ); P( E, A, B, C, D, R(31) ); P( D, E, A, B, C, R(32) ); P( C, D, E, A, B, R(33) ); P( B, C, D, E, A, R(34) ); P( A, B, C, D, E, R(35) ); P( E, A, B, C, D, R(36) ); P( D, E, A, B, C, R(37) ); P( C, D, E, A, B, R(38) ); P( B, C, D, E, A, R(39) ); #undef K #undef F #define F(x,y,z) ((x & y) | (z & (x | y))) #define K 0x8F1BBCDC P( A, B, C, D, E, R(40) ); P( E, A, B, C, D, R(41) ); P( D, E, A, B, C, R(42) ); P( C, D, E, A, B, R(43) ); P( B, C, D, E, A, R(44) ); P( A, B, C, D, E, R(45) ); P( E, A, B, C, D, R(46) ); P( D, E, A, B, C, R(47) ); P( C, D, E, A, B, R(48) ); P( B, C, D, E, A, R(49) ); P( A, B, C, D, E, R(50) ); P( E, A, B, C, D, R(51) ); P( D, E, A, B, C, R(52) ); P( C, D, E, A, B, R(53) ); P( B, C, D, E, A, R(54) ); P( A, B, C, D, E, R(55) ); P( E, A, B, C, D, R(56) ); P( D, E, A, B, C, R(57) ); P( C, D, E, A, B, R(58) ); P( B, C, D, E, A, R(59) ); #undef K #undef F #define F(x,y,z) (x ^ y ^ z) #define K 0xCA62C1D6 P( A, B, C, D, E, R(60) ); P( E, A, B, C, D, R(61) ); P( D, E, A, B, C, R(62) ); P( C, D, E, A, B, R(63) ); P( B, C, D, E, A, R(64) ); P( A, B, C, D, E, R(65) ); P( E, A, B, C, D, R(66) ); P( D, E, A, B, C, R(67) ); P( C, D, E, A, B, R(68) ); P( B, C, D, E, A, R(69) ); P( A, B, C, D, E, R(70) ); P( E, A, B, C, D, R(71) ); P( D, E, A, B, C, R(72) ); P( C, D, E, A, B, R(73) ); P( B, C, D, E, A, R(74) ); P( A, B, C, D, E, R(75) ); P( E, A, B, C, D, R(76) ); P( D, E, A, B, C, R(77) ); P( C, D, E, A, B, R(78) ); P( B, C, D, E, A, R(79) ); #undef K #undef F ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; ctx->state[4] += E; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ) { mbedtls_internal_sha1_process( ctx, data ); } #endif #endif /* !MBEDTLS_SHA1_PROCESS_ALT */ /* * SHA-1 process buffer */ int mbedtls_sha1_update_ret( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; SHA1_VALIDATE_RET( ctx != NULL ); SHA1_VALIDATE_RET( ilen == 0 || input != NULL ); if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_sha1_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_sha1_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) memcpy( (void *) (ctx->buffer + left), input, ilen ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_sha1_update_ret( ctx, input, ilen ); } #endif /* * SHA-1 final digest */ int mbedtls_sha1_finish_ret( mbedtls_sha1_context *ctx, unsigned char output[20] ) { int ret; uint32_t used; uint32_t high, low; SHA1_VALIDATE_RET( ctx != NULL ); SHA1_VALIDATE_RET( (unsigned char *)output != NULL ); /* * Add padding: 0x80 then 0x00 until 8 bytes remain for the length */ used = ctx->total[0] & 0x3F; ctx->buffer[used++] = 0x80; if( used <= 56 ) { /* Enough room for padding + length in current block */ memset( ctx->buffer + used, 0, 56 - used ); } else { /* We'll need an extra block */ memset( ctx->buffer + used, 0, 64 - used ); if( ( ret = mbedtls_internal_sha1_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); memset( ctx->buffer, 0, 56 ); } /* * Add message length */ high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_BE( high, ctx->buffer, 56 ); PUT_UINT32_BE( low, ctx->buffer, 60 ); if( ( ret = mbedtls_internal_sha1_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); /* * Output final state */ PUT_UINT32_BE( ctx->state[0], output, 0 ); PUT_UINT32_BE( ctx->state[1], output, 4 ); PUT_UINT32_BE( ctx->state[2], output, 8 ); PUT_UINT32_BE( ctx->state[3], output, 12 ); PUT_UINT32_BE( ctx->state[4], output, 16 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] ) { mbedtls_sha1_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_SHA1_ALT */ /* * output = SHA-1( input buffer ) */ int mbedtls_sha1_ret( const unsigned char *input, size_t ilen, unsigned char output[20] ) { int ret; mbedtls_sha1_context ctx; SHA1_VALIDATE_RET( ilen == 0 || input != NULL ); SHA1_VALIDATE_RET( (unsigned char *)output != NULL ); mbedtls_sha1_init( &ctx ); if( ( ret = mbedtls_sha1_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_sha1_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ) { mbedtls_sha1_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * FIPS-180-1 test vectors */ static const unsigned char sha1_test_buf[3][57] = { { "abc" }, { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, { "" } }; static const size_t sha1_test_buflen[3] = { 3, 56, 1000 }; static const unsigned char sha1_test_sum[3][20] = { { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D }, { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE, 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 }, { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E, 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F } }; /* * Checkup routine */ int mbedtls_sha1_self_test( int verbose ) { int i, j, buflen, ret = 0; unsigned char buf[1024]; unsigned char sha1sum[20]; mbedtls_sha1_context ctx; mbedtls_sha1_init( &ctx ); /* * SHA-1 */ for( i = 0; i < 3; i++ ) { if( verbose != 0 ) mbedtls_printf( " SHA-1 test #%d: ", i + 1 ); if( ( ret = mbedtls_sha1_starts_ret( &ctx ) ) != 0 ) goto fail; if( i == 2 ) { memset( buf, 'a', buflen = 1000 ); for( j = 0; j < 1000; j++ ) { ret = mbedtls_sha1_update_ret( &ctx, buf, buflen ); if( ret != 0 ) goto fail; } } else { ret = mbedtls_sha1_update_ret( &ctx, sha1_test_buf[i], sha1_test_buflen[i] ); if( ret != 0 ) goto fail; } if( ( ret = mbedtls_sha1_finish_ret( &ctx, sha1sum ) ) != 0 ) goto fail; if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); goto exit; fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); exit: mbedtls_sha1_free( &ctx ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_SHA1_C */ fldigi-4.2.05/src/mbedtls/ccm.c0000664000175000017500000004032014611711171013111 00000000000000/* * NIST SP800-38C compliant CCM implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * Definition of CCM: * http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf * RFC 3610 "Counter with CBC-MAC (CCM)" * * Related: * RFC 5116 "An Interface and Algorithms for Authenticated Encryption" */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CCM_C) #include "mbedtls/ccm.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #if !defined(MBEDTLS_CCM_ALT) #define CCM_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CCM_BAD_INPUT ) #define CCM_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define CCM_ENCRYPT 0 #define CCM_DECRYPT 1 /* * Initialize context */ void mbedtls_ccm_init( mbedtls_ccm_context *ctx ) { CCM_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_ccm_context ) ); } int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits ) { int ret; const mbedtls_cipher_info_t *cipher_info; CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( key != NULL ); cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB ); if( cipher_info == NULL ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); if( cipher_info->block_size != 16 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); mbedtls_cipher_free( &ctx->cipher_ctx ); if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits, MBEDTLS_ENCRYPT ) ) != 0 ) { return( ret ); } return( 0 ); } /* * Free context */ void mbedtls_ccm_free( mbedtls_ccm_context *ctx ) { if( ctx == NULL ) return; mbedtls_cipher_free( &ctx->cipher_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ccm_context ) ); } /* * Macros for common operations. * Results in smaller compiled code than static inline functions. */ /* * Update the CBC-MAC state in y using a block in b * (Always using b as the source helps the compiler optimise a bit better.) */ #define UPDATE_CBC_MAC \ for( i = 0; i < 16; i++ ) \ y[i] ^= b[i]; \ \ if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, y, 16, y, &olen ) ) != 0 ) \ return( ret ); /* * Encrypt or decrypt a partial block with CTR * Warning: using b for temporary storage! src and dst must not be b! * This avoids allocating one more 16 bytes buffer while allowing src == dst. */ #define CTR_CRYPT( dst, src, len ) \ if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctr, 16, b, &olen ) ) != 0 ) \ return( ret ); \ \ for( i = 0; i < len; i++ ) \ dst[i] = src[i] ^ b[i]; /* * Authenticated encryption or decryption */ static int ccm_auth_crypt( mbedtls_ccm_context *ctx, int mode, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ) { int ret; unsigned char i; unsigned char q; size_t len_left, olen; unsigned char b[16]; unsigned char y[16]; unsigned char ctr[16]; const unsigned char *src; unsigned char *dst; /* * Check length requirements: SP800-38C A.1 * Additional requirement: a < 2^16 - 2^8 to simplify the code. * 'length' checked later (when writing it to the first block) * * Also, loosen the requirements to enable support for CCM* (IEEE 802.15.4). */ if( tag_len == 2 || tag_len > 16 || tag_len % 2 != 0 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); /* Also implies q is within bounds */ if( iv_len < 7 || iv_len > 13 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); if( add_len > 0xFF00 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); q = 16 - 1 - (unsigned char) iv_len; /* * First block B_0: * 0 .. 0 flags * 1 .. iv_len nonce (aka iv) * iv_len+1 .. 15 length * * With flags as (bits): * 7 0 * 6 add present? * 5 .. 3 (t - 2) / 2 * 2 .. 0 q - 1 */ b[0] = 0; b[0] |= ( add_len > 0 ) << 6; b[0] |= ( ( tag_len - 2 ) / 2 ) << 3; b[0] |= q - 1; memcpy( b + 1, iv, iv_len ); for( i = 0, len_left = length; i < q; i++, len_left >>= 8 ) b[15-i] = (unsigned char)( len_left & 0xFF ); if( len_left > 0 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); /* Start CBC-MAC with first block */ memset( y, 0, 16 ); UPDATE_CBC_MAC; /* * If there is additional data, update CBC-MAC with * add_len, add, 0 (padding to a block boundary) */ if( add_len > 0 ) { size_t use_len; len_left = add_len; src = add; memset( b, 0, 16 ); b[0] = (unsigned char)( ( add_len >> 8 ) & 0xFF ); b[1] = (unsigned char)( ( add_len ) & 0xFF ); use_len = len_left < 16 - 2 ? len_left : 16 - 2; memcpy( b + 2, src, use_len ); len_left -= use_len; src += use_len; UPDATE_CBC_MAC; while( len_left > 0 ) { use_len = len_left > 16 ? 16 : len_left; memset( b, 0, 16 ); memcpy( b, src, use_len ); UPDATE_CBC_MAC; len_left -= use_len; src += use_len; } } /* * Prepare counter block for encryption: * 0 .. 0 flags * 1 .. iv_len nonce (aka iv) * iv_len+1 .. 15 counter (initially 1) * * With flags as (bits): * 7 .. 3 0 * 2 .. 0 q - 1 */ ctr[0] = q - 1; memcpy( ctr + 1, iv, iv_len ); memset( ctr + 1 + iv_len, 0, q ); ctr[15] = 1; /* * Authenticate and {en,de}crypt the message. * * The only difference between encryption and decryption is * the respective order of authentication and {en,de}cryption. */ len_left = length; src = input; dst = output; while( len_left > 0 ) { size_t use_len = len_left > 16 ? 16 : len_left; if( mode == CCM_ENCRYPT ) { memset( b, 0, 16 ); memcpy( b, src, use_len ); UPDATE_CBC_MAC; } CTR_CRYPT( dst, src, use_len ); if( mode == CCM_DECRYPT ) { memset( b, 0, 16 ); memcpy( b, dst, use_len ); UPDATE_CBC_MAC; } dst += use_len; src += use_len; len_left -= use_len; /* * Increment counter. * No need to check for overflow thanks to the length check above. */ for( i = 0; i < q; i++ ) if( ++ctr[15-i] != 0 ) break; } /* * Authentication: reset counter and crypt/mask internal tag */ for( i = 0; i < q; i++ ) ctr[15-i] = 0; CTR_CRYPT( y, y, 16 ); memcpy( tag, y, tag_len ); return( 0 ); } /* * Authenticated encryption */ int mbedtls_ccm_star_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ) { CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( iv != NULL ); CCM_VALIDATE_RET( add_len == 0 || add != NULL ); CCM_VALIDATE_RET( length == 0 || input != NULL ); CCM_VALIDATE_RET( length == 0 || output != NULL ); CCM_VALIDATE_RET( tag_len == 0 || tag != NULL ); return( ccm_auth_crypt( ctx, CCM_ENCRYPT, length, iv, iv_len, add, add_len, input, output, tag, tag_len ) ); } int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, unsigned char *tag, size_t tag_len ) { CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( iv != NULL ); CCM_VALIDATE_RET( add_len == 0 || add != NULL ); CCM_VALIDATE_RET( length == 0 || input != NULL ); CCM_VALIDATE_RET( length == 0 || output != NULL ); CCM_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( tag_len == 0 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); return( mbedtls_ccm_star_encrypt_and_tag( ctx, length, iv, iv_len, add, add_len, input, output, tag, tag_len ) ); } /* * Authenticated decryption */ int mbedtls_ccm_star_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len ) { int ret; unsigned char check_tag[16]; unsigned char i; int diff; CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( iv != NULL ); CCM_VALIDATE_RET( add_len == 0 || add != NULL ); CCM_VALIDATE_RET( length == 0 || input != NULL ); CCM_VALIDATE_RET( length == 0 || output != NULL ); CCM_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( ( ret = ccm_auth_crypt( ctx, CCM_DECRYPT, length, iv, iv_len, add, add_len, input, output, check_tag, tag_len ) ) != 0 ) { return( ret ); } /* Check tag in "constant-time" */ for( diff = 0, i = 0; i < tag_len; i++ ) diff |= tag[i] ^ check_tag[i]; if( diff != 0 ) { mbedtls_platform_zeroize( output, length ); return( MBEDTLS_ERR_CCM_AUTH_FAILED ); } return( 0 ); } int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, const unsigned char *tag, size_t tag_len ) { CCM_VALIDATE_RET( ctx != NULL ); CCM_VALIDATE_RET( iv != NULL ); CCM_VALIDATE_RET( add_len == 0 || add != NULL ); CCM_VALIDATE_RET( length == 0 || input != NULL ); CCM_VALIDATE_RET( length == 0 || output != NULL ); CCM_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( tag_len == 0 ) return( MBEDTLS_ERR_CCM_BAD_INPUT ); return( mbedtls_ccm_star_auth_decrypt( ctx, length, iv, iv_len, add, add_len, input, output, tag, tag_len ) ); } #endif /* !MBEDTLS_CCM_ALT */ #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) /* * Examples 1 to 3 from SP800-38C Appendix C */ #define NB_TESTS 3 #define CCM_SELFTEST_PT_MAX_LEN 24 #define CCM_SELFTEST_CT_MAX_LEN 32 /* * The data is the same for all tests, only the used length changes */ static const unsigned char key[] = { 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f }; static const unsigned char iv[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b }; static const unsigned char ad[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 }; static const unsigned char msg[CCM_SELFTEST_PT_MAX_LEN] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, }; static const size_t iv_len [NB_TESTS] = { 7, 8, 12 }; static const size_t add_len[NB_TESTS] = { 8, 16, 20 }; static const size_t msg_len[NB_TESTS] = { 4, 16, 24 }; static const size_t tag_len[NB_TESTS] = { 4, 6, 8 }; static const unsigned char res[NB_TESTS][CCM_SELFTEST_CT_MAX_LEN] = { { 0x71, 0x62, 0x01, 0x5b, 0x4d, 0xac, 0x25, 0x5d }, { 0xd2, 0xa1, 0xf0, 0xe0, 0x51, 0xea, 0x5f, 0x62, 0x08, 0x1a, 0x77, 0x92, 0x07, 0x3d, 0x59, 0x3d, 0x1f, 0xc6, 0x4f, 0xbf, 0xac, 0xcd }, { 0xe3, 0xb2, 0x01, 0xa9, 0xf5, 0xb7, 0x1a, 0x7a, 0x9b, 0x1c, 0xea, 0xec, 0xcd, 0x97, 0xe7, 0x0b, 0x61, 0x76, 0xaa, 0xd9, 0xa4, 0x42, 0x8a, 0xa5, 0x48, 0x43, 0x92, 0xfb, 0xc1, 0xb0, 0x99, 0x51 } }; int mbedtls_ccm_self_test( int verbose ) { mbedtls_ccm_context ctx; /* * Some hardware accelerators require the input and output buffers * would be in RAM, because the flash is not accessible. * Use buffers on the stack to hold the test vectors data. */ unsigned char plaintext[CCM_SELFTEST_PT_MAX_LEN]; unsigned char ciphertext[CCM_SELFTEST_CT_MAX_LEN]; size_t i; int ret; mbedtls_ccm_init( &ctx ); if( mbedtls_ccm_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, key, 8 * sizeof key ) != 0 ) { if( verbose != 0 ) mbedtls_printf( " CCM: setup failed" ); return( 1 ); } for( i = 0; i < NB_TESTS; i++ ) { if( verbose != 0 ) mbedtls_printf( " CCM-AES #%u: ", (unsigned int) i + 1 ); memset( plaintext, 0, CCM_SELFTEST_PT_MAX_LEN ); memset( ciphertext, 0, CCM_SELFTEST_CT_MAX_LEN ); memcpy( plaintext, msg, msg_len[i] ); ret = mbedtls_ccm_encrypt_and_tag( &ctx, msg_len[i], iv, iv_len[i], ad, add_len[i], plaintext, ciphertext, ciphertext + msg_len[i], tag_len[i] ); if( ret != 0 || memcmp( ciphertext, res[i], msg_len[i] + tag_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } memset( plaintext, 0, CCM_SELFTEST_PT_MAX_LEN ); ret = mbedtls_ccm_auth_decrypt( &ctx, msg_len[i], iv, iv_len[i], ad, add_len[i], ciphertext, plaintext, ciphertext + msg_len[i], tag_len[i] ); if( ret != 0 || memcmp( plaintext, msg, msg_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } mbedtls_ccm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #endif /* MBEDTLS_CCM_C */ fldigi-4.2.05/src/mbedtls/ssl_cli.c0000664000175000017500000036216214611711171014012 00000000000000/* * SSLv3/TLSv1 client-side functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_CLI_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/debug.h" #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" #include #include #if defined(MBEDTLS_HAVE_TIME) #include "mbedtls/platform_time.h" #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) #include "mbedtls/platform_util.h" #endif #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) static void ssl_write_hostname_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t hostname_len; *olen = 0; if( ssl->hostname == NULL ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding server name extension: %s", ssl->hostname ) ); hostname_len = strlen( ssl->hostname ); if( end < p || (size_t)( end - p ) < hostname_len + 9 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } /* * Sect. 3, RFC 6066 (TLS Extensions Definitions) * * In order to provide any of the server names, clients MAY include an * extension of type "server_name" in the (extended) client hello. The * "extension_data" field of this extension SHALL contain * "ServerNameList" where: * * struct { * NameType name_type; * select (name_type) { * case host_name: HostName; * } name; * } ServerName; * * enum { * host_name(0), (255) * } NameType; * * opaque HostName<1..2^16-1>; * * struct { * ServerName server_name_list<1..2^16-1> * } ServerNameList; * */ *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME ) & 0xFF ); *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( (hostname_len + 5) ) & 0xFF ); *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( (hostname_len + 3) ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF ); *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( hostname_len ) & 0xFF ); memcpy( p, ssl->hostname, hostname_len ); *olen = hostname_len + 9; } #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_SSL_RENEGOTIATION) static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; /* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the * initial ClientHello, in which case also adding the renegotiation * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */ if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding renegotiation extension" ) ); if( end < p || (size_t)( end - p ) < 5 + ssl->verify_data_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } /* * Secure renegotiation */ *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF ); *p++ = 0x00; *p++ = ( ssl->verify_data_len + 1 ) & 0xFF; *p++ = ssl->verify_data_len & 0xFF; memcpy( p, ssl->own_verify_data, ssl->verify_data_len ); *olen = 5 + ssl->verify_data_len; } #endif /* MBEDTLS_SSL_RENEGOTIATION */ /* * Only if we handle at least one key exchange that needs signatures. */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) static void ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t sig_alg_len = 0; const int *md; #if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) unsigned char *sig_alg_list = buf + 6; #endif *olen = 0; if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding signature_algorithms extension" ) ); for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ ) { #if defined(MBEDTLS_ECDSA_C) sig_alg_len += 2; #endif #if defined(MBEDTLS_RSA_C) sig_alg_len += 2; #endif } if( end < p || (size_t)( end - p ) < sig_alg_len + 6 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } /* * Prepare signature_algorithms extension (TLS 1.2) */ sig_alg_len = 0; for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ ) { #if defined(MBEDTLS_ECDSA_C) sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md ); sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA; #endif #if defined(MBEDTLS_RSA_C) sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md ); sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA; #endif } /* * enum { * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5), * sha512(6), (255) * } HashAlgorithm; * * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) } * SignatureAlgorithm; * * struct { * HashAlgorithm hash; * SignatureAlgorithm signature; * } SignatureAndHashAlgorithm; * * SignatureAndHashAlgorithm * supported_signature_algorithms<2..2^16-2>; */ *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG ) & 0xFF ); *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) ) & 0xFF ); *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( sig_alg_len ) & 0xFF ); *olen = 6 + sig_alg_len; } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; unsigned char *elliptic_curve_list = p + 6; size_t elliptic_curve_len = 0; const mbedtls_ecp_curve_info *info; #if defined(MBEDTLS_ECP_C) const mbedtls_ecp_group_id *grp_id; #else ((void) ssl); #endif *olen = 0; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_elliptic_curves extension" ) ); #if defined(MBEDTLS_ECP_C) for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ ) #else for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ ) #endif { #if defined(MBEDTLS_ECP_C) info = mbedtls_ecp_curve_info_from_grp_id( *grp_id ); #endif if( info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid curve in ssl configuration" ) ); return; } elliptic_curve_len += 2; } if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } elliptic_curve_len = 0; #if defined(MBEDTLS_ECP_C) for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ ) #else for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ ) #endif { #if defined(MBEDTLS_ECP_C) info = mbedtls_ecp_curve_info_from_grp_id( *grp_id ); #endif elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8; elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF; } if( elliptic_curve_len == 0 ) return; *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES ) & 0xFF ); *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) ) & 0xFF ); *p++ = (unsigned char)( ( ( elliptic_curve_len ) >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ( elliptic_curve_len ) ) & 0xFF ); *olen = 6 + elliptic_curve_len; } static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding supported_point_formats extension" ) ); if( end < p || (size_t)( end - p ) < 6 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF ); *p++ = 0x00; *p++ = 2; *p++ = 1; *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED; *olen = 6; } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { int ret; unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t kkpp_len; *olen = 0; /* Skip costly extension if we can't use EC J-PAKE anyway */ if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding ecjpake_kkpp extension" ) ); if( end - p < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF ); /* * We may need to send ClientHello multiple times for Hello verification. * We don't want to compute fresh values every time (both for performance * and consistency reasons), so cache the extension content. */ if( ssl->handshake->ecjpake_cache == NULL || ssl->handshake->ecjpake_cache_len == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "generating new ecjpake parameters" ) ); ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx, p + 2, end - p - 2, &kkpp_len, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret ); return; } ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len ); if( ssl->handshake->ecjpake_cache == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "allocation failed" ) ); return; } memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len ); ssl->handshake->ecjpake_cache_len = kkpp_len; } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "re-using cached ecjpake parameters" ) ); kkpp_len = ssl->handshake->ecjpake_cache_len; if( (size_t)( end - p - 2 ) < kkpp_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len ); } *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( kkpp_len ) & 0xFF ); *olen = kkpp_len + 4; } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding max_fragment_length extension" ) ); if( end < p || (size_t)( end - p ) < 5 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF ); *p++ = 0x00; *p++ = 1; *p++ = ssl->conf->mfl_code; *olen = 5; } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding truncated_hmac extension" ) ); if( end < p || (size_t)( end - p ) < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED || ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding encrypt_then_mac " "extension" ) ); if( end < p || (size_t)( end - p ) < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; *olen = 0; if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding extended_master_secret " "extension" ) ); if( end < p || (size_t)( end - p ) < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t tlen = ssl->session_negotiate->ticket_len; *olen = 0; if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding session ticket extension" ) ); if( end < p || (size_t)( end - p ) < 4 + tlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF ); *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( tlen ) & 0xFF ); *olen = 4; if( ssl->session_negotiate->ticket == NULL || tlen == 0 ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "sending session ticket of length %d", tlen ) ); memcpy( p, ssl->session_negotiate->ticket, tlen ); *olen += tlen; } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_ALPN) static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t alpnlen = 0; const char **cur; *olen = 0; if( ssl->conf->alpn_list == NULL ) { return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, adding alpn extension" ) ); for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ ) alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1; if( end < p || (size_t)( end - p ) < 6 + alpnlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF ); /* * opaque ProtocolName<1..2^8-1>; * * struct { * ProtocolName protocol_name_list<2..2^16-1> * } ProtocolNameList; */ /* Skip writing extension and list length for now */ p += 4; for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ ) { *p = (unsigned char)( strlen( *cur ) & 0xFF ); memcpy( p + 1, *cur, *p ); p += 1 + *p; } *olen = p - buf; /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */ buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF ); buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF ); /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */ buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF ); buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF ); } #endif /* MBEDTLS_SSL_ALPN */ /* * Generate random bytes for ClientHello */ static int ssl_generate_random( mbedtls_ssl_context *ssl ) { int ret; unsigned char *p = ssl->handshake->randbytes; #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t t; #endif /* * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->verify_cookie != NULL ) { return( 0 ); } #endif #if defined(MBEDTLS_HAVE_TIME) t = mbedtls_time( NULL ); *p++ = (unsigned char)( t >> 24 ); *p++ = (unsigned char)( t >> 16 ); *p++ = (unsigned char)( t >> 8 ); *p++ = (unsigned char)( t ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) ); #else if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 ) return( ret ); p += 4; #endif /* MBEDTLS_HAVE_TIME */ if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 ) return( ret ); return( 0 ); } /** * \brief Validate cipher suite against config in SSL context. * * \param suite_info cipher suite to validate * \param ssl SSL context * \param min_minor_ver Minimal minor version to accept a cipher suite * \param max_minor_ver Maximal minor version to accept a cipher suite * * \return 0 if valid, else 1 */ static int ssl_validate_ciphersuite( const mbedtls_ssl_ciphersuite_t * suite_info, const mbedtls_ssl_context * ssl, int min_minor_ver, int max_minor_ver ) { (void) ssl; if( suite_info == NULL ) return( 1 ); if( suite_info->min_minor_ver > max_minor_ver || suite_info->max_minor_ver < min_minor_ver ) return( 1 ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) ) return( 1 ); #endif #if defined(MBEDTLS_ARC4_C) if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED && suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 ) return( 1 ); #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE && mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 ) return( 1 ); #endif return( 0 ); } static int ssl_write_client_hello( mbedtls_ssl_context *ssl ) { int ret; size_t i, n, olen, ext_len = 0; unsigned char *buf; unsigned char *p, *q; unsigned char offer_compress; const int *ciphersuites; const mbedtls_ssl_ciphersuite_t *ciphersuite_info; #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) int uses_ec = 0; #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client hello" ) ); if( ssl->conf->f_rng == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") ); return( MBEDTLS_ERR_SSL_NO_RNG ); } #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) #endif { ssl->major_ver = ssl->conf->min_major_ver; ssl->minor_ver = ssl->conf->min_minor_ver; } if( ssl->conf->max_major_ver == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "configured max major version is invalid, " "consider using mbedtls_ssl_config_defaults()" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 5 highest version supported * 6 . 9 current UNIX time * 10 . 37 random bytes */ buf = ssl->out_msg; p = buf + 4; mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver, ssl->conf->transport, p ); p += 2; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]", buf[4], buf[5] ) ); if( ( ret = ssl_generate_random( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_generate_random", ret ); return( ret ); } memcpy( p, ssl->handshake->randbytes, 32 ); MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", p, 32 ); p += 32; /* * 38 . 38 session id length * 39 . 39+n session id * 39+n . 39+n DTLS only: cookie length (1 byte) * 40+n . .. DTSL only: cookie * .. . .. ciphersuitelist length (2 bytes) * .. . .. ciphersuitelist * .. . .. compression methods length (1 byte) * .. . .. compression methods * .. . .. extensions length (2 bytes) * .. . .. extensions */ n = ssl->session_negotiate->id_len; if( n < 16 || n > 32 || #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE || #endif ssl->handshake->resume == 0 ) { n = 0; } #if defined(MBEDTLS_SSL_SESSION_TICKETS) /* * RFC 5077 section 3.4: "When presenting a ticket, the client MAY * generate and include a Session ID in the TLS ClientHello." */ #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) #endif { if( ssl->session_negotiate->ticket != NULL && ssl->session_negotiate->ticket_len != 0 ) { ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, 32 ); if( ret != 0 ) return( ret ); ssl->session_negotiate->id_len = n = 32; } } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ *p++ = (unsigned char) n; for( i = 0; i < n; i++ ) *p++ = ssl->session_negotiate->id[i]; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n ); /* * DTLS cookie */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { if( ssl->handshake->verify_cookie == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "no verify cookie to send" ) ); *p++ = 0; } else { MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie", ssl->handshake->verify_cookie, ssl->handshake->verify_cookie_len ); *p++ = ssl->handshake->verify_cookie_len; memcpy( p, ssl->handshake->verify_cookie, ssl->handshake->verify_cookie_len ); p += ssl->handshake->verify_cookie_len; } } #endif /* * Ciphersuite list */ ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; /* Skip writing ciphersuite length for now */ n = 0; q = p; p += 2; for( i = 0; ciphersuites[i] != 0; i++ ) { ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] ); if( ssl_validate_ciphersuite( ciphersuite_info, ssl, ssl->conf->min_minor_ver, ssl->conf->max_minor_ver ) != 0 ) continue; MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %04x", ciphersuites[i] ) ); #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) uses_ec |= mbedtls_ssl_ciphersuite_uses_ec( ciphersuite_info ); #endif n++; *p++ = (unsigned char)( ciphersuites[i] >> 8 ); *p++ = (unsigned char)( ciphersuites[i] ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites (excluding SCSVs)", n ) ); /* * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV */ #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) #endif { MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding EMPTY_RENEGOTIATION_INFO_SCSV" ) ); *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 ); *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO ); n++; } /* Some versions of OpenSSL don't handle it correctly if not at end */ #if defined(MBEDTLS_SSL_FALLBACK_SCSV) if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding FALLBACK_SCSV" ) ); *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ); *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ); n++; } #endif *q++ = (unsigned char)( n >> 7 ); *q++ = (unsigned char)( n << 1 ); #if defined(MBEDTLS_ZLIB_SUPPORT) offer_compress = 1; #else offer_compress = 0; #endif /* * We don't support compression with DTLS right now: if many records come * in the same datagram, uncompressing one could overwrite the next one. * We don't want to add complexity for handling that case unless there is * an actual need for it. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) offer_compress = 0; #endif if( offer_compress ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 2 ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d %d", MBEDTLS_SSL_COMPRESS_DEFLATE, MBEDTLS_SSL_COMPRESS_NULL ) ); *p++ = 2; *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE; *p++ = MBEDTLS_SSL_COMPRESS_NULL; } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", MBEDTLS_SSL_COMPRESS_NULL ) ); *p++ = 1; *p++ = MBEDTLS_SSL_COMPRESS_NULL; } // First write extensions, then the total length // #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif /* Note that TLS_EMPTY_RENEGOTIATION_INFO_SCSV is always added * even if MBEDTLS_SSL_RENEGOTIATION is not defined. */ #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( uses_ec ) { ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; } #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_ALPN) ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif /* olen unused if all extensions are disabled */ ((void) olen); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello, total extension length: %d", ext_len ) ); if( ext_len > 0 ) { *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ext_len ) & 0xFF ); p += ext_len; } ssl->out_msglen = p - buf; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_HELLO; ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_send_flight_completed( ssl ); #endif if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client hello" ) ); return( 0 ); } static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { /* Check verify-data in constant-time. The length OTOH is no secret */ if( len != 1 + ssl->verify_data_len * 2 || buf[0] != ssl->verify_data_len * 2 || mbedtls_ssl_safer_memcmp( buf + 1, ssl->own_verify_data, ssl->verify_data_len ) != 0 || mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len, ssl->peer_verify_data, ssl->verify_data_len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } } else #endif /* MBEDTLS_SSL_RENEGOTIATION */ { if( len != 1 || buf[0] != 0x00 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; } return( 0 ); } #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { /* * server should use the extension only if we did, * and if so the server's value should match ours (and len is always 1) */ if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE || len != 1 || buf[0] != ssl->conf->mfl_code ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching max fragment length extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } return( 0 ); } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED || len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching truncated HMAC extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ((void) buf); ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; return( 0 ); } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching encrypt-then-MAC extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ((void) buf); ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; return( 0 ); } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching extended master secret extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ((void) buf); ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; return( 0 ); } #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED || len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching session ticket extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ((void) buf); ssl->handshake->new_session_ticket = 1; return( 0 ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_size; const unsigned char *p; if( len == 0 || (size_t)( buf[0] + 1 ) != len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } list_size = buf[0]; p = buf + 1; while( list_size > 0 ) { if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED || p[0] == MBEDTLS_ECP_PF_COMPRESSED ) { #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) ssl->handshake->ecdh_ctx.point_format = p[0]; #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ssl->handshake->ecjpake_ctx.point_format = p[0]; #endif MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) ); return( 0 ); } list_size--; p++; } MBEDTLS_SSL_DEBUG_MSG( 1, ( "no point format in common" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; if( ssl->transform_negotiate->ciphersuite_info->key_exchange != MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) ); return( 0 ); } /* If we got here, we no longer need our cached extension */ mbedtls_free( ssl->handshake->ecjpake_cache ); ssl->handshake->ecjpake_cache = NULL; ssl->handshake->ecjpake_cache_len = 0; if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx, buf, len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_ALPN) static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_len, name_len; const char **p; /* If we didn't send it, the server shouldn't send it */ if( ssl->conf->alpn_list == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching ALPN extension" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } /* * opaque ProtocolName<1..2^8-1>; * * struct { * ProtocolName protocol_name_list<2..2^16-1> * } ProtocolNameList; * * the "ProtocolNameList" MUST contain exactly one "ProtocolName" */ /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */ if( len < 4 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } list_len = ( buf[0] << 8 ) | buf[1]; if( list_len != len - 2 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } name_len = buf[2]; if( name_len != list_len - 1 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } /* Check that the server chosen protocol was in our list and save it */ for( p = ssl->conf->alpn_list; *p != NULL; p++ ) { if( name_len == strlen( *p ) && memcmp( buf + 3, *p, name_len ) == 0 ) { ssl->alpn_chosen = *p; return( 0 ); } } MBEDTLS_SSL_DEBUG_MSG( 1, ( "ALPN extension: no matching protocol" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } #endif /* MBEDTLS_SSL_ALPN */ /* * Parse HelloVerifyRequest. Only called after verifying the HS type. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl ) { const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); int major_ver, minor_ver; unsigned char cookie_len; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse hello verify request" ) ); /* * struct { * ProtocolVersion server_version; * opaque cookie<0..2^8-1>; * } HelloVerifyRequest; */ MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 ); mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p ); p += 2; /* * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1) * even is lower than our min version. */ if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 || minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 || major_ver > ssl->conf->max_major_ver || minor_ver > ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server version" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); } cookie_len = *p++; MBEDTLS_SSL_DEBUG_BUF( 3, "cookie", p, cookie_len ); if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "cookie length does not match incoming message size" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } mbedtls_free( ssl->handshake->verify_cookie ); ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len ); if( ssl->handshake->verify_cookie == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc failed (%d bytes)", cookie_len ) ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } memcpy( ssl->handshake->verify_cookie, p, cookie_len ); ssl->handshake->verify_cookie_len = cookie_len; /* Start over at ClientHello */ ssl->state = MBEDTLS_SSL_CLIENT_HELLO; mbedtls_ssl_reset_checksum( ssl ); mbedtls_ssl_recv_flight_completed( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse hello verify request" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) { int ret, i; size_t n; size_t ext_len; unsigned char *buf, *ext; unsigned char comp; #if defined(MBEDTLS_ZLIB_SUPPORT) int accept_comp; #endif #if defined(MBEDTLS_SSL_RENEGOTIATION) int renegotiation_info_seen = 0; #endif int handshake_failure = 0; const mbedtls_ssl_ciphersuite_t *suite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) ); buf = ssl->in_msg; if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { /* No alert on a read error. */ MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { ssl->renego_records_seen++; if( ssl->conf->renego_max_records >= 0 && ssl->renego_records_seen > ssl->conf->renego_max_records ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, " "but not honored by server" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-handshake message during renego" ) ); ssl->keep_current_message = 1; return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "received hello verify request" ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) ); return( ssl_parse_hello_verify_request( ssl ) ); } else { /* We made it through the verification process */ mbedtls_free( ssl->handshake->verify_cookie ); ssl->handshake->verify_cookie = NULL; ssl->handshake->verify_cookie_len = 0; } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) || buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } /* * 0 . 1 server_version * 2 . 33 random (maybe including 4 bytes of Unix time) * 34 . 34 session_id length = n * 35 . 34+n session_id * 35+n . 36+n cipher_suite * 37+n . 37+n compression_method * * 38+n . 39+n extensions length (optional) * 40+n . .. extensions */ buf += mbedtls_ssl_hs_hdr_len( ssl ); MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, version", buf + 0, 2 ); mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver, ssl->conf->transport, buf + 0 ); if( ssl->major_ver < ssl->conf->min_major_ver || ssl->minor_ver < ssl->conf->min_minor_ver || ssl->major_ver > ssl->conf->max_major_ver || ssl->minor_ver > ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server version out of bounds - " " min: [%d:%d], server: [%d:%d], max: [%d:%d]", ssl->conf->min_major_ver, ssl->conf->min_minor_ver, ssl->major_ver, ssl->minor_ver, ssl->conf->max_major_ver, ssl->conf->max_minor_ver ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", ( (uint32_t) buf[2] << 24 ) | ( (uint32_t) buf[3] << 16 ) | ( (uint32_t) buf[4] << 8 ) | ( (uint32_t) buf[5] ) ) ); memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 ); n = buf[34]; MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 2, 32 ); if( n > 32 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n ) { ext_len = ( ( buf[38 + n] << 8 ) | ( buf[39 + n] ) ); if( ( ext_len > 0 && ext_len < 4 ) || ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } } else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n ) { ext_len = 0; } else { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } /* ciphersuite (used later) */ i = ( buf[35 + n] << 8 ) | buf[36 + n]; /* * Read and check compression */ comp = buf[37 + n]; #if defined(MBEDTLS_ZLIB_SUPPORT) /* See comments in ssl_write_client_hello() */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) accept_comp = 0; else #endif accept_comp = 1; if( comp != MBEDTLS_SSL_COMPRESS_NULL && ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) ) #else /* MBEDTLS_ZLIB_SUPPORT */ if( comp != MBEDTLS_SSL_COMPRESS_NULL ) #endif/* MBEDTLS_ZLIB_SUPPORT */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } /* * Initialize update checksum functions */ ssl->transform_negotiate->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( i ); if( ssl->transform_negotiate->ciphersuite_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "ciphersuite info for %04x not found", i ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } mbedtls_ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 35, n ); /* * Check if the session can be resumed */ if( ssl->handshake->resume == 0 || n == 0 || #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE || #endif ssl->session_negotiate->ciphersuite != i || ssl->session_negotiate->compression != comp || ssl->session_negotiate->id_len != n || memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 ) { ssl->state++; ssl->handshake->resume = 0; #if defined(MBEDTLS_HAVE_TIME) ssl->session_negotiate->start = mbedtls_time( NULL ); #endif ssl->session_negotiate->ciphersuite = i; ssl->session_negotiate->compression = comp; ssl->session_negotiate->id_len = n; memcpy( ssl->session_negotiate->id, buf + 35, n ); } else { ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( ret ); } } MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed", ssl->handshake->resume ? "a" : "no" ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %04x", i ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[37 + n] ) ); /* * Perform cipher suite validation in same way as in ssl_write_client_hello. */ i = 0; while( 1 ) { if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } if( ssl->conf->ciphersuite_list[ssl->minor_ver][i++] == ssl->session_negotiate->ciphersuite ) { break; } } suite_info = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite ); if( ssl_validate_ciphersuite( suite_info, ssl, ssl->minor_ver, ssl->minor_ver ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", suite_info->name ) ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA && ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { ssl->handshake->ecrs_enabled = 1; } #endif if( comp != MBEDTLS_SSL_COMPRESS_NULL #if defined(MBEDTLS_ZLIB_SUPPORT) && comp != MBEDTLS_SSL_COMPRESS_DEFLATE #endif ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } ssl->session_negotiate->compression = comp; ext = buf + 40 + n; MBEDTLS_SSL_DEBUG_MSG( 2, ( "server hello, total extension length: %d", ext_len ) ); while( ext_len ) { unsigned int ext_id = ( ( ext[0] << 8 ) | ( ext[1] ) ); unsigned int ext_size = ( ( ext[2] << 8 ) | ( ext[3] ) ); if( ext_size + 4 > ext_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } switch( ext_id ) { case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) renegotiation_info_seen = 1; #endif if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ) ) != 0 ) return( ret ); break; #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max_fragment_length extension" ) ); if( ( ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) case MBEDTLS_TLS_EXT_TRUNCATED_HMAC: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated_hmac extension" ) ); if( ( ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt_then_mac extension" ) ); if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended_master_secret extension" ) ); if( ( ret = ssl_parse_extended_ms_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) case MBEDTLS_TLS_EXT_SESSION_TICKET: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session_ticket extension" ) ); if( ( ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported_point_formats extension" ) ); if( ( ret = ssl_parse_supported_point_formats_ext( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) case MBEDTLS_TLS_EXT_ECJPAKE_KKPP: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake_kkpp extension" ) ); if( ( ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size ) ) != 0 ) { return( ret ); } break; #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_ALPN) case MBEDTLS_TLS_EXT_ALPN: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) ); if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_ALPN */ default: MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)", ext_id ) ); } ext_len -= 4 + ext_size; ext += 4 + ext_size; if( ext_len > 0 && ext_len < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } } /* * Renegotiation security checks */ if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); handshake_failure = 1; } #if defined(MBEDTLS_SSL_RENEGOTIATION) else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION && renegotiation_info_seen == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) ); handshake_failure = 1; } else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) ); handshake_failure = 1; } else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && renegotiation_info_seen == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) ); handshake_failure = 1; } #endif /* MBEDTLS_SSL_RENEGOTIATION */ if( handshake_failure == 1 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) ); return( 0 ); } #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) static int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char **p, unsigned char *end ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; /* * Ephemeral DH parameters: * * struct { * opaque dh_p<1..2^16-1>; * opaque dh_g<1..2^16-1>; * opaque dh_Ys<1..2^16-1>; * } ServerDHParams; */ if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 2, ( "mbedtls_dhm_read_params" ), ret ); return( ret ); } if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "DHM prime too short: %d < %d", ssl->handshake->dhm_ctx.len * 8, ssl->conf->dhm_min_bitlen ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY ); return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl ) { const mbedtls_ecp_curve_info *curve_info; mbedtls_ecp_group_id grp_id; #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) grp_id = ssl->handshake->ecdh_ctx.grp.id; #else grp_id = ssl->handshake->ecdh_ctx.grp_id; #endif curve_info = mbedtls_ecp_curve_info_from_grp_id( grp_id ); if( curve_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDH curve: %s", curve_info->name ) ); #if defined(MBEDTLS_ECP_C) if( mbedtls_ssl_check_curve( ssl, grp_id ) != 0 ) #else if( ssl->handshake->ecdh_ctx.grp.nbits < 163 || ssl->handshake->ecdh_ctx.grp.nbits > 521 ) #endif return( -1 ); MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_QP ); return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) static int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl, unsigned char **p, unsigned char *end ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; /* * Ephemeral ECDH parameters: * * struct { * ECParameters curve_params; * ECPoint public; * } ServerECDHParams; */ if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx, (const unsigned char **) p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_read_params" ), ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } if( ssl_check_server_ecdh_params( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message (ECDHE curve)" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl, unsigned char **p, unsigned char *end ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; size_t len; ((void) ssl); /* * PSK parameters: * * opaque psk_identity_hint<0..2^16-1>; */ if( end - (*p) < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message " "(psk_identity_hint length)" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } len = (*p)[0] << 8 | (*p)[1]; *p += 2; if( end - (*p) < (int) len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message " "(psk_identity_hint length)" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } /* * Note: we currently ignore the PKS identity hint, as we only allow one * PSK to be provisionned on the client. This could be changed later if * someone needs that feature. */ *p += len; ret = 0; return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) /* * Generate a pre-master secret and encrypt it with the server's RSA key */ static int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl, size_t offset, size_t *olen, size_t pms_offset ) { int ret; size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2; unsigned char *p = ssl->handshake->premaster + pms_offset; if( offset + len_bytes > MBEDTLS_SSL_OUT_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small for encrypted pms" ) ); return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); } /* * Generate (part of) the pre-master as * struct { * ProtocolVersion client_version; * opaque random[46]; * } PreMasterSecret; */ mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver, ssl->conf->transport, p ); if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "f_rng", ret ); return( ret ); } ssl->handshake->pmslen = 48; if( ssl->session_negotiate->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* * Now write it out, encrypted */ if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, MBEDTLS_PK_RSA ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate key type mismatch" ) ); return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); } if( ( ret = mbedtls_pk_encrypt( &ssl->session_negotiate->peer_cert->pk, p, ssl->handshake->pmslen, ssl->out_msg + offset + len_bytes, olen, MBEDTLS_SSL_OUT_CONTENT_LEN - offset - len_bytes, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_rsa_pkcs1_encrypt", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( len_bytes == 2 ) { ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 ); ssl->out_msg[offset+1] = (unsigned char)( *olen ); *olen += 2; } #endif return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) static int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl, unsigned char **p, unsigned char *end, mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg ) { ((void) ssl); *md_alg = MBEDTLS_MD_NONE; *pk_alg = MBEDTLS_PK_NONE; /* Only in TLS 1.2 */ if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) { return( 0 ); } if( (*p) + 2 > end ) return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); /* * Get hash algorithm */ if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) ) == MBEDTLS_MD_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Server used unsupported " "HashAlgorithm %d", *(p)[0] ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } /* * Get signature algorithm */ if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) ) == MBEDTLS_PK_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used unsupported " "SignatureAlgorithm %d", (*p)[1] ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } /* * Check if the hash is acceptable */ if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server used HashAlgorithm %d that was not offered", *(p)[0] ) ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used SignatureAlgorithm %d", (*p)[1] ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "Server used HashAlgorithm %d", (*p)[0] ) ); *p += 2; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl ) { int ret; const mbedtls_ecp_keypair *peer_key; if( ssl->session_negotiate->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, MBEDTLS_PK_ECKEY ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) ); return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); } peer_key = mbedtls_pk_ec( ssl->session_negotiate->peer_cert->pk ); if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key, MBEDTLS_ECDH_THEIRS ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret ); return( ret ); } if( ssl_check_server_ecdh_params( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server certificate (ECDH curve)" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ static int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl ) { int ret; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; unsigned char *p = NULL, *end = NULL; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) ); #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) ); ssl->state++; return( 0 ); } ((void) p); ((void) end); #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA ) { if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_ecdh_params_from_cert", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) ); ssl->state++; return( 0 ); } ((void) p); ((void) end); #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled && ssl->handshake->ecrs_state == ssl_ecrs_ske_start_processing ) { goto start_processing; } #endif if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server * doesn't use a psk_identity_hint */ if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE ) { if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { /* Current message is probably either * CertificateRequest or ServerHelloDone */ ssl->keep_current_message = 1; goto exit; } MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key exchange message must " "not be skipped" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) ssl->handshake->ecrs_state = ssl_ecrs_ske_start_processing; start_processing: #endif p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); end = ssl->in_msg + ssl->in_hslen; MBEDTLS_SSL_DEBUG_BUF( 3, "server key exchange", p, end - p ); #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } /* FALLTROUGH */ #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) ; /* nothing more to do */ else #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED || MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) { if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ) { if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx, p, end - p ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) ) { size_t sig_len, hashlen; unsigned char hash[64]; mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE; mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); size_t params_len = p - params; void *rs_ctx = NULL; /* * Handle the digitally-signed structure */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { if( ssl_parse_signature_algorithm( ssl, &p, end, &md_alg, &pk_alg ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ) { pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ); /* Default hash for ECDSA is SHA-1 */ if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE ) md_alg = MBEDTLS_MD_SHA1; } else #endif { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * Read signature */ if( p > end - 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } sig_len = ( p[0] << 8 ) | p[1]; p += 2; if( p != end - sig_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } MBEDTLS_SSL_DEBUG_BUF( 3, "signature", p, sig_len ); /* * Compute the hash that has been signed */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( md_alg == MBEDTLS_MD_NONE ) { hashlen = 36; ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, params, params_len ); if( ret != 0 ) return( ret ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( md_alg != MBEDTLS_MD_NONE ) { ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen, params, params_len, md_alg ); if( ret != 0 ) return( ret ); } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen ); if( ssl->session_negotiate->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "certificate required" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* * Verify signature */ if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) rs_ctx = &ssl->handshake->ecrs_ctx.pk; #endif if( ( ret = mbedtls_pk_verify_restartable( &ssl->session_negotiate->peer_cert->pk, md_alg, hash, hashlen, p, sig_len, rs_ctx ) ) != 0 ) { #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) #endif mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR ); MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ exit: ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) ); return( 0 ); } #if ! defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED) static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) ); if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */ static int ssl_parse_certificate_request( mbedtls_ssl_context *ssl ) { int ret; unsigned char *buf; size_t n = 0; size_t cert_type_len = 0, dn_len = 0; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) ); if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate request" ) ); ssl->state++; return( 0 ); } if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } ssl->state++; ssl->client_auth = ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "got %s certificate request", ssl->client_auth ? "a" : "no" ) ); if( ssl->client_auth == 0 ) { /* Current message is probably the ServerHelloDone */ ssl->keep_current_message = 1; goto exit; } /* * struct { * ClientCertificateType certificate_types<1..2^8-1>; * SignatureAndHashAlgorithm * supported_signature_algorithms<2^16-1>; -- TLS 1.2 only * DistinguishedName certificate_authorities<0..2^16-1>; * } CertificateRequest; * * Since we only support a single certificate on clients, let's just * ignore all the information that's supposed to help us pick a * certificate. * * We could check that our certificate matches the request, and bail out * if it doesn't, but it's simpler to just send the certificate anyway, * and give the server the opportunity to decide if it should terminate * the connection when it doesn't like our certificate. * * Same goes for the hash in TLS 1.2's signature_algorithms: at this * point we only have one hash available (see comments in * write_certificate_verify), so let's just use what we have. * * However, we still minimally parse the message to check it is at least * superficially sane. */ buf = ssl->in_msg; /* certificate_types */ if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); } cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )]; n = cert_type_len; /* * In the subsequent code there are two paths that read from buf: * * the length of the signature algorithms field (if minor version of * SSL is 3), * * distinguished name length otherwise. * Both reach at most the index: * ...hdr_len + 2 + n, * therefore the buffer length at this point must be greater than that * regardless of the actual code path. */ if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); } /* supported_signature_algorithms */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { size_t sig_alg_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 ) | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) ); #if defined(MBEDTLS_DEBUG_C) unsigned char* sig_alg; size_t i; #endif /* * The furthest access in buf is in the loop few lines below: * sig_alg[i + 1], * where: * sig_alg = buf + ...hdr_len + 3 + n, * max(i) = sig_alg_len - 1. * Therefore the furthest access is: * buf[...hdr_len + 3 + n + sig_alg_len - 1 + 1], * which reduces to: * buf[...hdr_len + 3 + n + sig_alg_len], * which is one less than we need the buf to be. */ if( ssl->in_hslen <= mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n + sig_alg_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); } #if defined(MBEDTLS_DEBUG_C) sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n; for( i = 0; i < sig_alg_len; i += 2 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "Supported Signature Algorithm found: %d" ",%d", sig_alg[i], sig_alg[i + 1] ) ); } #endif n += 2 + sig_alg_len; } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ /* certificate_authorities */ dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] << 8 ) | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n] ) ); n += dn_len; if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST ); } exit: MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) ); return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */ static int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) ); if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) || ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE ); } ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_recv_flight_completed( ssl ); #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) ); return( 0 ); } static int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl ) { int ret; size_t i, n; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) ); #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ) { /* * DHM key exchange -- send G^X mod P */ n = ssl->handshake->dhm_ctx.len; ssl->out_msg[4] = (unsigned char)( n >> 8 ); ssl->out_msg[5] = (unsigned char)( n ); i = 6; ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx, (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ), &ssl->out_msg[i], n, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX ); if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx, ssl->handshake->premaster, MBEDTLS_PREMASTER_SIZE, &ssl->handshake->pmslen, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA ) { /* * ECDH key exchange -- send client public value */ i = 4; #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) { if( ssl->handshake->ecrs_state == ssl_ecrs_cke_ecdh_calc_secret ) goto ecdh_calc_secret; mbedtls_ecdh_enable_restart( &ssl->handshake->ecdh_ctx ); } #endif ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n, &ssl->out_msg[i], 1000, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Q ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) { ssl->handshake->ecrs_n = n; ssl->handshake->ecrs_state = ssl_ecrs_cke_ecdh_calc_secret; } ecdh_calc_secret: if( ssl->handshake->ecrs_enabled ) n = ssl->handshake->ecrs_n; #endif if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &ssl->handshake->pmslen, ssl->handshake->premaster, MBEDTLS_MPI_MAX_SIZE, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Z ); } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) if( mbedtls_ssl_ciphersuite_uses_psk( ciphersuite_info ) ) { /* * opaque psk_identity<0..2^16-1>; */ if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for PSK" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } i = 4; n = ssl->conf->psk_identity_len; if( i + 2 + n > MBEDTLS_SSL_OUT_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity too long or " "SSL buffer too short" ) ); return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); } ssl->out_msg[i++] = (unsigned char)( n >> 8 ); ssl->out_msg[i++] = (unsigned char)( n ); memcpy( ssl->out_msg + i, ssl->conf->psk_identity, ssl->conf->psk_identity_len ); i += ssl->conf->psk_identity_len; #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ) { n = 0; } else #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 ) return( ret ); } else #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) { /* * ClientDiffieHellmanPublic public (DHM send G^X mod P) */ n = ssl->handshake->dhm_ctx.len; if( i + 2 + n > MBEDTLS_SSL_OUT_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "psk identity or DHM size too long" " or SSL buffer too short" ) ); return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); } ssl->out_msg[i++] = (unsigned char)( n >> 8 ); ssl->out_msg[i++] = (unsigned char)( n ); ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx, (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ), &ssl->out_msg[i], n, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_public", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { /* * ClientECDiffieHellmanPublic public; */ ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n, &ssl->out_msg[i], MBEDTLS_SSL_OUT_CONTENT_LEN - i, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_public", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Q ); } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) { i = 4; if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 ) return( ret ); } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { i = 4; ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx, ssl->out_msg + i, MBEDTLS_SSL_OUT_CONTENT_LEN - i, &n, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret ); return( ret ); } ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx, ssl->handshake->premaster, 32, &ssl->handshake->pmslen, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ { ((void) ciphersuite_info); MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->out_msglen = i + n; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE; ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) ); return( 0 ); } #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) ); if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); return( ret ); } if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else static int ssl_write_certificate_verify( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; size_t n = 0, offset = 0; unsigned char hash[48]; unsigned char *hash_start = hash; mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE; unsigned int hashlen; void *rs_ctx = NULL; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled && ssl->handshake->ecrs_state == ssl_ecrs_crt_vrfy_sign ) { goto sign; } #endif if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); return( ret ); } if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) ); ssl->state++; return( 0 ); } if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) ); ssl->state++; return( 0 ); } if( mbedtls_ssl_own_key( ssl ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key for certificate" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } /* * Make a signature of the handshake digests */ #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) ssl->handshake->ecrs_state = ssl_ecrs_crt_vrfy_sign; sign: #endif ssl->handshake->calc_verify( ssl, hash ); #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) { /* * digitally-signed struct { * opaque md5_hash[16]; * opaque sha_hash[20]; * }; * * md5_hash * MD5(handshake_messages); * * sha_hash * SHA(handshake_messages); */ hashlen = 36; md_alg = MBEDTLS_MD_NONE; /* * For ECDSA, default hash is SHA-1 only */ if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) ) { hash_start += 16; hashlen -= 16; md_alg = MBEDTLS_MD_SHA1; } } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { /* * digitally-signed struct { * opaque handshake_messages[handshake_messages_length]; * }; * * Taking shortcut here. We assume that the server always allows the * PRF Hash function and has sent it in the allowed signature * algorithms list received in the Certificate Request message. * * Until we encounter a server that does not, we will take this * shortcut. * * Reason: Otherwise we should have running hashes for SHA512 and SHA224 * in order to satisfy 'weird' needs from the server side. */ if( ssl->transform_negotiate->ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) { md_alg = MBEDTLS_MD_SHA384; ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384; } else { md_alg = MBEDTLS_MD_SHA256; ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256; } ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) ); /* Info from md_alg will be used instead */ hashlen = 0; offset = 2; } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled ) rs_ctx = &ssl->handshake->ecrs_ctx.pk; #endif if( ( ret = mbedtls_pk_sign_restartable( mbedtls_ssl_own_key( ssl ), md_alg, hash_start, hashlen, ssl->out_msg + 6 + offset, &n, ssl->conf->f_rng, ssl->conf->p_rng, rs_ctx ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret ); #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; #endif return( ret ); } ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 ); ssl->out_msg[5 + offset] = (unsigned char)( n ); ssl->out_msglen = 6 + n + offset; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY; ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) ); return( ret ); } #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl ) { int ret; uint32_t lifetime; size_t ticket_len; unsigned char *ticket; const unsigned char *msg; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse new session ticket" ) ); if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* * struct { * uint32 ticket_lifetime_hint; * opaque ticket<0..2^16-1>; * } NewSessionTicket; * * 0 . 3 ticket_lifetime_hint * 4 . 5 ticket_len (n) * 6 . 5+n ticket content */ if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET || ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET ); } msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); lifetime = ( ((uint32_t) msg[0]) << 24 ) | ( msg[1] << 16 ) | ( msg[2] << 8 ) | ( msg[3] ); ticket_len = ( msg[4] << 8 ) | ( msg[5] ); if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad new session ticket message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", ticket_len ) ); /* We're not waiting for a NewSessionTicket message any more */ ssl->handshake->new_session_ticket = 0; ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; /* * Zero-length ticket means the server changed his mind and doesn't want * to send a ticket after all, so just forget it */ if( ticket_len == 0 ) return( 0 ); mbedtls_platform_zeroize( ssl->session_negotiate->ticket, ssl->session_negotiate->ticket_len ); mbedtls_free( ssl->session_negotiate->ticket ); ssl->session_negotiate->ticket = NULL; ssl->session_negotiate->ticket_len = 0; if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "ticket alloc failed" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } memcpy( ticket, msg + 6, ticket_len ); ssl->session_negotiate->ticket = ticket; ssl->session_negotiate->ticket_len = ticket_len; ssl->session_negotiate->ticket_lifetime = lifetime; /* * RFC 5077 section 3.4: * "If the client receives a session ticket from the server, then it * discards any Session ID that was sent in the ServerHello." */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket in use, discarding session id" ) ); ssl->session_negotiate->id_len = 0; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse new session ticket" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ /* * SSL handshake -- client side -- single step */ int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl ) { int ret = 0; if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) ); if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) { if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* Change state now, so that it is right in mbedtls_ssl_read_record(), used * by DTLS for dropping out-of-sequence ChangeCipherSpec records */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC && ssl->handshake->new_session_ticket != 0 ) { ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET; } #endif switch( ssl->state ) { case MBEDTLS_SSL_HELLO_REQUEST: ssl->state = MBEDTLS_SSL_CLIENT_HELLO; break; /* * ==> ClientHello */ case MBEDTLS_SSL_CLIENT_HELLO: ret = ssl_write_client_hello( ssl ); break; /* * <== ServerHello * Certificate * ( ServerKeyExchange ) * ( CertificateRequest ) * ServerHelloDone */ case MBEDTLS_SSL_SERVER_HELLO: ret = ssl_parse_server_hello( ssl ); break; case MBEDTLS_SSL_SERVER_CERTIFICATE: ret = mbedtls_ssl_parse_certificate( ssl ); break; case MBEDTLS_SSL_SERVER_KEY_EXCHANGE: ret = ssl_parse_server_key_exchange( ssl ); break; case MBEDTLS_SSL_CERTIFICATE_REQUEST: ret = ssl_parse_certificate_request( ssl ); break; case MBEDTLS_SSL_SERVER_HELLO_DONE: ret = ssl_parse_server_hello_done( ssl ); break; /* * ==> ( Certificate/Alert ) * ClientKeyExchange * ( CertificateVerify ) * ChangeCipherSpec * Finished */ case MBEDTLS_SSL_CLIENT_CERTIFICATE: ret = mbedtls_ssl_write_certificate( ssl ); break; case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE: ret = ssl_write_client_key_exchange( ssl ); break; case MBEDTLS_SSL_CERTIFICATE_VERIFY: ret = ssl_write_certificate_verify( ssl ); break; case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC: ret = mbedtls_ssl_write_change_cipher_spec( ssl ); break; case MBEDTLS_SSL_CLIENT_FINISHED: ret = mbedtls_ssl_write_finished( ssl ); break; /* * <== ( NewSessionTicket ) * ChangeCipherSpec * Finished */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET: ret = ssl_parse_new_session_ticket( ssl ); break; #endif case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC: ret = mbedtls_ssl_parse_change_cipher_spec( ssl ); break; case MBEDTLS_SSL_SERVER_FINISHED: ret = mbedtls_ssl_parse_finished( ssl ); break; case MBEDTLS_SSL_FLUSH_BUFFERS: MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) ); ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; break; case MBEDTLS_SSL_HANDSHAKE_WRAPUP: mbedtls_ssl_handshake_wrapup( ssl ); break; default: MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } return( ret ); } #endif /* MBEDTLS_SSL_CLI_C */ fldigi-4.2.05/src/mbedtls/des.c0000664000175000017500000007625114611711171013136 00000000000000/* * FIPS-46-3 compliant Triple-DES implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * DES, on which TDES is based, was originally designed by Horst Feistel * at IBM in 1974, and was adopted as a standard by NIST (formerly NBS). * * http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_DES_C) #include "mbedtls/des.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_DES_ALT) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif /* * Expanded DES S-boxes */ static const uint32_t SB1[64] = { 0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000, 0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004, 0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404, 0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000, 0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400, 0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404, 0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400, 0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004 }; static const uint32_t SB2[64] = { 0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020, 0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020, 0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000, 0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020, 0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000, 0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000, 0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020, 0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000 }; static const uint32_t SB3[64] = { 0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200, 0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208, 0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208, 0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000, 0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000, 0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008, 0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008, 0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200 }; static const uint32_t SB4[64] = { 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001, 0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001, 0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080, 0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081, 0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000, 0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081, 0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080 }; static const uint32_t SB5[64] = { 0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000, 0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000, 0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100, 0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100, 0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100, 0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000, 0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000, 0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100 }; static const uint32_t SB6[64] = { 0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000, 0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010, 0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010, 0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000, 0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010, 0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000, 0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010, 0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010 }; static const uint32_t SB7[64] = { 0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800, 0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802, 0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002, 0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800, 0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002, 0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800, 0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802, 0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002 }; static const uint32_t SB8[64] = { 0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000, 0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040, 0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000, 0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000, 0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040, 0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040, 0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000, 0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000 }; /* * PC1: left and right halves bit-swap */ static const uint32_t LHs[16] = { 0x00000000, 0x00000001, 0x00000100, 0x00000101, 0x00010000, 0x00010001, 0x00010100, 0x00010101, 0x01000000, 0x01000001, 0x01000100, 0x01000101, 0x01010000, 0x01010001, 0x01010100, 0x01010101 }; static const uint32_t RHs[16] = { 0x00000000, 0x01000000, 0x00010000, 0x01010000, 0x00000100, 0x01000100, 0x00010100, 0x01010100, 0x00000001, 0x01000001, 0x00010001, 0x01010001, 0x00000101, 0x01000101, 0x00010101, 0x01010101, }; /* * Initial Permutation macro */ #define DES_IP(X,Y) \ { \ T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \ T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \ X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \ } /* * Final Permutation macro */ #define DES_FP(X,Y) \ { \ X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \ T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \ Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \ T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \ T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \ T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \ T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \ } /* * DES round macro */ #define DES_ROUND(X,Y) \ { \ T = *SK++ ^ X; \ Y ^= SB8[ (T ) & 0x3F ] ^ \ SB6[ (T >> 8) & 0x3F ] ^ \ SB4[ (T >> 16) & 0x3F ] ^ \ SB2[ (T >> 24) & 0x3F ]; \ \ T = *SK++ ^ ((X << 28) | (X >> 4)); \ Y ^= SB7[ (T ) & 0x3F ] ^ \ SB5[ (T >> 8) & 0x3F ] ^ \ SB3[ (T >> 16) & 0x3F ] ^ \ SB1[ (T >> 24) & 0x3F ]; \ } #define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; } void mbedtls_des_init( mbedtls_des_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_des_context ) ); } void mbedtls_des_free( mbedtls_des_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_des_context ) ); } void mbedtls_des3_init( mbedtls_des3_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_des3_context ) ); } void mbedtls_des3_free( mbedtls_des3_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_des3_context ) ); } static const unsigned char odd_parity_table[128] = { 1, 2, 4, 7, 8, 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44, 47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81, 82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112, 115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140, 143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168, 171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196, 199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224, 227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253, 254 }; void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ ) key[i] = odd_parity_table[key[i] / 2]; } /* * Check the given key's parity, returns 1 on failure, 0 on SUCCESS */ int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ ) if( key[i] != odd_parity_table[key[i] / 2] ) return( 1 ); return( 0 ); } /* * Table of weak and semi-weak keys * * Source: http://en.wikipedia.org/wiki/Weak_key * * Weak: * Alternating ones + zeros (0x0101010101010101) * Alternating 'F' + 'E' (0xFEFEFEFEFEFEFEFE) * '0xE0E0E0E0F1F1F1F1' * '0x1F1F1F1F0E0E0E0E' * * Semi-weak: * 0x011F011F010E010E and 0x1F011F010E010E01 * 0x01E001E001F101F1 and 0xE001E001F101F101 * 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01 * 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E * 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E * 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1 * */ #define WEAK_KEY_COUNT 16 static const unsigned char weak_key_table[WEAK_KEY_COUNT][MBEDTLS_DES_KEY_SIZE] = { { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE }, { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E }, { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 }, { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E }, { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 }, { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 }, { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 }, { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE }, { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 }, { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 }, { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E }, { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE }, { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E }, { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE }, { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 } }; int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; for( i = 0; i < WEAK_KEY_COUNT; i++ ) if( memcmp( weak_key_table[i], key, MBEDTLS_DES_KEY_SIZE) == 0 ) return( 1 ); return( 0 ); } #if !defined(MBEDTLS_DES_SETKEY_ALT) void mbedtls_des_setkey( uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; uint32_t X, Y, T; GET_UINT32_BE( X, key, 0 ); GET_UINT32_BE( Y, key, 4 ); /* * Permuted Choice 1 */ T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4); T = ((Y ) ^ X) & 0x10101010; X ^= T; Y ^= (T ); X = (LHs[ (X ) & 0xF] << 3) | (LHs[ (X >> 8) & 0xF ] << 2) | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ] ) | (LHs[ (X >> 5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6) | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4); Y = (RHs[ (Y >> 1) & 0xF] << 3) | (RHs[ (Y >> 9) & 0xF ] << 2) | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ] ) | (RHs[ (Y >> 4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6) | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4); X &= 0x0FFFFFFF; Y &= 0x0FFFFFFF; /* * calculate subkeys */ for( i = 0; i < 16; i++ ) { if( i < 2 || i == 8 || i == 15 ) { X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF; Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF; } else { X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF; Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF; } *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000) | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000) | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000) | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000) | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000) | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000) | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400) | ((Y >> 14) & 0x00000200) | ((Y ) & 0x00000100) | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010) | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004) | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001); *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000) | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000) | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000) | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000) | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000) | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000) | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000) | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400) | ((Y ) & 0x00000200) | ((Y << 7) & 0x00000100) | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011) | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002); } } #endif /* !MBEDTLS_DES_SETKEY_ALT */ /* * DES key schedule (56-bit, encryption) */ int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { mbedtls_des_setkey( ctx->sk, key ); return( 0 ); } /* * DES key schedule (56-bit, decryption) */ int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ) { int i; mbedtls_des_setkey( ctx->sk, key ); for( i = 0; i < 16; i += 2 ) { SWAP( ctx->sk[i ], ctx->sk[30 - i] ); SWAP( ctx->sk[i + 1], ctx->sk[31 - i] ); } return( 0 ); } static void des3_set2key( uint32_t esk[96], uint32_t dsk[96], const unsigned char key[MBEDTLS_DES_KEY_SIZE*2] ) { int i; mbedtls_des_setkey( esk, key ); mbedtls_des_setkey( dsk + 32, key + 8 ); for( i = 0; i < 32; i += 2 ) { dsk[i ] = esk[30 - i]; dsk[i + 1] = esk[31 - i]; esk[i + 32] = dsk[62 - i]; esk[i + 33] = dsk[63 - i]; esk[i + 64] = esk[i ]; esk[i + 65] = esk[i + 1]; dsk[i + 64] = dsk[i ]; dsk[i + 65] = dsk[i + 1]; } } /* * Triple-DES key schedule (112-bit, encryption) */ int mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ) { uint32_t sk[96]; des3_set2key( ctx->sk, sk, key ); mbedtls_platform_zeroize( sk, sizeof( sk ) ); return( 0 ); } /* * Triple-DES key schedule (112-bit, decryption) */ int mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ) { uint32_t sk[96]; des3_set2key( sk, ctx->sk, key ); mbedtls_platform_zeroize( sk, sizeof( sk ) ); return( 0 ); } static void des3_set3key( uint32_t esk[96], uint32_t dsk[96], const unsigned char key[24] ) { int i; mbedtls_des_setkey( esk, key ); mbedtls_des_setkey( dsk + 32, key + 8 ); mbedtls_des_setkey( esk + 64, key + 16 ); for( i = 0; i < 32; i += 2 ) { dsk[i ] = esk[94 - i]; dsk[i + 1] = esk[95 - i]; esk[i + 32] = dsk[62 - i]; esk[i + 33] = dsk[63 - i]; dsk[i + 64] = esk[30 - i]; dsk[i + 65] = esk[31 - i]; } } /* * Triple-DES key schedule (168-bit, encryption) */ int mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ) { uint32_t sk[96]; des3_set3key( ctx->sk, sk, key ); mbedtls_platform_zeroize( sk, sizeof( sk ) ); return( 0 ); } /* * Triple-DES key schedule (168-bit, decryption) */ int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ) { uint32_t sk[96]; des3_set3key( sk, ctx->sk, key ); mbedtls_platform_zeroize( sk, sizeof( sk ) ); return( 0 ); } /* * DES-ECB block encryption/decryption */ #if !defined(MBEDTLS_DES_CRYPT_ECB_ALT) int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx, const unsigned char input[8], unsigned char output[8] ) { int i; uint32_t X, Y, T, *SK; SK = ctx->sk; GET_UINT32_BE( X, input, 0 ); GET_UINT32_BE( Y, input, 4 ); DES_IP( X, Y ); for( i = 0; i < 8; i++ ) { DES_ROUND( Y, X ); DES_ROUND( X, Y ); } DES_FP( Y, X ); PUT_UINT32_BE( Y, output, 0 ); PUT_UINT32_BE( X, output, 4 ); return( 0 ); } #endif /* !MBEDTLS_DES_CRYPT_ECB_ALT */ #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * DES-CBC buffer encryption/decryption */ int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[8]; if( length % 8 ) return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_DES_ENCRYPT ) { while( length > 0 ) { for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_des_crypt_ecb( ctx, output, output ); memcpy( iv, output, 8 ); input += 8; output += 8; length -= 8; } } else /* MBEDTLS_DES_DECRYPT */ { while( length > 0 ) { memcpy( temp, input, 8 ); mbedtls_des_crypt_ecb( ctx, input, output ); for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 8 ); input += 8; output += 8; length -= 8; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ /* * 3DES-ECB block encryption/decryption */ #if !defined(MBEDTLS_DES3_CRYPT_ECB_ALT) int mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx, const unsigned char input[8], unsigned char output[8] ) { int i; uint32_t X, Y, T, *SK; SK = ctx->sk; GET_UINT32_BE( X, input, 0 ); GET_UINT32_BE( Y, input, 4 ); DES_IP( X, Y ); for( i = 0; i < 8; i++ ) { DES_ROUND( Y, X ); DES_ROUND( X, Y ); } for( i = 0; i < 8; i++ ) { DES_ROUND( X, Y ); DES_ROUND( Y, X ); } for( i = 0; i < 8; i++ ) { DES_ROUND( Y, X ); DES_ROUND( X, Y ); } DES_FP( Y, X ); PUT_UINT32_BE( Y, output, 0 ); PUT_UINT32_BE( X, output, 4 ); return( 0 ); } #endif /* !MBEDTLS_DES3_CRYPT_ECB_ALT */ #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * 3DES-CBC buffer encryption/decryption */ int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx, int mode, size_t length, unsigned char iv[8], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[8]; if( length % 8 ) return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_DES_ENCRYPT ) { while( length > 0 ) { for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_des3_crypt_ecb( ctx, output, output ); memcpy( iv, output, 8 ); input += 8; output += 8; length -= 8; } } else /* MBEDTLS_DES_DECRYPT */ { while( length > 0 ) { memcpy( temp, input, 8 ); mbedtls_des3_crypt_ecb( ctx, input, output ); for( i = 0; i < 8; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 8 ); input += 8; output += 8; length -= 8; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* !MBEDTLS_DES_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * DES and 3DES test vectors from: * * http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip */ static const unsigned char des3_test_keys[24] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23 }; static const unsigned char des3_test_buf[8] = { 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74 }; static const unsigned char des3_test_ecb_dec[3][8] = { { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D }, { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB }, { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A } }; static const unsigned char des3_test_ecb_enc[3][8] = { { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B }, { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 }, { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 } }; #if defined(MBEDTLS_CIPHER_MODE_CBC) static const unsigned char des3_test_iv[8] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, }; static const unsigned char des3_test_cbc_dec[3][8] = { { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 }, { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 }, { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C } }; static const unsigned char des3_test_cbc_enc[3][8] = { { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 }, { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D }, { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 } }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ /* * Checkup routine */ int mbedtls_des_self_test( int verbose ) { int i, j, u, v, ret = 0; mbedtls_des_context ctx; mbedtls_des3_context ctx3; unsigned char buf[8]; #if defined(MBEDTLS_CIPHER_MODE_CBC) unsigned char prv[8]; unsigned char iv[8]; #endif mbedtls_des_init( &ctx ); mbedtls_des3_init( &ctx3 ); /* * ECB mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; v = i & 1; if( verbose != 0 ) mbedtls_printf( " DES%c-ECB-%3d (%s): ", ( u == 0 ) ? ' ' : '3', 56 + u * 56, ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" ); memcpy( buf, des3_test_buf, 8 ); switch( i ) { case 0: mbedtls_des_setkey_dec( &ctx, des3_test_keys ); break; case 1: mbedtls_des_setkey_enc( &ctx, des3_test_keys ); break; case 2: mbedtls_des3_set2key_dec( &ctx3, des3_test_keys ); break; case 3: mbedtls_des3_set2key_enc( &ctx3, des3_test_keys ); break; case 4: mbedtls_des3_set3key_dec( &ctx3, des3_test_keys ); break; case 5: mbedtls_des3_set3key_enc( &ctx3, des3_test_keys ); break; default: return( 1 ); } for( j = 0; j < 10000; j++ ) { if( u == 0 ) mbedtls_des_crypt_ecb( &ctx, buf, buf ); else mbedtls_des3_crypt_ecb( &ctx3, buf, buf ); } if( ( v == MBEDTLS_DES_DECRYPT && memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) || ( v != MBEDTLS_DES_DECRYPT && memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * CBC mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; v = i & 1; if( verbose != 0 ) mbedtls_printf( " DES%c-CBC-%3d (%s): ", ( u == 0 ) ? ' ' : '3', 56 + u * 56, ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" ); memcpy( iv, des3_test_iv, 8 ); memcpy( prv, des3_test_iv, 8 ); memcpy( buf, des3_test_buf, 8 ); switch( i ) { case 0: mbedtls_des_setkey_dec( &ctx, des3_test_keys ); break; case 1: mbedtls_des_setkey_enc( &ctx, des3_test_keys ); break; case 2: mbedtls_des3_set2key_dec( &ctx3, des3_test_keys ); break; case 3: mbedtls_des3_set2key_enc( &ctx3, des3_test_keys ); break; case 4: mbedtls_des3_set3key_dec( &ctx3, des3_test_keys ); break; case 5: mbedtls_des3_set3key_enc( &ctx3, des3_test_keys ); break; default: return( 1 ); } if( v == MBEDTLS_DES_DECRYPT ) { for( j = 0; j < 10000; j++ ) { if( u == 0 ) mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf ); else mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf ); } } else { for( j = 0; j < 10000; j++ ) { unsigned char tmp[8]; if( u == 0 ) mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf ); else mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf ); memcpy( tmp, prv, 8 ); memcpy( prv, buf, 8 ); memcpy( buf, tmp, 8 ); } memcpy( buf, prv, 8 ); } if( ( v == MBEDTLS_DES_DECRYPT && memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) || ( v != MBEDTLS_DES_DECRYPT && memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ if( verbose != 0 ) mbedtls_printf( "\n" ); exit: mbedtls_des_free( &ctx ); mbedtls_des3_free( &ctx3 ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_DES_C */ fldigi-4.2.05/src/mbedtls/pk_wrap.c0000664000175000017500000005042014611711171014014 00000000000000/* * Public Key abstraction layer: wrapper functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PK_C) #include "mbedtls/pk_internal.h" /* Even if RSA not activated, for the sake of RSA-alt */ #include "mbedtls/rsa.h" #include #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #endif #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) #include "mbedtls/platform_util.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include #include #if defined(MBEDTLS_RSA_C) static int rsa_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_RSA || type == MBEDTLS_PK_RSASSA_PSS ); } static size_t rsa_get_bitlen( const void *ctx ) { const mbedtls_rsa_context * rsa = (const mbedtls_rsa_context *) ctx; return( 8 * mbedtls_rsa_get_len( rsa ) ); } static int rsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { int ret; mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx; size_t rsa_len = mbedtls_rsa_get_len( rsa ); #if SIZE_MAX > UINT_MAX if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #endif /* SIZE_MAX > UINT_MAX */ if( sig_len < rsa_len ) return( MBEDTLS_ERR_RSA_VERIFY_FAILED ); if( ( ret = mbedtls_rsa_pkcs1_verify( rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, md_alg, (unsigned int) hash_len, hash, sig ) ) != 0 ) return( ret ); /* The buffer contains a valid signature followed by extra data. * We have a special error code for that so that so that callers can * use mbedtls_pk_verify() to check "Does the buffer start with a * valid signature?" and not just "Does the buffer contain a valid * signature?". */ if( sig_len > rsa_len ) return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH ); return( 0 ); } static int rsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx; #if SIZE_MAX > UINT_MAX if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #endif /* SIZE_MAX > UINT_MAX */ *sig_len = mbedtls_rsa_get_len( rsa ); return( mbedtls_rsa_pkcs1_sign( rsa, f_rng, p_rng, MBEDTLS_RSA_PRIVATE, md_alg, (unsigned int) hash_len, hash, sig ) ); } static int rsa_decrypt_wrap( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx; if( ilen != mbedtls_rsa_get_len( rsa ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); return( mbedtls_rsa_pkcs1_decrypt( rsa, f_rng, p_rng, MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) ); } static int rsa_encrypt_wrap( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx; *olen = mbedtls_rsa_get_len( rsa ); if( *olen > osize ) return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE ); return( mbedtls_rsa_pkcs1_encrypt( rsa, f_rng, p_rng, MBEDTLS_RSA_PUBLIC, ilen, input, output ) ); } static int rsa_check_pair_wrap( const void *pub, const void *prv ) { return( mbedtls_rsa_check_pub_priv( (const mbedtls_rsa_context *) pub, (const mbedtls_rsa_context *) prv ) ); } static void *rsa_alloc_wrap( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_context ) ); if( ctx != NULL ) mbedtls_rsa_init( (mbedtls_rsa_context *) ctx, 0, 0 ); return( ctx ); } static void rsa_free_wrap( void *ctx ) { mbedtls_rsa_free( (mbedtls_rsa_context *) ctx ); mbedtls_free( ctx ); } static void rsa_debug( const void *ctx, mbedtls_pk_debug_item *items ) { items->type = MBEDTLS_PK_DEBUG_MPI; items->name = "rsa.N"; items->value = &( ((mbedtls_rsa_context *) ctx)->N ); items++; items->type = MBEDTLS_PK_DEBUG_MPI; items->name = "rsa.E"; items->value = &( ((mbedtls_rsa_context *) ctx)->E ); } const mbedtls_pk_info_t mbedtls_rsa_info = { MBEDTLS_PK_RSA, "RSA", rsa_get_bitlen, rsa_can_do, rsa_verify_wrap, rsa_sign_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif rsa_decrypt_wrap, rsa_encrypt_wrap, rsa_check_pair_wrap, rsa_alloc_wrap, rsa_free_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif rsa_debug, }; #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* * Generic EC key */ static int eckey_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_ECKEY || type == MBEDTLS_PK_ECKEY_DH || type == MBEDTLS_PK_ECDSA ); } static size_t eckey_get_bitlen( const void *ctx ) { return( ((mbedtls_ecp_keypair *) ctx)->grp.pbits ); } #if defined(MBEDTLS_ECDSA_C) /* Forward declarations */ static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ); static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); static int eckey_verify_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { int ret; mbedtls_ecdsa_context ecdsa; mbedtls_ecdsa_init( &ecdsa ); if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 ) ret = ecdsa_verify_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len ); mbedtls_ecdsa_free( &ecdsa ); return( ret ); } static int eckey_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_ecdsa_context ecdsa; mbedtls_ecdsa_init( &ecdsa ); if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 ) ret = ecdsa_sign_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ); mbedtls_ecdsa_free( &ecdsa ); return( ret ); } #if defined(MBEDTLS_ECP_RESTARTABLE) /* Forward declarations */ static int ecdsa_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, void *rs_ctx ); static int ecdsa_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, void *rs_ctx ); /* * Restart context for ECDSA operations with ECKEY context * * We need to store an actual ECDSA context, as we need to pass the same to * the underlying ecdsa function, so we can't create it on the fly every time. */ typedef struct { mbedtls_ecdsa_restart_ctx ecdsa_rs; mbedtls_ecdsa_context ecdsa_ctx; } eckey_restart_ctx; static void *eckey_rs_alloc( void ) { eckey_restart_ctx *rs_ctx; void *ctx = mbedtls_calloc( 1, sizeof( eckey_restart_ctx ) ); if( ctx != NULL ) { rs_ctx = ctx; mbedtls_ecdsa_restart_init( &rs_ctx->ecdsa_rs ); mbedtls_ecdsa_init( &rs_ctx->ecdsa_ctx ); } return( ctx ); } static void eckey_rs_free( void *ctx ) { eckey_restart_ctx *rs_ctx; if( ctx == NULL) return; rs_ctx = ctx; mbedtls_ecdsa_restart_free( &rs_ctx->ecdsa_rs ); mbedtls_ecdsa_free( &rs_ctx->ecdsa_ctx ); mbedtls_free( ctx ); } static int eckey_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, void *rs_ctx ) { int ret; eckey_restart_ctx *rs = rs_ctx; /* Should never happen */ if( rs == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); /* set up our own sub-context if needed (that is, on first run) */ if( rs->ecdsa_ctx.grp.pbits == 0 ) MBEDTLS_MPI_CHK( mbedtls_ecdsa_from_keypair( &rs->ecdsa_ctx, ctx ) ); MBEDTLS_MPI_CHK( ecdsa_verify_rs_wrap( &rs->ecdsa_ctx, md_alg, hash, hash_len, sig, sig_len, &rs->ecdsa_rs ) ); cleanup: return( ret ); } static int eckey_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, void *rs_ctx ) { int ret; eckey_restart_ctx *rs = rs_ctx; /* Should never happen */ if( rs == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); /* set up our own sub-context if needed (that is, on first run) */ if( rs->ecdsa_ctx.grp.pbits == 0 ) MBEDTLS_MPI_CHK( mbedtls_ecdsa_from_keypair( &rs->ecdsa_ctx, ctx ) ); MBEDTLS_MPI_CHK( ecdsa_sign_rs_wrap( &rs->ecdsa_ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng, &rs->ecdsa_rs ) ); cleanup: return( ret ); } #endif /* MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_ECDSA_C */ static int eckey_check_pair( const void *pub, const void *prv ) { return( mbedtls_ecp_check_pub_priv( (const mbedtls_ecp_keypair *) pub, (const mbedtls_ecp_keypair *) prv ) ); } static void *eckey_alloc_wrap( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecp_keypair ) ); if( ctx != NULL ) mbedtls_ecp_keypair_init( ctx ); return( ctx ); } static void eckey_free_wrap( void *ctx ) { mbedtls_ecp_keypair_free( (mbedtls_ecp_keypair *) ctx ); mbedtls_free( ctx ); } static void eckey_debug( const void *ctx, mbedtls_pk_debug_item *items ) { items->type = MBEDTLS_PK_DEBUG_ECP; items->name = "eckey.Q"; items->value = &( ((mbedtls_ecp_keypair *) ctx)->Q ); } const mbedtls_pk_info_t mbedtls_eckey_info = { MBEDTLS_PK_ECKEY, "EC", eckey_get_bitlen, eckey_can_do, #if defined(MBEDTLS_ECDSA_C) eckey_verify_wrap, eckey_sign_wrap, #if defined(MBEDTLS_ECP_RESTARTABLE) eckey_verify_rs_wrap, eckey_sign_rs_wrap, #endif #else /* MBEDTLS_ECDSA_C */ NULL, NULL, #endif /* MBEDTLS_ECDSA_C */ NULL, NULL, eckey_check_pair, eckey_alloc_wrap, eckey_free_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) eckey_rs_alloc, eckey_rs_free, #endif eckey_debug, }; /* * EC key restricted to ECDH */ static int eckeydh_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_ECKEY || type == MBEDTLS_PK_ECKEY_DH ); } const mbedtls_pk_info_t mbedtls_eckeydh_info = { MBEDTLS_PK_ECKEY_DH, "EC_DH", eckey_get_bitlen, /* Same underlying key structure */ eckeydh_can_do, NULL, NULL, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif NULL, NULL, eckey_check_pair, eckey_alloc_wrap, /* Same underlying key structure */ eckey_free_wrap, /* Same underlying key structure */ #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif eckey_debug, /* Same underlying key structure */ }; #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_ECDSA_C) static int ecdsa_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_ECDSA ); } static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { int ret; ((void) md_alg); ret = mbedtls_ecdsa_read_signature( (mbedtls_ecdsa_context *) ctx, hash, hash_len, sig, sig_len ); if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH ) return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH ); return( ret ); } static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { return( mbedtls_ecdsa_write_signature( (mbedtls_ecdsa_context *) ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ) ); } #if defined(MBEDTLS_ECP_RESTARTABLE) static int ecdsa_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, void *rs_ctx ) { int ret; ((void) md_alg); ret = mbedtls_ecdsa_read_signature_restartable( (mbedtls_ecdsa_context *) ctx, hash, hash_len, sig, sig_len, (mbedtls_ecdsa_restart_ctx *) rs_ctx ); if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH ) return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH ); return( ret ); } static int ecdsa_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, void *rs_ctx ) { return( mbedtls_ecdsa_write_signature_restartable( (mbedtls_ecdsa_context *) ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng, (mbedtls_ecdsa_restart_ctx *) rs_ctx ) ); } #endif /* MBEDTLS_ECP_RESTARTABLE */ static void *ecdsa_alloc_wrap( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_context ) ); if( ctx != NULL ) mbedtls_ecdsa_init( (mbedtls_ecdsa_context *) ctx ); return( ctx ); } static void ecdsa_free_wrap( void *ctx ) { mbedtls_ecdsa_free( (mbedtls_ecdsa_context *) ctx ); mbedtls_free( ctx ); } #if defined(MBEDTLS_ECP_RESTARTABLE) static void *ecdsa_rs_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_restart_ctx ) ); if( ctx != NULL ) mbedtls_ecdsa_restart_init( ctx ); return( ctx ); } static void ecdsa_rs_free( void *ctx ) { mbedtls_ecdsa_restart_free( ctx ); mbedtls_free( ctx ); } #endif /* MBEDTLS_ECP_RESTARTABLE */ const mbedtls_pk_info_t mbedtls_ecdsa_info = { MBEDTLS_PK_ECDSA, "ECDSA", eckey_get_bitlen, /* Compatible key structures */ ecdsa_can_do, ecdsa_verify_wrap, ecdsa_sign_wrap, #if defined(MBEDTLS_ECP_RESTARTABLE) ecdsa_verify_rs_wrap, ecdsa_sign_rs_wrap, #endif NULL, NULL, eckey_check_pair, /* Compatible key structures */ ecdsa_alloc_wrap, ecdsa_free_wrap, #if defined(MBEDTLS_ECP_RESTARTABLE) ecdsa_rs_alloc, ecdsa_rs_free, #endif eckey_debug, /* Compatible key structures */ }; #endif /* MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /* * Support for alternative RSA-private implementations */ static int rsa_alt_can_do( mbedtls_pk_type_t type ) { return( type == MBEDTLS_PK_RSA ); } static size_t rsa_alt_get_bitlen( const void *ctx ) { const mbedtls_rsa_alt_context *rsa_alt = (const mbedtls_rsa_alt_context *) ctx; return( 8 * rsa_alt->key_len_func( rsa_alt->key ) ); } static int rsa_alt_sign_wrap( void *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx; #if SIZE_MAX > UINT_MAX if( UINT_MAX < hash_len ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #endif /* SIZE_MAX > UINT_MAX */ *sig_len = rsa_alt->key_len_func( rsa_alt->key ); return( rsa_alt->sign_func( rsa_alt->key, f_rng, p_rng, MBEDTLS_RSA_PRIVATE, md_alg, (unsigned int) hash_len, hash, sig ) ); } static int rsa_alt_decrypt_wrap( void *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx; ((void) f_rng); ((void) p_rng); if( ilen != rsa_alt->key_len_func( rsa_alt->key ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); return( rsa_alt->decrypt_func( rsa_alt->key, MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) ); } #if defined(MBEDTLS_RSA_C) static int rsa_alt_check_pair( const void *pub, const void *prv ) { unsigned char sig[MBEDTLS_MPI_MAX_SIZE]; unsigned char hash[32]; size_t sig_len = 0; int ret; if( rsa_alt_get_bitlen( prv ) != rsa_get_bitlen( pub ) ) return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); memset( hash, 0x2a, sizeof( hash ) ); if( ( ret = rsa_alt_sign_wrap( (void *) prv, MBEDTLS_MD_NONE, hash, sizeof( hash ), sig, &sig_len, NULL, NULL ) ) != 0 ) { return( ret ); } if( rsa_verify_wrap( (void *) pub, MBEDTLS_MD_NONE, hash, sizeof( hash ), sig, sig_len ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } return( 0 ); } #endif /* MBEDTLS_RSA_C */ static void *rsa_alt_alloc_wrap( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_alt_context ) ); if( ctx != NULL ) memset( ctx, 0, sizeof( mbedtls_rsa_alt_context ) ); return( ctx ); } static void rsa_alt_free_wrap( void *ctx ) { mbedtls_platform_zeroize( ctx, sizeof( mbedtls_rsa_alt_context ) ); mbedtls_free( ctx ); } const mbedtls_pk_info_t mbedtls_rsa_alt_info = { MBEDTLS_PK_RSA_ALT, "RSA-alt", rsa_alt_get_bitlen, rsa_alt_can_do, NULL, rsa_alt_sign_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif rsa_alt_decrypt_wrap, NULL, #if defined(MBEDTLS_RSA_C) rsa_alt_check_pair, #else NULL, #endif rsa_alt_alloc_wrap, rsa_alt_free_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) NULL, NULL, #endif NULL, }; #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ #endif /* MBEDTLS_PK_C */ fldigi-4.2.05/src/mbedtls/ssl_tls.c0000664000175000017500000115734014611711171014046 00000000000000/* * SSLv3/TLSv1 shared functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The SSL 3.0 specification was drafted by Netscape in 1996, * and became an IETF standard in 1999. * * http://wp.netscape.com/eng/ssl3/ * http://www.ietf.org/rfc/rfc2246.txt * http://www.ietf.org/rfc/rfc4346.txt */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_TLS_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/debug.h" #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_X509_CRT_PARSE_C) #include "mbedtls/oid.h" #endif static void ssl_reset_in_out_pointers( mbedtls_ssl_context *ssl ); static uint32_t ssl_get_hs_total_len( mbedtls_ssl_context const *ssl ); /* Length of the "epoch" field in the record header */ static inline size_t ssl_ep_len( const mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) return( 2 ); #else ((void) ssl); #endif return( 0 ); } /* * Start a timer. * Passing millisecs = 0 cancels a running timer. */ static void ssl_set_timer( mbedtls_ssl_context *ssl, uint32_t millisecs ) { if( ssl->f_set_timer == NULL ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "set_timer to %d ms", (int) millisecs ) ); ssl->f_set_timer( ssl->p_timer, millisecs / 4, millisecs ); } /* * Return -1 is timer is expired, 0 if it isn't. */ static int ssl_check_timer( mbedtls_ssl_context *ssl ) { if( ssl->f_get_timer == NULL ) return( 0 ); if( ssl->f_get_timer( ssl->p_timer ) == 2 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "timer expired" ) ); return( -1 ); } return( 0 ); } static void ssl_update_out_pointers( mbedtls_ssl_context *ssl, mbedtls_ssl_transform *transform ); static void ssl_update_in_pointers( mbedtls_ssl_context *ssl, mbedtls_ssl_transform *transform ); #define SSL_DONT_FORCE_FLUSH 0 #define SSL_FORCE_FLUSH 1 #if defined(MBEDTLS_SSL_PROTO_DTLS) /* Forward declarations for functions related to message buffering. */ static void ssl_buffering_free( mbedtls_ssl_context *ssl ); static void ssl_buffering_free_slot( mbedtls_ssl_context *ssl, uint8_t slot ); static void ssl_free_buffered_record( mbedtls_ssl_context *ssl ); static int ssl_load_buffered_message( mbedtls_ssl_context *ssl ); static int ssl_load_buffered_record( mbedtls_ssl_context *ssl ); static int ssl_buffer_message( mbedtls_ssl_context *ssl ); static int ssl_buffer_future_record( mbedtls_ssl_context *ssl ); static int ssl_next_record_is_in_datagram( mbedtls_ssl_context *ssl ); static size_t ssl_get_current_mtu( const mbedtls_ssl_context *ssl ); static size_t ssl_get_maximum_datagram_size( mbedtls_ssl_context const *ssl ) { size_t mtu = ssl_get_current_mtu( ssl ); if( mtu != 0 && mtu < MBEDTLS_SSL_OUT_BUFFER_LEN ) return( mtu ); return( MBEDTLS_SSL_OUT_BUFFER_LEN ); } static int ssl_get_remaining_space_in_datagram( mbedtls_ssl_context const *ssl ) { size_t const bytes_written = ssl->out_left; size_t const mtu = ssl_get_maximum_datagram_size( ssl ); /* Double-check that the write-index hasn't gone * past what we can transmit in a single datagram. */ if( bytes_written > mtu ) { /* Should never happen... */ return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } return( (int) ( mtu - bytes_written ) ); } static int ssl_get_remaining_payload_in_datagram( mbedtls_ssl_context const *ssl ) { int ret; size_t remaining, expansion; size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN; #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) const size_t mfl = mbedtls_ssl_get_max_frag_len( ssl ); if( max_len > mfl ) max_len = mfl; /* By the standard (RFC 6066 Sect. 4), the MFL extension * only limits the maximum record payload size, so in theory * we would be allowed to pack multiple records of payload size * MFL into a single datagram. However, this would mean that there's * no way to explicitly communicate MTU restrictions to the peer. * * The following reduction of max_len makes sure that we never * write datagrams larger than MFL + Record Expansion Overhead. */ if( max_len <= ssl->out_left ) return( 0 ); max_len -= ssl->out_left; #endif ret = ssl_get_remaining_space_in_datagram( ssl ); if( ret < 0 ) return( ret ); remaining = (size_t) ret; ret = mbedtls_ssl_get_record_expansion( ssl ); if( ret < 0 ) return( ret ); expansion = (size_t) ret; if( remaining <= expansion ) return( 0 ); remaining -= expansion; if( remaining >= max_len ) remaining = max_len; return( (int) remaining ); } /* * Double the retransmit timeout value, within the allowed range, * returning -1 if the maximum value has already been reached. */ static int ssl_double_retransmit_timeout( mbedtls_ssl_context *ssl ) { uint32_t new_timeout; if( ssl->handshake->retransmit_timeout >= ssl->conf->hs_timeout_max ) return( -1 ); /* Implement the final paragraph of RFC 6347 section 4.1.1.1 * in the following way: after the initial transmission and a first * retransmission, back off to a temporary estimated MTU of 508 bytes. * This value is guaranteed to be deliverable (if not guaranteed to be * delivered) of any compliant IPv4 (and IPv6) network, and should work * on most non-IP stacks too. */ if( ssl->handshake->retransmit_timeout != ssl->conf->hs_timeout_min ) { ssl->handshake->mtu = 508; MBEDTLS_SSL_DEBUG_MSG( 2, ( "mtu autoreduction to %d bytes", ssl->handshake->mtu ) ); } new_timeout = 2 * ssl->handshake->retransmit_timeout; /* Avoid arithmetic overflow and range overflow */ if( new_timeout < ssl->handshake->retransmit_timeout || new_timeout > ssl->conf->hs_timeout_max ) { new_timeout = ssl->conf->hs_timeout_max; } ssl->handshake->retransmit_timeout = new_timeout; MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs", ssl->handshake->retransmit_timeout ) ); return( 0 ); } static void ssl_reset_retransmit_timeout( mbedtls_ssl_context *ssl ) { ssl->handshake->retransmit_timeout = ssl->conf->hs_timeout_min; MBEDTLS_SSL_DEBUG_MSG( 3, ( "update timeout value to %d millisecs", ssl->handshake->retransmit_timeout ) ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) /* * Convert max_fragment_length codes to length. * RFC 6066 says: * enum{ * 2^9(1), 2^10(2), 2^11(3), 2^12(4), (255) * } MaxFragmentLength; * and we add 0 -> extension unused */ static unsigned int ssl_mfl_code_to_length( int mfl ) { switch( mfl ) { case MBEDTLS_SSL_MAX_FRAG_LEN_NONE: return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN ); case MBEDTLS_SSL_MAX_FRAG_LEN_512: return 512; case MBEDTLS_SSL_MAX_FRAG_LEN_1024: return 1024; case MBEDTLS_SSL_MAX_FRAG_LEN_2048: return 2048; case MBEDTLS_SSL_MAX_FRAG_LEN_4096: return 4096; default: return ( MBEDTLS_TLS_EXT_ADV_CONTENT_LEN ); } } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_CLI_C) static int ssl_session_copy( mbedtls_ssl_session *dst, const mbedtls_ssl_session *src ) { mbedtls_ssl_session_free( dst ); memcpy( dst, src, sizeof( mbedtls_ssl_session ) ); #if defined(MBEDTLS_X509_CRT_PARSE_C) if( src->peer_cert != NULL ) { int ret; dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) ); if( dst->peer_cert == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); mbedtls_x509_crt_init( dst->peer_cert ); if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p, src->peer_cert->raw.len ) ) != 0 ) { mbedtls_free( dst->peer_cert ); dst->peer_cert = NULL; return( ret ); } } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) if( src->ticket != NULL ) { dst->ticket = mbedtls_calloc( 1, src->ticket_len ); if( dst->ticket == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); memcpy( dst->ticket, src->ticket, src->ticket_len ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ return( 0 ); } #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) int (*mbedtls_ssl_hw_record_init)( mbedtls_ssl_context *ssl, const unsigned char *key_enc, const unsigned char *key_dec, size_t keylen, const unsigned char *iv_enc, const unsigned char *iv_dec, size_t ivlen, const unsigned char *mac_enc, const unsigned char *mac_dec, size_t maclen ) = NULL; int (*mbedtls_ssl_hw_record_activate)( mbedtls_ssl_context *ssl, int direction) = NULL; int (*mbedtls_ssl_hw_record_reset)( mbedtls_ssl_context *ssl ) = NULL; int (*mbedtls_ssl_hw_record_write)( mbedtls_ssl_context *ssl ) = NULL; int (*mbedtls_ssl_hw_record_read)( mbedtls_ssl_context *ssl ) = NULL; int (*mbedtls_ssl_hw_record_finish)( mbedtls_ssl_context *ssl ) = NULL; #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ /* * Key material generation */ #if defined(MBEDTLS_SSL_PROTO_SSL3) static int ssl3_prf( const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { int ret = 0; size_t i; mbedtls_md5_context md5; mbedtls_sha1_context sha1; unsigned char padding[16]; unsigned char sha1sum[20]; ((void)label); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); /* * SSLv3: * block = * MD5( secret + SHA1( 'A' + secret + random ) ) + * MD5( secret + SHA1( 'BB' + secret + random ) ) + * MD5( secret + SHA1( 'CCC' + secret + random ) ) + * ... */ for( i = 0; i < dlen / 16; i++ ) { memset( padding, (unsigned char) ('A' + i), 1 + i ); if( ( ret = mbedtls_sha1_starts_ret( &sha1 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_update_ret( &sha1, padding, 1 + i ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_update_ret( &sha1, secret, slen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_update_ret( &sha1, random, rlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha1_finish_ret( &sha1, sha1sum ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_starts_ret( &md5 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5, secret, slen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5, sha1sum, 20 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_finish_ret( &md5, dstbuf + i * 16 ) ) != 0 ) goto exit; } exit: mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); mbedtls_platform_zeroize( padding, sizeof( padding ) ); mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) static int tls1_prf( const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { size_t nb, hs; size_t i, j, k; const unsigned char *S1, *S2; unsigned char tmp[128]; unsigned char h_i[20]; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; int ret; mbedtls_md_init( &md_ctx ); if( sizeof( tmp ) < 20 + strlen( label ) + rlen ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); hs = ( slen + 1 ) / 2; S1 = secret; S2 = secret + slen - hs; nb = strlen( label ); memcpy( tmp + 20, label, nb ); memcpy( tmp + 20 + nb, random, rlen ); nb += rlen; /* * First compute P_md5(secret,label+random)[0..dlen] */ if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ) ) == NULL ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) return( ret ); mbedtls_md_hmac_starts( &md_ctx, S1, hs ); mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb ); mbedtls_md_hmac_finish( &md_ctx, 4 + tmp ); for( i = 0; i < dlen; i += 16 ) { mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 + nb ); mbedtls_md_hmac_finish( &md_ctx, h_i ); mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 ); mbedtls_md_hmac_finish( &md_ctx, 4 + tmp ); k = ( i + 16 > dlen ) ? dlen % 16 : 16; for( j = 0; j < k; j++ ) dstbuf[i + j] = h_i[j]; } mbedtls_md_free( &md_ctx ); /* * XOR out with P_sha1(secret,label+random)[0..dlen] */ if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) return( ret ); mbedtls_md_hmac_starts( &md_ctx, S2, hs ); mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb ); mbedtls_md_hmac_finish( &md_ctx, tmp ); for( i = 0; i < dlen; i += 20 ) { mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, tmp, 20 + nb ); mbedtls_md_hmac_finish( &md_ctx, h_i ); mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, tmp, 20 ); mbedtls_md_hmac_finish( &md_ctx, tmp ); k = ( i + 20 > dlen ) ? dlen % 20 : 20; for( j = 0; j < k; j++ ) dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] ); } mbedtls_md_free( &md_ctx ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); mbedtls_platform_zeroize( h_i, sizeof( h_i ) ); return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) static int tls_prf_generic( mbedtls_md_type_t md_type, const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { size_t nb; size_t i, j, k, md_len; unsigned char tmp[128]; unsigned char h_i[MBEDTLS_MD_MAX_SIZE]; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; int ret; mbedtls_md_init( &md_ctx ); if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL ) return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); md_len = mbedtls_md_get_size( md_info ); if( sizeof( tmp ) < md_len + strlen( label ) + rlen ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); nb = strlen( label ); memcpy( tmp + md_len, label, nb ); memcpy( tmp + md_len + nb, random, rlen ); nb += rlen; /* * Compute P_(secret, label + random)[0..dlen] */ if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) return( ret ); mbedtls_md_hmac_starts( &md_ctx, secret, slen ); mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb ); mbedtls_md_hmac_finish( &md_ctx, tmp ); for( i = 0; i < dlen; i += md_len ) { mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb ); mbedtls_md_hmac_finish( &md_ctx, h_i ); mbedtls_md_hmac_reset ( &md_ctx ); mbedtls_md_hmac_update( &md_ctx, tmp, md_len ); mbedtls_md_hmac_finish( &md_ctx, tmp ); k = ( i + md_len > dlen ) ? dlen % md_len : md_len; for( j = 0; j < k; j++ ) dstbuf[i + j] = h_i[j]; } mbedtls_md_free( &md_ctx ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); mbedtls_platform_zeroize( h_i, sizeof( h_i ) ); return( 0 ); } #if defined(MBEDTLS_SHA256_C) static int tls_prf_sha256( const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen, label, random, rlen, dstbuf, dlen ) ); } #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) static int tls_prf_sha384( const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ) { return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen, label, random, rlen, dstbuf, dlen ) ); } #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ static void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t ); #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *, const unsigned char *, size_t ); #endif #if defined(MBEDTLS_SSL_PROTO_SSL3) static void ssl_calc_verify_ssl( mbedtls_ssl_context *, unsigned char * ); static void ssl_calc_finished_ssl( mbedtls_ssl_context *, unsigned char *, int ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) static void ssl_calc_verify_tls( mbedtls_ssl_context *, unsigned char * ); static void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) static void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t ); static void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *,unsigned char * ); static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int ); #endif #if defined(MBEDTLS_SHA512_C) static void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t ); static void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *, unsigned char * ); static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl ) { int ret = 0; unsigned char tmp[64]; unsigned char keyblk[256]; unsigned char *key1; unsigned char *key2; unsigned char *mac_enc; unsigned char *mac_dec; size_t mac_key_len; size_t iv_copy_len; const mbedtls_cipher_info_t *cipher_info; const mbedtls_md_info_t *md_info; mbedtls_ssl_session *session = ssl->session_negotiate; mbedtls_ssl_transform *transform = ssl->transform_negotiate; mbedtls_ssl_handshake_params *handshake = ssl->handshake; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> derive keys" ) ); cipher_info = mbedtls_cipher_info_from_type( transform->ciphersuite_info->cipher ); if( cipher_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "cipher info for %d not found", transform->ciphersuite_info->cipher ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } md_info = mbedtls_md_info_from_type( transform->ciphersuite_info->mac ); if( md_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "mbedtls_md info for %d not found", transform->ciphersuite_info->mac ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions */ #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { handshake->tls_prf = ssl3_prf; handshake->calc_verify = ssl_calc_verify_ssl; handshake->calc_finished = ssl_calc_finished_ssl; } else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ) { handshake->tls_prf = tls1_prf; handshake->calc_verify = ssl_calc_verify_tls; handshake->calc_finished = ssl_calc_finished_tls; } else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA512_C) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 && transform->ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) { handshake->tls_prf = tls_prf_sha384; handshake->calc_verify = ssl_calc_verify_tls_sha384; handshake->calc_finished = ssl_calc_finished_tls_sha384; } else #endif #if defined(MBEDTLS_SHA256_C) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { handshake->tls_prf = tls_prf_sha256; handshake->calc_verify = ssl_calc_verify_tls_sha256; handshake->calc_finished = ssl_calc_finished_tls_sha256; } else #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * SSLv3: * master = * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) + * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) + * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) ) * * TLSv1+: * master = PRF( premaster, "master secret", randbytes )[0..47] */ if( handshake->resume == 0 ) { MBEDTLS_SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster, handshake->pmslen ); #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED ) { unsigned char session_hash[48]; size_t hash_len; MBEDTLS_SSL_DEBUG_MSG( 3, ( "using extended master secret" ) ); ssl->handshake->calc_verify( ssl, session_hash ); #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { #if defined(MBEDTLS_SHA512_C) if( ssl->transform_negotiate->ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) { hash_len = 48; } else #endif hash_len = 32; } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ hash_len = 36; MBEDTLS_SSL_DEBUG_BUF( 3, "session hash", session_hash, hash_len ); ret = handshake->tls_prf( handshake->premaster, handshake->pmslen, "extended master secret", session_hash, hash_len, session->master, 48 ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret ); return( ret ); } } else #endif ret = handshake->tls_prf( handshake->premaster, handshake->pmslen, "master secret", handshake->randbytes, 64, session->master, 48 ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret ); return( ret ); } mbedtls_platform_zeroize( handshake->premaster, sizeof(handshake->premaster) ); } else MBEDTLS_SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) ); /* * Swap the client and server random values. */ memcpy( tmp, handshake->randbytes, 64 ); memcpy( handshake->randbytes, tmp + 32, 32 ); memcpy( handshake->randbytes + 32, tmp, 32 ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); /* * SSLv3: * key block = * MD5( master + SHA1( 'A' + master + randbytes ) ) + * MD5( master + SHA1( 'BB' + master + randbytes ) ) + * MD5( master + SHA1( 'CCC' + master + randbytes ) ) + * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) + * ... * * TLSv1: * key block = PRF( master, "key expansion", randbytes ) */ ret = handshake->tls_prf( session->master, 48, "key expansion", handshake->randbytes, 64, keyblk, 256 ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "prf", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite = %s", mbedtls_ssl_get_ciphersuite_name( session->ciphersuite ) ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "master secret", session->master, 48 ); MBEDTLS_SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 ); MBEDTLS_SSL_DEBUG_BUF( 4, "key block", keyblk, 256 ); mbedtls_platform_zeroize( handshake->randbytes, sizeof( handshake->randbytes ) ); /* * Determine the appropriate key, IV and MAC length. */ transform->keylen = cipher_info->key_bitlen / 8; if( cipher_info->mode == MBEDTLS_MODE_GCM || cipher_info->mode == MBEDTLS_MODE_CCM || cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY ) { size_t taglen, explicit_ivlen; transform->maclen = 0; mac_key_len = 0; /* All modes haves 96-bit IVs; * GCM and CCM has 4 implicit and 8 explicit bytes * ChachaPoly has all 12 bytes implicit */ transform->ivlen = 12; if( cipher_info->mode == MBEDTLS_MODE_CHACHAPOLY ) transform->fixed_ivlen = 12; else transform->fixed_ivlen = 4; /* All modes have 128-bit tags, except CCM_8 (ciphersuite flag) */ taglen = transform->ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16; /* Minimum length of encrypted record */ explicit_ivlen = transform->ivlen - transform->fixed_ivlen; transform->minlen = explicit_ivlen + taglen; } else { /* Initialize HMAC contexts */ if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 || ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret ); return( ret ); } /* Get MAC length */ mac_key_len = mbedtls_md_get_size( md_info ); transform->maclen = mac_key_len; #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) /* * If HMAC is to be truncated, we shall keep the leftmost bytes, * (rfc 6066 page 13 or rfc 2104 section 4), * so we only need to adjust the length here. */ if( session->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED ) { transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN; #if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) /* Fall back to old, non-compliant version of the truncated * HMAC implementation which also truncates the key * (Mbed TLS versions from 1.3 to 2.6.0) */ mac_key_len = transform->maclen; #endif } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ /* IV length */ transform->ivlen = cipher_info->iv_size; /* Minimum length */ if( cipher_info->mode == MBEDTLS_MODE_STREAM ) transform->minlen = transform->maclen; else { /* * GenericBlockCipher: * 1. if EtM is in use: one block plus MAC * otherwise: * first multiple of blocklen greater than maclen * 2. IV except for SSL3 and TLS 1.0 */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) if( session->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED ) { transform->minlen = transform->maclen + cipher_info->block_size; } else #endif { transform->minlen = transform->maclen + cipher_info->block_size - transform->maclen % cipher_info->block_size; } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_1 ) ; /* No need to adjust minlen */ else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { transform->minlen += transform->ivlen; } else #endif { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } } MBEDTLS_SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d", transform->keylen, transform->minlen, transform->ivlen, transform->maclen ) ); /* * Finally setup the cipher contexts, IVs and MAC secrets. */ #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) { key1 = keyblk + mac_key_len * 2; key2 = keyblk + mac_key_len * 2 + transform->keylen; mac_enc = keyblk; mac_dec = keyblk + mac_key_len; /* * This is not used in TLS v1.1. */ iv_copy_len = ( transform->fixed_ivlen ) ? transform->fixed_ivlen : transform->ivlen; memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len ); memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len, iv_copy_len ); } else #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) { key1 = keyblk + mac_key_len * 2 + transform->keylen; key2 = keyblk + mac_key_len * 2; mac_enc = keyblk + mac_key_len; mac_dec = keyblk; /* * This is not used in TLS v1.1. */ iv_copy_len = ( transform->fixed_ivlen ) ? transform->fixed_ivlen : transform->ivlen; memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len ); memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len, iv_copy_len ); } else #endif /* MBEDTLS_SSL_SRV_C */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { if( mac_key_len > sizeof transform->mac_enc ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } memcpy( transform->mac_enc, mac_enc, mac_key_len ); memcpy( transform->mac_dec, mac_dec, mac_key_len ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 ) { /* For HMAC-based ciphersuites, initialize the HMAC transforms. For AEAD-based ciphersuites, there is nothing to do here. */ if( mac_key_len != 0 ) { mbedtls_md_hmac_starts( &transform->md_ctx_enc, mac_enc, mac_key_len ); mbedtls_md_hmac_starts( &transform->md_ctx_dec, mac_dec, mac_key_len ); } } else #endif { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_init != NULL ) { int ret = 0; MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_init()" ) ); if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, transform->keylen, transform->iv_enc, transform->iv_dec, iv_copy_len, mac_enc, mac_dec, mac_key_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_init", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) if( ssl->conf->f_export_keys != NULL ) { ssl->conf->f_export_keys( ssl->conf->p_export_keys, session->master, keyblk, mac_key_len, transform->keylen, iv_copy_len ); } #endif if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc, cipher_info ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret ); return( ret ); } if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec, cipher_info ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret ); return( ret ); } if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1, cipher_info->key_bitlen, MBEDTLS_ENCRYPT ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret ); return( ret ); } if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2, cipher_info->key_bitlen, MBEDTLS_DECRYPT ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setkey", ret ); return( ret ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) if( cipher_info->mode == MBEDTLS_MODE_CBC ) { if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc, MBEDTLS_PADDING_NONE ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret ); return( ret ); } if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec, MBEDTLS_PADDING_NONE ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_set_padding_mode", ret ); return( ret ); } } #endif /* MBEDTLS_CIPHER_MODE_CBC */ mbedtls_platform_zeroize( keyblk, sizeof( keyblk ) ); #if defined(MBEDTLS_ZLIB_SUPPORT) // Initialize compression // if( session->compression == MBEDTLS_SSL_COMPRESS_DEFLATE ) { if( ssl->compress_buf == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "Allocating compression buffer" ) ); ssl->compress_buf = mbedtls_calloc( 1, MBEDTLS_SSL_COMPRESS_BUFFER_LEN ); if( ssl->compress_buf == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", MBEDTLS_SSL_COMPRESS_BUFFER_LEN ) ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } } MBEDTLS_SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) ); memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) ); memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) ); if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK || inflateInit( &transform->ctx_inflate ) != Z_OK ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) ); return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED ); } } #endif /* MBEDTLS_ZLIB_SUPPORT */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= derive keys" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) void ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char *hash ) { mbedtls_md5_context md5; mbedtls_sha1_context sha1; unsigned char pad_1[48]; unsigned char pad_2[48]; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) ); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); memset( pad_1, 0x36, 48 ); memset( pad_2, 0x5C, 48 ); mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 ); mbedtls_md5_update_ret( &md5, pad_1, 48 ); mbedtls_md5_finish_ret( &md5, hash ); mbedtls_md5_starts_ret( &md5 ); mbedtls_md5_update_ret( &md5, ssl->session_negotiate->master, 48 ); mbedtls_md5_update_ret( &md5, pad_2, 48 ); mbedtls_md5_update_ret( &md5, hash, 16 ); mbedtls_md5_finish_ret( &md5, hash ); mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 ); mbedtls_sha1_update_ret( &sha1, pad_1, 40 ); mbedtls_sha1_finish_ret( &sha1, hash + 16 ); mbedtls_sha1_starts_ret( &sha1 ); mbedtls_sha1_update_ret( &sha1, ssl->session_negotiate->master, 48 ); mbedtls_sha1_update_ret( &sha1, pad_2, 40 ); mbedtls_sha1_update_ret( &sha1, hash + 16, 20 ); mbedtls_sha1_finish_ret( &sha1, hash + 16 ); MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); return; } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) void ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char *hash ) { mbedtls_md5_context md5; mbedtls_sha1_context sha1; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) ); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); mbedtls_md5_finish_ret( &md5, hash ); mbedtls_sha1_finish_ret( &sha1, hash + 16 ); MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); return; } #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char *hash ) { mbedtls_sha256_context sha256; mbedtls_sha256_init( &sha256 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) ); mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 ); mbedtls_sha256_finish_ret( &sha256, hash ); MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); mbedtls_sha256_free( &sha256 ); return; } #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char *hash ) { mbedtls_sha512_context sha512; mbedtls_sha512_init( &sha512 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) ); mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 ); mbedtls_sha512_finish_ret( &sha512, hash ); MBEDTLS_SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc verify" ) ); mbedtls_sha512_free( &sha512 ); return; } #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex ) { unsigned char *p = ssl->handshake->premaster; unsigned char *end = p + sizeof( ssl->handshake->premaster ); const unsigned char *psk = ssl->conf->psk; size_t psk_len = ssl->conf->psk_len; /* If the psk callback was called, use its result */ if( ssl->handshake->psk != NULL ) { psk = ssl->handshake->psk; psk_len = ssl->handshake->psk_len; } /* * PMS = struct { * opaque other_secret<0..2^16-1>; * opaque psk<0..2^16-1>; * }; * with "other_secret" depending on the particular key exchange */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK ) { if( end - p < 2 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); *(p++) = (unsigned char)( psk_len >> 8 ); *(p++) = (unsigned char)( psk_len ); if( end < p || (size_t)( end - p ) < psk_len ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); memset( p, 0, psk_len ); p += psk_len; } else #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { /* * other_secret already set by the ClientKeyExchange message, * and is 48 bytes long */ if( end - p < 2 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); *p++ = 0; *p++ = 48; p += 48; } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) { int ret; size_t len; /* Write length only when we know the actual value */ if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx, p + 2, end - ( p + 2 ), &len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret ); return( ret ); } *(p++) = (unsigned char)( len >> 8 ); *(p++) = (unsigned char)( len ); p += len; MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { int ret; size_t zlen; if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen, p + 2, end - ( p + 2 ), ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret ); return( ret ); } *(p++) = (unsigned char)( zlen >> 8 ); *(p++) = (unsigned char)( zlen ); p += zlen; MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Z ); } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* opaque psk<0..2^16-1>; */ if( end - p < 2 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); *(p++) = (unsigned char)( psk_len >> 8 ); *(p++) = (unsigned char)( psk_len ); if( end < p || (size_t)( end - p ) < psk_len ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); memcpy( p, psk, psk_len ); p += psk_len; ssl->handshake->pmslen = p - ssl->handshake->premaster; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_SSL_PROTO_SSL3) /* * SSLv3.0 MAC functions */ #define SSL_MAC_MAX_BYTES 20 /* MD-5 or SHA-1 */ static void ssl_mac( mbedtls_md_context_t *md_ctx, const unsigned char *secret, const unsigned char *buf, size_t len, const unsigned char *ctr, int type, unsigned char out[SSL_MAC_MAX_BYTES] ) { unsigned char header[11]; unsigned char padding[48]; int padlen; int md_size = mbedtls_md_get_size( md_ctx->md_info ); int md_type = mbedtls_md_get_type( md_ctx->md_info ); /* Only MD5 and SHA-1 supported */ if( md_type == MBEDTLS_MD_MD5 ) padlen = 48; else padlen = 40; memcpy( header, ctr, 8 ); header[ 8] = (unsigned char) type; header[ 9] = (unsigned char)( len >> 8 ); header[10] = (unsigned char)( len ); memset( padding, 0x36, padlen ); mbedtls_md_starts( md_ctx ); mbedtls_md_update( md_ctx, secret, md_size ); mbedtls_md_update( md_ctx, padding, padlen ); mbedtls_md_update( md_ctx, header, 11 ); mbedtls_md_update( md_ctx, buf, len ); mbedtls_md_finish( md_ctx, out ); memset( padding, 0x5C, padlen ); mbedtls_md_starts( md_ctx ); mbedtls_md_update( md_ctx, secret, md_size ); mbedtls_md_update( md_ctx, padding, padlen ); mbedtls_md_update( md_ctx, out, md_size ); mbedtls_md_finish( md_ctx, out ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) || \ ( defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) || defined(MBEDTLS_ARIA_C)) ) #define SSL_SOME_MODES_USE_MAC #endif /* The function below is only used in the Lucky 13 counter-measure in * ssl_decrypt_buf(). These are the defines that guard the call site. */ #if defined(SSL_SOME_MODES_USE_MAC) && \ ( defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) ) /* This function makes sure every byte in the memory region is accessed * (in ascending addresses order) */ static void ssl_read_memory( unsigned char *p, size_t len ) { unsigned char acc = 0; volatile unsigned char force; for( ; len != 0; p++, len-- ) acc ^= *p; force = acc; (void) force; } #endif /* SSL_SOME_MODES_USE_MAC && ( TLS1 || TLS1_1 || TLS1_2 ) */ /* * Encryption/decryption functions */ static int ssl_encrypt_buf( mbedtls_ssl_context *ssl ) { mbedtls_cipher_mode_t mode; int auth_done = 0; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) ); if( ssl->session_out == NULL || ssl->transform_out == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc ); MBEDTLS_SSL_DEBUG_BUF( 4, "before encrypt: output payload", ssl->out_msg, ssl->out_msglen ); /* * Add MAC before if needed */ #if defined(SSL_SOME_MODES_USE_MAC) if( mode == MBEDTLS_MODE_STREAM || ( mode == MBEDTLS_MODE_CBC #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && ssl->session_out->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED #endif ) ) { #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { unsigned char mac[SSL_MAC_MAX_BYTES]; ssl_mac( &ssl->transform_out->md_ctx_enc, ssl->transform_out->mac_enc, ssl->out_msg, ssl->out_msglen, ssl->out_ctr, ssl->out_msgtype, mac ); memcpy( ssl->out_msg + ssl->out_msglen, mac, ssl->transform_out->maclen ); } else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 ) { unsigned char mac[MBEDTLS_SSL_MAC_ADD]; mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 8 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_hdr, 3 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_len, 2 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_msg, ssl->out_msglen ); mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc, mac ); mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc ); memcpy( ssl->out_msg + ssl->out_msglen, mac, ssl->transform_out->maclen ); } else #endif { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 4, "computed mac", ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen ); ssl->out_msglen += ssl->transform_out->maclen; auth_done++; } #endif /* AEAD not the only option */ /* * Encrypt */ #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) if( mode == MBEDTLS_MODE_STREAM ) { int ret; size_t olen = 0; MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " "including %d bytes of padding", ssl->out_msglen, 0 ) ); if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc, ssl->transform_out->iv_enc, ssl->transform_out->ivlen, ssl->out_msg, ssl->out_msglen, ssl->out_msg, &olen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); return( ret ); } if( ssl->out_msglen != olen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } else #endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */ #if defined(MBEDTLS_GCM_C) || \ defined(MBEDTLS_CCM_C) || \ defined(MBEDTLS_CHACHAPOLY_C) if( mode == MBEDTLS_MODE_GCM || mode == MBEDTLS_MODE_CCM || mode == MBEDTLS_MODE_CHACHAPOLY ) { int ret; size_t enc_msglen, olen; unsigned char *enc_msg; unsigned char add_data[13]; unsigned char iv[12]; mbedtls_ssl_transform *transform = ssl->transform_out; unsigned char taglen = transform->ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16; size_t explicit_ivlen = transform->ivlen - transform->fixed_ivlen; /* * Prepare additional authenticated data */ memcpy( add_data, ssl->out_ctr, 8 ); add_data[8] = ssl->out_msgtype; mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, add_data + 9 ); add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF; add_data[12] = ssl->out_msglen & 0xFF; MBEDTLS_SSL_DEBUG_BUF( 4, "additional data for AEAD", add_data, 13 ); /* * Generate IV */ if( transform->ivlen == 12 && transform->fixed_ivlen == 4 ) { /* GCM and CCM: fixed || explicit (=seqnum) */ memcpy( iv, transform->iv_enc, transform->fixed_ivlen ); memcpy( iv + transform->fixed_ivlen, ssl->out_ctr, 8 ); memcpy( ssl->out_iv, ssl->out_ctr, 8 ); } else if( transform->ivlen == 12 && transform->fixed_ivlen == 12 ) { /* ChachaPoly: fixed XOR sequence number */ unsigned char i; memcpy( iv, transform->iv_enc, transform->fixed_ivlen ); for( i = 0; i < 8; i++ ) iv[i+4] ^= ssl->out_ctr[i]; } else { /* Reminder if we ever add an AEAD mode with a different size */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 4, "IV used (internal)", iv, transform->ivlen ); MBEDTLS_SSL_DEBUG_BUF( 4, "IV used (transmitted)", ssl->out_iv, explicit_ivlen ); /* * Fix message length with added IV */ enc_msg = ssl->out_msg; enc_msglen = ssl->out_msglen; ssl->out_msglen += explicit_ivlen; MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " "including 0 bytes of padding", ssl->out_msglen ) ); /* * Encrypt and authenticate */ if( ( ret = mbedtls_cipher_auth_encrypt( &transform->cipher_ctx_enc, iv, transform->ivlen, add_data, 13, enc_msg, enc_msglen, enc_msg, &olen, enc_msg + enc_msglen, taglen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_encrypt", ret ); return( ret ); } if( olen != enc_msglen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->out_msglen += taglen; auth_done++; MBEDTLS_SSL_DEBUG_BUF( 4, "after encrypt: tag", enc_msg + enc_msglen, taglen ); } else #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) || defined(MBEDTLS_ARIA_C) ) if( mode == MBEDTLS_MODE_CBC ) { int ret; unsigned char *enc_msg; size_t enc_msglen, padlen, olen = 0, i; padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) % ssl->transform_out->ivlen; if( padlen == ssl->transform_out->ivlen ) padlen = 0; for( i = 0; i <= padlen; i++ ) ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen; ssl->out_msglen += padlen + 1; enc_msglen = ssl->out_msglen; enc_msg = ssl->out_msg; #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) /* * Prepend per-record IV for block cipher in TLS v1.1 and up as per * Method 1 (6.2.3.2. in RFC4346 and RFC5246) */ if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) { /* * Generate IV */ ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->transform_out->iv_enc, ssl->transform_out->ivlen ); if( ret != 0 ) return( ret ); memcpy( ssl->out_iv, ssl->transform_out->iv_enc, ssl->transform_out->ivlen ); /* * Fix pointer positions and message length with added IV */ enc_msg = ssl->out_msg; enc_msglen = ssl->out_msglen; ssl->out_msglen += ssl->transform_out->ivlen; } #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, " "including %d bytes of IV and %d bytes of padding", ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) ); if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc, ssl->transform_out->iv_enc, ssl->transform_out->ivlen, enc_msg, enc_msglen, enc_msg, &olen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); return( ret ); } if( enc_msglen != olen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ) { /* * Save IV in SSL3 and TLS1 */ memcpy( ssl->transform_out->iv_enc, ssl->transform_out->cipher_ctx_enc.iv, ssl->transform_out->ivlen ); } #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) if( auth_done == 0 ) { unsigned char mac[MBEDTLS_SSL_MAC_ADD]; /* * MAC(MAC_write_key, seq_num + * TLSCipherText.type + * TLSCipherText.version + * length_of( (IV +) ENC(...) ) + * IV + // except for TLS 1.0 * ENC(content + padding + padding_length)); */ unsigned char pseudo_hdr[13]; MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) ); memcpy( pseudo_hdr + 0, ssl->out_ctr, 8 ); memcpy( pseudo_hdr + 8, ssl->out_hdr, 3 ); pseudo_hdr[11] = (unsigned char)( ( ssl->out_msglen >> 8 ) & 0xFF ); pseudo_hdr[12] = (unsigned char)( ( ssl->out_msglen ) & 0xFF ); MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", pseudo_hdr, 13 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, pseudo_hdr, 13 ); mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_iv, ssl->out_msglen ); mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc, mac ); mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc ); memcpy( ssl->out_iv + ssl->out_msglen, mac, ssl->transform_out->maclen ); ssl->out_msglen += ssl->transform_out->maclen; auth_done++; } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ } else #endif /* MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C || MBEDTLS_ARIA_C ) */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* Make extra sure authentication was performed, exactly once */ if( auth_done != 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) ); return( 0 ); } static int ssl_decrypt_buf( mbedtls_ssl_context *ssl ) { mbedtls_cipher_mode_t mode; int auth_done = 0; #if defined(SSL_SOME_MODES_USE_MAC) size_t padlen = 0, correct = 1; #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) ); if( ssl->session_in == NULL || ssl->transform_in == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_in->cipher_ctx_dec ); if( ssl->in_msglen < ssl->transform_in->minlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)", ssl->in_msglen, ssl->transform_in->minlen ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } #if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) if( mode == MBEDTLS_MODE_STREAM ) { int ret; size_t olen = 0; padlen = 0; if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec, ssl->transform_in->iv_dec, ssl->transform_in->ivlen, ssl->in_msg, ssl->in_msglen, ssl->in_msg, &olen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); return( ret ); } if( ssl->in_msglen != olen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } else #endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */ #if defined(MBEDTLS_GCM_C) || \ defined(MBEDTLS_CCM_C) || \ defined(MBEDTLS_CHACHAPOLY_C) if( mode == MBEDTLS_MODE_GCM || mode == MBEDTLS_MODE_CCM || mode == MBEDTLS_MODE_CHACHAPOLY ) { int ret; size_t dec_msglen, olen; unsigned char *dec_msg; unsigned char *dec_msg_result; unsigned char add_data[13]; unsigned char iv[12]; mbedtls_ssl_transform *transform = ssl->transform_in; unsigned char taglen = transform->ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16; size_t explicit_iv_len = transform->ivlen - transform->fixed_ivlen; /* * Compute and update sizes */ if( ssl->in_msglen < explicit_iv_len + taglen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < explicit_iv_len (%d) " "+ taglen (%d)", ssl->in_msglen, explicit_iv_len, taglen ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } dec_msglen = ssl->in_msglen - explicit_iv_len - taglen; dec_msg = ssl->in_msg; dec_msg_result = ssl->in_msg; ssl->in_msglen = dec_msglen; /* * Prepare additional authenticated data */ memcpy( add_data, ssl->in_ctr, 8 ); add_data[8] = ssl->in_msgtype; mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, add_data + 9 ); add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF; add_data[12] = ssl->in_msglen & 0xFF; MBEDTLS_SSL_DEBUG_BUF( 4, "additional data for AEAD", add_data, 13 ); /* * Prepare IV */ if( transform->ivlen == 12 && transform->fixed_ivlen == 4 ) { /* GCM and CCM: fixed || explicit (transmitted) */ memcpy( iv, transform->iv_dec, transform->fixed_ivlen ); memcpy( iv + transform->fixed_ivlen, ssl->in_iv, 8 ); } else if( transform->ivlen == 12 && transform->fixed_ivlen == 12 ) { /* ChachaPoly: fixed XOR sequence number */ unsigned char i; memcpy( iv, transform->iv_dec, transform->fixed_ivlen ); for( i = 0; i < 8; i++ ) iv[i+4] ^= ssl->in_ctr[i]; } else { /* Reminder if we ever add an AEAD mode with a different size */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 4, "IV used", iv, transform->ivlen ); MBEDTLS_SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, taglen ); /* * Decrypt and authenticate */ if( ( ret = mbedtls_cipher_auth_decrypt( &ssl->transform_in->cipher_ctx_dec, iv, transform->ivlen, add_data, 13, dec_msg, dec_msglen, dec_msg_result, &olen, dec_msg + dec_msglen, taglen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_auth_decrypt", ret ); if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED ) return( MBEDTLS_ERR_SSL_INVALID_MAC ); return( ret ); } auth_done++; if( olen != dec_msglen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } else #endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) || defined(MBEDTLS_ARIA_C) ) if( mode == MBEDTLS_MODE_CBC ) { /* * Decrypt and check the padding */ int ret; unsigned char *dec_msg; unsigned char *dec_msg_result; size_t dec_msglen; size_t minlen = 0; size_t olen = 0; /* * Check immediate ciphertext sanity */ #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) minlen += ssl->transform_in->ivlen; #endif if( ssl->in_msglen < minlen + ssl->transform_in->ivlen || ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) " "+ 1 ) ( + expl IV )", ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } dec_msglen = ssl->in_msglen; dec_msg = ssl->in_msg; dec_msg_result = ssl->in_msg; /* * Authenticate before decrypt if enabled */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) if( ssl->session_in->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED ) { unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD]; unsigned char pseudo_hdr[13]; MBEDTLS_SSL_DEBUG_MSG( 3, ( "using encrypt then mac" ) ); dec_msglen -= ssl->transform_in->maclen; ssl->in_msglen -= ssl->transform_in->maclen; memcpy( pseudo_hdr + 0, ssl->in_ctr, 8 ); memcpy( pseudo_hdr + 8, ssl->in_hdr, 3 ); pseudo_hdr[11] = (unsigned char)( ( ssl->in_msglen >> 8 ) & 0xFF ); pseudo_hdr[12] = (unsigned char)( ( ssl->in_msglen ) & 0xFF ); MBEDTLS_SSL_DEBUG_BUF( 4, "MAC'd meta-data", pseudo_hdr, 13 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, pseudo_hdr, 13 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_iv, ssl->in_msglen ); mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec, mac_expect ); mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec ); MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", ssl->in_iv + ssl->in_msglen, ssl->transform_in->maclen ); MBEDTLS_SSL_DEBUG_BUF( 4, "expected mac", mac_expect, ssl->transform_in->maclen ); if( mbedtls_ssl_safer_memcmp( ssl->in_iv + ssl->in_msglen, mac_expect, ssl->transform_in->maclen ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } auth_done++; } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ /* * Check length sanity */ if( ssl->in_msglen % ssl->transform_in->ivlen != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0", ssl->in_msglen, ssl->transform_in->ivlen ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) /* * Initialize for prepended IV for block cipher in TLS v1.1 and up */ if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) { unsigned char i; dec_msglen -= ssl->transform_in->ivlen; ssl->in_msglen -= ssl->transform_in->ivlen; for( i = 0; i < ssl->transform_in->ivlen; i++ ) ssl->transform_in->iv_dec[i] = ssl->in_iv[i]; } #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec, ssl->transform_in->iv_dec, ssl->transform_in->ivlen, dec_msg, dec_msglen, dec_msg_result, &olen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_crypt", ret ); return( ret ); } if( dec_msglen != olen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ) { /* * Save IV in SSL3 and TLS1 */ memcpy( ssl->transform_in->iv_dec, ssl->transform_in->cipher_ctx_dec.iv, ssl->transform_in->ivlen ); } #endif padlen = 1 + ssl->in_msg[ssl->in_msglen - 1]; if( ssl->in_msglen < ssl->transform_in->maclen + padlen && auth_done == 0 ) { #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)", ssl->in_msglen, ssl->transform_in->maclen, padlen ) ); #endif padlen = 0; correct = 0; } #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { if( padlen > ssl->transform_in->ivlen ) { #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, " "should be no more than %d", padlen, ssl->transform_in->ivlen ) ); #endif correct = 0; } } else #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 ) { /* * TLSv1+: always check the padding up to the first failure * and fake check up to 256 bytes of padding */ size_t pad_count = 0, real_count = 1; size_t padding_idx = ssl->in_msglen - padlen; size_t i; /* * Padding is guaranteed to be incorrect if: * 1. padlen > ssl->in_msglen * * 2. padding_idx > MBEDTLS_SSL_IN_CONTENT_LEN + * ssl->transform_in->maclen * * In both cases we reset padding_idx to a safe value (0) to * prevent out-of-buffer reads. */ correct &= ( padlen <= ssl->in_msglen ); correct &= ( padding_idx <= MBEDTLS_SSL_IN_CONTENT_LEN + ssl->transform_in->maclen ); padding_idx *= correct; for( i = 0; i < 256; i++ ) { real_count &= ( i < padlen ); pad_count += real_count * ( ssl->in_msg[padding_idx + i] == padlen - 1 ); } correct &= ( pad_count == padlen ); /* Only 1 on correct padding */ #if defined(MBEDTLS_SSL_DEBUG_ALL) if( padlen > 0 && correct == 0 ) MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad padding byte detected" ) ); #endif padlen &= correct * 0x1FF; } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->in_msglen -= padlen; } else #endif /* MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C || MBEDTLS_ARIA_C ) */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_BUF( 4, "raw buffer after decryption", ssl->in_msg, ssl->in_msglen ); #endif /* * Authenticate if not done yet. * Compute the MAC regardless of the padding result (RFC4346, CBCTIME). */ #if defined(SSL_SOME_MODES_USE_MAC) if( auth_done == 0 ) { unsigned char mac_expect[MBEDTLS_SSL_MAC_ADD]; ssl->in_msglen -= ssl->transform_in->maclen; ssl->in_len[0] = (unsigned char)( ssl->in_msglen >> 8 ); ssl->in_len[1] = (unsigned char)( ssl->in_msglen ); #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { ssl_mac( &ssl->transform_in->md_ctx_dec, ssl->transform_in->mac_dec, ssl->in_msg, ssl->in_msglen, ssl->in_ctr, ssl->in_msgtype, mac_expect ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 ) { /* * Process MAC and always update for padlen afterwards to make * total time independent of padlen. * * Known timing attacks: * - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf) * * To compensate for different timings for the MAC calculation * depending on how much padding was removed (which is determined * by padlen), process extra_run more blocks through the hash * function. * * The formula in the paper is * extra_run = ceil( (L1-55) / 64 ) - ceil( (L2-55) / 64 ) * where L1 is the size of the header plus the decrypted message * plus CBC padding and L2 is the size of the header plus the * decrypted message. This is for an underlying hash function * with 64-byte blocks. * We use ( (Lx+8) / 64 ) to handle 'negative Lx' values * correctly. We round down instead of up, so -56 is the correct * value for our calculations instead of -55. * * Repeat the formula rather than defining a block_size variable. * This avoids requiring division by a variable at runtime * (which would be marginally less efficient and would require * linking an extra division function in some builds). */ size_t j, extra_run = 0; /* * The next two sizes are the minimum and maximum values of * in_msglen over all padlen values. * * They're independent of padlen, since we previously did * in_msglen -= padlen. * * Note that max_len + maclen is never more than the buffer * length, as we previously did in_msglen -= maclen too. */ const size_t max_len = ssl->in_msglen + padlen; const size_t min_len = ( max_len > 256 ) ? max_len - 256 : 0; switch( ssl->transform_in->ciphersuite_info->mac ) { #if defined(MBEDTLS_MD5_C) || defined(MBEDTLS_SHA1_C) || \ defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_MD5: case MBEDTLS_MD_SHA1: case MBEDTLS_MD_SHA256: /* 8 bytes of message size, 64-byte compression blocks */ extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 - ( 13 + ssl->in_msglen + 8 ) / 64; break; #endif #if defined(MBEDTLS_SHA512_C) case MBEDTLS_MD_SHA384: /* 16 bytes of message size, 128-byte compression blocks */ extra_run = ( 13 + ssl->in_msglen + padlen + 16 ) / 128 - ( 13 + ssl->in_msglen + 16 ) / 128; break; #endif default: MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } extra_run &= correct * 0xFF; mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 8 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_hdr, 3 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_len, 2 ); mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg, ssl->in_msglen ); /* Make sure we access everything even when padlen > 0. This * makes the synchronisation requirements for just-in-time * Prime+Probe attacks much tighter and hopefully impractical. */ ssl_read_memory( ssl->in_msg + ssl->in_msglen, padlen ); mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec, mac_expect ); /* Call mbedtls_md_process at least once due to cache attacks * that observe whether md_process() was called of not */ for( j = 0; j < extra_run + 1; j++ ) mbedtls_md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg ); mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec ); /* Make sure we access all the memory that could contain the MAC, * before we check it in the next code block. This makes the * synchronisation requirements for just-in-time Prime+Probe * attacks much tighter and hopefully impractical. */ ssl_read_memory( ssl->in_msg + min_len, max_len - min_len + ssl->transform_in->maclen ); } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_BUF( 4, "expected mac", mac_expect, ssl->transform_in->maclen ); MBEDTLS_SSL_DEBUG_BUF( 4, "message mac", ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen ); #endif if( mbedtls_ssl_safer_memcmp( ssl->in_msg + ssl->in_msglen, mac_expect, ssl->transform_in->maclen ) != 0 ) { #if defined(MBEDTLS_SSL_DEBUG_ALL) MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) ); #endif correct = 0; } auth_done++; } /* * Finally check the correct flag */ if( correct == 0 ) return( MBEDTLS_ERR_SSL_INVALID_MAC ); #endif /* SSL_SOME_MODES_USE_MAC */ /* Make extra sure authentication was performed, exactly once */ if( auth_done != 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } if( ssl->in_msglen == 0 ) { #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 && ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA ) { /* TLS v1.2 explicitly disallows zero-length messages which are not application data */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid zero-length message type: %d", ssl->in_msgtype ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ ssl->nb_zero++; /* * Three or more empty messages may be a DoS attack * (excessive CPU consumption). */ if( ssl->nb_zero > 3 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "received four consecutive empty " "messages, possible DoS attack" ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } } else ssl->nb_zero = 0; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ; /* in_ctr read from peer, not maintained internally */ } else #endif { unsigned char i; for( i = 8; i > ssl_ep_len( ssl ); i-- ) if( ++ssl->in_ctr[i - 1] != 0 ) break; /* The loop goes to its end iff the counter is wrapping */ if( i == ssl_ep_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "incoming message counter would wrap" ) ); return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decrypt buf" ) ); return( 0 ); } #undef MAC_NONE #undef MAC_PLAINTEXT #undef MAC_CIPHERTEXT #if defined(MBEDTLS_ZLIB_SUPPORT) /* * Compression/decompression functions */ static int ssl_compress_buf( mbedtls_ssl_context *ssl ) { int ret; unsigned char *msg_post = ssl->out_msg; ptrdiff_t bytes_written = ssl->out_msg - ssl->out_buf; size_t len_pre = ssl->out_msglen; unsigned char *msg_pre = ssl->compress_buf; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> compress buf" ) ); if( len_pre == 0 ) return( 0 ); memcpy( msg_pre, ssl->out_msg, len_pre ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "before compression: msglen = %d, ", ssl->out_msglen ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "before compression: output payload", ssl->out_msg, ssl->out_msglen ); ssl->transform_out->ctx_deflate.next_in = msg_pre; ssl->transform_out->ctx_deflate.avail_in = len_pre; ssl->transform_out->ctx_deflate.next_out = msg_post; ssl->transform_out->ctx_deflate.avail_out = MBEDTLS_SSL_OUT_BUFFER_LEN - bytes_written; ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH ); if( ret != Z_OK ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform compression (%d)", ret ) ); return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED ); } ssl->out_msglen = MBEDTLS_SSL_OUT_BUFFER_LEN - ssl->transform_out->ctx_deflate.avail_out - bytes_written; MBEDTLS_SSL_DEBUG_MSG( 3, ( "after compression: msglen = %d, ", ssl->out_msglen ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "after compression: output payload", ssl->out_msg, ssl->out_msglen ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= compress buf" ) ); return( 0 ); } static int ssl_decompress_buf( mbedtls_ssl_context *ssl ) { int ret; unsigned char *msg_post = ssl->in_msg; ptrdiff_t header_bytes = ssl->in_msg - ssl->in_buf; size_t len_pre = ssl->in_msglen; unsigned char *msg_pre = ssl->compress_buf; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> decompress buf" ) ); if( len_pre == 0 ) return( 0 ); memcpy( msg_pre, ssl->in_msg, len_pre ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "before decompression: msglen = %d, ", ssl->in_msglen ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "before decompression: input payload", ssl->in_msg, ssl->in_msglen ); ssl->transform_in->ctx_inflate.next_in = msg_pre; ssl->transform_in->ctx_inflate.avail_in = len_pre; ssl->transform_in->ctx_inflate.next_out = msg_post; ssl->transform_in->ctx_inflate.avail_out = MBEDTLS_SSL_IN_BUFFER_LEN - header_bytes; ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH ); if( ret != Z_OK ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "failed to perform decompression (%d)", ret ) ); return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED ); } ssl->in_msglen = MBEDTLS_SSL_IN_BUFFER_LEN - ssl->transform_in->ctx_inflate.avail_out - header_bytes; MBEDTLS_SSL_DEBUG_MSG( 3, ( "after decompression: msglen = %d, ", ssl->in_msglen ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "after decompression: input payload", ssl->in_msg, ssl->in_msglen ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= decompress buf" ) ); return( 0 ); } #endif /* MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) static int ssl_write_hello_request( mbedtls_ssl_context *ssl ); #if defined(MBEDTLS_SSL_PROTO_DTLS) static int ssl_resend_hello_request( mbedtls_ssl_context *ssl ) { /* If renegotiation is not enforced, retransmit until we would reach max * timeout if we were using the usual handshake doubling scheme */ if( ssl->conf->renego_max_records < 0 ) { uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1; unsigned char doublings = 1; while( ratio != 0 ) { ++doublings; ratio >>= 1; } if( ++ssl->renego_records_seen > doublings ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "no longer retransmitting hello request" ) ); return( 0 ); } } return( ssl_write_hello_request( ssl ) ); } #endif #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ /* * Fill the input message buffer by appending data to it. * The amount of data already fetched is in ssl->in_left. * * If we return 0, is it guaranteed that (at least) nb_want bytes are * available (from this read and/or a previous one). Otherwise, an error code * is returned (possibly EOF or WANT_READ). * * With stream transport (TLS) on success ssl->in_left == nb_want, but * with datagram transport (DTLS) on success ssl->in_left >= nb_want, * since we always read a whole datagram at once. * * For DTLS, it is up to the caller to set ssl->next_record_offset when * they're done reading a record. */ int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want ) { int ret; size_t len; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> fetch input" ) ); if( ssl->f_recv == NULL && ssl->f_recv_timeout == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " "or mbedtls_ssl_set_bio()" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } if( nb_want > MBEDTLS_SSL_IN_BUFFER_LEN - (size_t)( ssl->in_hdr - ssl->in_buf ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "requesting more data than fits" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { uint32_t timeout; /* Just to be sure */ if( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "You must use " "mbedtls_ssl_set_timer_cb() for DTLS" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* * The point is, we need to always read a full datagram at once, so we * sometimes read more then requested, and handle the additional data. * It could be the rest of the current record (while fetching the * header) and/or some other records in the same datagram. */ /* * Move to the next record in the already read datagram if applicable */ if( ssl->next_record_offset != 0 ) { if( ssl->in_left < ssl->next_record_offset ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->in_left -= ssl->next_record_offset; if( ssl->in_left != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "next record in same datagram, offset: %d", ssl->next_record_offset ) ); memmove( ssl->in_hdr, ssl->in_hdr + ssl->next_record_offset, ssl->in_left ); } ssl->next_record_offset = 0; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", ssl->in_left, nb_want ) ); /* * Done if we already have enough data. */ if( nb_want <= ssl->in_left) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) ); return( 0 ); } /* * A record can't be split accross datagrams. If we need to read but * are not at the beginning of a new record, the caller did something * wrong. */ if( ssl->in_left != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * Don't even try to read if time's out already. * This avoids by-passing the timer when repeatedly receiving messages * that will end up being dropped. */ if( ssl_check_timer( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "timer has expired" ) ); ret = MBEDTLS_ERR_SSL_TIMEOUT; } else { len = MBEDTLS_SSL_IN_BUFFER_LEN - ( ssl->in_hdr - ssl->in_buf ); if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) timeout = ssl->handshake->retransmit_timeout; else timeout = ssl->conf->read_timeout; MBEDTLS_SSL_DEBUG_MSG( 3, ( "f_recv_timeout: %u ms", timeout ) ); if( ssl->f_recv_timeout != NULL ) ret = ssl->f_recv_timeout( ssl->p_bio, ssl->in_hdr, len, timeout ); else ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr, len ); MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret ); if( ret == 0 ) return( MBEDTLS_ERR_SSL_CONN_EOF ); } if( ret == MBEDTLS_ERR_SSL_TIMEOUT ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "timeout" ) ); ssl_set_timer( ssl, 0 ); if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) { if( ssl_double_retransmit_timeout( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake timeout" ) ); return( MBEDTLS_ERR_SSL_TIMEOUT ); } if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret ); return( ret ); } return( MBEDTLS_ERR_SSL_WANT_READ ); } #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) else if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) { if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret ); return( ret ); } return( MBEDTLS_ERR_SSL_WANT_READ ); } #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ } if( ret < 0 ) return( ret ); ssl->in_left = ret; } else #endif { MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", ssl->in_left, nb_want ) ); while( ssl->in_left < nb_want ) { len = nb_want - ssl->in_left; if( ssl_check_timer( ssl ) != 0 ) ret = MBEDTLS_ERR_SSL_TIMEOUT; else { if( ssl->f_recv_timeout != NULL ) { ret = ssl->f_recv_timeout( ssl->p_bio, ssl->in_hdr + ssl->in_left, len, ssl->conf->read_timeout ); } else { ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr + ssl->in_left, len ); } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "in_left: %d, nb_want: %d", ssl->in_left, nb_want ) ); MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_recv(_timeout)", ret ); if( ret == 0 ) return( MBEDTLS_ERR_SSL_CONN_EOF ); if( ret < 0 ) return( ret ); if ( (size_t)ret > len || ( INT_MAX > SIZE_MAX && ret > SIZE_MAX ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "f_recv returned %d bytes but only %lu were requested", ret, (unsigned long)len ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->in_left += ret; } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= fetch input" ) ); return( 0 ); } /* * Flush any data not yet written */ int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl ) { int ret; unsigned char *buf; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> flush output" ) ); if( ssl->f_send == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " "or mbedtls_ssl_set_bio()" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* Avoid incrementing counter if data is flushed */ if( ssl->out_left == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) ); return( 0 ); } while( ssl->out_left > 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "message length: %d, out_left: %d", mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen, ssl->out_left ) ); buf = ssl->out_hdr - ssl->out_left; ret = ssl->f_send( ssl->p_bio, buf, ssl->out_left ); MBEDTLS_SSL_DEBUG_RET( 2, "ssl->f_send", ret ); if( ret <= 0 ) return( ret ); if( (size_t)ret > ssl->out_left || ( INT_MAX > SIZE_MAX && ret > SIZE_MAX ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "f_send returned %d bytes but only %lu bytes were sent", ret, (unsigned long)ssl->out_left ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->out_left -= ret; } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->out_hdr = ssl->out_buf; } else #endif { ssl->out_hdr = ssl->out_buf + 8; } ssl_update_out_pointers( ssl, ssl->transform_out ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= flush output" ) ); return( 0 ); } /* * Functions to handle the DTLS retransmission state machine */ #if defined(MBEDTLS_SSL_PROTO_DTLS) /* * Append current handshake message to current outgoing flight */ static int ssl_flight_append( mbedtls_ssl_context *ssl ) { mbedtls_ssl_flight_item *msg; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_flight_append" ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "message appended to flight", ssl->out_msg, ssl->out_msglen ); /* Allocate space for current message */ if( ( msg = mbedtls_calloc( 1, sizeof( mbedtls_ssl_flight_item ) ) ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed", sizeof( mbedtls_ssl_flight_item ) ) ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } if( ( msg->p = mbedtls_calloc( 1, ssl->out_msglen ) ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc %d bytes failed", ssl->out_msglen ) ); mbedtls_free( msg ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } /* Copy current handshake message with headers */ memcpy( msg->p, ssl->out_msg, ssl->out_msglen ); msg->len = ssl->out_msglen; msg->type = ssl->out_msgtype; msg->next = NULL; /* Append to the current flight */ if( ssl->handshake->flight == NULL ) ssl->handshake->flight = msg; else { mbedtls_ssl_flight_item *cur = ssl->handshake->flight; while( cur->next != NULL ) cur = cur->next; cur->next = msg; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_flight_append" ) ); return( 0 ); } /* * Free the current flight of handshake messages */ static void ssl_flight_free( mbedtls_ssl_flight_item *flight ) { mbedtls_ssl_flight_item *cur = flight; mbedtls_ssl_flight_item *next; while( cur != NULL ) { next = cur->next; mbedtls_free( cur->p ); mbedtls_free( cur ); cur = next; } } #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl ); #endif /* * Swap transform_out and out_ctr with the alternative ones */ static void ssl_swap_epochs( mbedtls_ssl_context *ssl ) { mbedtls_ssl_transform *tmp_transform; unsigned char tmp_out_ctr[8]; if( ssl->transform_out == ssl->handshake->alt_transform_out ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip swap epochs" ) ); return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "swap epochs" ) ); /* Swap transforms */ tmp_transform = ssl->transform_out; ssl->transform_out = ssl->handshake->alt_transform_out; ssl->handshake->alt_transform_out = tmp_transform; /* Swap epoch + sequence_number */ memcpy( tmp_out_ctr, ssl->cur_out_ctr, 8 ); memcpy( ssl->cur_out_ctr, ssl->handshake->alt_out_ctr, 8 ); memcpy( ssl->handshake->alt_out_ctr, tmp_out_ctr, 8 ); /* Adjust to the newly activated transform */ ssl_update_out_pointers( ssl, ssl->transform_out ); #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_activate != NULL ) { if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif } /* * Retransmit the current flight of messages. */ int mbedtls_ssl_resend( mbedtls_ssl_context *ssl ) { int ret = 0; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_resend" ) ); ret = mbedtls_ssl_flight_transmit( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_resend" ) ); return( ret ); } /* * Transmit or retransmit the current flight of messages. * * Need to remember the current message in case flush_output returns * WANT_WRITE, causing us to exit this function and come back later. * This function must be called until state is no longer SENDING. */ int mbedtls_ssl_flight_transmit( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> mbedtls_ssl_flight_transmit" ) ); if( ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialise flight transmission" ) ); ssl->handshake->cur_msg = ssl->handshake->flight; ssl->handshake->cur_msg_p = ssl->handshake->flight->p + 12; ssl_swap_epochs( ssl ); ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_SENDING; } while( ssl->handshake->cur_msg != NULL ) { size_t max_frag_len; const mbedtls_ssl_flight_item * const cur = ssl->handshake->cur_msg; int const is_finished = ( cur->type == MBEDTLS_SSL_MSG_HANDSHAKE && cur->p[0] == MBEDTLS_SSL_HS_FINISHED ); uint8_t const force_flush = ssl->disable_datagram_packing == 1 ? SSL_FORCE_FLUSH : SSL_DONT_FORCE_FLUSH; /* Swap epochs before sending Finished: we can't do it after * sending ChangeCipherSpec, in case write returns WANT_READ. * Must be done before copying, may change out_msg pointer */ if( is_finished && ssl->handshake->cur_msg_p == ( cur->p + 12 ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "swap epochs to send finished message" ) ); ssl_swap_epochs( ssl ); } ret = ssl_get_remaining_payload_in_datagram( ssl ); if( ret < 0 ) return( ret ); max_frag_len = (size_t) ret; /* CCS is copied as is, while HS messages may need fragmentation */ if( cur->type == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) { if( max_frag_len == 0 ) { if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); continue; } memcpy( ssl->out_msg, cur->p, cur->len ); ssl->out_msglen = cur->len; ssl->out_msgtype = cur->type; /* Update position inside current message */ ssl->handshake->cur_msg_p += cur->len; } else { const unsigned char * const p = ssl->handshake->cur_msg_p; const size_t hs_len = cur->len - 12; const size_t frag_off = p - ( cur->p + 12 ); const size_t rem_len = hs_len - frag_off; size_t cur_hs_frag_len, max_hs_frag_len; if( ( max_frag_len < 12 ) || ( max_frag_len == 12 && hs_len != 0 ) ) { if( is_finished ) ssl_swap_epochs( ssl ); if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); continue; } max_hs_frag_len = max_frag_len - 12; cur_hs_frag_len = rem_len > max_hs_frag_len ? max_hs_frag_len : rem_len; if( frag_off == 0 && cur_hs_frag_len != hs_len ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "fragmenting handshake message (%u > %u)", (unsigned) cur_hs_frag_len, (unsigned) max_hs_frag_len ) ); } /* Messages are stored with handshake headers as if not fragmented, * copy beginning of headers then fill fragmentation fields. * Handshake headers: type(1) len(3) seq(2) f_off(3) f_len(3) */ memcpy( ssl->out_msg, cur->p, 6 ); ssl->out_msg[6] = ( ( frag_off >> 16 ) & 0xff ); ssl->out_msg[7] = ( ( frag_off >> 8 ) & 0xff ); ssl->out_msg[8] = ( ( frag_off ) & 0xff ); ssl->out_msg[ 9] = ( ( cur_hs_frag_len >> 16 ) & 0xff ); ssl->out_msg[10] = ( ( cur_hs_frag_len >> 8 ) & 0xff ); ssl->out_msg[11] = ( ( cur_hs_frag_len ) & 0xff ); MBEDTLS_SSL_DEBUG_BUF( 3, "handshake header", ssl->out_msg, 12 ); /* Copy the handshake message content and set records fields */ memcpy( ssl->out_msg + 12, p, cur_hs_frag_len ); ssl->out_msglen = cur_hs_frag_len + 12; ssl->out_msgtype = cur->type; /* Update position inside current message */ ssl->handshake->cur_msg_p += cur_hs_frag_len; } /* If done with the current message move to the next one if any */ if( ssl->handshake->cur_msg_p >= cur->p + cur->len ) { if( cur->next != NULL ) { ssl->handshake->cur_msg = cur->next; ssl->handshake->cur_msg_p = cur->next->p + 12; } else { ssl->handshake->cur_msg = NULL; ssl->handshake->cur_msg_p = NULL; } } /* Actually send the message out */ if( ( ret = mbedtls_ssl_write_record( ssl, force_flush ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); return( ret ); } } if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); /* Update state and set timer */ if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; else { ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; ssl_set_timer( ssl, ssl->handshake->retransmit_timeout ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= mbedtls_ssl_flight_transmit" ) ); return( 0 ); } /* * To be called when the last message of an incoming flight is received. */ void mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl ) { /* We won't need to resend that one any more */ ssl_flight_free( ssl->handshake->flight ); ssl->handshake->flight = NULL; ssl->handshake->cur_msg = NULL; /* The next incoming flight will start with this msg_seq */ ssl->handshake->in_flight_start_seq = ssl->handshake->in_msg_seq; /* We don't want to remember CCS's across flight boundaries. */ ssl->handshake->buffering.seen_ccs = 0; /* Clear future message buffering structure. */ ssl_buffering_free( ssl ); /* Cancel timer */ ssl_set_timer( ssl, 0 ); if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED ) { ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; } else ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING; } /* * To be called when the last message of an outgoing flight is send. */ void mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl ) { ssl_reset_retransmit_timeout( ssl ); ssl_set_timer( ssl, ssl->handshake->retransmit_timeout ); if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED ) { ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED; } else ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* * Handshake layer functions */ /* * Write (DTLS: or queue) current handshake (including CCS) message. * * - fill in handshake headers * - update handshake checksum * - DTLS: save message for resending * - then pass to the record layer * * DTLS: except for HelloRequest, messages are only queued, and will only be * actually sent when calling flight_transmit() or resend(). * * Inputs: * - ssl->out_msglen: 4 + actual handshake message len * (4 is the size of handshake headers for TLS) * - ssl->out_msg[0]: the handshake type (ClientHello, ServerHello, etc) * - ssl->out_msg + 4: the handshake message body * * Outputs, ie state before passing to flight_append() or write_record(): * - ssl->out_msglen: the length of the record contents * (including handshake headers but excluding record headers) * - ssl->out_msg: the record contents (handshake headers + content) */ int mbedtls_ssl_write_handshake_msg( mbedtls_ssl_context *ssl ) { int ret; const size_t hs_len = ssl->out_msglen - 4; const unsigned char hs_type = ssl->out_msg[0]; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write handshake message" ) ); /* * Sanity checks */ if( ssl->out_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE && ssl->out_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) { /* In SSLv3, the client might send a NoCertificate alert. */ #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C) if( ! ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && ssl->out_msgtype == MBEDTLS_SSL_MSG_ALERT && ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ) #endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } /* Whenever we send anything different from a * HelloRequest we should be in a handshake - double check. */ if( ! ( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && hs_type == MBEDTLS_SSL_HS_HELLO_REQUEST ) && ssl->handshake == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake != NULL && ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #endif /* Double-check that we did not exceed the bounds * of the outgoing record buffer. * This should never fail as the various message * writing functions must obey the bounds of the * outgoing record buffer, but better be safe. * * Note: We deliberately do not check for the MTU or MFL here. */ if( ssl->out_msglen > MBEDTLS_SSL_OUT_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Record too large: " "size %u, maximum %u", (unsigned) ssl->out_msglen, (unsigned) MBEDTLS_SSL_OUT_CONTENT_LEN ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * Fill handshake headers */ if( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) { ssl->out_msg[1] = (unsigned char)( hs_len >> 16 ); ssl->out_msg[2] = (unsigned char)( hs_len >> 8 ); ssl->out_msg[3] = (unsigned char)( hs_len ); /* * DTLS has additional fields in the Handshake layer, * between the length field and the actual payload: * uint16 message_seq; * uint24 fragment_offset; * uint24 fragment_length; */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { /* Make room for the additional DTLS fields */ if( MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen < 8 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS handshake message too large: " "size %u, maximum %u", (unsigned) ( hs_len ), (unsigned) ( MBEDTLS_SSL_OUT_CONTENT_LEN - 12 ) ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } memmove( ssl->out_msg + 12, ssl->out_msg + 4, hs_len ); ssl->out_msglen += 8; /* Write message_seq and update it, except for HelloRequest */ if( hs_type != MBEDTLS_SSL_HS_HELLO_REQUEST ) { ssl->out_msg[4] = ( ssl->handshake->out_msg_seq >> 8 ) & 0xFF; ssl->out_msg[5] = ( ssl->handshake->out_msg_seq ) & 0xFF; ++( ssl->handshake->out_msg_seq ); } else { ssl->out_msg[4] = 0; ssl->out_msg[5] = 0; } /* Handshake hashes are computed without fragmentation, * so set frag_offset = 0 and frag_len = hs_len for now */ memset( ssl->out_msg + 6, 0x00, 3 ); memcpy( ssl->out_msg + 9, ssl->out_msg + 1, 3 ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* Update running hashes of handshake messages seen */ if( hs_type != MBEDTLS_SSL_HS_HELLO_REQUEST ) ssl->handshake->update_checksum( ssl, ssl->out_msg, ssl->out_msglen ); } /* Either send now, or just save to be sent (and resent) later */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ! ( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && hs_type == MBEDTLS_SSL_HS_HELLO_REQUEST ) ) { if( ( ret = ssl_flight_append( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_flight_append", ret ); return( ret ); } } else #endif { if( ( ret = mbedtls_ssl_write_record( ssl, SSL_FORCE_FLUSH ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_write_record", ret ); return( ret ); } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write handshake message" ) ); return( 0 ); } /* * Record layer functions */ /* * Write current record. * * Uses: * - ssl->out_msgtype: type of the message (AppData, Handshake, Alert, CCS) * - ssl->out_msglen: length of the record content (excl headers) * - ssl->out_msg: record content */ int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl, uint8_t force_flush ) { int ret, done = 0; size_t len = ssl->out_msglen; uint8_t flush = force_flush; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write record" ) ); #if defined(MBEDTLS_ZLIB_SUPPORT) if( ssl->transform_out != NULL && ssl->session_out->compression == MBEDTLS_SSL_COMPRESS_DEFLATE ) { if( ( ret = ssl_compress_buf( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_compress_buf", ret ); return( ret ); } len = ssl->out_msglen; } #endif /*MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_write != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_write()" ) ); ret = mbedtls_ssl_hw_record_write( ssl ); if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_write", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } if( ret == 0 ) done = 1; } #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ if( !done ) { unsigned i; size_t protected_record_size; ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype; mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, ssl->out_hdr + 1 ); memcpy( ssl->out_ctr, ssl->cur_out_ctr, 8 ); ssl->out_len[0] = (unsigned char)( len >> 8 ); ssl->out_len[1] = (unsigned char)( len ); if( ssl->transform_out != NULL ) { if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_encrypt_buf", ret ); return( ret ); } len = ssl->out_msglen; ssl->out_len[0] = (unsigned char)( len >> 8 ); ssl->out_len[1] = (unsigned char)( len ); } protected_record_size = len + mbedtls_ssl_hdr_len( ssl ); #if defined(MBEDTLS_SSL_PROTO_DTLS) /* In case of DTLS, double-check that we don't exceed * the remaining space in the datagram. */ if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ret = ssl_get_remaining_space_in_datagram( ssl ); if( ret < 0 ) return( ret ); if( protected_record_size > (size_t) ret ) { /* Should never happen */ return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "output record: msgtype = %d, " "version = [%d:%d], msglen = %d", ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2], len ) ); MBEDTLS_SSL_DEBUG_BUF( 4, "output record sent to network", ssl->out_hdr, protected_record_size ); ssl->out_left += protected_record_size; ssl->out_hdr += protected_record_size; ssl_update_out_pointers( ssl, ssl->transform_out ); for( i = 8; i > ssl_ep_len( ssl ); i-- ) if( ++ssl->cur_out_ctr[i - 1] != 0 ) break; /* The loop goes to its end iff the counter is wrapping */ if( i == ssl_ep_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "outgoing message counter would wrap" ) ); return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); } } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && flush == SSL_DONT_FORCE_FLUSH ) { size_t remaining; ret = ssl_get_remaining_payload_in_datagram( ssl ); if( ret < 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_get_remaining_payload_in_datagram", ret ); return( ret ); } remaining = (size_t) ret; if( remaining == 0 ) { flush = SSL_FORCE_FLUSH; } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Still %u bytes available in current datagram", (unsigned) remaining ) ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ if( ( flush == SSL_FORCE_FLUSH ) && ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write record" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) static int ssl_hs_is_proper_fragment( mbedtls_ssl_context *ssl ) { if( ssl->in_msglen < ssl->in_hslen || memcmp( ssl->in_msg + 6, "\0\0\0", 3 ) != 0 || memcmp( ssl->in_msg + 9, ssl->in_msg + 1, 3 ) != 0 ) { return( 1 ); } return( 0 ); } static uint32_t ssl_get_hs_frag_len( mbedtls_ssl_context const *ssl ) { return( ( ssl->in_msg[9] << 16 ) | ( ssl->in_msg[10] << 8 ) | ssl->in_msg[11] ); } static uint32_t ssl_get_hs_frag_off( mbedtls_ssl_context const *ssl ) { return( ( ssl->in_msg[6] << 16 ) | ( ssl->in_msg[7] << 8 ) | ssl->in_msg[8] ); } static int ssl_check_hs_header( mbedtls_ssl_context const *ssl ) { uint32_t msg_len, frag_off, frag_len; msg_len = ssl_get_hs_total_len( ssl ); frag_off = ssl_get_hs_frag_off( ssl ); frag_len = ssl_get_hs_frag_len( ssl ); if( frag_off > msg_len ) return( -1 ); if( frag_len > msg_len - frag_off ) return( -1 ); if( frag_len + 12 > ssl->in_msglen ) return( -1 ); return( 0 ); } /* * Mark bits in bitmask (used for DTLS HS reassembly) */ static void ssl_bitmask_set( unsigned char *mask, size_t offset, size_t len ) { unsigned int start_bits, end_bits; start_bits = 8 - ( offset % 8 ); if( start_bits != 8 ) { size_t first_byte_idx = offset / 8; /* Special case */ if( len <= start_bits ) { for( ; len != 0; len-- ) mask[first_byte_idx] |= 1 << ( start_bits - len ); /* Avoid potential issues with offset or len becoming invalid */ return; } offset += start_bits; /* Now offset % 8 == 0 */ len -= start_bits; for( ; start_bits != 0; start_bits-- ) mask[first_byte_idx] |= 1 << ( start_bits - 1 ); } end_bits = len % 8; if( end_bits != 0 ) { size_t last_byte_idx = ( offset + len ) / 8; len -= end_bits; /* Now len % 8 == 0 */ for( ; end_bits != 0; end_bits-- ) mask[last_byte_idx] |= 1 << ( 8 - end_bits ); } memset( mask + offset / 8, 0xFF, len / 8 ); } /* * Check that bitmask is full */ static int ssl_bitmask_check( unsigned char *mask, size_t len ) { size_t i; for( i = 0; i < len / 8; i++ ) if( mask[i] != 0xFF ) return( -1 ); for( i = 0; i < len % 8; i++ ) if( ( mask[len / 8] & ( 1 << ( 7 - i ) ) ) == 0 ) return( -1 ); return( 0 ); } /* msg_len does not include the handshake header */ static size_t ssl_get_reassembly_buffer_size( size_t msg_len, unsigned add_bitmap ) { size_t alloc_len; alloc_len = 12; /* Handshake header */ alloc_len += msg_len; /* Content buffer */ if( add_bitmap ) alloc_len += msg_len / 8 + ( msg_len % 8 != 0 ); /* Bitmap */ return( alloc_len ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ static uint32_t ssl_get_hs_total_len( mbedtls_ssl_context const *ssl ) { return( ( ssl->in_msg[1] << 16 ) | ( ssl->in_msg[2] << 8 ) | ssl->in_msg[3] ); } int mbedtls_ssl_prepare_handshake_record( mbedtls_ssl_context *ssl ) { if( ssl->in_msglen < mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake message too short: %d", ssl->in_msglen ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } ssl->in_hslen = mbedtls_ssl_hs_hdr_len( ssl ) + ssl_get_hs_total_len( ssl ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "handshake message: msglen =" " %d, type = %d, hslen = %d", ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { int ret; unsigned int recv_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; if( ssl_check_hs_header( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid handshake header" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } if( ssl->handshake != NULL && ( ( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER && recv_msg_seq != ssl->handshake->in_msg_seq ) || ( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER && ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO ) ) ) { if( recv_msg_seq > ssl->handshake->in_msg_seq ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "received future handshake message of sequence number %u (next %u)", recv_msg_seq, ssl->handshake->in_msg_seq ) ); return( MBEDTLS_ERR_SSL_EARLY_MESSAGE ); } /* Retransmit only on last message from previous flight, to avoid * too many retransmissions. * Besides, No sane server ever retransmits HelloVerifyRequest */ if( recv_msg_seq == ssl->handshake->in_flight_start_seq - 1 && ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "received message from last flight, " "message_seq = %d, start_of_flight = %d", recv_msg_seq, ssl->handshake->in_flight_start_seq ) ); if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_resend", ret ); return( ret ); } } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "dropping out-of-sequence message: " "message_seq = %d, expected = %d", recv_msg_seq, ssl->handshake->in_msg_seq ) ); } return( MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ); } /* Wait until message completion to increment in_msg_seq */ /* Message reassembly is handled alongside buffering of future * messages; the commonality is that both handshake fragments and * future messages cannot be forwarded immediately to the * handshake logic layer. */ if( ssl_hs_is_proper_fragment( ssl ) == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "found fragmented DTLS handshake message" ) ); return( MBEDTLS_ERR_SSL_EARLY_MESSAGE ); } } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* With TLS we don't handle fragmentation (for now) */ if( ssl->in_msglen < ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLS handshake fragmentation not supported" ) ); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } return( 0 ); } void mbedtls_ssl_update_handshake_status( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER && hs != NULL ) { ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen ); } /* Handshake message is complete, increment counter */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake != NULL ) { unsigned offset; mbedtls_ssl_hs_buffer *hs_buf; /* Increment handshake sequence number */ hs->in_msg_seq++; /* * Clear up handshake buffering and reassembly structure. */ /* Free first entry */ ssl_buffering_free_slot( ssl, 0 ); /* Shift all other entries */ for( offset = 0, hs_buf = &hs->buffering.hs[0]; offset + 1 < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++, hs_buf++ ) { *hs_buf = *(hs_buf + 1); } /* Create a fresh last entry */ memset( hs_buf, 0, sizeof( mbedtls_ssl_hs_buffer ) ); } #endif } /* * DTLS anti-replay: RFC 6347 4.1.2.6 * * in_window is a field of bits numbered from 0 (lsb) to 63 (msb). * Bit n is set iff record number in_window_top - n has been seen. * * Usually, in_window_top is the last record number seen and the lsb of * in_window is set. The only exception is the initial state (record number 0 * not seen yet). */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) static void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl ) { ssl->in_window_top = 0; ssl->in_window = 0; } static inline uint64_t ssl_load_six_bytes( unsigned char *buf ) { return( ( (uint64_t) buf[0] << 40 ) | ( (uint64_t) buf[1] << 32 ) | ( (uint64_t) buf[2] << 24 ) | ( (uint64_t) buf[3] << 16 ) | ( (uint64_t) buf[4] << 8 ) | ( (uint64_t) buf[5] ) ); } /* * Return 0 if sequence number is acceptable, -1 otherwise */ int mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl ) { uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 ); uint64_t bit; if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED ) return( 0 ); if( rec_seqnum > ssl->in_window_top ) return( 0 ); bit = ssl->in_window_top - rec_seqnum; if( bit >= 64 ) return( -1 ); if( ( ssl->in_window & ( (uint64_t) 1 << bit ) ) != 0 ) return( -1 ); return( 0 ); } /* * Update replay window on new validated record */ void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl ) { uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 ); if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED ) return; if( rec_seqnum > ssl->in_window_top ) { /* Update window_top and the contents of the window */ uint64_t shift = rec_seqnum - ssl->in_window_top; if( shift >= 64 ) ssl->in_window = 1; else { ssl->in_window <<= shift; ssl->in_window |= 1; } ssl->in_window_top = rec_seqnum; } else { /* Mark that number as seen in the current window */ uint64_t bit = ssl->in_window_top - rec_seqnum; if( bit < 64 ) /* Always true, but be extra sure */ ssl->in_window |= (uint64_t) 1 << bit; } } #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) /* Forward declaration */ static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial ); /* * Without any SSL context, check if a datagram looks like a ClientHello with * a valid cookie, and if it doesn't, generate a HelloVerifyRequest message. * Both input and output include full DTLS headers. * * - if cookie is valid, return 0 * - if ClientHello looks superficially valid but cookie is not, * fill obuf and set olen, then * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED * - otherwise return a specific error code */ static int ssl_check_dtls_clihlo_cookie( mbedtls_ssl_cookie_write_t *f_cookie_write, mbedtls_ssl_cookie_check_t *f_cookie_check, void *p_cookie, const unsigned char *cli_id, size_t cli_id_len, const unsigned char *in, size_t in_len, unsigned char *obuf, size_t buf_len, size_t *olen ) { size_t sid_len, cookie_len; unsigned char *p; if( f_cookie_write == NULL || f_cookie_check == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); /* * Structure of ClientHello with record and handshake headers, * and expected values. We don't need to check a lot, more checks will be * done when actually parsing the ClientHello - skipping those checks * avoids code duplication and does not make cookie forging any easier. * * 0-0 ContentType type; copied, must be handshake * 1-2 ProtocolVersion version; copied * 3-4 uint16 epoch; copied, must be 0 * 5-10 uint48 sequence_number; copied * 11-12 uint16 length; (ignored) * * 13-13 HandshakeType msg_type; (ignored) * 14-16 uint24 length; (ignored) * 17-18 uint16 message_seq; copied * 19-21 uint24 fragment_offset; copied, must be 0 * 22-24 uint24 fragment_length; (ignored) * * 25-26 ProtocolVersion client_version; (ignored) * 27-58 Random random; (ignored) * 59-xx SessionID session_id; 1 byte len + sid_len content * 60+ opaque cookie<0..2^8-1>; 1 byte len + content * ... * * Minimum length is 61 bytes. */ if( in_len < 61 || in[0] != MBEDTLS_SSL_MSG_HANDSHAKE || in[3] != 0 || in[4] != 0 || in[19] != 0 || in[20] != 0 || in[21] != 0 ) { return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } sid_len = in[59]; if( sid_len > in_len - 61 ) return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); cookie_len = in[60 + sid_len]; if( cookie_len > in_len - 60 ) return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); if( f_cookie_check( p_cookie, in + sid_len + 61, cookie_len, cli_id, cli_id_len ) == 0 ) { /* Valid cookie */ return( 0 ); } /* * If we get here, we've got an invalid cookie, let's prepare HVR. * * 0-0 ContentType type; copied * 1-2 ProtocolVersion version; copied * 3-4 uint16 epoch; copied * 5-10 uint48 sequence_number; copied * 11-12 uint16 length; olen - 13 * * 13-13 HandshakeType msg_type; hello_verify_request * 14-16 uint24 length; olen - 25 * 17-18 uint16 message_seq; copied * 19-21 uint24 fragment_offset; copied * 22-24 uint24 fragment_length; olen - 25 * * 25-26 ProtocolVersion server_version; 0xfe 0xff * 27-27 opaque cookie<0..2^8-1>; cookie_len = olen - 27, cookie * * Minimum length is 28. */ if( buf_len < 28 ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); /* Copy most fields and adapt others */ memcpy( obuf, in, 25 ); obuf[13] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST; obuf[25] = 0xfe; obuf[26] = 0xff; /* Generate and write actual cookie */ p = obuf + 28; if( f_cookie_write( p_cookie, &p, obuf + buf_len, cli_id, cli_id_len ) != 0 ) { return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } *olen = p - obuf; /* Go back and fill length fields */ obuf[27] = (unsigned char)( *olen - 28 ); obuf[14] = obuf[22] = (unsigned char)( ( *olen - 25 ) >> 16 ); obuf[15] = obuf[23] = (unsigned char)( ( *olen - 25 ) >> 8 ); obuf[16] = obuf[24] = (unsigned char)( ( *olen - 25 ) ); obuf[11] = (unsigned char)( ( *olen - 13 ) >> 8 ); obuf[12] = (unsigned char)( ( *olen - 13 ) ); return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); } /* * Handle possible client reconnect with the same UDP quadruplet * (RFC 6347 Section 4.2.8). * * Called by ssl_parse_record_header() in case we receive an epoch 0 record * that looks like a ClientHello. * * - if the input looks like a ClientHello without cookies, * send back HelloVerifyRequest, then * return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED * - if the input looks like a ClientHello with a valid cookie, * reset the session of the current context, and * return MBEDTLS_ERR_SSL_CLIENT_RECONNECT * - if anything goes wrong, return a specific error code * * mbedtls_ssl_read_record() will ignore the record if anything else than * MBEDTLS_ERR_SSL_CLIENT_RECONNECT or 0 is returned, although this function * cannot not return 0. */ static int ssl_handle_possible_reconnect( mbedtls_ssl_context *ssl ) { int ret; size_t len; ret = ssl_check_dtls_clihlo_cookie( ssl->conf->f_cookie_write, ssl->conf->f_cookie_check, ssl->conf->p_cookie, ssl->cli_id, ssl->cli_id_len, ssl->in_buf, ssl->in_left, ssl->out_buf, MBEDTLS_SSL_OUT_CONTENT_LEN, &len ); MBEDTLS_SSL_DEBUG_RET( 2, "ssl_check_dtls_clihlo_cookie", ret ); if( ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ) { /* Don't check write errors as we can't do anything here. * If the error is permanent we'll catch it later, * if it's not, then hopefully it'll work next time. */ (void) ssl->f_send( ssl->p_bio, ssl->out_buf, len ); return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); } if( ret == 0 ) { /* Got a valid cookie, partially reset context */ if( ( ret = ssl_session_reset_int( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "reset", ret ); return( ret ); } return( MBEDTLS_ERR_SSL_CLIENT_RECONNECT ); } return( ret ); } #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ /* * ContentType type; * ProtocolVersion version; * uint16 epoch; // DTLS only * uint48 sequence_number; // DTLS only * uint16 length; * * Return 0 if header looks sane (and, for DTLS, the record is expected) * MBEDTLS_ERR_SSL_INVALID_RECORD if the header looks bad, * MBEDTLS_ERR_SSL_UNEXPECTED_RECORD (DTLS only) if sane but unexpected. * * With DTLS, mbedtls_ssl_read_record() will: * 1. proceed with the record if this function returns 0 * 2. drop only the current record if this function returns UNEXPECTED_RECORD * 3. return CLIENT_RECONNECT if this function return that value * 4. drop the whole datagram if this function returns anything else. * Point 2 is needed when the peer is resending, and we have already received * the first record from a datagram but are still waiting for the others. */ static int ssl_parse_record_header( mbedtls_ssl_context *ssl ) { int major_ver, minor_ver; MBEDTLS_SSL_DEBUG_BUF( 4, "input record header", ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) ); ssl->in_msgtype = ssl->in_hdr[0]; ssl->in_msglen = ( ssl->in_len[0] << 8 ) | ssl->in_len[1]; mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, ssl->in_hdr + 1 ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "input record: msgtype = %d, " "version = [%d:%d], msglen = %d", ssl->in_msgtype, major_ver, minor_ver, ssl->in_msglen ) ); /* Check record type */ if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_msgtype != MBEDTLS_SSL_MSG_ALERT && ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC && ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "unknown record type" ) ); #if defined(MBEDTLS_SSL_PROTO_DTLS) /* Silently ignore invalid DTLS records as recommended by RFC 6347 * Section 4.1.2.7 */ if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ) #endif /* MBEDTLS_SSL_PROTO_DTLS */ mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } /* Check version */ if( major_ver != ssl->major_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "major version mismatch" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } if( minor_ver > ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "minor version mismatch" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } /* Check length against the size of our buffer */ if( ssl->in_msglen > MBEDTLS_SSL_IN_BUFFER_LEN - (size_t)( ssl->in_msg - ssl->in_buf ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } /* * DTLS-related tests. * Check epoch before checking length constraint because * the latter varies with the epoch. E.g., if a ChangeCipherSpec * message gets duplicated before the corresponding Finished message, * the second ChangeCipherSpec should be discarded because it belongs * to an old epoch, but not because its length is shorter than * the minimum record length for packets using the new record transform. * Note that these two kinds of failures are handled differently, * as an unexpected record is silently skipped but an invalid * record leads to the entire datagram being dropped. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { unsigned int rec_epoch = ( ssl->in_ctr[0] << 8 ) | ssl->in_ctr[1]; /* Check epoch (and sequence number) with DTLS */ if( rec_epoch != ssl->in_epoch ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "record from another epoch: " "expected %d, received %d", ssl->in_epoch, rec_epoch ) ); #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) /* * Check for an epoch 0 ClientHello. We can't use in_msg here to * access the first byte of record content (handshake type), as we * have an active transform (possibly iv_len != 0), so use the * fact that the record header len is 13 instead. */ if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER && rec_epoch == 0 && ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_left > 13 && ssl->in_buf[13] == MBEDTLS_SSL_HS_CLIENT_HELLO ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "possible client reconnect " "from the same port" ) ); return( ssl_handle_possible_reconnect( ssl ) ); } else #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ { /* Consider buffering the record. */ if( rec_epoch == (unsigned int) ssl->in_epoch + 1 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Consider record for buffering" ) ); return( MBEDTLS_ERR_SSL_EARLY_MESSAGE ); } return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); } } #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) /* Replay detection only works for the current epoch */ if( rec_epoch == ssl->in_epoch && mbedtls_ssl_dtls_replay_check( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); } #endif /* Drop unexpected ApplicationData records, * except at the beginning of renegotiations */ if( ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA && ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER #if defined(MBEDTLS_SSL_RENEGOTIATION) && ! ( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->state == MBEDTLS_SSL_SERVER_HELLO ) #endif ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping unexpected ApplicationData" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* Check length against bounds of the current transform and version */ if( ssl->transform_in == NULL ) { if( ssl->in_msglen < 1 || ssl->in_msglen > MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } } else { if( ssl->in_msglen < ssl->transform_in->minlen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && ssl->in_msglen > ssl->transform_in->minlen + MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #endif #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) /* * TLS encrypted messages can have up to 256 bytes of padding */ if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 && ssl->in_msglen > ssl->transform_in->minlen + MBEDTLS_SSL_IN_CONTENT_LEN + 256 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #endif } return( 0 ); } /* * If applicable, decrypt (and decompress) record content */ static int ssl_prepare_record_content( mbedtls_ssl_context *ssl ) { int ret, done = 0; MBEDTLS_SSL_DEBUG_BUF( 4, "input record from network", ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ); #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_read != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_read()" ) ); ret = mbedtls_ssl_hw_record_read( ssl ); if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_read", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } if( ret == 0 ) done = 1; } #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ if( !done && ssl->transform_in != NULL ) { if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decrypt_buf", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_BUF( 4, "input payload after decrypt", ssl->in_msg, ssl->in_msglen ); if( ssl->in_msglen > MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad message length" ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } } #if defined(MBEDTLS_ZLIB_SUPPORT) if( ssl->transform_in != NULL && ssl->session_in->compression == MBEDTLS_SSL_COMPRESS_DEFLATE ) { if( ( ret = ssl_decompress_buf( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_decompress_buf", ret ); return( ret ); } } #endif /* MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { mbedtls_ssl_dtls_replay_update( ssl ); } #endif return( 0 ); } static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl ); /* * Read a record. * * Silently ignore non-fatal alert (and for DTLS, invalid records as well, * RFC 6347 4.1.2.7) and continue reading until a valid record is found. * */ /* Helper functions for mbedtls_ssl_read_record(). */ static int ssl_consume_current_message( mbedtls_ssl_context *ssl ); static int ssl_get_next_record( mbedtls_ssl_context *ssl ); static int ssl_record_is_in_progress( mbedtls_ssl_context *ssl ); int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl, unsigned update_hs_digest ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read record" ) ); if( ssl->keep_current_message == 0 ) { do { ret = ssl_consume_current_message( ssl ); if( ret != 0 ) return( ret ); if( ssl_record_is_in_progress( ssl ) == 0 ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) int have_buffered = 0; /* We only check for buffered messages if the * current datagram is fully consumed. */ if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl_next_record_is_in_datagram( ssl ) == 0 ) { if( ssl_load_buffered_message( ssl ) == 0 ) have_buffered = 1; } if( have_buffered == 0 ) #endif /* MBEDTLS_SSL_PROTO_DTLS */ { ret = ssl_get_next_record( ssl ); if( ret == MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ) continue; if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_get_next_record" ), ret ); return( ret ); } } } ret = mbedtls_ssl_handle_message_type( ssl ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ret == MBEDTLS_ERR_SSL_EARLY_MESSAGE ) { /* Buffer future message */ ret = ssl_buffer_message( ssl ); if( ret != 0 ) return( ret ); ret = MBEDTLS_ERR_SSL_CONTINUE_PROCESSING; } #endif /* MBEDTLS_SSL_PROTO_DTLS */ } while( MBEDTLS_ERR_SSL_NON_FATAL == ret || MBEDTLS_ERR_SSL_CONTINUE_PROCESSING == ret ); if( 0 != ret ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_handle_message_type" ), ret ); return( ret ); } if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && update_hs_digest == 1 ) { mbedtls_ssl_update_handshake_status( ssl ); } } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "reuse previously read message" ) ); ssl->keep_current_message = 0; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read record" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) static int ssl_next_record_is_in_datagram( mbedtls_ssl_context *ssl ) { if( ssl->in_left > ssl->next_record_offset ) return( 1 ); return( 0 ); } static int ssl_load_buffered_message( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; mbedtls_ssl_hs_buffer * hs_buf; int ret = 0; if( hs == NULL ) return( -1 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_load_buffered_messsage" ) ); if( ssl->state == MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC || ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC ) { /* Check if we have seen a ChangeCipherSpec before. * If yes, synthesize a CCS record. */ if( !hs->buffering.seen_ccs ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "CCS not seen in the current flight" ) ); ret = -1; goto exit; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Injecting buffered CCS message" ) ); ssl->in_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC; ssl->in_msglen = 1; ssl->in_msg[0] = 1; /* As long as they are equal, the exact value doesn't matter. */ ssl->in_left = 0; ssl->next_record_offset = 0; hs->buffering.seen_ccs = 0; goto exit; } #if defined(MBEDTLS_DEBUG_C) /* Debug only */ { unsigned offset; for( offset = 1; offset < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++ ) { hs_buf = &hs->buffering.hs[offset]; if( hs_buf->is_valid == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Future message with sequence number %u %s buffered.", hs->in_msg_seq + offset, hs_buf->is_complete ? "fully" : "partially" ) ); } } } #endif /* MBEDTLS_DEBUG_C */ /* Check if we have buffered and/or fully reassembled the * next handshake message. */ hs_buf = &hs->buffering.hs[0]; if( ( hs_buf->is_valid == 1 ) && ( hs_buf->is_complete == 1 ) ) { /* Synthesize a record containing the buffered HS message. */ size_t msg_len = ( hs_buf->data[1] << 16 ) | ( hs_buf->data[2] << 8 ) | hs_buf->data[3]; /* Double-check that we haven't accidentally buffered * a message that doesn't fit into the input buffer. */ if( msg_len + 12 > MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Next handshake message has been buffered - load" ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "Buffered handshake message (incl. header)", hs_buf->data, msg_len + 12 ); ssl->in_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->in_hslen = msg_len + 12; ssl->in_msglen = msg_len + 12; memcpy( ssl->in_msg, hs_buf->data, ssl->in_hslen ); ret = 0; goto exit; } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Next handshake message %u not or only partially bufffered", hs->in_msg_seq ) ); } ret = -1; exit: MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_load_buffered_message" ) ); return( ret ); } static int ssl_buffer_make_space( mbedtls_ssl_context *ssl, size_t desired ) { int offset; mbedtls_ssl_handshake_params * const hs = ssl->handshake; MBEDTLS_SSL_DEBUG_MSG( 2, ( "Attempt to free buffered messages to have %u bytes available", (unsigned) desired ) ); /* Get rid of future records epoch first, if such exist. */ ssl_free_buffered_record( ssl ); /* Check if we have enough space available now. */ if( desired <= ( MBEDTLS_SSL_DTLS_MAX_BUFFERING - hs->buffering.total_bytes_buffered ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Enough space available after freeing future epoch record" ) ); return( 0 ); } /* We don't have enough space to buffer the next expected handshake * message. Remove buffers used for future messages to gain space, * starting with the most distant one. */ for( offset = MBEDTLS_SSL_MAX_BUFFERED_HS - 1; offset >= 0; offset-- ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Free buffering slot %d to make space for reassembly of next handshake message", offset ) ); ssl_buffering_free_slot( ssl, (uint8_t) offset ); /* Check if we have enough space available now. */ if( desired <= ( MBEDTLS_SSL_DTLS_MAX_BUFFERING - hs->buffering.total_bytes_buffered ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Enough space available after freeing buffered HS messages" ) ); return( 0 ); } } return( -1 ); } static int ssl_buffer_message( mbedtls_ssl_context *ssl ) { int ret = 0; mbedtls_ssl_handshake_params * const hs = ssl->handshake; if( hs == NULL ) return( 0 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_buffer_message" ) ); switch( ssl->in_msgtype ) { case MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC: MBEDTLS_SSL_DEBUG_MSG( 2, ( "Remember CCS message" ) ); hs->buffering.seen_ccs = 1; break; case MBEDTLS_SSL_MSG_HANDSHAKE: { unsigned recv_msg_seq_offset; unsigned recv_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; mbedtls_ssl_hs_buffer *hs_buf; size_t msg_len = ssl->in_hslen - 12; /* We should never receive an old handshake * message - double-check nonetheless. */ if( recv_msg_seq < ssl->handshake->in_msg_seq ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } recv_msg_seq_offset = recv_msg_seq - ssl->handshake->in_msg_seq; if( recv_msg_seq_offset >= MBEDTLS_SSL_MAX_BUFFERED_HS ) { /* Silently ignore -- message too far in the future */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "Ignore future HS message with sequence number %u, " "buffering window %u - %u", recv_msg_seq, ssl->handshake->in_msg_seq, ssl->handshake->in_msg_seq + MBEDTLS_SSL_MAX_BUFFERED_HS - 1 ) ); goto exit; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering HS message with sequence number %u, offset %u ", recv_msg_seq, recv_msg_seq_offset ) ); hs_buf = &hs->buffering.hs[ recv_msg_seq_offset ]; /* Check if the buffering for this seq nr has already commenced. */ if( !hs_buf->is_valid ) { size_t reassembly_buf_sz; hs_buf->is_fragmented = ( ssl_hs_is_proper_fragment( ssl ) == 1 ); /* We copy the message back into the input buffer * after reassembly, so check that it's not too large. * This is an implementation-specific limitation * and not one from the standard, hence it is not * checked in ssl_check_hs_header(). */ if( msg_len + 12 > MBEDTLS_SSL_IN_CONTENT_LEN ) { /* Ignore message */ goto exit; } /* Check if we have enough space to buffer the message. */ if( hs->buffering.total_bytes_buffered > MBEDTLS_SSL_DTLS_MAX_BUFFERING ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } reassembly_buf_sz = ssl_get_reassembly_buffer_size( msg_len, hs_buf->is_fragmented ); if( reassembly_buf_sz > ( MBEDTLS_SSL_DTLS_MAX_BUFFERING - hs->buffering.total_bytes_buffered ) ) { if( recv_msg_seq_offset > 0 ) { /* If we can't buffer a future message because * of space limitations -- ignore. */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering of future message of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- ignore\n", (unsigned) msg_len, MBEDTLS_SSL_DTLS_MAX_BUFFERING, (unsigned) hs->buffering.total_bytes_buffered ) ); goto exit; } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering of future message of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- attempt to make space by freeing buffered future messages\n", (unsigned) msg_len, MBEDTLS_SSL_DTLS_MAX_BUFFERING, (unsigned) hs->buffering.total_bytes_buffered ) ); } if( ssl_buffer_make_space( ssl, reassembly_buf_sz ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Reassembly of next message of size %u (%u with bitmap) would exceed the compile-time limit %u (already %u bytes buffered) -- fail\n", (unsigned) msg_len, (unsigned) reassembly_buf_sz, MBEDTLS_SSL_DTLS_MAX_BUFFERING, (unsigned) hs->buffering.total_bytes_buffered ) ); ret = MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL; goto exit; } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "initialize reassembly, total length = %d", msg_len ) ); hs_buf->data = mbedtls_calloc( 1, reassembly_buf_sz ); if( hs_buf->data == NULL ) { ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; goto exit; } hs_buf->data_len = reassembly_buf_sz; /* Prepare final header: copy msg_type, length and message_seq, * then add standardised fragment_offset and fragment_length */ memcpy( hs_buf->data, ssl->in_msg, 6 ); memset( hs_buf->data + 6, 0, 3 ); memcpy( hs_buf->data + 9, hs_buf->data + 1, 3 ); hs_buf->is_valid = 1; hs->buffering.total_bytes_buffered += reassembly_buf_sz; } else { /* Make sure msg_type and length are consistent */ if( memcmp( hs_buf->data, ssl->in_msg, 4 ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Fragment header mismatch - ignore" ) ); /* Ignore */ goto exit; } } if( !hs_buf->is_complete ) { size_t frag_len, frag_off; unsigned char * const msg = hs_buf->data + 12; /* * Check and copy current fragment */ /* Validation of header fields already done in * mbedtls_ssl_prepare_handshake_record(). */ frag_off = ssl_get_hs_frag_off( ssl ); frag_len = ssl_get_hs_frag_len( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "adding fragment, offset = %d, length = %d", frag_off, frag_len ) ); memcpy( msg + frag_off, ssl->in_msg + 12, frag_len ); if( hs_buf->is_fragmented ) { unsigned char * const bitmask = msg + msg_len; ssl_bitmask_set( bitmask, frag_off, frag_len ); hs_buf->is_complete = ( ssl_bitmask_check( bitmask, msg_len ) == 0 ); } else { hs_buf->is_complete = 1; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "message %scomplete", hs_buf->is_complete ? "" : "not yet " ) ); } break; } default: /* We don't buffer other types of messages. */ break; } exit: MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_buffer_message" ) ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ static int ssl_consume_current_message( mbedtls_ssl_context *ssl ) { /* * Consume last content-layer message and potentially * update in_msglen which keeps track of the contents' * consumption state. * * (1) Handshake messages: * Remove last handshake message, move content * and adapt in_msglen. * * (2) Alert messages: * Consume whole record content, in_msglen = 0. * * (3) Change cipher spec: * Consume whole record content, in_msglen = 0. * * (4) Application data: * Don't do anything - the record layer provides * the application data as a stream transport * and consumes through mbedtls_ssl_read only. * */ /* Case (1): Handshake messages */ if( ssl->in_hslen != 0 ) { /* Hard assertion to be sure that no application data * is in flight, as corrupting ssl->in_msglen during * ssl->in_offt != NULL is fatal. */ if( ssl->in_offt != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* * Get next Handshake message in the current record */ /* Notes: * (1) in_hslen is not necessarily the size of the * current handshake content: If DTLS handshake * fragmentation is used, that's the fragment * size instead. Using the total handshake message * size here is faulty and should be changed at * some point. * (2) While it doesn't seem to cause problems, one * has to be very careful not to assume that in_hslen * is always <= in_msglen in a sensible communication. * Again, it's wrong for DTLS handshake fragmentation. * The following check is therefore mandatory, and * should not be treated as a silently corrected assertion. * Additionally, ssl->in_hslen might be arbitrarily out of * bounds after handling a DTLS message with an unexpected * sequence number, see mbedtls_ssl_prepare_handshake_record. */ if( ssl->in_hslen < ssl->in_msglen ) { ssl->in_msglen -= ssl->in_hslen; memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen, ssl->in_msglen ); MBEDTLS_SSL_DEBUG_BUF( 4, "remaining content in record", ssl->in_msg, ssl->in_msglen ); } else { ssl->in_msglen = 0; } ssl->in_hslen = 0; } /* Case (4): Application data */ else if( ssl->in_offt != NULL ) { return( 0 ); } /* Everything else (CCS & Alerts) */ else { ssl->in_msglen = 0; } return( 0 ); } static int ssl_record_is_in_progress( mbedtls_ssl_context *ssl ) { if( ssl->in_msglen > 0 ) return( 1 ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) static void ssl_free_buffered_record( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; if( hs == NULL ) return; if( hs->buffering.future_record.data != NULL ) { hs->buffering.total_bytes_buffered -= hs->buffering.future_record.len; mbedtls_free( hs->buffering.future_record.data ); hs->buffering.future_record.data = NULL; } } static int ssl_load_buffered_record( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; unsigned char * rec; size_t rec_len; unsigned rec_epoch; if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ) return( 0 ); if( hs == NULL ) return( 0 ); rec = hs->buffering.future_record.data; rec_len = hs->buffering.future_record.len; rec_epoch = hs->buffering.future_record.epoch; if( rec == NULL ) return( 0 ); /* Only consider loading future records if the * input buffer is empty. */ if( ssl_next_record_is_in_datagram( ssl ) == 1 ) return( 0 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_load_buffered_record" ) ); if( rec_epoch != ssl->in_epoch ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffered record not from current epoch." ) ); goto exit; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "Found buffered record from current epoch - load" ) ); /* Double-check that the record is not too large */ if( rec_len > MBEDTLS_SSL_IN_BUFFER_LEN - (size_t)( ssl->in_hdr - ssl->in_buf ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } memcpy( ssl->in_hdr, rec, rec_len ); ssl->in_left = rec_len; ssl->next_record_offset = 0; ssl_free_buffered_record( ssl ); exit: MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= ssl_load_buffered_record" ) ); return( 0 ); } static int ssl_buffer_future_record( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; size_t const rec_hdr_len = 13; size_t const total_buf_sz = rec_hdr_len + ssl->in_msglen; /* Don't buffer future records outside handshakes. */ if( hs == NULL ) return( 0 ); /* Only buffer handshake records (we are only interested * in Finished messages). */ if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) return( 0 ); /* Don't buffer more than one future epoch record. */ if( hs->buffering.future_record.data != NULL ) return( 0 ); /* Don't buffer record if there's not enough buffering space remaining. */ if( total_buf_sz > ( MBEDTLS_SSL_DTLS_MAX_BUFFERING - hs->buffering.total_bytes_buffered ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffering of future epoch record of size %u would exceed the compile-time limit %u (already %u bytes buffered) -- ignore\n", (unsigned) total_buf_sz, MBEDTLS_SSL_DTLS_MAX_BUFFERING, (unsigned) hs->buffering.total_bytes_buffered ) ); return( 0 ); } /* Buffer record */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "Buffer record from epoch %u", ssl->in_epoch + 1 ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "Buffered record", ssl->in_hdr, rec_hdr_len + ssl->in_msglen ); /* ssl_parse_record_header() only considers records * of the next epoch as candidates for buffering. */ hs->buffering.future_record.epoch = ssl->in_epoch + 1; hs->buffering.future_record.len = total_buf_sz; hs->buffering.future_record.data = mbedtls_calloc( 1, hs->buffering.future_record.len ); if( hs->buffering.future_record.data == NULL ) { /* If we run out of RAM trying to buffer a * record from the next epoch, just ignore. */ return( 0 ); } memcpy( hs->buffering.future_record.data, ssl->in_hdr, total_buf_sz ); hs->buffering.total_bytes_buffered += total_buf_sz; return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ static int ssl_get_next_record( mbedtls_ssl_context *ssl ) { int ret; #if defined(MBEDTLS_SSL_PROTO_DTLS) /* We might have buffered a future record; if so, * and if the epoch matches now, load it. * On success, this call will set ssl->in_left to * the length of the buffered record, so that * the calls to ssl_fetch_input() below will * essentially be no-ops. */ ret = ssl_load_buffered_record( ssl ); if( ret != 0 ) return( ret ); #endif /* MBEDTLS_SSL_PROTO_DTLS */ if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } if( ( ret = ssl_parse_record_header( ssl ) ) != 0 ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ret != MBEDTLS_ERR_SSL_CLIENT_RECONNECT ) { if( ret == MBEDTLS_ERR_SSL_EARLY_MESSAGE ) { ret = ssl_buffer_future_record( ssl ); if( ret != 0 ) return( ret ); /* Fall through to handling of unexpected records */ ret = MBEDTLS_ERR_SSL_UNEXPECTED_RECORD; } if( ret == MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ) { /* Skip unexpected record (but not whole datagram) */ ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_hdr_len( ssl ); MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding unexpected record " "(header)" ) ); } else { /* Skip invalid record and the rest of the datagram */ ssl->next_record_offset = 0; ssl->in_left = 0; MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record " "(header)" ) ); } /* Get next record */ return( MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ); } #endif return( ret ); } /* * Read and optionally decrypt the message contents */ if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } /* Done reading this record, get ready for the next one */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_hdr_len( ssl ); if( ssl->next_record_offset < ssl->in_left ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "more than one record within datagram" ) ); } } else #endif ssl->in_left = 0; if( ( ret = ssl_prepare_record_content( ssl ) ) != 0 ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { /* Silently discard invalid records */ if( ret == MBEDTLS_ERR_SSL_INVALID_RECORD || ret == MBEDTLS_ERR_SSL_INVALID_MAC ) { /* Except when waiting for Finished as a bad mac here * probably means something went wrong in the handshake * (eg wrong psk used, mitm downgrade attempt, etc.) */ if( ssl->state == MBEDTLS_SSL_CLIENT_FINISHED || ssl->state == MBEDTLS_SSL_SERVER_FINISHED ) { #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) if( ret == MBEDTLS_ERR_SSL_INVALID_MAC ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC ); } #endif return( ret ); } #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) if( ssl->conf->badmac_limit != 0 && ++ssl->badmac_seen >= ssl->conf->badmac_limit ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "too many records with bad MAC" ) ); return( MBEDTLS_ERR_SSL_INVALID_MAC ); } #endif /* As above, invalid records cause * dismissal of the whole datagram. */ ssl->next_record_offset = 0; ssl->in_left = 0; MBEDTLS_SSL_DEBUG_MSG( 1, ( "discarding invalid record (mac)" ) ); return( MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ); } return( ret ); } else #endif { /* Error out (and send alert) on invalid records */ #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) if( ret == MBEDTLS_ERR_SSL_INVALID_MAC ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC ); } #endif return( ret ); } } return( 0 ); } int mbedtls_ssl_handle_message_type( mbedtls_ssl_context *ssl ) { int ret; /* * Handle particular types of records */ if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) { if( ( ret = mbedtls_ssl_prepare_handshake_record( ssl ) ) != 0 ) { return( ret ); } } if( ssl->in_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) { if( ssl->in_msglen != 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid CCS message, len: %d", ssl->in_msglen ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } if( ssl->in_msg[0] != 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid CCS message, content: %02x", ssl->in_msg[0] ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->state != MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC && ssl->state != MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC ) { if( ssl->handshake == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "dropping ChangeCipherSpec outside handshake" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "received out-of-order ChangeCipherSpec - remember" ) ); return( MBEDTLS_ERR_SSL_EARLY_MESSAGE ); } #endif } if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT ) { if( ssl->in_msglen != 2 ) { /* Note: Standard allows for more than one 2 byte alert to be packed in a single message, but Mbed TLS doesn't currently support this. */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid alert message, len: %d", ssl->in_msglen ) ); return( MBEDTLS_ERR_SSL_INVALID_RECORD ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "got an alert message, type: [%d:%d]", ssl->in_msg[0], ssl->in_msg[1] ) ); /* * Ignore non-fatal alerts, except close_notify and no_renegotiation */ if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_FATAL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "is a fatal alert message (msg %d)", ssl->in_msg[1] ) ); return( MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE ); } if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a close notify message" ) ); return( MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY ); } #if defined(MBEDTLS_SSL_RENEGOTIATION_ENABLED) if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no renegotiation alert" ) ); /* Will be handled when trying to parse ServerHello */ return( 0 ); } #endif #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_SRV_C) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 && ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "is a SSLv3 no_cert" ) ); /* Will be handled in mbedtls_ssl_parse_certificate() */ return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */ /* Silently ignore: fetch new message */ return MBEDTLS_ERR_SSL_NON_FATAL; } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake != NULL && ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) { ssl_handshake_wrapup_free_hs_transform( ssl ); } #endif return( 0 ); } int mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl ) { int ret; if( ( ret = mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 ) { return( ret ); } return( 0 ); } int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl, unsigned char level, unsigned char message ) { int ret; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> send alert message" ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "send alert level=%u message=%u", level, message )); ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT; ssl->out_msglen = 2; ssl->out_msg[0] = level; ssl->out_msg[1] = message; if( ( ret = mbedtls_ssl_write_record( ssl, SSL_FORCE_FLUSH ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= send alert message" ) ); return( 0 ); } /* * Handshake functions */ #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) /* No certificate support -> dummy functions */ int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else /* Some certificate support -> implement write and parse */ int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; size_t i, n; const mbedtls_x509_crt *crt; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); ssl->state++; return( 0 ); } #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) { if( ssl->client_auth == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate" ) ); ssl->state++; return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) /* * If using SSLv3 and got no cert, send an Alert message * (otherwise an empty Certificate message will be sent). */ if( mbedtls_ssl_own_cert( ssl ) == NULL && ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { ssl->out_msglen = 2; ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT; ssl->out_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_WARNING; ssl->out_msg[1] = MBEDTLS_SSL_ALERT_MSG_NO_CERT; MBEDTLS_SSL_DEBUG_MSG( 2, ( "got no certificate to send" ) ); goto write_msg; } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ } #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) { if( mbedtls_ssl_own_cert( ssl ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no certificate to send" ) ); return( MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED ); } } #endif MBEDTLS_SSL_DEBUG_CRT( 3, "own certificate", mbedtls_ssl_own_cert( ssl ) ); /* * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 6 length of all certs * 7 . 9 length of cert. 1 * 10 . n-1 peer certificate * n . n+2 length of cert. 2 * n+3 . ... upper level cert, etc. */ i = 7; crt = mbedtls_ssl_own_cert( ssl ); while( crt != NULL ) { n = crt->raw.len; if( n > MBEDTLS_SSL_OUT_CONTENT_LEN - 3 - i ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "certificate too large, %d > %d", i + 3 + n, MBEDTLS_SSL_OUT_CONTENT_LEN ) ); return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE ); } ssl->out_msg[i ] = (unsigned char)( n >> 16 ); ssl->out_msg[i + 1] = (unsigned char)( n >> 8 ); ssl->out_msg[i + 2] = (unsigned char)( n ); i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n ); i += n; crt = crt->next; } ssl->out_msg[4] = (unsigned char)( ( i - 7 ) >> 16 ); ssl->out_msg[5] = (unsigned char)( ( i - 7 ) >> 8 ); ssl->out_msg[6] = (unsigned char)( ( i - 7 ) ); ssl->out_msglen = i; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE; #if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C) write_msg: #endif ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate" ) ); return( ret ); } /* * Once the certificate message is read, parse it into a cert chain and * perform basic checks, but leave actual verification to the caller */ static int ssl_parse_certificate_chain( mbedtls_ssl_context *ssl ) { int ret; size_t i, n; uint8_t alert; #if defined(MBEDTLS_SSL_SRV_C) #if defined(MBEDTLS_SSL_PROTO_SSL3) /* * Check if the client sent an empty certificate */ if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { if( ssl->in_msglen == 2 && ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT && ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING && ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "SSLv3 client has no certificate" ) ); /* The client was asked for a certificate but didn't send one. The client should know what's going on, so we don't send an alert. */ ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING; return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE ); } } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) { if( ssl->in_hslen == 3 + mbedtls_ssl_hs_hdr_len( ssl ) && ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE && ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE && memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), "\0\0\0", 3 ) == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "TLSv1 client has no certificate" ) ); /* The client was asked for a certificate but didn't send one. The client should know what's going on, so we don't send an alert. */ ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING; return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE ); } } #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ #endif /* MBEDTLS_SSL_SRV_C */ if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE || ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } i = mbedtls_ssl_hs_hdr_len( ssl ); /* * Same message structure as in mbedtls_ssl_write_certificate() */ n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2]; if( ssl->in_msg[i] != 0 || ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } /* In case we tried to reuse a session but it failed */ if( ssl->session_negotiate->peer_cert != NULL ) { mbedtls_x509_crt_free( ssl->session_negotiate->peer_cert ); mbedtls_free( ssl->session_negotiate->peer_cert ); } if( ( ssl->session_negotiate->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) ) ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", sizeof( mbedtls_x509_crt ) ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } mbedtls_x509_crt_init( ssl->session_negotiate->peer_cert ); i += 3; while( i < ssl->in_hslen ) { if ( i + 3 > ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } if( ssl->in_msg[i] != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } n = ( (unsigned int) ssl->in_msg[i + 1] << 8 ) | (unsigned int) ssl->in_msg[i + 2]; i += 3; if( n < 128 || i + n > ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } ret = mbedtls_x509_crt_parse_der( ssl->session_negotiate->peer_cert, ssl->in_msg + i, n ); switch( ret ) { case 0: /*ok*/ case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND: /* Ignore certificate with an unknown algorithm: maybe a prior certificate was already trusted. */ break; case MBEDTLS_ERR_X509_ALLOC_FAILED: alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR; goto crt_parse_der_failed; case MBEDTLS_ERR_X509_UNKNOWN_VERSION: alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; goto crt_parse_der_failed; default: alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; crt_parse_der_failed: mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert ); MBEDTLS_SSL_DEBUG_RET( 1, " mbedtls_x509_crt_parse_der", ret ); return( ret ); } i += n; } MBEDTLS_SSL_DEBUG_CRT( 3, "peer certificate", ssl->session_negotiate->peer_cert ); /* * On client, make sure the server cert doesn't change during renego to * avoid "triple handshake" attack: https://secure-resumption.com/ */ #if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { if( ssl->session->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "new server cert during renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } if( ssl->session->peer_cert->raw.len != ssl->session_negotiate->peer_cert->raw.len || memcmp( ssl->session->peer_cert->raw.p, ssl->session_negotiate->peer_cert->raw.p, ssl->session->peer_cert->raw.len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server cert changed during renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ); } } #endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */ return( 0 ); } int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ) { int ret; const mbedtls_ssl_ciphersuite_t * const ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET ? ssl->handshake->sni_authmode : ssl->conf->authmode; #else const int authmode = ssl->conf->authmode; #endif void *rs_ctx = NULL; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); ssl->state++; return( 0 ); } #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); ssl->state++; return( 0 ); } if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && authmode == MBEDTLS_SSL_VERIFY_NONE ) { ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_SKIP_VERIFY; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate" ) ); ssl->state++; return( 0 ); } #endif #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled && ssl->handshake->ecrs_state == ssl_ecrs_crt_verify ) { goto crt_verify; } #endif if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { /* mbedtls_ssl_read_record may have sent an alert already. We let it decide whether to alert. */ MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ( ret = ssl_parse_certificate_chain( ssl ) ) != 0 ) { #if defined(MBEDTLS_SSL_SRV_C) if( ret == MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE && authmode == MBEDTLS_SSL_VERIFY_OPTIONAL ) { ret = 0; } #endif ssl->state++; return( ret ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ssl->handshake->ecrs_enabled) ssl->handshake->ecrs_state = ssl_ecrs_crt_verify; crt_verify: if( ssl->handshake->ecrs_enabled) rs_ctx = &ssl->handshake->ecrs_ctx; #endif if( authmode != MBEDTLS_SSL_VERIFY_NONE ) { mbedtls_x509_crt *ca_chain; mbedtls_x509_crl *ca_crl; #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) if( ssl->handshake->sni_ca_chain != NULL ) { ca_chain = ssl->handshake->sni_ca_chain; ca_crl = ssl->handshake->sni_ca_crl; } else #endif { ca_chain = ssl->conf->ca_chain; ca_crl = ssl->conf->ca_crl; } /* * Main check: verify certificate */ ret = mbedtls_x509_crt_verify_restartable( ssl->session_negotiate->peer_cert, ca_chain, ca_crl, ssl->conf->cert_profile, ssl->hostname, &ssl->session_negotiate->verify_result, ssl->conf->f_vrfy, ssl->conf->p_vrfy, rs_ctx ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "x509_verify_cert", ret ); } #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) return( MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ); #endif /* * Secondary checks: always done, but change 'ret' only if it was 0 */ #if defined(MBEDTLS_ECP_C) { const mbedtls_pk_context *pk = &ssl->session_negotiate->peer_cert->pk; /* If certificate uses an EC key, make sure the curve is OK */ if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) && mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 ) { ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY; MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (EC key curve)" ) ); if( ret == 0 ) ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; } } #endif /* MBEDTLS_ECP_C */ if( mbedtls_ssl_check_cert_usage( ssl->session_negotiate->peer_cert, ciphersuite_info, ! ssl->conf->endpoint, &ssl->session_negotiate->verify_result ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate (usage extensions)" ) ); if( ret == 0 ) ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE; } /* mbedtls_x509_crt_verify_with_profile is supposed to report a * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED, * with details encoded in the verification flags. All other kinds * of error codes, including those from the user provided f_vrfy * functions, are treated as fatal and lead to a failure of * ssl_parse_certificate even if verification was optional. */ if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL && ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED || ret == MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ) ) { ret = 0; } if( ca_chain == NULL && authmode == MBEDTLS_SSL_VERIFY_REQUIRED ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) ); ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED; } if( ret != 0 ) { uint8_t alert; /* The certificate may have been rejected for several reasons. Pick one and send the corresponding alert. Which alert to send may be a subject of debate in some cases. */ if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER ) alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH ) alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY ) alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED ) alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED ) alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED; else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED ) alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA; else alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN; mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert ); } #if defined(MBEDTLS_DEBUG_C) if( ssl->session_negotiate->verify_result != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "! Certificate verification flags %x", ssl->session_negotiate->verify_result ) ); } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "Certificate verification flags clear" ) ); } #endif /* MBEDTLS_DEBUG_C */ } ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate" ) ); return( ret ); } #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED !MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ int mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write change cipher spec" ) ); ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC; ssl->out_msglen = 1; ssl->out_msg[0] = 1; ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write change cipher spec" ) ); return( 0 ); } int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse change cipher spec" ) ); if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad change cipher spec message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* CCS records are only accepted if they have length 1 and content '1', * so we don't need to check this here. */ /* * Switch to our negotiated transform and session parameters for inbound * data. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for inbound data" ) ); ssl->transform_in = ssl->transform_negotiate; ssl->session_in = ssl->session_negotiate; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) ssl_dtls_replay_reset( ssl ); #endif /* Increment epoch */ if( ++ssl->in_epoch == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) ); /* This is highly unlikely to happen for legitimate reasons, so treat it as an attack and don't send an alert. */ return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); } } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ memset( ssl->in_ctr, 0, 8 ); ssl_update_in_pointers( ssl, ssl->transform_negotiate ); #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_activate != NULL ) { if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_INBOUND ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse change cipher spec" ) ); return( 0 ); } void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl, const mbedtls_ssl_ciphersuite_t *ciphersuite_info ) { ((void) ciphersuite_info); #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 ) ssl->handshake->update_checksum = ssl_update_checksum_md5sha1; else #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA512_C) if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) ssl->handshake->update_checksum = ssl_update_checksum_sha384; else #endif #if defined(MBEDTLS_SHA256_C) if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 ) ssl->handshake->update_checksum = ssl_update_checksum_sha256; else #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return; } } void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_starts_ret( &ssl->handshake->fin_md5 ); mbedtls_sha1_starts_ret( &ssl->handshake->fin_sha1 ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_starts_ret( &ssl->handshake->fin_sha256, 0 ); #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_starts_ret( &ssl->handshake->fin_sha512, 1 ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ } static void ssl_update_checksum_start( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len ); mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len ); #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) static void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { mbedtls_md5_update_ret( &ssl->handshake->fin_md5 , buf, len ); mbedtls_sha1_update_ret( &ssl->handshake->fin_sha1, buf, len ); } #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) static void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { mbedtls_sha256_update_ret( &ssl->handshake->fin_sha256, buf, len ); } #endif #if defined(MBEDTLS_SHA512_C) static void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { mbedtls_sha512_update_ret( &ssl->handshake->fin_sha512, buf, len ); } #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) static void ssl_calc_finished_ssl( mbedtls_ssl_context *ssl, unsigned char *buf, int from ) { const char *sender; mbedtls_md5_context md5; mbedtls_sha1_context sha1; unsigned char padbuf[48]; unsigned char md5sum[16]; unsigned char sha1sum[20]; mbedtls_ssl_session *session = ssl->session_negotiate; if( !session ) session = ssl->session; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished ssl" ) ); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); /* * SSLv3: * hash = * MD5( master + pad2 + * MD5( handshake + sender + master + pad1 ) ) * + SHA1( master + pad2 + * SHA1( handshake + sender + master + pad1 ) ) */ #if !defined(MBEDTLS_MD5_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *) md5.state, sizeof( md5.state ) ); #endif #if !defined(MBEDTLS_SHA1_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *) sha1.state, sizeof( sha1.state ) ); #endif sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "CLNT" : "SRVR"; memset( padbuf, 0x36, 48 ); mbedtls_md5_update_ret( &md5, (const unsigned char *) sender, 4 ); mbedtls_md5_update_ret( &md5, session->master, 48 ); mbedtls_md5_update_ret( &md5, padbuf, 48 ); mbedtls_md5_finish_ret( &md5, md5sum ); mbedtls_sha1_update_ret( &sha1, (const unsigned char *) sender, 4 ); mbedtls_sha1_update_ret( &sha1, session->master, 48 ); mbedtls_sha1_update_ret( &sha1, padbuf, 40 ); mbedtls_sha1_finish_ret( &sha1, sha1sum ); memset( padbuf, 0x5C, 48 ); mbedtls_md5_starts_ret( &md5 ); mbedtls_md5_update_ret( &md5, session->master, 48 ); mbedtls_md5_update_ret( &md5, padbuf, 48 ); mbedtls_md5_update_ret( &md5, md5sum, 16 ); mbedtls_md5_finish_ret( &md5, buf ); mbedtls_sha1_starts_ret( &sha1 ); mbedtls_sha1_update_ret( &sha1, session->master, 48 ); mbedtls_sha1_update_ret( &sha1, padbuf , 40 ); mbedtls_sha1_update_ret( &sha1, sha1sum, 20 ); mbedtls_sha1_finish_ret( &sha1, buf + 16 ); MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, 36 ); mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) ); mbedtls_platform_zeroize( md5sum, sizeof( md5sum ) ); mbedtls_platform_zeroize( sha1sum, sizeof( sha1sum ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) static void ssl_calc_finished_tls( mbedtls_ssl_context *ssl, unsigned char *buf, int from ) { int len = 12; const char *sender; mbedtls_md5_context md5; mbedtls_sha1_context sha1; unsigned char padbuf[36]; mbedtls_ssl_session *session = ssl->session_negotiate; if( !session ) session = ssl->session; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls" ) ); mbedtls_md5_init( &md5 ); mbedtls_sha1_init( &sha1 ); mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 ); mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 ); /* * TLSv1: * hash = PRF( master, finished_label, * MD5( handshake ) + SHA1( handshake ) )[0..11] */ #if !defined(MBEDTLS_MD5_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished md5 state", (unsigned char *) md5.state, sizeof( md5.state ) ); #endif #if !defined(MBEDTLS_SHA1_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha1 state", (unsigned char *) sha1.state, sizeof( sha1.state ) ); #endif sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "client finished" : "server finished"; mbedtls_md5_finish_ret( &md5, padbuf ); mbedtls_sha1_finish_ret( &sha1, padbuf + 16 ); ssl->handshake->tls_prf( session->master, 48, sender, padbuf, 36, buf, len ); MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); mbedtls_md5_free( &md5 ); mbedtls_sha1_free( &sha1 ); mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); } #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) static void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *ssl, unsigned char *buf, int from ) { int len = 12; const char *sender; mbedtls_sha256_context sha256; unsigned char padbuf[32]; mbedtls_ssl_session *session = ssl->session_negotiate; if( !session ) session = ssl->session; mbedtls_sha256_init( &sha256 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha256" ) ); mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 ); /* * TLSv1.2: * hash = PRF( master, finished_label, * Hash( handshake ) )[0.11] */ #if !defined(MBEDTLS_SHA256_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha2 state", (unsigned char *) sha256.state, sizeof( sha256.state ) ); #endif sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "client finished" : "server finished"; mbedtls_sha256_finish_ret( &sha256, padbuf ); ssl->handshake->tls_prf( session->master, 48, sender, padbuf, 32, buf, len ); MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); mbedtls_sha256_free( &sha256 ); mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); } #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) static void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *ssl, unsigned char *buf, int from ) { int len = 12; const char *sender; mbedtls_sha512_context sha512; unsigned char padbuf[48]; mbedtls_ssl_session *session = ssl->session_negotiate; if( !session ) session = ssl->session; mbedtls_sha512_init( &sha512 ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> calc finished tls sha384" ) ); mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 ); /* * TLSv1.2: * hash = PRF( master, finished_label, * Hash( handshake ) )[0.11] */ #if !defined(MBEDTLS_SHA512_ALT) MBEDTLS_SSL_DEBUG_BUF( 4, "finished sha512 state", (unsigned char *) sha512.state, sizeof( sha512.state ) ); #endif sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? "client finished" : "server finished"; mbedtls_sha512_finish_ret( &sha512, padbuf ); ssl->handshake->tls_prf( session->master, 48, sender, padbuf, 48, buf, len ); MBEDTLS_SSL_DEBUG_BUF( 3, "calc finished result", buf, len ); mbedtls_sha512_free( &sha512 ); mbedtls_platform_zeroize( padbuf, sizeof( padbuf ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= calc finished" ) ); } #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ static void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup: final free" ) ); /* * Free our handshake params */ mbedtls_ssl_handshake_free( ssl ); mbedtls_free( ssl->handshake ); ssl->handshake = NULL; /* * Free the previous transform and swith in the current one */ if( ssl->transform ) { mbedtls_ssl_transform_free( ssl->transform ); mbedtls_free( ssl->transform ); } ssl->transform = ssl->transform_negotiate; ssl->transform_negotiate = NULL; MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup: final free" ) ); } void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl ) { int resume = ssl->handshake->resume; MBEDTLS_SSL_DEBUG_MSG( 3, ( "=> handshake wrapup" ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_DONE; ssl->renego_records_seen = 0; } #endif /* * Free the previous session and switch in the current one */ if( ssl->session ) { #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) /* RFC 7366 3.1: keep the EtM state */ ssl->session_negotiate->encrypt_then_mac = ssl->session->encrypt_then_mac; #endif mbedtls_ssl_session_free( ssl->session ); mbedtls_free( ssl->session ); } ssl->session = ssl->session_negotiate; ssl->session_negotiate = NULL; /* * Add cache entry */ if( ssl->conf->f_set_cache != NULL && ssl->session->id_len != 0 && resume == 0 ) { if( ssl->conf->f_set_cache( ssl->conf->p_cache, ssl->session ) != 0 ) MBEDTLS_SSL_DEBUG_MSG( 1, ( "cache did not store session" ) ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->flight != NULL ) { /* Cancel handshake timer */ ssl_set_timer( ssl, 0 ); /* Keep last flight around in case we need to resend it: * we need the handshake and transform structures for that */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip freeing handshake and transform" ) ); } else #endif ssl_handshake_wrapup_free_hs_transform( ssl ); ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 3, ( "<= handshake wrapup" ) ); } int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl ) { int ret, hash_len; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write finished" ) ); ssl_update_out_pointers( ssl, ssl->transform_negotiate ); ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint ); /* * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites * may define some other value. Currently (early 2016), no defined * ciphersuite does this (and this is unlikely to change as activity has * moved to TLS 1.3 now) so we can keep the hardcoded 12 here. */ hash_len = ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) ? 36 : 12; #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->verify_data_len = hash_len; memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len ); #endif ssl->out_msglen = 4 + hash_len; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_FINISHED; /* * In case of session resuming, invert the client and server * ChangeCipherSpec messages order. */ if( ssl->handshake->resume != 0 ) { #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; #endif #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC; #endif } else ssl->state++; /* * Switch to our negotiated transform and session parameters for outbound * data. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "switching to new transform spec for outbound data" ) ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { unsigned char i; /* Remember current epoch settings for resending */ ssl->handshake->alt_transform_out = ssl->transform_out; memcpy( ssl->handshake->alt_out_ctr, ssl->cur_out_ctr, 8 ); /* Set sequence_number to zero */ memset( ssl->cur_out_ctr + 2, 0, 6 ); /* Increment epoch */ for( i = 2; i > 0; i-- ) if( ++ssl->cur_out_ctr[i - 1] != 0 ) break; /* The loop goes to its end iff the counter is wrapping */ if( i == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "DTLS epoch would wrap" ) ); return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING ); } } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ memset( ssl->cur_out_ctr, 0, 8 ); ssl->transform_out = ssl->transform_negotiate; ssl->session_out = ssl->session_negotiate; #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_activate != NULL ) { if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_activate", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_send_flight_completed( ssl ); #endif if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret ); return( ret ); } #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write finished" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_SSL3) #define SSL_MAX_HASH_LEN 36 #else #define SSL_MAX_HASH_LEN 12 #endif int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ) { int ret; unsigned int hash_len; unsigned char buf[SSL_MAX_HASH_LEN]; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse finished" ) ); ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 ); if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } /* There is currently no ciphersuite using another length with TLS 1.2 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) hash_len = 36; else #endif hash_len = 12; if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED || ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED ); } if( mbedtls_ssl_safer_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), buf, hash_len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad finished message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED ); } #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->verify_data_len = hash_len; memcpy( ssl->peer_verify_data, buf, hash_len ); #endif if( ssl->handshake->resume != 0 ) { #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC; #endif #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; #endif } else ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_recv_flight_completed( ssl ); #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse finished" ) ); return( 0 ); } static void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake ) { memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) ); #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_init( &handshake->fin_md5 ); mbedtls_sha1_init( &handshake->fin_sha1 ); mbedtls_md5_starts_ret( &handshake->fin_md5 ); mbedtls_sha1_starts_ret( &handshake->fin_sha1 ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_init( &handshake->fin_sha256 ); mbedtls_sha256_starts_ret( &handshake->fin_sha256, 0 ); #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_init( &handshake->fin_sha512 ); mbedtls_sha512_starts_ret( &handshake->fin_sha512, 1 ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ handshake->update_checksum = ssl_update_checksum_start; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) mbedtls_ssl_sig_hash_set_init( &handshake->hash_algs ); #endif #if defined(MBEDTLS_DHM_C) mbedtls_dhm_init( &handshake->dhm_ctx ); #endif #if defined(MBEDTLS_ECDH_C) mbedtls_ecdh_init( &handshake->ecdh_ctx ); #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) mbedtls_ecjpake_init( &handshake->ecjpake_ctx ); #if defined(MBEDTLS_SSL_CLI_C) handshake->ecjpake_cache = NULL; handshake->ecjpake_cache_len = 0; #endif #endif #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) mbedtls_x509_crt_restart_init( &handshake->ecrs_ctx ); #endif #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET; #endif } static void ssl_transform_init( mbedtls_ssl_transform *transform ) { memset( transform, 0, sizeof(mbedtls_ssl_transform) ); mbedtls_cipher_init( &transform->cipher_ctx_enc ); mbedtls_cipher_init( &transform->cipher_ctx_dec ); mbedtls_md_init( &transform->md_ctx_enc ); mbedtls_md_init( &transform->md_ctx_dec ); } void mbedtls_ssl_session_init( mbedtls_ssl_session *session ) { memset( session, 0, sizeof(mbedtls_ssl_session) ); } static int ssl_handshake_init( mbedtls_ssl_context *ssl ) { /* Clear old handshake information if present */ if( ssl->transform_negotiate ) mbedtls_ssl_transform_free( ssl->transform_negotiate ); if( ssl->session_negotiate ) mbedtls_ssl_session_free( ssl->session_negotiate ); if( ssl->handshake ) mbedtls_ssl_handshake_free( ssl ); /* * Either the pointers are now NULL or cleared properly and can be freed. * Now allocate missing structures. */ if( ssl->transform_negotiate == NULL ) { ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) ); } if( ssl->session_negotiate == NULL ) { ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) ); } if( ssl->handshake == NULL ) { ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) ); } /* All pointers should exist and can be directly freed without issue */ if( ssl->handshake == NULL || ssl->transform_negotiate == NULL || ssl->session_negotiate == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc() of ssl sub-contexts failed" ) ); mbedtls_free( ssl->handshake ); mbedtls_free( ssl->transform_negotiate ); mbedtls_free( ssl->session_negotiate ); ssl->handshake = NULL; ssl->transform_negotiate = NULL; ssl->session_negotiate = NULL; return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } /* Initialize structures */ mbedtls_ssl_session_init( ssl->session_negotiate ); ssl_transform_init( ssl->transform_negotiate ); ssl_handshake_params_init( ssl->handshake ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->handshake->alt_transform_out = ssl->transform_out; if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING; else ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING; ssl_set_timer( ssl, 0 ); } #endif return( 0 ); } #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) /* Dummy cookie callbacks for defaults */ static int ssl_cookie_write_dummy( void *ctx, unsigned char **p, unsigned char *end, const unsigned char *cli_id, size_t cli_id_len ) { ((void) ctx); ((void) p); ((void) end); ((void) cli_id); ((void) cli_id_len); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } static int ssl_cookie_check_dummy( void *ctx, const unsigned char *cookie, size_t cookie_len, const unsigned char *cli_id, size_t cli_id_len ) { ((void) ctx); ((void) cookie); ((void) cookie_len); ((void) cli_id); ((void) cli_id_len); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ /* Once ssl->out_hdr as the address of the beginning of the * next outgoing record is set, deduce the other pointers. * * Note: For TLS, we save the implicit record sequence number * (entering MAC computation) in the 8 bytes before ssl->out_hdr, * and the caller has to make sure there's space for this. */ static void ssl_update_out_pointers( mbedtls_ssl_context *ssl, mbedtls_ssl_transform *transform ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->out_ctr = ssl->out_hdr + 3; ssl->out_len = ssl->out_hdr + 11; ssl->out_iv = ssl->out_hdr + 13; } else #endif { ssl->out_ctr = ssl->out_hdr - 8; ssl->out_len = ssl->out_hdr + 3; ssl->out_iv = ssl->out_hdr + 5; } /* Adjust out_msg to make space for explicit IV, if used. */ if( transform != NULL && ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) { ssl->out_msg = ssl->out_iv + transform->ivlen - transform->fixed_ivlen; } else ssl->out_msg = ssl->out_iv; } /* Once ssl->in_hdr as the address of the beginning of the * next incoming record is set, deduce the other pointers. * * Note: For TLS, we save the implicit record sequence number * (entering MAC computation) in the 8 bytes before ssl->in_hdr, * and the caller has to make sure there's space for this. */ static void ssl_update_in_pointers( mbedtls_ssl_context *ssl, mbedtls_ssl_transform *transform ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->in_ctr = ssl->in_hdr + 3; ssl->in_len = ssl->in_hdr + 11; ssl->in_iv = ssl->in_hdr + 13; } else #endif { ssl->in_ctr = ssl->in_hdr - 8; ssl->in_len = ssl->in_hdr + 3; ssl->in_iv = ssl->in_hdr + 5; } /* Offset in_msg from in_iv to allow space for explicit IV, if used. */ if( transform != NULL && ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) { ssl->in_msg = ssl->in_iv + transform->ivlen - transform->fixed_ivlen; } else ssl->in_msg = ssl->in_iv; } /* * Initialize an SSL context */ void mbedtls_ssl_init( mbedtls_ssl_context *ssl ) { memset( ssl, 0, sizeof( mbedtls_ssl_context ) ); } /* * Setup an SSL context */ static void ssl_reset_in_out_pointers( mbedtls_ssl_context *ssl ) { /* Set the incoming and outgoing record pointers. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { ssl->out_hdr = ssl->out_buf; ssl->in_hdr = ssl->in_buf; } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ { ssl->out_hdr = ssl->out_buf + 8; ssl->in_hdr = ssl->in_buf + 8; } /* Derive other internal pointers. */ ssl_update_out_pointers( ssl, NULL /* no transform enabled */ ); ssl_update_in_pointers ( ssl, NULL /* no transform enabled */ ); } int mbedtls_ssl_setup( mbedtls_ssl_context *ssl, const mbedtls_ssl_config *conf ) { int ret; ssl->conf = conf; /* * Prepare base structures */ /* Set to NULL in case of an error condition */ ssl->out_buf = NULL; ssl->in_buf = mbedtls_calloc( 1, MBEDTLS_SSL_IN_BUFFER_LEN ); if( ssl->in_buf == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", MBEDTLS_SSL_IN_BUFFER_LEN) ); ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; goto error; } ssl->out_buf = mbedtls_calloc( 1, MBEDTLS_SSL_OUT_BUFFER_LEN ); if( ssl->out_buf == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "alloc(%d bytes) failed", MBEDTLS_SSL_OUT_BUFFER_LEN) ); ret = MBEDTLS_ERR_SSL_ALLOC_FAILED; goto error; } ssl_reset_in_out_pointers( ssl ); if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) goto error; return( 0 ); error: mbedtls_free( ssl->in_buf ); mbedtls_free( ssl->out_buf ); ssl->conf = NULL; ssl->in_buf = NULL; ssl->out_buf = NULL; ssl->in_hdr = NULL; ssl->in_ctr = NULL; ssl->in_len = NULL; ssl->in_iv = NULL; ssl->in_msg = NULL; ssl->out_hdr = NULL; ssl->out_ctr = NULL; ssl->out_len = NULL; ssl->out_iv = NULL; ssl->out_msg = NULL; return( ret ); } /* * Reset an initialized and used SSL context for re-use while retaining * all application-set variables, function pointers and data. * * If partial is non-zero, keep data in the input buffer and client ID. * (Use when a DTLS client reconnects from the same port.) */ static int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial ) { int ret; #if !defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) || \ !defined(MBEDTLS_SSL_SRV_C) ((void) partial); #endif ssl->state = MBEDTLS_SSL_HELLO_REQUEST; /* Cancel any possibly running timer */ ssl_set_timer( ssl, 0 ); #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE; ssl->renego_records_seen = 0; ssl->verify_data_len = 0; memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN ); memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN ); #endif ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION; ssl->in_offt = NULL; ssl_reset_in_out_pointers( ssl ); ssl->in_msgtype = 0; ssl->in_msglen = 0; #if defined(MBEDTLS_SSL_PROTO_DTLS) ssl->next_record_offset = 0; ssl->in_epoch = 0; #endif #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) ssl_dtls_replay_reset( ssl ); #endif ssl->in_hslen = 0; ssl->nb_zero = 0; ssl->keep_current_message = 0; ssl->out_msgtype = 0; ssl->out_msglen = 0; ssl->out_left = 0; #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) if( ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED ) ssl->split_done = 0; #endif memset( ssl->cur_out_ctr, 0, sizeof( ssl->cur_out_ctr ) ); ssl->transform_in = NULL; ssl->transform_out = NULL; ssl->session_in = NULL; ssl->session_out = NULL; memset( ssl->out_buf, 0, MBEDTLS_SSL_OUT_BUFFER_LEN ); #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) if( partial == 0 ) #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ { ssl->in_left = 0; memset( ssl->in_buf, 0, MBEDTLS_SSL_IN_BUFFER_LEN ); } #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_reset != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_reset()" ) ); if( ( ret = mbedtls_ssl_hw_record_reset( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_hw_record_reset", ret ); return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED ); } } #endif if( ssl->transform ) { mbedtls_ssl_transform_free( ssl->transform ); mbedtls_free( ssl->transform ); ssl->transform = NULL; } if( ssl->session ) { mbedtls_ssl_session_free( ssl->session ); mbedtls_free( ssl->session ); ssl->session = NULL; } #if defined(MBEDTLS_SSL_ALPN) ssl->alpn_chosen = NULL; #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) if( partial == 0 ) #endif { mbedtls_free( ssl->cli_id ); ssl->cli_id = NULL; ssl->cli_id_len = 0; } #endif if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) return( ret ); return( 0 ); } /* * Reset an initialized and used SSL context for re-use while retaining * all application-set variables, function pointers and data. */ int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl ) { return( ssl_session_reset_int( ssl, 0 ) ); } /* * SSL set accessors */ void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint ) { conf->endpoint = endpoint; } void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport ) { conf->transport = transport; } #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ) { conf->anti_replay = mode; } #endif #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit ) { conf->badmac_limit = limit; } #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) void mbedtls_ssl_set_datagram_packing( mbedtls_ssl_context *ssl, unsigned allow_packing ) { ssl->disable_datagram_packing = !allow_packing; } void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max ) { conf->hs_timeout_min = min; conf->hs_timeout_max = max; } #endif void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode ) { conf->authmode = authmode; } #if defined(MBEDTLS_X509_CRT_PARSE_C) void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf, int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), void *p_vrfy ) { conf->f_vrfy = f_vrfy; conf->p_vrfy = p_vrfy; } #endif /* MBEDTLS_X509_CRT_PARSE_C */ void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { conf->f_rng = f_rng; conf->p_rng = p_rng; } void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf, void (*f_dbg)(void *, int, const char *, int, const char *), void *p_dbg ) { conf->f_dbg = f_dbg; conf->p_dbg = p_dbg; } void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl, void *p_bio, mbedtls_ssl_send_t *f_send, mbedtls_ssl_recv_t *f_recv, mbedtls_ssl_recv_timeout_t *f_recv_timeout ) { ssl->p_bio = p_bio; ssl->f_send = f_send; ssl->f_recv = f_recv; ssl->f_recv_timeout = f_recv_timeout; } #if defined(MBEDTLS_SSL_PROTO_DTLS) void mbedtls_ssl_set_mtu( mbedtls_ssl_context *ssl, uint16_t mtu ) { ssl->mtu = mtu; } #endif void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout ) { conf->read_timeout = timeout; } void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl, void *p_timer, mbedtls_ssl_set_timer_t *f_set_timer, mbedtls_ssl_get_timer_t *f_get_timer ) { ssl->p_timer = p_timer; ssl->f_set_timer = f_set_timer; ssl->f_get_timer = f_get_timer; /* Make sure we start with no timer running */ ssl_set_timer( ssl, 0 ); } #if defined(MBEDTLS_SSL_SRV_C) void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf, void *p_cache, int (*f_get_cache)(void *, mbedtls_ssl_session *), int (*f_set_cache)(void *, const mbedtls_ssl_session *) ) { conf->p_cache = p_cache; conf->f_get_cache = f_get_cache; conf->f_set_cache = f_set_cache; } #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_CLI_C) int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session ) { int ret; if( ssl == NULL || session == NULL || ssl->session_negotiate == NULL || ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 ) return( ret ); ssl->handshake->resume = 1; return( 0 ); } #endif /* MBEDTLS_SSL_CLI_C */ void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf, const int *ciphersuites ) { conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites; conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites; conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites; conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites; } void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf, const int *ciphersuites, int major, int minor ) { if( major != MBEDTLS_SSL_MAJOR_VERSION_3 ) return; if( minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3 ) return; conf->ciphersuite_list[minor] = ciphersuites; } #if defined(MBEDTLS_X509_CRT_PARSE_C) void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf, const mbedtls_x509_crt_profile *profile ) { conf->cert_profile = profile; } /* Append a new keycert entry to a (possibly empty) list */ static int ssl_append_key_cert( mbedtls_ssl_key_cert **head, mbedtls_x509_crt *cert, mbedtls_pk_context *key ) { mbedtls_ssl_key_cert *new_cert; new_cert = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) ); if( new_cert == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); new_cert->cert = cert; new_cert->key = key; new_cert->next = NULL; /* Update head is the list was null, else add to the end */ if( *head == NULL ) { *head = new_cert; } else { mbedtls_ssl_key_cert *cur = *head; while( cur->next != NULL ) cur = cur->next; cur->next = new_cert; } return( 0 ); } int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf, mbedtls_x509_crt *own_cert, mbedtls_pk_context *pk_key ) { return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) ); } void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf, mbedtls_x509_crt *ca_chain, mbedtls_x509_crl *ca_crl ) { conf->ca_chain = ca_chain; conf->ca_crl = ca_crl; } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl, mbedtls_x509_crt *own_cert, mbedtls_pk_context *pk_key ) { return( ssl_append_key_cert( &ssl->handshake->sni_key_cert, own_cert, pk_key ) ); } void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl, mbedtls_x509_crt *ca_chain, mbedtls_x509_crl *ca_crl ) { ssl->handshake->sni_ca_chain = ca_chain; ssl->handshake->sni_ca_crl = ca_crl; } void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl, int authmode ) { ssl->handshake->sni_authmode = authmode; } #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) /* * Set EC J-PAKE password for current handshake */ int mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl, const unsigned char *pw, size_t pw_len ) { mbedtls_ecjpake_role role; if( ssl->handshake == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) role = MBEDTLS_ECJPAKE_SERVER; else role = MBEDTLS_ECJPAKE_CLIENT; return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx, role, MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, pw, pw_len ) ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf, const unsigned char *psk, size_t psk_len, const unsigned char *psk_identity, size_t psk_identity_len ) { if( psk == NULL || psk_identity == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( psk_len > MBEDTLS_PSK_MAX_LEN ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); /* Identity len will be encoded on two bytes */ if( ( psk_identity_len >> 16 ) != 0 || psk_identity_len > MBEDTLS_SSL_OUT_CONTENT_LEN ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } if( conf->psk != NULL ) { mbedtls_platform_zeroize( conf->psk, conf->psk_len ); mbedtls_free( conf->psk ); conf->psk = NULL; conf->psk_len = 0; } if( conf->psk_identity != NULL ) { mbedtls_free( conf->psk_identity ); conf->psk_identity = NULL; conf->psk_identity_len = 0; } if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL || ( conf->psk_identity = mbedtls_calloc( 1, psk_identity_len ) ) == NULL ) { mbedtls_free( conf->psk ); mbedtls_free( conf->psk_identity ); conf->psk = NULL; conf->psk_identity = NULL; return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } conf->psk_len = psk_len; conf->psk_identity_len = psk_identity_len; memcpy( conf->psk, psk, conf->psk_len ); memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len ); return( 0 ); } int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl, const unsigned char *psk, size_t psk_len ) { if( psk == NULL || ssl->handshake == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( psk_len > MBEDTLS_PSK_MAX_LEN ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( ssl->handshake->psk != NULL ) { mbedtls_platform_zeroize( ssl->handshake->psk, ssl->handshake->psk_len ); mbedtls_free( ssl->handshake->psk ); ssl->handshake->psk_len = 0; } if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); ssl->handshake->psk_len = psk_len; memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len ); return( 0 ); } void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf, int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t), void *p_psk ) { conf->f_psk = f_psk; conf->p_psk = p_psk; } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) #if !defined(MBEDTLS_DEPRECATED_REMOVED) int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G ) { int ret; if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P, 16, dhm_P ) ) != 0 || ( ret = mbedtls_mpi_read_string( &conf->dhm_G, 16, dhm_G ) ) != 0 ) { mbedtls_mpi_free( &conf->dhm_P ); mbedtls_mpi_free( &conf->dhm_G ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_DEPRECATED_REMOVED */ int mbedtls_ssl_conf_dh_param_bin( mbedtls_ssl_config *conf, const unsigned char *dhm_P, size_t P_len, const unsigned char *dhm_G, size_t G_len ) { int ret; if( ( ret = mbedtls_mpi_read_binary( &conf->dhm_P, dhm_P, P_len ) ) != 0 || ( ret = mbedtls_mpi_read_binary( &conf->dhm_G, dhm_G, G_len ) ) != 0 ) { mbedtls_mpi_free( &conf->dhm_P ); mbedtls_mpi_free( &conf->dhm_G ); return( ret ); } return( 0 ); } int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx ) { int ret; if( ( ret = mbedtls_mpi_copy( &conf->dhm_P, &dhm_ctx->P ) ) != 0 || ( ret = mbedtls_mpi_copy( &conf->dhm_G, &dhm_ctx->G ) ) != 0 ) { mbedtls_mpi_free( &conf->dhm_P ); mbedtls_mpi_free( &conf->dhm_G ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) /* * Set the minimum length for Diffie-Hellman parameters */ void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf, unsigned int bitlen ) { conf->dhm_min_bitlen = bitlen; } #endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Set allowed/preferred hashes for handshake signatures */ void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf, const int *hashes ) { conf->sig_hashes = hashes; } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_ECP_C) /* * Set the allowed elliptic curves */ void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf, const mbedtls_ecp_group_id *curve_list ) { conf->curve_list = curve_list; } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_X509_CRT_PARSE_C) int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname ) { /* Initialize to suppress unnecessary compiler warning */ size_t hostname_len = 0; /* Check if new hostname is valid before * making any change to current one */ if( hostname != NULL ) { hostname_len = strlen( hostname ); if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* Now it's clear that we will overwrite the old hostname, * so we can free it safely */ if( ssl->hostname != NULL ) { mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) ); mbedtls_free( ssl->hostname ); } /* Passing NULL as hostname shall clear the old one */ if( hostname == NULL ) { ssl->hostname = NULL; } else { ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 ); if( ssl->hostname == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); memcpy( ssl->hostname, hostname, hostname_len ); ssl->hostname[hostname_len] = '\0'; } return( 0 ); } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf, int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t), void *p_sni ) { conf->f_sni = f_sni; conf->p_sni = p_sni; } #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_SSL_ALPN) int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos ) { size_t cur_len, tot_len; const char **p; /* * RFC 7301 3.1: "Empty strings MUST NOT be included and byte strings * MUST NOT be truncated." * We check lengths now rather than later. */ tot_len = 0; for( p = protos; *p != NULL; p++ ) { cur_len = strlen( *p ); tot_len += cur_len; if( cur_len == 0 || cur_len > 255 || tot_len > 65535 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } conf->alpn_list = protos; return( 0 ); } const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl ) { return( ssl->alpn_chosen ); } #endif /* MBEDTLS_SSL_ALPN */ void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor ) { conf->max_major_ver = major; conf->max_minor_ver = minor; } void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor ) { conf->min_major_ver = major; conf->min_minor_ver = minor; } #if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback ) { conf->fallback = fallback; } #endif #if defined(MBEDTLS_SSL_SRV_C) void mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf, char cert_req_ca_list ) { conf->cert_req_ca_list = cert_req_ca_list; } #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm ) { conf->encrypt_then_mac = etm; } #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems ) { conf->extended_ms = ems; } #endif #if defined(MBEDTLS_ARC4_C) void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 ) { conf->arc4_disabled = arc4; } #endif #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code ) { if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID || ssl_mfl_code_to_length( mfl_code ) > MBEDTLS_TLS_EXT_ADV_CONTENT_LEN ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } conf->mfl_code = mfl_code; return( 0 ); } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate ) { conf->trunc_hmac = truncate; } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split ) { conf->cbc_record_splitting = split; } #endif void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy ) { conf->allow_legacy_renegotiation = allow_legacy; } #if defined(MBEDTLS_SSL_RENEGOTIATION) void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation ) { conf->disable_renegotiation = renegotiation; } void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records ) { conf->renego_max_records = max_records; } void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf, const unsigned char period[8] ) { memcpy( conf->renego_period, period, 8 ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) #if defined(MBEDTLS_SSL_CLI_C) void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets ) { conf->session_tickets = use_tickets; } #endif #if defined(MBEDTLS_SSL_SRV_C) void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf, mbedtls_ssl_ticket_write_t *f_ticket_write, mbedtls_ssl_ticket_parse_t *f_ticket_parse, void *p_ticket ) { conf->f_ticket_write = f_ticket_write; conf->f_ticket_parse = f_ticket_parse; conf->p_ticket = p_ticket; } #endif #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) void mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf, mbedtls_ssl_export_keys_t *f_export_keys, void *p_export_keys ) { conf->f_export_keys = f_export_keys; conf->p_export_keys = p_export_keys; } #endif #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) void mbedtls_ssl_conf_async_private_cb( mbedtls_ssl_config *conf, mbedtls_ssl_async_sign_t *f_async_sign, mbedtls_ssl_async_decrypt_t *f_async_decrypt, mbedtls_ssl_async_resume_t *f_async_resume, mbedtls_ssl_async_cancel_t *f_async_cancel, void *async_config_data ) { conf->f_async_sign_start = f_async_sign; conf->f_async_decrypt_start = f_async_decrypt; conf->f_async_resume = f_async_resume; conf->f_async_cancel = f_async_cancel; conf->p_async_config_data = async_config_data; } void *mbedtls_ssl_conf_get_async_config_data( const mbedtls_ssl_config *conf ) { return( conf->p_async_config_data ); } void *mbedtls_ssl_get_async_operation_data( const mbedtls_ssl_context *ssl ) { if( ssl->handshake == NULL ) return( NULL ); else return( ssl->handshake->user_async_ctx ); } void mbedtls_ssl_set_async_operation_data( mbedtls_ssl_context *ssl, void *ctx ) { if( ssl->handshake != NULL ) ssl->handshake->user_async_ctx = ctx; } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ /* * SSL get accessors */ size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl ) { return( ssl->in_offt == NULL ? 0 : ssl->in_msglen ); } int mbedtls_ssl_check_pending( const mbedtls_ssl_context *ssl ) { /* * Case A: We're currently holding back * a message for further processing. */ if( ssl->keep_current_message == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: record held back for processing" ) ); return( 1 ); } /* * Case B: Further records are pending in the current datagram. */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->in_left > ssl->next_record_offset ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: more records within current datagram" ) ); return( 1 ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ /* * Case C: A handshake message is being processed. */ if( ssl->in_hslen > 0 && ssl->in_hslen < ssl->in_msglen ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: more handshake messages within current record" ) ); return( 1 ); } /* * Case D: An application data message is being processed */ if( ssl->in_offt != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: application data record is being processed" ) ); return( 1 ); } /* * In all other cases, the rest of the message can be dropped. * As in ssl_get_next_record, this needs to be adapted if * we implement support for multiple alerts in single records. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "ssl_check_pending: nothing pending" ) ); return( 0 ); } uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl ) { if( ssl->session != NULL ) return( ssl->session->verify_result ); if( ssl->session_negotiate != NULL ) return( ssl->session_negotiate->verify_result ); return( 0xFFFFFFFF ); } const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl ) { if( ssl == NULL || ssl->session == NULL ) return( NULL ); return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite ); } const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { switch( ssl->minor_ver ) { case MBEDTLS_SSL_MINOR_VERSION_2: return( "DTLSv1.0" ); case MBEDTLS_SSL_MINOR_VERSION_3: return( "DTLSv1.2" ); default: return( "unknown (DTLS)" ); } } #endif switch( ssl->minor_ver ) { case MBEDTLS_SSL_MINOR_VERSION_0: return( "SSLv3.0" ); case MBEDTLS_SSL_MINOR_VERSION_1: return( "TLSv1.0" ); case MBEDTLS_SSL_MINOR_VERSION_2: return( "TLSv1.1" ); case MBEDTLS_SSL_MINOR_VERSION_3: return( "TLSv1.2" ); default: return( "unknown" ); } } int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl ) { size_t transform_expansion = 0; const mbedtls_ssl_transform *transform = ssl->transform_out; unsigned block_size; if( transform == NULL ) return( (int) mbedtls_ssl_hdr_len( ssl ) ); #if defined(MBEDTLS_ZLIB_SUPPORT) if( ssl->session_out->compression != MBEDTLS_SSL_COMPRESS_NULL ) return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); #endif switch( mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_enc ) ) { case MBEDTLS_MODE_GCM: case MBEDTLS_MODE_CCM: case MBEDTLS_MODE_CHACHAPOLY: case MBEDTLS_MODE_STREAM: transform_expansion = transform->minlen; break; case MBEDTLS_MODE_CBC: block_size = mbedtls_cipher_get_block_size( &transform->cipher_ctx_enc ); /* Expansion due to the addition of the MAC. */ transform_expansion += transform->maclen; /* Expansion due to the addition of CBC padding; * Theoretically up to 256 bytes, but we never use * more than the block size of the underlying cipher. */ transform_expansion += block_size; /* For TLS 1.1 or higher, an explicit IV is added * after the record header. */ #if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 ) transform_expansion += block_size; #endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ break; default: MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } return( (int)( mbedtls_ssl_hdr_len( ssl ) + transform_expansion ) ); } #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl ) { size_t max_len; /* * Assume mfl_code is correct since it was checked when set */ max_len = ssl_mfl_code_to_length( ssl->conf->mfl_code ); /* Check if a smaller max length was negotiated */ if( ssl->session_out != NULL && ssl_mfl_code_to_length( ssl->session_out->mfl_code ) < max_len ) { max_len = ssl_mfl_code_to_length( ssl->session_out->mfl_code ); } /* During a handshake, use the value being negotiated */ if( ssl->session_negotiate != NULL && ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ) < max_len ) { max_len = ssl_mfl_code_to_length( ssl->session_negotiate->mfl_code ); } return( max_len ); } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_PROTO_DTLS) static size_t ssl_get_current_mtu( const mbedtls_ssl_context *ssl ) { /* Return unlimited mtu for client hello messages to avoid fragmentation. */ if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && ( ssl->state == MBEDTLS_SSL_CLIENT_HELLO || ssl->state == MBEDTLS_SSL_SERVER_HELLO ) ) return ( 0 ); if( ssl->handshake == NULL || ssl->handshake->mtu == 0 ) return( ssl->mtu ); if( ssl->mtu == 0 ) return( ssl->handshake->mtu ); return( ssl->mtu < ssl->handshake->mtu ? ssl->mtu : ssl->handshake->mtu ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ int mbedtls_ssl_get_max_out_record_payload( const mbedtls_ssl_context *ssl ) { size_t max_len = MBEDTLS_SSL_OUT_CONTENT_LEN; #if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \ !defined(MBEDTLS_SSL_PROTO_DTLS) (void) ssl; #endif #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) const size_t mfl = mbedtls_ssl_get_max_frag_len( ssl ); if( max_len > mfl ) max_len = mfl; #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl_get_current_mtu( ssl ) != 0 ) { const size_t mtu = ssl_get_current_mtu( ssl ); const int ret = mbedtls_ssl_get_record_expansion( ssl ); const size_t overhead = (size_t) ret; if( ret < 0 ) return( ret ); if( mtu <= overhead ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "MTU too low for record expansion" ) ); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } if( max_len > mtu - overhead ) max_len = mtu - overhead; } #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if !defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) && \ !defined(MBEDTLS_SSL_PROTO_DTLS) ((void) ssl); #endif return( (int) max_len ); } #if defined(MBEDTLS_X509_CRT_PARSE_C) const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl ) { if( ssl == NULL || ssl->session == NULL ) return( NULL ); return( ssl->session->peer_cert ); } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_CLI_C) int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *dst ) { if( ssl == NULL || dst == NULL || ssl->session == NULL || ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } return( ssl_session_copy( dst, ssl->session ) ); } #endif /* MBEDTLS_SSL_CLI_C */ /* * Perform a single step of the SSL handshake */ int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) ret = mbedtls_ssl_handshake_client_step( ssl ); #endif #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) ret = mbedtls_ssl_handshake_server_step( ssl ); #endif return( ret ); } /* * Perform the SSL handshake */ int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl ) { int ret = 0; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> handshake" ) ); while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) { ret = mbedtls_ssl_handshake_step( ssl ); if( ret != 0 ) break; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= handshake" ) ); return( ret ); } #if defined(MBEDTLS_SSL_RENEGOTIATION) #if defined(MBEDTLS_SSL_SRV_C) /* * Write HelloRequest to request renegotiation on server */ static int ssl_write_hello_request( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello request" ) ); ssl->out_msglen = 4; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_REQUEST; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello request" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_SRV_C */ /* * Actually renegotiate current connection, triggered by either: * - any side: calling mbedtls_ssl_renegotiate(), * - client: receiving a HelloRequest during mbedtls_ssl_read(), * - server: receiving any handshake message on server during mbedtls_ssl_read() after * the initial handshake is completed. * If the handshake doesn't complete due to waiting for I/O, it will continue * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively. */ static int ssl_start_renegotiation( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> renegotiate" ) ); if( ( ret = ssl_handshake_init( ssl ) ) != 0 ) return( ret ); /* RFC 6347 4.2.2: "[...] the HelloRequest will have message_seq = 0 and * the ServerHello will have message_seq = 1" */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) { if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) ssl->handshake->out_msg_seq = 1; else ssl->handshake->in_msg_seq = 1; } #endif ssl->state = MBEDTLS_SSL_HELLO_REQUEST; ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS; if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= renegotiate" ) ); return( 0 ); } /* * Renegotiate current connection on client, * or request renegotiation on server */ int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); #if defined(MBEDTLS_SSL_SRV_C) /* On server, just send the request */ if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER ) { if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING; /* Did we already try/start sending HelloRequest? */ if( ssl->out_left != 0 ) return( mbedtls_ssl_flush_output( ssl ) ); return( ssl_write_hello_request( ssl ) ); } #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_CLI_C) /* * On client, either start the renegotiation process or, * if already in progress, continue the handshake */ if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( ( ret = ssl_start_renegotiation( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret ); return( ret ); } } else { if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); return( ret ); } } #endif /* MBEDTLS_SSL_CLI_C */ return( ret ); } /* * Check record counters and renegotiate if they're above the limit. */ static int ssl_check_ctr_renegotiate( mbedtls_ssl_context *ssl ) { size_t ep_len = ssl_ep_len( ssl ); int in_ctr_cmp; int out_ctr_cmp; if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER || ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING || ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED ) { return( 0 ); } in_ctr_cmp = memcmp( ssl->in_ctr + ep_len, ssl->conf->renego_period + ep_len, 8 - ep_len ); out_ctr_cmp = memcmp( ssl->cur_out_ctr + ep_len, ssl->conf->renego_period + ep_len, 8 - ep_len ); if( in_ctr_cmp <= 0 && out_ctr_cmp <= 0 ) { return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "record counter limit reached: renegotiate" ) ); return( mbedtls_ssl_renegotiate( ssl ) ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ /* * Receive application data decrypted from the SSL layer */ int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len ) { int ret; size_t n; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> read" ) ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); if( ssl->handshake != NULL && ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) { if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) return( ret ); } } #endif /* * Check if renegotiation is necessary and/or handshake is * in process. If yes, perform/continue, and fall through * if an unexpected packet is received while the client * is waiting for the ServerHello. * * (There is no equivalent to the last condition on * the server-side as it is not treated as within * a handshake while waiting for the ClientHello * after a renegotiation request.) */ #if defined(MBEDTLS_SSL_RENEGOTIATION) ret = ssl_check_ctr_renegotiate( ssl ); if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret ); return( ret ); } #endif if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) { ret = mbedtls_ssl_handshake( ssl ); if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); return( ret ); } } /* Loop as long as no application data record is available */ while( ssl->in_offt == NULL ) { /* Start timer if not already running */ if( ssl->f_get_timer != NULL && ssl->f_get_timer( ssl->p_timer ) == -1 ) { ssl_set_timer( ssl, ssl->conf->read_timeout ); } if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { if( ret == MBEDTLS_ERR_SSL_CONN_EOF ) return( 0 ); MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } if( ssl->in_msglen == 0 && ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA ) { /* * OpenSSL sends empty messages to randomize the IV */ if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { if( ret == MBEDTLS_ERR_SSL_CONN_EOF ) return( 0 ); MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } } if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "received handshake message" ) ); /* * - For client-side, expect SERVER_HELLO_REQUEST. * - For server-side, expect CLIENT_HELLO. * - Fail (TLS) or silently drop record (DTLS) in other cases. */ #if defined(MBEDTLS_SSL_CLI_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT && ( ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST || ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not HelloRequest)" ) ); /* With DTLS, drop the packet (probably from last handshake) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { continue; } #endif return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_SRV_C) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "handshake received (not ClientHello)" ) ); /* With DTLS, drop the packet (probably from last handshake) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { continue; } #endif return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_RENEGOTIATION) /* Determine whether renegotiation attempt should be accepted */ if( ! ( ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED || ( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) ) ) { /* * Accept renegotiation request */ /* DTLS clients need to know renego is server-initiated */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ) { ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING; } #endif ret = ssl_start_renegotiation( ssl ); if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO && ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_start_renegotiation", ret ); return( ret ); } } else #endif /* MBEDTLS_SSL_RENEGOTIATION */ { /* * Refuse renegotiation */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "refusing renegotiation, sending alert" ) ); #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { /* SSLv3 does not have a "no_renegotiation" warning, so we send a fatal alert and abort the connection. */ mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 ) { if( ( ret = mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_WARNING, MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 ) { return( ret ); } } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } /* At this point, we don't know whether the renegotiation has been * completed or not. The cases to consider are the following: * 1) The renegotiation is complete. In this case, no new record * has been read yet. * 2) The renegotiation is incomplete because the client received * an application data record while awaiting the ServerHello. * 3) The renegotiation is incomplete because the client received * a non-handshake, non-application data message while awaiting * the ServerHello. * In each of these case, looping will be the proper action: * - For 1), the next iteration will read a new record and check * if it's application data. * - For 2), the loop condition isn't satisfied as application data * is present, hence continue is the same as break * - For 3), the loop condition is satisfied and read_record * will re-deliver the message that was held back by the client * when expecting the ServerHello. */ continue; } #if defined(MBEDTLS_SSL_RENEGOTIATION) else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) { if( ssl->conf->renego_max_records >= 0 ) { if( ++ssl->renego_records_seen > ssl->conf->renego_max_records ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation requested, " "but not honored by client" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } } } #endif /* MBEDTLS_SSL_RENEGOTIATION */ /* Fatal and closure alerts handled by mbedtls_ssl_read_record() */ if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "ignoring non-fatal non-closure alert" ) ); return( MBEDTLS_ERR_SSL_WANT_READ ); } if( ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad application data message" ) ); return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE ); } ssl->in_offt = ssl->in_msg; /* We're going to return something now, cancel timer, * except if handshake (renegotiation) is in progress */ if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) ssl_set_timer( ssl, 0 ); #if defined(MBEDTLS_SSL_PROTO_DTLS) /* If we requested renego but received AppData, resend HelloRequest. * Do it now, after setting in_offt, to avoid taking this branch * again if ssl_write_hello_request() returns WANT_WRITE */ #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER && ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ) { if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_resend_hello_request", ret ); return( ret ); } } #endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */ #endif /* MBEDTLS_SSL_PROTO_DTLS */ } n = ( len < ssl->in_msglen ) ? len : ssl->in_msglen; memcpy( buf, ssl->in_offt, n ); ssl->in_msglen -= n; if( ssl->in_msglen == 0 ) { /* all bytes consumed */ ssl->in_offt = NULL; ssl->keep_current_message = 0; } else { /* more data available */ ssl->in_offt += n; } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= read" ) ); return( (int) n ); } /* * Send application data to be encrypted by the SSL layer, taking care of max * fragment length and buffer size. * * According to RFC 5246 Section 6.2.1: * * Zero-length fragments of Application data MAY be sent as they are * potentially useful as a traffic analysis countermeasure. * * Therefore, it is possible that the input message length is 0 and the * corresponding return code is 0 on success. */ static int ssl_write_real( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret = mbedtls_ssl_get_max_out_record_payload( ssl ); const size_t max_len = (size_t) ret; if( ret < 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_get_max_out_record_payload", ret ); return( ret ); } if( len > max_len ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "fragment larger than the (negotiated) " "maximum fragment length: %d > %d", len, max_len ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } else #endif len = max_len; } if( ssl->out_left != 0 ) { /* * The user has previously tried to send the data and * MBEDTLS_ERR_SSL_WANT_WRITE or the message was only partially * written. In this case, we expect the high-level write function * (e.g. mbedtls_ssl_write()) to be called with the same parameters */ if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flush_output", ret ); return( ret ); } } else { /* * The user is trying to send a message the first time, so we need to * copy the data into the internal buffers and setup the data structure * to keep track of partial writes */ ssl->out_msglen = len; ssl->out_msgtype = MBEDTLS_SSL_MSG_APPLICATION_DATA; memcpy( ssl->out_msg, buf, len ); if( ( ret = mbedtls_ssl_write_record( ssl, SSL_FORCE_FLUSH ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_record", ret ); return( ret ); } } return( (int) len ); } /* * Write application data, doing 1/n-1 splitting if necessary. * * With non-blocking I/O, ssl_write_real() may return WANT_WRITE, * then the caller will call us again with the same arguments, so * remember whether we already did the split or not. */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) static int ssl_write_split( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; if( ssl->conf->cbc_record_splitting == MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED || len <= 1 || ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_1 || mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc ) != MBEDTLS_MODE_CBC ) { return( ssl_write_real( ssl, buf, len ) ); } if( ssl->split_done == 0 ) { if( ( ret = ssl_write_real( ssl, buf, 1 ) ) <= 0 ) return( ret ); ssl->split_done = 1; } if( ( ret = ssl_write_real( ssl, buf + 1, len - 1 ) ) <= 0 ) return( ret ); ssl->split_done = 0; return( ret + 1 ); } #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ /* * Write application data (public-facing wrapper) */ int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write" ) ); if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ( ret = ssl_check_ctr_renegotiate( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_check_ctr_renegotiate", ret ); return( ret ); } #endif if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ) { if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_handshake", ret ); return( ret ); } } #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) ret = ssl_write_split( ssl, buf, len ); #else ret = ssl_write_real( ssl, buf, len ); #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write" ) ); return( ret ); } /* * Notify the peer that the connection is being closed */ int mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl ) { int ret; if( ssl == NULL || ssl->conf == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write close notify" ) ); if( ssl->out_left != 0 ) return( mbedtls_ssl_flush_output( ssl ) ); if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER ) { if( ( ret = mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_WARNING, MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_send_alert_message", ret ); return( ret ); } } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write close notify" ) ); return( 0 ); } void mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform ) { if( transform == NULL ) return; #if defined(MBEDTLS_ZLIB_SUPPORT) deflateEnd( &transform->ctx_deflate ); inflateEnd( &transform->ctx_inflate ); #endif mbedtls_cipher_free( &transform->cipher_ctx_enc ); mbedtls_cipher_free( &transform->cipher_ctx_dec ); mbedtls_md_free( &transform->md_ctx_enc ); mbedtls_md_free( &transform->md_ctx_dec ); mbedtls_platform_zeroize( transform, sizeof( mbedtls_ssl_transform ) ); } #if defined(MBEDTLS_X509_CRT_PARSE_C) static void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert ) { mbedtls_ssl_key_cert *cur = key_cert, *next; while( cur != NULL ) { next = cur->next; mbedtls_free( cur ); cur = next; } } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_SSL_PROTO_DTLS) static void ssl_buffering_free( mbedtls_ssl_context *ssl ) { unsigned offset; mbedtls_ssl_handshake_params * const hs = ssl->handshake; if( hs == NULL ) return; ssl_free_buffered_record( ssl ); for( offset = 0; offset < MBEDTLS_SSL_MAX_BUFFERED_HS; offset++ ) ssl_buffering_free_slot( ssl, offset ); } static void ssl_buffering_free_slot( mbedtls_ssl_context *ssl, uint8_t slot ) { mbedtls_ssl_handshake_params * const hs = ssl->handshake; mbedtls_ssl_hs_buffer * const hs_buf = &hs->buffering.hs[slot]; if( slot >= MBEDTLS_SSL_MAX_BUFFERED_HS ) return; if( hs_buf->is_valid == 1 ) { hs->buffering.total_bytes_buffered -= hs_buf->data_len; mbedtls_platform_zeroize( hs_buf->data, hs_buf->data_len ); mbedtls_free( hs_buf->data ); memset( hs_buf, 0, sizeof( mbedtls_ssl_hs_buffer ) ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ void mbedtls_ssl_handshake_free( mbedtls_ssl_context *ssl ) { mbedtls_ssl_handshake_params *handshake = ssl->handshake; if( handshake == NULL ) return; #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if( ssl->conf->f_async_cancel != NULL && handshake->async_in_progress != 0 ) { ssl->conf->f_async_cancel( ssl ); handshake->async_in_progress = 0; } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) mbedtls_md5_free( &handshake->fin_md5 ); mbedtls_sha1_free( &handshake->fin_sha1 ); #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_SHA256_C) mbedtls_sha256_free( &handshake->fin_sha256 ); #endif #if defined(MBEDTLS_SHA512_C) mbedtls_sha512_free( &handshake->fin_sha512 ); #endif #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_DHM_C) mbedtls_dhm_free( &handshake->dhm_ctx ); #endif #if defined(MBEDTLS_ECDH_C) mbedtls_ecdh_free( &handshake->ecdh_ctx ); #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) mbedtls_ecjpake_free( &handshake->ecjpake_ctx ); #if defined(MBEDTLS_SSL_CLI_C) mbedtls_free( handshake->ecjpake_cache ); handshake->ecjpake_cache = NULL; handshake->ecjpake_cache_len = 0; #endif #endif #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) /* explicit void pointer cast for buggy MS compiler */ mbedtls_free( (void *) handshake->curves ); #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) if( handshake->psk != NULL ) { mbedtls_platform_zeroize( handshake->psk, handshake->psk_len ); mbedtls_free( handshake->psk ); } #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) && \ defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) /* * Free only the linked list wrapper, not the keys themselves * since the belong to the SNI callback */ if( handshake->sni_key_cert != NULL ) { mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next; while( cur != NULL ) { next = cur->next; mbedtls_free( cur ); cur = next; } } #endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_SSL__ECP_RESTARTABLE) mbedtls_x509_crt_restart_free( &handshake->ecrs_ctx ); #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) mbedtls_free( handshake->verify_cookie ); ssl_flight_free( handshake->flight ); ssl_buffering_free( ssl ); #endif mbedtls_platform_zeroize( handshake, sizeof( mbedtls_ssl_handshake_params ) ); } void mbedtls_ssl_session_free( mbedtls_ssl_session *session ) { if( session == NULL ) return; #if defined(MBEDTLS_X509_CRT_PARSE_C) if( session->peer_cert != NULL ) { mbedtls_x509_crt_free( session->peer_cert ); mbedtls_free( session->peer_cert ); } #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) mbedtls_free( session->ticket ); #endif mbedtls_platform_zeroize( session, sizeof( mbedtls_ssl_session ) ); } /* * Free an SSL context */ void mbedtls_ssl_free( mbedtls_ssl_context *ssl ) { if( ssl == NULL ) return; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> free" ) ); if( ssl->out_buf != NULL ) { mbedtls_platform_zeroize( ssl->out_buf, MBEDTLS_SSL_OUT_BUFFER_LEN ); mbedtls_free( ssl->out_buf ); } if( ssl->in_buf != NULL ) { mbedtls_platform_zeroize( ssl->in_buf, MBEDTLS_SSL_IN_BUFFER_LEN ); mbedtls_free( ssl->in_buf ); } #if defined(MBEDTLS_ZLIB_SUPPORT) if( ssl->compress_buf != NULL ) { mbedtls_platform_zeroize( ssl->compress_buf, MBEDTLS_SSL_COMPRESS_BUFFER_LEN ); mbedtls_free( ssl->compress_buf ); } #endif if( ssl->transform ) { mbedtls_ssl_transform_free( ssl->transform ); mbedtls_free( ssl->transform ); } if( ssl->handshake ) { mbedtls_ssl_handshake_free( ssl ); mbedtls_ssl_transform_free( ssl->transform_negotiate ); mbedtls_ssl_session_free( ssl->session_negotiate ); mbedtls_free( ssl->handshake ); mbedtls_free( ssl->transform_negotiate ); mbedtls_free( ssl->session_negotiate ); } if( ssl->session ) { mbedtls_ssl_session_free( ssl->session ); mbedtls_free( ssl->session ); } #if defined(MBEDTLS_X509_CRT_PARSE_C) if( ssl->hostname != NULL ) { mbedtls_platform_zeroize( ssl->hostname, strlen( ssl->hostname ) ); mbedtls_free( ssl->hostname ); } #endif #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) if( mbedtls_ssl_hw_record_finish != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "going for mbedtls_ssl_hw_record_finish()" ) ); mbedtls_ssl_hw_record_finish( ssl ); } #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) mbedtls_free( ssl->cli_id ); #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= free" ) ); /* Actually clear after last debug message */ mbedtls_platform_zeroize( ssl, sizeof( mbedtls_ssl_context ) ); } /* * Initialze mbedtls_ssl_config */ void mbedtls_ssl_config_init( mbedtls_ssl_config *conf ) { memset( conf, 0, sizeof( mbedtls_ssl_config ) ); } #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) static int ssl_preset_default_hashes[] = { #if defined(MBEDTLS_SHA512_C) MBEDTLS_MD_SHA512, MBEDTLS_MD_SHA384, #endif #if defined(MBEDTLS_SHA256_C) MBEDTLS_MD_SHA256, MBEDTLS_MD_SHA224, #endif #if defined(MBEDTLS_SHA1_C) && defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE) MBEDTLS_MD_SHA1, #endif MBEDTLS_MD_NONE }; #endif static int ssl_preset_suiteb_ciphersuites[] = { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 0 }; #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) static int ssl_preset_suiteb_hashes[] = { MBEDTLS_MD_SHA256, MBEDTLS_MD_SHA384, MBEDTLS_MD_NONE }; #endif #if defined(MBEDTLS_ECP_C) static mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = { MBEDTLS_ECP_DP_SECP256R1, MBEDTLS_ECP_DP_SECP384R1, MBEDTLS_ECP_DP_NONE }; #endif /* * Load default in mbedtls_ssl_config */ int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf, int endpoint, int transport, int preset ) { #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) int ret; #endif /* Use the functions here so that they are covered in tests, * but otherwise access member directly for efficiency */ mbedtls_ssl_conf_endpoint( conf, endpoint ); mbedtls_ssl_conf_transport( conf, transport ); /* * Things that are common to all presets */ #if defined(MBEDTLS_SSL_CLI_C) if( endpoint == MBEDTLS_SSL_IS_CLIENT ) { conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED; #if defined(MBEDTLS_SSL_SESSION_TICKETS) conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED; #endif } #endif #if defined(MBEDTLS_ARC4_C) conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED; #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; #endif #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED; #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) conf->f_cookie_write = ssl_cookie_write_dummy; conf->f_cookie_check = ssl_cookie_check_dummy; #endif #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED; #endif #if defined(MBEDTLS_SSL_SRV_C) conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED; #endif #if defined(MBEDTLS_SSL_PROTO_DTLS) conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN; conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX; #endif #if defined(MBEDTLS_SSL_RENEGOTIATION) conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT; memset( conf->renego_period, 0x00, 2 ); memset( conf->renego_period + 2, 0xFF, 6 ); #endif #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) if( endpoint == MBEDTLS_SSL_IS_SERVER ) { const unsigned char dhm_p[] = MBEDTLS_DHM_RFC3526_MODP_2048_P_BIN; const unsigned char dhm_g[] = MBEDTLS_DHM_RFC3526_MODP_2048_G_BIN; if ( ( ret = mbedtls_ssl_conf_dh_param_bin( conf, dhm_p, sizeof( dhm_p ), dhm_g, sizeof( dhm_g ) ) ) != 0 ) { return( ret ); } } #endif /* * Preset-specific defaults */ switch( preset ) { /* * NSA Suite B */ case MBEDTLS_SSL_PRESET_SUITEB: conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */ conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION; conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION; conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ssl_preset_suiteb_ciphersuites; #if defined(MBEDTLS_X509_CRT_PARSE_C) conf->cert_profile = &mbedtls_x509_crt_profile_suiteb; #endif #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) conf->sig_hashes = ssl_preset_suiteb_hashes; #endif #if defined(MBEDTLS_ECP_C) conf->curve_list = ssl_preset_suiteb_curves; #endif break; /* * Default */ default: conf->min_major_ver = ( MBEDTLS_SSL_MIN_MAJOR_VERSION > MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION ) ? MBEDTLS_SSL_MIN_MAJOR_VERSION : MBEDTLS_SSL_MIN_VALID_MAJOR_VERSION; conf->min_minor_ver = ( MBEDTLS_SSL_MIN_MINOR_VERSION > MBEDTLS_SSL_MIN_VALID_MINOR_VERSION ) ? MBEDTLS_SSL_MIN_MINOR_VERSION : MBEDTLS_SSL_MIN_VALID_MINOR_VERSION; conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION; conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2; #endif conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = mbedtls_ssl_list_ciphersuites(); #if defined(MBEDTLS_X509_CRT_PARSE_C) conf->cert_profile = &mbedtls_x509_crt_profile_default; #endif #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) conf->sig_hashes = ssl_preset_default_hashes; #endif #if defined(MBEDTLS_ECP_C) conf->curve_list = mbedtls_ecp_grp_id_list(); #endif #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) conf->dhm_min_bitlen = 1024; #endif } return( 0 ); } /* * Free mbedtls_ssl_config */ void mbedtls_ssl_config_free( mbedtls_ssl_config *conf ) { #if defined(MBEDTLS_DHM_C) mbedtls_mpi_free( &conf->dhm_P ); mbedtls_mpi_free( &conf->dhm_G ); #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) if( conf->psk != NULL ) { mbedtls_platform_zeroize( conf->psk, conf->psk_len ); mbedtls_free( conf->psk ); conf->psk = NULL; conf->psk_len = 0; } if( conf->psk_identity != NULL ) { mbedtls_platform_zeroize( conf->psk_identity, conf->psk_identity_len ); mbedtls_free( conf->psk_identity ); conf->psk_identity = NULL; conf->psk_identity_len = 0; } #endif #if defined(MBEDTLS_X509_CRT_PARSE_C) ssl_key_cert_free( conf->key_cert ); #endif mbedtls_platform_zeroize( conf, sizeof( mbedtls_ssl_config ) ); } #if defined(MBEDTLS_PK_C) && \ ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) ) /* * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX */ unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk ) { #if defined(MBEDTLS_RSA_C) if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) ) return( MBEDTLS_SSL_SIG_RSA ); #endif #if defined(MBEDTLS_ECDSA_C) if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) ) return( MBEDTLS_SSL_SIG_ECDSA ); #endif return( MBEDTLS_SSL_SIG_ANON ); } unsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type ) { switch( type ) { case MBEDTLS_PK_RSA: return( MBEDTLS_SSL_SIG_RSA ); case MBEDTLS_PK_ECDSA: case MBEDTLS_PK_ECKEY: return( MBEDTLS_SSL_SIG_ECDSA ); default: return( MBEDTLS_SSL_SIG_ANON ); } } mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig ) { switch( sig ) { #if defined(MBEDTLS_RSA_C) case MBEDTLS_SSL_SIG_RSA: return( MBEDTLS_PK_RSA ); #endif #if defined(MBEDTLS_ECDSA_C) case MBEDTLS_SSL_SIG_ECDSA: return( MBEDTLS_PK_ECDSA ); #endif default: return( MBEDTLS_PK_NONE ); } } #endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* Find an entry in a signature-hash set matching a given hash algorithm. */ mbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set, mbedtls_pk_type_t sig_alg ) { switch( sig_alg ) { case MBEDTLS_PK_RSA: return( set->rsa ); case MBEDTLS_PK_ECDSA: return( set->ecdsa ); default: return( MBEDTLS_MD_NONE ); } } /* Add a signature-hash-pair to a signature-hash set */ void mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set, mbedtls_pk_type_t sig_alg, mbedtls_md_type_t md_alg ) { switch( sig_alg ) { case MBEDTLS_PK_RSA: if( set->rsa == MBEDTLS_MD_NONE ) set->rsa = md_alg; break; case MBEDTLS_PK_ECDSA: if( set->ecdsa == MBEDTLS_MD_NONE ) set->ecdsa = md_alg; break; default: break; } } /* Allow exactly one hash algorithm for each signature. */ void mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set, mbedtls_md_type_t md_alg ) { set->rsa = md_alg; set->ecdsa = md_alg; } #endif /* MBEDTLS_SSL_PROTO_TLS1_2) && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ /* * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX */ mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash ) { switch( hash ) { #if defined(MBEDTLS_MD5_C) case MBEDTLS_SSL_HASH_MD5: return( MBEDTLS_MD_MD5 ); #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_SSL_HASH_SHA1: return( MBEDTLS_MD_SHA1 ); #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_SSL_HASH_SHA224: return( MBEDTLS_MD_SHA224 ); case MBEDTLS_SSL_HASH_SHA256: return( MBEDTLS_MD_SHA256 ); #endif #if defined(MBEDTLS_SHA512_C) case MBEDTLS_SSL_HASH_SHA384: return( MBEDTLS_MD_SHA384 ); case MBEDTLS_SSL_HASH_SHA512: return( MBEDTLS_MD_SHA512 ); #endif default: return( MBEDTLS_MD_NONE ); } } /* * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX */ unsigned char mbedtls_ssl_hash_from_md_alg( int md ) { switch( md ) { #if defined(MBEDTLS_MD5_C) case MBEDTLS_MD_MD5: return( MBEDTLS_SSL_HASH_MD5 ); #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_MD_SHA1: return( MBEDTLS_SSL_HASH_SHA1 ); #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA224: return( MBEDTLS_SSL_HASH_SHA224 ); case MBEDTLS_MD_SHA256: return( MBEDTLS_SSL_HASH_SHA256 ); #endif #if defined(MBEDTLS_SHA512_C) case MBEDTLS_MD_SHA384: return( MBEDTLS_SSL_HASH_SHA384 ); case MBEDTLS_MD_SHA512: return( MBEDTLS_SSL_HASH_SHA512 ); #endif default: return( MBEDTLS_SSL_HASH_NONE ); } } #if defined(MBEDTLS_ECP_C) /* * Check if a curve proposed by the peer is in our list. * Return 0 if we're willing to use it, -1 otherwise. */ int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id ) { const mbedtls_ecp_group_id *gid; if( ssl->conf->curve_list == NULL ) return( -1 ); for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ ) if( *gid == grp_id ) return( 0 ); return( -1 ); } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Check if a hash proposed by the peer is in our list. * Return 0 if we're willing to use it, -1 otherwise. */ int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl, mbedtls_md_type_t md ) { const int *cur; if( ssl->conf->sig_hashes == NULL ) return( -1 ); for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ ) if( *cur == (int) md ) return( 0 ); return( -1 ); } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_X509_CRT_PARSE_C) int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert, const mbedtls_ssl_ciphersuite_t *ciphersuite, int cert_endpoint, uint32_t *flags ) { int ret = 0; #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) int usage = 0; #endif #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) const char *ext_oid; size_t ext_len; #endif #if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) && \ !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) ((void) cert); ((void) cert_endpoint); ((void) flags); #endif #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) if( cert_endpoint == MBEDTLS_SSL_IS_SERVER ) { /* Server part of the key exchange */ switch( ciphersuite->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_RSA_PSK: usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT; break; case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE; break; case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: usage = MBEDTLS_X509_KU_KEY_AGREEMENT; break; /* Don't use default: we want warnings when adding new values */ case MBEDTLS_KEY_EXCHANGE_NONE: case MBEDTLS_KEY_EXCHANGE_PSK: case MBEDTLS_KEY_EXCHANGE_DHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECJPAKE: usage = 0; } } else { /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */ usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE; } if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 ) { *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE; ret = -1; } #else ((void) ciphersuite); #endif /* MBEDTLS_X509_CHECK_KEY_USAGE */ #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) if( cert_endpoint == MBEDTLS_SSL_IS_SERVER ) { ext_oid = MBEDTLS_OID_SERVER_AUTH; ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH ); } else { ext_oid = MBEDTLS_OID_CLIENT_AUTH; ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH ); } if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 ) { *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE; ret = -1; } #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ return( ret ); } #endif /* MBEDTLS_X509_CRT_PARSE_C */ /* * Convert version numbers to/from wire format * and, for DTLS, to/from TLS equivalent. * * For TLS this is the identity. * For DTLS, use 1's complement (v -> 255 - v, and then map as follows: * 1.0 <-> 3.2 (DTLS 1.0 is based on TLS 1.1) * 1.x <-> 3.x+1 for x != 0 (DTLS 1.2 based on TLS 1.2) */ void mbedtls_ssl_write_version( int major, int minor, int transport, unsigned char ver[2] ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { if( minor == MBEDTLS_SSL_MINOR_VERSION_2 ) --minor; /* DTLS 1.0 stored as TLS 1.1 internally */ ver[0] = (unsigned char)( 255 - ( major - 2 ) ); ver[1] = (unsigned char)( 255 - ( minor - 1 ) ); } else #else ((void) transport); #endif { ver[0] = (unsigned char) major; ver[1] = (unsigned char) minor; } } void mbedtls_ssl_read_version( int *major, int *minor, int transport, const unsigned char ver[2] ) { #if defined(MBEDTLS_SSL_PROTO_DTLS) if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { *major = 255 - ver[0] + 2; *minor = 255 - ver[1] + 1; if( *minor == MBEDTLS_SSL_MINOR_VERSION_1 ) ++*minor; /* DTLS 1.0 stored as TLS 1.1 internally */ } else #else ((void) transport); #endif { *major = ver[0]; *minor = ver[1]; } } int mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md ) { #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; switch( md ) { #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) #if defined(MBEDTLS_MD5_C) case MBEDTLS_SSL_HASH_MD5: return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_SSL_HASH_SHA1: ssl->handshake->calc_verify = ssl_calc_verify_tls; break; #endif #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SHA512_C) case MBEDTLS_SSL_HASH_SHA384: ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384; break; #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_SSL_HASH_SHA256: ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256; break; #endif default: return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; } return 0; #else /* !MBEDTLS_SSL_PROTO_TLS1_2 */ (void) ssl; (void) md; return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ } #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) int mbedtls_ssl_get_key_exchange_md_ssl_tls( mbedtls_ssl_context *ssl, unsigned char *output, unsigned char *data, size_t data_len ) { int ret = 0; mbedtls_md5_context mbedtls_md5; mbedtls_sha1_context mbedtls_sha1; mbedtls_md5_init( &mbedtls_md5 ); mbedtls_sha1_init( &mbedtls_sha1 ); /* * digitally-signed struct { * opaque md5_hash[16]; * opaque sha_hash[20]; * }; * * md5_hash * MD5(ClientHello.random + ServerHello.random * + ServerParams); * sha_hash * SHA(ClientHello.random + ServerHello.random * + ServerParams); */ if( ( ret = mbedtls_md5_starts_ret( &mbedtls_md5 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_starts_ret", ret ); goto exit; } if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, ssl->handshake->randbytes, 64 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret ); goto exit; } if( ( ret = mbedtls_md5_update_ret( &mbedtls_md5, data, data_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_update_ret", ret ); goto exit; } if( ( ret = mbedtls_md5_finish_ret( &mbedtls_md5, output ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md5_finish_ret", ret ); goto exit; } if( ( ret = mbedtls_sha1_starts_ret( &mbedtls_sha1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_starts_ret", ret ); goto exit; } if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, ssl->handshake->randbytes, 64 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret ); goto exit; } if( ( ret = mbedtls_sha1_update_ret( &mbedtls_sha1, data, data_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_update_ret", ret ); goto exit; } if( ( ret = mbedtls_sha1_finish_ret( &mbedtls_sha1, output + 16 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_sha1_finish_ret", ret ); goto exit; } exit: mbedtls_md5_free( &mbedtls_md5 ); mbedtls_sha1_free( &mbedtls_sha1 ); if( ret != 0 ) mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) int mbedtls_ssl_get_key_exchange_md_tls1_2( mbedtls_ssl_context *ssl, unsigned char *hash, size_t *hashlen, unsigned char *data, size_t data_len, mbedtls_md_type_t md_alg ) { int ret = 0; mbedtls_md_context_t ctx; const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg ); *hashlen = mbedtls_md_get_size( md_info ); mbedtls_md_init( &ctx ); /* * digitally-signed struct { * opaque client_random[32]; * opaque server_random[32]; * ServerDHParams params; * }; */ if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_setup", ret ); goto exit; } if( ( ret = mbedtls_md_starts( &ctx ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_starts", ret ); goto exit; } if( ( ret = mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret ); goto exit; } if( ( ret = mbedtls_md_update( &ctx, data, data_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_update", ret ); goto exit; } if( ( ret = mbedtls_md_finish( &ctx, hash ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_md_finish", ret ); goto exit; } exit: mbedtls_md_free( &ctx ); if( ret != 0 ) mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ #endif /* MBEDTLS_SSL_TLS_C */ fldigi-4.2.05/src/mbedtls/entropy_poll.c0000664000175000017500000001404614611711171015103 00000000000000/* * Platform-specific and custom entropy polling functions * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if defined(__linux__) /* Ensure that syscall() is available even when compiling with -std=c99 */ #define _GNU_SOURCE #endif #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include #if defined(MBEDTLS_ENTROPY_C) #include "mbedtls/entropy.h" #include "mbedtls/entropy_poll.h" #if defined(MBEDTLS_TIMING_C) #include "mbedtls/timing.h" #endif #if defined(MBEDTLS_HAVEGE_C) #include "mbedtls/havege.h" #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) #include "mbedtls/platform.h" #endif #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) #if !defined(unix) && !defined(__unix__) && !defined(__unix) && \ !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ !defined(__HAIKU__) #error "Platform entropy sources only work on Unix and Windows, see MBEDTLS_NO_PLATFORM_ENTROPY in config.h" #endif #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #if !defined(_WIN32_WINNT) #define _WIN32_WINNT 0x0400 #endif #include #include int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { HCRYPTPROV provider; ((void) data); *olen = 0; if( CryptAcquireContext( &provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) == FALSE ) { return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); } if( CryptGenRandom( provider, (DWORD) len, output ) == FALSE ) { CryptReleaseContext( provider, 0 ); return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); } CryptReleaseContext( provider, 0 ); *olen = len; return( 0 ); } #else /* _WIN32 && !EFIX64 && !EFI32 */ /* * Test for Linux getrandom() support. * Since there is no wrapper in the libc yet, use the generic syscall wrapper * available in GNU libc and compatible libc's (eg uClibc). */ #if defined(__linux__) && defined(__GLIBC__) #include #include #if defined(SYS_getrandom) #define HAVE_GETRANDOM #include static int getrandom_wrapper( void *buf, size_t buflen, unsigned int flags ) { /* MemSan cannot understand that the syscall writes to the buffer */ #if defined(__has_feature) #if __has_feature(memory_sanitizer) memset( buf, 0, buflen ); #endif #endif return( syscall( SYS_getrandom, buf, buflen, flags ) ); } #endif /* SYS_getrandom */ #endif /* __linux__ */ #include int mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { FILE *file; size_t read_len; int ret; ((void) data); #if defined(HAVE_GETRANDOM) ret = getrandom_wrapper( output, len, 0 ); if( ret >= 0 ) { *olen = ret; return( 0 ); } else if( errno != ENOSYS ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); /* Fall through if the system call isn't known. */ #else ((void) ret); #endif /* HAVE_GETRANDOM */ *olen = 0; file = fopen( "/dev/urandom", "rb" ); if( file == NULL ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); read_len = fread( output, 1, len, file ); if( read_len != len ) { fclose( file ); return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); } fclose( file ); *olen = len; return( 0 ); } #endif /* _WIN32 && !EFIX64 && !EFI32 */ #endif /* !MBEDTLS_NO_PLATFORM_ENTROPY */ #if defined(MBEDTLS_TEST_NULL_ENTROPY) int mbedtls_null_entropy_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { ((void) data); ((void) output); *olen = 0; if( len < sizeof(unsigned char) ) return( 0 ); *olen = sizeof(unsigned char); return( 0 ); } #endif #if defined(MBEDTLS_TIMING_C) int mbedtls_hardclock_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { unsigned long timer = mbedtls_timing_hardclock(); ((void) data); *olen = 0; if( len < sizeof(unsigned long) ) return( 0 ); memcpy( output, &timer, sizeof(unsigned long) ); *olen = sizeof(unsigned long); return( 0 ); } #endif /* MBEDTLS_TIMING_C */ #if defined(MBEDTLS_HAVEGE_C) int mbedtls_havege_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { mbedtls_havege_state *hs = (mbedtls_havege_state *) data; *olen = 0; if( mbedtls_havege_random( hs, output, len ) != 0 ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); *olen = len; return( 0 ); } #endif /* MBEDTLS_HAVEGE_C */ #if defined(MBEDTLS_ENTROPY_NV_SEED) int mbedtls_nv_seed_poll( void *data, unsigned char *output, size_t len, size_t *olen ) { unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; size_t use_len = MBEDTLS_ENTROPY_BLOCK_SIZE; ((void) data); memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE ); if( mbedtls_nv_seed_read( buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) < 0 ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); if( len < use_len ) use_len = len; memcpy( output, buf, use_len ); *olen = use_len; return( 0 ); } #endif /* MBEDTLS_ENTROPY_NV_SEED */ #endif /* MBEDTLS_ENTROPY_C */ fldigi-4.2.05/src/mbedtls/gcm.c0000664000175000017500000007642414611711171013133 00000000000000/* * NIST SP800-38D compliant GCM implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf * * See also: * [MGV] http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf * * We use the algorithm described as Shoup's method with 4-bit tables in * [MGV] 4.1, pp. 12-13, to enhance speed without using too much memory. */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_GCM_C) #include "mbedtls/gcm.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_AESNI_C) #include "mbedtls/aesni.h" #endif #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) #include "mbedtls/aes.h" #include "mbedtls/platform.h" #if !defined(MBEDTLS_PLATFORM_C) #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #if !defined(MBEDTLS_GCM_ALT) /* Parameter validation macros */ #define GCM_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_GCM_BAD_INPUT ) #define GCM_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif /* * Initialize a context */ void mbedtls_gcm_init( mbedtls_gcm_context *ctx ) { GCM_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_gcm_context ) ); } /* * Precompute small multiples of H, that is set * HH[i] || HL[i] = H times i, * where i is seen as a field element as in [MGV], ie high-order bits * correspond to low powers of P. The result is stored in the same way, that * is the high-order bit of HH corresponds to P^0 and the low-order bit of HL * corresponds to P^127. */ static int gcm_gen_table( mbedtls_gcm_context *ctx ) { int ret, i, j; uint64_t hi, lo; uint64_t vl, vh; unsigned char h[16]; size_t olen = 0; memset( h, 0, 16 ); if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, h, 16, h, &olen ) ) != 0 ) return( ret ); /* pack h as two 64-bits ints, big-endian */ GET_UINT32_BE( hi, h, 0 ); GET_UINT32_BE( lo, h, 4 ); vh = (uint64_t) hi << 32 | lo; GET_UINT32_BE( hi, h, 8 ); GET_UINT32_BE( lo, h, 12 ); vl = (uint64_t) hi << 32 | lo; /* 8 = 1000 corresponds to 1 in GF(2^128) */ ctx->HL[8] = vl; ctx->HH[8] = vh; #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) /* With CLMUL support, we need only h, not the rest of the table */ if( mbedtls_aesni_has_support( MBEDTLS_AESNI_CLMUL ) ) return( 0 ); #endif /* 0 corresponds to 0 in GF(2^128) */ ctx->HH[0] = 0; ctx->HL[0] = 0; for( i = 4; i > 0; i >>= 1 ) { uint32_t T = ( vl & 1 ) * 0xe1000000U; vl = ( vh << 63 ) | ( vl >> 1 ); vh = ( vh >> 1 ) ^ ( (uint64_t) T << 32); ctx->HL[i] = vl; ctx->HH[i] = vh; } for( i = 2; i <= 8; i *= 2 ) { uint64_t *HiL = ctx->HL + i, *HiH = ctx->HH + i; vh = *HiH; vl = *HiL; for( j = 1; j < i; j++ ) { HiH[j] = vh ^ ctx->HH[j]; HiL[j] = vl ^ ctx->HL[j]; } } return( 0 ); } int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx, mbedtls_cipher_id_t cipher, const unsigned char *key, unsigned int keybits ) { int ret; const mbedtls_cipher_info_t *cipher_info; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( key != NULL ); GCM_VALIDATE_RET( keybits == 128 || keybits == 192 || keybits == 256 ); cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB ); if( cipher_info == NULL ) return( MBEDTLS_ERR_GCM_BAD_INPUT ); if( cipher_info->block_size != 16 ) return( MBEDTLS_ERR_GCM_BAD_INPUT ); mbedtls_cipher_free( &ctx->cipher_ctx ); if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits, MBEDTLS_ENCRYPT ) ) != 0 ) { return( ret ); } if( ( ret = gcm_gen_table( ctx ) ) != 0 ) return( ret ); return( 0 ); } /* * Shoup's method for multiplication use this table with * last4[x] = x times P^128 * where x and last4[x] are seen as elements of GF(2^128) as in [MGV] */ static const uint64_t last4[16] = { 0x0000, 0x1c20, 0x3840, 0x2460, 0x7080, 0x6ca0, 0x48c0, 0x54e0, 0xe100, 0xfd20, 0xd940, 0xc560, 0x9180, 0x8da0, 0xa9c0, 0xb5e0 }; /* * Sets output to x times H using the precomputed tables. * x and output are seen as elements of GF(2^128) as in [MGV]. */ static void gcm_mult( mbedtls_gcm_context *ctx, const unsigned char x[16], unsigned char output[16] ) { int i = 0; unsigned char lo, hi, rem; uint64_t zh, zl; #if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64) if( mbedtls_aesni_has_support( MBEDTLS_AESNI_CLMUL ) ) { unsigned char h[16]; PUT_UINT32_BE( ctx->HH[8] >> 32, h, 0 ); PUT_UINT32_BE( ctx->HH[8], h, 4 ); PUT_UINT32_BE( ctx->HL[8] >> 32, h, 8 ); PUT_UINT32_BE( ctx->HL[8], h, 12 ); mbedtls_aesni_gcm_mult( output, x, h ); return; } #endif /* MBEDTLS_AESNI_C && MBEDTLS_HAVE_X86_64 */ lo = x[15] & 0xf; zh = ctx->HH[lo]; zl = ctx->HL[lo]; for( i = 15; i >= 0; i-- ) { lo = x[i] & 0xf; hi = x[i] >> 4; if( i != 15 ) { rem = (unsigned char) zl & 0xf; zl = ( zh << 60 ) | ( zl >> 4 ); zh = ( zh >> 4 ); zh ^= (uint64_t) last4[rem] << 48; zh ^= ctx->HH[lo]; zl ^= ctx->HL[lo]; } rem = (unsigned char) zl & 0xf; zl = ( zh << 60 ) | ( zl >> 4 ); zh = ( zh >> 4 ); zh ^= (uint64_t) last4[rem] << 48; zh ^= ctx->HH[hi]; zl ^= ctx->HL[hi]; } PUT_UINT32_BE( zh >> 32, output, 0 ); PUT_UINT32_BE( zh, output, 4 ); PUT_UINT32_BE( zl >> 32, output, 8 ); PUT_UINT32_BE( zl, output, 12 ); } int mbedtls_gcm_starts( mbedtls_gcm_context *ctx, int mode, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len ) { int ret; unsigned char work_buf[16]; size_t i; const unsigned char *p; size_t use_len, olen = 0; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( iv != NULL ); GCM_VALIDATE_RET( add_len == 0 || add != NULL ); /* IV and AD are limited to 2^64 bits, so 2^61 bytes */ /* IV is not allowed to be zero length */ if( iv_len == 0 || ( (uint64_t) iv_len ) >> 61 != 0 || ( (uint64_t) add_len ) >> 61 != 0 ) { return( MBEDTLS_ERR_GCM_BAD_INPUT ); } memset( ctx->y, 0x00, sizeof(ctx->y) ); memset( ctx->buf, 0x00, sizeof(ctx->buf) ); ctx->mode = mode; ctx->len = 0; ctx->add_len = 0; if( iv_len == 12 ) { memcpy( ctx->y, iv, iv_len ); ctx->y[15] = 1; } else { memset( work_buf, 0x00, 16 ); PUT_UINT32_BE( iv_len * 8, work_buf, 12 ); p = iv; while( iv_len > 0 ) { use_len = ( iv_len < 16 ) ? iv_len : 16; for( i = 0; i < use_len; i++ ) ctx->y[i] ^= p[i]; gcm_mult( ctx, ctx->y, ctx->y ); iv_len -= use_len; p += use_len; } for( i = 0; i < 16; i++ ) ctx->y[i] ^= work_buf[i]; gcm_mult( ctx, ctx->y, ctx->y ); } if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ctx->base_ectr, &olen ) ) != 0 ) { return( ret ); } ctx->add_len = add_len; p = add; while( add_len > 0 ) { use_len = ( add_len < 16 ) ? add_len : 16; for( i = 0; i < use_len; i++ ) ctx->buf[i] ^= p[i]; gcm_mult( ctx, ctx->buf, ctx->buf ); add_len -= use_len; p += use_len; } return( 0 ); } int mbedtls_gcm_update( mbedtls_gcm_context *ctx, size_t length, const unsigned char *input, unsigned char *output ) { int ret; unsigned char ectr[16]; size_t i; const unsigned char *p; unsigned char *out_p = output; size_t use_len, olen = 0; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( length == 0 || input != NULL ); GCM_VALIDATE_RET( length == 0 || output != NULL ); if( output > input && (size_t) ( output - input ) < length ) return( MBEDTLS_ERR_GCM_BAD_INPUT ); /* Total length is restricted to 2^39 - 256 bits, ie 2^36 - 2^5 bytes * Also check for possible overflow */ if( ctx->len + length < ctx->len || (uint64_t) ctx->len + length > 0xFFFFFFFE0ull ) { return( MBEDTLS_ERR_GCM_BAD_INPUT ); } ctx->len += length; p = input; while( length > 0 ) { use_len = ( length < 16 ) ? length : 16; for( i = 16; i > 12; i-- ) if( ++ctx->y[i - 1] != 0 ) break; if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ectr, &olen ) ) != 0 ) { return( ret ); } for( i = 0; i < use_len; i++ ) { if( ctx->mode == MBEDTLS_GCM_DECRYPT ) ctx->buf[i] ^= p[i]; out_p[i] = ectr[i] ^ p[i]; if( ctx->mode == MBEDTLS_GCM_ENCRYPT ) ctx->buf[i] ^= out_p[i]; } gcm_mult( ctx, ctx->buf, ctx->buf ); length -= use_len; p += use_len; out_p += use_len; } return( 0 ); } int mbedtls_gcm_finish( mbedtls_gcm_context *ctx, unsigned char *tag, size_t tag_len ) { unsigned char work_buf[16]; size_t i; uint64_t orig_len; uint64_t orig_add_len; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( tag != NULL ); orig_len = ctx->len * 8; orig_add_len = ctx->add_len * 8; if( tag_len > 16 || tag_len < 4 ) return( MBEDTLS_ERR_GCM_BAD_INPUT ); memcpy( tag, ctx->base_ectr, tag_len ); if( orig_len || orig_add_len ) { memset( work_buf, 0x00, 16 ); PUT_UINT32_BE( ( orig_add_len >> 32 ), work_buf, 0 ); PUT_UINT32_BE( ( orig_add_len ), work_buf, 4 ); PUT_UINT32_BE( ( orig_len >> 32 ), work_buf, 8 ); PUT_UINT32_BE( ( orig_len ), work_buf, 12 ); for( i = 0; i < 16; i++ ) ctx->buf[i] ^= work_buf[i]; gcm_mult( ctx, ctx->buf, ctx->buf ); for( i = 0; i < tag_len; i++ ) tag[i] ^= ctx->buf[i]; } return( 0 ); } int mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx, int mode, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *input, unsigned char *output, size_t tag_len, unsigned char *tag ) { int ret; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( iv != NULL ); GCM_VALIDATE_RET( add_len == 0 || add != NULL ); GCM_VALIDATE_RET( length == 0 || input != NULL ); GCM_VALIDATE_RET( length == 0 || output != NULL ); GCM_VALIDATE_RET( tag != NULL ); if( ( ret = mbedtls_gcm_starts( ctx, mode, iv, iv_len, add, add_len ) ) != 0 ) return( ret ); if( ( ret = mbedtls_gcm_update( ctx, length, input, output ) ) != 0 ) return( ret ); if( ( ret = mbedtls_gcm_finish( ctx, tag, tag_len ) ) != 0 ) return( ret ); return( 0 ); } int mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx, size_t length, const unsigned char *iv, size_t iv_len, const unsigned char *add, size_t add_len, const unsigned char *tag, size_t tag_len, const unsigned char *input, unsigned char *output ) { int ret; unsigned char check_tag[16]; size_t i; int diff; GCM_VALIDATE_RET( ctx != NULL ); GCM_VALIDATE_RET( iv != NULL ); GCM_VALIDATE_RET( add_len == 0 || add != NULL ); GCM_VALIDATE_RET( tag != NULL ); GCM_VALIDATE_RET( length == 0 || input != NULL ); GCM_VALIDATE_RET( length == 0 || output != NULL ); if( ( ret = mbedtls_gcm_crypt_and_tag( ctx, MBEDTLS_GCM_DECRYPT, length, iv, iv_len, add, add_len, input, output, tag_len, check_tag ) ) != 0 ) { return( ret ); } /* Check tag in "constant-time" */ for( diff = 0, i = 0; i < tag_len; i++ ) diff |= tag[i] ^ check_tag[i]; if( diff != 0 ) { mbedtls_platform_zeroize( output, length ); return( MBEDTLS_ERR_GCM_AUTH_FAILED ); } return( 0 ); } void mbedtls_gcm_free( mbedtls_gcm_context *ctx ) { if( ctx == NULL ) return; mbedtls_cipher_free( &ctx->cipher_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_gcm_context ) ); } #endif /* !MBEDTLS_GCM_ALT */ #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) /* * AES-GCM test vectors from: * * http://csrc.nist.gov/groups/STM/cavp/documents/mac/gcmtestvectors.zip */ #define MAX_TESTS 6 static const int key_index[MAX_TESTS] = { 0, 0, 1, 1, 1, 1 }; static const unsigned char key[MAX_TESTS][32] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08, 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }, }; static const size_t iv_len[MAX_TESTS] = { 12, 12, 12, 12, 8, 60 }; static const int iv_index[MAX_TESTS] = { 0, 0, 1, 1, 1, 2 }; static const unsigned char iv[MAX_TESTS][64] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, 0xde, 0xca, 0xf8, 0x88 }, { 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5, 0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa, 0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1, 0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28, 0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39, 0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54, 0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57, 0xa6, 0x37, 0xb3, 0x9b }, }; static const size_t add_len[MAX_TESTS] = { 0, 0, 0, 20, 20, 20 }; static const int add_index[MAX_TESTS] = { 0, 0, 0, 1, 1, 1 }; static const unsigned char additional[MAX_TESTS][64] = { { 0x00 }, { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2 }, }; static const size_t pt_len[MAX_TESTS] = { 0, 16, 64, 60, 60, 60 }; static const int pt_index[MAX_TESTS] = { 0, 0, 1, 1, 1, 1 }; static const unsigned char pt[MAX_TESTS][64] = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, 0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 }, }; static const unsigned char ct[MAX_TESTS * 3][64] = { { 0x00 }, { 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92, 0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78 }, { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, 0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85 }, { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24, 0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c, 0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0, 0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e, 0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c, 0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05, 0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97, 0x3d, 0x58, 0xe0, 0x91 }, { 0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a, 0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55, 0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8, 0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23, 0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2, 0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42, 0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07, 0xc2, 0x3f, 0x45, 0x98 }, { 0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6, 0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94, 0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8, 0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7, 0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90, 0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f, 0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03, 0x4c, 0x34, 0xae, 0xe5 }, { 0x00 }, { 0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41, 0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00 }, { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, 0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56 }, { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41, 0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57, 0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84, 0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c, 0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25, 0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47, 0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9, 0xcc, 0xda, 0x27, 0x10 }, { 0x0f, 0x10, 0xf5, 0x99, 0xae, 0x14, 0xa1, 0x54, 0xed, 0x24, 0xb3, 0x6e, 0x25, 0x32, 0x4d, 0xb8, 0xc5, 0x66, 0x63, 0x2e, 0xf2, 0xbb, 0xb3, 0x4f, 0x83, 0x47, 0x28, 0x0f, 0xc4, 0x50, 0x70, 0x57, 0xfd, 0xdc, 0x29, 0xdf, 0x9a, 0x47, 0x1f, 0x75, 0xc6, 0x65, 0x41, 0xd4, 0xd4, 0xda, 0xd1, 0xc9, 0xe9, 0x3a, 0x19, 0xa5, 0x8e, 0x8b, 0x47, 0x3f, 0xa0, 0xf0, 0x62, 0xf7 }, { 0xd2, 0x7e, 0x88, 0x68, 0x1c, 0xe3, 0x24, 0x3c, 0x48, 0x30, 0x16, 0x5a, 0x8f, 0xdc, 0xf9, 0xff, 0x1d, 0xe9, 0xa1, 0xd8, 0xe6, 0xb4, 0x47, 0xef, 0x6e, 0xf7, 0xb7, 0x98, 0x28, 0x66, 0x6e, 0x45, 0x81, 0xe7, 0x90, 0x12, 0xaf, 0x34, 0xdd, 0xd9, 0xe2, 0xf0, 0x37, 0x58, 0x9b, 0x29, 0x2d, 0xb3, 0xe6, 0x7c, 0x03, 0x67, 0x45, 0xfa, 0x22, 0xe7, 0xe9, 0xb7, 0x37, 0x3b }, { 0x00 }, { 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e, 0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18 }, { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad }, { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, 0xbc, 0xc9, 0xf6, 0x62 }, { 0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32, 0xae, 0x47, 0xc1, 0x3b, 0xf1, 0x98, 0x44, 0xcb, 0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa, 0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0, 0xfe, 0xb5, 0x82, 0xd3, 0x39, 0x34, 0xa4, 0xf0, 0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78, 0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99, 0xf4, 0x7c, 0x9b, 0x1f }, { 0x5a, 0x8d, 0xef, 0x2f, 0x0c, 0x9e, 0x53, 0xf1, 0xf7, 0x5d, 0x78, 0x53, 0x65, 0x9e, 0x2a, 0x20, 0xee, 0xb2, 0xb2, 0x2a, 0xaf, 0xde, 0x64, 0x19, 0xa0, 0x58, 0xab, 0x4f, 0x6f, 0x74, 0x6b, 0xf4, 0x0f, 0xc0, 0xc3, 0xb7, 0x80, 0xf2, 0x44, 0x45, 0x2d, 0xa3, 0xeb, 0xf1, 0xc5, 0xd8, 0x2c, 0xde, 0xa2, 0x41, 0x89, 0x97, 0x20, 0x0e, 0xf8, 0x2e, 0x44, 0xae, 0x7e, 0x3f }, }; static const unsigned char tag[MAX_TESTS * 3][16] = { { 0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61, 0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a }, { 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd, 0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf }, { 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6, 0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4 }, { 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb, 0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47 }, { 0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85, 0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb }, { 0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa, 0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50 }, { 0xcd, 0x33, 0xb2, 0x8a, 0xc7, 0x73, 0xf7, 0x4b, 0xa0, 0x0e, 0xd1, 0xf3, 0x12, 0x57, 0x24, 0x35 }, { 0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab, 0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb }, { 0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf, 0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14 }, { 0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f, 0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c }, { 0x65, 0xdc, 0xc5, 0x7f, 0xcf, 0x62, 0x3a, 0x24, 0x09, 0x4f, 0xcc, 0xa4, 0x0d, 0x35, 0x33, 0xf8 }, { 0xdc, 0xf5, 0x66, 0xff, 0x29, 0x1c, 0x25, 0xbb, 0xb8, 0x56, 0x8f, 0xc3, 0xd3, 0x76, 0xa6, 0xd9 }, { 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9, 0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b }, { 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0, 0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19 }, { 0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd, 0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c }, { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b }, { 0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4, 0x5e, 0x45, 0x49, 0x13, 0xfe, 0x2e, 0xa8, 0xf2 }, { 0xa4, 0x4a, 0x82, 0x66, 0xee, 0x1c, 0x8e, 0xb0, 0xc8, 0xb5, 0xd4, 0xcf, 0x5a, 0xe9, 0xf1, 0x9a }, }; int mbedtls_gcm_self_test( int verbose ) { mbedtls_gcm_context ctx; unsigned char buf[64]; unsigned char tag_buf[16]; int i, j, ret; mbedtls_cipher_id_t cipher = MBEDTLS_CIPHER_ID_AES; for( j = 0; j < 3; j++ ) { int key_len = 128 + 64 * j; for( i = 0; i < MAX_TESTS; i++ ) { mbedtls_gcm_init( &ctx ); if( verbose != 0 ) mbedtls_printf( " AES-GCM-%3d #%d (%s): ", key_len, i, "enc" ); ret = mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len ); /* * AES-192 is an optional feature that may be unavailable when * there is an alternative underlying implementation i.e. when * MBEDTLS_AES_ALT is defined. */ if( ret == MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED && key_len == 192 ) { mbedtls_printf( "skipped\n" ); break; } else if( ret != 0 ) { goto exit; } ret = mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_ENCRYPT, pt_len[i], iv[iv_index[i]], iv_len[i], additional[add_index[i]], add_len[i], pt[pt_index[i]], buf, 16, tag_buf ); if( ret != 0 ) goto exit; if ( memcmp( buf, ct[j * 6 + i], pt_len[i] ) != 0 || memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) { ret = 1; goto exit; } mbedtls_gcm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); mbedtls_gcm_init( &ctx ); if( verbose != 0 ) mbedtls_printf( " AES-GCM-%3d #%d (%s): ", key_len, i, "dec" ); ret = mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_DECRYPT, pt_len[i], iv[iv_index[i]], iv_len[i], additional[add_index[i]], add_len[i], ct[j * 6 + i], buf, 16, tag_buf ); if( ret != 0 ) goto exit; if( memcmp( buf, pt[pt_index[i]], pt_len[i] ) != 0 || memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) { ret = 1; goto exit; } mbedtls_gcm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); mbedtls_gcm_init( &ctx ); if( verbose != 0 ) mbedtls_printf( " AES-GCM-%3d #%d split (%s): ", key_len, i, "enc" ); ret = mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_starts( &ctx, MBEDTLS_GCM_ENCRYPT, iv[iv_index[i]], iv_len[i], additional[add_index[i]], add_len[i] ); if( ret != 0 ) goto exit; if( pt_len[i] > 32 ) { size_t rest_len = pt_len[i] - 32; ret = mbedtls_gcm_update( &ctx, 32, pt[pt_index[i]], buf ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_update( &ctx, rest_len, pt[pt_index[i]] + 32, buf + 32 ); if( ret != 0 ) goto exit; } else { ret = mbedtls_gcm_update( &ctx, pt_len[i], pt[pt_index[i]], buf ); if( ret != 0 ) goto exit; } ret = mbedtls_gcm_finish( &ctx, tag_buf, 16 ); if( ret != 0 ) goto exit; if( memcmp( buf, ct[j * 6 + i], pt_len[i] ) != 0 || memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) { ret = 1; goto exit; } mbedtls_gcm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); mbedtls_gcm_init( &ctx ); if( verbose != 0 ) mbedtls_printf( " AES-GCM-%3d #%d split (%s): ", key_len, i, "dec" ); ret = mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_starts( &ctx, MBEDTLS_GCM_DECRYPT, iv[iv_index[i]], iv_len[i], additional[add_index[i]], add_len[i] ); if( ret != 0 ) goto exit; if( pt_len[i] > 32 ) { size_t rest_len = pt_len[i] - 32; ret = mbedtls_gcm_update( &ctx, 32, ct[j * 6 + i], buf ); if( ret != 0 ) goto exit; ret = mbedtls_gcm_update( &ctx, rest_len, ct[j * 6 + i] + 32, buf + 32 ); if( ret != 0 ) goto exit; } else { ret = mbedtls_gcm_update( &ctx, pt_len[i], ct[j * 6 + i], buf ); if( ret != 0 ) goto exit; } ret = mbedtls_gcm_finish( &ctx, tag_buf, 16 ); if( ret != 0 ) goto exit; if( memcmp( buf, pt[pt_index[i]], pt_len[i] ) != 0 || memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 ) { ret = 1; goto exit; } mbedtls_gcm_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); } } if( verbose != 0 ) mbedtls_printf( "\n" ); ret = 0; exit: if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); mbedtls_gcm_free( &ctx ); } return( ret ); } #endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #endif /* MBEDTLS_GCM_C */ fldigi-4.2.05/src/mbedtls/ssl_cache.c0000664000175000017500000002022414611711171014274 00000000000000/* * SSL session cache implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * These session callbacks use a simple chained list * to store and retrieve the session information. */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_CACHE_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/ssl_cache.h" #include void mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache ) { memset( cache, 0, sizeof( mbedtls_ssl_cache_context ) ); cache->timeout = MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT; cache->max_entries = MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES; #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &cache->mutex ); #endif } int mbedtls_ssl_cache_get( void *data, mbedtls_ssl_session *session ) { int ret = 1; #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t t = mbedtls_time( NULL ); #endif mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data; mbedtls_ssl_cache_entry *cur, *entry; #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_lock( &cache->mutex ) != 0 ) return( 1 ); #endif cur = cache->chain; entry = NULL; while( cur != NULL ) { entry = cur; cur = cur->next; #if defined(MBEDTLS_HAVE_TIME) if( cache->timeout != 0 && (int) ( t - entry->timestamp ) > cache->timeout ) continue; #endif if( session->ciphersuite != entry->session.ciphersuite || session->compression != entry->session.compression || session->id_len != entry->session.id_len ) continue; if( memcmp( session->id, entry->session.id, entry->session.id_len ) != 0 ) continue; memcpy( session->master, entry->session.master, 48 ); session->verify_result = entry->session.verify_result; #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * Restore peer certificate (without rest of the original chain) */ if( entry->peer_cert.p != NULL ) { if( ( session->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) ) ) == NULL ) { ret = 1; goto exit; } mbedtls_x509_crt_init( session->peer_cert ); if( mbedtls_x509_crt_parse( session->peer_cert, entry->peer_cert.p, entry->peer_cert.len ) != 0 ) { mbedtls_free( session->peer_cert ); session->peer_cert = NULL; ret = 1; goto exit; } } #endif /* MBEDTLS_X509_CRT_PARSE_C */ ret = 0; goto exit; } exit: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &cache->mutex ) != 0 ) ret = 1; #endif return( ret ); } int mbedtls_ssl_cache_set( void *data, const mbedtls_ssl_session *session ) { int ret = 1; #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t t = mbedtls_time( NULL ), oldest = 0; mbedtls_ssl_cache_entry *old = NULL; #endif mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data; mbedtls_ssl_cache_entry *cur, *prv; int count = 0; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &cache->mutex ) ) != 0 ) return( ret ); #endif cur = cache->chain; prv = NULL; while( cur != NULL ) { count++; #if defined(MBEDTLS_HAVE_TIME) if( cache->timeout != 0 && (int) ( t - cur->timestamp ) > cache->timeout ) { cur->timestamp = t; break; /* expired, reuse this slot, update timestamp */ } #endif if( memcmp( session->id, cur->session.id, cur->session.id_len ) == 0 ) break; /* client reconnected, keep timestamp for session id */ #if defined(MBEDTLS_HAVE_TIME) if( oldest == 0 || cur->timestamp < oldest ) { oldest = cur->timestamp; old = cur; } #endif prv = cur; cur = cur->next; } if( cur == NULL ) { #if defined(MBEDTLS_HAVE_TIME) /* * Reuse oldest entry if max_entries reached */ if( count >= cache->max_entries ) { if( old == NULL ) { ret = 1; goto exit; } cur = old; } #else /* MBEDTLS_HAVE_TIME */ /* * Reuse first entry in chain if max_entries reached, * but move to last place */ if( count >= cache->max_entries ) { if( cache->chain == NULL ) { ret = 1; goto exit; } cur = cache->chain; cache->chain = cur->next; cur->next = NULL; prv->next = cur; } #endif /* MBEDTLS_HAVE_TIME */ else { /* * max_entries not reached, create new entry */ cur = mbedtls_calloc( 1, sizeof(mbedtls_ssl_cache_entry) ); if( cur == NULL ) { ret = 1; goto exit; } if( prv == NULL ) cache->chain = cur; else prv->next = cur; } #if defined(MBEDTLS_HAVE_TIME) cur->timestamp = t; #endif } memcpy( &cur->session, session, sizeof( mbedtls_ssl_session ) ); #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * If we're reusing an entry, free its certificate first */ if( cur->peer_cert.p != NULL ) { mbedtls_free( cur->peer_cert.p ); memset( &cur->peer_cert, 0, sizeof(mbedtls_x509_buf) ); } /* * Store peer certificate */ if( session->peer_cert != NULL ) { cur->peer_cert.p = mbedtls_calloc( 1, session->peer_cert->raw.len ); if( cur->peer_cert.p == NULL ) { ret = 1; goto exit; } memcpy( cur->peer_cert.p, session->peer_cert->raw.p, session->peer_cert->raw.len ); cur->peer_cert.len = session->peer_cert->raw.len; cur->session.peer_cert = NULL; } #endif /* MBEDTLS_X509_CRT_PARSE_C */ ret = 0; exit: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &cache->mutex ) != 0 ) ret = 1; #endif return( ret ); } #if defined(MBEDTLS_HAVE_TIME) void mbedtls_ssl_cache_set_timeout( mbedtls_ssl_cache_context *cache, int timeout ) { if( timeout < 0 ) timeout = 0; cache->timeout = timeout; } #endif /* MBEDTLS_HAVE_TIME */ void mbedtls_ssl_cache_set_max_entries( mbedtls_ssl_cache_context *cache, int max ) { if( max < 0 ) max = 0; cache->max_entries = max; } void mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache ) { mbedtls_ssl_cache_entry *cur, *prv; cur = cache->chain; while( cur != NULL ) { prv = cur; cur = cur->next; mbedtls_ssl_session_free( &prv->session ); #if defined(MBEDTLS_X509_CRT_PARSE_C) mbedtls_free( prv->peer_cert.p ); #endif /* MBEDTLS_X509_CRT_PARSE_C */ mbedtls_free( prv ); } #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &cache->mutex ); #endif cache->chain = NULL; } #endif /* MBEDTLS_SSL_CACHE_C */ fldigi-4.2.05/src/mbedtls/ecdsa.c0000664000175000017500000006574614611711171013451 00000000000000/* * Elliptic curve DSA * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * SEC1 http://www.secg.org/index.php?action=secg,docs_secg */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #include "mbedtls/asn1write.h" #include #if defined(MBEDTLS_ECDSA_DETERMINISTIC) #include "mbedtls/hmac_drbg.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/platform_util.h" /* Parameter validation macros based on platform_util.h */ #define ECDSA_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECDSA_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_ECP_RESTARTABLE) /* * Sub-context for ecdsa_verify() */ struct mbedtls_ecdsa_restart_ver { mbedtls_mpi u1, u2; /* intermediate values */ enum { /* what to do next? */ ecdsa_ver_init = 0, /* getting started */ ecdsa_ver_muladd, /* muladd step */ } state; }; /* * Init verify restart sub-context */ static void ecdsa_restart_ver_init( mbedtls_ecdsa_restart_ver_ctx *ctx ) { mbedtls_mpi_init( &ctx->u1 ); mbedtls_mpi_init( &ctx->u2 ); ctx->state = ecdsa_ver_init; } /* * Free the components of a verify restart sub-context */ static void ecdsa_restart_ver_free( mbedtls_ecdsa_restart_ver_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_mpi_free( &ctx->u1 ); mbedtls_mpi_free( &ctx->u2 ); ecdsa_restart_ver_init( ctx ); } /* * Sub-context for ecdsa_sign() */ struct mbedtls_ecdsa_restart_sig { int sign_tries; int key_tries; mbedtls_mpi k; /* per-signature random */ mbedtls_mpi r; /* r value */ enum { /* what to do next? */ ecdsa_sig_init = 0, /* getting started */ ecdsa_sig_mul, /* doing ecp_mul() */ ecdsa_sig_modn, /* mod N computations */ } state; }; /* * Init verify sign sub-context */ static void ecdsa_restart_sig_init( mbedtls_ecdsa_restart_sig_ctx *ctx ) { ctx->sign_tries = 0; ctx->key_tries = 0; mbedtls_mpi_init( &ctx->k ); mbedtls_mpi_init( &ctx->r ); ctx->state = ecdsa_sig_init; } /* * Free the components of a sign restart sub-context */ static void ecdsa_restart_sig_free( mbedtls_ecdsa_restart_sig_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_mpi_free( &ctx->k ); mbedtls_mpi_free( &ctx->r ); } #if defined(MBEDTLS_ECDSA_DETERMINISTIC) /* * Sub-context for ecdsa_sign_det() */ struct mbedtls_ecdsa_restart_det { mbedtls_hmac_drbg_context rng_ctx; /* DRBG state */ enum { /* what to do next? */ ecdsa_det_init = 0, /* getting started */ ecdsa_det_sign, /* make signature */ } state; }; /* * Init verify sign_det sub-context */ static void ecdsa_restart_det_init( mbedtls_ecdsa_restart_det_ctx *ctx ) { mbedtls_hmac_drbg_init( &ctx->rng_ctx ); ctx->state = ecdsa_det_init; } /* * Free the components of a sign_det restart sub-context */ static void ecdsa_restart_det_free( mbedtls_ecdsa_restart_det_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_hmac_drbg_free( &ctx->rng_ctx ); ecdsa_restart_det_init( ctx ); } #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ #define ECDSA_RS_ECP &rs_ctx->ecp /* Utility macro for checking and updating ops budget */ #define ECDSA_BUDGET( ops ) \ MBEDTLS_MPI_CHK( mbedtls_ecp_check_budget( grp, &rs_ctx->ecp, ops ) ); /* Call this when entering a function that needs its own sub-context */ #define ECDSA_RS_ENTER( SUB ) do { \ /* reset ops count for this call if top-level */ \ if( rs_ctx != NULL && rs_ctx->ecp.depth++ == 0 ) \ rs_ctx->ecp.ops_done = 0; \ \ /* set up our own sub-context if needed */ \ if( mbedtls_ecp_restart_is_enabled() && \ rs_ctx != NULL && rs_ctx->SUB == NULL ) \ { \ rs_ctx->SUB = mbedtls_calloc( 1, sizeof( *rs_ctx->SUB ) ); \ if( rs_ctx->SUB == NULL ) \ return( MBEDTLS_ERR_ECP_ALLOC_FAILED ); \ \ ecdsa_restart_## SUB ##_init( rs_ctx->SUB ); \ } \ } while( 0 ) /* Call this when leaving a function that needs its own sub-context */ #define ECDSA_RS_LEAVE( SUB ) do { \ /* clear our sub-context when not in progress (done or error) */ \ if( rs_ctx != NULL && rs_ctx->SUB != NULL && \ ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) \ { \ ecdsa_restart_## SUB ##_free( rs_ctx->SUB ); \ mbedtls_free( rs_ctx->SUB ); \ rs_ctx->SUB = NULL; \ } \ \ if( rs_ctx != NULL ) \ rs_ctx->ecp.depth--; \ } while( 0 ) #else /* MBEDTLS_ECP_RESTARTABLE */ #define ECDSA_RS_ECP NULL #define ECDSA_BUDGET( ops ) /* no-op; for compatibility */ #define ECDSA_RS_ENTER( SUB ) (void) rs_ctx #define ECDSA_RS_LEAVE( SUB ) (void) rs_ctx #endif /* MBEDTLS_ECP_RESTARTABLE */ /* * Derive a suitable integer for group grp from a buffer of length len * SEC1 4.1.3 step 5 aka SEC1 4.1.4 step 3 */ static int derive_mpi( const mbedtls_ecp_group *grp, mbedtls_mpi *x, const unsigned char *buf, size_t blen ) { int ret; size_t n_size = ( grp->nbits + 7 ) / 8; size_t use_size = blen > n_size ? n_size : blen; MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( x, buf, use_size ) ); if( use_size * 8 > grp->nbits ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( x, use_size * 8 - grp->nbits ) ); /* While at it, reduce modulo N */ if( mbedtls_mpi_cmp_mpi( x, &grp->N ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( x, x, &grp->N ) ); cleanup: return( ret ); } #if !defined(MBEDTLS_ECDSA_SIGN_ALT) /* * Compute ECDSA signature of a hashed message (SEC1 4.1.3) * Obviously, compared to SEC1 4.1.3, we skip step 4 (hash message) */ static int ecdsa_sign_restartable( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret, key_tries, sign_tries; int *p_sign_tries = &sign_tries, *p_key_tries = &key_tries; mbedtls_ecp_point R; mbedtls_mpi k, e, t; mbedtls_mpi *pk = &k, *pr = r; /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */ if( grp->N.p == NULL ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* Make sure d is in range 1..n-1 */ if( mbedtls_mpi_cmp_int( d, 1 ) < 0 || mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); mbedtls_ecp_point_init( &R ); mbedtls_mpi_init( &k ); mbedtls_mpi_init( &e ); mbedtls_mpi_init( &t ); ECDSA_RS_ENTER( sig ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->sig != NULL ) { /* redirect to our context */ p_sign_tries = &rs_ctx->sig->sign_tries; p_key_tries = &rs_ctx->sig->key_tries; pk = &rs_ctx->sig->k; pr = &rs_ctx->sig->r; /* jump to current step */ if( rs_ctx->sig->state == ecdsa_sig_mul ) goto mul; if( rs_ctx->sig->state == ecdsa_sig_modn ) goto modn; } #endif /* MBEDTLS_ECP_RESTARTABLE */ *p_sign_tries = 0; do { if( *p_sign_tries++ > 10 ) { ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; goto cleanup; } /* * Steps 1-3: generate a suitable ephemeral keypair * and set r = xR mod n */ *p_key_tries = 0; do { if( *p_key_tries++ > 10 ) { ret = MBEDTLS_ERR_ECP_RANDOM_FAILED; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, pk, f_rng, p_rng ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->sig != NULL ) rs_ctx->sig->state = ecdsa_sig_mul; mul: #endif MBEDTLS_MPI_CHK( mbedtls_ecp_mul_restartable( grp, &R, pk, &grp->G, f_rng, p_rng, ECDSA_RS_ECP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( pr, &R.X, &grp->N ) ); } while( mbedtls_mpi_cmp_int( pr, 0 ) == 0 ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->sig != NULL ) rs_ctx->sig->state = ecdsa_sig_modn; modn: #endif /* * Accounting for everything up to the end of the loop * (step 6, but checking now avoids saving e and t) */ ECDSA_BUDGET( MBEDTLS_ECP_OPS_INV + 4 ); /* * Step 5: derive MPI from hashed message */ MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) ); /* * Generate a random value to blind inv_mod in next step, * avoiding a potential timing leak. */ MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, &t, f_rng, p_rng ) ); /* * Step 6: compute s = (e + r * d) / k = t (e + rd) / (kt) mod n */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, pr, d ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &e, &e, s ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &e, &e, &t ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( pk, pk, &t ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( s, pk, &grp->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, s, &e ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( s, s, &grp->N ) ); } while( mbedtls_mpi_cmp_int( s, 0 ) == 0 ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->sig != NULL ) mbedtls_mpi_copy( r, pr ); #endif cleanup: mbedtls_ecp_point_free( &R ); mbedtls_mpi_free( &k ); mbedtls_mpi_free( &e ); mbedtls_mpi_free( &t ); ECDSA_RS_LEAVE( sig ); return( ret ); } /* * Compute ECDSA signature of a hashed message */ int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDSA_VALIDATE_RET( grp != NULL ); ECDSA_VALIDATE_RET( r != NULL ); ECDSA_VALIDATE_RET( s != NULL ); ECDSA_VALIDATE_RET( d != NULL ); ECDSA_VALIDATE_RET( f_rng != NULL ); ECDSA_VALIDATE_RET( buf != NULL || blen == 0 ); return( ecdsa_sign_restartable( grp, r, s, d, buf, blen, f_rng, p_rng, NULL ) ); } #endif /* !MBEDTLS_ECDSA_SIGN_ALT */ #if defined(MBEDTLS_ECDSA_DETERMINISTIC) /* * Deterministic signature wrapper */ static int ecdsa_sign_det_restartable( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, mbedtls_md_type_t md_alg, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret; mbedtls_hmac_drbg_context rng_ctx; mbedtls_hmac_drbg_context *p_rng = &rng_ctx; unsigned char data[2 * MBEDTLS_ECP_MAX_BYTES]; size_t grp_len = ( grp->nbits + 7 ) / 8; const mbedtls_md_info_t *md_info; mbedtls_mpi h; if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); mbedtls_mpi_init( &h ); mbedtls_hmac_drbg_init( &rng_ctx ); ECDSA_RS_ENTER( det ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->det != NULL ) { /* redirect to our context */ p_rng = &rs_ctx->det->rng_ctx; /* jump to current step */ if( rs_ctx->det->state == ecdsa_det_sign ) goto sign; } #endif /* MBEDTLS_ECP_RESTARTABLE */ /* Use private key and message hash (reduced) to initialize HMAC_DRBG */ MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( d, data, grp_len ) ); MBEDTLS_MPI_CHK( derive_mpi( grp, &h, buf, blen ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &h, data + grp_len, grp_len ) ); mbedtls_hmac_drbg_seed_buf( p_rng, md_info, data, 2 * grp_len ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->det != NULL ) rs_ctx->det->state = ecdsa_det_sign; sign: #endif #if defined(MBEDTLS_ECDSA_SIGN_ALT) ret = mbedtls_ecdsa_sign( grp, r, s, d, buf, blen, mbedtls_hmac_drbg_random, p_rng ); #else ret = ecdsa_sign_restartable( grp, r, s, d, buf, blen, mbedtls_hmac_drbg_random, p_rng, rs_ctx ); #endif /* MBEDTLS_ECDSA_SIGN_ALT */ cleanup: mbedtls_hmac_drbg_free( &rng_ctx ); mbedtls_mpi_free( &h ); ECDSA_RS_LEAVE( det ); return( ret ); } /* * Deterministic signature wrapper */ int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, const mbedtls_mpi *d, const unsigned char *buf, size_t blen, mbedtls_md_type_t md_alg ) { ECDSA_VALIDATE_RET( grp != NULL ); ECDSA_VALIDATE_RET( r != NULL ); ECDSA_VALIDATE_RET( s != NULL ); ECDSA_VALIDATE_RET( d != NULL ); ECDSA_VALIDATE_RET( buf != NULL || blen == 0 ); return( ecdsa_sign_det_restartable( grp, r, s, d, buf, blen, md_alg, NULL ) ); } #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ #if !defined(MBEDTLS_ECDSA_VERIFY_ALT) /* * Verify ECDSA signature of hashed message (SEC1 4.1.4) * Obviously, compared to SEC1 4.1.3, we skip step 2 (hash message) */ static int ecdsa_verify_restartable( mbedtls_ecp_group *grp, const unsigned char *buf, size_t blen, const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret; mbedtls_mpi e, s_inv, u1, u2; mbedtls_ecp_point R; mbedtls_mpi *pu1 = &u1, *pu2 = &u2; mbedtls_ecp_point_init( &R ); mbedtls_mpi_init( &e ); mbedtls_mpi_init( &s_inv ); mbedtls_mpi_init( &u1 ); mbedtls_mpi_init( &u2 ); /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */ if( grp->N.p == NULL ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); ECDSA_RS_ENTER( ver ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ver != NULL ) { /* redirect to our context */ pu1 = &rs_ctx->ver->u1; pu2 = &rs_ctx->ver->u2; /* jump to current step */ if( rs_ctx->ver->state == ecdsa_ver_muladd ) goto muladd; } #endif /* MBEDTLS_ECP_RESTARTABLE */ /* * Step 1: make sure r and s are in range 1..n-1 */ if( mbedtls_mpi_cmp_int( r, 1 ) < 0 || mbedtls_mpi_cmp_mpi( r, &grp->N ) >= 0 || mbedtls_mpi_cmp_int( s, 1 ) < 0 || mbedtls_mpi_cmp_mpi( s, &grp->N ) >= 0 ) { ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; goto cleanup; } /* * Step 3: derive MPI from hashed message */ MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) ); /* * Step 4: u1 = e / s mod n, u2 = r / s mod n */ ECDSA_BUDGET( MBEDTLS_ECP_OPS_CHK + MBEDTLS_ECP_OPS_INV + 2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &s_inv, s, &grp->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( pu1, &e, &s_inv ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( pu1, pu1, &grp->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( pu2, r, &s_inv ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( pu2, pu2, &grp->N ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ver != NULL ) rs_ctx->ver->state = ecdsa_ver_muladd; muladd: #endif /* * Step 5: R = u1 G + u2 Q */ MBEDTLS_MPI_CHK( mbedtls_ecp_muladd_restartable( grp, &R, pu1, &grp->G, pu2, Q, ECDSA_RS_ECP ) ); if( mbedtls_ecp_is_zero( &R ) ) { ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; goto cleanup; } /* * Step 6: convert xR to an integer (no-op) * Step 7: reduce xR mod n (gives v) */ MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &R.X, &R.X, &grp->N ) ); /* * Step 8: check if v (that is, R.X) is equal to r */ if( mbedtls_mpi_cmp_mpi( &R.X, r ) != 0 ) { ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; goto cleanup; } cleanup: mbedtls_ecp_point_free( &R ); mbedtls_mpi_free( &e ); mbedtls_mpi_free( &s_inv ); mbedtls_mpi_free( &u1 ); mbedtls_mpi_free( &u2 ); ECDSA_RS_LEAVE( ver ); return( ret ); } /* * Verify ECDSA signature of hashed message */ int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp, const unsigned char *buf, size_t blen, const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s) { ECDSA_VALIDATE_RET( grp != NULL ); ECDSA_VALIDATE_RET( Q != NULL ); ECDSA_VALIDATE_RET( r != NULL ); ECDSA_VALIDATE_RET( s != NULL ); ECDSA_VALIDATE_RET( buf != NULL || blen == 0 ); return( ecdsa_verify_restartable( grp, buf, blen, Q, r, s, NULL ) ); } #endif /* !MBEDTLS_ECDSA_VERIFY_ALT */ /* * Convert a signature (given by context) to ASN.1 */ static int ecdsa_signature_to_asn1( const mbedtls_mpi *r, const mbedtls_mpi *s, unsigned char *sig, size_t *slen ) { int ret; unsigned char buf[MBEDTLS_ECDSA_MAX_LEN]; unsigned char *p = buf + sizeof( buf ); size_t len = 0; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, s ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, r ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &p, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &p, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); memcpy( sig, p, len ); *slen = len; return( 0 ); } /* * Compute and write signature */ int mbedtls_ecdsa_write_signature_restartable( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret; mbedtls_mpi r, s; ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); ECDSA_VALIDATE_RET( slen != NULL ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s ); #if defined(MBEDTLS_ECDSA_DETERMINISTIC) (void) f_rng; (void) p_rng; MBEDTLS_MPI_CHK( ecdsa_sign_det_restartable( &ctx->grp, &r, &s, &ctx->d, hash, hlen, md_alg, rs_ctx ) ); #else (void) md_alg; #if defined(MBEDTLS_ECDSA_SIGN_ALT) MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign( &ctx->grp, &r, &s, &ctx->d, hash, hlen, f_rng, p_rng ) ); #else MBEDTLS_MPI_CHK( ecdsa_sign_restartable( &ctx->grp, &r, &s, &ctx->d, hash, hlen, f_rng, p_rng, rs_ctx ) ); #endif /* MBEDTLS_ECDSA_SIGN_ALT */ #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ MBEDTLS_MPI_CHK( ecdsa_signature_to_asn1( &r, &s, sig, slen ) ); cleanup: mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s ); return( ret ); } /* * Compute and write signature */ int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); ECDSA_VALIDATE_RET( slen != NULL ); return( mbedtls_ecdsa_write_signature_restartable( ctx, md_alg, hash, hlen, sig, slen, f_rng, p_rng, NULL ) ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) && \ defined(MBEDTLS_ECDSA_DETERMINISTIC) int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, unsigned char *sig, size_t *slen, mbedtls_md_type_t md_alg ) { ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); ECDSA_VALIDATE_RET( slen != NULL ); return( mbedtls_ecdsa_write_signature( ctx, md_alg, hash, hlen, sig, slen, NULL, NULL ) ); } #endif /* * Read and check signature */ int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, const unsigned char *sig, size_t slen ) { ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); return( mbedtls_ecdsa_read_signature_restartable( ctx, hash, hlen, sig, slen, NULL ) ); } /* * Restartable read and check signature */ int mbedtls_ecdsa_read_signature_restartable( mbedtls_ecdsa_context *ctx, const unsigned char *hash, size_t hlen, const unsigned char *sig, size_t slen, mbedtls_ecdsa_restart_ctx *rs_ctx ) { int ret; unsigned char *p = (unsigned char *) sig; const unsigned char *end = sig + slen; size_t len; mbedtls_mpi r, s; ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( hash != NULL ); ECDSA_VALIDATE_RET( sig != NULL ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &s ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } if( p + len != end ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; goto cleanup; } if( ( ret = mbedtls_asn1_get_mpi( &p, end, &r ) ) != 0 || ( ret = mbedtls_asn1_get_mpi( &p, end, &s ) ) != 0 ) { ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } #if defined(MBEDTLS_ECDSA_VERIFY_ALT) if( ( ret = mbedtls_ecdsa_verify( &ctx->grp, hash, hlen, &ctx->Q, &r, &s ) ) != 0 ) goto cleanup; #else if( ( ret = ecdsa_verify_restartable( &ctx->grp, hash, hlen, &ctx->Q, &r, &s, rs_ctx ) ) != 0 ) goto cleanup; #endif /* MBEDTLS_ECDSA_VERIFY_ALT */ /* At this point we know that the buffer starts with a valid signature. * Return 0 if the buffer just contains the signature, and a specific * error code if the valid signature is followed by more data. */ if( p != end ) ret = MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH; cleanup: mbedtls_mpi_free( &r ); mbedtls_mpi_free( &s ); return( ret ); } #if !defined(MBEDTLS_ECDSA_GENKEY_ALT) /* * Generate key pair */ int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( f_rng != NULL ); return( mbedtls_ecp_group_load( &ctx->grp, gid ) || mbedtls_ecp_gen_keypair( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) ); } #endif /* !MBEDTLS_ECDSA_GENKEY_ALT */ /* * Set context from an mbedtls_ecp_keypair */ int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key ) { int ret; ECDSA_VALIDATE_RET( ctx != NULL ); ECDSA_VALIDATE_RET( key != NULL ); if( ( ret = mbedtls_ecp_group_copy( &ctx->grp, &key->grp ) ) != 0 || ( ret = mbedtls_mpi_copy( &ctx->d, &key->d ) ) != 0 || ( ret = mbedtls_ecp_copy( &ctx->Q, &key->Q ) ) != 0 ) { mbedtls_ecdsa_free( ctx ); } return( ret ); } /* * Initialize context */ void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx ) { ECDSA_VALIDATE( ctx != NULL ); mbedtls_ecp_keypair_init( ctx ); } /* * Free context */ void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx ) { if( ctx == NULL ) return; mbedtls_ecp_keypair_free( ctx ); } #if defined(MBEDTLS_ECP_RESTARTABLE) /* * Initialize a restart context */ void mbedtls_ecdsa_restart_init( mbedtls_ecdsa_restart_ctx *ctx ) { ECDSA_VALIDATE( ctx != NULL ); mbedtls_ecp_restart_init( &ctx->ecp ); ctx->ver = NULL; ctx->sig = NULL; #if defined(MBEDTLS_ECDSA_DETERMINISTIC) ctx->det = NULL; #endif } /* * Free the components of a restart context */ void mbedtls_ecdsa_restart_free( mbedtls_ecdsa_restart_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_ecp_restart_free( &ctx->ecp ); ecdsa_restart_ver_free( ctx->ver ); mbedtls_free( ctx->ver ); ctx->ver = NULL; ecdsa_restart_sig_free( ctx->sig ); mbedtls_free( ctx->sig ); ctx->sig = NULL; #if defined(MBEDTLS_ECDSA_DETERMINISTIC) ecdsa_restart_det_free( ctx->det ); mbedtls_free( ctx->det ); ctx->det = NULL; #endif } #endif /* MBEDTLS_ECP_RESTARTABLE */ #endif /* MBEDTLS_ECDSA_C */ fldigi-4.2.05/src/mbedtls/ecp.c0000664000175000017500000027156114611711171013133 00000000000000/* * Elliptic curves over GF(p): generic functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * SEC1 http://www.secg.org/index.php?action=secg,docs_secg * GECC = Guide to Elliptic Curve Cryptography - Hankerson, Menezes, Vanstone * FIPS 186-3 http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf * RFC 4492 for the related TLS structures and constants * RFC 7748 for the Curve448 and Curve25519 curve definitions * * [Curve25519] http://cr.yp.to/ecdh/curve25519-20060209.pdf * * [2] CORON, Jean-S'ebastien. Resistance against differential power analysis * for elliptic curve cryptosystems. In : Cryptographic Hardware and * Embedded Systems. Springer Berlin Heidelberg, 1999. p. 292-302. * * * [3] HEDABOU, Mustapha, PINEL, Pierre, et B'EN'ETEAU, Lucien. A comb method to * render ECC resistant against Side Channel Attacks. IACR Cryptology * ePrint Archive, 2004, vol. 2004, p. 342. * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif /** * \brief Function level alternative implementation. * * The MBEDTLS_ECP_INTERNAL_ALT macro enables alternative implementations to * replace certain functions in this module. The alternative implementations are * typically hardware accelerators and need to activate the hardware before the * computation starts and deactivate it after it finishes. The * mbedtls_internal_ecp_init() and mbedtls_internal_ecp_free() functions serve * this purpose. * * To preserve the correct functionality the following conditions must hold: * * - The alternative implementation must be activated by * mbedtls_internal_ecp_init() before any of the replaceable functions is * called. * - mbedtls_internal_ecp_free() must \b only be called when the alternative * implementation is activated. * - mbedtls_internal_ecp_init() must \b not be called when the alternative * implementation is activated. * - Public functions must not return while the alternative implementation is * activated. * - Replaceable functions are guarded by \c MBEDTLS_ECP_XXX_ALT macros and * before calling them an \code if( mbedtls_internal_ecp_grp_capable( grp ) ) * \endcode ensures that the alternative implementation supports the current * group. */ #if defined(MBEDTLS_ECP_INTERNAL_ALT) #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #include "mbedtls/threading.h" #include "mbedtls/platform_util.h" #include #if !defined(MBEDTLS_ECP_ALT) /* Parameter validation macros based on platform_util.h */ #define ECP_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECP_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/ecp_internal.h" #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #if defined(MBEDTLS_SELF_TEST) /* * Counts of point addition and doubling, and field multiplications. * Used to test resistance of point multiplication to simple timing attacks. */ static unsigned long add_count, dbl_count, mul_count; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) /* * Maximum number of "basic operations" to be done in a row. * * Default value 0 means that ECC operations will not yield. * Note that regardless of the value of ecp_max_ops, always at * least one step is performed before yielding. * * Setting ecp_max_ops=1 can be suitable for testing purposes * as it will interrupt computation at all possible points. */ static unsigned ecp_max_ops = 0; /* * Set ecp_max_ops */ void mbedtls_ecp_set_max_ops( unsigned max_ops ) { ecp_max_ops = max_ops; } /* * Check if restart is enabled */ int mbedtls_ecp_restart_is_enabled( void ) { return( ecp_max_ops != 0 ); } /* * Restart sub-context for ecp_mul_comb() */ struct mbedtls_ecp_restart_mul { mbedtls_ecp_point R; /* current intermediate result */ size_t i; /* current index in various loops, 0 outside */ mbedtls_ecp_point *T; /* table for precomputed points */ unsigned char T_size; /* number of points in table T */ enum { /* what were we doing last time we returned? */ ecp_rsm_init = 0, /* nothing so far, dummy initial state */ ecp_rsm_pre_dbl, /* precompute 2^n multiples */ ecp_rsm_pre_norm_dbl, /* normalize precomputed 2^n multiples */ ecp_rsm_pre_add, /* precompute remaining points by adding */ ecp_rsm_pre_norm_add, /* normalize all precomputed points */ ecp_rsm_comb_core, /* ecp_mul_comb_core() */ ecp_rsm_final_norm, /* do the final normalization */ } state; }; /* * Init restart_mul sub-context */ static void ecp_restart_rsm_init( mbedtls_ecp_restart_mul_ctx *ctx ) { mbedtls_ecp_point_init( &ctx->R ); ctx->i = 0; ctx->T = NULL; ctx->T_size = 0; ctx->state = ecp_rsm_init; } /* * Free the components of a restart_mul sub-context */ static void ecp_restart_rsm_free( mbedtls_ecp_restart_mul_ctx *ctx ) { unsigned char i; if( ctx == NULL ) return; mbedtls_ecp_point_free( &ctx->R ); if( ctx->T != NULL ) { for( i = 0; i < ctx->T_size; i++ ) mbedtls_ecp_point_free( ctx->T + i ); mbedtls_free( ctx->T ); } ecp_restart_rsm_init( ctx ); } /* * Restart context for ecp_muladd() */ struct mbedtls_ecp_restart_muladd { mbedtls_ecp_point mP; /* mP value */ mbedtls_ecp_point R; /* R intermediate result */ enum { /* what should we do next? */ ecp_rsma_mul1 = 0, /* first multiplication */ ecp_rsma_mul2, /* second multiplication */ ecp_rsma_add, /* addition */ ecp_rsma_norm, /* normalization */ } state; }; /* * Init restart_muladd sub-context */ static void ecp_restart_ma_init( mbedtls_ecp_restart_muladd_ctx *ctx ) { mbedtls_ecp_point_init( &ctx->mP ); mbedtls_ecp_point_init( &ctx->R ); ctx->state = ecp_rsma_mul1; } /* * Free the components of a restart_muladd sub-context */ static void ecp_restart_ma_free( mbedtls_ecp_restart_muladd_ctx *ctx ) { if( ctx == NULL ) return; mbedtls_ecp_point_free( &ctx->mP ); mbedtls_ecp_point_free( &ctx->R ); ecp_restart_ma_init( ctx ); } /* * Initialize a restart context */ void mbedtls_ecp_restart_init( mbedtls_ecp_restart_ctx *ctx ) { ECP_VALIDATE( ctx != NULL ); ctx->ops_done = 0; ctx->depth = 0; ctx->rsm = NULL; ctx->ma = NULL; } /* * Free the components of a restart context */ void mbedtls_ecp_restart_free( mbedtls_ecp_restart_ctx *ctx ) { if( ctx == NULL ) return; ecp_restart_rsm_free( ctx->rsm ); mbedtls_free( ctx->rsm ); ecp_restart_ma_free( ctx->ma ); mbedtls_free( ctx->ma ); mbedtls_ecp_restart_init( ctx ); } /* * Check if we can do the next step */ int mbedtls_ecp_check_budget( const mbedtls_ecp_group *grp, mbedtls_ecp_restart_ctx *rs_ctx, unsigned ops ) { ECP_VALIDATE_RET( grp != NULL ); if( rs_ctx != NULL && ecp_max_ops != 0 ) { /* scale depending on curve size: the chosen reference is 256-bit, * and multiplication is quadratic. Round to the closest integer. */ if( grp->pbits >= 512 ) ops *= 4; else if( grp->pbits >= 384 ) ops *= 2; /* Avoid infinite loops: always allow first step. * Because of that, however, it's not generally true * that ops_done <= ecp_max_ops, so the check * ops_done > ecp_max_ops below is mandatory. */ if( ( rs_ctx->ops_done != 0 ) && ( rs_ctx->ops_done > ecp_max_ops || ops > ecp_max_ops - rs_ctx->ops_done ) ) { return( MBEDTLS_ERR_ECP_IN_PROGRESS ); } /* update running count */ rs_ctx->ops_done += ops; } return( 0 ); } /* Call this when entering a function that needs its own sub-context */ #define ECP_RS_ENTER( SUB ) do { \ /* reset ops count for this call if top-level */ \ if( rs_ctx != NULL && rs_ctx->depth++ == 0 ) \ rs_ctx->ops_done = 0; \ \ /* set up our own sub-context if needed */ \ if( mbedtls_ecp_restart_is_enabled() && \ rs_ctx != NULL && rs_ctx->SUB == NULL ) \ { \ rs_ctx->SUB = mbedtls_calloc( 1, sizeof( *rs_ctx->SUB ) ); \ if( rs_ctx->SUB == NULL ) \ return( MBEDTLS_ERR_ECP_ALLOC_FAILED ); \ \ ecp_restart_## SUB ##_init( rs_ctx->SUB ); \ } \ } while( 0 ) /* Call this when leaving a function that needs its own sub-context */ #define ECP_RS_LEAVE( SUB ) do { \ /* clear our sub-context when not in progress (done or error) */ \ if( rs_ctx != NULL && rs_ctx->SUB != NULL && \ ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) \ { \ ecp_restart_## SUB ##_free( rs_ctx->SUB ); \ mbedtls_free( rs_ctx->SUB ); \ rs_ctx->SUB = NULL; \ } \ \ if( rs_ctx != NULL ) \ rs_ctx->depth--; \ } while( 0 ) #else /* MBEDTLS_ECP_RESTARTABLE */ #define ECP_RS_ENTER( sub ) (void) rs_ctx; #define ECP_RS_LEAVE( sub ) (void) rs_ctx; #endif /* MBEDTLS_ECP_RESTARTABLE */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) #define ECP_SHORTWEIERSTRASS #endif #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) || \ defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) #define ECP_MONTGOMERY #endif /* * Curve types: internal for now, might be exposed later */ typedef enum { ECP_TYPE_NONE = 0, ECP_TYPE_SHORT_WEIERSTRASS, /* y^2 = x^3 + a x + b */ ECP_TYPE_MONTGOMERY, /* y^2 = x^3 + a x^2 + x */ } ecp_curve_type; /* * List of supported curves: * - internal ID * - TLS NamedCurve ID (RFC 4492 sec. 5.1.1, RFC 7071 sec. 2) * - size in bits * - readable name * * Curves are listed in order: largest curves first, and for a given size, * fastest curves first. This provides the default order for the SSL module. * * Reminder: update profiles in x509_crt.c when adding a new curves! */ static const mbedtls_ecp_curve_info ecp_supported_curves[] = { #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) { MBEDTLS_ECP_DP_SECP521R1, 25, 521, "secp521r1" }, #endif #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) { MBEDTLS_ECP_DP_BP512R1, 28, 512, "brainpoolP512r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) { MBEDTLS_ECP_DP_SECP384R1, 24, 384, "secp384r1" }, #endif #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) { MBEDTLS_ECP_DP_BP384R1, 27, 384, "brainpoolP384r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) { MBEDTLS_ECP_DP_SECP256R1, 23, 256, "secp256r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) { MBEDTLS_ECP_DP_SECP256K1, 22, 256, "secp256k1" }, #endif #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) { MBEDTLS_ECP_DP_BP256R1, 26, 256, "brainpoolP256r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) { MBEDTLS_ECP_DP_SECP224R1, 21, 224, "secp224r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) { MBEDTLS_ECP_DP_SECP224K1, 20, 224, "secp224k1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) { MBEDTLS_ECP_DP_SECP192R1, 19, 192, "secp192r1" }, #endif #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) { MBEDTLS_ECP_DP_SECP192K1, 18, 192, "secp192k1" }, #endif { MBEDTLS_ECP_DP_NONE, 0, 0, NULL }, }; #define ECP_NB_CURVES sizeof( ecp_supported_curves ) / \ sizeof( ecp_supported_curves[0] ) static mbedtls_ecp_group_id ecp_supported_grp_id[ECP_NB_CURVES]; /* * List of supported curves and associated info */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void ) { return( ecp_supported_curves ); } /* * List of supported curves, group ID only */ const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void ) { static int init_done = 0; if( ! init_done ) { size_t i = 0; const mbedtls_ecp_curve_info *curve_info; for( curve_info = mbedtls_ecp_curve_list(); curve_info->grp_id != MBEDTLS_ECP_DP_NONE; curve_info++ ) { ecp_supported_grp_id[i++] = curve_info->grp_id; } ecp_supported_grp_id[i] = MBEDTLS_ECP_DP_NONE; init_done = 1; } return( ecp_supported_grp_id ); } /* * Get the curve info for the internal identifier */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id ) { const mbedtls_ecp_curve_info *curve_info; for( curve_info = mbedtls_ecp_curve_list(); curve_info->grp_id != MBEDTLS_ECP_DP_NONE; curve_info++ ) { if( curve_info->grp_id == grp_id ) return( curve_info ); } return( NULL ); } /* * Get the curve info from the TLS identifier */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id ) { const mbedtls_ecp_curve_info *curve_info; for( curve_info = mbedtls_ecp_curve_list(); curve_info->grp_id != MBEDTLS_ECP_DP_NONE; curve_info++ ) { if( curve_info->tls_id == tls_id ) return( curve_info ); } return( NULL ); } /* * Get the curve info from the name */ const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name ) { const mbedtls_ecp_curve_info *curve_info; if( name == NULL ) return( NULL ); for( curve_info = mbedtls_ecp_curve_list(); curve_info->grp_id != MBEDTLS_ECP_DP_NONE; curve_info++ ) { if( strcmp( curve_info->name, name ) == 0 ) return( curve_info ); } return( NULL ); } /* * Get the type of a curve */ static inline ecp_curve_type ecp_get_type( const mbedtls_ecp_group *grp ) { if( grp->G.X.p == NULL ) return( ECP_TYPE_NONE ); if( grp->G.Y.p == NULL ) return( ECP_TYPE_MONTGOMERY ); else return( ECP_TYPE_SHORT_WEIERSTRASS ); } /* * Initialize (the components of) a point */ void mbedtls_ecp_point_init( mbedtls_ecp_point *pt ) { ECP_VALIDATE( pt != NULL ); mbedtls_mpi_init( &pt->X ); mbedtls_mpi_init( &pt->Y ); mbedtls_mpi_init( &pt->Z ); } /* * Initialize (the components of) a group */ void mbedtls_ecp_group_init( mbedtls_ecp_group *grp ) { ECP_VALIDATE( grp != NULL ); grp->id = MBEDTLS_ECP_DP_NONE; mbedtls_mpi_init( &grp->P ); mbedtls_mpi_init( &grp->A ); mbedtls_mpi_init( &grp->B ); mbedtls_ecp_point_init( &grp->G ); mbedtls_mpi_init( &grp->N ); grp->pbits = 0; grp->nbits = 0; grp->h = 0; grp->modp = NULL; grp->t_pre = NULL; grp->t_post = NULL; grp->t_data = NULL; grp->T = NULL; grp->T_size = 0; } /* * Initialize (the components of) a key pair */ void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key ) { ECP_VALIDATE( key != NULL ); mbedtls_ecp_group_init( &key->grp ); mbedtls_mpi_init( &key->d ); mbedtls_ecp_point_init( &key->Q ); } /* * Unallocate (the components of) a point */ void mbedtls_ecp_point_free( mbedtls_ecp_point *pt ) { if( pt == NULL ) return; mbedtls_mpi_free( &( pt->X ) ); mbedtls_mpi_free( &( pt->Y ) ); mbedtls_mpi_free( &( pt->Z ) ); } /* * Unallocate (the components of) a group */ void mbedtls_ecp_group_free( mbedtls_ecp_group *grp ) { size_t i; if( grp == NULL ) return; if( grp->h != 1 ) { mbedtls_mpi_free( &grp->P ); mbedtls_mpi_free( &grp->A ); mbedtls_mpi_free( &grp->B ); mbedtls_ecp_point_free( &grp->G ); mbedtls_mpi_free( &grp->N ); } if( grp->T != NULL ) { for( i = 0; i < grp->T_size; i++ ) mbedtls_ecp_point_free( &grp->T[i] ); mbedtls_free( grp->T ); } mbedtls_platform_zeroize( grp, sizeof( mbedtls_ecp_group ) ); } /* * Unallocate (the components of) a key pair */ void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key ) { if( key == NULL ) return; mbedtls_ecp_group_free( &key->grp ); mbedtls_mpi_free( &key->d ); mbedtls_ecp_point_free( &key->Q ); } /* * Copy the contents of a point */ int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ) { int ret; ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( Q != NULL ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->X, &Q->X ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->Y, &Q->Y ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->Z, &Q->Z ) ); cleanup: return( ret ); } /* * Copy the contents of a group object */ int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src ) { ECP_VALIDATE_RET( dst != NULL ); ECP_VALIDATE_RET( src != NULL ); return( mbedtls_ecp_group_load( dst, src->id ) ); } /* * Set point to zero */ int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt ) { int ret; ECP_VALIDATE_RET( pt != NULL ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->X , 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Y , 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z , 0 ) ); cleanup: return( ret ); } /* * Tell if a point is zero */ int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt ) { ECP_VALIDATE_RET( pt != NULL ); return( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 ); } /* * Compare two points lazily */ int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ) { ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( Q != NULL ); if( mbedtls_mpi_cmp_mpi( &P->X, &Q->X ) == 0 && mbedtls_mpi_cmp_mpi( &P->Y, &Q->Y ) == 0 && mbedtls_mpi_cmp_mpi( &P->Z, &Q->Z ) == 0 ) { return( 0 ); } return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } /* * Import a non-zero point from ASCII strings */ int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix, const char *x, const char *y ) { int ret; ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( x != NULL ); ECP_VALIDATE_RET( y != NULL ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->X, radix, x ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->Y, radix, y ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &P->Z, 1 ) ); cleanup: return( ret ); } /* * Export a point into unsigned binary data (SEC1 2.3.3) */ int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P, int format, size_t *olen, unsigned char *buf, size_t buflen ) { int ret = 0; size_t plen; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( olen != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( format == MBEDTLS_ECP_PF_UNCOMPRESSED || format == MBEDTLS_ECP_PF_COMPRESSED ); /* * Common case: P == 0 */ if( mbedtls_mpi_cmp_int( &P->Z, 0 ) == 0 ) { if( buflen < 1 ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); buf[0] = 0x00; *olen = 1; return( 0 ); } plen = mbedtls_mpi_size( &grp->P ); if( format == MBEDTLS_ECP_PF_UNCOMPRESSED ) { *olen = 2 * plen + 1; if( buflen < *olen ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); buf[0] = 0x04; MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->X, buf + 1, plen ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->Y, buf + 1 + plen, plen ) ); } else if( format == MBEDTLS_ECP_PF_COMPRESSED ) { *olen = plen + 1; if( buflen < *olen ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); buf[0] = 0x02 + mbedtls_mpi_get_bit( &P->Y, 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->X, buf + 1, plen ) ); } cleanup: return( ret ); } /* * Import a point from unsigned binary data (SEC1 2.3.4) */ int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, const unsigned char *buf, size_t ilen ) { int ret; size_t plen; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( pt != NULL ); ECP_VALIDATE_RET( buf != NULL ); if( ilen < 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); if( buf[0] == 0x00 ) { if( ilen == 1 ) return( mbedtls_ecp_set_zero( pt ) ); else return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } plen = mbedtls_mpi_size( &grp->P ); if( buf[0] != 0x04 ) return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); if( ilen != 2 * plen + 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pt->X, buf + 1, plen ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pt->Y, buf + 1 + plen, plen ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z, 1 ) ); cleanup: return( ret ); } /* * Import a point from a TLS ECPoint record (RFC 4492) * struct { * opaque point <1..2^8-1>; * } ECPoint; */ int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, const unsigned char **buf, size_t buf_len ) { unsigned char data_len; const unsigned char *buf_start; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( pt != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( *buf != NULL ); /* * We must have at least two bytes (1 for length, at least one for data) */ if( buf_len < 2 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); data_len = *(*buf)++; if( data_len < 1 || data_len > buf_len - 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * Save buffer start for read_binary and update buf */ buf_start = *buf; *buf += data_len; return( mbedtls_ecp_point_read_binary( grp, pt, buf_start, data_len ) ); } /* * Export a point as a TLS ECPoint record (RFC 4492) * struct { * opaque point <1..2^8-1>; * } ECPoint; */ int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt, int format, size_t *olen, unsigned char *buf, size_t blen ) { int ret; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( pt != NULL ); ECP_VALIDATE_RET( olen != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( format == MBEDTLS_ECP_PF_UNCOMPRESSED || format == MBEDTLS_ECP_PF_COMPRESSED ); /* * buffer length must be at least one, for our length byte */ if( blen < 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); if( ( ret = mbedtls_ecp_point_write_binary( grp, pt, format, olen, buf + 1, blen - 1) ) != 0 ) return( ret ); /* * write length to the first byte and update total length */ buf[0] = (unsigned char) *olen; ++*olen; return( 0 ); } /* * Set a group from an ECParameters record (RFC 4492) */ int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len ) { int ret; mbedtls_ecp_group_id grp_id; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( *buf != NULL ); if( ( ret = mbedtls_ecp_tls_read_group_id( &grp_id, buf, len ) ) != 0 ) return( ret ); return( mbedtls_ecp_group_load( grp, grp_id ) ); } /* * Read a group id from an ECParameters record (RFC 4492) and convert it to * mbedtls_ecp_group_id. */ int mbedtls_ecp_tls_read_group_id( mbedtls_ecp_group_id *grp, const unsigned char **buf, size_t len ) { uint16_t tls_id; const mbedtls_ecp_curve_info *curve_info; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( *buf != NULL ); /* * We expect at least three bytes (see below) */ if( len < 3 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * First byte is curve_type; only named_curve is handled */ if( *(*buf)++ != MBEDTLS_ECP_TLS_NAMED_CURVE ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * Next two bytes are the namedcurve value */ tls_id = *(*buf)++; tls_id <<= 8; tls_id |= *(*buf)++; if( ( curve_info = mbedtls_ecp_curve_info_from_tls_id( tls_id ) ) == NULL ) return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); *grp = curve_info->grp_id; return( 0 ); } /* * Write the ECParameters record corresponding to a group (RFC 4492) */ int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen, unsigned char *buf, size_t blen ) { const mbedtls_ecp_curve_info *curve_info; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( buf != NULL ); ECP_VALIDATE_RET( olen != NULL ); if( ( curve_info = mbedtls_ecp_curve_info_from_grp_id( grp->id ) ) == NULL ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * We are going to write 3 bytes (see below) */ *olen = 3; if( blen < *olen ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); /* * First byte is curve_type, always named_curve */ *buf++ = MBEDTLS_ECP_TLS_NAMED_CURVE; /* * Next two bytes are the namedcurve value */ buf[0] = curve_info->tls_id >> 8; buf[1] = curve_info->tls_id & 0xFF; return( 0 ); } /* * Wrapper around fast quasi-modp functions, with fall-back to mbedtls_mpi_mod_mpi. * See the documentation of struct mbedtls_ecp_group. * * This function is in the critial loop for mbedtls_ecp_mul, so pay attention to perf. */ static int ecp_modp( mbedtls_mpi *N, const mbedtls_ecp_group *grp ) { int ret; if( grp->modp == NULL ) return( mbedtls_mpi_mod_mpi( N, N, &grp->P ) ); /* N->s < 0 is a much faster test, which fails only if N is 0 */ if( ( N->s < 0 && mbedtls_mpi_cmp_int( N, 0 ) != 0 ) || mbedtls_mpi_bitlen( N ) > 2 * grp->pbits ) { return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } MBEDTLS_MPI_CHK( grp->modp( N ) ); /* N->s < 0 is a much faster test, which fails only if N is 0 */ while( N->s < 0 && mbedtls_mpi_cmp_int( N, 0 ) != 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &grp->P ) ); while( mbedtls_mpi_cmp_mpi( N, &grp->P ) >= 0 ) /* we known P, N and the result are positive */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( N, N, &grp->P ) ); cleanup: return( ret ); } /* * Fast mod-p functions expect their argument to be in the 0..p^2 range. * * In order to guarantee that, we need to ensure that operands of * mbedtls_mpi_mul_mpi are in the 0..p range. So, after each operation we will * bring the result back to this range. * * The following macros are shortcuts for doing that. */ /* * Reduce a mbedtls_mpi mod p in-place, general case, to use after mbedtls_mpi_mul_mpi */ #if defined(MBEDTLS_SELF_TEST) #define INC_MUL_COUNT mul_count++; #else #define INC_MUL_COUNT #endif #define MOD_MUL( N ) do { MBEDTLS_MPI_CHK( ecp_modp( &N, grp ) ); INC_MUL_COUNT } \ while( 0 ) /* * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_sub_mpi * N->s < 0 is a very fast test, which fails only if N is 0 */ #define MOD_SUB( N ) \ while( N.s < 0 && mbedtls_mpi_cmp_int( &N, 0 ) != 0 ) \ MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &N, &N, &grp->P ) ) /* * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_add_mpi and mbedtls_mpi_mul_int. * We known P, N and the result are positive, so sub_abs is correct, and * a bit faster. */ #define MOD_ADD( N ) \ while( mbedtls_mpi_cmp_mpi( &N, &grp->P ) >= 0 ) \ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &N, &N, &grp->P ) ) #if defined(ECP_SHORTWEIERSTRASS) /* * For curves in short Weierstrass form, we do all the internal operations in * Jacobian coordinates. * * For multiplication, we'll use a comb method with coutermeasueres against * SPA, hence timing attacks. */ /* * Normalize jacobian coordinates so that Z == 0 || Z == 1 (GECC 3.2.1) * Cost: 1N := 1I + 3M + 1S */ static int ecp_normalize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt ) { int ret; mbedtls_mpi Zi, ZZi; if( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 ) return( 0 ); #if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_normalize_jac( grp, pt ) ); #endif /* MBEDTLS_ECP_NORMALIZE_JAC_ALT */ mbedtls_mpi_init( &Zi ); mbedtls_mpi_init( &ZZi ); /* * X = X / Z^2 mod p */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &Zi, &pt->Z, &grp->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ZZi, &Zi, &Zi ) ); MOD_MUL( ZZi ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->X, &pt->X, &ZZi ) ); MOD_MUL( pt->X ); /* * Y = Y / Z^3 mod p */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y, &pt->Y, &ZZi ) ); MOD_MUL( pt->Y ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y, &pt->Y, &Zi ) ); MOD_MUL( pt->Y ); /* * Z = 1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z, 1 ) ); cleanup: mbedtls_mpi_free( &Zi ); mbedtls_mpi_free( &ZZi ); return( ret ); } /* * Normalize jacobian coordinates of an array of (pointers to) points, * using Montgomery's trick to perform only one inversion mod P. * (See for example Cohen's "A Course in Computational Algebraic Number * Theory", Algorithm 10.3.4.) * * Warning: fails (returning an error) if one of the points is zero! * This should never happen, see choice of w in ecp_mul_comb(). * * Cost: 1N(t) := 1I + (6t - 3)M + 1S */ static int ecp_normalize_jac_many( const mbedtls_ecp_group *grp, mbedtls_ecp_point *T[], size_t T_size ) { int ret; size_t i; mbedtls_mpi *c, u, Zi, ZZi; if( T_size < 2 ) return( ecp_normalize_jac( grp, *T ) ); #if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_normalize_jac_many( grp, T, T_size ) ); #endif if( ( c = mbedtls_calloc( T_size, sizeof( mbedtls_mpi ) ) ) == NULL ) return( MBEDTLS_ERR_ECP_ALLOC_FAILED ); for( i = 0; i < T_size; i++ ) mbedtls_mpi_init( &c[i] ); mbedtls_mpi_init( &u ); mbedtls_mpi_init( &Zi ); mbedtls_mpi_init( &ZZi ); /* * c[i] = Z_0 * ... * Z_i */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &c[0], &T[0]->Z ) ); for( i = 1; i < T_size; i++ ) { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &c[i], &c[i-1], &T[i]->Z ) ); MOD_MUL( c[i] ); } /* * u = 1 / (Z_0 * ... * Z_n) mod P */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &u, &c[T_size-1], &grp->P ) ); for( i = T_size - 1; ; i-- ) { /* * Zi = 1 / Z_i mod p * u = 1 / (Z_0 * ... * Z_i) mod P */ if( i == 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Zi, &u ) ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &Zi, &u, &c[i-1] ) ); MOD_MUL( Zi ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u, &u, &T[i]->Z ) ); MOD_MUL( u ); } /* * proceed as in normalize() */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ZZi, &Zi, &Zi ) ); MOD_MUL( ZZi ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->X, &T[i]->X, &ZZi ) ); MOD_MUL( T[i]->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->Y, &T[i]->Y, &ZZi ) ); MOD_MUL( T[i]->Y ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->Y, &T[i]->Y, &Zi ) ); MOD_MUL( T[i]->Y ); /* * Post-precessing: reclaim some memory by shrinking coordinates * - not storing Z (always 1) * - shrinking other coordinates, but still keeping the same number of * limbs as P, as otherwise it will too likely be regrown too fast. */ MBEDTLS_MPI_CHK( mbedtls_mpi_shrink( &T[i]->X, grp->P.n ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shrink( &T[i]->Y, grp->P.n ) ); mbedtls_mpi_free( &T[i]->Z ); if( i == 0 ) break; } cleanup: mbedtls_mpi_free( &u ); mbedtls_mpi_free( &Zi ); mbedtls_mpi_free( &ZZi ); for( i = 0; i < T_size; i++ ) mbedtls_mpi_free( &c[i] ); mbedtls_free( c ); return( ret ); } /* * Conditional point inversion: Q -> -Q = (Q.X, -Q.Y, Q.Z) without leak. * "inv" must be 0 (don't invert) or 1 (invert) or the result will be invalid */ static int ecp_safe_invert_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *Q, unsigned char inv ) { int ret; unsigned char nonzero; mbedtls_mpi mQY; mbedtls_mpi_init( &mQY ); /* Use the fact that -Q.Y mod P = P - Q.Y unless Q.Y == 0 */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &mQY, &grp->P, &Q->Y ) ); nonzero = mbedtls_mpi_cmp_int( &Q->Y, 0 ) != 0; MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &Q->Y, &mQY, inv & nonzero ) ); cleanup: mbedtls_mpi_free( &mQY ); return( ret ); } /* * Point doubling R = 2 P, Jacobian coordinates * * Based on http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#doubling-dbl-1998-cmo-2 . * * We follow the variable naming fairly closely. The formula variations that trade a MUL for a SQR * (plus a few ADDs) aren't useful as our bignum implementation doesn't distinguish squaring. * * Standard optimizations are applied when curve parameter A is one of { 0, -3 }. * * Cost: 1D := 3M + 4S (A == 0) * 4M + 4S (A == -3) * 3M + 6S + 1a otherwise */ static int ecp_double_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *P ) { int ret; mbedtls_mpi M, S, T, U; #if defined(MBEDTLS_SELF_TEST) dbl_count++; #endif #if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_double_jac( grp, R, P ) ); #endif /* MBEDTLS_ECP_DOUBLE_JAC_ALT */ mbedtls_mpi_init( &M ); mbedtls_mpi_init( &S ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &U ); /* Special case for A = -3 */ if( grp->A.p == NULL ) { /* M = 3(X + Z^2)(X - Z^2) */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->Z, &P->Z ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &T, &P->X, &S ) ); MOD_ADD( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U, &P->X, &S ) ); MOD_SUB( U ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &T, &U ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &S, 3 ) ); MOD_ADD( M ); } else { /* M = 3.X^2 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->X, &P->X ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &S, 3 ) ); MOD_ADD( M ); /* Optimize away for "koblitz" curves with A = 0 */ if( mbedtls_mpi_cmp_int( &grp->A, 0 ) != 0 ) { /* M += A.Z^4 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->Z, &P->Z ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &S, &S ) ); MOD_MUL( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &T, &grp->A ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &M, &M, &S ) ); MOD_ADD( M ); } } /* S = 4.X.Y^2 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &P->Y, &P->Y ) ); MOD_MUL( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T, 1 ) ); MOD_ADD( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &P->X, &T ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &S, 1 ) ); MOD_ADD( S ); /* U = 8.Y^4 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &U, &T, &T ) ); MOD_MUL( U ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &U, 1 ) ); MOD_ADD( U ); /* T = M^2 - 2.S */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &M, &M ) ); MOD_MUL( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &T, &S ) ); MOD_SUB( T ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &T, &S ) ); MOD_SUB( T ); /* S = M(S - T) - U */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S, &S, &T ) ); MOD_SUB( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S, &S, &M ) ); MOD_MUL( S ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S, &S, &U ) ); MOD_SUB( S ); /* U = 2.Y.Z */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &U, &P->Y, &P->Z ) ); MOD_MUL( U ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &U, 1 ) ); MOD_ADD( U ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->X, &T ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Y, &S ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Z, &U ) ); cleanup: mbedtls_mpi_free( &M ); mbedtls_mpi_free( &S ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &U ); return( ret ); } /* * Addition: R = P + Q, mixed affine-Jacobian coordinates (GECC 3.22) * * The coordinates of Q must be normalized (= affine), * but those of P don't need to. R is not normalized. * * Special cases: (1) P or Q is zero, (2) R is zero, (3) P == Q. * None of these cases can happen as intermediate step in ecp_mul_comb(): * - at each step, P, Q and R are multiples of the base point, the factor * being less than its order, so none of them is zero; * - Q is an odd multiple of the base point, P an even multiple, * due to the choice of precomputed points in the modified comb method. * So branches for these cases do not leak secret information. * * We accept Q->Z being unset (saving memory in tables) as meaning 1. * * Cost: 1A := 8M + 3S */ static int ecp_add_mixed( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ) { int ret; mbedtls_mpi T1, T2, T3, T4, X, Y, Z; #if defined(MBEDTLS_SELF_TEST) add_count++; #endif #if defined(MBEDTLS_ECP_ADD_MIXED_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_add_mixed( grp, R, P, Q ) ); #endif /* MBEDTLS_ECP_ADD_MIXED_ALT */ /* * Trivial cases: P == 0 or Q == 0 (case 1) */ if( mbedtls_mpi_cmp_int( &P->Z, 0 ) == 0 ) return( mbedtls_ecp_copy( R, Q ) ); if( Q->Z.p != NULL && mbedtls_mpi_cmp_int( &Q->Z, 0 ) == 0 ) return( mbedtls_ecp_copy( R, P ) ); /* * Make sure Q coordinates are normalized */ if( Q->Z.p != NULL && mbedtls_mpi_cmp_int( &Q->Z, 1 ) != 0 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 ); mbedtls_mpi_init( &T3 ); mbedtls_mpi_init( &T4 ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &P->Z, &P->Z ) ); MOD_MUL( T1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T2, &T1, &P->Z ) ); MOD_MUL( T2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &T1, &Q->X ) ); MOD_MUL( T1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T2, &T2, &Q->Y ) ); MOD_MUL( T2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T1, &T1, &P->X ) ); MOD_SUB( T1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T2, &T2, &P->Y ) ); MOD_SUB( T2 ); /* Special cases (2) and (3) */ if( mbedtls_mpi_cmp_int( &T1, 0 ) == 0 ) { if( mbedtls_mpi_cmp_int( &T2, 0 ) == 0 ) { ret = ecp_double_jac( grp, R, P ); goto cleanup; } else { ret = mbedtls_ecp_set_zero( R ); goto cleanup; } } MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &Z, &P->Z, &T1 ) ); MOD_MUL( Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3, &T1, &T1 ) ); MOD_MUL( T3 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T4, &T3, &T1 ) ); MOD_MUL( T4 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3, &T3, &P->X ) ); MOD_MUL( T3 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T3, 2 ) ); MOD_ADD( T1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X, &T2, &T2 ) ); MOD_MUL( X ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T1 ) ); MOD_SUB( X ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T4 ) ); MOD_SUB( X ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T3, &T3, &X ) ); MOD_SUB( T3 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3, &T3, &T2 ) ); MOD_MUL( T3 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T4, &T4, &P->Y ) ); MOD_MUL( T4 ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &Y, &T3, &T4 ) ); MOD_SUB( Y ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->X, &X ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Y, &Y ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Z, &Z ) ); cleanup: mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 ); mbedtls_mpi_free( &T3 ); mbedtls_mpi_free( &T4 ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); return( ret ); } /* * Randomize jacobian coordinates: * (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l * This is sort of the reverse operation of ecp_normalize_jac(). * * This countermeasure was first suggested in [2]. */ static int ecp_randomize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi l, ll; size_t p_size; int count = 0; #if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_randomize_jac( grp, pt, f_rng, p_rng ) ); #endif /* MBEDTLS_ECP_RANDOMIZE_JAC_ALT */ p_size = ( grp->pbits + 7 ) / 8; mbedtls_mpi_init( &l ); mbedtls_mpi_init( &ll ); /* Generate l such that 1 < l < p */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &l, p_size, f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &l, &grp->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &l, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_ECP_RANDOM_FAILED ); } while( mbedtls_mpi_cmp_int( &l, 1 ) <= 0 ); /* Z = l * Z */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Z, &pt->Z, &l ) ); MOD_MUL( pt->Z ); /* X = l^2 * X */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ll, &l, &l ) ); MOD_MUL( ll ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->X, &pt->X, &ll ) ); MOD_MUL( pt->X ); /* Y = l^3 * Y */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ll, &ll, &l ) ); MOD_MUL( ll ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y, &pt->Y, &ll ) ); MOD_MUL( pt->Y ); cleanup: mbedtls_mpi_free( &l ); mbedtls_mpi_free( &ll ); return( ret ); } /* * Check and define parameters used by the comb method (see below for details) */ #if MBEDTLS_ECP_WINDOW_SIZE < 2 || MBEDTLS_ECP_WINDOW_SIZE > 7 #error "MBEDTLS_ECP_WINDOW_SIZE out of bounds" #endif /* d = ceil( n / w ) */ #define COMB_MAX_D ( MBEDTLS_ECP_MAX_BITS + 1 ) / 2 /* number of precomputed points */ #define COMB_MAX_PRE ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) /* * Compute the representation of m that will be used with our comb method. * * The basic comb method is described in GECC 3.44 for example. We use a * modified version that provides resistance to SPA by avoiding zero * digits in the representation as in [3]. We modify the method further by * requiring that all K_i be odd, which has the small cost that our * representation uses one more K_i, due to carries, but saves on the size of * the precomputed table. * * Summary of the comb method and its modifications: * * - The goal is to compute m*P for some w*d-bit integer m. * * - The basic comb method splits m into the w-bit integers * x[0] .. x[d-1] where x[i] consists of the bits in m whose * index has residue i modulo d, and computes m * P as * S[x[0]] + 2 * S[x[1]] + .. + 2^(d-1) S[x[d-1]], where * S[i_{w-1} .. i_0] := i_{w-1} 2^{(w-1)d} P + ... + i_1 2^d P + i_0 P. * * - If it happens that, say, x[i+1]=0 (=> S[x[i+1]]=0), one can replace the sum by * .. + 2^{i-1} S[x[i-1]] - 2^i S[x[i]] + 2^{i+1} S[x[i]] + 2^{i+2} S[x[i+2]] .., * thereby successively converting it into a form where all summands * are nonzero, at the cost of negative summands. This is the basic idea of [3]. * * - More generally, even if x[i+1] != 0, we can first transform the sum as * .. - 2^i S[x[i]] + 2^{i+1} ( S[x[i]] + S[x[i+1]] ) + 2^{i+2} S[x[i+2]] .., * and then replace S[x[i]] + S[x[i+1]] = S[x[i] ^ x[i+1]] + 2 S[x[i] & x[i+1]]. * Performing and iterating this procedure for those x[i] that are even * (keeping track of carry), we can transform the original sum into one of the form * S[x'[0]] +- 2 S[x'[1]] +- .. +- 2^{d-1} S[x'[d-1]] + 2^d S[x'[d]] * with all x'[i] odd. It is therefore only necessary to know S at odd indices, * which is why we are only computing half of it in the first place in * ecp_precompute_comb and accessing it with index abs(i) / 2 in ecp_select_comb. * * - For the sake of compactness, only the seven low-order bits of x[i] * are used to represent its absolute value (K_i in the paper), and the msb * of x[i] encodes the sign (s_i in the paper): it is set if and only if * if s_i == -1; * * Calling conventions: * - x is an array of size d + 1 * - w is the size, ie number of teeth, of the comb, and must be between * 2 and 7 (in practice, between 2 and MBEDTLS_ECP_WINDOW_SIZE) * - m is the MPI, expected to be odd and such that bitlength(m) <= w * d * (the result will be incorrect if these assumptions are not satisfied) */ static void ecp_comb_recode_core( unsigned char x[], size_t d, unsigned char w, const mbedtls_mpi *m ) { size_t i, j; unsigned char c, cc, adjust; memset( x, 0, d+1 ); /* First get the classical comb values (except for x_d = 0) */ for( i = 0; i < d; i++ ) for( j = 0; j < w; j++ ) x[i] |= mbedtls_mpi_get_bit( m, i + d * j ) << j; /* Now make sure x_1 .. x_d are odd */ c = 0; for( i = 1; i <= d; i++ ) { /* Add carry and update it */ cc = x[i] & c; x[i] = x[i] ^ c; c = cc; /* Adjust if needed, avoiding branches */ adjust = 1 - ( x[i] & 0x01 ); c |= x[i] & ( x[i-1] * adjust ); x[i] = x[i] ^ ( x[i-1] * adjust ); x[i-1] |= adjust << 7; } } /* * Precompute points for the adapted comb method * * Assumption: T must be able to hold 2^{w - 1} elements. * * Operation: If i = i_{w-1} ... i_1 is the binary representation of i, * sets T[i] = i_{w-1} 2^{(w-1)d} P + ... + i_1 2^d P + P. * * Cost: d(w-1) D + (2^{w-1} - 1) A + 1 N(w-1) + 1 N(2^{w-1} - 1) * * Note: Even comb values (those where P would be omitted from the * sum defining T[i] above) are not needed in our adaption * the comb method. See ecp_comb_recode_core(). * * This function currently works in four steps: * (1) [dbl] Computation of intermediate T[i] for 2-power values of i * (2) [norm_dbl] Normalization of coordinates of these T[i] * (3) [add] Computation of all T[i] * (4) [norm_add] Normalization of all T[i] * * Step 1 can be interrupted but not the others; together with the final * coordinate normalization they are the largest steps done at once, depending * on the window size. Here are operation counts for P-256: * * step (2) (3) (4) * w = 5 142 165 208 * w = 4 136 77 160 * w = 3 130 33 136 * w = 2 124 11 124 * * So if ECC operations are blocking for too long even with a low max_ops * value, it's useful to set MBEDTLS_ECP_WINDOW_SIZE to a lower value in order * to minimize maximum blocking time. */ static int ecp_precompute_comb( const mbedtls_ecp_group *grp, mbedtls_ecp_point T[], const mbedtls_ecp_point *P, unsigned char w, size_t d, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; unsigned char i; size_t j = 0; const unsigned char T_size = 1U << ( w - 1 ); mbedtls_ecp_point *cur, *TT[COMB_MAX_PRE - 1]; #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) { if( rs_ctx->rsm->state == ecp_rsm_pre_dbl ) goto dbl; if( rs_ctx->rsm->state == ecp_rsm_pre_norm_dbl ) goto norm_dbl; if( rs_ctx->rsm->state == ecp_rsm_pre_add ) goto add; if( rs_ctx->rsm->state == ecp_rsm_pre_norm_add ) goto norm_add; } #else (void) rs_ctx; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) { rs_ctx->rsm->state = ecp_rsm_pre_dbl; /* initial state for the loop */ rs_ctx->rsm->i = 0; } dbl: #endif /* * Set T[0] = P and * T[2^{l-1}] = 2^{dl} P for l = 1 .. w-1 (this is not the final value) */ MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &T[0], P ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->i != 0 ) j = rs_ctx->rsm->i; else #endif j = 0; for( ; j < d * ( w - 1 ); j++ ) { MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_DBL ); i = 1U << ( j / d ); cur = T + i; if( j % d == 0 ) MBEDTLS_MPI_CHK( mbedtls_ecp_copy( cur, T + ( i >> 1 ) ) ); MBEDTLS_MPI_CHK( ecp_double_jac( grp, cur, cur ) ); } #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) rs_ctx->rsm->state = ecp_rsm_pre_norm_dbl; norm_dbl: #endif /* * Normalize current elements in T. As T has holes, * use an auxiliary array of pointers to elements in T. */ j = 0; for( i = 1; i < T_size; i <<= 1 ) TT[j++] = T + i; MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_INV + 6 * j - 2 ); MBEDTLS_MPI_CHK( ecp_normalize_jac_many( grp, TT, j ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) rs_ctx->rsm->state = ecp_rsm_pre_add; add: #endif /* * Compute the remaining ones using the minimal number of additions * Be careful to update T[2^l] only after using it! */ MBEDTLS_ECP_BUDGET( ( T_size - 1 ) * MBEDTLS_ECP_OPS_ADD ); for( i = 1; i < T_size; i <<= 1 ) { j = i; while( j-- ) MBEDTLS_MPI_CHK( ecp_add_mixed( grp, &T[i + j], &T[j], &T[i] ) ); } #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) rs_ctx->rsm->state = ecp_rsm_pre_norm_add; norm_add: #endif /* * Normalize final elements in T. Even though there are no holes now, we * still need the auxiliary array for homogeneity with the previous * call. Also, skip T[0] which is already normalised, being a copy of P. */ for( j = 0; j + 1 < T_size; j++ ) TT[j] = T + j + 1; MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_INV + 6 * j - 2 ); MBEDTLS_MPI_CHK( ecp_normalize_jac_many( grp, TT, j ) ); cleanup: #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { if( rs_ctx->rsm->state == ecp_rsm_pre_dbl ) rs_ctx->rsm->i = j; } #endif return( ret ); } /* * Select precomputed point: R = sign(i) * T[ abs(i) / 2 ] * * See ecp_comb_recode_core() for background */ static int ecp_select_comb( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point T[], unsigned char T_size, unsigned char i ) { int ret; unsigned char ii, j; /* Ignore the "sign" bit and scale down */ ii = ( i & 0x7Fu ) >> 1; /* Read the whole table to thwart cache-based timing attacks */ for( j = 0; j < T_size; j++ ) { MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &R->X, &T[j].X, j == ii ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &R->Y, &T[j].Y, j == ii ) ); } /* Safely invert result if i is "negative" */ MBEDTLS_MPI_CHK( ecp_safe_invert_jac( grp, R, i >> 7 ) ); cleanup: return( ret ); } /* * Core multiplication algorithm for the (modified) comb method. * This part is actually common with the basic comb method (GECC 3.44) * * Cost: d A + d D + 1 R */ static int ecp_mul_comb_core( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point T[], unsigned char T_size, const unsigned char x[], size_t d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; mbedtls_ecp_point Txi; size_t i; mbedtls_ecp_point_init( &Txi ); #if !defined(MBEDTLS_ECP_RESTARTABLE) (void) rs_ctx; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->state != ecp_rsm_comb_core ) { rs_ctx->rsm->i = 0; rs_ctx->rsm->state = ecp_rsm_comb_core; } /* new 'if' instead of nested for the sake of the 'else' branch */ if( rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->i != 0 ) { /* restore current index (R already pointing to rs_ctx->rsm->R) */ i = rs_ctx->rsm->i; } else #endif { /* Start with a non-zero point and randomize its coordinates */ i = d; MBEDTLS_MPI_CHK( ecp_select_comb( grp, R, T, T_size, x[i] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->Z, 1 ) ); if( f_rng != 0 ) MBEDTLS_MPI_CHK( ecp_randomize_jac( grp, R, f_rng, p_rng ) ); } while( i != 0 ) { MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_DBL + MBEDTLS_ECP_OPS_ADD ); --i; MBEDTLS_MPI_CHK( ecp_double_jac( grp, R, R ) ); MBEDTLS_MPI_CHK( ecp_select_comb( grp, &Txi, T, T_size, x[i] ) ); MBEDTLS_MPI_CHK( ecp_add_mixed( grp, R, R, &Txi ) ); } cleanup: mbedtls_ecp_point_free( &Txi ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) { rs_ctx->rsm->i = i; /* no need to save R, already pointing to rs_ctx->rsm->R */ } #endif return( ret ); } /* * Recode the scalar to get constant-time comb multiplication * * As the actual scalar recoding needs an odd scalar as a starting point, * this wrapper ensures that by replacing m by N - m if necessary, and * informs the caller that the result of multiplication will be negated. * * This works because we only support large prime order for Short Weierstrass * curves, so N is always odd hence either m or N - m is. * * See ecp_comb_recode_core() for background. */ static int ecp_comb_recode_scalar( const mbedtls_ecp_group *grp, const mbedtls_mpi *m, unsigned char k[COMB_MAX_D + 1], size_t d, unsigned char w, unsigned char *parity_trick ) { int ret; mbedtls_mpi M, mm; mbedtls_mpi_init( &M ); mbedtls_mpi_init( &mm ); /* N is always odd (see above), just make extra sure */ if( mbedtls_mpi_get_bit( &grp->N, 0 ) != 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* do we need the parity trick? */ *parity_trick = ( mbedtls_mpi_get_bit( m, 0 ) == 0 ); /* execute parity fix in constant time */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &M, m ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &mm, &grp->N, m ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &M, &mm, *parity_trick ) ); /* actual scalar recoding */ ecp_comb_recode_core( k, d, w, &M ); cleanup: mbedtls_mpi_free( &mm ); mbedtls_mpi_free( &M ); return( ret ); } /* * Perform comb multiplication (for short Weierstrass curves) * once the auxiliary table has been pre-computed. * * Scalar recoding may use a parity trick that makes us compute -m * P, * if that is the case we'll need to recover m * P at the end. */ static int ecp_mul_comb_after_precomp( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *T, unsigned char T_size, unsigned char w, size_t d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; unsigned char parity_trick; unsigned char k[COMB_MAX_D + 1]; mbedtls_ecp_point *RR = R; #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) { RR = &rs_ctx->rsm->R; if( rs_ctx->rsm->state == ecp_rsm_final_norm ) goto final_norm; } #endif MBEDTLS_MPI_CHK( ecp_comb_recode_scalar( grp, m, k, d, w, &parity_trick ) ); MBEDTLS_MPI_CHK( ecp_mul_comb_core( grp, RR, T, T_size, k, d, f_rng, p_rng, rs_ctx ) ); MBEDTLS_MPI_CHK( ecp_safe_invert_jac( grp, RR, parity_trick ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) rs_ctx->rsm->state = ecp_rsm_final_norm; final_norm: #endif MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_INV ); MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, RR ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL ) MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, RR ) ); #endif cleanup: return( ret ); } /* * Pick window size based on curve size and whether we optimize for base point */ static unsigned char ecp_pick_window_size( const mbedtls_ecp_group *grp, unsigned char p_eq_g ) { unsigned char w; /* * Minimize the number of multiplications, that is minimize * 10 * d * w + 18 * 2^(w-1) + 11 * d + 7 * w, with d = ceil( nbits / w ) * (see costs of the various parts, with 1S = 1M) */ w = grp->nbits >= 384 ? 5 : 4; /* * If P == G, pre-compute a bit more, since this may be re-used later. * Just adding one avoids upping the cost of the first mul too much, * and the memory cost too. */ if( p_eq_g ) w++; /* * Make sure w is within bounds. * (The last test is useful only for very small curves in the test suite.) */ if( w > MBEDTLS_ECP_WINDOW_SIZE ) w = MBEDTLS_ECP_WINDOW_SIZE; if( w >= grp->nbits ) w = 2; return( w ); } /* * Multiplication using the comb method - for curves in short Weierstrass form * * This function is mainly responsible for administrative work: * - managing the restart context if enabled * - managing the table of precomputed points (passed between the below two * functions): allocation, computation, ownership tranfer, freeing. * * It delegates the actual arithmetic work to: * ecp_precompute_comb() and ecp_mul_comb_with_precomp() * * See comments on ecp_comb_recode_core() regarding the computation strategy. */ static int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; unsigned char w, p_eq_g, i; size_t d; unsigned char T_size, T_ok; mbedtls_ecp_point *T; ECP_RS_ENTER( rsm ); /* Is P the base point ? */ #if MBEDTLS_ECP_FIXED_POINT_OPTIM == 1 p_eq_g = ( mbedtls_mpi_cmp_mpi( &P->Y, &grp->G.Y ) == 0 && mbedtls_mpi_cmp_mpi( &P->X, &grp->G.X ) == 0 ); #else p_eq_g = 0; #endif /* Pick window size and deduce related sizes */ w = ecp_pick_window_size( grp, p_eq_g ); T_size = 1U << ( w - 1 ); d = ( grp->nbits + w - 1 ) / w; /* Pre-computed table: do we have it already for the base point? */ if( p_eq_g && grp->T != NULL ) { /* second pointer to the same table, will be deleted on exit */ T = grp->T; T_ok = 1; } else #if defined(MBEDTLS_ECP_RESTARTABLE) /* Pre-computed table: do we have one in progress? complete? */ if( rs_ctx != NULL && rs_ctx->rsm != NULL && rs_ctx->rsm->T != NULL ) { /* transfer ownership of T from rsm to local function */ T = rs_ctx->rsm->T; rs_ctx->rsm->T = NULL; rs_ctx->rsm->T_size = 0; /* This effectively jumps to the call to mul_comb_after_precomp() */ T_ok = rs_ctx->rsm->state >= ecp_rsm_comb_core; } else #endif /* Allocate table if we didn't have any */ { T = mbedtls_calloc( T_size, sizeof( mbedtls_ecp_point ) ); if( T == NULL ) { ret = MBEDTLS_ERR_ECP_ALLOC_FAILED; goto cleanup; } for( i = 0; i < T_size; i++ ) mbedtls_ecp_point_init( &T[i] ); T_ok = 0; } /* Compute table (or finish computing it) if not done already */ if( !T_ok ) { MBEDTLS_MPI_CHK( ecp_precompute_comb( grp, T, P, w, d, rs_ctx ) ); if( p_eq_g ) { /* almost transfer ownership of T to the group, but keep a copy of * the pointer to use for calling the next function more easily */ grp->T = T; grp->T_size = T_size; } } /* Actual comb multiplication using precomputed points */ MBEDTLS_MPI_CHK( ecp_mul_comb_after_precomp( grp, R, m, T, T_size, w, d, f_rng, p_rng, rs_ctx ) ); cleanup: /* does T belong to the group? */ if( T == grp->T ) T = NULL; /* does T belong to the restart context? */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->rsm != NULL && ret == MBEDTLS_ERR_ECP_IN_PROGRESS && T != NULL ) { /* transfer ownership of T from local function to rsm */ rs_ctx->rsm->T_size = T_size; rs_ctx->rsm->T = T; T = NULL; } #endif /* did T belong to us? then let's destroy it! */ if( T != NULL ) { for( i = 0; i < T_size; i++ ) mbedtls_ecp_point_free( &T[i] ); mbedtls_free( T ); } /* don't free R while in progress in case R == P */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) #endif /* prevent caller from using invalid value */ if( ret != 0 ) mbedtls_ecp_point_free( R ); ECP_RS_LEAVE( rsm ); return( ret ); } #endif /* ECP_SHORTWEIERSTRASS */ #if defined(ECP_MONTGOMERY) /* * For Montgomery curves, we do all the internal arithmetic in projective * coordinates. Import/export of points uses only the x coordinates, which is * internaly represented as X / Z. * * For scalar multiplication, we'll use a Montgomery ladder. */ /* * Normalize Montgomery x/z coordinates: X = X/Z, Z = 1 * Cost: 1M + 1I */ static int ecp_normalize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P ) { int ret; #if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_normalize_mxz( grp, P ) ); #endif /* MBEDTLS_ECP_NORMALIZE_MXZ_ALT */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &P->Z, &P->Z, &grp->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->X, &P->X, &P->Z ) ); MOD_MUL( P->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &P->Z, 1 ) ); cleanup: return( ret ); } /* * Randomize projective x/z coordinates: * (X, Z) -> (l X, l Z) for random l * This is sort of the reverse operation of ecp_normalize_mxz(). * * This countermeasure was first suggested in [2]. * Cost: 2M */ static int ecp_randomize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi l; size_t p_size; int count = 0; #if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_randomize_mxz( grp, P, f_rng, p_rng ); #endif /* MBEDTLS_ECP_RANDOMIZE_MXZ_ALT */ p_size = ( grp->pbits + 7 ) / 8; mbedtls_mpi_init( &l ); /* Generate l such that 1 < l < p */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &l, p_size, f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &l, &grp->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &l, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_ECP_RANDOM_FAILED ); } while( mbedtls_mpi_cmp_int( &l, 1 ) <= 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->X, &P->X, &l ) ); MOD_MUL( P->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->Z, &P->Z, &l ) ); MOD_MUL( P->Z ); cleanup: mbedtls_mpi_free( &l ); return( ret ); } /* * Double-and-add: R = 2P, S = P + Q, with d = X(P - Q), * for Montgomery curves in x/z coordinates. * * http://www.hyperelliptic.org/EFD/g1p/auto-code/montgom/xz/ladder/mladd-1987-m.op3 * with * d = X1 * P = (X2, Z2) * Q = (X3, Z3) * R = (X4, Z4) * S = (X5, Z5) * and eliminating temporary variables tO, ..., t4. * * Cost: 5M + 4S */ static int ecp_double_add_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R, mbedtls_ecp_point *S, const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q, const mbedtls_mpi *d ) { int ret; mbedtls_mpi A, AA, B, BB, E, C, D, DA, CB; #if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) if( mbedtls_internal_ecp_grp_capable( grp ) ) return( mbedtls_internal_ecp_double_add_mxz( grp, R, S, P, Q, d ) ); #endif /* MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT */ mbedtls_mpi_init( &A ); mbedtls_mpi_init( &AA ); mbedtls_mpi_init( &B ); mbedtls_mpi_init( &BB ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &C ); mbedtls_mpi_init( &D ); mbedtls_mpi_init( &DA ); mbedtls_mpi_init( &CB ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &A, &P->X, &P->Z ) ); MOD_ADD( A ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &AA, &A, &A ) ); MOD_MUL( AA ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &B, &P->X, &P->Z ) ); MOD_SUB( B ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &BB, &B, &B ) ); MOD_MUL( BB ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &E, &AA, &BB ) ); MOD_SUB( E ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &C, &Q->X, &Q->Z ) ); MOD_ADD( C ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &D, &Q->X, &Q->Z ) ); MOD_SUB( D ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DA, &D, &A ) ); MOD_MUL( DA ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &CB, &C, &B ) ); MOD_MUL( CB ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &S->X, &DA, &CB ) ); MOD_MUL( S->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->X, &S->X, &S->X ) ); MOD_MUL( S->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S->Z, &DA, &CB ) ); MOD_SUB( S->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->Z, &S->Z, &S->Z ) ); MOD_MUL( S->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->Z, d, &S->Z ) ); MOD_MUL( S->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->X, &AA, &BB ) ); MOD_MUL( R->X ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->Z, &grp->A, &E ) ); MOD_MUL( R->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &R->Z, &BB, &R->Z ) ); MOD_ADD( R->Z ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->Z, &E, &R->Z ) ); MOD_MUL( R->Z ); cleanup: mbedtls_mpi_free( &A ); mbedtls_mpi_free( &AA ); mbedtls_mpi_free( &B ); mbedtls_mpi_free( &BB ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &C ); mbedtls_mpi_free( &D ); mbedtls_mpi_free( &DA ); mbedtls_mpi_free( &CB ); return( ret ); } /* * Multiplication with Montgomery ladder in x/z coordinates, * for curves in Montgomery form */ static int ecp_mul_mxz( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; size_t i; unsigned char b; mbedtls_ecp_point RP; mbedtls_mpi PX; mbedtls_ecp_point_init( &RP ); mbedtls_mpi_init( &PX ); /* Save PX and read from P before writing to R, in case P == R */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &PX, &P->X ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &RP, P ) ); /* Set R to zero in modified x/z coordinates */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->X, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->Z, 0 ) ); mbedtls_mpi_free( &R->Y ); /* RP.X might be sligtly larger than P, so reduce it */ MOD_ADD( RP.X ); /* Randomize coordinates of the starting point */ if( f_rng != NULL ) MBEDTLS_MPI_CHK( ecp_randomize_mxz( grp, &RP, f_rng, p_rng ) ); /* Loop invariant: R = result so far, RP = R + P */ i = mbedtls_mpi_bitlen( m ); /* one past the (zero-based) most significant bit */ while( i-- > 0 ) { b = mbedtls_mpi_get_bit( m, i ); /* * if (b) R = 2R + P else R = 2R, * which is: * if (b) double_add( RP, R, RP, R ) * else double_add( R, RP, R, RP ) * but using safe conditional swaps to avoid leaks */ MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->X, &RP.X, b ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->Z, &RP.Z, b ) ); MBEDTLS_MPI_CHK( ecp_double_add_mxz( grp, R, &RP, R, &RP, &PX ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->X, &RP.X, b ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->Z, &RP.Z, b ) ); } MBEDTLS_MPI_CHK( ecp_normalize_mxz( grp, R ) ); cleanup: mbedtls_ecp_point_free( &RP ); mbedtls_mpi_free( &PX ); return( ret ); } #endif /* ECP_MONTGOMERY */ /* * Restartable multiplication R = m * P */ int mbedtls_ecp_mul_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; #if defined(MBEDTLS_ECP_INTERNAL_ALT) char is_grp_capable = 0; #endif ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( R != NULL ); ECP_VALIDATE_RET( m != NULL ); ECP_VALIDATE_RET( P != NULL ); #if defined(MBEDTLS_ECP_RESTARTABLE) /* reset ops count for this call if top-level */ if( rs_ctx != NULL && rs_ctx->depth++ == 0 ) rs_ctx->ops_done = 0; #endif #if defined(MBEDTLS_ECP_INTERNAL_ALT) if( ( is_grp_capable = mbedtls_internal_ecp_grp_capable( grp ) ) ) MBEDTLS_MPI_CHK( mbedtls_internal_ecp_init( grp ) ); #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #if defined(MBEDTLS_ECP_RESTARTABLE) /* skip argument check when restarting */ if( rs_ctx == NULL || rs_ctx->rsm == NULL ) #endif { /* check_privkey is free */ MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_CHK ); /* Common sanity checks */ MBEDTLS_MPI_CHK( mbedtls_ecp_check_privkey( grp, m ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, P ) ); } ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; #if defined(ECP_MONTGOMERY) if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY ) MBEDTLS_MPI_CHK( ecp_mul_mxz( grp, R, m, P, f_rng, p_rng ) ); #endif #if defined(ECP_SHORTWEIERSTRASS) if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS ) MBEDTLS_MPI_CHK( ecp_mul_comb( grp, R, m, P, f_rng, p_rng, rs_ctx ) ); #endif cleanup: #if defined(MBEDTLS_ECP_INTERNAL_ALT) if( is_grp_capable ) mbedtls_internal_ecp_free( grp ); #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL ) rs_ctx->depth--; #endif return( ret ); } /* * Multiplication R = m * P */ int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( R != NULL ); ECP_VALIDATE_RET( m != NULL ); ECP_VALIDATE_RET( P != NULL ); return( mbedtls_ecp_mul_restartable( grp, R, m, P, f_rng, p_rng, NULL ) ); } #if defined(ECP_SHORTWEIERSTRASS) /* * Check that an affine point is valid as a public key, * short weierstrass curves (SEC1 3.2.3.1) */ static int ecp_check_pubkey_sw( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ) { int ret; mbedtls_mpi YY, RHS; /* pt coordinates must be normalized for our checks */ if( mbedtls_mpi_cmp_int( &pt->X, 0 ) < 0 || mbedtls_mpi_cmp_int( &pt->Y, 0 ) < 0 || mbedtls_mpi_cmp_mpi( &pt->X, &grp->P ) >= 0 || mbedtls_mpi_cmp_mpi( &pt->Y, &grp->P ) >= 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); mbedtls_mpi_init( &YY ); mbedtls_mpi_init( &RHS ); /* * YY = Y^2 * RHS = X (X^2 + A) + B = X^3 + A X + B */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &YY, &pt->Y, &pt->Y ) ); MOD_MUL( YY ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &RHS, &pt->X, &pt->X ) ); MOD_MUL( RHS ); /* Special case for A = -3 */ if( grp->A.p == NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &RHS, &RHS, 3 ) ); MOD_SUB( RHS ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &RHS, &RHS, &grp->A ) ); MOD_ADD( RHS ); } MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &RHS, &RHS, &pt->X ) ); MOD_MUL( RHS ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &RHS, &RHS, &grp->B ) ); MOD_ADD( RHS ); if( mbedtls_mpi_cmp_mpi( &YY, &RHS ) != 0 ) ret = MBEDTLS_ERR_ECP_INVALID_KEY; cleanup: mbedtls_mpi_free( &YY ); mbedtls_mpi_free( &RHS ); return( ret ); } #endif /* ECP_SHORTWEIERSTRASS */ /* * R = m * P with shortcuts for m == 1 and m == -1 * NOT constant-time - ONLY for short Weierstrass! */ static int mbedtls_ecp_mul_shortcuts( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; if( mbedtls_mpi_cmp_int( m, 1 ) == 0 ) { MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) ); } else if( mbedtls_mpi_cmp_int( m, -1 ) == 0 ) { MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) ); if( mbedtls_mpi_cmp_int( &R->Y, 0 ) != 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &R->Y, &grp->P, &R->Y ) ); } else { MBEDTLS_MPI_CHK( mbedtls_ecp_mul_restartable( grp, R, m, P, NULL, NULL, rs_ctx ) ); } cleanup: return( ret ); } /* * Restartable linear combination * NOT constant-time */ int mbedtls_ecp_muladd_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, const mbedtls_mpi *n, const mbedtls_ecp_point *Q, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; mbedtls_ecp_point mP; mbedtls_ecp_point *pmP = &mP; mbedtls_ecp_point *pR = R; #if defined(MBEDTLS_ECP_INTERNAL_ALT) char is_grp_capable = 0; #endif ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( R != NULL ); ECP_VALIDATE_RET( m != NULL ); ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( n != NULL ); ECP_VALIDATE_RET( Q != NULL ); if( ecp_get_type( grp ) != ECP_TYPE_SHORT_WEIERSTRASS ) return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); mbedtls_ecp_point_init( &mP ); ECP_RS_ENTER( ma ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) { /* redirect intermediate results to restart context */ pmP = &rs_ctx->ma->mP; pR = &rs_ctx->ma->R; /* jump to next operation */ if( rs_ctx->ma->state == ecp_rsma_mul2 ) goto mul2; if( rs_ctx->ma->state == ecp_rsma_add ) goto add; if( rs_ctx->ma->state == ecp_rsma_norm ) goto norm; } #endif /* MBEDTLS_ECP_RESTARTABLE */ MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, pmP, m, P, rs_ctx ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) rs_ctx->ma->state = ecp_rsma_mul2; mul2: #endif MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, pR, n, Q, rs_ctx ) ); #if defined(MBEDTLS_ECP_INTERNAL_ALT) if( ( is_grp_capable = mbedtls_internal_ecp_grp_capable( grp ) ) ) MBEDTLS_MPI_CHK( mbedtls_internal_ecp_init( grp ) ); #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) rs_ctx->ma->state = ecp_rsma_add; add: #endif MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_ADD ); MBEDTLS_MPI_CHK( ecp_add_mixed( grp, pR, pmP, pR ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) rs_ctx->ma->state = ecp_rsma_norm; norm: #endif MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_INV ); MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, pR ) ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx != NULL && rs_ctx->ma != NULL ) MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, pR ) ); #endif cleanup: #if defined(MBEDTLS_ECP_INTERNAL_ALT) if( is_grp_capable ) mbedtls_internal_ecp_free( grp ); #endif /* MBEDTLS_ECP_INTERNAL_ALT */ mbedtls_ecp_point_free( &mP ); ECP_RS_LEAVE( ma ); return( ret ); } /* * Linear combination * NOT constant-time */ int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, const mbedtls_mpi *n, const mbedtls_ecp_point *Q ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( R != NULL ); ECP_VALIDATE_RET( m != NULL ); ECP_VALIDATE_RET( P != NULL ); ECP_VALIDATE_RET( n != NULL ); ECP_VALIDATE_RET( Q != NULL ); return( mbedtls_ecp_muladd_restartable( grp, R, m, P, n, Q, NULL ) ); } #if defined(ECP_MONTGOMERY) /* * Check validity of a public key for Montgomery curves with x-only schemes */ static int ecp_check_pubkey_mx( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ) { /* [Curve25519 p. 5] Just check X is the correct number of bytes */ /* Allow any public value, if it's too big then we'll just reduce it mod p * (RFC 7748 sec. 5 para. 3). */ if( mbedtls_mpi_size( &pt->X ) > ( grp->nbits + 7 ) / 8 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); return( 0 ); } #endif /* ECP_MONTGOMERY */ /* * Check that a point is valid as a public key */ int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( pt != NULL ); /* Must use affine coordinates */ if( mbedtls_mpi_cmp_int( &pt->Z, 1 ) != 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); #if defined(ECP_MONTGOMERY) if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY ) return( ecp_check_pubkey_mx( grp, pt ) ); #endif #if defined(ECP_SHORTWEIERSTRASS) if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS ) return( ecp_check_pubkey_sw( grp, pt ) ); #endif return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } /* * Check that an mbedtls_mpi is valid as a private key */ int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( d != NULL ); #if defined(ECP_MONTGOMERY) if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY ) { /* see RFC 7748 sec. 5 para. 5 */ if( mbedtls_mpi_get_bit( d, 0 ) != 0 || mbedtls_mpi_get_bit( d, 1 ) != 0 || mbedtls_mpi_bitlen( d ) - 1 != grp->nbits ) /* mbedtls_mpi_bitlen is one-based! */ return( MBEDTLS_ERR_ECP_INVALID_KEY ); /* see [Curve25519] page 5 */ if( grp->nbits == 254 && mbedtls_mpi_get_bit( d, 2 ) != 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); return( 0 ); } #endif /* ECP_MONTGOMERY */ #if defined(ECP_SHORTWEIERSTRASS) if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS ) { /* see SEC1 3.2 */ if( mbedtls_mpi_cmp_int( d, 1 ) < 0 || mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 ) return( MBEDTLS_ERR_ECP_INVALID_KEY ); else return( 0 ); } #endif /* ECP_SHORTWEIERSTRASS */ return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } /* * Generate a private key */ int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp, mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; size_t n_size; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( d != NULL ); ECP_VALIDATE_RET( f_rng != NULL ); n_size = ( grp->nbits + 7 ) / 8; #if defined(ECP_MONTGOMERY) if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY ) { /* [M225] page 5 */ size_t b; do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( d, n_size, f_rng, p_rng ) ); } while( mbedtls_mpi_bitlen( d ) == 0); /* Make sure the most significant bit is nbits */ b = mbedtls_mpi_bitlen( d ) - 1; /* mbedtls_mpi_bitlen is one-based */ if( b > grp->nbits ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( d, b - grp->nbits ) ); else MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, grp->nbits, 1 ) ); /* Make sure the last two bits are unset for Curve448, three bits for Curve25519 */ MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 0, 0 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 1, 0 ) ); if( grp->nbits == 254 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 2, 0 ) ); } } #endif /* ECP_MONTGOMERY */ #if defined(ECP_SHORTWEIERSTRASS) if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS ) { /* SEC1 3.2.1: Generate d such that 1 <= n < N */ int count = 0; /* * Match the procedure given in RFC 6979 (deterministic ECDSA): * - use the same byte ordering; * - keep the leftmost nbits bits of the generated octet string; * - try until result is in the desired range. * This also avoids any biais, which is especially important for ECDSA. */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( d, n_size, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( d, 8 * n_size - grp->nbits ) ); /* * Each try has at worst a probability 1/2 of failing (the msb has * a probability 1/2 of being 0, and then the result will be < N), * so after 30 tries failure probability is a most 2**(-30). * * For most curves, 1 try is enough with overwhelming probability, * since N starts with a lot of 1s in binary, but some curves * such as secp224k1 are actually very close to the worst case. */ if( ++count > 30 ) return( MBEDTLS_ERR_ECP_RANDOM_FAILED ); } while( mbedtls_mpi_cmp_int( d, 1 ) < 0 || mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 ); } #endif /* ECP_SHORTWEIERSTRASS */ cleanup: return( ret ); } /* * Generate a keypair with configurable base point */ int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp, const mbedtls_ecp_point *G, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( d != NULL ); ECP_VALIDATE_RET( G != NULL ); ECP_VALIDATE_RET( Q != NULL ); ECP_VALIDATE_RET( f_rng != NULL ); MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, d, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, Q, d, G, f_rng, p_rng ) ); cleanup: return( ret ); } /* * Generate key pair, wrapper for conventional base point */ int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECP_VALIDATE_RET( grp != NULL ); ECP_VALIDATE_RET( d != NULL ); ECP_VALIDATE_RET( Q != NULL ); ECP_VALIDATE_RET( f_rng != NULL ); return( mbedtls_ecp_gen_keypair_base( grp, &grp->G, d, Q, f_rng, p_rng ) ); } /* * Generate a keypair, prettier wrapper */ int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; ECP_VALIDATE_RET( key != NULL ); ECP_VALIDATE_RET( f_rng != NULL ); if( ( ret = mbedtls_ecp_group_load( &key->grp, grp_id ) ) != 0 ) return( ret ); return( mbedtls_ecp_gen_keypair( &key->grp, &key->d, &key->Q, f_rng, p_rng ) ); } /* * Check a public-private key pair */ int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv ) { int ret; mbedtls_ecp_point Q; mbedtls_ecp_group grp; ECP_VALIDATE_RET( pub != NULL ); ECP_VALIDATE_RET( prv != NULL ); if( pub->grp.id == MBEDTLS_ECP_DP_NONE || pub->grp.id != prv->grp.id || mbedtls_mpi_cmp_mpi( &pub->Q.X, &prv->Q.X ) || mbedtls_mpi_cmp_mpi( &pub->Q.Y, &prv->Q.Y ) || mbedtls_mpi_cmp_mpi( &pub->Q.Z, &prv->Q.Z ) ) { return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } mbedtls_ecp_point_init( &Q ); mbedtls_ecp_group_init( &grp ); /* mbedtls_ecp_mul() needs a non-const group... */ mbedtls_ecp_group_copy( &grp, &prv->grp ); /* Also checks d is valid */ MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &Q, &prv->d, &prv->grp.G, NULL, NULL ) ); if( mbedtls_mpi_cmp_mpi( &Q.X, &prv->Q.X ) || mbedtls_mpi_cmp_mpi( &Q.Y, &prv->Q.Y ) || mbedtls_mpi_cmp_mpi( &Q.Z, &prv->Q.Z ) ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } cleanup: mbedtls_ecp_point_free( &Q ); mbedtls_ecp_group_free( &grp ); return( ret ); } #if defined(MBEDTLS_SELF_TEST) /* * Checkup routine */ int mbedtls_ecp_self_test( int verbose ) { int ret; size_t i; mbedtls_ecp_group grp; mbedtls_ecp_point R, P; mbedtls_mpi m; unsigned long add_c_prev, dbl_c_prev, mul_c_prev; /* exponents especially adapted for secp192r1 */ const char *exponents[] = { "000000000000000000000000000000000000000000000001", /* one */ "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22830", /* N - 1 */ "5EA6F389A38B8BC81E767753B15AA5569E1782E30ABE7D25", /* random */ "400000000000000000000000000000000000000000000000", /* one and zeros */ "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", /* all ones */ "555555555555555555555555555555555555555555555555", /* 101010... */ }; mbedtls_ecp_group_init( &grp ); mbedtls_ecp_point_init( &R ); mbedtls_ecp_point_init( &P ); mbedtls_mpi_init( &m ); /* Use secp192r1 if available, or any available curve */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, MBEDTLS_ECP_DP_SECP192R1 ) ); #else MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, mbedtls_ecp_curve_list()->grp_id ) ); #endif if( verbose != 0 ) mbedtls_printf( " ECP test #1 (constant op_count, base point G): " ); /* Do a dummy multiplication first to trigger precomputation */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &m, 2 ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &P, &m, &grp.G, NULL, NULL ) ); add_count = 0; dbl_count = 0; mul_count = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) ); for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ ) { add_c_prev = add_count; dbl_c_prev = dbl_count; mul_c_prev = mul_count; add_count = 0; dbl_count = 0; mul_count = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) ); if( add_count != add_c_prev || dbl_count != dbl_c_prev || mul_count != mul_c_prev ) { if( verbose != 0 ) mbedtls_printf( "failed (%u)\n", (unsigned int) i ); ret = 1; goto cleanup; } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " ECP test #2 (constant op_count, other point): " ); /* We computed P = 2G last time, use it */ add_count = 0; dbl_count = 0; mul_count = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) ); for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ ) { add_c_prev = add_count; dbl_c_prev = dbl_count; mul_c_prev = mul_count; add_count = 0; dbl_count = 0; mul_count = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) ); if( add_count != add_c_prev || dbl_count != dbl_c_prev || mul_count != mul_c_prev ) { if( verbose != 0 ) mbedtls_printf( "failed (%u)\n", (unsigned int) i ); ret = 1; goto cleanup; } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); cleanup: if( ret < 0 && verbose != 0 ) mbedtls_printf( "Unexpected error, return code = %08X\n", ret ); mbedtls_ecp_group_free( &grp ); mbedtls_ecp_point_free( &R ); mbedtls_ecp_point_free( &P ); mbedtls_mpi_free( &m ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* !MBEDTLS_ECP_ALT */ #endif /* MBEDTLS_ECP_C */ fldigi-4.2.05/src/mbedtls/havege.c0000664000175000017500000002200114611711171013602 00000000000000/** * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The HAVEGE RNG was designed by Andre Seznec in 2002. * * http://www.irisa.fr/caps/projects/hipsor/publi.php * * Contact: seznec(at)irisa_dot_fr - orocheco(at)irisa_dot_fr */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_HAVEGE_C) #include "mbedtls/havege.h" #include "mbedtls/timing.h" #include "mbedtls/platform_util.h" #include /* ------------------------------------------------------------------------ * On average, one iteration accesses two 8-word blocks in the havege WALK * table, and generates 16 words in the RES array. * * The data read in the WALK table is updated and permuted after each use. * The result of the hardware clock counter read is used for this update. * * 25 conditional tests are present. The conditional tests are grouped in * two nested groups of 12 conditional tests and 1 test that controls the * permutation; on average, there should be 6 tests executed and 3 of them * should be mispredicted. * ------------------------------------------------------------------------ */ #define SWAP(X,Y) { int *T = X; X = Y; Y = T; } #define TST1_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; #define TST2_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; #define TST1_LEAVE U1++; } #define TST2_LEAVE U2++; } #define ONE_ITERATION \ \ PTEST = PT1 >> 20; \ \ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ \ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ \ PTX = (PT1 >> 18) & 7; \ PT1 &= 0x1FFF; \ PT2 &= 0x1FFF; \ CLK = (int) mbedtls_timing_hardclock(); \ \ i = 0; \ A = &WALK[PT1 ]; RES[i++] ^= *A; \ B = &WALK[PT2 ]; RES[i++] ^= *B; \ C = &WALK[PT1 ^ 1]; RES[i++] ^= *C; \ D = &WALK[PT2 ^ 4]; RES[i++] ^= *D; \ \ IN = (*A >> (1)) ^ (*A << (31)) ^ CLK; \ *A = (*B >> (2)) ^ (*B << (30)) ^ CLK; \ *B = IN ^ U1; \ *C = (*C >> (3)) ^ (*C << (29)) ^ CLK; \ *D = (*D >> (4)) ^ (*D << (28)) ^ CLK; \ \ A = &WALK[PT1 ^ 2]; RES[i++] ^= *A; \ B = &WALK[PT2 ^ 2]; RES[i++] ^= *B; \ C = &WALK[PT1 ^ 3]; RES[i++] ^= *C; \ D = &WALK[PT2 ^ 6]; RES[i++] ^= *D; \ \ if( PTEST & 1 ) SWAP( A, C ); \ \ IN = (*A >> (5)) ^ (*A << (27)) ^ CLK; \ *A = (*B >> (6)) ^ (*B << (26)) ^ CLK; \ *B = IN; CLK = (int) mbedtls_timing_hardclock(); \ *C = (*C >> (7)) ^ (*C << (25)) ^ CLK; \ *D = (*D >> (8)) ^ (*D << (24)) ^ CLK; \ \ A = &WALK[PT1 ^ 4]; \ B = &WALK[PT2 ^ 1]; \ \ PTEST = PT2 >> 1; \ \ PT2 = (RES[(i - 8) ^ PTY] ^ WALK[PT2 ^ PTY ^ 7]); \ PT2 = ((PT2 & 0x1FFF) & (~8)) ^ ((PT1 ^ 8) & 0x8); \ PTY = (PT2 >> 10) & 7; \ \ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ \ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ \ C = &WALK[PT1 ^ 5]; \ D = &WALK[PT2 ^ 5]; \ \ RES[i++] ^= *A; \ RES[i++] ^= *B; \ RES[i++] ^= *C; \ RES[i++] ^= *D; \ \ IN = (*A >> ( 9)) ^ (*A << (23)) ^ CLK; \ *A = (*B >> (10)) ^ (*B << (22)) ^ CLK; \ *B = IN ^ U2; \ *C = (*C >> (11)) ^ (*C << (21)) ^ CLK; \ *D = (*D >> (12)) ^ (*D << (20)) ^ CLK; \ \ A = &WALK[PT1 ^ 6]; RES[i++] ^= *A; \ B = &WALK[PT2 ^ 3]; RES[i++] ^= *B; \ C = &WALK[PT1 ^ 7]; RES[i++] ^= *C; \ D = &WALK[PT2 ^ 7]; RES[i++] ^= *D; \ \ IN = (*A >> (13)) ^ (*A << (19)) ^ CLK; \ *A = (*B >> (14)) ^ (*B << (18)) ^ CLK; \ *B = IN; \ *C = (*C >> (15)) ^ (*C << (17)) ^ CLK; \ *D = (*D >> (16)) ^ (*D << (16)) ^ CLK; \ \ PT1 = ( RES[( i - 8 ) ^ PTX] ^ \ WALK[PT1 ^ PTX ^ 7] ) & (~1); \ PT1 ^= (PT2 ^ 0x10) & 0x10; \ \ for( n++, i = 0; i < 16; i++ ) \ hs->pool[n % MBEDTLS_HAVEGE_COLLECT_SIZE] ^= RES[i]; /* * Entropy gathering function */ static void havege_fill( mbedtls_havege_state *hs ) { int i, n = 0; int U1, U2, *A, *B, *C, *D; int PT1, PT2, *WALK, RES[16]; int PTX, PTY, CLK, PTEST, IN; WALK = hs->WALK; PT1 = hs->PT1; PT2 = hs->PT2; PTX = U1 = 0; PTY = U2 = 0; (void)PTX; memset( RES, 0, sizeof( RES ) ); while( n < MBEDTLS_HAVEGE_COLLECT_SIZE * 4 ) { ONE_ITERATION ONE_ITERATION ONE_ITERATION ONE_ITERATION } hs->PT1 = PT1; hs->PT2 = PT2; hs->offset[0] = 0; hs->offset[1] = MBEDTLS_HAVEGE_COLLECT_SIZE / 2; } /* * HAVEGE initialization */ void mbedtls_havege_init( mbedtls_havege_state *hs ) { memset( hs, 0, sizeof( mbedtls_havege_state ) ); havege_fill( hs ); } void mbedtls_havege_free( mbedtls_havege_state *hs ) { if( hs == NULL ) return; mbedtls_platform_zeroize( hs, sizeof( mbedtls_havege_state ) ); } /* * HAVEGE rand function */ int mbedtls_havege_random( void *p_rng, unsigned char *buf, size_t len ) { int val; size_t use_len; mbedtls_havege_state *hs = (mbedtls_havege_state *) p_rng; unsigned char *p = buf; while( len > 0 ) { use_len = len; if( use_len > sizeof(int) ) use_len = sizeof(int); if( hs->offset[1] >= MBEDTLS_HAVEGE_COLLECT_SIZE ) havege_fill( hs ); val = hs->pool[hs->offset[0]++]; val ^= hs->pool[hs->offset[1]++]; memcpy( p, &val, use_len ); len -= use_len; p += use_len; } return( 0 ); } #endif /* MBEDTLS_HAVEGE_C */ fldigi-4.2.05/src/mbedtls/md_wrap.c0000664000175000017500000003375514611711171014016 00000000000000/** * \file md_wrap.c * * \brief Generic message digest wrapper for mbed TLS * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD_C) #include "mbedtls/md_internal.h" #if defined(MBEDTLS_MD2_C) #include "mbedtls/md2.h" #endif #if defined(MBEDTLS_MD4_C) #include "mbedtls/md4.h" #endif #if defined(MBEDTLS_MD5_C) #include "mbedtls/md5.h" #endif #if defined(MBEDTLS_RIPEMD160_C) #include "mbedtls/ripemd160.h" #endif #if defined(MBEDTLS_SHA1_C) #include "mbedtls/sha1.h" #endif #if defined(MBEDTLS_SHA256_C) #include "mbedtls/sha256.h" #endif #if defined(MBEDTLS_SHA512_C) #include "mbedtls/sha512.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #if defined(MBEDTLS_MD2_C) static int md2_starts_wrap( void *ctx ) { return( mbedtls_md2_starts_ret( (mbedtls_md2_context *) ctx ) ); } static int md2_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_md2_update_ret( (mbedtls_md2_context *) ctx, input, ilen ) ); } static int md2_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_md2_finish_ret( (mbedtls_md2_context *) ctx, output ) ); } static void *md2_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md2_context ) ); if( ctx != NULL ) mbedtls_md2_init( (mbedtls_md2_context *) ctx ); return( ctx ); } static void md2_ctx_free( void *ctx ) { mbedtls_md2_free( (mbedtls_md2_context *) ctx ); mbedtls_free( ctx ); } static void md2_clone_wrap( void *dst, const void *src ) { mbedtls_md2_clone( (mbedtls_md2_context *) dst, (const mbedtls_md2_context *) src ); } static int md2_process_wrap( void *ctx, const unsigned char *data ) { ((void) data); return( mbedtls_internal_md2_process( (mbedtls_md2_context *) ctx ) ); } const mbedtls_md_info_t mbedtls_md2_info = { MBEDTLS_MD_MD2, "MD2", 16, 16, md2_starts_wrap, md2_update_wrap, md2_finish_wrap, mbedtls_md2_ret, md2_ctx_alloc, md2_ctx_free, md2_clone_wrap, md2_process_wrap, }; #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) static int md4_starts_wrap( void *ctx ) { return( mbedtls_md4_starts_ret( (mbedtls_md4_context *) ctx ) ); } static int md4_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_md4_update_ret( (mbedtls_md4_context *) ctx, input, ilen ) ); } static int md4_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_md4_finish_ret( (mbedtls_md4_context *) ctx, output ) ); } static void *md4_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md4_context ) ); if( ctx != NULL ) mbedtls_md4_init( (mbedtls_md4_context *) ctx ); return( ctx ); } static void md4_ctx_free( void *ctx ) { mbedtls_md4_free( (mbedtls_md4_context *) ctx ); mbedtls_free( ctx ); } static void md4_clone_wrap( void *dst, const void *src ) { mbedtls_md4_clone( (mbedtls_md4_context *) dst, (const mbedtls_md4_context *) src ); } static int md4_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_md4_process( (mbedtls_md4_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_md4_info = { MBEDTLS_MD_MD4, "MD4", 16, 64, md4_starts_wrap, md4_update_wrap, md4_finish_wrap, mbedtls_md4_ret, md4_ctx_alloc, md4_ctx_free, md4_clone_wrap, md4_process_wrap, }; #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) static int md5_starts_wrap( void *ctx ) { return( mbedtls_md5_starts_ret( (mbedtls_md5_context *) ctx ) ); } static int md5_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_md5_update_ret( (mbedtls_md5_context *) ctx, input, ilen ) ); } static int md5_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_md5_finish_ret( (mbedtls_md5_context *) ctx, output ) ); } static void *md5_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md5_context ) ); if( ctx != NULL ) mbedtls_md5_init( (mbedtls_md5_context *) ctx ); return( ctx ); } static void md5_ctx_free( void *ctx ) { mbedtls_md5_free( (mbedtls_md5_context *) ctx ); mbedtls_free( ctx ); } static void md5_clone_wrap( void *dst, const void *src ) { mbedtls_md5_clone( (mbedtls_md5_context *) dst, (const mbedtls_md5_context *) src ); } static int md5_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_md5_process( (mbedtls_md5_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_md5_info = { MBEDTLS_MD_MD5, "MD5", 16, 64, md5_starts_wrap, md5_update_wrap, md5_finish_wrap, mbedtls_md5_ret, md5_ctx_alloc, md5_ctx_free, md5_clone_wrap, md5_process_wrap, }; #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_RIPEMD160_C) static int ripemd160_starts_wrap( void *ctx ) { return( mbedtls_ripemd160_starts_ret( (mbedtls_ripemd160_context *) ctx ) ); } static int ripemd160_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_ripemd160_update_ret( (mbedtls_ripemd160_context *) ctx, input, ilen ) ); } static int ripemd160_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_ripemd160_finish_ret( (mbedtls_ripemd160_context *) ctx, output ) ); } static void *ripemd160_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ripemd160_context ) ); if( ctx != NULL ) mbedtls_ripemd160_init( (mbedtls_ripemd160_context *) ctx ); return( ctx ); } static void ripemd160_ctx_free( void *ctx ) { mbedtls_ripemd160_free( (mbedtls_ripemd160_context *) ctx ); mbedtls_free( ctx ); } static void ripemd160_clone_wrap( void *dst, const void *src ) { mbedtls_ripemd160_clone( (mbedtls_ripemd160_context *) dst, (const mbedtls_ripemd160_context *) src ); } static int ripemd160_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_ripemd160_process( (mbedtls_ripemd160_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_ripemd160_info = { MBEDTLS_MD_RIPEMD160, "RIPEMD160", 20, 64, ripemd160_starts_wrap, ripemd160_update_wrap, ripemd160_finish_wrap, mbedtls_ripemd160_ret, ripemd160_ctx_alloc, ripemd160_ctx_free, ripemd160_clone_wrap, ripemd160_process_wrap, }; #endif /* MBEDTLS_RIPEMD160_C */ #if defined(MBEDTLS_SHA1_C) static int sha1_starts_wrap( void *ctx ) { return( mbedtls_sha1_starts_ret( (mbedtls_sha1_context *) ctx ) ); } static int sha1_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_sha1_update_ret( (mbedtls_sha1_context *) ctx, input, ilen ) ); } static int sha1_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_sha1_finish_ret( (mbedtls_sha1_context *) ctx, output ) ); } static void *sha1_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha1_context ) ); if( ctx != NULL ) mbedtls_sha1_init( (mbedtls_sha1_context *) ctx ); return( ctx ); } static void sha1_clone_wrap( void *dst, const void *src ) { mbedtls_sha1_clone( (mbedtls_sha1_context *) dst, (const mbedtls_sha1_context *) src ); } static void sha1_ctx_free( void *ctx ) { mbedtls_sha1_free( (mbedtls_sha1_context *) ctx ); mbedtls_free( ctx ); } static int sha1_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_sha1_process( (mbedtls_sha1_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_sha1_info = { MBEDTLS_MD_SHA1, "SHA1", 20, 64, sha1_starts_wrap, sha1_update_wrap, sha1_finish_wrap, mbedtls_sha1_ret, sha1_ctx_alloc, sha1_ctx_free, sha1_clone_wrap, sha1_process_wrap, }; #endif /* MBEDTLS_SHA1_C */ /* * Wrappers for generic message digests */ #if defined(MBEDTLS_SHA256_C) static int sha224_starts_wrap( void *ctx ) { return( mbedtls_sha256_starts_ret( (mbedtls_sha256_context *) ctx, 1 ) ); } static int sha224_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_sha256_update_ret( (mbedtls_sha256_context *) ctx, input, ilen ) ); } static int sha224_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_sha256_finish_ret( (mbedtls_sha256_context *) ctx, output ) ); } static int sha224_wrap( const unsigned char *input, size_t ilen, unsigned char *output ) { return( mbedtls_sha256_ret( input, ilen, output, 1 ) ); } static void *sha224_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha256_context ) ); if( ctx != NULL ) mbedtls_sha256_init( (mbedtls_sha256_context *) ctx ); return( ctx ); } static void sha224_ctx_free( void *ctx ) { mbedtls_sha256_free( (mbedtls_sha256_context *) ctx ); mbedtls_free( ctx ); } static void sha224_clone_wrap( void *dst, const void *src ) { mbedtls_sha256_clone( (mbedtls_sha256_context *) dst, (const mbedtls_sha256_context *) src ); } static int sha224_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_sha256_process( (mbedtls_sha256_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_sha224_info = { MBEDTLS_MD_SHA224, "SHA224", 28, 64, sha224_starts_wrap, sha224_update_wrap, sha224_finish_wrap, sha224_wrap, sha224_ctx_alloc, sha224_ctx_free, sha224_clone_wrap, sha224_process_wrap, }; static int sha256_starts_wrap( void *ctx ) { return( mbedtls_sha256_starts_ret( (mbedtls_sha256_context *) ctx, 0 ) ); } static int sha256_wrap( const unsigned char *input, size_t ilen, unsigned char *output ) { return( mbedtls_sha256_ret( input, ilen, output, 0 ) ); } const mbedtls_md_info_t mbedtls_sha256_info = { MBEDTLS_MD_SHA256, "SHA256", 32, 64, sha256_starts_wrap, sha224_update_wrap, sha224_finish_wrap, sha256_wrap, sha224_ctx_alloc, sha224_ctx_free, sha224_clone_wrap, sha224_process_wrap, }; #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) static int sha384_starts_wrap( void *ctx ) { return( mbedtls_sha512_starts_ret( (mbedtls_sha512_context *) ctx, 1 ) ); } static int sha384_update_wrap( void *ctx, const unsigned char *input, size_t ilen ) { return( mbedtls_sha512_update_ret( (mbedtls_sha512_context *) ctx, input, ilen ) ); } static int sha384_finish_wrap( void *ctx, unsigned char *output ) { return( mbedtls_sha512_finish_ret( (mbedtls_sha512_context *) ctx, output ) ); } static int sha384_wrap( const unsigned char *input, size_t ilen, unsigned char *output ) { return( mbedtls_sha512_ret( input, ilen, output, 1 ) ); } static void *sha384_ctx_alloc( void ) { void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha512_context ) ); if( ctx != NULL ) mbedtls_sha512_init( (mbedtls_sha512_context *) ctx ); return( ctx ); } static void sha384_ctx_free( void *ctx ) { mbedtls_sha512_free( (mbedtls_sha512_context *) ctx ); mbedtls_free( ctx ); } static void sha384_clone_wrap( void *dst, const void *src ) { mbedtls_sha512_clone( (mbedtls_sha512_context *) dst, (const mbedtls_sha512_context *) src ); } static int sha384_process_wrap( void *ctx, const unsigned char *data ) { return( mbedtls_internal_sha512_process( (mbedtls_sha512_context *) ctx, data ) ); } const mbedtls_md_info_t mbedtls_sha384_info = { MBEDTLS_MD_SHA384, "SHA384", 48, 128, sha384_starts_wrap, sha384_update_wrap, sha384_finish_wrap, sha384_wrap, sha384_ctx_alloc, sha384_ctx_free, sha384_clone_wrap, sha384_process_wrap, }; static int sha512_starts_wrap( void *ctx ) { return( mbedtls_sha512_starts_ret( (mbedtls_sha512_context *) ctx, 0 ) ); } static int sha512_wrap( const unsigned char *input, size_t ilen, unsigned char *output ) { return( mbedtls_sha512_ret( input, ilen, output, 0 ) ); } const mbedtls_md_info_t mbedtls_sha512_info = { MBEDTLS_MD_SHA512, "SHA512", 64, 128, sha512_starts_wrap, sha384_update_wrap, sha384_finish_wrap, sha512_wrap, sha384_ctx_alloc, sha384_ctx_free, sha384_clone_wrap, sha384_process_wrap, }; #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_MD_C */ fldigi-4.2.05/src/mbedtls/hkdf.c0000664000175000017500000001147014611711171013267 00000000000000/* * HKDF implementation -- RFC 5869 * * Copyright (C) 2016-2018, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_HKDF_C) #include #include "mbedtls/hkdf.h" #include "mbedtls/platform_util.h" int mbedtls_hkdf( const mbedtls_md_info_t *md, const unsigned char *salt, size_t salt_len, const unsigned char *ikm, size_t ikm_len, const unsigned char *info, size_t info_len, unsigned char *okm, size_t okm_len ) { int ret; unsigned char prk[MBEDTLS_MD_MAX_SIZE]; ret = mbedtls_hkdf_extract( md, salt, salt_len, ikm, ikm_len, prk ); if( ret == 0 ) { ret = mbedtls_hkdf_expand( md, prk, mbedtls_md_get_size( md ), info, info_len, okm, okm_len ); } mbedtls_platform_zeroize( prk, sizeof( prk ) ); return( ret ); } int mbedtls_hkdf_extract( const mbedtls_md_info_t *md, const unsigned char *salt, size_t salt_len, const unsigned char *ikm, size_t ikm_len, unsigned char *prk ) { unsigned char null_salt[MBEDTLS_MD_MAX_SIZE] = { '\0' }; if( salt == NULL ) { size_t hash_len; if( salt_len != 0 ) { return MBEDTLS_ERR_HKDF_BAD_INPUT_DATA; } hash_len = mbedtls_md_get_size( md ); if( hash_len == 0 ) { return MBEDTLS_ERR_HKDF_BAD_INPUT_DATA; } salt = null_salt; salt_len = hash_len; } return( mbedtls_md_hmac( md, salt, salt_len, ikm, ikm_len, prk ) ); } int mbedtls_hkdf_expand( const mbedtls_md_info_t *md, const unsigned char *prk, size_t prk_len, const unsigned char *info, size_t info_len, unsigned char *okm, size_t okm_len ) { size_t hash_len; size_t where = 0; size_t n; size_t t_len = 0; size_t i; int ret = 0; mbedtls_md_context_t ctx; unsigned char t[MBEDTLS_MD_MAX_SIZE]; if( okm == NULL ) { return( MBEDTLS_ERR_HKDF_BAD_INPUT_DATA ); } hash_len = mbedtls_md_get_size( md ); if( prk_len < hash_len || hash_len == 0 ) { return( MBEDTLS_ERR_HKDF_BAD_INPUT_DATA ); } if( info == NULL ) { info = (const unsigned char *) ""; info_len = 0; } n = okm_len / hash_len; if( (okm_len % hash_len) != 0 ) { n++; } /* * Per RFC 5869 Section 2.3, okm_len must not exceed * 255 times the hash length */ if( n > 255 ) { return( MBEDTLS_ERR_HKDF_BAD_INPUT_DATA ); } mbedtls_md_init( &ctx ); if( (ret = mbedtls_md_setup( &ctx, md, 1) ) != 0 ) { goto exit; } /* * Compute T = T(1) | T(2) | T(3) | ... | T(N) * Where T(N) is defined in RFC 5869 Section 2.3 */ for( i = 1; i <= n; i++ ) { size_t num_to_copy; unsigned char c = i & 0xff; ret = mbedtls_md_hmac_starts( &ctx, prk, prk_len ); if( ret != 0 ) { goto exit; } ret = mbedtls_md_hmac_update( &ctx, t, t_len ); if( ret != 0 ) { goto exit; } ret = mbedtls_md_hmac_update( &ctx, info, info_len ); if( ret != 0 ) { goto exit; } /* The constant concatenated to the end of each T(n) is a single octet. * */ ret = mbedtls_md_hmac_update( &ctx, &c, 1 ); if( ret != 0 ) { goto exit; } ret = mbedtls_md_hmac_finish( &ctx, t ); if( ret != 0 ) { goto exit; } num_to_copy = i != n ? hash_len : okm_len - where; memcpy( okm + where, t, num_to_copy ); where += hash_len; t_len = hash_len; } exit: mbedtls_md_free( &ctx ); mbedtls_platform_zeroize( t, sizeof( t ) ); return( ret ); } #endif /* MBEDTLS_HKDF_C */ fldigi-4.2.05/src/mbedtls/arc4.c0000664000175000017500000001124714611711171013206 00000000000000/* * An implementation of the ARCFOUR algorithm * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ARCFOUR algorithm was publicly disclosed on 94/09. * * http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ARC4_C) #include "mbedtls/arc4.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_ARC4_ALT) void mbedtls_arc4_init( mbedtls_arc4_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_arc4_context ) ); } void mbedtls_arc4_free( mbedtls_arc4_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_arc4_context ) ); } /* * ARC4 key schedule */ void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key, unsigned int keylen ) { int i, j, a; unsigned int k; unsigned char *m; ctx->x = 0; ctx->y = 0; m = ctx->m; for( i = 0; i < 256; i++ ) m[i] = (unsigned char) i; j = k = 0; for( i = 0; i < 256; i++, k++ ) { if( k >= keylen ) k = 0; a = m[i]; j = ( j + a + key[k] ) & 0xFF; m[i] = m[j]; m[j] = (unsigned char) a; } } /* * ARC4 cipher function */ int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, unsigned char *output ) { int x, y, a, b; size_t i; unsigned char *m; x = ctx->x; y = ctx->y; m = ctx->m; for( i = 0; i < length; i++ ) { x = ( x + 1 ) & 0xFF; a = m[x]; y = ( y + a ) & 0xFF; b = m[y]; m[x] = (unsigned char) b; m[y] = (unsigned char) a; output[i] = (unsigned char) ( input[i] ^ m[(unsigned char)( a + b )] ); } ctx->x = x; ctx->y = y; return( 0 ); } #endif /* !MBEDTLS_ARC4_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * ARC4 tests vectors as posted by Eric Rescorla in sep. 1994: * * http://groups.google.com/group/comp.security.misc/msg/10a300c9d21afca0 */ static const unsigned char arc4_test_key[3][8] = { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; static const unsigned char arc4_test_pt[3][8] = { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; static const unsigned char arc4_test_ct[3][8] = { { 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 }, { 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 }, { 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A } }; /* * Checkup routine */ int mbedtls_arc4_self_test( int verbose ) { int i, ret = 0; unsigned char ibuf[8]; unsigned char obuf[8]; mbedtls_arc4_context ctx; mbedtls_arc4_init( &ctx ); for( i = 0; i < 3; i++ ) { if( verbose != 0 ) mbedtls_printf( " ARC4 test #%d: ", i + 1 ); memcpy( ibuf, arc4_test_pt[i], 8 ); mbedtls_arc4_setup( &ctx, arc4_test_key[i], 8 ); mbedtls_arc4_crypt( &ctx, 8, ibuf, obuf ); if( memcmp( obuf, arc4_test_ct[i], 8 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); exit: mbedtls_arc4_free( &ctx ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_ARC4_C */ fldigi-4.2.05/src/mbedtls/md5.c0000664000175000017500000003164414611711171013045 00000000000000/* * RFC 1321 compliant MD5 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The MD5 algorithm was designed by Ron Rivest in 1991. * * http://www.ietf.org/rfc/rfc1321.txt */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD5_C) #include "mbedtls/md5.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_MD5_ALT) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif void mbedtls_md5_init( mbedtls_md5_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_md5_context ) ); } void mbedtls_md5_free( mbedtls_md5_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md5_context ) ); } void mbedtls_md5_clone( mbedtls_md5_context *dst, const mbedtls_md5_context *src ) { *dst = *src; } /* * MD5 context setup */ int mbedtls_md5_starts_ret( mbedtls_md5_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5_starts( mbedtls_md5_context *ctx ) { mbedtls_md5_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_MD5_PROCESS_ALT) int mbedtls_internal_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ) { uint32_t X[16], A, B, C, D; GET_UINT32_LE( X[ 0], data, 0 ); GET_UINT32_LE( X[ 1], data, 4 ); GET_UINT32_LE( X[ 2], data, 8 ); GET_UINT32_LE( X[ 3], data, 12 ); GET_UINT32_LE( X[ 4], data, 16 ); GET_UINT32_LE( X[ 5], data, 20 ); GET_UINT32_LE( X[ 6], data, 24 ); GET_UINT32_LE( X[ 7], data, 28 ); GET_UINT32_LE( X[ 8], data, 32 ); GET_UINT32_LE( X[ 9], data, 36 ); GET_UINT32_LE( X[10], data, 40 ); GET_UINT32_LE( X[11], data, 44 ); GET_UINT32_LE( X[12], data, 48 ); GET_UINT32_LE( X[13], data, 52 ); GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( X[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) #define P(a,b,c,d,k,s,t) \ { \ a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ } A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; #define F(x,y,z) (z ^ (x & (y ^ z))) P( A, B, C, D, 0, 7, 0xD76AA478 ); P( D, A, B, C, 1, 12, 0xE8C7B756 ); P( C, D, A, B, 2, 17, 0x242070DB ); P( B, C, D, A, 3, 22, 0xC1BDCEEE ); P( A, B, C, D, 4, 7, 0xF57C0FAF ); P( D, A, B, C, 5, 12, 0x4787C62A ); P( C, D, A, B, 6, 17, 0xA8304613 ); P( B, C, D, A, 7, 22, 0xFD469501 ); P( A, B, C, D, 8, 7, 0x698098D8 ); P( D, A, B, C, 9, 12, 0x8B44F7AF ); P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); P( B, C, D, A, 11, 22, 0x895CD7BE ); P( A, B, C, D, 12, 7, 0x6B901122 ); P( D, A, B, C, 13, 12, 0xFD987193 ); P( C, D, A, B, 14, 17, 0xA679438E ); P( B, C, D, A, 15, 22, 0x49B40821 ); #undef F #define F(x,y,z) (y ^ (z & (x ^ y))) P( A, B, C, D, 1, 5, 0xF61E2562 ); P( D, A, B, C, 6, 9, 0xC040B340 ); P( C, D, A, B, 11, 14, 0x265E5A51 ); P( B, C, D, A, 0, 20, 0xE9B6C7AA ); P( A, B, C, D, 5, 5, 0xD62F105D ); P( D, A, B, C, 10, 9, 0x02441453 ); P( C, D, A, B, 15, 14, 0xD8A1E681 ); P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); P( A, B, C, D, 9, 5, 0x21E1CDE6 ); P( D, A, B, C, 14, 9, 0xC33707D6 ); P( C, D, A, B, 3, 14, 0xF4D50D87 ); P( B, C, D, A, 8, 20, 0x455A14ED ); P( A, B, C, D, 13, 5, 0xA9E3E905 ); P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); P( C, D, A, B, 7, 14, 0x676F02D9 ); P( B, C, D, A, 12, 20, 0x8D2A4C8A ); #undef F #define F(x,y,z) (x ^ y ^ z) P( A, B, C, D, 5, 4, 0xFFFA3942 ); P( D, A, B, C, 8, 11, 0x8771F681 ); P( C, D, A, B, 11, 16, 0x6D9D6122 ); P( B, C, D, A, 14, 23, 0xFDE5380C ); P( A, B, C, D, 1, 4, 0xA4BEEA44 ); P( D, A, B, C, 4, 11, 0x4BDECFA9 ); P( C, D, A, B, 7, 16, 0xF6BB4B60 ); P( B, C, D, A, 10, 23, 0xBEBFBC70 ); P( A, B, C, D, 13, 4, 0x289B7EC6 ); P( D, A, B, C, 0, 11, 0xEAA127FA ); P( C, D, A, B, 3, 16, 0xD4EF3085 ); P( B, C, D, A, 6, 23, 0x04881D05 ); P( A, B, C, D, 9, 4, 0xD9D4D039 ); P( D, A, B, C, 12, 11, 0xE6DB99E5 ); P( C, D, A, B, 15, 16, 0x1FA27CF8 ); P( B, C, D, A, 2, 23, 0xC4AC5665 ); #undef F #define F(x,y,z) (y ^ (x | ~z)) P( A, B, C, D, 0, 6, 0xF4292244 ); P( D, A, B, C, 7, 10, 0x432AFF97 ); P( C, D, A, B, 14, 15, 0xAB9423A7 ); P( B, C, D, A, 5, 21, 0xFC93A039 ); P( A, B, C, D, 12, 6, 0x655B59C3 ); P( D, A, B, C, 3, 10, 0x8F0CCC92 ); P( C, D, A, B, 10, 15, 0xFFEFF47D ); P( B, C, D, A, 1, 21, 0x85845DD1 ); P( A, B, C, D, 8, 6, 0x6FA87E4F ); P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); P( C, D, A, B, 6, 15, 0xA3014314 ); P( B, C, D, A, 13, 21, 0x4E0811A1 ); P( A, B, C, D, 4, 6, 0xF7537E82 ); P( D, A, B, C, 11, 10, 0xBD3AF235 ); P( C, D, A, B, 2, 15, 0x2AD7D2BB ); P( B, C, D, A, 9, 21, 0xEB86D391 ); #undef F ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ) { mbedtls_internal_md5_process( ctx, data ); } #endif #endif /* !MBEDTLS_MD5_PROCESS_ALT */ /* * MD5 process buffer */ int mbedtls_md5_update_ret( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_md5_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_md5_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) { memcpy( (void *) (ctx->buffer + left), input, ilen ); } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_md5_update_ret( ctx, input, ilen ); } #endif /* * MD5 final digest */ int mbedtls_md5_finish_ret( mbedtls_md5_context *ctx, unsigned char output[16] ) { int ret; uint32_t used; uint32_t high, low; /* * Add padding: 0x80 then 0x00 until 8 bytes remain for the length */ used = ctx->total[0] & 0x3F; ctx->buffer[used++] = 0x80; if( used <= 56 ) { /* Enough room for padding + length in current block */ memset( ctx->buffer + used, 0, 56 - used ); } else { /* We'll need an extra block */ memset( ctx->buffer + used, 0, 64 - used ); if( ( ret = mbedtls_internal_md5_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); memset( ctx->buffer, 0, 56 ); } /* * Add message length */ high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_LE( low, ctx->buffer, 56 ); PUT_UINT32_LE( high, ctx->buffer, 60 ); if( ( ret = mbedtls_internal_md5_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); /* * Output final state */ PUT_UINT32_LE( ctx->state[0], output, 0 ); PUT_UINT32_LE( ctx->state[1], output, 4 ); PUT_UINT32_LE( ctx->state[2], output, 8 ); PUT_UINT32_LE( ctx->state[3], output, 12 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] ) { mbedtls_md5_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_MD5_ALT */ /* * output = MD5( input buffer ) */ int mbedtls_md5_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ) { int ret; mbedtls_md5_context ctx; mbedtls_md5_init( &ctx ); if( ( ret = mbedtls_md5_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_md5_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] ) { mbedtls_md5_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * RFC 1321 test vectors */ static const unsigned char md5_test_buf[7][81] = { { "" }, { "a" }, { "abc" }, { "message digest" }, { "abcdefghijklmnopqrstuvwxyz" }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, { "12345678901234567890123456789012345678901234567890123456789012" "345678901234567890" } }; static const size_t md5_test_buflen[7] = { 0, 1, 3, 14, 26, 62, 80 }; static const unsigned char md5_test_sum[7][16] = { { 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04, 0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E }, { 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8, 0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 }, { 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0, 0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 }, { 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D, 0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 }, { 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00, 0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B }, { 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5, 0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F }, { 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55, 0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A } }; /* * Checkup routine */ int mbedtls_md5_self_test( int verbose ) { int i, ret = 0; unsigned char md5sum[16]; for( i = 0; i < 7; i++ ) { if( verbose != 0 ) mbedtls_printf( " MD5 test #%d: ", i + 1 ); ret = mbedtls_md5_ret( md5_test_buf[i], md5_test_buflen[i], md5sum ); if( ret != 0 ) goto fail; if( memcmp( md5sum, md5_test_sum[i], 16 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_MD5_C */ fldigi-4.2.05/src/mbedtls/ssl_ciphersuites.c0000664000175000017500000031267414611711171015755 00000000000000/** * \file ssl_ciphersuites.c * * \brief SSL ciphersuites for mbed TLS * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_TLS_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #endif #include "mbedtls/ssl_ciphersuites.h" #include "mbedtls/ssl.h" #include /* * Ordered from most preferred to least preferred in terms of security. * * Current rule (except rc4, weak and null which come last): * 1. By key exchange: * Forward-secure non-PSK > forward-secure PSK > ECJPAKE > other non-PSK > other PSK * 2. By key length and cipher: * ChaCha > AES-256 > Camellia-256 > ARIA-256 > AES-128 > Camellia-128 > ARIA-128 > 3DES * 3. By cipher mode when relevant GCM > CCM > CBC > CCM_8 * 4. By hash function used when relevant * 5. By key exchange/auth again: EC > non-EC */ static const int ciphersuite_preference[] = { #if defined(MBEDTLS_SSL_CIPHERSUITES) MBEDTLS_SSL_CIPHERSUITES, #else /* Chacha-Poly ephemeral suites */ MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, /* All AES-256 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8, /* All CAMELLIA-256 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, /* All ARIA-256 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, /* All AES-128 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8, /* All CAMELLIA-128 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, /* All ARIA-128 ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, /* All remaining >= 128-bit ephemeral suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, /* The PSK ephemeral suites */ MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM, MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8, MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM, MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8, MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, /* The ECJPAKE suite */ MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, /* All AES-256 suites */ MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_RSA_WITH_AES_256_CCM, MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8, /* All CAMELLIA-256 suites */ MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, /* All ARIA-256 suites */ MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384, /* All AES-128 suites */ MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_RSA_WITH_AES_128_CCM, MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8, /* All CAMELLIA-128 suites */ MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, /* All ARIA-128 suites */ MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256, /* All remaining >= 128-bit suites */ MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, /* The RSA PSK suites */ MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, /* The PSK suites */ MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256, MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, MBEDTLS_TLS_PSK_WITH_AES_256_CCM, MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384, MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384, MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384, MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_PSK_WITH_AES_128_CCM, MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256, MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256, MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA, /* RC4 suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA, MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA, MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA, MBEDTLS_TLS_RSA_WITH_RC4_128_SHA, MBEDTLS_TLS_RSA_WITH_RC4_128_MD5, MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA, MBEDTLS_TLS_PSK_WITH_RC4_128_SHA, /* Weak suites */ MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA, MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA, /* NULL suites */ MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA, MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA, MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384, MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256, MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA, MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384, MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256, MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA, MBEDTLS_TLS_RSA_WITH_NULL_SHA256, MBEDTLS_TLS_RSA_WITH_NULL_SHA, MBEDTLS_TLS_RSA_WITH_NULL_MD5, MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA, MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA, MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384, MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256, MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA, MBEDTLS_TLS_PSK_WITH_NULL_SHA384, MBEDTLS_TLS_PSK_WITH_NULL_SHA256, MBEDTLS_TLS_PSK_WITH_NULL_SHA, #endif /* MBEDTLS_SSL_CIPHERSUITES */ 0 }; static const mbedtls_ssl_ciphersuite_t ciphersuite_definitions[] = { #if defined(MBEDTLS_CHACHAPOLY_C) && \ defined(MBEDTLS_SHA256_C) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) { MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, "TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, "TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) { MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, "TLS-DHE-RSA-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) { MBEDTLS_TLS_PSK_WITH_CHACHA20_POLY1305_SHA256, "TLS-PSK-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) { MBEDTLS_TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, "TLS-ECDHE-PSK-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) { MBEDTLS_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256, "TLS-DHE-PSK-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) { MBEDTLS_TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256, "TLS-RSA-PSK-WITH-CHACHA20-POLY1305-SHA256", MBEDTLS_CIPHER_CHACHA20_POLY1305, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_CHACHAPOLY_C && MBEDTLS_SHA256_C && MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, "TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, "TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, "TLS-ECDHE-ECDSA-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, "TLS-ECDHE-ECDSA-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, "TLS-ECDHE-ECDSA-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, "TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-ECDSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, "TLS-ECDHE-ECDSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA, "TLS-ECDHE-ECDSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, "TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, "TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, "TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, "TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDHE-RSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDHE-RSA-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDHE-RSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDHE-RSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-RSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA, "TLS-ECDHE-RSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA, "TLS-ECDHE-RSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA512_C) && defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C && MBEDTLS_GCM_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, "TLS-DHE-RSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA256", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, "TLS-DHE-RSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, "TLS-DHE-RSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, "TLS-DHE-RSA-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8, "TLS-DHE-RSA-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, "TLS-DHE-RSA-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8, "TLS-DHE-RSA-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, "TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, "TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-DHE-RSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-DHE-RSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA512_C) && defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384, "TLS-RSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C && MBEDTLS_GCM_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, "TLS-RSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256, "TLS-RSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, "TLS-RSA-WITH-AES-256-CBC-SHA256", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA, "TLS-RSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA, "TLS-RSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_RSA_WITH_AES_256_CCM, "TLS-RSA-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8, "TLS-RSA-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_RSA_WITH_AES_128_CCM, "TLS-RSA-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8, "TLS-RSA-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, "TLS-RSA-WITH-CAMELLIA-128-CBC-SHA", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, "TLS-RSA-WITH-CAMELLIA-256-CBC-SHA", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-RSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-RSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-RSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_MD5_C) { MBEDTLS_TLS_RSA_WITH_RC4_128_MD5, "TLS-RSA-WITH-RC4-128-MD5", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_RC4_128_SHA, "TLS-RSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, "TLS-ECDH-RSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, "TLS-ECDH-RSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, "TLS-ECDH-RSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, "TLS-ECDH-RSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, "TLS-ECDH-RSA-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, "TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDH-RSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDH-RSA-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDH-RSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDH-RSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDH-RSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA, "TLS-ECDH-RSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA, "TLS-ECDH-RSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_SHA1_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, "TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, "TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, "TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, "TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, "TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, "TLS-ECDH-ECDSA-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDH-ECDSA-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDH-ECDSA-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, "TLS-ECDH-ECDSA-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, "TLS-ECDH-ECDSA-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, "TLS-ECDH-ECDSA-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, "TLS-ECDH-ECDSA-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA, "TLS-ECDH-ECDSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256, "TLS-PSK-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, "TLS-PSK-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, "TLS-PSK-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384, "TLS-PSK-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, "TLS-PSK-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, "TLS-PSK-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_PSK_WITH_AES_256_CCM, "TLS-PSK-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, "TLS-PSK-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_PSK_WITH_AES_128_CCM, "TLS-PSK-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, "TLS-PSK-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-PSK-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-PSK-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-PSK-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_PSK_WITH_RC4_128_SHA, "TLS-PSK-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, "TLS-DHE-PSK-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, "TLS-DHE-PSK-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, "TLS-DHE-PSK-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, "TLS-DHE-PSK-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, "TLS-DHE-PSK-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, "TLS-DHE-PSK-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM, "TLS-DHE-PSK-WITH-AES-256-CCM", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8, "TLS-DHE-PSK-WITH-AES-256-CCM-8", MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM, "TLS-DHE-PSK-WITH-AES-128-CCM", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8, "TLS-DHE-PSK-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-DHE-PSK-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-DHE-PSK-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-DHE-PSK-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-DHE-PSK-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-DHE-PSK-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA, "TLS-DHE-PSK-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, "TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, "TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, "TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, "TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-ECDHE-PSK-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-ECDHE-PSK-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-ECDHE-PSK-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA, "TLS-ECDHE-PSK-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, "TLS-RSA-PSK-WITH-AES-128-GCM-SHA256", MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, "TLS-RSA-PSK-WITH-AES-256-GCM-SHA384", MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, "TLS-RSA-PSK-WITH-AES-128-CBC-SHA256", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, "TLS-RSA-PSK-WITH-AES-256-CBC-SHA384", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, "TLS-RSA-PSK-WITH-AES-128-CBC-SHA", MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, "TLS-RSA-PSK-WITH-AES-256-CBC-SHA", MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_CAMELLIA_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, "TLS-RSA-PSK-WITH-CAMELLIA-128-CBC-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, "TLS-RSA-PSK-WITH-CAMELLIA-256-CBC-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_GCM_C) #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, "TLS-RSA-PSK-WITH-CAMELLIA-128-GCM-SHA256", MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, "TLS-RSA-PSK-WITH-CAMELLIA-256-GCM-SHA384", MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_GCM_C */ #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, "TLS-RSA-PSK-WITH-3DES-EDE-CBC-SHA", MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ARC4_C) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA, "TLS-RSA-PSK-WITH-RC4-128-SHA", MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_NODTLS }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_ARC4_C */ #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) #if defined(MBEDTLS_AES_C) #if defined(MBEDTLS_CCM_C) { MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, "TLS-ECJPAKE-WITH-AES-128-CCM-8", MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECJPAKE, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_SHORT_TAG }, #endif /* MBEDTLS_CCM_C */ #endif /* MBEDTLS_AES_C */ #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES) #if defined(MBEDTLS_CIPHER_NULL_CIPHER) #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) #if defined(MBEDTLS_MD5_C) { MBEDTLS_TLS_RSA_WITH_NULL_MD5, "TLS-RSA-WITH-NULL-MD5", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_NULL_SHA, "TLS-RSA-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_WITH_NULL_SHA256, "TLS-RSA-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_PSK_WITH_NULL_SHA, "TLS-PSK-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_PSK_WITH_NULL_SHA256, "TLS-PSK-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_PSK_WITH_NULL_SHA384, "TLS-PSK-WITH-NULL-SHA384", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA, "TLS-DHE-PSK-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256, "TLS-DHE-PSK-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384, "TLS-DHE-PSK-WITH-NULL-SHA384", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA, "TLS-ECDHE-PSK-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256, "TLS-ECDHE-PSK-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384, "TLS-ECDHE-PSK-WITH-NULL-SHA384", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA, "TLS-RSA-PSK-WITH-NULL-SHA", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256, "TLS-RSA-PSK-WITH-NULL-SHA256", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #if defined(MBEDTLS_SHA512_C) { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384, "TLS-RSA-PSK-WITH-NULL-SHA384", MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #if defined(MBEDTLS_DES_C) #if defined(MBEDTLS_CIPHER_MODE_CBC) #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA, "TLS-DHE-RSA-WITH-DES-CBC-SHA", MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) #if defined(MBEDTLS_SHA1_C) { MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA, "TLS-RSA-WITH-DES-CBC-SHA", MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_CIPHERSUITE_WEAK }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #endif /* MBEDTLS_CIPHER_MODE_CBC */ #endif /* MBEDTLS_DES_C */ #endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */ #if defined(MBEDTLS_ARIA_C) #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_RSA_WITH_ARIA_256_GCM_SHA384, "TLS-RSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_RSA_WITH_ARIA_256_CBC_SHA384, "TLS-RSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_RSA_WITH_ARIA_128_GCM_SHA256, "TLS-RSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_RSA_WITH_ARIA_128_CBC_SHA256, "TLS-RSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, "TLS-RSA-PSK-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, "TLS-RSA-PSK-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, "TLS-RSA-PSK-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, "TLS-RSA-PSK-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_PSK_WITH_ARIA_256_GCM_SHA384, "TLS-PSK-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384,MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_PSK_WITH_ARIA_256_CBC_SHA384, "TLS-PSK-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_PSK_WITH_ARIA_128_GCM_SHA256, "TLS-PSK-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_PSK_WITH_ARIA_128_CBC_SHA256, "TLS-PSK-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, "TLS-ECDH-RSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, "TLS-ECDH-RSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, "TLS-ECDH-RSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, "TLS-ECDH-RSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384, "TLS-ECDHE-RSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, "TLS-ECDHE-RSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256, "TLS-ECDHE-RSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, "TLS-ECDHE-RSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, "TLS-ECDHE-PSK-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, "TLS-ECDHE-PSK-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, "TLS-ECDHE-ECDSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, "TLS-ECDHE-ECDSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, "TLS-ECDHE-ECDSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, "TLS-ECDHE-ECDSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, "TLS-ECDH-ECDSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, "TLS-ECDH-ECDSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, "TLS-ECDH-ECDSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, "TLS-ECDH-ECDSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384, "TLS-DHE-RSA-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, "TLS-DHE-RSA-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256, "TLS-DHE-RSA-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, "TLS-DHE-RSA-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384, "TLS-DHE-PSK-WITH-ARIA-256-GCM-SHA384", MBEDTLS_CIPHER_ARIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA512_C)) { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, "TLS-DHE-PSK-WITH-ARIA-256-CBC-SHA384", MBEDTLS_CIPHER_ARIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_GCM_C) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256, "TLS-DHE-PSK-WITH-ARIA-128-GCM-SHA256", MBEDTLS_CIPHER_ARIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) && defined(MBEDTLS_SHA256_C)) { MBEDTLS_TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, "TLS-DHE-PSK-WITH-ARIA-128-CBC-SHA256", MBEDTLS_CIPHER_ARIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3, 0 }, #endif #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #endif /* MBEDTLS_ARIA_C */ { 0, "", MBEDTLS_CIPHER_NONE, MBEDTLS_MD_NONE, MBEDTLS_KEY_EXCHANGE_NONE, 0, 0, 0, 0, 0 } }; #if defined(MBEDTLS_SSL_CIPHERSUITES) const int *mbedtls_ssl_list_ciphersuites( void ) { return( ciphersuite_preference ); } #else #define MAX_CIPHERSUITES sizeof( ciphersuite_definitions ) / \ sizeof( ciphersuite_definitions[0] ) static int supported_ciphersuites[MAX_CIPHERSUITES]; static int supported_init = 0; const int *mbedtls_ssl_list_ciphersuites( void ) { /* * On initial call filter out all ciphersuites not supported by current * build based on presence in the ciphersuite_definitions. */ if( supported_init == 0 ) { const int *p; int *q; for( p = ciphersuite_preference, q = supported_ciphersuites; *p != 0 && q < supported_ciphersuites + MAX_CIPHERSUITES - 1; p++ ) { #if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES) const mbedtls_ssl_ciphersuite_t *cs_info; if( ( cs_info = mbedtls_ssl_ciphersuite_from_id( *p ) ) != NULL && cs_info->cipher != MBEDTLS_CIPHER_ARC4_128 ) #else if( mbedtls_ssl_ciphersuite_from_id( *p ) != NULL ) #endif *(q++) = *p; } *q = 0; supported_init = 1; } return( supported_ciphersuites ); } #endif /* MBEDTLS_SSL_CIPHERSUITES */ const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string( const char *ciphersuite_name ) { const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions; if( NULL == ciphersuite_name ) return( NULL ); while( cur->id != 0 ) { if( 0 == strcmp( cur->name, ciphersuite_name ) ) return( cur ); cur++; } return( NULL ); } const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id( int ciphersuite ) { const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions; while( cur->id != 0 ) { if( cur->id == ciphersuite ) return( cur ); cur++; } return( NULL ); } const char *mbedtls_ssl_get_ciphersuite_name( const int ciphersuite_id ) { const mbedtls_ssl_ciphersuite_t *cur; cur = mbedtls_ssl_ciphersuite_from_id( ciphersuite_id ); if( cur == NULL ) return( "unknown" ); return( cur->name ); } int mbedtls_ssl_get_ciphersuite_id( const char *ciphersuite_name ) { const mbedtls_ssl_ciphersuite_t *cur; cur = mbedtls_ssl_ciphersuite_from_string( ciphersuite_name ); if( cur == NULL ) return( 0 ); return( cur->id ); } #if defined(MBEDTLS_PK_C) mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_RSA_PSK: return( MBEDTLS_PK_RSA ); case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: return( MBEDTLS_PK_ECDSA ); case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: return( MBEDTLS_PK_ECKEY ); default: return( MBEDTLS_PK_NONE ); } } mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_alg( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_RSA: case MBEDTLS_KEY_EXCHANGE_DHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: return( MBEDTLS_PK_RSA ); case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: return( MBEDTLS_PK_ECDSA ); default: return( MBEDTLS_PK_NONE ); } } #endif /* MBEDTLS_PK_C */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) int mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDH_RSA: case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA: case MBEDTLS_KEY_EXCHANGE_ECJPAKE: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED*/ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) int mbedtls_ssl_ciphersuite_uses_psk( const mbedtls_ssl_ciphersuite_t *info ) { switch( info->key_exchange ) { case MBEDTLS_KEY_EXCHANGE_PSK: case MBEDTLS_KEY_EXCHANGE_RSA_PSK: case MBEDTLS_KEY_EXCHANGE_DHE_PSK: case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK: return( 1 ); default: return( 0 ); } } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ #endif /* MBEDTLS_SSL_TLS_C */ fldigi-4.2.05/src/mbedtls/debug.c0000664000175000017500000003122014611711171013434 00000000000000/* * Debugging routines * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_DEBUG_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #define mbedtls_time_t time_t #define mbedtls_snprintf snprintf #endif #include "mbedtls/debug.h" #include #include #include #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif #define DEBUG_BUF_SIZE 512 static int debug_threshold = 0; void mbedtls_debug_set_threshold( int threshold ) { debug_threshold = threshold; } /* * All calls to f_dbg must be made via this function */ static inline void debug_send_line( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *str ) { /* * If in a threaded environment, we need a thread identifier. * Since there is no portable way to get one, use the address of the ssl * context instead, as it shouldn't be shared between threads. */ #if defined(MBEDTLS_THREADING_C) char idstr[20 + DEBUG_BUF_SIZE]; /* 0x + 16 nibbles + ': ' */ mbedtls_snprintf( idstr, sizeof( idstr ), "%p: %s", (void*)ssl, str ); ssl->conf->f_dbg( ssl->conf->p_dbg, level, file, line, idstr ); #else ssl->conf->f_dbg( ssl->conf->p_dbg, level, file, line, str ); #endif } void mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *format, ... ) { va_list argp; char str[DEBUG_BUF_SIZE]; int ret; if( NULL == ssl || NULL == ssl->conf || NULL == ssl->conf->f_dbg || level > debug_threshold ) return; va_start( argp, format ); #if defined(_WIN32) #if defined(_TRUNCATE) && !defined(__MINGW32__) ret = _vsnprintf_s( str, DEBUG_BUF_SIZE, _TRUNCATE, format, argp ); #else ret = _vsnprintf( str, DEBUG_BUF_SIZE, format, argp ); if( ret < 0 || (size_t) ret == DEBUG_BUF_SIZE ) { str[DEBUG_BUF_SIZE-1] = '\0'; ret = -1; } #endif #else ret = vsnprintf( str, DEBUG_BUF_SIZE, format, argp ); #endif va_end( argp ); if( ret >= 0 && ret < DEBUG_BUF_SIZE - 1 ) { str[ret] = '\n'; str[ret + 1] = '\0'; } debug_send_line( ssl, level, file, line, str ); } void mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, int ret ) { char str[DEBUG_BUF_SIZE]; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold ) return; /* * With non-blocking I/O and examples that just retry immediately, * the logs would be quickly flooded with WANT_READ, so ignore that. * Don't ignore WANT_WRITE however, since is is usually rare. */ if( ret == MBEDTLS_ERR_SSL_WANT_READ ) return; mbedtls_snprintf( str, sizeof( str ), "%s() returned %d (-0x%04x)\n", text, ret, -ret ); debug_send_line( ssl, level, file, line, str ); } void mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const unsigned char *buf, size_t len ) { char str[DEBUG_BUF_SIZE]; char txt[17]; size_t i, idx = 0; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold ) return; mbedtls_snprintf( str + idx, sizeof( str ) - idx, "dumping '%s' (%u bytes)\n", text, (unsigned int) len ); debug_send_line( ssl, level, file, line, str ); idx = 0; memset( txt, 0, sizeof( txt ) ); for( i = 0; i < len; i++ ) { if( i >= 4096 ) break; if( i % 16 == 0 ) { if( i > 0 ) { mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %s\n", txt ); debug_send_line( ssl, level, file, line, str ); idx = 0; memset( txt, 0, sizeof( txt ) ); } idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, "%04x: ", (unsigned int) i ); } idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %02x", (unsigned int) buf[i] ); txt[i % 16] = ( buf[i] > 31 && buf[i] < 127 ) ? buf[i] : '.' ; } if( len > 0 ) { for( /* i = i */; i % 16 != 0; i++ ) idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " " ); mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %s\n", txt ); debug_send_line( ssl, level, file, line, str ); } } #if defined(MBEDTLS_ECP_C) void mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_ecp_point *X ) { char str[DEBUG_BUF_SIZE]; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold ) return; mbedtls_snprintf( str, sizeof( str ), "%s(X)", text ); mbedtls_debug_print_mpi( ssl, level, file, line, str, &X->X ); mbedtls_snprintf( str, sizeof( str ), "%s(Y)", text ); mbedtls_debug_print_mpi( ssl, level, file, line, str, &X->Y ); } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_BIGNUM_C) void mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_mpi *X ) { char str[DEBUG_BUF_SIZE]; int j, k, zeros = 1; size_t i, n, idx = 0; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || X == NULL || level > debug_threshold ) return; for( n = X->n - 1; n > 0; n-- ) if( X->p[n] != 0 ) break; for( j = ( sizeof(mbedtls_mpi_uint) << 3 ) - 1; j >= 0; j-- ) if( ( ( X->p[n] >> j ) & 1 ) != 0 ) break; mbedtls_snprintf( str + idx, sizeof( str ) - idx, "value of '%s' (%d bits) is:\n", text, (int) ( ( n * ( sizeof(mbedtls_mpi_uint) << 3 ) ) + j + 1 ) ); debug_send_line( ssl, level, file, line, str ); idx = 0; for( i = n + 1, j = 0; i > 0; i-- ) { if( zeros && X->p[i - 1] == 0 ) continue; for( k = sizeof( mbedtls_mpi_uint ) - 1; k >= 0; k-- ) { if( zeros && ( ( X->p[i - 1] >> ( k << 3 ) ) & 0xFF ) == 0 ) continue; else zeros = 0; if( j % 16 == 0 ) { if( j > 0 ) { mbedtls_snprintf( str + idx, sizeof( str ) - idx, "\n" ); debug_send_line( ssl, level, file, line, str ); idx = 0; } } idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " %02x", (unsigned int) ( X->p[i - 1] >> ( k << 3 ) ) & 0xFF ); j++; } } if( zeros == 1 ) idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, " 00" ); mbedtls_snprintf( str + idx, sizeof( str ) - idx, "\n" ); debug_send_line( ssl, level, file, line, str ); } #endif /* MBEDTLS_BIGNUM_C */ #if defined(MBEDTLS_X509_CRT_PARSE_C) static void debug_print_pk( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_pk_context *pk ) { size_t i; mbedtls_pk_debug_item items[MBEDTLS_PK_DEBUG_MAX_ITEMS]; char name[16]; memset( items, 0, sizeof( items ) ); if( mbedtls_pk_debug( pk, items ) != 0 ) { debug_send_line( ssl, level, file, line, "invalid PK context\n" ); return; } for( i = 0; i < MBEDTLS_PK_DEBUG_MAX_ITEMS; i++ ) { if( items[i].type == MBEDTLS_PK_DEBUG_NONE ) return; mbedtls_snprintf( name, sizeof( name ), "%s%s", text, items[i].name ); name[sizeof( name ) - 1] = '\0'; if( items[i].type == MBEDTLS_PK_DEBUG_MPI ) mbedtls_debug_print_mpi( ssl, level, file, line, name, items[i].value ); else #if defined(MBEDTLS_ECP_C) if( items[i].type == MBEDTLS_PK_DEBUG_ECP ) mbedtls_debug_print_ecp( ssl, level, file, line, name, items[i].value ); else #endif debug_send_line( ssl, level, file, line, "should not happen\n" ); } } static void debug_print_line_by_line( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text ) { char str[DEBUG_BUF_SIZE]; const char *start, *cur; start = text; for( cur = text; *cur != '\0'; cur++ ) { if( *cur == '\n' ) { size_t len = cur - start + 1; if( len > DEBUG_BUF_SIZE - 1 ) len = DEBUG_BUF_SIZE - 1; memcpy( str, start, len ); str[len] = '\0'; debug_send_line( ssl, level, file, line, str ); start = cur + 1; } } } void mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const char *text, const mbedtls_x509_crt *crt ) { char str[DEBUG_BUF_SIZE]; int i = 0; if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || crt == NULL || level > debug_threshold ) return; while( crt != NULL ) { char buf[1024]; mbedtls_snprintf( str, sizeof( str ), "%s #%d:\n", text, ++i ); debug_send_line( ssl, level, file, line, str ); mbedtls_x509_crt_info( buf, sizeof( buf ) - 1, "", crt ); debug_print_line_by_line( ssl, level, file, line, buf ); debug_print_pk( ssl, level, file, line, "crt->", &crt->pk ); crt = crt->next; } } #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_ECDH_C) static void mbedtls_debug_printf_ecdh_internal( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const mbedtls_ecdh_context *ecdh, mbedtls_debug_ecdh_attr attr ) { #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) const mbedtls_ecdh_context* ctx = ecdh; #else const mbedtls_ecdh_context_mbed* ctx = &ecdh->ctx.mbed_ecdh; #endif switch( attr ) { case MBEDTLS_DEBUG_ECDH_Q: mbedtls_debug_print_ecp( ssl, level, file, line, "ECDH: Q", &ctx->Q ); break; case MBEDTLS_DEBUG_ECDH_QP: mbedtls_debug_print_ecp( ssl, level, file, line, "ECDH: Qp", &ctx->Qp ); break; case MBEDTLS_DEBUG_ECDH_Z: mbedtls_debug_print_mpi( ssl, level, file, line, "ECDH: z", &ctx->z ); break; default: break; } } void mbedtls_debug_printf_ecdh( const mbedtls_ssl_context *ssl, int level, const char *file, int line, const mbedtls_ecdh_context *ecdh, mbedtls_debug_ecdh_attr attr ) { #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) mbedtls_debug_printf_ecdh_internal( ssl, level, file, line, ecdh, attr ); #else switch( ecdh->var ) { default: mbedtls_debug_printf_ecdh_internal( ssl, level, file, line, ecdh, attr ); } #endif } #endif /* MBEDTLS_ECDH_C */ #endif /* MBEDTLS_DEBUG_C */ fldigi-4.2.05/src/mbedtls/md4.c0000664000175000017500000002747614611711171013054 00000000000000/* * RFC 1186/1320 compliant MD4 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The MD4 algorithm was designed by Ron Rivest in 1990. * * http://www.ietf.org/rfc/rfc1186.txt * http://www.ietf.org/rfc/rfc1320.txt */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD4_C) #include "mbedtls/md4.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_MD4_ALT) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif void mbedtls_md4_init( mbedtls_md4_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_md4_context ) ); } void mbedtls_md4_free( mbedtls_md4_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md4_context ) ); } void mbedtls_md4_clone( mbedtls_md4_context *dst, const mbedtls_md4_context *src ) { *dst = *src; } /* * MD4 context setup */ int mbedtls_md4_starts_ret( mbedtls_md4_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4_starts( mbedtls_md4_context *ctx ) { mbedtls_md4_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_MD4_PROCESS_ALT) int mbedtls_internal_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ) { uint32_t X[16], A, B, C, D; GET_UINT32_LE( X[ 0], data, 0 ); GET_UINT32_LE( X[ 1], data, 4 ); GET_UINT32_LE( X[ 2], data, 8 ); GET_UINT32_LE( X[ 3], data, 12 ); GET_UINT32_LE( X[ 4], data, 16 ); GET_UINT32_LE( X[ 5], data, 20 ); GET_UINT32_LE( X[ 6], data, 24 ); GET_UINT32_LE( X[ 7], data, 28 ); GET_UINT32_LE( X[ 8], data, 32 ); GET_UINT32_LE( X[ 9], data, 36 ); GET_UINT32_LE( X[10], data, 40 ); GET_UINT32_LE( X[11], data, 44 ); GET_UINT32_LE( X[12], data, 48 ); GET_UINT32_LE( X[13], data, 52 ); GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( X[15], data, 60 ); #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) A = ctx->state[0]; B = ctx->state[1]; C = ctx->state[2]; D = ctx->state[3]; #define F(x, y, z) ((x & y) | ((~x) & z)) #define P(a,b,c,d,x,s) { a += F(b,c,d) + x; a = S(a,s); } P( A, B, C, D, X[ 0], 3 ); P( D, A, B, C, X[ 1], 7 ); P( C, D, A, B, X[ 2], 11 ); P( B, C, D, A, X[ 3], 19 ); P( A, B, C, D, X[ 4], 3 ); P( D, A, B, C, X[ 5], 7 ); P( C, D, A, B, X[ 6], 11 ); P( B, C, D, A, X[ 7], 19 ); P( A, B, C, D, X[ 8], 3 ); P( D, A, B, C, X[ 9], 7 ); P( C, D, A, B, X[10], 11 ); P( B, C, D, A, X[11], 19 ); P( A, B, C, D, X[12], 3 ); P( D, A, B, C, X[13], 7 ); P( C, D, A, B, X[14], 11 ); P( B, C, D, A, X[15], 19 ); #undef P #undef F #define F(x,y,z) ((x & y) | (x & z) | (y & z)) #define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x5A827999; a = S(a,s); } P( A, B, C, D, X[ 0], 3 ); P( D, A, B, C, X[ 4], 5 ); P( C, D, A, B, X[ 8], 9 ); P( B, C, D, A, X[12], 13 ); P( A, B, C, D, X[ 1], 3 ); P( D, A, B, C, X[ 5], 5 ); P( C, D, A, B, X[ 9], 9 ); P( B, C, D, A, X[13], 13 ); P( A, B, C, D, X[ 2], 3 ); P( D, A, B, C, X[ 6], 5 ); P( C, D, A, B, X[10], 9 ); P( B, C, D, A, X[14], 13 ); P( A, B, C, D, X[ 3], 3 ); P( D, A, B, C, X[ 7], 5 ); P( C, D, A, B, X[11], 9 ); P( B, C, D, A, X[15], 13 ); #undef P #undef F #define F(x,y,z) (x ^ y ^ z) #define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x6ED9EBA1; a = S(a,s); } P( A, B, C, D, X[ 0], 3 ); P( D, A, B, C, X[ 8], 9 ); P( C, D, A, B, X[ 4], 11 ); P( B, C, D, A, X[12], 15 ); P( A, B, C, D, X[ 2], 3 ); P( D, A, B, C, X[10], 9 ); P( C, D, A, B, X[ 6], 11 ); P( B, C, D, A, X[14], 15 ); P( A, B, C, D, X[ 1], 3 ); P( D, A, B, C, X[ 9], 9 ); P( C, D, A, B, X[ 5], 11 ); P( B, C, D, A, X[13], 15 ); P( A, B, C, D, X[ 3], 3 ); P( D, A, B, C, X[11], 9 ); P( C, D, A, B, X[ 7], 11 ); P( B, C, D, A, X[15], 15 ); #undef F #undef P ctx->state[0] += A; ctx->state[1] += B; ctx->state[2] += C; ctx->state[3] += D; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ) { mbedtls_internal_md4_process( ctx, data ); } #endif #endif /* !MBEDTLS_MD4_PROCESS_ALT */ /* * MD4 process buffer */ int mbedtls_md4_update_ret( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), (void *) input, fill ); if( ( ret = mbedtls_internal_md4_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_md4_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) { memcpy( (void *) (ctx->buffer + left), (void *) input, ilen ); } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_md4_update_ret( ctx, input, ilen ); } #endif static const unsigned char md4_padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* * MD4 final digest */ int mbedtls_md4_finish_ret( mbedtls_md4_context *ctx, unsigned char output[16] ) { int ret; uint32_t last, padn; uint32_t high, low; unsigned char msglen[8]; high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_LE( low, msglen, 0 ); PUT_UINT32_LE( high, msglen, 4 ); last = ctx->total[0] & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); ret = mbedtls_md4_update_ret( ctx, (unsigned char *)md4_padding, padn ); if( ret != 0 ) return( ret ); if( ( ret = mbedtls_md4_update_ret( ctx, msglen, 8 ) ) != 0 ) return( ret ); PUT_UINT32_LE( ctx->state[0], output, 0 ); PUT_UINT32_LE( ctx->state[1], output, 4 ); PUT_UINT32_LE( ctx->state[2], output, 8 ); PUT_UINT32_LE( ctx->state[3], output, 12 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] ) { mbedtls_md4_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_MD4_ALT */ /* * output = MD4( input buffer ) */ int mbedtls_md4_ret( const unsigned char *input, size_t ilen, unsigned char output[16] ) { int ret; mbedtls_md4_context ctx; mbedtls_md4_init( &ctx ); if( ( ret = mbedtls_md4_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md4_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md4_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_md4_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] ) { mbedtls_md4_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * RFC 1320 test vectors */ static const unsigned char md4_test_str[7][81] = { { "" }, { "a" }, { "abc" }, { "message digest" }, { "abcdefghijklmnopqrstuvwxyz" }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, { "12345678901234567890123456789012345678901234567890123456789012" "345678901234567890" } }; static const size_t md4_test_strlen[7] = { 0, 1, 3, 14, 26, 62, 80 }; static const unsigned char md4_test_sum[7][16] = { { 0x31, 0xD6, 0xCF, 0xE0, 0xD1, 0x6A, 0xE9, 0x31, 0xB7, 0x3C, 0x59, 0xD7, 0xE0, 0xC0, 0x89, 0xC0 }, { 0xBD, 0xE5, 0x2C, 0xB3, 0x1D, 0xE3, 0x3E, 0x46, 0x24, 0x5E, 0x05, 0xFB, 0xDB, 0xD6, 0xFB, 0x24 }, { 0xA4, 0x48, 0x01, 0x7A, 0xAF, 0x21, 0xD8, 0x52, 0x5F, 0xC1, 0x0A, 0xE8, 0x7A, 0xA6, 0x72, 0x9D }, { 0xD9, 0x13, 0x0A, 0x81, 0x64, 0x54, 0x9F, 0xE8, 0x18, 0x87, 0x48, 0x06, 0xE1, 0xC7, 0x01, 0x4B }, { 0xD7, 0x9E, 0x1C, 0x30, 0x8A, 0xA5, 0xBB, 0xCD, 0xEE, 0xA8, 0xED, 0x63, 0xDF, 0x41, 0x2D, 0xA9 }, { 0x04, 0x3F, 0x85, 0x82, 0xF2, 0x41, 0xDB, 0x35, 0x1C, 0xE6, 0x27, 0xE1, 0x53, 0xE7, 0xF0, 0xE4 }, { 0xE3, 0x3B, 0x4D, 0xDC, 0x9C, 0x38, 0xF2, 0x19, 0x9C, 0x3E, 0x7B, 0x16, 0x4F, 0xCC, 0x05, 0x36 } }; /* * Checkup routine */ int mbedtls_md4_self_test( int verbose ) { int i, ret = 0; unsigned char md4sum[16]; for( i = 0; i < 7; i++ ) { if( verbose != 0 ) mbedtls_printf( " MD4 test #%d: ", i + 1 ); ret = mbedtls_md4_ret( md4_test_str[i], md4_test_strlen[i], md4sum ); if( ret != 0 ) goto fail; if( memcmp( md4sum, md4_test_sum[i], 16 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_MD4_C */ fldigi-4.2.05/src/mbedtls/error.c0000664000175000017500000013404714611711171013512 00000000000000/* * Error message information * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY) #include "mbedtls/error.h" #include #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #define mbedtls_snprintf snprintf #define mbedtls_time_t time_t #endif #if defined(MBEDTLS_ERROR_C) #include #if defined(MBEDTLS_AES_C) #include "mbedtls/aes.h" #endif #if defined(MBEDTLS_ARC4_C) #include "mbedtls/arc4.h" #endif #if defined(MBEDTLS_ARIA_C) #include "mbedtls/aria.h" #endif #if defined(MBEDTLS_BASE64_C) #include "mbedtls/base64.h" #endif #if defined(MBEDTLS_BIGNUM_C) #include "mbedtls/bignum.h" #endif #if defined(MBEDTLS_BLOWFISH_C) #include "mbedtls/blowfish.h" #endif #if defined(MBEDTLS_CAMELLIA_C) #include "mbedtls/camellia.h" #endif #if defined(MBEDTLS_CCM_C) #include "mbedtls/ccm.h" #endif #if defined(MBEDTLS_CHACHA20_C) #include "mbedtls/chacha20.h" #endif #if defined(MBEDTLS_CHACHAPOLY_C) #include "mbedtls/chachapoly.h" #endif #if defined(MBEDTLS_CIPHER_C) #include "mbedtls/cipher.h" #endif #if defined(MBEDTLS_CMAC_C) #include "mbedtls/cmac.h" #endif #if defined(MBEDTLS_CTR_DRBG_C) #include "mbedtls/ctr_drbg.h" #endif #if defined(MBEDTLS_DES_C) #include "mbedtls/des.h" #endif #if defined(MBEDTLS_DHM_C) #include "mbedtls/dhm.h" #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ENTROPY_C) #include "mbedtls/entropy.h" #endif #if defined(MBEDTLS_GCM_C) #include "mbedtls/gcm.h" #endif #if defined(MBEDTLS_HKDF_C) #include "mbedtls/hkdf.h" #endif #if defined(MBEDTLS_HMAC_DRBG_C) #include "mbedtls/hmac_drbg.h" #endif #if defined(MBEDTLS_MD_C) #include "mbedtls/md.h" #endif #if defined(MBEDTLS_MD2_C) #include "mbedtls/md2.h" #endif #if defined(MBEDTLS_MD4_C) #include "mbedtls/md4.h" #endif #if defined(MBEDTLS_MD5_C) #include "mbedtls/md5.h" #endif #if defined(MBEDTLS_NET_C) #include "mbedtls/net_sockets.h" #endif #if defined(MBEDTLS_OID_C) #include "mbedtls/oid.h" #endif #if defined(MBEDTLS_PADLOCK_C) #include "mbedtls/padlock.h" #endif #if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PK_C) #include "mbedtls/pk.h" #endif #if defined(MBEDTLS_PKCS12_C) #include "mbedtls/pkcs12.h" #endif #if defined(MBEDTLS_PKCS5_C) #include "mbedtls/pkcs5.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #endif #if defined(MBEDTLS_POLY1305_C) #include "mbedtls/poly1305.h" #endif #if defined(MBEDTLS_RIPEMD160_C) #include "mbedtls/ripemd160.h" #endif #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #endif #if defined(MBEDTLS_SHA1_C) #include "mbedtls/sha1.h" #endif #if defined(MBEDTLS_SHA256_C) #include "mbedtls/sha256.h" #endif #if defined(MBEDTLS_SHA512_C) #include "mbedtls/sha512.h" #endif #if defined(MBEDTLS_SSL_TLS_C) #include "mbedtls/ssl.h" #endif #if defined(MBEDTLS_THREADING_C) #include "mbedtls/threading.h" #endif #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) #include "mbedtls/x509.h" #endif #if defined(MBEDTLS_XTEA_C) #include "mbedtls/xtea.h" #endif void mbedtls_strerror( int ret, char *buf, size_t buflen ) { size_t len; int use_ret; if( buflen == 0 ) return; memset( buf, 0x00, buflen ); if( ret < 0 ) ret = -ret; if( ret & 0xFF80 ) { use_ret = ret & 0xFF80; // High level error codes // // BEGIN generated code #if defined(MBEDTLS_CIPHER_C) if( use_ret == -(MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "CIPHER - The selected feature is not available" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "CIPHER - Bad input parameters" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "CIPHER - Failed to allocate memory" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_INVALID_PADDING) ) mbedtls_snprintf( buf, buflen, "CIPHER - Input data contains invalid padding and is rejected" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED) ) mbedtls_snprintf( buf, buflen, "CIPHER - Decryption of block requires a full block" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_AUTH_FAILED) ) mbedtls_snprintf( buf, buflen, "CIPHER - Authentication failed (for AEAD modes)" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_INVALID_CONTEXT) ) mbedtls_snprintf( buf, buflen, "CIPHER - The context is invalid. For example, because it was freed" ); if( use_ret == -(MBEDTLS_ERR_CIPHER_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CIPHER - Cipher hardware accelerator failed" ); #endif /* MBEDTLS_CIPHER_C */ #if defined(MBEDTLS_DHM_C) if( use_ret == -(MBEDTLS_ERR_DHM_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "DHM - Bad input parameters" ); if( use_ret == -(MBEDTLS_ERR_DHM_READ_PARAMS_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Reading of the DHM parameters failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Making of the DHM parameters failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Reading of the public values failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Making of the public value failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_CALC_SECRET_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Calculation of the DHM secret failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "DHM - The ASN.1 data is not formatted correctly" ); if( use_ret == -(MBEDTLS_ERR_DHM_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Allocation of memory failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "DHM - Read or write of file failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - DHM hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_DHM_SET_GROUP_FAILED) ) mbedtls_snprintf( buf, buflen, "DHM - Setting the modulus and generator failed" ); #endif /* MBEDTLS_DHM_C */ #if defined(MBEDTLS_ECP_C) if( use_ret == -(MBEDTLS_ERR_ECP_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "ECP - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "ECP - The buffer is too small to write to" ); if( use_ret == -(MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "ECP - The requested feature is not available, for example, the requested curve is not supported" ); if( use_ret == -(MBEDTLS_ERR_ECP_VERIFY_FAILED) ) mbedtls_snprintf( buf, buflen, "ECP - The signature is not valid" ); if( use_ret == -(MBEDTLS_ERR_ECP_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "ECP - Memory allocation failed" ); if( use_ret == -(MBEDTLS_ERR_ECP_RANDOM_FAILED) ) mbedtls_snprintf( buf, buflen, "ECP - Generation of random value, such as ephemeral key, failed" ); if( use_ret == -(MBEDTLS_ERR_ECP_INVALID_KEY) ) mbedtls_snprintf( buf, buflen, "ECP - Invalid private or public key" ); if( use_ret == -(MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) ) mbedtls_snprintf( buf, buflen, "ECP - The buffer contains a valid signature followed by more data" ); if( use_ret == -(MBEDTLS_ERR_ECP_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "ECP - The ECP hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_ECP_IN_PROGRESS) ) mbedtls_snprintf( buf, buflen, "ECP - Operation in progress, call again with the same parameters to continue" ); #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_MD_C) if( use_ret == -(MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "MD - The selected feature is not available" ); if( use_ret == -(MBEDTLS_ERR_MD_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "MD - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_MD_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "MD - Failed to allocate memory" ); if( use_ret == -(MBEDTLS_ERR_MD_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "MD - Opening or reading of file failed" ); if( use_ret == -(MBEDTLS_ERR_MD_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "MD - MD hardware accelerator failed" ); #endif /* MBEDTLS_MD_C */ #if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C) if( use_ret == -(MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) ) mbedtls_snprintf( buf, buflen, "PEM - No PEM header or footer found" ); if( use_ret == -(MBEDTLS_ERR_PEM_INVALID_DATA) ) mbedtls_snprintf( buf, buflen, "PEM - PEM string is not as expected" ); if( use_ret == -(MBEDTLS_ERR_PEM_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "PEM - Failed to allocate memory" ); if( use_ret == -(MBEDTLS_ERR_PEM_INVALID_ENC_IV) ) mbedtls_snprintf( buf, buflen, "PEM - RSA IV is not in hex-format" ); if( use_ret == -(MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG) ) mbedtls_snprintf( buf, buflen, "PEM - Unsupported key encryption algorithm" ); if( use_ret == -(MBEDTLS_ERR_PEM_PASSWORD_REQUIRED) ) mbedtls_snprintf( buf, buflen, "PEM - Private key password can't be empty" ); if( use_ret == -(MBEDTLS_ERR_PEM_PASSWORD_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PEM - Given private key password does not allow for correct decryption" ); if( use_ret == -(MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "PEM - Unavailable feature, e.g. hashing/encryption combination" ); if( use_ret == -(MBEDTLS_ERR_PEM_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "PEM - Bad input parameters to function" ); #endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */ #if defined(MBEDTLS_PK_C) if( use_ret == -(MBEDTLS_ERR_PK_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "PK - Memory allocation failed" ); if( use_ret == -(MBEDTLS_ERR_PK_TYPE_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PK - Type mismatch, eg attempt to encrypt with an ECDSA key" ); if( use_ret == -(MBEDTLS_ERR_PK_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "PK - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_PK_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "PK - Read/write of file failed" ); if( use_ret == -(MBEDTLS_ERR_PK_KEY_INVALID_VERSION) ) mbedtls_snprintf( buf, buflen, "PK - Unsupported key version" ); if( use_ret == -(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "PK - Invalid key tag or value" ); if( use_ret == -(MBEDTLS_ERR_PK_UNKNOWN_PK_ALG) ) mbedtls_snprintf( buf, buflen, "PK - Key algorithm is unsupported (only RSA and EC are supported)" ); if( use_ret == -(MBEDTLS_ERR_PK_PASSWORD_REQUIRED) ) mbedtls_snprintf( buf, buflen, "PK - Private key password can't be empty" ); if( use_ret == -(MBEDTLS_ERR_PK_PASSWORD_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PK - Given private key password does not allow for correct decryption" ); if( use_ret == -(MBEDTLS_ERR_PK_INVALID_PUBKEY) ) mbedtls_snprintf( buf, buflen, "PK - The pubkey tag or value is invalid (only RSA and EC are supported)" ); if( use_ret == -(MBEDTLS_ERR_PK_INVALID_ALG) ) mbedtls_snprintf( buf, buflen, "PK - The algorithm tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE) ) mbedtls_snprintf( buf, buflen, "PK - Elliptic curve is unsupported (only NIST curves are supported)" ); if( use_ret == -(MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "PK - Unavailable feature, e.g. RSA disabled for RSA key" ); if( use_ret == -(MBEDTLS_ERR_PK_SIG_LEN_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PK - The buffer contains a valid signature followed by more data" ); if( use_ret == -(MBEDTLS_ERR_PK_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "PK - PK hardware accelerator failed" ); #endif /* MBEDTLS_PK_C */ #if defined(MBEDTLS_PKCS12_C) if( use_ret == -(MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "PKCS12 - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "PKCS12 - Feature not available, e.g. unsupported encryption scheme" ); if( use_ret == -(MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "PKCS12 - PBE ASN.1 data not as expected" ); if( use_ret == -(MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PKCS12 - Given private key password does not allow for correct decryption" ); #endif /* MBEDTLS_PKCS12_C */ #if defined(MBEDTLS_PKCS5_C) if( use_ret == -(MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "PKCS5 - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_PKCS5_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "PKCS5 - Unexpected ASN.1 data" ); if( use_ret == -(MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "PKCS5 - Requested encryption or digest alg not available" ); if( use_ret == -(MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH) ) mbedtls_snprintf( buf, buflen, "PKCS5 - Given private key password does not allow for correct decryption" ); #endif /* MBEDTLS_PKCS5_C */ #if defined(MBEDTLS_RSA_C) if( use_ret == -(MBEDTLS_ERR_RSA_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "RSA - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_RSA_INVALID_PADDING) ) mbedtls_snprintf( buf, buflen, "RSA - Input data contains invalid padding and is rejected" ); if( use_ret == -(MBEDTLS_ERR_RSA_KEY_GEN_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - Something failed during generation of a key" ); if( use_ret == -(MBEDTLS_ERR_RSA_KEY_CHECK_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - Key failed to pass the validity check of the library" ); if( use_ret == -(MBEDTLS_ERR_RSA_PUBLIC_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - The public key operation failed" ); if( use_ret == -(MBEDTLS_ERR_RSA_PRIVATE_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - The private key operation failed" ); if( use_ret == -(MBEDTLS_ERR_RSA_VERIFY_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - The PKCS#1 verification failed" ); if( use_ret == -(MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE) ) mbedtls_snprintf( buf, buflen, "RSA - The output buffer for decryption is not large enough" ); if( use_ret == -(MBEDTLS_ERR_RSA_RNG_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - The random generator failed to generate non-zeros" ); if( use_ret == -(MBEDTLS_ERR_RSA_UNSUPPORTED_OPERATION) ) mbedtls_snprintf( buf, buflen, "RSA - The implementation does not offer the requested operation, for example, because of security violations or lack of functionality" ); if( use_ret == -(MBEDTLS_ERR_RSA_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "RSA - RSA hardware accelerator failed" ); #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_SSL_TLS_C) if( use_ret == -(MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "SSL - The requested feature is not available" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "SSL - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_MAC) ) mbedtls_snprintf( buf, buflen, "SSL - Verification of the message MAC failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_RECORD) ) mbedtls_snprintf( buf, buflen, "SSL - An invalid SSL record was received" ); if( use_ret == -(MBEDTLS_ERR_SSL_CONN_EOF) ) mbedtls_snprintf( buf, buflen, "SSL - The connection indicated an EOF" ); if( use_ret == -(MBEDTLS_ERR_SSL_UNKNOWN_CIPHER) ) mbedtls_snprintf( buf, buflen, "SSL - An unknown cipher was received" ); if( use_ret == -(MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN) ) mbedtls_snprintf( buf, buflen, "SSL - The server has no ciphersuites in common with the client" ); if( use_ret == -(MBEDTLS_ERR_SSL_NO_RNG) ) mbedtls_snprintf( buf, buflen, "SSL - No RNG was provided to the SSL module" ); if( use_ret == -(MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE) ) mbedtls_snprintf( buf, buflen, "SSL - No client certification received from the client, but required by the authentication mode" ); if( use_ret == -(MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE) ) mbedtls_snprintf( buf, buflen, "SSL - Our own certificate(s) is/are too large to send in an SSL message" ); if( use_ret == -(MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED) ) mbedtls_snprintf( buf, buflen, "SSL - The own certificate is not set, but needed by the server" ); if( use_ret == -(MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED) ) mbedtls_snprintf( buf, buflen, "SSL - The own private key or pre-shared key is not set, but needed" ); if( use_ret == -(MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED) ) mbedtls_snprintf( buf, buflen, "SSL - No CA Chain is set, but required to operate" ); if( use_ret == -(MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE) ) mbedtls_snprintf( buf, buflen, "SSL - An unexpected message was received from our peer" ); if( use_ret == -(MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE) ) { mbedtls_snprintf( buf, buflen, "SSL - A fatal alert message was received from our peer" ); return; } if( use_ret == -(MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED) ) mbedtls_snprintf( buf, buflen, "SSL - Verification of our peer failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) ) mbedtls_snprintf( buf, buflen, "SSL - The peer notified us that the connection is going to be closed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientHello handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ServerHello handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the Certificate handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the CertificateRequest handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ServerKeyExchange handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ServerHelloDone handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the CertificateVerify handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the ChangeCipherSpec handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_FINISHED) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the Finished handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "SSL - Memory allocation failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "SSL - Hardware acceleration function returned with error" ); if( use_ret == -(MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH) ) mbedtls_snprintf( buf, buflen, "SSL - Hardware acceleration function skipped / left alone data" ); if( use_ret == -(MBEDTLS_ERR_SSL_COMPRESSION_FAILED) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the compression / decompression failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION) ) mbedtls_snprintf( buf, buflen, "SSL - Handshake protocol not within min/max boundaries" ); if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET) ) mbedtls_snprintf( buf, buflen, "SSL - Processing of the NewSessionTicket handshake message failed" ); if( use_ret == -(MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) ) mbedtls_snprintf( buf, buflen, "SSL - Session ticket has expired" ); if( use_ret == -(MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH) ) mbedtls_snprintf( buf, buflen, "SSL - Public key type mismatch (eg, asked for RSA key exchange and presented EC key)" ); if( use_ret == -(MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) ) mbedtls_snprintf( buf, buflen, "SSL - Unknown identity received (eg, PSK identity)" ); if( use_ret == -(MBEDTLS_ERR_SSL_INTERNAL_ERROR) ) mbedtls_snprintf( buf, buflen, "SSL - Internal error (eg, unexpected failure in lower-level module)" ); if( use_ret == -(MBEDTLS_ERR_SSL_COUNTER_WRAPPING) ) mbedtls_snprintf( buf, buflen, "SSL - A counter would wrap (eg, too many messages exchanged)" ); if( use_ret == -(MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO) ) mbedtls_snprintf( buf, buflen, "SSL - Unexpected message at ServerHello in renegotiation" ); if( use_ret == -(MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED) ) mbedtls_snprintf( buf, buflen, "SSL - DTLS client must retry for hello verification" ); if( use_ret == -(MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "SSL - A buffer is too small to receive or write a message" ); if( use_ret == -(MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE) ) mbedtls_snprintf( buf, buflen, "SSL - None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages)" ); if( use_ret == -(MBEDTLS_ERR_SSL_WANT_READ) ) mbedtls_snprintf( buf, buflen, "SSL - No data of requested type currently available on underlying transport" ); if( use_ret == -(MBEDTLS_ERR_SSL_WANT_WRITE) ) mbedtls_snprintf( buf, buflen, "SSL - Connection requires a write call" ); if( use_ret == -(MBEDTLS_ERR_SSL_TIMEOUT) ) mbedtls_snprintf( buf, buflen, "SSL - The operation timed out" ); if( use_ret == -(MBEDTLS_ERR_SSL_CLIENT_RECONNECT) ) mbedtls_snprintf( buf, buflen, "SSL - The client initiated a reconnect from the same port" ); if( use_ret == -(MBEDTLS_ERR_SSL_UNEXPECTED_RECORD) ) mbedtls_snprintf( buf, buflen, "SSL - Record header looks valid but is not expected" ); if( use_ret == -(MBEDTLS_ERR_SSL_NON_FATAL) ) mbedtls_snprintf( buf, buflen, "SSL - The alert message received indicates a non-fatal error" ); if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH) ) mbedtls_snprintf( buf, buflen, "SSL - Couldn't set the hash for verifying CertificateVerify" ); if( use_ret == -(MBEDTLS_ERR_SSL_CONTINUE_PROCESSING) ) mbedtls_snprintf( buf, buflen, "SSL - Internal-only message signaling that further message-processing should be done" ); if( use_ret == -(MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS) ) mbedtls_snprintf( buf, buflen, "SSL - The asynchronous operation is not completed yet" ); if( use_ret == -(MBEDTLS_ERR_SSL_EARLY_MESSAGE) ) mbedtls_snprintf( buf, buflen, "SSL - Internal-only message signaling that a message arrived early" ); if( use_ret == -(MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS) ) mbedtls_snprintf( buf, buflen, "SSL - A cryptographic operation is in progress. Try again later" ); #endif /* MBEDTLS_SSL_TLS_C */ #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) if( use_ret == -(MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "X509 - Unavailable feature, e.g. RSA hashing/encryption combination" ); if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_OID) ) mbedtls_snprintf( buf, buflen, "X509 - Requested OID is unknown" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_FORMAT) ) mbedtls_snprintf( buf, buflen, "X509 - The CRT/CRL/CSR format is invalid, e.g. different type expected" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_VERSION) ) mbedtls_snprintf( buf, buflen, "X509 - The CRT/CRL/CSR version element is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_SERIAL) ) mbedtls_snprintf( buf, buflen, "X509 - The serial tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_ALG) ) mbedtls_snprintf( buf, buflen, "X509 - The algorithm tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_NAME) ) mbedtls_snprintf( buf, buflen, "X509 - The name tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_DATE) ) mbedtls_snprintf( buf, buflen, "X509 - The date tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_SIGNATURE) ) mbedtls_snprintf( buf, buflen, "X509 - The signature tag or value invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_INVALID_EXTENSIONS) ) mbedtls_snprintf( buf, buflen, "X509 - The extension tag or value is invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_VERSION) ) mbedtls_snprintf( buf, buflen, "X509 - CRT/CRL/CSR has an unsupported version number" ); if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG) ) mbedtls_snprintf( buf, buflen, "X509 - Signature algorithm (oid) is unsupported" ); if( use_ret == -(MBEDTLS_ERR_X509_SIG_MISMATCH) ) mbedtls_snprintf( buf, buflen, "X509 - Signature algorithms do not match. (see \\c ::mbedtls_x509_crt sig_oid)" ); if( use_ret == -(MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) ) mbedtls_snprintf( buf, buflen, "X509 - Certificate verification failed, e.g. CRL, CA or signature check failed" ); if( use_ret == -(MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT) ) mbedtls_snprintf( buf, buflen, "X509 - Format not recognized as DER or PEM" ); if( use_ret == -(MBEDTLS_ERR_X509_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "X509 - Input invalid" ); if( use_ret == -(MBEDTLS_ERR_X509_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "X509 - Allocation of memory failed" ); if( use_ret == -(MBEDTLS_ERR_X509_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "X509 - Read/write of file failed" ); if( use_ret == -(MBEDTLS_ERR_X509_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "X509 - Destination buffer is too small" ); if( use_ret == -(MBEDTLS_ERR_X509_FATAL_ERROR) ) mbedtls_snprintf( buf, buflen, "X509 - A fatal error occured, eg the chain is too long or the vrfy callback failed" ); #endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */ // END generated code if( strlen( buf ) == 0 ) mbedtls_snprintf( buf, buflen, "UNKNOWN ERROR CODE (%04X)", use_ret ); } use_ret = ret & ~0xFF80; if( use_ret == 0 ) return; // If high level code is present, make a concatenation between both // error strings. // len = strlen( buf ); if( len > 0 ) { if( buflen - len < 5 ) return; mbedtls_snprintf( buf + len, buflen - len, " : " ); buf += len + 3; buflen -= len + 3; } // Low level error codes // // BEGIN generated code #if defined(MBEDTLS_AES_C) if( use_ret == -(MBEDTLS_ERR_AES_INVALID_KEY_LENGTH) ) mbedtls_snprintf( buf, buflen, "AES - Invalid key length" ); if( use_ret == -(MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "AES - Invalid data input length" ); if( use_ret == -(MBEDTLS_ERR_AES_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "AES - Invalid input data" ); if( use_ret == -(MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "AES - Feature not available. For example, an unsupported AES key size" ); if( use_ret == -(MBEDTLS_ERR_AES_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "AES - AES hardware accelerator failed" ); #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_ARC4_C) if( use_ret == -(MBEDTLS_ERR_ARC4_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "ARC4 - ARC4 hardware accelerator failed" ); #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_ARIA_C) if( use_ret == -(MBEDTLS_ERR_ARIA_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "ARIA - Bad input data" ); if( use_ret == -(MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "ARIA - Invalid data input length" ); if( use_ret == -(MBEDTLS_ERR_ARIA_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "ARIA - Feature not available. For example, an unsupported ARIA key size" ); if( use_ret == -(MBEDTLS_ERR_ARIA_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "ARIA - ARIA hardware accelerator failed" ); #endif /* MBEDTLS_ARIA_C */ #if defined(MBEDTLS_ASN1_PARSE_C) if( use_ret == -(MBEDTLS_ERR_ASN1_OUT_OF_DATA) ) mbedtls_snprintf( buf, buflen, "ASN1 - Out of data when parsing an ASN1 data structure" ); if( use_ret == -(MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) ) mbedtls_snprintf( buf, buflen, "ASN1 - ASN1 tag was of an unexpected value" ); if( use_ret == -(MBEDTLS_ERR_ASN1_INVALID_LENGTH) ) mbedtls_snprintf( buf, buflen, "ASN1 - Error when trying to determine the length or invalid length" ); if( use_ret == -(MBEDTLS_ERR_ASN1_LENGTH_MISMATCH) ) mbedtls_snprintf( buf, buflen, "ASN1 - Actual length differs from expected length" ); if( use_ret == -(MBEDTLS_ERR_ASN1_INVALID_DATA) ) mbedtls_snprintf( buf, buflen, "ASN1 - Data is invalid. (not used)" ); if( use_ret == -(MBEDTLS_ERR_ASN1_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "ASN1 - Memory allocation failed" ); if( use_ret == -(MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "ASN1 - Buffer too small when writing ASN.1 data structure" ); #endif /* MBEDTLS_ASN1_PARSE_C */ #if defined(MBEDTLS_BASE64_C) if( use_ret == -(MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "BASE64 - Output buffer too small" ); if( use_ret == -(MBEDTLS_ERR_BASE64_INVALID_CHARACTER) ) mbedtls_snprintf( buf, buflen, "BASE64 - Invalid character in input" ); #endif /* MBEDTLS_BASE64_C */ #if defined(MBEDTLS_BIGNUM_C) if( use_ret == -(MBEDTLS_ERR_MPI_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "BIGNUM - An error occurred while reading from or writing to a file" ); if( use_ret == -(MBEDTLS_ERR_MPI_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "BIGNUM - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_MPI_INVALID_CHARACTER) ) mbedtls_snprintf( buf, buflen, "BIGNUM - There is an invalid character in the digit string" ); if( use_ret == -(MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "BIGNUM - The buffer is too small to write to" ); if( use_ret == -(MBEDTLS_ERR_MPI_NEGATIVE_VALUE) ) mbedtls_snprintf( buf, buflen, "BIGNUM - The input arguments are negative or result in illegal output" ); if( use_ret == -(MBEDTLS_ERR_MPI_DIVISION_BY_ZERO) ) mbedtls_snprintf( buf, buflen, "BIGNUM - The input argument for division is zero, which is not allowed" ); if( use_ret == -(MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) ) mbedtls_snprintf( buf, buflen, "BIGNUM - The input arguments are not acceptable" ); if( use_ret == -(MBEDTLS_ERR_MPI_ALLOC_FAILED) ) mbedtls_snprintf( buf, buflen, "BIGNUM - Memory allocation failed" ); #endif /* MBEDTLS_BIGNUM_C */ #if defined(MBEDTLS_BLOWFISH_C) if( use_ret == -(MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "BLOWFISH - Bad input data" ); if( use_ret == -(MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "BLOWFISH - Invalid data input length" ); if( use_ret == -(MBEDTLS_ERR_BLOWFISH_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "BLOWFISH - Blowfish hardware accelerator failed" ); #endif /* MBEDTLS_BLOWFISH_C */ #if defined(MBEDTLS_CAMELLIA_C) if( use_ret == -(MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "CAMELLIA - Bad input data" ); if( use_ret == -(MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "CAMELLIA - Invalid data input length" ); if( use_ret == -(MBEDTLS_ERR_CAMELLIA_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CAMELLIA - Camellia hardware accelerator failed" ); #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_CCM_C) if( use_ret == -(MBEDTLS_ERR_CCM_BAD_INPUT) ) mbedtls_snprintf( buf, buflen, "CCM - Bad input parameters to the function" ); if( use_ret == -(MBEDTLS_ERR_CCM_AUTH_FAILED) ) mbedtls_snprintf( buf, buflen, "CCM - Authenticated decryption failed" ); if( use_ret == -(MBEDTLS_ERR_CCM_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CCM - CCM hardware accelerator failed" ); #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_CHACHA20_C) if( use_ret == -(MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "CHACHA20 - Invalid input parameter(s)" ); if( use_ret == -(MBEDTLS_ERR_CHACHA20_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "CHACHA20 - Feature not available. For example, s part of the API is not implemented" ); if( use_ret == -(MBEDTLS_ERR_CHACHA20_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CHACHA20 - Chacha20 hardware accelerator failed" ); #endif /* MBEDTLS_CHACHA20_C */ #if defined(MBEDTLS_CHACHAPOLY_C) if( use_ret == -(MBEDTLS_ERR_CHACHAPOLY_BAD_STATE) ) mbedtls_snprintf( buf, buflen, "CHACHAPOLY - The requested operation is not permitted in the current state" ); if( use_ret == -(MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED) ) mbedtls_snprintf( buf, buflen, "CHACHAPOLY - Authenticated decryption failed: data was not authentic" ); #endif /* MBEDTLS_CHACHAPOLY_C */ #if defined(MBEDTLS_CMAC_C) if( use_ret == -(MBEDTLS_ERR_CMAC_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "CMAC - CMAC hardware accelerator failed" ); #endif /* MBEDTLS_CMAC_C */ #if defined(MBEDTLS_CTR_DRBG_C) if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED) ) mbedtls_snprintf( buf, buflen, "CTR_DRBG - The entropy source failed" ); if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG) ) mbedtls_snprintf( buf, buflen, "CTR_DRBG - The requested random buffer length is too big" ); if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG) ) mbedtls_snprintf( buf, buflen, "CTR_DRBG - The input (entropy + additional data) is too large" ); if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "CTR_DRBG - Read or write error in file" ); #endif /* MBEDTLS_CTR_DRBG_C */ #if defined(MBEDTLS_DES_C) if( use_ret == -(MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "DES - The data input has an invalid length" ); if( use_ret == -(MBEDTLS_ERR_DES_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "DES - DES hardware accelerator failed" ); #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_ENTROPY_C) if( use_ret == -(MBEDTLS_ERR_ENTROPY_SOURCE_FAILED) ) mbedtls_snprintf( buf, buflen, "ENTROPY - Critical entropy source failure" ); if( use_ret == -(MBEDTLS_ERR_ENTROPY_MAX_SOURCES) ) mbedtls_snprintf( buf, buflen, "ENTROPY - No more sources can be added" ); if( use_ret == -(MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED) ) mbedtls_snprintf( buf, buflen, "ENTROPY - No sources have been added to poll" ); if( use_ret == -(MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE) ) mbedtls_snprintf( buf, buflen, "ENTROPY - No strong sources have been added to poll" ); if( use_ret == -(MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "ENTROPY - Read/write error in file" ); #endif /* MBEDTLS_ENTROPY_C */ #if defined(MBEDTLS_GCM_C) if( use_ret == -(MBEDTLS_ERR_GCM_AUTH_FAILED) ) mbedtls_snprintf( buf, buflen, "GCM - Authenticated decryption failed" ); if( use_ret == -(MBEDTLS_ERR_GCM_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "GCM - GCM hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_GCM_BAD_INPUT) ) mbedtls_snprintf( buf, buflen, "GCM - Bad input parameters to function" ); #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_HKDF_C) if( use_ret == -(MBEDTLS_ERR_HKDF_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "HKDF - Bad input parameters to function" ); #endif /* MBEDTLS_HKDF_C */ #if defined(MBEDTLS_HMAC_DRBG_C) if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG) ) mbedtls_snprintf( buf, buflen, "HMAC_DRBG - Too many random requested in single call" ); if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG) ) mbedtls_snprintf( buf, buflen, "HMAC_DRBG - Input too large (Entropy + additional)" ); if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR) ) mbedtls_snprintf( buf, buflen, "HMAC_DRBG - Read/write error in file" ); if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED) ) mbedtls_snprintf( buf, buflen, "HMAC_DRBG - The entropy source failed" ); #endif /* MBEDTLS_HMAC_DRBG_C */ #if defined(MBEDTLS_MD2_C) if( use_ret == -(MBEDTLS_ERR_MD2_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "MD2 - MD2 hardware accelerator failed" ); #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) if( use_ret == -(MBEDTLS_ERR_MD4_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "MD4 - MD4 hardware accelerator failed" ); #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) if( use_ret == -(MBEDTLS_ERR_MD5_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "MD5 - MD5 hardware accelerator failed" ); #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_NET_C) if( use_ret == -(MBEDTLS_ERR_NET_SOCKET_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Failed to open a socket" ); if( use_ret == -(MBEDTLS_ERR_NET_CONNECT_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - The connection to the given server / port failed" ); if( use_ret == -(MBEDTLS_ERR_NET_BIND_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Binding of the socket failed" ); if( use_ret == -(MBEDTLS_ERR_NET_LISTEN_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Could not listen on the socket" ); if( use_ret == -(MBEDTLS_ERR_NET_ACCEPT_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Could not accept the incoming connection" ); if( use_ret == -(MBEDTLS_ERR_NET_RECV_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Reading information from the socket failed" ); if( use_ret == -(MBEDTLS_ERR_NET_SEND_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Sending information through the socket failed" ); if( use_ret == -(MBEDTLS_ERR_NET_CONN_RESET) ) mbedtls_snprintf( buf, buflen, "NET - Connection was reset by peer" ); if( use_ret == -(MBEDTLS_ERR_NET_UNKNOWN_HOST) ) mbedtls_snprintf( buf, buflen, "NET - Failed to get an IP address for the given hostname" ); if( use_ret == -(MBEDTLS_ERR_NET_BUFFER_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "NET - Buffer is too small to hold the data" ); if( use_ret == -(MBEDTLS_ERR_NET_INVALID_CONTEXT) ) mbedtls_snprintf( buf, buflen, "NET - The context is invalid, eg because it was free()ed" ); if( use_ret == -(MBEDTLS_ERR_NET_POLL_FAILED) ) mbedtls_snprintf( buf, buflen, "NET - Polling the net context failed" ); if( use_ret == -(MBEDTLS_ERR_NET_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "NET - Input invalid" ); #endif /* MBEDTLS_NET_C */ #if defined(MBEDTLS_OID_C) if( use_ret == -(MBEDTLS_ERR_OID_NOT_FOUND) ) mbedtls_snprintf( buf, buflen, "OID - OID is not found" ); if( use_ret == -(MBEDTLS_ERR_OID_BUF_TOO_SMALL) ) mbedtls_snprintf( buf, buflen, "OID - output buffer is too small" ); #endif /* MBEDTLS_OID_C */ #if defined(MBEDTLS_PADLOCK_C) if( use_ret == -(MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED) ) mbedtls_snprintf( buf, buflen, "PADLOCK - Input data should be aligned" ); #endif /* MBEDTLS_PADLOCK_C */ #if defined(MBEDTLS_PLATFORM_C) if( use_ret == -(MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "PLATFORM - Hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED) ) mbedtls_snprintf( buf, buflen, "PLATFORM - The requested feature is not supported by the platform" ); #endif /* MBEDTLS_PLATFORM_C */ #if defined(MBEDTLS_POLY1305_C) if( use_ret == -(MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "POLY1305 - Invalid input parameter(s)" ); if( use_ret == -(MBEDTLS_ERR_POLY1305_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "POLY1305 - Feature not available. For example, s part of the API is not implemented" ); if( use_ret == -(MBEDTLS_ERR_POLY1305_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "POLY1305 - Poly1305 hardware accelerator failed" ); #endif /* MBEDTLS_POLY1305_C */ #if defined(MBEDTLS_RIPEMD160_C) if( use_ret == -(MBEDTLS_ERR_RIPEMD160_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "RIPEMD160 - RIPEMD160 hardware accelerator failed" ); #endif /* MBEDTLS_RIPEMD160_C */ #if defined(MBEDTLS_SHA1_C) if( use_ret == -(MBEDTLS_ERR_SHA1_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "SHA1 - SHA-1 hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_SHA1_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "SHA1 - SHA-1 input data was malformed" ); #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) if( use_ret == -(MBEDTLS_ERR_SHA256_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "SHA256 - SHA-256 hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_SHA256_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "SHA256 - SHA-256 input data was malformed" ); #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) if( use_ret == -(MBEDTLS_ERR_SHA512_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "SHA512 - SHA-512 hardware accelerator failed" ); if( use_ret == -(MBEDTLS_ERR_SHA512_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "SHA512 - SHA-512 input data was malformed" ); #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_THREADING_C) if( use_ret == -(MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE) ) mbedtls_snprintf( buf, buflen, "THREADING - The selected feature is not available" ); if( use_ret == -(MBEDTLS_ERR_THREADING_BAD_INPUT_DATA) ) mbedtls_snprintf( buf, buflen, "THREADING - Bad input parameters to function" ); if( use_ret == -(MBEDTLS_ERR_THREADING_MUTEX_ERROR) ) mbedtls_snprintf( buf, buflen, "THREADING - Locking / unlocking / free failed with error code" ); #endif /* MBEDTLS_THREADING_C */ #if defined(MBEDTLS_XTEA_C) if( use_ret == -(MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH) ) mbedtls_snprintf( buf, buflen, "XTEA - The data input has an invalid length" ); if( use_ret == -(MBEDTLS_ERR_XTEA_HW_ACCEL_FAILED) ) mbedtls_snprintf( buf, buflen, "XTEA - XTEA hardware accelerator failed" ); #endif /* MBEDTLS_XTEA_C */ // END generated code if( strlen( buf ) != 0 ) return; mbedtls_snprintf( buf, buflen, "UNKNOWN ERROR CODE (%04X)", use_ret ); } #else /* MBEDTLS_ERROR_C */ #if defined(MBEDTLS_ERROR_STRERROR_DUMMY) /* * Provide an non-function in case MBEDTLS_ERROR_C is not defined */ void mbedtls_strerror( int ret, char *buf, size_t buflen ) { ((void) ret); if( buflen > 0 ) buf[0] = '\0'; } #endif /* MBEDTLS_ERROR_STRERROR_DUMMY */ #endif /* MBEDTLS_ERROR_C */ fldigi-4.2.05/src/mbedtls/ssl_ticket.c0000664000175000017500000003222014611711171014513 00000000000000/* * TLS server tickets callbacks implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_TICKET_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/ssl_ticket.h" #include "mbedtls/platform_util.h" #include /* * Initialze context */ void mbedtls_ssl_ticket_init( mbedtls_ssl_ticket_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_ssl_ticket_context ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } #define MAX_KEY_BYTES 32 /* 256 bits */ /* * Generate/update a key */ static int ssl_ticket_gen_key( mbedtls_ssl_ticket_context *ctx, unsigned char index ) { int ret; unsigned char buf[MAX_KEY_BYTES]; mbedtls_ssl_ticket_key *key = ctx->keys + index; #if defined(MBEDTLS_HAVE_TIME) key->generation_time = (uint32_t) mbedtls_time( NULL ); #endif if( ( ret = ctx->f_rng( ctx->p_rng, key->name, sizeof( key->name ) ) ) != 0 ) return( ret ); if( ( ret = ctx->f_rng( ctx->p_rng, buf, sizeof( buf ) ) ) != 0 ) return( ret ); /* With GCM and CCM, same context can encrypt & decrypt */ ret = mbedtls_cipher_setkey( &key->ctx, buf, mbedtls_cipher_get_key_bitlen( &key->ctx ), MBEDTLS_ENCRYPT ); mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } /* * Rotate/generate keys if necessary */ static int ssl_ticket_update_keys( mbedtls_ssl_ticket_context *ctx ) { #if !defined(MBEDTLS_HAVE_TIME) ((void) ctx); #else if( ctx->ticket_lifetime != 0 ) { uint32_t current_time = (uint32_t) mbedtls_time( NULL ); uint32_t key_time = ctx->keys[ctx->active].generation_time; if( current_time >= key_time && current_time - key_time < ctx->ticket_lifetime ) { return( 0 ); } ctx->active = 1 - ctx->active; return( ssl_ticket_gen_key( ctx, ctx->active ) ); } else #endif /* MBEDTLS_HAVE_TIME */ return( 0 ); } /* * Setup context for actual use */ int mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_cipher_type_t cipher, uint32_t lifetime ) { int ret; const mbedtls_cipher_info_t *cipher_info; ctx->f_rng = f_rng; ctx->p_rng = p_rng; ctx->ticket_lifetime = lifetime; cipher_info = mbedtls_cipher_info_from_type( cipher); if( cipher_info == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( cipher_info->mode != MBEDTLS_MODE_GCM && cipher_info->mode != MBEDTLS_MODE_CCM ) { return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } if( cipher_info->key_bitlen > 8 * MAX_KEY_BYTES ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); if( ( ret = mbedtls_cipher_setup( &ctx->keys[0].ctx, cipher_info ) ) != 0 || ( ret = mbedtls_cipher_setup( &ctx->keys[1].ctx, cipher_info ) ) != 0 ) { return( ret ); } if( ( ret = ssl_ticket_gen_key( ctx, 0 ) ) != 0 || ( ret = ssl_ticket_gen_key( ctx, 1 ) ) != 0 ) { return( ret ); } return( 0 ); } /* * Serialize a session in the following format: * 0 . n-1 session structure, n = sizeof(mbedtls_ssl_session) * n . n+2 peer_cert length = m (0 if no certificate) * n+3 . n+2+m peer cert ASN.1 */ static int ssl_save_session( const mbedtls_ssl_session *session, unsigned char *buf, size_t buf_len, size_t *olen ) { unsigned char *p = buf; size_t left = buf_len; #if defined(MBEDTLS_X509_CRT_PARSE_C) size_t cert_len; #endif /* MBEDTLS_X509_CRT_PARSE_C */ if( left < sizeof( mbedtls_ssl_session ) ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); memcpy( p, session, sizeof( mbedtls_ssl_session ) ); p += sizeof( mbedtls_ssl_session ); left -= sizeof( mbedtls_ssl_session ); #if defined(MBEDTLS_X509_CRT_PARSE_C) if( session->peer_cert == NULL ) cert_len = 0; else cert_len = session->peer_cert->raw.len; if( left < 3 + cert_len ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); *p++ = (unsigned char)( ( cert_len >> 16 ) & 0xFF ); *p++ = (unsigned char)( ( cert_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( cert_len ) & 0xFF ); if( session->peer_cert != NULL ) memcpy( p, session->peer_cert->raw.p, cert_len ); p += cert_len; #endif /* MBEDTLS_X509_CRT_PARSE_C */ *olen = p - buf; return( 0 ); } /* * Unserialise session, see ssl_save_session() */ static int ssl_load_session( mbedtls_ssl_session *session, const unsigned char *buf, size_t len ) { const unsigned char *p = buf; const unsigned char * const end = buf + len; #if defined(MBEDTLS_X509_CRT_PARSE_C) size_t cert_len; #endif /* MBEDTLS_X509_CRT_PARSE_C */ if( sizeof( mbedtls_ssl_session ) > (size_t)( end - p ) ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); memcpy( session, p, sizeof( mbedtls_ssl_session ) ); p += sizeof( mbedtls_ssl_session ); #if defined(MBEDTLS_X509_CRT_PARSE_C) if( 3 > (size_t)( end - p ) ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2]; p += 3; if( cert_len == 0 ) { session->peer_cert = NULL; } else { int ret; if( cert_len > (size_t)( end - p ) ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); session->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) ); if( session->peer_cert == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); mbedtls_x509_crt_init( session->peer_cert ); if( ( ret = mbedtls_x509_crt_parse_der( session->peer_cert, p, cert_len ) ) != 0 ) { mbedtls_x509_crt_free( session->peer_cert ); mbedtls_free( session->peer_cert ); session->peer_cert = NULL; return( ret ); } p += cert_len; } #endif /* MBEDTLS_X509_CRT_PARSE_C */ if( p != end ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); return( 0 ); } /* * Create session ticket, with the following structure: * * struct { * opaque key_name[4]; * opaque iv[12]; * opaque encrypted_state<0..2^16-1>; * opaque tag[16]; * } ticket; * * The key_name, iv, and length of encrypted_state are the additional * authenticated data. */ int mbedtls_ssl_ticket_write( void *p_ticket, const mbedtls_ssl_session *session, unsigned char *start, const unsigned char *end, size_t *tlen, uint32_t *ticket_lifetime ) { int ret; mbedtls_ssl_ticket_context *ctx = p_ticket; mbedtls_ssl_ticket_key *key; unsigned char *key_name = start; unsigned char *iv = start + 4; unsigned char *state_len_bytes = iv + 12; unsigned char *state = state_len_bytes + 2; unsigned char *tag; size_t clear_len, ciph_len; *tlen = 0; if( ctx == NULL || ctx->f_rng == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); /* We need at least 4 bytes for key_name, 12 for IV, 2 for len 16 for tag, * in addition to session itself, that will be checked when writing it. */ if( end - start < 4 + 12 + 2 + 16 ) return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif if( ( ret = ssl_ticket_update_keys( ctx ) ) != 0 ) goto cleanup; key = &ctx->keys[ctx->active]; *ticket_lifetime = ctx->ticket_lifetime; memcpy( key_name, key->name, 4 ); if( ( ret = ctx->f_rng( ctx->p_rng, iv, 12 ) ) != 0 ) goto cleanup; /* Dump session state */ if( ( ret = ssl_save_session( session, state, end - state, &clear_len ) ) != 0 || (unsigned long) clear_len > 65535 ) { goto cleanup; } state_len_bytes[0] = ( clear_len >> 8 ) & 0xff; state_len_bytes[1] = ( clear_len ) & 0xff; /* Encrypt and authenticate */ tag = state + clear_len; if( ( ret = mbedtls_cipher_auth_encrypt( &key->ctx, iv, 12, key_name, 4 + 12 + 2, state, clear_len, state, &ciph_len, tag, 16 ) ) != 0 ) { goto cleanup; } if( ciph_len != clear_len ) { ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; goto cleanup; } *tlen = 4 + 12 + 2 + 16 + ciph_len; cleanup: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Select key based on name */ static mbedtls_ssl_ticket_key *ssl_ticket_select_key( mbedtls_ssl_ticket_context *ctx, const unsigned char name[4] ) { unsigned char i; for( i = 0; i < sizeof( ctx->keys ) / sizeof( *ctx->keys ); i++ ) if( memcmp( name, ctx->keys[i].name, 4 ) == 0 ) return( &ctx->keys[i] ); return( NULL ); } /* * Load session ticket (see mbedtls_ssl_ticket_write for structure) */ int mbedtls_ssl_ticket_parse( void *p_ticket, mbedtls_ssl_session *session, unsigned char *buf, size_t len ) { int ret; mbedtls_ssl_ticket_context *ctx = p_ticket; mbedtls_ssl_ticket_key *key; unsigned char *key_name = buf; unsigned char *iv = buf + 4; unsigned char *enc_len_p = iv + 12; unsigned char *ticket = enc_len_p + 2; unsigned char *tag; size_t enc_len, clear_len; if( ctx == NULL || ctx->f_rng == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); /* See mbedtls_ssl_ticket_write() */ if( len < 4 + 12 + 2 + 16 ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif if( ( ret = ssl_ticket_update_keys( ctx ) ) != 0 ) goto cleanup; enc_len = ( enc_len_p[0] << 8 ) | enc_len_p[1]; tag = ticket + enc_len; if( len != 4 + 12 + 2 + enc_len + 16 ) { ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA; goto cleanup; } /* Select key */ if( ( key = ssl_ticket_select_key( ctx, key_name ) ) == NULL ) { /* We can't know for sure but this is a likely option unless we're * under attack - this is only informative anyway */ ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED; goto cleanup; } /* Decrypt and authenticate */ if( ( ret = mbedtls_cipher_auth_decrypt( &key->ctx, iv, 12, key_name, 4 + 12 + 2, ticket, enc_len, ticket, &clear_len, tag, 16 ) ) != 0 ) { if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED ) ret = MBEDTLS_ERR_SSL_INVALID_MAC; goto cleanup; } if( clear_len != enc_len ) { ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; goto cleanup; } /* Actually load session */ if( ( ret = ssl_load_session( session, ticket, clear_len ) ) != 0 ) goto cleanup; #if defined(MBEDTLS_HAVE_TIME) { /* Check for expiration */ mbedtls_time_t current_time = mbedtls_time( NULL ); if( current_time < session->start || (uint32_t)( current_time - session->start ) > ctx->ticket_lifetime ) { ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED; goto cleanup; } } #endif cleanup: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Free context */ void mbedtls_ssl_ticket_free( mbedtls_ssl_ticket_context *ctx ) { mbedtls_cipher_free( &ctx->keys[0].ctx ); mbedtls_cipher_free( &ctx->keys[1].ctx ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ssl_ticket_context ) ); } #endif /* MBEDTLS_SSL_TICKET_C */ fldigi-4.2.05/src/mbedtls/certs.c0000664000175000017500000005253514611711171013502 00000000000000/* * X.509 test certificates * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #include "mbedtls/certs.h" #if defined(MBEDTLS_CERTS_C) #if defined(MBEDTLS_ECDSA_C) #define TEST_CA_CRT_EC \ "-----BEGIN CERTIFICATE-----\r\n" \ "MIICUjCCAdegAwIBAgIJAMFD4n5iQ8zoMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYT\r\n" \ "Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \ "QyBDQTAeFw0xMzA5MjQxNTQ5NDhaFw0yMzA5MjIxNTQ5NDhaMD4xCzAJBgNVBAYT\r\n" \ "Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\r\n" \ "QyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMPaKzRBN1gvh1b+/Im6KUNLTuBu\r\n" \ "ww5XUzM5WNRStJGVOQsj318XJGJI/BqVKc4sLYfCiFKAr9ZqqyHduNMcbli4yuiy\r\n" \ "aY7zQa0pw7RfdadHb9UZKVVpmlM7ILRmFmAzHqOBoDCBnTAdBgNVHQ4EFgQUnW0g\r\n" \ "JEkBPyvLeLUZvH4kydv7NnwwbgYDVR0jBGcwZYAUnW0gJEkBPyvLeLUZvH4kydv7\r\n" \ "NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UE\r\n" \ "AxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAwGA1UdEwQFMAMBAf8w\r\n" \ "CgYIKoZIzj0EAwIDaQAwZgIxAMO0YnNWKJUAfXgSJtJxexn4ipg+kv4znuR50v56\r\n" \ "t4d0PCu412mUC6Nnd7izvtE2MgIxAP1nnJQjZ8BWukszFQDG48wxCCyci9qpdSMv\r\n" \ "uCjn8pwUOkABXK8Mss90fzCfCEOtIA==\r\n" \ "-----END CERTIFICATE-----\r\n" const char mbedtls_test_ca_crt_ec[] = TEST_CA_CRT_EC; const size_t mbedtls_test_ca_crt_ec_len = sizeof( mbedtls_test_ca_crt_ec ); const char mbedtls_test_ca_key_ec[] = "-----BEGIN EC PRIVATE KEY-----\r\n" "Proc-Type: 4,ENCRYPTED\r\n" "DEK-Info: DES-EDE3-CBC,307EAB469933D64E\r\n" "\r\n" "IxbrRmKcAzctJqPdTQLA4SWyBYYGYJVkYEna+F7Pa5t5Yg/gKADrFKcm6B72e7DG\r\n" "ihExtZI648s0zdYw6qSJ74vrPSuWDe5qm93BqsfVH9svtCzWHW0pm1p0KTBCFfUq\r\n" "UsuWTITwJImcnlAs1gaRZ3sAWm7cOUidL0fo2G0fYUFNcYoCSLffCFTEHBuPnagb\r\n" "a77x/sY1Bvii8S9/XhDTb6pTMx06wzrm\r\n" "-----END EC PRIVATE KEY-----\r\n"; const size_t mbedtls_test_ca_key_ec_len = sizeof( mbedtls_test_ca_key_ec ); const char mbedtls_test_ca_pwd_ec[] = "PolarSSLTest"; const size_t mbedtls_test_ca_pwd_ec_len = sizeof( mbedtls_test_ca_pwd_ec ) - 1; const char mbedtls_test_srv_crt_ec[] = "-----BEGIN CERTIFICATE-----\r\n" "MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n" "MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDBZMBMGByqGSM49AgEG\r\n" "CCqGSM49AwEHA0IABDfMVtl2CR5acj7HWS3/IG7ufPkGkXTQrRS192giWWKSTuUA\r\n" "2CMR/+ov0jRdXRa9iojCa3cNVc2KKg76Aci07f+jgZ0wgZowCQYDVR0TBAIwADAd\r\n" "BgNVHQ4EFgQUUGGlj9QH2deCAQzlZX+MY0anE74wbgYDVR0jBGcwZYAUnW0gJEkB\r\n" "PyvLeLUZvH4kydv7NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xh\r\n" "clNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAoG\r\n" "CCqGSM49BAMCA2gAMGUCMQCaLFzXptui5WQN8LlO3ddh1hMxx6tzgLvT03MTVK2S\r\n" "C12r0Lz3ri/moSEpNZWqPjkCMCE2f53GXcYLqyfyJR078c/xNSUU5+Xxl7VZ414V\r\n" "fGa5kHvHARBPc8YAIVIqDvHH1Q==\r\n" "-----END CERTIFICATE-----\r\n"; const size_t mbedtls_test_srv_crt_ec_len = sizeof( mbedtls_test_srv_crt_ec ); const char mbedtls_test_srv_key_ec[] = "-----BEGIN EC PRIVATE KEY-----\r\n" "MHcCAQEEIPEqEyB2AnCoPL/9U/YDHvdqXYbIogTywwyp6/UfDw6noAoGCCqGSM49\r\n" "AwEHoUQDQgAEN8xW2XYJHlpyPsdZLf8gbu58+QaRdNCtFLX3aCJZYpJO5QDYIxH/\r\n" "6i/SNF1dFr2KiMJrdw1VzYoqDvoByLTt/w==\r\n" "-----END EC PRIVATE KEY-----\r\n"; const size_t mbedtls_test_srv_key_ec_len = sizeof( mbedtls_test_srv_key_ec ); const char mbedtls_test_cli_crt_ec[] = "-----BEGIN CERTIFICATE-----\r\n" "MIICLDCCAbKgAwIBAgIBDTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\r\n" "MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjBBMQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UEChMIUG9sYXJTU0wxHzAdBgNVBAMTFlBvbGFyU1NMIFRlc3QgQ2xpZW50IDIw\r\n" "WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARX5a6xc9/TrLuTuIH/Eq7u5lOszlVT\r\n" "9jQOzC7jYyUL35ji81xgNpbA1RgUcOV/n9VLRRjlsGzVXPiWj4dwo+THo4GdMIGa\r\n" "MAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMG4GA1Ud\r\n" "IwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8oUKkQDA+MQswCQYDVQQGEwJOTDER\r\n" "MA8GA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0GC\r\n" "CQDBQ+J+YkPM6DAKBggqhkjOPQQDAgNoADBlAjBKZQ17IIOimbmoD/yN7o89u3BM\r\n" "lgOsjnhw3fIOoLIWy2WOGsk/LGF++DzvrRzuNiACMQCd8iem1XS4JK7haj8xocpU\r\n" "LwjQje5PDGHfd3h9tP38Qknu5bJqws0md2KOKHyeV0U=\r\n" "-----END CERTIFICATE-----\r\n"; const size_t mbedtls_test_cli_crt_ec_len = sizeof( mbedtls_test_cli_crt_ec ); const char mbedtls_test_cli_key_ec[] = "-----BEGIN EC PRIVATE KEY-----\r\n" "MHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49\r\n" "AwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW\r\n" "wNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw==\r\n" "-----END EC PRIVATE KEY-----\r\n"; const size_t mbedtls_test_cli_key_ec_len = sizeof( mbedtls_test_cli_key_ec ); #endif /* MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_RSA_C) #if defined(MBEDTLS_SHA256_C) #define TEST_CA_CRT_RSA_SHA256 \ "-----BEGIN CERTIFICATE-----\r\n" \ "MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" \ "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ "MTcwNTA0MTY1NzAxWhcNMjcwNTA1MTY1NzAxWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ "A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ "gZUwgZIwHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/MGMGA1UdIwRcMFqA\r\n" \ "FLRa5KWz3tJS9rnVppUP6z68x/3/oT+kPTA7MQswCQYDVQQGEwJOTDERMA8GA1UE\r\n" \ "CgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0GCAQAwDAYDVR0T\r\n" \ "BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAHK/HHrTZMnnVMpde1io+voAtql7j\r\n" \ "4sRhLrjD7o3THtwRbDa2diCvpq0Sq23Ng2LMYoXsOxoL/RQK3iN7UKxV3MKPEr0w\r\n" \ "XQS+kKQqiT2bsfrjnWMVHZtUOMpm6FNqcdGm/Rss3vKda2lcKl8kUnq/ylc1+QbB\r\n" \ "G6A6tUvQcr2ZyWfVg+mM5XkhTrOOXus2OLikb4WwEtJTJRNE0f+yPODSUz0/vT57\r\n" \ "ApH0CnB80bYJshYHPHHymOtleAB8KSYtqm75g/YNobjnjB6cm4HkW3OZRVIl6fYY\r\n" \ "n20NRVA1Vjs6GAROr4NqW4k/+LofY9y0LLDE+p0oIEKXIsIvhPr39swxSA==\r\n" \ "-----END CERTIFICATE-----\r\n" const char mbedtls_test_ca_crt_rsa[] = TEST_CA_CRT_RSA_SHA256; const size_t mbedtls_test_ca_crt_rsa_len = sizeof( mbedtls_test_ca_crt_rsa ); #define TEST_CA_CRT_RSA_SOME static const char mbedtls_test_ca_crt_rsa_sha256[] = TEST_CA_CRT_RSA_SHA256; #endif #if !defined(TEST_CA_CRT_RSA_SOME) || defined(MBEDTLS_SHA1_C) #define TEST_CA_CRT_RSA_SHA1 \ "-----BEGIN CERTIFICATE-----\r\n" \ "MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" \ "MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" \ "MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\r\n" \ "A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\r\n" \ "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\r\n" \ "mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\r\n" \ "50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\r\n" \ "YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\r\n" \ "R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\r\n" \ "KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\r\n" \ "gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\r\n" \ "/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\r\n" \ "BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\r\n" \ "dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\r\n" \ "SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\r\n" \ "DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\r\n" \ "pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\r\n" \ "m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\r\n" \ "7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\r\n" \ "-----END CERTIFICATE-----\r\n" #if !defined (TEST_CA_CRT_RSA_SOME) const char mbedtls_test_ca_crt_rsa[] = TEST_CA_CRT_RSA_SHA1; const size_t mbedtls_test_ca_crt_rsa_len = sizeof( mbedtls_test_ca_crt_rsa ); #endif static const char mbedtls_test_ca_crt_rsa_sha1[] = TEST_CA_CRT_RSA_SHA1; #endif const char mbedtls_test_ca_key_rsa[] = "-----BEGIN RSA PRIVATE KEY-----\r\n" "Proc-Type: 4,ENCRYPTED\r\n" "DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B\r\n" "\r\n" "9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA\r\n" "7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq\r\n" "Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo\r\n" "PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb\r\n" "GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9\r\n" "gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq\r\n" "QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w\r\n" "PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x\r\n" "vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU\r\n" "WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X\r\n" "JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR\r\n" "KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe\r\n" "Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J\r\n" "9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2\r\n" "iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/\r\n" "tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT\r\n" "P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL\r\n" "1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb\r\n" "nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5\r\n" "X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq\r\n" "rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz\r\n" "L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l\r\n" "I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR\r\n" "wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde\r\n" "P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2\r\n" "-----END RSA PRIVATE KEY-----\r\n"; const size_t mbedtls_test_ca_key_rsa_len = sizeof( mbedtls_test_ca_key_rsa ); const char mbedtls_test_ca_pwd_rsa[] = "PolarSSLTest"; const size_t mbedtls_test_ca_pwd_rsa_len = sizeof( mbedtls_test_ca_pwd_rsa ) - 1; /* tests/data_files/server2.crt */ const char mbedtls_test_srv_crt_rsa[] = "-----BEGIN CERTIFICATE-----\r\n" "MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\r\n" "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" "MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UECgwIUG9sYXJTU0wxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\r\n" "AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\r\n" "owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\r\n" "NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\r\n" "tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\r\n" "hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\r\n" "HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\r\n" "VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\r\n" "FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAAFzC0rF\r\n" "y6De8WMcdgQrEw3AhBHFjzqnxZw1ene4IBSC7lTw8rBSy3jOWQdPUWn+0y/pCeeF\r\n" "kti6sevFdl1hLemGtd4q+T9TKEKGg3ND4ARfB5AUZZ9uEHq8WBkiwus5clGS17Qd\r\n" "dS/TOisB59tQruLx1E1bPLtBKyqk4koC5WAULJwfpswGSyWJTpYwIpxcWE3D2tBu\r\n" "UB6MZfXZFzWmWEOyKbeoXjXe8GBCGgHLywvYDsGQ36HSGtEsAvR2QaTLSxWYcfk1\r\n" "fbDn4jSWkb4yZy1r01UEigFQtONieGwRFaUqEcFJHJvEEGVgh9keaVlOj2vrwf5r\r\n" "4mN4lW7gLdenN6g=\r\n" "-----END CERTIFICATE-----\r\n"; const size_t mbedtls_test_srv_crt_rsa_len = sizeof( mbedtls_test_srv_crt_rsa ); /* tests/data_files/server2.key */ const char mbedtls_test_srv_key_rsa[] = "-----BEGIN RSA PRIVATE KEY-----\r\n" "MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r\r\n" "lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2\r\n" "2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ\r\n" "Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i\r\n" "GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb\r\n" "y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ\r\n" "++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G\r\n" "Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z\r\n" "/r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm\r\n" "WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He\r\n" "GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa\r\n" "TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28\r\n" "CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK\r\n" "nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u\r\n" "AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g\r\n" "sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s\r\n" "mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic\r\n" "BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv\r\n" "whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b\r\n" "vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs\r\n" "3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP\r\n" "3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED\r\n" "ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH\r\n" "4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE\r\n" "TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg==\r\n" "-----END RSA PRIVATE KEY-----\r\n"; const size_t mbedtls_test_srv_key_rsa_len = sizeof( mbedtls_test_srv_key_rsa ); /* tests/data_files/cli-rsa-sha256.crt */ const char mbedtls_test_cli_crt_rsa[] = "-----BEGIN CERTIFICATE-----\r\n" "MIIDPzCCAiegAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\r\n" "MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\r\n" "MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA8MQswCQYDVQQGEwJOTDERMA8G\r\n" "A1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\r\n" "BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\r\n" "M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\r\n" "1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\r\n" "MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\r\n" "4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\r\n" "/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\r\n" "o00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITAf\r\n" "BgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQsFAAOC\r\n" "AQEAlHabem2Tu69VUN7EipwnQn1dIHdgvT5i+iQHpSxY1crPnBbAeSdAXwsVEqLQ\r\n" "gOOIAQD5VIITNuoGgo4i+4OpNh9u7ZkpRHla+/swsfrFWRRbBNP5Bcu74AGLstwU\r\n" "zM8gIkBiyfM1Q1qDQISV9trlCG6O8vh8dp/rbI3rfzo99BOHXgFCrzXjCuW4vDsF\r\n" "r+Dao26bX3sJ6UnEWg1H3o2x6PpUcvQ36h71/bz4TEbbUUEpe02V4QWuL+wrhHJL\r\n" "U7o3SVE3Og7jPF8sat0a50YUWhwEFI256m02KAXLg89ueUyYKEr6rNwhcvXJpvU9\r\n" "giIVvd0Sbjjnn7NC4VDbcXV8vw==\r\n" "-----END CERTIFICATE-----\r\n"; const size_t mbedtls_test_cli_crt_rsa_len = sizeof( mbedtls_test_cli_crt_rsa ); /* tests/data_files/cli-rsa.key */ const char mbedtls_test_cli_key_rsa[] = "-----BEGIN RSA PRIVATE KEY-----\r\n" "MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF\r\n" "B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1\r\n" "bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9\r\n" "Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH\r\n" "7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v\r\n" "dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst\r\n" "yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz\r\n" "4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt\r\n" "ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA\r\n" "zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d\r\n" "l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf\r\n" "DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT\r\n" "VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL\r\n" "Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7\r\n" "wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys\r\n" "c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi\r\n" "33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60\r\n" "ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0\r\n" "BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW\r\n" "KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+\r\n" "UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc\r\n" "7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq\r\n" "gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu\r\n" "bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv\r\n" "8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA==\r\n" "-----END RSA PRIVATE KEY-----\r\n"; const size_t mbedtls_test_cli_key_rsa_len = sizeof( mbedtls_test_cli_key_rsa ); #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_PEM_PARSE_C) /* Concatenation of all available CA certificates */ const char mbedtls_test_cas_pem[] = #ifdef TEST_CA_CRT_RSA_SHA1 TEST_CA_CRT_RSA_SHA1 #endif #ifdef TEST_CA_CRT_RSA_SHA256 TEST_CA_CRT_RSA_SHA256 #endif #ifdef TEST_CA_CRT_EC TEST_CA_CRT_EC #endif ""; const size_t mbedtls_test_cas_pem_len = sizeof( mbedtls_test_cas_pem ); #endif /* List of all available CA certificates */ const char * mbedtls_test_cas[] = { #if defined(TEST_CA_CRT_RSA_SHA1) mbedtls_test_ca_crt_rsa_sha1, #endif #if defined(TEST_CA_CRT_RSA_SHA256) mbedtls_test_ca_crt_rsa_sha256, #endif #if defined(MBEDTLS_ECDSA_C) mbedtls_test_ca_crt_ec, #endif NULL }; const size_t mbedtls_test_cas_len[] = { #if defined(TEST_CA_CRT_RSA_SHA1) sizeof( mbedtls_test_ca_crt_rsa_sha1 ), #endif #if defined(TEST_CA_CRT_RSA_SHA256) sizeof( mbedtls_test_ca_crt_rsa_sha256 ), #endif #if defined(MBEDTLS_ECDSA_C) sizeof( mbedtls_test_ca_crt_ec ), #endif 0 }; #if defined(MBEDTLS_RSA_C) const char *mbedtls_test_ca_crt = mbedtls_test_ca_crt_rsa; /* SHA1 or SHA256 */ const char *mbedtls_test_ca_key = mbedtls_test_ca_key_rsa; const char *mbedtls_test_ca_pwd = mbedtls_test_ca_pwd_rsa; const char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_rsa; const char *mbedtls_test_srv_key = mbedtls_test_srv_key_rsa; const char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_rsa; const char *mbedtls_test_cli_key = mbedtls_test_cli_key_rsa; const size_t mbedtls_test_ca_crt_len = sizeof( mbedtls_test_ca_crt_rsa ); const size_t mbedtls_test_ca_key_len = sizeof( mbedtls_test_ca_key_rsa ); const size_t mbedtls_test_ca_pwd_len = sizeof( mbedtls_test_ca_pwd_rsa ) - 1; const size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_rsa ); const size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_rsa ); const size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_rsa ); const size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_rsa ); #else /* ! MBEDTLS_RSA_C, so MBEDTLS_ECDSA_C */ const char *mbedtls_test_ca_crt = mbedtls_test_ca_crt_ec; const char *mbedtls_test_ca_key = mbedtls_test_ca_key_ec; const char *mbedtls_test_ca_pwd = mbedtls_test_ca_pwd_ec; const char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_ec; const char *mbedtls_test_srv_key = mbedtls_test_srv_key_ec; const char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_ec; const char *mbedtls_test_cli_key = mbedtls_test_cli_key_ec; const size_t mbedtls_test_ca_crt_len = sizeof( mbedtls_test_ca_crt_ec ); const size_t mbedtls_test_ca_key_len = sizeof( mbedtls_test_ca_key_ec ); const size_t mbedtls_test_ca_pwd_len = sizeof( mbedtls_test_ca_pwd_ec ) - 1; const size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_ec ); const size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_ec ); const size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_ec ); const size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_ec ); #endif /* MBEDTLS_RSA_C */ #endif /* MBEDTLS_CERTS_C */ fldigi-4.2.05/src/mbedtls/version_features.c0000664000175000017500000006433014611711171015741 00000000000000/* * Version feature information * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_VERSION_C) #include "mbedtls/version.h" #include static const char *features[] = { #if defined(MBEDTLS_VERSION_FEATURES) #if defined(MBEDTLS_HAVE_ASM) "MBEDTLS_HAVE_ASM", #endif /* MBEDTLS_HAVE_ASM */ #if defined(MBEDTLS_NO_UDBL_DIVISION) "MBEDTLS_NO_UDBL_DIVISION", #endif /* MBEDTLS_NO_UDBL_DIVISION */ #if defined(MBEDTLS_NO_64BIT_MULTIPLICATION) "MBEDTLS_NO_64BIT_MULTIPLICATION", #endif /* MBEDTLS_NO_64BIT_MULTIPLICATION */ #if defined(MBEDTLS_HAVE_SSE2) "MBEDTLS_HAVE_SSE2", #endif /* MBEDTLS_HAVE_SSE2 */ #if defined(MBEDTLS_HAVE_TIME) "MBEDTLS_HAVE_TIME", #endif /* MBEDTLS_HAVE_TIME */ #if defined(MBEDTLS_HAVE_TIME_DATE) "MBEDTLS_HAVE_TIME_DATE", #endif /* MBEDTLS_HAVE_TIME_DATE */ #if defined(MBEDTLS_PLATFORM_MEMORY) "MBEDTLS_PLATFORM_MEMORY", #endif /* MBEDTLS_PLATFORM_MEMORY */ #if defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) "MBEDTLS_PLATFORM_NO_STD_FUNCTIONS", #endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ #if defined(MBEDTLS_PLATFORM_EXIT_ALT) "MBEDTLS_PLATFORM_EXIT_ALT", #endif /* MBEDTLS_PLATFORM_EXIT_ALT */ #if defined(MBEDTLS_PLATFORM_TIME_ALT) "MBEDTLS_PLATFORM_TIME_ALT", #endif /* MBEDTLS_PLATFORM_TIME_ALT */ #if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) "MBEDTLS_PLATFORM_FPRINTF_ALT", #endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_PRINTF_ALT) "MBEDTLS_PLATFORM_PRINTF_ALT", #endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) "MBEDTLS_PLATFORM_SNPRINTF_ALT", #endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ #if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) "MBEDTLS_PLATFORM_NV_SEED_ALT", #endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */ #if defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT) "MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT", #endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */ #if defined(MBEDTLS_DEPRECATED_WARNING) "MBEDTLS_DEPRECATED_WARNING", #endif /* MBEDTLS_DEPRECATED_WARNING */ #if defined(MBEDTLS_DEPRECATED_REMOVED) "MBEDTLS_DEPRECATED_REMOVED", #endif /* MBEDTLS_DEPRECATED_REMOVED */ #if defined(MBEDTLS_CHECK_PARAMS) "MBEDTLS_CHECK_PARAMS", #endif /* MBEDTLS_CHECK_PARAMS */ #if defined(MBEDTLS_TIMING_ALT) "MBEDTLS_TIMING_ALT", #endif /* MBEDTLS_TIMING_ALT */ #if defined(MBEDTLS_AES_ALT) "MBEDTLS_AES_ALT", #endif /* MBEDTLS_AES_ALT */ #if defined(MBEDTLS_ARC4_ALT) "MBEDTLS_ARC4_ALT", #endif /* MBEDTLS_ARC4_ALT */ #if defined(MBEDTLS_ARIA_ALT) "MBEDTLS_ARIA_ALT", #endif /* MBEDTLS_ARIA_ALT */ #if defined(MBEDTLS_BLOWFISH_ALT) "MBEDTLS_BLOWFISH_ALT", #endif /* MBEDTLS_BLOWFISH_ALT */ #if defined(MBEDTLS_CAMELLIA_ALT) "MBEDTLS_CAMELLIA_ALT", #endif /* MBEDTLS_CAMELLIA_ALT */ #if defined(MBEDTLS_CCM_ALT) "MBEDTLS_CCM_ALT", #endif /* MBEDTLS_CCM_ALT */ #if defined(MBEDTLS_CHACHA20_ALT) "MBEDTLS_CHACHA20_ALT", #endif /* MBEDTLS_CHACHA20_ALT */ #if defined(MBEDTLS_CHACHAPOLY_ALT) "MBEDTLS_CHACHAPOLY_ALT", #endif /* MBEDTLS_CHACHAPOLY_ALT */ #if defined(MBEDTLS_CMAC_ALT) "MBEDTLS_CMAC_ALT", #endif /* MBEDTLS_CMAC_ALT */ #if defined(MBEDTLS_DES_ALT) "MBEDTLS_DES_ALT", #endif /* MBEDTLS_DES_ALT */ #if defined(MBEDTLS_DHM_ALT) "MBEDTLS_DHM_ALT", #endif /* MBEDTLS_DHM_ALT */ #if defined(MBEDTLS_ECJPAKE_ALT) "MBEDTLS_ECJPAKE_ALT", #endif /* MBEDTLS_ECJPAKE_ALT */ #if defined(MBEDTLS_GCM_ALT) "MBEDTLS_GCM_ALT", #endif /* MBEDTLS_GCM_ALT */ #if defined(MBEDTLS_NIST_KW_ALT) "MBEDTLS_NIST_KW_ALT", #endif /* MBEDTLS_NIST_KW_ALT */ #if defined(MBEDTLS_MD2_ALT) "MBEDTLS_MD2_ALT", #endif /* MBEDTLS_MD2_ALT */ #if defined(MBEDTLS_MD4_ALT) "MBEDTLS_MD4_ALT", #endif /* MBEDTLS_MD4_ALT */ #if defined(MBEDTLS_MD5_ALT) "MBEDTLS_MD5_ALT", #endif /* MBEDTLS_MD5_ALT */ #if defined(MBEDTLS_POLY1305_ALT) "MBEDTLS_POLY1305_ALT", #endif /* MBEDTLS_POLY1305_ALT */ #if defined(MBEDTLS_RIPEMD160_ALT) "MBEDTLS_RIPEMD160_ALT", #endif /* MBEDTLS_RIPEMD160_ALT */ #if defined(MBEDTLS_RSA_ALT) "MBEDTLS_RSA_ALT", #endif /* MBEDTLS_RSA_ALT */ #if defined(MBEDTLS_SHA1_ALT) "MBEDTLS_SHA1_ALT", #endif /* MBEDTLS_SHA1_ALT */ #if defined(MBEDTLS_SHA256_ALT) "MBEDTLS_SHA256_ALT", #endif /* MBEDTLS_SHA256_ALT */ #if defined(MBEDTLS_SHA512_ALT) "MBEDTLS_SHA512_ALT", #endif /* MBEDTLS_SHA512_ALT */ #if defined(MBEDTLS_XTEA_ALT) "MBEDTLS_XTEA_ALT", #endif /* MBEDTLS_XTEA_ALT */ #if defined(MBEDTLS_ECP_ALT) "MBEDTLS_ECP_ALT", #endif /* MBEDTLS_ECP_ALT */ #if defined(MBEDTLS_MD2_PROCESS_ALT) "MBEDTLS_MD2_PROCESS_ALT", #endif /* MBEDTLS_MD2_PROCESS_ALT */ #if defined(MBEDTLS_MD4_PROCESS_ALT) "MBEDTLS_MD4_PROCESS_ALT", #endif /* MBEDTLS_MD4_PROCESS_ALT */ #if defined(MBEDTLS_MD5_PROCESS_ALT) "MBEDTLS_MD5_PROCESS_ALT", #endif /* MBEDTLS_MD5_PROCESS_ALT */ #if defined(MBEDTLS_RIPEMD160_PROCESS_ALT) "MBEDTLS_RIPEMD160_PROCESS_ALT", #endif /* MBEDTLS_RIPEMD160_PROCESS_ALT */ #if defined(MBEDTLS_SHA1_PROCESS_ALT) "MBEDTLS_SHA1_PROCESS_ALT", #endif /* MBEDTLS_SHA1_PROCESS_ALT */ #if defined(MBEDTLS_SHA256_PROCESS_ALT) "MBEDTLS_SHA256_PROCESS_ALT", #endif /* MBEDTLS_SHA256_PROCESS_ALT */ #if defined(MBEDTLS_SHA512_PROCESS_ALT) "MBEDTLS_SHA512_PROCESS_ALT", #endif /* MBEDTLS_SHA512_PROCESS_ALT */ #if defined(MBEDTLS_DES_SETKEY_ALT) "MBEDTLS_DES_SETKEY_ALT", #endif /* MBEDTLS_DES_SETKEY_ALT */ #if defined(MBEDTLS_DES_CRYPT_ECB_ALT) "MBEDTLS_DES_CRYPT_ECB_ALT", #endif /* MBEDTLS_DES_CRYPT_ECB_ALT */ #if defined(MBEDTLS_DES3_CRYPT_ECB_ALT) "MBEDTLS_DES3_CRYPT_ECB_ALT", #endif /* MBEDTLS_DES3_CRYPT_ECB_ALT */ #if defined(MBEDTLS_AES_SETKEY_ENC_ALT) "MBEDTLS_AES_SETKEY_ENC_ALT", #endif /* MBEDTLS_AES_SETKEY_ENC_ALT */ #if defined(MBEDTLS_AES_SETKEY_DEC_ALT) "MBEDTLS_AES_SETKEY_DEC_ALT", #endif /* MBEDTLS_AES_SETKEY_DEC_ALT */ #if defined(MBEDTLS_AES_ENCRYPT_ALT) "MBEDTLS_AES_ENCRYPT_ALT", #endif /* MBEDTLS_AES_ENCRYPT_ALT */ #if defined(MBEDTLS_AES_DECRYPT_ALT) "MBEDTLS_AES_DECRYPT_ALT", #endif /* MBEDTLS_AES_DECRYPT_ALT */ #if defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) "MBEDTLS_ECDH_GEN_PUBLIC_ALT", #endif /* MBEDTLS_ECDH_GEN_PUBLIC_ALT */ #if defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) "MBEDTLS_ECDH_COMPUTE_SHARED_ALT", #endif /* MBEDTLS_ECDH_COMPUTE_SHARED_ALT */ #if defined(MBEDTLS_ECDSA_VERIFY_ALT) "MBEDTLS_ECDSA_VERIFY_ALT", #endif /* MBEDTLS_ECDSA_VERIFY_ALT */ #if defined(MBEDTLS_ECDSA_SIGN_ALT) "MBEDTLS_ECDSA_SIGN_ALT", #endif /* MBEDTLS_ECDSA_SIGN_ALT */ #if defined(MBEDTLS_ECDSA_GENKEY_ALT) "MBEDTLS_ECDSA_GENKEY_ALT", #endif /* MBEDTLS_ECDSA_GENKEY_ALT */ #if defined(MBEDTLS_ECP_INTERNAL_ALT) "MBEDTLS_ECP_INTERNAL_ALT", #endif /* MBEDTLS_ECP_INTERNAL_ALT */ #if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) "MBEDTLS_ECP_RANDOMIZE_JAC_ALT", #endif /* MBEDTLS_ECP_RANDOMIZE_JAC_ALT */ #if defined(MBEDTLS_ECP_ADD_MIXED_ALT) "MBEDTLS_ECP_ADD_MIXED_ALT", #endif /* MBEDTLS_ECP_ADD_MIXED_ALT */ #if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) "MBEDTLS_ECP_DOUBLE_JAC_ALT", #endif /* MBEDTLS_ECP_DOUBLE_JAC_ALT */ #if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) "MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT", #endif /* MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT */ #if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) "MBEDTLS_ECP_NORMALIZE_JAC_ALT", #endif /* MBEDTLS_ECP_NORMALIZE_JAC_ALT */ #if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) "MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT", #endif /* MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT */ #if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) "MBEDTLS_ECP_RANDOMIZE_MXZ_ALT", #endif /* MBEDTLS_ECP_RANDOMIZE_MXZ_ALT */ #if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) "MBEDTLS_ECP_NORMALIZE_MXZ_ALT", #endif /* MBEDTLS_ECP_NORMALIZE_MXZ_ALT */ #if defined(MBEDTLS_TEST_NULL_ENTROPY) "MBEDTLS_TEST_NULL_ENTROPY", #endif /* MBEDTLS_TEST_NULL_ENTROPY */ #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) "MBEDTLS_ENTROPY_HARDWARE_ALT", #endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ #if defined(MBEDTLS_AES_ROM_TABLES) "MBEDTLS_AES_ROM_TABLES", #endif /* MBEDTLS_AES_ROM_TABLES */ #if defined(MBEDTLS_AES_FEWER_TABLES) "MBEDTLS_AES_FEWER_TABLES", #endif /* MBEDTLS_AES_FEWER_TABLES */ #if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY) "MBEDTLS_CAMELLIA_SMALL_MEMORY", #endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */ #if defined(MBEDTLS_CIPHER_MODE_CBC) "MBEDTLS_CIPHER_MODE_CBC", #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) "MBEDTLS_CIPHER_MODE_CFB", #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) "MBEDTLS_CIPHER_MODE_CTR", #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_OFB) "MBEDTLS_CIPHER_MODE_OFB", #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_XTS) "MBEDTLS_CIPHER_MODE_XTS", #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_CIPHER_NULL_CIPHER) "MBEDTLS_CIPHER_NULL_CIPHER", #endif /* MBEDTLS_CIPHER_NULL_CIPHER */ #if defined(MBEDTLS_CIPHER_PADDING_PKCS7) "MBEDTLS_CIPHER_PADDING_PKCS7", #endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */ #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) "MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS", #endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */ #if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN) "MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN", #endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */ #if defined(MBEDTLS_CIPHER_PADDING_ZEROS) "MBEDTLS_CIPHER_PADDING_ZEROS", #endif /* MBEDTLS_CIPHER_PADDING_ZEROS */ #if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES) "MBEDTLS_ENABLE_WEAK_CIPHERSUITES", #endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */ #if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES) "MBEDTLS_REMOVE_ARC4_CIPHERSUITES", #endif /* MBEDTLS_REMOVE_ARC4_CIPHERSUITES */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) "MBEDTLS_ECP_DP_SECP192R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) "MBEDTLS_ECP_DP_SECP224R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) "MBEDTLS_ECP_DP_SECP256R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) "MBEDTLS_ECP_DP_SECP384R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) "MBEDTLS_ECP_DP_SECP521R1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) "MBEDTLS_ECP_DP_SECP192K1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) "MBEDTLS_ECP_DP_SECP224K1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) "MBEDTLS_ECP_DP_SECP256K1_ENABLED", #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) "MBEDTLS_ECP_DP_BP256R1_ENABLED", #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) "MBEDTLS_ECP_DP_BP384R1_ENABLED", #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) "MBEDTLS_ECP_DP_BP512R1_ENABLED", #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) "MBEDTLS_ECP_DP_CURVE25519_ENABLED", #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) "MBEDTLS_ECP_DP_CURVE448_ENABLED", #endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ #if defined(MBEDTLS_ECP_NIST_OPTIM) "MBEDTLS_ECP_NIST_OPTIM", #endif /* MBEDTLS_ECP_NIST_OPTIM */ #if defined(MBEDTLS_ECP_RESTARTABLE) "MBEDTLS_ECP_RESTARTABLE", #endif /* MBEDTLS_ECP_RESTARTABLE */ #if defined(MBEDTLS_ECDSA_DETERMINISTIC) "MBEDTLS_ECDSA_DETERMINISTIC", #endif /* MBEDTLS_ECDSA_DETERMINISTIC */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) "MBEDTLS_KEY_EXCHANGE_PSK_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) "MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED", #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) "MBEDTLS_PK_PARSE_EC_EXTENDED", #endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */ #if defined(MBEDTLS_ERROR_STRERROR_DUMMY) "MBEDTLS_ERROR_STRERROR_DUMMY", #endif /* MBEDTLS_ERROR_STRERROR_DUMMY */ #if defined(MBEDTLS_GENPRIME) "MBEDTLS_GENPRIME", #endif /* MBEDTLS_GENPRIME */ #if defined(MBEDTLS_FS_IO) "MBEDTLS_FS_IO", #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) "MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES", #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */ #if defined(MBEDTLS_NO_PLATFORM_ENTROPY) "MBEDTLS_NO_PLATFORM_ENTROPY", #endif /* MBEDTLS_NO_PLATFORM_ENTROPY */ #if defined(MBEDTLS_ENTROPY_FORCE_SHA256) "MBEDTLS_ENTROPY_FORCE_SHA256", #endif /* MBEDTLS_ENTROPY_FORCE_SHA256 */ #if defined(MBEDTLS_ENTROPY_NV_SEED) "MBEDTLS_ENTROPY_NV_SEED", #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if defined(MBEDTLS_MEMORY_DEBUG) "MBEDTLS_MEMORY_DEBUG", #endif /* MBEDTLS_MEMORY_DEBUG */ #if defined(MBEDTLS_MEMORY_BACKTRACE) "MBEDTLS_MEMORY_BACKTRACE", #endif /* MBEDTLS_MEMORY_BACKTRACE */ #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) "MBEDTLS_PK_RSA_ALT_SUPPORT", #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ #if defined(MBEDTLS_PKCS1_V15) "MBEDTLS_PKCS1_V15", #endif /* MBEDTLS_PKCS1_V15 */ #if defined(MBEDTLS_PKCS1_V21) "MBEDTLS_PKCS1_V21", #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_RSA_NO_CRT) "MBEDTLS_RSA_NO_CRT", #endif /* MBEDTLS_RSA_NO_CRT */ #if defined(MBEDTLS_SELF_TEST) "MBEDTLS_SELF_TEST", #endif /* MBEDTLS_SELF_TEST */ #if defined(MBEDTLS_SHA256_SMALLER) "MBEDTLS_SHA256_SMALLER", #endif /* MBEDTLS_SHA256_SMALLER */ #if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES) "MBEDTLS_SSL_ALL_ALERT_MESSAGES", #endif /* MBEDTLS_SSL_ALL_ALERT_MESSAGES */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) "MBEDTLS_SSL_ASYNC_PRIVATE", #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ #if defined(MBEDTLS_SSL_DEBUG_ALL) "MBEDTLS_SSL_DEBUG_ALL", #endif /* MBEDTLS_SSL_DEBUG_ALL */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) "MBEDTLS_SSL_ENCRYPT_THEN_MAC", #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) "MBEDTLS_SSL_EXTENDED_MASTER_SECRET", #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_FALLBACK_SCSV) "MBEDTLS_SSL_FALLBACK_SCSV", #endif /* MBEDTLS_SSL_FALLBACK_SCSV */ #if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) "MBEDTLS_SSL_HW_RECORD_ACCEL", #endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) "MBEDTLS_SSL_CBC_RECORD_SPLITTING", #endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ #if defined(MBEDTLS_SSL_RENEGOTIATION) "MBEDTLS_SSL_RENEGOTIATION", #endif /* MBEDTLS_SSL_RENEGOTIATION */ #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) "MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO", #endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) "MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE", #endif /* MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) "MBEDTLS_SSL_MAX_FRAGMENT_LENGTH", #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_PROTO_SSL3) "MBEDTLS_SSL_PROTO_SSL3", #endif /* MBEDTLS_SSL_PROTO_SSL3 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) "MBEDTLS_SSL_PROTO_TLS1", #endif /* MBEDTLS_SSL_PROTO_TLS1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_1) "MBEDTLS_SSL_PROTO_TLS1_1", #endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) "MBEDTLS_SSL_PROTO_TLS1_2", #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_PROTO_DTLS) "MBEDTLS_SSL_PROTO_DTLS", #endif /* MBEDTLS_SSL_PROTO_DTLS */ #if defined(MBEDTLS_SSL_ALPN) "MBEDTLS_SSL_ALPN", #endif /* MBEDTLS_SSL_ALPN */ #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) "MBEDTLS_SSL_DTLS_ANTI_REPLAY", #endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) "MBEDTLS_SSL_DTLS_HELLO_VERIFY", #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE", #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE */ #if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) "MBEDTLS_SSL_DTLS_BADMAC_LIMIT", #endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) "MBEDTLS_SSL_SESSION_TICKETS", #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_EXPORT_KEYS) "MBEDTLS_SSL_EXPORT_KEYS", #endif /* MBEDTLS_SSL_EXPORT_KEYS */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) "MBEDTLS_SSL_SERVER_NAME_INDICATION", #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) "MBEDTLS_SSL_TRUNCATED_HMAC", #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT) "MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT", #endif /* MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT */ #if defined(MBEDTLS_THREADING_ALT) "MBEDTLS_THREADING_ALT", #endif /* MBEDTLS_THREADING_ALT */ #if defined(MBEDTLS_THREADING_PTHREAD) "MBEDTLS_THREADING_PTHREAD", #endif /* MBEDTLS_THREADING_PTHREAD */ #if defined(MBEDTLS_VERSION_FEATURES) "MBEDTLS_VERSION_FEATURES", #endif /* MBEDTLS_VERSION_FEATURES */ #if defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3) "MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3", #endif /* MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 */ #if defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION) "MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION", #endif /* MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION */ #if defined(MBEDTLS_X509_CHECK_KEY_USAGE) "MBEDTLS_X509_CHECK_KEY_USAGE", #endif /* MBEDTLS_X509_CHECK_KEY_USAGE */ #if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) "MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE", #endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */ #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) "MBEDTLS_X509_RSASSA_PSS_SUPPORT", #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */ #if defined(MBEDTLS_ZLIB_SUPPORT) "MBEDTLS_ZLIB_SUPPORT", #endif /* MBEDTLS_ZLIB_SUPPORT */ #if defined(MBEDTLS_AESNI_C) "MBEDTLS_AESNI_C", #endif /* MBEDTLS_AESNI_C */ #if defined(MBEDTLS_AES_C) "MBEDTLS_AES_C", #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_ARC4_C) "MBEDTLS_ARC4_C", #endif /* MBEDTLS_ARC4_C */ #if defined(MBEDTLS_ASN1_PARSE_C) "MBEDTLS_ASN1_PARSE_C", #endif /* MBEDTLS_ASN1_PARSE_C */ #if defined(MBEDTLS_ASN1_WRITE_C) "MBEDTLS_ASN1_WRITE_C", #endif /* MBEDTLS_ASN1_WRITE_C */ #if defined(MBEDTLS_BASE64_C) "MBEDTLS_BASE64_C", #endif /* MBEDTLS_BASE64_C */ #if defined(MBEDTLS_BIGNUM_C) "MBEDTLS_BIGNUM_C", #endif /* MBEDTLS_BIGNUM_C */ #if defined(MBEDTLS_BLOWFISH_C) "MBEDTLS_BLOWFISH_C", #endif /* MBEDTLS_BLOWFISH_C */ #if defined(MBEDTLS_CAMELLIA_C) "MBEDTLS_CAMELLIA_C", #endif /* MBEDTLS_CAMELLIA_C */ #if defined(MBEDTLS_ARIA_C) "MBEDTLS_ARIA_C", #endif /* MBEDTLS_ARIA_C */ #if defined(MBEDTLS_CCM_C) "MBEDTLS_CCM_C", #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_CERTS_C) "MBEDTLS_CERTS_C", #endif /* MBEDTLS_CERTS_C */ #if defined(MBEDTLS_CHACHA20_C) "MBEDTLS_CHACHA20_C", #endif /* MBEDTLS_CHACHA20_C */ #if defined(MBEDTLS_CHACHAPOLY_C) "MBEDTLS_CHACHAPOLY_C", #endif /* MBEDTLS_CHACHAPOLY_C */ #if defined(MBEDTLS_CIPHER_C) "MBEDTLS_CIPHER_C", #endif /* MBEDTLS_CIPHER_C */ #if defined(MBEDTLS_CMAC_C) "MBEDTLS_CMAC_C", #endif /* MBEDTLS_CMAC_C */ #if defined(MBEDTLS_CTR_DRBG_C) "MBEDTLS_CTR_DRBG_C", #endif /* MBEDTLS_CTR_DRBG_C */ #if defined(MBEDTLS_DEBUG_C) "MBEDTLS_DEBUG_C", #endif /* MBEDTLS_DEBUG_C */ #if defined(MBEDTLS_DES_C) "MBEDTLS_DES_C", #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_DHM_C) "MBEDTLS_DHM_C", #endif /* MBEDTLS_DHM_C */ #if defined(MBEDTLS_ECDH_C) "MBEDTLS_ECDH_C", #endif /* MBEDTLS_ECDH_C */ #if defined(MBEDTLS_ECDSA_C) "MBEDTLS_ECDSA_C", #endif /* MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_ECJPAKE_C) "MBEDTLS_ECJPAKE_C", #endif /* MBEDTLS_ECJPAKE_C */ #if defined(MBEDTLS_ECP_C) "MBEDTLS_ECP_C", #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_ENTROPY_C) "MBEDTLS_ENTROPY_C", #endif /* MBEDTLS_ENTROPY_C */ #if defined(MBEDTLS_ERROR_C) "MBEDTLS_ERROR_C", #endif /* MBEDTLS_ERROR_C */ #if defined(MBEDTLS_GCM_C) "MBEDTLS_GCM_C", #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_HAVEGE_C) "MBEDTLS_HAVEGE_C", #endif /* MBEDTLS_HAVEGE_C */ #if defined(MBEDTLS_HKDF_C) "MBEDTLS_HKDF_C", #endif /* MBEDTLS_HKDF_C */ #if defined(MBEDTLS_HMAC_DRBG_C) "MBEDTLS_HMAC_DRBG_C", #endif /* MBEDTLS_HMAC_DRBG_C */ #if defined(MBEDTLS_NIST_KW_C) "MBEDTLS_NIST_KW_C", #endif /* MBEDTLS_NIST_KW_C */ #if defined(MBEDTLS_MD_C) "MBEDTLS_MD_C", #endif /* MBEDTLS_MD_C */ #if defined(MBEDTLS_MD2_C) "MBEDTLS_MD2_C", #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) "MBEDTLS_MD4_C", #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) "MBEDTLS_MD5_C", #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) "MBEDTLS_MEMORY_BUFFER_ALLOC_C", #endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */ #if defined(MBEDTLS_NET_C) "MBEDTLS_NET_C", #endif /* MBEDTLS_NET_C */ #if defined(MBEDTLS_OID_C) "MBEDTLS_OID_C", #endif /* MBEDTLS_OID_C */ #if defined(MBEDTLS_PADLOCK_C) "MBEDTLS_PADLOCK_C", #endif /* MBEDTLS_PADLOCK_C */ #if defined(MBEDTLS_PEM_PARSE_C) "MBEDTLS_PEM_PARSE_C", #endif /* MBEDTLS_PEM_PARSE_C */ #if defined(MBEDTLS_PEM_WRITE_C) "MBEDTLS_PEM_WRITE_C", #endif /* MBEDTLS_PEM_WRITE_C */ #if defined(MBEDTLS_PK_C) "MBEDTLS_PK_C", #endif /* MBEDTLS_PK_C */ #if defined(MBEDTLS_PK_PARSE_C) "MBEDTLS_PK_PARSE_C", #endif /* MBEDTLS_PK_PARSE_C */ #if defined(MBEDTLS_PK_WRITE_C) "MBEDTLS_PK_WRITE_C", #endif /* MBEDTLS_PK_WRITE_C */ #if defined(MBEDTLS_PKCS5_C) "MBEDTLS_PKCS5_C", #endif /* MBEDTLS_PKCS5_C */ #if defined(MBEDTLS_PKCS11_C) "MBEDTLS_PKCS11_C", #endif /* MBEDTLS_PKCS11_C */ #if defined(MBEDTLS_PKCS12_C) "MBEDTLS_PKCS12_C", #endif /* MBEDTLS_PKCS12_C */ #if defined(MBEDTLS_PLATFORM_C) "MBEDTLS_PLATFORM_C", #endif /* MBEDTLS_PLATFORM_C */ #if defined(MBEDTLS_POLY1305_C) "MBEDTLS_POLY1305_C", #endif /* MBEDTLS_POLY1305_C */ #if defined(MBEDTLS_RIPEMD160_C) "MBEDTLS_RIPEMD160_C", #endif /* MBEDTLS_RIPEMD160_C */ #if defined(MBEDTLS_RSA_C) "MBEDTLS_RSA_C", #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_SHA1_C) "MBEDTLS_SHA1_C", #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) "MBEDTLS_SHA256_C", #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) "MBEDTLS_SHA512_C", #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SSL_CACHE_C) "MBEDTLS_SSL_CACHE_C", #endif /* MBEDTLS_SSL_CACHE_C */ #if defined(MBEDTLS_SSL_COOKIE_C) "MBEDTLS_SSL_COOKIE_C", #endif /* MBEDTLS_SSL_COOKIE_C */ #if defined(MBEDTLS_SSL_TICKET_C) "MBEDTLS_SSL_TICKET_C", #endif /* MBEDTLS_SSL_TICKET_C */ #if defined(MBEDTLS_SSL_CLI_C) "MBEDTLS_SSL_CLI_C", #endif /* MBEDTLS_SSL_CLI_C */ #if defined(MBEDTLS_SSL_SRV_C) "MBEDTLS_SSL_SRV_C", #endif /* MBEDTLS_SSL_SRV_C */ #if defined(MBEDTLS_SSL_TLS_C) "MBEDTLS_SSL_TLS_C", #endif /* MBEDTLS_SSL_TLS_C */ #if defined(MBEDTLS_THREADING_C) "MBEDTLS_THREADING_C", #endif /* MBEDTLS_THREADING_C */ #if defined(MBEDTLS_TIMING_C) "MBEDTLS_TIMING_C", #endif /* MBEDTLS_TIMING_C */ #if defined(MBEDTLS_VERSION_C) "MBEDTLS_VERSION_C", #endif /* MBEDTLS_VERSION_C */ #if defined(MBEDTLS_X509_USE_C) "MBEDTLS_X509_USE_C", #endif /* MBEDTLS_X509_USE_C */ #if defined(MBEDTLS_X509_CRT_PARSE_C) "MBEDTLS_X509_CRT_PARSE_C", #endif /* MBEDTLS_X509_CRT_PARSE_C */ #if defined(MBEDTLS_X509_CRL_PARSE_C) "MBEDTLS_X509_CRL_PARSE_C", #endif /* MBEDTLS_X509_CRL_PARSE_C */ #if defined(MBEDTLS_X509_CSR_PARSE_C) "MBEDTLS_X509_CSR_PARSE_C", #endif /* MBEDTLS_X509_CSR_PARSE_C */ #if defined(MBEDTLS_X509_CREATE_C) "MBEDTLS_X509_CREATE_C", #endif /* MBEDTLS_X509_CREATE_C */ #if defined(MBEDTLS_X509_CRT_WRITE_C) "MBEDTLS_X509_CRT_WRITE_C", #endif /* MBEDTLS_X509_CRT_WRITE_C */ #if defined(MBEDTLS_X509_CSR_WRITE_C) "MBEDTLS_X509_CSR_WRITE_C", #endif /* MBEDTLS_X509_CSR_WRITE_C */ #if defined(MBEDTLS_XTEA_C) "MBEDTLS_XTEA_C", #endif /* MBEDTLS_XTEA_C */ #endif /* MBEDTLS_VERSION_FEATURES */ NULL }; int mbedtls_version_check_feature( const char *feature ) { const char **idx = features; if( *idx == NULL ) return( -2 ); if( feature == NULL ) return( -1 ); while( *idx != NULL ) { if( !strcmp( *idx, feature ) ) return( 0 ); idx++; } return( -1 ); } #endif /* MBEDTLS_VERSION_C */ fldigi-4.2.05/src/mbedtls/x509_csr.c0000664000175000017500000002531414611711171013731 00000000000000/* * X.509 Certificate Signing Request (CSR) parsing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ITU-T X.509 standard defines a certificate format for PKI. * * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) * * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CSR_PARSE_C) #include "mbedtls/x509_csr.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_free free #define mbedtls_calloc calloc #define mbedtls_snprintf snprintf #endif #if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32) #include #endif /* * Version ::= INTEGER { v1(0) } */ static int x509_csr_get_version( unsigned char **p, const unsigned char *end, int *ver ) { int ret; if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { *ver = 0; return( 0 ); } return( MBEDTLS_ERR_X509_INVALID_VERSION + ret ); } return( 0 ); } /* * Parse a CSR in DER format */ int mbedtls_x509_csr_parse_der( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ) { int ret; size_t len; unsigned char *p, *end; mbedtls_x509_buf sig_params; memset( &sig_params, 0, sizeof( mbedtls_x509_buf ) ); /* * Check for valid input */ if( csr == NULL || buf == NULL || buflen == 0 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); mbedtls_x509_csr_init( csr ); /* * first copy the raw DER data */ p = mbedtls_calloc( 1, len = buflen ); if( p == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); memcpy( p, buf, buflen ); csr->raw.p = p; csr->raw.len = len; end = p + len; /* * CertificationRequest ::= SEQUENCE { * certificationRequestInfo CertificationRequestInfo, * signatureAlgorithm AlgorithmIdentifier, * signature BIT STRING * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT ); } if( len != (size_t) ( end - p ) ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } /* * CertificationRequestInfo ::= SEQUENCE { */ csr->cri.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } end = p + len; csr->cri.len = end - csr->cri.p; /* * Version ::= INTEGER { v1(0) } */ if( ( ret = x509_csr_get_version( &p, end, &csr->version ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } if( csr->version != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_UNKNOWN_VERSION ); } csr->version++; /* * subject Name */ csr->subject_raw.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } if( ( ret = mbedtls_x509_get_name( &p, p + len, &csr->subject ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } csr->subject_raw.len = p - csr->subject_raw.p; /* * subjectPKInfo SubjectPublicKeyInfo */ if( ( ret = mbedtls_pk_parse_subpubkey( &p, end, &csr->pk ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } /* * attributes [0] Attributes * * The list of possible attributes is open-ended, though RFC 2985 * (PKCS#9) defines a few in section 5.4. We currently don't support any, * so we just ignore them. This is a safe thing to do as the worst thing * that could happen is that we issue a certificate that does not match * the requester's expectations - this cannot cause a violation of our * signature policies. */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } p += len; end = csr->raw.p + csr->raw.len; /* * signatureAlgorithm AlgorithmIdentifier, * signature BIT STRING */ if( ( ret = mbedtls_x509_get_alg( &p, end, &csr->sig_oid, &sig_params ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } if( ( ret = mbedtls_x509_get_sig_alg( &csr->sig_oid, &sig_params, &csr->sig_md, &csr->sig_pk, &csr->sig_opts ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG ); } if( ( ret = mbedtls_x509_get_sig( &p, end, &csr->sig ) ) != 0 ) { mbedtls_x509_csr_free( csr ); return( ret ); } if( p != end ) { mbedtls_x509_csr_free( csr ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } return( 0 ); } /* * Parse a CSR, allowing for PEM or raw DER encoding */ int mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ) { #if defined(MBEDTLS_PEM_PARSE_C) int ret; size_t use_len; mbedtls_pem_context pem; #endif /* * Check for valid input */ if( csr == NULL || buf == NULL || buflen == 0 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); #if defined(MBEDTLS_PEM_PARSE_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( buf[buflen - 1] == '\0' ) { mbedtls_pem_init( &pem ); ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN CERTIFICATE REQUEST-----", "-----END CERTIFICATE REQUEST-----", buf, NULL, 0, &use_len ); if( ret == 0 ) /* * Was PEM encoded, parse the result */ ret = mbedtls_x509_csr_parse_der( csr, pem.buf, pem.buflen ); mbedtls_pem_free( &pem ); if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); } #endif /* MBEDTLS_PEM_PARSE_C */ return( mbedtls_x509_csr_parse_der( csr, buf, buflen ) ); } #if defined(MBEDTLS_FS_IO) /* * Load a CSR into the structure */ int mbedtls_x509_csr_parse_file( mbedtls_x509_csr *csr, const char *path ) { int ret; size_t n; unsigned char *buf; if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_x509_csr_parse( csr, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_FS_IO */ #define BEFORE_COLON 14 #define BC "14" /* * Return an informational string about the CSR. */ int mbedtls_x509_csr_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_csr *csr ) { int ret; size_t n; char *p; char key_size_str[BEFORE_COLON]; p = buf; n = size; ret = mbedtls_snprintf( p, n, "%sCSR version : %d", prefix, csr->version ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%ssubject name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_dn_gets( p, n, &csr->subject ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%ssigned using : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_sig_alg_gets( p, n, &csr->sig_oid, csr->sig_pk, csr->sig_md, csr->sig_opts ); MBEDTLS_X509_SAFE_SNPRINTF; if( ( ret = mbedtls_x509_key_size_helper( key_size_str, BEFORE_COLON, mbedtls_pk_get_name( &csr->pk ) ) ) != 0 ) { return( ret ); } ret = mbedtls_snprintf( p, n, "\n%s%-" BC "s: %d bits\n", prefix, key_size_str, (int) mbedtls_pk_get_bitlen( &csr->pk ) ); MBEDTLS_X509_SAFE_SNPRINTF; return( (int) ( size - n ) ); } /* * Initialize a CSR */ void mbedtls_x509_csr_init( mbedtls_x509_csr *csr ) { memset( csr, 0, sizeof(mbedtls_x509_csr) ); } /* * Unallocate all CSR data */ void mbedtls_x509_csr_free( mbedtls_x509_csr *csr ) { mbedtls_x509_name *name_cur; mbedtls_x509_name *name_prv; if( csr == NULL ) return; mbedtls_pk_free( &csr->pk ); #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) mbedtls_free( csr->sig_opts ); #endif name_cur = csr->subject.next; while( name_cur != NULL ) { name_prv = name_cur; name_cur = name_cur->next; mbedtls_platform_zeroize( name_prv, sizeof( mbedtls_x509_name ) ); mbedtls_free( name_prv ); } if( csr->raw.p != NULL ) { mbedtls_platform_zeroize( csr->raw.p, csr->raw.len ); mbedtls_free( csr->raw.p ); } mbedtls_platform_zeroize( csr, sizeof( mbedtls_x509_csr ) ); } #endif /* MBEDTLS_X509_CSR_PARSE_C */ fldigi-4.2.05/src/mbedtls/bignum.c0000664000175000017500000017714514611711171013650 00000000000000/* * Multi-precision integer library * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The following sources were referenced in the design of this Multi-precision * Integer library: * * [1] Handbook of Applied Cryptography - 1997 * Menezes, van Oorschot and Vanstone * * [2] Multi-Precision Math * Tom St Denis * https://github.com/libtom/libtommath/blob/develop/tommath.pdf * * [3] GNU Multi-Precision Arithmetic Library * https://gmplib.org/manual/index.html * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_BIGNUM_C) #include "mbedtls/bignum.h" #include "mbedtls/bn_mul.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif #define MPI_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_MPI_BAD_INPUT_DATA ) #define MPI_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define ciL (sizeof(mbedtls_mpi_uint)) /* chars in limb */ #define biL (ciL << 3) /* bits in limb */ #define biH (ciL << 2) /* half limb size */ #define MPI_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */ /* * Convert between bits/chars and number of limbs * Divide first in order to avoid potential overflows */ #define BITS_TO_LIMBS(i) ( (i) / biL + ( (i) % biL != 0 ) ) #define CHARS_TO_LIMBS(i) ( (i) / ciL + ( (i) % ciL != 0 ) ) /* Implementation that should never be optimized out by the compiler */ static void mbedtls_mpi_zeroize( mbedtls_mpi_uint *v, size_t n ) { mbedtls_platform_zeroize( v, ciL * n ); } /* * Initialize one MPI */ void mbedtls_mpi_init( mbedtls_mpi *X ) { MPI_VALIDATE( X != NULL ); X->s = 1; X->n = 0; X->p = NULL; } /* * Unallocate one MPI */ void mbedtls_mpi_free( mbedtls_mpi *X ) { if( X == NULL ) return; if( X->p != NULL ) { mbedtls_mpi_zeroize( X->p, X->n ); mbedtls_free( X->p ); } X->s = 1; X->n = 0; X->p = NULL; } /* * Enlarge to the specified number of limbs */ int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs ) { mbedtls_mpi_uint *p; MPI_VALIDATE_RET( X != NULL ); if( nblimbs > MBEDTLS_MPI_MAX_LIMBS ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); if( X->n < nblimbs ) { if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( nblimbs, ciL ) ) == NULL ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); if( X->p != NULL ) { memcpy( p, X->p, X->n * ciL ); mbedtls_mpi_zeroize( X->p, X->n ); mbedtls_free( X->p ); } X->n = nblimbs; X->p = p; } return( 0 ); } /* * Resize down as much as possible, * while keeping at least the specified number of limbs */ int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs ) { mbedtls_mpi_uint *p; size_t i; MPI_VALIDATE_RET( X != NULL ); if( nblimbs > MBEDTLS_MPI_MAX_LIMBS ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); /* Actually resize up in this case */ if( X->n <= nblimbs ) return( mbedtls_mpi_grow( X, nblimbs ) ); for( i = X->n - 1; i > 0; i-- ) if( X->p[i] != 0 ) break; i++; if( i < nblimbs ) i = nblimbs; if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( i, ciL ) ) == NULL ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); if( X->p != NULL ) { memcpy( p, X->p, i * ciL ); mbedtls_mpi_zeroize( X->p, X->n ); mbedtls_free( X->p ); } X->n = i; X->p = p; return( 0 ); } /* * Copy the contents of Y into X */ int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y ) { int ret = 0; size_t i; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); if( X == Y ) return( 0 ); if( Y->p == NULL ) { mbedtls_mpi_free( X ); return( 0 ); } for( i = Y->n - 1; i > 0; i-- ) if( Y->p[i] != 0 ) break; i++; X->s = Y->s; if( X->n < i ) { MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i ) ); } else { memset( X->p + i, 0, ( X->n - i ) * ciL ); } memcpy( X->p, Y->p, i * ciL ); cleanup: return( ret ); } /* * Swap the contents of X and Y */ void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ) { mbedtls_mpi T; MPI_VALIDATE( X != NULL ); MPI_VALIDATE( Y != NULL ); memcpy( &T, X, sizeof( mbedtls_mpi ) ); memcpy( X, Y, sizeof( mbedtls_mpi ) ); memcpy( Y, &T, sizeof( mbedtls_mpi ) ); } /* * Conditionally assign X = Y, without leaking information * about whether the assignment was made or not. * (Leaking information about the respective sizes of X and Y is ok however.) */ int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign ) { int ret = 0; size_t i; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); /* make sure assign is 0 or 1 in a time-constant manner */ assign = (assign | (unsigned char)-assign) >> 7; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) ); X->s = X->s * ( 1 - assign ) + Y->s * assign; for( i = 0; i < Y->n; i++ ) X->p[i] = X->p[i] * ( 1 - assign ) + Y->p[i] * assign; for( ; i < X->n; i++ ) X->p[i] *= ( 1 - assign ); cleanup: return( ret ); } /* * Conditionally swap X and Y, without leaking information * about whether the swap was made or not. * Here it is not ok to simply swap the pointers, which whould lead to * different memory access patterns when X and Y are used afterwards. */ int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char swap ) { int ret, s; size_t i; mbedtls_mpi_uint tmp; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); if( X == Y ) return( 0 ); /* make sure swap is 0 or 1 in a time-constant manner */ swap = (swap | (unsigned char)-swap) >> 7; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( Y, X->n ) ); s = X->s; X->s = X->s * ( 1 - swap ) + Y->s * swap; Y->s = Y->s * ( 1 - swap ) + s * swap; for( i = 0; i < X->n; i++ ) { tmp = X->p[i]; X->p[i] = X->p[i] * ( 1 - swap ) + Y->p[i] * swap; Y->p[i] = Y->p[i] * ( 1 - swap ) + tmp * swap; } cleanup: return( ret ); } /* * Set value from integer */ int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z ) { int ret; MPI_VALIDATE_RET( X != NULL ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, 1 ) ); memset( X->p, 0, X->n * ciL ); X->p[0] = ( z < 0 ) ? -z : z; X->s = ( z < 0 ) ? -1 : 1; cleanup: return( ret ); } /* * Get a specific bit */ int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos ) { MPI_VALIDATE_RET( X != NULL ); if( X->n * biL <= pos ) return( 0 ); return( ( X->p[pos / biL] >> ( pos % biL ) ) & 0x01 ); } /* Get a specific byte, without range checks. */ #define GET_BYTE( X, i ) \ ( ( ( X )->p[( i ) / ciL] >> ( ( ( i ) % ciL ) * 8 ) ) & 0xff ) /* * Set a bit to a specific value of 0 or 1 */ int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val ) { int ret = 0; size_t off = pos / biL; size_t idx = pos % biL; MPI_VALIDATE_RET( X != NULL ); if( val != 0 && val != 1 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); if( X->n * biL <= pos ) { if( val == 0 ) return( 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, off + 1 ) ); } X->p[off] &= ~( (mbedtls_mpi_uint) 0x01 << idx ); X->p[off] |= (mbedtls_mpi_uint) val << idx; cleanup: return( ret ); } /* * Return the number of less significant zero-bits */ size_t mbedtls_mpi_lsb( const mbedtls_mpi *X ) { size_t i, j, count = 0; MBEDTLS_INTERNAL_VALIDATE_RET( X != NULL, 0 ); for( i = 0; i < X->n; i++ ) for( j = 0; j < biL; j++, count++ ) if( ( ( X->p[i] >> j ) & 1 ) != 0 ) return( count ); return( 0 ); } /* * Count leading zero bits in a given integer */ static size_t mbedtls_clz( const mbedtls_mpi_uint x ) { size_t j; mbedtls_mpi_uint mask = (mbedtls_mpi_uint) 1 << (biL - 1); for( j = 0; j < biL; j++ ) { if( x & mask ) break; mask >>= 1; } return j; } /* * Return the number of bits */ size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X ) { size_t i, j; if( X->n == 0 ) return( 0 ); for( i = X->n - 1; i > 0; i-- ) if( X->p[i] != 0 ) break; j = biL - mbedtls_clz( X->p[i] ); return( ( i * biL ) + j ); } /* * Return the total size in bytes */ size_t mbedtls_mpi_size( const mbedtls_mpi *X ) { return( ( mbedtls_mpi_bitlen( X ) + 7 ) >> 3 ); } /* * Convert an ASCII character to digit value */ static int mpi_get_digit( mbedtls_mpi_uint *d, int radix, char c ) { *d = 255; if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30; if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37; if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57; if( *d >= (mbedtls_mpi_uint) radix ) return( MBEDTLS_ERR_MPI_INVALID_CHARACTER ); return( 0 ); } /* * Import from an ASCII string */ int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s ) { int ret; size_t i, j, slen, n; mbedtls_mpi_uint d; mbedtls_mpi T; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( s != NULL ); if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); mbedtls_mpi_init( &T ); slen = strlen( s ); if( radix == 16 ) { if( slen > MPI_SIZE_T_MAX >> 2 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); n = BITS_TO_LIMBS( slen << 2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, n ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); for( i = slen, j = 0; i > 0; i--, j++ ) { if( i == 1 && s[i - 1] == '-' ) { X->s = -1; break; } MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) ); X->p[j / ( 2 * ciL )] |= d << ( ( j % ( 2 * ciL ) ) << 2 ); } } else { MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); for( i = 0; i < slen; i++ ) { if( i == 0 && s[i] == '-' ) { X->s = -1; continue; } MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T, X, radix ) ); if( X->s == 1 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, &T, d ) ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( X, &T, d ) ); } } } cleanup: mbedtls_mpi_free( &T ); return( ret ); } /* * Helper to write the digits high-order first */ static int mpi_write_hlp( mbedtls_mpi *X, int radix, char **p ) { int ret; mbedtls_mpi_uint r; if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, radix ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_int( X, NULL, X, radix ) ); if( mbedtls_mpi_cmp_int( X, 0 ) != 0 ) MBEDTLS_MPI_CHK( mpi_write_hlp( X, radix, p ) ); if( r < 10 ) *(*p)++ = (char)( r + 0x30 ); else *(*p)++ = (char)( r + 0x37 ); cleanup: return( ret ); } /* * Export into an ASCII string */ int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, char *buf, size_t buflen, size_t *olen ) { int ret = 0; size_t n; char *p; mbedtls_mpi T; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( olen != NULL ); MPI_VALIDATE_RET( buflen == 0 || buf != NULL ); if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); n = mbedtls_mpi_bitlen( X ); if( radix >= 4 ) n >>= 1; if( radix >= 16 ) n >>= 1; /* * Round up the buffer length to an even value to ensure that there is * enough room for hexadecimal values that can be represented in an odd * number of digits. */ n += 3 + ( ( n + 1 ) & 1 ); if( buflen < n ) { *olen = n; return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL ); } p = buf; mbedtls_mpi_init( &T ); if( X->s == -1 ) *p++ = '-'; if( radix == 16 ) { int c; size_t i, j, k; for( i = X->n, k = 0; i > 0; i-- ) { for( j = ciL; j > 0; j-- ) { c = ( X->p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF; if( c == 0 && k == 0 && ( i + j ) != 2 ) continue; *(p++) = "0123456789ABCDEF" [c / 16]; *(p++) = "0123456789ABCDEF" [c % 16]; k = 1; } } } else { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T, X ) ); if( T.s == -1 ) T.s = 1; MBEDTLS_MPI_CHK( mpi_write_hlp( &T, radix, &p ) ); } *p++ = '\0'; *olen = p - buf; cleanup: mbedtls_mpi_free( &T ); return( ret ); } #if defined(MBEDTLS_FS_IO) /* * Read X from an opened file */ int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin ) { mbedtls_mpi_uint d; size_t slen; char *p; /* * Buffer should have space for (short) label and decimal formatted MPI, * newline characters and '\0' */ char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( fin != NULL ); if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); memset( s, 0, sizeof( s ) ); if( fgets( s, sizeof( s ) - 1, fin ) == NULL ) return( MBEDTLS_ERR_MPI_FILE_IO_ERROR ); slen = strlen( s ); if( slen == sizeof( s ) - 2 ) return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL ); if( slen > 0 && s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; } if( slen > 0 && s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; } p = s + slen; while( p-- > s ) if( mpi_get_digit( &d, radix, *p ) != 0 ) break; return( mbedtls_mpi_read_string( X, radix, p + 1 ) ); } /* * Write X into an opened file (or stdout if fout == NULL) */ int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout ) { int ret; size_t n, slen, plen; /* * Buffer should have space for (short) label and decimal formatted MPI, * newline characters and '\0' */ char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ]; MPI_VALIDATE_RET( X != NULL ); if( radix < 2 || radix > 16 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); memset( s, 0, sizeof( s ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_string( X, radix, s, sizeof( s ) - 2, &n ) ); if( p == NULL ) p = ""; plen = strlen( p ); slen = strlen( s ); s[slen++] = '\r'; s[slen++] = '\n'; if( fout != NULL ) { if( fwrite( p, 1, plen, fout ) != plen || fwrite( s, 1, slen, fout ) != slen ) return( MBEDTLS_ERR_MPI_FILE_IO_ERROR ); } else mbedtls_printf( "%s%s", p, s ); cleanup: return( ret ); } #endif /* MBEDTLS_FS_IO */ /* * Import X from unsigned binary data, big endian */ int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen ) { int ret; size_t i, j; size_t const limbs = CHARS_TO_LIMBS( buflen ); MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( buflen == 0 || buf != NULL ); /* Ensure that target MPI has exactly the necessary number of limbs */ if( X->n != limbs ) { mbedtls_mpi_free( X ); mbedtls_mpi_init( X ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, limbs ) ); } MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); for( i = buflen, j = 0; i > 0; i--, j++ ) X->p[j / ciL] |= ((mbedtls_mpi_uint) buf[i - 1]) << ((j % ciL) << 3); cleanup: return( ret ); } /* * Export X into unsigned binary data, big endian */ int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen ) { size_t stored_bytes; size_t bytes_to_copy; unsigned char *p; size_t i; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( buflen == 0 || buf != NULL ); stored_bytes = X->n * ciL; if( stored_bytes < buflen ) { /* There is enough space in the output buffer. Write initial * null bytes and record the position at which to start * writing the significant bytes. In this case, the execution * trace of this function does not depend on the value of the * number. */ bytes_to_copy = stored_bytes; p = buf + buflen - stored_bytes; memset( buf, 0, buflen - stored_bytes ); } else { /* The output buffer is smaller than the allocated size of X. * However X may fit if its leading bytes are zero. */ bytes_to_copy = buflen; p = buf; for( i = bytes_to_copy; i < stored_bytes; i++ ) { if( GET_BYTE( X, i ) != 0 ) return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL ); } } for( i = 0; i < bytes_to_copy; i++ ) p[bytes_to_copy - i - 1] = GET_BYTE( X, i ); return( 0 ); } /* * Left-shift: X <<= count */ int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count ) { int ret; size_t i, v0, t1; mbedtls_mpi_uint r0 = 0, r1; MPI_VALIDATE_RET( X != NULL ); v0 = count / (biL ); t1 = count & (biL - 1); i = mbedtls_mpi_bitlen( X ) + count; if( X->n * biL < i ) MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, BITS_TO_LIMBS( i ) ) ); ret = 0; /* * shift by count / limb_size */ if( v0 > 0 ) { for( i = X->n; i > v0; i-- ) X->p[i - 1] = X->p[i - v0 - 1]; for( ; i > 0; i-- ) X->p[i - 1] = 0; } /* * shift by count % limb_size */ if( t1 > 0 ) { for( i = v0; i < X->n; i++ ) { r1 = X->p[i] >> (biL - t1); X->p[i] <<= t1; X->p[i] |= r0; r0 = r1; } } cleanup: return( ret ); } /* * Right-shift: X >>= count */ int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count ) { size_t i, v0, v1; mbedtls_mpi_uint r0 = 0, r1; MPI_VALIDATE_RET( X != NULL ); v0 = count / biL; v1 = count & (biL - 1); if( v0 > X->n || ( v0 == X->n && v1 > 0 ) ) return mbedtls_mpi_lset( X, 0 ); /* * shift by count / limb_size */ if( v0 > 0 ) { for( i = 0; i < X->n - v0; i++ ) X->p[i] = X->p[i + v0]; for( ; i < X->n; i++ ) X->p[i] = 0; } /* * shift by count % limb_size */ if( v1 > 0 ) { for( i = X->n; i > 0; i-- ) { r1 = X->p[i - 1] << (biL - v1); X->p[i - 1] >>= v1; X->p[i - 1] |= r0; r0 = r1; } } return( 0 ); } /* * Compare unsigned values */ int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y ) { size_t i, j; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); for( i = X->n; i > 0; i-- ) if( X->p[i - 1] != 0 ) break; for( j = Y->n; j > 0; j-- ) if( Y->p[j - 1] != 0 ) break; if( i == 0 && j == 0 ) return( 0 ); if( i > j ) return( 1 ); if( j > i ) return( -1 ); for( ; i > 0; i-- ) { if( X->p[i - 1] > Y->p[i - 1] ) return( 1 ); if( X->p[i - 1] < Y->p[i - 1] ) return( -1 ); } return( 0 ); } /* * Compare signed values */ int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y ) { size_t i, j; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( Y != NULL ); for( i = X->n; i > 0; i-- ) if( X->p[i - 1] != 0 ) break; for( j = Y->n; j > 0; j-- ) if( Y->p[j - 1] != 0 ) break; if( i == 0 && j == 0 ) return( 0 ); if( i > j ) return( X->s ); if( j > i ) return( -Y->s ); if( X->s > 0 && Y->s < 0 ) return( 1 ); if( Y->s > 0 && X->s < 0 ) return( -1 ); for( ; i > 0; i-- ) { if( X->p[i - 1] > Y->p[i - 1] ) return( X->s ); if( X->p[i - 1] < Y->p[i - 1] ) return( -X->s ); } return( 0 ); } /* * Compare signed values */ int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z ) { mbedtls_mpi Y; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( X != NULL ); *p = ( z < 0 ) ? -z : z; Y.s = ( z < 0 ) ? -1 : 1; Y.n = 1; Y.p = p; return( mbedtls_mpi_cmp_mpi( X, &Y ) ); } /* * Unsigned addition: X = |A| + |B| (HAC 14.7) */ int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; size_t i, j; mbedtls_mpi_uint *o, *p, c, tmp; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); if( X == B ) { const mbedtls_mpi *T = A; A = X; B = T; } if( X != A ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) ); /* * X should always be positive as a result of unsigned additions. */ X->s = 1; for( j = B->n; j > 0; j-- ) if( B->p[j - 1] != 0 ) break; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) ); o = B->p; p = X->p; c = 0; /* * tmp is used because it might happen that p == o */ for( i = 0; i < j; i++, o++, p++ ) { tmp= *o; *p += c; c = ( *p < c ); *p += tmp; c += ( *p < tmp ); } while( c != 0 ) { if( i >= X->n ) { MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + 1 ) ); p = X->p + i; } *p += c; c = ( *p < c ); i++; p++; } cleanup: return( ret ); } /* * Helper for mbedtls_mpi subtraction */ static void mpi_sub_hlp( size_t n, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d ) { size_t i; mbedtls_mpi_uint c, z; for( i = c = 0; i < n; i++, s++, d++ ) { z = ( *d < c ); *d -= c; c = ( *d < *s ) + z; *d -= *s; } while( c != 0 ) { z = ( *d < c ); *d -= c; c = z; d++; } } /* * Unsigned subtraction: X = |A| - |B| (HAC 14.9) */ int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { mbedtls_mpi TB; int ret; size_t n; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); if( mbedtls_mpi_cmp_abs( A, B ) < 0 ) return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE ); mbedtls_mpi_init( &TB ); if( X == B ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); B = &TB; } if( X != A ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) ); /* * X should always be positive as a result of unsigned subtractions. */ X->s = 1; ret = 0; for( n = B->n; n > 0; n-- ) if( B->p[n - 1] != 0 ) break; mpi_sub_hlp( n, B->p, X->p ); cleanup: mbedtls_mpi_free( &TB ); return( ret ); } /* * Signed addition: X = A + B */ int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret, s; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); s = A->s; if( A->s * B->s < 0 ) { if( mbedtls_mpi_cmp_abs( A, B ) >= 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) ); X->s = s; } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) ); X->s = -s; } } else { MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) ); X->s = s; } cleanup: return( ret ); } /* * Signed subtraction: X = A - B */ int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret, s; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); s = A->s; if( A->s * B->s > 0 ) { if( mbedtls_mpi_cmp_abs( A, B ) >= 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) ); X->s = s; } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) ); X->s = -s; } } else { MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) ); X->s = s; } cleanup: return( ret ); } /* * Signed addition: X = A + b */ int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ) { mbedtls_mpi _B; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); p[0] = ( b < 0 ) ? -b : b; _B.s = ( b < 0 ) ? -1 : 1; _B.n = 1; _B.p = p; return( mbedtls_mpi_add_mpi( X, A, &_B ) ); } /* * Signed subtraction: X = A - b */ int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ) { mbedtls_mpi _B; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); p[0] = ( b < 0 ) ? -b : b; _B.s = ( b < 0 ) ? -1 : 1; _B.n = 1; _B.p = p; return( mbedtls_mpi_sub_mpi( X, A, &_B ) ); } /* * Helper for mbedtls_mpi multiplication */ static #if defined(__APPLE__) && defined(__arm__) /* * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn) * appears to need this to prevent bad ARM code generation at -O3. */ __attribute__ ((noinline)) #endif void mpi_mul_hlp( size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b ) { mbedtls_mpi_uint c = 0, t = 0; #if defined(MULADDC_HUIT) for( ; i >= 8; i -= 8 ) { MULADDC_INIT MULADDC_HUIT MULADDC_STOP } for( ; i > 0; i-- ) { MULADDC_INIT MULADDC_CORE MULADDC_STOP } #else /* MULADDC_HUIT */ for( ; i >= 16; i -= 16 ) { MULADDC_INIT MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_STOP } for( ; i >= 8; i -= 8 ) { MULADDC_INIT MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_CORE MULADDC_STOP } for( ; i > 0; i-- ) { MULADDC_INIT MULADDC_CORE MULADDC_STOP } #endif /* MULADDC_HUIT */ t++; do { *d += c; c = ( *d < c ); d++; } while( c != 0 ); } /* * Baseline multiplication: X = A * B (HAC 14.12) */ int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; size_t i, j; mbedtls_mpi TA, TB; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB ); if( X == A ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) ); A = &TA; } if( X == B ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); B = &TB; } for( i = A->n; i > 0; i-- ) if( A->p[i - 1] != 0 ) break; for( j = B->n; j > 0; j-- ) if( B->p[j - 1] != 0 ) break; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + j ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) ); for( ; j > 0; j-- ) mpi_mul_hlp( i, A->p, X->p + j - 1, B->p[j - 1] ); X->s = A->s * B->s; cleanup: mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TA ); return( ret ); } /* * Baseline multiplication: X = A * b */ int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b ) { mbedtls_mpi _B; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); _B.s = 1; _B.n = 1; _B.p = p; p[0] = b; return( mbedtls_mpi_mul_mpi( X, A, &_B ) ); } /* * Unsigned integer divide - double mbedtls_mpi_uint dividend, u1/u0, and * mbedtls_mpi_uint divisor, d */ static mbedtls_mpi_uint mbedtls_int_div_int( mbedtls_mpi_uint u1, mbedtls_mpi_uint u0, mbedtls_mpi_uint d, mbedtls_mpi_uint *r ) { #if defined(MBEDTLS_HAVE_UDBL) mbedtls_t_udbl dividend, quotient; #else const mbedtls_mpi_uint radix = (mbedtls_mpi_uint) 1 << biH; const mbedtls_mpi_uint uint_halfword_mask = ( (mbedtls_mpi_uint) 1 << biH ) - 1; mbedtls_mpi_uint d0, d1, q0, q1, rAX, r0, quotient; mbedtls_mpi_uint u0_msw, u0_lsw; size_t s; #endif /* * Check for overflow */ if( 0 == d || u1 >= d ) { if (r != NULL) *r = ~0; return ( ~0 ); } #if defined(MBEDTLS_HAVE_UDBL) dividend = (mbedtls_t_udbl) u1 << biL; dividend |= (mbedtls_t_udbl) u0; quotient = dividend / d; if( quotient > ( (mbedtls_t_udbl) 1 << biL ) - 1 ) quotient = ( (mbedtls_t_udbl) 1 << biL ) - 1; if( r != NULL ) *r = (mbedtls_mpi_uint)( dividend - (quotient * d ) ); return (mbedtls_mpi_uint) quotient; #else /* * Algorithm D, Section 4.3.1 - The Art of Computer Programming * Vol. 2 - Seminumerical Algorithms, Knuth */ /* * Normalize the divisor, d, and dividend, u0, u1 */ s = mbedtls_clz( d ); d = d << s; u1 = u1 << s; u1 |= ( u0 >> ( biL - s ) ) & ( -(mbedtls_mpi_sint)s >> ( biL - 1 ) ); u0 = u0 << s; d1 = d >> biH; d0 = d & uint_halfword_mask; u0_msw = u0 >> biH; u0_lsw = u0 & uint_halfword_mask; /* * Find the first quotient and remainder */ q1 = u1 / d1; r0 = u1 - d1 * q1; while( q1 >= radix || ( q1 * d0 > radix * r0 + u0_msw ) ) { q1 -= 1; r0 += d1; if ( r0 >= radix ) break; } rAX = ( u1 * radix ) + ( u0_msw - q1 * d ); q0 = rAX / d1; r0 = rAX - q0 * d1; while( q0 >= radix || ( q0 * d0 > radix * r0 + u0_lsw ) ) { q0 -= 1; r0 += d1; if ( r0 >= radix ) break; } if (r != NULL) *r = ( rAX * radix + u0_lsw - q0 * d ) >> s; quotient = q1 * radix + q0; return quotient; #endif } /* * Division by mbedtls_mpi: A = Q * B + R (HAC 14.20) */ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; size_t i, n, t, k; mbedtls_mpi X, Y, Z, T1, T2; MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); if( mbedtls_mpi_cmp_int( B, 0 ) == 0 ) return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z ); mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 ); if( mbedtls_mpi_cmp_abs( A, B ) < 0 ) { if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_lset( Q, 0 ) ); if( R != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, A ) ); return( 0 ); } MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &X, A ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, B ) ); X.s = Y.s = 1; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &Z, A->n + 2 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Z, 0 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T1, 2 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T2, 3 ) ); k = mbedtls_mpi_bitlen( &Y ) % biL; if( k < biL - 1 ) { k = biL - 1 - k; MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &X, k ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, k ) ); } else k = 0; n = X.n - 1; t = Y.n - 1; MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, biL * ( n - t ) ) ); while( mbedtls_mpi_cmp_mpi( &X, &Y ) >= 0 ) { Z.p[n - t]++; MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &Y ) ); } MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, biL * ( n - t ) ) ); for( i = n; i > t ; i-- ) { if( X.p[i] >= Y.p[t] ) Z.p[i - t - 1] = ~0; else { Z.p[i - t - 1] = mbedtls_int_div_int( X.p[i], X.p[i - 1], Y.p[t], NULL); } Z.p[i - t - 1]++; do { Z.p[i - t - 1]--; MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T1, 0 ) ); T1.p[0] = ( t < 1 ) ? 0 : Y.p[t - 1]; T1.p[1] = Y.p[t]; MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T2, 0 ) ); T2.p[0] = ( i < 2 ) ? 0 : X.p[i - 2]; T2.p[1] = ( i < 1 ) ? 0 : X.p[i - 1]; T2.p[2] = X.p[i]; } while( mbedtls_mpi_cmp_mpi( &T1, &T2 ) > 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T1 ) ); if( mbedtls_mpi_cmp_int( &X, 0 ) < 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T1, &Y ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &X, &X, &T1 ) ); Z.p[i - t - 1]--; } } if( Q != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( Q, &Z ) ); Q->s = A->s * B->s; } if( R != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &X, k ) ); X.s = A->s; MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, &X ) ); if( mbedtls_mpi_cmp_int( R, 0 ) == 0 ) R->s = 1; } cleanup: mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z ); mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 ); return( ret ); } /* * Division by int: A = Q * b + R */ int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b ) { mbedtls_mpi _B; mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( A != NULL ); p[0] = ( b < 0 ) ? -b : b; _B.s = ( b < 0 ) ? -1 : 1; _B.n = 1; _B.p = p; return( mbedtls_mpi_div_mpi( Q, R, A, &_B ) ); } /* * Modulo: R = A mod B */ int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; MPI_VALIDATE_RET( R != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); if( mbedtls_mpi_cmp_int( B, 0 ) < 0 ) return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( NULL, R, A, B ) ); while( mbedtls_mpi_cmp_int( R, 0 ) < 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( R, R, B ) ); while( mbedtls_mpi_cmp_mpi( R, B ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( R, R, B ) ); cleanup: return( ret ); } /* * Modulo: r = A mod b */ int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b ) { size_t i; mbedtls_mpi_uint x, y, z; MPI_VALIDATE_RET( r != NULL ); MPI_VALIDATE_RET( A != NULL ); if( b == 0 ) return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO ); if( b < 0 ) return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE ); /* * handle trivial cases */ if( b == 1 ) { *r = 0; return( 0 ); } if( b == 2 ) { *r = A->p[0] & 1; return( 0 ); } /* * general case */ for( i = A->n, y = 0; i > 0; i-- ) { x = A->p[i - 1]; y = ( y << biH ) | ( x >> biH ); z = y / b; y -= z * b; x <<= biH; y = ( y << biH ) | ( x >> biH ); z = y / b; y -= z * b; } /* * If A is negative, then the current y represents a negative value. * Flipping it to the positive side. */ if( A->s < 0 && y != 0 ) y = b - y; *r = y; return( 0 ); } /* * Fast Montgomery initialization (thanks to Tom St Denis) */ static void mpi_montg_init( mbedtls_mpi_uint *mm, const mbedtls_mpi *N ) { mbedtls_mpi_uint x, m0 = N->p[0]; unsigned int i; x = m0; x += ( ( m0 + 2 ) & 4 ) << 1; for( i = biL; i >= 8; i /= 2 ) x *= ( 2 - ( m0 * x ) ); *mm = ~x + 1; } /* * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36) */ static int mpi_montmul( mbedtls_mpi *A, const mbedtls_mpi *B, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T ) { size_t i, n, m; mbedtls_mpi_uint u0, u1, *d; if( T->n < N->n + 1 || T->p == NULL ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); memset( T->p, 0, T->n * ciL ); d = T->p; n = N->n; m = ( B->n < n ) ? B->n : n; for( i = 0; i < n; i++ ) { /* * T = (T + u0*B + u1*N) / 2^biL */ u0 = A->p[i]; u1 = ( d[0] + u0 * B->p[0] ) * mm; mpi_mul_hlp( m, B->p, d, u0 ); mpi_mul_hlp( n, N->p, d, u1 ); *d++ = u0; d[n + 1] = 0; } memcpy( A->p, d, ( n + 1 ) * ciL ); if( mbedtls_mpi_cmp_abs( A, N ) >= 0 ) mpi_sub_hlp( n, N->p, A->p ); else /* prevent timing attacks */ mpi_sub_hlp( n, A->p, T->p ); return( 0 ); } /* * Montgomery reduction: A = A * R^-1 mod N */ static int mpi_montred( mbedtls_mpi *A, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T ) { mbedtls_mpi_uint z = 1; mbedtls_mpi U; U.n = U.s = (int) z; U.p = &z; return( mpi_montmul( A, &U, N, mm, T ) ); } /* * Sliding-window exponentiation: X = A^E mod N (HAC 14.85) */ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR ) { int ret; size_t wbits, wsize, one = 1; size_t i, j, nblimbs; size_t bufsize, nbits; mbedtls_mpi_uint ei, mm, state; mbedtls_mpi RR, T, W[ 2 << MBEDTLS_MPI_WINDOW_SIZE ], Apos; int neg; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( E != NULL ); MPI_VALIDATE_RET( N != NULL ); if( mbedtls_mpi_cmp_int( N, 0 ) <= 0 || ( N->p[0] & 1 ) == 0 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); if( mbedtls_mpi_cmp_int( E, 0 ) < 0 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); /* * Init temps and window size */ mpi_montg_init( &mm, N ); mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &Apos ); memset( W, 0, sizeof( W ) ); i = mbedtls_mpi_bitlen( E ); wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 : ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1; if( wsize > MBEDTLS_MPI_WINDOW_SIZE ) wsize = MBEDTLS_MPI_WINDOW_SIZE; j = N->n + 1; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[1], j ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T, j * 2 ) ); /* * Compensate for negative A (and correct at the end) */ neg = ( A->s == -1 ); if( neg ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Apos, A ) ); Apos.s = 1; A = &Apos; } /* * If 1st call, pre-compute R^2 mod N */ if( _RR == NULL || _RR->p == NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &RR, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &RR, N->n * 2 * biL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &RR, &RR, N ) ); if( _RR != NULL ) memcpy( _RR, &RR, sizeof( mbedtls_mpi ) ); } else memcpy( &RR, _RR, sizeof( mbedtls_mpi ) ); /* * W[1] = A * R^2 * R^-1 mod N = A * R mod N */ if( mbedtls_mpi_cmp_mpi( A, N ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &W[1], A, N ) ); else MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[1], A ) ); MBEDTLS_MPI_CHK( mpi_montmul( &W[1], &RR, N, mm, &T ) ); /* * X = R^2 * R^-1 mod N = R mod N */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &RR ) ); MBEDTLS_MPI_CHK( mpi_montred( X, N, mm, &T ) ); if( wsize > 1 ) { /* * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1) */ j = one << ( wsize - 1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[j], N->n + 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[j], &W[1] ) ); for( i = 0; i < wsize - 1; i++ ) MBEDTLS_MPI_CHK( mpi_montmul( &W[j], &W[j], N, mm, &T ) ); /* * W[i] = W[i - 1] * W[1] */ for( i = j + 1; i < ( one << wsize ); i++ ) { MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[i], N->n + 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[i], &W[i - 1] ) ); MBEDTLS_MPI_CHK( mpi_montmul( &W[i], &W[1], N, mm, &T ) ); } } nblimbs = E->n; bufsize = 0; nbits = 0; wbits = 0; state = 0; while( 1 ) { if( bufsize == 0 ) { if( nblimbs == 0 ) break; nblimbs--; bufsize = sizeof( mbedtls_mpi_uint ) << 3; } bufsize--; ei = (E->p[nblimbs] >> bufsize) & 1; /* * skip leading 0s */ if( ei == 0 && state == 0 ) continue; if( ei == 0 && state == 1 ) { /* * out of window, square X */ MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) ); continue; } /* * add ei to current window */ state = 2; nbits++; wbits |= ( ei << ( wsize - nbits ) ); if( nbits == wsize ) { /* * X = X^wsize R^-1 mod N */ for( i = 0; i < wsize; i++ ) MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) ); /* * X = X * W[wbits] R^-1 mod N */ MBEDTLS_MPI_CHK( mpi_montmul( X, &W[wbits], N, mm, &T ) ); state--; nbits = 0; wbits = 0; } } /* * process the remaining bits */ for( i = 0; i < nbits; i++ ) { MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) ); wbits <<= 1; if( ( wbits & ( one << wsize ) ) != 0 ) MBEDTLS_MPI_CHK( mpi_montmul( X, &W[1], N, mm, &T ) ); } /* * X = A^E * R * R^-1 mod N = A^E mod N */ MBEDTLS_MPI_CHK( mpi_montred( X, N, mm, &T ) ); if( neg && E->n != 0 && ( E->p[0] & 1 ) != 0 ) { X->s = -1; MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( X, N, X ) ); } cleanup: for( i = ( one << ( wsize - 1 ) ); i < ( one << wsize ); i++ ) mbedtls_mpi_free( &W[i] ); mbedtls_mpi_free( &W[1] ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &Apos ); if( _RR == NULL || _RR->p == NULL ) mbedtls_mpi_free( &RR ); return( ret ); } /* * Greatest common divisor: G = gcd(A, B) (HAC 14.54) */ int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B ) { int ret; size_t lz, lzt; mbedtls_mpi TG, TA, TB; MPI_VALIDATE_RET( G != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( B != NULL ); mbedtls_mpi_init( &TG ); mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); lz = mbedtls_mpi_lsb( &TA ); lzt = mbedtls_mpi_lsb( &TB ); if( lzt < lz ) lz = lzt; MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, lz ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, lz ) ); TA.s = TB.s = 1; while( mbedtls_mpi_cmp_int( &TA, 0 ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, mbedtls_mpi_lsb( &TA ) ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, mbedtls_mpi_lsb( &TB ) ) ); if( mbedtls_mpi_cmp_mpi( &TA, &TB ) >= 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TA, &TA, &TB ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, 1 ) ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TB, &TB, &TA ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, 1 ) ); } } MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &TB, lz ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( G, &TB ) ); cleanup: mbedtls_mpi_free( &TG ); mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TB ); return( ret ); } /* * Fill X with size bytes of random. * * Use a temporary bytes representation to make sure the result is the same * regardless of the platform endianness (useful when f_rng is actually * deterministic, eg for tests). */ int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); if( size > MBEDTLS_MPI_MAX_SIZE ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); MBEDTLS_MPI_CHK( f_rng( p_rng, buf, size ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( X, buf, size ) ); cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } /* * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64) */ int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N ) { int ret; mbedtls_mpi G, TA, TU, U1, U2, TB, TV, V1, V2; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); MPI_VALIDATE_RET( N != NULL ); if( mbedtls_mpi_cmp_int( N, 1 ) <= 0 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TU ); mbedtls_mpi_init( &U1 ); mbedtls_mpi_init( &U2 ); mbedtls_mpi_init( &G ); mbedtls_mpi_init( &TB ); mbedtls_mpi_init( &TV ); mbedtls_mpi_init( &V1 ); mbedtls_mpi_init( &V2 ); MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, A, N ) ); if( mbedtls_mpi_cmp_int( &G, 1 ) != 0 ) { ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &TA, A, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TU, &TA ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TV, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U1, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U2, 0 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V1, 0 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V2, 1 ) ); do { while( ( TU.p[0] & 1 ) == 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TU, 1 ) ); if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &U1, &U1, &TB ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &TA ) ); } MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U1, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U2, 1 ) ); } while( ( TV.p[0] & 1 ) == 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TV, 1 ) ); if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, &TB ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &TA ) ); } MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V1, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V2, 1 ) ); } if( mbedtls_mpi_cmp_mpi( &TU, &TV ) >= 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TU, &TU, &TV ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U1, &U1, &V1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &V2 ) ); } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TV, &TV, &TU ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, &U1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &U2 ) ); } } while( mbedtls_mpi_cmp_int( &TU, 0 ) != 0 ); while( mbedtls_mpi_cmp_int( &V1, 0 ) < 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, N ) ); while( mbedtls_mpi_cmp_mpi( &V1, N ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &V1 ) ); cleanup: mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TU ); mbedtls_mpi_free( &U1 ); mbedtls_mpi_free( &U2 ); mbedtls_mpi_free( &G ); mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TV ); mbedtls_mpi_free( &V1 ); mbedtls_mpi_free( &V2 ); return( ret ); } #if defined(MBEDTLS_GENPRIME) static const int small_prime[] = { 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, -103 }; /* * Small divisors test (X must be positive) * * Return values: * 0: no small factor (possible prime, more tests needed) * 1: certain prime * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: certain non-prime * other negative: error */ static int mpi_check_small_factors( const mbedtls_mpi *X ) { int ret = 0; size_t i; mbedtls_mpi_uint r; if( ( X->p[0] & 1 ) == 0 ) return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ); for( i = 0; small_prime[i] > 0; i++ ) { if( mbedtls_mpi_cmp_int( X, small_prime[i] ) <= 0 ) return( 1 ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, small_prime[i] ) ); if( r == 0 ) return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ); } cleanup: return( ret ); } /* * Miller-Rabin pseudo-primality test (HAC 4.24) */ static int mpi_miller_rabin( const mbedtls_mpi *X, size_t rounds, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count; size_t i, j, k, s; mbedtls_mpi W, R, T, A, RR; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); mbedtls_mpi_init( &W ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &A ); mbedtls_mpi_init( &RR ); /* * W = |X| - 1 * R = W >> lsb( W ) */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &W, X, 1 ) ); s = mbedtls_mpi_lsb( &W ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R, &W ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &R, s ) ); i = mbedtls_mpi_bitlen( X ); for( i = 0; i < rounds; i++ ) { /* * pick a random A, 1 < A < |X| - 1 */ count = 0; do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) ); j = mbedtls_mpi_bitlen( &A ); k = mbedtls_mpi_bitlen( &W ); if (j > k) { A.p[A.n - 1] &= ( (mbedtls_mpi_uint) 1 << ( k - ( A.n - 1 ) * biL - 1 ) ) - 1; } if (count++ > 30) { return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; } } while ( mbedtls_mpi_cmp_mpi( &A, &W ) >= 0 || mbedtls_mpi_cmp_int( &A, 1 ) <= 0 ); /* * A = A^R mod |X| */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &A, &A, &R, X, &RR ) ); if( mbedtls_mpi_cmp_mpi( &A, &W ) == 0 || mbedtls_mpi_cmp_int( &A, 1 ) == 0 ) continue; j = 1; while( j < s && mbedtls_mpi_cmp_mpi( &A, &W ) != 0 ) { /* * A = A * A mod |X| */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &A, &A ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &A, &T, X ) ); if( mbedtls_mpi_cmp_int( &A, 1 ) == 0 ) break; j++; } /* * not prime if A != |X| - 1 or A == 1 */ if( mbedtls_mpi_cmp_mpi( &A, &W ) != 0 || mbedtls_mpi_cmp_int( &A, 1 ) == 0 ) { ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; break; } } cleanup: mbedtls_mpi_free( &W ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &A ); mbedtls_mpi_free( &RR ); return( ret ); } /* * Pseudo-primality test: small factors, then Miller-Rabin */ int mbedtls_mpi_is_prime_ext( const mbedtls_mpi *X, int rounds, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi XX; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); XX.s = 1; XX.n = X->n; XX.p = X->p; if( mbedtls_mpi_cmp_int( &XX, 0 ) == 0 || mbedtls_mpi_cmp_int( &XX, 1 ) == 0 ) return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ); if( mbedtls_mpi_cmp_int( &XX, 2 ) == 0 ) return( 0 ); if( ( ret = mpi_check_small_factors( &XX ) ) != 0 ) { if( ret == 1 ) return( 0 ); return( ret ); } return( mpi_miller_rabin( &XX, rounds, f_rng, p_rng ) ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) /* * Pseudo-primality test, error probability 2^-80 */ int mbedtls_mpi_is_prime( const mbedtls_mpi *X, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); /* * In the past our key generation aimed for an error rate of at most * 2^-80. Since this function is deprecated, aim for the same certainty * here as well. */ return( mbedtls_mpi_is_prime_ext( X, 40, f_rng, p_rng ) ); } #endif /* * Prime number generation * * To generate an RSA key in a way recommended by FIPS 186-4, both primes must * be either 1024 bits or 1536 bits long, and flags must contain * MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR. */ int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int flags, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { #ifdef MBEDTLS_HAVE_INT64 // ceil(2^63.5) #define CEIL_MAXUINT_DIV_SQRT2 0xb504f333f9de6485ULL #else // ceil(2^31.5) #define CEIL_MAXUINT_DIV_SQRT2 0xb504f334U #endif int ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE; size_t k, n; int rounds; mbedtls_mpi_uint r; mbedtls_mpi Y; MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( f_rng != NULL ); if( nbits < 3 || nbits > MBEDTLS_MPI_MAX_BITS ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); mbedtls_mpi_init( &Y ); n = BITS_TO_LIMBS( nbits ); if( ( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR ) == 0 ) { /* * 2^-80 error probability, number of rounds chosen per HAC, table 4.4 */ rounds = ( ( nbits >= 1300 ) ? 2 : ( nbits >= 850 ) ? 3 : ( nbits >= 650 ) ? 4 : ( nbits >= 350 ) ? 8 : ( nbits >= 250 ) ? 12 : ( nbits >= 150 ) ? 18 : 27 ); } else { /* * 2^-100 error probability, number of rounds computed based on HAC, * fact 4.48 */ rounds = ( ( nbits >= 1450 ) ? 4 : ( nbits >= 1150 ) ? 5 : ( nbits >= 1000 ) ? 6 : ( nbits >= 850 ) ? 7 : ( nbits >= 750 ) ? 8 : ( nbits >= 500 ) ? 13 : ( nbits >= 250 ) ? 28 : ( nbits >= 150 ) ? 40 : 51 ); } while( 1 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( X, n * ciL, f_rng, p_rng ) ); /* make sure generated number is at least (nbits-1)+0.5 bits (FIPS 186-4 §B.3.3 steps 4.4, 5.5) */ if( X->p[n-1] < CEIL_MAXUINT_DIV_SQRT2 ) continue; k = n * biL; if( k > nbits ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( X, k - nbits ) ); X->p[0] |= 1; if( ( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH ) == 0 ) { ret = mbedtls_mpi_is_prime_ext( X, rounds, f_rng, p_rng ); if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ) goto cleanup; } else { /* * An necessary condition for Y and X = 2Y + 1 to be prime * is X = 2 mod 3 (which is equivalent to Y = 2 mod 3). * Make sure it is satisfied, while keeping X = 3 mod 4 */ X->p[0] |= 2; MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, 3 ) ); if( r == 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 8 ) ); else if( r == 1 ) MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 4 ) ); /* Set Y = (X-1) / 2, which is X / 2 because X is odd */ MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, X ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, 1 ) ); while( 1 ) { /* * First, check small factors for X and Y * before doing Miller-Rabin on any of them */ if( ( ret = mpi_check_small_factors( X ) ) == 0 && ( ret = mpi_check_small_factors( &Y ) ) == 0 && ( ret = mpi_miller_rabin( X, rounds, f_rng, p_rng ) ) == 0 && ( ret = mpi_miller_rabin( &Y, rounds, f_rng, p_rng ) ) == 0 ) goto cleanup; if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ) goto cleanup; /* * Next candidates. We want to preserve Y = (X-1) / 2 and * Y = 1 mod 2 and Y = 2 mod 3 (eq X = 3 mod 4 and X = 2 mod 3) * so up Y by 6 and X by 12. */ MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 12 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &Y, &Y, 6 ) ); } } } cleanup: mbedtls_mpi_free( &Y ); return( ret ); } #endif /* MBEDTLS_GENPRIME */ #if defined(MBEDTLS_SELF_TEST) #define GCD_PAIR_COUNT 3 static const int gcd_pairs[GCD_PAIR_COUNT][3] = { { 693, 609, 21 }, { 1764, 868, 28 }, { 768454923, 542167814, 1 } }; /* * Checkup routine */ int mbedtls_mpi_self_test( int verbose ) { int ret, i; mbedtls_mpi A, E, N, X, Y, U, V; mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &U ); mbedtls_mpi_init( &V ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &A, 16, "EFE021C2645FD1DC586E69184AF4A31E" \ "D5F53E93B5F123FA41680867BA110131" \ "944FE7952E2517337780CB0DB80E61AA" \ "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &E, 16, "B2E7EFD37075B9F03FF989C7C5051C20" \ "34D2A323810251127E7BF8625A4F49A5" \ "F3E27F4DA8BD59C47D6DAABA4C8127BD" \ "5B5C25763222FEFCCFC38B832366C29E" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &N, 16, "0066A198186C18C10B2F5ED9B522752A" \ "9830B69916E535C8F047518A889A43A5" \ "94B6BED27A168D31D4A52F88925AA8F5" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X, &A, &N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16, "602AB7ECA597A3D6B56FF9829A5E8B85" \ "9E857EA95A03512E2BAE7391688D264A" \ "A5663B0341DB9CCFD2C4C5F421FEC814" \ "8001B72E848A38CAE1C65F78E56ABDEF" \ "E12D3C039B8A02D6BE593F0BBBDA56F1" \ "ECF677152EF804370C1A305CAF3B5BF1" \ "30879B56C61DE584A0F53A2447A51E" ) ); if( verbose != 0 ) mbedtls_printf( " MPI test #1 (mul_mpi): " ); if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &X, &Y, &A, &N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16, "256567336059E52CAE22925474705F39A94" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &V, 16, "6613F26162223DF488E9CD48CC132C7A" \ "0AC93C701B001B092E4E5B9F73BCD27B" \ "9EE50D0657C77F374E903CDFA4C642" ) ); if( verbose != 0 ) mbedtls_printf( " MPI test #2 (div_mpi): " ); if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 || mbedtls_mpi_cmp_mpi( &Y, &V ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &X, &A, &E, &N, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16, "36E139AEA55215609D2816998ED020BB" \ "BD96C37890F65171D948E9BC7CBAA4D9" \ "325D24D6A3C12710F10A09FA08AB87" ) ); if( verbose != 0 ) mbedtls_printf( " MPI test #3 (exp_mod): " ); if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &X, &A, &N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16, "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \ "C3DBA76456363A10869622EAC2DD84EC" \ "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) ); if( verbose != 0 ) mbedtls_printf( " MPI test #4 (inv_mod): " ); if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " MPI test #5 (simple gcd): " ); for( i = 0; i < GCD_PAIR_COUNT; i++ ) { MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &X, gcd_pairs[i][0] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Y, gcd_pairs[i][1] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &A, &X, &Y ) ); if( mbedtls_mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed at %d\n", i ); ret = 1; goto cleanup; } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); cleanup: if( ret != 0 && verbose != 0 ) mbedtls_printf( "Unexpected error, return code = %08X\n", ret ); mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &U ); mbedtls_mpi_free( &V ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_BIGNUM_C */ fldigi-4.2.05/src/mbedtls/asn1parse.c0000664000175000017500000002237414611711171014255 00000000000000/* * Generic ASN.1 parsing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ASN1_PARSE_C) #include "mbedtls/asn1.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_BIGNUM_C) #include "mbedtls/bignum.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif /* * ASN.1 DER decoding routines */ int mbedtls_asn1_get_len( unsigned char **p, const unsigned char *end, size_t *len ) { if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( ( **p & 0x80 ) == 0 ) *len = *(*p)++; else { switch( **p & 0x7F ) { case 1: if( ( end - *p ) < 2 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); *len = (*p)[1]; (*p) += 2; break; case 2: if( ( end - *p ) < 3 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); *len = ( (size_t)(*p)[1] << 8 ) | (*p)[2]; (*p) += 3; break; case 3: if( ( end - *p ) < 4 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); *len = ( (size_t)(*p)[1] << 16 ) | ( (size_t)(*p)[2] << 8 ) | (*p)[3]; (*p) += 4; break; case 4: if( ( end - *p ) < 5 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); *len = ( (size_t)(*p)[1] << 24 ) | ( (size_t)(*p)[2] << 16 ) | ( (size_t)(*p)[3] << 8 ) | (*p)[4]; (*p) += 5; break; default: return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); } } if( *len > (size_t) ( end - *p ) ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); return( 0 ); } int mbedtls_asn1_get_tag( unsigned char **p, const unsigned char *end, size_t *len, int tag ) { if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( **p != tag ) return( MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); (*p)++; return( mbedtls_asn1_get_len( p, end, len ) ); } int mbedtls_asn1_get_bool( unsigned char **p, const unsigned char *end, int *val ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_BOOLEAN ) ) != 0 ) return( ret ); if( len != 1 ) return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); *val = ( **p != 0 ) ? 1 : 0; (*p)++; return( 0 ); } int mbedtls_asn1_get_int( unsigned char **p, const unsigned char *end, int *val ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) return( ret ); if( len == 0 || len > sizeof( int ) || ( **p & 0x80 ) != 0 ) return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); *val = 0; while( len-- > 0 ) { *val = ( *val << 8 ) | **p; (*p)++; } return( 0 ); } #if defined(MBEDTLS_BIGNUM_C) int mbedtls_asn1_get_mpi( unsigned char **p, const unsigned char *end, mbedtls_mpi *X ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) return( ret ); ret = mbedtls_mpi_read_binary( X, *p, len ); *p += len; return( ret ); } #endif /* MBEDTLS_BIGNUM_C */ int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end, mbedtls_asn1_bitstring *bs) { int ret; /* Certificate type is a single byte bitstring */ if( ( ret = mbedtls_asn1_get_tag( p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 ) return( ret ); /* Check length, subtract one for actual bit string length */ if( bs->len < 1 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); bs->len -= 1; /* Get number of unused bits, ensure unused bits <= 7 */ bs->unused_bits = **p; if( bs->unused_bits > 7 ) return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); (*p)++; /* Get actual bitstring */ bs->p = *p; *p += bs->len; if( *p != end ) return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * Get a bit string without unused bits */ int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end, size_t *len ) { int ret; if( ( ret = mbedtls_asn1_get_tag( p, end, len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 ) return( ret ); if( (*len)-- < 2 || *(*p)++ != 0 ) return( MBEDTLS_ERR_ASN1_INVALID_DATA ); return( 0 ); } /* * Parses and splits an ASN.1 "SEQUENCE OF " */ int mbedtls_asn1_get_sequence_of( unsigned char **p, const unsigned char *end, mbedtls_asn1_sequence *cur, int tag) { int ret; size_t len; mbedtls_asn1_buf *buf; /* Get main sequence tag */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( ret ); if( *p + len != end ) return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); while( *p < end ) { buf = &(cur->buf); buf->tag = **p; if( ( ret = mbedtls_asn1_get_tag( p, end, &buf->len, tag ) ) != 0 ) return( ret ); buf->p = *p; *p += buf->len; /* Allocate and assign next pointer */ if( *p < end ) { cur->next = (mbedtls_asn1_sequence*)mbedtls_calloc( 1, sizeof( mbedtls_asn1_sequence ) ); if( cur->next == NULL ) return( MBEDTLS_ERR_ASN1_ALLOC_FAILED ); cur = cur->next; } } /* Set final sequence entry's next pointer to NULL */ cur->next = NULL; if( *p != end ) return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } int mbedtls_asn1_get_alg( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( ret ); if( ( end - *p ) < 1 ) return( MBEDTLS_ERR_ASN1_OUT_OF_DATA ); alg->tag = **p; end = *p + len; if( ( ret = mbedtls_asn1_get_tag( p, end, &alg->len, MBEDTLS_ASN1_OID ) ) != 0 ) return( ret ); alg->p = *p; *p += alg->len; if( *p == end ) { mbedtls_platform_zeroize( params, sizeof(mbedtls_asn1_buf) ); return( 0 ); } params->tag = **p; (*p)++; if( ( ret = mbedtls_asn1_get_len( p, end, ¶ms->len ) ) != 0 ) return( ret ); params->p = *p; *p += params->len; if( *p != end ) return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } int mbedtls_asn1_get_alg_null( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *alg ) { int ret; mbedtls_asn1_buf params; memset( ¶ms, 0, sizeof(mbedtls_asn1_buf) ); if( ( ret = mbedtls_asn1_get_alg( p, end, alg, ¶ms ) ) != 0 ) return( ret ); if( ( params.tag != MBEDTLS_ASN1_NULL && params.tag != 0 ) || params.len != 0 ) return( MBEDTLS_ERR_ASN1_INVALID_DATA ); return( 0 ); } void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *cur ) { if( cur == NULL ) return; mbedtls_free( cur->oid.p ); mbedtls_free( cur->val.p ); mbedtls_platform_zeroize( cur, sizeof( mbedtls_asn1_named_data ) ); } void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head ) { mbedtls_asn1_named_data *cur; while( ( cur = *head ) != NULL ) { *head = cur->next; mbedtls_asn1_free_named_data( cur ); mbedtls_free( cur ); } } mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list, const char *oid, size_t len ) { while( list != NULL ) { if( list->oid.len == len && memcmp( list->oid.p, oid, len ) == 0 ) { break; } list = list->next; } return( list ); } #endif /* MBEDTLS_ASN1_PARSE_C */ fldigi-4.2.05/src/mbedtls/ctr_drbg.c0000664000175000017500000005337514611711171014153 00000000000000/* * CTR_DRBG implementation based on AES-256 (NIST SP 800-90) * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The NIST SP 800-90 DRBGs are described in the following publication. * * http://csrc.nist.gov/publications/nistpubs/800-90/SP800-90revised_March2007.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CTR_DRBG_C) #include "mbedtls/ctr_drbg.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_FS_IO) #include #endif #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ /* * CTR_DRBG context initialization */ void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_ctr_drbg_context ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } /* * Non-public function wrapped by mbedtls_ctr_drbg_seed(). Necessary to allow * NIST tests to succeed (which require known length fixed entropy) */ /* CTR_DRBG_Instantiate with derivation function (SP 800-90A §10.2.1.3.2) * mbedtls_ctr_drbg_seed_entropy_len(ctx, f_entropy, p_entropy, * custom, len, entropy_len) * implements * CTR_DRBG_Instantiate(entropy_input, nonce, personalization_string, * security_strength) -> initial_working_state * with inputs * custom[:len] = nonce || personalization_string * where entropy_input comes from f_entropy for entropy_len bytes * and with outputs * ctx = initial_working_state */ int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *ctx, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len, size_t entropy_len ) { int ret; unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE]; memset( key, 0, MBEDTLS_CTR_DRBG_KEYSIZE ); mbedtls_aes_init( &ctx->aes_ctx ); ctx->f_entropy = f_entropy; ctx->p_entropy = p_entropy; ctx->entropy_len = entropy_len; ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL; /* * Initialize with an empty key */ if( ( ret = mbedtls_aes_setkey_enc( &ctx->aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 ) { return( ret ); } if( ( ret = mbedtls_ctr_drbg_reseed( ctx, custom, len ) ) != 0 ) { return( ret ); } return( 0 ); } int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len ) { return( mbedtls_ctr_drbg_seed_entropy_len( ctx, f_entropy, p_entropy, custom, len, MBEDTLS_CTR_DRBG_ENTROPY_LEN ) ); } void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx ) { if( ctx == NULL ) return; #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif mbedtls_aes_free( &ctx->aes_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ctr_drbg_context ) ); } void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, int resistance ) { ctx->prediction_resistance = resistance; } void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx, size_t len ) { ctx->entropy_len = len; } void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx, int interval ) { ctx->reseed_interval = interval; } static int block_cipher_df( unsigned char *output, const unsigned char *data, size_t data_len ) { unsigned char buf[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16]; unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN]; unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE]; unsigned char chain[MBEDTLS_CTR_DRBG_BLOCKSIZE]; unsigned char *p, *iv; mbedtls_aes_context aes_ctx; int ret = 0; int i, j; size_t buf_len, use_len; if( data_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT ) return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG ); memset( buf, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16 ); mbedtls_aes_init( &aes_ctx ); /* * Construct IV (16 bytes) and S in buffer * IV = Counter (in 32-bits) padded to 16 with zeroes * S = Length input string (in 32-bits) || Length of output (in 32-bits) || * data || 0x80 * (Total is padded to a multiple of 16-bytes with zeroes) */ p = buf + MBEDTLS_CTR_DRBG_BLOCKSIZE; *p++ = ( data_len >> 24 ) & 0xff; *p++ = ( data_len >> 16 ) & 0xff; *p++ = ( data_len >> 8 ) & 0xff; *p++ = ( data_len ) & 0xff; p += 3; *p++ = MBEDTLS_CTR_DRBG_SEEDLEN; memcpy( p, data, data_len ); p[data_len] = 0x80; buf_len = MBEDTLS_CTR_DRBG_BLOCKSIZE + 8 + data_len + 1; for( i = 0; i < MBEDTLS_CTR_DRBG_KEYSIZE; i++ ) key[i] = i; if( ( ret = mbedtls_aes_setkey_enc( &aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 ) { goto exit; } /* * Reduce data to MBEDTLS_CTR_DRBG_SEEDLEN bytes of data */ for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE ) { p = buf; memset( chain, 0, MBEDTLS_CTR_DRBG_BLOCKSIZE ); use_len = buf_len; while( use_len > 0 ) { for( i = 0; i < MBEDTLS_CTR_DRBG_BLOCKSIZE; i++ ) chain[i] ^= p[i]; p += MBEDTLS_CTR_DRBG_BLOCKSIZE; use_len -= ( use_len >= MBEDTLS_CTR_DRBG_BLOCKSIZE ) ? MBEDTLS_CTR_DRBG_BLOCKSIZE : use_len; if( ( ret = mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, chain, chain ) ) != 0 ) { goto exit; } } memcpy( tmp + j, chain, MBEDTLS_CTR_DRBG_BLOCKSIZE ); /* * Update IV */ buf[3]++; } /* * Do final encryption with reduced data */ if( ( ret = mbedtls_aes_setkey_enc( &aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 ) { goto exit; } iv = tmp + MBEDTLS_CTR_DRBG_KEYSIZE; p = output; for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE ) { if( ( ret = mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, iv, iv ) ) != 0 ) { goto exit; } memcpy( p, iv, MBEDTLS_CTR_DRBG_BLOCKSIZE ); p += MBEDTLS_CTR_DRBG_BLOCKSIZE; } exit: mbedtls_aes_free( &aes_ctx ); /* * tidy up the stack */ mbedtls_platform_zeroize( buf, sizeof( buf ) ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); mbedtls_platform_zeroize( key, sizeof( key ) ); mbedtls_platform_zeroize( chain, sizeof( chain ) ); if( 0 != ret ) { /* * wipe partial seed from memory */ mbedtls_platform_zeroize( output, MBEDTLS_CTR_DRBG_SEEDLEN ); } return( ret ); } /* CTR_DRBG_Update (SP 800-90A §10.2.1.2) * ctr_drbg_update_internal(ctx, provided_data) * implements * CTR_DRBG_Update(provided_data, Key, V) * with inputs and outputs * ctx->aes_ctx = Key * ctx->counter = V */ static int ctr_drbg_update_internal( mbedtls_ctr_drbg_context *ctx, const unsigned char data[MBEDTLS_CTR_DRBG_SEEDLEN] ) { unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN]; unsigned char *p = tmp; int i, j; int ret = 0; memset( tmp, 0, MBEDTLS_CTR_DRBG_SEEDLEN ); for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE ) { /* * Increase counter */ for( i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i-- ) if( ++ctx->counter[i - 1] != 0 ) break; /* * Crypt counter block */ if( ( ret = mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, p ) ) != 0 ) goto exit; p += MBEDTLS_CTR_DRBG_BLOCKSIZE; } for( i = 0; i < MBEDTLS_CTR_DRBG_SEEDLEN; i++ ) tmp[i] ^= data[i]; /* * Update key and counter */ if( ( ret = mbedtls_aes_setkey_enc( &ctx->aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS ) ) != 0 ) goto exit; memcpy( ctx->counter, tmp + MBEDTLS_CTR_DRBG_KEYSIZE, MBEDTLS_CTR_DRBG_BLOCKSIZE ); exit: mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); return( ret ); } /* CTR_DRBG_Instantiate with derivation function (SP 800-90A §10.2.1.3.2) * mbedtls_ctr_drbg_update(ctx, additional, add_len) * implements * CTR_DRBG_Instantiate(entropy_input, nonce, personalization_string, * security_strength) -> initial_working_state * with inputs * ctx->counter = all-bits-0 * ctx->aes_ctx = context from all-bits-0 key * additional[:add_len] = entropy_input || nonce || personalization_string * and with outputs * ctx = initial_working_state */ int mbedtls_ctr_drbg_update_ret( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t add_len ) { unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN]; int ret; if( add_len == 0 ) return( 0 ); if( ( ret = block_cipher_df( add_input, additional, add_len ) ) != 0 ) goto exit; if( ( ret = ctr_drbg_update_internal( ctx, add_input ) ) != 0 ) goto exit; exit: mbedtls_platform_zeroize( add_input, sizeof( add_input ) ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t add_len ) { /* MAX_INPUT would be more logical here, but we have to match * block_cipher_df()'s limits since we can't propagate errors */ if( add_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT ) add_len = MBEDTLS_CTR_DRBG_MAX_SEED_INPUT; (void) mbedtls_ctr_drbg_update_ret( ctx, additional, add_len ); } #endif /* MBEDTLS_DEPRECATED_REMOVED */ /* CTR_DRBG_Reseed with derivation function (SP 800-90A §10.2.1.4.2) * mbedtls_ctr_drbg_reseed(ctx, additional, len) * implements * CTR_DRBG_Reseed(working_state, entropy_input, additional_input) * -> new_working_state * with inputs * ctx contains working_state * additional[:len] = additional_input * and entropy_input comes from calling ctx->f_entropy * and with output * ctx contains new_working_state */ int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx, const unsigned char *additional, size_t len ) { unsigned char seed[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT]; size_t seedlen = 0; int ret; if( ctx->entropy_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT || len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - ctx->entropy_len ) return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG ); memset( seed, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT ); /* * Gather entropy_len bytes of entropy to seed state */ if( 0 != ctx->f_entropy( ctx->p_entropy, seed, ctx->entropy_len ) ) { return( MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED ); } seedlen += ctx->entropy_len; /* * Add additional data */ if( additional && len ) { memcpy( seed + seedlen, additional, len ); seedlen += len; } /* * Reduce to 384 bits */ if( ( ret = block_cipher_df( seed, seed, seedlen ) ) != 0 ) goto exit; /* * Update state */ if( ( ret = ctr_drbg_update_internal( ctx, seed ) ) != 0 ) goto exit; ctx->reseed_counter = 1; exit: mbedtls_platform_zeroize( seed, sizeof( seed ) ); return( ret ); } /* CTR_DRBG_Generate with derivation function (SP 800-90A §10.2.1.5.2) * mbedtls_ctr_drbg_random_with_add(ctx, output, output_len, additional, add_len) * implements * CTR_DRBG_Reseed(working_state, entropy_input, additional[:add_len]) * -> working_state_after_reseed * if required, then * CTR_DRBG_Generate(working_state_after_reseed, * requested_number_of_bits, additional_input) * -> status, returned_bits, new_working_state * with inputs * ctx contains working_state * requested_number_of_bits = 8 * output_len * additional[:add_len] = additional_input * and entropy_input comes from calling ctx->f_entropy * and with outputs * status = SUCCESS (this function does the reseed internally) * returned_bits = output[:output_len] * ctx contains new_working_state */ int mbedtls_ctr_drbg_random_with_add( void *p_rng, unsigned char *output, size_t output_len, const unsigned char *additional, size_t add_len ) { int ret = 0; mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng; unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN]; unsigned char *p = output; unsigned char tmp[MBEDTLS_CTR_DRBG_BLOCKSIZE]; int i; size_t use_len; if( output_len > MBEDTLS_CTR_DRBG_MAX_REQUEST ) return( MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG ); if( add_len > MBEDTLS_CTR_DRBG_MAX_INPUT ) return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG ); memset( add_input, 0, MBEDTLS_CTR_DRBG_SEEDLEN ); if( ctx->reseed_counter > ctx->reseed_interval || ctx->prediction_resistance ) { if( ( ret = mbedtls_ctr_drbg_reseed( ctx, additional, add_len ) ) != 0 ) { return( ret ); } add_len = 0; } if( add_len > 0 ) { if( ( ret = block_cipher_df( add_input, additional, add_len ) ) != 0 ) goto exit; if( ( ret = ctr_drbg_update_internal( ctx, add_input ) ) != 0 ) goto exit; } while( output_len > 0 ) { /* * Increase counter */ for( i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i-- ) if( ++ctx->counter[i - 1] != 0 ) break; /* * Crypt counter block */ if( ( ret = mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, tmp ) ) != 0 ) goto exit; use_len = ( output_len > MBEDTLS_CTR_DRBG_BLOCKSIZE ) ? MBEDTLS_CTR_DRBG_BLOCKSIZE : output_len; /* * Copy random block to destination */ memcpy( p, tmp, use_len ); p += use_len; output_len -= use_len; } if( ( ret = ctr_drbg_update_internal( ctx, add_input ) ) != 0 ) goto exit; ctx->reseed_counter++; exit: mbedtls_platform_zeroize( add_input, sizeof( add_input ) ); mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); return( 0 ); } int mbedtls_ctr_drbg_random( void *p_rng, unsigned char *output, size_t output_len ) { int ret; mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif ret = mbedtls_ctr_drbg_random_with_add( ctx, output, output_len, NULL, 0 ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } #if defined(MBEDTLS_FS_IO) int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ) { int ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; FILE *f; unsigned char buf[ MBEDTLS_CTR_DRBG_MAX_INPUT ]; if( ( f = fopen( path, "wb" ) ) == NULL ) return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR ); if( ( ret = mbedtls_ctr_drbg_random( ctx, buf, MBEDTLS_CTR_DRBG_MAX_INPUT ) ) != 0 ) goto exit; if( fwrite( buf, 1, MBEDTLS_CTR_DRBG_MAX_INPUT, f ) != MBEDTLS_CTR_DRBG_MAX_INPUT ) ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; else ret = 0; exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); fclose( f ); return( ret ); } int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ) { int ret = 0; FILE *f = NULL; size_t n; unsigned char buf[ MBEDTLS_CTR_DRBG_MAX_INPUT ]; unsigned char c; if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR ); n = fread( buf, 1, sizeof( buf ), f ); if( fread( &c, 1, 1, f ) != 0 ) { ret = MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG; goto exit; } if( n == 0 || ferror( f ) ) { ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR; goto exit; } fclose( f ); f = NULL; ret = mbedtls_ctr_drbg_update_ret( ctx, buf, n ); exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); if( f != NULL ) fclose( f ); if( ret != 0 ) return( ret ); return( mbedtls_ctr_drbg_write_seed_file( ctx, path ) ); } #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) static const unsigned char entropy_source_pr[96] = { 0xc1, 0x80, 0x81, 0xa6, 0x5d, 0x44, 0x02, 0x16, 0x19, 0xb3, 0xf1, 0x80, 0xb1, 0xc9, 0x20, 0x02, 0x6a, 0x54, 0x6f, 0x0c, 0x70, 0x81, 0x49, 0x8b, 0x6e, 0xa6, 0x62, 0x52, 0x6d, 0x51, 0xb1, 0xcb, 0x58, 0x3b, 0xfa, 0xd5, 0x37, 0x5f, 0xfb, 0xc9, 0xff, 0x46, 0xd2, 0x19, 0xc7, 0x22, 0x3e, 0x95, 0x45, 0x9d, 0x82, 0xe1, 0xe7, 0x22, 0x9f, 0x63, 0x31, 0x69, 0xd2, 0x6b, 0x57, 0x47, 0x4f, 0xa3, 0x37, 0xc9, 0x98, 0x1c, 0x0b, 0xfb, 0x91, 0x31, 0x4d, 0x55, 0xb9, 0xe9, 0x1c, 0x5a, 0x5e, 0xe4, 0x93, 0x92, 0xcf, 0xc5, 0x23, 0x12, 0xd5, 0x56, 0x2c, 0x4a, 0x6e, 0xff, 0xdc, 0x10, 0xd0, 0x68 }; static const unsigned char entropy_source_nopr[64] = { 0x5a, 0x19, 0x4d, 0x5e, 0x2b, 0x31, 0x58, 0x14, 0x54, 0xde, 0xf6, 0x75, 0xfb, 0x79, 0x58, 0xfe, 0xc7, 0xdb, 0x87, 0x3e, 0x56, 0x89, 0xfc, 0x9d, 0x03, 0x21, 0x7c, 0x68, 0xd8, 0x03, 0x38, 0x20, 0xf9, 0xe6, 0x5e, 0x04, 0xd8, 0x56, 0xf3, 0xa9, 0xc4, 0x4a, 0x4c, 0xbd, 0xc1, 0xd0, 0x08, 0x46, 0xf5, 0x98, 0x3d, 0x77, 0x1c, 0x1b, 0x13, 0x7e, 0x4e, 0x0f, 0x9d, 0x8e, 0xf4, 0x09, 0xf9, 0x2e }; static const unsigned char nonce_pers_pr[16] = { 0xd2, 0x54, 0xfc, 0xff, 0x02, 0x1e, 0x69, 0xd2, 0x29, 0xc9, 0xcf, 0xad, 0x85, 0xfa, 0x48, 0x6c }; static const unsigned char nonce_pers_nopr[16] = { 0x1b, 0x54, 0xb8, 0xff, 0x06, 0x42, 0xbf, 0xf5, 0x21, 0xf1, 0x5c, 0x1c, 0x0b, 0x66, 0x5f, 0x3f }; static const unsigned char result_pr[16] = { 0x34, 0x01, 0x16, 0x56, 0xb4, 0x29, 0x00, 0x8f, 0x35, 0x63, 0xec, 0xb5, 0xf2, 0x59, 0x07, 0x23 }; static const unsigned char result_nopr[16] = { 0xa0, 0x54, 0x30, 0x3d, 0x8a, 0x7e, 0xa9, 0x88, 0x9d, 0x90, 0x3e, 0x07, 0x7c, 0x6f, 0x21, 0x8f }; static size_t test_offset; static int ctr_drbg_self_test_entropy( void *data, unsigned char *buf, size_t len ) { const unsigned char *p = data; memcpy( buf, p + test_offset, len ); test_offset += len; return( 0 ); } #define CHK( c ) if( (c) != 0 ) \ { \ if( verbose != 0 ) \ mbedtls_printf( "failed\n" ); \ return( 1 ); \ } /* * Checkup routine */ int mbedtls_ctr_drbg_self_test( int verbose ) { mbedtls_ctr_drbg_context ctx; unsigned char buf[16]; mbedtls_ctr_drbg_init( &ctx ); /* * Based on a NIST CTR_DRBG test vector (PR = True) */ if( verbose != 0 ) mbedtls_printf( " CTR_DRBG (PR = TRUE) : " ); test_offset = 0; CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy, (void *) entropy_source_pr, nonce_pers_pr, 16, 32 ) ); mbedtls_ctr_drbg_set_prediction_resistance( &ctx, MBEDTLS_CTR_DRBG_PR_ON ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) ); CHK( memcmp( buf, result_pr, MBEDTLS_CTR_DRBG_BLOCKSIZE ) ); mbedtls_ctr_drbg_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); /* * Based on a NIST CTR_DRBG test vector (PR = FALSE) */ if( verbose != 0 ) mbedtls_printf( " CTR_DRBG (PR = FALSE): " ); mbedtls_ctr_drbg_init( &ctx ); test_offset = 0; CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy, (void *) entropy_source_nopr, nonce_pers_nopr, 16, 32 ) ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) ); CHK( mbedtls_ctr_drbg_reseed( &ctx, NULL, 0 ) ); CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) ); CHK( memcmp( buf, result_nopr, 16 ) ); mbedtls_ctr_drbg_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_CTR_DRBG_C */ fldigi-4.2.05/src/mbedtls/libmbedtls.pc0000664000175000017500000000130414611711171014647 00000000000000#*************************************************************************** # # Example libmbedtls.pc file # # This example is for compiled and linked libmbedtls targeted for # /usr/local/lib # # If library is in /usr/lib then change the prefix accordingly # # The pc file is placed in the location ${prefix}/lib/pkgconfig/ # ########################################################################### prefix=/usr/local exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include/mbedtls Name: libmbedtls Description: Library to access network sites using https protocol Version: 2.16.0 Libs: -L${libdir} -lmbedx509 -lmbedtls -lmbedcrypto Cflags: -I${prefix}/include -I${includedir} fldigi-4.2.05/src/mbedtls/camellia.c0000664000175000017500000011060314611711171014120 00000000000000/* * Camellia implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The Camellia block cipher was designed by NTT and Mitsubishi Electric * Corporation. * * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CAMELLIA_C) #include "mbedtls/camellia.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_CAMELLIA_ALT) /* Parameter validation macros */ #define CAMELLIA_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA ) #define CAMELLIA_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif static const unsigned char SIGMA_CHARS[6][8] = { { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b }, { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 }, { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe }, { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c }, { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d }, { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd } }; #if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY) static const unsigned char FSb[256] = { 112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65, 35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189, 134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26, 166,225, 57,202,213, 71, 93, 61,217, 1, 90,214, 81, 86,108, 77, 139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153, 223, 76,203,194, 52,126,118, 5,109,183,169, 49,209, 23, 4,215, 20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34, 254, 68,207,178,195,181,122,145, 36, 8,232,168, 96,252,105, 80, 170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210, 16,196, 0, 72,163,247,117,219,138, 3,230,218, 9, 63,221,148, 135, 92,131, 2,205, 74,144, 51,115,103,246,243,157,127,191,226, 82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46, 233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89, 120,152, 6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250, 114, 7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164, 64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158 }; #define SBOX1(n) FSb[(n)] #define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff) #define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff) #define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff] #else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */ static const unsigned char FSb[256] = { 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12, 174, 65, 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78, 29, 101, 146, 189, 134, 184, 175, 143, 124, 235, 31, 206, 62, 48, 220, 95, 94, 197, 11, 26, 166, 225, 57, 202, 213, 71, 93, 61, 217, 1, 90, 214, 81, 86, 108, 77, 139, 13, 154, 102, 251, 204, 176, 45, 116, 18, 43, 32, 240, 177, 132, 153, 223, 76, 203, 194, 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215, 20, 88, 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34, 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252, 105, 80, 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149, 224, 255, 100, 210, 16, 196, 0, 72, 163, 247, 117, 219, 138, 3, 230, 218, 9, 63, 221, 148, 135, 92, 131, 2, 205, 74, 144, 51, 115, 103, 246, 243, 157, 127, 191, 226, 82, 155, 216, 38, 200, 55, 198, 59, 129, 150, 111, 75, 19, 190, 99, 46, 233, 121, 167, 140, 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89, 120, 152, 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250, 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56, 241, 164, 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244, 119, 199, 128, 158 }; static const unsigned char FSb2[256] = { 224, 5, 88, 217, 103, 78, 129, 203, 201, 11, 174, 106, 213, 24, 93, 130, 70, 223, 214, 39, 138, 50, 75, 66, 219, 28, 158, 156, 58, 202, 37, 123, 13, 113, 95, 31, 248, 215, 62, 157, 124, 96, 185, 190, 188, 139, 22, 52, 77, 195, 114, 149, 171, 142, 186, 122, 179, 2, 180, 173, 162, 172, 216, 154, 23, 26, 53, 204, 247, 153, 97, 90, 232, 36, 86, 64, 225, 99, 9, 51, 191, 152, 151, 133, 104, 252, 236, 10, 218, 111, 83, 98, 163, 46, 8, 175, 40, 176, 116, 194, 189, 54, 34, 56, 100, 30, 57, 44, 166, 48, 229, 68, 253, 136, 159, 101, 135, 107, 244, 35, 72, 16, 209, 81, 192, 249, 210, 160, 85, 161, 65, 250, 67, 19, 196, 47, 168, 182, 60, 43, 193, 255, 200, 165, 32, 137, 0, 144, 71, 239, 234, 183, 21, 6, 205, 181, 18, 126, 187, 41, 15, 184, 7, 4, 155, 148, 33, 102, 230, 206, 237, 231, 59, 254, 127, 197, 164, 55, 177, 76, 145, 110, 141, 118, 3, 45, 222, 150, 38, 125, 198, 92, 211, 242, 79, 25, 63, 220, 121, 29, 82, 235, 243, 109, 94, 251, 105, 178, 240, 49, 12, 212, 207, 140, 226, 117, 169, 74, 87, 132, 17, 69, 27, 245, 228, 14, 115, 170, 241, 221, 89, 20, 108, 146, 84, 208, 120, 112, 227, 73, 128, 80, 167, 246, 119, 147, 134, 131, 42, 199, 91, 233, 238, 143, 1, 61 }; static const unsigned char FSb3[256] = { 56, 65, 22, 118, 217, 147, 96, 242, 114, 194, 171, 154, 117, 6, 87, 160, 145, 247, 181, 201, 162, 140, 210, 144, 246, 7, 167, 39, 142, 178, 73, 222, 67, 92, 215, 199, 62, 245, 143, 103, 31, 24, 110, 175, 47, 226, 133, 13, 83, 240, 156, 101, 234, 163, 174, 158, 236, 128, 45, 107, 168, 43, 54, 166, 197, 134, 77, 51, 253, 102, 88, 150, 58, 9, 149, 16, 120, 216, 66, 204, 239, 38, 229, 97, 26, 63, 59, 130, 182, 219, 212, 152, 232, 139, 2, 235, 10, 44, 29, 176, 111, 141, 136, 14, 25, 135, 78, 11, 169, 12, 121, 17, 127, 34, 231, 89, 225, 218, 61, 200, 18, 4, 116, 84, 48, 126, 180, 40, 85, 104, 80, 190, 208, 196, 49, 203, 42, 173, 15, 202, 112, 255, 50, 105, 8, 98, 0, 36, 209, 251, 186, 237, 69, 129, 115, 109, 132, 159, 238, 74, 195, 46, 193, 1, 230, 37, 72, 153, 185, 179, 123, 249, 206, 191, 223, 113, 41, 205, 108, 19, 100, 155, 99, 157, 192, 75, 183, 165, 137, 95, 177, 23, 244, 188, 211, 70, 207, 55, 94, 71, 148, 250, 252, 91, 151, 254, 90, 172, 60, 76, 3, 53, 243, 35, 184, 93, 106, 146, 213, 33, 68, 81, 198, 125, 57, 131, 220, 170, 124, 119, 86, 5, 27, 164, 21, 52, 30, 28, 248, 82, 32, 20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227, 64, 79 }; static const unsigned char FSb4[256] = { 112, 44, 179, 192, 228, 87, 234, 174, 35, 107, 69, 165, 237, 79, 29, 146, 134, 175, 124, 31, 62, 220, 94, 11, 166, 57, 213, 93, 217, 90, 81, 108, 139, 154, 251, 176, 116, 43, 240, 132, 223, 203, 52, 118, 109, 169, 209, 4, 20, 58, 222, 17, 50, 156, 83, 242, 254, 207, 195, 122, 36, 232, 96, 105, 170, 160, 161, 98, 84, 30, 224, 100, 16, 0, 163, 117, 138, 230, 9, 221, 135, 131, 205, 144, 115, 246, 157, 191, 82, 216, 200, 198, 129, 111, 19, 99, 233, 167, 159, 188, 41, 249, 47, 180, 120, 6, 231, 113, 212, 171, 136, 141, 114, 185, 248, 172, 54, 42, 60, 241, 64, 211, 187, 67, 21, 173, 119, 128, 130, 236, 39, 229, 133, 53, 12, 65, 239, 147, 25, 33, 14, 78, 101, 189, 184, 143, 235, 206, 48, 95, 197, 26, 225, 202, 71, 61, 1, 214, 86, 77, 13, 102, 204, 45, 18, 32, 177, 153, 76, 194, 126, 5, 183, 49, 23, 215, 88, 97, 27, 28, 15, 22, 24, 34, 68, 178, 181, 145, 8, 168, 252, 80, 208, 125, 137, 151, 91, 149, 255, 210, 196, 72, 247, 219, 3, 218, 63, 148, 92, 2, 74, 51, 103, 243, 127, 226, 155, 38, 55, 59, 150, 75, 190, 46, 121, 140, 110, 142, 245, 182, 253, 89, 152, 106, 70, 186, 37, 66, 162, 250, 7, 85, 238, 10, 73, 104, 56, 164, 40, 123, 201, 193, 227, 244, 199, 158 }; #define SBOX1(n) FSb[(n)] #define SBOX2(n) FSb2[(n)] #define SBOX3(n) FSb3[(n)] #define SBOX4(n) FSb4[(n)] #endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */ static const unsigned char shifts[2][4][4] = { { { 1, 1, 1, 1 }, /* KL */ { 0, 0, 0, 0 }, /* KR */ { 1, 1, 1, 1 }, /* KA */ { 0, 0, 0, 0 } /* KB */ }, { { 1, 0, 1, 1 }, /* KL */ { 1, 1, 0, 1 }, /* KR */ { 1, 1, 1, 0 }, /* KA */ { 1, 1, 0, 1 } /* KB */ } }; static const signed char indexes[2][4][20] = { { { 0, 1, 2, 3, 8, 9, 10, 11, 38, 39, 36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */ { 4, 5, 6, 7, 12, 13, 14, 15, 16, 17, 18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } /* KB -> RK */ }, { { 0, 1, 2, 3, 61, 62, 63, 60, -1, -1, -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */ { -1, -1, -1, -1, 8, 9, 10, 11, 16, 17, 18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */ { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59, 56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */ { 4, 5, 6, 7, 65, 66, 67, 64, 20, 21, 22, 23, -1, -1, -1, -1, 43, 40, 41, 42 } /* KB -> RK */ } }; static const signed char transposes[2][20] = { { 21, 22, 23, 20, -1, -1, -1, -1, 18, 19, 16, 17, 11, 8, 9, 10, 15, 12, 13, 14 }, { 25, 26, 27, 24, 29, 30, 31, 28, 18, 19, 16, 17, -1, -1, -1, -1, -1, -1, -1, -1 } }; /* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */ #define ROTL(DEST, SRC, SHIFT) \ { \ (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT)); \ (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT)); \ (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT)); \ (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT)); \ } #define FL(XL, XR, KL, KR) \ { \ (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR); \ (XL) = ((XR) | (KR)) ^ (XL); \ } #define FLInv(YL, YR, KL, KR) \ { \ (YL) = ((YR) | (KR)) ^ (YL); \ (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR); \ } #define SHIFT_AND_PLACE(INDEX, OFFSET) \ { \ TK[0] = KC[(OFFSET) * 4 + 0]; \ TK[1] = KC[(OFFSET) * 4 + 1]; \ TK[2] = KC[(OFFSET) * 4 + 2]; \ TK[3] = KC[(OFFSET) * 4 + 3]; \ \ for( i = 1; i <= 4; i++ ) \ if( shifts[(INDEX)][(OFFSET)][i -1] ) \ ROTL(TK + i * 4, TK, ( 15 * i ) % 32); \ \ for( i = 0; i < 20; i++ ) \ if( indexes[(INDEX)][(OFFSET)][i] != -1 ) { \ RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ]; \ } \ } static void camellia_feistel( const uint32_t x[2], const uint32_t k[2], uint32_t z[2]) { uint32_t I0, I1; I0 = x[0] ^ k[0]; I1 = x[1] ^ k[1]; I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) | ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) | ((uint32_t) SBOX3((I0 >> 8) & 0xFF) << 8) | ((uint32_t) SBOX4((I0 ) & 0xFF) ); I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) | ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) | ((uint32_t) SBOX4((I1 >> 8) & 0xFF) << 8) | ((uint32_t) SBOX1((I1 ) & 0xFF) ); I0 ^= (I1 << 8) | (I1 >> 24); I1 ^= (I0 << 16) | (I0 >> 16); I0 ^= (I1 >> 8) | (I1 << 24); I1 ^= (I0 >> 8) | (I0 << 24); z[0] ^= I1; z[1] ^= I0; } void mbedtls_camellia_init( mbedtls_camellia_context *ctx ) { CAMELLIA_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_camellia_context ) ); } void mbedtls_camellia_free( mbedtls_camellia_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_camellia_context ) ); } /* * Camellia key schedule (encryption) */ int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key, unsigned int keybits ) { int idx; size_t i; uint32_t *RK; unsigned char t[64]; uint32_t SIGMA[6][2]; uint32_t KC[16]; uint32_t TK[20]; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( key != NULL ); RK = ctx->rk; memset( t, 0, 64 ); memset( RK, 0, sizeof(ctx->rk) ); switch( keybits ) { case 128: ctx->nr = 3; idx = 0; break; case 192: case 256: ctx->nr = 4; idx = 1; break; default : return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA ); } for( i = 0; i < keybits / 8; ++i ) t[i] = key[i]; if( keybits == 192 ) { for( i = 0; i < 8; i++ ) t[24 + i] = ~t[16 + i]; } /* * Prepare SIGMA values */ for( i = 0; i < 6; i++ ) { GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 ); GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 ); } /* * Key storage in KC * Order: KL, KR, KA, KB */ memset( KC, 0, sizeof(KC) ); /* Store KL, KR */ for( i = 0; i < 8; i++ ) GET_UINT32_BE( KC[i], t, i * 4 ); /* Generate KA */ for( i = 0; i < 4; ++i ) KC[8 + i] = KC[i] ^ KC[4 + i]; camellia_feistel( KC + 8, SIGMA[0], KC + 10 ); camellia_feistel( KC + 10, SIGMA[1], KC + 8 ); for( i = 0; i < 4; ++i ) KC[8 + i] ^= KC[i]; camellia_feistel( KC + 8, SIGMA[2], KC + 10 ); camellia_feistel( KC + 10, SIGMA[3], KC + 8 ); if( keybits > 128 ) { /* Generate KB */ for( i = 0; i < 4; ++i ) KC[12 + i] = KC[4 + i] ^ KC[8 + i]; camellia_feistel( KC + 12, SIGMA[4], KC + 14 ); camellia_feistel( KC + 14, SIGMA[5], KC + 12 ); } /* * Generating subkeys */ /* Manipulating KL */ SHIFT_AND_PLACE( idx, 0 ); /* Manipulating KR */ if( keybits > 128 ) { SHIFT_AND_PLACE( idx, 1 ); } /* Manipulating KA */ SHIFT_AND_PLACE( idx, 2 ); /* Manipulating KB */ if( keybits > 128 ) { SHIFT_AND_PLACE( idx, 3 ); } /* Do transpositions */ for( i = 0; i < 20; i++ ) { if( transposes[idx][i] != -1 ) { RK[32 + 12 * idx + i] = RK[transposes[idx][i]]; } } return( 0 ); } /* * Camellia key schedule (decryption) */ int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key, unsigned int keybits ) { int idx, ret; size_t i; mbedtls_camellia_context cty; uint32_t *RK; uint32_t *SK; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( key != NULL ); mbedtls_camellia_init( &cty ); /* Also checks keybits */ if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 ) goto exit; ctx->nr = cty.nr; idx = ( ctx->nr == 4 ); RK = ctx->rk; SK = cty.rk + 24 * 2 + 8 * idx * 2; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 ) { *RK++ = *SK++; *RK++ = *SK++; } SK -= 2; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; *RK++ = *SK++; exit: mbedtls_camellia_free( &cty ); return( ret ); } /* * Camellia-ECB block encryption/decryption */ int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ) { int NR; uint32_t *RK, X[4]; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT || mode == MBEDTLS_CAMELLIA_DECRYPT ); CAMELLIA_VALIDATE_RET( input != NULL ); CAMELLIA_VALIDATE_RET( output != NULL ); ( (void) mode ); NR = ctx->nr; RK = ctx->rk; GET_UINT32_BE( X[0], input, 0 ); GET_UINT32_BE( X[1], input, 4 ); GET_UINT32_BE( X[2], input, 8 ); GET_UINT32_BE( X[3], input, 12 ); X[0] ^= *RK++; X[1] ^= *RK++; X[2] ^= *RK++; X[3] ^= *RK++; while( NR ) { --NR; camellia_feistel( X, RK, X + 2 ); RK += 2; camellia_feistel( X + 2, RK, X ); RK += 2; camellia_feistel( X, RK, X + 2 ); RK += 2; camellia_feistel( X + 2, RK, X ); RK += 2; camellia_feistel( X, RK, X + 2 ); RK += 2; camellia_feistel( X + 2, RK, X ); RK += 2; if( NR ) { FL(X[0], X[1], RK[0], RK[1]); RK += 2; FLInv(X[2], X[3], RK[0], RK[1]); RK += 2; } } X[2] ^= *RK++; X[3] ^= *RK++; X[0] ^= *RK++; X[1] ^= *RK++; PUT_UINT32_BE( X[2], output, 0 ); PUT_UINT32_BE( X[3], output, 4 ); PUT_UINT32_BE( X[0], output, 8 ); PUT_UINT32_BE( X[1], output, 12 ); return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * Camellia-CBC buffer encryption/decryption */ int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[16]; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT || mode == MBEDTLS_CAMELLIA_DECRYPT ); CAMELLIA_VALIDATE_RET( iv != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || input != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || output != NULL ); if( length % 16 ) return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_CAMELLIA_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, 16 ); mbedtls_camellia_crypt_ecb( ctx, mode, input, output ); for( i = 0; i < 16; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, 16 ); input += 16; output += 16; length -= 16; } } else { while( length > 0 ) { for( i = 0; i < 16; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_camellia_crypt_ecb( ctx, mode, output, output ); memcpy( iv, output, 16 ); input += 16; output += 16; length -= 16; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * Camellia-CFB128 buffer encryption/decryption */ int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int c; size_t n; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( mode == MBEDTLS_CAMELLIA_ENCRYPT || mode == MBEDTLS_CAMELLIA_DECRYPT ); CAMELLIA_VALIDATE_RET( iv != NULL ); CAMELLIA_VALIDATE_RET( iv_off != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || input != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || output != NULL ); n = *iv_off; if( n >= 16 ) return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA ); if( mode == MBEDTLS_CAMELLIA_DECRYPT ) { while( length-- ) { if( n == 0 ) mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv ); c = *input++; *output++ = (unsigned char)( c ^ iv[n] ); iv[n] = (unsigned char) c; n = ( n + 1 ) & 0x0F; } } else { while( length-- ) { if( n == 0 ) mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv ); iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); n = ( n + 1 ) & 0x0F; } } *iv_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * Camellia-CTR buffer encryption/decryption */ int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[16], unsigned char stream_block[16], const unsigned char *input, unsigned char *output ) { int c, i; size_t n; CAMELLIA_VALIDATE_RET( ctx != NULL ); CAMELLIA_VALIDATE_RET( nonce_counter != NULL ); CAMELLIA_VALIDATE_RET( stream_block != NULL ); CAMELLIA_VALIDATE_RET( nc_off != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || input != NULL ); CAMELLIA_VALIDATE_RET( length == 0 || output != NULL ); n = *nc_off; if( n >= 16 ) return( MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter, stream_block ); for( i = 16; i > 0; i-- ) if( ++nonce_counter[i - 1] != 0 ) break; } c = *input++; *output++ = (unsigned char)( c ^ stream_block[n] ); n = ( n + 1 ) & 0x0F; } *nc_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #endif /* !MBEDTLS_CAMELLIA_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * Camellia test vectors from: * * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html: * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt * http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt * (For each bitlength: Key 0, Nr 39) */ #define CAMELLIA_TESTS_ECB 2 static const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] = { { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, }; static const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] = { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }, { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }; static const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] = { { { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73, 0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 }, { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE, 0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 } }, { { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8, 0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 }, { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9, 0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 } }, { { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c, 0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 }, { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C, 0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 } } }; #if defined(MBEDTLS_CIPHER_MODE_CBC) #define CAMELLIA_TESTS_CBC 3 static const unsigned char camellia_test_cbc_key[3][32] = { { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C } , { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52, 0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5, 0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B } , { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE, 0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81, 0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7, 0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 } }; static const unsigned char camellia_test_cbc_iv[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F } ; static const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] = { { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A }, { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C, 0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 }, { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11, 0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF } }; static const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] = { { { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0, 0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB }, { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78, 0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 }, { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B, 0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 } }, { { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2, 0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 }, { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42, 0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 }, { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8, 0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 } }, { { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A, 0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA }, { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40, 0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 }, { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA, 0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 } } }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * Camellia-CTR test vectors from: * * http://www.faqs.org/rfcs/rfc5528.html */ static const unsigned char camellia_test_ctr_key[3][16] = { { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC, 0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E }, { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7, 0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 }, { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8, 0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC } }; static const unsigned char camellia_test_ctr_nonce_counter[3][16] = { { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59, 0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 }, { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F, 0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 } }; static const unsigned char camellia_test_ctr_pt[3][48] = { { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F }, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23 } }; static const unsigned char camellia_test_ctr_ct[3][48] = { { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A, 0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F }, { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4, 0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44, 0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7, 0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 }, { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88, 0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73, 0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1, 0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD, 0xDF, 0x50, 0x86, 0x96 } }; static const int camellia_test_ctr_len[3] = { 16, 32, 36 }; #endif /* MBEDTLS_CIPHER_MODE_CTR */ /* * Checkup routine */ int mbedtls_camellia_self_test( int verbose ) { int i, j, u, v; unsigned char key[32]; unsigned char buf[64]; unsigned char src[16]; unsigned char dst[16]; #if defined(MBEDTLS_CIPHER_MODE_CBC) unsigned char iv[16]; #endif #if defined(MBEDTLS_CIPHER_MODE_CTR) size_t offset, len; unsigned char nonce_counter[16]; unsigned char stream_block[16]; #endif mbedtls_camellia_context ctx; memset( key, 0, 32 ); for( j = 0; j < 6; j++ ) { u = j >> 1; v = j & 1; if( verbose != 0 ) mbedtls_printf( " CAMELLIA-ECB-%3d (%s): ", 128 + u * 64, (v == MBEDTLS_CAMELLIA_DECRYPT) ? "dec" : "enc"); for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) { memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u ); if( v == MBEDTLS_CAMELLIA_DECRYPT ) { mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 ); memcpy( src, camellia_test_ecb_cipher[u][i], 16 ); memcpy( dst, camellia_test_ecb_plain[i], 16 ); } else { /* MBEDTLS_CAMELLIA_ENCRYPT */ mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 ); memcpy( src, camellia_test_ecb_plain[i], 16 ); memcpy( dst, camellia_test_ecb_cipher[u][i], 16 ); } mbedtls_camellia_crypt_ecb( &ctx, v, src, buf ); if( memcmp( buf, dst, 16 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * CBC mode */ for( j = 0; j < 6; j++ ) { u = j >> 1; v = j & 1; if( verbose != 0 ) mbedtls_printf( " CAMELLIA-CBC-%3d (%s): ", 128 + u * 64, ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" ); memcpy( src, camellia_test_cbc_iv, 16 ); memcpy( dst, camellia_test_cbc_iv, 16 ); memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u ); if( v == MBEDTLS_CAMELLIA_DECRYPT ) { mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 ); } else { mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 ); } for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) { if( v == MBEDTLS_CAMELLIA_DECRYPT ) { memcpy( iv , src, 16 ); memcpy( src, camellia_test_cbc_cipher[u][i], 16 ); memcpy( dst, camellia_test_cbc_plain[i], 16 ); } else { /* MBEDTLS_CAMELLIA_ENCRYPT */ memcpy( iv , dst, 16 ); memcpy( src, camellia_test_cbc_plain[i], 16 ); memcpy( dst, camellia_test_cbc_cipher[u][i], 16 ); } mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf ); if( memcmp( buf, dst, 16 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ if( verbose != 0 ) mbedtls_printf( "\n" ); #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * CTR mode */ for( i = 0; i < 6; i++ ) { u = i >> 1; v = i & 1; if( verbose != 0 ) mbedtls_printf( " CAMELLIA-CTR-128 (%s): ", ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? "dec" : "enc" ); memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 ); memcpy( key, camellia_test_ctr_key[u], 16 ); offset = 0; mbedtls_camellia_setkey_enc( &ctx, key, 128 ); if( v == MBEDTLS_CAMELLIA_DECRYPT ) { len = camellia_test_ctr_len[u]; memcpy( buf, camellia_test_ctr_ct[u], len ); mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } } else { len = camellia_test_ctr_len[u]; memcpy( buf, camellia_test_ctr_pt[u], len ); mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block, buf, buf ); if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_CAMELLIA_C */ fldigi-4.2.05/src/mbedtls/pkcs5.c0000664000175000017500000002742114611711171013403 00000000000000/** * \file pkcs5.c * * \brief PKCS#5 functions * * \author Mathias Olsson * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * PKCS#5 includes PBKDF2 and more * * http://tools.ietf.org/html/rfc2898 (Specification) * http://tools.ietf.org/html/rfc6070 (Test vectors) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PKCS5_C) #include "mbedtls/pkcs5.h" #if defined(MBEDTLS_ASN1_PARSE_C) #include "mbedtls/asn1.h" #include "mbedtls/cipher.h" #include "mbedtls/oid.h" #endif /* MBEDTLS_ASN1_PARSE_C */ #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif #if defined(MBEDTLS_ASN1_PARSE_C) static int pkcs5_parse_pbkdf2_params( const mbedtls_asn1_buf *params, mbedtls_asn1_buf *salt, int *iterations, int *keylen, mbedtls_md_type_t *md_type ) { int ret; mbedtls_asn1_buf prf_alg_oid; unsigned char *p = params->p; const unsigned char *end = params->p + params->len; if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); /* * PBKDF2-params ::= SEQUENCE { * salt OCTET STRING, * iterationCount INTEGER, * keyLength INTEGER OPTIONAL * prf AlgorithmIdentifier DEFAULT algid-hmacWithSHA1 * } * */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); salt->p = p; p += salt->len; if( ( ret = mbedtls_asn1_get_int( &p, end, iterations ) ) != 0 ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); if( p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_int( &p, end, keylen ) ) != 0 ) { if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); } if( p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_alg_null( &p, end, &prf_alg_oid ) ) != 0 ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); if( mbedtls_oid_get_md_hmac( &prf_alg_oid, md_type ) != 0 ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); if( p != end ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } int mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode, const unsigned char *pwd, size_t pwdlen, const unsigned char *data, size_t datalen, unsigned char *output ) { int ret, iterations = 0, keylen = 0; unsigned char *p, *end; mbedtls_asn1_buf kdf_alg_oid, enc_scheme_oid, kdf_alg_params, enc_scheme_params; mbedtls_asn1_buf salt; mbedtls_md_type_t md_type = MBEDTLS_MD_SHA1; unsigned char key[32], iv[32]; size_t olen = 0; const mbedtls_md_info_t *md_info; const mbedtls_cipher_info_t *cipher_info; mbedtls_md_context_t md_ctx; mbedtls_cipher_type_t cipher_alg; mbedtls_cipher_context_t cipher_ctx; p = pbe_params->p; end = p + pbe_params->len; /* * PBES2-params ::= SEQUENCE { * keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}}, * encryptionScheme AlgorithmIdentifier {{PBES2-Encs}} * } */ if( pbe_params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); if( ( ret = mbedtls_asn1_get_alg( &p, end, &kdf_alg_oid, &kdf_alg_params ) ) != 0 ) return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); // Only PBKDF2 supported at the moment // if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS5_PBKDF2, &kdf_alg_oid ) != 0 ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); if( ( ret = pkcs5_parse_pbkdf2_params( &kdf_alg_params, &salt, &iterations, &keylen, &md_type ) ) != 0 ) { return( ret ); } md_info = mbedtls_md_info_from_type( md_type ); if( md_info == NULL ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); if( ( ret = mbedtls_asn1_get_alg( &p, end, &enc_scheme_oid, &enc_scheme_params ) ) != 0 ) { return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret ); } if( mbedtls_oid_get_cipher_alg( &enc_scheme_oid, &cipher_alg ) != 0 ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); cipher_info = mbedtls_cipher_info_from_type( cipher_alg ); if( cipher_info == NULL ) return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE ); /* * The value of keylen from pkcs5_parse_pbkdf2_params() is ignored * since it is optional and we don't know if it was set or not */ keylen = cipher_info->key_bitlen / 8; if( enc_scheme_params.tag != MBEDTLS_ASN1_OCTET_STRING || enc_scheme_params.len != cipher_info->iv_size ) { return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT ); } mbedtls_md_init( &md_ctx ); mbedtls_cipher_init( &cipher_ctx ); memcpy( iv, enc_scheme_params.p, enc_scheme_params.len ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 ) goto exit; if( ( ret = mbedtls_pkcs5_pbkdf2_hmac( &md_ctx, pwd, pwdlen, salt.p, salt.len, iterations, keylen, key ) ) != 0 ) { goto exit; } if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_setkey( &cipher_ctx, key, 8 * keylen, (mbedtls_operation_t) mode ) ) != 0 ) goto exit; if( ( ret = mbedtls_cipher_crypt( &cipher_ctx, iv, enc_scheme_params.len, data, datalen, output, &olen ) ) != 0 ) ret = MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH; exit: mbedtls_md_free( &md_ctx ); mbedtls_cipher_free( &cipher_ctx ); return( ret ); } #endif /* MBEDTLS_ASN1_PARSE_C */ int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *password, size_t plen, const unsigned char *salt, size_t slen, unsigned int iteration_count, uint32_t key_length, unsigned char *output ) { int ret, j; unsigned int i; unsigned char md1[MBEDTLS_MD_MAX_SIZE]; unsigned char work[MBEDTLS_MD_MAX_SIZE]; unsigned char md_size = mbedtls_md_get_size( ctx->md_info ); size_t use_len; unsigned char *out_p = output; unsigned char counter[4]; memset( counter, 0, 4 ); counter[3] = 1; #if UINT_MAX > 0xFFFFFFFF if( iteration_count > 0xFFFFFFFF ) return( MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA ); #endif while( key_length ) { // U1 ends up in work // if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_update( ctx, salt, slen ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_update( ctx, counter, 4 ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_finish( ctx, work ) ) != 0 ) return( ret ); memcpy( md1, work, md_size ); for( i = 1; i < iteration_count; i++ ) { // U2 ends up in md1 // if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_update( ctx, md1, md_size ) ) != 0 ) return( ret ); if( ( ret = mbedtls_md_hmac_finish( ctx, md1 ) ) != 0 ) return( ret ); // U1 xor U2 // for( j = 0; j < md_size; j++ ) work[j] ^= md1[j]; } use_len = ( key_length < md_size ) ? key_length : md_size; memcpy( out_p, work, use_len ); key_length -= (uint32_t) use_len; out_p += use_len; for( i = 4; i > 0; i-- ) if( ++counter[i - 1] != 0 ) break; } return( 0 ); } #if defined(MBEDTLS_SELF_TEST) #if !defined(MBEDTLS_SHA1_C) int mbedtls_pkcs5_self_test( int verbose ) { if( verbose != 0 ) mbedtls_printf( " PBKDF2 (SHA1): skipped\n\n" ); return( 0 ); } #else #define MAX_TESTS 6 static const size_t plen[MAX_TESTS] = { 8, 8, 8, 24, 9 }; static const unsigned char password[MAX_TESTS][32] = { "password", "password", "password", "passwordPASSWORDpassword", "pass\0word", }; static const size_t slen[MAX_TESTS] = { 4, 4, 4, 36, 5 }; static const unsigned char salt[MAX_TESTS][40] = { "salt", "salt", "salt", "saltSALTsaltSALTsaltSALTsaltSALTsalt", "sa\0lt", }; static const uint32_t it_cnt[MAX_TESTS] = { 1, 2, 4096, 4096, 4096 }; static const uint32_t key_len[MAX_TESTS] = { 20, 20, 20, 25, 16 }; static const unsigned char result_key[MAX_TESTS][32] = { { 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, 0x2f, 0xe0, 0x37, 0xa6 }, { 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, 0xd8, 0xde, 0x89, 0x57 }, { 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, 0x65, 0xa4, 0x29, 0xc1 }, { 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, 0x38 }, { 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3 }, }; int mbedtls_pkcs5_self_test( int verbose ) { mbedtls_md_context_t sha1_ctx; const mbedtls_md_info_t *info_sha1; int ret, i; unsigned char key[64]; mbedtls_md_init( &sha1_ctx ); info_sha1 = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ); if( info_sha1 == NULL ) { ret = 1; goto exit; } if( ( ret = mbedtls_md_setup( &sha1_ctx, info_sha1, 1 ) ) != 0 ) { ret = 1; goto exit; } for( i = 0; i < MAX_TESTS; i++ ) { if( verbose != 0 ) mbedtls_printf( " PBKDF2 (SHA1) #%d: ", i ); ret = mbedtls_pkcs5_pbkdf2_hmac( &sha1_ctx, password[i], plen[i], salt[i], slen[i], it_cnt[i], key_len[i], key ); if( ret != 0 || memcmp( result_key[i], key, key_len[i] ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); exit: mbedtls_md_free( &sha1_ctx ); return( ret ); } #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_PKCS5_C */ fldigi-4.2.05/src/mbedtls/cipher.c0000664000175000017500000010433414611711171013627 00000000000000/** * \file cipher.c * * \brief Generic cipher wrapper for mbed TLS * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CIPHER_C) #include "mbedtls/cipher.h" #include "mbedtls/cipher_internal.h" #include "mbedtls/platform_util.h" #include #include #if defined(MBEDTLS_CHACHAPOLY_C) #include "mbedtls/chachapoly.h" #endif #if defined(MBEDTLS_GCM_C) #include "mbedtls/gcm.h" #endif #if defined(MBEDTLS_CCM_C) #include "mbedtls/ccm.h" #endif #if defined(MBEDTLS_CHACHA20_C) #include "mbedtls/chacha20.h" #endif #if defined(MBEDTLS_CMAC_C) #include "mbedtls/cmac.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #define mbedtls_calloc calloc #define mbedtls_free free #endif #define CIPHER_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ) #define CIPHER_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) /* Compare the contents of two buffers in constant time. * Returns 0 if the contents are bitwise identical, otherwise returns * a non-zero value. * This is currently only used by GCM and ChaCha20+Poly1305. */ static int mbedtls_constant_time_memcmp( const void *v1, const void *v2, size_t len ) { const unsigned char *p1 = (const unsigned char*) v1; const unsigned char *p2 = (const unsigned char*) v2; size_t i; unsigned char diff; for( diff = 0, i = 0; i < len; i++ ) diff |= p1[i] ^ p2[i]; return( (int)diff ); } #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ static int supported_init = 0; const int *mbedtls_cipher_list( void ) { const mbedtls_cipher_definition_t *def; int *type; if( ! supported_init ) { def = mbedtls_cipher_definitions; type = mbedtls_cipher_supported; while( def->type != 0 ) *type++ = (*def++).type; *type = 0; supported_init = 1; } return( mbedtls_cipher_supported ); } const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type ) { const mbedtls_cipher_definition_t *def; for( def = mbedtls_cipher_definitions; def->info != NULL; def++ ) if( def->type == cipher_type ) return( def->info ); return( NULL ); } const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name ) { const mbedtls_cipher_definition_t *def; if( NULL == cipher_name ) return( NULL ); for( def = mbedtls_cipher_definitions; def->info != NULL; def++ ) if( ! strcmp( def->info->name, cipher_name ) ) return( def->info ); return( NULL ); } const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id, int key_bitlen, const mbedtls_cipher_mode_t mode ) { const mbedtls_cipher_definition_t *def; for( def = mbedtls_cipher_definitions; def->info != NULL; def++ ) if( def->info->base->cipher == cipher_id && def->info->key_bitlen == (unsigned) key_bitlen && def->info->mode == mode ) return( def->info ); return( NULL ); } void mbedtls_cipher_init( mbedtls_cipher_context_t *ctx ) { CIPHER_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_cipher_context_t ) ); } void mbedtls_cipher_free( mbedtls_cipher_context_t *ctx ) { if( ctx == NULL ) return; #if defined(MBEDTLS_CMAC_C) if( ctx->cmac_ctx ) { mbedtls_platform_zeroize( ctx->cmac_ctx, sizeof( mbedtls_cmac_context_t ) ); mbedtls_free( ctx->cmac_ctx ); } #endif if( ctx->cipher_ctx ) ctx->cipher_info->base->ctx_free_func( ctx->cipher_ctx ); mbedtls_platform_zeroize( ctx, sizeof(mbedtls_cipher_context_t) ); } int mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info ) { CIPHER_VALIDATE_RET( ctx != NULL ); if( cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); memset( ctx, 0, sizeof( mbedtls_cipher_context_t ) ); if( NULL == ( ctx->cipher_ctx = cipher_info->base->ctx_alloc_func() ) ) return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED ); ctx->cipher_info = cipher_info; #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) /* * Ignore possible errors caused by a cipher mode that doesn't use padding */ #if defined(MBEDTLS_CIPHER_PADDING_PKCS7) (void) mbedtls_cipher_set_padding_mode( ctx, MBEDTLS_PADDING_PKCS7 ); #else (void) mbedtls_cipher_set_padding_mode( ctx, MBEDTLS_PADDING_NONE ); #endif #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ return( 0 ); } int mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key, int key_bitlen, const mbedtls_operation_t operation ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( key != NULL ); CIPHER_VALIDATE_RET( operation == MBEDTLS_ENCRYPT || operation == MBEDTLS_DECRYPT ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( ( ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_KEY_LEN ) == 0 && (int) ctx->cipher_info->key_bitlen != key_bitlen ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } ctx->key_bitlen = key_bitlen; ctx->operation = operation; /* * For OFB, CFB and CTR mode always use the encryption key schedule */ if( MBEDTLS_ENCRYPT == operation || MBEDTLS_MODE_CFB == ctx->cipher_info->mode || MBEDTLS_MODE_OFB == ctx->cipher_info->mode || MBEDTLS_MODE_CTR == ctx->cipher_info->mode ) { return( ctx->cipher_info->base->setkey_enc_func( ctx->cipher_ctx, key, ctx->key_bitlen ) ); } if( MBEDTLS_DECRYPT == operation ) return( ctx->cipher_info->base->setkey_dec_func( ctx->cipher_ctx, key, ctx->key_bitlen ) ); return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } int mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len ) { size_t actual_iv_size; CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( iv_len == 0 || iv != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); /* avoid buffer overflow in ctx->iv */ if( iv_len > MBEDTLS_MAX_IV_LENGTH ) return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); if( ( ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_IV_LEN ) != 0 ) actual_iv_size = iv_len; else { actual_iv_size = ctx->cipher_info->iv_size; /* avoid reading past the end of input buffer */ if( actual_iv_size > iv_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } #if defined(MBEDTLS_CHACHA20_C) if ( ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20 ) { if ( 0 != mbedtls_chacha20_starts( (mbedtls_chacha20_context*)ctx->cipher_ctx, iv, 0U ) ) /* Initial counter value */ { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } } #endif if ( actual_iv_size != 0 ) { memcpy( ctx->iv, iv, actual_iv_size ); ctx->iv_size = actual_iv_size; } return( 0 ); } int mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx ) { CIPHER_VALIDATE_RET( ctx != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); ctx->unprocessed_len = 0; return( 0 ); } #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) int mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx, const unsigned char *ad, size_t ad_len ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( ad_len == 0 || ad != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) { return( mbedtls_gcm_starts( (mbedtls_gcm_context *) ctx->cipher_ctx, ctx->operation, ctx->iv, ctx->iv_size, ad, ad_len ) ); } #endif #if defined(MBEDTLS_CHACHAPOLY_C) if (MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { int result; mbedtls_chachapoly_mode_t mode; mode = ( ctx->operation == MBEDTLS_ENCRYPT ) ? MBEDTLS_CHACHAPOLY_ENCRYPT : MBEDTLS_CHACHAPOLY_DECRYPT; result = mbedtls_chachapoly_starts( (mbedtls_chachapoly_context*) ctx->cipher_ctx, ctx->iv, mode ); if ( result != 0 ) return( result ); return( mbedtls_chachapoly_update_aad( (mbedtls_chachapoly_context*) ctx->cipher_ctx, ad, ad_len ) ); } #endif return( 0 ); } #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ int mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen ) { int ret; size_t block_size; CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( ilen == 0 || input != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); *olen = 0; block_size = mbedtls_cipher_get_block_size( ctx ); if( ctx->cipher_info->mode == MBEDTLS_MODE_ECB ) { if( ilen != block_size ) return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED ); *olen = ilen; if( 0 != ( ret = ctx->cipher_info->base->ecb_func( ctx->cipher_ctx, ctx->operation, input, output ) ) ) { return( ret ); } return( 0 ); } #if defined(MBEDTLS_GCM_C) if( ctx->cipher_info->mode == MBEDTLS_MODE_GCM ) { *olen = ilen; return( mbedtls_gcm_update( (mbedtls_gcm_context *) ctx->cipher_ctx, ilen, input, output ) ); } #endif #if defined(MBEDTLS_CHACHAPOLY_C) if ( ctx->cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305 ) { *olen = ilen; return( mbedtls_chachapoly_update( (mbedtls_chachapoly_context*) ctx->cipher_ctx, ilen, input, output ) ); } #endif if ( 0 == block_size ) { return( MBEDTLS_ERR_CIPHER_INVALID_CONTEXT ); } if( input == output && ( ctx->unprocessed_len != 0 || ilen % block_size ) ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) if( ctx->cipher_info->mode == MBEDTLS_MODE_CBC ) { size_t copy_len = 0; /* * If there is not enough data for a full block, cache it. */ if( ( ctx->operation == MBEDTLS_DECRYPT && NULL != ctx->add_padding && ilen <= block_size - ctx->unprocessed_len ) || ( ctx->operation == MBEDTLS_DECRYPT && NULL == ctx->add_padding && ilen < block_size - ctx->unprocessed_len ) || ( ctx->operation == MBEDTLS_ENCRYPT && ilen < block_size - ctx->unprocessed_len ) ) { memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input, ilen ); ctx->unprocessed_len += ilen; return( 0 ); } /* * Process cached data first */ if( 0 != ctx->unprocessed_len ) { copy_len = block_size - ctx->unprocessed_len; memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input, copy_len ); if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx, ctx->operation, block_size, ctx->iv, ctx->unprocessed_data, output ) ) ) { return( ret ); } *olen += block_size; output += block_size; ctx->unprocessed_len = 0; input += copy_len; ilen -= copy_len; } /* * Cache final, incomplete block */ if( 0 != ilen ) { if( 0 == block_size ) { return( MBEDTLS_ERR_CIPHER_INVALID_CONTEXT ); } /* Encryption: only cache partial blocks * Decryption w/ padding: always keep at least one whole block * Decryption w/o padding: only cache partial blocks */ copy_len = ilen % block_size; if( copy_len == 0 && ctx->operation == MBEDTLS_DECRYPT && NULL != ctx->add_padding) { copy_len = block_size; } memcpy( ctx->unprocessed_data, &( input[ilen - copy_len] ), copy_len ); ctx->unprocessed_len += copy_len; ilen -= copy_len; } /* * Process remaining full blocks */ if( ilen ) { if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx, ctx->operation, ilen, ctx->iv, input, output ) ) ) { return( ret ); } *olen += ilen; } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) if( ctx->cipher_info->mode == MBEDTLS_MODE_CFB ) { if( 0 != ( ret = ctx->cipher_info->base->cfb_func( ctx->cipher_ctx, ctx->operation, ilen, &ctx->unprocessed_len, ctx->iv, input, output ) ) ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_OFB) if( ctx->cipher_info->mode == MBEDTLS_MODE_OFB ) { if( 0 != ( ret = ctx->cipher_info->base->ofb_func( ctx->cipher_ctx, ilen, &ctx->unprocessed_len, ctx->iv, input, output ) ) ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_OFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) if( ctx->cipher_info->mode == MBEDTLS_MODE_CTR ) { if( 0 != ( ret = ctx->cipher_info->base->ctr_func( ctx->cipher_ctx, ilen, &ctx->unprocessed_len, ctx->iv, ctx->unprocessed_data, input, output ) ) ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #if defined(MBEDTLS_CIPHER_MODE_XTS) if( ctx->cipher_info->mode == MBEDTLS_MODE_XTS ) { if( ctx->unprocessed_len > 0 ) { /* We can only process an entire data unit at a time. */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } ret = ctx->cipher_info->base->xts_func( ctx->cipher_ctx, ctx->operation, ilen, ctx->iv, input, output ); if( ret != 0 ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_XTS */ #if defined(MBEDTLS_CIPHER_MODE_STREAM) if( ctx->cipher_info->mode == MBEDTLS_MODE_STREAM ) { if( 0 != ( ret = ctx->cipher_info->base->stream_func( ctx->cipher_ctx, ilen, input, output ) ) ) { return( ret ); } *olen = ilen; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_STREAM */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) #if defined(MBEDTLS_CIPHER_PADDING_PKCS7) /* * PKCS7 (and PKCS5) padding: fill with ll bytes, with ll = padding_len */ static void add_pkcs_padding( unsigned char *output, size_t output_len, size_t data_len ) { size_t padding_len = output_len - data_len; unsigned char i; for( i = 0; i < padding_len; i++ ) output[data_len + i] = (unsigned char) padding_len; } static int get_pkcs_padding( unsigned char *input, size_t input_len, size_t *data_len ) { size_t i, pad_idx; unsigned char padding_len, bad = 0; if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); padding_len = input[input_len - 1]; *data_len = input_len - padding_len; /* Avoid logical || since it results in a branch */ bad |= padding_len > input_len; bad |= padding_len == 0; /* The number of bytes checked must be independent of padding_len, * so pick input_len, which is usually 8 or 16 (one block) */ pad_idx = input_len - padding_len; for( i = 0; i < input_len; i++ ) bad |= ( input[i] ^ padding_len ) * ( i >= pad_idx ); return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) ); } #endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */ #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) /* * One and zeros padding: fill with 80 00 ... 00 */ static void add_one_and_zeros_padding( unsigned char *output, size_t output_len, size_t data_len ) { size_t padding_len = output_len - data_len; unsigned char i = 0; output[data_len] = 0x80; for( i = 1; i < padding_len; i++ ) output[data_len + i] = 0x00; } static int get_one_and_zeros_padding( unsigned char *input, size_t input_len, size_t *data_len ) { size_t i; unsigned char done = 0, prev_done, bad; if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); bad = 0x80; *data_len = 0; for( i = input_len; i > 0; i-- ) { prev_done = done; done |= ( input[i - 1] != 0 ); *data_len |= ( i - 1 ) * ( done != prev_done ); bad ^= input[i - 1] * ( done != prev_done ); } return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) ); } #endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */ #if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN) /* * Zeros and len padding: fill with 00 ... 00 ll, where ll is padding length */ static void add_zeros_and_len_padding( unsigned char *output, size_t output_len, size_t data_len ) { size_t padding_len = output_len - data_len; unsigned char i = 0; for( i = 1; i < padding_len; i++ ) output[data_len + i - 1] = 0x00; output[output_len - 1] = (unsigned char) padding_len; } static int get_zeros_and_len_padding( unsigned char *input, size_t input_len, size_t *data_len ) { size_t i, pad_idx; unsigned char padding_len, bad = 0; if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); padding_len = input[input_len - 1]; *data_len = input_len - padding_len; /* Avoid logical || since it results in a branch */ bad |= padding_len > input_len; bad |= padding_len == 0; /* The number of bytes checked must be independent of padding_len */ pad_idx = input_len - padding_len; for( i = 0; i < input_len - 1; i++ ) bad |= input[i] * ( i >= pad_idx ); return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) ); } #endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */ #if defined(MBEDTLS_CIPHER_PADDING_ZEROS) /* * Zero padding: fill with 00 ... 00 */ static void add_zeros_padding( unsigned char *output, size_t output_len, size_t data_len ) { size_t i; for( i = data_len; i < output_len; i++ ) output[i] = 0x00; } static int get_zeros_padding( unsigned char *input, size_t input_len, size_t *data_len ) { size_t i; unsigned char done = 0, prev_done; if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); *data_len = 0; for( i = input_len; i > 0; i-- ) { prev_done = done; done |= ( input[i-1] != 0 ); *data_len |= i * ( done != prev_done ); } return( 0 ); } #endif /* MBEDTLS_CIPHER_PADDING_ZEROS */ /* * No padding: don't pad :) * * There is no add_padding function (check for NULL in mbedtls_cipher_finish) * but a trivial get_padding function */ static int get_no_padding( unsigned char *input, size_t input_len, size_t *data_len ) { if( NULL == input || NULL == data_len ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); *data_len = input_len; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ int mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx, unsigned char *output, size_t *olen ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); *olen = 0; if( MBEDTLS_MODE_CFB == ctx->cipher_info->mode || MBEDTLS_MODE_OFB == ctx->cipher_info->mode || MBEDTLS_MODE_CTR == ctx->cipher_info->mode || MBEDTLS_MODE_GCM == ctx->cipher_info->mode || MBEDTLS_MODE_XTS == ctx->cipher_info->mode || MBEDTLS_MODE_STREAM == ctx->cipher_info->mode ) { return( 0 ); } if ( ( MBEDTLS_CIPHER_CHACHA20 == ctx->cipher_info->type ) || ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) ) { return( 0 ); } if( MBEDTLS_MODE_ECB == ctx->cipher_info->mode ) { if( ctx->unprocessed_len != 0 ) return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED ); return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) if( MBEDTLS_MODE_CBC == ctx->cipher_info->mode ) { int ret = 0; if( MBEDTLS_ENCRYPT == ctx->operation ) { /* check for 'no padding' mode */ if( NULL == ctx->add_padding ) { if( 0 != ctx->unprocessed_len ) return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED ); return( 0 ); } ctx->add_padding( ctx->unprocessed_data, mbedtls_cipher_get_iv_size( ctx ), ctx->unprocessed_len ); } else if( mbedtls_cipher_get_block_size( ctx ) != ctx->unprocessed_len ) { /* * For decrypt operations, expect a full block, * or an empty block if no padding */ if( NULL == ctx->add_padding && 0 == ctx->unprocessed_len ) return( 0 ); return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED ); } /* cipher block */ if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx, ctx->operation, mbedtls_cipher_get_block_size( ctx ), ctx->iv, ctx->unprocessed_data, output ) ) ) { return( ret ); } /* Set output size for decryption */ if( MBEDTLS_DECRYPT == ctx->operation ) return( ctx->get_padding( output, mbedtls_cipher_get_block_size( ctx ), olen ) ); /* Set output size for encryption */ *olen = mbedtls_cipher_get_block_size( ctx ); return( 0 ); } #else ((void) output); #endif /* MBEDTLS_CIPHER_MODE_CBC */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } #if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) int mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode ) { CIPHER_VALIDATE_RET( ctx != NULL ); if( NULL == ctx->cipher_info || MBEDTLS_MODE_CBC != ctx->cipher_info->mode ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } switch( mode ) { #if defined(MBEDTLS_CIPHER_PADDING_PKCS7) case MBEDTLS_PADDING_PKCS7: ctx->add_padding = add_pkcs_padding; ctx->get_padding = get_pkcs_padding; break; #endif #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) case MBEDTLS_PADDING_ONE_AND_ZEROS: ctx->add_padding = add_one_and_zeros_padding; ctx->get_padding = get_one_and_zeros_padding; break; #endif #if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN) case MBEDTLS_PADDING_ZEROS_AND_LEN: ctx->add_padding = add_zeros_and_len_padding; ctx->get_padding = get_zeros_and_len_padding; break; #endif #if defined(MBEDTLS_CIPHER_PADDING_ZEROS) case MBEDTLS_PADDING_ZEROS: ctx->add_padding = add_zeros_padding; ctx->get_padding = get_zeros_padding; break; #endif case MBEDTLS_PADDING_NONE: ctx->add_padding = NULL; ctx->get_padding = get_no_padding; break; default: return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ #if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) int mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx, unsigned char *tag, size_t tag_len ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( MBEDTLS_ENCRYPT != ctx->operation ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) return( mbedtls_gcm_finish( (mbedtls_gcm_context *) ctx->cipher_ctx, tag, tag_len ) ); #endif #if defined(MBEDTLS_CHACHAPOLY_C) if ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { /* Don't allow truncated MAC for Poly1305 */ if ( tag_len != 16U ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); return( mbedtls_chachapoly_finish( (mbedtls_chachapoly_context*) ctx->cipher_ctx, tag ) ); } #endif return( 0 ); } int mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx, const unsigned char *tag, size_t tag_len ) { unsigned char check_tag[16]; int ret; CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( tag_len == 0 || tag != NULL ); if( ctx->cipher_info == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( MBEDTLS_DECRYPT != ctx->operation ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) { if( tag_len > sizeof( check_tag ) ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( 0 != ( ret = mbedtls_gcm_finish( (mbedtls_gcm_context *) ctx->cipher_ctx, check_tag, tag_len ) ) ) { return( ret ); } /* Check the tag in "constant-time" */ if( mbedtls_constant_time_memcmp( tag, check_tag, tag_len ) != 0 ) return( MBEDTLS_ERR_CIPHER_AUTH_FAILED ); return( 0 ); } #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CHACHAPOLY_C) if ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { /* Don't allow truncated MAC for Poly1305 */ if ( tag_len != sizeof( check_tag ) ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); ret = mbedtls_chachapoly_finish( (mbedtls_chachapoly_context*) ctx->cipher_ctx, check_tag ); if ( ret != 0 ) { return( ret ); } /* Check the tag in "constant-time" */ if( mbedtls_constant_time_memcmp( tag, check_tag, tag_len ) != 0 ) return( MBEDTLS_ERR_CIPHER_AUTH_FAILED ); return( 0 ); } #endif /* MBEDTLS_CHACHAPOLY_C */ return( 0 ); } #endif /* MBEDTLS_GCM_C || MBEDTLS_CHACHAPOLY_C */ /* * Packet-oriented wrapper for non-AEAD modes */ int mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen ) { int ret; size_t finish_olen; CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( iv_len == 0 || iv != NULL ); CIPHER_VALIDATE_RET( ilen == 0 || input != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); if( ( ret = mbedtls_cipher_set_iv( ctx, iv, iv_len ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_reset( ctx ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_update( ctx, input, ilen, output, olen ) ) != 0 ) return( ret ); if( ( ret = mbedtls_cipher_finish( ctx, output + *olen, &finish_olen ) ) != 0 ) return( ret ); *olen += finish_olen; return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_AEAD) /* * Packet-oriented encryption for AEAD modes */ int mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, unsigned char *tag, size_t tag_len ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( iv != NULL ); CIPHER_VALIDATE_RET( ad_len == 0 || ad != NULL ); CIPHER_VALIDATE_RET( ilen == 0 || input != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); CIPHER_VALIDATE_RET( tag_len == 0 || tag != NULL ); #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) { *olen = ilen; return( mbedtls_gcm_crypt_and_tag( ctx->cipher_ctx, MBEDTLS_GCM_ENCRYPT, ilen, iv, iv_len, ad, ad_len, input, output, tag_len, tag ) ); } #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) if( MBEDTLS_MODE_CCM == ctx->cipher_info->mode ) { *olen = ilen; return( mbedtls_ccm_encrypt_and_tag( ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, input, output, tag, tag_len ) ); } #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_CHACHAPOLY_C) if ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { /* ChachaPoly has fixed length nonce and MAC (tag) */ if ( ( iv_len != ctx->cipher_info->iv_size ) || ( tag_len != 16U ) ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } *olen = ilen; return( mbedtls_chachapoly_encrypt_and_tag( ctx->cipher_ctx, ilen, iv, ad, ad_len, input, output, tag ) ); } #endif /* MBEDTLS_CHACHAPOLY_C */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } /* * Packet-oriented decryption for AEAD modes */ int mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx, const unsigned char *iv, size_t iv_len, const unsigned char *ad, size_t ad_len, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, const unsigned char *tag, size_t tag_len ) { CIPHER_VALIDATE_RET( ctx != NULL ); CIPHER_VALIDATE_RET( iv != NULL ); CIPHER_VALIDATE_RET( ad_len == 0 || ad != NULL ); CIPHER_VALIDATE_RET( ilen == 0 || input != NULL ); CIPHER_VALIDATE_RET( output != NULL ); CIPHER_VALIDATE_RET( olen != NULL ); CIPHER_VALIDATE_RET( tag_len == 0 || tag != NULL ); #if defined(MBEDTLS_GCM_C) if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode ) { int ret; *olen = ilen; ret = mbedtls_gcm_auth_decrypt( ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, tag, tag_len, input, output ); if( ret == MBEDTLS_ERR_GCM_AUTH_FAILED ) ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; return( ret ); } #endif /* MBEDTLS_GCM_C */ #if defined(MBEDTLS_CCM_C) if( MBEDTLS_MODE_CCM == ctx->cipher_info->mode ) { int ret; *olen = ilen; ret = mbedtls_ccm_auth_decrypt( ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, input, output, tag, tag_len ); if( ret == MBEDTLS_ERR_CCM_AUTH_FAILED ) ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; return( ret ); } #endif /* MBEDTLS_CCM_C */ #if defined(MBEDTLS_CHACHAPOLY_C) if ( MBEDTLS_CIPHER_CHACHA20_POLY1305 == ctx->cipher_info->type ) { int ret; /* ChachaPoly has fixed length nonce and MAC (tag) */ if ( ( iv_len != ctx->cipher_info->iv_size ) || ( tag_len != 16U ) ) { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } *olen = ilen; ret = mbedtls_chachapoly_auth_decrypt( ctx->cipher_ctx, ilen, iv, ad, ad_len, tag, input, output ); if( ret == MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED ) ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED; return( ret ); } #endif /* MBEDTLS_CHACHAPOLY_C */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } #endif /* MBEDTLS_CIPHER_MODE_AEAD */ #endif /* MBEDTLS_CIPHER_C */ fldigi-4.2.05/src/mbedtls/x509write_csr.c0000664000175000017500000002107414611711171015003 00000000000000/* * X.509 Certificate Signing Request writing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * - CSRs: PKCS#10 v1.7 aka RFC 2986 * - attributes: PKCS#9 v2.0 aka RFC 2985 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CSR_WRITE_C) #include "mbedtls/x509_csr.h" #include "mbedtls/oid.h" #include "mbedtls/asn1write.h" #include "mbedtls/platform_util.h" #include #include #if defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #endif void mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx ) { memset( ctx, 0, sizeof( mbedtls_x509write_csr ) ); } void mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx ) { mbedtls_asn1_free_named_data_list( &ctx->subject ); mbedtls_asn1_free_named_data_list( &ctx->extensions ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_x509write_csr ) ); } void mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg ) { ctx->md_alg = md_alg; } void mbedtls_x509write_csr_set_key( mbedtls_x509write_csr *ctx, mbedtls_pk_context *key ) { ctx->key = key; } int mbedtls_x509write_csr_set_subject_name( mbedtls_x509write_csr *ctx, const char *subject_name ) { return mbedtls_x509_string_to_names( &ctx->subject, subject_name ); } int mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx, const char *oid, size_t oid_len, const unsigned char *val, size_t val_len ) { return mbedtls_x509_set_extension( &ctx->extensions, oid, oid_len, 0, val, val_len ); } int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage ) { unsigned char buf[4]; unsigned char *c; int ret; c = buf + 4; if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &key_usage, 7 ) ) != 4 ) return( ret ); ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_KEY_USAGE, MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ), buf, 4 ); if( ret != 0 ) return( ret ); return( 0 ); } int mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx, unsigned char ns_cert_type ) { unsigned char buf[4]; unsigned char *c; int ret; c = buf + 4; if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 ) return( ret ); ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE, MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ), buf, 4 ); if( ret != 0 ) return( ret ); return( 0 ); } int mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; const char *sig_oid; size_t sig_oid_len = 0; unsigned char *c, *c2; unsigned char hash[64]; unsigned char sig[MBEDTLS_MPI_MAX_SIZE]; unsigned char tmp_buf[2048]; size_t pub_len = 0, sig_and_oid_len = 0, sig_len; size_t len = 0; mbedtls_pk_type_t pk_alg; /* * Prepare data to be signed in tmp_buf */ c = tmp_buf + sizeof( tmp_buf ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_extensions( &c, tmp_buf, ctx->extensions ) ); if( len ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( &c, tmp_buf, MBEDTLS_OID_PKCS9_CSR_EXT_REQ, MBEDTLS_OID_SIZE( MBEDTLS_OID_PKCS9_CSR_EXT_REQ ) ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC ) ); MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_pk_write_pubkey_der( ctx->key, tmp_buf, c - tmp_buf ) ); c -= pub_len; len += pub_len; /* * Subject ::= Name */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->subject ) ); /* * Version ::= INTEGER { v1(0), v2(1), v3(2) } */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, tmp_buf, 0 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); /* * Prepare signature */ mbedtls_md( mbedtls_md_info_from_type( ctx->md_alg ), c, len, hash ); if( ( ret = mbedtls_pk_sign( ctx->key, ctx->md_alg, hash, 0, sig, &sig_len, f_rng, p_rng ) ) != 0 ) { return( ret ); } if( mbedtls_pk_can_do( ctx->key, MBEDTLS_PK_RSA ) ) pk_alg = MBEDTLS_PK_RSA; else if( mbedtls_pk_can_do( ctx->key, MBEDTLS_PK_ECDSA ) ) pk_alg = MBEDTLS_PK_ECDSA; else return( MBEDTLS_ERR_X509_INVALID_ALG ); if( ( ret = mbedtls_oid_get_oid_by_sig_alg( pk_alg, ctx->md_alg, &sig_oid, &sig_oid_len ) ) != 0 ) { return( ret ); } /* * Write data to output buffer */ c2 = buf + size; MBEDTLS_ASN1_CHK_ADD( sig_and_oid_len, mbedtls_x509_write_sig( &c2, buf, sig_oid, sig_oid_len, sig, sig_len ) ); if( len > (size_t)( c2 - buf ) ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); c2 -= len; memcpy( c2, c, len ); len += sig_and_oid_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c2, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c2, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } #define PEM_BEGIN_CSR "-----BEGIN CERTIFICATE REQUEST-----\n" #define PEM_END_CSR "-----END CERTIFICATE REQUEST-----\n" #if defined(MBEDTLS_PEM_WRITE_C) int mbedtls_x509write_csr_pem( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char output_buf[4096]; size_t olen = 0; if( ( ret = mbedtls_x509write_csr_der( ctx, output_buf, sizeof(output_buf), f_rng, p_rng ) ) < 0 ) { return( ret ); } if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_CSR, PEM_END_CSR, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); } #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_X509_CSR_WRITE_C */ fldigi-4.2.05/src/mbedtls/timing.c0000664000175000017500000003441214611711171013643 00000000000000/* * Portable interface to the CPU cycle counter * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif #if defined(MBEDTLS_TIMING_C) #include "mbedtls/timing.h" #if !defined(MBEDTLS_TIMING_ALT) #if !defined(unix) && !defined(__unix__) && !defined(__unix) && \ !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ !defined(__HAIKU__) #error "This module only works on Unix and Windows, see MBEDTLS_TIMING_C in config.h" #endif #ifndef asm #define asm __asm #endif #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #include #include #include struct _hr_time { LARGE_INTEGER start; }; #else #include #include #include #include #include struct _hr_time { struct timeval start; }; #endif /* _WIN32 && !EFIX64 && !EFI32 */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ ( defined(_MSC_VER) && defined(_M_IX86) ) || defined(__WATCOMC__) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long tsc; __asm rdtsc __asm mov [tsc], eax return( tsc ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && ( _MSC_VER && _M_IX86 ) || __WATCOMC__ */ /* some versions of mingw-64 have 32-bit longs even on x84_64 */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && ( defined(__i386__) || ( \ ( defined(__amd64__) || defined( __x86_64__) ) && __SIZEOF_LONG__ == 4 ) ) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long lo, hi; asm volatile( "rdtsc" : "=a" (lo), "=d" (hi) ); return( lo ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __i386__ */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && ( defined(__amd64__) || defined(__x86_64__) ) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long lo, hi; asm volatile( "rdtsc" : "=a" (lo), "=d" (hi) ); return( lo | ( hi << 32 ) ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && ( __amd64__ || __x86_64__ ) */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && ( defined(__powerpc__) || defined(__ppc__) ) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long tbl, tbu0, tbu1; do { asm volatile( "mftbu %0" : "=r" (tbu0) ); asm volatile( "mftb %0" : "=r" (tbl ) ); asm volatile( "mftbu %0" : "=r" (tbu1) ); } while( tbu0 != tbu1 ); return( tbl ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && ( __powerpc__ || __ppc__ ) */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && defined(__sparc64__) #if defined(__OpenBSD__) #warning OpenBSD does not allow access to tick register using software version instead #else #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long tick; asm volatile( "rdpr %%tick, %0;" : "=&r" (tick) ); return( tick ); } #endif /* __OpenBSD__ */ #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __sparc64__ */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && defined(__sparc__) && !defined(__sparc64__) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long tick; asm volatile( ".byte 0x83, 0x41, 0x00, 0x00" ); asm volatile( "mov %%g1, %0" : "=r" (tick) ); return( tick ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __sparc__ && !__sparc64__ */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && defined(__alpha__) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long cc; asm volatile( "rpcc %0" : "=r" (cc) ); return( cc & 0xFFFFFFFF ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __alpha__ */ #if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) && \ defined(__GNUC__) && defined(__ia64__) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { unsigned long itc; asm volatile( "mov %0 = ar.itc" : "=r" (itc) ); return( itc ); } #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && __GNUC__ && __ia64__ */ #if !defined(HAVE_HARDCLOCK) && defined(_MSC_VER) && \ !defined(EFIX64) && !defined(EFI32) #define HAVE_HARDCLOCK unsigned long mbedtls_timing_hardclock( void ) { LARGE_INTEGER offset; QueryPerformanceCounter( &offset ); return( (unsigned long)( offset.QuadPart ) ); } #endif /* !HAVE_HARDCLOCK && _MSC_VER && !EFIX64 && !EFI32 */ #if !defined(HAVE_HARDCLOCK) #define HAVE_HARDCLOCK static int hardclock_init = 0; static struct timeval tv_init; unsigned long mbedtls_timing_hardclock( void ) { struct timeval tv_cur; if( hardclock_init == 0 ) { gettimeofday( &tv_init, NULL ); hardclock_init = 1; } gettimeofday( &tv_cur, NULL ); return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000 + ( tv_cur.tv_usec - tv_init.tv_usec ) ); } #endif /* !HAVE_HARDCLOCK */ volatile int mbedtls_timing_alarmed = 0; #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset ) { struct _hr_time *t = (struct _hr_time *) val; if( reset ) { QueryPerformanceCounter( &t->start ); return( 0 ); } else { unsigned long delta; LARGE_INTEGER now, hfreq; QueryPerformanceCounter( &now ); QueryPerformanceFrequency( &hfreq ); delta = (unsigned long)( ( now.QuadPart - t->start.QuadPart ) * 1000ul / hfreq.QuadPart ); return( delta ); } } /* It's OK to use a global because alarm() is supposed to be global anyway */ static DWORD alarmMs; static void TimerProc( void *TimerContext ) { (void) TimerContext; Sleep( alarmMs ); mbedtls_timing_alarmed = 1; /* _endthread will be called implicitly on return * That ensures execution of thread funcition's epilogue */ } void mbedtls_set_alarm( int seconds ) { if( seconds == 0 ) { /* No need to create a thread for this simple case. * Also, this shorcut is more reliable at least on MinGW32 */ mbedtls_timing_alarmed = 1; return; } mbedtls_timing_alarmed = 0; alarmMs = seconds * 1000; (void) _beginthread( TimerProc, 0, NULL ); } #else /* _WIN32 && !EFIX64 && !EFI32 */ unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset ) { struct _hr_time *t = (struct _hr_time *) val; if( reset ) { gettimeofday( &t->start, NULL ); return( 0 ); } else { unsigned long delta; struct timeval now; gettimeofday( &now, NULL ); delta = ( now.tv_sec - t->start.tv_sec ) * 1000ul + ( now.tv_usec - t->start.tv_usec ) / 1000; return( delta ); } } static void sighandler( int signum ) { mbedtls_timing_alarmed = 1; signal( signum, sighandler ); } void mbedtls_set_alarm( int seconds ) { mbedtls_timing_alarmed = 0; signal( SIGALRM, sighandler ); alarm( seconds ); if( seconds == 0 ) { /* alarm(0) cancelled any previous pending alarm, but the handler won't fire, so raise the flag straight away. */ mbedtls_timing_alarmed = 1; } } #endif /* _WIN32 && !EFIX64 && !EFI32 */ /* * Set delays to watch */ void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms ) { mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data; ctx->int_ms = int_ms; ctx->fin_ms = fin_ms; if( fin_ms != 0 ) (void) mbedtls_timing_get_timer( &ctx->timer, 1 ); } /* * Get number of delays expired */ int mbedtls_timing_get_delay( void *data ) { mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data; unsigned long elapsed_ms; if( ctx->fin_ms == 0 ) return( -1 ); elapsed_ms = mbedtls_timing_get_timer( &ctx->timer, 0 ); if( elapsed_ms >= ctx->fin_ms ) return( 2 ); if( elapsed_ms >= ctx->int_ms ) return( 1 ); return( 0 ); } #endif /* !MBEDTLS_TIMING_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * Busy-waits for the given number of milliseconds. * Used for testing mbedtls_timing_hardclock. */ static void busy_msleep( unsigned long msec ) { struct mbedtls_timing_hr_time hires; unsigned long i = 0; /* for busy-waiting */ volatile unsigned long j; /* to prevent optimisation */ (void) mbedtls_timing_get_timer( &hires, 1 ); while( mbedtls_timing_get_timer( &hires, 0 ) < msec ) i++; j = i; (void) j; } #define FAIL do \ { \ if( verbose != 0 ) \ { \ mbedtls_printf( "failed at line %d\n", __LINE__ ); \ mbedtls_printf( " cycles=%lu ratio=%lu millisecs=%lu secs=%lu hardfail=%d a=%lu b=%lu\n", \ cycles, ratio, millisecs, secs, hardfail, \ (unsigned long) a, (unsigned long) b ); \ mbedtls_printf( " elapsed(hires)=%lu elapsed(ctx)=%lu status(ctx)=%d\n", \ mbedtls_timing_get_timer( &hires, 0 ), \ mbedtls_timing_get_timer( &ctx.timer, 0 ), \ mbedtls_timing_get_delay( &ctx ) ); \ } \ return( 1 ); \ } while( 0 ) /* * Checkup routine * * Warning: this is work in progress, some tests may not be reliable enough * yet! False positives may happen. */ int mbedtls_timing_self_test( int verbose ) { unsigned long cycles = 0, ratio = 0; unsigned long millisecs = 0, secs = 0; int hardfail = 0; struct mbedtls_timing_hr_time hires; uint32_t a = 0, b = 0; mbedtls_timing_delay_context ctx; if( verbose != 0 ) mbedtls_printf( " TIMING tests note: will take some time!\n" ); if( verbose != 0 ) mbedtls_printf( " TIMING test #1 (set_alarm / get_timer): " ); { secs = 1; (void) mbedtls_timing_get_timer( &hires, 1 ); mbedtls_set_alarm( (int) secs ); while( !mbedtls_timing_alarmed ) ; millisecs = mbedtls_timing_get_timer( &hires, 0 ); /* For some reason on Windows it looks like alarm has an extra delay * (maybe related to creating a new thread). Allow some room here. */ if( millisecs < 800 * secs || millisecs > 1200 * secs + 300 ) FAIL; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " TIMING test #2 (set/get_delay ): " ); { a = 800; b = 400; mbedtls_timing_set_delay( &ctx, a, a + b ); /* T = 0 */ busy_msleep( a - a / 4 ); /* T = a - a/4 */ if( mbedtls_timing_get_delay( &ctx ) != 0 ) FAIL; busy_msleep( a / 4 + b / 4 ); /* T = a + b/4 */ if( mbedtls_timing_get_delay( &ctx ) != 1 ) FAIL; busy_msleep( b ); /* T = a + b + b/4 */ if( mbedtls_timing_get_delay( &ctx ) != 2 ) FAIL; } mbedtls_timing_set_delay( &ctx, 0, 0 ); busy_msleep( 200 ); if( mbedtls_timing_get_delay( &ctx ) != -1 ) FAIL; if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " TIMING test #3 (hardclock / get_timer): " ); /* * Allow one failure for possible counter wrapping. * On a 4Ghz 32-bit machine the cycle counter wraps about once per second; * since the whole test is about 10ms, it shouldn't happen twice in a row. */ hard_test: if( hardfail > 1 ) { if( verbose != 0 ) mbedtls_printf( "failed (ignored)\n" ); goto hard_test_done; } /* Get a reference ratio cycles/ms */ millisecs = 1; cycles = mbedtls_timing_hardclock(); busy_msleep( millisecs ); cycles = mbedtls_timing_hardclock() - cycles; ratio = cycles / millisecs; /* Check that the ratio is mostly constant */ for( millisecs = 2; millisecs <= 4; millisecs++ ) { cycles = mbedtls_timing_hardclock(); busy_msleep( millisecs ); cycles = mbedtls_timing_hardclock() - cycles; /* Allow variation up to 20% */ if( cycles / millisecs < ratio - ratio / 5 || cycles / millisecs > ratio + ratio / 5 ) { hardfail++; goto hard_test; } } if( verbose != 0 ) mbedtls_printf( "passed\n" ); hard_test_done: if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_TIMING_C */ fldigi-4.2.05/src/mbedtls/chachapoly.c0000664000175000017500000004254414611711171014474 00000000000000/** * \file chachapoly.c * * \brief ChaCha20-Poly1305 AEAD construction based on RFC 7539. * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CHACHAPOLY_C) #include "mbedtls/chachapoly.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_CHACHAPOLY_ALT) /* Parameter validation macros */ #define CHACHAPOLY_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA ) #define CHACHAPOLY_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define CHACHAPOLY_STATE_INIT ( 0 ) #define CHACHAPOLY_STATE_AAD ( 1 ) #define CHACHAPOLY_STATE_CIPHERTEXT ( 2 ) /* Encrypting or decrypting */ #define CHACHAPOLY_STATE_FINISHED ( 3 ) /** * \brief Adds nul bytes to pad the AAD for Poly1305. * * \param ctx The ChaCha20-Poly1305 context. */ static int chachapoly_pad_aad( mbedtls_chachapoly_context *ctx ) { uint32_t partial_block_len = (uint32_t) ( ctx->aad_len % 16U ); unsigned char zeroes[15]; if( partial_block_len == 0U ) return( 0 ); memset( zeroes, 0, sizeof( zeroes ) ); return( mbedtls_poly1305_update( &ctx->poly1305_ctx, zeroes, 16U - partial_block_len ) ); } /** * \brief Adds nul bytes to pad the ciphertext for Poly1305. * * \param ctx The ChaCha20-Poly1305 context. */ static int chachapoly_pad_ciphertext( mbedtls_chachapoly_context *ctx ) { uint32_t partial_block_len = (uint32_t) ( ctx->ciphertext_len % 16U ); unsigned char zeroes[15]; if( partial_block_len == 0U ) return( 0 ); memset( zeroes, 0, sizeof( zeroes ) ); return( mbedtls_poly1305_update( &ctx->poly1305_ctx, zeroes, 16U - partial_block_len ) ); } void mbedtls_chachapoly_init( mbedtls_chachapoly_context *ctx ) { CHACHAPOLY_VALIDATE( ctx != NULL ); mbedtls_chacha20_init( &ctx->chacha20_ctx ); mbedtls_poly1305_init( &ctx->poly1305_ctx ); ctx->aad_len = 0U; ctx->ciphertext_len = 0U; ctx->state = CHACHAPOLY_STATE_INIT; ctx->mode = MBEDTLS_CHACHAPOLY_ENCRYPT; } void mbedtls_chachapoly_free( mbedtls_chachapoly_context *ctx ) { if( ctx == NULL ) return; mbedtls_chacha20_free( &ctx->chacha20_ctx ); mbedtls_poly1305_free( &ctx->poly1305_ctx ); ctx->aad_len = 0U; ctx->ciphertext_len = 0U; ctx->state = CHACHAPOLY_STATE_INIT; ctx->mode = MBEDTLS_CHACHAPOLY_ENCRYPT; } int mbedtls_chachapoly_setkey( mbedtls_chachapoly_context *ctx, const unsigned char key[32] ) { int ret; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( key != NULL ); ret = mbedtls_chacha20_setkey( &ctx->chacha20_ctx, key ); return( ret ); } int mbedtls_chachapoly_starts( mbedtls_chachapoly_context *ctx, const unsigned char nonce[12], mbedtls_chachapoly_mode_t mode ) { int ret; unsigned char poly1305_key[64]; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( nonce != NULL ); /* Set counter = 0, will be update to 1 when generating Poly1305 key */ ret = mbedtls_chacha20_starts( &ctx->chacha20_ctx, nonce, 0U ); if( ret != 0 ) goto cleanup; /* Generate the Poly1305 key by getting the ChaCha20 keystream output with * counter = 0. This is the same as encrypting a buffer of zeroes. * Only the first 256-bits (32 bytes) of the key is used for Poly1305. * The other 256 bits are discarded. */ memset( poly1305_key, 0, sizeof( poly1305_key ) ); ret = mbedtls_chacha20_update( &ctx->chacha20_ctx, sizeof( poly1305_key ), poly1305_key, poly1305_key ); if( ret != 0 ) goto cleanup; ret = mbedtls_poly1305_starts( &ctx->poly1305_ctx, poly1305_key ); if( ret == 0 ) { ctx->aad_len = 0U; ctx->ciphertext_len = 0U; ctx->state = CHACHAPOLY_STATE_AAD; ctx->mode = mode; } cleanup: mbedtls_platform_zeroize( poly1305_key, 64U ); return( ret ); } int mbedtls_chachapoly_update_aad( mbedtls_chachapoly_context *ctx, const unsigned char *aad, size_t aad_len ) { CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( aad_len == 0 || aad != NULL ); if( ctx->state != CHACHAPOLY_STATE_AAD ) return( MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); ctx->aad_len += aad_len; return( mbedtls_poly1305_update( &ctx->poly1305_ctx, aad, aad_len ) ); } int mbedtls_chachapoly_update( mbedtls_chachapoly_context *ctx, size_t len, const unsigned char *input, unsigned char *output ) { int ret; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( len == 0 || input != NULL ); CHACHAPOLY_VALIDATE_RET( len == 0 || output != NULL ); if( ( ctx->state != CHACHAPOLY_STATE_AAD ) && ( ctx->state != CHACHAPOLY_STATE_CIPHERTEXT ) ) { return( MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); } if( ctx->state == CHACHAPOLY_STATE_AAD ) { ctx->state = CHACHAPOLY_STATE_CIPHERTEXT; ret = chachapoly_pad_aad( ctx ); if( ret != 0 ) return( ret ); } ctx->ciphertext_len += len; if( ctx->mode == MBEDTLS_CHACHAPOLY_ENCRYPT ) { ret = mbedtls_chacha20_update( &ctx->chacha20_ctx, len, input, output ); if( ret != 0 ) return( ret ); ret = mbedtls_poly1305_update( &ctx->poly1305_ctx, output, len ); if( ret != 0 ) return( ret ); } else /* DECRYPT */ { ret = mbedtls_poly1305_update( &ctx->poly1305_ctx, input, len ); if( ret != 0 ) return( ret ); ret = mbedtls_chacha20_update( &ctx->chacha20_ctx, len, input, output ); if( ret != 0 ) return( ret ); } return( 0 ); } int mbedtls_chachapoly_finish( mbedtls_chachapoly_context *ctx, unsigned char mac[16] ) { int ret; unsigned char len_block[16]; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( mac != NULL ); if( ctx->state == CHACHAPOLY_STATE_INIT ) { return( MBEDTLS_ERR_CHACHAPOLY_BAD_STATE ); } if( ctx->state == CHACHAPOLY_STATE_AAD ) { ret = chachapoly_pad_aad( ctx ); if( ret != 0 ) return( ret ); } else if( ctx->state == CHACHAPOLY_STATE_CIPHERTEXT ) { ret = chachapoly_pad_ciphertext( ctx ); if( ret != 0 ) return( ret ); } ctx->state = CHACHAPOLY_STATE_FINISHED; /* The lengths of the AAD and ciphertext are processed by * Poly1305 as the final 128-bit block, encoded as little-endian integers. */ len_block[ 0] = (unsigned char)( ctx->aad_len ); len_block[ 1] = (unsigned char)( ctx->aad_len >> 8 ); len_block[ 2] = (unsigned char)( ctx->aad_len >> 16 ); len_block[ 3] = (unsigned char)( ctx->aad_len >> 24 ); len_block[ 4] = (unsigned char)( ctx->aad_len >> 32 ); len_block[ 5] = (unsigned char)( ctx->aad_len >> 40 ); len_block[ 6] = (unsigned char)( ctx->aad_len >> 48 ); len_block[ 7] = (unsigned char)( ctx->aad_len >> 56 ); len_block[ 8] = (unsigned char)( ctx->ciphertext_len ); len_block[ 9] = (unsigned char)( ctx->ciphertext_len >> 8 ); len_block[10] = (unsigned char)( ctx->ciphertext_len >> 16 ); len_block[11] = (unsigned char)( ctx->ciphertext_len >> 24 ); len_block[12] = (unsigned char)( ctx->ciphertext_len >> 32 ); len_block[13] = (unsigned char)( ctx->ciphertext_len >> 40 ); len_block[14] = (unsigned char)( ctx->ciphertext_len >> 48 ); len_block[15] = (unsigned char)( ctx->ciphertext_len >> 56 ); ret = mbedtls_poly1305_update( &ctx->poly1305_ctx, len_block, 16U ); if( ret != 0 ) return( ret ); ret = mbedtls_poly1305_finish( &ctx->poly1305_ctx, mac ); return( ret ); } static int chachapoly_crypt_and_tag( mbedtls_chachapoly_context *ctx, mbedtls_chachapoly_mode_t mode, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char *input, unsigned char *output, unsigned char tag[16] ) { int ret; ret = mbedtls_chachapoly_starts( ctx, nonce, mode ); if( ret != 0 ) goto cleanup; ret = mbedtls_chachapoly_update_aad( ctx, aad, aad_len ); if( ret != 0 ) goto cleanup; ret = mbedtls_chachapoly_update( ctx, length, input, output ); if( ret != 0 ) goto cleanup; ret = mbedtls_chachapoly_finish( ctx, tag ); cleanup: return( ret ); } int mbedtls_chachapoly_encrypt_and_tag( mbedtls_chachapoly_context *ctx, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char *input, unsigned char *output, unsigned char tag[16] ) { CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( nonce != NULL ); CHACHAPOLY_VALIDATE_RET( tag != NULL ); CHACHAPOLY_VALIDATE_RET( aad_len == 0 || aad != NULL ); CHACHAPOLY_VALIDATE_RET( length == 0 || input != NULL ); CHACHAPOLY_VALIDATE_RET( length == 0 || output != NULL ); return( chachapoly_crypt_and_tag( ctx, MBEDTLS_CHACHAPOLY_ENCRYPT, length, nonce, aad, aad_len, input, output, tag ) ); } int mbedtls_chachapoly_auth_decrypt( mbedtls_chachapoly_context *ctx, size_t length, const unsigned char nonce[12], const unsigned char *aad, size_t aad_len, const unsigned char tag[16], const unsigned char *input, unsigned char *output ) { int ret; unsigned char check_tag[16]; size_t i; int diff; CHACHAPOLY_VALIDATE_RET( ctx != NULL ); CHACHAPOLY_VALIDATE_RET( nonce != NULL ); CHACHAPOLY_VALIDATE_RET( tag != NULL ); CHACHAPOLY_VALIDATE_RET( aad_len == 0 || aad != NULL ); CHACHAPOLY_VALIDATE_RET( length == 0 || input != NULL ); CHACHAPOLY_VALIDATE_RET( length == 0 || output != NULL ); if( ( ret = chachapoly_crypt_and_tag( ctx, MBEDTLS_CHACHAPOLY_DECRYPT, length, nonce, aad, aad_len, input, output, check_tag ) ) != 0 ) { return( ret ); } /* Check tag in "constant-time" */ for( diff = 0, i = 0; i < sizeof( check_tag ); i++ ) diff |= tag[i] ^ check_tag[i]; if( diff != 0 ) { mbedtls_platform_zeroize( output, length ); return( MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED ); } return( 0 ); } #endif /* MBEDTLS_CHACHAPOLY_ALT */ #if defined(MBEDTLS_SELF_TEST) static const unsigned char test_key[1][32] = { { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f } }; static const unsigned char test_nonce[1][12] = { { 0x07, 0x00, 0x00, 0x00, /* 32-bit common part */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47 /* 64-bit IV */ } }; static const unsigned char test_aad[1][12] = { { 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7 } }; static const size_t test_aad_len[1] = { 12U }; static const unsigned char test_input[1][114] = { { 0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x65, 0x6e, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x27, 0x39, 0x39, 0x3a, 0x20, 0x49, 0x66, 0x20, 0x49, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x69, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x6e, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69, 0x74, 0x2e } }; static const unsigned char test_output[1][114] = { { 0xd3, 0x1a, 0x8d, 0x34, 0x64, 0x8e, 0x60, 0xdb, 0x7b, 0x86, 0xaf, 0xbc, 0x53, 0xef, 0x7e, 0xc2, 0xa4, 0xad, 0xed, 0x51, 0x29, 0x6e, 0x08, 0xfe, 0xa9, 0xe2, 0xb5, 0xa7, 0x36, 0xee, 0x62, 0xd6, 0x3d, 0xbe, 0xa4, 0x5e, 0x8c, 0xa9, 0x67, 0x12, 0x82, 0xfa, 0xfb, 0x69, 0xda, 0x92, 0x72, 0x8b, 0x1a, 0x71, 0xde, 0x0a, 0x9e, 0x06, 0x0b, 0x29, 0x05, 0xd6, 0xa5, 0xb6, 0x7e, 0xcd, 0x3b, 0x36, 0x92, 0xdd, 0xbd, 0x7f, 0x2d, 0x77, 0x8b, 0x8c, 0x98, 0x03, 0xae, 0xe3, 0x28, 0x09, 0x1b, 0x58, 0xfa, 0xb3, 0x24, 0xe4, 0xfa, 0xd6, 0x75, 0x94, 0x55, 0x85, 0x80, 0x8b, 0x48, 0x31, 0xd7, 0xbc, 0x3f, 0xf4, 0xde, 0xf0, 0x8e, 0x4b, 0x7a, 0x9d, 0xe5, 0x76, 0xd2, 0x65, 0x86, 0xce, 0xc6, 0x4b, 0x61, 0x16 } }; static const size_t test_input_len[1] = { 114U }; static const unsigned char test_mac[1][16] = { { 0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09, 0xe2, 0x6a, 0x7e, 0x90, 0x2e, 0xcb, 0xd0, 0x60, 0x06, 0x91 } }; #define ASSERT( cond, args ) \ do \ { \ if( ! ( cond ) ) \ { \ if( verbose != 0 ) \ mbedtls_printf args; \ \ return( -1 ); \ } \ } \ while( 0 ) int mbedtls_chachapoly_self_test( int verbose ) { mbedtls_chachapoly_context ctx; unsigned i; int ret; unsigned char output[200]; unsigned char mac[16]; for( i = 0U; i < 1U; i++ ) { if( verbose != 0 ) mbedtls_printf( " ChaCha20-Poly1305 test %u ", i ); mbedtls_chachapoly_init( &ctx ); ret = mbedtls_chachapoly_setkey( &ctx, test_key[i] ); ASSERT( 0 == ret, ( "setkey() error code: %i\n", ret ) ); ret = mbedtls_chachapoly_encrypt_and_tag( &ctx, test_input_len[i], test_nonce[i], test_aad[i], test_aad_len[i], test_input[i], output, mac ); ASSERT( 0 == ret, ( "crypt_and_tag() error code: %i\n", ret ) ); ASSERT( 0 == memcmp( output, test_output[i], test_input_len[i] ), ( "failure (wrong output)\n" ) ); ASSERT( 0 == memcmp( mac, test_mac[i], 16U ), ( "failure (wrong MAC)\n" ) ); mbedtls_chachapoly_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_CHACHAPOLY_C */ fldigi-4.2.05/src/mbedtls/md.c0000664000175000017500000003152214611711171012753 00000000000000/** * \file mbedtls_md.c * * \brief Generic message digest wrapper for mbed TLS * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_MD_C) #include "mbedtls/md.h" #include "mbedtls/md_internal.h" #include "mbedtls/platform_util.h" #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include #if defined(MBEDTLS_FS_IO) #include #endif /* * Reminder: update profiles in x509_crt.c when adding a new hash! */ static const int supported_digests[] = { #if defined(MBEDTLS_SHA512_C) MBEDTLS_MD_SHA512, MBEDTLS_MD_SHA384, #endif #if defined(MBEDTLS_SHA256_C) MBEDTLS_MD_SHA256, MBEDTLS_MD_SHA224, #endif #if defined(MBEDTLS_SHA1_C) MBEDTLS_MD_SHA1, #endif #if defined(MBEDTLS_RIPEMD160_C) MBEDTLS_MD_RIPEMD160, #endif #if defined(MBEDTLS_MD5_C) MBEDTLS_MD_MD5, #endif #if defined(MBEDTLS_MD4_C) MBEDTLS_MD_MD4, #endif #if defined(MBEDTLS_MD2_C) MBEDTLS_MD_MD2, #endif MBEDTLS_MD_NONE }; const int *mbedtls_md_list( void ) { return( supported_digests ); } const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ) { if( NULL == md_name ) return( NULL ); /* Get the appropriate digest information */ #if defined(MBEDTLS_MD2_C) if( !strcmp( "MD2", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 ); #endif #if defined(MBEDTLS_MD4_C) if( !strcmp( "MD4", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 ); #endif #if defined(MBEDTLS_MD5_C) if( !strcmp( "MD5", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ); #endif #if defined(MBEDTLS_RIPEMD160_C) if( !strcmp( "RIPEMD160", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 ); #endif #if defined(MBEDTLS_SHA1_C) if( !strcmp( "SHA1", md_name ) || !strcmp( "SHA", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ); #endif #if defined(MBEDTLS_SHA256_C) if( !strcmp( "SHA224", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 ); if( !strcmp( "SHA256", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ); #endif #if defined(MBEDTLS_SHA512_C) if( !strcmp( "SHA384", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 ); if( !strcmp( "SHA512", md_name ) ) return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 ); #endif return( NULL ); } const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ) { switch( md_type ) { #if defined(MBEDTLS_MD2_C) case MBEDTLS_MD_MD2: return( &mbedtls_md2_info ); #endif #if defined(MBEDTLS_MD4_C) case MBEDTLS_MD_MD4: return( &mbedtls_md4_info ); #endif #if defined(MBEDTLS_MD5_C) case MBEDTLS_MD_MD5: return( &mbedtls_md5_info ); #endif #if defined(MBEDTLS_RIPEMD160_C) case MBEDTLS_MD_RIPEMD160: return( &mbedtls_ripemd160_info ); #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_MD_SHA1: return( &mbedtls_sha1_info ); #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA224: return( &mbedtls_sha224_info ); case MBEDTLS_MD_SHA256: return( &mbedtls_sha256_info ); #endif #if defined(MBEDTLS_SHA512_C) case MBEDTLS_MD_SHA384: return( &mbedtls_sha384_info ); case MBEDTLS_MD_SHA512: return( &mbedtls_sha512_info ); #endif default: return( NULL ); } } void mbedtls_md_init( mbedtls_md_context_t *ctx ) { memset( ctx, 0, sizeof( mbedtls_md_context_t ) ); } void mbedtls_md_free( mbedtls_md_context_t *ctx ) { if( ctx == NULL || ctx->md_info == NULL ) return; if( ctx->md_ctx != NULL ) ctx->md_info->ctx_free_func( ctx->md_ctx ); if( ctx->hmac_ctx != NULL ) { mbedtls_platform_zeroize( ctx->hmac_ctx, 2 * ctx->md_info->block_size ); mbedtls_free( ctx->hmac_ctx ); } mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md_context_t ) ); } int mbedtls_md_clone( mbedtls_md_context_t *dst, const mbedtls_md_context_t *src ) { if( dst == NULL || dst->md_info == NULL || src == NULL || src->md_info == NULL || dst->md_info != src->md_info ) { return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); } dst->md_info->clone_func( dst->md_ctx, src->md_ctx ); return( 0 ); } #if ! defined(MBEDTLS_DEPRECATED_REMOVED) int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) { return mbedtls_md_setup( ctx, md_info, 1 ); } #endif int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ) { if( md_info == NULL || ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL ) return( MBEDTLS_ERR_MD_ALLOC_FAILED ); if( hmac != 0 ) { ctx->hmac_ctx = mbedtls_calloc( 2, md_info->block_size ); if( ctx->hmac_ctx == NULL ) { md_info->ctx_free_func( ctx->md_ctx ); return( MBEDTLS_ERR_MD_ALLOC_FAILED ); } } ctx->md_info = md_info; return( 0 ); } int mbedtls_md_starts( mbedtls_md_context_t *ctx ) { if( ctx == NULL || ctx->md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->starts_func( ctx->md_ctx ) ); } int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ) { if( ctx == NULL || ctx->md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) ); } int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ) { if( ctx == NULL || ctx->md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->finish_func( ctx->md_ctx, output ) ); } int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, unsigned char *output ) { if( md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( md_info->digest_func( input, ilen, output ) ); } #if defined(MBEDTLS_FS_IO) int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigned char *output ) { int ret; FILE *f; size_t n; mbedtls_md_context_t ctx; unsigned char buf[1024]; if( md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_MD_FILE_IO_ERROR ); mbedtls_md_init( &ctx ); if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 ) goto cleanup; if( ( ret = md_info->starts_func( ctx.md_ctx ) ) != 0 ) goto cleanup; while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) if( ( ret = md_info->update_func( ctx.md_ctx, buf, n ) ) != 0 ) goto cleanup; if( ferror( f ) != 0 ) ret = MBEDTLS_ERR_MD_FILE_IO_ERROR; else ret = md_info->finish_func( ctx.md_ctx, output ); cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); fclose( f ); mbedtls_md_free( &ctx ); return( ret ); } #endif /* MBEDTLS_FS_IO */ int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen ) { int ret; unsigned char sum[MBEDTLS_MD_MAX_SIZE]; unsigned char *ipad, *opad; size_t i; if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); if( keylen > (size_t) ctx->md_info->block_size ) { if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 ) goto cleanup; if( ( ret = ctx->md_info->update_func( ctx->md_ctx, key, keylen ) ) != 0 ) goto cleanup; if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, sum ) ) != 0 ) goto cleanup; keylen = ctx->md_info->size; key = sum; } ipad = (unsigned char *) ctx->hmac_ctx; opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; memset( ipad, 0x36, ctx->md_info->block_size ); memset( opad, 0x5C, ctx->md_info->block_size ); for( i = 0; i < keylen; i++ ) { ipad[i] = (unsigned char)( ipad[i] ^ key[i] ); opad[i] = (unsigned char)( opad[i] ^ key[i] ); } if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 ) goto cleanup; if( ( ret = ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size ) ) != 0 ) goto cleanup; cleanup: mbedtls_platform_zeroize( sum, sizeof( sum ) ); return( ret ); } int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ) { if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->update_func( ctx->md_ctx, input, ilen ) ); } int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output ) { int ret; unsigned char tmp[MBEDTLS_MD_MAX_SIZE]; unsigned char *opad; if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size; if( ( ret = ctx->md_info->finish_func( ctx->md_ctx, tmp ) ) != 0 ) return( ret ); if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 ) return( ret ); if( ( ret = ctx->md_info->update_func( ctx->md_ctx, opad, ctx->md_info->block_size ) ) != 0 ) return( ret ); if( ( ret = ctx->md_info->update_func( ctx->md_ctx, tmp, ctx->md_info->size ) ) != 0 ) return( ret ); return( ctx->md_info->finish_func( ctx->md_ctx, output ) ); } int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ) { int ret; unsigned char *ipad; if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); ipad = (unsigned char *) ctx->hmac_ctx; if( ( ret = ctx->md_info->starts_func( ctx->md_ctx ) ) != 0 ) return( ret ); return( ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size ) ); } int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char *output ) { mbedtls_md_context_t ctx; int ret; if( md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); mbedtls_md_init( &ctx ); if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_md_hmac_starts( &ctx, key, keylen ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_md_hmac_update( &ctx, input, ilen ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_md_hmac_finish( &ctx, output ) ) != 0 ) goto cleanup; cleanup: mbedtls_md_free( &ctx ); return( ret ); } int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ) { if( ctx == NULL || ctx->md_info == NULL ) return( MBEDTLS_ERR_MD_BAD_INPUT_DATA ); return( ctx->md_info->process_func( ctx->md_ctx, data ) ); } unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ) { if( md_info == NULL ) return( 0 ); return md_info->size; } mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ) { if( md_info == NULL ) return( MBEDTLS_MD_NONE ); return md_info->type; } const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ) { if( md_info == NULL ) return( NULL ); return md_info->name; } #endif /* MBEDTLS_MD_C */ fldigi-4.2.05/src/mbedtls/base64.c0000664000175000017500000001727614611711171013451 00000000000000/* * RFC 1521 base64 encoding/decoding * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_BASE64_C) #include "mbedtls/base64.h" #include #if defined(MBEDTLS_SELF_TEST) #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ static const unsigned char base64_enc_map[64] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; static const unsigned char base64_dec_map[128] = { 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 62, 127, 127, 127, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 127, 127, 127, 64, 127, 127, 127, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 127, 127, 127, 127, 127, 127, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 127, 127, 127, 127, 127 }; #define BASE64_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */ /* * Encode a buffer into base64 format */ int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ) { size_t i, n; int C1, C2, C3; unsigned char *p; if( slen == 0 ) { *olen = 0; return( 0 ); } n = slen / 3 + ( slen % 3 != 0 ); if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 ) { *olen = BASE64_SIZE_T_MAX; return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); } n *= 4; if( ( dlen < n + 1 ) || ( NULL == dst ) ) { *olen = n + 1; return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); } n = ( slen / 3 ) * 3; for( i = 0, p = dst; i < n; i += 3 ) { C1 = *src++; C2 = *src++; C3 = *src++; *p++ = base64_enc_map[(C1 >> 2) & 0x3F]; *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F]; *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F]; *p++ = base64_enc_map[C3 & 0x3F]; } if( i < slen ) { C1 = *src++; C2 = ( ( i + 1 ) < slen ) ? *src++ : 0; *p++ = base64_enc_map[(C1 >> 2) & 0x3F]; *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F]; if( ( i + 1 ) < slen ) *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F]; else *p++ = '='; *p++ = '='; } *olen = p - dst; *p = 0; return( 0 ); } /* * Decode a base64-formatted buffer */ int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, const unsigned char *src, size_t slen ) { size_t i, n; uint32_t j, x; unsigned char *p; /* First pass: check for validity and get output length */ for( i = n = j = 0; i < slen; i++ ) { /* Skip spaces before checking for EOL */ x = 0; while( i < slen && src[i] == ' ' ) { ++i; ++x; } /* Spaces at end of buffer are OK */ if( i == slen ) break; if( ( slen - i ) >= 2 && src[i] == '\r' && src[i + 1] == '\n' ) continue; if( src[i] == '\n' ) continue; /* Space inside a line is an error */ if( x != 0 ) return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); if( src[i] == '=' && ++j > 2 ) return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); if( src[i] > 127 || base64_dec_map[src[i]] == 127 ) return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); if( base64_dec_map[src[i]] < 64 && j != 0 ) return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER ); n++; } if( n == 0 ) { *olen = 0; return( 0 ); } /* The following expression is to calculate the following formula without * risk of integer overflow in n: * n = ( ( n * 6 ) + 7 ) >> 3; */ n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 ); n -= j; if( dst == NULL || dlen < n ) { *olen = n; return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); } for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ ) { if( *src == '\r' || *src == '\n' || *src == ' ' ) continue; j -= ( base64_dec_map[*src] == 64 ); x = ( x << 6 ) | ( base64_dec_map[*src] & 0x3F ); if( ++n == 4 ) { n = 0; if( j > 0 ) *p++ = (unsigned char)( x >> 16 ); if( j > 1 ) *p++ = (unsigned char)( x >> 8 ); if( j > 2 ) *p++ = (unsigned char)( x ); } } *olen = p - dst; return( 0 ); } #if defined(MBEDTLS_SELF_TEST) static const unsigned char base64_test_dec[64] = { 0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD, 0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01, 0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09, 0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13, 0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31, 0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38, 0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B, 0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97 }; static const unsigned char base64_test_enc[] = "JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK" "swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw=="; /* * Checkup routine */ int mbedtls_base64_self_test( int verbose ) { size_t len; const unsigned char *src; unsigned char buffer[128]; if( verbose != 0 ) mbedtls_printf( " Base64 encoding test: " ); src = base64_test_dec; if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 || memcmp( base64_test_enc, buffer, 88 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } if( verbose != 0 ) mbedtls_printf( "passed\n Base64 decoding test: " ); src = base64_test_enc; if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 || memcmp( base64_test_dec, buffer, 64 ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } if( verbose != 0 ) mbedtls_printf( "passed\n\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_BASE64_C */ fldigi-4.2.05/src/mbedtls/oid.c0000664000175000017500000006433714611711171013140 00000000000000/** * \file oid.c * * \brief Object Identifier (OID) database * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_OID_C) #include "mbedtls/oid.h" #include "mbedtls/rsa.h" #include #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #define mbedtls_snprintf snprintf #endif #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) #include "mbedtls/x509.h" #endif /* * Macro to automatically add the size of #define'd OIDs */ #define ADD_LEN(s) s, MBEDTLS_OID_SIZE(s) /* * Macro to generate an internal function for oid_XXX_from_asn1() (used by * the other functions) */ #define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST ) \ static const TYPE_T * oid_ ## NAME ## _from_asn1( const mbedtls_asn1_buf *oid ) \ { \ const TYPE_T *p = LIST; \ const mbedtls_oid_descriptor_t *cur = (const mbedtls_oid_descriptor_t *) p; \ if( p == NULL || oid == NULL ) return( NULL ); \ while( cur->asn1 != NULL ) { \ if( cur->asn1_len == oid->len && \ memcmp( cur->asn1, oid->p, oid->len ) == 0 ) { \ return( p ); \ } \ p++; \ cur = (const mbedtls_oid_descriptor_t *) p; \ } \ return( NULL ); \ } /* * Macro to generate a function for retrieving a single attribute from the * descriptor of an mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \ int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \ { \ const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \ if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \ *ATTR1 = data->descriptor.ATTR1; \ return( 0 ); \ } /* * Macro to generate a function for retrieving a single attribute from an * mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \ int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \ { \ const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \ if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \ *ATTR1 = data->ATTR1; \ return( 0 ); \ } /* * Macro to generate a function for retrieving two attributes from an * mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \ ATTR2_TYPE, ATTR2) \ int FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 ) \ { \ const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \ if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND ); \ *ATTR1 = data->ATTR1; \ *ATTR2 = data->ATTR2; \ return( 0 ); \ } /* * Macro to generate a function for retrieving the OID based on a single * attribute from a mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \ int FN_NAME( ATTR1_TYPE ATTR1, const char **oid, size_t *olen ) \ { \ const TYPE_T *cur = LIST; \ while( cur->descriptor.asn1 != NULL ) { \ if( cur->ATTR1 == ATTR1 ) { \ *oid = cur->descriptor.asn1; \ *olen = cur->descriptor.asn1_len; \ return( 0 ); \ } \ cur++; \ } \ return( MBEDTLS_ERR_OID_NOT_FOUND ); \ } /* * Macro to generate a function for retrieving the OID based on two * attributes from a mbedtls_oid_descriptor_t wrapper. */ #define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \ ATTR2_TYPE, ATTR2) \ int FN_NAME( ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid , \ size_t *olen ) \ { \ const TYPE_T *cur = LIST; \ while( cur->descriptor.asn1 != NULL ) { \ if( cur->ATTR1 == ATTR1 && cur->ATTR2 == ATTR2 ) { \ *oid = cur->descriptor.asn1; \ *olen = cur->descriptor.asn1_len; \ return( 0 ); \ } \ cur++; \ } \ return( MBEDTLS_ERR_OID_NOT_FOUND ); \ } #if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) /* * For X520 attribute types */ typedef struct { mbedtls_oid_descriptor_t descriptor; const char *short_name; } oid_x520_attr_t; static const oid_x520_attr_t oid_x520_attr_type[] = { { { ADD_LEN( MBEDTLS_OID_AT_CN ), "id-at-commonName", "Common Name" }, "CN", }, { { ADD_LEN( MBEDTLS_OID_AT_COUNTRY ), "id-at-countryName", "Country" }, "C", }, { { ADD_LEN( MBEDTLS_OID_AT_LOCALITY ), "id-at-locality", "Locality" }, "L", }, { { ADD_LEN( MBEDTLS_OID_AT_STATE ), "id-at-state", "State" }, "ST", }, { { ADD_LEN( MBEDTLS_OID_AT_ORGANIZATION ),"id-at-organizationName", "Organization" }, "O", }, { { ADD_LEN( MBEDTLS_OID_AT_ORG_UNIT ), "id-at-organizationalUnitName", "Org Unit" }, "OU", }, { { ADD_LEN( MBEDTLS_OID_PKCS9_EMAIL ), "emailAddress", "E-mail address" }, "emailAddress", }, { { ADD_LEN( MBEDTLS_OID_AT_SERIAL_NUMBER ),"id-at-serialNumber", "Serial number" }, "serialNumber", }, { { ADD_LEN( MBEDTLS_OID_AT_POSTAL_ADDRESS ),"id-at-postalAddress", "Postal address" }, "postalAddress", }, { { ADD_LEN( MBEDTLS_OID_AT_POSTAL_CODE ), "id-at-postalCode", "Postal code" }, "postalCode", }, { { ADD_LEN( MBEDTLS_OID_AT_SUR_NAME ), "id-at-surName", "Surname" }, "SN", }, { { ADD_LEN( MBEDTLS_OID_AT_GIVEN_NAME ), "id-at-givenName", "Given name" }, "GN", }, { { ADD_LEN( MBEDTLS_OID_AT_INITIALS ), "id-at-initials", "Initials" }, "initials", }, { { ADD_LEN( MBEDTLS_OID_AT_GENERATION_QUALIFIER ), "id-at-generationQualifier", "Generation qualifier" }, "generationQualifier", }, { { ADD_LEN( MBEDTLS_OID_AT_TITLE ), "id-at-title", "Title" }, "title", }, { { ADD_LEN( MBEDTLS_OID_AT_DN_QUALIFIER ),"id-at-dnQualifier", "Distinguished Name qualifier" }, "dnQualifier", }, { { ADD_LEN( MBEDTLS_OID_AT_PSEUDONYM ), "id-at-pseudonym", "Pseudonym" }, "pseudonym", }, { { ADD_LEN( MBEDTLS_OID_DOMAIN_COMPONENT ), "id-domainComponent", "Domain component" }, "DC", }, { { ADD_LEN( MBEDTLS_OID_AT_UNIQUE_IDENTIFIER ), "id-at-uniqueIdentifier", "Unique Identifier" }, "uniqueIdentifier", }, { { NULL, 0, NULL, NULL }, NULL, } }; FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type) FN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name, oid_x520_attr_t, x520_attr, const char *, short_name) /* * For X509 extensions */ typedef struct { mbedtls_oid_descriptor_t descriptor; int ext_type; } oid_x509_ext_t; static const oid_x509_ext_t oid_x509_ext[] = { { { ADD_LEN( MBEDTLS_OID_BASIC_CONSTRAINTS ), "id-ce-basicConstraints", "Basic Constraints" }, MBEDTLS_X509_EXT_BASIC_CONSTRAINTS, }, { { ADD_LEN( MBEDTLS_OID_KEY_USAGE ), "id-ce-keyUsage", "Key Usage" }, MBEDTLS_X509_EXT_KEY_USAGE, }, { { ADD_LEN( MBEDTLS_OID_EXTENDED_KEY_USAGE ), "id-ce-extKeyUsage", "Extended Key Usage" }, MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE, }, { { ADD_LEN( MBEDTLS_OID_SUBJECT_ALT_NAME ), "id-ce-subjectAltName", "Subject Alt Name" }, MBEDTLS_X509_EXT_SUBJECT_ALT_NAME, }, { { ADD_LEN( MBEDTLS_OID_NS_CERT_TYPE ), "id-netscape-certtype", "Netscape Certificate Type" }, MBEDTLS_X509_EXT_NS_CERT_TYPE, }, { { NULL, 0, NULL, NULL }, 0, }, }; FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext) FN_OID_GET_ATTR1(mbedtls_oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type) static const mbedtls_oid_descriptor_t oid_ext_key_usage[] = { { ADD_LEN( MBEDTLS_OID_SERVER_AUTH ), "id-kp-serverAuth", "TLS Web Server Authentication" }, { ADD_LEN( MBEDTLS_OID_CLIENT_AUTH ), "id-kp-clientAuth", "TLS Web Client Authentication" }, { ADD_LEN( MBEDTLS_OID_CODE_SIGNING ), "id-kp-codeSigning", "Code Signing" }, { ADD_LEN( MBEDTLS_OID_EMAIL_PROTECTION ), "id-kp-emailProtection", "E-mail Protection" }, { ADD_LEN( MBEDTLS_OID_TIME_STAMPING ), "id-kp-timeStamping", "Time Stamping" }, { ADD_LEN( MBEDTLS_OID_OCSP_SIGNING ), "id-kp-OCSPSigning", "OCSP Signing" }, { NULL, 0, NULL, NULL }, }; FN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage) FN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage, mbedtls_oid_descriptor_t, ext_key_usage, const char *, description) #endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */ #if defined(MBEDTLS_MD_C) /* * For SignatureAlgorithmIdentifier */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_md_type_t md_alg; mbedtls_pk_type_t pk_alg; } oid_sig_alg_t; static const oid_sig_alg_t oid_sig_alg[] = { #if defined(MBEDTLS_RSA_C) #if defined(MBEDTLS_MD2_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_MD2 ), "md2WithRSAEncryption", "RSA with MD2" }, MBEDTLS_MD_MD2, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_MD4 ), "md4WithRSAEncryption", "RSA with MD4" }, MBEDTLS_MD_MD4, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_MD5 ), "md5WithRSAEncryption", "RSA with MD5" }, MBEDTLS_MD_MD5, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA1 ), "sha-1WithRSAEncryption", "RSA with SHA1" }, MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA224 ), "sha224WithRSAEncryption", "RSA with SHA-224" }, MBEDTLS_MD_SHA224, MBEDTLS_PK_RSA, }, { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA256 ), "sha256WithRSAEncryption", "RSA with SHA-256" }, MBEDTLS_MD_SHA256, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA384 ), "sha384WithRSAEncryption", "RSA with SHA-384" }, MBEDTLS_MD_SHA384, MBEDTLS_PK_RSA, }, { { ADD_LEN( MBEDTLS_OID_PKCS1_SHA512 ), "sha512WithRSAEncryption", "RSA with SHA-512" }, MBEDTLS_MD_SHA512, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_SHA512_C */ #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_RSA_SHA_OBS ), "sha-1WithRSAEncryption", "RSA with SHA1" }, MBEDTLS_MD_SHA1, MBEDTLS_PK_RSA, }, #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECDSA_C) #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA1 ), "ecdsa-with-SHA1", "ECDSA with SHA1" }, MBEDTLS_MD_SHA1, MBEDTLS_PK_ECDSA, }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA224 ), "ecdsa-with-SHA224", "ECDSA with SHA224" }, MBEDTLS_MD_SHA224, MBEDTLS_PK_ECDSA, }, { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA256 ), "ecdsa-with-SHA256", "ECDSA with SHA256" }, MBEDTLS_MD_SHA256, MBEDTLS_PK_ECDSA, }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA384 ), "ecdsa-with-SHA384", "ECDSA with SHA384" }, MBEDTLS_MD_SHA384, MBEDTLS_PK_ECDSA, }, { { ADD_LEN( MBEDTLS_OID_ECDSA_SHA512 ), "ecdsa-with-SHA512", "ECDSA with SHA512" }, MBEDTLS_MD_SHA512, MBEDTLS_PK_ECDSA, }, #endif /* MBEDTLS_SHA512_C */ #endif /* MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_RSA_C) { { ADD_LEN( MBEDTLS_OID_RSASSA_PSS ), "RSASSA-PSS", "RSASSA-PSS" }, MBEDTLS_MD_NONE, MBEDTLS_PK_RSASSA_PSS, }, #endif /* MBEDTLS_RSA_C */ { { NULL, 0, NULL, NULL }, MBEDTLS_MD_NONE, MBEDTLS_PK_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg) FN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg, const char *, description) FN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg, oid_sig_alg_t, sig_alg, mbedtls_md_type_t, md_alg, mbedtls_pk_type_t, pk_alg) FN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg, oid_sig_alg_t, oid_sig_alg, mbedtls_pk_type_t, pk_alg, mbedtls_md_type_t, md_alg) #endif /* MBEDTLS_MD_C */ /* * For PublicKeyInfo (PKCS1, RFC 5480) */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_pk_type_t pk_alg; } oid_pk_alg_t; static const oid_pk_alg_t oid_pk_alg[] = { { { ADD_LEN( MBEDTLS_OID_PKCS1_RSA ), "rsaEncryption", "RSA" }, MBEDTLS_PK_RSA, }, { { ADD_LEN( MBEDTLS_OID_EC_ALG_UNRESTRICTED ), "id-ecPublicKey", "Generic EC key" }, MBEDTLS_PK_ECKEY, }, { { ADD_LEN( MBEDTLS_OID_EC_ALG_ECDH ), "id-ecDH", "EC key for ECDH" }, MBEDTLS_PK_ECKEY_DH, }, { { NULL, 0, NULL, NULL }, MBEDTLS_PK_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg) FN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg) FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg, oid_pk_alg_t, oid_pk_alg, mbedtls_pk_type_t, pk_alg) #if defined(MBEDTLS_ECP_C) /* * For namedCurve (RFC 5480) */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_ecp_group_id grp_id; } oid_ecp_grp_t; static const oid_ecp_grp_t oid_ecp_grp[] = { #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192R1 ), "secp192r1", "secp192r1" }, MBEDTLS_ECP_DP_SECP192R1, }, #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224R1 ), "secp224r1", "secp224r1" }, MBEDTLS_ECP_DP_SECP224R1, }, #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256R1 ), "secp256r1", "secp256r1" }, MBEDTLS_ECP_DP_SECP256R1, }, #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP384R1 ), "secp384r1", "secp384r1" }, MBEDTLS_ECP_DP_SECP384R1, }, #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP521R1 ), "secp521r1", "secp521r1" }, MBEDTLS_ECP_DP_SECP521R1, }, #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192K1 ), "secp192k1", "secp192k1" }, MBEDTLS_ECP_DP_SECP192K1, }, #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224K1 ), "secp224k1", "secp224k1" }, MBEDTLS_ECP_DP_SECP224K1, }, #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256K1 ), "secp256k1", "secp256k1" }, MBEDTLS_ECP_DP_SECP256K1, }, #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_BP256R1 ), "brainpoolP256r1","brainpool256r1" }, MBEDTLS_ECP_DP_BP256R1, }, #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_BP384R1 ), "brainpoolP384r1","brainpool384r1" }, MBEDTLS_ECP_DP_BP384R1, }, #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) { { ADD_LEN( MBEDTLS_OID_EC_GRP_BP512R1 ), "brainpoolP512r1","brainpool512r1" }, MBEDTLS_ECP_DP_BP512R1, }, #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ { { NULL, 0, NULL, NULL }, MBEDTLS_ECP_DP_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp) FN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id) FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp, oid_ecp_grp_t, oid_ecp_grp, mbedtls_ecp_group_id, grp_id) #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_CIPHER_C) /* * For PKCS#5 PBES2 encryption algorithm */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_cipher_type_t cipher_alg; } oid_cipher_alg_t; static const oid_cipher_alg_t oid_cipher_alg[] = { { { ADD_LEN( MBEDTLS_OID_DES_CBC ), "desCBC", "DES-CBC" }, MBEDTLS_CIPHER_DES_CBC, }, { { ADD_LEN( MBEDTLS_OID_DES_EDE3_CBC ), "des-ede3-cbc", "DES-EDE3-CBC" }, MBEDTLS_CIPHER_DES_EDE3_CBC, }, { { NULL, 0, NULL, NULL }, MBEDTLS_CIPHER_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg) FN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg, oid_cipher_alg_t, cipher_alg, mbedtls_cipher_type_t, cipher_alg) #endif /* MBEDTLS_CIPHER_C */ #if defined(MBEDTLS_MD_C) /* * For digestAlgorithm */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_md_type_t md_alg; } oid_md_alg_t; static const oid_md_alg_t oid_md_alg[] = { #if defined(MBEDTLS_MD2_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD2 ), "id-md2", "MD2" }, MBEDTLS_MD_MD2, }, #endif /* MBEDTLS_MD2_C */ #if defined(MBEDTLS_MD4_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD4 ), "id-md4", "MD4" }, MBEDTLS_MD_MD4, }, #endif /* MBEDTLS_MD4_C */ #if defined(MBEDTLS_MD5_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD5 ), "id-md5", "MD5" }, MBEDTLS_MD_MD5, }, #endif /* MBEDTLS_MD5_C */ #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA1 ), "id-sha1", "SHA-1" }, MBEDTLS_MD_SHA1, }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA224 ), "id-sha224", "SHA-224" }, MBEDTLS_MD_SHA224, }, { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA256 ), "id-sha256", "SHA-256" }, MBEDTLS_MD_SHA256, }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA384 ), "id-sha384", "SHA-384" }, MBEDTLS_MD_SHA384, }, { { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA512 ), "id-sha512", "SHA-512" }, MBEDTLS_MD_SHA512, }, #endif /* MBEDTLS_SHA512_C */ { { NULL, 0, NULL, NULL }, MBEDTLS_MD_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg) FN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg) FN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md, oid_md_alg_t, oid_md_alg, mbedtls_md_type_t, md_alg) /* * For HMAC digestAlgorithm */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_md_type_t md_hmac; } oid_md_hmac_t; static const oid_md_hmac_t oid_md_hmac[] = { #if defined(MBEDTLS_SHA1_C) { { ADD_LEN( MBEDTLS_OID_HMAC_SHA1 ), "hmacSHA1", "HMAC-SHA-1" }, MBEDTLS_MD_SHA1, }, #endif /* MBEDTLS_SHA1_C */ #if defined(MBEDTLS_SHA256_C) { { ADD_LEN( MBEDTLS_OID_HMAC_SHA224 ), "hmacSHA224", "HMAC-SHA-224" }, MBEDTLS_MD_SHA224, }, { { ADD_LEN( MBEDTLS_OID_HMAC_SHA256 ), "hmacSHA256", "HMAC-SHA-256" }, MBEDTLS_MD_SHA256, }, #endif /* MBEDTLS_SHA256_C */ #if defined(MBEDTLS_SHA512_C) { { ADD_LEN( MBEDTLS_OID_HMAC_SHA384 ), "hmacSHA384", "HMAC-SHA-384" }, MBEDTLS_MD_SHA384, }, { { ADD_LEN( MBEDTLS_OID_HMAC_SHA512 ), "hmacSHA512", "HMAC-SHA-512" }, MBEDTLS_MD_SHA512, }, #endif /* MBEDTLS_SHA512_C */ { { NULL, 0, NULL, NULL }, MBEDTLS_MD_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_md_hmac_t, md_hmac, oid_md_hmac) FN_OID_GET_ATTR1(mbedtls_oid_get_md_hmac, oid_md_hmac_t, md_hmac, mbedtls_md_type_t, md_hmac) #endif /* MBEDTLS_MD_C */ #if defined(MBEDTLS_PKCS12_C) /* * For PKCS#12 PBEs */ typedef struct { mbedtls_oid_descriptor_t descriptor; mbedtls_md_type_t md_alg; mbedtls_cipher_type_t cipher_alg; } oid_pkcs12_pbe_alg_t; static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] = { { { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC ), "pbeWithSHAAnd3-KeyTripleDES-CBC", "PBE with SHA1 and 3-Key 3DES" }, MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE3_CBC, }, { { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC ), "pbeWithSHAAnd2-KeyTripleDES-CBC", "PBE with SHA1 and 2-Key 3DES" }, MBEDTLS_MD_SHA1, MBEDTLS_CIPHER_DES_EDE_CBC, }, { { NULL, 0, NULL, NULL }, MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE, }, }; FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg) FN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg, oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, mbedtls_md_type_t, md_alg, mbedtls_cipher_type_t, cipher_alg) #endif /* MBEDTLS_PKCS12_C */ #define OID_SAFE_SNPRINTF \ do { \ if( ret < 0 || (size_t) ret >= n ) \ return( MBEDTLS_ERR_OID_BUF_TOO_SMALL ); \ \ n -= (size_t) ret; \ p += (size_t) ret; \ } while( 0 ) /* Return the x.y.z.... style numeric string for the given OID */ int mbedtls_oid_get_numeric_string( char *buf, size_t size, const mbedtls_asn1_buf *oid ) { int ret; size_t i, n; unsigned int value; char *p; p = buf; n = size; /* First byte contains first two dots */ if( oid->len > 0 ) { ret = mbedtls_snprintf( p, n, "%d.%d", oid->p[0] / 40, oid->p[0] % 40 ); OID_SAFE_SNPRINTF; } value = 0; for( i = 1; i < oid->len; i++ ) { /* Prevent overflow in value. */ if( ( ( value << 7 ) >> 7 ) != value ) return( MBEDTLS_ERR_OID_BUF_TOO_SMALL ); value <<= 7; value += oid->p[i] & 0x7F; if( !( oid->p[i] & 0x80 ) ) { /* Last byte */ ret = mbedtls_snprintf( p, n, ".%d", value ); OID_SAFE_SNPRINTF; value = 0; } } return( (int) ( size - n ) ); } #endif /* MBEDTLS_OID_C */ fldigi-4.2.05/src/mbedtls/pk.c0000664000175000017500000003711014611711171012764 00000000000000/* * Public Key abstraction layer * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PK_C) #include "mbedtls/pk.h" #include "mbedtls/pk_internal.h" #include "mbedtls/platform_util.h" #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #endif #include #include /* Parameter validation macros based on platform_util.h */ #define PK_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA ) #define PK_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * Initialise a mbedtls_pk_context */ void mbedtls_pk_init( mbedtls_pk_context *ctx ) { PK_VALIDATE( ctx != NULL ); ctx->pk_info = NULL; ctx->pk_ctx = NULL; } /* * Free (the components of) a mbedtls_pk_context */ void mbedtls_pk_free( mbedtls_pk_context *ctx ) { if( ctx == NULL ) return; if ( ctx->pk_info != NULL ) ctx->pk_info->ctx_free_func( ctx->pk_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_pk_context ) ); } #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* * Initialize a restart context */ void mbedtls_pk_restart_init( mbedtls_pk_restart_ctx *ctx ) { PK_VALIDATE( ctx != NULL ); ctx->pk_info = NULL; ctx->rs_ctx = NULL; } /* * Free the components of a restart context */ void mbedtls_pk_restart_free( mbedtls_pk_restart_ctx *ctx ) { if( ctx == NULL || ctx->pk_info == NULL || ctx->pk_info->rs_free_func == NULL ) { return; } ctx->pk_info->rs_free_func( ctx->rs_ctx ); ctx->pk_info = NULL; ctx->rs_ctx = NULL; } #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /* * Get pk_info structure from type */ const mbedtls_pk_info_t * mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type ) { switch( pk_type ) { #if defined(MBEDTLS_RSA_C) case MBEDTLS_PK_RSA: return( &mbedtls_rsa_info ); #endif #if defined(MBEDTLS_ECP_C) case MBEDTLS_PK_ECKEY: return( &mbedtls_eckey_info ); case MBEDTLS_PK_ECKEY_DH: return( &mbedtls_eckeydh_info ); #endif #if defined(MBEDTLS_ECDSA_C) case MBEDTLS_PK_ECDSA: return( &mbedtls_ecdsa_info ); #endif /* MBEDTLS_PK_RSA_ALT omitted on purpose */ default: return( NULL ); } } /* * Initialise context */ int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info ) { PK_VALIDATE_RET( ctx != NULL ); if( info == NULL || ctx->pk_info != NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL ) return( MBEDTLS_ERR_PK_ALLOC_FAILED ); ctx->pk_info = info; return( 0 ); } #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) /* * Initialize an RSA-alt context */ int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key, mbedtls_pk_rsa_alt_decrypt_func decrypt_func, mbedtls_pk_rsa_alt_sign_func sign_func, mbedtls_pk_rsa_alt_key_len_func key_len_func ) { mbedtls_rsa_alt_context *rsa_alt; const mbedtls_pk_info_t *info = &mbedtls_rsa_alt_info; PK_VALIDATE_RET( ctx != NULL ); if( ctx->pk_info != NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL ) return( MBEDTLS_ERR_PK_ALLOC_FAILED ); ctx->pk_info = info; rsa_alt = (mbedtls_rsa_alt_context *) ctx->pk_ctx; rsa_alt->key = key; rsa_alt->decrypt_func = decrypt_func; rsa_alt->sign_func = sign_func; rsa_alt->key_len_func = key_len_func; return( 0 ); } #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ /* * Tell if a PK can do the operations of the given type */ int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type ) { /* A context with null pk_info is not set up yet and can't do anything. * For backward compatibility, also accept NULL instead of a context * pointer. */ if( ctx == NULL || ctx->pk_info == NULL ) return( 0 ); return( ctx->pk_info->can_do( type ) ); } /* * Helper for mbedtls_pk_sign and mbedtls_pk_verify */ static inline int pk_hashlen_helper( mbedtls_md_type_t md_alg, size_t *hash_len ) { const mbedtls_md_info_t *md_info; if( *hash_len != 0 ) return( 0 ); if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL ) return( -1 ); *hash_len = mbedtls_md_get_size( md_info ); return( 0 ); } #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* * Helper to set up a restart context if needed */ static int pk_restart_setup( mbedtls_pk_restart_ctx *ctx, const mbedtls_pk_info_t *info ) { /* Don't do anything if already set up or invalid */ if( ctx == NULL || ctx->pk_info != NULL ) return( 0 ); /* Should never happen when we're called */ if( info->rs_alloc_func == NULL || info->rs_free_func == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ( ctx->rs_ctx = info->rs_alloc_func() ) == NULL ) return( MBEDTLS_ERR_PK_ALLOC_FAILED ); ctx->pk_info = info; return( 0 ); } #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ /* * Verify a signature (restartable) */ int mbedtls_pk_verify_restartable( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, mbedtls_pk_restart_ctx *rs_ctx ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hash_len == 0 ) || hash != NULL ); PK_VALIDATE_RET( sig != NULL ); if( ctx->pk_info == NULL || pk_hashlen_helper( md_alg, &hash_len ) != 0 ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* optimization: use non-restartable version if restart disabled */ if( rs_ctx != NULL && mbedtls_ecp_restart_is_enabled() && ctx->pk_info->verify_rs_func != NULL ) { int ret; if( ( ret = pk_restart_setup( rs_ctx, ctx->pk_info ) ) != 0 ) return( ret ); ret = ctx->pk_info->verify_rs_func( ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len, rs_ctx->rs_ctx ); if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) mbedtls_pk_restart_free( rs_ctx ); return( ret ); } #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ (void) rs_ctx; #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ if( ctx->pk_info->verify_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); return( ctx->pk_info->verify_func( ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len ) ); } /* * Verify a signature */ int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { return( mbedtls_pk_verify_restartable( ctx, md_alg, hash, hash_len, sig, sig_len, NULL ) ); } /* * Verify a signature with options */ int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options, mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hash_len == 0 ) || hash != NULL ); PK_VALIDATE_RET( sig != NULL ); if( ctx->pk_info == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ! mbedtls_pk_can_do( ctx, type ) ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); if( type == MBEDTLS_PK_RSASSA_PSS ) { #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PKCS1_V21) int ret; const mbedtls_pk_rsassa_pss_options *pss_opts; #if SIZE_MAX > UINT_MAX if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #endif /* SIZE_MAX > UINT_MAX */ if( options == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); pss_opts = (const mbedtls_pk_rsassa_pss_options *) options; if( sig_len < mbedtls_pk_get_len( ctx ) ) return( MBEDTLS_ERR_RSA_VERIFY_FAILED ); ret = mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_pk_rsa( *ctx ), NULL, NULL, MBEDTLS_RSA_PUBLIC, md_alg, (unsigned int) hash_len, hash, pss_opts->mgf1_hash_id, pss_opts->expected_salt_len, sig ); if( ret != 0 ) return( ret ); if( sig_len > mbedtls_pk_get_len( ctx ) ) return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH ); return( 0 ); #else return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); #endif /* MBEDTLS_RSA_C && MBEDTLS_PKCS1_V21 */ } /* General case: no options */ if( options != NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); return( mbedtls_pk_verify( ctx, md_alg, hash, hash_len, sig, sig_len ) ); } /* * Make a signature (restartable) */ int mbedtls_pk_sign_restartable( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_pk_restart_ctx *rs_ctx ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hash_len == 0 ) || hash != NULL ); PK_VALIDATE_RET( sig != NULL ); if( ctx->pk_info == NULL || pk_hashlen_helper( md_alg, &hash_len ) != 0 ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) /* optimization: use non-restartable version if restart disabled */ if( rs_ctx != NULL && mbedtls_ecp_restart_is_enabled() && ctx->pk_info->sign_rs_func != NULL ) { int ret; if( ( ret = pk_restart_setup( rs_ctx, ctx->pk_info ) ) != 0 ) return( ret ); ret = ctx->pk_info->sign_rs_func( ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng, rs_ctx->rs_ctx ); if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) mbedtls_pk_restart_free( rs_ctx ); return( ret ); } #else /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ (void) rs_ctx; #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ if( ctx->pk_info->sign_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); return( ctx->pk_info->sign_func( ctx->pk_ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ) ); } /* * Make a signature */ int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { return( mbedtls_pk_sign_restartable( ctx, md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng, NULL ) ); } /* * Decrypt message */ int mbedtls_pk_decrypt( mbedtls_pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( input != NULL || ilen == 0 ); PK_VALIDATE_RET( output != NULL || osize == 0 ); PK_VALIDATE_RET( olen != NULL ); if( ctx->pk_info == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ctx->pk_info->decrypt_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); return( ctx->pk_info->decrypt_func( ctx->pk_ctx, input, ilen, output, olen, osize, f_rng, p_rng ) ); } /* * Encrypt message */ int mbedtls_pk_encrypt( mbedtls_pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( input != NULL || ilen == 0 ); PK_VALIDATE_RET( output != NULL || osize == 0 ); PK_VALIDATE_RET( olen != NULL ); if( ctx->pk_info == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ctx->pk_info->encrypt_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); return( ctx->pk_info->encrypt_func( ctx->pk_ctx, input, ilen, output, olen, osize, f_rng, p_rng ) ); } /* * Check public-private key pair */ int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv ) { PK_VALIDATE_RET( pub != NULL ); PK_VALIDATE_RET( prv != NULL ); if( pub->pk_info == NULL || prv->pk_info == NULL || prv->pk_info->check_pair_func == NULL ) { return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); } if( prv->pk_info->type == MBEDTLS_PK_RSA_ALT ) { if( pub->pk_info->type != MBEDTLS_PK_RSA ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); } else { if( pub->pk_info != prv->pk_info ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); } return( prv->pk_info->check_pair_func( pub->pk_ctx, prv->pk_ctx ) ); } /* * Get key size in bits */ size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx ) { /* For backward compatibility, accept NULL or a context that * isn't set up yet, and return a fake value that should be safe. */ if( ctx == NULL || ctx->pk_info == NULL ) return( 0 ); return( ctx->pk_info->get_bitlen( ctx->pk_ctx ) ); } /* * Export debug information */ int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items ) { PK_VALIDATE_RET( ctx != NULL ); if( ctx->pk_info == NULL ) return( MBEDTLS_ERR_PK_BAD_INPUT_DATA ); if( ctx->pk_info->debug_func == NULL ) return( MBEDTLS_ERR_PK_TYPE_MISMATCH ); ctx->pk_info->debug_func( ctx->pk_ctx, items ); return( 0 ); } /* * Access the PK type name */ const char *mbedtls_pk_get_name( const mbedtls_pk_context *ctx ) { if( ctx == NULL || ctx->pk_info == NULL ) return( "invalid PK" ); return( ctx->pk_info->name ); } /* * Access the PK type */ mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx ) { if( ctx == NULL || ctx->pk_info == NULL ) return( MBEDTLS_PK_NONE ); return( ctx->pk_info->type ); } #endif /* MBEDTLS_PK_C */ fldigi-4.2.05/src/mbedtls/net_sockets.c0000664000175000017500000004243314611711171014677 00000000000000/* * TCP/IP or UDP/IP networking functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* Enable definition of getaddrinfo() even when compiling with -std=c99. Must * be set before config.h, which pulls in glibc's features.h indirectly. * Harmless on other platforms. */ #define _POSIX_C_SOURCE 200112L #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_NET_C) #if !defined(unix) && !defined(__unix__) && !defined(__unix) && \ !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \ !defined(__HAIKU__) #error "This module only works on Unix and Windows, see MBEDTLS_NET_C in config.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #endif #include "mbedtls/net_sockets.h" #include #if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \ !defined(EFI32) #define IS_EINTR( ret ) ( ( ret ) == WSAEINTR ) #if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0501) #undef _WIN32_WINNT /* Enables getaddrinfo() & Co */ #define _WIN32_WINNT 0x0501 #endif #include #include #include #if defined(_MSC_VER) #if defined(_WIN32_WCE) #pragma comment( lib, "ws2.lib" ) #else #pragma comment( lib, "ws2_32.lib" ) #endif #endif /* _MSC_VER */ #define read(fd,buf,len) recv( fd, (char*)( buf ), (int)( len ), 0 ) #define write(fd,buf,len) send( fd, (char*)( buf ), (int)( len ), 0 ) #define close(fd) closesocket(fd) static int wsa_init_done = 0; #else /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */ #include #include #include #include #include #include #include #include #include #include #define IS_EINTR( ret ) ( ( ret ) == EINTR ) #endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */ /* Some MS functions want int and MSVC warns if we pass size_t, * but the standard functions use socklen_t, so cast only for MSVC */ #if defined(_MSC_VER) #define MSVC_INT_CAST (int) #else #define MSVC_INT_CAST #endif #include #include #include /* * Prepare for using the sockets interface */ static int net_prepare( void ) { #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) WSADATA wsaData; if( wsa_init_done == 0 ) { if( WSAStartup( MAKEWORD(2,0), &wsaData ) != 0 ) return( MBEDTLS_ERR_NET_SOCKET_FAILED ); wsa_init_done = 1; } #else #if !defined(EFIX64) && !defined(EFI32) signal( SIGPIPE, SIG_IGN ); #endif #endif return( 0 ); } /* * Initialize a context */ void mbedtls_net_init( mbedtls_net_context *ctx ) { ctx->fd = -1; } /* * Initiate a TCP connection with host:port and the given protocol */ int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto ) { int ret; struct addrinfo hints, *addr_list, *cur; if( ( ret = net_prepare() ) != 0 ) return( ret ); /* Do name resolution with both IPv6 and IPv4 */ memset( &hints, 0, sizeof( hints ) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM; hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP; if( getaddrinfo( host, port, &hints, &addr_list ) != 0 ) return( MBEDTLS_ERR_NET_UNKNOWN_HOST ); /* Try the sockaddrs until a connection succeeds */ ret = MBEDTLS_ERR_NET_UNKNOWN_HOST; for( cur = addr_list; cur != NULL; cur = cur->ai_next ) { ctx->fd = (int) socket( cur->ai_family, cur->ai_socktype, cur->ai_protocol ); if( ctx->fd < 0 ) { ret = MBEDTLS_ERR_NET_SOCKET_FAILED; continue; } if( connect( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) == 0 ) { ret = 0; break; } close( ctx->fd ); ret = MBEDTLS_ERR_NET_CONNECT_FAILED; } freeaddrinfo( addr_list ); return( ret ); } /* * Create a listening socket on bind_ip:port */ int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto ) { int n, ret; struct addrinfo hints, *addr_list, *cur; if( ( ret = net_prepare() ) != 0 ) return( ret ); /* Bind to IPv6 and/or IPv4, but only in the desired protocol */ memset( &hints, 0, sizeof( hints ) ); hints.ai_family = AF_UNSPEC; hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM; hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP; if( bind_ip == NULL ) hints.ai_flags = AI_PASSIVE; if( getaddrinfo( bind_ip, port, &hints, &addr_list ) != 0 ) return( MBEDTLS_ERR_NET_UNKNOWN_HOST ); /* Try the sockaddrs until a binding succeeds */ ret = MBEDTLS_ERR_NET_UNKNOWN_HOST; for( cur = addr_list; cur != NULL; cur = cur->ai_next ) { ctx->fd = (int) socket( cur->ai_family, cur->ai_socktype, cur->ai_protocol ); if( ctx->fd < 0 ) { ret = MBEDTLS_ERR_NET_SOCKET_FAILED; continue; } n = 1; if( setsockopt( ctx->fd, SOL_SOCKET, SO_REUSEADDR, (const char *) &n, sizeof( n ) ) != 0 ) { close( ctx->fd ); ret = MBEDTLS_ERR_NET_SOCKET_FAILED; continue; } if( bind( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) != 0 ) { close( ctx->fd ); ret = MBEDTLS_ERR_NET_BIND_FAILED; continue; } /* Listen only makes sense for TCP */ if( proto == MBEDTLS_NET_PROTO_TCP ) { if( listen( ctx->fd, MBEDTLS_NET_LISTEN_BACKLOG ) != 0 ) { close( ctx->fd ); ret = MBEDTLS_ERR_NET_LISTEN_FAILED; continue; } } /* Bind was successful */ ret = 0; break; } freeaddrinfo( addr_list ); return( ret ); } #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) /* * Check if the requested operation would be blocking on a non-blocking socket * and thus 'failed' with a negative return value. */ static int net_would_block( const mbedtls_net_context *ctx ) { ((void) ctx); return( WSAGetLastError() == WSAEWOULDBLOCK ); } #else /* * Check if the requested operation would be blocking on a non-blocking socket * and thus 'failed' with a negative return value. * * Note: on a blocking socket this function always returns 0! */ static int net_would_block( const mbedtls_net_context *ctx ) { int err = errno; /* * Never return 'WOULD BLOCK' on a non-blocking socket */ if( ( fcntl( ctx->fd, F_GETFL ) & O_NONBLOCK ) != O_NONBLOCK ) { errno = err; return( 0 ); } switch( errno = err ) { #if defined EAGAIN case EAGAIN: #endif #if defined EWOULDBLOCK && EWOULDBLOCK != EAGAIN case EWOULDBLOCK: #endif return( 1 ); } return( 0 ); } #endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */ /* * Accept a connection from a remote client */ int mbedtls_net_accept( mbedtls_net_context *bind_ctx, mbedtls_net_context *client_ctx, void *client_ip, size_t buf_size, size_t *ip_len ) { int ret; int type; struct sockaddr_storage client_addr; #if defined(__socklen_t_defined) || defined(_SOCKLEN_T) || \ defined(_SOCKLEN_T_DECLARED) || defined(__DEFINED_socklen_t) socklen_t n = (socklen_t) sizeof( client_addr ); socklen_t type_len = (socklen_t) sizeof( type ); #else int n = (int) sizeof( client_addr ); int type_len = (int) sizeof( type ); #endif /* Is this a TCP or UDP socket? */ if( getsockopt( bind_ctx->fd, SOL_SOCKET, SO_TYPE, (void *) &type, &type_len ) != 0 || ( type != SOCK_STREAM && type != SOCK_DGRAM ) ) { return( MBEDTLS_ERR_NET_ACCEPT_FAILED ); } if( type == SOCK_STREAM ) { /* TCP: actual accept() */ ret = client_ctx->fd = (int) accept( bind_ctx->fd, (struct sockaddr *) &client_addr, &n ); } else { /* UDP: wait for a message, but keep it in the queue */ char buf[1] = { 0 }; ret = (int) recvfrom( bind_ctx->fd, buf, sizeof( buf ), MSG_PEEK, (struct sockaddr *) &client_addr, &n ); #if defined(_WIN32) if( ret == SOCKET_ERROR && WSAGetLastError() == WSAEMSGSIZE ) { /* We know buf is too small, thanks, just peeking here */ ret = 0; } #endif } if( ret < 0 ) { if( net_would_block( bind_ctx ) != 0 ) return( MBEDTLS_ERR_SSL_WANT_READ ); return( MBEDTLS_ERR_NET_ACCEPT_FAILED ); } /* UDP: hijack the listening socket to communicate with the client, * then bind a new socket to accept new connections */ if( type != SOCK_STREAM ) { struct sockaddr_storage local_addr; int one = 1; if( connect( bind_ctx->fd, (struct sockaddr *) &client_addr, n ) != 0 ) return( MBEDTLS_ERR_NET_ACCEPT_FAILED ); client_ctx->fd = bind_ctx->fd; bind_ctx->fd = -1; /* In case we exit early */ n = sizeof( struct sockaddr_storage ); if( getsockname( client_ctx->fd, (struct sockaddr *) &local_addr, &n ) != 0 || ( bind_ctx->fd = (int) socket( local_addr.ss_family, SOCK_DGRAM, IPPROTO_UDP ) ) < 0 || setsockopt( bind_ctx->fd, SOL_SOCKET, SO_REUSEADDR, (const char *) &one, sizeof( one ) ) != 0 ) { return( MBEDTLS_ERR_NET_SOCKET_FAILED ); } if( bind( bind_ctx->fd, (struct sockaddr *) &local_addr, n ) != 0 ) { return( MBEDTLS_ERR_NET_BIND_FAILED ); } } if( client_ip != NULL ) { if( client_addr.ss_family == AF_INET ) { struct sockaddr_in *addr4 = (struct sockaddr_in *) &client_addr; *ip_len = sizeof( addr4->sin_addr.s_addr ); if( buf_size < *ip_len ) return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL ); memcpy( client_ip, &addr4->sin_addr.s_addr, *ip_len ); } else { struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) &client_addr; *ip_len = sizeof( addr6->sin6_addr.s6_addr ); if( buf_size < *ip_len ) return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL ); memcpy( client_ip, &addr6->sin6_addr.s6_addr, *ip_len); } } return( 0 ); } /* * Set the socket blocking or non-blocking */ int mbedtls_net_set_block( mbedtls_net_context *ctx ) { #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) u_long n = 0; return( ioctlsocket( ctx->fd, FIONBIO, &n ) ); #else return( fcntl( ctx->fd, F_SETFL, fcntl( ctx->fd, F_GETFL ) & ~O_NONBLOCK ) ); #endif } int mbedtls_net_set_nonblock( mbedtls_net_context *ctx ) { #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) u_long n = 1; return( ioctlsocket( ctx->fd, FIONBIO, &n ) ); #else return( fcntl( ctx->fd, F_SETFL, fcntl( ctx->fd, F_GETFL ) | O_NONBLOCK ) ); #endif } /* * Check if data is available on the socket */ int mbedtls_net_poll( mbedtls_net_context *ctx, uint32_t rw, uint32_t timeout ) { int ret; struct timeval tv; fd_set read_fds; fd_set write_fds; int fd = ctx->fd; if( fd < 0 ) return( MBEDTLS_ERR_NET_INVALID_CONTEXT ); #if defined(__has_feature) #if __has_feature(memory_sanitizer) /* Ensure that memory sanitizers consider read_fds and write_fds as * initialized even on platforms such as Glibc/x86_64 where FD_ZERO * is implemented in assembly. */ memset( &read_fds, 0, sizeof( read_fds ) ); memset( &write_fds, 0, sizeof( write_fds ) ); #endif #endif FD_ZERO( &read_fds ); if( rw & MBEDTLS_NET_POLL_READ ) { rw &= ~MBEDTLS_NET_POLL_READ; FD_SET( fd, &read_fds ); } FD_ZERO( &write_fds ); if( rw & MBEDTLS_NET_POLL_WRITE ) { rw &= ~MBEDTLS_NET_POLL_WRITE; FD_SET( fd, &write_fds ); } if( rw != 0 ) return( MBEDTLS_ERR_NET_BAD_INPUT_DATA ); tv.tv_sec = timeout / 1000; tv.tv_usec = ( timeout % 1000 ) * 1000; do { ret = select( fd + 1, &read_fds, &write_fds, NULL, timeout == (uint32_t) -1 ? NULL : &tv ); } while( IS_EINTR( ret ) ); if( ret < 0 ) return( MBEDTLS_ERR_NET_POLL_FAILED ); ret = 0; if( FD_ISSET( fd, &read_fds ) ) ret |= MBEDTLS_NET_POLL_READ; if( FD_ISSET( fd, &write_fds ) ) ret |= MBEDTLS_NET_POLL_WRITE; return( ret ); } /* * Portable usleep helper */ void mbedtls_net_usleep( unsigned long usec ) { #if defined(_WIN32) Sleep( ( usec + 999 ) / 1000 ); #else struct timeval tv; tv.tv_sec = usec / 1000000; #if defined(__unix__) || defined(__unix) || \ ( defined(__APPLE__) && defined(__MACH__) ) tv.tv_usec = (suseconds_t) usec % 1000000; #else tv.tv_usec = usec % 1000000; #endif select( 0, NULL, NULL, NULL, &tv ); #endif } /* * Read at most 'len' characters */ int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len ) { int ret; int fd = ((mbedtls_net_context *) ctx)->fd; if( fd < 0 ) return( MBEDTLS_ERR_NET_INVALID_CONTEXT ); ret = (int) read( fd, buf, len ); if( ret < 0 ) { if( net_would_block( ctx ) != 0 ) return( MBEDTLS_ERR_SSL_WANT_READ ); #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) if( WSAGetLastError() == WSAECONNRESET ) return( MBEDTLS_ERR_NET_CONN_RESET ); #else if( errno == EPIPE || errno == ECONNRESET ) return( MBEDTLS_ERR_NET_CONN_RESET ); if( errno == EINTR ) return( MBEDTLS_ERR_SSL_WANT_READ ); #endif return( MBEDTLS_ERR_NET_RECV_FAILED ); } return( ret ); } /* * Read at most 'len' characters, blocking for at most 'timeout' ms */ int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len, uint32_t timeout ) { int ret; struct timeval tv; fd_set read_fds; int fd = ((mbedtls_net_context *) ctx)->fd; if( fd < 0 ) return( MBEDTLS_ERR_NET_INVALID_CONTEXT ); FD_ZERO( &read_fds ); FD_SET( fd, &read_fds ); tv.tv_sec = timeout / 1000; tv.tv_usec = ( timeout % 1000 ) * 1000; ret = select( fd + 1, &read_fds, NULL, NULL, timeout == 0 ? NULL : &tv ); /* Zero fds ready means we timed out */ if( ret == 0 ) return( MBEDTLS_ERR_SSL_TIMEOUT ); if( ret < 0 ) { #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) if( WSAGetLastError() == WSAEINTR ) return( MBEDTLS_ERR_SSL_WANT_READ ); #else if( errno == EINTR ) return( MBEDTLS_ERR_SSL_WANT_READ ); #endif return( MBEDTLS_ERR_NET_RECV_FAILED ); } /* This call will not block */ return( mbedtls_net_recv( ctx, buf, len ) ); } /* * Write at most 'len' characters */ int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len ) { int ret; int fd = ((mbedtls_net_context *) ctx)->fd; if( fd < 0 ) return( MBEDTLS_ERR_NET_INVALID_CONTEXT ); ret = (int) write( fd, buf, len ); if( ret < 0 ) { if( net_would_block( ctx ) != 0 ) return( MBEDTLS_ERR_SSL_WANT_WRITE ); #if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \ !defined(EFI32) if( WSAGetLastError() == WSAECONNRESET ) return( MBEDTLS_ERR_NET_CONN_RESET ); #else if( errno == EPIPE || errno == ECONNRESET ) return( MBEDTLS_ERR_NET_CONN_RESET ); if( errno == EINTR ) return( MBEDTLS_ERR_SSL_WANT_WRITE ); #endif return( MBEDTLS_ERR_NET_SEND_FAILED ); } return( ret ); } /* * Gracefully close the connection */ void mbedtls_net_free( mbedtls_net_context *ctx ) { if( ctx->fd == -1 ) return; shutdown( ctx->fd, 2 ); close( ctx->fd ); ctx->fd = -1; } #endif /* MBEDTLS_NET_C */ fldigi-4.2.05/src/mbedtls/pkcs11.c0000664000175000017500000001463714611711171013465 00000000000000/** * \file pkcs11.c * * \brief Wrapper for PKCS#11 library libpkcs11-helper * * \author Adriaan de Jong * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #include "mbedtls/pkcs11.h" #if defined(MBEDTLS_PKCS11_C) #include "mbedtls/md.h" #include "mbedtls/oid.h" #include "mbedtls/x509_crt.h" #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include void mbedtls_pkcs11_init( mbedtls_pkcs11_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_pkcs11_context ) ); } int mbedtls_pkcs11_x509_cert_bind( mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11_cert ) { int ret = 1; unsigned char *cert_blob = NULL; size_t cert_blob_size = 0; if( cert == NULL ) { ret = 2; goto cleanup; } if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, NULL, &cert_blob_size ) != CKR_OK ) { ret = 3; goto cleanup; } cert_blob = mbedtls_calloc( 1, cert_blob_size ); if( NULL == cert_blob ) { ret = 4; goto cleanup; } if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, cert_blob, &cert_blob_size ) != CKR_OK ) { ret = 5; goto cleanup; } if( 0 != mbedtls_x509_crt_parse( cert, cert_blob, cert_blob_size ) ) { ret = 6; goto cleanup; } ret = 0; cleanup: if( NULL != cert_blob ) mbedtls_free( cert_blob ); return( ret ); } int mbedtls_pkcs11_priv_key_bind( mbedtls_pkcs11_context *priv_key, pkcs11h_certificate_t pkcs11_cert ) { int ret = 1; mbedtls_x509_crt cert; mbedtls_x509_crt_init( &cert ); if( priv_key == NULL ) goto cleanup; if( 0 != mbedtls_pkcs11_x509_cert_bind( &cert, pkcs11_cert ) ) goto cleanup; priv_key->len = mbedtls_pk_get_len( &cert.pk ); priv_key->pkcs11h_cert = pkcs11_cert; ret = 0; cleanup: mbedtls_x509_crt_free( &cert ); return( ret ); } void mbedtls_pkcs11_priv_key_free( mbedtls_pkcs11_context *priv_key ) { if( NULL != priv_key ) pkcs11h_certificate_freeCertificate( priv_key->pkcs11h_cert ); } int mbedtls_pkcs11_decrypt( mbedtls_pkcs11_context *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ) { size_t input_len, output_len; if( NULL == ctx ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( MBEDTLS_RSA_PRIVATE != mode ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); output_len = input_len = ctx->len; if( input_len < 16 || input_len > output_max_len ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* Determine size of output buffer */ if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input, input_len, NULL, &output_len ) != CKR_OK ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } if( output_len > output_max_len ) return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE ); if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input, input_len, output, &output_len ) != CKR_OK ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } *olen = output_len; return( 0 ); } int mbedtls_pkcs11_sign( mbedtls_pkcs11_context *ctx, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { size_t sig_len = 0, asn_len = 0, oid_size = 0; unsigned char *p = sig; const char *oid; if( NULL == ctx ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( MBEDTLS_RSA_PRIVATE != mode ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( md_alg != MBEDTLS_MD_NONE ) { const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( mbedtls_oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hashlen = mbedtls_md_get_size( md_info ); asn_len = 10 + oid_size; } sig_len = ctx->len; if( hashlen > sig_len || asn_len > sig_len || hashlen + asn_len > sig_len ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } if( md_alg != MBEDTLS_MD_NONE ) { /* * DigestInfo ::= SEQUENCE { * digestAlgorithm DigestAlgorithmIdentifier, * digest Digest } * * DigestAlgorithmIdentifier ::= AlgorithmIdentifier * * Digest ::= OCTET STRING */ *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; *p++ = (unsigned char) ( 0x08 + oid_size + hashlen ); *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; *p++ = (unsigned char) ( 0x04 + oid_size ); *p++ = MBEDTLS_ASN1_OID; *p++ = oid_size & 0xFF; memcpy( p, oid, oid_size ); p += oid_size; *p++ = MBEDTLS_ASN1_NULL; *p++ = 0x00; *p++ = MBEDTLS_ASN1_OCTET_STRING; *p++ = hashlen; } memcpy( p, hash, hashlen ); if( pkcs11h_certificate_signAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, sig, asn_len + hashlen, sig, &sig_len ) != CKR_OK ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } return( 0 ); } #endif /* defined(MBEDTLS_PKCS11_C) */ fldigi-4.2.05/src/mbedtls/ssl_srv.c0000664000175000017500000045212714611711171014056 00000000000000/* * SSLv3/TLSv1 server-side functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SSL_SRV_C) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #include "mbedtls/debug.h" #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_HAVE_TIME) #include "mbedtls/platform_time.h" #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl, const unsigned char *info, size_t ilen ) { if( ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); mbedtls_free( ssl->cli_id ); if( ( ssl->cli_id = mbedtls_calloc( 1, ilen ) ) == NULL ) return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); memcpy( ssl->cli_id, info, ilen ); ssl->cli_id_len = ilen; return( 0 ); } void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf, mbedtls_ssl_cookie_write_t *f_cookie_write, mbedtls_ssl_cookie_check_t *f_cookie_check, void *p_cookie ) { conf->f_cookie_write = f_cookie_write; conf->f_cookie_check = f_cookie_check; conf->p_cookie = p_cookie; } #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) static int ssl_parse_servername_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; size_t servername_list_size, hostname_len; const unsigned char *p; MBEDTLS_SSL_DEBUG_MSG( 3, ( "parse ServerName extension" ) ); if( len < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); if( servername_list_size + 2 != len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } p = buf + 2; while( servername_list_size > 2 ) { hostname_len = ( ( p[1] << 8 ) | p[2] ); if( hostname_len + 3 > servername_list_size ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) { ret = ssl->conf->f_sni( ssl->conf->p_sni, ssl, p + 3, hostname_len ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "ssl_sni_wrapper", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } return( 0 ); } servername_list_size -= hostname_len + 3; p += hostname_len + 3; } if( servername_list_size != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } return( 0 ); } #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ static int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { /* Check verify-data in constant-time. The length OTOH is no secret */ if( len != 1 + ssl->verify_data_len || buf[0] != ssl->verify_data_len || mbedtls_ssl_safer_memcmp( buf + 1, ssl->peer_verify_data, ssl->verify_data_len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-matching renegotiation info" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } } else #endif /* MBEDTLS_SSL_RENEGOTIATION */ { if( len != 1 || buf[0] != 0x0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "non-zero length renegotiation info" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; } return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Status of the implementation of signature-algorithms extension: * * Currently, we are only considering the signature-algorithm extension * to pick a ciphersuite which allows us to send the ServerKeyExchange * message with a signature-hash combination that the user allows. * * We do *not* check whether all certificates in our certificate * chain are signed with an allowed signature-hash pair. * This needs to be done at a later stage. * */ static int ssl_parse_signature_algorithms_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t sig_alg_list_size; const unsigned char *p; const unsigned char *end = buf + len; mbedtls_md_type_t md_cur; mbedtls_pk_type_t sig_cur; if ( len < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); if( sig_alg_list_size + 2 != len || sig_alg_list_size % 2 != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* Currently we only guarantee signing the ServerKeyExchange message according * to the constraints specified in this extension (see above), so it suffices * to remember only one suitable hash for each possible signature algorithm. * * This will change when we also consider certificate signatures, * in which case we will need to remember the whole signature-hash * pair list from the extension. */ for( p = buf + 2; p < end; p += 2 ) { /* Silently ignore unknown signature or hash algorithms. */ if( ( sig_cur = mbedtls_ssl_pk_alg_from_sig( p[1] ) ) == MBEDTLS_PK_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext" " unknown sig alg encoding %d", p[1] ) ); continue; } /* Check if we support the hash the user proposes */ md_cur = mbedtls_ssl_md_alg_from_hash( p[0] ); if( md_cur == MBEDTLS_MD_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:" " unknown hash alg encoding %d", p[0] ) ); continue; } if( mbedtls_ssl_check_sig_hash( ssl, md_cur ) == 0 ) { mbedtls_ssl_sig_hash_set_add( &ssl->handshake->hash_algs, sig_cur, md_cur ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext:" " match sig %d and hash %d", sig_cur, md_cur ) ); } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: " "hash alg %d not supported", md_cur ) ); } } return( 0 ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_size, our_size; const unsigned char *p; const mbedtls_ecp_curve_info *curve_info, **curves; if ( len < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } list_size = ( ( buf[0] << 8 ) | ( buf[1] ) ); if( list_size + 2 != len || list_size % 2 != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* Should never happen unless client duplicates the extension */ if( ssl->handshake->curves != NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* Don't allow our peer to make us allocate too much memory, * and leave room for a final 0 */ our_size = list_size / 2 + 1; if( our_size > MBEDTLS_ECP_DP_MAX ) our_size = MBEDTLS_ECP_DP_MAX; if( ( curves = mbedtls_calloc( our_size, sizeof( *curves ) ) ) == NULL ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR ); return( MBEDTLS_ERR_SSL_ALLOC_FAILED ); } ssl->handshake->curves = curves; p = buf + 2; while( list_size > 0 && our_size > 1 ) { curve_info = mbedtls_ecp_curve_info_from_tls_id( ( p[0] << 8 ) | p[1] ); if( curve_info != NULL ) { *curves++ = curve_info; our_size--; } list_size -= 2; p += 2; } return( 0 ); } static int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_size; const unsigned char *p; if( len == 0 || (size_t)( buf[0] + 1 ) != len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } list_size = buf[0]; p = buf + 1; while( list_size > 0 ) { if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED || p[0] == MBEDTLS_ECP_PF_COMPRESSED ) { #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) ssl->handshake->ecdh_ctx.point_format = p[0]; #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ssl->handshake->ecjpake_ctx.point_format = p[0]; #endif MBEDTLS_SSL_DEBUG_MSG( 4, ( "point format selected: %d", p[0] ) ); return( 0 ); } list_size--; p++; } return( 0 ); } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { int ret; if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "skip ecjpake kkpp extension" ) ); return( 0 ); } if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx, buf, len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_one", ret ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( ret ); } /* Only mark the extension as OK when we're sure it is */ ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) static int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->session_negotiate->mfl_code = buf[0]; return( 0 ); } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) static int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ((void) buf); if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED ) ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; return( 0 ); } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) static int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ((void) buf); if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED && ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) { ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED; } return( 0 ); } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) static int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { if( len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ((void) buf); if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED && ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) { ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; } return( 0 ); } #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len ) { int ret; mbedtls_ssl_session session; mbedtls_ssl_session_init( &session ); if( ssl->conf->f_ticket_parse == NULL || ssl->conf->f_ticket_write == NULL ) { return( 0 ); } /* Remember the client asked us to send a new ticket */ ssl->handshake->new_session_ticket = 1; MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket length: %d", len ) ); if( len == 0 ) return( 0 ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket rejected: renegotiating" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ /* * Failures are ok: just ignore the ticket and proceed. */ if( ( ret = ssl->conf->f_ticket_parse( ssl->conf->p_ticket, &session, buf, len ) ) != 0 ) { mbedtls_ssl_session_free( &session ); if( ret == MBEDTLS_ERR_SSL_INVALID_MAC ) MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is not authentic" ) ); else if( ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED ) MBEDTLS_SSL_DEBUG_MSG( 3, ( "ticket is expired" ) ); else MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_parse", ret ); return( 0 ); } /* * Keep the session ID sent by the client, since we MUST send it back to * inform them we're accepting the ticket (RFC 5077 section 3.4) */ session.id_len = ssl->session_negotiate->id_len; memcpy( &session.id, ssl->session_negotiate->id, session.id_len ); mbedtls_ssl_session_free( ssl->session_negotiate ); memcpy( ssl->session_negotiate, &session, sizeof( mbedtls_ssl_session ) ); /* Zeroize instead of free as we copied the content */ mbedtls_platform_zeroize( &session, sizeof( mbedtls_ssl_session ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from ticket" ) ); ssl->handshake->resume = 1; /* Don't send a new ticket after all, this one is OK */ ssl->handshake->new_session_ticket = 0; return( 0 ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_ALPN) static int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ) { size_t list_len, cur_len, ours_len; const unsigned char *theirs, *start, *end; const char **ours; /* If ALPN not configured, just ignore the extension */ if( ssl->conf->alpn_list == NULL ) return( 0 ); /* * opaque ProtocolName<1..2^8-1>; * * struct { * ProtocolName protocol_name_list<2..2^16-1> * } ProtocolNameList; */ /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */ if( len < 4 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } list_len = ( buf[0] << 8 ) | buf[1]; if( list_len != len - 2 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* * Validate peer's list (lengths) */ start = buf + 2; end = buf + len; for( theirs = start; theirs != end; theirs += cur_len ) { cur_len = *theirs++; /* Current identifier must fit in list */ if( cur_len > (size_t)( end - theirs ) ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* Empty strings MUST NOT be included */ if( cur_len == 0 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } } /* * Use our order of preference */ for( ours = ssl->conf->alpn_list; *ours != NULL; ours++ ) { ours_len = strlen( *ours ); for( theirs = start; theirs != end; theirs += cur_len ) { cur_len = *theirs++; if( cur_len == ours_len && memcmp( theirs, *ours, cur_len ) == 0 ) { ssl->alpn_chosen = *ours; return( 0 ); } } } /* If we get there, no match was found */ mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #endif /* MBEDTLS_SSL_ALPN */ /* * Auxiliary functions for ServerHello parsing and related actions */ #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * Return 0 if the given key uses one of the acceptable curves, -1 otherwise */ #if defined(MBEDTLS_ECDSA_C) static int ssl_check_key_curve( mbedtls_pk_context *pk, const mbedtls_ecp_curve_info **curves ) { const mbedtls_ecp_curve_info **crv = curves; mbedtls_ecp_group_id grp_id = mbedtls_pk_ec( *pk )->grp.id; while( *crv != NULL ) { if( (*crv)->grp_id == grp_id ) return( 0 ); crv++; } return( -1 ); } #endif /* MBEDTLS_ECDSA_C */ /* * Try picking a certificate for this ciphersuite, * return 0 on success and -1 on failure. */ static int ssl_pick_cert( mbedtls_ssl_context *ssl, const mbedtls_ssl_ciphersuite_t * ciphersuite_info ) { mbedtls_ssl_key_cert *cur, *list, *fallback = NULL; mbedtls_pk_type_t pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ); uint32_t flags; #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) if( ssl->handshake->sni_key_cert != NULL ) list = ssl->handshake->sni_key_cert; else #endif list = ssl->conf->key_cert; if( pk_alg == MBEDTLS_PK_NONE ) return( 0 ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite requires certificate" ) ); if( list == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "server has no certificate" ) ); return( -1 ); } for( cur = list; cur != NULL; cur = cur->next ) { MBEDTLS_SSL_DEBUG_CRT( 3, "candidate certificate chain, certificate", cur->cert ); if( ! mbedtls_pk_can_do( &cur->cert->pk, pk_alg ) ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: key type" ) ); continue; } /* * This avoids sending the client a cert it'll reject based on * keyUsage or other extensions. * * It also allows the user to provision different certificates for * different uses based on keyUsage, eg if they want to avoid signing * and decrypting with the same RSA key. */ if( mbedtls_ssl_check_cert_usage( cur->cert, ciphersuite_info, MBEDTLS_SSL_IS_SERVER, &flags ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: " "(extended) key usage extension" ) ); continue; } #if defined(MBEDTLS_ECDSA_C) if( pk_alg == MBEDTLS_PK_ECDSA && ssl_check_key_curve( &cur->cert->pk, ssl->handshake->curves ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate mismatch: elliptic curve" ) ); continue; } #endif /* * Try to select a SHA-1 certificate for pre-1.2 clients, but still * present them a SHA-higher cert rather than failing if it's the only * one we got that satisfies the other conditions. */ if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 && cur->cert->sig_md != MBEDTLS_MD_SHA1 ) { if( fallback == NULL ) fallback = cur; { MBEDTLS_SSL_DEBUG_MSG( 3, ( "certificate not preferred: " "sha-2 with pre-TLS 1.2 client" ) ); continue; } } /* If we get there, we got a winner */ break; } if( cur == NULL ) cur = fallback; /* Do not update ssl->handshake->key_cert unless there is a match */ if( cur != NULL ) { ssl->handshake->key_cert = cur; MBEDTLS_SSL_DEBUG_CRT( 3, "selected certificate chain, certificate", ssl->handshake->key_cert->cert ); return( 0 ); } return( -1 ); } #endif /* MBEDTLS_X509_CRT_PARSE_C */ /* * Check if a given ciphersuite is suitable for use with our config/keys/etc * Sets ciphersuite_info only if the suite matches. */ static int ssl_ciphersuite_match( mbedtls_ssl_context *ssl, int suite_id, const mbedtls_ssl_ciphersuite_t **ciphersuite_info ) { const mbedtls_ssl_ciphersuite_t *suite_info; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) mbedtls_pk_type_t sig_type; #endif suite_info = mbedtls_ssl_ciphersuite_from_id( suite_id ); if( suite_info == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "trying ciphersuite: %s", suite_info->name ) ); if( suite_info->min_minor_ver > ssl->minor_ver || suite_info->max_minor_ver < ssl->minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: version" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) ) return( 0 ); #endif #if defined(MBEDTLS_ARC4_C) if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED && suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: rc4" ) ); return( 0 ); } #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE && ( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK ) == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: ecjpake " "not configured or ext missing" ) ); return( 0 ); } #endif #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) if( mbedtls_ssl_ciphersuite_uses_ec( suite_info ) && ( ssl->handshake->curves == NULL || ssl->handshake->curves[0] == NULL ) ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: " "no common elliptic curve" ) ); return( 0 ); } #endif #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) /* If the ciphersuite requires a pre-shared key and we don't * have one, skip it now rather than failing later */ if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) && ssl->conf->f_psk == NULL && ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL || ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no pre-shared key" ) ); return( 0 ); } #endif #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* If the ciphersuite requires signing, check whether * a suitable hash algorithm is present. */ if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { sig_type = mbedtls_ssl_get_ciphersuite_sig_alg( suite_info ); if( sig_type != MBEDTLS_PK_NONE && mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_type ) == MBEDTLS_MD_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: no suitable hash algorithm " "for signature algorithm %d", sig_type ) ); return( 0 ); } } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_X509_CRT_PARSE_C) /* * Final check: if ciphersuite requires us to have a * certificate/key of a particular type: * - select the appropriate certificate if we have one, or * - try the next ciphersuite if we don't * This must be done last since we modify the key_cert list. */ if( ssl_pick_cert( ssl, suite_info ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciphersuite mismatch: " "no suitable certificate" ) ); return( 0 ); } #endif *ciphersuite_info = suite_info; return( 0 ); } #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) static int ssl_parse_client_hello_v2( mbedtls_ssl_context *ssl ) { int ret, got_common_suite; unsigned int i, j; size_t n; unsigned int ciph_len, sess_len, chal_len; unsigned char *buf, *p; const int *ciphersuites; const mbedtls_ssl_ciphersuite_t *ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello v2" ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "client hello v2 illegal for renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ buf = ssl->in_hdr; MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, 5 ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d", buf[2] ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d", ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]", buf[3], buf[4] ) ); /* * SSLv2 Client Hello * * Record layer: * 0 . 1 message length * * SSL layer: * 2 . 2 message type * 3 . 4 protocol version */ if( buf[2] != MBEDTLS_SSL_HS_CLIENT_HELLO || buf[3] != MBEDTLS_SSL_MAJOR_VERSION_3 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF; if( n < 17 || n > 512 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3; ssl->minor_ver = ( buf[4] <= ssl->conf->max_minor_ver ) ? buf[4] : ssl->conf->max_minor_ver; if( ssl->minor_ver < ssl->conf->min_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum" " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver, ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); } ssl->handshake->max_major_ver = buf[3]; ssl->handshake->max_minor_ver = buf[4]; if( ( ret = mbedtls_ssl_fetch_input( ssl, 2 + n ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } ssl->handshake->update_checksum( ssl, buf + 2, n ); buf = ssl->in_msg; n = ssl->in_left - 5; /* * 0 . 1 ciphersuitelist length * 2 . 3 session id length * 4 . 5 challenge length * 6 . .. ciphersuitelist * .. . .. session id * .. . .. challenge */ MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, n ); ciph_len = ( buf[0] << 8 ) | buf[1]; sess_len = ( buf[2] << 8 ) | buf[3]; chal_len = ( buf[4] << 8 ) | buf[5]; MBEDTLS_SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d", ciph_len, sess_len, chal_len ) ); /* * Make sure each parameter length is valid */ if( ciph_len < 3 || ( ciph_len % 3 ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( sess_len > 32 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( chal_len < 8 || chal_len > 32 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( n != 6 + ciph_len + sess_len + chal_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist", buf + 6, ciph_len ); MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 6 + ciph_len, sess_len ); MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, challenge", buf + 6 + ciph_len + sess_len, chal_len ); p = buf + 6 + ciph_len; ssl->session_negotiate->id_len = sess_len; memset( ssl->session_negotiate->id, 0, sizeof( ssl->session_negotiate->id ) ); memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->id_len ); p += sess_len; memset( ssl->handshake->randbytes, 0, 64 ); memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len ); /* * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV */ for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 ) { if( p[0] == 0 && p[1] == 0 && p[2] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV " "during renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #endif /* MBEDTLS_SSL_RENEGOTIATION */ ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; break; } } #if defined(MBEDTLS_SSL_FALLBACK_SCSV) for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 ) { if( p[0] == 0 && p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) && p[2] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "received FALLBACK_SCSV" ) ); if( ssl->minor_ver < ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } break; } } #endif /* MBEDTLS_SSL_FALLBACK_SCSV */ got_common_suite = 0; ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; ciphersuite_info = NULL; #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 ) for( i = 0; ciphersuites[i] != 0; i++ ) #else for( i = 0; ciphersuites[i] != 0; i++ ) for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 ) #endif { if( p[0] != 0 || p[1] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) || p[2] != ( ( ciphersuites[i] ) & 0xFF ) ) continue; got_common_suite = 1; if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i], &ciphersuite_info ) ) != 0 ) return( ret ); if( ciphersuite_info != NULL ) goto have_ciphersuite_v2; } if( got_common_suite ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, " "but none of them usable" ) ); return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE ); } else { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) ); return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN ); } have_ciphersuite_v2: MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) ); ssl->session_negotiate->ciphersuite = ciphersuites[i]; ssl->transform_negotiate->ciphersuite_info = ciphersuite_info; /* * SSLv2 Client Hello relevant renegotiation security checks */ if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->in_left = 0; ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello v2" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */ /* This function doesn't alert on errors that happen early during ClientHello parsing because they might indicate that the client is not talking SSL/TLS at all and would not understand our alert. */ static int ssl_parse_client_hello( mbedtls_ssl_context *ssl ) { int ret, got_common_suite; size_t i, j; size_t ciph_offset, comp_offset, ext_offset; size_t msg_len, ciph_len, sess_len, comp_len, ext_len; #if defined(MBEDTLS_SSL_PROTO_DTLS) size_t cookie_offset, cookie_len; #endif unsigned char *buf, *p, *ext; #if defined(MBEDTLS_SSL_RENEGOTIATION) int renegotiation_info_seen = 0; #endif int handshake_failure = 0; const int *ciphersuites; const mbedtls_ssl_ciphersuite_t *ciphersuite_info; int major, minor; /* If there is no signature-algorithm extension present, * we need to fall back to the default values for allowed * signature-hash pairs. */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) int sig_hash_alg_ext_present = 0; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) ); #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) read_record_header: #endif /* * If renegotiating, then the input was read with mbedtls_ssl_read_record(), * otherwise read it ourselves manually in order to support SSLv2 * ClientHello, which doesn't use the same record layer format. */ #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) #endif { if( ( ret = mbedtls_ssl_fetch_input( ssl, 5 ) ) != 0 ) { /* No alert on a read error. */ MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } } buf = ssl->in_hdr; #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_STREAM ) #endif if( ( buf[0] & 0x80 ) != 0 ) return( ssl_parse_client_hello_v2( ssl ) ); #endif MBEDTLS_SSL_DEBUG_BUF( 4, "record header", buf, mbedtls_ssl_hdr_len( ssl ) ); /* * SSLv3/TLS Client Hello * * Record layer: * 0 . 0 message type * 1 . 2 protocol version * 3 . 11 DTLS: epoch + record sequence number * 3 . 4 message length */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d", buf[0] ) ); if( buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d", ( ssl->in_len[0] << 8 ) | ssl->in_len[1] ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, protocol version: [%d:%d]", buf[1], buf[2] ) ); mbedtls_ssl_read_version( &major, &minor, ssl->conf->transport, buf + 1 ); /* According to RFC 5246 Appendix E.1, the version here is typically * "{03,00}, the lowest version number supported by the client, [or] the * value of ClientHello.client_version", so the only meaningful check here * is the major version shouldn't be less than 3 */ if( major < MBEDTLS_SSL_MAJOR_VERSION_3 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* For DTLS if this is the initial handshake, remember the client sequence * number to use it in our next message (RFC 6347 4.2.1) */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM #if defined(MBEDTLS_SSL_RENEGOTIATION) && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE #endif ) { /* Epoch should be 0 for initial handshakes */ if( ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } memcpy( ssl->cur_out_ctr + 2, ssl->in_ctr + 2, 6 ); #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) if( mbedtls_ssl_dtls_replay_check( ssl ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "replayed record, discarding" ) ); ssl->next_record_offset = 0; ssl->in_left = 0; goto read_record_header; } /* No MAC to check yet, so we can update right now */ mbedtls_ssl_dtls_replay_update( ssl ); #endif } #endif /* MBEDTLS_SSL_PROTO_DTLS */ msg_len = ( ssl->in_len[0] << 8 ) | ssl->in_len[1]; #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { /* Set by mbedtls_ssl_read_record() */ msg_len = ssl->in_hslen; } else #endif { if( msg_len > MBEDTLS_SSL_IN_CONTENT_LEN ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) + msg_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_fetch_input", ret ); return( ret ); } /* Done reading this record, get ready for the next one */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) ssl->next_record_offset = msg_len + mbedtls_ssl_hdr_len( ssl ); else #endif ssl->in_left = 0; } buf = ssl->in_msg; MBEDTLS_SSL_DEBUG_BUF( 4, "record contents", buf, msg_len ); ssl->handshake->update_checksum( ssl, buf, msg_len ); /* * Handshake layer: * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 5 DTLS only: message seqence number * 6 . 8 DTLS only: fragment offset * 9 . 11 DTLS only: fragment length */ if( msg_len < mbedtls_ssl_hs_hdr_len( ssl ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d", buf[0] ) ); if( buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d", ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) ); /* We don't support fragmentation of ClientHello (yet?) */ if( buf[1] != 0 || msg_len != mbedtls_ssl_hs_hdr_len( ssl ) + ( ( buf[2] << 8 ) | buf[3] ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { /* * Copy the client's handshake message_seq on initial handshakes, * check sequence number on renego. */ #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { /* This couldn't be done in ssl_prepare_handshake_record() */ unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; if( cli_msg_seq != ssl->handshake->in_msg_seq ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message_seq: " "%d (expected %d)", cli_msg_seq, ssl->handshake->in_msg_seq ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ssl->handshake->in_msg_seq++; } else #endif { unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5]; ssl->handshake->out_msg_seq = cli_msg_seq; ssl->handshake->in_msg_seq = cli_msg_seq + 1; } /* * For now we don't support fragmentation, so make sure * fragment_offset == 0 and fragment_length == length */ if( ssl->in_msg[6] != 0 || ssl->in_msg[7] != 0 || ssl->in_msg[8] != 0 || memcmp( ssl->in_msg + 1, ssl->in_msg + 9, 3 ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "ClientHello fragmentation not supported" ) ); return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE ); } } #endif /* MBEDTLS_SSL_PROTO_DTLS */ buf += mbedtls_ssl_hs_hdr_len( ssl ); msg_len -= mbedtls_ssl_hs_hdr_len( ssl ); /* * ClientHello layer: * 0 . 1 protocol version * 2 . 33 random bytes (starting with 4 bytes of Unix time) * 34 . 35 session id length (1 byte) * 35 . 34+x session id * 35+x . 35+x DTLS only: cookie length (1 byte) * 36+x . .. DTLS only: cookie * .. . .. ciphersuite list length (2 bytes) * .. . .. ciphersuite list * .. . .. compression alg. list length (1 byte) * .. . .. compression alg. list * .. . .. extensions length (2 bytes, optional) * .. . .. extensions (optional) */ /* * Minimal length (with everything empty and extensions ommitted) is * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can * read at least up to session id length without worrying. */ if( msg_len < 38 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* * Check and save the protocol version */ MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, version", buf, 2 ); mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver, ssl->conf->transport, buf ); ssl->handshake->max_major_ver = ssl->major_ver; ssl->handshake->max_minor_ver = ssl->minor_ver; if( ssl->major_ver < ssl->conf->min_major_ver || ssl->minor_ver < ssl->conf->min_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "client only supports ssl smaller than minimum" " [%d:%d] < [%d:%d]", ssl->major_ver, ssl->minor_ver, ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION ); } if( ssl->major_ver > ssl->conf->max_major_ver ) { ssl->major_ver = ssl->conf->max_major_ver; ssl->minor_ver = ssl->conf->max_minor_ver; } else if( ssl->minor_ver > ssl->conf->max_minor_ver ) ssl->minor_ver = ssl->conf->max_minor_ver; /* * Save client random (inc. Unix time) */ MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 2, 32 ); memcpy( ssl->handshake->randbytes, buf + 2, 32 ); /* * Check the session ID length and save session ID */ sess_len = buf[34]; if( sess_len > sizeof( ssl->session_negotiate->id ) || sess_len + 34 + 2 > msg_len ) /* 2 for cipherlist length field */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, session id", buf + 35, sess_len ); ssl->session_negotiate->id_len = sess_len; memset( ssl->session_negotiate->id, 0, sizeof( ssl->session_negotiate->id ) ); memcpy( ssl->session_negotiate->id, buf + 35, ssl->session_negotiate->id_len ); /* * Check the cookie length and content */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { cookie_offset = 35 + sess_len; cookie_len = buf[cookie_offset]; if( cookie_offset + 1 + cookie_len + 2 > msg_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, cookie", buf + cookie_offset + 1, cookie_len ); #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) if( ssl->conf->f_cookie_check != NULL #if defined(MBEDTLS_SSL_RENEGOTIATION) && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE #endif ) { if( ssl->conf->f_cookie_check( ssl->conf->p_cookie, buf + cookie_offset + 1, cookie_len, ssl->cli_id, ssl->cli_id_len ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification failed" ) ); ssl->handshake->verify_cookie_len = 1; } else { MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification passed" ) ); ssl->handshake->verify_cookie_len = 0; } } else #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ { /* We know we didn't send a cookie, so it should be empty */ if( cookie_len != 0 ) { /* This may be an attacker's probe, so don't send an alert */ MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "cookie verification skipped" ) ); } /* * Check the ciphersuitelist length (will be parsed later) */ ciph_offset = cookie_offset + 1 + cookie_len; } else #endif /* MBEDTLS_SSL_PROTO_DTLS */ ciph_offset = 35 + sess_len; ciph_len = ( buf[ciph_offset + 0] << 8 ) | ( buf[ciph_offset + 1] ); if( ciph_len < 2 || ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */ ( ciph_len % 2 ) != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist", buf + ciph_offset + 2, ciph_len ); /* * Check the compression algorithms length and pick one */ comp_offset = ciph_offset + 2 + ciph_len; comp_len = buf[comp_offset]; if( comp_len < 1 || comp_len > 16 || comp_len + comp_offset + 1 > msg_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } MBEDTLS_SSL_DEBUG_BUF( 3, "client hello, compression", buf + comp_offset + 1, comp_len ); ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL; #if defined(MBEDTLS_ZLIB_SUPPORT) for( i = 0; i < comp_len; ++i ) { if( buf[comp_offset + 1 + i] == MBEDTLS_SSL_COMPRESS_DEFLATE ) { ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_DEFLATE; break; } } #endif /* See comments in ssl_write_client_hello() */ #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL; #endif /* Do not parse the extensions if the protocol is SSLv3 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) ) { #endif /* * Check the extension length */ ext_offset = comp_offset + 1 + comp_len; if( msg_len > ext_offset ) { if( msg_len < ext_offset + 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ext_len = ( buf[ext_offset + 0] << 8 ) | ( buf[ext_offset + 1] ); if( ( ext_len > 0 && ext_len < 4 ) || msg_len != ext_offset + 2 + ext_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } } else ext_len = 0; ext = buf + ext_offset + 2; MBEDTLS_SSL_DEBUG_BUF( 3, "client hello extensions", ext, ext_len ); while( ext_len != 0 ) { unsigned int ext_id; unsigned int ext_size; if ( ext_len < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } ext_id = ( ( ext[0] << 8 ) | ( ext[1] ) ); ext_size = ( ( ext[2] << 8 ) | ( ext[3] ) ); if( ext_size + 4 > ext_len ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } switch( ext_id ) { #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) case MBEDTLS_TLS_EXT_SERVERNAME: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ServerName extension" ) ); if( ssl->conf->f_sni == NULL ) break; ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found renegotiation extension" ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) renegotiation_info_seen = 1; #endif ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) case MBEDTLS_TLS_EXT_SIG_ALG: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found signature_algorithms extension" ) ); ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); sig_hash_alg_ext_present = 1; break; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported elliptic curves extension" ) ); ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found supported point formats extension" ) ); ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT; ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) case MBEDTLS_TLS_EXT_ECJPAKE_KKPP: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found ecjpake kkpp extension" ) ); ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found max fragment length extension" ) ); ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) case MBEDTLS_TLS_EXT_TRUNCATED_HMAC: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found truncated hmac extension" ) ); ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found encrypt then mac extension" ) ); ret = ssl_parse_encrypt_then_mac_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found extended master secret extension" ) ); ret = ssl_parse_extended_ms_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) case MBEDTLS_TLS_EXT_SESSION_TICKET: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found session ticket extension" ) ); ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_SESSION_TICKETS */ #if defined(MBEDTLS_SSL_ALPN) case MBEDTLS_TLS_EXT_ALPN: MBEDTLS_SSL_DEBUG_MSG( 3, ( "found alpn extension" ) ); ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ); if( ret != 0 ) return( ret ); break; #endif /* MBEDTLS_SSL_SESSION_TICKETS */ default: MBEDTLS_SSL_DEBUG_MSG( 3, ( "unknown extension found: %d (ignoring)", ext_id ) ); } ext_len -= 4 + ext_size; ext += 4 + ext_size; if( ext_len > 0 && ext_len < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client hello message" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } } #if defined(MBEDTLS_SSL_PROTO_SSL3) } #endif #if defined(MBEDTLS_SSL_FALLBACK_SCSV) for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 ) { if( p[0] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) && p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE ) & 0xff ) ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "received FALLBACK_SCSV" ) ); if( ssl->minor_ver < ssl->conf->max_minor_ver ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "inapropriate fallback" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } break; } } #endif /* MBEDTLS_SSL_FALLBACK_SCSV */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) /* * Try to fall back to default hash SHA1 if the client * hasn't provided any preferred signature-hash combinations. */ if( sig_hash_alg_ext_present == 0 ) { mbedtls_md_type_t md_default = MBEDTLS_MD_SHA1; if( mbedtls_ssl_check_sig_hash( ssl, md_default ) != 0 ) md_default = MBEDTLS_MD_NONE; mbedtls_ssl_sig_hash_set_const_hash( &ssl->handshake->hash_algs, md_default ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 && MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */ /* * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV */ for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 ) { if( p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "received TLS_EMPTY_RENEGOTIATION_INFO " ) ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "received RENEGOTIATION SCSV " "during renegotiation" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } #endif ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION; break; } } /* * Renegotiation security checks */ if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation, breaking off handshake" ) ); handshake_failure = 1; } #if defined(MBEDTLS_SSL_RENEGOTIATION) else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION && renegotiation_info_seen == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension missing (secure)" ) ); handshake_failure = 1; } else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "legacy renegotiation not allowed" ) ); handshake_failure = 1; } else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS && ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION && renegotiation_info_seen == 1 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "renegotiation_info extension present (legacy)" ) ); handshake_failure = 1; } #endif /* MBEDTLS_SSL_RENEGOTIATION */ if( handshake_failure == 1 ) { mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO ); } /* * Search for a matching ciphersuite * (At the end because we need information from the EC-based extensions * and certificate from the SNI callback triggered by the SNI extension.) */ got_common_suite = 0; ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver]; ciphersuite_info = NULL; #if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE) for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 ) for( i = 0; ciphersuites[i] != 0; i++ ) #else for( i = 0; ciphersuites[i] != 0; i++ ) for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 ) #endif { if( p[0] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) || p[1] != ( ( ciphersuites[i] ) & 0xFF ) ) continue; got_common_suite = 1; if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i], &ciphersuite_info ) ) != 0 ) return( ret ); if( ciphersuite_info != NULL ) goto have_ciphersuite; } if( got_common_suite ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got ciphersuites in common, " "but none of them usable" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE ); } else { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ); return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN ); } have_ciphersuite: MBEDTLS_SSL_DEBUG_MSG( 2, ( "selected ciphersuite: %s", ciphersuite_info->name ) ); ssl->session_negotiate->ciphersuite = ciphersuites[i]; ssl->transform_negotiate->ciphersuite_info = ciphersuite_info; ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_recv_flight_completed( ssl ); #endif /* Debugging-only output for testsuite */ #if defined(MBEDTLS_DEBUG_C) && \ defined(MBEDTLS_SSL_PROTO_TLS1_2) && \ defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg( ciphersuite_info ); if( sig_alg != MBEDTLS_PK_NONE ) { mbedtls_md_type_t md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_alg ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "client hello v3, signature_algorithm ext: %d", mbedtls_ssl_hash_from_md_alg( md_alg ) ) ); } else { MBEDTLS_SSL_DEBUG_MSG( 3, ( "no hash algorithm for signature algorithm " "%d - should not happen", sig_alg ) ); } } #endif MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) ); return( 0 ); } #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) static void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->session_negotiate->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding truncated hmac extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) static void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; const mbedtls_ssl_ciphersuite_t *suite = NULL; const mbedtls_cipher_info_t *cipher = NULL; if( ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { *olen = 0; return; } /* * RFC 7366: "If a server receives an encrypt-then-MAC request extension * from a client and then selects a stream or Authenticated Encryption * with Associated Data (AEAD) ciphersuite, it MUST NOT send an * encrypt-then-MAC response extension back to the client." */ if( ( suite = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite ) ) == NULL || ( cipher = mbedtls_cipher_info_from_type( suite->cipher ) ) == NULL || cipher->mode != MBEDTLS_MODE_CBC ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding encrypt then mac extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) static void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED || ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding extended master secret " "extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->handshake->new_session_ticket == 0 ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding session ticket extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET ) & 0xFF ); *p++ = 0x00; *p++ = 0x00; *olen = 4; } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ static void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, secure renegotiation extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO ) & 0xFF ); #if defined(MBEDTLS_SSL_RENEGOTIATION) if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) { *p++ = 0x00; *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF; *p++ = ssl->verify_data_len * 2 & 0xFF; memcpy( p, ssl->peer_verify_data, ssl->verify_data_len ); p += ssl->verify_data_len; memcpy( p, ssl->own_verify_data, ssl->verify_data_len ); p += ssl->verify_data_len; } else #endif /* MBEDTLS_SSL_RENEGOTIATION */ { *p++ = 0x00; *p++ = 0x01; *p++ = 0x00; } *olen = p - buf; } #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) static void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; if( ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, max_fragment_length extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH ) & 0xFF ); *p++ = 0x00; *p++ = 1; *p++ = ssl->session_negotiate->mfl_code; *olen = 5; } #endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { unsigned char *p = buf; ((void) ssl); if( ( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT ) == 0 ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, supported_point_formats extension" ) ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS ) & 0xFF ); *p++ = 0x00; *p++ = 2; *p++ = 1; *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED; *olen = 6; } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) static void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { int ret; unsigned char *p = buf; const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; size_t kkpp_len; *olen = 0; /* Skip costly computation if not needed */ if( ssl->transform_negotiate->ciphersuite_info->key_exchange != MBEDTLS_KEY_EXCHANGE_ECJPAKE ) return; MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, ecjpake kkpp extension" ) ); if( end - p < 4 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "buffer too small" ) ); return; } *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP ) & 0xFF ); ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx, p + 2, end - p - 2, &kkpp_len, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1 , "mbedtls_ecjpake_write_round_one", ret ); return; } *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( kkpp_len ) & 0xFF ); *olen = kkpp_len + 4; } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ #if defined(MBEDTLS_SSL_ALPN ) static void ssl_write_alpn_ext( mbedtls_ssl_context *ssl, unsigned char *buf, size_t *olen ) { if( ssl->alpn_chosen == NULL ) { *olen = 0; return; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, adding alpn extension" ) ); /* * 0 . 1 ext identifier * 2 . 3 ext length * 4 . 5 protocol list length * 6 . 6 protocol name length * 7 . 7+n protocol name */ buf[0] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF ); buf[1] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN ) & 0xFF ); *olen = 7 + strlen( ssl->alpn_chosen ); buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF ); buf[3] = (unsigned char)( ( ( *olen - 4 ) ) & 0xFF ); buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF ); buf[5] = (unsigned char)( ( ( *olen - 6 ) ) & 0xFF ); buf[6] = (unsigned char)( ( ( *olen - 7 ) ) & 0xFF ); memcpy( buf + 7, ssl->alpn_chosen, *olen - 7 ); } #endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */ #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) static int ssl_write_hello_verify_request( mbedtls_ssl_context *ssl ) { int ret; unsigned char *p = ssl->out_msg + 4; unsigned char *cookie_len_byte; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write hello verify request" ) ); /* * struct { * ProtocolVersion server_version; * opaque cookie<0..2^8-1>; * } HelloVerifyRequest; */ /* The RFC is not clear on this point, but sending the actual negotiated * version looks like the most interoperable thing to do. */ mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, p ); MBEDTLS_SSL_DEBUG_BUF( 3, "server version", p, 2 ); p += 2; /* If we get here, f_cookie_check is not null */ if( ssl->conf->f_cookie_write == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "inconsistent cookie callbacks" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } /* Skip length byte until we know the length */ cookie_len_byte = p++; if( ( ret = ssl->conf->f_cookie_write( ssl->conf->p_cookie, &p, ssl->out_buf + MBEDTLS_SSL_OUT_BUFFER_LEN, ssl->cli_id, ssl->cli_id_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "f_cookie_write", ret ); return( ret ); } *cookie_len_byte = (unsigned char)( p - ( cookie_len_byte + 1 ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "cookie sent", cookie_len_byte + 1, *cookie_len_byte ); ssl->out_msglen = p - ssl->out_msg; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST; ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write hello verify request" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ static int ssl_write_server_hello( mbedtls_ssl_context *ssl ) { #if defined(MBEDTLS_HAVE_TIME) mbedtls_time_t t; #endif int ret; size_t olen, ext_len = 0, n; unsigned char *buf, *p; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello" ) ); #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->verify_cookie_len != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "client hello was not authenticated" ) ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) ); return( ssl_write_hello_verify_request( ssl ) ); } #endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */ if( ssl->conf->f_rng == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "no RNG provided") ); return( MBEDTLS_ERR_SSL_NO_RNG ); } /* * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 5 protocol version * 6 . 9 UNIX time() * 10 . 37 random bytes */ buf = ssl->out_msg; p = buf + 4; mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver, ssl->conf->transport, p ); p += 2; MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]", buf[4], buf[5] ) ); #if defined(MBEDTLS_HAVE_TIME) t = mbedtls_time( NULL ); *p++ = (unsigned char)( t >> 24 ); *p++ = (unsigned char)( t >> 16 ); *p++ = (unsigned char)( t >> 8 ); *p++ = (unsigned char)( t ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) ); #else if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 ) return( ret ); p += 4; #endif /* MBEDTLS_HAVE_TIME */ if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 ) return( ret ); p += 28; memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 ); MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 ); /* * Resume is 0 by default, see ssl_handshake_init(). * It may be already set to 1 by ssl_parse_session_ticket_ext(). * If not, try looking up session ID in our cache. */ if( ssl->handshake->resume == 0 && #if defined(MBEDTLS_SSL_RENEGOTIATION) ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE && #endif ssl->session_negotiate->id_len != 0 && ssl->conf->f_get_cache != NULL && ssl->conf->f_get_cache( ssl->conf->p_cache, ssl->session_negotiate ) == 0 ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "session successfully restored from cache" ) ); ssl->handshake->resume = 1; } if( ssl->handshake->resume == 0 ) { /* * New session, create a new session id, * unless we're about to issue a session ticket */ ssl->state++; #if defined(MBEDTLS_HAVE_TIME) ssl->session_negotiate->start = mbedtls_time( NULL ); #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) if( ssl->handshake->new_session_ticket != 0 ) { ssl->session_negotiate->id_len = n = 0; memset( ssl->session_negotiate->id, 0, 32 ); } else #endif /* MBEDTLS_SSL_SESSION_TICKETS */ { ssl->session_negotiate->id_len = n = 32; if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, n ) ) != 0 ) return( ret ); } } else { /* * Resuming a session */ n = ssl->session_negotiate->id_len; ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC; if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); return( ret ); } } /* * 38 . 38 session id length * 39 . 38+n session id * 39+n . 40+n chosen ciphersuite * 41+n . 41+n chosen compression alg. * 42+n . 43+n extensions length * 44+n . 43+n+m extensions */ *p++ = (unsigned char) ssl->session_negotiate->id_len; memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->id_len ); p += ssl->session_negotiate->id_len; MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) ); MBEDTLS_SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "%s session has been resumed", ssl->handshake->resume ? "a" : "no" ) ); *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 ); *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite ); *p++ = (unsigned char)( ssl->session_negotiate->compression ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %s", mbedtls_ssl_get_ciphersuite_name( ssl->session_negotiate->ciphersuite ) ) ); MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: 0x%02X", ssl->session_negotiate->compression ) ); /* Do not write the extensions if the protocol is SSLv3 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) ) { #endif /* * First write extensions, then the total length */ ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_TRUNCATED_HMAC) ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_SESSION_TICKETS) ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \ defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if ( mbedtls_ssl_ciphersuite_uses_ec( mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite ) ) ) { ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; } #endif #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif #if defined(MBEDTLS_SSL_ALPN) ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen ); ext_len += olen; #endif MBEDTLS_SSL_DEBUG_MSG( 3, ( "server hello, total extension length: %d", ext_len ) ); if( ext_len > 0 ) { *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( ext_len ) & 0xFF ); p += ext_len; } #if defined(MBEDTLS_SSL_PROTO_SSL3) } #endif ssl->out_msglen = p - buf; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO; ret = mbedtls_ssl_write_handshake_msg( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello" ) ); return( ret ); } #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) static int ssl_write_certificate_request( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else static int ssl_write_certificate_request( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; size_t dn_size, total_dn_size; /* excluding length bytes */ size_t ct_len, sa_len; /* including length bytes */ unsigned char *buf, *p; const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN; const mbedtls_x509_crt *crt; int authmode; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) ); ssl->state++; #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET ) authmode = ssl->handshake->sni_authmode; else #endif authmode = ssl->conf->authmode; if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE || authmode == MBEDTLS_SSL_VERIFY_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) ); return( 0 ); } /* * 0 . 0 handshake type * 1 . 3 handshake length * 4 . 4 cert type count * 5 .. m-1 cert types * m .. m+1 sig alg length (TLS 1.2 only) * m+1 .. n-1 SignatureAndHashAlgorithms (TLS 1.2 only) * n .. n+1 length of all DNs * n+2 .. n+3 length of DN 1 * n+4 .. ... Distinguished Name #1 * ... .. ... length of DN 2, etc. */ buf = ssl->out_msg; p = buf + 4; /* * Supported certificate types * * ClientCertificateType certificate_types<1..2^8-1>; * enum { (255) } ClientCertificateType; */ ct_len = 0; #if defined(MBEDTLS_RSA_C) p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN; #endif #if defined(MBEDTLS_ECDSA_C) p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN; #endif p[0] = (unsigned char) ct_len++; p += ct_len; sa_len = 0; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) /* * Add signature_algorithms for verify (TLS 1.2) * * SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>; * * struct { * HashAlgorithm hash; * SignatureAlgorithm signature; * } SignatureAndHashAlgorithm; * * enum { (255) } HashAlgorithm; * enum { (255) } SignatureAlgorithm; */ if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { const int *cur; /* * Supported signature algorithms */ for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ ) { unsigned char hash = mbedtls_ssl_hash_from_md_alg( *cur ); if( MBEDTLS_SSL_HASH_NONE == hash || mbedtls_ssl_set_calc_verify_md( ssl, hash ) ) continue; #if defined(MBEDTLS_RSA_C) p[2 + sa_len++] = hash; p[2 + sa_len++] = MBEDTLS_SSL_SIG_RSA; #endif #if defined(MBEDTLS_ECDSA_C) p[2 + sa_len++] = hash; p[2 + sa_len++] = MBEDTLS_SSL_SIG_ECDSA; #endif } p[0] = (unsigned char)( sa_len >> 8 ); p[1] = (unsigned char)( sa_len ); sa_len += 2; p += sa_len; } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ /* * DistinguishedName certificate_authorities<0..2^16-1>; * opaque DistinguishedName<1..2^16-1>; */ p += 2; total_dn_size = 0; if( ssl->conf->cert_req_ca_list == MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED ) { #if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) if( ssl->handshake->sni_ca_chain != NULL ) crt = ssl->handshake->sni_ca_chain; else #endif crt = ssl->conf->ca_chain; while( crt != NULL && crt->version != 0 ) { dn_size = crt->subject_raw.len; if( end < p || (size_t)( end - p ) < dn_size || (size_t)( end - p ) < 2 + dn_size ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "skipping CAs: buffer too short" ) ); break; } *p++ = (unsigned char)( dn_size >> 8 ); *p++ = (unsigned char)( dn_size ); memcpy( p, crt->subject_raw.p, dn_size ); p += dn_size; MBEDTLS_SSL_DEBUG_BUF( 3, "requested DN", p - dn_size, dn_size ); total_dn_size += 2 + dn_size; crt = crt->next; } } ssl->out_msglen = p - buf; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST; ssl->out_msg[4 + ct_len + sa_len] = (unsigned char)( total_dn_size >> 8 ); ssl->out_msg[5 + ct_len + sa_len] = (unsigned char)( total_dn_size ); ret = mbedtls_ssl_write_handshake_msg( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) ); return( ret ); } #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) static int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl ) { int ret; if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECKEY ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server key not ECDH capable" ) ); return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH ); } if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, mbedtls_pk_ec( *mbedtls_ssl_own_key( ssl ) ), MBEDTLS_ECDH_OURS ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ecdh_get_params" ), ret ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && \ defined(MBEDTLS_SSL_ASYNC_PRIVATE) static int ssl_resume_server_key_exchange( mbedtls_ssl_context *ssl, size_t *signature_len ) { /* Append the signature to ssl->out_msg, leaving 2 bytes for the * signature length which will be added in ssl_write_server_key_exchange * after the call to ssl_prepare_server_key_exchange. * ssl_write_server_key_exchange also takes care of incrementing * ssl->out_msglen. */ unsigned char *sig_start = ssl->out_msg + ssl->out_msglen + 2; size_t sig_max_len = ( ssl->out_buf + MBEDTLS_SSL_OUT_CONTENT_LEN - sig_start ); int ret = ssl->conf->f_async_resume( ssl, sig_start, signature_len, sig_max_len ); if( ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ) { ssl->handshake->async_in_progress = 0; mbedtls_ssl_set_async_operation_data( ssl, NULL ); } MBEDTLS_SSL_DEBUG_RET( 2, "ssl_resume_server_key_exchange", ret ); return( ret ); } #endif /* defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && defined(MBEDTLS_SSL_ASYNC_PRIVATE) */ /* Prepare the ServerKeyExchange message, up to and including * calculating the signature if any, but excluding formatting the * signature and sending the message. */ static int ssl_prepare_server_key_exchange( mbedtls_ssl_context *ssl, size_t *signature_len ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; #if defined(MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED) #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) unsigned char *dig_signed = NULL; #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ #endif /* MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED */ (void) ciphersuite_info; /* unused in some configurations */ #if !defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) (void) signature_len; #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ ssl->out_msglen = 4; /* header (type:1, length:3) to be written later */ /* * * Part 1: Provide key exchange parameters for chosen ciphersuite. * */ /* * - ECJPAKE key exchanges */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { int ret; size_t len = 0; ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx, ssl->out_msg + ssl->out_msglen, MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, &len, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_write_round_two", ret ); return( ret ); } ssl->out_msglen += len; } #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ /* * For (EC)DHE key exchanges with PSK, parameters are prefixed by support * identity hint (RFC 4279, Sec. 3). Until someone needs this feature, * we use empty support identity hints here. **/ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { ssl->out_msg[ssl->out_msglen++] = 0x00; ssl->out_msg[ssl->out_msglen++] = 0x00; } #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ /* * - DHE key exchanges */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED) if( mbedtls_ssl_ciphersuite_uses_dhe( ciphersuite_info ) ) { int ret; size_t len = 0; if( ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "no DH parameters set" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } /* * Ephemeral DH parameters: * * struct { * opaque dh_p<1..2^16-1>; * opaque dh_g<1..2^16-1>; * opaque dh_Ys<1..2^16-1>; * } ServerDHParams; */ if( ( ret = mbedtls_dhm_set_group( &ssl->handshake->dhm_ctx, &ssl->conf->dhm_P, &ssl->conf->dhm_G ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_set_group", ret ); return( ret ); } if( ( ret = mbedtls_dhm_make_params( &ssl->handshake->dhm_ctx, (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ), ssl->out_msg + ssl->out_msglen, &len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_make_params", ret ); return( ret ); } #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) dig_signed = ssl->out_msg + ssl->out_msglen; #endif ssl->out_msglen += len; MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->handshake->dhm_ctx.X ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->handshake->dhm_ctx.P ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->handshake->dhm_ctx.G ); MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->handshake->dhm_ctx.GX ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED */ /* * - ECDHE key exchanges */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED) if( mbedtls_ssl_ciphersuite_uses_ecdhe( ciphersuite_info ) ) { /* * Ephemeral ECDH parameters: * * struct { * ECParameters curve_params; * ECPoint public; * } ServerECDHParams; */ const mbedtls_ecp_curve_info **curve = NULL; const mbedtls_ecp_group_id *gid; int ret; size_t len = 0; /* Match our preference list against the offered curves */ for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ ) for( curve = ssl->handshake->curves; *curve != NULL; curve++ ) if( (*curve)->grp_id == *gid ) goto curve_matching_done; curve_matching_done: if( curve == NULL || *curve == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "no matching curve for ECDHE" ) ); return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "ECDHE curve: %s", (*curve)->name ) ); if( ( ret = mbedtls_ecdh_setup( &ssl->handshake->ecdh_ctx, (*curve)->grp_id ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecp_group_load", ret ); return( ret ); } if( ( ret = mbedtls_ecdh_make_params( &ssl->handshake->ecdh_ctx, &len, ssl->out_msg + ssl->out_msglen, MBEDTLS_SSL_OUT_CONTENT_LEN - ssl->out_msglen, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_make_params", ret ); return( ret ); } #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) dig_signed = ssl->out_msg + ssl->out_msglen; #endif ssl->out_msglen += len; MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Q ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED */ /* * * Part 2: For key exchanges involving the server signing the * exchange parameters, compute and add the signature here. * */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) ) { size_t dig_signed_len = ssl->out_msg + ssl->out_msglen - dig_signed; size_t hashlen = 0; unsigned char hash[MBEDTLS_MD_MAX_SIZE]; int ret; /* * 2.1: Choose hash algorithm: * A: For TLS 1.2, obey signature-hash-algorithm extension * to choose appropriate hash. * B: For SSL3, TLS1.0, TLS1.1 and ECDHE_ECDSA, use SHA1 * (RFC 4492, Sec. 5.4) * C: Otherwise, use MD5 + SHA1 (RFC 4346, Sec. 7.4.3) */ mbedtls_md_type_t md_alg; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ); if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { /* A: For TLS 1.2, obey signature-hash-algorithm extension * (RFC 5246, Sec. 7.4.1.4.1). */ if( sig_alg == MBEDTLS_PK_NONE || ( md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_alg ) ) == MBEDTLS_MD_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); /* (... because we choose a cipher suite * only if there is a matching hash.) */ return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ) { /* B: Default hash SHA1 */ md_alg = MBEDTLS_MD_SHA1; } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ { /* C: MD5 + SHA1 */ md_alg = MBEDTLS_MD_NONE; } MBEDTLS_SSL_DEBUG_MSG( 3, ( "pick hash algorithm %d for signing", md_alg ) ); /* * 2.2: Compute the hash to be signed */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( md_alg == MBEDTLS_MD_NONE ) { hashlen = 36; ret = mbedtls_ssl_get_key_exchange_md_ssl_tls( ssl, hash, dig_signed, dig_signed_len ); if( ret != 0 ) return( ret ); } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \ MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( md_alg != MBEDTLS_MD_NONE ) { ret = mbedtls_ssl_get_key_exchange_md_tls1_2( ssl, hash, &hashlen, dig_signed, dig_signed_len, md_alg ); if( ret != 0 ) return( ret ); } else #endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \ MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } MBEDTLS_SSL_DEBUG_BUF( 3, "parameters hash", hash, hashlen ); /* * 2.3: Compute and add the signature */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { /* * For TLS 1.2, we need to specify signature and hash algorithm * explicitly through a prefix to the signature. * * struct { * HashAlgorithm hash; * SignatureAlgorithm signature; * } SignatureAndHashAlgorithm; * * struct { * SignatureAndHashAlgorithm algorithm; * opaque signature<0..2^16-1>; * } DigitallySigned; * */ ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_hash_from_md_alg( md_alg ); ssl->out_msg[ssl->out_msglen++] = mbedtls_ssl_sig_from_pk_alg( sig_alg ); } #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if( ssl->conf->f_async_sign_start != NULL ) { ret = ssl->conf->f_async_sign_start( ssl, mbedtls_ssl_own_cert( ssl ), md_alg, hash, hashlen ); switch( ret ) { case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH: /* act as if f_async_sign was null */ break; case 0: ssl->handshake->async_in_progress = 1; return( ssl_resume_server_key_exchange( ssl, signature_len ) ); case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS: ssl->handshake->async_in_progress = 1; return( MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ); default: MBEDTLS_SSL_DEBUG_RET( 1, "f_async_sign_start", ret ); return( ret ); } } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ if( mbedtls_ssl_own_key( ssl ) == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no private key" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } /* Append the signature to ssl->out_msg, leaving 2 bytes for the * signature length which will be added in ssl_write_server_key_exchange * after the call to ssl_prepare_server_key_exchange. * ssl_write_server_key_exchange also takes care of incrementing * ssl->out_msglen. */ if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash, hashlen, ssl->out_msg + ssl->out_msglen + 2, signature_len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_sign", ret ); return( ret ); } } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ return( 0 ); } /* Prepare the ServerKeyExchange message and send it. For ciphersuites * that do not include a ServerKeyExchange message, do nothing. Either * way, if successful, move on to the next step in the SSL state * machine. */ static int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl ) { int ret; size_t signature_len = 0; #if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED) const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; #endif /* MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) ); #if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED) /* Extract static ECDH parameters and abort if ServerKeyExchange * is not needed. */ if( mbedtls_ssl_ciphersuite_no_pfs( ciphersuite_info ) ) { /* For suites involving ECDH, extract DH parameters * from certificate at this point. */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED) if( mbedtls_ssl_ciphersuite_uses_ecdh( ciphersuite_info ) ) { ssl_get_ecdh_params_from_cert( ssl ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED */ /* Key exchanges not involving ephemeral keys don't use * ServerKeyExchange, so end here. */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) ); ssl->state++; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && \ defined(MBEDTLS_SSL_ASYNC_PRIVATE) /* If we have already prepared the message and there is an ongoing * signature operation, resume signing. */ if( ssl->handshake->async_in_progress != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "resuming signature operation" ) ); ret = ssl_resume_server_key_exchange( ssl, &signature_len ); } else #endif /* defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) && defined(MBEDTLS_SSL_ASYNC_PRIVATE) */ { /* ServerKeyExchange is needed. Prepare the message. */ ret = ssl_prepare_server_key_exchange( ssl, &signature_len ); } if( ret != 0 ) { /* If we're starting to write a new message, set ssl->out_msglen * to 0. But if we're resuming after an asynchronous message, * out_msglen is the amount of data written so far and mst be * preserved. */ if( ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ) MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange (pending)" ) ); else ssl->out_msglen = 0; return( ret ); } /* If there is a signature, write its length. * ssl_prepare_server_key_exchange already wrote the signature * itself at its proper place in the output buffer. */ #if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED) if( signature_len != 0 ) { ssl->out_msg[ssl->out_msglen++] = (unsigned char)( signature_len >> 8 ); ssl->out_msg[ssl->out_msglen++] = (unsigned char)( signature_len ); MBEDTLS_SSL_DEBUG_BUF( 3, "my signature", ssl->out_msg + ssl->out_msglen, signature_len ); /* Skip over the already-written signature */ ssl->out_msglen += signature_len; } #endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */ /* Add header and send. */ ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE; ssl->state++; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) ); return( 0 ); } static int ssl_write_server_hello_done( mbedtls_ssl_context *ssl ) { int ret; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) ); ssl->out_msglen = 4; ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_SERVER_HELLO_DONE; ssl->state++; #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) mbedtls_ssl_send_flight_completed( ssl ); #endif if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_flight_transmit", ret ); return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) ); return( 0 ); } #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) static int ssl_parse_client_dh_public( mbedtls_ssl_context *ssl, unsigned char **p, const unsigned char *end ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; size_t n; /* * Receive G^Y mod P, premaster = (G^Y)^X mod P */ if( *p + 2 > end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } n = ( (*p)[0] << 8 ) | (*p)[1]; *p += 2; if( *p + n > end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ( ret = mbedtls_dhm_read_public( &ssl->handshake->dhm_ctx, *p, n ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_read_public", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP ); } *p += n; MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->handshake->dhm_ctx.GY ); return( ret ); } #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) static int ssl_resume_decrypt_pms( mbedtls_ssl_context *ssl, unsigned char *peer_pms, size_t *peer_pmslen, size_t peer_pmssize ) { int ret = ssl->conf->f_async_resume( ssl, peer_pms, peer_pmslen, peer_pmssize ); if( ret != MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ) { ssl->handshake->async_in_progress = 0; mbedtls_ssl_set_async_operation_data( ssl, NULL ); } MBEDTLS_SSL_DEBUG_RET( 2, "ssl_decrypt_encrypted_pms", ret ); return( ret ); } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ static int ssl_decrypt_encrypted_pms( mbedtls_ssl_context *ssl, const unsigned char *p, const unsigned char *end, unsigned char *peer_pms, size_t *peer_pmslen, size_t peer_pmssize ) { int ret; mbedtls_pk_context *private_key = mbedtls_ssl_own_key( ssl ); mbedtls_pk_context *public_key = &mbedtls_ssl_own_cert( ssl )->pk; size_t len = mbedtls_pk_get_len( public_key ); #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) /* If we have already started decoding the message and there is an ongoing * decryption operation, resume signing. */ if( ssl->handshake->async_in_progress != 0 ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "resuming decryption operation" ) ); return( ssl_resume_decrypt_pms( ssl, peer_pms, peer_pmslen, peer_pmssize ) ); } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ /* * Prepare to decrypt the premaster using own private RSA key */ #if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 ) { if ( p + 2 > end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( *p++ != ( ( len >> 8 ) & 0xFF ) || *p++ != ( ( len ) & 0xFF ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } } #endif if( p + len != end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } /* * Decrypt the premaster secret */ #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if( ssl->conf->f_async_decrypt_start != NULL ) { ret = ssl->conf->f_async_decrypt_start( ssl, mbedtls_ssl_own_cert( ssl ), p, len ); switch( ret ) { case MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH: /* act as if f_async_decrypt_start was null */ break; case 0: ssl->handshake->async_in_progress = 1; return( ssl_resume_decrypt_pms( ssl, peer_pms, peer_pmslen, peer_pmssize ) ); case MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS: ssl->handshake->async_in_progress = 1; return( MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ); default: MBEDTLS_SSL_DEBUG_RET( 1, "f_async_decrypt_start", ret ); return( ret ); } } #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ if( ! mbedtls_pk_can_do( private_key, MBEDTLS_PK_RSA ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no RSA private key" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } ret = mbedtls_pk_decrypt( private_key, p, len, peer_pms, peer_pmslen, peer_pmssize, ssl->conf->f_rng, ssl->conf->p_rng ); return( ret ); } static int ssl_parse_encrypted_pms( mbedtls_ssl_context *ssl, const unsigned char *p, const unsigned char *end, size_t pms_offset ) { int ret; unsigned char *pms = ssl->handshake->premaster + pms_offset; unsigned char ver[2]; unsigned char fake_pms[48], peer_pms[48]; unsigned char mask; size_t i, peer_pmslen; unsigned int diff; /* In case of a failure in decryption, the decryption may write less than * 2 bytes of output, but we always read the first two bytes. It doesn't * matter in the end because diff will be nonzero in that case due to * peer_pmslen being less than 48, and we only care whether diff is 0. * But do initialize peer_pms for robustness anyway. This also makes * memory analyzers happy (don't access uninitialized memory, even * if it's an unsigned char). */ peer_pms[0] = peer_pms[1] = ~0; ret = ssl_decrypt_encrypted_pms( ssl, p, end, peer_pms, &peer_pmslen, sizeof( peer_pms ) ); #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if ( ret == MBEDTLS_ERR_SSL_ASYNC_IN_PROGRESS ) return( ret ); #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ mbedtls_ssl_write_version( ssl->handshake->max_major_ver, ssl->handshake->max_minor_ver, ssl->conf->transport, ver ); /* Avoid data-dependent branches while checking for invalid * padding, to protect against timing-based Bleichenbacher-type * attacks. */ diff = (unsigned int) ret; diff |= peer_pmslen ^ 48; diff |= peer_pms[0] ^ ver[0]; diff |= peer_pms[1] ^ ver[1]; /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */ /* MSVC has a warning about unary minus on unsigned, but this is * well-defined and precisely what we want to do here */ #if defined(_MSC_VER) #pragma warning( push ) #pragma warning( disable : 4146 ) #endif mask = - ( ( diff | - diff ) >> ( sizeof( unsigned int ) * 8 - 1 ) ); #if defined(_MSC_VER) #pragma warning( pop ) #endif /* * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding * must not cause the connection to end immediately; instead, send a * bad_record_mac later in the handshake. * To protect against timing-based variants of the attack, we must * not have any branch that depends on whether the decryption was * successful. In particular, always generate the fake premaster secret, * regardless of whether it will ultimately influence the output or not. */ ret = ssl->conf->f_rng( ssl->conf->p_rng, fake_pms, sizeof( fake_pms ) ); if( ret != 0 ) { /* It's ok to abort on an RNG failure, since this does not reveal * anything about the RSA decryption. */ return( ret ); } #if defined(MBEDTLS_SSL_DEBUG_ALL) if( diff != 0 ) MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); #endif if( sizeof( ssl->handshake->premaster ) < pms_offset || sizeof( ssl->handshake->premaster ) - pms_offset < 48 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } ssl->handshake->pmslen = 48; /* Set pms to either the true or the fake PMS, without * data-dependent branches. */ for( i = 0; i < ssl->handshake->pmslen; i++ ) pms[i] = ( mask & fake_pms[i] ) | ( (~mask) & peer_pms[i] ); return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) static int ssl_parse_client_psk_identity( mbedtls_ssl_context *ssl, unsigned char **p, const unsigned char *end ) { int ret = 0; size_t n; if( ssl->conf->f_psk == NULL && ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL || ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no pre-shared key" ) ); return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED ); } /* * Receive client pre-shared key identity name */ if( end - *p < 2 ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } n = ( (*p)[0] << 8 ) | (*p)[1]; *p += 2; if( n < 1 || n > 65535 || n > (size_t) ( end - *p ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ssl->conf->f_psk != NULL ) { if( ssl->conf->f_psk( ssl->conf->p_psk, ssl, *p, n ) != 0 ) ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY; } else { /* Identity is not a big secret since clients send it in the clear, * but treat it carefully anyway, just in case */ if( n != ssl->conf->psk_identity_len || mbedtls_ssl_safer_memcmp( ssl->conf->psk_identity, *p, n ) != 0 ) { ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY; } } if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY ) { MBEDTLS_SSL_DEBUG_BUF( 3, "Unknown PSK identity", *p, n ); mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY ); return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY ); } *p += n; return( 0 ); } #endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ static int ssl_parse_client_key_exchange( mbedtls_ssl_context *ssl ) { int ret; const mbedtls_ssl_ciphersuite_t *ciphersuite_info; unsigned char *p, *end; ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) ); #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) && \ ( defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) ) if( ( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) && ( ssl->handshake->async_in_progress != 0 ) ) { /* We've already read a record and there is an asynchronous * operation in progress to decrypt it. So skip reading the * record. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "will resume decryption of previously-read record" ) ); } else #endif if( ( ret = mbedtls_ssl_read_record( ssl, 1 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_read_record", ret ); return( ret ); } p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ); end = ssl->in_msg + ssl->in_hslen; if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } #if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ) { if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret ); return( ret ); } if( p != end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx, ssl->handshake->premaster, MBEDTLS_PREMASTER_SIZE, &ssl->handshake->pmslen, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_dhm_calc_secret", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS ); } MBEDTLS_SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->handshake->dhm_ctx.K ); } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA ) { if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx, p, end - p) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_QP ); if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &ssl->handshake->pmslen, ssl->handshake->premaster, MBEDTLS_MPI_MAX_SIZE, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_calc_secret", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_Z ); } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED || MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ) { if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); return( ret ); } if( p != end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ) { #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) if ( ssl->handshake->async_in_progress != 0 ) { /* There is an asynchronous operation in progress to * decrypt the encrypted premaster secret, so skip * directly to resuming this operation. */ MBEDTLS_SSL_DEBUG_MSG( 3, ( "PSK identity already parsed" ) ); /* Update p to skip the PSK identity. ssl_parse_encrypted_pms * won't actually use it, but maintain p anyway for robustness. */ p += ssl->conf->psk_identity_len + 2; } else #endif /* MBEDTLS_SSL_ASYNC_PRIVATE */ if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); return( ret ); } if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 2 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_encrypted_pms" ), ret ); return( ret ); } if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ) { if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); return( ret ); } if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_dh_public" ), ret ); return( ret ); } if( p != end ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad client key exchange" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE ); } if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ) { if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_client_psk_identity" ), ret ); return( ret ); } if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx, p, end - p ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecdh_read_public", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP ); } MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_QP ); if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl, ciphersuite_info->key_exchange ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_psk_derive_premaster", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA ) { if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 0 ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "ssl_parse_parse_encrypted_pms_secret" ), ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */ #if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx, p, end - p ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_read_round_two", ret ); return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE ); } ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx, ssl->handshake->premaster, 32, &ssl->handshake->pmslen, ssl->conf->f_rng, ssl->conf->p_rng ); if( ret != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ecjpake_derive_secret", ret ); return( ret ); } } else #endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_derive_keys", ret ); return( ret ); } ssl->state++; MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) ); return( 0 ); } #if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \ !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl ) { const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) ); ssl->state++; return( 0 ); } MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } #else static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl ) { int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE; size_t i, sig_len; unsigned char hash[48]; unsigned char *hash_start = hash; size_t hashlen; #if defined(MBEDTLS_SSL_PROTO_TLS1_2) mbedtls_pk_type_t pk_alg; #endif mbedtls_md_type_t md_alg; const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) ); if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK || ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE || ssl->session_negotiate->peer_cert == NULL ) { MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) ); ssl->state++; return( 0 ); } /* Read the message without adding it to the checksum */ ret = mbedtls_ssl_read_record( ssl, 0 /* no checksum update */ ); if( 0 != ret ) { MBEDTLS_SSL_DEBUG_RET( 1, ( "mbedtls_ssl_read_record" ), ret ); return( ret ); } ssl->state++; /* Process the message contents */ if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE || ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } i = mbedtls_ssl_hs_hdr_len( ssl ); /* * struct { * SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only * opaque signature<0..2^16-1>; * } DigitallySigned; */ #if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ defined(MBEDTLS_SSL_PROTO_TLS1_1) if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 ) { md_alg = MBEDTLS_MD_NONE; hashlen = 36; /* For ECDSA, use SHA-1, not MD-5 + SHA-1 */ if( mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, MBEDTLS_PK_ECDSA ) ) { hash_start += 16; hashlen -= 16; md_alg = MBEDTLS_MD_SHA1; } } else #endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */ #if defined(MBEDTLS_SSL_PROTO_TLS1_2) if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 ) { if( i + 2 > ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } /* * Hash */ md_alg = mbedtls_ssl_md_alg_from_hash( ssl->in_msg[i] ); if( md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md( ssl, ssl->in_msg[i] ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg" " for verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } #if !defined(MBEDTLS_MD_SHA1) if( MBEDTLS_MD_SHA1 == md_alg ) hash_start += 16; #endif /* Info from md_alg will be used instead */ hashlen = 0; i++; /* * Signature */ if( ( pk_alg = mbedtls_ssl_pk_alg_from_sig( ssl->in_msg[i] ) ) == MBEDTLS_PK_NONE ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "peer not adhering to requested sig_alg" " for verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } /* * Check the certificate's key type matches the signature alg */ if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "sig_alg doesn't match cert key" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } i++; } else #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ { MBEDTLS_SSL_DEBUG_MSG( 1, ( "should never happen" ) ); return( MBEDTLS_ERR_SSL_INTERNAL_ERROR ); } if( i + 2 > ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } sig_len = ( ssl->in_msg[i] << 8 ) | ssl->in_msg[i+1]; i += 2; if( i + sig_len != ssl->in_hslen ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) ); return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY ); } /* Calculate hash and verify signature */ ssl->handshake->calc_verify( ssl, hash ); if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk, md_alg, hash_start, hashlen, ssl->in_msg + i, sig_len ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret ); return( ret ); } mbedtls_ssl_update_handshake_status( ssl ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) ); return( ret ); } #endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED && !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */ #if defined(MBEDTLS_SSL_SESSION_TICKETS) static int ssl_write_new_session_ticket( mbedtls_ssl_context *ssl ) { int ret; size_t tlen; uint32_t lifetime; MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> write new session ticket" ) ); ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE; ssl->out_msg[0] = MBEDTLS_SSL_HS_NEW_SESSION_TICKET; /* * struct { * uint32 ticket_lifetime_hint; * opaque ticket<0..2^16-1>; * } NewSessionTicket; * * 4 . 7 ticket_lifetime_hint (0 = unspecified) * 8 . 9 ticket_len (n) * 10 . 9+n ticket content */ if( ( ret = ssl->conf->f_ticket_write( ssl->conf->p_ticket, ssl->session_negotiate, ssl->out_msg + 10, ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN, &tlen, &lifetime ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_ticket_write", ret ); tlen = 0; } ssl->out_msg[4] = ( lifetime >> 24 ) & 0xFF; ssl->out_msg[5] = ( lifetime >> 16 ) & 0xFF; ssl->out_msg[6] = ( lifetime >> 8 ) & 0xFF; ssl->out_msg[7] = ( lifetime ) & 0xFF; ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF ); ssl->out_msg[9] = (unsigned char)( ( tlen ) & 0xFF ); ssl->out_msglen = 10 + tlen; /* * Morally equivalent to updating ssl->state, but NewSessionTicket and * ChangeCipherSpec share the same state. */ ssl->handshake->new_session_ticket = 0; if( ( ret = mbedtls_ssl_write_handshake_msg( ssl ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ssl_write_handshake_msg", ret ); return( ret ); } MBEDTLS_SSL_DEBUG_MSG( 2, ( "<= write new session ticket" ) ); return( 0 ); } #endif /* MBEDTLS_SSL_SESSION_TICKETS */ /* * SSL handshake -- server side -- single step */ int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl ) { int ret = 0; if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); MBEDTLS_SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) ); if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 ) return( ret ); #if defined(MBEDTLS_SSL_PROTO_DTLS) if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING ) { if( ( ret = mbedtls_ssl_flight_transmit( ssl ) ) != 0 ) return( ret ); } #endif /* MBEDTLS_SSL_PROTO_DTLS */ switch( ssl->state ) { case MBEDTLS_SSL_HELLO_REQUEST: ssl->state = MBEDTLS_SSL_CLIENT_HELLO; break; /* * <== ClientHello */ case MBEDTLS_SSL_CLIENT_HELLO: ret = ssl_parse_client_hello( ssl ); break; #if defined(MBEDTLS_SSL_PROTO_DTLS) case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT: return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED ); #endif /* * ==> ServerHello * Certificate * ( ServerKeyExchange ) * ( CertificateRequest ) * ServerHelloDone */ case MBEDTLS_SSL_SERVER_HELLO: ret = ssl_write_server_hello( ssl ); break; case MBEDTLS_SSL_SERVER_CERTIFICATE: ret = mbedtls_ssl_write_certificate( ssl ); break; case MBEDTLS_SSL_SERVER_KEY_EXCHANGE: ret = ssl_write_server_key_exchange( ssl ); break; case MBEDTLS_SSL_CERTIFICATE_REQUEST: ret = ssl_write_certificate_request( ssl ); break; case MBEDTLS_SSL_SERVER_HELLO_DONE: ret = ssl_write_server_hello_done( ssl ); break; /* * <== ( Certificate/Alert ) * ClientKeyExchange * ( CertificateVerify ) * ChangeCipherSpec * Finished */ case MBEDTLS_SSL_CLIENT_CERTIFICATE: ret = mbedtls_ssl_parse_certificate( ssl ); break; case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE: ret = ssl_parse_client_key_exchange( ssl ); break; case MBEDTLS_SSL_CERTIFICATE_VERIFY: ret = ssl_parse_certificate_verify( ssl ); break; case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC: ret = mbedtls_ssl_parse_change_cipher_spec( ssl ); break; case MBEDTLS_SSL_CLIENT_FINISHED: ret = mbedtls_ssl_parse_finished( ssl ); break; /* * ==> ( NewSessionTicket ) * ChangeCipherSpec * Finished */ case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC: #if defined(MBEDTLS_SSL_SESSION_TICKETS) if( ssl->handshake->new_session_ticket != 0 ) ret = ssl_write_new_session_ticket( ssl ); else #endif ret = mbedtls_ssl_write_change_cipher_spec( ssl ); break; case MBEDTLS_SSL_SERVER_FINISHED: ret = mbedtls_ssl_write_finished( ssl ); break; case MBEDTLS_SSL_FLUSH_BUFFERS: MBEDTLS_SSL_DEBUG_MSG( 2, ( "handshake: done" ) ); ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP; break; case MBEDTLS_SSL_HANDSHAKE_WRAPUP: mbedtls_ssl_handshake_wrapup( ssl ); break; default: MBEDTLS_SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } return( ret ); } #endif /* MBEDTLS_SSL_SRV_C */ fldigi-4.2.05/src/mbedtls/dhm.c0000664000175000017500000004511014611711171013121 00000000000000/* * Diffie-Hellman-Merkle key exchange * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The following sources were referenced in the design of this implementation * of the Diffie-Hellman-Merkle algorithm: * * [1] Handbook of Applied Cryptography - 1997, Chapter 12 * Menezes, van Oorschot and Vanstone * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_DHM_C) #include "mbedtls/dhm.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_ASN1_PARSE_C) #include "mbedtls/asn1.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif #if !defined(MBEDTLS_DHM_ALT) #define DHM_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_DHM_BAD_INPUT_DATA ) #define DHM_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * helper to validate the mbedtls_mpi size and import it */ static int dhm_read_bignum( mbedtls_mpi *X, unsigned char **p, const unsigned char *end ) { int ret, n; if( end - *p < 2 ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); n = ( (*p)[0] << 8 ) | (*p)[1]; (*p) += 2; if( (int)( end - *p ) < n ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); if( ( ret = mbedtls_mpi_read_binary( X, *p, n ) ) != 0 ) return( MBEDTLS_ERR_DHM_READ_PARAMS_FAILED + ret ); (*p) += n; return( 0 ); } /* * Verify sanity of parameter with regards to P * * Parameter should be: 2 <= public_param <= P - 2 * * This means that we need to return an error if * public_param < 2 or public_param > P-2 * * For more information on the attack, see: * http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf * http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-2643 */ static int dhm_check_range( const mbedtls_mpi *param, const mbedtls_mpi *P ) { mbedtls_mpi L, U; int ret = 0; mbedtls_mpi_init( &L ); mbedtls_mpi_init( &U ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &L, 2 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &U, P, 2 ) ); if( mbedtls_mpi_cmp_mpi( param, &L ) < 0 || mbedtls_mpi_cmp_mpi( param, &U ) > 0 ) { ret = MBEDTLS_ERR_DHM_BAD_INPUT_DATA; } cleanup: mbedtls_mpi_free( &L ); mbedtls_mpi_free( &U ); return( ret ); } void mbedtls_dhm_init( mbedtls_dhm_context *ctx ) { DHM_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_dhm_context ) ); } /* * Parse the ServerKeyExchange parameters */ int mbedtls_dhm_read_params( mbedtls_dhm_context *ctx, unsigned char **p, const unsigned char *end ) { int ret; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( p != NULL && *p != NULL ); DHM_VALIDATE_RET( end != NULL ); if( ( ret = dhm_read_bignum( &ctx->P, p, end ) ) != 0 || ( ret = dhm_read_bignum( &ctx->G, p, end ) ) != 0 || ( ret = dhm_read_bignum( &ctx->GY, p, end ) ) != 0 ) return( ret ); if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 ) return( ret ); ctx->len = mbedtls_mpi_size( &ctx->P ); return( 0 ); } /* * Setup and write the ServerKeyExchange parameters */ int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size, unsigned char *output, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count = 0; size_t n1, n2, n3; unsigned char *p; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( output != NULL ); DHM_VALIDATE_RET( olen != NULL ); DHM_VALIDATE_RET( f_rng != NULL ); if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); /* * Generate X as large as possible ( < P ) */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->X, x_size, f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->X, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED ); } while( dhm_check_range( &ctx->X, &ctx->P ) != 0 ); /* * Calculate GX = G^X mod P */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X, &ctx->P , &ctx->RP ) ); if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 ) return( ret ); /* * export P, G, GX */ #define DHM_MPI_EXPORT( X, n ) \ do { \ MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( ( X ), \ p + 2, \ ( n ) ) ); \ *p++ = (unsigned char)( ( n ) >> 8 ); \ *p++ = (unsigned char)( ( n ) ); \ p += ( n ); \ } while( 0 ) n1 = mbedtls_mpi_size( &ctx->P ); n2 = mbedtls_mpi_size( &ctx->G ); n3 = mbedtls_mpi_size( &ctx->GX ); p = output; DHM_MPI_EXPORT( &ctx->P , n1 ); DHM_MPI_EXPORT( &ctx->G , n2 ); DHM_MPI_EXPORT( &ctx->GX, n3 ); *olen = p - output; ctx->len = n1; cleanup: if( ret != 0 ) return( MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED + ret ); return( 0 ); } /* * Set prime modulus and generator */ int mbedtls_dhm_set_group( mbedtls_dhm_context *ctx, const mbedtls_mpi *P, const mbedtls_mpi *G ) { int ret; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( P != NULL ); DHM_VALIDATE_RET( G != NULL ); if( ( ret = mbedtls_mpi_copy( &ctx->P, P ) ) != 0 || ( ret = mbedtls_mpi_copy( &ctx->G, G ) ) != 0 ) { return( MBEDTLS_ERR_DHM_SET_GROUP_FAILED + ret ); } ctx->len = mbedtls_mpi_size( &ctx->P ); return( 0 ); } /* * Import the peer's public value G^Y */ int mbedtls_dhm_read_public( mbedtls_dhm_context *ctx, const unsigned char *input, size_t ilen ) { int ret; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( input != NULL ); if( ilen < 1 || ilen > ctx->len ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); if( ( ret = mbedtls_mpi_read_binary( &ctx->GY, input, ilen ) ) != 0 ) return( MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED + ret ); return( 0 ); } /* * Create own private value X and export G^X */ int mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size, unsigned char *output, size_t olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count = 0; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( output != NULL ); DHM_VALIDATE_RET( f_rng != NULL ); if( olen < 1 || olen > ctx->len ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); /* * generate X and calculate GX = G^X mod P */ do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->X, x_size, f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->X, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED ); } while( dhm_check_range( &ctx->X, &ctx->P ) != 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X, &ctx->P , &ctx->RP ) ); if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 ) return( ret ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->GX, output, olen ) ); cleanup: if( ret != 0 ) return( MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED + ret ); return( 0 ); } /* * Use the blinding method and optimisation suggested in section 10 of: * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA, * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer * Berlin Heidelberg, 1996. p. 104-113. */ static int dhm_update_blinding( mbedtls_dhm_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count; /* * Don't use any blinding the first time a particular X is used, * but remember it to use blinding next time. */ if( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->pX ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &ctx->pX, &ctx->X ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->Vi, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->Vf, 1 ) ); return( 0 ); } /* * Ok, we need blinding. Can we re-use existing values? * If yes, just update them by squaring them. */ if( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) != 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &ctx->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vf, &ctx->Vf, &ctx->Vf ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vf, &ctx->Vf, &ctx->P ) ); return( 0 ); } /* * We need to generate blinding values from scratch */ /* Vi = random( 2, P-1 ) */ count = 0; do { MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->Vi, mbedtls_mpi_size( &ctx->P ), f_rng, p_rng ) ); while( mbedtls_mpi_cmp_mpi( &ctx->Vi, &ctx->P ) >= 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->Vi, 1 ) ); if( count++ > 10 ) return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE ); } while( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) <= 0 ); /* Vf = Vi^-X mod P */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vf, &ctx->Vi, &ctx->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vf, &ctx->Vf, &ctx->X, &ctx->P, &ctx->RP ) ); cleanup: return( ret ); } /* * Derive and export the shared secret (G^Y)^X mod P */ int mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx, unsigned char *output, size_t output_size, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi GYb; DHM_VALIDATE_RET( ctx != NULL ); DHM_VALIDATE_RET( output != NULL ); DHM_VALIDATE_RET( olen != NULL ); if( output_size < ctx->len ) return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA ); if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 ) return( ret ); mbedtls_mpi_init( &GYb ); /* Blind peer's value */ if( f_rng != NULL ) { MBEDTLS_MPI_CHK( dhm_update_blinding( ctx, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &GYb, &ctx->GY, &ctx->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &GYb, &GYb, &ctx->P ) ); } else MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &GYb, &ctx->GY ) ); /* Do modular exponentiation */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->K, &GYb, &ctx->X, &ctx->P, &ctx->RP ) ); /* Unblind secret value */ if( f_rng != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->K, &ctx->K, &ctx->Vf ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->K, &ctx->K, &ctx->P ) ); } *olen = mbedtls_mpi_size( &ctx->K ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->K, output, *olen ) ); cleanup: mbedtls_mpi_free( &GYb ); if( ret != 0 ) return( MBEDTLS_ERR_DHM_CALC_SECRET_FAILED + ret ); return( 0 ); } /* * Free the components of a DHM key */ void mbedtls_dhm_free( mbedtls_dhm_context *ctx ) { if( ctx == NULL ) return; mbedtls_mpi_free( &ctx->pX ); mbedtls_mpi_free( &ctx->Vf ); mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->RP ); mbedtls_mpi_free( &ctx->K ); mbedtls_mpi_free( &ctx->GY ); mbedtls_mpi_free( &ctx->GX ); mbedtls_mpi_free( &ctx->X ); mbedtls_mpi_free( &ctx->G ); mbedtls_mpi_free( &ctx->P ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_dhm_context ) ); } #if defined(MBEDTLS_ASN1_PARSE_C) /* * Parse DHM parameters */ int mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin, size_t dhminlen ) { int ret; size_t len; unsigned char *p, *end; #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_context pem; #endif /* MBEDTLS_PEM_PARSE_C */ DHM_VALIDATE_RET( dhm != NULL ); DHM_VALIDATE_RET( dhmin != NULL ); #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_init( &pem ); /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( dhminlen == 0 || dhmin[dhminlen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN DH PARAMETERS-----", "-----END DH PARAMETERS-----", dhmin, NULL, 0, &dhminlen ); if( ret == 0 ) { /* * Was PEM encoded */ dhminlen = pem.buflen; } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) goto exit; p = ( ret == 0 ) ? pem.buf : (unsigned char *) dhmin; #else p = (unsigned char *) dhmin; #endif /* MBEDTLS_PEM_PARSE_C */ end = p + dhminlen; /* * DHParams ::= SEQUENCE { * prime INTEGER, -- P * generator INTEGER, -- g * privateValueLength INTEGER OPTIONAL * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret; goto exit; } end = p + len; if( ( ret = mbedtls_asn1_get_mpi( &p, end, &dhm->P ) ) != 0 || ( ret = mbedtls_asn1_get_mpi( &p, end, &dhm->G ) ) != 0 ) { ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret; goto exit; } if( p != end ) { /* This might be the optional privateValueLength. * If so, we can cleanly discard it */ mbedtls_mpi rec; mbedtls_mpi_init( &rec ); ret = mbedtls_asn1_get_mpi( &p, end, &rec ); mbedtls_mpi_free( &rec ); if ( ret != 0 ) { ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret; goto exit; } if ( p != end ) { ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; goto exit; } } ret = 0; dhm->len = mbedtls_mpi_size( &dhm->P ); exit: #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_free( &pem ); #endif if( ret != 0 ) mbedtls_dhm_free( dhm ); return( ret ); } #if defined(MBEDTLS_FS_IO) /* * Load all data from a file into a given buffer. * * The file is expected to contain either PEM or DER encoded data. * A terminating null byte is always appended. It is included in the announced * length only if the data looks like it is PEM encoded. */ static int load_file( const char *path, unsigned char **buf, size_t *n ) { FILE *f; long size; if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_DHM_FILE_IO_ERROR ); fseek( f, 0, SEEK_END ); if( ( size = ftell( f ) ) == -1 ) { fclose( f ); return( MBEDTLS_ERR_DHM_FILE_IO_ERROR ); } fseek( f, 0, SEEK_SET ); *n = (size_t) size; if( *n + 1 == 0 || ( *buf = mbedtls_calloc( 1, *n + 1 ) ) == NULL ) { fclose( f ); return( MBEDTLS_ERR_DHM_ALLOC_FAILED ); } if( fread( *buf, 1, *n, f ) != *n ) { fclose( f ); mbedtls_platform_zeroize( *buf, *n + 1 ); mbedtls_free( *buf ); return( MBEDTLS_ERR_DHM_FILE_IO_ERROR ); } fclose( f ); (*buf)[*n] = '\0'; if( strstr( (const char *) *buf, "-----BEGIN " ) != NULL ) ++*n; return( 0 ); } /* * Load and parse DHM parameters */ int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path ) { int ret; size_t n; unsigned char *buf; DHM_VALIDATE_RET( dhm != NULL ); DHM_VALIDATE_RET( path != NULL ); if( ( ret = load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_dhm_parse_dhm( dhm, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_FS_IO */ #endif /* MBEDTLS_ASN1_PARSE_C */ #endif /* MBEDTLS_DHM_ALT */ #if defined(MBEDTLS_SELF_TEST) static const char mbedtls_test_dhm_params[] = "-----BEGIN DH PARAMETERS-----\r\n" "MIGHAoGBAJ419DBEOgmQTzo5qXl5fQcN9TN455wkOL7052HzxxRVMyhYmwQcgJvh\r\n" "1sa18fyfR9OiVEMYglOpkqVoGLN7qd5aQNNi5W7/C+VBdHTBJcGZJyyP5B3qcz32\r\n" "9mLJKudlVudV0Qxk5qUJaPZ/xupz0NyoVpviuiBOI1gNi8ovSXWzAgEC\r\n" "-----END DH PARAMETERS-----\r\n"; static const size_t mbedtls_test_dhm_params_len = sizeof( mbedtls_test_dhm_params ); /* * Checkup routine */ int mbedtls_dhm_self_test( int verbose ) { int ret; mbedtls_dhm_context dhm; mbedtls_dhm_init( &dhm ); if( verbose != 0 ) mbedtls_printf( " DHM parameter load: " ); if( ( ret = mbedtls_dhm_parse_dhm( &dhm, (const unsigned char *) mbedtls_test_dhm_params, mbedtls_test_dhm_params_len ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n\n" ); exit: mbedtls_dhm_free( &dhm ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_DHM_C */ fldigi-4.2.05/src/mbedtls/blowfish.c0000664000175000017500000006574514611711171014206 00000000000000/* * Blowfish implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The Blowfish block cipher was designed by Bruce Schneier in 1993. * http://www.schneier.com/blowfish.html * http://en.wikipedia.org/wiki/Blowfish_%28cipher%29 * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_BLOWFISH_C) #include "mbedtls/blowfish.h" #include "mbedtls/platform_util.h" #include #if !defined(MBEDTLS_BLOWFISH_ALT) /* Parameter validation macros */ #define BLOWFISH_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA ) #define BLOWFISH_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } #endif static const uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2] = { 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL, 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, 0x9216D5D9L, 0x8979FB1BL }; /* declarations of data at the end of this file */ static const uint32_t S[4][256]; static uint32_t F( mbedtls_blowfish_context *ctx, uint32_t x ) { unsigned short a, b, c, d; uint32_t y; d = (unsigned short)(x & 0xFF); x >>= 8; c = (unsigned short)(x & 0xFF); x >>= 8; b = (unsigned short)(x & 0xFF); x >>= 8; a = (unsigned short)(x & 0xFF); y = ctx->S[0][a] + ctx->S[1][b]; y = y ^ ctx->S[2][c]; y = y + ctx->S[3][d]; return( y ); } static void blowfish_enc( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr ) { uint32_t Xl, Xr, temp; short i; Xl = *xl; Xr = *xr; for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS; ++i ) { Xl = Xl ^ ctx->P[i]; Xr = F( ctx, Xl ) ^ Xr; temp = Xl; Xl = Xr; Xr = temp; } temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS]; Xl = Xl ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS + 1]; *xl = Xl; *xr = Xr; } static void blowfish_dec( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr ) { uint32_t Xl, Xr, temp; short i; Xl = *xl; Xr = *xr; for( i = MBEDTLS_BLOWFISH_ROUNDS + 1; i > 1; --i ) { Xl = Xl ^ ctx->P[i]; Xr = F( ctx, Xl ) ^ Xr; temp = Xl; Xl = Xr; Xr = temp; } temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ ctx->P[1]; Xl = Xl ^ ctx->P[0]; *xl = Xl; *xr = Xr; } void mbedtls_blowfish_init( mbedtls_blowfish_context *ctx ) { BLOWFISH_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_blowfish_context ) ); } void mbedtls_blowfish_free( mbedtls_blowfish_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_blowfish_context ) ); } /* * Blowfish key schedule */ int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key, unsigned int keybits ) { unsigned int i, j, k; uint32_t data, datal, datar; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( key != NULL ); if( keybits < MBEDTLS_BLOWFISH_MIN_KEY_BITS || keybits > MBEDTLS_BLOWFISH_MAX_KEY_BITS || keybits % 8 != 0 ) { return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA ); } keybits >>= 3; for( i = 0; i < 4; i++ ) { for( j = 0; j < 256; j++ ) ctx->S[i][j] = S[i][j]; } j = 0; for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; ++i ) { data = 0x00000000; for( k = 0; k < 4; ++k ) { data = ( data << 8 ) | key[j++]; if( j >= keybits ) j = 0; } ctx->P[i] = P[i] ^ data; } datal = 0x00000000; datar = 0x00000000; for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; i += 2 ) { blowfish_enc( ctx, &datal, &datar ); ctx->P[i] = datal; ctx->P[i + 1] = datar; } for( i = 0; i < 4; i++ ) { for( j = 0; j < 256; j += 2 ) { blowfish_enc( ctx, &datal, &datar ); ctx->S[i][j] = datal; ctx->S[i][j + 1] = datar; } } return( 0 ); } /* * Blowfish-ECB block encryption/decryption */ int mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx, int mode, const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE], unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] ) { uint32_t X0, X1; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT || mode == MBEDTLS_BLOWFISH_DECRYPT ); BLOWFISH_VALIDATE_RET( input != NULL ); BLOWFISH_VALIDATE_RET( output != NULL ); GET_UINT32_BE( X0, input, 0 ); GET_UINT32_BE( X1, input, 4 ); if( mode == MBEDTLS_BLOWFISH_DECRYPT ) { blowfish_dec( ctx, &X0, &X1 ); } else /* MBEDTLS_BLOWFISH_ENCRYPT */ { blowfish_enc( ctx, &X0, &X1 ); } PUT_UINT32_BE( X0, output, 0 ); PUT_UINT32_BE( X1, output, 4 ); return( 0 ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * Blowfish-CBC buffer encryption/decryption */ int mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx, int mode, size_t length, unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[MBEDTLS_BLOWFISH_BLOCKSIZE]; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT || mode == MBEDTLS_BLOWFISH_DECRYPT ); BLOWFISH_VALIDATE_RET( iv != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || input != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || output != NULL ); if( length % MBEDTLS_BLOWFISH_BLOCKSIZE ) return( MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_BLOWFISH_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, MBEDTLS_BLOWFISH_BLOCKSIZE ); mbedtls_blowfish_crypt_ecb( ctx, mode, input, output ); for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE;i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, MBEDTLS_BLOWFISH_BLOCKSIZE ); input += MBEDTLS_BLOWFISH_BLOCKSIZE; output += MBEDTLS_BLOWFISH_BLOCKSIZE; length -= MBEDTLS_BLOWFISH_BLOCKSIZE; } } else { while( length > 0 ) { for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_blowfish_crypt_ecb( ctx, mode, output, output ); memcpy( iv, output, MBEDTLS_BLOWFISH_BLOCKSIZE ); input += MBEDTLS_BLOWFISH_BLOCKSIZE; output += MBEDTLS_BLOWFISH_BLOCKSIZE; length -= MBEDTLS_BLOWFISH_BLOCKSIZE; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * Blowfish CFB buffer encryption/decryption */ int mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int c; size_t n; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT || mode == MBEDTLS_BLOWFISH_DECRYPT ); BLOWFISH_VALIDATE_RET( iv != NULL ); BLOWFISH_VALIDATE_RET( iv_off != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || input != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || output != NULL ); n = *iv_off; if( n >= 8 ) return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA ); if( mode == MBEDTLS_BLOWFISH_DECRYPT ) { while( length-- ) { if( n == 0 ) mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv ); c = *input++; *output++ = (unsigned char)( c ^ iv[n] ); iv[n] = (unsigned char) c; n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE; } } else { while( length-- ) { if( n == 0 ) mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv ); iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE; } } *iv_off = n; return( 0 ); } #endif /*MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * Blowfish CTR buffer encryption/decryption */ int mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE], unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int c, i; size_t n; BLOWFISH_VALIDATE_RET( ctx != NULL ); BLOWFISH_VALIDATE_RET( nonce_counter != NULL ); BLOWFISH_VALIDATE_RET( stream_block != NULL ); BLOWFISH_VALIDATE_RET( nc_off != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || input != NULL ); BLOWFISH_VALIDATE_RET( length == 0 || output != NULL ); n = *nc_off; if( n >= 8 ) return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, nonce_counter, stream_block ); for( i = MBEDTLS_BLOWFISH_BLOCKSIZE; i > 0; i-- ) if( ++nonce_counter[i - 1] != 0 ) break; } c = *input++; *output++ = (unsigned char)( c ^ stream_block[n] ); n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE; } *nc_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ static const uint32_t S[4][256] = { { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L, 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L, 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L, 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL, 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL, 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L, 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL, 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL, 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L, 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L, 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL, 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL, 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL, 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L, 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L, 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L, 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L, 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L, 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL, 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L, 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L, 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L, 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L, 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL, 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L, 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL, 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL, 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L, 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL, 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L, 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL, 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L, 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L, 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL, 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L, 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L, 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL, 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L, 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL, 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L, 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L, 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL, 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L, 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L, 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L, 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L, 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L, 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL, 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL, 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L, 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L, 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L, 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L, 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL, 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L, 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL, 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL, 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L, 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L, 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L, 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L, 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L, 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L, 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL }, { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L, 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L, 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L, 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL, 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L, 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L, 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL, 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L, 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L, 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L, 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL, 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL, 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L, 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L, 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L, 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L, 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL, 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL, 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL, 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L, 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL, 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L, 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L, 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL, 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL, 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L, 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL, 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L, 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL, 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL, 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L, 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L, 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L, 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L, 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L, 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L, 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L, 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL, 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L, 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL, 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L, 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L, 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L, 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L, 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L, 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L, 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L, 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L, 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L, 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L, 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L, 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L, 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L, 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L, 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L, 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L, 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL, 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL, 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L, 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL, 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L, 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L, 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L, 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L }, { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L, 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L, 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL, 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L, 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L, 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L, 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL, 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL, 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL, 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L, 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L, 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL, 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L, 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL, 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L, 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL, 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L, 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL, 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L, 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL, 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L, 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L, 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL, 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L, 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L, 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L, 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L, 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL, 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L, 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL, 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L, 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL, 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L, 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL, 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL, 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL, 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L, 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L, 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL, 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL, 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL, 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL, 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL, 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L, 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L, 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L, 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L, 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL, 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL, 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L, 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L, 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L, 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L, 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L, 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L, 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L, 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L, 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L, 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L, 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL, 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L, 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL, 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L, 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L }, { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL, 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL, 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL, 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L, 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L, 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L, 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L, 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L, 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L, 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L, 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L, 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L, 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L, 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L, 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L, 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL, 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL, 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L, 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL, 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL, 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL, 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L, 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL, 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL, 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L, 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L, 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L, 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L, 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL, 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL, 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L, 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L, 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L, 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL, 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L, 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L, 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L, 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL, 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L, 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L, 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L, 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL, 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL, 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L, 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L, 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L, 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L, 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL, 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L, 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL, 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL, 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L, 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L, 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL, 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L, 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL, 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L, 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL, 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L, 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L, 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL, 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L, 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL, 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L } }; #endif /* !MBEDTLS_BLOWFISH_ALT */ #endif /* MBEDTLS_BLOWFISH_C */ fldigi-4.2.05/src/mbedtls/hmac_drbg.c0000664000175000017500000004303114611711171014257 00000000000000/* * HMAC_DRBG implementation (NIST SP 800-90) * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The NIST SP 800-90A DRBGs are described in the following publication. * http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf * References below are based on rev. 1 (January 2012). */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_HMAC_DRBG_C) #include "mbedtls/hmac_drbg.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_FS_IO) #include #endif #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_PLATFORM_C */ /* * HMAC_DRBG context initialization */ void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_hmac_drbg_context ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } /* * HMAC_DRBG update, using optional additional data (10.1.2.2) */ int mbedtls_hmac_drbg_update_ret( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t add_len ) { size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info ); unsigned char rounds = ( additional != NULL && add_len != 0 ) ? 2 : 1; unsigned char sep[1]; unsigned char K[MBEDTLS_MD_MAX_SIZE]; int ret; for( sep[0] = 0; sep[0] < rounds; sep[0]++ ) { /* Step 1 or 4 */ if( ( ret = mbedtls_md_hmac_reset( &ctx->md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, sep, 1 ) ) != 0 ) goto exit; if( rounds == 2 ) { if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, additional, add_len ) ) != 0 ) goto exit; } if( ( ret = mbedtls_md_hmac_finish( &ctx->md_ctx, K ) ) != 0 ) goto exit; /* Step 2 or 5 */ if( ( ret = mbedtls_md_hmac_starts( &ctx->md_ctx, K, md_len ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_finish( &ctx->md_ctx, ctx->V ) ) != 0 ) goto exit; } exit: mbedtls_platform_zeroize( K, sizeof( K ) ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t add_len ) { (void) mbedtls_hmac_drbg_update_ret( ctx, additional, add_len ); } #endif /* MBEDTLS_DEPRECATED_REMOVED */ /* * Simplified HMAC_DRBG initialisation (for use with deterministic ECDSA) */ int mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx, const mbedtls_md_info_t * md_info, const unsigned char *data, size_t data_len ) { int ret; if( ( ret = mbedtls_md_setup( &ctx->md_ctx, md_info, 1 ) ) != 0 ) return( ret ); /* * Set initial working state. * Use the V memory location, which is currently all 0, to initialize the * MD context with an all-zero key. Then set V to its initial value. */ if( ( ret = mbedtls_md_hmac_starts( &ctx->md_ctx, ctx->V, mbedtls_md_get_size( md_info ) ) ) != 0 ) return( ret ); memset( ctx->V, 0x01, mbedtls_md_get_size( md_info ) ); if( ( ret = mbedtls_hmac_drbg_update_ret( ctx, data, data_len ) ) != 0 ) return( ret ); return( 0 ); } /* * HMAC_DRBG reseeding: 10.1.2.4 (arabic) + 9.2 (Roman) */ int mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx, const unsigned char *additional, size_t len ) { unsigned char seed[MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT]; size_t seedlen; int ret; /* III. Check input length */ if( len > MBEDTLS_HMAC_DRBG_MAX_INPUT || ctx->entropy_len + len > MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT ) { return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG ); } memset( seed, 0, MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT ); /* IV. Gather entropy_len bytes of entropy for the seed */ if( ( ret = ctx->f_entropy( ctx->p_entropy, seed, ctx->entropy_len ) ) != 0 ) return( MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED ); seedlen = ctx->entropy_len; /* 1. Concatenate entropy and additional data if any */ if( additional != NULL && len != 0 ) { memcpy( seed + seedlen, additional, len ); seedlen += len; } /* 2. Update state */ if( ( ret = mbedtls_hmac_drbg_update_ret( ctx, seed, seedlen ) ) != 0 ) goto exit; /* 3. Reset reseed_counter */ ctx->reseed_counter = 1; exit: /* 4. Done */ mbedtls_platform_zeroize( seed, seedlen ); return( ret ); } /* * HMAC_DRBG initialisation (10.1.2.3 + 9.1) */ int mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx, const mbedtls_md_info_t * md_info, int (*f_entropy)(void *, unsigned char *, size_t), void *p_entropy, const unsigned char *custom, size_t len ) { int ret; size_t entropy_len, md_size; if( ( ret = mbedtls_md_setup( &ctx->md_ctx, md_info, 1 ) ) != 0 ) return( ret ); md_size = mbedtls_md_get_size( md_info ); /* * Set initial working state. * Use the V memory location, which is currently all 0, to initialize the * MD context with an all-zero key. Then set V to its initial value. */ if( ( ret = mbedtls_md_hmac_starts( &ctx->md_ctx, ctx->V, md_size ) ) != 0 ) return( ret ); memset( ctx->V, 0x01, md_size ); ctx->f_entropy = f_entropy; ctx->p_entropy = p_entropy; ctx->reseed_interval = MBEDTLS_HMAC_DRBG_RESEED_INTERVAL; /* * See SP800-57 5.6.1 (p. 65-66) for the security strength provided by * each hash function, then according to SP800-90A rev1 10.1 table 2, * min_entropy_len (in bits) is security_strength. * * (This also matches the sizes used in the NIST test vectors.) */ entropy_len = md_size <= 20 ? 16 : /* 160-bits hash -> 128 bits */ md_size <= 28 ? 24 : /* 224-bits hash -> 192 bits */ 32; /* better (256+) -> 256 bits */ /* * For initialisation, use more entropy to emulate a nonce * (Again, matches test vectors.) */ ctx->entropy_len = entropy_len * 3 / 2; if( ( ret = mbedtls_hmac_drbg_reseed( ctx, custom, len ) ) != 0 ) return( ret ); ctx->entropy_len = entropy_len; return( 0 ); } /* * Set prediction resistance */ void mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx, int resistance ) { ctx->prediction_resistance = resistance; } /* * Set entropy length grabbed for reseeds */ void mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx, size_t len ) { ctx->entropy_len = len; } /* * Set reseed interval */ void mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx, int interval ) { ctx->reseed_interval = interval; } /* * HMAC_DRBG random function with optional additional data: * 10.1.2.5 (arabic) + 9.3 (Roman) */ int mbedtls_hmac_drbg_random_with_add( void *p_rng, unsigned char *output, size_t out_len, const unsigned char *additional, size_t add_len ) { int ret; mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng; size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info ); size_t left = out_len; unsigned char *out = output; /* II. Check request length */ if( out_len > MBEDTLS_HMAC_DRBG_MAX_REQUEST ) return( MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG ); /* III. Check input length */ if( add_len > MBEDTLS_HMAC_DRBG_MAX_INPUT ) return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG ); /* 1. (aka VII and IX) Check reseed counter and PR */ if( ctx->f_entropy != NULL && /* For no-reseeding instances */ ( ctx->prediction_resistance == MBEDTLS_HMAC_DRBG_PR_ON || ctx->reseed_counter > ctx->reseed_interval ) ) { if( ( ret = mbedtls_hmac_drbg_reseed( ctx, additional, add_len ) ) != 0 ) return( ret ); add_len = 0; /* VII.4 */ } /* 2. Use additional data if any */ if( additional != NULL && add_len != 0 ) { if( ( ret = mbedtls_hmac_drbg_update_ret( ctx, additional, add_len ) ) != 0 ) goto exit; } /* 3, 4, 5. Generate bytes */ while( left != 0 ) { size_t use_len = left > md_len ? md_len : left; if( ( ret = mbedtls_md_hmac_reset( &ctx->md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_hmac_finish( &ctx->md_ctx, ctx->V ) ) != 0 ) goto exit; memcpy( out, ctx->V, use_len ); out += use_len; left -= use_len; } /* 6. Update */ if( ( ret = mbedtls_hmac_drbg_update_ret( ctx, additional, add_len ) ) != 0 ) goto exit; /* 7. Update reseed counter */ ctx->reseed_counter++; exit: /* 8. Done */ return( ret ); } /* * HMAC_DRBG random function */ int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len ) { int ret; mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif ret = mbedtls_hmac_drbg_random_with_add( ctx, output, out_len, NULL, 0 ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Free an HMAC_DRBG context */ void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx ) { if( ctx == NULL ) return; #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif mbedtls_md_free( &ctx->md_ctx ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_hmac_drbg_context ) ); } #if defined(MBEDTLS_FS_IO) int mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ) { int ret; FILE *f; unsigned char buf[ MBEDTLS_HMAC_DRBG_MAX_INPUT ]; if( ( f = fopen( path, "wb" ) ) == NULL ) return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR ); if( ( ret = mbedtls_hmac_drbg_random( ctx, buf, sizeof( buf ) ) ) != 0 ) goto exit; if( fwrite( buf, 1, sizeof( buf ), f ) != sizeof( buf ) ) { ret = MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR; goto exit; } ret = 0; exit: fclose( f ); mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ) { int ret = 0; FILE *f = NULL; size_t n; unsigned char buf[ MBEDTLS_HMAC_DRBG_MAX_INPUT ]; unsigned char c; if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR ); n = fread( buf, 1, sizeof( buf ), f ); if( fread( &c, 1, 1, f ) != 0 ) { ret = MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG; goto exit; } if( n == 0 || ferror( f ) ) { ret = MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR; goto exit; } fclose( f ); f = NULL; ret = mbedtls_hmac_drbg_update_ret( ctx, buf, n ); exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); if( f != NULL ) fclose( f ); if( ret != 0 ) return( ret ); return( mbedtls_hmac_drbg_write_seed_file( ctx, path ) ); } #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) #if !defined(MBEDTLS_SHA1_C) /* Dummy checkup routine */ int mbedtls_hmac_drbg_self_test( int verbose ) { (void) verbose; return( 0 ); } #else #define OUTPUT_LEN 80 /* From a NIST PR=true test vector */ static const unsigned char entropy_pr[] = { 0xa0, 0xc9, 0xab, 0x58, 0xf1, 0xe2, 0xe5, 0xa4, 0xde, 0x3e, 0xbd, 0x4f, 0xf7, 0x3e, 0x9c, 0x5b, 0x64, 0xef, 0xd8, 0xca, 0x02, 0x8c, 0xf8, 0x11, 0x48, 0xa5, 0x84, 0xfe, 0x69, 0xab, 0x5a, 0xee, 0x42, 0xaa, 0x4d, 0x42, 0x17, 0x60, 0x99, 0xd4, 0x5e, 0x13, 0x97, 0xdc, 0x40, 0x4d, 0x86, 0xa3, 0x7b, 0xf5, 0x59, 0x54, 0x75, 0x69, 0x51, 0xe4 }; static const unsigned char result_pr[OUTPUT_LEN] = { 0x9a, 0x00, 0xa2, 0xd0, 0x0e, 0xd5, 0x9b, 0xfe, 0x31, 0xec, 0xb1, 0x39, 0x9b, 0x60, 0x81, 0x48, 0xd1, 0x96, 0x9d, 0x25, 0x0d, 0x3c, 0x1e, 0x94, 0x10, 0x10, 0x98, 0x12, 0x93, 0x25, 0xca, 0xb8, 0xfc, 0xcc, 0x2d, 0x54, 0x73, 0x19, 0x70, 0xc0, 0x10, 0x7a, 0xa4, 0x89, 0x25, 0x19, 0x95, 0x5e, 0x4b, 0xc6, 0x00, 0x1d, 0x7f, 0x4e, 0x6a, 0x2b, 0xf8, 0xa3, 0x01, 0xab, 0x46, 0x05, 0x5c, 0x09, 0xa6, 0x71, 0x88, 0xf1, 0xa7, 0x40, 0xee, 0xf3, 0xe1, 0x5c, 0x02, 0x9b, 0x44, 0xaf, 0x03, 0x44 }; /* From a NIST PR=false test vector */ static const unsigned char entropy_nopr[] = { 0x79, 0x34, 0x9b, 0xbf, 0x7c, 0xdd, 0xa5, 0x79, 0x95, 0x57, 0x86, 0x66, 0x21, 0xc9, 0x13, 0x83, 0x11, 0x46, 0x73, 0x3a, 0xbf, 0x8c, 0x35, 0xc8, 0xc7, 0x21, 0x5b, 0x5b, 0x96, 0xc4, 0x8e, 0x9b, 0x33, 0x8c, 0x74, 0xe3, 0xe9, 0x9d, 0xfe, 0xdf }; static const unsigned char result_nopr[OUTPUT_LEN] = { 0xc6, 0xa1, 0x6a, 0xb8, 0xd4, 0x20, 0x70, 0x6f, 0x0f, 0x34, 0xab, 0x7f, 0xec, 0x5a, 0xdc, 0xa9, 0xd8, 0xca, 0x3a, 0x13, 0x3e, 0x15, 0x9c, 0xa6, 0xac, 0x43, 0xc6, 0xf8, 0xa2, 0xbe, 0x22, 0x83, 0x4a, 0x4c, 0x0a, 0x0a, 0xff, 0xb1, 0x0d, 0x71, 0x94, 0xf1, 0xc1, 0xa5, 0xcf, 0x73, 0x22, 0xec, 0x1a, 0xe0, 0x96, 0x4e, 0xd4, 0xbf, 0x12, 0x27, 0x46, 0xe0, 0x87, 0xfd, 0xb5, 0xb3, 0xe9, 0x1b, 0x34, 0x93, 0xd5, 0xbb, 0x98, 0xfa, 0xed, 0x49, 0xe8, 0x5f, 0x13, 0x0f, 0xc8, 0xa4, 0x59, 0xb7 }; /* "Entropy" from buffer */ static size_t test_offset; static int hmac_drbg_self_test_entropy( void *data, unsigned char *buf, size_t len ) { const unsigned char *p = data; memcpy( buf, p + test_offset, len ); test_offset += len; return( 0 ); } #define CHK( c ) if( (c) != 0 ) \ { \ if( verbose != 0 ) \ mbedtls_printf( "failed\n" ); \ return( 1 ); \ } /* * Checkup routine for HMAC_DRBG with SHA-1 */ int mbedtls_hmac_drbg_self_test( int verbose ) { mbedtls_hmac_drbg_context ctx; unsigned char buf[OUTPUT_LEN]; const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ); mbedtls_hmac_drbg_init( &ctx ); /* * PR = True */ if( verbose != 0 ) mbedtls_printf( " HMAC_DRBG (PR = True) : " ); test_offset = 0; CHK( mbedtls_hmac_drbg_seed( &ctx, md_info, hmac_drbg_self_test_entropy, (void *) entropy_pr, NULL, 0 ) ); mbedtls_hmac_drbg_set_prediction_resistance( &ctx, MBEDTLS_HMAC_DRBG_PR_ON ); CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) ); CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) ); CHK( memcmp( buf, result_pr, OUTPUT_LEN ) ); mbedtls_hmac_drbg_free( &ctx ); mbedtls_hmac_drbg_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); /* * PR = False */ if( verbose != 0 ) mbedtls_printf( " HMAC_DRBG (PR = False) : " ); mbedtls_hmac_drbg_init( &ctx ); test_offset = 0; CHK( mbedtls_hmac_drbg_seed( &ctx, md_info, hmac_drbg_self_test_entropy, (void *) entropy_nopr, NULL, 0 ) ); CHK( mbedtls_hmac_drbg_reseed( &ctx, NULL, 0 ) ); CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) ); CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) ); CHK( memcmp( buf, result_nopr, OUTPUT_LEN ) ); mbedtls_hmac_drbg_free( &ctx ); mbedtls_hmac_drbg_free( &ctx ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SHA1_C */ #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_HMAC_DRBG_C */ fldigi-4.2.05/src/mbedtls/rsa.c0000664000175000017500000024560014611711171013144 00000000000000/* * The RSA public-key cryptosystem * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The following sources were referenced in the design of this implementation * of the RSA algorithm: * * [1] A method for obtaining digital signatures and public-key cryptosystems * R Rivest, A Shamir, and L Adleman * http://people.csail.mit.edu/rivest/pubs.html#RSA78 * * [2] Handbook of Applied Cryptography - 1997, Chapter 8 * Menezes, van Oorschot and Vanstone * * [3] Malware Guard Extension: Using SGX to Conceal Cache Attacks * Michael Schwarz, Samuel Weiser, Daniel Gruss, Clémentine Maurice and * Stefan Mangard * https://arxiv.org/abs/1702.08719v2 * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #include "mbedtls/rsa_internal.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PKCS1_V21) #include "mbedtls/md.h" #endif #if defined(MBEDTLS_PKCS1_V15) && !defined(__OpenBSD__) #include #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif #if !defined(MBEDTLS_RSA_ALT) /* Parameter validation macros */ #define RSA_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_RSA_BAD_INPUT_DATA ) #define RSA_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_PKCS1_V15) /* constant-time buffer comparison */ static inline int mbedtls_safer_memcmp( const void *a, const void *b, size_t n ) { size_t i; const unsigned char *A = (const unsigned char *) a; const unsigned char *B = (const unsigned char *) b; unsigned char diff = 0; for( i = 0; i < n; i++ ) diff |= A[i] ^ B[i]; return( diff ); } #endif /* MBEDTLS_PKCS1_V15 */ int mbedtls_rsa_import( mbedtls_rsa_context *ctx, const mbedtls_mpi *N, const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *E ) { int ret; RSA_VALIDATE_RET( ctx != NULL ); if( ( N != NULL && ( ret = mbedtls_mpi_copy( &ctx->N, N ) ) != 0 ) || ( P != NULL && ( ret = mbedtls_mpi_copy( &ctx->P, P ) ) != 0 ) || ( Q != NULL && ( ret = mbedtls_mpi_copy( &ctx->Q, Q ) ) != 0 ) || ( D != NULL && ( ret = mbedtls_mpi_copy( &ctx->D, D ) ) != 0 ) || ( E != NULL && ( ret = mbedtls_mpi_copy( &ctx->E, E ) ) != 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } if( N != NULL ) ctx->len = mbedtls_mpi_size( &ctx->N ); return( 0 ); } int mbedtls_rsa_import_raw( mbedtls_rsa_context *ctx, unsigned char const *N, size_t N_len, unsigned char const *P, size_t P_len, unsigned char const *Q, size_t Q_len, unsigned char const *D, size_t D_len, unsigned char const *E, size_t E_len ) { int ret = 0; RSA_VALIDATE_RET( ctx != NULL ); if( N != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->N, N, N_len ) ); ctx->len = mbedtls_mpi_size( &ctx->N ); } if( P != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->P, P, P_len ) ); if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->Q, Q, Q_len ) ); if( D != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->D, D, D_len ) ); if( E != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->E, E, E_len ) ); cleanup: if( ret != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); return( 0 ); } /* * Checks whether the context fields are set in such a way * that the RSA primitives will be able to execute without error. * It does *not* make guarantees for consistency of the parameters. */ static int rsa_check_context( mbedtls_rsa_context const *ctx, int is_priv, int blinding_needed ) { #if !defined(MBEDTLS_RSA_NO_CRT) /* blinding_needed is only used for NO_CRT to decide whether * P,Q need to be present or not. */ ((void) blinding_needed); #endif if( ctx->len != mbedtls_mpi_size( &ctx->N ) || ctx->len > MBEDTLS_MPI_MAX_SIZE ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } /* * 1. Modular exponentiation needs positive, odd moduli. */ /* Modular exponentiation wrt. N is always used for * RSA public key operations. */ if( mbedtls_mpi_cmp_int( &ctx->N, 0 ) <= 0 || mbedtls_mpi_get_bit( &ctx->N, 0 ) == 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #if !defined(MBEDTLS_RSA_NO_CRT) /* Modular exponentiation for P and Q is only * used for private key operations and if CRT * is used. */ if( is_priv && ( mbedtls_mpi_cmp_int( &ctx->P, 0 ) <= 0 || mbedtls_mpi_get_bit( &ctx->P, 0 ) == 0 || mbedtls_mpi_cmp_int( &ctx->Q, 0 ) <= 0 || mbedtls_mpi_get_bit( &ctx->Q, 0 ) == 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #endif /* !MBEDTLS_RSA_NO_CRT */ /* * 2. Exponents must be positive */ /* Always need E for public key operations */ if( mbedtls_mpi_cmp_int( &ctx->E, 0 ) <= 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); #if defined(MBEDTLS_RSA_NO_CRT) /* For private key operations, use D or DP & DQ * as (unblinded) exponents. */ if( is_priv && mbedtls_mpi_cmp_int( &ctx->D, 0 ) <= 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); #else if( is_priv && ( mbedtls_mpi_cmp_int( &ctx->DP, 0 ) <= 0 || mbedtls_mpi_cmp_int( &ctx->DQ, 0 ) <= 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #endif /* MBEDTLS_RSA_NO_CRT */ /* Blinding shouldn't make exponents negative either, * so check that P, Q >= 1 if that hasn't yet been * done as part of 1. */ #if defined(MBEDTLS_RSA_NO_CRT) if( is_priv && blinding_needed && ( mbedtls_mpi_cmp_int( &ctx->P, 0 ) <= 0 || mbedtls_mpi_cmp_int( &ctx->Q, 0 ) <= 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #endif /* It wouldn't lead to an error if it wasn't satisfied, * but check for QP >= 1 nonetheless. */ #if !defined(MBEDTLS_RSA_NO_CRT) if( is_priv && mbedtls_mpi_cmp_int( &ctx->QP, 0 ) <= 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #endif return( 0 ); } int mbedtls_rsa_complete( mbedtls_rsa_context *ctx ) { int ret = 0; int have_N, have_P, have_Q, have_D, have_E; int n_missing, pq_missing, d_missing, is_pub, is_priv; RSA_VALIDATE_RET( ctx != NULL ); have_N = ( mbedtls_mpi_cmp_int( &ctx->N, 0 ) != 0 ); have_P = ( mbedtls_mpi_cmp_int( &ctx->P, 0 ) != 0 ); have_Q = ( mbedtls_mpi_cmp_int( &ctx->Q, 0 ) != 0 ); have_D = ( mbedtls_mpi_cmp_int( &ctx->D, 0 ) != 0 ); have_E = ( mbedtls_mpi_cmp_int( &ctx->E, 0 ) != 0 ); /* * Check whether provided parameters are enough * to deduce all others. The following incomplete * parameter sets for private keys are supported: * * (1) P, Q missing. * (2) D and potentially N missing. * */ n_missing = have_P && have_Q && have_D && have_E; pq_missing = have_N && !have_P && !have_Q && have_D && have_E; d_missing = have_P && have_Q && !have_D && have_E; is_pub = have_N && !have_P && !have_Q && !have_D && have_E; /* These three alternatives are mutually exclusive */ is_priv = n_missing || pq_missing || d_missing; if( !is_priv && !is_pub ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * Step 1: Deduce N if P, Q are provided. */ if( !have_N && have_P && have_Q ) { if( ( ret = mbedtls_mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) ) != 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } ctx->len = mbedtls_mpi_size( &ctx->N ); } /* * Step 2: Deduce and verify all remaining core parameters. */ if( pq_missing ) { ret = mbedtls_rsa_deduce_primes( &ctx->N, &ctx->E, &ctx->D, &ctx->P, &ctx->Q ); if( ret != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } else if( d_missing ) { if( ( ret = mbedtls_rsa_deduce_private_exponent( &ctx->P, &ctx->Q, &ctx->E, &ctx->D ) ) != 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } } /* * Step 3: Deduce all additional parameters specific * to our current RSA implementation. */ #if !defined(MBEDTLS_RSA_NO_CRT) if( is_priv ) { ret = mbedtls_rsa_deduce_crt( &ctx->P, &ctx->Q, &ctx->D, &ctx->DP, &ctx->DQ, &ctx->QP ); if( ret != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } #endif /* MBEDTLS_RSA_NO_CRT */ /* * Step 3: Basic sanity checks */ return( rsa_check_context( ctx, is_priv, 1 ) ); } int mbedtls_rsa_export_raw( const mbedtls_rsa_context *ctx, unsigned char *N, size_t N_len, unsigned char *P, size_t P_len, unsigned char *Q, size_t Q_len, unsigned char *D, size_t D_len, unsigned char *E, size_t E_len ) { int ret = 0; int is_priv; RSA_VALIDATE_RET( ctx != NULL ); /* Check if key is private or public */ is_priv = mbedtls_mpi_cmp_int( &ctx->N, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->P, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->Q, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->D, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->E, 0 ) != 0; if( !is_priv ) { /* If we're trying to export private parameters for a public key, * something must be wrong. */ if( P != NULL || Q != NULL || D != NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } if( N != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->N, N, N_len ) ); if( P != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->P, P, P_len ) ); if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->Q, Q, Q_len ) ); if( D != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->D, D, D_len ) ); if( E != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->E, E, E_len ) ); cleanup: return( ret ); } int mbedtls_rsa_export( const mbedtls_rsa_context *ctx, mbedtls_mpi *N, mbedtls_mpi *P, mbedtls_mpi *Q, mbedtls_mpi *D, mbedtls_mpi *E ) { int ret; int is_priv; RSA_VALIDATE_RET( ctx != NULL ); /* Check if key is private or public */ is_priv = mbedtls_mpi_cmp_int( &ctx->N, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->P, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->Q, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->D, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->E, 0 ) != 0; if( !is_priv ) { /* If we're trying to export private parameters for a public key, * something must be wrong. */ if( P != NULL || Q != NULL || D != NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } /* Export all requested core parameters. */ if( ( N != NULL && ( ret = mbedtls_mpi_copy( N, &ctx->N ) ) != 0 ) || ( P != NULL && ( ret = mbedtls_mpi_copy( P, &ctx->P ) ) != 0 ) || ( Q != NULL && ( ret = mbedtls_mpi_copy( Q, &ctx->Q ) ) != 0 ) || ( D != NULL && ( ret = mbedtls_mpi_copy( D, &ctx->D ) ) != 0 ) || ( E != NULL && ( ret = mbedtls_mpi_copy( E, &ctx->E ) ) != 0 ) ) { return( ret ); } return( 0 ); } /* * Export CRT parameters * This must also be implemented if CRT is not used, for being able to * write DER encoded RSA keys. The helper function mbedtls_rsa_deduce_crt * can be used in this case. */ int mbedtls_rsa_export_crt( const mbedtls_rsa_context *ctx, mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP ) { int ret; int is_priv; RSA_VALIDATE_RET( ctx != NULL ); /* Check if key is private or public */ is_priv = mbedtls_mpi_cmp_int( &ctx->N, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->P, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->Q, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->D, 0 ) != 0 && mbedtls_mpi_cmp_int( &ctx->E, 0 ) != 0; if( !is_priv ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); #if !defined(MBEDTLS_RSA_NO_CRT) /* Export all requested blinding parameters. */ if( ( DP != NULL && ( ret = mbedtls_mpi_copy( DP, &ctx->DP ) ) != 0 ) || ( DQ != NULL && ( ret = mbedtls_mpi_copy( DQ, &ctx->DQ ) ) != 0 ) || ( QP != NULL && ( ret = mbedtls_mpi_copy( QP, &ctx->QP ) ) != 0 ) ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } #else if( ( ret = mbedtls_rsa_deduce_crt( &ctx->P, &ctx->Q, &ctx->D, DP, DQ, QP ) ) != 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA + ret ); } #endif return( 0 ); } /* * Initialize an RSA context */ void mbedtls_rsa_init( mbedtls_rsa_context *ctx, int padding, int hash_id ) { RSA_VALIDATE( ctx != NULL ); RSA_VALIDATE( padding == MBEDTLS_RSA_PKCS_V15 || padding == MBEDTLS_RSA_PKCS_V21 ); memset( ctx, 0, sizeof( mbedtls_rsa_context ) ); mbedtls_rsa_set_padding( ctx, padding, hash_id ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif } /* * Set padding for an existing RSA context */ void mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id ) { RSA_VALIDATE( ctx != NULL ); RSA_VALIDATE( padding == MBEDTLS_RSA_PKCS_V15 || padding == MBEDTLS_RSA_PKCS_V21 ); ctx->padding = padding; ctx->hash_id = hash_id; } /* * Get length in bytes of RSA modulus */ size_t mbedtls_rsa_get_len( const mbedtls_rsa_context *ctx ) { return( ctx->len ); } #if defined(MBEDTLS_GENPRIME) /* * Generate an RSA keypair * * This generation method follows the RSA key pair generation procedure of * FIPS 186-4 if 2^16 < exponent < 2^256 and nbits = 2048 or nbits = 3072. */ int mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, unsigned int nbits, int exponent ) { int ret; mbedtls_mpi H, G, L; int prime_quality = 0; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( f_rng != NULL ); if( nbits < 128 || exponent < 3 || nbits % 2 != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * If the modulus is 1024 bit long or shorter, then the security strength of * the RSA algorithm is less than or equal to 80 bits and therefore an error * rate of 2^-80 is sufficient. */ if( nbits > 1024 ) prime_quality = MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR; mbedtls_mpi_init( &H ); mbedtls_mpi_init( &G ); mbedtls_mpi_init( &L ); /* * find primes P and Q with Q < P so that: * 1. |P-Q| > 2^( nbits / 2 - 100 ) * 2. GCD( E, (P-1)*(Q-1) ) == 1 * 3. E^-1 mod LCM(P-1, Q-1) > 2^( nbits / 2 ) */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->E, exponent ) ); do { MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->P, nbits >> 1, prime_quality, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->Q, nbits >> 1, prime_quality, f_rng, p_rng ) ); /* make sure the difference between p and q is not too small (FIPS 186-4 §B.3.3 step 5.4) */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &H, &ctx->P, &ctx->Q ) ); if( mbedtls_mpi_bitlen( &H ) <= ( ( nbits >= 200 ) ? ( ( nbits >> 1 ) - 99 ) : 0 ) ) continue; /* not required by any standards, but some users rely on the fact that P > Q */ if( H.s < 0 ) mbedtls_mpi_swap( &ctx->P, &ctx->Q ); /* Temporarily replace P,Q by P-1, Q-1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &ctx->P, &ctx->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &ctx->Q, &ctx->Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &H, &ctx->P, &ctx->Q ) ); /* check GCD( E, (P-1)*(Q-1) ) == 1 (FIPS 186-4 §B.3.1 criterion 2(a)) */ MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, &ctx->E, &H ) ); if( mbedtls_mpi_cmp_int( &G, 1 ) != 0 ) continue; /* compute smallest possible D = E^-1 mod LCM(P-1, Q-1) (FIPS 186-4 §B.3.1 criterion 3(b)) */ MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, &ctx->P, &ctx->Q ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &L, NULL, &H, &G ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->D, &ctx->E, &L ) ); if( mbedtls_mpi_bitlen( &ctx->D ) <= ( ( nbits + 1 ) / 2 ) ) // (FIPS 186-4 §B.3.1 criterion 3(a)) continue; break; } while( 1 ); /* Restore P,Q */ MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &ctx->P, &ctx->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &ctx->Q, &ctx->Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) ); ctx->len = mbedtls_mpi_size( &ctx->N ); #if !defined(MBEDTLS_RSA_NO_CRT) /* * DP = D mod (P - 1) * DQ = D mod (Q - 1) * QP = Q^-1 mod P */ MBEDTLS_MPI_CHK( mbedtls_rsa_deduce_crt( &ctx->P, &ctx->Q, &ctx->D, &ctx->DP, &ctx->DQ, &ctx->QP ) ); #endif /* MBEDTLS_RSA_NO_CRT */ /* Double-check */ MBEDTLS_MPI_CHK( mbedtls_rsa_check_privkey( ctx ) ); cleanup: mbedtls_mpi_free( &H ); mbedtls_mpi_free( &G ); mbedtls_mpi_free( &L ); if( ret != 0 ) { mbedtls_rsa_free( ctx ); return( MBEDTLS_ERR_RSA_KEY_GEN_FAILED + ret ); } return( 0 ); } #endif /* MBEDTLS_GENPRIME */ /* * Check a public RSA key */ int mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx ) { RSA_VALIDATE_RET( ctx != NULL ); if( rsa_check_context( ctx, 0 /* public */, 0 /* no blinding */ ) != 0 ) return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); if( mbedtls_mpi_bitlen( &ctx->N ) < 128 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } if( mbedtls_mpi_get_bit( &ctx->E, 0 ) == 0 || mbedtls_mpi_bitlen( &ctx->E ) < 2 || mbedtls_mpi_cmp_mpi( &ctx->E, &ctx->N ) >= 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } return( 0 ); } /* * Check for the consistency of all fields in an RSA private key context */ int mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx ) { RSA_VALIDATE_RET( ctx != NULL ); if( mbedtls_rsa_check_pubkey( ctx ) != 0 || rsa_check_context( ctx, 1 /* private */, 1 /* blinding */ ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } if( mbedtls_rsa_validate_params( &ctx->N, &ctx->P, &ctx->Q, &ctx->D, &ctx->E, NULL, NULL ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } #if !defined(MBEDTLS_RSA_NO_CRT) else if( mbedtls_rsa_validate_crt( &ctx->P, &ctx->Q, &ctx->D, &ctx->DP, &ctx->DQ, &ctx->QP ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } #endif return( 0 ); } /* * Check if contexts holding a public and private key match */ int mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, const mbedtls_rsa_context *prv ) { RSA_VALIDATE_RET( pub != NULL ); RSA_VALIDATE_RET( prv != NULL ); if( mbedtls_rsa_check_pubkey( pub ) != 0 || mbedtls_rsa_check_privkey( prv ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } if( mbedtls_mpi_cmp_mpi( &pub->N, &prv->N ) != 0 || mbedtls_mpi_cmp_mpi( &pub->E, &prv->E ) != 0 ) { return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ); } return( 0 ); } /* * Do an RSA public key operation */ int mbedtls_rsa_public( mbedtls_rsa_context *ctx, const unsigned char *input, unsigned char *output ) { int ret; size_t olen; mbedtls_mpi T; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( output != NULL ); if( rsa_check_context( ctx, 0 /* public */, 0 /* no blinding */ ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); mbedtls_mpi_init( &T ); #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) ); if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) { ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; goto cleanup; } olen = ctx->len; MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) ); cleanup: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif mbedtls_mpi_free( &T ); if( ret != 0 ) return( MBEDTLS_ERR_RSA_PUBLIC_FAILED + ret ); return( 0 ); } /* * Generate or update blinding values, see section 10 of: * KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA, * DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer * Berlin Heidelberg, 1996. p. 104-113. */ static int rsa_prepare_blinding( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret, count = 0; if( ctx->Vf.p != NULL ) { /* We already have blinding values, just update them by squaring */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &ctx->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vf, &ctx->Vf, &ctx->Vf ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vf, &ctx->Vf, &ctx->N ) ); goto cleanup; } /* Unblinding value: Vf = random number, invertible mod N */ do { if( count++ > 10 ) return( MBEDTLS_ERR_RSA_RNG_FAILED ); MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->Vf, ctx->len - 1, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &ctx->Vi, &ctx->Vf, &ctx->N ) ); } while( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) != 0 ); /* Blinding value: Vi = Vf^(-e) mod N */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vi, &ctx->Vf, &ctx->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vi, &ctx->Vi, &ctx->E, &ctx->N, &ctx->RN ) ); cleanup: return( ret ); } /* * Exponent blinding supposed to prevent side-channel attacks using multiple * traces of measurements to recover the RSA key. The more collisions are there, * the more bits of the key can be recovered. See [3]. * * Collecting n collisions with m bit long blinding value requires 2^(m-m/n) * observations on avarage. * * For example with 28 byte blinding to achieve 2 collisions the adversary has * to make 2^112 observations on avarage. * * (With the currently (as of 2017 April) known best algorithms breaking 2048 * bit RSA requires approximately as much time as trying out 2^112 random keys. * Thus in this sense with 28 byte blinding the security is not reduced by * side-channel attacks like the one in [3]) * * This countermeasure does not help if the key recovery is possible with a * single trace. */ #define RSA_EXPONENT_BLINDING 28 /* * Do an RSA private key operation */ int mbedtls_rsa_private( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, const unsigned char *input, unsigned char *output ) { int ret; size_t olen; /* Temporary holding the result */ mbedtls_mpi T; /* Temporaries holding P-1, Q-1 and the * exponent blinding factor, respectively. */ mbedtls_mpi P1, Q1, R; #if !defined(MBEDTLS_RSA_NO_CRT) /* Temporaries holding the results mod p resp. mod q. */ mbedtls_mpi TP, TQ; /* Temporaries holding the blinded exponents for * the mod p resp. mod q computation (if used). */ mbedtls_mpi DP_blind, DQ_blind; /* Pointers to actual exponents to be used - either the unblinded * or the blinded ones, depending on the presence of a PRNG. */ mbedtls_mpi *DP = &ctx->DP; mbedtls_mpi *DQ = &ctx->DQ; #else /* Temporary holding the blinded exponent (if used). */ mbedtls_mpi D_blind; /* Pointer to actual exponent to be used - either the unblinded * or the blinded one, depending on the presence of a PRNG. */ mbedtls_mpi *D = &ctx->D; #endif /* MBEDTLS_RSA_NO_CRT */ /* Temporaries holding the initial input and the double * checked result; should be the same in the end. */ mbedtls_mpi I, C; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( output != NULL ); if( rsa_check_context( ctx, 1 /* private key checks */, f_rng != NULL /* blinding y/n */ ) != 0 ) { return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif /* MPI Initialization */ mbedtls_mpi_init( &T ); mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 ); mbedtls_mpi_init( &R ); if( f_rng != NULL ) { #if defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_init( &D_blind ); #else mbedtls_mpi_init( &DP_blind ); mbedtls_mpi_init( &DQ_blind ); #endif } #if !defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_init( &TP ); mbedtls_mpi_init( &TQ ); #endif mbedtls_mpi_init( &I ); mbedtls_mpi_init( &C ); /* End of MPI initialization */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) ); if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) { ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &I, &T ) ); if( f_rng != NULL ) { /* * Blinding * T = T * Vi mod N */ MBEDTLS_MPI_CHK( rsa_prepare_blinding( ctx, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) ); /* * Exponent blinding */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P1, &ctx->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q1, &ctx->Q, 1 ) ); #if defined(MBEDTLS_RSA_NO_CRT) /* * D_blind = ( P - 1 ) * ( Q - 1 ) * R + D */ MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &D_blind, &P1, &Q1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &D_blind, &D_blind, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &D_blind, &D_blind, &ctx->D ) ); D = &D_blind; #else /* * DP_blind = ( P - 1 ) * R + DP */ MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DP_blind, &P1, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &DP_blind, &DP_blind, &ctx->DP ) ); DP = &DP_blind; /* * DQ_blind = ( Q - 1 ) * R + DQ */ MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DQ_blind, &Q1, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &DQ_blind, &DQ_blind, &ctx->DQ ) ); DQ = &DQ_blind; #endif /* MBEDTLS_RSA_NO_CRT */ } #if defined(MBEDTLS_RSA_NO_CRT) MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, D, &ctx->N, &ctx->RN ) ); #else /* * Faster decryption using the CRT * * TP = input ^ dP mod P * TQ = input ^ dQ mod Q */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &TP, &T, DP, &ctx->P, &ctx->RP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &TQ, &T, DQ, &ctx->Q, &ctx->RQ ) ); /* * T = (TP - TQ) * (Q^-1 mod P) mod P */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &TP, &TQ ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &TP, &T, &ctx->QP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &TP, &ctx->P ) ); /* * T = TQ + T * Q */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &TP, &T, &ctx->Q ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &T, &TQ, &TP ) ); #endif /* MBEDTLS_RSA_NO_CRT */ if( f_rng != NULL ) { /* * Unblind * T = T * Vf mod N */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vf ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) ); } /* Verify the result to prevent glitching attacks. */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &C, &T, &ctx->E, &ctx->N, &ctx->RN ) ); if( mbedtls_mpi_cmp_mpi( &C, &I ) != 0 ) { ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; goto cleanup; } olen = ctx->len; MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) ); cleanup: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &R ); if( f_rng != NULL ) { #if defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_free( &D_blind ); #else mbedtls_mpi_free( &DP_blind ); mbedtls_mpi_free( &DQ_blind ); #endif } mbedtls_mpi_free( &T ); #if !defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_free( &TP ); mbedtls_mpi_free( &TQ ); #endif mbedtls_mpi_free( &C ); mbedtls_mpi_free( &I ); if( ret != 0 ) return( MBEDTLS_ERR_RSA_PRIVATE_FAILED + ret ); return( 0 ); } #if defined(MBEDTLS_PKCS1_V21) /** * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer. * * \param dst buffer to mask * \param dlen length of destination buffer * \param src source of the mask generation * \param slen length of the source buffer * \param md_ctx message digest context to use */ static int mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src, size_t slen, mbedtls_md_context_t *md_ctx ) { unsigned char mask[MBEDTLS_MD_MAX_SIZE]; unsigned char counter[4]; unsigned char *p; unsigned int hlen; size_t i, use_len; int ret = 0; memset( mask, 0, MBEDTLS_MD_MAX_SIZE ); memset( counter, 0, 4 ); hlen = mbedtls_md_get_size( md_ctx->md_info ); /* Generate and apply dbMask */ p = dst; while( dlen > 0 ) { use_len = hlen; if( dlen < hlen ) use_len = dlen; if( ( ret = mbedtls_md_starts( md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( md_ctx, src, slen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( md_ctx, counter, 4 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_finish( md_ctx, mask ) ) != 0 ) goto exit; for( i = 0; i < use_len; ++i ) *p++ ^= mask[i]; counter[3]++; dlen -= use_len; } exit: mbedtls_platform_zeroize( mask, sizeof( mask ) ); return( ret ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V21) /* * Implementation of the PKCS#1 v2.1 RSAES-OAEP-ENCRYPT function */ int mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, const unsigned char *label, size_t label_len, size_t ilen, const unsigned char *input, unsigned char *output ) { size_t olen; int ret; unsigned char *p = output; unsigned int hlen; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( label_len == 0 || label != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( f_rng == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); olen = ctx->len; hlen = mbedtls_md_get_size( md_info ); /* first comparison checks for overflow */ if( ilen + 2 * hlen + 2 < ilen || olen < ilen + 2 * hlen + 2 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); memset( output, 0, olen ); *p++ = 0; /* Generate a random octet string seed */ if( ( ret = f_rng( p_rng, p, hlen ) ) != 0 ) return( MBEDTLS_ERR_RSA_RNG_FAILED + ret ); p += hlen; /* Construct DB */ if( ( ret = mbedtls_md( md_info, label, label_len, p ) ) != 0 ) return( ret ); p += hlen; p += olen - 2 * hlen - 2 - ilen; *p++ = 1; memcpy( p, input, ilen ); mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) goto exit; /* maskedDB: Apply dbMask to DB */ if( ( ret = mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen, &md_ctx ) ) != 0 ) goto exit; /* maskedSeed: Apply seedMask to seed */ if( ( ret = mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1, &md_ctx ) ) != 0 ) goto exit; exit: mbedtls_md_free( &md_ctx ); if( ret != 0 ) return( ret ); return( ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, output, output ) : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V15) /* * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-ENCRYPT function */ int mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t ilen, const unsigned char *input, unsigned char *output ) { size_t nb_pad, olen; int ret; unsigned char *p = output; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output != NULL ); RSA_VALIDATE_RET( input != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); olen = ctx->len; /* first comparison checks for overflow */ if( ilen + 11 < ilen || olen < ilen + 11 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); nb_pad = olen - 3 - ilen; *p++ = 0; if( mode == MBEDTLS_RSA_PUBLIC ) { if( f_rng == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); *p++ = MBEDTLS_RSA_CRYPT; while( nb_pad-- > 0 ) { int rng_dl = 100; do { ret = f_rng( p_rng, p, 1 ); } while( *p == 0 && --rng_dl && ret == 0 ); /* Check if RNG failed to generate data */ if( rng_dl == 0 || ret != 0 ) return( MBEDTLS_ERR_RSA_RNG_FAILED + ret ); p++; } } else { *p++ = MBEDTLS_RSA_SIGN; while( nb_pad-- > 0 ) *p++ = 0xFF; } *p++ = 0; memcpy( p, input, ilen ); return( ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, output, output ) : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Add the message padding, then do an RSA operation */ int mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t ilen, const unsigned char *input, unsigned char *output ) { RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output != NULL ); RSA_VALIDATE_RET( input != NULL ); switch( ctx->padding ) { #if defined(MBEDTLS_PKCS1_V15) case MBEDTLS_RSA_PKCS_V15: return mbedtls_rsa_rsaes_pkcs1_v15_encrypt( ctx, f_rng, p_rng, mode, ilen, input, output ); #endif #if defined(MBEDTLS_PKCS1_V21) case MBEDTLS_RSA_PKCS_V21: return mbedtls_rsa_rsaes_oaep_encrypt( ctx, f_rng, p_rng, mode, NULL, 0, ilen, input, output ); #endif default: return( MBEDTLS_ERR_RSA_INVALID_PADDING ); } } #if defined(MBEDTLS_PKCS1_V21) /* * Implementation of the PKCS#1 v2.1 RSAES-OAEP-DECRYPT function */ int mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, const unsigned char *label, size_t label_len, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ) { int ret; size_t ilen, i, pad_len; unsigned char *p, bad, pad_done; unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; unsigned char lhash[MBEDTLS_MD_MAX_SIZE]; unsigned int hlen; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output_max_len == 0 || output != NULL ); RSA_VALIDATE_RET( label_len == 0 || label != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( olen != NULL ); /* * Parameters sanity checks */ if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); ilen = ctx->len; if( ilen < 16 || ilen > sizeof( buf ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hlen = mbedtls_md_get_size( md_info ); // checking for integer underflow if( 2 * hlen + 2 > ilen ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * RSA operation */ ret = ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, input, buf ) : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf ); if( ret != 0 ) goto cleanup; /* * Unmask data and generate lHash */ mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) { mbedtls_md_free( &md_ctx ); goto cleanup; } /* seed: Apply seedMask to maskedSeed */ if( ( ret = mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1, &md_ctx ) ) != 0 || /* DB: Apply dbMask to maskedDB */ ( ret = mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen, &md_ctx ) ) != 0 ) { mbedtls_md_free( &md_ctx ); goto cleanup; } mbedtls_md_free( &md_ctx ); /* Generate lHash */ if( ( ret = mbedtls_md( md_info, label, label_len, lhash ) ) != 0 ) goto cleanup; /* * Check contents, in "constant-time" */ p = buf; bad = 0; bad |= *p++; /* First byte must be 0 */ p += hlen; /* Skip seed */ /* Check lHash */ for( i = 0; i < hlen; i++ ) bad |= lhash[i] ^ *p++; /* Get zero-padding len, but always read till end of buffer * (minus one, for the 01 byte) */ pad_len = 0; pad_done = 0; for( i = 0; i < ilen - 2 * hlen - 2; i++ ) { pad_done |= p[i]; pad_len += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1; } p += pad_len; bad |= *p++ ^ 0x01; /* * The only information "leaked" is whether the padding was correct or not * (eg, no data is copied if it was not correct). This meets the * recommendations in PKCS#1 v2.2: an opponent cannot distinguish between * the different error conditions. */ if( bad != 0 ) { ret = MBEDTLS_ERR_RSA_INVALID_PADDING; goto cleanup; } if( ilen - ( p - buf ) > output_max_len ) { ret = MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE; goto cleanup; } *olen = ilen - (p - buf); memcpy( output, p, *olen ); ret = 0; cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); mbedtls_platform_zeroize( lhash, sizeof( lhash ) ); return( ret ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V15) /** Turn zero-or-nonzero into zero-or-all-bits-one, without branches. * * \param value The value to analyze. * \return Zero if \p value is zero, otherwise all-bits-one. */ static unsigned all_or_nothing_int( unsigned value ) { /* MSVC has a warning about unary minus on unsigned, but this is * well-defined and precisely what we want to do here */ #if defined(_MSC_VER) #pragma warning( push ) #pragma warning( disable : 4146 ) #endif return( - ( ( value | - value ) >> ( sizeof( value ) * 8 - 1 ) ) ); #if defined(_MSC_VER) #pragma warning( pop ) #endif } /** Check whether a size is out of bounds, without branches. * * This is equivalent to `size > max`, but is likely to be compiled to * to code using bitwise operation rather than a branch. * * \param size Size to check. * \param max Maximum desired value for \p size. * \return \c 0 if `size <= max`. * \return \c 1 if `size > max`. */ static unsigned size_greater_than( size_t size, size_t max ) { /* Return the sign bit (1 for negative) of (max - size). */ return( ( max - size ) >> ( sizeof( size_t ) * 8 - 1 ) ); } /** Choose between two integer values, without branches. * * This is equivalent to `cond ? if1 : if0`, but is likely to be compiled * to code using bitwise operation rather than a branch. * * \param cond Condition to test. * \param if1 Value to use if \p cond is nonzero. * \param if0 Value to use if \p cond is zero. * \return \c if1 if \p cond is nonzero, otherwise \c if0. */ static unsigned if_int( unsigned cond, unsigned if1, unsigned if0 ) { unsigned mask = all_or_nothing_int( cond ); return( ( mask & if1 ) | (~mask & if0 ) ); } /** Shift some data towards the left inside a buffer without leaking * the length of the data through side channels. * * `mem_move_to_left(start, total, offset)` is functionally equivalent to * ``` * memmove(start, start + offset, total - offset); * memset(start + offset, 0, total - offset); * ``` * but it strives to use a memory access pattern (and thus total timing) * that does not depend on \p offset. This timing independence comes at * the expense of performance. * * \param start Pointer to the start of the buffer. * \param total Total size of the buffer. * \param offset Offset from which to copy \p total - \p offset bytes. */ static void mem_move_to_left( void *start, size_t total, size_t offset ) { volatile unsigned char *buf = start; size_t i, n; if( total == 0 ) return; for( i = 0; i < total; i++ ) { unsigned no_op = size_greater_than( total - offset, i ); /* The first `total - offset` passes are a no-op. The last * `offset` passes shift the data one byte to the left and * zero out the last byte. */ for( n = 0; n < total - 1; n++ ) { unsigned char current = buf[n]; unsigned char next = buf[n+1]; buf[n] = if_int( no_op, current, next ); } buf[total-1] = if_int( no_op, buf[total-1], 0 ); } } /* * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-DECRYPT function */ int mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len ) { int ret; size_t ilen, i, plaintext_max_size; unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; /* The following variables take sensitive values: their value must * not leak into the observable behavior of the function other than * the designated outputs (output, olen, return value). Otherwise * this would open the execution of the function to * side-channel-based variants of the Bleichenbacher padding oracle * attack. Potential side channels include overall timing, memory * access patterns (especially visible to an adversary who has access * to a shared memory cache), and branches (especially visible to * an adversary who has access to a shared code cache or to a shared * branch predictor). */ size_t pad_count = 0; unsigned bad = 0; unsigned char pad_done = 0; size_t plaintext_size = 0; unsigned output_too_large; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output_max_len == 0 || output != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( olen != NULL ); ilen = ctx->len; plaintext_max_size = ( output_max_len > ilen - 11 ? ilen - 11 : output_max_len ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( ilen < 16 || ilen > sizeof( buf ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); ret = ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, input, buf ) : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf ); if( ret != 0 ) goto cleanup; /* Check and get padding length in constant time and constant * memory trace. The first byte must be 0. */ bad |= buf[0]; if( mode == MBEDTLS_RSA_PRIVATE ) { /* Decode EME-PKCS1-v1_5 padding: 0x00 || 0x02 || PS || 0x00 * where PS must be at least 8 nonzero bytes. */ bad |= buf[1] ^ MBEDTLS_RSA_CRYPT; /* Read the whole buffer. Set pad_done to nonzero if we find * the 0x00 byte and remember the padding length in pad_count. */ for( i = 2; i < ilen; i++ ) { pad_done |= ((buf[i] | (unsigned char)-buf[i]) >> 7) ^ 1; pad_count += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1; } } else { /* Decode EMSA-PKCS1-v1_5 padding: 0x00 || 0x01 || PS || 0x00 * where PS must be at least 8 bytes with the value 0xFF. */ bad |= buf[1] ^ MBEDTLS_RSA_SIGN; /* Read the whole buffer. Set pad_done to nonzero if we find * the 0x00 byte and remember the padding length in pad_count. * If there's a non-0xff byte in the padding, the padding is bad. */ for( i = 2; i < ilen; i++ ) { pad_done |= if_int( buf[i], 0, 1 ); pad_count += if_int( pad_done, 0, 1 ); bad |= if_int( pad_done, 0, buf[i] ^ 0xFF ); } } /* If pad_done is still zero, there's no data, only unfinished padding. */ bad |= if_int( pad_done, 0, 1 ); /* There must be at least 8 bytes of padding. */ bad |= size_greater_than( 8, pad_count ); /* If the padding is valid, set plaintext_size to the number of * remaining bytes after stripping the padding. If the padding * is invalid, avoid leaking this fact through the size of the * output: use the maximum message size that fits in the output * buffer. Do it without branches to avoid leaking the padding * validity through timing. RSA keys are small enough that all the * size_t values involved fit in unsigned int. */ plaintext_size = if_int( bad, (unsigned) plaintext_max_size, (unsigned) ( ilen - pad_count - 3 ) ); /* Set output_too_large to 0 if the plaintext fits in the output * buffer and to 1 otherwise. */ output_too_large = size_greater_than( plaintext_size, plaintext_max_size ); /* Set ret without branches to avoid timing attacks. Return: * - INVALID_PADDING if the padding is bad (bad != 0). * - OUTPUT_TOO_LARGE if the padding is good but the decrypted * plaintext does not fit in the output buffer. * - 0 if the padding is correct. */ ret = - (int) if_int( bad, - MBEDTLS_ERR_RSA_INVALID_PADDING, if_int( output_too_large, - MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE, 0 ) ); /* If the padding is bad or the plaintext is too large, zero the * data that we're about to copy to the output buffer. * We need to copy the same amount of data * from the same buffer whether the padding is good or not to * avoid leaking the padding validity through overall timing or * through memory or cache access patterns. */ bad = all_or_nothing_int( bad | output_too_large ); for( i = 11; i < ilen; i++ ) buf[i] &= ~bad; /* If the plaintext is too large, truncate it to the buffer size. * Copy anyway to avoid revealing the length through timing, because * revealing the length is as bad as revealing the padding validity * for a Bleichenbacher attack. */ plaintext_size = if_int( output_too_large, (unsigned) plaintext_max_size, (unsigned) plaintext_size ); /* Move the plaintext to the leftmost position where it can start in * the working buffer, i.e. make it start plaintext_max_size from * the end of the buffer. Do this with a memory access trace that * does not depend on the plaintext size. After this move, the * starting location of the plaintext is no longer sensitive * information. */ mem_move_to_left( buf + ilen - plaintext_max_size, plaintext_max_size, plaintext_max_size - plaintext_size ); /* Finally copy the decrypted plaintext plus trailing zeros * into the output buffer. */ memcpy( output, buf + ilen - plaintext_max_size, plaintext_max_size ); /* Report the amount of data we copied to the output buffer. In case * of errors (bad padding or output too large), the value of *olen * when this function returns is not specified. Making it equivalent * to the good case limits the risks of leaking the padding validity. */ *olen = plaintext_size; cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Do an RSA operation, then remove the message padding */ int mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len) { RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( output_max_len == 0 || output != NULL ); RSA_VALIDATE_RET( input != NULL ); RSA_VALIDATE_RET( olen != NULL ); switch( ctx->padding ) { #if defined(MBEDTLS_PKCS1_V15) case MBEDTLS_RSA_PKCS_V15: return mbedtls_rsa_rsaes_pkcs1_v15_decrypt( ctx, f_rng, p_rng, mode, olen, input, output, output_max_len ); #endif #if defined(MBEDTLS_PKCS1_V21) case MBEDTLS_RSA_PKCS_V21: return mbedtls_rsa_rsaes_oaep_decrypt( ctx, f_rng, p_rng, mode, NULL, 0, olen, input, output, output_max_len ); #endif default: return( MBEDTLS_ERR_RSA_INVALID_PADDING ); } } #if defined(MBEDTLS_PKCS1_V21) /* * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function */ int mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { size_t olen; unsigned char *p = sig; unsigned char salt[MBEDTLS_MD_MAX_SIZE]; size_t slen, min_slen, hlen, offset = 0; int ret; size_t msb; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); RSA_VALIDATE_RET( sig != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( f_rng == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); olen = ctx->len; if( md_alg != MBEDTLS_MD_NONE ) { /* Gather length of hash to sign */ md_info = mbedtls_md_info_from_type( md_alg ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hashlen = mbedtls_md_get_size( md_info ); } md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hlen = mbedtls_md_get_size( md_info ); /* Calculate the largest possible salt length. Normally this is the hash * length, which is the maximum length the salt can have. If there is not * enough room, use the maximum salt length that fits. The constraint is * that the hash length plus the salt length plus 2 bytes must be at most * the key length. This complies with FIPS 186-4 §5.5 (e) and RFC 8017 * (PKCS#1 v2.2) §9.1.1 step 3. */ min_slen = hlen - 2; if( olen < hlen + min_slen + 2 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); else if( olen >= hlen + hlen + 2 ) slen = hlen; else slen = olen - hlen - 2; memset( sig, 0, olen ); /* Generate salt of length slen */ if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 ) return( MBEDTLS_ERR_RSA_RNG_FAILED + ret ); /* Note: EMSA-PSS encoding is over the length of N - 1 bits */ msb = mbedtls_mpi_bitlen( &ctx->N ) - 1; p += olen - hlen - slen - 2; *p++ = 0x01; memcpy( p, salt, slen ); p += slen; mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) goto exit; /* Generate H = Hash( M' ) */ if( ( ret = mbedtls_md_starts( &md_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, p, 8 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, hash, hashlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_update( &md_ctx, salt, slen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md_finish( &md_ctx, p ) ) != 0 ) goto exit; /* Compensate for boundary condition when applying mask */ if( msb % 8 == 0 ) offset = 1; /* maskedDB: Apply dbMask to DB */ if( ( ret = mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, &md_ctx ) ) != 0 ) goto exit; msb = mbedtls_mpi_bitlen( &ctx->N ) - 1; sig[0] &= 0xFF >> ( olen * 8 - msb ); p += hlen; *p++ = 0xBC; mbedtls_platform_zeroize( salt, sizeof( salt ) ); exit: mbedtls_md_free( &md_ctx ); if( ret != 0 ) return( ret ); return( ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, sig, sig ) : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig ) ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V15) /* * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-V1_5-SIGN function */ /* Construct a PKCS v1.5 encoding of a hashed message * * This is used both for signature generation and verification. * * Parameters: * - md_alg: Identifies the hash algorithm used to generate the given hash; * MBEDTLS_MD_NONE if raw data is signed. * - hashlen: Length of hash in case hashlen is MBEDTLS_MD_NONE. * - hash: Buffer containing the hashed message or the raw data. * - dst_len: Length of the encoded message. * - dst: Buffer to hold the encoded message. * * Assumptions: * - hash has size hashlen if md_alg == MBEDTLS_MD_NONE. * - hash has size corresponding to md_alg if md_alg != MBEDTLS_MD_NONE. * - dst points to a buffer of size at least dst_len. * */ static int rsa_rsassa_pkcs1_v15_encode( mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, size_t dst_len, unsigned char *dst ) { size_t oid_size = 0; size_t nb_pad = dst_len; unsigned char *p = dst; const char *oid = NULL; /* Are we signing hashed or raw data? */ if( md_alg != MBEDTLS_MD_NONE ) { const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); if( mbedtls_oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hashlen = mbedtls_md_get_size( md_info ); /* Double-check that 8 + hashlen + oid_size can be used as a * 1-byte ASN.1 length encoding and that there's no overflow. */ if( 8 + hashlen + oid_size >= 0x80 || 10 + hashlen < hashlen || 10 + hashlen + oid_size < 10 + hashlen ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * Static bounds check: * - Need 10 bytes for five tag-length pairs. * (Insist on 1-byte length encodings to protect against variants of * Bleichenbacher's forgery attack against lax PKCS#1v1.5 verification) * - Need hashlen bytes for hash * - Need oid_size bytes for hash alg OID. */ if( nb_pad < 10 + hashlen + oid_size ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); nb_pad -= 10 + hashlen + oid_size; } else { if( nb_pad < hashlen ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); nb_pad -= hashlen; } /* Need space for signature header and padding delimiter (3 bytes), * and 8 bytes for the minimal padding */ if( nb_pad < 3 + 8 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); nb_pad -= 3; /* Now nb_pad is the amount of memory to be filled * with padding, and at least 8 bytes long. */ /* Write signature header and padding */ *p++ = 0; *p++ = MBEDTLS_RSA_SIGN; memset( p, 0xFF, nb_pad ); p += nb_pad; *p++ = 0; /* Are we signing raw data? */ if( md_alg == MBEDTLS_MD_NONE ) { memcpy( p, hash, hashlen ); return( 0 ); } /* Signing hashed data, add corresponding ASN.1 structure * * DigestInfo ::= SEQUENCE { * digestAlgorithm DigestAlgorithmIdentifier, * digest Digest } * DigestAlgorithmIdentifier ::= AlgorithmIdentifier * Digest ::= OCTET STRING * * Schematic: * TAG-SEQ + LEN [ TAG-SEQ + LEN [ TAG-OID + LEN [ OID ] * TAG-NULL + LEN [ NULL ] ] * TAG-OCTET + LEN [ HASH ] ] */ *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; *p++ = (unsigned char)( 0x08 + oid_size + hashlen ); *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED; *p++ = (unsigned char)( 0x04 + oid_size ); *p++ = MBEDTLS_ASN1_OID; *p++ = (unsigned char) oid_size; memcpy( p, oid, oid_size ); p += oid_size; *p++ = MBEDTLS_ASN1_NULL; *p++ = 0x00; *p++ = MBEDTLS_ASN1_OCTET_STRING; *p++ = (unsigned char) hashlen; memcpy( p, hash, hashlen ); p += hashlen; /* Just a sanity-check, should be automatic * after the initial bounds check. */ if( p != dst + dst_len ) { mbedtls_platform_zeroize( dst, dst_len ); return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); } return( 0 ); } /* * Do an RSA operation to sign the message digest */ int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { int ret; unsigned char *sig_try = NULL, *verif = NULL; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); RSA_VALIDATE_RET( sig != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * Prepare PKCS1-v1.5 encoding (padding and hash identifier) */ if( ( ret = rsa_rsassa_pkcs1_v15_encode( md_alg, hashlen, hash, ctx->len, sig ) ) != 0 ) return( ret ); /* * Call respective RSA primitive */ if( mode == MBEDTLS_RSA_PUBLIC ) { /* Skip verification on a public key operation */ return( mbedtls_rsa_public( ctx, sig, sig ) ); } /* Private key operation * * In order to prevent Lenstra's attack, make the signature in a * temporary buffer and check it before returning it. */ sig_try = mbedtls_calloc( 1, ctx->len ); if( sig_try == NULL ) return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); verif = mbedtls_calloc( 1, ctx->len ); if( verif == NULL ) { mbedtls_free( sig_try ); return( MBEDTLS_ERR_MPI_ALLOC_FAILED ); } MBEDTLS_MPI_CHK( mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig_try ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_public( ctx, sig_try, verif ) ); if( mbedtls_safer_memcmp( verif, sig, ctx->len ) != 0 ) { ret = MBEDTLS_ERR_RSA_PRIVATE_FAILED; goto cleanup; } memcpy( sig, sig_try, ctx->len ); cleanup: mbedtls_free( sig_try ); mbedtls_free( verif ); return( ret ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Do an RSA operation to sign the message digest */ int mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig ) { RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); RSA_VALIDATE_RET( sig != NULL ); switch( ctx->padding ) { #if defined(MBEDTLS_PKCS1_V15) case MBEDTLS_RSA_PKCS_V15: return mbedtls_rsa_rsassa_pkcs1_v15_sign( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, sig ); #endif #if defined(MBEDTLS_PKCS1_V21) case MBEDTLS_RSA_PKCS_V21: return mbedtls_rsa_rsassa_pss_sign( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, sig ); #endif default: return( MBEDTLS_ERR_RSA_INVALID_PADDING ); } } #if defined(MBEDTLS_PKCS1_V21) /* * Implementation of the PKCS#1 v2.1 RSASSA-PSS-VERIFY function */ int mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, mbedtls_md_type_t mgf1_hash_id, int expected_salt_len, const unsigned char *sig ) { int ret; size_t siglen; unsigned char *p; unsigned char *hash_start; unsigned char result[MBEDTLS_MD_MAX_SIZE]; unsigned char zeros[8]; unsigned int hlen; size_t observed_salt_len, msb; const mbedtls_md_info_t *md_info; mbedtls_md_context_t md_ctx; unsigned char buf[MBEDTLS_MPI_MAX_SIZE]; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( sig != NULL ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); siglen = ctx->len; if( siglen < 16 || siglen > sizeof( buf ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); ret = ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, sig, buf ) : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, buf ); if( ret != 0 ) return( ret ); p = buf; if( buf[siglen - 1] != 0xBC ) return( MBEDTLS_ERR_RSA_INVALID_PADDING ); if( md_alg != MBEDTLS_MD_NONE ) { /* Gather length of hash to sign */ md_info = mbedtls_md_info_from_type( md_alg ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hashlen = mbedtls_md_get_size( md_info ); } md_info = mbedtls_md_info_from_type( mgf1_hash_id ); if( md_info == NULL ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hlen = mbedtls_md_get_size( md_info ); memset( zeros, 0, 8 ); /* * Note: EMSA-PSS verification is over the length of N - 1 bits */ msb = mbedtls_mpi_bitlen( &ctx->N ) - 1; if( buf[0] >> ( 8 - siglen * 8 + msb ) ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* Compensate for boundary condition when applying mask */ if( msb % 8 == 0 ) { p++; siglen -= 1; } if( siglen < hlen + 2 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); hash_start = p + siglen - hlen - 1; mbedtls_md_init( &md_ctx ); if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 ) goto exit; ret = mgf_mask( p, siglen - hlen - 1, hash_start, hlen, &md_ctx ); if( ret != 0 ) goto exit; buf[0] &= 0xFF >> ( siglen * 8 - msb ); while( p < hash_start - 1 && *p == 0 ) p++; if( *p++ != 0x01 ) { ret = MBEDTLS_ERR_RSA_INVALID_PADDING; goto exit; } observed_salt_len = hash_start - p; if( expected_salt_len != MBEDTLS_RSA_SALT_LEN_ANY && observed_salt_len != (size_t) expected_salt_len ) { ret = MBEDTLS_ERR_RSA_INVALID_PADDING; goto exit; } /* * Generate H = Hash( M' ) */ ret = mbedtls_md_starts( &md_ctx ); if ( ret != 0 ) goto exit; ret = mbedtls_md_update( &md_ctx, zeros, 8 ); if ( ret != 0 ) goto exit; ret = mbedtls_md_update( &md_ctx, hash, hashlen ); if ( ret != 0 ) goto exit; ret = mbedtls_md_update( &md_ctx, p, observed_salt_len ); if ( ret != 0 ) goto exit; ret = mbedtls_md_finish( &md_ctx, result ); if ( ret != 0 ) goto exit; if( memcmp( hash_start, result, hlen ) != 0 ) { ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; goto exit; } exit: mbedtls_md_free( &md_ctx ); return( ret ); } /* * Simplified PKCS#1 v2.1 RSASSA-PSS-VERIFY function */ int mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ) { mbedtls_md_type_t mgf1_hash_id; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( sig != NULL ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); mgf1_hash_id = ( ctx->hash_id != MBEDTLS_MD_NONE ) ? (mbedtls_md_type_t) ctx->hash_id : md_alg; return( mbedtls_rsa_rsassa_pss_verify_ext( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, mgf1_hash_id, MBEDTLS_RSA_SALT_LEN_ANY, sig ) ); } #endif /* MBEDTLS_PKCS1_V21 */ #if defined(MBEDTLS_PKCS1_V15) /* * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-v1_5-VERIFY function */ int mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ) { int ret = 0; size_t sig_len; unsigned char *encoded = NULL, *encoded_expected = NULL; RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( sig != NULL ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); sig_len = ctx->len; if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 ) return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA ); /* * Prepare expected PKCS1 v1.5 encoding of hash. */ if( ( encoded = mbedtls_calloc( 1, sig_len ) ) == NULL || ( encoded_expected = mbedtls_calloc( 1, sig_len ) ) == NULL ) { ret = MBEDTLS_ERR_MPI_ALLOC_FAILED; goto cleanup; } if( ( ret = rsa_rsassa_pkcs1_v15_encode( md_alg, hashlen, hash, sig_len, encoded_expected ) ) != 0 ) goto cleanup; /* * Apply RSA primitive to get what should be PKCS1 encoded hash. */ ret = ( mode == MBEDTLS_RSA_PUBLIC ) ? mbedtls_rsa_public( ctx, sig, encoded ) : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, encoded ); if( ret != 0 ) goto cleanup; /* * Compare */ if( ( ret = mbedtls_safer_memcmp( encoded, encoded_expected, sig_len ) ) != 0 ) { ret = MBEDTLS_ERR_RSA_VERIFY_FAILED; goto cleanup; } cleanup: if( encoded != NULL ) { mbedtls_platform_zeroize( encoded, sig_len ); mbedtls_free( encoded ); } if( encoded_expected != NULL ) { mbedtls_platform_zeroize( encoded_expected, sig_len ); mbedtls_free( encoded_expected ); } return( ret ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Do an RSA operation and check the message digest */ int mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, const unsigned char *sig ) { RSA_VALIDATE_RET( ctx != NULL ); RSA_VALIDATE_RET( mode == MBEDTLS_RSA_PRIVATE || mode == MBEDTLS_RSA_PUBLIC ); RSA_VALIDATE_RET( sig != NULL ); RSA_VALIDATE_RET( ( md_alg == MBEDTLS_MD_NONE && hashlen == 0 ) || hash != NULL ); switch( ctx->padding ) { #if defined(MBEDTLS_PKCS1_V15) case MBEDTLS_RSA_PKCS_V15: return mbedtls_rsa_rsassa_pkcs1_v15_verify( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, sig ); #endif #if defined(MBEDTLS_PKCS1_V21) case MBEDTLS_RSA_PKCS_V21: return mbedtls_rsa_rsassa_pss_verify( ctx, f_rng, p_rng, mode, md_alg, hashlen, hash, sig ); #endif default: return( MBEDTLS_ERR_RSA_INVALID_PADDING ); } } /* * Copy the components of an RSA key */ int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src ) { int ret; RSA_VALIDATE_RET( dst != NULL ); RSA_VALIDATE_RET( src != NULL ); dst->ver = src->ver; dst->len = src->len; MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->N, &src->N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->E, &src->E ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->D, &src->D ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->P, &src->P ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Q, &src->Q ) ); #if !defined(MBEDTLS_RSA_NO_CRT) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DP, &src->DP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DQ, &src->DQ ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->QP, &src->QP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RP, &src->RP ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RQ, &src->RQ ) ); #endif MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RN, &src->RN ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vi, &src->Vi ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vf, &src->Vf ) ); dst->padding = src->padding; dst->hash_id = src->hash_id; cleanup: if( ret != 0 ) mbedtls_rsa_free( dst ); return( ret ); } /* * Free the components of an RSA key */ void mbedtls_rsa_free( mbedtls_rsa_context *ctx ) { if( ctx == NULL ) return; mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->Vf ); mbedtls_mpi_free( &ctx->RN ); mbedtls_mpi_free( &ctx->D ); mbedtls_mpi_free( &ctx->Q ); mbedtls_mpi_free( &ctx->P ); mbedtls_mpi_free( &ctx->E ); mbedtls_mpi_free( &ctx->N ); #if !defined(MBEDTLS_RSA_NO_CRT) mbedtls_mpi_free( &ctx->RQ ); mbedtls_mpi_free( &ctx->RP ); mbedtls_mpi_free( &ctx->QP ); mbedtls_mpi_free( &ctx->DQ ); mbedtls_mpi_free( &ctx->DP ); #endif /* MBEDTLS_RSA_NO_CRT */ #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif } #endif /* !MBEDTLS_RSA_ALT */ #if defined(MBEDTLS_SELF_TEST) #include "mbedtls/sha1.h" /* * Example RSA-1024 keypair, for test purposes */ #define KEY_LEN 128 #define RSA_N "9292758453063D803DD603D5E777D788" \ "8ED1D5BF35786190FA2F23EBC0848AEA" \ "DDA92CA6C3D80B32C4D109BE0F36D6AE" \ "7130B9CED7ACDF54CFC7555AC14EEBAB" \ "93A89813FBF3C4F8066D2D800F7C38A8" \ "1AE31942917403FF4946B0A83D3D3E05" \ "EE57C6F5F5606FB5D4BC6CD34EE0801A" \ "5E94BB77B07507233A0BC7BAC8F90F79" #define RSA_E "10001" #define RSA_D "24BF6185468786FDD303083D25E64EFC" \ "66CA472BC44D253102F8B4A9D3BFA750" \ "91386C0077937FE33FA3252D28855837" \ "AE1B484A8A9A45F7EE8C0C634F99E8CD" \ "DF79C5CE07EE72C7F123142198164234" \ "CABB724CF78B8173B9F880FC86322407" \ "AF1FEDFDDE2BEB674CA15F3E81A1521E" \ "071513A1E85B5DFA031F21ECAE91A34D" #define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \ "2C01CAD19EA484A87EA4377637E75500" \ "FCB2005C5C7DD6EC4AC023CDA285D796" \ "C3D9E75E1EFC42488BB4F1D13AC30A57" #define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \ "E211C2B9E5DB1ED0BF61D0D9899620F4" \ "910E4168387E3C30AA1E00C339A79508" \ "8452DD96A9A5EA5D9DCA68DA636032AF" #define PT_LEN 24 #define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \ "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD" #if defined(MBEDTLS_PKCS1_V15) static int myrand( void *rng_state, unsigned char *output, size_t len ) { #if !defined(__OpenBSD__) size_t i; if( rng_state != NULL ) rng_state = NULL; for( i = 0; i < len; ++i ) output[i] = rand(); #else if( rng_state != NULL ) rng_state = NULL; arc4random_buf( output, len ); #endif /* !OpenBSD */ return( 0 ); } #endif /* MBEDTLS_PKCS1_V15 */ /* * Checkup routine */ int mbedtls_rsa_self_test( int verbose ) { int ret = 0; #if defined(MBEDTLS_PKCS1_V15) size_t len; mbedtls_rsa_context rsa; unsigned char rsa_plaintext[PT_LEN]; unsigned char rsa_decrypted[PT_LEN]; unsigned char rsa_ciphertext[KEY_LEN]; #if defined(MBEDTLS_SHA1_C) unsigned char sha1sum[20]; #endif mbedtls_mpi K; mbedtls_mpi_init( &K ); mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_N ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, &K, NULL, NULL, NULL, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_P ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, &K, NULL, NULL, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_Q ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, NULL, &K, NULL, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_D ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, NULL, NULL, &K, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &K, 16, RSA_E ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_import( &rsa, NULL, NULL, NULL, NULL, &K ) ); MBEDTLS_MPI_CHK( mbedtls_rsa_complete( &rsa ) ); if( verbose != 0 ) mbedtls_printf( " RSA key validation: " ); if( mbedtls_rsa_check_pubkey( &rsa ) != 0 || mbedtls_rsa_check_privkey( &rsa ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n PKCS#1 encryption : " ); memcpy( rsa_plaintext, RSA_PT, PT_LEN ); if( mbedtls_rsa_pkcs1_encrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PUBLIC, PT_LEN, rsa_plaintext, rsa_ciphertext ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n PKCS#1 decryption : " ); if( mbedtls_rsa_pkcs1_decrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, &len, rsa_ciphertext, rsa_decrypted, sizeof(rsa_decrypted) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); #if defined(MBEDTLS_SHA1_C) if( verbose != 0 ) mbedtls_printf( " PKCS#1 data sign : " ); if( mbedtls_sha1_ret( rsa_plaintext, PT_LEN, sha1sum ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( 1 ); } if( mbedtls_rsa_pkcs1_sign( &rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA1, 0, sha1sum, rsa_ciphertext ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n PKCS#1 sig. verify: " ); if( mbedtls_rsa_pkcs1_verify( &rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, 0, sha1sum, rsa_ciphertext ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); #endif /* MBEDTLS_SHA1_C */ if( verbose != 0 ) mbedtls_printf( "\n" ); cleanup: mbedtls_mpi_free( &K ); mbedtls_rsa_free( &rsa ); #else /* MBEDTLS_PKCS1_V15 */ ((void) verbose); #endif /* MBEDTLS_PKCS1_V15 */ return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_RSA_C */ fldigi-4.2.05/src/mbedtls/poly1305.c0000664000175000017500000004170014611711171013646 00000000000000/** * \file poly1305.c * * \brief Poly1305 authentication algorithm. * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_POLY1305_C) #include "mbedtls/poly1305.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_POLY1305_ALT) #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* Parameter validation macros */ #define POLY1305_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA ) #define POLY1305_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #define POLY1305_BLOCK_SIZE_BYTES ( 16U ) #define BYTES_TO_U32_LE( data, offset ) \ ( (uint32_t) data[offset] \ | (uint32_t) ( (uint32_t) data[( offset ) + 1] << 8 ) \ | (uint32_t) ( (uint32_t) data[( offset ) + 2] << 16 ) \ | (uint32_t) ( (uint32_t) data[( offset ) + 3] << 24 ) \ ) /* * Our implementation is tuned for 32-bit platforms with a 64-bit multiplier. * However we provided an alternative for platforms without such a multiplier. */ #if defined(MBEDTLS_NO_64BIT_MULTIPLICATION) static uint64_t mul64( uint32_t a, uint32_t b ) { /* a = al + 2**16 ah, b = bl + 2**16 bh */ const uint16_t al = (uint16_t) a; const uint16_t bl = (uint16_t) b; const uint16_t ah = a >> 16; const uint16_t bh = b >> 16; /* ab = al*bl + 2**16 (ah*bl + bl*bh) + 2**32 ah*bh */ const uint32_t lo = (uint32_t) al * bl; const uint64_t me = (uint64_t)( (uint32_t) ah * bl ) + (uint32_t) al * bh; const uint32_t hi = (uint32_t) ah * bh; return( lo + ( me << 16 ) + ( (uint64_t) hi << 32 ) ); } #else static inline uint64_t mul64( uint32_t a, uint32_t b ) { return( (uint64_t) a * b ); } #endif /** * \brief Process blocks with Poly1305. * * \param ctx The Poly1305 context. * \param nblocks Number of blocks to process. Note that this * function only processes full blocks. * \param input Buffer containing the input block(s). * \param needs_padding Set to 0 if the padding bit has already been * applied to the input data before calling this * function. Otherwise, set this parameter to 1. */ static void poly1305_process( mbedtls_poly1305_context *ctx, size_t nblocks, const unsigned char *input, uint32_t needs_padding ) { uint64_t d0, d1, d2, d3; uint32_t acc0, acc1, acc2, acc3, acc4; uint32_t r0, r1, r2, r3; uint32_t rs1, rs2, rs3; size_t offset = 0U; size_t i; r0 = ctx->r[0]; r1 = ctx->r[1]; r2 = ctx->r[2]; r3 = ctx->r[3]; rs1 = r1 + ( r1 >> 2U ); rs2 = r2 + ( r2 >> 2U ); rs3 = r3 + ( r3 >> 2U ); acc0 = ctx->acc[0]; acc1 = ctx->acc[1]; acc2 = ctx->acc[2]; acc3 = ctx->acc[3]; acc4 = ctx->acc[4]; /* Process full blocks */ for( i = 0U; i < nblocks; i++ ) { /* The input block is treated as a 128-bit little-endian integer */ d0 = BYTES_TO_U32_LE( input, offset + 0 ); d1 = BYTES_TO_U32_LE( input, offset + 4 ); d2 = BYTES_TO_U32_LE( input, offset + 8 ); d3 = BYTES_TO_U32_LE( input, offset + 12 ); /* Compute: acc += (padded) block as a 130-bit integer */ d0 += (uint64_t) acc0; d1 += (uint64_t) acc1 + ( d0 >> 32U ); d2 += (uint64_t) acc2 + ( d1 >> 32U ); d3 += (uint64_t) acc3 + ( d2 >> 32U ); acc0 = (uint32_t) d0; acc1 = (uint32_t) d1; acc2 = (uint32_t) d2; acc3 = (uint32_t) d3; acc4 += (uint32_t) ( d3 >> 32U ) + needs_padding; /* Compute: acc *= r */ d0 = mul64( acc0, r0 ) + mul64( acc1, rs3 ) + mul64( acc2, rs2 ) + mul64( acc3, rs1 ); d1 = mul64( acc0, r1 ) + mul64( acc1, r0 ) + mul64( acc2, rs3 ) + mul64( acc3, rs2 ) + mul64( acc4, rs1 ); d2 = mul64( acc0, r2 ) + mul64( acc1, r1 ) + mul64( acc2, r0 ) + mul64( acc3, rs3 ) + mul64( acc4, rs2 ); d3 = mul64( acc0, r3 ) + mul64( acc1, r2 ) + mul64( acc2, r1 ) + mul64( acc3, r0 ) + mul64( acc4, rs3 ); acc4 *= r0; /* Compute: acc %= (2^130 - 5) (partial remainder) */ d1 += ( d0 >> 32 ); d2 += ( d1 >> 32 ); d3 += ( d2 >> 32 ); acc0 = (uint32_t) d0; acc1 = (uint32_t) d1; acc2 = (uint32_t) d2; acc3 = (uint32_t) d3; acc4 = (uint32_t) ( d3 >> 32 ) + acc4; d0 = (uint64_t) acc0 + ( acc4 >> 2 ) + ( acc4 & 0xFFFFFFFCU ); acc4 &= 3U; acc0 = (uint32_t) d0; d0 = (uint64_t) acc1 + ( d0 >> 32U ); acc1 = (uint32_t) d0; d0 = (uint64_t) acc2 + ( d0 >> 32U ); acc2 = (uint32_t) d0; d0 = (uint64_t) acc3 + ( d0 >> 32U ); acc3 = (uint32_t) d0; d0 = (uint64_t) acc4 + ( d0 >> 32U ); acc4 = (uint32_t) d0; offset += POLY1305_BLOCK_SIZE_BYTES; } ctx->acc[0] = acc0; ctx->acc[1] = acc1; ctx->acc[2] = acc2; ctx->acc[3] = acc3; ctx->acc[4] = acc4; } /** * \brief Compute the Poly1305 MAC * * \param ctx The Poly1305 context. * \param mac The buffer to where the MAC is written. Must be * big enough to contain the 16-byte MAC. */ static void poly1305_compute_mac( const mbedtls_poly1305_context *ctx, unsigned char mac[16] ) { uint64_t d; uint32_t g0, g1, g2, g3, g4; uint32_t acc0, acc1, acc2, acc3, acc4; uint32_t mask; uint32_t mask_inv; acc0 = ctx->acc[0]; acc1 = ctx->acc[1]; acc2 = ctx->acc[2]; acc3 = ctx->acc[3]; acc4 = ctx->acc[4]; /* Before adding 's' we ensure that the accumulator is mod 2^130 - 5. * We do this by calculating acc - (2^130 - 5), then checking if * the 131st bit is set. If it is, then reduce: acc -= (2^130 - 5) */ /* Calculate acc + -(2^130 - 5) */ d = ( (uint64_t) acc0 + 5U ); g0 = (uint32_t) d; d = ( (uint64_t) acc1 + ( d >> 32 ) ); g1 = (uint32_t) d; d = ( (uint64_t) acc2 + ( d >> 32 ) ); g2 = (uint32_t) d; d = ( (uint64_t) acc3 + ( d >> 32 ) ); g3 = (uint32_t) d; g4 = acc4 + (uint32_t) ( d >> 32U ); /* mask == 0xFFFFFFFF if 131st bit is set, otherwise mask == 0 */ mask = (uint32_t) 0U - ( g4 >> 2U ); mask_inv = ~mask; /* If 131st bit is set then acc=g, otherwise, acc is unmodified */ acc0 = ( acc0 & mask_inv ) | ( g0 & mask ); acc1 = ( acc1 & mask_inv ) | ( g1 & mask ); acc2 = ( acc2 & mask_inv ) | ( g2 & mask ); acc3 = ( acc3 & mask_inv ) | ( g3 & mask ); /* Add 's' */ d = (uint64_t) acc0 + ctx->s[0]; acc0 = (uint32_t) d; d = (uint64_t) acc1 + ctx->s[1] + ( d >> 32U ); acc1 = (uint32_t) d; d = (uint64_t) acc2 + ctx->s[2] + ( d >> 32U ); acc2 = (uint32_t) d; acc3 += ctx->s[3] + (uint32_t) ( d >> 32U ); /* Compute MAC (128 least significant bits of the accumulator) */ mac[ 0] = (unsigned char)( acc0 ); mac[ 1] = (unsigned char)( acc0 >> 8 ); mac[ 2] = (unsigned char)( acc0 >> 16 ); mac[ 3] = (unsigned char)( acc0 >> 24 ); mac[ 4] = (unsigned char)( acc1 ); mac[ 5] = (unsigned char)( acc1 >> 8 ); mac[ 6] = (unsigned char)( acc1 >> 16 ); mac[ 7] = (unsigned char)( acc1 >> 24 ); mac[ 8] = (unsigned char)( acc2 ); mac[ 9] = (unsigned char)( acc2 >> 8 ); mac[10] = (unsigned char)( acc2 >> 16 ); mac[11] = (unsigned char)( acc2 >> 24 ); mac[12] = (unsigned char)( acc3 ); mac[13] = (unsigned char)( acc3 >> 8 ); mac[14] = (unsigned char)( acc3 >> 16 ); mac[15] = (unsigned char)( acc3 >> 24 ); } void mbedtls_poly1305_init( mbedtls_poly1305_context *ctx ) { POLY1305_VALIDATE( ctx != NULL ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) ); } void mbedtls_poly1305_free( mbedtls_poly1305_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) ); } int mbedtls_poly1305_starts( mbedtls_poly1305_context *ctx, const unsigned char key[32] ) { POLY1305_VALIDATE_RET( ctx != NULL ); POLY1305_VALIDATE_RET( key != NULL ); /* r &= 0x0ffffffc0ffffffc0ffffffc0fffffff */ ctx->r[0] = BYTES_TO_U32_LE( key, 0 ) & 0x0FFFFFFFU; ctx->r[1] = BYTES_TO_U32_LE( key, 4 ) & 0x0FFFFFFCU; ctx->r[2] = BYTES_TO_U32_LE( key, 8 ) & 0x0FFFFFFCU; ctx->r[3] = BYTES_TO_U32_LE( key, 12 ) & 0x0FFFFFFCU; ctx->s[0] = BYTES_TO_U32_LE( key, 16 ); ctx->s[1] = BYTES_TO_U32_LE( key, 20 ); ctx->s[2] = BYTES_TO_U32_LE( key, 24 ); ctx->s[3] = BYTES_TO_U32_LE( key, 28 ); /* Initial accumulator state */ ctx->acc[0] = 0U; ctx->acc[1] = 0U; ctx->acc[2] = 0U; ctx->acc[3] = 0U; ctx->acc[4] = 0U; /* Queue initially empty */ mbedtls_platform_zeroize( ctx->queue, sizeof( ctx->queue ) ); ctx->queue_len = 0U; return( 0 ); } int mbedtls_poly1305_update( mbedtls_poly1305_context *ctx, const unsigned char *input, size_t ilen ) { size_t offset = 0U; size_t remaining = ilen; size_t queue_free_len; size_t nblocks; POLY1305_VALIDATE_RET( ctx != NULL ); POLY1305_VALIDATE_RET( ilen == 0 || input != NULL ); if( ( remaining > 0U ) && ( ctx->queue_len > 0U ) ) { queue_free_len = ( POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len ); if( ilen < queue_free_len ) { /* Not enough data to complete the block. * Store this data with the other leftovers. */ memcpy( &ctx->queue[ctx->queue_len], input, ilen ); ctx->queue_len += ilen; remaining = 0U; } else { /* Enough data to produce a complete block */ memcpy( &ctx->queue[ctx->queue_len], input, queue_free_len ); ctx->queue_len = 0U; poly1305_process( ctx, 1U, ctx->queue, 1U ); /* add padding bit */ offset += queue_free_len; remaining -= queue_free_len; } } if( remaining >= POLY1305_BLOCK_SIZE_BYTES ) { nblocks = remaining / POLY1305_BLOCK_SIZE_BYTES; poly1305_process( ctx, nblocks, &input[offset], 1U ); offset += nblocks * POLY1305_BLOCK_SIZE_BYTES; remaining %= POLY1305_BLOCK_SIZE_BYTES; } if( remaining > 0U ) { /* Store partial block */ ctx->queue_len = remaining; memcpy( ctx->queue, &input[offset], remaining ); } return( 0 ); } int mbedtls_poly1305_finish( mbedtls_poly1305_context *ctx, unsigned char mac[16] ) { POLY1305_VALIDATE_RET( ctx != NULL ); POLY1305_VALIDATE_RET( mac != NULL ); /* Process any leftover data */ if( ctx->queue_len > 0U ) { /* Add padding bit */ ctx->queue[ctx->queue_len] = 1U; ctx->queue_len++; /* Pad with zeroes */ memset( &ctx->queue[ctx->queue_len], 0, POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len ); poly1305_process( ctx, 1U, /* Process 1 block */ ctx->queue, 0U ); /* Already padded above */ } poly1305_compute_mac( ctx, mac ); return( 0 ); } int mbedtls_poly1305_mac( const unsigned char key[32], const unsigned char *input, size_t ilen, unsigned char mac[16] ) { mbedtls_poly1305_context ctx; int ret; POLY1305_VALIDATE_RET( key != NULL ); POLY1305_VALIDATE_RET( mac != NULL ); POLY1305_VALIDATE_RET( ilen == 0 || input != NULL ); mbedtls_poly1305_init( &ctx ); ret = mbedtls_poly1305_starts( &ctx, key ); if( ret != 0 ) goto cleanup; ret = mbedtls_poly1305_update( &ctx, input, ilen ); if( ret != 0 ) goto cleanup; ret = mbedtls_poly1305_finish( &ctx, mac ); cleanup: mbedtls_poly1305_free( &ctx ); return( ret ); } #endif /* MBEDTLS_POLY1305_ALT */ #if defined(MBEDTLS_SELF_TEST) static const unsigned char test_keys[2][32] = { { 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33, 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, 0xa8, 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd, 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, 0xf5, 0x1b }, { 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a, 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0, 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09, 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0 } }; static const unsigned char test_data[2][127] = { { 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, 0x6f, 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70 }, { 0x27, 0x54, 0x77, 0x61, 0x73, 0x20, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x67, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6c, 0x69, 0x74, 0x68, 0x79, 0x20, 0x74, 0x6f, 0x76, 0x65, 0x73, 0x0a, 0x44, 0x69, 0x64, 0x20, 0x67, 0x79, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x67, 0x69, 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x61, 0x62, 0x65, 0x3a, 0x0a, 0x41, 0x6c, 0x6c, 0x20, 0x6d, 0x69, 0x6d, 0x73, 0x79, 0x20, 0x77, 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x72, 0x6f, 0x67, 0x6f, 0x76, 0x65, 0x73, 0x2c, 0x0a, 0x41, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x6d, 0x65, 0x20, 0x72, 0x61, 0x74, 0x68, 0x73, 0x20, 0x6f, 0x75, 0x74, 0x67, 0x72, 0x61, 0x62, 0x65, 0x2e } }; static const size_t test_data_len[2] = { 34U, 127U }; static const unsigned char test_mac[2][16] = { { 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6, 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, 0xa9 }, { 0x45, 0x41, 0x66, 0x9a, 0x7e, 0xaa, 0xee, 0x61, 0xe7, 0x08, 0xdc, 0x7c, 0xbc, 0xc5, 0xeb, 0x62 } }; #define ASSERT( cond, args ) \ do \ { \ if( ! ( cond ) ) \ { \ if( verbose != 0 ) \ mbedtls_printf args; \ \ return( -1 ); \ } \ } \ while( 0 ) int mbedtls_poly1305_self_test( int verbose ) { unsigned char mac[16]; unsigned i; int ret; for( i = 0U; i < 2U; i++ ) { if( verbose != 0 ) mbedtls_printf( " Poly1305 test %u ", i ); ret = mbedtls_poly1305_mac( test_keys[i], test_data[i], test_data_len[i], mac ); ASSERT( 0 == ret, ( "error code: %i\n", ret ) ); ASSERT( 0 == memcmp( mac, test_mac[i], 16U ), ( "failed (mac)\n" ) ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_POLY1305_C */ fldigi-4.2.05/src/mbedtls/aria.c0000664000175000017500000011431314611711171013267 00000000000000/* * ARIA implementation * * Copyright (C) 2006-2017, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * This implementation is based on the following standards: * [1] http://210.104.33.10/ARIA/doc/ARIA-specification-e.pdf * [2] https://tools.ietf.org/html/rfc5794 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ARIA_C) #include "mbedtls/aria.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_ARIA_ALT) #include "mbedtls/platform_util.h" #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* Parameter validation macros */ #define ARIA_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA ) #define ARIA_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE( n, b, i ) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE( n, b, i ) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif /* * modify byte order: ( A B C D ) -> ( B A D C ), i.e. swap pairs of bytes * * This is submatrix P1 in [1] Appendix B.1 * * Common compilers fail to translate this to minimal number of instructions, * so let's provide asm versions for common platforms with C fallback. */ #if defined(MBEDTLS_HAVE_ASM) #if defined(__arm__) /* rev16 available from v6 up */ /* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ #if defined(__GNUC__) && \ ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \ __ARM_ARCH >= 6 static inline uint32_t aria_p1( uint32_t x ) { uint32_t r; __asm( "rev16 %0, %1" : "=l" (r) : "l" (x) ); return( r ); } #define ARIA_P1 aria_p1 #elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \ ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 ) static inline uint32_t aria_p1( uint32_t x ) { uint32_t r; __asm( "rev16 r, x" ); return( r ); } #define ARIA_P1 aria_p1 #endif #endif /* arm */ #if defined(__GNUC__) && \ defined(__i386__) || defined(__amd64__) || defined( __x86_64__) /* I couldn't find an Intel equivalent of rev16, so two instructions */ #define ARIA_P1(x) ARIA_P2( ARIA_P3( x ) ) #endif /* x86 gnuc */ #endif /* MBEDTLS_HAVE_ASM && GNUC */ #if !defined(ARIA_P1) #define ARIA_P1(x) ((((x) >> 8) & 0x00FF00FF) ^ (((x) & 0x00FF00FF) << 8)) #endif /* * modify byte order: ( A B C D ) -> ( C D A B ), i.e. rotate by 16 bits * * This is submatrix P2 in [1] Appendix B.1 * * Common compilers will translate this to a single instruction. */ #define ARIA_P2(x) (((x) >> 16) ^ ((x) << 16)) /* * modify byte order: ( A B C D ) -> ( D C B A ), i.e. change endianness * * This is submatrix P3 in [1] Appendix B.1 * * Some compilers fail to translate this to a single instruction, * so let's provide asm versions for common platforms with C fallback. */ #if defined(MBEDTLS_HAVE_ASM) #if defined(__arm__) /* rev available from v6 up */ /* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ #if defined(__GNUC__) && \ ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) && \ __ARM_ARCH >= 6 static inline uint32_t aria_p3( uint32_t x ) { uint32_t r; __asm( "rev %0, %1" : "=l" (r) : "l" (x) ); return( r ); } #define ARIA_P3 aria_p3 #elif defined(__ARMCC_VERSION) && __ARMCC_VERSION < 6000000 && \ ( __TARGET_ARCH_ARM >= 6 || __TARGET_ARCH_THUMB >= 3 ) static inline uint32_t aria_p3( uint32_t x ) { uint32_t r; __asm( "rev r, x" ); return( r ); } #define ARIA_P3 aria_p3 #endif #endif /* arm */ #if defined(__GNUC__) && \ defined(__i386__) || defined(__amd64__) || defined( __x86_64__) static inline uint32_t aria_p3( uint32_t x ) { __asm( "bswap %0" : "=r" (x) : "0" (x) ); return( x ); } #define ARIA_P3 aria_p3 #endif /* x86 gnuc */ #endif /* MBEDTLS_HAVE_ASM && GNUC */ #if !defined(ARIA_P3) #define ARIA_P3(x) ARIA_P2( ARIA_P1 ( x ) ) #endif /* * ARIA Affine Transform * (a, b, c, d) = state in/out * * If we denote the first byte of input by 0, ..., the last byte by f, * then inputs are: a = 0123, b = 4567, c = 89ab, d = cdef. * * Reading [1] 2.4 or [2] 2.4.3 in columns and performing simple * rearrangements on adjacent pairs, output is: * * a = 3210 + 4545 + 6767 + 88aa + 99bb + dccd + effe * = 3210 + 4567 + 6745 + 89ab + 98ba + dcfe + efcd * b = 0101 + 2323 + 5476 + 8998 + baab + eecc + ffdd * = 0123 + 2301 + 5476 + 89ab + ba98 + efcd + fedc * c = 0022 + 1133 + 4554 + 7667 + ab89 + dcdc + fefe * = 0123 + 1032 + 4567 + 7654 + ab89 + dcfe + fedc * d = 1001 + 2332 + 6644 + 7755 + 9898 + baba + cdef * = 1032 + 2301 + 6745 + 7654 + 98ba + ba98 + cdef * * Note: another presentation of the A transform can be found as the first * half of App. B.1 in [1] in terms of 4-byte operators P1, P2, P3 and P4. * The implementation below uses only P1 and P2 as they are sufficient. */ static inline void aria_a( uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d ) { uint32_t ta, tb, tc; ta = *b; // 4567 *b = *a; // 0123 *a = ARIA_P2( ta ); // 6745 tb = ARIA_P2( *d ); // efcd *d = ARIA_P1( *c ); // 98ba *c = ARIA_P1( tb ); // fedc ta ^= *d; // 4567+98ba tc = ARIA_P2( *b ); // 2301 ta = ARIA_P1( ta ) ^ tc ^ *c; // 2301+5476+89ab+fedc tb ^= ARIA_P2( *d ); // ba98+efcd tc ^= ARIA_P1( *a ); // 2301+7654 *b ^= ta ^ tb; // 0123+2301+5476+89ab+ba98+efcd+fedc OUT tb = ARIA_P2( tb ) ^ ta; // 2301+5476+89ab+98ba+cdef+fedc *a ^= ARIA_P1( tb ); // 3210+4567+6745+89ab+98ba+dcfe+efcd OUT ta = ARIA_P2( ta ); // 0123+7654+ab89+dcfe *d ^= ARIA_P1( ta ) ^ tc; // 1032+2301+6745+7654+98ba+ba98+cdef OUT tc = ARIA_P2( tc ); // 0123+5476 *c ^= ARIA_P1( tc ) ^ ta; // 0123+1032+4567+7654+ab89+dcfe+fedc OUT } /* * ARIA Substitution Layer SL1 / SL2 * (a, b, c, d) = state in/out * (sa, sb, sc, sd) = 256 8-bit S-Boxes (see below) * * By passing sb1, sb2, is1, is2 as S-Boxes you get SL1 * By passing is1, is2, sb1, sb2 as S-Boxes you get SL2 */ static inline void aria_sl( uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d, const uint8_t sa[256], const uint8_t sb[256], const uint8_t sc[256], const uint8_t sd[256] ) { *a = ( (uint32_t) sa[ *a & 0xFF] ) ^ (((uint32_t) sb[(*a >> 8) & 0xFF]) << 8) ^ (((uint32_t) sc[(*a >> 16) & 0xFF]) << 16) ^ (((uint32_t) sd[ *a >> 24 ]) << 24); *b = ( (uint32_t) sa[ *b & 0xFF] ) ^ (((uint32_t) sb[(*b >> 8) & 0xFF]) << 8) ^ (((uint32_t) sc[(*b >> 16) & 0xFF]) << 16) ^ (((uint32_t) sd[ *b >> 24 ]) << 24); *c = ( (uint32_t) sa[ *c & 0xFF] ) ^ (((uint32_t) sb[(*c >> 8) & 0xFF]) << 8) ^ (((uint32_t) sc[(*c >> 16) & 0xFF]) << 16) ^ (((uint32_t) sd[ *c >> 24 ]) << 24); *d = ( (uint32_t) sa[ *d & 0xFF] ) ^ (((uint32_t) sb[(*d >> 8) & 0xFF]) << 8) ^ (((uint32_t) sc[(*d >> 16) & 0xFF]) << 16) ^ (((uint32_t) sd[ *d >> 24 ]) << 24); } /* * S-Boxes */ static const uint8_t aria_sb1[256] = { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 }; static const uint8_t aria_sb2[256] = { 0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46, 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64, 0xCB, 0xB4, 0x97, 0xBE, 0x2B, 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B, 0x55, 0xF0, 0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB, 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A, 0x09, 0x45, 0xAA, 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91, 0x8D, 0x78, 0xC8, 0x95, 0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38, 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12, 0x53, 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74, 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB, 0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26, 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD, 0xA0, 0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC, 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65, 0x3B, 0x02, 0x8F, 0x3E, 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A, 0x7E, 0xC5, 0x39, 0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5, 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79, 0x86, 0xA8, 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24, 0x16, 0x82, 0x5F, 0xDA, 0xE6, 0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F, 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33, 0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D, 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3, 0xF8, 0x89, 0xDE, 0x71, 0x1A, 0xAF, 0xBA, 0xB5, 0x81 }; static const uint8_t aria_is1[256] = { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D }; static const uint8_t aria_is2[256] = { 0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1, 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E, 0x8E, 0xF1, 0xA0, 0xCC, 0xA3, 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89, 0xCB, 0x9D, 0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D, 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53, 0xAA, 0x38, 0x98, 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58, 0x67, 0x88, 0x06, 0xC3, 0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F, 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10, 0xCE, 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23, 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA, 0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19, 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55, 0x86, 0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A, 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15, 0x79, 0x26, 0xA7, 0xDE, 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0, 0xBF, 0xA4, 0x3B, 0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6, 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83, 0x16, 0xA5, 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13, 0x07, 0x4F, 0x4E, 0x45, 0xB2, 0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73, 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94, 0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3, 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7, 0xEA, 0xF7, 0x4C, 0x11, 0x33, 0x03, 0xA2, 0xAC, 0x60 }; /* * Helper for key schedule: r = FO( p, k ) ^ x */ static void aria_fo_xor( uint32_t r[4], const uint32_t p[4], const uint32_t k[4], const uint32_t x[4] ) { uint32_t a, b, c, d; a = p[0] ^ k[0]; b = p[1] ^ k[1]; c = p[2] ^ k[2]; d = p[3] ^ k[3]; aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 ); aria_a( &a, &b, &c, &d ); r[0] = a ^ x[0]; r[1] = b ^ x[1]; r[2] = c ^ x[2]; r[3] = d ^ x[3]; } /* * Helper for key schedule: r = FE( p, k ) ^ x */ static void aria_fe_xor( uint32_t r[4], const uint32_t p[4], const uint32_t k[4], const uint32_t x[4] ) { uint32_t a, b, c, d; a = p[0] ^ k[0]; b = p[1] ^ k[1]; c = p[2] ^ k[2]; d = p[3] ^ k[3]; aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 ); aria_a( &a, &b, &c, &d ); r[0] = a ^ x[0]; r[1] = b ^ x[1]; r[2] = c ^ x[2]; r[3] = d ^ x[3]; } /* * Big endian 128-bit rotation: r = a ^ (b <<< n), used only in key setup. * * We chose to store bytes into 32-bit words in little-endian format (see * GET/PUT_UINT32_LE) so we need to reverse bytes here. */ static void aria_rot128( uint32_t r[4], const uint32_t a[4], const uint32_t b[4], uint8_t n ) { uint8_t i, j; uint32_t t, u; const uint8_t n1 = n % 32; // bit offset const uint8_t n2 = n1 ? 32 - n1 : 0; // reverse bit offset j = ( n / 32 ) % 4; // initial word offset t = ARIA_P3( b[j] ); // big endian for( i = 0; i < 4; i++ ) { j = ( j + 1 ) % 4; // get next word, big endian u = ARIA_P3( b[j] ); t <<= n1; // rotate t |= u >> n2; t = ARIA_P3( t ); // back to little endian r[i] = a[i] ^ t; // store t = u; // move to next word } } /* * Set encryption key */ int mbedtls_aria_setkey_enc( mbedtls_aria_context *ctx, const unsigned char *key, unsigned int keybits ) { /* round constant masks */ const uint32_t rc[3][4] = { { 0xB7C17C51, 0x940A2227, 0xE8AB13FE, 0xE06E9AFA }, { 0xCC4AB16D, 0x20C8219E, 0xD5B128FF, 0xB0E25DEF }, { 0x1D3792DB, 0x70E92621, 0x75972403, 0x0EC9E804 } }; int i; uint32_t w[4][4], *w2; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( key != NULL ); if( keybits != 128 && keybits != 192 && keybits != 256 ) return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA ); /* Copy key to W0 (and potential remainder to W1) */ GET_UINT32_LE( w[0][0], key, 0 ); GET_UINT32_LE( w[0][1], key, 4 ); GET_UINT32_LE( w[0][2], key, 8 ); GET_UINT32_LE( w[0][3], key, 12 ); memset( w[1], 0, 16 ); if( keybits >= 192 ) { GET_UINT32_LE( w[1][0], key, 16 ); // 192 bit key GET_UINT32_LE( w[1][1], key, 20 ); } if( keybits == 256 ) { GET_UINT32_LE( w[1][2], key, 24 ); // 256 bit key GET_UINT32_LE( w[1][3], key, 28 ); } i = ( keybits - 128 ) >> 6; // index: 0, 1, 2 ctx->nr = 12 + 2 * i; // no. rounds: 12, 14, 16 aria_fo_xor( w[1], w[0], rc[i], w[1] ); // W1 = FO(W0, CK1) ^ KR i = i < 2 ? i + 1 : 0; aria_fe_xor( w[2], w[1], rc[i], w[0] ); // W2 = FE(W1, CK2) ^ W0 i = i < 2 ? i + 1 : 0; aria_fo_xor( w[3], w[2], rc[i], w[1] ); // W3 = FO(W2, CK3) ^ W1 for( i = 0; i < 4; i++ ) // create round keys { w2 = w[(i + 1) & 3]; aria_rot128( ctx->rk[i ], w[i], w2, 128 - 19 ); aria_rot128( ctx->rk[i + 4], w[i], w2, 128 - 31 ); aria_rot128( ctx->rk[i + 8], w[i], w2, 61 ); aria_rot128( ctx->rk[i + 12], w[i], w2, 31 ); } aria_rot128( ctx->rk[16], w[0], w[1], 19 ); /* w holds enough info to reconstruct the round keys */ mbedtls_platform_zeroize( w, sizeof( w ) ); return( 0 ); } /* * Set decryption key */ int mbedtls_aria_setkey_dec( mbedtls_aria_context *ctx, const unsigned char *key, unsigned int keybits ) { int i, j, k, ret; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( key != NULL ); ret = mbedtls_aria_setkey_enc( ctx, key, keybits ); if( ret != 0 ) return( ret ); /* flip the order of round keys */ for( i = 0, j = ctx->nr; i < j; i++, j-- ) { for( k = 0; k < 4; k++ ) { uint32_t t = ctx->rk[i][k]; ctx->rk[i][k] = ctx->rk[j][k]; ctx->rk[j][k] = t; } } /* apply affine transform to middle keys */ for( i = 1; i < ctx->nr; i++ ) { aria_a( &ctx->rk[i][0], &ctx->rk[i][1], &ctx->rk[i][2], &ctx->rk[i][3] ); } return( 0 ); } /* * Encrypt a block */ int mbedtls_aria_crypt_ecb( mbedtls_aria_context *ctx, const unsigned char input[MBEDTLS_ARIA_BLOCKSIZE], unsigned char output[MBEDTLS_ARIA_BLOCKSIZE] ) { int i; uint32_t a, b, c, d; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( input != NULL ); ARIA_VALIDATE_RET( output != NULL ); GET_UINT32_LE( a, input, 0 ); GET_UINT32_LE( b, input, 4 ); GET_UINT32_LE( c, input, 8 ); GET_UINT32_LE( d, input, 12 ); i = 0; while( 1 ) { a ^= ctx->rk[i][0]; b ^= ctx->rk[i][1]; c ^= ctx->rk[i][2]; d ^= ctx->rk[i][3]; i++; aria_sl( &a, &b, &c, &d, aria_sb1, aria_sb2, aria_is1, aria_is2 ); aria_a( &a, &b, &c, &d ); a ^= ctx->rk[i][0]; b ^= ctx->rk[i][1]; c ^= ctx->rk[i][2]; d ^= ctx->rk[i][3]; i++; aria_sl( &a, &b, &c, &d, aria_is1, aria_is2, aria_sb1, aria_sb2 ); if( i >= ctx->nr ) break; aria_a( &a, &b, &c, &d ); } /* final key mixing */ a ^= ctx->rk[i][0]; b ^= ctx->rk[i][1]; c ^= ctx->rk[i][2]; d ^= ctx->rk[i][3]; PUT_UINT32_LE( a, output, 0 ); PUT_UINT32_LE( b, output, 4 ); PUT_UINT32_LE( c, output, 8 ); PUT_UINT32_LE( d, output, 12 ); return( 0 ); } /* Initialize context */ void mbedtls_aria_init( mbedtls_aria_context *ctx ) { ARIA_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_aria_context ) ); } /* Clear context */ void mbedtls_aria_free( mbedtls_aria_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_aria_context ) ); } #if defined(MBEDTLS_CIPHER_MODE_CBC) /* * ARIA-CBC buffer encryption/decryption */ int mbedtls_aria_crypt_cbc( mbedtls_aria_context *ctx, int mode, size_t length, unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int i; unsigned char temp[MBEDTLS_ARIA_BLOCKSIZE]; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT || mode == MBEDTLS_ARIA_DECRYPT ); ARIA_VALIDATE_RET( length == 0 || input != NULL ); ARIA_VALIDATE_RET( length == 0 || output != NULL ); ARIA_VALIDATE_RET( iv != NULL ); if( length % MBEDTLS_ARIA_BLOCKSIZE ) return( MBEDTLS_ERR_ARIA_INVALID_INPUT_LENGTH ); if( mode == MBEDTLS_ARIA_DECRYPT ) { while( length > 0 ) { memcpy( temp, input, MBEDTLS_ARIA_BLOCKSIZE ); mbedtls_aria_crypt_ecb( ctx, input, output ); for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ ) output[i] = (unsigned char)( output[i] ^ iv[i] ); memcpy( iv, temp, MBEDTLS_ARIA_BLOCKSIZE ); input += MBEDTLS_ARIA_BLOCKSIZE; output += MBEDTLS_ARIA_BLOCKSIZE; length -= MBEDTLS_ARIA_BLOCKSIZE; } } else { while( length > 0 ) { for( i = 0; i < MBEDTLS_ARIA_BLOCKSIZE; i++ ) output[i] = (unsigned char)( input[i] ^ iv[i] ); mbedtls_aria_crypt_ecb( ctx, output, output ); memcpy( iv, output, MBEDTLS_ARIA_BLOCKSIZE ); input += MBEDTLS_ARIA_BLOCKSIZE; output += MBEDTLS_ARIA_BLOCKSIZE; length -= MBEDTLS_ARIA_BLOCKSIZE; } } return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) /* * ARIA-CFB128 buffer encryption/decryption */ int mbedtls_aria_crypt_cfb128( mbedtls_aria_context *ctx, int mode, size_t length, size_t *iv_off, unsigned char iv[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { unsigned char c; size_t n; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( mode == MBEDTLS_ARIA_ENCRYPT || mode == MBEDTLS_ARIA_DECRYPT ); ARIA_VALIDATE_RET( length == 0 || input != NULL ); ARIA_VALIDATE_RET( length == 0 || output != NULL ); ARIA_VALIDATE_RET( iv != NULL ); ARIA_VALIDATE_RET( iv_off != NULL ); n = *iv_off; /* An overly large value of n can lead to an unlimited * buffer overflow. Therefore, guard against this * outside of parameter validation. */ if( n >= MBEDTLS_ARIA_BLOCKSIZE ) return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA ); if( mode == MBEDTLS_ARIA_DECRYPT ) { while( length-- ) { if( n == 0 ) mbedtls_aria_crypt_ecb( ctx, iv, iv ); c = *input++; *output++ = c ^ iv[n]; iv[n] = c; n = ( n + 1 ) & 0x0F; } } else { while( length-- ) { if( n == 0 ) mbedtls_aria_crypt_ecb( ctx, iv, iv ); iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ ); n = ( n + 1 ) & 0x0F; } } *iv_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) /* * ARIA-CTR buffer encryption/decryption */ int mbedtls_aria_crypt_ctr( mbedtls_aria_context *ctx, size_t length, size_t *nc_off, unsigned char nonce_counter[MBEDTLS_ARIA_BLOCKSIZE], unsigned char stream_block[MBEDTLS_ARIA_BLOCKSIZE], const unsigned char *input, unsigned char *output ) { int c, i; size_t n; ARIA_VALIDATE_RET( ctx != NULL ); ARIA_VALIDATE_RET( length == 0 || input != NULL ); ARIA_VALIDATE_RET( length == 0 || output != NULL ); ARIA_VALIDATE_RET( nonce_counter != NULL ); ARIA_VALIDATE_RET( stream_block != NULL ); ARIA_VALIDATE_RET( nc_off != NULL ); n = *nc_off; /* An overly large value of n can lead to an unlimited * buffer overflow. Therefore, guard against this * outside of parameter validation. */ if( n >= MBEDTLS_ARIA_BLOCKSIZE ) return( MBEDTLS_ERR_ARIA_BAD_INPUT_DATA ); while( length-- ) { if( n == 0 ) { mbedtls_aria_crypt_ecb( ctx, nonce_counter, stream_block ); for( i = MBEDTLS_ARIA_BLOCKSIZE; i > 0; i-- ) if( ++nonce_counter[i - 1] != 0 ) break; } c = *input++; *output++ = (unsigned char)( c ^ stream_block[n] ); n = ( n + 1 ) & 0x0F; } *nc_off = n; return( 0 ); } #endif /* MBEDTLS_CIPHER_MODE_CTR */ #endif /* !MBEDTLS_ARIA_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * Basic ARIA ECB test vectors from RFC 5794 */ static const uint8_t aria_test1_ecb_key[32] = // test key { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 128 bit 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, // 192 bit 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F // 256 bit }; static const uint8_t aria_test1_ecb_pt[MBEDTLS_ARIA_BLOCKSIZE] = // plaintext { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // same for all 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF // key sizes }; static const uint8_t aria_test1_ecb_ct[3][MBEDTLS_ARIA_BLOCKSIZE] = // ciphertext { { 0xD7, 0x18, 0xFB, 0xD6, 0xAB, 0x64, 0x4C, 0x73, // 128 bit 0x9D, 0xA9, 0x5F, 0x3B, 0xE6, 0x45, 0x17, 0x78 }, { 0x26, 0x44, 0x9C, 0x18, 0x05, 0xDB, 0xE7, 0xAA, // 192 bit 0x25, 0xA4, 0x68, 0xCE, 0x26, 0x3A, 0x9E, 0x79 }, { 0xF9, 0x2B, 0xD7, 0xC7, 0x9F, 0xB7, 0x2E, 0x2F, // 256 bit 0x2B, 0x8F, 0x80, 0xC1, 0x97, 0x2D, 0x24, 0xFC } }; /* * Mode tests from "Test Vectors for ARIA" Version 1.0 * http://210.104.33.10/ARIA/doc/ARIA-testvector-e.pdf */ #if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \ defined(MBEDTLS_CIPHER_MODE_CTR)) static const uint8_t aria_test2_key[32] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 128 bit 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, // 192 bit 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff // 256 bit }; static const uint8_t aria_test2_pt[48] = { 0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, // same for all 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb, 0x11, 0x11, 0x11, 0x11, 0xcc, 0xcc, 0xcc, 0xcc, 0x11, 0x11, 0x11, 0x11, 0xdd, 0xdd, 0xdd, 0xdd, 0x22, 0x22, 0x22, 0x22, 0xaa, 0xaa, 0xaa, 0xaa, 0x22, 0x22, 0x22, 0x22, 0xbb, 0xbb, 0xbb, 0xbb, }; #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)) static const uint8_t aria_test2_iv[MBEDTLS_ARIA_BLOCKSIZE] = { 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78, // same for CBC, CFB 0x87, 0x96, 0xa5, 0xb4, 0xc3, 0xd2, 0xe1, 0xf0 // CTR has zero IV }; #endif #if defined(MBEDTLS_CIPHER_MODE_CBC) static const uint8_t aria_test2_cbc_ct[3][48] = // CBC ciphertext { { 0x49, 0xd6, 0x18, 0x60, 0xb1, 0x49, 0x09, 0x10, // 128-bit key 0x9c, 0xef, 0x0d, 0x22, 0xa9, 0x26, 0x81, 0x34, 0xfa, 0xdf, 0x9f, 0xb2, 0x31, 0x51, 0xe9, 0x64, 0x5f, 0xba, 0x75, 0x01, 0x8b, 0xdb, 0x15, 0x38, 0xb5, 0x33, 0x34, 0x63, 0x4b, 0xbf, 0x7d, 0x4c, 0xd4, 0xb5, 0x37, 0x70, 0x33, 0x06, 0x0c, 0x15 }, { 0xaf, 0xe6, 0xcf, 0x23, 0x97, 0x4b, 0x53, 0x3c, // 192-bit key 0x67, 0x2a, 0x82, 0x62, 0x64, 0xea, 0x78, 0x5f, 0x4e, 0x4f, 0x7f, 0x78, 0x0d, 0xc7, 0xf3, 0xf1, 0xe0, 0x96, 0x2b, 0x80, 0x90, 0x23, 0x86, 0xd5, 0x14, 0xe9, 0xc3, 0xe7, 0x72, 0x59, 0xde, 0x92, 0xdd, 0x11, 0x02, 0xff, 0xab, 0x08, 0x6c, 0x1e }, { 0x52, 0x3a, 0x8a, 0x80, 0x6a, 0xe6, 0x21, 0xf1, // 256-bit key 0x55, 0xfd, 0xd2, 0x8d, 0xbc, 0x34, 0xe1, 0xab, 0x7b, 0x9b, 0x42, 0x43, 0x2a, 0xd8, 0xb2, 0xef, 0xb9, 0x6e, 0x23, 0xb1, 0x3f, 0x0a, 0x6e, 0x52, 0xf3, 0x61, 0x85, 0xd5, 0x0a, 0xd0, 0x02, 0xc5, 0xf6, 0x01, 0xbe, 0xe5, 0x49, 0x3f, 0x11, 0x8b } }; #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) static const uint8_t aria_test2_cfb_ct[3][48] = // CFB ciphertext { { 0x37, 0x20, 0xe5, 0x3b, 0xa7, 0xd6, 0x15, 0x38, // 128-bit key 0x34, 0x06, 0xb0, 0x9f, 0x0a, 0x05, 0xa2, 0x00, 0xc0, 0x7c, 0x21, 0xe6, 0x37, 0x0f, 0x41, 0x3a, 0x5d, 0x13, 0x25, 0x00, 0xa6, 0x82, 0x85, 0x01, 0x7c, 0x61, 0xb4, 0x34, 0xc7, 0xb7, 0xca, 0x96, 0x85, 0xa5, 0x10, 0x71, 0x86, 0x1e, 0x4d, 0x4b }, { 0x41, 0x71, 0xf7, 0x19, 0x2b, 0xf4, 0x49, 0x54, // 192-bit key 0x94, 0xd2, 0x73, 0x61, 0x29, 0x64, 0x0f, 0x5c, 0x4d, 0x87, 0xa9, 0xa2, 0x13, 0x66, 0x4c, 0x94, 0x48, 0x47, 0x7c, 0x6e, 0xcc, 0x20, 0x13, 0x59, 0x8d, 0x97, 0x66, 0x95, 0x2d, 0xd8, 0xc3, 0x86, 0x8f, 0x17, 0xe3, 0x6e, 0xf6, 0x6f, 0xd8, 0x4b }, { 0x26, 0x83, 0x47, 0x05, 0xb0, 0xf2, 0xc0, 0xe2, // 256-bit key 0x58, 0x8d, 0x4a, 0x7f, 0x09, 0x00, 0x96, 0x35, 0xf2, 0x8b, 0xb9, 0x3d, 0x8c, 0x31, 0xf8, 0x70, 0xec, 0x1e, 0x0b, 0xdb, 0x08, 0x2b, 0x66, 0xfa, 0x40, 0x2d, 0xd9, 0xc2, 0x02, 0xbe, 0x30, 0x0c, 0x45, 0x17, 0xd1, 0x96, 0xb1, 0x4d, 0x4c, 0xe1 } }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext { { 0xac, 0x5d, 0x7d, 0xe8, 0x05, 0xa0, 0xbf, 0x1c, // 128-bit key 0x57, 0xc8, 0x54, 0x50, 0x1a, 0xf6, 0x0f, 0xa1, 0x14, 0x97, 0xe2, 0xa3, 0x45, 0x19, 0xde, 0xa1, 0x56, 0x9e, 0x91, 0xe5, 0xb5, 0xcc, 0xae, 0x2f, 0xf3, 0xbf, 0xa1, 0xbf, 0x97, 0x5f, 0x45, 0x71, 0xf4, 0x8b, 0xe1, 0x91, 0x61, 0x35, 0x46, 0xc3 }, { 0x08, 0x62, 0x5c, 0xa8, 0xfe, 0x56, 0x9c, 0x19, // 192-bit key 0xba, 0x7a, 0xf3, 0x76, 0x0a, 0x6e, 0xd1, 0xce, 0xf4, 0xd1, 0x99, 0x26, 0x3e, 0x99, 0x9d, 0xde, 0x14, 0x08, 0x2d, 0xbb, 0xa7, 0x56, 0x0b, 0x79, 0xa4, 0xc6, 0xb4, 0x56, 0xb8, 0x70, 0x7d, 0xce, 0x75, 0x1f, 0x98, 0x54, 0xf1, 0x88, 0x93, 0xdf }, { 0x30, 0x02, 0x6c, 0x32, 0x96, 0x66, 0x14, 0x17, // 256-bit key 0x21, 0x17, 0x8b, 0x99, 0xc0, 0xa1, 0xf1, 0xb2, 0xf0, 0x69, 0x40, 0x25, 0x3f, 0x7b, 0x30, 0x89, 0xe2, 0xa3, 0x0e, 0xa8, 0x6a, 0xa3, 0xc8, 0x8f, 0x59, 0x40, 0xf0, 0x5a, 0xd7, 0xee, 0x41, 0xd7, 0x13, 0x47, 0xbb, 0x72, 0x61, 0xe3, 0x48, 0xf1 } }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ #define ARIA_SELF_TEST_IF_FAIL \ { \ if( verbose ) \ mbedtls_printf( "failed\n" ); \ return( 1 ); \ } else { \ if( verbose ) \ mbedtls_printf( "passed\n" ); \ } /* * Checkup routine */ int mbedtls_aria_self_test( int verbose ) { int i; uint8_t blk[MBEDTLS_ARIA_BLOCKSIZE]; mbedtls_aria_context ctx; #if (defined(MBEDTLS_CIPHER_MODE_CFB) || defined(MBEDTLS_CIPHER_MODE_CTR)) size_t j; #endif #if (defined(MBEDTLS_CIPHER_MODE_CBC) || \ defined(MBEDTLS_CIPHER_MODE_CFB) || \ defined(MBEDTLS_CIPHER_MODE_CTR)) uint8_t buf[48], iv[MBEDTLS_ARIA_BLOCKSIZE]; #endif /* * Test set 1 */ for( i = 0; i < 3; i++ ) { /* test ECB encryption */ if( verbose ) mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i ); mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk ); if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 ) ARIA_SELF_TEST_IF_FAIL; /* test ECB decryption */ if( verbose ) mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i ); mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i ); mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk ); if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 ) ARIA_SELF_TEST_IF_FAIL; } if( verbose ) mbedtls_printf( "\n" ); /* * Test set 2 */ #if defined(MBEDTLS_CIPHER_MODE_CBC) for( i = 0; i < 3; i++ ) { /* Test CBC encryption */ if( verbose ) mbedtls_printf( " ARIA-CBC-%d (enc): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE ); memset( buf, 0x55, sizeof( buf ) ); mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv, aria_test2_pt, buf ); if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; /* Test CBC decryption */ if( verbose ) mbedtls_printf( " ARIA-CBC-%d (dec): ", 128 + 64 * i ); mbedtls_aria_setkey_dec( &ctx, aria_test2_key, 128 + 64 * i ); memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE ); memset( buf, 0xAA, sizeof( buf ) ); mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv, aria_test2_cbc_ct[i], buf ); if( memcmp( buf, aria_test2_pt, 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; } if( verbose ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CBC */ #if defined(MBEDTLS_CIPHER_MODE_CFB) for( i = 0; i < 3; i++ ) { /* Test CFB encryption */ if( verbose ) mbedtls_printf( " ARIA-CFB-%d (enc): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE ); memset( buf, 0x55, sizeof( buf ) ); j = 0; mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv, aria_test2_pt, buf ); if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; /* Test CFB decryption */ if( verbose ) mbedtls_printf( " ARIA-CFB-%d (dec): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memcpy( iv, aria_test2_iv, MBEDTLS_ARIA_BLOCKSIZE ); memset( buf, 0xAA, sizeof( buf ) ); j = 0; mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j, iv, aria_test2_cfb_ct[i], buf ); if( memcmp( buf, aria_test2_pt, 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; } if( verbose ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CFB */ #if defined(MBEDTLS_CIPHER_MODE_CTR) for( i = 0; i < 3; i++ ) { /* Test CTR encryption */ if( verbose ) mbedtls_printf( " ARIA-CTR-%d (enc): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0 memset( buf, 0x55, sizeof( buf ) ); j = 0; mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk, aria_test2_pt, buf ); if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; /* Test CTR decryption */ if( verbose ) mbedtls_printf( " ARIA-CTR-%d (dec): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test2_key, 128 + 64 * i ); memset( iv, 0, MBEDTLS_ARIA_BLOCKSIZE ); // IV = 0 memset( buf, 0xAA, sizeof( buf ) ); j = 0; mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk, aria_test2_ctr_ct[i], buf ); if( memcmp( buf, aria_test2_pt, 48 ) != 0 ) ARIA_SELF_TEST_IF_FAIL; } if( verbose ) mbedtls_printf( "\n" ); #endif /* MBEDTLS_CIPHER_MODE_CTR */ return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_ARIA_C */ fldigi-4.2.05/src/mbedtls/pkwrite.c0000664000175000017500000004272714611711171014051 00000000000000/* * Public Key layer for writing key files and structures * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PK_WRITE_C) #include "mbedtls/pk.h" #include "mbedtls/asn1write.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #endif #if defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif /* Parameter validation macros based on platform_util.h */ #define PK_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA ) #define PK_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_RSA_C) /* * RSAPublicKey ::= SEQUENCE { * modulus INTEGER, -- n * publicExponent INTEGER -- e * } */ static int pk_write_rsa_pubkey( unsigned char **p, unsigned char *start, mbedtls_rsa_context *rsa ) { int ret; size_t len = 0; mbedtls_mpi T; mbedtls_mpi_init( &T ); /* Export E */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, NULL, NULL, NULL, &T ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( p, start, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export N */ if ( ( ret = mbedtls_rsa_export( rsa, &T, NULL, NULL, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( p, start, &T ) ) < 0 ) goto end_of_export; len += ret; end_of_export: mbedtls_mpi_free( &T ); if( ret < 0 ) return( ret ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* * EC public key is an EC point */ static int pk_write_ec_pubkey( unsigned char **p, unsigned char *start, mbedtls_ecp_keypair *ec ) { int ret; size_t len = 0; unsigned char buf[MBEDTLS_ECP_MAX_PT_LEN]; if( ( ret = mbedtls_ecp_point_write_binary( &ec->grp, &ec->Q, MBEDTLS_ECP_PF_UNCOMPRESSED, &len, buf, sizeof( buf ) ) ) != 0 ) { return( ret ); } if( *p < start || (size_t)( *p - start ) < len ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *p -= len; memcpy( *p, buf, len ); return( (int) len ); } /* * ECParameters ::= CHOICE { * namedCurve OBJECT IDENTIFIER * } */ static int pk_write_ec_param( unsigned char **p, unsigned char *start, mbedtls_ecp_keypair *ec ) { int ret; size_t len = 0; const char *oid; size_t oid_len; if( ( ret = mbedtls_oid_get_oid_by_ec_grp( ec->grp.id, &oid, &oid_len ) ) != 0 ) return( ret ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) ); return( (int) len ); } #endif /* MBEDTLS_ECP_C */ int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start, const mbedtls_pk_context *key ) { int ret; size_t len = 0; PK_VALIDATE_RET( p != NULL ); PK_VALIDATE_RET( *p != NULL ); PK_VALIDATE_RET( start != NULL ); PK_VALIDATE_RET( key != NULL ); #if defined(MBEDTLS_RSA_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA ) MBEDTLS_ASN1_CHK_ADD( len, pk_write_rsa_pubkey( p, start, mbedtls_pk_rsa( *key ) ) ); else #endif #if defined(MBEDTLS_ECP_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY ) MBEDTLS_ASN1_CHK_ADD( len, pk_write_ec_pubkey( p, start, mbedtls_pk_ec( *key ) ) ); else #endif return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); return( (int) len ); } int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char *c; size_t len = 0, par_len = 0, oid_len; const char *oid; PK_VALIDATE_RET( key != NULL ); if( size == 0 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); PK_VALIDATE_RET( buf != NULL ); c = buf + size; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, key ) ); if( c - buf < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); /* * SubjectPublicKeyInfo ::= SEQUENCE { * algorithm AlgorithmIdentifier, * subjectPublicKey BIT STRING } */ *--c = 0; len += 1; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_BIT_STRING ) ); if( ( ret = mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_get_type( key ), &oid, &oid_len ) ) != 0 ) { return( ret ); } #if defined(MBEDTLS_ECP_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY ) { MBEDTLS_ASN1_CHK_ADD( par_len, pk_write_ec_param( &c, buf, mbedtls_pk_ec( *key ) ) ); } #endif MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( &c, buf, oid, oid_len, par_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } int mbedtls_pk_write_key_der( mbedtls_pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char *c; size_t len = 0; PK_VALIDATE_RET( key != NULL ); if( size == 0 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); PK_VALIDATE_RET( buf != NULL ); c = buf + size; #if defined(MBEDTLS_RSA_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA ) { mbedtls_mpi T; /* Temporary holding the exported parameters */ mbedtls_rsa_context *rsa = mbedtls_pk_rsa( *key ); /* * Export the parameters one after another to avoid simultaneous copies. */ mbedtls_mpi_init( &T ); /* Export QP */ if( ( ret = mbedtls_rsa_export_crt( rsa, NULL, NULL, &T ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export DQ */ if( ( ret = mbedtls_rsa_export_crt( rsa, NULL, &T, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export DP */ if( ( ret = mbedtls_rsa_export_crt( rsa, &T, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export Q */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, NULL, &T, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export P */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, &T, NULL, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export D */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, NULL, NULL, &T, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export E */ if ( ( ret = mbedtls_rsa_export( rsa, NULL, NULL, NULL, NULL, &T ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; /* Export N */ if ( ( ret = mbedtls_rsa_export( rsa, &T, NULL, NULL, NULL, NULL ) ) != 0 || ( ret = mbedtls_asn1_write_mpi( &c, buf, &T ) ) < 0 ) goto end_of_export; len += ret; end_of_export: mbedtls_mpi_free( &T ); if( ret < 0 ) return( ret ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 0 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); } else #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY ) { mbedtls_ecp_keypair *ec = mbedtls_pk_ec( *key ); size_t pub_len = 0, par_len = 0; /* * RFC 5915, or SEC1 Appendix C.4 * * ECPrivateKey ::= SEQUENCE { * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), * privateKey OCTET STRING, * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, * publicKey [1] BIT STRING OPTIONAL * } */ /* publicKey */ MBEDTLS_ASN1_CHK_ADD( pub_len, pk_write_ec_pubkey( &c, buf, ec ) ); if( c - buf < 1 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); *--c = 0; pub_len += 1; MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_len( &c, buf, pub_len ) ); MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_BIT_STRING ) ); MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_len( &c, buf, pub_len ) ); MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ); len += pub_len; /* parameters */ MBEDTLS_ASN1_CHK_ADD( par_len, pk_write_ec_param( &c, buf, ec ) ); MBEDTLS_ASN1_CHK_ADD( par_len, mbedtls_asn1_write_len( &c, buf, par_len ) ); MBEDTLS_ASN1_CHK_ADD( par_len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ); len += par_len; /* privateKey: write as MPI then fix tag */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &ec->d ) ); *c = MBEDTLS_ASN1_OCTET_STRING; /* version */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 1 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); } else #endif /* MBEDTLS_ECP_C */ return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); return( (int) len ); } #if defined(MBEDTLS_PEM_WRITE_C) #define PEM_BEGIN_PUBLIC_KEY "-----BEGIN PUBLIC KEY-----\n" #define PEM_END_PUBLIC_KEY "-----END PUBLIC KEY-----\n" #define PEM_BEGIN_PRIVATE_KEY_RSA "-----BEGIN RSA PRIVATE KEY-----\n" #define PEM_END_PRIVATE_KEY_RSA "-----END RSA PRIVATE KEY-----\n" #define PEM_BEGIN_PRIVATE_KEY_EC "-----BEGIN EC PRIVATE KEY-----\n" #define PEM_END_PRIVATE_KEY_EC "-----END EC PRIVATE KEY-----\n" /* * Max sizes of key per types. Shown as tag + len (+ content). */ #if defined(MBEDTLS_RSA_C) /* * RSA public keys: * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 3 * algorithm AlgorithmIdentifier, 1 + 1 (sequence) * + 1 + 1 + 9 (rsa oid) * + 1 + 1 (params null) * subjectPublicKey BIT STRING } 1 + 3 + (1 + below) * RSAPublicKey ::= SEQUENCE { 1 + 3 * modulus INTEGER, -- n 1 + 3 + MPI_MAX + 1 * publicExponent INTEGER -- e 1 + 3 + MPI_MAX + 1 * } */ #define RSA_PUB_DER_MAX_BYTES 38 + 2 * MBEDTLS_MPI_MAX_SIZE /* * RSA private keys: * RSAPrivateKey ::= SEQUENCE { 1 + 3 * version Version, 1 + 1 + 1 * modulus INTEGER, 1 + 3 + MPI_MAX + 1 * publicExponent INTEGER, 1 + 3 + MPI_MAX + 1 * privateExponent INTEGER, 1 + 3 + MPI_MAX + 1 * prime1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * prime2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * exponent1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * exponent2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * coefficient INTEGER, 1 + 3 + MPI_MAX / 2 + 1 * otherPrimeInfos OtherPrimeInfos OPTIONAL 0 (not supported) * } */ #define MPI_MAX_SIZE_2 MBEDTLS_MPI_MAX_SIZE / 2 + \ MBEDTLS_MPI_MAX_SIZE % 2 #define RSA_PRV_DER_MAX_BYTES 47 + 3 * MBEDTLS_MPI_MAX_SIZE \ + 5 * MPI_MAX_SIZE_2 #else /* MBEDTLS_RSA_C */ #define RSA_PUB_DER_MAX_BYTES 0 #define RSA_PRV_DER_MAX_BYTES 0 #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* * EC public keys: * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 2 * algorithm AlgorithmIdentifier, 1 + 1 (sequence) * + 1 + 1 + 7 (ec oid) * + 1 + 1 + 9 (namedCurve oid) * subjectPublicKey BIT STRING 1 + 2 + 1 [1] * + 1 (point format) [1] * + 2 * ECP_MAX (coords) [1] * } */ #define ECP_PUB_DER_MAX_BYTES 30 + 2 * MBEDTLS_ECP_MAX_BYTES /* * EC private keys: * ECPrivateKey ::= SEQUENCE { 1 + 2 * version INTEGER , 1 + 1 + 1 * privateKey OCTET STRING, 1 + 1 + ECP_MAX * parameters [0] ECParameters OPTIONAL, 1 + 1 + (1 + 1 + 9) * publicKey [1] BIT STRING OPTIONAL 1 + 2 + [1] above * } */ #define ECP_PRV_DER_MAX_BYTES 29 + 3 * MBEDTLS_ECP_MAX_BYTES #else /* MBEDTLS_ECP_C */ #define ECP_PUB_DER_MAX_BYTES 0 #define ECP_PRV_DER_MAX_BYTES 0 #endif /* MBEDTLS_ECP_C */ #define PUB_DER_MAX_BYTES RSA_PUB_DER_MAX_BYTES > ECP_PUB_DER_MAX_BYTES ? \ RSA_PUB_DER_MAX_BYTES : ECP_PUB_DER_MAX_BYTES #define PRV_DER_MAX_BYTES RSA_PRV_DER_MAX_BYTES > ECP_PRV_DER_MAX_BYTES ? \ RSA_PRV_DER_MAX_BYTES : ECP_PRV_DER_MAX_BYTES int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char output_buf[PUB_DER_MAX_BYTES]; size_t olen = 0; PK_VALIDATE_RET( key != NULL ); PK_VALIDATE_RET( buf != NULL || size == 0 ); if( ( ret = mbedtls_pk_write_pubkey_der( key, output_buf, sizeof(output_buf) ) ) < 0 ) { return( ret ); } if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_PUBLIC_KEY, PEM_END_PUBLIC_KEY, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); } int mbedtls_pk_write_key_pem( mbedtls_pk_context *key, unsigned char *buf, size_t size ) { int ret; unsigned char output_buf[PRV_DER_MAX_BYTES]; const char *begin, *end; size_t olen = 0; PK_VALIDATE_RET( key != NULL ); PK_VALIDATE_RET( buf != NULL || size == 0 ); if( ( ret = mbedtls_pk_write_key_der( key, output_buf, sizeof(output_buf) ) ) < 0 ) return( ret ); #if defined(MBEDTLS_RSA_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA ) { begin = PEM_BEGIN_PRIVATE_KEY_RSA; end = PEM_END_PRIVATE_KEY_RSA; } else #endif #if defined(MBEDTLS_ECP_C) if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY ) { begin = PEM_BEGIN_PRIVATE_KEY_EC; end = PEM_END_PRIVATE_KEY_EC; } else #endif return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); if( ( ret = mbedtls_pem_write_buffer( begin, end, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); } #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_PK_WRITE_C */ fldigi-4.2.05/src/mbedtls/ecp_curves.c0000664000175000017500000016077714611711171014530 00000000000000/* * Elliptic curves over GF(p): curve-specific data and functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #include "mbedtls/platform_util.h" #include #if !defined(MBEDTLS_ECP_ALT) /* Parameter validation macros based on platform_util.h */ #define ECP_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECP_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ !defined(inline) && !defined(__cplusplus) #define inline __inline #endif /* * Conversion macros for embedded constants: * build lists of mbedtls_mpi_uint's from lists of unsigned char's grouped by 8, 4 or 2 */ #if defined(MBEDTLS_HAVE_INT32) #define BYTES_TO_T_UINT_4( a, b, c, d ) \ ( (mbedtls_mpi_uint) a << 0 ) | \ ( (mbedtls_mpi_uint) b << 8 ) | \ ( (mbedtls_mpi_uint) c << 16 ) | \ ( (mbedtls_mpi_uint) d << 24 ) #define BYTES_TO_T_UINT_2( a, b ) \ BYTES_TO_T_UINT_4( a, b, 0, 0 ) #define BYTES_TO_T_UINT_8( a, b, c, d, e, f, g, h ) \ BYTES_TO_T_UINT_4( a, b, c, d ), \ BYTES_TO_T_UINT_4( e, f, g, h ) #else /* 64-bits */ #define BYTES_TO_T_UINT_8( a, b, c, d, e, f, g, h ) \ ( (mbedtls_mpi_uint) a << 0 ) | \ ( (mbedtls_mpi_uint) b << 8 ) | \ ( (mbedtls_mpi_uint) c << 16 ) | \ ( (mbedtls_mpi_uint) d << 24 ) | \ ( (mbedtls_mpi_uint) e << 32 ) | \ ( (mbedtls_mpi_uint) f << 40 ) | \ ( (mbedtls_mpi_uint) g << 48 ) | \ ( (mbedtls_mpi_uint) h << 56 ) #define BYTES_TO_T_UINT_4( a, b, c, d ) \ BYTES_TO_T_UINT_8( a, b, c, d, 0, 0, 0, 0 ) #define BYTES_TO_T_UINT_2( a, b ) \ BYTES_TO_T_UINT_8( a, b, 0, 0, 0, 0, 0, 0 ) #endif /* bits in mbedtls_mpi_uint */ /* * Note: the constants are in little-endian order * to be directly usable in MPIs */ /* * Domain parameters for secp192r1 */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) static const mbedtls_mpi_uint secp192r1_p[] = { BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp192r1_b[] = { BYTES_TO_T_UINT_8( 0xB1, 0xB9, 0x46, 0xC1, 0xEC, 0xDE, 0xB8, 0xFE ), BYTES_TO_T_UINT_8( 0x49, 0x30, 0x24, 0x72, 0xAB, 0xE9, 0xA7, 0x0F ), BYTES_TO_T_UINT_8( 0xE7, 0x80, 0x9C, 0xE5, 0x19, 0x05, 0x21, 0x64 ), }; static const mbedtls_mpi_uint secp192r1_gx[] = { BYTES_TO_T_UINT_8( 0x12, 0x10, 0xFF, 0x82, 0xFD, 0x0A, 0xFF, 0xF4 ), BYTES_TO_T_UINT_8( 0x00, 0x88, 0xA1, 0x43, 0xEB, 0x20, 0xBF, 0x7C ), BYTES_TO_T_UINT_8( 0xF6, 0x90, 0x30, 0xB0, 0x0E, 0xA8, 0x8D, 0x18 ), }; static const mbedtls_mpi_uint secp192r1_gy[] = { BYTES_TO_T_UINT_8( 0x11, 0x48, 0x79, 0x1E, 0xA1, 0x77, 0xF9, 0x73 ), BYTES_TO_T_UINT_8( 0xD5, 0xCD, 0x24, 0x6B, 0xED, 0x11, 0x10, 0x63 ), BYTES_TO_T_UINT_8( 0x78, 0xDA, 0xC8, 0xFF, 0x95, 0x2B, 0x19, 0x07 ), }; static const mbedtls_mpi_uint secp192r1_n[] = { BYTES_TO_T_UINT_8( 0x31, 0x28, 0xD2, 0xB4, 0xB1, 0xC9, 0x6B, 0x14 ), BYTES_TO_T_UINT_8( 0x36, 0xF8, 0xDE, 0x99, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ /* * Domain parameters for secp224r1 */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) static const mbedtls_mpi_uint secp224r1_p[] = { BYTES_TO_T_UINT_8( 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ), }; static const mbedtls_mpi_uint secp224r1_b[] = { BYTES_TO_T_UINT_8( 0xB4, 0xFF, 0x55, 0x23, 0x43, 0x39, 0x0B, 0x27 ), BYTES_TO_T_UINT_8( 0xBA, 0xD8, 0xBF, 0xD7, 0xB7, 0xB0, 0x44, 0x50 ), BYTES_TO_T_UINT_8( 0x56, 0x32, 0x41, 0xF5, 0xAB, 0xB3, 0x04, 0x0C ), BYTES_TO_T_UINT_4( 0x85, 0x0A, 0x05, 0xB4 ), }; static const mbedtls_mpi_uint secp224r1_gx[] = { BYTES_TO_T_UINT_8( 0x21, 0x1D, 0x5C, 0x11, 0xD6, 0x80, 0x32, 0x34 ), BYTES_TO_T_UINT_8( 0x22, 0x11, 0xC2, 0x56, 0xD3, 0xC1, 0x03, 0x4A ), BYTES_TO_T_UINT_8( 0xB9, 0x90, 0x13, 0x32, 0x7F, 0xBF, 0xB4, 0x6B ), BYTES_TO_T_UINT_4( 0xBD, 0x0C, 0x0E, 0xB7 ), }; static const mbedtls_mpi_uint secp224r1_gy[] = { BYTES_TO_T_UINT_8( 0x34, 0x7E, 0x00, 0x85, 0x99, 0x81, 0xD5, 0x44 ), BYTES_TO_T_UINT_8( 0x64, 0x47, 0x07, 0x5A, 0xA0, 0x75, 0x43, 0xCD ), BYTES_TO_T_UINT_8( 0xE6, 0xDF, 0x22, 0x4C, 0xFB, 0x23, 0xF7, 0xB5 ), BYTES_TO_T_UINT_4( 0x88, 0x63, 0x37, 0xBD ), }; static const mbedtls_mpi_uint secp224r1_n[] = { BYTES_TO_T_UINT_8( 0x3D, 0x2A, 0x5C, 0x5C, 0x45, 0x29, 0xDD, 0x13 ), BYTES_TO_T_UINT_8( 0x3E, 0xF0, 0xB8, 0xE0, 0xA2, 0x16, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_4( 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ /* * Domain parameters for secp256r1 */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) static const mbedtls_mpi_uint secp256r1_p[] = { BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp256r1_b[] = { BYTES_TO_T_UINT_8( 0x4B, 0x60, 0xD2, 0x27, 0x3E, 0x3C, 0xCE, 0x3B ), BYTES_TO_T_UINT_8( 0xF6, 0xB0, 0x53, 0xCC, 0xB0, 0x06, 0x1D, 0x65 ), BYTES_TO_T_UINT_8( 0xBC, 0x86, 0x98, 0x76, 0x55, 0xBD, 0xEB, 0xB3 ), BYTES_TO_T_UINT_8( 0xE7, 0x93, 0x3A, 0xAA, 0xD8, 0x35, 0xC6, 0x5A ), }; static const mbedtls_mpi_uint secp256r1_gx[] = { BYTES_TO_T_UINT_8( 0x96, 0xC2, 0x98, 0xD8, 0x45, 0x39, 0xA1, 0xF4 ), BYTES_TO_T_UINT_8( 0xA0, 0x33, 0xEB, 0x2D, 0x81, 0x7D, 0x03, 0x77 ), BYTES_TO_T_UINT_8( 0xF2, 0x40, 0xA4, 0x63, 0xE5, 0xE6, 0xBC, 0xF8 ), BYTES_TO_T_UINT_8( 0x47, 0x42, 0x2C, 0xE1, 0xF2, 0xD1, 0x17, 0x6B ), }; static const mbedtls_mpi_uint secp256r1_gy[] = { BYTES_TO_T_UINT_8( 0xF5, 0x51, 0xBF, 0x37, 0x68, 0x40, 0xB6, 0xCB ), BYTES_TO_T_UINT_8( 0xCE, 0x5E, 0x31, 0x6B, 0x57, 0x33, 0xCE, 0x2B ), BYTES_TO_T_UINT_8( 0x16, 0x9E, 0x0F, 0x7C, 0x4A, 0xEB, 0xE7, 0x8E ), BYTES_TO_T_UINT_8( 0x9B, 0x7F, 0x1A, 0xFE, 0xE2, 0x42, 0xE3, 0x4F ), }; static const mbedtls_mpi_uint secp256r1_n[] = { BYTES_TO_T_UINT_8( 0x51, 0x25, 0x63, 0xFC, 0xC2, 0xCA, 0xB9, 0xF3 ), BYTES_TO_T_UINT_8( 0x84, 0x9E, 0x17, 0xA7, 0xAD, 0xFA, 0xE6, 0xBC ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ /* * Domain parameters for secp384r1 */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) static const mbedtls_mpi_uint secp384r1_p[] = { BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp384r1_b[] = { BYTES_TO_T_UINT_8( 0xEF, 0x2A, 0xEC, 0xD3, 0xED, 0xC8, 0x85, 0x2A ), BYTES_TO_T_UINT_8( 0x9D, 0xD1, 0x2E, 0x8A, 0x8D, 0x39, 0x56, 0xC6 ), BYTES_TO_T_UINT_8( 0x5A, 0x87, 0x13, 0x50, 0x8F, 0x08, 0x14, 0x03 ), BYTES_TO_T_UINT_8( 0x12, 0x41, 0x81, 0xFE, 0x6E, 0x9C, 0x1D, 0x18 ), BYTES_TO_T_UINT_8( 0x19, 0x2D, 0xF8, 0xE3, 0x6B, 0x05, 0x8E, 0x98 ), BYTES_TO_T_UINT_8( 0xE4, 0xE7, 0x3E, 0xE2, 0xA7, 0x2F, 0x31, 0xB3 ), }; static const mbedtls_mpi_uint secp384r1_gx[] = { BYTES_TO_T_UINT_8( 0xB7, 0x0A, 0x76, 0x72, 0x38, 0x5E, 0x54, 0x3A ), BYTES_TO_T_UINT_8( 0x6C, 0x29, 0x55, 0xBF, 0x5D, 0xF2, 0x02, 0x55 ), BYTES_TO_T_UINT_8( 0x38, 0x2A, 0x54, 0x82, 0xE0, 0x41, 0xF7, 0x59 ), BYTES_TO_T_UINT_8( 0x98, 0x9B, 0xA7, 0x8B, 0x62, 0x3B, 0x1D, 0x6E ), BYTES_TO_T_UINT_8( 0x74, 0xAD, 0x20, 0xF3, 0x1E, 0xC7, 0xB1, 0x8E ), BYTES_TO_T_UINT_8( 0x37, 0x05, 0x8B, 0xBE, 0x22, 0xCA, 0x87, 0xAA ), }; static const mbedtls_mpi_uint secp384r1_gy[] = { BYTES_TO_T_UINT_8( 0x5F, 0x0E, 0xEA, 0x90, 0x7C, 0x1D, 0x43, 0x7A ), BYTES_TO_T_UINT_8( 0x9D, 0x81, 0x7E, 0x1D, 0xCE, 0xB1, 0x60, 0x0A ), BYTES_TO_T_UINT_8( 0xC0, 0xB8, 0xF0, 0xB5, 0x13, 0x31, 0xDA, 0xE9 ), BYTES_TO_T_UINT_8( 0x7C, 0x14, 0x9A, 0x28, 0xBD, 0x1D, 0xF4, 0xF8 ), BYTES_TO_T_UINT_8( 0x29, 0xDC, 0x92, 0x92, 0xBF, 0x98, 0x9E, 0x5D ), BYTES_TO_T_UINT_8( 0x6F, 0x2C, 0x26, 0x96, 0x4A, 0xDE, 0x17, 0x36 ), }; static const mbedtls_mpi_uint secp384r1_n[] = { BYTES_TO_T_UINT_8( 0x73, 0x29, 0xC5, 0xCC, 0x6A, 0x19, 0xEC, 0xEC ), BYTES_TO_T_UINT_8( 0x7A, 0xA7, 0xB0, 0x48, 0xB2, 0x0D, 0x1A, 0x58 ), BYTES_TO_T_UINT_8( 0xDF, 0x2D, 0x37, 0xF4, 0x81, 0x4D, 0x63, 0xC7 ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ /* * Domain parameters for secp521r1 */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) static const mbedtls_mpi_uint secp521r1_p[] = { BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_2( 0xFF, 0x01 ), }; static const mbedtls_mpi_uint secp521r1_b[] = { BYTES_TO_T_UINT_8( 0x00, 0x3F, 0x50, 0x6B, 0xD4, 0x1F, 0x45, 0xEF ), BYTES_TO_T_UINT_8( 0xF1, 0x34, 0x2C, 0x3D, 0x88, 0xDF, 0x73, 0x35 ), BYTES_TO_T_UINT_8( 0x07, 0xBF, 0xB1, 0x3B, 0xBD, 0xC0, 0x52, 0x16 ), BYTES_TO_T_UINT_8( 0x7B, 0x93, 0x7E, 0xEC, 0x51, 0x39, 0x19, 0x56 ), BYTES_TO_T_UINT_8( 0xE1, 0x09, 0xF1, 0x8E, 0x91, 0x89, 0xB4, 0xB8 ), BYTES_TO_T_UINT_8( 0xF3, 0x15, 0xB3, 0x99, 0x5B, 0x72, 0xDA, 0xA2 ), BYTES_TO_T_UINT_8( 0xEE, 0x40, 0x85, 0xB6, 0xA0, 0x21, 0x9A, 0x92 ), BYTES_TO_T_UINT_8( 0x1F, 0x9A, 0x1C, 0x8E, 0x61, 0xB9, 0x3E, 0x95 ), BYTES_TO_T_UINT_2( 0x51, 0x00 ), }; static const mbedtls_mpi_uint secp521r1_gx[] = { BYTES_TO_T_UINT_8( 0x66, 0xBD, 0xE5, 0xC2, 0x31, 0x7E, 0x7E, 0xF9 ), BYTES_TO_T_UINT_8( 0x9B, 0x42, 0x6A, 0x85, 0xC1, 0xB3, 0x48, 0x33 ), BYTES_TO_T_UINT_8( 0xDE, 0xA8, 0xFF, 0xA2, 0x27, 0xC1, 0x1D, 0xFE ), BYTES_TO_T_UINT_8( 0x28, 0x59, 0xE7, 0xEF, 0x77, 0x5E, 0x4B, 0xA1 ), BYTES_TO_T_UINT_8( 0xBA, 0x3D, 0x4D, 0x6B, 0x60, 0xAF, 0x28, 0xF8 ), BYTES_TO_T_UINT_8( 0x21, 0xB5, 0x3F, 0x05, 0x39, 0x81, 0x64, 0x9C ), BYTES_TO_T_UINT_8( 0x42, 0xB4, 0x95, 0x23, 0x66, 0xCB, 0x3E, 0x9E ), BYTES_TO_T_UINT_8( 0xCD, 0xE9, 0x04, 0x04, 0xB7, 0x06, 0x8E, 0x85 ), BYTES_TO_T_UINT_2( 0xC6, 0x00 ), }; static const mbedtls_mpi_uint secp521r1_gy[] = { BYTES_TO_T_UINT_8( 0x50, 0x66, 0xD1, 0x9F, 0x76, 0x94, 0xBE, 0x88 ), BYTES_TO_T_UINT_8( 0x40, 0xC2, 0x72, 0xA2, 0x86, 0x70, 0x3C, 0x35 ), BYTES_TO_T_UINT_8( 0x61, 0x07, 0xAD, 0x3F, 0x01, 0xB9, 0x50, 0xC5 ), BYTES_TO_T_UINT_8( 0x40, 0x26, 0xF4, 0x5E, 0x99, 0x72, 0xEE, 0x97 ), BYTES_TO_T_UINT_8( 0x2C, 0x66, 0x3E, 0x27, 0x17, 0xBD, 0xAF, 0x17 ), BYTES_TO_T_UINT_8( 0x68, 0x44, 0x9B, 0x57, 0x49, 0x44, 0xF5, 0x98 ), BYTES_TO_T_UINT_8( 0xD9, 0x1B, 0x7D, 0x2C, 0xB4, 0x5F, 0x8A, 0x5C ), BYTES_TO_T_UINT_8( 0x04, 0xC0, 0x3B, 0x9A, 0x78, 0x6A, 0x29, 0x39 ), BYTES_TO_T_UINT_2( 0x18, 0x01 ), }; static const mbedtls_mpi_uint secp521r1_n[] = { BYTES_TO_T_UINT_8( 0x09, 0x64, 0x38, 0x91, 0x1E, 0xB7, 0x6F, 0xBB ), BYTES_TO_T_UINT_8( 0xAE, 0x47, 0x9C, 0x89, 0xB8, 0xC9, 0xB5, 0x3B ), BYTES_TO_T_UINT_8( 0xD0, 0xA5, 0x09, 0xF7, 0x48, 0x01, 0xCC, 0x7F ), BYTES_TO_T_UINT_8( 0x6B, 0x96, 0x2F, 0xBF, 0x83, 0x87, 0x86, 0x51 ), BYTES_TO_T_UINT_8( 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_2( 0xFF, 0x01 ), }; #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) static const mbedtls_mpi_uint secp192k1_p[] = { BYTES_TO_T_UINT_8( 0x37, 0xEE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp192k1_a[] = { BYTES_TO_T_UINT_2( 0x00, 0x00 ), }; static const mbedtls_mpi_uint secp192k1_b[] = { BYTES_TO_T_UINT_2( 0x03, 0x00 ), }; static const mbedtls_mpi_uint secp192k1_gx[] = { BYTES_TO_T_UINT_8( 0x7D, 0x6C, 0xE0, 0xEA, 0xB1, 0xD1, 0xA5, 0x1D ), BYTES_TO_T_UINT_8( 0x34, 0xF4, 0xB7, 0x80, 0x02, 0x7D, 0xB0, 0x26 ), BYTES_TO_T_UINT_8( 0xAE, 0xE9, 0x57, 0xC0, 0x0E, 0xF1, 0x4F, 0xDB ), }; static const mbedtls_mpi_uint secp192k1_gy[] = { BYTES_TO_T_UINT_8( 0x9D, 0x2F, 0x5E, 0xD9, 0x88, 0xAA, 0x82, 0x40 ), BYTES_TO_T_UINT_8( 0x34, 0x86, 0xBE, 0x15, 0xD0, 0x63, 0x41, 0x84 ), BYTES_TO_T_UINT_8( 0xA7, 0x28, 0x56, 0x9C, 0x6D, 0x2F, 0x2F, 0x9B ), }; static const mbedtls_mpi_uint secp192k1_n[] = { BYTES_TO_T_UINT_8( 0x8D, 0xFD, 0xDE, 0x74, 0x6A, 0x46, 0x69, 0x0F ), BYTES_TO_T_UINT_8( 0x17, 0xFC, 0xF2, 0x26, 0xFE, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) static const mbedtls_mpi_uint secp224k1_p[] = { BYTES_TO_T_UINT_8( 0x6D, 0xE5, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_4( 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp224k1_a[] = { BYTES_TO_T_UINT_2( 0x00, 0x00 ), }; static const mbedtls_mpi_uint secp224k1_b[] = { BYTES_TO_T_UINT_2( 0x05, 0x00 ), }; static const mbedtls_mpi_uint secp224k1_gx[] = { BYTES_TO_T_UINT_8( 0x5C, 0xA4, 0xB7, 0xB6, 0x0E, 0x65, 0x7E, 0x0F ), BYTES_TO_T_UINT_8( 0xA9, 0x75, 0x70, 0xE4, 0xE9, 0x67, 0xA4, 0x69 ), BYTES_TO_T_UINT_8( 0xA1, 0x28, 0xFC, 0x30, 0xDF, 0x99, 0xF0, 0x4D ), BYTES_TO_T_UINT_4( 0x33, 0x5B, 0x45, 0xA1 ), }; static const mbedtls_mpi_uint secp224k1_gy[] = { BYTES_TO_T_UINT_8( 0xA5, 0x61, 0x6D, 0x55, 0xDB, 0x4B, 0xCA, 0xE2 ), BYTES_TO_T_UINT_8( 0x59, 0xBD, 0xB0, 0xC0, 0xF7, 0x19, 0xE3, 0xF7 ), BYTES_TO_T_UINT_8( 0xD6, 0xFB, 0xCA, 0x82, 0x42, 0x34, 0xBA, 0x7F ), BYTES_TO_T_UINT_4( 0xED, 0x9F, 0x08, 0x7E ), }; static const mbedtls_mpi_uint secp224k1_n[] = { BYTES_TO_T_UINT_8( 0xF7, 0xB1, 0x9F, 0x76, 0x71, 0xA9, 0xF0, 0xCA ), BYTES_TO_T_UINT_8( 0x84, 0x61, 0xEC, 0xD2, 0xE8, 0xDC, 0x01, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ), }; #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) static const mbedtls_mpi_uint secp256k1_p[] = { BYTES_TO_T_UINT_8( 0x2F, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; static const mbedtls_mpi_uint secp256k1_a[] = { BYTES_TO_T_UINT_2( 0x00, 0x00 ), }; static const mbedtls_mpi_uint secp256k1_b[] = { BYTES_TO_T_UINT_2( 0x07, 0x00 ), }; static const mbedtls_mpi_uint secp256k1_gx[] = { BYTES_TO_T_UINT_8( 0x98, 0x17, 0xF8, 0x16, 0x5B, 0x81, 0xF2, 0x59 ), BYTES_TO_T_UINT_8( 0xD9, 0x28, 0xCE, 0x2D, 0xDB, 0xFC, 0x9B, 0x02 ), BYTES_TO_T_UINT_8( 0x07, 0x0B, 0x87, 0xCE, 0x95, 0x62, 0xA0, 0x55 ), BYTES_TO_T_UINT_8( 0xAC, 0xBB, 0xDC, 0xF9, 0x7E, 0x66, 0xBE, 0x79 ), }; static const mbedtls_mpi_uint secp256k1_gy[] = { BYTES_TO_T_UINT_8( 0xB8, 0xD4, 0x10, 0xFB, 0x8F, 0xD0, 0x47, 0x9C ), BYTES_TO_T_UINT_8( 0x19, 0x54, 0x85, 0xA6, 0x48, 0xB4, 0x17, 0xFD ), BYTES_TO_T_UINT_8( 0xA8, 0x08, 0x11, 0x0E, 0xFC, 0xFB, 0xA4, 0x5D ), BYTES_TO_T_UINT_8( 0x65, 0xC4, 0xA3, 0x26, 0x77, 0xDA, 0x3A, 0x48 ), }; static const mbedtls_mpi_uint secp256k1_n[] = { BYTES_TO_T_UINT_8( 0x41, 0x41, 0x36, 0xD0, 0x8C, 0x5E, 0xD2, 0xBF ), BYTES_TO_T_UINT_8( 0x3B, 0xA0, 0x48, 0xAF, 0xE6, 0xDC, 0xAE, 0xBA ), BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ), }; #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ /* * Domain parameters for brainpoolP256r1 (RFC 5639 3.4) */ #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) static const mbedtls_mpi_uint brainpoolP256r1_p[] = { BYTES_TO_T_UINT_8( 0x77, 0x53, 0x6E, 0x1F, 0x1D, 0x48, 0x13, 0x20 ), BYTES_TO_T_UINT_8( 0x28, 0x20, 0x26, 0xD5, 0x23, 0xF6, 0x3B, 0x6E ), BYTES_TO_T_UINT_8( 0x72, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E ), BYTES_TO_T_UINT_8( 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9 ), }; static const mbedtls_mpi_uint brainpoolP256r1_a[] = { BYTES_TO_T_UINT_8( 0xD9, 0xB5, 0x30, 0xF3, 0x44, 0x4B, 0x4A, 0xE9 ), BYTES_TO_T_UINT_8( 0x6C, 0x5C, 0xDC, 0x26, 0xC1, 0x55, 0x80, 0xFB ), BYTES_TO_T_UINT_8( 0xE7, 0xFF, 0x7A, 0x41, 0x30, 0x75, 0xF6, 0xEE ), BYTES_TO_T_UINT_8( 0x57, 0x30, 0x2C, 0xFC, 0x75, 0x09, 0x5A, 0x7D ), }; static const mbedtls_mpi_uint brainpoolP256r1_b[] = { BYTES_TO_T_UINT_8( 0xB6, 0x07, 0x8C, 0xFF, 0x18, 0xDC, 0xCC, 0x6B ), BYTES_TO_T_UINT_8( 0xCE, 0xE1, 0xF7, 0x5C, 0x29, 0x16, 0x84, 0x95 ), BYTES_TO_T_UINT_8( 0xBF, 0x7C, 0xD7, 0xBB, 0xD9, 0xB5, 0x30, 0xF3 ), BYTES_TO_T_UINT_8( 0x44, 0x4B, 0x4A, 0xE9, 0x6C, 0x5C, 0xDC, 0x26 ), }; static const mbedtls_mpi_uint brainpoolP256r1_gx[] = { BYTES_TO_T_UINT_8( 0x62, 0x32, 0xCE, 0x9A, 0xBD, 0x53, 0x44, 0x3A ), BYTES_TO_T_UINT_8( 0xC2, 0x23, 0xBD, 0xE3, 0xE1, 0x27, 0xDE, 0xB9 ), BYTES_TO_T_UINT_8( 0xAF, 0xB7, 0x81, 0xFC, 0x2F, 0x48, 0x4B, 0x2C ), BYTES_TO_T_UINT_8( 0xCB, 0x57, 0x7E, 0xCB, 0xB9, 0xAE, 0xD2, 0x8B ), }; static const mbedtls_mpi_uint brainpoolP256r1_gy[] = { BYTES_TO_T_UINT_8( 0x97, 0x69, 0x04, 0x2F, 0xC7, 0x54, 0x1D, 0x5C ), BYTES_TO_T_UINT_8( 0x54, 0x8E, 0xED, 0x2D, 0x13, 0x45, 0x77, 0xC2 ), BYTES_TO_T_UINT_8( 0xC9, 0x1D, 0x61, 0x14, 0x1A, 0x46, 0xF8, 0x97 ), BYTES_TO_T_UINT_8( 0xFD, 0xC4, 0xDA, 0xC3, 0x35, 0xF8, 0x7E, 0x54 ), }; static const mbedtls_mpi_uint brainpoolP256r1_n[] = { BYTES_TO_T_UINT_8( 0xA7, 0x56, 0x48, 0x97, 0x82, 0x0E, 0x1E, 0x90 ), BYTES_TO_T_UINT_8( 0xF7, 0xA6, 0x61, 0xB5, 0xA3, 0x7A, 0x39, 0x8C ), BYTES_TO_T_UINT_8( 0x71, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E ), BYTES_TO_T_UINT_8( 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9 ), }; #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ /* * Domain parameters for brainpoolP384r1 (RFC 5639 3.6) */ #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) static const mbedtls_mpi_uint brainpoolP384r1_p[] = { BYTES_TO_T_UINT_8( 0x53, 0xEC, 0x07, 0x31, 0x13, 0x00, 0x47, 0x87 ), BYTES_TO_T_UINT_8( 0x71, 0x1A, 0x1D, 0x90, 0x29, 0xA7, 0xD3, 0xAC ), BYTES_TO_T_UINT_8( 0x23, 0x11, 0xB7, 0x7F, 0x19, 0xDA, 0xB1, 0x12 ), BYTES_TO_T_UINT_8( 0xB4, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15 ), BYTES_TO_T_UINT_8( 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F ), BYTES_TO_T_UINT_8( 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C ), }; static const mbedtls_mpi_uint brainpoolP384r1_a[] = { BYTES_TO_T_UINT_8( 0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04 ), BYTES_TO_T_UINT_8( 0xEB, 0xD4, 0x3A, 0x50, 0x4A, 0x81, 0xA5, 0x8A ), BYTES_TO_T_UINT_8( 0x0F, 0xF9, 0x91, 0xBA, 0xEF, 0x65, 0x91, 0x13 ), BYTES_TO_T_UINT_8( 0x87, 0x27, 0xB2, 0x4F, 0x8E, 0xA2, 0xBE, 0xC2 ), BYTES_TO_T_UINT_8( 0xA0, 0xAF, 0x05, 0xCE, 0x0A, 0x08, 0x72, 0x3C ), BYTES_TO_T_UINT_8( 0x0C, 0x15, 0x8C, 0x3D, 0xC6, 0x82, 0xC3, 0x7B ), }; static const mbedtls_mpi_uint brainpoolP384r1_b[] = { BYTES_TO_T_UINT_8( 0x11, 0x4C, 0x50, 0xFA, 0x96, 0x86, 0xB7, 0x3A ), BYTES_TO_T_UINT_8( 0x94, 0xC9, 0xDB, 0x95, 0x02, 0x39, 0xB4, 0x7C ), BYTES_TO_T_UINT_8( 0xD5, 0x62, 0xEB, 0x3E, 0xA5, 0x0E, 0x88, 0x2E ), BYTES_TO_T_UINT_8( 0xA6, 0xD2, 0xDC, 0x07, 0xE1, 0x7D, 0xB7, 0x2F ), BYTES_TO_T_UINT_8( 0x7C, 0x44, 0xF0, 0x16, 0x54, 0xB5, 0x39, 0x8B ), BYTES_TO_T_UINT_8( 0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04 ), }; static const mbedtls_mpi_uint brainpoolP384r1_gx[] = { BYTES_TO_T_UINT_8( 0x1E, 0xAF, 0xD4, 0x47, 0xE2, 0xB2, 0x87, 0xEF ), BYTES_TO_T_UINT_8( 0xAA, 0x46, 0xD6, 0x36, 0x34, 0xE0, 0x26, 0xE8 ), BYTES_TO_T_UINT_8( 0xE8, 0x10, 0xBD, 0x0C, 0xFE, 0xCA, 0x7F, 0xDB ), BYTES_TO_T_UINT_8( 0xE3, 0x4F, 0xF1, 0x7E, 0xE7, 0xA3, 0x47, 0x88 ), BYTES_TO_T_UINT_8( 0x6B, 0x3F, 0xC1, 0xB7, 0x81, 0x3A, 0xA6, 0xA2 ), BYTES_TO_T_UINT_8( 0xFF, 0x45, 0xCF, 0x68, 0xF0, 0x64, 0x1C, 0x1D ), }; static const mbedtls_mpi_uint brainpoolP384r1_gy[] = { BYTES_TO_T_UINT_8( 0x15, 0x53, 0x3C, 0x26, 0x41, 0x03, 0x82, 0x42 ), BYTES_TO_T_UINT_8( 0x11, 0x81, 0x91, 0x77, 0x21, 0x46, 0x46, 0x0E ), BYTES_TO_T_UINT_8( 0x28, 0x29, 0x91, 0xF9, 0x4F, 0x05, 0x9C, 0xE1 ), BYTES_TO_T_UINT_8( 0x64, 0x58, 0xEC, 0xFE, 0x29, 0x0B, 0xB7, 0x62 ), BYTES_TO_T_UINT_8( 0x52, 0xD5, 0xCF, 0x95, 0x8E, 0xEB, 0xB1, 0x5C ), BYTES_TO_T_UINT_8( 0xA4, 0xC2, 0xF9, 0x20, 0x75, 0x1D, 0xBE, 0x8A ), }; static const mbedtls_mpi_uint brainpoolP384r1_n[] = { BYTES_TO_T_UINT_8( 0x65, 0x65, 0x04, 0xE9, 0x02, 0x32, 0x88, 0x3B ), BYTES_TO_T_UINT_8( 0x10, 0xC3, 0x7F, 0x6B, 0xAF, 0xB6, 0x3A, 0xCF ), BYTES_TO_T_UINT_8( 0xA7, 0x25, 0x04, 0xAC, 0x6C, 0x6E, 0x16, 0x1F ), BYTES_TO_T_UINT_8( 0xB3, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15 ), BYTES_TO_T_UINT_8( 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F ), BYTES_TO_T_UINT_8( 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C ), }; #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ /* * Domain parameters for brainpoolP512r1 (RFC 5639 3.7) */ #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) static const mbedtls_mpi_uint brainpoolP512r1_p[] = { BYTES_TO_T_UINT_8( 0xF3, 0x48, 0x3A, 0x58, 0x56, 0x60, 0xAA, 0x28 ), BYTES_TO_T_UINT_8( 0x85, 0xC6, 0x82, 0x2D, 0x2F, 0xFF, 0x81, 0x28 ), BYTES_TO_T_UINT_8( 0xE6, 0x80, 0xA3, 0xE6, 0x2A, 0xA1, 0xCD, 0xAE ), BYTES_TO_T_UINT_8( 0x42, 0x68, 0xC6, 0x9B, 0x00, 0x9B, 0x4D, 0x7D ), BYTES_TO_T_UINT_8( 0x71, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6 ), BYTES_TO_T_UINT_8( 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB ), BYTES_TO_T_UINT_8( 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F ), BYTES_TO_T_UINT_8( 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA ), }; static const mbedtls_mpi_uint brainpoolP512r1_a[] = { BYTES_TO_T_UINT_8( 0xCA, 0x94, 0xFC, 0x77, 0x4D, 0xAC, 0xC1, 0xE7 ), BYTES_TO_T_UINT_8( 0xB9, 0xC7, 0xF2, 0x2B, 0xA7, 0x17, 0x11, 0x7F ), BYTES_TO_T_UINT_8( 0xB5, 0xC8, 0x9A, 0x8B, 0xC9, 0xF1, 0x2E, 0x0A ), BYTES_TO_T_UINT_8( 0xA1, 0x3A, 0x25, 0xA8, 0x5A, 0x5D, 0xED, 0x2D ), BYTES_TO_T_UINT_8( 0xBC, 0x63, 0x98, 0xEA, 0xCA, 0x41, 0x34, 0xA8 ), BYTES_TO_T_UINT_8( 0x10, 0x16, 0xF9, 0x3D, 0x8D, 0xDD, 0xCB, 0x94 ), BYTES_TO_T_UINT_8( 0xC5, 0x4C, 0x23, 0xAC, 0x45, 0x71, 0x32, 0xE2 ), BYTES_TO_T_UINT_8( 0x89, 0x3B, 0x60, 0x8B, 0x31, 0xA3, 0x30, 0x78 ), }; static const mbedtls_mpi_uint brainpoolP512r1_b[] = { BYTES_TO_T_UINT_8( 0x23, 0xF7, 0x16, 0x80, 0x63, 0xBD, 0x09, 0x28 ), BYTES_TO_T_UINT_8( 0xDD, 0xE5, 0xBA, 0x5E, 0xB7, 0x50, 0x40, 0x98 ), BYTES_TO_T_UINT_8( 0x67, 0x3E, 0x08, 0xDC, 0xCA, 0x94, 0xFC, 0x77 ), BYTES_TO_T_UINT_8( 0x4D, 0xAC, 0xC1, 0xE7, 0xB9, 0xC7, 0xF2, 0x2B ), BYTES_TO_T_UINT_8( 0xA7, 0x17, 0x11, 0x7F, 0xB5, 0xC8, 0x9A, 0x8B ), BYTES_TO_T_UINT_8( 0xC9, 0xF1, 0x2E, 0x0A, 0xA1, 0x3A, 0x25, 0xA8 ), BYTES_TO_T_UINT_8( 0x5A, 0x5D, 0xED, 0x2D, 0xBC, 0x63, 0x98, 0xEA ), BYTES_TO_T_UINT_8( 0xCA, 0x41, 0x34, 0xA8, 0x10, 0x16, 0xF9, 0x3D ), }; static const mbedtls_mpi_uint brainpoolP512r1_gx[] = { BYTES_TO_T_UINT_8( 0x22, 0xF8, 0xB9, 0xBC, 0x09, 0x22, 0x35, 0x8B ), BYTES_TO_T_UINT_8( 0x68, 0x5E, 0x6A, 0x40, 0x47, 0x50, 0x6D, 0x7C ), BYTES_TO_T_UINT_8( 0x5F, 0x7D, 0xB9, 0x93, 0x7B, 0x68, 0xD1, 0x50 ), BYTES_TO_T_UINT_8( 0x8D, 0xD4, 0xD0, 0xE2, 0x78, 0x1F, 0x3B, 0xFF ), BYTES_TO_T_UINT_8( 0x8E, 0x09, 0xD0, 0xF4, 0xEE, 0x62, 0x3B, 0xB4 ), BYTES_TO_T_UINT_8( 0xC1, 0x16, 0xD9, 0xB5, 0x70, 0x9F, 0xED, 0x85 ), BYTES_TO_T_UINT_8( 0x93, 0x6A, 0x4C, 0x9C, 0x2E, 0x32, 0x21, 0x5A ), BYTES_TO_T_UINT_8( 0x64, 0xD9, 0x2E, 0xD8, 0xBD, 0xE4, 0xAE, 0x81 ), }; static const mbedtls_mpi_uint brainpoolP512r1_gy[] = { BYTES_TO_T_UINT_8( 0x92, 0x08, 0xD8, 0x3A, 0x0F, 0x1E, 0xCD, 0x78 ), BYTES_TO_T_UINT_8( 0x06, 0x54, 0xF0, 0xA8, 0x2F, 0x2B, 0xCA, 0xD1 ), BYTES_TO_T_UINT_8( 0xAE, 0x63, 0x27, 0x8A, 0xD8, 0x4B, 0xCA, 0x5B ), BYTES_TO_T_UINT_8( 0x5E, 0x48, 0x5F, 0x4A, 0x49, 0xDE, 0xDC, 0xB2 ), BYTES_TO_T_UINT_8( 0x11, 0x81, 0x1F, 0x88, 0x5B, 0xC5, 0x00, 0xA0 ), BYTES_TO_T_UINT_8( 0x1A, 0x7B, 0xA5, 0x24, 0x00, 0xF7, 0x09, 0xF2 ), BYTES_TO_T_UINT_8( 0xFD, 0x22, 0x78, 0xCF, 0xA9, 0xBF, 0xEA, 0xC0 ), BYTES_TO_T_UINT_8( 0xEC, 0x32, 0x63, 0x56, 0x5D, 0x38, 0xDE, 0x7D ), }; static const mbedtls_mpi_uint brainpoolP512r1_n[] = { BYTES_TO_T_UINT_8( 0x69, 0x00, 0xA9, 0x9C, 0x82, 0x96, 0x87, 0xB5 ), BYTES_TO_T_UINT_8( 0xDD, 0xDA, 0x5D, 0x08, 0x81, 0xD3, 0xB1, 0x1D ), BYTES_TO_T_UINT_8( 0x47, 0x10, 0xAC, 0x7F, 0x19, 0x61, 0x86, 0x41 ), BYTES_TO_T_UINT_8( 0x19, 0x26, 0xA9, 0x4C, 0x41, 0x5C, 0x3E, 0x55 ), BYTES_TO_T_UINT_8( 0x70, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6 ), BYTES_TO_T_UINT_8( 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB ), BYTES_TO_T_UINT_8( 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F ), BYTES_TO_T_UINT_8( 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA ), }; #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ /* * Create an MPI from embedded constants * (assumes len is an exact multiple of sizeof mbedtls_mpi_uint) */ static inline void ecp_mpi_load( mbedtls_mpi *X, const mbedtls_mpi_uint *p, size_t len ) { X->s = 1; X->n = len / sizeof( mbedtls_mpi_uint ); X->p = (mbedtls_mpi_uint *) p; } /* * Set an MPI to static value 1 */ static inline void ecp_mpi_set1( mbedtls_mpi *X ) { static mbedtls_mpi_uint one[] = { 1 }; X->s = 1; X->n = 1; X->p = one; } /* * Make group available from embedded constants */ static int ecp_group_load( mbedtls_ecp_group *grp, const mbedtls_mpi_uint *p, size_t plen, const mbedtls_mpi_uint *a, size_t alen, const mbedtls_mpi_uint *b, size_t blen, const mbedtls_mpi_uint *gx, size_t gxlen, const mbedtls_mpi_uint *gy, size_t gylen, const mbedtls_mpi_uint *n, size_t nlen) { ecp_mpi_load( &grp->P, p, plen ); if( a != NULL ) ecp_mpi_load( &grp->A, a, alen ); ecp_mpi_load( &grp->B, b, blen ); ecp_mpi_load( &grp->N, n, nlen ); ecp_mpi_load( &grp->G.X, gx, gxlen ); ecp_mpi_load( &grp->G.Y, gy, gylen ); ecp_mpi_set1( &grp->G.Z ); grp->pbits = mbedtls_mpi_bitlen( &grp->P ); grp->nbits = mbedtls_mpi_bitlen( &grp->N ); grp->h = 1; return( 0 ); } #if defined(MBEDTLS_ECP_NIST_OPTIM) /* Forward declarations */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) static int ecp_mod_p192( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) static int ecp_mod_p224( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) static int ecp_mod_p256( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) static int ecp_mod_p384( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) static int ecp_mod_p521( mbedtls_mpi * ); #endif #define NIST_MODP( P ) grp->modp = ecp_mod_ ## P; #else #define NIST_MODP( P ) #endif /* MBEDTLS_ECP_NIST_OPTIM */ /* Additional forward declarations */ #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) static int ecp_mod_p255( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) static int ecp_mod_p448( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) static int ecp_mod_p192k1( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) static int ecp_mod_p224k1( mbedtls_mpi * ); #endif #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) static int ecp_mod_p256k1( mbedtls_mpi * ); #endif #define LOAD_GROUP_A( G ) ecp_group_load( grp, \ G ## _p, sizeof( G ## _p ), \ G ## _a, sizeof( G ## _a ), \ G ## _b, sizeof( G ## _b ), \ G ## _gx, sizeof( G ## _gx ), \ G ## _gy, sizeof( G ## _gy ), \ G ## _n, sizeof( G ## _n ) ) #define LOAD_GROUP( G ) ecp_group_load( grp, \ G ## _p, sizeof( G ## _p ), \ NULL, 0, \ G ## _b, sizeof( G ## _b ), \ G ## _gx, sizeof( G ## _gx ), \ G ## _gy, sizeof( G ## _gy ), \ G ## _n, sizeof( G ## _n ) ) #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) /* * Specialized function for creating the Curve25519 group */ static int ecp_use_curve25519( mbedtls_ecp_group *grp ) { int ret; /* Actually ( A + 2 ) / 4 */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &grp->A, 16, "01DB42" ) ); /* P = 2^255 - 19 */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &grp->P, 255 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &grp->P, &grp->P, 19 ) ); grp->pbits = mbedtls_mpi_bitlen( &grp->P ); /* N = 2^252 + 27742317777372353535851937790883648493 */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &grp->N, 16, "14DEF9DEA2F79CD65812631A5CF5D3ED" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( &grp->N, 252, 1 ) ); /* Y intentionally not set, since we use x/z coordinates. * This is used as a marker to identify Montgomery curves! */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.X, 9 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.Z, 1 ) ); mbedtls_mpi_free( &grp->G.Y ); /* Actually, the required msb for private keys */ grp->nbits = 254; cleanup: if( ret != 0 ) mbedtls_ecp_group_free( grp ); return( ret ); } #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) /* * Specialized function for creating the Curve448 group */ static int ecp_use_curve448( mbedtls_ecp_group *grp ) { mbedtls_mpi Ns; int ret; mbedtls_mpi_init( &Ns ); /* Actually ( A + 2 ) / 4 */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &grp->A, 16, "98AA" ) ); /* P = 2^448 - 2^224 - 1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &grp->P, 224 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &grp->P, &grp->P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &grp->P, 224 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &grp->P, &grp->P, 1 ) ); grp->pbits = mbedtls_mpi_bitlen( &grp->P ); /* Y intentionally not set, since we use x/z coordinates. * This is used as a marker to identify Montgomery curves! */ MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.X, 5 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.Z, 1 ) ); mbedtls_mpi_free( &grp->G.Y ); /* N = 2^446 - 13818066809895115352007386748515426880336692474882178609894547503885 */ MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( &grp->N, 446, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &Ns, 16, "8335DC163BB124B65129C96FDE933D8D723A70AADC873D6D54A7BB0D" ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &grp->N, &grp->N, &Ns ) ); /* Actually, the required msb for private keys */ grp->nbits = 447; cleanup: mbedtls_mpi_free( &Ns ); if( ret != 0 ) mbedtls_ecp_group_free( grp ); return( ret ); } #endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ /* * Set a group using well-known domain parameters */ int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id ) { ECP_VALIDATE_RET( grp != NULL ); mbedtls_ecp_group_free( grp ); grp->id = id; switch( id ) { #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) case MBEDTLS_ECP_DP_SECP192R1: NIST_MODP( p192 ); return( LOAD_GROUP( secp192r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) case MBEDTLS_ECP_DP_SECP224R1: NIST_MODP( p224 ); return( LOAD_GROUP( secp224r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) case MBEDTLS_ECP_DP_SECP256R1: NIST_MODP( p256 ); return( LOAD_GROUP( secp256r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) case MBEDTLS_ECP_DP_SECP384R1: NIST_MODP( p384 ); return( LOAD_GROUP( secp384r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) case MBEDTLS_ECP_DP_SECP521R1: NIST_MODP( p521 ); return( LOAD_GROUP( secp521r1 ) ); #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) case MBEDTLS_ECP_DP_SECP192K1: grp->modp = ecp_mod_p192k1; return( LOAD_GROUP_A( secp192k1 ) ); #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) case MBEDTLS_ECP_DP_SECP224K1: grp->modp = ecp_mod_p224k1; return( LOAD_GROUP_A( secp224k1 ) ); #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) case MBEDTLS_ECP_DP_SECP256K1: grp->modp = ecp_mod_p256k1; return( LOAD_GROUP_A( secp256k1 ) ); #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) case MBEDTLS_ECP_DP_BP256R1: return( LOAD_GROUP_A( brainpoolP256r1 ) ); #endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) case MBEDTLS_ECP_DP_BP384R1: return( LOAD_GROUP_A( brainpoolP384r1 ) ); #endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) case MBEDTLS_ECP_DP_BP512R1: return( LOAD_GROUP_A( brainpoolP512r1 ) ); #endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) case MBEDTLS_ECP_DP_CURVE25519: grp->modp = ecp_mod_p255; return( ecp_use_curve25519( grp ) ); #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) case MBEDTLS_ECP_DP_CURVE448: grp->modp = ecp_mod_p448; return( ecp_use_curve448( grp ) ); #endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ default: mbedtls_ecp_group_free( grp ); return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); } } #if defined(MBEDTLS_ECP_NIST_OPTIM) /* * Fast reduction modulo the primes used by the NIST curves. * * These functions are critical for speed, but not needed for correct * operations. So, we make the choice to heavily rely on the internals of our * bignum library, which creates a tight coupling between these functions and * our MPI implementation. However, the coupling between the ECP module and * MPI remains loose, since these functions can be deactivated at will. */ #if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) /* * Compared to the way things are presented in FIPS 186-3 D.2, * we proceed in columns, from right (least significant chunk) to left, * adding chunks to N in place, and keeping a carry for the next chunk. * This avoids moving things around in memory, and uselessly adding zeros, * compared to the more straightforward, line-oriented approach. * * For this prime we need to handle data in chunks of 64 bits. * Since this is always a multiple of our basic mbedtls_mpi_uint, we can * use a mbedtls_mpi_uint * to designate such a chunk, and small loops to handle it. */ /* Add 64-bit chunks (dst += src) and update carry */ static inline void add64( mbedtls_mpi_uint *dst, mbedtls_mpi_uint *src, mbedtls_mpi_uint *carry ) { unsigned char i; mbedtls_mpi_uint c = 0; for( i = 0; i < 8 / sizeof( mbedtls_mpi_uint ); i++, dst++, src++ ) { *dst += c; c = ( *dst < c ); *dst += *src; c += ( *dst < *src ); } *carry += c; } /* Add carry to a 64-bit chunk and update carry */ static inline void carry64( mbedtls_mpi_uint *dst, mbedtls_mpi_uint *carry ) { unsigned char i; for( i = 0; i < 8 / sizeof( mbedtls_mpi_uint ); i++, dst++ ) { *dst += *carry; *carry = ( *dst < *carry ); } } #define WIDTH 8 / sizeof( mbedtls_mpi_uint ) #define A( i ) N->p + i * WIDTH #define ADD( i ) add64( p, A( i ), &c ) #define NEXT p += WIDTH; carry64( p, &c ) #define LAST p += WIDTH; *p = c; while( ++p < end ) *p = 0 /* * Fast quasi-reduction modulo p192 (FIPS 186-3 D.2.1) */ static int ecp_mod_p192( mbedtls_mpi *N ) { int ret; mbedtls_mpi_uint c = 0; mbedtls_mpi_uint *p, *end; /* Make sure we have enough blocks so that A(5) is legal */ MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, 6 * WIDTH ) ); p = N->p; end = p + N->n; ADD( 3 ); ADD( 5 ); NEXT; // A0 += A3 + A5 ADD( 3 ); ADD( 4 ); ADD( 5 ); NEXT; // A1 += A3 + A4 + A5 ADD( 4 ); ADD( 5 ); LAST; // A2 += A4 + A5 cleanup: return( ret ); } #undef WIDTH #undef A #undef ADD #undef NEXT #undef LAST #endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) /* * The reader is advised to first understand ecp_mod_p192() since the same * general structure is used here, but with additional complications: * (1) chunks of 32 bits, and (2) subtractions. */ /* * For these primes, we need to handle data in chunks of 32 bits. * This makes it more complicated if we use 64 bits limbs in MPI, * which prevents us from using a uniform access method as for p192. * * So, we define a mini abstraction layer to access 32 bit chunks, * load them in 'cur' for work, and store them back from 'cur' when done. * * While at it, also define the size of N in terms of 32-bit chunks. */ #define LOAD32 cur = A( i ); #if defined(MBEDTLS_HAVE_INT32) /* 32 bit */ #define MAX32 N->n #define A( j ) N->p[j] #define STORE32 N->p[i] = cur; #else /* 64-bit */ #define MAX32 N->n * 2 #define A( j ) j % 2 ? (uint32_t)( N->p[j/2] >> 32 ) : (uint32_t)( N->p[j/2] ) #define STORE32 \ if( i % 2 ) { \ N->p[i/2] &= 0x00000000FFFFFFFF; \ N->p[i/2] |= ((mbedtls_mpi_uint) cur) << 32; \ } else { \ N->p[i/2] &= 0xFFFFFFFF00000000; \ N->p[i/2] |= (mbedtls_mpi_uint) cur; \ } #endif /* sizeof( mbedtls_mpi_uint ) */ /* * Helpers for addition and subtraction of chunks, with signed carry. */ static inline void add32( uint32_t *dst, uint32_t src, signed char *carry ) { *dst += src; *carry += ( *dst < src ); } static inline void sub32( uint32_t *dst, uint32_t src, signed char *carry ) { *carry -= ( *dst < src ); *dst -= src; } #define ADD( j ) add32( &cur, A( j ), &c ); #define SUB( j ) sub32( &cur, A( j ), &c ); /* * Helpers for the main 'loop' * (see fix_negative for the motivation of C) */ #define INIT( b ) \ int ret; \ signed char c = 0, cc; \ uint32_t cur; \ size_t i = 0, bits = b; \ mbedtls_mpi C; \ mbedtls_mpi_uint Cp[ b / 8 / sizeof( mbedtls_mpi_uint) + 1 ]; \ \ C.s = 1; \ C.n = b / 8 / sizeof( mbedtls_mpi_uint) + 1; \ C.p = Cp; \ memset( Cp, 0, C.n * sizeof( mbedtls_mpi_uint ) ); \ \ MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, b * 2 / 8 / sizeof( mbedtls_mpi_uint ) ) ); \ LOAD32; #define NEXT \ STORE32; i++; LOAD32; \ cc = c; c = 0; \ if( cc < 0 ) \ sub32( &cur, -cc, &c ); \ else \ add32( &cur, cc, &c ); \ #define LAST \ STORE32; i++; \ cur = c > 0 ? c : 0; STORE32; \ cur = 0; while( ++i < MAX32 ) { STORE32; } \ if( c < 0 ) fix_negative( N, c, &C, bits ); /* * If the result is negative, we get it in the form * c * 2^(bits + 32) + N, with c negative and N positive shorter than 'bits' */ static inline int fix_negative( mbedtls_mpi *N, signed char c, mbedtls_mpi *C, size_t bits ) { int ret; /* C = - c * 2^(bits + 32) */ #if !defined(MBEDTLS_HAVE_INT64) ((void) bits); #else if( bits == 224 ) C->p[ C->n - 1 ] = ((mbedtls_mpi_uint) -c) << 32; else #endif C->p[ C->n - 1 ] = (mbedtls_mpi_uint) -c; /* N = - ( C - N ) */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( N, C, N ) ); N->s = -1; cleanup: return( ret ); } #if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) /* * Fast quasi-reduction modulo p224 (FIPS 186-3 D.2.2) */ static int ecp_mod_p224( mbedtls_mpi *N ) { INIT( 224 ); SUB( 7 ); SUB( 11 ); NEXT; // A0 += -A7 - A11 SUB( 8 ); SUB( 12 ); NEXT; // A1 += -A8 - A12 SUB( 9 ); SUB( 13 ); NEXT; // A2 += -A9 - A13 SUB( 10 ); ADD( 7 ); ADD( 11 ); NEXT; // A3 += -A10 + A7 + A11 SUB( 11 ); ADD( 8 ); ADD( 12 ); NEXT; // A4 += -A11 + A8 + A12 SUB( 12 ); ADD( 9 ); ADD( 13 ); NEXT; // A5 += -A12 + A9 + A13 SUB( 13 ); ADD( 10 ); LAST; // A6 += -A13 + A10 cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) /* * Fast quasi-reduction modulo p256 (FIPS 186-3 D.2.3) */ static int ecp_mod_p256( mbedtls_mpi *N ) { INIT( 256 ); ADD( 8 ); ADD( 9 ); SUB( 11 ); SUB( 12 ); SUB( 13 ); SUB( 14 ); NEXT; // A0 ADD( 9 ); ADD( 10 ); SUB( 12 ); SUB( 13 ); SUB( 14 ); SUB( 15 ); NEXT; // A1 ADD( 10 ); ADD( 11 ); SUB( 13 ); SUB( 14 ); SUB( 15 ); NEXT; // A2 ADD( 11 ); ADD( 11 ); ADD( 12 ); ADD( 12 ); ADD( 13 ); SUB( 15 ); SUB( 8 ); SUB( 9 ); NEXT; // A3 ADD( 12 ); ADD( 12 ); ADD( 13 ); ADD( 13 ); ADD( 14 ); SUB( 9 ); SUB( 10 ); NEXT; // A4 ADD( 13 ); ADD( 13 ); ADD( 14 ); ADD( 14 ); ADD( 15 ); SUB( 10 ); SUB( 11 ); NEXT; // A5 ADD( 14 ); ADD( 14 ); ADD( 15 ); ADD( 15 ); ADD( 14 ); ADD( 13 ); SUB( 8 ); SUB( 9 ); NEXT; // A6 ADD( 15 ); ADD( 15 ); ADD( 15 ); ADD( 8 ); SUB( 10 ); SUB( 11 ); SUB( 12 ); SUB( 13 ); LAST; // A7 cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) /* * Fast quasi-reduction modulo p384 (FIPS 186-3 D.2.4) */ static int ecp_mod_p384( mbedtls_mpi *N ) { INIT( 384 ); ADD( 12 ); ADD( 21 ); ADD( 20 ); SUB( 23 ); NEXT; // A0 ADD( 13 ); ADD( 22 ); ADD( 23 ); SUB( 12 ); SUB( 20 ); NEXT; // A2 ADD( 14 ); ADD( 23 ); SUB( 13 ); SUB( 21 ); NEXT; // A2 ADD( 15 ); ADD( 12 ); ADD( 20 ); ADD( 21 ); SUB( 14 ); SUB( 22 ); SUB( 23 ); NEXT; // A3 ADD( 21 ); ADD( 21 ); ADD( 16 ); ADD( 13 ); ADD( 12 ); ADD( 20 ); ADD( 22 ); SUB( 15 ); SUB( 23 ); SUB( 23 ); NEXT; // A4 ADD( 22 ); ADD( 22 ); ADD( 17 ); ADD( 14 ); ADD( 13 ); ADD( 21 ); ADD( 23 ); SUB( 16 ); NEXT; // A5 ADD( 23 ); ADD( 23 ); ADD( 18 ); ADD( 15 ); ADD( 14 ); ADD( 22 ); SUB( 17 ); NEXT; // A6 ADD( 19 ); ADD( 16 ); ADD( 15 ); ADD( 23 ); SUB( 18 ); NEXT; // A7 ADD( 20 ); ADD( 17 ); ADD( 16 ); SUB( 19 ); NEXT; // A8 ADD( 21 ); ADD( 18 ); ADD( 17 ); SUB( 20 ); NEXT; // A9 ADD( 22 ); ADD( 19 ); ADD( 18 ); SUB( 21 ); NEXT; // A10 ADD( 23 ); ADD( 20 ); ADD( 19 ); SUB( 22 ); LAST; // A11 cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #undef A #undef LOAD32 #undef STORE32 #undef MAX32 #undef INIT #undef NEXT #undef LAST #endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED || MBEDTLS_ECP_DP_SECP256R1_ENABLED || MBEDTLS_ECP_DP_SECP384R1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) /* * Here we have an actual Mersenne prime, so things are more straightforward. * However, chunks are aligned on a 'weird' boundary (521 bits). */ /* Size of p521 in terms of mbedtls_mpi_uint */ #define P521_WIDTH ( 521 / 8 / sizeof( mbedtls_mpi_uint ) + 1 ) /* Bits to keep in the most significant mbedtls_mpi_uint */ #define P521_MASK 0x01FF /* * Fast quasi-reduction modulo p521 (FIPS 186-3 D.2.5) * Write N as A1 + 2^521 A0, return A0 + A1 */ static int ecp_mod_p521( mbedtls_mpi *N ) { int ret; size_t i; mbedtls_mpi M; mbedtls_mpi_uint Mp[P521_WIDTH + 1]; /* Worst case for the size of M is when mbedtls_mpi_uint is 16 bits: * we need to hold bits 513 to 1056, which is 34 limbs, that is * P521_WIDTH + 1. Otherwise P521_WIDTH is enough. */ if( N->n < P521_WIDTH ) return( 0 ); /* M = A1 */ M.s = 1; M.n = N->n - ( P521_WIDTH - 1 ); if( M.n > P521_WIDTH + 1 ) M.n = P521_WIDTH + 1; M.p = Mp; memcpy( Mp, N->p + P521_WIDTH - 1, M.n * sizeof( mbedtls_mpi_uint ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, 521 % ( 8 * sizeof( mbedtls_mpi_uint ) ) ) ); /* N = A0 */ N->p[P521_WIDTH - 1] &= P521_MASK; for( i = P521_WIDTH; i < N->n; i++ ) N->p[i] = 0; /* N = A0 + A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) ); cleanup: return( ret ); } #undef P521_WIDTH #undef P521_MASK #endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */ #endif /* MBEDTLS_ECP_NIST_OPTIM */ #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) /* Size of p255 in terms of mbedtls_mpi_uint */ #define P255_WIDTH ( 255 / 8 / sizeof( mbedtls_mpi_uint ) + 1 ) /* * Fast quasi-reduction modulo p255 = 2^255 - 19 * Write N as A0 + 2^255 A1, return A0 + 19 * A1 */ static int ecp_mod_p255( mbedtls_mpi *N ) { int ret; size_t i; mbedtls_mpi M; mbedtls_mpi_uint Mp[P255_WIDTH + 2]; if( N->n < P255_WIDTH ) return( 0 ); /* M = A1 */ M.s = 1; M.n = N->n - ( P255_WIDTH - 1 ); if( M.n > P255_WIDTH + 1 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); M.p = Mp; memset( Mp, 0, sizeof Mp ); memcpy( Mp, N->p + P255_WIDTH - 1, M.n * sizeof( mbedtls_mpi_uint ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, 255 % ( 8 * sizeof( mbedtls_mpi_uint ) ) ) ); M.n++; /* Make room for multiplication by 19 */ /* N = A0 */ MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( N, 255, 0 ) ); for( i = P255_WIDTH; i < N->n; i++ ) N->p[i] = 0; /* N = A0 + 19 * A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &M, 19 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) ); cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */ #if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED) /* Size of p448 in terms of mbedtls_mpi_uint */ #define P448_WIDTH ( 448 / 8 / sizeof( mbedtls_mpi_uint ) ) /* Number of limbs fully occupied by 2^224 (max), and limbs used by it (min) */ #define DIV_ROUND_UP( X, Y ) ( ( ( X ) + ( Y ) - 1 ) / ( Y ) ) #define P224_WIDTH_MIN ( 28 / sizeof( mbedtls_mpi_uint ) ) #define P224_WIDTH_MAX DIV_ROUND_UP( 28, sizeof( mbedtls_mpi_uint ) ) #define P224_UNUSED_BITS ( ( P224_WIDTH_MAX * sizeof( mbedtls_mpi_uint ) * 8 ) - 224 ) /* * Fast quasi-reduction modulo p448 = 2^448 - 2^224 - 1 * Write N as A0 + 2^448 A1 and A1 as B0 + 2^224 B1, and return * A0 + A1 + B1 + (B0 + B1) * 2^224. This is different to the reference * implementation of Curve448, which uses its own special 56-bit limbs rather * than a generic bignum library. We could squeeze some extra speed out on * 32-bit machines by splitting N up into 32-bit limbs and doing the * arithmetic using the limbs directly as we do for the NIST primes above, * but for 64-bit targets it should use half the number of operations if we do * the reduction with 224-bit limbs, since mpi_add_mpi will then use 64-bit adds. */ static int ecp_mod_p448( mbedtls_mpi *N ) { int ret; size_t i; mbedtls_mpi M, Q; mbedtls_mpi_uint Mp[P448_WIDTH + 1], Qp[P448_WIDTH]; if( N->n <= P448_WIDTH ) return( 0 ); /* M = A1 */ M.s = 1; M.n = N->n - ( P448_WIDTH ); if( M.n > P448_WIDTH ) /* Shouldn't be called with N larger than 2^896! */ return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); M.p = Mp; memset( Mp, 0, sizeof( Mp ) ); memcpy( Mp, N->p + P448_WIDTH, M.n * sizeof( mbedtls_mpi_uint ) ); /* N = A0 */ for( i = P448_WIDTH; i < N->n; i++ ) N->p[i] = 0; /* N += A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &M ) ); /* Q = B1, N += B1 */ Q = M; Q.p = Qp; memcpy( Qp, Mp, sizeof( Qp ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Q, 224 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &Q ) ); /* M = (B0 + B1) * 2^224, N += M */ if( sizeof( mbedtls_mpi_uint ) > 4 ) Mp[P224_WIDTH_MIN] &= ( (mbedtls_mpi_uint)-1 ) >> ( P224_UNUSED_BITS ); for( i = P224_WIDTH_MAX; i < M.n; ++i ) Mp[i] = 0; MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &M, &M, &Q ) ); M.n = P448_WIDTH + 1; /* Make room for shifted carry bit from the addition */ MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &M, 224 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &M ) ); cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_CURVE448_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) || \ defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) /* * Fast quasi-reduction modulo P = 2^s - R, * with R about 33 bits, used by the Koblitz curves. * * Write N as A0 + 2^224 A1, return A0 + R * A1. * Actually do two passes, since R is big. */ #define P_KOBLITZ_MAX ( 256 / 8 / sizeof( mbedtls_mpi_uint ) ) // Max limbs in P #define P_KOBLITZ_R ( 8 / sizeof( mbedtls_mpi_uint ) ) // Limbs in R static inline int ecp_mod_koblitz( mbedtls_mpi *N, mbedtls_mpi_uint *Rp, size_t p_limbs, size_t adjust, size_t shift, mbedtls_mpi_uint mask ) { int ret; size_t i; mbedtls_mpi M, R; mbedtls_mpi_uint Mp[P_KOBLITZ_MAX + P_KOBLITZ_R + 1]; if( N->n < p_limbs ) return( 0 ); /* Init R */ R.s = 1; R.p = Rp; R.n = P_KOBLITZ_R; /* Common setup for M */ M.s = 1; M.p = Mp; /* M = A1 */ M.n = N->n - ( p_limbs - adjust ); if( M.n > p_limbs + adjust ) M.n = p_limbs + adjust; memset( Mp, 0, sizeof Mp ); memcpy( Mp, N->p + p_limbs - adjust, M.n * sizeof( mbedtls_mpi_uint ) ); if( shift != 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, shift ) ); M.n += R.n; /* Make room for multiplication by R */ /* N = A0 */ if( mask != 0 ) N->p[p_limbs - 1] &= mask; for( i = p_limbs; i < N->n; i++ ) N->p[i] = 0; /* N = A0 + R * A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &M, &M, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) ); /* Second pass */ /* M = A1 */ M.n = N->n - ( p_limbs - adjust ); if( M.n > p_limbs + adjust ) M.n = p_limbs + adjust; memset( Mp, 0, sizeof Mp ); memcpy( Mp, N->p + p_limbs - adjust, M.n * sizeof( mbedtls_mpi_uint ) ); if( shift != 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, shift ) ); M.n += R.n; /* Make room for multiplication by R */ /* N = A0 */ if( mask != 0 ) N->p[p_limbs - 1] &= mask; for( i = p_limbs; i < N->n; i++ ) N->p[i] = 0; /* N = A0 + R * A1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &M, &M, &R ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) ); cleanup: return( ret ); } #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED) || MBEDTLS_ECP_DP_SECP224K1_ENABLED) || MBEDTLS_ECP_DP_SECP256K1_ENABLED) */ #if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) /* * Fast quasi-reduction modulo p192k1 = 2^192 - R, * with R = 2^32 + 2^12 + 2^8 + 2^7 + 2^6 + 2^3 + 1 = 0x0100001119 */ static int ecp_mod_p192k1( mbedtls_mpi *N ) { static mbedtls_mpi_uint Rp[] = { BYTES_TO_T_UINT_8( 0xC9, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) }; return( ecp_mod_koblitz( N, Rp, 192 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) ); } #endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) /* * Fast quasi-reduction modulo p224k1 = 2^224 - R, * with R = 2^32 + 2^12 + 2^11 + 2^9 + 2^7 + 2^4 + 2 + 1 = 0x0100001A93 */ static int ecp_mod_p224k1( mbedtls_mpi *N ) { static mbedtls_mpi_uint Rp[] = { BYTES_TO_T_UINT_8( 0x93, 0x1A, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) }; #if defined(MBEDTLS_HAVE_INT64) return( ecp_mod_koblitz( N, Rp, 4, 1, 32, 0xFFFFFFFF ) ); #else return( ecp_mod_koblitz( N, Rp, 224 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) ); #endif } #endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */ #if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) /* * Fast quasi-reduction modulo p256k1 = 2^256 - R, * with R = 2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1 = 0x01000003D1 */ static int ecp_mod_p256k1( mbedtls_mpi *N ) { static mbedtls_mpi_uint Rp[] = { BYTES_TO_T_UINT_8( 0xD1, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) }; return( ecp_mod_koblitz( N, Rp, 256 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) ); } #endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */ #endif /* !MBEDTLS_ECP_ALT */ #endif /* MBEDTLS_ECP_C */ fldigi-4.2.05/src/mbedtls/x509_crl.c0000664000175000017500000005224414611711171013724 00000000000000/* * X.509 Certidicate Revocation List (CRL) parsing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The ITU-T X.509 standard defines a certificate format for PKI. * * http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs) * http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs) * http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10) * * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CRL_PARSE_C) #include "mbedtls/x509_crl.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_free free #define mbedtls_calloc calloc #define mbedtls_snprintf snprintf #endif #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #include #else #include #endif #if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32) #include #endif /* * Version ::= INTEGER { v1(0), v2(1) } */ static int x509_crl_get_version( unsigned char **p, const unsigned char *end, int *ver ) { int ret; if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { *ver = 0; return( 0 ); } return( MBEDTLS_ERR_X509_INVALID_VERSION + ret ); } return( 0 ); } /* * X.509 CRL v2 extensions * * We currently don't parse any extension's content, but we do check that the * list of extensions is well-formed and abort on critical extensions (that * are unsupported as we don't support any extension so far) */ static int x509_get_crl_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *ext ) { int ret; /* * crlExtensions [0] EXPLICIT Extensions OPTIONAL * -- if present, version MUST be v2 */ if( ( ret = mbedtls_x509_get_ext( p, end, ext, 0 ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( 0 ); return( ret ); } while( *p < end ) { /* * Extension ::= SEQUENCE { * extnID OBJECT IDENTIFIER, * critical BOOLEAN DEFAULT FALSE, * extnValue OCTET STRING } */ int is_critical = 0; const unsigned char *end_ext_data; size_t len; /* Get enclosing sequence tag */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); end_ext_data = *p + len; /* Get OID (currently ignored) */ if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &len, MBEDTLS_ASN1_OID ) ) != 0 ) { return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); } *p += len; /* Get optional critical */ if( ( ret = mbedtls_asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 && ( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) ) { return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); } /* Data should be octet string type */ if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); /* Ignore data so far and just check its length */ *p += len; if( *p != end_ext_data ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* Abort on (unsupported) critical extensions */ if( is_critical ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); } if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * X.509 CRL v2 entry extensions (no extensions parsed yet.) */ static int x509_get_crl_entry_ext( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *ext ) { int ret; size_t len = 0; /* OPTIONAL */ if( end <= *p ) return( 0 ); ext->tag = **p; ext->p = *p; /* * Get CRL-entry extension sequence header * crlEntryExtensions Extensions OPTIONAL -- if present, MUST be v2 */ if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { ext->p = NULL; return( 0 ); } return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); } end = *p + ext->len; if( end != *p + ext->len ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); while( *p < end ) { if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret ); *p += len; } if( *p != end ) return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } /* * X.509 CRL Entries */ static int x509_get_entries( unsigned char **p, const unsigned char *end, mbedtls_x509_crl_entry *entry ) { int ret; size_t entry_len; mbedtls_x509_crl_entry *cur_entry = entry; if( *p == end ) return( 0 ); if( ( ret = mbedtls_asn1_get_tag( p, end, &entry_len, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED ) ) != 0 ) { if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) return( 0 ); return( ret ); } end = *p + entry_len; while( *p < end ) { size_t len2; const unsigned char *end2; if( ( ret = mbedtls_asn1_get_tag( p, end, &len2, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED ) ) != 0 ) { return( ret ); } cur_entry->raw.tag = **p; cur_entry->raw.p = *p; cur_entry->raw.len = len2; end2 = *p + len2; if( ( ret = mbedtls_x509_get_serial( p, end2, &cur_entry->serial ) ) != 0 ) return( ret ); if( ( ret = mbedtls_x509_get_time( p, end2, &cur_entry->revocation_date ) ) != 0 ) return( ret ); if( ( ret = x509_get_crl_entry_ext( p, end2, &cur_entry->entry_ext ) ) != 0 ) return( ret ); if( *p < end ) { cur_entry->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crl_entry ) ); if( cur_entry->next == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); cur_entry = cur_entry->next; } } return( 0 ); } /* * Parse one CRLs in DER format and append it to the chained list */ int mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ) { int ret; size_t len; unsigned char *p = NULL, *end = NULL; mbedtls_x509_buf sig_params1, sig_params2, sig_oid2; mbedtls_x509_crl *crl = chain; /* * Check for valid input */ if( crl == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); memset( &sig_params1, 0, sizeof( mbedtls_x509_buf ) ); memset( &sig_params2, 0, sizeof( mbedtls_x509_buf ) ); memset( &sig_oid2, 0, sizeof( mbedtls_x509_buf ) ); /* * Add new CRL on the end of the chain if needed. */ while( crl->version != 0 && crl->next != NULL ) crl = crl->next; if( crl->version != 0 && crl->next == NULL ) { crl->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crl ) ); if( crl->next == NULL ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_ALLOC_FAILED ); } mbedtls_x509_crl_init( crl->next ); crl = crl->next; } /* * Copy raw DER-encoded CRL */ if( buflen == 0 ) return( MBEDTLS_ERR_X509_INVALID_FORMAT ); p = mbedtls_calloc( 1, buflen ); if( p == NULL ) return( MBEDTLS_ERR_X509_ALLOC_FAILED ); memcpy( p, buf, buflen ); crl->raw.p = p; crl->raw.len = buflen; end = p + buflen; /* * CertificateList ::= SEQUENCE { * tbsCertList TBSCertList, * signatureAlgorithm AlgorithmIdentifier, * signatureValue BIT STRING } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT ); } if( len != (size_t) ( end - p ) ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } /* * TBSCertList ::= SEQUENCE { */ crl->tbs.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } end = p + len; crl->tbs.len = end - crl->tbs.p; /* * Version ::= INTEGER OPTIONAL { v1(0), v2(1) } * -- if present, MUST be v2 * * signature AlgorithmIdentifier */ if( ( ret = x509_crl_get_version( &p, end, &crl->version ) ) != 0 || ( ret = mbedtls_x509_get_alg( &p, end, &crl->sig_oid, &sig_params1 ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } if( crl->version < 0 || crl->version > 1 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_UNKNOWN_VERSION ); } crl->version++; if( ( ret = mbedtls_x509_get_sig_alg( &crl->sig_oid, &sig_params1, &crl->sig_md, &crl->sig_pk, &crl->sig_opts ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG ); } /* * issuer Name */ crl->issuer_raw.p = p; if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret ); } if( ( ret = mbedtls_x509_get_name( &p, p + len, &crl->issuer ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } crl->issuer_raw.len = p - crl->issuer_raw.p; /* * thisUpdate Time * nextUpdate Time OPTIONAL */ if( ( ret = mbedtls_x509_get_time( &p, end, &crl->this_update ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } if( ( ret = mbedtls_x509_get_time( &p, end, &crl->next_update ) ) != 0 ) { if( ret != ( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) && ret != ( MBEDTLS_ERR_X509_INVALID_DATE + MBEDTLS_ERR_ASN1_OUT_OF_DATA ) ) { mbedtls_x509_crl_free( crl ); return( ret ); } } /* * revokedCertificates SEQUENCE OF SEQUENCE { * userCertificate CertificateSerialNumber, * revocationDate Time, * crlEntryExtensions Extensions OPTIONAL * -- if present, MUST be v2 * } OPTIONAL */ if( ( ret = x509_get_entries( &p, end, &crl->entry ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } /* * crlExtensions EXPLICIT Extensions OPTIONAL * -- if present, MUST be v2 */ if( crl->version == 2 ) { ret = x509_get_crl_ext( &p, end, &crl->crl_ext ); if( ret != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } } if( p != end ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } end = crl->raw.p + crl->raw.len; /* * signatureAlgorithm AlgorithmIdentifier, * signatureValue BIT STRING */ if( ( ret = mbedtls_x509_get_alg( &p, end, &sig_oid2, &sig_params2 ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } if( crl->sig_oid.len != sig_oid2.len || memcmp( crl->sig_oid.p, sig_oid2.p, crl->sig_oid.len ) != 0 || sig_params1.len != sig_params2.len || ( sig_params1.len != 0 && memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_SIG_MISMATCH ); } if( ( ret = mbedtls_x509_get_sig( &p, end, &crl->sig ) ) != 0 ) { mbedtls_x509_crl_free( crl ); return( ret ); } if( p != end ) { mbedtls_x509_crl_free( crl ); return( MBEDTLS_ERR_X509_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); } return( 0 ); } /* * Parse one or more CRLs and add them to the chained list */ int mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ) { #if defined(MBEDTLS_PEM_PARSE_C) int ret; size_t use_len; mbedtls_pem_context pem; int is_pem = 0; if( chain == NULL || buf == NULL ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); do { mbedtls_pem_init( &pem ); // Avoid calling mbedtls_pem_read_buffer() on non-null-terminated // string if( buflen == 0 || buf[buflen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN X509 CRL-----", "-----END X509 CRL-----", buf, NULL, 0, &use_len ); if( ret == 0 ) { /* * Was PEM encoded */ is_pem = 1; buflen -= use_len; buf += use_len; if( ( ret = mbedtls_x509_crl_parse_der( chain, pem.buf, pem.buflen ) ) != 0 ) { mbedtls_pem_free( &pem ); return( ret ); } } else if( is_pem ) { mbedtls_pem_free( &pem ); return( ret ); } mbedtls_pem_free( &pem ); } /* In the PEM case, buflen is 1 at the end, for the terminated NULL byte. * And a valid CRL cannot be less than 1 byte anyway. */ while( is_pem && buflen > 1 ); if( is_pem ) return( 0 ); else #endif /* MBEDTLS_PEM_PARSE_C */ return( mbedtls_x509_crl_parse_der( chain, buf, buflen ) ); } #if defined(MBEDTLS_FS_IO) /* * Load one or more CRLs and add them to the chained list */ int mbedtls_x509_crl_parse_file( mbedtls_x509_crl *chain, const char *path ) { int ret; size_t n; unsigned char *buf; if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_x509_crl_parse( chain, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_FS_IO */ /* * Return an informational string about the certificate. */ #define BEFORE_COLON 14 #define BC "14" /* * Return an informational string about the CRL. */ int mbedtls_x509_crl_info( char *buf, size_t size, const char *prefix, const mbedtls_x509_crl *crl ) { int ret; size_t n; char *p; const mbedtls_x509_crl_entry *entry; p = buf; n = size; ret = mbedtls_snprintf( p, n, "%sCRL version : %d", prefix, crl->version ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sissuer name : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_dn_gets( p, n, &crl->issuer ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%sthis update : " \ "%04d-%02d-%02d %02d:%02d:%02d", prefix, crl->this_update.year, crl->this_update.mon, crl->this_update.day, crl->this_update.hour, crl->this_update.min, crl->this_update.sec ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n%snext update : " \ "%04d-%02d-%02d %02d:%02d:%02d", prefix, crl->next_update.year, crl->next_update.mon, crl->next_update.day, crl->next_update.hour, crl->next_update.min, crl->next_update.sec ); MBEDTLS_X509_SAFE_SNPRINTF; entry = &crl->entry; ret = mbedtls_snprintf( p, n, "\n%sRevoked certificates:", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; while( entry != NULL && entry->raw.len != 0 ) { ret = mbedtls_snprintf( p, n, "\n%sserial number: ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_serial_gets( p, n, &entry->serial ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, " revocation date: " \ "%04d-%02d-%02d %02d:%02d:%02d", entry->revocation_date.year, entry->revocation_date.mon, entry->revocation_date.day, entry->revocation_date.hour, entry->revocation_date.min, entry->revocation_date.sec ); MBEDTLS_X509_SAFE_SNPRINTF; entry = entry->next; } ret = mbedtls_snprintf( p, n, "\n%ssigned using : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_x509_sig_alg_gets( p, n, &crl->sig_oid, crl->sig_pk, crl->sig_md, crl->sig_opts ); MBEDTLS_X509_SAFE_SNPRINTF; ret = mbedtls_snprintf( p, n, "\n" ); MBEDTLS_X509_SAFE_SNPRINTF; return( (int) ( size - n ) ); } /* * Initialize a CRL chain */ void mbedtls_x509_crl_init( mbedtls_x509_crl *crl ) { memset( crl, 0, sizeof(mbedtls_x509_crl) ); } /* * Unallocate all CRL data */ void mbedtls_x509_crl_free( mbedtls_x509_crl *crl ) { mbedtls_x509_crl *crl_cur = crl; mbedtls_x509_crl *crl_prv; mbedtls_x509_name *name_cur; mbedtls_x509_name *name_prv; mbedtls_x509_crl_entry *entry_cur; mbedtls_x509_crl_entry *entry_prv; if( crl == NULL ) return; do { #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) mbedtls_free( crl_cur->sig_opts ); #endif name_cur = crl_cur->issuer.next; while( name_cur != NULL ) { name_prv = name_cur; name_cur = name_cur->next; mbedtls_platform_zeroize( name_prv, sizeof( mbedtls_x509_name ) ); mbedtls_free( name_prv ); } entry_cur = crl_cur->entry.next; while( entry_cur != NULL ) { entry_prv = entry_cur; entry_cur = entry_cur->next; mbedtls_platform_zeroize( entry_prv, sizeof( mbedtls_x509_crl_entry ) ); mbedtls_free( entry_prv ); } if( crl_cur->raw.p != NULL ) { mbedtls_platform_zeroize( crl_cur->raw.p, crl_cur->raw.len ); mbedtls_free( crl_cur->raw.p ); } crl_cur = crl_cur->next; } while( crl_cur != NULL ); crl_cur = crl; do { crl_prv = crl_cur; crl_cur = crl_cur->next; mbedtls_platform_zeroize( crl_prv, sizeof( mbedtls_x509_crl ) ); if( crl_prv != crl ) mbedtls_free( crl_prv ); } while( crl_cur != NULL ); } #endif /* MBEDTLS_X509_CRL_PARSE_C */ fldigi-4.2.05/src/mbedtls/threading.c0000664000175000017500000001412614611711171014321 00000000000000/* * Threading abstraction layer * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * Ensure gmtime_r is available even with -std=c99; must be defined before * config.h, which pulls in glibc's features.h. Harmless on other platforms. */ #if !defined(_POSIX_C_SOURCE) #define _POSIX_C_SOURCE 200112L #endif #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_THREADING_C) #include "mbedtls/threading.h" #if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_PLATFORM_GMTIME_R_ALT) #if !defined(_WIN32) && (defined(unix) || \ defined(__unix) || defined(__unix__) || (defined(__APPLE__) && \ defined(__MACH__))) #include #endif /* !_WIN32 && (unix || __unix || __unix__ || * (__APPLE__ && __MACH__)) */ #if !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) /* * This is a convenience shorthand macro to avoid checking the long * preprocessor conditions above. Ideally, we could expose this macro in * platform_util.h and simply use it in platform_util.c, threading.c and * threading.h. However, this macro is not part of the Mbed TLS public API, so * we keep it private by only defining it in this file */ #if ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) #define THREADING_USE_GMTIME #endif /* ! ( defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) ) */ #endif /* !( ( defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L ) || \ ( defined(_POSIX_THREAD_SAFE_FUNCTIONS ) && \ _POSIX_THREAD_SAFE_FUNCTIONS >= 20112L ) ) */ #endif /* MBEDTLS_HAVE_TIME_DATE && !MBEDTLS_PLATFORM_GMTIME_R_ALT */ #if defined(MBEDTLS_THREADING_PTHREAD) static void threading_mutex_init_pthread( mbedtls_threading_mutex_t *mutex ) { if( mutex == NULL ) return; mutex->is_valid = pthread_mutex_init( &mutex->mutex, NULL ) == 0; } static void threading_mutex_free_pthread( mbedtls_threading_mutex_t *mutex ) { if( mutex == NULL || !mutex->is_valid ) return; (void) pthread_mutex_destroy( &mutex->mutex ); mutex->is_valid = 0; } static int threading_mutex_lock_pthread( mbedtls_threading_mutex_t *mutex ) { if( mutex == NULL || ! mutex->is_valid ) return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA ); if( pthread_mutex_lock( &mutex->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); return( 0 ); } static int threading_mutex_unlock_pthread( mbedtls_threading_mutex_t *mutex ) { if( mutex == NULL || ! mutex->is_valid ) return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA ); if( pthread_mutex_unlock( &mutex->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); return( 0 ); } void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_init_pthread; void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_free_pthread; int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_lock_pthread; int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_unlock_pthread; /* * With phtreads we can statically initialize mutexes */ #define MUTEX_INIT = { PTHREAD_MUTEX_INITIALIZER, 1 } #endif /* MBEDTLS_THREADING_PTHREAD */ #if defined(MBEDTLS_THREADING_ALT) static int threading_mutex_fail( mbedtls_threading_mutex_t *mutex ) { ((void) mutex ); return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA ); } static void threading_mutex_dummy( mbedtls_threading_mutex_t *mutex ) { ((void) mutex ); return; } void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy; void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy; int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail; int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail; /* * Set functions pointers and initialize global mutexes */ void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ), void (*mutex_free)( mbedtls_threading_mutex_t * ), int (*mutex_lock)( mbedtls_threading_mutex_t * ), int (*mutex_unlock)( mbedtls_threading_mutex_t * ) ) { mbedtls_mutex_init = mutex_init; mbedtls_mutex_free = mutex_free; mbedtls_mutex_lock = mutex_lock; mbedtls_mutex_unlock = mutex_unlock; #if defined(MBEDTLS_FS_IO) mbedtls_mutex_init( &mbedtls_threading_readdir_mutex ); #endif #if defined(THREADING_USE_GMTIME) mbedtls_mutex_init( &mbedtls_threading_gmtime_mutex ); #endif } /* * Free global mutexes */ void mbedtls_threading_free_alt( void ) { #if defined(MBEDTLS_FS_IO) mbedtls_mutex_free( &mbedtls_threading_readdir_mutex ); #endif #if defined(THREADING_USE_GMTIME) mbedtls_mutex_free( &mbedtls_threading_gmtime_mutex ); #endif } #endif /* MBEDTLS_THREADING_ALT */ /* * Define global mutexes */ #ifndef MUTEX_INIT #define MUTEX_INIT #endif #if defined(MBEDTLS_FS_IO) mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex MUTEX_INIT; #endif #if defined(THREADING_USE_GMTIME) mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex MUTEX_INIT; #endif #endif /* MBEDTLS_THREADING_C */ fldigi-4.2.05/src/mbedtls/sha256.c0000664000175000017500000004033214611711171013362 00000000000000/* * FIPS-180-2 compliant SHA-256 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The SHA-256 Secure Hash Standard was published by NIST in 2002. * * http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_SHA256_C) #include "mbedtls/sha256.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #include #define mbedtls_printf printf #define mbedtls_calloc calloc #define mbedtls_free free #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #define SHA256_VALIDATE_RET(cond) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA ) #define SHA256_VALIDATE(cond) MBEDTLS_INTERNAL_VALIDATE( cond ) #if !defined(MBEDTLS_SHA256_ALT) /* * 32-bit integer manipulation macros (big endian) */ #ifndef GET_UINT32_BE #define GET_UINT32_BE(n,b,i) \ do { \ (n) = ( (uint32_t) (b)[(i) ] << 24 ) \ | ( (uint32_t) (b)[(i) + 1] << 16 ) \ | ( (uint32_t) (b)[(i) + 2] << 8 ) \ | ( (uint32_t) (b)[(i) + 3] ); \ } while( 0 ) #endif #ifndef PUT_UINT32_BE #define PUT_UINT32_BE(n,b,i) \ do { \ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ (b)[(i) + 3] = (unsigned char) ( (n) ); \ } while( 0 ) #endif void mbedtls_sha256_init( mbedtls_sha256_context *ctx ) { SHA256_VALIDATE( ctx != NULL ); memset( ctx, 0, sizeof( mbedtls_sha256_context ) ); } void mbedtls_sha256_free( mbedtls_sha256_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_sha256_context ) ); } void mbedtls_sha256_clone( mbedtls_sha256_context *dst, const mbedtls_sha256_context *src ) { SHA256_VALIDATE( dst != NULL ); SHA256_VALIDATE( src != NULL ); *dst = *src; } /* * SHA-256 context setup */ int mbedtls_sha256_starts_ret( mbedtls_sha256_context *ctx, int is224 ) { SHA256_VALIDATE_RET( ctx != NULL ); SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 ); ctx->total[0] = 0; ctx->total[1] = 0; if( is224 == 0 ) { /* SHA-256 */ ctx->state[0] = 0x6A09E667; ctx->state[1] = 0xBB67AE85; ctx->state[2] = 0x3C6EF372; ctx->state[3] = 0xA54FF53A; ctx->state[4] = 0x510E527F; ctx->state[5] = 0x9B05688C; ctx->state[6] = 0x1F83D9AB; ctx->state[7] = 0x5BE0CD19; } else { /* SHA-224 */ ctx->state[0] = 0xC1059ED8; ctx->state[1] = 0x367CD507; ctx->state[2] = 0x3070DD17; ctx->state[3] = 0xF70E5939; ctx->state[4] = 0xFFC00B31; ctx->state[5] = 0x68581511; ctx->state[6] = 0x64F98FA7; ctx->state[7] = 0xBEFA4FA4; } ctx->is224 = is224; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 ) { mbedtls_sha256_starts_ret( ctx, is224 ); } #endif #if !defined(MBEDTLS_SHA256_PROCESS_ALT) static const uint32_t K[] = { 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2, }; #define SHR(x,n) ((x & 0xFFFFFFFF) >> n) #define ROTR(x,n) (SHR(x,n) | (x << (32 - n))) #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3)) #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10)) #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22)) #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25)) #define F0(x,y,z) ((x & y) | (z & (x | y))) #define F1(x,y,z) (z ^ (x & (y ^ z))) #define R(t) \ ( \ W[t] = S1(W[t - 2]) + W[t - 7] + \ S0(W[t - 15]) + W[t - 16] \ ) #define P(a,b,c,d,e,f,g,h,x,K) \ { \ temp1 = h + S3(e) + F1(e,f,g) + K + x; \ temp2 = S2(a) + F0(a,b,c); \ d += temp1; h = temp1 + temp2; \ } int mbedtls_internal_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ) { uint32_t temp1, temp2, W[64]; uint32_t A[8]; unsigned int i; SHA256_VALIDATE_RET( ctx != NULL ); SHA256_VALIDATE_RET( (const unsigned char *)data != NULL ); for( i = 0; i < 8; i++ ) A[i] = ctx->state[i]; #if defined(MBEDTLS_SHA256_SMALLER) for( i = 0; i < 64; i++ ) { if( i < 16 ) GET_UINT32_BE( W[i], data, 4 * i ); else R( i ); P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] ); temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3]; A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1; } #else /* MBEDTLS_SHA256_SMALLER */ for( i = 0; i < 16; i++ ) GET_UINT32_BE( W[i], data, 4 * i ); for( i = 0; i < 16; i += 8 ) { P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] ); P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] ); P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] ); P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] ); P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] ); P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] ); P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] ); P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] ); } for( i = 16; i < 64; i += 8 ) { P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] ); P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] ); P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] ); P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] ); P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] ); P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] ); P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] ); P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] ); } #endif /* MBEDTLS_SHA256_SMALLER */ for( i = 0; i < 8; i++ ) ctx->state[i] += A[i]; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ) { mbedtls_internal_sha256_process( ctx, data ); } #endif #endif /* !MBEDTLS_SHA256_PROCESS_ALT */ /* * SHA-256 process buffer */ int mbedtls_sha256_update_ret( mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; SHA256_VALIDATE_RET( ctx != NULL ); SHA256_VALIDATE_RET( ilen == 0 || input != NULL ); if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_sha256_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) memcpy( (void *) (ctx->buffer + left), input, ilen ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_sha256_update_ret( ctx, input, ilen ); } #endif /* * SHA-256 final digest */ int mbedtls_sha256_finish_ret( mbedtls_sha256_context *ctx, unsigned char output[32] ) { int ret; uint32_t used; uint32_t high, low; SHA256_VALIDATE_RET( ctx != NULL ); SHA256_VALIDATE_RET( (unsigned char *)output != NULL ); /* * Add padding: 0x80 then 0x00 until 8 bytes remain for the length */ used = ctx->total[0] & 0x3F; ctx->buffer[used++] = 0x80; if( used <= 56 ) { /* Enough room for padding + length in current block */ memset( ctx->buffer + used, 0, 56 - used ); } else { /* We'll need an extra block */ memset( ctx->buffer + used, 0, 64 - used ); if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); memset( ctx->buffer, 0, 56 ); } /* * Add message length */ high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_BE( high, ctx->buffer, 56 ); PUT_UINT32_BE( low, ctx->buffer, 60 ); if( ( ret = mbedtls_internal_sha256_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); /* * Output final state */ PUT_UINT32_BE( ctx->state[0], output, 0 ); PUT_UINT32_BE( ctx->state[1], output, 4 ); PUT_UINT32_BE( ctx->state[2], output, 8 ); PUT_UINT32_BE( ctx->state[3], output, 12 ); PUT_UINT32_BE( ctx->state[4], output, 16 ); PUT_UINT32_BE( ctx->state[5], output, 20 ); PUT_UINT32_BE( ctx->state[6], output, 24 ); if( ctx->is224 == 0 ) PUT_UINT32_BE( ctx->state[7], output, 28 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] ) { mbedtls_sha256_finish_ret( ctx, output ); } #endif #endif /* !MBEDTLS_SHA256_ALT */ /* * output = SHA-256( input buffer ) */ int mbedtls_sha256_ret( const unsigned char *input, size_t ilen, unsigned char output[32], int is224 ) { int ret; mbedtls_sha256_context ctx; SHA256_VALIDATE_RET( is224 == 0 || is224 == 1 ); SHA256_VALIDATE_RET( ilen == 0 || input != NULL ); SHA256_VALIDATE_RET( (unsigned char *)output != NULL ); mbedtls_sha256_init( &ctx ); if( ( ret = mbedtls_sha256_starts_ret( &ctx, is224 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha256_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha256_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_sha256_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_sha256( const unsigned char *input, size_t ilen, unsigned char output[32], int is224 ) { mbedtls_sha256_ret( input, ilen, output, is224 ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * FIPS-180-2 test vectors */ static const unsigned char sha256_test_buf[3][57] = { { "abc" }, { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, { "" } }; static const size_t sha256_test_buflen[3] = { 3, 56, 1000 }; static const unsigned char sha256_test_sum[6][32] = { /* * SHA-224 test vectors */ { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22, 0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3, 0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7, 0xE3, 0x6C, 0x9D, 0xA7 }, { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC, 0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50, 0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19, 0x52, 0x52, 0x25, 0x25 }, { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8, 0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B, 0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE, 0x4E, 0xE7, 0xAD, 0x67 }, /* * SHA-256 test vectors */ { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA, 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23, 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C, 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD }, { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8, 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39, 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67, 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 }, { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92, 0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67, 0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E, 0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 } }; /* * Checkup routine */ int mbedtls_sha256_self_test( int verbose ) { int i, j, k, buflen, ret = 0; unsigned char *buf; unsigned char sha256sum[32]; mbedtls_sha256_context ctx; buf = mbedtls_calloc( 1024, sizeof(unsigned char) ); if( NULL == buf ) { if( verbose != 0 ) mbedtls_printf( "Buffer allocation failed\n" ); return( 1 ); } mbedtls_sha256_init( &ctx ); for( i = 0; i < 6; i++ ) { j = i % 3; k = i < 3; if( verbose != 0 ) mbedtls_printf( " SHA-%d test #%d: ", 256 - k * 32, j + 1 ); if( ( ret = mbedtls_sha256_starts_ret( &ctx, k ) ) != 0 ) goto fail; if( j == 2 ) { memset( buf, 'a', buflen = 1000 ); for( j = 0; j < 1000; j++ ) { ret = mbedtls_sha256_update_ret( &ctx, buf, buflen ); if( ret != 0 ) goto fail; } } else { ret = mbedtls_sha256_update_ret( &ctx, sha256_test_buf[j], sha256_test_buflen[j] ); if( ret != 0 ) goto fail; } if( ( ret = mbedtls_sha256_finish_ret( &ctx, sha256sum ) ) != 0 ) goto fail; if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); goto exit; fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); exit: mbedtls_sha256_free( &ctx ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_SHA256_C */ fldigi-4.2.05/src/mbedtls/ecjpake.c0000664000175000017500000011440014611711171013752 00000000000000/* * Elliptic curve J-PAKE * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References in the code are to the Thread v1.0 Specification, * available to members of the Thread Group http://threadgroup.org/ */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ECJPAKE_C) #include "mbedtls/ecjpake.h" #include "mbedtls/platform_util.h" #include #if !defined(MBEDTLS_ECJPAKE_ALT) /* Parameter validation macros based on platform_util.h */ #define ECJPAKE_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECJPAKE_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) /* * Convert a mbedtls_ecjpake_role to identifier string */ static const char * const ecjpake_id[] = { "client", "server" }; #define ID_MINE ( ecjpake_id[ ctx->role ] ) #define ID_PEER ( ecjpake_id[ 1 - ctx->role ] ) /* * Initialize context */ void mbedtls_ecjpake_init( mbedtls_ecjpake_context *ctx ) { ECJPAKE_VALIDATE( ctx != NULL ); ctx->md_info = NULL; mbedtls_ecp_group_init( &ctx->grp ); ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; mbedtls_ecp_point_init( &ctx->Xm1 ); mbedtls_ecp_point_init( &ctx->Xm2 ); mbedtls_ecp_point_init( &ctx->Xp1 ); mbedtls_ecp_point_init( &ctx->Xp2 ); mbedtls_ecp_point_init( &ctx->Xp ); mbedtls_mpi_init( &ctx->xm1 ); mbedtls_mpi_init( &ctx->xm2 ); mbedtls_mpi_init( &ctx->s ); } /* * Free context */ void mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx ) { if( ctx == NULL ) return; ctx->md_info = NULL; mbedtls_ecp_group_free( &ctx->grp ); mbedtls_ecp_point_free( &ctx->Xm1 ); mbedtls_ecp_point_free( &ctx->Xm2 ); mbedtls_ecp_point_free( &ctx->Xp1 ); mbedtls_ecp_point_free( &ctx->Xp2 ); mbedtls_ecp_point_free( &ctx->Xp ); mbedtls_mpi_free( &ctx->xm1 ); mbedtls_mpi_free( &ctx->xm2 ); mbedtls_mpi_free( &ctx->s ); } /* * Setup context */ int mbedtls_ecjpake_setup( mbedtls_ecjpake_context *ctx, mbedtls_ecjpake_role role, mbedtls_md_type_t hash, mbedtls_ecp_group_id curve, const unsigned char *secret, size_t len ) { int ret; ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( role == MBEDTLS_ECJPAKE_CLIENT || role == MBEDTLS_ECJPAKE_SERVER ); ECJPAKE_VALIDATE_RET( secret != NULL || len == 0 ); ctx->role = role; if( ( ctx->md_info = mbedtls_md_info_from_type( hash ) ) == NULL ) return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE ); MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &ctx->grp, curve ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->s, secret, len ) ); cleanup: if( ret != 0 ) mbedtls_ecjpake_free( ctx ); return( ret ); } /* * Check if context is ready for use */ int mbedtls_ecjpake_check( const mbedtls_ecjpake_context *ctx ) { ECJPAKE_VALIDATE_RET( ctx != NULL ); if( ctx->md_info == NULL || ctx->grp.id == MBEDTLS_ECP_DP_NONE || ctx->s.p == NULL ) { return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } return( 0 ); } /* * Write a point plus its length to a buffer */ static int ecjpake_write_len_point( unsigned char **p, const unsigned char *end, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *P ) { int ret; size_t len; /* Need at least 4 for length plus 1 for point */ if( end < *p || end - *p < 5 ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); ret = mbedtls_ecp_point_write_binary( grp, P, pf, &len, *p + 4, end - ( *p + 4 ) ); if( ret != 0 ) return( ret ); (*p)[0] = (unsigned char)( ( len >> 24 ) & 0xFF ); (*p)[1] = (unsigned char)( ( len >> 16 ) & 0xFF ); (*p)[2] = (unsigned char)( ( len >> 8 ) & 0xFF ); (*p)[3] = (unsigned char)( ( len ) & 0xFF ); *p += 4 + len; return( 0 ); } /* * Size of the temporary buffer for ecjpake_hash: * 3 EC points plus their length, plus ID and its length (4 + 6 bytes) */ #define ECJPAKE_HASH_BUF_LEN ( 3 * ( 4 + MBEDTLS_ECP_MAX_PT_LEN ) + 4 + 6 ) /* * Compute hash for ZKP (7.4.2.2.2.1) */ static int ecjpake_hash( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, const mbedtls_ecp_point *V, const mbedtls_ecp_point *X, const char *id, mbedtls_mpi *h ) { int ret; unsigned char buf[ECJPAKE_HASH_BUF_LEN]; unsigned char *p = buf; const unsigned char *end = buf + sizeof( buf ); const size_t id_len = strlen( id ); unsigned char hash[MBEDTLS_MD_MAX_SIZE]; /* Write things to temporary buffer */ MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, G ) ); MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, V ) ); MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, X ) ); if( end - p < 4 ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); *p++ = (unsigned char)( ( id_len >> 24 ) & 0xFF ); *p++ = (unsigned char)( ( id_len >> 16 ) & 0xFF ); *p++ = (unsigned char)( ( id_len >> 8 ) & 0xFF ); *p++ = (unsigned char)( ( id_len ) & 0xFF ); if( end < p || (size_t)( end - p ) < id_len ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); memcpy( p, id, id_len ); p += id_len; /* Compute hash */ mbedtls_md( md_info, buf, p - buf, hash ); /* Turn it into an integer mod n */ MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( h, hash, mbedtls_md_get_size( md_info ) ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( h, h, &grp->N ) ); cleanup: return( ret ); } /* * Parse a ECShnorrZKP (7.4.2.2.2) and verify it (7.4.2.3.3) */ static int ecjpake_zkp_read( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, const mbedtls_ecp_point *X, const char *id, const unsigned char **p, const unsigned char *end ) { int ret; mbedtls_ecp_point V, VV; mbedtls_mpi r, h; size_t r_len; mbedtls_ecp_point_init( &V ); mbedtls_ecp_point_init( &VV ); mbedtls_mpi_init( &r ); mbedtls_mpi_init( &h ); /* * struct { * ECPoint V; * opaque r<1..2^8-1>; * } ECSchnorrZKP; */ if( end < *p ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_point( grp, &V, p, end - *p ) ); if( end < *p || (size_t)( end - *p ) < 1 ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } r_len = *(*p)++; if( end < *p || (size_t)( end - *p ) < r_len ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &r, *p, r_len ) ); *p += r_len; /* * Verification */ MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( (mbedtls_ecp_group *) grp, &VV, &h, X, &r, G ) ); if( mbedtls_ecp_point_cmp( &VV, &V ) != 0 ) { ret = MBEDTLS_ERR_ECP_VERIFY_FAILED; goto cleanup; } cleanup: mbedtls_ecp_point_free( &V ); mbedtls_ecp_point_free( &VV ); mbedtls_mpi_free( &r ); mbedtls_mpi_free( &h ); return( ret ); } /* * Generate ZKP (7.4.2.3.2) and write it as ECSchnorrZKP (7.4.2.2.2) */ static int ecjpake_zkp_write( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, const mbedtls_mpi *x, const mbedtls_ecp_point *X, const char *id, unsigned char **p, const unsigned char *end, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_ecp_point V; mbedtls_mpi v; mbedtls_mpi h; /* later recycled to hold r */ size_t len; if( end < *p ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); mbedtls_ecp_point_init( &V ); mbedtls_mpi_init( &v ); mbedtls_mpi_init( &h ); /* Compute signature */ MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair_base( (mbedtls_ecp_group *) grp, G, &v, &V, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &h, &h, x ) ); /* x*h */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &h, &v, &h ) ); /* v - x*h */ MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &h, &h, &grp->N ) ); /* r */ /* Write it out */ MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( grp, &V, pf, &len, *p, end - *p ) ); *p += len; len = mbedtls_mpi_size( &h ); /* actually r */ if( end < *p || (size_t)( end - *p ) < 1 + len || len > 255 ) { ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; goto cleanup; } *(*p)++ = (unsigned char)( len & 0xFF ); MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &h, *p, len ) ); /* r */ *p += len; cleanup: mbedtls_ecp_point_free( &V ); mbedtls_mpi_free( &v ); mbedtls_mpi_free( &h ); return( ret ); } /* * Parse a ECJPAKEKeyKP (7.4.2.2.1) and check proof * Output: verified public key X */ static int ecjpake_kkp_read( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, mbedtls_ecp_point *X, const char *id, const unsigned char **p, const unsigned char *end ) { int ret; if( end < *p ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); /* * struct { * ECPoint X; * ECSchnorrZKP zkp; * } ECJPAKEKeyKP; */ MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_point( grp, X, p, end - *p ) ); if( mbedtls_ecp_is_zero( X ) ) { ret = MBEDTLS_ERR_ECP_INVALID_KEY; goto cleanup; } MBEDTLS_MPI_CHK( ecjpake_zkp_read( md_info, grp, pf, G, X, id, p, end ) ); cleanup: return( ret ); } /* * Generate an ECJPAKEKeyKP * Output: the serialized structure, plus private/public key pair */ static int ecjpake_kkp_write( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, mbedtls_mpi *x, mbedtls_ecp_point *X, const char *id, unsigned char **p, const unsigned char *end, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; size_t len; if( end < *p ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); /* Generate key (7.4.2.3.1) and write it out */ MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair_base( (mbedtls_ecp_group *) grp, G, x, X, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( grp, X, pf, &len, *p, end - *p ) ); *p += len; /* Generate and write proof */ MBEDTLS_MPI_CHK( ecjpake_zkp_write( md_info, grp, pf, G, x, X, id, p, end, f_rng, p_rng ) ); cleanup: return( ret ); } /* * Read a ECJPAKEKeyKPPairList (7.4.2.3) and check proofs * Ouputs: verified peer public keys Xa, Xb */ static int ecjpake_kkpp_read( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, mbedtls_ecp_point *Xa, mbedtls_ecp_point *Xb, const char *id, const unsigned char *buf, size_t len ) { int ret; const unsigned char *p = buf; const unsigned char *end = buf + len; /* * struct { * ECJPAKEKeyKP ecjpake_key_kp_pair_list[2]; * } ECJPAKEKeyKPPairList; */ MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xa, id, &p, end ) ); MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xb, id, &p, end ) ); if( p != end ) ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; cleanup: return( ret ); } /* * Generate a ECJPAKEKeyKPPairList * Outputs: the serialized structure, plus two private/public key pairs */ static int ecjpake_kkpp_write( const mbedtls_md_info_t *md_info, const mbedtls_ecp_group *grp, const int pf, const mbedtls_ecp_point *G, mbedtls_mpi *xm1, mbedtls_ecp_point *Xa, mbedtls_mpi *xm2, mbedtls_ecp_point *Xb, const char *id, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char *p = buf; const unsigned char *end = buf + len; MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm1, Xa, id, &p, end, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm2, Xb, id, &p, end, f_rng, p_rng ) ); *olen = p - buf; cleanup: return( ret ); } /* * Read and process the first round message */ int mbedtls_ecjpake_read_round_one( mbedtls_ecjpake_context *ctx, const unsigned char *buf, size_t len ) { ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); return( ecjpake_kkpp_read( ctx->md_info, &ctx->grp, ctx->point_format, &ctx->grp.G, &ctx->Xp1, &ctx->Xp2, ID_PEER, buf, len ) ); } /* * Generate and write the first round message */ int mbedtls_ecjpake_write_round_one( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); ECJPAKE_VALIDATE_RET( olen != NULL ); ECJPAKE_VALIDATE_RET( f_rng != NULL ); return( ecjpake_kkpp_write( ctx->md_info, &ctx->grp, ctx->point_format, &ctx->grp.G, &ctx->xm1, &ctx->Xm1, &ctx->xm2, &ctx->Xm2, ID_MINE, buf, len, olen, f_rng, p_rng ) ); } /* * Compute the sum of three points R = A + B + C */ static int ecjpake_ecp_add3( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_ecp_point *A, const mbedtls_ecp_point *B, const mbedtls_ecp_point *C ) { int ret; mbedtls_mpi one; mbedtls_mpi_init( &one ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &one, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, R, &one, A, &one, B ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, R, &one, R, &one, C ) ); cleanup: mbedtls_mpi_free( &one ); return( ret ); } /* * Read and process second round message (C: 7.4.2.5, S: 7.4.2.6) */ int mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx, const unsigned char *buf, size_t len ) { int ret; const unsigned char *p = buf; const unsigned char *end = buf + len; mbedtls_ecp_group grp; mbedtls_ecp_point G; /* C: GB, S: GA */ ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); mbedtls_ecp_group_init( &grp ); mbedtls_ecp_point_init( &G ); /* * Server: GA = X3 + X4 + X1 (7.4.2.6.1) * Client: GB = X1 + X2 + X3 (7.4.2.5.1) * Unified: G = Xm1 + Xm2 + Xp1 * We need that before parsing in order to check Xp as we read it */ MBEDTLS_MPI_CHK( ecjpake_ecp_add3( &ctx->grp, &G, &ctx->Xm1, &ctx->Xm2, &ctx->Xp1 ) ); /* * struct { * ECParameters curve_params; // only client reading server msg * ECJPAKEKeyKP ecjpake_key_kp; * } Client/ServerECJPAKEParams; */ if( ctx->role == MBEDTLS_ECJPAKE_CLIENT ) { MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_group( &grp, &p, len ) ); if( grp.id != ctx->grp.id ) { ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; goto cleanup; } } MBEDTLS_MPI_CHK( ecjpake_kkp_read( ctx->md_info, &ctx->grp, ctx->point_format, &G, &ctx->Xp, ID_PEER, &p, end ) ); if( p != end ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } cleanup: mbedtls_ecp_group_free( &grp ); mbedtls_ecp_point_free( &G ); return( ret ); } /* * Compute R = +/- X * S mod N, taking care not to leak S */ static int ecjpake_mul_secret( mbedtls_mpi *R, int sign, const mbedtls_mpi *X, const mbedtls_mpi *S, const mbedtls_mpi *N, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_mpi b; /* Blinding value, then s + N * blinding */ mbedtls_mpi_init( &b ); /* b = s + rnd-128-bit * N */ MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &b, 16, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &b, &b, N ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &b, &b, S ) ); /* R = sign * X * b mod N */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( R, X, &b ) ); R->s *= sign; MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( R, R, N ) ); cleanup: mbedtls_mpi_free( &b ); return( ret ); } /* * Generate and write the second round message (S: 7.4.2.5, C: 7.4.2.6) */ int mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_ecp_point G; /* C: GA, S: GB */ mbedtls_ecp_point Xm; /* C: Xc, S: Xs */ mbedtls_mpi xm; /* C: xc, S: xs */ unsigned char *p = buf; const unsigned char *end = buf + len; size_t ec_len; ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); ECJPAKE_VALIDATE_RET( olen != NULL ); ECJPAKE_VALIDATE_RET( f_rng != NULL ); mbedtls_ecp_point_init( &G ); mbedtls_ecp_point_init( &Xm ); mbedtls_mpi_init( &xm ); /* * First generate private/public key pair (S: 7.4.2.5.1, C: 7.4.2.6.1) * * Client: GA = X1 + X3 + X4 | xs = x2 * s | Xc = xc * GA * Server: GB = X3 + X1 + X2 | xs = x4 * s | Xs = xs * GB * Unified: G = Xm1 + Xp1 + Xp2 | xm = xm2 * s | Xm = xm * G */ MBEDTLS_MPI_CHK( ecjpake_ecp_add3( &ctx->grp, &G, &ctx->Xp1, &ctx->Xp2, &ctx->Xm1 ) ); MBEDTLS_MPI_CHK( ecjpake_mul_secret( &xm, 1, &ctx->xm2, &ctx->s, &ctx->grp.N, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &Xm, &xm, &G, f_rng, p_rng ) ); /* * Now write things out * * struct { * ECParameters curve_params; // only server writing its message * ECJPAKEKeyKP ecjpake_key_kp; * } Client/ServerECJPAKEParams; */ if( ctx->role == MBEDTLS_ECJPAKE_SERVER ) { if( end < p ) { ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_group( &ctx->grp, &ec_len, p, end - p ) ); p += ec_len; } if( end < p ) { ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( &ctx->grp, &Xm, ctx->point_format, &ec_len, p, end - p ) ); p += ec_len; MBEDTLS_MPI_CHK( ecjpake_zkp_write( ctx->md_info, &ctx->grp, ctx->point_format, &G, &xm, &Xm, ID_MINE, &p, end, f_rng, p_rng ) ); *olen = p - buf; cleanup: mbedtls_ecp_point_free( &G ); mbedtls_ecp_point_free( &Xm ); mbedtls_mpi_free( &xm ); return( ret ); } /* * Derive PMS (7.4.2.7 / 7.4.2.8) */ int mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx, unsigned char *buf, size_t len, size_t *olen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; mbedtls_ecp_point K; mbedtls_mpi m_xm2_s, one; unsigned char kx[MBEDTLS_ECP_MAX_BYTES]; size_t x_bytes; ECJPAKE_VALIDATE_RET( ctx != NULL ); ECJPAKE_VALIDATE_RET( buf != NULL ); ECJPAKE_VALIDATE_RET( olen != NULL ); ECJPAKE_VALIDATE_RET( f_rng != NULL ); *olen = mbedtls_md_get_size( ctx->md_info ); if( len < *olen ) return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL ); mbedtls_ecp_point_init( &K ); mbedtls_mpi_init( &m_xm2_s ); mbedtls_mpi_init( &one ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &one, 1 ) ); /* * Client: K = ( Xs - X4 * x2 * s ) * x2 * Server: K = ( Xc - X2 * x4 * s ) * x4 * Unified: K = ( Xp - Xp2 * xm2 * s ) * xm2 */ MBEDTLS_MPI_CHK( ecjpake_mul_secret( &m_xm2_s, -1, &ctx->xm2, &ctx->s, &ctx->grp.N, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( &ctx->grp, &K, &one, &ctx->Xp, &m_xm2_s, &ctx->Xp2 ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &K, &ctx->xm2, &K, f_rng, p_rng ) ); /* PMS = SHA-256( K.X ) */ x_bytes = ( ctx->grp.pbits + 7 ) / 8; MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &K.X, kx, x_bytes ) ); MBEDTLS_MPI_CHK( mbedtls_md( ctx->md_info, kx, x_bytes, buf ) ); cleanup: mbedtls_ecp_point_free( &K ); mbedtls_mpi_free( &m_xm2_s ); mbedtls_mpi_free( &one ); return( ret ); } #undef ID_MINE #undef ID_PEER #endif /* ! MBEDTLS_ECJPAKE_ALT */ #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif #if !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ !defined(MBEDTLS_SHA256_C) int mbedtls_ecjpake_self_test( int verbose ) { (void) verbose; return( 0 ); } #else static const unsigned char ecjpake_test_password[] = { 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x6a, 0x70, 0x61, 0x6b, 0x65, 0x74, 0x65, 0x73, 0x74 }; static const unsigned char ecjpake_test_x1[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21 }; static const unsigned char ecjpake_test_x2[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81 }; static const unsigned char ecjpake_test_x3[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81 }; static const unsigned char ecjpake_test_x4[] = { 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe1 }; static const unsigned char ecjpake_test_cli_one[] = { 0x41, 0x04, 0xac, 0xcf, 0x01, 0x06, 0xef, 0x85, 0x8f, 0xa2, 0xd9, 0x19, 0x33, 0x13, 0x46, 0x80, 0x5a, 0x78, 0xb5, 0x8b, 0xba, 0xd0, 0xb8, 0x44, 0xe5, 0xc7, 0x89, 0x28, 0x79, 0x14, 0x61, 0x87, 0xdd, 0x26, 0x66, 0xad, 0xa7, 0x81, 0xbb, 0x7f, 0x11, 0x13, 0x72, 0x25, 0x1a, 0x89, 0x10, 0x62, 0x1f, 0x63, 0x4d, 0xf1, 0x28, 0xac, 0x48, 0xe3, 0x81, 0xfd, 0x6e, 0xf9, 0x06, 0x07, 0x31, 0xf6, 0x94, 0xa4, 0x41, 0x04, 0x1d, 0xd0, 0xbd, 0x5d, 0x45, 0x66, 0xc9, 0xbe, 0xd9, 0xce, 0x7d, 0xe7, 0x01, 0xb5, 0xe8, 0x2e, 0x08, 0xe8, 0x4b, 0x73, 0x04, 0x66, 0x01, 0x8a, 0xb9, 0x03, 0xc7, 0x9e, 0xb9, 0x82, 0x17, 0x22, 0x36, 0xc0, 0xc1, 0x72, 0x8a, 0xe4, 0xbf, 0x73, 0x61, 0x0d, 0x34, 0xde, 0x44, 0x24, 0x6e, 0xf3, 0xd9, 0xc0, 0x5a, 0x22, 0x36, 0xfb, 0x66, 0xa6, 0x58, 0x3d, 0x74, 0x49, 0x30, 0x8b, 0xab, 0xce, 0x20, 0x72, 0xfe, 0x16, 0x66, 0x29, 0x92, 0xe9, 0x23, 0x5c, 0x25, 0x00, 0x2f, 0x11, 0xb1, 0x50, 0x87, 0xb8, 0x27, 0x38, 0xe0, 0x3c, 0x94, 0x5b, 0xf7, 0xa2, 0x99, 0x5d, 0xda, 0x1e, 0x98, 0x34, 0x58, 0x41, 0x04, 0x7e, 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, 0xd7, 0x92, 0x62, 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, 0x40, 0x9a, 0xc5, 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, 0x79, 0x0a, 0xeb, 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, 0xd1, 0xc3, 0x35, 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, 0xe3, 0x2b, 0xb0, 0x13, 0xbb, 0x2b, 0x41, 0x04, 0xa4, 0x95, 0x58, 0xd3, 0x2e, 0xd1, 0xeb, 0xfc, 0x18, 0x16, 0xaf, 0x4f, 0xf0, 0x9b, 0x55, 0xfc, 0xb4, 0xca, 0x47, 0xb2, 0xa0, 0x2d, 0x1e, 0x7c, 0xaf, 0x11, 0x79, 0xea, 0x3f, 0xe1, 0x39, 0x5b, 0x22, 0xb8, 0x61, 0x96, 0x40, 0x16, 0xfa, 0xba, 0xf7, 0x2c, 0x97, 0x56, 0x95, 0xd9, 0x3d, 0x4d, 0xf0, 0xe5, 0x19, 0x7f, 0xe9, 0xf0, 0x40, 0x63, 0x4e, 0xd5, 0x97, 0x64, 0x93, 0x77, 0x87, 0xbe, 0x20, 0xbc, 0x4d, 0xee, 0xbb, 0xf9, 0xb8, 0xd6, 0x0a, 0x33, 0x5f, 0x04, 0x6c, 0xa3, 0xaa, 0x94, 0x1e, 0x45, 0x86, 0x4c, 0x7c, 0xad, 0xef, 0x9c, 0xf7, 0x5b, 0x3d, 0x8b, 0x01, 0x0e, 0x44, 0x3e, 0xf0 }; static const unsigned char ecjpake_test_srv_one[] = { 0x41, 0x04, 0x7e, 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, 0xd7, 0x92, 0x62, 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, 0x40, 0x9a, 0xc5, 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, 0x79, 0x0a, 0xeb, 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, 0xd1, 0xc3, 0x35, 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, 0xe3, 0x2b, 0xb0, 0x13, 0xbb, 0x2b, 0x41, 0x04, 0x09, 0xf8, 0x5b, 0x3d, 0x20, 0xeb, 0xd7, 0x88, 0x5c, 0xe4, 0x64, 0xc0, 0x8d, 0x05, 0x6d, 0x64, 0x28, 0xfe, 0x4d, 0xd9, 0x28, 0x7a, 0xa3, 0x65, 0xf1, 0x31, 0xf4, 0x36, 0x0f, 0xf3, 0x86, 0xd8, 0x46, 0x89, 0x8b, 0xc4, 0xb4, 0x15, 0x83, 0xc2, 0xa5, 0x19, 0x7f, 0x65, 0xd7, 0x87, 0x42, 0x74, 0x6c, 0x12, 0xa5, 0xec, 0x0a, 0x4f, 0xfe, 0x2f, 0x27, 0x0a, 0x75, 0x0a, 0x1d, 0x8f, 0xb5, 0x16, 0x20, 0x93, 0x4d, 0x74, 0xeb, 0x43, 0xe5, 0x4d, 0xf4, 0x24, 0xfd, 0x96, 0x30, 0x6c, 0x01, 0x17, 0xbf, 0x13, 0x1a, 0xfa, 0xbf, 0x90, 0xa9, 0xd3, 0x3d, 0x11, 0x98, 0xd9, 0x05, 0x19, 0x37, 0x35, 0x14, 0x41, 0x04, 0x19, 0x0a, 0x07, 0x70, 0x0f, 0xfa, 0x4b, 0xe6, 0xae, 0x1d, 0x79, 0xee, 0x0f, 0x06, 0xae, 0xb5, 0x44, 0xcd, 0x5a, 0xdd, 0xaa, 0xbe, 0xdf, 0x70, 0xf8, 0x62, 0x33, 0x21, 0x33, 0x2c, 0x54, 0xf3, 0x55, 0xf0, 0xfb, 0xfe, 0xc7, 0x83, 0xed, 0x35, 0x9e, 0x5d, 0x0b, 0xf7, 0x37, 0x7a, 0x0f, 0xc4, 0xea, 0x7a, 0xce, 0x47, 0x3c, 0x9c, 0x11, 0x2b, 0x41, 0xcc, 0xd4, 0x1a, 0xc5, 0x6a, 0x56, 0x12, 0x41, 0x04, 0x36, 0x0a, 0x1c, 0xea, 0x33, 0xfc, 0xe6, 0x41, 0x15, 0x64, 0x58, 0xe0, 0xa4, 0xea, 0xc2, 0x19, 0xe9, 0x68, 0x31, 0xe6, 0xae, 0xbc, 0x88, 0xb3, 0xf3, 0x75, 0x2f, 0x93, 0xa0, 0x28, 0x1d, 0x1b, 0xf1, 0xfb, 0x10, 0x60, 0x51, 0xdb, 0x96, 0x94, 0xa8, 0xd6, 0xe8, 0x62, 0xa5, 0xef, 0x13, 0x24, 0xa3, 0xd9, 0xe2, 0x78, 0x94, 0xf1, 0xee, 0x4f, 0x7c, 0x59, 0x19, 0x99, 0x65, 0xa8, 0xdd, 0x4a, 0x20, 0x91, 0x84, 0x7d, 0x2d, 0x22, 0xdf, 0x3e, 0xe5, 0x5f, 0xaa, 0x2a, 0x3f, 0xb3, 0x3f, 0xd2, 0xd1, 0xe0, 0x55, 0xa0, 0x7a, 0x7c, 0x61, 0xec, 0xfb, 0x8d, 0x80, 0xec, 0x00, 0xc2, 0xc9, 0xeb, 0x12 }; static const unsigned char ecjpake_test_srv_two[] = { 0x03, 0x00, 0x17, 0x41, 0x04, 0x0f, 0xb2, 0x2b, 0x1d, 0x5d, 0x11, 0x23, 0xe0, 0xef, 0x9f, 0xeb, 0x9d, 0x8a, 0x2e, 0x59, 0x0a, 0x1f, 0x4d, 0x7c, 0xed, 0x2c, 0x2b, 0x06, 0x58, 0x6e, 0x8f, 0x2a, 0x16, 0xd4, 0xeb, 0x2f, 0xda, 0x43, 0x28, 0xa2, 0x0b, 0x07, 0xd8, 0xfd, 0x66, 0x76, 0x54, 0xca, 0x18, 0xc5, 0x4e, 0x32, 0xa3, 0x33, 0xa0, 0x84, 0x54, 0x51, 0xe9, 0x26, 0xee, 0x88, 0x04, 0xfd, 0x7a, 0xf0, 0xaa, 0xa7, 0xa6, 0x41, 0x04, 0x55, 0x16, 0xea, 0x3e, 0x54, 0xa0, 0xd5, 0xd8, 0xb2, 0xce, 0x78, 0x6b, 0x38, 0xd3, 0x83, 0x37, 0x00, 0x29, 0xa5, 0xdb, 0xe4, 0x45, 0x9c, 0x9d, 0xd6, 0x01, 0xb4, 0x08, 0xa2, 0x4a, 0xe6, 0x46, 0x5c, 0x8a, 0xc9, 0x05, 0xb9, 0xeb, 0x03, 0xb5, 0xd3, 0x69, 0x1c, 0x13, 0x9e, 0xf8, 0x3f, 0x1c, 0xd4, 0x20, 0x0f, 0x6c, 0x9c, 0xd4, 0xec, 0x39, 0x22, 0x18, 0xa5, 0x9e, 0xd2, 0x43, 0xd3, 0xc8, 0x20, 0xff, 0x72, 0x4a, 0x9a, 0x70, 0xb8, 0x8c, 0xb8, 0x6f, 0x20, 0xb4, 0x34, 0xc6, 0x86, 0x5a, 0xa1, 0xcd, 0x79, 0x06, 0xdd, 0x7c, 0x9b, 0xce, 0x35, 0x25, 0xf5, 0x08, 0x27, 0x6f, 0x26, 0x83, 0x6c }; static const unsigned char ecjpake_test_cli_two[] = { 0x41, 0x04, 0x69, 0xd5, 0x4e, 0xe8, 0x5e, 0x90, 0xce, 0x3f, 0x12, 0x46, 0x74, 0x2d, 0xe5, 0x07, 0xe9, 0x39, 0xe8, 0x1d, 0x1d, 0xc1, 0xc5, 0xcb, 0x98, 0x8b, 0x58, 0xc3, 0x10, 0xc9, 0xfd, 0xd9, 0x52, 0x4d, 0x93, 0x72, 0x0b, 0x45, 0x54, 0x1c, 0x83, 0xee, 0x88, 0x41, 0x19, 0x1d, 0xa7, 0xce, 0xd8, 0x6e, 0x33, 0x12, 0xd4, 0x36, 0x23, 0xc1, 0xd6, 0x3e, 0x74, 0x98, 0x9a, 0xba, 0x4a, 0xff, 0xd1, 0xee, 0x41, 0x04, 0x07, 0x7e, 0x8c, 0x31, 0xe2, 0x0e, 0x6b, 0xed, 0xb7, 0x60, 0xc1, 0x35, 0x93, 0xe6, 0x9f, 0x15, 0xbe, 0x85, 0xc2, 0x7d, 0x68, 0xcd, 0x09, 0xcc, 0xb8, 0xc4, 0x18, 0x36, 0x08, 0x91, 0x7c, 0x5c, 0x3d, 0x40, 0x9f, 0xac, 0x39, 0xfe, 0xfe, 0xe8, 0x2f, 0x72, 0x92, 0xd3, 0x6f, 0x0d, 0x23, 0xe0, 0x55, 0x91, 0x3f, 0x45, 0xa5, 0x2b, 0x85, 0xdd, 0x8a, 0x20, 0x52, 0xe9, 0xe1, 0x29, 0xbb, 0x4d, 0x20, 0x0f, 0x01, 0x1f, 0x19, 0x48, 0x35, 0x35, 0xa6, 0xe8, 0x9a, 0x58, 0x0c, 0x9b, 0x00, 0x03, 0xba, 0xf2, 0x14, 0x62, 0xec, 0xe9, 0x1a, 0x82, 0xcc, 0x38, 0xdb, 0xdc, 0xae, 0x60, 0xd9, 0xc5, 0x4c }; static const unsigned char ecjpake_test_pms[] = { 0xf3, 0xd4, 0x7f, 0x59, 0x98, 0x44, 0xdb, 0x92, 0xa5, 0x69, 0xbb, 0xe7, 0x98, 0x1e, 0x39, 0xd9, 0x31, 0xfd, 0x74, 0x3b, 0xf2, 0x2e, 0x98, 0xf9, 0xb4, 0x38, 0xf7, 0x19, 0xd3, 0xc4, 0xf3, 0x51 }; /* Load my private keys and generate the correponding public keys */ static int ecjpake_test_load( mbedtls_ecjpake_context *ctx, const unsigned char *xm1, size_t len1, const unsigned char *xm2, size_t len2 ) { int ret; MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm1, xm1, len1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm2, xm2, len2 ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &ctx->Xm1, &ctx->xm1, &ctx->grp.G, NULL, NULL ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &ctx->Xm2, &ctx->xm2, &ctx->grp.G, NULL, NULL ) ); cleanup: return( ret ); } /* For tests we don't need a secure RNG; * use the LGC from Numerical Recipes for simplicity */ static int ecjpake_lgc( void *p, unsigned char *out, size_t len ) { static uint32_t x = 42; (void) p; while( len > 0 ) { size_t use_len = len > 4 ? 4 : len; x = 1664525 * x + 1013904223; memcpy( out, &x, use_len ); out += use_len; len -= use_len; } return( 0 ); } #define TEST_ASSERT( x ) \ do { \ if( x ) \ ret = 0; \ else \ { \ ret = 1; \ goto cleanup; \ } \ } while( 0 ) /* * Checkup routine */ int mbedtls_ecjpake_self_test( int verbose ) { int ret; mbedtls_ecjpake_context cli; mbedtls_ecjpake_context srv; unsigned char buf[512], pms[32]; size_t len, pmslen; mbedtls_ecjpake_init( &cli ); mbedtls_ecjpake_init( &srv ); if( verbose != 0 ) mbedtls_printf( " ECJPAKE test #0 (setup): " ); TEST_ASSERT( mbedtls_ecjpake_setup( &cli, MBEDTLS_ECJPAKE_CLIENT, MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, ecjpake_test_password, sizeof( ecjpake_test_password ) ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_setup( &srv, MBEDTLS_ECJPAKE_SERVER, MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1, ecjpake_test_password, sizeof( ecjpake_test_password ) ) == 0 ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " ECJPAKE test #1 (random handshake): " ); TEST_ASSERT( mbedtls_ecjpake_write_round_one( &cli, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_one( &srv, buf, len ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_write_round_one( &srv, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_one( &cli, buf, len ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_write_round_two( &srv, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_two( &cli, buf, len ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_derive_secret( &cli, pms, sizeof( pms ), &pmslen, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_write_round_two( &cli, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_two( &srv, buf, len ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_derive_secret( &srv, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( len == pmslen ); TEST_ASSERT( memcmp( buf, pms, len ) == 0 ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); if( verbose != 0 ) mbedtls_printf( " ECJPAKE test #2 (reference handshake): " ); /* Simulate generation of round one */ MBEDTLS_MPI_CHK( ecjpake_test_load( &cli, ecjpake_test_x1, sizeof( ecjpake_test_x1 ), ecjpake_test_x2, sizeof( ecjpake_test_x2 ) ) ); MBEDTLS_MPI_CHK( ecjpake_test_load( &srv, ecjpake_test_x3, sizeof( ecjpake_test_x3 ), ecjpake_test_x4, sizeof( ecjpake_test_x4 ) ) ); /* Read round one */ TEST_ASSERT( mbedtls_ecjpake_read_round_one( &srv, ecjpake_test_cli_one, sizeof( ecjpake_test_cli_one ) ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_one( &cli, ecjpake_test_srv_one, sizeof( ecjpake_test_srv_one ) ) == 0 ); /* Skip generation of round two, read round two */ TEST_ASSERT( mbedtls_ecjpake_read_round_two( &cli, ecjpake_test_srv_two, sizeof( ecjpake_test_srv_two ) ) == 0 ); TEST_ASSERT( mbedtls_ecjpake_read_round_two( &srv, ecjpake_test_cli_two, sizeof( ecjpake_test_cli_two ) ) == 0 ); /* Server derives PMS */ TEST_ASSERT( mbedtls_ecjpake_derive_secret( &srv, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( len == sizeof( ecjpake_test_pms ) ); TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 ); memset( buf, 0, len ); /* Avoid interferences with next step */ /* Client derives PMS */ TEST_ASSERT( mbedtls_ecjpake_derive_secret( &cli, buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 ); TEST_ASSERT( len == sizeof( ecjpake_test_pms ) ); TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 ); if( verbose != 0 ) mbedtls_printf( "passed\n" ); cleanup: mbedtls_ecjpake_free( &cli ); mbedtls_ecjpake_free( &srv ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); ret = 1; } if( verbose != 0 ) mbedtls_printf( "\n" ); return( ret ); } #undef TEST_ASSERT #endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED && MBEDTLS_SHA256_C */ #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_ECJPAKE_C */ fldigi-4.2.05/src/mbedtls/pkparse.c0000664000175000017500000012770114611711171014025 00000000000000/* * Public Key layer for parsing key files and structures * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PK_PARSE_C) #include "mbedtls/pk.h" #include "mbedtls/asn1.h" #include "mbedtls/oid.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #endif #if defined(MBEDTLS_ECP_C) #include "mbedtls/ecp.h" #endif #if defined(MBEDTLS_ECDSA_C) #include "mbedtls/ecdsa.h" #endif #if defined(MBEDTLS_PEM_PARSE_C) #include "mbedtls/pem.h" #endif #if defined(MBEDTLS_PKCS5_C) #include "mbedtls/pkcs5.h" #endif #if defined(MBEDTLS_PKCS12_C) #include "mbedtls/pkcs12.h" #endif #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif /* Parameter validation macros based on platform_util.h */ #define PK_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_PK_BAD_INPUT_DATA ) #define PK_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_FS_IO) /* * Load all data from a file into a given buffer. * * The file is expected to contain either PEM or DER encoded data. * A terminating null byte is always appended. It is included in the announced * length only if the data looks like it is PEM encoded. */ int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n ) { FILE *f; long size; PK_VALIDATE_RET( path != NULL ); PK_VALIDATE_RET( buf != NULL ); PK_VALIDATE_RET( n != NULL ); if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_PK_FILE_IO_ERROR ); fseek( f, 0, SEEK_END ); if( ( size = ftell( f ) ) == -1 ) { fclose( f ); return( MBEDTLS_ERR_PK_FILE_IO_ERROR ); } fseek( f, 0, SEEK_SET ); *n = (size_t) size; if( *n + 1 == 0 || ( *buf = mbedtls_calloc( 1, *n + 1 ) ) == NULL ) { fclose( f ); return( MBEDTLS_ERR_PK_ALLOC_FAILED ); } if( fread( *buf, 1, *n, f ) != *n ) { fclose( f ); mbedtls_platform_zeroize( *buf, *n ); mbedtls_free( *buf ); return( MBEDTLS_ERR_PK_FILE_IO_ERROR ); } fclose( f ); (*buf)[*n] = '\0'; if( strstr( (const char *) *buf, "-----BEGIN " ) != NULL ) ++*n; return( 0 ); } /* * Load and parse a private key */ int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx, const char *path, const char *pwd ) { int ret; size_t n; unsigned char *buf; PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( path != NULL ); if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); if( pwd == NULL ) ret = mbedtls_pk_parse_key( ctx, buf, n, NULL, 0 ); else ret = mbedtls_pk_parse_key( ctx, buf, n, (const unsigned char *) pwd, strlen( pwd ) ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } /* * Load and parse a public key */ int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path ) { int ret; size_t n; unsigned char *buf; PK_VALIDATE_RET( ctx != NULL ); PK_VALIDATE_RET( path != NULL ); if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 ) return( ret ); ret = mbedtls_pk_parse_public_key( ctx, buf, n ); mbedtls_platform_zeroize( buf, n ); mbedtls_free( buf ); return( ret ); } #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_ECP_C) /* Minimally parse an ECParameters buffer to and mbedtls_asn1_buf * * ECParameters ::= CHOICE { * namedCurve OBJECT IDENTIFIER * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... } * -- implicitCurve NULL * } */ static int pk_get_ecparams( unsigned char **p, const unsigned char *end, mbedtls_asn1_buf *params ) { int ret; if ( end - *p < 1 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); /* Tag may be either OID or SEQUENCE */ params->tag = **p; if( params->tag != MBEDTLS_ASN1_OID #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) && params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) #endif ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); } if( ( ret = mbedtls_asn1_get_tag( p, end, ¶ms->len, params->tag ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } params->p = *p; *p += params->len; if( *p != end ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) /* * Parse a SpecifiedECDomain (SEC 1 C.2) and (mostly) fill the group with it. * WARNING: the resulting group should only be used with * pk_group_id_from_specified(), since its base point may not be set correctly * if it was encoded compressed. * * SpecifiedECDomain ::= SEQUENCE { * version SpecifiedECDomainVersion(ecdpVer1 | ecdpVer2 | ecdpVer3, ...), * fieldID FieldID {{FieldTypes}}, * curve Curve, * base ECPoint, * order INTEGER, * cofactor INTEGER OPTIONAL, * hash HashAlgorithm OPTIONAL, * ... * } * * We only support prime-field as field type, and ignore hash and cofactor. */ static int pk_group_from_specified( const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp ) { int ret; unsigned char *p = params->p; const unsigned char * const end = params->p + params->len; const unsigned char *end_field, *end_curve; size_t len; int ver; /* SpecifiedECDomainVersion ::= INTEGER { 1, 2, 3 } */ if( ( ret = mbedtls_asn1_get_int( &p, end, &ver ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ver < 1 || ver > 3 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); /* * FieldID { FIELD-ID:IOSet } ::= SEQUENCE { -- Finite field * fieldType FIELD-ID.&id({IOSet}), * parameters FIELD-ID.&Type({IOSet}{@fieldType}) * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( ret ); end_field = p + len; /* * FIELD-ID ::= TYPE-IDENTIFIER * FieldTypes FIELD-ID ::= { * { Prime-p IDENTIFIED BY prime-field } | * { Characteristic-two IDENTIFIED BY characteristic-two-field } * } * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 } */ if( ( ret = mbedtls_asn1_get_tag( &p, end_field, &len, MBEDTLS_ASN1_OID ) ) != 0 ) return( ret ); if( len != MBEDTLS_OID_SIZE( MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD ) || memcmp( p, MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD, len ) != 0 ) { return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); } p += len; /* Prime-p ::= INTEGER -- Field of size p. */ if( ( ret = mbedtls_asn1_get_mpi( &p, end_field, &grp->P ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); grp->pbits = mbedtls_mpi_bitlen( &grp->P ); if( p != end_field ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* * Curve ::= SEQUENCE { * a FieldElement, * b FieldElement, * seed BIT STRING OPTIONAL * -- Shall be present if used in SpecifiedECDomain * -- with version equal to ecdpVer2 or ecdpVer3 * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( ret ); end_curve = p + len; /* * FieldElement ::= OCTET STRING * containing an integer in the case of a prime field */ if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 || ( ret = mbedtls_mpi_read_binary( &grp->A, p, len ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } p += len; if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 || ( ret = mbedtls_mpi_read_binary( &grp->B, p, len ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } p += len; /* Ignore seed BIT STRING OPTIONAL */ if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_BIT_STRING ) ) == 0 ) p += len; if( p != end_curve ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* * ECPoint ::= OCTET STRING */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ( ret = mbedtls_ecp_point_read_binary( grp, &grp->G, ( const unsigned char *) p, len ) ) != 0 ) { /* * If we can't read the point because it's compressed, cheat by * reading only the X coordinate and the parity bit of Y. */ if( ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE || ( p[0] != 0x02 && p[0] != 0x03 ) || len != mbedtls_mpi_size( &grp->P ) + 1 || mbedtls_mpi_read_binary( &grp->G.X, p + 1, len - 1 ) != 0 || mbedtls_mpi_lset( &grp->G.Y, p[0] - 2 ) != 0 || mbedtls_mpi_lset( &grp->G.Z, 1 ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); } } p += len; /* * order INTEGER */ if( ( ret = mbedtls_asn1_get_mpi( &p, end, &grp->N ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); grp->nbits = mbedtls_mpi_bitlen( &grp->N ); /* * Allow optional elements by purposefully not enforcing p == end here. */ return( 0 ); } /* * Find the group id associated with an (almost filled) group as generated by * pk_group_from_specified(), or return an error if unknown. */ static int pk_group_id_from_group( const mbedtls_ecp_group *grp, mbedtls_ecp_group_id *grp_id ) { int ret = 0; mbedtls_ecp_group ref; const mbedtls_ecp_group_id *id; mbedtls_ecp_group_init( &ref ); for( id = mbedtls_ecp_grp_id_list(); *id != MBEDTLS_ECP_DP_NONE; id++ ) { /* Load the group associated to that id */ mbedtls_ecp_group_free( &ref ); MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &ref, *id ) ); /* Compare to the group we were given, starting with easy tests */ if( grp->pbits == ref.pbits && grp->nbits == ref.nbits && mbedtls_mpi_cmp_mpi( &grp->P, &ref.P ) == 0 && mbedtls_mpi_cmp_mpi( &grp->A, &ref.A ) == 0 && mbedtls_mpi_cmp_mpi( &grp->B, &ref.B ) == 0 && mbedtls_mpi_cmp_mpi( &grp->N, &ref.N ) == 0 && mbedtls_mpi_cmp_mpi( &grp->G.X, &ref.G.X ) == 0 && mbedtls_mpi_cmp_mpi( &grp->G.Z, &ref.G.Z ) == 0 && /* For Y we may only know the parity bit, so compare only that */ mbedtls_mpi_get_bit( &grp->G.Y, 0 ) == mbedtls_mpi_get_bit( &ref.G.Y, 0 ) ) { break; } } cleanup: mbedtls_ecp_group_free( &ref ); *grp_id = *id; if( ret == 0 && *id == MBEDTLS_ECP_DP_NONE ) ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE; return( ret ); } /* * Parse a SpecifiedECDomain (SEC 1 C.2) and find the associated group ID */ static int pk_group_id_from_specified( const mbedtls_asn1_buf *params, mbedtls_ecp_group_id *grp_id ) { int ret; mbedtls_ecp_group grp; mbedtls_ecp_group_init( &grp ); if( ( ret = pk_group_from_specified( params, &grp ) ) != 0 ) goto cleanup; ret = pk_group_id_from_group( &grp, grp_id ); cleanup: mbedtls_ecp_group_free( &grp ); return( ret ); } #endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */ /* * Use EC parameters to initialise an EC group * * ECParameters ::= CHOICE { * namedCurve OBJECT IDENTIFIER * specifiedCurve SpecifiedECDomain -- = SEQUENCE { ... } * -- implicitCurve NULL */ static int pk_use_ecparams( const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp ) { int ret; mbedtls_ecp_group_id grp_id; if( params->tag == MBEDTLS_ASN1_OID ) { if( mbedtls_oid_get_ec_grp( params, &grp_id ) != 0 ) return( MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE ); } else { #if defined(MBEDTLS_PK_PARSE_EC_EXTENDED) if( ( ret = pk_group_id_from_specified( params, &grp_id ) ) != 0 ) return( ret ); #else return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); #endif } /* * grp may already be initilialized; if so, make sure IDs match */ if( grp->id != MBEDTLS_ECP_DP_NONE && grp->id != grp_id ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); if( ( ret = mbedtls_ecp_group_load( grp, grp_id ) ) != 0 ) return( ret ); return( 0 ); } /* * EC public key is an EC point * * The caller is responsible for clearing the structure upon failure if * desired. Take care to pass along the possible ECP_FEATURE_UNAVAILABLE * return code of mbedtls_ecp_point_read_binary() and leave p in a usable state. */ static int pk_get_ecpubkey( unsigned char **p, const unsigned char *end, mbedtls_ecp_keypair *key ) { int ret; if( ( ret = mbedtls_ecp_point_read_binary( &key->grp, &key->Q, (const unsigned char *) *p, end - *p ) ) == 0 ) { ret = mbedtls_ecp_check_pubkey( &key->grp, &key->Q ); } /* * We know mbedtls_ecp_point_read_binary consumed all bytes or failed */ *p = (unsigned char *) end; return( ret ); } #endif /* MBEDTLS_ECP_C */ #if defined(MBEDTLS_RSA_C) /* * RSAPublicKey ::= SEQUENCE { * modulus INTEGER, -- n * publicExponent INTEGER -- e * } */ static int pk_get_rsapubkey( unsigned char **p, const unsigned char *end, mbedtls_rsa_context *rsa ) { int ret; size_t len; if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret ); if( *p + len != end ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); /* Import N */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret ); if( ( ret = mbedtls_rsa_import_raw( rsa, *p, len, NULL, 0, NULL, 0, NULL, 0, NULL, 0 ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY ); *p += len; /* Import E */ if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret ); if( ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, NULL, 0, NULL, 0, NULL, 0, *p, len ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY ); *p += len; if( mbedtls_rsa_complete( rsa ) != 0 || mbedtls_rsa_check_pubkey( rsa ) != 0 ) { return( MBEDTLS_ERR_PK_INVALID_PUBKEY ); } if( *p != end ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); return( 0 ); } #endif /* MBEDTLS_RSA_C */ /* Get a PK algorithm identifier * * AlgorithmIdentifier ::= SEQUENCE { * algorithm OBJECT IDENTIFIER, * parameters ANY DEFINED BY algorithm OPTIONAL } */ static int pk_get_pk_alg( unsigned char **p, const unsigned char *end, mbedtls_pk_type_t *pk_alg, mbedtls_asn1_buf *params ) { int ret; mbedtls_asn1_buf alg_oid; memset( params, 0, sizeof(mbedtls_asn1_buf) ); if( ( ret = mbedtls_asn1_get_alg( p, end, &alg_oid, params ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_ALG + ret ); if( mbedtls_oid_get_pk_alg( &alg_oid, pk_alg ) != 0 ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); /* * No parameters with RSA (only for EC) */ if( *pk_alg == MBEDTLS_PK_RSA && ( ( params->tag != MBEDTLS_ASN1_NULL && params->tag != 0 ) || params->len != 0 ) ) { return( MBEDTLS_ERR_PK_INVALID_ALG ); } return( 0 ); } /* * SubjectPublicKeyInfo ::= SEQUENCE { * algorithm AlgorithmIdentifier, * subjectPublicKey BIT STRING } */ int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end, mbedtls_pk_context *pk ) { int ret; size_t len; mbedtls_asn1_buf alg_params; mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; const mbedtls_pk_info_t *pk_info; PK_VALIDATE_RET( p != NULL ); PK_VALIDATE_RET( *p != NULL ); PK_VALIDATE_RET( end != NULL ); PK_VALIDATE_RET( pk != NULL ); if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = *p + len; if( ( ret = pk_get_pk_alg( p, end, &pk_alg, &alg_params ) ) != 0 ) return( ret ); if( ( ret = mbedtls_asn1_get_bitstring_null( p, end, &len ) ) != 0 ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret ); if( *p + len != end ) return( MBEDTLS_ERR_PK_INVALID_PUBKEY + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); if( ( pk_info = mbedtls_pk_info_from_type( pk_alg ) ) == NULL ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 ) return( ret ); #if defined(MBEDTLS_RSA_C) if( pk_alg == MBEDTLS_PK_RSA ) { ret = pk_get_rsapubkey( p, end, mbedtls_pk_rsa( *pk ) ); } else #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) if( pk_alg == MBEDTLS_PK_ECKEY_DH || pk_alg == MBEDTLS_PK_ECKEY ) { ret = pk_use_ecparams( &alg_params, &mbedtls_pk_ec( *pk )->grp ); if( ret == 0 ) ret = pk_get_ecpubkey( p, end, mbedtls_pk_ec( *pk ) ); } else #endif /* MBEDTLS_ECP_C */ ret = MBEDTLS_ERR_PK_UNKNOWN_PK_ALG; if( ret == 0 && *p != end ) ret = MBEDTLS_ERR_PK_INVALID_PUBKEY MBEDTLS_ERR_ASN1_LENGTH_MISMATCH; if( ret != 0 ) mbedtls_pk_free( pk ); return( ret ); } #if defined(MBEDTLS_RSA_C) /* * Parse a PKCS#1 encoded private RSA key */ static int pk_parse_key_pkcs1_der( mbedtls_rsa_context *rsa, const unsigned char *key, size_t keylen ) { int ret, version; size_t len; unsigned char *p, *end; mbedtls_mpi T; mbedtls_mpi_init( &T ); p = (unsigned char *) key; end = p + keylen; /* * This function parses the RSAPrivateKey (PKCS#1) * * RSAPrivateKey ::= SEQUENCE { * version Version, * modulus INTEGER, -- n * publicExponent INTEGER, -- e * privateExponent INTEGER, -- d * prime1 INTEGER, -- p * prime2 INTEGER, -- q * exponent1 INTEGER, -- d mod (p-1) * exponent2 INTEGER, -- d mod (q-1) * coefficient INTEGER, -- (inverse of q) mod p * otherPrimeInfos OtherPrimeInfos OPTIONAL * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } if( version != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION ); } /* Import N */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, p, len, NULL, 0, NULL, 0, NULL, 0, NULL, 0 ) ) != 0 ) goto cleanup; p += len; /* Import E */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, NULL, 0, NULL, 0, NULL, 0, p, len ) ) != 0 ) goto cleanup; p += len; /* Import D */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, NULL, 0, NULL, 0, p, len, NULL, 0 ) ) != 0 ) goto cleanup; p += len; /* Import P */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, p, len, NULL, 0, NULL, 0, NULL, 0 ) ) != 0 ) goto cleanup; p += len; /* Import Q */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 || ( ret = mbedtls_rsa_import_raw( rsa, NULL, 0, NULL, 0, p, len, NULL, 0, NULL, 0 ) ) != 0 ) goto cleanup; p += len; /* Complete the RSA private key */ if( ( ret = mbedtls_rsa_complete( rsa ) ) != 0 ) goto cleanup; /* Check optional parameters */ if( ( ret = mbedtls_asn1_get_mpi( &p, end, &T ) ) != 0 || ( ret = mbedtls_asn1_get_mpi( &p, end, &T ) ) != 0 || ( ret = mbedtls_asn1_get_mpi( &p, end, &T ) ) != 0 ) goto cleanup; if( p != end ) { ret = MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ; } cleanup: mbedtls_mpi_free( &T ); if( ret != 0 ) { /* Wrap error code if it's coming from a lower level */ if( ( ret & 0xff80 ) == 0 ) ret = MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret; else ret = MBEDTLS_ERR_PK_KEY_INVALID_FORMAT; mbedtls_rsa_free( rsa ); } return( ret ); } #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* * Parse a SEC1 encoded private EC key */ static int pk_parse_key_sec1_der( mbedtls_ecp_keypair *eck, const unsigned char *key, size_t keylen ) { int ret; int version, pubkey_done; size_t len; mbedtls_asn1_buf params; unsigned char *p = (unsigned char *) key; unsigned char *end = p + keylen; unsigned char *end2; /* * RFC 5915, or SEC1 Appendix C.4 * * ECPrivateKey ::= SEQUENCE { * version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), * privateKey OCTET STRING, * parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, * publicKey [1] BIT STRING OPTIONAL * } */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( version != 1 ) return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ( ret = mbedtls_mpi_read_binary( &eck->d, p, len ) ) != 0 ) { mbedtls_ecp_keypair_free( eck ); return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } p += len; pubkey_done = 0; if( p != end ) { /* * Is 'parameters' present? */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) == 0 ) { if( ( ret = pk_get_ecparams( &p, p + len, ¶ms) ) != 0 || ( ret = pk_use_ecparams( ¶ms, &eck->grp ) ) != 0 ) { mbedtls_ecp_keypair_free( eck ); return( ret ); } } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { mbedtls_ecp_keypair_free( eck ); return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } } if( p != end ) { /* * Is 'publickey' present? If not, or if we can't read it (eg because it * is compressed), create it from the private key. */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ) == 0 ) { end2 = p + len; if( ( ret = mbedtls_asn1_get_bitstring_null( &p, end2, &len ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( p + len != end2 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_LENGTH_MISMATCH ); if( ( ret = pk_get_ecpubkey( &p, end2, eck ) ) == 0 ) pubkey_done = 1; else { /* * The only acceptable failure mode of pk_get_ecpubkey() above * is if the point format is not recognized. */ if( ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); } } else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) { mbedtls_ecp_keypair_free( eck ); return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } } if( ! pubkey_done && ( ret = mbedtls_ecp_mul( &eck->grp, &eck->Q, &eck->d, &eck->grp.G, NULL, NULL ) ) != 0 ) { mbedtls_ecp_keypair_free( eck ); return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } if( ( ret = mbedtls_ecp_check_privkey( &eck->grp, &eck->d ) ) != 0 ) { mbedtls_ecp_keypair_free( eck ); return( ret ); } return( 0 ); } #endif /* MBEDTLS_ECP_C */ /* * Parse an unencrypted PKCS#8 encoded private key * * Notes: * * - This function does not own the key buffer. It is the * responsibility of the caller to take care of zeroizing * and freeing it after use. * * - The function is responsible for freeing the provided * PK context on failure. * */ static int pk_parse_key_pkcs8_unencrypted_der( mbedtls_pk_context *pk, const unsigned char* key, size_t keylen ) { int ret, version; size_t len; mbedtls_asn1_buf params; unsigned char *p = (unsigned char *) key; unsigned char *end = p + keylen; mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE; const mbedtls_pk_info_t *pk_info; /* * This function parses the PrivateKeyInfo object (PKCS#8 v1.2 = RFC 5208) * * PrivateKeyInfo ::= SEQUENCE { * version Version, * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier, * privateKey PrivateKey, * attributes [0] IMPLICIT Attributes OPTIONAL } * * Version ::= INTEGER * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier * PrivateKey ::= OCTET STRING * * The PrivateKey OCTET STRING is a SEC1 ECPrivateKey */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = p + len; if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( version != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION + ret ); if( ( ret = pk_get_pk_alg( &p, end, &pk_alg, ¶ms ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( len < 1 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); if( ( pk_info = mbedtls_pk_info_from_type( pk_alg ) ) == NULL ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 ) return( ret ); #if defined(MBEDTLS_RSA_C) if( pk_alg == MBEDTLS_PK_RSA ) { if( ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), p, len ) ) != 0 ) { mbedtls_pk_free( pk ); return( ret ); } } else #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) if( pk_alg == MBEDTLS_PK_ECKEY || pk_alg == MBEDTLS_PK_ECKEY_DH ) { if( ( ret = pk_use_ecparams( ¶ms, &mbedtls_pk_ec( *pk )->grp ) ) != 0 || ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), p, len ) ) != 0 ) { mbedtls_pk_free( pk ); return( ret ); } } else #endif /* MBEDTLS_ECP_C */ return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); return( 0 ); } /* * Parse an encrypted PKCS#8 encoded private key * * To save space, the decryption happens in-place on the given key buffer. * Also, while this function may modify the keybuffer, it doesn't own it, * and instead it is the responsibility of the caller to zeroize and properly * free it after use. * */ #if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C) static int pk_parse_key_pkcs8_encrypted_der( mbedtls_pk_context *pk, unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen ) { int ret, decrypted = 0; size_t len; unsigned char *buf; unsigned char *p, *end; mbedtls_asn1_buf pbe_alg_oid, pbe_params; #if defined(MBEDTLS_PKCS12_C) mbedtls_cipher_type_t cipher_alg; mbedtls_md_type_t md_alg; #endif p = key; end = p + keylen; if( pwdlen == 0 ) return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED ); /* * This function parses the EncryptedPrivateKeyInfo object (PKCS#8) * * EncryptedPrivateKeyInfo ::= SEQUENCE { * encryptionAlgorithm EncryptionAlgorithmIdentifier, * encryptedData EncryptedData * } * * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier * * EncryptedData ::= OCTET STRING * * The EncryptedData OCTET STRING is a PKCS#8 PrivateKeyInfo * */ if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) { return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); } end = p + len; if( ( ret = mbedtls_asn1_get_alg( &p, end, &pbe_alg_oid, &pbe_params ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret ); buf = p; /* * Decrypt EncryptedData with appropriate PBE */ #if defined(MBEDTLS_PKCS12_C) if( mbedtls_oid_get_pkcs12_pbe_alg( &pbe_alg_oid, &md_alg, &cipher_alg ) == 0 ) { if( ( ret = mbedtls_pkcs12_pbe( &pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, cipher_alg, md_alg, pwd, pwdlen, p, len, buf ) ) != 0 ) { if( ret == MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); return( ret ); } decrypted = 1; } else if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128, &pbe_alg_oid ) == 0 ) { if( ( ret = mbedtls_pkcs12_pbe_sha1_rc4_128( &pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT, pwd, pwdlen, p, len, buf ) ) != 0 ) { return( ret ); } // Best guess for password mismatch when using RC4. If first tag is // not MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE // if( *buf != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); decrypted = 1; } else #endif /* MBEDTLS_PKCS12_C */ #if defined(MBEDTLS_PKCS5_C) if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS5_PBES2, &pbe_alg_oid ) == 0 ) { if( ( ret = mbedtls_pkcs5_pbes2( &pbe_params, MBEDTLS_PKCS5_DECRYPT, pwd, pwdlen, p, len, buf ) ) != 0 ) { if( ret == MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); return( ret ); } decrypted = 1; } else #endif /* MBEDTLS_PKCS5_C */ { ((void) pwd); } if( decrypted == 0 ) return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE ); return( pk_parse_key_pkcs8_unencrypted_der( pk, buf, len ) ); } #endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */ /* * Parse a private key */ int mbedtls_pk_parse_key( mbedtls_pk_context *pk, const unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen ) { int ret; const mbedtls_pk_info_t *pk_info; #if defined(MBEDTLS_PEM_PARSE_C) size_t len; mbedtls_pem_context pem; #endif PK_VALIDATE_RET( pk != NULL ); if( keylen == 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); PK_VALIDATE_RET( key != NULL ); #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_init( &pem ); #if defined(MBEDTLS_RSA_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN RSA PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----", key, pwd, pwdlen, &len ); if( ret == 0 ) { pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ); if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 || ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), pem.buf, pem.buflen ) ) != 0 ) { mbedtls_pk_free( pk ); } mbedtls_pem_free( &pem ); return( ret ); } else if( ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); else if( ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED ) return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED ); else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN EC PRIVATE KEY-----", "-----END EC PRIVATE KEY-----", key, pwd, pwdlen, &len ); if( ret == 0 ) { pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_ECKEY ); if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 || ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), pem.buf, pem.buflen ) ) != 0 ) { mbedtls_pk_free( pk ); } mbedtls_pem_free( &pem ); return( ret ); } else if( ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH ) return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH ); else if( ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED ) return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED ); else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); #endif /* MBEDTLS_ECP_C */ /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN PRIVATE KEY-----", "-----END PRIVATE KEY-----", key, NULL, 0, &len ); if( ret == 0 ) { if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk, pem.buf, pem.buflen ) ) != 0 ) { mbedtls_pk_free( pk ); } mbedtls_pem_free( &pem ); return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); #if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN ENCRYPTED PRIVATE KEY-----", "-----END ENCRYPTED PRIVATE KEY-----", key, NULL, 0, &len ); if( ret == 0 ) { if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk, pem.buf, pem.buflen, pwd, pwdlen ) ) != 0 ) { mbedtls_pk_free( pk ); } mbedtls_pem_free( &pem ); return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) return( ret ); #endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */ #else ((void) pwd); ((void) pwdlen); #endif /* MBEDTLS_PEM_PARSE_C */ /* * At this point we only know it's not a PEM formatted key. Could be any * of the known DER encoded private key formats * * We try the different DER format parsers to see if one passes without * error */ #if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C) { unsigned char *key_copy; if( ( key_copy = mbedtls_calloc( 1, keylen ) ) == NULL ) return( MBEDTLS_ERR_PK_ALLOC_FAILED ); memcpy( key_copy, key, keylen ); ret = pk_parse_key_pkcs8_encrypted_der( pk, key_copy, keylen, pwd, pwdlen ); mbedtls_platform_zeroize( key_copy, keylen ); mbedtls_free( key_copy ); } if( ret == 0 ) return( 0 ); mbedtls_pk_free( pk ); mbedtls_pk_init( pk ); if( ret == MBEDTLS_ERR_PK_PASSWORD_MISMATCH ) { return( ret ); } #endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */ if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk, key, keylen ) ) == 0 ) return( 0 ); mbedtls_pk_free( pk ); mbedtls_pk_init( pk ); #if defined(MBEDTLS_RSA_C) pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ); if( mbedtls_pk_setup( pk, pk_info ) == 0 && pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), key, keylen ) == 0 ) { return( 0 ); } mbedtls_pk_free( pk ); mbedtls_pk_init( pk ); #endif /* MBEDTLS_RSA_C */ #if defined(MBEDTLS_ECP_C) pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_ECKEY ); if( mbedtls_pk_setup( pk, pk_info ) == 0 && pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), key, keylen ) == 0 ) { return( 0 ); } mbedtls_pk_free( pk ); #endif /* MBEDTLS_ECP_C */ /* If MBEDTLS_RSA_C is defined but MBEDTLS_ECP_C isn't, * it is ok to leave the PK context initialized but not * freed: It is the caller's responsibility to call pk_init() * before calling this function, and to call pk_free() * when it fails. If MBEDTLS_ECP_C is defined but MBEDTLS_RSA_C * isn't, this leads to mbedtls_pk_free() being called * twice, once here and once by the caller, but this is * also ok and in line with the mbedtls_pk_free() calls * on failed PEM parsing attempts. */ return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); } /* * Parse a public key */ int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen ) { int ret; unsigned char *p; #if defined(MBEDTLS_RSA_C) const mbedtls_pk_info_t *pk_info; #endif #if defined(MBEDTLS_PEM_PARSE_C) size_t len; mbedtls_pem_context pem; #endif PK_VALIDATE_RET( ctx != NULL ); if( keylen == 0 ) return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT ); PK_VALIDATE_RET( key != NULL || keylen == 0 ); #if defined(MBEDTLS_PEM_PARSE_C) mbedtls_pem_init( &pem ); #if defined(MBEDTLS_RSA_C) /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN RSA PUBLIC KEY-----", "-----END RSA PUBLIC KEY-----", key, NULL, 0, &len ); if( ret == 0 ) { p = pem.buf; if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == NULL ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); if( ( ret = mbedtls_pk_setup( ctx, pk_info ) ) != 0 ) return( ret ); if ( ( ret = pk_get_rsapubkey( &p, p + pem.buflen, mbedtls_pk_rsa( *ctx ) ) ) != 0 ) mbedtls_pk_free( ctx ); mbedtls_pem_free( &pem ); return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) { mbedtls_pem_free( &pem ); return( ret ); } #endif /* MBEDTLS_RSA_C */ /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */ if( key[keylen - 1] != '\0' ) ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT; else ret = mbedtls_pem_read_buffer( &pem, "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----", key, NULL, 0, &len ); if( ret == 0 ) { /* * Was PEM encoded */ p = pem.buf; ret = mbedtls_pk_parse_subpubkey( &p, p + pem.buflen, ctx ); mbedtls_pem_free( &pem ); return( ret ); } else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ) { mbedtls_pem_free( &pem ); return( ret ); } mbedtls_pem_free( &pem ); #endif /* MBEDTLS_PEM_PARSE_C */ #if defined(MBEDTLS_RSA_C) if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == NULL ) return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG ); if( ( ret = mbedtls_pk_setup( ctx, pk_info ) ) != 0 ) return( ret ); p = (unsigned char *)key; ret = pk_get_rsapubkey( &p, p + keylen, mbedtls_pk_rsa( *ctx ) ); if( ret == 0 ) { return( ret ); } mbedtls_pk_free( ctx ); if( ret != ( MBEDTLS_ERR_PK_INVALID_PUBKEY + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) ) { return( ret ); } #endif /* MBEDTLS_RSA_C */ p = (unsigned char *) key; ret = mbedtls_pk_parse_subpubkey( &p, p + keylen, ctx ); return( ret ); } #endif /* MBEDTLS_PK_PARSE_C */ fldigi-4.2.05/src/mbedtls/ripemd160.c0000664000175000017500000003702114611711171014062 00000000000000/* * RIPE MD-160 implementation * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * The RIPEMD-160 algorithm was designed by RIPE in 1996 * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html * http://ehash.iaik.tugraz.at/wiki/RIPEMD-160 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_RIPEMD160_C) #include "mbedtls/ripemd160.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_RIPEMD160_ALT) /* * 32-bit integer manipulation macros (little endian) */ #ifndef GET_UINT32_LE #define GET_UINT32_LE(n,b,i) \ { \ (n) = ( (uint32_t) (b)[(i) ] ) \ | ( (uint32_t) (b)[(i) + 1] << 8 ) \ | ( (uint32_t) (b)[(i) + 2] << 16 ) \ | ( (uint32_t) (b)[(i) + 3] << 24 ); \ } #endif #ifndef PUT_UINT32_LE #define PUT_UINT32_LE(n,b,i) \ { \ (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ } #endif void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_ripemd160_context ) ); } void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx ) { if( ctx == NULL ) return; mbedtls_platform_zeroize( ctx, sizeof( mbedtls_ripemd160_context ) ); } void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst, const mbedtls_ripemd160_context *src ) { *dst = *src; } /* * RIPEMD-160 context setup */ int mbedtls_ripemd160_starts_ret( mbedtls_ripemd160_context *ctx ) { ctx->total[0] = 0; ctx->total[1] = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; ctx->state[4] = 0xC3D2E1F0; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx ) { mbedtls_ripemd160_starts_ret( ctx ); } #endif #if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT) /* * Process one block */ int mbedtls_internal_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ) { uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16]; GET_UINT32_LE( X[ 0], data, 0 ); GET_UINT32_LE( X[ 1], data, 4 ); GET_UINT32_LE( X[ 2], data, 8 ); GET_UINT32_LE( X[ 3], data, 12 ); GET_UINT32_LE( X[ 4], data, 16 ); GET_UINT32_LE( X[ 5], data, 20 ); GET_UINT32_LE( X[ 6], data, 24 ); GET_UINT32_LE( X[ 7], data, 28 ); GET_UINT32_LE( X[ 8], data, 32 ); GET_UINT32_LE( X[ 9], data, 36 ); GET_UINT32_LE( X[10], data, 40 ); GET_UINT32_LE( X[11], data, 44 ); GET_UINT32_LE( X[12], data, 48 ); GET_UINT32_LE( X[13], data, 52 ); GET_UINT32_LE( X[14], data, 56 ); GET_UINT32_LE( X[15], data, 60 ); A = Ap = ctx->state[0]; B = Bp = ctx->state[1]; C = Cp = ctx->state[2]; D = Dp = ctx->state[3]; E = Ep = ctx->state[4]; #define F1( x, y, z ) ( x ^ y ^ z ) #define F2( x, y, z ) ( ( x & y ) | ( ~x & z ) ) #define F3( x, y, z ) ( ( x | ~y ) ^ z ) #define F4( x, y, z ) ( ( x & z ) | ( y & ~z ) ) #define F5( x, y, z ) ( x ^ ( y | ~z ) ) #define S( x, n ) ( ( x << n ) | ( x >> (32 - n) ) ) #define P( a, b, c, d, e, r, s, f, k ) \ a += f( b, c, d ) + X[r] + k; \ a = S( a, s ) + e; \ c = S( c, 10 ); #define P2( a, b, c, d, e, r, s, rp, sp ) \ P( a, b, c, d, e, r, s, F, K ); \ P( a ## p, b ## p, c ## p, d ## p, e ## p, rp, sp, Fp, Kp ); #define F F1 #define K 0x00000000 #define Fp F5 #define Kp 0x50A28BE6 P2( A, B, C, D, E, 0, 11, 5, 8 ); P2( E, A, B, C, D, 1, 14, 14, 9 ); P2( D, E, A, B, C, 2, 15, 7, 9 ); P2( C, D, E, A, B, 3, 12, 0, 11 ); P2( B, C, D, E, A, 4, 5, 9, 13 ); P2( A, B, C, D, E, 5, 8, 2, 15 ); P2( E, A, B, C, D, 6, 7, 11, 15 ); P2( D, E, A, B, C, 7, 9, 4, 5 ); P2( C, D, E, A, B, 8, 11, 13, 7 ); P2( B, C, D, E, A, 9, 13, 6, 7 ); P2( A, B, C, D, E, 10, 14, 15, 8 ); P2( E, A, B, C, D, 11, 15, 8, 11 ); P2( D, E, A, B, C, 12, 6, 1, 14 ); P2( C, D, E, A, B, 13, 7, 10, 14 ); P2( B, C, D, E, A, 14, 9, 3, 12 ); P2( A, B, C, D, E, 15, 8, 12, 6 ); #undef F #undef K #undef Fp #undef Kp #define F F2 #define K 0x5A827999 #define Fp F4 #define Kp 0x5C4DD124 P2( E, A, B, C, D, 7, 7, 6, 9 ); P2( D, E, A, B, C, 4, 6, 11, 13 ); P2( C, D, E, A, B, 13, 8, 3, 15 ); P2( B, C, D, E, A, 1, 13, 7, 7 ); P2( A, B, C, D, E, 10, 11, 0, 12 ); P2( E, A, B, C, D, 6, 9, 13, 8 ); P2( D, E, A, B, C, 15, 7, 5, 9 ); P2( C, D, E, A, B, 3, 15, 10, 11 ); P2( B, C, D, E, A, 12, 7, 14, 7 ); P2( A, B, C, D, E, 0, 12, 15, 7 ); P2( E, A, B, C, D, 9, 15, 8, 12 ); P2( D, E, A, B, C, 5, 9, 12, 7 ); P2( C, D, E, A, B, 2, 11, 4, 6 ); P2( B, C, D, E, A, 14, 7, 9, 15 ); P2( A, B, C, D, E, 11, 13, 1, 13 ); P2( E, A, B, C, D, 8, 12, 2, 11 ); #undef F #undef K #undef Fp #undef Kp #define F F3 #define K 0x6ED9EBA1 #define Fp F3 #define Kp 0x6D703EF3 P2( D, E, A, B, C, 3, 11, 15, 9 ); P2( C, D, E, A, B, 10, 13, 5, 7 ); P2( B, C, D, E, A, 14, 6, 1, 15 ); P2( A, B, C, D, E, 4, 7, 3, 11 ); P2( E, A, B, C, D, 9, 14, 7, 8 ); P2( D, E, A, B, C, 15, 9, 14, 6 ); P2( C, D, E, A, B, 8, 13, 6, 6 ); P2( B, C, D, E, A, 1, 15, 9, 14 ); P2( A, B, C, D, E, 2, 14, 11, 12 ); P2( E, A, B, C, D, 7, 8, 8, 13 ); P2( D, E, A, B, C, 0, 13, 12, 5 ); P2( C, D, E, A, B, 6, 6, 2, 14 ); P2( B, C, D, E, A, 13, 5, 10, 13 ); P2( A, B, C, D, E, 11, 12, 0, 13 ); P2( E, A, B, C, D, 5, 7, 4, 7 ); P2( D, E, A, B, C, 12, 5, 13, 5 ); #undef F #undef K #undef Fp #undef Kp #define F F4 #define K 0x8F1BBCDC #define Fp F2 #define Kp 0x7A6D76E9 P2( C, D, E, A, B, 1, 11, 8, 15 ); P2( B, C, D, E, A, 9, 12, 6, 5 ); P2( A, B, C, D, E, 11, 14, 4, 8 ); P2( E, A, B, C, D, 10, 15, 1, 11 ); P2( D, E, A, B, C, 0, 14, 3, 14 ); P2( C, D, E, A, B, 8, 15, 11, 14 ); P2( B, C, D, E, A, 12, 9, 15, 6 ); P2( A, B, C, D, E, 4, 8, 0, 14 ); P2( E, A, B, C, D, 13, 9, 5, 6 ); P2( D, E, A, B, C, 3, 14, 12, 9 ); P2( C, D, E, A, B, 7, 5, 2, 12 ); P2( B, C, D, E, A, 15, 6, 13, 9 ); P2( A, B, C, D, E, 14, 8, 9, 12 ); P2( E, A, B, C, D, 5, 6, 7, 5 ); P2( D, E, A, B, C, 6, 5, 10, 15 ); P2( C, D, E, A, B, 2, 12, 14, 8 ); #undef F #undef K #undef Fp #undef Kp #define F F5 #define K 0xA953FD4E #define Fp F1 #define Kp 0x00000000 P2( B, C, D, E, A, 4, 9, 12, 8 ); P2( A, B, C, D, E, 0, 15, 15, 5 ); P2( E, A, B, C, D, 5, 5, 10, 12 ); P2( D, E, A, B, C, 9, 11, 4, 9 ); P2( C, D, E, A, B, 7, 6, 1, 12 ); P2( B, C, D, E, A, 12, 8, 5, 5 ); P2( A, B, C, D, E, 2, 13, 8, 14 ); P2( E, A, B, C, D, 10, 12, 7, 6 ); P2( D, E, A, B, C, 14, 5, 6, 8 ); P2( C, D, E, A, B, 1, 12, 2, 13 ); P2( B, C, D, E, A, 3, 13, 13, 6 ); P2( A, B, C, D, E, 8, 14, 14, 5 ); P2( E, A, B, C, D, 11, 11, 0, 15 ); P2( D, E, A, B, C, 6, 8, 3, 13 ); P2( C, D, E, A, B, 15, 5, 9, 11 ); P2( B, C, D, E, A, 13, 6, 11, 11 ); #undef F #undef K #undef Fp #undef Kp C = ctx->state[1] + C + Dp; ctx->state[1] = ctx->state[2] + D + Ep; ctx->state[2] = ctx->state[3] + E + Ap; ctx->state[3] = ctx->state[4] + A + Bp; ctx->state[4] = ctx->state[0] + B + Cp; ctx->state[0] = C; return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ) { mbedtls_internal_ripemd160_process( ctx, data ); } #endif #endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */ /* * RIPEMD-160 process buffer */ int mbedtls_ripemd160_update_ret( mbedtls_ripemd160_context *ctx, const unsigned char *input, size_t ilen ) { int ret; size_t fill; uint32_t left; if( ilen == 0 ) return( 0 ); left = ctx->total[0] & 0x3F; fill = 64 - left; ctx->total[0] += (uint32_t) ilen; ctx->total[0] &= 0xFFFFFFFF; if( ctx->total[0] < (uint32_t) ilen ) ctx->total[1]++; if( left && ilen >= fill ) { memcpy( (void *) (ctx->buffer + left), input, fill ); if( ( ret = mbedtls_internal_ripemd160_process( ctx, ctx->buffer ) ) != 0 ) return( ret ); input += fill; ilen -= fill; left = 0; } while( ilen >= 64 ) { if( ( ret = mbedtls_internal_ripemd160_process( ctx, input ) ) != 0 ) return( ret ); input += 64; ilen -= 64; } if( ilen > 0 ) { memcpy( (void *) (ctx->buffer + left), input, ilen ); } return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx, const unsigned char *input, size_t ilen ) { mbedtls_ripemd160_update_ret( ctx, input, ilen ); } #endif static const unsigned char ripemd160_padding[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* * RIPEMD-160 final digest */ int mbedtls_ripemd160_finish_ret( mbedtls_ripemd160_context *ctx, unsigned char output[20] ) { int ret; uint32_t last, padn; uint32_t high, low; unsigned char msglen[8]; high = ( ctx->total[0] >> 29 ) | ( ctx->total[1] << 3 ); low = ( ctx->total[0] << 3 ); PUT_UINT32_LE( low, msglen, 0 ); PUT_UINT32_LE( high, msglen, 4 ); last = ctx->total[0] & 0x3F; padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); ret = mbedtls_ripemd160_update_ret( ctx, ripemd160_padding, padn ); if( ret != 0 ) return( ret ); ret = mbedtls_ripemd160_update_ret( ctx, msglen, 8 ); if( ret != 0 ) return( ret ); PUT_UINT32_LE( ctx->state[0], output, 0 ); PUT_UINT32_LE( ctx->state[1], output, 4 ); PUT_UINT32_LE( ctx->state[2], output, 8 ); PUT_UINT32_LE( ctx->state[3], output, 12 ); PUT_UINT32_LE( ctx->state[4], output, 16 ); return( 0 ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] ) { mbedtls_ripemd160_finish_ret( ctx, output ); } #endif #endif /* ! MBEDTLS_RIPEMD160_ALT */ /* * output = RIPEMD-160( input buffer ) */ int mbedtls_ripemd160_ret( const unsigned char *input, size_t ilen, unsigned char output[20] ) { int ret; mbedtls_ripemd160_context ctx; mbedtls_ripemd160_init( &ctx ); if( ( ret = mbedtls_ripemd160_starts_ret( &ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_ripemd160_update_ret( &ctx, input, ilen ) ) != 0 ) goto exit; if( ( ret = mbedtls_ripemd160_finish_ret( &ctx, output ) ) != 0 ) goto exit; exit: mbedtls_ripemd160_free( &ctx ); return( ret ); } #if !defined(MBEDTLS_DEPRECATED_REMOVED) void mbedtls_ripemd160( const unsigned char *input, size_t ilen, unsigned char output[20] ) { mbedtls_ripemd160_ret( input, ilen, output ); } #endif #if defined(MBEDTLS_SELF_TEST) /* * Test vectors from the RIPEMD-160 paper and * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC */ #define TESTS 8 static const unsigned char ripemd160_test_str[TESTS][81] = { { "" }, { "a" }, { "abc" }, { "message digest" }, { "abcdefghijklmnopqrstuvwxyz" }, { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, { "12345678901234567890123456789012345678901234567890123456789012" "345678901234567890" }, }; static const size_t ripemd160_test_strlen[TESTS] = { 0, 1, 3, 14, 26, 56, 62, 80 }; static const unsigned char ripemd160_test_md[TESTS][20] = { { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28, 0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 }, { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae, 0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe }, { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04, 0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc }, { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8, 0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 }, { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb, 0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc }, { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05, 0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b }, { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed, 0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 }, { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb, 0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb }, }; /* * Checkup routine */ int mbedtls_ripemd160_self_test( int verbose ) { int i, ret = 0; unsigned char output[20]; memset( output, 0, sizeof output ); for( i = 0; i < TESTS; i++ ) { if( verbose != 0 ) mbedtls_printf( " RIPEMD-160 test #%d: ", i + 1 ); ret = mbedtls_ripemd160_ret( ripemd160_test_str[i], ripemd160_test_strlen[i], output ); if( ret != 0 ) goto fail; if( memcmp( output, ripemd160_test_md[i], 20 ) != 0 ) { ret = 1; goto fail; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); fail: if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_RIPEMD160_C */ fldigi-4.2.05/src/mbedtls/aesni.c0000664000175000017500000004463414611711171013462 00000000000000/* * AES-NI support functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * [AES-WP] http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-aes-instructions-set * [CLMUL-WP] http://software.intel.com/en-us/articles/intel-carry-less-multiplication-instruction-and-its-usage-for-computing-the-gcm-mode/ */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_AESNI_C) #if defined(__has_feature) #if __has_feature(memory_sanitizer) #warning "MBEDTLS_AESNI_C is known to cause spurious error reports with some memory sanitizers as they do not understand the assembly code." #endif #endif #include "mbedtls/aesni.h" #include #ifndef asm #define asm __asm #endif #if defined(MBEDTLS_HAVE_X86_64) /* * AES-NI support detection routine */ int mbedtls_aesni_has_support( unsigned int what ) { static int done = 0; static unsigned int c = 0; if( ! done ) { asm( "movl $1, %%eax \n\t" "cpuid \n\t" : "=c" (c) : : "eax", "ebx", "edx" ); done = 1; } return( ( c & what ) != 0 ); } /* * Binutils needs to be at least 2.19 to support AES-NI instructions. * Unfortunately, a lot of users have a lower version now (2014-04). * Emit bytecode directly in order to support "old" version of gas. * * Opcodes from the Intel architecture reference manual, vol. 3. * We always use registers, so we don't need prefixes for memory operands. * Operand macros are in gas order (src, dst) as opposed to Intel order * (dst, src) in order to blend better into the surrounding assembly code. */ #define AESDEC ".byte 0x66,0x0F,0x38,0xDE," #define AESDECLAST ".byte 0x66,0x0F,0x38,0xDF," #define AESENC ".byte 0x66,0x0F,0x38,0xDC," #define AESENCLAST ".byte 0x66,0x0F,0x38,0xDD," #define AESIMC ".byte 0x66,0x0F,0x38,0xDB," #define AESKEYGENA ".byte 0x66,0x0F,0x3A,0xDF," #define PCLMULQDQ ".byte 0x66,0x0F,0x3A,0x44," #define xmm0_xmm0 "0xC0" #define xmm0_xmm1 "0xC8" #define xmm0_xmm2 "0xD0" #define xmm0_xmm3 "0xD8" #define xmm0_xmm4 "0xE0" #define xmm1_xmm0 "0xC1" #define xmm1_xmm2 "0xD1" /* * AES-NI AES-ECB block en(de)cryption */ int mbedtls_aesni_crypt_ecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ) { asm( "movdqu (%3), %%xmm0 \n\t" // load input "movdqu (%1), %%xmm1 \n\t" // load round key 0 "pxor %%xmm1, %%xmm0 \n\t" // round 0 "add $16, %1 \n\t" // point to next round key "subl $1, %0 \n\t" // normal rounds = nr - 1 "test %2, %2 \n\t" // mode? "jz 2f \n\t" // 0 = decrypt "1: \n\t" // encryption loop "movdqu (%1), %%xmm1 \n\t" // load round key AESENC xmm1_xmm0 "\n\t" // do round "add $16, %1 \n\t" // point to next round key "subl $1, %0 \n\t" // loop "jnz 1b \n\t" "movdqu (%1), %%xmm1 \n\t" // load round key AESENCLAST xmm1_xmm0 "\n\t" // last round "jmp 3f \n\t" "2: \n\t" // decryption loop "movdqu (%1), %%xmm1 \n\t" AESDEC xmm1_xmm0 "\n\t" // do round "add $16, %1 \n\t" "subl $1, %0 \n\t" "jnz 2b \n\t" "movdqu (%1), %%xmm1 \n\t" // load round key AESDECLAST xmm1_xmm0 "\n\t" // last round "3: \n\t" "movdqu %%xmm0, (%4) \n\t" // export output : : "r" (ctx->nr), "r" (ctx->rk), "r" (mode), "r" (input), "r" (output) : "memory", "cc", "xmm0", "xmm1" ); return( 0 ); } /* * GCM multiplication: c = a times b in GF(2^128) * Based on [CLMUL-WP] algorithms 1 (with equation 27) and 5. */ void mbedtls_aesni_gcm_mult( unsigned char c[16], const unsigned char a[16], const unsigned char b[16] ) { unsigned char aa[16], bb[16], cc[16]; size_t i; /* The inputs are in big-endian order, so byte-reverse them */ for( i = 0; i < 16; i++ ) { aa[i] = a[15 - i]; bb[i] = b[15 - i]; } asm( "movdqu (%0), %%xmm0 \n\t" // a1:a0 "movdqu (%1), %%xmm1 \n\t" // b1:b0 /* * Caryless multiplication xmm2:xmm1 = xmm0 * xmm1 * using [CLMUL-WP] algorithm 1 (p. 13). */ "movdqa %%xmm1, %%xmm2 \n\t" // copy of b1:b0 "movdqa %%xmm1, %%xmm3 \n\t" // same "movdqa %%xmm1, %%xmm4 \n\t" // same PCLMULQDQ xmm0_xmm1 ",0x00 \n\t" // a0*b0 = c1:c0 PCLMULQDQ xmm0_xmm2 ",0x11 \n\t" // a1*b1 = d1:d0 PCLMULQDQ xmm0_xmm3 ",0x10 \n\t" // a0*b1 = e1:e0 PCLMULQDQ xmm0_xmm4 ",0x01 \n\t" // a1*b0 = f1:f0 "pxor %%xmm3, %%xmm4 \n\t" // e1+f1:e0+f0 "movdqa %%xmm4, %%xmm3 \n\t" // same "psrldq $8, %%xmm4 \n\t" // 0:e1+f1 "pslldq $8, %%xmm3 \n\t" // e0+f0:0 "pxor %%xmm4, %%xmm2 \n\t" // d1:d0+e1+f1 "pxor %%xmm3, %%xmm1 \n\t" // c1+e0+f1:c0 /* * Now shift the result one bit to the left, * taking advantage of [CLMUL-WP] eq 27 (p. 20) */ "movdqa %%xmm1, %%xmm3 \n\t" // r1:r0 "movdqa %%xmm2, %%xmm4 \n\t" // r3:r2 "psllq $1, %%xmm1 \n\t" // r1<<1:r0<<1 "psllq $1, %%xmm2 \n\t" // r3<<1:r2<<1 "psrlq $63, %%xmm3 \n\t" // r1>>63:r0>>63 "psrlq $63, %%xmm4 \n\t" // r3>>63:r2>>63 "movdqa %%xmm3, %%xmm5 \n\t" // r1>>63:r0>>63 "pslldq $8, %%xmm3 \n\t" // r0>>63:0 "pslldq $8, %%xmm4 \n\t" // r2>>63:0 "psrldq $8, %%xmm5 \n\t" // 0:r1>>63 "por %%xmm3, %%xmm1 \n\t" // r1<<1|r0>>63:r0<<1 "por %%xmm4, %%xmm2 \n\t" // r3<<1|r2>>62:r2<<1 "por %%xmm5, %%xmm2 \n\t" // r3<<1|r2>>62:r2<<1|r1>>63 /* * Now reduce modulo the GCM polynomial x^128 + x^7 + x^2 + x + 1 * using [CLMUL-WP] algorithm 5 (p. 20). * Currently xmm2:xmm1 holds x3:x2:x1:x0 (already shifted). */ /* Step 2 (1) */ "movdqa %%xmm1, %%xmm3 \n\t" // x1:x0 "movdqa %%xmm1, %%xmm4 \n\t" // same "movdqa %%xmm1, %%xmm5 \n\t" // same "psllq $63, %%xmm3 \n\t" // x1<<63:x0<<63 = stuff:a "psllq $62, %%xmm4 \n\t" // x1<<62:x0<<62 = stuff:b "psllq $57, %%xmm5 \n\t" // x1<<57:x0<<57 = stuff:c /* Step 2 (2) */ "pxor %%xmm4, %%xmm3 \n\t" // stuff:a+b "pxor %%xmm5, %%xmm3 \n\t" // stuff:a+b+c "pslldq $8, %%xmm3 \n\t" // a+b+c:0 "pxor %%xmm3, %%xmm1 \n\t" // x1+a+b+c:x0 = d:x0 /* Steps 3 and 4 */ "movdqa %%xmm1,%%xmm0 \n\t" // d:x0 "movdqa %%xmm1,%%xmm4 \n\t" // same "movdqa %%xmm1,%%xmm5 \n\t" // same "psrlq $1, %%xmm0 \n\t" // e1:x0>>1 = e1:e0' "psrlq $2, %%xmm4 \n\t" // f1:x0>>2 = f1:f0' "psrlq $7, %%xmm5 \n\t" // g1:x0>>7 = g1:g0' "pxor %%xmm4, %%xmm0 \n\t" // e1+f1:e0'+f0' "pxor %%xmm5, %%xmm0 \n\t" // e1+f1+g1:e0'+f0'+g0' // e0'+f0'+g0' is almost e0+f0+g0, ex\tcept for some missing // bits carried from d. Now get those\t bits back in. "movdqa %%xmm1,%%xmm3 \n\t" // d:x0 "movdqa %%xmm1,%%xmm4 \n\t" // same "movdqa %%xmm1,%%xmm5 \n\t" // same "psllq $63, %%xmm3 \n\t" // d<<63:stuff "psllq $62, %%xmm4 \n\t" // d<<62:stuff "psllq $57, %%xmm5 \n\t" // d<<57:stuff "pxor %%xmm4, %%xmm3 \n\t" // d<<63+d<<62:stuff "pxor %%xmm5, %%xmm3 \n\t" // missing bits of d:stuff "psrldq $8, %%xmm3 \n\t" // 0:missing bits of d "pxor %%xmm3, %%xmm0 \n\t" // e1+f1+g1:e0+f0+g0 "pxor %%xmm1, %%xmm0 \n\t" // h1:h0 "pxor %%xmm2, %%xmm0 \n\t" // x3+h1:x2+h0 "movdqu %%xmm0, (%2) \n\t" // done : : "r" (aa), "r" (bb), "r" (cc) : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" ); /* Now byte-reverse the outputs */ for( i = 0; i < 16; i++ ) c[i] = cc[15 - i]; return; } /* * Compute decryption round keys from encryption round keys */ void mbedtls_aesni_inverse_key( unsigned char *invkey, const unsigned char *fwdkey, int nr ) { unsigned char *ik = invkey; const unsigned char *fk = fwdkey + 16 * nr; memcpy( ik, fk, 16 ); for( fk -= 16, ik += 16; fk > fwdkey; fk -= 16, ik += 16 ) asm( "movdqu (%0), %%xmm0 \n\t" AESIMC xmm0_xmm0 "\n\t" "movdqu %%xmm0, (%1) \n\t" : : "r" (fk), "r" (ik) : "memory", "xmm0" ); memcpy( ik, fk, 16 ); } /* * Key expansion, 128-bit case */ static void aesni_setkey_enc_128( unsigned char *rk, const unsigned char *key ) { asm( "movdqu (%1), %%xmm0 \n\t" // copy the original key "movdqu %%xmm0, (%0) \n\t" // as round key 0 "jmp 2f \n\t" // skip auxiliary routine /* * Finish generating the next round key. * * On entry xmm0 is r3:r2:r1:r0 and xmm1 is X:stuff:stuff:stuff * with X = rot( sub( r3 ) ) ^ RCON. * * On exit, xmm0 is r7:r6:r5:r4 * with r4 = X + r0, r5 = r4 + r1, r6 = r5 + r2, r7 = r6 + r3 * and those are written to the round key buffer. */ "1: \n\t" "pshufd $0xff, %%xmm1, %%xmm1 \n\t" // X:X:X:X "pxor %%xmm0, %%xmm1 \n\t" // X+r3:X+r2:X+r1:r4 "pslldq $4, %%xmm0 \n\t" // r2:r1:r0:0 "pxor %%xmm0, %%xmm1 \n\t" // X+r3+r2:X+r2+r1:r5:r4 "pslldq $4, %%xmm0 \n\t" // etc "pxor %%xmm0, %%xmm1 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm1, %%xmm0 \n\t" // update xmm0 for next time! "add $16, %0 \n\t" // point to next round key "movdqu %%xmm0, (%0) \n\t" // write it "ret \n\t" /* Main "loop" */ "2: \n\t" AESKEYGENA xmm0_xmm1 ",0x01 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x02 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x04 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x08 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x10 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x20 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x40 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x80 \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x1B \n\tcall 1b \n\t" AESKEYGENA xmm0_xmm1 ",0x36 \n\tcall 1b \n\t" : : "r" (rk), "r" (key) : "memory", "cc", "0" ); } /* * Key expansion, 192-bit case */ static void aesni_setkey_enc_192( unsigned char *rk, const unsigned char *key ) { asm( "movdqu (%1), %%xmm0 \n\t" // copy original round key "movdqu %%xmm0, (%0) \n\t" "add $16, %0 \n\t" "movq 16(%1), %%xmm1 \n\t" "movq %%xmm1, (%0) \n\t" "add $8, %0 \n\t" "jmp 2f \n\t" // skip auxiliary routine /* * Finish generating the next 6 quarter-keys. * * On entry xmm0 is r3:r2:r1:r0, xmm1 is stuff:stuff:r5:r4 * and xmm2 is stuff:stuff:X:stuff with X = rot( sub( r3 ) ) ^ RCON. * * On exit, xmm0 is r9:r8:r7:r6 and xmm1 is stuff:stuff:r11:r10 * and those are written to the round key buffer. */ "1: \n\t" "pshufd $0x55, %%xmm2, %%xmm2 \n\t" // X:X:X:X "pxor %%xmm0, %%xmm2 \n\t" // X+r3:X+r2:X+r1:r4 "pslldq $4, %%xmm0 \n\t" // etc "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm2, %%xmm0 \n\t" // update xmm0 = r9:r8:r7:r6 "movdqu %%xmm0, (%0) \n\t" "add $16, %0 \n\t" "pshufd $0xff, %%xmm0, %%xmm2 \n\t" // r9:r9:r9:r9 "pxor %%xmm1, %%xmm2 \n\t" // stuff:stuff:r9+r5:r10 "pslldq $4, %%xmm1 \n\t" // r2:r1:r0:0 "pxor %%xmm2, %%xmm1 \n\t" // xmm1 = stuff:stuff:r11:r10 "movq %%xmm1, (%0) \n\t" "add $8, %0 \n\t" "ret \n\t" "2: \n\t" AESKEYGENA xmm1_xmm2 ",0x01 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x02 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x04 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x08 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x10 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x20 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x40 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x80 \n\tcall 1b \n\t" : : "r" (rk), "r" (key) : "memory", "cc", "0" ); } /* * Key expansion, 256-bit case */ static void aesni_setkey_enc_256( unsigned char *rk, const unsigned char *key ) { asm( "movdqu (%1), %%xmm0 \n\t" "movdqu %%xmm0, (%0) \n\t" "add $16, %0 \n\t" "movdqu 16(%1), %%xmm1 \n\t" "movdqu %%xmm1, (%0) \n\t" "jmp 2f \n\t" // skip auxiliary routine /* * Finish generating the next two round keys. * * On entry xmm0 is r3:r2:r1:r0, xmm1 is r7:r6:r5:r4 and * xmm2 is X:stuff:stuff:stuff with X = rot( sub( r7 )) ^ RCON * * On exit, xmm0 is r11:r10:r9:r8 and xmm1 is r15:r14:r13:r12 * and those have been written to the output buffer. */ "1: \n\t" "pshufd $0xff, %%xmm2, %%xmm2 \n\t" "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm0, %%xmm2 \n\t" "pslldq $4, %%xmm0 \n\t" "pxor %%xmm2, %%xmm0 \n\t" "add $16, %0 \n\t" "movdqu %%xmm0, (%0) \n\t" /* Set xmm2 to stuff:Y:stuff:stuff with Y = subword( r11 ) * and proceed to generate next round key from there */ AESKEYGENA xmm0_xmm2 ",0x00 \n\t" "pshufd $0xaa, %%xmm2, %%xmm2 \n\t" "pxor %%xmm1, %%xmm2 \n\t" "pslldq $4, %%xmm1 \n\t" "pxor %%xmm1, %%xmm2 \n\t" "pslldq $4, %%xmm1 \n\t" "pxor %%xmm1, %%xmm2 \n\t" "pslldq $4, %%xmm1 \n\t" "pxor %%xmm2, %%xmm1 \n\t" "add $16, %0 \n\t" "movdqu %%xmm1, (%0) \n\t" "ret \n\t" /* * Main "loop" - Generating one more key than necessary, * see definition of mbedtls_aes_context.buf */ "2: \n\t" AESKEYGENA xmm1_xmm2 ",0x01 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x02 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x04 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x08 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x10 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x20 \n\tcall 1b \n\t" AESKEYGENA xmm1_xmm2 ",0x40 \n\tcall 1b \n\t" : : "r" (rk), "r" (key) : "memory", "cc", "0" ); } /* * Key expansion, wrapper */ int mbedtls_aesni_setkey_enc( unsigned char *rk, const unsigned char *key, size_t bits ) { switch( bits ) { case 128: aesni_setkey_enc_128( rk, key ); break; case 192: aesni_setkey_enc_192( rk, key ); break; case 256: aesni_setkey_enc_256( rk, key ); break; default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH ); } return( 0 ); } #endif /* MBEDTLS_HAVE_X86_64 */ #endif /* MBEDTLS_AESNI_C */ fldigi-4.2.05/src/mbedtls/ecdh.c0000664000175000017500000004741314611711171013264 00000000000000/* * Elliptic curve Diffie-Hellman * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * SEC1 http://www.secg.org/index.php?action=secg,docs_secg * RFC 4492 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ECDH_C) #include "mbedtls/ecdh.h" #include "mbedtls/platform_util.h" #include /* Parameter validation macros based on platform_util.h */ #define ECDH_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ECP_BAD_INPUT_DATA ) #define ECDH_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) typedef mbedtls_ecdh_context mbedtls_ecdh_context_mbed; #endif #if !defined(MBEDTLS_ECDH_GEN_PUBLIC_ALT) /* * Generate public key (restartable version) * * Note: this internal function relies on its caller preserving the value of * the output parameter 'd' across continuation calls. This would not be * acceptable for a public function but is OK here as we control call sites. */ static int ecdh_gen_public_restartable( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; /* If multiplication is in progress, we already generated a privkey */ #if defined(MBEDTLS_ECP_RESTARTABLE) if( rs_ctx == NULL || rs_ctx->rsm == NULL ) #endif MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, d, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul_restartable( grp, Q, d, &grp->G, f_rng, p_rng, rs_ctx ) ); cleanup: return( ret ); } /* * Generate public key */ int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDH_VALIDATE_RET( grp != NULL ); ECDH_VALIDATE_RET( d != NULL ); ECDH_VALIDATE_RET( Q != NULL ); ECDH_VALIDATE_RET( f_rng != NULL ); return( ecdh_gen_public_restartable( grp, d, Q, f_rng, p_rng, NULL ) ); } #endif /* !MBEDTLS_ECDH_GEN_PUBLIC_ALT */ #if !defined(MBEDTLS_ECDH_COMPUTE_SHARED_ALT) /* * Compute shared secret (SEC1 3.3.1) */ static int ecdh_compute_shared_restartable( mbedtls_ecp_group *grp, mbedtls_mpi *z, const mbedtls_ecp_point *Q, const mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, mbedtls_ecp_restart_ctx *rs_ctx ) { int ret; mbedtls_ecp_point P; mbedtls_ecp_point_init( &P ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul_restartable( grp, &P, d, Q, f_rng, p_rng, rs_ctx ) ); if( mbedtls_ecp_is_zero( &P ) ) { ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_copy( z, &P.X ) ); cleanup: mbedtls_ecp_point_free( &P ); return( ret ); } /* * Compute shared secret (SEC1 3.3.1) */ int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z, const mbedtls_ecp_point *Q, const mbedtls_mpi *d, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { ECDH_VALIDATE_RET( grp != NULL ); ECDH_VALIDATE_RET( Q != NULL ); ECDH_VALIDATE_RET( d != NULL ); ECDH_VALIDATE_RET( z != NULL ); return( ecdh_compute_shared_restartable( grp, z, Q, d, f_rng, p_rng, NULL ) ); } #endif /* !MBEDTLS_ECDH_COMPUTE_SHARED_ALT */ static void ecdh_init_internal( mbedtls_ecdh_context_mbed *ctx ) { mbedtls_ecp_group_init( &ctx->grp ); mbedtls_mpi_init( &ctx->d ); mbedtls_ecp_point_init( &ctx->Q ); mbedtls_ecp_point_init( &ctx->Qp ); mbedtls_mpi_init( &ctx->z ); #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_init( &ctx->rs ); #endif } /* * Initialize context */ void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx ) { ECDH_VALIDATE( ctx != NULL ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) ecdh_init_internal( ctx ); mbedtls_ecp_point_init( &ctx->Vi ); mbedtls_ecp_point_init( &ctx->Vf ); mbedtls_mpi_init( &ctx->_d ); #else memset( ctx, 0, sizeof( mbedtls_ecdh_context ) ); ctx->var = MBEDTLS_ECDH_VARIANT_NONE; #endif ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; #if defined(MBEDTLS_ECP_RESTARTABLE) ctx->restart_enabled = 0; #endif } static int ecdh_setup_internal( mbedtls_ecdh_context_mbed *ctx, mbedtls_ecp_group_id grp_id ) { int ret; ret = mbedtls_ecp_group_load( &ctx->grp, grp_id ); if( ret != 0 ) { return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ); } return( 0 ); } /* * Setup context */ int mbedtls_ecdh_setup( mbedtls_ecdh_context *ctx, mbedtls_ecp_group_id grp_id ) { ECDH_VALIDATE_RET( ctx != NULL ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_setup_internal( ctx, grp_id ) ); #else switch( grp_id ) { default: ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; ctx->var = MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0; ctx->grp_id = grp_id; ecdh_init_internal( &ctx->ctx.mbed_ecdh ); return( ecdh_setup_internal( &ctx->ctx.mbed_ecdh, grp_id ) ); } #endif } static void ecdh_free_internal( mbedtls_ecdh_context_mbed *ctx ) { mbedtls_ecp_group_free( &ctx->grp ); mbedtls_mpi_free( &ctx->d ); mbedtls_ecp_point_free( &ctx->Q ); mbedtls_ecp_point_free( &ctx->Qp ); mbedtls_mpi_free( &ctx->z ); #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_free( &ctx->rs ); #endif } #if defined(MBEDTLS_ECP_RESTARTABLE) /* * Enable restartable operations for context */ void mbedtls_ecdh_enable_restart( mbedtls_ecdh_context *ctx ) { ECDH_VALIDATE( ctx != NULL ); ctx->restart_enabled = 1; } #endif /* * Free context */ void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx ) { if( ctx == NULL ) return; #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) mbedtls_ecp_point_free( &ctx->Vi ); mbedtls_ecp_point_free( &ctx->Vf ); mbedtls_mpi_free( &ctx->_d ); ecdh_free_internal( ctx ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: ecdh_free_internal( &ctx->ctx.mbed_ecdh ); break; default: break; } ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED; ctx->var = MBEDTLS_ECDH_VARIANT_NONE; ctx->grp_id = MBEDTLS_ECP_DP_NONE; #endif } static int ecdh_make_params_internal( mbedtls_ecdh_context_mbed *ctx, size_t *olen, int point_format, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int restart_enabled ) { int ret; size_t grp_len, pt_len; #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_ctx *rs_ctx = NULL; #endif if( ctx->grp.pbits == 0 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( restart_enabled ) rs_ctx = &ctx->rs; #else (void) restart_enabled; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( ( ret = ecdh_gen_public_restartable( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng, rs_ctx ) ) != 0 ) return( ret ); #else if( ( ret = mbedtls_ecdh_gen_public( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) ) != 0 ) return( ret ); #endif /* MBEDTLS_ECP_RESTARTABLE */ if( ( ret = mbedtls_ecp_tls_write_group( &ctx->grp, &grp_len, buf, blen ) ) != 0 ) return( ret ); buf += grp_len; blen -= grp_len; if( ( ret = mbedtls_ecp_tls_write_point( &ctx->grp, &ctx->Q, point_format, &pt_len, buf, blen ) ) != 0 ) return( ret ); *olen = grp_len + pt_len; return( 0 ); } /* * Setup and write the ServerKeyExhange parameters (RFC 4492) * struct { * ECParameters curve_params; * ECPoint public; * } ServerECDHParams; */ int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int restart_enabled = 0; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( olen != NULL ); ECDH_VALIDATE_RET( buf != NULL ); ECDH_VALIDATE_RET( f_rng != NULL ); #if defined(MBEDTLS_ECP_RESTARTABLE) restart_enabled = ctx->restart_enabled; #else (void) restart_enabled; #endif #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_make_params_internal( ctx, olen, ctx->point_format, buf, blen, f_rng, p_rng, restart_enabled ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_make_params_internal( &ctx->ctx.mbed_ecdh, olen, ctx->point_format, buf, blen, f_rng, p_rng, restart_enabled ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_read_params_internal( mbedtls_ecdh_context_mbed *ctx, const unsigned char **buf, const unsigned char *end ) { return( mbedtls_ecp_tls_read_point( &ctx->grp, &ctx->Qp, buf, end - *buf ) ); } /* * Read the ServerKeyExhange parameters (RFC 4492) * struct { * ECParameters curve_params; * ECPoint public; * } ServerECDHParams; */ int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx, const unsigned char **buf, const unsigned char *end ) { int ret; mbedtls_ecp_group_id grp_id; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( buf != NULL ); ECDH_VALIDATE_RET( *buf != NULL ); ECDH_VALIDATE_RET( end != NULL ); if( ( ret = mbedtls_ecp_tls_read_group_id( &grp_id, buf, end - *buf ) ) != 0 ) return( ret ); if( ( ret = mbedtls_ecdh_setup( ctx, grp_id ) ) != 0 ) return( ret ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_read_params_internal( ctx, buf, end ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_read_params_internal( &ctx->ctx.mbed_ecdh, buf, end ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_get_params_internal( mbedtls_ecdh_context_mbed *ctx, const mbedtls_ecp_keypair *key, mbedtls_ecdh_side side ) { int ret; /* If it's not our key, just import the public part as Qp */ if( side == MBEDTLS_ECDH_THEIRS ) return( mbedtls_ecp_copy( &ctx->Qp, &key->Q ) ); /* Our key: import public (as Q) and private parts */ if( side != MBEDTLS_ECDH_OURS ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); if( ( ret = mbedtls_ecp_copy( &ctx->Q, &key->Q ) ) != 0 || ( ret = mbedtls_mpi_copy( &ctx->d, &key->d ) ) != 0 ) return( ret ); return( 0 ); } /* * Get parameters from a keypair */ int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key, mbedtls_ecdh_side side ) { int ret; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( key != NULL ); ECDH_VALIDATE_RET( side == MBEDTLS_ECDH_OURS || side == MBEDTLS_ECDH_THEIRS ); if( ( ret = mbedtls_ecdh_setup( ctx, key->grp.id ) ) != 0 ) return( ret ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_get_params_internal( ctx, key, side ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_get_params_internal( &ctx->ctx.mbed_ecdh, key, side ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_make_public_internal( mbedtls_ecdh_context_mbed *ctx, size_t *olen, int point_format, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int restart_enabled ) { int ret; #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_ctx *rs_ctx = NULL; #endif if( ctx->grp.pbits == 0 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( restart_enabled ) rs_ctx = &ctx->rs; #else (void) restart_enabled; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( ( ret = ecdh_gen_public_restartable( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng, rs_ctx ) ) != 0 ) return( ret ); #else if( ( ret = mbedtls_ecdh_gen_public( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) ) != 0 ) return( ret ); #endif /* MBEDTLS_ECP_RESTARTABLE */ return mbedtls_ecp_tls_write_point( &ctx->grp, &ctx->Q, point_format, olen, buf, blen ); } /* * Setup and export the client public value */ int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int restart_enabled = 0; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( olen != NULL ); ECDH_VALIDATE_RET( buf != NULL ); ECDH_VALIDATE_RET( f_rng != NULL ); #if defined(MBEDTLS_ECP_RESTARTABLE) restart_enabled = ctx->restart_enabled; #endif #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_make_public_internal( ctx, olen, ctx->point_format, buf, blen, f_rng, p_rng, restart_enabled ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_make_public_internal( &ctx->ctx.mbed_ecdh, olen, ctx->point_format, buf, blen, f_rng, p_rng, restart_enabled ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_read_public_internal( mbedtls_ecdh_context_mbed *ctx, const unsigned char *buf, size_t blen ) { int ret; const unsigned char *p = buf; if( ( ret = mbedtls_ecp_tls_read_point( &ctx->grp, &ctx->Qp, &p, blen ) ) != 0 ) return( ret ); if( (size_t)( p - buf ) != blen ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); return( 0 ); } /* * Parse and import the client's public value */ int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx, const unsigned char *buf, size_t blen ) { ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( buf != NULL ); #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_read_public_internal( ctx, buf, blen ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_read_public_internal( &ctx->ctx.mbed_ecdh, buf, blen ) ); default: return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; } #endif } static int ecdh_calc_secret_internal( mbedtls_ecdh_context_mbed *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, int restart_enabled ) { int ret; #if defined(MBEDTLS_ECP_RESTARTABLE) mbedtls_ecp_restart_ctx *rs_ctx = NULL; #endif if( ctx == NULL || ctx->grp.pbits == 0 ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); #if defined(MBEDTLS_ECP_RESTARTABLE) if( restart_enabled ) rs_ctx = &ctx->rs; #else (void) restart_enabled; #endif #if defined(MBEDTLS_ECP_RESTARTABLE) if( ( ret = ecdh_compute_shared_restartable( &ctx->grp, &ctx->z, &ctx->Qp, &ctx->d, f_rng, p_rng, rs_ctx ) ) != 0 ) { return( ret ); } #else if( ( ret = mbedtls_ecdh_compute_shared( &ctx->grp, &ctx->z, &ctx->Qp, &ctx->d, f_rng, p_rng ) ) != 0 ) { return( ret ); } #endif /* MBEDTLS_ECP_RESTARTABLE */ if( mbedtls_mpi_size( &ctx->z ) > blen ) return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); *olen = ctx->grp.pbits / 8 + ( ( ctx->grp.pbits % 8 ) != 0 ); return mbedtls_mpi_write_binary( &ctx->z, buf, *olen ); } /* * Derive and export the shared secret */ int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen, unsigned char *buf, size_t blen, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int restart_enabled = 0; ECDH_VALIDATE_RET( ctx != NULL ); ECDH_VALIDATE_RET( olen != NULL ); ECDH_VALIDATE_RET( buf != NULL ); #if defined(MBEDTLS_ECP_RESTARTABLE) restart_enabled = ctx->restart_enabled; #endif #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT) return( ecdh_calc_secret_internal( ctx, olen, buf, blen, f_rng, p_rng, restart_enabled ) ); #else switch( ctx->var ) { case MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0: return( ecdh_calc_secret_internal( &ctx->ctx.mbed_ecdh, olen, buf, blen, f_rng, p_rng, restart_enabled ) ); default: return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA ); } #endif } #endif /* MBEDTLS_ECDH_C */ fldigi-4.2.05/src/mbedtls/cmac.c0000664000175000017500000010070114611711171013252 00000000000000/** * \file cmac.c * * \brief NIST SP800-38B compliant CMAC implementation for AES and 3DES * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * * - NIST SP 800-38B Recommendation for Block Cipher Modes of Operation: The * CMAC Mode for Authentication * http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38b.pdf * * - RFC 4493 - The AES-CMAC Algorithm * https://tools.ietf.org/html/rfc4493 * * - RFC 4615 - The Advanced Encryption Standard-Cipher-based Message * Authentication Code-Pseudo-Random Function-128 (AES-CMAC-PRF-128) * Algorithm for the Internet Key Exchange Protocol (IKE) * https://tools.ietf.org/html/rfc4615 * * Additional test vectors: ISO/IEC 9797-1 * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_CMAC_C) #include "mbedtls/cmac.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #if defined(MBEDTLS_SELF_TEST) #include #define mbedtls_printf printf #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_PLATFORM_C */ #if !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) /* * Multiplication by u in the Galois field of GF(2^n) * * As explained in NIST SP 800-38B, this can be computed: * * If MSB(p) = 0, then p = (p << 1) * If MSB(p) = 1, then p = (p << 1) ^ R_n * with R_64 = 0x1B and R_128 = 0x87 * * Input and output MUST NOT point to the same buffer * Block size must be 8 bytes or 16 bytes - the block sizes for DES and AES. */ static int cmac_multiply_by_u( unsigned char *output, const unsigned char *input, size_t blocksize ) { const unsigned char R_128 = 0x87; const unsigned char R_64 = 0x1B; unsigned char R_n, mask; unsigned char overflow = 0x00; int i; if( blocksize == MBEDTLS_AES_BLOCK_SIZE ) { R_n = R_128; } else if( blocksize == MBEDTLS_DES3_BLOCK_SIZE ) { R_n = R_64; } else { return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } for( i = (int)blocksize - 1; i >= 0; i-- ) { output[i] = input[i] << 1 | overflow; overflow = input[i] >> 7; } /* mask = ( input[0] >> 7 ) ? 0xff : 0x00 * using bit operations to avoid branches */ /* MSVC has a warning about unary minus on unsigned, but this is * well-defined and precisely what we want to do here */ #if defined(_MSC_VER) #pragma warning( push ) #pragma warning( disable : 4146 ) #endif mask = - ( input[0] >> 7 ); #if defined(_MSC_VER) #pragma warning( pop ) #endif output[ blocksize - 1 ] ^= R_n & mask; return( 0 ); } /* * Generate subkeys * * - as specified by RFC 4493, section 2.3 Subkey Generation Algorithm */ static int cmac_generate_subkeys( mbedtls_cipher_context_t *ctx, unsigned char* K1, unsigned char* K2 ) { int ret; unsigned char L[MBEDTLS_CIPHER_BLKSIZE_MAX]; size_t olen, block_size; mbedtls_platform_zeroize( L, sizeof( L ) ); block_size = ctx->cipher_info->block_size; /* Calculate Ek(0) */ if( ( ret = mbedtls_cipher_update( ctx, L, block_size, L, &olen ) ) != 0 ) goto exit; /* * Generate K1 and K2 */ if( ( ret = cmac_multiply_by_u( K1, L , block_size ) ) != 0 ) goto exit; if( ( ret = cmac_multiply_by_u( K2, K1 , block_size ) ) != 0 ) goto exit; exit: mbedtls_platform_zeroize( L, sizeof( L ) ); return( ret ); } #endif /* !defined(MBEDTLS_CMAC_ALT) || defined(MBEDTLS_SELF_TEST) */ #if !defined(MBEDTLS_CMAC_ALT) static void cmac_xor_block( unsigned char *output, const unsigned char *input1, const unsigned char *input2, const size_t block_size ) { size_t idx; for( idx = 0; idx < block_size; idx++ ) output[ idx ] = input1[ idx ] ^ input2[ idx ]; } /* * Create padded last block from (partial) last block. * * We can't use the padding option from the cipher layer, as it only works for * CBC and we use ECB mode, and anyway we need to XOR K1 or K2 in addition. */ static void cmac_pad( unsigned char padded_block[MBEDTLS_CIPHER_BLKSIZE_MAX], size_t padded_block_len, const unsigned char *last_block, size_t last_block_len ) { size_t j; for( j = 0; j < padded_block_len; j++ ) { if( j < last_block_len ) padded_block[j] = last_block[j]; else if( j == last_block_len ) padded_block[j] = 0x80; else padded_block[j] = 0x00; } } int mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx, const unsigned char *key, size_t keybits ) { mbedtls_cipher_type_t type; mbedtls_cmac_context_t *cmac_ctx; int retval; if( ctx == NULL || ctx->cipher_info == NULL || key == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); if( ( retval = mbedtls_cipher_setkey( ctx, key, (int)keybits, MBEDTLS_ENCRYPT ) ) != 0 ) return( retval ); type = ctx->cipher_info->type; switch( type ) { case MBEDTLS_CIPHER_AES_128_ECB: case MBEDTLS_CIPHER_AES_192_ECB: case MBEDTLS_CIPHER_AES_256_ECB: case MBEDTLS_CIPHER_DES_EDE3_ECB: break; default: return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); } /* Allocated and initialise in the cipher context memory for the CMAC * context */ cmac_ctx = mbedtls_calloc( 1, sizeof( mbedtls_cmac_context_t ) ); if( cmac_ctx == NULL ) return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED ); ctx->cmac_ctx = cmac_ctx; mbedtls_platform_zeroize( cmac_ctx->state, sizeof( cmac_ctx->state ) ); return 0; } int mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, size_t ilen ) { mbedtls_cmac_context_t* cmac_ctx; unsigned char *state; int ret = 0; size_t n, j, olen, block_size; if( ctx == NULL || ctx->cipher_info == NULL || input == NULL || ctx->cmac_ctx == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); cmac_ctx = ctx->cmac_ctx; block_size = ctx->cipher_info->block_size; state = ctx->cmac_ctx->state; /* Is there data still to process from the last call, that's greater in * size than a block? */ if( cmac_ctx->unprocessed_len > 0 && ilen > block_size - cmac_ctx->unprocessed_len ) { memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len], input, block_size - cmac_ctx->unprocessed_len ); cmac_xor_block( state, cmac_ctx->unprocessed_block, state, block_size ); if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state, &olen ) ) != 0 ) { goto exit; } input += block_size - cmac_ctx->unprocessed_len; ilen -= block_size - cmac_ctx->unprocessed_len; cmac_ctx->unprocessed_len = 0; } /* n is the number of blocks including any final partial block */ n = ( ilen + block_size - 1 ) / block_size; /* Iterate across the input data in block sized chunks, excluding any * final partial or complete block */ for( j = 1; j < n; j++ ) { cmac_xor_block( state, input, state, block_size ); if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state, &olen ) ) != 0 ) goto exit; ilen -= block_size; input += block_size; } /* If there is data left over that wasn't aligned to a block */ if( ilen > 0 ) { memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len], input, ilen ); cmac_ctx->unprocessed_len += ilen; } exit: return( ret ); } int mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx, unsigned char *output ) { mbedtls_cmac_context_t* cmac_ctx; unsigned char *state, *last_block; unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX]; unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX]; unsigned char M_last[MBEDTLS_CIPHER_BLKSIZE_MAX]; int ret; size_t olen, block_size; if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL || output == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); cmac_ctx = ctx->cmac_ctx; block_size = ctx->cipher_info->block_size; state = cmac_ctx->state; mbedtls_platform_zeroize( K1, sizeof( K1 ) ); mbedtls_platform_zeroize( K2, sizeof( K2 ) ); cmac_generate_subkeys( ctx, K1, K2 ); last_block = cmac_ctx->unprocessed_block; /* Calculate last block */ if( cmac_ctx->unprocessed_len < block_size ) { cmac_pad( M_last, block_size, last_block, cmac_ctx->unprocessed_len ); cmac_xor_block( M_last, M_last, K2, block_size ); } else { /* Last block is complete block */ cmac_xor_block( M_last, last_block, K1, block_size ); } cmac_xor_block( state, M_last, state, block_size ); if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state, &olen ) ) != 0 ) { goto exit; } memcpy( output, state, block_size ); exit: /* Wipe the generated keys on the stack, and any other transients to avoid * side channel leakage */ mbedtls_platform_zeroize( K1, sizeof( K1 ) ); mbedtls_platform_zeroize( K2, sizeof( K2 ) ); cmac_ctx->unprocessed_len = 0; mbedtls_platform_zeroize( cmac_ctx->unprocessed_block, sizeof( cmac_ctx->unprocessed_block ) ); mbedtls_platform_zeroize( state, MBEDTLS_CIPHER_BLKSIZE_MAX ); return( ret ); } int mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx ) { mbedtls_cmac_context_t* cmac_ctx; if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); cmac_ctx = ctx->cmac_ctx; /* Reset the internal state */ cmac_ctx->unprocessed_len = 0; mbedtls_platform_zeroize( cmac_ctx->unprocessed_block, sizeof( cmac_ctx->unprocessed_block ) ); mbedtls_platform_zeroize( cmac_ctx->state, sizeof( cmac_ctx->state ) ); return( 0 ); } int mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info, const unsigned char *key, size_t keylen, const unsigned char *input, size_t ilen, unsigned char *output ) { mbedtls_cipher_context_t ctx; int ret; if( cipher_info == NULL || key == NULL || input == NULL || output == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); mbedtls_cipher_init( &ctx ); if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 ) goto exit; ret = mbedtls_cipher_cmac_starts( &ctx, key, keylen ); if( ret != 0 ) goto exit; ret = mbedtls_cipher_cmac_update( &ctx, input, ilen ); if( ret != 0 ) goto exit; ret = mbedtls_cipher_cmac_finish( &ctx, output ); exit: mbedtls_cipher_free( &ctx ); return( ret ); } #if defined(MBEDTLS_AES_C) /* * Implementation of AES-CMAC-PRF-128 defined in RFC 4615 */ int mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_length, const unsigned char *input, size_t in_len, unsigned char *output ) { int ret; const mbedtls_cipher_info_t *cipher_info; unsigned char zero_key[MBEDTLS_AES_BLOCK_SIZE]; unsigned char int_key[MBEDTLS_AES_BLOCK_SIZE]; if( key == NULL || input == NULL || output == NULL ) return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ); cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB ); if( cipher_info == NULL ) { /* Failing at this point must be due to a build issue */ ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; goto exit; } if( key_length == MBEDTLS_AES_BLOCK_SIZE ) { /* Use key as is */ memcpy( int_key, key, MBEDTLS_AES_BLOCK_SIZE ); } else { memset( zero_key, 0, MBEDTLS_AES_BLOCK_SIZE ); ret = mbedtls_cipher_cmac( cipher_info, zero_key, 128, key, key_length, int_key ); if( ret != 0 ) goto exit; } ret = mbedtls_cipher_cmac( cipher_info, int_key, 128, input, in_len, output ); exit: mbedtls_platform_zeroize( int_key, sizeof( int_key ) ); return( ret ); } #endif /* MBEDTLS_AES_C */ #endif /* !MBEDTLS_CMAC_ALT */ #if defined(MBEDTLS_SELF_TEST) /* * CMAC test data for SP800-38B * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CMAC.pdf * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TDES_CMAC.pdf * * AES-CMAC-PRF-128 test data from RFC 4615 * https://tools.ietf.org/html/rfc4615#page-4 */ #define NB_CMAC_TESTS_PER_KEY 4 #define NB_PRF_TESTS 3 #if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) /* All CMAC test inputs are truncated from the same 64 byte buffer. */ static const unsigned char test_message[] = { /* PT */ 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 }; #endif /* MBEDTLS_AES_C || MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) /* Truncation point of message for AES CMAC tests */ static const unsigned int aes_message_lengths[NB_CMAC_TESTS_PER_KEY] = { /* Mlen */ 0, 16, 20, 64 }; /* CMAC-AES128 Test Data */ static const unsigned char aes_128_key[16] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }; static const unsigned char aes_128_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = { { /* K1 */ 0xfb, 0xee, 0xd6, 0x18, 0x35, 0x71, 0x33, 0x66, 0x7c, 0x85, 0xe0, 0x8f, 0x72, 0x36, 0xa8, 0xde }, { /* K2 */ 0xf7, 0xdd, 0xac, 0x30, 0x6a, 0xe2, 0x66, 0xcc, 0xf9, 0x0b, 0xc1, 0x1e, 0xe4, 0x6d, 0x51, 0x3b } }; static const unsigned char aes_128_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = { { /* Example #1 */ 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28, 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46 }, { /* Example #2 */ 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44, 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c }, { /* Example #3 */ 0x7d, 0x85, 0x44, 0x9e, 0xa6, 0xea, 0x19, 0xc8, 0x23, 0xa7, 0xbf, 0x78, 0x83, 0x7d, 0xfa, 0xde }, { /* Example #4 */ 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92, 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe } }; /* CMAC-AES192 Test Data */ static const unsigned char aes_192_key[24] = { 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b }; static const unsigned char aes_192_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = { { /* K1 */ 0x44, 0x8a, 0x5b, 0x1c, 0x93, 0x51, 0x4b, 0x27, 0x3e, 0xe6, 0x43, 0x9d, 0xd4, 0xda, 0xa2, 0x96 }, { /* K2 */ 0x89, 0x14, 0xb6, 0x39, 0x26, 0xa2, 0x96, 0x4e, 0x7d, 0xcc, 0x87, 0x3b, 0xa9, 0xb5, 0x45, 0x2c } }; static const unsigned char aes_192_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = { { /* Example #1 */ 0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5, 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67 }, { /* Example #2 */ 0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90, 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84 }, { /* Example #3 */ 0x3d, 0x75, 0xc1, 0x94, 0xed, 0x96, 0x07, 0x04, 0x44, 0xa9, 0xfa, 0x7e, 0xc7, 0x40, 0xec, 0xf8 }, { /* Example #4 */ 0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79, 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11 } }; /* CMAC-AES256 Test Data */ static const unsigned char aes_256_key[32] = { 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 }; static const unsigned char aes_256_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = { { /* K1 */ 0xca, 0xd1, 0xed, 0x03, 0x29, 0x9e, 0xed, 0xac, 0x2e, 0x9a, 0x99, 0x80, 0x86, 0x21, 0x50, 0x2f }, { /* K2 */ 0x95, 0xa3, 0xda, 0x06, 0x53, 0x3d, 0xdb, 0x58, 0x5d, 0x35, 0x33, 0x01, 0x0c, 0x42, 0xa0, 0xd9 } }; static const unsigned char aes_256_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = { { /* Example #1 */ 0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e, 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83 }, { /* Example #2 */ 0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82, 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c }, { /* Example #3 */ 0x15, 0x67, 0x27, 0xdc, 0x08, 0x78, 0x94, 0x4a, 0x02, 0x3c, 0x1f, 0xe0, 0x3b, 0xad, 0x6d, 0x93 }, { /* Example #4 */ 0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5, 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10 } }; #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_DES_C) /* Truncation point of message for 3DES CMAC tests */ static const unsigned int des3_message_lengths[NB_CMAC_TESTS_PER_KEY] = { 0, 16, 20, 32 }; /* CMAC-TDES (Generation) - 2 Key Test Data */ static const unsigned char des3_2key_key[24] = { /* Key1 */ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, /* Key2 */ 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xEF, 0x01, /* Key3 */ 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; static const unsigned char des3_2key_subkeys[2][8] = { { /* K1 */ 0x0d, 0xd2, 0xcb, 0x7a, 0x3d, 0x88, 0x88, 0xd9 }, { /* K2 */ 0x1b, 0xa5, 0x96, 0xf4, 0x7b, 0x11, 0x11, 0xb2 } }; static const unsigned char des3_2key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = { { /* Sample #1 */ 0x79, 0xce, 0x52, 0xa7, 0xf7, 0x86, 0xa9, 0x60 }, { /* Sample #2 */ 0xcc, 0x18, 0xa0, 0xb7, 0x9a, 0xf2, 0x41, 0x3b }, { /* Sample #3 */ 0xc0, 0x6d, 0x37, 0x7e, 0xcd, 0x10, 0x19, 0x69 }, { /* Sample #4 */ 0x9c, 0xd3, 0x35, 0x80, 0xf9, 0xb6, 0x4d, 0xfb } }; /* CMAC-TDES (Generation) - 3 Key Test Data */ static const unsigned char des3_3key_key[24] = { /* Key1 */ 0x01, 0x23, 0x45, 0x67, 0x89, 0xaa, 0xcd, 0xef, /* Key2 */ 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, /* Key3 */ 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23 }; static const unsigned char des3_3key_subkeys[2][8] = { { /* K1 */ 0x9d, 0x74, 0xe7, 0x39, 0x33, 0x17, 0x96, 0xc0 }, { /* K2 */ 0x3a, 0xe9, 0xce, 0x72, 0x66, 0x2f, 0x2d, 0x9b } }; static const unsigned char des3_3key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = { { /* Sample #1 */ 0x7d, 0xb0, 0xd3, 0x7d, 0xf9, 0x36, 0xc5, 0x50 }, { /* Sample #2 */ 0x30, 0x23, 0x9c, 0xf1, 0xf5, 0x2e, 0x66, 0x09 }, { /* Sample #3 */ 0x6c, 0x9f, 0x3e, 0xe4, 0x92, 0x3f, 0x6b, 0xe2 }, { /* Sample #4 */ 0x99, 0x42, 0x9b, 0xd0, 0xbF, 0x79, 0x04, 0xe5 } }; #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) /* AES AES-CMAC-PRF-128 Test Data */ static const unsigned char PRFK[] = { /* Key */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0xed, 0xcb }; /* Sizes in bytes */ static const size_t PRFKlen[NB_PRF_TESTS] = { 18, 16, 10 }; /* Message */ static const unsigned char PRFM[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13 }; static const unsigned char PRFT[NB_PRF_TESTS][16] = { { 0x84, 0xa3, 0x48, 0xa4, 0xa4, 0x5d, 0x23, 0x5b, 0xab, 0xff, 0xfc, 0x0d, 0x2b, 0x4d, 0xa0, 0x9a }, { 0x98, 0x0a, 0xe8, 0x7b, 0x5f, 0x4c, 0x9c, 0x52, 0x14, 0xf5, 0xb6, 0xa8, 0x45, 0x5e, 0x4c, 0x2d }, { 0x29, 0x0d, 0x9e, 0x11, 0x2e, 0xdb, 0x09, 0xee, 0x14, 0x1f, 0xcf, 0x64, 0xc0, 0xb7, 0x2f, 0x3d } }; #endif /* MBEDTLS_AES_C */ static int cmac_test_subkeys( int verbose, const char* testname, const unsigned char* key, int keybits, const unsigned char* subkeys, mbedtls_cipher_type_t cipher_type, int block_size, int num_tests ) { int i, ret = 0; mbedtls_cipher_context_t ctx; const mbedtls_cipher_info_t *cipher_info; unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX]; unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX]; cipher_info = mbedtls_cipher_info_from_type( cipher_type ); if( cipher_info == NULL ) { /* Failing at this point must be due to a build issue */ return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ); } for( i = 0; i < num_tests; i++ ) { if( verbose != 0 ) mbedtls_printf( " %s CMAC subkey #%u: ", testname, i + 1 ); mbedtls_cipher_init( &ctx ); if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "test execution failed\n" ); goto cleanup; } if( ( ret = mbedtls_cipher_setkey( &ctx, key, keybits, MBEDTLS_ENCRYPT ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "test execution failed\n" ); goto cleanup; } ret = cmac_generate_subkeys( &ctx, K1, K2 ); if( ret != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); goto cleanup; } if( ( ret = memcmp( K1, subkeys, block_size ) ) != 0 || ( ret = memcmp( K2, &subkeys[block_size], block_size ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); goto cleanup; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); mbedtls_cipher_free( &ctx ); } ret = 0; goto exit; cleanup: mbedtls_cipher_free( &ctx ); exit: return( ret ); } static int cmac_test_wth_cipher( int verbose, const char* testname, const unsigned char* key, int keybits, const unsigned char* messages, const unsigned int message_lengths[4], const unsigned char* expected_result, mbedtls_cipher_type_t cipher_type, int block_size, int num_tests ) { const mbedtls_cipher_info_t *cipher_info; int i, ret = 0; unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX]; cipher_info = mbedtls_cipher_info_from_type( cipher_type ); if( cipher_info == NULL ) { /* Failing at this point must be due to a build issue */ ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE; goto exit; } for( i = 0; i < num_tests; i++ ) { if( verbose != 0 ) mbedtls_printf( " %s CMAC #%u: ", testname, i + 1 ); if( ( ret = mbedtls_cipher_cmac( cipher_info, key, keybits, messages, message_lengths[i], output ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); goto exit; } if( ( ret = memcmp( output, &expected_result[i * block_size], block_size ) ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); goto exit; } if( verbose != 0 ) mbedtls_printf( "passed\n" ); } ret = 0; exit: return( ret ); } #if defined(MBEDTLS_AES_C) static int test_aes128_cmac_prf( int verbose ) { int i; int ret; unsigned char output[MBEDTLS_AES_BLOCK_SIZE]; for( i = 0; i < NB_PRF_TESTS; i++ ) { mbedtls_printf( " AES CMAC 128 PRF #%u: ", i ); ret = mbedtls_aes_cmac_prf_128( PRFK, PRFKlen[i], PRFM, 20, output ); if( ret != 0 || memcmp( output, PRFT[i], MBEDTLS_AES_BLOCK_SIZE ) != 0 ) { if( verbose != 0 ) mbedtls_printf( "failed\n" ); return( ret ); } else if( verbose != 0 ) { mbedtls_printf( "passed\n" ); } } return( ret ); } #endif /* MBEDTLS_AES_C */ int mbedtls_cmac_self_test( int verbose ) { int ret; #if defined(MBEDTLS_AES_C) /* AES-128 */ if( ( ret = cmac_test_subkeys( verbose, "AES 128", aes_128_key, 128, (const unsigned char*)aes_128_subkeys, MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher( verbose, "AES 128", aes_128_key, 128, test_message, aes_message_lengths, (const unsigned char*)aes_128_expected_result, MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } /* AES-192 */ if( ( ret = cmac_test_subkeys( verbose, "AES 192", aes_192_key, 192, (const unsigned char*)aes_192_subkeys, MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher( verbose, "AES 192", aes_192_key, 192, test_message, aes_message_lengths, (const unsigned char*)aes_192_expected_result, MBEDTLS_CIPHER_AES_192_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } /* AES-256 */ if( ( ret = cmac_test_subkeys( verbose, "AES 256", aes_256_key, 256, (const unsigned char*)aes_256_subkeys, MBEDTLS_CIPHER_AES_256_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher ( verbose, "AES 256", aes_256_key, 256, test_message, aes_message_lengths, (const unsigned char*)aes_256_expected_result, MBEDTLS_CIPHER_AES_256_ECB, MBEDTLS_AES_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } #endif /* MBEDTLS_AES_C */ #if defined(MBEDTLS_DES_C) /* 3DES 2 key */ if( ( ret = cmac_test_subkeys( verbose, "3DES 2 key", des3_2key_key, 192, (const unsigned char*)des3_2key_subkeys, MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_DES3_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher( verbose, "3DES 2 key", des3_2key_key, 192, test_message, des3_message_lengths, (const unsigned char*)des3_2key_expected_result, MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_DES3_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } /* 3DES 3 key */ if( ( ret = cmac_test_subkeys( verbose, "3DES 3 key", des3_3key_key, 192, (const unsigned char*)des3_3key_subkeys, MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_DES3_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } if( ( ret = cmac_test_wth_cipher( verbose, "3DES 3 key", des3_3key_key, 192, test_message, des3_message_lengths, (const unsigned char*)des3_3key_expected_result, MBEDTLS_CIPHER_DES_EDE3_ECB, MBEDTLS_DES3_BLOCK_SIZE, NB_CMAC_TESTS_PER_KEY ) ) != 0 ) { return( ret ); } #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) if( ( ret = test_aes128_cmac_prf( verbose ) ) != 0 ) return( ret ); #endif /* MBEDTLS_AES_C */ if( verbose != 0 ) mbedtls_printf( "\n" ); return( 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_CMAC_C */ fldigi-4.2.05/src/mbedtls/LICENSE0000664000175000017500000000026414611711171013213 00000000000000This package of mbed TLS is specifically licensed under the GPL 2.0, as can be found in: gpl-2.0.txt For latest library source and more information visit https://tls.mbed.org/ fldigi-4.2.05/src/mbedtls/entropy.c0000664000175000017500000005064514611711171014062 00000000000000/* * Entropy accumulator implementation * * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_ENTROPY_C) #if defined(MBEDTLS_TEST_NULL_ENTROPY) #warning "**** WARNING! MBEDTLS_TEST_NULL_ENTROPY defined! " #warning "**** THIS BUILD HAS NO DEFINED ENTROPY SOURCES " #warning "**** THIS BUILD IS *NOT* SUITABLE FOR PRODUCTION USE " #endif #include "mbedtls/entropy.h" #include "mbedtls/entropy_poll.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_FS_IO) #include #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) #include "mbedtls/platform.h" #endif #if defined(MBEDTLS_SELF_TEST) #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_printf printf #endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #if defined(MBEDTLS_HAVEGE_C) #include "mbedtls/havege.h" #endif #define ENTROPY_MAX_LOOP 256 /**< Maximum amount to loop before error */ void mbedtls_entropy_init( mbedtls_entropy_context *ctx ) { ctx->source_count = 0; memset( ctx->source, 0, sizeof( ctx->source ) ); #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_init( &ctx->mutex ); #endif ctx->accumulator_started = 0; #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) mbedtls_sha512_init( &ctx->accumulator ); #else mbedtls_sha256_init( &ctx->accumulator ); #endif #if defined(MBEDTLS_HAVEGE_C) mbedtls_havege_init( &ctx->havege_data ); #endif /* Reminder: Update ENTROPY_HAVE_STRONG in the test files * when adding more strong entropy sources here. */ #if defined(MBEDTLS_TEST_NULL_ENTROPY) mbedtls_entropy_add_source( ctx, mbedtls_null_entropy_poll, NULL, 1, MBEDTLS_ENTROPY_SOURCE_STRONG ); #endif #if !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) mbedtls_entropy_add_source( ctx, mbedtls_platform_entropy_poll, NULL, MBEDTLS_ENTROPY_MIN_PLATFORM, MBEDTLS_ENTROPY_SOURCE_STRONG ); #endif #if defined(MBEDTLS_TIMING_C) mbedtls_entropy_add_source( ctx, mbedtls_hardclock_poll, NULL, MBEDTLS_ENTROPY_MIN_HARDCLOCK, MBEDTLS_ENTROPY_SOURCE_WEAK ); #endif #if defined(MBEDTLS_HAVEGE_C) mbedtls_entropy_add_source( ctx, mbedtls_havege_poll, &ctx->havege_data, MBEDTLS_ENTROPY_MIN_HAVEGE, MBEDTLS_ENTROPY_SOURCE_STRONG ); #endif #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) mbedtls_entropy_add_source( ctx, mbedtls_hardware_poll, NULL, MBEDTLS_ENTROPY_MIN_HARDWARE, MBEDTLS_ENTROPY_SOURCE_STRONG ); #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) mbedtls_entropy_add_source( ctx, mbedtls_nv_seed_poll, NULL, MBEDTLS_ENTROPY_BLOCK_SIZE, MBEDTLS_ENTROPY_SOURCE_STRONG ); ctx->initial_entropy_run = 0; #endif #endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */ } void mbedtls_entropy_free( mbedtls_entropy_context *ctx ) { #if defined(MBEDTLS_HAVEGE_C) mbedtls_havege_free( &ctx->havege_data ); #endif #if defined(MBEDTLS_THREADING_C) mbedtls_mutex_free( &ctx->mutex ); #endif #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) mbedtls_sha512_free( &ctx->accumulator ); #else mbedtls_sha256_free( &ctx->accumulator ); #endif #if defined(MBEDTLS_ENTROPY_NV_SEED) ctx->initial_entropy_run = 0; #endif ctx->source_count = 0; mbedtls_platform_zeroize( ctx->source, sizeof( ctx->source ) ); ctx->accumulator_started = 0; } int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx, mbedtls_entropy_f_source_ptr f_source, void *p_source, size_t threshold, int strong ) { int idx, ret = 0; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif idx = ctx->source_count; if( idx >= MBEDTLS_ENTROPY_MAX_SOURCES ) { ret = MBEDTLS_ERR_ENTROPY_MAX_SOURCES; goto exit; } ctx->source[idx].f_source = f_source; ctx->source[idx].p_source = p_source; ctx->source[idx].threshold = threshold; ctx->source[idx].strong = strong; ctx->source_count++; exit: #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Entropy accumulator update */ static int entropy_update( mbedtls_entropy_context *ctx, unsigned char source_id, const unsigned char *data, size_t len ) { unsigned char header[2]; unsigned char tmp[MBEDTLS_ENTROPY_BLOCK_SIZE]; size_t use_len = len; const unsigned char *p = data; int ret = 0; if( use_len > MBEDTLS_ENTROPY_BLOCK_SIZE ) { #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) if( ( ret = mbedtls_sha512_ret( data, len, tmp, 0 ) ) != 0 ) goto cleanup; #else if( ( ret = mbedtls_sha256_ret( data, len, tmp, 0 ) ) != 0 ) goto cleanup; #endif p = tmp; use_len = MBEDTLS_ENTROPY_BLOCK_SIZE; } header[0] = source_id; header[1] = use_len & 0xFF; /* * Start the accumulator if this has not already happened. Note that * it is sufficient to start the accumulator here only because all calls to * gather entropy eventually execute this code. */ #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) if( ctx->accumulator_started == 0 && ( ret = mbedtls_sha512_starts_ret( &ctx->accumulator, 0 ) ) != 0 ) goto cleanup; else ctx->accumulator_started = 1; if( ( ret = mbedtls_sha512_update_ret( &ctx->accumulator, header, 2 ) ) != 0 ) goto cleanup; ret = mbedtls_sha512_update_ret( &ctx->accumulator, p, use_len ); #else if( ctx->accumulator_started == 0 && ( ret = mbedtls_sha256_starts_ret( &ctx->accumulator, 0 ) ) != 0 ) goto cleanup; else ctx->accumulator_started = 1; if( ( ret = mbedtls_sha256_update_ret( &ctx->accumulator, header, 2 ) ) != 0 ) goto cleanup; ret = mbedtls_sha256_update_ret( &ctx->accumulator, p, use_len ); #endif cleanup: mbedtls_platform_zeroize( tmp, sizeof( tmp ) ); return( ret ); } int mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx, const unsigned char *data, size_t len ) { int ret; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif ret = entropy_update( ctx, MBEDTLS_ENTROPY_SOURCE_MANUAL, data, len ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } /* * Run through the different sources to add entropy to our accumulator */ static int entropy_gather_internal( mbedtls_entropy_context *ctx ) { int ret, i, have_one_strong = 0; unsigned char buf[MBEDTLS_ENTROPY_MAX_GATHER]; size_t olen; if( ctx->source_count == 0 ) return( MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED ); /* * Run through our entropy sources */ for( i = 0; i < ctx->source_count; i++ ) { if( ctx->source[i].strong == MBEDTLS_ENTROPY_SOURCE_STRONG ) have_one_strong = 1; olen = 0; if( ( ret = ctx->source[i].f_source( ctx->source[i].p_source, buf, MBEDTLS_ENTROPY_MAX_GATHER, &olen ) ) != 0 ) { goto cleanup; } /* * Add if we actually gathered something */ if( olen > 0 ) { if( ( ret = entropy_update( ctx, (unsigned char) i, buf, olen ) ) != 0 ) return( ret ); ctx->source[i].size += olen; } } if( have_one_strong == 0 ) ret = MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE; cleanup: mbedtls_platform_zeroize( buf, sizeof( buf ) ); return( ret ); } /* * Thread-safe wrapper for entropy_gather_internal() */ int mbedtls_entropy_gather( mbedtls_entropy_context *ctx ) { int ret; #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif ret = entropy_gather_internal( ctx ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } int mbedtls_entropy_func( void *data, unsigned char *output, size_t len ) { int ret, count = 0, i, done; mbedtls_entropy_context *ctx = (mbedtls_entropy_context *) data; unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; if( len > MBEDTLS_ENTROPY_BLOCK_SIZE ) return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED ); #if defined(MBEDTLS_ENTROPY_NV_SEED) /* Update the NV entropy seed before generating any entropy for outside * use. */ if( ctx->initial_entropy_run == 0 ) { ctx->initial_entropy_run = 1; if( ( ret = mbedtls_entropy_update_nv_seed( ctx ) ) != 0 ) return( ret ); } #endif #if defined(MBEDTLS_THREADING_C) if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 ) return( ret ); #endif /* * Always gather extra entropy before a call */ do { if( count++ > ENTROPY_MAX_LOOP ) { ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; goto exit; } if( ( ret = entropy_gather_internal( ctx ) ) != 0 ) goto exit; done = 1; for( i = 0; i < ctx->source_count; i++ ) if( ctx->source[i].size < ctx->source[i].threshold ) done = 0; } while( ! done ); memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE ); #if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) /* * Note that at this stage it is assumed that the accumulator was started * in a previous call to entropy_update(). If this is not guaranteed, the * code below will fail. */ if( ( ret = mbedtls_sha512_finish_ret( &ctx->accumulator, buf ) ) != 0 ) goto exit; /* * Reset accumulator and counters and recycle existing entropy */ mbedtls_sha512_free( &ctx->accumulator ); mbedtls_sha512_init( &ctx->accumulator ); if( ( ret = mbedtls_sha512_starts_ret( &ctx->accumulator, 0 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha512_update_ret( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 ) goto exit; /* * Perform second SHA-512 on entropy */ if( ( ret = mbedtls_sha512_ret( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 ) ) != 0 ) goto exit; #else /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */ if( ( ret = mbedtls_sha256_finish_ret( &ctx->accumulator, buf ) ) != 0 ) goto exit; /* * Reset accumulator and counters and recycle existing entropy */ mbedtls_sha256_free( &ctx->accumulator ); mbedtls_sha256_init( &ctx->accumulator ); if( ( ret = mbedtls_sha256_starts_ret( &ctx->accumulator, 0 ) ) != 0 ) goto exit; if( ( ret = mbedtls_sha256_update_ret( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 ) goto exit; /* * Perform second SHA-256 on entropy */ if( ( ret = mbedtls_sha256_ret( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 ) ) != 0 ) goto exit; #endif /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */ for( i = 0; i < ctx->source_count; i++ ) ctx->source[i].size = 0; memcpy( output, buf, len ); ret = 0; exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); #if defined(MBEDTLS_THREADING_C) if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 ) return( MBEDTLS_ERR_THREADING_MUTEX_ERROR ); #endif return( ret ); } #if defined(MBEDTLS_ENTROPY_NV_SEED) int mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx ) { int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; /* Read new seed and write it to NV */ if( ( ret = mbedtls_entropy_func( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 ) return( ret ); if( mbedtls_nv_seed_write( buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) < 0 ) return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR ); /* Manually update the remaining stream with a separator value to diverge */ memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE ); ret = mbedtls_entropy_update_manual( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ); return( ret ); } #endif /* MBEDTLS_ENTROPY_NV_SEED */ #if defined(MBEDTLS_FS_IO) int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path ) { int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; FILE *f; unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE]; if( ( f = fopen( path, "wb" ) ) == NULL ) return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR ); if( ( ret = mbedtls_entropy_func( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 ) goto exit; if( fwrite( buf, 1, MBEDTLS_ENTROPY_BLOCK_SIZE, f ) != MBEDTLS_ENTROPY_BLOCK_SIZE ) { ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; goto exit; } ret = 0; exit: mbedtls_platform_zeroize( buf, sizeof( buf ) ); fclose( f ); return( ret ); } int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path ) { int ret = 0; FILE *f; size_t n; unsigned char buf[ MBEDTLS_ENTROPY_MAX_SEED_SIZE ]; if( ( f = fopen( path, "rb" ) ) == NULL ) return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR ); fseek( f, 0, SEEK_END ); n = (size_t) ftell( f ); fseek( f, 0, SEEK_SET ); if( n > MBEDTLS_ENTROPY_MAX_SEED_SIZE ) n = MBEDTLS_ENTROPY_MAX_SEED_SIZE; if( fread( buf, 1, n, f ) != n ) ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR; else ret = mbedtls_entropy_update_manual( ctx, buf, n ); fclose( f ); mbedtls_platform_zeroize( buf, sizeof( buf ) ); if( ret != 0 ) return( ret ); return( mbedtls_entropy_write_seed_file( ctx, path ) ); } #endif /* MBEDTLS_FS_IO */ #if defined(MBEDTLS_SELF_TEST) #if !defined(MBEDTLS_TEST_NULL_ENTROPY) /* * Dummy source function */ static int entropy_dummy_source( void *data, unsigned char *output, size_t len, size_t *olen ) { ((void) data); memset( output, 0x2a, len ); *olen = len; return( 0 ); } #endif /* !MBEDTLS_TEST_NULL_ENTROPY */ #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) static int mbedtls_entropy_source_self_test_gather( unsigned char *buf, size_t buf_len ) { int ret = 0; size_t entropy_len = 0; size_t olen = 0; size_t attempts = buf_len; while( attempts > 0 && entropy_len < buf_len ) { if( ( ret = mbedtls_hardware_poll( NULL, buf + entropy_len, buf_len - entropy_len, &olen ) ) != 0 ) return( ret ); entropy_len += olen; attempts--; } if( entropy_len < buf_len ) { ret = 1; } return( ret ); } static int mbedtls_entropy_source_self_test_check_bits( const unsigned char *buf, size_t buf_len ) { unsigned char set= 0xFF; unsigned char unset = 0x00; size_t i; for( i = 0; i < buf_len; i++ ) { set &= buf[i]; unset |= buf[i]; } return( set == 0xFF || unset == 0x00 ); } /* * A test to ensure hat the entropy sources are functioning correctly * and there is no obvious failure. The test performs the following checks: * - The entropy source is not providing only 0s (all bits unset) or 1s (all * bits set). * - The entropy source is not providing values in a pattern. Because the * hardware could be providing data in an arbitrary length, this check polls * the hardware entropy source twice and compares the result to ensure they * are not equal. * - The error code returned by the entropy source is not an error. */ int mbedtls_entropy_source_self_test( int verbose ) { int ret = 0; unsigned char buf0[2 * sizeof( unsigned long long int )]; unsigned char buf1[2 * sizeof( unsigned long long int )]; if( verbose != 0 ) mbedtls_printf( " ENTROPY_BIAS test: " ); memset( buf0, 0x00, sizeof( buf0 ) ); memset( buf1, 0x00, sizeof( buf1 ) ); if( ( ret = mbedtls_entropy_source_self_test_gather( buf0, sizeof( buf0 ) ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_entropy_source_self_test_gather( buf1, sizeof( buf1 ) ) ) != 0 ) goto cleanup; /* Make sure that the returned values are not all 0 or 1 */ if( ( ret = mbedtls_entropy_source_self_test_check_bits( buf0, sizeof( buf0 ) ) ) != 0 ) goto cleanup; if( ( ret = mbedtls_entropy_source_self_test_check_bits( buf1, sizeof( buf1 ) ) ) != 0 ) goto cleanup; /* Make sure that the entropy source is not returning values in a * pattern */ ret = memcmp( buf0, buf1, sizeof( buf0 ) ) == 0; cleanup: if( verbose != 0 ) { if( ret != 0 ) mbedtls_printf( "failed\n" ); else mbedtls_printf( "passed\n" ); mbedtls_printf( "\n" ); } return( ret != 0 ); } #endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */ /* * The actual entropy quality is hard to test, but we can at least * test that the functions don't cause errors and write the correct * amount of data to buffers. */ int mbedtls_entropy_self_test( int verbose ) { int ret = 1; #if !defined(MBEDTLS_TEST_NULL_ENTROPY) mbedtls_entropy_context ctx; unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 }; unsigned char acc[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 }; size_t i, j; #endif /* !MBEDTLS_TEST_NULL_ENTROPY */ if( verbose != 0 ) mbedtls_printf( " ENTROPY test: " ); #if !defined(MBEDTLS_TEST_NULL_ENTROPY) mbedtls_entropy_init( &ctx ); /* First do a gather to make sure we have default sources */ if( ( ret = mbedtls_entropy_gather( &ctx ) ) != 0 ) goto cleanup; ret = mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL, 16, MBEDTLS_ENTROPY_SOURCE_WEAK ); if( ret != 0 ) goto cleanup; if( ( ret = mbedtls_entropy_update_manual( &ctx, buf, sizeof buf ) ) != 0 ) goto cleanup; /* * To test that mbedtls_entropy_func writes correct number of bytes: * - use the whole buffer and rely on ASan to detect overruns * - collect entropy 8 times and OR the result in an accumulator: * any byte should then be 0 with probably 2^(-64), so requiring * each of the 32 or 64 bytes to be non-zero has a false failure rate * of at most 2^(-58) which is acceptable. */ for( i = 0; i < 8; i++ ) { if( ( ret = mbedtls_entropy_func( &ctx, buf, sizeof( buf ) ) ) != 0 ) goto cleanup; for( j = 0; j < sizeof( buf ); j++ ) acc[j] |= buf[j]; } for( j = 0; j < sizeof( buf ); j++ ) { if( acc[j] == 0 ) { ret = 1; goto cleanup; } } #if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) if( ( ret = mbedtls_entropy_source_self_test( 0 ) ) != 0 ) goto cleanup; #endif cleanup: mbedtls_entropy_free( &ctx ); #endif /* !MBEDTLS_TEST_NULL_ENTROPY */ if( verbose != 0 ) { if( ret != 0 ) mbedtls_printf( "failed\n" ); else mbedtls_printf( "passed\n" ); mbedtls_printf( "\n" ); } return( ret != 0 ); } #endif /* MBEDTLS_SELF_TEST */ #endif /* MBEDTLS_ENTROPY_C */ fldigi-4.2.05/src/mbedtls/padlock.c0000664000175000017500000001155114611711171013770 00000000000000/* * VIA PadLock support functions * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * This implementation is based on the VIA PadLock Programming Guide: * * http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/ * programming_guide.pdf */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PADLOCK_C) #include "mbedtls/padlock.h" #include #ifndef asm #define asm __asm #endif #if defined(MBEDTLS_HAVE_X86) /* * PadLock detection routine */ int mbedtls_padlock_has_support( int feature ) { static int flags = -1; int ebx = 0, edx = 0; if( flags == -1 ) { asm( "movl %%ebx, %0 \n\t" "movl $0xC0000000, %%eax \n\t" "cpuid \n\t" "cmpl $0xC0000001, %%eax \n\t" "movl $0, %%edx \n\t" "jb unsupported \n\t" "movl $0xC0000001, %%eax \n\t" "cpuid \n\t" "unsupported: \n\t" "movl %%edx, %1 \n\t" "movl %2, %%ebx \n\t" : "=m" (ebx), "=m" (edx) : "m" (ebx) : "eax", "ecx", "edx" ); flags = edx; } return( flags & feature ); } /* * PadLock AES-ECB block en(de)cryption */ int mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx, int mode, const unsigned char input[16], unsigned char output[16] ) { int ebx = 0; uint32_t *rk; uint32_t *blk; uint32_t *ctrl; unsigned char buf[256]; rk = ctx->rk; blk = MBEDTLS_PADLOCK_ALIGN16( buf ); memcpy( blk, input, 16 ); ctrl = blk + 4; *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode^1 ) - 10 ) << 9 ); asm( "pushfl \n\t" "popfl \n\t" "movl %%ebx, %0 \n\t" "movl $1, %%ecx \n\t" "movl %2, %%edx \n\t" "movl %3, %%ebx \n\t" "movl %4, %%esi \n\t" "movl %4, %%edi \n\t" ".byte 0xf3,0x0f,0xa7,0xc8 \n\t" "movl %1, %%ebx \n\t" : "=m" (ebx) : "m" (ebx), "m" (ctrl), "m" (rk), "m" (blk) : "memory", "ecx", "edx", "esi", "edi" ); memcpy( output, blk, 16 ); return( 0 ); } /* * PadLock AES-CBC buffer en(de)cryption */ int mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx, int mode, size_t length, unsigned char iv[16], const unsigned char *input, unsigned char *output ) { int ebx = 0; size_t count; uint32_t *rk; uint32_t *iw; uint32_t *ctrl; unsigned char buf[256]; if( ( (long) input & 15 ) != 0 || ( (long) output & 15 ) != 0 ) return( MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED ); rk = ctx->rk; iw = MBEDTLS_PADLOCK_ALIGN16( buf ); memcpy( iw, iv, 16 ); ctrl = iw + 4; *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode ^ 1 ) - 10 ) << 9 ); count = ( length + 15 ) >> 4; asm( "pushfl \n\t" "popfl \n\t" "movl %%ebx, %0 \n\t" "movl %2, %%ecx \n\t" "movl %3, %%edx \n\t" "movl %4, %%ebx \n\t" "movl %5, %%esi \n\t" "movl %6, %%edi \n\t" "movl %7, %%eax \n\t" ".byte 0xf3,0x0f,0xa7,0xd0 \n\t" "movl %1, %%ebx \n\t" : "=m" (ebx) : "m" (ebx), "m" (count), "m" (ctrl), "m" (rk), "m" (input), "m" (output), "m" (iw) : "memory", "eax", "ecx", "edx", "esi", "edi" ); memcpy( iv, iw, 16 ); return( 0 ); } #endif /* MBEDTLS_HAVE_X86 */ #endif /* MBEDTLS_PADLOCK_C */ fldigi-4.2.05/src/mbedtls/rsa_internal.c0000664000175000017500000003462614611711171015044 00000000000000/* * Helper functions for the RSA module * * Copyright (C) 2006-2017, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) * */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_RSA_C) #include "mbedtls/rsa.h" #include "mbedtls/bignum.h" #include "mbedtls/rsa_internal.h" /* * Compute RSA prime factors from public and private exponents * * Summary of algorithm: * Setting F := lcm(P-1,Q-1), the idea is as follows: * * (a) For any 1 <= X < N with gcd(X,N)=1, we have X^F = 1 modulo N, so X^(F/2) * is a square root of 1 in Z/NZ. Since Z/NZ ~= Z/PZ x Z/QZ by CRT and the * square roots of 1 in Z/PZ and Z/QZ are +1 and -1, this leaves the four * possibilities X^(F/2) = (+-1, +-1). If it happens that X^(F/2) = (-1,+1) * or (+1,-1), then gcd(X^(F/2) + 1, N) will be equal to one of the prime * factors of N. * * (b) If we don't know F/2 but (F/2) * K for some odd (!) K, then the same * construction still applies since (-)^K is the identity on the set of * roots of 1 in Z/NZ. * * The public and private key primitives (-)^E and (-)^D are mutually inverse * bijections on Z/NZ if and only if (-)^(DE) is the identity on Z/NZ, i.e. * if and only if DE - 1 is a multiple of F, say DE - 1 = F * L. * Splitting L = 2^t * K with K odd, we have * * DE - 1 = FL = (F/2) * (2^(t+1)) * K, * * so (F / 2) * K is among the numbers * * (DE - 1) >> 1, (DE - 1) >> 2, ..., (DE - 1) >> ord * * where ord is the order of 2 in (DE - 1). * We can therefore iterate through these numbers apply the construction * of (a) and (b) above to attempt to factor N. * */ int mbedtls_rsa_deduce_primes( mbedtls_mpi const *N, mbedtls_mpi const *E, mbedtls_mpi const *D, mbedtls_mpi *P, mbedtls_mpi *Q ) { int ret = 0; uint16_t attempt; /* Number of current attempt */ uint16_t iter; /* Number of squares computed in the current attempt */ uint16_t order; /* Order of 2 in DE - 1 */ mbedtls_mpi T; /* Holds largest odd divisor of DE - 1 */ mbedtls_mpi K; /* Temporary holding the current candidate */ const unsigned char primes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251 }; const size_t num_primes = sizeof( primes ) / sizeof( *primes ); if( P == NULL || Q == NULL || P->p != NULL || Q->p != NULL ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); if( mbedtls_mpi_cmp_int( N, 0 ) <= 0 || mbedtls_mpi_cmp_int( D, 1 ) <= 0 || mbedtls_mpi_cmp_mpi( D, N ) >= 0 || mbedtls_mpi_cmp_int( E, 1 ) <= 0 || mbedtls_mpi_cmp_mpi( E, N ) >= 0 ) { return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); } /* * Initializations and temporary changes */ mbedtls_mpi_init( &K ); mbedtls_mpi_init( &T ); /* T := DE - 1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, D, E ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &T, &T, 1 ) ); if( ( order = (uint16_t) mbedtls_mpi_lsb( &T ) ) == 0 ) { ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; goto cleanup; } /* After this operation, T holds the largest odd divisor of DE - 1. */ MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &T, order ) ); /* * Actual work */ /* Skip trying 2 if N == 1 mod 8 */ attempt = 0; if( N->p[0] % 8 == 1 ) attempt = 1; for( ; attempt < num_primes; ++attempt ) { mbedtls_mpi_lset( &K, primes[attempt] ); /* Check if gcd(K,N) = 1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( P, &K, N ) ); if( mbedtls_mpi_cmp_int( P, 1 ) != 0 ) continue; /* Go through K^T + 1, K^(2T) + 1, K^(4T) + 1, ... * and check whether they have nontrivial GCD with N. */ MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &K, &K, &T, N, Q /* temporarily use Q for storing Montgomery * multiplication helper values */ ) ); for( iter = 1; iter <= order; ++iter ) { /* If we reach 1 prematurely, there's no point * in continuing to square K */ if( mbedtls_mpi_cmp_int( &K, 1 ) == 0 ) break; MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( P, &K, N ) ); if( mbedtls_mpi_cmp_int( P, 1 ) == 1 && mbedtls_mpi_cmp_mpi( P, N ) == -1 ) { /* * Have found a nontrivial divisor P of N. * Set Q := N / P. */ MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( Q, NULL, N, P ) ); goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, &K, &K ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &K, &K, N ) ); } /* * If we get here, then either we prematurely aborted the loop because * we reached 1, or K holds primes[attempt]^(DE - 1) mod N, which must * be 1 if D,E,N were consistent. * Check if that's the case and abort if not, to avoid very long, * yet eventually failing, computations if N,D,E were not sane. */ if( mbedtls_mpi_cmp_int( &K, 1 ) != 0 ) { break; } } ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; cleanup: mbedtls_mpi_free( &K ); mbedtls_mpi_free( &T ); return( ret ); } /* * Given P, Q and the public exponent E, deduce D. * This is essentially a modular inversion. */ int mbedtls_rsa_deduce_private_exponent( mbedtls_mpi const *P, mbedtls_mpi const *Q, mbedtls_mpi const *E, mbedtls_mpi *D ) { int ret = 0; mbedtls_mpi K, L; if( D == NULL || mbedtls_mpi_cmp_int( D, 0 ) != 0 ) return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); if( mbedtls_mpi_cmp_int( P, 1 ) <= 0 || mbedtls_mpi_cmp_int( Q, 1 ) <= 0 || mbedtls_mpi_cmp_int( E, 0 ) == 0 ) { return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); } mbedtls_mpi_init( &K ); mbedtls_mpi_init( &L ); /* Temporarily put K := P-1 and L := Q-1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &L, Q, 1 ) ); /* Temporarily put D := gcd(P-1, Q-1) */ MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( D, &K, &L ) ); /* K := LCM(P-1, Q-1) */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, &K, &L ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &K, NULL, &K, D ) ); /* Compute modular inverse of E in LCM(P-1, Q-1) */ MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( D, E, &K ) ); cleanup: mbedtls_mpi_free( &K ); mbedtls_mpi_free( &L ); return( ret ); } /* * Check that RSA CRT parameters are in accordance with core parameters. */ int mbedtls_rsa_validate_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *DP, const mbedtls_mpi *DQ, const mbedtls_mpi *QP ) { int ret = 0; mbedtls_mpi K, L; mbedtls_mpi_init( &K ); mbedtls_mpi_init( &L ); /* Check that DP - D == 0 mod P - 1 */ if( DP != NULL ) { if( P == NULL ) { ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &L, DP, D ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &L, &L, &K ) ); if( mbedtls_mpi_cmp_int( &L, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } /* Check that DQ - D == 0 mod Q - 1 */ if( DQ != NULL ) { if( Q == NULL ) { ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &L, DQ, D ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &L, &L, &K ) ); if( mbedtls_mpi_cmp_int( &L, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } /* Check that QP * Q - 1 == 0 mod P */ if( QP != NULL ) { if( P == NULL || Q == NULL ) { ret = MBEDTLS_ERR_RSA_BAD_INPUT_DATA; goto cleanup; } MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, QP, Q ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &K, &K, P ) ); if( mbedtls_mpi_cmp_int( &K, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } cleanup: /* Wrap MPI error codes by RSA check failure error code */ if( ret != 0 && ret != MBEDTLS_ERR_RSA_KEY_CHECK_FAILED && ret != MBEDTLS_ERR_RSA_BAD_INPUT_DATA ) { ret += MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; } mbedtls_mpi_free( &K ); mbedtls_mpi_free( &L ); return( ret ); } /* * Check that core RSA parameters are sane. */ int mbedtls_rsa_validate_params( const mbedtls_mpi *N, const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, const mbedtls_mpi *E, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret = 0; mbedtls_mpi K, L; mbedtls_mpi_init( &K ); mbedtls_mpi_init( &L ); /* * Step 1: If PRNG provided, check that P and Q are prime */ #if defined(MBEDTLS_GENPRIME) /* * When generating keys, the strongest security we support aims for an error * rate of at most 2^-100 and we are aiming for the same certainty here as * well. */ if( f_rng != NULL && P != NULL && ( ret = mbedtls_mpi_is_prime_ext( P, 50, f_rng, p_rng ) ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } if( f_rng != NULL && Q != NULL && ( ret = mbedtls_mpi_is_prime_ext( Q, 50, f_rng, p_rng ) ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } #else ((void) f_rng); ((void) p_rng); #endif /* MBEDTLS_GENPRIME */ /* * Step 2: Check that 1 < N = P * Q */ if( P != NULL && Q != NULL && N != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, P, Q ) ); if( mbedtls_mpi_cmp_int( N, 1 ) <= 0 || mbedtls_mpi_cmp_mpi( &K, N ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } /* * Step 3: Check and 1 < D, E < N if present. */ if( N != NULL && D != NULL && E != NULL ) { if ( mbedtls_mpi_cmp_int( D, 1 ) <= 0 || mbedtls_mpi_cmp_int( E, 1 ) <= 0 || mbedtls_mpi_cmp_mpi( D, N ) >= 0 || mbedtls_mpi_cmp_mpi( E, N ) >= 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } /* * Step 4: Check that D, E are inverse modulo P-1 and Q-1 */ if( P != NULL && Q != NULL && D != NULL && E != NULL ) { if( mbedtls_mpi_cmp_int( P, 1 ) <= 0 || mbedtls_mpi_cmp_int( Q, 1 ) <= 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } /* Compute DE-1 mod P-1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, D, E ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &L, P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &K, &K, &L ) ); if( mbedtls_mpi_cmp_int( &K, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } /* Compute DE-1 mod Q-1 */ MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &K, D, E ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, &K, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &L, Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &K, &K, &L ) ); if( mbedtls_mpi_cmp_int( &K, 0 ) != 0 ) { ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; goto cleanup; } } cleanup: mbedtls_mpi_free( &K ); mbedtls_mpi_free( &L ); /* Wrap MPI error codes by RSA check failure error code */ if( ret != 0 && ret != MBEDTLS_ERR_RSA_KEY_CHECK_FAILED ) { ret += MBEDTLS_ERR_RSA_KEY_CHECK_FAILED; } return( ret ); } int mbedtls_rsa_deduce_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, const mbedtls_mpi *D, mbedtls_mpi *DP, mbedtls_mpi *DQ, mbedtls_mpi *QP ) { int ret = 0; mbedtls_mpi K; mbedtls_mpi_init( &K ); /* DP = D mod P-1 */ if( DP != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, P, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( DP, D, &K ) ); } /* DQ = D mod Q-1 */ if( DQ != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &K, Q, 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( DQ, D, &K ) ); } /* QP = Q^{-1} mod P */ if( QP != NULL ) { MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( QP, Q, P ) ); } cleanup: mbedtls_mpi_free( &K ); return( ret ); } #endif /* MBEDTLS_RSA_C */ fldigi-4.2.05/src/mbedtls/x509write_crt.c0000664000175000017500000004045214611711171015005 00000000000000/* * X.509 certificate writing * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ /* * References: * - certificates: RFC 5280, updated by RFC 6818 * - CSRs: PKCS#10 v1.7 aka RFC 2986 * - attributes: PKCS#9 v2.0 aka RFC 2985 */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_X509_CRT_WRITE_C) #include "mbedtls/x509_crt.h" #include "mbedtls/oid.h" #include "mbedtls/asn1write.h" #include "mbedtls/sha1.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #endif /* MBEDTLS_PEM_WRITE_C */ void mbedtls_x509write_crt_init( mbedtls_x509write_cert *ctx ) { memset( ctx, 0, sizeof( mbedtls_x509write_cert ) ); mbedtls_mpi_init( &ctx->serial ); ctx->version = MBEDTLS_X509_CRT_VERSION_3; } void mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx ) { mbedtls_mpi_free( &ctx->serial ); mbedtls_asn1_free_named_data_list( &ctx->subject ); mbedtls_asn1_free_named_data_list( &ctx->issuer ); mbedtls_asn1_free_named_data_list( &ctx->extensions ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_x509write_cert ) ); } void mbedtls_x509write_crt_set_version( mbedtls_x509write_cert *ctx, int version ) { ctx->version = version; } void mbedtls_x509write_crt_set_md_alg( mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg ) { ctx->md_alg = md_alg; } void mbedtls_x509write_crt_set_subject_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ) { ctx->subject_key = key; } void mbedtls_x509write_crt_set_issuer_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ) { ctx->issuer_key = key; } int mbedtls_x509write_crt_set_subject_name( mbedtls_x509write_cert *ctx, const char *subject_name ) { return mbedtls_x509_string_to_names( &ctx->subject, subject_name ); } int mbedtls_x509write_crt_set_issuer_name( mbedtls_x509write_cert *ctx, const char *issuer_name ) { return mbedtls_x509_string_to_names( &ctx->issuer, issuer_name ); } int mbedtls_x509write_crt_set_serial( mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial ) { int ret; if( ( ret = mbedtls_mpi_copy( &ctx->serial, serial ) ) != 0 ) return( ret ); return( 0 ); } int mbedtls_x509write_crt_set_validity( mbedtls_x509write_cert *ctx, const char *not_before, const char *not_after ) { if( strlen( not_before ) != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1 || strlen( not_after ) != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1 ) { return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); } strncpy( ctx->not_before, not_before, MBEDTLS_X509_RFC5280_UTC_TIME_LEN ); strncpy( ctx->not_after , not_after , MBEDTLS_X509_RFC5280_UTC_TIME_LEN ); ctx->not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z'; ctx->not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z'; return( 0 ); } int mbedtls_x509write_crt_set_extension( mbedtls_x509write_cert *ctx, const char *oid, size_t oid_len, int critical, const unsigned char *val, size_t val_len ) { return mbedtls_x509_set_extension( &ctx->extensions, oid, oid_len, critical, val, val_len ); } int mbedtls_x509write_crt_set_basic_constraints( mbedtls_x509write_cert *ctx, int is_ca, int max_pathlen ) { int ret; unsigned char buf[9]; unsigned char *c = buf + sizeof(buf); size_t len = 0; memset( buf, 0, sizeof(buf) ); if( is_ca && max_pathlen > 127 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); if( is_ca ) { if( max_pathlen >= 0 ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, max_pathlen ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_bool( &c, buf, 1 ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_BASIC_CONSTRAINTS, MBEDTLS_OID_SIZE( MBEDTLS_OID_BASIC_CONSTRAINTS ), 0, buf + sizeof(buf) - len, len ); } #if defined(MBEDTLS_SHA1_C) int mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ctx ) { int ret; unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */ unsigned char *c = buf + sizeof(buf); size_t len = 0; memset( buf, 0, sizeof(buf) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, ctx->subject_key ) ); ret = mbedtls_sha1_ret( buf + sizeof( buf ) - len, len, buf + sizeof( buf ) - 20 ); if( ret != 0 ) return( ret ); c = buf + sizeof( buf ) - 20; len = 20; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_OCTET_STRING ) ); return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER, MBEDTLS_OID_SIZE( MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER ), 0, buf + sizeof(buf) - len, len ); } int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *ctx ) { int ret; unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */ unsigned char *c = buf + sizeof( buf ); size_t len = 0; memset( buf, 0, sizeof(buf) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, ctx->issuer_key ) ); ret = mbedtls_sha1_ret( buf + sizeof( buf ) - len, len, buf + sizeof( buf ) - 20 ); if( ret != 0 ) return( ret ); c = buf + sizeof( buf ) - 20; len = 20; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | 0 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER, MBEDTLS_OID_SIZE( MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER ), 0, buf + sizeof( buf ) - len, len ); } #endif /* MBEDTLS_SHA1_C */ int mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx, unsigned int key_usage ) { unsigned char buf[4], ku; unsigned char *c; int ret; /* We currently only support 7 bits, from 0x80 to 0x02 */ if( ( key_usage & ~0xfe ) != 0 ) return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE ); c = buf + 4; ku = (unsigned char) key_usage; if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ku, 7 ) ) != 4 ) return( ret ); ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_KEY_USAGE, MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ), 1, buf, 4 ); if( ret != 0 ) return( ret ); return( 0 ); } int mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx, unsigned char ns_cert_type ) { unsigned char buf[4]; unsigned char *c; int ret; c = buf + 4; if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 ) return( ret ); ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE, MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ), 0, buf, 4 ); if( ret != 0 ) return( ret ); return( 0 ); } static int x509_write_time( unsigned char **p, unsigned char *start, const char *t, size_t size ) { int ret; size_t len = 0; /* * write MBEDTLS_ASN1_UTC_TIME if year < 2050 (2 bytes shorter) */ if( t[0] == '2' && t[1] == '0' && t[2] < '5' ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, (const unsigned char *) t + 2, size - 2 ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_UTC_TIME ) ); } else { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, (const unsigned char *) t, size ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_GENERALIZED_TIME ) ); } return( (int) len ); } int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; const char *sig_oid; size_t sig_oid_len = 0; unsigned char *c, *c2; unsigned char hash[64]; unsigned char sig[MBEDTLS_MPI_MAX_SIZE]; unsigned char tmp_buf[2048]; size_t sub_len = 0, pub_len = 0, sig_and_oid_len = 0, sig_len; size_t len = 0; mbedtls_pk_type_t pk_alg; /* * Prepare data to be signed in tmp_buf */ c = tmp_buf + sizeof( tmp_buf ); /* Signature algorithm needed in TBS, and later for actual signature */ /* There's no direct way of extracting a signature algorithm * (represented as an element of mbedtls_pk_type_t) from a PK instance. */ if( mbedtls_pk_can_do( ctx->issuer_key, MBEDTLS_PK_RSA ) ) pk_alg = MBEDTLS_PK_RSA; else if( mbedtls_pk_can_do( ctx->issuer_key, MBEDTLS_PK_ECDSA ) ) pk_alg = MBEDTLS_PK_ECDSA; else return( MBEDTLS_ERR_X509_INVALID_ALG ); if( ( ret = mbedtls_oid_get_oid_by_sig_alg( pk_alg, ctx->md_alg, &sig_oid, &sig_oid_len ) ) != 0 ) { return( ret ); } /* * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension */ /* Only for v3 */ if( ctx->version == MBEDTLS_X509_CRT_VERSION_3 ) { MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_extensions( &c, tmp_buf, ctx->extensions ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 3 ) ); } /* * SubjectPublicKeyInfo */ MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_pk_write_pubkey_der( ctx->subject_key, tmp_buf, c - tmp_buf ) ); c -= pub_len; len += pub_len; /* * Subject ::= Name */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->subject ) ); /* * Validity ::= SEQUENCE { * notBefore Time, * notAfter Time } */ sub_len = 0; MBEDTLS_ASN1_CHK_ADD( sub_len, x509_write_time( &c, tmp_buf, ctx->not_after, MBEDTLS_X509_RFC5280_UTC_TIME_LEN ) ); MBEDTLS_ASN1_CHK_ADD( sub_len, x509_write_time( &c, tmp_buf, ctx->not_before, MBEDTLS_X509_RFC5280_UTC_TIME_LEN ) ); len += sub_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, sub_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); /* * Issuer ::= Name */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->issuer ) ); /* * Signature ::= AlgorithmIdentifier */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( &c, tmp_buf, sig_oid, strlen( sig_oid ), 0 ) ); /* * Serial ::= INTEGER */ MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, tmp_buf, &ctx->serial ) ); /* * Version ::= INTEGER { v1(0), v2(1), v3(2) } */ /* Can be omitted for v1 */ if( ctx->version != MBEDTLS_X509_CRT_VERSION_1 ) { sub_len = 0; MBEDTLS_ASN1_CHK_ADD( sub_len, mbedtls_asn1_write_int( &c, tmp_buf, ctx->version ) ); len += sub_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, sub_len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ); } MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); /* * Make signature */ if( ( ret = mbedtls_md( mbedtls_md_info_from_type( ctx->md_alg ), c, len, hash ) ) != 0 ) { return( ret ); } if( ( ret = mbedtls_pk_sign( ctx->issuer_key, ctx->md_alg, hash, 0, sig, &sig_len, f_rng, p_rng ) ) != 0 ) { return( ret ); } /* * Write data to output buffer */ c2 = buf + size; MBEDTLS_ASN1_CHK_ADD( sig_and_oid_len, mbedtls_x509_write_sig( &c2, buf, sig_oid, sig_oid_len, sig, sig_len ) ); if( len > (size_t)( c2 - buf ) ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); c2 -= len; memcpy( c2, c, len ); len += sig_and_oid_len; MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c2, buf, len ) ); MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c2, buf, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ); return( (int) len ); } #define PEM_BEGIN_CRT "-----BEGIN CERTIFICATE-----\n" #define PEM_END_CRT "-----END CERTIFICATE-----\n" #if defined(MBEDTLS_PEM_WRITE_C) int mbedtls_x509write_crt_pem( mbedtls_x509write_cert *crt, unsigned char *buf, size_t size, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ) { int ret; unsigned char output_buf[4096]; size_t olen = 0; if( ( ret = mbedtls_x509write_crt_der( crt, output_buf, sizeof(output_buf), f_rng, p_rng ) ) < 0 ) { return( ret ); } if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_CRT, PEM_END_CRT, output_buf + sizeof(output_buf) - ret, ret, buf, size, &olen ) ) != 0 ) { return( ret ); } return( 0 ); } #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_X509_CRT_WRITE_C */ fldigi-4.2.05/src/mbedtls/pem.c0000664000175000017500000003442614611711171013142 00000000000000/* * Privacy Enhanced Mail (PEM) decoding * * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved * SPDX-License-Identifier: GPL-2.0 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This file is part of mbed TLS (https://tls.mbed.org) */ #if !defined(MBEDTLS_CONFIG_FILE) #include "mbedtls/config.h" #else #include MBEDTLS_CONFIG_FILE #endif #if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C) #include "mbedtls/pem.h" #include "mbedtls/base64.h" #include "mbedtls/des.h" #include "mbedtls/aes.h" #include "mbedtls/md5.h" #include "mbedtls/cipher.h" #include "mbedtls/platform_util.h" #include #if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" #else #include #define mbedtls_calloc calloc #define mbedtls_free free #endif #if defined(MBEDTLS_PEM_PARSE_C) void mbedtls_pem_init( mbedtls_pem_context *ctx ) { memset( ctx, 0, sizeof( mbedtls_pem_context ) ); } #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) ) /* * Read a 16-byte hex string and convert it to binary */ static int pem_get_iv( const unsigned char *s, unsigned char *iv, size_t iv_len ) { size_t i, j, k; memset( iv, 0, iv_len ); for( i = 0; i < iv_len * 2; i++, s++ ) { if( *s >= '0' && *s <= '9' ) j = *s - '0'; else if( *s >= 'A' && *s <= 'F' ) j = *s - '7'; else if( *s >= 'a' && *s <= 'f' ) j = *s - 'W'; else return( MBEDTLS_ERR_PEM_INVALID_ENC_IV ); k = ( ( i & 1 ) != 0 ) ? j : j << 4; iv[i >> 1] = (unsigned char)( iv[i >> 1] | k ); } return( 0 ); } static int pem_pbkdf1( unsigned char *key, size_t keylen, unsigned char *iv, const unsigned char *pwd, size_t pwdlen ) { mbedtls_md5_context md5_ctx; unsigned char md5sum[16]; size_t use_len; int ret; mbedtls_md5_init( &md5_ctx ); /* * key[ 0..15] = MD5(pwd || IV) */ if( ( ret = mbedtls_md5_starts_ret( &md5_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, iv, 8 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_finish_ret( &md5_ctx, md5sum ) ) != 0 ) goto exit; if( keylen <= 16 ) { memcpy( key, md5sum, keylen ); goto exit; } memcpy( key, md5sum, 16 ); /* * key[16..23] = MD5(key[ 0..15] || pwd || IV]) */ if( ( ret = mbedtls_md5_starts_ret( &md5_ctx ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, md5sum, 16 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_update_ret( &md5_ctx, iv, 8 ) ) != 0 ) goto exit; if( ( ret = mbedtls_md5_finish_ret( &md5_ctx, md5sum ) ) != 0 ) goto exit; use_len = 16; if( keylen < 32 ) use_len = keylen - 16; memcpy( key + 16, md5sum, use_len ); exit: mbedtls_md5_free( &md5_ctx ); mbedtls_platform_zeroize( md5sum, 16 ); return( ret ); } #if defined(MBEDTLS_DES_C) /* * Decrypt with DES-CBC, using PBKDF1 for key derivation */ static int pem_des_decrypt( unsigned char des_iv[8], unsigned char *buf, size_t buflen, const unsigned char *pwd, size_t pwdlen ) { mbedtls_des_context des_ctx; unsigned char des_key[8]; int ret; mbedtls_des_init( &des_ctx ); if( ( ret = pem_pbkdf1( des_key, 8, des_iv, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_des_setkey_dec( &des_ctx, des_key ) ) != 0 ) goto exit; ret = mbedtls_des_crypt_cbc( &des_ctx, MBEDTLS_DES_DECRYPT, buflen, des_iv, buf, buf ); exit: mbedtls_des_free( &des_ctx ); mbedtls_platform_zeroize( des_key, 8 ); return( ret ); } /* * Decrypt with 3DES-CBC, using PBKDF1 for key derivation */ static int pem_des3_decrypt( unsigned char des3_iv[8], unsigned char *buf, size_t buflen, const unsigned char *pwd, size_t pwdlen ) { mbedtls_des3_context des3_ctx; unsigned char des3_key[24]; int ret; mbedtls_des3_init( &des3_ctx ); if( ( ret = pem_pbkdf1( des3_key, 24, des3_iv, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_des3_set3key_dec( &des3_ctx, des3_key ) ) != 0 ) goto exit; ret = mbedtls_des3_crypt_cbc( &des3_ctx, MBEDTLS_DES_DECRYPT, buflen, des3_iv, buf, buf ); exit: mbedtls_des3_free( &des3_ctx ); mbedtls_platform_zeroize( des3_key, 24 ); return( ret ); } #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) /* * Decrypt with AES-XXX-CBC, using PBKDF1 for key derivation */ static int pem_aes_decrypt( unsigned char aes_iv[16], unsigned int keylen, unsigned char *buf, size_t buflen, const unsigned char *pwd, size_t pwdlen ) { mbedtls_aes_context aes_ctx; unsigned char aes_key[32]; int ret; mbedtls_aes_init( &aes_ctx ); if( ( ret = pem_pbkdf1( aes_key, keylen, aes_iv, pwd, pwdlen ) ) != 0 ) goto exit; if( ( ret = mbedtls_aes_setkey_dec( &aes_ctx, aes_key, keylen * 8 ) ) != 0 ) goto exit; ret = mbedtls_aes_crypt_cbc( &aes_ctx, MBEDTLS_AES_DECRYPT, buflen, aes_iv, buf, buf ); exit: mbedtls_aes_free( &aes_ctx ); mbedtls_platform_zeroize( aes_key, keylen ); return( ret ); } #endif /* MBEDTLS_AES_C */ #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ int mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer, const unsigned char *data, const unsigned char *pwd, size_t pwdlen, size_t *use_len ) { int ret, enc; size_t len; unsigned char *buf; const unsigned char *s1, *s2, *end; #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) ) unsigned char pem_iv[16]; mbedtls_cipher_type_t enc_alg = MBEDTLS_CIPHER_NONE; #else ((void) pwd); ((void) pwdlen); #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ if( ctx == NULL ) return( MBEDTLS_ERR_PEM_BAD_INPUT_DATA ); s1 = (unsigned char *) strstr( (const char *) data, header ); if( s1 == NULL ) return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ); s2 = (unsigned char *) strstr( (const char *) data, footer ); if( s2 == NULL || s2 <= s1 ) return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ); s1 += strlen( header ); if( *s1 == ' ' ) s1++; if( *s1 == '\r' ) s1++; if( *s1 == '\n' ) s1++; else return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT ); end = s2; end += strlen( footer ); if( *end == ' ' ) end++; if( *end == '\r' ) end++; if( *end == '\n' ) end++; *use_len = end - data; enc = 0; if( s2 - s1 >= 22 && memcmp( s1, "Proc-Type: 4,ENCRYPTED", 22 ) == 0 ) { #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) ) enc++; s1 += 22; if( *s1 == '\r' ) s1++; if( *s1 == '\n' ) s1++; else return( MBEDTLS_ERR_PEM_INVALID_DATA ); #if defined(MBEDTLS_DES_C) if( s2 - s1 >= 23 && memcmp( s1, "DEK-Info: DES-EDE3-CBC,", 23 ) == 0 ) { enc_alg = MBEDTLS_CIPHER_DES_EDE3_CBC; s1 += 23; if( s2 - s1 < 16 || pem_get_iv( s1, pem_iv, 8 ) != 0 ) return( MBEDTLS_ERR_PEM_INVALID_ENC_IV ); s1 += 16; } else if( s2 - s1 >= 18 && memcmp( s1, "DEK-Info: DES-CBC,", 18 ) == 0 ) { enc_alg = MBEDTLS_CIPHER_DES_CBC; s1 += 18; if( s2 - s1 < 16 || pem_get_iv( s1, pem_iv, 8) != 0 ) return( MBEDTLS_ERR_PEM_INVALID_ENC_IV ); s1 += 16; } #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) if( s2 - s1 >= 14 && memcmp( s1, "DEK-Info: AES-", 14 ) == 0 ) { if( s2 - s1 < 22 ) return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG ); else if( memcmp( s1, "DEK-Info: AES-128-CBC,", 22 ) == 0 ) enc_alg = MBEDTLS_CIPHER_AES_128_CBC; else if( memcmp( s1, "DEK-Info: AES-192-CBC,", 22 ) == 0 ) enc_alg = MBEDTLS_CIPHER_AES_192_CBC; else if( memcmp( s1, "DEK-Info: AES-256-CBC,", 22 ) == 0 ) enc_alg = MBEDTLS_CIPHER_AES_256_CBC; else return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG ); s1 += 22; if( s2 - s1 < 32 || pem_get_iv( s1, pem_iv, 16 ) != 0 ) return( MBEDTLS_ERR_PEM_INVALID_ENC_IV ); s1 += 32; } #endif /* MBEDTLS_AES_C */ if( enc_alg == MBEDTLS_CIPHER_NONE ) return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG ); if( *s1 == '\r' ) s1++; if( *s1 == '\n' ) s1++; else return( MBEDTLS_ERR_PEM_INVALID_DATA ); #else return( MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE ); #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ } if( s1 >= s2 ) return( MBEDTLS_ERR_PEM_INVALID_DATA ); ret = mbedtls_base64_decode( NULL, 0, &len, s1, s2 - s1 ); if( ret == MBEDTLS_ERR_BASE64_INVALID_CHARACTER ) return( MBEDTLS_ERR_PEM_INVALID_DATA + ret ); if( ( buf = mbedtls_calloc( 1, len ) ) == NULL ) return( MBEDTLS_ERR_PEM_ALLOC_FAILED ); if( ( ret = mbedtls_base64_decode( buf, len, &len, s1, s2 - s1 ) ) != 0 ) { mbedtls_platform_zeroize( buf, len ); mbedtls_free( buf ); return( MBEDTLS_ERR_PEM_INVALID_DATA + ret ); } if( enc != 0 ) { #if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \ ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) ) if( pwd == NULL ) { mbedtls_platform_zeroize( buf, len ); mbedtls_free( buf ); return( MBEDTLS_ERR_PEM_PASSWORD_REQUIRED ); } ret = 0; #if defined(MBEDTLS_DES_C) if( enc_alg == MBEDTLS_CIPHER_DES_EDE3_CBC ) ret = pem_des3_decrypt( pem_iv, buf, len, pwd, pwdlen ); else if( enc_alg == MBEDTLS_CIPHER_DES_CBC ) ret = pem_des_decrypt( pem_iv, buf, len, pwd, pwdlen ); #endif /* MBEDTLS_DES_C */ #if defined(MBEDTLS_AES_C) if( enc_alg == MBEDTLS_CIPHER_AES_128_CBC ) ret = pem_aes_decrypt( pem_iv, 16, buf, len, pwd, pwdlen ); else if( enc_alg == MBEDTLS_CIPHER_AES_192_CBC ) ret = pem_aes_decrypt( pem_iv, 24, buf, len, pwd, pwdlen ); else if( enc_alg == MBEDTLS_CIPHER_AES_256_CBC ) ret = pem_aes_decrypt( pem_iv, 32, buf, len, pwd, pwdlen ); #endif /* MBEDTLS_AES_C */ if( ret != 0 ) { mbedtls_free( buf ); return( ret ); } /* * The result will be ASN.1 starting with a SEQUENCE tag, with 1 to 3 * length bytes (allow 4 to be sure) in all known use cases. * * Use that as a heuristic to try to detect password mismatches. */ if( len <= 2 || buf[0] != 0x30 || buf[1] > 0x83 ) { mbedtls_platform_zeroize( buf, len ); mbedtls_free( buf ); return( MBEDTLS_ERR_PEM_PASSWORD_MISMATCH ); } #else mbedtls_platform_zeroize( buf, len ); mbedtls_free( buf ); return( MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE ); #endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */ } ctx->buf = buf; ctx->buflen = len; return( 0 ); } void mbedtls_pem_free( mbedtls_pem_context *ctx ) { if ( ctx->buf != NULL ) { mbedtls_platform_zeroize( ctx->buf, ctx->buflen ); mbedtls_free( ctx->buf ); } mbedtls_free( ctx->info ); mbedtls_platform_zeroize( ctx, sizeof( mbedtls_pem_context ) ); } #endif /* MBEDTLS_PEM_PARSE_C */ #if defined(MBEDTLS_PEM_WRITE_C) int mbedtls_pem_write_buffer( const char *header, const char *footer, const unsigned char *der_data, size_t der_len, unsigned char *buf, size_t buf_len, size_t *olen ) { int ret; unsigned char *encode_buf = NULL, *c, *p = buf; size_t len = 0, use_len, add_len = 0; mbedtls_base64_encode( NULL, 0, &use_len, der_data, der_len ); add_len = strlen( header ) + strlen( footer ) + ( use_len / 64 ) + 1; if( use_len + add_len > buf_len ) { *olen = use_len + add_len; return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL ); } if( use_len != 0 && ( ( encode_buf = mbedtls_calloc( 1, use_len ) ) == NULL ) ) return( MBEDTLS_ERR_PEM_ALLOC_FAILED ); if( ( ret = mbedtls_base64_encode( encode_buf, use_len, &use_len, der_data, der_len ) ) != 0 ) { mbedtls_free( encode_buf ); return( ret ); } memcpy( p, header, strlen( header ) ); p += strlen( header ); c = encode_buf; while( use_len ) { len = ( use_len > 64 ) ? 64 : use_len; memcpy( p, c, len ); use_len -= len; p += len; c += len; *p++ = '\n'; } memcpy( p, footer, strlen( footer ) ); p += strlen( footer ); *p++ = '\0'; *olen = p - buf; mbedtls_free( encode_buf ); return( 0 ); } #endif /* MBEDTLS_PEM_WRITE_C */ #endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */ fldigi-4.2.05/src/contestia/0000775000175000017500000000000014611714005012622 500000000000000fldigi-4.2.05/src/contestia/contestia.cxx0000664000175000017500000002746514611711171015276 00000000000000// ---------------------------------------------------------------------------- // contestia.cxx -- CONTESTIA modem // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // Copyright (C) 2005 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "contestia.h" #include "modem.h" #include "fl_digi.h" #include "misc.h" #include "confdialog.h" #include "status.h" #include "debug.h" LOG_FILE_SOURCE(debug::LOG_MODEM); double contestia::nco(double freq) { preamblephase += 2.0 * M_PI * freq / samplerate; if (preamblephase > TWOPI) preamblephase -= TWOPI; return cos(preamblephase); } void contestia::tx_init() { phaseacc = 0; prevsymbol = cmplx (1.0, 0.0); preamble = 32; shreg = 0; preamblesent = 0; postamblesent = 0; txbasefreq = get_txfreq_woffset(); rx_flush(); if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 0; } videoText(); Tx->Preset(); Tx->Start(); escape = 0; } void contestia::rx_flush() { unsigned char c; Rx->Flush(); while (Rx->GetChar(c) > 0) put_rx_char(c); } void contestia::send_tones() { if (!progdefaults.contestia_start_tones) return; double freqa, freqb; tone_bw = bandwidth; tone_midfreq = txbasefreq; if (reverse) { freqa = tone_midfreq + (tone_bw / 2.0); freqb = tone_midfreq - (tone_bw / 2.0); } else { freqa = tone_midfreq - (tone_bw / 2.0); freqb = tone_midfreq + (tone_bw / 2.0); } preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[2*SR4 + i] = tonebuff[i] = nco(freqa) * ampshape[i]; preamblephase = 0; for (int i = 0; i < SR4; i++) tonebuff[3*SR4 + i] = tonebuff[SR4 + i] = nco(freqb) * ampshape[i]; for (int j = 0; j < TONE_DURATION; j += SCBLOCKSIZE) ModulateXmtr(&tonebuff[j], SCBLOCKSIZE); } void contestia::rx_init() { Rx->Reset(); escape = 0; } int contestia::unescape(int c) { if (progdefaults.contestia8bit == 0) return c; if (escape) { escape = 0; return c + 128; } if (c == 127) { escape = 1; return -1; } return c; } int contestia::tx_process() { int c = 0, len = 0; unsigned char ch; if (tones != progdefaults.contestiatones || bw != progdefaults.contestiabw || smargin != progdefaults.contestiasmargin || sinteg != progdefaults.contestiasinteg ) restart(); if (preamblesent != 1) { send_tones(); preamblesent = 1; // Olivia Transmitter class requires at least character Tx->PutChar(0); } // The encoder works with BitsPerSymbol length blocks. If the // modem already has that many characters buffered, don't try // to read any more. If stopflag is set, we will always read // whatever there is. if (stopflag || (Tx->GetReadReady() < Tx->BitsPerSymbol)) { if (!stopflag && (c = get_tx_char()) == GET_TX_CHAR_ETX) stopflag = true; if (stopflag) Tx->Stop(); else { if (c == GET_TX_CHAR_NODATA) c = 0; /* Replace un-representable characters with a dot */ if (c > (progdefaults.contestia8bit ? 255 : 127)) c = '.'; if (c > 127) { c &= 127; Tx->PutChar(127); } Tx->PutChar(c); } } if (Tx->GetChar(ch) > 0) if ((c = unescape(ch)) != -1) put_echo_char(progdefaults.rx_lowercase ? tolower(c) : toupper(c)); if ((len = Tx->Output(txfbuffer)) > 0) ModulateXmtr(txfbuffer, len); if (stopflag && Tx->DoPostambleYet() == 1 && postamblesent != 1) { postamblesent = 1; send_tones(); } if (!Tx->Running()) { stopflag = false; return -1; } return 0; } int contestia::rx_process(const double *buf, int len) { int c; unsigned char ch = 0; static double snr = 1e-3; static char msg1[20]; static char msg2[20]; if (tones != progdefaults.contestiatones || bw != progdefaults.contestiabw || smargin != progdefaults.contestiasmargin || sinteg != progdefaults.contestiasinteg ) restart(); if ((lastfreq != frequency || Rx->Reverse) && !reverse) { Rx->FirstCarrierMultiplier = (frequency - (Rx->Bandwidth / 2)) / 500; Rx->Reverse = 0; lastfreq = frequency; Rx->Preset(); } else if ((lastfreq != frequency || !Rx->Reverse) && reverse) { Rx->FirstCarrierMultiplier = (frequency + (Rx->Bandwidth / 2)) / 500; Rx->Reverse = 1; lastfreq = frequency; Rx->Preset(); } Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 3.0, 90.0) : 3.0; Rx->Process(buf, len); sp = 0; for (int i = frequency - Rx->Bandwidth/2; i < frequency - 1 + Rx->Bandwidth/2; i++) if (wf->Pwr(i) > sp) sp = wf->Pwr(i); np = wf->Pwr(frequency + Rx->Bandwidth/2 + 2*Rx->Bandwidth/Rx->Tones); if (np == 0) np = sp + 1e-8; sigpwr = decayavg( sigpwr, sp, 10); noisepwr = decayavg( noisepwr, np, 50); snr = CLAMP(sigpwr / noisepwr, 0.001, 100000); metric = clamp( 5.0 * (Rx->SignalToNoiseRatio() - 3.0), 0, 100); display_metric(metric); bool gotchar = false; while (Rx->GetChar(ch) > 0) { if ((c = unescape(ch)) != -1 && c > 7) { put_rx_char(progdefaults.rx_lowercase ? tolower(c) : c); gotchar = true; } } if (gotchar) { snprintf(msg1, sizeof(msg1), "s/n: %4.1f dB", 10*log10(snr) - 20); put_Status1(msg1, 5, STATUS_CLEAR); snprintf(msg2, sizeof(msg2), "f/o %+4.1f Hz", Rx->FrequencyOffset()); put_Status2(msg2, 5, STATUS_CLEAR); } return 0; } void contestia::restart() { tones = progdefaults.contestiatones; bw = progdefaults.contestiabw; smargin = progdefaults.contestiasmargin; sinteg = progdefaults.contestiasinteg; samplerate = 8000; bandwidth = 125 * (1 << bw); Tx->Tones = 2 * (1 << tones); Tx->Bandwidth = bandwidth; Tx->SampleRate = samplerate; Tx->OutputSampleRate = samplerate; txbasefreq = get_txfreq_woffset(); Tx->bContestia = true; if (reverse) { Tx->FirstCarrierMultiplier = (txbasefreq + (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 1; } else { Tx->FirstCarrierMultiplier = (txbasefreq - (Tx->Bandwidth / 2)) / 500; Tx->Reverse = 0; } if (Tx->Preset() < 0) { LOG_ERROR("contestia: transmitter preset failed!"); return; } txbufferlen = Tx->MaxOutputLen; if (txfbuffer) delete [] txfbuffer; txfbuffer = new double[txbufferlen]; Rx->Tones = Tx->Tones; Rx->Bandwidth = bandwidth; Rx->SyncMargin = smargin; Rx->SyncIntegLen = sinteg; Rx->SyncThreshold = progStatus.sqlonoff ? clamp(progStatus.sldrSquelchValue / 5.0 + 3.0, 0, 90.0) : 0.0; Rx->SampleRate = samplerate; Rx->InputSampleRate = samplerate; Rx->bContestia = true; if (reverse) { Rx->FirstCarrierMultiplier = (frequency + (Rx->Bandwidth / 2)) / 500; Rx->Reverse = 1; } else { Rx->FirstCarrierMultiplier = (frequency - (Rx->Bandwidth /2)) / 500; Rx->Reverse = 0; } if (Rx->Preset() < 0) { LOG_ERROR("contestia: receiver preset failed!"); return; } fragmentsize = 1024; set_bandwidth(Tx->Bandwidth - Tx->Bandwidth / Tx->Tones); std::stringstream info; info << mode_info[mode].sname; put_MODEstatus("%s", info.str().c_str()); metric = 0; sigpwr = 1e-10; noisepwr = 1e-8; LOG_DEBUG("\nContestia Rx parameters:\n%s", Rx->PrintParameters()); } void contestia::init() { restart(); modem::init(); set_scope_mode(Digiscope::BLANK); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); } contestia::contestia(trx_mode omode) { mode = omode; cap |= CAP_REV; txfbuffer = 0; samplerate = 8000; switch (mode) { case MODE_CONTESTIA_4_125: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 0; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_4_250: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 1; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_4_500: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 2; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_4_1000: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_4_2000: progdefaults.contestiatones = tones = 1; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_125: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 0; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_250: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 1; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_500: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 2; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_1000: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_8_2000: progdefaults.contestiatones = tones = 2; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_16_250: progdefaults.contestiatones = tones = 3; progdefaults.contestiabw = bw = 1; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_16_500: progdefaults.contestiatones = tones = 3; progdefaults.contestiabw = bw = 2; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_16_1000: progdefaults.contestiatones = tones = 3; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_16_2000: progdefaults.contestiatones = tones = 3; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_32_1000: progdefaults.contestiatones = tones = 4; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_32_2000: progdefaults.contestiatones = tones = 4; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_64_500: progdefaults.contestiatones = tones = 5; progdefaults.contestiabw = bw = 2; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_64_1000: progdefaults.contestiatones = tones = 5; progdefaults.contestiabw = bw = 3; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA_64_2000: progdefaults.contestiatones = tones = 5; progdefaults.contestiabw = bw = 4; REQ(set_contestia_tab_widgets); break; case MODE_CONTESTIA: default: tones = progdefaults.contestiatones; bw = progdefaults.contestiabw; REQ(set_contestia_tab_widgets); break; } Tx = new MFSK_Transmitter< double >; Rx = new MFSK_Receiver< double >; Tx->bContestia = true; Rx->bContestia = true; lastfreq = 0; for (int i = 0; i < SR4; i++) ampshape[i] = 1.0; for (int i = 0; i < SR4 / 8; i++) ampshape[i] = ampshape[SR4 - 1 - i] = 0.5 * (1.0 - cos(M_PI * i / (SR4/8))); for (int i = 0; i < TONE_DURATION; i++) tonebuff[i] = 0; tone_bw = -1; tone_midfreq = -1; } contestia::~contestia() { if (Tx) delete Tx; if (Rx) delete Rx; if (txfbuffer) delete [] txfbuffer; } fldigi-4.2.05/src/xmlrpcpp/0000775000175000017500000000000014611714004012475 500000000000000fldigi-4.2.05/src/xmlrpcpp/XmlRpcMutex.cpp0000664000175000017500000000342414532252172015361 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #if defined(XMLRPC_THREADS) #include #include "XmlRpcMutex.h" #if defined(_WINDOWS) # define WIN32_LEAN_AND_MEAN # include #else # include #endif using namespace XmlRpc; //! Destructor. XmlRpcMutex::~XmlRpcMutex() { if (_pMutex) { #if defined(_WINDOWS) ::CloseHandle((HANDLE)_pMutex); #else ::pthread_mutex_destroy((pthread_mutex_t*)_pMutex); delete _pMutex; #endif _pMutex = 0; } } //! Wait for the mutex to be available and then acquire the lock. void XmlRpcMutex::acquire() { #if defined(_WINDOWS) if ( ! _pMutex) _pMutex = ::CreateMutex(0, TRUE, 0); else ::WaitForSingleObject(_pMutex, INFINITE); #else if ( ! _pMutex) { _pMutex = new pthread_mutex_t; ::pthread_mutex_init((pthread_mutex_t*)_pMutex, 0); } ::pthread_mutex_lock((pthread_mutex_t*)_pMutex); #endif } //! Release the mutex. void XmlRpcMutex::release() { if (_pMutex) #if defined(_WINDOWS) ::ReleaseMutex(_pMutex); #else ::pthread_mutex_unlock((pthread_mutex_t*)_pMutex); #endif } #endif // XMLRPC_THREADS fldigi-4.2.05/src/xmlrpcpp/XmlRpcBase64.h0000664000175000017500000002102314532252172014743 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #if !defined(__BASE64_H_INCLUDED__) #define __BASE64_H_INCLUDED__ 1 #include // Corrects forward declarations issue c++11 #include // Corrects forward declarations issue c++11 #include static int _xmlrpc_base64Chars[]= {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9', '+','/' }; #define _0000_0011 0x03 #define _1111_1100 0xFC #define _1111_0000 0xF0 #define _0011_0000 0x30 #define _0011_1100 0x3C #define _0000_1111 0x0F #define _1100_0000 0xC0 #define _0011_1111 0x3F #define _EQUAL_CHAR (-1) #define _UNKNOWN_CHAR (-2) #define _IOS_FAILBIT std::ios_base::failbit #define _IOS_EOFBIT std::ios_base::eofbit #define _IOS_BADBIT std::ios_base::badbit #define _IOS_GOODBIT std::ios_base::goodbit // TEMPLATE CLASS xmlrpc_base64_put template > class xmlrpc_base64 { public: typedef unsigned char byte_t; typedef _E char_type; typedef _Tr traits_type; // xmlrpc_base64 requires max line length <= 72 characters // you can fill end of line // it may be crlf, crlfsp, noline or other class like it struct crlf { template _OI operator()(_OI _To) const{ *_To = _Tr::to_char_type('\r'); ++_To; *_To = _Tr::to_char_type('\n'); ++_To; return (_To); } }; struct crlfsp { template _OI operator()(_OI _To) const{ *_To = _Tr::to_char_type('\r'); ++_To; *_To = _Tr::to_char_type('\n'); ++_To; *_To = _Tr::to_char_type(' '); ++_To; return (_To); } }; struct noline { template _OI operator()(_OI _To) const{ return (_To); } }; struct three2four { void zero() { _data[0] = 0; _data[1] = 0; _data[2] = 0; } byte_t get_0() const { return _data[0]; } byte_t get_1() const { return _data[1]; } byte_t get_2() const { return _data[2]; } void set_0(byte_t _ch) { _data[0] = _ch; } void set_1(byte_t _ch) { _data[1] = _ch; } void set_2(byte_t _ch) { _data[2] = _ch; } // 0000 0000 1111 1111 2222 2222 // xxxx xxxx xxxx xxxx xxxx xxxx // 0000 0011 1111 2222 2233 3333 int b64_0() const {return (_data[0] & _1111_1100) >> 2;} int b64_1() const {return ((_data[0] & _0000_0011) << 4) + ((_data[1] & _1111_0000)>>4);} int b64_2() const {return ((_data[1] & _0000_1111) << 2) + ((_data[2] & _1100_0000)>>6);} int b64_3() const {return (_data[2] & _0011_1111);} void b64_0(int _ch) {_data[0] = ((_ch & _0011_1111) << 2) | (_0000_0011 & _data[0]);} void b64_1(int _ch) { _data[0] = ((_ch & _0011_0000) >> 4) | (_1111_1100 & _data[0]); _data[1] = ((_ch & _0000_1111) << 4) | (_0000_1111 & _data[1]); } void b64_2(int _ch) { _data[1] = ((_ch & _0011_1100) >> 2) | (_1111_0000 & _data[1]); _data[2] = ((_ch & _0000_0011) << 6) | (_0011_1111 & _data[2]); } void b64_3(int _ch){ _data[2] = (_ch & _0011_1111) | (_1100_0000 & _data[2]);} private: byte_t _data[3]; }; template _II put(_II _First, _II _Last, _OI _To, _State& _St, _Endline _Endl) const { three2four _3to4; int line_octets = 0; while(_First != _Last) { _3to4.zero(); // 3 _3to4.set_0(*_First); _First++; if(_First == _Last) { *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_0()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_1()]); ++_To; *_To = _Tr::to_char_type('='); ++_To; *_To = _Tr::to_char_type('='); ++_To; goto __end; } _3to4.set_1(*_First); _First++; if(_First == _Last) { *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_0()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_1()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_2()]); ++_To; *_To = _Tr::to_char_type('='); ++_To; goto __end; } _3to4.set_2(*_First); _First++; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_0()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_1()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_2()]); ++_To; *_To = _Tr::to_char_type(_xmlrpc_base64Chars[_3to4.b64_3()]); ++_To; if(line_octets == 17) // xmlrpc_base64 72 { //_To = _Endl(_To); *_To = '\n'; ++_To; line_octets = 0; } else ++line_octets; } __end: ; return (_First); } template _II get(_II _First, _II _Last, _OI _To, _State& _St) const { three2four _3to4; int _Char; while(_First != _Last) { // Take octet _3to4.zero(); // -- 0 -- // Search next valid char... while((_Char = _getCharType(*_First)) < 0 && _Char == _UNKNOWN_CHAR) { if(++_First == _Last) { _St |= _IOS_FAILBIT|_IOS_EOFBIT; return _First; // unexpected EOF } } if(_Char == _EQUAL_CHAR){ // Error! First character in octet can't be '=' _St |= _IOS_FAILBIT; return _First; } else _3to4.b64_0(_Char); // -- 1 -- // Search next valid char... while(++_First != _Last) if((_Char = _getCharType(*_First)) != _UNKNOWN_CHAR) break; if(_First == _Last) { _St |= _IOS_FAILBIT|_IOS_EOFBIT; // unexpected EOF return _First; } if(_Char == _EQUAL_CHAR){ // Error! Second character in octet can't be '=' _St |= _IOS_FAILBIT; return _First; } else _3to4.b64_1(_Char); // -- 2 -- // Search next valid char... while(++_First != _Last) if((_Char = _getCharType(*_First)) != _UNKNOWN_CHAR) break; if(_First == _Last) { // Error! Unexpected EOF. Must be '=' or xmlrpc_base64 character _St |= _IOS_FAILBIT|_IOS_EOFBIT; return _First; } if(_Char == _EQUAL_CHAR){ // OK! _3to4.b64_2(0); _3to4.b64_3(0); // chek for EOF if(++_First == _Last) { // Error! Unexpected EOF. Must be '='. Ignore it. //_St |= _IOS_BADBIT|_IOS_EOFBIT; _St |= _IOS_EOFBIT; } else if(_getCharType(*_First) != _EQUAL_CHAR) { // Error! Must be '='. Ignore it. //_St |= _IOS_BADBIT; } else ++_First; // Skip '=' // write 1 byte to output *_To = (byte_t) _3to4.get_0(); return _First; } else _3to4.b64_2(_Char); // -- 3 -- // Search next valid char... while(++_First != _Last) if((_Char = _getCharType(*_First)) != _UNKNOWN_CHAR) break; if(_First == _Last) { // Unexpected EOF. It's error. But ignore it. //_St |= _IOS_FAILBIT|_IOS_EOFBIT; _St |= _IOS_EOFBIT; return _First; } if(_Char == _EQUAL_CHAR) { // OK! _3to4.b64_3(0); // write to output 2 bytes *_To = (byte_t) _3to4.get_0(); *_To = (byte_t) _3to4.get_1(); ++_First; // set position to next character return _First; } else _3to4.b64_3(_Char); // write to output 3 bytes *_To = (byte_t) _3to4.get_0(); *_To = (byte_t) _3to4.get_1(); *_To = (byte_t) _3to4.get_2(); ++_First; } // while(_First != _Last) return (_First); } protected: int _getCharType(int _Ch) const { if(_xmlrpc_base64Chars[62] == _Ch) return 62; if(_xmlrpc_base64Chars[63] == _Ch) return 63; if((_xmlrpc_base64Chars[0] <= _Ch) && (_xmlrpc_base64Chars[25] >= _Ch)) return _Ch - _xmlrpc_base64Chars[0]; if((_xmlrpc_base64Chars[26] <= _Ch) && (_xmlrpc_base64Chars[51] >= _Ch)) return _Ch - _xmlrpc_base64Chars[26] + 26; if((_xmlrpc_base64Chars[52] <= _Ch) && (_xmlrpc_base64Chars[61] >= _Ch)) return _Ch - _xmlrpc_base64Chars[52] + 52; if(_Ch == _Tr::to_int_type('=')) return _EQUAL_CHAR; return _UNKNOWN_CHAR; } }; #endif fldigi-4.2.05/src/xmlrpcpp/XmlRpcSocket.h0000664000175000017500000000537214532252172015160 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSOCKET_H_ #define _XMLRPCSOCKET_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include namespace XmlRpc { //! A platform-independent socket API. class XmlRpcSocket { public: // On windows, a socket is an unsigned int large enough to hold a ptr // This should match the definition of SOCKET in winsock2.h #if defined(_WINDOWS) # if defined(_WIN64) typedef unsigned __int64 Socket; # else typedef unsigned int Socket; # endif #else typedef int Socket; #endif //! An invalid socket constant. static const Socket Invalid = (Socket) -1; //! Creates a stream (TCP) socket. Returns XmlRpcSocket::Invalid on failure. static Socket socket(); //! Closes a socket. static void close(Socket socket); //! Sets a stream (TCP) socket to perform non-blocking IO. Returns false on failure. static bool setNonBlocking(Socket socket); // The next four methods are appropriate for servers. //! Allow the port the specified socket is bound to to be re-bound immediately so //! server re-starts are not delayed. Returns false on failure. static bool setReuseAddr(Socket socket); //! Bind to a specified port static bool bind(Socket socket, int port); //! Set socket in listen mode static bool listen(Socket socket, int backlog); //! Accept a client connection request static Socket accept(Socket socket); //! Connect a socket to a server (from a client) static bool connect(Socket socket, std::string& host, int port); //! Get the port of a bound socket static int getPort(Socket socket); //! Returns true if the last error was not a fatal one (eg, EWOULDBLOCK) static bool nonFatalError(); //! Returns last errno static int getError(); //! Returns message corresponding to last error static std::string getErrorMsg(); //! Returns message corresponding to error static std::string getErrorMsg(int error); }; } // namespace XmlRpc #endif fldigi-4.2.05/src/xmlrpcpp/XmlRpcServerConnection.h0000664000175000017500000000541114532252172017210 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSERVERCONNECTION_H_ #define _XMLRPCSERVERCONNECTION_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include "XmlRpcValue.h" #include "XmlRpcSource.h" namespace XmlRpc { // The server waits for client connections and provides support for executing methods class XmlRpcServer; class XmlRpcServerMethod; //! A class to handle XML RPC requests from a particular client class XmlRpcServerConnection : public XmlRpcSource { public: //! Constructor XmlRpcServerConnection(XmlRpcSocket::Socket fd, XmlRpcServer* server, bool deleteOnClose = false); //! Destructor virtual ~XmlRpcServerConnection(); // XmlRpcSource interface implementation //! Handle IO on the client connection socket. //! @param eventType Type of IO event that occurred. @see XmlRpcDispatch::EventType. virtual unsigned handleEvent(unsigned eventType); protected: //! Reads the http header bool readHeader(); //! Reads the request (based on the content-length header value) bool readRequest(); //! Executes the request and writes the resulting response bool writeResponse(); //! Helper method to execute the client request virtual void executeRequest(); //! The XmlRpc server that accepted this connection XmlRpcServer* _server; //! Possible IO states for the connection enum ServerConnectionState { READ_HEADER, READ_REQUEST, WRITE_RESPONSE }; //! Current IO state for the connection ServerConnectionState _connectionState; //! Request headers std::string _header; //! Number of bytes expected in the request body (parsed from header) int _contentLength; //! Request body std::string _request; //! Response std::string _response; //! Number of bytes of the response written so far int _bytesWritten; //! Whether to keep the current client connection open for further requests bool _keepAlive; }; } // namespace XmlRpc #endif // _XMLRPCSERVERCONNECTION_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcValue.cpp0000664000175000017500000005044114611711171015331 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcValue.h" #include "XmlRpcException.h" #include "XmlRpcUtil.h" #include "XmlRpcBase64.h" #include #include #include #include namespace XmlRpc { static const char VALUE_TAG[] = "value"; static const char NIL_TAG[] = "nil"; static const char BOOLEAN_TAG[] = "boolean"; static const char DOUBLE_TAG[] = "double"; static const char INT_TAG[] = "int"; static const char I4_TAG[] = "i4"; static const char STRING_TAG[] = "string"; static const char DATETIME_TAG[] = "dateTime.iso8601"; static const char BASE64_TAG[] = "base64"; static const char ARRAY_TAG[] = "array"; static const char DATA_TAG[] = "data"; static const char STRUCT_TAG[] = "struct"; static const char MEMBER_TAG[] = "member"; static const char NAME_TAG[] = "name"; // Format strings std::string XmlRpcValue::_doubleFormat("%f"); // Clean up void XmlRpcValue::invalidate() { switch (_type) { case TypeString: delete _value.asString; break; case TypeDateTime: delete _value.asTime; break; case TypeBase64: delete _value.asBinary; break; case TypeArray: delete _value.asArray; break; case TypeStruct: delete _value.asStruct; break; default: break; } _type = TypeInvalid; _value.asBinary = 0; } // Type checking void XmlRpcValue::assertType(Type t) const { if (_type != t) { throw XmlRpcException("type error"); } } void XmlRpcValue::assertType(Type t) { if (_type == TypeInvalid) { _type = t; switch (_type) { // Ensure there is a valid value for the type case TypeString: _value.asString = new std::string(); break; case TypeDateTime: _value.asTime = new struct tm(); break; case TypeBase64: _value.asBinary = new BinaryData(); break; case TypeArray: _value.asArray = new ValueArray(); break; case TypeStruct: _value.asStruct = new ValueStruct(); break; default: _value.asBinary = 0; break; } } else if (_type != t) { throw XmlRpcException("type error"); } } void XmlRpcValue::assertArray(int size) const { if (_type != TypeArray) throw XmlRpcException("type error: expected an array"); else if (int(_value.asArray->size()) < size) throw XmlRpcException("range error: array index too large"); } void XmlRpcValue::assertArray(int size) { if (_type == TypeInvalid) { _type = TypeArray; _value.asArray = new ValueArray(size); } else if (_type == TypeArray) { if (int(_value.asArray->size()) < size) _value.asArray->resize(size); } else throw XmlRpcException("type error: expected an array"); } void XmlRpcValue::assertStruct() { if (_type == TypeInvalid) { _type = TypeStruct; _value.asStruct = new ValueStruct(); } else if (_type != TypeStruct) throw XmlRpcException("type error: expected a struct"); } // Operators XmlRpcValue& XmlRpcValue::operator=(XmlRpcValue const& rhs) { if (this != &rhs) { invalidate(); _type = rhs._type; switch (_type) { case TypeBoolean: _value.asBool = rhs._value.asBool; break; case TypeInt: _value.asInt = rhs._value.asInt; break; case TypeDouble: _value.asDouble = rhs._value.asDouble; break; case TypeDateTime: _value.asTime = new struct tm(*rhs._value.asTime); break; case TypeString: _value.asString = new std::string(*rhs._value.asString); break; case TypeBase64: _value.asBinary = new BinaryData(*rhs._value.asBinary); break; case TypeArray: _value.asArray = new ValueArray(*rhs._value.asArray); break; case TypeStruct: _value.asStruct = new ValueStruct(*rhs._value.asStruct); break; default: _value.asBinary = 0; break; } } return *this; } // Predicate for tm equality static bool tmEq(struct tm const& t1, struct tm const& t2) { return t1.tm_sec == t2.tm_sec && t1.tm_min == t2.tm_min && t1.tm_hour == t2.tm_hour && t1.tm_mday == t2.tm_mday && t1.tm_mon == t2.tm_mon && t1.tm_year == t2.tm_year; } bool XmlRpcValue::operator==(XmlRpcValue const& other) const { if (_type != other._type) return false; switch (_type) { case TypeBoolean: return ( !_value.asBool && !other._value.asBool) || ( _value.asBool && other._value.asBool); case TypeInt: return _value.asInt == other._value.asInt; case TypeDouble: return _value.asDouble == other._value.asDouble; case TypeDateTime: return tmEq(*_value.asTime, *other._value.asTime); case TypeString: return *_value.asString == *other._value.asString; case TypeBase64: return *_value.asBinary == *other._value.asBinary; case TypeArray: return *_value.asArray == *other._value.asArray; // The map<>::operator== requires the definition of value< for kcc case TypeStruct: //return *_value.asStruct == *other._value.asStruct; { if (_value.asStruct->size() != other._value.asStruct->size()) return false; ValueStruct::const_iterator it1=_value.asStruct->begin(); ValueStruct::const_iterator it2=other._value.asStruct->begin(); while (it1 != _value.asStruct->end()) { const XmlRpcValue& v1 = it1->second; const XmlRpcValue& v2 = it2->second; if ( ! (v1 == v2)) return false; it1++; it2++; } return true; } default: break; } return true; // Both invalid values ... } bool XmlRpcValue::operator!=(XmlRpcValue const& other) const { return !(*this == other); } // Works for strings, binary data, arrays, and structs. int XmlRpcValue::size() const { switch (_type) { case TypeString: return int(_value.asString->size()); case TypeBase64: return int(_value.asBinary->size()); case TypeArray: return int(_value.asArray->size()); case TypeStruct: return int(_value.asStruct->size()); default: break; } throw XmlRpcException("type error"); } // Checks for existence of struct member bool XmlRpcValue::hasMember(const std::string& name) const { return _type == TypeStruct && _value.asStruct->find(name) != _value.asStruct->end(); } // Set the value from xml. The chars at *offset into valueXml // should be the start of a tag. Destroys any existing value. bool XmlRpcValue::fromXml(std::string const& valueXml, int* offset) { int savedOffset = *offset; invalidate(); bool emptyTag; if ( ! XmlRpcUtil::nextTagIs(VALUE_TAG, valueXml, offset, &emptyTag)) return false; // Not a value, offset not updated // No value? Pretend its an empty string... if (emptyTag) { *this = ""; return true; } // No type tag? Assume string // bool result = true; bool result = false; int valueOffset = *offset; if (XmlRpcUtil::nextTagIsEnd(VALUE_TAG, valueXml, offset)) { result = true; return stringFromXml(valueXml, &valueOffset); } else if (XmlRpcUtil::nextTagIs(NIL_TAG, valueXml, offset, &emptyTag)) { _type = TypeNil; result = true; } else if (XmlRpcUtil::nextTagIs(BOOLEAN_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = false; result = true; } else result = boolFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(BOOLEAN_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(I4_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = 0; result = true; } else result = intFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(I4_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(INT_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = 0; result = true; } else result = intFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(INT_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(DOUBLE_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = 0.0; result = true; } else result = doubleFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(DOUBLE_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(STRING_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) { *this = ""; result = true; } else result = stringFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(STRING_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(DATETIME_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = false; else result = timeFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(DATETIME_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(BASE64_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = binaryFromXml("", 0); else result = binaryFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(BASE64_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(ARRAY_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = false; else result = arrayFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(ARRAY_TAG, valueXml, offset); } else if (XmlRpcUtil::nextTagIs(STRUCT_TAG, valueXml, offset, &emptyTag)) { if (emptyTag) result = false; else result = structFromXml(valueXml, offset) && XmlRpcUtil::nextTagIsEnd(STRUCT_TAG, valueXml, offset); } // Unrecognized tag after or no if ( ! result || ! XmlRpcUtil::nextTagIsEnd(VALUE_TAG, valueXml, offset)) { *offset = savedOffset; return false; } return true; } // Encode the Value in xml std::string XmlRpcValue::toXml() const { switch (_type) { case TypeNil: return nilToXml(); case TypeBoolean: return boolToXml(); case TypeInt: return intToXml(); case TypeDouble: return doubleToXml(); case TypeString: return stringToXml(); case TypeDateTime: return timeToXml(); case TypeBase64: return binaryToXml(); case TypeArray: return arrayToXml(); case TypeStruct: return structToXml(); default: break; } return std::string(); // Invalid value } // Boolean bool XmlRpcValue::boolFromXml(std::string const& valueXml, int* offset) { const char* valueStart = valueXml.c_str() + *offset; char* valueEnd; long ivalue = strtol(valueStart, &valueEnd, 10); if (valueEnd == valueStart || (ivalue != 0 && ivalue != 1)) return false; _type = TypeBoolean; _value.asBool = (ivalue == 1); *offset += int(valueEnd - valueStart); return true; } std::string XmlRpcValue::nilToXml() const { return ""; } std::string XmlRpcValue::boolToXml() const { static std::string booleanTrueXml("1"); static std::string booleanFalseXml("0"); return _value.asBool ? booleanTrueXml : booleanFalseXml; } // Int bool XmlRpcValue::intFromXml(std::string const& valueXml, int* offset) { const char* valueStart = valueXml.c_str() + *offset; char* valueEnd; long ivalue = strtol(valueStart, &valueEnd, 10); if (valueEnd == valueStart) return false; _type = TypeInt; _value.asInt = int(ivalue); *offset += int(valueEnd - valueStart); return true; } std::string XmlRpcValue::intToXml() const { char buf[256]; snprintf(buf, sizeof(buf)-1, "%d", _value.asInt); buf[sizeof(buf)-1] = 0; return std::string(buf); } // Double bool XmlRpcValue::doubleFromXml(std::string const& valueXml, int* offset) { const char* valueStart = valueXml.c_str() + *offset; char* valueEnd; double dvalue = strtod(valueStart, &valueEnd); if (valueEnd == valueStart) return false; _type = TypeDouble; _value.asDouble = dvalue; *offset += int(valueEnd - valueStart); return true; } std::string XmlRpcValue::doubleToXml() const { char fmtbuf[256], buf[256]; snprintf(fmtbuf, sizeof(fmtbuf)-1, "%s", getDoubleFormat().c_str()); fmtbuf[sizeof(fmtbuf)-1] = 0; snprintf(buf, sizeof(buf)-1, fmtbuf, _value.asDouble); buf[sizeof(buf)-1] = 0; return std::string(buf); } // String bool XmlRpcValue::stringFromXml(std::string const& valueXml, int* offset) { size_t valueEnd = valueXml.find('<', *offset); if (valueEnd == std::string::npos) return false; // No end tag; _type = TypeString; _value.asString = new std::string(XmlRpcUtil::xmlDecode(valueXml.substr(*offset, valueEnd-*offset))); *offset += int(_value.asString->length()); return true; } std::string XmlRpcValue::stringToXml() const { return std::string("") + XmlRpcUtil::xmlEncode(*_value.asString) + std::string(""); } // DateTime (stored as a struct tm) bool XmlRpcValue::timeFromXml(std::string const& valueXml, int* offset) { size_t valueEnd = valueXml.find('<', *offset); if (valueEnd == std::string::npos) return false; // No end tag; std::string stime = valueXml.substr(*offset, valueEnd-*offset); struct tm t; if (sscanf(stime.c_str(),"%4d%2d%2dT%2d:%2d:%2d",&t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec) != 6) return false; t.tm_isdst = -1; _type = TypeDateTime; _value.asTime = new struct tm(t); *offset += int(stime.length()); return true; } std::string XmlRpcValue::timeToXml() const { struct tm* t = _value.asTime; char buf[40]; snprintf(buf, sizeof(buf)-1, "%04d%02d%02dT%02d:%02d:%02d", (1900 + t->tm_year), (1 + t->tm_mon) & 0xFF, (t->tm_mday & 0xFF), (t->tm_hour & 0xFF), (t->tm_min & 0xFF), (t->tm_sec & 0xFF) ); buf[sizeof(buf)-1] = 0; return std::string("") + buf + std::string(""); } // Base64 bool XmlRpcValue::binaryFromXml(std::string const& valueXml, int* offset) { size_t valueEnd = valueXml.find('<', *offset); if (valueEnd == std::string::npos) return false; // No end tag; _type = TypeBase64; std::string asString = valueXml.substr(*offset, valueEnd-*offset); _value.asBinary = new BinaryData(); // check whether base64 encodings can contain chars xml encodes... // convert from base64 to binary int iostatus = 0; xmlrpc_base64 decoder; std::back_insert_iterator ins = std::back_inserter(*(_value.asBinary)); decoder.get(asString.begin(), asString.end(), ins, iostatus); *offset += int(asString.length()); return true; } std::string XmlRpcValue::binaryToXml() const { // convert to base64 std::vector base64data; int iostatus = 0; xmlrpc_base64 encoder; std::back_insert_iterator > ins = std::back_inserter(base64data); encoder.put(_value.asBinary->begin(), _value.asBinary->end(), ins, iostatus, xmlrpc_base64<>::crlf()); // Wrap with xml std::string xml = ""; xml.append(base64data.begin(), base64data.end()); xml += ""; return xml; } // Array bool XmlRpcValue::arrayFromXml(std::string const& valueXml, int* offset) { bool emptyTag; if ( ! XmlRpcUtil::nextTagIs(DATA_TAG, valueXml, offset, &emptyTag)) return false; _type = TypeArray; _value.asArray = new ValueArray; if ( ! emptyTag) { XmlRpcValue v; while (v.fromXml(valueXml, offset)) _value.asArray->push_back(v); // copy... // Skip the trailing (void) XmlRpcUtil::nextTagIsEnd(DATA_TAG, valueXml, offset); } return true; } // In general, its preferable to generate the xml of each element of the // array as it is needed rather than glomming up one big string. std::string XmlRpcValue::arrayToXml() const { std::string xml = ""; int s = int(_value.asArray->size()); for (int i=0; iat(i).toXml(); xml += ""; return xml; } // Struct bool XmlRpcValue::structFromXml(std::string const& valueXml, int* offset) { _type = TypeStruct; _value.asStruct = new ValueStruct; std::string name; bool emptyTag; while (XmlRpcUtil::nextTagIs(MEMBER_TAG, valueXml, offset, &emptyTag)) { if ( ! emptyTag) { if (XmlRpcUtil::parseTag(NAME_TAG, valueXml, offset, name)) { // value XmlRpcValue val(valueXml, offset); if ( ! val.valid()) { invalidate(); return false; } const std::pair p(name, val); _value.asStruct->insert(p); (void) XmlRpcUtil::nextTagIsEnd(MEMBER_TAG, valueXml, offset); } } } return true; } // In general, its preferable to generate the xml of each element // as it is needed rather than glomming up one big string. std::string XmlRpcValue::structToXml() const { std::string xml = ""; ValueStruct::const_iterator it; for (it=_value.asStruct->begin(); it!=_value.asStruct->end(); ++it) { xml += ""; xml += XmlRpcUtil::xmlEncode(it->first); xml += ""; xml += it->second.toXml(); xml += ""; } xml += ""; return xml; } // Write the value without xml encoding it std::ostream& XmlRpcValue::write(std::ostream& os) const { switch (_type) { default: break; case TypeBoolean: os << _value.asBool; break; case TypeInt: os << _value.asInt; break; case TypeDouble: os << _value.asDouble; break; case TypeString: os << *_value.asString; break; case TypeDateTime: { struct tm* t = _value.asTime; char buf[20]; snprintf(buf, sizeof(buf)-1, "%4d%02d%02dT%02d:%02d:%02d", t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec); buf[sizeof(buf)-1] = 0; os << buf; break; } case TypeBase64: { int iostatus = 0; std::ostreambuf_iterator out(os); xmlrpc_base64 encoder; encoder.put(_value.asBinary->begin(), _value.asBinary->end(), out, iostatus, xmlrpc_base64<>::crlf()); break; } case TypeArray: { int s = int(_value.asArray->size()); os << '{'; for (int i=0; i 0) os << ','; _value.asArray->at(i).write(os); } os << '}'; break; } case TypeStruct: { os << '['; ValueStruct::const_iterator it; for (it=_value.asStruct->begin(); it!=_value.asStruct->end(); ++it) { if (it!=_value.asStruct->begin()) os << ','; os << it->first << ':'; it->second.write(os); } os << ']'; break; } } return os; } } // namespace XmlRpc // ostream std::ostream& operator<<(std::ostream& os, XmlRpc::XmlRpcValue& v) { // If you want to output in xml format: //return os << v.toXml(); return v.write(os); } fldigi-4.2.05/src/xmlrpcpp/XmlRpcServerMethod.cpp0000664000175000017500000000216214532252172016664 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcServerMethod.h" #include "XmlRpcServer.h" namespace XmlRpc { XmlRpcServerMethod::XmlRpcServerMethod(std::string const& name, XmlRpcServer* server) { _name = name; _server = server; if (_server) _server->addMethod(this); } XmlRpcServerMethod::~XmlRpcServerMethod() { if (_server) _server->removeMethod(this); } } // namespace XmlRpc fldigi-4.2.05/src/xmlrpcpp/XmlRpcSocket.cpp0000664000175000017500000001231414611711171015502 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcSocket.h" #include "XmlRpcUtil.h" #if defined(_WINDOWS) #undef _WINSOCKAPI_ # include # include # include //typedef int socklen_t; //# pragma lib(WS2_32.lib) // Updates to MXE require conditional test before assignment to // prevent duplicate defines. #undef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #undef ETIMEDOUT #define ETIMEDOUT WSAETIMEDOUT #include "compat.h" #else extern "C" { # include # include # include # include # include # include # include # include # include # include } #endif // _WINDOWS using namespace XmlRpc; // One-time initializations static bool initialized = false; static void initialize() { initialized = true; #if defined(_WINDOWS) { WORD wVersionRequested = MAKEWORD( 2, 0 ); WSADATA wsaData; WSAStartup(wVersionRequested, &wsaData); atexit((void(*)(void)) WSACleanup); } #else { // Ignore SIGPIPE (void) signal(SIGPIPE, SIG_IGN); } #endif // _WINDOWS } // These errors are not considered fatal for an IO operation; the operation will be re-tried. bool XmlRpcSocket::nonFatalError() { int err = XmlRpcSocket::getError(); return (err == EINPROGRESS || #if defined(EAGAIN) err == EAGAIN || #endif #if defined(EINTR) err == EINTR || #endif err == EWOULDBLOCK); } XmlRpcSocket::Socket XmlRpcSocket::socket() { if ( ! initialized) initialize(); return ::socket(AF_INET, SOCK_STREAM, 0); } void XmlRpcSocket::close(XmlRpcSocket::Socket fd) { XmlRpcUtil::log(4, "XmlRpcSocket::close: fd %d.", fd); #if defined(_WINDOWS) closesocket(fd); #else ::close(fd); #endif // _WINDOWS } bool XmlRpcSocket::setNonBlocking(XmlRpcSocket::Socket fd) { #if defined(_WINDOWS) unsigned long flag = 1; return (ioctlsocket(fd, FIONBIO, &flag) == 0); #else return (fcntl(fd, F_SETFL, O_NONBLOCK) == 0); #endif // _WINDOWS } bool XmlRpcSocket::setReuseAddr(XmlRpcSocket::Socket fd) { // Allow this port to be re-bound immediately so server re-starts are not delayed int sflag = 1; return (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&sflag, sizeof(sflag)) == 0); } // Bind to a specified port bool XmlRpcSocket::bind(XmlRpcSocket::Socket fd, int port) { struct sockaddr_in saddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons((u_short) port); return (::bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) == 0); } // Set socket in listen mode bool XmlRpcSocket::listen(XmlRpcSocket::Socket fd, int backlog) { return (::listen(fd, backlog) == 0); } XmlRpcSocket::Socket XmlRpcSocket::accept(XmlRpcSocket::Socket fd) { struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); return ::accept(fd, (struct sockaddr*)&addr, &addrlen); } // Connect a socket to a server (from a client) bool XmlRpcSocket::connect(XmlRpcSocket::Socket fd, std::string& host, int port) { struct sockaddr_in saddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; struct hostent *hp = gethostbyname(host.c_str()); if (hp == 0) return false; saddr.sin_family = hp->h_addrtype; memcpy(&saddr.sin_addr, hp->h_addr, hp->h_length); saddr.sin_port = htons((u_short) port); // For asynch operation, this will return EWOULDBLOCK (windows) or // EINPROGRESS (linux) and we just need to wait for the socket to be writable... int result = ::connect(fd, (struct sockaddr *)&saddr, sizeof(saddr)); return result == 0 || nonFatalError(); } // Get the port of a bound socket int XmlRpcSocket::getPort(XmlRpcSocket::Socket socket) { struct sockaddr_in saddr; socklen_t saddr_len = sizeof(saddr); int port; int result = ::getsockname(socket, (sockaddr*) &saddr, &saddr_len); if (result != 0) { port = -1; } else { port = ntohs(saddr.sin_port); } return port; } // Returns last errno int XmlRpcSocket::getError() { #if defined(_WINDOWS) return WSAGetLastError(); #else return errno; #endif } // Returns message corresponding to last errno std::string XmlRpcSocket::getErrorMsg() { return getErrorMsg(getError()); } // Returns message corresponding to errno... well, it should anyway std::string XmlRpcSocket::getErrorMsg(int error) { char err[60]; snprintf(err,sizeof(err),"error %d", error); return std::string(err); } fldigi-4.2.05/src/xmlrpcpp/XmlRpcClient.cpp0000664000175000017500000003700614611711171015475 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "XmlRpcClient.h" #include "XmlRpcSocket.h" #include "XmlRpc.h" #include "XmlRpcBase64.h" // For HTTP authentication encoding #include #include #include #include #include using namespace XmlRpc; using namespace std; // Static data const char REQUEST_BEGIN[] = "\r\n"; const char REQUEST_BEGIN_METHODNAME[] = ""; const char REQUEST_END_METHODNAME[] = "\r\n"; const char PARAMS_TAG[] = ""; const char PARAMS_ETAG[] = ""; const char PARAM_TAG[] = ""; const char PARAM_ETAG[] = ""; const char REQUEST_END[] = "\r\n"; XmlRpcClient::XmlRpcClient(const char* host, int port, const char* uri/*=0*/) { XmlRpcUtil::log(1, "XmlRpcClient new client: host %s, port %d.", host, port); _host = host; _port = port; if (uri && *uri) _uri = uri; else _uri = "/RPC2"; _connectionState = NO_CONNECTION; _executing = false; _eof = false; // Default to keeping the connection open until an explicit close is done setKeepOpen(); } XmlRpcClient::XmlRpcClient(const char* host, int port, const char* login, const char* password, const char* uri/*=0*/) { XmlRpcUtil::log(1, "XmlRpcClient new client: host %s, port %d, login %s.", host, port, login); _host = host; _port = port; _login = login ? login : ""; _password = password ? password : ""; _uri = uri ? uri : "/RPC2"; _connectionState = NO_CONNECTION; _executing = false; _eof = false; // Default to keeping the connection open until an explicit close is done setKeepOpen(); } XmlRpcClient::~XmlRpcClient() { XmlRpcUtil::log(1, "XmlRpcClient dtor client: host %s, port %d.", _host.c_str(), _port); if (_connectionState != NO_CONNECTION) close(); } // Close the owned fd void XmlRpcClient::close() { XmlRpcUtil::log(4, "XmlRpcClient::close: fd %d.", getfd()); _connectionState = NO_CONNECTION; _disp.exit(); _disp.removeSource(this); XmlRpcSource::close(); } // Clear the referenced flag even if exceptions or errors occur. struct ClearFlagOnExit { ClearFlagOnExit(bool& flag) : _flag(flag) {} ~ClearFlagOnExit() { _flag = false; } bool& _flag; }; // Execute the named procedure on the remote server. // Params should be an array of the arguments for the method. // Returns true if the request was sent and a result received (although the result // might be a fault). bool XmlRpcClient::execute(const char* method, XmlRpcValue const& params, XmlRpcValue& result, double timeoutSeconds) { XmlRpcUtil::log(1, "XmlRpcClient::execute: method %s (_connectionState %d).", method, _connectionState); // This is not a thread-safe operation, if you want to do multithreading, use separate // clients for each thread. If you want to protect yourself from multiple threads // accessing the same client, replace this code with a real mutex. if (_executing) return false; _executing = true; ClearFlagOnExit cf(_executing); _sendAttempts = 0; _isFault = false; if ( ! setupConnection()) return false; if ( ! generateRequest(method, params)) return false; result.clear(); // Process until either a response is received or the timeout period passes _disp.work(timeoutSeconds); if (_connectionState != IDLE || ! parseResponse(result)) return false; XmlRpcUtil::log(1, "XmlRpcClient::execute: method %s completed.", method); _response.clear(); return true; } // XmlRpcSource interface implementation // Handle server responses. Called by the event dispatcher during execute. unsigned XmlRpcClient::handleEvent(unsigned eventType) { if (eventType == XmlRpcDispatch::Exception) { //if (XmlRpcSocket::nonFatalError()) // return (_connectionState == WRITE_REQUEST) // ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; if (_connectionState == WRITE_REQUEST && _bytesWritten == 0) XmlRpcUtil::error("Error in XmlRpcClient::handleEvent: could not connect to server (%s).", XmlRpcSocket::getErrorMsg().c_str()); else XmlRpcUtil::error("Error in XmlRpcClient::handleEvent (state %d): %s.", _connectionState, XmlRpcSocket::getErrorMsg().c_str()); return 0; } if (_connectionState == WRITE_REQUEST) if ( ! writeRequest()) return 0; if (_connectionState == READ_HEADER) if ( ! readHeader()) return 0; if (_connectionState == READ_RESPONSE) if ( ! readResponse()) return 0; // This should probably always ask for Exception events too return (_connectionState == WRITE_REQUEST) ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; } // Create the socket connection to the server if necessary bool XmlRpcClient::setupConnection() { // If an error occurred last time through, or if the server closed the connection, close our end if ((_connectionState != NO_CONNECTION && _connectionState != IDLE) || _eof) close(); _eof = false; if (_connectionState == NO_CONNECTION) if (! doConnect()) return false; // Prepare to write the request _connectionState = WRITE_REQUEST; _bytesWritten = 0; // Notify the dispatcher to listen on this source (calls handleEvent when the socket is writable) _disp.removeSource(this); // Make sure nothing is left over _disp.addSource(this, XmlRpcDispatch::WritableEvent | XmlRpcDispatch::Exception); return true; } // Connect to the xmlrpc server bool XmlRpcClient::doConnect() { XmlRpcSocket::Socket fd = XmlRpcSocket::socket(); if (fd == XmlRpcSocket::Invalid) { XmlRpcUtil::error("Error in XmlRpcClient::doConnect: Could not create socket (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(3, "XmlRpcClient::doConnect: fd %d.", fd); this->setfd(fd); // Don't block on connect/reads/writes if ( ! XmlRpcSocket::setNonBlocking(fd)) { this->close(); XmlRpcUtil::error("Error in XmlRpcClient::doConnect: Could not set socket to non-blocking IO mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } if ( ! XmlRpcSocket::connect(fd, _host, _port)) { this->close(); XmlRpcUtil::error("Error in XmlRpcClient::doConnect: Could not connect to server (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } return XmlRpcSource::doConnect(); } // Encode the request to call the specified method with the specified parameters into xml std::string XmlRpc::pname = "N/A"; void XmlRpc::set_pname(std::string pn) { XmlRpc::pname = pn; }; bool XmlRpcClient::generateRequest(const char* methodName, XmlRpcValue const& params) { std::string body = REQUEST_BEGIN; if (XmlRpc::pname != "N/A") { char pid[100]; snprintf(pid, sizeof(pid), "%s %d", XmlRpc::pname.c_str(), getpid()); body.append("\r\n"); } body.append(REQUEST_BEGIN_METHODNAME); body.append(methodName); body.append(REQUEST_END_METHODNAME); // If params is an array, each element is a separate parameter if (params.valid()) { body += PARAMS_TAG; if (params.getType() == XmlRpcValue::TypeArray) { for (int i=0; i base64data; int iostatus = 0; xmlrpc_base64 encoder; std::back_insert_iterator > ins = std::back_inserter(base64data); std::string authBuf = _login + ":" + _password; encoder.put(authBuf.begin(), authBuf.end(), ins, iostatus, xmlrpc_base64<>::crlf()); header += "Authorization: Basic "; std::string authEnc(base64data.begin(), base64data.end()); // handle pesky linefeed characters string::size_type lf; while ( (lf = authEnc.find("\r")) != string::npos ) { authEnc.erase(lf, 1); } while ( (lf = authEnc.find("\n")) != string::npos ) { authEnc.erase(lf, 1); } header += authEnc; header += "\r\n"; } header += "Content-Type: text/xml\r\nContent-length: "; sprintf(buff,"%d\r\n\r\n", static_cast(body.size())); return header + buff; } bool XmlRpcClient::writeRequest() { if (_bytesWritten == 0) XmlRpcUtil::log(5, "XmlRpcClient::writeRequest (attempt %d):\n%s\n", _sendAttempts+1, _request.c_str()); // Try to write the request if ( ! nbWrite(_request, &_bytesWritten)) { XmlRpcUtil::error("Error in XmlRpcClient::writeRequest: write error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(3, "XmlRpcClient::writeRequest: wrote %d of %d bytes.", _bytesWritten, _request.length()); // Wait for the result if (_bytesWritten == int(_request.length())) { _header = ""; _response = ""; _connectionState = READ_HEADER; } return true; } // Read the header from the response bool XmlRpcClient::readHeader() { // Read available data if ( ! nbRead(_header, &_eof) || (_eof && _header.length() == 0)) { // If we haven't read any data yet and this is a keep-alive connection, the server may // have timed out, so we try one more time. if (getKeepOpen() && _header.length() == 0 && _sendAttempts++ == 0) { XmlRpcUtil::log(4, "XmlRpcClient::readHeader: re-trying connection"); XmlRpcSource::close(); _connectionState = NO_CONNECTION; _eof = false; return setupConnection(); } XmlRpcUtil::error("Error in XmlRpcClient::readHeader: error while reading header (%s) on fd %d.", XmlRpcSocket::getErrorMsg().c_str(), getfd()); return false; } XmlRpcUtil::log(4, "XmlRpcClient::readHeader: client has read %d bytes", _header.length()); return parseHeader(); } bool XmlRpcClient::parseHeader() { char const *hp = _header.c_str(); // Start of header char const *ep = hp + _header.length(); // End of string char const *bp = 0; // Start of body char const *lp = 0; // Start of content-length value std::string const CONTINUE100("100 Continue"); int nc100 = int(CONTINUE100.length()); for (char const *cp = hp; (bp == 0) && (cp < ep); ++cp) { if ((ep - cp > 16) && (strncasecmp(cp, "Content-length: ", 16) == 0)) { lp = cp + 16; } else if ((ep - cp > 4) && (strncmp(cp, "\r\n\r\n", 4) == 0)) { if (cp - hp > nc100 && strncmp(cp-CONTINUE100.length(), CONTINUE100.c_str(), CONTINUE100.length()) == 0) cp += 3; else bp = cp + 4; } else if ((ep - cp > 2) && (strncmp(cp, "\n\n", 2) == 0)) { if (cp - hp > nc100 && strncmp(cp-CONTINUE100.length(), CONTINUE100.c_str(), CONTINUE100.length()) == 0) ++ cp; else bp = cp + 2; } } // If we haven't gotten the entire header yet, return (keep reading) if (bp == 0) { if (_eof) // EOF in the middle of a response is an error { XmlRpcUtil::error("Error in XmlRpcClient::readHeader: EOF while reading header"); return false; // Close the connection } return true; // Keep reading } // Decode content length if (lp == 0) { XmlRpcUtil::error("Error XmlRpcClient::readHeader: No Content-length specified"); return false; // We could try to figure it out by parsing as we read, but for now... } _contentLength = atoi(lp); if (_contentLength <= 0) { XmlRpcUtil::error("Error in XmlRpcClient::readHeader: Invalid Content-length specified (%d).", _contentLength); return false; } XmlRpcUtil::log(4, "client read content length: %d", _contentLength); // Otherwise copy non-header data to response buffer and set state to read response. _response = bp; _header = ""; // should parse out any interesting bits from the header (connection, etc)... _connectionState = READ_RESPONSE; return true; // Continue monitoring this source } bool XmlRpcClient::readResponse() { // If we dont have the entire response yet, read available data if (int(_response.length()) < _contentLength) { if ( ! nbRead(_response, &_eof)) { XmlRpcUtil::error("Error in XmlRpcClient::readResponse: read error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } // If we haven't gotten the entire _response yet, return (keep reading) if (int(_response.length()) < _contentLength) { if (_eof) { XmlRpcUtil::error("Error in XmlRpcClient::readResponse: EOF while reading response"); return false; } return true; } } // Otherwise, parse and return the result XmlRpcUtil::log(3, "XmlRpcClient::readResponse (read %d bytes)", _response.length()); XmlRpcUtil::log(5, "response:\n%s", _response.c_str()); _connectionState = IDLE; return false; // Stop monitoring this source (causes return from work) } // Convert the response xml into a result value bool XmlRpcClient::parseResponse(XmlRpcValue& result) { std::string r; _response.swap(r); // Parse response xml into result bool emptyParam; int offset = 0; if ( ! XmlRpcUtil::findTag("methodResponse",r,&offset,&emptyParam) || emptyParam) { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response - no methodResponse. Response:\n%s", r.c_str()); return false; } // Expect either ... or ... if (XmlRpcUtil::nextTagIs("params",r,&offset,&emptyParam) && XmlRpcUtil::nextTagIs("param",r,&offset,&emptyParam)) { if (emptyParam) { result = 0; // No result? } else if ( ! result.fromXml(r, &offset)) { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response value. Response:\n%s", r.c_str()); return false; } } else if (XmlRpcUtil::nextTagIs("fault",r,&offset,&emptyParam)) { _isFault = true; if (emptyParam || ! result.fromXml(r, &offset)) { result = 0; // No result? return false; } } else { XmlRpcUtil::error("Error in XmlRpcClient::parseResponse: Invalid response - no param or fault tag. Response:\n%s", r.c_str()); return false; } return result.valid(); } fldigi-4.2.05/src/xmlrpcpp/XmlRpcMutex.h0000664000175000017500000000334514532252172015030 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCMUTEX_H_ #define _XMLRPCMUTEX_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif namespace XmlRpc { //! A simple platform-independent mutex API implemented for posix and windows. class XmlRpcMutex { public: //! Construct a Mutex object. XmlRpcMutex() : _pMutex(0) {} //! Destroy a Mutex object. ~XmlRpcMutex(); //! Wait for the mutex to be available and then acquire the lock. void acquire(); //! Release the mutex. void release(); //! Utility class to acquire a mutex at construction and release it when destroyed. struct AutoLock { //! Acquire the mutex at construction AutoLock(XmlRpcMutex& m) : _m(m) { _m.acquire(); } //! Release at destruction ~AutoLock() { _m.release(); } //! The mutex being held XmlRpcMutex& _m; }; private: //! Native Mutex object void* _pMutex; }; // class XmlRpcMutex } // namespace XmlRpc #endif // _XMLRPCMUTEX_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcUtil.cpp0000664000175000017500000002004214611711171015164 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcUtil.h" #include #include #include #include #include #include "XmlRpc.h" using namespace XmlRpc; //#define USE_WINDOWS_DEBUG // To make the error and log messages go to VC++ debug output #ifdef USE_WINDOWS_DEBUG #define WIN32_LEAN_AND_MEAN #include #endif // Version id const char XmlRpc::XMLRPC_VERSION[] = "XMLRPC++ 0.8"; // Default log verbosity: 0 for no messages through 5 (writes everything) int XmlRpcLogHandler::_verbosity = 0; // Default log handler static class DefaultLogHandler : public XmlRpcLogHandler { public: void log(int level, const char* msg) { #ifdef USE_WINDOWS_DEBUG if (level <= _verbosity) { OutputDebugString(msg); OutputDebugString("\n"); } #else if (level <= _verbosity) std::cout << msg << std::endl; #endif } } defaultLogHandler; // Message log singleton XmlRpcLogHandler* XmlRpcLogHandler::_logHandler = &defaultLogHandler; // Default error handler static class DefaultErrorHandler : public XmlRpcErrorHandler { public: void error(const char* msg) { #ifdef USE_WINDOWS_DEBUG // OutputDebugString(msg); OutputDebugString("\n"); #else // std::cerr << msg << std::endl; #endif } } defaultErrorHandler; // Error handler singleton XmlRpcErrorHandler* XmlRpcErrorHandler::_errorHandler = &defaultErrorHandler; // Easy API for log verbosity int XmlRpc::getVerbosity() { return XmlRpcLogHandler::getVerbosity(); } void XmlRpc::setVerbosity(int level) { XmlRpcLogHandler::setVerbosity(level); } void XmlRpcUtil::log(int level, const char* fmt, ...) { if (level <= XmlRpcLogHandler::getVerbosity()) { va_list va; char buf[1024]; va_start( va, fmt); vsnprintf(buf,sizeof(buf)-1,fmt,va); buf[sizeof(buf)-1] = 0; XmlRpcLogHandler::getLogHandler()->log(level, buf); va_end(va); } } void XmlRpcUtil::error(const char* fmt, ...) { va_list va; va_start(va, fmt); char buf[1024]; vsnprintf(buf,sizeof(buf)-1,fmt,va); buf[sizeof(buf)-1] = 0; XmlRpcErrorHandler::getErrorHandler()->error(buf); va_end(va); } // Returns true if the tag is parsed. No attributes are parsed. // Sets val to the contents between and , or an empty string if is found. // Updates offset to char after bool XmlRpcUtil::parseTag(const char* tag, std::string const& xml, int* offset, std::string &val) { size_t nxml = xml.length(); if (*offset >= int(nxml)) return false; // Find or /> bool lastSlash = false; while (istart < nxml && xml[istart] != '>') { lastSlash = (xml[istart] == '/'); ++ istart; } if (istart == nxml) return false; val.clear(); if (lastSlash) // { *offset = int(istart+1); // 1 after > } else // Find { std::string etag = ""; size_t iend = xml.find(etag, istart); if (iend == std::string::npos) return false; *offset = int(iend + etag.length()); ++ istart; val = xml.substr(istart, iend-istart); } return true; } // Returns true if the tag is found and updates offset to the char after the tag bool XmlRpcUtil::findTag(const char* tag, std::string const& xml, int* offset, bool* emptyTag) { size_t nxml = xml.length(); if (*offset >= int(nxml)) return false; std::string stag = "<"; stag += tag; size_t istart = xml.find(stag, *offset); if (istart == std::string::npos) return false; istart += stag.length(); // Advance istart past > or />, skips attribs bool lastSlash = false; while (istart < nxml && xml[istart] != '>') { lastSlash = (xml[istart] == '/'); ++ istart; } if (istart == nxml) return false; *emptyTag = lastSlash; *offset = int(istart+1); // char after > return true; } // Returns true if the or is found at the specified offset (modulo any whitespace) // and updates offset to the char after the tag. *emptyTag is set to true if is found, false otherwise bool XmlRpcUtil::nextTagIs(const char* tag, std::string const& xml, int* offset, bool *emptyTag) { if (*offset >= int(xml.length())) return false; const char* cp = xml.c_str() + *offset; int nc = 0; while (*cp && isspace(*cp)) { ++cp; ++nc; } int len = int(strlen(tag)); if (*cp == '<' && (strncmp(cp+1, tag, len) == 0)) { cp += len + 1; if (*cp == '>') // { *offset += nc + len + 2; *emptyTag = false; return true; } while (*cp && isspace(*cp)) { ++cp; ++nc; } if (*cp == '/' && *(cp + 1) == '>') // { *offset += nc + len + 3; *emptyTag = true; return true; } } return false; } // Returns true if the next tag found at the specified offset is // and updates offset to the char after the tag. bool XmlRpcUtil::nextTagIsEnd(const char* tag, std::string const& xml, int* offset) { if (*offset >= int(xml.length())) return false; const char* cp = xml.c_str() + *offset; int nc = 0; while (*cp && *cp != '<') { ++cp; ++nc; } int len = int(strlen(tag)); if (*cp == '<' && *(cp+1) == '/' && (strncmp(cp+2, tag, len) == 0) && *(cp + len + 2) == '>') { *offset += nc + len + 3; return true; } return false; } // xml encodings (xml-encoded entities are preceded with '&') static const char AMP = '&'; static const char rawEntity[] = { '<', '>', '&', '\'', '\"', 0 }; static const char* xmlEntity[] = { "lt;", "gt;", "amp;", "apos;", "quot;", 0 }; static const int xmlEntLen[] = { 3, 3, 4, 5, 5 }; // Replace xml-encoded entities with the raw text equivalents. std::string XmlRpcUtil::xmlDecode(const std::string& encoded) { std::string::size_type iAmp = encoded.find(AMP); if (iAmp == std::string::npos) return encoded; std::string decoded(encoded, 0, iAmp); std::string::size_type iSize = encoded.size(); decoded.reserve(iSize); const char* ens = encoded.c_str(); while (iAmp != iSize) { if (encoded[iAmp] == AMP && iAmp+1 < iSize) { int iEntity; for (iEntity=0; xmlEntity[iEntity] != 0; ++iEntity) //if (encoded.compare(iAmp+1, xmlEntLen[iEntity], xmlEntity[iEntity]) == 0) if (strncmp(ens+iAmp+1, xmlEntity[iEntity], xmlEntLen[iEntity]) == 0) { decoded += rawEntity[iEntity]; iAmp += xmlEntLen[iEntity]+1; break; } if (xmlEntity[iEntity] == 0) // unrecognized sequence decoded += encoded[iAmp++]; } else { decoded += encoded[iAmp++]; } } return decoded; } // Replace raw text with xml-encoded entities. std::string XmlRpcUtil::xmlEncode(const std::string& raw) { std::string::size_type iRep = raw.find_first_of(rawEntity); if (iRep == std::string::npos) return raw; std::string encoded(raw, 0, iRep); std::string::size_type iSize = raw.size(); while (iRep != iSize) { int iEntity; for (iEntity=0; rawEntity[iEntity] != 0; ++iEntity) if (raw[iRep] == rawEntity[iEntity]) { encoded += AMP; encoded += xmlEntity[iEntity]; break; } if (rawEntity[iEntity] == 0) encoded += raw[iRep]; ++iRep; } return encoded; } fldigi-4.2.05/src/xmlrpcpp/XmlRpcValue.h0000664000175000017500000002721214532252172015001 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCVALUE_H_ #define _XMLRPCVALUE_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include #include #include namespace XmlRpc { enum xmlrpc_nil_t { nil }; //! A class to represent RPC arguments and results. //! Each XmlRpcValue object contains a typed value, //! where the type is determined by the initial value //! assigned to the object. // should probably refcount them... class XmlRpcValue { public: //! XmlRpcValue types enum Type { TypeInvalid, TypeNil, TypeBoolean, TypeInt, TypeUnsigned, TypeLongLong, TypeDouble, TypeString, TypeDateTime, TypeBase64, TypeArray, TypeStruct }; // Non-primitive types typedef std::vector BinaryData; typedef std::vector ValueArray; typedef std::map ValueStruct; // Constructors //! Construct an empty XmlRpcValue XmlRpcValue() : _type(TypeInvalid) { _value.asBinary = 0; } //! Construct an XmlRpcValue with a nil value XmlRpcValue(xmlrpc_nil_t value) : _type(TypeNil) { } //! Construct an XmlRpcValue with a bool value XmlRpcValue(bool value) : _type(TypeBoolean) { _value.asBool = value; } //! Construct an XmlRpcValue with an int value XmlRpcValue(int value) : _type(TypeInt) { _value.asInt = value; } XmlRpcValue(unsigned int value) : _type(TypeUnsigned) { _value.asUnsigned = value; } XmlRpcValue(long long value) : _type(TypeLongLong) { _value.asLongLong = value; } //! Construct an XmlRpcValue with a double value XmlRpcValue(double value) : _type(TypeDouble) { _value.asDouble = value; } //! Construct an XmlRpcValue with a string value XmlRpcValue(std::string const& value) : _type(TypeString) { _value.asString = new std::string(value); } //! Construct an XmlRpcValue with a string value. //! @param value A null-terminated (C) string. XmlRpcValue(const char* value) : _type(TypeString) { _value.asString = new std::string(value); } XmlRpcValue(BinaryData const& value) : _type(TypeBase64) { _value.asBinary = new BinaryData(value); } XmlRpcValue(ValueStruct const& value) : _type(TypeStruct) { _value.asStruct = new ValueStruct(value); } XmlRpcValue(ValueArray const& value) : _type(TypeArray) { _value.asArray = new ValueArray(value); } //! Construct an XmlRpcValue with a date/time value. //! @param value A pointer to a struct tm (see localtime) XmlRpcValue(struct tm* value) : _type(TypeDateTime) { _value.asTime = new struct tm(*value); } //! Construct an XmlRpcValue with a binary data value //! @param value A pointer to data //! @param nBytes The length of the data pointed to, in bytes XmlRpcValue(void* value, int nBytes) : _type(TypeBase64) { _value.asBinary = new BinaryData((char*)value, ((char*)value)+nBytes); } //! Construct from xml, beginning at *offset chars into the string, updates offset XmlRpcValue(std::string const& xml, int* offset) : _type(TypeInvalid) { if ( ! fromXml(xml,offset)) _type = TypeInvalid; } //! Copy constructor XmlRpcValue(XmlRpcValue const& rhs) : _type(TypeInvalid) { *this = rhs; } //! Destructor (make virtual if you want to subclass) /*virtual*/ ~XmlRpcValue() { invalidate(); } //! Erase the current value void clear() { invalidate(); } // Operators //! Assignment from one XmlRpcValue to this one. //! @param rhs The value in rhs is copied to this value. XmlRpcValue& operator=(XmlRpcValue const& rhs); //! Assign nil to this XmlRpcValue. XmlRpcValue& operator=(xmlrpc_nil_t const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign a bool to this XmlRpcValue. XmlRpcValue& operator=(bool const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign an int to this XmlRpcValue. XmlRpcValue& operator=(int const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign a double to this XmlRpcValue. XmlRpcValue& operator=(double const& rhs) { return operator=(XmlRpcValue(rhs)); } //! Assign a string to this XmlRpcValue. XmlRpcValue& operator=(const char* rhs) { return operator=(XmlRpcValue(std::string(rhs))); } //! Tests two XmlRpcValues for equality bool operator==(XmlRpcValue const& other) const; //! Tests two XmlRpcValues for inequality bool operator!=(XmlRpcValue const& other) const; //! Treat an XmlRpcValue as a bool. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeBoolean. operator bool&() { assertType(TypeBoolean); return _value.asBool; } operator bool() const { assertType(TypeBoolean); return _value.asBool; } //! Treat an XmlRpcValue as an int. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeInt. operator int&() { assertType(TypeInt); return _value.asInt; } operator int() const { assertType(TypeInt); return _value.asInt; } operator unsigned int&() { assertType(TypeUnsigned); return _value.asUnsigned; } operator unsigned int() const { assertType(TypeUnsigned); return _value.asUnsigned; } operator long long&() { assertType(TypeLongLong); return _value.asLongLong; } operator long long() const { assertType(TypeLongLong); return _value.asLongLong; } //! Treat an XmlRpcValue as a double. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeDouble. operator double&() { assertType(TypeDouble); return _value.asDouble; } operator double() const { assertType(TypeDouble); return _value.asDouble; } //! Treat an XmlRpcValue as a string. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeString. operator std::string&() { assertType(TypeString); return *_value.asString; } operator std::string const&() const { assertType(TypeString); return *_value.asString; } //! Access the BinaryData value. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeBase64. operator BinaryData&() { assertType(TypeBase64); return *_value.asBinary; } operator BinaryData const&() const { assertType(TypeBase64); return *_value.asBinary; } //! Access the DateTime value. //! Throws XmlRpcException if the value is initialized to //! a type that is not TypeDateTime. operator struct tm&() { assertType(TypeDateTime); return *_value.asTime; } operator struct tm const&() const { assertType(TypeDateTime); return *_value.asTime; } //! Const array value accessor. //! Access the ith value of the array. //! Throws XmlRpcException if the value is not an array or if the index i is //! not a valid index for the array. XmlRpcValue const& operator[](int i) const { assertArray(i+1); return _value.asArray->at(i); } //! Array value accessor. //! Access the ith value of the array, growing the array if necessary. //! Throws XmlRpcException if the value is not an array. XmlRpcValue& operator[](int i) { assertArray(i+1); return _value.asArray->at(i); } //! Struct entry accessor. //! Returns the value associated with the given entry, creating one if necessary. XmlRpcValue& operator[](std::string const& k) { assertStruct(); return (*_value.asStruct)[k]; } //! Struct entry accessor. //! Returns the value associated with the given entry, creating one if necessary. XmlRpcValue& operator[](const char* k) { assertStruct(); std::string s(k); return (*_value.asStruct)[s]; } //! Access the struct value map. //! Can be used to iterate over the entries in the map to find all defined entries. operator ValueStruct const&() { assertStruct(); return *_value.asStruct; } operator ValueArray const&() const { assertType(TypeArray); return *_value.asArray; } // Accessors //! Return true if the value has been set to something. bool valid() const { return _type != TypeInvalid; } //! Return the type of the value stored. \see Type. Type const &getType() const { return _type; } //! Return the size for string, base64, array, and struct values. int size() const; //! Specify the size for array values. Array values will grow beyond this size if needed. void setSize(int size) { assertArray(size); } //! Check for the existence of a struct member by name. bool hasMember(const std::string& name) const; //! Decode xml. Destroys any existing value. bool fromXml(std::string const& valueXml, int* offset); //! Encode the Value in xml std::string toXml() const; //! Write the value (no xml encoding) std::ostream& write(std::ostream& os) const; // Formatting //! Return the format used to write double values. static std::string const& getDoubleFormat() { return _doubleFormat; } //! Specify the format used to write double values. static void setDoubleFormat(const char* f) { _doubleFormat = f; } protected: // Clean up void invalidate(); // Type checking. Non-const versions coerce to the desired type if currently un-typed. void assertType(Type t) const; void assertType(Type t); void assertArray(int size) const; void assertArray(int size); void assertStruct(); // XML decoding bool boolFromXml(std::string const& valueXml, int* offset); bool intFromXml(std::string const& valueXml, int* offset); bool doubleFromXml(std::string const& valueXml, int* offset); bool stringFromXml(std::string const& valueXml, int* offset); bool timeFromXml(std::string const& valueXml, int* offset); bool binaryFromXml(std::string const& valueXml, int* offset); bool arrayFromXml(std::string const& valueXml, int* offset); bool structFromXml(std::string const& valueXml, int* offset); // XML encoding std::string nilToXml() const; std::string boolToXml() const; std::string intToXml() const; std::string doubleToXml() const; std::string stringToXml() const; std::string timeToXml() const; std::string binaryToXml() const; std::string arrayToXml() const; std::string structToXml() const; // Format strings static std::string _doubleFormat; // Type tag and values Type _type; // At some point I will split off Arrays and Structs into // separate ref-counted objects for more efficient copying. union { bool asBool; int asInt; unsigned int asUnsigned; long long asLongLong; double asDouble; struct tm* asTime; std::string* asString; BinaryData* asBinary; ValueArray* asArray; ValueStruct* asStruct; } _value; }; } // namespace XmlRpc std::ostream& operator<<(std::ostream& os, XmlRpc::XmlRpcValue& v); #endif // _XMLRPCVALUE_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcDispatch.cpp0000664000175000017500000001532014532252172016014 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcDispatch.h" #include "XmlRpcSource.h" #include "XmlRpcUtil.h" #include #include #if defined(__FreeBSD__) || defined(__OpenBSD__) # ifdef USE_FTIME # include # endif #else # include #endif // __FreeBSD__ #if defined(_WINDOWS) #undef _WINSOCKAPI_ # include # define USE_FTIME # if defined(_MSC_VER) # define timeb _timeb # define ftime _ftime # endif #else # include #endif // _WINDOWS using namespace XmlRpc; XmlRpcDispatch::XmlRpcDispatch() { _endTime = -1.0; _doClear = false; _inWork = false; } XmlRpcDispatch::~XmlRpcDispatch() { } // Monitor this source for the specified events and call its event handler // when the event occurs void XmlRpcDispatch::addSource(XmlRpcSource* source, unsigned mask) { _sources.push_back(MonitoredSource(source, mask)); } // Stop monitoring this source. Does not close the source. void XmlRpcDispatch::removeSource(XmlRpcSource* source) { for (SourceList::iterator it=_sources.begin(); it!=_sources.end(); ++it) if (it->getSource() == source) { _sources.erase(it); break; } } // Modify the types of events to watch for on this source void XmlRpcDispatch::setSourceEvents(XmlRpcSource* source, unsigned eventMask) { for (SourceList::iterator it=_sources.begin(); it!=_sources.end(); ++it) if (it->getSource() == source) { it->getMask() = eventMask; break; } } // Watch current set of sources and process events void XmlRpcDispatch::work(double timeoutSeconds) { // Compute end time double timeNow = getTime(); _endTime = (timeoutSeconds < 0.0) ? -1.0 : (timeNow + timeoutSeconds); _doClear = false; _inWork = true; // Only work while there is something to monitor while (_sources.size() > 0) { // Wait for and dispatch events if ( ! waitForAndProcessEvents(timeoutSeconds)) { _inWork = false; return; } // Check whether to clear all sources if (_doClear) { SourceList sourcesToClose; _sources.swap(sourcesToClose); for (SourceList::iterator it=sourcesToClose.begin(); it!=sourcesToClose.end(); ++it) { XmlRpcSource *src = it->getSource(); src->close(); } _doClear = false; } // Check whether end time has passed or exit has been called if (_endTime == 0.0) // Exit { break; } else if (_endTime > 0.0) // Check for timeout { double t = getTime(); if (t > _endTime) break; // Decrement timeout by elapsed time timeoutSeconds -= (t - timeNow); if (timeoutSeconds < 0.0) timeoutSeconds = 0.0; // Shouldn't happen but its fp math... timeNow = t; } } _inWork = false; } // Exit from work routine. Presumably this will be called from // one of the source event handlers. void XmlRpcDispatch::exit() { _endTime = 0.0; // Return from work asap } // Clear all sources from the monitored sources list void XmlRpcDispatch::clear() { if (_inWork) { _doClear = true; // Finish reporting current events before clearing } else { SourceList sourcesToClose; _sources.swap(sourcesToClose); for (SourceList::iterator it=sourcesToClose.begin(); it!=sourcesToClose.end(); ++it) it->getSource()->close(); } } // Time utility- return time in seconds double XmlRpcDispatch::getTime() { #ifdef USE_FTIME struct timeb tbuff; ftime(&tbuff); return ((double) tbuff.time + ((double)tbuff.millitm / 1000.0) + ((double) tbuff.timezone * 60)); #else struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); return (tv.tv_sec + tv.tv_usec / 1000000.0); #endif /* USE_FTIME */ } // Wait for I/O on any source, timeout, or interrupt signal. bool XmlRpcDispatch::waitForAndProcessEvents(double timeoutSeconds) { // Construct the sets of descriptors we are interested in fd_set inFd, outFd, excFd; FD_ZERO(&inFd); FD_ZERO(&outFd); FD_ZERO(&excFd); XmlRpcSocket::Socket maxFd = 0; for (SourceList::iterator it=_sources.begin(); it!=_sources.end(); ++it) { XmlRpcSocket::Socket fd = it->getSource()->getfd(); if (it->getMask() & ReadableEvent) FD_SET(fd, &inFd); if (it->getMask() & WritableEvent) FD_SET(fd, &outFd); if (it->getMask() & Exception) FD_SET(fd, &excFd); if (it->getMask() && fd > maxFd) maxFd = fd; } // Check for events int nEvents; if (_endTime < 0.0) { nEvents = select(int(maxFd+1), &inFd, &outFd, &excFd, NULL); } else { struct timeval tv; tv.tv_sec = (int)floor(timeoutSeconds); tv.tv_usec = ((int)floor(1000000.0 * (timeoutSeconds-floor(timeoutSeconds)))) % 1000000; nEvents = select(int(maxFd+1), &inFd, &outFd, &excFd, &tv); } if (nEvents < 0 && errno != EINTR) { XmlRpcUtil::error("Error in XmlRpcDispatch::work: error in select (%d).", nEvents); return false; } // Process events. Copy source list to avoid invalidating iterator by removing sources. SourceList s(_sources); for (SourceList::iterator it=s.begin(); it != s.end(); ++it) { XmlRpcSource* src = it->getSource(); XmlRpcSocket::Socket fd = src->getfd(); if (fd <= maxFd) { // handleEvent is called once per event type signalled unsigned newMask = 0; int nset = 0; if (FD_ISSET(fd, &inFd)) { newMask |= src->handleEvent(ReadableEvent); ++nset; } if (FD_ISSET(fd, &outFd)) { newMask |= src->handleEvent(WritableEvent); ++nset; } if (FD_ISSET(fd, &excFd)) { newMask |= src->handleEvent(Exception); ++nset; } // Some event occurred if (nset) { // This bit is not terribly efficient if many connections are active... if (newMask) { setSourceEvents(src, newMask); } else // Stop monitoring this one { removeSource(src); if ( ! src->getKeepOpen()) src->close(); } } } } return true; } fldigi-4.2.05/src/xmlrpcpp/XmlRpcServer.cpp0000664000175000017500000003451114611711171015523 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcServer.h" #include "XmlRpcServerConnection.h" #include "XmlRpcServerMethod.h" #include "XmlRpcSocket.h" #include "XmlRpcUtil.h" #include "XmlRpcException.h" #include "XmlRpc.h" #include using namespace XmlRpc; std::string XmlRpc::request_str = ""; std::string XmlRpc::client_id = ""; // Static data const char XmlRpcServer::METHODNAME_TAG[] = "methodName"; const char XmlRpcServer::PARAMS_TAG[] = "params"; const char XmlRpcServer::PARAM_TAG[] = "param"; const std::string XmlRpcServer::METHODNAME = "methodName"; const std::string XmlRpcServer::PARAMS = "params"; const std::string XmlRpcServer::FAULTCODE = "faultCode"; const std::string XmlRpcServer::FAULTSTRING = "faultString"; XmlRpcServer::XmlRpcServer() { _introspectionEnabled = false; _listMethods = 0; _methodHelp = 0; } XmlRpcServer::~XmlRpcServer() { this->shutdown(); _methods.clear(); delete _listMethods; delete _methodHelp; } // Add a command to the RPC server void XmlRpcServer::addMethod(XmlRpcServerMethod* method) { _methods[method->name()] = method; } // Remove a command from the RPC server void XmlRpcServer::removeMethod(XmlRpcServerMethod* method) { MethodMap::iterator i = _methods.find(method->name()); if (i != _methods.end()) _methods.erase(i); } // Remove a command from the RPC server by name void XmlRpcServer::removeMethod(const std::string& methodName) { MethodMap::iterator i = _methods.find(methodName); if (i != _methods.end()) _methods.erase(i); } // Look up a method by name XmlRpcServerMethod* XmlRpcServer::findMethod(const std::string& name) const { MethodMap::const_iterator i = _methods.find(name); if (i == _methods.end()) return 0; return i->second; } // Create a socket, bind to the specified port, and // set it in listen mode to make it available for clients. bool XmlRpcServer::bindAndListen(int port, int backlog /*= 5*/) { XmlRpcSocket::Socket fd = XmlRpcSocket::socket(); if (XmlRpcSocket::Invalid == fd) { XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not create socket (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } this->setfd(fd); // Don't block on reads/writes if ( ! XmlRpcSocket::setNonBlocking(fd)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not set socket to non-blocking input mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } // Allow this port to be re-bound immediately so server re-starts are not delayed if ( ! XmlRpcSocket::setReuseAddr(fd)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not set SO_REUSEADDR socket option (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } // Bind to the specified port on the default interface if ( ! XmlRpcSocket::bind(fd, port)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not bind to specified port (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } // Set in listening mode if ( ! XmlRpcSocket::listen(fd, backlog)) { this->close(); XmlRpcUtil::error("XmlRpcServer::bindAndListen: Could not set socket in listening mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(2, "XmlRpcServer::bindAndListen: server listening on port %d fd %d", port, fd); // Notify the dispatcher to listen on this source when we are in work() _disp.addSource(this, XmlRpcDispatch::ReadableEvent); return true; } // Get port number that this server is listening on int XmlRpcServer::getPort(void) const { return XmlRpcSocket::getPort(getfd()); } // Process client requests for the specified time (in seconds) void XmlRpcServer::work(double timeSeconds) { XmlRpcUtil::log(2, "XmlRpcServer::work: waiting for a connection"); _disp.work(timeSeconds); } // Handle input on the server socket by accepting the connection // and reading the rpc request. unsigned XmlRpcServer::handleEvent(unsigned mask) { acceptConnection(); return XmlRpcDispatch::ReadableEvent; // Continue to monitor this fd } // Accept a client connection request and create a connection to // handle method calls from the client. void XmlRpcServer::acceptConnection() { XmlRpcSocket::Socket s = XmlRpcSocket::accept(this->getfd()); XmlRpcUtil::log(2, "XmlRpcServer::acceptConnection: socket %d", s); if (XmlRpcSocket::Invalid == s) { //this->close(); XmlRpcUtil::error("XmlRpcServer::acceptConnection: Could not accept connection (%s).", XmlRpcSocket::getErrorMsg().c_str()); } else if ( ! XmlRpcSocket::setNonBlocking(s)) { XmlRpcSocket::close(s); XmlRpcUtil::error("XmlRpcServer::acceptConnection: Could not set socket to non-blocking input mode (%s).", XmlRpcSocket::getErrorMsg().c_str()); } else // Notify the dispatcher to listen for input on this source when we are in work() { XmlRpcUtil::log(2, "XmlRpcServer::acceptConnection: creating a connection"); XmlRpcServerConnection* c = this->createConnection(s); if (c) this->dispatchConnection(c); } } // Create a new connection object for processing requests from a specific client. XmlRpcServerConnection* XmlRpcServer::createConnection(XmlRpcSocket::Socket s) { // Specify that the connection object be deleted when it is closed return new XmlRpcServerConnection(s, this, true); } // Hand off a new connection to a dispatcher void XmlRpcServer::dispatchConnection(XmlRpcServerConnection* sc) { _disp.addSource(sc, XmlRpcDispatch::ReadableEvent); } // Remove a connection. Called by the connection when it closes down. void XmlRpcServer::removeConnection(XmlRpcServerConnection* sc) { _disp.removeSource(sc); } // Stop processing client requests void XmlRpcServer::exit() { _disp.exit(); } // Close the server socket file descriptor and stop monitoring connections void XmlRpcServer::shutdown() { // This closes and destroys all connections as well as closing this socket _disp.clear(); } // Introspection support static const std::string LIST_METHODS("system.listMethods"); static const std::string METHOD_HELP("system.methodHelp"); static const std::string MULTICALL("system.multicall"); // List all methods available on a server class ListMethods : public XmlRpcServerMethod { public: ListMethods(XmlRpcServer* s) : XmlRpcServerMethod(LIST_METHODS, s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { _server->listMethods(result); } std::string help() { return std::string("List all methods available on a server as an array of strings"); } }; // Retrieve the help string for a named method class MethodHelp : public XmlRpcServerMethod { public: MethodHelp(XmlRpcServer* s) : XmlRpcServerMethod(METHOD_HELP, s) {} void execute(XmlRpcValue& params, XmlRpcValue& result) { if (params[0].getType() != XmlRpcValue::TypeString) throw XmlRpcException(METHOD_HELP + ": Invalid argument type"); XmlRpcServerMethod* m = _server->findMethod(params[0]); if ( ! m) throw XmlRpcException(METHOD_HELP + ": Unknown method name"); result = m->help(); } std::string help() { return std::string("Retrieve the help string for a named method"); } }; // Specify whether introspection is enabled or not. Default is enabled. void XmlRpcServer::enableIntrospection(bool enabled) { if (_introspectionEnabled == enabled) return; _introspectionEnabled = enabled; if (enabled) { if ( ! _listMethods) { _listMethods = new ListMethods(this); _methodHelp = new MethodHelp(this); } else { addMethod(_listMethods); addMethod(_methodHelp); } } else { removeMethod(LIST_METHODS); removeMethod(METHOD_HELP); } } void XmlRpcServer::listMethods(XmlRpcValue& result) { int i = 0; result.setSize(int(_methods.size())+1); for (MethodMap::iterator it=_methods.begin(); it != _methods.end(); ++it) result[i++] = it->first; // Multicall support is built into XmlRpcServer::executeRequest result[i] = MULTICALL; } // Parse the request, run the method, generate a response string. std::string XmlRpcServer::executeRequest(std::string const& request) { XmlRpcValue params, resultValue; std::string methodName = parseRequest(request, params); XmlRpcUtil::log(2, "XmlRpcServer::executeRequest: server calling method '%s'", methodName.c_str()); std::string response; try { if ( ! executeMethod(methodName, params, resultValue) && ! executeMulticall(methodName, params, resultValue)) response = generateFaultResponse(methodName + ": unknown method name"); else response = generateResponse(resultValue.toXml()); } catch (const XmlRpcException& fault) { XmlRpcUtil::log(2, "XmlRpcServer::executeRequest: fault %s.", fault.getMessage().c_str()); response = generateFaultResponse(fault.getMessage(), fault.getCode()); } return response; } // Parse the method name and the argument values from the request. static std::string id_str = "execute(params, result); // Ensure a valid result value if ( ! result.valid()) result = std::string(); return true; } // Execute multiple calls and return the results in an array. bool XmlRpcServer::executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result) { if (methodName != MULTICALL) return false; // There ought to be 1 parameter, an array of structs if (params.size() != 1 || params[0].getType() != XmlRpcValue::TypeArray) throw XmlRpcException(MULTICALL + ": Invalid argument (expected an array)"); int nc = params[0].size(); result.setSize(nc); for (int i=0; i\r\n" "\r\n\t"; const char RESPONSE_2[] = "\r\n\r\n"; std::string body = RESPONSE_1 + resultXml + RESPONSE_2; std::string header = generateHeader(body); std::string response = header + body; XmlRpcUtil::log(5, "XmlRpcServer::generateResponse:\n%s\n", response.c_str()); return response; } // Prepend http headers std::string XmlRpcServer::generateHeader(std::string const& body) { std::string header = "HTTP/1.1 200 OK\r\n" "Server: "; header += XMLRPC_VERSION; header += "\r\n" "Content-Type: text/xml\r\n" "Content-length: "; char buffLen[40]; sprintf(buffLen,"%d\r\n\r\n", static_cast(body.size())); return header + buffLen; } std::string XmlRpcServer::generateFaultResponse(std::string const& errorMsg, int errorCode) { const char RESPONSE_1[] = "\r\n" "\r\n\t"; const char RESPONSE_2[] = "\r\n\r\n"; XmlRpcValue faultStruct; faultStruct[FAULTCODE] = errorCode; faultStruct[FAULTSTRING] = errorMsg; std::string body = RESPONSE_1 + faultStruct.toXml() + RESPONSE_2; std::string header = generateHeader(body); return header + body; } fldigi-4.2.05/src/xmlrpcpp/XmlRpcServerMethod.h0000664000175000017500000000353514532252172016336 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSERVERMETHOD_H_ #define _XMLRPCSERVERMETHOD_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include namespace XmlRpc { // Representation of a parameter or result value class XmlRpcValue; // The XmlRpcServer processes client requests to call RPCs class XmlRpcServer; //! Abstract class representing a single RPC method class XmlRpcServerMethod { public: //! Constructor XmlRpcServerMethod(std::string const& name, XmlRpcServer* server = 0); //! Destructor virtual ~XmlRpcServerMethod(); //! Returns the name of the method std::string& name() { return _name; } //! Execute the method. Subclasses must provide a definition for this method. virtual void execute(XmlRpcValue& params, XmlRpcValue& result) = 0; //! Returns a help string for the method. //! Subclasses should define this method if introspection is being used. virtual std::string help() { return std::string(); } protected: std::string _name; XmlRpcServer* _server; }; } // namespace XmlRpc #endif // _XMLRPCSERVERMETHOD_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcDispatch.h0000664000175000017500000000646214532252172015470 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCDISPATCH_H_ #define _XMLRPCDISPATCH_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include namespace XmlRpc { // An RPC source represents a file descriptor to monitor class XmlRpcSource; //! An object which monitors file descriptors for events and performs //! callbacks when interesting events happen. class XmlRpcDispatch { public: //! Constructor XmlRpcDispatch(); ~XmlRpcDispatch(); //! Values indicating the type of events a source is interested in enum EventType { ReadableEvent = 1, //!< data available to read WritableEvent = 2, //!< connected/data can be written without blocking Exception = 4 //!< uh oh }; //! Monitor this source for the event types specified by the event mask //! and call its event handler when any of the events occur. //! @param source The source to monitor //! @param eventMask Which event types to watch for. \see EventType void addSource(XmlRpcSource* source, unsigned eventMask); //! Stop monitoring this source. //! @param source The source to stop monitoring //! The source socket is not closed. void removeSource(XmlRpcSource* source); //! Modify the types of events to watch for on this source void setSourceEvents(XmlRpcSource* source, unsigned eventMask); //! Watch current set of sources and process events for the specified //! duration (in seconds, -1 implies wait forever, or until exit is called) void work(double timeSeconds); //! Exit from work routine void exit(); //! Clear all sources from the monitored sources list. Sources are closed. void clear(); protected: //! Wait for I/O on any source, timeout, or interrupt signal. bool waitForAndProcessEvents(double timeoutSeconds); //! Returns current time in seconds since something double getTime(); // A source to monitor and what to monitor it for struct MonitoredSource { MonitoredSource(XmlRpcSource* src, unsigned mask) : _src(src), _mask(mask) {} XmlRpcSource* getSource() const { return _src; } unsigned& getMask() { return _mask; } XmlRpcSource* _src; unsigned _mask; }; // A list of sources to monitor typedef std::vector< MonitoredSource > SourceList; // Sources being monitored SourceList _sources; // When work should stop (-1 implies wait forever, or until exit is called) double _endTime; bool _doClear; bool _inWork; }; } // namespace XmlRpc #endif // _XMLRPCDISPATCH_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpc.h0000664000175000017500000000577214532252172014013 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPC_H_ #define _XMLRPC_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include "XmlRpcClient.h" #include "XmlRpcException.h" #include "XmlRpcServer.h" #include "XmlRpcServerMethod.h" #include "XmlRpcValue.h" #include "XmlRpcUtil.h" namespace XmlRpc { //! An interface allowing custom handling of error message reporting. class XmlRpcErrorHandler { public: XmlRpcErrorHandler() {} virtual ~XmlRpcErrorHandler() {} //! Returns a pointer to the currently installed error handling object. static XmlRpcErrorHandler* getErrorHandler() { return _errorHandler; } //! Specifies the error handler. static void setErrorHandler(XmlRpcErrorHandler* eh) { _errorHandler = eh; } //! Report an error. Custom error handlers should define this method. virtual void error(const char* msg) = 0; protected: static XmlRpcErrorHandler* _errorHandler; }; //! An interface allowing custom handling of informational message reporting. class XmlRpcLogHandler { public: XmlRpcLogHandler() {} virtual ~XmlRpcLogHandler() {} //! Returns a pointer to the currently installed message reporting object. static XmlRpcLogHandler* getLogHandler() { return _logHandler; } //! Specifies the message handler. static void setLogHandler(XmlRpcLogHandler* lh) { _logHandler = lh; } //! Returns the level of verbosity of informational messages. 0 is no output, 5 is very verbose. static int getVerbosity() { return _verbosity; } //! Specify the level of verbosity of informational messages. 0 is no output, 5 is very verbose. static void setVerbosity(int v) { _verbosity = v; } //! Output a message. Custom error handlers should define this method. virtual void log(int level, const char* msg) = 0; protected: static XmlRpcLogHandler* _logHandler; static int _verbosity; }; //! Returns log message verbosity. This is short for XmlRpcLogHandler::getVerbosity() int getVerbosity(); //! Sets log message verbosity. This is short for XmlRpcLogHandler::setVerbosity(level) void setVerbosity(int level); //! Version identifier extern const char XMLRPC_VERSION[]; } // namespace XmlRpc #endif // _XMLRPC_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcServer.h0000664000175000017500000001276514611711171015177 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSERVER_H_ #define _XMLRPCSERVER_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include #include "XmlRpcDispatch.h" #include "XmlRpcSource.h" namespace XmlRpc { extern std::string request_str; extern std::string client_id; // An abstract class supporting XML RPC methods class XmlRpcServerMethod; // Class representing connections to specific clients class XmlRpcServerConnection; // Class representing argument and result values class XmlRpcValue; //! A class to handle XML RPC requests class XmlRpcServer : public XmlRpcSource { public: //! Create a server object. XmlRpcServer(); //! Destructor. virtual ~XmlRpcServer(); //! Specify whether introspection is enabled or not. Default is not enabled. void enableIntrospection(bool enabled=true); //! Add a command to the RPC server void addMethod(XmlRpcServerMethod* method); //! Remove a command from the RPC server void removeMethod(XmlRpcServerMethod* method); //! Remove a command from the RPC server by name void removeMethod(const std::string& methodName); //! Look up a method by name XmlRpcServerMethod* findMethod(const std::string& name) const; //! Create a socket, bind to the specified port, and //! set it in listen mode to make it available for clients. //! @param port The port to bind and listen on (zero to choose an arbitrary port) bool bindAndListen(int port, int backlog = 5); //! Get the port number this server is listening on. int getPort(void) const; //! Process client requests for the specified time (in seconds) void work(double timeSeconds); //! Temporarily stop processing client requests and exit the work() method. void exit(); //! Close all connections with clients and the socket file descriptor void shutdown(); //! Introspection support void listMethods(XmlRpcValue& result); //! Parses the request xml, runs the method, generates the response (header+xml). //! Returns a fault response if an error occurs during method execution. virtual std::string executeRequest(std::string const& request); // XmlRpcSource interface implementation //! Handle client connection requests virtual unsigned handleEvent(unsigned eventType); //! Remove a connection from the dispatcher virtual void removeConnection(XmlRpcServerConnection*); protected: // Static data static const char METHODNAME_TAG[]; static const char PARAMS_TAG[]; static const char PARAM_TAG[]; static const std::string SYSTEM_MULTICALL; static const std::string METHODNAME; static const std::string PARAMS; static const std::string FAULTCODE; static const std::string FAULTSTRING; //! Accept a client connection request virtual void acceptConnection(); //! Create a new connection object for processing requests from a specific client. //! If the client is not authorized to connect, close the socket and return 0. virtual XmlRpcServerConnection* createConnection(XmlRpcSocket::Socket socket); //! Hand off a new connection object to a dispatcher. virtual void dispatchConnection(XmlRpcServerConnection* sc); //! Parse the methodName and parameters from the request. //! @returns the methodName std::string parseRequest(std::string const& request, XmlRpcValue& params); //! Execute a named method with the specified params. bool executeMethod(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); //! Execute multiple calls and return the results in an array. //! System.multicall implementation bool executeMulticall(const std::string& methodName, XmlRpcValue& params, XmlRpcValue& result); //! Construct a response from the result XML. std::string generateResponse(std::string const& resultXml); //! Construct a fault response. std::string generateFaultResponse(std::string const& msg, int errorCode = -1); //! Return the appropriate headers for the response. std::string generateHeader(std::string const& body); //! Whether the introspection API is supported by this server bool _introspectionEnabled; //! Event dispatcher XmlRpcDispatch _disp; //! Collection of methods. This could be a set keyed on method name if we wanted... typedef std::map< std::string, XmlRpcServerMethod* > MethodMap; //! Registered RPC methods. MethodMap _methods; //! List all registered RPC methods (only available if introspection is enabled) XmlRpcServerMethod* _listMethods; //! Return help string for a specified method (only available if introspection is enabled) XmlRpcServerMethod* _methodHelp; }; } // namespace XmlRpc #endif //_XMLRPCSERVER_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcUtil.h0000664000175000017500000000565314532252172014647 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCUTIL_H_ #define _XMLRPCUTIL_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #if defined(_MSC_VER) # define snprintf _snprintf # define vsnprintf _vsnprintf # define strcasecmp _stricmp # define strncasecmp _strnicmp #elif defined(__BORLANDC__) # define strcasecmp stricmp # define strncasecmp strnicmp #endif namespace XmlRpc { //! Utilities for XML parsing, encoding, and decoding and message handlers. class XmlRpcUtil { public: //! Parses the specified tag. No attributes are parsed, no validation is done. //! Sets val to the contents between and , or an empty string if is found. //! Returns true if the tag is parsed. Updates offset to char after static bool parseTag(const char* tag, std::string const& xml, int* offset, std::string &val); //! Returns true if the tag is found and updates offset to the char after the tag. //! If the tag is of the form , emptyTag is set to true. static bool findTag(const char* tag, std::string const& xml, int* offset, bool* emptyTag); //! Returns true if the tag is found at the specified offset (modulo any whitespace) //! and updates offset to the char after the tag. If an empty tag is found (eg, //! ), true is returned, offset is updated to be after the close of the tag, and //! emptyTag is set to true. static bool nextTagIs(const char* tag, std::string const& xml, int* offset, bool* emptyTag); //! Passes over the next tag found at the specified offset is , //! offset is updated to be after the close of the tag. //! Will skip over all characters until < is seen. static bool nextTagIsEnd(const char* tag, std::string const& xml, int* offset); //! Convert raw text to encoded xml. static std::string xmlEncode(const std::string& raw); //! Convert encoded xml to raw text static std::string xmlDecode(const std::string& encoded); //! Dump messages somewhere static void log(int level, const char* fmt, ...); //! Dump error messages somewhere static void error(const char* fmt, ...); }; } // namespace XmlRpc #endif // _XMLRPCUTIL_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcServerConnection.cpp0000664000175000017500000001575314532252172017555 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcServerConnection.h" #include "XmlRpcDispatch.h" #include "XmlRpcServer.h" #include "XmlRpcSocket.h" #include "XmlRpcUtil.h" #include #include #include #include using namespace XmlRpc; // The server delegates handling client requests to a serverConnection object. XmlRpcServerConnection::XmlRpcServerConnection(XmlRpcSocket::Socket fd, XmlRpcServer* server, bool deleteOnClose /*= false*/) : XmlRpcSource(fd, deleteOnClose) { XmlRpcUtil::log(2,"XmlRpcServerConnection: new socket %d.", fd); _server = server; _connectionState = READ_HEADER; _keepAlive = true; } XmlRpcServerConnection::~XmlRpcServerConnection() { XmlRpcUtil::log(4,"XmlRpcServerConnection dtor."); _server->removeConnection(this); } // Handle input on the server socket by accepting the connection // and reading the rpc request. Return true to continue to monitor // the socket for events, false to remove it from the dispatcher. unsigned XmlRpcServerConnection::handleEvent(unsigned /*eventType*/) { if (_connectionState == READ_HEADER) if ( ! readHeader()) return 0; if (_connectionState == READ_REQUEST) if ( ! readRequest()) return 0; if (_connectionState == WRITE_RESPONSE) if ( ! writeResponse()) return 0; return (_connectionState == WRITE_RESPONSE) ? XmlRpcDispatch::WritableEvent : XmlRpcDispatch::ReadableEvent; } bool XmlRpcServerConnection::readHeader() { // Read available data bool eof; if ( ! nbRead(_header, &eof)) { // Its only an error if we already have read some data if (_header.length() > 0) XmlRpcUtil::error("XmlRpcServerConnection::readHeader: error while reading header (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(4, "XmlRpcServerConnection::readHeader: read %d bytes.", _header.length()); char *hp = (char*)_header.c_str(); // Start of header char *ep = hp + _header.length(); // End of string char *bp = 0; // Start of body char *lp = 0; // Start of content-length value char *kp = 0; // Start of connection value for (char *cp = hp; (bp == 0) && (cp < ep); ++cp) { if ((ep - cp > 16) && (strncasecmp(cp, "Content-length: ", 16) == 0)) lp = cp + 16; else if ((ep - cp > 12) && (strncasecmp(cp, "Connection: ", 12) == 0)) kp = cp + 12; else if ((ep - cp > 4) && (strncmp(cp, "\r\n\r\n", 4) == 0)) bp = cp + 4; else if ((ep - cp > 2) && (strncmp(cp, "\n\n", 2) == 0)) bp = cp + 2; } // If we haven't gotten the entire header yet, return (keep reading) if (bp == 0) { // EOF in the middle of a request is an error, otherwise its ok if (eof) { XmlRpcUtil::log(4, "XmlRpcServerConnection::readHeader: EOF"); if (_header.length() > 0) XmlRpcUtil::error("XmlRpcServerConnection::readHeader: EOF while reading header"); return false; // Either way we close the connection } return true; // Keep reading } // Decode content length if (lp == 0) { XmlRpcUtil::error("XmlRpcServerConnection::readHeader: No Content-length specified"); return false; // We could try to figure it out by parsing as we read, but for now... } _contentLength = atoi(lp); if (_contentLength <= 0) { XmlRpcUtil::error("XmlRpcServerConnection::readHeader: Invalid Content-length specified (%d).", _contentLength); return false; } XmlRpcUtil::log(3, "XmlRpcServerConnection::readHeader: specified content length is %d.", _contentLength); // Otherwise copy non-header data to request buffer and set state to read request. _request = bp; // Parse out any interesting bits from the header (HTTP version, connection) _keepAlive = true; if (_header.find("HTTP/1.0") != std::string::npos) { if (kp == 0 || strncasecmp(kp, "keep-alive", 10) != 0) _keepAlive = false; // Default for HTTP 1.0 is to close the connection } else { if (kp != 0 && strncasecmp(kp, "close", 5) == 0) _keepAlive = false; } XmlRpcUtil::log(3, "KeepAlive: %d", _keepAlive); _header = ""; _connectionState = READ_REQUEST; return true; // Continue monitoring this source } bool XmlRpcServerConnection::readRequest() { // If we dont have the entire request yet, read available data if (int(_request.length()) < _contentLength) { bool eof; if ( ! nbRead(_request, &eof)) { XmlRpcUtil::error("XmlRpcServerConnection::readRequest: read error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } // If we haven't gotten the entire request yet, return (keep reading) if (int(_request.length()) < _contentLength) { if (eof) { XmlRpcUtil::error("XmlRpcServerConnection::readRequest: EOF while reading request"); return false; // Either way we close the connection } return true; } } // Otherwise, parse and dispatch the request XmlRpcUtil::log(3, "XmlRpcServerConnection::readRequest read %d bytes.", _request.length()); //XmlRpcUtil::log(5, "XmlRpcServerConnection::readRequest:\n%s\n", _request.c_str()); _connectionState = WRITE_RESPONSE; return true; // Continue monitoring this source } bool XmlRpcServerConnection::writeResponse() { if (_response.length() == 0) { executeRequest(); _bytesWritten = 0; if (_response.length() == 0) { XmlRpcUtil::error("XmlRpcServerConnection::writeResponse: empty response."); return false; } } // Try to write the response if ( ! nbWrite(_response, &_bytesWritten)) { XmlRpcUtil::error("XmlRpcServerConnection::writeResponse: write error (%s).",XmlRpcSocket::getErrorMsg().c_str()); return false; } XmlRpcUtil::log(3, "XmlRpcServerConnection::writeResponse: wrote %d of %d bytes.", _bytesWritten, _response.length()); // Prepare to read the next request if (_bytesWritten == int(_response.length())) { _header = ""; _request = ""; _response = ""; _connectionState = READ_HEADER; } return _keepAlive; // Continue monitoring this source if true } //! Helper method to execute the client request void XmlRpcServerConnection::executeRequest() { _response = _server->executeRequest(_request); } fldigi-4.2.05/src/xmlrpcpp/XmlRpcSource.h0000664000175000017500000000642214532252172015165 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCSOURCE_H_ #define _XMLRPCSOURCE_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include "XmlRpcSocket.h" namespace XmlRpc { //! Proxy for Ssl data to avoid including headers here. struct SslProxy; //! An RPC source represents a file descriptor to monitor class XmlRpcSource { public: //! Constructor //! @param fd The socket file descriptor to monitor. //! @param deleteOnClose If true, the object deletes itself when close is called. XmlRpcSource(XmlRpcSocket::Socket fd = XmlRpcSocket::Invalid, bool deleteOnClose = false); //! Destructor virtual ~XmlRpcSource(); //! Return the file descriptor being monitored. XmlRpcSocket::Socket getfd() const { return _fd; } //! Specify the file descriptor to monitor. void setfd(XmlRpcSocket::Socket fd) { _fd = fd; } //! Return whether the file descriptor should be kept open if it is no longer monitored. bool getKeepOpen() const { return _keepOpen; } //! Specify whether the file descriptor should be kept open if it is no longer monitored. void setKeepOpen(bool b=true) { _keepOpen = b; } //! Return whether ssl is enabled. bool getSslEnabled() const { return _sslEnabled; } //! Specify whether to enable ssl. Use getSslEnabled() to verify that Ssl is available. void setSslEnabled(bool b=true); //! Close the owned fd. If deleteOnClose was specified at construction, the object is deleted. virtual void close(); //! Return true to continue monitoring this source virtual unsigned handleEvent(unsigned eventType) = 0; protected: // Execution processing helpers virtual bool doConnect(); //! Read text from the source. Returns false on error. bool nbRead(std::string& s, bool *eof); //! Write text to the source. Returns false on error. bool nbWrite(std::string const& s, int *bytesSoFar); private: // Socket. This is an int for linux/unix, and unsigned on win32, and unsigned __int64 on win64. // Casting to int/long/unsigned on win64 is a bad idea. XmlRpcSocket::Socket _fd; // In the server, a new source (XmlRpcServerConnection) is created // for each connected client. When each connection is closed, the // corresponding source object is deleted. bool _deleteOnClose; // In the client, keep connections open if you intend to make multiple calls. bool _keepOpen; // Enable use of SSL bool _sslEnabled; // SSL data SslProxy *_ssl; }; } // namespace XmlRpc #endif //_XMLRPCSOURCE_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcException.h0000664000175000017500000000313114532252172015655 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCEXCEPTION_H_ #define _XMLRPCEXCEPTION_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #ifndef MAKEDEPEND # include #endif namespace XmlRpc { //! A class representing an error. //! If server methods throw this exception, a fault response is returned //! to the client. class XmlRpcException { public: //! Constructor //! @param message A descriptive error message //! @param code An integer error code XmlRpcException(const std::string& message, int code=-1) : _message(message), _code(code) {} //! Return the error message. const std::string& getMessage() const { return _message; } //! Return the error code. int getCode() const { return _code; } private: std::string _message; int _code; }; } #endif // _XMLRPCEXCEPTION_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcClient.h0000664000175000017500000001301114611711171015130 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _XMLRPCCLIENT_H_ #define _XMLRPCCLIENT_H_ #if defined(_MSC_VER) # pragma warning(disable:4786) // identifier was truncated in debug info #endif #include #include "XmlRpcDispatch.h" #include "XmlRpcSource.h" namespace XmlRpc { extern std::string pname; extern void set_pname(std::string pn); // Arguments and results are represented by XmlRpcValues class XmlRpcValue; //! A class to send XML RPC requests to a server and return the results. class XmlRpcClient : public XmlRpcSource { public: //! Construct a client to connect to the server at the specified host:port address //! @param host The name of the remote machine hosting the server, eg "myserver.mycompany.com" //! @param port The port on the remote machine where the server is listening //! @param uri An optional string to be sent as the URI in the HTTP GET header //! Note that the host is not a URL, do not prepend "http://" or other protocol specifiers. XmlRpcClient(const char* host, int port, const char* uri=0); //! Construct a client to connect to the server at the specified host:port address including HTTP authentication //! @param host The name of the remote machine hosting the server //! @param port The port on the remote machine where the server is listening //! @param login The username passed to the server //! @param pass The password passed to the server //! @param uri An optional string to be sent as the URI in the HTTP GET header XmlRpcClient(const char* host, int port, const char* login, const char* password, const char* uri=0); //! Destructor virtual ~XmlRpcClient(); //! Execute the named procedure on the remote server. //! @param method The name of the remote procedure to execute //! @param params An array of the arguments for the method //! @param result The result value to be returned to the client //! @param timeoutSeconds Seconds to wait for a response (defaults to forever) //! @return true if the request was sent and a result received //! (although the result might be a fault). //! //! Currently this is a synchronous (blocking) implementation (execute //! does not return until it receives a response or an error). Use isFault() //! to determine whether the result is a fault response. bool execute(const char* method, XmlRpcValue const& params, XmlRpcValue& result, double timeoutSeconds = -1); //! Returns true if the result of the last execute() was a fault response. bool isFault() const { return _isFault; } //! Return the host name of the server const char* const host() const { return _host.c_str(); } //! Return the port int port() const { return _port; } //! Return the URI const char* const uri() const { return _uri.c_str(); } // XmlRpcSource interface implementation //! Close the connection virtual void close(); //! Handle server responses. Called by the event dispatcher during execute. //! @param eventType The type of event that occurred. //! @see XmlRpcDispatch::EventType virtual unsigned handleEvent(unsigned eventType); protected: // Execution processing helpers virtual bool doConnect(); virtual bool setupConnection(); virtual bool generateRequest(const char* method, XmlRpcValue const& params); virtual std::string generateHeader(std::string const& body); virtual bool writeRequest(); virtual bool readHeader(); virtual bool parseHeader(); virtual bool readResponse(); virtual bool parseResponse(XmlRpcValue& result); // Possible IO states for the connection enum ClientConnectionState { NO_CONNECTION, CONNECTING, WRITE_REQUEST, READ_HEADER, READ_RESPONSE, IDLE }; ClientConnectionState _connectionState; // Server location std::string _host; std::string _uri; int _port; // Login information for HTTP authentication std::string _login; std::string _password; // The xml-encoded request, http header of response, and response xml std::string _request; std::string _header; std::string _response; // Number of times the client has attempted to send the request int _sendAttempts; // Number of bytes of the request that have been written to the socket so far int _bytesWritten; // True if we are currently executing a request. If you want to multithread, // each thread should have its own client. bool _executing; // True if the server closed the connection bool _eof; // True if a fault response was returned by the server bool _isFault; // Number of bytes expected in the response body (parsed from response header) int _contentLength; // Event dispatcher XmlRpcDispatch _disp; }; // class XmlRpcClient } // namespace XmlRpc #endif // _XMLRPCCLIENT_H_ fldigi-4.2.05/src/xmlrpcpp/XmlRpcSource.cpp0000664000175000017500000001125714611711171015517 00000000000000// ---------------------------------------------------------------------------- // // flxmlrpc Copyright (c) 2015 by W1HKJ, Dave Freese // // XmlRpc++ Copyright (c) 2002-2008 by Chris Morley // // This file is part of fldigi // // flxmlrpc is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "XmlRpcSource.h" #include "XmlRpcUtil.h" #if defined(_WINDOWS) #undef _WINSOCKAPI_ # include # include #else extern "C" { # include # include } #endif #if USE_OPENSSL_XMLRPC # include # include # include # include # include #endif namespace XmlRpc { struct SslProxy { #if USE_OPENSSL_XMLRPC SSL_CTX* _ssl_ctx; SSL_METHOD* _ssl_meth; SSL* _ssl_ssl; #endif }; XmlRpcSource::XmlRpcSource(XmlRpcSocket::Socket fd /*= -1*/, bool deleteOnClose /*= false*/) : _fd(fd) , _deleteOnClose(deleteOnClose) , _keepOpen(false) , _sslEnabled(false) , _ssl(0) { } XmlRpcSource::~XmlRpcSource() { delete _ssl; } void XmlRpcSource::setSslEnabled(bool b /*=true*/) { #if USE_OPENSSL_XMLRPC _sslEnabled = b; #endif } bool XmlRpcSource::doConnect() { #if USE_OPENSSL_XMLRPC // Perform SSL if needed if (_sslEnabled) { _ssl = new SslProxy; SSLeay_add_ssl_algorithms(); _ssl->_ssl_meth = const_cast(SSLv23_client_method()); SSL_load_error_strings(); _ssl->_ssl_ctx = SSL_CTX_new(_ssl->_ssl_meth); _ssl->_ssl_ssl = SSL_new(_ssl->_ssl_ctx); SSL_set_fd(_ssl->_ssl_ssl, _fd); return SSL_connect(_ssl->_ssl_ssl) == 1; } #endif return true; } // Read available text from the specified socket. Returns false on error. bool XmlRpcSource::nbRead(std::string& s, bool *eof) { const int READ_SIZE = 4096; // Number of bytes to attempt to read at a time char readBuf[READ_SIZE]; bool wouldBlock = false; *eof = false; while ( ! wouldBlock && ! *eof) { int n; #if USE_OPENSSL_XMLRPC // Perform SSL if needed if (_ssl && _ssl->_ssl_ssl) { n = SSL_read(_ssl->_ssl_ssl, readBuf, READ_SIZE-1); } else #endif #if defined(_WINDOWS) n = recv(_fd, readBuf, READ_SIZE-1, 0); #else n = read(_fd, readBuf, READ_SIZE-1); #endif XmlRpcUtil::log(5, "XmlRpcSocket::nbRead: read/recv returned %d.", n); if (n > 0) { readBuf[n] = 0; s.append(readBuf, n); } else if (n == 0) { *eof = true; } else if (XmlRpcSocket::nonFatalError()) { wouldBlock = true; } else { return false; // Error } } return true; } // Write text to the socket. Returns false on error. bool XmlRpcSource::nbWrite(std::string const& s, int *bytesSoFar) { int nToWrite = int(s.length()) - *bytesSoFar; const char *sp = s.c_str() + *bytesSoFar; bool wouldBlock = false; while ( nToWrite > 0 && ! wouldBlock ) { int n; #if USE_OPENSSL_XMLRPC // Perform SSL if needed if (_ssl && _ssl->_ssl_ssl) { n = SSL_write(_ssl->_ssl_ssl, sp, nToWrite); } else #endif #if defined(_WINDOWS) n = send(_fd, sp, nToWrite, 0); #else n = write(_fd, sp, nToWrite); #endif XmlRpcUtil::log(5, "XmlRpcSocket::nbWrite: send/write returned %d.", n); if (n > 0) { sp += n; *bytesSoFar += n; nToWrite -= n; } else if (XmlRpcSocket::nonFatalError()) { wouldBlock = true; } else { return false; // Error } } return true; } void XmlRpcSource::close() { #if USE_OPENSSL_XMLRPC if (_ssl && _ssl->_ssl_ssl) { SSL_shutdown(_ssl->_ssl_ssl); // Should close be called here ? ... SSL_free(_ssl->_ssl_ssl); SSL_CTX_free(_ssl->_ssl_ctx); delete _ssl; _ssl = 0; } #endif if ( (int)_fd != -1) { XmlRpcUtil::log(2,"XmlRpcSource::close: closing socket %d.", _fd); XmlRpcSocket::close(_fd); _fd = -1; } if (_deleteOnClose) { XmlRpcUtil::log(2,"XmlRpcSource::close: deleting this"); _deleteOnClose = false; delete this; } } } // namespace XmlRpc fldigi-4.2.05/src/libtiniconv/0000775000175000017500000000000014611714005013151 500000000000000fldigi-4.2.05/src/libtiniconv/encdec/0000775000175000017500000000000014611714005014372 500000000000000fldigi-4.2.05/src/libtiniconv/encdec/cp1252.h0000664000175000017500000000702314532252172015405 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1252 */ static const unsigned short cp1252_2uni[32] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0x017d, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0x017e, 0x0178, }; static int cp1252_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80 || c >= 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1252_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1252_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1252_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1252_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1252_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = wc; else if (wc >= 0x0150 && wc < 0x0198) c = cp1252_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1252_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1252_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/mac_cyrillic.h0000664000175000017500000001310214532252172017116 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * MacCyrillic */ static const unsigned short mac_cyrillic_2uni[128] = { /* 0x80 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0x90 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xa0 */ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x0406, 0x00ae, 0x00a9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, /* 0xb0 */ 0x221e, 0x00b1, 0x2264, 0x2265, 0x0456, 0x00b5, 0x2202, 0x0408, 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040a, 0x045a, /* 0xc0 */ 0x0458, 0x0405, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, 0x00bb, 0x2026, 0x00a0, 0x040b, 0x045b, 0x040c, 0x045c, 0x0455, /* 0xd0 */ 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x201e, 0x040e, 0x045e, 0x040f, 0x045f, 0x2116, 0x0401, 0x0451, 0x044f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x00a4, }; static int mac_cyrillic_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x80) *pwc = (ucs4_t) mac_cyrillic_2uni[c-0x80]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char mac_cyrillic_page00[32] = { 0xca, 0x00, 0xa2, 0xa3, 0xff, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */ 0xa1, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xa6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char mac_cyrillic_page04[96] = { 0x00, 0xdd, 0xab, 0xae, 0xb8, 0xc1, 0xa7, 0xba, /* 0x00-0x07 */ 0xb7, 0xbc, 0xbe, 0xcb, 0xcd, 0x00, 0xd8, 0xda, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, /* 0x48-0x4f */ 0x00, 0xde, 0xac, 0xaf, 0xb9, 0xcf, 0xb4, 0xbb, /* 0x50-0x57 */ 0xc0, 0xbd, 0xbf, 0xcc, 0xce, 0x00, 0xd9, 0xdb, /* 0x58-0x5f */ }; static const unsigned char mac_cyrillic_page20[24] = { 0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xd7, 0x00, /* 0x18-0x1f */ 0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_cyrillic_page21[24] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char mac_cyrillic_page22[104] = { 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */ }; static int mac_cyrillic_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = mac_cyrillic_page00[wc-0x00a0]; else if (wc == 0x00f7) c = 0xd6; else if (wc == 0x0192) c = 0xc4; else if (wc >= 0x0400 && wc < 0x0460) c = mac_cyrillic_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2028) c = mac_cyrillic_page20[wc-0x2010]; else if (wc >= 0x2110 && wc < 0x2128) c = mac_cyrillic_page21[wc-0x2110]; else if (wc >= 0x2200 && wc < 0x2268) c = mac_cyrillic_page22[wc-0x2200]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_16.h0000664000175000017500000001122214532252172016123 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-16 */ static const unsigned short iso8859_16_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, /* 0xb0 */ 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a, 0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff, }; static int iso8859_16_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_16_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_16_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0x00, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0x00, /* 0xd0-0xd7 */ 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0x00, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0x00, /* 0xf0-0xf7 */ 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xa2, 0xc5, 0xe5, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xb2, 0xb9, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xbe, 0xac, 0xae, 0xaf, 0xbf, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_16_page02[8] = { 0xaa, 0xba, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char iso8859_16_page20[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xa5, 0x00, /* 0x18-0x1f */ }; static int iso8859_16_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_16_page00[wc-0x00a0]; else if (wc >= 0x0218 && wc < 0x0220) c = iso8859_16_page02[wc-0x0218]; else if (wc >= 0x2018 && wc < 0x2020) c = iso8859_16_page20[wc-0x2018]; else if (wc == 0x20ac) c = 0xa4; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_5.h0000664000175000017500000000672514532252172016055 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-5 */ static const unsigned short iso8859_5_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, /* 0xb0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xc0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xd0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f, }; static int iso8859_5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_5_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_5_page00[16] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char iso8859_5_page04[96] = { 0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, /* 0x08-0x0f */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff, /* 0x58-0x5f */ }; static int iso8859_5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = iso8859_5_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0460) c = iso8859_5_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xf0; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/gbk.h0000664000175000017500000001120614532252172015232 00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK */ /* * GBK, as described in Ken Lunde's book, is an extension of GB 2312-1980 * (shifted by adding 0x8080 to the range 0xA1A1..0xFEFE, as used in EUC-CN). * It adds the following ranges: * * (part of GBK/1) 0xA2A1-0xA2AA Small Roman numerals * GBK/3 0x{81-A0}{40-7E,80-FE} 6080 new characters, all in Unicode * GBK/4 0x{AA-FE}{40-7E,80-A0} 8160 new characters, 8080 in Unicode * GBK/5 0x{A8-A9}{40-7E,80-A0} 166 new characters, 153 in Unicode * * Furthermore, all four tables I have looked at * - the CP936 table by Microsoft, found on ftp.unicode.org in 1999, * - the GBK table by Sun, investigated on a Solaris 2.7 machine, * - the GBK tables by CWEX, found in the Big5+ package, * - the GB18030 standard (second printing), * agree in the following extensions. (Ken Lunde must have overlooked these * differences between GB2312 and GBK. Also, the CWEX tables have additional * differences.) * * 1. Some characters in the GB2312 range are defined differently: * * code GB2312 GBK * 0xA1A4 0x30FB # KATAKANA MIDDLE DOT 0x00B7 # MIDDLE DOT * 0xA1AA 0x2015 # HORIZONTAL BAR 0x2014 # EM DASH * * 2. 19 characters added in the range 0xA6E0-0xA6F5. * * 3. 4 characters added in the range 0xA8BB-0xA8C0. * * CP936 as of 1999 was identical to GBK. However, since 1999, Microsoft has * added new mappings to CP936... */ #include "gbkext1.h" #include "gbkext2.h" #include "gbkext_inv.h" #include "cp936ext.h" static int gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); if (c >= 0xa1 && c <= 0xf7) { unsigned char c2 = s[1]; if (c == 0xa1) { if (c2 == 0xa4) { *pwc = 0x00b7; return 2; } if (c2 == 0xaa) { *pwc = 0x2014; return 2; } } if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; int ret; buf[0] = c-0x80; buf[1] = c2-0x80; ret = gb2312_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; buf[0] = c; buf[1] = c2; ret = cp936ext_mbtowc(conv,pwc,buf,2); if (ret != RET_ILSEQ) return ret; } } if (c >= 0x81 && c <= 0xa0) return gbkext1_mbtowc(conv,pwc,s,2); if (c >= 0xa8 && c <= 0xfe) return gbkext2_mbtowc(conv,pwc,s,2); if (c == 0xa2) { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 <= 0xaa) { *pwc = 0x2170+(c2-0xa1); return 2; } } } return RET_ILSEQ; } static int gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; if (wc != 0x30fb && wc != 0x2015) { ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } } ret = gbkext_inv_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } if (wc >= 0x2170 && wc <= 0x2179) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa2; r[1] = 0xa1 + (wc-0x2170); return 2; } ret = cp936ext_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } if (wc == 0x00b7) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa1; r[1] = 0xa4; return 2; } if (wc == 0x2014) { if (n < 2) return RET_TOOSMALL; r[0] = 0xa1; r[1] = 0xaa; return 2; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/euc_cn.h0000664000175000017500000000373014532252172015726 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * EUC-CN */ static int euc_cn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or GB 1988-89) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (GB 2312-1980) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { unsigned char buf[2]; buf[0] = c-0x80; buf[1] = c2-0x80; return gb2312_mbtowc(conv,pwc,buf,2); } else return RET_ILSEQ; } } return RET_ILSEQ; } static int euc_cn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or GB 1988-89) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (GB 2312-1980) */ ret = gb2312_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]+0x80; r[1] = buf[1]+0x80; return 2; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp866.h0000664000175000017500000001207214532252172015337 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP866 */ static const unsigned short cp866_2uni[80] = { /* 0xb0 */ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, /* 0xc0 */ 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, /* 0xd0 */ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, /* 0xe0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, /* 0xf0 */ 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040e, 0x045e, 0x00b0, 0x2219, 0x00b7, 0x221a, 0x2116, 0x00a4, 0x25a0, 0x00a0, }; static int cp866_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else if (c < 0xb0) *pwc = (ucs4_t) c + 0x0390; else *pwc = (ucs4_t) cp866_2uni[c-0xb0]; return 1; } static const unsigned char cp866_page00[24] = { 0xff, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, /* 0xb0-0xb7 */ }; static const unsigned char cp866_page04[96] = { 0x00, 0xf0, 0x00, 0x00, 0xf2, 0x00, 0x00, 0xf4, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0x00, /* 0x08-0x0f */ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x30-0x37 */ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0x00, 0xf1, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xf5, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf7, 0x00, /* 0x58-0x5f */ }; static const unsigned char cp866_page22[8] = { 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static const unsigned char cp866_page25[168] = { 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb, /* 0x50-0x57 */ 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7, /* 0x58-0x5f */ 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf, /* 0x60-0x67 */ 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int cp866_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b8) c = cp866_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0460) c = cp866_page04[wc-0x0400]; else if (wc == 0x2116) c = 0xfc; else if (wc >= 0x2218 && wc < 0x2220) c = cp866_page22[wc-0x2218]; else if (wc >= 0x2500 && wc < 0x25a8) c = cp866_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp1251.h0000664000175000017500000001176514532252172015414 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1251 */ static const unsigned short cp1251_2uni[128] = { /* 0x80 */ 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, /* 0x90 */ 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, /* 0xa0 */ 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, /* 0xb0 */ 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, /* 0xc0 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, /* 0xd0 */ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, /* 0xe0 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, /* 0xf0 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, }; static int cp1251_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1251_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1251_page00[32] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp1251_page04[152] = { 0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0xb2, 0xaf, /* 0x00-0x07 */ 0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0xa1, 0x8f, /* 0x08-0x0f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ 0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0xb3, 0xbf, /* 0x50-0x57 */ 0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0xa2, 0x9f, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1251_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1251_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp1251_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = cp1251_page04[wc-0x0400]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1251_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x88; else if (wc == 0x2116) c = 0xb9; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp1257.h0000664000175000017500000001305714532252172015416 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1257 */ static const unsigned short cp1257_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0x00a8, 0x02c7, 0x00b8, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0x00af, 0x02db, 0xfffd, /* 0xa0 */ 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0xfffd, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, /* 0xc0 */ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, /* 0xd0 */ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, /* 0xe0 */ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, /* 0xf0 */ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x02d9, }; static int cp1257_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1257_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1257_page00[224] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x8d, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x9d, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x8f, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp1257_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0xff, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1257_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1257_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp1257_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1257_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1257_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/big5.h0000664000175000017500000077755514532252172015347 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG5 */ static const unsigned short big5_2uni_pagea1[6121] = { /* 0xa1 */ 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2022, 0xff1b, 0xff1a, 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xff64, 0xfe52, 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31, 0x2014, 0xfe33, 0xfffd, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35, 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39, 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d, 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41, 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d, 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7, 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105, 0x203e, 0xfffd, 0xff3f, 0xfffd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e, 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7, 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267, 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf, 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xfffd, /* 0xa2 */ 0xfffd, 0xff0f, 0xff3c, 0xff04, 0x00a5, 0x3012, 0x00a2, 0x00a3, 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5, 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4, 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7, 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a, 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500, 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e, 0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3, 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0xfffd, 0x5344, 0xfffd, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, /* 0xa3 */ 0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02d9, 0x02c9, 0x02ca, 0x02c7, 0x02cb, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa4 */ 0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c, 0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b, 0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a, 0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e, 0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f, 0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8, 0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2, 0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x4e11, 0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88, 0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3, 0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141, 0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, 0x5206, 0x5207, 0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, 0x5348, 0x5347, 0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, 0x58ec, 0x5929, 0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, 0x5c3a, 0x5c6f, 0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, 0x6208, 0x6236, 0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, 0x65b9, 0x65e5, 0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, 0x6bcb, 0x6bd4, 0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, 0x723b, 0x7247, 0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19, /* 0xa5 */ 0x4e16, 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e, 0x4ee5, 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4, 0x4ed9, 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9, 0x51fa, 0x51f8, 0x520a, 0x52a0, 0x529f, 0x5305, 0x5306, 0x5317, 0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, 0x536e, 0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, 0x53e8, 0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, 0x53f1, 0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, 0x592e, 0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, 0x5de7, 0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, 0x5f17, 0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, 0x65e6, 0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, 0x6c11, 0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, 0x7389, 0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, 0x7531, 0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, 0x77db, 0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, 0x7acb, 0x4e1e, 0x4e1f, 0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, 0x4ea6, 0x4ea5, 0x4eff, 0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, 0x4f10, 0x4f11, 0x4f0f, 0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, 0x4efd, 0x4f01, 0x4f0b, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, /* 0xa6 */ 0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216, 0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f, 0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d, 0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd, 0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919, 0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979, 0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89, 0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, 0x5e74, 0x5f0f, 0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, 0x6210, 0x6263, 0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, 0x65ed, 0x66f2, 0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, 0x6b21, 0x6b64, 0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, 0x6c60, 0x6c50, 0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, 0x725f, 0x725d, 0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, 0x7fbd, 0x8001, 0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, 0x808b, 0x808c, 0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, 0x821f, 0x826e, 0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, 0x897f, 0x9621, 0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, 0x4f5e, 0x4f34, 0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, 0x4f3a, 0x4f38, 0x4f43, 0x4f54, 0x4f3c, 0x4f46, 0x4f63, /* 0xa7 */ 0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, 0x4f48, 0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, 0x5225, 0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, 0x52ac, 0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, 0x5426, 0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541b, 0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, 0x5436, 0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, 0x56ea, 0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, 0x5747, 0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, 0x599d, 0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, 0x59a4, 0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, 0x5b8c, 0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, 0x5c3f, 0x5c3e, 0x5c90, 0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, 0x5e8f, 0x5e87, 0x5e8a, 0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, 0x5f77, 0x5f79, 0x5fd8, 0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, 0x5ff8, 0x5fea, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626d, 0x628a, 0x627c, 0x627e, 0x6279, 0x6273, 0x6292, 0x626f, 0x6298, 0x626e, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653b, 0x6538, 0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, 0x6750, 0x6751, 0x675c, 0x6756, 0x675e, 0x6749, 0x6746, 0x6760, /* 0xa8 */ 0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81, 0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70, 0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e, 0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, 0x6c82, 0x7076, 0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, 0x72c4, 0x72c2, 0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, 0x76ef, 0x77e3, 0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, 0x8096, 0x8093, 0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, 0x8292, 0x828b, 0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, 0x8c55, 0x8c9d, 0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, 0x8fb0, 0x8fc2, 0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, 0x90aa, 0x90a6, 0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, 0x9631, 0x962a, 0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, 0x4e9e, 0x4eab, 0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, 0x4f6c, 0x4f9b, 0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, 0x4f69, 0x4f7b, 0x4f96, 0x4f7e, 0x4f8f, 0x4f91, 0x4f7a, 0x5154, 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51bd, 0x51fd, 0x523b, 0x5238, 0x5237, 0x523a, 0x5230, 0x522e, 0x5236, 0x5241, 0x52be, 0x52bb, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53d6, 0x53d4, 0x53d7, 0x5473, 0x5475, /* 0xa9 */ 0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, 0x5492, 0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, 0x5462, 0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, 0x576a, 0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, 0x59ae, 0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, 0x59af, 0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, 0x5b9a, 0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, 0x5c48, 0x5c45, 0x5c46, 0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, 0x5cb1, 0x5cb3, 0x5e18, 0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, 0x5e78, 0x5e9a, 0x5e97, 0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, 0x5f27, 0x5f29, 0x5f80, 0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, 0x5ffd, 0x5ff5, 0x5fff, 0x600f, 0x6014, 0x602f, 0x6035, 0x6016, 0x602a, 0x6015, 0x6021, 0x6027, 0x6029, 0x602b, 0x601b, 0x6216, 0x6215, 0x623f, 0x623e, 0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, 0x62bf, 0x62c2, 0x62b9, 0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, 0x62cb, 0x62c8, 0x62a8, 0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, 0x62cd, 0x62b5, 0x62da, 0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, 0x62ac, 0x62ce, 0x653e, 0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, 0x660c, 0x6606, 0x6602, 0x660e, 0x6600, 0x660f, 0x6615, 0x660a, /* 0xaa */ 0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, 0x6771, 0x679c, 0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, 0x6770, 0x677f, 0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, 0x677c, 0x676a, 0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, 0x6c1b, 0x6ce3, 0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, 0x6cbd, 0x6cbe, 0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, 0x6cc4, 0x6cb9, 0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, 0x6cbb, 0x6ce1, 0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, 0x6ce0, 0x7095, 0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, 0x7238, 0x7248, 0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, 0x72d0, 0x73a9, 0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, 0x7599, 0x759a, 0x7684, 0x76c2, 0x76f2, 0x76f4, 0x77e5, 0x77fd, 0x793e, 0x7940, 0x7941, 0x79c9, 0x79c8, 0x7a7a, 0x7a79, 0x7afa, 0x7cfe, 0x7f54, 0x7f8c, 0x7f8b, 0x8005, 0x80ba, 0x80a5, 0x80a2, 0x80b1, 0x80a1, 0x80ab, 0x80a9, 0x80b4, 0x80aa, 0x80af, 0x81e5, 0x81fe, 0x820d, 0x82b3, 0x829d, 0x8299, 0x82ad, 0x82bd, 0x829f, 0x82b9, 0x82b1, 0x82ac, 0x82a5, 0x82af, 0x82b8, 0x82a3, 0x82b0, 0x82be, 0x82b7, 0x864e, 0x8671, 0x521d, 0x8868, 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1, 0x90b5, 0x90b8, 0x90b1, 0x90b6, 0x91c7, 0x91d1, 0x9577, 0x9580, 0x961c, 0x9640, 0x963f, 0x963b, 0x9644, /* 0xab */ 0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, 0x4eae, 0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, 0x4fdd, 0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, 0x4fd0, 0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, 0x4fb7, 0x5157, 0x5192, 0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, 0x524d, 0x524c, 0x524b, 0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, 0x530d, 0x5357, 0x537b, 0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, 0x54ce, 0x54c9, 0x54b8, 0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, 0x54aa, 0x54c1, 0x54c4, 0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, 0x54a9, 0x54a7, 0x54bf, 0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, 0x57a2, 0x57ce, 0x57ae, 0x5793, 0x5955, 0x5951, 0x594f, 0x594e, 0x5950, 0x59dc, 0x59d8, 0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, 0x59ea, 0x59da, 0x59e6, 0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, 0x5ba4, 0x5ba2, 0x5ba5, 0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, 0x5cd9, 0x5cd2, 0x5df7, 0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, 0x5ea6, 0x5efa, 0x5f08, 0x5f2d, 0x5f65, 0x5f88, 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c, 0x5f89, 0x6012, 0x601d, 0x6020, 0x6025, 0x600e, 0x6028, 0x604d, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606c, 0x606b, 0x606a, 0x6064, 0x6241, 0x62dc, 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301, 0x62ee, 0x62fd, 0x6307, 0x62f1, 0x62f7, /* 0xac */ 0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, 0x653f, 0x6545, 0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, 0x6627, 0x662f, 0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, 0x67d3, 0x67f1, 0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, 0x67e9, 0x67ef, 0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, 0x67cf, 0x67de, 0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, 0x6b6a, 0x6b83, 0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, 0x6d0b, 0x6d32, 0x6d2a, 0x6d41, 0x6d25, 0x6d0c, 0x6d31, 0x6d1e, 0x6d17, 0x6d3b, 0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, 0x6cf5, 0x6d39, 0x6d27, 0x6d38, 0x6d29, 0x6d2e, 0x6d35, 0x6d0e, 0x6d2b, 0x70ab, 0x70ba, 0x70b3, 0x70ac, 0x70af, 0x70ad, 0x70b8, 0x70ae, 0x70a4, 0x7230, 0x7272, 0x726f, 0x7274, 0x72e9, 0x72e0, 0x72e1, 0x73b7, 0x73ca, 0x73bb, 0x73b2, 0x73cd, 0x73c0, 0x73b3, 0x751a, 0x752d, 0x754f, 0x754c, 0x754e, 0x754b, 0x75ab, 0x75a4, 0x75a5, 0x75a2, 0x75a3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76c8, 0x76c6, 0x76c3, 0x76c5, 0x7701, 0x76f9, 0x76f8, 0x7709, 0x770b, 0x76fe, 0x76fc, 0x7707, 0x77dc, 0x7802, 0x7814, 0x780c, 0x780d, 0x7946, 0x7949, 0x7948, 0x7947, 0x79b9, 0x79ba, 0x79d1, 0x79d2, 0x79cb, 0x7a7f, 0x7a81, 0x7aff, 0x7afd, 0x7c7d, 0x7d02, 0x7d05, 0x7d00, 0x7d09, 0x7d07, 0x7d04, 0x7d06, 0x7f38, 0x7f8e, 0x7fbf, 0x8004, /* 0xad */ 0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, 0x80da, 0x80c3, 0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, 0x80e4, 0x80dd, 0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, 0x82db, 0x82e6, 0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, 0x82f1, 0x8301, 0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, 0x82ef, 0x8306, 0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, 0x8981, 0x89d4, 0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, 0x8d73, 0x8db4, 0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, 0x8fe5, 0x8fed, 0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, 0x90c3, 0x914b, 0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, 0x964d, 0x9762, 0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, 0x98db, 0x98df, 0x9996, 0x9999, 0x4e58, 0x4eb3, 0x500c, 0x500d, 0x5023, 0x4fef, 0x5026, 0x5025, 0x4ff8, 0x5029, 0x5016, 0x5006, 0x503c, 0x501f, 0x501a, 0x5012, 0x5011, 0x4ffa, 0x5000, 0x5014, 0x5028, 0x4ff1, 0x5021, 0x500b, 0x5019, 0x5018, 0x4ff3, 0x4fee, 0x502d, 0x502a, 0x4ffe, 0x502b, 0x5009, 0x517c, 0x51a4, 0x51a5, 0x51a2, 0x51cd, 0x51cc, 0x51c6, 0x51cb, 0x5256, 0x525c, 0x5254, 0x525b, 0x525d, 0x532a, 0x537f, 0x539f, 0x539d, 0x53df, 0x54e8, 0x5510, 0x5501, 0x5537, 0x54fc, 0x54e5, 0x54f2, 0x5506, 0x54fa, 0x5514, 0x54e9, 0x54ed, 0x54e1, 0x5509, 0x54ee, 0x54ea, /* 0xae */ 0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, 0x57c2, 0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, 0x595a, 0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, 0x5a20, 0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, 0x5b6b, 0x5c58, 0x5bb0, 0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, 0x5bb9, 0x5bb8, 0x5c04, 0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, 0x5cfb, 0x5cea, 0x5ce8, 0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, 0x5e2d, 0x5e2b, 0x5eab, 0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, 0x5f90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606d, 0x6069, 0x606f, 0x6084, 0x609f, 0x609a, 0x608d, 0x6094, 0x608c, 0x6085, 0x6096, 0x6247, 0x62f3, 0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, 0x6355, 0x6342, 0x6346, 0x634f, 0x6349, 0x633a, 0x6350, 0x633d, 0x632a, 0x632b, 0x6328, 0x634d, 0x634c, 0x6548, 0x6549, 0x6599, 0x65c1, 0x65c5, 0x6642, 0x6649, 0x664f, 0x6643, 0x6652, 0x664c, 0x6645, 0x6641, 0x66f8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851, 0x683d, 0x67f4, 0x6850, 0x6840, 0x683c, 0x6843, 0x682a, 0x6845, 0x6813, 0x6818, 0x6841, 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27, 0x6c28, 0x6c26, 0x6c24, 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87, 0x6d66, 0x6d78, 0x6d77, 0x6d59, 0x6d93, /* 0xaf */ 0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, 0x6d8c, 0x6d8a, 0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, 0x70e4, 0x70d9, 0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, 0x72fd, 0x72f8, 0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, 0x73ea, 0x73de, 0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, 0x75c5, 0x75c7, 0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, 0x75b8, 0x768b, 0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, 0x7720, 0x7728, 0x77e9, 0x7830, 0x7827, 0x7838, 0x781d, 0x7834, 0x7837, 0x7825, 0x782d, 0x7820, 0x781f, 0x7832, 0x7955, 0x7950, 0x7960, 0x795f, 0x7956, 0x795e, 0x795d, 0x7957, 0x795a, 0x79e4, 0x79e3, 0x79e7, 0x79df, 0x79e6, 0x79e9, 0x79d8, 0x7a84, 0x7a88, 0x7ad9, 0x7b06, 0x7b11, 0x7c89, 0x7d21, 0x7d17, 0x7d0b, 0x7d0a, 0x7d20, 0x7d22, 0x7d14, 0x7d10, 0x7d15, 0x7d1a, 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b, 0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, 0x7fc1, 0x8006, 0x8018, 0x8015, 0x8019, 0x8017, 0x803d, 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105, 0x80ed, 0x80f4, 0x8106, 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a, 0x80fc, 0x80ef, 0x81ed, 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b, 0x8228, 0x822c, 0x82bb, 0x832b, 0x8352, 0x8354, 0x834a, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834f, 0x8332, 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, /* 0xb0 */ 0x8654, 0x868a, 0x86aa, 0x8693, 0x86a4, 0x86a9, 0x868c, 0x86a3, 0x869c, 0x8870, 0x8877, 0x8881, 0x8882, 0x887d, 0x8879, 0x8a18, 0x8a10, 0x8a0e, 0x8a0c, 0x8a15, 0x8a0a, 0x8a17, 0x8a13, 0x8a16, 0x8a0f, 0x8a11, 0x8c48, 0x8c7a, 0x8c79, 0x8ca1, 0x8ca2, 0x8d77, 0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, 0x8fb1, 0x9001, 0x9006, 0x8ff7, 0x9000, 0x8ffa, 0x8ff4, 0x9003, 0x8ffd, 0x9005, 0x8ff8, 0x9095, 0x90e1, 0x90dd, 0x90e2, 0x9152, 0x914d, 0x914c, 0x91d8, 0x91dd, 0x91d7, 0x91dc, 0x91d9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965b, 0x965d, 0x9664, 0x9658, 0x965e, 0x96bb, 0x98e2, 0x99ac, 0x9aa8, 0x9ad8, 0x9b25, 0x9b32, 0x9b3c, 0x4e7e, 0x507a, 0x507d, 0x505c, 0x5047, 0x5043, 0x504c, 0x505a, 0x5049, 0x5065, 0x5076, 0x504e, 0x5055, 0x5075, 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d, 0x515c, 0x5195, 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8, 0x52d5, 0x5310, 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3, 0x66fc, 0x5546, 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543, 0x554a, 0x5531, 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538, 0x552e, 0x555c, 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570b, 0x5709, 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4, 0x57fa, 0x5802, 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36, 0x5a41, 0x5a49, 0x5a66, 0x5a6a, 0x5a40, /* 0xb1 */ 0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, 0x5b70, 0x5bc7, 0x5bc5, 0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, 0x5c08, 0x5c07, 0x5c60, 0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, 0x5d1b, 0x5d16, 0x5d22, 0x5d11, 0x5d29, 0x5d14, 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2, 0x5e38, 0x5e36, 0x5e33, 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5, 0x5ebe, 0x5f35, 0x5f37, 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97, 0x5f99, 0x5f9e, 0x5f98, 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3, 0x6089, 0x60a0, 0x60a8, 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x60c5, 0x60bb, 0x60b5, 0x60dc, 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df, 0x60b8, 0x60da, 0x60c7, 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7, 0x6372, 0x6396, 0x63a2, 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa, 0x6371, 0x63a9, 0x6389, 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384, 0x6388, 0x6399, 0x63a1, 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b, 0x6369, 0x6368, 0x637a, 0x655d, 0x6556, 0x6551, 0x6559, 0x6557, 0x555f, 0x654f, 0x6558, 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac, 0x65cf, 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668, 0x6666, 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2, 0x6893, 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0, 0x6883, 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8, 0x689f, 0x68a1, 0x6882, 0x6b32, 0x6bba, /* 0xb2 */ 0x6beb, 0x6bec, 0x6c2b, 0x6d8e, 0x6dbc, 0x6df3, 0x6dd9, 0x6db2, 0x6de1, 0x6dcc, 0x6de4, 0x6dfb, 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb, 0x6daf, 0x6dd1, 0x6dae, 0x6dde, 0x6df9, 0x6db8, 0x6df7, 0x6df5, 0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, 0x6dda, 0x6deb, 0x6dd8, 0x6dea, 0x6df1, 0x6dee, 0x6de8, 0x6dc6, 0x6dc4, 0x6daa, 0x6dec, 0x6dbf, 0x6de6, 0x70f9, 0x7109, 0x710a, 0x70fd, 0x70ef, 0x723d, 0x727d, 0x7281, 0x731c, 0x731b, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405, 0x740a, 0x7403, 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x74f7, 0x751c, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4, 0x75d5, 0x75b5, 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db, 0x7737, 0x773e, 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843, 0x784e, 0x7965, 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20, 0x7b28, 0x7b1b, 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92, 0x7c97, 0x7c95, 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c, 0x7d40, 0x7d30, 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31, 0x7f3d, 0x7f9e, 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a, 0x8046, 0x812f, 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398, 0x8378, 0x83a2, 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393, 0x8389, 0x83a0, 0x8377, 0x837b, 0x837c, /* 0xb3 */ 0x8386, 0x83a7, 0x8655, 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4, 0x86b5, 0x86c6, 0x86cb, 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e, 0x8888, 0x88ab, 0x8892, 0x8896, 0x888d, 0x888b, 0x8993, 0x898f, 0x8a2a, 0x8a1d, 0x8a23, 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b, 0x8a22, 0x8c49, 0x8c5a, 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa, 0x8ca7, 0x8d67, 0x8d66, 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019, 0x900d, 0x901a, 0x9017, 0x9023, 0x901f, 0x901d, 0x9010, 0x9015, 0x901e, 0x9020, 0x900f, 0x9022, 0x9016, 0x901b, 0x9014, 0x90e8, 0x90ed, 0x90fd, 0x9157, 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7, 0x91ed, 0x91e9, 0x9589, 0x966a, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0, 0x7adf, 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5, 0x9ebb, 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52de, 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7, 0x557c, 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594, 0x5587, 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2, 0x559a, 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599, 0x570d, 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581d, 0x5820, 0x58f9, 0x58fa, 0x5960, /* 0xb4 */ 0x5a77, 0x5a9a, 0x5a7f, 0x5a92, 0x5a9b, 0x5aa7, 0x5b73, 0x5b71, 0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c, 0x5d50, 0x5d34, 0x5d47, 0x5dfd, 0x5e45, 0x5e3d, 0x5e40, 0x5e43, 0x5e7e, 0x5eca, 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9, 0x5faa, 0x5fa8, 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c, 0x6123, 0x60fa, 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1, 0x610e, 0x60f6, 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3, 0x638c, 0x63cf, 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x63d2, 0x63e3, 0x63d0, 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4, 0x63ea, 0x63db, 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676, 0x666f, 0x6691, 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f, 0x671d, 0x68fa, 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df, 0x68f5, 0x68ee, 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb, 0x68cd, 0x690d, 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb, 0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e, 0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67, 0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24, 0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a, 0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb, /* 0xb5 */ 0x6e89, 0x6e19, 0x6e4e, 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f, 0x7119, 0x711a, 0x7126, 0x7130, 0x7121, 0x7136, 0x716e, 0x711c, 0x724c, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743a, 0x742a, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742f, 0x741b, 0x7426, 0x7428, 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2, 0x75db, 0x75e3, 0x75d9, 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c, 0x7696, 0x7693, 0x76b4, 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c, 0x786f, 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x7a97, 0x7a96, 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52, 0x7b54, 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e, 0x7d50, 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66, 0x7d62, 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052, 0x8085, 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146, 0x813e, 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403, 0x83f8, 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1, 0x83f4, 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2, 0x83ca, 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df, 0x865b, 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0, 0x86de, 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, 0x8a3b, 0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41, /* 0xb6 */ 0x8a54, 0x8a5b, 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56, 0x8c61, 0x8c82, 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb, 0x8cc0, 0x8cb4, 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85, 0x8d81, 0x8dce, 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb, 0x8dc6, 0x8efb, 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163, 0x9165, 0x91cf, 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d, 0x9210, 0x9207, 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x9593, 0x9592, 0x958e, 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686, 0x968d, 0x9672, 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7, 0x96ef, 0x96f2, 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea, 0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd, 0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be, 0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d, 0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8, 0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4, 0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712, 0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b, 0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1, 0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc, /* 0xb7 */ 0x5ab3, 0x5ac2, 0x5ab2, 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9, 0x5ec8, 0x5f12, 0x5f59, 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148, 0x611f, 0x60f3, 0x611b, 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c, 0x6144, 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d, 0x642c, 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417, 0x6406, 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x695a, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968, 0x696b, 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b, 0x6b47, 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf, 0x6ed3, 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5, 0x6e98, 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4, 0x6ed4, 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164, 0x7149, 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, 0x715e, 0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, 0x733f, 0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, 0x743f, 0x7459, 0x745b, 0x745c, 0x7576, 0x7578, 0x7600, 0x75f0, 0x7601, 0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, 0x76df, 0x775b, 0x776b, 0x7766, 0x775e, 0x7763, /* 0xb8 */ 0x7779, 0x776a, 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee, 0x788e, 0x78b0, 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891, 0x7893, 0x787f, 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c, 0x7a1a, 0x7a20, 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77, 0x7bc0, 0x7b60, 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93, 0x7d79, 0x7d91, 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a, 0x7f72, 0x7fa9, 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x8179, 0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431, 0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435, 0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f, 0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702, 0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc, 0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3, 0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c, 0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c, 0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca, 0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1, 0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, 0x8de4, 0x8de6, 0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a, /* 0xb9 */ 0x8f9f, 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c, 0x9055, 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e, 0x9041, 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237, 0x9257, 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264, 0x9251, 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a, 0x9598, 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca, 0x96f7, 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x98fd, 0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e, 0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da, 0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, 0x51f3, 0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, 0x5617, 0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, 0x5616, 0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, 0x587e, 0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, 0x5925, 0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, 0x5ad7, 0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, 0x5be5, 0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, 0x5d84, 0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, 0x5ed6, 0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147, /* 0xba */ 0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158, 0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f, 0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1, 0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995, 0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab, 0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3, 0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4, 0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x6eff, 0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b, 0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7, 0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d, 0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1, 0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7, 0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, 0x7a2e, 0x7a31, 0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, 0x7b8b, 0x7b75, 0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, 0x7b84, 0x7cb9, 0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, 0x7dbe, 0x7da0, 0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, 0x7dbf, 0x7db5, 0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac, /* 0xbb */ 0x7f70, 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150, 0x8180, 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa, 0x8207, 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4, 0x8499, 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3, 0x8490, 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722, 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902, 0x88f4, 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, 0x8aa6, 0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 0x8aaa, 0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, 0x8c8d, 0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, 0x8dfc, 0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, 0x905c, 0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, 0x9118, 0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285, 0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, 0x927c, 0x9291, 0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, 0x9699, 0x969c, 0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, 0x97f6, 0x9817, 0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, 0x9909, 0x99c1, 0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, 0x9cf6, 0x9cf3, 0x9ebc, 0x9f3b, 0x9f4a, 0x5104, 0x5100, 0x50fb, 0x50f5, 0x50f9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51dc, /* 0xbc */ 0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, 0x562e, 0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, 0x564e, 0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, 0x589e, 0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, 0x5afb, 0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, 0x5beb, 0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, 0x5ee2, 0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, 0x5fb7, 0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, 0x617c, 0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac, 0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479, 0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, 0x64a5, 0x6493, 0x6495, 0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, 0x649a, 0x64ac, 0x6499, 0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, 0x66ae, 0x66ab, 0x66b4, 0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, 0x6a1e, 0x6a19, 0x69fd, 0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, 0x6a05, 0x69ed, 0x6a11, 0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, 0x6f3f, 0x6f7c, 0x6f84, 0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, 0x6f5b, 0x6f78, 0x6f6e, 0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, 0x6f58, 0x6ed5, 0x6f6f, 0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, 0x71a8, 0x7256, 0x729b, 0x734e, 0x7357, 0x7469, 0x748b, 0x7483, /* 0xbd */ 0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626, 0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c, 0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, 0x78be, 0x78d5, 0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, 0x7a37, 0x7a3b, 0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, 0x7bc6, 0x7bc7, 0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, 0x7def, 0x7dfb, 0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, 0x7dde, 0x7de9, 0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, 0x7faf, 0x7fe9, 0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, 0x8198, 0x8517, 0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, 0x8511, 0x8523, 0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874c, 0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915, 0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, 0x8acb, 0x8af8, 0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6, 0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6, 0x8ce4, 0x8cec, 0x8ced, 0x8ce2, 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1, 0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, 0x8e10, 0x8e1d, 0x8e22, 0x8e0f, 0x8e29, 0x8e1f, 0x8e21, 0x8e1e, 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f, 0x8f29, 0x8f26, 0x8f2a, 0x8f1c, 0x8f1e, /* 0xbe */ 0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d, 0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb, 0x92b7, 0x92ea, 0x92ac, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2, 0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c, 0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df, 0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, 0x9aee, 0x9aef, 0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 0x9d03, 0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, 0x5293, 0x52f3, 0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, 0x566a, 0x5668, 0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, 0x58c1, 0x58be, 0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, 0x5bf0, 0x5c0e, 0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, 0x61b6, 0x61be, 0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, 0x64bb, 0x64bc, 0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, 0x64d2, 0x64d4, 0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, 0x66c7, 0x66b8, 0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, 0x6a39, 0x6a44, 0x6a62, 0x6a61, 0x6a4b, 0x6a47, 0x6a35, 0x6a5f, 0x6a48, 0x6b59, 0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1, /* 0xbf */ 0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, 0x6fb6, 0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, 0x71c8, 0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, 0x7368, 0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, 0x750d, 0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, 0x779f, 0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, 0x7a4e, 0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, 0x7be4, 0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, 0x7e11, 0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79, 0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8, 0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, 0x8559, 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856d, 0x856a, 0x855e, 0x8783, 0x879f, 0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, 0x8932, 0x8925, 0x892b, 0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, 0x8aeb, 0x8af1, 0x8b00, 0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, 0x8b02, 0x8af7, 0x8aed, 0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, 0x8c93, 0x8cf4, 0x8e44, 0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, 0x8f3b, 0x8f2f, 0x8f38, 0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907c, 0x907a, 0x9134, 0x9192, 0x9320, 0x9336, 0x92f8, 0x9333, 0x932f, 0x9322, 0x92fc, 0x932b, 0x9304, 0x931a, /* 0xc0 */ 0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7, 0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713, 0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, 0x9838, 0x983b, 0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, 0x991e, 0x991b, 0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, 0x9abc, 0x9afb, 0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, 0x9d28, 0x9d12, 0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, 0x511f, 0x5121, 0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, 0x5687, 0x568f, 0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, 0x5b24, 0x5b7a, 0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, 0x5e6b, 0x5f4c, 0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, 0x6232, 0x6234, 0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, 0x64ec, 0x64f1, 0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, 0x6a80, 0x6a94, 0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, 0x6a97, 0x6a90, 0x6aa0, 0x6b5c, 0x6bae, 0x6bda, 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf, 0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, 0x6fef, 0x6f80, 0x6fec, 0x6fe1, 0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, 0x71e7, 0x71df, 0x71ee, 0x71e6, 0x71e5, 0x71ed, 0x71ec, 0x71f4, 0x71e0, 0x7235, 0x7246, 0x7370, 0x7372, 0x74a9, 0x74b0, 0x74a6, 0x74a8, 0x7646, 0x7642, 0x764c, 0x76ea, 0x77b3, 0x77aa, 0x77b0, 0x77ac, /* 0xc1 */ 0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, 0x7901, 0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, 0x7bf7, 0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, 0x7cd9, 0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, 0x7e2b, 0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, 0x7e35, 0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, 0x8070, 0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, 0x81c2, 0x81c0, 0x81bf, 0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x8584, 0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8, 0x858a, 0x8667, 0x87c0, 0x87d1, 0x87b3, 0x87d2, 0x87c6, 0x87ab, 0x87bb, 0x87ba, 0x87c8, 0x87cb, 0x893b, 0x8936, 0x8944, 0x8938, 0x893d, 0x89ac, 0x8b0e, 0x8b17, 0x8b19, 0x8b1b, 0x8b0a, 0x8b20, 0x8b1d, 0x8b04, 0x8b10, 0x8c41, 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd, 0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, 0x8e49, 0x8e4b, 0x8e48, 0x8e4a, 0x8f44, 0x8f3e, 0x8f42, 0x8f45, 0x8f3f, 0x907f, 0x907d, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91a3, 0x919e, 0x919c, 0x934d, 0x9382, 0x9328, 0x9375, 0x934a, 0x9365, 0x934b, 0x9318, 0x937e, 0x936c, 0x935b, 0x9370, 0x935a, 0x9354, 0x95ca, 0x95cb, 0x95cc, 0x95c8, 0x95c6, 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0, 0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01, /* 0xc2 */ 0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b, 0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2, 0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5d, 0x61e3, 0x6233, 0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, 0x64fb, 0x64f7, 0x65b7, 0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, 0x6abb, 0x6ab8, 0x6ac2, 0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, 0x7009, 0x700b, 0x6ffe, 0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, 0x71fc, 0x71fe, 0x71f8, 0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, 0x7656, 0x7658, 0x7652, 0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62, 0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23, 0x7c21, 0x7ce7, 0x7e54, 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52, 0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf, 0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba, 0x85b9, 0x85a6, 0x87ef, 0x87ec, 0x87f2, 0x87e0, 0x8986, 0x89b2, 0x89f4, 0x8b28, 0x8b39, 0x8b2c, 0x8b2b, 0x8c50, 0x8d05, 0x8e59, 0x8e63, 0x8e66, 0x8e64, 0x8e5f, 0x8e55, 0x8ec0, 0x8f49, 0x8f4d, 0x9087, 0x9083, 0x9088, 0x91ab, 0x91ac, 0x91d0, 0x9394, 0x938a, 0x9396, 0x93a2, 0x93b3, 0x93ae, 0x93ac, 0x93b0, 0x9398, 0x939a, 0x9397, 0x95d4, 0x95d6, 0x95d0, 0x95d5, 0x96e2, 0x96dc, 0x96d9, 0x96db, 0x96de, 0x9724, 0x97a3, 0x97a6, /* 0xc3 */ 0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba, 0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03, 0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, 0x9bc9, 0x9bfd, 0x9bc8, 0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133, 0x56a5, 0x58de, 0x58df, 0x58e2, 0x5bf5, 0x9f90, 0x5eec, 0x61f2, 0x61f7, 0x61f6, 0x61f5, 0x6500, 0x650f, 0x66e0, 0x66dd, 0x6ae5, 0x6add, 0x6ada, 0x6ad3, 0x701b, 0x701f, 0x7028, 0x701a, 0x701d, 0x7015, 0x7018, 0x7206, 0x720d, 0x7258, 0x72a2, 0x7378, 0x737a, 0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7, 0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d, 0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7f85, 0x7e73, 0x7fb6, 0x7fb9, 0x7fb8, 0x81d8, 0x85e9, 0x85dd, 0x85ea, 0x85d5, 0x85e4, 0x85e5, 0x85f7, 0x87fb, 0x8805, 0x880d, 0x87f9, 0x87fe, 0x8960, 0x895f, 0x8956, 0x895e, 0x8b41, 0x8b5c, 0x8b58, 0x8b49, 0x8b5a, 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a, 0x8e7c, 0x8e72, 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54, 0x8f4e, 0x8fad, 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1, 0x93df, 0x93c3, 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd, 0x93d8, 0x93e4, 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a, 0x9727, 0x9761, 0x97dc, 0x97fb, 0x985e, /* 0xc4 */ 0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d, 0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a, 0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 0x56a8, 0x56b7, 0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, 0x5b7d, 0x5bf6, 0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, 0x66e6, 0x6727, 0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, 0x74cf, 0x7662, 0x7665, 0x7926, 0x792a, 0x792c, 0x792b, 0x7ac7, 0x7af6, 0x7c4c, 0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 0x7e82, 0x7f4c, 0x8000, 0x81da, 0x8266, 0x85fb, 0x85f9, 0x8611, 0x85fa, 0x8606, 0x860b, 0x8607, 0x860a, 0x8814, 0x8815, 0x8964, 0x89ba, 0x89f8, 0x8b70, 0x8b6c, 0x8b66, 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f, 0x8d0d, 0x8e89, 0x8e81, 0x8e85, 0x8e82, 0x91b4, 0x91cb, 0x9418, 0x9403, 0x93fd, 0x95e1, 0x9730, 0x98c4, 0x9952, 0x9951, 0x99a8, 0x9a2b, 0x9a30, 0x9a37, 0x9a35, 0x9c13, 0x9c0d, 0x9e79, 0x9eb5, 0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, 0x9f61, 0x5137, 0x5138, 0x56c1, 0x56c0, 0x56c2, 0x5914, 0x5c6c, 0x5dcd, 0x61fc, 0x61fe, 0x651d, 0x651c, 0x6595, 0x66e9, 0x6afb, 0x6b04, 0x6afa, 0x6bb2, 0x704c, 0x721b, 0x72a7, 0x74d6, 0x74d4, 0x7669, 0x77d3, 0x7c50, 0x7e8f, 0x7e8c, 0x7fbc, 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821, 0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74, /* 0xc5 */ 0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, 0x8e8b, 0x8f5f, 0x8faf, 0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, 0x9438, 0x9432, 0x942b, 0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, 0x9867, 0x9865, 0x9957, 0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, 0x9b54, 0x9b51, 0x9c2d, 0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, 0x9e9d, 0x9eef, 0x9f19, 0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, 0x56c8, 0x56ca, 0x56c9, 0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, 0x6524, 0x6b0a, 0x6b61, 0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, 0x766e, 0x766c, 0x79b3, 0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc, 0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444, 0x9451, 0x9452, 0x973d, 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955, 0x9a55, 0x9a4d, 0x9ad2, 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b, 0x9dd3, 0x9dd7, 0x9f34, 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6, 0x6200, 0x6523, 0x652b, 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca, 0x7c64, 0x7c63, 0x7c65, 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638, 0x863f, 0x8831, 0x8b8a, 0x9090, 0x908f, 0x9463, 0x9460, 0x9464, 0x9768, 0x986f, 0x995c, 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4, 0x9ad1, 0x9c54, 0x9c57, 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1, 0x58e9, 0x652c, 0x705e, 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88, 0x8836, 0x8839, 0x8862, 0x8b93, 0x8b92, /* 0xc6 */ 0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744, 0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa, 0x9e7c, 0x9e7d, 0x9f07, 0x9f77, 0x9f72, 0x5ef3, 0x6b16, 0x7063, 0x7c6c, 0x7c6e, 0x883b, 0x89c0, 0x8ea1, 0x91c1, 0x9472, 0x9470, 0x9871, 0x995e, 0x9ad6, 0x9b23, 0x9ecc, 0x7064, 0x77da, 0x8b9a, 0x9477, 0x97c9, 0x9a62, 0x9a65, 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5, 0x947d, 0x947e, 0x947c, 0x9c77, 0x9c78, 0x9ef7, 0x8c54, 0x947f, 0x9e1a, 0x7228, 0x9a6a, 0x9b31, 0x9e1b, 0x9e1e, 0x7c72, 0x30fe, 0x309d, 0x309e, 0x3005, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, /* 0xc7 */ 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, }; static const unsigned short big5_2uni_pagec9[7652] = { /* 0xc9 */ 0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47, 0x4e8d, 0x56d7, 0xfa0c, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e, 0x4e2e, 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c, 0x53b9, 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3, 0x6bcc, 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9, 0x4ee1, 0x4edd, 0x4eda, 0x520c, 0x531c, 0x534c, 0x5722, 0x5723, 0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73, 0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x6c36, 0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a, 0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00, 0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04, 0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5209, 0x5210, 0x52a6, 0x5322, 0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, 0x572a, 0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, 0x5977, 0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, 0x5c7e, 0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, 0x5fd4, 0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259, 0x6260, 0x625a, 0x6265, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738, 0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52, 0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b, /* 0xca */ 0x6c4c, 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f, 0x7a75, 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d, 0x897e, 0x9099, 0x9097, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624, 0x9620, 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, 0x4f64, 0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, 0x4f33, 0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, 0x52ad, 0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, 0x5437, 0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, 0x543d, 0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, 0x56e5, 0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, 0x5940, 0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, 0x598f, 0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, 0x5c8f, 0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, 0x5c95, 0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, 0x5e8d, 0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, 0x5fed, 0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, 0x5fe3, 0x5ffa, 0x5fef, 0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e, 0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281, 0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x6537, 0x65f0, 0x65f4, 0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747, /* 0xcb */ 0x6759, 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b, 0x6bd0, 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b, 0x6c8f, 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95, 0x6c9c, 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a, 0x7263, 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5, 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594, 0x7595, 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809c, 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, 0x828a, 0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, 0x90a5, 0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, 0x4e33, 0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, 0x4f74, 0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, 0x4f79, 0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, 0x4f82, 0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, 0x5392, 0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, 0x546b, 0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, 0x546f, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, 0x56f9, 0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577b, 0x5773, 0x5774, 0x5762, /* 0xcc */ 0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce, 0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1, 0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93, 0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf, 0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7, 0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19, 0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d, 0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x6034, 0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d, 0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214, 0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca, 0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, 0x62b8, 0x653d, 0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, 0x6608, 0x65fb, 0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, 0x6610, 0x66f6, 0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, 0x677b, 0x6798, 0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, 0x679f, 0x6791, 0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, 0x6794, 0x6b25, 0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, 0x6ceb, 0x6cee, 0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, 0x6cd0, 0x6cc2, 0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2, /* 0xcd */ 0x6cd2, 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0, 0x6d30, 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1, 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082, 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, 0x72c9, 0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, 0x73a1, 0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, 0x74e8, 0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, 0x76f1, 0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, 0x77f7, 0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, 0x7cfd, 0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, 0x8220, 0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, 0x82a7, 0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, 0x82a9, 0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, 0x866d, 0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, 0x8fd5, 0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, 0x963d, 0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, 0x4fd3, 0x4fb2, 0x4fc9, 0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, 0x4fbb, 0x4fb3, 0x4fdb, 0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, 0x4fec, 0x5244, 0x5249, 0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, 0x5396, 0x5399, 0x5398, 0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf, /* 0xce */ 0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6, 0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0, 0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b, 0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4, 0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd, 0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db, 0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8, 0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, 0x5cdb, 0x5cde, 0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, 0x5cd4, 0x5ccf, 0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, 0x5e21, 0x5e22, 0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, 0x5e9b, 0x5ea3, 0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, 0x605b, 0x604c, 0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, 0x6066, 0x606e, 0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, 0x630e, 0x6303, 0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, 0x6300, 0x6313, 0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, 0x6543, 0x65aa, 0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, 0x6626, 0x6622, 0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, 0x662e, 0x670f, 0x6710, 0x67c1, 0x67f2, 0x67c8, 0x67ba, /* 0xcf */ 0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, 0x67eb, 0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, 0x67ee, 0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, 0x67fc, 0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, 0x67c9, 0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, 0x6bb6, 0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, 0x6d2d, 0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, 0x6d04, 0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, 0x6d01, 0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, 0x6d2c, 0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, 0x70b1, 0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, 0x724a, 0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, 0x72e4, 0x72e8, 0x72eb, 0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, 0x73cc, 0x73c2, 0x73c8, 0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, 0x73eb, 0x73bf, 0x73c7, 0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, 0x74ec, 0x74ee, 0x752e, 0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, 0x76c4, 0x7708, 0x7703, 0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, 0x76fa, 0x77e7, 0x77e8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780f, 0x780e, 0x7809, 0x7803, 0x7813, 0x794a, 0x794c, 0x794b, 0x7945, 0x7944, 0x79d5, 0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80, /* 0xd0 */ 0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f, 0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d, 0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7, 0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, 0x80e3, 0x80d9, 0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, 0x80e6, 0x80cd, 0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, 0x8307, 0x82e8, 0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, 0x82ec, 0x82e1, 0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, 0x82ea, 0x82e4, 0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, 0x867c, 0x8673, 0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, 0x8a04, 0x8a07, 0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, 0x90bd, 0x90bf, 0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, 0x91d4, 0x91d3, 0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, 0x501e, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, 0x4ff4, 0x5033, 0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, 0x5020, 0x5027, 0x5035, 0x502f, 0x5031, 0x500e, 0x515a, 0x5194, 0x5193, 0x51ca, 0x51c4, 0x51c5, 0x51c8, 0x51ce, 0x5261, 0x525a, 0x5252, 0x525e, 0x525f, 0x5255, 0x5262, 0x52cd, 0x530e, 0x539e, 0x5526, 0x54e2, 0x5517, 0x5512, 0x54e7, 0x54f3, 0x54e4, 0x551a, 0x54ff, 0x5504, 0x5508, 0x54eb, 0x5511, 0x5505, 0x54f1, /* 0xd1 */ 0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, 0x550b, 0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, 0x57c6, 0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, 0x57b9, 0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, 0x5a15, 0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, 0x5bad, 0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, 0x5cf1, 0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, 0x5eaa, 0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, 0x605a, 0x6067, 0x6041, 0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609d, 0x6083, 0x6095, 0x609b, 0x6097, 0x6087, 0x609c, 0x608e, 0x6219, 0x6246, 0x62f2, 0x6310, 0x6356, 0x632c, 0x6344, 0x6345, 0x6336, 0x6343, 0x63e4, 0x6339, 0x634b, 0x634a, 0x633c, 0x6329, 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632d, 0x6347, 0x6333, 0x635a, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654a, 0x6546, 0x65c6, 0x65c3, 0x65c4, 0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, 0x6712, 0x6713, 0x681f, 0x681a, 0x6849, 0x6832, 0x6833, 0x683b, 0x684b, 0x684f, 0x6816, 0x6831, 0x681c, 0x6835, 0x682b, 0x682d, 0x682f, 0x684e, 0x6844, 0x6834, 0x681d, 0x6812, 0x6814, 0x6826, 0x6828, 0x682e, 0x684d, 0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, 0x6b2d, 0x6b31, 0x6b34, 0x6b6d, 0x8082, 0x6b88, 0x6be6, 0x6be4, /* 0xd2 */ 0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, 0x6d63, 0x6d64, 0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, 0x6d6d, 0x6d6f, 0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, 0x6d67, 0x6d60, 0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, 0x6d2f, 0x6d68, 0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, 0x6d7b, 0x6d7d, 0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, 0x70cb, 0x7f39, 0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, 0x70cd, 0x70c5, 0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, 0x7278, 0x7277, 0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, 0x72f3, 0x72fb, 0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, 0x73e7, 0x73e3, 0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, 0x73da, 0x73d7, 0x73d8, 0x73e8, 0x74de, 0x74df, 0x74f4, 0x74f5, 0x7521, 0x755b, 0x755f, 0x75b0, 0x75c1, 0x75bb, 0x75c4, 0x75c0, 0x75bf, 0x75b6, 0x75ba, 0x768a, 0x76c9, 0x771d, 0x771b, 0x7710, 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771a, 0x7722, 0x7727, 0x7823, 0x782c, 0x7822, 0x7835, 0x782f, 0x7828, 0x782e, 0x782b, 0x7821, 0x7829, 0x7833, 0x782a, 0x7831, 0x7954, 0x795b, 0x794f, 0x795c, 0x7953, 0x7952, 0x7951, 0x79eb, 0x79ec, 0x79e0, 0x79ee, 0x79ed, 0x79ea, 0x79dc, 0x79de, 0x79dd, 0x7a86, 0x7a89, 0x7a85, 0x7a8b, 0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, 0x7b10, /* 0xd3 */ 0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, 0x7b09, 0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, 0x7c85, 0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, 0x7d1f, 0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, 0x7f5e, 0x7f60, 0x7f5d, 0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, 0x7fc0, 0x8016, 0x803e, 0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, 0x8101, 0x80fb, 0x8100, 0x8201, 0x822f, 0x8225, 0x8333, 0x832d, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833f, 0x8341, 0x8326, 0x831c, 0x8322, 0x8342, 0x834e, 0x831b, 0x832a, 0x8308, 0x833c, 0x834d, 0x8316, 0x8324, 0x8320, 0x8337, 0x832f, 0x8329, 0x8347, 0x8345, 0x834c, 0x8353, 0x831e, 0x832c, 0x834b, 0x8327, 0x8348, 0x8653, 0x8652, 0x86a2, 0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, 0x8687, 0x8697, 0x8686, 0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, 0x86a1, 0x86a7, 0x8695, 0x8698, 0x868e, 0x869d, 0x8690, 0x8694, 0x8843, 0x8844, 0x886d, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887f, 0x886f, 0x8883, 0x887e, 0x8874, 0x887c, 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4, 0x8ca3, 0x8d76, 0x8d78, 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3, 0x8ffe, 0x8ff5, 0x9002, 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6, 0x90d6, 0x90e0, 0x90d9, 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8, 0x90db, 0x90d7, 0x90dc, 0x90e4, 0x9150, /* 0xd4 */ 0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, 0x965f, 0x96bc, 0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, 0x5061, 0x505e, 0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, 0x504d, 0x5041, 0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, 0x5069, 0x506b, 0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, 0x5057, 0x5051, 0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, 0x52d3, 0x532d, 0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, 0x5534, 0x552a, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550c, 0x5532, 0x5565, 0x554e, 0x5539, 0x5548, 0x552d, 0x553b, 0x5540, 0x554b, 0x570a, 0x5707, 0x57fb, 0x5814, 0x57e2, 0x57f6, 0x57dc, 0x57f4, 0x5800, 0x57ed, 0x57fd, 0x5808, 0x57f8, 0x580b, 0x57f3, 0x57cf, 0x5807, 0x57ee, 0x57e3, 0x57f2, 0x57e5, 0x57ec, 0x57e1, 0x580e, 0x57fc, 0x5810, 0x57e7, 0x5801, 0x580c, 0x57f1, 0x57e9, 0x57f0, 0x580d, 0x5804, 0x595c, 0x5a60, 0x5a58, 0x5a55, 0x5a67, 0x5a5e, 0x5a38, 0x5a35, 0x5a6d, 0x5a50, 0x5a5f, 0x5a65, 0x5a6c, 0x5a53, 0x5a64, 0x5a57, 0x5a43, 0x5a5d, 0x5a52, 0x5a44, 0x5a5b, 0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, 0x5a39, 0x5a4c, 0x5a70, 0x5a69, 0x5a47, 0x5a51, 0x5a56, 0x5a42, 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1, 0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c, 0x5d28, 0x5d0d, 0x5d26, 0x5d25, 0x5d0f, /* 0xd5 */ 0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, 0x5e3e, 0x5e34, 0x5eb1, 0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, 0x5f38, 0x5f9b, 0x5f96, 0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, 0x60b0, 0x60ba, 0x60d3, 0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, 0x60c8, 0x60b1, 0x60db, 0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, 0x60c0, 0x6332, 0x6365, 0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, 0x63ad, 0x639d, 0x6397, 0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, 0x636e, 0x63af, 0x6375, 0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, 0x633b, 0x639f, 0x6378, 0x6385, 0x6381, 0x6391, 0x638d, 0x6370, 0x6553, 0x65cd, 0x6665, 0x6661, 0x665b, 0x6659, 0x665c, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, 0x68ab, 0x6956, 0x686f, 0x68a3, 0x68ac, 0x68a9, 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877, 0x6892, 0x687c, 0x686b, 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e, 0x689b, 0x6896, 0x688b, 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b, 0x6891, 0x688c, 0x688a, 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38, 0x6b91, 0x6b8f, 0x6b8d, 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab, 0x6db4, 0x6db3, 0x6e74, 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6, 0x6dd4, 0x6e00, 0x6dc8, 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5, 0x6ddc, 0x6ddd, 0x6ddb, 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0, 0x6dba, 0x6dd5, 0x6dc2, 0x6dcf, 0x6dc9, /* 0xd6 */ 0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, 0x6de3, 0x6dbb, 0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, 0x70f0, 0x7104, 0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, 0x7100, 0x70f8, 0x70f6, 0x710b, 0x7102, 0x710e, 0x727e, 0x727b, 0x727c, 0x727f, 0x731d, 0x7317, 0x7307, 0x7311, 0x7318, 0x730a, 0x7308, 0x72ff, 0x730f, 0x731e, 0x7388, 0x73f6, 0x73f8, 0x73f5, 0x7404, 0x7401, 0x73fd, 0x7407, 0x7400, 0x73fa, 0x73fc, 0x73ff, 0x740c, 0x740b, 0x73f4, 0x7408, 0x7564, 0x7563, 0x75ce, 0x75d2, 0x75cf, 0x75cb, 0x75cc, 0x75d1, 0x75d0, 0x768f, 0x7689, 0x76d3, 0x7739, 0x772f, 0x772d, 0x7731, 0x7732, 0x7734, 0x7733, 0x773d, 0x7725, 0x773b, 0x7735, 0x7848, 0x7852, 0x7849, 0x784d, 0x784a, 0x784c, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796a, 0x7963, 0x796b, 0x7961, 0x79bb, 0x79fa, 0x79f8, 0x79f6, 0x79f7, 0x7a8f, 0x7a94, 0x7a90, 0x7b35, 0x7b47, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24, 0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f, 0x7b32, 0x7b38, 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3, 0x7d35, 0x7d3d, 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29, 0x7d41, 0x7d47, 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63, 0x7f95, 0x7f9c, 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0, 0x7fd1, 0x7fc7, 0x7fcf, 0x7fc9, 0x801f, /* 0xd7 */ 0x801e, 0x801b, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119, 0x811b, 0x812d, 0x811f, 0x812c, 0x811e, 0x8121, 0x8115, 0x8127, 0x811d, 0x8122, 0x8211, 0x8238, 0x8233, 0x823a, 0x8234, 0x8232, 0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, 0x837a, 0x8373, 0x83a4, 0x8374, 0x838f, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83a9, 0x837d, 0x8383, 0x838c, 0x839d, 0x839b, 0x83aa, 0x838b, 0x837e, 0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, 0x837f, 0x83a6, 0x8387, 0x83ae, 0x8376, 0x839a, 0x8659, 0x8656, 0x86bf, 0x86b7, 0x86c2, 0x86c1, 0x86c5, 0x86ba, 0x86b0, 0x86c8, 0x86b9, 0x86b3, 0x86b8, 0x86cc, 0x86b4, 0x86bb, 0x86bc, 0x86c3, 0x86bd, 0x86be, 0x8852, 0x8889, 0x8895, 0x88a8, 0x88a2, 0x88aa, 0x889a, 0x8891, 0x88a1, 0x889f, 0x8898, 0x88a7, 0x8899, 0x889b, 0x8897, 0x88a4, 0x88ac, 0x888c, 0x8893, 0x888e, 0x8982, 0x89d6, 0x89d9, 0x89d5, 0x8a30, 0x8a27, 0x8a2c, 0x8a1e, 0x8c39, 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d, 0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf, 0x8dc1, 0x8ed8, 0x8ede, 0x8edd, 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1, 0x9024, 0x900b, 0x9011, 0x901c, 0x900c, 0x9021, 0x90ef, 0x90ea, 0x90f0, 0x90f4, 0x90f2, 0x90f3, 0x90d4, 0x90eb, 0x90ec, 0x90e9, 0x9156, 0x9158, 0x915a, 0x9153, 0x9155, 0x91ec, 0x91f4, 0x91f1, 0x91f3, 0x91f8, 0x91e4, 0x91f9, 0x91ea, /* 0xd8 */ 0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, 0x9586, 0x9588, 0x967c, 0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, 0x976a, 0x9804, 0x98e5, 0x9997, 0x509b, 0x5095, 0x5094, 0x509e, 0x508b, 0x50a3, 0x5083, 0x508c, 0x508e, 0x509d, 0x5068, 0x509c, 0x5092, 0x5082, 0x5087, 0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, 0x53a7, 0x5591, 0x55a8, 0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, 0x5593, 0x5588, 0x558f, 0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, 0x557d, 0x558c, 0x55a6, 0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, 0x5829, 0x5837, 0x5819, 0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, 0x5848, 0x5825, 0x581c, 0x581b, 0x5833, 0x583f, 0x5836, 0x582e, 0x5839, 0x5838, 0x582d, 0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, 0x5a9f, 0x5a7a, 0x5aa2, 0x5a9e, 0x5a78, 0x5aa6, 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae, 0x5a37, 0x5a84, 0x5a8a, 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b, 0x5a7d, 0x5a8c, 0x5a9c, 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd, 0x5bcb, 0x5bd4, 0x5bd1, 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37, 0x5d43, 0x5d6b, 0x5d41, 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e, 0x5d55, 0x5d33, 0x5d3a, 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42, 0x5d39, 0x5d49, 0x5d38, 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45, 0x5e44, 0x5e41, 0x5f58, 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9, 0x60cc, 0x60e2, 0x60ce, 0x60c4, 0x6114, /* 0xd9 */ 0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, 0x60f8, 0x60fc, 0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, 0x60ff, 0x6104, 0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, 0x63e5, 0x63e8, 0x63ef, 0x63c3, 0x649d, 0x63f3, 0x63ca, 0x63e0, 0x63f6, 0x63d5, 0x63f2, 0x63f5, 0x6461, 0x63df, 0x63be, 0x63dd, 0x63dc, 0x63c4, 0x63d8, 0x63d3, 0x63c2, 0x63c7, 0x63cc, 0x63cb, 0x63c8, 0x63f0, 0x63d7, 0x63d9, 0x6532, 0x6567, 0x656a, 0x6564, 0x655c, 0x6568, 0x6565, 0x658c, 0x659d, 0x659e, 0x65ae, 0x65d0, 0x65d2, 0x667c, 0x666c, 0x667b, 0x6680, 0x6671, 0x6679, 0x666a, 0x6672, 0x6701, 0x690c, 0x68d3, 0x6904, 0x68dc, 0x692a, 0x68ec, 0x68ea, 0x68f1, 0x690f, 0x68d6, 0x68f7, 0x68eb, 0x68e4, 0x68f6, 0x6913, 0x6910, 0x68f3, 0x68e1, 0x6907, 0x68cc, 0x6908, 0x6970, 0x68b4, 0x6911, 0x68ef, 0x68c6, 0x6914, 0x68f8, 0x68d0, 0x68fd, 0x68fc, 0x68e8, 0x690b, 0x690a, 0x6917, 0x68ce, 0x68c8, 0x68dd, 0x68de, 0x68e6, 0x68f4, 0x68d1, 0x6906, 0x68d4, 0x68e9, 0x6915, 0x6925, 0x68c7, 0x6b39, 0x6b3b, 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95, 0x6bbd, 0x6bf0, 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47, 0x6e1f, 0x6e49, 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b, 0x6e3f, 0x6e41, 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40, 0x6e51, 0x6e3b, 0x6e03, 0x6e2e, 0x6e5e, /* 0xda */ 0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, 0x6e60, 0x6e71, 0x6e6b, 0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, 0x6e27, 0x6e78, 0x6e64, 0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, 0x6e35, 0x6e36, 0x6e5a, 0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, 0x7131, 0x7123, 0x7125, 0x7122, 0x7132, 0x711f, 0x7128, 0x713a, 0x711b, 0x724b, 0x725a, 0x7288, 0x7289, 0x7286, 0x7285, 0x728b, 0x7312, 0x730b, 0x7330, 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732d, 0x7326, 0x7323, 0x7335, 0x730c, 0x742e, 0x742c, 0x7430, 0x742b, 0x7416, 0x741a, 0x7421, 0x742d, 0x7431, 0x7424, 0x7423, 0x741d, 0x7429, 0x7420, 0x7432, 0x74fb, 0x752f, 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1, 0x75e6, 0x75dd, 0x75df, 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da, 0x7746, 0x7747, 0x7744, 0x774d, 0x7745, 0x774a, 0x774e, 0x774b, 0x774c, 0x77de, 0x77ec, 0x7860, 0x7864, 0x7865, 0x785c, 0x786d, 0x7871, 0x786a, 0x786e, 0x7870, 0x7869, 0x7868, 0x785e, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c, 0x7a04, 0x7a99, 0x7ae6, 0x7ae4, 0x7b4a, 0x7b3b, 0x7b44, 0x7b48, 0x7b4c, 0x7b4e, 0x7b40, 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8, 0x7ca1, 0x7d58, 0x7d6f, 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a, 0x7d4f, 0x7d6d, 0x7d5c, 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51, 0x7d5f, 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65, /* 0xdb */ 0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, 0x7fd7, 0x8051, 0x804f, 0x8050, 0x80fe, 0x80d4, 0x8143, 0x814a, 0x8152, 0x814f, 0x8147, 0x813d, 0x814d, 0x813a, 0x81e6, 0x81ee, 0x81f7, 0x81f8, 0x81f9, 0x8204, 0x823c, 0x823d, 0x823f, 0x8275, 0x833b, 0x83cf, 0x83f9, 0x8423, 0x83c0, 0x83e8, 0x8412, 0x83e7, 0x83e4, 0x83fc, 0x83f6, 0x8410, 0x83c6, 0x83c8, 0x83eb, 0x83e3, 0x83bf, 0x8401, 0x83dd, 0x83e5, 0x83d8, 0x83ff, 0x83e1, 0x83cb, 0x83ce, 0x83d6, 0x83f5, 0x83c9, 0x8409, 0x840f, 0x83de, 0x8411, 0x8406, 0x83c2, 0x83f3, 0x83d5, 0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x83c3, 0x83ec, 0x83ee, 0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8, 0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb, 0x86dc, 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856, 0x8855, 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6, 0x88bc, 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998, 0x8997, 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59, 0x8a40, 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51, 0x8a4a, 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe, 0x8cb0, 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3, 0x8dcd, 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8, 0x8dd7, 0x8dc5, 0x8eef, 0x8ef7, 0x8efa, /* 0xdc */ 0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6, 0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, 0x8ee9, 0x902d, 0x9034, 0x902f, 0x9106, 0x912c, 0x9104, 0x90ff, 0x90fc, 0x9108, 0x90f9, 0x90fb, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f, 0x9162, 0x9160, 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226, 0x920f, 0x920c, 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204, 0x9227, 0x9202, 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216, 0x957b, 0x958d, 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x9689, 0x9683, 0x9680, 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c, 0x9770, 0x976e, 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83, 0x4e84, 0x4eb6, 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca, 0x50b4, 0x50c8, 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb, 0x50c9, 0x50b6, 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c, 0x55c3, 0x55db, 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0, 0x55d4, 0x55c4, 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5, 0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855, 0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871, 0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5, 0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6, /* 0xdd */ 0x5ab7, 0x5ac0, 0x5aca, 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90, 0x5bd6, 0x5bd8, 0x5bd9, 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a, 0x5d65, 0x5d72, 0x5d6c, 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0, 0x5e4f, 0x5e4e, 0x5e4a, 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6, 0x5ecb, 0x5ec7, 0x5f40, 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a, 0x612b, 0x6145, 0x6136, 0x6132, 0x612e, 0x6146, 0x612f, 0x614f, 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5, 0x63f1, 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, 0x6443, 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640c, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a, 0x641a, 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e, 0x6421, 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695, 0x6690, 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695f, 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a, 0x6939, 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935, 0x696c, 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969, 0x6940, 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c, 0x693b, 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952, 0x692f, 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, 0x6b48, 0x6b41, 0x6b9b, 0xfa0d, 0x6bfb, 0x6bfc, /* 0xde */ 0x6bf9, 0x6bf7, 0x6bf8, 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0, 0x6e9f, 0x6e93, 0x6e94, 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2, 0x6ebd, 0x6ec1, 0x6e9e, 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6, 0x6ecf, 0x6eb2, 0x6ebe, 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92, 0x6e8e, 0x6e8d, 0x6ea4, 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca, 0x6e97, 0x6eae, 0x6ea3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160, 0x7141, 0x715d, 0x7162, 0x7172, 0x7178, 0x716a, 0x7161, 0x7142, 0x7158, 0x7143, 0x714b, 0x7170, 0x715f, 0x7150, 0x7153, 0x7144, 0x714d, 0x715a, 0x724f, 0x728d, 0x728c, 0x7291, 0x7290, 0x728e, 0x733c, 0x7342, 0x733b, 0x733a, 0x7340, 0x734a, 0x7349, 0x7444, 0x744a, 0x744b, 0x7452, 0x7451, 0x7457, 0x7440, 0x744f, 0x7450, 0x744e, 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe, 0x74fd, 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603, 0x75f7, 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6, 0x75ed, 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f, 0x7760, 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759, 0x776d, 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895, 0x7885, 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896, 0x787b, 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19, 0x7a12, 0x7a17, 0x7a15, 0x7a22, 0x7a13, /* 0xdf */ 0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, 0x7a9e, 0x7aeb, 0x7b66, 0x7b64, 0x7b6d, 0x7b74, 0x7b69, 0x7b72, 0x7b65, 0x7b73, 0x7b71, 0x7b70, 0x7b61, 0x7b78, 0x7b76, 0x7b63, 0x7cb2, 0x7cb4, 0x7caf, 0x7d88, 0x7d86, 0x7d80, 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b, 0x7d83, 0x7d7c, 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d, 0x7f6b, 0x7f67, 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb, 0x7fdc, 0x8021, 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b, 0x8162, 0x8172, 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x8144, 0x8161, 0x821d, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1, 0x843f, 0x8456, 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459, 0x8474, 0x8473, 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434, 0x847a, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b, 0x842f, 0x8442, 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c, 0x8452, 0x846f, 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433, 0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450, 0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d, 0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6, 0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0, 0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4, /* 0xe0 */ 0x89e1, 0x89e0, 0x89e2, 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f, 0x8a61, 0x8a3f, 0x8a77, 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81, 0x8a74, 0x8a7a, 0x8c3c, 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66, 0x8c86, 0x8c84, 0x8c85, 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c, 0x8d8e, 0x8d8f, 0x8d8d, 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0, 0x8de0, 0x8dec, 0x8df1, 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2, 0x8de7, 0x8df2, 0x8deb, 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00, 0x8f05, 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x9044, 0x9049, 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114, 0x910b, 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a, 0x9266, 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246, 0x926d, 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253, 0x924c, 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692, 0x9693, 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac, 0x98f6, 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab, 0x9b5b, 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4, 0x50d7, 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, 0x50d3, 0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0, /* 0xe1 */ 0x51d8, 0x5280, 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627, 0x5615, 0x560c, 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613, 0x5602, 0x55fa, 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c, 0x5890, 0x5898, 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a, 0x5887, 0x5891, 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894, 0x588f, 0x58fe, 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea, 0x5ada, 0x5aed, 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec, 0x5ade, 0x5add, 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x5be3, 0x5c63, 0x5d82, 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77, 0x5d8a, 0x5d89, 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f, 0x5e58, 0x5e59, 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc, 0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6, 0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153, 0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165, 0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b, 0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d, 0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b, 0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459, 0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705, 0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9, /* 0xe2 */ 0x69a0, 0x69ce, 0x6996, 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999, 0x698e, 0x69a7, 0x698d, 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4, 0x69bd, 0x69a4, 0x69d4, 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3, 0x6993, 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2, 0x69b5, 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f, 0x6ba0, 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03, 0x6f25, 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19, 0x6f1a, 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x6f36, 0x6f73, 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35, 0x6eeb, 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39, 0x6f1c, 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343, 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472, 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, 0x7590, 0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, 0x76b8, 0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, 0x777e, 0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, 0x78ab, 0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, 0x798a, 0x798b, 0x7996, 0x7995, 0x7994, 0x7993, /* 0xe3 */ 0x7997, 0x7988, 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f, 0x7a28, 0x7a26, 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c, 0x7b8a, 0x7b91, 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e, 0x7b85, 0x7b98, 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf, 0x7cbc, 0x7cba, 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1, 0x7dc0, 0x7dc5, 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc, 0x7daf, 0x7db9, 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9, 0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x8024, 0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c, 0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce, 0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd, 0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2, 0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6, 0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db, 0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740, 0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741, 0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712, 0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724, 0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, 0x88f2, 0x88fa, 0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb, /* 0xe4 */ 0x88f0, 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9, 0x89eb, 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96, 0x8c3d, 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09, 0x8e02, 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06, 0x8e05, 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d, 0x9123, 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124, 0x9121, 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4, 0x9276, 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x92a6, 0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e, 0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286, 0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, 0x928b, 0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, 0x977e, 0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, 0x97ce, 0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, 0x999d, 0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, 0x99c7, 0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, 0x9b5f, 0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, 0x50f8, 0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, 0x510a, 0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, 0x5635, 0x5641, 0x564a, 0x5649, 0x5646, 0x5658, /* 0xe5 */ 0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a, 0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af, 0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7, 0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05, 0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93, 0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d, 0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2, 0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x619b, 0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d, 0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485, 0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f, 0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2, 0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af, 0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4, 0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, 0x69fe, 0x6a27, 0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, 0x6a08, 0x69e6, 0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, 0x6a18, 0x6a25, 0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, 0x6b51, 0x6ba5, 0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, 0x6c02, 0x6f41, 0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92, /* 0xe6 */ 0x6f8d, 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96, 0x6f76, 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57, 0x6f94, 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67, 0x6f90, 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77, 0x6f6a, 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a, 0x71a9, 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa, 0x719c, 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, 0x735e, 0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 0x7362, 0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, 0x7488, 0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, 0x7619, 0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, 0x769d, 0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, 0x78bb, 0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, 0x78c4, 0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, 0x6b76, 0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, 0x7bac, 0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, 0x7ccc, 0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, 0x7e03, 0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, 0x7f76, 0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, 0x7fea, 0x7fec, 0x7fe6, 0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f, /* 0xe7 */ 0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253, 0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500, 0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c, 0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2, 0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9, 0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e, 0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9, 0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x8756, 0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b, 0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750, 0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, 0x876e, 0x875c, 0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, 0x8769, 0x885a, 0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, 0x8919, 0x8906, 0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, 0x89a3, 0x89ed, 0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, 0x8ad1, 0x8ad4, 0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, 0x8ad8, 0x8ac3, 0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, 0x8ce5, 0x8cdf, 0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, 0x8d9c, 0x8da1, 0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, 0x8e15, 0x8e1b, 0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27, /* 0xe8 */ 0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c, 0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073, 0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, 0x912a, 0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, 0x9182, 0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, 0x92b6, 0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, 0x92cc, 0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, 0x92cd, 0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, 0x92b5, 0x92e1, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, 0x95ae, 0x95b0, 0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, 0x975a, 0x978a, 0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, 0x9826, 0x9829, 0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, 0x98fa, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, 0x99cf, 0x99d3, 0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, 0x99d7, 0x99cc, 0x9ab3, 0x9aec, 0x9aeb, 0x9af3, 0x9af2, 0x9af1, 0x9b46, 0x9b43, 0x9b67, 0x9b74, 0x9b71, 0x9b66, 0x9b76, 0x9b75, 0x9b70, 0x9b68, 0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, 0x9cfd, 0x9cff, 0x9cf7, 0x9d07, 0x9d00, 0x9cf9, 0x9cfb, 0x9d08, 0x9d05, 0x9d04, 0x9e83, 0x9ed3, 0x9f0f, 0x9f10, 0x511c, 0x5113, 0x5117, 0x511a, 0x5111, 0x51de, 0x5334, 0x53e1, 0x5670, 0x5660, 0x566e, /* 0xe9 */ 0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, 0x571c, 0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, 0x58bc, 0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, 0x5b10, 0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, 0x5db1, 0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, 0x5db2, 0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, 0x5ee9, 0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, 0x5fbc, 0x619d, 0x61a8, 0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 0x61bf, 0x61b8, 0x618c, 0x64d7, 0x64d6, 0x64d0, 0x64cf, 0x64c9, 0x64bd, 0x6489, 0x64c3, 0x64db, 0x64f3, 0x64d9, 0x6533, 0x657f, 0x657c, 0x65a2, 0x66c8, 0x66be, 0x66c0, 0x66ca, 0x66cb, 0x66cf, 0x66bd, 0x66bb, 0x66ba, 0x66cc, 0x6723, 0x6a34, 0x6a66, 0x6a49, 0x6a67, 0x6a32, 0x6a68, 0x6a3e, 0x6a5d, 0x6a6d, 0x6a76, 0x6a5b, 0x6a51, 0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, 0x6a41, 0x6a6a, 0x6a64, 0x6a50, 0x6a4f, 0x6a54, 0x6a6f, 0x6a69, 0x6a60, 0x6a3c, 0x6a5e, 0x6a56, 0x6a55, 0x6a4d, 0x6a4e, 0x6a46, 0x6b55, 0x6b54, 0x6b56, 0x6ba7, 0x6baa, 0x6bab, 0x6bc8, 0x6bc7, 0x6c04, 0x6c03, 0x6c06, 0x6fad, 0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4, 0x6fbd, 0x6f9e, 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba, 0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8, /* 0xea */ 0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, 0x6fb2, 0x6fb0, 0x71c5, 0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, 0x71c1, 0x71cb, 0x71d4, 0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, 0x71bc, 0x71c6, 0x71da, 0x71db, 0x729d, 0x729e, 0x7369, 0x7366, 0x7367, 0x736c, 0x7365, 0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, 0x7494, 0x7492, 0x7495, 0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, 0x7631, 0x763d, 0x7633, 0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, 0x76e6, 0x779a, 0x779d, 0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, 0x7795, 0x7799, 0x7797, 0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1, 0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47, 0x7ab6, 0x7ab8, 0x7ab5, 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7, 0x7bdd, 0x7bd5, 0x7be5, 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea, 0x7be2, 0x7bdc, 0x7beb, 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7, 0x7cd0, 0x7cd1, 0x7e12, 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20, 0x7e13, 0x7e0e, 0x7e1c, 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f, 0x7e16, 0x7e0d, 0x7e14, 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c, 0x7f7a, 0x7fb1, 0x7fef, 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6, 0x81ae, 0x81b9, 0x81b5, 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2, 0x81b7, 0x81a7, 0x81f2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545, 0x856b, 0x854d, 0x8553, 0x8561, 0x8558, /* 0xeb */ 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555, 0x8567, 0x8560, 0x858c, 0x8566, 0x855d, 0x8554, 0x8565, 0x856c, 0x8663, 0x8665, 0x8664, 0x879b, 0x878f, 0x8797, 0x8793, 0x8792, 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785, 0x8790, 0x8791, 0x879d, 0x8784, 0x8794, 0x879c, 0x879a, 0x8789, 0x891e, 0x8926, 0x8930, 0x892d, 0x892e, 0x8927, 0x8931, 0x8922, 0x8929, 0x8923, 0x892f, 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x8ae2, 0x8af2, 0x8af4, 0x8af5, 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0, 0x8ac8, 0x8ade, 0x8ae1, 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91, 0x8c92, 0x8c90, 0x8cf5, 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c, 0x8d6e, 0x8da5, 0x8da7, 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45, 0x8e36, 0x8e3c, 0x8e3d, 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36, 0x8f2e, 0x8f35, 0x8f32, 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079, 0x907b, 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191, 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306, 0x930f, 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301, 0x9346, 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9325, 0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329, 0x9339, 0x9335, 0x932a, 0x9314, 0x930c, /* 0xec */ 0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, 0x9316, 0x95bc, 0x95cd, 0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, 0x95b5, 0x95bd, 0x96a9, 0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97f0, 0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, 0x991f, 0x9927, 0x9929, 0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, 0x99f0, 0x99e3, 0x99ea, 0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, 0x9abb, 0x9af6, 0x9afa, 0x9af9, 0x9af7, 0x9b33, 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e, 0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x9b7d, 0x9b88, 0x9d25, 0x9d17, 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d, 0x9d18, 0x9d22, 0x9d10, 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87, 0x9eae, 0x9ead, 0x9ed5, 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c, 0x568d, 0x5686, 0x5684, 0x5683, 0x567e, 0x5682, 0x567f, 0x5681, 0x58d6, 0x58d4, 0x58cf, 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23, 0x5b2c, 0x5b27, 0x5b26, 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2, 0x5db7, 0x5e6c, 0x5e6a, 0x5fbe, 0x5fbb, 0x61c3, 0x61b5, 0x61bc, 0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9, 0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da, 0x66d2, 0x6a8d, 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b, 0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e, /* 0xed */ 0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, 0x6a7f, 0x6aa6, 0x6a9a, 0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, 0x6c09, 0x6fcc, 0x6fa9, 0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, 0x6fe7, 0x6fe6, 0x6fde, 0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, 0x71f1, 0x71e8, 0x71f2, 0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, 0x736f, 0x7497, 0x74b2, 0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, 0x74a5, 0x74af, 0x7510, 0x7511, 0x7512, 0x750f, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, 0x77b7, 0x77b6, 0x77b4, 0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc, 0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c, 0x7a5b, 0x7a56, 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1, 0x7c05, 0x7c0f, 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4, 0x7c0b, 0x7bf3, 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd, 0x7c06, 0x7bf0, 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c, 0x7e42, 0x7e33, 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47, 0x7e29, 0x7e4c, 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45, 0x7f7f, 0x7f7e, 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4, 0x81cc, 0x81ca, 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a, 0x825c, 0x8583, 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b, 0x85a3, 0x857b, 0x85a4, 0x859a, 0x859e, /* 0xee */ 0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e, 0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582, 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859f, 0x8668, 0x87be, 0x87aa, 0x87ad, 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5, 0x87bc, 0x87ae, 0x87c9, 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af, 0x87c4, 0x87ca, 0x87b4, 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de, 0x87b2, 0x8935, 0x8933, 0x893c, 0x893e, 0x8941, 0x8952, 0x8937, 0x8942, 0x89ad, 0x89af, 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x8b18, 0x8b16, 0x8b11, 0x8b05, 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15, 0x8b07, 0x8b0d, 0x8b08, 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f, 0x8c70, 0x8c72, 0x8c71, 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f, 0x8e4e, 0x8e4d, 0x8e53, 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40, 0x9085, 0x907e, 0x9138, 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f, 0x91a1, 0x919d, 0x91a0, 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356, 0x9347, 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355, 0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363, 0x9367, 0x9380, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3, 0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718, 0x971d, 0x9719, 0x979a, 0x97a1, 0x979c, /* 0xef */ 0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, 0x9841, 0x9844, 0x984a, 0x9849, 0x9845, 0x9843, 0x9925, 0x992b, 0x992c, 0x992a, 0x9933, 0x9932, 0x992f, 0x992d, 0x9931, 0x9930, 0x9998, 0x99a3, 0x99a1, 0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, 0x99f8, 0x99f6, 0x99fb, 0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, 0x9afe, 0x9afd, 0x9b01, 0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, 0x9b9b, 0x9ba6, 0x9ba1, 0x9ba5, 0x9ba4, 0x9b86, 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41, 0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x9d45, 0x9d42, 0x9d43, 0x9d3e, 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d, 0x9e8a, 0x9e89, 0x9e8d, 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff, 0x9f24, 0x9f23, 0x9f22, 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e, 0x5698, 0x569c, 0x5697, 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c, 0x5c69, 0x5c6a, 0x5dc0, 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed, 0x61ee, 0x61f1, 0x61ea, 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff, 0x6504, 0x64fd, 0x64f8, 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db, 0x66da, 0x66db, 0x66d8, 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6, 0x6aba, 0x6ab6, 0x6ab7, 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9, 0x6c0b, 0x7007, 0x700c, 0x700d, 0x7001, 0x7005, 0x7014, 0x700e, 0x6fff, 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201, 0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376, /* 0xf0 */ 0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2, 0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 0x78ff, 0x790c, 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79ad, 0x79ac, 0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, 0x7c1f, 0x7c2d, 0x7c1d, 0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, 0x7e5c, 0x7e50, 0x7e56, 0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, 0x7e60, 0x7e57, 0x7e53, 0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, 0x81d1, 0x81d2, 0x81d0, 0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3, 0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8, 0x85c5, 0x85b1, 0x85b6, 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be, 0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5, 0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8, 0x87e3, 0x87a4, 0x87d7, 0x87d9, 0x8801, 0x87f4, 0x87e8, 0x87dd, 0x8953, 0x894b, 0x894f, 0x894c, 0x8946, 0x8950, 0x8951, 0x8949, 0x8b2a, 0x8b27, 0x8b23, 0x8b33, 0x8b30, 0x8b35, 0x8b47, 0x8b2f, 0x8b3c, 0x8b3e, 0x8b31, 0x8b25, 0x8b37, 0x8b26, 0x8b36, 0x8b2e, 0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, 0x8c42, 0x8c75, 0x8c99, 0x8c98, 0x8c97, 0x8cfe, 0x8d04, 0x8d02, 0x8d00, 0x8e5c, 0x8e62, 0x8e60, 0x8e57, 0x8e56, 0x8e5e, 0x8e65, 0x8e67, /* 0xf1 */ 0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47, 0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5, 0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, 0x9392, 0x93b7, 0x939b, 0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395, 0x9388, 0x9399, 0x939f, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4, 0x93a8, 0x93b4, 0x93a3, 0x93a5, 0x95d2, 0x95d3, 0x95d1, 0x96b3, 0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722, 0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 0x97a2, 0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, 0x97fa, 0x9850, 0x9851, 0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, 0x9a0f, 0x9a0b, 0x9a09, 0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, 0x9a07, 0x9a06, 0x9ac0, 0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, 0x9b35, 0x9b4a, 0x9b4c, 0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, 0x9bc1, 0x9bb5, 0x9bb8, 0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, 0x9d5c, 0x9d53, 0x9d4f, 0x9d4a, 0x9d5b, 0x9d4b, 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52, 0x9d54, 0x9d5f, 0x9d58, 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01, 0x9f00, 0x9f16, 0x9f25, 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c, 0x9f55, 0x5134, 0x5135, 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad, 0x56a6, 0x56a7, 0x56aa, 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912, 0x5b3d, 0x5b3e, 0x5b3f, 0x5dc3, 0x5e70, /* 0xf2 */ 0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, 0x650c, 0x650e, 0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, 0x6acc, 0x6ad1, 0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, 0x6acf, 0x6acd, 0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, 0x7020, 0x7016, 0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701c, 0x702a, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6, 0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, 0x74b7, 0x74c3, 0x7516, 0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 0x7921, 0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, 0x7a68, 0x7c33, 0x7c3c, 0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, 0x7e76, 0x7e75, 0x7e78, 0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, 0x7e74, 0x7e68, 0x7f4b, 0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, 0x7ffe, 0x8078, 0x81d7, 0x81d5, 0x8264, 0x8261, 0x8263, 0x85eb, 0x85f1, 0x85ed, 0x85d9, 0x85e1, 0x85e8, 0x85da, 0x85d7, 0x85ec, 0x85f2, 0x85f8, 0x85d8, 0x85df, 0x85e3, 0x85dc, 0x85d1, 0x85f0, 0x85e6, 0x85ef, 0x85de, 0x85e2, 0x8800, 0x87fa, 0x8803, 0x87f6, 0x87f7, 0x8809, 0x880c, 0x880b, 0x8806, 0x87fc, 0x8808, 0x87ff, 0x880a, 0x8802, 0x8962, 0x895a, 0x895b, 0x8957, 0x8961, 0x895c, 0x8958, 0x895d, 0x8959, 0x8988, 0x89b7, 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40, 0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55, /* 0xf3 */ 0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, 0x8c77, 0x8c76, 0x8c9a, 0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, 0x8dad, 0x8dab, 0x8e6d, 0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, 0x8ec2, 0x8f52, 0x8f51, 0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, 0x913f, 0x91b0, 0x91ad, 0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, 0x93d0, 0x93f9, 0x93ec, 0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, 0x93d4, 0x93ee, 0x93e3, 0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, 0x93e7, 0x957d, 0x95da, 0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x97b3, 0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d, 0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943, 0x99a6, 0x99a7, 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b, 0x9a22, 0x9a20, 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2, 0x9b0b, 0x9b0a, 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0, 0x9bde, 0x9be4, 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec, 0x9bdc, 0x9bd9, 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81, 0x9d8a, 0x9d84, 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b, 0x9d8c, 0x9d7d, 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85, 0x9d73, 0x9d7b, 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68, 0x9e94, 0x9e91, 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d, 0x9f56, 0x9f57, 0x9f58, 0x5337, 0x56b2, /* 0xf4 */ 0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef, 0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df, 0x66e8, 0x66e3, 0x66e4, 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9, 0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034, 0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x7040, 0x703b, 0x7033, 0x7041, 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba, 0x76ab, 0x76aa, 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd, 0x77f2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79b2, 0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47, 0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff, 0x8079, 0x81db, 0x81d9, 0x820b, 0x8268, 0x8269, 0x8622, 0x85ff, 0x8601, 0x85fe, 0x861b, 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605, 0x860c, 0x85fd, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816, 0x8963, 0x8966, 0x89b9, 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68, 0x8b63, 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84, 0x8f59, 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143, 0x9141, 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb, 0x9420, 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419, 0x940d, 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412, 0x93fa, 0x9409, 0x93f8, 0x940a, 0x93ff, /* 0xf5 */ 0x93fc, 0x940c, 0x93f6, 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df, 0x972e, 0x972f, 0x97b9, 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862, 0x9863, 0x985f, 0x98c1, 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c, 0x994b, 0x9953, 0x9a32, 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36, 0x9a29, 0x9a2e, 0x9a38, 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10, 0x9b12, 0x9b11, 0x9c0b, 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8, 0x9c40, 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f, 0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x9da0, 0x9d94, 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8, 0x9d9e, 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99, 0x9e9b, 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e, 0x9f5b, 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139, 0x5298, 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb, 0x5dcf, 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8, 0x6b00, 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046, 0x721d, 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d, 0x7931, 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0x7e87, 0x7e88, 0x7e8b, 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, 0x8618, 0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e, 0x8621, 0x8620, 0x8629, 0x861e, 0x8625, /* 0xf6 */ 0x8829, 0x881d, 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a, 0x896d, 0x8969, 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45, 0x8b7a, 0x8b7b, 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e, 0x8f5b, 0x8f5d, 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b, 0x9436, 0x9429, 0x943d, 0x943c, 0x9430, 0x9439, 0x942a, 0x9437, 0x942c, 0x9440, 0x9431, 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a, 0x97bf, 0x97e1, 0x9864, 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956, 0x9a39, 0x9a3d, 0x9a46, 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x9a3f, 0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b, 0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21, 0x9db7, 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe, 0x9dc5, 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac, 0x9dc8, 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a, 0x9e9c, 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31, 0x9f4e, 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb, 0x5971, 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056, 0x7057, 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5, 0x74d9, 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71, 0x7c57, 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a, /* 0xf7 */ 0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634, 0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826, 0x882a, 0x8825, 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84, 0x8b82, 0x8b86, 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a, 0x8e92, 0x8e90, 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c, 0x9450, 0x944a, 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449, 0x9446, 0x973f, 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b, 0x9a4e, 0x9a53, 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x9a49, 0x9a52, 0x9a50, 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55, 0x9c46, 0x9c48, 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c, 0x9c37, 0x9c34, 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde, 0x9dda, 0x9dcb, 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9, 0x9dd8, 0x9dd6, 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35, 0x9f33, 0x9f32, 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299, 0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12, 0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383, 0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640, 0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e, 0x8833, 0x8976, 0x8974, 0x8973, 0x89fe, /* 0xf8 */ 0x8b8c, 0x8b8e, 0x8b8b, 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64, 0x8f63, 0x91bc, 0x9462, 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4, 0x97c5, 0x9800, 0x9a56, 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52, 0x9c58, 0x9c50, 0x9c4a, 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c, 0x9c4e, 0x9dfb, 0x9df7, 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4, 0x9df6, 0x9de1, 0x9dee, 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec, 0x9df4, 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3, 0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x9f71, 0x9f70, 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d, 0x66ed, 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223, 0x74db, 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97, 0x7f89, 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94, 0x8b95, 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2, 0x946b, 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7, 0x97e5, 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62, 0x9c5e, 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05, 0x9e00, 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e, 0x9f46, 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, 0x6b18, 0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9, 0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a, /* 0xf9 */ 0x7e98, 0x7e9b, 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648, 0x8979, 0x897a, 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5, 0x8ea4, 0x8ea3, 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749, 0x9872, 0x995f, 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10, 0x9e0f, 0x9e12, 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78, 0x9f7b, 0x9f7a, 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2, 0x8ea6, 0x91c3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9c74, 0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x9fa4, 0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e, 0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, 0x9961, 0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48, 0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481, 0x9a69, 0x9a68, 0x9b2e, 0x9e19, 0x7229, 0x864b, 0x8b9f, 0x9483, 0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a, 0x9ea4, 0x9f7e, 0x9f49, 0x9f98, }; static int big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0xa1 && c1 <= 0xc7) || (c1 >= 0xc9 && c1 <= 0xf9)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) { unsigned int i = 157 * (c1 - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40)); unsigned short wc = 0xfffd; if (i < 6280) { if (i < 6121) wc = big5_2uni_pagea1[i]; } else { if (i < 13932) wc = big5_2uni_pagec9[i-6280]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short big5_2charset[13703] = { 0xa246, 0xa247, 0xa244, 0xa1b1, 0xa258, 0xa1d3, 0xa150, 0xa1d1, 0xa1d2, 0xa3be, 0xa3bc, 0xa3bd, 0xa3bf, 0xa3bb, 0xa344, 0xa345, 0xa346, 0xa347, 0xa348, 0xa349, 0xa34a, 0xa34b, 0xa34c, 0xa34d, 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352, 0xa353, 0xa354, 0xa355, 0xa356, 0xa357, 0xa358, 0xa359, 0xa35a, 0xa35b, 0xa35c, 0xa35d, 0xa35e, 0xa35f, 0xa360, 0xa361, 0xa362, 0xa363, 0xa364, 0xa365, 0xa366, 0xa367, 0xa368, 0xa369, 0xa36a, 0xa36b, 0xa36c, 0xa36d, 0xa36e, 0xa36f, 0xa370, 0xa371, 0xa372, 0xa373, 0xc7b3, 0xc7b1, 0xc7b2, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7ce, 0xa156, 0xa158, 0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8, 0xa145, 0xa14c, 0xa14b, 0xa1ac, 0xa1ab, 0xa1b0, 0xa1c2, 0xa24a, 0xa1c1, 0xa24b, 0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2, 0xa1f6, 0xa1f4, 0xa1f7, 0xa1f5, 0xa1f8, 0xa1f9, 0xa1fb, 0xa1fa, 0xa1d4, 0xa1db, 0xa1e8, 0xa1e7, 0xa1fd, 0xa1fc, 0xa1e4, 0xa1e5, 0xa1ec, 0xa1ed, 0xa1ef, 0xa1ee, 0xa1e3, 0xa1dc, 0xa1da, 0xa1dd, 0xa1d8, 0xa1d9, 0xa1e6, 0xa1e9, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xa277, 0xa278, 0xa27a, 0xa27b, 0xa27c, 0xa27d, 0xa275, 0xa274, 0xa273, 0xa272, 0xa271, 0xa2a4, 0xa2a5, 0xa2a7, 0xa2a6, 0xa27e, 0xa2a1, 0xa2a3, 0xa2a2, 0xa2ac, 0xa2ad, 0xa2ae, 0xa262, 0xa263, 0xa264, 0xa265, 0xa266, 0xa267, 0xa268, 0xa269, 0xa270, 0xa26f, 0xa26e, 0xa26d, 0xa26c, 0xa26b, 0xa26a, 0xa276, 0xa279, 0xa1bd, 0xa1bc, 0xa1b6, 0xa1b5, 0xa1bf, 0xa1be, 0xa1bb, 0xa1ba, 0xa1b3, 0xa1b7, 0xa1b4, 0xa2a8, 0xa2a9, 0xa2ab, 0xa2aa, 0xa1b9, 0xa1b8, 0xa1f3, 0xa1f0, 0xa1f2, 0xa1f1, 0xa140, 0xa142, 0xa143, 0xa1b2, 0xc6a4, 0xa171, 0xa172, 0xa16d, 0xa16e, 0xa175, 0xa176, 0xa179, 0xa17a, 0xa169, 0xa16a, 0xa245, 0xa165, 0xa166, 0xa1a9, 0xa1aa, 0xa2c3, 0xa2c4, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca, 0xa2cb, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3, 0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3, 0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb, 0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3, 0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db, 0xc6dc, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3, 0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6a2, 0xc6a3, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac, 0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc6a1, 0xa374, 0xa375, 0xa376, 0xa377, 0xa378, 0xa379, 0xa37a, 0xa37b, 0xa37c, 0xa37d, 0xa37e, 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8, 0xa3b9, 0xa3ba, 0xa1c0, 0xa255, 0xa256, 0xa250, 0xa251, 0xa252, 0xa254, 0xa257, 0xa253, 0xa1eb, 0xa1ea, 0xa24f, 0xa440, 0xa442, 0xa443, 0xc945, 0xa456, 0xa454, 0xa457, 0xa455, 0xc946, 0xa4a3, 0xc94f, 0xc94d, 0xa4a2, 0xa4a1, 0xa542, 0xa541, 0xa540, 0xa543, 0xa4fe, 0xa5e0, 0xa5e1, 0xa8c3, 0xa458, 0xa4a4, 0xc950, 0xa4a5, 0xc963, 0xa6ea, 0xcbb1, 0xa459, 0xa4a6, 0xa544, 0xc964, 0xc940, 0xa444, 0xa45b, 0xc947, 0xa45c, 0xa4a7, 0xa545, 0xa547, 0xa546, 0xa5e2, 0xa5e3, 0xa8c4, 0xadbc, 0xa441, 0xc941, 0xa445, 0xa45e, 0xa45d, 0xa5e4, 0xa8c5, 0xb0ae, 0xd44b, 0xb6c3, 0xdcb1, 0xdcb2, 0xa446, 0xa4a9, 0xa8c6, 0xa447, 0xc948, 0xa45f, 0xa4aa, 0xa4ac, 0xc951, 0xa4ad, 0xa4ab, 0xa5e5, 0xa8c7, 0xa8c8, 0xab45, 0xa460, 0xa4ae, 0xa5e6, 0xa5e8, 0xa5e7, 0xa6eb, 0xa8c9, 0xa8ca, 0xab46, 0xab47, 0xadbd, 0xdcb3, 0xf6d6, 0xa448, 0xa4b0, 0xa4af, 0xc952, 0xa4b1, 0xa4b7, 0xa4b2, 0xa4b3, 0xc954, 0xc953, 0xa4b5, 0xa4b6, 0xa4b4, 0xa54a, 0xa54b, 0xa54c, 0xa54d, 0xa549, 0xa550, 0xc96a, 0xc966, 0xc969, 0xa551, 0xa561, 0xc968, 0xa54e, 0xa54f, 0xa548, 0xc965, 0xc967, 0xa5f5, 0xc9b0, 0xa5f2, 0xa5f6, 0xc9ba, 0xc9ae, 0xa5f3, 0xc9b2, 0xa5f4, 0xa5f7, 0xa5e9, 0xc9b1, 0xa5f8, 0xc9b5, 0xc9b9, 0xc9b6, 0xc9b3, 0xa5ea, 0xa5ec, 0xa5f9, 0xa5ee, 0xc9ab, 0xa5f1, 0xa5ef, 0xa5f0, 0xc9bb, 0xc9b8, 0xc9af, 0xa5ed, 0xc9ac, 0xa5eb, 0xc9b4, 0xc9b7, 0xc9ad, 0xca66, 0xa742, 0xa6f4, 0xca67, 0xa6f1, 0xa744, 0xa6f9, 0xa6f8, 0xca5b, 0xa6fc, 0xa6f7, 0xca60, 0xca68, 0xca64, 0xa6fa, 0xa6fd, 0xa6ee, 0xa747, 0xca5d, 0xcbbd, 0xa6ec, 0xa743, 0xa6ed, 0xa6f5, 0xa6f6, 0xca62, 0xca5e, 0xa6fb, 0xa6f3, 0xca5a, 0xa6ef, 0xca65, 0xa745, 0xa748, 0xa6f2, 0xa740, 0xa746, 0xa6f0, 0xca63, 0xa741, 0xca69, 0xca5c, 0xa6fe, 0xca5f, 0xca61, 0xa8d8, 0xcbbf, 0xcbcb, 0xa8d0, 0xcbcc, 0xa8cb, 0xa8d5, 0xa8ce, 0xcbb9, 0xa8d6, 0xcbb8, 0xcbbc, 0xcbc3, 0xcbc1, 0xa8de, 0xa8d9, 0xcbb3, 0xcbb5, 0xa8db, 0xa8cf, 0xcbb6, 0xcbc2, 0xcbc9, 0xa8d4, 0xcbbb, 0xcbb4, 0xa8d3, 0xcbb7, 0xa8d7, 0xcbba, 0xa8d2, 0xa8cd, 0xa8dc, 0xcbc4, 0xa8dd, 0xcbc8, 0xcbc6, 0xcbca, 0xa8da, 0xcbbe, 0xcbb2, 0xcbc0, 0xa8d1, 0xcbc5, 0xa8cc, 0xcbc7, 0xab56, 0xab4a, 0xcde0, 0xcde8, 0xab49, 0xab51, 0xab5d, 0xcdee, 0xcdec, 0xcde7, 0xab4b, 0xcded, 0xcde3, 0xab59, 0xab50, 0xab58, 0xcdde, 0xcdea, 0xcde1, 0xab54, 0xcde2, 0xcddd, 0xab5b, 0xab4e, 0xab57, 0xab4d, 0xcddf, 0xcde4, 0xcdeb, 0xab55, 0xab52, 0xcde6, 0xab5a, 0xcde9, 0xcde5, 0xab4f, 0xab5c, 0xab53, 0xab4c, 0xab48, 0xcdef, 0xadd7, 0xadc1, 0xadd1, 0xadd6, 0xd0d0, 0xd0cf, 0xd0d4, 0xd0d5, 0xadc4, 0xadcd, 0xadda, 0xadce, 0xd0c9, 0xadc7, 0xd0ca, 0xaddc, 0xadd3, 0xadbe, 0xadbf, 0xd0dd, 0xb0bf, 0xadcc, 0xadcb, 0xd0cb, 0xadcf, 0xd45b, 0xadc6, 0xd0d6, 0xadd5, 0xadd4, 0xadca, 0xd0ce, 0xd0d7, 0xd0c8, 0xadc9, 0xd0d8, 0xadd2, 0xd0cc, 0xadc0, 0xadc3, 0xadc2, 0xd0d9, 0xadd0, 0xadc5, 0xadd9, 0xaddb, 0xd0d3, 0xadd8, 0xd0db, 0xd0cd, 0xd0dc, 0xd0d1, 0xd0da, 0xd0d2, 0xadc8, 0xd463, 0xd457, 0xb0b3, 0xd45c, 0xd462, 0xb0b2, 0xd455, 0xb0b6, 0xd459, 0xd452, 0xb0b4, 0xd456, 0xb0b9, 0xb0be, 0xd467, 0xd451, 0xb0ba, 0xd466, 0xb0b5, 0xd458, 0xb0b1, 0xd453, 0xd44f, 0xd45d, 0xd450, 0xd44e, 0xd45a, 0xd460, 0xd461, 0xb0b7, 0xd85b, 0xd45e, 0xd44d, 0xd45f, 0xb0c1, 0xd464, 0xb0c0, 0xd44c, 0xd454, 0xd465, 0xb0bc, 0xb0bb, 0xb0b8, 0xb0bd, 0xb0af, 0xb0b0, 0xb3c8, 0xd85e, 0xd857, 0xb3c5, 0xd85f, 0xd855, 0xd858, 0xb3c4, 0xd859, 0xb3c7, 0xd85d, 0xd853, 0xd852, 0xb3c9, 0xb3ca, 0xb3c6, 0xb3cb, 0xd851, 0xd85c, 0xd85a, 0xd854, 0xb3c3, 0xd856, 0xb6ca, 0xb6c4, 0xdcb7, 0xb6cd, 0xdcbd, 0xdcc0, 0xb6c6, 0xb6c7, 0xdcba, 0xb6c5, 0xdcc3, 0xb6cb, 0xdcc4, 0xdcbf, 0xb6cc, 0xdcb4, 0xb6c9, 0xdcb5, 0xdcbe, 0xdcbc, 0xdcb8, 0xb6c8, 0xdcb6, 0xb6ce, 0xdcbb, 0xdcc2, 0xdcb9, 0xdcc1, 0xb9b6, 0xb9b3, 0xb9b4, 0xe0f9, 0xe0f1, 0xb9b2, 0xb9af, 0xe0f2, 0xb9b1, 0xe0f5, 0xe0f7, 0xe0fe, 0xe0fd, 0xe0f8, 0xb9ae, 0xe0f0, 0xb9ac, 0xe0f3, 0xb9b7, 0xe0f6, 0xe0fa, 0xb9b0, 0xb9ad, 0xe0fc, 0xe0fb, 0xb9b5, 0xe0f4, 0xbbf8, 0xe4ec, 0xe4e9, 0xbbf9, 0xbbf7, 0xe4f0, 0xe4ed, 0xe4e6, 0xbbf6, 0xbbfa, 0xe4e7, 0xbbf5, 0xbbfd, 0xe4ea, 0xe4eb, 0xbbfb, 0xbbfc, 0xe4f1, 0xe4ee, 0xe4ef, 0xbeaa, 0xe8f8, 0xbea7, 0xe8f5, 0xbea9, 0xbeab, 0xe8f6, 0xbea8, 0xe8f7, 0xe8f4, 0xc076, 0xecbd, 0xc077, 0xecbb, 0xecbc, 0xecba, 0xecb9, 0xecbe, 0xc075, 0xefb8, 0xefb9, 0xe4e8, 0xefb7, 0xc078, 0xc35f, 0xf1eb, 0xf1ec, 0xc4d7, 0xc4d8, 0xf5c1, 0xf5c0, 0xc56c, 0xc56b, 0xf7d0, 0xa449, 0xa461, 0xa4b9, 0xa4b8, 0xa553, 0xa552, 0xa5fc, 0xa5fb, 0xa5fd, 0xa5fa, 0xa74a, 0xa749, 0xa74b, 0xa8e0, 0xa8df, 0xa8e1, 0xab5e, 0xa259, 0xd0de, 0xa25a, 0xb0c2, 0xa25c, 0xa25b, 0xd860, 0xa25d, 0xb9b8, 0xa25e, 0xa44a, 0xa4ba, 0xa5fe, 0xa8e2, 0xa44b, 0xa4bd, 0xa4bb, 0xa4bc, 0xa640, 0xa74c, 0xa8e4, 0xa8e3, 0xa8e5, 0xaddd, 0xbeac, 0xc94e, 0xa554, 0xa555, 0xa641, 0xca6a, 0xab60, 0xab5f, 0xd0e0, 0xd0df, 0xb0c3, 0xa4be, 0xc955, 0xcbcd, 0xab61, 0xade0, 0xadde, 0xaddf, 0xbead, 0xa556, 0xa642, 0xc9bc, 0xa74d, 0xa74e, 0xca6b, 0xcbce, 0xa8e6, 0xcbcf, 0xd0e2, 0xd0e3, 0xade3, 0xd0e4, 0xd0e1, 0xade4, 0xade2, 0xade1, 0xd0e5, 0xd468, 0xd861, 0xdcc5, 0xe140, 0xbbfe, 0xbeae, 0xe8f9, 0xa44c, 0xa45a, 0xb0c4, 0xb3cd, 0xb9b9, 0xc942, 0xa4bf, 0xa559, 0xa557, 0xa558, 0xa8e7, 0xa44d, 0xa44e, 0xa462, 0xa4c0, 0xa4c1, 0xa4c2, 0xc9be, 0xa55a, 0xc96b, 0xa646, 0xc9bf, 0xa644, 0xa645, 0xc9bd, 0xa647, 0xa643, 0xca6c, 0xaaec, 0xca6d, 0xca6e, 0xa750, 0xa74f, 0xa753, 0xa751, 0xa752, 0xa8ed, 0xa8ec, 0xcbd4, 0xcbd1, 0xcbd2, 0xcbd0, 0xa8ee, 0xa8ea, 0xa8e9, 0xa8eb, 0xa8e8, 0xa8ef, 0xab63, 0xcdf0, 0xcbd3, 0xab68, 0xcdf1, 0xab64, 0xab67, 0xab66, 0xab65, 0xab62, 0xd0e8, 0xade7, 0xd0eb, 0xade5, 0xd0e7, 0xade8, 0xade6, 0xade9, 0xd0e9, 0xd0ea, 0xd0e6, 0xd0ec, 0xb3d1, 0xb0c5, 0xd469, 0xd46b, 0xd46a, 0xd46c, 0xb0c6, 0xb3ce, 0xb3cf, 0xb3d0, 0xb6d0, 0xdcc7, 0xdcc6, 0xdcc8, 0xdcc9, 0xb6d1, 0xb6cf, 0xe141, 0xe142, 0xb9bb, 0xb9ba, 0xe35a, 0xbc40, 0xbc41, 0xbc42, 0xbc44, 0xe4f2, 0xe4f3, 0xbc43, 0xbeaf, 0xbeb0, 0xf1ed, 0xf5c3, 0xf5c2, 0xf7d1, 0xa44f, 0xa55c, 0xa55b, 0xa648, 0xc9c0, 0xa755, 0xa756, 0xa754, 0xa757, 0xca6f, 0xca70, 0xa8f1, 0xcbd5, 0xa8f0, 0xcdf2, 0xab6c, 0xcdf3, 0xab6b, 0xab69, 0xab6a, 0xd0ed, 0xb0c7, 0xd46e, 0xb0ca, 0xd46d, 0xb1e5, 0xb0c9, 0xb0c8, 0xb3d4, 0xb3d3, 0xb3d2, 0xb6d2, 0xb6d5, 0xb6d6, 0xb6d4, 0xb6d3, 0xe143, 0xe144, 0xe4f5, 0xbc45, 0xe4f4, 0xbeb1, 0xecbf, 0xc079, 0xf1ee, 0xc455, 0xa463, 0xa4c3, 0xc956, 0xa4c4, 0xa4c5, 0xa55d, 0xa55e, 0xa649, 0xca71, 0xcbd6, 0xcbd7, 0xab6d, 0xd0ee, 0xb0cc, 0xb0cb, 0xd863, 0xd862, 0xa450, 0xa4c6, 0xa55f, 0xb0cd, 0xc943, 0xc96c, 0xa560, 0xc9c2, 0xa64b, 0xa64a, 0xc9c1, 0xa758, 0xadea, 0xd46f, 0xb6d7, 0xe145, 0xb9bc, 0xe8fa, 0xf3fd, 0xa4c7, 0xcbd8, 0xcdf4, 0xb0d0, 0xb0ce, 0xb0cf, 0xa451, 0xa464, 0xa2cd, 0xa4ca, 0xa4c9, 0xa4c8, 0xa563, 0xa562, 0xc96d, 0xc9c3, 0xa8f5, 0xa8f2, 0xa8f4, 0xa8f3, 0xab6e, 0xb3d5, 0xa452, 0xa4cb, 0xa565, 0xa564, 0xca72, 0xa8f6, 0xc957, 0xa567, 0xa566, 0xa64c, 0xa64d, 0xca73, 0xa759, 0xa75a, 0xa8f7, 0xa8f8, 0xa8f9, 0xab6f, 0xcdf5, 0xadeb, 0xc944, 0xa4cc, 0xc9c4, 0xca74, 0xca75, 0xcbd9, 0xcbda, 0xcdf7, 0xcdf6, 0xcdf9, 0xcdf8, 0xab70, 0xd470, 0xaded, 0xd0ef, 0xadec, 0xd864, 0xb3d6, 0xd865, 0xe146, 0xb9bd, 0xbc46, 0xf1ef, 0xc958, 0xa568, 0xb0d1, 0xa453, 0xa465, 0xa4ce, 0xa4cd, 0xa4cf, 0xa8fb, 0xa8fa, 0xa8fc, 0xab71, 0xadee, 0xe8fb, 0xc24f, 0xa466, 0xa56a, 0xa579, 0xa574, 0xa56f, 0xa56e, 0xa575, 0xa573, 0xa56c, 0xa57a, 0xa56d, 0xa569, 0xa578, 0xa577, 0xa576, 0xa56b, 0xa572, 0xa571, 0xa57b, 0xa570, 0xa653, 0xa659, 0xa655, 0xa65b, 0xc9c5, 0xa658, 0xa64e, 0xa651, 0xa654, 0xa650, 0xa657, 0xa65a, 0xa64f, 0xa652, 0xa656, 0xa65c, 0xca7e, 0xca7b, 0xa767, 0xca7c, 0xa75b, 0xa75d, 0xa775, 0xa770, 0xcaa5, 0xca7d, 0xa75f, 0xa761, 0xcaa4, 0xa768, 0xca78, 0xa774, 0xa776, 0xa75c, 0xa76d, 0xca76, 0xa773, 0xa764, 0xa76e, 0xa76f, 0xca77, 0xa76c, 0xa76a, 0xa76b, 0xa771, 0xcaa1, 0xa75e, 0xa772, 0xcaa3, 0xa766, 0xa763, 0xca7a, 0xa762, 0xcaa6, 0xa765, 0xa769, 0xa760, 0xcaa2, 0xca79, 0xcbeb, 0xcbea, 0xa94f, 0xcbed, 0xcbef, 0xcbe4, 0xcbe7, 0xcbee, 0xa950, 0xcbe1, 0xcbe5, 0xcbe9, 0xce49, 0xa94b, 0xce4d, 0xa8fd, 0xcbe6, 0xa8fe, 0xa94c, 0xa945, 0xa941, 0xcbe2, 0xa944, 0xa949, 0xa952, 0xcbe3, 0xcbdc, 0xa943, 0xcbdd, 0xcbdf, 0xa946, 0xa948, 0xcbdb, 0xcbe0, 0xa951, 0xa94d, 0xcbe8, 0xa953, 0xa94a, 0xcbde, 0xa947, 0xa942, 0xa940, 0xcbec, 0xa94e, 0xce48, 0xcdfb, 0xce4b, 0xcdfd, 0xab78, 0xaba8, 0xab74, 0xaba7, 0xab7d, 0xaba4, 0xab72, 0xcdfc, 0xce43, 0xaba3, 0xce4f, 0xaba5, 0xab79, 0xce45, 0xce42, 0xab77, 0xcdfa, 0xaba6, 0xce4a, 0xab7c, 0xce4c, 0xaba9, 0xab73, 0xab7e, 0xab7b, 0xce40, 0xaba1, 0xce46, 0xce47, 0xab7a, 0xaba2, 0xab76, 0xab75, 0xcdfe, 0xce44, 0xce4e, 0xd144, 0xadfb, 0xd0f1, 0xd0f6, 0xadf4, 0xae40, 0xd0f4, 0xadef, 0xadf9, 0xadfe, 0xd0fb, 0xadfa, 0xadfd, 0xd0fe, 0xadf5, 0xd0f5, 0xd142, 0xd143, 0xadf7, 0xd141, 0xadf3, 0xae43, 0xd0f8, 0xadf1, 0xd146, 0xd0f9, 0xd0fd, 0xadf6, 0xae42, 0xd0fa, 0xadfc, 0xd140, 0xd147, 0xd4a1, 0xd145, 0xae44, 0xadf0, 0xd0fc, 0xd0f3, 0xadf8, 0xd0f2, 0xd0f7, 0xd0f0, 0xae41, 0xd477, 0xb0e4, 0xd4a7, 0xb0e2, 0xb0df, 0xd47c, 0xb0db, 0xd4a2, 0xb0e6, 0xd476, 0xd47b, 0xd47a, 0xadf2, 0xb0e1, 0xd4a5, 0xd4a8, 0xd473, 0xb3e8, 0xd4a9, 0xb0e7, 0xb0d9, 0xb0d6, 0xd47e, 0xb0d3, 0xd4a6, 0xb0da, 0xd4aa, 0xd474, 0xd4a4, 0xb0dd, 0xd475, 0xd478, 0xd47d, 0xb0de, 0xb0dc, 0xb0e8, 0xb0e3, 0xb0d7, 0xb1d2, 0xb0d8, 0xd479, 0xb0e5, 0xb0e0, 0xd4a3, 0xb0d5, 0xb0d4, 0xd471, 0xd472, 0xd86a, 0xb3d7, 0xb3da, 0xd875, 0xb3ee, 0xd878, 0xb3d8, 0xd871, 0xb3de, 0xb3e4, 0xb5bd, 0xb3e2, 0xd86e, 0xb3ef, 0xb3db, 0xb3e3, 0xd876, 0xdcd7, 0xd87b, 0xd86f, 0xd866, 0xd873, 0xd86d, 0xb3e1, 0xd879, 0xb3dd, 0xb3f1, 0xb3ea, 0xb3df, 0xb3dc, 0xb3e7, 0xd87a, 0xd86c, 0xd872, 0xd874, 0xd868, 0xd877, 0xb3d9, 0xd867, 0xb3e0, 0xb3f0, 0xb3ec, 0xd869, 0xb3e6, 0xb3ed, 0xb3e9, 0xb3e5, 0xd870, 0xb3eb, 0xdcd5, 0xdcd1, 0xdce0, 0xdcca, 0xdcd3, 0xb6e5, 0xb6e6, 0xb6de, 0xdcdc, 0xb6e8, 0xdccf, 0xdcce, 0xdccc, 0xdcde, 0xb6dc, 0xdcd8, 0xdccd, 0xb6df, 0xdcd6, 0xb6da, 0xdcd2, 0xdcd9, 0xdcdb, 0xdcdf, 0xb6e3, 0xdccb, 0xb6dd, 0xdcd0, 0xb6d8, 0xb6e4, 0xdcda, 0xb6e0, 0xb6e1, 0xb6e7, 0xb6db, 0xa25f, 0xb6d9, 0xdcd4, 0xb6e2, 0xdcdd, 0xb9cd, 0xb9c8, 0xe155, 0xe151, 0xe14b, 0xb9c2, 0xb9be, 0xe154, 0xb9bf, 0xe14e, 0xe150, 0xe153, 0xb9c4, 0xb9cb, 0xb9c5, 0xe149, 0xb9c6, 0xb9c7, 0xe14c, 0xb9cc, 0xe14a, 0xe14f, 0xb9c3, 0xe148, 0xb9c9, 0xb9c1, 0xb9c0, 0xe14d, 0xe152, 0xb9ca, 0xe147, 0xbc4d, 0xe547, 0xe544, 0xbc47, 0xbc53, 0xbc54, 0xbc4a, 0xe542, 0xbc4c, 0xe4f9, 0xbc52, 0xe546, 0xbc49, 0xe548, 0xbc48, 0xe543, 0xe545, 0xbc4b, 0xe541, 0xe4fa, 0xe4f7, 0xd86b, 0xe4fd, 0xe4f6, 0xe4fc, 0xe4fb, 0xe4f8, 0xbc4f, 0xbc4e, 0xbc50, 0xe4fe, 0xbeb2, 0xe540, 0xe945, 0xe8fd, 0xbebe, 0xe942, 0xbeb6, 0xbeba, 0xe941, 0xbeb9, 0xbeb5, 0xbeb8, 0xbeb3, 0xbebd, 0xe943, 0xe8fe, 0xbebc, 0xe8fc, 0xbebb, 0xe944, 0xe940, 0xbc51, 0xbebf, 0xe946, 0xbeb7, 0xbeb4, 0xecc6, 0xecc8, 0xc07b, 0xecc9, 0xecc7, 0xecc5, 0xecc4, 0xc07d, 0xecc3, 0xc07e, 0xecc1, 0xecc2, 0xc07a, 0xc0a1, 0xc07c, 0xecc0, 0xc250, 0xefbc, 0xefba, 0xefbf, 0xefbd, 0xefbb, 0xefbe, 0xc360, 0xf1f2, 0xf1f3, 0xc456, 0xf1f4, 0xf1f0, 0xf1f5, 0xf1f1, 0xc251, 0xf3fe, 0xf441, 0xc459, 0xf440, 0xc458, 0xc457, 0xc45a, 0xf5c5, 0xf5c6, 0xc4da, 0xc4d9, 0xc4db, 0xf5c4, 0xf6d8, 0xf6d7, 0xc56d, 0xc56f, 0xc56e, 0xf6d9, 0xc5c8, 0xf8a6, 0xc5f1, 0xf8a5, 0xf8ee, 0xc949, 0xa57d, 0xa57c, 0xa65f, 0xa65e, 0xc9c7, 0xa65d, 0xc9c6, 0xa779, 0xcaa9, 0xcaa8, 0xa777, 0xa77a, 0xcaa7, 0xa778, 0xcbf0, 0xcbf1, 0xa954, 0xabaa, 0xd148, 0xd149, 0xae45, 0xae46, 0xd4ac, 0xb0e9, 0xb0eb, 0xd4ab, 0xb0ea, 0xd87c, 0xb3f2, 0xb6e9, 0xb6ea, 0xdce1, 0xb9cf, 0xb9ce, 0xe549, 0xe948, 0xe947, 0xf96b, 0xa467, 0xc959, 0xc96e, 0xc96f, 0xa662, 0xa666, 0xc9c9, 0xa664, 0xa663, 0xc9c8, 0xa665, 0xa661, 0xa660, 0xc9ca, 0xa7a6, 0xa7a3, 0xa77d, 0xcaaa, 0xcaab, 0xa7a1, 0xcaad, 0xa77b, 0xcaae, 0xcaac, 0xa77e, 0xa7a2, 0xa7a5, 0xa7a4, 0xa77c, 0xcaaf, 0xa959, 0xcbfe, 0xa95b, 0xa95a, 0xcc40, 0xa958, 0xa957, 0xcbf5, 0xcbf4, 0xcbf2, 0xcbf7, 0xcbf6, 0xcbf3, 0xcbfc, 0xcbfd, 0xcbfa, 0xcbf8, 0xa956, 0xcbfb, 0xa95c, 0xcc41, 0xcbf9, 0xabab, 0xa955, 0xabac, 0xce54, 0xce5a, 0xabb2, 0xce58, 0xce5e, 0xce55, 0xce59, 0xce5b, 0xce5d, 0xce57, 0xce56, 0xce51, 0xce52, 0xabad, 0xabaf, 0xabae, 0xce53, 0xce5c, 0xabb1, 0xce50, 0xd153, 0xd152, 0xd157, 0xd14e, 0xd151, 0xd150, 0xd154, 0xd158, 0xae47, 0xae4a, 0xd14f, 0xd155, 0xae49, 0xd14a, 0xabb0, 0xd4ba, 0xd156, 0xd14d, 0xae48, 0xd14c, 0xd4b1, 0xb0ec, 0xb0f0, 0xd4c1, 0xd4af, 0xd4bd, 0xb0f1, 0xd4bf, 0xd4c5, 0xd4c9, 0xd4c0, 0xd4b4, 0xd4bc, 0xd4ca, 0xd4c8, 0xd4be, 0xd4b9, 0xd4b2, 0xd8a6, 0xd4b0, 0xb0f5, 0xd4b7, 0xb0f6, 0xb0f2, 0xd4ad, 0xd4c3, 0xd4b5, 0xd4b3, 0xd4c6, 0xb0f3, 0xd4cc, 0xb0ed, 0xb0ef, 0xd4bb, 0xd4b6, 0xae4b, 0xb0ee, 0xd4b8, 0xd4c7, 0xd4cb, 0xd4c2, 0xd4c4, 0xd4ae, 0xd8a1, 0xd8aa, 0xd8a9, 0xb3fa, 0xd8a2, 0xb3fb, 0xb3f9, 0xd8a4, 0xb3f6, 0xd8a8, 0xd8a3, 0xd8a5, 0xd87d, 0xb3f4, 0xd8b2, 0xd8b1, 0xd8ae, 0xb3f3, 0xb3f7, 0xb3f8, 0xd14b, 0xd8ab, 0xb3f5, 0xb0f4, 0xd8ad, 0xd87e, 0xd8b0, 0xd8af, 0xd8b3, 0xdcef, 0xd8ac, 0xd8a7, 0xdce7, 0xb6f4, 0xb6f7, 0xb6f2, 0xdce6, 0xdcea, 0xdce5, 0xb6ec, 0xb6f6, 0xdce2, 0xb6f0, 0xdce9, 0xb6ee, 0xb6ed, 0xdcec, 0xb6ef, 0xdcee, 0xdceb, 0xb6eb, 0xb6f5, 0xdcf0, 0xdce4, 0xdced, 0xdce3, 0xb6f1, 0xb6f3, 0xdce8, 0xdcf1, 0xe15d, 0xb9d0, 0xe163, 0xb9d5, 0xe15f, 0xe166, 0xe157, 0xb9d7, 0xb9d1, 0xe15c, 0xbc55, 0xe15b, 0xe164, 0xb9d2, 0xb9d6, 0xe15a, 0xe160, 0xe165, 0xe156, 0xb9d4, 0xe15e, 0xe162, 0xe168, 0xe158, 0xe161, 0xb9d3, 0xe167, 0xe159, 0xbc59, 0xe54b, 0xbc57, 0xbc56, 0xe54d, 0xe552, 0xe54e, 0xe551, 0xbc5c, 0xbea5, 0xbc5b, 0xe54a, 0xe550, 0xbc5a, 0xe54f, 0xe54c, 0xbc58, 0xe94d, 0xe94f, 0xe94a, 0xbec1, 0xe94c, 0xbec0, 0xe94e, 0xbec3, 0xe950, 0xbec2, 0xe949, 0xe94b, 0xc0a5, 0xeccc, 0xc0a4, 0xeccd, 0xc0a3, 0xeccb, 0xc0a2, 0xecca, 0xc253, 0xc252, 0xf1f6, 0xf1f8, 0xf1f7, 0xc361, 0xc362, 0xc363, 0xf442, 0xc45b, 0xf7d3, 0xf7d2, 0xc5f2, 0xa468, 0xa4d0, 0xa7a7, 0xce5f, 0xb3fc, 0xb3fd, 0xdcf2, 0xb9d8, 0xe169, 0xe553, 0xc95a, 0xcab0, 0xcc42, 0xce60, 0xd159, 0xae4c, 0xf1f9, 0xc4dc, 0xa469, 0xa57e, 0xc970, 0xa667, 0xa668, 0xa95d, 0xb0f7, 0xb9da, 0xb9db, 0xb9d9, 0xa46a, 0xa4d1, 0xa4d3, 0xa4d2, 0xc95b, 0xa4d4, 0xa5a1, 0xc971, 0xa5a2, 0xa669, 0xa66a, 0xc9cb, 0xa7a8, 0xcab1, 0xa961, 0xcc43, 0xa95f, 0xa960, 0xa95e, 0xd15a, 0xabb6, 0xabb5, 0xabb7, 0xabb4, 0xce61, 0xa962, 0xabb3, 0xae4d, 0xae4e, 0xae4f, 0xd4cd, 0xb3fe, 0xd8b4, 0xb0f8, 0xb6f8, 0xb9dd, 0xb9dc, 0xe16a, 0xbc5d, 0xbec4, 0xefc0, 0xf6da, 0xf7d4, 0xa46b, 0xa5a3, 0xa5a4, 0xc9d1, 0xa66c, 0xa66f, 0xc9cf, 0xc9cd, 0xa66e, 0xc9d0, 0xc9d2, 0xc9cc, 0xa671, 0xa670, 0xa66d, 0xa66b, 0xc9ce, 0xa7b3, 0xa7b0, 0xcab6, 0xcab9, 0xcab8, 0xa7aa, 0xa7b2, 0xa7af, 0xcab5, 0xcab3, 0xa7ae, 0xa7a9, 0xa7ac, 0xcab4, 0xcabb, 0xcab7, 0xa7ad, 0xa7b1, 0xa7b4, 0xcab2, 0xcaba, 0xa7ab, 0xa967, 0xa96f, 0xcc4f, 0xcc48, 0xa970, 0xcc53, 0xcc44, 0xcc4b, 0xa966, 0xcc45, 0xa964, 0xcc4c, 0xcc50, 0xa963, 0xcc51, 0xcc4a, 0xcc4d, 0xa972, 0xa969, 0xcc54, 0xcc52, 0xa96e, 0xa96c, 0xcc49, 0xa96b, 0xcc47, 0xcc46, 0xa96a, 0xa968, 0xa971, 0xa96d, 0xa965, 0xcc4e, 0xabb9, 0xabc0, 0xce6f, 0xabb8, 0xce67, 0xce63, 0xce73, 0xce62, 0xabbb, 0xce6c, 0xabbe, 0xabc1, 0xabbc, 0xce70, 0xabbf, 0xae56, 0xce76, 0xce64, 0xce66, 0xce6d, 0xce71, 0xce75, 0xce72, 0xce6b, 0xce6e, 0xce68, 0xabc3, 0xce6a, 0xce69, 0xce74, 0xabba, 0xce65, 0xabc2, 0xabbd, 0xae5c, 0xd162, 0xae5b, 0xd160, 0xae50, 0xae55, 0xd15f, 0xd15c, 0xd161, 0xae51, 0xd15b, 0xae54, 0xae52, 0xd163, 0xae53, 0xae57, 0xae58, 0xae5a, 0xae59, 0xd15d, 0xd15e, 0xd164, 0xd4d4, 0xb0f9, 0xd8c2, 0xd4d3, 0xd4e6, 0xb140, 0xd4e4, 0xb0fe, 0xb0fa, 0xd4ed, 0xd4dd, 0xd4e0, 0xb143, 0xd4ea, 0xd4e2, 0xb0fb, 0xb144, 0xd4e7, 0xd4e5, 0xd4d6, 0xd4eb, 0xd4df, 0xd4da, 0xd4d0, 0xd4ec, 0xd4dc, 0xd4cf, 0xb142, 0xd4e1, 0xd4ee, 0xd4de, 0xd4d2, 0xd4d7, 0xd4ce, 0xb141, 0xd4db, 0xd4d8, 0xb0fc, 0xd4d1, 0xd4e9, 0xb0fd, 0xd4d9, 0xd4d5, 0xd4e8, 0xb440, 0xd8bb, 0xd8b8, 0xd8c9, 0xd8bd, 0xd8ca, 0xb442, 0xd8c6, 0xd8c3, 0xd8c4, 0xd8c7, 0xd8cb, 0xd4e3, 0xd8cd, 0xdd47, 0xb443, 0xd8ce, 0xd8b6, 0xd8c0, 0xd8c5, 0xb441, 0xb444, 0xd8cc, 0xd8cf, 0xd8ba, 0xd8b7, 0xd8b9, 0xd8be, 0xd8bc, 0xb445, 0xd8c8, 0xd8bf, 0xd8c1, 0xd8b5, 0xdcfa, 0xdcf8, 0xb742, 0xb740, 0xdd43, 0xdcf9, 0xdd44, 0xdd40, 0xdcf7, 0xdd46, 0xdcf6, 0xdcfd, 0xb6fe, 0xb6fd, 0xb6fc, 0xdcfb, 0xdd41, 0xb6f9, 0xb741, 0xdcf4, 0xdcfe, 0xdcf3, 0xdcfc, 0xb6fa, 0xdd42, 0xdcf5, 0xb6fb, 0xdd45, 0xe16e, 0xb9e2, 0xb9e1, 0xb9e3, 0xe17a, 0xe170, 0xe176, 0xe16b, 0xe179, 0xe178, 0xe17c, 0xe175, 0xb9de, 0xe174, 0xb9e4, 0xe16d, 0xb9df, 0xe17b, 0xb9e0, 0xe16f, 0xe172, 0xe177, 0xe171, 0xe16c, 0xe173, 0xe555, 0xbc61, 0xe558, 0xe557, 0xe55a, 0xe55c, 0xbc5f, 0xe556, 0xe554, 0xe55d, 0xe55b, 0xe559, 0xe55f, 0xe55e, 0xbc63, 0xbc5e, 0xbc60, 0xbc62, 0xe560, 0xe957, 0xe956, 0xe955, 0xe958, 0xe951, 0xe952, 0xe95a, 0xe953, 0xbec5, 0xe95c, 0xe95b, 0xe954, 0xecd1, 0xc0a8, 0xeccf, 0xecd4, 0xecd3, 0xe959, 0xc0a7, 0xecd2, 0xecce, 0xecd6, 0xecd5, 0xc0a6, 0xecd0, 0xbec6, 0xc254, 0xefc1, 0xf1fa, 0xf1fb, 0xf1fc, 0xc45c, 0xc45d, 0xf443, 0xf5c8, 0xf5c7, 0xf6db, 0xf6dc, 0xf7d5, 0xf8a7, 0xa46c, 0xa46d, 0xa46e, 0xa4d5, 0xa5a5, 0xc9d3, 0xa672, 0xa673, 0xa7b7, 0xa7b8, 0xa7b6, 0xa7b5, 0xa973, 0xcc55, 0xa975, 0xa974, 0xcc56, 0xabc4, 0xae5d, 0xd165, 0xd4f0, 0xb145, 0xb447, 0xd4ef, 0xb446, 0xb9e5, 0xe17d, 0xbec7, 0xc0a9, 0xecd7, 0xc45e, 0xc570, 0xc972, 0xa5a6, 0xc973, 0xa676, 0xa674, 0xa675, 0xa677, 0xa7ba, 0xa7b9, 0xcabc, 0xa7bb, 0xcabd, 0xcc57, 0xcc58, 0xa976, 0xa978, 0xa97a, 0xa977, 0xa97b, 0xa979, 0xabc8, 0xabc5, 0xabc7, 0xabc9, 0xabc6, 0xd166, 0xce77, 0xd168, 0xd167, 0xae63, 0xae5f, 0xae60, 0xae62, 0xae64, 0xae61, 0xae66, 0xae65, 0xb14a, 0xd4f2, 0xd4f1, 0xb149, 0xb148, 0xb147, 0xb14b, 0xb146, 0xd8d5, 0xd8d2, 0xb449, 0xd8d1, 0xd8d6, 0xb44b, 0xd8d4, 0xb448, 0xb44a, 0xd8d3, 0xdd48, 0xdd49, 0xdd4a, 0xb9e6, 0xb9ee, 0xe17e, 0xb9e8, 0xb9ec, 0xe1a1, 0xb9ed, 0xb9e9, 0xb9ea, 0xb9e7, 0xb9eb, 0xbc66, 0xd8d0, 0xbc67, 0xbc65, 0xbc64, 0xe95d, 0xbec8, 0xecd8, 0xecd9, 0xc364, 0xc45f, 0xa46f, 0xa678, 0xabca, 0xd169, 0xae67, 0xb14e, 0xb14d, 0xb14c, 0xb44c, 0xb44d, 0xd8d7, 0xb9ef, 0xbec9, 0xa470, 0xc95c, 0xa4d6, 0xc974, 0xc9d4, 0xa679, 0xa97c, 0xdd4b, 0xa471, 0xa4d7, 0xc9d5, 0xcabe, 0xcabf, 0xa7bc, 0xd8d8, 0xb44e, 0xdd4c, 0xc0aa, 0xa472, 0xa4a8, 0xa4d8, 0xc975, 0xa5a7, 0xa7c0, 0xa7bf, 0xa7bd, 0xa7be, 0xcc59, 0xa97e, 0xa9a1, 0xcc5a, 0xa97d, 0xabce, 0xce78, 0xabcd, 0xabcb, 0xabcc, 0xae6a, 0xae68, 0xd16b, 0xae69, 0xd16a, 0xae5e, 0xd4f3, 0xb150, 0xb151, 0xb14f, 0xb9f0, 0xe1a2, 0xbc68, 0xbc69, 0xe561, 0xc0ab, 0xefc2, 0xefc3, 0xc4dd, 0xf8a8, 0xc94b, 0xa4d9, 0xa473, 0xc977, 0xc976, 0xa67a, 0xc9d7, 0xc9d8, 0xc9d6, 0xc9d9, 0xcac7, 0xcac2, 0xcac4, 0xcac6, 0xcac3, 0xa7c4, 0xcac0, 0xcac1, 0xa7c1, 0xa7c2, 0xcac5, 0xcac8, 0xa7c3, 0xcac9, 0xcc68, 0xcc62, 0xcc5d, 0xa9a3, 0xcc65, 0xcc63, 0xcc5c, 0xcc69, 0xcc6c, 0xcc67, 0xcc60, 0xa9a5, 0xcc66, 0xa9a6, 0xcc61, 0xcc64, 0xcc5b, 0xcc5f, 0xcc6b, 0xa9a7, 0xa9a8, 0xcc5e, 0xcc6a, 0xa9a2, 0xa9a4, 0xceab, 0xcea4, 0xceaa, 0xcea3, 0xcea5, 0xce7d, 0xce7b, 0xceac, 0xcea9, 0xce79, 0xabd0, 0xcea7, 0xcea8, 0xcea6, 0xce7c, 0xce7a, 0xabcf, 0xcea2, 0xce7e, 0xcea1, 0xcead, 0xae6f, 0xae6e, 0xd16c, 0xae6b, 0xd16e, 0xae70, 0xd16f, 0xae73, 0xae71, 0xd170, 0xceae, 0xd172, 0xae6d, 0xae6c, 0xd16d, 0xd171, 0xae72, 0xb153, 0xb152, 0xd4f5, 0xd4f9, 0xd4fb, 0xb154, 0xd4fe, 0xb158, 0xd541, 0xb15a, 0xb156, 0xb15e, 0xb15b, 0xd4f7, 0xb155, 0xd4f6, 0xd4f4, 0xd543, 0xd4f8, 0xb157, 0xd542, 0xb15c, 0xd4fd, 0xd4fc, 0xb15d, 0xd4fa, 0xb159, 0xd544, 0xd540, 0xd8e7, 0xd8ee, 0xd8e3, 0xb451, 0xd8df, 0xd8ef, 0xd8d9, 0xd8ec, 0xd8ea, 0xd8e4, 0xd8ed, 0xd8e6, 0xd8de, 0xd8f0, 0xd8dc, 0xd8e9, 0xd8da, 0xd8f1, 0xb452, 0xd8eb, 0xdd4f, 0xd8dd, 0xb44f, 0xd8e1, 0xb450, 0xd8e0, 0xd8e5, 0xd8e2, 0xd8e8, 0xdd53, 0xdd56, 0xdd4e, 0xdd50, 0xdd55, 0xdd54, 0xb743, 0xd8db, 0xdd52, 0xb744, 0xdd4d, 0xdd51, 0xe1a9, 0xe1b0, 0xe1a7, 0xe1ae, 0xe1a5, 0xe1ad, 0xe1b1, 0xe1a4, 0xe1a8, 0xe1a3, 0xb9f1, 0xe1a6, 0xb9f2, 0xe1ac, 0xe1ab, 0xe1aa, 0xe1af, 0xe565, 0xe567, 0xbc6b, 0xe568, 0xe563, 0xe562, 0xe56c, 0xe56a, 0xbc6a, 0xe56d, 0xe564, 0xe569, 0xe56b, 0xe566, 0xe961, 0xe966, 0xe960, 0xe965, 0xe95e, 0xe968, 0xe964, 0xe969, 0xe963, 0xe95f, 0xe967, 0xe96a, 0xe962, 0xecda, 0xc0af, 0xc0ad, 0xc0ac, 0xc0ae, 0xefc4, 0xf172, 0xf1fd, 0xf444, 0xf445, 0xc460, 0xf5c9, 0xc4de, 0xf5ca, 0xf6de, 0xc572, 0xc571, 0xf6dd, 0xc5c9, 0xf7d6, 0xa474, 0xa67b, 0xc9da, 0xcaca, 0xa8b5, 0xb15f, 0xa475, 0xa5aa, 0xa5a9, 0xa5a8, 0xa7c5, 0xae74, 0xdd57, 0xa476, 0xa477, 0xa478, 0xa4da, 0xabd1, 0xceaf, 0xb453, 0xa479, 0xc95d, 0xa5ab, 0xa5ac, 0xc978, 0xa67c, 0xcacb, 0xa7c6, 0xcacc, 0xa9ae, 0xcc6e, 0xa9ac, 0xa9ab, 0xcc6d, 0xa9a9, 0xcc6f, 0xa9aa, 0xa9ad, 0xabd2, 0xabd4, 0xceb3, 0xceb0, 0xceb1, 0xceb2, 0xceb4, 0xabd3, 0xd174, 0xd173, 0xae76, 0xae75, 0xb162, 0xd546, 0xb161, 0xb163, 0xb160, 0xb455, 0xd545, 0xb456, 0xd8f3, 0xb457, 0xd8f2, 0xb454, 0xdd5a, 0xdd5c, 0xb745, 0xdd5b, 0xdd59, 0xdd58, 0xe1b4, 0xb9f7, 0xb9f5, 0xb9f6, 0xe1b2, 0xe1b3, 0xb9f3, 0xe571, 0xe56f, 0xbc6d, 0xe570, 0xbc6e, 0xbc6c, 0xb9f4, 0xe96d, 0xe96b, 0xe96c, 0xe56e, 0xecdc, 0xc0b0, 0xecdb, 0xefc5, 0xefc6, 0xe96e, 0xf1fe, 0xa47a, 0xa5ad, 0xa67e, 0xc9db, 0xa67d, 0xa9af, 0xb746, 0xa4db, 0xa5ae, 0xabd5, 0xb458, 0xc979, 0xc97a, 0xc9dc, 0xa7c8, 0xcad0, 0xcace, 0xa7c9, 0xcacd, 0xcacf, 0xcad1, 0xa7c7, 0xa9b3, 0xa9b4, 0xa9b1, 0xa9b0, 0xceb8, 0xa9b2, 0xabd6, 0xceb7, 0xceb9, 0xceb6, 0xceba, 0xabd7, 0xae79, 0xd175, 0xd177, 0xae77, 0xd178, 0xae78, 0xd176, 0xceb5, 0xd547, 0xd54a, 0xd54b, 0xd548, 0xb167, 0xb166, 0xb164, 0xb165, 0xd549, 0xb168, 0xb45a, 0xb45b, 0xb45c, 0xdd5d, 0xdd5f, 0xdd61, 0xb748, 0xb747, 0xb459, 0xdd60, 0xdd5e, 0xe1b8, 0xe1b6, 0xe1bc, 0xb9f8, 0xe1bd, 0xe1ba, 0xb9f9, 0xe1b7, 0xe1b5, 0xe1bb, 0xbc70, 0xe573, 0xe1b9, 0xbc72, 0xe574, 0xbc71, 0xbc74, 0xe575, 0xbc6f, 0xbc73, 0xe973, 0xe971, 0xe970, 0xe972, 0xe96f, 0xc366, 0xf446, 0xf447, 0xf5cb, 0xf6df, 0xc655, 0xa9b5, 0xa7ca, 0xabd8, 0xa47b, 0xa4dc, 0xa5af, 0xc9dd, 0xa7cb, 0xcad2, 0xcebb, 0xabd9, 0xb9fa, 0xa47c, 0xa6a1, 0xb749, 0xa47d, 0xa4dd, 0xa4de, 0xa5b1, 0xa5b0, 0xc9de, 0xa6a2, 0xcad3, 0xa7cc, 0xcc71, 0xcc72, 0xcc73, 0xa9b6, 0xa9b7, 0xcc70, 0xa9b8, 0xabda, 0xcebc, 0xd17a, 0xae7a, 0xd179, 0xb169, 0xd54c, 0xb16a, 0xd54d, 0xb45d, 0xdd62, 0xe1bf, 0xe1be, 0xb9fb, 0xbc75, 0xe576, 0xbeca, 0xe974, 0xc0b1, 0xc573, 0xf7d8, 0xcc74, 0xcebd, 0xb16b, 0xd8f4, 0xb74a, 0xc255, 0xa7ce, 0xa7cd, 0xabdb, 0xd17b, 0xb16d, 0xb343, 0xb16e, 0xb16c, 0xb45e, 0xe1c0, 0xb9fc, 0xbc76, 0xc94c, 0xc9df, 0xcad5, 0xa7cf, 0xcad4, 0xa7d0, 0xa9bc, 0xcc77, 0xcc76, 0xa9bb, 0xa9b9, 0xa9ba, 0xcc75, 0xabdd, 0xcebe, 0xabe0, 0xabdc, 0xabe2, 0xabde, 0xabdf, 0xabe1, 0xae7d, 0xae7c, 0xae7b, 0xd54f, 0xb16f, 0xb172, 0xb170, 0xd54e, 0xb175, 0xb171, 0xd550, 0xb174, 0xb173, 0xd8f6, 0xd8f5, 0xb461, 0xb45f, 0xb460, 0xd8f7, 0xb74b, 0xdd64, 0xb74c, 0xdd63, 0xe577, 0xbc78, 0xe1c1, 0xbc77, 0xb9fd, 0xecde, 0xe975, 0xc0b2, 0xecdd, 0xf240, 0xf448, 0xf449, 0xa4df, 0xa5b2, 0xc97b, 0xa7d2, 0xa7d4, 0xc9e2, 0xcad8, 0xcad7, 0xcad6, 0xc9e1, 0xc9e0, 0xa6a4, 0xa7d3, 0xa7d1, 0xa6a3, 0xa9bd, 0xcc78, 0xa9be, 0xcadd, 0xcadf, 0xcade, 0xcc79, 0xcada, 0xa7d8, 0xa7d6, 0xcad9, 0xcadb, 0xcae1, 0xa7d5, 0xcadc, 0xcae5, 0xa9c0, 0xcae2, 0xa7d7, 0xcae0, 0xcae3, 0xa9bf, 0xa9c1, 0xcae4, 0xccaf, 0xcca2, 0xcc7e, 0xccae, 0xcca9, 0xabe7, 0xa9c2, 0xccaa, 0xccad, 0xabe3, 0xccac, 0xa9c3, 0xa9c8, 0xa9c6, 0xcca3, 0xcc7c, 0xcca5, 0xa9cd, 0xccb0, 0xabe4, 0xcca6, 0xabe5, 0xa9c9, 0xcca8, 0xcecd, 0xabe6, 0xcc7b, 0xa9ca, 0xabe8, 0xa9cb, 0xa9c7, 0xa9cc, 0xcca7, 0xcc7a, 0xccab, 0xa9c4, 0xcc7d, 0xcca4, 0xcca1, 0xa9c5, 0xcebf, 0xcec0, 0xceca, 0xd1a1, 0xcecb, 0xabee, 0xcece, 0xcec4, 0xabed, 0xcec6, 0xcec7, 0xcec9, 0xabe9, 0xaea3, 0xcec5, 0xcec1, 0xaea4, 0xcecf, 0xae7e, 0xd17d, 0xcec8, 0xd17c, 0xcec3, 0xcecc, 0xabec, 0xaea1, 0xabf2, 0xaea2, 0xced0, 0xd17e, 0xabeb, 0xaea6, 0xabf1, 0xabf0, 0xabef, 0xaea5, 0xced1, 0xaea7, 0xabea, 0xcec2, 0xb176, 0xd1a4, 0xd1a6, 0xd1a8, 0xaea8, 0xaeae, 0xd553, 0xd1ac, 0xd1a3, 0xb178, 0xd551, 0xaead, 0xaeab, 0xd1ae, 0xd552, 0xd1a5, 0xaeac, 0xd1a9, 0xaeaf, 0xd1ab, 0xaeaa, 0xd1aa, 0xd1ad, 0xd1a7, 0xaea9, 0xb179, 0xd1a2, 0xb177, 0xb17a, 0xd555, 0xd55e, 0xb464, 0xb17c, 0xb1a3, 0xb465, 0xd560, 0xb1aa, 0xd8f9, 0xd556, 0xb1a2, 0xb1a5, 0xb17e, 0xd554, 0xd562, 0xd565, 0xd949, 0xd563, 0xd8fd, 0xb1a1, 0xb1a8, 0xb1ac, 0xd55d, 0xd8f8, 0xd561, 0xb17b, 0xd8fa, 0xd564, 0xd8fc, 0xd559, 0xb462, 0xd557, 0xd558, 0xb1a7, 0xb1a6, 0xd55b, 0xb1ab, 0xd55f, 0xb1a4, 0xd55c, 0xb1a9, 0xb466, 0xb463, 0xd8fb, 0xd55a, 0xb17d, 0xb46b, 0xb46f, 0xd940, 0xb751, 0xb46d, 0xd944, 0xb471, 0xdd65, 0xd946, 0xb753, 0xb469, 0xb46c, 0xd947, 0xd948, 0xd94e, 0xb473, 0xb754, 0xd94a, 0xd94f, 0xd943, 0xb75e, 0xb755, 0xb472, 0xd941, 0xd950, 0xb75d, 0xb470, 0xb74e, 0xd94d, 0xb474, 0xd945, 0xd8fe, 0xb46a, 0xd942, 0xd94b, 0xb74d, 0xb752, 0xb467, 0xd94c, 0xb750, 0xb468, 0xb75c, 0xe1c3, 0xdd70, 0xdd68, 0xe1c2, 0xdd6c, 0xdd6e, 0xdd6b, 0xb75b, 0xdd6a, 0xb75f, 0xe1d2, 0xb75a, 0xba40, 0xdd71, 0xe1c4, 0xb758, 0xdd69, 0xdd6d, 0xb9fe, 0xb74f, 0xdd66, 0xdd67, 0xba41, 0xb757, 0xb759, 0xb756, 0xdd6f, 0xe1c8, 0xe1c9, 0xe1ce, 0xbc7d, 0xe1d5, 0xba47, 0xba46, 0xe1d0, 0xbc7c, 0xe1c5, 0xba45, 0xe1d4, 0xba43, 0xba44, 0xe1d1, 0xe5aa, 0xbc7a, 0xb46e, 0xe1d3, 0xbca3, 0xe1cb, 0xbc7b, 0xbca2, 0xe1c6, 0xe1ca, 0xe1c7, 0xe1cd, 0xba48, 0xbc79, 0xba42, 0xe57a, 0xe1cf, 0xbca1, 0xbca4, 0xe1cc, 0xbc7e, 0xe579, 0xe57e, 0xbece, 0xe578, 0xe9a3, 0xe5a9, 0xbca8, 0xbca6, 0xbecc, 0xe5a6, 0xe5a2, 0xbcac, 0xe978, 0xbcaa, 0xe5a1, 0xe976, 0xe5a5, 0xe5a8, 0xe57d, 0xbcab, 0xbca5, 0xe977, 0xbecd, 0xe5a7, 0xbca7, 0xbca9, 0xe5a4, 0xbcad, 0xe5a3, 0xe57c, 0xe57b, 0xbecb, 0xe5ab, 0xe97a, 0xece0, 0xbed0, 0xe9a2, 0xe97e, 0xece1, 0xbed1, 0xe9a1, 0xe97c, 0xc0b4, 0xecdf, 0xe979, 0xe97b, 0xc0b5, 0xbed3, 0xc0b3, 0xbed2, 0xc0b7, 0xe97d, 0xbecf, 0xefcf, 0xefc7, 0xece7, 0xefc8, 0xece3, 0xc256, 0xece5, 0xece4, 0xc0b6, 0xece2, 0xece6, 0xefd0, 0xefcc, 0xefce, 0xefc9, 0xefca, 0xefcd, 0xefcb, 0xc367, 0xc36a, 0xc369, 0xc368, 0xc461, 0xf44a, 0xc462, 0xf241, 0xc4df, 0xf5cc, 0xc4e0, 0xc574, 0xc5ca, 0xf7d9, 0xf7da, 0xf7db, 0xf9ba, 0xa4e0, 0xc97c, 0xa5b3, 0xa6a6, 0xa6a7, 0xa6a5, 0xa6a8, 0xa7da, 0xa7d9, 0xccb1, 0xa9cf, 0xa9ce, 0xd1af, 0xb1ad, 0xb1ae, 0xb475, 0xdd72, 0xb760, 0xb761, 0xdd74, 0xdd76, 0xdd75, 0xe1d7, 0xe1d6, 0xba49, 0xe1d8, 0xe5ac, 0xbcae, 0xbed4, 0xc0b8, 0xc257, 0xc0b9, 0xa4e1, 0xcae6, 0xccb2, 0xa9d1, 0xa9d0, 0xa9d2, 0xabf3, 0xced2, 0xced3, 0xd1b0, 0xaeb0, 0xb1af, 0xb476, 0xd951, 0xa4e2, 0xa47e, 0xa4e3, 0xc97d, 0xa5b7, 0xa5b6, 0xa5b4, 0xa5b5, 0xa6ab, 0xc9e9, 0xc9eb, 0xa6aa, 0xc9e3, 0xc9e4, 0xc9ea, 0xc9e6, 0xc9e8, 0xa6a9, 0xc9e5, 0xc9ec, 0xc9e7, 0xa7e1, 0xa7ea, 0xa7e8, 0xcaf0, 0xcaed, 0xcaf5, 0xa7e6, 0xcaf6, 0xa7df, 0xcaf3, 0xa7e5, 0xcaef, 0xcaee, 0xa7e3, 0xcaf4, 0xa7e4, 0xa9d3, 0xa7de, 0xcaf1, 0xcae7, 0xa7db, 0xa7ee, 0xcaec, 0xcaf2, 0xa7e0, 0xa7e2, 0xcae8, 0xcae9, 0xcaea, 0xa7ed, 0xa7e7, 0xa7ec, 0xcaeb, 0xa7eb, 0xa7dd, 0xa7dc, 0xa7e9, 0xa9e1, 0xccbe, 0xccb7, 0xa9dc, 0xa9ef, 0xccb3, 0xccba, 0xccbc, 0xccbf, 0xa9ea, 0xccbb, 0xccb4, 0xa9e8, 0xccb8, 0xccc0, 0xa9d9, 0xccbd, 0xa9e3, 0xa9e2, 0xccb6, 0xa9d7, 0xa9d8, 0xa9d6, 0xa9ee, 0xa9e6, 0xa9e0, 0xa9d4, 0xccb9, 0xa9df, 0xa9d5, 0xa9e7, 0xa9f0, 0xced4, 0xa9e4, 0xccb5, 0xa9da, 0xa9dd, 0xa9de, 0xa9ec, 0xa9ed, 0xa9eb, 0xa9e5, 0xa9e9, 0xa9db, 0xabf4, 0xceda, 0xac41, 0xabf8, 0xabfa, 0xac40, 0xcee6, 0xabfd, 0xd1b1, 0xaeb1, 0xac43, 0xced7, 0xcedf, 0xabfe, 0xcede, 0xcedb, 0xcee3, 0xcee5, 0xabf7, 0xabfb, 0xac42, 0xaeb3, 0xcee0, 0xabf9, 0xac45, 0xced9, 0xabfc, 0xaeb2, 0xabf6, 0xced6, 0xcedd, 0xced5, 0xced8, 0xcedc, 0xd1b2, 0xac44, 0xcee1, 0xcee2, 0xcee4, 0xabf5, 0xaec1, 0xd1be, 0xaebf, 0xaec0, 0xd1b4, 0xd1c4, 0xaeb6, 0xd566, 0xd1c6, 0xd1c0, 0xd1b7, 0xd1c9, 0xd1ba, 0xaebc, 0xd57d, 0xd1bd, 0xaebe, 0xaeb5, 0xd1cb, 0xd1bf, 0xaeb8, 0xd1b8, 0xd1b5, 0xd1b6, 0xaeb9, 0xd1c5, 0xd1cc, 0xaebb, 0xd1bc, 0xd1bb, 0xaec3, 0xaec2, 0xaeb4, 0xaeba, 0xaebd, 0xd1c8, 0xd1c2, 0xaeb7, 0xd1b3, 0xd1ca, 0xd1c1, 0xd1c3, 0xd1c7, 0xd567, 0xb1b7, 0xb1cb, 0xb1ca, 0xb1bf, 0xd579, 0xd575, 0xd572, 0xd5a6, 0xb1ba, 0xb1b2, 0xd577, 0xb4a8, 0xb1b6, 0xd5a1, 0xb1cc, 0xb1c9, 0xd57b, 0xd56a, 0xb1c8, 0xd5a3, 0xd569, 0xb1bd, 0xb1c1, 0xd5a2, 0xd573, 0xb1c2, 0xb1bc, 0xd568, 0xb478, 0xd5a5, 0xd571, 0xb1c7, 0xd574, 0xd5a4, 0xb1c6, 0xd952, 0xb1b3, 0xd56f, 0xb1b8, 0xb1c3, 0xb1be, 0xd578, 0xd56e, 0xd56c, 0xd57e, 0xb1b0, 0xb1c4, 0xb1b4, 0xb477, 0xd57c, 0xb1b5, 0xb1b1, 0xb1c0, 0xb1bb, 0xb1b9, 0xd570, 0xb1c5, 0xd56d, 0xd57a, 0xd576, 0xd954, 0xd953, 0xd56b, 0xd964, 0xb47a, 0xd96a, 0xd959, 0xd967, 0xdd77, 0xb47d, 0xd96b, 0xd96e, 0xb47c, 0xd95c, 0xd96d, 0xd96c, 0xb47e, 0xd955, 0xb479, 0xb4a3, 0xb4a1, 0xd969, 0xd95f, 0xb4a5, 0xd970, 0xd968, 0xd971, 0xb4ad, 0xb4ab, 0xd966, 0xd965, 0xd963, 0xd95d, 0xb4a4, 0xb4a2, 0xd1b9, 0xd956, 0xddb7, 0xd957, 0xb47b, 0xb4aa, 0xdd79, 0xb4a6, 0xb4a7, 0xd958, 0xd96f, 0xdd78, 0xd960, 0xd95b, 0xb4a9, 0xd961, 0xd95e, 0xb4ae, 0xb770, 0xdd7c, 0xddb1, 0xddb6, 0xddaa, 0xb76c, 0xddbb, 0xb769, 0xdd7a, 0xdd7b, 0xb762, 0xb76b, 0xdda4, 0xb76e, 0xb76f, 0xdda5, 0xddb2, 0xddb8, 0xb76a, 0xb764, 0xdda3, 0xdd7d, 0xddba, 0xdda8, 0xdda9, 0xdd7e, 0xddb4, 0xddab, 0xddb5, 0xddad, 0xb765, 0xe1d9, 0xb768, 0xb766, 0xddb9, 0xddb0, 0xddac, 0xdda1, 0xba53, 0xddaf, 0xb76d, 0xdda7, 0xdda6, 0xb767, 0xb763, 0xe1ee, 0xddb3, 0xddae, 0xdda2, 0xe1e9, 0xe1da, 0xe1e5, 0xe1ec, 0xba51, 0xb4ac, 0xe1ea, 0xba4c, 0xba4b, 0xe1f1, 0xe1db, 0xe1e8, 0xe1dc, 0xe1e7, 0xba4f, 0xe1eb, 0xd962, 0xe1f2, 0xe1e3, 0xba52, 0xe5ba, 0xbcaf, 0xe1f0, 0xe1ef, 0xba54, 0xe5ad, 0xbcb0, 0xe5ae, 0xe1df, 0xe1e0, 0xe1dd, 0xe1e2, 0xe1de, 0xe1f3, 0xba4e, 0xbcb1, 0xba50, 0xba55, 0xe1e1, 0xe1ed, 0xe1e6, 0xe5b1, 0xba4a, 0xbcb4, 0xe9aa, 0xe5b6, 0xe5b5, 0xe5b7, 0xe5b4, 0xbcb5, 0xbcbb, 0xbcb8, 0xbcb9, 0xe5af, 0xe5b2, 0xe5bc, 0xbcc1, 0xbcbf, 0xe5b3, 0xd95a, 0xbcb2, 0xe5b9, 0xe5b0, 0xbcc2, 0xe5b8, 0xba4d, 0xbcb7, 0xe1e4, 0xbcba, 0xbcbe, 0xbcc0, 0xbcbd, 0xbcbc, 0xbcb6, 0xe5bb, 0xbcb3, 0xbcc3, 0xbed8, 0xbed9, 0xe9a9, 0xbee2, 0xbedf, 0xbed6, 0xbedd, 0xe9ab, 0xbedb, 0xbed5, 0xbedc, 0xe9a8, 0xc0bb, 0xbed7, 0xbede, 0xc0ba, 0xe9a7, 0xe9a6, 0xbee0, 0xbee1, 0xe9a5, 0xe9a4, 0xc0bc, 0xe9ae, 0xbeda, 0xe9ac, 0xc0bd, 0xc0c2, 0xecea, 0xecec, 0xc0bf, 0xeced, 0xece9, 0xeceb, 0xc0c0, 0xc0c3, 0xece8, 0xc0be, 0xc0c1, 0xc259, 0xe9ad, 0xc258, 0xc25e, 0xefd4, 0xc25c, 0xc25d, 0xefd7, 0xefd3, 0xc25a, 0xefd1, 0xc36b, 0xefd5, 0xefd6, 0xefd2, 0xc25b, 0xf242, 0xf245, 0xf246, 0xf244, 0xf247, 0xc36c, 0xf243, 0xf44e, 0xc464, 0xf44d, 0xf44c, 0xf44b, 0xc463, 0xc465, 0xf5cd, 0xc4e2, 0xc4e1, 0xf6e1, 0xf6e0, 0xf6e3, 0xc5cb, 0xc575, 0xf7dd, 0xf6e2, 0xf7dc, 0xc5cd, 0xc5cc, 0xc5f3, 0xf8a9, 0xf8ef, 0xa4e4, 0xd972, 0xe9af, 0xa6ac, 0xcaf7, 0xa7f1, 0xa7ef, 0xa7f0, 0xccc1, 0xa9f1, 0xac46, 0xcee7, 0xcee8, 0xac47, 0xd1ce, 0xaec4, 0xaec5, 0xd1cd, 0xb1d3, 0xb1cf, 0xd5a7, 0xb1d6, 0xb1d5, 0xb1ce, 0xb1d1, 0xb1d4, 0xb1d0, 0xd976, 0xb1cd, 0xb4af, 0xb4b1, 0xb4b2, 0xd975, 0xd978, 0xb4b0, 0xd973, 0xd977, 0xd974, 0xb771, 0xddbc, 0xba56, 0xe1f4, 0xbee3, 0xbcc4, 0xe5bd, 0xbcc5, 0xbcc6, 0xe5bf, 0xe5be, 0xe5c0, 0xe9b1, 0xe9b0, 0xecef, 0xecee, 0xc0c4, 0xc0c5, 0xf248, 0xa4e5, 0xd979, 0xb4b4, 0xb4b3, 0xddbd, 0xefd8, 0xc4e3, 0xf7de, 0xa4e6, 0xaec6, 0xb1d8, 0xb1d7, 0xd97a, 0xd97b, 0xb772, 0xe1f5, 0xba57, 0xe9b2, 0xa4e7, 0xa5b8, 0xa9f2, 0xccc2, 0xcee9, 0xac48, 0xb1d9, 0xd97c, 0xb4b5, 0xb773, 0xe5c1, 0xe5c2, 0xecf0, 0xc25f, 0xf8f0, 0xa4e8, 0xccc3, 0xa9f3, 0xac49, 0xceea, 0xaec7, 0xd1d2, 0xd1d0, 0xd1d1, 0xaec8, 0xd1cf, 0xb1db, 0xb1dc, 0xd5a8, 0xb1dd, 0xb1da, 0xd97d, 0xd97e, 0xddbe, 0xba59, 0xba58, 0xecf1, 0xefd9, 0xf24a, 0xf249, 0xf44f, 0xc95e, 0xac4a, 0xa4e9, 0xa5b9, 0xa6ae, 0xa6ad, 0xa6af, 0xa6b0, 0xc9ee, 0xc9ed, 0xcaf8, 0xa7f2, 0xcafb, 0xcafa, 0xcaf9, 0xcafc, 0xa9f4, 0xccc9, 0xccc5, 0xccce, 0xa9fb, 0xa9f9, 0xccca, 0xccc6, 0xcccd, 0xa9f8, 0xaa40, 0xccc8, 0xccc4, 0xa9fe, 0xcccb, 0xa9f7, 0xcccc, 0xa9fa, 0xa9fc, 0xccd0, 0xcccf, 0xccc7, 0xa9f6, 0xa9f5, 0xa9fd, 0xceef, 0xcef5, 0xac50, 0xac4d, 0xceec, 0xcef1, 0xac53, 0xac4b, 0xcef0, 0xac4e, 0xac51, 0xcef3, 0xac4c, 0xcef8, 0xac4f, 0xac52, 0xceed, 0xcef2, 0xcef6, 0xceee, 0xceeb, 0xcef7, 0xcef4, 0xaed0, 0xaec9, 0xaecc, 0xaecf, 0xd1d5, 0xaeca, 0xd1d3, 0xaece, 0xaecb, 0xd1d6, 0xaecd, 0xd5ac, 0xb1df, 0xd5ab, 0xd5ad, 0xb1de, 0xb1e3, 0xd1d4, 0xd5aa, 0xd5ae, 0xb1e0, 0xd5a9, 0xb1e2, 0xb1e1, 0xd9a7, 0xd9a2, 0xb4b6, 0xb4ba, 0xb4b7, 0xd9a5, 0xd9a8, 0xb4b8, 0xb4b9, 0xb4be, 0xddc7, 0xd9a6, 0xb4bc, 0xd9a3, 0xd9a1, 0xb4bd, 0xd9a4, 0xb779, 0xddbf, 0xb776, 0xb777, 0xb775, 0xddc4, 0xddc3, 0xddc0, 0xb77b, 0xddc2, 0xb4bb, 0xddc6, 0xddc1, 0xb778, 0xb774, 0xb77a, 0xddc5, 0xba5c, 0xe1f8, 0xe1f7, 0xe1f6, 0xba5a, 0xba5b, 0xe5c5, 0xe5c8, 0xbcc8, 0xbcc7, 0xe5c9, 0xe5c4, 0xbcca, 0xe5c6, 0xbcc9, 0xe5c3, 0xe5c7, 0xbee9, 0xbee6, 0xe9bb, 0xe9ba, 0xe9b9, 0xe9b4, 0xe9b5, 0xbee7, 0xbee4, 0xbee8, 0xe9b3, 0xbee5, 0xe9b6, 0xe9b7, 0xe9bc, 0xe9b8, 0xecf2, 0xc0c7, 0xefdc, 0xc0c6, 0xefda, 0xefdb, 0xc260, 0xc36e, 0xf24b, 0xc36d, 0xf451, 0xf452, 0xc466, 0xf450, 0xc4e4, 0xf7df, 0xc5ce, 0xf8aa, 0xf8ab, 0xa4ea, 0xa6b1, 0xa6b2, 0xa7f3, 0xccd1, 0xac54, 0xaed1, 0xb1e4, 0xb0d2, 0xb4bf, 0xb4c0, 0xb3cc, 0xd9a9, 0xb77c, 0xe1fa, 0xe1f9, 0xa4eb, 0xa6b3, 0xccd2, 0xaa42, 0xaa41, 0xcef9, 0xcefa, 0xd1d7, 0xd1d8, 0xaed2, 0xaed3, 0xaed4, 0xd5af, 0xb1e6, 0xb4c2, 0xb4c1, 0xddc8, 0xdf7a, 0xe1fb, 0xe9bd, 0xc261, 0xc467, 0xa4ec, 0xa5bc, 0xa5bd, 0xa5bb, 0xa5be, 0xa5ba, 0xa6b6, 0xc9f6, 0xa6b5, 0xa6b7, 0xc9f1, 0xc9f0, 0xc9f3, 0xc9f2, 0xc9f5, 0xa6b4, 0xc9ef, 0xc9f4, 0xcafd, 0xa7fd, 0xcafe, 0xcb43, 0xa7fc, 0xcb47, 0xcb42, 0xcb45, 0xa7f5, 0xa7f6, 0xa7f7, 0xa7f8, 0xa840, 0xcb41, 0xa7fa, 0xa841, 0xcb40, 0xcb46, 0xa7f9, 0xcb44, 0xa7fb, 0xa7f4, 0xa7fe, 0xaa57, 0xccd4, 0xaa43, 0xaa4d, 0xaa4e, 0xaa46, 0xaa58, 0xaa48, 0xccdc, 0xaa53, 0xccd7, 0xaa49, 0xcce6, 0xcce7, 0xccdf, 0xccd8, 0xaa56, 0xcce4, 0xaa51, 0xaa4f, 0xcce5, 0xcce3, 0xccdb, 0xccd3, 0xccda, 0xaa4a, 0xaa50, 0xaa44, 0xccde, 0xccdd, 0xccd5, 0xaa52, 0xcce1, 0xccd6, 0xaa55, 0xcce8, 0xaa45, 0xaa4c, 0xccd9, 0xcce2, 0xaa54, 0xaa47, 0xaa4b, 0xcce0, 0xcf5b, 0xac5c, 0xac69, 0xcf56, 0xcf4c, 0xac62, 0xcf4a, 0xac5b, 0xcf45, 0xac65, 0xcf52, 0xcefe, 0xcf41, 0xcf44, 0xcefb, 0xcf51, 0xcf61, 0xac60, 0xcf46, 0xcf58, 0xcefd, 0xcf5f, 0xcf60, 0xcf63, 0xcf5a, 0xcf4b, 0xcf53, 0xac66, 0xac59, 0xac61, 0xac6d, 0xac56, 0xac58, 0xcf43, 0xac6a, 0xac63, 0xcf5d, 0xcf40, 0xac6c, 0xac67, 0xcf49, 0xac6b, 0xcf50, 0xcf48, 0xac64, 0xcf5c, 0xcf54, 0xac5e, 0xcf62, 0xcf47, 0xac5a, 0xcf59, 0xcf4f, 0xac5f, 0xcf55, 0xac57, 0xcefc, 0xac68, 0xaee3, 0xac5d, 0xcf4e, 0xcf4d, 0xcf42, 0xcf5e, 0xcf57, 0xac55, 0xd1ec, 0xaeea, 0xd1ed, 0xd1e1, 0xaedf, 0xaeeb, 0xd1da, 0xd1e3, 0xd1eb, 0xd1d9, 0xd1f4, 0xaed5, 0xd1f3, 0xd1ee, 0xd1ef, 0xaedd, 0xaee8, 0xd1e5, 0xd1e6, 0xd1f0, 0xd1e7, 0xd1e2, 0xd1dc, 0xd1dd, 0xd1ea, 0xd1e4, 0xaed6, 0xaeda, 0xd1f2, 0xd1de, 0xaee6, 0xaee2, 0xaee5, 0xaeec, 0xaedb, 0xaee7, 0xd1e9, 0xaee9, 0xaed8, 0xaed7, 0xd1db, 0xd1df, 0xaee0, 0xd1f1, 0xd1e8, 0xd1e0, 0xaee4, 0xaee1, 0xaed9, 0xaedc, 0xd5c4, 0xd5b4, 0xd5b5, 0xd5b9, 0xd5c8, 0xd5c5, 0xd5be, 0xd5bd, 0xb1ed, 0xd5c1, 0xd5d0, 0xd5b0, 0xd5d1, 0xd5c3, 0xd5d5, 0xd5c9, 0xb1ec, 0xd5c7, 0xb1e7, 0xb1fc, 0xb1f2, 0xb1f6, 0xb1f5, 0xd5b1, 0xd5ce, 0xd5d4, 0xd5cc, 0xd5d3, 0xd5c0, 0xd5b2, 0xd5d2, 0xd5c2, 0xb1ea, 0xb1f7, 0xd5cb, 0xb1f0, 0xd5ca, 0xd5b3, 0xb1f8, 0xb1fa, 0xd5cd, 0xb1fb, 0xb1e9, 0xd5ba, 0xd5cf, 0xb1ef, 0xb1f9, 0xd5bc, 0xd5c6, 0xd5b7, 0xd5bb, 0xb1f4, 0xd5b6, 0xb1e8, 0xb1f1, 0xb1ee, 0xd5bf, 0xaede, 0xd9c0, 0xb1eb, 0xb1f3, 0xd9c3, 0xd9d9, 0xd9ce, 0xb4d6, 0xb4d1, 0xd9bd, 0xb4d2, 0xd9cd, 0xd9c6, 0xd9d3, 0xb4ce, 0xd9ab, 0xd9d5, 0xb4c4, 0xd9b3, 0xb4c7, 0xb4c6, 0xb4d7, 0xd9ad, 0xd9cf, 0xd9d0, 0xb4c9, 0xb4c5, 0xd9bb, 0xb4d0, 0xd9b6, 0xd9d1, 0xb4cc, 0xd9c9, 0xd9d6, 0xd9b0, 0xd9b5, 0xd9af, 0xb4cb, 0xd9c2, 0xddde, 0xd9b1, 0xb4cf, 0xd9ba, 0xd9d2, 0xb4ca, 0xd9b7, 0xd9b4, 0xd9c5, 0xb4cd, 0xb4c3, 0xb4d9, 0xd9c8, 0xd9c7, 0xd9ac, 0xb4c8, 0xd9d4, 0xd9bc, 0xd9be, 0xd9cb, 0xd9ca, 0xd9aa, 0xb4d3, 0xb4d5, 0xd9b2, 0xd9b9, 0xd9c1, 0xb4d4, 0xd9b8, 0xd9c4, 0xd9d7, 0xd9cc, 0xd9d8, 0xd9ae, 0xddf2, 0xb7a6, 0xddf0, 0xdddb, 0xdde0, 0xddd9, 0xddec, 0xddcb, 0xddd2, 0xddea, 0xddf4, 0xdddc, 0xddcf, 0xdde2, 0xdde7, 0xddd3, 0xdde4, 0xddd0, 0xddd7, 0xddd8, 0xb7a8, 0xddeb, 0xdde9, 0xddcc, 0xddee, 0xddef, 0xddf1, 0xb7ac, 0xb7a4, 0xd5b8, 0xddd4, 0xdde6, 0xddd5, 0xb7a1, 0xb7b1, 0xdded, 0xb7af, 0xb7ab, 0xddca, 0xb7a3, 0xddcd, 0xb7b0, 0xdddd, 0xddc9, 0xb7a9, 0xdde1, 0xddd1, 0xb7aa, 0xddda, 0xb77e, 0xb4d8, 0xdde3, 0xd9bf, 0xddce, 0xdde8, 0xb7a5, 0xdde5, 0xb7a2, 0xdddf, 0xb7ad, 0xddd6, 0xddf3, 0xb7a7, 0xdec6, 0xb7ae, 0xe24a, 0xe248, 0xe25e, 0xe246, 0xe258, 0xb77d, 0xba5f, 0xe242, 0xe25d, 0xe247, 0xe255, 0xba64, 0xba5d, 0xe25b, 0xe240, 0xe25a, 0xba6f, 0xe251, 0xe261, 0xba6d, 0xe249, 0xba5e, 0xe24b, 0xe259, 0xba67, 0xe244, 0xba6b, 0xba61, 0xe24d, 0xe243, 0xe1fc, 0xe257, 0xba68, 0xe260, 0xe1fd, 0xba65, 0xe253, 0xba66, 0xe245, 0xe250, 0xe24c, 0xe24e, 0xba60, 0xe25f, 0xba6e, 0xe24f, 0xe262, 0xe1fe, 0xe254, 0xba63, 0xba6c, 0xba6a, 0xe241, 0xe256, 0xba69, 0xba62, 0xe252, 0xe25c, 0xe5d5, 0xe5d1, 0xe5cd, 0xe5e1, 0xe5de, 0xbccd, 0xe5e5, 0xe5d4, 0xbcd8, 0xe5db, 0xe5d0, 0xe5da, 0xbcd5, 0xe5ee, 0xe5eb, 0xe5dd, 0xe5ce, 0xe5e2, 0xe5e4, 0xbcd1, 0xe5d8, 0xe5d3, 0xe5ca, 0xbcce, 0xbcd6, 0xe5e7, 0xbcd7, 0xe5cb, 0xe5ed, 0xe5e0, 0xe5e6, 0xbcd4, 0xe5e3, 0xe5ea, 0xbcd9, 0xbcd3, 0xe5dc, 0xe5cf, 0xe5ef, 0xe5cc, 0xe5e8, 0xbcd0, 0xe5d6, 0xe5d7, 0xbccf, 0xbccc, 0xe5d2, 0xbcd2, 0xbccb, 0xe5e9, 0xe5ec, 0xe5d9, 0xe9ca, 0xe9c2, 0xe9be, 0xbef6, 0xbeeb, 0xbef0, 0xbeec, 0xe9cc, 0xe9d7, 0xbeea, 0xe9c4, 0xe9cd, 0xe5df, 0xe9ce, 0xbef1, 0xe9dd, 0xbef5, 0xbef8, 0xe9c0, 0xbef4, 0xe9db, 0xe9dc, 0xe9d2, 0xe9d1, 0xe9c9, 0xe9d3, 0xe9da, 0xe9d9, 0xbeef, 0xbeed, 0xe9cb, 0xe9c8, 0xe9c5, 0xe9d8, 0xbef7, 0xe9d6, 0xbef3, 0xbef2, 0xe9d0, 0xe9bf, 0xe9c1, 0xe9c3, 0xe9d5, 0xe9cf, 0xbeee, 0xe9c6, 0xe9d4, 0xe9c7, 0xc0cf, 0xed45, 0xc0c8, 0xecf5, 0xed41, 0xc0ca, 0xed48, 0xecfc, 0xecf7, 0xed49, 0xecf3, 0xecfe, 0xc0d1, 0xed44, 0xed4a, 0xecfd, 0xc0c9, 0xed40, 0xecf4, 0xc0d0, 0xed47, 0xecf9, 0xc0cc, 0xecfb, 0xecf8, 0xc0d2, 0xecfa, 0xc0cb, 0xc0ce, 0xed43, 0xecf6, 0xed46, 0xed42, 0xc263, 0xefe7, 0xc268, 0xc269, 0xc262, 0xefe6, 0xefe3, 0xefe4, 0xc266, 0xefde, 0xefe2, 0xc265, 0xefdf, 0xc267, 0xc264, 0xefdd, 0xefe1, 0xefe5, 0xf251, 0xf24e, 0xf257, 0xf256, 0xf254, 0xf24f, 0xc372, 0xf250, 0xc371, 0xc0cd, 0xf253, 0xc370, 0xf258, 0xf252, 0xf24d, 0xefe0, 0xc36f, 0xf24c, 0xf456, 0xf455, 0xf255, 0xc468, 0xf459, 0xf45a, 0xf454, 0xf458, 0xf453, 0xf5d1, 0xf457, 0xc4e7, 0xc4e5, 0xf5cf, 0xf5d2, 0xf5ce, 0xf5d0, 0xc4e6, 0xf6e5, 0xf6e6, 0xc576, 0xf6e4, 0xf7e2, 0xc5cf, 0xf7e0, 0xf7e1, 0xf8ac, 0xc656, 0xf8f3, 0xf8f1, 0xf8f2, 0xf8f4, 0xf9bb, 0xa4ed, 0xa6b8, 0xaa59, 0xcce9, 0xcf64, 0xd1f5, 0xd1f7, 0xd1f6, 0xd1f8, 0xb1fd, 0xd5d7, 0xd1f9, 0xd5d6, 0xd5d8, 0xd5d9, 0xd9da, 0xb4db, 0xd9db, 0xd9dd, 0xb4dc, 0xb4da, 0xd9dc, 0xddfa, 0xddf8, 0xddf7, 0xddf6, 0xddf5, 0xb7b2, 0xddf9, 0xba70, 0xe263, 0xe265, 0xba71, 0xe264, 0xbcdb, 0xbcda, 0xe5f0, 0xe9df, 0xe9de, 0xe9e0, 0xbef9, 0xed4b, 0xc0d3, 0xefe8, 0xc26a, 0xf259, 0xc577, 0xa4ee, 0xa5bf, 0xa6b9, 0xa842, 0xaa5a, 0xaa5b, 0xac6e, 0xd1fa, 0xb7b3, 0xe6d1, 0xbefa, 0xc26b, 0xa4ef, 0xa6ba, 0xcceb, 0xaa5c, 0xccea, 0xcf65, 0xac6f, 0xcf66, 0xac70, 0xd1fc, 0xaeee, 0xaeed, 0xd5de, 0xd5dc, 0xd5dd, 0xd5db, 0xd5da, 0xd9de, 0xd9e1, 0xb4de, 0xd9df, 0xb4dd, 0xd9e0, 0xddfb, 0xe266, 0xe267, 0xe268, 0xe5f3, 0xe5f2, 0xbcdc, 0xe5f1, 0xe5f4, 0xe9e1, 0xe9e2, 0xe9e3, 0xed4c, 0xc0d4, 0xc26c, 0xf25a, 0xc4e8, 0xc95f, 0xac71, 0xcf67, 0xaeef, 0xb1fe, 0xb4df, 0xd9e2, 0xb7b5, 0xb7b4, 0xe269, 0xe26a, 0xbcdd, 0xbcde, 0xe9e5, 0xe9e4, 0xefe9, 0xf7e3, 0xa4f0, 0xc960, 0xa5c0, 0xa843, 0xcb48, 0xac72, 0xb7b6, 0xa4f1, 0xcf68, 0xac73, 0xcf69, 0xc0d5, 0xa4f2, 0xccec, 0xcf6a, 0xd242, 0xd241, 0xd1fe, 0xd1fd, 0xd243, 0xd240, 0xb240, 0xb241, 0xb4e0, 0xd9e3, 0xd9e4, 0xd9e5, 0xde41, 0xde42, 0xde40, 0xddfd, 0xddfe, 0xb7b7, 0xe26b, 0xe5f7, 0xe5f6, 0xe5f5, 0xe5f8, 0xe9e7, 0xe9e6, 0xbefb, 0xe9e8, 0xc0d6, 0xed4d, 0xefea, 0xf25b, 0xf6e7, 0xa4f3, 0xa5c2, 0xa5c1, 0xaa5d, 0xc961, 0xc97e, 0xa6bb, 0xc9f7, 0xcb49, 0xcb4a, 0xaa5e, 0xcced, 0xac74, 0xcf6b, 0xcf6c, 0xaef0, 0xaef4, 0xd244, 0xaef3, 0xaef1, 0xaef2, 0xd5df, 0xb242, 0xb4e3, 0xb4e1, 0xb4e2, 0xd9e6, 0xba72, 0xa4f4, 0xc9a1, 0xa5c3, 0xc9a4, 0xa5c6, 0xc9a3, 0xa5c5, 0xa5c4, 0xa844, 0xc9a2, 0xc9f8, 0xc9fc, 0xc9fe, 0xca40, 0xa6c5, 0xa6c6, 0xc9fb, 0xa6c1, 0xc9f9, 0xc9fd, 0xa6c2, 0xa6bd, 0xa6be, 0xa6c4, 0xc9fa, 0xa6bc, 0xa845, 0xa6bf, 0xa6c0, 0xa6c3, 0xcb5b, 0xcb59, 0xcb4c, 0xa851, 0xcb53, 0xa84c, 0xcb4d, 0xcb55, 0xcb52, 0xa84f, 0xcb51, 0xa856, 0xcb5a, 0xa858, 0xa85a, 0xcb4b, 0xa84d, 0xcb5c, 0xa854, 0xa857, 0xcd45, 0xa847, 0xa85e, 0xa855, 0xcb4e, 0xa84a, 0xa859, 0xcb56, 0xa848, 0xa849, 0xcd43, 0xcb4f, 0xa850, 0xa85b, 0xcb5d, 0xcb50, 0xa84e, 0xa853, 0xccee, 0xa85c, 0xcb57, 0xa852, 0xa85d, 0xa846, 0xcb54, 0xa84b, 0xcb58, 0xcd44, 0xaa6a, 0xaa7a, 0xccf5, 0xaa71, 0xcd4b, 0xaa62, 0xaa65, 0xcd42, 0xccf3, 0xccf7, 0xaa6d, 0xaa6f, 0xccfa, 0xaa76, 0xaa68, 0xaa66, 0xaa67, 0xaa75, 0xcd47, 0xaa70, 0xccf9, 0xccfb, 0xaa6e, 0xaa73, 0xccfc, 0xcd4a, 0xac75, 0xaa79, 0xaa63, 0xcd49, 0xcd4d, 0xccf8, 0xcd4f, 0xcd40, 0xaa6c, 0xccf4, 0xaa6b, 0xaa7d, 0xaa72, 0xccf2, 0xcf75, 0xaa78, 0xaa7c, 0xcd41, 0xcd46, 0xaa7e, 0xaa77, 0xaa69, 0xaa5f, 0xaa64, 0xccf6, 0xaa60, 0xcd4e, 0xccf0, 0xccef, 0xccfd, 0xccf1, 0xaa7b, 0xaef5, 0xaa74, 0xccfe, 0xaa61, 0xaca6, 0xcd4c, 0xcf7c, 0xcfa1, 0xcfa4, 0xcf77, 0xcfa7, 0xcfaa, 0xcfac, 0xcf74, 0xac76, 0xac7b, 0xd249, 0xacad, 0xcfa5, 0xcfad, 0xcf7b, 0xcf73, 0xd264, 0xac7e, 0xcfa2, 0xcf78, 0xcf7a, 0xaca5, 0xcf7d, 0xac7d, 0xcf70, 0xcfa8, 0xcfab, 0xac7a, 0xaca8, 0xcf6d, 0xacaa, 0xac78, 0xacae, 0xcfa9, 0xcf6f, 0xacab, 0xd25e, 0xcd48, 0xac7c, 0xac77, 0xcf76, 0xcf6e, 0xacac, 0xaca4, 0xcfa3, 0xaca9, 0xaca7, 0xcf79, 0xaca1, 0xcf71, 0xaca2, 0xaca3, 0xcf72, 0xcfa6, 0xac79, 0xcf7e, 0xd24c, 0xaefd, 0xaf43, 0xd255, 0xd25b, 0xd257, 0xd24a, 0xd24d, 0xd246, 0xd247, 0xaf4a, 0xaefa, 0xd256, 0xd25f, 0xaf45, 0xaef6, 0xaf40, 0xd24e, 0xaf42, 0xd24f, 0xd259, 0xaf44, 0xd268, 0xd248, 0xaefc, 0xaefb, 0xaf48, 0xd245, 0xd266, 0xd25a, 0xd267, 0xd261, 0xd253, 0xd262, 0xd25c, 0xd265, 0xd263, 0xaf49, 0xd254, 0xaef9, 0xaef8, 0xaf41, 0xaf47, 0xd260, 0xaf46, 0xd251, 0xb243, 0xd269, 0xd250, 0xd24b, 0xaefe, 0xaf4b, 0xaef7, 0xd258, 0xd25d, 0xb265, 0xd5e1, 0xd5e5, 0xb252, 0xb250, 0xb247, 0xd5e3, 0xd5e2, 0xb25b, 0xd5e8, 0xb255, 0xd5fa, 0xd647, 0xb244, 0xd5f7, 0xd5f0, 0xb267, 0xd5e0, 0xd5fc, 0xb264, 0xb258, 0xb263, 0xb24e, 0xd5ec, 0xd5fe, 0xd5f6, 0xb24f, 0xb249, 0xd645, 0xd5fd, 0xd640, 0xb251, 0xb259, 0xd642, 0xd5ea, 0xd5fb, 0xd5ef, 0xd644, 0xb25e, 0xb246, 0xb25c, 0xd5f4, 0xd5f2, 0xd5f3, 0xb253, 0xd5ee, 0xd5ed, 0xb248, 0xd5e7, 0xd646, 0xb24a, 0xd5f1, 0xb268, 0xb262, 0xd5e6, 0xb25f, 0xb25d, 0xb266, 0xd5f8, 0xb261, 0xd252, 0xd5f9, 0xb260, 0xd641, 0xb245, 0xd5f5, 0xb257, 0xd5e9, 0xb256, 0xb254, 0xb24c, 0xb24b, 0xd9e7, 0xd643, 0xd5eb, 0xd9fc, 0xb24d, 0xb541, 0xb25a, 0xb4ee, 0xd9f6, 0xb4fc, 0xd9ea, 0xb4eb, 0xb4e7, 0xda49, 0xb4ed, 0xb4f1, 0xb4ec, 0xb4f5, 0xda4d, 0xda44, 0xd9f1, 0xb4fa, 0xb4f4, 0xd9fd, 0xb4e4, 0xda4a, 0xda43, 0xb4e8, 0xd9f7, 0xb4f7, 0xda55, 0xda56, 0xb4e5, 0xda48, 0xb4f9, 0xd9fb, 0xd9ed, 0xd9ee, 0xb4fd, 0xd9f2, 0xd9f9, 0xd9f3, 0xb4fb, 0xb544, 0xd9ef, 0xd9e8, 0xd9e9, 0xd9eb, 0xb4ea, 0xd9f8, 0xb4f8, 0xb542, 0xd9fa, 0xda53, 0xda4b, 0xb4e6, 0xda51, 0xb4f2, 0xb4f0, 0xda57, 0xb4ef, 0xda41, 0xd9f4, 0xd9fe, 0xb547, 0xda45, 0xda42, 0xd9f0, 0xb543, 0xda4f, 0xda4c, 0xda54, 0xb4e9, 0xda40, 0xb546, 0xda47, 0xb4f3, 0xb4f6, 0xda46, 0xb545, 0xd9f5, 0xd5e4, 0xda50, 0xda4e, 0xda52, 0xd9ec, 0xb540, 0xde61, 0xde60, 0xde46, 0xb7bd, 0xde5f, 0xde49, 0xde4a, 0xb7c7, 0xde68, 0xb7c2, 0xde5e, 0xde43, 0xb7c8, 0xb7be, 0xde52, 0xde48, 0xde4b, 0xde63, 0xb7b8, 0xde6a, 0xde62, 0xb7c1, 0xde57, 0xb7cc, 0xb7cb, 0xb7c5, 0xde69, 0xb7b9, 0xde55, 0xde4c, 0xde59, 0xde65, 0xb7cd, 0xb7bb, 0xde54, 0xde4d, 0xb7c4, 0xb7c3, 0xde50, 0xde5a, 0xde64, 0xde47, 0xde51, 0xb7bc, 0xde5b, 0xb7c9, 0xb7c0, 0xde4e, 0xb7bf, 0xde45, 0xde53, 0xde67, 0xb4fe, 0xbab0, 0xde56, 0xe26c, 0xde58, 0xde66, 0xb7c6, 0xde4f, 0xb7ba, 0xb7ca, 0xbcf0, 0xde44, 0xde5d, 0xde5c, 0xe2aa, 0xbaad, 0xe27d, 0xe2a4, 0xbaa2, 0xe26e, 0xbaaf, 0xba77, 0xe26d, 0xe2b0, 0xbab1, 0xe271, 0xe2a3, 0xe273, 0xe2b3, 0xe2af, 0xba75, 0xbaa1, 0xe653, 0xbaae, 0xba7d, 0xe26f, 0xe2ae, 0xbaa3, 0xe2ab, 0xe2b8, 0xe275, 0xe27e, 0xe2b6, 0xe2ac, 0xba7c, 0xe27c, 0xba76, 0xba74, 0xbaa8, 0xe27a, 0xe277, 0xe278, 0xe2b2, 0xe2b7, 0xe2b5, 0xba7a, 0xe2b9, 0xba7e, 0xbaa7, 0xe270, 0xe5fa, 0xe279, 0xba78, 0xbaac, 0xbaa9, 0xba7b, 0xe2a5, 0xe274, 0xbaaa, 0xe2a7, 0xbaa4, 0xbaa6, 0xba73, 0xe2a9, 0xe2a1, 0xe272, 0xbaa5, 0xe2b1, 0xe2b4, 0xe27b, 0xe2a8, 0xba79, 0xbcdf, 0xe2a6, 0xe5f9, 0xe2ad, 0xe276, 0xe644, 0xe64e, 0xbce2, 0xe64d, 0xe659, 0xbce4, 0xe64b, 0xe64f, 0xbcef, 0xe646, 0xbce7, 0xe652, 0xe9f0, 0xbcf3, 0xbcf2, 0xe654, 0xe643, 0xe65e, 0xbced, 0xbce3, 0xe657, 0xe65b, 0xe660, 0xe655, 0xe649, 0xbce6, 0xbce9, 0xbcf1, 0xbcec, 0xe64c, 0xe2a2, 0xe648, 0xe65f, 0xbce8, 0xbceb, 0xe661, 0xbce0, 0xe656, 0xe5fb, 0xe65c, 0xc0df, 0xe64a, 0xbce1, 0xe645, 0xbce5, 0xe5fc, 0xbaab, 0xe641, 0xe65a, 0xe642, 0xe640, 0xbcea, 0xe658, 0xe5fe, 0xe651, 0xe650, 0xe65d, 0xe647, 0xbcee, 0xe9f3, 0xbf49, 0xbefe, 0xea40, 0xe9eb, 0xbf41, 0xe9f7, 0xbf48, 0xbf43, 0xe9f5, 0xed4f, 0xe9fb, 0xea42, 0xe9fa, 0xe9e9, 0xe9f8, 0xea44, 0xea46, 0xbefd, 0xea45, 0xbf44, 0xbf4a, 0xbf47, 0xe9fe, 0xbf46, 0xe9f9, 0xe9ed, 0xe9f2, 0xe9fd, 0xbf45, 0xbf42, 0xbefc, 0xbf40, 0xe9f1, 0xe5fd, 0xe9ec, 0xe9ef, 0xea41, 0xe9f4, 0xe9ea, 0xed4e, 0xea43, 0xe9ee, 0xe9fc, 0xed51, 0xc0e3, 0xc0d7, 0xc0db, 0xed53, 0xed59, 0xed57, 0xc0d9, 0xc0da, 0xc0e1, 0xed5a, 0xed52, 0xc0dc, 0xed56, 0xed55, 0xed5b, 0xc0e2, 0xc0dd, 0xc0e0, 0xed54, 0xc0e4, 0xc0de, 0xc0e5, 0xc0d8, 0xed58, 0xed50, 0xeff7, 0xc271, 0xeff4, 0xeff6, 0xc26f, 0xeff2, 0xeff3, 0xefee, 0xe9f6, 0xefef, 0xc270, 0xefeb, 0xc26d, 0xeff8, 0xc26e, 0xefec, 0xefed, 0xeff1, 0xc273, 0xc272, 0xeff0, 0xc378, 0xf25f, 0xf265, 0xc379, 0xf25c, 0xc376, 0xc373, 0xf267, 0xc377, 0xc374, 0xf25e, 0xf261, 0xf262, 0xf263, 0xf266, 0xeff5, 0xf25d, 0xc375, 0xf264, 0xf268, 0xf260, 0xf45d, 0xc46a, 0xf460, 0xc46b, 0xf468, 0xf45f, 0xf45c, 0xf45e, 0xf462, 0xf465, 0xf464, 0xf467, 0xf45b, 0xc469, 0xf463, 0xf466, 0xf469, 0xf461, 0xf5d3, 0xf5d4, 0xf5d8, 0xf5d9, 0xf5d6, 0xf5d7, 0xf5d5, 0xc4e9, 0xc578, 0xf6eb, 0xf6e8, 0xf6e9, 0xf6ea, 0xc579, 0xf7e5, 0xf7e4, 0xf8af, 0xc5f4, 0xf8ad, 0xf8b0, 0xf8ae, 0xf8f5, 0xc657, 0xc665, 0xf9a3, 0xf96c, 0xf9a2, 0xf9d0, 0xf9d1, 0xa4f5, 0xa6c7, 0xca41, 0xcb5e, 0xa85f, 0xa862, 0xcb5f, 0xa860, 0xa861, 0xcd58, 0xcd5a, 0xcd55, 0xcd52, 0xcd54, 0xaaa4, 0xaaa2, 0xcd56, 0xaaa3, 0xcd53, 0xcd50, 0xaaa1, 0xcd57, 0xcd51, 0xaaa5, 0xcd59, 0xcfaf, 0xcfb3, 0xacb7, 0xcfb6, 0xacaf, 0xacb2, 0xacb4, 0xacb6, 0xacb3, 0xcfb2, 0xcfb1, 0xacb1, 0xcfb4, 0xcfb5, 0xcfae, 0xacb5, 0xacb0, 0xcfb0, 0xd277, 0xd278, 0xd279, 0xaf50, 0xaf4c, 0xd26e, 0xd276, 0xd27b, 0xaf51, 0xd26c, 0xd272, 0xd26b, 0xd275, 0xd271, 0xaf4d, 0xaf4f, 0xd27a, 0xd26a, 0xd26d, 0xd273, 0xd274, 0xd27c, 0xd270, 0xaf4e, 0xb26d, 0xd64e, 0xd650, 0xd64c, 0xd658, 0xd64a, 0xd657, 0xb269, 0xd648, 0xda5b, 0xd652, 0xb26c, 0xd653, 0xd656, 0xd65a, 0xd64f, 0xd654, 0xb26a, 0xb26b, 0xd659, 0xd64d, 0xd649, 0xd65b, 0xd651, 0xd655, 0xd64b, 0xb548, 0xb549, 0xda65, 0xb54f, 0xda59, 0xda62, 0xda58, 0xb54c, 0xda60, 0xda5e, 0xda5f, 0xb54a, 0xda63, 0xda5c, 0xda5a, 0xb54b, 0xda5d, 0xda61, 0xb54d, 0xda64, 0xde70, 0xde77, 0xde79, 0xdea1, 0xb7da, 0xde6b, 0xb7d2, 0xde7a, 0xb7d7, 0xdea2, 0xb7ce, 0xde7d, 0xde6d, 0xde7e, 0xde6c, 0xb7dc, 0xde78, 0xb7cf, 0xdea3, 0xb7d4, 0xde71, 0xb7d9, 0xde7c, 0xde6f, 0xde76, 0xde72, 0xde6e, 0xb7d1, 0xb7d8, 0xb7d6, 0xb7d3, 0xb7db, 0xb7d0, 0xde75, 0xb7d5, 0xb54e, 0xde7b, 0xde73, 0xde74, 0xe2c1, 0xbab4, 0xe2bd, 0xe2c3, 0xe2bf, 0xbab6, 0xe2be, 0xe2c2, 0xe2ba, 0xe2bc, 0xbab5, 0xe2c0, 0xe2bb, 0xbab7, 0xbab2, 0xe2c4, 0xbab3, 0xe667, 0xe664, 0xe670, 0xe66a, 0xe66c, 0xbcf4, 0xe666, 0xe66e, 0xe66d, 0xe66b, 0xe671, 0xbcf7, 0xe668, 0xe66f, 0xbcf5, 0xe663, 0xe665, 0xbcf6, 0xe662, 0xe672, 0xe669, 0xea4a, 0xbf51, 0xea55, 0xea53, 0xbf4b, 0xea49, 0xea4c, 0xea4d, 0xea48, 0xbf55, 0xbf56, 0xea47, 0xea56, 0xea51, 0xbf4f, 0xbf4c, 0xea50, 0xea4e, 0xbf52, 0xea52, 0xbf4d, 0xbf4e, 0xea4f, 0xbf50, 0xea4b, 0xea54, 0xbf53, 0xea57, 0xea58, 0xbf54, 0xc0e7, 0xc0ee, 0xed5c, 0xed62, 0xed60, 0xc0ea, 0xc0e9, 0xc0e6, 0xed5e, 0xc0ec, 0xc0eb, 0xc0e8, 0xed61, 0xed5d, 0xed5f, 0xc0ed, 0xc277, 0xeffb, 0xc274, 0xc275, 0xeffd, 0xc276, 0xeffa, 0xeff9, 0xf26c, 0xeffc, 0xf26d, 0xc37a, 0xf26b, 0xf26a, 0xf269, 0xc37b, 0xc46c, 0xf46a, 0xf46b, 0xf5dc, 0xf5db, 0xc4ea, 0xf5da, 0xf6ec, 0xf6ed, 0xf7e6, 0xf8b1, 0xf8f6, 0xf9bc, 0xc679, 0xf9c6, 0xa4f6, 0xaaa6, 0xaaa7, 0xacb8, 0xc0ef, 0xa4f7, 0xaaa8, 0xaf52, 0xb7dd, 0xa4f8, 0xb26e, 0xbab8, 0xc962, 0xcfb7, 0xd27d, 0xe2c5, 0xc0f0, 0xa4f9, 0xaaa9, 0xcfb8, 0xcfb9, 0xda66, 0xb550, 0xdea4, 0xb7de, 0xe2c6, 0xbcf8, 0xc37c, 0xa4fa, 0xda67, 0xa4fb, 0xa6c9, 0xca42, 0xa6c8, 0xa865, 0xa864, 0xa863, 0xcb60, 0xaaaa, 0xaaab, 0xcd5b, 0xcfba, 0xcfbd, 0xacba, 0xcfbb, 0xacb9, 0xcfbc, 0xacbb, 0xd2a2, 0xd2a1, 0xd27e, 0xaf53, 0xd65d, 0xd65e, 0xb26f, 0xd65c, 0xd65f, 0xb552, 0xb270, 0xb551, 0xda6b, 0xda6a, 0xda68, 0xda69, 0xda6c, 0xdea6, 0xdea5, 0xdea9, 0xdea8, 0xdea7, 0xbab9, 0xe2c9, 0xe2c8, 0xbaba, 0xe2c7, 0xe673, 0xe674, 0xbcf9, 0xea59, 0xea5a, 0xf272, 0xc37d, 0xf271, 0xf270, 0xf26e, 0xf26f, 0xc4eb, 0xf46c, 0xf6ee, 0xf8f7, 0xa4fc, 0xc9a5, 0xa5c7, 0xc9a6, 0xca43, 0xca44, 0xcb66, 0xcb62, 0xcb61, 0xaaac, 0xcb65, 0xa867, 0xcb63, 0xa866, 0xcb67, 0xcb64, 0xcd5f, 0xcfbe, 0xcd5d, 0xcd64, 0xaaad, 0xaab0, 0xcd65, 0xcd61, 0xcd62, 0xcd5c, 0xaaaf, 0xcd5e, 0xaaae, 0xcd63, 0xcd60, 0xcfc2, 0xacbd, 0xacbe, 0xcfc5, 0xcfbf, 0xcfc4, 0xcfc0, 0xacbc, 0xcfc3, 0xcfc1, 0xd2a8, 0xd2a5, 0xd2a7, 0xaf58, 0xaf57, 0xaf55, 0xd2a4, 0xd2a9, 0xaf54, 0xaf56, 0xd2a6, 0xd667, 0xd2a3, 0xd2aa, 0xd662, 0xd666, 0xd665, 0xda6e, 0xda79, 0xd668, 0xd663, 0xda6d, 0xb274, 0xb273, 0xd661, 0xd664, 0xb275, 0xb272, 0xb271, 0xd660, 0xd669, 0xda70, 0xda77, 0xb554, 0xda76, 0xda73, 0xb556, 0xda75, 0xda6f, 0xda71, 0xda74, 0xda72, 0xb555, 0xda78, 0xb553, 0xb7df, 0xdead, 0xdeac, 0xdeaa, 0xb7e2, 0xb7e1, 0xdeae, 0xdeab, 0xe2ca, 0xbabb, 0xb7e0, 0xdeb0, 0xdeaf, 0xe2cd, 0xe2cb, 0xbcfa, 0xbabc, 0xe2cc, 0xe676, 0xbcfb, 0xe675, 0xe67e, 0xe67d, 0xe67b, 0xe67a, 0xe677, 0xe678, 0xe679, 0xe67c, 0xe6a1, 0xea5f, 0xea5c, 0xea5d, 0xbf57, 0xea5b, 0xea61, 0xea60, 0xea5e, 0xed64, 0xed65, 0xc0f1, 0xc0f2, 0xed63, 0xc279, 0xeffe, 0xc278, 0xc37e, 0xc3a1, 0xc46d, 0xf46e, 0xf46d, 0xf5dd, 0xf6ef, 0xc57a, 0xf7e8, 0xf7e7, 0xf7e9, 0xa5c8, 0xcfc6, 0xaf59, 0xb276, 0xd66a, 0xa5c9, 0xc9a7, 0xa4fd, 0xca45, 0xcb6c, 0xcb6a, 0xcb6b, 0xcb68, 0xa868, 0xcb69, 0xcd6d, 0xaab3, 0xcd6b, 0xcd67, 0xcd6a, 0xcd66, 0xaab5, 0xcd69, 0xaab2, 0xaab1, 0xaab4, 0xcd6c, 0xcd68, 0xacc2, 0xacc5, 0xcfce, 0xcfcd, 0xcfcc, 0xacbf, 0xcfd5, 0xcfcb, 0xacc1, 0xd2af, 0xcfd2, 0xcfd0, 0xacc4, 0xcfc8, 0xcfd3, 0xcfca, 0xcfd4, 0xcfd1, 0xcfc9, 0xacc0, 0xcfd6, 0xcfc7, 0xacc3, 0xd2b4, 0xd2ab, 0xd2b6, 0xd2ae, 0xd2b9, 0xd2ba, 0xd2ac, 0xd2b8, 0xd2b5, 0xd2b3, 0xd2b7, 0xaf5f, 0xaf5d, 0xd2b1, 0xd2ad, 0xd2b0, 0xd2bb, 0xd2b2, 0xaf5e, 0xcfcf, 0xaf5a, 0xaf5c, 0xd678, 0xd66d, 0xd66b, 0xd66c, 0xd673, 0xd674, 0xd670, 0xb27b, 0xd675, 0xd672, 0xd66f, 0xb279, 0xd66e, 0xb277, 0xb27a, 0xd671, 0xd679, 0xaf5b, 0xb278, 0xd677, 0xd676, 0xb27c, 0xda7e, 0xdaa1, 0xb560, 0xdaa7, 0xdaa9, 0xdaa2, 0xb55a, 0xdaa6, 0xdaa5, 0xb55b, 0xb561, 0xb562, 0xdaa8, 0xb558, 0xda7d, 0xda7b, 0xdaa3, 0xda7a, 0xb55f, 0xda7c, 0xdaa4, 0xdaaa, 0xb559, 0xb55e, 0xb55c, 0xb55d, 0xb557, 0xb7e9, 0xdeb7, 0xb7e8, 0xdebb, 0xdeb1, 0xdebc, 0xdeb2, 0xdeb3, 0xdebd, 0xdeba, 0xdeb8, 0xdeb9, 0xdeb5, 0xdeb4, 0xdebe, 0xb7e5, 0xdeb6, 0xb7ea, 0xb7e4, 0xb7eb, 0xb7ec, 0xb7e7, 0xb7e6, 0xe2ce, 0xbabe, 0xbabd, 0xe2d3, 0xbcfc, 0xbabf, 0xbac1, 0xe2d4, 0xb7e3, 0xbac0, 0xe2d0, 0xe2d2, 0xe2cf, 0xe2d1, 0xe6ab, 0xe6aa, 0xe6a7, 0xbd40, 0xea62, 0xbd41, 0xe6a6, 0xbcfe, 0xe6a8, 0xe6a5, 0xe6a2, 0xe6a9, 0xe6a3, 0xe6a4, 0xbcfd, 0xed69, 0xea66, 0xea65, 0xea67, 0xed66, 0xbf5a, 0xea63, 0xbf58, 0xbf5c, 0xbf5b, 0xea64, 0xea68, 0xbf59, 0xed6d, 0xc0f5, 0xc27a, 0xc0f6, 0xc0f3, 0xed6a, 0xed68, 0xed6b, 0xed6e, 0xc0f4, 0xed6c, 0xed67, 0xf042, 0xf045, 0xf275, 0xf040, 0xf46f, 0xf046, 0xc3a2, 0xf044, 0xc27b, 0xf041, 0xf043, 0xf047, 0xf276, 0xf274, 0xc3a3, 0xf273, 0xc46e, 0xc4ed, 0xf6f1, 0xc4ec, 0xf6f3, 0xf6f0, 0xf6f2, 0xc5d0, 0xf8b2, 0xa5ca, 0xcd6e, 0xd2bc, 0xd2bd, 0xb27d, 0xdebf, 0xbf5d, 0xc3a4, 0xc57b, 0xf8b3, 0xa5cb, 0xcd6f, 0xa260, 0xcfd7, 0xcfd8, 0xd2be, 0xd2bf, 0xb27e, 0xb2a1, 0xdaab, 0xdec2, 0xdec1, 0xdec0, 0xe2d5, 0xe2d6, 0xe2d7, 0xbac2, 0xe6ad, 0xe6ac, 0xea69, 0xbf5e, 0xbf5f, 0xed72, 0xed6f, 0xed70, 0xed71, 0xf049, 0xf048, 0xc27c, 0xf277, 0xf5de, 0xa5cc, 0xacc6, 0xb2a2, 0xdec3, 0xa5cd, 0xd2c0, 0xb2a3, 0xb563, 0xb564, 0xa5ce, 0xa5cf, 0xca46, 0xa86a, 0xa869, 0xacc7, 0xcfd9, 0xdaac, 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa86b, 0xa86c, 0xcb6e, 0xcb6d, 0xaab6, 0xcd72, 0xcd70, 0xcd71, 0xcfda, 0xcfdb, 0xaccb, 0xacc9, 0xacca, 0xacc8, 0xaf60, 0xaf64, 0xaf63, 0xd2c1, 0xaf62, 0xaf61, 0xd2c2, 0xb2a6, 0xd67b, 0xd67a, 0xb2a4, 0xb2a5, 0xb566, 0xb565, 0xdaae, 0xdaad, 0xb2a7, 0xb7ed, 0xdec5, 0xb7ee, 0xdec4, 0xe2d8, 0xe6ae, 0xbd42, 0xea6a, 0xed73, 0xc3a6, 0xc3a5, 0xc57c, 0xa5d4, 0xcd73, 0xb2a8, 0xe2d9, 0xbac3, 0xcb6f, 0xcb70, 0xcd74, 0xaab8, 0xaab9, 0xaab7, 0xaccf, 0xacd0, 0xaccd, 0xacce, 0xcfdc, 0xcfdd, 0xaccc, 0xd2c3, 0xaf68, 0xaf69, 0xb2ab, 0xd2c9, 0xaf6e, 0xaf6c, 0xd2ca, 0xd2c5, 0xaf6b, 0xaf6a, 0xaf65, 0xd2c8, 0xd2c7, 0xd2c4, 0xaf6d, 0xd2c6, 0xaf66, 0xaf67, 0xb2ac, 0xd6a1, 0xd6a2, 0xb2ad, 0xd67c, 0xd67e, 0xd6a4, 0xd6a3, 0xd67d, 0xb2a9, 0xb2aa, 0xdab6, 0xb56b, 0xb56a, 0xdab0, 0xb568, 0xdab3, 0xb56c, 0xdab4, 0xb56d, 0xdab1, 0xb567, 0xb569, 0xdab5, 0xdab2, 0xdaaf, 0xded2, 0xdec7, 0xb7f0, 0xb7f3, 0xb7f2, 0xb7f7, 0xb7f6, 0xded3, 0xded1, 0xdeca, 0xdece, 0xdecd, 0xb7f4, 0xded0, 0xdecc, 0xded4, 0xdecb, 0xb7f5, 0xb7ef, 0xb7f1, 0xdec9, 0xe2db, 0xbac7, 0xe2df, 0xbac6, 0xe2dc, 0xbac5, 0xdec8, 0xdecf, 0xe2de, 0xbac8, 0xe2e0, 0xe2dd, 0xe2da, 0xe6b1, 0xe6b5, 0xe6b7, 0xe6b3, 0xe6b2, 0xe6b0, 0xbd45, 0xbd43, 0xbd48, 0xbd49, 0xe6b4, 0xbd46, 0xe6af, 0xbd47, 0xbac4, 0xe6b6, 0xbd44, 0xea6c, 0xea6b, 0xea73, 0xea6d, 0xea72, 0xea6f, 0xbf60, 0xea71, 0xbf61, 0xbf62, 0xea70, 0xea6e, 0xc0f8, 0xed74, 0xc0f7, 0xed77, 0xed75, 0xed76, 0xc0f9, 0xf04d, 0xc2a1, 0xf04e, 0xc27d, 0xf04f, 0xc27e, 0xf04c, 0xf050, 0xf04a, 0xc3a7, 0xf278, 0xc3a8, 0xc46f, 0xf04b, 0xc470, 0xc4ee, 0xf5df, 0xc57e, 0xf6f4, 0xc57d, 0xf7ea, 0xc5f5, 0xc5f6, 0xf9cc, 0xacd1, 0xcfde, 0xb56e, 0xb56f, 0xa5d5, 0xa6ca, 0xca47, 0xcb71, 0xa86d, 0xaaba, 0xacd2, 0xacd3, 0xacd4, 0xd6a6, 0xd2cb, 0xaf6f, 0xb2ae, 0xd6a5, 0xdab8, 0xb571, 0xdab7, 0xb570, 0xded5, 0xbd4a, 0xe6bb, 0xe6b8, 0xe6b9, 0xe6ba, 0xed78, 0xf051, 0xf471, 0xf470, 0xf6f5, 0xa5d6, 0xcd75, 0xaf70, 0xb572, 0xded6, 0xe2e1, 0xbd4b, 0xea74, 0xf052, 0xf472, 0xa5d7, 0xaabb, 0xacd7, 0xcfdf, 0xacd8, 0xacd6, 0xacd5, 0xd2cc, 0xaf71, 0xaf72, 0xaf73, 0xb2b0, 0xd6a7, 0xb2af, 0xdab9, 0xb2b1, 0xb573, 0xded7, 0xb7f8, 0xb7f9, 0xbac9, 0xbaca, 0xbd4c, 0xbf64, 0xea75, 0xbf63, 0xed79, 0xc0fa, 0xf053, 0xf473, 0xa5d8, 0xa86e, 0xcd78, 0xcd77, 0xaabc, 0xcd76, 0xaabd, 0xcd79, 0xcfe5, 0xacdb, 0xacda, 0xcfe7, 0xcfe6, 0xacdf, 0xacde, 0xacd9, 0xcfe1, 0xcfe2, 0xcfe3, 0xace0, 0xcfe0, 0xacdc, 0xcfe4, 0xacdd, 0xd2cf, 0xd2d3, 0xd2d1, 0xd2d0, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2ce, 0xd2cd, 0xaf75, 0xaf76, 0xd2d7, 0xd2d2, 0xd6b0, 0xd2d8, 0xaf77, 0xaf74, 0xd6aa, 0xd6a9, 0xd6ab, 0xd6ac, 0xd6ae, 0xd6ad, 0xd6b2, 0xb2b5, 0xb2b2, 0xb2b6, 0xd6a8, 0xb2b7, 0xd6b1, 0xb2b4, 0xd6af, 0xb2b3, 0xdabc, 0xdabe, 0xdaba, 0xdabb, 0xdabf, 0xdac1, 0xdac2, 0xdabd, 0xdac0, 0xb574, 0xdedb, 0xdee0, 0xded8, 0xdedc, 0xdee1, 0xdedd, 0xb7fa, 0xb843, 0xb7fd, 0xded9, 0xdeda, 0xbace, 0xb846, 0xb7fe, 0xb844, 0xb7fc, 0xdedf, 0xb845, 0xdede, 0xb841, 0xb7fb, 0xb842, 0xdee2, 0xe2e6, 0xe2e8, 0xb840, 0xe2e3, 0xbacc, 0xe2e9, 0xbacd, 0xe2e7, 0xe2e2, 0xe2e5, 0xe2ea, 0xbacb, 0xe2e4, 0xbd4e, 0xe6bf, 0xe6be, 0xbd51, 0xbd4f, 0xe6bc, 0xbd4d, 0xe6bd, 0xbd50, 0xea7d, 0xeaa1, 0xea7e, 0xea76, 0xea7a, 0xea79, 0xea77, 0xbf66, 0xbf67, 0xbf65, 0xea78, 0xea7b, 0xea7c, 0xbf68, 0xc140, 0xeda3, 0xc0fc, 0xed7b, 0xc0fe, 0xc141, 0xc0fd, 0xeda2, 0xed7c, 0xc0fb, 0xeda1, 0xed7a, 0xed7e, 0xed7d, 0xf055, 0xc2a4, 0xc2a5, 0xc2a2, 0xc2a3, 0xf054, 0xf27b, 0xc3a9, 0xf279, 0xf27a, 0xf474, 0xf477, 0xf475, 0xf476, 0xf5e0, 0xc4ef, 0xf7eb, 0xf8b4, 0xc5f7, 0xf8f8, 0xf8f9, 0xc666, 0xa5d9, 0xace1, 0xdac3, 0xdee3, 0xa5da, 0xa86f, 0xaabe, 0xcfe8, 0xcfe9, 0xaf78, 0xdac4, 0xb575, 0xb847, 0xc142, 0xeda4, 0xf27c, 0xf478, 0xa5db, 0xcda1, 0xcd7a, 0xcd7c, 0xcd7e, 0xcd7d, 0xcd7b, 0xaabf, 0xace2, 0xcff2, 0xcfed, 0xcfea, 0xcff1, 0xace4, 0xace5, 0xcff0, 0xcfef, 0xcfee, 0xcfeb, 0xcfec, 0xcff3, 0xace3, 0xaf7c, 0xafa4, 0xafa3, 0xd2e1, 0xd2db, 0xd2d9, 0xafa1, 0xd6b9, 0xaf7a, 0xd2de, 0xd2e2, 0xd2e4, 0xd2e0, 0xd2da, 0xafa2, 0xd2df, 0xd2dd, 0xaf79, 0xd2e5, 0xafa5, 0xd2e3, 0xaf7d, 0xd2dc, 0xaf7e, 0xaf7b, 0xb2b9, 0xd6ba, 0xd6b3, 0xd6b5, 0xd6b7, 0xd6b8, 0xd6b6, 0xb2ba, 0xd6bb, 0xd6b4, 0xdac8, 0xb576, 0xdad0, 0xdac5, 0xdad1, 0xdac6, 0xdac7, 0xdacf, 0xdace, 0xdacb, 0xb2b8, 0xb577, 0xdac9, 0xdacc, 0xb578, 0xdacd, 0xdaca, 0xdeee, 0xdef2, 0xb84e, 0xe2f0, 0xb851, 0xdef0, 0xdeed, 0xdee8, 0xdeea, 0xdeeb, 0xdee4, 0xb84d, 0xb84c, 0xb848, 0xdee7, 0xb84f, 0xb850, 0xdee6, 0xdee9, 0xdef1, 0xb84a, 0xb84b, 0xdeef, 0xdee5, 0xe2f2, 0xbad0, 0xe2f4, 0xdeec, 0xe2f6, 0xbad4, 0xe2f7, 0xe2f3, 0xbad1, 0xe2ef, 0xbad3, 0xe2ec, 0xe2f1, 0xe2f5, 0xe2ee, 0xb849, 0xe2eb, 0xbad2, 0xe2ed, 0xbd54, 0xe6c1, 0xbd58, 0xbd56, 0xbacf, 0xe6c8, 0xe6c9, 0xbd53, 0xe6c7, 0xe6ca, 0xbd55, 0xbd52, 0xe6c3, 0xe6c0, 0xe6c5, 0xe6c2, 0xbd59, 0xe6c4, 0xe6c6, 0xbd57, 0xbf6a, 0xeaa8, 0xeaa2, 0xeaa6, 0xeaac, 0xeaad, 0xeaa9, 0xeaaa, 0xeaa7, 0xeaa4, 0xbf6c, 0xbf69, 0xeaa3, 0xeaa5, 0xbf6b, 0xeaab, 0xc146, 0xedaa, 0xeda5, 0xc145, 0xc143, 0xedac, 0xc144, 0xeda8, 0xeda9, 0xeda6, 0xedad, 0xf056, 0xc147, 0xeda7, 0xedae, 0xedab, 0xf05a, 0xf057, 0xc2a6, 0xf05b, 0xf05d, 0xf05c, 0xf058, 0xf059, 0xf2a3, 0xc3aa, 0xf27e, 0xf2a2, 0xf27d, 0xf2a4, 0xf2a1, 0xf47a, 0xf47d, 0xf479, 0xc471, 0xf47b, 0xf47c, 0xf47e, 0xc472, 0xc474, 0xc473, 0xf5e1, 0xf5e3, 0xf5e2, 0xf6f6, 0xf8b5, 0xf8fa, 0xa5dc, 0xcb72, 0xaac0, 0xcda3, 0xaac1, 0xaac2, 0xcda2, 0xcff8, 0xcff7, 0xace6, 0xace9, 0xace8, 0xace7, 0xcff4, 0xcff6, 0xcff5, 0xd2e8, 0xafa7, 0xd2ec, 0xd2eb, 0xd2ea, 0xd2e6, 0xafa6, 0xafaa, 0xafad, 0xafae, 0xd2e7, 0xd2e9, 0xafac, 0xafab, 0xafa9, 0xafa8, 0xd6c2, 0xd6c0, 0xd6bc, 0xb2bb, 0xd6bd, 0xb2bc, 0xd6be, 0xd6bf, 0xd6c1, 0xb2bd, 0xdad5, 0xdad4, 0xdad3, 0xdad2, 0xdef6, 0xb852, 0xdef3, 0xdef5, 0xb853, 0xb854, 0xdef4, 0xe341, 0xe2f9, 0xe2fa, 0xbad7, 0xbad5, 0xbad6, 0xe343, 0xe342, 0xe2fe, 0xe2fd, 0xe2fc, 0xe2fb, 0xe340, 0xe2f8, 0xe6cb, 0xe6d0, 0xe6ce, 0xe6cd, 0xe6cc, 0xe6cf, 0xeaae, 0xbf6d, 0xc148, 0xedb0, 0xc149, 0xedaf, 0xf05f, 0xf05e, 0xc2a7, 0xf2a5, 0xc3ab, 0xf4a1, 0xc5a1, 0xf6f7, 0xf8b7, 0xf8b6, 0xc9a8, 0xacea, 0xaceb, 0xd6c3, 0xb856, 0xa5dd, 0xa872, 0xa871, 0xa870, 0xcda4, 0xaac4, 0xaac3, 0xacee, 0xcffa, 0xcffd, 0xcffb, 0xacec, 0xaced, 0xcff9, 0xcffc, 0xafb5, 0xd2f3, 0xd2f5, 0xd2f4, 0xafb2, 0xd2ef, 0xafb0, 0xafaf, 0xafb3, 0xafb1, 0xafb4, 0xd2f2, 0xd2ed, 0xd2ee, 0xd2f1, 0xd2f0, 0xd6c6, 0xd6c7, 0xd6c5, 0xd6c4, 0xb2be, 0xb57d, 0xdad6, 0xdad8, 0xdada, 0xb57c, 0xb57a, 0xdad7, 0xb57b, 0xdad9, 0xb579, 0xdf41, 0xdef7, 0xdefa, 0xdefe, 0xb85a, 0xdefc, 0xdefb, 0xdef8, 0xdef9, 0xb858, 0xdf40, 0xb857, 0xb85c, 0xb85b, 0xb859, 0xdefd, 0xe349, 0xe348, 0xe344, 0xbad8, 0xe347, 0xe346, 0xbad9, 0xbd5e, 0xe6d2, 0xbd5f, 0xbd5b, 0xbd5d, 0xbd5a, 0xbd5c, 0xeaaf, 0xbf70, 0xeab1, 0xeab0, 0xe345, 0xbf72, 0xbf71, 0xbf6e, 0xbf6f, 0xedb5, 0xedb3, 0xc14a, 0xedb4, 0xedb6, 0xedb2, 0xedb1, 0xf060, 0xc2aa, 0xc2a8, 0xc2a9, 0xf2a6, 0xf2a7, 0xc3ad, 0xc3ac, 0xf4a3, 0xf4a4, 0xf4a2, 0xf6f8, 0xf6f9, 0xa5de, 0xca48, 0xa873, 0xcda5, 0xaac6, 0xaac5, 0xcda6, 0xd040, 0xacef, 0xcffe, 0xacf0, 0xafb6, 0xd2f8, 0xd2f6, 0xd2fc, 0xafb7, 0xd2f7, 0xd2fb, 0xd2f9, 0xd2fa, 0xd6c8, 0xd6ca, 0xb2bf, 0xd6c9, 0xb2c0, 0xb5a2, 0xb5a1, 0xb57e, 0xdadb, 0xdf44, 0xb85d, 0xb85e, 0xdf43, 0xdf42, 0xe34a, 0xbadb, 0xbada, 0xe34b, 0xe34c, 0xbd61, 0xbd60, 0xeab5, 0xe6d3, 0xe6d5, 0xe6d4, 0xeab4, 0xeab2, 0xeab6, 0xeab3, 0xbf73, 0xedb7, 0xc14b, 0xedb8, 0xedb9, 0xc2ab, 0xc2ac, 0xc475, 0xc5d1, 0xa5df, 0xd041, 0xd2fd, 0xafb8, 0xb3ba, 0xb3b9, 0xb5a4, 0xdadd, 0xb5a3, 0xdadc, 0xdf45, 0xbadc, 0xe34d, 0xbadd, 0xc476, 0xf4a5, 0xa6cb, 0xaac7, 0xcda7, 0xacf2, 0xacf1, 0xd042, 0xd043, 0xd340, 0xd342, 0xafb9, 0xd344, 0xd347, 0xd345, 0xd346, 0xd343, 0xd2fe, 0xafba, 0xd348, 0xd341, 0xd6d3, 0xb2c6, 0xd6dc, 0xb2c3, 0xd6d5, 0xb2c7, 0xb2c1, 0xd6d0, 0xd6dd, 0xd6d1, 0xd6ce, 0xb2c5, 0xb2c2, 0xd6d4, 0xd6d7, 0xb2c4, 0xd6d8, 0xb2c8, 0xd6d9, 0xd6cf, 0xd6d6, 0xd6da, 0xd6d2, 0xd6cd, 0xd6cb, 0xd6db, 0xdadf, 0xdae4, 0xdae0, 0xdae6, 0xb5a7, 0xd6cc, 0xdae1, 0xb5a5, 0xdade, 0xb5ac, 0xdae2, 0xb5ab, 0xdae3, 0xb5ad, 0xb5a8, 0xb5ae, 0xb5a9, 0xb5aa, 0xb5a6, 0xdae5, 0xb861, 0xdf50, 0xdf53, 0xdf47, 0xdf4c, 0xdf46, 0xb863, 0xdf4a, 0xdf48, 0xb862, 0xdf4f, 0xdf4e, 0xdf4b, 0xdf4d, 0xdf49, 0xbae1, 0xdf52, 0xb85f, 0xdf51, 0xe35d, 0xbae8, 0xe358, 0xbae7, 0xe34e, 0xe350, 0xbae0, 0xe355, 0xe354, 0xe357, 0xbae5, 0xe352, 0xe351, 0xbae4, 0xbadf, 0xe353, 0xbae2, 0xe359, 0xe35b, 0xe356, 0xe34f, 0xbae3, 0xbd69, 0xbade, 0xe35c, 0xe6d9, 0xbd62, 0xe6db, 0xbd63, 0xbd65, 0xe6de, 0xe6d6, 0xbae6, 0xe6dc, 0xe6d8, 0xb860, 0xbd68, 0xbd64, 0xbd66, 0xbd67, 0xbf76, 0xe6dd, 0xe6d7, 0xbd6a, 0xe6da, 0xeac0, 0xeabb, 0xeac5, 0xbf74, 0xeabd, 0xbf78, 0xeac3, 0xeaba, 0xeab7, 0xeac6, 0xc151, 0xbf79, 0xeac2, 0xeab8, 0xbf77, 0xeabc, 0xbf7b, 0xeab9, 0xeabe, 0xbf7a, 0xeac1, 0xeac4, 0xedcb, 0xedcc, 0xedbc, 0xedc3, 0xedc1, 0xc14f, 0xedc8, 0xeabf, 0xedbf, 0xedc9, 0xc14e, 0xedbe, 0xedbd, 0xedc7, 0xedc4, 0xedc6, 0xedba, 0xedca, 0xc14c, 0xedc5, 0xedce, 0xedc2, 0xc150, 0xc14d, 0xedc0, 0xedbb, 0xedcd, 0xbf75, 0xf063, 0xf061, 0xf067, 0xc2b0, 0xf065, 0xf064, 0xc2b2, 0xf06a, 0xc2b1, 0xf06b, 0xf068, 0xc2ae, 0xf069, 0xf062, 0xc2af, 0xc2ad, 0xf2ab, 0xf066, 0xf06c, 0xf2a8, 0xc3b2, 0xc3b0, 0xf2aa, 0xf2ac, 0xf2a9, 0xc3b1, 0xc3ae, 0xc3af, 0xc3b3, 0xc478, 0xf4aa, 0xf4a9, 0xf4a7, 0xf4a6, 0xf4a8, 0xc477, 0xc479, 0xc4f0, 0xf5e5, 0xf5e4, 0xf6fa, 0xf6fc, 0xf6fe, 0xf6fd, 0xf6fb, 0xc5a3, 0xc5a2, 0xc5d3, 0xc5d2, 0xc5d4, 0xf7ed, 0xf7ec, 0xf8fb, 0xf8b8, 0xf8fc, 0xc658, 0xc659, 0xf96d, 0xc67e, 0xa6cc, 0xcda8, 0xd045, 0xd046, 0xd044, 0xacf3, 0xd047, 0xd048, 0xd049, 0xd349, 0xd34f, 0xd34d, 0xafbb, 0xd34b, 0xd34c, 0xd34e, 0xd34a, 0xb2c9, 0xd6de, 0xb2cb, 0xd6e0, 0xb2ca, 0xd6df, 0xdae8, 0xb5af, 0xdaea, 0xdae7, 0xd6e1, 0xb5b0, 0xdae9, 0xdf56, 0xb864, 0xdf54, 0xb865, 0xdf55, 0xb866, 0xbae9, 0xe361, 0xe35e, 0xe360, 0xbaea, 0xbaeb, 0xe35f, 0xe6df, 0xe6e0, 0xbd6b, 0xe6e2, 0xe6e1, 0xa261, 0xeaca, 0xeacb, 0xeac7, 0xeac8, 0xbf7c, 0xbf7d, 0xeac9, 0xc157, 0xc153, 0xc158, 0xc154, 0xc156, 0xc152, 0xc155, 0xc2b3, 0xedcf, 0xf2ae, 0xf2ad, 0xf4ab, 0xc47a, 0xc47b, 0xf741, 0xf5e6, 0xf740, 0xf8fd, 0xf9a4, 0xa6cd, 0xa874, 0xcda9, 0xaac8, 0xacf6, 0xd04c, 0xacf4, 0xd04a, 0xacf9, 0xacf5, 0xacfa, 0xacf8, 0xd04b, 0xacf7, 0xafbf, 0xafbe, 0xd35a, 0xafc7, 0xd353, 0xd359, 0xafc3, 0xd352, 0xd358, 0xd356, 0xafc2, 0xafc4, 0xd355, 0xafbd, 0xd354, 0xafc8, 0xafc5, 0xafc9, 0xafc6, 0xd351, 0xd350, 0xd357, 0xafc0, 0xafbc, 0xafc1, 0xd6f0, 0xd6e9, 0xb5b5, 0xd6e8, 0xb2cf, 0xb2d6, 0xb2d3, 0xb2d9, 0xb2d8, 0xb2d4, 0xd6e2, 0xd6e5, 0xd6e4, 0xb2d0, 0xd6e6, 0xd6ef, 0xb2d1, 0xd6e3, 0xd6ec, 0xd6ed, 0xb2d2, 0xd6ea, 0xb2d7, 0xb2cd, 0xb2d5, 0xd6e7, 0xb2cc, 0xd6eb, 0xd6ee, 0xdafb, 0xdaf2, 0xb5b2, 0xdaf9, 0xdaf6, 0xdaee, 0xdaf7, 0xb5b4, 0xdaef, 0xdaeb, 0xb86c, 0xdaf4, 0xb5b1, 0xdafa, 0xb5b8, 0xb5ba, 0xdaed, 0xb5b9, 0xdaf0, 0xb5b3, 0xdaf8, 0xdaf1, 0xdaf5, 0xdaf3, 0xb5b6, 0xdaec, 0xb5bb, 0xb2ce, 0xb5b7, 0xb5bc, 0xb868, 0xdf5d, 0xdf5f, 0xdf61, 0xdf65, 0xdf5b, 0xdf59, 0xb86a, 0xdf60, 0xdf64, 0xdf5c, 0xdf58, 0xdf57, 0xdf62, 0xdf5a, 0xdf5e, 0xb86b, 0xb869, 0xdf66, 0xb867, 0xdf63, 0xe372, 0xbaee, 0xe36a, 0xbd78, 0xe374, 0xbaf1, 0xe378, 0xbaf7, 0xe365, 0xe375, 0xe362, 0xe377, 0xe366, 0xbafe, 0xbafb, 0xe376, 0xe370, 0xbaed, 0xbaf5, 0xbaf4, 0xbaf3, 0xbaf9, 0xe363, 0xbafa, 0xe371, 0xbaf6, 0xbaec, 0xe373, 0xbaef, 0xbaf0, 0xbaf8, 0xe368, 0xe367, 0xe364, 0xe36c, 0xe369, 0xe36d, 0xbafd, 0xe379, 0xbaf2, 0xe36e, 0xe36f, 0xe36b, 0xbafc, 0xe6e7, 0xbd70, 0xbd79, 0xbd75, 0xe6e4, 0xbd72, 0xbd76, 0xe6f0, 0xbd6c, 0xe6e8, 0xbd74, 0xe6eb, 0xe6e6, 0xbd73, 0xbd77, 0xe6e5, 0xbd71, 0xe6ef, 0xbd6e, 0xe6ee, 0xe6ed, 0xbd7a, 0xe572, 0xbd6d, 0xe6ec, 0xe6e3, 0xbd7b, 0xe6ea, 0xbd6f, 0xe6e9, 0xbfa2, 0xbfa7, 0xbf7e, 0xead8, 0xeacf, 0xeadb, 0xead3, 0xead9, 0xbfa8, 0xbfa1, 0xeacc, 0xead2, 0xeadc, 0xead5, 0xeada, 0xeace, 0xead6, 0xbfa3, 0xead4, 0xbfa6, 0xbfa5, 0xead0, 0xead1, 0xeacd, 0xead7, 0xbfa4, 0xeade, 0xeadd, 0xedda, 0xedd6, 0xc15f, 0xedd0, 0xc159, 0xc169, 0xeddc, 0xc161, 0xc15d, 0xedd3, 0xc164, 0xc167, 0xedde, 0xc15c, 0xedd5, 0xc165, 0xede0, 0xeddd, 0xedd1, 0xc160, 0xc15a, 0xc168, 0xedd8, 0xc163, 0xedd2, 0xc15e, 0xeddf, 0xc162, 0xc15b, 0xedd9, 0xc166, 0xedd7, 0xeddb, 0xf06e, 0xf074, 0xc2b9, 0xf077, 0xc2b4, 0xc2b5, 0xf06f, 0xf076, 0xf071, 0xc2ba, 0xc2b7, 0xf06d, 0xc2b6, 0xf073, 0xf075, 0xc2b8, 0xf072, 0xf070, 0xf2b8, 0xc3b7, 0xc3b8, 0xc3b4, 0xc3b5, 0xf2b4, 0xf2b2, 0xf2b6, 0xc3ba, 0xf2b7, 0xf2b0, 0xf2af, 0xf2b3, 0xf2b1, 0xc3b6, 0xf2b5, 0xf4ac, 0xc47e, 0xc47d, 0xf4ad, 0xf4af, 0xf4ae, 0xc4a1, 0xf5eb, 0xf5e8, 0xf5e9, 0xf5e7, 0xf5ea, 0xc4f2, 0xf5ec, 0xc4f1, 0xf742, 0xc5d5, 0xc5d7, 0xf7ee, 0xc5d6, 0xf8b9, 0xf940, 0xf942, 0xf8fe, 0xf941, 0xc66c, 0xa6ce, 0xacfb, 0xd26f, 0xafca, 0xb2da, 0xdafc, 0xdafd, 0xeadf, 0xc16a, 0xede1, 0xc2bb, 0xf2ba, 0xf2b9, 0xc4a2, 0xf5ed, 0xf743, 0xc5f8, 0xca49, 0xaac9, 0xa875, 0xd04d, 0xd360, 0xd35b, 0xd35f, 0xd35d, 0xafcb, 0xd35e, 0xd35c, 0xd6f1, 0xdafe, 0xdb40, 0xdf69, 0xdf6a, 0xb86e, 0xb86f, 0xdf68, 0xdf6b, 0xdf67, 0xb86d, 0xbb40, 0xb870, 0xe37a, 0xbd7c, 0xe6f1, 0xbd7d, 0xbfa9, 0xeae2, 0xeae0, 0xeae1, 0xede4, 0xede3, 0xede2, 0xf2bb, 0xc3b9, 0xf2bc, 0xf744, 0xc5f9, 0xf8ba, 0xa6cf, 0xaacb, 0xaaca, 0xd04f, 0xacfc, 0xd04e, 0xd362, 0xafcc, 0xd6f2, 0xd361, 0xb2dc, 0xd6f5, 0xd6f3, 0xd6f4, 0xb2db, 0xdb42, 0xdb43, 0xdb41, 0xb873, 0xdf6d, 0xdf6c, 0xdf6e, 0xb872, 0xb871, 0xe6f2, 0xe6f4, 0xbd7e, 0xe6f3, 0xeae3, 0xbfaa, 0xf079, 0xf078, 0xc3bb, 0xf2bd, 0xc3bd, 0xc3bc, 0xf4b0, 0xf5ee, 0xc4f3, 0xa6d0, 0xd050, 0xacfd, 0xd365, 0xafce, 0xd364, 0xd363, 0xafcd, 0xd6fb, 0xd6fd, 0xd6f6, 0xd6f7, 0xb2dd, 0xd6f8, 0xb2de, 0xd6fc, 0xd6f9, 0xd6fa, 0xb2df, 0xb5be, 0xb5bf, 0xdb44, 0xdf6f, 0xdf70, 0xe37e, 0xbb43, 0xbb41, 0xbb42, 0xe37b, 0xe37c, 0xe37d, 0xe6f9, 0xe6fa, 0xbda1, 0xe6f7, 0xe6f6, 0xe6f8, 0xe6f5, 0xbfad, 0xeae4, 0xbfab, 0xbfac, 0xede6, 0xc16b, 0xede5, 0xefa8, 0xf07a, 0xf07b, 0xc2bc, 0xc2bd, 0xc16c, 0xf2be, 0xf2bf, 0xf4b1, 0xc4a3, 0xa6d1, 0xa6d2, 0xacfe, 0xaacc, 0xafcf, 0xd051, 0xb5c0, 0xa6d3, 0xad41, 0xd052, 0xd053, 0xad40, 0xad42, 0xa6d4, 0xd054, 0xafd1, 0xd366, 0xafd3, 0xafd0, 0xafd2, 0xd741, 0xb2e0, 0xd740, 0xd6fe, 0xdf71, 0xe3a1, 0xbda2, 0xbfae, 0xeae6, 0xeae5, 0xede7, 0xf5ef, 0xa6d5, 0xcb73, 0xcdaa, 0xad43, 0xd055, 0xd368, 0xafd4, 0xd367, 0xafd5, 0xd743, 0xb2e2, 0xd742, 0xd744, 0xb2e1, 0xdb46, 0xdb47, 0xdb45, 0xb5c1, 0xb874, 0xb875, 0xbb45, 0xe3a3, 0xe3a2, 0xbb44, 0xe6fb, 0xe6fc, 0xeae7, 0xc170, 0xc16f, 0xc16d, 0xc16e, 0xc171, 0xf07c, 0xc2bf, 0xc2be, 0xf2c0, 0xf4b2, 0xc5a5, 0xc5a4, 0xa6d6, 0xd1fb, 0xb877, 0xb5c2, 0xb876, 0xbb46, 0xa6d7, 0xc9a9, 0xa6d8, 0xa6d9, 0xcdab, 0xcb76, 0xcb77, 0xa877, 0xcb74, 0xa876, 0xa879, 0xcb75, 0xa87b, 0xa87a, 0xcb78, 0xa878, 0xaad1, 0xaacf, 0xcdad, 0xaace, 0xaad3, 0xaad5, 0xaad2, 0xcdb0, 0xcdac, 0xaad6, 0xaad0, 0xa87c, 0xaad4, 0xcdaf, 0xcdae, 0xaacd, 0xd05b, 0xad47, 0xad48, 0xd05d, 0xd057, 0xd05a, 0xd063, 0xd061, 0xad49, 0xd067, 0xad4c, 0xd064, 0xd05c, 0xd059, 0xdb49, 0xd062, 0xad44, 0xd065, 0xd056, 0xd05f, 0xad46, 0xad4b, 0xd060, 0xad4f, 0xad4d, 0xd058, 0xad4a, 0xd05e, 0xad4e, 0xad45, 0xd066, 0xafda, 0xafe3, 0xafd8, 0xafd6, 0xd36a, 0xafde, 0xafdb, 0xd36c, 0xafdd, 0xd36b, 0xd369, 0xd36e, 0xafe2, 0xafe0, 0xdb48, 0xd36f, 0xd36d, 0xafd7, 0xafd9, 0xafdc, 0xafdf, 0xafe1, 0xd74e, 0xb2e4, 0xd745, 0xd747, 0xd748, 0xd750, 0xd74c, 0xd74a, 0xd74d, 0xd751, 0xb2e5, 0xb2e9, 0xd746, 0xd74f, 0xb2e7, 0xb2e6, 0xd74b, 0xd749, 0xb2e3, 0xb2e8, 0xb5c8, 0xdb51, 0xdb4f, 0xb5ca, 0xdb4a, 0xdfa1, 0xb5c9, 0xdb4e, 0xdb4b, 0xb5c5, 0xb5cb, 0xdb50, 0xb5c7, 0xdb4d, 0xbb47, 0xb5c6, 0xdb4c, 0xb5cc, 0xb5c4, 0xb5c3, 0xdf77, 0xdf75, 0xdf7b, 0xdf73, 0xdfa2, 0xdf78, 0xdf72, 0xb87b, 0xb8a3, 0xdf7d, 0xdf76, 0xb87e, 0xb87c, 0xdf7e, 0xb879, 0xb878, 0xdf79, 0xb87d, 0xb5cd, 0xdf7c, 0xdf74, 0xb87a, 0xb8a1, 0xb8a2, 0xbb4c, 0xbb48, 0xbb4d, 0xe3a6, 0xe3a5, 0xe3a7, 0xbb4a, 0xe3a4, 0xbb4b, 0xe3aa, 0xe3a9, 0xe3a8, 0xbb49, 0xe741, 0xe744, 0xbda8, 0xe743, 0xbda7, 0xbda3, 0xbda4, 0xbda5, 0xe740, 0xe6fe, 0xbda6, 0xe742, 0xe6fd, 0xeae9, 0xeaf3, 0xbfb1, 0xbfb0, 0xeaed, 0xeaef, 0xeaea, 0xeaee, 0xeae8, 0xeaf1, 0xbfaf, 0xeaf0, 0xeaec, 0xeaf2, 0xeaeb, 0xc174, 0xede8, 0xedee, 0xc178, 0xc17a, 0xc177, 0xc176, 0xc175, 0xc173, 0xede9, 0xedec, 0xc172, 0xeded, 0xc179, 0xedeb, 0xedea, 0xc2c0, 0xc2c1, 0xf0a1, 0xf07d, 0xf07e, 0xf2c2, 0xf2c1, 0xc3be, 0xf4b4, 0xc4a4, 0xf4b3, 0xf5f0, 0xf745, 0xc5a6, 0xf943, 0xf944, 0xc5d8, 0xa6da, 0xaad7, 0xdb52, 0xbb4e, 0xc17b, 0xedef, 0xa6db, 0xafe5, 0xafe4, 0xdb53, 0xeaf4, 0xa6dc, 0xad50, 0xdb54, 0xdb55, 0xdb56, 0xbb4f, 0xbfb2, 0xa6dd, 0xaad8, 0xd068, 0xafe6, 0xd370, 0xb2ea, 0xdb57, 0xb8a4, 0xbb50, 0xbfb3, 0xc17c, 0xc2c2, 0xf4b5, 0xa6de, 0xaad9, 0xafe7, 0xd752, 0xb5ce, 0xbb51, 0xe3ab, 0xe745, 0xa6df, 0xb5cf, 0xdfa3, 0xbb52, 0xa6e0, 0xcdb1, 0xd069, 0xad51, 0xd372, 0xafea, 0xafe8, 0xafe9, 0xafeb, 0xd371, 0xd757, 0xd754, 0xd756, 0xb2eb, 0xb2ed, 0xb2ec, 0xd753, 0xb2ee, 0xd755, 0xdb58, 0xdb59, 0xdb5a, 0xdfa6, 0xdfa7, 0xdfa5, 0xdfa8, 0xb8a5, 0xdfa4, 0xbb53, 0xe74a, 0xe746, 0xe749, 0xe74b, 0xe748, 0xe747, 0xeaf5, 0xeaf6, 0xeaf7, 0xbfb4, 0xbfb5, 0xedf1, 0xedf0, 0xedf2, 0xf0a3, 0xf0a2, 0xf2c4, 0xf2c5, 0xf2c3, 0xc4a5, 0xf4b6, 0xf4b7, 0xf746, 0xf7ef, 0xf8bb, 0xa6e1, 0xa87d, 0xc17d, 0xa6e2, 0xd758, 0xdb5b, 0xc641, 0xca4a, 0xca4b, 0xca4d, 0xa6e3, 0xca4e, 0xca4c, 0xcba2, 0xcba3, 0xcb7b, 0xcba1, 0xa8a1, 0xa8a2, 0xcb7c, 0xcb7a, 0xcb79, 0xcb7d, 0xa87e, 0xcb7e, 0xd06a, 0xcdb6, 0xaadc, 0xcdb5, 0xcdb7, 0xaadb, 0xcdbc, 0xaadf, 0xcdb2, 0xcdc0, 0xcdc6, 0xaae6, 0xcdc3, 0xaae3, 0xcdb9, 0xcdbf, 0xcdc1, 0xcdb4, 0xaae2, 0xaadd, 0xcdba, 0xaae4, 0xaae7, 0xaae1, 0xaada, 0xcdbe, 0xcdb8, 0xcdc5, 0xaae9, 0xaae5, 0xaae0, 0xcdbd, 0xafec, 0xcdbb, 0xaade, 0xaae8, 0xcdb3, 0xcdc2, 0xcdc4, 0xad62, 0xad5c, 0xad64, 0xad61, 0xd071, 0xd074, 0xad5d, 0xd06b, 0xad56, 0xad60, 0xad63, 0xad65, 0xd0a2, 0xd077, 0xad55, 0xd0a1, 0xad59, 0xad57, 0xad52, 0xd06f, 0xd07e, 0xd073, 0xd076, 0xd0a5, 0xad66, 0xd07d, 0xad5e, 0xd078, 0xd0a4, 0xd075, 0xd079, 0xd07c, 0xd06d, 0xd0a3, 0xd07b, 0xd06c, 0xd070, 0xad5f, 0xad5a, 0xad53, 0xad58, 0xad54, 0xad67, 0xd06e, 0xd3a5, 0xad5b, 0xd07a, 0xce41, 0xd3a8, 0xaffa, 0xd376, 0xd3a3, 0xd37d, 0xd3b2, 0xd3aa, 0xd37e, 0xd3a9, 0xd378, 0xd37c, 0xd3b5, 0xaffd, 0xd3ad, 0xd3a4, 0xafed, 0xd3b3, 0xd374, 0xd3ac, 0xaffc, 0xaff7, 0xd373, 0xaff5, 0xaff4, 0xaff9, 0xd3ab, 0xaff1, 0xaff8, 0xd072, 0xdb5c, 0xd3a6, 0xd37a, 0xaffb, 0xd37b, 0xd3a1, 0xaffe, 0xd375, 0xd3af, 0xd3ae, 0xd3b6, 0xaff3, 0xaff0, 0xd3b4, 0xd3b0, 0xd3a7, 0xd3a2, 0xaff6, 0xaff2, 0xd377, 0xafee, 0xd3b1, 0xafef, 0xd379, 0xd75e, 0xd760, 0xd765, 0xd779, 0xb2fc, 0xb2f2, 0xd75d, 0xb2fd, 0xb2fe, 0xd768, 0xd76f, 0xd775, 0xd762, 0xd769, 0xb340, 0xd777, 0xd772, 0xb2fa, 0xb2f8, 0xd76e, 0xd76a, 0xd75c, 0xb2ef, 0xd761, 0xd759, 0xb2f7, 0xb2f9, 0xd766, 0xd763, 0xb2f4, 0xd773, 0xb2f1, 0xd764, 0xd77a, 0xd76c, 0xd76b, 0xb2f0, 0xb2fb, 0xb2f3, 0xd75a, 0xd75f, 0xd770, 0xd776, 0xb341, 0xd75b, 0xd767, 0xd76d, 0xb2f6, 0xd778, 0xd771, 0xd774, 0xb2f5, 0xdb6c, 0xdb60, 0xb5d7, 0xdb7d, 0xdba7, 0xdbaa, 0xb5d5, 0xdb68, 0xdba3, 0xdb69, 0xdb77, 0xb5e2, 0xdb73, 0xb5df, 0xdb74, 0xdb5d, 0xdba4, 0xb5e8, 0xdba1, 0xdb75, 0xdbac, 0xdb70, 0xdfc8, 0xdbaf, 0xb5e6, 0xdb6e, 0xdb7a, 0xb5e9, 0xb5d4, 0xdb72, 0xdbad, 0xdb6b, 0xdb64, 0xdb6f, 0xdb63, 0xdb61, 0xb5d0, 0xdba5, 0xdb6a, 0xdba8, 0xdba9, 0xb5d8, 0xb5dd, 0xb5d9, 0xb5e1, 0xdb7e, 0xb5da, 0xdb76, 0xdb66, 0xb5d2, 0xdb5e, 0xdba2, 0xdbab, 0xdb65, 0xb5e0, 0xdbb0, 0xdb71, 0xdb6d, 0xb5d1, 0xb5e5, 0xdb7c, 0xb5e7, 0xdb78, 0xb5dc, 0xb5d6, 0xb5de, 0xb5d3, 0xb5e4, 0xdb79, 0xdb67, 0xdb7b, 0xdb62, 0xdba6, 0xdbae, 0xdb5f, 0xdfc7, 0xdfdd, 0xb855, 0xdfcc, 0xdfca, 0xdfb5, 0xb8a9, 0xdfc5, 0xdfd9, 0xdfc1, 0xb8b1, 0xdfd8, 0xdfbf, 0xb5e3, 0xdfcf, 0xdfc0, 0xdfd6, 0xb8b0, 0xb8a8, 0xdfaa, 0xdfb2, 0xdfcb, 0xdfc3, 0xdfdc, 0xdfc6, 0xb8b6, 0xdfd7, 0xb8ad, 0xdfc9, 0xdfd1, 0xdfb6, 0xdfd0, 0xdfe1, 0xdfb1, 0xdfd2, 0xdfdf, 0xdfab, 0xb5db, 0xdfb9, 0xdfb8, 0xb8af, 0xdfbc, 0xdfbe, 0xdfcd, 0xdfde, 0xb8b2, 0xb8b3, 0xdfb0, 0xb8ab, 0xdfb4, 0xdfda, 0xb8b4, 0xb8ac, 0xb8ae, 0xb8b5, 0xdfe0, 0xdfd3, 0xdfce, 0xdfbb, 0xdfba, 0xb8aa, 0xdfac, 0xb8a7, 0xdfc4, 0xdfad, 0xdfc2, 0xdfb7, 0xdfdb, 0xb8a6, 0xdfb3, 0xdfaf, 0xdfd5, 0xdfae, 0xbb60, 0xe3d3, 0xe3c2, 0xe3ac, 0xe3ca, 0xbb58, 0xe3bb, 0xe3c5, 0xbb5b, 0xe3be, 0xbb59, 0xe3af, 0xe3cd, 0xe3ae, 0xe3c1, 0xe3ad, 0xe3bf, 0xe3c8, 0xe3c6, 0xe3ba, 0xe3b5, 0xe3b3, 0xe3b4, 0xe3c7, 0xe3d2, 0xe3bc, 0xbb5a, 0xe3b7, 0xe3cb, 0xbb5d, 0xe3b6, 0xe3b0, 0xe3c0, 0xbb61, 0xbb55, 0xbb5e, 0xe3b8, 0xe3b2, 0xbb57, 0xdfd4, 0xbb56, 0xe3c3, 0xbb54, 0xbb63, 0xbb5c, 0xe3c4, 0xe3b9, 0xe3b1, 0xe3cc, 0xe3bd, 0xbb62, 0xe3d0, 0xbb5f, 0xe3cf, 0xe3c9, 0xe3ce, 0xe3d1, 0xe773, 0xe774, 0xe767, 0xe766, 0xe762, 0xbdb4, 0xbdac, 0xe776, 0xe775, 0xdfa9, 0xe75f, 0xe763, 0xe75d, 0xe770, 0xe761, 0xe777, 0xe75a, 0xe758, 0xe764, 0xe76e, 0xe769, 0xbdb6, 0xe74f, 0xe76d, 0xbdb7, 0xdfbd, 0xe75b, 0xe752, 0xe755, 0xe77b, 0xe75c, 0xe753, 0xe751, 0xe74e, 0xbdb0, 0xe765, 0xbdaf, 0xbdb3, 0xe760, 0xe768, 0xbda9, 0xe778, 0xe77c, 0xbdab, 0xe757, 0xe76b, 0xe76f, 0xe754, 0xe779, 0xbdb2, 0xbdb1, 0xe74c, 0xbdb5, 0xe772, 0xe756, 0xe76a, 0xe750, 0xe75e, 0xe759, 0xbdad, 0xbdae, 0xe76c, 0xe77d, 0xe77a, 0xe771, 0xe74d, 0xbdaa, 0xeb49, 0xeb40, 0xeb43, 0xbfbb, 0xeb45, 0xeaf9, 0xeb41, 0xeb47, 0xbfb8, 0xbfbc, 0xbfb6, 0xeafb, 0xeb4c, 0xeb46, 0xeafc, 0xeb55, 0xeb4f, 0xeaf8, 0xee46, 0xeafe, 0xbfb7, 0xeb4a, 0xeb54, 0xbfbf, 0xeb51, 0xeafd, 0xeb44, 0xeb48, 0xeb42, 0xeb56, 0xeb53, 0xeb50, 0xbfb9, 0xbfba, 0xbfbe, 0xeafa, 0xeb57, 0xbfbd, 0xeb4d, 0xeb4b, 0xeb4e, 0xee53, 0xee40, 0xee45, 0xee52, 0xee44, 0xedfb, 0xee41, 0xc1a2, 0xedf4, 0xee4d, 0xee4f, 0xedf3, 0xc1a1, 0xee51, 0xee49, 0xc1a8, 0xee50, 0xee42, 0xc1aa, 0xedf9, 0xeb52, 0xee4a, 0xee47, 0xedf5, 0xee55, 0xc1a4, 0xc1a5, 0xedf7, 0xee48, 0xee54, 0xee4b, 0xedfd, 0xc1a7, 0xc1a3, 0xee4c, 0xedfe, 0xee56, 0xedf8, 0xee43, 0xee4e, 0xedfa, 0xedfc, 0xc2cb, 0xedf6, 0xc1a9, 0xc2c4, 0xc17e, 0xc1a6, 0xc2c8, 0xf0b3, 0xf0a9, 0xf0a4, 0xf0aa, 0xf0b4, 0xf0b8, 0xf0b7, 0xc2ca, 0xc2c9, 0xf0ab, 0xf0b9, 0xf0ae, 0xf0a6, 0xf0a8, 0xf0a7, 0xf0ad, 0xf0b2, 0xf0a5, 0xf0ac, 0xf0b1, 0xc2c7, 0xf0af, 0xc2c5, 0xf0b0, 0xc2c3, 0xc2c6, 0xf2d5, 0xf0b5, 0xc3c2, 0xf2cd, 0xf2d1, 0xf2c9, 0xf2cc, 0xf2d4, 0xc3c0, 0xf2d9, 0xf2d2, 0xf2ca, 0xf2da, 0xf2d3, 0xc3c3, 0xc3c4, 0xf2d7, 0xf2cb, 0xc3bf, 0xc3c1, 0xf2c6, 0xf2ce, 0xf2c8, 0xf2d8, 0xf2d6, 0xf2c7, 0xf2cf, 0xf4be, 0xc3c5, 0xf2d0, 0xc4a7, 0xc4a9, 0xc4a6, 0xf4c3, 0xf4bb, 0xf4b9, 0xf4bd, 0xf4ba, 0xf4bf, 0xf4c1, 0xc4aa, 0xc4ac, 0xf4c0, 0xc4ad, 0xc4ab, 0xf4c2, 0xc4a8, 0xc4f4, 0xf5f1, 0xf5f7, 0xc4f6, 0xf4bc, 0xf5f6, 0xf5fd, 0xf5f4, 0xf5fb, 0xf5fa, 0xf4b8, 0xf5f5, 0xf0b6, 0xf5fe, 0xf5f3, 0xf5f8, 0xf5fc, 0xf5f2, 0xf74a, 0xc4f5, 0xf5f9, 0xf7f4, 0xf74b, 0xf749, 0xf747, 0xf748, 0xf74c, 0xc5d9, 0xf7f2, 0xf7f0, 0xf7f5, 0xf7f3, 0xf7f6, 0xc5da, 0xf7f1, 0xf8bc, 0xf945, 0xf946, 0xf947, 0xf9c7, 0xf9bd, 0xca4f, 0xaaea, 0xad68, 0xd3b8, 0xd3b7, 0xb040, 0xb342, 0xd77c, 0xd77b, 0xb5ea, 0xb8b8, 0xb8b7, 0xb8b9, 0xe3d4, 0xe77e, 0xeb58, 0xeb5a, 0xeb59, 0xc1ab, 0xee57, 0xf0ba, 0xf9a5, 0xa6e4, 0xcdc9, 0xcdca, 0xcdc8, 0xcdc7, 0xaaeb, 0xd0a9, 0xd0a7, 0xd0a6, 0xad69, 0xad6b, 0xad6a, 0xd0a8, 0xd3c4, 0xd3c1, 0xd3bf, 0xb041, 0xd3c2, 0xb046, 0xd3bc, 0xd3cb, 0xd3cd, 0xd3bd, 0xb043, 0xd3ce, 0xd3c9, 0xd3bb, 0xd3c0, 0xd3ca, 0xd3c6, 0xd3c3, 0xb048, 0xd3cc, 0xd3be, 0xd3c7, 0xd3b9, 0xb047, 0xb044, 0xd3c5, 0xd3c8, 0xd3ba, 0xb045, 0xb042, 0xb34c, 0xd7a5, 0xb34b, 0xd7a8, 0xd7ab, 0xb348, 0xb346, 0xd77e, 0xd7a9, 0xd7a7, 0xd7a4, 0xd7ac, 0xd7ad, 0xd7af, 0xd7b0, 0xd77d, 0xb345, 0xd7a2, 0xd7a1, 0xd7ae, 0xb347, 0xd7a3, 0xb349, 0xb344, 0xd7a6, 0xb34d, 0xb34a, 0xd7aa, 0xb5f1, 0xdbbf, 0xdbb4, 0xb5ee, 0xdfe7, 0xdbbd, 0xdbb1, 0xb5ec, 0xdbb6, 0xb5ef, 0xdbba, 0xdbb8, 0xb5f2, 0xb5eb, 0xdbb2, 0xdbb5, 0xb5f0, 0xdbb3, 0xdbbe, 0xdbbc, 0xdbb7, 0xdbb9, 0xdbbb, 0xb5ed, 0xdfe8, 0xdfee, 0xdfe4, 0xdfea, 0xb8ba, 0xdfe6, 0xb8c0, 0xb8bf, 0xb8be, 0xdfed, 0xb8c1, 0xb8c2, 0xdfe3, 0xdff0, 0xb8c3, 0xb8bd, 0xb8bc, 0xdfec, 0xb8c4, 0xdfe2, 0xdfe5, 0xdfef, 0xdfeb, 0xe3f4, 0xe3e9, 0xb8bb, 0xbb6a, 0xe3dd, 0xe3f2, 0xe3de, 0xbb65, 0xe3db, 0xe3e4, 0xe3dc, 0xbb67, 0xe3d6, 0xe3f1, 0xbb68, 0xe3ee, 0xe3ef, 0xe3d7, 0xbb6d, 0xe3e6, 0xe3e0, 0xe3e7, 0xe3da, 0xe3f3, 0xe3eb, 0xe3e5, 0xe3d5, 0xbb69, 0xe3ec, 0xbb6c, 0xe3f0, 0xe3ea, 0xbb66, 0xe3e8, 0xe3e2, 0xbb64, 0xe3d9, 0xe3e1, 0xe3ed, 0xe3df, 0xe3e3, 0xbdc1, 0xdfe9, 0xe7b2, 0xe7bb, 0xe7b1, 0xe7ad, 0xe7aa, 0xbdc2, 0xe7a8, 0xbb6b, 0xe7a1, 0xbdc0, 0xe7a7, 0xbdbf, 0xe7ac, 0xe7a9, 0xe7b9, 0xe7b4, 0xe7ae, 0xe7b3, 0xbdbb, 0xe7ab, 0xe7be, 0xe7a2, 0xe7a3, 0xe7ba, 0xbdbc, 0xe7bf, 0xbdbe, 0xe7c0, 0xe7b0, 0xe3d8, 0xe7b6, 0xe7af, 0xe7b8, 0xe7b5, 0xe7a6, 0xbdb9, 0xe7bd, 0xbdba, 0xe7a4, 0xbdbd, 0xeb64, 0xe7b7, 0xe7bc, 0xeb61, 0xbdb8, 0xbfc0, 0xeb6b, 0xeb67, 0xeb65, 0xeb60, 0xeb6f, 0xbfc4, 0xeb5c, 0xeb68, 0xeb69, 0xeb5f, 0xeb5e, 0xeb6c, 0xeb62, 0xeb5d, 0xeb63, 0xeb6e, 0xeb5b, 0xeb6d, 0xeb6a, 0xbfc2, 0xbfc1, 0xbfc3, 0xeb66, 0xf0cb, 0xee59, 0xc1b1, 0xee5d, 0xee5a, 0xee61, 0xee67, 0xee5c, 0xee70, 0xc1ae, 0xee6a, 0xee5f, 0xee6b, 0xee66, 0xee6d, 0xee5e, 0xc1b3, 0xc1b2, 0xee60, 0xee6e, 0xee58, 0xee6c, 0xc1ac, 0xee64, 0xee63, 0xee68, 0xee5b, 0xc1b0, 0xc1b4, 0xee62, 0xee69, 0xc1b5, 0xee65, 0xc1ad, 0xc1af, 0xf0c7, 0xf0c5, 0xf0cc, 0xf0c9, 0xf0cd, 0xf0be, 0xf0c6, 0xf0d1, 0xee6f, 0xf0c2, 0xc2cf, 0xe7a5, 0xf0bd, 0xf0ca, 0xf0c4, 0xf0c1, 0xf0bc, 0xf0bb, 0xf0d0, 0xf0c0, 0xf0bf, 0xc2cd, 0xf0c8, 0xc2cc, 0xc2ce, 0xf0c3, 0xf0cf, 0xf2de, 0xf2df, 0xc3c9, 0xf2dc, 0xc3c6, 0xf2e4, 0xc3ca, 0xf2e6, 0xf2db, 0xf0ce, 0xf2e8, 0xf2dd, 0xc3c7, 0xf2e3, 0xf2e5, 0xf2e0, 0xf2e7, 0xf2e2, 0xf2e1, 0xc3c8, 0xf4c5, 0xf4c6, 0xf4c8, 0xc4ae, 0xc4af, 0xf4c9, 0xf4c7, 0xf4c4, 0xf642, 0xf645, 0xf641, 0xc4fa, 0xf643, 0xc4f9, 0xc4f8, 0xc4f7, 0xf644, 0xf751, 0xf74f, 0xf74e, 0xf640, 0xf750, 0xf646, 0xf74d, 0xf7f9, 0xf7d7, 0xf7f7, 0xc5db, 0xf7f8, 0xf7fa, 0xf8bf, 0xc5fa, 0xf8be, 0xf8bd, 0xc5fb, 0xc65a, 0xf96e, 0xf9a7, 0xf9a6, 0xf9a8, 0xa6e5, 0xd0aa, 0xd3cf, 0xd3d0, 0xdbc0, 0xf647, 0xf8c0, 0xa6e6, 0xad6c, 0xd0ab, 0xd7b1, 0xb34e, 0xdbc2, 0xdbc1, 0xb5f3, 0xb8c5, 0xe7c1, 0xbdc3, 0xbdc4, 0xbfc5, 0xc5fc, 0xa6e7, 0xd0ac, 0xaaed, 0xd0ae, 0xd0ad, 0xad6d, 0xd3d1, 0xd3d8, 0xb049, 0xd3d6, 0xd3d4, 0xd3db, 0xd3d2, 0xd3d3, 0xb04a, 0xb04e, 0xd3dc, 0xb04d, 0xd3da, 0xd3d7, 0xd3d5, 0xb04b, 0xb04c, 0xd3d9, 0xb350, 0xd7b2, 0xb355, 0xd7c2, 0xb354, 0xd7c4, 0xd7b8, 0xb352, 0xd7c3, 0xd7b3, 0xb353, 0xd7bf, 0xd7bb, 0xd7bd, 0xd7b7, 0xd7be, 0xb34f, 0xd7ba, 0xd7b9, 0xd7b5, 0xd7c0, 0xd7bc, 0xd7b4, 0xd7b6, 0xb351, 0xd7c1, 0xb5f6, 0xdbcd, 0xdbc9, 0xdbcb, 0xdbc6, 0xdbc5, 0xdbc3, 0xdbca, 0xdbcc, 0xdbc8, 0xdbc7, 0xb5f4, 0xb5f5, 0xdbcf, 0xb8cd, 0xdff2, 0xdff8, 0xdff3, 0xdff4, 0xdff9, 0xb8cf, 0xb8c7, 0xb8ce, 0xdff1, 0xdbc4, 0xb8ca, 0xb8c8, 0xdff7, 0xdff6, 0xb8c9, 0xb8cb, 0xdff5, 0xb8c6, 0xb8cc, 0xe3f6, 0xbb74, 0xe442, 0xe441, 0xe3fb, 0xbb76, 0xe440, 0xe3f7, 0xe3f8, 0xbb6e, 0xbb70, 0xe3fd, 0xe3f5, 0xbb72, 0xbb71, 0xe3f9, 0xe3fe, 0xe3fc, 0xbb73, 0xe3fa, 0xdbce, 0xbb6f, 0xe7c2, 0xe7c9, 0xbdc6, 0xe7cd, 0xbdca, 0xe7c5, 0xe7c3, 0xe7cc, 0xbdc5, 0xe7cb, 0xbdc7, 0xbdc8, 0xe7c4, 0xbdc9, 0xe7ca, 0xe7c6, 0xe7c7, 0xe7c8, 0xbb75, 0xeb70, 0xeb7c, 0xbfca, 0xeb77, 0xeb79, 0xbfc8, 0xeb71, 0xeb75, 0xeb78, 0xbfc6, 0xbfc9, 0xeb7b, 0xeb73, 0xeb74, 0xeb7a, 0xeb72, 0xeb76, 0xbfc7, 0xee72, 0xee71, 0xc1b7, 0xee77, 0xc1b9, 0xc1b6, 0xee73, 0xc1ba, 0xee74, 0xee75, 0xee78, 0xc1b8, 0xf0d6, 0xf0d9, 0xf0d3, 0xf0d5, 0xf0d4, 0xf0d7, 0xf0d8, 0xee76, 0xf0d2, 0xc3cd, 0xf2ec, 0xf2ef, 0xf2f1, 0xf2ea, 0xf2eb, 0xf2ee, 0xf2f0, 0xc3ce, 0xc3cc, 0xc3cb, 0xf2ed, 0xf2e9, 0xf4ca, 0xc4b0, 0xf4cb, 0xf649, 0xc4fb, 0xf64b, 0xc4fc, 0xf648, 0xf64a, 0xc5a8, 0xf752, 0xc5a7, 0xf7fd, 0xf7fc, 0xf7fb, 0xf948, 0xf949, 0xf94b, 0xf94a, 0xca50, 0xa6e8, 0xad6e, 0xd7c5, 0xb5f7, 0xdffa, 0xc2d0, 0xf2f2, 0xa8a3, 0xb357, 0xb356, 0xdbd0, 0xb5f8, 0xdbd2, 0xdbd1, 0xdffb, 0xb8d0, 0xe443, 0xe446, 0xe445, 0xe444, 0xe7ce, 0xe7d0, 0xe7cf, 0xbfcc, 0xbfcb, 0xc1bb, 0xee79, 0xee7b, 0xee7a, 0xc2d1, 0xf2f4, 0xf2f3, 0xf4cc, 0xc4b1, 0xc4fd, 0xf754, 0xf753, 0xc65b, 0xa8a4, 0xd0af, 0xad6f, 0xd7c8, 0xd7c6, 0xd7c7, 0xdbd4, 0xdbd5, 0xe043, 0xdbd3, 0xdffc, 0xe041, 0xe040, 0xe042, 0xb8d1, 0xdffe, 0xdffd, 0xe044, 0xe449, 0xe447, 0xe448, 0xe7d3, 0xe7d1, 0xe7d2, 0xeb7d, 0xee7c, 0xee7d, 0xc2d2, 0xf2f5, 0xf4cd, 0xc4b2, 0xf64c, 0xf755, 0xc5a9, 0xf7fe, 0xf94c, 0xa8a5, 0xad71, 0xad72, 0xd0b0, 0xd0b1, 0xad70, 0xb054, 0xb052, 0xb051, 0xb058, 0xb050, 0xb059, 0xd3dd, 0xb056, 0xb053, 0xb057, 0xb055, 0xb04f, 0xb35f, 0xb359, 0xd7cc, 0xb35e, 0xb360, 0xb35a, 0xb35b, 0xd7ca, 0xb358, 0xd7cb, 0xb35d, 0xd7c9, 0xb35c, 0xb644, 0xb646, 0xdbd8, 0xb645, 0xb5f9, 0xb5fd, 0xb8e4, 0xe049, 0xdbda, 0xb5fe, 0xdbdd, 0xdbde, 0xb643, 0xdbe0, 0xdbe2, 0xdbe3, 0xdbd7, 0xdbd6, 0xdbe4, 0xb642, 0xdbe1, 0xdbdf, 0xb640, 0xb5fb, 0xb647, 0xdbdb, 0xdbdc, 0xdbd9, 0xb641, 0xb5fc, 0xb5fa, 0xe048, 0xb8df, 0xb8da, 0xb8d5, 0xb8e5, 0xb8d6, 0xb8d2, 0xb8e1, 0xb8de, 0xb8e0, 0xb8d7, 0xb8dc, 0xb8d3, 0xb8d4, 0xe050, 0xe04d, 0xe045, 0xe04a, 0xb8e2, 0xe051, 0xb8e3, 0xb8d9, 0xe047, 0xe04f, 0xe04b, 0xe04e, 0xe04c, 0xb8dd, 0xe046, 0xb8d8, 0xe44c, 0xbb78, 0xbb7b, 0xe44e, 0xbba5, 0xe44d, 0xbb7d, 0xbdcf, 0xe44f, 0xbba4, 0xe44b, 0xbba6, 0xbb79, 0xb8db, 0xbb7c, 0xbb7a, 0xbb7e, 0xbba2, 0xbb77, 0xbba7, 0xbba3, 0xbba1, 0xe44a, 0xbdd6, 0xbdd2, 0xbdd9, 0xe7d6, 0xbdda, 0xe7e2, 0xe7db, 0xbdcb, 0xe7e3, 0xe7dd, 0xbdd5, 0xe7de, 0xbdd4, 0xe7e1, 0xbdce, 0xe7df, 0xe7d5, 0xbdcd, 0xebaa, 0xbdd3, 0xbdd0, 0xbdd8, 0xe7d4, 0xe7d8, 0xbdcc, 0xe7d7, 0xe7d9, 0xe7da, 0xbdd7, 0xe7dc, 0xe7e0, 0xe7e4, 0xbddb, 0xbfd2, 0xeba5, 0xebab, 0xeba8, 0xeb7e, 0xebac, 0xeba1, 0xeba7, 0xbfcd, 0xbfd3, 0xebad, 0xbfcf, 0xbfd9, 0xbfd4, 0xebaf, 0xeba9, 0xbfd0, 0xeba2, 0xbfda, 0xeba3, 0xeba4, 0xbfdb, 0xbfd8, 0xbdd1, 0xbfce, 0xebb0, 0xbfdc, 0xbfd5, 0xebae, 0xbfd1, 0xbfd6, 0xbfd7, 0xc1c3, 0xeea4, 0xeead, 0xeeaa, 0xeeac, 0xc1c0, 0xeea5, 0xeeab, 0xc1bc, 0xeea7, 0xc1c4, 0xeea3, 0xeea8, 0xeeaf, 0xeba6, 0xeea9, 0xeea2, 0xc1bd, 0xeea1, 0xc1be, 0xeeb0, 0xc1bf, 0xeeae, 0xc1c2, 0xee7e, 0xc1c1, 0xeea6, 0xf0dc, 0xf0ea, 0xf0e5, 0xf0e7, 0xf0db, 0xc2d3, 0xf0da, 0xc2d6, 0xc2d5, 0xf0e9, 0xf0e1, 0xf0de, 0xf0e4, 0xf0dd, 0xf0df, 0xf0e8, 0xf0e6, 0xc2d4, 0xf0ed, 0xf0eb, 0xf0e2, 0xf0ec, 0xf0e3, 0xf2f9, 0xc3cf, 0xf341, 0xf64f, 0xc3d6, 0xf0e0, 0xf2f7, 0xc3d2, 0xf2f8, 0xf2fd, 0xc3d4, 0xc3d5, 0xf2f6, 0xf340, 0xf342, 0xf2fa, 0xf2fc, 0xf2fe, 0xf2fb, 0xf343, 0xc3d1, 0xc3d7, 0xc3d3, 0xc3d0, 0xf4d0, 0xc4b7, 0xf4ce, 0xf4d2, 0xf4d3, 0xc4b5, 0xf4d4, 0xf4d1, 0xf4cf, 0xc4b8, 0xc4b4, 0xf4d5, 0xc4b6, 0xc4b3, 0xc4fe, 0xc540, 0xf64e, 0xf64d, 0xf650, 0xf651, 0xc541, 0xf756, 0xf75b, 0xc5aa, 0xf758, 0xf757, 0xf75a, 0xf759, 0xf843, 0xc5dc, 0xf842, 0xf840, 0xf841, 0xc5fe, 0xc5fd, 0xf8c1, 0xf8c2, 0xc640, 0xf94d, 0xf94e, 0xc667, 0xc66d, 0xf9a9, 0xf9c8, 0xa8a6, 0xd7cd, 0xd7ce, 0xe052, 0xe450, 0xe7e5, 0xc1c6, 0xc1c5, 0xf0ee, 0xf344, 0xf844, 0xa8a7, 0xd3de, 0xb05a, 0xb361, 0xe054, 0xe053, 0xbddc, 0xe7e6, 0xbddd, 0xeeb1, 0xc2d7, 0xc676, 0xa8a8, 0xcdcb, 0xd3df, 0xb362, 0xd7cf, 0xd7d0, 0xdbe5, 0xb648, 0xb8e6, 0xe056, 0xe055, 0xe057, 0xe451, 0xe452, 0xbba8, 0xbfdd, 0xbdde, 0xbfde, 0xeeb5, 0xeeb2, 0xeeb4, 0xeeb3, 0xc1c7, 0xf0ef, 0xf346, 0xf345, 0xcba4, 0xb05c, 0xb05b, 0xd3e0, 0xd7d1, 0xdbe7, 0xdbe6, 0xb649, 0xe059, 0xe05a, 0xe058, 0xb8e8, 0xb8e7, 0xbbaa, 0xbba9, 0xe7e7, 0xebb3, 0xebb1, 0xebb2, 0xbfdf, 0xeeb7, 0xeeb6, 0xf0f2, 0xf0f1, 0xf0f0, 0xf347, 0xf9aa, 0xa8a9, 0xad73, 0xad74, 0xb05d, 0xb05e, 0xd3e2, 0xd3e1, 0xd7d2, 0xb368, 0xb366, 0xb363, 0xb367, 0xb365, 0xb364, 0xb64a, 0xdbea, 0xb8ed, 0xb64c, 0xb651, 0xdbec, 0xb653, 0xb652, 0xb655, 0xdbeb, 0xdbe8, 0xb64f, 0xb64b, 0xb64d, 0xdbe9, 0xb654, 0xb650, 0xb64e, 0xb8ef, 0xb8ee, 0xb8ec, 0xb8f0, 0xb8ea, 0xb8eb, 0xb8e9, 0xe05b, 0xe454, 0xbbac, 0xbbad, 0xbbab, 0xe453, 0xe455, 0xe7ea, 0xe7ec, 0xbde7, 0xe7ed, 0xbde0, 0xe7e9, 0xbddf, 0xbde9, 0xbde5, 0xbde6, 0xbde2, 0xe7e8, 0xbde1, 0xe7ee, 0xe7eb, 0xbde8, 0xbde3, 0xbde4, 0xebb5, 0xebb7, 0xebb6, 0xebb8, 0xbfe0, 0xebb4, 0xc1cb, 0xeeb8, 0xc1c8, 0xc1cc, 0xc1ca, 0xc1c9, 0xf0f3, 0xf0f6, 0xf0f5, 0xf0f4, 0xc2d8, 0xf348, 0xf349, 0xc3d8, 0xf34a, 0xc3d9, 0xc4ba, 0xc4b9, 0xf652, 0xc542, 0xf653, 0xf75c, 0xc5ab, 0xc5ac, 0xf845, 0xc642, 0xa8aa, 0xb36a, 0xb369, 0xe05c, 0xe05d, 0xbbae, 0xebb9, 0xbdea, 0xebba, 0xeeb9, 0xa8ab, 0xd0b2, 0xad76, 0xad75, 0xd3e3, 0xb05f, 0xd3e4, 0xd7d5, 0xd7d4, 0xd7d3, 0xdbee, 0xb658, 0xdbed, 0xb657, 0xdbef, 0xb656, 0xe05f, 0xe062, 0xe060, 0xe061, 0xe065, 0xe05e, 0xe066, 0xe063, 0xe064, 0xbbb0, 0xe456, 0xbbaf, 0xe7f2, 0xe7f0, 0xbdeb, 0xe7ef, 0xe7f1, 0xbdec, 0xebbb, 0xebbc, 0xc1cd, 0xf34c, 0xf34e, 0xf34b, 0xf34d, 0xf4d6, 0xf654, 0xf96f, 0xa8ac, 0xad77, 0xd3e5, 0xd3e7, 0xd3e6, 0xd7d8, 0xb36c, 0xd7d6, 0xb36b, 0xd7d9, 0xd7da, 0xd7d7, 0xdbfb, 0xb660, 0xdbf3, 0xdbf9, 0xb65b, 0xb65e, 0xdbf2, 0xb659, 0xdbf6, 0xe06c, 0xb65d, 0xdbf1, 0xdbf7, 0xdbf4, 0xdbfa, 0xdbf0, 0xdbf8, 0xb65c, 0xb65f, 0xdbf5, 0xb65a, 0xb8f2, 0xe068, 0xb8f1, 0xe06f, 0xe06e, 0xb8f8, 0xb8f9, 0xe070, 0xb8f3, 0xe06d, 0xb8f7, 0xe072, 0xe069, 0xe06b, 0xb8f4, 0xe067, 0xe06a, 0xe071, 0xb8f5, 0xe073, 0xb8f6, 0xbbb1, 0xe45b, 0xe461, 0xe459, 0xe462, 0xe458, 0xe45d, 0xe463, 0xe460, 0xe45f, 0xe45e, 0xe457, 0xe45c, 0xe45a, 0xbdf1, 0xbdee, 0xe7fb, 0xe841, 0xe843, 0xe840, 0xe7f8, 0xe7fa, 0xe845, 0xe842, 0xe7fc, 0xe846, 0xe7f9, 0xe844, 0xbdef, 0xbdf5, 0xbdf3, 0xe7f3, 0xbdf4, 0xbdf0, 0xe7f4, 0xe7f6, 0xe7f5, 0xe7fd, 0xe7fe, 0xbdf2, 0xbded, 0xe7f7, 0xebc6, 0xbfe2, 0xebbd, 0xbfe3, 0xbfe6, 0xebc2, 0xebbf, 0xbfe5, 0xebc3, 0xebc4, 0xebbe, 0xebc7, 0xebc0, 0xebc5, 0xbfe4, 0xbfe1, 0xebc1, 0xeebf, 0xc1d0, 0xc1ce, 0xc1d1, 0xc1cf, 0xeebe, 0xeebb, 0xeeba, 0xeebd, 0xeebc, 0xf145, 0xc2de, 0xf0fb, 0xf0fa, 0xc2d9, 0xf141, 0xf140, 0xf0f7, 0xf143, 0xf0fc, 0xc2dd, 0xf0f9, 0xf142, 0xf0f8, 0xc2da, 0xc2dc, 0xf0fd, 0xc2db, 0xf0fe, 0xf144, 0xf352, 0xc3de, 0xf34f, 0xf353, 0xc3db, 0xf351, 0xc3e0, 0xc3dd, 0xf350, 0xc3df, 0xf354, 0xc3da, 0xc4bc, 0xc4be, 0xf4d9, 0xc4bd, 0xf4d7, 0xc3dc, 0xf4d8, 0xc4bb, 0xc543, 0xc545, 0xf656, 0xc544, 0xf655, 0xf761, 0xc5ad, 0xf760, 0xc5ae, 0xf75e, 0xf75d, 0xf762, 0xf763, 0xf846, 0xf75f, 0xf8c6, 0xf8c3, 0xf8c4, 0xf8c5, 0xc65c, 0xf951, 0xf950, 0xf94f, 0xf970, 0xf9be, 0xf9ab, 0xc66e, 0xa8ad, 0xb060, 0xb8fa, 0xbdf6, 0xebc8, 0xc2df, 0xf355, 0xf9ac, 0xa8ae, 0xaaee, 0xad79, 0xad78, 0xb063, 0xd3e8, 0xb061, 0xd3e9, 0xb062, 0xd7df, 0xd7db, 0xb36d, 0xd7de, 0xd7dd, 0xd7dc, 0xb36e, 0xd7e0, 0xd7e1, 0xdc43, 0xdc41, 0xdc45, 0xdc46, 0xdc4c, 0xdc48, 0xdc4a, 0xdc42, 0xdbfc, 0xdc49, 0xdc4b, 0xdc44, 0xdc47, 0xdbfd, 0xb662, 0xdc40, 0xdbfe, 0xb661, 0xb663, 0xb8fd, 0xe075, 0xe077, 0xe076, 0xe07b, 0xb8fb, 0xe078, 0xe074, 0xe079, 0xe07a, 0xb8fc, 0xb8fe, 0xe07c, 0xe467, 0xe466, 0xe464, 0xe465, 0xbbb3, 0xbbb5, 0xbbb2, 0xbbb4, 0xe84d, 0xe84e, 0xe849, 0xe84a, 0xbdf8, 0xbdfd, 0xbdf7, 0xbdfe, 0xbdf9, 0xe84b, 0xe84c, 0xe848, 0xbe40, 0xbdfb, 0xbdfa, 0xbdfc, 0xe847, 0xebca, 0xbfe8, 0xebcc, 0xbfea, 0xebcf, 0xebcb, 0xebc9, 0xebce, 0xbfe9, 0xebcd, 0xbfe7, 0xc1d3, 0xc1d6, 0xeec1, 0xc1d4, 0xeec0, 0xc1d2, 0xc1d5, 0xf146, 0xf147, 0xf148, 0xc2e0, 0xf149, 0xc2e1, 0xc3e2, 0xf358, 0xf359, 0xf357, 0xf356, 0xf35a, 0xc3e1, 0xf4dd, 0xf4db, 0xf4dc, 0xf4de, 0xf4da, 0xf4df, 0xf658, 0xf659, 0xf657, 0xc546, 0xf764, 0xc5af, 0xf765, 0xf848, 0xf847, 0xa8af, 0xb664, 0xb940, 0xbbb6, 0xbfec, 0xbfeb, 0xc3e3, 0xc47c, 0xc547, 0xa8b0, 0xb064, 0xb941, 0xf35b, 0xcba6, 0xa8b1, 0xa8b4, 0xa8b3, 0xa8b2, 0xcba5, 0xcdcd, 0xcdcf, 0xaaef, 0xaaf1, 0xcdcc, 0xcdce, 0xaaf0, 0xcdd1, 0xcdd0, 0xcdd2, 0xd0b6, 0xd0b4, 0xad7c, 0xd0b3, 0xada3, 0xad7e, 0xad7b, 0xada4, 0xad7d, 0xada2, 0xada1, 0xd0b5, 0xad7a, 0xb06a, 0xd3eb, 0xd3f1, 0xb067, 0xb06e, 0xb069, 0xd3ee, 0xd3f0, 0xb06c, 0xd3ea, 0xd3ed, 0xb068, 0xb065, 0xd3ec, 0xb06b, 0xd3ef, 0xb06d, 0xb066, 0xd7e3, 0xd7e6, 0xb370, 0xb37a, 0xb376, 0xd7e4, 0xb37e, 0xb377, 0xb37c, 0xb372, 0xb36f, 0xb371, 0xb37d, 0xd7e5, 0xb375, 0xb378, 0xb374, 0xb379, 0xd7e7, 0xb37b, 0xb373, 0xd7e2, 0xdc4d, 0xb665, 0xdc4f, 0xb667, 0xb669, 0xdc4e, 0xb666, 0xb66a, 0xb668, 0xb947, 0xe0a3, 0xb94f, 0xe07e, 0xb950, 0xb945, 0xe0a1, 0xb94a, 0xe0a2, 0xb943, 0xb942, 0xb94d, 0xb94c, 0xb94b, 0xb949, 0xb94e, 0xe07d, 0xb944, 0xb946, 0xb948, 0xbbb8, 0xbbbb, 0xbbbf, 0xbbb9, 0xbbbe, 0xbbbc, 0xbbb7, 0xbbbd, 0xbbba, 0xe852, 0xbe43, 0xbe41, 0xe853, 0xbe44, 0xbe42, 0xe851, 0xe850, 0xbff0, 0xe84f, 0xbfee, 0xbfed, 0xebd0, 0xbe45, 0xbfef, 0xebd1, 0xbff2, 0xebd2, 0xbff1, 0xc1d8, 0xeec3, 0xc1d7, 0xc1dc, 0xc1da, 0xc1db, 0xc2e3, 0xc1d9, 0xeec2, 0xebd3, 0xc2e2, 0xc2e4, 0xc3e4, 0xc3e5, 0xf4e0, 0xc5de, 0xc5dd, 0xa8b6, 0xca55, 0xb06f, 0xca52, 0xca53, 0xca51, 0xca54, 0xcbaa, 0xcba7, 0xcbac, 0xcba8, 0xa8b7, 0xa8ba, 0xcba9, 0xa8b9, 0xcbab, 0xa8b8, 0xcdd5, 0xcdd7, 0xaaf4, 0xcdd3, 0xcdd6, 0xcdd4, 0xaaf2, 0xaaf5, 0xaaf3, 0xd0b8, 0xd0bc, 0xd0b9, 0xada7, 0xada8, 0xd0bb, 0xd0bd, 0xd0bf, 0xada5, 0xd0be, 0xada6, 0xd7ee, 0xd0ba, 0xd3f2, 0xd3fb, 0xd3f9, 0xd3f4, 0xd3f5, 0xd3fa, 0xd3fc, 0xb071, 0xd3f7, 0xd3f3, 0xb070, 0xb072, 0xd3f6, 0xd3fd, 0xd3f8, 0xb3a1, 0xd7f1, 0xd7e9, 0xd7ef, 0xd7f0, 0xb3a2, 0xd7e8, 0xd7ea, 0xd0b7, 0xd7ec, 0xd7ed, 0xd7eb, 0xb66c, 0xdc56, 0xebd4, 0xdc57, 0xdc54, 0xb3a3, 0xb66e, 0xdc53, 0xdc59, 0xdc58, 0xb66b, 0xdc5c, 0xdc52, 0xdc5b, 0xdc50, 0xdc5a, 0xdc55, 0xb66d, 0xe0aa, 0xe0a5, 0xe0ab, 0xe0a6, 0xe0a4, 0xe0a7, 0xb951, 0xe0a9, 0xe0a8, 0xb952, 0xbbc1, 0xbbc0, 0xe46e, 0xe471, 0xe469, 0xe46d, 0xbbc2, 0xe46c, 0xe46a, 0xe470, 0xe46b, 0xe468, 0xe46f, 0xe859, 0xbe48, 0xf14a, 0xe856, 0xe857, 0xe855, 0xdc51, 0xbe47, 0xe85a, 0xe854, 0xbe46, 0xbe49, 0xe858, 0xebd5, 0xbff3, 0xebd6, 0xebd7, 0xeec4, 0xc1dd, 0xf14b, 0xf14c, 0xf14d, 0xf35d, 0xf35c, 0xf4e2, 0xf4e1, 0xf65b, 0xf65c, 0xf65a, 0xf766, 0xc5b0, 0xa8bb, 0xadaa, 0xada9, 0xb075, 0xb074, 0xd440, 0xd441, 0xd3fe, 0xb073, 0xd7f5, 0xd7f6, 0xd7f2, 0xb3a4, 0xd7f3, 0xd7f4, 0xdc5f, 0xdc61, 0xdc5d, 0xdc60, 0xb66f, 0xdc5e, 0xb670, 0xdd73, 0xb955, 0xb954, 0xb953, 0xe0ac, 0xe0ad, 0xe473, 0xe475, 0xbbc6, 0xbbc3, 0xbbc5, 0xbbc4, 0xe474, 0xe472, 0xe861, 0xe85e, 0xe85f, 0xbe4d, 0xe860, 0xe85b, 0xe85c, 0xbe4a, 0xbe4b, 0xe85d, 0xbe4c, 0xebdb, 0xebdc, 0xebd9, 0xebda, 0xbff4, 0xebd8, 0xeec8, 0xeec5, 0xeec7, 0xc1e0, 0xeecb, 0xc1df, 0xeec9, 0xeecc, 0xeeca, 0xeec6, 0xc1de, 0xf14f, 0xf150, 0xf14e, 0xf152, 0xc2e5, 0xc2e6, 0xf35f, 0xc3e7, 0xf151, 0xf35e, 0xc3e6, 0xf4e5, 0xf4e6, 0xc4bf, 0xf4e4, 0xf4e3, 0xf65d, 0xc548, 0xf849, 0xf8c8, 0xf8c7, 0xc643, 0xc65d, 0xf8c9, 0xf971, 0xc66f, 0xa8bc, 0xaaf6, 0xb956, 0xc4c0, 0xa8bd, 0xadab, 0xb3a5, 0xb671, 0xc2e7, 0xaaf7, 0xd0c1, 0xd0c0, 0xd442, 0xb078, 0xb076, 0xb07a, 0xd444, 0xb079, 0xb077, 0xd443, 0xb3a8, 0xd7fc, 0xb3a7, 0xb3a9, 0xd842, 0xb3ab, 0xd7fe, 0xd840, 0xd7f7, 0xb3aa, 0xd843, 0xd7f9, 0xd7fa, 0xd7f8, 0xb3a6, 0xd841, 0xd7fb, 0xd7fd, 0xdc6d, 0xdc6c, 0xdc6a, 0xdc62, 0xdc71, 0xdc65, 0xdc6f, 0xdc76, 0xdc6e, 0xb679, 0xb675, 0xdc63, 0xdc69, 0xb677, 0xdc68, 0xb678, 0xb67a, 0xdc6b, 0xb672, 0xb673, 0xdc77, 0xdc75, 0xdc74, 0xdc66, 0xdc72, 0xb676, 0xb674, 0xdc73, 0xdc64, 0xdc67, 0xdc70, 0xe4ba, 0xe0b7, 0xe0b0, 0xe0c3, 0xe0cc, 0xe0b3, 0xb961, 0xe0c0, 0xb957, 0xb959, 0xb965, 0xe0b1, 0xb95a, 0xb95c, 0xb966, 0xb95b, 0xb964, 0xe0b9, 0xe0ae, 0xb962, 0xe0b8, 0xb95e, 0xe0ca, 0xb963, 0xe0c8, 0xe0bc, 0xe0c6, 0xb960, 0xe0af, 0xe0c9, 0xe0c4, 0xe0cb, 0xb958, 0xb967, 0xb95d, 0xe0b5, 0xe0bd, 0xe0c1, 0xe0c5, 0xb95f, 0xe0b4, 0xe0b2, 0xe0be, 0xe0bb, 0xe0ba, 0xe0bf, 0xe0c2, 0xe0c7, 0xe478, 0xbbc7, 0xe4a4, 0xe47a, 0xbbcc, 0xbbd0, 0xe4ad, 0xe4b5, 0xe4a6, 0xbbc8, 0xe4aa, 0xe0b6, 0xbbc9, 0xe4b1, 0xe4b6, 0xe4ae, 0xe4b0, 0xe4b9, 0xe4b2, 0xe47e, 0xe4a9, 0xbbd1, 0xbbcd, 0xe47c, 0xe4ab, 0xbbcb, 0xe4a5, 0xbbca, 0xe4b3, 0xe4a2, 0xe479, 0xbbce, 0xe4b8, 0xe47b, 0xe4af, 0xe4ac, 0xe4a7, 0xe477, 0xe476, 0xe4a1, 0xe4b4, 0xbbcf, 0xe4b7, 0xe47d, 0xe4a3, 0xbe52, 0xbe5a, 0xbe55, 0xe8a4, 0xe8a1, 0xe867, 0xbe50, 0xbe4f, 0xbe56, 0xe865, 0xbe54, 0xe871, 0xe863, 0xe864, 0xbe4e, 0xe8a3, 0xbe58, 0xe874, 0xe879, 0xe873, 0xebee, 0xe86f, 0xe877, 0xe875, 0xe868, 0xe862, 0xe87d, 0xbe57, 0xe87e, 0xe878, 0xe86d, 0xe86b, 0xe866, 0xe86e, 0xe87b, 0xe86a, 0xe87a, 0xe8a2, 0xbe53, 0xe876, 0xe87c, 0xe872, 0xe86c, 0xbe51, 0xe4a8, 0xe870, 0xbe59, 0xe869, 0xebf4, 0xbff7, 0xebf3, 0xebf0, 0xec44, 0xbffb, 0xec41, 0xebf8, 0xec43, 0xebe9, 0xebf6, 0xbffd, 0xebe1, 0xebdf, 0xec42, 0xec40, 0xebfe, 0xebed, 0xebec, 0xebe2, 0xc040, 0xebe8, 0xebf2, 0xebfd, 0xc043, 0xec45, 0xc1e8, 0xc045, 0xbffe, 0xebe6, 0xebef, 0xebde, 0xebe0, 0xbff5, 0xc042, 0xbffa, 0xebe7, 0xebf7, 0xebf1, 0xc041, 0xebdd, 0xc1e3, 0xebf9, 0xebfc, 0xbffc, 0xebeb, 0xc044, 0xbff9, 0xbff8, 0xebf5, 0xebfb, 0xbff6, 0xebe4, 0xebfa, 0xebe5, 0xebea, 0xeed2, 0xeed7, 0xc1e5, 0xc1e7, 0xeedd, 0xc1e1, 0xeeec, 0xeee3, 0xeed8, 0xeed9, 0xeee2, 0xc1ee, 0xeee1, 0xeed1, 0xeee0, 0xeed4, 0xeeed, 0xc1ed, 0xc1eb, 0xeed5, 0xeee8, 0xeeda, 0xeee7, 0xeee9, 0xeed0, 0xc1e6, 0xeeea, 0xeede, 0xc1ea, 0xeedb, 0xc1ec, 0xeee4, 0xc1e4, 0xeed6, 0xeee5, 0xeedf, 0xebe3, 0xeee6, 0xeed3, 0xc1e9, 0xeeeb, 0xc1e2, 0xeece, 0xf160, 0xf159, 0xc2e9, 0xf154, 0xf163, 0xf15b, 0xeedc, 0xf165, 0xf155, 0xc2e8, 0xf15f, 0xc2ea, 0xc2f2, 0xc2f0, 0xf161, 0xc2f1, 0xf157, 0xf158, 0xf15d, 0xf162, 0xeecd, 0xc2eb, 0xf16a, 0xf167, 0xf16b, 0xf15e, 0xf15a, 0xf168, 0xf36a, 0xf15c, 0xc2ee, 0xc2ed, 0xeecf, 0xc2ef, 0xf164, 0xf166, 0xc2ec, 0xf169, 0xf153, 0xf156, 0xf373, 0xf363, 0xc3eb, 0xf371, 0xf361, 0xc3ec, 0xf36c, 0xf368, 0xc3f1, 0xf372, 0xf362, 0xf365, 0xc3e9, 0xf374, 0xf36d, 0xf370, 0xc3ef, 0xc3f4, 0xc3f2, 0xf369, 0xf364, 0xc3ed, 0xc3ee, 0xf360, 0xc3ea, 0xc3e8, 0xc3f0, 0xf36f, 0xc3f3, 0xf36b, 0xf375, 0xc3f5, 0xf367, 0xf36e, 0xf4f3, 0xf542, 0xf4f5, 0xf4fc, 0xf366, 0xf4fa, 0xf4e9, 0xf540, 0xc4c3, 0xf4ed, 0xf4fe, 0xf4f4, 0xc4c2, 0xf544, 0xf4f6, 0xf4fb, 0xf4fd, 0xf4e7, 0xf541, 0xf4f2, 0xf4f7, 0xf4eb, 0xf4ef, 0xf543, 0xf4f9, 0xf4e8, 0xf4ec, 0xf4ee, 0xf4f8, 0xc4c1, 0xf4f1, 0xf4ea, 0xf4f0, 0xf661, 0xf666, 0xc54f, 0xf668, 0xc549, 0xf664, 0xf66a, 0xc54e, 0xc54a, 0xc54b, 0xf660, 0xf667, 0xc54d, 0xf665, 0xc54c, 0xf65f, 0xf663, 0xf662, 0xf65e, 0xf669, 0xc5b1, 0xf76d, 0xf770, 0xf76c, 0xf76e, 0xf76f, 0xf769, 0xf76a, 0xf767, 0xf76b, 0xf768, 0xc5b2, 0xc5b3, 0xf84b, 0xf84d, 0xf84c, 0xf84e, 0xc5e0, 0xf84a, 0xc5df, 0xc5e1, 0xf8cb, 0xf8cc, 0xc644, 0xf8ca, 0xf953, 0xf952, 0xf954, 0xc65f, 0xf955, 0xc65e, 0xf956, 0xf972, 0xf975, 0xf974, 0xc668, 0xf973, 0xc672, 0xc670, 0xc671, 0xc677, 0xf9c0, 0xf9c1, 0xf9bf, 0xf9c9, 0xaaf8, 0xd844, 0xdc78, 0xe8a5, 0xf376, 0xaaf9, 0xadac, 0xb07b, 0xd845, 0xd846, 0xb3ac, 0xb67d, 0xdc7a, 0xdc79, 0xb6a3, 0xb67c, 0xdc7b, 0xb67e, 0xb6a2, 0xb6a1, 0xb67b, 0xb968, 0xe0d0, 0xe0ce, 0xe0cf, 0xe0cd, 0xbbd2, 0xbbd5, 0xbbd7, 0xbbd6, 0xbbd3, 0xbbd4, 0xe8a7, 0xe8a6, 0xbe5b, 0xe8a8, 0xe8a9, 0xbe5c, 0xec4d, 0xec4b, 0xeef3, 0xec49, 0xec4a, 0xc046, 0xec46, 0xec4e, 0xec48, 0xec4c, 0xeeef, 0xeef1, 0xeef2, 0xc1f3, 0xeeee, 0xc1f2, 0xeef0, 0xc1ef, 0xc1f0, 0xc1f1, 0xec47, 0xc2f5, 0xf16e, 0xf16c, 0xf16d, 0xc2f3, 0xc2f6, 0xc2f4, 0xf377, 0xf378, 0xc3f6, 0xf545, 0xf547, 0xf546, 0xc4c4, 0xc550, 0xf66d, 0xf66c, 0xf66b, 0xaafa, 0xc9aa, 0xca58, 0xa6e9, 0xca56, 0xca59, 0xca57, 0xcbae, 0xa8c1, 0xa8c2, 0xcbb0, 0xa8bf, 0xcbaf, 0xcbad, 0xa8c0, 0xa8be, 0xcdd8, 0xcddb, 0xaafd, 0xcdda, 0xcdd9, 0xaafc, 0xaafb, 0xab40, 0xcddc, 0xaafe, 0xd0c6, 0xadae, 0xadaf, 0xadb0, 0xd0c7, 0xd0c3, 0xadad, 0xd0c4, 0xd0c5, 0xd0c2, 0xb0a4, 0xb0a1, 0xd445, 0xb0a2, 0xb0a5, 0xd446, 0xb07e, 0xb07c, 0xb07d, 0xb0a3, 0xb3ad, 0xd849, 0xb3b5, 0xd848, 0xd84b, 0xb3b1, 0xd84a, 0xb6ab, 0xb3af, 0xb3b2, 0xb3ae, 0xb3b3, 0xb3b4, 0xb3b0, 0xd847, 0xb6a7, 0xdc7d, 0xdca3, 0xdca2, 0xb6ac, 0xb6a8, 0xb6a9, 0xdc7c, 0xdc7e, 0xdca1, 0xb6a4, 0xb6a6, 0xb6aa, 0xb6a5, 0xe0d3, 0xe0d1, 0xe0d2, 0xb96a, 0xb96b, 0xe0d4, 0xb969, 0xbbd8, 0xbbda, 0xbbd9, 0xe4bb, 0xe4bc, 0xe8ab, 0xe8aa, 0xc047, 0xc048, 0xec4f, 0xc049, 0xeef6, 0xeef4, 0xeef5, 0xc1f4, 0xf16f, 0xc3f7, 0xc1f5, 0xab41, 0xb0a6, 0xd447, 0xd84c, 0xb3b6, 0xb6ad, 0xdca4, 0xdca6, 0xb6af, 0xb6ae, 0xb6b0, 0xb6b1, 0xdca5, 0xb96e, 0xb96f, 0xb96d, 0xbbdb, 0xb96c, 0xe0d5, 0xbbdc, 0xe8ac, 0xec50, 0xc04a, 0xc1f6, 0xf170, 0xf174, 0xc2f9, 0xf171, 0xc2fa, 0xc2f8, 0xf175, 0xc2fb, 0xf173, 0xf379, 0xc2f7, 0xc3f8, 0xf8cd, 0xab42, 0xb3b8, 0xb3b7, 0xb6b2, 0xdca8, 0xdca7, 0xb6b3, 0xe0d9, 0xb973, 0xb970, 0xe0d8, 0xb972, 0xe0d6, 0xb971, 0xe0d7, 0xe4bd, 0xbbdd, 0xe8af, 0xbe5d, 0xe8ad, 0xbe5e, 0xbe5f, 0xe8ae, 0xbe60, 0xec51, 0xc04e, 0xc04b, 0xc050, 0xec53, 0xc04c, 0xec52, 0xc04f, 0xc04d, 0xeef9, 0xeefb, 0xc1f7, 0xeefa, 0xc1f8, 0xeef8, 0xeef7, 0xf177, 0xf176, 0xc2fc, 0xf178, 0xf37e, 0xc3fa, 0xf37d, 0xf37a, 0xc3f9, 0xf37b, 0xf37c, 0xf548, 0xf549, 0xc4c5, 0xc553, 0xf66e, 0xc551, 0xc552, 0xf66f, 0xc5b4, 0xc5b5, 0xf771, 0xc645, 0xf8cf, 0xc647, 0xf8ce, 0xf8d0, 0xc646, 0xf957, 0xf9ad, 0xab43, 0xb974, 0xe4be, 0xe8b0, 0xc051, 0xc052, 0xab44, 0xbe61, 0xc3fb, 0xadb1, 0xc053, 0xc5e2, 0xadb2, 0xd84d, 0xdca9, 0xdcab, 0xdcaa, 0xe0dd, 0xe0da, 0xb975, 0xb976, 0xe0db, 0xe0dc, 0xe4c0, 0xe4c5, 0xbbde, 0xe4bf, 0xe4c1, 0xe4c8, 0xe4c3, 0xe4c7, 0xe4c4, 0xe4c2, 0xe4c6, 0xbbdf, 0xe8b3, 0xe8b1, 0xbe63, 0xbe62, 0xe8b2, 0xbe64, 0xec56, 0xec55, 0xc054, 0xec54, 0xeefc, 0xeefe, 0xef41, 0xef40, 0xc1f9, 0xeefd, 0xf1a1, 0xc2fd, 0xf17d, 0xf1a2, 0xc2fe, 0xf17b, 0xf17e, 0xf17c, 0xf179, 0xc340, 0xf17a, 0xf3a1, 0xf3a3, 0xf3a2, 0xf54a, 0xf54b, 0xf670, 0xc5b7, 0xc5b6, 0xf84f, 0xf850, 0xc648, 0xf8d1, 0xc669, 0xadb3, 0xb6b4, 0xe4ca, 0xe4c9, 0xe8b5, 0xe8b4, 0xc1fa, 0xef43, 0xef42, 0xf1a5, 0xf1a3, 0xf1a6, 0xf1a4, 0xc3fc, 0xf3a4, 0xf3a5, 0xf3a6, 0xf671, 0xf772, 0xf8d2, 0xadb4, 0xec57, 0xef44, 0xadb5, 0xbbe0, 0xec58, 0xc341, 0xf1a7, 0xc3fd, 0xf54c, 0xf54d, 0xc554, 0xf851, 0xadb6, 0xb3bb, 0xb3bc, 0xd84e, 0xb6b5, 0xb6b6, 0xdcac, 0xb6b7, 0xb97a, 0xb97c, 0xe0df, 0xe0e0, 0xe0de, 0xb977, 0xb978, 0xb97b, 0xb979, 0xe4cb, 0xbbe1, 0xbbe2, 0xe8bc, 0xbe67, 0xe8b7, 0xe8b6, 0xe8bb, 0xbe65, 0xc05b, 0xe8b8, 0xe8bd, 0xe8ba, 0xe8b9, 0xbe66, 0xc059, 0xec5a, 0xc055, 0xec5b, 0xec59, 0xc058, 0xc056, 0xc05a, 0xc057, 0xef45, 0xef4a, 0xef46, 0xef49, 0xc1fb, 0xedd4, 0xef48, 0xef47, 0xc344, 0xc342, 0xc345, 0xc343, 0xf1a8, 0xf1a9, 0xf1aa, 0xc346, 0xf3aa, 0xc440, 0xf3a8, 0xc441, 0xf3a7, 0xf3a9, 0xc3fe, 0xf551, 0xf54e, 0xf54f, 0xf550, 0xf672, 0xc556, 0xc555, 0xf774, 0xf773, 0xc5b8, 0xc5e3, 0xc649, 0xc660, 0xf958, 0xf9ae, 0xf9af, 0xadb7, 0xdcad, 0xe0e1, 0xe4cc, 0xe4cd, 0xbbe3, 0xbbe4, 0xe8be, 0xbe68, 0xc1fc, 0xf1ab, 0xc347, 0xf3ad, 0xc442, 0xf3ac, 0xf3ae, 0xf3ab, 0xf675, 0xf552, 0xf553, 0xc4c6, 0xf674, 0xf673, 0xf775, 0xf9b0, 0xadb8, 0xadb9, 0xb0a7, 0xd448, 0xd84f, 0xb6b8, 0xb6bb, 0xb6b9, 0xdcae, 0xb6bd, 0xb6ba, 0xb6bc, 0xb97e, 0xe0e2, 0xe0e3, 0xe8c0, 0xb97d, 0xb9a1, 0xb9a2, 0xe4cf, 0xe4ce, 0xbbe5, 0xbbe6, 0xe4d0, 0xe8bf, 0xbbe8, 0xbe69, 0xbbe7, 0xc05c, 0xe8c1, 0xbe6b, 0xbe6a, 0xe8c2, 0xe8c5, 0xe8c3, 0xe8c4, 0xbe6c, 0xc061, 0xc05f, 0xc05e, 0xec5d, 0xc060, 0xec5c, 0xef4b, 0xec5e, 0xc05d, 0xec5f, 0xef4e, 0xef4c, 0xef4d, 0xef52, 0xc34b, 0xef51, 0xef54, 0xef53, 0xef50, 0xef4f, 0xc1fd, 0xf1ae, 0xf1ad, 0xc34a, 0xc348, 0xc349, 0xf1ac, 0xf3b1, 0xc443, 0xf3b0, 0xf3af, 0xc444, 0xf558, 0xf557, 0xf555, 0xf554, 0xc4c8, 0xc4c7, 0xf559, 0xf776, 0xc5b9, 0xf677, 0xc557, 0xf676, 0xf556, 0xf777, 0xc5e4, 0xc661, 0xf959, 0xf9b1, 0xadba, 0xd850, 0xef55, 0xadbb, 0xe4d2, 0xe4d1, 0xec60, 0xef57, 0xef56, 0xc34c, 0xf3b2, 0xf3b3, 0xc4c9, 0xf9b2, 0xb0a8, 0xb6bf, 0xb6be, 0xe0e4, 0xe0e6, 0xb9a4, 0xe0e5, 0xb9a3, 0xb9a5, 0xe0e7, 0xe4d4, 0xe4d6, 0xe4d5, 0xe4d8, 0xbbe9, 0xe4d7, 0xe4d3, 0xe4d9, 0xe8cc, 0xe8cf, 0xe8d1, 0xe8c7, 0xe8cb, 0xe8c8, 0xbe6e, 0xbe71, 0xbe73, 0xe8c9, 0xe8ca, 0xbe72, 0xe8cd, 0xe8d0, 0xe8ce, 0xbe74, 0xbe70, 0xe8c6, 0xbe6d, 0xbe6f, 0xc063, 0xec66, 0xec64, 0xec63, 0xec69, 0xec68, 0xec67, 0xec62, 0xc062, 0xec61, 0xec65, 0xc064, 0xef5a, 0xef5e, 0xef5b, 0xef5d, 0xef5c, 0xef59, 0xef5f, 0xef62, 0xef60, 0xef61, 0xc240, 0xc1fe, 0xef58, 0xef63, 0xf1b3, 0xf1b6, 0xf1b8, 0xf1b7, 0xf1b1, 0xf1b5, 0xf1b0, 0xf1b2, 0xc34d, 0xf1af, 0xf1b4, 0xf3c0, 0xf3b5, 0xc445, 0xc446, 0xf3b4, 0xf3b9, 0xf3bf, 0xf3b7, 0xf3be, 0xf3bb, 0xf3ba, 0xf3bd, 0xf3b8, 0xf3b6, 0xf3bc, 0xf560, 0xf55e, 0xc4ca, 0xf55d, 0xf563, 0xf561, 0xc4cb, 0xf55c, 0xf55a, 0xf55b, 0xc4cd, 0xf55f, 0xc4cc, 0xf562, 0xf678, 0xf67e, 0xf679, 0xc55b, 0xf6a1, 0xc55a, 0xf67d, 0xf67c, 0xc559, 0xf67b, 0xc558, 0xf67a, 0xf77d, 0xf7a1, 0xf77e, 0xf77b, 0xc5bb, 0xf778, 0xf77c, 0xf7a3, 0xf7a2, 0xf779, 0xf77a, 0xc5ba, 0xf852, 0xc5e7, 0xf853, 0xc5e5, 0xc5e6, 0xf8d3, 0xc64a, 0xf976, 0xc66a, 0xf9b3, 0xc66b, 0xf9b4, 0xf9b5, 0xf9c3, 0xf9c2, 0xc67a, 0xf9cd, 0xb0a9, 0xe0e9, 0xe0e8, 0xbbea, 0xbbeb, 0xe4da, 0xe8d2, 0xec6c, 0xbe75, 0xc065, 0xec6a, 0xec6d, 0xc066, 0xef64, 0xec6b, 0xf1b9, 0xc34e, 0xf3c1, 0xf566, 0xf564, 0xf565, 0xf6a2, 0xc55c, 0xf7a4, 0xc5ea, 0xc5bc, 0xc5e8, 0xc5e9, 0xf8d4, 0xc662, 0xb0aa, 0xf1ba, 0xd449, 0xb9a6, 0xe4db, 0xbbec, 0xe4dc, 0xe8d4, 0xe8d3, 0xc068, 0xbe76, 0xbe77, 0xe8d7, 0xe8d6, 0xe8d5, 0xec6e, 0xec71, 0xec70, 0xec6f, 0xc067, 0xef68, 0xef66, 0xef65, 0xef67, 0xc34f, 0xf1bc, 0xf1bd, 0xc350, 0xf1bb, 0xf3c3, 0xf3c2, 0xf3c5, 0xc447, 0xf3c4, 0xf567, 0xf569, 0xf568, 0xf6a3, 0xf6a6, 0xf6a4, 0xf6a5, 0xf7a5, 0xc5bd, 0xf854, 0xf855, 0xf856, 0xc64b, 0xc663, 0xf9b6, 0xb0ab, 0xbe78, 0xc069, 0xf1be, 0xf7a6, 0xf9c4, 0xd44a, 0xc67b, 0xb0ac, 0xec72, 0xf1bf, 0xf3c6, 0xf6a7, 0xf7a7, 0xb0ad, 0xe4dd, 0xe4de, 0xbbed, 0xbbee, 0xe8d9, 0xbe7a, 0xbe79, 0xe8d8, 0xef69, 0xf1c0, 0xf1c2, 0xf1c1, 0xc353, 0xc352, 0xc351, 0xc55e, 0xf6a8, 0xc55d, 0xf7a9, 0xf7a8, 0xc64c, 0xf8d5, 0xb3bd, 0xe0ea, 0xe4e1, 0xe4df, 0xe4e0, 0xe8e2, 0xe8dd, 0xe8da, 0xe8e1, 0xe8e3, 0xbe7c, 0xe8e0, 0xe8dc, 0xe8db, 0xe8df, 0xe8de, 0xbe7b, 0xec7d, 0xec78, 0xec76, 0xeca1, 0xec77, 0xec73, 0xec79, 0xec74, 0xef72, 0xec75, 0xeca2, 0xec7c, 0xc06a, 0xec7b, 0xec7a, 0xec7e, 0xef6a, 0xef6d, 0xef6c, 0xef74, 0xef6f, 0xef73, 0xef71, 0xef70, 0xef6e, 0xef6b, 0xc243, 0xc242, 0xc244, 0xc241, 0xef75, 0xf1c8, 0xf1cb, 0xf1c9, 0xf1cd, 0xf1ce, 0xf1c6, 0xc358, 0xf1c7, 0xf1c5, 0xf1cc, 0xf1c4, 0xf1c3, 0xc357, 0xc355, 0xc354, 0xf1ca, 0xf3cf, 0xf3d5, 0xc44a, 0xf3d0, 0xf3d3, 0xf3d7, 0xc44b, 0xf3d2, 0xf3ca, 0xf3c9, 0xf3d6, 0xf3cd, 0xf3cb, 0xf3d4, 0xf3cc, 0xc449, 0xc448, 0xf3c7, 0xf3c8, 0xf3d1, 0xf3ce, 0xf56c, 0xf56f, 0xc356, 0xf56d, 0xf573, 0xf571, 0xf56b, 0xf576, 0xf56a, 0xc4cf, 0xf572, 0xf56e, 0xc4ce, 0xf575, 0xf574, 0xf6ab, 0xf6aa, 0xf6b1, 0xf6ad, 0xf6b0, 0xc560, 0xf6ae, 0xf6af, 0xf6a9, 0xf6ac, 0xc55f, 0xc5bf, 0xf7b4, 0xf7af, 0xf7b3, 0xf7b6, 0xf7b2, 0xf7ae, 0xc5c1, 0xf7b1, 0xf7b5, 0xc5c0, 0xf7ac, 0xf570, 0xf7b0, 0xf7ad, 0xf7aa, 0xf7ab, 0xc5be, 0xf85a, 0xf85c, 0xf85f, 0xf85b, 0xf860, 0xf859, 0xf857, 0xc5eb, 0xf85d, 0xc5ed, 0xc5ec, 0xf858, 0xf85e, 0xf8da, 0xc64d, 0xf8db, 0xf8d9, 0xf8d6, 0xf8d8, 0xf8d7, 0xf95a, 0xf95c, 0xf95b, 0xf979, 0xf978, 0xf977, 0xf97a, 0xc673, 0xc674, 0xf9ca, 0xf9ce, 0xb3be, 0xdcaf, 0xe0ed, 0xb9a7, 0xe0eb, 0xe0ec, 0xe4e2, 0xe4e3, 0xbbf1, 0xbbef, 0xe4e4, 0xbbf0, 0xe8e8, 0xe8eb, 0xe8e5, 0xe8ec, 0xe8e4, 0xe8e6, 0xe8e7, 0xe8ea, 0xbea1, 0xe8ef, 0xe8ee, 0xbe7d, 0xe8e9, 0xe8ed, 0xbe7e, 0xecac, 0xc06f, 0xeca7, 0xc06b, 0xeca4, 0xecaa, 0xecad, 0xc070, 0xeca9, 0xeca6, 0xecae, 0xeca5, 0xecab, 0xc06c, 0xeca3, 0xc06d, 0xc06e, 0xeca8, 0xefa9, 0xef7a, 0xef7b, 0xef7e, 0xef7c, 0xef76, 0xef79, 0xefa5, 0xef7d, 0xc245, 0xefa7, 0xefa4, 0xc246, 0xefa6, 0xef77, 0xefa2, 0xefa3, 0xefa1, 0xf1d2, 0xf1d4, 0xf1d7, 0xf1d1, 0xc359, 0xf1d9, 0xf1d0, 0xf1da, 0xf1d6, 0xf1d8, 0xf1dc, 0xf1d5, 0xf1dd, 0xf1d3, 0xf1cf, 0xc35a, 0xf1db, 0xc35b, 0xc44d, 0xef78, 0xf3f1, 0xf3e8, 0xc44f, 0xf3e4, 0xc450, 0xf3ed, 0xf3e7, 0xf3dd, 0xc44e, 0xf3ea, 0xf3e5, 0xf3e6, 0xf3d8, 0xf3df, 0xf3ee, 0xf3eb, 0xf3e3, 0xf3ef, 0xf3de, 0xf3d9, 0xf3ec, 0xf3db, 0xf3e9, 0xf3e0, 0xf3f0, 0xf3dc, 0xc44c, 0xf3da, 0xf3e1, 0xf3e2, 0xf57d, 0xf57b, 0xf5a2, 0xf5ae, 0xf5a5, 0xf57c, 0xf578, 0xf5a7, 0xf57e, 0xf5a3, 0xf57a, 0xf5aa, 0xf577, 0xf5a1, 0xf5a6, 0xf5a8, 0xf5ab, 0xf579, 0xf5af, 0xf5b0, 0xf5a9, 0xf5ad, 0xf5a4, 0xf6c1, 0xf6c4, 0xc561, 0xf6c3, 0xf6c8, 0xf6c6, 0xc562, 0xf6bd, 0xf6b3, 0xf6b2, 0xc564, 0xf6bf, 0xf6c0, 0xf6bc, 0xf6b4, 0xf6b9, 0xf5ac, 0xf6b5, 0xc563, 0xf6bb, 0xf6ba, 0xf6b6, 0xf6c2, 0xf6b7, 0xf7bb, 0xf6c5, 0xf6c7, 0xf6be, 0xf6b8, 0xf7bc, 0xf7be, 0xf7b8, 0xc5c2, 0xf7c5, 0xf7c3, 0xc5c3, 0xf7c2, 0xf7c1, 0xf7ba, 0xf7b7, 0xf7bd, 0xf7c6, 0xf7b9, 0xf7bf, 0xf869, 0xf86e, 0xf864, 0xf867, 0xc5ee, 0xf86b, 0xf872, 0xf7c0, 0xf865, 0xf86f, 0xf873, 0xf86a, 0xf863, 0xf86d, 0xf86c, 0xf871, 0xf870, 0xf7c4, 0xf868, 0xf862, 0xf866, 0xc64e, 0xc64f, 0xf861, 0xf8e6, 0xf8dd, 0xf8e5, 0xf8e2, 0xf8e3, 0xf8dc, 0xf8df, 0xf8e7, 0xf8e1, 0xf8e0, 0xf8de, 0xf8e4, 0xf95d, 0xf95e, 0xf960, 0xf95f, 0xf962, 0xf961, 0xf97c, 0xf97b, 0xf9b7, 0xf9b8, 0xf9c5, 0xc678, 0xc67c, 0xf9cf, 0xc67d, 0xb3bf, 0xc4d0, 0xf6c9, 0xc650, 0xc651, 0xb3c0, 0xe0ee, 0xb9a8, 0xe8f0, 0xecb0, 0xecb1, 0xecaf, 0xefab, 0xefaa, 0xc247, 0xf1df, 0xefac, 0xf1de, 0xf3f3, 0xc451, 0xc453, 0xf3f2, 0xc452, 0xf5b1, 0xf5b3, 0xf5b2, 0xf6ca, 0xc565, 0xc5ef, 0xf8e8, 0xf963, 0xf9d2, 0xb3c1, 0xe4e5, 0xbea2, 0xecb3, 0xecb2, 0xefad, 0xc454, 0xc4d1, 0xf7c7, 0xf9cb, 0xb3c2, 0xbbf2, 0xbea3, 0xf3f4, 0xf874, 0xb6c0, 0xefae, 0xc664, 0xb6c1, 0xbea4, 0xc248, 0xf875, 0xb6c2, 0xe8f1, 0xc072, 0xecb4, 0xecb5, 0xc071, 0xefaf, 0xc24c, 0xc24a, 0xc24b, 0xc249, 0xf1e0, 0xc35c, 0xf5b5, 0xf5b4, 0xf5b7, 0xf5b6, 0xc4d2, 0xf6cb, 0xf6cd, 0xf6cc, 0xc566, 0xf7c8, 0xf876, 0xf877, 0xc5f0, 0xf964, 0xf97d, 0xc675, 0xdcb0, 0xecb6, 0xefb0, 0xf3f5, 0xe0ef, 0xefb1, 0xf1e2, 0xf1e1, 0xf878, 0xc652, 0xf965, 0xf97e, 0xb9a9, 0xe8f2, 0xe8f3, 0xecb7, 0xb9aa, 0xc35d, 0xf1e3, 0xf6cf, 0xc567, 0xf6d0, 0xf6ce, 0xf879, 0xf8e9, 0xb9ab, 0xefb4, 0xefb3, 0xefb2, 0xf1e4, 0xf1e8, 0xf1e7, 0xf1e6, 0xf1e5, 0xc35e, 0xf3f6, 0xf5b9, 0xc4d3, 0xf5b8, 0xf6d1, 0xf7cb, 0xf7ca, 0xc5c4, 0xf7c9, 0xf87c, 0xf87b, 0xf87a, 0xbbf3, 0xecb8, 0xc24d, 0xf3f7, 0xf3f8, 0xf7cc, 0xf87d, 0xf8ea, 0xf966, 0xf9b9, 0xf9d4, 0xbbf4, 0xc24e, 0xf1e9, 0xf3f9, 0xf6d2, 0xf87e, 0xbea6, 0xefb5, 0xf1ea, 0xf3fa, 0xf3fb, 0xf3fc, 0xf5be, 0xf5ba, 0xc568, 0xf5bd, 0xf5bc, 0xc4d4, 0xf5bb, 0xc4d6, 0xc4d5, 0xf6d4, 0xf6d3, 0xc569, 0xc56a, 0xc5c6, 0xf7cd, 0xc5c5, 0xf8a3, 0xf8a4, 0xf8a2, 0xf8a1, 0xc654, 0xf8eb, 0xf8ec, 0xf8ed, 0xc653, 0xf967, 0xf96a, 0xf969, 0xf968, 0xf9d3, 0xc073, 0xc365, 0xf5bf, 0xf6d5, 0xc5c7, 0xf7ce, 0xf9d5, 0xc074, 0xefb6, 0xf7cf, 0xf9a1, 0xc94a, 0xddfc, 0xa14a, 0xa157, 0xa159, 0xa15b, 0xa15f, 0xa160, 0xa163, 0xa164, 0xa167, 0xa168, 0xa16b, 0xa16c, 0xa16f, 0xa170, 0xa173, 0xa174, 0xa177, 0xa178, 0xa17b, 0xa17c, 0xa1c6, 0xa1c7, 0xa1ca, 0xa1cb, 0xa1c8, 0xa1c9, 0xa15c, 0xa14d, 0xa14f, 0xa151, 0xa152, 0xa153, 0xa154, 0xa17d, 0xa17e, 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1cc, 0xa1cd, 0xa1ce, 0xa1de, 0xa1df, 0xa1e0, 0xa1e1, 0xa1e2, 0xa24c, 0xa24d, 0xa24e, 0xa149, 0xa1ad, 0xa243, 0xa248, 0xa1ae, 0xa15d, 0xa15e, 0xa1af, 0xa1cf, 0xa141, 0xa1d0, 0xa144, 0xa241, 0xa2af, 0xa2b0, 0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa147, 0xa146, 0xa1d5, 0xa1d7, 0xa1d6, 0xa148, 0xa249, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0, 0xa2e1, 0xa2e2, 0xa2e3, 0xa2e4, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa242, 0xa1c4, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee, 0xa2ef, 0xa2f0, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fd, 0xa2fe, 0xa340, 0xa341, 0xa342, 0xa343, 0xa161, 0xa155, 0xa162, 0xa14e, }; static const Summary16 big5_uni2indx_page00[16] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x00ac }, { 4, 0x0083 }, { 7, 0x0000 }, { 7, 0x0080 }, { 8, 0x0000 }, { 8, 0x0080 }, }; static const Summary16 big5_uni2indx_page02[38] = { /* 0x0200 */ { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0000 }, { 9, 0x0e80 }, { 13, 0x0200 }, { 14, 0x0000 }, { 14, 0x0000 }, /* 0x0300 */ { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0x0000 }, { 14, 0xfffe }, { 29, 0x03fb }, { 38, 0xfffe }, { 53, 0x03fb }, { 62, 0x0000 }, { 62, 0x0000 }, { 62, 0x0000 }, /* 0x0400 */ { 62, 0x0002 }, { 63, 0x1ff0 }, { 72, 0xfff8 }, { 85, 0xffff }, { 101, 0xffff }, { 117, 0x0002 }, }; static const Summary16 big5_uni2indx_page20[44] = { /* 0x2000 */ { 118, 0x0000 }, { 118, 0x3318 }, { 124, 0x0064 }, { 127, 0x4824 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, { 131, 0x0000 }, /* 0x2100 */ { 131, 0x0228 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x0000 }, { 134, 0x03ff }, { 144, 0x0000 }, { 144, 0x0000 }, { 144, 0x03cf }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, { 152, 0x0000 }, /* 0x2200 */ { 152, 0x0000 }, { 152, 0xc400 }, { 155, 0x4e29 }, { 162, 0x1030 }, { 165, 0x0000 }, { 165, 0x0004 }, { 166, 0x00c3 }, { 170, 0x0000 }, { 170, 0x0000 }, { 170, 0x0000 }, { 170, 0x0020 }, { 171, 0x8000 }, }; static const Summary16 big5_uni2indx_page24[37] = { /* 0x2400 */ { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x0000 }, { 172, 0x03ff }, { 182, 0x3ff0 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, { 192, 0x0000 }, /* 0x2500 */ { 192, 0x1005 }, { 195, 0x1111 }, { 199, 0x1010 }, { 201, 0x1010 }, { 203, 0x0000 }, { 203, 0x4001 }, { 205, 0xe402 }, { 210, 0x000f }, { 214, 0xfffe }, { 229, 0x0030 }, { 231, 0x0003 }, { 233, 0x300c }, { 237, 0xc8c0 }, { 242, 0x0000 }, { 242, 0x003c }, { 246, 0x0000 }, /* 0x2600 */ { 246, 0x0260 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0000 }, { 249, 0x0007 }, }; static const Summary16 big5_uni2indx_page30[62] = { /* 0x3000 */ { 252, 0xff2f }, { 265, 0x6037 }, { 272, 0x03fe }, { 281, 0x0000 }, { 281, 0xfffe }, { 296, 0xffff }, { 312, 0xffff }, { 328, 0xffff }, { 344, 0xffff }, { 360, 0x600f }, { 366, 0xfffe }, { 381, 0xffff }, { 397, 0xffff }, { 413, 0xffff }, { 429, 0xffff }, { 445, 0x407f }, /* 0x3100 */ { 453, 0xffe0 }, { 464, 0xffff }, { 480, 0x03ff }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, /* 0x3200 */ { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0000 }, { 490, 0x0008 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, /* 0x3300 */ { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0x0000 }, { 491, 0xc000 }, { 493, 0x7000 }, { 496, 0x0002 }, { 497, 0x0000 }, { 497, 0x4010 }, { 499, 0x0026 }, }; static const Summary16 big5_uni2indx_page4e[1307] = { /* 0x4e00 */ { 502, 0xff8b }, { 514, 0xc373 }, { 523, 0x6840 }, { 527, 0x1b0f }, { 535, 0xe9ac }, { 544, 0xf34c }, { 553, 0x0200 }, { 554, 0xc008 }, { 557, 0x795c }, { 566, 0xca3e }, { 575, 0x7976 }, { 585, 0x0648 }, { 589, 0x2fdf }, { 601, 0xf7f0 }, { 612, 0x033a }, { 618, 0xa8ff }, /* 0x4f00 */ { 629, 0xef37 }, { 641, 0x233f }, { 650, 0xb004 }, { 654, 0xfd59 }, { 665, 0xf3ca }, { 675, 0xffff }, { 691, 0xde9f }, { 703, 0xfff9 }, { 717, 0xabff }, { 730, 0x7df7 }, { 743, 0xc000 }, { 745, 0x8eec }, { 754, 0xeebf }, { 767, 0xffdb }, { 781, 0xd003 }, { 786, 0x45fa }, /* 0x5000 */ { 795, 0xfae1 }, { 805, 0xdffe }, { 819, 0xbfef }, { 833, 0x10ab }, { 839, 0xffeb }, { 853, 0xfcaa }, { 863, 0xef3f }, { 876, 0x24fd }, { 885, 0x78ad }, { 894, 0x7f76 }, { 906, 0xf00c }, { 912, 0xedff }, { 926, 0xcff6 }, { 938, 0x2cfa }, { 947, 0xf7f9 }, { 960, 0xeb6b }, /* 0x5100 */ { 971, 0x1ffd }, { 983, 0x95bf }, { 994, 0x6677 }, { 1004, 0xbfbf }, { 1018, 0x3bfb }, { 1030, 0xfeb4 }, { 1041, 0x7bae }, { 1052, 0x11e2 }, { 1058, 0xa681 }, { 1064, 0x41be }, { 1072, 0x1435 }, { 1078, 0x72c3 }, { 1086, 0x7d70 }, { 1095, 0x7191 }, { 1102, 0x0003 }, { 1104, 0x276b }, /* 0x5200 */ { 1113, 0x57cb }, { 1123, 0x70cf }, { 1132, 0x4732 }, { 1139, 0x0def }, { 1149, 0x7eda }, { 1160, 0xfc74 }, { 1170, 0xfe06 }, { 1179, 0xbdb4 }, { 1189, 0x3f9f }, { 1201, 0x8bca }, { 1209, 0x7e49 }, { 1218, 0x5800 }, { 1221, 0x228f }, { 1228, 0xebec }, { 1239, 0x8a5c }, { 1246, 0xddbb }, /* 0x5300 */ { 1258, 0xef60 }, { 1267, 0xb6e7 }, { 1278, 0xa40f }, { 1285, 0xf293 }, { 1294, 0x37bb }, { 1305, 0x549e }, { 1313, 0xd04b }, { 1320, 0x9baf }, { 1331, 0xc414 }, { 1336, 0xf7d4 }, { 1347, 0x30b0 }, { 1352, 0x0a14 }, { 1356, 0x2f08 }, { 1362, 0x88d0 }, { 1367, 0xff7e }, { 1381, 0x192f }, /* 0x5400 */ { 1389, 0xffda }, { 1402, 0xfb07 }, { 1412, 0x7ff1 }, { 1424, 0x7beb }, { 1436, 0xc5ef }, { 1447, 0x0010 }, { 1448, 0x99ff }, { 1460, 0xfdff }, { 1475, 0x79d7 }, { 1486, 0x0567 }, { 1493, 0xffe7 }, { 1507, 0xfdcb }, { 1519, 0xc3ff }, { 1531, 0x4040 }, { 1533, 0x6ff7 }, { 1546, 0xbd8e }, /* 0x5500 */ { 1556, 0xdffa }, { 1569, 0x0497 }, { 1575, 0xf4c0 }, { 1582, 0x5bff }, { 1595, 0xed7b }, { 1607, 0xd0e7 }, { 1616, 0x047e }, { 1623, 0xf8e0 }, { 1631, 0xff9f }, { 1645, 0xb73e }, { 1656, 0x7dfe }, { 1669, 0x882e }, { 1675, 0xfffd }, { 1690, 0xbe7f }, { 1703, 0x83fe }, { 1713, 0xf6c4 }, /* 0x5600 */ { 1722, 0xf357 }, { 1733, 0xb8fd }, { 1744, 0xd680 }, { 1750, 0xef7d }, { 1763, 0x5767 }, { 1773, 0x4788 }, { 1779, 0xff7d }, { 1793, 0xc3df }, { 1804, 0xf0ff }, { 1816, 0x37a9 }, { 1825, 0x7de0 }, { 1834, 0x70fc }, { 1843, 0x3f6f }, { 1855, 0xec9a }, { 1864, 0x4cb3 }, { 1872, 0x8681 }, /* 0x5700 */ { 1877, 0x3f9e }, { 1888, 0xdd5c }, { 1898, 0xf70d }, { 1908, 0x4819 }, { 1913, 0xfea3 }, { 1924, 0x0007 }, { 1927, 0xaf56 }, { 1937, 0x38ff }, { 1948, 0x980d }, { 1954, 0xefb8 }, { 1965, 0x403d }, { 1971, 0xb760 }, { 1979, 0xd8ce }, { 1988, 0x9035 }, { 1994, 0x72bf }, { 2005, 0x3fff }, /* 0x5800 */ { 2019, 0x7ff7 }, { 2033, 0x7a11 }, { 2040, 0xf7bb }, { 2053, 0xabff }, { 2066, 0xff00 }, { 2074, 0x6fbe }, { 2086, 0xa93c }, { 2094, 0xfe72 }, { 2105, 0xcfef }, { 2118, 0xf11b }, { 2127, 0xdb6b }, { 2138, 0xf40a }, { 2145, 0xc3e6 }, { 2154, 0xef7e }, { 2167, 0x9b9c }, { 2176, 0xf610 }, /* 0x5900 */ { 2183, 0xf048 }, { 2189, 0x16f4 }, { 2197, 0xfeb5 }, { 2209, 0x5182 }, { 2214, 0xc7b1 }, { 2223, 0x15bb }, { 2232, 0x6e87 }, { 2241, 0xfbdf }, { 2255, 0xe43f }, { 2265, 0x63cd }, { 2274, 0xc1ff }, { 2285, 0x7e7e }, { 2297, 0xfdeb }, { 2310, 0x7d5f }, { 2322, 0x777b }, { 2334, 0xfcfe }, /* 0x5a00 */ { 2347, 0x960b }, { 2354, 0xdbea }, { 2365, 0x6229 }, { 2371, 0x53e8 }, { 2379, 0x37df }, { 2391, 0xfdef }, { 2405, 0x36f5 }, { 2415, 0xbd81 }, { 2423, 0xdc18 }, { 2430, 0xfcbd }, { 2442, 0xd2e4 }, { 2450, 0xffff }, { 2466, 0x3fd7 }, { 2478, 0xffe0 }, { 2489, 0x7f6f }, { 2502, 0xabf8 }, /* 0x5b00 */ { 2512, 0x9bae }, { 2522, 0x6ed9 }, { 2532, 0xf5fb }, { 2545, 0xf115 }, { 2553, 0x79a9 }, { 2562, 0xbdfb }, { 2575, 0x5a3c }, { 2583, 0xadaf }, { 2594, 0xdbba }, { 2605, 0x1fac }, { 2614, 0x71fc }, { 2624, 0x8379 }, { 2632, 0x7cf7 }, { 2644, 0xc35f }, { 2654, 0xdfff }, { 2669, 0x0567 }, /* 0x5c00 */ { 2676, 0xff9a }, { 2688, 0x8467 }, { 2695, 0x1534 }, { 2701, 0xdf8b }, { 2712, 0xf9f3 }, { 2724, 0x3373 }, { 2733, 0xf7bd }, { 2746, 0x5e1a }, { 2754, 0xbf40 }, { 2762, 0xa03f }, { 2770, 0xffff }, { 2786, 0x01eb }, { 2793, 0xdfc0 }, { 2802, 0xcfdd }, { 2814, 0x7500 }, { 2819, 0xabd3 }, /* 0x5d00 */ { 2829, 0xf8c3 }, { 2838, 0xeed6 }, { 2849, 0x43fd }, { 2859, 0xb7ff }, { 2873, 0x5eaf }, { 2884, 0x4227 }, { 2890, 0x9bac }, { 2899, 0xf686 }, { 2908, 0x27d7 }, { 2918, 0xf6bc }, { 2929, 0xf787 }, { 2940, 0x35b7 }, { 2950, 0xaacd }, { 2959, 0xe176 }, { 2968, 0x49e7 }, { 2977, 0xe29f }, /* 0x5e00 */ { 2987, 0x545c }, { 2994, 0xaff2 }, { 3005, 0x2b3f }, { 3015, 0x61d8 }, { 3022, 0xfc3b }, { 3033, 0xbbb8 }, { 3043, 0xffcf }, { 3057, 0x7b7d }, { 3069, 0xbf95 }, { 3080, 0x1ce0 }, { 3086, 0x7dfd }, { 3099, 0x43ff }, { 3110, 0x5ff6 }, { 3122, 0xfffe }, { 3137, 0xd3ef }, { 3149, 0xc4ce }, /* 0x5f00 */ { 3157, 0x8db6 }, { 3166, 0xadbc }, { 3176, 0x63dc }, { 3185, 0x11eb }, { 3193, 0xdf59 }, { 3204, 0x23d0 }, { 3210, 0xbeb4 }, { 3220, 0xf3db }, { 3232, 0x1fe7 }, { 3243, 0xdbc7 }, { 3254, 0xff63 }, { 3266, 0xfae4 }, { 3276, 0xb22b }, { 3284, 0x63f7 }, { 3295, 0xed3b }, { 3306, 0xadba }, /* 0x6000 */ { 3316, 0xfe01 }, { 3324, 0x7eff }, { 3338, 0xfff7 }, { 3353, 0x02bc }, { 3359, 0x32ff }, { 3370, 0xef39 }, { 3381, 0xfffc }, { 3395, 0x8005 }, { 3398, 0x77fb }, { 3411, 0xbcf5 }, { 3422, 0x010d }, { 3426, 0xfff7 }, { 3441, 0xfffb }, { 3456, 0xbf3a }, { 3467, 0x0057 }, { 3472, 0xdfff }, /* 0x6100 */ { 3487, 0xef7b }, { 3500, 0xbd7d }, { 3512, 0xdb88 }, { 3520, 0xc8d4 }, { 3527, 0xfff3 }, { 3541, 0xed7c }, { 3552, 0x5dee }, { 3563, 0x56ff }, { 3575, 0x7e0d }, { 3584, 0xac5f }, { 3594, 0xff96 }, { 3606, 0xd57f }, { 3618, 0x3fee }, { 3630, 0xc140 }, { 3634, 0x6ff9 }, { 3646, 0xffe7 }, /* 0x6200 */ { 3660, 0x779b }, { 3671, 0x8e77 }, { 3681, 0x6ebf }, { 3693, 0xe45d }, { 3702, 0x6fcf }, { 3714, 0x5f1f }, { 3725, 0xe07f }, { 3735, 0xfedf }, { 3749, 0xd7db }, { 3761, 0x01fe }, { 3769, 0xff00 }, { 3777, 0xfb7b }, { 3790, 0xffd4 }, { 3802, 0x1fdf }, { 3814, 0xf800 }, { 3819, 0xffff }, /* 0x6300 */ { 3835, 0xfb8f }, { 3847, 0x007b }, { 3853, 0xbf00 }, { 3860, 0x7f5c }, { 3871, 0xffff }, { 3887, 0x07f3 }, { 3896, 0xeba0 }, { 3904, 0x3de7 }, { 3915, 0xf7bf }, { 3929, 0xfbd7 }, { 3942, 0xffbf }, { 3957, 0x6003 }, { 3961, 0xfffd }, { 3976, 0xbfed }, { 3989, 0xefbb }, { 4002, 0x027f }, /* 0x6400 */ { 4010, 0xfe40 }, { 4018, 0xddfd }, { 4031, 0xfdff }, { 4046, 0xe2f9 }, { 4056, 0x680b }, { 4062, 0xfb1f }, { 4074, 0xfbe3 }, { 4086, 0xaffd }, { 4099, 0x9fa4 }, { 4108, 0xf7ed }, { 4121, 0x7a7d }, { 4132, 0xf80f }, { 4141, 0xeebe }, { 4153, 0x0fd5 }, { 4162, 0xbb5d }, { 4173, 0xfd9f }, /* 0x6500 */ { 4186, 0xf2db }, { 4197, 0x3bf9 }, { 4208, 0xfe7f }, { 4222, 0xebcc }, { 4232, 0x876a }, { 4240, 0x73fa }, { 4251, 0x95fc }, { 4261, 0x9ffc }, { 4273, 0x109f }, { 4280, 0xfaf7 }, { 4293, 0xddb7 }, { 4305, 0xbbcd }, { 4316, 0xf87e }, { 4327, 0xeccd }, { 4337, 0xf366 }, { 4347, 0x3c3f }, /* 0x6600 */ { 4357, 0xfffd }, { 4372, 0xb03f }, { 4381, 0xe9f7 }, { 4393, 0x067e }, { 4401, 0x96ae }, { 4410, 0xfe06 }, { 4419, 0xd576 }, { 4429, 0x5fd7 }, { 4441, 0x3fd1 }, { 4451, 0xa3f3 }, { 4461, 0xcf07 }, { 4470, 0x6fb7 }, { 4482, 0x9fd1 }, { 4492, 0x7f44 }, { 4501, 0x7b59 }, { 4511, 0xd3dd }, /* 0x6700 */ { 4522, 0xaf3b }, { 4533, 0xa9bd }, { 4543, 0x7dcf }, { 4555, 0xff3a }, { 4567, 0xfbe0 }, { 4577, 0xf6eb }, { 4589, 0xb401 }, { 4594, 0xffff }, { 4610, 0x7afa }, { 4621, 0xb7bf }, { 4634, 0xc000 }, { 4636, 0x0ffd }, { 4647, 0xff7f }, { 4662, 0xff1f }, { 4675, 0xfefc }, { 4688, 0x95ff }, /* 0x6800 */ { 4700, 0x0000 }, { 4700, 0xb5dc }, { 4710, 0xef63 }, { 4721, 0x3f3e }, { 4732, 0xfb7f }, { 4746, 0x001b }, { 4750, 0xe800 }, { 4754, 0xfbf6 }, { 4767, 0x9eef }, { 4779, 0xb8df }, { 4790, 0xff9f }, { 4804, 0x003f }, { 4810, 0x7bd0 }, { 4819, 0xf5ff }, { 4833, 0xdfdb }, { 4846, 0x3fff }, /* 0x6900 */ { 4860, 0xfdf0 }, { 4871, 0x00bf }, { 4878, 0x8420 }, { 4881, 0xbbbd }, { 4893, 0xdf37 }, { 4905, 0xffde }, { 4919, 0xff6d }, { 4932, 0x0ff3 }, { 4942, 0x604c }, { 4947, 0x5efb }, { 4959, 0xfffb }, { 4974, 0xfafb }, { 4987, 0xfe5e }, { 4999, 0x0219 }, { 5003, 0x79f4 }, { 5013, 0xf9de }, /* 0x6a00 */ { 5025, 0xa7f7 }, { 5037, 0xebfa }, { 5049, 0x01eb }, { 5056, 0xff34 }, { 5067, 0xebd3 }, { 5078, 0xef73 }, { 5090, 0xafd7 }, { 5102, 0xc040 }, { 5105, 0x72bb }, { 5115, 0xdcff }, { 5128, 0xf17f }, { 5140, 0x2fd8 }, { 5149, 0xb8ec }, { 5158, 0xfe0b }, { 5168, 0xdda3 }, { 5178, 0x1f0b }, /* 0x6b00 */ { 5186, 0x8f1d }, { 5195, 0x47cf }, { 5205, 0xb12b }, { 5213, 0xffde }, { 5227, 0x7fee }, { 5240, 0xda73 }, { 5250, 0x24ff }, { 5260, 0xcbc4 }, { 5268, 0xf75d }, { 5280, 0xcbf2 }, { 5290, 0xecfd }, { 5302, 0xb4ed }, { 5312, 0xbff9 }, { 5325, 0x4ddd }, { 5335, 0x99dd }, { 5345, 0xfb8d }, /* 0x6c00 */ { 5356, 0xbb7f }, { 5369, 0xaf7b }, { 5381, 0xddfb }, { 5394, 0xc959 }, { 5402, 0xfc4f }, { 5413, 0xfab5 }, { 5424, 0xafe3 }, { 5435, 0x6d5f }, { 5446, 0xffff }, { 5462, 0x3f7d }, { 5474, 0x7800 }, { 5478, 0xffdb }, { 5492, 0xb6ff }, { 5505, 0x7eff }, { 5519, 0xfbaf }, { 5532, 0x022f }, /* 0x6d00 */ { 5538, 0xff9b }, { 5551, 0xefc7 }, { 5563, 0xffa5 }, { 5575, 0xffff }, { 5591, 0x0007 }, { 5594, 0xc700 }, { 5599, 0xf7ff }, { 5614, 0xfff1 }, { 5627, 0x7ffd }, { 5641, 0x01bf }, { 5649, 0xdc00 }, { 5654, 0xfdbc }, { 5666, 0xbff5 }, { 5679, 0xffff }, { 5695, 0xff7f }, { 5710, 0x3eff }, /* 0x6e00 */ { 5723, 0x0029 }, { 5726, 0xbe00 }, { 5732, 0xf9ff }, { 5746, 0xff7f }, { 5761, 0x6efb }, { 5773, 0xfd7e }, { 5786, 0xcbff }, { 5799, 0x039e }, { 5806, 0xe300 }, { 5811, 0xfbdd }, { 5824, 0xccff }, { 5836, 0xf6df }, { 5849, 0xffff }, { 5865, 0x117f }, { 5874, 0xf800 }, { 5879, 0xfbf6 }, /* 0x6f00 */ { 5892, 0xe7ef }, { 5905, 0xd73c }, { 5915, 0xfeef }, { 5929, 0xdfef }, { 5943, 0xc00b }, { 5948, 0xedbf }, { 5961, 0xfedf }, { 5975, 0xfdcd }, { 5987, 0x7bf5 }, { 5999, 0x40fd }, { 6007, 0xffff }, { 6023, 0xb75f }, { 6035, 0xffdf }, { 6050, 0xf930 }, { 6058, 0xfbdf }, { 6072, 0xdc97 }, /* 0x7000 */ { 6082, 0xfef3 }, { 6095, 0xbff2 }, { 6107, 0x8fdf }, { 6119, 0xdfbf }, { 6133, 0x177f }, { 6144, 0xede6 }, { 6155, 0x0f7f }, { 6166, 0x3553 }, { 6174, 0x447c }, { 6181, 0x877e }, { 6191, 0xfa12 }, { 6199, 0x45bb }, { 6208, 0xede0 }, { 6217, 0x779e }, { 6228, 0x8017 }, { 6233, 0xbfd9 }, /* 0x7100 */ { 6245, 0x7e55 }, { 6255, 0xde89 }, { 6264, 0xc16f }, { 6273, 0x0447 }, { 6278, 0x7ade }, { 6289, 0xf75d }, { 6301, 0x57ff }, { 6314, 0x2905 }, { 6319, 0x86f7 }, { 6329, 0xfe95 }, { 6340, 0x97b3 }, { 6350, 0xf32f }, { 6361, 0xcfff }, { 6375, 0x9f75 }, { 6386, 0x71f7 }, { 6397, 0xfb17 }, /* 0x7200 */ { 6408, 0x34ee }, { 6417, 0xee19 }, { 6426, 0x37cc }, { 6435, 0xef61 }, { 6445, 0x9fd6 }, { 6456, 0xef4c }, { 6466, 0xd68f }, { 6476, 0xfbdd }, { 6489, 0x7b73 }, { 6500, 0x6def }, { 6512, 0xd7fe }, { 6525, 0xa431 }, { 6531, 0x5e7f }, { 6543, 0x97d7 }, { 6554, 0x0f5b }, { 6563, 0xffd8 }, /* 0x7300 */ { 6575, 0x9d83 }, { 6583, 0x7bce }, { 6594, 0x22ec }, { 6601, 0xdcff }, { 6614, 0x763d }, { 6624, 0xef87 }, { 6635, 0xdfe7 }, { 6648, 0xfded }, { 6661, 0x4fff }, { 6674, 0xa0fc }, { 6682, 0x3b77 }, { 6693, 0xdbfc }, { 6705, 0x3ded }, { 6716, 0x7fdc }, { 6728, 0x6fa9 }, { 6738, 0xf570 }, /* 0x7400 */ { 6747, 0x3ffb }, { 6760, 0x2c40 }, { 6764, 0xff7f }, { 6779, 0x847f }, { 6788, 0xec57 }, { 6798, 0xdeb7 }, { 6810, 0xe69c }, { 6819, 0xf22f }, { 6829, 0x0feb }, { 6839, 0xd5b5 }, { 6849, 0xafeb }, { 6861, 0xede7 }, { 6873, 0x8c2f }, { 6881, 0xfff0 }, { 6893, 0x537f }, { 6904, 0xe8f0 }, /* 0x7500 */ { 6912, 0xb99d }, { 6922, 0xb5ff }, { 6935, 0xff66 }, { 6947, 0xe78f }, { 6958, 0xd981 }, { 6965, 0xbe10 }, { 6972, 0x9c7c }, { 6981, 0xe3c1 }, { 6989, 0x9cd1 }, { 6997, 0x2733 }, { 7005, 0x0cbc }, { 7012, 0xff6d }, { 7025, 0xfcb7 }, { 7037, 0xefb7 }, { 7050, 0xa0df }, { 7059, 0xffff }, /* 0x7600 */ { 7075, 0xbf0b }, { 7085, 0xfe7b }, { 7098, 0xa3ff }, { 7110, 0x353f }, { 7120, 0x13cc }, { 7127, 0x97cd }, { 7137, 0x7637 }, { 7147, 0xfb27 }, { 7158, 0xcfd6 }, { 7169, 0x7e6c }, { 7179, 0xec50 }, { 7186, 0xed31 }, { 7195, 0x677c }, { 7205, 0xfc1c }, { 7214, 0xf6fa }, { 7226, 0x5fbf }, /* 0x7700 */ { 7239, 0x0fba }, { 7248, 0xae2f }, { 7258, 0xa3ad }, { 7267, 0x7ffe }, { 7281, 0xfcf0 }, { 7291, 0xde74 }, { 7301, 0xffef }, { 7316, 0xf200 }, { 7321, 0xfbbf }, { 7335, 0xfea2 }, { 7345, 0x3daf }, { 7356, 0xbcff }, { 7369, 0xf694 }, { 7378, 0x5fb9 }, { 7389, 0xf3ad }, { 7400, 0x3f8f }, /* 0x7800 */ { 7411, 0xf26c }, { 7420, 0xa01f }, { 7427, 0xffef }, { 7442, 0x01bf }, { 7450, 0x7728 }, { 7458, 0x7005 }, { 7463, 0xff35 }, { 7475, 0xda03 }, { 7482, 0xd2f9 }, { 7492, 0xc7fa }, { 7503, 0x3fbf }, { 7516, 0x5c1d }, { 7524, 0xff3a }, { 7536, 0xec33 }, { 7545, 0xb7af }, { 7557, 0xfe9c }, /* 0x7900 */ { 7568, 0x5236 }, { 7575, 0x7a9f }, { 7586, 0xbffa }, { 7599, 0xe722 }, { 7607, 0x9ff7 }, { 7620, 0xfcff }, { 7634, 0x2fbb }, { 7645, 0xb61d }, { 7654, 0xed06 }, { 7662, 0x1dfd }, { 7673, 0x7dd7 }, { 7685, 0xefdf }, { 7699, 0xeb23 }, { 7708, 0xf166 }, { 7717, 0x7ed9 }, { 7728, 0x0dc0 }, /* 0x7a00 */ { 7733, 0x3d3d }, { 7743, 0xdfbf }, { 7757, 0xc945 }, { 7764, 0xba83 }, { 7772, 0x7dd1 }, { 7782, 0x9dd0 }, { 7790, 0x7b87 }, { 7800, 0xcf73 }, { 7811, 0x9ff3 }, { 7823, 0xc3f5 }, { 7833, 0xdf0d }, { 7843, 0xc5fe }, { 7854, 0x0cb3 }, { 7861, 0x8302 }, { 7865, 0xe879 }, { 7874, 0xaec0 }, /* 0x7b00 */ { 7881, 0xc773 }, { 7891, 0x6f0f }, { 7901, 0xfd7d }, { 7914, 0x093f }, { 7922, 0xfff1 }, { 7935, 0x0157 }, { 7941, 0x62fb }, { 7951, 0x01ff }, { 7960, 0xfdb4 }, { 7971, 0x3bf3 }, { 7982, 0xb013 }, { 7988, 0x43b2 }, { 7995, 0x5ed3 }, { 8005, 0xff30 }, { 8015, 0x0fff }, { 8027, 0xeb9f }, /* 0x7c00 */ { 8039, 0xfeef }, { 8053, 0xf203 }, { 8060, 0x3fef }, { 8073, 0xfb89 }, { 8083, 0x37a9 }, { 8092, 0x9e99 }, { 8101, 0xdef9 }, { 8113, 0xa72c }, { 8121, 0x3733 }, { 8130, 0xc1f6 }, { 8139, 0x812e }, { 8145, 0xfe3e }, { 8157, 0x5d20 }, { 8163, 0xf2f7 }, { 8175, 0xd585 }, { 8183, 0x69d7 }, /* 0x7d00 */ { 8193, 0xffff }, { 8209, 0xffff }, { 8225, 0xdb07 }, { 8234, 0xff6f }, { 8248, 0xc4ff }, { 8259, 0xd97f }, { 8271, 0xefce }, { 8283, 0xbe0f }, { 8293, 0xf17b }, { 8304, 0xf05e }, { 8313, 0xf6cf }, { 8325, 0xffb7 }, { 8339, 0x5ef7 }, { 8351, 0xef84 }, { 8360, 0xd7cb }, { 8371, 0x0edf }, /* 0x7e00 */ { 8381, 0xff08 }, { 8390, 0xfcff }, { 8404, 0xee3f }, { 8416, 0xffff }, { 8432, 0x13ff }, { 8443, 0xd7ff }, { 8457, 0xaf0f }, { 8467, 0x7ffd }, { 8481, 0xbdc7 }, { 8492, 0x1ffa }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, /* 0x7f00 */ { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0xe740 }, { 8510, 0xbd38 }, { 8519, 0xf933 }, { 8529, 0x7feb }, { 8542, 0xfeed }, { 8555, 0x7fe8 }, { 8566, 0x7c76 }, { 8576, 0xb3f7 }, { 8588, 0xffef }, { 8603, 0xfeaf }, { 8616, 0xd8b7 }, { 8626, 0xff6f }, { 8640, 0xfbbf }, /* 0x8000 */ { 8654, 0xf8fb }, { 8666, 0xdbf7 }, { 8679, 0x1752 }, { 8686, 0xe2f9 }, { 8696, 0x85c8 }, { 8702, 0x7547 }, { 8711, 0x9090 }, { 8715, 0xe3ef }, { 8727, 0x9ef4 }, { 8737, 0x3f6d }, { 8748, 0xee2e }, { 8758, 0x0536 }, { 8764, 0xf7bc }, { 8776, 0x7ff3 }, { 8789, 0xa07b }, { 8797, 0x7f3f }, /* 0x8100 */ { 8810, 0x0567 }, { 8817, 0xeb60 }, { 8825, 0xbabe }, { 8836, 0x6601 }, { 8841, 0xfcd8 }, { 8851, 0x583f }, { 8860, 0xcaf7 }, { 8871, 0x87df }, { 8882, 0xbfcd }, { 8894, 0xffa0 }, { 8904, 0x5bcd }, { 8914, 0xfebf }, { 8928, 0xb6fd }, { 8940, 0xefa7 }, { 8952, 0x77ef }, { 8965, 0xdf9c }, /* 0x8200 */ { 8976, 0x3fb7 }, { 8988, 0xf877 }, { 8999, 0x9d27 }, { 9008, 0xb7fc }, { 9020, 0xcab5 }, { 9029, 0xdfef }, { 9043, 0xfb5a }, { 9054, 0xf1b6 }, { 9064, 0xec39 }, { 9073, 0xef1f }, { 9085, 0xfbbf }, { 9099, 0x7ffb }, { 9113, 0x000d }, { 9116, 0xdafe }, { 9128, 0xbdfb }, { 9141, 0x4e7f }, /* 0x8300 */ { 9152, 0x33ff }, { 9164, 0x5ac0 }, { 9170, 0xbff5 }, { 9183, 0x9ffe }, { 9196, 0xffbf }, { 9211, 0x005f }, { 9217, 0x0000 }, { 9217, 0xfdf8 }, { 9229, 0xffca }, { 9241, 0x6ffd }, { 9254, 0xcffd }, { 9267, 0xa001 }, { 9270, 0xdfff }, { 9285, 0xfbf2 }, { 9297, 0xdfbf }, { 9311, 0xff7f }, /* 0x8400 */ { 9326, 0xfeda }, { 9338, 0x080f }, { 9343, 0xba08 }, { 9349, 0xbfff }, { 9364, 0x7afd }, { 9376, 0xeed7 }, { 9388, 0xfbeb }, { 9401, 0x67f9 }, { 9412, 0xe044 }, { 9417, 0xff93 }, { 9429, 0xdf97 }, { 9441, 0x9f57 }, { 9452, 0xfef7 }, { 9466, 0x08df }, { 9474, 0xdf80 }, { 9482, 0xfedf }, /* 0x8500 */ { 9496, 0xffc5 }, { 9508, 0xf7fe }, { 9522, 0xfffb }, { 9537, 0x6803 }, { 9542, 0x67fb }, { 9554, 0x6bfa }, { 9565, 0x7fff }, { 9580, 0x5fe2 }, { 9590, 0xffff }, { 9606, 0xff73 }, { 9619, 0x87df }, { 9630, 0xe7fb }, { 9643, 0xebfd }, { 9656, 0xf7a7 }, { 9668, 0xbf7e }, { 9681, 0xefc7 }, /* 0x8600 */ { 9693, 0x1ef3 }, { 9703, 0xdf82 }, { 9712, 0x76ff }, { 9725, 0xdf7e }, { 9738, 0x79c9 }, { 9747, 0xda7d }, { 9758, 0xefbe }, { 9771, 0x1e9b }, { 9780, 0x7ce0 }, { 9788, 0x77fb }, { 9801, 0x87be }, { 9811, 0xfffb }, { 9826, 0x1bff }, { 9838, 0xffdb }, { 9852, 0x3f5c }, { 9862, 0x4fe0 }, /* 0x8700 */ { 9870, 0x7fff }, { 9885, 0x5f0e }, { 9894, 0x77ff }, { 9908, 0xddbf }, { 9921, 0xf04f }, { 9930, 0xffff }, { 9946, 0xffff }, { 9962, 0x0ff8 }, { 9971, 0xa3be }, { 9981, 0xfddf }, { 9995, 0xfc1c }, { 10004, 0xfffd }, { 10019, 0x1f7d }, { 10030, 0xfb9e }, { 10042, 0xbdff }, { 10056, 0xdedc }, /* 0x8800 */ { 10067, 0x3f6f }, { 10079, 0xbafb }, { 10091, 0xdf7f }, { 10105, 0xfbef }, { 10119, 0x7d1b }, { 10129, 0x2eec }, { 10138, 0xaf8e }, { 10148, 0xf2f7 }, { 10160, 0x7b0f }, { 10170, 0xcfee }, { 10182, 0x1d96 }, { 10190, 0x77c6 }, { 10200, 0x7e07 }, { 10209, 0xfff5 }, { 10223, 0xd982 }, { 10230, 0x7fdf }, /* 0x8900 */ { 10244, 0x5ee6 }, { 10254, 0xc7ff }, { 10267, 0xfeee }, { 10280, 0x79ef }, { 10292, 0x9a56 }, { 10300, 0xffcf }, { 10314, 0xfe5f }, { 10327, 0xde5e }, { 10338, 0x896e }, { 10346, 0xf9e8 }, { 10356, 0xf45e }, { 10366, 0xe6c4 }, { 10374, 0x0001 }, { 10375, 0xbe7c }, { 10386, 0x3b7f }, { 10398, 0xdddf }, /* 0x8a00 */ { 10411, 0xd59d }, { 10421, 0xe9ef }, { 10433, 0x34ac }, { 10440, 0xde53 }, { 10450, 0xf573 }, { 10461, 0x4bf7 }, { 10472, 0x7b4f }, { 10483, 0x9eff }, { 10496, 0xb8fe }, { 10507, 0x476e }, { 10516, 0x0dfb }, { 10526, 0xff45 }, { 10537, 0xabfd }, { 10549, 0xfbfe }, { 10563, 0xe9d7 }, { 10574, 0xddff }, /* 0x8b00 */ { 10588, 0xedf7 }, { 10601, 0x7fff }, { 10616, 0xddfd }, { 10629, 0x7eeb }, { 10641, 0xcfe7 }, { 10653, 0xb7ff }, { 10667, 0xbde9 }, { 10678, 0xef91 }, { 10688, 0x5d75 }, { 10698, 0xd77c }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, /* 0x8c00 */ { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0xfa80 }, { 10716, 0xffee }, { 10730, 0xb4f1 }, { 10739, 0xbf76 }, { 10751, 0x2fef }, { 10763, 0xb677 }, { 10774, 0x77bf }, { 10787, 0x9fbf }, { 10800, 0xfffd }, { 10815, 0x95bf }, { 10826, 0xf6ae }, { 10837, 0x75ff }, { 10850, 0x7f3b }, /* 0x8d00 */ { 10862, 0xa7f5 }, { 10873, 0x0af9 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0xfbd0 }, { 10891, 0x2bdd }, { 10901, 0xf633 }, { 10911, 0x9a7f }, { 10922, 0xfdab }, { 10934, 0xd6fc }, { 10945, 0xf9e6 }, { 10956, 0xbfeb }, { 10969, 0xdfdf }, { 10983, 0xf41f }, /* 0x8e00 */ { 10993, 0xa6fd }, { 11004, 0xffff }, { 11020, 0x4aff }, { 11031, 0xf37b }, { 11043, 0x7fb7 }, { 11056, 0xfef9 }, { 11069, 0xb6ff }, { 11082, 0x1d5c }, { 11090, 0x7ff6 }, { 11103, 0xe5ff }, { 11116, 0x1f7b }, { 11127, 0x2404 }, { 11130, 0xbe05 }, { 11138, 0xf99e }, { 11149, 0xdbe3 }, { 11160, 0xdff2 }, /* 0x8f00 */ { 11172, 0x6fef }, { 11185, 0xfdff }, { 11200, 0xd679 }, { 11210, 0xcbfc }, { 11221, 0xebfd }, { 11234, 0xefff }, { 11249, 0x001f }, { 11254, 0x0000 }, { 11254, 0x0000 }, { 11254, 0x9800 }, { 11257, 0xe148 }, { 11263, 0x8017 }, { 11268, 0x6a74 }, { 11276, 0x00fe }, { 11283, 0x6d7f }, { 11295, 0xfdf1 }, /* 0x9000 */ { 11307, 0xb87f }, { 11318, 0xfef3 }, { 11331, 0xe01f }, { 11339, 0xf176 }, { 11349, 0xee96 }, { 11359, 0x7b3f }, { 11371, 0xeb8d }, { 11381, 0xfffd }, { 11396, 0xadff }, { 11409, 0xcbb3 }, { 11419, 0x84ef }, { 11428, 0xe17f }, { 11439, 0x4daa }, { 11447, 0xbff0 }, { 11458, 0xbf3f }, { 11471, 0xfe3f }, /* 0x9100 */ { 11484, 0xebff }, { 11498, 0xffd7 }, { 11512, 0xffdf }, { 11527, 0xcf7f }, { 11540, 0xfffb }, { 11555, 0x85ed }, { 11564, 0xd73f }, { 11576, 0x07bc }, { 11584, 0xaeff }, { 11597, 0xfe0f }, { 11608, 0xfdaf }, { 11621, 0x76bf }, { 11633, 0xfaef }, { 11646, 0x37bb }, { 11657, 0x7fdc }, { 11669, 0xa3ba }, /* 0x9200 */ { 11678, 0xb6ff }, { 11691, 0x56f7 }, { 11702, 0x60f8 }, { 11709, 0xe7df }, { 11722, 0xff61 }, { 11733, 0x4cdf }, { 11743, 0xb0fb }, { 11753, 0xff45 }, { 11764, 0x7ded }, { 11776, 0x3ffa }, { 11788, 0x1fff }, { 11801, 0x18fc }, { 11809, 0xffff }, { 11825, 0xe3af }, { 11836, 0xc7d3 }, { 11846, 0xdf83 }, /* 0x9300 */ { 11856, 0xfb57 }, { 11868, 0xef7d }, { 11881, 0xefff }, { 11896, 0x1378 }, { 11903, 0xfec0 }, { 11912, 0x5ff7 }, { 11925, 0x34bb }, { 11934, 0x5ee3 }, { 11944, 0xf70d }, { 11954, 0xeff6 }, { 11967, 0xd7fe }, { 11980, 0x00bf }, { 11987, 0xf59d }, { 11998, 0xf7f7 }, { 12012, 0x51de }, { 12021, 0xffe0 }, /* 0x9400 */ { 12032, 0xfec9 }, { 12043, 0x037f }, { 12052, 0x5f01 }, { 12059, 0xbfef }, { 12073, 0x9ff1 }, { 12084, 0x60a7 }, { 12091, 0xef1d }, { 12102, 0xf1ff }, { 12115, 0x000f }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, /* 0x9500 */ { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x3c80 }, { 12124, 0xfb4d }, { 12135, 0xd91f }, { 12145, 0x7b3a }, { 12155, 0xfee3 }, { 12167, 0x3fe9 }, { 12178, 0xdc7f }, { 12190, 0x003f }, { 12196, 0x0000 }, /* 0x9600 */ { 12196, 0x0000 }, { 12196, 0x5000 }, { 12198, 0xf51f }, { 12209, 0xbe07 }, { 12218, 0xfc1d }, { 12228, 0xf91b }, { 12238, 0xbc1e }, { 12247, 0x71ff }, { 12259, 0x6ff9 }, { 12271, 0x5bbe }, { 12282, 0x5796 }, { 12291, 0x9b1b }, { 12300, 0x7fff }, { 12315, 0xfffc }, { 12329, 0x872e }, { 12337, 0xafe7 }, /* 0x9700 */ { 12349, 0xebf5 }, { 12361, 0xf34f }, { 12372, 0xdffd }, { 12386, 0xe725 }, { 12395, 0x0bdc }, { 12403, 0x5d44 }, { 12410, 0x5747 }, { 12419, 0xfddd }, { 12432, 0xed3f }, { 12444, 0x7790 }, { 12452, 0x7d7f }, { 12465, 0x8ac8 }, { 12471, 0xfafa }, { 12483, 0xf3f9 }, { 12495, 0x202a }, { 12499, 0xef4b }, /* 0x9800 */ { 12510, 0xf5ff }, { 12524, 0x79cf }, { 12535, 0xabd3 }, { 12545, 0x0ba5 }, { 12552, 0xf77a }, { 12564, 0xfb8f }, { 12576, 0x8ebd }, { 12586, 0x001f }, { 12591, 0x0000 }, { 12591, 0x0000 }, { 12591, 0xf300 }, { 12597, 0xfd4e }, { 12608, 0x1a57 }, { 12616, 0x8800 }, { 12618, 0xaeac }, { 12627, 0x7654 }, /* 0x9900 */ { 12635, 0x17ad }, { 12644, 0xcdff }, { 12657, 0xffb2 }, { 12669, 0xf42f }, { 12679, 0x5baa }, { 12688, 0xdbff }, { 12702, 0x0002 }, { 12703, 0x0000 }, { 12703, 0x0000 }, { 12703, 0x73c0 }, { 12710, 0xf9ea }, { 12721, 0x2e3f }, { 12731, 0xfa8e }, { 12741, 0xbbff }, { 12755, 0x76bc }, { 12765, 0xffd3 }, /* 0x9a00 */ { 12778, 0xeefe }, { 12791, 0x7e72 }, { 12801, 0x7ebd }, { 12813, 0xe7f7 }, { 12826, 0xf77f }, { 12840, 0xcefd }, { 12852, 0x0ff5 }, { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0xa900 }, { 12866, 0xdb9b }, { 12877, 0xa4c7 }, { 12885, 0x917f }, { 12895, 0xf8ca }, { 12904, 0x7ece }, /* 0x9b00 */ { 12915, 0x7d7a }, { 12926, 0xc7e7 }, { 12937, 0xcbbd }, { 12948, 0xdcae }, { 12958, 0xfd7e }, { 12971, 0x8f76 }, { 12981, 0x91d3 }, { 12989, 0x7cf3 }, { 13000, 0x01e5 }, { 13006, 0x4c2f }, { 13014, 0xed77 }, { 13026, 0xa360 }, { 13032, 0x07db }, { 13041, 0x5ef8 }, { 13051, 0x1df7 }, { 13062, 0x2181 }, /* 0x9c00 */ { 13066, 0x6be0 }, { 13074, 0x309c }, { 13080, 0x3b3a }, { 13089, 0xfade }, { 13101, 0x7f53 }, { 13112, 0xc3f5 }, { 13122, 0x61cd }, { 13130, 0x07ba }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x26e0 }, { 13144, 0xbefe }, /* 0x9d00 */ { 13157, 0x03f9 }, { 13165, 0xebb5 }, { 13176, 0xe36d }, { 13186, 0xe9cb }, { 13196, 0x9c2f }, { 13205, 0xbfde }, { 13218, 0x9f83 }, { 13227, 0xabbf }, { 13239, 0x1ff7 }, { 13251, 0xffd5 }, { 13264, 0xb7df }, { 13277, 0xdffe }, { 13291, 0xfdae }, { 13303, 0xffef }, { 13318, 0xfb7e }, { 13331, 0xeffd }, /* 0x9e00 */ { 13345, 0xaaff }, { 13357, 0x6ebf }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0xb620 }, { 13375, 0x7fcd }, { 13387, 0xbe9e }, { 13398, 0x62b3 }, { 13406, 0x58f1 }, { 13414, 0xf10d }, { 13422, 0xfd7b }, { 13435, 0xe9f1 }, { 13445, 0xbefd }, /* 0x9f00 */ { 13458, 0xc6c3 }, { 13466, 0x5f6d }, { 13477, 0xff3d }, { 13490, 0x69ff }, { 13502, 0xffcf }, { 13516, 0xfbf4 }, { 13528, 0xdcfb }, { 13540, 0x4ff7 }, { 13552, 0x2000 }, { 13553, 0x1137 }, { 13560, 0x0015 }, }; static const Summary16 big5_uni2indx_pagefa[1] = { /* 0xfa00 */ { 13563, 0x3000 }, }; static const Summary16 big5_uni2indx_pagefe[23] = { /* 0xfe00 */ { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0xfffb }, { 13580, 0xfe1f }, { 13592, 0xfef5 }, { 13605, 0x0e7f }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, /* 0xff00 */ { 13615, 0xff7a }, { 13628, 0xffff }, { 13644, 0xffff }, { 13660, 0x97ff }, { 13673, 0xfffe }, { 13688, 0x3fff }, { 13702, 0x0010 }, }; static int big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc > 0x0000 && wc < 0x0100) summary = &big5_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0200 && wc < 0x0460) summary = &big5_uni2indx_page02[(wc>>4)-0x020]; else if (wc >= 0x2000 && wc < 0x22c0) summary = &big5_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2400 && wc < 0x2650) summary = &big5_uni2indx_page24[(wc>>4)-0x240]; else if (wc >= 0x3000 && wc < 0x33e0) summary = &big5_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &big5_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xfa00 && wc < 0xfa10) summary = &big5_uni2indx_pagefa[(wc>>4)-0xfa0]; else if (wc >= 0xfe00 && wc < 0xff70) summary = &big5_uni2indx_pagefe[(wc>>4)-0xfe0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = big5_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.2.05/src/libtiniconv/encdec/koi8_u.h0000664000175000017500000001625714532252172015700 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-U */ /* Specification: RFC 2319 */ static const unsigned short koi8_u_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x255d, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x256c, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_u_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_u_2uni[c-0x80]; return 1; } static const unsigned char koi8_u_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_u_page04[152] = { 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char koi8_u_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_u_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_u_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0x00, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_u_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_u_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = koi8_u_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_u_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_u_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_u_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp1253.h0000664000175000017500000001064214532252172015407 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1253 */ static const unsigned short cp1253_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0x00a0, 0x0385, 0x0386, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x2015, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x00b5, 0x00b6, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, /* 0xc0 */ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0xd0 */ 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, /* 0xe0 */ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0xf0 */ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, }; static int cp1253_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1253_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1253_page00[32] = { 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char cp1253_page03[80] = { 0x00, 0x00, 0x00, 0x00, 0xb4, 0xa1, 0xa2, 0x00, /* 0x80-0x87 */ 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ }; static const unsigned char cp1253_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1253_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = cp1253_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x83; else if (wc >= 0x0380 && wc < 0x03d0) c = cp1253_page03[wc-0x0380]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1253_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/jisx0208.h0000664000175000017500000044152114532252172015765 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0208.1990-0 */ static const unsigned short jisx0208_2uni_page21[690] = { /* 0x21 */ 0x3000, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a, 0xff1b, 0xff1f, 0xff01, 0x309b, 0x309c, 0x00b4, 0xff40, 0x00a8, 0xff3e, 0xffe3, 0xff3f, 0x30fd, 0x30fe, 0x309d, 0x309e, 0x3003, 0x4edd, 0x3005, 0x3006, 0x3007, 0x30fc, 0x2015, 0x2010, 0xff0f, 0xff3c, 0x301c, 0x2016, 0xff5c, 0x2026, 0x2025, 0x2018, 0x2019, 0x201c, 0x201d, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d, 0xff5b, 0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0xff0b, 0x2212, 0x00b1, 0x00d7, 0x00f7, 0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267, 0x221e, 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xffe5, 0xff04, 0x00a2, 0x00a3, 0xff05, 0xff03, 0xff06, 0xff0a, 0xff20, 0x00a7, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, /* 0x22 */ 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a, 0x2229, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2227, 0x2228, 0x00ac, 0x21d2, 0x21d4, 0x2200, 0x2203, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, 0x2235, 0x222b, 0x222c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x212b, 0x2030, 0x266f, 0x266d, 0x266a, 0x2020, 0x2021, 0x00b6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x25ef, /* 0x23 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x24 */ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x25 */ 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x26 */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x27 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x28 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c, 0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b, 0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f, 0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542, }; static const unsigned short jisx0208_2uni_page30[6398] = { /* 0x30 */ 0x4e9c, 0x5516, 0x5a03, 0x963f, 0x54c0, 0x611b, 0x6328, 0x59f6, 0x9022, 0x8475, 0x831c, 0x7a50, 0x60aa, 0x63e1, 0x6e25, 0x65ed, 0x8466, 0x82a6, 0x9bf5, 0x6893, 0x5727, 0x65a1, 0x6271, 0x5b9b, 0x59d0, 0x867b, 0x98f4, 0x7d62, 0x7dbe, 0x9b8e, 0x6216, 0x7c9f, 0x88b7, 0x5b89, 0x5eb5, 0x6309, 0x6697, 0x6848, 0x95c7, 0x978d, 0x674f, 0x4ee5, 0x4f0a, 0x4f4d, 0x4f9d, 0x5049, 0x56f2, 0x5937, 0x59d4, 0x5a01, 0x5c09, 0x60df, 0x610f, 0x6170, 0x6613, 0x6905, 0x70ba, 0x754f, 0x7570, 0x79fb, 0x7dad, 0x7def, 0x80c3, 0x840e, 0x8863, 0x8b02, 0x9055, 0x907a, 0x533b, 0x4e95, 0x4ea5, 0x57df, 0x80b2, 0x90c1, 0x78ef, 0x4e00, 0x58f1, 0x6ea2, 0x9038, 0x7a32, 0x8328, 0x828b, 0x9c2f, 0x5141, 0x5370, 0x54bd, 0x54e1, 0x56e0, 0x59fb, 0x5f15, 0x98f2, 0x6deb, 0x80e4, 0x852d, /* 0x31 */ 0x9662, 0x9670, 0x96a0, 0x97fb, 0x540b, 0x53f3, 0x5b87, 0x70cf, 0x7fbd, 0x8fc2, 0x96e8, 0x536f, 0x9d5c, 0x7aba, 0x4e11, 0x7893, 0x81fc, 0x6e26, 0x5618, 0x5504, 0x6b1d, 0x851a, 0x9c3b, 0x59e5, 0x53a9, 0x6d66, 0x74dc, 0x958f, 0x5642, 0x4e91, 0x904b, 0x96f2, 0x834f, 0x990c, 0x53e1, 0x55b6, 0x5b30, 0x5f71, 0x6620, 0x66f3, 0x6804, 0x6c38, 0x6cf3, 0x6d29, 0x745b, 0x76c8, 0x7a4e, 0x9834, 0x82f1, 0x885b, 0x8a60, 0x92ed, 0x6db2, 0x75ab, 0x76ca, 0x99c5, 0x60a6, 0x8b01, 0x8d8a, 0x95b2, 0x698e, 0x53ad, 0x5186, 0x5712, 0x5830, 0x5944, 0x5bb4, 0x5ef6, 0x6028, 0x63a9, 0x63f4, 0x6cbf, 0x6f14, 0x708e, 0x7114, 0x7159, 0x71d5, 0x733f, 0x7e01, 0x8276, 0x82d1, 0x8597, 0x9060, 0x925b, 0x9d1b, 0x5869, 0x65bc, 0x6c5a, 0x7525, 0x51f9, 0x592e, 0x5965, 0x5f80, 0x5fdc, /* 0x32 */ 0x62bc, 0x65fa, 0x6a2a, 0x6b27, 0x6bb4, 0x738b, 0x7fc1, 0x8956, 0x9d2c, 0x9d0e, 0x9ec4, 0x5ca1, 0x6c96, 0x837b, 0x5104, 0x5c4b, 0x61b6, 0x81c6, 0x6876, 0x7261, 0x4e59, 0x4ffa, 0x5378, 0x6069, 0x6e29, 0x7a4f, 0x97f3, 0x4e0b, 0x5316, 0x4eee, 0x4f55, 0x4f3d, 0x4fa1, 0x4f73, 0x52a0, 0x53ef, 0x5609, 0x590f, 0x5ac1, 0x5bb6, 0x5be1, 0x79d1, 0x6687, 0x679c, 0x67b6, 0x6b4c, 0x6cb3, 0x706b, 0x73c2, 0x798d, 0x79be, 0x7a3c, 0x7b87, 0x82b1, 0x82db, 0x8304, 0x8377, 0x83ef, 0x83d3, 0x8766, 0x8ab2, 0x5629, 0x8ca8, 0x8fe6, 0x904e, 0x971e, 0x868a, 0x4fc4, 0x5ce8, 0x6211, 0x7259, 0x753b, 0x81e5, 0x82bd, 0x86fe, 0x8cc0, 0x96c5, 0x9913, 0x99d5, 0x4ecb, 0x4f1a, 0x89e3, 0x56de, 0x584a, 0x58ca, 0x5efb, 0x5feb, 0x602a, 0x6094, 0x6062, 0x61d0, 0x6212, 0x62d0, 0x6539, /* 0x33 */ 0x9b41, 0x6666, 0x68b0, 0x6d77, 0x7070, 0x754c, 0x7686, 0x7d75, 0x82a5, 0x87f9, 0x958b, 0x968e, 0x8c9d, 0x51f1, 0x52be, 0x5916, 0x54b3, 0x5bb3, 0x5d16, 0x6168, 0x6982, 0x6daf, 0x788d, 0x84cb, 0x8857, 0x8a72, 0x93a7, 0x9ab8, 0x6d6c, 0x99a8, 0x86d9, 0x57a3, 0x67ff, 0x86ce, 0x920e, 0x5283, 0x5687, 0x5404, 0x5ed3, 0x62e1, 0x64b9, 0x683c, 0x6838, 0x6bbb, 0x7372, 0x78ba, 0x7a6b, 0x899a, 0x89d2, 0x8d6b, 0x8f03, 0x90ed, 0x95a3, 0x9694, 0x9769, 0x5b66, 0x5cb3, 0x697d, 0x984d, 0x984e, 0x639b, 0x7b20, 0x6a2b, 0x6a7f, 0x68b6, 0x9c0d, 0x6f5f, 0x5272, 0x559d, 0x6070, 0x62ec, 0x6d3b, 0x6e07, 0x6ed1, 0x845b, 0x8910, 0x8f44, 0x4e14, 0x9c39, 0x53f6, 0x691b, 0x6a3a, 0x9784, 0x682a, 0x515c, 0x7ac3, 0x84b2, 0x91dc, 0x938c, 0x565b, 0x9d28, 0x6822, 0x8305, 0x8431, /* 0x34 */ 0x7ca5, 0x5208, 0x82c5, 0x74e6, 0x4e7e, 0x4f83, 0x51a0, 0x5bd2, 0x520a, 0x52d8, 0x52e7, 0x5dfb, 0x559a, 0x582a, 0x59e6, 0x5b8c, 0x5b98, 0x5bdb, 0x5e72, 0x5e79, 0x60a3, 0x611f, 0x6163, 0x61be, 0x63db, 0x6562, 0x67d1, 0x6853, 0x68fa, 0x6b3e, 0x6b53, 0x6c57, 0x6f22, 0x6f97, 0x6f45, 0x74b0, 0x7518, 0x76e3, 0x770b, 0x7aff, 0x7ba1, 0x7c21, 0x7de9, 0x7f36, 0x7ff0, 0x809d, 0x8266, 0x839e, 0x89b3, 0x8acc, 0x8cab, 0x9084, 0x9451, 0x9593, 0x9591, 0x95a2, 0x9665, 0x97d3, 0x9928, 0x8218, 0x4e38, 0x542b, 0x5cb8, 0x5dcc, 0x73a9, 0x764c, 0x773c, 0x5ca9, 0x7feb, 0x8d0b, 0x96c1, 0x9811, 0x9854, 0x9858, 0x4f01, 0x4f0e, 0x5371, 0x559c, 0x5668, 0x57fa, 0x5947, 0x5b09, 0x5bc4, 0x5c90, 0x5e0c, 0x5e7e, 0x5fcc, 0x63ee, 0x673a, 0x65d7, 0x65e2, 0x671f, 0x68cb, 0x68c4, /* 0x35 */ 0x6a5f, 0x5e30, 0x6bc5, 0x6c17, 0x6c7d, 0x757f, 0x7948, 0x5b63, 0x7a00, 0x7d00, 0x5fbd, 0x898f, 0x8a18, 0x8cb4, 0x8d77, 0x8ecc, 0x8f1d, 0x98e2, 0x9a0e, 0x9b3c, 0x4e80, 0x507d, 0x5100, 0x5993, 0x5b9c, 0x622f, 0x6280, 0x64ec, 0x6b3a, 0x72a0, 0x7591, 0x7947, 0x7fa9, 0x87fb, 0x8abc, 0x8b70, 0x63ac, 0x83ca, 0x97a0, 0x5409, 0x5403, 0x55ab, 0x6854, 0x6a58, 0x8a70, 0x7827, 0x6775, 0x9ecd, 0x5374, 0x5ba2, 0x811a, 0x8650, 0x9006, 0x4e18, 0x4e45, 0x4ec7, 0x4f11, 0x53ca, 0x5438, 0x5bae, 0x5f13, 0x6025, 0x6551, 0x673d, 0x6c42, 0x6c72, 0x6ce3, 0x7078, 0x7403, 0x7a76, 0x7aae, 0x7b08, 0x7d1a, 0x7cfe, 0x7d66, 0x65e7, 0x725b, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x62e0, 0x6319, 0x6e20, 0x865a, 0x8a31, 0x8ddd, 0x92f8, 0x6f01, 0x79a6, 0x9b5a, 0x4ea8, 0x4eab, 0x4eac, /* 0x36 */ 0x4f9b, 0x4fa0, 0x50d1, 0x5147, 0x7af6, 0x5171, 0x51f6, 0x5354, 0x5321, 0x537f, 0x53eb, 0x55ac, 0x5883, 0x5ce1, 0x5f37, 0x5f4a, 0x602f, 0x6050, 0x606d, 0x631f, 0x6559, 0x6a4b, 0x6cc1, 0x72c2, 0x72ed, 0x77ef, 0x80f8, 0x8105, 0x8208, 0x854e, 0x90f7, 0x93e1, 0x97ff, 0x9957, 0x9a5a, 0x4ef0, 0x51dd, 0x5c2d, 0x6681, 0x696d, 0x5c40, 0x66f2, 0x6975, 0x7389, 0x6850, 0x7c81, 0x50c5, 0x52e4, 0x5747, 0x5dfe, 0x9326, 0x65a4, 0x6b23, 0x6b3d, 0x7434, 0x7981, 0x79bd, 0x7b4b, 0x7dca, 0x82b9, 0x83cc, 0x887f, 0x895f, 0x8b39, 0x8fd1, 0x91d1, 0x541f, 0x9280, 0x4e5d, 0x5036, 0x53e5, 0x533a, 0x72d7, 0x7396, 0x77e9, 0x82e6, 0x8eaf, 0x99c6, 0x99c8, 0x99d2, 0x5177, 0x611a, 0x865e, 0x55b0, 0x7a7a, 0x5076, 0x5bd3, 0x9047, 0x9685, 0x4e32, 0x6adb, 0x91e7, 0x5c51, 0x5c48, /* 0x37 */ 0x6398, 0x7a9f, 0x6c93, 0x9774, 0x8f61, 0x7aaa, 0x718a, 0x9688, 0x7c82, 0x6817, 0x7e70, 0x6851, 0x936c, 0x52f2, 0x541b, 0x85ab, 0x8a13, 0x7fa4, 0x8ecd, 0x90e1, 0x5366, 0x8888, 0x7941, 0x4fc2, 0x50be, 0x5211, 0x5144, 0x5553, 0x572d, 0x73ea, 0x578b, 0x5951, 0x5f62, 0x5f84, 0x6075, 0x6176, 0x6167, 0x61a9, 0x63b2, 0x643a, 0x656c, 0x666f, 0x6842, 0x6e13, 0x7566, 0x7a3d, 0x7cfb, 0x7d4c, 0x7d99, 0x7e4b, 0x7f6b, 0x830e, 0x834a, 0x86cd, 0x8a08, 0x8a63, 0x8b66, 0x8efd, 0x981a, 0x9d8f, 0x82b8, 0x8fce, 0x9be8, 0x5287, 0x621f, 0x6483, 0x6fc0, 0x9699, 0x6841, 0x5091, 0x6b20, 0x6c7a, 0x6f54, 0x7a74, 0x7d50, 0x8840, 0x8a23, 0x6708, 0x4ef6, 0x5039, 0x5026, 0x5065, 0x517c, 0x5238, 0x5263, 0x55a7, 0x570f, 0x5805, 0x5acc, 0x5efa, 0x61b2, 0x61f8, 0x62f3, 0x6372, /* 0x38 */ 0x691c, 0x6a29, 0x727d, 0x72ac, 0x732e, 0x7814, 0x786f, 0x7d79, 0x770c, 0x80a9, 0x898b, 0x8b19, 0x8ce2, 0x8ed2, 0x9063, 0x9375, 0x967a, 0x9855, 0x9a13, 0x9e78, 0x5143, 0x539f, 0x53b3, 0x5e7b, 0x5f26, 0x6e1b, 0x6e90, 0x7384, 0x73fe, 0x7d43, 0x8237, 0x8a00, 0x8afa, 0x9650, 0x4e4e, 0x500b, 0x53e4, 0x547c, 0x56fa, 0x59d1, 0x5b64, 0x5df1, 0x5eab, 0x5f27, 0x6238, 0x6545, 0x67af, 0x6e56, 0x72d0, 0x7cca, 0x88b4, 0x80a1, 0x80e1, 0x83f0, 0x864e, 0x8a87, 0x8de8, 0x9237, 0x96c7, 0x9867, 0x9f13, 0x4e94, 0x4e92, 0x4f0d, 0x5348, 0x5449, 0x543e, 0x5a2f, 0x5f8c, 0x5fa1, 0x609f, 0x68a7, 0x6a8e, 0x745a, 0x7881, 0x8a9e, 0x8aa4, 0x8b77, 0x9190, 0x4e5e, 0x9bc9, 0x4ea4, 0x4f7c, 0x4faf, 0x5019, 0x5016, 0x5149, 0x516c, 0x529f, 0x52b9, 0x52fe, 0x539a, 0x53e3, 0x5411, /* 0x39 */ 0x540e, 0x5589, 0x5751, 0x57a2, 0x597d, 0x5b54, 0x5b5d, 0x5b8f, 0x5de5, 0x5de7, 0x5df7, 0x5e78, 0x5e83, 0x5e9a, 0x5eb7, 0x5f18, 0x6052, 0x614c, 0x6297, 0x62d8, 0x63a7, 0x653b, 0x6602, 0x6643, 0x66f4, 0x676d, 0x6821, 0x6897, 0x69cb, 0x6c5f, 0x6d2a, 0x6d69, 0x6e2f, 0x6e9d, 0x7532, 0x7687, 0x786c, 0x7a3f, 0x7ce0, 0x7d05, 0x7d18, 0x7d5e, 0x7db1, 0x8015, 0x8003, 0x80af, 0x80b1, 0x8154, 0x818f, 0x822a, 0x8352, 0x884c, 0x8861, 0x8b1b, 0x8ca2, 0x8cfc, 0x90ca, 0x9175, 0x9271, 0x783f, 0x92fc, 0x95a4, 0x964d, 0x9805, 0x9999, 0x9ad8, 0x9d3b, 0x525b, 0x52ab, 0x53f7, 0x5408, 0x58d5, 0x62f7, 0x6fe0, 0x8c6a, 0x8f5f, 0x9eb9, 0x514b, 0x523b, 0x544a, 0x56fd, 0x7a40, 0x9177, 0x9d60, 0x9ed2, 0x7344, 0x6f09, 0x8170, 0x7511, 0x5ffd, 0x60da, 0x9aa8, 0x72db, 0x8fbc, /* 0x3a */ 0x6b64, 0x9803, 0x4eca, 0x56f0, 0x5764, 0x58be, 0x5a5a, 0x6068, 0x61c7, 0x660f, 0x6606, 0x6839, 0x68b1, 0x6df7, 0x75d5, 0x7d3a, 0x826e, 0x9b42, 0x4e9b, 0x4f50, 0x53c9, 0x5506, 0x5d6f, 0x5de6, 0x5dee, 0x67fb, 0x6c99, 0x7473, 0x7802, 0x8a50, 0x9396, 0x88df, 0x5750, 0x5ea7, 0x632b, 0x50b5, 0x50ac, 0x518d, 0x6700, 0x54c9, 0x585e, 0x59bb, 0x5bb0, 0x5f69, 0x624d, 0x63a1, 0x683d, 0x6b73, 0x6e08, 0x707d, 0x91c7, 0x7280, 0x7815, 0x7826, 0x796d, 0x658e, 0x7d30, 0x83dc, 0x88c1, 0x8f09, 0x969b, 0x5264, 0x5728, 0x6750, 0x7f6a, 0x8ca1, 0x51b4, 0x5742, 0x962a, 0x583a, 0x698a, 0x80b4, 0x54b2, 0x5d0e, 0x57fc, 0x7895, 0x9dfa, 0x4f5c, 0x524a, 0x548b, 0x643e, 0x6628, 0x6714, 0x67f5, 0x7a84, 0x7b56, 0x7d22, 0x932f, 0x685c, 0x9bad, 0x7b39, 0x5319, 0x518a, 0x5237, /* 0x3b */ 0x5bdf, 0x62f6, 0x64ae, 0x64e6, 0x672d, 0x6bba, 0x85a9, 0x96d1, 0x7690, 0x9bd6, 0x634c, 0x9306, 0x9bab, 0x76bf, 0x6652, 0x4e09, 0x5098, 0x53c2, 0x5c71, 0x60e8, 0x6492, 0x6563, 0x685f, 0x71e6, 0x73ca, 0x7523, 0x7b97, 0x7e82, 0x8695, 0x8b83, 0x8cdb, 0x9178, 0x9910, 0x65ac, 0x66ab, 0x6b8b, 0x4ed5, 0x4ed4, 0x4f3a, 0x4f7f, 0x523a, 0x53f8, 0x53f2, 0x55e3, 0x56db, 0x58eb, 0x59cb, 0x59c9, 0x59ff, 0x5b50, 0x5c4d, 0x5e02, 0x5e2b, 0x5fd7, 0x601d, 0x6307, 0x652f, 0x5b5c, 0x65af, 0x65bd, 0x65e8, 0x679d, 0x6b62, 0x6b7b, 0x6c0f, 0x7345, 0x7949, 0x79c1, 0x7cf8, 0x7d19, 0x7d2b, 0x80a2, 0x8102, 0x81f3, 0x8996, 0x8a5e, 0x8a69, 0x8a66, 0x8a8c, 0x8aee, 0x8cc7, 0x8cdc, 0x96cc, 0x98fc, 0x6b6f, 0x4e8b, 0x4f3c, 0x4f8d, 0x5150, 0x5b57, 0x5bfa, 0x6148, 0x6301, 0x6642, /* 0x3c */ 0x6b21, 0x6ecb, 0x6cbb, 0x723e, 0x74bd, 0x75d4, 0x78c1, 0x793a, 0x800c, 0x8033, 0x81ea, 0x8494, 0x8f9e, 0x6c50, 0x9e7f, 0x5f0f, 0x8b58, 0x9d2b, 0x7afa, 0x8ef8, 0x5b8d, 0x96eb, 0x4e03, 0x53f1, 0x57f7, 0x5931, 0x5ac9, 0x5ba4, 0x6089, 0x6e7f, 0x6f06, 0x75be, 0x8cea, 0x5b9f, 0x8500, 0x7be0, 0x5072, 0x67f4, 0x829d, 0x5c61, 0x854a, 0x7e1e, 0x820e, 0x5199, 0x5c04, 0x6368, 0x8d66, 0x659c, 0x716e, 0x793e, 0x7d17, 0x8005, 0x8b1d, 0x8eca, 0x906e, 0x86c7, 0x90aa, 0x501f, 0x52fa, 0x5c3a, 0x6753, 0x707c, 0x7235, 0x914c, 0x91c8, 0x932b, 0x82e5, 0x5bc2, 0x5f31, 0x60f9, 0x4e3b, 0x53d6, 0x5b88, 0x624b, 0x6731, 0x6b8a, 0x72e9, 0x73e0, 0x7a2e, 0x816b, 0x8da3, 0x9152, 0x9996, 0x5112, 0x53d7, 0x546a, 0x5bff, 0x6388, 0x6a39, 0x7dac, 0x9700, 0x56da, 0x53ce, 0x5468, /* 0x3d */ 0x5b97, 0x5c31, 0x5dde, 0x4fee, 0x6101, 0x62fe, 0x6d32, 0x79c0, 0x79cb, 0x7d42, 0x7e4d, 0x7fd2, 0x81ed, 0x821f, 0x8490, 0x8846, 0x8972, 0x8b90, 0x8e74, 0x8f2f, 0x9031, 0x914b, 0x916c, 0x96c6, 0x919c, 0x4ec0, 0x4f4f, 0x5145, 0x5341, 0x5f93, 0x620e, 0x67d4, 0x6c41, 0x6e0b, 0x7363, 0x7e26, 0x91cd, 0x9283, 0x53d4, 0x5919, 0x5bbf, 0x6dd1, 0x795d, 0x7e2e, 0x7c9b, 0x587e, 0x719f, 0x51fa, 0x8853, 0x8ff0, 0x4fca, 0x5cfb, 0x6625, 0x77ac, 0x7ae3, 0x821c, 0x99ff, 0x51c6, 0x5faa, 0x65ec, 0x696f, 0x6b89, 0x6df3, 0x6e96, 0x6f64, 0x76fe, 0x7d14, 0x5de1, 0x9075, 0x9187, 0x9806, 0x51e6, 0x521d, 0x6240, 0x6691, 0x66d9, 0x6e1a, 0x5eb6, 0x7dd2, 0x7f72, 0x66f8, 0x85af, 0x85f7, 0x8af8, 0x52a9, 0x53d9, 0x5973, 0x5e8f, 0x5f90, 0x6055, 0x92e4, 0x9664, 0x50b7, 0x511f, /* 0x3e */ 0x52dd, 0x5320, 0x5347, 0x53ec, 0x54e8, 0x5546, 0x5531, 0x5617, 0x5968, 0x59be, 0x5a3c, 0x5bb5, 0x5c06, 0x5c0f, 0x5c11, 0x5c1a, 0x5e84, 0x5e8a, 0x5ee0, 0x5f70, 0x627f, 0x6284, 0x62db, 0x638c, 0x6377, 0x6607, 0x660c, 0x662d, 0x6676, 0x677e, 0x68a2, 0x6a1f, 0x6a35, 0x6cbc, 0x6d88, 0x6e09, 0x6e58, 0x713c, 0x7126, 0x7167, 0x75c7, 0x7701, 0x785d, 0x7901, 0x7965, 0x79f0, 0x7ae0, 0x7b11, 0x7ca7, 0x7d39, 0x8096, 0x83d6, 0x848b, 0x8549, 0x885d, 0x88f3, 0x8a1f, 0x8a3c, 0x8a54, 0x8a73, 0x8c61, 0x8cde, 0x91a4, 0x9266, 0x937e, 0x9418, 0x969c, 0x9798, 0x4e0a, 0x4e08, 0x4e1e, 0x4e57, 0x5197, 0x5270, 0x57ce, 0x5834, 0x58cc, 0x5b22, 0x5e38, 0x60c5, 0x64fe, 0x6761, 0x6756, 0x6d44, 0x72b6, 0x7573, 0x7a63, 0x84b8, 0x8b72, 0x91b8, 0x9320, 0x5631, 0x57f4, 0x98fe, /* 0x3f */ 0x62ed, 0x690d, 0x6b96, 0x71ed, 0x7e54, 0x8077, 0x8272, 0x89e6, 0x98df, 0x8755, 0x8fb1, 0x5c3b, 0x4f38, 0x4fe1, 0x4fb5, 0x5507, 0x5a20, 0x5bdd, 0x5be9, 0x5fc3, 0x614e, 0x632f, 0x65b0, 0x664b, 0x68ee, 0x699b, 0x6d78, 0x6df1, 0x7533, 0x75b9, 0x771f, 0x795e, 0x79e6, 0x7d33, 0x81e3, 0x82af, 0x85aa, 0x89aa, 0x8a3a, 0x8eab, 0x8f9b, 0x9032, 0x91dd, 0x9707, 0x4eba, 0x4ec1, 0x5203, 0x5875, 0x58ec, 0x5c0b, 0x751a, 0x5c3d, 0x814e, 0x8a0a, 0x8fc5, 0x9663, 0x976d, 0x7b25, 0x8acf, 0x9808, 0x9162, 0x56f3, 0x53a8, 0x9017, 0x5439, 0x5782, 0x5e25, 0x63a8, 0x6c34, 0x708a, 0x7761, 0x7c8b, 0x7fe0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968f, 0x745e, 0x9ac4, 0x5d07, 0x5d69, 0x6570, 0x67a2, 0x8da8, 0x96db, 0x636e, 0x6749, 0x6919, 0x83c5, 0x9817, 0x96c0, 0x88fe, /* 0x40 */ 0x6f84, 0x647a, 0x5bf8, 0x4e16, 0x702c, 0x755d, 0x662f, 0x51c4, 0x5236, 0x52e2, 0x59d3, 0x5f81, 0x6027, 0x6210, 0x653f, 0x6574, 0x661f, 0x6674, 0x68f2, 0x6816, 0x6b63, 0x6e05, 0x7272, 0x751f, 0x76db, 0x7cbe, 0x8056, 0x58f0, 0x88fd, 0x897f, 0x8aa0, 0x8a93, 0x8acb, 0x901d, 0x9192, 0x9752, 0x9759, 0x6589, 0x7a0e, 0x8106, 0x96bb, 0x5e2d, 0x60dc, 0x621a, 0x65a5, 0x6614, 0x6790, 0x77f3, 0x7a4d, 0x7c4d, 0x7e3e, 0x810a, 0x8cac, 0x8d64, 0x8de1, 0x8e5f, 0x78a9, 0x5207, 0x62d9, 0x63a5, 0x6442, 0x6298, 0x8a2d, 0x7a83, 0x7bc0, 0x8aac, 0x96ea, 0x7d76, 0x820c, 0x8749, 0x4ed9, 0x5148, 0x5343, 0x5360, 0x5ba3, 0x5c02, 0x5c16, 0x5ddd, 0x6226, 0x6247, 0x64b0, 0x6813, 0x6834, 0x6cc9, 0x6d45, 0x6d17, 0x67d3, 0x6f5c, 0x714e, 0x717d, 0x65cb, 0x7a7f, 0x7bad, 0x7dda, /* 0x41 */ 0x7e4a, 0x7fa8, 0x817a, 0x821b, 0x8239, 0x85a6, 0x8a6e, 0x8cce, 0x8df5, 0x9078, 0x9077, 0x92ad, 0x9291, 0x9583, 0x9bae, 0x524d, 0x5584, 0x6f38, 0x7136, 0x5168, 0x7985, 0x7e55, 0x81b3, 0x7cce, 0x564c, 0x5851, 0x5ca8, 0x63aa, 0x66fe, 0x66fd, 0x695a, 0x72d9, 0x758f, 0x758e, 0x790e, 0x7956, 0x79df, 0x7c97, 0x7d20, 0x7d44, 0x8607, 0x8a34, 0x963b, 0x9061, 0x9f20, 0x50e7, 0x5275, 0x53cc, 0x53e2, 0x5009, 0x55aa, 0x58ee, 0x594f, 0x723d, 0x5b8b, 0x5c64, 0x531d, 0x60e3, 0x60f3, 0x635c, 0x6383, 0x633f, 0x63bb, 0x64cd, 0x65e9, 0x66f9, 0x5de3, 0x69cd, 0x69fd, 0x6f15, 0x71e5, 0x4e89, 0x75e9, 0x76f8, 0x7a93, 0x7cdf, 0x7dcf, 0x7d9c, 0x8061, 0x8349, 0x8358, 0x846c, 0x84bc, 0x85fb, 0x88c5, 0x8d70, 0x9001, 0x906d, 0x9397, 0x971c, 0x9a12, 0x50cf, 0x5897, 0x618e, /* 0x42 */ 0x81d3, 0x8535, 0x8d08, 0x9020, 0x4fc3, 0x5074, 0x5247, 0x5373, 0x606f, 0x6349, 0x675f, 0x6e2c, 0x8db3, 0x901f, 0x4fd7, 0x5c5e, 0x8cca, 0x65cf, 0x7d9a, 0x5352, 0x8896, 0x5176, 0x63c3, 0x5b58, 0x5b6b, 0x5c0a, 0x640d, 0x6751, 0x905c, 0x4ed6, 0x591a, 0x592a, 0x6c70, 0x8a51, 0x553e, 0x5815, 0x59a5, 0x60f0, 0x6253, 0x67c1, 0x8235, 0x6955, 0x9640, 0x99c4, 0x9a28, 0x4f53, 0x5806, 0x5bfe, 0x8010, 0x5cb1, 0x5e2f, 0x5f85, 0x6020, 0x614b, 0x6234, 0x66ff, 0x6cf0, 0x6ede, 0x80ce, 0x817f, 0x82d4, 0x888b, 0x8cb8, 0x9000, 0x902e, 0x968a, 0x9edb, 0x9bdb, 0x4ee3, 0x53f0, 0x5927, 0x7b2c, 0x918d, 0x984c, 0x9df9, 0x6edd, 0x7027, 0x5353, 0x5544, 0x5b85, 0x6258, 0x629e, 0x62d3, 0x6ca2, 0x6fef, 0x7422, 0x8a17, 0x9438, 0x6fc1, 0x8afe, 0x8338, 0x51e7, 0x86f8, 0x53ea, /* 0x43 */ 0x53e9, 0x4f46, 0x9054, 0x8fb0, 0x596a, 0x8131, 0x5dfd, 0x7aea, 0x8fbf, 0x68da, 0x8c37, 0x72f8, 0x9c48, 0x6a3d, 0x8ab0, 0x4e39, 0x5358, 0x5606, 0x5766, 0x62c5, 0x63a2, 0x65e6, 0x6b4e, 0x6de1, 0x6e5b, 0x70ad, 0x77ed, 0x7aef, 0x7baa, 0x7dbb, 0x803d, 0x80c6, 0x86cb, 0x8a95, 0x935b, 0x56e3, 0x58c7, 0x5f3e, 0x65ad, 0x6696, 0x6a80, 0x6bb5, 0x7537, 0x8ac7, 0x5024, 0x77e5, 0x5730, 0x5f1b, 0x6065, 0x667a, 0x6c60, 0x75f4, 0x7a1a, 0x7f6e, 0x81f4, 0x8718, 0x9045, 0x99b3, 0x7bc9, 0x755c, 0x7af9, 0x7b51, 0x84c4, 0x9010, 0x79e9, 0x7a92, 0x8336, 0x5ae1, 0x7740, 0x4e2d, 0x4ef2, 0x5b99, 0x5fe0, 0x62bd, 0x663c, 0x67f1, 0x6ce8, 0x866b, 0x8877, 0x8a3b, 0x914e, 0x92f3, 0x99d0, 0x6a17, 0x7026, 0x732a, 0x82e7, 0x8457, 0x8caf, 0x4e01, 0x5146, 0x51cb, 0x558b, 0x5bf5, /* 0x44 */ 0x5e16, 0x5e33, 0x5e81, 0x5f14, 0x5f35, 0x5f6b, 0x5fb4, 0x61f2, 0x6311, 0x66a2, 0x671d, 0x6f6e, 0x7252, 0x753a, 0x773a, 0x8074, 0x8139, 0x8178, 0x8776, 0x8abf, 0x8adc, 0x8d85, 0x8df3, 0x929a, 0x9577, 0x9802, 0x9ce5, 0x52c5, 0x6357, 0x76f4, 0x6715, 0x6c88, 0x73cd, 0x8cc3, 0x93ae, 0x9673, 0x6d25, 0x589c, 0x690e, 0x69cc, 0x8ffd, 0x939a, 0x75db, 0x901a, 0x585a, 0x6802, 0x63b4, 0x69fb, 0x4f43, 0x6f2c, 0x67d8, 0x8fbb, 0x8526, 0x7db4, 0x9354, 0x693f, 0x6f70, 0x576a, 0x58f7, 0x5b2c, 0x7d2c, 0x722a, 0x540a, 0x91e3, 0x9db4, 0x4ead, 0x4f4e, 0x505c, 0x5075, 0x5243, 0x8c9e, 0x5448, 0x5824, 0x5b9a, 0x5e1d, 0x5e95, 0x5ead, 0x5ef7, 0x5f1f, 0x608c, 0x62b5, 0x633a, 0x63d0, 0x68af, 0x6c40, 0x7887, 0x798e, 0x7a0b, 0x7de0, 0x8247, 0x8a02, 0x8ae6, 0x8e44, 0x9013, /* 0x45 */ 0x90b8, 0x912d, 0x91d8, 0x9f0e, 0x6ce5, 0x6458, 0x64e2, 0x6575, 0x6ef4, 0x7684, 0x7b1b, 0x9069, 0x93d1, 0x6eba, 0x54f2, 0x5fb9, 0x64a4, 0x8f4d, 0x8fed, 0x9244, 0x5178, 0x586b, 0x5929, 0x5c55, 0x5e97, 0x6dfb, 0x7e8f, 0x751c, 0x8cbc, 0x8ee2, 0x985b, 0x70b9, 0x4f1d, 0x6bbf, 0x6fb1, 0x7530, 0x96fb, 0x514e, 0x5410, 0x5835, 0x5857, 0x59ac, 0x5c60, 0x5f92, 0x6597, 0x675c, 0x6e21, 0x767b, 0x83df, 0x8ced, 0x9014, 0x90fd, 0x934d, 0x7825, 0x783a, 0x52aa, 0x5ea6, 0x571f, 0x5974, 0x6012, 0x5012, 0x515a, 0x51ac, 0x51cd, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5b95, 0x5cf6, 0x5d8b, 0x60bc, 0x6295, 0x642d, 0x6771, 0x6843, 0x68bc, 0x68df, 0x76d7, 0x6dd8, 0x6e6f, 0x6d9b, 0x706f, 0x71c8, 0x5f53, 0x75d8, 0x7977, 0x7b49, 0x7b54, 0x7b52, 0x7cd6, 0x7d71, 0x5230, /* 0x46 */ 0x8463, 0x8569, 0x85e4, 0x8a0e, 0x8b04, 0x8c46, 0x8e0f, 0x9003, 0x900f, 0x9419, 0x9676, 0x982d, 0x9a30, 0x95d8, 0x50cd, 0x52d5, 0x540c, 0x5802, 0x5c0e, 0x61a7, 0x649e, 0x6d1e, 0x77b3, 0x7ae5, 0x80f4, 0x8404, 0x9053, 0x9285, 0x5ce0, 0x9d07, 0x533f, 0x5f97, 0x5fb3, 0x6d9c, 0x7279, 0x7763, 0x79bf, 0x7be4, 0x6bd2, 0x72ec, 0x8aad, 0x6803, 0x6a61, 0x51f8, 0x7a81, 0x6934, 0x5c4a, 0x9cf6, 0x82eb, 0x5bc5, 0x9149, 0x701e, 0x5678, 0x5c6f, 0x60c7, 0x6566, 0x6c8c, 0x8c5a, 0x9041, 0x9813, 0x5451, 0x66c7, 0x920d, 0x5948, 0x90a3, 0x5185, 0x4e4d, 0x51ea, 0x8599, 0x8b0e, 0x7058, 0x637a, 0x934b, 0x6962, 0x99b4, 0x7e04, 0x7577, 0x5357, 0x6960, 0x8edf, 0x96e3, 0x6c5d, 0x4e8c, 0x5c3c, 0x5f10, 0x8fe9, 0x5302, 0x8cd1, 0x8089, 0x8679, 0x5eff, 0x65e5, 0x4e73, 0x5165, /* 0x47 */ 0x5982, 0x5c3f, 0x97ee, 0x4efb, 0x598a, 0x5fcd, 0x8a8d, 0x6fe1, 0x79b0, 0x7962, 0x5be7, 0x8471, 0x732b, 0x71b1, 0x5e74, 0x5ff5, 0x637b, 0x649a, 0x71c3, 0x7c98, 0x4e43, 0x5efc, 0x4e4b, 0x57dc, 0x56a2, 0x60a9, 0x6fc3, 0x7d0d, 0x80fd, 0x8133, 0x81bf, 0x8fb2, 0x8997, 0x86a4, 0x5df4, 0x628a, 0x64ad, 0x8987, 0x6777, 0x6ce2, 0x6d3e, 0x7436, 0x7834, 0x5a46, 0x7f75, 0x82ad, 0x99ac, 0x4ff3, 0x5ec3, 0x62dd, 0x6392, 0x6557, 0x676f, 0x76c3, 0x724c, 0x80cc, 0x80ba, 0x8f29, 0x914d, 0x500d, 0x57f9, 0x5a92, 0x6885, 0x6973, 0x7164, 0x72fd, 0x8cb7, 0x58f2, 0x8ce0, 0x966a, 0x9019, 0x877f, 0x79e4, 0x77e7, 0x8429, 0x4f2f, 0x5265, 0x535a, 0x62cd, 0x67cf, 0x6cca, 0x767d, 0x7b94, 0x7c95, 0x8236, 0x8584, 0x8feb, 0x66dd, 0x6f20, 0x7206, 0x7e1b, 0x83ab, 0x99c1, 0x9ea6, /* 0x48 */ 0x51fd, 0x7bb1, 0x7872, 0x7bb8, 0x8087, 0x7b48, 0x6ae8, 0x5e61, 0x808c, 0x7551, 0x7560, 0x516b, 0x9262, 0x6e8c, 0x767a, 0x9197, 0x9aea, 0x4f10, 0x7f70, 0x629c, 0x7b4f, 0x95a5, 0x9ce9, 0x567a, 0x5859, 0x86e4, 0x96bc, 0x4f34, 0x5224, 0x534a, 0x53cd, 0x53db, 0x5e06, 0x642c, 0x6591, 0x677f, 0x6c3e, 0x6c4e, 0x7248, 0x72af, 0x73ed, 0x7554, 0x7e41, 0x822c, 0x85e9, 0x8ca9, 0x7bc4, 0x91c6, 0x7169, 0x9812, 0x98ef, 0x633d, 0x6669, 0x756a, 0x76e4, 0x78d0, 0x8543, 0x86ee, 0x532a, 0x5351, 0x5426, 0x5983, 0x5e87, 0x5f7c, 0x60b2, 0x6249, 0x6279, 0x62ab, 0x6590, 0x6bd4, 0x6ccc, 0x75b2, 0x76ae, 0x7891, 0x79d8, 0x7dcb, 0x7f77, 0x80a5, 0x88ab, 0x8ab9, 0x8cbb, 0x907f, 0x975e, 0x98db, 0x6a0b, 0x7c38, 0x5099, 0x5c3e, 0x5fae, 0x6787, 0x6bd8, 0x7435, 0x7709, 0x7f8e, /* 0x49 */ 0x9f3b, 0x67ca, 0x7a17, 0x5339, 0x758b, 0x9aed, 0x5f66, 0x819d, 0x83f1, 0x8098, 0x5f3c, 0x5fc5, 0x7562, 0x7b46, 0x903c, 0x6867, 0x59eb, 0x5a9b, 0x7d10, 0x767e, 0x8b2c, 0x4ff5, 0x5f6a, 0x6a19, 0x6c37, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8a55, 0x8c79, 0x5edf, 0x63cf, 0x75c5, 0x79d2, 0x82d7, 0x9328, 0x92f2, 0x849c, 0x86ed, 0x9c2d, 0x54c1, 0x5f6c, 0x658c, 0x6d5c, 0x7015, 0x8ca7, 0x8cd3, 0x983b, 0x654f, 0x74f6, 0x4e0d, 0x4ed8, 0x57e0, 0x592b, 0x5a66, 0x5bcc, 0x51a8, 0x5e03, 0x5e9c, 0x6016, 0x6276, 0x6577, 0x65a7, 0x666e, 0x6d6e, 0x7236, 0x7b26, 0x8150, 0x819a, 0x8299, 0x8b5c, 0x8ca0, 0x8ce6, 0x8d74, 0x961c, 0x9644, 0x4fae, 0x64ab, 0x6b66, 0x821e, 0x8461, 0x856a, 0x90e8, 0x5c01, 0x6953, 0x98a8, 0x847a, 0x8557, 0x4f0f, 0x526f, 0x5fa9, 0x5e45, 0x670d, /* 0x4a */ 0x798f, 0x8179, 0x8907, 0x8986, 0x6df5, 0x5f17, 0x6255, 0x6cb8, 0x4ecf, 0x7269, 0x9b92, 0x5206, 0x543b, 0x5674, 0x58b3, 0x61a4, 0x626e, 0x711a, 0x596e, 0x7c89, 0x7cde, 0x7d1b, 0x96f0, 0x6587, 0x805e, 0x4e19, 0x4f75, 0x5175, 0x5840, 0x5e63, 0x5e73, 0x5f0a, 0x67c4, 0x4e26, 0x853d, 0x9589, 0x965b, 0x7c73, 0x9801, 0x50fb, 0x58c1, 0x7656, 0x78a7, 0x5225, 0x77a5, 0x8511, 0x7b86, 0x504f, 0x5909, 0x7247, 0x7bc7, 0x7de8, 0x8fba, 0x8fd4, 0x904d, 0x4fbf, 0x52c9, 0x5a29, 0x5f01, 0x97ad, 0x4fdd, 0x8217, 0x92ea, 0x5703, 0x6355, 0x6b69, 0x752b, 0x88dc, 0x8f14, 0x7a42, 0x52df, 0x5893, 0x6155, 0x620a, 0x66ae, 0x6bcd, 0x7c3f, 0x83e9, 0x5023, 0x4ff8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5b9d, 0x5cf0, 0x5cef, 0x5d29, 0x5e96, 0x62b1, 0x6367, 0x653e, 0x65b9, 0x670b, /* 0x4b */ 0x6cd5, 0x6ce1, 0x70f9, 0x7832, 0x7e2b, 0x80de, 0x82b3, 0x840c, 0x84ec, 0x8702, 0x8912, 0x8a2a, 0x8c4a, 0x90a6, 0x92d2, 0x98fd, 0x9cf3, 0x9d6c, 0x4e4f, 0x4ea1, 0x508d, 0x5256, 0x574a, 0x59a8, 0x5e3d, 0x5fd8, 0x5fd9, 0x623f, 0x66b4, 0x671b, 0x67d0, 0x68d2, 0x5192, 0x7d21, 0x80aa, 0x81a8, 0x8b00, 0x8c8c, 0x8cbf, 0x927e, 0x9632, 0x5420, 0x982c, 0x5317, 0x50d5, 0x535c, 0x58a8, 0x64b2, 0x6734, 0x7267, 0x7766, 0x7a46, 0x91e6, 0x52c3, 0x6ca1, 0x6b86, 0x5800, 0x5e4c, 0x5954, 0x672c, 0x7ffb, 0x51e1, 0x76c6, 0x6469, 0x78e8, 0x9b54, 0x9ebb, 0x57cb, 0x59b9, 0x6627, 0x679a, 0x6bce, 0x54e9, 0x69d9, 0x5e55, 0x819c, 0x6795, 0x9baa, 0x67fe, 0x9c52, 0x685d, 0x4ea6, 0x4fe3, 0x53c8, 0x62b9, 0x672b, 0x6cab, 0x8fc4, 0x4fad, 0x7e6d, 0x9ebf, 0x4e07, 0x6162, 0x6e80, /* 0x4c */ 0x6f2b, 0x8513, 0x5473, 0x672a, 0x9b45, 0x5df3, 0x7b95, 0x5cac, 0x5bc6, 0x871c, 0x6e4a, 0x84d1, 0x7a14, 0x8108, 0x5999, 0x7c8d, 0x6c11, 0x7720, 0x52d9, 0x5922, 0x7121, 0x725f, 0x77db, 0x9727, 0x9d61, 0x690b, 0x5a7f, 0x5a18, 0x51a5, 0x540d, 0x547d, 0x660e, 0x76df, 0x8ff7, 0x9298, 0x9cf4, 0x59ea, 0x725d, 0x6ec5, 0x514d, 0x68c9, 0x7dbf, 0x7dec, 0x9762, 0x9eba, 0x6478, 0x6a21, 0x8302, 0x5984, 0x5b5f, 0x6bdb, 0x731b, 0x76f2, 0x7db2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ed9, 0x76ee, 0x6762, 0x52ff, 0x9905, 0x5c24, 0x623b, 0x7c7e, 0x8cb0, 0x554f, 0x60b6, 0x7d0b, 0x9580, 0x5301, 0x4e5f, 0x51b6, 0x591c, 0x723a, 0x8036, 0x91ce, 0x5f25, 0x77e2, 0x5384, 0x5f79, 0x7d04, 0x85ac, 0x8a33, 0x8e8d, 0x9756, 0x67f3, 0x85ae, 0x9453, 0x6109, 0x6108, 0x6cb9, 0x7652, /* 0x4d */ 0x8aed, 0x8f38, 0x552f, 0x4f51, 0x512a, 0x52c7, 0x53cb, 0x5ba5, 0x5e7d, 0x60a0, 0x6182, 0x63d6, 0x6709, 0x67da, 0x6e67, 0x6d8c, 0x7336, 0x7337, 0x7531, 0x7950, 0x88d5, 0x8a98, 0x904a, 0x9091, 0x90f5, 0x96c4, 0x878d, 0x5915, 0x4e88, 0x4f59, 0x4e0e, 0x8a89, 0x8f3f, 0x9810, 0x50ad, 0x5e7c, 0x5996, 0x5bb9, 0x5eb8, 0x63da, 0x63fa, 0x64c1, 0x66dc, 0x694a, 0x69d8, 0x6d0b, 0x6eb6, 0x7194, 0x7528, 0x7aaf, 0x7f8a, 0x8000, 0x8449, 0x84c9, 0x8981, 0x8b21, 0x8e0a, 0x9065, 0x967d, 0x990a, 0x617e, 0x6291, 0x6b32, 0x6c83, 0x6d74, 0x7fcc, 0x7ffc, 0x6dc0, 0x7f85, 0x87ba, 0x88f8, 0x6765, 0x83b1, 0x983c, 0x96f7, 0x6d1b, 0x7d61, 0x843d, 0x916a, 0x4e71, 0x5375, 0x5d50, 0x6b04, 0x6feb, 0x85cd, 0x862d, 0x89a7, 0x5229, 0x540f, 0x5c65, 0x674e, 0x68a8, 0x7406, 0x7483, /* 0x4e */ 0x75e2, 0x88cf, 0x88e1, 0x91cc, 0x96e2, 0x9678, 0x5f8b, 0x7387, 0x7acb, 0x844e, 0x63a0, 0x7565, 0x5289, 0x6d41, 0x6e9c, 0x7409, 0x7559, 0x786b, 0x7c92, 0x9686, 0x7adc, 0x9f8d, 0x4fb6, 0x616e, 0x65c5, 0x865c, 0x4e86, 0x4eae, 0x50da, 0x4e21, 0x51cc, 0x5bee, 0x6599, 0x6881, 0x6dbc, 0x731f, 0x7642, 0x77ad, 0x7a1c, 0x7ce7, 0x826f, 0x8ad2, 0x907c, 0x91cf, 0x9675, 0x9818, 0x529b, 0x7dd1, 0x502b, 0x5398, 0x6797, 0x6dcb, 0x71d0, 0x7433, 0x81e8, 0x8f2a, 0x96a3, 0x9c57, 0x9e9f, 0x7460, 0x5841, 0x6d99, 0x7d2f, 0x985e, 0x4ee4, 0x4f36, 0x4f8b, 0x51b7, 0x52b1, 0x5dba, 0x601c, 0x73b2, 0x793c, 0x82d3, 0x9234, 0x96b7, 0x96f6, 0x970a, 0x9e97, 0x9f62, 0x66a6, 0x6b74, 0x5217, 0x52a3, 0x70c8, 0x88c2, 0x5ec9, 0x604b, 0x6190, 0x6f23, 0x7149, 0x7c3e, 0x7df4, 0x806f, /* 0x4f */ 0x84ee, 0x9023, 0x932c, 0x5442, 0x9b6f, 0x6ad3, 0x7089, 0x8cc2, 0x8def, 0x9732, 0x52b4, 0x5a41, 0x5eca, 0x5f04, 0x6717, 0x697c, 0x6994, 0x6d6a, 0x6f0f, 0x7262, 0x72fc, 0x7bed, 0x8001, 0x807e, 0x874b, 0x90ce, 0x516d, 0x9e93, 0x7984, 0x808b, 0x9332, 0x8ad6, 0x502d, 0x548c, 0x8a71, 0x6b6a, 0x8cc4, 0x8107, 0x60d1, 0x67a0, 0x9df2, 0x4e99, 0x4e98, 0x9c10, 0x8a6b, 0x85c1, 0x8568, 0x6900, 0x6e7e, 0x7897, 0x8155, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x50 */ 0x5f0c, 0x4e10, 0x4e15, 0x4e2a, 0x4e31, 0x4e36, 0x4e3c, 0x4e3f, 0x4e42, 0x4e56, 0x4e58, 0x4e82, 0x4e85, 0x8c6b, 0x4e8a, 0x8212, 0x5f0d, 0x4e8e, 0x4e9e, 0x4e9f, 0x4ea0, 0x4ea2, 0x4eb0, 0x4eb3, 0x4eb6, 0x4ece, 0x4ecd, 0x4ec4, 0x4ec6, 0x4ec2, 0x4ed7, 0x4ede, 0x4eed, 0x4edf, 0x4ef7, 0x4f09, 0x4f5a, 0x4f30, 0x4f5b, 0x4f5d, 0x4f57, 0x4f47, 0x4f76, 0x4f88, 0x4f8f, 0x4f98, 0x4f7b, 0x4f69, 0x4f70, 0x4f91, 0x4f6f, 0x4f86, 0x4f96, 0x5118, 0x4fd4, 0x4fdf, 0x4fce, 0x4fd8, 0x4fdb, 0x4fd1, 0x4fda, 0x4fd0, 0x4fe4, 0x4fe5, 0x501a, 0x5028, 0x5014, 0x502a, 0x5025, 0x5005, 0x4f1c, 0x4ff6, 0x5021, 0x5029, 0x502c, 0x4ffe, 0x4fef, 0x5011, 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505a, 0x5056, 0x506c, 0x5078, 0x5080, 0x509a, 0x5085, 0x50b4, 0x50b2, /* 0x51 */ 0x50c9, 0x50ca, 0x50b3, 0x50c2, 0x50d6, 0x50de, 0x50e5, 0x50ed, 0x50e3, 0x50ee, 0x50f9, 0x50f5, 0x5109, 0x5101, 0x5102, 0x5116, 0x5115, 0x5114, 0x511a, 0x5121, 0x513a, 0x5137, 0x513c, 0x513b, 0x513f, 0x5140, 0x5152, 0x514c, 0x5154, 0x5162, 0x7af8, 0x5169, 0x516a, 0x516e, 0x5180, 0x5182, 0x56d8, 0x518c, 0x5189, 0x518f, 0x5191, 0x5193, 0x5195, 0x5196, 0x51a4, 0x51a6, 0x51a2, 0x51a9, 0x51aa, 0x51ab, 0x51b3, 0x51b1, 0x51b2, 0x51b0, 0x51b5, 0x51bd, 0x51c5, 0x51c9, 0x51db, 0x51e0, 0x8655, 0x51e9, 0x51ed, 0x51f0, 0x51f5, 0x51fe, 0x5204, 0x520b, 0x5214, 0x520e, 0x5227, 0x522a, 0x522e, 0x5233, 0x5239, 0x524f, 0x5244, 0x524b, 0x524c, 0x525e, 0x5254, 0x526a, 0x5274, 0x5269, 0x5273, 0x527f, 0x527d, 0x528d, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8fa8, /* 0x52 */ 0x8fa7, 0x52ac, 0x52ad, 0x52bc, 0x52b5, 0x52c1, 0x52cd, 0x52d7, 0x52de, 0x52e3, 0x52e6, 0x98ed, 0x52e0, 0x52f3, 0x52f5, 0x52f8, 0x52f9, 0x5306, 0x5308, 0x7538, 0x530d, 0x5310, 0x530f, 0x5315, 0x531a, 0x5323, 0x532f, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4e17, 0x5349, 0x534d, 0x51d6, 0x535e, 0x5369, 0x536e, 0x5918, 0x537b, 0x5377, 0x5382, 0x5396, 0x53a0, 0x53a6, 0x53a5, 0x53ae, 0x53b0, 0x53b6, 0x53c3, 0x7c12, 0x96d9, 0x53df, 0x66fc, 0x71ee, 0x53ee, 0x53e8, 0x53ed, 0x53fa, 0x5401, 0x543d, 0x5440, 0x542c, 0x542d, 0x543c, 0x542e, 0x5436, 0x5429, 0x541d, 0x544e, 0x548f, 0x5475, 0x548e, 0x545f, 0x5471, 0x5477, 0x5470, 0x5492, 0x547b, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54c7, 0x54a2, 0x54b8, 0x54a5, 0x54ac, 0x54c4, 0x54c8, 0x54a8, /* 0x53 */ 0x54ab, 0x54c2, 0x54a4, 0x54be, 0x54bc, 0x54d8, 0x54e5, 0x54e6, 0x550f, 0x5514, 0x54fd, 0x54ee, 0x54ed, 0x54fa, 0x54e2, 0x5539, 0x5540, 0x5563, 0x554c, 0x552e, 0x555c, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555d, 0x5599, 0x5580, 0x54af, 0x558a, 0x559f, 0x557b, 0x557e, 0x5598, 0x559e, 0x55ae, 0x557c, 0x5583, 0x55a9, 0x5587, 0x55a8, 0x55da, 0x55c5, 0x55df, 0x55c4, 0x55dc, 0x55e4, 0x55d4, 0x5614, 0x55f7, 0x5616, 0x55fe, 0x55fd, 0x561b, 0x55f9, 0x564e, 0x5650, 0x71df, 0x5634, 0x5636, 0x5632, 0x5638, 0x566b, 0x5664, 0x562f, 0x566c, 0x566a, 0x5686, 0x5680, 0x568a, 0x56a0, 0x5694, 0x568f, 0x56a5, 0x56ae, 0x56b6, 0x56b4, 0x56c2, 0x56bc, 0x56c1, 0x56c3, 0x56c0, 0x56c8, 0x56ce, 0x56d1, 0x56d3, 0x56d7, 0x56ee, 0x56f9, 0x5700, 0x56ff, 0x5704, 0x5709, /* 0x54 */ 0x5708, 0x570b, 0x570d, 0x5713, 0x5718, 0x5716, 0x55c7, 0x571c, 0x5726, 0x5737, 0x5738, 0x574e, 0x573b, 0x5740, 0x574f, 0x5769, 0x57c0, 0x5788, 0x5761, 0x577f, 0x5789, 0x5793, 0x57a0, 0x57b3, 0x57a4, 0x57aa, 0x57b0, 0x57c3, 0x57c6, 0x57d4, 0x57d2, 0x57d3, 0x580a, 0x57d6, 0x57e3, 0x580b, 0x5819, 0x581d, 0x5872, 0x5821, 0x5862, 0x584b, 0x5870, 0x6bc0, 0x5852, 0x583d, 0x5879, 0x5885, 0x58b9, 0x589f, 0x58ab, 0x58ba, 0x58de, 0x58bb, 0x58b8, 0x58ae, 0x58c5, 0x58d3, 0x58d1, 0x58d7, 0x58d9, 0x58d8, 0x58e5, 0x58dc, 0x58e4, 0x58df, 0x58ef, 0x58fa, 0x58f9, 0x58fb, 0x58fc, 0x58fd, 0x5902, 0x590a, 0x5910, 0x591b, 0x68a6, 0x5925, 0x592c, 0x592d, 0x5932, 0x5938, 0x593e, 0x7ad2, 0x5955, 0x5950, 0x594e, 0x595a, 0x5958, 0x5962, 0x5960, 0x5967, 0x596c, 0x5969, /* 0x55 */ 0x5978, 0x5981, 0x599d, 0x4f5e, 0x4fab, 0x59a3, 0x59b2, 0x59c6, 0x59e8, 0x59dc, 0x598d, 0x59d9, 0x59da, 0x5a25, 0x5a1f, 0x5a11, 0x5a1c, 0x5a09, 0x5a1a, 0x5a40, 0x5a6c, 0x5a49, 0x5a35, 0x5a36, 0x5a62, 0x5a6a, 0x5a9a, 0x5abc, 0x5abe, 0x5acb, 0x5ac2, 0x5abd, 0x5ae3, 0x5ad7, 0x5ae6, 0x5ae9, 0x5ad6, 0x5afa, 0x5afb, 0x5b0c, 0x5b0b, 0x5b16, 0x5b32, 0x5ad0, 0x5b2a, 0x5b36, 0x5b3e, 0x5b43, 0x5b45, 0x5b40, 0x5b51, 0x5b55, 0x5b5a, 0x5b5b, 0x5b65, 0x5b69, 0x5b70, 0x5b73, 0x5b75, 0x5b78, 0x6588, 0x5b7a, 0x5b80, 0x5b83, 0x5ba6, 0x5bb8, 0x5bc3, 0x5bc7, 0x5bc9, 0x5bd4, 0x5bd0, 0x5be4, 0x5be6, 0x5be2, 0x5bde, 0x5be5, 0x5beb, 0x5bf0, 0x5bf6, 0x5bf3, 0x5c05, 0x5c07, 0x5c08, 0x5c0d, 0x5c13, 0x5c20, 0x5c22, 0x5c28, 0x5c38, 0x5c39, 0x5c41, 0x5c46, 0x5c4e, 0x5c53, /* 0x56 */ 0x5c50, 0x5c4f, 0x5b71, 0x5c6c, 0x5c6e, 0x4e62, 0x5c76, 0x5c79, 0x5c8c, 0x5c91, 0x5c94, 0x599b, 0x5cab, 0x5cbb, 0x5cb6, 0x5cbc, 0x5cb7, 0x5cc5, 0x5cbe, 0x5cc7, 0x5cd9, 0x5ce9, 0x5cfd, 0x5cfa, 0x5ced, 0x5d8c, 0x5cea, 0x5d0b, 0x5d15, 0x5d17, 0x5d5c, 0x5d1f, 0x5d1b, 0x5d11, 0x5d14, 0x5d22, 0x5d1a, 0x5d19, 0x5d18, 0x5d4c, 0x5d52, 0x5d4e, 0x5d4b, 0x5d6c, 0x5d73, 0x5d76, 0x5d87, 0x5d84, 0x5d82, 0x5da2, 0x5d9d, 0x5dac, 0x5dae, 0x5dbd, 0x5d90, 0x5db7, 0x5dbc, 0x5dc9, 0x5dcd, 0x5dd3, 0x5dd2, 0x5dd6, 0x5ddb, 0x5deb, 0x5df2, 0x5df5, 0x5e0b, 0x5e1a, 0x5e19, 0x5e11, 0x5e1b, 0x5e36, 0x5e37, 0x5e44, 0x5e43, 0x5e40, 0x5e4e, 0x5e57, 0x5e54, 0x5e5f, 0x5e62, 0x5e64, 0x5e47, 0x5e75, 0x5e76, 0x5e7a, 0x9ebc, 0x5e7f, 0x5ea0, 0x5ec1, 0x5ec2, 0x5ec8, 0x5ed0, 0x5ecf, /* 0x57 */ 0x5ed6, 0x5ee3, 0x5edd, 0x5eda, 0x5edb, 0x5ee2, 0x5ee1, 0x5ee8, 0x5ee9, 0x5eec, 0x5ef1, 0x5ef3, 0x5ef0, 0x5ef4, 0x5ef8, 0x5efe, 0x5f03, 0x5f09, 0x5f5d, 0x5f5c, 0x5f0b, 0x5f11, 0x5f16, 0x5f29, 0x5f2d, 0x5f38, 0x5f41, 0x5f48, 0x5f4c, 0x5f4e, 0x5f2f, 0x5f51, 0x5f56, 0x5f57, 0x5f59, 0x5f61, 0x5f6d, 0x5f73, 0x5f77, 0x5f83, 0x5f82, 0x5f7f, 0x5f8a, 0x5f88, 0x5f91, 0x5f87, 0x5f9e, 0x5f99, 0x5f98, 0x5fa0, 0x5fa8, 0x5fad, 0x5fbc, 0x5fd6, 0x5ffb, 0x5fe4, 0x5ff8, 0x5ff1, 0x5fdd, 0x60b3, 0x5fff, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600e, 0x6031, 0x601b, 0x6015, 0x602b, 0x6026, 0x600f, 0x603a, 0x605a, 0x6041, 0x606a, 0x6077, 0x605f, 0x604a, 0x6046, 0x604d, 0x6063, 0x6043, 0x6064, 0x6042, 0x606c, 0x606b, 0x6059, 0x6081, 0x608d, 0x60e7, 0x6083, 0x609a, /* 0x58 */ 0x6084, 0x609b, 0x6096, 0x6097, 0x6092, 0x60a7, 0x608b, 0x60e1, 0x60b8, 0x60e0, 0x60d3, 0x60b4, 0x5ff0, 0x60bd, 0x60c6, 0x60b5, 0x60d8, 0x614d, 0x6115, 0x6106, 0x60f6, 0x60f7, 0x6100, 0x60f4, 0x60fa, 0x6103, 0x6121, 0x60fb, 0x60f1, 0x610d, 0x610e, 0x6147, 0x613e, 0x6128, 0x6127, 0x614a, 0x613f, 0x613c, 0x612c, 0x6134, 0x613d, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615a, 0x616b, 0x6174, 0x616f, 0x6165, 0x6171, 0x615f, 0x615d, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61ac, 0x6194, 0x619a, 0x618a, 0x6191, 0x61ab, 0x61ae, 0x61cc, 0x61ca, 0x61c9, 0x61f7, 0x61c8, 0x61c3, 0x61c6, 0x61ba, 0x61cb, 0x7f79, 0x61cd, 0x61e6, 0x61e3, 0x61f6, 0x61fa, 0x61f4, 0x61ff, 0x61fd, 0x61fc, 0x61fe, 0x6200, 0x6208, 0x6209, 0x620d, 0x620c, 0x6214, 0x621b, /* 0x59 */ 0x621e, 0x6221, 0x622a, 0x622e, 0x6230, 0x6232, 0x6233, 0x6241, 0x624e, 0x625e, 0x6263, 0x625b, 0x6260, 0x6268, 0x627c, 0x6282, 0x6289, 0x627e, 0x6292, 0x6293, 0x6296, 0x62d4, 0x6283, 0x6294, 0x62d7, 0x62d1, 0x62bb, 0x62cf, 0x62ff, 0x62c6, 0x64d4, 0x62c8, 0x62dc, 0x62cc, 0x62ca, 0x62c2, 0x62c7, 0x629b, 0x62c9, 0x630c, 0x62ee, 0x62f1, 0x6327, 0x6302, 0x6308, 0x62ef, 0x62f5, 0x6350, 0x633e, 0x634d, 0x641c, 0x634f, 0x6396, 0x638e, 0x6380, 0x63ab, 0x6376, 0x63a3, 0x638f, 0x6389, 0x639f, 0x63b5, 0x636b, 0x6369, 0x63be, 0x63e9, 0x63c0, 0x63c6, 0x63e3, 0x63c9, 0x63d2, 0x63f6, 0x63c4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651d, 0x6417, 0x6428, 0x640f, 0x6467, 0x646f, 0x6476, 0x644e, 0x652a, 0x6495, 0x6493, 0x64a5, 0x64a9, 0x6488, 0x64bc, /* 0x5a */ 0x64da, 0x64d2, 0x64c5, 0x64c7, 0x64bb, 0x64d8, 0x64c2, 0x64f1, 0x64e7, 0x8209, 0x64e0, 0x64e1, 0x62ac, 0x64e3, 0x64ef, 0x652c, 0x64f6, 0x64f4, 0x64f2, 0x64fa, 0x6500, 0x64fd, 0x6518, 0x651c, 0x6505, 0x6524, 0x6523, 0x652b, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754b, 0x6548, 0x6556, 0x6555, 0x654d, 0x6558, 0x655e, 0x655d, 0x6572, 0x6578, 0x6582, 0x6583, 0x8b8a, 0x659b, 0x659f, 0x65ab, 0x65b7, 0x65c3, 0x65c6, 0x65c1, 0x65c4, 0x65cc, 0x65d2, 0x65db, 0x65d9, 0x65e0, 0x65e1, 0x65f1, 0x6772, 0x660a, 0x6603, 0x65fb, 0x6773, 0x6635, 0x6636, 0x6634, 0x661c, 0x664f, 0x6644, 0x6649, 0x6641, 0x665e, 0x665d, 0x6664, 0x6667, 0x6668, 0x665f, 0x6662, 0x6670, 0x6683, 0x6688, 0x668e, 0x6689, 0x6684, 0x6698, 0x669d, 0x66c1, 0x66b9, 0x66c9, 0x66be, 0x66bc, /* 0x5b */ 0x66c4, 0x66b8, 0x66d6, 0x66da, 0x66e0, 0x663f, 0x66e6, 0x66e9, 0x66f0, 0x66f5, 0x66f7, 0x670f, 0x6716, 0x671e, 0x6726, 0x6727, 0x9738, 0x672e, 0x673f, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746, 0x675e, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67a9, 0x677c, 0x676a, 0x678c, 0x678b, 0x67a6, 0x67a1, 0x6785, 0x67b7, 0x67ef, 0x67b4, 0x67ec, 0x67b3, 0x67e9, 0x67b8, 0x67e4, 0x67de, 0x67dd, 0x67e2, 0x67ee, 0x67b9, 0x67ce, 0x67c6, 0x67e7, 0x6a9c, 0x681e, 0x6846, 0x6829, 0x6840, 0x684d, 0x6832, 0x684e, 0x68b3, 0x682b, 0x6859, 0x6863, 0x6877, 0x687f, 0x689f, 0x688f, 0x68ad, 0x6894, 0x689d, 0x689b, 0x6883, 0x6aae, 0x68b9, 0x6874, 0x68b5, 0x68a0, 0x68ba, 0x690f, 0x688d, 0x687e, 0x6901, 0x68ca, 0x6908, 0x68d8, 0x6922, 0x6926, 0x68e1, 0x690c, 0x68cd, /* 0x5c */ 0x68d4, 0x68e7, 0x68d5, 0x6936, 0x6912, 0x6904, 0x68d7, 0x68e3, 0x6925, 0x68f9, 0x68e0, 0x68ef, 0x6928, 0x692a, 0x691a, 0x6923, 0x6921, 0x68c6, 0x6979, 0x6977, 0x695c, 0x6978, 0x696b, 0x6954, 0x697e, 0x696e, 0x6939, 0x6974, 0x693d, 0x6959, 0x6930, 0x6961, 0x695e, 0x695d, 0x6981, 0x696a, 0x69b2, 0x69ae, 0x69d0, 0x69bf, 0x69c1, 0x69d3, 0x69be, 0x69ce, 0x5be8, 0x69ca, 0x69dd, 0x69bb, 0x69c3, 0x69a7, 0x6a2e, 0x6991, 0x69a0, 0x699c, 0x6995, 0x69b4, 0x69de, 0x69e8, 0x6a02, 0x6a1b, 0x69ff, 0x6b0a, 0x69f9, 0x69f2, 0x69e7, 0x6a05, 0x69b1, 0x6a1e, 0x69ed, 0x6a14, 0x69eb, 0x6a0a, 0x6a12, 0x6ac1, 0x6a23, 0x6a13, 0x6a44, 0x6a0c, 0x6a72, 0x6a36, 0x6a78, 0x6a47, 0x6a62, 0x6a59, 0x6a66, 0x6a48, 0x6a38, 0x6a22, 0x6a90, 0x6a8d, 0x6aa0, 0x6a84, 0x6aa2, 0x6aa3, /* 0x5d */ 0x6a97, 0x8617, 0x6abb, 0x6ac3, 0x6ac2, 0x6ab8, 0x6ab3, 0x6aac, 0x6ade, 0x6ad1, 0x6adf, 0x6aaa, 0x6ada, 0x6aea, 0x6afb, 0x6b05, 0x8616, 0x6afa, 0x6b12, 0x6b16, 0x9b31, 0x6b1f, 0x6b38, 0x6b37, 0x76dc, 0x6b39, 0x98ee, 0x6b47, 0x6b43, 0x6b49, 0x6b50, 0x6b59, 0x6b54, 0x6b5b, 0x6b5f, 0x6b61, 0x6b78, 0x6b79, 0x6b7f, 0x6b80, 0x6b84, 0x6b83, 0x6b8d, 0x6b98, 0x6b95, 0x6b9e, 0x6ba4, 0x6baa, 0x6bab, 0x6baf, 0x6bb2, 0x6bb1, 0x6bb3, 0x6bb7, 0x6bbc, 0x6bc6, 0x6bcb, 0x6bd3, 0x6bdf, 0x6bec, 0x6beb, 0x6bf3, 0x6bef, 0x9ebe, 0x6c08, 0x6c13, 0x6c14, 0x6c1b, 0x6c24, 0x6c23, 0x6c5e, 0x6c55, 0x6c62, 0x6c6a, 0x6c82, 0x6c8d, 0x6c9a, 0x6c81, 0x6c9b, 0x6c7e, 0x6c68, 0x6c73, 0x6c92, 0x6c90, 0x6cc4, 0x6cf1, 0x6cd3, 0x6cbd, 0x6cd7, 0x6cc5, 0x6cdd, 0x6cae, 0x6cb1, 0x6cbe, /* 0x5e */ 0x6cba, 0x6cdb, 0x6cef, 0x6cd9, 0x6cea, 0x6d1f, 0x884d, 0x6d36, 0x6d2b, 0x6d3d, 0x6d38, 0x6d19, 0x6d35, 0x6d33, 0x6d12, 0x6d0c, 0x6d63, 0x6d93, 0x6d64, 0x6d5a, 0x6d79, 0x6d59, 0x6d8e, 0x6d95, 0x6fe4, 0x6d85, 0x6df9, 0x6e15, 0x6e0a, 0x6db5, 0x6dc7, 0x6de6, 0x6db8, 0x6dc6, 0x6dec, 0x6dde, 0x6dcc, 0x6de8, 0x6dd2, 0x6dc5, 0x6dfa, 0x6dd9, 0x6de4, 0x6dd5, 0x6dea, 0x6dee, 0x6e2d, 0x6e6e, 0x6e2e, 0x6e19, 0x6e72, 0x6e5f, 0x6e3e, 0x6e23, 0x6e6b, 0x6e2b, 0x6e76, 0x6e4d, 0x6e1f, 0x6e43, 0x6e3a, 0x6e4e, 0x6e24, 0x6eff, 0x6e1d, 0x6e38, 0x6e82, 0x6eaa, 0x6e98, 0x6ec9, 0x6eb7, 0x6ed3, 0x6ebd, 0x6eaf, 0x6ec4, 0x6eb2, 0x6ed4, 0x6ed5, 0x6e8f, 0x6ea5, 0x6ec2, 0x6e9f, 0x6f41, 0x6f11, 0x704c, 0x6eec, 0x6ef8, 0x6efe, 0x6f3f, 0x6ef2, 0x6f31, 0x6eef, 0x6f32, 0x6ecc, /* 0x5f */ 0x6f3e, 0x6f13, 0x6ef7, 0x6f86, 0x6f7a, 0x6f78, 0x6f81, 0x6f80, 0x6f6f, 0x6f5b, 0x6ff3, 0x6f6d, 0x6f82, 0x6f7c, 0x6f58, 0x6f8e, 0x6f91, 0x6fc2, 0x6f66, 0x6fb3, 0x6fa3, 0x6fa1, 0x6fa4, 0x6fb9, 0x6fc6, 0x6faa, 0x6fdf, 0x6fd5, 0x6fec, 0x6fd4, 0x6fd8, 0x6ff1, 0x6fee, 0x6fdb, 0x7009, 0x700b, 0x6ffa, 0x7011, 0x7001, 0x700f, 0x6ffe, 0x701b, 0x701a, 0x6f74, 0x701d, 0x7018, 0x701f, 0x7030, 0x703e, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70af, 0x70f1, 0x70ac, 0x70b8, 0x70b3, 0x70ae, 0x70df, 0x70cb, 0x70dd, 0x70d9, 0x7109, 0x70fd, 0x711c, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714c, 0x7156, 0x716c, 0x718f, 0x71fb, 0x7184, 0x7195, 0x71a8, 0x71ac, 0x71d7, 0x71b9, 0x71be, 0x71d2, 0x71c9, 0x71d4, 0x71ce, 0x71e0, 0x71ec, 0x71e7, 0x71f5, 0x71fc, /* 0x60 */ 0x71f9, 0x71ff, 0x720d, 0x7210, 0x721b, 0x7228, 0x722d, 0x722c, 0x7230, 0x7232, 0x723b, 0x723c, 0x723f, 0x7240, 0x7246, 0x724b, 0x7258, 0x7274, 0x727e, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296, 0x72a2, 0x72a7, 0x72b9, 0x72b2, 0x72c3, 0x72c6, 0x72c4, 0x72ce, 0x72d2, 0x72e2, 0x72e0, 0x72e1, 0x72f9, 0x72f7, 0x500f, 0x7317, 0x730a, 0x731c, 0x7316, 0x731d, 0x7334, 0x732f, 0x7329, 0x7325, 0x733e, 0x734e, 0x734f, 0x9ed8, 0x7357, 0x736a, 0x7368, 0x7370, 0x7378, 0x7375, 0x737b, 0x737a, 0x73c8, 0x73b3, 0x73ce, 0x73bb, 0x73c0, 0x73e5, 0x73ee, 0x73de, 0x74a2, 0x7405, 0x746f, 0x7425, 0x73f8, 0x7432, 0x743a, 0x7455, 0x743f, 0x745f, 0x7459, 0x7441, 0x745c, 0x7469, 0x7470, 0x7463, 0x746a, 0x7476, 0x747e, 0x748b, 0x749e, 0x74a7, 0x74ca, 0x74cf, 0x74d4, 0x73f1, /* 0x61 */ 0x74e0, 0x74e3, 0x74e7, 0x74e9, 0x74ee, 0x74f2, 0x74f0, 0x74f1, 0x74f8, 0x74f7, 0x7504, 0x7503, 0x7505, 0x750c, 0x750e, 0x750d, 0x7515, 0x7513, 0x751e, 0x7526, 0x752c, 0x753c, 0x7544, 0x754d, 0x754a, 0x7549, 0x755b, 0x7546, 0x755a, 0x7569, 0x7564, 0x7567, 0x756b, 0x756d, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758a, 0x7589, 0x7582, 0x7594, 0x759a, 0x759d, 0x75a5, 0x75a3, 0x75c2, 0x75b3, 0x75c3, 0x75b5, 0x75bd, 0x75b8, 0x75bc, 0x75b1, 0x75cd, 0x75ca, 0x75d2, 0x75d9, 0x75e3, 0x75de, 0x75fe, 0x75ff, 0x75fc, 0x7601, 0x75f0, 0x75fa, 0x75f2, 0x75f3, 0x760b, 0x760d, 0x7609, 0x761f, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630, 0x763b, 0x7647, 0x7648, 0x7646, 0x765c, 0x7658, 0x7661, 0x7662, 0x7668, 0x7669, 0x766a, 0x7667, 0x766c, 0x7670, /* 0x62 */ 0x7672, 0x7676, 0x7678, 0x767c, 0x7680, 0x7683, 0x7688, 0x768b, 0x768e, 0x7696, 0x7693, 0x7699, 0x769a, 0x76b0, 0x76b4, 0x76b8, 0x76b9, 0x76ba, 0x76c2, 0x76cd, 0x76d6, 0x76d2, 0x76de, 0x76e1, 0x76e5, 0x76e7, 0x76ea, 0x862f, 0x76fb, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724, 0x771e, 0x7725, 0x7726, 0x771b, 0x7737, 0x7738, 0x7747, 0x775a, 0x7768, 0x776b, 0x775b, 0x7765, 0x777f, 0x777e, 0x7779, 0x778e, 0x778b, 0x7791, 0x77a0, 0x779e, 0x77b0, 0x77b6, 0x77b9, 0x77bf, 0x77bc, 0x77bd, 0x77bb, 0x77c7, 0x77cd, 0x77d7, 0x77da, 0x77dc, 0x77e3, 0x77ee, 0x77fc, 0x780c, 0x7812, 0x7926, 0x7820, 0x792a, 0x7845, 0x788e, 0x7874, 0x7886, 0x787c, 0x789a, 0x788c, 0x78a3, 0x78b5, 0x78aa, 0x78af, 0x78d1, 0x78c6, 0x78cb, 0x78d4, 0x78be, 0x78bc, 0x78c5, 0x78ca, 0x78ec, /* 0x63 */ 0x78e7, 0x78da, 0x78fd, 0x78f4, 0x7907, 0x7912, 0x7911, 0x7919, 0x792c, 0x792b, 0x7940, 0x7960, 0x7957, 0x795f, 0x795a, 0x7955, 0x7953, 0x797a, 0x797f, 0x798a, 0x799d, 0x79a7, 0x9f4b, 0x79aa, 0x79ae, 0x79b3, 0x79b9, 0x79ba, 0x79c9, 0x79d5, 0x79e7, 0x79ec, 0x79e1, 0x79e3, 0x7a08, 0x7a0d, 0x7a18, 0x7a19, 0x7a20, 0x7a1f, 0x7980, 0x7a31, 0x7a3b, 0x7a3e, 0x7a37, 0x7a43, 0x7a57, 0x7a49, 0x7a61, 0x7a62, 0x7a69, 0x9f9d, 0x7a70, 0x7a79, 0x7a7d, 0x7a88, 0x7a97, 0x7a95, 0x7a98, 0x7a96, 0x7aa9, 0x7ac8, 0x7ab0, 0x7ab6, 0x7ac5, 0x7ac4, 0x7abf, 0x9083, 0x7ac7, 0x7aca, 0x7acd, 0x7acf, 0x7ad5, 0x7ad3, 0x7ad9, 0x7ada, 0x7add, 0x7ae1, 0x7ae2, 0x7ae6, 0x7aed, 0x7af0, 0x7b02, 0x7b0f, 0x7b0a, 0x7b06, 0x7b33, 0x7b18, 0x7b19, 0x7b1e, 0x7b35, 0x7b28, 0x7b36, 0x7b50, /* 0x64 */ 0x7b7a, 0x7b04, 0x7b4d, 0x7b0b, 0x7b4c, 0x7b45, 0x7b75, 0x7b65, 0x7b74, 0x7b67, 0x7b70, 0x7b71, 0x7b6c, 0x7b6e, 0x7b9d, 0x7b98, 0x7b9f, 0x7b8d, 0x7b9c, 0x7b9a, 0x7b8b, 0x7b92, 0x7b8f, 0x7b5d, 0x7b99, 0x7bcb, 0x7bc1, 0x7bcc, 0x7bcf, 0x7bb4, 0x7bc6, 0x7bdd, 0x7be9, 0x7c11, 0x7c14, 0x7be6, 0x7be5, 0x7c60, 0x7c00, 0x7c07, 0x7c13, 0x7bf3, 0x7bf7, 0x7c17, 0x7c0d, 0x7bf6, 0x7c23, 0x7c27, 0x7c2a, 0x7c1f, 0x7c37, 0x7c2b, 0x7c3d, 0x7c4c, 0x7c43, 0x7c54, 0x7c4f, 0x7c40, 0x7c50, 0x7c58, 0x7c5f, 0x7c64, 0x7c56, 0x7c65, 0x7c6c, 0x7c75, 0x7c83, 0x7c90, 0x7ca4, 0x7cad, 0x7ca2, 0x7cab, 0x7ca1, 0x7ca8, 0x7cb3, 0x7cb2, 0x7cb1, 0x7cae, 0x7cb9, 0x7cbd, 0x7cc0, 0x7cc5, 0x7cc2, 0x7cd8, 0x7cd2, 0x7cdc, 0x7ce2, 0x9b3b, 0x7cef, 0x7cf2, 0x7cf4, 0x7cf6, 0x7cfa, 0x7d06, /* 0x65 */ 0x7d02, 0x7d1c, 0x7d15, 0x7d0a, 0x7d45, 0x7d4b, 0x7d2e, 0x7d32, 0x7d3f, 0x7d35, 0x7d46, 0x7d73, 0x7d56, 0x7d4e, 0x7d72, 0x7d68, 0x7d6e, 0x7d4f, 0x7d63, 0x7d93, 0x7d89, 0x7d5b, 0x7d8f, 0x7d7d, 0x7d9b, 0x7dba, 0x7dae, 0x7da3, 0x7db5, 0x7dc7, 0x7dbd, 0x7dab, 0x7e3d, 0x7da2, 0x7daf, 0x7ddc, 0x7db8, 0x7d9f, 0x7db0, 0x7dd8, 0x7ddd, 0x7de4, 0x7dde, 0x7dfb, 0x7df2, 0x7de1, 0x7e05, 0x7e0a, 0x7e23, 0x7e21, 0x7e12, 0x7e31, 0x7e1f, 0x7e09, 0x7e0b, 0x7e22, 0x7e46, 0x7e66, 0x7e3b, 0x7e35, 0x7e39, 0x7e43, 0x7e37, 0x7e32, 0x7e3a, 0x7e67, 0x7e5d, 0x7e56, 0x7e5e, 0x7e59, 0x7e5a, 0x7e79, 0x7e6a, 0x7e69, 0x7e7c, 0x7e7b, 0x7e83, 0x7dd5, 0x7e7d, 0x8fae, 0x7e7f, 0x7e88, 0x7e89, 0x7e8c, 0x7e92, 0x7e90, 0x7e93, 0x7e94, 0x7e96, 0x7e8e, 0x7e9b, 0x7e9c, 0x7f38, 0x7f3a, /* 0x66 */ 0x7f45, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f50, 0x7f51, 0x7f55, 0x7f54, 0x7f58, 0x7f5f, 0x7f60, 0x7f68, 0x7f69, 0x7f67, 0x7f78, 0x7f82, 0x7f86, 0x7f83, 0x7f88, 0x7f87, 0x7f8c, 0x7f94, 0x7f9e, 0x7f9d, 0x7f9a, 0x7fa3, 0x7faf, 0x7fb2, 0x7fb9, 0x7fae, 0x7fb6, 0x7fb8, 0x8b71, 0x7fc5, 0x7fc6, 0x7fca, 0x7fd5, 0x7fd4, 0x7fe1, 0x7fe6, 0x7fe9, 0x7ff3, 0x7ff9, 0x98dc, 0x8006, 0x8004, 0x800b, 0x8012, 0x8018, 0x8019, 0x801c, 0x8021, 0x8028, 0x803f, 0x803b, 0x804a, 0x8046, 0x8052, 0x8058, 0x805a, 0x805f, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807d, 0x807f, 0x8084, 0x8086, 0x8085, 0x809b, 0x8093, 0x809a, 0x80ad, 0x5190, 0x80ac, 0x80db, 0x80e5, 0x80d9, 0x80dd, 0x80c4, 0x80da, 0x80d6, 0x8109, 0x80ef, 0x80f1, 0x811b, 0x8129, 0x8123, 0x812f, 0x814b, /* 0x67 */ 0x968b, 0x8146, 0x813e, 0x8153, 0x8151, 0x80fc, 0x8171, 0x816e, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818a, 0x8180, 0x8182, 0x81a0, 0x8195, 0x81a4, 0x81a3, 0x815f, 0x8193, 0x81a9, 0x81b0, 0x81b5, 0x81be, 0x81b8, 0x81bd, 0x81c0, 0x81c2, 0x81ba, 0x81c9, 0x81cd, 0x81d1, 0x81d9, 0x81d8, 0x81c8, 0x81da, 0x81df, 0x81e0, 0x81e7, 0x81fa, 0x81fb, 0x81fe, 0x8201, 0x8202, 0x8205, 0x8207, 0x820a, 0x820d, 0x8210, 0x8216, 0x8229, 0x822b, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825d, 0x825a, 0x825f, 0x8264, 0x8262, 0x8268, 0x826a, 0x826b, 0x822e, 0x8271, 0x8277, 0x8278, 0x827e, 0x828d, 0x8292, 0x82ab, 0x829f, 0x82bb, 0x82ac, 0x82e1, 0x82e3, 0x82df, 0x82d2, 0x82f4, 0x82f3, 0x82fa, 0x8393, 0x8303, 0x82fb, 0x82f9, 0x82de, 0x8306, 0x82dc, 0x8309, 0x82d9, /* 0x68 */ 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350, 0x8345, 0x832f, 0x832b, 0x8317, 0x8318, 0x8385, 0x839a, 0x83aa, 0x839f, 0x83a2, 0x8396, 0x8323, 0x838e, 0x8387, 0x838a, 0x837c, 0x83b5, 0x8373, 0x8375, 0x83a0, 0x8389, 0x83a8, 0x83f4, 0x8413, 0x83eb, 0x83ce, 0x83fd, 0x8403, 0x83d8, 0x840b, 0x83c1, 0x83f7, 0x8407, 0x83e0, 0x83f2, 0x840d, 0x8422, 0x8420, 0x83bd, 0x8438, 0x8506, 0x83fb, 0x846d, 0x842a, 0x843c, 0x855a, 0x8484, 0x8477, 0x846b, 0x84ad, 0x846e, 0x8482, 0x8469, 0x8446, 0x842c, 0x846f, 0x8479, 0x8435, 0x84ca, 0x8462, 0x84b9, 0x84bf, 0x849f, 0x84d9, 0x84cd, 0x84bb, 0x84da, 0x84d0, 0x84c1, 0x84c6, 0x84d6, 0x84a1, 0x8521, 0x84ff, 0x84f4, 0x8517, 0x8518, 0x852c, 0x851f, 0x8515, 0x8514, 0x84fc, 0x8540, 0x8563, 0x8558, 0x8548, /* 0x69 */ 0x8541, 0x8602, 0x854b, 0x8555, 0x8580, 0x85a4, 0x8588, 0x8591, 0x858a, 0x85a8, 0x856d, 0x8594, 0x859b, 0x85ea, 0x8587, 0x859c, 0x8577, 0x857e, 0x8590, 0x85c9, 0x85ba, 0x85cf, 0x85b9, 0x85d0, 0x85d5, 0x85dd, 0x85e5, 0x85dc, 0x85f9, 0x860a, 0x8613, 0x860b, 0x85fe, 0x85fa, 0x8606, 0x8622, 0x861a, 0x8630, 0x863f, 0x864d, 0x4e55, 0x8654, 0x865f, 0x8667, 0x8671, 0x8693, 0x86a3, 0x86a9, 0x86aa, 0x868b, 0x868c, 0x86b6, 0x86af, 0x86c4, 0x86c6, 0x86b0, 0x86c9, 0x8823, 0x86ab, 0x86d4, 0x86de, 0x86e9, 0x86ec, 0x86df, 0x86db, 0x86ef, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86fb, 0x8711, 0x8709, 0x870d, 0x86f9, 0x870a, 0x8734, 0x873f, 0x8737, 0x873b, 0x8725, 0x8729, 0x871a, 0x8760, 0x875f, 0x8778, 0x874c, 0x874e, 0x8774, 0x8757, 0x8768, 0x876e, 0x8759, /* 0x6a */ 0x8753, 0x8763, 0x876a, 0x8805, 0x87a2, 0x879f, 0x8782, 0x87af, 0x87cb, 0x87bd, 0x87c0, 0x87d0, 0x96d6, 0x87ab, 0x87c4, 0x87b3, 0x87c7, 0x87c6, 0x87bb, 0x87ef, 0x87f2, 0x87e0, 0x880f, 0x880d, 0x87fe, 0x87f6, 0x87f7, 0x880e, 0x87d2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883b, 0x8844, 0x8842, 0x8852, 0x8859, 0x885e, 0x8862, 0x886b, 0x8881, 0x887e, 0x889e, 0x8875, 0x887d, 0x88b5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88ae, 0x8899, 0x88a2, 0x888d, 0x88a4, 0x88b0, 0x88bf, 0x88b1, 0x88c3, 0x88c4, 0x88d4, 0x88d8, 0x88d9, 0x88dd, 0x88f9, 0x8902, 0x88fc, 0x88f4, 0x88e8, 0x88f2, 0x8904, 0x890c, 0x890a, 0x8913, 0x8943, 0x891e, 0x8925, 0x892a, 0x892b, 0x8941, 0x8944, 0x893b, 0x8936, 0x8938, 0x894c, 0x891d, 0x8960, 0x895e, /* 0x6b */ 0x8966, 0x8964, 0x896d, 0x896a, 0x896f, 0x8974, 0x8977, 0x897e, 0x8983, 0x8988, 0x898a, 0x8993, 0x8998, 0x89a1, 0x89a9, 0x89a6, 0x89ac, 0x89af, 0x89b2, 0x89ba, 0x89bd, 0x89bf, 0x89c0, 0x89da, 0x89dc, 0x89dd, 0x89e7, 0x89f4, 0x89f8, 0x8a03, 0x8a16, 0x8a10, 0x8a0c, 0x8a1b, 0x8a1d, 0x8a25, 0x8a36, 0x8a41, 0x8a5b, 0x8a52, 0x8a46, 0x8a48, 0x8a7c, 0x8a6d, 0x8a6c, 0x8a62, 0x8a85, 0x8a82, 0x8a84, 0x8aa8, 0x8aa1, 0x8a91, 0x8aa5, 0x8aa6, 0x8a9a, 0x8aa3, 0x8ac4, 0x8acd, 0x8ac2, 0x8ada, 0x8aeb, 0x8af3, 0x8ae7, 0x8ae4, 0x8af1, 0x8b14, 0x8ae0, 0x8ae2, 0x8af7, 0x8ade, 0x8adb, 0x8b0c, 0x8b07, 0x8b1a, 0x8ae1, 0x8b16, 0x8b10, 0x8b17, 0x8b20, 0x8b33, 0x97ab, 0x8b26, 0x8b2b, 0x8b3e, 0x8b28, 0x8b41, 0x8b4c, 0x8b4f, 0x8b4e, 0x8b49, 0x8b56, 0x8b5b, 0x8b5a, 0x8b6b, /* 0x6c */ 0x8b5f, 0x8b6c, 0x8b6f, 0x8b74, 0x8b7d, 0x8b80, 0x8b8c, 0x8b8e, 0x8b92, 0x8b93, 0x8b96, 0x8b99, 0x8b9a, 0x8c3a, 0x8c41, 0x8c3f, 0x8c48, 0x8c4c, 0x8c4e, 0x8c50, 0x8c55, 0x8c62, 0x8c6c, 0x8c78, 0x8c7a, 0x8c82, 0x8c89, 0x8c85, 0x8c8a, 0x8c8d, 0x8c8e, 0x8c94, 0x8c7c, 0x8c98, 0x621d, 0x8cad, 0x8caa, 0x8cbd, 0x8cb2, 0x8cb3, 0x8cae, 0x8cb6, 0x8cc8, 0x8cc1, 0x8ce4, 0x8ce3, 0x8cda, 0x8cfd, 0x8cfa, 0x8cfb, 0x8d04, 0x8d05, 0x8d0a, 0x8d07, 0x8d0f, 0x8d0d, 0x8d10, 0x9f4e, 0x8d13, 0x8ccd, 0x8d14, 0x8d16, 0x8d67, 0x8d6d, 0x8d71, 0x8d73, 0x8d81, 0x8d99, 0x8dc2, 0x8dbe, 0x8dba, 0x8dcf, 0x8dda, 0x8dd6, 0x8dcc, 0x8ddb, 0x8dcb, 0x8dea, 0x8deb, 0x8ddf, 0x8de3, 0x8dfc, 0x8e08, 0x8e09, 0x8dff, 0x8e1d, 0x8e1e, 0x8e10, 0x8e1f, 0x8e42, 0x8e35, 0x8e30, 0x8e34, 0x8e4a, /* 0x6d */ 0x8e47, 0x8e49, 0x8e4c, 0x8e50, 0x8e48, 0x8e59, 0x8e64, 0x8e60, 0x8e2a, 0x8e63, 0x8e55, 0x8e76, 0x8e72, 0x8e7c, 0x8e81, 0x8e87, 0x8e85, 0x8e84, 0x8e8b, 0x8e8a, 0x8e93, 0x8e91, 0x8e94, 0x8e99, 0x8eaa, 0x8ea1, 0x8eac, 0x8eb0, 0x8ec6, 0x8eb1, 0x8ebe, 0x8ec5, 0x8ec8, 0x8ecb, 0x8edb, 0x8ee3, 0x8efc, 0x8efb, 0x8eeb, 0x8efe, 0x8f0a, 0x8f05, 0x8f15, 0x8f12, 0x8f19, 0x8f13, 0x8f1c, 0x8f1f, 0x8f1b, 0x8f0c, 0x8f26, 0x8f33, 0x8f3b, 0x8f39, 0x8f45, 0x8f42, 0x8f3e, 0x8f4c, 0x8f49, 0x8f46, 0x8f4e, 0x8f57, 0x8f5c, 0x8f62, 0x8f63, 0x8f64, 0x8f9c, 0x8f9f, 0x8fa3, 0x8fad, 0x8faf, 0x8fb7, 0x8fda, 0x8fe5, 0x8fe2, 0x8fea, 0x8fef, 0x9087, 0x8ff4, 0x9005, 0x8ff9, 0x8ffa, 0x9011, 0x9015, 0x9021, 0x900d, 0x901e, 0x9016, 0x900b, 0x9027, 0x9036, 0x9035, 0x9039, 0x8ff8, /* 0x6e */ 0x904f, 0x9050, 0x9051, 0x9052, 0x900e, 0x9049, 0x903e, 0x9056, 0x9058, 0x905e, 0x9068, 0x906f, 0x9076, 0x96a8, 0x9072, 0x9082, 0x907d, 0x9081, 0x9080, 0x908a, 0x9089, 0x908f, 0x90a8, 0x90af, 0x90b1, 0x90b5, 0x90e2, 0x90e4, 0x6248, 0x90db, 0x9102, 0x9112, 0x9119, 0x9132, 0x9130, 0x914a, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173, 0x9172, 0x918b, 0x9189, 0x9182, 0x91a2, 0x91ab, 0x91af, 0x91aa, 0x91b5, 0x91b4, 0x91ba, 0x91c0, 0x91c1, 0x91c9, 0x91cb, 0x91d0, 0x91d6, 0x91df, 0x91e1, 0x91db, 0x91fc, 0x91f5, 0x91f6, 0x921e, 0x91ff, 0x9214, 0x922c, 0x9215, 0x9211, 0x925e, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923f, 0x924b, 0x9250, 0x929c, 0x9296, 0x9293, 0x929b, 0x925a, 0x92cf, 0x92b9, 0x92b7, 0x92e9, 0x930f, 0x92fa, 0x9344, 0x932e, /* 0x6f */ 0x9319, 0x9322, 0x931a, 0x9323, 0x933a, 0x9335, 0x933b, 0x935c, 0x9360, 0x937c, 0x936e, 0x9356, 0x93b0, 0x93ac, 0x93ad, 0x9394, 0x93b9, 0x93d6, 0x93d7, 0x93e8, 0x93e5, 0x93d8, 0x93c3, 0x93dd, 0x93d0, 0x93c8, 0x93e4, 0x941a, 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942b, 0x9435, 0x9421, 0x943a, 0x9441, 0x9452, 0x9444, 0x945b, 0x9460, 0x9462, 0x945e, 0x946a, 0x9229, 0x9470, 0x9475, 0x9477, 0x947d, 0x945a, 0x947c, 0x947e, 0x9481, 0x947f, 0x9582, 0x9587, 0x958a, 0x9594, 0x9596, 0x9598, 0x9599, 0x95a0, 0x95a8, 0x95a7, 0x95ad, 0x95bc, 0x95bb, 0x95b9, 0x95be, 0x95ca, 0x6ff6, 0x95c3, 0x95cd, 0x95cc, 0x95d5, 0x95d4, 0x95d6, 0x95dc, 0x95e1, 0x95e5, 0x95e2, 0x9621, 0x9628, 0x962e, 0x962f, 0x9642, 0x964c, 0x964f, 0x964b, 0x9677, 0x965c, 0x965e, /* 0x70 */ 0x965d, 0x965f, 0x9666, 0x9672, 0x966c, 0x968d, 0x9698, 0x9695, 0x9697, 0x96aa, 0x96a7, 0x96b1, 0x96b2, 0x96b0, 0x96b4, 0x96b6, 0x96b8, 0x96b9, 0x96ce, 0x96cb, 0x96c9, 0x96cd, 0x894d, 0x96dc, 0x970d, 0x96d5, 0x96f9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970e, 0x9711, 0x970f, 0x9716, 0x9719, 0x9724, 0x972a, 0x9730, 0x9739, 0x973d, 0x973e, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975c, 0x9760, 0x9764, 0x9766, 0x9768, 0x52d2, 0x976b, 0x9771, 0x9779, 0x9785, 0x977c, 0x9781, 0x977a, 0x9786, 0x978b, 0x978f, 0x9790, 0x979c, 0x97a8, 0x97a6, 0x97a3, 0x97b3, 0x97b4, 0x97c3, 0x97c6, 0x97c8, 0x97cb, 0x97dc, 0x97ed, 0x9f4f, 0x97f2, 0x7adf, 0x97f6, 0x97f5, 0x980f, 0x980c, 0x9838, 0x9824, 0x9821, 0x9837, 0x983d, 0x9846, 0x984f, 0x984b, 0x986b, 0x986f, 0x9870, /* 0x71 */ 0x9871, 0x9874, 0x9873, 0x98aa, 0x98af, 0x98b1, 0x98b6, 0x98c4, 0x98c3, 0x98c6, 0x98e9, 0x98eb, 0x9903, 0x9909, 0x9912, 0x9914, 0x9918, 0x9921, 0x991d, 0x991e, 0x9924, 0x9920, 0x992c, 0x992e, 0x993d, 0x993e, 0x9942, 0x9949, 0x9945, 0x9950, 0x994b, 0x9951, 0x9952, 0x994c, 0x9955, 0x9997, 0x9998, 0x99a5, 0x99ad, 0x99ae, 0x99bc, 0x99df, 0x99db, 0x99dd, 0x99d8, 0x99d1, 0x99ed, 0x99ee, 0x99f1, 0x99f2, 0x99fb, 0x99f8, 0x9a01, 0x9a0f, 0x9a05, 0x99e2, 0x9a19, 0x9a2b, 0x9a37, 0x9a45, 0x9a42, 0x9a40, 0x9a43, 0x9a3e, 0x9a55, 0x9a4d, 0x9a5b, 0x9a57, 0x9a5f, 0x9a62, 0x9a65, 0x9a64, 0x9a69, 0x9a6b, 0x9a6a, 0x9aad, 0x9ab0, 0x9abc, 0x9ac0, 0x9acf, 0x9ad1, 0x9ad3, 0x9ad4, 0x9ade, 0x9adf, 0x9ae2, 0x9ae3, 0x9ae6, 0x9aef, 0x9aeb, 0x9aee, 0x9af4, 0x9af1, 0x9af7, /* 0x72 */ 0x9afb, 0x9b06, 0x9b18, 0x9b1a, 0x9b1f, 0x9b22, 0x9b23, 0x9b25, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2e, 0x9b2f, 0x9b32, 0x9b44, 0x9b43, 0x9b4f, 0x9b4d, 0x9b4e, 0x9b51, 0x9b58, 0x9b74, 0x9b93, 0x9b83, 0x9b91, 0x9b96, 0x9b97, 0x9b9f, 0x9ba0, 0x9ba8, 0x9bb4, 0x9bc0, 0x9bca, 0x9bb9, 0x9bc6, 0x9bcf, 0x9bd1, 0x9bd2, 0x9be3, 0x9be2, 0x9be4, 0x9bd4, 0x9be1, 0x9c3a, 0x9bf2, 0x9bf1, 0x9bf0, 0x9c15, 0x9c14, 0x9c09, 0x9c13, 0x9c0c, 0x9c06, 0x9c08, 0x9c12, 0x9c0a, 0x9c04, 0x9c2e, 0x9c1b, 0x9c25, 0x9c24, 0x9c21, 0x9c30, 0x9c47, 0x9c32, 0x9c46, 0x9c3e, 0x9c5a, 0x9c60, 0x9c67, 0x9c76, 0x9c78, 0x9ce7, 0x9cec, 0x9cf0, 0x9d09, 0x9d08, 0x9ceb, 0x9d03, 0x9d06, 0x9d2a, 0x9d26, 0x9daf, 0x9d23, 0x9d1f, 0x9d44, 0x9d15, 0x9d12, 0x9d41, 0x9d3f, 0x9d3e, 0x9d46, 0x9d48, /* 0x73 */ 0x9d5d, 0x9d5e, 0x9d64, 0x9d51, 0x9d50, 0x9d59, 0x9d72, 0x9d89, 0x9d87, 0x9dab, 0x9d6f, 0x9d7a, 0x9d9a, 0x9da4, 0x9da9, 0x9db2, 0x9dc4, 0x9dc1, 0x9dbb, 0x9db8, 0x9dba, 0x9dc6, 0x9dcf, 0x9dc2, 0x9dd9, 0x9dd3, 0x9df8, 0x9de6, 0x9ded, 0x9def, 0x9dfd, 0x9e1a, 0x9e1b, 0x9e1e, 0x9e75, 0x9e79, 0x9e7d, 0x9e81, 0x9e88, 0x9e8b, 0x9e8c, 0x9e92, 0x9e95, 0x9e91, 0x9e9d, 0x9ea5, 0x9ea9, 0x9eb8, 0x9eaa, 0x9ead, 0x9761, 0x9ecc, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed4, 0x9edc, 0x9ede, 0x9edd, 0x9ee0, 0x9ee5, 0x9ee8, 0x9eef, 0x9ef4, 0x9ef6, 0x9ef7, 0x9ef9, 0x9efb, 0x9efc, 0x9efd, 0x9f07, 0x9f08, 0x76b7, 0x9f15, 0x9f21, 0x9f2c, 0x9f3e, 0x9f4a, 0x9f52, 0x9f54, 0x9f63, 0x9f5f, 0x9f60, 0x9f61, 0x9f66, 0x9f67, 0x9f6c, 0x9f6a, 0x9f77, 0x9f72, 0x9f76, 0x9f95, 0x9f9c, 0x9fa0, /* 0x74 */ 0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199, }; static int jisx0208_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x28) || (c1 >= 0x30 && c1 <= 0x74)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 1410) { if (i < 690) wc = jisx0208_2uni_page21[i]; } else { if (i < 7808) wc = jisx0208_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short jisx0208_2charset[6879] = { 0x2171, 0x2172, 0x2178, 0x212f, 0x224c, 0x216b, 0x215e, 0x212d, 0x2279, 0x215f, 0x2160, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x213e, 0x213d, 0x2142, 0x2146, 0x2147, 0x2148, 0x2149, 0x2277, 0x2278, 0x2145, 0x2144, 0x2273, 0x216c, 0x216d, 0x2228, 0x216e, 0x2272, 0x222b, 0x222c, 0x222a, 0x222d, 0x224d, 0x224e, 0x224f, 0x225f, 0x2250, 0x2260, 0x223a, 0x223b, 0x215d, 0x2265, 0x2267, 0x2167, 0x225c, 0x224a, 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x2168, 0x2268, 0x2266, 0x2262, 0x2162, 0x2261, 0x2165, 0x2166, 0x2263, 0x2264, 0x223e, 0x223f, 0x223c, 0x223d, 0x225d, 0x225e, 0x2821, 0x282c, 0x2822, 0x282d, 0x2823, 0x282e, 0x2824, 0x282f, 0x2826, 0x2831, 0x2825, 0x2830, 0x2827, 0x283c, 0x2837, 0x2832, 0x2829, 0x283e, 0x2839, 0x2834, 0x2828, 0x2838, 0x283d, 0x2833, 0x282a, 0x283a, 0x283f, 0x2835, 0x282b, 0x283b, 0x2840, 0x2836, 0x2223, 0x2222, 0x2225, 0x2224, 0x2227, 0x2226, 0x2221, 0x217e, 0x217b, 0x217d, 0x217c, 0x227e, 0x217a, 0x2179, 0x216a, 0x2169, 0x2276, 0x2275, 0x2274, 0x2121, 0x2122, 0x2123, 0x2137, 0x2139, 0x213a, 0x213b, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x2141, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x212b, 0x212c, 0x2135, 0x2136, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2126, 0x213c, 0x2133, 0x2134, 0x306c, 0x437a, 0x3c37, 0x4b7c, 0x3e66, 0x3b30, 0x3e65, 0x323c, 0x4954, 0x4d3f, 0x5022, 0x312f, 0x336e, 0x5023, 0x4024, 0x5242, 0x3556, 0x4a3a, 0x3e67, 0x4e3e, 0x4a42, 0x5024, 0x4366, 0x5025, 0x367a, 0x5026, 0x345d, 0x4330, 0x3c67, 0x5027, 0x5028, 0x5029, 0x4735, 0x3557, 0x4737, 0x4663, 0x3843, 0x4b33, 0x6949, 0x502a, 0x3e68, 0x502b, 0x3235, 0x3665, 0x3870, 0x4c69, 0x5626, 0x4d70, 0x467d, 0x3425, 0x3535, 0x502c, 0x502d, 0x4e3b, 0x4d3d, 0x4168, 0x502f, 0x3b76, 0x4673, 0x5032, 0x313e, 0x385f, 0x385e, 0x3066, 0x4f4b, 0x4f4a, 0x3a33, 0x3021, 0x5033, 0x5034, 0x5035, 0x4b34, 0x5036, 0x3872, 0x3067, 0x4b72, 0x357c, 0x357d, 0x357e, 0x4462, 0x4e3c, 0x5037, 0x5038, 0x5039, 0x3f4d, 0x3d3a, 0x3f4e, 0x503e, 0x503c, 0x503d, 0x3558, 0x3a23, 0x3270, 0x503b, 0x503a, 0x4a29, 0x3b46, 0x3b45, 0x423e, 0x503f, 0x4955, 0x4067, 0x2138, 0x5040, 0x5042, 0x4265, 0x4e61, 0x304a, 0x5041, 0x323e, 0x3644, 0x4367, 0x376f, 0x5043, 0x4724, 0x346b, 0x5044, 0x304b, 0x3860, 0x346c, 0x497a, 0x4832, 0x3559, 0x3271, 0x5067, 0x4541, 0x476c, 0x5046, 0x483c, 0x4e62, 0x3f2d, 0x3b47, 0x3b77, 0x3240, 0x4451, 0x4322, 0x504a, 0x304c, 0x4463, 0x3d3b, 0x3a34, 0x4d24, 0x424e, 0x323f, 0x5049, 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x5050, 0x5053, 0x5051, 0x3242, 0x4a3b, 0x504b, 0x504f, 0x3873, 0x3b48, 0x3426, 0x5054, 0x504c, 0x4e63, 0x3b78, 0x504d, 0x5052, 0x5055, 0x504e, 0x3621, 0x304d, 0x3622, 0x3241, 0x5525, 0x4b79, 0x496e, 0x3874, 0x3f2f, 0x4e37, 0x4a58, 0x3738, 0x4225, 0x3264, 0x3d53, 0x5059, 0x505e, 0x505c, 0x5057, 0x422f, 0x505a, 0x505d, 0x505b, 0x4a5d, 0x5058, 0x3f2e, 0x4b73, 0x505f, 0x5060, 0x3d24, 0x506d, 0x4750, 0x4936, 0x5068, 0x4a70, 0x3236, 0x506c, 0x5066, 0x506f, 0x4152, 0x3844, 0x475c, 0x6047, 0x506e, 0x455d, 0x5063, 0x3876, 0x3875, 0x5061, 0x3c5a, 0x5069, 0x4a6f, 0x434d, 0x5065, 0x3771, 0x5062, 0x506a, 0x5064, 0x4e51, 0x506b, 0x4f41, 0x3666, 0x3770, 0x5070, 0x5071, 0x5075, 0x304e, 0x4a50, 0x5074, 0x5073, 0x5077, 0x5076, 0x4464, 0x3772, 0x5078, 0x3c45, 0x4226, 0x4465, 0x3676, 0x5079, 0x3536, 0x507a, 0x507c, 0x4b35, 0x3766, 0x3b31, 0x4877, 0x507b, 0x3a45, 0x4d43, 0x507e, 0x5123, 0x507d, 0x3a44, 0x3d7d, 0x3739, 0x5124, 0x364f, 0x5121, 0x5122, 0x462f, 0x417c, 0x3623, 0x4b4d, 0x5125, 0x4e3d, 0x5126, 0x5129, 0x5127, 0x414e, 0x5128, 0x512a, 0x512c, 0x512b, 0x4a48, 0x3537, 0x512e, 0x512f, 0x322f, 0x512d, 0x3c74, 0x5132, 0x5131, 0x5130, 0x5056, 0x5133, 0x3d7e, 0x5134, 0x4d25, 0x4c59, 0x5136, 0x5135, 0x5138, 0x5137, 0x5139, 0x513a, 0x3074, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624, 0x4068, 0x3877, 0x396e, 0x513c, 0x4c48, 0x4546, 0x3b79, 0x513b, 0x513d, 0x455e, 0x3375, 0x513e, 0x467e, 0x4134, 0x5140, 0x5141, 0x482c, 0x3878, 0x4f3b, 0x5142, 0x3626, 0x4a3c, 0x4236, 0x3671, 0x4535, 0x3773, 0x5143, 0x5144, 0x4662, 0x315f, 0x5147, 0x3a7d, 0x5146, 0x3a46, 0x5148, 0x666e, 0x5149, 0x4b41, 0x514a, 0x514b, 0x514c, 0x3e69, 0x3c4c, 0x3427, 0x514f, 0x514d, 0x4c3d, 0x514e, 0x495a, 0x5150, 0x5151, 0x5152, 0x455f, 0x5156, 0x5154, 0x5155, 0x5153, 0x3a63, 0x5157, 0x4c6a, 0x4e64, 0x5158, 0x4028, 0x5159, 0x3d5a, 0x515a, 0x437c, 0x4e3f, 0x4560, 0x5245, 0x515b, 0x7425, 0x3645, 0x515c, 0x4b5e, 0x3d68, 0x427c, 0x515e, 0x4664, 0x515f, 0x5160, 0x332e, 0x5161, 0x3627, 0x464c, 0x317a, 0x3d50, 0x4821, 0x5162, 0x4561, 0x3f4f, 0x5163, 0x4a2c, 0x405a, 0x3422, 0x3429, 0x5164, 0x5166, 0x373a, 0x5165, 0x4e73, 0x3d69, 0x483d, 0x4a4c, 0x5167, 0x4d78, 0x5168, 0x5169, 0x457e, 0x516a, 0x4029, 0x3a7e, 0x3774, 0x516b, 0x3b49, 0x396f, 0x4466, 0x516d, 0x4227, 0x3a6f, 0x516e, 0x516f, 0x4130, 0x516c, 0x5171, 0x4b36, 0x3964, 0x5170, 0x3775, 0x3a5e, 0x476d, 0x5174, 0x5172, 0x497b, 0x3e6a, 0x517b, 0x3364, 0x5175, 0x5173, 0x414f, 0x5177, 0x5176, 0x3344, 0x3760, 0x517c, 0x4e2d, 0x5178, 0x517d, 0x517a, 0x5179, 0x4e4f, 0x3879, 0x3243, 0x4e74, 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0x4e65, 0x4f2b, 0x5225, 0x387a, 0x5224, 0x332f, 0x5226, 0x4b56, 0x443c, 0x4d26, 0x4a59, 0x5227, 0x7055, 0x4630, 0x5228, 0x342a, 0x4c33, 0x3e21, 0x5229, 0x4a67, 0x522d, 0x402a, 0x522a, 0x3650, 0x522b, 0x342b, 0x372e, 0x522e, 0x522f, 0x5230, 0x5231, 0x3c5b, 0x387b, 0x4c5e, 0x4c68, 0x4677, 0x4a71, 0x5232, 0x5233, 0x5235, 0x5237, 0x5236, 0x5238, 0x323d, 0x4b4c, 0x3a7c, 0x5239, 0x4159, 0x3e22, 0x3629, 0x523a, 0x485b, 0x523b, 0x523c, 0x523d, 0x523e, 0x4924, 0x3668, 0x3065, 0x463f, 0x523f, 0x3d3d, 0x4069, 0x5241, 0x5240, 0x3e23, 0x3861, 0x5243, 0x483e, 0x5244, 0x485c, 0x4234, 0x426e, 0x3628, 0x466e, 0x4331, 0x476e, 0x4b4e, 0x5246, 0x406a, 0x3735, 0x5247, 0x5248, 0x312c, 0x3075, 0x346d, 0x4228, 0x3551, 0x4d71, 0x524b, 0x3237, 0x524a, 0x362a, 0x524c, 0x4c71, 0x524d, 0x4e52, 0x387c, 0x3836, 0x524e, 0x5250, 0x524f, 0x3f5f, 0x3139, 0x315e, 0x5251, 0x5252, 0x3837, 0x5253, 0x356e, 0x3b32, 0x5254, 0x4b74, 0x3a35, 0x355a, 0x4d27, 0x4150, 0x483f, 0x3c7d, 0x3d47, 0x3c68, 0x3c75, 0x3d76, 0x4840, 0x5257, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667, 0x525b, 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244, 0x4266, 0x3c38, 0x3b4b, 0x3126, 0x3370, 0x3966, 0x3b4a, 0x525d, 0x525e, 0x3549, 0x3346, 0x3967, 0x3548, 0x445f, 0x3125, 0x4631, 0x4c3e, 0x3921, 0x4d79, 0x4547, 0x387e, 0x372f, 0x5267, 0x3663, 0x4b4a, 0x485d, 0x5266, 0x345e, 0x5261, 0x5262, 0x5264, 0x5265, 0x355b, 0x3f61, 0x4a2d, 0x5263, 0x525f, 0x3863, 0x5260, 0x4f24, 0x4a72, 0x4468, 0x3862, 0x3970, 0x5268, 0x465d, 0x526c, 0x3c7e, 0x3c76, 0x526f, 0x526d, 0x4c23, 0x526a, 0x5273, 0x526e, 0x5271, 0x3846, 0x4c3f, 0x5272, 0x5274, 0x5276, 0x3a70, 0x4f42, 0x526b, 0x5269, 0x5275, 0x5270, 0x5278, 0x5323, 0x527a, 0x527e, 0x5321, 0x527b, 0x533e, 0x3a69, 0x3331, 0x5279, 0x5325, 0x3076, 0x5324, 0x3025, 0x494a, 0x5322, 0x527c, 0x5277, 0x527d, 0x3a48, 0x5326, 0x3077, 0x532f, 0x5327, 0x5328, 0x3e25, 0x4b69, 0x532d, 0x532c, 0x452f, 0x532e, 0x532b, 0x3134, 0x3a36, 0x3f30, 0x5329, 0x4562, 0x532a, 0x3022, 0x5334, 0x4d23, 0x3e27, 0x533a, 0x5339, 0x5330, 0x4243, 0x5331, 0x426f, 0x5336, 0x3e26, 0x5333, 0x4c64, 0x373c, 0x5337, 0x5338, 0x5335, 0x533b, 0x5332, 0x5341, 0x5346, 0x5342, 0x533d, 0x5347, 0x4131, 0x5349, 0x3922, 0x533f, 0x437d, 0x5343, 0x533c, 0x342d, 0x346e, 0x3365, 0x5344, 0x5340, 0x3776, 0x534a, 0x5348, 0x4153, 0x354a, 0x362c, 0x5345, 0x3674, 0x3144, 0x534e, 0x534c, 0x5427, 0x5351, 0x534b, 0x534f, 0x534d, 0x3b4c, 0x5350, 0x5353, 0x5358, 0x5356, 0x5355, 0x4332, 0x3245, 0x5352, 0x5354, 0x3e28, 0x3133, 0x5357, 0x325e, 0x5362, 0x3e7c, 0x535e, 0x535c, 0x535d, 0x535f, 0x313d, 0x4139, 0x5359, 0x535a, 0x337a, 0x5361, 0x346f, 0x5364, 0x5360, 0x5363, 0x4a2e, 0x4655, 0x4838, 0x5366, 0x5365, 0x3345, 0x5367, 0x536a, 0x5369, 0x5368, 0x4739, 0x536b, 0x536c, 0x536e, 0x536d, 0x5370, 0x5373, 0x5371, 0x536f, 0x5372, 0x5374, 0x5375, 0x5376, 0x5377, 0x5378, 0x5145, 0x3c7c, 0x3b4d, 0x3273, 0x3078, 0x4344, 0x5379, 0x3a24, 0x304f, 0x3f5e, 0x537a, 0x3847, 0x3971, 0x537c, 0x537b, 0x4a60, 0x537d, 0x5421, 0x537e, 0x5422, 0x5423, 0x3777, 0x3160, 0x5424, 0x5426, 0x5425, 0x5428, 0x455a, 0x5429, 0x3035, 0x3a5f, 0x373d, 0x434f, 0x542a, 0x542b, 0x542d, 0x542e, 0x3a64, 0x3651, 0x4b37, 0x542c, 0x542f, 0x3a41, 0x3923, 0x5433, 0x3a25, 0x4333, 0x5430, 0x445a, 0x5434, 0x3f62, 0x5432, 0x5435, 0x373f, 0x5436, 0x5437, 0x3924, 0x3340, 0x5439, 0x543a, 0x543b, 0x5438, 0x5431, 0x543c, 0x543d, 0x4b64, 0x3e6b, 0x543f, 0x5440, 0x543e, 0x5442, 0x4738, 0x3068, 0x4956, 0x5443, 0x3e7d, 0x3c39, 0x475d, 0x3470, 0x3a6b, 0x4b59, 0x4632, 0x3778, 0x424f, 0x5441, 0x5444, 0x4244, 0x5445, 0x5446, 0x5448, 0x4469, 0x342e, 0x7421, 0x3161, 0x4a73, 0x3e6c, 0x4548, 0x3a66, 0x544e, 0x4a3d, 0x4e5d, 0x3274, 0x544a, 0x413a, 0x544d, 0x4563, 0x4549, 0x4564, 0x4839, 0x444d, 0x3a49, 0x5449, 0x3176, 0x4536, 0x544b, 0x5447, 0x3f50, 0x544f, 0x3d4e, 0x362d, 0x5450, 0x4a68, 0x417d, 0x4446, 0x5452, 0x4b4f, 0x5453, 0x5458, 0x4a2f, 0x5457, 0x5451, 0x5454, 0x5456, 0x3a26, 0x4a49, 0x5459, 0x4345, 0x3275, 0x3e6d, 0x545b, 0x545a, 0x3968, 0x545c, 0x545e, 0x545d, 0x5460, 0x5455, 0x5462, 0x5461, 0x545f, 0x3b4e, 0x3f51, 0x4154, 0x5463, 0x403c, 0x306d, 0x4764, 0x445b, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468, 0x5469, 0x4a51, 0x546a, 0x3246, 0x546b, 0x4d3c, 0x3330, 0x5249, 0x3d48, 0x423f, 0x546c, 0x4c6b, 0x4c34, 0x546e, 0x4267, 0x4537, 0x4240, 0x4957, 0x546f, 0x5470, 0x317b, 0x3c3a, 0x5471, 0x3050, 0x5472, 0x5473, 0x3162, 0x3471, 0x4660, 0x4a74, 0x5477, 0x4155, 0x5476, 0x3740, 0x4b5b, 0x5475, 0x4565, 0x5479, 0x5478, 0x547b, 0x547a, 0x317c, 0x547c, 0x3e29, 0x547e, 0x4325, 0x547d, 0x4a33, 0x3d77, 0x455b, 0x5521, 0x3925, 0x5522, 0x4721, 0x485e, 0x4c51, 0x4725, 0x552b, 0x3538, 0x4d45, 0x4c2f, 0x562c, 0x5523, 0x5526, 0x4245, 0x4b38, 0x454a, 0x5527, 0x4b65, 0x3a4a, 0x3e2a, 0x5528, 0x3b50, 0x3b4f, 0x3039, 0x3848, 0x402b, 0x3051, 0x552c, 0x552d, 0x552a, 0x3138, 0x342f, 0x5529, 0x4c45, 0x4931, 0x3028, 0x3079, 0x3b51, 0x3052, 0x3023, 0x5532, 0x5530, 0x4c3c, 0x5533, 0x5531, 0x552f, 0x3f31, 0x552e, 0x4a5a, 0x3864, 0x5537, 0x5538, 0x3e2b, 0x5534, 0x4f2c, 0x474c, 0x5536, 0x3a27, 0x5539, 0x4958, 0x553a, 0x5535, 0x4c3b, 0x475e, 0x553b, 0x4932, 0x553c, 0x5540, 0x553d, 0x3247, 0x553f, 0x3c3b, 0x553e, 0x3779, 0x554c, 0x5545, 0x5542, 0x4364, 0x5541, 0x5543, 0x5544, 0x5546, 0x5547, 0x3472, 0x5549, 0x5548, 0x554a, 0x3e6e, 0x554d, 0x445c, 0x3145, 0x554b, 0x554e, 0x554f, 0x5552, 0x5550, 0x5551, 0x3b52, 0x5553, 0x3926, 0x5554, 0x3b7a, 0x4238, 0x5555, 0x5556, 0x3b5a, 0x3927, 0x4c52, 0x3528, 0x3849, 0x5557, 0x3358, 0x5558, 0x4239, 0x5559, 0x5623, 0x555a, 0x555b, 0x555c, 0x555e, 0x555f, 0x5560, 0x4270, 0x3127, 0x3c69, 0x3042, 0x4157, 0x3430, 0x3c35, 0x3928, 0x4566, 0x3d21, 0x3431, 0x4368, 0x446a, 0x3038, 0x3539, 0x4a75, 0x3c42, 0x3552, 0x406b, 0x3c3c, 0x4d28, 0x5561, 0x355c, 0x3a4b, 0x3332, 0x3163, 0x3e2c, 0x3248, 0x5562, 0x4d46, 0x3d49, 0x3c64, 0x5563, 0x3473, 0x4652, 0x4c29, 0x5564, 0x5565, 0x4959, 0x5567, 0x3428, 0x3677, 0x5566, 0x3432, 0x3f32, 0x556b, 0x3b21, 0x3249, 0x556a, 0x5568, 0x556c, 0x5569, 0x472b, 0x5c4d, 0x3f33, 0x556d, 0x4e40, 0x556e, 0x5570, 0x437e, 0x556f, 0x4023, 0x3b7b, 0x4250, 0x3c77, 0x4975, 0x406c, 0x3c4d, 0x5571, 0x3e2d, 0x5572, 0x5573, 0x3053, 0x423a, 0x3f52, 0x5574, 0x4633, 0x3e2e, 0x3e2f, 0x5575, 0x406d, 0x3e30, 0x5576, 0x5577, 0x4c60, 0x5578, 0x3646, 0x3d22, 0x5579, 0x557a, 0x3c5c, 0x3f2c, 0x4674, 0x3f54, 0x4878, 0x4722, 0x3649, 0x557b, 0x356f, 0x557c, 0x367e, 0x464f, 0x3230, 0x3b53, 0x557d, 0x5622, 0x5621, 0x367d, 0x557e, 0x4538, 0x4230, 0x454b, 0x3c48, 0x4158, 0x4d7a, 0x5624, 0x5625, 0x4656, 0x3b33, 0x5627, 0x5628, 0x5629, 0x3474, 0x562a, 0x562b, 0x322c, 0x413b, 0x3464, 0x562d, 0x4c28, 0x4252, 0x3359, 0x562f, 0x5631, 0x345f, 0x562e, 0x5630, 0x5633, 0x5632, 0x5634, 0x5635, 0x463d, 0x362e, 0x3265, 0x5636, 0x563b, 0x5639, 0x4a77, 0x4a76, 0x4567, 0x5638, 0x3d54, 0x5637, 0x3f72, 0x563c, 0x3a6a, 0x5642, 0x5643, 0x563d, 0x3333, 0x563e, 0x5647, 0x5646, 0x5645, 0x5641, 0x5640, 0x5644, 0x4a78, 0x564b, 0x5648, 0x564a, 0x4d72, 0x5649, 0x563f, 0x3f73, 0x564c, 0x3a37, 0x564d, 0x564e, 0x5651, 0x5650, 0x564f, 0x4568, 0x563a, 0x5657, 0x5653, 0x5652, 0x5654, 0x5655, 0x5658, 0x4e66, 0x5659, 0x5656, 0x565a, 0x3460, 0x565b, 0x565d, 0x565c, 0x565e, 0x565f, 0x406e, 0x3d23, 0x3d64, 0x4163, 0x3929, 0x3a38, 0x392a, 0x3570, 0x5660, 0x3a39, 0x384a, 0x5661, 0x4c26, 0x4743, 0x5662, 0x392b, 0x342c, 0x4327, 0x3652, 0x3b54, 0x495b, 0x4841, 0x5663, 0x3475, 0x5666, 0x4421, 0x5665, 0x5664, 0x5667, 0x446b, 0x3f63, 0x3b55, 0x404a, 0x4253, 0x3522, 0x4422, 0x5668, 0x5669, 0x3e6f, 0x4b39, 0x566c, 0x566b, 0x566a, 0x497d, 0x5673, 0x4b5a, 0x566d, 0x566f, 0x4b6b, 0x566e, 0x5670, 0x4828, 0x5671, 0x4a3e, 0x5672, 0x3433, 0x4a3f, 0x472f, 0x5674, 0x5675, 0x392c, 0x3434, 0x5676, 0x3838, 0x4d44, 0x4d29, 0x3476, 0x5678, 0x4423, 0x392d, 0x3e31, 0x485f, 0x3e32, 0x3d78, 0x446c, 0x4a79, 0x4539, 0x392e, 0x495c, 0x5679, 0x4559, 0x3a42, 0x384b, 0x446d, 0x3043, 0x3d6e, 0x392f, 0x4d47, 0x567a, 0x567b, 0x4751, 0x567c, 0x4e77, 0x4f2d, 0x567e, 0x567d, 0x3347, 0x5721, 0x5724, 0x5725, 0x5723, 0x4940, 0x3e33, 0x5727, 0x5726, 0x5722, 0x5728, 0x5729, 0x572a, 0x572d, 0x572b, 0x572c, 0x572e, 0x3164, 0x446e, 0x572f, 0x377a, 0x3276, 0x4736, 0x5730, 0x467b, 0x4a5b, 0x5731, 0x4f2e, 0x5732, 0x4a40, 0x5735, 0x5021, 0x5031, 0x3c30, 0x4675, 0x5736, 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26, 0x3930, 0x4350, 0x446f, 0x4c6f, 0x3839, 0x384c, 0x5738, 0x5739, 0x573f, 0x3c65, 0x4425, 0x362f, 0x573a, 0x492b, 0x4346, 0x573b, 0x573c, 0x3630, 0x573d, 0x573e, 0x5740, 0x4576, 0x5741, 0x5742, 0x5743, 0x5734, 0x5733, 0x5744, 0x3741, 0x4927, 0x3a4c, 0x4937, 0x4426, 0x494b, 0x5745, 0x3e34, 0x3146, 0x5746, 0x5747, 0x4c72, 0x4860, 0x574a, 0x317d, 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x574e, 0x574c, 0x574b, 0x4e27, 0x3865, 0x3d79, 0x574d, 0x454c, 0x3d3e, 0x4640, 0x5751, 0x5750, 0x574f, 0x5752, 0x3866, 0x5753, 0x497c, 0x3d5b, 0x5754, 0x4879, 0x4641, 0x4427, 0x4530, 0x5755, 0x352b, 0x3f34, 0x492c, 0x3477, 0x4726, 0x5756, 0x3b56, 0x4b3a, 0x4b3b, 0x317e, 0x575b, 0x4369, 0x5758, 0x3277, 0x582d, 0x575a, 0x4730, 0x5759, 0x5757, 0x397a, 0x575d, 0x5763, 0x5769, 0x5761, 0x455c, 0x5766, 0x495d, 0x5760, 0x5765, 0x4e67, 0x3b57, 0x4255, 0x575e, 0x355e, 0x5768, 0x402d, 0x3165, 0x5762, 0x3278, 0x5767, 0x3631, 0x5764, 0x576a, 0x576c, 0x5776, 0x5774, 0x5771, 0x5770, 0x4e78, 0x5772, 0x3632, 0x3931, 0x3d7a, 0x5779, 0x576b, 0x576f, 0x575f, 0x327a, 0x5773, 0x5775, 0x4351, 0x3a28, 0x3238, 0x576d, 0x5778, 0x5777, 0x3633, 0x4229, 0x3366, 0x3743, 0x576e, 0x577a, 0x577d, 0x5821, 0x3c3d, 0x5827, 0x4470, 0x577b, 0x5825, 0x3279, 0x5823, 0x5824, 0x577e, 0x5822, 0x3867, 0x4d2a, 0x3435, 0x3159, 0x5826, 0x473a, 0x302d, 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, 0x5829, 0x4569, 0x582e, 0x3e70, 0x582f, 0x4657, 0x4f47, 0x582b, 0x5831, 0x397b, 0x404b, 0x3054, 0x582a, 0x5828, 0x415a, 0x577c, 0x3b34, 0x4246, 0x583d, 0x415b, 0x5838, 0x5835, 0x5836, 0x3c66, 0x5839, 0x583c, 0x5837, 0x3d25, 0x583a, 0x5834, 0x4c7c, 0x4c7b, 0x583e, 0x583f, 0x3055, 0x5833, 0x3672, 0x3026, 0x3436, 0x583b, 0x5843, 0x5842, 0x5847, 0x5848, 0x5846, 0x5849, 0x5841, 0x5845, 0x584a, 0x584b, 0x5840, 0x3b7c, 0x5844, 0x4256, 0x3932, 0x5832, 0x3f35, 0x5858, 0x4a69, 0x584e, 0x584f, 0x5850, 0x5857, 0x5856, 0x4b7d, 0x3437, 0x5854, 0x3745, 0x3334, 0x5851, 0x4e38, 0x5853, 0x3056, 0x5855, 0x584c, 0x5852, 0x5859, 0x3744, 0x584d, 0x4d5d, 0x4d2b, 0x585c, 0x5860, 0x417e, 0x4e79, 0x5861, 0x585e, 0x585b, 0x585a, 0x585f, 0x4a30, 0x4634, 0x3746, 0x5862, 0x585d, 0x5863, 0x377b, 0x3231, 0x586b, 0x3438, 0x5869, 0x586a, 0x3a29, 0x5868, 0x5866, 0x5865, 0x586c, 0x5864, 0x586e, 0x327b, 0x5870, 0x586f, 0x4428, 0x5873, 0x5871, 0x5867, 0x377c, 0x5872, 0x5876, 0x5875, 0x5877, 0x5874, 0x5878, 0x5879, 0x587a, 0x4a6a, 0x587c, 0x587b, 0x3d3f, 0x402e, 0x3266, 0x327c, 0x587d, 0x303f, 0x404c, 0x587e, 0x6c43, 0x5921, 0x3761, 0x5922, 0x406f, 0x5923, 0x5924, 0x353a, 0x5925, 0x5926, 0x5927, 0x4257, 0x384d, 0x4c61, 0x4b3c, 0x3d6a, 0x5928, 0x4070, 0x6e3d, 0x4862, 0x3c6a, 0x3a4d, 0x5929, 0x4247, 0x4a27, 0x4271, 0x592c, 0x592a, 0x592d, 0x592b, 0x592e, 0x4a31, 0x3037, 0x495e, 0x4863, 0x592f, 0x5932, 0x3e35, 0x353b, 0x5930, 0x5937, 0x3e36, 0x5931, 0x4744, 0x4d5e, 0x5933, 0x5934, 0x5938, 0x456a, 0x5935, 0x3933, 0x405e, 0x5946, 0x4834, 0x4272, 0x4864, 0x5a2d, 0x4a7a, 0x4471, 0x4b75, 0x593b, 0x3221, 0x436a, 0x5944, 0x4334, 0x593e, 0x5945, 0x5940, 0x5947, 0x5943, 0x5942, 0x476f, 0x593c, 0x327d, 0x593a, 0x3571, 0x4273, 0x5936, 0x5939, 0x3934, 0x405b, 0x3e37, 0x5941, 0x4752, 0x3572, 0x3348, 0x3367, 0x3f21, 0x5949, 0x594e, 0x594a, 0x377d, 0x594f, 0x3b22, 0x3969, 0x3d26, 0x593d, 0x3b7d, 0x594c, 0x3b58, 0x594d, 0x3044, 0x5948, 0x4429, 0x3573, 0x3634, 0x594b, 0x3027, 0x3a43, 0x3f36, 0x4472, 0x4854, 0x5951, 0x415e, 0x422a, 0x3b2b, 0x5952, 0x5954, 0x5950, 0x4a61, 0x443d, 0x415c, 0x4a7b, 0x3c4e, 0x5960, 0x595f, 0x3f78, 0x377e, 0x5959, 0x3e39, 0x4668, 0x4731, 0x5957, 0x415d, 0x3c78, 0x595c, 0x3e38, 0x5956, 0x595b, 0x4753, 0x5955, 0x3721, 0x335d, 0x595d, 0x4e2b, 0x3a4e, 0x4335, 0x595a, 0x405c, 0x3935, 0x3f64, 0x3166, 0x413c, 0x5958, 0x3545, 0x3747, 0x444f, 0x595e, 0x415f, 0x5961, 0x5963, 0x4237, 0x5969, 0x5964, 0x5966, 0x4941, 0x4473, 0x5967, 0x4d2c, 0x4d48, 0x3439, 0x302e, 0x5965, 0x5962, 0x3478, 0x3167, 0x5968, 0x4d49, 0x596c, 0x423b, 0x5973, 0x596d, 0x596a, 0x5971, 0x5953, 0x596e, 0x5972, 0x4842, 0x456b, 0x596b, 0x596f, 0x3748, 0x3a71, 0x405d, 0x5977, 0x4526, 0x5974, 0x4b60, 0x5975, 0x5976, 0x4c4e, 0x4022, 0x3762, 0x597d, 0x3b35, 0x597a, 0x5979, 0x4732, 0x4635, 0x4531, 0x597b, 0x597c, 0x496f, 0x4745, 0x3b23, 0x4071, 0x4b50, 0x3349, 0x5a25, 0x597e, 0x4d4a, 0x5a27, 0x5a23, 0x5a24, 0x4160, 0x5a22, 0x593f, 0x5a26, 0x5a21, 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0x3b24, 0x5a29, 0x353c, 0x5a2f, 0x5a28, 0x5a33, 0x5a32, 0x5a31, 0x5a34, 0x5a36, 0x3e71, 0x5a35, 0x5a39, 0x5a37, 0x5a38, 0x5970, 0x5a3b, 0x5a3a, 0x5978, 0x5a3c, 0x5a30, 0x3b59, 0x5a3d, 0x5a3e, 0x5a40, 0x5a3f, 0x5a41, 0x327e, 0x3936, 0x4a7c, 0x402f, 0x384e, 0x5a43, 0x5a46, 0x4952, 0x355f, 0x5a45, 0x5a44, 0x4754, 0x5a47, 0x3635, 0x5a49, 0x5a48, 0x343a, 0x3b36, 0x4658, 0x3749, 0x3f74, 0x5a4a, 0x4030, 0x4528, 0x495f, 0x5a4b, 0x5a4c, 0x5a4d, 0x4a38, 0x555d, 0x4046, 0x494c, 0x3a58, 0x4865, 0x4843, 0x454d, 0x4e41, 0x5a4f, 0x3c50, 0x5a50, 0x3036, 0x3654, 0x404d, 0x4960, 0x5a51, 0x3b42, 0x4347, 0x3b5b, 0x3f37, 0x5a52, 0x4a7d, 0x3177, 0x3b5c, 0x5a55, 0x5a53, 0x5a56, 0x4e39, 0x5a54, 0x407b, 0x5a57, 0x4232, 0x5a58, 0x347a, 0x5a5a, 0x5a59, 0x5a5b, 0x5a5c, 0x347b, 0x467c, 0x4336, 0x356c, 0x3b5d, 0x4161, 0x3d5c, 0x3030, 0x5a5d, 0x3222, 0x5a61, 0x3937, 0x5a60, 0x3a2b, 0x3e3a, 0x5a5f, 0x3e3b, 0x4c40, 0x3a2a, 0x3057, 0x404e, 0x5a66, 0x4031, 0x3147, 0x3d55, 0x4b66, 0x3a72, 0x3e3c, 0x4027, 0x5a65, 0x5a63, 0x5a64, 0x436b, 0x5b26, 0x5a6a, 0x3b7e, 0x3938, 0x5a68, 0x5a69, 0x3f38, 0x5a67, 0x3b2f, 0x5a6c, 0x5a6b, 0x5a70, 0x5a71, 0x5a6d, 0x3322, 0x5a6e, 0x5a6f, 0x4855, 0x4961, 0x374a, 0x5a72, 0x4032, 0x3e3d, 0x4352, 0x3647, 0x5a73, 0x5a77, 0x324b, 0x5a74, 0x5a76, 0x5a75, 0x3d6b, 0x4348, 0x3045, 0x5a78, 0x5a79, 0x442a, 0x4e71, 0x3b43, 0x4a6b, 0x4b3d, 0x5b22, 0x5a7b, 0x5a7e, 0x5a7d, 0x5a7a, 0x5b21, 0x465e, 0x5a7c, 0x5b23, 0x3d6c, 0x5b24, 0x4d4b, 0x4778, 0x5b25, 0x5b27, 0x5b28, 0x5b29, 0x364a, 0x3148, 0x3939, 0x5b2a, 0x5b2b, 0x3d71, 0x4162, 0x5258, 0x413e, 0x413d, 0x4258, 0x3a47, 0x5072, 0x376e, 0x4d2d, 0x4a7e, 0x497e, 0x5b2c, 0x3a73, 0x443f, 0x5b2d, 0x4f2f, 0x4b3e, 0x442b, 0x5b2e, 0x347c, 0x5b2f, 0x5b30, 0x4c5a, 0x4c24, 0x4b76, 0x4b5c, 0x3b25, 0x5b32, 0x3c6b, 0x4b51, 0x5b34, 0x5b37, 0x5b36, 0x3479, 0x3560, 0x5b33, 0x5b35, 0x5b38, 0x3f79, 0x4d7b, 0x3049, 0x3a60, 0x423c, 0x3c5d, 0x3e73, 0x5b3b, 0x454e, 0x5b39, 0x422b, 0x5b3a, 0x3e72, 0x4c5d, 0x5b3c, 0x5b3d, 0x4d68, 0x5b42, 0x393a, 0x4755, 0x5b3f, 0x456c, 0x5a5e, 0x5a62, 0x354f, 0x4747, 0x5b41, 0x3e3e, 0x4844, 0x5b47, 0x487a, 0x5b3e, 0x5b44, 0x5b43, 0x404f, 0x4b6d, 0x4e53, 0x4b67, 0x324c, 0x3b5e, 0x4f48, 0x5b46, 0x3f75, 0x5b45, 0x5b40, 0x384f, 0x5b4c, 0x5b4a, 0x324d, 0x5b48, 0x5b4e, 0x5b54, 0x4248, 0x4a41, 0x5b56, 0x4922, 0x5b55, 0x4770, 0x4b3f, 0x343b, 0x4077, 0x3d40, 0x4453, 0x4d2e, 0x5b51, 0x5b50, 0x5b52, 0x5b4f, 0x5b57, 0x5b4d, 0x5b4b, 0x5b53, 0x5b49, 0x436c, 0x4c78, 0x3c46, 0x3a74, 0x3a3a, 0x4b6f, 0x3341, 0x444e, 0x464a, 0x3149, 0x4072, 0x4034, 0x372a, 0x5b59, 0x393b, 0x337c, 0x5b5b, 0x3374, 0x5b61, 0x5b5e, 0x4073, 0x334b, 0x3a2c, 0x334a, 0x3a4f, 0x5b5c, 0x3765, 0x374b, 0x456d, 0x5b5a, 0x3046, 0x5b5d, 0x5b5f, 0x364d, 0x372c, 0x343c, 0x354b, 0x5b62, 0x3a79, 0x4b71, 0x3b37, 0x5b63, 0x4930, 0x5b6f, 0x3233, 0x5b64, 0x5b75, 0x5b65, 0x4e42, 0x5b6c, 0x475f, 0x5b74, 0x5b67, 0x3034, 0x5b69, 0x393c, 0x5b6b, 0x5b6a, 0x5b66, 0x5b71, 0x3e3f, 0x546d, 0x3868, 0x4d7c, 0x5b68, 0x4474, 0x3323, 0x3a2d, 0x5b60, 0x5b70, 0x3361, 0x5b6e, 0x5b72, 0x456e, 0x347e, 0x5c32, 0x4c49, 0x5b77, 0x347d, 0x5b7e, 0x4b40, 0x5c21, 0x5c23, 0x5c27, 0x5b79, 0x432a, 0x456f, 0x5c2b, 0x5b7c, 0x5c28, 0x5c22, 0x3f39, 0x5c2c, 0x4033, 0x5c2a, 0x343d, 0x4f50, 0x5b76, 0x5c26, 0x3058, 0x5b78, 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73, 0x5c25, 0x3f7a, 0x5c2f, 0x3371, 0x3821, 0x5c31, 0x5b7a, 0x5c30, 0x5c29, 0x5b7b, 0x5c2d, 0x5c2e, 0x5c3f, 0x464e, 0x5c24, 0x5c3b, 0x5c3d, 0x4458, 0x4d4c, 0x4976, 0x5c38, 0x424a, 0x5c3e, 0x413f, 0x5c35, 0x5c42, 0x5c41, 0x466f, 0x5c40, 0x466a, 0x5c44, 0x5c37, 0x3648, 0x5c3a, 0x3d5d, 0x4760, 0x5c3c, 0x364b, 0x5c34, 0x5c36, 0x5c33, 0x4f30, 0x335a, 0x5c39, 0x5c43, 0x3335, 0x3a67, 0x315d, 0x5c54, 0x4f31, 0x5c57, 0x3f3a, 0x5c56, 0x5c55, 0x5c52, 0x5c46, 0x5c63, 0x5c45, 0x5c58, 0x5c50, 0x5c4b, 0x5c48, 0x5c49, 0x5c51, 0x7422, 0x5c4e, 0x393d, 0x4448, 0x4164, 0x5c4c, 0x5c47, 0x5c4a, 0x4d4d, 0x4b6a, 0x5c4f, 0x5c59, 0x5c61, 0x5c5a, 0x5c67, 0x5c65, 0x5c60, 0x5c5f, 0x4450, 0x4165, 0x5c5d, 0x5c5b, 0x5c62, 0x5c68, 0x4875, 0x5c6e, 0x5c69, 0x5c6c, 0x5c66, 0x4374, 0x4938, 0x5c5c, 0x5c64, 0x3e40, 0x4c4f, 0x5c78, 0x5c6b, 0x3822, 0x3223, 0x335f, 0x5c53, 0x3e41, 0x5c70, 0x5c77, 0x3c79, 0x3372, 0x432e, 0x5c6d, 0x5c72, 0x5c76, 0x3636, 0x354c, 0x5c74, 0x3521, 0x464b, 0x5c73, 0x5c75, 0x5c6f, 0x5c71, 0x3360, 0x4349, 0x5c7c, 0x5c7a, 0x3869, 0x5c79, 0x5d21, 0x5b58, 0x5c7b, 0x5c7d, 0x5c7e, 0x5d2c, 0x5d28, 0x5b6d, 0x5d27, 0x5d26, 0x5d23, 0x5c6a, 0x5d25, 0x5d24, 0x5d2a, 0x4f26, 0x5d2d, 0x367b, 0x5d29, 0x5d2b, 0x4827, 0x5d2e, 0x5d32, 0x5d2f, 0x4d73, 0x5d30, 0x5c5e, 0x5d33, 0x5d34, 0x3135, 0x5d36, 0x3767, 0x3c21, 0x3655, 0x3224, 0x4d5f, 0x5d38, 0x5d37, 0x5d3a, 0x353d, 0x3656, 0x343e, 0x5d3d, 0x5d3c, 0x5d3e, 0x324e, 0x4337, 0x5d3f, 0x343f, 0x5d41, 0x5d40, 0x5d42, 0x5d43, 0x5d44, 0x3b5f, 0x4035, 0x3a21, 0x4970, 0x4a62, 0x4f44, 0x3b75, 0x3a50, 0x4e72, 0x5d45, 0x5d46, 0x3b60, 0x5d47, 0x5d48, 0x5d4a, 0x5d49, 0x4b58, 0x3d5e, 0x3c6c, 0x3b44, 0x5d4b, 0x5d4d, 0x3f23, 0x5d4c, 0x5d4e, 0x5d4f, 0x5d50, 0x5d51, 0x5d52, 0x5d54, 0x5d53, 0x5d55, 0x3225, 0x434a, 0x5d56, 0x3b26, 0x334c, 0x5d57, 0x4542, 0x544c, 0x3523, 0x5d58, 0x5d59, 0x4a6c, 0x4b68, 0x4647, 0x5d5a, 0x4866, 0x487b, 0x4c53, 0x5d5b, 0x5d5d, 0x5d5c, 0x5d5f, 0x5d5e, 0x5d61, 0x3b61, 0x4c31, 0x5d62, 0x5d63, 0x3524, 0x5d64, 0x5d66, 0x5d65, 0x3f65, 0x4939, 0x314a, 0x4845, 0x4475, 0x3d41, 0x3561, 0x4846, 0x3c2e, 0x5d68, 0x3440, 0x3178, 0x4672, 0x5d67, 0x393e, 0x4353, 0x5d69, 0x5d71, 0x5d6a, 0x4241, 0x3562, 0x5d72, 0x3768, 0x3525, 0x5d70, 0x5d6e, 0x5d6b, 0x4d60, 0x4440, 0x4659, 0x5d6c, 0x5d74, 0x5d73, 0x3723, 0x322d, 0x3a3b, 0x5d6d, 0x5d6f, 0x4b57, 0x4274, 0x4b77, 0x5d7c, 0x5d7d, 0x324f, 0x4a28, 0x4c7d, 0x5e21, 0x3c23, 0x3e42, 0x5d78, 0x5d7e, 0x3168, 0x3637, 0x5d75, 0x5d7a, 0x4074, 0x4771, 0x4867, 0x5d77, 0x4b21, 0x5d79, 0x5e24, 0x5e22, 0x5d7b, 0x4b22, 0x4748, 0x3563, 0x4525, 0x436d, 0x5e25, 0x5e23, 0x4259, 0x5d76, 0x314b, 0x4d4e, 0x5e30, 0x5e2f, 0x4076, 0x5e2c, 0x4d6c, 0x4636, 0x5e26, 0x4445, 0x314c, 0x393f, 0x5e29, 0x3d27, 0x5e2e, 0x5e2d, 0x5e28, 0x5e2b, 0x3368, 0x5e2a, 0x4749, 0x4e2e, 0x3e74, 0x4075, 0x5e36, 0x5e34, 0x494d, 0x5e31, 0x5e33, 0x313a, 0x3940, 0x4f32, 0x333d, 0x4962, 0x4d61, 0x3324, 0x3f3b, 0x5e35, 0x5e3a, 0x3e43, 0x4d30, 0x5e37, 0x5e32, 0x5e38, 0x4e5e, 0x4573, 0x4642, 0x3336, 0x3155, 0x5e3e, 0x5e41, 0x4e43, 0x4d64, 0x5e48, 0x5e42, 0x5e3f, 0x4e54, 0x5e45, 0x3d4a, 0x5e47, 0x5e4c, 0x4571, 0x5e4a, 0x5e44, 0x4338, 0x5e4b, 0x5e40, 0x5e46, 0x5e4d, 0x307c, 0x5e43, 0x5e4e, 0x3f3c, 0x3d5f, 0x4a25, 0x3a2e, 0x5e3b, 0x5e49, 0x453a, 0x4036, 0x3369, 0x3a51, 0x3e44, 0x5e3d, 0x3d42, 0x374c, 0x5e3c, 0x5e52, 0x3d6d, 0x383a, 0x5e61, 0x5e5b, 0x3574, 0x454f, 0x5e56, 0x5e5f, 0x302f, 0x3132, 0x3239, 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941, 0x5e62, 0x5e5d, 0x5e55, 0x5e5c, 0x4c2b, 0x5e5a, 0x5e5e, 0x3850, 0x3e45, 0x4339, 0x5e54, 0x4d2f, 0x5e57, 0x5e50, 0x4572, 0x5e53, 0x5e59, 0x4f51, 0x3c3e, 0x4b7e, 0x5e63, 0x482e, 0x5e6f, 0x383b, 0x3d60, 0x5e65, 0x4e2f, 0x3942, 0x5e72, 0x306e, 0x5e70, 0x5e64, 0x5e6a, 0x5e6c, 0x4d4f, 0x5e67, 0x452e, 0x5e69, 0x5e71, 0x5e6b, 0x4c47, 0x5e66, 0x3c22, 0x5e7e, 0x336a, 0x5e68, 0x5e6d, 0x5e6e, 0x426c, 0x425a, 0x5e76, 0x5e7c, 0x5e7a, 0x4529, 0x5f23, 0x5e77, 0x5e78, 0x5e60, 0x3579, 0x493a, 0x3c3f, 0x3977, 0x4f33, 0x5e74, 0x5f22, 0x3169, 0x4166, 0x4779, 0x3441, 0x4e7a, 0x4c21, 0x4452, 0x5e7b, 0x5e7d, 0x4132, 0x5f21, 0x5e79, 0x5e73, 0x3443, 0x3769, 0x5f2f, 0x5f2a, 0x4078, 0x3363, 0x3d61, 0x5f33, 0x5f2c, 0x442c, 0x5f29, 0x4459, 0x5f4c, 0x5f26, 0x5f25, 0x5f2e, 0x5f28, 0x5f27, 0x5f2d, 0x4021, 0x5f24, 0x5f30, 0x5f31, 0x3442, 0x5f36, 0x5f35, 0x5f37, 0x5f3a, 0x4543, 0x5f34, 0x5f38, 0x3763, 0x4279, 0x5f32, 0x473b, 0x5f39, 0x5f3e, 0x5f3c, 0x5f3f, 0x5f42, 0x5f3b, 0x396a, 0x4728, 0x5e39, 0x4d74, 0x5f3d, 0x5f41, 0x4275, 0x5f40, 0x5f2b, 0x6f69, 0x5f45, 0x5f49, 0x5f47, 0x5f43, 0x5f44, 0x5f48, 0x5f46, 0x494e, 0x5f4e, 0x5f4b, 0x5f4a, 0x5f4d, 0x4654, 0x5f4f, 0x4375, 0x426d, 0x4025, 0x5f50, 0x5f52, 0x5f51, 0x5e75, 0x5f53, 0x4667, 0x5f54, 0x3250, 0x4574, 0x3325, 0x3564, 0x3c5e, 0x3a52, 0x4f27, 0x3f66, 0x316a, 0x5f56, 0x5f55, 0x5f59, 0x433a, 0x5f5c, 0x5f57, 0x5f5b, 0x5f5a, 0x4540, 0x3059, 0x4e75, 0x5f5e, 0x3128, 0x5f60, 0x5f5f, 0x5f5d, 0x5f58, 0x4b23, 0x5f62, 0x5f61, 0x316b, 0x5f64, 0x4a32, 0x5f63, 0x4c35, 0x3e47, 0x4133, 0x3e46, 0x4e7b, 0x5f6a, 0x4079, 0x5f66, 0x5f6b, 0x316c, 0x5f69, 0x4761, 0x5f65, 0x5f68, 0x3e48, 0x4851, 0x5f6c, 0x3c51, 0x407a, 0x5f6f, 0x5f67, 0x3727, 0x5f6d, 0x4d50, 0x5f70, 0x7426, 0x3d4f, 0x5f71, 0x5f72, 0x472e, 0x5f74, 0x5f75, 0x4733, 0x4575, 0x5f77, 0x5f79, 0x4e55, 0x5f76, 0x5f78, 0x316d, 0x5f73, 0x535b, 0x5f7a, 0x4167, 0x3b38, 0x5f7c, 0x5f7b, 0x3f24, 0x5259, 0x5f7d, 0x6021, 0x5f6e, 0x5f7e, 0x6022, 0x477a, 0x6023, 0x6024, 0x6025, 0x6026, 0x445e, 0x6028, 0x6027, 0x6029, 0x602a, 0x3c5f, 0x4963, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24, 0x602d, 0x602e, 0x602f, 0x4a52, 0x4847, 0x6030, 0x4757, 0x442d, 0x6031, 0x3267, 0x356d, 0x4c46, 0x4c36, 0x3234, 0x4f34, 0x4b52, 0x4a2a, 0x4037, 0x6032, 0x4643, 0x3823, 0x6033, 0x3a54, 0x6035, 0x6034, 0x6036, 0x6037, 0x6038, 0x353e, 0x6039, 0x603a, 0x3824, 0x4848, 0x603c, 0x3e75, 0x603b, 0x3638, 0x603d, 0x603f, 0x603e, 0x6040, 0x3851, 0x6041, 0x3669, 0x4140, 0x397d, 0x6043, 0x6044, 0x6042, 0x3c6d, 0x4648, 0x3639, 0x6046, 0x432c, 0x6045, 0x4f35, 0x4762, 0x6049, 0x604b, 0x6048, 0x4c54, 0x604a, 0x604c, 0x4e44, 0x6050, 0x604f, 0x4376, 0x472d, 0x3825, 0x604e, 0x604d, 0x4d31, 0x4d32, 0x6051, 0x316e, 0x3976, 0x3b62, 0x6052, 0x6053, 0x6055, 0x3d43, 0x6057, 0x6056, 0x6058, 0x334d, 0x605a, 0x6059, 0x605c, 0x605b, 0x383c, 0x4e28, 0x364c, 0x3226, 0x366a, 0x3461, 0x4e68, 0x605e, 0x6060, 0x6061, 0x3251, 0x605d, 0x3b39, 0x4441, 0x605f, 0x6064, 0x3c6e, 0x6062, 0x373e, 0x4849, 0x6063, 0x607e, 0x6069, 0x383d, 0x3565, 0x6066, 0x4d7d, 0x4e30, 0x4276, 0x6068, 0x606a, 0x4e56, 0x3657, 0x487c, 0x474a, 0x606b, 0x606d, 0x6070, 0x606c, 0x606f, 0x386a, 0x314d, 0x6071, 0x3f70, 0x606e, 0x4e5c, 0x6074, 0x7424, 0x6072, 0x6075, 0x6067, 0x6073, 0x3a3c, 0x6076, 0x6077, 0x4d7e, 0x6078, 0x6079, 0x6065, 0x607a, 0x3444, 0x3c25, 0x607b, 0x607c, 0x607d, 0x313b, 0x6121, 0x493b, 0x6122, 0x3424, 0x6123, 0x6124, 0x6125, 0x6127, 0x6128, 0x6126, 0x4953, 0x612a, 0x6129, 0x612c, 0x612b, 0x612d, 0x612e, 0x6130, 0x612f, 0x3979, 0x6132, 0x6131, 0x3445, 0x3f53, 0x453c, 0x6133, 0x4038, 0x3b3a, 0x3179, 0x6134, 0x4d51, 0x4a63, 0x6135, 0x4544, 0x4d33, 0x3943, 0x3f3d, 0x434b, 0x5234, 0x442e, 0x3268, 0x6136, 0x6137, 0x613c, 0x613a, 0x6139, 0x5a42, 0x3326, 0x6138, 0x305a, 0x482a, 0x484a, 0x4e31, 0x613d, 0x613b, 0x435c, 0x4026, 0x482b, 0x492d, 0x613f, 0x4e2c, 0x374d, 0x6140, 0x613e, 0x4856, 0x6141, 0x6142, 0x305b, 0x3e76, 0x6147, 0x6144, 0x466d, 0x6143, 0x3526, 0x614a, 0x6145, 0x6146, 0x6149, 0x6148, 0x4925, 0x4142, 0x4141, 0x353f, 0x614b, 0x614c, 0x614d, 0x614f, 0x614e, 0x3156, 0x6157, 0x4868, 0x6151, 0x6153, 0x6155, 0x3f3e, 0x6156, 0x6154, 0x3c40, 0x6150, 0x6152, 0x4942, 0x3e49, 0x6159, 0x6158, 0x615a, 0x3c26, 0x3a2f, 0x4577, 0x615b, 0x444b, 0x615d, 0x4e21, 0x615c, 0x4169, 0x6162, 0x6164, 0x6165, 0x4354, 0x6163, 0x6160, 0x615e, 0x615f, 0x6161, 0x6168, 0x6166, 0x6167, 0x6169, 0x616b, 0x616c, 0x616d, 0x616e, 0x616a, 0x6170, 0x616f, 0x6171, 0x4e45, 0x6174, 0x6172, 0x6173, 0x3462, 0x4c7e, 0x4a4a, 0x6176, 0x6175, 0x6177, 0x6178, 0x617c, 0x6179, 0x617a, 0x617b, 0x617d, 0x617e, 0x6221, 0x6222, 0x6223, 0x482f, 0x4550, 0x6224, 0x4772, 0x4934, 0x6225, 0x6226, 0x452a, 0x3327, 0x3944, 0x6227, 0x6228, 0x6229, 0x3b29, 0x622b, 0x622a, 0x622c, 0x622d, 0x4869, 0x622e, 0x622f, 0x7369, 0x6230, 0x6231, 0x6232, 0x3b2e, 0x6233, 0x4756, 0x4b5f, 0x314e, 0x3157, 0x6234, 0x6236, 0x6235, 0x4570, 0x4039, 0x5d39, 0x6237, 0x4c41, 0x6238, 0x3446, 0x4857, 0x6239, 0x623a, 0x623b, 0x4c5c, 0x4c55, 0x443e, 0x416a, 0x623d, 0x3d62, 0x3e4a, 0x6240, 0x623f, 0x623e, 0x487d, 0x3447, 0x3829, 0x6246, 0x6243, 0x3f3f, 0x4c32, 0x6242, 0x6244, 0x6245, 0x6241, 0x6247, 0x6248, 0x442f, 0x3463, 0x4365, 0x6249, 0x624a, 0x624d, 0x3f67, 0x4644, 0x624e, 0x4b53, 0x624b, 0x624c, 0x6251, 0x6250, 0x624f, 0x6253, 0x6252, 0x6254, 0x6256, 0x6255, 0x4a4d, 0x3d56, 0x4e46, 0x6257, 0x4637, 0x6258, 0x6259, 0x625d, 0x625b, 0x625c, 0x625a, 0x625e, 0x625f, 0x6260, 0x6261, 0x4c37, 0x6262, 0x4c70, 0x6263, 0x434e, 0x476a, 0x366b, 0x433b, 0x6264, 0x363a, 0x4050, 0x6265, 0x3a3d, 0x6266, 0x6267, 0x3826, 0x3a55, 0x6269, 0x4556, 0x3a56, 0x354e, 0x4b24, 0x474b, 0x4557, 0x395c, 0x626b, 0x3e4b, 0x4e32, 0x3945, 0x3827, 0x4823, 0x626d, 0x626f, 0x386b, 0x626e, 0x4476, 0x6271, 0x3337, 0x626c, 0x486a, 0x3130, 0x3a6c, 0x4f52, 0x6270, 0x6272, 0x4a4b, 0x4059, 0x6274, 0x6275, 0x6273, 0x334e, 0x627b, 0x627a, 0x3c27, 0x627c, 0x6277, 0x627d, 0x6278, 0x4858, 0x6276, 0x6279, 0x6322, 0x6321, 0x4b61, 0x627e, 0x306b, 0x6324, 0x6323, 0x3e4c, 0x6325, 0x4143, 0x6327, 0x6326, 0x6328, 0x6268, 0x626a, 0x632a, 0x6329, 0x3c28, 0x4e69, 0x3c52, 0x632b, 0x3737, 0x3540, 0x3527, 0x3b63, 0x4d34, 0x6331, 0x6330, 0x4144, 0x632d, 0x632f, 0x3d4b, 0x3f40, 0x632e, 0x632c, 0x472a, 0x3e4d, 0x493c, 0x3a57, 0x4578, 0x6332, 0x6333, 0x6349, 0x3658, 0x4f3d, 0x4135, 0x6334, 0x3252, 0x4477, 0x4a21, 0x6335, 0x357a, 0x6336, 0x6338, 0x6339, 0x4729, 0x633a, 0x633b, 0x633c, 0x3659, 0x3253, 0x4645, 0x3d28, 0x3b64, 0x633d, 0x3d29, 0x324a, 0x4943, 0x633e, 0x486b, 0x4145, 0x6341, 0x6342, 0x4769, 0x3f41, 0x633f, 0x4361, 0x6340, 0x3e4e, 0x305c, 0x3529, 0x6343, 0x4478, 0x6344, 0x4047, 0x4c2d, 0x4923, 0x6345, 0x6346, 0x4355, 0x4e47, 0x6348, 0x6347, 0x3c6f, 0x634a, 0x3070, 0x634d, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946, 0x3972, 0x4a66, 0x634e, 0x4b54, 0x6350, 0x4051, 0x314f, 0x323a, 0x302c, 0x634f, 0x6351, 0x6352, 0x3e77, 0x6353, 0x334f, 0x6355, 0x376a, 0x3566, 0x6356, 0x3675, 0x6357, 0x407c, 0x464d, 0x4060, 0x3a75, 0x6358, 0x4362, 0x416b, 0x635a, 0x635c, 0x6359, 0x635b, 0x3722, 0x635d, 0x3726, 0x3567, 0x4d52, 0x635f, 0x6360, 0x312e, 0x6363, 0x3376, 0x6362, 0x6361, 0x6365, 0x635e, 0x6366, 0x4e29, 0x6367, 0x6368, 0x5474, 0x636a, 0x6369, 0x636b, 0x636c, 0x4e35, 0x636d, 0x706f, 0x3e4f, 0x636e, 0x636f, 0x3d57, 0x4638, 0x6370, 0x4328, 0x6371, 0x433c, 0x6372, 0x3625, 0x513f, 0x435d, 0x3c33, 0x3448, 0x6373, 0x6422, 0x6376, 0x3568, 0x6375, 0x6424, 0x6374, 0x3e50, 0x6378, 0x6379, 0x452b, 0x637a, 0x335e, 0x3f5a, 0x4964, 0x637c, 0x4268, 0x6377, 0x637b, 0x637d, 0x3a7b, 0x6426, 0x492e, 0x4826, 0x4579, 0x365a, 0x6425, 0x6423, 0x4835, 0x637e, 0x435e, 0x457b, 0x457a, 0x3a76, 0x6438, 0x6428, 0x642a, 0x642d, 0x642e, 0x642b, 0x642c, 0x6429, 0x6427, 0x6421, 0x4a4f, 0x3255, 0x6435, 0x6432, 0x6437, 0x6436, 0x4773, 0x4c27, 0x3b3b, 0x6430, 0x6439, 0x6434, 0x6433, 0x642f, 0x6431, 0x3449, 0x433d, 0x407d, 0x4822, 0x643e, 0x4824, 0x4061, 0x643b, 0x484f, 0x643f, 0x4a53, 0x435b, 0x643a, 0x643c, 0x643d, 0x6440, 0x3c44, 0x4646, 0x6445, 0x6444, 0x6441, 0x4f36, 0x644a, 0x644e, 0x644b, 0x6447, 0x6448, 0x644d, 0x6442, 0x5255, 0x6449, 0x6443, 0x644c, 0x6452, 0x344a, 0x644f, 0x6450, 0x6451, 0x6454, 0x6453, 0x4876, 0x6455, 0x4e7c, 0x4a6d, 0x645a, 0x6457, 0x6456, 0x4052, 0x6459, 0x645b, 0x6458, 0x645f, 0x645c, 0x645d, 0x6446, 0x645e, 0x6460, 0x6461, 0x4a46, 0x6462, 0x4c62, 0x364e, 0x3729, 0x6463, 0x4a34, 0x3f68, 0x4c30, 0x6464, 0x4e33, 0x4774, 0x4146, 0x4734, 0x3d4d, 0x3040, 0x6469, 0x6467, 0x6465, 0x3421, 0x3e51, 0x646a, 0x6468, 0x6466, 0x646e, 0x646d, 0x646c, 0x646b, 0x646f, 0x6470, 0x403a, 0x6471, 0x6473, 0x6472, 0x3852, 0x4138, 0x6475, 0x457c, 0x6474, 0x6476, 0x4a35, 0x416c, 0x3947, 0x6477, 0x4e48, 0x6479, 0x647a, 0x647b, 0x647c, 0x3b65, 0x647d, 0x374f, 0x356a, 0x352a, 0x6521, 0x4c73, 0x3948, 0x647e, 0x6524, 0x4c66, 0x473c, 0x4933, 0x3d63, 0x6523, 0x3c53, 0x3949, 0x3b66, 0x3569, 0x4a36, 0x6522, 0x4147, 0x4b42, 0x3a77, 0x3b67, 0x445d, 0x6527, 0x4e5f, 0x3a59, 0x6528, 0x3f42, 0x652a, 0x3e52, 0x3a30, 0x6529, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0x6526, 0x3750, 0x652e, 0x6532, 0x376b, 0x652d, 0x6536, 0x394a, 0x4d6d, 0x303c, 0x6533, 0x356b, 0x6530, 0x6531, 0x457d, 0x652f, 0x652c, 0x3328, 0x4064, 0x3828, 0x6538, 0x6535, 0x6537, 0x6534, 0x3751, 0x4233, 0x6539, 0x416e, 0x6546, 0x6542, 0x653c, 0x6540, 0x3c7a, 0x305d, 0x653b, 0x6543, 0x6547, 0x394b, 0x4c56, 0x4456, 0x653d, 0x6545, 0x653a, 0x433e, 0x653f, 0x303d, 0x4c4a, 0x653e, 0x365b, 0x486c, 0x416d, 0x4e50, 0x3d6f, 0x656e, 0x6548, 0x407e, 0x6544, 0x6549, 0x654b, 0x4479, 0x654e, 0x654a, 0x4a54, 0x344b, 0x4c4b, 0x305e, 0x654d, 0x4e7d, 0x654c, 0x316f, 0x466c, 0x654f, 0x6556, 0x6550, 0x6557, 0x6553, 0x477b, 0x3c4a, 0x6555, 0x6552, 0x6558, 0x6551, 0x3d44, 0x4b25, 0x3d4c, 0x6554, 0x6560, 0x655c, 0x655f, 0x655d, 0x6561, 0x655b, 0x6541, 0x4053, 0x484b, 0x655e, 0x6559, 0x4121, 0x3752, 0x3d2b, 0x3f25, 0x4136, 0x6564, 0x6566, 0x6567, 0x6563, 0x6565, 0x655a, 0x6562, 0x656a, 0x6569, 0x4b7a, 0x372b, 0x6568, 0x656c, 0x656b, 0x656f, 0x6571, 0x3b3c, 0x656d, 0x6572, 0x6573, 0x6574, 0x657a, 0x453b, 0x6576, 0x6575, 0x6577, 0x6578, 0x6579, 0x657b, 0x657c, 0x344c, 0x657d, 0x657e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6625, 0x6626, 0x6628, 0x6627, 0x6629, 0x662a, 0x662b, 0x662e, 0x662c, 0x662d, 0x3a61, 0x3753, 0x4356, 0x4833, 0x3d70, 0x474d, 0x486d, 0x662f, 0x586d, 0x6630, 0x6632, 0x4d65, 0x6631, 0x6634, 0x6633, 0x4d53, 0x6635, 0x487e, 0x6636, 0x6639, 0x6638, 0x6637, 0x663a, 0x3732, 0x4122, 0x3541, 0x663e, 0x663b, 0x663c, 0x663f, 0x6640, 0x663d, 0x3129, 0x3227, 0x6642, 0x6643, 0x6644, 0x4d62, 0x3d2c, 0x6646, 0x6645, 0x3f69, 0x6647, 0x6648, 0x6649, 0x3465, 0x344d, 0x664a, 0x664b, 0x4b5d, 0x4d63, 0x4d54, 0x4f37, 0x394d, 0x664e, 0x3c54, 0x664d, 0x664f, 0x3c29, 0x4251, 0x6650, 0x394c, 0x4c57, 0x6651, 0x6652, 0x6653, 0x6654, 0x6655, 0x3c2a, 0x4c6d, 0x6657, 0x433f, 0x6656, 0x6659, 0x6658, 0x665a, 0x403b, 0x665b, 0x665c, 0x4a39, 0x665d, 0x416f, 0x665e, 0x665f, 0x4e7e, 0x6662, 0x6661, 0x6660, 0x4430, 0x6663, 0x3f26, 0x6664, 0x6665, 0x4f38, 0x6666, 0x6667, 0x6669, 0x6668, 0x4825, 0x4679, 0x4f3e, 0x4829, 0x666b, 0x3e53, 0x492a, 0x666c, 0x666a, 0x344e, 0x3854, 0x3b68, 0x486e, 0x382a, 0x4b43, 0x666f, 0x666d, 0x394e, 0x394f, 0x3069, 0x3a68, 0x4759, 0x305f, 0x6674, 0x4340, 0x4758, 0x425b, 0x6676, 0x6672, 0x6675, 0x6670, 0x6673, 0x4b26, 0x3855, 0x307d, 0x6671, 0x6678, 0x6679, 0x4639, 0x363b, 0x6726, 0x473d, 0x3b69, 0x363c, 0x4048, 0x4f46, 0x4c2e, 0x6677, 0x4054, 0x3553, 0x667a, 0x667c, 0x667b, 0x667d, 0x4326, 0x473e, 0x4431, 0x6723, 0x6722, 0x667e, 0x3f55, 0x4965, 0x6725, 0x6724, 0x3950, 0x4f53, 0x6735, 0x6729, 0x672a, 0x3c70, 0x6728, 0x3978, 0x6727, 0x672b, 0x4432, 0x4a22, 0x4123, 0x425c, 0x672f, 0x6730, 0x672c, 0x672d, 0x672e, 0x3951, 0x6736, 0x6732, 0x4966, 0x4b6c, 0x4928, 0x6731, 0x6734, 0x6733, 0x4b44, 0x6737, 0x6738, 0x4137, 0x6739, 0x673b, 0x673f, 0x673c, 0x673a, 0x473f, 0x673d, 0x673e, 0x3232, 0x6745, 0x6740, 0x6741, 0x6742, 0x4221, 0x6744, 0x6743, 0x6746, 0x6747, 0x6748, 0x3f43, 0x3269, 0x6749, 0x4e57, 0x3c2b, 0x3d2d, 0x3b6a, 0x4357, 0x674a, 0x674b, 0x3131, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x363d, 0x5a2a, 0x6751, 0x4065, 0x6752, 0x3c4b, 0x6753, 0x5030, 0x6754, 0x4a5e, 0x345c, 0x4124, 0x3d58, 0x4971, 0x3d2e, 0x6755, 0x3952, 0x6756, 0x484c, 0x6764, 0x6758, 0x4249, 0x4775, 0x383f, 0x6757, 0x4125, 0x6759, 0x447a, 0x675b, 0x675a, 0x675d, 0x675c, 0x675e, 0x6760, 0x675f, 0x344f, 0x6761, 0x6762, 0x6763, 0x3a31, 0x4e49, 0x6765, 0x3f27, 0x3170, 0x6766, 0x6767, 0x6768, 0x3072, 0x6769, 0x676a, 0x4967, 0x3c47, 0x676c, 0x3329, 0x3032, 0x676b, 0x676e, 0x474e, 0x3f44, 0x3256, 0x4b27, 0x375d, 0x365c, 0x676d, 0x326a, 0x3423, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x4944, 0x677e, 0x3257, 0x677c, 0x677a, 0x6771, 0x676f, 0x6770, 0x3c63, 0x366c, 0x4377, 0x4651, 0x3151, 0x6774, 0x6773, 0x6779, 0x6775, 0x6778, 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0x677d, 0x3754, 0x6823, 0x682c, 0x682d, 0x302b, 0x6834, 0x3071, 0x682b, 0x682a, 0x6825, 0x6824, 0x6822, 0x6821, 0x4363, 0x427b, 0x6827, 0x6826, 0x6829, 0x4170, 0x3755, 0x3141, 0x6828, 0x3953, 0x4171, 0x683a, 0x683b, 0x3259, 0x322e, 0x6838, 0x682e, 0x6836, 0x683d, 0x6837, 0x6835, 0x6776, 0x6833, 0x682f, 0x3450, 0x6831, 0x683c, 0x6832, 0x683e, 0x6830, 0x477c, 0x4d69, 0x6839, 0x684f, 0x6847, 0x3f7b, 0x3546, 0x365d, 0x6842, 0x325b, 0x3e54, 0x6845, 0x3a5a, 0x4551, 0x684a, 0x4a6e, 0x6841, 0x325a, 0x3856, 0x4929, 0x684b, 0x683f, 0x6848, 0x6852, 0x6843, 0x6844, 0x463a, 0x6849, 0x6846, 0x4b28, 0x684c, 0x3060, 0x6840, 0x684e, 0x684d, 0x476b, 0x6854, 0x685f, 0x337e, 0x6862, 0x6850, 0x6855, 0x4d6e, 0x685e, 0x4d55, 0x4e2a, 0x4378, 0x336b, 0x4972, 0x6864, 0x4621, 0x3031, 0x685d, 0x6859, 0x4172, 0x6853, 0x685b, 0x6860, 0x472c, 0x302a, 0x6858, 0x6861, 0x4978, 0x685c, 0x6857, 0x3e55, 0x3d2f, 0x3c2c, 0x4c58, 0x4947, 0x6867, 0x6870, 0x685a, 0x3377, 0x3e78, 0x6865, 0x686a, 0x4173, 0x6866, 0x686d, 0x435f, 0x686e, 0x4d56, 0x6863, 0x3338, 0x6869, 0x686c, 0x4c2c, 0x686f, 0x6868, 0x686b, 0x4b29, 0x4f21, 0x6873, 0x687a, 0x6872, 0x3c43, 0x6851, 0x4a4e, 0x4c22, 0x6879, 0x6878, 0x6874, 0x6875, 0x3136, 0x6877, 0x6871, 0x4455, 0x6876, 0x307e, 0x4222, 0x4a43, 0x687b, 0x6921, 0x4859, 0x687e, 0x3e56, 0x3c49, 0x6923, 0x363e, 0x6924, 0x4979, 0x687d, 0x6856, 0x687c, 0x4f4f, 0x4622, 0x4973, 0x692b, 0x6931, 0x6932, 0x6925, 0x4776, 0x692f, 0x6927, 0x6929, 0x6933, 0x6928, 0x692c, 0x3172, 0x4665, 0x692d, 0x6930, 0x6926, 0x4126, 0x692a, 0x3b27, 0x3f45, 0x3730, 0x4c74, 0x4c79, 0x3d72, 0x6937, 0x6935, 0x4f4e, 0x6934, 0x4d75, 0x6936, 0x6938, 0x6939, 0x693c, 0x693a, 0x4623, 0x693b, 0x484d, 0x692e, 0x3d73, 0x693d, 0x6942, 0x4174, 0x6941, 0x6922, 0x6943, 0x4149, 0x693e, 0x6940, 0x693f, 0x5d31, 0x5d22, 0x6945, 0x6944, 0x4d76, 0x623c, 0x6946, 0x6947, 0x6948, 0x3857, 0x3554, 0x694a, 0x515d, 0x3575, 0x4e3a, 0x3673, 0x694b, 0x694c, 0x436e, 0x694d, 0x467a, 0x303a, 0x3263, 0x6952, 0x6953, 0x694e, 0x3b3d, 0x694f, 0x4742, 0x6950, 0x6951, 0x695b, 0x6955, 0x6958, 0x6954, 0x6956, 0x6957, 0x3c58, 0x6959, 0x4341, 0x3756, 0x3342, 0x695c, 0x333f, 0x6961, 0x695d, 0x6960, 0x483a, 0x695e, 0x695f, 0x4948, 0x485a, 0x6962, 0x427d, 0x696c, 0x6968, 0x326b, 0x6966, 0x4b2a, 0x6967, 0x6964, 0x6965, 0x696a, 0x696d, 0x696b, 0x6969, 0x6963, 0x4358, 0x6974, 0x4c2a, 0x6972, 0x6973, 0x696e, 0x6970, 0x6971, 0x696f, 0x4066, 0x4f39, 0x6978, 0x6979, 0x6a21, 0x3f2a, 0x697b, 0x697e, 0x6976, 0x6975, 0x6a22, 0x325c, 0x697c, 0x6a23, 0x697d, 0x697a, 0x4433, 0x6977, 0x4768, 0x6a27, 0x4d3b, 0x6a26, 0x6a25, 0x6a2e, 0x6a28, 0x6a30, 0x4d66, 0x6a33, 0x6a2a, 0x6a2b, 0x6a2f, 0x6a32, 0x6a31, 0x6a29, 0x6a2c, 0x6a3d, 0x6a36, 0x6a34, 0x6a35, 0x6a3a, 0x6a3b, 0x332a, 0x3542, 0x6a39, 0x6a24, 0x6a38, 0x6a3c, 0x6a37, 0x6a3e, 0x6a40, 0x6a3f, 0x6a42, 0x6a41, 0x695a, 0x6a46, 0x6a43, 0x6a44, 0x6a45, 0x6a47, 0x376c, 0x6a49, 0x6a48, 0x3d30, 0x3954, 0x5e27, 0x6a4a, 0x3d51, 0x3339, 0x6a4b, 0x3152, 0x3e57, 0x6a4c, 0x3955, 0x6a4d, 0x3061, 0x493d, 0x6a4e, 0x3f6a, 0x6a55, 0x6a52, 0x436f, 0x6a53, 0x6a50, 0x365e, 0x6a4f, 0x6a56, 0x3736, 0x425e, 0x6a5c, 0x6a58, 0x4235, 0x6a57, 0x6a5a, 0x6a51, 0x6a5b, 0x6a5d, 0x486f, 0x6a59, 0x6a5e, 0x6a60, 0x3853, 0x6a54, 0x3041, 0x6a5f, 0x3a5b, 0x4e76, 0x6a61, 0x6a62, 0x4175, 0x4e22, 0x6a63, 0x4d35, 0x6a64, 0x6a65, 0x4a64, 0x6a66, 0x3a40, 0x4e23, 0x6a6b, 0x6a6c, 0x3e58, 0x6a6a, 0x4d67, 0x6a67, 0x6a69, 0x403d, 0x3f7e, 0x6a68, 0x6a6d, 0x4a23, 0x6a6f, 0x6a6e, 0x336c, 0x4b2b, 0x6a70, 0x6a7c, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a79, 0x6a7a, 0x6a78, 0x6a76, 0x6a71, 0x6a77, 0x6a7b, 0x7037, 0x3228, 0x6a7e, 0x365f, 0x6a7d, 0x6b22, 0x6b21, 0x6b24, 0x6b23, 0x6b25, 0x3d31, 0x6b26, 0x6b27, 0x6b28, 0x403e, 0x4d57, 0x6b29, 0x4a24, 0x4746, 0x6b2a, 0x6b2b, 0x382b, 0x352c, 0x6b2c, 0x3b6b, 0x4741, 0x6b2d, 0x3350, 0x6b2e, 0x6b30, 0x4d77, 0x6b2f, 0x3f46, 0x6b31, 0x6b32, 0x6b33, 0x3451, 0x6b34, 0x6b35, 0x6b36, 0x6b37, 0x3351, 0x6b38, 0x6b39, 0x6b3a, 0x3272, 0x3f28, 0x6b3b, 0x6b3c, 0x6b3d, 0x3840, 0x447b, 0x6b3e, 0x3757, 0x3f56, 0x6b41, 0x4624, 0x6b40, 0x3731, 0x6b3f, 0x4277, 0x352d, 0x6b42, 0x6b43, 0x3e59, 0x376d, 0x6b44, 0x4b2c, 0x405f, 0x3576, 0x4c75, 0x414a, 0x6b45, 0x3f47, 0x4370, 0x3e5a, 0x6b46, 0x6b49, 0x6b4a, 0x3a3e, 0x4242, 0x6b48, 0x3e5b, 0x493e, 0x6b47, 0x3b6c, 0x3153, 0x6b4e, 0x3758, 0x3b6e, 0x3b6d, 0x4f4d, 0x6b4d, 0x6b4c, 0x4127, 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x6b4b, 0x6b50, 0x6b51, 0x6b4f, 0x3858, 0x4d40, 0x3b6f, 0x4727, 0x6b54, 0x4040, 0x4342, 0x4d36, 0x6b57, 0x386c, 0x403f, 0x6b53, 0x6b58, 0x386d, 0x6b55, 0x6b56, 0x6b52, 0x4062, 0x4649, 0x432f, 0x325d, 0x4870, 0x3543, 0x4434, 0x6b5b, 0x6b59, 0x434c, 0x4041, 0x3452, 0x6b5a, 0x3f5b, 0x4e4a, 0x4f40, 0x6b5c, 0x6b67, 0x4435, 0x6b66, 0x6b63, 0x6b6b, 0x6b64, 0x6b60, 0x447c, 0x6b5f, 0x6b5d, 0x4d21, 0x3b70, 0x6b61, 0x6b5e, 0x6b65, 0x3d74, 0x3841, 0x427a, 0x4b45, 0x315a, 0x3062, 0x4625, 0x6b69, 0x6b68, 0x4666, 0x6b6d, 0x6b62, 0x6b6c, 0x6b6e, 0x382c, 0x6b6a, 0x3956, 0x3c55, 0x6b6f, 0x4d58, 0x6b72, 0x6b75, 0x6b73, 0x4935, 0x6b70, 0x3660, 0x6b74, 0x6b76, 0x6b7a, 0x6b77, 0x6b79, 0x6b78, 0x6b7b, 0x3c31, 0x6b7d, 0x6b7c, 0x4968, 0x6c21, 0x3759, 0x6b7e, 0x6c22, 0x6c23, 0x3544, 0x6641, 0x3e79, 0x6c24, 0x386e, 0x6c25, 0x6c26, 0x3b3e, 0x5a4e, 0x6c27, 0x6c28, 0x3d32, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x432b, 0x6c2e, 0x6c30, 0x6c2f, 0x4626, 0x6c31, 0x4b2d, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x465a, 0x3e5d, 0x6c36, 0x396b, 0x502e, 0x6c37, 0x6c38, 0x493f, 0x6c39, 0x6c41, 0x6c3a, 0x6c3c, 0x6c3b, 0x6c3d, 0x4b46, 0x6c3e, 0x6c3f, 0x6c40, 0x6c42, 0x332d, 0x4467, 0x4969, 0x3a62, 0x3957, 0x494f, 0x325f, 0x484e, 0x6c45, 0x3453, 0x4055, 0x6c44, 0x6c49, 0x4379, 0x4c63, 0x6c47, 0x6c48, 0x352e, 0x6c4a, 0x4763, 0x425f, 0x4871, 0x453d, 0x6c46, 0x4b47, 0x326c, 0x6c4c, 0x4f28, 0x4442, 0x4f45, 0x3b71, 0x6c4b, 0x4231, 0x6c5c, 0x4128, 0x4678, 0x4950, 0x6c4f, 0x3b3f, 0x3b72, 0x3e5e, 0x4765, 0x382d, 0x6c4e, 0x6c4d, 0x496a, 0x3c41, 0x4552, 0x6c51, 0x6c52, 0x3958, 0x6c50, 0x6c53, 0x6c54, 0x6c56, 0x4223, 0x6c55, 0x3466, 0x6c58, 0x6c57, 0x6c59, 0x6c5b, 0x6c5d, 0x6c5e, 0x4056, 0x3c4f, 0x6c5f, 0x3352, 0x6c60, 0x4176, 0x6c61, 0x6c62, 0x496b, 0x352f, 0x6c63, 0x4436, 0x315b, 0x6c64, 0x3c71, 0x3f76, 0x422d, 0x6c67, 0x6c66, 0x6c65, 0x6c6d, 0x6c6b, 0x6c68, 0x6c6a, 0x6c69, 0x6c6c, 0x3577, 0x6c70, 0x4057, 0x6c71, 0x3859, 0x6c6e, 0x6c6f, 0x4f29, 0x4437, 0x4129, 0x6c72, 0x6c75, 0x6c73, 0x6c74, 0x4d59, 0x4627, 0x6c78, 0x6c76, 0x6c77, 0x6c79, 0x6d29, 0x6c7c, 0x6c7d, 0x6c7b, 0x6c7a, 0x447d, 0x6d21, 0x6d25, 0x6d22, 0x6c7e, 0x6d23, 0x6d24, 0x6d2b, 0x6d26, 0x4058, 0x6d28, 0x6d2a, 0x6d27, 0x6d2d, 0x3d33, 0x6d2c, 0x6d2e, 0x6d2f, 0x6d32, 0x6d31, 0x6d30, 0x6d34, 0x6d33, 0x4c76, 0x6d36, 0x6d35, 0x6d37, 0x6d38, 0x6d3a, 0x6d39, 0x3f48, 0x6d3b, 0x366d, 0x6d3c, 0x6d3e, 0x6d3f, 0x6d40, 0x6d3d, 0x6d41, 0x3c56, 0x6d42, 0x3530, 0x3733, 0x382e, 0x6d43, 0x4670, 0x453e, 0x6d44, 0x6d47, 0x3c34, 0x6d46, 0x6d45, 0x375a, 0x6d48, 0x3353, 0x6d4a, 0x3a5c, 0x6d49, 0x6d52, 0x6d4c, 0x6d4e, 0x4a65, 0x6d4b, 0x6d4d, 0x6d51, 0x6d4f, 0x3531, 0x6d50, 0x6d53, 0x475a, 0x4e58, 0x3d34, 0x6d54, 0x4d22, 0x6d56, 0x6d55, 0x6d59, 0x4d41, 0x6d58, 0x336d, 0x6d57, 0x6d5c, 0x6d5b, 0x6d5a, 0x4532, 0x6d5d, 0x6d5e, 0x6d5f, 0x396c, 0x3725, 0x6d60, 0x6d61, 0x6d62, 0x3f49, 0x6d63, 0x3c2d, 0x6d64, 0x6d65, 0x5221, 0x517e, 0x6d66, 0x6570, 0x6d67, 0x4324, 0x3f2b, 0x4740, 0x6d68, 0x4a55, 0x4454, 0x397e, 0x4329, 0x312a, 0x4b78, 0x3f57, 0x375e, 0x3661, 0x4a56, 0x6d69, 0x6d6b, 0x6d6a, 0x3260, 0x4676, 0x6d6c, 0x4777, 0x4533, 0x6d6d, 0x3d52, 0x6d6f, 0x4c42, 0x6d7e, 0x6d71, 0x6d72, 0x4449, 0x4260, 0x4177, 0x4628, 0x6d70, 0x3555, 0x6d79, 0x6d76, 0x6e25, 0x4629, 0x4360, 0x6d73, 0x447e, 0x4553, 0x6d74, 0x6d78, 0x3f60, 0x4767, 0x444c, 0x4042, 0x6d77, 0x422e, 0x4224, 0x6d75, 0x3029, 0x4f22, 0x6d7a, 0x4261, 0x3d35, 0x3f4a, 0x6d7c, 0x6d7b, 0x306f, 0x6d7d, 0x492f, 0x6e27, 0x465b, 0x3f6b, 0x4359, 0x3678, 0x6e26, 0x4d37, 0x313f, 0x4a57, 0x3261, 0x6e21, 0x6e22, 0x6e23, 0x6e24, 0x463b, 0x4323, 0x3063, 0x6e28, 0x6e29, 0x7423, 0x423d, 0x6e2a, 0x3173, 0x414c, 0x382f, 0x4d5a, 0x6e2b, 0x452c, 0x4178, 0x3c57, 0x6e2c, 0x6e2f, 0x3d65, 0x6e2d, 0x412b, 0x412a, 0x3064, 0x4e4b, 0x6e31, 0x4872, 0x6e33, 0x6e32, 0x6e30, 0x6364, 0x3454, 0x6d6e, 0x6e35, 0x6e34, 0x6e36, 0x4d38, 0x4661, 0x4b2e, 0x6e37, 0x3c59, 0x6e38, 0x6e39, 0x6e3a, 0x4521, 0x306a, 0x3959, 0x4f3a, 0x6e3e, 0x3734, 0x6e3b, 0x6e3c, 0x4974, 0x3354, 0x4d39, 0x363f, 0x4554, 0x6e3f, 0x6e40, 0x6e41, 0x4522, 0x6e43, 0x6e42, 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, 0x4371, 0x3c72, 0x3f6c, 0x6e45, 0x6e46, 0x3f5d, 0x6e47, 0x6e48, 0x6e49, 0x4d6f, 0x3d37, 0x6e4b, 0x6e4a, 0x395a, 0x3973, 0x3b40, 0x6e4e, 0x3d66, 0x6e4d, 0x6e4c, 0x4269, 0x386f, 0x4043, 0x4830, 0x3d39, 0x6e4f, 0x3e5f, 0x6e52, 0x6e50, 0x6e51, 0x6e54, 0x6e53, 0x3e7a, 0x6e55, 0x6e56, 0x6e57, 0x4850, 0x3a53, 0x3c61, 0x6e58, 0x6e59, 0x4e24, 0x3d45, 0x4c6e, 0x4e4c, 0x6e5a, 0x3662, 0x6e5b, 0x4523, 0x6e5e, 0x3378, 0x3f4b, 0x6e5c, 0x6e5d, 0x4460, 0x4b55, 0x367c, 0x6e60, 0x6e61, 0x6e5f, 0x6e63, 0x465f, 0x3343, 0x6e67, 0x6e64, 0x6e66, 0x6e62, 0x6f4f, 0x6e65, 0x4e6b, 0x385a, 0x6e6f, 0x4534, 0x6e6a, 0x6e6d, 0x6e6b, 0x6e70, 0x6e71, 0x6e69, 0x6e76, 0x3174, 0x6e68, 0x482d, 0x6e6c, 0x3e60, 0x395b, 0x4b48, 0x3664, 0x3d46, 0x463c, 0x412d, 0x6e74, 0x6e6e, 0x6e73, 0x4c43, 0x4438, 0x6e75, 0x6e72, 0x412c, 0x6e79, 0x6e78, 0x6e77, 0x4b2f, 0x3d7b, 0x6e7a, 0x4a5f, 0x3154, 0x4946, 0x4372, 0x3578, 0x6e7c, 0x395d, 0x3b2c, 0x6e7b, 0x3f6d, 0x3f6e, 0x6f21, 0x6f23, 0x3e7b, 0x6f22, 0x6f24, 0x3653, 0x4945, 0x3c62, 0x4f23, 0x6e7e, 0x3a78, 0x4f3f, 0x6f26, 0x6f25, 0x6f27, 0x6e7d, 0x4669, 0x4555, 0x4457, 0x6f2c, 0x4343, 0x6f28, 0x6f29, 0x372d, 0x6f2b, 0x3830, 0x6f2a, 0x3e61, 0x3379, 0x6f30, 0x3a3f, 0x4179, 0x444a, 0x333b, 0x6f2e, 0x6f2f, 0x4443, 0x6f2d, 0x6f31, 0x6f37, 0x6f3a, 0x6f39, 0x452d, 0x6f32, 0x6f33, 0x6f36, 0x6f38, 0x3640, 0x6f3b, 0x6f35, 0x6f34, 0x6f3f, 0x6f40, 0x6f41, 0x6f3e, 0x6f3d, 0x3e62, 0x462a, 0x6f3c, 0x6f45, 0x6f43, 0x6f44, 0x6f42, 0x4278, 0x6f46, 0x6f47, 0x6f49, 0x3455, 0x6f48, 0x4c7a, 0x6f54, 0x6f4a, 0x6f4d, 0x6f4b, 0x6f4c, 0x6f4e, 0x6f50, 0x6f51, 0x6f52, 0x6f55, 0x6f53, 0x6f56, 0x6f58, 0x6f57, 0x4439, 0x4c67, 0x6f59, 0x412e, 0x6f5a, 0x4a44, 0x6f5b, 0x332b, 0x313c, 0x3457, 0x3456, 0x6f5c, 0x6f5d, 0x6f5e, 0x6f5f, 0x6f60, 0x3458, 0x3355, 0x395e, 0x4836, 0x6f62, 0x6f61, 0x6f63, 0x315c, 0x6f66, 0x6f65, 0x6f64, 0x6f67, 0x6f6a, 0x3047, 0x6f68, 0x6f6c, 0x6f6b, 0x6f6e, 0x6f6d, 0x6f6f, 0x462e, 0x6f70, 0x6f71, 0x6f73, 0x6f72, 0x496c, 0x6f74, 0x6f75, 0x3a65, 0x6f76, 0x6f77, 0x4b49, 0x414b, 0x3024, 0x424b, 0x6f78, 0x496d, 0x6f7b, 0x6f79, 0x395f, 0x6f7a, 0x3842, 0x4a45, 0x6f7d, 0x7021, 0x6f7e, 0x7022, 0x3121, 0x3f58, 0x3d7c, 0x3459, 0x7023, 0x4766, 0x7025, 0x3122, 0x7024, 0x4444, 0x4e4d, 0x462b, 0x6f7c, 0x4e26, 0x3831, 0x4d5b, 0x3679, 0x4e34, 0x3728, 0x4262, 0x6721, 0x7026, 0x332c, 0x3f6f, 0x3356, 0x7028, 0x7029, 0x7027, 0x3764, 0x3a5d, 0x3e63, 0x3123, 0x4e59, 0x702b, 0x6e2e, 0x702a, 0x702e, 0x702c, 0x702d, 0x702f, 0x7030, 0x4e6c, 0x7031, 0x7032, 0x4049, 0x483b, 0x3f7d, 0x3467, 0x4d3a, 0x326d, 0x3d38, 0x385b, 0x7035, 0x7034, 0x3b73, 0x7036, 0x7033, 0x3b28, 0x703a, 0x6a2d, 0x5256, 0x3f77, 0x7038, 0x4e25, 0x4671, 0x312b, 0x4063, 0x3c36, 0x4a37, 0x3140, 0x4e6d, 0x4d6b, 0x703b, 0x4545, 0x3c7b, 0x703c, 0x703d, 0x3f4c, 0x703e, 0x4e6e, 0x7039, 0x7040, 0x7042, 0x7041, 0x703f, 0x7043, 0x7044, 0x417a, 0x3262, 0x7045, 0x4c38, 0x7046, 0x7047, 0x4f2a, 0x5b31, 0x7048, 0x7049, 0x704a, 0x704e, 0x704b, 0x704c, 0x704d, 0x704f, 0x4044, 0x4c77, 0x4045, 0x7050, 0x4873, 0x7051, 0x7353, 0x4c4c, 0x7052, 0x7053, 0x7054, 0x3357, 0x7056, 0x3f59, 0x7057, 0x3724, 0x7058, 0x705c, 0x705a, 0x705b, 0x3373, 0x7059, 0x705d, 0x705e, 0x3048, 0x705f, 0x7060, 0x3e64, 0x7061, 0x3547, 0x7064, 0x7063, 0x7062, 0x6b71, 0x4a5c, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706a, 0x345a, 0x706b, 0x706c, 0x4723, 0x706e, 0x323b, 0x7071, 0x7070, 0x3124, 0x3641, 0x4a47, 0x443a, 0x3a22, 0x3960, 0x3d67, 0x3f5c, 0x7073, 0x7072, 0x4d42, 0x3468, 0x4852, 0x465c, 0x3f7c, 0x4e4e, 0x375b, 0x7076, 0x7075, 0x4b4b, 0x462c, 0x3150, 0x7077, 0x7074, 0x4951, 0x4d6a, 0x7078, 0x7079, 0x707b, 0x426a, 0x335b, 0x335c, 0x707a, 0x3469, 0x3832, 0x346a, 0x453f, 0x4e60, 0x385c, 0x707c, 0x707d, 0x707e, 0x7121, 0x7123, 0x7122, 0x4977, 0x7124, 0x7125, 0x7126, 0x7127, 0x7129, 0x7128, 0x712a, 0x4874, 0x664c, 0x3f29, 0x3532, 0x712b, 0x712c, 0x522c, 0x5d3b, 0x4853, 0x307b, 0x303b, 0x3b74, 0x4b30, 0x3e7e, 0x712d, 0x4c5f, 0x712e, 0x4d5c, 0x3142, 0x3b41, 0x712f, 0x326e, 0x7130, 0x7131, 0x7133, 0x7134, 0x7136, 0x7132, 0x7135, 0x345b, 0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713d, 0x713c, 0x713f, 0x7142, 0x713e, 0x7140, 0x7141, 0x7143, 0x3642, 0x3c73, 0x7144, 0x7145, 0x3961, 0x7146, 0x333e, 0x474f, 0x7147, 0x7148, 0x435a, 0x466b, 0x7149, 0x477d, 0x424c, 0x3158, 0x366e, 0x366f, 0x4373, 0x714e, 0x3670, 0x326f, 0x714d, 0x714b, 0x714c, 0x714a, 0x7158, 0x714f, 0x7150, 0x7151, 0x7152, 0x7154, 0x7153, 0x3d59, 0x7155, 0x7157, 0x3533, 0x7156, 0x417b, 0x3833, 0x7159, 0x424d, 0x715a, 0x462d, 0x715b, 0x7160, 0x715e, 0x715d, 0x715f, 0x715c, 0x7162, 0x7161, 0x7164, 0x3643, 0x7163, 0x7165, 0x7166, 0x7168, 0x7167, 0x7169, 0x716b, 0x716a, 0x397c, 0x716c, 0x716d, 0x333c, 0x716e, 0x716f, 0x3f71, 0x7170, 0x7171, 0x7172, 0x7173, 0x3962, 0x7174, 0x7175, 0x7176, 0x7177, 0x7178, 0x4831, 0x717a, 0x4926, 0x717b, 0x7179, 0x717d, 0x717c, 0x717e, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7228, 0x7229, 0x722a, 0x722b, 0x722c, 0x722d, 0x722e, 0x5d35, 0x722f, 0x6478, 0x3534, 0x3321, 0x3a32, 0x7231, 0x7230, 0x4c25, 0x7233, 0x7234, 0x7232, 0x7235, 0x4b62, 0x7236, 0x357b, 0x4f25, 0x7237, 0x7239, 0x303e, 0x723a, 0x4a2b, 0x7238, 0x723b, 0x723c, 0x723d, 0x723e, 0x723f, 0x4b6e, 0x3b2d, 0x3a7a, 0x412f, 0x7240, 0x7243, 0x7241, 0x7244, 0x3871, 0x7242, 0x7245, 0x7246, 0x7247, 0x724b, 0x3b2a, 0x4264, 0x724c, 0x7249, 0x7248, 0x724a, 0x375f, 0x7250, 0x724f, 0x724e, 0x3033, 0x725a, 0x7256, 0x7257, 0x7253, 0x7259, 0x7255, 0x3362, 0x4f4c, 0x7258, 0x7254, 0x7252, 0x7251, 0x725c, 0x725f, 0x725e, 0x725d, 0x4949, 0x725b, 0x3073, 0x7260, 0x7262, 0x336f, 0x724d, 0x3137, 0x7264, 0x7263, 0x7261, 0x432d, 0x4b70, 0x4e5a, 0x7265, 0x7266, 0x7267, 0x7268, 0x7269, 0x443b, 0x726a, 0x4837, 0x726f, 0x726b, 0x726c, 0x4b31, 0x4c44, 0x4650, 0x7270, 0x7271, 0x463e, 0x726e, 0x726d, 0x322a, 0x7279, 0x7278, 0x3175, 0x7276, 0x7275, 0x7273, 0x337b, 0x7272, 0x3c32, 0x3229, 0x3963, 0x727c, 0x727b, 0x727a, 0x7277, 0x727d, 0x727e, 0x7325, 0x7324, 0x7326, 0x312d, 0x7321, 0x7322, 0x3974, 0x4c39, 0x7323, 0x4b32, 0x732b, 0x7327, 0x732c, 0x7329, 0x7328, 0x375c, 0x732d, 0x732e, 0x732f, 0x732a, 0x7274, 0x7330, 0x4461, 0x7334, 0x7335, 0x7333, 0x7332, 0x7338, 0x7331, 0x7336, 0x7337, 0x733a, 0x7339, 0x733c, 0x733d, 0x733e, 0x4f49, 0x733b, 0x426b, 0x3a6d, 0x733f, 0x7340, 0x7341, 0x7342, 0x7343, 0x3834, 0x7344, 0x7345, 0x3c2f, 0x7346, 0x7347, 0x7348, 0x7349, 0x734c, 0x734a, 0x4f3c, 0x734b, 0x4e6f, 0x734d, 0x4e5b, 0x734e, 0x477e, 0x734f, 0x7351, 0x7352, 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677, 0x5d60, 0x4b7b, 0x322b, 0x7354, 0x3550, 0x7355, 0x7356, 0x7357, 0x3975, 0x7358, 0x6054, 0x4c5b, 0x4263, 0x7359, 0x735b, 0x735a, 0x735c, 0x735d, 0x735e, 0x735f, 0x7360, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x4524, 0x385d, 0x736a, 0x414d, 0x736b, 0x736c, 0x4921, 0x736d, 0x736e, 0x6337, 0x6c5a, 0x706d, 0x736f, 0x7370, 0x7372, 0x7373, 0x7374, 0x4e70, 0x7371, 0x7375, 0x7376, 0x7378, 0x7377, 0x737a, 0x737b, 0x7379, 0x4e36, 0x737c, 0x737d, 0x6354, 0x737e, 0x212a, 0x2174, 0x2170, 0x2173, 0x2175, 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 0x2125, 0x213f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x2127, 0x2128, 0x2163, 0x2161, 0x2164, 0x2129, 0x2177, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x214e, 0x2140, 0x214f, 0x2130, 0x2132, 0x212e, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x2150, 0x2143, 0x2151, 0x2131, 0x216f, }; static const Summary16 jisx0208_uni2indx_page00[16] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x118c }, { 5, 0x0053 }, { 9, 0x0000 }, { 9, 0x0080 }, { 10, 0x0000 }, { 10, 0x0080 }, }; static const Summary16 jisx0208_uni2indx_page03[22] = { /* 0x0300 */ { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0xfffe }, { 26, 0x03fb }, { 35, 0xfffe }, { 50, 0x03fb }, { 59, 0x0000 }, { 59, 0x0000 }, { 59, 0x0000 }, /* 0x0400 */ { 59, 0x0002 }, { 60, 0xffff }, { 76, 0xffff }, { 92, 0xffff }, { 108, 0xffff }, { 124, 0x0002 }, }; static const Summary16 jisx0208_uni2indx_page20[50] = { /* 0x2000 */ { 125, 0x0000 }, { 125, 0x3361 }, { 132, 0x0063 }, { 136, 0x080d }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, { 140, 0x0000 }, /* 0x2100 */ { 140, 0x0008 }, { 141, 0x0000 }, { 141, 0x0800 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x0000 }, { 142, 0x000f }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0000 }, { 146, 0x0014 }, { 148, 0x0000 }, { 148, 0x0000 }, /* 0x2200 */ { 148, 0x098d }, { 154, 0x6404 }, { 158, 0x1f81 }, { 165, 0x2030 }, { 168, 0x0000 }, { 168, 0x0004 }, { 169, 0x0cc3 }, { 175, 0x0000 }, { 175, 0x00cc }, { 179, 0x0000 }, { 179, 0x0020 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, { 180, 0x0000 }, /* 0x2300 */ { 180, 0x0000 }, { 180, 0x0004 }, }; static const Summary16 jisx0208_uni2indx_page25[23] = { /* 0x2500 */ { 181, 0x900f }, { 187, 0x3999 }, { 195, 0x9939 }, { 203, 0x9999 }, { 211, 0x0804 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0000 }, { 213, 0x0003 }, { 215, 0x300c }, { 219, 0xc8c0 }, { 224, 0x0000 }, { 224, 0x8000 }, { 225, 0x0000 }, /* 0x2600 */ { 225, 0x0060 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0000 }, { 227, 0x0005 }, { 229, 0x0000 }, { 229, 0xa400 }, }; static const Summary16 jisx0208_uni2indx_page30[16] = { /* 0x3000 */ { 232, 0xffef }, { 247, 0x103f }, { 254, 0x0000 }, { 254, 0x0000 }, { 254, 0xfffe }, { 269, 0xffff }, { 285, 0xffff }, { 301, 0xffff }, { 317, 0xffff }, { 333, 0x780f }, { 341, 0xfffe }, { 356, 0xffff }, { 372, 0xffff }, { 388, 0xffff }, { 404, 0xffff }, { 420, 0x787f }, }; static const Summary16 jisx0208_uni2indx_page4e[1307] = { /* 0x4e00 */ { 431, 0x6f8b }, { 441, 0x43f3 }, { 450, 0x2442 }, { 454, 0x9b46 }, { 462, 0xe82c }, { 469, 0xe3e0 }, { 477, 0x0004 }, { 478, 0x400a }, { 481, 0x5f65 }, { 491, 0xdb36 }, { 501, 0x7977 }, { 512, 0x0449 }, { 516, 0xecd7 }, { 527, 0xe3f0 }, { 536, 0x6038 }, { 541, 0x08c5 }, /* 0x4f00 */ { 546, 0xe602 }, { 552, 0x3403 }, { 557, 0x8000 }, { 558, 0x3551 }, { 565, 0xe0c8 }, { 571, 0x7eab }, { 582, 0x8200 }, { 584, 0x9869 }, { 591, 0xa948 }, { 597, 0x2942 }, { 602, 0xe803 }, { 608, 0x8060 }, { 611, 0x441c }, { 616, 0xad93 }, { 625, 0xc03a }, { 631, 0x4568 }, /* 0x5000 */ { 637, 0xaa60 }, { 643, 0x8656 }, { 650, 0x3f7a }, { 661, 0x0240 }, { 663, 0x8388 }, { 668, 0x1461 }, { 673, 0x1020 }, { 675, 0x2174 }, { 681, 0x2021 }, { 684, 0x0702 }, { 688, 0x3000 }, { 690, 0x40bc }, { 696, 0xa624 }, { 702, 0x4462 }, { 707, 0x60a8 }, { 712, 0x0a20 }, /* 0x5100 */ { 715, 0x0217 }, { 720, 0x8574 }, { 727, 0x0402 }, { 729, 0x9c84 }, { 735, 0x7bfb }, { 748, 0x1415 }, { 753, 0x7f24 }, { 762, 0x11e2 }, { 768, 0xb665 }, { 777, 0x02ef }, { 785, 0x1f75 }, { 795, 0x20ff }, { 804, 0x3a70 }, { 811, 0x3840 }, { 815, 0x26c3 }, { 822, 0x6763 }, /* 0x5200 */ { 831, 0x4dd9 }, { 840, 0x2092 }, { 844, 0x46b0 }, { 850, 0x0fc9 }, { 858, 0xbc98 }, { 866, 0x4850 }, { 870, 0x8638 }, { 876, 0xa03f }, { 884, 0x2388 }, { 889, 0x8816 }, { 894, 0x3e09 }, { 901, 0x5232 }, { 907, 0x22aa }, { 913, 0xe3a4 }, { 921, 0x00dd }, { 927, 0xc72c }, /* 0x5300 */ { 935, 0xa166 }, { 942, 0x26e1 }, { 949, 0x840b }, { 954, 0x8f0a }, { 961, 0x27eb }, { 971, 0x559e }, { 980, 0xc241 }, { 985, 0x89bb }, { 994, 0x0014 }, { 996, 0x8540 }, { 1000, 0x6361 }, { 1007, 0x0849 }, { 1011, 0x7f0c }, { 1020, 0x8ad0 }, { 1026, 0xff3e }, { 1039, 0x05cf }, /* 0x5400 */ { 1047, 0xff1a }, { 1058, 0xa803 }, { 1063, 0x7a41 }, { 1070, 0x7b40 }, { 1077, 0x4745 }, { 1084, 0x8002 }, { 1086, 0x0500 }, { 1088, 0x38eb }, { 1097, 0xd851 }, { 1104, 0x0005 }, { 1106, 0x9934 }, { 1113, 0x710c }, { 1119, 0x0397 }, { 1126, 0x0100 }, { 1127, 0x6366 }, { 1135, 0x2404 }, /* 0x5500 */ { 1138, 0x80d0 }, { 1142, 0x0051 }, { 1145, 0xc000 }, { 1147, 0x430a }, { 1152, 0x9071 }, { 1158, 0x30c8 }, { 1163, 0x0008 }, { 1164, 0x5800 }, { 1167, 0x0e99 }, { 1174, 0xf700 }, { 1181, 0x5f80 }, { 1188, 0x0041 }, { 1190, 0x00b0 }, { 1193, 0x9410 }, { 1197, 0x0018 }, { 1199, 0x6280 }, /* 0x5600 */ { 1203, 0x0240 }, { 1205, 0x09d0 }, { 1210, 0x8200 }, { 1212, 0x0156 }, { 1217, 0x5004 }, { 1220, 0x0801 }, { 1222, 0x1d10 }, { 1227, 0x0510 }, { 1230, 0x84c1 }, { 1235, 0x0010 }, { 1236, 0x4025 }, { 1240, 0x1050 }, { 1243, 0x410f }, { 1249, 0x4d8a }, { 1256, 0x4009 }, { 1259, 0xa60d }, /* 0x5700 */ { 1266, 0xab19 }, { 1274, 0x914c }, { 1280, 0x21c0 }, { 1284, 0x0981 }, { 1288, 0xc485 }, { 1294, 0x0003 }, { 1296, 0x0652 }, { 1301, 0x8000 }, { 1302, 0x0b04 }, { 1306, 0x0008 }, { 1307, 0x041d }, { 1312, 0x0009 }, { 1314, 0x4849 }, { 1319, 0x905c }, { 1325, 0x0009 }, { 1327, 0x1690 }, /* 0x5800 */ { 1332, 0x0c65 }, { 1338, 0x2220 }, { 1341, 0x8412 }, { 1345, 0x2433 }, { 1351, 0x0c03 }, { 1355, 0x4796 }, { 1363, 0x0a04 }, { 1366, 0x4225 }, { 1371, 0x0028 }, { 1373, 0x9088 }, { 1377, 0x4900 }, { 1380, 0x4f08 }, { 1386, 0x14a2 }, { 1391, 0xd3aa }, { 1400, 0xd830 }, { 1406, 0x3e87 }, /* 0x5900 */ { 1415, 0x8604 }, { 1419, 0x1f61 }, { 1427, 0x7ea4 }, { 1436, 0x4186 }, { 1441, 0xc390 }, { 1447, 0x05b3 }, { 1454, 0x57a5 }, { 1463, 0x2118 }, { 1467, 0x241e }, { 1473, 0x2a48 }, { 1478, 0x1128 }, { 1482, 0x4a04 }, { 1486, 0x0a40 }, { 1489, 0x161b }, { 1496, 0x0d60 }, { 1501, 0x8840 }, /* 0x5a00 */ { 1504, 0x020a }, { 1507, 0x9502 }, { 1512, 0x8221 }, { 1516, 0x1060 }, { 1519, 0x0243 }, { 1523, 0x0400 }, { 1524, 0x1444 }, { 1528, 0x8000 }, { 1529, 0x0000 }, { 1529, 0x0c04 }, { 1532, 0x0000 }, { 1532, 0x7000 }, { 1535, 0x1a06 }, { 1540, 0x00c1 }, { 1543, 0x024a }, { 1547, 0x0c00 }, /* 0x5b00 */ { 1549, 0x1a00 }, { 1552, 0x0040 }, { 1553, 0x1404 }, { 1556, 0x4045 }, { 1560, 0x0029 }, { 1563, 0xbdb3 }, { 1574, 0x0a78 }, { 1580, 0x052b }, { 1586, 0xbba9 }, { 1596, 0xbfa0 }, { 1605, 0x407c }, { 1611, 0x8379 }, { 1619, 0x12fc }, { 1627, 0xe81d }, { 1635, 0x4bf6 }, { 1645, 0xc569 }, /* 0x5c00 */ { 1653, 0xeff6 }, { 1666, 0x044a }, { 1670, 0x2115 }, { 1675, 0xff02 }, { 1684, 0xed63 }, { 1694, 0x402b }, { 1699, 0xd033 }, { 1706, 0x0242 }, { 1709, 0x1000 }, { 1710, 0x0013 }, { 1713, 0x1b02 }, { 1718, 0x59ca }, { 1726, 0x00a0 }, { 1728, 0x0200 }, { 1729, 0xa703 }, { 1736, 0x2c41 }, /* 0x5d00 */ { 1741, 0x4880 }, { 1744, 0x8ff2 }, { 1754, 0x0204 }, { 1756, 0x0000 }, { 1756, 0x5800 }, { 1759, 0x1005 }, { 1762, 0x9200 }, { 1765, 0x0048 }, { 1767, 0x1894 }, { 1772, 0x2001 }, { 1774, 0x5004 }, { 1777, 0x3480 }, { 1781, 0x3200 }, { 1784, 0x684c }, { 1790, 0x49ea }, { 1798, 0x68be }, /* 0x5e00 */ { 1807, 0x184c }, { 1812, 0x2e42 }, { 1818, 0xa820 }, { 1822, 0x21c9 }, { 1828, 0x50b9 }, { 1835, 0x80b0 }, { 1839, 0x001e }, { 1843, 0xff7c }, { 1856, 0x849a }, { 1862, 0x14e0 }, { 1867, 0x28c1 }, { 1872, 0x01e0 }, { 1876, 0x870e }, { 1883, 0xac49 }, { 1890, 0x130f }, { 1897, 0xdddb }, /* 0x5f00 */ { 1909, 0xbe1a }, { 1918, 0x89fb }, { 1928, 0xa2e0 }, { 1934, 0x51a2 }, { 1940, 0x5502 }, { 1945, 0x32ca }, { 1952, 0x3e46 }, { 1960, 0x928b }, { 1967, 0x1dbf }, { 1978, 0x438f }, { 1986, 0x6703 }, { 1993, 0x3218 }, { 1998, 0x3028 }, { 2002, 0x33c0 }, { 2008, 0x0811 }, { 2011, 0xa923 }, /* 0x6000 */ { 2018, 0xc000 }, { 2020, 0x3a65 }, { 2028, 0x8fe3 }, { 2038, 0x0402 }, { 2040, 0x2c4e }, { 2047, 0x8625 }, { 2053, 0xbf3d }, { 2065, 0x00a1 }, { 2068, 0x3a1a }, { 2075, 0x8cd4 }, { 2082, 0x06c9 }, { 2088, 0x317c }, { 2096, 0x00e0 }, { 2099, 0x950a }, { 2105, 0x018b }, { 2110, 0x0edb }, /* 0x6100 */ { 2119, 0xe34b }, { 2128, 0x8c20 }, { 2132, 0x1182 }, { 2136, 0xf010 }, { 2141, 0x7d94 }, { 2150, 0xa728 }, { 2157, 0xc9ac }, { 2165, 0x40fb }, { 2173, 0x4484 }, { 2177, 0x0653 }, { 2183, 0x5a90 }, { 2189, 0x4444 }, { 2193, 0x3fc8 }, { 2202, 0x0001 }, { 2203, 0x0048 }, { 2205, 0xf5d4 }, /* 0x6200 */ { 2215, 0x7701 }, { 2222, 0xec57 }, { 2232, 0xc442 }, { 2237, 0x891d }, { 2244, 0x6b83 }, { 2252, 0x4928 }, { 2257, 0x4109 }, { 2261, 0xd242 }, { 2267, 0x061d }, { 2273, 0x59fe }, { 2284, 0x1800 }, { 2286, 0x3a22 }, { 2292, 0xb7e4 }, { 2302, 0x3b9f }, { 2313, 0xf003 }, { 2319, 0xc0ea }, /* 0x6300 */ { 2326, 0x1386 }, { 2332, 0x8202 }, { 2335, 0x8980 }, { 2339, 0xe400 }, { 2343, 0xb200 }, { 2347, 0x10a1 }, { 2351, 0x4b80 }, { 2356, 0x0cc4 }, { 2361, 0xd309 }, { 2368, 0x8944 }, { 2373, 0x1faf }, { 2384, 0x4834 }, { 2389, 0x8259 }, { 2395, 0x0c45 }, { 2400, 0x420a }, { 2404, 0x0450 }, /* 0x6400 */ { 2407, 0xa040 }, { 2410, 0x10c8 }, { 2414, 0x3140 }, { 2418, 0x4450 }, { 2422, 0x4004 }, { 2424, 0x0100 }, { 2425, 0x8280 }, { 2428, 0x0540 }, { 2431, 0x0108 }, { 2433, 0x442c }, { 2438, 0x6a30 }, { 2444, 0x1a05 }, { 2449, 0x20a6 }, { 2454, 0x0514 }, { 2458, 0x90cf }, { 2466, 0x6456 }, /* 0x6500 */ { 2473, 0x0021 }, { 2475, 0x3100 }, { 2478, 0x9c18 }, { 2484, 0xcbf0 }, { 2493, 0xa120 }, { 2497, 0x63e2 }, { 2505, 0x104c }, { 2509, 0x01b5 }, { 2515, 0x538c }, { 2522, 0x9a83 }, { 2529, 0xb8b2 }, { 2537, 0x3281 }, { 2542, 0x987a }, { 2550, 0x0a84 }, { 2554, 0x33e7 }, { 2564, 0x0c02 }, /* 0x6600 */ { 2567, 0xd4cc }, { 2575, 0x9018 }, { 2579, 0xa1a1 }, { 2585, 0x9070 }, { 2590, 0x8a1e }, { 2597, 0xe004 }, { 2601, 0xc3d4 }, { 2609, 0x0451 }, { 2613, 0x439a }, { 2620, 0x21c2 }, { 2625, 0x4844 }, { 2629, 0x5310 }, { 2634, 0x0292 }, { 2638, 0x3640 }, { 2643, 0x0241 }, { 2646, 0xf3bd }, /* 0x6700 */ { 2658, 0xab09 }, { 2665, 0xe8f0 }, { 2673, 0x7dc0 }, { 2681, 0xa5d2 }, { 2689, 0xc242 }, { 2694, 0xd24b }, { 2702, 0xa43f }, { 2711, 0xd0af }, { 2720, 0x1aa0 }, { 2725, 0x34a1 }, { 2731, 0x8247 }, { 2737, 0x03d8 }, { 2743, 0xc452 }, { 2749, 0x651b }, { 2757, 0xd294 }, { 2764, 0xc83a }, /* 0x6800 */ { 2771, 0x001c }, { 2774, 0x40c8 }, { 2778, 0x0e06 }, { 2783, 0x3314 }, { 2789, 0x614f }, { 2797, 0xb21b }, { 2805, 0x0088 }, { 2807, 0xc0d0 }, { 2812, 0xa02a }, { 2817, 0xa898 }, { 2823, 0xa1c5 }, { 2830, 0x166b }, { 2838, 0x2e50 }, { 2844, 0x85b4 }, { 2851, 0xc08b }, { 2857, 0x0604 }, /* 0x6900 */ { 2860, 0xf933 }, { 2870, 0x1e04 }, { 2875, 0x056e }, { 2882, 0xa251 }, { 2888, 0x0400 }, { 2889, 0x7638 }, { 2897, 0xec07 }, { 2905, 0x73b8 }, { 2914, 0x4406 }, { 2918, 0x1832 }, { 2923, 0x4081 }, { 2926, 0xc816 }, { 2932, 0x7c8a }, { 2940, 0x6309 }, { 2946, 0x2980 }, { 2950, 0xaa04 }, /* 0x6a00 */ { 2955, 0x1c24 }, { 2960, 0xca9c }, { 2968, 0x4e0e }, { 2975, 0x2760 }, { 2981, 0x0990 }, { 2985, 0x8300 }, { 2988, 0x0046 }, { 2991, 0x8104 }, { 2994, 0x6011 }, { 2998, 0x1081 }, { 3001, 0x540d }, { 3007, 0x0908 }, { 3010, 0x000e }, { 3013, 0xcc0a }, { 3019, 0x0500 }, { 3021, 0x0c00 }, /* 0x6b00 */ { 3023, 0x0430 }, { 3026, 0xa044 }, { 3030, 0x008b }, { 3034, 0x6784 }, { 3041, 0x5288 }, { 3046, 0x8a19 }, { 3052, 0x865e }, { 3060, 0x8b18 }, { 3066, 0x2e59 }, { 3074, 0x4160 }, { 3078, 0x8c10 }, { 3082, 0x9cbe }, { 3092, 0x6861 }, { 3098, 0x891c }, { 3104, 0x9800 }, { 3107, 0x0008 }, /* 0x6c00 */ { 3108, 0x8100 }, { 3110, 0x089a }, { 3115, 0x0018 }, { 3117, 0x4190 }, { 3121, 0x4007 }, { 3125, 0xe4a1 }, { 3132, 0x0505 }, { 3136, 0x640d }, { 3142, 0x310e }, { 3148, 0x0e4d }, { 3155, 0x4806 }, { 3159, 0xff0a }, { 3169, 0x1632 }, { 3175, 0x2aa8 }, { 3181, 0x852e }, { 3188, 0x000b }, /* 0x6d00 */ { 3191, 0x1800 }, { 3193, 0xca84 }, { 3199, 0x0e20 }, { 3203, 0x696c }, { 3211, 0x0032 }, { 3214, 0x1600 }, { 3217, 0x5658 }, { 3224, 0x0390 }, { 3228, 0x5120 }, { 3232, 0x1a28 }, { 3237, 0x8000 }, { 3238, 0x1124 }, { 3242, 0x18e1 }, { 3248, 0x4326 }, { 3254, 0x5d52 }, { 3262, 0x0eaa }, /* 0x6e00 */ { 3269, 0x0fa0 }, { 3275, 0xae28 }, { 3282, 0xfa7b }, { 3294, 0x4500 }, { 3297, 0x6408 }, { 3301, 0x8940 }, { 3305, 0xc880 }, { 3309, 0xc044 }, { 3313, 0x9005 }, { 3317, 0xb141 }, { 3323, 0x8424 }, { 3327, 0x24c4 }, { 3332, 0x1a34 }, { 3338, 0x603a }, { 3344, 0x9000 }, { 3346, 0xc194 }, /* 0x6f00 */ { 3352, 0x8246 }, { 3357, 0x003a }, { 3361, 0x180d }, { 3366, 0xc106 }, { 3371, 0x0022 }, { 3373, 0x9910 }, { 3378, 0xe050 }, { 3383, 0x1511 }, { 3388, 0x4057 }, { 3394, 0x0082 }, { 3396, 0x041a }, { 3400, 0x020a }, { 3403, 0x004f }, { 3408, 0x8930 }, { 3413, 0xd813 }, { 3420, 0x444a }, /* 0x7000 */ { 3425, 0x8a02 }, { 3429, 0xed22 }, { 3437, 0x10c0 }, { 3440, 0x4005 }, { 3443, 0x1000 }, { 3444, 0x0102 }, { 3446, 0x8808 }, { 3449, 0x3101 }, { 3453, 0x4600 }, { 3456, 0x0204 }, { 3458, 0xf000 }, { 3462, 0x0708 }, { 3466, 0x8900 }, { 3469, 0xa200 }, { 3472, 0x0000 }, { 3472, 0x2202 }, /* 0x7100 */ { 3475, 0x0200 }, { 3476, 0x1610 }, { 3480, 0x0042 }, { 3482, 0x1040 }, { 3484, 0x5200 }, { 3487, 0x0260 }, { 3490, 0x52f4 }, { 3498, 0x2000 }, { 3499, 0x8510 }, { 3503, 0x8230 }, { 3507, 0x1100 }, { 3509, 0x4202 }, { 3512, 0x4308 }, { 3516, 0x80b5 }, { 3522, 0x70e1 }, { 3529, 0x9a20 }, /* 0x7200 */ { 3534, 0x2040 }, { 3536, 0x0801 }, { 3538, 0x3500 }, { 3542, 0xfc65 }, { 3552, 0x19c1 }, { 3558, 0xab04 }, { 3564, 0x0286 }, { 3568, 0x6214 }, { 3573, 0x0087 }, { 3577, 0x0044 }, { 3579, 0x9085 }, { 3584, 0x0244 }, { 3587, 0x405c }, { 3592, 0x0a85 }, { 3597, 0x3207 }, { 3603, 0x3380 }, /* 0x7300 */ { 3608, 0x0400 }, { 3609, 0xb8c0 }, { 3615, 0xce20 }, { 3621, 0xc0d0 }, { 3626, 0xc030 }, { 3630, 0x0080 }, { 3631, 0x0508 }, { 3634, 0x0d25 }, { 3640, 0x0a90 }, { 3644, 0x0040 }, { 3645, 0x0200 }, { 3646, 0x080c }, { 3649, 0x6505 }, { 3655, 0x4000 }, { 3656, 0x6421 }, { 3661, 0x4102 }, /* 0x7400 */ { 3664, 0x0268 }, { 3668, 0x0000 }, { 3668, 0x0024 }, { 3670, 0x847c }, { 3677, 0x0002 }, { 3678, 0xde20 }, { 3685, 0x8619 }, { 3691, 0x4049 }, { 3695, 0x0808 }, { 3697, 0x4000 }, { 3698, 0x0084 }, { 3700, 0x2001 }, { 3702, 0x8400 }, { 3704, 0x1010 }, { 3706, 0x42cd }, { 3713, 0x01c7 }, /* 0x7500 */ { 3719, 0x7038 }, { 3725, 0xd52a }, { 3733, 0x1968 }, { 3739, 0x1d8f }, { 3748, 0xbe50 }, { 3756, 0x3e12 }, { 3763, 0x2ef5 }, { 3773, 0x81d9 }, { 3780, 0xcec4 }, { 3788, 0x2412 }, { 3792, 0x0828 }, { 3795, 0x732e }, { 3804, 0x24ac }, { 3810, 0x4b34 }, { 3817, 0x020c }, { 3820, 0xd41d }, /* 0x7600 */ { 3828, 0x2a02 }, { 3832, 0x8000 }, { 3833, 0x0097 }, { 3838, 0x0811 }, { 3841, 0x11c4 }, { 3846, 0x1144 }, { 3850, 0x1786 }, { 3857, 0x7d45 }, { 3866, 0x49d9 }, { 3874, 0x0649 }, { 3879, 0x4000 }, { 3880, 0x8791 }, { 3887, 0x254c }, { 3893, 0xd8c4 }, { 3900, 0x44ba }, { 3907, 0x4914 }, /* 0x7700 */ { 3912, 0x1b92 }, { 3919, 0xc800 }, { 3922, 0x0271 }, { 3927, 0x1580 }, { 3931, 0x0081 }, { 3933, 0x0c00 }, { 3935, 0x096a }, { 3941, 0xc200 }, { 3944, 0x4800 }, { 3946, 0x4002 }, { 3948, 0x3021 }, { 3952, 0xba49 }, { 3960, 0x2080 }, { 3962, 0x1c80 }, { 3966, 0xe2ac }, { 3974, 0x1008 }, /* 0x7800 */ { 3976, 0x1004 }, { 3978, 0x0034 }, { 3981, 0x00e1 }, { 3985, 0x8414 }, { 3989, 0x0020 }, { 3990, 0x2000 }, { 3991, 0x9800 }, { 3994, 0x1014 }, { 3997, 0x70c2 }, { 4003, 0x04aa }, { 4008, 0x8688 }, { 4013, 0x5420 }, { 4017, 0x0c62 }, { 4022, 0x0413 }, { 4026, 0x9180 }, { 4030, 0x2010 }, /* 0x7900 */ { 4032, 0x4082 }, { 4035, 0x0206 }, { 4038, 0x1c40 }, { 4042, 0x5400 }, { 4045, 0x0383 }, { 4050, 0xe4e9 }, { 4059, 0x2125 }, { 4064, 0x8480 }, { 4067, 0xe433 }, { 4075, 0x2000 }, { 4076, 0x44c0 }, { 4080, 0xe609 }, { 4087, 0x0a03 }, { 4091, 0x8126 }, { 4096, 0x12da }, { 4103, 0x0801 }, /* 0x7a00 */ { 4105, 0x6901 }, { 4110, 0x9790 }, { 4117, 0x4001 }, { 4119, 0xf886 }, { 4127, 0xe24d }, { 4135, 0x0081 }, { 4137, 0x0a0e }, { 4142, 0xa651 }, { 4149, 0x011a }, { 4153, 0x81ec }, { 4160, 0xc600 }, { 4164, 0x8441 }, { 4168, 0xadb8 }, { 4177, 0xb62c }, { 4185, 0xa46f }, { 4194, 0x8741 }, /* 0x7b00 */ { 4200, 0x8d54 }, { 4207, 0x4b02 }, { 4212, 0x1161 }, { 4217, 0x0268 }, { 4221, 0xbb60 }, { 4229, 0x2057 }, { 4235, 0x50a0 }, { 4239, 0x0433 }, { 4244, 0xa8c0 }, { 4249, 0xb7b4 }, { 4259, 0x2402 }, { 4262, 0x0112 }, { 4265, 0x9ad3 }, { 4274, 0x2000 }, { 4275, 0x2271 }, { 4281, 0x00c8 }, /* 0x7c00 */ { 4284, 0x2081 }, { 4287, 0x809e }, { 4293, 0x0c8a }, { 4298, 0xe180 }, { 4303, 0xb009 }, { 4308, 0x8151 }, { 4313, 0x1031 }, { 4317, 0x4028 }, { 4320, 0x2a0e }, { 4326, 0x89a5 }, { 4333, 0x69b6 }, { 4342, 0x620e }, { 4348, 0x4425 }, { 4353, 0xd144 }, { 4359, 0x8085 }, { 4363, 0x4d54 }, /* 0x7d00 */ { 4370, 0x2c75 }, { 4378, 0x1fb1 }, { 4387, 0xd807 }, { 4394, 0x862d }, { 4401, 0xd87c }, { 4410, 0x4841 }, { 4414, 0x414e }, { 4420, 0x226e }, { 4427, 0x8200 }, { 4429, 0x9e08 }, { 4435, 0xf80c }, { 4442, 0xed37 }, { 4453, 0x8c80 }, { 4457, 0x7526 }, { 4465, 0x9313 }, { 4472, 0x0814 }, /* 0x7e00 */ { 4475, 0x0e32 }, { 4481, 0xc804 }, { 4485, 0x484e }, { 4491, 0x6ea6 }, { 4500, 0x2c4a }, { 4506, 0x6670 }, { 4513, 0x26c0 }, { 4518, 0xba01 }, { 4524, 0xd30c }, { 4531, 0x185d }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, /* 0x7f00 */ { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0000 }, { 4538, 0x0540 }, { 4541, 0x7020 }, { 4545, 0x8133 }, { 4551, 0x4f81 }, { 4558, 0x03a5 }, { 4564, 0x55ec }, { 4573, 0x6410 }, { 4577, 0xc318 }, { 4583, 0x2344 }, { 4588, 0x1462 }, { 4593, 0x0034 }, { 4596, 0x0a43 }, { 4601, 0x1a09 }, /* 0x8000 */ { 4606, 0x187b }, { 4614, 0x13a5 }, { 4621, 0x0102 }, { 4623, 0xa848 }, { 4628, 0x0440 }, { 4630, 0xc544 }, { 4636, 0x8106 }, { 4640, 0xe2dd }, { 4650, 0x1af0 }, { 4657, 0x2d48 }, { 4663, 0xb626 }, { 4671, 0x0416 }, { 4675, 0x5058 }, { 4680, 0x6e40 }, { 4686, 0x8032 }, { 4690, 0x3112 }, /* 0x8100 */ { 4695, 0x07e4 }, { 4702, 0x0c00 }, { 4704, 0x8208 }, { 4707, 0x420a }, { 4711, 0x4840 }, { 4714, 0x803b }, { 4720, 0x4860 }, { 4724, 0x8713 }, { 4731, 0x850d }, { 4737, 0x3428 }, { 4742, 0x0319 }, { 4747, 0xe529 }, { 4755, 0x2345 }, { 4761, 0x870a }, { 4767, 0x25a9 }, { 4774, 0x5c18 }, /* 0x8200 */ { 4780, 0x77a6 }, { 4790, 0xd9c5 }, { 4799, 0x5e00 }, { 4804, 0x03e8 }, { 4810, 0x0081 }, { 4812, 0xa700 }, { 4817, 0xcd54 }, { 4825, 0x41c6 }, { 4831, 0x2800 }, { 4833, 0xa204 }, { 4837, 0xb860 }, { 4843, 0x2b0a }, { 4849, 0x0020 }, { 4850, 0xda9e }, { 4860, 0x08ea }, { 4866, 0x0e1a }, /* 0x8300 */ { 4872, 0x427c }, { 4879, 0x11c0 }, { 4883, 0x8908 }, { 4887, 0x0376 }, { 4894, 0x8621 }, { 4899, 0x0105 }, { 4902, 0x0000 }, { 4902, 0x18a8 }, { 4907, 0x46a0 }, { 4912, 0xc448 }, { 4917, 0x0d05 }, { 4922, 0x2022 }, { 4925, 0x5422 }, { 4930, 0x9148 }, { 4935, 0x8a01 }, { 4939, 0x2897 }, /* 0x8400 */ { 4946, 0x7898 }, { 4953, 0x0008 }, { 4954, 0x1605 }, { 4959, 0x3122 }, { 4964, 0x4240 }, { 4967, 0x0880 }, { 4969, 0xfa4e }, { 4979, 0x06a2 }, { 4984, 0x0814 }, { 4987, 0x9211 }, { 4992, 0x2002 }, { 4994, 0x9b04 }, { 5000, 0x2e52 }, { 5007, 0x0643 }, { 5012, 0x5000 }, { 5014, 0x9010 }, /* 0x8500 */ { 5017, 0x0041 }, { 5019, 0x85ba }, { 5027, 0x3042 }, { 5031, 0x2020 }, { 5033, 0x4f0b }, { 5041, 0x05a0 }, { 5045, 0x2708 }, { 5050, 0x4080 }, { 5052, 0x0591 }, { 5057, 0x1a93 }, { 5064, 0xdf50 }, { 5073, 0x0600 }, { 5075, 0xa202 }, { 5079, 0x3021 }, { 5083, 0x0630 }, { 5087, 0x4e80 }, /* 0x8600 */ { 5092, 0x0cc4 }, { 5097, 0x04c8 }, { 5101, 0xa004 }, { 5104, 0x8001 }, { 5106, 0x6000 }, { 5108, 0xd431 }, { 5115, 0x0880 }, { 5117, 0x0a02 }, { 5120, 0x1c00 }, { 5123, 0x0028 }, { 5125, 0x8e18 }, { 5131, 0x0041 }, { 5133, 0x6ad0 }, { 5140, 0xca10 }, { 5145, 0xf210 }, { 5151, 0x4b00 }, /* 0x8700 */ { 5155, 0x274d }, { 5163, 0x1506 }, { 5168, 0x0220 }, { 5170, 0x8890 }, { 5174, 0x5a00 }, { 5178, 0x82a8 }, { 5183, 0x4549 }, { 5189, 0x8150 }, { 5193, 0x2004 }, { 5195, 0x8000 }, { 5196, 0x8804 }, { 5199, 0x2c08 }, { 5203, 0x08d1 }, { 5208, 0x0005 }, { 5210, 0x8001 }, { 5212, 0x4ac4 }, /* 0x8800 */ { 5218, 0xe020 }, { 5222, 0x0062 }, { 5225, 0x008e }, { 5229, 0x0a42 }, { 5233, 0x3055 }, { 5239, 0x6a8c }, { 5246, 0x090e }, { 5251, 0xe0a5 }, { 5258, 0x2906 }, { 5263, 0x42c4 }, { 5268, 0x4814 }, { 5272, 0x80b3 }, { 5278, 0x803e }, { 5284, 0xb330 }, { 5291, 0x0102 }, { 5293, 0x731c }, /* 0x8900 */ { 5301, 0x1494 }, { 5306, 0x600d }, { 5311, 0x0c20 }, { 5314, 0x0940 }, { 5317, 0x301a }, { 5322, 0xc040 }, { 5325, 0xa451 }, { 5331, 0xc094 }, { 5336, 0x8dca }, { 5344, 0x05c8 }, { 5349, 0x96c2 }, { 5356, 0xa40c }, { 5361, 0x0001 }, { 5362, 0x3404 }, { 5366, 0x00c8 }, { 5369, 0x0110 }, /* 0x8a00 */ { 5371, 0x550d }, { 5378, 0xa9c9 }, { 5386, 0x2428 }, { 5390, 0x1c5a }, { 5397, 0x0142 }, { 5400, 0x4837 }, { 5407, 0x7a4d }, { 5416, 0x100f }, { 5421, 0x32b4 }, { 5428, 0x452a }, { 5434, 0x317b }, { 5443, 0x9205 }, { 5448, 0xb894 }, { 5455, 0x5c44 }, { 5461, 0x68d7 }, { 5470, 0x458a }, /* 0x8b00 */ { 5476, 0x5097 }, { 5483, 0x2ed1 }, { 5491, 0x1943 }, { 5497, 0x4208 }, { 5500, 0xd202 }, { 5505, 0x9d40 }, { 5511, 0x9840 }, { 5515, 0x2097 }, { 5521, 0x5409 }, { 5526, 0x064d }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, /* 0x8c00 */ { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x0000 }, { 5532, 0x8480 }, { 5535, 0x5542 }, { 5541, 0x0421 }, { 5544, 0x1c06 }, { 5549, 0x1700 }, { 5553, 0x7624 }, { 5560, 0x6110 }, { 5564, 0xff87 }, { 5576, 0xb9dd }, { 5587, 0x659f }, { 5597, 0x5c0a }, { 5603, 0x245d }, { 5610, 0x3c00 }, /* 0x8d00 */ { 5614, 0xadb0 }, { 5622, 0x0059 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x0000 }, { 5626, 0x28d0 }, { 5631, 0x009b }, { 5636, 0x0422 }, { 5639, 0x0200 }, { 5640, 0x0108 }, { 5642, 0x4408 }, { 5645, 0x9804 }, { 5649, 0xac40 }, { 5654, 0x8d0a }, { 5660, 0x9028 }, /* 0x8e00 */ { 5664, 0x8700 }, { 5668, 0xe001 }, { 5672, 0x0400 }, { 5673, 0x0031 }, { 5676, 0x1794 }, { 5683, 0x8221 }, { 5687, 0x0019 }, { 5690, 0x1054 }, { 5694, 0x2cb2 }, { 5701, 0x021a }, { 5705, 0x9c02 }, { 5710, 0x4003 }, { 5713, 0x3d60 }, { 5720, 0x8804 }, { 5723, 0x080c }, { 5726, 0x7900 }, /* 0x8f00 */ { 5731, 0x1628 }, { 5736, 0xba3c }, { 5745, 0x8640 }, { 5749, 0xcb08 }, { 5755, 0x7274 }, { 5763, 0x9080 }, { 5766, 0x001e }, { 5770, 0x0000 }, { 5770, 0x0000 }, { 5770, 0xd800 }, { 5774, 0xe188 }, { 5780, 0x9c87 }, { 5788, 0x4034 }, { 5792, 0x0412 }, { 5795, 0xae64 }, { 5803, 0x2791 }, /* 0x9000 */ { 5810, 0xe86b }, { 5819, 0xe6fb }, { 5831, 0x408f }, { 5837, 0x5366 }, { 5845, 0xeea6 }, { 5855, 0x537f }, { 5866, 0xe32b }, { 5875, 0xb5e4 }, { 5884, 0x869f }, { 5893, 0x0002 }, { 5894, 0x8548 }, { 5899, 0x0122 }, { 5902, 0x4402 }, { 5905, 0x0800 }, { 5906, 0x2116 }, { 5911, 0x20a0 }, /* 0x9100 */ { 5914, 0x0004 }, { 5915, 0x0204 }, { 5917, 0x2000 }, { 5918, 0x0005 }, { 5920, 0x7e00 }, { 5926, 0x0154 }, { 5930, 0x162c }, { 5936, 0x01ac }, { 5941, 0x2a84 }, { 5946, 0x1085 }, { 5950, 0x8c14 }, { 5955, 0x0530 }, { 5959, 0xfbc3 }, { 5970, 0xb943 }, { 5978, 0x00ca }, { 5982, 0x9060 }, /* 0x9200 */ { 5986, 0x6000 }, { 5988, 0x4032 }, { 5992, 0x1200 }, { 5994, 0x8090 }, { 5997, 0x0b30 }, { 6002, 0x4c81 }, { 6007, 0x0054 }, { 6010, 0x4002 }, { 6012, 0x0029 }, { 6015, 0x1d6a }, { 6023, 0x2000 }, { 6024, 0x0280 }, { 6026, 0x8000 }, { 6027, 0x0004 }, { 6028, 0x2610 }, { 6032, 0x150c }, /* 0x9300 */ { 6037, 0x8040 }, { 6039, 0x0701 }, { 6043, 0xd94d }, { 6052, 0x0c24 }, { 6056, 0x2810 }, { 6059, 0x1850 }, { 6063, 0x5001 }, { 6066, 0x5020 }, { 6069, 0x1000 }, { 6070, 0x04d0 }, { 6074, 0x7080 }, { 6078, 0x0201 }, { 6080, 0x0108 }, { 6082, 0x21c3 }, { 6088, 0x0132 }, { 6092, 0x0000 }, /* 0x9400 */ { 6092, 0x0088 }, { 6094, 0x0719 }, { 6100, 0x0802 }, { 6102, 0x0560 }, { 6106, 0x0012 }, { 6108, 0x4c0e }, { 6114, 0x0405 }, { 6117, 0xf0a1 }, { 6124, 0x0002 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, /* 0x9500 */ { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0000 }, { 6125, 0x0080 }, { 6126, 0x8e8d }, { 6134, 0x035a }, { 6140, 0x21bd }, { 6148, 0x5a04 }, { 6153, 0x3488 }, { 6158, 0x1170 }, { 6163, 0x0026 }, { 6166, 0x0000 }, /* 0x9600 */ { 6166, 0x0000 }, { 6166, 0x1000 }, { 6167, 0xc502 }, { 6172, 0x8804 }, { 6175, 0xb815 }, { 6182, 0xf801 }, { 6188, 0x147c }, { 6195, 0x25ed }, { 6204, 0xed60 }, { 6212, 0x1bb0 }, { 6219, 0x0589 }, { 6224, 0x1bd7 }, { 6234, 0x7af3 }, { 6245, 0x1a62 }, { 6251, 0x0d0c }, { 6256, 0x0ac5 }, /* 0x9700 */ { 6262, 0xe5d1 }, { 6271, 0x524a }, { 6277, 0x0490 }, { 6280, 0x6305 }, { 6286, 0x0354 }, { 6291, 0x5244 }, { 6296, 0x2b57 }, { 6305, 0x1612 }, { 6310, 0xa872 }, { 6317, 0x1101 }, { 6320, 0x2949 }, { 6326, 0x0018 }, { 6328, 0x0948 }, { 6332, 0x1008 }, { 6334, 0x6000 }, { 6336, 0x886c }, /* 0x9800 */ { 6342, 0x916e }, { 6350, 0x058f }, { 6357, 0x3012 }, { 6361, 0x3990 }, { 6367, 0xf840 }, { 6373, 0x4930 }, { 6378, 0x8880 }, { 6381, 0x001b }, { 6385, 0x0000 }, { 6385, 0x0000 }, { 6385, 0x8500 }, { 6388, 0x0042 }, { 6390, 0x0058 }, { 6393, 0x9800 }, { 6396, 0xea04 }, { 6402, 0x7014 }, /* 0x9900 */ { 6407, 0x1628 }, { 6412, 0x611d }, { 6419, 0x5113 }, { 6425, 0x6000 }, { 6427, 0x1a24 }, { 6432, 0x00a7 }, { 6437, 0x0000 }, { 6437, 0x0000 }, { 6437, 0x0000 }, { 6437, 0x03c0 }, { 6441, 0x7120 }, { 6446, 0x1018 }, { 6449, 0x0172 }, { 6454, 0xa927 }, { 6462, 0x6004 }, { 6465, 0x8906 }, /* 0x9a00 */ { 6470, 0xc022 }, { 6474, 0x020c }, { 6477, 0x0900 }, { 6479, 0x4081 }, { 6482, 0x202d }, { 6487, 0x8ca0 }, { 6492, 0x0e34 }, { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x0000 }, { 6498, 0x2100 }, { 6500, 0x1101 }, { 6503, 0x8011 }, { 6506, 0xc11a }, { 6512, 0xec4c }, { 6520, 0x0892 }, /* 0x9b00 */ { 6524, 0x0040 }, { 6525, 0x8500 }, { 6528, 0xc7ac }, { 6537, 0x1806 }, { 6541, 0xe03e }, { 6549, 0x0512 }, { 6553, 0x8000 }, { 6554, 0x0010 }, { 6555, 0x4008 }, { 6557, 0x80ce }, { 6563, 0x6d01 }, { 6569, 0x0210 }, { 6571, 0x8641 }, { 6576, 0x0856 }, { 6581, 0x011e }, { 6586, 0x0027 }, /* 0x9c00 */ { 6590, 0x3750 }, { 6597, 0x083d }, { 6603, 0xe032 }, { 6609, 0x4e05 }, { 6615, 0x01c0 }, { 6618, 0x0484 }, { 6621, 0x0081 }, { 6623, 0x0140 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x0000 }, { 6625, 0x1aa0 }, { 6630, 0x0059 }, /* 0x9d00 */ { 6634, 0x43c8 }, { 6640, 0x8824 }, { 6644, 0x1d48 }, { 6650, 0xc800 }, { 6653, 0x0152 }, { 6657, 0x7203 }, { 6663, 0x9013 }, { 6668, 0x0404 }, { 6670, 0x8280 }, { 6673, 0x0400 }, { 6674, 0x8a10 }, { 6678, 0x0d14 }, { 6683, 0x8056 }, { 6688, 0x0208 }, { 6690, 0xa040 }, { 6693, 0x2704 }, /* 0x9e00 */ { 6698, 0x0000 }, { 6698, 0x4c00 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0x0000 }, { 6701, 0xa320 }, { 6706, 0x1902 }, { 6710, 0xa0ae }, { 6717, 0x2660 }, { 6722, 0xdf00 }, { 6729, 0xf010 }, { 6734, 0x7b15 }, { 6743, 0x8121 }, { 6747, 0x3ad0 }, /* 0x9f00 */ { 6754, 0x4180 }, { 6757, 0x0028 }, { 6759, 0x1003 }, { 6762, 0x4800 }, { 6764, 0xcc00 }, { 6768, 0x8014 }, { 6771, 0x14cf }, { 6779, 0x00c4 }, { 6782, 0x2000 }, { 6783, 0x3020 }, { 6786, 0x0001 }, }; static const Summary16 jisx0208_uni2indx_pageff[15] = { /* 0xff00 */ { 6787, 0xdf7a }, { 6799, 0xffff }, { 6815, 0xffff }, { 6831, 0xffff }, { 6847, 0xffff }, { 6863, 0x3fff }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0028 }, }; static int jisx0208_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc > 0x0000 && wc < 0x0100) summary = &jisx0208_uni2indx_page00[(wc>>4)]; else if (wc >= 0x0300 && wc < 0x0460) summary = &jisx0208_uni2indx_page03[(wc>>4)-0x030]; else if (wc >= 0x2000 && wc < 0x2320) summary = &jisx0208_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2500 && wc < 0x2670) summary = &jisx0208_uni2indx_page25[(wc>>4)-0x250]; else if (wc >= 0x3000 && wc < 0x3100) summary = &jisx0208_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &jisx0208_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &jisx0208_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = jisx0208_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.2.05/src/libtiniconv/encdec/jisx0201.h0000664000175000017500000000330714532252172015752 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * JISX0201.1976-0 */ static int jisx0201_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { if (c == 0x5c) *pwc = (ucs4_t) 0x00a5; else if (c == 0x7e) *pwc = (ucs4_t) 0x203e; else *pwc = (ucs4_t) c; return 1; } else { if (c >= 0xa1 && c < 0xe0) { *pwc = (ucs4_t) c + 0xfec0; return 1; } } return RET_ILSEQ; } static int jisx0201_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080 && !(wc == 0x005c || wc == 0x007e)) { *r = wc; return 1; } if (wc == 0x00a5) { *r = 0x5c; return 1; } if (wc == 0x203e) { *r = 0x7e; return 1; } if (wc >= 0xff61 && wc < 0xffa0) { *r = wc - 0xfec0; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp1258.h0000664000175000017500000002450214532252172015414 00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1258 */ #include "flushwc.h" #include "vietcomb.h" static const unsigned char cp1258_comb_table[] = { 0xcc, 0xec, 0xde, 0xd2, 0xf2, }; /* The possible bases in viet_comp_table_data: 0x0041..0x0045, 0x0047..0x0049, 0x004B..0x0050, 0x0052..0x0057, 0x0059..0x005A, 0x0061..0x0065, 0x0067..0x0069, 0x006B..0x0070, 0x0072..0x0077, 0x0079..0x007A, 0x00A5, 0x00A8, 0x00C2, 0x00C5..0x00C7, 0x00CA, 0x00CF, 0x00D3..0x00D4, 0x00D6, 0x00D8, 0x00DA, 0x00DC, 0x00E2, 0x00E5..0x00E7, 0x00EA, 0x00EF, 0x00F3..0x00F4, 0x00F6, 0x00F8, 0x00FA, 0x00FC, 0x0102..0x0103, 0x01A0..0x01A1, 0x01AF..0x01B0. */ static const unsigned int cp1258_comp_bases[] = { 0x06fdfbbe, 0x06fdfbbe, 0x00000000, 0x00000120, 0x155884e4, 0x155884e4, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00018003 }; static const unsigned short cp1258_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0xfffd, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0xfffd, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x0300, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0110, 0x00d1, 0x0309, 0x00d3, 0x00d4, 0x01a0, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x01af, 0x0303, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0301, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0111, 0x00f1, 0x0323, 0x00f3, 0x00f4, 0x01a1, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x01b0, 0x20ab, 0x00ff, }; /* In the CP1258 to Unicode direction, the state contains a buffered character, or 0 if none. */ static int cp1258_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; unsigned short wc; unsigned short last_wc; if (c < 0x80) { wc = c; } else { wc = cp1258_2uni[c-0x80]; if (wc == 0xfffd) return RET_ILSEQ; } last_wc = conv->istate; if (last_wc) { if (wc >= 0x0300 && wc < 0x0340) { /* See whether last_wc and wc can be combined. */ unsigned int k = 0; unsigned int i1, i2; switch (wc) { case 0x0300: k = 0; break; case 0x0301: k = 1; break; case 0x0303: k = 2; break; case 0x0309: k = 3; break; case 0x0323: k = 4; break; default: abort(); } i1 = viet_comp_table[k].idx; i2 = i1 + viet_comp_table[k].len-1; if (last_wc >= viet_comp_table_data[i1].base && last_wc <= viet_comp_table_data[i2].base) { unsigned int i; for (;;) { i = (i1+i2)>>1; if (last_wc == viet_comp_table_data[i].base) break; if (last_wc < viet_comp_table_data[i].base) { if (i1 == i) goto not_combining; i2 = i; } else { if (i1 != i) i1 = i; else { i = i2; if (last_wc == viet_comp_table_data[i].base) break; goto not_combining; } } } last_wc = viet_comp_table_data[i].composed; /* Output the combined character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } } not_combining: /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 0; /* Don't advance the input pointer. */ } if (wc >= 0x0041 && wc <= 0x01b0 && ((cp1258_comp_bases[(wc - 0x0040) >> 5] >> (wc & 0x1f)) & 1)) { /* wc is a possible match in viet_comp_table_data. Buffer it. */ conv->istate = wc; return RET_TOOFEW(1); } else { /* Output wc immediately. */ *pwc = (ucs4_t) wc; return 1; } } #define cp1258_flushwc normal_flushwc static const unsigned char cp1258_page00[88] = { 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ }; static const unsigned char cp1258_page01[104] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0xd5, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd, /* 0xa8-0xaf */ 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ }; static const unsigned char cp1258_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1258_page03[40] = { 0xcc, 0xec, 0x00, 0xde, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char cp1258_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1258_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = wc; else if (wc >= 0x00c0 && wc < 0x0118) c = cp1258_page00[wc-0x00c0]; else if (wc >= 0x0150 && wc < 0x01b8) c = cp1258_page01[wc-0x0150]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1258_page02[wc-0x02c0]; else if (wc >= 0x0300 && wc < 0x0328) c = cp1258_page03[wc-0x0300]; else if (wc >= 0x0340 && wc < 0x0342) /* deprecated Vietnamese tone marks */ c = cp1258_page03[wc-0x0340]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1258_page20[wc-0x2010]; else if (wc == 0x20ab) c = 0xfe; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } /* Try canonical decomposition. */ { /* Binary search through viet_decomp_table. */ unsigned int i1 = 0; unsigned int i2 = sizeof(viet_decomp_table)/sizeof(viet_decomp_table[0])-1; if (wc >= viet_decomp_table[i1].composed && wc <= viet_decomp_table[i2].composed) { unsigned int i; for (;;) { /* Here i2 - i1 > 0. */ i = (i1+i2)>>1; if (wc == viet_decomp_table[i].composed) break; if (wc < viet_decomp_table[i].composed) { if (i1 == i) return RET_ILUNI; /* Here i1 < i < i2. */ i2 = i; } else { /* Here i1 <= i < i2. */ if (i1 != i) i1 = i; else { /* Here i2 - i1 = 1. */ i = i2; if (wc == viet_decomp_table[i].composed) break; else return RET_ILUNI; } } } /* Found a canonical decomposition. */ wc = viet_decomp_table[i].base; /* wc is one of 0x0020, 0x0041..0x005a, 0x0061..0x007a, 0x00a5, 0x00a8, 0x00c2, 0x00c5..0x00c7, 0x00ca, 0x00cf, 0x00d3, 0x00d4, 0x00d6, 0x00d8, 0x00da, 0x00dc, 0x00e2, 0x00e5..0x00e7, 0x00ea, 0x00ef, 0x00f3, 0x00f4, 0x00f6, 0x00f8, 0x00fc, 0x0102, 0x0103, 0x01a0, 0x01a1, 0x01af, 0x01b0. */ if (wc < 0x0100) c = wc; else if (wc < 0x0118) c = cp1258_page00[wc-0x00c0]; else c = cp1258_page01[wc-0x0150]; if (n < 2) return RET_TOOSMALL; r[0] = c; r[1] = cp1258_comb_table[viet_decomp_table[i].comb1]; return 2; } } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp1250.h0000664000175000017500000001305714532252172015407 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1250 */ static const unsigned short cp1250_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0xfffd, 0x201e, 0x2026, 0x2020, 0x2021, 0xfffd, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0xfffd, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, /* 0xa0 */ 0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, /* 0xb0 */ 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, /* 0xc0 */ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* 0xd0 */ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* 0xe0 */ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* 0xf0 */ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static int cp1250_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = cp1250_2uni[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char cp1250_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa5, 0xb9, 0xc6, 0xe6, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xbc, 0xbe, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ 0xd8, 0xf8, 0x8c, 0x9c, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ 0x8a, 0x9a, 0xde, 0xfe, 0x8d, 0x9d, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8f, 0x9f, 0xaf, 0xbf, 0x8e, 0x9e, 0x00, /* 0x78-0x7f */ }; static const unsigned char cp1250_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1250_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1250_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = cp1250_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1250_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1250_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_15.h0000664000175000017500000000532314532252172016127 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-15 */ static const unsigned short iso8859_15_2uni[32] = { /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, }; static int iso8859_15_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0 && c < 0xc0) *pwc = (ucs4_t) iso8859_15_2uni[c-0xa0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_15_page00[32] = { 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0xb9, 0xba, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0xb8-0xbf */ }; static const unsigned char iso8859_15_page01[48] = { 0x00, 0x00, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0xbe, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */ }; static int iso8859_15_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = iso8859_15_page00[wc-0x00a0]; else if (wc >= 0x00c0 && wc < 0x0100) c = wc; else if (wc >= 0x0150 && wc < 0x0180) c = iso8859_15_page01[wc-0x0150]; else if (wc == 0x20ac) c = 0xa4; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_9.h0000664000175000017500000000607614532252172016060 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-9 */ static const unsigned short iso8859_9_2uni[48] = { /* 0xd0 */ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static int iso8859_9_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xd0) *pwc = (ucs4_t) iso8859_9_2uni[c-0xd0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_9_page00[48] = { 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char iso8859_9_page01[72] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ }; static int iso8859_9_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00d0) { *r = wc; return 1; } else if (wc >= 0x00d0 && wc < 0x0100) c = iso8859_9_page00[wc-0x00d0]; else if (wc >= 0x0118 && wc < 0x0160) c = iso8859_9_page01[wc-0x0118]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp1254.h0000664000175000017500000001222714532252172015411 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1254 */ static const unsigned short cp1254_2uni_1[32] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0xfffd, 0xfffd, 0x0178, }; static const unsigned short cp1254_2uni_2[16] = { /* 0xd0 */ 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, }; static const unsigned short cp1254_2uni_3[16] = { /* 0xf0 */ 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff, }; static int cp1254_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xa0) { unsigned short wc = cp1254_2uni_1[c-0x80]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } else if (c < 0xd0) { *pwc = (ucs4_t) c; return 1; } else if (c < 0xe0) { *pwc = (ucs4_t) cp1254_2uni_2[c-0xd0]; return 1; } else if (c < 0xf0) { *pwc = (ucs4_t) c; return 1; } else { *pwc = (ucs4_t) cp1254_2uni_3[c-0xf0]; return 1; } return RET_ILSEQ; } static const unsigned char cp1254_page00[48] = { 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char cp1254_page01[128] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */ 0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1254_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1254_page20[48] = { 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1254_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00d0) c = wc; else if (wc >= 0x00d0 && wc < 0x0100) c = cp1254_page00[wc-0x00d0]; else if (wc >= 0x0118 && wc < 0x0198) c = cp1254_page01[wc-0x0118]; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1254_page02[wc-0x02c0]; else if (wc >= 0x2010 && wc < 0x2040) c = cp1254_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/flushwc.h0000664000175000017500000000230514532252172016142 00000000000000/* * Copyright (C) 2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _FLUSHWC_H #define _FLUSHWC_H static int normal_flushwc (conv_t conv, ucs4_t *pwc) { ucs4_t last_wc = conv->istate; if (last_wc) { /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } else return 0; } #endif /* _FLUSHWC_H */ fldigi-4.2.05/src/libtiniconv/encdec/iso8859_2.h0000664000175000017500000001114214532252172016037 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-2 */ static const unsigned short iso8859_2_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, /* 0xb0 */ 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* 0xc0 */ 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, /* 0xd0 */ 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, /* 0xe0 */ 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, /* 0xf0 */ 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, }; static int iso8859_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_2_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_2_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xb1, 0xc6, 0xe6, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0xc5, 0xe5, 0x00, 0x00, 0xa5, 0xb5, 0x00, /* 0x38-0x3f */ 0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */ 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */ 0xd8, 0xf8, 0xa6, 0xb6, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */ 0xa9, 0xb9, 0xde, 0xfe, 0xab, 0xbb, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */ 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xac, 0xbc, 0xaf, 0xbf, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_2_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_2_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = iso8859_2_page02[wc-0x02c0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/koi8_r.h0000664000175000017500000001523614532252172015671 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-R */ /* Specification: RFC 1489 */ static const unsigned short koi8_r_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_r_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_r_2uni[c-0x80]; return 1; } static const unsigned char koi8_r_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_r_page04[88] = { 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ }; static const unsigned char koi8_r_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_r_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_r_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_r_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_r_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0458) c = koi8_r_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_r_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_r_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_r_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_13.h0000664000175000017500000001064414532252172016127 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-13 */ static const unsigned short iso8859_13_2uni[96] = { /* 0xa0 */ 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, /* 0xc0 */ 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, /* 0xd0 */ 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, /* 0xe0 */ 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, /* 0xf0 */ 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019, }; static int iso8859_13_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_13_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_13_page00[224] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0x00, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */ 0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */ 0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_13_page20[8] = { 0x00, 0xff, 0x00, 0x00, 0xb4, 0xa1, 0xa5, 0x00, /* 0x18-0x1f */ }; static int iso8859_13_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_13_page00[wc-0x00a0]; else if (wc >= 0x2018 && wc < 0x2020) c = iso8859_13_page20[wc-0x2018]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/utf8.h0000664000175000017500000001002014532252172015346 00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-8 */ /* Specification: RFC 3629 */ static int utf8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = s[0]; if (c < 0x80) { *pwc = c; return 1; } else if (c < 0xc2) { return RET_ILSEQ; } else if (c < 0xe0) { if (n < 2) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40)) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x1f) << 6) | (ucs4_t) (s[1] ^ 0x80); return 2; } else if (c < 0xf0) { if (n < 3) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (c >= 0xe1 || s[1] >= 0xa0))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x0f) << 12) | ((ucs4_t) (s[1] ^ 0x80) << 6) | (ucs4_t) (s[2] ^ 0x80); return 3; } else if (c < 0xf8 && sizeof(ucs4_t)*8 >= 32) { if (n < 4) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (c >= 0xf1 || s[1] >= 0x90))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x07) << 18) | ((ucs4_t) (s[1] ^ 0x80) << 12) | ((ucs4_t) (s[2] ^ 0x80) << 6) | (ucs4_t) (s[3] ^ 0x80); return 4; } else if (c < 0xfc && sizeof(ucs4_t)*8 >= 32) { if (n < 5) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 && (c >= 0xf9 || s[1] >= 0x88))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x03) << 24) | ((ucs4_t) (s[1] ^ 0x80) << 18) | ((ucs4_t) (s[2] ^ 0x80) << 12) | ((ucs4_t) (s[3] ^ 0x80) << 6) | (ucs4_t) (s[4] ^ 0x80); return 5; } else if (c < 0xfe && sizeof(ucs4_t)*8 >= 32) { if (n < 6) return RET_TOOFEW(0); if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40 && (s[5] ^ 0x80) < 0x40 && (c >= 0xfd || s[1] >= 0x84))) return RET_ILSEQ; *pwc = ((ucs4_t) (c & 0x01) << 30) | ((ucs4_t) (s[1] ^ 0x80) << 24) | ((ucs4_t) (s[2] ^ 0x80) << 18) | ((ucs4_t) (s[3] ^ 0x80) << 12) | ((ucs4_t) (s[4] ^ 0x80) << 6) | (ucs4_t) (s[5] ^ 0x80); return 6; } else return RET_ILSEQ; } static int utf8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) /* n == 0 is acceptable */ { int count; if (wc < 0x80) count = 1; else if (wc < 0x800) count = 2; else if (wc < 0x10000) count = 3; else if (wc < 0x200000) count = 4; else if (wc < 0x4000000) count = 5; else if (wc <= 0x7fffffff) count = 6; else return RET_ILUNI; if (n < count) return RET_TOOSMALL; switch (count) { /* note: code falls through cases! */ case 6: r[5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000; case 5: r[4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000; case 4: r[3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000; case 3: r[2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800; case 2: r[1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0; case 1: r[0] = wc; } return count; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_10.h0000664000175000017500000001040414532252172016116 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-10 */ static const unsigned short iso8859_10_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7, 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, /* 0xb0 */ 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, /* 0xc0 */ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, /* 0xe0 */ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138, }; static int iso8859_10_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_10_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_10_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0xd0, 0x00, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0xf0, 0x00, 0x00, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0xa9, 0xb9, 0xa2, 0xb2, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xa3, 0xb3, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0xa5, 0xb5, 0xa4, 0xb4, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xb6, /* 0x30-0x37 */ 0xff, 0x00, 0x00, 0xa8, 0xb8, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0xaf, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0xab, 0xbb, /* 0x60-0x67 */ 0xd7, 0xf7, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0x00, /* 0x78-0x7f */ }; static int iso8859_10_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_10_page00[wc-0x00a0]; else if (wc == 0x2015) c = 0xbd; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp1256.h0000664000175000017500000001516714532252172015421 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1256 */ static const unsigned short cp1256_2uni[128] = { /* 0x80 */ 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, /* 0x90 */ 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, /* 0xa0 */ 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, /* 0xc0 */ 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, /* 0xe0 */ 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, /* 0xf0 */ 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2, }; static int cp1256_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) cp1256_2uni[c-0x80]; return 1; } static const unsigned char cp1256_page00[96] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0xe0, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x00, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xf7, /* 0xf0-0xf7 */ 0x00, 0xf9, 0x00, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char cp1256_page01[72] = { 0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char cp1256_page06[208] = { 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd8, /* 0x30-0x37 */ 0xd9, 0xda, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xdc, 0xdd, 0xde, 0xdf, 0xe1, 0xe3, 0xe4, 0xe5, /* 0x40-0x47 */ 0xe6, 0xec, 0xed, 0xf0, 0xf1, 0xf2, 0xf3, 0xf5, /* 0x48-0x4f */ 0xf6, 0xf8, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, /* 0x80-0x87 */ 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xaa, 0x00, /* 0xb8-0xbf */ 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ }; static const unsigned char cp1256_page20[56] = { 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1256_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = cp1256_page00[wc-0x00a0]; else if (wc >= 0x0150 && wc < 0x0198) c = cp1256_page01[wc-0x0150]; else if (wc == 0x02c6) c = 0x88; else if (wc >= 0x0608 && wc < 0x06d8) c = cp1256_page06[wc-0x0608]; else if (wc >= 0x2008 && wc < 0x2040) c = cp1256_page20[wc-0x2008]; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/ces_big5.h0000664000175000017500000000356114532252172016154 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * BIG-5 */ static int ces_big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (BIG5) */ if (c >= 0xa1 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) return big5_mbtowc(conv,pwc,s,2); else return RET_ILSEQ; } } return RET_ILSEQ; } static int ces_big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (BIG5) */ ret = big5_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_4.h0000664000175000017500000001114214532252172016041 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-4 */ static const unsigned short iso8859_4_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7, 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, /* 0xb0 */ 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, /* 0xc0 */ 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, /* 0xd0 */ 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, /* 0xe0 */ 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, /* 0xf0 */ 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9, }; static int iso8859_4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) iso8859_4_2uni[c-0xa0]; return 1; } static const unsigned char iso8859_4_page00[224] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0xaf, /* 0xa8-0xaf */ 0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */ 0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0xd8, 0x00, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */ 0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ /* 0x0100 */ 0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */ 0xd0, 0xf0, 0xaa, 0xba, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */ 0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0xab, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0xa5, 0xb5, 0xcf, 0xef, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xf3, /* 0x30-0x37 */ 0xa2, 0x00, 0x00, 0xa6, 0xb6, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0xbd, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xb3, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, /* 0x60-0x67 */ 0xdd, 0xfd, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_4_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0xff, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_4_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0180) c = iso8859_4_page00[wc-0x00a0]; else if (wc >= 0x02c0 && wc < 0x02e0) c = iso8859_4_page02[wc-0x02c0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_11.h0000664000175000017500000000276014532252172016125 00000000000000/* * Copyright (C) 1999-2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-11 */ static int iso8859_11_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa1) { *pwc = (ucs4_t) c; return 1; } else if (c <= 0xfb && !(c >= 0xdb && c <= 0xde)) { *pwc = (ucs4_t) (c + 0x0d60); return 1; } return RET_ILSEQ; } static int iso8859_11_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x00a1) { *r = wc; return 1; } else if (wc >= 0x0e01 && wc <= 0x0e5b && !(wc >= 0x0e3b && wc <= 0x0e3e)) { *r = wc-0x0d60; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/utf7.h0000664000175000017500000002444614532252172015366 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UTF-7 */ /* Specification: RFC 2152 (and old RFC 1641, RFC 1642) */ /* The original Base64 encoding is defined in RFC 2045. */ /* Set of direct characters: * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr */ static const unsigned char direct_tab[128/8] = { 0x00, 0x26, 0x00, 0x00, 0x81, 0xf3, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, }; #define isdirect(ch) ((ch) < 128 && ((direct_tab[(ch)>>3] >> (ch & 7)) & 1)) /* Set of direct and optional direct characters: * A-Z a-z 0-9 ' ( ) , - . / : ? space tab lf cr * ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } */ static const unsigned char xdirect_tab[128/8] = { 0x00, 0x26, 0x00, 0x00, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x3f, }; #define isxdirect(ch) ((ch) < 128 && ((xdirect_tab[(ch)>>3] >> (ch & 7)) & 1)) /* Set of base64 characters, extended: * A-Z a-z 0-9 + / - */ static const unsigned char xbase64_tab[128/8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x07, }; #define isxbase64(ch) ((ch) < 128 && ((xbase64_tab[(ch)>>3] >> (ch & 7)) & 1)) /* * The state is structured as follows: * bit 1..0: shift * bit 7..2: data * Precise meaning: * shift data * 0 0 not inside base64 encoding * 1 0 inside base64, no pending bits * 2 XXXX00 inside base64, 4 bits remain from 2nd byte * 3 XX0000 inside base64, 2 bits remain from 3rd byte */ static int utf7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { conv_state_t state = conv->istate; int count = 0; /* number of input bytes already read */ if (state & 3) goto active; else goto inactive; inactive: { /* Here (state & 3) == 0 */ if (n < count+1) goto none; { unsigned char c = *s; if (isxdirect(c)) { *pwc = (ucs4_t) c; conv->istate = state; return count+1; } if (c == '+') { if (n < count+2) goto none; if (s[1] == '-') { *pwc = (ucs4_t) '+'; conv->istate = state; return count+2; } s++; count++; state = 1; goto active; } return RET_ILSEQ; } } active: { /* base64 encoding active */ unsigned int wc = 0; conv_state_t base64state = state; unsigned int kmax = 2; /* number of payload bytes to read */ unsigned int k = 0; /* number of payload bytes already read */ unsigned int base64count = 0; /* number of base64 bytes already read */ for (;;) { unsigned char c = *s; unsigned int i; if (c >= 'A' && c <= 'Z') i = c-'A'; else if (c >= 'a' && c <= 'z') i = c-'a'+26; else if (c >= '0' && c <= '9') i = c-'0'+52; else if (c == '+') i = 62; else if (c == '/') i = 63; else { /* c terminates base64 encoding */ if (base64state & -4) return RET_ILSEQ; /* data must be 0, otherwise illegal */ if (base64count) return RET_ILSEQ; /* partial UTF-16 characters are invalid */ if (c == '-') { s++; count++; } state = 0; goto inactive; } s++; base64count++; /* read 6 bits: 0 <= i < 64 */ switch (base64state & 3) { case 1: /* inside base64, no pending bits */ base64state = (i << 2) | 0; break; case 0: /* inside base64, 6 bits remain from 1st byte */ wc = (wc << 8) | (base64state & -4) | (i >> 4); k++; base64state = ((i & 15) << 4) | 2; break; case 2: /* inside base64, 4 bits remain from 2nd byte */ wc = (wc << 8) | (base64state & -4) | (i >> 2); k++; base64state = ((i & 3) << 6) | 3; break; case 3: /* inside base64, 2 bits remain from 3rd byte */ wc = (wc << 8) | (base64state & -4) | i; k++; base64state = 1; break; } if (k == kmax) { /* UTF-16: When we see a High Surrogate, we must also decode the following Low Surrogate. */ if (kmax == 2 && (wc >= 0xd800 && wc < 0xdc00)) kmax = 4; else break; } if (n < count+(int)base64count+1) { if (*(s-base64count-count) == '+') { /* Begin of base64 sequence. * Not changing state and not reporting RET_TOOFEW(>0). * Next time will do the things again. */ return RET_TOOSMALL; } goto none; } } /* Here k = kmax > 0, hence base64count > 0. */ if ((base64state & 3) == 0) abort(); if (kmax == 4) { ucs4_t wc1 = wc >> 16; ucs4_t wc2 = wc & 0xffff; if (!(wc1 >= 0xd800 && wc1 < 0xdc00)) abort(); if (!(wc2 >= 0xdc00 && wc2 < 0xe000)) return RET_ILSEQ; *pwc = 0x10000 + ((wc1 - 0xd800) << 10) + (wc2 - 0xdc00); } else { *pwc = wc; } conv->istate = base64state; return count+base64count; } none: conv->istate = state; return RET_TOOFEW(count); } /* * The state is structured as follows: * bit 1..0: shift * bit 7..2: data * Precise meaning: * shift data * 0 0 not inside base64 encoding * 1 0 inside base64, no pending bits * 2 XX00 inside base64, 2 bits known for 2nd byte * 3 XXXX inside base64, 4 bits known for 3rd byte */ /* Define this to 1 if you want the so-called "optional direct" characters ! " # $ % & * ; < = > @ [ ] ^ _ ` { | } to be encoded. Define to 0 if you want them to be passed straight through, like the so-called "direct" characters. We set this to 1 because it's safer. */ #define UTF7_ENCODE_OPTIONAL_CHARS 1 static int utf7_wctomb (conv_t conv, unsigned char *r, ucs4_t iwc, int n) { conv_state_t state = conv->ostate; unsigned int wc = iwc; int count = 0; if (state & 3) goto active; /*inactive:*/ { if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { r[0] = (unsigned char) wc; /*conv->ostate = state;*/ return 1; } else { *r++ = '+'; if (wc == '+') { if (n < 2) return RET_TOOSMALL; *r = '-'; /*conv->ostate = state;*/ return 2; } count = 1; state = 1; goto active; } } active: { /* base64 encoding active */ if (UTF7_ENCODE_OPTIONAL_CHARS ? isdirect(wc) : isxdirect(wc)) { /* deactivate base64 encoding */ count += ((state & 3) >= 2 ? 1 : 0) + (isxbase64(wc) ? 1 : 0) + 1; if (n < count) return RET_TOOSMALL; if ((state & 3) >= 2) { unsigned int i = state & -4; unsigned char c = 0; if (i < 26) c = i+'A'; else if (i < 52) c = i-26+'a'; else if (i < 62) c = i-52+'0'; else if (i == 62) c = '+'; else if (i == 63) c = '/'; else abort(); *r++ = c; } if (isxbase64(wc)) *r++ = '-'; state = 0; *r++ = (unsigned char) wc; conv->ostate = state; return count; } else { unsigned int k; /* number of payload bytes to write */ if (wc < 0x10000) { k = 2; count += ((state & 3) >= 2 ? 3 : 2); } else if (wc < 0x110000) { unsigned int wc1 = 0xd800 + ((wc - 0x10000) >> 10); unsigned int wc2 = 0xdc00 + ((wc - 0x10000) & 0x3ff); wc = (wc1 << 16) | wc2; k = 4; count += ((state & 3) >= 3 ? 6 : 5); } else return RET_ILUNI; if (n < count) return RET_TOOSMALL; for (;;) { unsigned int i; unsigned char c = 0; switch (state & 3) { case 0: /* inside base64, 6 bits known for 4th byte */ c = (state & -4) >> 2; state = 1; break; case 1: /* inside base64, no pending bits */ i = (wc >> (8 * --k)) & 0xff; c = i >> 2; state = ((i & 3) << 4) | 2; break; case 2: /* inside base64, 2 bits known for 2nd byte */ i = (wc >> (8 * --k)) & 0xff; c = (state & -4) | (i >> 4); state = ((i & 15) << 2) | 3; break; case 3: /* inside base64, 4 bits known for 3rd byte */ i = (wc >> (8 * --k)) & 0xff; c = (state & -4) | (i >> 6); state = ((i & 63) << 2) | 0; break; default: abort(); /* stupid gcc */ } if (c < 26) c = c+'A'; else if (c < 52) c = c-26+'a'; else if (c < 62) c = c-52+'0'; else if (c == 62) c = '+'; else if (c == 63) c = '/'; else abort(); *r++ = c; if ((state & 3) && (k == 0)) break; } conv->ostate = state; return count; } } } static int utf7_reset (conv_t conv, unsigned char *r, int n) { conv_state_t state = conv->ostate; if (state & 3) { /* deactivate base64 encoding */ int count = ((state & 3) >= 2 ? 1 : 0) + 1; if (n < count) return RET_TOOSMALL; if ((state & 3) >= 2) { unsigned int i = state & -4; unsigned char c = 0; if (i < 26) c = i+'A'; else if (i < 52) c = i-26+'a'; else if (i < 62) c = i-52+'0'; else if (i == 62) c = '+'; else if (i == 63) c = '/'; else abort(); *r++ = c; } *r++ = '-'; /* conv->ostate = 0; will be done by the caller */ return count; } else return 0; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_7.h0000664000175000017500000000766414532252172016062 00000000000000/* * Copyright (C) 1999-2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-7 */ static const unsigned short iso8859_7_2uni[96] = { /* 0xa0 */ 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0xfffd, 0x2015, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, /* 0xc0 */ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0xd0 */ 0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, /* 0xe0 */ 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0xf0 */ 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd, }; static int iso8859_7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_7_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_7_page00[32] = { 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ }; static const unsigned char iso8859_7_page03[88] = { 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0x00, /* 0x80-0x87 */ 0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */ 0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */ }; static const unsigned char iso8859_7_page20[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, /* 0x10-0x17 */ 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ }; static int iso8859_7_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00c0) c = iso8859_7_page00[wc-0x00a0]; else if (wc >= 0x0378 && wc < 0x03d0) c = iso8859_7_page03[wc-0x0378]; else if (wc >= 0x2010 && wc < 0x2020) c = iso8859_7_page20[wc-0x2010]; else if (wc == 0x20ac) c = 0xa4; else if (wc == 0x20af) c = 0xa5; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/ascii.h0000664000175000017500000000242214532252172015557 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ASCII */ static int ascii_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) { *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static int ascii_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0080) { *r = (unsigned char)wc; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_3.h0000664000175000017500000001107414532252172016044 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-3 */ static const unsigned short iso8859_3_2uni[96] = { /* 0xa0 */ 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0xfffd, 0x0124, 0x00a7, 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0xfffd, 0x017b, /* 0xb0 */ 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0xfffd, 0x017c, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0xfffd, 0x00c4, 0x010a, 0x0108, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0xfffd, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0xfffd, 0x00e4, 0x010b, 0x0109, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0xfffd, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9, }; static int iso8859_3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_3_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_3_page00[96] = { 0xa0, 0x00, 0x00, 0xa3, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ 0xb0, 0x00, 0xb2, 0xb3, 0xb4, 0xb5, 0x00, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */ 0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */ 0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */ }; static const unsigned char iso8859_3_page01[120] = { 0xc6, 0xe6, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0xd8, 0xf8, 0xab, 0xbb, /* 0x18-0x1f */ 0xd5, 0xf5, 0x00, 0x00, 0xa6, 0xb6, 0xa1, 0xb1, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0xa9, 0xb9, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0xaa, 0xba, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0xaf, 0xbf, 0x00, 0x00, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_3_page02[8] = { 0xa2, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static int iso8859_3_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = iso8859_3_page00[wc-0x00a0]; else if (wc >= 0x0108 && wc < 0x0180) c = iso8859_3_page01[wc-0x0108]; else if (wc >= 0x02d8 && wc < 0x02e0) c = iso8859_3_page02[wc-0x02d8]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp936ext.h0000664000175000017500000000664714532252172016071 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP936 extensions */ static const unsigned short cp936ext_2uni_pagea6[181-159] = { /* 0xa6 */ 0xfe35, 0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfffd, 0xfffd, 0xfe3b, 0xfe3c, 0xfe37, 0xfe38, 0xfe31, 0xfffd, 0xfe33, 0xfe34, }; static const unsigned short cp936ext_2uni_pagea8[128-122] = { /* 0xa8 */ 0x0251, 0xfffd, 0x0144, 0x0148, 0xfffd, 0x0261, }; static int cp936ext_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 == 0xa6) || (c1 == 0xa8)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; if (i < 7410) { if (i >= 7189 && i < 7211) wc = cp936ext_2uni_pagea6[i-7189]; } else { if (i >= 7532 && i < 7538) wc = cp936ext_2uni_pagea8[i-7532]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short cp936ext_page01[16] = { 0x0000, 0x0000, 0x0000, 0x0000, 0xa8bd, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ 0xa8be, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/ }; static const unsigned short cp936ext_page02[24] = { 0x0000, 0xa8bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/ 0x0000, 0xa8c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/ }; static const unsigned short cp936ext_pagefe[24] = { 0x0000, 0xa6f2, 0x0000, 0xa6f4, 0xa6f5, 0xa6e0, 0xa6e1, 0xa6f0, /*0x30-0x37*/ 0xa6f1, 0xa6e2, 0xa6e3, 0xa6ee, 0xa6ef, 0xa6e6, 0xa6e7, 0xa6e4, /*0x38-0x3f*/ 0xa6e5, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/ }; static int cp936ext_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { unsigned short c = 0; if (wc >= 0x0140 && wc < 0x0150) c = cp936ext_page01[wc-0x0140]; else if (wc >= 0x0250 && wc < 0x0268) c = cp936ext_page02[wc-0x0250]; else if (wc >= 0xfe30 && wc < 0xfe48) c = cp936ext_pagefe[wc-0xfe30]; if (c != 0) { r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.2.05/src/libtiniconv/encdec/gbkext1.h0000664000175000017500000014603614532252172016046 00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK/3 extensions */ static const unsigned short gbkext1_2uni_page81[6080] = { /* 0x81 */ 0x4e02, 0x4e04, 0x4e05, 0x4e06, 0x4e0f, 0x4e12, 0x4e17, 0x4e1f, 0x4e20, 0x4e21, 0x4e23, 0x4e26, 0x4e29, 0x4e2e, 0x4e2f, 0x4e31, 0x4e33, 0x4e35, 0x4e37, 0x4e3c, 0x4e40, 0x4e41, 0x4e42, 0x4e44, 0x4e46, 0x4e4a, 0x4e51, 0x4e55, 0x4e57, 0x4e5a, 0x4e5b, 0x4e62, 0x4e63, 0x4e64, 0x4e65, 0x4e67, 0x4e68, 0x4e6a, 0x4e6b, 0x4e6c, 0x4e6d, 0x4e6e, 0x4e6f, 0x4e72, 0x4e74, 0x4e75, 0x4e76, 0x4e77, 0x4e78, 0x4e79, 0x4e7a, 0x4e7b, 0x4e7c, 0x4e7d, 0x4e7f, 0x4e80, 0x4e81, 0x4e82, 0x4e83, 0x4e84, 0x4e85, 0x4e87, 0x4e8a, 0x4e90, 0x4e96, 0x4e97, 0x4e99, 0x4e9c, 0x4e9d, 0x4e9e, 0x4ea3, 0x4eaa, 0x4eaf, 0x4eb0, 0x4eb1, 0x4eb4, 0x4eb6, 0x4eb7, 0x4eb8, 0x4eb9, 0x4ebc, 0x4ebd, 0x4ebe, 0x4ec8, 0x4ecc, 0x4ecf, 0x4ed0, 0x4ed2, 0x4eda, 0x4edb, 0x4edc, 0x4ee0, 0x4ee2, 0x4ee6, 0x4ee7, 0x4ee9, 0x4eed, 0x4eee, 0x4eef, 0x4ef1, 0x4ef4, 0x4ef8, 0x4ef9, 0x4efa, 0x4efc, 0x4efe, 0x4f00, 0x4f02, 0x4f03, 0x4f04, 0x4f05, 0x4f06, 0x4f07, 0x4f08, 0x4f0b, 0x4f0c, 0x4f12, 0x4f13, 0x4f14, 0x4f15, 0x4f16, 0x4f1c, 0x4f1d, 0x4f21, 0x4f23, 0x4f28, 0x4f29, 0x4f2c, 0x4f2d, 0x4f2e, 0x4f31, 0x4f33, 0x4f35, 0x4f37, 0x4f39, 0x4f3b, 0x4f3e, 0x4f3f, 0x4f40, 0x4f41, 0x4f42, 0x4f44, 0x4f45, 0x4f47, 0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56, 0x4f61, 0x4f62, 0x4f66, 0x4f68, 0x4f6a, 0x4f6b, 0x4f6d, 0x4f6e, 0x4f71, 0x4f72, 0x4f75, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7d, 0x4f80, 0x4f81, 0x4f82, 0x4f85, 0x4f86, 0x4f87, 0x4f8a, 0x4f8c, 0x4f8e, 0x4f90, 0x4f92, 0x4f93, 0x4f95, 0x4f96, 0x4f98, 0x4f99, 0x4f9a, 0x4f9c, 0x4f9e, 0x4f9f, 0x4fa1, 0x4fa2, /* 0x82 */ 0x4fa4, 0x4fab, 0x4fad, 0x4fb0, 0x4fb1, 0x4fb2, 0x4fb3, 0x4fb4, 0x4fb6, 0x4fb7, 0x4fb8, 0x4fb9, 0x4fba, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fc0, 0x4fc1, 0x4fc2, 0x4fc6, 0x4fc7, 0x4fc8, 0x4fc9, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fd2, 0x4fd3, 0x4fd4, 0x4fd5, 0x4fd6, 0x4fd9, 0x4fdb, 0x4fe0, 0x4fe2, 0x4fe4, 0x4fe5, 0x4fe7, 0x4feb, 0x4fec, 0x4ff0, 0x4ff2, 0x4ff4, 0x4ff5, 0x4ff6, 0x4ff7, 0x4ff9, 0x4ffb, 0x4ffc, 0x4ffd, 0x4fff, 0x5000, 0x5001, 0x5002, 0x5003, 0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500a, 0x500b, 0x500e, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501b, 0x501d, 0x501e, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502b, 0x502f, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036, 0x5037, 0x5038, 0x5039, 0x503b, 0x503d, 0x503f, 0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504a, 0x504b, 0x504d, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058, 0x5059, 0x505b, 0x505d, 0x505e, 0x505f, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506a, 0x506b, 0x506d, 0x506e, 0x506f, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5078, 0x5079, 0x507a, 0x507c, 0x507d, 0x5081, 0x5082, 0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508a, 0x508b, 0x508c, 0x508e, 0x508f, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5096, 0x5097, 0x5098, 0x5099, 0x509a, 0x509b, 0x509c, 0x509d, 0x509e, 0x509f, 0x50a0, 0x50a1, 0x50a2, 0x50a4, 0x50a6, 0x50aa, 0x50ab, 0x50ad, 0x50ae, 0x50af, 0x50b0, 0x50b1, 0x50b3, 0x50b4, 0x50b5, 0x50b6, 0x50b7, 0x50b8, 0x50b9, 0x50bc, /* 0x83 */ 0x50bd, 0x50be, 0x50bf, 0x50c0, 0x50c1, 0x50c2, 0x50c3, 0x50c4, 0x50c5, 0x50c6, 0x50c7, 0x50c8, 0x50c9, 0x50ca, 0x50cb, 0x50cc, 0x50cd, 0x50ce, 0x50d0, 0x50d1, 0x50d2, 0x50d3, 0x50d4, 0x50d5, 0x50d7, 0x50d8, 0x50d9, 0x50db, 0x50dc, 0x50dd, 0x50de, 0x50df, 0x50e0, 0x50e1, 0x50e2, 0x50e3, 0x50e4, 0x50e5, 0x50e8, 0x50e9, 0x50ea, 0x50eb, 0x50ef, 0x50f0, 0x50f1, 0x50f2, 0x50f4, 0x50f6, 0x50f7, 0x50f8, 0x50f9, 0x50fa, 0x50fc, 0x50fd, 0x50fe, 0x50ff, 0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, 0x5109, 0x510a, 0x510c, 0x510d, 0x510e, 0x510f, 0x5110, 0x5111, 0x5113, 0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511a, 0x511b, 0x511c, 0x511d, 0x511e, 0x511f, 0x5120, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512a, 0x512b, 0x512c, 0x512d, 0x512e, 0x512f, 0x5130, 0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513a, 0x513b, 0x513c, 0x513d, 0x513e, 0x5142, 0x5147, 0x514a, 0x514c, 0x514e, 0x514f, 0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515b, 0x515d, 0x515e, 0x515f, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, 0x5167, 0x5169, 0x516a, 0x516f, 0x5172, 0x517a, 0x517e, 0x517f, 0x5183, 0x5184, 0x5186, 0x5187, 0x518a, 0x518b, 0x518e, 0x518f, 0x5190, 0x5191, 0x5193, 0x5194, 0x5198, 0x519a, 0x519d, 0x519e, 0x519f, 0x51a1, 0x51a3, 0x51a6, 0x51a7, 0x51a8, 0x51a9, 0x51aa, 0x51ad, 0x51ae, 0x51b4, 0x51b8, 0x51b9, 0x51ba, 0x51be, 0x51bf, 0x51c1, 0x51c2, 0x51c3, 0x51c5, 0x51c8, 0x51ca, 0x51cd, 0x51ce, 0x51d0, 0x51d2, 0x51d3, 0x51d4, 0x51d5, 0x51d6, 0x51d7, /* 0x84 */ 0x51d8, 0x51d9, 0x51da, 0x51dc, 0x51de, 0x51df, 0x51e2, 0x51e3, 0x51e5, 0x51e6, 0x51e7, 0x51e8, 0x51e9, 0x51ea, 0x51ec, 0x51ee, 0x51f1, 0x51f2, 0x51f4, 0x51f7, 0x51fe, 0x5204, 0x5205, 0x5209, 0x520b, 0x520c, 0x520f, 0x5210, 0x5213, 0x5214, 0x5215, 0x521c, 0x521e, 0x521f, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227, 0x522a, 0x522c, 0x522f, 0x5231, 0x5232, 0x5234, 0x5235, 0x523c, 0x523e, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524b, 0x524e, 0x524f, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0x5259, 0x525a, 0x525b, 0x525d, 0x525f, 0x5260, 0x5262, 0x5263, 0x5264, 0x5266, 0x5268, 0x526b, 0x526c, 0x526d, 0x526e, 0x5270, 0x5271, 0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, 0x527a, 0x527b, 0x527c, 0x527e, 0x5280, 0x5283, 0x5284, 0x5285, 0x5286, 0x5287, 0x5289, 0x528a, 0x528b, 0x528c, 0x528d, 0x528e, 0x528f, 0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529a, 0x529c, 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52ae, 0x52af, 0x52b0, 0x52b4, 0x52b5, 0x52b6, 0x52b7, 0x52b8, 0x52b9, 0x52ba, 0x52bb, 0x52bc, 0x52bd, 0x52c0, 0x52c1, 0x52c2, 0x52c4, 0x52c5, 0x52c6, 0x52c8, 0x52ca, 0x52cc, 0x52cd, 0x52ce, 0x52cf, 0x52d1, 0x52d3, 0x52d4, 0x52d5, 0x52d7, 0x52d9, 0x52da, 0x52db, 0x52dc, 0x52dd, 0x52de, 0x52e0, 0x52e1, 0x52e2, 0x52e3, 0x52e5, 0x52e6, 0x52e7, 0x52e8, 0x52e9, 0x52ea, 0x52eb, 0x52ec, 0x52ed, 0x52ee, 0x52ef, 0x52f1, 0x52f2, 0x52f3, 0x52f4, 0x52f5, 0x52f6, 0x52f7, 0x52f8, 0x52fb, 0x52fc, 0x52fd, 0x5301, 0x5302, 0x5303, 0x5304, 0x5307, 0x5309, 0x530a, 0x530b, 0x530c, 0x530e, /* 0x85 */ 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531b, 0x531c, 0x531e, 0x531f, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532b, 0x532c, 0x532d, 0x532f, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334, 0x5335, 0x5336, 0x5337, 0x5338, 0x533c, 0x533d, 0x5340, 0x5342, 0x5344, 0x5346, 0x534b, 0x534c, 0x534d, 0x5350, 0x5354, 0x5358, 0x5359, 0x535b, 0x535d, 0x5365, 0x5368, 0x536a, 0x536c, 0x536d, 0x5372, 0x5376, 0x5379, 0x537b, 0x537c, 0x537d, 0x537e, 0x5380, 0x5381, 0x5383, 0x5387, 0x5388, 0x538a, 0x538e, 0x538f, 0x5390, 0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539b, 0x539c, 0x539e, 0x53a0, 0x53a1, 0x53a4, 0x53a7, 0x53aa, 0x53ab, 0x53ac, 0x53ad, 0x53af, 0x53b0, 0x53b1, 0x53b2, 0x53b3, 0x53b4, 0x53b5, 0x53b7, 0x53b8, 0x53b9, 0x53ba, 0x53bc, 0x53bd, 0x53be, 0x53c0, 0x53c3, 0x53c4, 0x53c5, 0x53c6, 0x53c7, 0x53ce, 0x53cf, 0x53d0, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dc, 0x53dd, 0x53de, 0x53e1, 0x53e2, 0x53e7, 0x53f4, 0x53fa, 0x53fe, 0x53ff, 0x5400, 0x5402, 0x5405, 0x5407, 0x540b, 0x5414, 0x5418, 0x5419, 0x541a, 0x541c, 0x5422, 0x5424, 0x5425, 0x542a, 0x5430, 0x5433, 0x5436, 0x5437, 0x543a, 0x543d, 0x543f, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449, 0x544c, 0x544d, 0x544e, 0x544f, 0x5451, 0x545a, 0x545d, 0x545e, 0x545f, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, 0x5469, 0x546a, 0x546b, 0x546c, 0x546d, 0x546e, 0x546f, 0x5470, 0x5474, 0x5479, 0x547a, 0x547e, 0x547f, 0x5481, 0x5483, 0x5485, 0x5487, 0x5488, 0x5489, 0x548a, 0x548d, 0x5491, 0x5493, 0x5497, 0x5498, 0x549c, 0x549e, 0x549f, 0x54a0, 0x54a1, /* 0x86 */ 0x54a2, 0x54a5, 0x54ae, 0x54b0, 0x54b2, 0x54b5, 0x54b6, 0x54b7, 0x54b9, 0x54ba, 0x54bc, 0x54be, 0x54c3, 0x54c5, 0x54ca, 0x54cb, 0x54d6, 0x54d8, 0x54db, 0x54e0, 0x54e1, 0x54e2, 0x54e3, 0x54e4, 0x54eb, 0x54ec, 0x54ef, 0x54f0, 0x54f1, 0x54f4, 0x54f5, 0x54f6, 0x54f7, 0x54f8, 0x54f9, 0x54fb, 0x54fe, 0x5500, 0x5502, 0x5503, 0x5504, 0x5505, 0x5508, 0x550a, 0x550b, 0x550c, 0x550d, 0x550e, 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551a, 0x551c, 0x551d, 0x551e, 0x551f, 0x5521, 0x5525, 0x5526, 0x5528, 0x5529, 0x552b, 0x552d, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538, 0x5539, 0x553a, 0x553b, 0x553d, 0x5540, 0x5542, 0x5545, 0x5547, 0x5548, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5551, 0x5552, 0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555a, 0x555b, 0x555d, 0x555e, 0x555f, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556b, 0x556f, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557a, 0x557d, 0x557f, 0x5585, 0x5586, 0x558c, 0x558d, 0x558e, 0x5590, 0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559a, 0x559b, 0x559e, 0x55a0, 0x55a1, 0x55a2, 0x55a3, 0x55a4, 0x55a5, 0x55a6, 0x55a8, 0x55a9, 0x55aa, 0x55ab, 0x55ac, 0x55ad, 0x55ae, 0x55af, 0x55b0, 0x55b2, 0x55b4, 0x55b6, 0x55b8, 0x55ba, 0x55bc, 0x55bf, 0x55c0, 0x55c1, 0x55c2, 0x55c3, 0x55c6, 0x55c7, 0x55c8, 0x55ca, 0x55cb, 0x55ce, 0x55cf, 0x55d0, 0x55d5, 0x55d7, 0x55d8, 0x55d9, 0x55da, 0x55db, 0x55de, 0x55e0, 0x55e2, 0x55e7, 0x55e9, 0x55ed, 0x55ee, 0x55f0, 0x55f1, 0x55f4, 0x55f6, 0x55f8, 0x55f9, 0x55fa, 0x55fb, 0x55fc, 0x55ff, 0x5602, 0x5603, 0x5604, 0x5605, /* 0x87 */ 0x5606, 0x5607, 0x560a, 0x560b, 0x560d, 0x5610, 0x5611, 0x5612, 0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561a, 0x561c, 0x561d, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629, 0x562a, 0x562b, 0x562e, 0x562f, 0x5630, 0x5633, 0x5635, 0x5637, 0x5638, 0x563a, 0x563c, 0x563d, 0x563e, 0x5640, 0x5641, 0x5642, 0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564a, 0x564b, 0x564f, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565a, 0x565b, 0x565d, 0x565e, 0x565f, 0x5660, 0x5661, 0x5663, 0x5665, 0x5666, 0x5667, 0x566d, 0x566e, 0x566f, 0x5670, 0x5672, 0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567a, 0x567d, 0x567e, 0x567f, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5687, 0x5688, 0x5689, 0x568a, 0x568b, 0x568c, 0x568d, 0x5690, 0x5691, 0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, 0x569a, 0x569b, 0x569c, 0x569d, 0x569e, 0x569f, 0x56a0, 0x56a1, 0x56a2, 0x56a4, 0x56a5, 0x56a6, 0x56a7, 0x56a8, 0x56a9, 0x56aa, 0x56ab, 0x56ac, 0x56ad, 0x56ae, 0x56b0, 0x56b1, 0x56b2, 0x56b3, 0x56b4, 0x56b5, 0x56b6, 0x56b8, 0x56b9, 0x56ba, 0x56bb, 0x56bd, 0x56be, 0x56bf, 0x56c0, 0x56c1, 0x56c2, 0x56c3, 0x56c4, 0x56c5, 0x56c6, 0x56c7, 0x56c8, 0x56c9, 0x56cb, 0x56cc, 0x56cd, 0x56ce, 0x56cf, 0x56d0, 0x56d1, 0x56d2, 0x56d3, 0x56d5, 0x56d6, 0x56d8, 0x56d9, 0x56dc, 0x56e3, 0x56e5, 0x56e6, 0x56e7, 0x56e8, 0x56e9, 0x56ea, 0x56ec, 0x56ee, 0x56ef, 0x56f2, 0x56f3, 0x56f6, 0x56f7, 0x56f8, 0x56fb, 0x56fc, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, 0x570b, 0x570c, 0x570d, 0x570e, 0x570f, 0x5710, 0x5711, /* 0x88 */ 0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719, 0x571a, 0x571b, 0x571d, 0x571e, 0x5720, 0x5721, 0x5722, 0x5724, 0x5725, 0x5726, 0x5727, 0x572b, 0x5731, 0x5732, 0x5734, 0x5735, 0x5736, 0x5737, 0x5738, 0x573c, 0x573d, 0x573f, 0x5741, 0x5743, 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574b, 0x5752, 0x5753, 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765, 0x5767, 0x576c, 0x576e, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775, 0x5778, 0x5779, 0x577a, 0x577d, 0x577e, 0x577f, 0x5780, 0x5781, 0x5787, 0x5788, 0x5789, 0x578a, 0x578d, 0x578e, 0x578f, 0x5790, 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579a, 0x579c, 0x579d, 0x579e, 0x579f, 0x57a5, 0x57a8, 0x57aa, 0x57ac, 0x57af, 0x57b0, 0x57b1, 0x57b3, 0x57b5, 0x57b6, 0x57b7, 0x57b9, 0x57ba, 0x57bb, 0x57bc, 0x57bd, 0x57be, 0x57bf, 0x57c0, 0x57c1, 0x57c4, 0x57c5, 0x57c6, 0x57c7, 0x57c8, 0x57c9, 0x57ca, 0x57cc, 0x57cd, 0x57d0, 0x57d1, 0x57d3, 0x57d6, 0x57d7, 0x57db, 0x57dc, 0x57de, 0x57e1, 0x57e2, 0x57e3, 0x57e5, 0x57e6, 0x57e7, 0x57e8, 0x57e9, 0x57ea, 0x57eb, 0x57ec, 0x57ee, 0x57f0, 0x57f1, 0x57f2, 0x57f3, 0x57f5, 0x57f6, 0x57f7, 0x57fb, 0x57fc, 0x57fe, 0x57ff, 0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580a, 0x580c, 0x580e, 0x580f, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, 0x5817, 0x5818, 0x581a, 0x581b, 0x581c, 0x581d, 0x581f, 0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582b, 0x582c, 0x582d, 0x582e, 0x582f, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, 0x5837, 0x5838, 0x5839, 0x583a, 0x583b, 0x583c, 0x583d, /* 0x89 */ 0x583e, 0x583f, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849, 0x584a, 0x584b, 0x584e, 0x584f, 0x5850, 0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585a, 0x585b, 0x585c, 0x585d, 0x585f, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5866, 0x5867, 0x5868, 0x5869, 0x586a, 0x586d, 0x586e, 0x586f, 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877, 0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587f, 0x5882, 0x5884, 0x5886, 0x5887, 0x5888, 0x588a, 0x588b, 0x588c, 0x588d, 0x588e, 0x588f, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897, 0x5898, 0x589b, 0x589c, 0x589d, 0x58a0, 0x58a1, 0x58a2, 0x58a3, 0x58a4, 0x58a5, 0x58a6, 0x58a7, 0x58aa, 0x58ab, 0x58ac, 0x58ad, 0x58ae, 0x58af, 0x58b0, 0x58b1, 0x58b2, 0x58b3, 0x58b4, 0x58b5, 0x58b6, 0x58b7, 0x58b8, 0x58b9, 0x58ba, 0x58bb, 0x58bd, 0x58be, 0x58bf, 0x58c0, 0x58c2, 0x58c3, 0x58c4, 0x58c6, 0x58c7, 0x58c8, 0x58c9, 0x58ca, 0x58cb, 0x58cc, 0x58cd, 0x58ce, 0x58cf, 0x58d0, 0x58d2, 0x58d3, 0x58d4, 0x58d6, 0x58d7, 0x58d8, 0x58d9, 0x58da, 0x58db, 0x58dc, 0x58dd, 0x58de, 0x58df, 0x58e0, 0x58e1, 0x58e2, 0x58e3, 0x58e5, 0x58e6, 0x58e7, 0x58e8, 0x58e9, 0x58ea, 0x58ed, 0x58ef, 0x58f1, 0x58f2, 0x58f4, 0x58f5, 0x58f7, 0x58f8, 0x58fa, 0x58fb, 0x58fc, 0x58fd, 0x58fe, 0x58ff, 0x5900, 0x5901, 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590a, 0x590b, 0x590c, 0x590e, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591b, 0x591d, 0x591e, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592c, 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593b, /* 0x8a */ 0x593d, 0x593e, 0x593f, 0x5940, 0x5943, 0x5945, 0x5946, 0x594a, 0x594c, 0x594d, 0x5950, 0x5952, 0x5953, 0x5959, 0x595b, 0x595c, 0x595d, 0x595e, 0x595f, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f, 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597a, 0x597b, 0x597c, 0x597e, 0x597f, 0x5980, 0x5985, 0x5989, 0x598b, 0x598c, 0x598e, 0x598f, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599a, 0x599b, 0x599c, 0x599d, 0x599f, 0x59a0, 0x59a1, 0x59a2, 0x59a6, 0x59a7, 0x59ac, 0x59ad, 0x59b0, 0x59b1, 0x59b3, 0x59b4, 0x59b5, 0x59b6, 0x59b7, 0x59b8, 0x59ba, 0x59bc, 0x59bd, 0x59bf, 0x59c0, 0x59c1, 0x59c2, 0x59c3, 0x59c4, 0x59c5, 0x59c7, 0x59c8, 0x59c9, 0x59cc, 0x59cd, 0x59ce, 0x59cf, 0x59d5, 0x59d6, 0x59d9, 0x59db, 0x59de, 0x59df, 0x59e0, 0x59e1, 0x59e2, 0x59e4, 0x59e6, 0x59e7, 0x59e9, 0x59ea, 0x59eb, 0x59ed, 0x59ee, 0x59ef, 0x59f0, 0x59f1, 0x59f2, 0x59f3, 0x59f4, 0x59f5, 0x59f6, 0x59f7, 0x59f8, 0x59fa, 0x59fc, 0x59fd, 0x59fe, 0x5a00, 0x5a02, 0x5a0a, 0x5a0b, 0x5a0d, 0x5a0e, 0x5a0f, 0x5a10, 0x5a12, 0x5a14, 0x5a15, 0x5a16, 0x5a17, 0x5a19, 0x5a1a, 0x5a1b, 0x5a1d, 0x5a1e, 0x5a21, 0x5a22, 0x5a24, 0x5a26, 0x5a27, 0x5a28, 0x5a2a, 0x5a2b, 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f, 0x5a30, 0x5a33, 0x5a35, 0x5a37, 0x5a38, 0x5a39, 0x5a3a, 0x5a3b, 0x5a3d, 0x5a3e, 0x5a3f, 0x5a41, 0x5a42, 0x5a43, 0x5a44, 0x5a45, 0x5a47, 0x5a48, 0x5a4b, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, 0x5a50, 0x5a51, 0x5a52, 0x5a53, 0x5a54, 0x5a56, 0x5a57, 0x5a58, 0x5a59, 0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, 0x5a60, /* 0x8b */ 0x5a61, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a68, 0x5a69, 0x5a6b, 0x5a6c, 0x5a6d, 0x5a6e, 0x5a6f, 0x5a70, 0x5a71, 0x5a72, 0x5a73, 0x5a78, 0x5a79, 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5a80, 0x5a81, 0x5a82, 0x5a83, 0x5a84, 0x5a85, 0x5a86, 0x5a87, 0x5a88, 0x5a89, 0x5a8a, 0x5a8b, 0x5a8c, 0x5a8d, 0x5a8e, 0x5a8f, 0x5a90, 0x5a91, 0x5a93, 0x5a94, 0x5a95, 0x5a96, 0x5a97, 0x5a98, 0x5a99, 0x5a9c, 0x5a9d, 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa1, 0x5aa2, 0x5aa3, 0x5aa4, 0x5aa5, 0x5aa6, 0x5aa7, 0x5aa8, 0x5aa9, 0x5aab, 0x5aac, 0x5aad, 0x5aae, 0x5aaf, 0x5ab0, 0x5ab1, 0x5ab4, 0x5ab6, 0x5ab7, 0x5ab9, 0x5aba, 0x5abb, 0x5abc, 0x5abd, 0x5abf, 0x5ac0, 0x5ac3, 0x5ac4, 0x5ac5, 0x5ac6, 0x5ac7, 0x5ac8, 0x5aca, 0x5acb, 0x5acd, 0x5ace, 0x5acf, 0x5ad0, 0x5ad1, 0x5ad3, 0x5ad5, 0x5ad7, 0x5ad9, 0x5ada, 0x5adb, 0x5add, 0x5ade, 0x5adf, 0x5ae2, 0x5ae4, 0x5ae5, 0x5ae7, 0x5ae8, 0x5aea, 0x5aec, 0x5aed, 0x5aee, 0x5aef, 0x5af0, 0x5af2, 0x5af3, 0x5af4, 0x5af5, 0x5af6, 0x5af7, 0x5af8, 0x5af9, 0x5afa, 0x5afb, 0x5afc, 0x5afd, 0x5afe, 0x5aff, 0x5b00, 0x5b01, 0x5b02, 0x5b03, 0x5b04, 0x5b05, 0x5b06, 0x5b07, 0x5b08, 0x5b0a, 0x5b0b, 0x5b0c, 0x5b0d, 0x5b0e, 0x5b0f, 0x5b10, 0x5b11, 0x5b12, 0x5b13, 0x5b14, 0x5b15, 0x5b18, 0x5b19, 0x5b1a, 0x5b1b, 0x5b1c, 0x5b1d, 0x5b1e, 0x5b1f, 0x5b20, 0x5b21, 0x5b22, 0x5b23, 0x5b24, 0x5b25, 0x5b26, 0x5b27, 0x5b28, 0x5b29, 0x5b2a, 0x5b2b, 0x5b2c, 0x5b2d, 0x5b2e, 0x5b2f, 0x5b30, 0x5b31, 0x5b33, 0x5b35, 0x5b36, 0x5b38, 0x5b39, 0x5b3a, 0x5b3b, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, 0x5b41, 0x5b42, 0x5b43, 0x5b44, 0x5b45, 0x5b46, 0x5b47, /* 0x8c */ 0x5b48, 0x5b49, 0x5b4a, 0x5b4b, 0x5b4c, 0x5b4d, 0x5b4e, 0x5b4f, 0x5b52, 0x5b56, 0x5b5e, 0x5b60, 0x5b61, 0x5b67, 0x5b68, 0x5b6b, 0x5b6d, 0x5b6e, 0x5b6f, 0x5b72, 0x5b74, 0x5b76, 0x5b77, 0x5b78, 0x5b79, 0x5b7b, 0x5b7c, 0x5b7e, 0x5b7f, 0x5b82, 0x5b86, 0x5b8a, 0x5b8d, 0x5b8e, 0x5b90, 0x5b91, 0x5b92, 0x5b94, 0x5b96, 0x5b9f, 0x5ba7, 0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5bae, 0x5baf, 0x5bb1, 0x5bb2, 0x5bb7, 0x5bba, 0x5bbb, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bc3, 0x5bc8, 0x5bc9, 0x5bca, 0x5bcb, 0x5bcd, 0x5bce, 0x5bcf, 0x5bd1, 0x5bd4, 0x5bd5, 0x5bd6, 0x5bd7, 0x5bd8, 0x5bd9, 0x5bda, 0x5bdb, 0x5bdc, 0x5be0, 0x5be2, 0x5be3, 0x5be6, 0x5be7, 0x5be9, 0x5bea, 0x5beb, 0x5bec, 0x5bed, 0x5bef, 0x5bf1, 0x5bf2, 0x5bf3, 0x5bf4, 0x5bf5, 0x5bf6, 0x5bf7, 0x5bfd, 0x5bfe, 0x5c00, 0x5c02, 0x5c03, 0x5c05, 0x5c07, 0x5c08, 0x5c0b, 0x5c0c, 0x5c0d, 0x5c0e, 0x5c10, 0x5c12, 0x5c13, 0x5c17, 0x5c19, 0x5c1b, 0x5c1e, 0x5c1f, 0x5c20, 0x5c21, 0x5c23, 0x5c26, 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2d, 0x5c2e, 0x5c2f, 0x5c30, 0x5c32, 0x5c33, 0x5c35, 0x5c36, 0x5c37, 0x5c43, 0x5c44, 0x5c46, 0x5c47, 0x5c4c, 0x5c4d, 0x5c52, 0x5c53, 0x5c54, 0x5c56, 0x5c57, 0x5c58, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d, 0x5c5f, 0x5c62, 0x5c64, 0x5c67, 0x5c68, 0x5c69, 0x5c6a, 0x5c6b, 0x5c6c, 0x5c6d, 0x5c70, 0x5c72, 0x5c73, 0x5c74, 0x5c75, 0x5c76, 0x5c77, 0x5c78, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c7e, 0x5c80, 0x5c83, 0x5c84, 0x5c85, 0x5c86, 0x5c87, 0x5c89, 0x5c8a, 0x5c8b, 0x5c8e, 0x5c8f, 0x5c92, 0x5c93, 0x5c95, 0x5c9d, 0x5c9e, 0x5c9f, 0x5ca0, 0x5ca1, 0x5ca4, 0x5ca5, 0x5ca6, 0x5ca7, 0x5ca8, /* 0x8d */ 0x5caa, 0x5cae, 0x5caf, 0x5cb0, 0x5cb2, 0x5cb4, 0x5cb6, 0x5cb9, 0x5cba, 0x5cbb, 0x5cbc, 0x5cbe, 0x5cc0, 0x5cc2, 0x5cc3, 0x5cc5, 0x5cc6, 0x5cc7, 0x5cc8, 0x5cc9, 0x5cca, 0x5ccc, 0x5ccd, 0x5cce, 0x5ccf, 0x5cd0, 0x5cd1, 0x5cd3, 0x5cd4, 0x5cd5, 0x5cd6, 0x5cd7, 0x5cd8, 0x5cda, 0x5cdb, 0x5cdc, 0x5cdd, 0x5cde, 0x5cdf, 0x5ce0, 0x5ce2, 0x5ce3, 0x5ce7, 0x5ce9, 0x5ceb, 0x5cec, 0x5cee, 0x5cef, 0x5cf1, 0x5cf2, 0x5cf3, 0x5cf4, 0x5cf5, 0x5cf6, 0x5cf7, 0x5cf8, 0x5cf9, 0x5cfa, 0x5cfc, 0x5cfd, 0x5cfe, 0x5cff, 0x5d00, 0x5d01, 0x5d04, 0x5d05, 0x5d08, 0x5d09, 0x5d0a, 0x5d0b, 0x5d0c, 0x5d0d, 0x5d0f, 0x5d10, 0x5d11, 0x5d12, 0x5d13, 0x5d15, 0x5d17, 0x5d18, 0x5d19, 0x5d1a, 0x5d1c, 0x5d1d, 0x5d1f, 0x5d20, 0x5d21, 0x5d22, 0x5d23, 0x5d25, 0x5d28, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2f, 0x5d30, 0x5d31, 0x5d32, 0x5d33, 0x5d35, 0x5d36, 0x5d37, 0x5d38, 0x5d39, 0x5d3a, 0x5d3b, 0x5d3c, 0x5d3f, 0x5d40, 0x5d41, 0x5d42, 0x5d43, 0x5d44, 0x5d45, 0x5d46, 0x5d48, 0x5d49, 0x5d4d, 0x5d4e, 0x5d4f, 0x5d50, 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57, 0x5d59, 0x5d5a, 0x5d5c, 0x5d5e, 0x5d5f, 0x5d60, 0x5d61, 0x5d62, 0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67, 0x5d68, 0x5d6a, 0x5d6d, 0x5d6e, 0x5d70, 0x5d71, 0x5d72, 0x5d73, 0x5d75, 0x5d76, 0x5d77, 0x5d78, 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5d7f, 0x5d80, 0x5d81, 0x5d83, 0x5d84, 0x5d85, 0x5d86, 0x5d87, 0x5d88, 0x5d89, 0x5d8a, 0x5d8b, 0x5d8c, 0x5d8d, 0x5d8e, 0x5d8f, 0x5d90, 0x5d91, 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d96, 0x5d97, 0x5d98, 0x5d9a, 0x5d9b, 0x5d9c, 0x5d9e, 0x5d9f, 0x5da0, /* 0x8e */ 0x5da1, 0x5da2, 0x5da3, 0x5da4, 0x5da5, 0x5da6, 0x5da7, 0x5da8, 0x5da9, 0x5daa, 0x5dab, 0x5dac, 0x5dad, 0x5dae, 0x5daf, 0x5db0, 0x5db1, 0x5db2, 0x5db3, 0x5db4, 0x5db5, 0x5db6, 0x5db8, 0x5db9, 0x5dba, 0x5dbb, 0x5dbc, 0x5dbd, 0x5dbe, 0x5dbf, 0x5dc0, 0x5dc1, 0x5dc2, 0x5dc3, 0x5dc4, 0x5dc6, 0x5dc7, 0x5dc8, 0x5dc9, 0x5dca, 0x5dcb, 0x5dcc, 0x5dce, 0x5dcf, 0x5dd0, 0x5dd1, 0x5dd2, 0x5dd3, 0x5dd4, 0x5dd5, 0x5dd6, 0x5dd7, 0x5dd8, 0x5dd9, 0x5dda, 0x5ddc, 0x5ddf, 0x5de0, 0x5de3, 0x5de4, 0x5dea, 0x5dec, 0x5ded, 0x5df0, 0x5df5, 0x5df6, 0x5df8, 0x5df9, 0x5dfa, 0x5dfb, 0x5dfc, 0x5dff, 0x5e00, 0x5e04, 0x5e07, 0x5e09, 0x5e0a, 0x5e0b, 0x5e0d, 0x5e0e, 0x5e12, 0x5e13, 0x5e17, 0x5e1e, 0x5e1f, 0x5e20, 0x5e21, 0x5e22, 0x5e23, 0x5e24, 0x5e25, 0x5e28, 0x5e29, 0x5e2a, 0x5e2b, 0x5e2c, 0x5e2f, 0x5e30, 0x5e32, 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e39, 0x5e3a, 0x5e3e, 0x5e3f, 0x5e40, 0x5e41, 0x5e43, 0x5e46, 0x5e47, 0x5e48, 0x5e49, 0x5e4a, 0x5e4b, 0x5e4d, 0x5e4e, 0x5e4f, 0x5e50, 0x5e51, 0x5e52, 0x5e53, 0x5e56, 0x5e57, 0x5e58, 0x5e59, 0x5e5a, 0x5e5c, 0x5e5d, 0x5e5f, 0x5e60, 0x5e63, 0x5e64, 0x5e65, 0x5e66, 0x5e67, 0x5e68, 0x5e69, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e6f, 0x5e70, 0x5e71, 0x5e75, 0x5e77, 0x5e79, 0x5e7e, 0x5e81, 0x5e82, 0x5e83, 0x5e85, 0x5e88, 0x5e89, 0x5e8c, 0x5e8d, 0x5e8e, 0x5e92, 0x5e98, 0x5e9b, 0x5e9d, 0x5ea1, 0x5ea2, 0x5ea3, 0x5ea4, 0x5ea8, 0x5ea9, 0x5eaa, 0x5eab, 0x5eac, 0x5eae, 0x5eaf, 0x5eb0, 0x5eb1, 0x5eb2, 0x5eb4, 0x5eba, 0x5ebb, 0x5ebc, 0x5ebd, 0x5ebf, 0x5ec0, 0x5ec1, 0x5ec2, 0x5ec3, 0x5ec4, 0x5ec5, /* 0x8f */ 0x5ec6, 0x5ec7, 0x5ec8, 0x5ecb, 0x5ecc, 0x5ecd, 0x5ece, 0x5ecf, 0x5ed0, 0x5ed4, 0x5ed5, 0x5ed7, 0x5ed8, 0x5ed9, 0x5eda, 0x5edc, 0x5edd, 0x5ede, 0x5edf, 0x5ee0, 0x5ee1, 0x5ee2, 0x5ee3, 0x5ee4, 0x5ee5, 0x5ee6, 0x5ee7, 0x5ee9, 0x5eeb, 0x5eec, 0x5eed, 0x5eee, 0x5eef, 0x5ef0, 0x5ef1, 0x5ef2, 0x5ef3, 0x5ef5, 0x5ef8, 0x5ef9, 0x5efb, 0x5efc, 0x5efd, 0x5f05, 0x5f06, 0x5f07, 0x5f09, 0x5f0c, 0x5f0d, 0x5f0e, 0x5f10, 0x5f12, 0x5f14, 0x5f16, 0x5f19, 0x5f1a, 0x5f1c, 0x5f1d, 0x5f1e, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f28, 0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f32, 0x5f33, 0x5f34, 0x5f35, 0x5f36, 0x5f37, 0x5f38, 0x5f3b, 0x5f3d, 0x5f3e, 0x5f3f, 0x5f41, 0x5f42, 0x5f43, 0x5f44, 0x5f45, 0x5f46, 0x5f47, 0x5f48, 0x5f49, 0x5f4a, 0x5f4b, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f4f, 0x5f51, 0x5f54, 0x5f59, 0x5f5a, 0x5f5b, 0x5f5c, 0x5f5e, 0x5f5f, 0x5f60, 0x5f63, 0x5f65, 0x5f67, 0x5f68, 0x5f6b, 0x5f6e, 0x5f6f, 0x5f72, 0x5f74, 0x5f75, 0x5f76, 0x5f78, 0x5f7a, 0x5f7d, 0x5f7e, 0x5f7f, 0x5f83, 0x5f86, 0x5f8d, 0x5f8e, 0x5f8f, 0x5f91, 0x5f93, 0x5f94, 0x5f96, 0x5f9a, 0x5f9b, 0x5f9d, 0x5f9e, 0x5f9f, 0x5fa0, 0x5fa2, 0x5fa3, 0x5fa4, 0x5fa5, 0x5fa6, 0x5fa7, 0x5fa9, 0x5fab, 0x5fac, 0x5faf, 0x5fb0, 0x5fb1, 0x5fb2, 0x5fb3, 0x5fb4, 0x5fb6, 0x5fb8, 0x5fb9, 0x5fba, 0x5fbb, 0x5fbe, 0x5fbf, 0x5fc0, 0x5fc1, 0x5fc2, 0x5fc7, 0x5fc8, 0x5fca, 0x5fcb, 0x5fce, 0x5fd3, 0x5fd4, 0x5fd5, 0x5fda, 0x5fdb, 0x5fdc, 0x5fde, 0x5fdf, 0x5fe2, 0x5fe3, 0x5fe5, 0x5fe6, 0x5fe8, 0x5fe9, 0x5fec, 0x5fef, 0x5ff0, 0x5ff2, 0x5ff3, 0x5ff4, 0x5ff6, 0x5ff7, 0x5ff9, 0x5ffa, 0x5ffc, 0x6007, /* 0x90 */ 0x6008, 0x6009, 0x600b, 0x600c, 0x6010, 0x6011, 0x6013, 0x6017, 0x6018, 0x601a, 0x601e, 0x601f, 0x6022, 0x6023, 0x6024, 0x602c, 0x602d, 0x602e, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, 0x6037, 0x6038, 0x6039, 0x603a, 0x603d, 0x603e, 0x6040, 0x6044, 0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604a, 0x604c, 0x604e, 0x604f, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605b, 0x605c, 0x605e, 0x605f, 0x6060, 0x6061, 0x6065, 0x6066, 0x606e, 0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607e, 0x6080, 0x6081, 0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608a, 0x608b, 0x608e, 0x608f, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, 0x609c, 0x609e, 0x60a1, 0x60a2, 0x60a4, 0x60a5, 0x60a7, 0x60a9, 0x60aa, 0x60ae, 0x60b0, 0x60b3, 0x60b5, 0x60b6, 0x60b7, 0x60b9, 0x60ba, 0x60bd, 0x60be, 0x60bf, 0x60c0, 0x60c1, 0x60c2, 0x60c3, 0x60c4, 0x60c7, 0x60c8, 0x60c9, 0x60cc, 0x60cd, 0x60ce, 0x60cf, 0x60d0, 0x60d2, 0x60d3, 0x60d4, 0x60d6, 0x60d7, 0x60d9, 0x60db, 0x60de, 0x60e1, 0x60e2, 0x60e3, 0x60e4, 0x60e5, 0x60ea, 0x60f1, 0x60f2, 0x60f5, 0x60f7, 0x60f8, 0x60fb, 0x60fc, 0x60fd, 0x60fe, 0x60ff, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610a, 0x610b, 0x610c, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117, 0x6118, 0x6119, 0x611b, 0x611c, 0x611d, 0x611e, 0x6121, 0x6122, 0x6125, 0x6128, 0x6129, 0x612a, 0x612c, 0x612d, 0x612e, 0x612f, 0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137, 0x6138, 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, /* 0x91 */ 0x6147, 0x6149, 0x614b, 0x614d, 0x614f, 0x6150, 0x6152, 0x6153, 0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615a, 0x615b, 0x615c, 0x615e, 0x615f, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166, 0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f, 0x6171, 0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617a, 0x617b, 0x617c, 0x617d, 0x617e, 0x617f, 0x6180, 0x6181, 0x6182, 0x6183, 0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618a, 0x618c, 0x618d, 0x618f, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0x6196, 0x6197, 0x6198, 0x6199, 0x619a, 0x619b, 0x619c, 0x619e, 0x619f, 0x61a0, 0x61a1, 0x61a2, 0x61a3, 0x61a4, 0x61a5, 0x61a6, 0x61aa, 0x61ab, 0x61ad, 0x61ae, 0x61af, 0x61b0, 0x61b1, 0x61b2, 0x61b3, 0x61b4, 0x61b5, 0x61b6, 0x61b8, 0x61b9, 0x61ba, 0x61bb, 0x61bc, 0x61bd, 0x61bf, 0x61c0, 0x61c1, 0x61c3, 0x61c4, 0x61c5, 0x61c6, 0x61c7, 0x61c9, 0x61cc, 0x61cd, 0x61ce, 0x61cf, 0x61d0, 0x61d3, 0x61d5, 0x61d6, 0x61d7, 0x61d8, 0x61d9, 0x61da, 0x61db, 0x61dc, 0x61dd, 0x61de, 0x61df, 0x61e0, 0x61e1, 0x61e2, 0x61e3, 0x61e4, 0x61e5, 0x61e7, 0x61e8, 0x61e9, 0x61ea, 0x61eb, 0x61ec, 0x61ed, 0x61ee, 0x61ef, 0x61f0, 0x61f1, 0x61f2, 0x61f3, 0x61f4, 0x61f6, 0x61f7, 0x61f8, 0x61f9, 0x61fa, 0x61fb, 0x61fc, 0x61fd, 0x61fe, 0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209, 0x6213, 0x6214, 0x6219, 0x621c, 0x621d, 0x621e, 0x6220, 0x6223, 0x6226, 0x6227, 0x6228, 0x6229, 0x622b, 0x622d, 0x622f, 0x6230, 0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623a, 0x623b, 0x623c, 0x6242, 0x6244, 0x6245, 0x6246, 0x624a, /* 0x92 */ 0x624f, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625a, 0x625c, 0x625d, 0x625e, 0x625f, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627a, 0x627b, 0x627d, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628b, 0x628c, 0x628d, 0x628e, 0x628f, 0x6290, 0x6294, 0x6299, 0x629c, 0x629d, 0x629e, 0x62a3, 0x62a6, 0x62a7, 0x62a9, 0x62aa, 0x62ad, 0x62ae, 0x62af, 0x62b0, 0x62b2, 0x62b3, 0x62b4, 0x62b6, 0x62b7, 0x62b8, 0x62ba, 0x62be, 0x62c0, 0x62c1, 0x62c3, 0x62cb, 0x62cf, 0x62d1, 0x62d5, 0x62dd, 0x62de, 0x62e0, 0x62e1, 0x62e4, 0x62ea, 0x62eb, 0x62f0, 0x62f2, 0x62f5, 0x62f8, 0x62f9, 0x62fa, 0x62fb, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630a, 0x630b, 0x630c, 0x630d, 0x630f, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318, 0x6319, 0x631c, 0x6326, 0x6327, 0x6329, 0x632c, 0x632d, 0x632e, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338, 0x633b, 0x633c, 0x633e, 0x633f, 0x6340, 0x6341, 0x6344, 0x6347, 0x6348, 0x634a, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x635c, 0x635d, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636a, 0x636b, 0x636c, 0x636f, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378, 0x6379, 0x637c, 0x637d, 0x637e, 0x637f, 0x6381, 0x6383, 0x6384, 0x6385, 0x6386, 0x638b, 0x638d, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397, 0x6399, 0x639a, 0x639b, 0x639c, 0x639d, 0x639e, 0x639f, 0x63a1, 0x63a4, 0x63a6, 0x63ab, 0x63af, 0x63b1, 0x63b2, 0x63b5, 0x63b6, 0x63b9, 0x63bb, 0x63bd, 0x63bf, 0x63c0, /* 0x93 */ 0x63c1, 0x63c2, 0x63c3, 0x63c5, 0x63c7, 0x63c8, 0x63ca, 0x63cb, 0x63cc, 0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63d7, 0x63d8, 0x63d9, 0x63da, 0x63db, 0x63dc, 0x63dd, 0x63df, 0x63e2, 0x63e4, 0x63e5, 0x63e6, 0x63e7, 0x63e8, 0x63eb, 0x63ec, 0x63ee, 0x63ef, 0x63f0, 0x63f1, 0x63f3, 0x63f5, 0x63f7, 0x63f9, 0x63fa, 0x63fb, 0x63fc, 0x63fe, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640a, 0x640d, 0x640e, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418, 0x6419, 0x641a, 0x641d, 0x641f, 0x6422, 0x6423, 0x6424, 0x6425, 0x6427, 0x6428, 0x6429, 0x642b, 0x642e, 0x642f, 0x6430, 0x6431, 0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643b, 0x643c, 0x643e, 0x6440, 0x6442, 0x6443, 0x6449, 0x644b, 0x644c, 0x644d, 0x644e, 0x644f, 0x6450, 0x6451, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d, 0x645f, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, 0x646a, 0x646b, 0x646c, 0x646e, 0x646f, 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475, 0x6476, 0x6477, 0x647b, 0x647c, 0x647d, 0x647e, 0x647f, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, 0x648a, 0x648b, 0x648c, 0x648d, 0x648e, 0x648f, 0x6490, 0x6493, 0x6494, 0x6497, 0x6498, 0x649a, 0x649b, 0x649c, 0x649d, 0x649f, 0x64a0, 0x64a1, 0x64a2, 0x64a3, 0x64a5, 0x64a6, 0x64a7, 0x64a8, 0x64aa, 0x64ab, 0x64af, 0x64b1, 0x64b2, 0x64b3, 0x64b4, 0x64b6, 0x64b9, 0x64bb, 0x64bd, 0x64be, 0x64bf, 0x64c1, 0x64c3, 0x64c4, 0x64c6, 0x64c7, 0x64c8, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64cf, 0x64d1, 0x64d3, 0x64d4, 0x64d5, 0x64d6, 0x64d9, 0x64da, /* 0x94 */ 0x64db, 0x64dc, 0x64dd, 0x64df, 0x64e0, 0x64e1, 0x64e3, 0x64e5, 0x64e7, 0x64e8, 0x64e9, 0x64ea, 0x64eb, 0x64ec, 0x64ed, 0x64ee, 0x64ef, 0x64f0, 0x64f1, 0x64f2, 0x64f3, 0x64f4, 0x64f5, 0x64f6, 0x64f7, 0x64f8, 0x64f9, 0x64fa, 0x64fb, 0x64fc, 0x64fd, 0x64fe, 0x64ff, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507, 0x6508, 0x650a, 0x650b, 0x650c, 0x650d, 0x650e, 0x650f, 0x6510, 0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651a, 0x651b, 0x651c, 0x651d, 0x651e, 0x651f, 0x6520, 0x6521, 0x6522, 0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652a, 0x652c, 0x652d, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653a, 0x653c, 0x653d, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, 0x6547, 0x654a, 0x654b, 0x654d, 0x654e, 0x6550, 0x6552, 0x6553, 0x6554, 0x6557, 0x6558, 0x655a, 0x655c, 0x655f, 0x6560, 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656a, 0x656d, 0x656e, 0x656f, 0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657a, 0x657b, 0x657c, 0x657d, 0x657e, 0x657f, 0x6580, 0x6581, 0x6582, 0x6583, 0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658a, 0x658d, 0x658e, 0x658f, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659a, 0x659d, 0x659e, 0x65a0, 0x65a2, 0x65a3, 0x65a6, 0x65a8, 0x65aa, 0x65ac, 0x65ae, 0x65b1, 0x65b2, 0x65b3, 0x65b4, 0x65b5, 0x65b6, 0x65b7, 0x65b8, 0x65ba, 0x65bb, 0x65be, 0x65bf, 0x65c0, 0x65c2, 0x65c7, 0x65c8, 0x65c9, 0x65ca, 0x65cd, 0x65d0, 0x65d1, 0x65d3, 0x65d4, 0x65d5, 0x65d8, 0x65d9, 0x65da, 0x65db, 0x65dc, 0x65dd, 0x65de, 0x65df, 0x65e1, 0x65e3, 0x65e4, 0x65ea, 0x65eb, /* 0x95 */ 0x65f2, 0x65f3, 0x65f4, 0x65f5, 0x65f8, 0x65f9, 0x65fb, 0x65fc, 0x65fd, 0x65fe, 0x65ff, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608, 0x6609, 0x660b, 0x660d, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617, 0x6618, 0x661a, 0x661b, 0x661c, 0x661e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662a, 0x662b, 0x662c, 0x662e, 0x6630, 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663a, 0x663b, 0x663d, 0x663f, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, 0x6649, 0x664a, 0x664d, 0x664e, 0x6650, 0x6651, 0x6658, 0x6659, 0x665b, 0x665c, 0x665d, 0x665e, 0x6660, 0x6662, 0x6663, 0x6665, 0x6667, 0x6669, 0x666a, 0x666b, 0x666c, 0x666d, 0x6671, 0x6672, 0x6673, 0x6675, 0x6678, 0x6679, 0x667b, 0x667c, 0x667d, 0x667f, 0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668a, 0x668b, 0x668d, 0x668e, 0x668f, 0x6690, 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699, 0x669a, 0x669b, 0x669c, 0x669e, 0x669f, 0x66a0, 0x66a1, 0x66a2, 0x66a3, 0x66a4, 0x66a5, 0x66a6, 0x66a9, 0x66aa, 0x66ab, 0x66ac, 0x66ad, 0x66af, 0x66b0, 0x66b1, 0x66b2, 0x66b3, 0x66b5, 0x66b6, 0x66b7, 0x66b8, 0x66ba, 0x66bb, 0x66bc, 0x66bd, 0x66bf, 0x66c0, 0x66c1, 0x66c2, 0x66c3, 0x66c4, 0x66c5, 0x66c6, 0x66c7, 0x66c8, 0x66c9, 0x66ca, 0x66cb, 0x66cc, 0x66cd, 0x66ce, 0x66cf, 0x66d0, 0x66d1, 0x66d2, 0x66d3, 0x66d4, 0x66d5, 0x66d6, 0x66d7, 0x66d8, 0x66da, 0x66de, 0x66df, 0x66e0, 0x66e1, 0x66e2, 0x66e3, 0x66e4, 0x66e5, 0x66e7, 0x66e8, 0x66ea, 0x66eb, 0x66ec, 0x66ed, 0x66ee, 0x66ef, 0x66f1, 0x66f5, 0x66f6, 0x66f8, 0x66fa, 0x66fb, 0x66fd, 0x6701, 0x6702, 0x6703, /* 0x96 */ 0x6704, 0x6705, 0x6706, 0x6707, 0x670c, 0x670e, 0x670f, 0x6711, 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671a, 0x671c, 0x671e, 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729, 0x672e, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673b, 0x673c, 0x673e, 0x673f, 0x6741, 0x6744, 0x6745, 0x6747, 0x674a, 0x674b, 0x674d, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759, 0x675a, 0x675b, 0x675d, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767, 0x676b, 0x676c, 0x676e, 0x6771, 0x6774, 0x6776, 0x6778, 0x6779, 0x677a, 0x677b, 0x677d, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788, 0x678a, 0x678c, 0x678d, 0x678e, 0x678f, 0x6791, 0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679b, 0x679f, 0x67a0, 0x67a1, 0x67a4, 0x67a6, 0x67a9, 0x67ac, 0x67ae, 0x67b1, 0x67b2, 0x67b4, 0x67b9, 0x67ba, 0x67bb, 0x67bc, 0x67bd, 0x67be, 0x67bf, 0x67c0, 0x67c2, 0x67c5, 0x67c6, 0x67c7, 0x67c8, 0x67c9, 0x67ca, 0x67cb, 0x67cc, 0x67cd, 0x67ce, 0x67d5, 0x67d6, 0x67d7, 0x67db, 0x67df, 0x67e1, 0x67e3, 0x67e4, 0x67e6, 0x67e7, 0x67e8, 0x67ea, 0x67eb, 0x67ed, 0x67ee, 0x67f2, 0x67f5, 0x67f6, 0x67f7, 0x67f8, 0x67f9, 0x67fa, 0x67fb, 0x67fc, 0x67fe, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806, 0x680d, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681a, 0x681b, 0x681c, 0x681e, 0x681f, 0x6820, 0x6822, 0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682b, 0x682c, 0x682d, 0x682e, 0x682f, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683a, 0x683b, 0x683f, 0x6847, 0x684b, 0x684d, 0x684f, 0x6852, 0x6856, 0x6857, 0x6858, 0x6859, 0x685a, 0x685b, /* 0x97 */ 0x685c, 0x685d, 0x685e, 0x685f, 0x686a, 0x686c, 0x686d, 0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879, 0x687a, 0x687b, 0x687c, 0x687d, 0x687e, 0x687f, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889, 0x688a, 0x688b, 0x688c, 0x688d, 0x688e, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898, 0x6899, 0x689a, 0x689b, 0x689c, 0x689d, 0x689e, 0x689f, 0x68a0, 0x68a1, 0x68a3, 0x68a4, 0x68a5, 0x68a9, 0x68aa, 0x68ab, 0x68ac, 0x68ae, 0x68b1, 0x68b2, 0x68b4, 0x68b6, 0x68b7, 0x68b8, 0x68b9, 0x68ba, 0x68bb, 0x68bc, 0x68bd, 0x68be, 0x68bf, 0x68c1, 0x68c3, 0x68c4, 0x68c5, 0x68c6, 0x68c7, 0x68c8, 0x68ca, 0x68cc, 0x68ce, 0x68cf, 0x68d0, 0x68d1, 0x68d3, 0x68d4, 0x68d6, 0x68d7, 0x68d9, 0x68db, 0x68dc, 0x68dd, 0x68de, 0x68df, 0x68e1, 0x68e2, 0x68e4, 0x68e5, 0x68e6, 0x68e7, 0x68e8, 0x68e9, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68ef, 0x68f2, 0x68f3, 0x68f4, 0x68f6, 0x68f7, 0x68f8, 0x68fb, 0x68fd, 0x68fe, 0x68ff, 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908, 0x6909, 0x690a, 0x690c, 0x690f, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, 0x691a, 0x691b, 0x691c, 0x691d, 0x691e, 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929, 0x692a, 0x692b, 0x692c, 0x692e, 0x692f, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, 0x6938, 0x693a, 0x693b, 0x693c, 0x693e, 0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694a, 0x694b, 0x694c, 0x694d, 0x694e, 0x694f, 0x6950, 0x6951, 0x6952, 0x6953, 0x6955, 0x6956, 0x6958, 0x6959, 0x695b, 0x695c, 0x695f, /* 0x98 */ 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696a, 0x696c, 0x696d, 0x696f, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x697a, 0x697b, 0x697d, 0x697e, 0x697f, 0x6981, 0x6983, 0x6985, 0x698a, 0x698b, 0x698c, 0x698e, 0x698f, 0x6990, 0x6991, 0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699a, 0x699d, 0x699e, 0x699f, 0x69a0, 0x69a1, 0x69a2, 0x69a3, 0x69a4, 0x69a5, 0x69a6, 0x69a9, 0x69aa, 0x69ac, 0x69ae, 0x69af, 0x69b0, 0x69b2, 0x69b3, 0x69b5, 0x69b6, 0x69b8, 0x69b9, 0x69ba, 0x69bc, 0x69bd, 0x69be, 0x69bf, 0x69c0, 0x69c2, 0x69c3, 0x69c4, 0x69c5, 0x69c6, 0x69c7, 0x69c8, 0x69c9, 0x69cb, 0x69cd, 0x69cf, 0x69d1, 0x69d2, 0x69d3, 0x69d5, 0x69d6, 0x69d7, 0x69d8, 0x69d9, 0x69da, 0x69dc, 0x69dd, 0x69de, 0x69e1, 0x69e2, 0x69e3, 0x69e4, 0x69e5, 0x69e6, 0x69e7, 0x69e8, 0x69e9, 0x69ea, 0x69eb, 0x69ec, 0x69ee, 0x69ef, 0x69f0, 0x69f1, 0x69f3, 0x69f4, 0x69f5, 0x69f6, 0x69f7, 0x69f8, 0x69f9, 0x69fa, 0x69fb, 0x69fc, 0x69fe, 0x6a00, 0x6a01, 0x6a02, 0x6a03, 0x6a04, 0x6a05, 0x6a06, 0x6a07, 0x6a08, 0x6a09, 0x6a0b, 0x6a0c, 0x6a0d, 0x6a0e, 0x6a0f, 0x6a10, 0x6a11, 0x6a12, 0x6a13, 0x6a14, 0x6a15, 0x6a16, 0x6a19, 0x6a1a, 0x6a1b, 0x6a1c, 0x6a1d, 0x6a1e, 0x6a20, 0x6a22, 0x6a23, 0x6a24, 0x6a25, 0x6a26, 0x6a27, 0x6a29, 0x6a2b, 0x6a2c, 0x6a2d, 0x6a2e, 0x6a30, 0x6a32, 0x6a33, 0x6a34, 0x6a36, 0x6a37, 0x6a38, 0x6a39, 0x6a3a, 0x6a3b, 0x6a3c, 0x6a3f, 0x6a40, 0x6a41, 0x6a42, 0x6a43, 0x6a45, 0x6a46, 0x6a48, 0x6a49, 0x6a4a, 0x6a4b, 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, 0x6a51, 0x6a52, 0x6a53, 0x6a54, 0x6a55, 0x6a56, 0x6a57, 0x6a5a, /* 0x99 */ 0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, 0x6a60, 0x6a62, 0x6a63, 0x6a64, 0x6a66, 0x6a67, 0x6a68, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x6a70, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a76, 0x6a77, 0x6a78, 0x6a7a, 0x6a7b, 0x6a7d, 0x6a7e, 0x6a7f, 0x6a81, 0x6a82, 0x6a83, 0x6a85, 0x6a86, 0x6a87, 0x6a88, 0x6a89, 0x6a8a, 0x6a8b, 0x6a8c, 0x6a8d, 0x6a8f, 0x6a92, 0x6a93, 0x6a94, 0x6a95, 0x6a96, 0x6a98, 0x6a99, 0x6a9a, 0x6a9b, 0x6a9c, 0x6a9d, 0x6a9e, 0x6a9f, 0x6aa1, 0x6aa2, 0x6aa3, 0x6aa4, 0x6aa5, 0x6aa6, 0x6aa7, 0x6aa8, 0x6aaa, 0x6aad, 0x6aae, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab2, 0x6ab3, 0x6ab4, 0x6ab5, 0x6ab6, 0x6ab7, 0x6ab8, 0x6ab9, 0x6aba, 0x6abb, 0x6abc, 0x6abd, 0x6abe, 0x6abf, 0x6ac0, 0x6ac1, 0x6ac2, 0x6ac3, 0x6ac4, 0x6ac5, 0x6ac6, 0x6ac7, 0x6ac8, 0x6ac9, 0x6aca, 0x6acb, 0x6acc, 0x6acd, 0x6ace, 0x6acf, 0x6ad0, 0x6ad1, 0x6ad2, 0x6ad3, 0x6ad4, 0x6ad5, 0x6ad6, 0x6ad7, 0x6ad8, 0x6ad9, 0x6ada, 0x6adb, 0x6adc, 0x6add, 0x6ade, 0x6adf, 0x6ae0, 0x6ae1, 0x6ae2, 0x6ae3, 0x6ae4, 0x6ae5, 0x6ae6, 0x6ae7, 0x6ae8, 0x6ae9, 0x6aea, 0x6aeb, 0x6aec, 0x6aed, 0x6aee, 0x6aef, 0x6af0, 0x6af1, 0x6af2, 0x6af3, 0x6af4, 0x6af5, 0x6af6, 0x6af7, 0x6af8, 0x6af9, 0x6afa, 0x6afb, 0x6afc, 0x6afd, 0x6afe, 0x6aff, 0x6b00, 0x6b01, 0x6b02, 0x6b03, 0x6b04, 0x6b05, 0x6b06, 0x6b07, 0x6b08, 0x6b09, 0x6b0a, 0x6b0b, 0x6b0c, 0x6b0d, 0x6b0e, 0x6b0f, 0x6b10, 0x6b11, 0x6b12, 0x6b13, 0x6b14, 0x6b15, 0x6b16, 0x6b17, 0x6b18, 0x6b19, 0x6b1a, 0x6b1b, 0x6b1c, 0x6b1d, 0x6b1e, 0x6b1f, 0x6b25, 0x6b26, 0x6b28, 0x6b29, 0x6b2a, 0x6b2b, 0x6b2c, 0x6b2d, 0x6b2e, /* 0x9a */ 0x6b2f, 0x6b30, 0x6b31, 0x6b33, 0x6b34, 0x6b35, 0x6b36, 0x6b38, 0x6b3b, 0x6b3c, 0x6b3d, 0x6b3f, 0x6b40, 0x6b41, 0x6b42, 0x6b44, 0x6b45, 0x6b48, 0x6b4a, 0x6b4b, 0x6b4d, 0x6b4e, 0x6b4f, 0x6b50, 0x6b51, 0x6b52, 0x6b53, 0x6b54, 0x6b55, 0x6b56, 0x6b57, 0x6b58, 0x6b5a, 0x6b5b, 0x6b5c, 0x6b5d, 0x6b5e, 0x6b5f, 0x6b60, 0x6b61, 0x6b68, 0x6b69, 0x6b6b, 0x6b6c, 0x6b6d, 0x6b6e, 0x6b6f, 0x6b70, 0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b75, 0x6b76, 0x6b77, 0x6b78, 0x6b7a, 0x6b7d, 0x6b7e, 0x6b7f, 0x6b80, 0x6b85, 0x6b88, 0x6b8c, 0x6b8e, 0x6b8f, 0x6b90, 0x6b91, 0x6b94, 0x6b95, 0x6b97, 0x6b98, 0x6b99, 0x6b9c, 0x6b9d, 0x6b9e, 0x6b9f, 0x6ba0, 0x6ba2, 0x6ba3, 0x6ba4, 0x6ba5, 0x6ba6, 0x6ba7, 0x6ba8, 0x6ba9, 0x6bab, 0x6bac, 0x6bad, 0x6bae, 0x6baf, 0x6bb0, 0x6bb1, 0x6bb2, 0x6bb6, 0x6bb8, 0x6bb9, 0x6bba, 0x6bbb, 0x6bbc, 0x6bbd, 0x6bbe, 0x6bc0, 0x6bc3, 0x6bc4, 0x6bc6, 0x6bc7, 0x6bc8, 0x6bc9, 0x6bca, 0x6bcc, 0x6bce, 0x6bd0, 0x6bd1, 0x6bd8, 0x6bda, 0x6bdc, 0x6bdd, 0x6bde, 0x6bdf, 0x6be0, 0x6be2, 0x6be3, 0x6be4, 0x6be5, 0x6be6, 0x6be7, 0x6be8, 0x6be9, 0x6bec, 0x6bed, 0x6bee, 0x6bf0, 0x6bf1, 0x6bf2, 0x6bf4, 0x6bf6, 0x6bf7, 0x6bf8, 0x6bfa, 0x6bfb, 0x6bfc, 0x6bfe, 0x6bff, 0x6c00, 0x6c01, 0x6c02, 0x6c03, 0x6c04, 0x6c08, 0x6c09, 0x6c0a, 0x6c0b, 0x6c0c, 0x6c0e, 0x6c12, 0x6c17, 0x6c1c, 0x6c1d, 0x6c1e, 0x6c20, 0x6c23, 0x6c25, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c31, 0x6c33, 0x6c36, 0x6c37, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3e, 0x6c3f, 0x6c43, 0x6c44, 0x6c45, 0x6c48, 0x6c4b, 0x6c4c, 0x6c4d, 0x6c4e, 0x6c4f, 0x6c51, 0x6c52, 0x6c53, 0x6c56, 0x6c58, /* 0x9b */ 0x6c59, 0x6c5a, 0x6c62, 0x6c63, 0x6c65, 0x6c66, 0x6c67, 0x6c6b, 0x6c6c, 0x6c6d, 0x6c6e, 0x6c6f, 0x6c71, 0x6c73, 0x6c75, 0x6c77, 0x6c78, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7f, 0x6c80, 0x6c84, 0x6c87, 0x6c8a, 0x6c8b, 0x6c8d, 0x6c8e, 0x6c91, 0x6c92, 0x6c95, 0x6c96, 0x6c97, 0x6c98, 0x6c9a, 0x6c9c, 0x6c9d, 0x6c9e, 0x6ca0, 0x6ca2, 0x6ca8, 0x6cac, 0x6caf, 0x6cb0, 0x6cb4, 0x6cb5, 0x6cb6, 0x6cb7, 0x6cba, 0x6cc0, 0x6cc1, 0x6cc2, 0x6cc3, 0x6cc6, 0x6cc7, 0x6cc8, 0x6ccb, 0x6ccd, 0x6cce, 0x6ccf, 0x6cd1, 0x6cd2, 0x6cd8, 0x6cd9, 0x6cda, 0x6cdc, 0x6cdd, 0x6cdf, 0x6ce4, 0x6ce6, 0x6ce7, 0x6ce9, 0x6cec, 0x6ced, 0x6cf2, 0x6cf4, 0x6cf9, 0x6cff, 0x6d00, 0x6d02, 0x6d03, 0x6d05, 0x6d06, 0x6d08, 0x6d09, 0x6d0a, 0x6d0d, 0x6d0f, 0x6d10, 0x6d11, 0x6d13, 0x6d14, 0x6d15, 0x6d16, 0x6d18, 0x6d1c, 0x6d1d, 0x6d1f, 0x6d20, 0x6d21, 0x6d22, 0x6d23, 0x6d24, 0x6d26, 0x6d28, 0x6d29, 0x6d2c, 0x6d2d, 0x6d2f, 0x6d30, 0x6d34, 0x6d36, 0x6d37, 0x6d38, 0x6d3a, 0x6d3f, 0x6d40, 0x6d42, 0x6d44, 0x6d49, 0x6d4c, 0x6d50, 0x6d55, 0x6d56, 0x6d57, 0x6d58, 0x6d5b, 0x6d5d, 0x6d5f, 0x6d61, 0x6d62, 0x6d64, 0x6d65, 0x6d67, 0x6d68, 0x6d6b, 0x6d6c, 0x6d6d, 0x6d70, 0x6d71, 0x6d72, 0x6d73, 0x6d75, 0x6d76, 0x6d79, 0x6d7a, 0x6d7b, 0x6d7d, 0x6d7e, 0x6d7f, 0x6d80, 0x6d81, 0x6d83, 0x6d84, 0x6d86, 0x6d87, 0x6d8a, 0x6d8b, 0x6d8d, 0x6d8f, 0x6d90, 0x6d92, 0x6d96, 0x6d97, 0x6d98, 0x6d99, 0x6d9a, 0x6d9c, 0x6da2, 0x6da5, 0x6dac, 0x6dad, 0x6db0, 0x6db1, 0x6db3, 0x6db4, 0x6db6, 0x6db7, 0x6db9, 0x6dba, 0x6dbb, 0x6dbc, 0x6dbd, 0x6dbe, 0x6dc1, 0x6dc2, 0x6dc3, 0x6dc8, 0x6dc9, 0x6dca, /* 0x9c */ 0x6dcd, 0x6dce, 0x6dcf, 0x6dd0, 0x6dd2, 0x6dd3, 0x6dd4, 0x6dd5, 0x6dd7, 0x6dda, 0x6ddb, 0x6ddc, 0x6ddf, 0x6de2, 0x6de3, 0x6de5, 0x6de7, 0x6de8, 0x6de9, 0x6dea, 0x6ded, 0x6def, 0x6df0, 0x6df2, 0x6df4, 0x6df5, 0x6df6, 0x6df8, 0x6dfa, 0x6dfd, 0x6dfe, 0x6dff, 0x6e00, 0x6e01, 0x6e02, 0x6e03, 0x6e04, 0x6e06, 0x6e07, 0x6e08, 0x6e09, 0x6e0b, 0x6e0f, 0x6e12, 0x6e13, 0x6e15, 0x6e18, 0x6e19, 0x6e1b, 0x6e1c, 0x6e1e, 0x6e1f, 0x6e22, 0x6e26, 0x6e27, 0x6e28, 0x6e2a, 0x6e2c, 0x6e2e, 0x6e30, 0x6e31, 0x6e33, 0x6e35, 0x6e36, 0x6e37, 0x6e39, 0x6e3b, 0x6e3c, 0x6e3d, 0x6e3e, 0x6e3f, 0x6e40, 0x6e41, 0x6e42, 0x6e45, 0x6e46, 0x6e47, 0x6e48, 0x6e49, 0x6e4a, 0x6e4b, 0x6e4c, 0x6e4f, 0x6e50, 0x6e51, 0x6e52, 0x6e55, 0x6e57, 0x6e59, 0x6e5a, 0x6e5c, 0x6e5d, 0x6e5e, 0x6e60, 0x6e61, 0x6e62, 0x6e63, 0x6e64, 0x6e65, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6c, 0x6e6d, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e73, 0x6e74, 0x6e75, 0x6e76, 0x6e77, 0x6e78, 0x6e79, 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6e80, 0x6e81, 0x6e82, 0x6e84, 0x6e87, 0x6e88, 0x6e8a, 0x6e8b, 0x6e8c, 0x6e8d, 0x6e8e, 0x6e91, 0x6e92, 0x6e93, 0x6e94, 0x6e95, 0x6e96, 0x6e97, 0x6e99, 0x6e9a, 0x6e9b, 0x6e9d, 0x6e9e, 0x6ea0, 0x6ea1, 0x6ea3, 0x6ea4, 0x6ea6, 0x6ea8, 0x6ea9, 0x6eab, 0x6eac, 0x6ead, 0x6eae, 0x6eb0, 0x6eb3, 0x6eb5, 0x6eb8, 0x6eb9, 0x6ebc, 0x6ebe, 0x6ebf, 0x6ec0, 0x6ec3, 0x6ec4, 0x6ec5, 0x6ec6, 0x6ec8, 0x6ec9, 0x6eca, 0x6ecc, 0x6ecd, 0x6ece, 0x6ed0, 0x6ed2, 0x6ed6, 0x6ed8, 0x6ed9, 0x6edb, 0x6edc, 0x6edd, 0x6ee3, 0x6ee7, 0x6eea, 0x6eeb, 0x6eec, 0x6eed, 0x6eee, 0x6eef, /* 0x9d */ 0x6ef0, 0x6ef1, 0x6ef2, 0x6ef3, 0x6ef5, 0x6ef6, 0x6ef7, 0x6ef8, 0x6efa, 0x6efb, 0x6efc, 0x6efd, 0x6efe, 0x6eff, 0x6f00, 0x6f01, 0x6f03, 0x6f04, 0x6f05, 0x6f07, 0x6f08, 0x6f0a, 0x6f0b, 0x6f0c, 0x6f0d, 0x6f0e, 0x6f10, 0x6f11, 0x6f12, 0x6f16, 0x6f17, 0x6f18, 0x6f19, 0x6f1a, 0x6f1b, 0x6f1c, 0x6f1d, 0x6f1e, 0x6f1f, 0x6f21, 0x6f22, 0x6f23, 0x6f25, 0x6f26, 0x6f27, 0x6f28, 0x6f2c, 0x6f2e, 0x6f30, 0x6f32, 0x6f34, 0x6f35, 0x6f37, 0x6f38, 0x6f39, 0x6f3a, 0x6f3b, 0x6f3c, 0x6f3d, 0x6f3f, 0x6f40, 0x6f41, 0x6f42, 0x6f43, 0x6f44, 0x6f45, 0x6f48, 0x6f49, 0x6f4a, 0x6f4c, 0x6f4e, 0x6f4f, 0x6f50, 0x6f51, 0x6f52, 0x6f53, 0x6f54, 0x6f55, 0x6f56, 0x6f57, 0x6f59, 0x6f5a, 0x6f5b, 0x6f5d, 0x6f5f, 0x6f60, 0x6f61, 0x6f63, 0x6f64, 0x6f65, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x6f6f, 0x6f70, 0x6f71, 0x6f73, 0x6f75, 0x6f76, 0x6f77, 0x6f79, 0x6f7b, 0x6f7d, 0x6f7e, 0x6f7f, 0x6f80, 0x6f81, 0x6f82, 0x6f83, 0x6f85, 0x6f86, 0x6f87, 0x6f8a, 0x6f8b, 0x6f8f, 0x6f90, 0x6f91, 0x6f92, 0x6f93, 0x6f94, 0x6f95, 0x6f96, 0x6f97, 0x6f98, 0x6f99, 0x6f9a, 0x6f9b, 0x6f9d, 0x6f9e, 0x6f9f, 0x6fa0, 0x6fa2, 0x6fa3, 0x6fa4, 0x6fa5, 0x6fa6, 0x6fa8, 0x6fa9, 0x6faa, 0x6fab, 0x6fac, 0x6fad, 0x6fae, 0x6faf, 0x6fb0, 0x6fb1, 0x6fb2, 0x6fb4, 0x6fb5, 0x6fb7, 0x6fb8, 0x6fba, 0x6fbb, 0x6fbc, 0x6fbd, 0x6fbe, 0x6fbf, 0x6fc1, 0x6fc3, 0x6fc4, 0x6fc5, 0x6fc6, 0x6fc7, 0x6fc8, 0x6fca, 0x6fcb, 0x6fcc, 0x6fcd, 0x6fce, 0x6fcf, 0x6fd0, 0x6fd3, 0x6fd4, 0x6fd5, 0x6fd6, 0x6fd7, 0x6fd8, 0x6fd9, 0x6fda, 0x6fdb, 0x6fdc, 0x6fdd, 0x6fdf, 0x6fe2, 0x6fe3, 0x6fe4, 0x6fe5, /* 0x9e */ 0x6fe6, 0x6fe7, 0x6fe8, 0x6fe9, 0x6fea, 0x6feb, 0x6fec, 0x6fed, 0x6ff0, 0x6ff1, 0x6ff2, 0x6ff3, 0x6ff4, 0x6ff5, 0x6ff6, 0x6ff7, 0x6ff8, 0x6ff9, 0x6ffa, 0x6ffb, 0x6ffc, 0x6ffd, 0x6ffe, 0x6fff, 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007, 0x7008, 0x7009, 0x700a, 0x700b, 0x700c, 0x700d, 0x700e, 0x700f, 0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018, 0x7019, 0x701c, 0x701d, 0x701e, 0x701f, 0x7020, 0x7021, 0x7022, 0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702a, 0x702b, 0x702c, 0x702d, 0x702e, 0x702f, 0x7030, 0x7031, 0x7032, 0x7033, 0x7034, 0x7036, 0x7037, 0x7038, 0x703a, 0x703b, 0x703c, 0x703d, 0x703e, 0x703f, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704a, 0x704b, 0x704d, 0x704e, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057, 0x7058, 0x7059, 0x705a, 0x705b, 0x705c, 0x705d, 0x705f, 0x7060, 0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068, 0x7069, 0x706a, 0x706e, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077, 0x7079, 0x707a, 0x707b, 0x707d, 0x7081, 0x7082, 0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708b, 0x708c, 0x708d, 0x708f, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709a, 0x709b, 0x709e, 0x709f, 0x70a0, 0x70a1, 0x70a2, 0x70a3, 0x70a4, 0x70a5, 0x70a6, 0x70a7, 0x70a8, 0x70a9, 0x70aa, 0x70b0, 0x70b2, 0x70b4, 0x70b5, 0x70b6, 0x70ba, 0x70be, 0x70bf, 0x70c4, 0x70c5, 0x70c6, 0x70c7, 0x70c9, 0x70cb, 0x70cc, 0x70cd, 0x70ce, 0x70cf, 0x70d0, 0x70d1, 0x70d2, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d7, 0x70da, /* 0x9f */ 0x70dc, 0x70dd, 0x70de, 0x70e0, 0x70e1, 0x70e2, 0x70e3, 0x70e5, 0x70ea, 0x70ee, 0x70f0, 0x70f1, 0x70f2, 0x70f3, 0x70f4, 0x70f5, 0x70f6, 0x70f8, 0x70fa, 0x70fb, 0x70fc, 0x70fe, 0x70ff, 0x7100, 0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, 0x710b, 0x710c, 0x710d, 0x710e, 0x710f, 0x7111, 0x7112, 0x7114, 0x7117, 0x711b, 0x711c, 0x711d, 0x711e, 0x711f, 0x7120, 0x7121, 0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712a, 0x712b, 0x712c, 0x712d, 0x712e, 0x7132, 0x7133, 0x7134, 0x7135, 0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713c, 0x713d, 0x713e, 0x713f, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x7149, 0x714b, 0x714d, 0x714f, 0x7150, 0x7151, 0x7152, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x715a, 0x715b, 0x715d, 0x715f, 0x7160, 0x7161, 0x7162, 0x7163, 0x7165, 0x7169, 0x716a, 0x716b, 0x716c, 0x716d, 0x716f, 0x7170, 0x7171, 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717b, 0x717c, 0x717e, 0x717f, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187, 0x7188, 0x7189, 0x718b, 0x718c, 0x718d, 0x718e, 0x7190, 0x7191, 0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719a, 0x719b, 0x719c, 0x719d, 0x719e, 0x71a1, 0x71a2, 0x71a3, 0x71a4, 0x71a5, 0x71a6, 0x71a7, 0x71a9, 0x71aa, 0x71ab, 0x71ad, 0x71ae, 0x71af, 0x71b0, 0x71b1, 0x71b2, 0x71b4, 0x71b6, 0x71b7, 0x71b8, 0x71ba, 0x71bb, 0x71bc, 0x71bd, 0x71be, 0x71bf, 0x71c0, 0x71c1, 0x71c2, 0x71c4, 0x71c5, 0x71c6, 0x71c7, 0x71c8, 0x71c9, 0x71ca, 0x71cb, 0x71cc, 0x71cd, 0x71cf, 0x71d0, 0x71d1, 0x71d2, 0x71d3, /* 0xa0 */ 0x71d6, 0x71d7, 0x71d8, 0x71d9, 0x71da, 0x71db, 0x71dc, 0x71dd, 0x71de, 0x71df, 0x71e1, 0x71e2, 0x71e3, 0x71e4, 0x71e6, 0x71e8, 0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ed, 0x71ef, 0x71f0, 0x71f1, 0x71f2, 0x71f3, 0x71f4, 0x71f5, 0x71f6, 0x71f7, 0x71f8, 0x71fa, 0x71fb, 0x71fc, 0x71fd, 0x71fe, 0x71ff, 0x7200, 0x7201, 0x7202, 0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720a, 0x720b, 0x720c, 0x720d, 0x720e, 0x720f, 0x7210, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721a, 0x721b, 0x721c, 0x721e, 0x721f, 0x7220, 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229, 0x722b, 0x722d, 0x722e, 0x722f, 0x7232, 0x7233, 0x7234, 0x723a, 0x723c, 0x723e, 0x7240, 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724a, 0x724b, 0x724e, 0x724f, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, 0x7257, 0x7258, 0x725a, 0x725c, 0x725e, 0x7260, 0x7263, 0x7264, 0x7265, 0x7268, 0x726a, 0x726b, 0x726c, 0x726d, 0x7270, 0x7271, 0x7273, 0x7274, 0x7276, 0x7277, 0x7278, 0x727b, 0x727c, 0x727d, 0x7282, 0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728c, 0x728e, 0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, 0x7298, 0x7299, 0x729a, 0x729b, 0x729c, 0x729d, 0x729e, 0x72a0, 0x72a1, 0x72a2, 0x72a3, 0x72a4, 0x72a5, 0x72a6, 0x72a7, 0x72a8, 0x72a9, 0x72aa, 0x72ab, 0x72ae, 0x72b1, 0x72b2, 0x72b3, 0x72b5, 0x72ba, 0x72bb, 0x72bc, 0x72bd, 0x72be, 0x72bf, 0x72c0, 0x72c5, 0x72c6, 0x72c7, 0x72c9, 0x72ca, 0x72cb, 0x72cc, 0x72cf, 0x72d1, 0x72d3, 0x72d4, 0x72d5, 0x72d6, 0x72d8, 0x72da, 0x72db, }; static int gbkext1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x81 && c1 <= 0xa0)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) { unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; { if (i < 6080) wc = gbkext1_2uni_page81[i]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } fldigi-4.2.05/src/libtiniconv/encdec/gbkext_inv.h0000664000175000017500000044567114532252172016650 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK extensions */ static const unsigned short gbkext_inv_2charset[14313] = { 0xa840, 0xa841, 0xa842, 0xa95c, 0xa843, 0xa844, 0xa845, 0xa846, 0xa847, 0xa848, 0xa959, 0xa849, 0xa84a, 0xa84b, 0xa84c, 0xa84d, 0xa84e, 0xa84f, 0xa850, 0xa851, 0xa852, 0xa892, 0xa853, 0xa854, 0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b, 0xa85c, 0xa85d, 0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863, 0xa864, 0xa865, 0xa866, 0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b, 0xa86c, 0xa86d, 0xa86e, 0xa86f, 0xa870, 0xa871, 0xa872, 0xa873, 0xa874, 0xa875, 0xa876, 0xa877, 0xa878, 0xa879, 0xa87a, 0xa87b, 0xa87c, 0xa87d, 0xa87e, 0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887, 0xa888, 0xa889, 0xa88a, 0xa88b, 0xa88c, 0xa88d, 0xa88e, 0xa88f, 0xa890, 0xa891, 0xa965, 0xa996, 0xa893, 0xa894, 0xa895, 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946, 0xa947, 0xa948, 0xa961, 0xa962, 0xa966, 0xa967, 0xa960, 0xa963, 0xa964, 0xa95a, 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e, 0xa94f, 0xa950, 0xa951, 0xa952, 0xa953, 0xa954, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814a, 0x814b, 0x814c, 0x814d, 0x814e, 0x814f, 0x8150, 0x8151, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815a, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816a, 0x816b, 0x816c, 0x816d, 0x816e, 0x816f, 0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0x8176, 0x8177, 0x8178, 0x8179, 0x817a, 0x817b, 0x817c, 0x817d, 0x817e, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8188, 0x8189, 0x818a, 0x818b, 0x818c, 0x818d, 0x818e, 0x818f, 0x8190, 0x8191, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8198, 0x8199, 0x819a, 0x819b, 0x819c, 0x819d, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a3, 0x81a4, 0x81a5, 0x81a6, 0x81a7, 0x81a8, 0x81a9, 0x81aa, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b3, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81ba, 0x81bb, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2, 0x81c3, 0x81c4, 0x81c5, 0x81c6, 0x81c7, 0x81c8, 0x81c9, 0x81ca, 0x81cb, 0x81cc, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e3, 0x81e4, 0x81e5, 0x81e6, 0x81e7, 0x81e8, 0x81e9, 0x81ea, 0x81eb, 0x81ec, 0x81ed, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f3, 0x81f4, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fb, 0x81fc, 0x81fd, 0x81fe, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0x8248, 0x8249, 0x824a, 0x824b, 0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825a, 0x825b, 0x825c, 0x825d, 0x825e, 0x825f, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e, 0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827a, 0x827b, 0x827c, 0x827d, 0x827e, 0x8280, 0x8281, 0x8282, 0x8283, 0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828a, 0x828b, 0x828c, 0x828d, 0x828e, 0x828f, 0x8290, 0x8291, 0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829a, 0x829b, 0x829c, 0x829d, 0x829e, 0x829f, 0x82a0, 0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5, 0x82a6, 0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0x82ae, 0x82af, 0x82b0, 0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, 0x82c0, 0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd, 0x82ce, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5, 0x82d6, 0x82d7, 0x82d8, 0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed, 0x82ee, 0x82ef, 0x82f0, 0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x82f5, 0x82f6, 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb, 0x82fc, 0x82fd, 0x82fe, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835a, 0x835b, 0x835c, 0x835d, 0x835e, 0x835f, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836a, 0x836b, 0x836c, 0x836d, 0x836e, 0x836f, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, 0x837e, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, 0x838d, 0x838e, 0x838f, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398, 0x8399, 0x839a, 0x839b, 0x839c, 0x839d, 0x839e, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, 0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b0, 0x83b1, 0x83b2, 0x83b3, 0x83b4, 0x83b5, 0x83b6, 0x83b7, 0x83b8, 0x83b9, 0x83ba, 0x83bb, 0x83bc, 0x83bd, 0x83be, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3, 0x83c4, 0x83c5, 0x83c6, 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb, 0x83cc, 0x83cd, 0x83ce, 0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d4, 0x83d5, 0x83d6, 0x83d7, 0x83d8, 0x83d9, 0x83da, 0x83db, 0x83dc, 0x83dd, 0x83de, 0x83df, 0x83e0, 0x83e1, 0x83e2, 0x83e3, 0x83e4, 0x83e5, 0x83e6, 0x83e7, 0x83e8, 0x83e9, 0x83ea, 0x83eb, 0x83ec, 0x83ed, 0x83ee, 0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83f8, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446, 0x8447, 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845a, 0x845b, 0x845c, 0x845d, 0x845e, 0x845f, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846a, 0x846b, 0x846c, 0x846d, 0x846e, 0x846f, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474, 0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847a, 0x847b, 0x847c, 0x847d, 0x847e, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484, 0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x848a, 0x848b, 0x848c, 0x848d, 0x848e, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849a, 0x849b, 0x849c, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84af, 0x84b0, 0x84b1, 0x84b2, 0x84b3, 0x84b4, 0x84b5, 0x84b6, 0x84b7, 0x84b8, 0x84b9, 0x84ba, 0x84bb, 0x84bc, 0x84bd, 0x84be, 0x84bf, 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd, 0x84ce, 0x84cf, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84dd, 0x84de, 0x84df, 0x84e0, 0x84e1, 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0x84fe, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548, 0x8549, 0x854a, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855a, 0x855b, 0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857a, 0x857b, 0x857c, 0x857d, 0x857e, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x8587, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x858d, 0x858e, 0x858f, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859b, 0x859c, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a4, 0x85a5, 0x85a6, 0x85a7, 0x85a8, 0x85a9, 0x85aa, 0x85ab, 0x85ac, 0x85ad, 0x85ae, 0x85af, 0x85b0, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b7, 0x85b8, 0x85b9, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c1, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85c9, 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85cf, 0x85d0, 0x85d1, 0x85d2, 0x85d3, 0x85d4, 0x85d5, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dc, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85e9, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, 0x85f9, 0x85fa, 0x85fb, 0x85fc, 0x85fd, 0x85fe, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a, 0x864b, 0x864c, 0x864d, 0x864e, 0x864f, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865a, 0x865b, 0x865c, 0x865d, 0x865e, 0x865f, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, 0x866b, 0x866c, 0x866d, 0x866e, 0x866f, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679, 0x867a, 0x867b, 0x867c, 0x867d, 0x867e, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868a, 0x868b, 0x868c, 0x868d, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869c, 0x869d, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a3, 0x86a4, 0x86a5, 0x86a6, 0x86a7, 0x86a8, 0x86a9, 0x86aa, 0x86ab, 0x86ac, 0x86ad, 0x86ae, 0x86af, 0x86b0, 0x86b1, 0x86b2, 0x86b3, 0x86b4, 0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9, 0x86ba, 0x86bb, 0x86bc, 0x86bd, 0x86be, 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5, 0x86c6, 0x86c7, 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, 0x86cd, 0x86ce, 0x86cf, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4, 0x86d5, 0x86d6, 0x86d7, 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc, 0x86dd, 0x86de, 0x86df, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4, 0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86e9, 0x86ea, 0x86eb, 0x86ec, 0x86ed, 0x86ee, 0x86ef, 0x86f0, 0x86f1, 0x86f2, 0x86f3, 0x86f4, 0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0x86fa, 0x86fb, 0x86fc, 0x86fd, 0x86fe, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d, 0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876e, 0x876f, 0x8770, 0x8771, 0x8772, 0x8773, 0x8774, 0x8775, 0x8776, 0x8777, 0x8778, 0x8779, 0x877a, 0x877b, 0x877c, 0x877d, 0x877e, 0x8780, 0x8781, 0x8782, 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878a, 0x878b, 0x878c, 0x878d, 0x878e, 0x878f, 0x8790, 0x8791, 0x8792, 0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x879f, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x87a6, 0x87a7, 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, 0x87ae, 0x87af, 0x87b0, 0x87b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be, 0x87bf, 0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6, 0x87c7, 0x87c8, 0x87c9, 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d1, 0x87d2, 0x87d3, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc, 0x87dd, 0x87de, 0x87df, 0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e5, 0x87e6, 0x87e7, 0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec, 0x87ed, 0x87ee, 0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, 0x8846, 0x8847, 0x8848, 0x8849, 0x884a, 0x884b, 0x884c, 0x884d, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853, 0x8854, 0x8855, 0x8856, 0x8857, 0x8858, 0x8859, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, 0x8860, 0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, 0x8868, 0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f, 0x8870, 0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x887d, 0x887e, 0x8880, 0x8881, 0x8882, 0x8883, 0x8884, 0x8885, 0x8886, 0x8887, 0x8888, 0x8889, 0x888a, 0x888b, 0x888c, 0x888d, 0x888e, 0x888f, 0x8890, 0x8891, 0x8892, 0x8893, 0x8894, 0x8895, 0x8896, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b, 0x889c, 0x889d, 0x889e, 0x889f, 0x88a0, 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa, 0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, 0x88b0, 0x88b1, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bc, 0x88bd, 0x88be, 0x88bf, 0x88c0, 0x88c1, 0x88c2, 0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, 0x88c8, 0x88c9, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, 0x88d0, 0x88d1, 0x88d2, 0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0, 0x88e1, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0, 0x88f1, 0x88f2, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, 0x88f8, 0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x8940, 0x8941, 0x8942, 0x8943, 0x8944, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895a, 0x895b, 0x895c, 0x895d, 0x895e, 0x895f, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8966, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897b, 0x897c, 0x897d, 0x897e, 0x8980, 0x8981, 0x8982, 0x8983, 0x8984, 0x8985, 0x8986, 0x8987, 0x8988, 0x8989, 0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x89c5, 0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca, 0x89cb, 0x89cc, 0x89cd, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x89d2, 0x89d3, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd, 0x89de, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0x89e8, 0x89e9, 0x89ea, 0x89eb, 0x89ec, 0x89ed, 0x89ee, 0x89ef, 0x89f0, 0x89f1, 0x89f2, 0x89f3, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a48, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a80, 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a89, 0x8a8a, 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94, 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8afe, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b66, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f, 0x8ba0, 0x8ba1, 0x8ba2, 0x8ba3, 0x8ba4, 0x8ba5, 0x8ba6, 0x8ba7, 0x8ba8, 0x8ba9, 0x8baa, 0x8bab, 0x8bac, 0x8bad, 0x8bae, 0x8baf, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5, 0x8bb6, 0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, 0x8bbe, 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, 0x8bc6, 0x8bc7, 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc, 0x8bcd, 0x8bce, 0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, 0x8bd8, 0x8bd9, 0x8bda, 0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, 0x8bdf, 0x8be0, 0x8be1, 0x8be2, 0x8be3, 0x8be4, 0x8be5, 0x8be6, 0x8be7, 0x8be8, 0x8be9, 0x8bea, 0x8beb, 0x8bec, 0x8bed, 0x8bee, 0x8bef, 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6, 0x8bf7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe, 0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47, 0x8c48, 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c, 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c55, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5a, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, 0x8c60, 0x8c61, 0x8c62, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, 0x8c73, 0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c80, 0x8c81, 0x8c82, 0x8c83, 0x8c84, 0x8c85, 0x8c86, 0x8c87, 0x8c88, 0x8c89, 0x8c8a, 0x8c8b, 0x8c8c, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c94, 0x8c95, 0x8c96, 0x8c97, 0x8c98, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8d40, 0x8d41, 0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47, 0x8d48, 0x8d49, 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f, 0x8d50, 0x8d51, 0x8d52, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57, 0x8d58, 0x8d59, 0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f, 0x8d60, 0x8d61, 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67, 0x8d68, 0x8d69, 0x8d6a, 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f, 0x8d70, 0x8d71, 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, 0x8d77, 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d80, 0x8d81, 0x8d82, 0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8a, 0x8d8b, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d91, 0x8d92, 0x8d93, 0x8d94, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8d9f, 0x8da0, 0x8da1, 0x8da2, 0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db2, 0x8db3, 0x8db4, 0x8db5, 0x8db6, 0x8db7, 0x8db8, 0x8db9, 0x8dba, 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, 0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, 0x8dd0, 0x8dd1, 0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, 0x8dd8, 0x8dd9, 0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, 0x8de1, 0x8de2, 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, 0x8de8, 0x8de9, 0x8dea, 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, 0x8df0, 0x8df1, 0x8df2, 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, 0x8df8, 0x8df9, 0x8dfa, 0x8dfb, 0x8dfc, 0x8dfd, 0x8dfe, 0x8e40, 0x8e41, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46, 0x8e47, 0x8e48, 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0x8e6a, 0x8e6b, 0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73, 0x8e74, 0x8e75, 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7c, 0x8e7d, 0x8e7e, 0x8e80, 0x8e81, 0x8e82, 0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e8f, 0x8e90, 0x8e91, 0x8e92, 0x8e93, 0x8e94, 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9c, 0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8eab, 0x8eac, 0x8ead, 0x8eae, 0x8eaf, 0x8eb0, 0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, 0x8f45, 0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, 0x8f66, 0x8f67, 0x8f68, 0x8f69, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d, 0x8f6e, 0x8f6f, 0x8f70, 0x8f71, 0x8f72, 0x8f73, 0x8f74, 0x8f75, 0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d, 0x8f7e, 0x8f80, 0x8f81, 0x8f82, 0x8f83, 0x8f84, 0x8f85, 0x8f86, 0x8f87, 0x8f88, 0x8f89, 0x8f8a, 0x8f8b, 0x8f8c, 0x8f8d, 0x8f8e, 0x8f8f, 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96, 0x8f97, 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e, 0x8f9f, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x8fae, 0x8faf, 0x8fb0, 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb6, 0x8fb7, 0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe, 0x8fbf, 0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6, 0x8fc7, 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fce, 0x8fcf, 0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0x8fd6, 0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd, 0x8fde, 0x8fdf, 0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5, 0x8fe6, 0x8fe7, 0x8fe8, 0x8fe9, 0x8fea, 0x8feb, 0x8fec, 0x8fed, 0x8fee, 0x8fef, 0x8ff0, 0x8ff1, 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ff7, 0x8ff8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0x8ffe, 0x9040, 0x9041, 0x9042, 0x9043, 0x9044, 0x9045, 0x9046, 0x9047, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904d, 0x904e, 0x904f, 0x9050, 0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057, 0x9058, 0x9059, 0x905a, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060, 0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, 0x9068, 0x9069, 0x906a, 0x906b, 0x906c, 0x906d, 0x906e, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907d, 0x907e, 0x9080, 0x9081, 0x9082, 0x9083, 0x9084, 0x9085, 0x9086, 0x9087, 0x9088, 0x9089, 0x908a, 0x908b, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090, 0x9091, 0x9092, 0x9093, 0x9094, 0x9095, 0x9096, 0x9097, 0x9098, 0x9099, 0x909a, 0x909b, 0x909c, 0x909d, 0x909e, 0x909f, 0x90a0, 0x90a1, 0x90a2, 0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, 0x90a8, 0x90a9, 0x90aa, 0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, 0x90b0, 0x90b1, 0x90b2, 0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, 0x90b8, 0x90b9, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0x90bf, 0x90c0, 0x90c1, 0x90c2, 0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x90c7, 0x90c8, 0x90c9, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0x90ce, 0x90cf, 0x90d0, 0x90d1, 0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0x90d7, 0x90d8, 0x90d9, 0x90da, 0x90db, 0x90dc, 0x90dd, 0x90de, 0x90df, 0x90e0, 0x90e1, 0x90e2, 0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, 0x90e8, 0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0x90f8, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145, 0x9146, 0x9147, 0x9148, 0x9149, 0x914a, 0x914b, 0x914c, 0x914d, 0x914e, 0x914f, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159, 0x915a, 0x915b, 0x915c, 0x915d, 0x915e, 0x915f, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916a, 0x916b, 0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179, 0x917a, 0x917b, 0x917c, 0x917d, 0x917e, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0x9187, 0x9188, 0x9189, 0x918a, 0x918b, 0x918c, 0x918d, 0x918e, 0x918f, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919a, 0x919b, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a2, 0x91a3, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91aa, 0x91ab, 0x91ac, 0x91ad, 0x91ae, 0x91af, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba, 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca, 0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf, 0x91d0, 0x91d1, 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dc, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd, 0x91fe, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9274, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928e, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92ae, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92c9, 0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936a, 0x936b, 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, 0x938f, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d6, 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de, 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6, 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee, 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946a, 0x946b, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948a, 0x948b, 0x948c, 0x948d, 0x948e, 0x948f, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949a, 0x949b, 0x949c, 0x949d, 0x949e, 0x949f, 0x94a0, 0x94a1, 0x94a2, 0x94a3, 0x94a4, 0x94a5, 0x94a6, 0x94a7, 0x94a8, 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x94ae, 0x94af, 0x94b0, 0x94b1, 0x94b2, 0x94b3, 0x94b4, 0x94b5, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd, 0x94be, 0x94bf, 0x94c0, 0x94c1, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6, 0x94c7, 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94cf, 0x94d0, 0x94d1, 0x94d2, 0x94d3, 0x94d4, 0x94d5, 0x94d6, 0x94d7, 0x94d8, 0x94d9, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de, 0x94df, 0x94e0, 0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5, 0x94e6, 0x94e7, 0x94e8, 0x94e9, 0x94ea, 0x94eb, 0x94ec, 0x94ed, 0x94ee, 0x94ef, 0x94f0, 0x94f1, 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, 0x94f8, 0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd, 0x94fe, 0x9540, 0x9541, 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547, 0x9548, 0x9549, 0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f, 0x9550, 0x9551, 0x9552, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557, 0x9558, 0x9559, 0x955a, 0x955b, 0x955c, 0x955d, 0x955e, 0x955f, 0x9560, 0x9561, 0x9562, 0x9563, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956d, 0x956e, 0x956f, 0x9570, 0x9571, 0x9572, 0x9573, 0x9574, 0x9575, 0x9576, 0x9577, 0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca, 0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef, 0x95f0, 0x95f1, 0x95f2, 0x95f3, 0x95f4, 0x95f5, 0x95f6, 0x95f7, 0x95f8, 0x95f9, 0x95fa, 0x95fb, 0x95fc, 0x95fd, 0x95fe, 0x9640, 0x9641, 0x9642, 0x9643, 0x9644, 0x9645, 0x9646, 0x9647, 0x9648, 0x9649, 0x964a, 0x964b, 0x964c, 0x964d, 0x964e, 0x964f, 0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965b, 0x965c, 0x965d, 0x965e, 0x965f, 0x9660, 0x9661, 0x9662, 0x9663, 0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966a, 0x966b, 0x966c, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9672, 0x9673, 0x9674, 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9685, 0x9686, 0x9687, 0x9688, 0x9689, 0x968a, 0x968b, 0x968c, 0x968d, 0x968e, 0x968f, 0x9690, 0x9691, 0x9692, 0x9693, 0x9694, 0x9695, 0x9696, 0x9697, 0x9698, 0x9699, 0x969a, 0x969b, 0x969c, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4, 0x96b5, 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc, 0x96bd, 0x96be, 0x96bf, 0x96c0, 0x96c1, 0x96c2, 0x96c3, 0x96c4, 0x96c5, 0x96c6, 0x96c7, 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0x96cd, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0x96d2, 0x96d3, 0x96d4, 0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec, 0x96ed, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f2, 0x96f3, 0x96f4, 0x96f5, 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96fe, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, 0x9756, 0x9757, 0x9758, 0x9759, 0x975a, 0x975b, 0x975c, 0x975d, 0x975e, 0x975f, 0x9760, 0x9761, 0x9762, 0x9763, 0x9764, 0x9765, 0x9766, 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9773, 0x9774, 0x9775, 0x9776, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d, 0x977e, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, 0x9787, 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, 0x978d, 0x978e, 0x978f, 0x9790, 0x9791, 0x9792, 0x9793, 0x9794, 0x9795, 0x9796, 0x9797, 0x9798, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, 0x979e, 0x979f, 0x97a0, 0x97a1, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae, 0x97af, 0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e6, 0x97e7, 0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6, 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878, 0x9879, 0x987a, 0x987b, 0x987c, 0x987d, 0x987e, 0x9880, 0x9881, 0x9882, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888, 0x9889, 0x988a, 0x988b, 0x988c, 0x988d, 0x988e, 0x988f, 0x9890, 0x9891, 0x9892, 0x9893, 0x9894, 0x9895, 0x9896, 0x9897, 0x9898, 0x9899, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0, 0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, 0x98a8, 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, 0x98d0, 0x98d1, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, 0x98d8, 0x98d9, 0x98da, 0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0x98e8, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9963, 0x9964, 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979, 0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x9980, 0x9981, 0x9982, 0x9983, 0x9984, 0x9985, 0x9986, 0x9987, 0x9988, 0x9989, 0x998a, 0x998b, 0x998c, 0x998d, 0x998e, 0x998f, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, 0x9996, 0x9997, 0x9998, 0x9999, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5, 0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x9a40, 0x9a41, 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e, 0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75, 0x9a76, 0x9a77, 0x9a78, 0x9a79, 0x9a7a, 0x9a7b, 0x9a7c, 0x9a7d, 0x9a7e, 0x9a80, 0x9a81, 0x9a82, 0x9a83, 0x9a84, 0x9a85, 0x9a86, 0x9a87, 0x9a88, 0x9a89, 0x9a8a, 0x9a8b, 0x9a8c, 0x9a8d, 0x9a8e, 0x9a8f, 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94, 0x9a95, 0x9a96, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9e, 0x9a9f, 0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0x9aa7, 0x9aa8, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab0, 0x9ab1, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8, 0x9ab9, 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9abe, 0x9abf, 0x9ac0, 0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4, 0x9ac5, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acb, 0x9acc, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9adf, 0x9ae0, 0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae6, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0x9aef, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9, 0x9afa, 0x9afb, 0x9afc, 0x9afd, 0x9afe, 0x9b40, 0x9b41, 0x9b42, 0x9b43, 0x9b44, 0x9b45, 0x9b46, 0x9b47, 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4d, 0x9b4e, 0x9b4f, 0x9b50, 0x9b51, 0x9b52, 0x9b53, 0x9b54, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, 0x9b7c, 0x9b7d, 0x9b7e, 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, 0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe, 0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7c, 0x9c7d, 0x9c7e, 0x9c80, 0x9c81, 0x9c82, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x9c89, 0x9c8a, 0x9c8b, 0x9c8c, 0x9c8d, 0x9c8e, 0x9c8f, 0x9c90, 0x9c91, 0x9c92, 0x9c93, 0x9c94, 0x9c95, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9a, 0x9c9b, 0x9c9c, 0x9c9d, 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae, 0x9caf, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cb8, 0x9cb9, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cc8, 0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd1, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6, 0x9cd7, 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde, 0x9cdf, 0x9ce0, 0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9d40, 0x9d41, 0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d80, 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92, 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2, 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2, 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2, 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9e40, 0x9e41, 0x9e42, 0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, 0x9e50, 0x9e51, 0x9e52, 0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57, 0x9e58, 0x9e59, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e63, 0x9e64, 0x9e65, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e6d, 0x9e6e, 0x9e6f, 0x9e70, 0x9e71, 0x9e72, 0x9e73, 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e7e, 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e87, 0x9e88, 0x9e89, 0x9e8a, 0x9e8b, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e92, 0x9e93, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9d, 0x9e9e, 0x9e9f, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc, 0x9ebd, 0x9ebe, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc, 0x9ecd, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4, 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc, 0x9edd, 0x9ede, 0x9edf, 0x9ee0, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4, 0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9eef, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, 0x9efd, 0x9efe, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f50, 0x9f51, 0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f80, 0x9f81, 0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, 0x9f9e, 0x9f9f, 0x9fa0, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0x9fa6, 0x9fa7, 0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae, 0x9faf, 0x9fb0, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0x9fb6, 0x9fb7, 0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0x9fbe, 0x9fbf, 0x9fc0, 0x9fc1, 0x9fc2, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, 0x9fc7, 0x9fc8, 0x9fc9, 0x9fca, 0x9fcb, 0x9fcc, 0x9fcd, 0x9fce, 0x9fcf, 0x9fd0, 0x9fd1, 0x9fd2, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6, 0x9fd7, 0x9fd8, 0x9fd9, 0x9fda, 0x9fdb, 0x9fdc, 0x9fdd, 0x9fde, 0x9fdf, 0x9fe0, 0x9fe1, 0x9fe2, 0x9fe3, 0x9fe4, 0x9fe5, 0x9fe6, 0x9fe7, 0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec, 0x9fed, 0x9fee, 0x9fef, 0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3, 0x9ff4, 0x9ff5, 0x9ff6, 0x9ff7, 0x9ff8, 0x9ff9, 0x9ffa, 0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe, 0xa040, 0xa041, 0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047, 0xa048, 0xa049, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xa04e, 0xa04f, 0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xa055, 0xa056, 0xa057, 0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, 0xa05e, 0xa05f, 0xa060, 0xa061, 0xa062, 0xa063, 0xa064, 0xa065, 0xa066, 0xa067, 0xa068, 0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f, 0xa070, 0xa071, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa077, 0xa078, 0xa079, 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa07e, 0xa080, 0xa081, 0xa082, 0xa083, 0xa084, 0xa085, 0xa086, 0xa087, 0xa088, 0xa089, 0xa08a, 0xa08b, 0xa08c, 0xa08d, 0xa08e, 0xa08f, 0xa090, 0xa091, 0xa092, 0xa093, 0xa094, 0xa095, 0xa096, 0xa097, 0xa098, 0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d, 0xa09e, 0xa09f, 0xa0a0, 0xa0a1, 0xa0a2, 0xa0a3, 0xa0a4, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a8, 0xa0a9, 0xa0aa, 0xa0ab, 0xa0ac, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b0, 0xa0b1, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8, 0xa0b9, 0xa0ba, 0xa0bb, 0xa0bc, 0xa0bd, 0xa0be, 0xa0bf, 0xa0c0, 0xa0c1, 0xa0c2, 0xa0c3, 0xa0c4, 0xa0c5, 0xa0c6, 0xa0c7, 0xa0c8, 0xa0c9, 0xa0ca, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, 0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xa0d7, 0xa0d8, 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de, 0xa0df, 0xa0e0, 0xa0e1, 0xa0e2, 0xa0e3, 0xa0e4, 0xa0e5, 0xa0e6, 0xa0e7, 0xa0e8, 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ef, 0xa0f0, 0xa0f1, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8, 0xa0f9, 0xa0fa, 0xa0fb, 0xa0fc, 0xa0fd, 0xa0fe, 0xaa40, 0xaa41, 0xaa42, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, 0xaa48, 0xaa49, 0xaa4a, 0xaa4b, 0xaa4c, 0xaa4d, 0xaa4e, 0xaa4f, 0xaa50, 0xaa51, 0xaa52, 0xaa53, 0xaa54, 0xaa55, 0xaa56, 0xaa57, 0xaa58, 0xaa59, 0xaa5a, 0xaa5b, 0xaa5c, 0xaa5d, 0xaa5e, 0xaa5f, 0xaa60, 0xaa61, 0xaa62, 0xaa63, 0xaa64, 0xaa65, 0xaa66, 0xaa67, 0xaa68, 0xaa69, 0xaa6a, 0xaa6b, 0xaa6c, 0xaa6d, 0xaa6e, 0xaa6f, 0xaa70, 0xaa71, 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xaa76, 0xaa77, 0xaa78, 0xaa79, 0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d, 0xaa7e, 0xaa80, 0xaa81, 0xaa82, 0xaa83, 0xaa84, 0xaa85, 0xaa86, 0xaa87, 0xaa88, 0xaa89, 0xaa8a, 0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92, 0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99, 0xaa9a, 0xaa9b, 0xaa9c, 0xaa9d, 0xaa9e, 0xaa9f, 0xaaa0, 0xab40, 0xab41, 0xab42, 0xab43, 0xab44, 0xab45, 0xab46, 0xab47, 0xab48, 0xab49, 0xab4a, 0xab4b, 0xab4c, 0xab4d, 0xab4e, 0xab4f, 0xab50, 0xab51, 0xab52, 0xab53, 0xab54, 0xab55, 0xab56, 0xab57, 0xab58, 0xab59, 0xab5a, 0xab5b, 0xab5c, 0xab5d, 0xab5e, 0xab5f, 0xab60, 0xab61, 0xab62, 0xab63, 0xab64, 0xab65, 0xab66, 0xab67, 0xab68, 0xab69, 0xab6a, 0xab6b, 0xab6c, 0xab6d, 0xab6e, 0xab6f, 0xab70, 0xab71, 0xab72, 0xab73, 0xab74, 0xab75, 0xab76, 0xab77, 0xab78, 0xab79, 0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab7e, 0xab80, 0xab81, 0xab82, 0xab83, 0xab84, 0xab85, 0xab86, 0xab87, 0xab88, 0xab89, 0xab8a, 0xab8b, 0xab8c, 0xab8d, 0xab8e, 0xab8f, 0xab90, 0xab91, 0xab92, 0xab93, 0xab94, 0xab95, 0xab96, 0xab97, 0xab98, 0xab99, 0xab9a, 0xab9b, 0xab9c, 0xab9d, 0xab9e, 0xab9f, 0xaba0, 0xac40, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, 0xac48, 0xac49, 0xac4a, 0xac4b, 0xac4c, 0xac4d, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58, 0xac59, 0xac5a, 0xac5b, 0xac5c, 0xac5d, 0xac5e, 0xac5f, 0xac60, 0xac61, 0xac62, 0xac63, 0xac64, 0xac65, 0xac66, 0xac67, 0xac68, 0xac69, 0xac6a, 0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xac6f, 0xac70, 0xac71, 0xac72, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78, 0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac80, 0xac81, 0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xac87, 0xac88, 0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91, 0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xac97, 0xac98, 0xac99, 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xac9e, 0xac9f, 0xaca0, 0xad40, 0xad41, 0xad42, 0xad43, 0xad44, 0xad45, 0xad46, 0xad47, 0xad48, 0xad49, 0xad4a, 0xad4b, 0xad4c, 0xad4d, 0xad4e, 0xad4f, 0xad50, 0xad51, 0xad52, 0xad53, 0xad54, 0xad55, 0xad56, 0xad57, 0xad58, 0xad59, 0xad5a, 0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad61, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, 0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f, 0xad70, 0xad71, 0xad72, 0xad73, 0xad74, 0xad75, 0xad76, 0xad77, 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e, 0xad80, 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, 0xad88, 0xad89, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e, 0xad8f, 0xad90, 0xad91, 0xad92, 0xad93, 0xad94, 0xad95, 0xad96, 0xad97, 0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xad9e, 0xad9f, 0xada0, 0xae40, 0xae41, 0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48, 0xae49, 0xae4a, 0xae4b, 0xae4c, 0xae4d, 0xae4e, 0xae4f, 0xae50, 0xae51, 0xae52, 0xae53, 0xae54, 0xae55, 0xae56, 0xae57, 0xae58, 0xae59, 0xae5a, 0xae5b, 0xae5c, 0xae5d, 0xae5e, 0xae5f, 0xae60, 0xae61, 0xae62, 0xae63, 0xae64, 0xae65, 0xae66, 0xae67, 0xae68, 0xae69, 0xae6a, 0xae6b, 0xae6c, 0xae6d, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xae72, 0xae73, 0xae74, 0xae75, 0xae76, 0xae77, 0xae78, 0xae79, 0xae7a, 0xae7b, 0xae7c, 0xae7d, 0xae7e, 0xae80, 0xae81, 0xae82, 0xae83, 0xae84, 0xae85, 0xae86, 0xae87, 0xae88, 0xae89, 0xae8a, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, 0xae90, 0xae91, 0xae92, 0xae93, 0xae94, 0xae95, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xae9b, 0xae9c, 0xae9d, 0xae9e, 0xae9f, 0xaea0, 0xaf40, 0xaf41, 0xaf42, 0xaf43, 0xaf44, 0xaf45, 0xaf46, 0xaf47, 0xaf48, 0xaf49, 0xaf4a, 0xaf4b, 0xaf4c, 0xaf4d, 0xaf4e, 0xaf4f, 0xaf50, 0xaf51, 0xaf52, 0xaf53, 0xaf54, 0xaf55, 0xaf56, 0xaf57, 0xaf58, 0xaf59, 0xaf5a, 0xaf5b, 0xaf5c, 0xaf5d, 0xaf5e, 0xaf5f, 0xaf60, 0xaf61, 0xaf62, 0xaf63, 0xaf64, 0xaf65, 0xaf66, 0xaf67, 0xaf68, 0xaf69, 0xaf6a, 0xaf6b, 0xaf6c, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, 0xaf71, 0xaf72, 0xaf73, 0xaf74, 0xaf75, 0xaf76, 0xaf77, 0xaf78, 0xaf79, 0xaf7a, 0xaf7b, 0xaf7c, 0xaf7d, 0xaf7e, 0xaf80, 0xaf81, 0xaf82, 0xaf83, 0xaf84, 0xaf85, 0xaf86, 0xaf87, 0xaf88, 0xaf89, 0xaf8a, 0xaf8b, 0xaf8c, 0xaf8d, 0xaf8e, 0xaf8f, 0xaf90, 0xaf91, 0xaf92, 0xaf93, 0xaf94, 0xaf95, 0xaf96, 0xaf97, 0xaf98, 0xaf99, 0xaf9a, 0xaf9b, 0xaf9c, 0xaf9d, 0xaf9e, 0xaf9f, 0xafa0, 0xb040, 0xb041, 0xb042, 0xb043, 0xb044, 0xb045, 0xb046, 0xb047, 0xb048, 0xb049, 0xb04a, 0xb04b, 0xb04c, 0xb04d, 0xb04e, 0xb04f, 0xb050, 0xb051, 0xb052, 0xb053, 0xb054, 0xb055, 0xb056, 0xb057, 0xb058, 0xb059, 0xb05a, 0xb05b, 0xb05c, 0xb05d, 0xb05e, 0xb05f, 0xb060, 0xb061, 0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069, 0xb06a, 0xb06b, 0xb06c, 0xb06d, 0xb06e, 0xb06f, 0xb070, 0xb071, 0xb072, 0xb073, 0xb074, 0xb075, 0xb076, 0xb077, 0xb078, 0xb079, 0xb07a, 0xb07b, 0xb07c, 0xb07d, 0xb07e, 0xb080, 0xb081, 0xb082, 0xb083, 0xb084, 0xb085, 0xb086, 0xb087, 0xb088, 0xb089, 0xb08a, 0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xb091, 0xb092, 0xb093, 0xb094, 0xb095, 0xb096, 0xb097, 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d, 0xb09e, 0xb09f, 0xb0a0, 0xb140, 0xb141, 0xb142, 0xb143, 0xb144, 0xb145, 0xb146, 0xb147, 0xb148, 0xb149, 0xb14a, 0xb14b, 0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xb151, 0xb152, 0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xb159, 0xb15a, 0xb15b, 0xb15c, 0xb15d, 0xb15e, 0xb15f, 0xb160, 0xb161, 0xb162, 0xb163, 0xb164, 0xb165, 0xb166, 0xb167, 0xb168, 0xb169, 0xb16a, 0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, 0xb172, 0xb173, 0xb174, 0xb175, 0xb176, 0xb177, 0xb178, 0xb179, 0xb17a, 0xb17b, 0xb17c, 0xb17d, 0xb17e, 0xb180, 0xb181, 0xb182, 0xb183, 0xb184, 0xb185, 0xb186, 0xb187, 0xb188, 0xb189, 0xb18a, 0xb18b, 0xb18c, 0xb18d, 0xb18e, 0xb18f, 0xb190, 0xb191, 0xb192, 0xb193, 0xb194, 0xb195, 0xb196, 0xb197, 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d, 0xb19e, 0xb19f, 0xb1a0, 0xb240, 0xb241, 0xb242, 0xb243, 0xb244, 0xb245, 0xb246, 0xb247, 0xb248, 0xb249, 0xb24a, 0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252, 0xb253, 0xb254, 0xb255, 0xb256, 0xb257, 0xb258, 0xb259, 0xb25a, 0xb25b, 0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xb260, 0xb261, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, 0xb267, 0xb268, 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xb26e, 0xb26f, 0xb270, 0xb271, 0xb272, 0xb273, 0xb274, 0xb275, 0xb276, 0xb277, 0xb278, 0xb279, 0xb27a, 0xb27b, 0xb27c, 0xb27d, 0xb27e, 0xb280, 0xb281, 0xb282, 0xb283, 0xb284, 0xb285, 0xb286, 0xb287, 0xb288, 0xb289, 0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xb28f, 0xb290, 0xb291, 0xb292, 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb298, 0xb299, 0xb29a, 0xb29b, 0xb29c, 0xb29d, 0xb29e, 0xb29f, 0xb2a0, 0xb340, 0xb341, 0xb342, 0xb343, 0xb344, 0xb345, 0xb346, 0xb347, 0xb348, 0xb349, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, 0xb353, 0xb354, 0xb355, 0xb356, 0xb357, 0xb358, 0xb359, 0xb35a, 0xb35b, 0xb35c, 0xb35d, 0xb35e, 0xb35f, 0xb360, 0xb361, 0xb362, 0xb363, 0xb364, 0xb365, 0xb366, 0xb367, 0xb368, 0xb369, 0xb36a, 0xb36b, 0xb36c, 0xb36d, 0xb36e, 0xb36f, 0xb370, 0xb371, 0xb372, 0xb373, 0xb374, 0xb375, 0xb376, 0xb377, 0xb378, 0xb379, 0xb37a, 0xb37b, 0xb37c, 0xb37d, 0xb37e, 0xb380, 0xb381, 0xb382, 0xb383, 0xb384, 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, 0xb38c, 0xb38d, 0xb38e, 0xb38f, 0xb390, 0xb391, 0xb392, 0xb393, 0xb394, 0xb395, 0xb396, 0xb397, 0xb398, 0xb399, 0xb39a, 0xb39b, 0xb39c, 0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb440, 0xb441, 0xb442, 0xb443, 0xb444, 0xb445, 0xb446, 0xb447, 0xb448, 0xb449, 0xb44a, 0xb44b, 0xb44c, 0xb44d, 0xb44e, 0xb44f, 0xb450, 0xb451, 0xb452, 0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, 0xb45a, 0xb45b, 0xb45c, 0xb45d, 0xb45e, 0xb45f, 0xb460, 0xb461, 0xb462, 0xb463, 0xb464, 0xb465, 0xb466, 0xb467, 0xb468, 0xb469, 0xb46a, 0xb46b, 0xb46c, 0xb46d, 0xb46e, 0xb46f, 0xb470, 0xb471, 0xb472, 0xb473, 0xb474, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, 0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb480, 0xb481, 0xb482, 0xb483, 0xb484, 0xb485, 0xb486, 0xb487, 0xb488, 0xb489, 0xb48a, 0xb48b, 0xb48c, 0xb48d, 0xb48e, 0xb48f, 0xb490, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, 0xb496, 0xb497, 0xb498, 0xb499, 0xb49a, 0xb49b, 0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb540, 0xb541, 0xb542, 0xb543, 0xb544, 0xb545, 0xb546, 0xb547, 0xb548, 0xb549, 0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xb550, 0xb551, 0xb552, 0xb553, 0xb554, 0xb555, 0xb556, 0xb557, 0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f, 0xb560, 0xb561, 0xb562, 0xb563, 0xb564, 0xb565, 0xb566, 0xb567, 0xb568, 0xb569, 0xb56a, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xb56f, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575, 0xb576, 0xb577, 0xb578, 0xb579, 0xb57a, 0xb57b, 0xb57c, 0xb57d, 0xb57e, 0xb580, 0xb581, 0xb582, 0xb583, 0xb584, 0xb585, 0xb586, 0xb587, 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb58e, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593, 0xb594, 0xb595, 0xb596, 0xb597, 0xb598, 0xb599, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb59e, 0xb59f, 0xb5a0, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, 0xb645, 0xb646, 0xb647, 0xb648, 0xb649, 0xb64a, 0xb64b, 0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652, 0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659, 0xb65a, 0xb65b, 0xb65c, 0xb65d, 0xb65e, 0xb65f, 0xb660, 0xb661, 0xb662, 0xb663, 0xb664, 0xb665, 0xb666, 0xb667, 0xb668, 0xb669, 0xb66a, 0xb66b, 0xb66c, 0xb66d, 0xb66e, 0xb66f, 0xb670, 0xb671, 0xb672, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xb679, 0xb67a, 0xb67b, 0xb67c, 0xb67d, 0xb67e, 0xb680, 0xb681, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688, 0xb689, 0xb68a, 0xb68b, 0xb68c, 0xb68d, 0xb68e, 0xb68f, 0xb690, 0xb691, 0xb692, 0xb693, 0xb694, 0xb695, 0xb696, 0xb697, 0xb698, 0xb699, 0xb69a, 0xb69b, 0xb69c, 0xb69d, 0xb69e, 0xb69f, 0xb6a0, 0xb740, 0xb741, 0xb742, 0xb743, 0xb744, 0xb745, 0xb746, 0xb747, 0xb748, 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, 0xb750, 0xb751, 0xb752, 0xb753, 0xb754, 0xb755, 0xb756, 0xb757, 0xb758, 0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xb75f, 0xb760, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, 0xb768, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xb76e, 0xb76f, 0xb770, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775, 0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77c, 0xb77d, 0xb77e, 0xb780, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, 0xb787, 0xb788, 0xb789, 0xb78a, 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb78f, 0xb790, 0xb791, 0xb792, 0xb793, 0xb794, 0xb795, 0xb796, 0xb797, 0xb798, 0xb799, 0xb79a, 0xb79b, 0xb79c, 0xb79d, 0xb79e, 0xb79f, 0xb7a0, 0xb840, 0xb841, 0xb842, 0xb843, 0xb844, 0xb845, 0xb846, 0xb847, 0xb848, 0xb849, 0xb84a, 0xb84b, 0xb84c, 0xb84d, 0xb84e, 0xb84f, 0xb850, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xb856, 0xb857, 0xb858, 0xb859, 0xb85a, 0xb85b, 0xb85c, 0xb85d, 0xb85e, 0xb85f, 0xb860, 0xb861, 0xb862, 0xb863, 0xb864, 0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xb86b, 0xb86c, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xb871, 0xb872, 0xb873, 0xb874, 0xb875, 0xb876, 0xb877, 0xb878, 0xb879, 0xb87a, 0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb880, 0xb881, 0xb882, 0xb883, 0xb884, 0xb885, 0xb886, 0xb887, 0xb888, 0xb889, 0xb88a, 0xb88b, 0xb88c, 0xb88d, 0xb88e, 0xb88f, 0xb890, 0xb891, 0xb892, 0xb893, 0xb894, 0xb895, 0xb896, 0xb897, 0xb898, 0xb899, 0xb89a, 0xb89b, 0xb89c, 0xb89d, 0xb89e, 0xb89f, 0xb8a0, 0xb940, 0xb941, 0xb942, 0xb943, 0xb944, 0xb945, 0xb946, 0xb947, 0xb948, 0xb949, 0xb94a, 0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, 0xb950, 0xb951, 0xb952, 0xb953, 0xb954, 0xb955, 0xb956, 0xb957, 0xb958, 0xb959, 0xb95a, 0xb95b, 0xb95c, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961, 0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xb968, 0xb969, 0xb96a, 0xb96b, 0xb96c, 0xb96d, 0xb96e, 0xb96f, 0xb970, 0xb971, 0xb972, 0xb973, 0xb974, 0xb975, 0xb976, 0xb977, 0xb978, 0xb979, 0xb97a, 0xb97b, 0xb97c, 0xb97d, 0xb97e, 0xb980, 0xb981, 0xb982, 0xb983, 0xb984, 0xb985, 0xb986, 0xb987, 0xb988, 0xb989, 0xb98a, 0xb98b, 0xb98c, 0xb98d, 0xb98e, 0xb98f, 0xb990, 0xb991, 0xb992, 0xb993, 0xb994, 0xb995, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, 0xb99d, 0xb99e, 0xb99f, 0xb9a0, 0xba40, 0xba41, 0xba42, 0xba43, 0xba44, 0xba45, 0xba46, 0xba47, 0xba48, 0xba49, 0xba4a, 0xba4b, 0xba4c, 0xba4d, 0xba4e, 0xba4f, 0xba50, 0xba51, 0xba52, 0xba53, 0xba54, 0xba55, 0xba56, 0xba57, 0xba58, 0xba59, 0xba5a, 0xba5b, 0xba5c, 0xba5d, 0xba5e, 0xba5f, 0xba60, 0xba61, 0xba62, 0xba63, 0xba64, 0xba65, 0xba66, 0xba67, 0xba68, 0xba69, 0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70, 0xba71, 0xba72, 0xba73, 0xba74, 0xba75, 0xba76, 0xba77, 0xba78, 0xba79, 0xba7a, 0xba7b, 0xba7c, 0xba7d, 0xba7e, 0xba80, 0xba81, 0xba82, 0xba83, 0xba84, 0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a, 0xba8b, 0xba8c, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, 0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, 0xba9a, 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xbaa0, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb44, 0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49, 0xbb4a, 0xbb4b, 0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51, 0xbb52, 0xbb53, 0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59, 0xbb5a, 0xbb5b, 0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb61, 0xbb62, 0xbb63, 0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, 0xbb6c, 0xbb6d, 0xbb6e, 0xbb6f, 0xbb70, 0xbb71, 0xbb72, 0xbb73, 0xbb74, 0xbb75, 0xbb76, 0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, 0xbb80, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, 0xbb87, 0xbb88, 0xbb89, 0xbb8a, 0xbb8b, 0xbb8c, 0xbb8d, 0xbb8e, 0xbb8f, 0xbb90, 0xbb91, 0xbb92, 0xbb93, 0xbb94, 0xbb95, 0xbb96, 0xbb97, 0xbb98, 0xbb99, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, 0xbb9e, 0xbb9f, 0xbba0, 0xbc40, 0xbc41, 0xbc42, 0xbc43, 0xbc44, 0xbc45, 0xbc46, 0xbc47, 0xbc48, 0xbc49, 0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xbc4f, 0xbc50, 0xbc51, 0xbc52, 0xbc53, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, 0xbc5a, 0xbc5b, 0xbc5c, 0xbc5d, 0xbc5e, 0xbc5f, 0xbc60, 0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68, 0xbc69, 0xbc6a, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, 0xbc6f, 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, 0xbc77, 0xbc78, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, 0xbc7e, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xbc86, 0xbc87, 0xbc88, 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, 0xbc8f, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbc94, 0xbc95, 0xbc96, 0xbc97, 0xbc98, 0xbc99, 0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbd40, 0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48, 0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50, 0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, 0xbd59, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, 0xbd61, 0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68, 0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, 0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xbd77, 0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xbd80, 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, 0xbd90, 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, 0xbd98, 0xbd99, 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, 0xbda0, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, 0xbe47, 0xbe48, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xbe4d, 0xbe4e, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xbe54, 0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xbe5c, 0xbe5d, 0xbe5e, 0xbe5f, 0xbe60, 0xbe61, 0xbe62, 0xbe63, 0xbe64, 0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c, 0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71, 0xbe72, 0xbe73, 0xbe74, 0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0xbe7c, 0xbe7d, 0xbe7e, 0xbe80, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85, 0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0xbe8d, 0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92, 0xbe93, 0xbe94, 0xbe95, 0xbe96, 0xbe97, 0xbe98, 0xbe99, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, 0xbe9e, 0xbe9f, 0xbea0, 0xbf40, 0xbf41, 0xbf42, 0xbf43, 0xbf44, 0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, 0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51, 0xbf52, 0xbf53, 0xbf54, 0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0xbf5c, 0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, 0xbf62, 0xbf63, 0xbf64, 0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, 0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xbf74, 0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, 0xbf7d, 0xbf7e, 0xbf80, 0xbf81, 0xbf82, 0xbf83, 0xbf84, 0xbf85, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a, 0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, 0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, 0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xc040, 0xc041, 0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, 0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051, 0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc058, 0xc059, 0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061, 0xc062, 0xc063, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, 0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, 0xc071, 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, 0xc079, 0xc07a, 0xc07b, 0xc07c, 0xc07d, 0xc07e, 0xc080, 0xc081, 0xc082, 0xc083, 0xc084, 0xc085, 0xc086, 0xc087, 0xc088, 0xc089, 0xc08a, 0xc08b, 0xc08c, 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091, 0xc092, 0xc093, 0xc094, 0xc095, 0xc096, 0xc097, 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, 0xc09f, 0xc0a0, 0xc140, 0xc141, 0xc142, 0xc143, 0xc144, 0xc145, 0xc146, 0xc147, 0xc148, 0xc149, 0xc14a, 0xc14b, 0xc14c, 0xc14d, 0xc14e, 0xc14f, 0xc150, 0xc151, 0xc152, 0xc153, 0xc154, 0xc155, 0xc156, 0xc157, 0xc158, 0xc159, 0xc15a, 0xc15b, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161, 0xc162, 0xc163, 0xc164, 0xc165, 0xc166, 0xc167, 0xc168, 0xc169, 0xc16a, 0xc16b, 0xc16c, 0xc16d, 0xc16e, 0xc16f, 0xc170, 0xc171, 0xc172, 0xc173, 0xc174, 0xc175, 0xc176, 0xc177, 0xc178, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xc17e, 0xc180, 0xc181, 0xc182, 0xc183, 0xc184, 0xc185, 0xc186, 0xc187, 0xc188, 0xc189, 0xc18a, 0xc18b, 0xc18c, 0xc18d, 0xc18e, 0xc18f, 0xc190, 0xc191, 0xc192, 0xc193, 0xc194, 0xc195, 0xc196, 0xc197, 0xc198, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xc19f, 0xc1a0, 0xc240, 0xc241, 0xc242, 0xc243, 0xc244, 0xc245, 0xc246, 0xc247, 0xc248, 0xc249, 0xc24a, 0xc24b, 0xc24c, 0xc24d, 0xc24e, 0xc24f, 0xc250, 0xc251, 0xc252, 0xc253, 0xc254, 0xc255, 0xc256, 0xc257, 0xc258, 0xc259, 0xc25a, 0xc25b, 0xc25c, 0xc25d, 0xc25e, 0xc25f, 0xc260, 0xc261, 0xc262, 0xc263, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268, 0xc269, 0xc26a, 0xc26b, 0xc26c, 0xc26d, 0xc26e, 0xc26f, 0xc270, 0xc271, 0xc272, 0xc273, 0xc274, 0xc275, 0xc276, 0xc277, 0xc278, 0xc279, 0xc27a, 0xc27b, 0xc27c, 0xc27d, 0xc27e, 0xc280, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, 0xc286, 0xc287, 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, 0xc28e, 0xc28f, 0xc290, 0xc291, 0xc292, 0xc293, 0xc294, 0xc295, 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a, 0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc340, 0xc341, 0xc342, 0xc343, 0xc344, 0xc345, 0xc346, 0xc347, 0xc348, 0xc349, 0xc34a, 0xc34b, 0xc34c, 0xc34d, 0xc34e, 0xc34f, 0xc350, 0xc351, 0xc352, 0xc353, 0xc354, 0xc355, 0xc356, 0xc357, 0xc358, 0xc359, 0xc35a, 0xc35b, 0xc35c, 0xc35d, 0xc35e, 0xc35f, 0xc360, 0xc361, 0xc362, 0xc363, 0xc364, 0xc365, 0xc366, 0xc367, 0xc368, 0xc369, 0xc36a, 0xc36b, 0xc36c, 0xc36d, 0xc36e, 0xc36f, 0xc370, 0xc371, 0xc372, 0xc373, 0xc374, 0xc375, 0xc376, 0xc377, 0xc378, 0xc379, 0xc37a, 0xc37b, 0xc37c, 0xc37d, 0xc37e, 0xc380, 0xc381, 0xc382, 0xc383, 0xc384, 0xc385, 0xc386, 0xc387, 0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, 0xc390, 0xc391, 0xc392, 0xc393, 0xc394, 0xc395, 0xc396, 0xc397, 0xc398, 0xc399, 0xc39a, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc3a0, 0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xc446, 0xc447, 0xc448, 0xc449, 0xc44a, 0xc44b, 0xc44c, 0xc44d, 0xc44e, 0xc44f, 0xc450, 0xc451, 0xc452, 0xc453, 0xc454, 0xc455, 0xc456, 0xc457, 0xc458, 0xc459, 0xc45a, 0xc45b, 0xc45c, 0xc45d, 0xc45e, 0xc45f, 0xc460, 0xc461, 0xc462, 0xc463, 0xc464, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469, 0xc46a, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xc46f, 0xc470, 0xc471, 0xc472, 0xc473, 0xc474, 0xc475, 0xc476, 0xc477, 0xc478, 0xc479, 0xc47a, 0xc47b, 0xc47c, 0xc47d, 0xc47e, 0xc480, 0xc481, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, 0xc487, 0xc488, 0xc489, 0xc48a, 0xc48b, 0xc48c, 0xc48d, 0xc48e, 0xc48f, 0xc490, 0xc491, 0xc492, 0xc493, 0xc494, 0xc495, 0xc496, 0xc497, 0xc498, 0xc499, 0xc49a, 0xc49b, 0xc49c, 0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc540, 0xc541, 0xc542, 0xc543, 0xc544, 0xc545, 0xc546, 0xc547, 0xc548, 0xc549, 0xc54a, 0xc54b, 0xc54c, 0xc54d, 0xc54e, 0xc54f, 0xc550, 0xc551, 0xc552, 0xc553, 0xc554, 0xc555, 0xc556, 0xc557, 0xc558, 0xc559, 0xc55a, 0xc55b, 0xc55c, 0xc55d, 0xc55e, 0xc55f, 0xc560, 0xc561, 0xc562, 0xc563, 0xc564, 0xc565, 0xc566, 0xc567, 0xc568, 0xc569, 0xc56a, 0xc56b, 0xc56c, 0xc56d, 0xc56e, 0xc56f, 0xc570, 0xc571, 0xc572, 0xc573, 0xc574, 0xc575, 0xc576, 0xc577, 0xc578, 0xc579, 0xc57a, 0xc57b, 0xc57c, 0xc57d, 0xc57e, 0xc580, 0xc581, 0xc582, 0xc583, 0xc584, 0xc585, 0xc586, 0xc587, 0xc588, 0xc589, 0xc58a, 0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592, 0xc593, 0xc594, 0xc595, 0xc596, 0xc597, 0xc598, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, 0xc5a0, 0xc640, 0xc641, 0xc642, 0xc643, 0xc644, 0xc645, 0xc646, 0xc647, 0xc648, 0xc649, 0xc64a, 0xc64b, 0xc64c, 0xc64d, 0xc64e, 0xc64f, 0xc650, 0xc651, 0xc652, 0xc653, 0xc654, 0xc655, 0xc656, 0xc657, 0xc658, 0xc659, 0xc65a, 0xc65b, 0xc65c, 0xc65d, 0xc65e, 0xc65f, 0xc660, 0xc661, 0xc662, 0xc663, 0xc664, 0xc665, 0xc666, 0xc667, 0xc668, 0xc669, 0xc66a, 0xc66b, 0xc66c, 0xc66d, 0xc66e, 0xc66f, 0xc670, 0xc671, 0xc672, 0xc673, 0xc674, 0xc675, 0xc676, 0xc677, 0xc678, 0xc679, 0xc67a, 0xc67b, 0xc67c, 0xc67d, 0xc67e, 0xc680, 0xc681, 0xc682, 0xc683, 0xc684, 0xc685, 0xc686, 0xc687, 0xc688, 0xc689, 0xc68a, 0xc68b, 0xc68c, 0xc68d, 0xc68e, 0xc68f, 0xc690, 0xc691, 0xc692, 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xc699, 0xc69a, 0xc69b, 0xc69c, 0xc69d, 0xc69e, 0xc69f, 0xc6a0, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc780, 0xc781, 0xc782, 0xc783, 0xc784, 0xc785, 0xc786, 0xc787, 0xc788, 0xc789, 0xc78a, 0xc78b, 0xc78c, 0xc78d, 0xc78e, 0xc78f, 0xc790, 0xc791, 0xc792, 0xc793, 0xc794, 0xc795, 0xc796, 0xc797, 0xc798, 0xc799, 0xc79a, 0xc79b, 0xc79c, 0xc79d, 0xc79e, 0xc79f, 0xc7a0, 0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc848, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852, 0xc853, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, 0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877, 0xc878, 0xc879, 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc880, 0xc881, 0xc882, 0xc883, 0xc884, 0xc885, 0xc886, 0xc887, 0xc888, 0xc889, 0xc88a, 0xc88b, 0xc88c, 0xc88d, 0xc88e, 0xc88f, 0xc890, 0xc891, 0xc892, 0xc893, 0xc894, 0xc895, 0xc896, 0xc897, 0xc898, 0xc899, 0xc89a, 0xc89b, 0xc89c, 0xc89d, 0xc89e, 0xc89f, 0xc8a0, 0xc940, 0xc941, 0xc942, 0xc943, 0xc944, 0xc945, 0xc946, 0xc947, 0xc948, 0xc949, 0xc94a, 0xc94b, 0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951, 0xc952, 0xc953, 0xc954, 0xc955, 0xc956, 0xc957, 0xc958, 0xc959, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, 0xc960, 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xc967, 0xc968, 0xc969, 0xc96a, 0xc96b, 0xc96c, 0xc96d, 0xc96e, 0xc96f, 0xc970, 0xc971, 0xc972, 0xc973, 0xc974, 0xc975, 0xc976, 0xc977, 0xc978, 0xc979, 0xc97a, 0xc97b, 0xc97c, 0xc97d, 0xc97e, 0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc985, 0xc986, 0xc987, 0xc988, 0xc989, 0xc98a, 0xc98b, 0xc98c, 0xc98d, 0xc98e, 0xc98f, 0xc990, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, 0xc998, 0xc999, 0xc99a, 0xc99b, 0xc99c, 0xc99d, 0xc99e, 0xc99f, 0xc9a0, 0xca40, 0xca41, 0xca42, 0xca43, 0xca44, 0xca45, 0xca46, 0xca47, 0xca48, 0xca49, 0xca4a, 0xca4b, 0xca4c, 0xca4d, 0xca4e, 0xca4f, 0xca50, 0xca51, 0xca52, 0xca53, 0xca54, 0xca55, 0xca56, 0xca57, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0xca5d, 0xca5e, 0xca5f, 0xca60, 0xca61, 0xca62, 0xca63, 0xca64, 0xca65, 0xca66, 0xca67, 0xca68, 0xca69, 0xca6a, 0xca6b, 0xca6c, 0xca6d, 0xca6e, 0xca6f, 0xca70, 0xca71, 0xca72, 0xca73, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, 0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xca80, 0xca81, 0xca82, 0xca83, 0xca84, 0xca85, 0xca86, 0xca87, 0xca88, 0xca89, 0xca8a, 0xca8b, 0xca8c, 0xca8d, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, 0xca95, 0xca96, 0xca97, 0xca98, 0xca99, 0xca9a, 0xca9b, 0xca9c, 0xca9d, 0xca9e, 0xca9f, 0xcaa0, 0xcb40, 0xcb41, 0xcb42, 0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0xcb48, 0xcb49, 0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51, 0xcb52, 0xcb53, 0xcb54, 0xcb55, 0xcb56, 0xcb57, 0xcb58, 0xcb59, 0xcb5a, 0xcb5b, 0xcb5c, 0xcb5d, 0xcb5e, 0xcb5f, 0xcb60, 0xcb61, 0xcb62, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xcb69, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, 0xcb70, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, 0xcb77, 0xcb78, 0xcb79, 0xcb7a, 0xcb7b, 0xcb7c, 0xcb7d, 0xcb7e, 0xcb80, 0xcb81, 0xcb82, 0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xcb87, 0xcb88, 0xcb89, 0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d, 0xcb8e, 0xcb8f, 0xcb90, 0xcb91, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, 0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, 0xcba0, 0xcc40, 0xcc41, 0xcc42, 0xcc43, 0xcc44, 0xcc45, 0xcc46, 0xcc47, 0xcc48, 0xcc49, 0xcc4a, 0xcc4b, 0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, 0xcc52, 0xcc53, 0xcc54, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xcc59, 0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc60, 0xcc61, 0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xcc69, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, 0xcc70, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, 0xcc78, 0xcc79, 0xcc7a, 0xcc7b, 0xcc7c, 0xcc7d, 0xcc7e, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, 0xcc87, 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xcc8c, 0xcc8d, 0xcc8e, 0xcc8f, 0xcc90, 0xcc91, 0xcc92, 0xcc93, 0xcc94, 0xcc95, 0xcc96, 0xcc97, 0xcc98, 0xcc99, 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d, 0xcc9e, 0xcc9f, 0xcca0, 0xcd40, 0xcd41, 0xcd42, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48, 0xcd49, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, 0xcd4f, 0xcd50, 0xcd51, 0xcd52, 0xcd53, 0xcd54, 0xcd55, 0xcd56, 0xcd57, 0xcd58, 0xcd59, 0xcd5a, 0xcd5b, 0xcd5c, 0xcd5d, 0xcd5e, 0xcd5f, 0xcd60, 0xcd61, 0xcd62, 0xcd63, 0xcd64, 0xcd65, 0xcd66, 0xcd67, 0xcd68, 0xcd69, 0xcd6a, 0xcd6b, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, 0xcd71, 0xcd72, 0xcd73, 0xcd74, 0xcd75, 0xcd76, 0xcd77, 0xcd78, 0xcd79, 0xcd7a, 0xcd7b, 0xcd7c, 0xcd7d, 0xcd7e, 0xcd80, 0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xcd85, 0xcd86, 0xcd87, 0xcd88, 0xcd89, 0xcd8a, 0xcd8b, 0xcd8c, 0xcd8d, 0xcd8e, 0xcd8f, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xcd94, 0xcd95, 0xcd96, 0xcd97, 0xcd98, 0xcd99, 0xcd9a, 0xcd9b, 0xcd9c, 0xcd9d, 0xcd9e, 0xcd9f, 0xcda0, 0xce40, 0xce41, 0xce42, 0xce43, 0xce44, 0xce45, 0xce46, 0xce47, 0xce48, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xce4d, 0xce4e, 0xce4f, 0xce50, 0xce51, 0xce52, 0xce53, 0xce54, 0xce55, 0xce56, 0xce57, 0xce58, 0xce59, 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xce5f, 0xce60, 0xce61, 0xce62, 0xce63, 0xce64, 0xce65, 0xce66, 0xce67, 0xce68, 0xce69, 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, 0xce70, 0xce71, 0xce72, 0xce73, 0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79, 0xce7a, 0xce7b, 0xce7c, 0xce7d, 0xce7e, 0xce80, 0xce81, 0xce82, 0xce83, 0xce84, 0xce85, 0xce86, 0xce87, 0xce88, 0xce89, 0xce8a, 0xce8b, 0xce8c, 0xce8d, 0xce8e, 0xce8f, 0xce90, 0xce91, 0xce92, 0xce93, 0xce94, 0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a, 0xce9b, 0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0xcf40, 0xcf41, 0xcf42, 0xcf43, 0xcf44, 0xcf45, 0xcf46, 0xcf47, 0xcf48, 0xcf49, 0xcf4a, 0xcf4b, 0xcf4c, 0xcf4d, 0xcf4e, 0xcf4f, 0xcf50, 0xcf51, 0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xcf57, 0xcf58, 0xcf59, 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, 0xcf5e, 0xcf5f, 0xcf60, 0xcf61, 0xcf62, 0xcf63, 0xcf64, 0xcf65, 0xcf66, 0xcf67, 0xcf68, 0xcf69, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xcf6e, 0xcf6f, 0xcf70, 0xcf71, 0xcf72, 0xcf73, 0xcf74, 0xcf75, 0xcf76, 0xcf77, 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, 0xcf7e, 0xcf80, 0xcf81, 0xcf82, 0xcf83, 0xcf84, 0xcf85, 0xcf86, 0xcf87, 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, 0xcf8c, 0xcf8d, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92, 0xcf93, 0xcf94, 0xcf95, 0xcf96, 0xcf97, 0xcf98, 0xcf99, 0xcf9a, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, 0xcf9f, 0xcfa0, 0xd040, 0xd041, 0xd042, 0xd043, 0xd044, 0xd045, 0xd046, 0xd047, 0xd048, 0xd049, 0xd04a, 0xd04b, 0xd04c, 0xd04d, 0xd04e, 0xd04f, 0xd050, 0xd051, 0xd052, 0xd053, 0xd054, 0xd055, 0xd056, 0xd057, 0xd058, 0xd059, 0xd05a, 0xd05b, 0xd05c, 0xd05d, 0xd05e, 0xd05f, 0xd060, 0xd061, 0xd062, 0xd063, 0xd064, 0xd065, 0xd066, 0xd067, 0xd068, 0xd069, 0xd06a, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070, 0xd071, 0xd072, 0xd073, 0xd074, 0xd075, 0xd076, 0xd077, 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd07c, 0xd07d, 0xd07e, 0xd080, 0xd081, 0xd082, 0xd083, 0xd084, 0xd085, 0xd086, 0xd087, 0xd088, 0xd089, 0xd08a, 0xd08b, 0xd08c, 0xd08d, 0xd08e, 0xd08f, 0xd090, 0xd091, 0xd092, 0xd093, 0xd094, 0xd095, 0xd096, 0xd097, 0xd098, 0xd099, 0xd09a, 0xd09b, 0xd09c, 0xd09d, 0xd09e, 0xd09f, 0xd0a0, 0xd140, 0xd141, 0xd142, 0xd143, 0xd144, 0xd145, 0xd146, 0xd147, 0xd148, 0xd149, 0xd14a, 0xd14b, 0xd14c, 0xd14d, 0xd14e, 0xd14f, 0xd150, 0xd151, 0xd152, 0xd153, 0xd154, 0xd155, 0xd156, 0xd157, 0xd158, 0xd159, 0xd15a, 0xd15b, 0xd15c, 0xd15d, 0xd15e, 0xd15f, 0xd160, 0xd161, 0xd162, 0xd163, 0xd164, 0xd165, 0xd166, 0xd167, 0xd168, 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, 0xd16f, 0xd170, 0xd171, 0xd172, 0xd173, 0xd174, 0xd175, 0xd176, 0xd177, 0xd178, 0xd179, 0xd17a, 0xd17b, 0xd17c, 0xd17d, 0xd17e, 0xd180, 0xd181, 0xd182, 0xd183, 0xd184, 0xd185, 0xd186, 0xd187, 0xd188, 0xd189, 0xd18a, 0xd18b, 0xd18c, 0xd18d, 0xd18e, 0xd18f, 0xd190, 0xd191, 0xd192, 0xd193, 0xd194, 0xd195, 0xd196, 0xd197, 0xd198, 0xd199, 0xd19a, 0xd19b, 0xd19c, 0xd19d, 0xd19e, 0xd19f, 0xd1a0, 0xd240, 0xd241, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, 0xd248, 0xd249, 0xd24a, 0xd24b, 0xd24c, 0xd24d, 0xd24e, 0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, 0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d, 0xd25e, 0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0xd264, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, 0xd26a, 0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271, 0xd272, 0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, 0xd27a, 0xd27b, 0xd27c, 0xd27d, 0xd27e, 0xd280, 0xd281, 0xd282, 0xd283, 0xd284, 0xd285, 0xd286, 0xd287, 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, 0xd28f, 0xd290, 0xd291, 0xd292, 0xd293, 0xd294, 0xd295, 0xd296, 0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29c, 0xd29d, 0xd29e, 0xd29f, 0xd2a0, 0xd340, 0xd341, 0xd342, 0xd343, 0xd344, 0xd345, 0xd346, 0xd347, 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c, 0xd34d, 0xd34e, 0xd34f, 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0xd355, 0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d, 0xd35e, 0xd35f, 0xd360, 0xd361, 0xd362, 0xd363, 0xd364, 0xd365, 0xd366, 0xd367, 0xd368, 0xd369, 0xd36a, 0xd36b, 0xd36c, 0xd36d, 0xd36e, 0xd36f, 0xd370, 0xd371, 0xd372, 0xd373, 0xd374, 0xd375, 0xd376, 0xd377, 0xd378, 0xd379, 0xd37a, 0xd37b, 0xd37c, 0xd37d, 0xd37e, 0xd380, 0xd381, 0xd382, 0xd383, 0xd384, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392, 0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a, 0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd440, 0xd441, 0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449, 0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451, 0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459, 0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xd460, 0xd461, 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f, 0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, 0xd478, 0xd479, 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd480, 0xd481, 0xd482, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd488, 0xd489, 0xd48a, 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490, 0xd491, 0xd492, 0xd493, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, 0xd499, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, 0xd4a0, 0xd540, 0xd541, 0xd542, 0xd543, 0xd544, 0xd545, 0xd546, 0xd547, 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54c, 0xd54d, 0xd54e, 0xd54f, 0xd550, 0xd551, 0xd552, 0xd553, 0xd554, 0xd555, 0xd556, 0xd557, 0xd558, 0xd559, 0xd55a, 0xd55b, 0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561, 0xd562, 0xd563, 0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0xd569, 0xd56a, 0xd56b, 0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573, 0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579, 0xd57a, 0xd57b, 0xd57c, 0xd57d, 0xd57e, 0xd580, 0xd581, 0xd582, 0xd583, 0xd584, 0xd585, 0xd586, 0xd587, 0xd588, 0xd589, 0xd58a, 0xd58b, 0xd58c, 0xd58d, 0xd58e, 0xd58f, 0xd590, 0xd591, 0xd592, 0xd593, 0xd594, 0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, 0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd640, 0xd641, 0xd642, 0xd643, 0xd644, 0xd645, 0xd646, 0xd647, 0xd648, 0xd649, 0xd64a, 0xd64b, 0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651, 0xd652, 0xd653, 0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659, 0xd65a, 0xd65b, 0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xd663, 0xd664, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669, 0xd66a, 0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd670, 0xd671, 0xd672, 0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, 0xd67a, 0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd680, 0xd681, 0xd682, 0xd683, 0xd684, 0xd685, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a, 0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692, 0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, 0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd740, 0xd741, 0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, 0xd748, 0xd749, 0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd750, 0xd751, 0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759, 0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xd760, 0xd761, 0xd762, 0xd763, 0xd764, 0xd765, 0xd766, 0xd767, 0xd768, 0xd769, 0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f, 0xd770, 0xd771, 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, 0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd780, 0xd781, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd788, 0xd789, 0xd78a, 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790, 0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798, 0xd799, 0xd79a, 0xd79b, 0xd79c, 0xd79d, 0xd79e, 0xd79f, 0xd7a0, 0xd840, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, 0xd848, 0xd849, 0xd84a, 0xd84b, 0xd84c, 0xd84d, 0xd84e, 0xd84f, 0xd850, 0xd851, 0xd852, 0xd853, 0xd854, 0xd855, 0xd856, 0xd857, 0xd858, 0xd859, 0xd85a, 0xd85b, 0xd85c, 0xd85d, 0xd85e, 0xd85f, 0xd860, 0xd861, 0xd862, 0xd863, 0xd864, 0xd865, 0xd866, 0xd867, 0xd868, 0xd869, 0xd86a, 0xd86b, 0xd86c, 0xd86d, 0xd86e, 0xd86f, 0xd870, 0xd871, 0xd872, 0xd873, 0xd874, 0xd875, 0xd876, 0xd877, 0xd878, 0xd879, 0xd87a, 0xd87b, 0xd87c, 0xd87d, 0xd87e, 0xd880, 0xd881, 0xd882, 0xd883, 0xd884, 0xd885, 0xd886, 0xd887, 0xd888, 0xd889, 0xd88a, 0xd88b, 0xd88c, 0xd88d, 0xd88e, 0xd88f, 0xd890, 0xd891, 0xd892, 0xd893, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xd899, 0xd89a, 0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, 0xd8a0, 0xd940, 0xd941, 0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, 0xd948, 0xd949, 0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, 0xd950, 0xd951, 0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, 0xd958, 0xd959, 0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, 0xd960, 0xd961, 0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, 0xd968, 0xd969, 0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, 0xd970, 0xd971, 0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, 0xd978, 0xd979, 0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd980, 0xd981, 0xd982, 0xd983, 0xd984, 0xd985, 0xd986, 0xd987, 0xd988, 0xd989, 0xd98a, 0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, 0xd990, 0xd991, 0xd992, 0xd993, 0xd994, 0xd995, 0xd996, 0xd997, 0xd998, 0xd999, 0xd99a, 0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, 0xd9a0, 0xda40, 0xda41, 0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, 0xda48, 0xda49, 0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xda4f, 0xda50, 0xda51, 0xda52, 0xda53, 0xda54, 0xda55, 0xda56, 0xda57, 0xda58, 0xda59, 0xda5a, 0xda5b, 0xda5c, 0xda5d, 0xda5e, 0xda5f, 0xda60, 0xda61, 0xda62, 0xda63, 0xda64, 0xda65, 0xda66, 0xda67, 0xda68, 0xda69, 0xda6a, 0xda6b, 0xda6c, 0xda6d, 0xda6e, 0xda6f, 0xda70, 0xda71, 0xda72, 0xda73, 0xda74, 0xda75, 0xda76, 0xda77, 0xda78, 0xda79, 0xda7a, 0xda7b, 0xda7c, 0xda7d, 0xda7e, 0xda80, 0xda81, 0xda82, 0xda83, 0xda84, 0xda85, 0xda86, 0xda87, 0xda88, 0xda89, 0xda8a, 0xda8b, 0xda8c, 0xda8d, 0xda8e, 0xda8f, 0xda90, 0xda91, 0xda92, 0xda93, 0xda94, 0xda95, 0xda96, 0xda97, 0xda98, 0xda99, 0xda9a, 0xda9b, 0xda9c, 0xda9d, 0xda9e, 0xda9f, 0xdaa0, 0xdb40, 0xdb41, 0xdb42, 0xdb43, 0xdb44, 0xdb45, 0xdb46, 0xdb47, 0xdb48, 0xdb49, 0xdb4a, 0xdb4b, 0xdb4c, 0xdb4d, 0xdb4e, 0xdb4f, 0xdb50, 0xdb51, 0xdb52, 0xdb53, 0xdb54, 0xdb55, 0xdb56, 0xdb57, 0xdb58, 0xdb59, 0xdb5a, 0xdb5b, 0xdb5c, 0xdb5d, 0xdb5e, 0xdb5f, 0xdb60, 0xdb61, 0xdb62, 0xdb63, 0xdb64, 0xdb65, 0xdb66, 0xdb67, 0xdb68, 0xdb69, 0xdb6a, 0xdb6b, 0xdb6c, 0xdb6d, 0xdb6e, 0xdb6f, 0xdb70, 0xdb71, 0xdb72, 0xdb73, 0xdb74, 0xdb75, 0xdb76, 0xdb77, 0xdb78, 0xdb79, 0xdb7a, 0xdb7b, 0xdb7c, 0xdb7d, 0xdb7e, 0xdb80, 0xdb81, 0xdb82, 0xdb83, 0xdb84, 0xdb85, 0xdb86, 0xdb87, 0xdb88, 0xdb89, 0xdb8a, 0xdb8b, 0xdb8c, 0xdb8d, 0xdb8e, 0xdb8f, 0xdb90, 0xdb91, 0xdb92, 0xdb93, 0xdb94, 0xdb95, 0xdb96, 0xdb97, 0xdb98, 0xdb99, 0xdb9a, 0xdb9b, 0xdb9c, 0xdb9d, 0xdb9e, 0xdb9f, 0xdba0, 0xdc40, 0xdc41, 0xdc42, 0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xdc47, 0xdc48, 0xdc49, 0xdc4a, 0xdc4b, 0xdc4c, 0xdc4d, 0xdc4e, 0xdc4f, 0xdc50, 0xdc51, 0xdc52, 0xdc53, 0xdc54, 0xdc55, 0xdc56, 0xdc57, 0xdc58, 0xdc59, 0xdc5a, 0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xdc5f, 0xdc60, 0xdc61, 0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68, 0xdc69, 0xdc6a, 0xdc6b, 0xdc6c, 0xdc6d, 0xdc6e, 0xdc6f, 0xdc70, 0xdc71, 0xdc72, 0xdc73, 0xdc74, 0xdc75, 0xdc76, 0xdc77, 0xdc78, 0xdc79, 0xdc7a, 0xdc7b, 0xdc7c, 0xdc7d, 0xdc7e, 0xdc80, 0xdc81, 0xdc82, 0xdc83, 0xdc84, 0xdc85, 0xdc86, 0xdc87, 0xdc88, 0xdc89, 0xdc8a, 0xdc8b, 0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, 0xdc90, 0xdc91, 0xdc92, 0xdc93, 0xdc94, 0xdc95, 0xdc96, 0xdc97, 0xdc98, 0xdc99, 0xdc9a, 0xdc9b, 0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, 0xdca0, 0xdd40, 0xdd41, 0xdd42, 0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, 0xdd48, 0xdd49, 0xdd4a, 0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, 0xdd52, 0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58, 0xdd59, 0xdd5a, 0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61, 0xdd62, 0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68, 0xdd69, 0xdd6a, 0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70, 0xdd71, 0xdd72, 0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, 0xdd78, 0xdd79, 0xdd7a, 0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd80, 0xdd81, 0xdd82, 0xdd83, 0xdd84, 0xdd85, 0xdd86, 0xdd87, 0xdd88, 0xdd89, 0xdd8a, 0xdd8b, 0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, 0xdd90, 0xdd91, 0xdd92, 0xdd93, 0xdd94, 0xdd95, 0xdd96, 0xdd97, 0xdd98, 0xdd99, 0xdd9a, 0xdd9b, 0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0xde40, 0xde41, 0xde42, 0xde43, 0xde44, 0xde45, 0xde46, 0xde47, 0xde48, 0xde49, 0xde4a, 0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, 0xde50, 0xde51, 0xde52, 0xde53, 0xde54, 0xde55, 0xde56, 0xde57, 0xde58, 0xde59, 0xde5a, 0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, 0xde60, 0xde61, 0xde62, 0xde63, 0xde64, 0xde65, 0xde66, 0xde67, 0xde68, 0xde69, 0xde6a, 0xde6b, 0xde6c, 0xde6d, 0xde6e, 0xde6f, 0xde70, 0xde71, 0xde72, 0xde73, 0xde74, 0xde75, 0xde76, 0xde77, 0xde78, 0xde79, 0xde7a, 0xde7b, 0xde7c, 0xde7d, 0xde7e, 0xde80, 0xde81, 0xde82, 0xde83, 0xde84, 0xde85, 0xde86, 0xde87, 0xde88, 0xde89, 0xde8a, 0xde8b, 0xde8c, 0xde8d, 0xde8e, 0xde8f, 0xde90, 0xde91, 0xde92, 0xde93, 0xde94, 0xde95, 0xde96, 0xde97, 0xde98, 0xde99, 0xde9a, 0xde9b, 0xde9c, 0xde9d, 0xde9e, 0xde9f, 0xdea0, 0xdf40, 0xdf41, 0xdf42, 0xdf43, 0xdf44, 0xdf45, 0xdf46, 0xdf47, 0xdf48, 0xdf49, 0xdf4a, 0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, 0xdf50, 0xdf51, 0xdf52, 0xdf53, 0xdf54, 0xdf55, 0xdf56, 0xdf57, 0xdf58, 0xdf59, 0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xdf5e, 0xdf5f, 0xdf60, 0xdf61, 0xdf62, 0xdf63, 0xdf64, 0xdf65, 0xdf66, 0xdf67, 0xdf68, 0xdf69, 0xdf6a, 0xdf6b, 0xdf6c, 0xdf6d, 0xdf6e, 0xdf6f, 0xdf70, 0xdf71, 0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xdf76, 0xdf77, 0xdf78, 0xdf79, 0xdf7a, 0xdf7b, 0xdf7c, 0xdf7d, 0xdf7e, 0xdf80, 0xdf81, 0xdf82, 0xdf83, 0xdf84, 0xdf85, 0xdf86, 0xdf87, 0xdf88, 0xdf89, 0xdf8a, 0xdf8b, 0xdf8c, 0xdf8d, 0xdf8e, 0xdf8f, 0xdf90, 0xdf91, 0xdf92, 0xdf93, 0xdf94, 0xdf95, 0xdf96, 0xdf97, 0xdf98, 0xdf99, 0xdf9a, 0xdf9b, 0xdf9c, 0xdf9d, 0xdf9e, 0xdf9f, 0xdfa0, 0xe040, 0xe041, 0xe042, 0xe043, 0xe044, 0xe045, 0xe046, 0xe047, 0xe048, 0xe049, 0xe04a, 0xe04b, 0xe04c, 0xe04d, 0xe04e, 0xe04f, 0xe050, 0xe051, 0xe052, 0xe053, 0xe054, 0xe055, 0xe056, 0xe057, 0xe058, 0xe059, 0xe05a, 0xe05b, 0xe05c, 0xe05d, 0xe05e, 0xe05f, 0xe060, 0xe061, 0xe062, 0xe063, 0xe064, 0xe065, 0xe066, 0xe067, 0xe068, 0xe069, 0xe06a, 0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, 0xe070, 0xe071, 0xe072, 0xe073, 0xe074, 0xe075, 0xe076, 0xe077, 0xe078, 0xe079, 0xe07a, 0xe07b, 0xe07c, 0xe07d, 0xe07e, 0xe080, 0xe081, 0xe082, 0xe083, 0xe084, 0xe085, 0xe086, 0xe087, 0xe088, 0xe089, 0xe08a, 0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xe08f, 0xe090, 0xe091, 0xe092, 0xe093, 0xe094, 0xe095, 0xe096, 0xe097, 0xe098, 0xe099, 0xe09a, 0xe09b, 0xe09c, 0xe09d, 0xe09e, 0xe09f, 0xe0a0, 0xe140, 0xe141, 0xe142, 0xe143, 0xe144, 0xe145, 0xe146, 0xe147, 0xe148, 0xe149, 0xe14a, 0xe14b, 0xe14c, 0xe14d, 0xe14e, 0xe14f, 0xe150, 0xe151, 0xe152, 0xe153, 0xe154, 0xe155, 0xe156, 0xe157, 0xe158, 0xe159, 0xe15a, 0xe15b, 0xe15c, 0xe15d, 0xe15e, 0xe15f, 0xe160, 0xe161, 0xe162, 0xe163, 0xe164, 0xe165, 0xe166, 0xe167, 0xe168, 0xe169, 0xe16a, 0xe16b, 0xe16c, 0xe16d, 0xe16e, 0xe16f, 0xe170, 0xe171, 0xe172, 0xe173, 0xe174, 0xe175, 0xe176, 0xe177, 0xe178, 0xe179, 0xe17a, 0xe17b, 0xe17c, 0xe17d, 0xe17e, 0xe180, 0xe181, 0xe182, 0xe183, 0xe184, 0xe185, 0xe186, 0xe187, 0xe188, 0xe189, 0xe18a, 0xe18b, 0xe18c, 0xe18d, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, 0xe193, 0xe194, 0xe195, 0xe196, 0xe197, 0xe198, 0xe199, 0xe19a, 0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe240, 0xe241, 0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249, 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251, 0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, 0xe258, 0xe259, 0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, 0xe260, 0xe261, 0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, 0xe268, 0xe269, 0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, 0xe270, 0xe271, 0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, 0xe278, 0xe279, 0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe280, 0xe281, 0xe282, 0xe283, 0xe284, 0xe285, 0xe286, 0xe287, 0xe288, 0xe289, 0xe28a, 0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, 0xe290, 0xe291, 0xe292, 0xe293, 0xe294, 0xe295, 0xe296, 0xe297, 0xe298, 0xe299, 0xe29a, 0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, 0xe2a0, 0xe340, 0xe341, 0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, 0xe348, 0xe349, 0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, 0xe350, 0xe351, 0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, 0xe358, 0xe359, 0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, 0xe360, 0xe361, 0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, 0xe368, 0xe369, 0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xe36e, 0xe36f, 0xe370, 0xe371, 0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, 0xe378, 0xe379, 0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe380, 0xe381, 0xe382, 0xe383, 0xe384, 0xe385, 0xe386, 0xe387, 0xe388, 0xe389, 0xe38a, 0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, 0xe390, 0xe391, 0xe392, 0xe393, 0xe394, 0xe395, 0xe396, 0xe397, 0xe398, 0xe399, 0xe39a, 0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, 0xe3a0, 0xe440, 0xe441, 0xe442, 0xe443, 0xe444, 0xe445, 0xe446, 0xe447, 0xe448, 0xe449, 0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e, 0xe44f, 0xe450, 0xe451, 0xe452, 0xe453, 0xe454, 0xe455, 0xe456, 0xe457, 0xe458, 0xe459, 0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e, 0xe45f, 0xe460, 0xe461, 0xe462, 0xe463, 0xe464, 0xe465, 0xe466, 0xe467, 0xe468, 0xe469, 0xe46a, 0xe46b, 0xe46c, 0xe46d, 0xe46e, 0xe46f, 0xe470, 0xe471, 0xe472, 0xe473, 0xe474, 0xe475, 0xe476, 0xe477, 0xe478, 0xe479, 0xe47a, 0xe47b, 0xe47c, 0xe47d, 0xe47e, 0xe480, 0xe481, 0xe482, 0xe483, 0xe484, 0xe485, 0xe486, 0xe487, 0xe488, 0xe489, 0xe48a, 0xe48b, 0xe48c, 0xe48d, 0xe48e, 0xe48f, 0xe490, 0xe491, 0xe492, 0xe493, 0xe494, 0xe495, 0xe496, 0xe497, 0xe498, 0xe499, 0xe49a, 0xe49b, 0xe49c, 0xe49d, 0xe49e, 0xe49f, 0xe4a0, 0xe540, 0xe541, 0xe542, 0xe543, 0xe544, 0xe545, 0xe546, 0xe547, 0xe548, 0xe549, 0xe54a, 0xe54b, 0xe54c, 0xe54d, 0xe54e, 0xe54f, 0xe550, 0xe551, 0xe552, 0xe553, 0xe554, 0xe555, 0xe556, 0xe557, 0xe558, 0xe559, 0xe55a, 0xe55b, 0xe55c, 0xe55d, 0xe55e, 0xe55f, 0xe560, 0xe561, 0xe562, 0xe563, 0xe564, 0xe565, 0xe566, 0xe567, 0xe568, 0xe569, 0xe56a, 0xe56b, 0xe56c, 0xe56d, 0xe56e, 0xe56f, 0xe570, 0xe571, 0xe572, 0xe573, 0xe574, 0xe575, 0xe576, 0xe577, 0xe578, 0xe579, 0xe57a, 0xe57b, 0xe57c, 0xe57d, 0xe57e, 0xe580, 0xe581, 0xe582, 0xe583, 0xe584, 0xe585, 0xe586, 0xe587, 0xe588, 0xe589, 0xe58a, 0xe58b, 0xe58c, 0xe58d, 0xe58e, 0xe58f, 0xe590, 0xe591, 0xe592, 0xe593, 0xe594, 0xe595, 0xe596, 0xe597, 0xe598, 0xe599, 0xe59a, 0xe59b, 0xe59c, 0xe59d, 0xe59e, 0xe59f, 0xe5a0, 0xe640, 0xe641, 0xe642, 0xe643, 0xe644, 0xe645, 0xe646, 0xe647, 0xe648, 0xe649, 0xe64a, 0xe64b, 0xe64c, 0xe64d, 0xe64e, 0xe64f, 0xe650, 0xe651, 0xe652, 0xe653, 0xe654, 0xe655, 0xe656, 0xe657, 0xe658, 0xe659, 0xe65a, 0xe65b, 0xe65c, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0xe661, 0xe662, 0xe663, 0xe664, 0xe665, 0xe666, 0xe667, 0xe668, 0xe669, 0xe66a, 0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, 0xe670, 0xe671, 0xe672, 0xe673, 0xe674, 0xe675, 0xe676, 0xe677, 0xe678, 0xe679, 0xe67a, 0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe680, 0xe681, 0xe682, 0xe683, 0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0xe689, 0xe68a, 0xe68b, 0xe68c, 0xe68d, 0xe68e, 0xe68f, 0xe690, 0xe691, 0xe692, 0xe693, 0xe694, 0xe695, 0xe696, 0xe697, 0xe698, 0xe699, 0xe69a, 0xe69b, 0xe69c, 0xe69d, 0xe69e, 0xe69f, 0xe6a0, 0xe740, 0xe741, 0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, 0xe748, 0xe749, 0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, 0xe750, 0xe751, 0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, 0xe758, 0xe759, 0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, 0xe760, 0xe761, 0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, 0xe768, 0xe769, 0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, 0xe770, 0xe771, 0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, 0xe778, 0xe779, 0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe780, 0xe781, 0xe782, 0xe783, 0xe784, 0xe785, 0xe786, 0xe787, 0xe788, 0xe789, 0xe78a, 0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791, 0xe792, 0xe793, 0xe794, 0xe795, 0xe796, 0xe797, 0xe798, 0xe799, 0xe79a, 0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, 0xe7a0, 0xe840, 0xe841, 0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, 0xe848, 0xe849, 0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xe84f, 0xe850, 0xe851, 0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857, 0xe858, 0xe859, 0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f, 0xe860, 0xe861, 0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867, 0xe868, 0xe869, 0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f, 0xe870, 0xe871, 0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877, 0xe878, 0xe879, 0xe87a, 0xe87b, 0xe87c, 0xe87d, 0xe87e, 0xe880, 0xe881, 0xe882, 0xe883, 0xe884, 0xe885, 0xe886, 0xe887, 0xe888, 0xe889, 0xe88a, 0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f, 0xe890, 0xe891, 0xe892, 0xe893, 0xe894, 0xe895, 0xe896, 0xe897, 0xe898, 0xe899, 0xe89a, 0xe89b, 0xe89c, 0xe89d, 0xe89e, 0xe89f, 0xe8a0, 0xe940, 0xe941, 0xe942, 0xe943, 0xe944, 0xe945, 0xe946, 0xe947, 0xe948, 0xe949, 0xe94a, 0xe94b, 0xe94c, 0xe94d, 0xe94e, 0xe94f, 0xe950, 0xe951, 0xe952, 0xe953, 0xe954, 0xe955, 0xe956, 0xe957, 0xe958, 0xe959, 0xe95a, 0xe95b, 0xe95c, 0xe95d, 0xe95e, 0xe95f, 0xe960, 0xe961, 0xe962, 0xe963, 0xe964, 0xe965, 0xe966, 0xe967, 0xe968, 0xe969, 0xe96a, 0xe96b, 0xe96c, 0xe96d, 0xe96e, 0xe96f, 0xe970, 0xe971, 0xe972, 0xe973, 0xe974, 0xe975, 0xe976, 0xe977, 0xe978, 0xe979, 0xe97a, 0xe97b, 0xe97c, 0xe97d, 0xe97e, 0xe980, 0xe981, 0xe982, 0xe983, 0xe984, 0xe985, 0xe986, 0xe987, 0xe988, 0xe989, 0xe98a, 0xe98b, 0xe98c, 0xe98d, 0xe98e, 0xe98f, 0xe990, 0xe991, 0xe992, 0xe993, 0xe994, 0xe995, 0xe996, 0xe997, 0xe998, 0xe999, 0xe99a, 0xe99b, 0xe99c, 0xe99d, 0xe99e, 0xe99f, 0xe9a0, 0xea40, 0xea41, 0xea42, 0xea43, 0xea44, 0xea45, 0xea46, 0xea47, 0xea48, 0xea49, 0xea4a, 0xea4b, 0xea4c, 0xea4d, 0xea4e, 0xea4f, 0xea50, 0xea51, 0xea52, 0xea53, 0xea54, 0xea55, 0xea56, 0xea57, 0xea58, 0xea59, 0xea5a, 0xea5b, 0xea5c, 0xea5d, 0xea5e, 0xea5f, 0xea60, 0xea61, 0xea62, 0xea63, 0xea64, 0xea65, 0xea66, 0xea67, 0xea68, 0xea69, 0xea6a, 0xea6b, 0xea6c, 0xea6d, 0xea6e, 0xea6f, 0xea70, 0xea71, 0xea72, 0xea73, 0xea74, 0xea75, 0xea76, 0xea77, 0xea78, 0xea79, 0xea7a, 0xea7b, 0xea7c, 0xea7d, 0xea7e, 0xea80, 0xea81, 0xea82, 0xea83, 0xea84, 0xea85, 0xea86, 0xea87, 0xea88, 0xea89, 0xea8a, 0xea8b, 0xea8c, 0xea8d, 0xea8e, 0xea8f, 0xea90, 0xea91, 0xea92, 0xea93, 0xea94, 0xea95, 0xea96, 0xea97, 0xea98, 0xea99, 0xea9a, 0xea9b, 0xea9c, 0xea9d, 0xea9e, 0xea9f, 0xeaa0, 0xeb40, 0xeb41, 0xeb42, 0xeb43, 0xeb44, 0xeb45, 0xeb46, 0xeb47, 0xeb48, 0xeb49, 0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0xeb51, 0xeb52, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59, 0xeb5a, 0xeb5b, 0xeb5c, 0xeb5d, 0xeb5e, 0xeb5f, 0xeb60, 0xeb61, 0xeb62, 0xeb63, 0xeb64, 0xeb65, 0xeb66, 0xeb67, 0xeb68, 0xeb69, 0xeb6a, 0xeb6b, 0xeb6c, 0xeb6d, 0xeb6e, 0xeb6f, 0xeb70, 0xeb71, 0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76, 0xeb77, 0xeb78, 0xeb79, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, 0xeb7e, 0xeb80, 0xeb81, 0xeb82, 0xeb83, 0xeb84, 0xeb85, 0xeb86, 0xeb87, 0xeb88, 0xeb89, 0xeb8a, 0xeb8b, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, 0xeb90, 0xeb91, 0xeb92, 0xeb93, 0xeb94, 0xeb95, 0xeb96, 0xeb97, 0xeb98, 0xeb99, 0xeb9a, 0xeb9b, 0xeb9c, 0xeb9d, 0xeb9e, 0xeb9f, 0xeba0, 0xec40, 0xec41, 0xec42, 0xec43, 0xec44, 0xec45, 0xec46, 0xec47, 0xec48, 0xec49, 0xec4a, 0xec4b, 0xec4c, 0xec4d, 0xec4e, 0xec4f, 0xec50, 0xec51, 0xec52, 0xec53, 0xec54, 0xec55, 0xec56, 0xec57, 0xec58, 0xec59, 0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f, 0xec60, 0xec61, 0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67, 0xec68, 0xec69, 0xec6a, 0xec6b, 0xec6c, 0xec6d, 0xec6e, 0xec6f, 0xec70, 0xec71, 0xec72, 0xec73, 0xec74, 0xec75, 0xec76, 0xec77, 0xec78, 0xec79, 0xec7a, 0xec7b, 0xec7c, 0xec7d, 0xec7e, 0xec80, 0xec81, 0xec82, 0xec83, 0xec84, 0xec85, 0xec86, 0xec87, 0xec88, 0xec89, 0xec8a, 0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xec8f, 0xec90, 0xec91, 0xec92, 0xec93, 0xec94, 0xec95, 0xec96, 0xec97, 0xec98, 0xec99, 0xec9a, 0xec9b, 0xec9c, 0xec9d, 0xec9e, 0xec9f, 0xeca0, 0xed40, 0xed41, 0xed42, 0xed43, 0xed44, 0xed45, 0xed46, 0xed47, 0xed48, 0xed49, 0xed4a, 0xed4b, 0xed4c, 0xed4d, 0xed4e, 0xed4f, 0xed50, 0xed51, 0xed52, 0xed53, 0xed54, 0xed55, 0xed56, 0xed57, 0xed58, 0xed59, 0xed5a, 0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, 0xed60, 0xed61, 0xed62, 0xed63, 0xed64, 0xed65, 0xed66, 0xed67, 0xed68, 0xed69, 0xed6a, 0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, 0xed70, 0xed71, 0xed72, 0xed73, 0xed74, 0xed75, 0xed76, 0xed77, 0xed78, 0xed79, 0xed7a, 0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed80, 0xed81, 0xed82, 0xed83, 0xed84, 0xed85, 0xed86, 0xed87, 0xed88, 0xed89, 0xed8a, 0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, 0xed90, 0xed91, 0xed92, 0xed93, 0xed94, 0xed95, 0xed96, 0xed97, 0xed98, 0xed99, 0xed9a, 0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, 0xeda0, 0xee40, 0xee41, 0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, 0xee48, 0xee49, 0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, 0xee50, 0xee51, 0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, 0xee58, 0xee59, 0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, 0xee60, 0xee61, 0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, 0xee68, 0xee69, 0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, 0xee70, 0xee71, 0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, 0xee78, 0xee79, 0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee80, 0xee81, 0xee82, 0xee83, 0xee84, 0xee85, 0xee86, 0xee87, 0xee88, 0xee89, 0xee8a, 0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, 0xee90, 0xee91, 0xee92, 0xee93, 0xee94, 0xee95, 0xee96, 0xee97, 0xee98, 0xee99, 0xee9a, 0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, 0xeea0, 0xef40, 0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47, 0xef48, 0xef49, 0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51, 0xef52, 0xef53, 0xef54, 0xef55, 0xef56, 0xef57, 0xef58, 0xef59, 0xef5a, 0xef5b, 0xef5c, 0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61, 0xef62, 0xef63, 0xef64, 0xef65, 0xef66, 0xef67, 0xef68, 0xef69, 0xef6a, 0xef6b, 0xef6c, 0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71, 0xef72, 0xef73, 0xef74, 0xef75, 0xef76, 0xef77, 0xef78, 0xef79, 0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef80, 0xef81, 0xef82, 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, 0xef88, 0xef89, 0xef8a, 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90, 0xef91, 0xef92, 0xef93, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98, 0xef99, 0xef9a, 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0, 0xf040, 0xf041, 0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047, 0xf048, 0xf049, 0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f, 0xf050, 0xf051, 0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057, 0xf058, 0xf059, 0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f, 0xf060, 0xf061, 0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067, 0xf068, 0xf069, 0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071, 0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077, 0xf078, 0xf079, 0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085, 0xf086, 0xf087, 0xf088, 0xf089, 0xf08a, 0xf08b, 0xf08c, 0xf08d, 0xf08e, 0xf08f, 0xf090, 0xf091, 0xf092, 0xf093, 0xf094, 0xf095, 0xf096, 0xf097, 0xf098, 0xf099, 0xf09a, 0xf09b, 0xf09c, 0xf09d, 0xf09e, 0xf09f, 0xf0a0, 0xf140, 0xf141, 0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147, 0xf148, 0xf149, 0xf14a, 0xf14b, 0xf14c, 0xf14d, 0xf14e, 0xf14f, 0xf150, 0xf151, 0xf152, 0xf153, 0xf154, 0xf155, 0xf156, 0xf157, 0xf158, 0xf159, 0xf15a, 0xf15b, 0xf15c, 0xf15d, 0xf15e, 0xf15f, 0xf160, 0xf161, 0xf162, 0xf163, 0xf164, 0xf165, 0xf166, 0xf167, 0xf168, 0xf169, 0xf16a, 0xf16b, 0xf16c, 0xf16d, 0xf16e, 0xf16f, 0xf170, 0xf171, 0xf172, 0xf173, 0xf174, 0xf175, 0xf176, 0xf177, 0xf178, 0xf179, 0xf17a, 0xf17b, 0xf17c, 0xf17d, 0xf17e, 0xf180, 0xf181, 0xf182, 0xf183, 0xf184, 0xf185, 0xf186, 0xf187, 0xf188, 0xf189, 0xf18a, 0xf18b, 0xf18c, 0xf18d, 0xf18e, 0xf18f, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf195, 0xf196, 0xf197, 0xf198, 0xf199, 0xf19a, 0xf19b, 0xf19c, 0xf19d, 0xf19e, 0xf19f, 0xf1a0, 0xf240, 0xf241, 0xf242, 0xf243, 0xf244, 0xf245, 0xf246, 0xf247, 0xf248, 0xf249, 0xf24a, 0xf24b, 0xf24c, 0xf24d, 0xf24e, 0xf24f, 0xf250, 0xf251, 0xf252, 0xf253, 0xf254, 0xf255, 0xf256, 0xf257, 0xf258, 0xf259, 0xf25a, 0xf25b, 0xf25c, 0xf25d, 0xf25e, 0xf25f, 0xf260, 0xf261, 0xf262, 0xf263, 0xf264, 0xf265, 0xf266, 0xf267, 0xf268, 0xf269, 0xf26a, 0xf26b, 0xf26c, 0xf26d, 0xf26e, 0xf26f, 0xf270, 0xf271, 0xf272, 0xf273, 0xf274, 0xf275, 0xf276, 0xf277, 0xf278, 0xf279, 0xf27a, 0xf27b, 0xf27c, 0xf27d, 0xf27e, 0xf280, 0xf281, 0xf282, 0xf283, 0xf284, 0xf285, 0xf286, 0xf287, 0xf288, 0xf289, 0xf28a, 0xf28b, 0xf28c, 0xf28d, 0xf28e, 0xf28f, 0xf290, 0xf291, 0xf292, 0xf293, 0xf294, 0xf295, 0xf296, 0xf297, 0xf298, 0xf299, 0xf29a, 0xf29b, 0xf29c, 0xf29d, 0xf29e, 0xf29f, 0xf2a0, 0xf340, 0xf341, 0xf342, 0xf343, 0xf344, 0xf345, 0xf346, 0xf347, 0xf348, 0xf349, 0xf34a, 0xf34b, 0xf34c, 0xf34d, 0xf34e, 0xf34f, 0xf350, 0xf351, 0xf352, 0xf353, 0xf354, 0xf355, 0xf356, 0xf357, 0xf358, 0xf359, 0xf35a, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361, 0xf362, 0xf363, 0xf364, 0xf365, 0xf366, 0xf367, 0xf368, 0xf369, 0xf36a, 0xf36b, 0xf36c, 0xf36d, 0xf36e, 0xf36f, 0xf370, 0xf371, 0xf372, 0xf373, 0xf374, 0xf375, 0xf376, 0xf377, 0xf378, 0xf379, 0xf37a, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf380, 0xf381, 0xf382, 0xf383, 0xf384, 0xf385, 0xf386, 0xf387, 0xf388, 0xf389, 0xf38a, 0xf38b, 0xf38c, 0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392, 0xf393, 0xf394, 0xf395, 0xf396, 0xf397, 0xf398, 0xf399, 0xf39a, 0xf39b, 0xf39c, 0xf39d, 0xf39e, 0xf39f, 0xf3a0, 0xf440, 0xf441, 0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf447, 0xf448, 0xf449, 0xf44a, 0xf44b, 0xf44c, 0xf44d, 0xf44e, 0xf44f, 0xf450, 0xf451, 0xf452, 0xf453, 0xf454, 0xf455, 0xf456, 0xf457, 0xf458, 0xf459, 0xf45a, 0xf45b, 0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, 0xf462, 0xf463, 0xf464, 0xf465, 0xf466, 0xf467, 0xf468, 0xf469, 0xf46a, 0xf46b, 0xf46c, 0xf46d, 0xf46e, 0xf46f, 0xf470, 0xf471, 0xf472, 0xf473, 0xf474, 0xf475, 0xf476, 0xf477, 0xf478, 0xf479, 0xf47a, 0xf47b, 0xf47c, 0xf47d, 0xf47e, 0xf480, 0xf481, 0xf482, 0xf483, 0xf484, 0xf485, 0xf486, 0xf487, 0xf488, 0xf489, 0xf48a, 0xf48b, 0xf48c, 0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0xf492, 0xf493, 0xf494, 0xf495, 0xf496, 0xf497, 0xf498, 0xf499, 0xf49a, 0xf49b, 0xf49c, 0xf49d, 0xf49e, 0xf49f, 0xf4a0, 0xf540, 0xf541, 0xf542, 0xf543, 0xf544, 0xf545, 0xf546, 0xf547, 0xf548, 0xf549, 0xf54a, 0xf54b, 0xf54c, 0xf54d, 0xf54e, 0xf54f, 0xf550, 0xf551, 0xf552, 0xf553, 0xf554, 0xf555, 0xf556, 0xf557, 0xf558, 0xf559, 0xf55a, 0xf55b, 0xf55c, 0xf55d, 0xf55e, 0xf55f, 0xf560, 0xf561, 0xf562, 0xf563, 0xf564, 0xf565, 0xf566, 0xf567, 0xf568, 0xf569, 0xf56a, 0xf56b, 0xf56c, 0xf56d, 0xf56e, 0xf56f, 0xf570, 0xf571, 0xf572, 0xf573, 0xf574, 0xf575, 0xf576, 0xf577, 0xf578, 0xf579, 0xf57a, 0xf57b, 0xf57c, 0xf57d, 0xf57e, 0xf580, 0xf581, 0xf582, 0xf583, 0xf584, 0xf585, 0xf586, 0xf587, 0xf588, 0xf589, 0xf58a, 0xf58b, 0xf58c, 0xf58d, 0xf58e, 0xf58f, 0xf590, 0xf591, 0xf592, 0xf593, 0xf594, 0xf595, 0xf596, 0xf597, 0xf598, 0xf599, 0xf59a, 0xf59b, 0xf59c, 0xf59d, 0xf59e, 0xf59f, 0xf5a0, 0xf640, 0xf641, 0xf642, 0xf643, 0xf644, 0xf645, 0xf646, 0xf647, 0xf648, 0xf649, 0xf64a, 0xf64b, 0xf64c, 0xf64d, 0xf64e, 0xf64f, 0xf650, 0xf651, 0xf652, 0xf653, 0xf654, 0xf655, 0xf656, 0xf657, 0xf658, 0xf659, 0xf65a, 0xf65b, 0xf65c, 0xf65d, 0xf65e, 0xf65f, 0xf660, 0xf661, 0xf662, 0xf663, 0xf664, 0xf665, 0xf666, 0xf667, 0xf668, 0xf669, 0xf66a, 0xf66b, 0xf66c, 0xf66d, 0xf66e, 0xf66f, 0xf670, 0xf671, 0xf672, 0xf673, 0xf674, 0xf675, 0xf676, 0xf677, 0xf678, 0xf679, 0xf67a, 0xf67b, 0xf67c, 0xf67d, 0xf67e, 0xf680, 0xf681, 0xf682, 0xf683, 0xf684, 0xf685, 0xf686, 0xf687, 0xf688, 0xf689, 0xf68a, 0xf68b, 0xf68c, 0xf68d, 0xf68e, 0xf68f, 0xf690, 0xf691, 0xf692, 0xf693, 0xf694, 0xf695, 0xf696, 0xf697, 0xf698, 0xf699, 0xf69a, 0xf69b, 0xf69c, 0xf69d, 0xf69e, 0xf69f, 0xf6a0, 0xf740, 0xf741, 0xf742, 0xf743, 0xf744, 0xf745, 0xf746, 0xf747, 0xf748, 0xf749, 0xf74a, 0xf74b, 0xf74c, 0xf74d, 0xf74e, 0xf74f, 0xf750, 0xf751, 0xf752, 0xf753, 0xf754, 0xf755, 0xf756, 0xf757, 0xf758, 0xf759, 0xf75a, 0xf75b, 0xf75c, 0xf75d, 0xf75e, 0xf75f, 0xf760, 0xf761, 0xf762, 0xf763, 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0xf779, 0xf77a, 0xf77b, 0xf77c, 0xf77d, 0xf77e, 0xf780, 0xf781, 0xf782, 0xf783, 0xf784, 0xf785, 0xf786, 0xf787, 0xf788, 0xf789, 0xf78a, 0xf78b, 0xf78c, 0xf78d, 0xf78e, 0xf78f, 0xf790, 0xf791, 0xf792, 0xf793, 0xf794, 0xf795, 0xf796, 0xf797, 0xf798, 0xf799, 0xf79a, 0xf79b, 0xf79c, 0xf79d, 0xf79e, 0xf79f, 0xf7a0, 0xf840, 0xf841, 0xf842, 0xf843, 0xf844, 0xf845, 0xf846, 0xf847, 0xf848, 0xf849, 0xf84a, 0xf84b, 0xf84c, 0xf84d, 0xf84e, 0xf84f, 0xf850, 0xf851, 0xf852, 0xf853, 0xf854, 0xf855, 0xf856, 0xf857, 0xf858, 0xf859, 0xf85a, 0xf85b, 0xf85c, 0xf85d, 0xf85e, 0xf85f, 0xf860, 0xf861, 0xf862, 0xf863, 0xf864, 0xf865, 0xf866, 0xf867, 0xf868, 0xf869, 0xf86a, 0xf86b, 0xf86c, 0xf86d, 0xf86e, 0xf86f, 0xf870, 0xf871, 0xf872, 0xf873, 0xf874, 0xf875, 0xf876, 0xf877, 0xf878, 0xf879, 0xf87a, 0xf87b, 0xf87c, 0xf87d, 0xf87e, 0xf880, 0xf881, 0xf882, 0xf883, 0xf884, 0xf885, 0xf886, 0xf887, 0xf888, 0xf889, 0xf88a, 0xf88b, 0xf88c, 0xf88d, 0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892, 0xf893, 0xf894, 0xf895, 0xf896, 0xf897, 0xf898, 0xf899, 0xf89a, 0xf89b, 0xf89c, 0xf89d, 0xf89e, 0xf89f, 0xf8a0, 0xf940, 0xf941, 0xf942, 0xf943, 0xf944, 0xf945, 0xf946, 0xf947, 0xf948, 0xf949, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951, 0xf952, 0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0xf958, 0xf959, 0xf95a, 0xf95b, 0xf95c, 0xf95d, 0xf95e, 0xf95f, 0xf960, 0xf961, 0xf962, 0xf963, 0xf964, 0xf965, 0xf966, 0xf967, 0xf968, 0xf969, 0xf96a, 0xf96b, 0xf96c, 0xf96d, 0xf96e, 0xf96f, 0xf970, 0xf971, 0xf972, 0xf973, 0xf974, 0xf975, 0xf976, 0xf977, 0xf978, 0xf979, 0xf97a, 0xf97b, 0xf97c, 0xf97d, 0xf97e, 0xf980, 0xf981, 0xf982, 0xf983, 0xf984, 0xf985, 0xf986, 0xf987, 0xf988, 0xf989, 0xf98a, 0xf98b, 0xf98c, 0xf98d, 0xf98e, 0xf98f, 0xf990, 0xf991, 0xf992, 0xf993, 0xf994, 0xf995, 0xf996, 0xf997, 0xf998, 0xf999, 0xf99a, 0xf99b, 0xf99c, 0xf99d, 0xf99e, 0xf99f, 0xf9a0, 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44, 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, 0xfa4a, 0xfa4b, 0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa54, 0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59, 0xfa5a, 0xfa5b, 0xfa5c, 0xfa5d, 0xfa5e, 0xfa5f, 0xfa60, 0xfa61, 0xfa62, 0xfa63, 0xfa64, 0xfa65, 0xfa66, 0xfa67, 0xfa68, 0xfa69, 0xfa6a, 0xfa6b, 0xfa6c, 0xfa6d, 0xfa6e, 0xfa6f, 0xfa70, 0xfa71, 0xfa72, 0xfa73, 0xfa74, 0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79, 0xfa7a, 0xfa7b, 0xfa7c, 0xfa7d, 0xfa7e, 0xfa80, 0xfa81, 0xfa82, 0xfa83, 0xfa84, 0xfa85, 0xfa86, 0xfa87, 0xfa88, 0xfa89, 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d, 0xfa8e, 0xfa8f, 0xfa90, 0xfa91, 0xfa92, 0xfa93, 0xfa94, 0xfa95, 0xfa96, 0xfa97, 0xfa98, 0xfa99, 0xfa9a, 0xfa9b, 0xfa9c, 0xfa9d, 0xfa9e, 0xfa9f, 0xfaa0, 0xfb40, 0xfb41, 0xfb42, 0xfb43, 0xfb44, 0xfb45, 0xfb46, 0xfb47, 0xfb48, 0xfb49, 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, 0xfb52, 0xfb53, 0xfb54, 0xfb55, 0xfb56, 0xfb57, 0xfb58, 0xfb59, 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5e, 0xfb5f, 0xfb60, 0xfb61, 0xfb62, 0xfb63, 0xfb64, 0xfb65, 0xfb66, 0xfb67, 0xfb68, 0xfb69, 0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e, 0xfb6f, 0xfb70, 0xfb71, 0xfb72, 0xfb73, 0xfb74, 0xfb75, 0xfb76, 0xfb77, 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xfb7e, 0xfb80, 0xfb81, 0xfb82, 0xfb83, 0xfb84, 0xfb85, 0xfb86, 0xfb87, 0xfb88, 0xfb89, 0xfb8a, 0xfb8b, 0xfb8c, 0xfb8d, 0xfb8e, 0xfb8f, 0xfb90, 0xfb91, 0xfb92, 0xfb93, 0xfb94, 0xfb95, 0xfb96, 0xfb97, 0xfb98, 0xfb99, 0xfb9a, 0xfb9b, 0xfb9c, 0xfb9d, 0xfb9e, 0xfb9f, 0xfba0, 0xfc40, 0xfc41, 0xfc42, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc47, 0xfc48, 0xfc49, 0xfc4a, 0xfc4b, 0xfc4c, 0xfc4d, 0xfc4e, 0xfc4f, 0xfc50, 0xfc51, 0xfc52, 0xfc53, 0xfc54, 0xfc55, 0xfc56, 0xfc57, 0xfc58, 0xfc59, 0xfc5a, 0xfc5b, 0xfc5c, 0xfc5d, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61, 0xfc62, 0xfc63, 0xfc64, 0xfc65, 0xfc66, 0xfc67, 0xfc68, 0xfc69, 0xfc6a, 0xfc6b, 0xfc6c, 0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71, 0xfc72, 0xfc73, 0xfc74, 0xfc75, 0xfc76, 0xfc77, 0xfc78, 0xfc79, 0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc80, 0xfc81, 0xfc82, 0xfc83, 0xfc84, 0xfc85, 0xfc86, 0xfc87, 0xfc88, 0xfc89, 0xfc8a, 0xfc8b, 0xfc8c, 0xfc8d, 0xfc8e, 0xfc8f, 0xfc90, 0xfc91, 0xfc92, 0xfc93, 0xfc94, 0xfc95, 0xfc96, 0xfc97, 0xfc98, 0xfc99, 0xfc9a, 0xfc9b, 0xfc9c, 0xfc9d, 0xfc9e, 0xfc9f, 0xfca0, 0xfd40, 0xfd41, 0xfd42, 0xfd43, 0xfd44, 0xfd45, 0xfd46, 0xfd47, 0xfd48, 0xfd49, 0xfd4a, 0xfd4b, 0xfd4c, 0xfd4d, 0xfd4e, 0xfd4f, 0xfd50, 0xfd51, 0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57, 0xfd58, 0xfd59, 0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d, 0xfd5e, 0xfd5f, 0xfd60, 0xfd61, 0xfd62, 0xfd63, 0xfd64, 0xfd65, 0xfd66, 0xfd67, 0xfd68, 0xfd69, 0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d, 0xfd6e, 0xfd6f, 0xfd70, 0xfd71, 0xfd72, 0xfd73, 0xfd74, 0xfd75, 0xfd76, 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, 0xfd7e, 0xfd80, 0xfd81, 0xfd82, 0xfd83, 0xfd84, 0xfd85, 0xfd86, 0xfd87, 0xfd88, 0xfd89, 0xfd8a, 0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, 0xfd90, 0xfd91, 0xfd92, 0xfd93, 0xfd94, 0xfd95, 0xfd96, 0xfd97, 0xfd98, 0xfd99, 0xfd9a, 0xfd9b, 0xfd9c, 0xfd9d, 0xfd9e, 0xfd9f, 0xfda0, 0xfe40, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfe45, 0xfe46, 0xfe47, 0xfe48, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xa955, 0xa968, 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, 0xa96f, 0xa970, 0xa971, 0xa972, 0xa973, 0xa974, 0xa975, 0xa976, 0xa977, 0xa978, 0xa979, 0xa97a, 0xa97b, 0xa97c, 0xa97d, 0xa97e, 0xa980, 0xa981, 0xa982, 0xa983, 0xa984, 0xa985, 0xa986, 0xa987, 0xa988, 0xa956, 0xa957, }; static const Summary16 gbkext_inv_uni2indx_page02[14] = { /* 0x0200 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0c00 }, { 2, 0x0200 }, }; static const Summary16 gbkext_inv_uni2indx_page20[44] = { /* 0x2000 */ { 3, 0x0000 }, { 3, 0x0029 }, { 6, 0x0020 }, { 7, 0x0020 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, { 8, 0x0000 }, /* 0x2100 */ { 8, 0x0220 }, { 10, 0x0000 }, { 10, 0x0002 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x0000 }, { 11, 0x03c0 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, { 15, 0x0000 }, /* 0x2200 */ { 15, 0x0000 }, { 15, 0x8020 }, { 17, 0x0008 }, { 18, 0x0000 }, { 18, 0x0000 }, { 18, 0x0004 }, { 19, 0x00c0 }, { 21, 0x0000 }, { 21, 0x0000 }, { 21, 0x0020 }, { 22, 0x0000 }, { 22, 0x8000 }, }; static const Summary16 gbkext_inv_uni2indx_page25[17] = { /* 0x2500 */ { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0x0000 }, { 23, 0xffff }, { 39, 0xffff }, { 55, 0x000f }, { 59, 0xfffe }, { 74, 0x0038 }, { 77, 0x0000 }, { 77, 0x3000 }, { 79, 0x0000 }, { 79, 0x0000 }, { 79, 0x003c }, { 83, 0x0000 }, /* 0x2600 */ { 83, 0x0200 }, }; static const Summary16 gbkext_inv_uni2indx_page30[16] = { /* 0x3000 */ { 84, 0x00c0 }, { 86, 0x6004 }, { 89, 0x03fe }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x0000 }, { 98, 0x7800 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x0000 }, { 102, 0x7000 }, }; static const Summary16 gbkext_inv_uni2indx_page32[30] = { /* 0x3200 */ { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0000 }, { 105, 0x0002 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0000 }, { 106, 0x0008 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, /* 0x3300 */ { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0x0000 }, { 107, 0xc000 }, { 109, 0x7000 }, { 112, 0x0002 }, { 113, 0x0000 }, { 113, 0x4010 }, { 115, 0x0026 }, }; static const Summary16 gbkext_inv_uni2indx_page4e[1307] = { /* 0x4e00 */ { 118, 0x8074 }, { 123, 0x8084 }, { 126, 0xc24b }, { 133, 0x10aa }, { 138, 0x0457 }, { 144, 0x0ca2 }, { 149, 0xfdbc }, { 161, 0xbff4 }, { 173, 0x04bf }, { 181, 0x72c1 }, { 188, 0x8408 }, { 191, 0x73d3 }, { 201, 0x9100 }, { 204, 0x1c05 }, { 209, 0xe2c5 }, { 217, 0x5712 }, /* 0x4f00 */ { 224, 0x19fd }, { 234, 0x307c }, { 241, 0x730a }, { 248, 0xcaaa }, { 256, 0x1fb7 }, { 267, 0x0054 }, { 270, 0x6d46 }, { 278, 0x27a6 }, { 286, 0x54e7 }, { 295, 0xd76d }, { 306, 0x2816 }, { 311, 0x7fdf }, { 325, 0x3bc7 }, { 335, 0x0a7c }, { 342, 0x18b5 }, { 349, 0xbaf5 }, /* 0x5000 */ { 360, 0x4fff }, { 373, 0x68eb }, { 382, 0x889d }, { 389, 0xabff }, { 402, 0x2e77 }, { 412, 0xebdf }, { 425, 0xefdf }, { 439, 0x373f }, { 450, 0xdede }, { 462, 0xffff }, { 478, 0xec57 }, { 488, 0xf3fb }, { 501, 0x7fff }, { 516, 0xfbbf }, { 530, 0x8f3f }, { 541, 0xf7d7 }, /* 0x5100 */ { 554, 0xf73f }, { 567, 0xfffb }, { 582, 0xfffd }, { 597, 0x7fff }, { 612, 0xd484 }, { 618, 0xeb8d }, { 628, 0x86db }, { 637, 0xc404 }, { 641, 0xccd8 }, { 649, 0xe51b }, { 658, 0x67ca }, { 667, 0xc710 }, { 673, 0x652e }, { 681, 0xd7fd }, { 694, 0x57ec }, { 704, 0x4096 }, /* 0x5200 */ { 709, 0x9a30 }, { 715, 0xd039 }, { 722, 0x94ee }, { 731, 0x5036 }, { 737, 0xcbf0 }, { 746, 0xafac }, { 756, 0x795d }, { 766, 0x5ffb }, { 779, 0xfef9 }, { 792, 0x17f6 }, { 802, 0xc0f0 }, { 808, 0x3ff1 }, { 819, 0xf577 }, { 831, 0x7eba }, { 842, 0xffef }, { 857, 0x39fe }, /* 0x5300 */ { 868, 0x5e9e }, { 878, 0xd91e }, { 887, 0xbbb4 }, { 897, 0x31ff }, { 908, 0x3855 }, { 915, 0x2b11 }, { 921, 0x3520 }, { 926, 0x7a44 }, { 933, 0xc58b }, { 941, 0x5adf }, { 952, 0xbc93 }, { 961, 0x77bf }, { 974, 0xc0f9 }, { 982, 0x742d }, { 990, 0x0086 }, { 993, 0xc410 }, /* 0x5400 */ { 997, 0x08a5 }, { 1002, 0x1710 }, { 1007, 0x0434 }, { 1011, 0xa4c9 }, { 1018, 0xf2b6 }, { 1028, 0xe402 }, { 1033, 0xfeab }, { 1045, 0xc611 }, { 1051, 0x27aa }, { 1059, 0xd18a }, { 1066, 0x4027 }, { 1071, 0x56e5 }, { 1080, 0x0c28 }, { 1084, 0x0940 }, { 1087, 0x981f }, { 1095, 0x4bf3 }, /* 0x5500 */ { 1105, 0x7d3d }, { 1116, 0xf7ec }, { 1128, 0x2b62 }, { 1135, 0x2f74 }, { 1144, 0xf9a5 }, { 1154, 0xef9e }, { 1166, 0x8b0d }, { 1173, 0xa61f }, { 1182, 0x7060 }, { 1187, 0x4ced }, { 1196, 0xff7f }, { 1211, 0x9555 }, { 1219, 0xcdcf }, { 1230, 0x4fa1 }, { 1238, 0x6285 }, { 1244, 0x9f53 }, /* 0x5600 */ { 1254, 0x2cfc }, { 1263, 0x36ff }, { 1275, 0xcf67 }, { 1286, 0x75a9 }, { 1295, 0x8fff }, { 1308, 0xec6f }, { 1319, 0xe0eb }, { 1328, 0xe7bd }, { 1340, 0x3f9f }, { 1352, 0xfff7 }, { 1367, 0x7ff7 }, { 1381, 0xef7f }, { 1395, 0xfbff }, { 1410, 0x136f }, { 1419, 0xd7e8 }, { 1429, 0x19cc }, /* 0x5700 */ { 1436, 0xf8a7 }, { 1446, 0x6fff }, { 1460, 0x08f7 }, { 1468, 0xb1f6 }, { 1478, 0x0b7a }, { 1486, 0x037c }, { 1493, 0x50ac }, { 1499, 0xe737 }, { 1510, 0xe783 }, { 1519, 0xf7f3 }, { 1532, 0x9520 }, { 1537, 0xfeeb }, { 1550, 0x37f3 }, { 1561, 0x58cb }, { 1569, 0x5fee }, { 1581, 0xd8ef }, /* 0x5800 */ { 1592, 0xd73a }, { 1602, 0xbddd }, { 1614, 0xfbec }, { 1626, 0xffde }, { 1640, 0xcfef }, { 1653, 0xbeed }, { 1665, 0xe7df }, { 1678, 0xbfff }, { 1693, 0xfdd4 }, { 1704, 0x39f3 }, { 1714, 0xfcff }, { 1728, 0xefff }, { 1743, 0xffdd }, { 1757, 0xffdd }, { 1771, 0xa7ef }, { 1783, 0xfdb6 }, /* 0x5900 */ { 1795, 0x5f6b }, { 1806, 0x698f }, { 1815, 0x114f }, { 1822, 0xe86d }, { 1831, 0x3469 }, { 1838, 0xfa0d }, { 1847, 0xffda }, { 1860, 0xdca7 }, { 1870, 0xda21 }, { 1877, 0xbd33 }, { 1887, 0x30c7 }, { 1894, 0xb5fb }, { 1906, 0xf3bf }, { 1919, 0xca60 }, { 1925, 0xeed7 }, { 1937, 0x75ff }, /* 0x5a00 */ { 1950, 0xec05 }, { 1957, 0x6ef5 }, { 1968, 0xfdd6 }, { 1980, 0xefa9 }, { 1991, 0xf9be }, { 2003, 0xfbdf }, { 2017, 0xfb7b }, { 2030, 0x7b0f }, { 2040, 0xffff }, { 2056, 0xf3fb }, { 2069, 0xfbff }, { 2084, 0xbed3 }, { 2095, 0xedf9 }, { 2107, 0xeeab }, { 2118, 0xf5b4 }, { 2128, 0xfffd }, /* 0x5b00 */ { 2143, 0xfdff }, { 2158, 0xff3f }, { 2172, 0xffff }, { 2188, 0xff6b }, { 2201, 0xfffe }, { 2216, 0x4044 }, { 2219, 0xe983 }, { 2227, 0xdbd4 }, { 2237, 0x6444 }, { 2242, 0x8057 }, { 2248, 0xf380 }, { 2255, 0x1c86 }, { 2261, 0xef0b }, { 2271, 0x1ff2 }, { 2281, 0xbecd }, { 2292, 0x60fe }, /* 0x5c00 */ { 2301, 0x79ad }, { 2311, 0xca8d }, { 2319, 0xef4b }, { 2330, 0x00ed }, { 2336, 0x30d8 }, { 2342, 0xbddc }, { 2353, 0x3f94 }, { 2362, 0x79fd }, { 2374, 0xcef9 }, { 2385, 0xe02c }, { 2391, 0xc5f3 }, { 2401, 0x5e55 }, { 2410, 0xf7ed }, { 2423, 0xfdfb }, { 2437, 0xda8d }, { 2446, 0xf7fe }, /* 0x5d00 */ { 2460, 0xbf33 }, { 2471, 0xb7af }, { 2483, 0x9d2f }, { 2493, 0x9fef }, { 2506, 0xe37f }, { 2518, 0xd6ff }, { 2531, 0x65ff }, { 2543, 0xffef }, { 2558, 0xfffb }, { 2573, 0xddff }, { 2587, 0xffff }, { 2603, 0xff7f }, { 2618, 0xdfdf }, { 2632, 0x97ff }, { 2645, 0x3419 }, { 2651, 0x9f61 }, /* 0x5e00 */ { 2660, 0x6e91 }, { 2668, 0xc08c }, { 2673, 0x9f3f }, { 2685, 0xc67d }, { 2695, 0xefcb }, { 2707, 0xb7cf }, { 2719, 0xfff9 }, { 2733, 0x42a3 }, { 2739, 0x732e }, { 2748, 0x2904 }, { 2752, 0xdf1e }, { 2763, 0xbc17 }, { 2772, 0xf9ff }, { 2786, 0xf7b1 }, { 2797, 0xfaff }, { 2811, 0x3b2f }, /* 0x5f00 */ { 2821, 0x72e0 }, { 2828, 0x7655 }, { 2837, 0x591e }, { 2845, 0xe9fd }, { 2857, 0xfffe }, { 2872, 0xde12 }, { 2880, 0xc9a9 }, { 2888, 0xe574 }, { 2897, 0xe048 }, { 2902, 0xec5a }, { 2911, 0x9afd }, { 2922, 0xcf5f }, { 2934, 0x4d87 }, { 2942, 0xdc38 }, { 2950, 0x936c }, { 2958, 0x16dd }, /* 0x6000 */ { 2967, 0x1b80 }, { 2972, 0xc58b }, { 2980, 0x701c }, { 2986, 0x67df }, { 2998, 0xd7f1 }, { 3009, 0xd9da }, { 3019, 0x4063 }, { 3024, 0x40b6 }, { 3030, 0xcde7 }, { 3041, 0x53ab }, { 3050, 0x46b6 }, { 3058, 0xe6e9 }, { 3068, 0xf39f }, { 3080, 0x4add }, { 3089, 0x043e }, { 3095, 0xf9a6 }, /* 0x6100 */ { 3105, 0x1cbc }, { 3113, 0x7bdf }, { 3126, 0xf726 }, { 3136, 0x7fff }, { 3151, 0xaaff }, { 3163, 0xdfdd }, { 3176, 0xfe7b }, { 3189, 0xff5e }, { 3202, 0xb7ff }, { 3216, 0xdfef }, { 3230, 0xec7f }, { 3242, 0xbf7f }, { 3256, 0xf2fb }, { 3268, 0xffe9 }, { 3281, 0xffbf }, { 3296, 0x7fdf }, /* 0x6200 */ { 3310, 0x02bf }, { 3318, 0x7218 }, { 3324, 0xabc9 }, { 3333, 0x1f67 }, { 3343, 0x8474 }, { 3349, 0xf6e1 }, { 3359, 0x0137 }, { 3365, 0x2db6 }, { 3374, 0xf9ee }, { 3386, 0x7211 }, { 3392, 0xe6c8 }, { 3400, 0x45dd }, { 3409, 0x880b }, { 3414, 0x6022 }, { 3418, 0x0c13 }, { 3423, 0x0f25 }, /* 0x6300 */ { 3430, 0xbc79 }, { 3440, 0x13bd }, { 3449, 0x72c0 }, { 3455, 0xd9fb }, { 3467, 0x0593 }, { 3473, 0x3fde }, { 3485, 0x9d71 }, { 3494, 0xf33d }, { 3505, 0x287a }, { 3512, 0xfeba }, { 3524, 0x8852 }, { 3529, 0xaa66 }, { 3537, 0x1daf }, { 3547, 0xbfba }, { 3559, 0xd9f4 }, { 3569, 0x5eab }, /* 0x6400 */ { 3579, 0x67d8 }, { 3588, 0xa7e6 }, { 3598, 0xcbbc }, { 3608, 0x5bef }, { 3620, 0xfa0d }, { 3629, 0xbeeb }, { 3641, 0xdd7f }, { 3654, 0xf8ff }, { 3667, 0xff4b }, { 3679, 0xbd99 }, { 3689, 0x8def }, { 3700, 0xea5e }, { 3710, 0x9fda }, { 3721, 0xbe7a }, { 3732, 0xffab }, { 3745, 0xffff }, /* 0x6500 */ { 3761, 0xfdfe }, { 3775, 0xfefb }, { 3789, 0x37df }, { 3801, 0x348f }, { 3809, 0x6cdf }, { 3820, 0x959d }, { 3829, 0xe7b3 }, { 3840, 0xff6a }, { 3852, 0xe77f }, { 3865, 0x6574 }, { 3873, 0x554d }, { 3881, 0xcdfe }, { 3893, 0x2785 }, { 3900, 0xff3b }, { 3913, 0x0c1a }, { 3918, 0xfb3c }, /* 0x6600 */ { 3929, 0x2bb2 }, { 3937, 0x5dc7 }, { 3947, 0x5e5e }, { 3957, 0xaf8d }, { 3967, 0x67f5 }, { 3978, 0x7b03 }, { 3986, 0x3ead }, { 3996, 0xbb2e }, { 4006, 0xef6b }, { 4018, 0xdf3d }, { 4030, 0xbe7f }, { 4043, 0xbdef }, { 4056, 0xffff }, { 4072, 0xc5ff }, { 4084, 0xfdbf }, { 4098, 0x2d62 }, /* 0x6700 */ { 4105, 0xd0fe }, { 4115, 0x574e }, { 4124, 0x42bf }, { 4133, 0xdbcd }, { 4144, 0x2cb2 }, { 4151, 0x2fb4 }, { 4160, 0x58dc }, { 4168, 0x2f52 }, { 4176, 0xf56d }, { 4187, 0x8a5e }, { 4195, 0x5253 }, { 4202, 0xfe16 }, { 4212, 0x7fe5 }, { 4224, 0x88e0 }, { 4229, 0x6dda }, { 4239, 0x5fe4 }, /* 0x6800 */ { 4249, 0x205e }, { 4255, 0xdf35 }, { 4266, 0xf9fd }, { 4279, 0x8c73 }, { 4287, 0xa880 }, { 4291, 0xffc4 }, { 4302, 0xf400 }, { 4307, 0xff2f }, { 4320, 0x7f95 }, { 4331, 0xff77 }, { 4345, 0x5e3b }, { 4355, 0xffd6 }, { 4368, 0xd5fa }, { 4379, 0xfadb }, { 4391, 0xbff6 }, { 4404, 0xe9dc }, /* 0x6900 */ { 4414, 0x97dd }, { 4425, 0x7ffa }, { 4438, 0xdfee }, { 4451, 0x5dee }, { 4462, 0xfffb }, { 4477, 0x9b6f }, { 4488, 0xb7b6 }, { 4499, 0xec7d }, { 4510, 0xdc2a }, { 4518, 0xe6cf }, { 4529, 0xd67f }, { 4541, 0xf76d }, { 4553, 0xabfd }, { 4565, 0x77ee }, { 4577, 0xdffe }, { 4591, 0x5ffb }, /* 0x6a00 */ { 4604, 0xfbff }, { 4619, 0x7e7f }, { 4632, 0x7afd }, { 4644, 0x9fdd }, { 4656, 0xff6f }, { 4670, 0xf4fe }, { 4682, 0xffdd }, { 4696, 0xedfd }, { 4709, 0xbfee }, { 4722, 0xff7c }, { 4735, 0xe5fe }, { 4747, 0xffff }, { 4763, 0xffff }, { 4779, 0xffff }, { 4795, 0xffff }, { 4811, 0xffff }, /* 0x6b00 */ { 4827, 0xffff }, { 4843, 0xffff }, { 4859, 0xff60 }, { 4869, 0xb97b }, { 4880, 0xed37 }, { 4891, 0xfdff }, { 4906, 0xfb03 }, { 4915, 0xe5ff }, { 4928, 0xd121 }, { 4934, 0xf3b3 }, { 4945, 0xfbfd }, { 4959, 0x7f47 }, { 4970, 0x57d9 }, { 4980, 0xf503 }, { 4988, 0x73fd }, { 5000, 0xddd7 }, /* 0x6c00 */ { 5012, 0x5f1f }, { 5023, 0x7084 }, { 5028, 0x3829 }, { 5034, 0xdeca }, { 5044, 0xf938 }, { 5053, 0x074e }, { 5060, 0xf8ec }, { 5070, 0x9daa }, { 5079, 0x6c91 }, { 5086, 0x75e6 }, { 5096, 0x9105 }, { 5101, 0x04f1 }, { 5107, 0xe9cf }, { 5118, 0xb706 }, { 5126, 0x32d0 }, { 5132, 0x8214 }, /* 0x6d00 */ { 5136, 0xa76d }, { 5146, 0xb17b }, { 5156, 0xb35f }, { 5167, 0x85d1 }, { 5174, 0x1215 }, { 5179, 0xa9e1 }, { 5187, 0x39b6 }, { 5196, 0xee6f }, { 5208, 0xacdb }, { 5218, 0x17c5 }, { 5226, 0x3024 }, { 5230, 0x7edb }, { 5242, 0xe70e }, { 5251, 0x9cbd }, { 5261, 0xa7ac }, { 5270, 0xe575 }, /* 0x6e00 */ { 5280, 0x8bdf }, { 5291, 0xdb2c }, { 5300, 0x55c4 }, { 5307, 0xfaeb }, { 5319, 0x9fe7 }, { 5331, 0x76a7 }, { 5341, 0xb7ff }, { 5355, 0x3fff }, { 5369, 0x7d97 }, { 5380, 0x6efe }, { 5392, 0x7b5b }, { 5403, 0xd329 }, { 5411, 0x7779 }, { 5422, 0x3b45 }, { 5430, 0xfc88 }, { 5438, 0xfdef }, /* 0x6f00 */ { 5452, 0x7dbb }, { 5464, 0xffc7 }, { 5477, 0x51ee }, { 5486, 0xbfb5 }, { 5498, 0xd73f }, { 5510, 0xaeff }, { 5523, 0x9fbb }, { 5535, 0xeaeb }, { 5546, 0x8cef }, { 5556, 0xefff }, { 5571, 0xff7d }, { 5585, 0xfdb7 }, { 5598, 0xfdfa }, { 5611, 0xbff9 }, { 5624, 0x3ffc }, { 5636, 0xffff }, /* 0x7000 */ { 5652, 0xffff }, { 5668, 0xf3fd }, { 5681, 0xfff7 }, { 5696, 0xfddf }, { 5710, 0x6fff }, { 5724, 0xbfff }, { 5739, 0x47ff }, { 5751, 0x2e9e }, { 5760, 0xb9de }, { 5771, 0xcd8b }, { 5780, 0x07ff }, { 5791, 0xc475 }, { 5799, 0xfaf0 }, { 5809, 0x74ff }, { 5821, 0x442f }, { 5828, 0xdd7f }, /* 0x7100 */ { 5841, 0xf9ff }, { 5855, 0xf896 }, { 5864, 0x7fbf }, { 5878, 0xffbc }, { 5891, 0xabdf }, { 5903, 0xafff }, { 5917, 0xbe2f }, { 5928, 0xdaf3 }, { 5939, 0x7bef }, { 5952, 0x7cef }, { 5964, 0xeefe }, { 5977, 0xfdd7 }, { 5990, 0xbff7 }, { 6004, 0xffcf }, { 6018, 0xbf5e }, { 6030, 0xfdff }, /* 0x7200 */ { 6045, 0xffbf }, { 6060, 0xdfff }, { 6075, 0xeaff }, { 6088, 0x541c }, { 6094, 0xce7f }, { 6106, 0x55bb }, { 6116, 0x3d39 }, { 6125, 0x39db }, { 6135, 0x53ec }, { 6144, 0x7ffb }, { 6158, 0x4fff }, { 6171, 0xfc2e }, { 6181, 0x9ee1 }, { 6190, 0xbd7a }, { 6201, 0x0cfc }, { 6209, 0xe260 }, /* 0x7300 */ { 6215, 0xbbf5 }, { 6227, 0x8717 }, { 6235, 0xa1d9 }, { 6243, 0x3c6d }, { 6252, 0xdfff }, { 6267, 0xff7a }, { 6280, 0x4ffe }, { 6292, 0xbfff }, { 6307, 0xb56f }, { 6318, 0x77bd }, { 6330, 0x35fb }, { 6341, 0xf372 }, { 6351, 0x58fa }, { 6360, 0xbdfc }, { 6372, 0xdd5e }, { 6383, 0xfffb }, /* 0x7400 */ { 6398, 0x7997 }, { 6408, 0xf3fe }, { 6421, 0xaa9b }, { 6430, 0xef86 }, { 6440, 0xfffd }, { 6455, 0x215f }, { 6463, 0xdfff }, { 6478, 0xbf3e }, { 6490, 0xb774 }, { 6500, 0xaffe }, { 6513, 0xfc7f }, { 6526, 0xfbff }, { 6541, 0xffff }, { 6557, 0xaffb }, { 6570, 0x3fa2 }, { 6579, 0x7f2f }, /* 0x7500 */ { 6591, 0x5fef }, { 6604, 0x68f5 }, { 6613, 0x44df }, { 6622, 0xb250 }, { 6628, 0x26de }, { 6637, 0xe1ef }, { 6648, 0xfb9f }, { 6661, 0x7ceb }, { 6672, 0x77b7 }, { 6684, 0x5929 }, { 6691, 0x27c4 }, { 6698, 0x8cc0 }, { 6703, 0xd843 }, { 6710, 0xb68b }, { 6719, 0xf223 }, { 6727, 0x6dec }, /* 0x7600 */ { 6737, 0xebd4 }, { 6747, 0x745e }, { 6756, 0xd18a }, { 6763, 0x2ec6 }, { 6771, 0xcff6 }, { 6783, 0xafaf }, { 6795, 0x77f7 }, { 6808, 0x96ff }, { 6820, 0xb62b }, { 6829, 0xfdb5 }, { 6841, 0xbfef }, { 6855, 0x7fe9 }, { 6867, 0x1a9b }, { 6875, 0x7628 }, { 6882, 0x3fdf }, { 6895, 0xace9 }, /* 0x7700 */ { 6904, 0xd46d }, { 6913, 0x79ff }, { 6926, 0x5cba }, { 6935, 0xea1f }, { 6945, 0xff74 }, { 6957, 0xf3fc }, { 6969, 0xe691 }, { 6977, 0x1dff }, { 6989, 0x8fce }, { 6999, 0x7ff9 }, { 7012, 0xe95a }, { 7021, 0x57d6 }, { 7031, 0xdfff }, { 7046, 0xe77f }, { 7059, 0x8553 }, { 7066, 0x1eb7 }, /* 0x7800 */ { 7076, 0xcdf8 }, { 7086, 0x4a29 }, { 7092, 0xcd17 }, { 7101, 0xa06e }, { 7108, 0xaf5e }, { 7119, 0xdf1a }, { 7129, 0x83ff }, { 7140, 0xef7f }, { 7154, 0x8d7f }, { 7165, 0x6275 }, { 7173, 0xff55 }, { 7185, 0xbde0 }, { 7194, 0xf1dd }, { 7205, 0xfdce }, { 7217, 0xeeff }, { 7231, 0xfb6b }, /* 0x7900 */ { 7243, 0xffdd }, { 7257, 0xbff7 }, { 7271, 0xffef }, { 7286, 0xa3ef }, { 7297, 0xfcbc }, { 7308, 0x0337 }, { 7315, 0x5e5a }, { 7324, 0xfa7f }, { 7337, 0x7bcc }, { 7347, 0xfbff }, { 7362, 0xff7f }, { 7377, 0x91f7 }, { 7387, 0xd5b4 }, { 7396, 0x7ed9 }, { 7407, 0x5527 }, { 7415, 0xd6fe }, /* 0x7a00 */ { 7427, 0x97b2 }, { 7436, 0xbb6f }, { 7448, 0xfff6 }, { 7462, 0x4577 }, { 7471, 0xffbf }, { 7486, 0xff7d }, { 7500, 0xffff }, { 7516, 0x782e }, { 7524, 0xdea4 }, { 7533, 0x4e19 }, { 7540, 0xce9e }, { 7550, 0x7ff7 }, { 7564, 0xf7ff }, { 7579, 0x3dbf }, { 7591, 0x5f96 }, { 7601, 0x59ff }, /* 0x7b00 */ { 7613, 0x72a7 }, { 7622, 0xb5cd }, { 7632, 0xa28e }, { 7639, 0xaaf5 }, { 7649, 0x655f }, { 7659, 0xd2a8 }, { 7666, 0xbffa }, { 7679, 0xb559 }, { 7688, 0xdfde }, { 7701, 0xcf4e }, { 7711, 0xc039 }, { 7717, 0xfeed }, { 7730, 0xef3d }, { 7742, 0xd9f5 }, { 7753, 0xbb9d }, { 7764, 0xaf7d }, /* 0x7c00 */ { 7776, 0x677f }, { 7788, 0x7fbf }, { 7802, 0xfb3f }, { 7815, 0x7eff }, { 7829, 0xdffc }, { 7842, 0xffff }, { 7858, 0xffff }, { 7874, 0xc7e7 }, { 7885, 0xfdff }, { 7900, 0x0e59 }, { 7907, 0xbbcb }, { 7918, 0x8df1 }, { 7927, 0xca5d }, { 7936, 0x6d1f }, { 7946, 0x7efe }, { 7959, 0xf6ff }, /* 0x7d00 */ { 7973, 0xfbff }, { 7988, 0xffff }, { 8004, 0x777a }, { 8015, 0xffff }, { 8031, 0xffff }, { 8047, 0xffff }, { 8063, 0xbfff }, { 8078, 0xff7f }, { 8093, 0xffff }, { 8109, 0xffff }, { 8125, 0xbfbf }, { 8139, 0xffff }, { 8155, 0xffff }, { 8171, 0xffff }, { 8187, 0xffff }, { 8203, 0xffff }, /* 0x7e00 */ { 8219, 0xffff }, { 8235, 0xffff }, { 8251, 0xffff }, { 8267, 0xf7ff }, { 8282, 0xff7d }, { 8296, 0xffff }, { 8312, 0xffff }, { 8328, 0xffff }, { 8344, 0xfffb }, { 8359, 0x77ff }, { 8373, 0x4000 }, { 8374, 0x1810 }, { 8377, 0x0000 }, { 8377, 0x0040 }, { 8378, 0x1010 }, { 8380, 0x0200 }, /* 0x7f00 */ { 8381, 0x0400 }, { 8382, 0x4001 }, { 8384, 0x0000 }, { 8384, 0xfa80 }, { 8391, 0xffcb }, { 8404, 0x7a4c }, { 8412, 0xb8f9 }, { 8422, 0xbde9 }, { 8433, 0xabfd }, { 8445, 0x1bef }, { 8456, 0x7f6d }, { 8468, 0x4cfa }, { 8477, 0xabdd }, { 8488, 0x7ecf }, { 8500, 0xbd9c }, { 8510, 0xe7f4 }, /* 0x8000 */ { 8521, 0xc784 }, { 8528, 0xec0a }, { 8535, 0xf81a }, { 8543, 0x5615 }, { 8550, 0xc3b3 }, { 8559, 0xfaeb }, { 8571, 0xf9ff }, { 8585, 0x7ffd }, { 8599, 0xe526 }, { 8607, 0x42b7 }, { 8615, 0x11c8 }, { 8620, 0x0b69 }, { 8627, 0x8fa0 }, { 8634, 0x813f }, { 8642, 0x404d }, { 8647, 0xcaa0 }, /* 0x8100 */ { 8653, 0x19bb }, { 8662, 0xbaa0 }, { 8669, 0x6fff }, { 8683, 0xbeb9 }, { 8694, 0xe2bf }, { 8705, 0xf9c4 }, { 8714, 0x9d5e }, { 8724, 0x01ec }, { 8730, 0x7afa }, { 8741, 0xc6fd }, { 8752, 0xfab7 }, { 8764, 0xf3f7 }, { 8777, 0xebb0 }, { 8786, 0xffff }, { 8802, 0xcb77 }, { 8813, 0xa7e7 }, /* 0x8200 */ { 8824, 0xcf88 }, { 8832, 0x27ea }, { 8841, 0x42f1 }, { 8848, 0xb404 }, { 8853, 0x756f }, { 8864, 0x7aff }, { 8877, 0x3eff }, { 8890, 0x19e2 }, { 8897, 0x12eb }, { 8905, 0x4c79 }, { 8913, 0x008d }, { 8917, 0x9c64 }, { 8924, 0x026d }, { 8930, 0x2641 }, { 8935, 0x7784 }, { 8943, 0xf56d }, /* 0x8300 */ { 8954, 0x2c01 }, { 8958, 0xe34d }, { 8967, 0x467f }, { 8977, 0xe885 }, { 8984, 0x7d36 }, { 8994, 0x23e8 }, { 9001, 0x0004 }, { 9002, 0xc67f }, { 9013, 0xbd9f }, { 9025, 0xa6f3 }, { 9035, 0xf0fe }, { 9046, 0xc820 }, { 9050, 0x6b5c }, { 9059, 0x4eaf }, { 9069, 0xf9dc }, { 9080, 0xdcf8 }, /* 0x8400 */ { 9090, 0x07a5 }, { 9097, 0xcefd }, { 9109, 0xfe0f }, { 9120, 0xcefd }, { 9132, 0xffbf }, { 9147, 0xe17d }, { 9157, 0xc5f5 }, { 9167, 0xfa95 }, { 9177, 0xa47b }, { 9186, 0xed7f }, { 9199, 0x7ffd }, { 9213, 0x58eb }, { 9222, 0xd9ed }, { 9233, 0x5fb4 }, { 9243, 0xef96 }, { 9254, 0x6ffe }, /* 0x8500 */ { 9267, 0xefff }, { 9282, 0x7b75 }, { 9293, 0xe7fd }, { 9306, 0xc07f }, { 9315, 0xf8f7 }, { 9327, 0xbdbf }, { 9340, 0xfeef }, { 9354, 0xb1eb }, { 9364, 0x7f4f }, { 9376, 0xe7ff }, { 9390, 0x3aef }, { 9401, 0xfd7e }, { 9414, 0x7dfd }, { 9427, 0xefd6 }, { 9439, 0xfdef }, { 9453, 0x77ff }, /* 0x8600 */ { 9467, 0xffdf }, { 9482, 0xffbd }, { 9496, 0xfd7f }, { 9510, 0xeeff }, { 9524, 0x1fff }, { 9537, 0xbbec }, { 9548, 0xa7fb }, { 9560, 0x01fd }, { 9568, 0xc3f8 }, { 9577, 0xcfd7 }, { 9589, 0x6867 }, { 9597, 0xfb8c }, { 9607, 0x312e }, { 9614, 0x34ec }, { 9622, 0x9def }, { 9634, 0xbce0 }, /* 0x8700 */ { 9642, 0xd872 }, { 9650, 0xaa53 }, { 9658, 0xbdd1 }, { 9668, 0x376d }, { 9678, 0xac7f }, { 9689, 0xfd77 }, { 9702, 0xbfc6 }, { 9713, 0x87ae }, { 9722, 0xd6d3 }, { 9732, 0x7f77 }, { 9745, 0x46ff }, { 9756, 0xdbd7 }, { 9768, 0xf3be }, { 9780, 0xf7f1 }, { 9792, 0xbbde }, { 9804, 0xbdff }, /* 0x8800 */ { 9818, 0xfbf7 }, { 9832, 0xf797 }, { 9844, 0xfff9 }, { 9858, 0xedfb }, { 9871, 0xcfce }, { 9882, 0xfd6f }, { 9895, 0xa4c1 }, { 9901, 0x1f7a }, { 9911, 0xd6c9 }, { 9920, 0xefbb }, { 9933, 0xd7eb }, { 9945, 0xef7d }, { 9958, 0xbd99 }, { 9968, 0x7ccb }, { 9978, 0xfec3 }, { 9989, 0xace4 }, /* 0x8900 */ { 9997, 0xfbfb }, { 10011, 0xf1f2 }, { 10021, 0xf3dd }, { 10033, 0xffae }, { 10046, 0xffed }, { 10060, 0x3fff }, { 10074, 0xffbf }, { 10089, 0x77ff }, { 10103, 0xffb5 }, { 10116, 0xffff }, { 10132, 0xffff }, { 10148, 0xffff }, { 10164, 0x2009 }, { 10167, 0xabb8 }, { 10176, 0x7797 }, { 10187, 0xfff7 }, /* 0x8a00 */ { 10202, 0xff7e }, { 10216, 0xffff }, { 10232, 0xffff }, { 10248, 0xbfff }, { 10263, 0xfeff }, { 10278, 0xffff }, { 10294, 0xffff }, { 10310, 0xfdff }, { 10325, 0xf9ff }, { 10339, 0xfff7 }, { 10354, 0xffff }, { 10370, 0xffff }, { 10386, 0xffff }, { 10402, 0xffff }, { 10418, 0xffff }, { 10434, 0xffff }, /* 0x8b00 */ { 10450, 0xff7f }, { 10465, 0xffff }, { 10481, 0xffbf }, { 10496, 0xffff }, { 10512, 0xffff }, { 10528, 0xffff }, { 10544, 0xefbf }, { 10558, 0xffff }, { 10574, 0xffff }, { 10590, 0xffff }, { 10606, 0x1000 }, { 10607, 0x0802 }, { 10609, 0x0080 }, { 10610, 0x0001 }, { 10611, 0x0400 }, { 10612, 0x0000 }, /* 0x8c00 */ { 10612, 0x0200 }, { 10613, 0x4000 }, { 10614, 0x0000 }, { 10614, 0xff00 }, { 10622, 0xed3d }, { 10633, 0xfbdf }, { 10647, 0xf3f9 }, { 10659, 0xf8f7 }, { 10671, 0xe9db }, { 10682, 0xfeef }, { 10696, 0xffff }, { 10712, 0xffff }, { 10728, 0xffff }, { 10744, 0xffff }, { 10760, 0xffff }, { 10776, 0xffff }, /* 0x8d00 */ { 10792, 0xffff }, { 10808, 0x1fff }, { 10821, 0x0001 }, { 10822, 0x0000 }, { 10822, 0x0000 }, { 10822, 0x8086 }, { 10826, 0xd720 }, { 10833, 0xff06 }, { 10843, 0xf3cd }, { 10854, 0x7fed }, { 10867, 0xfff7 }, { 10882, 0x2ac5 }, { 10889, 0x27a7 }, { 10898, 0x133d }, { 10906, 0x62e7 }, { 10915, 0xd057 }, /* 0x8e00 */ { 10923, 0x69df }, { 10934, 0x1fef }, { 10946, 0x29f3 }, { 10955, 0xd9dd }, { 10966, 0xf068 }, { 10973, 0xfdf9 }, { 10986, 0x4dbf }, { 10997, 0x6faa }, { 11007, 0x7f5d }, { 11019, 0xafee }, { 11031, 0x67ff }, { 11044, 0xfbfb }, { 11058, 0xbfff }, { 11073, 0xffff }, { 11089, 0xffff }, { 11105, 0xffff }, /* 0x8f00 */ { 11121, 0xffff }, { 11137, 0xffff }, { 11153, 0xffff }, { 11169, 0xffff }, { 11185, 0xffff }, { 11201, 0xffff }, { 11217, 0x043f }, { 11224, 0x0000 }, { 11224, 0x1001 }, { 11226, 0x2004 }, { 11228, 0xf4f7 }, { 11240, 0x9dbc }, { 11250, 0xbe49 }, { 11259, 0x04c4 }, { 11263, 0x908b }, { 11269, 0xdc76 }, /* 0x9000 */ { 11279, 0x5180 }, { 11283, 0x1328 }, { 11288, 0x1fb8 }, { 11297, 0xa69f }, { 11307, 0x5f69 }, { 11317, 0xf670 }, { 11326, 0x9ed3 }, { 11336, 0x5fcf }, { 11348, 0xf6f2 }, { 11359, 0xd555 }, { 11368, 0x2bb1 }, { 11376, 0xb084 }, { 11381, 0x3b4d }, { 11390, 0xc774 }, { 11399, 0x5639 }, { 11407, 0x9eef }, /* 0x9100 */ { 11419, 0xffeb }, { 11433, 0xbdff }, { 11447, 0x7ff3 }, { 11460, 0xfdfd }, { 11474, 0x01b7 }, { 11481, 0x9b7a }, { 11491, 0x29c1 }, { 11497, 0x1c08 }, { 11501, 0xc55f }, { 11511, 0xf3f8 }, { 11522, 0x1bf3 }, { 11532, 0xfbcf }, { 11545, 0x097f }, { 11554, 0xeffd }, { 11568, 0xffff }, { 11584, 0xffff }, /* 0x9200 */ { 11600, 0xffff }, { 11616, 0xffff }, { 11632, 0xffff }, { 11648, 0xffff }, { 11664, 0xffff }, { 11680, 0xffff }, { 11696, 0xffff }, { 11712, 0xffef }, { 11727, 0xbfff }, { 11742, 0xffff }, { 11758, 0xbfff }, { 11773, 0xffff }, { 11789, 0xfeff }, { 11804, 0xffff }, { 11820, 0xffff }, { 11836, 0xffff }, /* 0x9300 */ { 11852, 0xffff }, { 11868, 0xffff }, { 11884, 0xffff }, { 11900, 0xbfff }, { 11915, 0xffff }, { 11931, 0xffff }, { 11947, 0xfbff }, { 11962, 0xffff }, { 11978, 0x7fff }, { 11993, 0xffff }, { 12009, 0xffff }, { 12025, 0xffff }, { 12041, 0xfbff }, { 12056, 0xffbf }, { 12071, 0xffff }, { 12087, 0xffff }, /* 0x9400 */ { 12103, 0xffff }, { 12119, 0xffff }, { 12135, 0xffff }, { 12151, 0xbfff }, { 12166, 0xffff }, { 12182, 0xffff }, { 12198, 0xf7ff }, { 12213, 0xffff }, { 12229, 0x001f }, { 12234, 0x0142 }, { 12237, 0x0000 }, { 12237, 0x0000 }, { 12237, 0x8080 }, { 12239, 0x0418 }, { 12242, 0x0040 }, { 12243, 0x0800 }, /* 0x9500 */ { 12244, 0x0000 }, { 12244, 0x1000 }, { 12245, 0x0081 }, { 12247, 0x2008 }, { 12249, 0x0908 }, { 12252, 0x0420 }, { 12254, 0x4001 }, { 12256, 0x7fb0 }, { 12266, 0xffff }, { 12282, 0xffff }, { 12298, 0xffff }, { 12314, 0xffff }, { 12330, 0xffff }, { 12346, 0xffff }, { 12362, 0x10ff }, { 12371, 0x8000 }, /* 0x9600 */ { 12372, 0x0080 }, { 12373, 0x4908 }, { 12377, 0xbbf9 }, { 12389, 0x4781 }, { 12395, 0xc40a }, { 12400, 0x77ce }, { 12411, 0xe869 }, { 12419, 0xff0b }, { 12430, 0x569f }, { 12440, 0xec6e }, { 12450, 0xff7f }, { 12465, 0x8db6 }, { 12474, 0x0d0c }, { 12479, 0xffdb }, { 12493, 0x78fe }, { 12504, 0xbd37 }, /* 0x9700 */ { 12515, 0x1c2c }, { 12521, 0xafb7 }, { 12533, 0xdbff }, { 12547, 0xbcfa }, { 12558, 0xffff }, { 12574, 0xb5b3 }, { 12584, 0xfdd8 }, { 12595, 0xefa7 }, { 12607, 0xd7df }, { 12620, 0xfee9 }, { 12632, 0x57f6 }, { 12643, 0xffeb }, { 12657, 0xffff }, { 12673, 0xffff }, { 12689, 0xc13f }, { 12698, 0xff97 }, /* 0x9800 */ { 12711, 0xffff }, { 12727, 0xffff }, { 12743, 0xffff }, { 12759, 0xffff }, { 12775, 0xffff }, { 12791, 0xffff }, { 12807, 0xffff }, { 12823, 0x001f }, { 12828, 0x4800 }, { 12830, 0x0224 }, { 12833, 0xff08 }, { 12842, 0xffff }, { 12858, 0xbfff }, { 12873, 0x38d1 }, { 12880, 0xfe7f }, { 12894, 0xffff }, /* 0x9900 */ { 12910, 0xdfff }, { 12925, 0xfffe }, { 12940, 0xbfff }, { 12955, 0xffff }, { 12971, 0xffff }, { 12987, 0xffcf }, { 13001, 0x0057 }, { 13006, 0x4b08 }, { 13011, 0x520c }, { 13016, 0xfc00 }, { 13022, 0xfedf }, { 13036, 0xffff }, { 13052, 0xffff }, { 13068, 0xffff }, { 13084, 0xffff }, { 13100, 0xffff }, /* 0x9a00 */ { 13116, 0xffff }, { 13132, 0xffff }, { 13148, 0xffff }, { 13164, 0xffff }, { 13180, 0xffff }, { 13196, 0xffff }, { 13212, 0x0fff }, { 13224, 0x0004 }, { 13225, 0x6208 }, { 13229, 0x0230 }, { 13232, 0xfe40 }, { 13240, 0xea3c }, { 13249, 0xe7d8 }, { 13259, 0x7ef5 }, { 13271, 0x57bd }, { 13282, 0xf5ff }, /* 0x9b00 */ { 13296, 0x7ef7 }, { 13309, 0x7ff7 }, { 13323, 0x7ff7 }, { 13337, 0xe7fb }, { 13350, 0x5c41 }, { 13356, 0xffed }, { 13370, 0xffff }, { 13386, 0xffff }, { 13402, 0xffff }, { 13418, 0xffff }, { 13434, 0xffff }, { 13450, 0xffff }, { 13466, 0xffff }, { 13482, 0xffff }, { 13498, 0xffff }, { 13514, 0xffff }, /* 0x9c00 */ { 13530, 0xffff }, { 13546, 0xffff }, { 13562, 0xffff }, { 13578, 0xffff }, { 13594, 0xffff }, { 13610, 0xffff }, { 13626, 0xffff }, { 13642, 0x6fff }, { 13656, 0x9619 }, { 13663, 0x23c8 }, { 13669, 0x9400 }, { 13672, 0xc200 }, { 13675, 0x0307 }, { 13680, 0x0c06 }, { 13684, 0xfffb }, { 13699, 0xffff }, /* 0x9d00 */ { 13715, 0xffff }, { 13731, 0xffff }, { 13747, 0xffff }, { 13763, 0xffff }, { 13779, 0xffff }, { 13795, 0xffff }, { 13811, 0xffff }, { 13827, 0xffff }, { 13843, 0xffff }, { 13859, 0xffff }, { 13875, 0xffff }, { 13891, 0xffff }, { 13907, 0xffff }, { 13923, 0xffff }, { 13939, 0xffff }, { 13955, 0xffff }, /* 0x9e00 */ { 13971, 0xffff }, { 13987, 0x7fff }, { 14002, 0x4090 }, { 14005, 0x1811 }, { 14009, 0x2001 }, { 14011, 0xa25d }, { 14019, 0xc027 }, { 14025, 0x3ff4 }, { 14036, 0xf67b }, { 14048, 0x5ff3 }, { 14060, 0xffbf }, { 14075, 0x96ef }, { 14086, 0x1def }, { 14097, 0x46ed }, { 14106, 0x795a }, { 14115, 0xa5ff }, /* 0x9f00 */ { 14127, 0x97ff }, { 14140, 0xfd76 }, { 14152, 0x6ffa }, { 14164, 0x957f }, { 14175, 0xffef }, { 14190, 0xfffc }, { 14204, 0xffff }, { 14220, 0x7fff }, { 14235, 0xe006 }, { 14240, 0x71ff }, { 14252, 0x003e }, }; static const Summary16 gbkext_inv_uni2indx_pagef9[19] = { /* 0xf900 */ { 14257, 0x0000 }, { 14257, 0x0000 }, { 14257, 0x1000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0000 }, { 14258, 0x0200 }, { 14259, 0x0000 }, { 14259, 0x0020 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0000 }, { 14260, 0x0080 }, { 14261, 0x0002 }, /* 0xfa00 */ { 14262, 0xf000 }, { 14266, 0x811a }, { 14271, 0x039b }, }; static const Summary16 gbkext_inv_uni2indx_pagefe[31] = { /* 0xfe00 */ { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0000 }, { 14278, 0x0001 }, { 14279, 0xfe00 }, { 14286, 0xfef7 }, { 14300, 0x0f7f }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, /* 0xff00 */ { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0000 }, { 14311, 0x0014 }, }; static int gbkext_inv_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc >= 0x0200 && wc < 0x02e0) summary = &gbkext_inv_uni2indx_page02[(wc>>4)-0x020]; else if (wc >= 0x2000 && wc < 0x22c0) summary = &gbkext_inv_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x2500 && wc < 0x2610) summary = &gbkext_inv_uni2indx_page25[(wc>>4)-0x250]; else if (wc >= 0x3000 && wc < 0x3100) summary = &gbkext_inv_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x3200 && wc < 0x33e0) summary = &gbkext_inv_uni2indx_page32[(wc>>4)-0x320]; else if (wc >= 0x4e00 && wc < 0x9fb0) summary = &gbkext_inv_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0xf900 && wc < 0xfa30) summary = &gbkext_inv_uni2indx_pagef9[(wc>>4)-0xf90]; else if (wc >= 0xfe00 && wc < 0xfff0) summary = &gbkext_inv_uni2indx_pagefe[(wc>>4)-0xfe0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = gbkext_inv_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.2.05/src/libtiniconv/encdec/ucs2.h0000664000175000017500000000431714532252172015350 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * UCS-2 */ /* Here we accept FFFE/FEFF marks as endianness indicators everywhere in the stream, not just at the beginning. The default is big-endian. */ /* The state is 0 if big-endian, 1 if little-endian. */ static int ucs2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { conv_state_t state = conv->istate; int count = 0; for (; n >= 2;) { ucs4_t wc = (state ? s[0] + (s[1] << 8) : (s[0] << 8) + s[1]); s += 2; n -= 2; count += 2; if (wc == 0xfeff) { } else if (wc == 0xfffe) { state ^= 1; } else if (wc >= 0xd800 && wc < 0xe000) { return RET_ILSEQ; } else { *pwc = wc; conv->istate = state; return count; } } conv->istate = state; return RET_TOOFEW(count); } /* But we output UCS-2 in big-endian order, without byte-order mark. */ /* RFC 2152 says: "ISO/IEC 10646-1:1993(E) specifies that when characters the UCS-2 form are serialized as octets, that the most significant octet appear first." */ static int ucs2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x10000 && wc != 0xfffe && !(wc >= 0xd800 && wc < 0xe000)) { if (n >= 2) { r[0] = (unsigned char) (wc >> 8); r[1] = (unsigned char) wc; return 2; } else return RET_TOOSMALL; } else return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_14.h0000664000175000017500000001240614532252172016126 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-14 */ static const unsigned short iso8859_14_2uni[96] = { /* 0xa0 */ 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, /* 0xb0 */ 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, /* 0xc0 */ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, /* 0xd0 */ 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, /* 0xe0 */ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, /* 0xf0 */ 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff, }; static int iso8859_14_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0) *pwc = (ucs4_t) iso8859_14_2uni[c-0xa0]; else *pwc = (ucs4_t) c; return 1; } static const unsigned char iso8859_14_page00[96] = { 0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */ 0x00, 0xa9, 0x00, 0x00, 0x00, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */ 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff, /* 0xf8-0xff */ }; static const unsigned char iso8859_14_page01_0[32] = { 0x00, 0x00, 0xa4, 0xa5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char iso8859_14_page01_1[16] = { 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xde, 0xfe, /* 0x70-0x77 */ 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ }; static const unsigned char iso8859_14_page1e_0[136] = { 0x00, 0x00, 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0xa6, 0xab, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xb4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb9, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0xa8, 0xb8, 0xaa, 0xba, 0xbd, 0xbe, 0x00, 0x00, /* 0x80-0x87 */ }; static const unsigned char iso8859_14_page1e_1[8] = { 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ }; static int iso8859_14_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x0100) c = iso8859_14_page00[wc-0x00a0]; else if (wc >= 0x0108 && wc < 0x0128) c = iso8859_14_page01_0[wc-0x0108]; else if (wc >= 0x0170 && wc < 0x0180) c = iso8859_14_page01_1[wc-0x0170]; else if (wc >= 0x1e00 && wc < 0x1e88) c = iso8859_14_page1e_0[wc-0x1e00]; else if (wc >= 0x1ef0 && wc < 0x1ef8) c = iso8859_14_page1e_1[wc-0x1ef0]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/ces_gbk.h0000664000175000017500000000336614532252172016074 00000000000000/* * Copyright (C) 1999-2001, 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK */ static int ces_gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; /* Code set 0 (ASCII or GB 1988-89) */ if (c < 0x80) return ascii_mbtowc(conv,pwc,s,n); /* Code set 1 (GBK) */ if (c >= 0x81 && c < 0xff) { if (n < 2) return RET_TOOFEW(0); return gbk_mbtowc(conv,pwc,s,2); } return RET_ILSEQ; } static int ces_gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char buf[2]; int ret; /* Code set 0 (ASCII or GB 1988-89) */ ret = ascii_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; /* Code set 1 (GBK) */ ret = gbk_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (n < 2) return RET_TOOSMALL; r[0] = buf[0]; r[1] = buf[1]; return 2; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/vietcomb.h0000664000175000017500000003023214532252172016277 00000000000000/* * Copyright (C) 2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* Combining characters used in Vietnamese encodings CP1258, TCVN. */ #ifndef _VIETCOMB_H #define _VIETCOMB_H /* Relevant combining characters: 0x0300, 0x0301, 0x0303, 0x0309, 0x0323. */ /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } viet_comp_table_data[] = { #define viet_comp_table0300_idx 0 #define viet_comp_table0300_len 31 { 0x0041, 0x00C0 }, { 0x0045, 0x00C8 }, { 0x0049, 0x00CC }, { 0x004E, 0x01F8 }, { 0x004F, 0x00D2 }, { 0x0055, 0x00D9 }, { 0x0057, 0x1E80 }, { 0x0059, 0x1EF2 }, { 0x0061, 0x00E0 }, { 0x0065, 0x00E8 }, { 0x0069, 0x00EC }, { 0x006E, 0x01F9 }, { 0x006F, 0x00F2 }, { 0x0075, 0x00F9 }, { 0x0077, 0x1E81 }, { 0x0079, 0x1EF3 }, { 0x00A8, 0x1FED }, { 0x00C2, 0x1EA6 }, { 0x00CA, 0x1EC0 }, { 0x00D4, 0x1ED2 }, { 0x00DC, 0x01DB }, { 0x00E2, 0x1EA7 }, { 0x00EA, 0x1EC1 }, { 0x00F4, 0x1ED3 }, { 0x00FC, 0x01DC }, { 0x0102, 0x1EB0 }, { 0x0103, 0x1EB1 }, /*{ 0x0112, 0x1E14 },*/ /*{ 0x0113, 0x1E15 },*/ /*{ 0x014C, 0x1E50 },*/ /*{ 0x014D, 0x1E51 },*/ { 0x01A0, 0x1EDC }, { 0x01A1, 0x1EDD }, { 0x01AF, 0x1EEA }, { 0x01B0, 0x1EEB }, #define viet_comp_table0301_idx (viet_comp_table0300_idx+viet_comp_table0300_len) #define viet_comp_table0301_len 64 { 0x0041, 0x00C1 }, { 0x0043, 0x0106 }, { 0x0045, 0x00C9 }, { 0x0047, 0x01F4 }, { 0x0049, 0x00CD }, { 0x004B, 0x1E30 }, { 0x004C, 0x0139 }, { 0x004D, 0x1E3E }, { 0x004E, 0x0143 }, { 0x004F, 0x00D3 }, { 0x0050, 0x1E54 }, { 0x0052, 0x0154 }, { 0x0053, 0x015A }, { 0x0055, 0x00DA }, { 0x0057, 0x1E82 }, { 0x0059, 0x00DD }, { 0x005A, 0x0179 }, { 0x0061, 0x00E1 }, { 0x0063, 0x0107 }, { 0x0065, 0x00E9 }, { 0x0067, 0x01F5 }, { 0x0069, 0x00ED }, { 0x006B, 0x1E31 }, { 0x006C, 0x013A }, { 0x006D, 0x1E3F }, { 0x006E, 0x0144 }, { 0x006F, 0x00F3 }, { 0x0070, 0x1E55 }, { 0x0072, 0x0155 }, { 0x0073, 0x015B }, { 0x0075, 0x00FA }, { 0x0077, 0x1E83 }, { 0x0079, 0x00FD }, { 0x007A, 0x017A }, { 0x00A5, 0x0385 }, { 0x00A8, 0x1FEE }, { 0x00C2, 0x1EA4 }, { 0x00C5, 0x01FA }, { 0x00C6, 0x01FC }, { 0x00C7, 0x1E08 }, { 0x00CA, 0x1EBE }, { 0x00CF, 0x1E2E }, { 0x00D4, 0x1ED0 }, { 0x00D5, 0x1E4C }, { 0x00D8, 0x01FE }, { 0x00DC, 0x01D7 }, { 0x00E2, 0x1EA5 }, { 0x00E5, 0x01FB }, { 0x00E6, 0x01FD }, { 0x00E7, 0x1E09 }, { 0x00EA, 0x1EBF }, { 0x00EF, 0x1E2F }, { 0x00F4, 0x1ED1 }, { 0x00F5, 0x1E4D }, { 0x00F8, 0x01FF }, { 0x00FC, 0x01D8 }, { 0x0102, 0x1EAE }, { 0x0103, 0x1EAF }, /*{ 0x0112, 0x1E16 },*/ /*{ 0x0113, 0x1E17 },*/ /*{ 0x014C, 0x1E52 },*/ /*{ 0x014D, 0x1E53 },*/ { 0x0168, 0x1E78 }, { 0x0169, 0x1E79 }, { 0x01A0, 0x1EDA }, { 0x01A1, 0x1EDB }, { 0x01AF, 0x1EE8 }, { 0x01B0, 0x1EE9 }, #define viet_comp_table0303_idx (viet_comp_table0301_idx+viet_comp_table0301_len) #define viet_comp_table0303_len 34 { 0x0041, 0x00C3 }, { 0x0045, 0x1EBC }, { 0x0049, 0x0128 }, { 0x004E, 0x00D1 }, { 0x004F, 0x00D5 }, { 0x0055, 0x0168 }, { 0x0056, 0x1E7C }, { 0x0059, 0x1EF8 }, { 0x0061, 0x00E3 }, { 0x0065, 0x1EBD }, { 0x0069, 0x0129 }, { 0x006E, 0x00F1 }, { 0x006F, 0x00F5 }, { 0x0075, 0x0169 }, { 0x0076, 0x1E7D }, { 0x0079, 0x1EF9 }, { 0x00C2, 0x1EAA }, { 0x00CA, 0x1EC4 }, { 0x00D3, 0x1E4C }, { 0x00D4, 0x1ED6 }, { 0x00D6, 0x1E4E }, { 0x00DA, 0x1E78 }, { 0x00E2, 0x1EAB }, { 0x00EA, 0x1EC5 }, { 0x00F3, 0x1E4D }, { 0x00F4, 0x1ED7 }, { 0x00F6, 0x1E4F }, { 0x00FA, 0x1E79 }, { 0x0102, 0x1EB4 }, { 0x0103, 0x1EB5 }, { 0x01A0, 0x1EE0 }, { 0x01A1, 0x1EE1 }, { 0x01AF, 0x1EEE }, { 0x01B0, 0x1EEF }, #define viet_comp_table0309_idx (viet_comp_table0303_idx+viet_comp_table0303_len) #define viet_comp_table0309_len 24 { 0x0041, 0x1EA2 }, { 0x0045, 0x1EBA }, { 0x0049, 0x1EC8 }, { 0x004F, 0x1ECE }, { 0x0055, 0x1EE6 }, { 0x0059, 0x1EF6 }, { 0x0061, 0x1EA3 }, { 0x0065, 0x1EBB }, { 0x0069, 0x1EC9 }, { 0x006F, 0x1ECF }, { 0x0075, 0x1EE7 }, { 0x0079, 0x1EF7 }, { 0x00C2, 0x1EA8 }, { 0x00CA, 0x1EC2 }, { 0x00D4, 0x1ED4 }, { 0x00E2, 0x1EA9 }, { 0x00EA, 0x1EC3 }, { 0x00F4, 0x1ED5 }, { 0x0102, 0x1EB2 }, { 0x0103, 0x1EB3 }, { 0x01A0, 0x1EDE }, { 0x01A1, 0x1EDF }, { 0x01AF, 0x1EEC }, { 0x01B0, 0x1EED }, #define viet_comp_table0323_idx (viet_comp_table0309_idx+viet_comp_table0309_len) #define viet_comp_table0323_len 50 { 0x0041, 0x1EA0 }, { 0x0042, 0x1E04 }, { 0x0044, 0x1E0C }, { 0x0045, 0x1EB8 }, { 0x0048, 0x1E24 }, { 0x0049, 0x1ECA }, { 0x004B, 0x1E32 }, { 0x004C, 0x1E36 }, { 0x004D, 0x1E42 }, { 0x004E, 0x1E46 }, { 0x004F, 0x1ECC }, { 0x0052, 0x1E5A }, { 0x0053, 0x1E62 }, { 0x0054, 0x1E6C }, { 0x0055, 0x1EE4 }, { 0x0056, 0x1E7E }, { 0x0057, 0x1E88 }, { 0x0059, 0x1EF4 }, { 0x005A, 0x1E92 }, { 0x0061, 0x1EA1 }, { 0x0062, 0x1E05 }, { 0x0064, 0x1E0D }, { 0x0065, 0x1EB9 }, { 0x0068, 0x1E25 }, { 0x0069, 0x1ECB }, { 0x006B, 0x1E33 }, { 0x006C, 0x1E37 }, { 0x006D, 0x1E43 }, { 0x006E, 0x1E47 }, { 0x006F, 0x1ECD }, { 0x0072, 0x1E5B }, { 0x0073, 0x1E63 }, { 0x0074, 0x1E6D }, { 0x0075, 0x1EE5 }, { 0x0076, 0x1E7F }, { 0x0077, 0x1E89 }, { 0x0079, 0x1EF5 }, { 0x007A, 0x1E93 }, { 0x00C2, 0x1EAC }, { 0x00CA, 0x1EC6 }, { 0x00D4, 0x1ED8 }, { 0x00E2, 0x1EAD }, { 0x00EA, 0x1EC7 }, { 0x00F4, 0x1ED9 }, { 0x0102, 0x1EB6 }, { 0x0103, 0x1EB7 }, { 0x01A0, 0x1EE2 }, { 0x01A1, 0x1EE3 }, { 0x01AF, 0x1EF0 }, { 0x01B0, 0x1EF1 }, }; static const struct { unsigned int len; unsigned int idx; } viet_comp_table[] = { { viet_comp_table0300_len, viet_comp_table0300_idx }, { viet_comp_table0301_len, viet_comp_table0301_idx }, { viet_comp_table0303_len, viet_comp_table0303_idx }, { viet_comp_table0309_len, viet_comp_table0309_idx }, { viet_comp_table0323_len, viet_comp_table0323_idx }, }; /* Decomposition table for the relevant Unicode characters. */ struct viet_decomp { unsigned short composed; unsigned int base : 12; int comb1 : 4; }; static const struct viet_decomp viet_decomp_table[] = { { 0x00B4, 0x0020, 1 }, /* compatibility decomposition - for TCVN only */ { 0x00C0, 0x0041, 0 }, { 0x00C1, 0x0041, 1 }, { 0x00C3, 0x0041, 2 }, { 0x00C8, 0x0045, 0 }, { 0x00C9, 0x0045, 1 }, { 0x00CC, 0x0049, 0 }, { 0x00CD, 0x0049, 1 }, { 0x00D1, 0x004E, 2 }, { 0x00D2, 0x004F, 0 }, { 0x00D3, 0x004F, 1 }, { 0x00D5, 0x004F, 2 }, { 0x00D9, 0x0055, 0 }, { 0x00DA, 0x0055, 1 }, { 0x00DD, 0x0059, 1 }, { 0x00E0, 0x0061, 0 }, { 0x00E1, 0x0061, 1 }, { 0x00E3, 0x0061, 2 }, { 0x00E8, 0x0065, 0 }, { 0x00E9, 0x0065, 1 }, { 0x00EC, 0x0069, 0 }, { 0x00ED, 0x0069, 1 }, { 0x00F1, 0x006E, 2 }, { 0x00F2, 0x006F, 0 }, { 0x00F3, 0x006F, 1 }, { 0x00F5, 0x006F, 2 }, { 0x00F9, 0x0075, 0 }, { 0x00FA, 0x0075, 1 }, { 0x00FD, 0x0079, 1 }, { 0x0106, 0x0043, 1 }, { 0x0107, 0x0063, 1 }, { 0x0128, 0x0049, 2 }, { 0x0129, 0x0069, 2 }, { 0x0139, 0x004C, 1 }, { 0x013A, 0x006C, 1 }, { 0x0143, 0x004E, 1 }, { 0x0144, 0x006E, 1 }, { 0x0154, 0x0052, 1 }, { 0x0155, 0x0072, 1 }, { 0x015A, 0x0053, 1 }, { 0x015B, 0x0073, 1 }, { 0x0168, 0x0055, 2 }, { 0x0169, 0x0075, 2 }, { 0x0179, 0x005A, 1 }, { 0x017A, 0x007A, 1 }, { 0x01D7, 0x00DC, 1 }, { 0x01D8, 0x00FC, 1 }, { 0x01DB, 0x00DC, 0 }, { 0x01DC, 0x00FC, 0 }, { 0x01F4, 0x0047, 1 }, { 0x01F5, 0x0067, 1 }, { 0x01F8, 0x004E, 0 }, { 0x01F9, 0x006E, 0 }, { 0x01FA, 0x00C5, 1 }, { 0x01FB, 0x00E5, 1 }, { 0x01FC, 0x00C6, 1 }, { 0x01FD, 0x00E6, 1 }, { 0x01FE, 0x00D8, 1 }, { 0x01FF, 0x00F8, 1 }, { 0x02DC, 0x0020, 2 }, /* compatibility decomposition - for TCVN only */ { 0x0385, 0x00A5, 1 }, { 0x1E04, 0x0042, 4 }, { 0x1E05, 0x0062, 4 }, { 0x1E08, 0x00C7, 1 }, { 0x1E09, 0x00E7, 1 }, { 0x1E0C, 0x0044, 4 }, { 0x1E0D, 0x0064, 4 }, { 0x1E24, 0x0048, 4 }, { 0x1E25, 0x0068, 4 }, { 0x1E2E, 0x00CF, 1 }, { 0x1E2F, 0x00EF, 1 }, { 0x1E30, 0x004B, 1 }, { 0x1E31, 0x006B, 1 }, { 0x1E32, 0x004B, 4 }, { 0x1E33, 0x006B, 4 }, { 0x1E36, 0x004C, 4 }, { 0x1E37, 0x006C, 4 }, { 0x1E3E, 0x004D, 1 }, { 0x1E3F, 0x006D, 1 }, { 0x1E42, 0x004D, 4 }, { 0x1E43, 0x006D, 4 }, { 0x1E46, 0x004E, 4 }, { 0x1E47, 0x006E, 4 }, { 0x1E4C, 0x00D3, 2 }, /*{ 0x1E4C, 0x00D5, 1 },*/ /*{ 0x1E4C, 0x004F, 1, 2 },*/ { 0x1E4D, 0x00F3, 2 }, /*{ 0x1E4D, 0x00F5, 1 },*/ /*{ 0x1E4D, 0x006F, 1, 2 },*/ { 0x1E4E, 0x00D6, 2 }, { 0x1E4F, 0x00F6, 2 }, { 0x1E54, 0x0050, 1 }, { 0x1E55, 0x0070, 1 }, { 0x1E5A, 0x0052, 4 }, { 0x1E5B, 0x0072, 4 }, { 0x1E62, 0x0053, 4 }, { 0x1E63, 0x0073, 4 }, { 0x1E6C, 0x0054, 4 }, { 0x1E6D, 0x0074, 4 }, { 0x1E78, 0x00DA, 2 }, /*{ 0x1E78, 0x0168, 1 },*/ /*{ 0x1E78, 0x0055, 1, 2 },*/ { 0x1E79, 0x00FA, 2 }, /*{ 0x1E79, 0x0169, 1 },*/ /*{ 0x1E79, 0x0075, 1, 2 },*/ { 0x1E7C, 0x0056, 2 }, { 0x1E7D, 0x0076, 2 }, { 0x1E7E, 0x0056, 4 }, { 0x1E7F, 0x0076, 4 }, { 0x1E80, 0x0057, 0 }, { 0x1E81, 0x0077, 0 }, { 0x1E82, 0x0057, 1 }, { 0x1E83, 0x0077, 1 }, { 0x1E88, 0x0057, 4 }, { 0x1E89, 0x0077, 4 }, { 0x1E92, 0x005A, 4 }, { 0x1E93, 0x007A, 4 }, { 0x1EA0, 0x0041, 4 }, { 0x1EA1, 0x0061, 4 }, { 0x1EA2, 0x0041, 3 }, { 0x1EA3, 0x0061, 3 }, { 0x1EA4, 0x00C2, 1 }, { 0x1EA5, 0x00E2, 1 }, { 0x1EA6, 0x00C2, 0 }, { 0x1EA7, 0x00E2, 0 }, { 0x1EA8, 0x00C2, 3 }, { 0x1EA9, 0x00E2, 3 }, { 0x1EAA, 0x00C2, 2 }, { 0x1EAB, 0x00E2, 2 }, { 0x1EAC, 0x00C2, 4 }, { 0x1EAD, 0x00E2, 4 }, { 0x1EAE, 0x0102, 1 }, { 0x1EAF, 0x0103, 1 }, { 0x1EB0, 0x0102, 0 }, { 0x1EB1, 0x0103, 0 }, { 0x1EB2, 0x0102, 3 }, { 0x1EB3, 0x0103, 3 }, { 0x1EB4, 0x0102, 2 }, { 0x1EB5, 0x0103, 2 }, { 0x1EB6, 0x0102, 4 }, { 0x1EB7, 0x0103, 4 }, { 0x1EB8, 0x0045, 4 }, { 0x1EB9, 0x0065, 4 }, { 0x1EBA, 0x0045, 3 }, { 0x1EBB, 0x0065, 3 }, { 0x1EBC, 0x0045, 2 }, { 0x1EBD, 0x0065, 2 }, { 0x1EBE, 0x00CA, 1 }, { 0x1EBF, 0x00EA, 1 }, { 0x1EC0, 0x00CA, 0 }, { 0x1EC1, 0x00EA, 0 }, { 0x1EC2, 0x00CA, 3 }, { 0x1EC3, 0x00EA, 3 }, { 0x1EC4, 0x00CA, 2 }, { 0x1EC5, 0x00EA, 2 }, { 0x1EC6, 0x00CA, 4 }, { 0x1EC7, 0x00EA, 4 }, { 0x1EC8, 0x0049, 3 }, { 0x1EC9, 0x0069, 3 }, { 0x1ECA, 0x0049, 4 }, { 0x1ECB, 0x0069, 4 }, { 0x1ECC, 0x004F, 4 }, { 0x1ECD, 0x006F, 4 }, { 0x1ECE, 0x004F, 3 }, { 0x1ECF, 0x006F, 3 }, { 0x1ED0, 0x00D4, 1 }, { 0x1ED1, 0x00F4, 1 }, { 0x1ED2, 0x00D4, 0 }, { 0x1ED3, 0x00F4, 0 }, { 0x1ED4, 0x00D4, 3 }, { 0x1ED5, 0x00F4, 3 }, { 0x1ED6, 0x00D4, 2 }, { 0x1ED7, 0x00F4, 2 }, { 0x1ED8, 0x00D4, 4 }, { 0x1ED9, 0x00F4, 4 }, { 0x1EDA, 0x01A0, 1 }, { 0x1EDB, 0x01A1, 1 }, { 0x1EDC, 0x01A0, 0 }, { 0x1EDD, 0x01A1, 0 }, { 0x1EDE, 0x01A0, 3 }, { 0x1EDF, 0x01A1, 3 }, { 0x1EE0, 0x01A0, 2 }, { 0x1EE1, 0x01A1, 2 }, { 0x1EE2, 0x01A0, 4 }, { 0x1EE3, 0x01A1, 4 }, { 0x1EE4, 0x0055, 4 }, { 0x1EE5, 0x0075, 4 }, { 0x1EE6, 0x0055, 3 }, { 0x1EE7, 0x0075, 3 }, { 0x1EE8, 0x01AF, 1 }, { 0x1EE9, 0x01B0, 1 }, { 0x1EEA, 0x01AF, 0 }, { 0x1EEB, 0x01B0, 0 }, { 0x1EEC, 0x01AF, 3 }, { 0x1EED, 0x01B0, 3 }, { 0x1EEE, 0x01AF, 2 }, { 0x1EEF, 0x01B0, 2 }, { 0x1EF0, 0x01AF, 4 }, { 0x1EF1, 0x01B0, 4 }, { 0x1EF2, 0x0059, 0 }, { 0x1EF3, 0x0079, 0 }, { 0x1EF4, 0x0059, 4 }, { 0x1EF5, 0x0079, 4 }, { 0x1EF6, 0x0059, 3 }, { 0x1EF7, 0x0079, 3 }, { 0x1EF8, 0x0059, 2 }, { 0x1EF9, 0x0079, 2 }, { 0x1FED, 0x00A8, 0 }, { 0x1FEE, 0x00A8, 1 }, }; #endif /* _VIETCOMB_H */ fldigi-4.2.05/src/libtiniconv/encdec/iso2022_jp.h0000664000175000017500000001222014532252172016255 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-2022-JP */ /* Specification: RFC 1468 */ #define ESC 0x1b /* * The state can be one of the following values. */ #define STATE_ASCII 0 #define STATE_JISX0201ROMAN 1 #define STATE_JISX0208 2 static int iso2022_jp_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { conv_state_t state = conv->istate; int count = 0; unsigned char c; for (;;) { c = *s; if (c == ESC) { if (n < count+3) goto none; if (s[1] == '(') { if (s[2] == 'B') { state = STATE_ASCII; s += 3; count += 3; if (n < count+1) goto none; continue; } if (s[2] == 'J') { state = STATE_JISX0201ROMAN; s += 3; count += 3; if (n < count+1) goto none; continue; } return RET_ILSEQ; } if (s[1] == '$') { if (s[2] == '@' || s[2] == 'B') { /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */ state = STATE_JISX0208; s += 3; count += 3; if (n < count+1) goto none; continue; } return RET_ILSEQ; } return RET_ILSEQ; } break; } switch (state) { case STATE_ASCII: if (c < 0x80) { int ret = ascii_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 1) abort(); conv->istate = state; return count+1; } else return RET_ILSEQ; case STATE_JISX0201ROMAN: if (c < 0x80) { int ret = jisx0201_mbtowc(conv,pwc,s,1); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 1) abort(); conv->istate = state; return count+1; } else return RET_ILSEQ; case STATE_JISX0208: if (n < count+2) goto none; if (s[0] < 0x80 && s[1] < 0x80) { int ret = jisx0208_mbtowc(conv,pwc,s,2); if (ret == RET_ILSEQ) return RET_ILSEQ; if (ret != 2) abort(); conv->istate = state; return count+2; } else return RET_ILSEQ; default: abort(); } none: conv->istate = state; return RET_TOOFEW(count); } static int iso2022_jp_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { conv_state_t state = conv->ostate; unsigned char buf[2]; int ret; /* Try ASCII. */ ret = ascii_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_ASCII ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_ASCII) { r[0] = ESC; r[1] = '('; r[2] = 'B'; r += 3; state = STATE_ASCII; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0201-1976 Roman. */ ret = jisx0201_wctomb(conv,buf,wc,1); if (ret != RET_ILUNI) { if (ret != 1) abort(); if (buf[0] < 0x80) { int count = (state == STATE_JISX0201ROMAN ? 1 : 4); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0201ROMAN) { r[0] = ESC; r[1] = '('; r[2] = 'J'; r += 3; state = STATE_JISX0201ROMAN; } r[0] = buf[0]; conv->ostate = state; return count; } } /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and JIS X 0208-1983. */ ret = jisx0208_wctomb(conv,buf,wc,2); if (ret != RET_ILUNI) { if (ret != 2) abort(); if (buf[0] < 0x80 && buf[1] < 0x80) { int count = (state == STATE_JISX0208 ? 2 : 5); if (n < count) return RET_TOOSMALL; if (state != STATE_JISX0208) { r[0] = ESC; r[1] = '$'; r[2] = 'B'; r += 3; state = STATE_JISX0208; } r[0] = buf[0]; r[1] = buf[1]; conv->ostate = state; return count; } } return RET_ILUNI; } static int iso2022_jp_reset (conv_t conv, unsigned char *r, int n) { conv_state_t state = conv->ostate; if (state != STATE_ASCII) { if (n < 3) return RET_TOOSMALL; r[0] = ESC; r[1] = '('; r[2] = 'B'; /* conv->ostate = 0; will be done by the caller */ return 3; } else return 0; } #undef STATE_JISX0208 #undef STATE_JISX0201ROMAN #undef STATE_ASCII fldigi-4.2.05/src/libtiniconv/encdec/gb2312.h0000664000175000017500000046505514532252172015406 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GB2312.1980-0 */ static const unsigned short gb2312_2uni_page21[831] = { /* 0x21 */ 0x3000, 0x3001, 0x3002, 0x30fb, 0x02c9, 0x02c7, 0x00a8, 0x3003, 0x3005, 0x2015, 0xff5e, 0x2016, 0x2026, 0x2018, 0x2019, 0x201c, 0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e, 0x300f, 0x3016, 0x3017, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220f, 0x222a, 0x2229, 0x2208, 0x2237, 0x221a, 0x22a5, 0x2225, 0x2220, 0x2312, 0x2299, 0x222b, 0x222e, 0x2261, 0x224c, 0x2248, 0x223d, 0x221d, 0x2260, 0x226e, 0x226f, 0x2264, 0x2265, 0x221e, 0x2235, 0x2234, 0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xff04, 0x00a4, 0xffe0, 0xffe1, 0x2030, 0x00a7, 0x2116, 0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x203b, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, /* 0x22 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499, 0x249a, 0x249b, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0xfffd, 0xfffd, 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xfffd, 0xfffd, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, 0x216b, 0xfffd, 0xfffd, /* 0x23 */ 0xff01, 0xff02, 0xff03, 0xffe5, 0xff05, 0xff06, 0xff07, 0xff08, 0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10, 0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, 0xff40, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3, /* 0x24 */ 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x25 */ 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x26 */ 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x27 */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x28 */ 0x0101, 0x00e1, 0x01ce, 0x00e0, 0x0113, 0x00e9, 0x011b, 0x00e8, 0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2, 0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc, 0x00fc, 0x00ea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x29 */ 0xfffd, 0xfffd, 0xfffd, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250a, 0x250b, 0x250c, 0x250d, 0x250e, 0x250f, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251a, 0x251b, 0x251c, 0x251d, 0x251e, 0x251f, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, }; static const unsigned short gb2312_2uni_page30[6768] = { /* 0x30 */ 0x554a, 0x963f, 0x57c3, 0x6328, 0x54ce, 0x5509, 0x54c0, 0x7691, 0x764c, 0x853c, 0x77ee, 0x827e, 0x788d, 0x7231, 0x9698, 0x978d, 0x6c28, 0x5b89, 0x4ffa, 0x6309, 0x6697, 0x5cb8, 0x80fa, 0x6848, 0x80ae, 0x6602, 0x76ce, 0x51f9, 0x6556, 0x71ac, 0x7ff1, 0x8884, 0x50b2, 0x5965, 0x61ca, 0x6fb3, 0x82ad, 0x634c, 0x6252, 0x53ed, 0x5427, 0x7b06, 0x516b, 0x75a4, 0x5df4, 0x62d4, 0x8dcb, 0x9776, 0x628a, 0x8019, 0x575d, 0x9738, 0x7f62, 0x7238, 0x767d, 0x67cf, 0x767e, 0x6446, 0x4f70, 0x8d25, 0x62dc, 0x7a17, 0x6591, 0x73ed, 0x642c, 0x6273, 0x822c, 0x9881, 0x677f, 0x7248, 0x626e, 0x62cc, 0x4f34, 0x74e3, 0x534a, 0x529e, 0x7eca, 0x90a6, 0x5e2e, 0x6886, 0x699c, 0x8180, 0x7ed1, 0x68d2, 0x78c5, 0x868c, 0x9551, 0x508d, 0x8c24, 0x82de, 0x80de, 0x5305, 0x8912, 0x5265, /* 0x31 */ 0x8584, 0x96f9, 0x4fdd, 0x5821, 0x9971, 0x5b9d, 0x62b1, 0x62a5, 0x66b4, 0x8c79, 0x9c8d, 0x7206, 0x676f, 0x7891, 0x60b2, 0x5351, 0x5317, 0x8f88, 0x80cc, 0x8d1d, 0x94a1, 0x500d, 0x72c8, 0x5907, 0x60eb, 0x7119, 0x88ab, 0x5954, 0x82ef, 0x672c, 0x7b28, 0x5d29, 0x7ef7, 0x752d, 0x6cf5, 0x8e66, 0x8ff8, 0x903c, 0x9f3b, 0x6bd4, 0x9119, 0x7b14, 0x5f7c, 0x78a7, 0x84d6, 0x853d, 0x6bd5, 0x6bd9, 0x6bd6, 0x5e01, 0x5e87, 0x75f9, 0x95ed, 0x655d, 0x5f0a, 0x5fc5, 0x8f9f, 0x58c1, 0x81c2, 0x907f, 0x965b, 0x97ad, 0x8fb9, 0x7f16, 0x8d2c, 0x6241, 0x4fbf, 0x53d8, 0x535e, 0x8fa8, 0x8fa9, 0x8fab, 0x904d, 0x6807, 0x5f6a, 0x8198, 0x8868, 0x9cd6, 0x618b, 0x522b, 0x762a, 0x5f6c, 0x658c, 0x6fd2, 0x6ee8, 0x5bbe, 0x6448, 0x5175, 0x51b0, 0x67c4, 0x4e19, 0x79c9, 0x997c, 0x70b3, /* 0x32 */ 0x75c5, 0x5e76, 0x73bb, 0x83e0, 0x64ad, 0x62e8, 0x94b5, 0x6ce2, 0x535a, 0x52c3, 0x640f, 0x94c2, 0x7b94, 0x4f2f, 0x5e1b, 0x8236, 0x8116, 0x818a, 0x6e24, 0x6cca, 0x9a73, 0x6355, 0x535c, 0x54fa, 0x8865, 0x57e0, 0x4e0d, 0x5e03, 0x6b65, 0x7c3f, 0x90e8, 0x6016, 0x64e6, 0x731c, 0x88c1, 0x6750, 0x624d, 0x8d22, 0x776c, 0x8e29, 0x91c7, 0x5f69, 0x83dc, 0x8521, 0x9910, 0x53c2, 0x8695, 0x6b8b, 0x60ed, 0x60e8, 0x707f, 0x82cd, 0x8231, 0x4ed3, 0x6ca7, 0x85cf, 0x64cd, 0x7cd9, 0x69fd, 0x66f9, 0x8349, 0x5395, 0x7b56, 0x4fa7, 0x518c, 0x6d4b, 0x5c42, 0x8e6d, 0x63d2, 0x53c9, 0x832c, 0x8336, 0x67e5, 0x78b4, 0x643d, 0x5bdf, 0x5c94, 0x5dee, 0x8be7, 0x62c6, 0x67f4, 0x8c7a, 0x6400, 0x63ba, 0x8749, 0x998b, 0x8c17, 0x7f20, 0x94f2, 0x4ea7, 0x9610, 0x98a4, 0x660c, 0x7316, /* 0x33 */ 0x573a, 0x5c1d, 0x5e38, 0x957f, 0x507f, 0x80a0, 0x5382, 0x655e, 0x7545, 0x5531, 0x5021, 0x8d85, 0x6284, 0x949e, 0x671d, 0x5632, 0x6f6e, 0x5de2, 0x5435, 0x7092, 0x8f66, 0x626f, 0x64a4, 0x63a3, 0x5f7b, 0x6f88, 0x90f4, 0x81e3, 0x8fb0, 0x5c18, 0x6668, 0x5ff1, 0x6c89, 0x9648, 0x8d81, 0x886c, 0x6491, 0x79f0, 0x57ce, 0x6a59, 0x6210, 0x5448, 0x4e58, 0x7a0b, 0x60e9, 0x6f84, 0x8bda, 0x627f, 0x901e, 0x9a8b, 0x79e4, 0x5403, 0x75f4, 0x6301, 0x5319, 0x6c60, 0x8fdf, 0x5f1b, 0x9a70, 0x803b, 0x9f7f, 0x4f88, 0x5c3a, 0x8d64, 0x7fc5, 0x65a5, 0x70bd, 0x5145, 0x51b2, 0x866b, 0x5d07, 0x5ba0, 0x62bd, 0x916c, 0x7574, 0x8e0c, 0x7a20, 0x6101, 0x7b79, 0x4ec7, 0x7ef8, 0x7785, 0x4e11, 0x81ed, 0x521d, 0x51fa, 0x6a71, 0x53a8, 0x8e87, 0x9504, 0x96cf, 0x6ec1, 0x9664, 0x695a, /* 0x34 */ 0x7840, 0x50a8, 0x77d7, 0x6410, 0x89e6, 0x5904, 0x63e3, 0x5ddd, 0x7a7f, 0x693d, 0x4f20, 0x8239, 0x5598, 0x4e32, 0x75ae, 0x7a97, 0x5e62, 0x5e8a, 0x95ef, 0x521b, 0x5439, 0x708a, 0x6376, 0x9524, 0x5782, 0x6625, 0x693f, 0x9187, 0x5507, 0x6df3, 0x7eaf, 0x8822, 0x6233, 0x7ef0, 0x75b5, 0x8328, 0x78c1, 0x96cc, 0x8f9e, 0x6148, 0x74f7, 0x8bcd, 0x6b64, 0x523a, 0x8d50, 0x6b21, 0x806a, 0x8471, 0x56f1, 0x5306, 0x4ece, 0x4e1b, 0x51d1, 0x7c97, 0x918b, 0x7c07, 0x4fc3, 0x8e7f, 0x7be1, 0x7a9c, 0x6467, 0x5d14, 0x50ac, 0x8106, 0x7601, 0x7cb9, 0x6dec, 0x7fe0, 0x6751, 0x5b58, 0x5bf8, 0x78cb, 0x64ae, 0x6413, 0x63aa, 0x632b, 0x9519, 0x642d, 0x8fbe, 0x7b54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6b79, 0x50a3, 0x6234, 0x5e26, 0x6b86, 0x4ee3, 0x8d37, 0x888b, 0x5f85, 0x902e, /* 0x35 */ 0x6020, 0x803d, 0x62c5, 0x4e39, 0x5355, 0x90f8, 0x63b8, 0x80c6, 0x65e6, 0x6c2e, 0x4f46, 0x60ee, 0x6de1, 0x8bde, 0x5f39, 0x86cb, 0x5f53, 0x6321, 0x515a, 0x8361, 0x6863, 0x5200, 0x6363, 0x8e48, 0x5012, 0x5c9b, 0x7977, 0x5bfc, 0x5230, 0x7a3b, 0x60bc, 0x9053, 0x76d7, 0x5fb7, 0x5f97, 0x7684, 0x8e6c, 0x706f, 0x767b, 0x7b49, 0x77aa, 0x51f3, 0x9093, 0x5824, 0x4f4e, 0x6ef4, 0x8fea, 0x654c, 0x7b1b, 0x72c4, 0x6da4, 0x7fdf, 0x5ae1, 0x62b5, 0x5e95, 0x5730, 0x8482, 0x7b2c, 0x5e1d, 0x5f1f, 0x9012, 0x7f14, 0x98a0, 0x6382, 0x6ec7, 0x7898, 0x70b9, 0x5178, 0x975b, 0x57ab, 0x7535, 0x4f43, 0x7538, 0x5e97, 0x60e6, 0x5960, 0x6dc0, 0x6bbf, 0x7889, 0x53fc, 0x96d5, 0x51cb, 0x5201, 0x6389, 0x540a, 0x9493, 0x8c03, 0x8dcc, 0x7239, 0x789f, 0x8776, 0x8fed, 0x8c0d, 0x53e0, /* 0x36 */ 0x4e01, 0x76ef, 0x53ee, 0x9489, 0x9876, 0x9f0e, 0x952d, 0x5b9a, 0x8ba2, 0x4e22, 0x4e1c, 0x51ac, 0x8463, 0x61c2, 0x52a8, 0x680b, 0x4f97, 0x606b, 0x51bb, 0x6d1e, 0x515c, 0x6296, 0x6597, 0x9661, 0x8c46, 0x9017, 0x75d8, 0x90fd, 0x7763, 0x6bd2, 0x728a, 0x72ec, 0x8bfb, 0x5835, 0x7779, 0x8d4c, 0x675c, 0x9540, 0x809a, 0x5ea6, 0x6e21, 0x5992, 0x7aef, 0x77ed, 0x953b, 0x6bb5, 0x65ad, 0x7f0e, 0x5806, 0x5151, 0x961f, 0x5bf9, 0x58a9, 0x5428, 0x8e72, 0x6566, 0x987f, 0x56e4, 0x949d, 0x76fe, 0x9041, 0x6387, 0x54c6, 0x591a, 0x593a, 0x579b, 0x8eb2, 0x6735, 0x8dfa, 0x8235, 0x5241, 0x60f0, 0x5815, 0x86fe, 0x5ce8, 0x9e45, 0x4fc4, 0x989d, 0x8bb9, 0x5a25, 0x6076, 0x5384, 0x627c, 0x904f, 0x9102, 0x997f, 0x6069, 0x800c, 0x513f, 0x8033, 0x5c14, 0x9975, 0x6d31, 0x4e8c, /* 0x37 */ 0x8d30, 0x53d1, 0x7f5a, 0x7b4f, 0x4f10, 0x4e4f, 0x9600, 0x6cd5, 0x73d0, 0x85e9, 0x5e06, 0x756a, 0x7ffb, 0x6a0a, 0x77fe, 0x9492, 0x7e41, 0x51e1, 0x70e6, 0x53cd, 0x8fd4, 0x8303, 0x8d29, 0x72af, 0x996d, 0x6cdb, 0x574a, 0x82b3, 0x65b9, 0x80aa, 0x623f, 0x9632, 0x59a8, 0x4eff, 0x8bbf, 0x7eba, 0x653e, 0x83f2, 0x975e, 0x5561, 0x98de, 0x80a5, 0x532a, 0x8bfd, 0x5420, 0x80ba, 0x5e9f, 0x6cb8, 0x8d39, 0x82ac, 0x915a, 0x5429, 0x6c1b, 0x5206, 0x7eb7, 0x575f, 0x711a, 0x6c7e, 0x7c89, 0x594b, 0x4efd, 0x5fff, 0x6124, 0x7caa, 0x4e30, 0x5c01, 0x67ab, 0x8702, 0x5cf0, 0x950b, 0x98ce, 0x75af, 0x70fd, 0x9022, 0x51af, 0x7f1d, 0x8bbd, 0x5949, 0x51e4, 0x4f5b, 0x5426, 0x592b, 0x6577, 0x80a4, 0x5b75, 0x6276, 0x62c2, 0x8f90, 0x5e45, 0x6c1f, 0x7b26, 0x4f0f, 0x4fd8, 0x670d, /* 0x38 */ 0x6d6e, 0x6daa, 0x798f, 0x88b1, 0x5f17, 0x752b, 0x629a, 0x8f85, 0x4fef, 0x91dc, 0x65a7, 0x812f, 0x8151, 0x5e9c, 0x8150, 0x8d74, 0x526f, 0x8986, 0x8d4b, 0x590d, 0x5085, 0x4ed8, 0x961c, 0x7236, 0x8179, 0x8d1f, 0x5bcc, 0x8ba3, 0x9644, 0x5987, 0x7f1a, 0x5490, 0x5676, 0x560e, 0x8be5, 0x6539, 0x6982, 0x9499, 0x76d6, 0x6e89, 0x5e72, 0x7518, 0x6746, 0x67d1, 0x7aff, 0x809d, 0x8d76, 0x611f, 0x79c6, 0x6562, 0x8d63, 0x5188, 0x521a, 0x94a2, 0x7f38, 0x809b, 0x7eb2, 0x5c97, 0x6e2f, 0x6760, 0x7bd9, 0x768b, 0x9ad8, 0x818f, 0x7f94, 0x7cd5, 0x641e, 0x9550, 0x7a3f, 0x544a, 0x54e5, 0x6b4c, 0x6401, 0x6208, 0x9e3d, 0x80f3, 0x7599, 0x5272, 0x9769, 0x845b, 0x683c, 0x86e4, 0x9601, 0x9694, 0x94ec, 0x4e2a, 0x5404, 0x7ed9, 0x6839, 0x8ddf, 0x8015, 0x66f4, 0x5e9a, 0x7fb9, /* 0x39 */ 0x57c2, 0x803f, 0x6897, 0x5de5, 0x653b, 0x529f, 0x606d, 0x9f9a, 0x4f9b, 0x8eac, 0x516c, 0x5bab, 0x5f13, 0x5de9, 0x6c5e, 0x62f1, 0x8d21, 0x5171, 0x94a9, 0x52fe, 0x6c9f, 0x82df, 0x72d7, 0x57a2, 0x6784, 0x8d2d, 0x591f, 0x8f9c, 0x83c7, 0x5495, 0x7b8d, 0x4f30, 0x6cbd, 0x5b64, 0x59d1, 0x9f13, 0x53e4, 0x86ca, 0x9aa8, 0x8c37, 0x80a1, 0x6545, 0x987e, 0x56fa, 0x96c7, 0x522e, 0x74dc, 0x5250, 0x5be1, 0x6302, 0x8902, 0x4e56, 0x62d0, 0x602a, 0x68fa, 0x5173, 0x5b98, 0x51a0, 0x89c2, 0x7ba1, 0x9986, 0x7f50, 0x60ef, 0x704c, 0x8d2f, 0x5149, 0x5e7f, 0x901b, 0x7470, 0x89c4, 0x572d, 0x7845, 0x5f52, 0x9f9f, 0x95fa, 0x8f68, 0x9b3c, 0x8be1, 0x7678, 0x6842, 0x67dc, 0x8dea, 0x8d35, 0x523d, 0x8f8a, 0x6eda, 0x68cd, 0x9505, 0x90ed, 0x56fd, 0x679c, 0x88f9, 0x8fc7, 0x54c8, /* 0x3a */ 0x9ab8, 0x5b69, 0x6d77, 0x6c26, 0x4ea5, 0x5bb3, 0x9a87, 0x9163, 0x61a8, 0x90af, 0x97e9, 0x542b, 0x6db5, 0x5bd2, 0x51fd, 0x558a, 0x7f55, 0x7ff0, 0x64bc, 0x634d, 0x65f1, 0x61be, 0x608d, 0x710a, 0x6c57, 0x6c49, 0x592f, 0x676d, 0x822a, 0x58d5, 0x568e, 0x8c6a, 0x6beb, 0x90dd, 0x597d, 0x8017, 0x53f7, 0x6d69, 0x5475, 0x559d, 0x8377, 0x83cf, 0x6838, 0x79be, 0x548c, 0x4f55, 0x5408, 0x76d2, 0x8c89, 0x9602, 0x6cb3, 0x6db8, 0x8d6b, 0x8910, 0x9e64, 0x8d3a, 0x563f, 0x9ed1, 0x75d5, 0x5f88, 0x72e0, 0x6068, 0x54fc, 0x4ea8, 0x6a2a, 0x8861, 0x6052, 0x8f70, 0x54c4, 0x70d8, 0x8679, 0x9e3f, 0x6d2a, 0x5b8f, 0x5f18, 0x7ea2, 0x5589, 0x4faf, 0x7334, 0x543c, 0x539a, 0x5019, 0x540e, 0x547c, 0x4e4e, 0x5ffd, 0x745a, 0x58f6, 0x846b, 0x80e1, 0x8774, 0x72d0, 0x7cca, 0x6e56, /* 0x3b */ 0x5f27, 0x864e, 0x552c, 0x62a4, 0x4e92, 0x6caa, 0x6237, 0x82b1, 0x54d7, 0x534e, 0x733e, 0x6ed1, 0x753b, 0x5212, 0x5316, 0x8bdd, 0x69d0, 0x5f8a, 0x6000, 0x6dee, 0x574f, 0x6b22, 0x73af, 0x6853, 0x8fd8, 0x7f13, 0x6362, 0x60a3, 0x5524, 0x75ea, 0x8c62, 0x7115, 0x6da3, 0x5ba6, 0x5e7b, 0x8352, 0x614c, 0x9ec4, 0x78fa, 0x8757, 0x7c27, 0x7687, 0x51f0, 0x60f6, 0x714c, 0x6643, 0x5e4c, 0x604d, 0x8c0e, 0x7070, 0x6325, 0x8f89, 0x5fbd, 0x6062, 0x86d4, 0x56de, 0x6bc1, 0x6094, 0x6167, 0x5349, 0x60e0, 0x6666, 0x8d3f, 0x79fd, 0x4f1a, 0x70e9, 0x6c47, 0x8bb3, 0x8bf2, 0x7ed8, 0x8364, 0x660f, 0x5a5a, 0x9b42, 0x6d51, 0x6df7, 0x8c41, 0x6d3b, 0x4f19, 0x706b, 0x83b7, 0x6216, 0x60d1, 0x970d, 0x8d27, 0x7978, 0x51fb, 0x573e, 0x57fa, 0x673a, 0x7578, 0x7a3d, 0x79ef, 0x7b95, /* 0x3c */ 0x808c, 0x9965, 0x8ff9, 0x6fc0, 0x8ba5, 0x9e21, 0x59ec, 0x7ee9, 0x7f09, 0x5409, 0x6781, 0x68d8, 0x8f91, 0x7c4d, 0x96c6, 0x53ca, 0x6025, 0x75be, 0x6c72, 0x5373, 0x5ac9, 0x7ea7, 0x6324, 0x51e0, 0x810a, 0x5df1, 0x84df, 0x6280, 0x5180, 0x5b63, 0x4f0e, 0x796d, 0x5242, 0x60b8, 0x6d4e, 0x5bc4, 0x5bc2, 0x8ba1, 0x8bb0, 0x65e2, 0x5fcc, 0x9645, 0x5993, 0x7ee7, 0x7eaa, 0x5609, 0x67b7, 0x5939, 0x4f73, 0x5bb6, 0x52a0, 0x835a, 0x988a, 0x8d3e, 0x7532, 0x94be, 0x5047, 0x7a3c, 0x4ef7, 0x67b6, 0x9a7e, 0x5ac1, 0x6b7c, 0x76d1, 0x575a, 0x5c16, 0x7b3a, 0x95f4, 0x714e, 0x517c, 0x80a9, 0x8270, 0x5978, 0x7f04, 0x8327, 0x68c0, 0x67ec, 0x78b1, 0x7877, 0x62e3, 0x6361, 0x7b80, 0x4fed, 0x526a, 0x51cf, 0x8350, 0x69db, 0x9274, 0x8df5, 0x8d31, 0x89c1, 0x952e, 0x7bad, 0x4ef6, /* 0x3d */ 0x5065, 0x8230, 0x5251, 0x996f, 0x6e10, 0x6e85, 0x6da7, 0x5efa, 0x50f5, 0x59dc, 0x5c06, 0x6d46, 0x6c5f, 0x7586, 0x848b, 0x6868, 0x5956, 0x8bb2, 0x5320, 0x9171, 0x964d, 0x8549, 0x6912, 0x7901, 0x7126, 0x80f6, 0x4ea4, 0x90ca, 0x6d47, 0x9a84, 0x5a07, 0x56bc, 0x6405, 0x94f0, 0x77eb, 0x4fa5, 0x811a, 0x72e1, 0x89d2, 0x997a, 0x7f34, 0x7ede, 0x527f, 0x6559, 0x9175, 0x8f7f, 0x8f83, 0x53eb, 0x7a96, 0x63ed, 0x63a5, 0x7686, 0x79f8, 0x8857, 0x9636, 0x622a, 0x52ab, 0x8282, 0x6854, 0x6770, 0x6377, 0x776b, 0x7aed, 0x6d01, 0x7ed3, 0x89e3, 0x59d0, 0x6212, 0x85c9, 0x82a5, 0x754c, 0x501f, 0x4ecb, 0x75a5, 0x8beb, 0x5c4a, 0x5dfe, 0x7b4b, 0x65a4, 0x91d1, 0x4eca, 0x6d25, 0x895f, 0x7d27, 0x9526, 0x4ec5, 0x8c28, 0x8fdb, 0x9773, 0x664b, 0x7981, 0x8fd1, 0x70ec, 0x6d78, /* 0x3e */ 0x5c3d, 0x52b2, 0x8346, 0x5162, 0x830e, 0x775b, 0x6676, 0x9cb8, 0x4eac, 0x60ca, 0x7cbe, 0x7cb3, 0x7ecf, 0x4e95, 0x8b66, 0x666f, 0x9888, 0x9759, 0x5883, 0x656c, 0x955c, 0x5f84, 0x75c9, 0x9756, 0x7adf, 0x7ade, 0x51c0, 0x70af, 0x7a98, 0x63ea, 0x7a76, 0x7ea0, 0x7396, 0x97ed, 0x4e45, 0x7078, 0x4e5d, 0x9152, 0x53a9, 0x6551, 0x65e7, 0x81fc, 0x8205, 0x548e, 0x5c31, 0x759a, 0x97a0, 0x62d8, 0x72d9, 0x75bd, 0x5c45, 0x9a79, 0x83ca, 0x5c40, 0x5480, 0x77e9, 0x4e3e, 0x6cae, 0x805a, 0x62d2, 0x636e, 0x5de8, 0x5177, 0x8ddd, 0x8e1e, 0x952f, 0x4ff1, 0x53e5, 0x60e7, 0x70ac, 0x5267, 0x6350, 0x9e43, 0x5a1f, 0x5026, 0x7737, 0x5377, 0x7ee2, 0x6485, 0x652b, 0x6289, 0x6398, 0x5014, 0x7235, 0x89c9, 0x51b3, 0x8bc0, 0x7edd, 0x5747, 0x83cc, 0x94a7, 0x519b, 0x541b, 0x5cfb, /* 0x3f */ 0x4fca, 0x7ae3, 0x6d5a, 0x90e1, 0x9a8f, 0x5580, 0x5496, 0x5361, 0x54af, 0x5f00, 0x63e9, 0x6977, 0x51ef, 0x6168, 0x520a, 0x582a, 0x52d8, 0x574e, 0x780d, 0x770b, 0x5eb7, 0x6177, 0x7ce0, 0x625b, 0x6297, 0x4ea2, 0x7095, 0x8003, 0x62f7, 0x70e4, 0x9760, 0x5777, 0x82db, 0x67ef, 0x68f5, 0x78d5, 0x9897, 0x79d1, 0x58f3, 0x54b3, 0x53ef, 0x6e34, 0x514b, 0x523b, 0x5ba2, 0x8bfe, 0x80af, 0x5543, 0x57a6, 0x6073, 0x5751, 0x542d, 0x7a7a, 0x6050, 0x5b54, 0x63a7, 0x62a0, 0x53e3, 0x6263, 0x5bc7, 0x67af, 0x54ed, 0x7a9f, 0x82e6, 0x9177, 0x5e93, 0x88e4, 0x5938, 0x57ae, 0x630e, 0x8de8, 0x80ef, 0x5757, 0x7b77, 0x4fa9, 0x5feb, 0x5bbd, 0x6b3e, 0x5321, 0x7b50, 0x72c2, 0x6846, 0x77ff, 0x7736, 0x65f7, 0x51b5, 0x4e8f, 0x76d4, 0x5cbf, 0x7aa5, 0x8475, 0x594e, 0x9b41, 0x5080, /* 0x40 */ 0x9988, 0x6127, 0x6e83, 0x5764, 0x6606, 0x6346, 0x56f0, 0x62ec, 0x6269, 0x5ed3, 0x9614, 0x5783, 0x62c9, 0x5587, 0x8721, 0x814a, 0x8fa3, 0x5566, 0x83b1, 0x6765, 0x8d56, 0x84dd, 0x5a6a, 0x680f, 0x62e6, 0x7bee, 0x9611, 0x5170, 0x6f9c, 0x8c30, 0x63fd, 0x89c8, 0x61d2, 0x7f06, 0x70c2, 0x6ee5, 0x7405, 0x6994, 0x72fc, 0x5eca, 0x90ce, 0x6717, 0x6d6a, 0x635e, 0x52b3, 0x7262, 0x8001, 0x4f6c, 0x59e5, 0x916a, 0x70d9, 0x6d9d, 0x52d2, 0x4e50, 0x96f7, 0x956d, 0x857e, 0x78ca, 0x7d2f, 0x5121, 0x5792, 0x64c2, 0x808b, 0x7c7b, 0x6cea, 0x68f1, 0x695e, 0x51b7, 0x5398, 0x68a8, 0x7281, 0x9ece, 0x7bf1, 0x72f8, 0x79bb, 0x6f13, 0x7406, 0x674e, 0x91cc, 0x9ca4, 0x793c, 0x8389, 0x8354, 0x540f, 0x6817, 0x4e3d, 0x5389, 0x52b1, 0x783e, 0x5386, 0x5229, 0x5088, 0x4f8b, 0x4fd0, /* 0x41 */ 0x75e2, 0x7acb, 0x7c92, 0x6ca5, 0x96b6, 0x529b, 0x7483, 0x54e9, 0x4fe9, 0x8054, 0x83b2, 0x8fde, 0x9570, 0x5ec9, 0x601c, 0x6d9f, 0x5e18, 0x655b, 0x8138, 0x94fe, 0x604b, 0x70bc, 0x7ec3, 0x7cae, 0x51c9, 0x6881, 0x7cb1, 0x826f, 0x4e24, 0x8f86, 0x91cf, 0x667e, 0x4eae, 0x8c05, 0x64a9, 0x804a, 0x50da, 0x7597, 0x71ce, 0x5be5, 0x8fbd, 0x6f66, 0x4e86, 0x6482, 0x9563, 0x5ed6, 0x6599, 0x5217, 0x88c2, 0x70c8, 0x52a3, 0x730e, 0x7433, 0x6797, 0x78f7, 0x9716, 0x4e34, 0x90bb, 0x9cde, 0x6dcb, 0x51db, 0x8d41, 0x541d, 0x62ce, 0x73b2, 0x83f1, 0x96f6, 0x9f84, 0x94c3, 0x4f36, 0x7f9a, 0x51cc, 0x7075, 0x9675, 0x5cad, 0x9886, 0x53e6, 0x4ee4, 0x6e9c, 0x7409, 0x69b4, 0x786b, 0x998f, 0x7559, 0x5218, 0x7624, 0x6d41, 0x67f3, 0x516d, 0x9f99, 0x804b, 0x5499, 0x7b3c, 0x7abf, /* 0x42 */ 0x9686, 0x5784, 0x62e2, 0x9647, 0x697c, 0x5a04, 0x6402, 0x7bd3, 0x6f0f, 0x964b, 0x82a6, 0x5362, 0x9885, 0x5e90, 0x7089, 0x63b3, 0x5364, 0x864f, 0x9c81, 0x9e93, 0x788c, 0x9732, 0x8def, 0x8d42, 0x9e7f, 0x6f5e, 0x7984, 0x5f55, 0x9646, 0x622e, 0x9a74, 0x5415, 0x94dd, 0x4fa3, 0x65c5, 0x5c65, 0x5c61, 0x7f15, 0x8651, 0x6c2f, 0x5f8b, 0x7387, 0x6ee4, 0x7eff, 0x5ce6, 0x631b, 0x5b6a, 0x6ee6, 0x5375, 0x4e71, 0x63a0, 0x7565, 0x62a1, 0x8f6e, 0x4f26, 0x4ed1, 0x6ca6, 0x7eb6, 0x8bba, 0x841d, 0x87ba, 0x7f57, 0x903b, 0x9523, 0x7ba9, 0x9aa1, 0x88f8, 0x843d, 0x6d1b, 0x9a86, 0x7edc, 0x5988, 0x9ebb, 0x739b, 0x7801, 0x8682, 0x9a6c, 0x9a82, 0x561b, 0x5417, 0x57cb, 0x4e70, 0x9ea6, 0x5356, 0x8fc8, 0x8109, 0x7792, 0x9992, 0x86ee, 0x6ee1, 0x8513, 0x66fc, 0x6162, 0x6f2b, /* 0x43 */ 0x8c29, 0x8292, 0x832b, 0x76f2, 0x6c13, 0x5fd9, 0x83bd, 0x732b, 0x8305, 0x951a, 0x6bdb, 0x77db, 0x94c6, 0x536f, 0x8302, 0x5192, 0x5e3d, 0x8c8c, 0x8d38, 0x4e48, 0x73ab, 0x679a, 0x6885, 0x9176, 0x9709, 0x7164, 0x6ca1, 0x7709, 0x5a92, 0x9541, 0x6bcf, 0x7f8e, 0x6627, 0x5bd0, 0x59b9, 0x5a9a, 0x95e8, 0x95f7, 0x4eec, 0x840c, 0x8499, 0x6aac, 0x76df, 0x9530, 0x731b, 0x68a6, 0x5b5f, 0x772f, 0x919a, 0x9761, 0x7cdc, 0x8ff7, 0x8c1c, 0x5f25, 0x7c73, 0x79d8, 0x89c5, 0x6ccc, 0x871c, 0x5bc6, 0x5e42, 0x68c9, 0x7720, 0x7ef5, 0x5195, 0x514d, 0x52c9, 0x5a29, 0x7f05, 0x9762, 0x82d7, 0x63cf, 0x7784, 0x85d0, 0x79d2, 0x6e3a, 0x5e99, 0x5999, 0x8511, 0x706d, 0x6c11, 0x62bf, 0x76bf, 0x654f, 0x60af, 0x95fd, 0x660e, 0x879f, 0x9e23, 0x94ed, 0x540d, 0x547d, 0x8c2c, 0x6478, /* 0x44 */ 0x6479, 0x8611, 0x6a21, 0x819c, 0x78e8, 0x6469, 0x9b54, 0x62b9, 0x672b, 0x83ab, 0x58a8, 0x9ed8, 0x6cab, 0x6f20, 0x5bde, 0x964c, 0x8c0b, 0x725f, 0x67d0, 0x62c7, 0x7261, 0x4ea9, 0x59c6, 0x6bcd, 0x5893, 0x66ae, 0x5e55, 0x52df, 0x6155, 0x6728, 0x76ee, 0x7766, 0x7267, 0x7a46, 0x62ff, 0x54ea, 0x5450, 0x94a0, 0x90a3, 0x5a1c, 0x7eb3, 0x6c16, 0x4e43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537, 0x96be, 0x56ca, 0x6320, 0x8111, 0x607c, 0x95f9, 0x6dd6, 0x5462, 0x9981, 0x5185, 0x5ae9, 0x80fd, 0x59ae, 0x9713, 0x502a, 0x6ce5, 0x5c3c, 0x62df, 0x4f60, 0x533f, 0x817b, 0x9006, 0x6eba, 0x852b, 0x62c8, 0x5e74, 0x78be, 0x64b5, 0x637b, 0x5ff5, 0x5a18, 0x917f, 0x9e1f, 0x5c3f, 0x634f, 0x8042, 0x5b7d, 0x556e, 0x954a, 0x954d, 0x6d85, 0x60a8, 0x67e0, 0x72de, 0x51dd, 0x5b81, /* 0x45 */ 0x62e7, 0x6cde, 0x725b, 0x626d, 0x94ae, 0x7ebd, 0x8113, 0x6d53, 0x519c, 0x5f04, 0x5974, 0x52aa, 0x6012, 0x5973, 0x6696, 0x8650, 0x759f, 0x632a, 0x61e6, 0x7cef, 0x8bfa, 0x54e6, 0x6b27, 0x9e25, 0x6bb4, 0x85d5, 0x5455, 0x5076, 0x6ca4, 0x556a, 0x8db4, 0x722c, 0x5e15, 0x6015, 0x7436, 0x62cd, 0x6392, 0x724c, 0x5f98, 0x6e43, 0x6d3e, 0x6500, 0x6f58, 0x76d8, 0x78d0, 0x76fc, 0x7554, 0x5224, 0x53db, 0x4e53, 0x5e9e, 0x65c1, 0x802a, 0x80d6, 0x629b, 0x5486, 0x5228, 0x70ae, 0x888d, 0x8dd1, 0x6ce1, 0x5478, 0x80da, 0x57f9, 0x88f4, 0x8d54, 0x966a, 0x914d, 0x4f69, 0x6c9b, 0x55b7, 0x76c6, 0x7830, 0x62a8, 0x70f9, 0x6f8e, 0x5f6d, 0x84ec, 0x68da, 0x787c, 0x7bf7, 0x81a8, 0x670b, 0x9e4f, 0x6367, 0x78b0, 0x576f, 0x7812, 0x9739, 0x6279, 0x62ab, 0x5288, 0x7435, 0x6bd7, /* 0x46 */ 0x5564, 0x813e, 0x75b2, 0x76ae, 0x5339, 0x75de, 0x50fb, 0x5c41, 0x8b6c, 0x7bc7, 0x504f, 0x7247, 0x9a97, 0x98d8, 0x6f02, 0x74e2, 0x7968, 0x6487, 0x77a5, 0x62fc, 0x9891, 0x8d2b, 0x54c1, 0x8058, 0x4e52, 0x576a, 0x82f9, 0x840d, 0x5e73, 0x51ed, 0x74f6, 0x8bc4, 0x5c4f, 0x5761, 0x6cfc, 0x9887, 0x5a46, 0x7834, 0x9b44, 0x8feb, 0x7c95, 0x5256, 0x6251, 0x94fa, 0x4ec6, 0x8386, 0x8461, 0x83e9, 0x84b2, 0x57d4, 0x6734, 0x5703, 0x666e, 0x6d66, 0x8c31, 0x66dd, 0x7011, 0x671f, 0x6b3a, 0x6816, 0x621a, 0x59bb, 0x4e03, 0x51c4, 0x6f06, 0x67d2, 0x6c8f, 0x5176, 0x68cb, 0x5947, 0x6b67, 0x7566, 0x5d0e, 0x8110, 0x9f50, 0x65d7, 0x7948, 0x7941, 0x9a91, 0x8d77, 0x5c82, 0x4e5e, 0x4f01, 0x542f, 0x5951, 0x780c, 0x5668, 0x6c14, 0x8fc4, 0x5f03, 0x6c7d, 0x6ce3, 0x8bab, 0x6390, /* 0x47 */ 0x6070, 0x6d3d, 0x7275, 0x6266, 0x948e, 0x94c5, 0x5343, 0x8fc1, 0x7b7e, 0x4edf, 0x8c26, 0x4e7e, 0x9ed4, 0x94b1, 0x94b3, 0x524d, 0x6f5c, 0x9063, 0x6d45, 0x8c34, 0x5811, 0x5d4c, 0x6b20, 0x6b49, 0x67aa, 0x545b, 0x8154, 0x7f8c, 0x5899, 0x8537, 0x5f3a, 0x62a2, 0x6a47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77a7, 0x4e54, 0x4fa8, 0x5de7, 0x9798, 0x64ac, 0x7fd8, 0x5ced, 0x4fcf, 0x7a8d, 0x5207, 0x8304, 0x4e14, 0x602f, 0x7a83, 0x94a6, 0x4fb5, 0x4eb2, 0x79e6, 0x7434, 0x52e4, 0x82b9, 0x64d2, 0x79bd, 0x5bdd, 0x6c81, 0x9752, 0x8f7b, 0x6c22, 0x503e, 0x537f, 0x6e05, 0x64ce, 0x6674, 0x6c30, 0x60c5, 0x9877, 0x8bf7, 0x5e86, 0x743c, 0x7a77, 0x79cb, 0x4e18, 0x90b1, 0x7403, 0x6c42, 0x56da, 0x914b, 0x6cc5, 0x8d8b, 0x533a, 0x86c6, 0x66f2, 0x8eaf, 0x5c48, 0x9a71, 0x6e20, /* 0x48 */ 0x53d6, 0x5a36, 0x9f8b, 0x8da3, 0x53bb, 0x5708, 0x98a7, 0x6743, 0x919b, 0x6cc9, 0x5168, 0x75ca, 0x62f3, 0x72ac, 0x5238, 0x529d, 0x7f3a, 0x7094, 0x7638, 0x5374, 0x9e4a, 0x69b7, 0x786e, 0x96c0, 0x88d9, 0x7fa4, 0x7136, 0x71c3, 0x5189, 0x67d3, 0x74e4, 0x58e4, 0x6518, 0x56b7, 0x8ba9, 0x9976, 0x6270, 0x7ed5, 0x60f9, 0x70ed, 0x58ec, 0x4ec1, 0x4eba, 0x5fcd, 0x97e7, 0x4efb, 0x8ba4, 0x5203, 0x598a, 0x7eab, 0x6254, 0x4ecd, 0x65e5, 0x620e, 0x8338, 0x84c9, 0x8363, 0x878d, 0x7194, 0x6eb6, 0x5bb9, 0x7ed2, 0x5197, 0x63c9, 0x67d4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5b7a, 0x5982, 0x8fb1, 0x4e73, 0x6c5d, 0x5165, 0x8925, 0x8f6f, 0x962e, 0x854a, 0x745e, 0x9510, 0x95f0, 0x6da6, 0x82e5, 0x5f31, 0x6492, 0x6d12, 0x8428, 0x816e, 0x9cc3, 0x585e, 0x8d5b, 0x4e09, 0x53c1, /* 0x49 */ 0x4f1e, 0x6563, 0x6851, 0x55d3, 0x4e27, 0x6414, 0x9a9a, 0x626b, 0x5ac2, 0x745f, 0x8272, 0x6da9, 0x68ee, 0x50e7, 0x838e, 0x7802, 0x6740, 0x5239, 0x6c99, 0x7eb1, 0x50bb, 0x5565, 0x715e, 0x7b5b, 0x6652, 0x73ca, 0x82eb, 0x6749, 0x5c71, 0x5220, 0x717d, 0x886b, 0x95ea, 0x9655, 0x64c5, 0x8d61, 0x81b3, 0x5584, 0x6c55, 0x6247, 0x7f2e, 0x5892, 0x4f24, 0x5546, 0x8d4f, 0x664c, 0x4e0a, 0x5c1a, 0x88f3, 0x68a2, 0x634e, 0x7a0d, 0x70e7, 0x828d, 0x52fa, 0x97f6, 0x5c11, 0x54e8, 0x90b5, 0x7ecd, 0x5962, 0x8d4a, 0x86c7, 0x820c, 0x820d, 0x8d66, 0x6444, 0x5c04, 0x6151, 0x6d89, 0x793e, 0x8bbe, 0x7837, 0x7533, 0x547b, 0x4f38, 0x8eab, 0x6df1, 0x5a20, 0x7ec5, 0x795e, 0x6c88, 0x5ba1, 0x5a76, 0x751a, 0x80be, 0x614e, 0x6e17, 0x58f0, 0x751f, 0x7525, 0x7272, 0x5347, 0x7ef3, /* 0x4a */ 0x7701, 0x76db, 0x5269, 0x80dc, 0x5723, 0x5e08, 0x5931, 0x72ee, 0x65bd, 0x6e7f, 0x8bd7, 0x5c38, 0x8671, 0x5341, 0x77f3, 0x62fe, 0x65f6, 0x4ec0, 0x98df, 0x8680, 0x5b9e, 0x8bc6, 0x53f2, 0x77e2, 0x4f7f, 0x5c4e, 0x9a76, 0x59cb, 0x5f0f, 0x793a, 0x58eb, 0x4e16, 0x67ff, 0x4e8b, 0x62ed, 0x8a93, 0x901d, 0x52bf, 0x662f, 0x55dc, 0x566c, 0x9002, 0x4ed5, 0x4f8d, 0x91ca, 0x9970, 0x6c0f, 0x5e02, 0x6043, 0x5ba4, 0x89c6, 0x8bd5, 0x6536, 0x624b, 0x9996, 0x5b88, 0x5bff, 0x6388, 0x552e, 0x53d7, 0x7626, 0x517d, 0x852c, 0x67a2, 0x68b3, 0x6b8a, 0x6292, 0x8f93, 0x53d4, 0x8212, 0x6dd1, 0x758f, 0x4e66, 0x8d4e, 0x5b70, 0x719f, 0x85af, 0x6691, 0x66d9, 0x7f72, 0x8700, 0x9ecd, 0x9f20, 0x5c5e, 0x672f, 0x8ff0, 0x6811, 0x675f, 0x620d, 0x7ad6, 0x5885, 0x5eb6, 0x6570, 0x6f31, /* 0x4b */ 0x6055, 0x5237, 0x800d, 0x6454, 0x8870, 0x7529, 0x5e05, 0x6813, 0x62f4, 0x971c, 0x53cc, 0x723d, 0x8c01, 0x6c34, 0x7761, 0x7a0e, 0x542e, 0x77ac, 0x987a, 0x821c, 0x8bf4, 0x7855, 0x6714, 0x70c1, 0x65af, 0x6495, 0x5636, 0x601d, 0x79c1, 0x53f8, 0x4e1d, 0x6b7b, 0x8086, 0x5bfa, 0x55e3, 0x56db, 0x4f3a, 0x4f3c, 0x9972, 0x5df3, 0x677e, 0x8038, 0x6002, 0x9882, 0x9001, 0x5b8b, 0x8bbc, 0x8bf5, 0x641c, 0x8258, 0x64de, 0x55fd, 0x82cf, 0x9165, 0x4fd7, 0x7d20, 0x901f, 0x7c9f, 0x50f3, 0x5851, 0x6eaf, 0x5bbf, 0x8bc9, 0x8083, 0x9178, 0x849c, 0x7b97, 0x867d, 0x968b, 0x968f, 0x7ee5, 0x9ad3, 0x788e, 0x5c81, 0x7a57, 0x9042, 0x96a7, 0x795f, 0x5b59, 0x635f, 0x7b0b, 0x84d1, 0x68ad, 0x5506, 0x7f29, 0x7410, 0x7d22, 0x9501, 0x6240, 0x584c, 0x4ed6, 0x5b83, 0x5979, 0x5854, /* 0x4c */ 0x736d, 0x631e, 0x8e4b, 0x8e0f, 0x80ce, 0x82d4, 0x62ac, 0x53f0, 0x6cf0, 0x915e, 0x592a, 0x6001, 0x6c70, 0x574d, 0x644a, 0x8d2a, 0x762b, 0x6ee9, 0x575b, 0x6a80, 0x75f0, 0x6f6d, 0x8c2d, 0x8c08, 0x5766, 0x6bef, 0x8892, 0x78b3, 0x63a2, 0x53f9, 0x70ad, 0x6c64, 0x5858, 0x642a, 0x5802, 0x68e0, 0x819b, 0x5510, 0x7cd6, 0x5018, 0x8eba, 0x6dcc, 0x8d9f, 0x70eb, 0x638f, 0x6d9b, 0x6ed4, 0x7ee6, 0x8404, 0x6843, 0x9003, 0x6dd8, 0x9676, 0x8ba8, 0x5957, 0x7279, 0x85e4, 0x817e, 0x75bc, 0x8a8a, 0x68af, 0x5254, 0x8e22, 0x9511, 0x63d0, 0x9898, 0x8e44, 0x557c, 0x4f53, 0x66ff, 0x568f, 0x60d5, 0x6d95, 0x5243, 0x5c49, 0x5929, 0x6dfb, 0x586b, 0x7530, 0x751c, 0x606c, 0x8214, 0x8146, 0x6311, 0x6761, 0x8fe2, 0x773a, 0x8df3, 0x8d34, 0x94c1, 0x5e16, 0x5385, 0x542c, 0x70c3, /* 0x4d */ 0x6c40, 0x5ef7, 0x505c, 0x4ead, 0x5ead, 0x633a, 0x8247, 0x901a, 0x6850, 0x916e, 0x77b3, 0x540c, 0x94dc, 0x5f64, 0x7ae5, 0x6876, 0x6345, 0x7b52, 0x7edf, 0x75db, 0x5077, 0x6295, 0x5934, 0x900f, 0x51f8, 0x79c3, 0x7a81, 0x56fe, 0x5f92, 0x9014, 0x6d82, 0x5c60, 0x571f, 0x5410, 0x5154, 0x6e4d, 0x56e2, 0x63a8, 0x9893, 0x817f, 0x8715, 0x892a, 0x9000, 0x541e, 0x5c6f, 0x81c0, 0x62d6, 0x6258, 0x8131, 0x9e35, 0x9640, 0x9a6e, 0x9a7c, 0x692d, 0x59a5, 0x62d3, 0x553e, 0x6316, 0x54c7, 0x86d9, 0x6d3c, 0x5a03, 0x74e6, 0x889c, 0x6b6a, 0x5916, 0x8c4c, 0x5f2f, 0x6e7e, 0x73a9, 0x987d, 0x4e38, 0x70f7, 0x5b8c, 0x7897, 0x633d, 0x665a, 0x7696, 0x60cb, 0x5b9b, 0x5a49, 0x4e07, 0x8155, 0x6c6a, 0x738b, 0x4ea1, 0x6789, 0x7f51, 0x5f80, 0x65fa, 0x671b, 0x5fd8, 0x5984, 0x5a01, /* 0x4e */ 0x5dcd, 0x5fae, 0x5371, 0x97e6, 0x8fdd, 0x6845, 0x56f4, 0x552f, 0x60df, 0x4e3a, 0x6f4d, 0x7ef4, 0x82c7, 0x840e, 0x59d4, 0x4f1f, 0x4f2a, 0x5c3e, 0x7eac, 0x672a, 0x851a, 0x5473, 0x754f, 0x80c3, 0x5582, 0x9b4f, 0x4f4d, 0x6e2d, 0x8c13, 0x5c09, 0x6170, 0x536b, 0x761f, 0x6e29, 0x868a, 0x6587, 0x95fb, 0x7eb9, 0x543b, 0x7a33, 0x7d0a, 0x95ee, 0x55e1, 0x7fc1, 0x74ee, 0x631d, 0x8717, 0x6da1, 0x7a9d, 0x6211, 0x65a1, 0x5367, 0x63e1, 0x6c83, 0x5deb, 0x545c, 0x94a8, 0x4e4c, 0x6c61, 0x8bec, 0x5c4b, 0x65e0, 0x829c, 0x68a7, 0x543e, 0x5434, 0x6bcb, 0x6b66, 0x4e94, 0x6342, 0x5348, 0x821e, 0x4f0d, 0x4fae, 0x575e, 0x620a, 0x96fe, 0x6664, 0x7269, 0x52ff, 0x52a1, 0x609f, 0x8bef, 0x6614, 0x7199, 0x6790, 0x897f, 0x7852, 0x77fd, 0x6670, 0x563b, 0x5438, 0x9521, 0x727a, /* 0x4f */ 0x7a00, 0x606f, 0x5e0c, 0x6089, 0x819d, 0x5915, 0x60dc, 0x7184, 0x70ef, 0x6eaa, 0x6c50, 0x7280, 0x6a84, 0x88ad, 0x5e2d, 0x4e60, 0x5ab3, 0x559c, 0x94e3, 0x6d17, 0x7cfb, 0x9699, 0x620f, 0x7ec6, 0x778e, 0x867e, 0x5323, 0x971e, 0x8f96, 0x6687, 0x5ce1, 0x4fa0, 0x72ed, 0x4e0b, 0x53a6, 0x590f, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ed9, 0x9c9c, 0x7ea4, 0x54b8, 0x8d24, 0x8854, 0x8237, 0x95f2, 0x6d8e, 0x5f26, 0x5acc, 0x663e, 0x9669, 0x73b0, 0x732e, 0x53bf, 0x817a, 0x9985, 0x7fa1, 0x5baa, 0x9677, 0x9650, 0x7ebf, 0x76f8, 0x53a2, 0x9576, 0x9999, 0x7bb1, 0x8944, 0x6e58, 0x4e61, 0x7fd4, 0x7965, 0x8be6, 0x60f3, 0x54cd, 0x4eab, 0x9879, 0x5df7, 0x6a61, 0x50cf, 0x5411, 0x8c61, 0x8427, 0x785d, 0x9704, 0x524a, 0x54ee, 0x56a3, 0x9500, 0x6d88, 0x5bb5, 0x6dc6, 0x6653, /* 0x50 */ 0x5c0f, 0x5b5d, 0x6821, 0x8096, 0x5578, 0x7b11, 0x6548, 0x6954, 0x4e9b, 0x6b47, 0x874e, 0x978b, 0x534f, 0x631f, 0x643a, 0x90aa, 0x659c, 0x80c1, 0x8c10, 0x5199, 0x68b0, 0x5378, 0x87f9, 0x61c8, 0x6cc4, 0x6cfb, 0x8c22, 0x5c51, 0x85aa, 0x82af, 0x950c, 0x6b23, 0x8f9b, 0x65b0, 0x5ffb, 0x5fc3, 0x4fe1, 0x8845, 0x661f, 0x8165, 0x7329, 0x60fa, 0x5174, 0x5211, 0x578b, 0x5f62, 0x90a2, 0x884c, 0x9192, 0x5e78, 0x674f, 0x6027, 0x59d3, 0x5144, 0x51f6, 0x80f8, 0x5308, 0x6c79, 0x96c4, 0x718a, 0x4f11, 0x4fee, 0x7f9e, 0x673d, 0x55c5, 0x9508, 0x79c0, 0x8896, 0x7ee3, 0x589f, 0x620c, 0x9700, 0x865a, 0x5618, 0x987b, 0x5f90, 0x8bb8, 0x84c4, 0x9157, 0x53d9, 0x65ed, 0x5e8f, 0x755c, 0x6064, 0x7d6e, 0x5a7f, 0x7eea, 0x7eed, 0x8f69, 0x55a7, 0x5ba3, 0x60ac, 0x65cb, 0x7384, /* 0x51 */ 0x9009, 0x7663, 0x7729, 0x7eda, 0x9774, 0x859b, 0x5b66, 0x7a74, 0x96ea, 0x8840, 0x52cb, 0x718f, 0x5faa, 0x65ec, 0x8be2, 0x5bfb, 0x9a6f, 0x5de1, 0x6b89, 0x6c5b, 0x8bad, 0x8baf, 0x900a, 0x8fc5, 0x538b, 0x62bc, 0x9e26, 0x9e2d, 0x5440, 0x4e2b, 0x82bd, 0x7259, 0x869c, 0x5d16, 0x8859, 0x6daf, 0x96c5, 0x54d1, 0x4e9a, 0x8bb6, 0x7109, 0x54bd, 0x9609, 0x70df, 0x6df9, 0x76d0, 0x4e25, 0x7814, 0x8712, 0x5ca9, 0x5ef6, 0x8a00, 0x989c, 0x960e, 0x708e, 0x6cbf, 0x5944, 0x63a9, 0x773c, 0x884d, 0x6f14, 0x8273, 0x5830, 0x71d5, 0x538c, 0x781a, 0x96c1, 0x5501, 0x5f66, 0x7130, 0x5bb4, 0x8c1a, 0x9a8c, 0x6b83, 0x592e, 0x9e2f, 0x79e7, 0x6768, 0x626c, 0x4f6f, 0x75a1, 0x7f8a, 0x6d0b, 0x9633, 0x6c27, 0x4ef0, 0x75d2, 0x517b, 0x6837, 0x6f3e, 0x9080, 0x8170, 0x5996, 0x7476, /* 0x52 */ 0x6447, 0x5c27, 0x9065, 0x7a91, 0x8c23, 0x59da, 0x54ac, 0x8200, 0x836f, 0x8981, 0x8000, 0x6930, 0x564e, 0x8036, 0x7237, 0x91ce, 0x51b6, 0x4e5f, 0x9875, 0x6396, 0x4e1a, 0x53f6, 0x66f3, 0x814b, 0x591c, 0x6db2, 0x4e00, 0x58f9, 0x533b, 0x63d6, 0x94f1, 0x4f9d, 0x4f0a, 0x8863, 0x9890, 0x5937, 0x9057, 0x79fb, 0x4eea, 0x80f0, 0x7591, 0x6c82, 0x5b9c, 0x59e8, 0x5f5d, 0x6905, 0x8681, 0x501a, 0x5df2, 0x4e59, 0x77e3, 0x4ee5, 0x827a, 0x6291, 0x6613, 0x9091, 0x5c79, 0x4ebf, 0x5f79, 0x81c6, 0x9038, 0x8084, 0x75ab, 0x4ea6, 0x88d4, 0x610f, 0x6bc5, 0x5fc6, 0x4e49, 0x76ca, 0x6ea2, 0x8be3, 0x8bae, 0x8c0a, 0x8bd1, 0x5f02, 0x7ffc, 0x7fcc, 0x7ece, 0x8335, 0x836b, 0x56e0, 0x6bb7, 0x97f3, 0x9634, 0x59fb, 0x541f, 0x94f6, 0x6deb, 0x5bc5, 0x996e, 0x5c39, 0x5f15, 0x9690, /* 0x53 */ 0x5370, 0x82f1, 0x6a31, 0x5a74, 0x9e70, 0x5e94, 0x7f28, 0x83b9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8fce, 0x8d62, 0x76c8, 0x5f71, 0x9896, 0x786c, 0x6620, 0x54df, 0x62e5, 0x4f63, 0x81c3, 0x75c8, 0x5eb8, 0x96cd, 0x8e0a, 0x86f9, 0x548f, 0x6cf3, 0x6d8c, 0x6c38, 0x607f, 0x52c7, 0x7528, 0x5e7d, 0x4f18, 0x60a0, 0x5fe7, 0x5c24, 0x7531, 0x90ae, 0x94c0, 0x72b9, 0x6cb9, 0x6e38, 0x9149, 0x6709, 0x53cb, 0x53f3, 0x4f51, 0x91c9, 0x8bf1, 0x53c8, 0x5e7c, 0x8fc2, 0x6de4, 0x4e8e, 0x76c2, 0x6986, 0x865e, 0x611a, 0x8206, 0x4f59, 0x4fde, 0x903e, 0x9c7c, 0x6109, 0x6e1d, 0x6e14, 0x9685, 0x4e88, 0x5a31, 0x96e8, 0x4e0e, 0x5c7f, 0x79b9, 0x5b87, 0x8bed, 0x7fbd, 0x7389, 0x57df, 0x828b, 0x90c1, 0x5401, 0x9047, 0x55bb, 0x5cea, 0x5fa1, 0x6108, 0x6b32, 0x72f1, 0x80b2, 0x8a89, /* 0x54 */ 0x6d74, 0x5bd3, 0x88d5, 0x9884, 0x8c6b, 0x9a6d, 0x9e33, 0x6e0a, 0x51a4, 0x5143, 0x57a3, 0x8881, 0x539f, 0x63f4, 0x8f95, 0x56ed, 0x5458, 0x5706, 0x733f, 0x6e90, 0x7f18, 0x8fdc, 0x82d1, 0x613f, 0x6028, 0x9662, 0x66f0, 0x7ea6, 0x8d8a, 0x8dc3, 0x94a5, 0x5cb3, 0x7ca4, 0x6708, 0x60a6, 0x9605, 0x8018, 0x4e91, 0x90e7, 0x5300, 0x9668, 0x5141, 0x8fd0, 0x8574, 0x915d, 0x6655, 0x97f5, 0x5b55, 0x531d, 0x7838, 0x6742, 0x683d, 0x54c9, 0x707e, 0x5bb0, 0x8f7d, 0x518d, 0x5728, 0x54b1, 0x6512, 0x6682, 0x8d5e, 0x8d43, 0x810f, 0x846c, 0x906d, 0x7cdf, 0x51ff, 0x85fb, 0x67a3, 0x65e9, 0x6fa1, 0x86a4, 0x8e81, 0x566a, 0x9020, 0x7682, 0x7076, 0x71e5, 0x8d23, 0x62e9, 0x5219, 0x6cfd, 0x8d3c, 0x600e, 0x589e, 0x618e, 0x66fe, 0x8d60, 0x624e, 0x55b3, 0x6e23, 0x672d, 0x8f67, /* 0x55 */ 0x94e1, 0x95f8, 0x7728, 0x6805, 0x69a8, 0x548b, 0x4e4d, 0x70b8, 0x8bc8, 0x6458, 0x658b, 0x5b85, 0x7a84, 0x503a, 0x5be8, 0x77bb, 0x6be1, 0x8a79, 0x7c98, 0x6cbe, 0x76cf, 0x65a9, 0x8f97, 0x5d2d, 0x5c55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7ad9, 0x6e5b, 0x7efd, 0x6a1f, 0x7ae0, 0x5f70, 0x6f33, 0x5f20, 0x638c, 0x6da8, 0x6756, 0x4e08, 0x5e10, 0x8d26, 0x4ed7, 0x80c0, 0x7634, 0x969c, 0x62db, 0x662d, 0x627e, 0x6cbc, 0x8d75, 0x7167, 0x7f69, 0x5146, 0x8087, 0x53ec, 0x906e, 0x6298, 0x54f2, 0x86f0, 0x8f99, 0x8005, 0x9517, 0x8517, 0x8fd9, 0x6d59, 0x73cd, 0x659f, 0x771f, 0x7504, 0x7827, 0x81fb, 0x8d1e, 0x9488, 0x4fa6, 0x6795, 0x75b9, 0x8bca, 0x9707, 0x632f, 0x9547, 0x9635, 0x84b8, 0x6323, 0x7741, 0x5f81, 0x72f0, 0x4e89, 0x6014, 0x6574, 0x62ef, 0x6b63, 0x653f, /* 0x56 */ 0x5e27, 0x75c7, 0x90d1, 0x8bc1, 0x829d, 0x679d, 0x652f, 0x5431, 0x8718, 0x77e5, 0x80a2, 0x8102, 0x6c41, 0x4e4b, 0x7ec7, 0x804c, 0x76f4, 0x690d, 0x6b96, 0x6267, 0x503c, 0x4f84, 0x5740, 0x6307, 0x6b62, 0x8dbe, 0x53ea, 0x65e8, 0x7eb8, 0x5fd7, 0x631a, 0x63b7, 0x81f3, 0x81f4, 0x7f6e, 0x5e1c, 0x5cd9, 0x5236, 0x667a, 0x79e9, 0x7a1a, 0x8d28, 0x7099, 0x75d4, 0x6ede, 0x6cbb, 0x7a92, 0x4e2d, 0x76c5, 0x5fe0, 0x949f, 0x8877, 0x7ec8, 0x79cd, 0x80bf, 0x91cd, 0x4ef2, 0x4f17, 0x821f, 0x5468, 0x5dde, 0x6d32, 0x8bcc, 0x7ca5, 0x8f74, 0x8098, 0x5e1a, 0x5492, 0x76b1, 0x5b99, 0x663c, 0x9aa4, 0x73e0, 0x682a, 0x86db, 0x6731, 0x732a, 0x8bf8, 0x8bdb, 0x9010, 0x7af9, 0x70db, 0x716e, 0x62c4, 0x77a9, 0x5631, 0x4e3b, 0x8457, 0x67f1, 0x52a9, 0x86c0, 0x8d2e, 0x94f8, 0x7b51, /* 0x57 */ 0x4f4f, 0x6ce8, 0x795d, 0x9a7b, 0x6293, 0x722a, 0x62fd, 0x4e13, 0x7816, 0x8f6c, 0x64b0, 0x8d5a, 0x7bc6, 0x6869, 0x5e84, 0x88c5, 0x5986, 0x649e, 0x58ee, 0x72b6, 0x690e, 0x9525, 0x8ffd, 0x8d58, 0x5760, 0x7f00, 0x8c06, 0x51c6, 0x6349, 0x62d9, 0x5353, 0x684c, 0x7422, 0x8301, 0x914c, 0x5544, 0x7740, 0x707c, 0x6d4a, 0x5179, 0x54a8, 0x8d44, 0x59ff, 0x6ecb, 0x6dc4, 0x5b5c, 0x7d2b, 0x4ed4, 0x7c7d, 0x6ed3, 0x5b50, 0x81ea, 0x6e0d, 0x5b57, 0x9b03, 0x68d5, 0x8e2a, 0x5b97, 0x7efc, 0x603b, 0x7eb5, 0x90b9, 0x8d70, 0x594f, 0x63cd, 0x79df, 0x8db3, 0x5352, 0x65cf, 0x7956, 0x8bc5, 0x963b, 0x7ec4, 0x94bb, 0x7e82, 0x5634, 0x9189, 0x6700, 0x7f6a, 0x5c0a, 0x9075, 0x6628, 0x5de6, 0x4f50, 0x67de, 0x505a, 0x4f5c, 0x5750, 0x5ea7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x58 */ 0x4e8d, 0x4e0c, 0x5140, 0x4e10, 0x5eff, 0x5345, 0x4e15, 0x4e98, 0x4e1e, 0x9b32, 0x5b6c, 0x5669, 0x4e28, 0x79ba, 0x4e3f, 0x5315, 0x4e47, 0x592d, 0x723b, 0x536e, 0x6c10, 0x56df, 0x80e4, 0x9997, 0x6bd3, 0x777e, 0x9f17, 0x4e36, 0x4e9f, 0x9f10, 0x4e5c, 0x4e69, 0x4e93, 0x8288, 0x5b5b, 0x556c, 0x560f, 0x4ec4, 0x538d, 0x539d, 0x53a3, 0x53a5, 0x53ae, 0x9765, 0x8d5d, 0x531a, 0x53f5, 0x5326, 0x532e, 0x533e, 0x8d5c, 0x5366, 0x5363, 0x5202, 0x5208, 0x520e, 0x522d, 0x5233, 0x523f, 0x5240, 0x524c, 0x525e, 0x5261, 0x525c, 0x84af, 0x527d, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7f54, 0x4ebb, 0x4ec3, 0x4ec9, 0x4ec2, 0x4ee8, 0x4ee1, 0x4eeb, 0x4ede, 0x4f1b, 0x4ef3, 0x4f22, 0x4f64, 0x4ef5, 0x4f25, 0x4f27, 0x4f09, 0x4f2b, 0x4f5e, 0x4f67, 0x6538, 0x4f5a, 0x4f5d, /* 0x59 */ 0x4f5f, 0x4f57, 0x4f32, 0x4f3d, 0x4f76, 0x4f74, 0x4f91, 0x4f89, 0x4f83, 0x4f8f, 0x4f7e, 0x4f7b, 0x4faa, 0x4f7c, 0x4fac, 0x4f94, 0x4fe6, 0x4fe8, 0x4fea, 0x4fc5, 0x4fda, 0x4fe3, 0x4fdc, 0x4fd1, 0x4fdf, 0x4ff8, 0x5029, 0x504c, 0x4ff3, 0x502c, 0x500f, 0x502e, 0x502d, 0x4ffe, 0x501c, 0x500c, 0x5025, 0x5028, 0x507e, 0x5043, 0x5055, 0x5048, 0x504e, 0x506c, 0x507b, 0x50a5, 0x50a7, 0x50a9, 0x50ba, 0x50d6, 0x5106, 0x50ed, 0x50ec, 0x50e6, 0x50ee, 0x5107, 0x510b, 0x4edd, 0x6c3d, 0x4f58, 0x4f65, 0x4fce, 0x9fa0, 0x6c46, 0x7c74, 0x516e, 0x5dfd, 0x9ec9, 0x9998, 0x5181, 0x5914, 0x52f9, 0x530d, 0x8a07, 0x5310, 0x51eb, 0x5919, 0x5155, 0x4ea0, 0x5156, 0x4eb3, 0x886e, 0x88a4, 0x4eb5, 0x8114, 0x88d2, 0x7980, 0x5b34, 0x8803, 0x7fb8, 0x51ab, 0x51b1, 0x51bd, 0x51bc, /* 0x5a */ 0x51c7, 0x5196, 0x51a2, 0x51a5, 0x8ba0, 0x8ba6, 0x8ba7, 0x8baa, 0x8bb4, 0x8bb5, 0x8bb7, 0x8bc2, 0x8bc3, 0x8bcb, 0x8bcf, 0x8bce, 0x8bd2, 0x8bd3, 0x8bd4, 0x8bd6, 0x8bd8, 0x8bd9, 0x8bdc, 0x8bdf, 0x8be0, 0x8be4, 0x8be8, 0x8be9, 0x8bee, 0x8bf0, 0x8bf3, 0x8bf6, 0x8bf9, 0x8bfc, 0x8bff, 0x8c00, 0x8c02, 0x8c04, 0x8c07, 0x8c0c, 0x8c0f, 0x8c11, 0x8c12, 0x8c14, 0x8c15, 0x8c16, 0x8c19, 0x8c1b, 0x8c18, 0x8c1d, 0x8c1f, 0x8c20, 0x8c21, 0x8c25, 0x8c27, 0x8c2a, 0x8c2b, 0x8c2e, 0x8c2f, 0x8c32, 0x8c33, 0x8c35, 0x8c36, 0x5369, 0x537a, 0x961d, 0x9622, 0x9621, 0x9631, 0x962a, 0x963d, 0x963c, 0x9642, 0x9649, 0x9654, 0x965f, 0x9667, 0x966c, 0x9672, 0x9674, 0x9688, 0x968d, 0x9697, 0x96b0, 0x9097, 0x909b, 0x909d, 0x9099, 0x90ac, 0x90a1, 0x90b4, 0x90b3, 0x90b6, 0x90ba, /* 0x5b */ 0x90b8, 0x90b0, 0x90cf, 0x90c5, 0x90be, 0x90d0, 0x90c4, 0x90c7, 0x90d3, 0x90e6, 0x90e2, 0x90dc, 0x90d7, 0x90db, 0x90eb, 0x90ef, 0x90fe, 0x9104, 0x9122, 0x911e, 0x9123, 0x9131, 0x912f, 0x9139, 0x9143, 0x9146, 0x520d, 0x5942, 0x52a2, 0x52ac, 0x52ad, 0x52be, 0x54ff, 0x52d0, 0x52d6, 0x52f0, 0x53df, 0x71ee, 0x77cd, 0x5ef4, 0x51f5, 0x51fc, 0x9b2f, 0x53b6, 0x5f01, 0x755a, 0x5def, 0x574c, 0x57a9, 0x57a1, 0x587e, 0x58bc, 0x58c5, 0x58d1, 0x5729, 0x572c, 0x572a, 0x5733, 0x5739, 0x572e, 0x572f, 0x575c, 0x573b, 0x5742, 0x5769, 0x5785, 0x576b, 0x5786, 0x577c, 0x577b, 0x5768, 0x576d, 0x5776, 0x5773, 0x57ad, 0x57a4, 0x578c, 0x57b2, 0x57cf, 0x57a7, 0x57b4, 0x5793, 0x57a0, 0x57d5, 0x57d8, 0x57da, 0x57d9, 0x57d2, 0x57b8, 0x57f4, 0x57ef, 0x57f8, 0x57e4, 0x57dd, /* 0x5c */ 0x580b, 0x580d, 0x57fd, 0x57ed, 0x5800, 0x581e, 0x5819, 0x5844, 0x5820, 0x5865, 0x586c, 0x5881, 0x5889, 0x589a, 0x5880, 0x99a8, 0x9f19, 0x61ff, 0x8279, 0x827d, 0x827f, 0x828f, 0x828a, 0x82a8, 0x8284, 0x828e, 0x8291, 0x8297, 0x8299, 0x82ab, 0x82b8, 0x82be, 0x82b0, 0x82c8, 0x82ca, 0x82e3, 0x8298, 0x82b7, 0x82ae, 0x82cb, 0x82cc, 0x82c1, 0x82a9, 0x82b4, 0x82a1, 0x82aa, 0x829f, 0x82c4, 0x82ce, 0x82a4, 0x82e1, 0x8309, 0x82f7, 0x82e4, 0x830f, 0x8307, 0x82dc, 0x82f4, 0x82d2, 0x82d8, 0x830c, 0x82fb, 0x82d3, 0x8311, 0x831a, 0x8306, 0x8314, 0x8315, 0x82e0, 0x82d5, 0x831c, 0x8351, 0x835b, 0x835c, 0x8308, 0x8392, 0x833c, 0x8334, 0x8331, 0x839b, 0x835e, 0x832f, 0x834f, 0x8347, 0x8343, 0x835f, 0x8340, 0x8317, 0x8360, 0x832d, 0x833a, 0x8333, 0x8366, 0x8365, /* 0x5d */ 0x8368, 0x831b, 0x8369, 0x836c, 0x836a, 0x836d, 0x836e, 0x83b0, 0x8378, 0x83b3, 0x83b4, 0x83a0, 0x83aa, 0x8393, 0x839c, 0x8385, 0x837c, 0x83b6, 0x83a9, 0x837d, 0x83b8, 0x837b, 0x8398, 0x839e, 0x83a8, 0x83ba, 0x83bc, 0x83c1, 0x8401, 0x83e5, 0x83d8, 0x5807, 0x8418, 0x840b, 0x83dd, 0x83fd, 0x83d6, 0x841c, 0x8438, 0x8411, 0x8406, 0x83d4, 0x83df, 0x840f, 0x8403, 0x83f8, 0x83f9, 0x83ea, 0x83c5, 0x83c0, 0x8426, 0x83f0, 0x83e1, 0x845c, 0x8451, 0x845a, 0x8459, 0x8473, 0x8487, 0x8488, 0x847a, 0x8489, 0x8478, 0x843c, 0x8446, 0x8469, 0x8476, 0x848c, 0x848e, 0x8431, 0x846d, 0x84c1, 0x84cd, 0x84d0, 0x84e6, 0x84bd, 0x84d3, 0x84ca, 0x84bf, 0x84ba, 0x84e0, 0x84a1, 0x84b9, 0x84b4, 0x8497, 0x84e5, 0x84e3, 0x850c, 0x750d, 0x8538, 0x84f0, 0x8539, 0x851f, 0x853a, /* 0x5e */ 0x8556, 0x853b, 0x84ff, 0x84fc, 0x8559, 0x8548, 0x8568, 0x8564, 0x855e, 0x857a, 0x77a2, 0x8543, 0x8572, 0x857b, 0x85a4, 0x85a8, 0x8587, 0x858f, 0x8579, 0x85ae, 0x859c, 0x8585, 0x85b9, 0x85b7, 0x85b0, 0x85d3, 0x85c1, 0x85dc, 0x85ff, 0x8627, 0x8605, 0x8629, 0x8616, 0x863c, 0x5efe, 0x5f08, 0x593c, 0x5941, 0x8037, 0x5955, 0x595a, 0x5958, 0x530f, 0x5c22, 0x5c25, 0x5c2c, 0x5c34, 0x624c, 0x626a, 0x629f, 0x62bb, 0x62ca, 0x62da, 0x62d7, 0x62ee, 0x6322, 0x62f6, 0x6339, 0x634b, 0x6343, 0x63ad, 0x63f6, 0x6371, 0x637a, 0x638e, 0x63b4, 0x636d, 0x63ac, 0x638a, 0x6369, 0x63ae, 0x63bc, 0x63f2, 0x63f8, 0x63e0, 0x63ff, 0x63c4, 0x63de, 0x63ce, 0x6452, 0x63c6, 0x63be, 0x6445, 0x6441, 0x640b, 0x641b, 0x6420, 0x640c, 0x6426, 0x6421, 0x645e, 0x6484, 0x646d, 0x6496, /* 0x5f */ 0x647a, 0x64b7, 0x64b8, 0x6499, 0x64ba, 0x64c0, 0x64d0, 0x64d7, 0x64e4, 0x64e2, 0x6509, 0x6525, 0x652e, 0x5f0b, 0x5fd2, 0x7519, 0x5f11, 0x535f, 0x53f1, 0x53fd, 0x53e9, 0x53e8, 0x53fb, 0x5412, 0x5416, 0x5406, 0x544b, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477, 0x5471, 0x5464, 0x549a, 0x549b, 0x5484, 0x5476, 0x5466, 0x549d, 0x54d0, 0x54ad, 0x54c2, 0x54b4, 0x54d2, 0x54a7, 0x54a6, 0x54d3, 0x54d4, 0x5472, 0x54a3, 0x54d5, 0x54bb, 0x54bf, 0x54cc, 0x54d9, 0x54da, 0x54dc, 0x54a9, 0x54aa, 0x54a4, 0x54dd, 0x54cf, 0x54de, 0x551b, 0x54e7, 0x5520, 0x54fd, 0x5514, 0x54f3, 0x5522, 0x5523, 0x550f, 0x5511, 0x5527, 0x552a, 0x5567, 0x558f, 0x55b5, 0x5549, 0x556d, 0x5541, 0x5555, 0x553f, 0x5550, 0x553c, /* 0x60 */ 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555c, 0x558b, 0x55d2, 0x5583, 0x55b1, 0x55b9, 0x5588, 0x5581, 0x559f, 0x557e, 0x55d6, 0x5591, 0x557b, 0x55df, 0x55bd, 0x55be, 0x5594, 0x5599, 0x55ea, 0x55f7, 0x55c9, 0x561f, 0x55d1, 0x55eb, 0x55ec, 0x55d4, 0x55e6, 0x55dd, 0x55c4, 0x55ef, 0x55e5, 0x55f2, 0x55f3, 0x55cc, 0x55cd, 0x55e8, 0x55f5, 0x55e4, 0x8f94, 0x561e, 0x5608, 0x560c, 0x5601, 0x5624, 0x5623, 0x55fe, 0x5600, 0x5627, 0x562d, 0x5658, 0x5639, 0x5657, 0x562c, 0x564d, 0x5662, 0x5659, 0x565c, 0x564c, 0x5654, 0x5686, 0x5664, 0x5671, 0x566b, 0x567b, 0x567c, 0x5685, 0x5693, 0x56af, 0x56d4, 0x56d7, 0x56dd, 0x56e1, 0x56f5, 0x56eb, 0x56f9, 0x56ff, 0x5704, 0x570a, 0x5709, 0x571c, 0x5e0f, 0x5e19, 0x5e14, 0x5e11, 0x5e31, 0x5e3b, 0x5e3c, /* 0x61 */ 0x5e37, 0x5e44, 0x5e54, 0x5e5b, 0x5e5e, 0x5e61, 0x5c8c, 0x5c7a, 0x5c8d, 0x5c90, 0x5c96, 0x5c88, 0x5c98, 0x5c99, 0x5c91, 0x5c9a, 0x5c9c, 0x5cb5, 0x5ca2, 0x5cbd, 0x5cac, 0x5cab, 0x5cb1, 0x5ca3, 0x5cc1, 0x5cb7, 0x5cc4, 0x5cd2, 0x5ce4, 0x5ccb, 0x5ce5, 0x5d02, 0x5d03, 0x5d27, 0x5d26, 0x5d2e, 0x5d24, 0x5d1e, 0x5d06, 0x5d1b, 0x5d58, 0x5d3e, 0x5d34, 0x5d3d, 0x5d6c, 0x5d5b, 0x5d6f, 0x5d5d, 0x5d6b, 0x5d4b, 0x5d4a, 0x5d69, 0x5d74, 0x5d82, 0x5d99, 0x5d9d, 0x8c73, 0x5db7, 0x5dc5, 0x5f73, 0x5f77, 0x5f82, 0x5f87, 0x5f89, 0x5f8c, 0x5f95, 0x5f99, 0x5f9c, 0x5fa8, 0x5fad, 0x5fb5, 0x5fbc, 0x8862, 0x5f61, 0x72ad, 0x72b0, 0x72b4, 0x72b7, 0x72b8, 0x72c3, 0x72c1, 0x72ce, 0x72cd, 0x72d2, 0x72e8, 0x72ef, 0x72e9, 0x72f2, 0x72f4, 0x72f7, 0x7301, 0x72f3, 0x7303, 0x72fa, /* 0x62 */ 0x72fb, 0x7317, 0x7313, 0x7321, 0x730a, 0x731e, 0x731d, 0x7315, 0x7322, 0x7339, 0x7325, 0x732c, 0x7338, 0x7331, 0x7350, 0x734d, 0x7357, 0x7360, 0x736c, 0x736f, 0x737e, 0x821b, 0x5925, 0x98e7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b, 0x996c, 0x9974, 0x9977, 0x997d, 0x9980, 0x9984, 0x9987, 0x998a, 0x998d, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5e80, 0x5e91, 0x5e8b, 0x5e96, 0x5ea5, 0x5ea0, 0x5eb9, 0x5eb5, 0x5ebe, 0x5eb3, 0x8d53, 0x5ed2, 0x5ed1, 0x5edb, 0x5ee8, 0x5eea, 0x81ba, 0x5fc4, 0x5fc9, 0x5fd6, 0x5fcf, 0x6003, 0x5fee, 0x6004, 0x5fe1, 0x5fe4, 0x5ffe, 0x6005, 0x6006, 0x5fea, 0x5fed, 0x5ff8, 0x6019, 0x6035, 0x6026, 0x601b, 0x600f, 0x600d, 0x6029, 0x602b, 0x600a, 0x603f, 0x6021, 0x6078, 0x6079, 0x607b, 0x607a, 0x6042, /* 0x63 */ 0x606a, 0x607d, 0x6096, 0x609a, 0x60ad, 0x609d, 0x6083, 0x6092, 0x608c, 0x609b, 0x60ec, 0x60bb, 0x60b1, 0x60dd, 0x60d8, 0x60c6, 0x60da, 0x60b4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60f4, 0x6100, 0x610e, 0x612b, 0x614a, 0x6175, 0x61ac, 0x6194, 0x61a7, 0x61b7, 0x61d4, 0x61f5, 0x5fdd, 0x96b3, 0x95e9, 0x95eb, 0x95f1, 0x95f3, 0x95f5, 0x95f6, 0x95fc, 0x95fe, 0x9603, 0x9604, 0x9606, 0x9608, 0x960a, 0x960b, 0x960c, 0x960d, 0x960f, 0x9612, 0x9615, 0x9616, 0x9617, 0x9619, 0x961a, 0x4e2c, 0x723f, 0x6215, 0x6c35, 0x6c54, 0x6c5c, 0x6c4a, 0x6ca3, 0x6c85, 0x6c90, 0x6c94, 0x6c8c, 0x6c68, 0x6c69, 0x6c74, 0x6c76, 0x6c86, 0x6ca9, 0x6cd0, 0x6cd4, 0x6cad, 0x6cf7, 0x6cf8, 0x6cf1, 0x6cd7, 0x6cb2, 0x6ce0, 0x6cd6, 0x6cfa, 0x6ceb, 0x6cee, 0x6cb1, 0x6cd3, 0x6cef, 0x6cfe, /* 0x64 */ 0x6d39, 0x6d27, 0x6d0c, 0x6d43, 0x6d48, 0x6d07, 0x6d04, 0x6d19, 0x6d0e, 0x6d2b, 0x6d4d, 0x6d2e, 0x6d35, 0x6d1a, 0x6d4f, 0x6d52, 0x6d54, 0x6d33, 0x6d91, 0x6d6f, 0x6d9e, 0x6da0, 0x6d5e, 0x6d93, 0x6d94, 0x6d5c, 0x6d60, 0x6d7c, 0x6d63, 0x6e1a, 0x6dc7, 0x6dc5, 0x6dde, 0x6e0e, 0x6dbf, 0x6de0, 0x6e11, 0x6de6, 0x6ddd, 0x6dd9, 0x6e16, 0x6dab, 0x6e0c, 0x6dae, 0x6e2b, 0x6e6e, 0x6e4e, 0x6e6b, 0x6eb2, 0x6e5f, 0x6e86, 0x6e53, 0x6e54, 0x6e32, 0x6e25, 0x6e44, 0x6edf, 0x6eb1, 0x6e98, 0x6ee0, 0x6f2d, 0x6ee2, 0x6ea5, 0x6ea7, 0x6ebd, 0x6ebb, 0x6eb7, 0x6ed7, 0x6eb4, 0x6ecf, 0x6e8f, 0x6ec2, 0x6e9f, 0x6f62, 0x6f46, 0x6f47, 0x6f24, 0x6f15, 0x6ef9, 0x6f2f, 0x6f36, 0x6f4b, 0x6f74, 0x6f2a, 0x6f09, 0x6f29, 0x6f89, 0x6f8d, 0x6f8c, 0x6f78, 0x6f72, 0x6f7c, 0x6f7a, 0x6fd1, /* 0x65 */ 0x6fc9, 0x6fa7, 0x6fb9, 0x6fb6, 0x6fc2, 0x6fe1, 0x6fee, 0x6fde, 0x6fe0, 0x6fef, 0x701a, 0x7023, 0x701b, 0x7039, 0x7035, 0x704f, 0x705e, 0x5b80, 0x5b84, 0x5b95, 0x5b93, 0x5ba5, 0x5bb8, 0x752f, 0x9a9e, 0x6434, 0x5be4, 0x5bee, 0x8930, 0x5bf0, 0x8e47, 0x8b07, 0x8fb6, 0x8fd3, 0x8fd5, 0x8fe5, 0x8fee, 0x8fe4, 0x8fe9, 0x8fe6, 0x8ff3, 0x8fe8, 0x9005, 0x9004, 0x900b, 0x9026, 0x9011, 0x900d, 0x9016, 0x9021, 0x9035, 0x9036, 0x902d, 0x902f, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905b, 0x66b9, 0x9074, 0x907d, 0x9082, 0x9088, 0x9083, 0x908b, 0x5f50, 0x5f57, 0x5f56, 0x5f58, 0x5c3b, 0x54ab, 0x5c50, 0x5c59, 0x5b71, 0x5c63, 0x5c66, 0x7fbc, 0x5f2a, 0x5f29, 0x5f2d, 0x8274, 0x5f3c, 0x9b3b, 0x5c6e, 0x5981, 0x5983, 0x598d, 0x59a9, 0x59aa, 0x59a3, /* 0x66 */ 0x5997, 0x59ca, 0x59ab, 0x599e, 0x59a4, 0x59d2, 0x59b2, 0x59af, 0x59d7, 0x59be, 0x5a05, 0x5a06, 0x59dd, 0x5a08, 0x59e3, 0x59d8, 0x59f9, 0x5a0c, 0x5a09, 0x5a32, 0x5a34, 0x5a11, 0x5a23, 0x5a13, 0x5a40, 0x5a67, 0x5a4a, 0x5a55, 0x5a3c, 0x5a62, 0x5a75, 0x80ec, 0x5aaa, 0x5a9b, 0x5a77, 0x5a7a, 0x5abe, 0x5aeb, 0x5ab2, 0x5ad2, 0x5ad4, 0x5ab8, 0x5ae0, 0x5ae3, 0x5af1, 0x5ad6, 0x5ae6, 0x5ad8, 0x5adc, 0x5b09, 0x5b17, 0x5b16, 0x5b32, 0x5b37, 0x5b40, 0x5c15, 0x5c1c, 0x5b5a, 0x5b65, 0x5b73, 0x5b51, 0x5b53, 0x5b62, 0x9a75, 0x9a77, 0x9a78, 0x9a7a, 0x9a7f, 0x9a7d, 0x9a80, 0x9a81, 0x9a85, 0x9a88, 0x9a8a, 0x9a90, 0x9a92, 0x9a93, 0x9a96, 0x9a98, 0x9a9b, 0x9a9c, 0x9a9d, 0x9a9f, 0x9aa0, 0x9aa2, 0x9aa3, 0x9aa5, 0x9aa7, 0x7e9f, 0x7ea1, 0x7ea3, 0x7ea5, 0x7ea8, 0x7ea9, /* 0x67 */ 0x7ead, 0x7eb0, 0x7ebe, 0x7ec0, 0x7ec1, 0x7ec2, 0x7ec9, 0x7ecb, 0x7ecc, 0x7ed0, 0x7ed4, 0x7ed7, 0x7edb, 0x7ee0, 0x7ee1, 0x7ee8, 0x7eeb, 0x7eee, 0x7eef, 0x7ef1, 0x7ef2, 0x7f0d, 0x7ef6, 0x7efa, 0x7efb, 0x7efe, 0x7f01, 0x7f02, 0x7f03, 0x7f07, 0x7f08, 0x7f0b, 0x7f0c, 0x7f0f, 0x7f11, 0x7f12, 0x7f17, 0x7f19, 0x7f1c, 0x7f1b, 0x7f1f, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27, 0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2f, 0x7f30, 0x7f31, 0x7f32, 0x7f33, 0x7f35, 0x5e7a, 0x757f, 0x5ddb, 0x753e, 0x9095, 0x738e, 0x7391, 0x73ae, 0x73a2, 0x739f, 0x73cf, 0x73c2, 0x73d1, 0x73b7, 0x73b3, 0x73c0, 0x73c9, 0x73c8, 0x73e5, 0x73d9, 0x987c, 0x740a, 0x73e9, 0x73e7, 0x73de, 0x73ba, 0x73f2, 0x740f, 0x742a, 0x745b, 0x7426, 0x7425, 0x7428, 0x7430, 0x742e, 0x742c, /* 0x68 */ 0x741b, 0x741a, 0x7441, 0x745c, 0x7457, 0x7455, 0x7459, 0x7477, 0x746d, 0x747e, 0x749c, 0x748e, 0x7480, 0x7481, 0x7487, 0x748b, 0x749e, 0x74a8, 0x74a9, 0x7490, 0x74a7, 0x74d2, 0x74ba, 0x97ea, 0x97eb, 0x97ec, 0x674c, 0x6753, 0x675e, 0x6748, 0x6769, 0x67a5, 0x6787, 0x676a, 0x6773, 0x6798, 0x67a7, 0x6775, 0x67a8, 0x679e, 0x67ad, 0x678b, 0x6777, 0x677c, 0x67f0, 0x6809, 0x67d8, 0x680a, 0x67e9, 0x67b0, 0x680c, 0x67d9, 0x67b5, 0x67da, 0x67b3, 0x67dd, 0x6800, 0x67c3, 0x67b8, 0x67e2, 0x680e, 0x67c1, 0x67fd, 0x6832, 0x6833, 0x6860, 0x6861, 0x684e, 0x6862, 0x6844, 0x6864, 0x6883, 0x681d, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683e, 0x684a, 0x6849, 0x6829, 0x68b5, 0x688f, 0x6874, 0x6877, 0x6893, 0x686b, 0x68c2, 0x696e, 0x68fc, 0x691f, 0x6920, 0x68f9, /* 0x69 */ 0x6924, 0x68f0, 0x690b, 0x6901, 0x6957, 0x68e3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942, 0x695d, 0x6984, 0x696b, 0x6980, 0x6998, 0x6978, 0x6934, 0x69cc, 0x6987, 0x6988, 0x69ce, 0x6989, 0x6966, 0x6963, 0x6979, 0x699b, 0x69a7, 0x69bb, 0x69ab, 0x69ad, 0x69d4, 0x69b1, 0x69c1, 0x69ca, 0x69df, 0x6995, 0x69e0, 0x698d, 0x69ff, 0x6a2f, 0x69ed, 0x6a17, 0x6a18, 0x6a65, 0x69f2, 0x6a44, 0x6a3e, 0x6aa0, 0x6a50, 0x6a5b, 0x6a35, 0x6a8e, 0x6a79, 0x6a3d, 0x6a28, 0x6a58, 0x6a7c, 0x6a91, 0x6a90, 0x6aa9, 0x6a97, 0x6aab, 0x7337, 0x7352, 0x6b81, 0x6b82, 0x6b87, 0x6b84, 0x6b92, 0x6b93, 0x6b8d, 0x6b9a, 0x6b9b, 0x6ba1, 0x6baa, 0x8f6b, 0x8f6d, 0x8f71, 0x8f72, 0x8f73, 0x8f75, 0x8f76, 0x8f78, 0x8f77, 0x8f79, 0x8f7a, 0x8f7c, 0x8f7e, 0x8f81, 0x8f82, 0x8f84, 0x8f87, 0x8f8b, /* 0x6a */ 0x8f8d, 0x8f8e, 0x8f8f, 0x8f98, 0x8f9a, 0x8ece, 0x620b, 0x6217, 0x621b, 0x621f, 0x6222, 0x6221, 0x6225, 0x6224, 0x622c, 0x81e7, 0x74ef, 0x74f4, 0x74ff, 0x750f, 0x7511, 0x7513, 0x6534, 0x65ee, 0x65ef, 0x65f0, 0x660a, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600, 0x7085, 0x66f7, 0x661d, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006, 0x665f, 0x6654, 0x6641, 0x664f, 0x6656, 0x6661, 0x6657, 0x6677, 0x6684, 0x668c, 0x66a7, 0x669d, 0x66be, 0x66db, 0x66dc, 0x66e6, 0x66e9, 0x8d32, 0x8d33, 0x8d36, 0x8d3b, 0x8d3d, 0x8d40, 0x8d45, 0x8d46, 0x8d48, 0x8d49, 0x8d47, 0x8d4d, 0x8d55, 0x8d59, 0x89c7, 0x89ca, 0x89cb, 0x89cc, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x726e, 0x729f, 0x725d, 0x7266, 0x726f, 0x727e, 0x727f, 0x7284, 0x728b, 0x728d, 0x728f, 0x7292, 0x6308, 0x6332, 0x63b0, /* 0x6b */ 0x643f, 0x64d8, 0x8004, 0x6bea, 0x6bf3, 0x6bfd, 0x6bf5, 0x6bf9, 0x6c05, 0x6c07, 0x6c06, 0x6c0d, 0x6c15, 0x6c18, 0x6c19, 0x6c1a, 0x6c21, 0x6c29, 0x6c24, 0x6c2a, 0x6c32, 0x6535, 0x6555, 0x656b, 0x724d, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809f, 0x809c, 0x8093, 0x80bc, 0x670a, 0x80bd, 0x80b1, 0x80ab, 0x80ad, 0x80b4, 0x80b7, 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80db, 0x80c2, 0x80c4, 0x80d9, 0x80cd, 0x80d7, 0x6710, 0x80dd, 0x80eb, 0x80f1, 0x80f4, 0x80ed, 0x810d, 0x810e, 0x80f2, 0x80fc, 0x6715, 0x8112, 0x8c5a, 0x8136, 0x811e, 0x812c, 0x8118, 0x8132, 0x8148, 0x814c, 0x8153, 0x8174, 0x8159, 0x815a, 0x8171, 0x8160, 0x8169, 0x817c, 0x817d, 0x816d, 0x8167, 0x584d, 0x5ab5, 0x8188, 0x8182, 0x8191, 0x6ed5, 0x81a3, 0x81aa, 0x81cc, 0x6726, 0x81ca, 0x81bb, /* 0x6c */ 0x81c1, 0x81a6, 0x6b24, 0x6b37, 0x6b39, 0x6b43, 0x6b46, 0x6b59, 0x98d1, 0x98d2, 0x98d3, 0x98d5, 0x98d9, 0x98da, 0x6bb3, 0x5f40, 0x6bc2, 0x89f3, 0x6590, 0x9f51, 0x6593, 0x65bc, 0x65c6, 0x65c4, 0x65c3, 0x65cc, 0x65ce, 0x65d2, 0x65d6, 0x7080, 0x709c, 0x7096, 0x709d, 0x70bb, 0x70c0, 0x70b7, 0x70ab, 0x70b1, 0x70e8, 0x70ca, 0x7110, 0x7113, 0x7116, 0x712f, 0x7131, 0x7173, 0x715c, 0x7168, 0x7145, 0x7172, 0x714a, 0x7178, 0x717a, 0x7198, 0x71b3, 0x71b5, 0x71a8, 0x71a0, 0x71e0, 0x71d4, 0x71e7, 0x71f9, 0x721d, 0x7228, 0x706c, 0x7118, 0x7166, 0x71b9, 0x623e, 0x623d, 0x6243, 0x6248, 0x6249, 0x793b, 0x7940, 0x7946, 0x7949, 0x795b, 0x795c, 0x7953, 0x795a, 0x7962, 0x7957, 0x7960, 0x796f, 0x7967, 0x797a, 0x7985, 0x798a, 0x799a, 0x79a7, 0x79b3, 0x5fd1, 0x5fd0, /* 0x6d */ 0x603c, 0x605d, 0x605a, 0x6067, 0x6041, 0x6059, 0x6063, 0x60ab, 0x6106, 0x610d, 0x615d, 0x61a9, 0x619d, 0x61cb, 0x61d1, 0x6206, 0x8080, 0x807f, 0x6c93, 0x6cf6, 0x6dfc, 0x77f6, 0x77f8, 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65ab, 0x782d, 0x781c, 0x781d, 0x7839, 0x783a, 0x783b, 0x781f, 0x783c, 0x7825, 0x782c, 0x7823, 0x7829, 0x784e, 0x786d, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784c, 0x786a, 0x789b, 0x7893, 0x789a, 0x7887, 0x789c, 0x78a1, 0x78a3, 0x78b2, 0x78b9, 0x78a5, 0x78d4, 0x78d9, 0x78c9, 0x78ec, 0x78f2, 0x7905, 0x78f4, 0x7913, 0x7924, 0x791e, 0x7934, 0x9f9b, 0x9ef9, 0x9efb, 0x9efc, 0x76f1, 0x7704, 0x770d, 0x76f9, 0x7707, 0x7708, 0x771a, 0x7722, 0x7719, 0x772d, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775a, 0x7768, /* 0x6e */ 0x7762, 0x7765, 0x777f, 0x778d, 0x777d, 0x7780, 0x778c, 0x7791, 0x779f, 0x77a0, 0x77b0, 0x77b5, 0x77bd, 0x753a, 0x7540, 0x754e, 0x754b, 0x7548, 0x755b, 0x7572, 0x7579, 0x7583, 0x7f58, 0x7f61, 0x7f5f, 0x8a48, 0x7f68, 0x7f74, 0x7f71, 0x7f79, 0x7f81, 0x7f7e, 0x76cd, 0x76e5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948b, 0x948a, 0x948c, 0x948d, 0x948f, 0x9490, 0x9494, 0x9497, 0x9495, 0x949a, 0x949b, 0x949c, 0x94a3, 0x94a4, 0x94ab, 0x94aa, 0x94ad, 0x94ac, 0x94af, 0x94b0, 0x94b2, 0x94b4, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bc, 0x94bd, 0x94bf, 0x94c4, 0x94c8, 0x94c9, 0x94ca, 0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94d0, 0x94d1, 0x94d2, 0x94d5, 0x94d6, 0x94d7, 0x94d9, 0x94d8, 0x94db, 0x94de, 0x94df, 0x94e0, 0x94e2, 0x94e4, 0x94e5, 0x94e7, 0x94e8, 0x94ea, /* 0x6f */ 0x94e9, 0x94eb, 0x94ee, 0x94ef, 0x94f3, 0x94f4, 0x94f5, 0x94f7, 0x94f9, 0x94fc, 0x94fd, 0x94ff, 0x9503, 0x9502, 0x9506, 0x9507, 0x9509, 0x950a, 0x950d, 0x950e, 0x950f, 0x9512, 0x9513, 0x9514, 0x9515, 0x9516, 0x9518, 0x951b, 0x951d, 0x951e, 0x951f, 0x9522, 0x952a, 0x952b, 0x9529, 0x952c, 0x9531, 0x9532, 0x9534, 0x9536, 0x9537, 0x9538, 0x953c, 0x953e, 0x953f, 0x9542, 0x9535, 0x9544, 0x9545, 0x9546, 0x9549, 0x954c, 0x954e, 0x954f, 0x9552, 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955b, 0x955e, 0x955f, 0x955d, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956f, 0x9571, 0x9572, 0x9573, 0x953a, 0x77e7, 0x77ec, 0x96c9, 0x79d5, 0x79ed, 0x79e3, 0x79eb, 0x7a06, 0x5d47, 0x7a03, 0x7a02, 0x7a1e, 0x7a14, /* 0x70 */ 0x7a39, 0x7a37, 0x7a51, 0x9ecf, 0x99a5, 0x7a70, 0x7688, 0x768e, 0x7693, 0x7699, 0x76a4, 0x74de, 0x74e0, 0x752c, 0x9e20, 0x9e22, 0x9e28, 0x9e29, 0x9e2a, 0x9e2b, 0x9e2c, 0x9e32, 0x9e31, 0x9e36, 0x9e38, 0x9e37, 0x9e39, 0x9e3a, 0x9e3e, 0x9e41, 0x9e42, 0x9e44, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4b, 0x9e4c, 0x9e4e, 0x9e51, 0x9e55, 0x9e57, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5e, 0x9e63, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e71, 0x9e6d, 0x9e73, 0x7592, 0x7594, 0x7596, 0x75a0, 0x759d, 0x75ac, 0x75a3, 0x75b3, 0x75b4, 0x75b8, 0x75c4, 0x75b1, 0x75b0, 0x75c3, 0x75c2, 0x75d6, 0x75cd, 0x75e3, 0x75e8, 0x75e6, 0x75e4, 0x75eb, 0x75e7, 0x7603, 0x75f1, 0x75fc, 0x75ff, 0x7610, 0x7600, 0x7605, 0x760c, 0x7617, 0x760a, 0x7625, 0x7618, 0x7615, 0x7619, /* 0x71 */ 0x761b, 0x763c, 0x7622, 0x7620, 0x7640, 0x762d, 0x7630, 0x763f, 0x7635, 0x7643, 0x763e, 0x7633, 0x764d, 0x765e, 0x7654, 0x765c, 0x7656, 0x766b, 0x766f, 0x7fca, 0x7ae6, 0x7a78, 0x7a79, 0x7a80, 0x7a86, 0x7a88, 0x7a95, 0x7aa6, 0x7aa0, 0x7aac, 0x7aa8, 0x7aad, 0x7ab3, 0x8864, 0x8869, 0x8872, 0x887d, 0x887f, 0x8882, 0x88a2, 0x88c6, 0x88b7, 0x88bc, 0x88c9, 0x88e2, 0x88ce, 0x88e3, 0x88e5, 0x88f1, 0x891a, 0x88fc, 0x88e8, 0x88fe, 0x88f0, 0x8921, 0x8919, 0x8913, 0x891b, 0x890a, 0x8934, 0x892b, 0x8936, 0x8941, 0x8966, 0x897b, 0x758b, 0x80e5, 0x76b2, 0x76b4, 0x77dc, 0x8012, 0x8014, 0x8016, 0x801c, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800b, 0x8035, 0x8043, 0x8046, 0x804d, 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, /* 0x72 */ 0x9889, 0x988c, 0x988d, 0x988f, 0x9894, 0x989a, 0x989b, 0x989e, 0x989f, 0x98a1, 0x98a2, 0x98a5, 0x98a6, 0x864d, 0x8654, 0x866c, 0x866e, 0x867f, 0x867a, 0x867c, 0x867b, 0x86a8, 0x868d, 0x868b, 0x86ac, 0x869d, 0x86a7, 0x86a3, 0x86aa, 0x8693, 0x86a9, 0x86b6, 0x86c4, 0x86b5, 0x86ce, 0x86b0, 0x86ba, 0x86b1, 0x86af, 0x86c9, 0x86cf, 0x86b4, 0x86e9, 0x86f1, 0x86f2, 0x86ed, 0x86f3, 0x86d0, 0x8713, 0x86de, 0x86f4, 0x86df, 0x86d8, 0x86d1, 0x8703, 0x8707, 0x86f8, 0x8708, 0x870a, 0x870d, 0x8709, 0x8723, 0x873b, 0x871e, 0x8725, 0x872e, 0x871a, 0x873e, 0x8748, 0x8734, 0x8731, 0x8729, 0x8737, 0x873f, 0x8782, 0x8722, 0x877d, 0x877e, 0x877b, 0x8760, 0x8770, 0x874c, 0x876e, 0x878b, 0x8753, 0x8763, 0x877c, 0x8764, 0x8759, 0x8765, 0x8793, 0x87af, 0x87a8, 0x87d2, /* 0x73 */ 0x87c6, 0x8788, 0x8785, 0x87ad, 0x8797, 0x8783, 0x87ab, 0x87e5, 0x87ac, 0x87b5, 0x87b3, 0x87cb, 0x87d3, 0x87bd, 0x87d1, 0x87c0, 0x87ca, 0x87db, 0x87ea, 0x87e0, 0x87ee, 0x8816, 0x8813, 0x87fe, 0x880a, 0x881b, 0x8821, 0x8839, 0x883c, 0x7f36, 0x7f42, 0x7f44, 0x7f45, 0x8210, 0x7afa, 0x7afd, 0x7b08, 0x7b03, 0x7b04, 0x7b15, 0x7b0a, 0x7b2b, 0x7b0f, 0x7b47, 0x7b38, 0x7b2a, 0x7b19, 0x7b2e, 0x7b31, 0x7b20, 0x7b25, 0x7b24, 0x7b33, 0x7b3e, 0x7b1e, 0x7b58, 0x7b5a, 0x7b45, 0x7b75, 0x7b4c, 0x7b5d, 0x7b60, 0x7b6e, 0x7b7b, 0x7b62, 0x7b72, 0x7b71, 0x7b90, 0x7ba6, 0x7ba7, 0x7bb8, 0x7bac, 0x7b9d, 0x7ba8, 0x7b85, 0x7baa, 0x7b9c, 0x7ba2, 0x7bab, 0x7bb4, 0x7bd1, 0x7bc1, 0x7bcc, 0x7bdd, 0x7bda, 0x7be5, 0x7be6, 0x7bea, 0x7c0c, 0x7bfe, 0x7bfc, 0x7c0f, 0x7c16, 0x7c0b, /* 0x74 */ 0x7c1f, 0x7c2a, 0x7c26, 0x7c38, 0x7c41, 0x7c40, 0x81fe, 0x8201, 0x8202, 0x8204, 0x81ec, 0x8844, 0x8221, 0x8222, 0x8223, 0x822d, 0x822f, 0x8228, 0x822b, 0x8238, 0x823b, 0x8233, 0x8234, 0x823e, 0x8244, 0x8249, 0x824b, 0x824f, 0x825a, 0x825f, 0x8268, 0x887e, 0x8885, 0x8888, 0x88d8, 0x88df, 0x895e, 0x7f9d, 0x7f9f, 0x7fa7, 0x7faf, 0x7fb0, 0x7fb2, 0x7c7c, 0x6549, 0x7c91, 0x7c9d, 0x7c9c, 0x7c9e, 0x7ca2, 0x7cb2, 0x7cbc, 0x7cbd, 0x7cc1, 0x7cc7, 0x7ccc, 0x7ccd, 0x7cc8, 0x7cc5, 0x7cd7, 0x7ce8, 0x826e, 0x66a8, 0x7fbf, 0x7fce, 0x7fd5, 0x7fe5, 0x7fe1, 0x7fe6, 0x7fe9, 0x7fee, 0x7ff3, 0x7cf8, 0x7d77, 0x7da6, 0x7dae, 0x7e47, 0x7e9b, 0x9eb8, 0x9eb4, 0x8d73, 0x8d84, 0x8d94, 0x8d91, 0x8db1, 0x8d67, 0x8d6d, 0x8c47, 0x8c49, 0x914a, 0x9150, 0x914e, 0x914f, 0x9164, /* 0x75 */ 0x9162, 0x9161, 0x9170, 0x9169, 0x916f, 0x917d, 0x917e, 0x9172, 0x9174, 0x9179, 0x918c, 0x9185, 0x9190, 0x918d, 0x9191, 0x91a2, 0x91a3, 0x91aa, 0x91ad, 0x91ae, 0x91af, 0x91b5, 0x91b4, 0x91ba, 0x8c55, 0x9e7e, 0x8db8, 0x8deb, 0x8e05, 0x8e59, 0x8e69, 0x8db5, 0x8dbf, 0x8dbc, 0x8dba, 0x8dc4, 0x8dd6, 0x8dd7, 0x8dda, 0x8dde, 0x8dce, 0x8dcf, 0x8ddb, 0x8dc6, 0x8dec, 0x8df7, 0x8df8, 0x8de3, 0x8df9, 0x8dfb, 0x8de4, 0x8e09, 0x8dfd, 0x8e14, 0x8e1d, 0x8e1f, 0x8e2c, 0x8e2e, 0x8e23, 0x8e2f, 0x8e3a, 0x8e40, 0x8e39, 0x8e35, 0x8e3d, 0x8e31, 0x8e49, 0x8e41, 0x8e42, 0x8e51, 0x8e52, 0x8e4a, 0x8e70, 0x8e76, 0x8e7c, 0x8e6f, 0x8e74, 0x8e85, 0x8e8f, 0x8e94, 0x8e90, 0x8e9c, 0x8e9e, 0x8c78, 0x8c82, 0x8c8a, 0x8c85, 0x8c98, 0x8c94, 0x659b, 0x89d6, 0x89de, 0x89da, 0x89dc, /* 0x76 */ 0x89e5, 0x89eb, 0x89ef, 0x8a3e, 0x8b26, 0x9753, 0x96e9, 0x96f3, 0x96ef, 0x9706, 0x9701, 0x9708, 0x970f, 0x970e, 0x972a, 0x972d, 0x9730, 0x973e, 0x9f80, 0x9f83, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89, 0x9f8a, 0x9f8c, 0x9efe, 0x9f0b, 0x9f0d, 0x96b9, 0x96bc, 0x96bd, 0x96ce, 0x96d2, 0x77bf, 0x96e0, 0x928e, 0x92ae, 0x92c8, 0x933e, 0x936a, 0x93ca, 0x938f, 0x943e, 0x946b, 0x9c7f, 0x9c82, 0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x7a23, 0x9c8b, 0x9c8e, 0x9c90, 0x9c91, 0x9c92, 0x9c94, 0x9c95, 0x9c9a, 0x9c9b, 0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8, 0x9ca9, 0x9cab, 0x9cad, 0x9cae, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd, 0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cca, 0x9ccb, /* 0x77 */ 0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd7, 0x9cd8, 0x9cd9, 0x9cdc, 0x9cdd, 0x9cdf, 0x9ce2, 0x977c, 0x9785, 0x9791, 0x9792, 0x9794, 0x97af, 0x97ab, 0x97a3, 0x97b2, 0x97b4, 0x9ab1, 0x9ab0, 0x9ab7, 0x9e58, 0x9ab6, 0x9aba, 0x9abc, 0x9ac1, 0x9ac0, 0x9ac5, 0x9ac2, 0x9acb, 0x9acc, 0x9ad1, 0x9b45, 0x9b43, 0x9b47, 0x9b49, 0x9b48, 0x9b4d, 0x9b51, 0x98e8, 0x990d, 0x992e, 0x9955, 0x9954, 0x9adf, 0x9ae1, 0x9ae6, 0x9aef, 0x9aeb, 0x9afb, 0x9aed, 0x9af9, 0x9b08, 0x9b0f, 0x9b13, 0x9b1f, 0x9b23, 0x9ebd, 0x9ebe, 0x7e3b, 0x9e82, 0x9e87, 0x9e88, 0x9e8b, 0x9e92, 0x93d6, 0x9e9d, 0x9e9f, 0x9edb, 0x9edc, 0x9edd, 0x9ee0, 0x9edf, 0x9ee2, 0x9ee9, 0x9ee7, 0x9ee5, 0x9eea, 0x9eef, 0x9f22, 0x9f2c, 0x9f2f, 0x9f39, 0x9f37, 0x9f3d, 0x9f3e, 0x9f44, }; static int gb2312_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0x21 && c1 <= 0x29) || (c1 >= 0x30 && c1 <= 0x77)) { if (n >= 2) { unsigned char c2 = s[1]; if (c2 >= 0x21 && c2 < 0x7f) { unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21); unsigned short wc = 0xfffd; if (i < 1410) { if (i < 831) wc = gb2312_2uni_page21[i]; } else { if (i < 8178) wc = gb2312_2uni_page30[i-1410]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } static const unsigned short gb2312_2charset[7445] = { 0x2168, 0x216c, 0x2127, 0x2163, 0x2140, 0x2141, 0x2824, 0x2822, 0x2828, 0x2826, 0x283a, 0x282c, 0x282a, 0x2830, 0x282e, 0x2142, 0x2834, 0x2832, 0x2839, 0x2821, 0x2825, 0x2827, 0x2829, 0x282d, 0x2831, 0x2823, 0x282b, 0x282f, 0x2833, 0x2835, 0x2836, 0x2837, 0x2838, 0x2126, 0x2125, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754, 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d, 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x212a, 0x212c, 0x212e, 0x212f, 0x2130, 0x2131, 0x212d, 0x216b, 0x2164, 0x2165, 0x2179, 0x2166, 0x216d, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0x2276, 0x2277, 0x2278, 0x2279, 0x227a, 0x227b, 0x227c, 0x217b, 0x217c, 0x217a, 0x217d, 0x214a, 0x2147, 0x2146, 0x214c, 0x2158, 0x215e, 0x214f, 0x214e, 0x2144, 0x2145, 0x2149, 0x2148, 0x2152, 0x2153, 0x2160, 0x215f, 0x2143, 0x214b, 0x2157, 0x2156, 0x2155, 0x2159, 0x2154, 0x215c, 0x215d, 0x215a, 0x215b, 0x2151, 0x214d, 0x2150, 0x2259, 0x225a, 0x225b, 0x225c, 0x225d, 0x225e, 0x225f, 0x2260, 0x2261, 0x2262, 0x2245, 0x2246, 0x2247, 0x2248, 0x2249, 0x224a, 0x224b, 0x224c, 0x224d, 0x224e, 0x224f, 0x2250, 0x2251, 0x2252, 0x2253, 0x2254, 0x2255, 0x2256, 0x2257, 0x2258, 0x2231, 0x2232, 0x2233, 0x2234, 0x2235, 0x2236, 0x2237, 0x2238, 0x2239, 0x223a, 0x223b, 0x223c, 0x223d, 0x223e, 0x223f, 0x2240, 0x2241, 0x2242, 0x2243, 0x2244, 0x2924, 0x2925, 0x2926, 0x2927, 0x2928, 0x2929, 0x292a, 0x292b, 0x292c, 0x292d, 0x292e, 0x292f, 0x2930, 0x2931, 0x2932, 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, 0x2938, 0x2939, 0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941, 0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, 0x2948, 0x2949, 0x294a, 0x294b, 0x294c, 0x294d, 0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, 0x295c, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x296d, 0x296e, 0x296f, 0x2176, 0x2175, 0x2178, 0x2177, 0x2174, 0x2173, 0x2170, 0x2172, 0x2171, 0x216f, 0x216e, 0x2162, 0x2161, 0x2121, 0x2122, 0x2123, 0x2128, 0x2129, 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b, 0x213e, 0x213f, 0x217e, 0x2132, 0x2133, 0x213c, 0x213d, 0x2421, 0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, 0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, 0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, 0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, 0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, 0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472, 0x2473, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2124, 0x2845, 0x2846, 0x2847, 0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, 0x2852, 0x2853, 0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b, 0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, 0x2862, 0x2863, 0x2864, 0x2865, 0x2866, 0x2867, 0x2868, 0x2869, 0x2265, 0x2266, 0x2267, 0x2268, 0x2269, 0x226a, 0x226b, 0x226c, 0x226d, 0x226e, 0x523b, 0x3621, 0x465f, 0x4d72, 0x5549, 0x487d, 0x494f, 0x4f42, 0x5822, 0x323b, 0x536b, 0x5824, 0x3373, 0x5728, 0x4752, 0x5827, 0x4a40, 0x4770, 0x317b, 0x5235, 0x3454, 0x362b, 0x4b3f, 0x5829, 0x362a, 0x413d, 0x514f, 0x4925, 0x582d, 0x3876, 0x513e, 0x635c, 0x5650, 0x3761, 0x342e, 0x4159, 0x583c, 0x4d68, 0x3524, 0x4e2a, 0x5677, 0x4076, 0x3e59, 0x582f, 0x444b, 0x3e43, 0x5831, 0x4334, 0x5265, 0x562e, 0x4e5a, 0x5527, 0x3a75, 0x3726, 0x4056, 0x4639, 0x4552, 0x4747, 0x3954, 0x334b, 0x5252, 0x583f, 0x3e45, 0x4672, 0x5232, 0x4f30, 0x4f67, 0x4a69, 0x5840, 0x4272, 0x4252, 0x4869, 0x472c, 0x414b, 0x5368, 0x5579, 0x4a42, 0x367e, 0x5821, 0x535a, 0x3f77, 0x5446, 0x3b25, 0x5841, 0x4e65, 0x3e2e, 0x5828, 0x5147, 0x5029, 0x583d, 0x596f, 0x4d76, 0x3f3a, 0x3d3b, 0x3a25, 0x5260, 0x327a, 0x3a60, 0x4436, 0x4f6d, 0x3e29, 0x4d24, 0x4141, 0x4757, 0x5971, 0x5974, 0x484b, 0x5869, 0x525a, 0x4a32, 0x484a, 0x586c, 0x586a, 0x5846, 0x3d76, 0x464d, 0x3370, 0x586b, 0x3d71, 0x3d69, 0x4854, 0x3453, 0x4258, 0x3256, 0x5750, 0x4a4b, 0x4b7b, 0x554c, 0x3836, 0x4f49, 0x595a, 0x5870, 0x472a, 0x586e, 0x347a, 0x416e, 0x5254, 0x586d, 0x5247, 0x586f, 0x4347, 0x5176, 0x5659, 0x5872, 0x5875, 0x3c7e, 0x3c5b, 0x484e, 0x375d, 0x3742, 0x4673, 0x5878, 0x5241, 0x4e69, 0x3c3f, 0x377c, 0x3725, 0x505d, 0x565a, 0x5345, 0x3b6f, 0x3b61, 0x5871, 0x4921, 0x4e30, 0x342b, 0x5873, 0x494b, 0x5876, 0x4257, 0x5877, 0x4e31, 0x5879, 0x322e, 0x3940, 0x5923, 0x3069, 0x4166, 0x496c, 0x4b45, 0x4b46, 0x5924, 0x3568, 0x352b, 0x4e3b, 0x354d, 0x5721, 0x5774, 0x5353, 0x4c65, 0x3a4e, 0x5922, 0x595c, 0x5360, 0x587d, 0x3770, 0x5777, 0x587e, 0x587a, 0x5921, 0x4463, 0x5336, 0x5874, 0x595d, 0x587b, 0x4565, 0x4050, 0x5170, 0x305b, 0x3c51, 0x5926, 0x5925, 0x592c, 0x592e, 0x592b, 0x4a39, 0x5929, 0x5636, 0x335e, 0x5928, 0x407d, 0x4a4c, 0x592a, 0x5927, 0x5930, 0x3631, 0x3929, 0x5240, 0x4f40, 0x4242, 0x3d44, 0x556c, 0x3260, 0x4748, 0x3f6b, 0x592d, 0x592f, 0x4e6a, 0x3a6e, 0x4756, 0x3163, 0x3459, 0x366d, 0x5934, 0x3f21, 0x595e, 0x474e, 0x407e, 0x5938, 0x4b57, 0x377d, 0x5935, 0x5937, 0x3123, 0x5361, 0x5939, 0x5045, 0x5936, 0x5931, 0x5932, 0x4129, 0x5933, 0x3c73, 0x505e, 0x3829, 0x3e63, 0x593d, 0x593a, 0x3033, 0x5942, 0x5944, 0x3136, 0x593f, 0x3539, 0x3e73, 0x4c48, 0x3a72, 0x5250, 0x5943, 0x3d68, 0x332b, 0x5945, 0x3e6b, 0x5946, 0x593b, 0x445f, 0x593e, 0x5941, 0x5940, 0x552e, 0x5635, 0x4763, 0x5948, 0x3c59, 0x594a, 0x593c, 0x594b, 0x462b, 0x5949, 0x5776, 0x4d23, 0x3d21, 0x594c, 0x453c, 0x4d35, 0x594d, 0x5947, 0x3325, 0x3f7e, 0x3835, 0x407c, 0x3078, 0x3476, 0x594e, 0x594f, 0x3422, 0x5950, 0x345f, 0x3041, 0x5951, 0x4935, 0x4f71, 0x5952, 0x4145, 0x5956, 0x492e, 0x5955, 0x5954, 0x5957, 0x4b5b, 0x3d29, 0x4627, 0x5953, 0x5958, 0x5959, 0x4865, 0x405c, 0x3679, 0x5823, 0x544a, 0x542a, 0x5056, 0x3364, 0x5557, 0x4f48, 0x3962, 0x3f4b, 0x4362, 0x3652, 0x4d43, 0x596e, 0x5970, 0x3533, 0x3635, 0x3e24, 0x486b, 0x482b, 0x304b, 0x392b, 0x4179, 0x5962, 0x403c, 0x3932, 0x3958, 0x504b, 0x3178, 0x4664, 0x3e5f, 0x3564, 0x5748, 0x5178, 0x3c66, 0x4a5e, 0x3c3d, 0x5966, 0x5867, 0x445a, 0x3854, 0x483d, 0x3261, 0x5459, 0x4330, 0x4361, 0x5a22, 0x485f, 0x5034, 0x3e7c, 0x4529, 0x395a, 0x5a23, 0x5429, 0x5a24, 0x597b, 0x362c, 0x376b, 0x3179, 0x597c, 0x3365, 0x3e76, 0x3f76, 0x5231, 0x4064, 0x3633, 0x597e, 0x597d, 0x3e3b, 0x4660, 0x573c, 0x5a21, 0x4139, 0x3572, 0x4168, 0x3c75, 0x3455, 0x415d, 0x447d, 0x3c38, 0x3732, 0x376f, 0x596c, 0x463e, 0x3f2d, 0x3b4b, 0x354a, 0x5b49, 0x5057, 0x4d39, 0x303c, 0x3376, 0x3b77, 0x5b4a, 0x3a2f, 0x5464, 0x3536, 0x3573, 0x5856, 0x4850, 0x3756, 0x4750, 0x5857, 0x3f2f, 0x5b3b, 0x5858, 0x504c, 0x3b2e, 0x6b3e, 0x4150, 0x4175, 0x5472, 0x3855, 0x3434, 0x3375, 0x493e, 0x4550, 0x4559, 0x407b, 0x3170, 0x5859, 0x394e, 0x353d, 0x585a, 0x5646, 0x4b22, 0x482f, 0x4932, 0x344c, 0x3f4c, 0x3974, 0x585b, 0x585c, 0x3667, 0x3c41, 0x4c6a, 0x4f77, 0x585d, 0x4730, 0x3950, 0x3d23, 0x4c5e, 0x464a, 0x5860, 0x585e, 0x585f, 0x307e, 0x3e67, 0x4a23, 0x3c74, 0x3831, 0x386e, 0x5862, 0x3d4b, 0x5864, 0x5863, 0x457c, 0x5865, 0x5866, 0x4126, 0x4830, 0x306c, 0x3926, 0x3c53, 0x4e71, 0x5b3d, 0x4153, 0x362f, 0x567a, 0x452c, 0x3d59, 0x5b3e, 0x5b3f, 0x4078, 0x3e22, 0x404d, 0x5b40, 0x4a46, 0x322a, 0x5342, 0x4363, 0x512b, 0x5b42, 0x4055, 0x5b43, 0x3f31, 0x443c, 0x475a, 0x5b44, 0x5968, 0x4957, 0x3934, 0x4e70, 0x5448, 0x307c, 0x3452, 0x5059, 0x5969, 0x5e4b, 0x596b, 0x5830, 0x3b2f, 0x3131, 0x3357, 0x584e, 0x5451, 0x3d33, 0x3f6f, 0x4f3b, 0x5850, 0x374b, 0x5851, 0x4625, 0x4778, 0x523d, 0x5852, 0x4464, 0x4a2e, 0x4727, 0x5826, 0x497d, 0x4e67, 0x3b5c, 0x306b, 0x3b2a, 0x502d, 0x3130, 0x5764, 0x573f, 0x3525, 0x4274, 0x444f, 0x3229, 0x3237, 0x3165, 0x5f32, 0x553c, 0x3f28, 0x422c, 0x5855, 0x4231, 0x5854, 0x4e54, 0x5a60, 0x4e40, 0x5834, 0x432e, 0x5321, 0x4e23, 0x3c34, 0x4834, 0x4251, 0x3e6d, 0x5036, 0x5a61, 0x4764, 0x3327, 0x3672, 0x4c7c, 0x407a, 0x4077, 0x5139, 0x5161, 0x5847, 0x325e, 0x4065, 0x3a71, 0x5848, 0x542d, 0x4f61, 0x5849, 0x584a, 0x4f43, 0x3378, 0x3e47, 0x584b, 0x5b4c, 0x4825, 0x4f58, 0x487e, 0x324e, 0x5356, 0x3266, 0x3c30, 0x5351, 0x4b2b, 0x3734, 0x3722, 0x4a65, 0x4821, 0x4a5c, 0x3164, 0x5070, 0x4551, 0x5b45, 0x357e, 0x3f5a, 0x3945, 0x3e64, 0x416d, 0x5f36, 0x5f35, 0x563b, 0x3d50, 0x5559, 0x3048, 0x3623, 0x3f49, 0x4c28, 0x5f33, 0x4a37, 0x5352, 0x584f, 0x5236, 0x3a45, 0x4b3e, 0x4c3e, 0x5f37, 0x3570, 0x5f34, 0x5375, 0x3354, 0x3877, 0x5f3a, 0x3a4f, 0x3c2a, 0x3575, 0x4d2c, 0x437b, 0x3a73, 0x4074, 0x4d42, 0x4f72, 0x5f38, 0x4f45, 0x4240, 0x5f39, 0x4270, 0x3e7d, 0x415f, 0x4d4c, 0x5277, 0x374d, 0x5f41, 0x5f44, 0x3771, 0x3049, 0x3656, 0x3754, 0x3a2c, 0x4c7d, 0x3f54, 0x4b31, 0x4674, 0x5628, 0x5f45, 0x4e62, 0x3333, 0x4e7c, 0x3435, 0x4e47, 0x3a70, 0x4e61, 0x513d, 0x5f40, 0x3474, 0x334a, 0x3866, 0x5f3b, 0x4445, 0x5f3c, 0x5f3d, 0x5f3e, 0x453b, 0x5f3f, 0x5f42, 0x5431, 0x5f43, 0x473a, 0x4e58, 0x4458, 0x5f4a, 0x5f4f, 0x565c, 0x5f49, 0x5f5a, 0x4e36, 0x3a47, 0x5f4e, 0x5f48, 0x455e, 0x496b, 0x3a74, 0x437c, 0x3e57, 0x5f46, 0x5f4d, 0x4558, 0x5526, 0x3a4d, 0x3e4c, 0x533d, 0x3840, 0x5664, 0x5f47, 0x393e, 0x3f27, 0x417c, 0x5f4b, 0x5f4c, 0x5f50, 0x5f5b, 0x5f65, 0x5f57, 0x5f56, 0x5749, 0x5f63, 0x5f64, 0x656b, 0x5227, 0x5f52, 0x3f29, 0x545b, 0x3f48, 0x5f54, 0x4f4c, 0x5f5d, 0x514a, 0x5f5e, 0x3027, 0x4637, 0x5f53, 0x3a65, 0x365f, 0x4d5b, 0x397e, 0x5455, 0x5f5f, 0x4f6c, 0x3025, 0x5f67, 0x5f51, 0x5146, 0x5f55, 0x5f58, 0x5f59, 0x5f5c, 0x3b29, 0x5f60, 0x5f61, 0x5f62, 0x5f66, 0x5f68, 0x5334, 0x3867, 0x4536, 0x5f6a, 0x495a, 0x4128, 0x4444, 0x3f5e, 0x4f78, 0x555c, 0x5f6e, 0x3238, 0x3a5f, 0x5f6c, 0x5b41, 0x5164, 0x4b74, 0x343d, 0x3026, 0x5f71, 0x4c46, 0x5f72, 0x5f6d, 0x5f69, 0x5f6b, 0x5f6f, 0x5f70, 0x3b3d, 0x5f73, 0x5f74, 0x3b23, 0x4a5b, 0x4e28, 0x6027, 0x332a, 0x6026, 0x6021, 0x5f7e, 0x4d59, 0x5f7c, 0x5f7a, 0x3f50, 0x5744, 0x494c, 0x5f78, 0x3021, 0x5f7d, 0x5f7b, 0x6022, 0x6028, 0x3748, 0x4621, 0x4936, 0x4032, 0x5f75, 0x453e, 0x5844, 0x5f79, 0x4476, 0x6023, 0x6024, 0x6025, 0x5025, 0x6034, 0x4c64, 0x6031, 0x3f26, 0x602f, 0x4e39, 0x602b, 0x4946, 0x402e, 0x602e, 0x3a6d, 0x3a30, 0x6029, 0x5f76, 0x6033, 0x6038, 0x342d, 0x6039, 0x4f32, 0x3a48, 0x6030, 0x507a, 0x602c, 0x547b, 0x5f77, 0x4567, 0x602d, 0x5377, 0x6036, 0x6037, 0x6044, 0x5061, 0x603c, 0x6049, 0x604a, 0x603e, 0x602a, 0x4924, 0x6041, 0x6032, 0x4a48, 0x6043, 0x6035, 0x4e4b, 0x4b43, 0x604d, 0x6046, 0x6042, 0x604b, 0x603a, 0x603f, 0x6040, 0x6045, 0x6047, 0x6048, 0x604c, 0x603b, 0x4b54, 0x6055, 0x6056, 0x6052, 0x6050, 0x3c4e, 0x6051, 0x3842, 0x5845, 0x506a, 0x426f, 0x604f, 0x603d, 0x6054, 0x6053, 0x6057, 0x605c, 0x6058, 0x5676, 0x3330, 0x576c, 0x4b3b, 0x605a, 0x4e7b, 0x3a59, 0x6061, 0x605d, 0x522d, 0x6062, 0x605b, 0x6059, 0x605f, 0x6060, 0x605e, 0x6064, 0x4677, 0x582c, 0x546b, 0x6066, 0x4a49, 0x6065, 0x3841, 0x6067, 0x6068, 0x6069, 0x6063, 0x3a3f, 0x4c67, 0x606a, 0x4f79, 0x606b, 0x4842, 0x3d40, 0x4452, 0x606c, 0x606d, 0x4774, 0x4b44, 0x606e, 0x3b58, 0x5836, 0x5272, 0x606f, 0x4d45, 0x365a, 0x6071, 0x5430, 0x4027, 0x3451, 0x4e27, 0x6070, 0x6072, 0x394c, 0x397a, 0x4d3c, 0x6073, 0x4654, 0x6074, 0x5432, 0x4826, 0x6076, 0x6075, 0x6077, 0x4d41, 0x4a25, 0x545a, 0x5b57, 0x5b59, 0x5b58, 0x3967, 0x5b5c, 0x5b5d, 0x3558, 0x5b5a, 0x5b5b, 0x3321, 0x5b5f, 0x3b78, 0x5637, 0x5b60, 0x3e79, 0x373b, 0x5b50, 0x4c2e, 0x3f32, 0x3b35, 0x5778, 0x3f53, 0x3f69, 0x3c61, 0x4c33, 0x5b5e, 0x3053, 0x4e6b, 0x3758, 0x5739, 0x4642, 0x4024, 0x4c39, 0x5b67, 0x5b61, 0x463a, 0x5b63, 0x5b68, 0x4577, 0x5b6a, 0x5b69, 0x3f40, 0x5b66, 0x5b65, 0x3439, 0x402c, 0x4222, 0x5b62, 0x5b64, 0x504d, 0x5b6d, 0x405d, 0x5b72, 0x3662, 0x5b73, 0x5b52, 0x3938, 0x542b, 0x5b6c, 0x3f51, 0x5b70, 0x5b51, 0x3566, 0x5b6b, 0x3f65, 0x5b6e, 0x5b71, 0x5b79, 0x3921, 0x3023, 0x4271, 0x3347, 0x5b6f, 0x5b78, 0x4652, 0x5b74, 0x5b75, 0x5b77, 0x5b76, 0x5b7e, 0x5372, 0x323a, 0x5b7d, 0x5c24, 0x5b7b, 0x5b7a, 0x5b7c, 0x4560, 0x3b79, 0x5c23, 0x5c25, 0x4c43, 0x3651, 0x5d40, 0x5c21, 0x5c22, 0x4735, 0x3669, 0x5c27, 0x5c26, 0x5c29, 0x3124, 0x354c, 0x3f30, 0x515f, 0x3642, 0x5c28, 0x4b7a, 0x6b73, 0x4b5c, 0x4b7e, 0x4c41, 0x487b, 0x5c2a, 0x4c6e, 0x5c2b, 0x5b53, 0x5c2f, 0x5c2c, 0x3e33, 0x4a7b, 0x5c2d, 0x494a, 0x4439, 0x473d, 0x5c2e, 0x5476, 0x5066, 0x442b, 0x3655, 0x5b54, 0x315a, 0x5b55, 0x5b56, 0x3a3e, 0x4840, 0x4a3f, 0x4849, 0x5733, 0x4979, 0x3f47, 0x3a78, 0x523c, 0x623a, 0x3426, 0x3138, 0x3834, 0x4f44, 0x5967, 0x4f26, 0x4d62, 0x596d, 0x3660, 0x5239, 0x393b, 0x6239, 0x6237, 0x3473, 0x4c6c, 0x4c2b, 0x3772, 0x5832, 0x516b, 0x3a3b, 0x4a27, 0x4d37, 0x5244, 0x3f64, 0x3c50, 0x3661, 0x5e45, 0x5e46, 0x5b3c, 0x5159, 0x4666, 0x444e, 0x376e, 0x375c, 0x3f7c, 0x5760, 0x4675, 0x313c, 0x5e48, 0x3d31, 0x4c57, 0x5e4a, 0x5e49, 0x356c, 0x495d, 0x3042, 0x452e, 0x452b, 0x444c, 0x3c69, 0x4b7d, 0x3a43, 0x6579, 0x4867, 0x657a, 0x4d7d, 0x5731, 0x383e, 0x4268, 0x4851, 0x657b, 0x364a, 0x3c4b, 0x517d, 0x6621, 0x436e, 0x6624, 0x657e, 0x6625, 0x4d57, 0x3741, 0x657c, 0x657d, 0x6623, 0x445d, 0x6628, 0x6627, 0x4343, 0x465e, 0x662a, 0x4437, 0x6622, 0x4a3c, 0x3d63, 0x3943, 0x6626, 0x5055, 0x4e2f, 0x6629, 0x6630, 0x5226, 0x3d2a, 0x662d, 0x662f, 0x4051, 0x524c, 0x3c27, 0x6631, 0x5276, 0x574b, 0x4d7e, 0x4d5e, 0x4226, 0x662b, 0x662c, 0x3d3f, 0x662e, 0x6633, 0x6632, 0x6636, 0x6638, 0x446f, 0x4448, 0x3e6a, 0x496f, 0x6637, 0x3670, 0x4364, 0x5369, 0x6634, 0x6635, 0x4822, 0x663d, 0x6639, 0x4645, 0x4d71, 0x663b, 0x663c, 0x3b69, 0x663e, 0x663a, 0x4037, 0x5324, 0x663f, 0x4974, 0x6643, 0x6644, 0x5076, 0x433d, 0x4344, 0x6642, 0x6641, 0x6647, 0x4f31, 0x6b74, 0x664a, 0x6645, 0x3c5e, 0x4929, 0x3c35, 0x4f53, 0x6648, 0x6649, 0x664e, 0x6650, 0x6651, 0x664b, 0x3555, 0x664c, 0x664f, 0x445b, 0x6646, 0x664d, 0x6652, 0x6654, 0x6653, 0x6655, 0x5978, 0x6656, 0x6657, 0x5753, 0x665d, 0x665e, 0x3f57, 0x5450, 0x5756, 0x3466, 0x4b6f, 0x665a, 0x5843, 0x574e, 0x5022, 0x434f, 0x665f, 0x3c3e, 0x3942, 0x665b, 0x5127, 0x3a22, 0x424f, 0x582b, 0x4a6b, 0x656e, 0x665c, 0x3775, 0x4866, 0x4475, 0x6532, 0x447e, 0x4b7c, 0x6533, 0x552c, 0x536e, 0x4a58, 0x3032, 0x4b4e, 0x4d6a, 0x3a6a, 0x6535, 0x6534, 0x575a, 0x3959, 0x5666, 0x3628, 0x4d70, 0x524b, 0x3126, 0x4a35, 0x3368, 0x4973, 0x3f4d, 0x507b, 0x4a52, 0x6536, 0x3b42, 0x4f5c, 0x392c, 0x5457, 0x3a26, 0x5167, 0x4f7c, 0x3c52, 0x6537, 0x485d, 0x3f6d, 0x3176, 0x4b5e, 0x3c45, 0x3c44, 0x527a, 0x435c, 0x3f5c, 0x383b, 0x4342, 0x3a2e, 0x5422, 0x475e, 0x442f, 0x326c, 0x3951, 0x653b, 0x4148, 0x552f, 0x653c, 0x653e, 0x3467, 0x3654, 0x4b42, 0x5130, 0x353c, 0x4a59, 0x3762, 0x4964, 0x3d2b, 0x4e3e, 0x5770, 0x5021, 0x4959, 0x367b, 0x6658, 0x3c62, 0x333e, 0x4950, 0x6659, 0x3322, 0x5e4c, 0x5348, 0x5e4d, 0x5222, 0x5e4e, 0x3e4d, 0x5e4f, 0x4a2c, 0x527c, 0x335f, 0x656a, 0x4461, 0x3e21, 0x4e32, 0x4472, 0x3e56, 0x4628, 0x3263, 0x3e53, 0x477c, 0x4c6b, 0x3d6c, 0x4e5d, 0x4a3a, 0x4641, 0x656c, 0x503c, 0x5539, 0x656d, 0x4a74, 0x4d40, 0x4245, 0x656f, 0x4244, 0x6570, 0x6578, 0x4d4d, 0x493d, 0x5259, 0x6128, 0x536c, 0x4b6a, 0x4671, 0x612c, 0x6127, 0x6129, 0x612a, 0x612f, 0x326d, 0x612b, 0x385a, 0x612d, 0x612e, 0x6130, 0x353a, 0x6131, 0x6133, 0x6138, 0x5152, 0x6136, 0x6135, 0x416b, 0x6137, 0x5440, 0x6132, 0x613a, 0x3036, 0x6134, 0x3f79, 0x6139, 0x613b, 0x613e, 0x613c, 0x5645, 0x4f3f, 0x613d, 0x613f, 0x424d, 0x366b, 0x5378, 0x474d, 0x3765, 0x3e7e, 0x6140, 0x6141, 0x6147, 0x3367, 0x4669, 0x345e, 0x5142, 0x6148, 0x6146, 0x6145, 0x6143, 0x6142, 0x3140, 0x5538, 0x6144, 0x614b, 0x614c, 0x614a, 0x6f7a, 0x6153, 0x6152, 0x4736, 0x6149, 0x614e, 0x6150, 0x6154, 0x6151, 0x614d, 0x614f, 0x6155, 0x6156, 0x6157, 0x6158, 0x615a, 0x615b, 0x4e21, 0x675d, 0x3428, 0x565d, 0x5132, 0x3332, 0x3924, 0x5773, 0x4749, 0x3e5e, 0x392e, 0x4e57, 0x326e, 0x5b4f, 0x3c3a, 0x5251, 0x4b48, 0x304d, 0x4f6f, 0x5963, 0x3d6d, 0x3152, 0x4a50, 0x323c, 0x4b27, 0x372b, 0x4a26, 0x4f23, 0x6078, 0x554a, 0x607b, 0x607a, 0x4541, 0x4c7b, 0x4131, 0x6079, 0x5663, 0x322f, 0x5644, 0x355b, 0x3478, 0x5621, 0x4f2f, 0x306f, 0x607c, 0x6121, 0x3323, 0x607d, 0x607e, 0x4331, 0x435d, 0x6122, 0x3779, 0x3b4f, 0x6123, 0x443b, 0x6124, 0x6125, 0x6126, 0x3431, 0x3849, 0x463d, 0x446a, 0x3222, 0x5052, 0x675b, 0x3b43, 0x5357, 0x5344, 0x3963, 0x624f, 0x572f, 0x476c, 0x3153, 0x3432, 0x6251, 0x5072, 0x422e, 0x6250, 0x3f62, 0x5326, 0x3557, 0x6252, 0x356a, 0x436d, 0x387d, 0x382e, 0x4553, 0x374f, 0x6254, 0x6253, 0x3648, 0x5779, 0x4d25, 0x6258, 0x6256, 0x4a7c, 0x3f35, 0x5339, 0x6255, 0x6257, 0x412e, 0x4048, 0x625b, 0x625a, 0x402a, 0x414e, 0x625c, 0x625d, 0x625e, 0x5b48, 0x5153, 0x4d22, 0x3d28, 0x5e43, 0x5825, 0x3f2a, 0x5b4d, 0x526c, 0x467a, 0x452a, 0x5e44, 0x3157, 0x5f2e, 0x4a3d, 0x5f31, 0x392d, 0x527d, 0x3825, 0x3a6b, 0x335a, 0x355c, 0x5545, 0x4356, 0x4f52, 0x3b21, 0x6573, 0x6572, 0x6574, 0x4d64, 0x4875, 0x352f, 0x473f, 0x6576, 0x6c30, 0x6566, 0x3969, 0x3531, 0x423c, 0x6568, 0x6567, 0x6569, 0x524d, 0x616a, 0x504e, 0x4d2e, 0x5165, 0x324a, 0x316b, 0x3172, 0x456d, 0x5543, 0x5330, 0x615c, 0x615d, 0x525b, 0x3339, 0x314b, 0x4d79, 0x5577, 0x615e, 0x3e36, 0x347d, 0x615f, 0x3a5c, 0x6160, 0x3b32, 0x4249, 0x6161, 0x506c, 0x4d3d, 0x6162, 0x3543, 0x4547, 0x6163, 0x6164, 0x5379, 0x6165, 0x512d, 0x6166, 0x4e22, 0x6167, 0x3542, 0x6168, 0x3b55, 0x5044, 0x6260, 0x3158, 0x5264, 0x6261, 0x3c49, 0x484c, 0x6263, 0x6c7e, 0x6c7d, 0x5f2f, 0x6262, 0x563e, 0x4d7c, 0x4326, 0x6343, 0x5652, 0x6267, 0x6268, 0x5347, 0x626c, 0x3f6c, 0x626d, 0x6265, 0x3340, 0x446e, 0x626e, 0x5043, 0x3a76, 0x6269, 0x375e, 0x3b33, 0x4c2c, 0x4b4b, 0x6264, 0x6266, 0x626a, 0x626b, 0x6277, 0x6274, 0x5475, 0x6273, 0x452d, 0x557a, 0x4542, 0x3240, 0x626f, 0x6272, 0x412f, 0x4b3c, 0x3521, 0x6279, 0x3c31, 0x6271, 0x5054, 0x5439, 0x6275, 0x3956, 0x6276, 0x4753, 0x6270, 0x575c, 0x6d21, 0x6278, 0x6d25, 0x627e, 0x4a51, 0x4135, 0x3b50, 0x3f56, 0x3a63, 0x4b21, 0x6d26, 0x6d23, 0x6d22, 0x3b56, 0x6d27, 0x5074, 0x6d24, 0x3a5e, 0x3677, 0x6321, 0x3632, 0x4c71, 0x3927, 0x4f22, 0x4721, 0x3f52, 0x3671, 0x627a, 0x627b, 0x627d, 0x627c, 0x4455, 0x6322, 0x5341, 0x6327, 0x4744, 0x4f24, 0x6329, 0x3a37, 0x6328, 0x3b5a, 0x6323, 0x6324, 0x632a, 0x6326, 0x4e72, 0x5346, 0x3b3c, 0x5443, 0x447a, 0x6d28, 0x507c, 0x6325, 0x4375, 0x632d, 0x312f, 0x6332, 0x3c42, 0x632c, 0x353f, 0x4769, 0x6330, 0x3e2a, 0x4d6f, 0x3b73, 0x4c68, 0x632f, 0x6331, 0x4f27, 0x632e, 0x4e29, 0x3b5d, 0x356b, 0x3e65, 0x3252, 0x334d, 0x3139, 0x632b, 0x3251, 0x352c, 0x395f, 0x3668, 0x4f6b, 0x6337, 0x3b4c, 0x4847, 0x504a, 0x6338, 0x336e, 0x6d29, 0x537a, 0x5364, 0x6d2a, 0x6339, 0x5262, 0x6335, 0x535e, 0x3850, 0x6333, 0x6336, 0x375f, 0x6334, 0x4022, 0x633a, 0x5438, 0x3448, 0x633b, 0x3b45, 0x4977, 0x4965, 0x443d, 0x6d2b, 0x427d, 0x3b5b, 0x3f2e, 0x4e3f, 0x633c, 0x3f36, 0x316f, 0x5477, 0x633e, 0x6d2d, 0x633f, 0x3a29, 0x6d2c, 0x633d, 0x6340, 0x3a36, 0x362e, 0x5038, 0x3043, 0x6d2e, 0x6d2f, 0x4041, 0x6341, 0x4533, 0x6342, 0x5c32, 0x6d30, 0x386a, 0x4e6c, 0x6a27, 0x5067, 0x4a79, 0x4856, 0x4f37, 0x3349, 0x4e52, 0x3d64, 0x635e, 0x3b72, 0x6a28, 0x553d, 0x465d, 0x6a29, 0x6a2a, 0x6a2c, 0x6a2b, 0x6a2e, 0x6a2d, 0x3d58, 0x6a2f, 0x423e, 0x3441, 0x3477, 0x3b27, 0x6c66, 0x6c65, 0x373f, 0x4b79, 0x3162, 0x6c67, 0x4948, 0x6c68, 0x6c69, 0x4a56, 0x5e50, 0x3245, 0x547a, 0x464b, 0x3047, 0x3472, 0x4853, 0x4d50, 0x3f38, 0x3f5b, 0x4724, 0x5634, 0x4029, 0x5e51, 0x4928, 0x516f, 0x4524, 0x3067, 0x3336, 0x4845, 0x3062, 0x3776, 0x457a, 0x3673, 0x5552, 0x3350, 0x3c3c, 0x332d, 0x3e71, 0x3051, 0x5256, 0x4a63, 0x5725, 0x4d36, 0x3636, 0x3f39, 0x555b, 0x3827, 0x4557, 0x5e52, 0x3f59, 0x4255, 0x4740, 0x3b24, 0x3128, 0x456a, 0x457b, 0x4c27, 0x3127, 0x3556, 0x4428, 0x5e53, 0x513a, 0x3369, 0x4372, 0x3777, 0x5674, 0x3523, 0x3270, 0x4434, 0x4469, 0x402d, 0x5e54, 0x3068, 0x4544, 0x4160, 0x3955, 0x3e5c, 0x4d58, 0x304e, 0x4d4f, 0x5e56, 0x3e50, 0x573e, 0x5e55, 0x5550, 0x305d, 0x4462, 0x4223, 0x3c70, 0x5335, 0x4039, 0x4521, 0x3226, 0x5471, 0x4028, 0x4a43, 0x5e57, 0x557c, 0x3930, 0x482d, 0x4b29, 0x5e59, 0x3f3d, 0x4634, 0x5727, 0x4a30, 0x4443, 0x3356, 0x3952, 0x5638, 0x6a7c, 0x3034, 0x3f66, 0x4c74, 0x4d5a, 0x563f, 0x424e, 0x4e4e, 0x4c22, 0x502e, 0x4453, 0x3532, 0x5e58, 0x5575, 0x3c37, 0x3b53, 0x3024, 0x4532, 0x346c, 0x5571, 0x6a7d, 0x5e5a, 0x4d26, 0x4d6c, 0x4e66, 0x5e5c, 0x4d31, 0x4026, 0x573d, 0x5e5b, 0x3046, 0x3a34, 0x4953, 0x4473, 0x3e68, 0x3236, 0x404c, 0x4b70, 0x3c71, 0x3b3b, 0x3537, 0x4575, 0x5e66, 0x5e63, 0x3e5d, 0x5e5f, 0x3437, 0x3d5d, 0x5e60, 0x446d, 0x4f46, 0x3560, 0x365e, 0x4a5a, 0x3574, 0x5e65, 0x5546, 0x5e61, 0x4c4d, 0x467e, 0x4545, 0x5234, 0x3e72, 0x4253, 0x4c3d, 0x3338, 0x3d53, 0x3f58, 0x4d46, 0x515a, 0x346b, 0x5e64, 0x5e5d, 0x5e67, 0x6a7e, 0x4230, 0x5e62, 0x5640, 0x3527, 0x3274, 0x5e68, 0x5e72, 0x5e6d, 0x5e71, 0x4860, 0x5761, 0x5e6f, 0x4368, 0x4c61, 0x3265, 0x523e, 0x5e6e, 0x5e6b, 0x4e55, 0x3427, 0x3f2b, 0x3e3e, 0x3d52, 0x5e69, 0x542e, 0x5e5e, 0x5e6a, 0x403f, 0x5e6c, 0x3273, 0x3869, 0x4227, 0x3d41, 0x5e75, 0x5e78, 0x322b, 0x3424, 0x346a, 0x4926, 0x5e76, 0x4b51, 0x3863, 0x5e77, 0x5e7a, 0x5e79, 0x4c42, 0x3061, 0x346e, 0x653a, 0x502f, 0x326b, 0x6b21, 0x5e74, 0x4963, 0x5e73, 0x305a, 0x5221, 0x3177, 0x4c2f, 0x5e70, 0x4b24, 0x552a, 0x5e7b, 0x345d, 0x4426, 0x5e7d, 0x437e, 0x4421, 0x5f21, 0x414c, 0x5e7c, 0x3e6f, 0x4632, 0x3345, 0x4876, 0x4b3a, 0x5e7e, 0x5f24, 0x5732, 0x3337, 0x4143, 0x474b, 0x3225, 0x3469, 0x572b, 0x446c, 0x5f22, 0x5f23, 0x5f25, 0x3a33, 0x5f26, 0x405e, 0x4943, 0x3259, 0x4766, 0x5f27, 0x475c, 0x5f28, 0x6b22, 0x4b53, 0x5f2a, 0x5f29, 0x3241, 0x454a, 0x5f2b, 0x545c, 0x4841, 0x5f2c, 0x3e70, 0x5f2d, 0x5627, 0x6a37, 0x6b36, 0x4a55, 0x587c, 0x3844, 0x3925, 0x3745, 0x557e, 0x394a, 0x5027, 0x744d, 0x3550, 0x4374, 0x3e48, 0x6b37, 0x303d, 0x3d4c, 0x4132, 0x3156, 0x3328, 0x3852, 0x4922, 0x3658, 0x6b38, 0x3e34, 0x4a7d, 0x4743, 0x557b, 0x3773, 0x4e44, 0x552b, 0x3173, 0x6c33, 0x305f, 0x6c35, 0x3637, 0x414f, 0x757a, 0x5031, 0x5565, 0x4e53, 0x3d6f, 0x3362, 0x382b, 0x5536, 0x6d3d, 0x364f, 0x4b39, 0x5042, 0x373d, 0x6c36, 0x4a29, 0x4554, 0x6c39, 0x6c38, 0x4243, 0x6c37, 0x507d, 0x6c3a, 0x6c3b, 0x5765, 0x6c3c, 0x6c3d, 0x466c, 0x4e5e, 0x3c48, 0x4855, 0x3529, 0x3e49, 0x563c, 0x5467, 0x512e, 0x5071, 0x6a38, 0x6a39, 0x6a3a, 0x3a35, 0x4a31, 0x3f75, 0x4d7a, 0x6a40, 0x303a, 0x6a3e, 0x4025, 0x6a3b, 0x327d, 0x4377, 0x3b68, 0x5257, 0x4e74, 0x6a3f, 0x6a3c, 0x6a43, 0x5047, 0x5333, 0x343a, 0x4341, 0x5772, 0x5551, 0x4a47, 0x6a45, 0x6a44, 0x6a47, 0x6a46, 0x5667, 0x4f54, 0x6a4b, 0x3b4e, 0x3d7a, 0x494e, 0x6a4c, 0x4939, 0x4f7e, 0x6a4a, 0x544e, 0x6a4d, 0x6a4f, 0x4d6d, 0x6a49, 0x6a4e, 0x4e6e, 0x3b5e, 0x333f, 0x4655, 0x3e30, 0x4e7a, 0x4767, 0x3e27, 0x6a50, 0x5647, 0x4140, 0x545d, 0x6a51, 0x4f3e, 0x6a52, 0x4a6e, 0x452f, 0x3035, 0x6a54, 0x6a53, 0x745f, 0x443a, 0x3129, 0x655f, 0x6a55, 0x4a6f, 0x6a56, 0x6a57, 0x4658, 0x6a58, 0x6a59, 0x543b, 0x477a, 0x5237, 0x387c, 0x6a42, 0x325c, 0x427c, 0x5478, 0x4c66, 0x576e, 0x5442, 0x5350, 0x6b43, 0x4573, 0x377e, 0x6b54, 0x4b37, 0x6b5e, 0x404a, 0x4d7b, 0x332f, 0x465a, 0x6b7c, 0x443e, 0x4e34, 0x4429, 0x313e, 0x547d, 0x4a75, 0x566c, 0x4653, 0x3664, 0x3b7a, 0x5060, 0x4931, 0x5453, 0x4828, 0x384b, 0x683e, 0x493c, 0x683b, 0x406e, 0x5053, 0x3244, 0x3465, 0x683c, 0x5548, 0x3645, 0x683d, 0x4a78, 0x385c, 0x4c75, 0x4034, 0x516e, 0x683f, 0x6842, 0x3a3c, 0x312d, 0x3d5c, 0x6a3d, 0x6843, 0x6846, 0x684b, 0x684c, 0x4b49, 0x3065, 0x3c2b, 0x3939, 0x6841, 0x4d77, 0x684a, 0x4e76, 0x556d, 0x4156, 0x6844, 0x4336, 0x397b, 0x5626, 0x6848, 0x4a60, 0x5466, 0x6840, 0x6845, 0x6847, 0x4739, 0x3763, 0x6849, 0x3f5d, 0x6852, 0x6857, 0x6855, 0x3c5c, 0x3c4f, 0x685b, 0x685e, 0x685a, 0x317a, 0x3058, 0x4433, 0x384c, 0x4662, 0x483e, 0x4861, 0x684f, 0x6854, 0x6856, 0x3971, 0x6858, 0x5775, 0x447b, 0x685c, 0x3269, 0x6851, 0x3c6d, 0x3f42, 0x684d, 0x5679, 0x4178, 0x3271, 0x685f, 0x4a41, 0x6859, 0x5524, 0x316a, 0x553b, 0x684e, 0x6850, 0x3630, 0x6853, 0x685d, 0x4038, 0x4a77, 0x4b28, 0x465c, 0x4075, 0x6869, 0x5023, 0x6872, 0x566a, 0x6860, 0x6861, 0x5179, 0x3a4b, 0x3879, 0x3871, 0x5454, 0x686f, 0x686e, 0x686c, 0x3970, 0x4c52, 0x6866, 0x4e26, 0x3f72, 0x3038, 0x6871, 0x6870, 0x5740, 0x6864, 0x4d29, 0x4923, 0x3b38, 0x3d5b, 0x686a, 0x6862, 0x6863, 0x6865, 0x3535, 0x6867, 0x4745, 0x686b, 0x686d, 0x3d30, 0x572e, 0x6878, 0x6875, 0x4d30, 0x6876, 0x413a, 0x6868, 0x4337, 0x3070, 0x6874, 0x6877, 0x3923, 0x4952, 0x434e, 0x4e60, 0x4066, 0x4b73, 0x4c5d, 0x5035, 0x4a61, 0x6873, 0x3c6c, 0x6879, 0x435e, 0x4665, 0x3977, 0x3074, 0x5758, 0x3c2c, 0x456f, 0x4c44, 0x6926, 0x492d, 0x6922, 0x4062, 0x3f43, 0x687e, 0x3957, 0x687b, 0x6924, 0x524e, 0x6923, 0x5632, 0x5735, 0x6927, 0x3d37, 0x687c, 0x687d, 0x6921, 0x4d56, 0x522c, 0x6932, 0x6929, 0x342a, 0x343b, 0x692b, 0x5028, 0x6925, 0x337e, 0x692c, 0x4063, 0x692a, 0x6939, 0x6938, 0x692e, 0x687a, 0x6928, 0x3f2c, 0x6931, 0x693a, 0x4225, 0x692f, 0x3845, 0x692d, 0x535c, 0x6934, 0x6935, 0x6937, 0x6947, 0x4046, 0x6945, 0x6930, 0x693b, 0x3071, 0x693c, 0x5525, 0x693e, 0x693f, 0x6941, 0x4171, 0x4836, 0x693d, 0x6942, 0x6943, 0x6933, 0x6936, 0x3b31, 0x6940, 0x3c77, 0x6944, 0x6946, 0x694a, 0x694e, 0x325b, 0x6948, 0x372e, 0x694b, 0x694c, 0x5541, 0x4423, 0x6958, 0x3a61, 0x6949, 0x5323, 0x6954, 0x6957, 0x6950, 0x694f, 0x4741, 0x6952, 0x6959, 0x3348, 0x6953, 0x4f70, 0x694d, 0x3377, 0x6956, 0x695a, 0x4c34, 0x4f2d, 0x6955, 0x695c, 0x695b, 0x695e, 0x6951, 0x695d, 0x695f, 0x434a, 0x4737, 0x344e, 0x3b36, 0x5040, 0x6c23, 0x4537, 0x537b, 0x6c24, 0x6c25, 0x465b, 0x3f6e, 0x6c26, 0x6c27, 0x502a, 0x4738, 0x3868, 0x6c28, 0x5639, 0x557d, 0x344b, 0x323d, 0x4e64, 0x4667, 0x4d61, 0x3475, 0x4b40, 0x3c5f, 0x6962, 0x6963, 0x516a, 0x6965, 0x3479, 0x6964, 0x5133, 0x4a62, 0x3250, 0x6968, 0x6966, 0x6967, 0x5633, 0x6969, 0x696a, 0x696b, 0x696c, 0x6c2f, 0x4539, 0x364e, 0x5273, 0x356e, 0x3b59, 0x6c31, 0x5263, 0x4e63, 0x4438, 0x433f, 0x363e, 0x5839, 0x3148, 0x314f, 0x3151, 0x457e, 0x3150, 0x432b, 0x5531, 0x6b24, 0x3a41, 0x4c3a, 0x6b25, 0x6b27, 0x6b28, 0x6b26, 0x6b29, 0x6b2b, 0x6b2a, 0x6b2c, 0x4a4f, 0x5835, 0x4371, 0x4325, 0x4678, 0x6b2d, 0x444a, 0x6b2e, 0x6b2f, 0x6b30, 0x3755, 0x377a, 0x6b31, 0x4762, 0x6b33, 0x3a24, 0x5175, 0x3031, 0x6b32, 0x6b34, 0x352a, 0x4248, 0x4768, 0x6b35, 0x4b2e, 0x635f, 0x5340, 0x595b, 0x4d21, 0x562d, 0x4773, 0x5960, 0x3b63, 0x3a3a, 0x6362, 0x4f2b, 0x6360, 0x4947, 0x3a39, 0x5134, 0x6361, 0x486a, 0x392f, 0x3d2d, 0x3358, 0x4e5b, 0x4c40, 0x6368, 0x6369, 0x4d74, 0x4c2d, 0x3c33, 0x636a, 0x636b, 0x505a, 0x467b, 0x375a, 0x475f, 0x524a, 0x4e56, 0x6364, 0x636c, 0x4972, 0x3341, 0x6367, 0x4663, 0x6365, 0x6d33, 0x6366, 0x4933, 0x4566, 0x3935, 0x433b, 0x6363, 0x453d, 0x4124, 0x4259, 0x3257, 0x636d, 0x3b26, 0x442d, 0x6370, 0x3e5a, 0x637b, 0x6375, 0x3a53, 0x3750, 0x534d, 0x564e, 0x5553, 0x3941, 0x5534, 0x5158, 0x5039, 0x4776, 0x482a, 0x3234, 0x435a, 0x636e, 0x637c, 0x636f, 0x3728, 0x6377, 0x6374, 0x373a, 0x4522, 0x6376, 0x455d, 0x3228, 0x467c, 0x4460, 0x5722, 0x4061, 0x6379, 0x637a, 0x637d, 0x4c29, 0x6373, 0x533e, 0x3143, 0x6d34, 0x6371, 0x6372, 0x6378, 0x503a, 0x4643, 0x5473, 0x637e, 0x3d60, 0x6427, 0x6426, 0x5173, 0x6423, 0x6429, 0x4877, 0x4f34, 0x6428, 0x642e, 0x4265, 0x3634, 0x3d72, 0x6422, 0x3a69, 0x642a, 0x642c, 0x367d, 0x565e, 0x6432, 0x642d, 0x6421, 0x3b6e, 0x4d5d, 0x4722, 0x4549, 0x4177, 0x6424, 0x4733, 0x3d2c, 0x3d3d, 0x6425, 0x5747, 0x3262, 0x642b, 0x3c43, 0x642f, 0x3b6b, 0x6430, 0x4528, 0x6431, 0x5563, 0x3f23, 0x643a, 0x6437, 0x643b, 0x643d, 0x4656, 0x3a46, 0x404b, 0x3821, 0x6434, 0x5421, 0x3a23, 0x3d7e, 0x643c, 0x4d3f, 0x4479, 0x4f7b, 0x4966, 0x533f, 0x4f51, 0x6433, 0x6438, 0x6439, 0x4c69, 0x4c4e, 0x4054, 0x6435, 0x4130, 0x6436, 0x4e50, 0x3b41, 0x3553, 0x4873, 0x3d27, 0x5547, 0x492c, 0x3822, 0x644a, 0x644c, 0x5144, 0x523a, 0x3a2d, 0x3a54, 0x6443, 0x356d, 0x574d, 0x6440, 0x4f7d, 0x643f, 0x415c, 0x4c4a, 0x4a67, 0x4457, 0x4c54, 0x6448, 0x6447, 0x6441, 0x6444, 0x352d, 0x5359, 0x6446, 0x5279, 0x3463, 0x3b34, 0x496e, 0x343e, 0x3b6c, 0x514d, 0x4c6d, 0x6d35, 0x4765, 0x5428, 0x644b, 0x5755, 0x6442, 0x3d25, 0x6445, 0x5366, 0x6449, 0x4978, 0x643e, 0x5365, 0x477e, 0x3649, 0x547c, 0x3233, 0x6457, 0x4e42, 0x644d, 0x4e3c, 0x385b, 0x6456, 0x3f4a, 0x534e, 0x436c, 0x4548, 0x6458, 0x4d44, 0x644f, 0x6454, 0x6455, 0x3a7e, 0x4f66, 0x553f, 0x6452, 0x6450, 0x644e, 0x4d65, 0x4a2a, 0x4023, 0x3d26, 0x6453, 0x3848, 0x6467, 0x5434, 0x645b, 0x416f, 0x6469, 0x5267, 0x645f, 0x6460, 0x4f2a, 0x4b5d, 0x645a, 0x6451, 0x6465, 0x485c, 0x6463, 0x4467, 0x6462, 0x6461, 0x337c, 0x6468, 0x3561, 0x574c, 0x6466, 0x3b2c, 0x5752, 0x4c4f, 0x6b78, 0x6464, 0x3976, 0x564d, 0x6459, 0x645c, 0x427a, 0x645e, 0x424b, 0x4044, 0x4250, 0x3175, 0x4c32, 0x354e, 0x646f, 0x462f, 0x4661, 0x6475, 0x4229, 0x406c, 0x515d, 0x646e, 0x442e, 0x646d, 0x6476, 0x6474, 0x427e, 0x645d, 0x6470, 0x4a7e, 0x5544, 0x6471, 0x517a, 0x646b, 0x646c, 0x6472, 0x4e2b, 0x454b, 0x4731, 0x423a, 0x646a, 0x414a, 0x4c36, 0x3331, 0x647b, 0x6473, 0x647a, 0x647d, 0x647c, 0x334e, 0x333a, 0x6477, 0x6479, 0x6478, 0x456c, 0x403d, 0x5468, 0x6522, 0x3044, 0x6524, 0x6523, 0x3c24, 0x6525, 0x6521, 0x647e, 0x3174, 0x6528, 0x6529, 0x6526, 0x6527, 0x652a, 0x4659, 0x652b, 0x652d, 0x652c, 0x652f, 0x652e, 0x3960, 0x6530, 0x6531, 0x3b70, 0x6c61, 0x4370, 0x3546, 0x3b52, 0x4169, 0x546e, 0x3e44, 0x5746, 0x5456, 0x3253, 0x6c3e, 0x6a41, 0x422f, 0x3436, 0x5157, 0x3334, 0x4832, 0x3f3b, 0x6c40, 0x564b, 0x6c3f, 0x6c41, 0x6c45, 0x3e66, 0x4c3f, 0x455a, 0x3e3c, 0x6c46, 0x317e, 0x6c44, 0x5528, 0x3563, 0x6c42, 0x4136, 0x3363, 0x6c43, 0x4b38, 0x4043, 0x4c7e, 0x4152, 0x6c48, 0x3a66, 0x4053, 0x5672, 0x514c, 0x3f3e, 0x3733, 0x4955, 0x6c47, 0x3b62, 0x4c4c, 0x3d7d, 0x4848, 0x4f29, 0x4d69, 0x456b, 0x3769, 0x5149, 0x3a38, 0x6c49, 0x6c4a, 0x3b40, 0x6c4b, 0x6c62, 0x313a, 0x3759, 0x3d39, 0x6c4c, 0x5166, 0x6c4d, 0x483b, 0x6c51, 0x6c53, 0x3b4d, 0x3c65, 0x6c4f, 0x4937, 0x433a, 0x6c63, 0x5555, 0x6c50, 0x5673, 0x6c52, 0x6c4e, 0x6c54, 0x6c55, 0x493f, 0x4f28, 0x505c, 0x512c, 0x485b, 0x6c56, 0x4e75, 0x4a6c, 0x6c5a, 0x6c59, 0x303e, 0x6c57, 0x6c58, 0x6c64, 0x483c, 0x4147, 0x6c5c, 0x5160, 0x6c5b, 0x546f, 0x6c5d, 0x5b46, 0x6c5e, 0x312c, 0x6c5f, 0x6c60, 0x5726, 0x4540, 0x6b3c, 0x302e, 0x3e74, 0x3838, 0x522f, 0x3056, 0x3579, 0x5833, 0x4b2c, 0x635d, 0x462c, 0x3066, 0x4546, 0x6b39, 0x6b3a, 0x6b3b, 0x5140, 0x4523, 0x6a72, 0x4432, 0x4435, 0x404e, 0x6a73, 0x4441, 0x4e6f, 0x6a70, 0x6a74, 0x497c, 0x4723, 0x4c58, 0x4e7e, 0x6a75, 0x6a76, 0x4f2c, 0x4067, 0x6a77, 0x363f, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a71, 0x482e, 0x616b, 0x3738, 0x616c, 0x616d, 0x5734, 0x616e, 0x616f, 0x534c, 0x6171, 0x3f71, 0x6170, 0x3552, 0x3137, 0x6173, 0x6172, 0x3a7c, 0x6174, 0x3937, 0x3e51, 0x447c, 0x3a5d, 0x3d46, 0x6175, 0x6177, 0x3640, 0x4f41, 0x4a28, 0x6176, 0x5578, 0x537c, 0x6178, 0x617c, 0x6179, 0x617a, 0x406a, 0x617e, 0x6221, 0x4047, 0x617b, 0x617d, 0x6225, 0x4154, 0x6223, 0x6228, 0x327e, 0x6222, 0x434d, 0x3242, 0x6227, 0x6226, 0x6224, 0x6229, 0x622b, 0x5049, 0x566d, 0x4328, 0x622c, 0x4f57, 0x622e, 0x3a6f, 0x6960, 0x622d, 0x622a, 0x3b2b, 0x5433, 0x6230, 0x622f, 0x6961, 0x6231, 0x6232, 0x6233, 0x4c21, 0x6234, 0x6235, 0x507e, 0x424a, 0x5371, 0x4d75, 0x6760, 0x6761, 0x3e41, 0x426a, 0x6764, 0x6763, 0x4d66, 0x4335, 0x6762, 0x3b37, 0x4f56, 0x4161, 0x6769, 0x6768, 0x6774, 0x3223, 0x676a, 0x6766, 0x676c, 0x676b, 0x493a, 0x5564, 0x6765, 0x3729, 0x6767, 0x676e, 0x6773, 0x5669, 0x676d, 0x6772, 0x6771, 0x3060, 0x6775, 0x4772, 0x4045, 0x406d, 0x4170, 0x6770, 0x6776, 0x4b76, 0x6822, 0x6821, 0x5741, 0x677a, 0x6779, 0x677b, 0x6777, 0x677e, 0x677d, 0x677c, 0x4155, 0x4759, 0x457d, 0x4543, 0x476d, 0x6823, 0x6826, 0x6825, 0x6827, 0x3a77, 0x6778, 0x6824, 0x4870, 0x492a, 0x6829, 0x3965, 0x517e, 0x6828, 0x682a, 0x682d, 0x682e, 0x4127, 0x682f, 0x6830, 0x682c, 0x6834, 0x682b, 0x6831, 0x6835, 0x6832, 0x6833, 0x6837, 0x6836, 0x394f, 0x702c, 0x702d, 0x4630, 0x306a, 0x483f, 0x4d5f, 0x4e4d, 0x6a31, 0x6a32, 0x463f, 0x3449, 0x6a33, 0x5567, 0x5d79, 0x6a34, 0x6a35, 0x6a36, 0x384a, 0x5f30, 0x4975, 0x4c70, 0x497a, 0x497b, 0x5343, 0x4b26, 0x3826, 0x702e, 0x3142, 0x6538, 0x4c6f, 0x5349, 0x3c57, 0x496a, 0x3567, 0x4450, 0x3569, 0x6e2e, 0x3b2d, 0x675e, 0x6e2f, 0x3329, 0x6e32, 0x6e31, 0x3d67, 0x6e30, 0x4e37, 0x454f, 0x4174, 0x5b4e, 0x6e33, 0x5073, 0x4254, 0x4668, 0x372c, 0x6e34, 0x336b, 0x3b7b, 0x6e35, 0x675c, 0x6e36, 0x3d2e, 0x7162, 0x4a68, 0x5249, 0x705a, 0x705b, 0x705c, 0x4146, 0x386d, 0x3e4e, 0x705e, 0x4531, 0x705d, 0x5171, 0x7060, 0x304c, 0x3d6a, 0x525f, 0x705f, 0x342f, 0x3768, 0x7066, 0x7065, 0x4623, 0x7061, 0x7062, 0x3443, 0x7063, 0x556e, 0x4c5b, 0x3e52, 0x3c32, 0x7068, 0x7067, 0x7064, 0x3221, 0x5622, 0x5338, 0x3e37, 0x482c, 0x706a, 0x5177, 0x564c, 0x3a5b, 0x7069, 0x363b, 0x4d34, 0x4626, 0x4121, 0x706b, 0x706e, 0x706d, 0x7070, 0x706c, 0x3b3e, 0x706f, 0x4c35, 0x7072, 0x3355, 0x3154, 0x7073, 0x7074, 0x7076, 0x3461, 0x7071, 0x7077, 0x707a, 0x7078, 0x7075, 0x707d, 0x7079, 0x707c, 0x707e, 0x7121, 0x4e41, 0x7124, 0x7123, 0x4176, 0x707b, 0x4a5d, 0x3471, 0x3171, 0x4c31, 0x7126, 0x7127, 0x712c, 0x554e, 0x7129, 0x4833, 0x7122, 0x712b, 0x7128, 0x7125, 0x712a, 0x3029, 0x712d, 0x712f, 0x7131, 0x7130, 0x712e, 0x5122, 0x7132, 0x7133, 0x396f, 0x3547, 0x3057, 0x3059, 0x546d, 0x3544, 0x3d54, 0x3b4a, 0x7027, 0x385e, 0x7028, 0x3028, 0x7029, 0x4d6e, 0x702a, 0x702b, 0x4624, 0x5665, 0x7164, 0x7165, 0x4373, 0x535b, 0x5651, 0x4568, 0x532f, 0x5266, 0x6e41, 0x303b, 0x5535, 0x514e, 0x3c60, 0x3a50, 0x3f78, 0x3847, 0x3541, 0x454c, 0x4a22, 0x434b, 0x6e42, 0x443f, 0x3622, 0x6d6c, 0x4324, 0x5631, 0x4f60, 0x6d6f, 0x454e, 0x365c, 0x4a21, 0x6d6d, 0x6d70, 0x6d71, 0x433c, 0x3f34, 0x6d6e, 0x6d74, 0x6d72, 0x5566, 0x435f, 0x6d73, 0x6d76, 0x5523, 0x5123, 0x6d75, 0x4350, 0x6d77, 0x3f74, 0x3e6c, 0x6d78, 0x4c77, 0x515b, 0x5745, 0x5576, 0x6d7c, 0x6d7b, 0x6d79, 0x6d7a, 0x6d7d, 0x3e26, 0x4b2f, 0x6e21, 0x363d, 0x6e22, 0x4440, 0x6d7e, 0x3d5e, 0x3247, 0x3643, 0x6e25, 0x583a, 0x6e23, 0x6e26, 0x4369, 0x3372, 0x6e27, 0x6e24, 0x4f39, 0x6e28, 0x4277, 0x6e29, 0x6e2a, 0x5e2b, 0x4633, 0x4746, 0x5675, 0x3549, 0x4b32, 0x6e2b, 0x4d2b, 0x6e2c, 0x5530, 0x6e2d, 0x7644, 0x5b47, 0x3423, 0x432c, 0x7166, 0x4a38, 0x5253, 0x562a, 0x6f72, 0x3e58, 0x3d43, 0x6f73, 0x364c, 0x302b, 0x4a2f, 0x6d36, 0x6d37, 0x4e79, 0x372f, 0x3f73, 0x6d38, 0x426b, 0x4930, 0x6d39, 0x4676, 0x3f33, 0x6d3c, 0x4578, 0x5150, 0x5729, 0x6d3a, 0x6d3b, 0x5162, 0x6d3f, 0x6d40, 0x6d44, 0x6d48, 0x6d46, 0x6d4e, 0x5568, 0x6d49, 0x6d47, 0x6d3e, 0x4569, 0x4646, 0x4969, 0x5452, 0x6d41, 0x6d42, 0x6d43, 0x6d45, 0x4079, 0x3421, 0x3968, 0x6d50, 0x6d51, 0x6d4a, 0x6d4f, 0x4e78, 0x4b36, 0x6d4c, 0x6d4d, 0x4f75, 0x6d52, 0x4172, 0x5332, 0x6d4b, 0x4837, 0x3c6f, 0x4570, 0x6d56, 0x356f, 0x4235, 0x302d, 0x4b69, 0x312e, 0x6d54, 0x4d6b, 0x3562, 0x6d55, 0x6d53, 0x6d57, 0x357a, 0x6d58, 0x6d59, 0x6d5c, 0x314c, 0x4576, 0x3c6e, 0x6d5a, 0x4c3c, 0x326a, 0x6d5b, 0x446b, 0x3445, 0x3075, 0x6d5f, 0x405a, 0x3468, 0x454d, 0x6d5d, 0x3f44, 0x6d5e, 0x4425, 0x6d60, 0x6d61, 0x6d63, 0x4157, 0x3b47, 0x3d38, 0x6d62, 0x6d64, 0x6d66, 0x6d65, 0x6d67, 0x4a3e, 0x6c6a, 0x4071, 0x4967, 0x6c6b, 0x466e, 0x6c6c, 0x466d, 0x6c6d, 0x6c70, 0x5766, 0x6c73, 0x6c71, 0x6c6e, 0x6c6f, 0x5723, 0x4971, 0x4b6e, 0x6c74, 0x6c72, 0x4f69, 0x6c76, 0x4631, 0x3c40, 0x6c75, 0x353b, 0x3b76, 0x6c77, 0x5977, 0x3d7b, 0x423b, 0x6c78, 0x6c79, 0x3823, 0x6c7a, 0x6c7b, 0x6c7c, 0x536d, 0x582e, 0x406b, 0x475d, 0x3a4c, 0x5063, 0x4b3d, 0x4d3a, 0x3851, 0x317c, 0x476f, 0x5656, 0x3f46, 0x436b, 0x6f75, 0x4358, 0x5762, 0x6f77, 0x3353, 0x4758, 0x516d, 0x5648, 0x6f78, 0x6f76, 0x3b7d, 0x3346, 0x3d55, 0x5246, 0x3b60, 0x4f21, 0x6f7c, 0x6f7b, 0x6f79, 0x334c, 0x4954, 0x4b30, 0x6f7e, 0x305e, 0x5649, 0x6f7d, 0x336d, 0x7655, 0x4e48, 0x7022, 0x7021, 0x353e, 0x3c5a, 0x3b7c, 0x3865, 0x4442, 0x7023, 0x4b6b, 0x7026, 0x5128, 0x3e3f, 0x476e, 0x7136, 0x7137, 0x3f55, 0x3429, 0x7138, 0x4d3b, 0x4754, 0x552d, 0x7139, 0x713a, 0x474f, 0x5224, 0x564f, 0x713b, 0x3d51, 0x3430, 0x3e3d, 0x345c, 0x4e51, 0x3f5f, 0x713d, 0x3f7a, 0x713c, 0x713f, 0x713e, 0x7140, 0x7141, 0x417e, 0x4122, 0x4a7a, 0x553e, 0x3e3a, 0x3e39, 0x5542, 0x3f22, 0x4d2f, 0x7135, 0x3d5f, 0x364b, 0x5671, 0x7343, 0x7344, 0x384d, 0x7346, 0x7347, 0x304a, 0x7345, 0x7349, 0x4b71, 0x734b, 0x5026, 0x314a, 0x7348, 0x734f, 0x3551, 0x7357, 0x7352, 0x7354, 0x7353, 0x377b, 0x313f, 0x734e, 0x734a, 0x355a, 0x7350, 0x7351, 0x7355, 0x734d, 0x3c63, 0x417d, 0x7356, 0x735a, 0x734c, 0x3548, 0x3d6e, 0x735c, 0x3724, 0x3f70, 0x567e, 0x4d32, 0x3470, 0x325f, 0x7358, 0x7359, 0x4938, 0x735d, 0x735e, 0x7361, 0x735f, 0x7363, 0x7362, 0x735b, 0x3f6a, 0x336f, 0x7360, 0x4729, 0x3c72, 0x736b, 0x393f, 0x7364, 0x322d, 0x3b7e, 0x4b63, 0x736d, 0x7369, 0x395c, 0x736e, 0x7365, 0x7366, 0x736a, 0x4261, 0x736c, 0x736f, 0x7368, 0x3c7d, 0x4f64, 0x7370, 0x7367, 0x7372, 0x572d, 0x462a, 0x7373, 0x7371, 0x4228, 0x385d, 0x7375, 0x7374, 0x345b, 0x7376, 0x7377, 0x7378, 0x403a, 0x4069, 0x4571, 0x737b, 0x737a, 0x3458, 0x737e, 0x7379, 0x737c, 0x737d, 0x7421, 0x7423, 0x3b49, 0x7422, 0x7424, 0x323e, 0x7426, 0x7425, 0x3c2e, 0x4357, 0x5961, 0x4060, 0x744c, 0x5751, 0x375b, 0x744e, 0x4123, 0x4649, 0x3456, 0x5533, 0x7450, 0x744f, 0x7451, 0x4b5a, 0x7452, 0x5441, 0x5660, 0x3760, 0x4138, 0x413b, 0x7453, 0x3e2c, 0x3462, 0x7454, 0x7455, 0x3e2b, 0x7456, 0x745b, 0x7457, 0x745a, 0x3a7d, 0x7458, 0x7459, 0x3862, 0x4c47, 0x745c, 0x325a, 0x4353, 0x5463, 0x3f37, 0x745d, 0x4534, 0x7469, 0x4f35, 0x4e49, 0x4b58, 0x4b77, 0x3d74, 0x574f, 0x405b, 0x5075, 0x746a, 0x746b, 0x746c, 0x7763, 0x3731, 0x746d, 0x576b, 0x746e, 0x6679, 0x3e40, 0x667a, 0x3a6c, 0x667b, 0x4f4b, 0x667c, 0x543c, 0x3c36, 0x667d, 0x667e, 0x3c4d, 0x4852, 0x4e33, 0x6721, 0x343f, 0x6722, 0x4934, 0x3859, 0x4449, 0x575d, 0x425a, 0x3757, 0x563d, 0x4e46, 0x3744, 0x4526, 0x6723, 0x4f5f, 0x6724, 0x6725, 0x6726, 0x4137, 0x5769, 0x4970, 0x4f38, 0x562f, 0x5655, 0x6727, 0x306d, 0x6728, 0x6729, 0x495c, 0x526f, 0x3e2d, 0x672a, 0x3073, 0x485e, 0x3d61, 0x672b, 0x4846, 0x672c, 0x3b66, 0x3878, 0x5124, 0x672d, 0x4267, 0x3e78, 0x3d4a, 0x4d33, 0x672e, 0x672f, 0x3e6e, 0x5065, 0x4b67, 0x4c50, 0x3c4c, 0x6730, 0x3c28, 0x5077, 0x6731, 0x5078, 0x6732, 0x6733, 0x3442, 0x6734, 0x6735, 0x497e, 0x4e2c, 0x4360, 0x6737, 0x3141, 0x3371, 0x6738, 0x6739, 0x575b, 0x5540, 0x673a, 0x424c, 0x573a, 0x673b, 0x673c, 0x673d, 0x3c6a, 0x4365, 0x4042, 0x673e, 0x673f, 0x3c29, 0x6740, 0x6741, 0x6736, 0x3650, 0x6742, 0x6743, 0x6744, 0x3b3a, 0x355e, 0x4246, 0x3160, 0x6745, 0x5435, 0x6746, 0x383f, 0x6748, 0x6747, 0x376c, 0x6749, 0x3278, 0x674a, 0x674b, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x5327, 0x4b75, 0x6751, 0x6752, 0x6753, 0x6754, 0x4949, 0x6755, 0x6756, 0x6757, 0x6758, 0x6759, 0x3d49, 0x675a, 0x733e, 0x3857, 0x4831, 0x733f, 0x7340, 0x7341, 0x395e, 0x4d78, 0x5868, 0x3a31, 0x425e, 0x6e37, 0x3723, 0x6e39, 0x6e38, 0x3055, 0x6e3b, 0x5556, 0x576f, 0x5643, 0x6e3d, 0x4a70, 0x6e3c, 0x6e3e, 0x6e40, 0x6e3f, 0x5172, 0x473c, 0x4340, 0x3861, 0x4167, 0x7446, 0x505f, 0x7447, 0x4f5b, 0x483a, 0x7448, 0x7449, 0x744a, 0x744b, 0x597a, 0x387e, 0x6571, 0x5370, 0x7460, 0x4e4c, 0x3361, 0x7134, 0x526e, 0x7461, 0x4f68, 0x7462, 0x474c, 0x3554, 0x3464, 0x7464, 0x7463, 0x7465, 0x7466, 0x7467, 0x3a32, 0x303f, 0x7468, 0x372d, 0x526d, 0x522b, 0x404f, 0x3f3c, 0x6b23, 0x555f, 0x6a48, 0x7173, 0x3678, 0x4b23, 0x444d, 0x7167, 0x7168, 0x387b, 0x7169, 0x3a44, 0x5445, 0x3052, 0x716a, 0x716b, 0x716c, 0x716d, 0x716e, 0x716f, 0x7171, 0x7170, 0x4555, 0x7172, 0x367a, 0x7174, 0x522e, 0x5e47, 0x4b4a, 0x335c, 0x3522, 0x3922, 0x4474, 0x7175, 0x7176, 0x4144, 0x417b, 0x5630, 0x7177, 0x7178, 0x412a, 0x4638, 0x3e5b, 0x7179, 0x344f, 0x717a, 0x6d32, 0x6d31, 0x4b60, 0x525e, 0x4b41, 0x5558, 0x4862, 0x405f, 0x3c21, 0x6b41, 0x5024, 0x5662, 0x3647, 0x3858, 0x6b40, 0x384e, 0x6b3f, 0x3326, 0x3949, 0x562b, 0x3774, 0x374a, 0x3c67, 0x373e, 0x6b46, 0x6b47, 0x3039, 0x3f4f, 0x6b45, 0x537d, 0x6b48, 0x6b49, 0x374e, 0x6b42, 0x6b44, 0x4976, 0x5657, 0x554d, 0x5032, 0x6b4f, 0x4e38, 0x6b50, 0x3528, 0x3133, 0x6b52, 0x4c25, 0x4556, 0x6b53, 0x6b51, 0x455f, 0x6b4e, 0x4a24, 0x6b55, 0x307b, 0x3a7a, 0x5837, 0x7163, 0x6b4a, 0x6b4b, 0x6b4c, 0x6b4d, 0x6b56, 0x6640, 0x6b59, 0x3f68, 0x5248, 0x6b57, 0x6b5c, 0x386c, 0x6b58, 0x3d3a, 0x5058, 0x3037, 0x6b5d, 0x445c, 0x562c, 0x3460, 0x4276, 0x3c39, 0x6b5a, 0x6b5b, 0x5460, 0x466a, 0x4454, 0x6b5f, 0x4527, 0x5975, 0x3231, 0x6b64, 0x3d45, 0x6b62, 0x6b63, 0x382c, 0x4d51, 0x6b65, 0x6b61, 0x4133, 0x4622, 0x4c73, 0x6b66, 0x4030, 0x5238, 0x6b67, 0x382f, 0x382d, 0x6b68, 0x473b, 0x4d73, 0x6b6a, 0x6b6b, 0x6b6d, 0x5048, 0x6b72, 0x6b6e, 0x6b71, 0x4879, 0x517c, 0x6b6c, 0x6b69, 0x3839, 0x4f59, 0x4465, 0x6b6f, 0x6b70, 0x4c5a, 0x4d48, 0x3072, 0x6b76, 0x6b75, 0x3232, 0x3860, 0x6b77, 0x316c, 0x4c45, 0x4424, 0x4f25, 0x6b79, 0x6c22, 0x4572, 0x6b7a, 0x4945, 0x625f, 0x6b7e, 0x4d4e, 0x6c21, 0x315b, 0x5337, 0x525c, 0x6b7d, 0x6b7b, 0x333c, 0x6a30, 0x5754, 0x742b, 0x3374, 0x5641, 0x5642, 0x5569, 0x3e4a, 0x7427, 0x5228, 0x7428, 0x7429, 0x742a, 0x3e4b, 0x535f, 0x4960, 0x4961, 0x7342, 0x4a66, 0x4c72, 0x6236, 0x4b34, 0x4e68, 0x565b, 0x742d, 0x742e, 0x742f, 0x7432, 0x3a3d, 0x7433, 0x3063, 0x7430, 0x7431, 0x3d22, 0x3255, 0x7436, 0x7437, 0x3666, 0x3230, 0x4f4f, 0x7434, 0x342c, 0x7435, 0x7438, 0x7439, 0x4d27, 0x743a, 0x743b, 0x743c, 0x4b52, 0x743d, 0x743e, 0x743f, 0x745e, 0x413c, 0x3c68, 0x492b, 0x515e, 0x6575, 0x5c33, 0x5255, 0x5c34, 0x302c, 0x5c35, 0x3d5a, 0x5c39, 0x5842, 0x5c37, 0x5373, 0x4956, 0x5c3a, 0x5c36, 0x5c3b, 0x4322, 0x5c3c, 0x5c45, 0x5c3d, 0x4e5f, 0x5625, 0x5c4f, 0x5c4d, 0x5c52, 0x3d66, 0x422b, 0x5c38, 0x5c4b, 0x5c4e, 0x5c3e, 0x3752, 0x3045, 0x5c47, 0x503e, 0x5c41, 0x3b28, 0x373c, 0x5c4c, 0x5c46, 0x5c3f, 0x475b, 0x513f, 0x5c40, 0x5c4a, 0x5c50, 0x4e2d, 0x5c42, 0x5c43, 0x5c48, 0x5c49, 0x3254, 0x5c51, 0x4b55, 0x5437, 0x5c5b, 0x5c5f, 0x4c26, 0x5c66, 0x4367, 0x5c5c, 0x3f41, 0x5c59, 0x307a, 0x3936, 0x5c65, 0x5c53, 0x5c44, 0x5c56, 0x4874, 0x3f60, 0x493b, 0x313d, 0x5322, 0x5c5a, 0x5c55, 0x463b, 0x5c5e, 0x5742, 0x432f, 0x3736, 0x4751, 0x4329, 0x5c62, 0x5c58, 0x5c6b, 0x5c54, 0x5c5d, 0x3e25, 0x5c57, 0x5c60, 0x5c63, 0x5c64, 0x5c78, 0x5c61, 0x5d22, 0x5c67, 0x3c6b, 0x3444, 0x4323, 0x3267, 0x5c7a, 0x5c72, 0x5c6f, 0x5c7c, 0x5c6e, 0x5270, 0x3268, 0x4857, 0x4863, 0x5c7b, 0x5c6d, 0x5c77, 0x5c75, 0x3e23, 0x5c74, 0x325d, 0x5c73, 0x3c76, 0x5c68, 0x3b44, 0x4073, 0x3c54, 0x5c69, 0x5c6a, 0x5c71, 0x5c76, 0x5c79, 0x3534, 0x4859, 0x3b67, 0x5c7e, 0x5c7d, 0x532b, 0x5d21, 0x5d23, 0x5d25, 0x5271, 0x5d24, 0x5d26, 0x5d27, 0x5229, 0x3a49, 0x5d29, 0x5d36, 0x5d31, 0x5d34, 0x5d30, 0x464e, 0x4072, 0x492f, 0x5c6c, 0x5d2e, 0x5d37, 0x5c70, 0x5d2f, 0x5d38, 0x5d2c, 0x5d39, 0x5d33, 0x5d2d, 0x442a, 0x5d28, 0x4033, 0x412b, 0x5d2a, 0x5d2b, 0x5d32, 0x3b71, 0x5d35, 0x5328, 0x5d3a, 0x5d3b, 0x4327, 0x5d52, 0x5d3c, 0x5d51, 0x393d, 0x3e55, 0x3e7a, 0x3a4a, 0x5d4a, 0x5d45, 0x5d3f, 0x324b, 0x5d43, 0x5d4b, 0x3224, 0x5d55, 0x5d3e, 0x4650, 0x5d50, 0x5d54, 0x4162, 0x3746, 0x5d4e, 0x5d4f, 0x5d44, 0x5d3d, 0x5d4d, 0x4c51, 0x5d49, 0x5d42, 0x4348, 0x463c, 0x4e2e, 0x5d4c, 0x5d48, 0x5d41, 0x5d46, 0x425c, 0x5329, 0x532a, 0x5d53, 0x4f74, 0x4878, 0x5d66, 0x5d47, 0x5d60, 0x4264, 0x5d61, 0x5d57, 0x5678, 0x5d59, 0x5d58, 0x3870, 0x5d56, 0x464f, 0x362d, 0x5d62, 0x3a79, 0x5461, 0x5d67, 0x3450, 0x5d5a, 0x3f7b, 0x5d63, 0x5d5f, 0x5d5d, 0x3559, 0x5d5b, 0x5d5c, 0x5d5e, 0x3d2f, 0x5d64, 0x5d65, 0x5d75, 0x4349, 0x4b62, 0x5d72, 0x5861, 0x4651, 0x5d74, 0x5574, 0x5d73, 0x5d70, 0x5d6c, 0x5d6f, 0x5d68, 0x506e, 0x4858, 0x5d6e, 0x5d69, 0x5d6a, 0x4b72, 0x5d6d, 0x314d, 0x4036, 0x3c3b, 0x5d71, 0x5d77, 0x5d76, 0x5d6b, 0x456e, 0x5d7b, 0x5e24, 0x5e23, 0x5d78, 0x436f, 0x427b, 0x5561, 0x4e35, 0x5d7d, 0x324c, 0x4468, 0x4a5f, 0x473e, 0x5d7a, 0x5d7c, 0x5d7e, 0x5e22, 0x302a, 0x314e, 0x5e2c, 0x5e26, 0x3d36, 0x486f, 0x5e21, 0x5e25, 0x5e29, 0x5e28, 0x5e27, 0x5e2d, 0x544c, 0x5e33, 0x5e2a, 0x5e2e, 0x4059, 0x3121, 0x5e36, 0x5e31, 0x5e32, 0x5126, 0x5e35, 0x5e2f, 0x5e30, 0x503d, 0x5e34, 0x4a6d, 0x5e39, 0x5e38, 0x5e37, 0x5e3b, 0x3d65, 0x3258, 0x436a, 0x5e3a, 0x453a, 0x5e3c, 0x4c59, 0x372a, 0x5465, 0x5e3d, 0x5e3f, 0x4422, 0x5e41, 0x5e3e, 0x5e40, 0x553a, 0x5e42, 0x722e, 0x3b22, 0x4232, 0x4530, 0x4247, 0x722f, 0x5069, 0x535d, 0x6b3d, 0x3366, 0x7230, 0x7231, 0x4a2d, 0x3a67, 0x7233, 0x7235, 0x7234, 0x4b64, 0x4f3a, 0x7232, 0x4a34, 0x524f, 0x426c, 0x4e43, 0x7238, 0x3076, 0x7237, 0x723e, 0x324f, 0x5141, 0x723a, 0x723c, 0x5469, 0x723b, 0x7236, 0x723f, 0x723d, 0x7239, 0x7247, 0x7244, 0x7246, 0x724a, 0x7242, 0x7240, 0x7245, 0x567b, 0x7241, 0x4779, 0x495f, 0x7248, 0x3946, 0x3530, 0x7243, 0x7249, 0x7250, 0x7256, 0x3b57, 0x7255, 0x4d5c, 0x566b, 0x7252, 0x7254, 0x3872, 0x724b, 0x724e, 0x4279, 0x555d, 0x724c, 0x724d, 0x724f, 0x7253, 0x7259, 0x533c, 0x366a, 0x4a71, 0x3764, 0x7257, 0x7258, 0x725a, 0x725d, 0x725b, 0x725c, 0x5151, 0x7251, 0x4d49, 0x4e4f, 0x5629, 0x7263, 0x435b, 0x7260, 0x402f, 0x726c, 0x725e, 0x7261, 0x7268, 0x7262, 0x7267, 0x7266, 0x7269, 0x725f, 0x7264, 0x726a, 0x532c, 0x7265, 0x3275, 0x7272, 0x502b, 0x7275, 0x3b48, 0x7279, 0x7270, 0x7276, 0x7278, 0x727a, 0x7273, 0x7271, 0x3a7b, 0x357b, 0x726f, 0x7277, 0x726d, 0x726e, 0x726b, 0x7326, 0x7323, 0x7322, 0x7274, 0x485a, 0x727b, 0x7325, 0x4378, 0x727d, 0x7327, 0x7329, 0x7324, 0x727c, 0x732b, 0x732a, 0x425d, 0x732e, 0x7330, 0x7321, 0x7331, 0x732c, 0x732f, 0x727e, 0x732d, 0x7332, 0x7334, 0x7328, 0x7333, 0x7335, 0x5037, 0x7338, 0x5979, 0x7339, 0x7337, 0x4864, 0x7336, 0x733a, 0x733b, 0x3440, 0x6e43, 0x733c, 0x733d, 0x512a, 0x742c, 0x5046, 0x5050, 0x515c, 0x4f4e, 0x3d56, 0x5143, 0x3a62, 0x6169, 0x5242, 0x7142, 0x3239, 0x316d, 0x7143, 0x4940, 0x3344, 0x5972, 0x4b25, 0x7144, 0x5654, 0x7145, 0x7440, 0x7146, 0x542c, 0x7147, 0x3040, 0x7441, 0x7442, 0x347c, 0x455b, 0x4c3b, 0x5064, 0x4d60, 0x7148, 0x5973, 0x313b, 0x4f2e, 0x3824, 0x714a, 0x714b, 0x3243, 0x4151, 0x5730, 0x7149, 0x714c, 0x714e, 0x5976, 0x5261, 0x5423, 0x7443, 0x4839, 0x7444, 0x714d, 0x714f, 0x3f63, 0x7150, 0x7154, 0x7156, 0x7151, 0x4951, 0x4561, 0x4263, 0x397c, 0x7153, 0x7155, 0x3953, 0x715b, 0x3a56, 0x307d, 0x7159, 0x7158, 0x7152, 0x715a, 0x7157, 0x486c, 0x4d4a, 0x715d, 0x653d, 0x715c, 0x715e, 0x715f, 0x4f65, 0x7445, 0x3d73, 0x7160, 0x7161, 0x4e77, 0x522a, 0x717b, 0x3832, 0x3c7b, 0x395b, 0x3966, 0x4359, 0x4a53, 0x6a68, 0x4040, 0x3e75, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x3d47, 0x757b, 0x757d, 0x757e, 0x757c, 0x3d62, 0x7621, 0x3425, 0x7622, 0x7623, 0x6c32, 0x5154, 0x596a, 0x7624, 0x6e3a, 0x5532, 0x537e, 0x4c5c, 0x4a44, 0x6540, 0x7625, 0x3e2f, 0x4629, 0x5a25, 0x3c46, 0x3629, 0x383c, 0x484f, 0x3c25, 0x5a26, 0x5a27, 0x4c56, 0x4843, 0x5a28, 0x467d, 0x5135, 0x5269, 0x5136, 0x3c47, 0x3d32, 0x3b64, 0x5a29, 0x5a2a, 0x5148, 0x5a2b, 0x506d, 0x366f, 0x425b, 0x4b4f, 0x376d, 0x4968, 0x3743, 0x3e77, 0x5624, 0x5a2c, 0x5a2d, 0x4640, 0x5767, 0x4a36, 0x5529, 0x4b5f, 0x556f, 0x5a2e, 0x565f, 0x344a, 0x5a30, 0x5a2f, 0x526b, 0x5a31, 0x5a32, 0x5a33, 0x4a54, 0x5a34, 0x4a2b, 0x5a35, 0x5a36, 0x334f, 0x566f, 0x5a37, 0x3b30, 0x352e, 0x5a38, 0x5a39, 0x396e, 0x512f, 0x5268, 0x5a3a, 0x3843, 0x4f6a, 0x326f, 0x5a3b, 0x5a3c, 0x3d6b, 0x4e5c, 0x536f, 0x5a3d, 0x4e73, 0x5a3e, 0x5355, 0x3b65, 0x5a3f, 0x4b35, 0x4b50, 0x5a40, 0x476b, 0x566e, 0x5a41, 0x4535, 0x3641, 0x5a42, 0x374c, 0x3f4e, 0x5a43, 0x5a44, 0x4b2d, 0x5a45, 0x3577, 0x5a46, 0x4142, 0x573b, 0x5a47, 0x4c38, 0x526a, 0x4431, 0x5a48, 0x357d, 0x3b51, 0x5a49, 0x5033, 0x5a4a, 0x5a4b, 0x4e3d, 0x5a4c, 0x5a4d, 0x5a4e, 0x3277, 0x5a51, 0x5a4f, 0x5168, 0x5a50, 0x4355, 0x5a52, 0x5a53, 0x5a54, 0x5a55, 0x503b, 0x5225, 0x3079, 0x5a56, 0x472b, 0x5a57, 0x3d77, 0x4321, 0x5a58, 0x5a59, 0x437d, 0x4c37, 0x5a5a, 0x5a5b, 0x403e, 0x4657, 0x5a5c, 0x5a5d, 0x4734, 0x5a5e, 0x5a5f, 0x3948, 0x3b6d, 0x3639, 0x7478, 0x7479, 0x4d63, 0x7539, 0x6b60, 0x4f73, 0x3b3f, 0x3a40, 0x5425, 0x6159, 0x7574, 0x312a, 0x3272, 0x7575, 0x7577, 0x3a51, 0x7576, 0x4332, 0x7579, 0x7578, 0x3134, 0x556a, 0x383a, 0x3931, 0x3246, 0x5470, 0x4f4d, 0x305c, 0x554b, 0x3b75, 0x564a, 0x3737, 0x4c30, 0x4636, 0x3161, 0x393a, 0x567c, 0x3961, 0x3721, 0x3c7a, 0x6a5a, 0x6a5b, 0x4c79, 0x3973, 0x6a5c, 0x347b, 0x4333, 0x3751, 0x3a58, 0x6a5d, 0x5474, 0x6a5e, 0x3c56, 0x3b5f, 0x6a5f, 0x415e, 0x4238, 0x545f, 0x574a, 0x6a60, 0x6a61, 0x6a64, 0x6a62, 0x6a63, 0x495e, 0x3833, 0x3644, 0x6a65, 0x4a6a, 0x494d, 0x344d, 0x6259, 0x4562, 0x6a66, 0x4035, 0x5738, 0x6a67, 0x572c, 0x487c, 0x5853, 0x584d, 0x545e, 0x5479, 0x4944, 0x532e, 0x3853, 0x3360, 0x4962, 0x7476, 0x3a55, 0x7477, 0x575f, 0x7471, 0x3830, 0x5554, 0x384f, 0x4670, 0x3343, 0x7472, 0x332c, 0x543d, 0x4777, 0x7474, 0x7473, 0x4c4b, 0x4824, 0x7475, 0x5763, 0x453f, 0x7540, 0x753b, 0x7543, 0x7542, 0x563a, 0x7541, 0x543e, 0x7544, 0x754c, 0x304f, 0x3578, 0x7549, 0x754a, 0x455c, 0x7545, 0x7546, 0x7547, 0x754b, 0x3e60, 0x7548, 0x387a, 0x7550, 0x7553, 0x3f67, 0x3972, 0x753c, 0x754d, 0x4237, 0x4c78, 0x3c79, 0x754e, 0x754f, 0x7551, 0x3665, 0x7552, 0x7555, 0x753d, 0x7554, 0x533b, 0x336c, 0x4c24, 0x7556, 0x7557, 0x3e61, 0x7558, 0x4c5f, 0x755b, 0x3248, 0x5759, 0x7559, 0x755a, 0x755c, 0x7562, 0x7560, 0x755f, 0x755d, 0x7561, 0x755e, 0x7564, 0x7565, 0x4c63, 0x653f, 0x3538, 0x7563, 0x7568, 0x4c23, 0x7566, 0x7567, 0x753e, 0x3144, 0x753f, 0x3545, 0x3264, 0x756c, 0x7569, 0x3657, 0x756d, 0x756a, 0x756b, 0x345a, 0x546a, 0x756e, 0x3379, 0x756f, 0x7571, 0x7570, 0x7572, 0x7573, 0x496d, 0x392a, 0x477b, 0x3663, 0x4c49, 0x6a26, 0x3335, 0x547e, 0x396c, 0x5079, 0x696d, 0x572a, 0x696e, 0x4256, 0x486d, 0x3a64, 0x696f, 0x6970, 0x6971, 0x5661, 0x6972, 0x6973, 0x6975, 0x6974, 0x6976, 0x6977, 0x4761, 0x6978, 0x5458, 0x6979, 0x3d4e, 0x697a, 0x697b, 0x3d4f, 0x697c, 0x3828, 0x413e, 0x697d, 0x3132, 0x3b54, 0x3975, 0x697e, 0x6a21, 0x6a22, 0x6a23, 0x3778, 0x3c2d, 0x4a64, 0x604e, 0x542f, 0x4f3d, 0x5537, 0x6a24, 0x555e, 0x6a25, 0x5041, 0x393c, 0x3447, 0x3159, 0x4031, 0x3166, 0x3167, 0x3168, 0x333d, 0x4868, 0x6541, 0x315f, 0x4149, 0x346f, 0x4728, 0x5358, 0x4679, 0x5138, 0x397d, 0x4275, 0x532d, 0x544b, 0x3d7c, 0x6542, 0x3735, 0x6543, 0x3b39, 0x5562, 0x3d78, 0x5436, 0x4e25, 0x412c, 0x3359, 0x4c76, 0x6546, 0x6544, 0x6548, 0x654a, 0x6547, 0x354f, 0x4648, 0x357c, 0x6545, 0x4a76, 0x6549, 0x4354, 0x3145, 0x3c23, 0x5737, 0x4d4b, 0x4b4d, 0x4a4a, 0x4c53, 0x654c, 0x654b, 0x4466, 0x5121, 0x5137, 0x654d, 0x6550, 0x4d38, 0x5670, 0x654f, 0x355d, 0x4d3e, 0x6551, 0x363a, 0x4d28, 0x3964, 0x4a45, 0x3351, 0x4b59, 0x546c, 0x6552, 0x376a, 0x654e, 0x6555, 0x347e, 0x6556, 0x6553, 0x6554, 0x525d, 0x425f, 0x3146, 0x5362, 0x365d, 0x4b6c, 0x6557, 0x5376, 0x3169, 0x3674, 0x655a, 0x6558, 0x6559, 0x3540, 0x5245, 0x655c, 0x655e, 0x655d, 0x4732, 0x5223, 0x655b, 0x5462, 0x555a, 0x6560, 0x5771, 0x6561, 0x315c, 0x517b, 0x6562, 0x6564, 0x6563, 0x6565, 0x5258, 0x354b, 0x675f, 0x5a75, 0x5a78, 0x5a76, 0x5a77, 0x5a7a, 0x504f, 0x4447, 0x306e, 0x5030, 0x5a79, 0x534a, 0x3a2a, 0x5b22, 0x4771, 0x5a7c, 0x5a7b, 0x495b, 0x5a7d, 0x5b21, 0x575e, 0x5a7e, 0x415a, 0x5b25, 0x5374, 0x5b27, 0x5b24, 0x5b28, 0x3d3c, 0x4049, 0x5b23, 0x5b26, 0x5623, 0x5b29, 0x5b2d, 0x5b2e, 0x5b2c, 0x3a42, 0x3f24, 0x5b2b, 0x5b2a, 0x5447, 0x323f, 0x5b2f, 0x3979, 0x5b30, 0x333b, 0x3526, 0x363c, 0x5b31, 0x3675, 0x5b32, 0x3149, 0x5b34, 0x5b33, 0x5b35, 0x5b37, 0x5b36, 0x5b38, 0x5b39, 0x5b3a, 0x534f, 0x747a, 0x4775, 0x5743, 0x4564, 0x747c, 0x747d, 0x747b, 0x3e46, 0x506f, 0x3753, 0x544d, 0x4c2a, 0x7522, 0x7521, 0x3a28, 0x747e, 0x4b56, 0x7524, 0x4052, 0x336a, 0x4d2a, 0x7525, 0x7523, 0x3d34, 0x7528, 0x7529, 0x3d4d, 0x4338, 0x3f61, 0x4b61, 0x752a, 0x7526, 0x7527, 0x4470, 0x752c, 0x343c, 0x576d, 0x3457, 0x752b, 0x752e, 0x752d, 0x752f, 0x5051, 0x4351, 0x4829, 0x7530, 0x7531, 0x7532, 0x7533, 0x7534, 0x7535, 0x7537, 0x7536, 0x7538, 0x3249, 0x5354, 0x4a4d, 0x406f, 0x5658, 0x5230, 0x413f, 0x3d70, 0x382a, 0x3c78, 0x7646, 0x7647, 0x7648, 0x7649, 0x764a, 0x764c, 0x764b, 0x7769, 0x764d, 0x764e, 0x6e44, 0x6e45, 0x6e46, 0x556b, 0x3624, 0x6e48, 0x6e47, 0x6e49, 0x6e4a, 0x4725, 0x6e4b, 0x6e4c, 0x3730, 0x3576, 0x6e4d, 0x6e4f, 0x6e4e, 0x3846, 0x6e50, 0x6e51, 0x6e52, 0x365b, 0x332e, 0x5653, 0x4446, 0x3135, 0x3856, 0x6e53, 0x6e54, 0x543f, 0x4755, 0x3e7b, 0x4e59, 0x3933, 0x6e56, 0x6e55, 0x6e58, 0x6e57, 0x4525, 0x6e59, 0x6e5a, 0x472e, 0x6e5b, 0x472f, 0x6e5c, 0x3227, 0x6e5d, 0x6e5e, 0x6e5f, 0x6e60, 0x6e61, 0x576a, 0x6e62, 0x6e63, 0x3c58, 0x6e64, 0x534b, 0x4c7a, 0x322c, 0x4165, 0x6e65, 0x4726, 0x432d, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6b, 0x6e6c, 0x6e6d, 0x6e6e, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e74, 0x6e73, 0x6e75, 0x4d2d, 0x4241, 0x6e76, 0x6e77, 0x6e78, 0x5521, 0x6e79, 0x4f33, 0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6f21, 0x6e7e, 0x6f22, 0x3875, 0x437a, 0x6f23, 0x6f24, 0x3d42, 0x523f, 0x3279, 0x6f25, 0x6f26, 0x6f27, 0x5278, 0x6f28, 0x567d, 0x6f29, 0x464c, 0x6f2a, 0x6f2b, 0x4134, 0x6f2c, 0x4f7a, 0x4b78, 0x6f2e, 0x6f2d, 0x337a, 0x3978, 0x6f2f, 0x6f30, 0x5062, 0x6f31, 0x6f32, 0x3766, 0x503f, 0x6f33, 0x6f34, 0x6f35, 0x4871, 0x4c60, 0x6f36, 0x6f37, 0x6f38, 0x6f39, 0x6f3a, 0x5560, 0x6f3b, 0x346d, 0x432a, 0x6f3c, 0x6f3d, 0x6f3e, 0x6f3f, 0x4e7d, 0x6f40, 0x4260, 0x3438, 0x5736, 0x3d75, 0x4f47, 0x6f43, 0x6f41, 0x6f42, 0x6f44, 0x3627, 0x3c7c, 0x3e62, 0x434c, 0x6f45, 0x6f46, 0x6f47, 0x6f4f, 0x6f48, 0x6f49, 0x6f4a, 0x4742, 0x6f71, 0x364d, 0x6f4b, 0x6f4c, 0x6f4d, 0x3646, 0x433e, 0x6f4e, 0x6f50, 0x6f51, 0x6f52, 0x5572, 0x6f53, 0x4477, 0x6f54, 0x4478, 0x6f55, 0x6f56, 0x3864, 0x3077, 0x6f57, 0x6f58, 0x6f59, 0x6f5a, 0x6f5b, 0x6f5c, 0x6f5d, 0x6f5e, 0x3e35, 0x6f61, 0x6f5f, 0x6f60, 0x6f62, 0x6f63, 0x414d, 0x6f64, 0x6f65, 0x6f66, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x4058, 0x6f6d, 0x412d, 0x6f6e, 0x6f6f, 0x6f70, 0x4f62, 0x3324, 0x4345, 0x6345, 0x4941, 0x6346, 0x3155, 0x4e4a, 0x3433, 0x4872, 0x6347, 0x4f50, 0x6348, 0x3c64, 0x6349, 0x634a, 0x4346, 0x5522, 0x4456, 0x396b, 0x4e45, 0x634b, 0x4376, 0x634c, 0x3727, 0x3873, 0x3a52, 0x634d, 0x634e, 0x5444, 0x634f, 0x6350, 0x514b, 0x6351, 0x6352, 0x6353, 0x6354, 0x5156, 0x6355, 0x327b, 0x403b, 0x6356, 0x402b, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x3837, 0x5a62, 0x3653, 0x5a64, 0x5a63, 0x5a66, 0x486e, 0x5a65, 0x3740, 0x5174, 0x5275, 0x5573, 0x3d57, 0x5768, 0x5a68, 0x5a67, 0x3022, 0x4d53, 0x5a69, 0x383d, 0x3c4a, 0x423d, 0x4224, 0x3342, 0x5a6a, 0x422a, 0x4430, 0x3d35, 0x4f5e, 0x5a6b, 0x4942, 0x315d, 0x5a6c, 0x3638, 0x543a, 0x337d, 0x5a6d, 0x5449, 0x4f55, 0x4563, 0x5a6e, 0x5a6f, 0x5a70, 0x416a, 0x4c55, 0x4f5d, 0x5367, 0x4221, 0x5a71, 0x4b65, 0x5a72, 0x4b66, 0x527e, 0x3874, 0x5a73, 0x302f, 0x4f36, 0x554f, 0x4b6d, 0x5a74, 0x6344, 0x4125, 0x763f, 0x7640, 0x7641, 0x4451, 0x4838, 0x5163, 0x505b, 0x5145, 0x3c2f, 0x394d, 0x6f74, 0x3446, 0x533a, 0x7642, 0x337b, 0x7643, 0x3571, 0x7645, 0x536a, 0x7627, 0x5129, 0x7629, 0x7628, 0x4163, 0x4057, 0x3122, 0x4e6d, 0x5068, 0x762b, 0x4f76, 0x762a, 0x5570, 0x762c, 0x4339, 0x3b74, 0x762e, 0x762d, 0x445e, 0x4158, 0x4b2a, 0x4f3c, 0x762f, 0x7630, 0x7631, 0x4236, 0x3054, 0x4579, 0x7632, 0x4760, 0x7626, 0x3e38, 0x3e32, 0x3565, 0x3747, 0x3f3f, 0x4352, 0x4366, 0x584c, 0x386f, 0x3d79, 0x5125, 0x3050, 0x7730, 0x7731, 0x502c, 0x3030, 0x7732, 0x7733, 0x7734, 0x474a, 0x3e4f, 0x7737, 0x7736, 0x315e, 0x7735, 0x7738, 0x7739, 0x4e24, 0x484d, 0x3a2b, 0x6838, 0x6839, 0x683a, 0x3e42, 0x5274, 0x544f, 0x4958, 0x5233, 0x3625, 0x476a, 0x717c, 0x4f6e, 0x4b33, 0x506b, 0x676f, 0x4d67, 0x394b, 0x3659, 0x717d, 0x3064, 0x4b4c, 0x717e, 0x5424, 0x422d, 0x416c, 0x4644, 0x3e31, 0x7221, 0x3c55, 0x7222, 0x7223, 0x7224, 0x5243, 0x4635, 0x4d47, 0x7225, 0x5331, 0x3f45, 0x4c62, 0x7226, 0x7227, 0x5155, 0x366e, 0x7228, 0x7229, 0x355f, 0x722a, 0x722b, 0x327c, 0x722c, 0x722d, 0x4827, 0x3767, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x462e, 0x6c2d, 0x6c2e, 0x3749, 0x4a33, 0x6238, 0x774f, 0x7750, 0x324d, 0x7751, 0x7753, 0x7752, 0x623b, 0x3c22, 0x623c, 0x623d, 0x623e, 0x623f, 0x6240, 0x6241, 0x3739, 0x527b, 0x3d24, 0x4a4e, 0x3125, 0x4b47, 0x6242, 0x367c, 0x4844, 0x6243, 0x3d48, 0x317d, 0x6244, 0x3676, 0x6245, 0x4459, 0x6246, 0x4f5a, 0x395d, 0x6247, 0x4021, 0x6248, 0x3276, 0x6249, 0x4173, 0x624a, 0x624b, 0x4278, 0x624c, 0x624d, 0x624e, 0x4a57, 0x5838, 0x5965, 0x4f63, 0x7025, 0x5c30, 0x426d, 0x5426, 0x4d54, 0x5131, 0x335b, 0x477d, 0x3235, 0x423f, 0x6660, 0x4a3b, 0x6661, 0x6662, 0x3e54, 0x6663, 0x5724, 0x4d55, 0x6665, 0x3c5d, 0x6664, 0x6666, 0x6667, 0x426e, 0x3d3e, 0x6668, 0x4266, 0x3a27, 0x6669, 0x666a, 0x3352, 0x5169, 0x3f25, 0x666b, 0x466f, 0x666c, 0x666d, 0x666e, 0x462d, 0x666f, 0x4927, 0x6670, 0x6671, 0x6672, 0x6539, 0x6673, 0x6674, 0x4262, 0x6675, 0x6676, 0x5668, 0x6677, 0x6678, 0x3947, 0x773b, 0x773a, 0x773e, 0x773c, 0x3a21, 0x773f, 0x7740, 0x7742, 0x7741, 0x7744, 0x7743, 0x7745, 0x7746, 0x7747, 0x4b68, 0x385f, 0x7754, 0x7755, 0x7756, 0x7758, 0x775a, 0x7757, 0x775b, 0x7759, 0x5757, 0x775c, 0x775d, 0x775e, 0x775f, 0x7760, 0x5b4b, 0x582a, 0x6577, 0x396d, 0x3f7d, 0x3b6a, 0x7749, 0x4647, 0x7748, 0x774a, 0x774c, 0x774b, 0x774d, 0x4e3a, 0x774e, 0x4427, 0x5363, 0x764f, 0x4233, 0x7650, 0x7651, 0x7652, 0x7653, 0x7654, 0x7656, 0x312b, 0x7657, 0x7658, 0x7659, 0x765a, 0x765b, 0x765c, 0x765d, 0x765e, 0x4f4a, 0x765f, 0x7660, 0x7661, 0x7662, 0x7663, 0x7664, 0x4070, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766b, 0x766c, 0x766d, 0x766e, 0x766f, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x3e28, 0x7675, 0x7676, 0x7677, 0x7678, 0x487a, 0x7679, 0x767a, 0x767b, 0x767c, 0x767d, 0x767e, 0x7721, 0x7722, 0x7723, 0x7724, 0x7725, 0x7726, 0x7727, 0x7728, 0x316e, 0x7729, 0x772a, 0x772b, 0x772c, 0x772d, 0x415b, 0x772e, 0x772f, 0x4471, 0x702f, 0x3c26, 0x7030, 0x4379, 0x4538, 0x513b, 0x7031, 0x7032, 0x7033, 0x7034, 0x7035, 0x513c, 0x516c, 0x7037, 0x7036, 0x5427, 0x4d52, 0x7038, 0x703a, 0x7039, 0x703b, 0x703c, 0x386b, 0x703d, 0x3a68, 0x703e, 0x703f, 0x3e69, 0x7040, 0x366c, 0x7041, 0x7042, 0x7043, 0x7044, 0x4835, 0x7045, 0x7046, 0x7047, 0x4574, 0x7048, 0x7049, 0x704a, 0x773d, 0x704b, 0x704c, 0x704d, 0x704e, 0x704f, 0x3a57, 0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7058, 0x5325, 0x7057, 0x7059, 0x753a, 0x4239, 0x7764, 0x7765, 0x7766, 0x7767, 0x7768, 0x4234, 0x776a, 0x776b, 0x4273, 0x7470, 0x746f, 0x4269, 0x7761, 0x7762, 0x3b46, 0x5964, 0x4a72, 0x4068, 0x7024, 0x3a5a, 0x472d, 0x442c, 0x776c, 0x776d, 0x776e, 0x7770, 0x776f, 0x7771, 0x7774, 0x7773, 0x7772, 0x7775, 0x7776, 0x6d69, 0x6d6a, 0x6d6b, 0x763c, 0x763d, 0x763e, 0x3626, 0x583e, 0x3944, 0x583b, 0x5c31, 0x4a73, 0x7777, 0x7778, 0x7779, 0x777b, 0x777a, 0x3147, 0x777c, 0x777d, 0x777e, 0x466b, 0x6c34, 0x335d, 0x7633, 0x7634, 0x4164, 0x7635, 0x7636, 0x7637, 0x7638, 0x7639, 0x763a, 0x4823, 0x763b, 0x417a, 0x3928, 0x6d68, 0x396a, 0x595f, 0x2321, 0x2322, 0x2323, 0x2167, 0x2325, 0x2326, 0x2327, 0x2328, 0x2329, 0x232a, 0x232b, 0x232c, 0x232d, 0x232e, 0x232f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x233a, 0x233b, 0x233c, 0x233d, 0x233e, 0x233f, 0x2340, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x235b, 0x235c, 0x235d, 0x235e, 0x235f, 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x237b, 0x237c, 0x237d, 0x212b, 0x2169, 0x216a, 0x237e, 0x2324, }; static const Summary16 gb2312_uni2indx_page00[70] = { /* 0x0000 */ { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0000 }, { 0, 0x0190 }, { 3, 0x0003 }, { 5, 0x0000 }, { 5, 0x0080 }, { 6, 0x3703 }, { 13, 0x168c }, /* 0x0100 */ { 19, 0x0002 }, { 20, 0x0808 }, { 22, 0x0800 }, { 23, 0x0000 }, { 23, 0x2000 }, { 24, 0x0000 }, { 24, 0x0800 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x0000 }, { 25, 0x4000 }, { 26, 0x1555 }, { 33, 0x0000 }, { 33, 0x0000 }, /* 0x0200 */ { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0000 }, { 33, 0x0280 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, /* 0x0300 */ { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0x0000 }, { 35, 0xfffe }, { 50, 0x03fb }, { 59, 0xfffe }, { 74, 0x03fb }, { 83, 0x0000 }, { 83, 0x0000 }, { 83, 0x0000 }, /* 0x0400 */ { 83, 0x0002 }, { 84, 0xffff }, { 100, 0xffff }, { 116, 0xffff }, { 132, 0xffff }, { 148, 0x0002 }, }; static const Summary16 gb2312_uni2indx_page20[101] = { /* 0x2000 */ { 149, 0x0000 }, { 149, 0x3360 }, { 155, 0x0040 }, { 156, 0x080d }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, { 160, 0x0000 }, /* 0x2100 */ { 160, 0x0008 }, { 161, 0x0040 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0000 }, { 162, 0x0fff }, { 174, 0x0000 }, { 174, 0x0000 }, { 174, 0x000f }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, { 178, 0x0000 }, /* 0x2200 */ { 178, 0x8100 }, { 180, 0x6402 }, { 184, 0x4fa1 }, { 192, 0x20f0 }, { 197, 0x1100 }, { 199, 0x0000 }, { 199, 0xc033 }, { 205, 0x0000 }, { 205, 0x0000 }, { 205, 0x0200 }, { 206, 0x0020 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, { 207, 0x0000 }, /* 0x2300 */ { 207, 0x0000 }, { 207, 0x0004 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, /* 0x2400 */ { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x0000 }, { 208, 0x03ff }, { 218, 0xfff0 }, { 230, 0xffff }, { 246, 0x0fff }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, { 258, 0x0000 }, /* 0x2500 */ { 258, 0xffff }, { 274, 0xffff }, { 290, 0xffff }, { 306, 0xffff }, { 322, 0x0fff }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0000 }, { 334, 0x0003 }, { 336, 0x000c }, { 338, 0xc8c0 }, { 343, 0x0000 }, { 343, 0x0000 }, { 343, 0x0000 }, /* 0x2600 */ { 343, 0x0060 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0000 }, { 345, 0x0005 }, }; static const Summary16 gb2312_uni2indx_page30[35] = { /* 0x3000 */ { 347, 0xff2f }, { 360, 0x00fb }, { 367, 0x0000 }, { 367, 0x0000 }, { 367, 0xfffe }, { 382, 0xffff }, { 398, 0xffff }, { 414, 0xffff }, { 430, 0xffff }, { 446, 0x000f }, { 450, 0xfffe }, { 465, 0xffff }, { 481, 0xffff }, { 497, 0xffff }, { 513, 0xffff }, { 529, 0x087f }, /* 0x3100 */ { 537, 0xffe0 }, { 548, 0xffff }, { 564, 0x03ff }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x0000 }, /* 0x3200 */ { 574, 0x0000 }, { 574, 0x0000 }, { 574, 0x03ff }, }; static const Summary16 gb2312_uni2indx_page4e[1263] = { /* 0x4e00 */ { 584, 0x7f8b }, { 595, 0x7f7b }, { 608, 0x3db4 }, { 617, 0xef55 }, { 628, 0xfba8 }, { 638, 0xf35d }, { 649, 0x0243 }, { 653, 0x400b }, { 657, 0xfb40 }, { 665, 0x8d3e }, { 674, 0x7bf7 }, { 687, 0x8c2c }, { 693, 0x6eff }, { 706, 0xe3fa }, { 717, 0x1d3a }, { 725, 0xa8ed }, /* 0x4f00 */ { 734, 0xe602 }, { 740, 0xcf83 }, { 749, 0x8cf5 }, { 758, 0x3555 }, { 766, 0xe048 }, { 771, 0xffab }, { 784, 0x92b9 }, { 792, 0xd859 }, { 800, 0xab18 }, { 807, 0x2892 }, { 812, 0xd7e9 }, { 823, 0x8020 }, { 825, 0xc438 }, { 831, 0xf583 }, { 840, 0xe74a }, { 849, 0x450a }, /* 0x5000 */ { 854, 0xb000 }, { 857, 0x9714 }, { 864, 0x7762 }, { 873, 0x5400 }, { 876, 0xd188 }, { 882, 0x1420 }, { 885, 0x1020 }, { 887, 0xc8c0 }, { 892, 0x2121 }, { 896, 0x0000 }, { 896, 0x13a8 }, { 902, 0x0c04 }, { 905, 0x8000 }, { 906, 0x0440 }, { 908, 0x70c0 }, { 913, 0x0828 }, /* 0x5100 */ { 916, 0x08c0 }, { 919, 0x0004 }, { 920, 0x0002 }, { 921, 0x8000 }, { 922, 0x2b7b }, { 932, 0x1472 }, { 938, 0x7924 }, { 945, 0x3bfb }, { 957, 0x3327 }, { 965, 0x1ae4 }, { 972, 0x9835 }, { 979, 0x38ef }, { 989, 0x9ad1 }, { 997, 0x2802 }, { 1000, 0xa813 }, { 1006, 0xbf69 }, /* 0x5200 */ { 1017, 0x65cf }, { 1027, 0x2fc6 }, { 1036, 0x6b11 }, { 1043, 0xafc9 }, { 1053, 0x340f }, { 1060, 0x5053 }, { 1066, 0x86a2 }, { 1072, 0xa004 }, { 1075, 0x0106 }, { 1078, 0xe809 }, { 1084, 0x3f0f }, { 1094, 0xc00e }, { 1099, 0x0a88 }, { 1103, 0x8145 }, { 1108, 0x0010 }, { 1109, 0xc601 }, /* 0x5300 */ { 1114, 0xa161 }, { 1120, 0x26e1 }, { 1127, 0x444b }, { 1133, 0xce00 }, { 1138, 0xc7aa }, { 1147, 0xd4ee }, { 1157, 0xcadf }, { 1168, 0x85bb }, { 1177, 0x3a74 }, { 1185, 0xa520 }, { 1190, 0x436c }, { 1197, 0x8840 }, { 1200, 0x3f06 }, { 1208, 0x8bd2 }, { 1216, 0xff79 }, { 1229, 0x3bef }, /* 0x5400 */ { 1241, 0xf75a }, { 1252, 0xe8ef }, { 1263, 0xfbcb }, { 1275, 0x5b36 }, { 1284, 0x0d49 }, { 1290, 0x1bfd }, { 1301, 0x0154 }, { 1305, 0x39ee }, { 1315, 0xd855 }, { 1323, 0x2e75 }, { 1332, 0xbfd8 }, { 1343, 0xa91a }, { 1350, 0xf3d7 }, { 1362, 0xf6bf }, { 1375, 0x67e0 }, { 1383, 0xb40c }, /* 0x5500 */ { 1389, 0x82c2 }, { 1394, 0x0813 }, { 1398, 0xd49d }, { 1407, 0xd08b }, { 1414, 0x065a }, { 1420, 0x1061 }, { 1424, 0x74f2 }, { 1433, 0x59e0 }, { 1440, 0x8f9f }, { 1451, 0xb312 }, { 1458, 0x0080 }, { 1459, 0x6aaa }, { 1467, 0x3230 }, { 1472, 0xb05e }, { 1480, 0x9d7a }, { 1490, 0x60ac }, /* 0x5600 */ { 1496, 0xd303 }, { 1503, 0xc900 }, { 1507, 0x3098 }, { 1512, 0x8a56 }, { 1519, 0x7000 }, { 1522, 0x1390 }, { 1527, 0x1f14 }, { 1534, 0x1842 }, { 1538, 0xc060 }, { 1542, 0x0008 }, { 1543, 0x8008 }, { 1545, 0x1080 }, { 1547, 0x0400 }, { 1548, 0xec90 }, { 1555, 0x2817 }, { 1561, 0xe633 }, /* 0x5700 */ { 1570, 0x0758 }, { 1576, 0x9000 }, { 1578, 0xf708 }, { 1586, 0x4e09 }, { 1592, 0xf485 }, { 1600, 0xfc83 }, { 1609, 0xaf53 }, { 1619, 0x18c8 }, { 1624, 0x187c }, { 1631, 0x080c }, { 1634, 0x6adf }, { 1645, 0x0114 }, { 1648, 0xc80c }, { 1653, 0xa734 }, { 1661, 0xa011 }, { 1665, 0x2710 }, /* 0x5800 */ { 1670, 0x28c5 }, { 1676, 0x4222 }, { 1680, 0x0413 }, { 1684, 0x0021 }, { 1686, 0x3010 }, { 1689, 0x4112 }, { 1693, 0x1820 }, { 1696, 0x4000 }, { 1697, 0x022b }, { 1702, 0xc60c }, { 1708, 0x0300 }, { 1710, 0x1000 }, { 1711, 0x0022 }, { 1713, 0x0022 }, { 1715, 0x5810 }, { 1719, 0x0249 }, /* 0x5900 */ { 1723, 0xa094 }, { 1728, 0x9670 }, { 1735, 0xeeb0 }, { 1744, 0x1792 }, { 1751, 0xcb96 }, { 1760, 0x05f2 }, { 1767, 0x0025 }, { 1770, 0x2358 }, { 1776, 0x25de }, { 1785, 0x42cc }, { 1791, 0xcf38 }, { 1800, 0x4a04 }, { 1804, 0x0c40 }, { 1807, 0x359f }, { 1817, 0x1128 }, { 1821, 0x8a00 }, /* 0x5a00 */ { 1824, 0x13fa }, { 1833, 0x910a }, { 1838, 0x0229 }, { 1842, 0x1056 }, { 1847, 0x0641 }, { 1851, 0x0420 }, { 1853, 0x0484 }, { 1856, 0x84f0 }, { 1862, 0x0000 }, { 1862, 0x0c04 }, { 1865, 0x0400 }, { 1866, 0x412c }, { 1871, 0x1206 }, { 1875, 0x1154 }, { 1880, 0x0a4b }, { 1886, 0x0002 }, /* 0x5b00 */ { 1887, 0x0200 }, { 1888, 0x00c0 }, { 1890, 0x0000 }, { 1890, 0x0094 }, { 1893, 0x0001 }, { 1894, 0xbfbb }, { 1907, 0x167c }, { 1915, 0x242b }, { 1921, 0x9bbb }, { 1932, 0x7fa8 }, { 1942, 0x0c7f }, { 1951, 0xe379 }, { 1961, 0x10f4 }, { 1967, 0xe00d }, { 1973, 0x4132 }, { 1978, 0x9f01 }, /* 0x5c00 */ { 1985, 0x8652 }, { 1991, 0x3572 }, { 1999, 0x10b4 }, { 2004, 0xff12 }, { 2014, 0xcf27 }, { 2024, 0x4223 }, { 2029, 0xc06b }, { 2036, 0x8602 }, { 2040, 0x3106 }, { 2045, 0x1fd3 }, { 2055, 0x3a0c }, { 2061, 0xa1aa }, { 2068, 0x0812 }, { 2071, 0x0204 }, { 2073, 0x2572 }, { 2080, 0x0801 }, /* 0x5d00 */ { 2082, 0x40cc }, { 2087, 0x4850 }, { 2091, 0x62d0 }, { 2097, 0x6010 }, { 2100, 0x1c80 }, { 2104, 0x2900 }, { 2107, 0x9a00 }, { 2111, 0x0010 }, { 2112, 0x0004 }, { 2113, 0x2200 }, { 2115, 0x0000 }, { 2115, 0x0080 }, { 2116, 0x2020 }, { 2118, 0x6800 }, { 2121, 0xcbe6 }, { 2131, 0x609e }, /* 0x5e00 */ { 2138, 0x916e }, { 2146, 0x3f73 }, { 2157, 0x60c0 }, { 2161, 0x3982 }, { 2167, 0x1034 }, { 2171, 0x4830 }, { 2175, 0x0006 }, { 2177, 0xbd5c }, { 2187, 0x8cd1 }, { 2194, 0xd6fb }, { 2206, 0x20e1 }, { 2211, 0x43e8 }, { 2218, 0x0600 }, { 2220, 0x084e }, { 2225, 0x0500 }, { 2227, 0xc4d0 }, /* 0x5f00 */ { 2233, 0x8d1f }, { 2242, 0x89aa }, { 2249, 0xa6e1 }, { 2257, 0x1602 }, { 2261, 0x0001 }, { 2262, 0x21ed }, { 2270, 0x3656 }, { 2278, 0x1a8b }, { 2285, 0x1fb7 }, { 2296, 0x13a5 }, { 2303, 0x6502 }, { 2308, 0x30a0 }, { 2312, 0xb278 }, { 2320, 0x23c7 }, { 2328, 0x6c93 }, { 2336, 0xe922 }, /* 0x6000 */ { 2343, 0xe47f }, { 2354, 0x3a74 }, { 2362, 0x8fe3 }, { 2372, 0x9820 }, { 2376, 0x280e }, { 2381, 0x2625 }, { 2387, 0xbf9c }, { 2398, 0xbf49 }, { 2408, 0x3218 }, { 2413, 0xac54 }, { 2420, 0xb949 }, { 2428, 0x1916 }, { 2434, 0x0c60 }, { 2438, 0xb522 }, { 2445, 0xfbc1 }, { 2455, 0x0659 }, /* 0x6100 */ { 2461, 0xe343 }, { 2469, 0x8420 }, { 2472, 0x08d9 }, { 2478, 0x8000 }, { 2479, 0x5500 }, { 2483, 0x2022 }, { 2486, 0x0184 }, { 2489, 0x00a1 }, { 2492, 0x4800 }, { 2494, 0x2010 }, { 2496, 0x1380 }, { 2500, 0x4080 }, { 2502, 0x0d04 }, { 2506, 0x0016 }, { 2509, 0x0040 }, { 2510, 0x8020 }, /* 0x6200 */ { 2512, 0xfd40 }, { 2520, 0x8de7 }, { 2530, 0x5436 }, { 2537, 0xe098 }, { 2543, 0x7b8b }, { 2553, 0x091e }, { 2559, 0xfec8 }, { 2569, 0xd249 }, { 2576, 0x0611 }, { 2580, 0x8dee }, { 2590, 0x1937 }, { 2598, 0xba22 }, { 2605, 0x77f4 }, { 2616, 0x9fdd }, { 2628, 0xf3ec }, { 2639, 0xf0da }, /* 0x6300 */ { 2648, 0x4386 }, { 2654, 0xec42 }, { 2661, 0x8d3f }, { 2671, 0x2604 }, { 2675, 0xfa6c }, { 2685, 0xc021 }, { 2689, 0x628e }, { 2696, 0x0cc2 }, { 2701, 0xd785 }, { 2710, 0x0145 }, { 2714, 0x77ad }, { 2725, 0x5599 }, { 2733, 0xe250 }, { 2739, 0x4045 }, { 2743, 0x260b }, { 2749, 0xa154 }, /* 0x6400 */ { 2755, 0x9827 }, { 2762, 0x5819 }, { 2768, 0x3443 }, { 2774, 0xa410 }, { 2778, 0x05f2 }, { 2785, 0x4114 }, { 2789, 0x2280 }, { 2792, 0x0700 }, { 2795, 0x00b4 }, { 2799, 0x4266 }, { 2805, 0x7210 }, { 2810, 0x15a1 }, { 2816, 0x6025 }, { 2821, 0x4185 }, { 2826, 0x0054 }, { 2829, 0x0000 }, /* 0x6500 */ { 2829, 0x0201 }, { 2831, 0x0104 }, { 2833, 0xc820 }, { 2837, 0xcb70 }, { 2845, 0x9320 }, { 2850, 0x6a62 }, { 2857, 0x184c }, { 2862, 0x0095 }, { 2866, 0x1880 }, { 2869, 0x9a8b }, { 2877, 0xaab2 }, { 2885, 0x3201 }, { 2889, 0xd87a }, { 2898, 0x00c4 }, { 2901, 0xf3e5 }, { 2912, 0x04c3 }, /* 0x6600 */ { 2917, 0xd44d }, { 2925, 0xa238 }, { 2931, 0xa1a1 }, { 2937, 0x5072 }, { 2943, 0x980a }, { 2948, 0x84fc }, { 2956, 0xc152 }, { 2962, 0x44d1 }, { 2968, 0x1094 }, { 2972, 0x20c2 }, { 2976, 0x4180 }, { 2979, 0x4210 }, { 2982, 0x0000 }, { 2982, 0x3a00 }, { 2986, 0x0240 }, { 2988, 0xd29d }, /* 0x6700 */ { 2997, 0x2f01 }, { 3003, 0xa8b1 }, { 3010, 0xbd40 }, { 3017, 0x2432 }, { 3022, 0xd34d }, { 3031, 0xd04b }, { 3038, 0xa723 }, { 3046, 0xd0ad }, { 3054, 0x0a92 }, { 3059, 0x75a1 }, { 3067, 0xadac }, { 3076, 0x01e9 }, { 3082, 0x801a }, { 3086, 0x771f }, { 3097, 0x9225 }, { 3103, 0xa01b }, /* 0x6800 */ { 3109, 0xdfa1 }, { 3119, 0x20ca }, { 3124, 0x0602 }, { 3127, 0x738c }, { 3135, 0x577f }, { 3147, 0x003b }, { 3152, 0x0bff }, { 3163, 0x00d0 }, { 3166, 0x806a }, { 3171, 0x0088 }, { 3173, 0xa1c4 }, { 3179, 0x0029 }, { 3182, 0x2a05 }, { 3187, 0x0524 }, { 3191, 0x4009 }, { 3194, 0x1623 }, /* 0x6900 */ { 3200, 0x6822 }, { 3205, 0x8005 }, { 3208, 0x2011 }, { 3211, 0xa211 }, { 3216, 0x0004 }, { 3217, 0x6490 }, { 3222, 0x4849 }, { 3227, 0x1382 }, { 3232, 0x23d5 }, { 3240, 0x1930 }, { 3245, 0x2980 }, { 3249, 0x0892 }, { 3253, 0x5402 }, { 3257, 0x8811 }, { 3261, 0x2001 }, { 3263, 0xa004 }, /* 0x6a00 */ { 3266, 0x0400 }, { 3267, 0x8180 }, { 3270, 0x8502 }, { 3274, 0x6022 }, { 3278, 0x0090 }, { 3280, 0x0b01 }, { 3284, 0x0022 }, { 3286, 0x1202 }, { 3289, 0x4011 }, { 3292, 0x0083 }, { 3295, 0x1a01 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, /* 0x6b00 */ { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x009f }, { 3305, 0x4684 }, { 3310, 0x12c8 }, { 3315, 0x0200 }, { 3316, 0x04fc }, { 3323, 0x1a00 }, { 3326, 0x2ede }, { 3336, 0x0c4c }, { 3341, 0x0402 }, { 3343, 0x80b8 }, { 3348, 0xa826 }, { 3354, 0x0afc }, { 3362, 0x8c02 }, { 3366, 0x2228 }, /* 0x6c00 */ { 3370, 0xa0e0 }, { 3375, 0x8f7b }, { 3386, 0xc7d6 }, { 3396, 0x2135 }, { 3402, 0x06c7 }, { 3409, 0xf8b1 }, { 3418, 0x0713 }, { 3424, 0x6255 }, { 3431, 0x936e }, { 3440, 0x8a19 }, { 3446, 0x6efa }, { 3457, 0xfb0e }, { 3467, 0x1630 }, { 3472, 0x48f9 }, { 3480, 0xcd2f }, { 3490, 0x7deb }, /* 0x6d00 */ { 3502, 0x5892 }, { 3508, 0x4e84 }, { 3514, 0x4ca0 }, { 3519, 0x7a2e }, { 3528, 0xedea }, { 3539, 0x561e }, { 3547, 0xc649 }, { 3554, 0x1190 }, { 3558, 0x5324 }, { 3564, 0xe83a }, { 3572, 0xcfdb }, { 3584, 0x8124 }, { 3588, 0x18f1 }, { 3595, 0x6342 }, { 3601, 0x5853 }, { 3608, 0x1a8a }, /* 0x6e00 */ { 3614, 0x7420 }, { 3619, 0x24d3 }, { 3626, 0xaa3b }, { 3635, 0x0514 }, { 3639, 0x6018 }, { 3643, 0x8958 }, { 3649, 0x4800 }, { 3651, 0xc000 }, { 3653, 0x8268 }, { 3658, 0x9101 }, { 3662, 0x84a4 }, { 3667, 0x2cd6 }, { 3675, 0x8886 }, { 3680, 0xc4ba }, { 3688, 0x0377 }, { 3696, 0x0210 }, /* 0x6f00 */ { 3698, 0x8244 }, { 3702, 0x0038 }, { 3705, 0xae11 }, { 3712, 0x404a }, { 3716, 0x28c0 }, { 3720, 0x5100 }, { 3723, 0x6044 }, { 3727, 0x1514 }, { 3732, 0x7310 }, { 3738, 0x1000 }, { 3739, 0x0082 }, { 3741, 0x0248 }, { 3744, 0x0205 }, { 3747, 0x4006 }, { 3750, 0xc003 }, { 3754, 0x0000 }, /* 0x7000 */ { 3754, 0x0000 }, { 3754, 0x0c02 }, { 3757, 0x0008 }, { 3758, 0x0220 }, { 3760, 0x9000 }, { 3762, 0x4000 }, { 3763, 0xb800 }, { 3767, 0xd161 }, { 3774, 0x4621 }, { 3779, 0x3274 }, { 3786, 0xf800 }, { 3791, 0x3b8a }, { 3799, 0x050f }, { 3805, 0x8b00 }, { 3809, 0xbbd0 }, { 3818, 0x2280 }, /* 0x7100 */ { 3821, 0x0600 }, { 3823, 0x0769 }, { 3830, 0x8040 }, { 3832, 0x0043 }, { 3835, 0x5420 }, { 3839, 0x5000 }, { 3841, 0x41d0 }, { 3846, 0x250c }, { 3851, 0x8410 }, { 3854, 0x8310 }, { 3858, 0x1101 }, { 3861, 0x0228 }, { 3864, 0x4008 }, { 3866, 0x0030 }, { 3868, 0x40a1 }, { 3872, 0x0200 }, /* 0x7200 */ { 3873, 0x0040 }, { 3874, 0x2000 }, { 3875, 0x1500 }, { 3878, 0xabe3 }, { 3888, 0x3180 }, { 3892, 0xaa44 }, { 3898, 0xc2c6 }, { 3905, 0xc624 }, { 3911, 0xac13 }, { 3918, 0x8004 }, { 3920, 0xb000 }, { 3923, 0x03d1 }, { 3929, 0x611e }, { 3936, 0x4285 }, { 3941, 0xf303 }, { 3949, 0x1d9f }, /* 0x7300 */ { 3959, 0x440a }, { 3963, 0x78e8 }, { 3971, 0x5e26 }, { 3979, 0xc392 }, { 3986, 0x2000 }, { 3987, 0x0085 }, { 3990, 0xb001 }, { 3994, 0x4000 }, { 3995, 0x4a90 }, { 4000, 0x8842 }, { 4004, 0xca04 }, { 4009, 0x0c8d }, { 4015, 0xa705 }, { 4022, 0x4203 }, { 4026, 0x22a1 }, { 4031, 0x0004 }, /* 0x7400 */ { 4032, 0x8668 }, { 4038, 0x0c01 }, { 4041, 0x5564 }, { 4048, 0x1079 }, { 4054, 0x0002 }, { 4055, 0xdea0 }, { 4063, 0x2000 }, { 4064, 0x40c1 }, { 4068, 0x488b }, { 4074, 0x5001 }, { 4077, 0x0380 }, { 4080, 0x0400 }, { 4081, 0x0000 }, { 4081, 0x5004 }, { 4084, 0xc05d }, { 4091, 0x80d0 }, /* 0x7500 */ { 4095, 0xa010 }, { 4098, 0x970a }, { 4105, 0xbb20 }, { 4112, 0x4daf }, { 4122, 0xd921 }, { 4129, 0x1e10 }, { 4134, 0x0460 }, { 4137, 0x8314 }, { 4142, 0x8848 }, { 4146, 0xa6d6 }, { 4155, 0xd83b }, { 4164, 0x733f }, { 4175, 0x27bc }, { 4184, 0x4974 }, { 4191, 0x0ddc }, { 4199, 0x9213 }, /* 0x7600 */ { 4205, 0x142b }, { 4211, 0x8ba1 }, { 4218, 0x2e75 }, { 4227, 0xd139 }, { 4235, 0x3009 }, { 4239, 0x5050 }, { 4243, 0x8808 }, { 4246, 0x6900 }, { 4250, 0x49d4 }, { 4257, 0x024a }, { 4261, 0x4010 }, { 4263, 0x8016 }, { 4267, 0xe564 }, { 4275, 0x89d7 }, { 4284, 0xc020 }, { 4287, 0x5316 }, /* 0x7700 */ { 4294, 0x2b92 }, { 4301, 0x8600 }, { 4304, 0xa345 }, { 4311, 0x15e0 }, { 4317, 0x008b }, { 4321, 0x0c03 }, { 4325, 0x196e }, { 4333, 0xe200 }, { 4337, 0x7031 }, { 4343, 0x8006 }, { 4346, 0x16a5 }, { 4353, 0xa829 }, { 4359, 0x2000 }, { 4360, 0x1880 }, { 4363, 0x7aac }, { 4372, 0xe148 }, /* 0x7800 */ { 4378, 0x3207 }, { 4384, 0xb5d6 }, { 4394, 0x32e8 }, { 4401, 0x5f91 }, { 4410, 0x50a1 }, { 4415, 0x20e5 }, { 4421, 0x7c00 }, { 4426, 0x1080 }, { 4428, 0x7280 }, { 4433, 0x9d8a }, { 4441, 0x00aa }, { 4445, 0x421f }, { 4452, 0x0e22 }, { 4457, 0x0231 }, { 4461, 0x1100 }, { 4463, 0x0494 }, /* 0x7900 */ { 4467, 0x0022 }, { 4469, 0x4008 }, { 4471, 0x0010 }, { 4472, 0x5c10 }, { 4477, 0x0343 }, { 4482, 0xfcc8 }, { 4491, 0xa1a5 }, { 4498, 0x0580 }, { 4501, 0x8433 }, { 4507, 0x0400 }, { 4508, 0x0080 }, { 4509, 0x6e08 }, { 4515, 0x2a4b }, { 4522, 0x8126 }, { 4527, 0xaad8 }, { 4535, 0x2901 }, /* 0x7a00 */ { 4539, 0x684d }, { 4546, 0x4490 }, { 4550, 0x0009 }, { 4552, 0xba88 }, { 4559, 0x0040 }, { 4560, 0x0082 }, { 4562, 0x0000 }, { 4562, 0x87d1 }, { 4570, 0x215b }, { 4577, 0xb1e6 }, { 4586, 0x3161 }, { 4592, 0x8008 }, { 4594, 0x0800 }, { 4595, 0xc240 }, { 4599, 0xa069 }, { 4605, 0xa600 }, /* 0x7b00 */ { 4609, 0x8d58 }, { 4616, 0x4a32 }, { 4622, 0x5d71 }, { 4631, 0x550a }, { 4637, 0x9aa0 }, { 4643, 0x2d57 }, { 4652, 0x4005 }, { 4655, 0x4aa6 }, { 4662, 0x2021 }, { 4665, 0x30b1 }, { 4671, 0x3fc6 }, { 4681, 0x0112 }, { 4684, 0x10c2 }, { 4688, 0x260a }, { 4693, 0x4462 }, { 4698, 0x5082 }, /* 0x7c00 */ { 4702, 0x9880 }, { 4706, 0x8040 }, { 4708, 0x04c0 }, { 4711, 0x8100 }, { 4713, 0x2003 }, { 4716, 0x0000 }, { 4716, 0x0000 }, { 4716, 0x3818 }, { 4721, 0x0200 }, { 4722, 0xf1a6 }, { 4731, 0x4434 }, { 4736, 0x720e }, { 4743, 0x35a2 }, { 4750, 0x92e0 }, { 4756, 0x8101 }, { 4759, 0x0900 }, /* 0x7d00 */ { 4761, 0x0400 }, { 4762, 0x0000 }, { 4762, 0x8885 }, { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x4000 }, { 4768, 0x0080 }, { 4769, 0x0000 }, { 4769, 0x0000 }, { 4769, 0x4040 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, /* 0x7e00 */ { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0800 }, { 4772, 0x0082 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0004 }, { 4775, 0x8800 }, { 4777, 0xbfff }, { 4792, 0xe7ef }, { 4805, 0xffff }, { 4821, 0xffbf }, { 4836, 0xefef }, { 4850, 0xfdff }, /* 0x7f00 */ { 4865, 0xfbff }, { 4880, 0xbffe }, { 4894, 0xffff }, { 4910, 0x057f }, { 4919, 0x0034 }, { 4922, 0x85b3 }, { 4930, 0x4706 }, { 4936, 0x4216 }, { 4941, 0x5402 }, { 4945, 0xe410 }, { 4950, 0x8092 }, { 4954, 0xb305 }, { 4961, 0x5422 }, { 4966, 0x8130 }, { 4970, 0x4263 }, { 4976, 0x180b }, /* 0x8000 */ { 4981, 0x387b }, { 4990, 0x13f5 }, { 4999, 0x07e5 }, { 5007, 0xa9ea }, { 5016, 0x3c4c }, { 5023, 0x0514 }, { 5027, 0x0600 }, { 5029, 0x8002 }, { 5031, 0x1ad9 }, { 5039, 0xbd48 }, { 5047, 0xee37 }, { 5058, 0xf496 }, { 5067, 0x705f }, { 5076, 0x7ec0 }, { 5084, 0xbfb2 }, { 5095, 0x355f }, /* 0x8100 */ { 5105, 0xe644 }, { 5112, 0x455f }, { 5121, 0x9000 }, { 5123, 0x4146 }, { 5128, 0x1d40 }, { 5133, 0x063b }, { 5140, 0x62a1 }, { 5146, 0xfe13 }, { 5156, 0x8505 }, { 5161, 0x3902 }, { 5166, 0x0548 }, { 5170, 0x0c08 }, { 5173, 0x144f }, { 5180, 0x0000 }, { 5180, 0x3488 }, { 5185, 0x5818 }, /* 0x8200 */ { 5190, 0x3077 }, { 5198, 0xd815 }, { 5205, 0xbd0e }, { 5214, 0x4bfb }, { 5225, 0x8a90 }, { 5230, 0x8500 }, { 5233, 0xc100 }, { 5236, 0xe61d }, { 5245, 0xed14 }, { 5253, 0xb386 }, { 5261, 0xff72 }, { 5273, 0x639b }, { 5282, 0xfd92 }, { 5292, 0xd9be }, { 5303, 0x887b }, { 5311, 0x0a92 }, /* 0x8300 */ { 5316, 0xd3fe }, { 5328, 0x1cb2 }, { 5335, 0xb980 }, { 5341, 0x177a }, { 5350, 0x82c9 }, { 5356, 0xdc17 }, { 5365, 0xfffb }, { 5380, 0x3980 }, { 5385, 0x4260 }, { 5389, 0x590c }, { 5395, 0x0f01 }, { 5400, 0x37df }, { 5412, 0x94a3 }, { 5419, 0xb150 }, { 5425, 0x0623 }, { 5430, 0x2307 }, /* 0x8400 */ { 5436, 0xf85a }, { 5445, 0x3102 }, { 5449, 0x01f0 }, { 5454, 0x3102 }, { 5458, 0x0040 }, { 5459, 0x1e82 }, { 5465, 0x3a0a }, { 5471, 0x056a }, { 5477, 0x5b84 }, { 5484, 0x1280 }, { 5487, 0x8002 }, { 5489, 0xa714 }, { 5496, 0x2612 }, { 5501, 0xa04b }, { 5507, 0x1069 }, { 5512, 0x9001 }, /* 0x8500 */ { 5515, 0x1000 }, { 5516, 0x848a }, { 5521, 0x1802 }, { 5524, 0x3f80 }, { 5531, 0x0708 }, { 5535, 0x4240 }, { 5538, 0x0110 }, { 5540, 0x4e14 }, { 5546, 0x80b0 }, { 5550, 0x1800 }, { 5552, 0xc510 }, { 5557, 0x0281 }, { 5560, 0x8202 }, { 5563, 0x1029 }, { 5567, 0x0210 }, { 5569, 0x8800 }, /* 0x8600 */ { 5571, 0x0020 }, { 5572, 0x0042 }, { 5574, 0x0280 }, { 5576, 0x1100 }, { 5578, 0xe000 }, { 5581, 0x4413 }, { 5586, 0x5804 }, { 5590, 0xfe02 }, { 5598, 0x3c07 }, { 5605, 0x3028 }, { 5609, 0x9798 }, { 5617, 0x0473 }, { 5623, 0xced1 }, { 5632, 0xcb13 }, { 5640, 0x6210 }, { 5644, 0x431f }, /* 0x8700 */ { 5652, 0x278d }, { 5660, 0x55ac }, { 5668, 0x422e }, { 5674, 0xc892 }, { 5680, 0x5380 }, { 5685, 0x0288 }, { 5688, 0x4039 }, { 5693, 0x7851 }, { 5700, 0x292c }, { 5706, 0x8088 }, { 5709, 0xb900 }, { 5714, 0x2428 }, { 5718, 0x0c41 }, { 5722, 0x080e }, { 5726, 0x4421 }, { 5730, 0x4200 }, /* 0x8800 */ { 5732, 0x0408 }, { 5734, 0x0868 }, { 5738, 0x0006 }, { 5740, 0x1204 }, { 5743, 0x3031 }, { 5748, 0x0290 }, { 5751, 0x5b3e }, { 5761, 0xe085 }, { 5767, 0x2936 }, { 5774, 0x1044 }, { 5777, 0x2814 }, { 5781, 0x1082 }, { 5784, 0x4266 }, { 5790, 0x8334 }, { 5796, 0x013c }, { 5801, 0x531b }, /* 0x8900 */ { 5809, 0x0404 }, { 5811, 0x0e0d }, { 5817, 0x0c22 }, { 5821, 0x0051 }, { 5824, 0x0012 }, { 5826, 0xc000 }, { 5828, 0x0040 }, { 5829, 0x8800 }, { 5831, 0x004a }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0xdff6 }, { 5847, 0x5447 }, { 5854, 0x8868 }, { 5859, 0x0008 }, /* 0x8a00 */ { 5860, 0x0081 }, { 5862, 0x0000 }, { 5862, 0x0000 }, { 5862, 0x4000 }, { 5863, 0x0100 }, { 5864, 0x0000 }, { 5864, 0x0000 }, { 5864, 0x0200 }, { 5865, 0x0600 }, { 5867, 0x0008 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, /* 0x8b00 */ { 5868, 0x0080 }, { 5869, 0x0000 }, { 5869, 0x0040 }, { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x1040 }, { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0xefff }, { 5887, 0xf7fd }, { 5901, 0xff7f }, { 5916, 0xfffe }, { 5931, 0xfbff }, { 5946, 0xffff }, /* 0x8c00 */ { 5962, 0xfdff }, { 5977, 0xbfff }, { 5992, 0xffff }, { 6008, 0x00ff }, { 6016, 0x12c2 }, { 6021, 0x0420 }, { 6023, 0x0c06 }, { 6027, 0x0708 }, { 6031, 0x1624 }, { 6036, 0x0110 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, /* 0x8d00 */ { 6038, 0x0000 }, { 6038, 0xe000 }, { 6041, 0xfffe }, { 6056, 0xffff }, { 6072, 0xffff }, { 6088, 0x7f79 }, { 6100, 0x28df }, { 6109, 0x00f9 }, { 6115, 0x0c32 }, { 6120, 0x8012 }, { 6123, 0x0008 }, { 6124, 0xd53a }, { 6133, 0xd858 }, { 6140, 0xecc2 }, { 6148, 0x9d18 }, { 6155, 0x2fa8 }, /* 0x8e00 */ { 6163, 0x9620 }, { 6168, 0xe010 }, { 6172, 0xd60c }, { 6179, 0x2622 }, { 6184, 0x0f97 }, { 6193, 0x0206 }, { 6196, 0xb240 }, { 6201, 0x9055 }, { 6207, 0x80a2 }, { 6211, 0x5011 }, { 6215, 0x9800 }, { 6218, 0x0404 }, { 6220, 0x4000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, /* 0x8f00 */ { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0xfbc0 }, { 6230, 0xffff }, { 6246, 0xeffe }, { 6260, 0xdffb }, { 6274, 0x0b08 }, { 6278, 0x6243 }, { 6284, 0x41b6 }, { 6291, 0xfb3b }, { 6303, 0x6f74 }, { 6313, 0x2389 }, /* 0x9000 */ { 6319, 0xae7f }, { 6331, 0xecd7 }, { 6342, 0xe047 }, { 6349, 0x5960 }, { 6355, 0xa096 }, { 6361, 0x098f }, { 6368, 0x612c }, { 6374, 0xa030 }, { 6378, 0x090d }, { 6383, 0x2aaa }, { 6390, 0xd44e }, { 6398, 0x4f7b }, { 6409, 0xc4b2 }, { 6416, 0x388b }, { 6423, 0xa9c6 }, { 6431, 0x6110 }, /* 0x9100 */ { 6435, 0x0014 }, { 6437, 0x4200 }, { 6439, 0x800c }, { 6442, 0x0202 }, { 6444, 0xfe48 }, { 6453, 0x6485 }, { 6459, 0xd63e }, { 6469, 0xe3f7 }, { 6481, 0x3aa0 }, { 6487, 0x0c07 }, { 6492, 0xe40c }, { 6498, 0x0430 }, { 6501, 0xf680 }, { 6508, 0x1002 }, { 6510, 0x0000 }, { 6510, 0x0000 }, /* 0x9200 */ { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0010 }, { 6511, 0x4000 }, { 6512, 0x0000 }, { 6512, 0x4000 }, { 6513, 0x0000 }, { 6513, 0x0100 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, /* 0x9300 */ { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x4000 }, { 6515, 0x0000 }, { 6515, 0x0000 }, { 6515, 0x0400 }, { 6516, 0x0000 }, { 6516, 0x8000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0400 }, { 6518, 0x0040 }, { 6519, 0x0000 }, { 6519, 0x0000 }, /* 0x9400 */ { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x4000 }, { 6520, 0x0000 }, { 6520, 0x0000 }, { 6520, 0x0800 }, { 6521, 0x0000 }, { 6521, 0xffe0 }, { 6532, 0xfebd }, { 6545, 0xffff }, { 6561, 0xffff }, { 6577, 0x7f7f }, { 6591, 0xfbe7 }, { 6604, 0xffbf }, { 6619, 0xf7ff }, /* 0x9500 */ { 6634, 0xffff }, { 6650, 0xefff }, { 6665, 0xff7e }, { 6679, 0xdff7 }, { 6693, 0xf6f7 }, { 6706, 0xfbdf }, { 6720, 0xbffe }, { 6734, 0x804f }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0xef00 }, { 6747, 0x7fff }, /* 0x9600 */ { 6762, 0xff7f }, { 6777, 0xb6f7 }, { 6789, 0x4406 }, { 6793, 0xb87e }, { 6803, 0x3bf5 }, { 6814, 0x8831 }, { 6819, 0x1796 }, { 6827, 0x00f4 }, { 6832, 0xa960 }, { 6838, 0x1391 }, { 6844, 0x0080 }, { 6845, 0x7249 }, { 6852, 0xf2f3 }, { 6863, 0x0024 }, { 6865, 0x8701 }, { 6870, 0x42c8 }, /* 0x9700 */ { 6875, 0xe3d3 }, { 6885, 0x5048 }, { 6889, 0x2400 }, { 6891, 0x4305 }, { 6896, 0x0000 }, { 6896, 0x4a4c }, { 6902, 0x0227 }, { 6907, 0x1058 }, { 6911, 0x2820 }, { 6914, 0x0116 }, { 6918, 0xa809 }, { 6923, 0x0014 }, { 6925, 0x0000 }, { 6925, 0x0000 }, { 6925, 0x3ec0 }, { 6932, 0x0068 }, /* 0x9800 */ { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0xffe0 }, { 6946, 0xb7ff }, { 6960, 0xfddb }, { 6973, 0x00f7 }, { 6980, 0x0000 }, { 6980, 0x4000 }, { 6981, 0xc72e }, { 6990, 0x0180 }, { 6992, 0x0000 }, /* 0x9900 */ { 6992, 0x2000 }, { 6993, 0x0001 }, { 6994, 0x4000 }, { 6995, 0x0000 }, { 6995, 0x0000 }, { 6995, 0x0030 }, { 6997, 0xffa8 }, { 7008, 0xb4f7 }, { 7019, 0xadf3 }, { 7030, 0x03ff }, { 7040, 0x0120 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, /* 0x9a00 */ { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0xf000 }, { 7046, 0xfffb }, { 7061, 0x9df7 }, { 7073, 0xfdcf }, { 7086, 0x01bf }, { 7094, 0x15c3 }, { 7101, 0x1827 }, { 7107, 0x810a }, { 7111, 0xa842 }, { 7116, 0x0a00 }, /* 0x9b00 */ { 7118, 0x8108 }, { 7121, 0x8008 }, { 7123, 0x8008 }, { 7125, 0x1804 }, { 7128, 0xa3be }, { 7138, 0x0012 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, /* 0x9c00 */ { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x9000 }, { 7142, 0x69e6 }, { 7151, 0xdc37 }, { 7161, 0x6bff }, { 7174, 0x3dff }, { 7187, 0xfcf8 }, { 7198, 0xf3f9 }, { 7210, 0x0004 }, }; static const Summary16 gb2312_uni2indx_page9e[27] = { /* 0x9e00 */ { 7211, 0x0000 }, { 7211, 0x8000 }, { 7212, 0xbf6f }, { 7225, 0xe7ee }, { 7237, 0xdffe }, { 7251, 0x5da2 }, { 7259, 0x3fd8 }, { 7269, 0xc00b }, { 7274, 0x0984 }, { 7278, 0xa00c }, { 7282, 0x0040 }, { 7283, 0x6910 }, { 7288, 0xe210 }, { 7293, 0xb912 }, { 7300, 0x86a5 }, { 7307, 0x5a00 }, /* 0x9f00 */ { 7311, 0x6800 }, { 7314, 0x0289 }, { 7318, 0x9005 }, { 7322, 0x6a80 }, { 7327, 0x0010 }, { 7328, 0x0003 }, { 7330, 0x0000 }, { 7330, 0x8000 }, { 7331, 0x1ff9 }, { 7342, 0x8e00 }, { 7346, 0x0001 }, }; static const Summary16 gb2312_uni2indx_pageff[15] = { /* 0xff00 */ { 7347, 0xfffe }, { 7362, 0xffff }, { 7378, 0xffff }, { 7394, 0xffff }, { 7410, 0xffff }, { 7426, 0x7fff }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x002b }, }; static int gb2312_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (n >= 2) { const Summary16 *summary = NULL; if (wc > 0x0000 && wc < 0x0460) summary = &gb2312_uni2indx_page00[(wc>>4)]; else if (wc >= 0x2000 && wc < 0x2650) summary = &gb2312_uni2indx_page20[(wc>>4)-0x200]; else if (wc >= 0x3000 && wc < 0x3230) summary = &gb2312_uni2indx_page30[(wc>>4)-0x300]; else if (wc >= 0x4e00 && wc < 0x9cf0) summary = &gb2312_uni2indx_page4e[(wc>>4)-0x4e0]; else if (wc >= 0x9e00 && wc < 0x9fb0) summary = &gb2312_uni2indx_page9e[(wc>>4)-0x9e0]; else if (wc >= 0xff00 && wc < 0xfff0) summary = &gb2312_uni2indx_pageff[(wc>>4)-0xff0]; if (summary) { unsigned short used = summary->used; unsigned int i = wc & 0x0f; if (used & ((unsigned short) 1 << i)) { unsigned short c; /* Keep in `used' only the bits 0..i-1. */ used &= ((unsigned short) 1 << i) - 1; /* Add `summary->indx' and the number of bits set in `used'. */ used = (used & 0x5555) + ((used & 0xaaaa) >> 1); used = (used & 0x3333) + ((used & 0xcccc) >> 2); used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4); used = (used & 0x00ff) + (used >> 8); c = gb2312_2charset[summary->indx + used]; r[0] = (c >> 8); r[1] = (c & 0xff); return 2; } } return RET_ILUNI; } return RET_TOOSMALL; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_6.h0000664000175000017500000000663014532252172016051 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-6 */ static const unsigned short iso8859_6_2uni[96] = { /* 0xa0 */ 0x00a0, 0xfffd, 0xfffd, 0xfffd, 0x00a4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x060c, 0x00ad, 0xfffd, 0xfffd, /* 0xb0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x061b, 0xfffd, 0xfffd, 0xfffd, 0x061f, /* 0xc0 */ 0xfffd, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0xd0 */ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xe0 */ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0xf0 */ 0x0650, 0x0651, 0x0652, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, }; static int iso8859_6_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0xa0) { *pwc = (ucs4_t) c; return 1; } else { unsigned short wc = iso8859_6_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } return RET_ILSEQ; } static const unsigned char iso8859_6_page00[16] = { 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */ }; static const unsigned char iso8859_6_page06[80] = { 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */ 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */ 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */ 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */ 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ }; static int iso8859_6_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00b0) c = iso8859_6_page00[wc-0x00a0]; else if (wc >= 0x0608 && wc < 0x0658) c = iso8859_6_page06[wc-0x0608]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_8.h0000664000175000017500000000754714532252172016063 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-8 */ static const unsigned short iso8859_8_2uni[96] = { /* 0xa0 */ 0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0xfffd, /* 0xc0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xd0 */ 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2017, /* 0xe0 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0xf0 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, }; static int iso8859_8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c >= 0xa0) { unsigned short wc = iso8859_8_2uni[c-0xa0]; if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 1; } } else { *pwc = (ucs4_t) c; return 1; } return RET_ILSEQ; } static const unsigned char iso8859_8_page00[88] = { 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ }; static const unsigned char iso8859_8_page05[32] = { 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ }; static const unsigned char iso8859_8_page20[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x10-0x17 */ }; static int iso8859_8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x00a0) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = iso8859_8_page00[wc-0x00a0]; else if (wc >= 0x05d0 && wc < 0x05f0) c = iso8859_8_page05[wc-0x05d0]; else if (wc >= 0x2008 && wc < 0x2018) c = iso8859_8_page20[wc-0x2008]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/koi8_ru.h0000664000175000017500000001623714532252172016060 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * KOI8-RU */ static const unsigned short koi8_ru_2uni[128] = { /* 0x80 */ 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, /* 0x90 */ 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, 0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7, /* 0xa0 */ 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x045e, 0x255e, /* 0xb0 */ 0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x040e, 0x00a9, /* 0xc0 */ 0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, 0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0xd0 */ 0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, 0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0xe0 */ 0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, 0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0xf0 */ 0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, 0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a, }; static int koi8_ru_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; if (c < 0x80) *pwc = (ucs4_t) c; else *pwc = (ucs4_t) koi8_ru_2uni[c-0x80]; return 1; } static const unsigned char koi8_ru_page00[88] = { 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ 0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */ 0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */ }; static const unsigned char koi8_ru_page04[152] = { 0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, /* 0x08-0x0f */ 0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */ 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */ 0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */ 0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */ 0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */ 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */ 0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */ 0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */ 0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ }; static const unsigned char koi8_ru_page22[80] = { 0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */ }; static const unsigned char koi8_ru_page23[8] = { 0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ }; static const unsigned char koi8_ru_page25[168] = { 0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */ 0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */ 0xa9, 0xaa, 0xab, 0xac, 0x00, 0x00, 0xaf, 0xb0, /* 0x58-0x5f */ 0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */ 0xba, 0xbb, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */ }; static int koi8_ru_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = koi8_ru_page00[wc-0x00a0]; else if (wc >= 0x0400 && wc < 0x0498) c = koi8_ru_page04[wc-0x0400]; else if (wc >= 0x2218 && wc < 0x2268) c = koi8_ru_page22[wc-0x2218]; else if (wc >= 0x2320 && wc < 0x2328) c = koi8_ru_page23[wc-0x2320]; else if (wc >= 0x2500 && wc < 0x25a8) c = koi8_ru_page25[wc-0x2500]; if (c != 0) { *r = c; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp1255.h0000664000175000017500000003175314532252172015417 00000000000000/* * Copyright (C) 1999-2001, 2004 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP1255 */ #include "flushwc.h" /* Combining characters used in Hebrew encoding CP1255. */ /* Relevant combining characters: 0x05b4, 0x05b7, 0x05b8, 0x05b9, 0x05bc, 0x05bf, 0x05c1, 0x05c2. */ /* Composition tables for each of the relevant combining characters. */ static const struct { unsigned short base; unsigned short composed; } cp1255_comp_table_data[] = { #define cp1255_comp_table05b4_idx 0 #define cp1255_comp_table05b4_len 1 { 0x05D9, 0xFB1D }, #define cp1255_comp_table05b7_idx (cp1255_comp_table05b4_idx+cp1255_comp_table05b4_len) #define cp1255_comp_table05b7_len 2 { 0x05D0, 0xFB2E }, { 0x05F2, 0xFB1F }, #define cp1255_comp_table05b8_idx (cp1255_comp_table05b7_idx+cp1255_comp_table05b7_len) #define cp1255_comp_table05b8_len 1 { 0x05D0, 0xFB2F }, #define cp1255_comp_table05b9_idx (cp1255_comp_table05b8_idx+cp1255_comp_table05b8_len) #define cp1255_comp_table05b9_len 1 { 0x05D5, 0xFB4B }, #define cp1255_comp_table05bc_idx (cp1255_comp_table05b9_idx+cp1255_comp_table05b9_len) #define cp1255_comp_table05bc_len 24 { 0x05D0, 0xFB30 }, { 0x05D1, 0xFB31 }, { 0x05D2, 0xFB32 }, { 0x05D3, 0xFB33 }, { 0x05D4, 0xFB34 }, { 0x05D5, 0xFB35 }, { 0x05D6, 0xFB36 }, { 0x05D8, 0xFB38 }, { 0x05D9, 0xFB39 }, { 0x05DA, 0xFB3A }, { 0x05DB, 0xFB3B }, { 0x05DC, 0xFB3C }, { 0x05DE, 0xFB3E }, { 0x05E0, 0xFB40 }, { 0x05E1, 0xFB41 }, { 0x05E3, 0xFB43 }, { 0x05E4, 0xFB44 }, { 0x05E6, 0xFB46 }, { 0x05E7, 0xFB47 }, { 0x05E8, 0xFB48 }, { 0x05E9, 0xFB49 }, { 0x05EA, 0xFB4A }, { 0xFB2A, 0xFB2C }, { 0xFB2B, 0xFB2D }, #define cp1255_comp_table05bf_idx (cp1255_comp_table05bc_idx+cp1255_comp_table05bc_len) #define cp1255_comp_table05bf_len 3 { 0x05D1, 0xFB4C }, { 0x05DB, 0xFB4D }, { 0x05E4, 0xFB4E }, #define cp1255_comp_table05c1_idx (cp1255_comp_table05bf_idx+cp1255_comp_table05bf_len) #define cp1255_comp_table05c1_len 2 { 0x05E9, 0xFB2A }, { 0xFB49, 0xFB2C }, #define cp1255_comp_table05c2_idx (cp1255_comp_table05c1_idx+cp1255_comp_table05c1_len) #define cp1255_comp_table05c2_len 2 { 0x05E9, 0xFB2B }, { 0xFB49, 0xFB2D }, }; static const struct { unsigned int len; unsigned int idx; } cp1255_comp_table[] = { { cp1255_comp_table05b4_len, cp1255_comp_table05b4_idx }, { cp1255_comp_table05b7_len, cp1255_comp_table05b7_idx }, { cp1255_comp_table05b8_len, cp1255_comp_table05b8_idx }, { cp1255_comp_table05b9_len, cp1255_comp_table05b9_idx }, { cp1255_comp_table05bc_len, cp1255_comp_table05bc_idx }, { cp1255_comp_table05bf_len, cp1255_comp_table05bf_idx }, { cp1255_comp_table05c1_len, cp1255_comp_table05c1_idx }, { cp1255_comp_table05c2_len, cp1255_comp_table05c2_idx }, }; /* Decomposition table for the relevant Unicode characters. */ struct cp1255_decomp { unsigned short composed; unsigned short base; int comb1 : 8; signed int comb2 : 8; }; static const struct cp1255_decomp cp1255_decomp_table[] = { { 0xFB1D, 0x05D9, 0, -1 }, { 0xFB1F, 0x05F2, 1, -1 }, { 0xFB2A, 0x05E9, 6, -1 }, { 0xFB2B, 0x05E9, 7, -1 }, { 0xFB2C, 0x05E9, 4, 6 }, { 0xFB2D, 0x05E9, 4, 7 }, { 0xFB2E, 0x05D0, 1, -1 }, { 0xFB2F, 0x05D0, 2, -1 }, { 0xFB30, 0x05D0, 4, -1 }, { 0xFB31, 0x05D1, 4, -1 }, { 0xFB32, 0x05D2, 4, -1 }, { 0xFB33, 0x05D3, 4, -1 }, { 0xFB34, 0x05D4, 4, -1 }, { 0xFB35, 0x05D5, 4, -1 }, { 0xFB36, 0x05D6, 4, -1 }, { 0xFB38, 0x05D8, 4, -1 }, { 0xFB39, 0x05D9, 4, -1 }, { 0xFB3A, 0x05DA, 4, -1 }, { 0xFB3B, 0x05DB, 4, -1 }, { 0xFB3C, 0x05DC, 4, -1 }, { 0xFB3E, 0x05DE, 4, -1 }, { 0xFB40, 0x05E0, 4, -1 }, { 0xFB41, 0x05E1, 4, -1 }, { 0xFB43, 0x05E3, 4, -1 }, { 0xFB44, 0x05E4, 4, -1 }, { 0xFB46, 0x05E6, 4, -1 }, { 0xFB47, 0x05E7, 4, -1 }, { 0xFB48, 0x05E8, 4, -1 }, { 0xFB49, 0x05E9, 4, -1 }, { 0xFB4A, 0x05EA, 4, -1 }, { 0xFB4B, 0x05D5, 3, -1 }, { 0xFB4C, 0x05D1, 5, -1 }, { 0xFB4D, 0x05DB, 5, -1 }, { 0xFB4E, 0x05E4, 5, -1 }, }; static const unsigned char cp1255_comb_table[] = { 0xc4, 0xc7, 0xc8, 0xc9, 0xcc, 0xcf, 0xd1, 0xd2, }; static const unsigned short cp1255_2uni[128] = { /* 0x80 */ 0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0x90 */ 0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa0 */ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, /* 0xb0 */ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, /* 0xc0 */ 0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7, 0x05b8, 0x05b9, 0xfffd, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf, /* 0xd0 */ 0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3, 0x05f4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xe0 */ 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0xf0 */ 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd, }; /* In the CP1255 to Unicode direction, the state contains a buffered character, or 0 if none. */ static int cp1255_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; unsigned short wc; unsigned short last_wc; if (c < 0x80) { wc = c; } else { wc = cp1255_2uni[c-0x80]; if (wc == 0xfffd) return RET_ILSEQ; } last_wc = conv->istate; if (last_wc) { if (wc >= 0x05b0 && wc < 0x05c5) { /* See whether last_wc and wc can be combined. */ unsigned int k; unsigned int i1, i2; switch (wc) { case 0x05b4: k = 0; break; case 0x05b7: k = 1; break; case 0x05b8: k = 2; break; case 0x05b9: k = 3; break; case 0x05bc: k = 4; break; case 0x05bf: k = 5; break; case 0x05c1: k = 6; break; case 0x05c2: k = 7; break; default: goto not_combining; } i1 = cp1255_comp_table[k].idx; i2 = i1 + cp1255_comp_table[k].len-1; if (last_wc >= cp1255_comp_table_data[i1].base && last_wc <= cp1255_comp_table_data[i2].base) { unsigned int i; for (;;) { i = (i1+i2)>>1; if (last_wc == cp1255_comp_table_data[i].base) break; if (last_wc < cp1255_comp_table_data[i].base) { if (i1 == i) goto not_combining; i2 = i; } else { if (i1 != i) i1 = i; else { i = i2; if (last_wc == cp1255_comp_table_data[i].base) break; goto not_combining; } } } last_wc = cp1255_comp_table_data[i].composed; if (last_wc == 0xfb2a || last_wc == 0xfb2b || last_wc == 0xfb49) { /* Buffer the combined character. */ conv->istate = last_wc; return RET_TOOFEW(1); } else { /* Output the combined character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 1; } } } not_combining: /* Output the buffered character. */ conv->istate = 0; *pwc = (ucs4_t) last_wc; return 0; /* Don't advance the input pointer. */ } if ((wc >= 0x05d0 && wc <= 0x05ea && ((0x07db5f7f >> (wc - 0x05d0)) & 1)) || wc == 0x05f2) { /* wc is a possible match in cp1255_comp_table_data. Buffer it. */ conv->istate = wc; return RET_TOOFEW(1); } else { /* Output wc immediately. */ *pwc = (ucs4_t) wc; return 1; } } #define cp1255_flushwc normal_flushwc static const unsigned char cp1255_page00[88] = { 0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */ }; static const unsigned char cp1255_page02[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ }; static const unsigned char cp1255_page05[72] = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xb0-0xb7 */ 0xc8, 0xc9, 0x00, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xb8-0xbf */ 0xd0, 0xd1, 0xd2, 0xd3, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */ 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ }; static const unsigned char cp1255_page20[56] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */ 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ }; static int cp1255_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { unsigned char c = 0; if (wc < 0x0080) { *r = wc; return 1; } else if (wc >= 0x00a0 && wc < 0x00f8) c = cp1255_page00[wc-0x00a0]; else if (wc == 0x0192) c = 0x83; else if (wc >= 0x02c0 && wc < 0x02e0) c = cp1255_page02[wc-0x02c0]; else if (wc >= 0x05b0 && wc < 0x05f8) c = cp1255_page05[wc-0x05b0]; else if (wc >= 0x2008 && wc < 0x2040) c = cp1255_page20[wc-0x2008]; else if (wc == 0x20aa) c = 0xa4; else if (wc == 0x20ac) c = 0x80; else if (wc == 0x2122) c = 0x99; if (c != 0) { *r = c; return 1; } /* Try canonical decomposition. */ { /* Binary search through cp1255_decomp_table. */ unsigned int i1 = 0; unsigned int i2 = sizeof(cp1255_decomp_table)/sizeof(cp1255_decomp_table[0])-1; if (wc >= cp1255_decomp_table[i1].composed && wc <= cp1255_decomp_table[i2].composed) { unsigned int i; for (;;) { /* Here i2 - i1 > 0. */ i = (i1+i2)>>1; if (wc == cp1255_decomp_table[i].composed) break; if (wc < cp1255_decomp_table[i].composed) { if (i1 == i) return RET_ILUNI; /* Here i1 < i < i2. */ i2 = i; } else { /* Here i1 <= i < i2. */ if (i1 != i) i1 = i; else { /* Here i2 - i1 = 1. */ i = i2; if (wc == cp1255_decomp_table[i].composed) break; else return RET_ILUNI; } } } /* Found a canonical decomposition. */ wc = cp1255_decomp_table[i].base; /* wc is one of 0x05d0..0x05d6, 0x05d8..0x05dc, 0x05de, 0x05e0..0x05e1, 0x05e3..0x05e4, 0x05e6..0x05ea, 0x05f2. */ c = cp1255_page05[wc-0x05b0]; if (cp1255_decomp_table[i].comb2 < 0) { if (n < 2) return RET_TOOSMALL; r[0] = c; r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; return 2; } else { if (n < 3) return RET_TOOSMALL; r[0] = c; r[1] = cp1255_comb_table[cp1255_decomp_table[i].comb1]; r[2] = cp1255_comb_table[cp1255_decomp_table[i].comb2]; return 3; } } } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/iso8859_1.h0000664000175000017500000000234214532252172016040 00000000000000/* * Copyright (C) 1999-2001 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * ISO-8859-1 */ static int iso8859_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c = *s; *pwc = (ucs4_t) c; return 1; } static int iso8859_1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { if (wc < 0x0100) { *r = wc; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/cp936.h0000664000175000017500000000702214532252172015334 00000000000000/* * Copyright (C) 2005 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * CP936 */ /* * The IANA has CP936 as an alias of GBK. But GBK is an official Chinese * specification, whereas CP936 is de-facto maintained by Microsoft. And, * of course, Microsoft modified CP936 since 1999. * * The differences from GBK are: * * 1. A single character: * * code CP936.TXT * 0x80 0x20AC # EURO SIGN * * Some variants of CP936 (in JDK, Windows-2000, ICU) also add: * * 2. Private area mappings: * * code Unicode * 0x{A1..A2}{40..7E,80..A0} U+E4C6..U+E585 * 0x{AA..AF,F8..FE}{A1..FE} U+E000..U+E4C5 * * We add them too because, although there are backward compatibility problems * when a character from a private area is moved to an official Unicode code * point, they are useful for some people in practice. */ static int cp936_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { /* Try GBK first. */ { int ret = ces_gbk_mbtowc(conv,pwc,s,n); if (ret != RET_ILSEQ) return ret; } /* Then handle the additional mappings. */ { unsigned char c = *s; if (c == 0x80) { *pwc = 0x20ac; return 1; } /* User-defined characters */ if (c >= 0xa1 && c <= 0xa2) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { *pwc = 0xe4c6 + 96 * (c - 0xa1) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); return 2; } } } else if ((c >= 0xaa && c < 0xb0) || (c >= 0xf8 && c < 0xff)) { if (n < 2) return RET_TOOFEW(0); { unsigned char c2 = s[1]; if (c2 >= 0xa1 && c2 < 0xff) { *pwc = 0xe000 + 94 * (c - (c >= 0xf8 ? 0xf2 : 0xaa)) + (c2 - 0xa1); return 2; } } } } return RET_ILSEQ; } static int cp936_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) { /* Try GBK first. */ { int ret = ces_gbk_wctomb(conv,r,wc,n); if (ret != RET_ILUNI) return ret; } /* Then handle the additional mappings. */ if (wc >= 0xe000 && wc < 0xe586) { /* User-defined characters */ if (n < 2) return RET_TOOFEW(0); if (wc < 0xe4c6) { unsigned int i = wc - 0xe000; unsigned int c1 = i / 94; unsigned int c2 = i % 94; r[0] = c1 + (c1 < 6 ? 0xaa : 0xf2); r[1] = c2 + 0xa1; return 2; } else { unsigned int i = wc - 0xe4c6; unsigned int c1 = i / 96; unsigned int c2 = i % 96; r[0] = c1 + 0xa1; r[1] = c2 + (c2 < 0x3f ? 0x40 : 0x41); return 2; } } else if (wc == 0x20ac) { r[0] = 0x80; return 1; } return RET_ILUNI; } fldigi-4.2.05/src/libtiniconv/encdec/gbkext2.h0000664000175000017500000021261414532252172016043 00000000000000/* * Copyright (C) 1999-2000 Free Software Foundation, Inc. * This file is part of the GNU LIBICONV Library. * * The GNU LIBICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * The GNU LIBICONV Library is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with the GNU LIBICONV Library; see the file COPYING.LIB. * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, * Fifth Floor, Boston, MA 02110-1301, USA. */ /* * GBK/4 and GBK/5 extensions */ static const unsigned short gbkext2_2uni_pagea8[8272] = { /* 0xa8 */ 0x02ca, 0x02cb, 0x02d9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221f, 0x2223, 0x2252, 0x2266, 0x2267, 0x22bf, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x2589, 0x258a, 0x258b, 0x258c, 0x258d, 0x258e, 0x258f, 0x2593, 0x2594, 0x2595, 0x25bc, 0x25bd, 0x25e2, 0x25e3, 0x25e4, 0x25e5, 0x2609, 0x2295, 0x3012, 0x301d, 0x301e, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xa9 */ 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028, 0x3029, 0x32a3, 0x338e, 0x338f, 0x339c, 0x339d, 0x339e, 0x33a1, 0x33c4, 0x33ce, 0x33d1, 0x33d2, 0x33d5, 0xfe30, 0xffe2, 0xffe4, 0xfffd, 0x2121, 0x3231, 0xfffd, 0x2010, 0xfffd, 0xfffd, 0xfffd, 0x30fc, 0x309b, 0x309c, 0x30fd, 0x30fe, 0x3006, 0x309d, 0x309e, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xfe50, 0xfe51, 0xfe52, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0xfe5f, 0xfe60, 0xfe61, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0xfe68, 0xfe69, 0xfe6a, 0xfe6b, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3007, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, /* 0xaa */ 0x72dc, 0x72dd, 0x72df, 0x72e2, 0x72e3, 0x72e4, 0x72e5, 0x72e6, 0x72e7, 0x72ea, 0x72eb, 0x72f5, 0x72f6, 0x72f9, 0x72fd, 0x72fe, 0x72ff, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309, 0x730b, 0x730c, 0x730d, 0x730f, 0x7310, 0x7311, 0x7312, 0x7314, 0x7318, 0x7319, 0x731a, 0x731f, 0x7320, 0x7323, 0x7324, 0x7326, 0x7327, 0x7328, 0x732d, 0x732f, 0x7330, 0x7332, 0x7333, 0x7335, 0x7336, 0x733a, 0x733b, 0x733c, 0x733d, 0x7340, 0x7341, 0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0x7349, 0x734a, 0x734b, 0x734c, 0x734e, 0x734f, 0x7351, 0x7353, 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735a, 0x735b, 0x735c, 0x735d, 0x735e, 0x735f, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x7369, 0x736a, 0x736b, 0x736e, 0x7370, 0x7371, /* 0xab */ 0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379, 0x737a, 0x737b, 0x737c, 0x737d, 0x737f, 0x7380, 0x7381, 0x7382, 0x7383, 0x7385, 0x7386, 0x7388, 0x738a, 0x738c, 0x738d, 0x738f, 0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739a, 0x739c, 0x739d, 0x739e, 0x73a0, 0x73a1, 0x73a3, 0x73a4, 0x73a5, 0x73a6, 0x73a7, 0x73a8, 0x73aa, 0x73ac, 0x73ad, 0x73b1, 0x73b4, 0x73b5, 0x73b6, 0x73b8, 0x73b9, 0x73bc, 0x73bd, 0x73be, 0x73bf, 0x73c1, 0x73c3, 0x73c4, 0x73c5, 0x73c6, 0x73c7, 0x73cb, 0x73cc, 0x73ce, 0x73d2, 0x73d3, 0x73d4, 0x73d5, 0x73d6, 0x73d7, 0x73d8, 0x73da, 0x73db, 0x73dc, 0x73dd, 0x73df, 0x73e1, 0x73e2, 0x73e3, 0x73e4, 0x73e6, 0x73e8, 0x73ea, 0x73eb, 0x73ec, 0x73ee, 0x73ef, 0x73f0, 0x73f1, 0x73f3, 0x73f4, 0x73f5, 0x73f6, 0x73f7, /* 0xac */ 0x73f8, 0x73f9, 0x73fa, 0x73fb, 0x73fc, 0x73fd, 0x73fe, 0x73ff, 0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740b, 0x740c, 0x740d, 0x740e, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419, 0x741c, 0x741d, 0x741e, 0x741f, 0x7420, 0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742b, 0x742d, 0x742f, 0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743a, 0x743b, 0x743d, 0x743e, 0x743f, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744a, 0x744b, 0x744c, 0x744d, 0x744e, 0x744f, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, 0x7458, 0x745d, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, 0x7466, 0x7467, 0x7468, 0x7469, 0x746a, 0x746b, 0x746c, 0x746e, 0x746f, 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747a, /* 0xad */ 0x747b, 0x747c, 0x747d, 0x747f, 0x7482, 0x7484, 0x7485, 0x7486, 0x7488, 0x7489, 0x748a, 0x748c, 0x748d, 0x748f, 0x7491, 0x7492, 0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749a, 0x749b, 0x749d, 0x749f, 0x74a0, 0x74a1, 0x74a2, 0x74a3, 0x74a4, 0x74a5, 0x74a6, 0x74aa, 0x74ab, 0x74ac, 0x74ad, 0x74ae, 0x74af, 0x74b0, 0x74b1, 0x74b2, 0x74b3, 0x74b4, 0x74b5, 0x74b6, 0x74b7, 0x74b8, 0x74b9, 0x74bb, 0x74bc, 0x74bd, 0x74be, 0x74bf, 0x74c0, 0x74c1, 0x74c2, 0x74c3, 0x74c4, 0x74c5, 0x74c6, 0x74c7, 0x74c8, 0x74c9, 0x74ca, 0x74cb, 0x74cc, 0x74cd, 0x74ce, 0x74cf, 0x74d0, 0x74d1, 0x74d3, 0x74d4, 0x74d5, 0x74d6, 0x74d7, 0x74d8, 0x74d9, 0x74da, 0x74db, 0x74dd, 0x74df, 0x74e1, 0x74e5, 0x74e7, 0x74e8, 0x74e9, 0x74ea, 0x74eb, 0x74ec, 0x74ed, 0x74f0, 0x74f1, 0x74f2, /* 0xae */ 0x74f3, 0x74f5, 0x74f8, 0x74f9, 0x74fa, 0x74fb, 0x74fc, 0x74fd, 0x74fe, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508, 0x7509, 0x750a, 0x750b, 0x750c, 0x750e, 0x7510, 0x7512, 0x7514, 0x7515, 0x7516, 0x7517, 0x751b, 0x751d, 0x751e, 0x7520, 0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752a, 0x752e, 0x7534, 0x7536, 0x7539, 0x753c, 0x753d, 0x753f, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754a, 0x754d, 0x7550, 0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0x755d, 0x755e, 0x755f, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567, 0x7568, 0x7569, 0x756b, 0x756c, 0x756d, 0x756e, 0x756f, 0x7570, 0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757a, 0x757b, 0x757c, 0x757d, 0x757e, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587, /* 0xaf */ 0x7588, 0x7589, 0x758a, 0x758c, 0x758d, 0x758e, 0x7590, 0x7593, 0x7595, 0x7598, 0x759b, 0x759c, 0x759e, 0x75a2, 0x75a6, 0x75a7, 0x75a8, 0x75a9, 0x75aa, 0x75ad, 0x75b6, 0x75b7, 0x75ba, 0x75bb, 0x75bf, 0x75c0, 0x75c1, 0x75c6, 0x75cb, 0x75cc, 0x75ce, 0x75cf, 0x75d0, 0x75d1, 0x75d3, 0x75d7, 0x75d9, 0x75da, 0x75dc, 0x75dd, 0x75df, 0x75e0, 0x75e1, 0x75e5, 0x75e9, 0x75ec, 0x75ed, 0x75ee, 0x75ef, 0x75f2, 0x75f3, 0x75f5, 0x75f6, 0x75f7, 0x75f8, 0x75fa, 0x75fb, 0x75fd, 0x75fe, 0x7602, 0x7604, 0x7606, 0x7607, 0x7608, 0x7609, 0x760b, 0x760d, 0x760e, 0x760f, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761a, 0x761c, 0x761d, 0x761e, 0x7621, 0x7623, 0x7627, 0x7628, 0x762c, 0x762e, 0x762f, 0x7631, 0x7632, 0x7636, 0x7637, 0x7639, 0x763a, 0x763b, 0x763d, 0x7641, 0x7642, 0x7644, /* 0xb0 */ 0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764a, 0x764b, 0x764e, 0x764f, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658, 0x7659, 0x765a, 0x765b, 0x765d, 0x765f, 0x7660, 0x7661, 0x7662, 0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766c, 0x766d, 0x766e, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675, 0x7676, 0x7677, 0x7679, 0x767a, 0x767c, 0x767f, 0x7680, 0x7681, 0x7683, 0x7685, 0x7689, 0x768a, 0x768c, 0x768d, 0x768f, 0x7690, 0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769a, 0x769b, 0x769c, 0x769d, 0x769e, 0x769f, 0x76a0, 0x76a1, 0x76a2, 0x76a3, 0x76a5, 0x76a6, 0x76a7, 0x76a8, 0x76a9, 0x76aa, 0x76ab, 0x76ac, 0x76ad, 0x76af, 0x76b0, 0x76b3, 0x76b5, 0x76b6, 0x76b7, 0x76b8, 0x76b9, 0x76ba, 0x76bb, 0x76bc, 0x76bd, 0x76be, 0x76c0, 0x76c1, 0x76c3, /* 0xb1 */ 0x76c4, 0x76c7, 0x76c9, 0x76cb, 0x76cc, 0x76d3, 0x76d5, 0x76d9, 0x76da, 0x76dc, 0x76dd, 0x76de, 0x76e0, 0x76e1, 0x76e2, 0x76e3, 0x76e4, 0x76e6, 0x76e7, 0x76e8, 0x76e9, 0x76ea, 0x76eb, 0x76ec, 0x76ed, 0x76f0, 0x76f3, 0x76f5, 0x76f6, 0x76f7, 0x76fa, 0x76fb, 0x76fd, 0x76ff, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770a, 0x770c, 0x770e, 0x770f, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716, 0x7717, 0x7718, 0x771b, 0x771c, 0x771d, 0x771e, 0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772a, 0x772b, 0x772c, 0x772e, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773b, 0x773d, 0x773e, 0x773f, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, 0x774a, 0x774b, 0x774c, 0x774d, 0x774e, 0x774f, 0x7752, 0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775c, /* 0xb2 */ 0x775d, 0x775e, 0x775f, 0x7760, 0x7764, 0x7767, 0x7769, 0x776a, 0x776d, 0x776e, 0x776f, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778, 0x777a, 0x777b, 0x777c, 0x7781, 0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778a, 0x778b, 0x778f, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798, 0x7799, 0x779a, 0x779b, 0x779c, 0x779d, 0x779e, 0x77a1, 0x77a3, 0x77a4, 0x77a6, 0x77a8, 0x77ab, 0x77ad, 0x77ae, 0x77af, 0x77b1, 0x77b2, 0x77b4, 0x77b6, 0x77b7, 0x77b8, 0x77b9, 0x77ba, 0x77bc, 0x77be, 0x77c0, 0x77c1, 0x77c2, 0x77c3, 0x77c4, 0x77c5, 0x77c6, 0x77c7, 0x77c8, 0x77c9, 0x77ca, 0x77cb, 0x77cc, 0x77ce, 0x77cf, 0x77d0, 0x77d1, 0x77d2, 0x77d3, 0x77d4, 0x77d5, 0x77d6, 0x77d8, 0x77d9, 0x77da, 0x77dd, 0x77de, 0x77df, 0x77e0, 0x77e1, 0x77e4, /* 0xb3 */ 0x77e6, 0x77e8, 0x77ea, 0x77ef, 0x77f0, 0x77f1, 0x77f2, 0x77f4, 0x77f5, 0x77f7, 0x77f9, 0x77fa, 0x77fb, 0x77fc, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807, 0x7808, 0x780a, 0x780b, 0x780e, 0x780f, 0x7810, 0x7813, 0x7815, 0x7819, 0x781b, 0x781e, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828, 0x782a, 0x782b, 0x782e, 0x782f, 0x7831, 0x7832, 0x7833, 0x7835, 0x7836, 0x783d, 0x783f, 0x7841, 0x7842, 0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784a, 0x784b, 0x784d, 0x784f, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785a, 0x785b, 0x785c, 0x785e, 0x785f, 0x7860, 0x7861, 0x7862, 0x7863, 0x7864, 0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786f, 0x7870, 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, 0x787a, 0x787b, 0x787d, 0x787e, 0x787f, 0x7880, 0x7881, 0x7882, 0x7883, /* 0xb4 */ 0x7884, 0x7885, 0x7886, 0x7888, 0x788a, 0x788b, 0x788f, 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789d, 0x789e, 0x78a0, 0x78a2, 0x78a4, 0x78a6, 0x78a8, 0x78a9, 0x78aa, 0x78ab, 0x78ac, 0x78ad, 0x78ae, 0x78af, 0x78b5, 0x78b6, 0x78b7, 0x78b8, 0x78ba, 0x78bb, 0x78bc, 0x78bd, 0x78bf, 0x78c0, 0x78c2, 0x78c3, 0x78c4, 0x78c6, 0x78c7, 0x78c8, 0x78cc, 0x78cd, 0x78ce, 0x78cf, 0x78d1, 0x78d2, 0x78d3, 0x78d6, 0x78d7, 0x78d8, 0x78da, 0x78db, 0x78dc, 0x78dd, 0x78de, 0x78df, 0x78e0, 0x78e1, 0x78e2, 0x78e3, 0x78e4, 0x78e5, 0x78e6, 0x78e7, 0x78e9, 0x78ea, 0x78eb, 0x78ed, 0x78ee, 0x78ef, 0x78f0, 0x78f1, 0x78f3, 0x78f5, 0x78f6, 0x78f8, 0x78f9, 0x78fb, 0x78fc, 0x78fd, 0x78fe, 0x78ff, 0x7900, 0x7902, 0x7903, 0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790a, 0x790b, 0x790c, /* 0xb5 */ 0x790d, 0x790e, 0x790f, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, 0x7916, 0x7917, 0x7918, 0x7919, 0x791a, 0x791b, 0x791c, 0x791d, 0x791f, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927, 0x7928, 0x7929, 0x792a, 0x792b, 0x792c, 0x792d, 0x792e, 0x792f, 0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938, 0x7939, 0x793d, 0x793f, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947, 0x794a, 0x794b, 0x794c, 0x794d, 0x794e, 0x794f, 0x7950, 0x7951, 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964, 0x7966, 0x7969, 0x796a, 0x796b, 0x796c, 0x796e, 0x7970, 0x7971, 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797b, 0x797c, 0x797d, 0x797e, 0x797f, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988, 0x7989, 0x798b, 0x798c, 0x798d, 0x798e, 0x7990, 0x7991, 0x7992, /* 0xb6 */ 0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799b, 0x799c, 0x799d, 0x799e, 0x799f, 0x79a0, 0x79a1, 0x79a2, 0x79a3, 0x79a4, 0x79a5, 0x79a6, 0x79a8, 0x79a9, 0x79aa, 0x79ab, 0x79ac, 0x79ad, 0x79ae, 0x79af, 0x79b0, 0x79b1, 0x79b2, 0x79b4, 0x79b5, 0x79b6, 0x79b7, 0x79b8, 0x79bc, 0x79bf, 0x79c2, 0x79c4, 0x79c5, 0x79c7, 0x79c8, 0x79ca, 0x79cc, 0x79ce, 0x79cf, 0x79d0, 0x79d3, 0x79d4, 0x79d6, 0x79d7, 0x79d9, 0x79da, 0x79db, 0x79dc, 0x79dd, 0x79de, 0x79e0, 0x79e1, 0x79e2, 0x79e5, 0x79e8, 0x79ea, 0x79ec, 0x79ee, 0x79f1, 0x79f2, 0x79f3, 0x79f4, 0x79f5, 0x79f6, 0x79f7, 0x79f9, 0x79fa, 0x79fc, 0x79fe, 0x79ff, 0x7a01, 0x7a04, 0x7a05, 0x7a07, 0x7a08, 0x7a09, 0x7a0a, 0x7a0c, 0x7a0f, 0x7a10, 0x7a11, 0x7a12, 0x7a13, 0x7a15, 0x7a16, 0x7a18, 0x7a19, 0x7a1b, 0x7a1c, /* 0xb7 */ 0x7a1d, 0x7a1f, 0x7a21, 0x7a22, 0x7a24, 0x7a25, 0x7a26, 0x7a27, 0x7a28, 0x7a29, 0x7a2a, 0x7a2b, 0x7a2c, 0x7a2d, 0x7a2e, 0x7a2f, 0x7a30, 0x7a31, 0x7a32, 0x7a34, 0x7a35, 0x7a36, 0x7a38, 0x7a3a, 0x7a3e, 0x7a40, 0x7a41, 0x7a42, 0x7a43, 0x7a44, 0x7a45, 0x7a47, 0x7a48, 0x7a49, 0x7a4a, 0x7a4b, 0x7a4c, 0x7a4d, 0x7a4e, 0x7a4f, 0x7a50, 0x7a52, 0x7a53, 0x7a54, 0x7a55, 0x7a56, 0x7a58, 0x7a59, 0x7a5a, 0x7a5b, 0x7a5c, 0x7a5d, 0x7a5e, 0x7a5f, 0x7a60, 0x7a61, 0x7a62, 0x7a63, 0x7a64, 0x7a65, 0x7a66, 0x7a67, 0x7a68, 0x7a69, 0x7a6a, 0x7a6b, 0x7a6c, 0x7a6d, 0x7a6e, 0x7a6f, 0x7a71, 0x7a72, 0x7a73, 0x7a75, 0x7a7b, 0x7a7c, 0x7a7d, 0x7a7e, 0x7a82, 0x7a85, 0x7a87, 0x7a89, 0x7a8a, 0x7a8b, 0x7a8c, 0x7a8e, 0x7a8f, 0x7a90, 0x7a93, 0x7a94, 0x7a99, 0x7a9a, 0x7a9b, 0x7a9e, 0x7aa1, 0x7aa2, /* 0xb8 */ 0x7aa3, 0x7aa4, 0x7aa7, 0x7aa9, 0x7aaa, 0x7aab, 0x7aae, 0x7aaf, 0x7ab0, 0x7ab1, 0x7ab2, 0x7ab4, 0x7ab5, 0x7ab6, 0x7ab7, 0x7ab8, 0x7ab9, 0x7aba, 0x7abb, 0x7abc, 0x7abd, 0x7abe, 0x7ac0, 0x7ac1, 0x7ac2, 0x7ac3, 0x7ac4, 0x7ac5, 0x7ac6, 0x7ac7, 0x7ac8, 0x7ac9, 0x7aca, 0x7acc, 0x7acd, 0x7ace, 0x7acf, 0x7ad0, 0x7ad1, 0x7ad2, 0x7ad3, 0x7ad4, 0x7ad5, 0x7ad7, 0x7ad8, 0x7ada, 0x7adb, 0x7adc, 0x7add, 0x7ae1, 0x7ae2, 0x7ae4, 0x7ae7, 0x7ae8, 0x7ae9, 0x7aea, 0x7aeb, 0x7aec, 0x7aee, 0x7af0, 0x7af1, 0x7af2, 0x7af3, 0x7af4, 0x7af5, 0x7af6, 0x7af7, 0x7af8, 0x7afb, 0x7afc, 0x7afe, 0x7b00, 0x7b01, 0x7b02, 0x7b05, 0x7b07, 0x7b09, 0x7b0c, 0x7b0d, 0x7b0e, 0x7b10, 0x7b12, 0x7b13, 0x7b16, 0x7b17, 0x7b18, 0x7b1a, 0x7b1c, 0x7b1d, 0x7b1f, 0x7b21, 0x7b22, 0x7b23, 0x7b27, 0x7b29, 0x7b2d, /* 0xb9 */ 0x7b2f, 0x7b30, 0x7b32, 0x7b34, 0x7b35, 0x7b36, 0x7b37, 0x7b39, 0x7b3b, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b42, 0x7b43, 0x7b44, 0x7b46, 0x7b48, 0x7b4a, 0x7b4d, 0x7b4e, 0x7b53, 0x7b55, 0x7b57, 0x7b59, 0x7b5c, 0x7b5e, 0x7b5f, 0x7b61, 0x7b63, 0x7b64, 0x7b65, 0x7b66, 0x7b67, 0x7b68, 0x7b69, 0x7b6a, 0x7b6b, 0x7b6c, 0x7b6d, 0x7b6f, 0x7b70, 0x7b73, 0x7b74, 0x7b76, 0x7b78, 0x7b7a, 0x7b7c, 0x7b7d, 0x7b7f, 0x7b81, 0x7b82, 0x7b83, 0x7b84, 0x7b86, 0x7b87, 0x7b88, 0x7b89, 0x7b8a, 0x7b8b, 0x7b8c, 0x7b8e, 0x7b8f, 0x7b91, 0x7b92, 0x7b93, 0x7b96, 0x7b98, 0x7b99, 0x7b9a, 0x7b9b, 0x7b9e, 0x7b9f, 0x7ba0, 0x7ba3, 0x7ba4, 0x7ba5, 0x7bae, 0x7baf, 0x7bb0, 0x7bb2, 0x7bb3, 0x7bb5, 0x7bb6, 0x7bb7, 0x7bb9, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd, 0x7bbe, 0x7bbf, 0x7bc0, 0x7bc2, 0x7bc3, 0x7bc4, /* 0xba */ 0x7bc5, 0x7bc8, 0x7bc9, 0x7bca, 0x7bcb, 0x7bcd, 0x7bce, 0x7bcf, 0x7bd0, 0x7bd2, 0x7bd4, 0x7bd5, 0x7bd6, 0x7bd7, 0x7bd8, 0x7bdb, 0x7bdc, 0x7bde, 0x7bdf, 0x7be0, 0x7be2, 0x7be3, 0x7be4, 0x7be7, 0x7be8, 0x7be9, 0x7beb, 0x7bec, 0x7bed, 0x7bef, 0x7bf0, 0x7bf2, 0x7bf3, 0x7bf4, 0x7bf5, 0x7bf6, 0x7bf8, 0x7bf9, 0x7bfa, 0x7bfb, 0x7bfd, 0x7bff, 0x7c00, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c05, 0x7c06, 0x7c08, 0x7c09, 0x7c0a, 0x7c0d, 0x7c0e, 0x7c10, 0x7c11, 0x7c12, 0x7c13, 0x7c14, 0x7c15, 0x7c17, 0x7c18, 0x7c19, 0x7c1a, 0x7c1b, 0x7c1c, 0x7c1d, 0x7c1e, 0x7c20, 0x7c21, 0x7c22, 0x7c23, 0x7c24, 0x7c25, 0x7c28, 0x7c29, 0x7c2b, 0x7c2c, 0x7c2d, 0x7c2e, 0x7c2f, 0x7c30, 0x7c31, 0x7c32, 0x7c33, 0x7c34, 0x7c35, 0x7c36, 0x7c37, 0x7c39, 0x7c3a, 0x7c3b, 0x7c3c, 0x7c3d, 0x7c3e, 0x7c42, /* 0xbb */ 0x7c43, 0x7c44, 0x7c45, 0x7c46, 0x7c47, 0x7c48, 0x7c49, 0x7c4a, 0x7c4b, 0x7c4c, 0x7c4e, 0x7c4f, 0x7c50, 0x7c51, 0x7c52, 0x7c53, 0x7c54, 0x7c55, 0x7c56, 0x7c57, 0x7c58, 0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e, 0x7c5f, 0x7c60, 0x7c61, 0x7c62, 0x7c63, 0x7c64, 0x7c65, 0x7c66, 0x7c67, 0x7c68, 0x7c69, 0x7c6a, 0x7c6b, 0x7c6c, 0x7c6d, 0x7c6e, 0x7c6f, 0x7c70, 0x7c71, 0x7c72, 0x7c75, 0x7c76, 0x7c77, 0x7c78, 0x7c79, 0x7c7a, 0x7c7e, 0x7c7f, 0x7c80, 0x7c81, 0x7c82, 0x7c83, 0x7c84, 0x7c85, 0x7c86, 0x7c87, 0x7c88, 0x7c8a, 0x7c8b, 0x7c8c, 0x7c8d, 0x7c8e, 0x7c8f, 0x7c90, 0x7c93, 0x7c94, 0x7c96, 0x7c99, 0x7c9a, 0x7c9b, 0x7ca0, 0x7ca1, 0x7ca3, 0x7ca6, 0x7ca7, 0x7ca8, 0x7ca9, 0x7cab, 0x7cac, 0x7cad, 0x7caf, 0x7cb0, 0x7cb4, 0x7cb5, 0x7cb6, 0x7cb7, 0x7cb8, 0x7cba, 0x7cbb, /* 0xbc */ 0x7cbf, 0x7cc0, 0x7cc2, 0x7cc3, 0x7cc4, 0x7cc6, 0x7cc9, 0x7ccb, 0x7cce, 0x7ccf, 0x7cd0, 0x7cd1, 0x7cd2, 0x7cd3, 0x7cd4, 0x7cd8, 0x7cda, 0x7cdb, 0x7cdd, 0x7cde, 0x7ce1, 0x7ce2, 0x7ce3, 0x7ce4, 0x7ce5, 0x7ce6, 0x7ce7, 0x7ce9, 0x7cea, 0x7ceb, 0x7cec, 0x7ced, 0x7cee, 0x7cf0, 0x7cf1, 0x7cf2, 0x7cf3, 0x7cf4, 0x7cf5, 0x7cf6, 0x7cf7, 0x7cf9, 0x7cfa, 0x7cfc, 0x7cfd, 0x7cfe, 0x7cff, 0x7d00, 0x7d01, 0x7d02, 0x7d03, 0x7d04, 0x7d05, 0x7d06, 0x7d07, 0x7d08, 0x7d09, 0x7d0b, 0x7d0c, 0x7d0d, 0x7d0e, 0x7d0f, 0x7d10, 0x7d11, 0x7d12, 0x7d13, 0x7d14, 0x7d15, 0x7d16, 0x7d17, 0x7d18, 0x7d19, 0x7d1a, 0x7d1b, 0x7d1c, 0x7d1d, 0x7d1e, 0x7d1f, 0x7d21, 0x7d23, 0x7d24, 0x7d25, 0x7d26, 0x7d28, 0x7d29, 0x7d2a, 0x7d2c, 0x7d2d, 0x7d2e, 0x7d30, 0x7d31, 0x7d32, 0x7d33, 0x7d34, 0x7d35, 0x7d36, /* 0xbd */ 0x7d37, 0x7d38, 0x7d39, 0x7d3a, 0x7d3b, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d3f, 0x7d40, 0x7d41, 0x7d42, 0x7d43, 0x7d44, 0x7d45, 0x7d46, 0x7d47, 0x7d48, 0x7d49, 0x7d4a, 0x7d4b, 0x7d4c, 0x7d4d, 0x7d4e, 0x7d4f, 0x7d50, 0x7d51, 0x7d52, 0x7d53, 0x7d54, 0x7d55, 0x7d56, 0x7d57, 0x7d58, 0x7d59, 0x7d5a, 0x7d5b, 0x7d5c, 0x7d5d, 0x7d5e, 0x7d5f, 0x7d60, 0x7d61, 0x7d62, 0x7d63, 0x7d64, 0x7d65, 0x7d66, 0x7d67, 0x7d68, 0x7d69, 0x7d6a, 0x7d6b, 0x7d6c, 0x7d6d, 0x7d6f, 0x7d70, 0x7d71, 0x7d72, 0x7d73, 0x7d74, 0x7d75, 0x7d76, 0x7d78, 0x7d79, 0x7d7a, 0x7d7b, 0x7d7c, 0x7d7d, 0x7d7e, 0x7d7f, 0x7d80, 0x7d81, 0x7d82, 0x7d83, 0x7d84, 0x7d85, 0x7d86, 0x7d87, 0x7d88, 0x7d89, 0x7d8a, 0x7d8b, 0x7d8c, 0x7d8d, 0x7d8e, 0x7d8f, 0x7d90, 0x7d91, 0x7d92, 0x7d93, 0x7d94, 0x7d95, 0x7d96, 0x7d97, 0x7d98, /* 0xbe */ 0x7d99, 0x7d9a, 0x7d9b, 0x7d9c, 0x7d9d, 0x7d9e, 0x7d9f, 0x7da0, 0x7da1, 0x7da2, 0x7da3, 0x7da4, 0x7da5, 0x7da7, 0x7da8, 0x7da9, 0x7daa, 0x7dab, 0x7dac, 0x7dad, 0x7daf, 0x7db0, 0x7db1, 0x7db2, 0x7db3, 0x7db4, 0x7db5, 0x7db6, 0x7db7, 0x7db8, 0x7db9, 0x7dba, 0x7dbb, 0x7dbc, 0x7dbd, 0x7dbe, 0x7dbf, 0x7dc0, 0x7dc1, 0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dc7, 0x7dc8, 0x7dc9, 0x7dca, 0x7dcb, 0x7dcc, 0x7dcd, 0x7dce, 0x7dcf, 0x7dd0, 0x7dd1, 0x7dd2, 0x7dd3, 0x7dd4, 0x7dd5, 0x7dd6, 0x7dd7, 0x7dd8, 0x7dd9, 0x7dda, 0x7ddb, 0x7ddc, 0x7ddd, 0x7dde, 0x7ddf, 0x7de0, 0x7de1, 0x7de2, 0x7de3, 0x7de4, 0x7de5, 0x7de6, 0x7de7, 0x7de8, 0x7de9, 0x7dea, 0x7deb, 0x7dec, 0x7ded, 0x7dee, 0x7def, 0x7df0, 0x7df1, 0x7df2, 0x7df3, 0x7df4, 0x7df5, 0x7df6, 0x7df7, 0x7df8, 0x7df9, 0x7dfa, /* 0xbf */ 0x7dfb, 0x7dfc, 0x7dfd, 0x7dfe, 0x7dff, 0x7e00, 0x7e01, 0x7e02, 0x7e03, 0x7e04, 0x7e05, 0x7e06, 0x7e07, 0x7e08, 0x7e09, 0x7e0a, 0x7e0b, 0x7e0c, 0x7e0d, 0x7e0e, 0x7e0f, 0x7e10, 0x7e11, 0x7e12, 0x7e13, 0x7e14, 0x7e15, 0x7e16, 0x7e17, 0x7e18, 0x7e19, 0x7e1a, 0x7e1b, 0x7e1c, 0x7e1d, 0x7e1e, 0x7e1f, 0x7e20, 0x7e21, 0x7e22, 0x7e23, 0x7e24, 0x7e25, 0x7e26, 0x7e27, 0x7e28, 0x7e29, 0x7e2a, 0x7e2b, 0x7e2c, 0x7e2d, 0x7e2e, 0x7e2f, 0x7e30, 0x7e31, 0x7e32, 0x7e33, 0x7e34, 0x7e35, 0x7e36, 0x7e37, 0x7e38, 0x7e39, 0x7e3a, 0x7e3c, 0x7e3d, 0x7e3e, 0x7e3f, 0x7e40, 0x7e42, 0x7e43, 0x7e44, 0x7e45, 0x7e46, 0x7e48, 0x7e49, 0x7e4a, 0x7e4b, 0x7e4c, 0x7e4d, 0x7e4e, 0x7e4f, 0x7e50, 0x7e51, 0x7e52, 0x7e53, 0x7e54, 0x7e55, 0x7e56, 0x7e57, 0x7e58, 0x7e59, 0x7e5a, 0x7e5b, 0x7e5c, 0x7e5d, /* 0xc0 */ 0x7e5e, 0x7e5f, 0x7e60, 0x7e61, 0x7e62, 0x7e63, 0x7e64, 0x7e65, 0x7e66, 0x7e67, 0x7e68, 0x7e69, 0x7e6a, 0x7e6b, 0x7e6c, 0x7e6d, 0x7e6e, 0x7e6f, 0x7e70, 0x7e71, 0x7e72, 0x7e73, 0x7e74, 0x7e75, 0x7e76, 0x7e77, 0x7e78, 0x7e79, 0x7e7a, 0x7e7b, 0x7e7c, 0x7e7d, 0x7e7e, 0x7e7f, 0x7e80, 0x7e81, 0x7e83, 0x7e84, 0x7e85, 0x7e86, 0x7e87, 0x7e88, 0x7e89, 0x7e8a, 0x7e8b, 0x7e8c, 0x7e8d, 0x7e8e, 0x7e8f, 0x7e90, 0x7e91, 0x7e92, 0x7e93, 0x7e94, 0x7e95, 0x7e96, 0x7e97, 0x7e98, 0x7e99, 0x7e9a, 0x7e9c, 0x7e9d, 0x7e9e, 0x7eae, 0x7eb4, 0x7ebb, 0x7ebc, 0x7ed6, 0x7ee4, 0x7eec, 0x7ef9, 0x7f0a, 0x7f10, 0x7f1e, 0x7f37, 0x7f39, 0x7f3b, 0x7f3c, 0x7f3d, 0x7f3e, 0x7f3f, 0x7f40, 0x7f41, 0x7f43, 0x7f46, 0x7f47, 0x7f48, 0x7f49, 0x7f4a, 0x7f4b, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f4f, 0x7f52, 0x7f53, /* 0xc1 */ 0x7f56, 0x7f59, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f5e, 0x7f60, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f67, 0x7f6b, 0x7f6c, 0x7f6d, 0x7f6f, 0x7f70, 0x7f73, 0x7f75, 0x7f76, 0x7f77, 0x7f78, 0x7f7a, 0x7f7b, 0x7f7c, 0x7f7d, 0x7f7f, 0x7f80, 0x7f82, 0x7f83, 0x7f84, 0x7f85, 0x7f86, 0x7f87, 0x7f88, 0x7f89, 0x7f8b, 0x7f8d, 0x7f8f, 0x7f90, 0x7f91, 0x7f92, 0x7f93, 0x7f95, 0x7f96, 0x7f97, 0x7f98, 0x7f99, 0x7f9b, 0x7f9c, 0x7fa0, 0x7fa2, 0x7fa3, 0x7fa5, 0x7fa6, 0x7fa8, 0x7fa9, 0x7faa, 0x7fab, 0x7fac, 0x7fad, 0x7fae, 0x7fb1, 0x7fb3, 0x7fb4, 0x7fb5, 0x7fb6, 0x7fb7, 0x7fba, 0x7fbb, 0x7fbe, 0x7fc0, 0x7fc2, 0x7fc3, 0x7fc4, 0x7fc6, 0x7fc7, 0x7fc8, 0x7fc9, 0x7fcb, 0x7fcd, 0x7fcf, 0x7fd0, 0x7fd1, 0x7fd2, 0x7fd3, 0x7fd6, 0x7fd7, 0x7fd9, 0x7fda, 0x7fdb, 0x7fdc, 0x7fdd, 0x7fde, 0x7fe2, 0x7fe3, /* 0xc2 */ 0x7fe4, 0x7fe7, 0x7fe8, 0x7fea, 0x7feb, 0x7fec, 0x7fed, 0x7fef, 0x7ff2, 0x7ff4, 0x7ff5, 0x7ff6, 0x7ff7, 0x7ff8, 0x7ff9, 0x7ffa, 0x7ffd, 0x7ffe, 0x7fff, 0x8002, 0x8007, 0x8008, 0x8009, 0x800a, 0x800e, 0x800f, 0x8011, 0x8013, 0x801a, 0x801b, 0x801d, 0x801e, 0x801f, 0x8021, 0x8023, 0x8024, 0x802b, 0x802c, 0x802d, 0x802e, 0x802f, 0x8030, 0x8032, 0x8034, 0x8039, 0x803a, 0x803c, 0x803e, 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804e, 0x804f, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0x8059, 0x805b, 0x805c, 0x805d, 0x805e, 0x805f, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806b, 0x806c, 0x806d, 0x806e, 0x806f, 0x8070, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077, 0x8078, 0x8079, 0x807a, 0x807b, 0x807c, 0x807d, /* 0xc3 */ 0x807e, 0x8081, 0x8082, 0x8085, 0x8088, 0x808a, 0x808d, 0x808e, 0x808f, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099, 0x809e, 0x80a3, 0x80a6, 0x80a7, 0x80a8, 0x80ac, 0x80b0, 0x80b3, 0x80b5, 0x80b6, 0x80b8, 0x80b9, 0x80bb, 0x80c5, 0x80c7, 0x80c8, 0x80c9, 0x80ca, 0x80cb, 0x80cf, 0x80d0, 0x80d1, 0x80d2, 0x80d3, 0x80d4, 0x80d5, 0x80d8, 0x80df, 0x80e0, 0x80e2, 0x80e3, 0x80e6, 0x80ee, 0x80f5, 0x80f7, 0x80f9, 0x80fb, 0x80fe, 0x80ff, 0x8100, 0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810b, 0x810c, 0x8115, 0x8117, 0x8119, 0x811b, 0x811c, 0x811d, 0x811f, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, 0x8128, 0x8129, 0x812a, 0x812b, 0x812d, 0x812e, 0x8130, 0x8133, 0x8134, 0x8135, 0x8137, 0x8139, 0x813a, 0x813b, 0x813c, 0x813d, 0x813f, /* 0xc4 */ 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149, 0x814d, 0x814e, 0x814f, 0x8152, 0x8156, 0x8157, 0x8158, 0x815b, 0x815c, 0x815d, 0x815e, 0x815f, 0x8161, 0x8162, 0x8163, 0x8164, 0x8166, 0x8168, 0x816a, 0x816b, 0x816c, 0x816f, 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818b, 0x818c, 0x818d, 0x818e, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819a, 0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a4, 0x81a5, 0x81a7, 0x81a9, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81bc, 0x81bd, 0x81be, 0x81bf, 0x81c4, 0x81c5, 0x81c7, 0x81c8, 0x81c9, 0x81cb, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, /* 0xc5 */ 0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e4, 0x81e5, 0x81e6, 0x81e8, 0x81e9, 0x81eb, 0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fd, 0x81ff, 0x8203, 0x8207, 0x8208, 0x8209, 0x820a, 0x820b, 0x820e, 0x820f, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218, 0x8219, 0x821a, 0x821d, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227, 0x8229, 0x822e, 0x8232, 0x823a, 0x823c, 0x823d, 0x823f, 0x8240, 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824a, 0x824c, 0x824d, 0x824e, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8259, 0x825b, 0x825c, 0x825d, 0x825e, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269, /* 0xc6 */ 0x826a, 0x826b, 0x826c, 0x826d, 0x8271, 0x8275, 0x8276, 0x8277, 0x8278, 0x827b, 0x827c, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286, 0x8287, 0x8289, 0x828c, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296, 0x829a, 0x829b, 0x829e, 0x82a0, 0x82a2, 0x82a3, 0x82a7, 0x82b2, 0x82b5, 0x82b6, 0x82ba, 0x82bb, 0x82bc, 0x82bf, 0x82c0, 0x82c2, 0x82c3, 0x82c5, 0x82c6, 0x82c9, 0x82d0, 0x82d6, 0x82d9, 0x82da, 0x82dd, 0x82e2, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82ec, 0x82ed, 0x82ee, 0x82f0, 0x82f2, 0x82f3, 0x82f5, 0x82f6, 0x82f8, 0x82fa, 0x82fc, 0x82fd, 0x82fe, 0x82ff, 0x8300, 0x830a, 0x830b, 0x830d, 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831d, 0x831e, 0x831f, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8329, 0x832a, 0x832e, 0x8330, 0x8332, 0x8337, 0x833b, 0x833d, /* 0xc7 */ 0x833e, 0x833f, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x8353, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835d, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8379, 0x837a, 0x837e, 0x837f, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838a, 0x838b, 0x838c, 0x838d, 0x838f, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396, 0x8397, 0x8399, 0x839a, 0x839d, 0x839f, 0x83a1, 0x83a2, 0x83a3, 0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b5, 0x83bb, 0x83be, 0x83bf, 0x83c2, 0x83c3, 0x83c4, 0x83c6, 0x83c8, 0x83c9, 0x83cb, 0x83cd, 0x83ce, 0x83d0, 0x83d1, 0x83d2, 0x83d3, 0x83d5, 0x83d7, 0x83d9, 0x83da, 0x83db, 0x83de, 0x83e2, 0x83e3, 0x83e4, 0x83e6, 0x83e7, 0x83e8, 0x83eb, 0x83ec, 0x83ed, /* 0xc8 */ 0x83ee, 0x83ef, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83fa, 0x83fb, 0x83fc, 0x83fe, 0x83ff, 0x8400, 0x8402, 0x8405, 0x8407, 0x8408, 0x8409, 0x840a, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8419, 0x841a, 0x841b, 0x841e, 0x841f, 0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842a, 0x842b, 0x842c, 0x842d, 0x842e, 0x842f, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436, 0x8437, 0x8439, 0x843a, 0x843b, 0x843e, 0x843f, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8452, 0x8453, 0x8454, 0x8455, 0x8456, 0x8458, 0x845d, 0x845e, 0x845f, 0x8460, 0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846a, 0x846e, 0x846f, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847b, 0x847c, /* 0xc9 */ 0x847d, 0x847e, 0x847f, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485, 0x8486, 0x848a, 0x848d, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, 0x8496, 0x8498, 0x849a, 0x849b, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84b0, 0x84b1, 0x84b3, 0x84b5, 0x84b6, 0x84b7, 0x84bb, 0x84bc, 0x84be, 0x84c0, 0x84c2, 0x84c3, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84cb, 0x84cc, 0x84ce, 0x84cf, 0x84d2, 0x84d4, 0x84d5, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84de, 0x84e1, 0x84e2, 0x84e4, 0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ed, 0x84ee, 0x84ef, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fd, 0x84fe, 0x8500, 0x8501, 0x8502, /* 0xca */ 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850a, 0x850b, 0x850d, 0x850e, 0x850f, 0x8510, 0x8512, 0x8514, 0x8515, 0x8516, 0x8518, 0x8519, 0x851b, 0x851c, 0x851d, 0x851e, 0x8520, 0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529, 0x852a, 0x852d, 0x852e, 0x852f, 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x853e, 0x853f, 0x8540, 0x8541, 0x8542, 0x8544, 0x8545, 0x8546, 0x8547, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8557, 0x8558, 0x855a, 0x855b, 0x855c, 0x855d, 0x855f, 0x8560, 0x8561, 0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8573, 0x8575, 0x8576, 0x8577, 0x8578, 0x857c, 0x857d, 0x857f, 0x8580, 0x8581, /* 0xcb */ 0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c, 0x858d, 0x858e, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859d, 0x859e, 0x859f, 0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a5, 0x85a6, 0x85a7, 0x85a9, 0x85ab, 0x85ac, 0x85ad, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b8, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85d1, 0x85d2, 0x85d4, 0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, /* 0xcc */ 0x85f9, 0x85fa, 0x85fc, 0x85fd, 0x85fe, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860a, 0x860b, 0x860c, 0x860d, 0x860e, 0x860f, 0x8610, 0x8612, 0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861a, 0x861b, 0x861c, 0x861d, 0x861e, 0x861f, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8628, 0x862a, 0x862b, 0x862c, 0x862d, 0x862e, 0x862f, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8639, 0x863a, 0x863b, 0x863d, 0x863e, 0x863f, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a, 0x864b, 0x864c, 0x8652, 0x8653, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865b, 0x865c, 0x865d, 0x865f, 0x8660, 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a, /* 0xcd */ 0x866d, 0x866f, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696, 0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869e, 0x869f, 0x86a0, 0x86a1, 0x86a2, 0x86a5, 0x86a6, 0x86ab, 0x86ad, 0x86ae, 0x86b2, 0x86b3, 0x86b7, 0x86b8, 0x86b9, 0x86bb, 0x86bc, 0x86bd, 0x86be, 0x86bf, 0x86c1, 0x86c2, 0x86c3, 0x86c5, 0x86c8, 0x86cc, 0x86cd, 0x86d2, 0x86d3, 0x86d5, 0x86d6, 0x86d7, 0x86da, 0x86dc, 0x86dd, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86ea, 0x86eb, 0x86ec, 0x86ef, 0x86f5, 0x86f6, 0x86f7, 0x86fa, 0x86fb, 0x86fc, 0x86fd, 0x86ff, 0x8701, 0x8704, 0x8705, 0x8706, 0x870b, 0x870c, 0x870e, 0x870f, 0x8710, 0x8711, 0x8714, 0x8716, /* 0xce */ 0x8719, 0x871b, 0x871d, 0x871f, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872a, 0x872b, 0x872c, 0x872d, 0x872f, 0x8730, 0x8732, 0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873a, 0x873c, 0x873d, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874a, 0x874b, 0x874d, 0x874f, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755, 0x8756, 0x8758, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f, 0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d, 0x876f, 0x8771, 0x8772, 0x8773, 0x8775, 0x8777, 0x8778, 0x8779, 0x877a, 0x877f, 0x8780, 0x8781, 0x8784, 0x8786, 0x8787, 0x8789, 0x878a, 0x878c, 0x878e, 0x878f, 0x8790, 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4, /* 0xcf */ 0x87a5, 0x87a6, 0x87a7, 0x87a9, 0x87aa, 0x87ae, 0x87b0, 0x87b1, 0x87b2, 0x87b4, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87bb, 0x87bc, 0x87be, 0x87bf, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c7, 0x87c8, 0x87c9, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87dc, 0x87dd, 0x87de, 0x87df, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e6, 0x87e7, 0x87e8, 0x87e9, 0x87eb, 0x87ec, 0x87ed, 0x87ef, 0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87ff, 0x8800, 0x8801, 0x8802, 0x8804, 0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880b, 0x880c, 0x880d, 0x880e, 0x880f, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, 0x8818, 0x8819, 0x881a, 0x881c, 0x881d, 0x881e, 0x881f, 0x8820, 0x8823, /* 0xd0 */ 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882a, 0x882b, 0x882c, 0x882d, 0x882e, 0x882f, 0x8830, 0x8831, 0x8833, 0x8834, 0x8835, 0x8836, 0x8837, 0x8838, 0x883a, 0x883b, 0x883d, 0x883e, 0x883f, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849, 0x884a, 0x884b, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853, 0x8855, 0x8856, 0x8858, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, 0x8860, 0x8866, 0x8867, 0x886a, 0x886d, 0x886f, 0x8871, 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887a, 0x887b, 0x887c, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888a, 0x888c, 0x888e, 0x888f, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, 0x8898, 0x8899, 0x889a, 0x889b, 0x889d, 0x889e, 0x889f, 0x88a0, 0x88a1, 0x88a3, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa, /* 0xd1 */ 0x88ac, 0x88ae, 0x88af, 0x88b0, 0x88b2, 0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bd, 0x88be, 0x88bf, 0x88c0, 0x88c3, 0x88c4, 0x88c7, 0x88c8, 0x88ca, 0x88cb, 0x88cc, 0x88cd, 0x88cf, 0x88d0, 0x88d1, 0x88d3, 0x88d6, 0x88d7, 0x88da, 0x88db, 0x88dc, 0x88dd, 0x88de, 0x88e0, 0x88e1, 0x88e6, 0x88e7, 0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f2, 0x88f5, 0x88f6, 0x88f7, 0x88fa, 0x88fb, 0x88fd, 0x88ff, 0x8900, 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0x8909, 0x890b, 0x890c, 0x890d, 0x890e, 0x890f, 0x8911, 0x8914, 0x8915, 0x8916, 0x8917, 0x8918, 0x891c, 0x891d, 0x891e, 0x891f, 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892c, 0x892d, 0x892e, 0x892f, 0x8931, 0x8932, 0x8933, 0x8935, 0x8937, /* 0xd2 */ 0x8938, 0x8939, 0x893a, 0x893b, 0x893c, 0x893d, 0x893e, 0x893f, 0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895a, 0x895b, 0x895c, 0x895d, 0x8960, 0x8961, 0x8962, 0x8963, 0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897c, 0x897d, 0x897e, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989, 0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, /* 0xd3 */ 0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c3, 0x89cd, 0x89d3, 0x89d4, 0x89d5, 0x89d7, 0x89d8, 0x89d9, 0x89db, 0x89dd, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e4, 0x89e7, 0x89e8, 0x89e9, 0x89ea, 0x89ec, 0x89ed, 0x89ee, 0x89f0, 0x89f1, 0x89f2, 0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd, 0x89fe, 0x89ff, 0x8a01, 0x8a02, 0x8a03, 0x8a04, 0x8a05, 0x8a06, 0x8a08, 0x8a09, 0x8a0a, 0x8a0b, 0x8a0c, 0x8a0d, 0x8a0e, 0x8a0f, 0x8a10, 0x8a11, 0x8a12, 0x8a13, 0x8a14, 0x8a15, 0x8a16, 0x8a17, 0x8a18, 0x8a19, 0x8a1a, 0x8a1b, 0x8a1c, 0x8a1d, /* 0xd4 */ 0x8a1e, 0x8a1f, 0x8a20, 0x8a21, 0x8a22, 0x8a23, 0x8a24, 0x8a25, 0x8a26, 0x8a27, 0x8a28, 0x8a29, 0x8a2a, 0x8a2b, 0x8a2c, 0x8a2d, 0x8a2e, 0x8a2f, 0x8a30, 0x8a31, 0x8a32, 0x8a33, 0x8a34, 0x8a35, 0x8a36, 0x8a37, 0x8a38, 0x8a39, 0x8a3a, 0x8a3b, 0x8a3c, 0x8a3d, 0x8a3f, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46, 0x8a47, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77, 0x8a78, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a7f, 0x8a80, /* 0xd5 */ 0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a94, 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, 0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3, /* 0xd6 */ 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8afe, 0x8aff, 0x8b00, 0x8b01, 0x8b02, 0x8b03, 0x8b04, 0x8b05, 0x8b06, 0x8b08, 0x8b09, 0x8b0a, 0x8b0b, 0x8b0c, 0x8b0d, 0x8b0e, 0x8b0f, 0x8b10, 0x8b11, 0x8b12, 0x8b13, 0x8b14, 0x8b15, 0x8b16, 0x8b17, 0x8b18, 0x8b19, 0x8b1a, 0x8b1b, 0x8b1c, 0x8b1d, 0x8b1e, 0x8b1f, 0x8b20, 0x8b21, 0x8b22, 0x8b23, 0x8b24, 0x8b25, 0x8b27, 0x8b28, 0x8b29, 0x8b2a, 0x8b2b, 0x8b2c, 0x8b2d, 0x8b2e, 0x8b2f, 0x8b30, 0x8b31, 0x8b32, 0x8b33, 0x8b34, 0x8b35, 0x8b36, 0x8b37, 0x8b38, 0x8b39, 0x8b3a, 0x8b3b, 0x8b3c, 0x8b3d, 0x8b3e, 0x8b3f, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45, /* 0xd7 */ 0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, 0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b7f, 0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97, 0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f, 0x8bac, 0x8bb1, 0x8bbb, 0x8bc7, 0x8bd0, 0x8bea, 0x8c09, 0x8c1e, /* 0xd8 */ 0x8c38, 0x8c39, 0x8c3a, 0x8c3b, 0x8c3c, 0x8c3d, 0x8c3e, 0x8c3f, 0x8c40, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c48, 0x8c4a, 0x8c4b, 0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e, 0x8c5f, 0x8c60, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, 0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e, 0x8c7f, 0x8c80, 0x8c81, 0x8c83, 0x8c84, 0x8c86, 0x8c87, 0x8c88, 0x8c8b, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0x8c95, 0x8c96, 0x8c97, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d, 0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, /* 0xd9 */ 0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6, 0x8cc7, 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe, 0x8cff, 0x8d00, 0x8d01, 0x8d02, 0x8d03, 0x8d04, 0x8d05, 0x8d06, 0x8d07, 0x8d08, 0x8d09, 0x8d0a, 0x8d0b, 0x8d0c, 0x8d0d, /* 0xda */ 0x8d0e, 0x8d0f, 0x8d10, 0x8d11, 0x8d12, 0x8d13, 0x8d14, 0x8d15, 0x8d16, 0x8d17, 0x8d18, 0x8d19, 0x8d1a, 0x8d1b, 0x8d1c, 0x8d20, 0x8d51, 0x8d52, 0x8d57, 0x8d5f, 0x8d65, 0x8d68, 0x8d69, 0x8d6a, 0x8d6c, 0x8d6e, 0x8d6f, 0x8d71, 0x8d72, 0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d7f, 0x8d80, 0x8d82, 0x8d83, 0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f, 0x8d90, 0x8d92, 0x8d93, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99, 0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8da0, 0x8da1, 0x8da2, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db2, 0x8db6, 0x8db7, 0x8db9, 0x8dbb, 0x8dbd, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc5, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, 0x8dcd, 0x8dd0, 0x8dd2, 0x8dd3, 0x8dd4, /* 0xdb */ 0x8dd5, 0x8dd8, 0x8dd9, 0x8ddc, 0x8de0, 0x8de1, 0x8de2, 0x8de5, 0x8de6, 0x8de7, 0x8de9, 0x8ded, 0x8dee, 0x8df0, 0x8df1, 0x8df2, 0x8df4, 0x8df6, 0x8dfc, 0x8dfe, 0x8dff, 0x8e00, 0x8e01, 0x8e02, 0x8e03, 0x8e04, 0x8e06, 0x8e07, 0x8e08, 0x8e0b, 0x8e0d, 0x8e0e, 0x8e10, 0x8e11, 0x8e12, 0x8e13, 0x8e15, 0x8e16, 0x8e17, 0x8e18, 0x8e19, 0x8e1a, 0x8e1b, 0x8e1c, 0x8e20, 0x8e21, 0x8e24, 0x8e25, 0x8e26, 0x8e27, 0x8e28, 0x8e2b, 0x8e2d, 0x8e30, 0x8e32, 0x8e33, 0x8e34, 0x8e36, 0x8e37, 0x8e38, 0x8e3b, 0x8e3c, 0x8e3e, 0x8e3f, 0x8e43, 0x8e45, 0x8e46, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63, 0x8e64, 0x8e65, 0x8e67, 0x8e68, 0x8e6a, 0x8e6b, 0x8e6e, 0x8e71, /* 0xdc */ 0x8e73, 0x8e75, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7d, 0x8e7e, 0x8e80, 0x8e82, 0x8e83, 0x8e84, 0x8e86, 0x8e88, 0x8e89, 0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e91, 0x8e92, 0x8e93, 0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9d, 0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8ead, 0x8eae, 0x8eb0, 0x8eb1, 0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8ebb, 0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4, 0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc, 0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4, /* 0xdd */ 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8eff, 0x8f00, 0x8f01, 0x8f02, 0x8f03, 0x8f04, 0x8f05, 0x8f06, 0x8f07, 0x8f08, 0x8f09, 0x8f0a, 0x8f0b, 0x8f0c, 0x8f0d, 0x8f0e, 0x8f0f, 0x8f10, 0x8f11, 0x8f12, 0x8f13, 0x8f14, 0x8f15, 0x8f16, 0x8f17, 0x8f18, 0x8f19, 0x8f1a, 0x8f1b, 0x8f1c, 0x8f1d, 0x8f1e, 0x8f1f, 0x8f20, 0x8f21, 0x8f22, 0x8f23, 0x8f24, 0x8f25, 0x8f26, 0x8f27, 0x8f28, 0x8f29, 0x8f2a, 0x8f2b, 0x8f2c, 0x8f2d, 0x8f2e, 0x8f2f, 0x8f30, 0x8f31, 0x8f32, 0x8f33, 0x8f34, 0x8f35, 0x8f36, 0x8f37, 0x8f38, 0x8f39, 0x8f3a, 0x8f3b, 0x8f3c, 0x8f3d, 0x8f3e, 0x8f3f, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, /* 0xde */ 0x8f45, 0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65, 0x8f6a, 0x8f80, 0x8f8c, 0x8f92, 0x8f9d, 0x8fa0, 0x8fa1, 0x8fa2, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8faa, 0x8fac, 0x8fad, 0x8fae, 0x8faf, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb7, 0x8fb8, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbf, 0x8fc0, 0x8fc3, 0x8fc6, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fcf, 0x8fd2, 0x8fd6, 0x8fd7, 0x8fda, 0x8fe0, 0x8fe1, 0x8fe3, 0x8fe7, 0x8fec, 0x8fef, 0x8ff1, 0x8ff2, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffe, 0x8fff, 0x9007, 0x9008, 0x900c, 0x900e, 0x9013, 0x9015, 0x9018, /* 0xdf */ 0x9019, 0x901c, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029, 0x902a, 0x902b, 0x902c, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034, 0x9037, 0x9039, 0x903a, 0x903d, 0x903f, 0x9040, 0x9043, 0x9045, 0x9046, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904e, 0x9054, 0x9055, 0x9056, 0x9059, 0x905a, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906a, 0x906b, 0x906c, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077, 0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907e, 0x9081, 0x9084, 0x9085, 0x9086, 0x9087, 0x9089, 0x908a, 0x908c, 0x908d, 0x908e, 0x908f, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909a, 0x909c, 0x909e, 0x909f, 0x90a0, 0x90a4, 0x90a5, 0x90a7, 0x90a8, 0x90a9, 0x90ab, 0x90ad, 0x90b2, 0x90b7, 0x90bc, 0x90bd, 0x90bf, 0x90c0, /* 0xe0 */ 0x90c2, 0x90c3, 0x90c6, 0x90c8, 0x90c9, 0x90cb, 0x90cc, 0x90cd, 0x90d2, 0x90d4, 0x90d5, 0x90d6, 0x90d8, 0x90d9, 0x90da, 0x90de, 0x90df, 0x90e0, 0x90e3, 0x90e4, 0x90e5, 0x90e9, 0x90ea, 0x90ec, 0x90ee, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f5, 0x90f6, 0x90f7, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90ff, 0x9100, 0x9101, 0x9103, 0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910a, 0x910b, 0x910c, 0x910d, 0x910e, 0x910f, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114, 0x9115, 0x9116, 0x9117, 0x9118, 0x911a, 0x911b, 0x911c, 0x911d, 0x911f, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, 0x9128, 0x9129, 0x912a, 0x912b, 0x912c, 0x912d, 0x912e, 0x9130, 0x9132, 0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913a, 0x913b, 0x913c, 0x913d, 0x913e, 0x913f, 0x9140, 0x9141, 0x9142, 0x9144, /* 0xe1 */ 0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, 0x9158, 0x9159, 0x915b, 0x915c, 0x915f, 0x9160, 0x9166, 0x9167, 0x9168, 0x916b, 0x916d, 0x9173, 0x917a, 0x917b, 0x917c, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918a, 0x918e, 0x918f, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a4, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91ab, 0x91ac, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91bb, 0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c8, 0x91cb, 0x91d0, 0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dd, 0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5, /* 0xe2 */ 0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed, 0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd, 0x91fe, 0x91ff, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205, 0x9206, 0x9207, 0x9208, 0x9209, 0x920a, 0x920b, 0x920c, 0x920d, 0x920e, 0x920f, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215, 0x9216, 0x9217, 0x9218, 0x9219, 0x921a, 0x921b, 0x921c, 0x921d, 0x921e, 0x921f, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0x9225, 0x9226, 0x9227, 0x9228, 0x9229, 0x922a, 0x922b, 0x922c, 0x922d, 0x922e, 0x922f, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235, 0x9236, 0x9237, 0x9238, 0x9239, 0x923a, 0x923b, 0x923c, 0x923d, 0x923e, 0x923f, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, /* 0xe3 */ 0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, 0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, 0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e, 0x927f, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928f, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f, 0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, /* 0xe4 */ 0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92af, 0x92b0, 0x92b1, 0x92b2, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8, 0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c9, 0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1, 0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x92ff, 0x9300, 0x9301, 0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, /* 0xe5 */ 0x930a, 0x930b, 0x930c, 0x930d, 0x930e, 0x930f, 0x9310, 0x9311, 0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931a, 0x931b, 0x931c, 0x931d, 0x931e, 0x931f, 0x9320, 0x9321, 0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932a, 0x932b, 0x932c, 0x932d, 0x932e, 0x932f, 0x9330, 0x9331, 0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933a, 0x933b, 0x933c, 0x933d, 0x933f, 0x9340, 0x9341, 0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934a, 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935a, 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936b, /* 0xe6 */ 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x937f, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b, 0x938c, 0x938d, 0x938e, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c, 0x939d, 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4, 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4, 0x93c5, 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93cb, 0x93cc, 0x93cd, /* 0xe7 */ 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5, 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de, 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6, 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee, 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe, 0x93ff, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409, 0x940a, 0x940b, 0x940c, 0x940d, 0x940e, 0x940f, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419, 0x941a, 0x941b, 0x941c, 0x941d, 0x941e, 0x941f, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942a, 0x942b, 0x942c, 0x942d, 0x942e, /* 0xe8 */ 0x942f, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943a, 0x943b, 0x943c, 0x943d, 0x943f, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946a, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x947f, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, 0x94c7, 0x94cf, 0x94d3, 0x94d4, 0x94da, 0x94e6, 0x94fb, 0x951c, 0x9520, /* 0xe9 */ 0x9527, 0x9533, 0x953d, 0x9543, 0x9548, 0x954b, 0x9555, 0x955a, 0x9560, 0x956e, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582, 0x9583, 0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, 0x9593, 0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, 0x959b, 0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca, 0x95cb, /* 0xea */ 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95ec, 0x95ff, 0x9607, 0x9613, 0x9618, 0x961b, 0x961e, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627, 0x9628, 0x9629, 0x962b, 0x962c, 0x962d, 0x962f, 0x9630, 0x9637, 0x9638, 0x9639, 0x963a, 0x963e, 0x9641, 0x9643, 0x964a, 0x964e, 0x964f, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a, 0x965c, 0x965d, 0x965e, 0x9660, 0x9663, 0x9665, 0x9666, 0x966b, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9673, 0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x967f, 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968a, /* 0xeb */ 0x968c, 0x968e, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969a, 0x969b, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac, 0x96ad, 0x96ae, 0x96af, 0x96b1, 0x96b2, 0x96b4, 0x96b5, 0x96b7, 0x96b8, 0x96ba, 0x96bb, 0x96bf, 0x96c2, 0x96c3, 0x96c8, 0x96ca, 0x96cb, 0x96d0, 0x96d1, 0x96d3, 0x96d4, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96eb, 0x96ec, 0x96ed, 0x96ee, 0x96f0, 0x96f1, 0x96f2, 0x96f4, 0x96f5, 0x96f8, 0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96ff, 0x9702, 0x9703, 0x9705, 0x970a, 0x970b, 0x970c, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718, 0x9719, 0x971a, 0x971b, 0x971d, 0x971f, 0x9720, /* 0xec */ 0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728, 0x9729, 0x972b, 0x972c, 0x972e, 0x972f, 0x9731, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737, 0x973a, 0x973b, 0x973c, 0x973d, 0x973f, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975a, 0x975c, 0x975d, 0x975f, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9775, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977d, 0x977e, 0x977f, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788, 0x9789, 0x978a, 0x978c, 0x978e, 0x978f, 0x9790, 0x9793, 0x9795, 0x9796, 0x9797, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, /* 0xed */ 0x979e, 0x979f, 0x97a1, 0x97a2, 0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0x97aa, 0x97ac, 0x97ae, 0x97b0, 0x97b1, 0x97b3, 0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e8, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f4, 0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x97ff, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806, 0x9807, 0x9808, 0x9809, 0x980a, 0x980b, 0x980c, 0x980d, 0x980e, /* 0xee */ 0x980f, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816, 0x9817, 0x9818, 0x9819, 0x981a, 0x981b, 0x981c, 0x981d, 0x981e, 0x981f, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826, 0x9827, 0x9828, 0x9829, 0x982a, 0x982b, 0x982c, 0x982d, 0x982e, 0x982f, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836, 0x9837, 0x9838, 0x9839, 0x983a, 0x983b, 0x983c, 0x983d, 0x983e, 0x983f, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, /* 0xef */ 0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988b, 0x988e, 0x9892, 0x9895, 0x9899, 0x98a3, 0x98a8, 0x98a9, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0x98cb, 0x98cc, 0x98cd, 0x98cf, 0x98d0, 0x98d4, 0x98d6, 0x98d7, 0x98db, 0x98dc, 0x98dd, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x98ff, 0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, 0x9907, /* 0xf0 */ 0x9908, 0x9909, 0x990a, 0x990b, 0x990c, 0x990e, 0x990f, 0x9911, 0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919, 0x991a, 0x991b, 0x991c, 0x991d, 0x991e, 0x991f, 0x9920, 0x9921, 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929, 0x992a, 0x992b, 0x992c, 0x992d, 0x992f, 0x9930, 0x9931, 0x9932, 0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993a, 0x993b, 0x993c, 0x993d, 0x993e, 0x993f, 0x9940, 0x9941, 0x9942, 0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, 0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9964, 0x9966, 0x9973, 0x9978, 0x9979, 0x997b, 0x997e, 0x9982, 0x9983, 0x9989, /* 0xf1 */ 0x998c, 0x998e, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a6, 0x99a7, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9, /* 0xf2 */ 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x99ff, 0x9a00, 0x9a01, 0x9a02, 0x9a03, 0x9a04, 0x9a05, 0x9a06, 0x9a07, 0x9a08, 0x9a09, 0x9a0a, 0x9a0b, 0x9a0c, 0x9a0d, 0x9a0e, 0x9a0f, 0x9a10, 0x9a11, 0x9a12, 0x9a13, 0x9a14, 0x9a15, 0x9a16, 0x9a17, 0x9a18, 0x9a19, 0x9a1a, 0x9a1b, 0x9a1c, 0x9a1d, 0x9a1e, 0x9a1f, 0x9a20, 0x9a21, 0x9a22, 0x9a23, 0x9a24, 0x9a25, 0x9a26, 0x9a27, 0x9a28, 0x9a29, 0x9a2a, 0x9a2b, 0x9a2c, 0x9a2d, 0x9a2e, 0x9a2f, 0x9a30, 0x9a31, 0x9a32, 0x9a33, 0x9a34, 0x9a35, 0x9a36, 0x9a37, 0x9a38, 0x9a39, 0x9a3a, 0x9a3b, 0x9a3c, 0x9a3d, 0x9a3e, 0x9a3f, 0x9a40, 0x9a41, 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59, /* 0xf3 */ 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a72, 0x9a83, 0x9a89, 0x9a8d, 0x9a8e, 0x9a94, 0x9a95, 0x9a99, 0x9aa6, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab9, 0x9abb, 0x9abd, 0x9abe, 0x9abf, 0x9ac3, 0x9ac4, 0x9ac6, 0x9ac7, 0x9ac8, 0x9ac9, 0x9aca, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad2, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9ae0, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae7, 0x9ae8, 0x9ae9, 0x9aea, 0x9aec, 0x9aee, 0x9af0, 0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9afa, 0x9afc, 0x9afd, 0x9afe, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b04, 0x9b05, 0x9b06, /* 0xf4 */ 0x9b07, 0x9b09, 0x9b0a, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, 0x9b10, 0x9b11, 0x9b12, 0x9b14, 0x9b15, 0x9b16, 0x9b17, 0x9b18, 0x9b19, 0x9b1a, 0x9b1b, 0x9b1c, 0x9b1d, 0x9b1e, 0x9b20, 0x9b21, 0x9b22, 0x9b24, 0x9b25, 0x9b26, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2b, 0x9b2c, 0x9b2d, 0x9b2e, 0x9b30, 0x9b31, 0x9b33, 0x9b34, 0x9b35, 0x9b36, 0x9b37, 0x9b38, 0x9b39, 0x9b3a, 0x9b3d, 0x9b3e, 0x9b3f, 0x9b40, 0x9b46, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4e, 0x9b50, 0x9b52, 0x9b53, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73, 0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b, /* 0xf5 */ 0x9b7c, 0x9b7d, 0x9b7e, 0x9b7f, 0x9b80, 0x9b81, 0x9b82, 0x9b83, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b, 0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93, 0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab, 0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3, 0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb, 0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3, 0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3, 0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb, /* 0xf6 */ 0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3, 0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb, 0x9bec, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb, 0x9bfc, 0x9bfd, 0x9bfe, 0x9bff, 0x9c00, 0x9c01, 0x9c02, 0x9c03, 0x9c04, 0x9c05, 0x9c06, 0x9c07, 0x9c08, 0x9c09, 0x9c0a, 0x9c0b, 0x9c0c, 0x9c0d, 0x9c0e, 0x9c0f, 0x9c10, 0x9c11, 0x9c12, 0x9c13, 0x9c14, 0x9c15, 0x9c16, 0x9c17, 0x9c18, 0x9c19, 0x9c1a, 0x9c1b, 0x9c1c, 0x9c1d, 0x9c1e, 0x9c1f, 0x9c20, 0x9c21, 0x9c22, 0x9c23, 0x9c24, 0x9c25, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c2b, 0x9c2c, 0x9c2d, 0x9c2e, 0x9c2f, 0x9c30, 0x9c31, 0x9c32, 0x9c33, 0x9c34, 0x9c35, 0x9c36, 0x9c37, 0x9c38, 0x9c39, 0x9c3a, 0x9c3b, /* 0xf7 */ 0x9c3c, 0x9c3d, 0x9c3e, 0x9c3f, 0x9c40, 0x9c41, 0x9c42, 0x9c43, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0x9c53, 0x9c54, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b, 0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74, 0x9c75, 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7d, 0x9c7e, 0x9c80, 0x9c83, 0x9c84, 0x9c89, 0x9c8a, 0x9c8c, 0x9c8f, 0x9c93, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9d, 0x9caa, 0x9cac, 0x9caf, 0x9cb9, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc8, 0x9cc9, 0x9cd1, 0x9cd2, 0x9cda, 0x9cdb, 0x9ce0, 0x9ce1, /* 0xf8 */ 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9cff, 0x9d00, 0x9d01, 0x9d02, 0x9d03, 0x9d04, 0x9d05, 0x9d06, 0x9d07, 0x9d08, 0x9d09, 0x9d0a, 0x9d0b, 0x9d0c, 0x9d0d, 0x9d0e, 0x9d0f, 0x9d10, 0x9d11, 0x9d12, 0x9d13, 0x9d14, 0x9d15, 0x9d16, 0x9d17, 0x9d18, 0x9d19, 0x9d1a, 0x9d1b, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d1f, 0x9d20, 0x9d21, 0x9d22, 0x9d23, 0x9d24, 0x9d25, 0x9d26, 0x9d27, 0x9d28, 0x9d29, 0x9d2a, 0x9d2b, 0x9d2c, 0x9d2d, 0x9d2e, 0x9d2f, 0x9d30, 0x9d31, 0x9d32, 0x9d33, 0x9d34, 0x9d35, 0x9d36, 0x9d37, 0x9d38, 0x9d39, 0x9d3a, 0x9d3b, 0x9d3c, 0x9d3d, 0x9d3e, 0x9d3f, 0x9d40, 0x9d41, 0x9d42, /* 0xf9 */ 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d7f, 0x9d80, 0x9d81, 0x9d82, 0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92, 0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a, 0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2, /* 0xfa */ 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa, 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2, 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, 0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2, 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9dff, 0x9e00, 0x9e01, 0x9e02, /* 0xfb */ 0x9e03, 0x9e04, 0x9e05, 0x9e06, 0x9e07, 0x9e08, 0x9e09, 0x9e0a, 0x9e0b, 0x9e0c, 0x9e0d, 0x9e0e, 0x9e0f, 0x9e10, 0x9e11, 0x9e12, 0x9e13, 0x9e14, 0x9e15, 0x9e16, 0x9e17, 0x9e18, 0x9e19, 0x9e1a, 0x9e1b, 0x9e1c, 0x9e1d, 0x9e1e, 0x9e24, 0x9e27, 0x9e2e, 0x9e30, 0x9e34, 0x9e3b, 0x9e3c, 0x9e40, 0x9e4d, 0x9e50, 0x9e52, 0x9e53, 0x9e54, 0x9e56, 0x9e59, 0x9e5d, 0x9e5f, 0x9e60, 0x9e61, 0x9e62, 0x9e65, 0x9e6e, 0x9e6f, 0x9e72, 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e80, 0x9e81, 0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e89, 0x9e8a, 0x9e8c, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9e, 0x9ea0, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa, /* 0xfc */ 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb9, 0x9eba, 0x9ebc, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9eca, 0x9ecb, 0x9ecc, 0x9ed0, 0x9ed2, 0x9ed3, 0x9ed5, 0x9ed6, 0x9ed7, 0x9ed9, 0x9eda, 0x9ede, 0x9ee1, 0x9ee3, 0x9ee4, 0x9ee6, 0x9ee8, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9efa, 0x9efd, 0x9eff, 0x9f00, 0x9f01, 0x9f02, 0x9f03, 0x9f04, 0x9f05, 0x9f06, 0x9f07, 0x9f08, 0x9f09, 0x9f0a, 0x9f0c, 0x9f0f, 0x9f11, 0x9f12, 0x9f14, 0x9f15, 0x9f16, 0x9f18, 0x9f1a, 0x9f1b, 0x9f1c, 0x9f1d, 0x9f1e, 0x9f1f, 0x9f21, 0x9f23, 0x9f24, 0x9f25, 0x9f26, 0x9f27, 0x9f28, 0x9f29, 0x9f2a, 0x9f2b, 0x9f2d, 0x9f2e, 0x9f30, 0x9f31, /* 0xfd */ 0x9f32, 0x9f33, 0x9f34, 0x9f35, 0x9f36, 0x9f38, 0x9f3a, 0x9f3c, 0x9f3f, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f45, 0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f81, 0x9f82, 0x9f8d, 0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95, 0x9f96, 0x9f97, 0x9f98, 0x9f9c, 0x9f9d, 0x9f9e, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0xf92c, 0xf979, 0xf995, 0xf9e7, 0xf9f1, /* 0xfe */ 0xfa0c, 0xfa0d, 0xfa0e, 0xfa0f, 0xfa11, 0xfa13, 0xfa14, 0xfa18, 0xfa1f, 0xfa20, 0xfa21, 0xfa23, 0xfa24, 0xfa27, 0xfa28, 0xfa29, }; static int gbkext2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n) { unsigned char c1 = s[0]; if ((c1 >= 0xa8 && c1 <= 0xfe)) { if (n >= 2) { unsigned char c2 = s[1]; if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) { unsigned int i = 96 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40)); unsigned short wc = 0xfffd; { if (i < 12016) wc = gbkext2_2uni_pagea8[i-3744]; } if (wc != 0xfffd) { *pwc = (ucs4_t) wc; return 2; } } return RET_ILSEQ; } return RET_TOOFEW(0); } return RET_ILSEQ; } fldigi-4.2.05/src/libtiniconv/tiniconv_int.h0000664000175000017500000000272014532252172015752 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 3 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef TINICONV_INT_H_ #define TINICONV_INT_H_ #include "tiniconv.h" #define RET_ILSEQ -1 #define RET_TOOFEW(n) (-2-(n)) #define RET_ILUNI -1 #define RET_TOOSMALL -2 extern const struct tiniconv_charset_map_entry_s { xxx_mb2wc_t mb2wc; xxx_flushwc_t flushwc; xxx_wc2mb_t wc2mb; xxx_reset_t reset; } tiniconv_charset_map[]; typedef struct { unsigned short indx; /* index into big table */ unsigned short used; /* bitmask of used entries */ } Summary16; #define TINICONV_OPTION_GET_OUT_ILSEQ_CHAR(options) ((options >> 8) & 0xFF) #endif /*TINICONV_INT_H_*/ fldigi-4.2.05/src/libtiniconv/tiniconv.c0000664000175000017500000001011114532252172015064 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "tiniconv.h" #include "tiniconv_int.h" #include #include int tiniconv_init(int in_charset_id, int out_charset_id, int options, struct tiniconv_ctx_s *ctx) { assert(ctx != NULL); if (in_charset_id < 0 || in_charset_id >= TINICONV_CHARSETSIZE) return TINICONV_INIT_IN_CHARSET_NA; if (out_charset_id < 0 || out_charset_id >= TINICONV_CHARSETSIZE) return TINICONV_INIT_OUT_CHARSET_NA; memset(ctx, 0, sizeof(*ctx)); ctx->mb2wc = tiniconv_charset_map[in_charset_id].mb2wc; ctx->flushwc = tiniconv_charset_map[in_charset_id].flushwc; ctx->wc2mb = tiniconv_charset_map[out_charset_id].wc2mb; ctx->reset = tiniconv_charset_map[out_charset_id].reset; ctx->options = options; if (!TINICONV_OPTION_GET_OUT_ILSEQ_CHAR(options)) ctx->options = ctx->options | TINICONV_OPTION_OUT_ILSEQ_CHAR('?'); return TINICONV_INIT_OK; } int tiniconv_convert(struct tiniconv_ctx_s *ctx, unsigned char const *in_buf, int in_size, int *p_in_size_consumed, unsigned char *out_buf, int out_size, int *p_out_size_consumed) { ucs4_t wc; int in_idx, out_idx; int result, last_result; conv_state_t last_istate; assert(ctx != NULL); assert(in_buf != NULL); assert(out_buf != NULL); for (in_idx = 0, out_idx = 0; in_idx < in_size && out_idx < out_size;) { last_istate = ctx->istate; /* typedef int (*xxx_mb2wc_t) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n); */ result = ctx->mb2wc(ctx, &wc, in_buf + in_idx, in_size - in_idx); assert(result <= in_size - in_idx); if (result < 0) { if (result == RET_ILSEQ) { if (ctx->options & TINICONV_OPTION_IGNORE_IN_ILSEQ) { ctx->istate = 0; in_idx ++; continue; } else { result = TINICONV_CONVERT_IN_ILSEQ; goto exit; } } else if (result == RET_TOOSMALL) { result = TINICONV_CONVERT_IN_TOO_SMALL; goto exit; } else { in_idx += RET_TOOFEW(result); continue; } } in_idx += last_result = result; /* typedef int (*xxx_wc2mb_t) (conv_t conv, unsigned char *r, ucs4_t wc, int n); */ result = ctx->wc2mb(ctx, out_buf + out_idx, wc, out_size - out_idx); assert(result <= out_size - out_idx); if (result < 0) { if (result == RET_ILUNI) { if (ctx->options & TINICONV_OPTION_IGNORE_OUT_ILSEQ) { out_buf[out_idx ++] = TINICONV_OPTION_GET_OUT_ILSEQ_CHAR(ctx->options); ctx->ostate = 0; continue; } else { result = TINICONV_CONVERT_OUT_ILSEQ; in_idx -= last_result; /* discarding the last read sequence */ ctx->istate = last_istate; goto exit; } } else if (result == RET_TOOSMALL) { result = TINICONV_CONVERT_OUT_TOO_SMALL; in_idx -= last_result; /* discarding the last read sequence */ ctx->istate = last_istate; goto exit; } } out_idx += result; } result = TINICONV_CONVERT_OK; exit: if (p_in_size_consumed) *p_in_size_consumed = in_idx; if (p_out_size_consumed) *p_out_size_consumed = out_idx; return result; } fldigi-4.2.05/src/libtiniconv/tiniconv_desc.c0000664000175000017500000001340614532252172016074 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "tiniconv_int.h" #include #define abort() assert(0) #define NULL 0 #include "encdec/ascii.h" #include "encdec/cp1250.h" #include "encdec/cp1251.h" #include "encdec/cp1252.h" #include "encdec/cp1253.h" #include "encdec/cp1254.h" #include "encdec/cp1255.h" #include "encdec/cp1256.h" #include "encdec/cp1257.h" #include "encdec/cp1258.h" #include "encdec/iso8859_1.h" #include "encdec/iso8859_2.h" #include "encdec/iso8859_3.h" #include "encdec/iso8859_4.h" #include "encdec/iso8859_5.h" #include "encdec/iso8859_6.h" #include "encdec/iso8859_7.h" #include "encdec/iso8859_8.h" #include "encdec/iso8859_9.h" #include "encdec/iso8859_10.h" #include "encdec/iso8859_11.h" #include "encdec/iso8859_13.h" #include "encdec/iso8859_14.h" #include "encdec/iso8859_15.h" #include "encdec/iso8859_16.h" #include "encdec/cp866.h" #include "encdec/koi8_r.h" #include "encdec/koi8_ru.h" #include "encdec/koi8_u.h" #include "encdec/mac_cyrillic.h" #include "encdec/ucs2.h" #include "encdec/utf7.h" #include "encdec/utf8.h" #include "encdec/gb2312.h" /* is needed for euc_cn.h */ #include "encdec/euc_cn.h" #include "encdec/gbk.h" #include "encdec/ces_gbk.h" #include "encdec/big5.h" /* is needed for ces_big5.h */ #include "encdec/ces_big5.h" #include "encdec/jisx0208.h" #include "encdec/jisx0201.h" #include "encdec/cp936.h" #include "encdec/iso2022_jp.h" const struct tiniconv_charset_map_entry_s tiniconv_charset_map[] = { {ascii_mbtowc, NULL, ascii_wctomb, NULL }, /* 0 */ {cp1250_mbtowc, NULL, cp1250_wctomb, NULL }, /* 1 */ {cp1251_mbtowc, NULL, cp1251_wctomb, NULL }, /* 2 */ {cp1252_mbtowc, NULL, cp1252_wctomb, NULL }, /* 3 */ {cp1253_mbtowc, NULL, cp1253_wctomb, NULL }, /* 4 */ {cp1254_mbtowc, NULL, cp1254_wctomb, NULL }, /* 5 */ {cp1255_mbtowc, cp1255_flushwc, cp1255_wctomb, NULL }, /* 6 */ {cp1256_mbtowc, NULL, cp1256_wctomb, NULL }, /* 7 */ {cp1257_mbtowc, NULL, cp1257_wctomb, NULL }, /* 8 */ {cp1258_mbtowc, cp1258_flushwc, cp1258_wctomb, NULL }, /* 9 */ {cp936_mbtowc, NULL, cp936_wctomb, NULL }, /* 10 */ {euc_cn_mbtowc, NULL, euc_cn_wctomb, NULL }, /* 11 */ {gbk_mbtowc, NULL, gbk_wctomb, NULL }, /* 12 */ {iso2022_jp_mbtowc, NULL, iso2022_jp_wctomb, iso2022_jp_reset}, /* 13 */ {iso8859_1_mbtowc, NULL, iso8859_1_wctomb, NULL }, /* 14 */ {iso8859_2_mbtowc, NULL, iso8859_2_wctomb, NULL }, /* 15 */ {iso8859_3_mbtowc, NULL, iso8859_3_wctomb, NULL }, /* 16 */ {iso8859_4_mbtowc, NULL, iso8859_4_wctomb, NULL }, /* 17 */ {iso8859_5_mbtowc, NULL, iso8859_5_wctomb, NULL }, /* 18 */ {iso8859_6_mbtowc, NULL, iso8859_6_wctomb, NULL }, /* 19 */ {iso8859_7_mbtowc, NULL, iso8859_7_wctomb, NULL }, /* 20 */ {iso8859_8_mbtowc, NULL, iso8859_8_wctomb, NULL }, /* 21 */ {iso8859_9_mbtowc, NULL, iso8859_9_wctomb, NULL }, /* 22 */ {iso8859_10_mbtowc, NULL, iso8859_10_wctomb, NULL }, /* 23 */ {iso8859_11_mbtowc, NULL, iso8859_11_wctomb, NULL }, /* 24 */ {iso8859_13_mbtowc, NULL, iso8859_13_wctomb, NULL }, /* 25 */ {iso8859_14_mbtowc, NULL, iso8859_14_wctomb, NULL }, /* 26 */ {iso8859_15_mbtowc, NULL, iso8859_15_wctomb, NULL }, /* 27 */ {iso8859_16_mbtowc, NULL, iso8859_16_wctomb, NULL }, /* 28 */ {cp866_mbtowc, NULL, cp866_wctomb, NULL }, /* 29 */ {koi8_r_mbtowc, NULL, koi8_r_wctomb, NULL }, /* 30 */ {koi8_ru_mbtowc, NULL, koi8_ru_wctomb, NULL }, /* 31 */ {koi8_u_mbtowc, NULL, koi8_u_wctomb, NULL }, /* 32 */ {mac_cyrillic_mbtowc, NULL, mac_cyrillic_wctomb, NULL }, /* 33 */ {ucs2_mbtowc, NULL, ucs2_wctomb, NULL }, /* 34 */ {utf7_mbtowc, NULL, utf7_wctomb, utf7_reset }, /* 35 */ {utf8_mbtowc, NULL, utf8_wctomb, NULL }, /* 36 */ {gb2312_mbtowc, NULL, gb2312_wctomb, NULL }, /* 37, CHINESE */ {ces_big5_mbtowc, NULL, ces_big5_wctomb, NULL }, /* 38 */ {NULL, NULL, NULL, NULL } }; fldigi-4.2.05/src/libtiniconv/tiniconv.h0000664000175000017500000001261314532252172015102 00000000000000/* * This file is part of the TINICONV Library. * * The TINICONV Library is free software; you can redistribute it * and/or modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef TINICONV_H_ #define TINICONV_H_ /* For exporting functions under WIN32 */ #ifdef WIN32 #ifdef DLL #define EXPORT(type) __declspec(dllexport) type #else #define EXPORT(type) /*__declspec(dllimport)*/ type #endif/*DLL*/ #else #define EXPORT(type) type #endif /*WIN32*/ typedef unsigned int ucs4_t; typedef struct tiniconv_ctx_s * conv_t; /* * int xxx_mb2wc (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n) * converts the byte sequence starting at s to a wide character. Up to n bytes * are available at s. n is >= 1. * Result is number of bytes consumed (if a wide character was read), * or -1 if invalid, or -2 if n too small, or -2-(number of bytes consumed) * if only a shift sequence was read. */ typedef int (*xxx_mb2wc_t) (conv_t conv, ucs4_t *pwc, unsigned char const *s, int n); /* * int xxx_flushwc (conv_t conv, ucs4_t *pwc) * returns to the initial state and stores the pending wide character, if any. * Result is 1 (if a wide character was read) or 0 if none was pending. */ typedef int (*xxx_flushwc_t) (conv_t conv, ucs4_t *pwc); /* * int xxx_wc2mb (conv_t conv, unsigned char *r, ucs4_t wc, int n) * converts the wide character wc to the character set xxx, and stores the * result beginning at r. Up to n bytes may be written at r. n is >= 1. * Result is number of bytes written, or -1 if invalid, or -2 if n too small. */ typedef int (*xxx_wc2mb_t) (conv_t conv, unsigned char *r, ucs4_t wc, int n); /* * int xxx_reset (conv_t conv, unsigned char *r, int n) * stores a shift sequences returning to the initial state beginning at r. * Up to n bytes may be written at r. n is >= 0. * Result is number of bytes written, or -2 if n too small. */ typedef int (*xxx_reset_t) (conv_t conv, unsigned char *r, int n); typedef unsigned int conv_state_t; struct tiniconv_ctx_s { conv_state_t istate; conv_state_t ostate; xxx_mb2wc_t mb2wc; xxx_flushwc_t flushwc; xxx_wc2mb_t wc2mb; xxx_reset_t reset; int options; }; /* * tiniconv_init */ #define TINICONV_CHARSET_ASCII 0 #define TINICONV_CHARSET_CP1250 1 #define TINICONV_CHARSET_CP1251 2 #define TINICONV_CHARSET_CP1252 3 #define TINICONV_CHARSET_CP1253 4 #define TINICONV_CHARSET_CP1254 5 #define TINICONV_CHARSET_CP1255 6 #define TINICONV_CHARSET_CP1256 7 #define TINICONV_CHARSET_CP1257 8 #define TINICONV_CHARSET_CP1258 9 #define TINICONV_CHARSET_CP936 10 #define TINICONV_CHARSET_GB2312 11 #define TINICONV_CHARSET_GBK 12 #define TINICONV_CHARSET_ISO_2022_JP 13 #define TINICONV_CHARSET_ISO_8859_1 14 #define TINICONV_CHARSET_ISO_8859_2 15 #define TINICONV_CHARSET_ISO_8859_3 16 #define TINICONV_CHARSET_ISO_8859_4 17 #define TINICONV_CHARSET_ISO_8859_5 18 #define TINICONV_CHARSET_ISO_8859_6 19 #define TINICONV_CHARSET_ISO_8859_7 20 #define TINICONV_CHARSET_ISO_8859_8 21 #define TINICONV_CHARSET_ISO_8859_9 22 #define TINICONV_CHARSET_ISO_8859_10 23 #define TINICONV_CHARSET_ISO_8859_11 24 #define TINICONV_CHARSET_ISO_8859_13 25 #define TINICONV_CHARSET_ISO_8859_14 26 #define TINICONV_CHARSET_ISO_8859_15 27 #define TINICONV_CHARSET_ISO_8859_16 28 #define TINICONV_CHARSET_CP866 29 #define TINICONV_CHARSET_KOI8_R 30 #define TINICONV_CHARSET_KOI8_RU 31 #define TINICONV_CHARSET_KOI8_U 32 #define TINICONV_CHARSET_MACCYRILLIC 33 #define TINICONV_CHARSET_UCS_2 34 #define TINICONV_CHARSET_UTF_7 35 #define TINICONV_CHARSET_UTF_8 36 #define TINICONV_CHARSET_CHINESE 37 #define TINICONV_CHARSET_BIG5 38 #define TINICONV_CHARSETSIZE 39 #define TINICONV_OPTION_IGNORE_IN_ILSEQ 1 /*< ignore incorrect input sequences */ #define TINICONV_OPTION_IGNORE_OUT_ILSEQ 2 /*< replace sequence which can't be converted to OUT charset with OUTIL_CHAR */ /* #define TINICONV_OPTION_TRANSLIT 4 */ #define TINICONV_OPTION_OUT_ILSEQ_CHAR(ch) (ch << 8) #define TINICONV_INIT_OK 0 #define TINICONV_INIT_IN_CHARSET_NA -1 #define TINICONV_INIT_OUT_CHARSET_NA -1 #ifdef __cplusplus extern "C" { #endif EXPORT(int) tiniconv_init(int in_charset_id, int out_charset_id, int options, struct tiniconv_ctx_s *ctx); /* * tiniconv_convert */ #define TINICONV_CONVERT_OK 0 #define TINICONV_CONVERT_IN_TOO_SMALL -1 #define TINICONV_CONVERT_OUT_TOO_SMALL -2 #define TINICONV_CONVERT_IN_ILSEQ -3 #define TINICONV_CONVERT_OUT_ILSEQ -4 EXPORT(int) tiniconv_convert(struct tiniconv_ctx_s *ctx, unsigned char const *in_buf, int in_size, int *p_in_size_consumed, unsigned char *out_buf, int out_size, int *p_out_size_consumed); #ifdef __cplusplus } #endif #endif /*TINICONV_H_*/ fldigi-4.2.05/src/common.rc0000664000175000017500000000210714532252172012373 00000000000000/* * This file is included by fldigirc.rc and flarqrc.rc, which must both define * RC_FILE_VERSION_QUAD and RC_FILE_DESCRIPTION and include config.h. */ #include VS_VERSION_INFO VERSIONINFO FILEVERSION RC_FILE_VERSION_QUAD PRODUCTVERSION RC_FILE_VERSION_QUAD FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", RC_FILE_DESCRIPTION "\0" VALUE "ProductVersion", PACKAGE_VERSION "\0" VALUE "FileVersion", PACKAGE_VERSION "." RC_BUILD_TIME "\0" VALUE "InternalName", PACKAGE_TARNAME "\0" VALUE "OriginalFilename", PACKAGE_TARNAME ".exe\0" VALUE "CompanyName", "\0" VALUE "LegalCopyright", PACKAGE_AUTHORS "\0" VALUE "Licence", "GPLv3+\0" VALUE "Info", "http://www.w1hkj.com/\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END fldigi-4.2.05/src/logbook/0000775000175000017500000000000014611714005012265 500000000000000fldigi-4.2.05/src/logbook/fd_view.cxx0000664000175000017500000005705414611711171014370 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "gettext.h" #include "fd_view.h" #include "configuration.h" Fl_Output *view_FD_call=(Fl_Output *)0; Fl_Output *view_FD_class=(Fl_Output *)0; Fl_Output *view_FD_section=(Fl_Output *)0; Fl_Output *view_FD_mult=(Fl_Output *)0; Fl_Output *view_FD_score=(Fl_Output *)0; Fl_Output *view_FD_CW[12]={(Fl_Output *)0}; Fl_Output *view_FD_CW_OP[12]={(Fl_Output *)0}; Fl_Output *view_FD_DIG[12]={(Fl_Output *)0}; Fl_Output *view_FD_DIG_OP[12]={(Fl_Output *)0}; Fl_Output *view_FD_PHONE[12]={(Fl_Output *)0}; Fl_Output *view_FD_PHONE_OP[12]={(Fl_Output *)0}; Fl_Input2 *inp_fd_tcpip_addr=(Fl_Input2 *)0; static void cb_inp_fd_tcpip_addr(Fl_Input2* o, void*) { progdefaults.fd_tcpip_addr=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_fd_tcpip_port=(Fl_Input2 *)0; static void cb_inp_fd_tcpip_port(Fl_Input2* o, void*) { progdefaults.fd_tcpip_port=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_fd_op_call=(Fl_Input2 *)0; static void cb_inp_fd_op_call(Fl_Input2* o, void*) { progdefaults.fd_op_call=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fd_connect=(Fl_Check_Button *)0; static void cb_btn_fd_connect(Fl_Check_Button* o, void*) { progdefaults.connect_to_fdserver=o->value(); if (progdefaults.connect_to_fdserver) { listbox_contest->index(LOG_FD); progdefaults.logging = LOG_FD; } else { listbox_contest->index(LOG_QSO); progdefaults.logging = LOG_QSO; } UI_select(); } Fl_Box *box_fdserver_connected=(Fl_Box *)0; Fl_Double_Window* make_fd_view() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(670, 270, _("Field Day Viewer - use with program \'fdserver\'")); w = o; if (w) {/* empty */} o->align(Fl_Align(FL_ALIGN_TOP_LEFT)); { Fl_Output* o = view_FD_call = new Fl_Output(59, 6, 77, 24, _("FD Call")); o->value(progdefaults.my_FD_call.c_str()); } // Fl_Output* view_FD_call { Fl_Output* o = view_FD_class = new Fl_Output(219, 5, 38, 24, _("FD Class")); o->value(progdefaults.my_FD_class.c_str()); } // Fl_Output* view_FD_class { Fl_Output* o = view_FD_section = new Fl_Output(341, 5, 38, 24, _("FD Section")); o->value(progdefaults.my_FD_section.c_str()); } // Fl_Output* view_FD_section { Fl_Output* o = view_FD_mult = new Fl_Output(462, 5, 38, 24, _("FD Mult")); o->value(progdefaults.my_FD_mult.c_str()); } // Fl_Output* view_FD_mult { view_FD_score = new Fl_Output(584, 5, 80, 24, _("Score")); } // Fl_Output* view_FD_score { view_FD_CW[0] = new Fl_Output(55, 49, 50, 24, _("CW")); view_FD_CW[0]->textfont(4); view_FD_CW[0]->textsize(12); } // Fl_Output* view_FD_CW[0] { view_FD_CW[1] = new Fl_Output(106, 49, 50, 24); view_FD_CW[1]->textfont(4); view_FD_CW[1]->textsize(12); view_FD_CW[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[1] { view_FD_CW[2] = new Fl_Output(156, 49, 50, 24); view_FD_CW[2]->textfont(4); view_FD_CW[2]->textsize(12); view_FD_CW[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[2] { view_FD_CW[3] = new Fl_Output(207, 49, 50, 24); view_FD_CW[3]->textfont(4); view_FD_CW[3]->textsize(12); view_FD_CW[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[3] { view_FD_CW[4] = new Fl_Output(258, 49, 50, 24); view_FD_CW[4]->textfont(4); view_FD_CW[4]->textsize(12); view_FD_CW[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[4] { view_FD_CW[5] = new Fl_Output(309, 49, 50, 24); view_FD_CW[5]->textfont(4); view_FD_CW[5]->textsize(12); view_FD_CW[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[5] { view_FD_CW[6] = new Fl_Output(360, 49, 50, 24); view_FD_CW[6]->textfont(4); view_FD_CW[6]->textsize(12); view_FD_CW[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[6] { view_FD_CW[7] = new Fl_Output(411, 49, 50, 24); view_FD_CW[7]->textfont(4); view_FD_CW[7]->textsize(12); view_FD_CW[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[7] { view_FD_CW[8] = new Fl_Output(462, 49, 50, 24); view_FD_CW[8]->textfont(4); view_FD_CW[8]->textsize(12); view_FD_CW[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[8] { view_FD_CW[9] = new Fl_Output(513, 49, 50, 24); view_FD_CW[9]->textfont(4); view_FD_CW[9]->textsize(12); view_FD_CW[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[9] { view_FD_CW[10] = new Fl_Output(564, 49, 50, 24); view_FD_CW[10]->textfont(4); view_FD_CW[10]->textsize(12); view_FD_CW[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[10] { view_FD_CW[11] = new Fl_Output(615, 49, 50, 24); view_FD_CW[11]->textfont(4); view_FD_CW[11]->textsize(12); view_FD_CW[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW[11] { view_FD_CW_OP[0] = new Fl_Output(55, 75, 50, 24, _("Oper\'")); view_FD_CW_OP[0]->textfont(4); view_FD_CW_OP[0]->textsize(12); } // Fl_Output* view_FD_CW_OP[0] { view_FD_CW_OP[1] = new Fl_Output(106, 73, 50, 24); view_FD_CW_OP[1]->textfont(4); view_FD_CW_OP[1]->textsize(12); view_FD_CW_OP[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[1] { view_FD_CW_OP[2] = new Fl_Output(156, 73, 50, 24); view_FD_CW_OP[2]->textfont(4); view_FD_CW_OP[2]->textsize(12); view_FD_CW_OP[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[2] { view_FD_CW_OP[3] = new Fl_Output(207, 73, 50, 24); view_FD_CW_OP[3]->textfont(4); view_FD_CW_OP[3]->textsize(12); view_FD_CW_OP[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[3] { view_FD_CW_OP[4] = new Fl_Output(258, 73, 50, 24); view_FD_CW_OP[4]->textfont(4); view_FD_CW_OP[4]->textsize(12); view_FD_CW_OP[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[4] { view_FD_CW_OP[5] = new Fl_Output(309, 73, 50, 24); view_FD_CW_OP[5]->textfont(4); view_FD_CW_OP[5]->textsize(12); view_FD_CW_OP[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[5] { view_FD_CW_OP[6] = new Fl_Output(360, 73, 50, 24); view_FD_CW_OP[6]->textfont(4); view_FD_CW_OP[6]->textsize(12); view_FD_CW_OP[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[6] { view_FD_CW_OP[7] = new Fl_Output(411, 73, 50, 24); view_FD_CW_OP[7]->textfont(4); view_FD_CW_OP[7]->textsize(12); view_FD_CW_OP[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[7] { view_FD_CW_OP[8] = new Fl_Output(462, 73, 50, 24); view_FD_CW_OP[8]->textfont(4); view_FD_CW_OP[8]->textsize(12); view_FD_CW_OP[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[8] { view_FD_CW_OP[9] = new Fl_Output(513, 73, 50, 24); view_FD_CW_OP[9]->textfont(4); view_FD_CW_OP[9]->textsize(12); view_FD_CW_OP[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[9] { view_FD_CW_OP[10] = new Fl_Output(564, 73, 50, 24); view_FD_CW_OP[10]->textfont(4); view_FD_CW_OP[10]->textsize(12); view_FD_CW_OP[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[10] { view_FD_CW_OP[11] = new Fl_Output(615, 73, 50, 24); view_FD_CW_OP[11]->textfont(4); view_FD_CW_OP[11]->textsize(12); view_FD_CW_OP[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_CW_OP[11] { view_FD_DIG[0] = new Fl_Output(55, 102, 50, 24, _("DIG")); view_FD_DIG[0]->textfont(4); view_FD_DIG[0]->textsize(12); } // Fl_Output* view_FD_DIG[0] { view_FD_DIG[1] = new Fl_Output(106, 103, 50, 24); view_FD_DIG[1]->textfont(4); view_FD_DIG[1]->textsize(12); view_FD_DIG[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[1] { view_FD_DIG[2] = new Fl_Output(156, 103, 50, 24); view_FD_DIG[2]->textfont(4); view_FD_DIG[2]->textsize(12); view_FD_DIG[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[2] { view_FD_DIG[3] = new Fl_Output(207, 103, 50, 24); view_FD_DIG[3]->textfont(4); view_FD_DIG[3]->textsize(12); view_FD_DIG[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[3] { view_FD_DIG[4] = new Fl_Output(258, 103, 50, 24); view_FD_DIG[4]->textfont(4); view_FD_DIG[4]->textsize(12); view_FD_DIG[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[4] { view_FD_DIG[5] = new Fl_Output(309, 103, 50, 24); view_FD_DIG[5]->textfont(4); view_FD_DIG[5]->textsize(12); view_FD_DIG[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[5] { view_FD_DIG[6] = new Fl_Output(360, 103, 50, 24); view_FD_DIG[6]->textfont(4); view_FD_DIG[6]->textsize(12); view_FD_DIG[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[6] { view_FD_DIG[7] = new Fl_Output(411, 103, 50, 24); view_FD_DIG[7]->textfont(4); view_FD_DIG[7]->textsize(12); view_FD_DIG[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[7] { view_FD_DIG[8] = new Fl_Output(462, 103, 50, 24); view_FD_DIG[8]->textfont(4); view_FD_DIG[8]->textsize(12); view_FD_DIG[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[8] { view_FD_DIG[9] = new Fl_Output(513, 103, 50, 24); view_FD_DIG[9]->textfont(4); view_FD_DIG[9]->textsize(12); view_FD_DIG[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[9] { view_FD_DIG[10] = new Fl_Output(564, 103, 50, 24); view_FD_DIG[10]->textfont(4); view_FD_DIG[10]->textsize(12); view_FD_DIG[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[10] { view_FD_DIG[11] = new Fl_Output(615, 103, 50, 24); view_FD_DIG[11]->textfont(4); view_FD_DIG[11]->textsize(12); view_FD_DIG[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG[11] { view_FD_DIG_OP[0] = new Fl_Output(55, 129, 50, 24, _("Oper\'")); view_FD_DIG_OP[0]->textfont(4); view_FD_DIG_OP[0]->textsize(12); } // Fl_Output* view_FD_DIG_OP[0] { view_FD_DIG_OP[1] = new Fl_Output(106, 128, 50, 24); view_FD_DIG_OP[1]->textfont(4); view_FD_DIG_OP[1]->textsize(12); view_FD_DIG_OP[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[1] { view_FD_DIG_OP[2] = new Fl_Output(156, 128, 50, 24); view_FD_DIG_OP[2]->textfont(4); view_FD_DIG_OP[2]->textsize(12); view_FD_DIG_OP[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[2] { view_FD_DIG_OP[3] = new Fl_Output(207, 128, 50, 24); view_FD_DIG_OP[3]->textfont(4); view_FD_DIG_OP[3]->textsize(12); view_FD_DIG_OP[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[3] { view_FD_DIG_OP[4] = new Fl_Output(258, 128, 50, 24); view_FD_DIG_OP[4]->textfont(4); view_FD_DIG_OP[4]->textsize(12); view_FD_DIG_OP[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[4] { view_FD_DIG_OP[5] = new Fl_Output(309, 128, 50, 24); view_FD_DIG_OP[5]->textfont(4); view_FD_DIG_OP[5]->textsize(12); view_FD_DIG_OP[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[5] { view_FD_DIG_OP[6] = new Fl_Output(360, 128, 50, 24); view_FD_DIG_OP[6]->textfont(4); view_FD_DIG_OP[6]->textsize(12); view_FD_DIG_OP[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[6] { view_FD_DIG_OP[7] = new Fl_Output(411, 128, 50, 24); view_FD_DIG_OP[7]->textfont(4); view_FD_DIG_OP[7]->textsize(12); view_FD_DIG_OP[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[7] { view_FD_DIG_OP[8] = new Fl_Output(462, 128, 50, 24); view_FD_DIG_OP[8]->textfont(4); view_FD_DIG_OP[8]->textsize(12); view_FD_DIG_OP[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[8] { view_FD_DIG_OP[9] = new Fl_Output(513, 128, 50, 24); view_FD_DIG_OP[9]->textfont(4); view_FD_DIG_OP[9]->textsize(12); view_FD_DIG_OP[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[9] { view_FD_DIG_OP[10] = new Fl_Output(564, 128, 50, 24); view_FD_DIG_OP[10]->textfont(4); view_FD_DIG_OP[10]->textsize(12); view_FD_DIG_OP[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[10] { view_FD_DIG_OP[11] = new Fl_Output(615, 128, 50, 24); view_FD_DIG_OP[11]->textfont(4); view_FD_DIG_OP[11]->textsize(12); view_FD_DIG_OP[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_DIG_OP[11] { view_FD_PHONE[0] = new Fl_Output(55, 156, 50, 24, _("PHONE")); view_FD_PHONE[0]->textfont(4); view_FD_PHONE[0]->textsize(12); } // Fl_Output* view_FD_PHONE[0] { view_FD_PHONE[1] = new Fl_Output(106, 158, 50, 24); view_FD_PHONE[1]->textfont(4); view_FD_PHONE[1]->textsize(12); view_FD_PHONE[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[1] { view_FD_PHONE[2] = new Fl_Output(156, 158, 50, 24); view_FD_PHONE[2]->textfont(4); view_FD_PHONE[2]->textsize(12); view_FD_PHONE[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[2] { view_FD_PHONE[3] = new Fl_Output(207, 158, 50, 24); view_FD_PHONE[3]->textfont(4); view_FD_PHONE[3]->textsize(12); view_FD_PHONE[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[3] { view_FD_PHONE[4] = new Fl_Output(258, 158, 50, 24); view_FD_PHONE[4]->textfont(4); view_FD_PHONE[4]->textsize(12); view_FD_PHONE[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[4] { view_FD_PHONE[5] = new Fl_Output(309, 158, 50, 24); view_FD_PHONE[5]->textfont(4); view_FD_PHONE[5]->textsize(12); view_FD_PHONE[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[5] { view_FD_PHONE[6] = new Fl_Output(360, 158, 50, 24); view_FD_PHONE[6]->textfont(4); view_FD_PHONE[6]->textsize(12); view_FD_PHONE[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[6] { view_FD_PHONE[7] = new Fl_Output(411, 158, 50, 24); view_FD_PHONE[7]->textfont(4); view_FD_PHONE[7]->textsize(12); view_FD_PHONE[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[7] { view_FD_PHONE[8] = new Fl_Output(462, 158, 50, 24); view_FD_PHONE[8]->textfont(4); view_FD_PHONE[8]->textsize(12); view_FD_PHONE[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[8] { view_FD_PHONE[9] = new Fl_Output(513, 158, 50, 24); view_FD_PHONE[9]->textfont(4); view_FD_PHONE[9]->textsize(12); view_FD_PHONE[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[9] { view_FD_PHONE[10] = new Fl_Output(564, 158, 50, 24); view_FD_PHONE[10]->textfont(4); view_FD_PHONE[10]->textsize(12); view_FD_PHONE[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[10] { view_FD_PHONE[11] = new Fl_Output(615, 158, 50, 24); view_FD_PHONE[11]->textfont(4); view_FD_PHONE[11]->textsize(12); view_FD_PHONE[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE[11] { view_FD_PHONE_OP[0] = new Fl_Output(55, 183, 50, 24, _("Oper\'")); view_FD_PHONE_OP[0]->textfont(4); view_FD_PHONE_OP[0]->textsize(12); } // Fl_Output* view_FD_PHONE_OP[0] { view_FD_PHONE_OP[1] = new Fl_Output(106, 183, 50, 24); view_FD_PHONE_OP[1]->textfont(4); view_FD_PHONE_OP[1]->textsize(12); view_FD_PHONE_OP[1]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[1] { view_FD_PHONE_OP[2] = new Fl_Output(156, 183, 50, 24); view_FD_PHONE_OP[2]->textfont(4); view_FD_PHONE_OP[2]->textsize(12); view_FD_PHONE_OP[2]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[2] { view_FD_PHONE_OP[3] = new Fl_Output(207, 183, 50, 24); view_FD_PHONE_OP[3]->textfont(4); view_FD_PHONE_OP[3]->textsize(12); view_FD_PHONE_OP[3]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[3] { view_FD_PHONE_OP[4] = new Fl_Output(258, 183, 50, 24); view_FD_PHONE_OP[4]->textfont(4); view_FD_PHONE_OP[4]->textsize(12); view_FD_PHONE_OP[4]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[4] { view_FD_PHONE_OP[5] = new Fl_Output(309, 183, 50, 24); view_FD_PHONE_OP[5]->textfont(4); view_FD_PHONE_OP[5]->textsize(12); view_FD_PHONE_OP[5]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[5] { view_FD_PHONE_OP[6] = new Fl_Output(360, 183, 50, 24); view_FD_PHONE_OP[6]->textfont(4); view_FD_PHONE_OP[6]->textsize(12); view_FD_PHONE_OP[6]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[6] { view_FD_PHONE_OP[7] = new Fl_Output(411, 183, 50, 24); view_FD_PHONE_OP[7]->textfont(4); view_FD_PHONE_OP[7]->textsize(12); view_FD_PHONE_OP[7]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[7] { view_FD_PHONE_OP[8] = new Fl_Output(462, 183, 50, 24); view_FD_PHONE_OP[8]->textfont(4); view_FD_PHONE_OP[8]->textsize(12); view_FD_PHONE_OP[8]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[8] { view_FD_PHONE_OP[9] = new Fl_Output(513, 183, 50, 24); view_FD_PHONE_OP[9]->textfont(4); view_FD_PHONE_OP[9]->textsize(12); view_FD_PHONE_OP[9]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[9] { view_FD_PHONE_OP[10] = new Fl_Output(564, 183, 50, 24); view_FD_PHONE_OP[10]->textfont(4); view_FD_PHONE_OP[10]->textsize(12); view_FD_PHONE_OP[10]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[10] { view_FD_PHONE_OP[11] = new Fl_Output(615, 183, 50, 24); view_FD_PHONE_OP[11]->textfont(4); view_FD_PHONE_OP[11]->textsize(12); view_FD_PHONE_OP[11]->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Output* view_FD_PHONE_OP[11] { Fl_Box* o = new Fl_Box(60, 33, 40, 17, _("160")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(111, 33, 40, 17, _("80")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(161, 33, 40, 17, _("40")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(212, 33, 40, 17, _("20")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(263, 33, 40, 17, _("17")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(314, 33, 40, 17, _("15")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(365, 33, 40, 17, _("12")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(416, 33, 40, 17, _("10")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(467, 33, 40, 17, _("6")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(518, 33, 40, 17, _("2")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(569, 33, 40, 17, _("220")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Box* o = new Fl_Box(620, 33, 40, 17, _("440")); o->box(FL_FLAT_BOX); } // Fl_Box* o { Fl_Group* o = new Fl_Group(5, 212, 660, 55, _("\"fdserver\" Client")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = inp_fd_tcpip_addr = new Fl_Input2(85, 234, 150, 24, _("tcpip addr")); inp_fd_tcpip_addr->tooltip(_("fdserver tcipip address")); inp_fd_tcpip_addr->box(FL_DOWN_BOX); inp_fd_tcpip_addr->color(FL_BACKGROUND2_COLOR); inp_fd_tcpip_addr->selection_color(FL_SELECTION_COLOR); inp_fd_tcpip_addr->labeltype(FL_NORMAL_LABEL); inp_fd_tcpip_addr->labelfont(0); inp_fd_tcpip_addr->labelsize(14); inp_fd_tcpip_addr->labelcolor(FL_FOREGROUND_COLOR); inp_fd_tcpip_addr->callback((Fl_Callback*)cb_inp_fd_tcpip_addr); inp_fd_tcpip_addr->align(Fl_Align(FL_ALIGN_LEFT)); inp_fd_tcpip_addr->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_tcpip_addr.c_str()); } // Fl_Input2* inp_fd_tcpip_addr { Fl_Input2* o = inp_fd_tcpip_port = new Fl_Input2(273, 234, 75, 24, _("port")); inp_fd_tcpip_port->tooltip(_("fdserver tcpip port")); inp_fd_tcpip_port->box(FL_DOWN_BOX); inp_fd_tcpip_port->color(FL_BACKGROUND2_COLOR); inp_fd_tcpip_port->selection_color(FL_SELECTION_COLOR); inp_fd_tcpip_port->labeltype(FL_NORMAL_LABEL); inp_fd_tcpip_port->labelfont(0); inp_fd_tcpip_port->labelsize(14); inp_fd_tcpip_port->labelcolor(FL_FOREGROUND_COLOR); inp_fd_tcpip_port->callback((Fl_Callback*)cb_inp_fd_tcpip_port); inp_fd_tcpip_port->align(Fl_Align(FL_ALIGN_LEFT)); inp_fd_tcpip_port->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_tcpip_port.c_str()); } // Fl_Input2* inp_fd_tcpip_port { Fl_Input2* o = inp_fd_op_call = new Fl_Input2(402, 234, 90, 24, _("OP call")); inp_fd_op_call->tooltip(_("free form exchange")); inp_fd_op_call->box(FL_DOWN_BOX); inp_fd_op_call->color(FL_BACKGROUND2_COLOR); inp_fd_op_call->selection_color(FL_SELECTION_COLOR); inp_fd_op_call->labeltype(FL_NORMAL_LABEL); inp_fd_op_call->labelfont(0); inp_fd_op_call->labelsize(14); inp_fd_op_call->labelcolor(FL_FOREGROUND_COLOR); inp_fd_op_call->callback((Fl_Callback*)cb_inp_fd_op_call); inp_fd_op_call->align(Fl_Align(FL_ALIGN_LEFT)); inp_fd_op_call->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_op_call.c_str()); } // Fl_Input2* inp_fd_op_call { Fl_Check_Button* o = btn_fd_connect = new Fl_Check_Button(502, 236, 70, 20, _("Connect")); btn_fd_connect->tooltip(_("Connect / Disconnect^jAddr/Port/OP required")); btn_fd_connect->down_box(FL_DOWN_BOX); btn_fd_connect->callback((Fl_Callback*)cb_btn_fd_connect); o->value(progdefaults.connect_to_fdserver); } // Fl_Check_Button* btn_fd_connect { box_fdserver_connected = new Fl_Box(608, 237, 18, 18, _("Connected")); box_fdserver_connected->box(FL_ROUND_DOWN_BOX); box_fdserver_connected->color((Fl_Color)31); box_fdserver_connected->align(Fl_Align(FL_ALIGN_TOP)); } // Fl_Box* box_fdserver_connected o->end(); } // Fl_Group* o o->end(); } // Fl_Double_Window* o return w; } fldigi-4.2.05/src/logbook/calendar.cxx0000664000175000017500000003062714611711171014513 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "pixmaps.h" #include "calendar.h" void popcal_cb (Fl_Widget *v, long d); static void fl_calendar_button_cb (Fl_Button *a, void *b) { long j=0; Fl_Calendar *c = (Fl_Calendar *)b; Fl_Button *sb; int numdays = c->daysinmonth () + 1; for (int i=1; i < numdays; i++) { sb = c->day_button(i); sb->color (52); if (a == sb) { c->Day (i); j = i; sb->color (sb->selection_color()); if (c->target) { ((Fl_Input2 *)(c->target))->value(c->szDate(c->calfmt)); (c->target)->redraw(); } } } c->redraw(); c->do_callback(c, j); } void Fl_Calendar_Base::setTarget (Fl_Widget *tgt) { target = tgt; } Fl_Calendar_Base::Fl_Calendar_Base (int x, int y, int w, int h, const char *l) : Fl_Group (x, y, w, h, l), Date () { int i; for (i = 0; i<(7*6); i++) { days[i] = new Fl_Button ((w/7)*(i%7) + x, (h/6)*(i/7) + y, (w/7), (h/6)); days[i]->down_box (FL_THIN_DOWN_BOX); days[i]->labelsize (10); days[i]->box (FL_THIN_UP_BOX); days[i]->color (52); days[i]->callback ((Fl_Callback*)&fl_calendar_button_cb, (void *)this); } calfmt = 0; } void Fl_Calendar_Base::csize (int cx, int cy, int cw, int ch) { int i; for (i = 0; i<(7*6); i++) { days[i]->resize ((cw/7)*(i%7) + cx, (ch/6)*(i/7) + cy, (cw/7), (ch/6)); } } void Fl_Calendar_Base::update () { int dow = dayofweek (Year(), Month(), 1); int dim = daysinmonth (Month(), isleapyear (Year())); int i; for (i=0; ihide (); } for (i=(dim+dow); i<(6*7); i++) { days[i]->hide (); } for (i=dow; i<(dim+dow); i++) { char t[12]; snprintf (t, sizeof(t), "%d", (i-dow+1)); days[i]->label (strdup(t)); days[i]->color (52); if ((i-dow+1) == Day()) days[i]->color (selection_color()); days[i]->show (); } } Fl_Button * Fl_Calendar_Base::day_button (int i) { if ((i > 0) && (i <= daysinmonth ())) return days[i + dayofweek (Year(), Month(), 1) - 1]; return 0; } static void fl_calendar_prv_month_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->previous_month (); c->do_callback(c, (long)0); } static void fl_calendar_nxt_month_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->next_month (); c->do_callback(c, (long)0); } static void fl_calendar_prv_year_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->previous_year (); c->do_callback(c, (long)0); } static void fl_calendar_nxt_year_cb (Fl_Button *, void *b) { Fl_Calendar *c = (Fl_Calendar *)b; c->next_year (); c->do_callback(c, (long)0); } Fl_Calendar::Fl_Calendar (int x, int y, int w, int h, const char *l) : Fl_Calendar_Base (x, y, w, h, l) { int i, bw; for (i = 0; i<7; i++) { // weekdays[i] = new Fl_Button ((w/7)*(i%7) + x, weekdays[i] = new Fl_Box ((w/7)*(i%7) + x, (h/8)*((i/7)+1) + y, (w/7), (h/8)); weekdays[i]->box (FL_THIN_UP_BOX); weekdays[i]->labelsize (10); weekdays[i]->color (52); } weekdays[SUNDAY]->label ("S"); weekdays[MONDAY]->label ("M"); weekdays[TUESDAY]->label ("T"); weekdays[WEDNESDAY]->label ("W"); weekdays[THURSDAY]->label ("T"); weekdays[FRIDAY]->label ("F"); weekdays[SATURDAY]->label ("S"); bw = w/10 < 16 ? 16 : w/10; prv_year = new Fl_Button (x, y, bw, (h/8), "@<<"); prv_year->box (FL_THIN_UP_BOX); prv_year->labeltype (FL_SYMBOL_LABEL); prv_year->labelsize (10); prv_year->down_box (FL_THIN_DOWN_BOX); prv_year->callback ((Fl_Callback*)&fl_calendar_prv_year_cb, (void *)this); prv_month = new Fl_Button (x + bw, y, bw, (h/8), "@<"); prv_month->box (FL_THIN_UP_BOX); prv_month->labeltype (FL_SYMBOL_LABEL); prv_month->labelsize (10); prv_month->down_box (FL_THIN_DOWN_BOX); prv_month->callback ((Fl_Callback*)&fl_calendar_prv_month_cb, (void *)this); nxt_month = new Fl_Button (x + w - 2*bw, y, bw, (h/8), "@>"); nxt_month->box (FL_THIN_UP_BOX); nxt_month->labeltype (FL_SYMBOL_LABEL); nxt_month->labelsize (10); nxt_month->down_box (FL_THIN_DOWN_BOX); nxt_month->callback ((Fl_Callback*)&fl_calendar_nxt_month_cb, (void *)this); nxt_year = new Fl_Button (x + w - bw, y, bw, (h/8), "@>>"); nxt_year->box (FL_THIN_UP_BOX); nxt_year->labeltype (FL_SYMBOL_LABEL); nxt_year->labelsize (10); nxt_year->down_box (FL_THIN_DOWN_BOX); nxt_year->callback ((Fl_Callback*)&fl_calendar_nxt_year_cb, (void *)this); // caption = new Fl_Button (x + (w/10)*2, y, (6*w/10), (h/8)); caption = new Fl_Box (x + 2*bw, y, w - 4*bw, (h/8)); caption->box (FL_THIN_UP_BOX); caption->labeltype (FL_SYMBOL_LABEL); caption->labelfont (1); if (bw < 20) caption->labelsize (9); else caption->labelsize (11); // caption->down_box (FL_THIN_DOWN_BOX); Fl_Calendar_Base::csize (x, y + (2*h/8), w, (6*h/8)); target = 0; update (); } void Fl_Calendar::csize (int cx, int cy, int cw, int ch) { int i; for (i = 0; i<7; i++) { // weekdays[i] = new Fl_Button ((cw/7)*(i%7) + cx, weekdays[i] = new Fl_Box ((cw/7)*(i%7) + cx, (ch/8)*((i/7)+1) + cy, (cw/7), (ch/8)); } prv_month->resize (cx + (cw/10), cy, (cw/10), (ch/8)); nxt_month->resize (cx + (cw/10)*8, cy, (cw/10), (ch/8)); prv_year->resize (cx, cy, (cw/10), (ch/8)); nxt_year->resize (cx + (cw/10)*9, cy, (cw/10), (ch/8)); caption->resize (cx + (cw/10)*2, cy, (cw/10)*6, (ch/8)); Fl_Calendar_Base::csize (cx, cy + (2*ch/8), cw, (6*ch/8)); } void Fl_Calendar::update () { int dow = dayofweek (Year(), Month(), 1); int dim = daysinmonth (Month(), isleapyear (Year())); int i; for (i=dow; i<(dim+dow); i++) { char t[12]; snprintf (t, sizeof(t), "%d", (i-dow+1)); days[i]->label (strdup(t)); } char tmp[32]; snprintf (tmp, sizeof(tmp), "%s %d", month_name[Month()-1], Year()); Fl_Calendar_Base::update (); if (caption->label ()) free ((void *) caption->label ()); caption->label (strdup(tmp)); redraw (); } void Fl_Calendar::today () { Date::today(); update (); } void Fl_Calendar::previous_month () { Date::previous_month(); update (); } void Fl_Calendar::next_month () { Date::next_month(); update (); } void Fl_Calendar::previous_year () { Date::previous_year(); update (); } void Fl_Calendar::next_year () { Date::next_year(); update (); } void Fl_Calendar::setDate(int m, int d, int y) { Date::setDate(m,d,y); } int Fl_Calendar::handle (int event) { int m, d, y, o, md; switch (event) { case FL_FOCUS: case FL_UNFOCUS: return 1; case FL_KEYBOARD: m = Month (); d = Day (); y = Year (); switch(Fl::event_key ()) { case FL_Enter: do_callback(this, d); return 1; break; case FL_Up: o = -7; break; case FL_Down: o = 7; break; case FL_Right: o = 1; break; case FL_Left: o = -1; break; case FL_Page_Up: previous_month (); return 1; case FL_Page_Down: next_month (); return 1; default: return Fl_Group::handle (event); } if (datevalid (y, m, d + o)) setDate (m, d + o, y); else { if (o < 0) { previous_month (); m = Month (); y = Year (); md = daysinmonth (m, isleapyear (y)); d = d + o + md; setDate (m, d, y); } else { md = daysinmonth (m, isleapyear (y)); next_month (); m = Month (); y = Year (); d = d + o - md; setDate (m, d, y); } } return 1; } return Fl_Group::handle (event); } // Popup Calendar class Fl_PopCal::Fl_PopCal (int X, int Y, int W, int H, Fl_Input2 * tgt) : Fl_Window (X, Y, W, H, "") { target = tgt; clear_border(); box(FL_UP_BOX); // popcal = new Fl_Calendar(2, 2); popcal = new Fl_Calendar(2, 2, W-4, H-4); popcal->callback ( (Fl_Callback*)popcal_cb); end(); } Fl_PopCal::~Fl_PopCal () { } void Fl_PopCal::popcalfmt (int i) { popcalfmt_ = i; } int Fl_PopCal::popcalfmt () { return popcalfmt_; } void Fl_PopCal::setDate (int m, int d, int y) { popcal->setDate (m,d,y); popcal->update(); } int Fl_PopCal::handle(int event) { int ex = Fl::event_x_root(), ey = Fl::event_y_root(); if (event == FL_PUSH) { if ( ex < x() || ex > (x() + w()) || ey < y() || ey > (y() + h()) ) { pophide(); return 1; } } if (Fl_Group::handle(event)) return 1; return 0; } void Fl_PopCal::popposition (int x, int y) { position (x, y); } void Fl_PopCal::popshow () { show (); Fl::grab(this); } void Fl_PopCal::pophide () { hide (); Fl::release(); } void Fl_PopCal::popcal_cb_i (Fl_Widget *v, long d) { int ey = Fl::event_y_root(); Fl_PopCal *me = (Fl_PopCal *)(v->parent()); Fl_Input2 *tgt = me->target; if (ey > me->y() + 40) { if (d && tgt) tgt->value (((Fl_Calendar *)v)->szDate (me->popcalfmt_)); me->pophide(); } return; } void popcal_cb (Fl_Widget *v, long d) { ((Fl_PopCal *)(v))->popcal_cb_i (v, d); return; } void Fl_DateInput::fl_popcal() { Fl_Widget *who = this, *parent; int xpos = who->x(), ypos = who->h() + who->y(); int w = who->w(), h; int m = 0, d = 0, y = 0; w = w < 140 ? 140 : w; w = w - (w % 7); h = 8*(w/7); w += 4; h += 4; parent = who; while (parent) { who = parent; parent = parent->parent(); if (parent == 0) { xpos += who->x(); ypos += who->y(); } } if (!Cal) // Cal = new Fl_PopCal(xpos, ypos, 7*20+4, 8*20+4, Input); Cal = new Fl_PopCal(xpos, ypos, w, h, Input); else Cal->popposition(xpos, ypos); if (popcalfmt_ < 3) { switch (popcalfmt_) { case 0: case 1: sscanf(Input->value(), "%d/%d/%d", &m, &d, &y); break; case 2: default: sscanf(Input->value(),"%4d%2d%2d", &y, &m, &d); break; } if (y < 10) y+=2000; if (y < 100) y+=1900; Cal->setDate (m,d,y); } Cal->popcalfmt (popcalfmt_); Cal->popshow(); return; } void btnDateInput_cb (Fl_Widget *v, void *d) { ((Fl_DateInput *)(v->parent()))->fl_popcal (); return; } Fl_DateInput::Fl_DateInput (int X,int Y,int W,int H, const char *L) : Fl_Group (X, Y, W, H, 0) { Btn = new Fl_Button (X + W - H, Y, H, H); (new Fl_Pixmap (time_icon))->label (Btn); Btn->callback ((Fl_Callback *)btnDateInput_cb, 0); Input = new Fl_Input2 (X, Y, W-H, H, L); popcalfmt_ = 0; Cal = 0; end(); } void Fl_DateInput::align (Fl_Align how) { Input->align(how); } // DateInput value is contained in the Input widget void Fl_DateInput::value( const char *s ) { Input->value (s); } const char *Fl_DateInput::value() { return (Input->value ()); } void Fl_DateInput::textfont(int tf) { Input->textfont (tf); } void Fl_DateInput::textsize(int sz) { Input->textsize (sz); } void Fl_DateInput::textcolor(Fl_Color c) { Input->textcolor(c); } void Fl_DateInput::color(Fl_Color c) { Input->color(c); } void Fl_DateInput::labelfont(int fnt) { Input->labelfont(fnt); } void Fl_DateInput::labelsize(int size) { Input->labelsize(size); } void Fl_DateInput::labelcolor(int clr) { Input->labelcolor(clr); } void Fl_DateInput::format (int fmt) { switch (fmt) { case 0: case 1: case 2: case 3: case 4: popcalfmt_ = fmt; break; default : popcalfmt_ = 0; } } void Fl_DateInput::take_focus() { Input->take_focus(); } fldigi-4.2.05/src/logbook/contest.cxx0000664000175000017500000007150114611711171014415 00000000000000// ---------------------------------------------------------------------------- // contest.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "fl_digi.h" #include "confdialog.h" #include "contest.h" #include "icons.h" #include "dxcc.h" #include "strutil.h" static std::string SECTIONS = "\ DX \ CT RI EMA VT ME WMA NH \ ENY NNY NLI SNJ NNJ WHY \ DE MDC EPA WPA \ AL GA KY NC NFL PR SC SFL TN VA \ VI WCF AR LA MS NM NTX OK STX WTX \ EB LAX ORG PAC SB SCV SDG SF SJV SV \ AK AZ EWA ID MT NV OR UT WWA WY \ MI OH WV \ IL IN WI \ CO IA KS MN MO ND NE SD \ AB BC GTA MAR MB NL NT ONE ONN ONS QC SK "; static std::string STATES = "\ DX CT MA ME NH RI VT \ NY NJ \ DE PA MD DC \ AL FL GA KY NC SC TN VA \ AR LA MS NM OK TX \ CA HI \ AK AZ ID MT NV OR UT WA WY \ MI OH WV \ IL WI IN \ CO IA KS MN MO ND NE SD "; static std::string PROVINCES = "\ AB BC LB MB NB NF NS NU NWT ON PEI QC SK YT "; static std::string MEXICO = "\ XE1 XE2 XE3 XF1 XF4 "; static std::string IT1_ = "AL AT BI CN GE IM NO SP SV TO VB VC "; static std::string IX1_ = "AO "; static std::string IT2_ = "BG BS CO CR LC LO MB MI MN PV SO VA "; static std::string IT3_ = "BL PD RO TV VE VI VR "; static std::string IN3_ = "BZ TN "; static std::string IV3_ = "GO PN TS UD "; static std::string IT4_ = "BO FC FE MO PC PR RA RE RN "; static std::string IT5_ = "AR FI GR LI LU MS PI PO PT SI "; static std::string IT6_ = "AN AP AQ CH FM MC PE PS PU TE "; static std::string IT7_ = "BA BR BT FG LE MT TA "; static std::string IT8_ = "AV BN CB CE CS CZ IS KR NA PZ RC SA VV "; static std::string IT0_ = "FR LT PG RI RM TR VT "; static std::string IT9_ = "AG CL CT EN ME PA RG SR TP "; static std::string IS0_ = "CA NU OR SS SU "; static const std::vector* dxcc_list; std::string country_match = ""; bool class_test(std::string s) { if (s.length() < 2) return false; static std::string clss = "ABCDEF"; if (clss.find(toupper(s[s.length()-1])) == std::string::npos) return false; for (size_t n = 0; n < s.length() - 1; n++) if (s[n] < '0' || s[n] > '9') return false; return true; } bool state_test(std::string s) { if (s.empty()) return false; while (s.length() < 4) s.append(" "); bool isState = (STATES.find(ucasestr(s)) != std::string::npos); return isState; } bool county_test(std::string st, std::string cty) { if (st.empty() && !progdefaults.SQSOinstate) st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (!state_test(st)) return false; return states.valid_county( st, cty ); } bool province_test(std::string s) { while (s.length() < 4) s.append(" "); return (PROVINCES.find(ucasestr(s)) != std::string::npos); } bool district_test(std::string pr, std::string dist) { if (pr.empty() && !progdefaults.SQSOinstate) pr = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (!province_test(pr)) return false; return states.valid_county( pr, dist ); } bool check_test(std::string s) { if (s.length() < 4) { while (s.length() < 4) s.append(" "); std::string CHECK = std::string(STATES).append(PROVINCES).append(MEXICO); return (CHECK.find(s) != std::string::npos); } else return false; } bool country_test(std::string s) { std::string str = ucasestr(s); dxcc_list = dxcc_entity_list(); if (!dxcc_list) return true; for (std::vector::const_iterator i = dxcc_list->begin(); i != dxcc_list->end(); ++i) { if (ucasestr((*i)->country).find(str) != std::string::npos) { country_match = (*i)->country; return true; } } country_match.clear(); return false; } bool wfd_class_test(std::string s) { if (s.length() < 2) return false; static std::string clss = "IOH"; if (clss.find(toupper(s[s.length()-1])) == std::string::npos) return false; for (size_t n = 0; n < s.length() - 1; n++) if (s[n] < '0' || s[n] > '9') return false; return true; } bool ascr_class_test(std::string s) { if (s.length() != 1) return false; if (toupper(s[0]) == 'I' || toupper(s[0]) == 'C' || toupper(s[0]) == 'S') return true; return false; } bool section_test(std::string s) { while (s.length() < 4) s.append(" "); return (SECTIONS.find(s) != std::string::npos); } bool rookie_test(std::string s) { int year_licensed = 0; if (!sscanf(s.c_str(), "%d", &year_licensed)) return false; if (year_licensed < 100) year_licensed += 2000; int year_worked = 0; std::string s_year = std::string(zdate()).substr(0,4); sscanf(s_year.c_str(), "%d", &year_worked); if (year_worked < year_licensed) year_licensed -= 100; if (year_worked - year_licensed < 3) return true; return false; } bool c1010_test(std::string s) { for (size_t n = 0; n < s.length(); n++) if (s[n] < '0' || s[n] > '9') return false; return true; } static std::string nbrs0 = "1234567890"; static std::string nbrs1 = "12345"; static std::string nbrs2 = "123456789Nn"; static std::string nbrs3 = "1234567890NnTt"; std::string cut_to_numeric(std::string s) { for (size_t n = 0; n < s.length(); n++) { if (s[n] == 'N' || s[n] == 'n' ) s[n] = '9'; if (s[n] == 'T' || s[n] == 't' ) s[n] = '0'; } return s; } bool cut_numeric_test(std::string s) { if (s.empty()) return false; for (size_t n = 0; n < s.length(); n++) if (nbrs3.find(s[n]) == std::string::npos) return false; return true; } bool numeric_test(std::string s) { if (s.empty()) return false; for (size_t n = 0; n < s.length(); n++) if (nbrs0.find(s[n]) == std::string::npos) return false; return true; } bool rst_test(std::string s) { if (s.length() < 3 && active_modem->get_mode() < MODE_SSB) return false; if (s.length() < 2 || s.length() > 3) return false; if (s[0] == '0') return false; if (s.length() == 2) { if (nbrs1.find(s[0]) == std::string::npos) return false; if (nbrs2.find(s[1]) == std::string::npos) return false; } else { if (nbrs1.find(s[0]) == std::string::npos) return false; if (nbrs2.find(s[1]) == std::string::npos) return false; if (nbrs2.find(s[2]) == std::string::npos) return false; } return true; } bool italian_test(std::string s) { if (s.length() != 2) return false; s.append(" "); if (IT1_.find(s) != std::string::npos || IX1_.find(s) != std::string::npos || IT2_.find(s) != std::string::npos || IT3_.find(s) != std::string::npos || IN3_.find(s) != std::string::npos || IV3_.find(s) != std::string::npos || IT4_.find(s) != std::string::npos || IT5_.find(s) != std::string::npos || IT6_.find(s) != std::string::npos || IT7_.find(s) != std::string::npos || IT8_.find(s) != std::string::npos || IT0_.find(s) != std::string::npos || IT9_.find(s) != std::string::npos || IS0_.find(s) != std::string::npos ) return true; return false; } bool ss_chk_test(std::string s) { std::string nums = "0123456789"; if (nums.find(s[0]) != std::string::npos && nums.find(s[0]) != std::string::npos) return true; return false; } bool ss_prec_test(std::string s) { std::string prec = "QABUMS"; if (prec.find(ucasestr(s)[0]) != std::string::npos) return true; return false; } int check_field(std::string s, CONTEST_FIELD field, std::string s2) { switch (field) { case cSTATE: return state_test(s); break; case cVE_PROV: return province_test(s); break; case cCHECK: return check_test(s); break; case cCOUNTRY: return country_test(s); break; case cCLASS: case cFD_CLASS: return class_test(s); break; case cWFD_CLASS: return wfd_class_test(s); break; case cASCR_CLASS: return ascr_class_test(s); break; case cARRL_SECT: case cFD_SECTION: return section_test(s); break; case cROOKIE: return rookie_test(s); break; case c1010: return c1010_test(s); break; case cRST: return rst_test(s); break; case cSRX: case cNUMERIC: return numeric_test(s); break; case cITALIAN: return italian_test(s); break; case cCNTY: return county_test(s2, s); break; case cDIST: return district_test(s2, s); break; case cSS_CHK: return ss_chk_test(s); break; case cSS_PREC: return ss_prec_test(s); break; case cSS_SERNO: return numeric_test(s); break; case cSS_SEC: return section_test(s); break; case cNAME: break; case cQTH: break; case cGRIDSQUARE: break; case cXCHG1: break; case cKD_XCHG: break; case cARR_XCHG: break; case cCQZ: break; default: break; } return true; } CONTESTS contests[] = { { "No Contest", "CALL if (RSTr), if (LOCATOR), NAME, QTH" }, { "Generic contest", "CALL EXCHANGE" }, { "Africa All-Mode International", "CALL SERNO, COUNTRY, RSTr, RSTs" }, { "ARRL Field Day", "CALL SECTION, CLASS, RSTr, RSTs" }, { "ARRL International DX (cw)", "CALL COUNTRY, POWER, RSTr, RSTs" }, { "ARRL Jamboree on the Air", "CALL TROOP_NO, STATE / VE_PROV / COUNTRY, RSTr, RSTs, SCOUT_NAME" }, { "ARRL Kids Day", "CALL, NAME, AGE, QTH, COMMENT, RSTr, RSTs" }, { "ARRL Rookie Roundup", "CALL, NAME, CHECK, STATE / VE_PROV, RSTr, RSTs" }, { "ARRL RTTY Roundup", "CALL STATE, SERNO, COUNTRY, RSTr, RSTs" }, { "ARRL School Club Roundup", "CALL CLASS, STATE / VE_PROV, NAME, RSTr, RSTs" }, { "ARRL November Sweepstakes", "CALL SECTION, SERNO, PREC, CHECK, RSTr, RSTs" }, { "ARRL Winter FD", "CALL SECTION, CLASS, RSTr, RSTs" }, { "BARTG RTTY contest", "CALL NAME, SERIAL, EXCHANGE" }, { "CQ WPX", "CALL SERNO, COUNTRY, RSTr, RSTs" }, { "CQ WW DX", "CALL COUNTRY, ZONE, RSTr, RSTs" }, { "CQ WW DX RTTY", "CALL STATE, COUNTRY, ZONE, RSTr" }, { "Italian A.R.I. International DX", "CALL PR(ovince), COUNTRY, SERNO, RSTr, RSTs" }, { "NAQP", "CALL NAME, STATE / VE_PROV / COUNTRY" }, { "NA Sprint", "CALL SERNO, STATE / VE_PROV / COUNTRY, NAME, RSTr, RSTs" }, { "Ten Ten", "CALL 1010NR, STATE, NAME, RSTr, RSTs" }, { "VHF", "CALL RSTr, RSTs" }, //{ "Worked All Europe", "CALL SERNO, COUNTRY, RSTr, RSTs" }, { "State QSO parties", "" }, { "", "" } }; struct QSOP Ccontests::qso_parties[] = { /* {"QSO Party Contest", "ST", "in", "rRST","rST","rCY","rSER","rXCHG","rNAM","rCAT", "STCTY", "Notes"}, */ {"None selected", "", "", "", "", "", "", "", "", "", "", "CALL if (RSTr), if (LOCATOR), NAME, QTH" }, {"Alabama QSO Party", "AL", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"ALQP (Out of State)", "AL", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Arizona QSO Party", "AZ", "T", "B", "B", "B", "" , "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"AZQP (Out of State)", "AZ", "", "B", "B", "B", "" , "", "", "", "", "CALL RST CNTY"}, {"Arkansas QSO Party", "AR", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"ARQP (Out of State)", "AR", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"British Columbia QSO Party", "BC", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"BCQP (Out of Province)", "BC", "", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY"}, {"California QSO Party", "CA", "T", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY ST/PR/CNTRY"}, {"CAQP (Out of State)", "CA", "", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY"}, {"Colorado QSO Party", "CO", "T", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY ST/PR/CNTRY"}, {"COQP (Out of State)", "CO", "", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY"}, {"Delaware QSO Party", "DE", "T", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"DEQP (Out of State)", "DE", "", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY"}, {"Florida QSO Party", "FL", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"FLQP (Out of State)", "FL", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Georgia QSO Party", "GA", "T", "B", "B", "B", "", "" , "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"GAQP (Out of State)", "GA", "", "B", "B", "B", "", "" , "", "", "", "CALL RST CNTY"}, {"Hawaii QSO Party", "HI", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"HIQP (Out of State)", "HI", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Idaho QSO Party", "ID", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"IDQP (Out of State)", "ID", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Illinois QSO Party", "IL", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"ILQP (Out of State)", "IL", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Indiana QSO Party", "IN", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"INQP (Out of State)", "IN", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Iowa QSO Party", "IA", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"IAQP (Out of State)", "IA", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Kansas QSO Party", "KS", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"KSQP (Out of State)", "KS", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Kentucky QSO Party", "KY", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"KYQP (Out of State)", "KY", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Louisiana QSO Party", "LA", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"LAQP (Out of State)", "LA", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Maine QSO Party", "ME", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"MEQP (Out of State)", "ME", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Maryland QSO Party", "MD", "T", "", "B", "B", "", "", "", "B", "", "CALL CAT CNTY ST/PR/CNTRY"}, {"MDQP (Out of State)", "MD", "", "", "B", "B", "", "", "", "B", "", "CALL CAT CNTY"}, {"Michigan QSO Party", "MI", "T", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY ST/PR/CNTRY"}, {"MIQP (Out of State)", "MI", "", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY"}, {"Minnesota QSO Party", "MN", "T", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY ST/PR/CNTRY"}, {"MNQP (Out of State)", "MN", "", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY"}, {"Missouri QSO Party", "MO", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"MOQP (Out of State)", "MO", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Mississippi QSO Party", "MS", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"MSQP (Out of State)", "MS", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Montana QSO Party", "MT", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"MTQP (Out of State)", "MT", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"North Carolina QSO Party", "NC", "T", "B", "B", "B", "", "I", "", "", "", "CALL CNTY ST/PR/CNTRY"}, {"NCQP (Out of State)", "NC", "", "B", "B", "B", "", "I", "", "", "", "CALL CNTY"}, {"Nebraska QSO Party", "NE", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"NEQP (Out of State)", "NE", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"New Jersey QSO Party", "NJ", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"NJQP (Out of State)", "NJ", "", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"New Mexico QSO Party", "NM", "T", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY ST/PR/CNTRY"}, {"NMQP (Out of State)", "NM", "", "", "B", "B", "", "I", "B", "", "", "CALL NAME CNTY"}, {"New York QSO Party", "NY", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"NYQP (Out of State)", "NY", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"North Dakota QSO Party", "ND", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"NDQP (Out of State)", "ND", " ", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY"}, {"Ohio QSO Party", "OH", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"OHQP (Out of State)", "OH", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"Oklahoma QSO Party", "OK", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"OKQP (Out of State)", "OK", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"Ontario QSO Party", "ON", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"ONQP (Out of Province)", "ON", "", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY"}, {"Pennsylvania QSO Party", "PA", "T", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY ST/PR/CNTRY"}, {"PAQP (Out of State)", "PA", "", "", "B", "B", "B", "I", "", "", "", "CALL SERNO CNTY"}, {"South Carolina QSO Party" , "SC", "T", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"SCQP (Out of State)", "SC", "", "B", "B", "B", "", "", "", "", "", "CALL CNTY"}, {"South Dakota QSO Party", "SD", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"SDQP (Out of State)", "SD", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"}, {"Tennessee QSO Party", "TN", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"TNQP (Out of State)", "TN", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"}, {"Texas QSO Party", "TX", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"TXQP (Out of State)", "TX", "", "B", "B", "B", "", "I", "", "", "", "CALL CNTY"}, {"Vermont QSO Party", "VT", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"VTQP (Out of State)", "VT", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"}, {"Virginia QSO Party", "VA", "T", "", "B", "B", "B", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"VAQP (Out of State)", "VA", "", "", "B", "B", "B", "I", "", "", "", "CALL CNTY"}, {"Washington Salmon Run QSO Party","WA", "T", "B", "B", "B", "", "B", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"WAQP (Out of State)", "WA", "", "B", "B", "B", "", "B", "", "", "", "CALL CNTY"}, {"Wisconsin QSO Party", "WI", "T", "B", "B", "B", "", "I", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"WIQP (Out of State)", "WI", "", "B", "B", "B", "", "I", "", "", "", "CALL CNTY"}, {"West Virginia QSO Party", "WV", "T", "B", "B", "B", "", "", "", "", "", "CALL RST CNTY ST/PR/CNTRY"}, {"WVQP (Out of State)", "WV", "", "B", "B", "B", "", "", "", "", "", "CALL CNTY"}, {"7QP QSO Party", "7QP","T", "B", "B", "B", "", "I", "", "", "S", "CALL RST [(ST COUNTY) or (STCNTY) or (DX)]"}, {"7QP (Out of Region)", "7QP","", "B", "B", "B", "", "I", "", "", "S", "CALL RST [(ST COUNTY) or (STCNTY)]"}, {"New England QSO Party", "6NE","T", "B", "B", "B", "", "I", "", "", "C", "CALL RST [(ST COUNTY) or (CNTYST) or (DX)]"}, {"NEQP (Out of Region)", "6NE","", "B", "B", "B", "", "I", "", "", "C", "CALL RST [(ST COUNTY) or (CNTYST)]"}, {"", "", "", "", "", "", "", "", "", "", "", ""} }; //{"Alaska QSO Party", "AK", "T", "", "", "", "", "", "", "", "", ""}, //{"Connecticut QSO Party", "CT", "T", "", "", "", "", "", "", "", "", ""}, //{"Massachusetts QSO Party", "MA", "T", "", "", "", "", "", "", "", "", ""}, //{"New Hampshire QSO Party", "NH", "T", "", "", "", "", "", "", "", "", ""}, //{"Nevada QSO Party", "NV", "T", "", "", "", "", "", "", "", "", ""}, //{"Oregon QSO Party", "OR", "T", "", "", "", "", "", "", "", "", ""}, //{"Rhode Island QSO Party", "RI", "T", "", "", "", "", "", "", "", "", ""}, //{"Utah QSO Party", "UT", "T", "", "", "", "", "", "", "", "", ""}, //{"Wyoming QSO Party", "WY", "T", "", "", "", "", "", "", "", "", ""}, std::string contest_names() { std::string _names; for (size_t n = 0; n < sizeof(contests) / sizeof(*contests) - 1; n++) _names.append(contests[n].name).append("|"); return _names; } Ccontests QSOparties; const std::string Ccontests::names() { std::string _names; for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties) - 1; n++ ) _names.append(qso_parties[n].contest).append("|"); return _names; } const char *Ccontests::notes(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].notes; return ""; } char Ccontests::rst(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].rst[0]; return ' '; } char Ccontests::st(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].st[0]; return ' '; } char Ccontests::cnty(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].cnty[0]; return ' '; } char Ccontests::serno(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].serno[0]; return ' '; } char Ccontests::xchg(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].xchg[0]; return ' '; } char Ccontests::name(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].name[0]; return ' '; } char Ccontests::cat(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].cat[0]; return ' '; } char Ccontests::stcty(std::string party) { for (size_t n = 0; n < sizeof(qso_parties) / sizeof(*qso_parties); n++) if (party == qso_parties[n].contest) return qso_parties[n].stcty[0]; return ' '; } void adjust_for_contest(void *) { int n = progdefaults.SQSOcontest; progdefaults.SQSOinstate = false; progdefaults.SQSOlogcounty = false; progdefaults.SQSOlogstate = false; progdefaults.SQSOlogxchg = false; progdefaults.SQSOlogrst = false; progdefaults.SQSOlogname = false; progdefaults.SQSOlogserno = false; progdefaults.SQSOlogstcty = false; progdefaults.SQSOlogctyst = false; progdefaults.SQSOlogcat = false; if (QSOparties.qso_parties[n].instate[0] == 'T') progdefaults.SQSOinstate = true; if (progdefaults.SQSOinstate) { if (QSOparties.qso_parties[n].st[0] == 'I' || QSOparties.qso_parties[n].st[0] == 'B') progdefaults.SQSOlogstate = true; if (QSOparties.qso_parties[n].cnty[0] == 'I' || QSOparties.qso_parties[n].cnty[0] == 'B') progdefaults.SQSOlogcounty = true; if (QSOparties.qso_parties[n].xchg[0] == 'I' || QSOparties.qso_parties[n].xchg[0] == 'B') progdefaults.SQSOlogxchg = true; if (QSOparties.qso_parties[n].rst[0] == 'I' || QSOparties.qso_parties[n].rst[0] == 'B') progdefaults.SQSOlogrst = true; if (QSOparties.qso_parties[n].name[0] == 'I' || QSOparties.qso_parties[n].name[0] == 'B') progdefaults.SQSOlogname = true; if (QSOparties.qso_parties[n].serno[0] == 'I' || QSOparties.qso_parties[n].serno[0] == 'B') progdefaults.SQSOlogserno = true; if (QSOparties.qso_parties[n].cat[0] == 'I' || QSOparties.qso_parties[n].cat[0] == 'B') progdefaults.SQSOlogcat = true; } else { if (QSOparties.qso_parties[n].st[0] == 'O' || QSOparties.qso_parties[n].st[0] == 'B') progdefaults.SQSOlogstate = true; if (QSOparties.qso_parties[n].cnty[0] == 'O' || QSOparties.qso_parties[n].cnty[0] == 'B') progdefaults.SQSOlogcounty = true; if (QSOparties.qso_parties[n].xchg[0] == 'O' || QSOparties.qso_parties[n].xchg[0] == 'B') progdefaults.SQSOlogxchg = true; if (QSOparties.qso_parties[n].rst[0] == 'O' || QSOparties.qso_parties[n].rst[0] == 'B') progdefaults.SQSOlogrst = true; if (QSOparties.qso_parties[n].name[0] == 'O' || QSOparties.qso_parties[n].name[0] == 'B') progdefaults.SQSOlogname = true; if (QSOparties.qso_parties[n].serno[0] == 'O' || QSOparties.qso_parties[n].serno[0] == 'B') progdefaults.SQSOlogserno = true; if (QSOparties.qso_parties[n].cat[0] == 'O' || QSOparties.qso_parties[n].cat[0] == 'B') progdefaults.SQSOlogcat = true; } if (QSOparties.qso_parties[n].stcty[0] == 'S') progdefaults.SQSOlogstcty = true; if (QSOparties.qso_parties[n].stcty[0] == 'C') progdefaults.SQSOlogctyst = true; update_main_title(); //std::cout << "QSOparties.qso_parties[" << n << "]\n" // << QSOparties.qso_parties[n].contest << std::endl // << "instate: " << progdefaults.SQSOinstate << std::endl // << "ST: " << QSOparties.qso_parties[n].state << std::endl // << "rRST: " << QSOparties.qso_parties[n].rst << std::endl // << "rST: " << QSOparties.qso_parties[n].st << std::endl // << "rCY: " << QSOparties.qso_parties[n].cnty << std::endl // << "rSER: " << QSOparties.qso_parties[n].serno << std::endl // << "rXCHG: " << QSOparties.qso_parties[n].xchg << std::endl // << "rNAM: " << QSOparties.qso_parties[n].name << std::endl // << "rCAT: " << QSOparties.qso_parties[n].cat << std::endl // << "STCTY: " << QSOparties.qso_parties[n].stcty << std::endl // << "Notes: " << QSOparties.qso_parties[n].notes << std::endl; } fldigi-4.2.05/src/logbook/date.cxx0000664000175000017500000001566514611711171013664 00000000000000// ---------------------------------------------------------------------------- // // Date.cxx date class for Fast Light Took Kit // // Copyright (C) 1998 David Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "date.h" const int Date::mdays[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; const int Date::jdays[2][13] = { { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } }; const char *Date::month_name[] = { "January", "Febuary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; void Date::today() { time_t t; struct tm *now; time( &t ); now = localtime( &t ); year = now->tm_year + 1900; month = now->tm_mon + 1; day = now->tm_mday; } Date::Date() { today(); fmt = 0; } Date::Date( int m, int d, int y ) { setDate( m, d, y ); fmt = 1; } void Date::setDate( int mm, int dd, int yy ) { if( isvalid( mm, dd, yy ) ) { year = yy; month = mm; day = dd; } else today(); } void Date::setDate( Date &dt ) { year = dt.year; month = dt.month; day = dt.day; } void Date::setFormat( int iFmt ) { fmt = iFmt; } void Date::Year( int y ) { year = y; } int Date::Year() { return year; } void Date::Month( int m ) { month = m; } int Date::Month() { return month; } void Date::Day( int d ) { day = d; } int Date::Day() { return day; } bool Date::leapYear( int y ) { if( y % 400 == 0 || ( y % 100 != 0 && y % 4 == 0 ) ) return true; return false; } bool Date::isvalid( int m, int d, int y ) { if( y > 2035 ) return false; if( m < 1 || m > 12 ) return false; if( d < 1 ) return false; if( leapYear( y ) ){ if( m == 2 && d > 29 ) return false; else return true; } if( d > mdays[m] ) return false; return true; } int Date::daysinmonth (int month, int leap) { /* Validate the month. */ if (month < JANUARY || month > DECEMBER) return -1; /* Return 28, 29, 30, or 31 based on month/leap. */ switch (month) { case FEBRUARY: return leap ? 29 : 28; default: return mdays[month]; } } int Date::dayofyear (int year, int mon, int mday) { /* Return day of year. */ return mday + jdays[isleapyear (year) ? 1 : 0][mon]; } int Date::dayofepoch (int year, int mon, int mday) { int doe; int era, cent, quad, rest; /* break down the year into 400, 100, 4, and 1 year multiples */ rest = year - 1; quad = rest / 4; rest %= 4; cent = quad / 25; quad %= 25; era = cent / 4; cent %= 4; /* set up doe */ doe = dayofyear (year, mon, mday); doe += era * (400 * 365 + 97); doe += cent * (100 * 365 + 24); doe += quad * (4 * 365 + 1); doe += rest * 365; return doe; } int Date::dayofweek (int year, int mon, int mday) { return dayofepoch (year, mon, mday) % 7; } void Date::previous_month () { if (month == 1) { month = 12; year--; } else month--; while ((day >= 1) && (!datevalid ())) day--; } void Date::next_month () { if (month == 12) { month = 1; year++; } else month++; while ((day >= 1) && (!datevalid ())) day--; } void Date::previous_year () { if (month == 2 && day == 29) day = 28; year--; } void Date::next_year () { if (month == 2 && day == 29) day = 28; year++; } char *Date::szDate (int fmt) { static char temp[20]; char szMonth[10]; switch (fmt) { case 1 : snprintf (temp, sizeof(temp), "%02d/%02d/%02d", month, day, year > 1999 ? year - 2000 : year - 1900); break; case 2 : snprintf (temp, sizeof(temp), "%4d%02d%02d", year, month, day); break; case 3 : snprintf (temp, sizeof(temp), "%s %2d, %4d", month_name[month - 1], day, year); break; case 4 : strcpy (szMonth, month_name [month - 1]); szMonth[3] = 0; snprintf (temp, sizeof(temp), "%s %2d, %4d", szMonth, day, year); break; case 5 : strcpy (szMonth, month_name [month - 1]); szMonth[3] = 0; snprintf (temp, sizeof(temp), "%02d %s %4d", day, szMonth, year); break; case 0 : default : snprintf (temp, sizeof(temp), "%02d/%02d/%04d", month, day, year); break; } return temp; } char *Date::szDate () { return szDate (fmt); } // operator functions std::ostream &operator<<( std::ostream &output, Date &d ) { output << d.szDate (); return output; } bool Date::endOfMonth( int d ) { if( month == 2 && leapYear( year ) ) return (d == 29 ); // last day of Feb in leap year else return (d == mdays[ month ] ); } void Date::helpIncrement() { if( endOfMonth( day ) && month == 12 ) { // end year day = 1; month = 1; ++year; } else if ( endOfMonth( day ) ) { day = 1; ++month; } else ++day; } Date &Date::operator++() { helpIncrement(); return *this; // reference return to create an lvalue } Date Date::operator++( int ) { Date temp = *this; helpIncrement(); return temp; // return non-increment, saved temporary object } const Date &Date::operator+=( int ndays ) { for( int i = 0; i < ndays; i++ ) helpIncrement(); return *this; // enables cascading } bool Date::operator==( const Date &d ) { if( this->year != d.year ) return false; if( this->month != d.month ) return false; if( this->day != d.day ) return false; return true; } bool Date::operator!=( const Date &d ) { return ( !( *this == d ) ); } bool Date::operator<( const Date &d ) { if( this->year < d.year ) return true; if( this->year > d.year ) return false; if( this->month < d.month ) return true; if( this->month > d.month ) return false; if( this->day < d.day ) return true; return false; } bool Date::operator>( const Date &d ) { if( *this < d ) return false; if( *this == d ) return false; return true; } void Date::operator=( const Date &d ) { this->year = d.year; this->month = d.month; this->day = d.day; } double Date::dJulian () { int DaysInYear = 365; if (leapYear ()) DaysInYear++; return ( year + 1.0 * (dayofyear (year, month, day) - 1) / DaysInYear); } fldigi-4.2.05/src/logbook/xmlrpc_log.cxx0000664000175000017500000003162514611711171015107 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include "xmlrpcpp/XmlRpc.h" #include "config.h" #include "lgbook.h" #include "icons.h" #include "gettext.h" #include "debug.h" #include "util.h" #include "date.h" #include "logbook.h" #include "logger.h" #include "locator.h" #include "counties.h" #include "confdialog.h" #include "fl_digi.h" #include "adif_io.h" #include "modem.h" #include "trx.h" #include "status.h" #include "strutil.h" #include "configuration.h" using namespace XmlRpc; XmlRpcClient *log_client = (XmlRpcClient *)0; bool test_connection(bool info = false) { if (!log_client) { create_logbook_dialogs(); return false; } XmlRpcValue query, result; if (log_client->execute("system.listMethods", query, result, 10.0)) { if (info) { std::string res; int asize = result.size(); XmlRpcValue oneArg, help; res = "Xml-log methods:"; for (int i = 0; i < asize; i++) { oneArg[0] = result[i]; try { if (std::string(result[i]).find("system") == std::string::npos) { log_client->execute("system.methodHelp", oneArg, help, 10.0); res.append("\n\t").append(help); } } catch ( XmlRpcException err) { res.append("\n").append(oneArg[0]).append(": ").append(err.getMessage()); } } LOG_INFO("%s", res.c_str()); } return true; } return false; } void activate_log_menus(bool val) { set_server_label(!val); activate_menu_item(_("View"), val); activate_menu_item(_("New"), val); activate_menu_item(_("Open..."), val); activate_menu_item(_("Save"), val); activate_menu_item(_("ADIF"), val); activate_menu_item(_("Reports"), val); } std::string get_field(std::string &adifline, int field) { std::string fld; fld.append("<").append(fields[field].name).append(":"); size_t pos1 = adifline.find(fld); if (pos1 == std::string::npos) return ""; pos1 = adifline.find(">", pos1) + 1; size_t pos2 = adifline.find("<", pos1); fld = adifline.substr(pos1, pos2 - pos1); return fld; } cQsoRec* search_fllog(const char *callsign) { cQsoRec *rec = new cQsoRec; XmlRpcValue oneArg, result; if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); return (cQsoRec *)0; } oneArg[0] = callsign; if (log_client->execute("log.get_record", oneArg, result, 10.0)) { std::string adifline = std::string(result); rec->putField(NAME, get_field(adifline, NAME).c_str()); rec->putField(QTH, get_field(adifline, QTH).c_str()); rec->putField(QSO_DATE, get_field(adifline, QSO_DATE).c_str()); rec->putField(BAND, get_field(adifline, BAND).c_str()); rec->putField(ADIF_MODE, get_field(adifline, ADIF_MODE).c_str()); return rec; } return (cQsoRec *)0; } bool xml_get_record(const char *callsign) { XmlRpcValue oneArg, result; if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); return false; } oneArg[0] = callsign; if (log_client->execute("log.get_record", oneArg, result, 10.0)) { std::string adifline = std::string(result); //std::cout << adifline << std::endl; inpName->value(get_field(adifline, NAME).c_str()); inpQth->value(get_field(adifline, QTH).c_str()); inpState->value(get_field(adifline, STATE).c_str()); inpVEprov->value(get_field(adifline, VE_PROV).c_str()); cboCountry->value(get_field(adifline, COUNTRY).c_str()); inpCounty->value(get_field(adifline, CNTY).c_str()); inpLoc->value(get_field(adifline, GRIDSQUARE).c_str()); inp_SS_SerialNoR->value(get_field(adifline, SS_SERNO).c_str()); inp_SS_Precedence->value(get_field(adifline, SS_PREC).c_str()); inp_SS_Check->value(get_field(adifline, SS_CHK).c_str()); inp_SS_Section->value(get_field(adifline, SS_SEC).c_str()); inp_KD_age->value(get_field(adifline, AGE).c_str()); inp_ARR_check->value(get_field(adifline, CHECK).c_str()); inp_1010_nr->value(get_field(adifline, TEN_TEN).c_str()); inp_JOTA_troop->value(get_field(adifline, TROOPR).c_str()); inp_JOTA_scout->value(get_field(adifline, SCOUTR).c_str()); inpNotes->value(get_field(adifline, NOTES).c_str()); } else { inpName->value(""); inpQth->value(""); inpState->value(""); inpVEprov->value(""); cboCountry->value(""); inpCounty->value(""); inpLoc->value(""); inp_SS_SerialNoR->value(""); inp_SS_Precedence->value(""); inp_SS_Check->value(""); inp_SS_Section->value(""); inp_KD_age->value(""); inp_ARR_check->value(""); inp_1010_nr->value(""); inp_JOTA_troop->value(""); inp_JOTA_scout->value(""); inpNotes->value(""); } if (inpLoc->value()[0]) { double lon1, lat1, lon2, lat2; double azimuth, distance; char szAZ[4]; if ( QRB::locator2longlat(&lon1, &lat1, progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::locator2longlat(&lon2, &lat2, inpLoc->value()) == QRB::QRB_OK && QRB::qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == QRB::QRB_OK ) { snprintf(szAZ,sizeof(szAZ),"%0.f", azimuth); inpAZ->value(szAZ); } else inpAZ->value(""); } else inpAZ->value(""); return true; } static std::string adif; static std::string notes; #define adif_str(a, b) { \ std::ostringstream os; \ os << "<" << fields[(a)].name << ":" << strlen((b)) << ">" << (b); \ adif.append(os.str()); } void xml_add_record() { if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); AddRecord(); return; } // create the ADIF record char Mhz[30]; adif.erase(); adif_str(QSO_DATE, sDate_on.c_str()); adif_str(QSO_DATE_OFF, sDate_off.c_str()); adif_str(TIME_ON, sTime_on.c_str()); adif_str(TIME_OFF, sTime_off.c_str()); adif_str(CALL, inpCall->value()); { snprintf(Mhz, sizeof(Mhz), "%-.6lf", atof(inpFreq->value()) / 1000.0); inpFreq_log->value(Mhz); adif_str(FREQ, Mhz); } adif_str(ADIF_MODE, mode_info[active_modem->get_mode()].adif_name); adif_str(RST_SENT, inpRstOut->value()); adif_str(RST_RCVD, inpRstIn->value()); adif_str(TX_PWR, log_power()); adif_str(NAME, inpName->value()); adif_str(QTH, inpQth->value()); adif_str(STATE, inpState->value()); adif_str(VE_PROV, inpVEprov->value()); adif_str(COUNTRY, cboCountry->value()); adif_str(CNTY, inpCounty->value()); adif_str(GRIDSQUARE, inpLoc->value()); adif_str(STX, outSerNo->value()); adif_str(SRX, inpSerNo->value()); adif_str(XCHG1, inpXchgIn->value()); adif_str(MYXCHG, progdefaults.myXchg.c_str()); adif_str(NOTES, inpNotes->value()); adif_str(CLASS, inpClass->value()); adif_str(ARRL_SECT, inpSection->value()); adif_str(CQZ, inp_CQzone->value()); // these fields will always be blank unless they are added to the main // QSO log area. // need to add the remaining fields adif_str(IOTA, ""); adif_str(DXCC, ""); adif_str(QSL_VIA, ""); adif_str(QSLRDATE, ""); adif_str(QSLSDATE, ""); // new contest fields adif_str(SS_SEC, inp_SS_Section->value()); adif_str(SS_SERNO, inp_SS_SerialNoR->value()); adif_str(SS_PREC, inp_SS_Precedence->value()); adif_str(SS_CHK, inp_SS_Check->value()); adif_str(AGE, inp_KD_age->value()); adif_str(TEN_TEN, inp_1010_nr->value()); adif_str(CHECK, inp_ARR_check->value()); adif_str(TROOPS, progdefaults.my_JOTA_troop.c_str()); adif_str(TROOPR, inp_JOTA_troop->value()); adif_str(SCOUTS, progdefaults.my_JOTA_scout.c_str()); adif_str(SCOUTR, inp_JOTA_scout->value()); adif_str(OP_CALL, progdefaults.operCall.c_str()); adif_str(STA_CALL, progdefaults.myCall.c_str()); adif_str(MY_CITY, std::string(progdefaults.myQth).c_str()); adif_str(MY_STATE, inp_QP_state_short->value()); adif_str(MY_GRID, progdefaults.myLocator.c_str()); adif.append(""); // send it to the server XmlRpcValue oneArg, result; oneArg[0] = adif.c_str(); log_client->execute("log.add_record", oneArg, result, 10.0); // submit it foreign log programs cQsoRec rec; rec.putField(CALL, inpCall->value()); rec.putField(NAME, inpName->value()); rec.putField(QSO_DATE, sDate_on.c_str()); rec.putField(QSO_DATE_OFF, sDate_off.c_str()); rec.putField(TIME_ON, inpTimeOn->value()); rec.putField(TIME_OFF, ztime()); rec.putField(FREQ, Mhz); rec.putField(ADIF_MODE, mode_info[active_modem->get_mode()].adif_name); rec.putField(QTH, inpQth->value()); rec.putField(STATE, inpState->value()); rec.putField(VE_PROV, inpVEprov->value()); rec.putField(COUNTRY, cboCountry->value()); rec.putField(CNTY, inpCounty->value()); rec.putField(GRIDSQUARE, inpLoc->value()); rec.putField(NOTES, inpNotes->value()); rec.putField(QSLRDATE, ""); rec.putField(QSLSDATE, ""); rec.putField(RST_RCVD, inpRstIn->value ()); rec.putField(RST_SENT, inpRstOut->value ()); rec.putField(SRX, inpSerNo->value()); rec.putField(STX, outSerNo->value()); rec.putField(XCHG1, inpXchgIn->value()); rec.putField(MYXCHG, progdefaults.myXchg.c_str()); rec.putField(CLASS, inpClass->value()); rec.putField(ARRL_SECT, inpSection->value()); rec.putField(CNTY, ""); rec.putField(IOTA, ""); rec.putField(DXCC, ""); rec.putField(CONT, ""); rec.putField(CQZ, ""); rec.putField(ITUZ, ""); rec.putField(TX_PWR, ""); // new contest fields rec.putField(SS_SEC, inp_SS_Section->value()); rec.putField(SS_SERNO, inp_SS_SerialNoR->value()); rec.putField(SS_PREC, inp_SS_Precedence->value()); rec.putField(SS_CHK, inp_SS_Check->value()); rec.putField(AGE, inp_KD_age->value()); rec.putField(TEN_TEN, inp_1010_nr->value()); rec.putField(CHECK, inp_ARR_check->value()); rec.putField(TROOPS, progdefaults.my_JOTA_troop.c_str()); rec.putField(TROOPR, inp_JOTA_troop->value()); rec.putField(SCOUTS, progdefaults.my_JOTA_scout.c_str()); rec.putField(SCOUTR, inp_JOTA_scout->value()); rec.putField(OP_CALL, progdefaults.operCall.c_str()); rec.putField(STA_CALL, progdefaults.myCall.c_str()); submit_record(rec); } int xml_check_dup() { int dup_test = 0; if (!test_connection()) { LOG_INFO("%s","Logbook server down!"); progdefaults.xml_logbook = false; progdefaults.changed = true; activate_log_menus(true); if (!dlgLogbook) create_logbook_dialogs(); start_logbook(); return dup_test; } XmlRpcValue six_args, result; six_args[0] = inpCall->value(); six_args[1] = progdefaults.dupmode ? mode_info[active_modem->get_mode()].adif_name : "0"; char tspn[10]; snprintf(tspn, sizeof(tspn), "%d", progdefaults.timespan); six_args[2] = progdefaults.duptimespan ? tspn : "0"; six_args[3] = progdefaults.dupband ? inpFreq->value() : "0"; six_args[4] = (progdefaults.dupstate && inpState->value()[0]) ? inpState->value() : "0"; six_args[5] = (progdefaults.dupxchg1 && inpXchgIn->value()[0]) ? inpXchgIn->value() : "0"; if (log_client->execute("log.check_dup", six_args, result, 10.0)) { std::string res = std::string(result); if (res == "true") dup_test = 1; else if (res == "possible") dup_test = 2; } return dup_test; } void xml_update_eqsl() { adif.erase(); adif_str(EQSLSDATE, sDate_on.c_str()); adif.append(""); XmlRpcValue oneArg, result; oneArg[0] = adif.c_str(); LOG_INFO("%s", "xmlrpc log: update eqsl date"); log_client->execute("log.update_record", oneArg, result, 10.0); } void xml_update_lotw() { adif.erase(); adif_str(LOTWSDATE, sDate_on.c_str()); adif.append(""); XmlRpcValue oneArg, result; oneArg[0] = adif.c_str(); LOG_INFO("%s", "xmlrpc log: update LoTW date"); log_client->execute("log.update_record", oneArg, result, 10.0); } void connect_to_log_server(void *) { if (log_client) { delete log_client; log_client = 0; } LOG_INFO("%s","Create XMLRPC client"); log_client = new XmlRpcClient( progdefaults.xmllog_address.c_str(), atoi(progdefaults.xmllog_port.c_str())); LOG_INFO("%s","Created"); if (progdefaults.xml_logbook) { if (test_connection(true)) { LOG_INFO("%s","Close local logbook"); close_logbook(); if (dlgLogbook) dlgLogbook->hide(); activate_log_menus(false); } else { LOG_INFO("%s","Remote server not responding"); progdefaults.xml_logbook = false; activate_log_menus(true); start_logbook(); LOG_INFO("%s","Use local logbook"); } } else { LOG_INFO("%s","Enable local logbook"); activate_log_menus(true); start_logbook(); } } fldigi-4.2.05/src/logbook/fd_logger.cxx0000664000175000017500000004657614611711171014704 00000000000000// ===================================================================== // // FD_logger.cxx // // interface to tcpip application fdserver.tcl // fdserver is a multiple client tcpip server // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "logsupport.h" #include "fd_logger.h" #include "fd_view.h" #include "flmisc.h" #include "confdialog.h" LOG_FILE_SOURCE(debug::LOG_FD); //forward declarations of local functions void FD_start(); //====================================================================== // Socket FD i/o used on all platforms //====================================================================== pthread_t FD_thread; pthread_t FD_rx_socket_thread; pthread_mutex_t FD_mutex = PTHREAD_MUTEX_INITIALIZER; Socket *FD_socket = 0; bool FD_connected = false; bool FD_logged_on = false; bool FD_enabled = false; bool FD_exit = false; std::string FD_ip_addr = ""; std::string FD_ip_port = ""; std::string FD_rxbuffer; //====================================================================== // data report from fdserver.tcl // LOGON w1hkj 40,DIG // LOGON_OK W1HKJ 1A 5 // SCORE 35 // WORKED ... all on a single line // {160 CW 1} {160 DIG 0} {160 PHONE 0} // {80 CW 0} {80 DIG 0} {80 PHONE 0} // {40 CW 1} {40 DIG 0} {40 PHONE 0} // {20 CW 0} {20 DIG 1} {20 PHONE 0} // {17 CW 0} {17 DIG 0} {17 PHONE 1} // {15 CW 0} {15 DIG 0} {15 PHONE 1} // {10 CW 0} {10 DIG 0} {10 PHONE 0} // {2 CW 0} {2 DIG 0} {2 PHONE 0} // {440 CW 0} {440 DIG 0} {440 PHONE 0} //====================================================================== //====================================================================== // //====================================================================== void post(Fl_Input2 *w, const char * s) { w->value(s); } //====================================================================== // //====================================================================== void view(Fl_Output *w, const char * s) { w->value(s); } //====================================================================== // //====================================================================== static std::string toparse; void parse_logon_ok(std::string s) { size_t p = 0; static std::string call, clss, mult, sect; call.clear(); clss.clear(); sect.clear(); s.erase(0, 9); call = s; call.erase(call.find(" ")); p = s.find(" "); if (p != std::string::npos) { s.erase(0, p+1); clss = s; p = clss.find(" "); clss.erase(p); p = s.find(" "); if (p != std::string::npos) { s.erase(0,p+1); mult = s; p = mult.find(" "); mult.erase(p); p = s.find(" "); if (p != std::string::npos) { s.erase(0,p+1); sect = s; p = sect.find("\r"); if (p != std::string::npos) sect.erase(p); p = sect.find("\n"); if (p != std::string::npos) sect.erase(p); } } } progdefaults.my_FD_call = call; REQ(&post, inp_my_FD_call, call.c_str()); REQ(&view, view_FD_call, call.c_str()); progdefaults.my_FD_class = clss; REQ(&post, inp_my_FD_class, clss.c_str()); REQ(&view, view_FD_class, clss.c_str()); progdefaults.my_FD_section = sect; REQ(&post, inp_my_FD_section, sect.c_str()); REQ(&view, view_FD_section, sect.c_str()); progdefaults.my_FD_mult = mult; REQ(&view, view_FD_mult, mult.c_str()); } //====================================================================== // //====================================================================== void parse_score(std::string s) { static std::string sscore; size_t p = s.find("\r"); if (p != std::string::npos) s.erase(p); p = s.find("\n"); if (p != std::string::npos) s.erase(p); p = s.find(" "); if (p != std::string::npos) s.erase(0, p+1); sscore = s; REQ(&view, view_FD_score, sscore.c_str()); } //====================================================================== // //====================================================================== void parse_entry( std::string needle, Fl_Output *view1, Fl_Output *view2 ) { size_t p1 = toparse.find(needle); if (p1 == std::string::npos) return; p1 += needle.length(); size_t p2 = toparse.find(" ", p1); size_t p3 = toparse.find("}", p1); if (p3 == std::string::npos) return; std::string num = "", op = ""; num = toparse.substr(p1, p2 - p1); op = toparse.substr(p2+1, p3 - (p2+1)); view1->value(num.c_str()); view2->value(op.c_str()); } //====================================================================== // //====================================================================== void parse_worked() { // CW contacts parse_entry("{160 CW ", view_FD_CW[0], view_FD_CW_OP[0]); parse_entry("{80 CW ", view_FD_CW[1], view_FD_CW_OP[1]); parse_entry("{40 CW ", view_FD_CW[2], view_FD_CW_OP[2]); parse_entry("{20 CW ", view_FD_CW[3], view_FD_CW_OP[3]); parse_entry("{17 CW ", view_FD_CW[4], view_FD_CW_OP[4]); parse_entry("{15 CW ", view_FD_CW[5], view_FD_CW_OP[5]); parse_entry("{12 CW ", view_FD_CW[6], view_FD_CW_OP[6]); parse_entry("{10 CW ", view_FD_CW[7], view_FD_CW_OP[7]); parse_entry("{6 CW ", view_FD_CW[8], view_FD_CW_OP[8]); parse_entry("{2 CW ", view_FD_CW[9], view_FD_CW_OP[9]); parse_entry("{220 CW ", view_FD_CW[10], view_FD_CW_OP[10]); parse_entry("{440 CW ", view_FD_CW[11], view_FD_CW_OP[11]); // DIG contacts parse_entry("{160 DIG ", view_FD_DIG[0], view_FD_DIG_OP[0]); parse_entry("{80 DIG ", view_FD_DIG[1], view_FD_DIG_OP[1]); parse_entry("{40 DIG ", view_FD_DIG[2], view_FD_DIG_OP[2]); parse_entry("{20 DIG ", view_FD_DIG[3], view_FD_DIG_OP[3]); parse_entry("{17 DIG ", view_FD_DIG[4], view_FD_DIG_OP[4]); parse_entry("{15 DIG ", view_FD_DIG[5], view_FD_DIG_OP[5]); parse_entry("{12 DIG ", view_FD_DIG[6], view_FD_DIG_OP[6]); parse_entry("{10 DIG ", view_FD_DIG[7], view_FD_DIG_OP[7]); parse_entry("{6 DIG ", view_FD_DIG[8], view_FD_DIG_OP[8]); parse_entry("{2 DIG ", view_FD_DIG[9], view_FD_DIG_OP[9]); parse_entry("{220 DIG ", view_FD_DIG[10], view_FD_DIG_OP[10]); parse_entry("{440 DIG ", view_FD_DIG[11], view_FD_DIG_OP[11]); // PHONE contacts parse_entry("{160 PHONE ", view_FD_PHONE[0], view_FD_PHONE_OP[0]); parse_entry("{80 PHONE ", view_FD_PHONE[1], view_FD_PHONE_OP[1]); parse_entry("{40 PHONE ", view_FD_PHONE[2], view_FD_PHONE_OP[2]); parse_entry("{20 PHONE ", view_FD_PHONE[3], view_FD_PHONE_OP[3]); parse_entry("{17 PHONE ", view_FD_PHONE[4], view_FD_PHONE_OP[4]); parse_entry("{15 PHONE ", view_FD_PHONE[5], view_FD_PHONE_OP[5]); parse_entry("{12 PHONE ", view_FD_PHONE[6], view_FD_PHONE_OP[6]); parse_entry("{10 PHONE ", view_FD_PHONE[7], view_FD_PHONE_OP[7]); parse_entry("{6 PHONE ", view_FD_PHONE[8], view_FD_PHONE_OP[8]); parse_entry("{2 PHONE ", view_FD_PHONE[9], view_FD_PHONE_OP[9]); parse_entry("{220 PHONE ", view_FD_PHONE[10], view_FD_PHONE_OP[10]); parse_entry("{440 PHONE ", view_FD_PHONE[11], view_FD_PHONE_OP[11]); } void clear_fd_viewer() { for (int i = 0; i < 12; i++) { view_FD_CW[i]->value(""); view_FD_CW_OP[i]->value(""); view_FD_DIG[i]->value(""); view_FD_DIG_OP[i]->value(""); view_FD_PHONE[i]->value(""); view_FD_PHONE_OP[i]->value(""); } view_FD_call->value(""); view_FD_class->value(""); view_FD_section->value(""); view_FD_mult->value(""); box_fdserver_connected->color((Fl_Color)31); box_fdserver_connected->redraw(); } //====================================================================== // //====================================================================== void parse_FD_stream(std::string data) { size_t p = 0; if (data.empty()) return; //std::cout << "RX Stream:\n" << data << std::endl; if (data.find("QUIT") != std::string::npos) { //std::cout << "Quit\n"; FD_disconnect(); btn_fd_connect->value(0); return; } if (data.find("LOGON_DENIED") != std::string::npos) { //std::cout << "Logon denied\n"; FD_logged_on = false; LOG_ERROR("FD logon DENIED"); btn_fd_connect->value(0); return; } if (data.find("LOGOFF_OK") != std::string::npos) { //std::cout << "Log off OK\n"; FD_logged_on = false; return; } if (data.find("LOGON_OK") != std::string::npos) { //std::cout << "Logon OK\n"; parse_logon_ok(data.substr(p)); FD_logged_on = true; box_fdserver_connected->color((Fl_Color)2); box_fdserver_connected->redraw(); } if ( (p = data.find("SCORE") ) != std::string::npos) { //std::cout << "SCORE\n"; parse_score(data.substr(p)); } if ( (p = data.find("WORKED"))!= std::string::npos) { //std::cout << "WORKED\n"; toparse = data.substr(p); REQ(parse_worked); return; } if ( data.find("NODUP") != std::string::npos) { //std::cout << "Not a duplicate\n"; return; } else if (data.find("DUP") != std::string::npos) { //std::cout << "Duplicate\n"; } else if (data.find("REJECT") != std::string::npos) { //std::cout << "Reject\n"; } else if (data.find("ACCEPT") != std::string::npos) { //std::cout << "Accept\n"; } } //====================================================================== // //====================================================================== void FD_write(std::string s) { FD_socket->send(s.append("\n")); } //====================================================================== // //====================================================================== void FD_get_record(std::string call) { if(!FD_socket) return; if (!FD_connected) return; } //====================================================================== // //====================================================================== void FD_add_record() { if(!FD_socket) return; if (!FD_connected) return; guard_lock send_lock(&FD_mutex); std::string cmd = "ADD "; cmd.append(inpCall->value()).append(" "); cmd.append(inpSection->value()).append(" "); cmd.append(inpClass->value()); FD_write(cmd); } //====================================================================== // //====================================================================== static std::string fd_band; static std::string fd_mode; static std::string FD_opmode() { if (!active_modem) { return "DIG"; } if (active_modem->get_mode() == MODE_CW) return "CW"; else if (active_modem->get_mode() < MODE_SSB) return "DIG"; else if (active_modem->get_mode() == MODE_SSB) return "PHONE"; return ""; } //====================================================================== // //====================================================================== static std::string FD_opband() { if (!active_modem) return "40"; double freq = qsoFreqDisp->value(); freq /= 1e6; if (freq >= 1.8 && freq < 3.5) return "160"; if (freq >= 3.5 && freq <= 7.0) return "80"; if (freq >= 7.0 && freq <= 7.5) return "40"; if (freq >= 14.0 && freq < 18.0) return "20"; if (freq >= 18.0 && freq < 21.0) return "17"; if (freq >= 21.0 && freq < 24.0) return "15"; if (freq >= 24.0 && freq < 28.0) return "12"; if (freq >= 28.0 && freq < 50.0) return "10"; if (freq >= 50.0 && freq < 70.0) return "6"; if (freq >= 144.0 && freq < 222.0) return "2"; if (freq >= 222.0 && freq < 420.0) return "222"; if (freq >= 420.0 && freq < 444.0) return "440"; return ""; } //====================================================================== // //====================================================================== int FD_dupcheck() { if(!FD_socket) return 0; if (!FD_connected) return 0; std::string response; std::string cmd = "DUPCHECK "; cmd.append(inpCall->value()); try { guard_lock send_lock(&FD_mutex); FD_write(cmd); MilliSleep(50); FD_socket->recv(response); if (response.empty()) return 0; if (response.find("NODUP") != std::string::npos) return 0; if (response.find("DUP") != std::string::npos) return 1; return 0; } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); FD_exit = true; } return 0; } //====================================================================== // //====================================================================== void FD_logon() { std::string ucasecall = progdefaults.fd_op_call; std::string buffer; std::string cmd = "LOGON "; if (ucasecall.empty()) return; for (size_t n = 0; n < ucasecall.length(); n++) ucasecall[n] = toupper(ucasecall[n]); fd_band = FD_opband(); fd_mode = FD_opmode(); if (fd_band.empty() || fd_mode.empty()) return; cmd.append(ucasecall).append(" "); cmd.append(fd_band).append(","); cmd.append(fd_mode); try { guard_lock send_lock(&FD_mutex); //std::cout << "Log On: " << cmd << std::endl; FD_write(cmd); FD_socket->recv(buffer); parse_FD_stream(buffer); LOG_INFO("Logged on to fdserver"); FD_logged_on = true; } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); } } //====================================================================== // //====================================================================== void FD_logoff() { if (!FD_socket) return; guard_lock send_lock(&FD_mutex); try { std::string buffer; FD_write("LOGOFF"); MilliSleep(100); FD_socket->recv(buffer); parse_FD_stream(buffer); FD_disconnect(); LOG_INFO("Logged off FD server"); } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); } } //====================================================================== // //====================================================================== void FD_band_check() { if (fd_band != FD_opband()) { FD_logoff(); MilliSleep(50); FD_start(); FD_logon(); } } //====================================================================== // //====================================================================== void FD_mode_check() { if (fd_mode != FD_opmode()) { FD_logoff(); MilliSleep(50); FD_start(); FD_logon(); } } //====================================================================== // //====================================================================== void FD_rcv_data() { std::string tempbuff; try { guard_lock send_lock(&FD_mutex); FD_socket->recv(tempbuff); if (tempbuff.empty()) return; parse_FD_stream(tempbuff); } catch (const SocketException& e) { LOG_ERROR("Error %d, %s", e.error(), e.what()); FD_exit = true; } } //====================================================================== // //====================================================================== static int fd_looptime = 1000; // in milliseconds void FD_start() { guard_lock send_lock(&FD_mutex); FD_ip_addr = progdefaults.fd_tcpip_addr; FD_ip_port = progdefaults.fd_tcpip_port; try { FD_socket = new Socket( Address( FD_ip_addr.c_str(), FD_ip_port.c_str(), "tcp") ); FD_socket->set_timeout(0.01); FD_socket->connect(); FD_socket->set_nonblocking(true); LOG_INFO( "Connected to fdserver %s:%s", FD_ip_addr.c_str(), FD_ip_port.c_str() ); fd_looptime = 100; FD_connected = true; } catch (const SocketException& e) { // LOG_ERROR("%s", e.what() ); delete FD_socket; FD_socket = 0; FD_connected = false; } } //====================================================================== // //====================================================================== void FD_restart() { guard_lock send_lock(&FD_mutex); FD_ip_addr = progdefaults.fd_tcpip_addr; FD_ip_port = progdefaults.fd_tcpip_port; try { FD_socket->shut_down(); FD_socket->close(); delete FD_socket; FD_connected = false; FD_socket = new Socket( Address( FD_ip_addr.c_str(), FD_ip_port.c_str(), "tcp") ); FD_socket->set_timeout(0.01); FD_socket->connect(); FD_socket->set_nonblocking(true); fd_looptime = 100; LOG_INFO( "Connected to fdserver %s:%s", FD_ip_addr.c_str(), FD_ip_port.c_str() ); } catch (const SocketException& e) { // LOG_ERROR("%s", e.what() ); delete FD_socket; FD_socket = 0; FD_connected = false; } } //====================================================================== // Disconnect from FD tcpip server //====================================================================== void FD_disconnect() { if (!FD_socket) return; // send disconnect string FD_socket->shut_down(); FD_socket->close(); delete FD_socket; FD_socket = 0; FD_connected = false; FD_logged_on = false; REQ(clear_fd_viewer); LOG_INFO("Disconnected from fdserver"); } //////////////////////////////////////////////// // NEED TO DETECT WHEN SERVER IS CLOSED OR FAILS //////////////////////////////////////////////// //====================================================================== // Thread loop //====================================================================== static notify_dialog *fd_alert_window = 0; void ui_feedback() { btn_fd_connect->value(0); if (!fd_alert_window) fd_alert_window = new notify_dialog; fd_alert_window->notify(_("Check FD server, connect failed"), 15.0); show_notifier(fd_alert_window); } void *FD_loop(void *args) { SET_THREAD_ID(FD_TID); int try_count = 10; while(1) { for (int i = 0; i < fd_looptime/50; i++) { MilliSleep(50); if (FD_exit) break; } if (!FD_connected && progdefaults.connect_to_fdserver) { if (try_count--) FD_start(); else { progdefaults.connect_to_fdserver = false; REQ(ui_feedback); try_count = 10; } } if ( FD_connected && ((FD_ip_addr != progdefaults.fd_tcpip_addr) || (FD_ip_port != progdefaults.fd_tcpip_port)) ) FD_restart(); if (FD_exit) break; if (FD_connected && !progdefaults.connect_to_fdserver) { if (FD_logged_on) FD_logoff(); FD_disconnect(); } else if ( FD_connected && !FD_logged_on && progdefaults.connect_to_fdserver) { FD_logon(); } else if (FD_connected && FD_logged_on) { FD_rcv_data(); FD_mode_check(); FD_band_check(); } } if (FD_logged_on && FD_socket) FD_logoff(); // calls FD_disconnect() else FD_disconnect(); // exit the FD thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== void FD_init(void) { FD_enabled = false; FD_exit = false; if (pthread_create(&FD_thread, NULL, FD_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); return; } LOG_INFO("%s", "fdserver thread started"); FD_enabled = true; } //====================================================================== // //====================================================================== void FD_close(void) { if (!FD_enabled) return; FD_exit = true; pthread_join(FD_thread, NULL); FD_enabled = false; LOG_INFO("%s", "fdserver thread terminated. "); if (FD_socket) { FD_socket->shut_down(); FD_socket->close(); } } fldigi-4.2.05/src/logbook/maclogger.cxx0000664000175000017500000002724114611711171014700 00000000000000// ===================================================================== // // maclogger.cxx // // receive log data from maclogger udp broadcast message // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "maclogger.h" #include "confdialog.h" LOG_FILE_SOURCE(debug::LOG_MACLOGGER); //====================================================================== // Socket MACLOGGER i/o used on all platforms //====================================================================== pthread_t maclogger_thread; pthread_t maclogger_rx_socket_thread; pthread_mutex_t mclg_str_mutex = PTHREAD_MUTEX_INITIALIZER; Socket *maclogger_socket = 0; bool maclogger_enabled = false; bool maclogger_exit = false; std::string maclogger_ip_address= "";; std::string maclogger_ip_port= "";; std::string mclg_str = ""; unsigned long long mclg_rxhz; unsigned long long mclg_txhz; std::string mclg_band; std::string mclg_mode; std::string mclg_power; std::string mclg_call; std::string mclg_dxccnum; std::string mclg_dxccstr; std::string mclg_city; std::string mclg_state; std::string mclg_firstname; std::string mclg_lastname; std::string mclg_comment; std::string mclg_bearing; std::string mclg_longpath; std::string mclg_distance; //====================================================================== // MacLogger UDP string parsing //====================================================================== static std::string get_str(std::string s) { size_t p = s.find(":"); if (p == std::string::npos) return ""; s.erase(0, p+1); p = s.find(","); if (p == std::string::npos) p = s.find("]"); if (p == std::string::npos) return ""; std::string s2 = s.substr(0, p); if (s2 == "(null)") return ""; return s2; } static unsigned long long get_freq(std::string s) { std::string s2 = get_str(s); size_t dpt = s2.find("."); if (dpt == std::string::npos) return 0; std::string sf = s2.substr(0, dpt); std::string sm = s2.substr(dpt+1); while(sm.length() < 6) sm.append("0"); sf.append(sm); unsigned long long fr = sf[0] - '0'; for (size_t n = 1; n < sf.length(); n++) { fr *= 10; fr += (sf[n] - '0'); } //std::cout << "string: " << sf << ", unsigned long long freq: " << fr << std::endl; return fr; } void maclogger_set_qsy() { unsigned long long hz = mclg_rxhz; if (hz <= 0 || !progdefaults.maclogger_spot_rx) hz = mclg_txhz; if (hz <= 0) return; sendFreq(hz); wf->rfcarrier(hz); wf->movetocenter(); show_frequency(hz); } void maclogger_set_call() { inpCall->value(mclg_call.c_str()); inpCall->do_callback(); } void maclogger_set_name() { inpName->value(mclg_firstname.c_str()); inpName->do_callback(); } void maclogger_set_mode() { // inpMode->value(mclg_mode.c_str()); // inpMode->do_callback(); } void maclogger_set_qth() { inpQth->value(mclg_city.c_str()); inpQth->do_callback(); } void maclogger_set_state() { inpState->value(mclg_state.c_str()); inpState->do_callback(); } void maclogger_disp_report(const char * s) { txt_UDP_data->insert(s); txt_UDP_data->redraw(); } void show_mac_strings() { SET_THREAD_ID(MACLOGGER_TID); if (mclg_txhz > 0) REQ(maclogger_set_qsy); else if (mclg_rxhz > 0) REQ(maclogger_set_qsy); if (!mclg_mode.empty()) REQ(maclogger_set_mode); if (!mclg_call.empty()) REQ(maclogger_set_call); if (!mclg_city.empty()) REQ(maclogger_set_qth); if (!mclg_state.empty()) REQ(maclogger_set_state); if (!mclg_firstname.empty()) REQ(maclogger_set_name); // if (!mclg_power.empty()) // if (!mclg_band.empty()) // if (!mclg_lastname.empty()) // if (!mclg_comment.empty()) // if (!mclg_bearing.empty()) // if (!mclg_longpath.empty()) // if (!mclg_distance.empty()) // if (!mclg_dxccnum.empty()) // if (!mclg_dxccstr.empty()) } void parse_report(std::string str) { size_t p; mclg_rxhz = 0; mclg_txhz = 0; mclg_band.clear(); mclg_mode.clear(); mclg_power.clear(); mclg_call.clear(); mclg_dxccnum.clear(); mclg_dxccstr.clear(); mclg_city.clear(); mclg_state.clear(); mclg_firstname.clear(); mclg_lastname.clear(); mclg_comment.clear(); mclg_bearing.clear(); mclg_longpath.clear(); mclg_distance.clear(); if ((p = str.find("RxMHz:")) != std::string::npos) mclg_rxhz = get_freq(str.substr(p)); if ((p = str.find("TxMHz:")) != std::string::npos) mclg_txhz = get_freq(str.substr(p)); if ((p = str.find("Mode:")) != std::string::npos) mclg_mode = get_str(str.substr(p)); if ((p = str.find("Call:")) != std::string::npos) mclg_call = get_str(str.substr(p)); if ((p = str.find("city:")) != std::string::npos) mclg_city = get_str(str.substr(p)); if ((p = str.find("state:")) != std::string::npos) mclg_state = get_str(str.substr(p)); if ((p = str.find("first_name:")) != std::string::npos) mclg_firstname = get_str(str.substr(p)); // if ((p = mclg_str.find("dxcc_num:")) != std::string::npos) // mclg_dxccnum = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("dxcc_string:")) != std::string::npos) // mclg_dxccstr = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Power:")) != std::string::npos) // mclg_power = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Band:")) != std::string::npos) // mclg_band = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("last_name:")) != std::string::npos) // mclg_lastname = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Comment:")) != std::string::npos) // mclg_comment = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Bearing:")) != std::string::npos) // mclg_bearing = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("LongPath:")) != std::string::npos) // mclg_longpath = get_str(mclg_str.substr(p)); // if ((p = mclg_str.find("Distance:")) != std::string::npos) // mclg_distance = get_str(mclg_str.substr(p)); show_mac_strings(); } void parse_maclog() { size_t p1, p2; std::string str; static std::string srep; while (!mclg_str.empty()) { p1 = mclg_str.find("["); if (p1 == std::string::npos) return; if (p1 != 0) mclg_str.erase(0, p1); p2 = mclg_str.find("]"); if (p2 == std::string::npos) return; str = mclg_str.substr(0, p2 + 1); srep = str; srep.append("\n"); REQ(maclogger_disp_report, srep.c_str()); if (progdefaults.enable_maclogger_log) { std::string pathname = TempDir; pathname.append("maclogger_udp_strings.txt"); FILE *maclog = fl_fopen(pathname.c_str(), "a"); fprintf(maclog, "%s", srep.c_str()); fclose(maclog); } if ((progdefaults.capture_maclogger_radio && mclg_str.find("[Radio Report:") != std::string::npos) || (progdefaults.capture_maclogger_spot_tune && mclg_str.find("[SpotTune:") != std::string::npos) || (progdefaults.capture_maclogger_spot_report && mclg_str.find("[Spot Report:") != std::string::npos) || (progdefaults.capture_maclogger_log && mclg_str.find("[Log Report:") != std::string::npos) || (progdefaults.capture_maclogger_lookup && mclg_str.find("[Lookup Report") != std::string::npos) ) parse_report(str); mclg_str.erase(0, p2 + 1); MilliSleep(100); } } //====================================================================== // uncomment to use UDP test strings // // #define TESTSTRINGS 1 // //====================================================================== #ifdef TESTSTRINGS std::string tstring[6] = { "[Radio Report:RxMHz:24.96400, TxMHz:24.96400, Band:12M, Mode:USB, Power:5]", "[SpotTune:RxMHz:3.5095, TxMHz:3.549525, Band:10M, Mode:USB]", "[Log Report: Call:N2BJ, RxMHz:21.08580, TxMHz:21.08580, Band:15M, Mode:FSK, Power:5, dxcc_num:291, dxcc_string:United States, city:NEW LENOX, state:IL, first_name:Barry, last_name:COHEN]", "[Spot Report: RxMHz:3.50300, TxMHz:3.50300, Band:80M, Mode:CW, Call:EP6T, dxcc_string:Iran, Comment:UP , TNX CARLO , GL]", "[Rotor Report: Bearing:304.7, LongPath:0, Distance:0.0]", "[Lookup Report:Call:YC8RBI, RxMHz:21.32500, Band:15M, Mode:USB, dxcc_num:327, dxcc_string:Indonesia, Bearing:328.1, city:SANGIHE ISLAND NORTH SULAWESI, state:(null), first_name:RICHARD, last_name:BYL ( ICHA )]" }; int tnbr = 0; #endif void get_maclogger_udp() { #ifdef TESTSTRINGS if (tnbr == 0) { for (int n = 0; n < 6; n++) { mclg_str = tstring[n]; parse_maclog(); } tnbr = 1; } #else if(!maclogger_socket) return; if (!progdefaults.connect_to_maclogger) return; char buffer[MACLOGGER_BUFFER_SIZE]; size_t count = 0; memset(buffer, 0, sizeof(buffer)); try { count = maclogger_socket->recvFrom( (void *) buffer, sizeof(buffer) - 1); } catch (...) { LOG_WARN("MAC_logger socket error"); count = 0; } if (count) { mclg_str.append(buffer, count); parse_maclog(); } #endif } //====================================================================== // //====================================================================== void *maclogger_loop(void *args) { SET_THREAD_ID(MACLOGGER_TID); LOG_INFO("%s", "MAC_logger loop started. "); while(1) { for (int i = 0; i < 100; i++) { MilliSleep(10); if (maclogger_exit) break; } if (maclogger_exit) break; get_maclogger_udp(); } // exit the maclogger thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== bool maclogger_start(void) { maclogger_ip_address = "255.255.255.255"; maclogger_ip_port = "9932"; try { maclogger_socket = new Socket( Address( maclogger_ip_address.c_str(), maclogger_ip_port.c_str(), "udp") ); maclogger_socket->set_autoclose(true); maclogger_socket->set_nonblocking(false); maclogger_socket->bindUDP(); } catch (const SocketException& e) { LOG_ERROR( "Could not resolve %s: %s", maclogger_ip_address.c_str(), e.what() ); return false; } return true; } //====================================================================== // //====================================================================== void maclogger_init(void) { maclogger_enabled = false; maclogger_exit = false; #ifndef TESTSTRINGS if(!maclogger_start()) return; LOG_INFO("%s", "UDP Init - OK"); #endif if (pthread_create(&maclogger_thread, NULL, maclogger_loop, NULL) < 0) { LOG_ERROR("MACLOGGER maclogger_thread: pthread_create failed"); return; } LOG_INFO("MACLOGGER thread started"); maclogger_enabled = true; } //====================================================================== // //====================================================================== void maclogger_close(void) { if (!maclogger_enabled) return; if(maclogger_socket) { maclogger_socket->shut_down(); maclogger_socket->close(); } maclogger_exit = true; pthread_join(maclogger_thread, NULL); LOG_INFO("%s", "MAC_logger loop terminated. "); maclogger_enabled = false; #ifdef TESTSTRINGS tnbr = 0; #endif } fldigi-4.2.05/src/logbook/fd_view.fl0000664000175000017500000002534614611711171014166 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0305 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include "configuration.h"} {private local } Function {make_fd_view()} {open } { Fl_Window {} { label {Field Day Viewer - use with program 'fdserver'} open selected xywh {603 168 670 270} type Double align 5 visible } { Fl_Output view_FD_call { label {FD Call} xywh {59 6 77 24} code0 {o->value(progdefaults.my_FD_call.c_str());} } Fl_Output view_FD_class { label {FD Class} xywh {219 5 38 24} code0 {o->value(progdefaults.my_FD_class.c_str());} } Fl_Output view_FD_section { label {FD Section} xywh {341 5 38 24} code0 {o->value(progdefaults.my_FD_section.c_str());} } Fl_Output view_FD_mult { label {FD Mult} xywh {462 5 38 24} code0 {o->value(progdefaults.my_FD_mult.c_str());} } Fl_Output view_FD_score { label Score xywh {584 5 80 24} } Fl_Output {view_FD_CW[0]} { label CW xywh {55 49 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_CW[1]} { xywh {106 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[2]} { xywh {156 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[3]} { xywh {207 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[4]} { xywh {258 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[5]} { xywh {309 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[6]} { xywh {360 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[7]} { xywh {411 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[8]} { xywh {462 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[9]} { xywh {513 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[10]} { xywh {564 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW[11]} { xywh {615 49 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[0]} { label {Oper'} xywh {55 75 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[1]} { xywh {106 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[2]} { xywh {156 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[3]} { xywh {207 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[4]} { xywh {258 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[5]} { xywh {309 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[6]} { xywh {360 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[7]} { xywh {411 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[8]} { xywh {462 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[9]} { xywh {513 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[10]} { xywh {564 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_CW_OP[11]} { xywh {615 73 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[0]} { label DIG xywh {55 102 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_DIG[1]} { xywh {106 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[2]} { xywh {156 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[3]} { xywh {207 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[4]} { xywh {258 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[5]} { xywh {309 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[6]} { xywh {360 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[7]} { xywh {411 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[8]} { xywh {462 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[9]} { xywh {513 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[10]} { xywh {564 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG[11]} { xywh {615 103 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[0]} { label {Oper'} xywh {55 129 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[1]} { xywh {106 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[2]} { xywh {156 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[3]} { xywh {207 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[4]} { xywh {258 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[5]} { xywh {309 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[6]} { xywh {360 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[7]} { xywh {411 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[8]} { xywh {462 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[9]} { xywh {513 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[10]} { xywh {564 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_DIG_OP[11]} { xywh {615 128 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[0]} { label PHONE xywh {55 156 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[1]} { xywh {106 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[2]} { xywh {156 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[3]} { xywh {207 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[4]} { xywh {258 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[5]} { xywh {309 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[6]} { xywh {360 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[7]} { xywh {411 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[8]} { xywh {462 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[9]} { xywh {513 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[10]} { xywh {564 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE[11]} { xywh {615 158 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[0]} { label {Oper'} xywh {55 183 50 24} textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[1]} { xywh {106 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[2]} { xywh {156 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[3]} { xywh {207 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[4]} { xywh {258 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[5]} { xywh {309 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[6]} { xywh {360 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[7]} { xywh {411 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[8]} { xywh {462 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[9]} { xywh {513 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[10]} { xywh {564 183 50 24} align 20 textfont 4 textsize 12 } Fl_Output {view_FD_PHONE_OP[11]} { xywh {615 183 50 24} align 20 textfont 4 textsize 12 } Fl_Box {} { label 160 xywh {60 33 40 17} box FLAT_BOX } Fl_Box {} { label 80 xywh {111 33 40 17} box FLAT_BOX } Fl_Box {} { label 40 xywh {161 33 40 17} box FLAT_BOX } Fl_Box {} { label 20 xywh {212 33 40 17} box FLAT_BOX } Fl_Box {} { label 17 xywh {263 33 40 17} box FLAT_BOX } Fl_Box {} { label 15 xywh {314 33 40 17} box FLAT_BOX } Fl_Box {} { label 12 xywh {365 33 40 17} box FLAT_BOX } Fl_Box {} { label 10 xywh {416 33 40 17} box FLAT_BOX } Fl_Box {} { label 6 xywh {467 33 40 17} box FLAT_BOX } Fl_Box {} { label 2 xywh {518 33 40 17} box FLAT_BOX } Fl_Box {} { label 220 xywh {569 33 40 17} box FLAT_BOX } Fl_Box {} { label 440 xywh {620 33 40 17} box FLAT_BOX } Fl_Group {} { label {"fdserver" Client} open xywh {5 212 660 55} box ENGRAVED_BOX align 21 } { Fl_Input inp_fd_tcpip_addr { label {tcpip addr} callback {progdefaults.fd_tcpip_addr=o->value(); progdefaults.changed = true;} tooltip {fdserver tcipip address} xywh {85 234 150 24} code0 {o->value(progdefaults.fd_tcpip_addr.c_str());} code1 {\#include "flinput2.h"} class Fl_Input2 } Fl_Input inp_fd_tcpip_port { label port callback {progdefaults.fd_tcpip_port=o->value(); progdefaults.changed = true;} tooltip {fdserver tcpip port} xywh {273 234 75 24} code0 {o->value(progdefaults.fd_tcpip_port.c_str());} class Fl_Input2 } Fl_Input inp_fd_op_call { label {OP call} callback {progdefaults.fd_op_call=o->value(); progdefaults.changed = true;} tooltip {free form exchange} xywh {402 234 90 24} code0 {o->value(progdefaults.fd_op_call.c_str());} class Fl_Input2 } Fl_Check_Button btn_fd_connect { label Connect callback {progdefaults.connect_to_fdserver=o->value(); if (progdefaults.connect_to_fdserver) { listbox_contest->index(LOG_FD); progdefaults.logging = LOG_FD; } else { listbox_contest->index(LOG_QSO); progdefaults.logging = LOG_QSO; } UI_select();} tooltip {Connect / Disconnect^jAddr/Port/OP required} xywh {502 236 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.connect_to_fdserver);} code1 {\#include "confdialog.h"} code2 {\#include "fl_digi.h"} code3 {\#include "logsupport.h"} } Fl_Box box_fdserver_connected { label Connected xywh {608 237 18 18} box ROUND_DOWN_BOX color 31 align 1 } } } } fldigi-4.2.05/src/logbook/qrzlib.cxx0000664000175000017500000004606014611711171014243 00000000000000// ---------------------------------------------------------------------------- // qrzlib.cc // // Interface library to the QRZ database distributed by AA7BQ // // Copyright (C) 1999-2009 David Freese // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "qrzlib.h" #include "configuration.h" #include "debug.h" static char QRZdir[256] = ""; static const char *QRZpath; static const char *QRZtry[] = { #ifdef __WOE32__ "C:/CALLBK/", // look on C: drive first "D:/CALLBK/", "E:/CALLBK/", "F:/CALLBK/", "G:/CALLBK/", #else "~/callbk/", "/cdrom/callbk/", "/mnt/cdrom/callbk/", "/mnt/cdrom0/callbk/", "/mnt/cdrom1/callbk/", "/media/cdrom/callbk/", "/media/cdrom0/callbk/", "/media/cdrom1/callbk/", #endif 0 }; FILE *imagefile = NULL; #define isdirsep(c) ((c)=='/') int filename_expand(char *to,int tolen, const char *from) { char temp[tolen]; strlcpy(temp,from, tolen); char *start = temp; char *end = temp+strlen(temp); int ret = 0; for (char *a=temp; a= tolen) end += tolen - (end+1-e+t); memmove(a+t, e, end+1-e); end = a+t+(end-e); *end = '\0'; memcpy(a, value, t); ret++; } else { a = e+1; } } strlcpy(to, start, tolen); return ret; } char *QRZImageFilename (char *call) { static char fname[80], *p, imgcall[12]; FILE *f; strcpy(imgcall, call); p = imgcall; while (*p) {*p = tolower (*p); p++; } strcpy (fname, QRZdir); strcat (fname, "images/"); strcat (fname, &imgcall[strlen(imgcall)-1]); strcat (fname, "/"); strcat (fname, imgcall); while (fname[strlen(fname)-1] == ' ') fname[strlen(fname)-1] = 0; strcat (fname, ".jpg"); f = fl_fopen(fname, "r"); if (f != NULL) { fclose (f); return fname; } return NULL; } int checkPath( const char *filename ) { char fname[120]; FILE *f; bool notfound = false; if (!progdefaults.QRZpathname.empty()) { strcpy ( fname, progdefaults.QRZpathname.c_str()); for (size_t i = 0; i < strlen(fname); i++) if (fname[i] == '\\') fname[i] = '/'; // fix for DOS path convention strcat( fname, filename ); strcat( fname, ".dat" ); if (fname[0] == '~' || fname[0] == '$') { char f2name[80]; filename_expand(f2name, 79, fname); strcpy (fname, f2name); } f = fl_fopen(fname, "r" ); if( f != NULL ) { fclose( f ); char pathname[120]; strcpy( pathname, progdefaults.QRZpathname.c_str()); if (pathname[0] == '~' || pathname[0] == '$') filename_expand(QRZdir, 79, pathname); else strcpy (QRZdir, pathname); return 1; } std::string err = fname; err.append(" not found, performing search"); LOG_WARN("%s", err.c_str()); notfound = true; } // not specified, perform a search const char **pQRZpath = QRZtry; while (*pQRZpath) { strcpy( fname, *pQRZpath ); strcat( fname, filename ); strcat( fname, ".dat" ); if (fname[0] == '~' || fname[0] == '$') { char f2name[80]; filename_expand(f2name, 79, fname); strcpy (fname, f2name); } f = fl_fopen(fname, "r" ); if( f != NULL ) { fclose( f ); QRZpath = *pQRZpath; if (QRZpath[0] == '~' || QRZpath[0] == '$') filename_expand(QRZdir, 79, QRZpath); else strcpy (QRZdir, QRZpath); if (notfound) { std::string err = "Using "; err.append(fname); LOG_WARN("%s", err.c_str()); } return 1; } pQRZpath++; } QRZpath = QRZtry[0]; LOG_WARN("QRZ data base not found"); return 0; } void SetQRZdirectory(char *dir) { strcpy(QRZdir, dir); strcat(QRZdir, "/"); } bool QRZ::ImageExists() { if (Qimagefname == NULL) return (hasImage = false); imagefile = fl_fopen(Qimagefname, "r"); if (imagefile) { fclose (imagefile); return (hasImage = true); } return (hasImage = false); } void QRZ::OpenQRZFiles( const char *fname ) { long fsize; char dfname[64]; char idxname[64]; int num1; int num2; num1 = 0; num2 = 0; if( fname[0] == 0 ) { QRZvalid = 0; return; } QRZvalid = 1; if (*QRZdir == 0) if( checkPath( fname ) == 0 ) { QRZvalid = 0; return; } strcpy( dfname, QRZdir ); strcpy( idxname, QRZdir ); strcat( idxname, fname ); strcat( idxname, ".idx" ); strcat( dfname, fname ); strcat( dfname, ".dat" ); idxfile = fl_fopen( idxname, "r" ); if( idxfile == NULL ) { QRZvalid = 0; return; } fseek( idxfile, 0, SEEK_END ); fsize = ftell( idxfile ); rewind( idxfile ); idxsize = fsize - 48; index = new char[idxsize]; if( index == NULL ) { fclose( idxfile ); QRZvalid = 0; return; } memset( index, 0, idxsize ); num1 = fread( &idxhdr.dataname, 48, 1, idxfile ); num2 = fread( index, idxsize, 1, idxfile ); if (num1 != 1 || num2 != 1) { fclose( idxfile ); delete [] index; QRZvalid = 0; return; } fflush( stdout ); fclose( idxfile ); datafile = fl_fopen( dfname, "r" ); if( datafile == NULL ) { delete [] index; QRZvalid = 0; return; } sscanf( idxhdr.bytesperkey, "%d", &datarecsize ); if( datarecsize == 0 || datarecsize > 32767 ) { delete [] index; QRZvalid = 0; return; } // allocate sufficient data buffer for file read over key boundary if (data) delete [] data; data = new char[datarecsize + 512]; if( data == NULL ) { delete [] index; QRZvalid = 0; return; } // fill buffer with new-lines to insure not reading past end of // the buffer memset( data, '\n', datarecsize + 512 ); sscanf( idxhdr.keylen, "%d", &keylen ); sscanf( idxhdr.numkeys, "%ld", &numkeys ); top = index + idxsize - keylen; } QRZ::QRZ( const char *fname ) { int len = strlen(fname); criteria = fname[ len - 1 ]; OpenQRZFiles( fname ); } QRZ::QRZ( const char *fname, char c ) { criteria = c; OpenQRZFiles( fname ); } void QRZ::NewDBpath( const char *fname ) { int len = strlen(fname); criteria = fname[ len - 1 ]; *QRZdir = 0; OpenQRZFiles( fname ); } QRZ::~QRZ() { if (index) delete [] index; if (data) delete [] data; if( datafile != NULL ) fclose( datafile ); return; } int QRZ::CallComp( char *s1, char *s2 ) { static char sa[7], sb[7]; strncpy( sb, s2, 6 ); strncpy( sa, s1, 6 ); sa[6] = 0; sb[6] = 0; int stest = strncasecmp( sa + 3, sb + 3, 3 ); if( stest < 0 ) return -1; if( stest > 0 ) return 1; // suffix are equal int atest = strncasecmp( sa + 2, sb + 2, 1 ); if( atest < 0 ) return -1; if( atest > 0 ) return 1; // suffix & call area are equal int ptest = strncasecmp( sa, sb, 2 ); if( ptest < 0 ) return -1; if( ptest > 0 ) return 1; // total match of calls return 0; } char *Composite( char *s ) { static char newstr[7]; int ccount = strlen(s) < 7 ? strlen(s) : 6; memset(newstr, ' ', 6 ); newstr[6] = 0; if( isdigit( s[2] ) ) { for( int i = 0; i < ccount; i++ ) newstr[i] = s[i]; } else { newstr[0] = s[0]; newstr[2] = s[1]; for( int i = 2; i < ccount; i++ ) newstr[i+1] = s[i]; } return( newstr ); } int QRZ::ReadDataBlock( long p ) { rewind( datafile ); if ( p < 0 ) p = 0; if( fseek( datafile, p, SEEK_SET ) != 0 ) { return 1; } databytesread = fread( data, 1, datarecsize + 512, datafile ); dataoffset = p; fflush( stdout); return 0; } int QRZ::FindCallsign( char *field ) { char composite[7], testcall[7]; char *endofdata; int matched = 0, iOffset; memset( composite, 0, 6 ); memset( testcall, 0, 6 ); found = 0; idxptr = index; if( strlen( field ) < 3 ) // must be a valid callsign return 0; if ( !(isdigit( field[1] ) || isdigit( field[2] ) ) ) return 0; strcpy( composite, Composite( field ) ); for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( CallComp( composite, idxptr) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + databytesread; endofline = strchr( dfptr, '\n' ); if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { memcpy( testcall, dfptr, 6 ); if( (matched = CallComp( composite, Composite(testcall) ) ) <= 0 ) found = 1; else { endofline = strchr( dfptr, '\n' ); dfptr = endofline + 1; } } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); // check for old call referencing new call if (strlen(recbuffer) < 15 ) { dfptr = strchr( dfptr, ',' ) + 1; strcpy( recbuffer, dfptr ); // Qcall = recbuffer; found = -1; } else { found = 1; dfptr = endofline + 1; // point to next record } return (found); } found = 0; return 0; } int QRZ::nextrec() { if( dfptr > data + datarecsize ) { if( ReadDataBlock( dataoffset + (dfptr - data) ) != 0) return 0; dfptr = data; } endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); dfptr = endofline + 1; if (strlen(recbuffer) < 15 ) { nextrec(); } return 1; } int QRZ::NextRecord() { if( nextrec() == 1 ) return( ReadRec() ); return 0; } int QRZ::FindName( char *field ) { char *endofdata; int matched = 0, iOffset; char *Lname, *Fname; char sFname[17]; char sLname[17]; char sIdxName[33]; char *cptr; memset( sFname, 0, 17 ); memset( sLname, 0, 17 ); memset( sIdxName, 0, 33 ); if ( (cptr = strchr( field, ',' ) ) != NULL ) { strncpy( sLname, field, cptr - field ); strcpy( sFname, cptr + 1 ); } else strcpy( sLname, field ); strcpy( sIdxName, sLname ); if( strlen( sFname ) > 0 ) { strcat( sIdxName, " " ); strcat( sIdxName, sFname ); } found = 0; idxptr = index; for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( strncasecmp( sIdxName, idxptr, keylen ) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + databytesread; if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { endofline = strchr( dfptr, '\n' ); if( endofline == NULL || endofline > endofdata ) break; if( endofline - dfptr > 14 ) { // valid racord Lname = strchr( dfptr, ',' ) + 1; // locate Lname element Fname = strchr( Lname, ',' ) + 1; // locate Fname element if( *Fname == ',' ) Fname++; else Fname = strchr( Fname, ',' ) + 1; if( (matched = strncasecmp( sLname, Lname, strlen(sLname) ) ) == 0 ) { if( sFname[0] == 0 ) found = 1; else if( ( matched = strncasecmp( sFname, Fname, strlen(sFname) ) ) <= 0 ) found = 1; } } if (!found && (dfptr < endofdata ) ) dfptr = strchr( dfptr, '\n' ) + 1; // move to next record } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); found = 1; dfptr = endofline + 1; // point to next record return (found); } found = 0; return 0; } int QRZ::CompState( const char *field, const char *state, const char *city ) { int compsize = strlen(field+2), chk; if (compsize > keylen) compsize = keylen; if(strlen( field ) == 2) return ( strncasecmp( field, state, 2 ) ); if( (chk = strncasecmp( field, state, 2 ) ) < 0 ) return -1; if( chk > 0 ) return 1; chk = strncasecmp( field + 2, city, compsize); if (chk < 0) return -1; if (chk > 0) return 1; return 0; } int QRZ::FindState( char *field ) { char *endofdata; int matched = 0, iOffset; char *state; char *city; int compsize = strlen(field); if (compsize > keylen) compsize = keylen; found = 0; idxptr = index; for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( strncasecmp( field, idxptr, compsize ) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + datarecsize; if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { endofline = strchr( dfptr, '\n' ); if( endofline - dfptr > 14 ) { // valid record city = dfptr; for( int i = 0; i < 9; i++ ) // move to city element city = strchr( city, ',' ) + 1; state = strchr( city, ',' ) + 1; // move to state element matched = CompState( field, state, city ); if( matched == 0) found = 1; else { endofline = strchr( dfptr, '\n' ); // no match, move to next dfptr = endofline + 1; } } else { endofline = strchr( dfptr, '\n' ); // invalid record, move to next dfptr = endofline + 1; } } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); found = 1; dfptr = endofline + 1; // point to next record return (found); } found = 0; return 0; } int QRZ::FindZip( char *field ) { char *endofdata; int matched = 0, iOffset; char *zip; found = 0; idxptr = index; for( iOffset = 0; iOffset < numkeys; iOffset++, idxptr += keylen ) if( strncasecmp( field, idxptr, 5 ) <= 0 ) break; iOffset--; if (iOffset < 0) iOffset = 0; ReadDataBlock( datarecsize * iOffset ); dfptr = data; endofdata = data + datarecsize; if( idxptr != index ) { endofline = strchr( dfptr, '\n' ); if (endofline != NULL ) dfptr = endofline + 1; } found = 0; while ( !found && (dfptr < endofdata ) ) { endofline = strchr( dfptr, '\n' ); if( endofline - dfptr > 14 ) { // valid record zip = dfptr; for( int i = 0; i < 11; i++ ) // move to Zip element zip = strchr( zip, ',' ) + 1; if( (matched = strncasecmp( field, zip, 5 ) ) <= 0 ) found = 1; else { endofline = strchr( dfptr, '\n' ); // no match, move to next dfptr = endofline + 1; } } else { endofline = strchr( dfptr, '\n' ); // invalid record, move to next dfptr = endofline + 1; } } if ( matched == 0 ) { endofline = strchr( dfptr, '\n' ); *endofline = 0; strcpy( recbuffer, dfptr ); found = 1; dfptr = endofline + 1; // point to next record return (found); } found = 0; return 0; } int QRZ::FindRecord( char *field ) { if (QRZvalid == 0 ) return 0; switch (criteria) { case 'c' : FindCallsign( field ); break; case 'n' : FindName( field ); break; case 's' : FindState( field ); break; case 'z' : FindZip( field ); } return( ReadRec() ); } int QRZ::ReadRec() { char *comma; static char empty[] = { '\0' }; if( found == 1 ) { Qcall = recbuffer; comma = strchr( Qcall, ',' ); *comma = 0; Qlname = comma + 1; comma = strchr( Qlname, ',' ); *comma = 0; Qfname = comma + 1; comma = strchr( Qfname, ',' ); Qfname = comma + 1; // skip JR field comma = strchr( Qfname, ',' ); *comma = 0; Qdob = comma + 1; comma = strchr( Qdob, ',' ); Qdob = comma + 1; // skip MI field comma = strchr( Qdob, ',' ); *comma = 0; Qefdate = comma + 1; comma = strchr( Qefdate, ',' ); *comma = 0; Qexpdate = comma + 1; comma = strchr( Qexpdate, ',' ); *comma = 0; Qmail_str = comma + 1; comma = strchr( Qmail_str, ',' ); *comma = 0; Qmail_city = comma + 1; comma = strchr( Qmail_city, ',' ); *comma = 0; Qmail_st = comma + 1; comma = strchr( Qmail_st, ',' ); *comma = 0; Qmail_zip = comma + 1; comma = strchr( Qmail_zip, ',' ); *comma = 0; Qopclass = comma + 1; comma = strchr( Qopclass, ',' ); *comma = 0; Qp_call = comma + 1; comma = strchr( Qp_call, ',' ); *comma = 0; Qp_class = comma + 1; //Qp_class[1] = 0; *(comma + 2) = 0; Qimagefname = QRZImageFilename (GetCall()); return( 1 ); } else { Qcall = empty; Qlname = empty; Qfname = empty; Qdob = empty; Qefdate = empty; Qexpdate = empty; Qmail_str = empty; Qmail_city = empty; Qmail_st = empty; Qmail_zip = empty; Qopclass = empty; Qp_call = empty; Qp_class = empty; Qimagefname = NULL; return( 0 ); } } int QRZ::GetCount( char *unknown ) { int matched, cnt = 0; char temp[40]; if( FindRecord( unknown ) != 1 ) return(0); matched = 0; while (matched == 0) { cnt++; NextRecord(); switch (criteria) { case 'c' : matched = 1; break; case 'n' : if( strchr( unknown, ',' ) == 0 ) matched = strcasecmp( unknown, GetLname() ); else { strcpy( temp, GetLname() ); strcat( temp, "," ); strcat( temp, GetFname() ); matched = strncasecmp( unknown, temp, strlen(unknown) ); } break; case 'z' : matched = strncmp( unknown, GetZIP(), 5 ); break; case 's' : matched = CompState( unknown, GetState(), GetCity() ); break; default : matched = 1; } } return cnt; } char * QRZ::GetCall() { static char call[15]; char *p = call; strcpy (call, Qcall); while (*p) { if (*p == ' ') strcpy (p, p+1); if (*p != ' ') p++; } return( call ); }; const char * QRZ::GetLname() { return( Qlname ); }; const char * QRZ::GetFname() { return( Qfname ); }; const char * QRZ::GetDOB() { return( Qdob ); }; const char * QRZ::GetEFdate() { return( Qefdate ); }; const char * QRZ::GetEXPdate() { return( Qexpdate ); }; const char * QRZ::GetStreet() { return( Qmail_str ); }; const char * QRZ::GetCity() { return( Qmail_city ); }; const char * QRZ::GetState() { return( Qmail_st ); }; const char * QRZ::GetZIP() { return( Qmail_zip ); }; const char * QRZ::GetOPclass() { return( Qopclass ); }; const char * QRZ::GetPriorCall() { return( Qp_call ); }; const char * QRZ::GetPriorClass() { return( Qp_class ); }; int QRZ::getQRZvalid() { return( QRZvalid ); } const char * QRZ::GetImageFileName () { return (Qimagefname); } char * QRZ::CSV_Record() { static char info[256]; memset( info, 0, 256 ); snprintf( info, sizeof(info) - 1, "%s,%s,%s,%s,%s,%s,%s,%s,%s", GetCall(), Qopclass, Qefdate, Qlname, Qfname, Qmail_str, Qmail_city, Qmail_st, Qmail_zip ); return info; } char *QRZ::Fmt_Record() { static char info[256]; memset( info, 0, 256 ); snprintf( info, sizeof(info) - 1, "%s %s : %s\n%s %s\n%s\n%s, %s %s\n", GetCall(), Qopclass, Qefdate, Qfname, Qlname, Qmail_str, Qmail_city, Qmail_st, Qmail_zip ); return info; } fldigi-4.2.05/src/logbook/lookupcall.cxx0000664000175000017500000010064714611711171015107 00000000000000// ---------------------------------------------------------------------------- // lookupcall.cxx -- a part of fldigi // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Copyright (C) 2006-2007 // Leigh Klotz, WA5ZNU // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include "signal.h" #include #include #include #include #include #include "threads.h" #include "misc.h" #include "configuration.h" #include "lookupcall.h" #include "logsupport.h" #include "main.h" #include "confdialog.h" #include "fl_digi.h" #include "flmisc.h" #include "qrzlib.h" #include "trx.h" #include "xmlreader.h" #include "qrunner.h" #include "debug.h" #include "network.h" #include "locator.h" std::string qrzhost = "xmldata.qrz.com"; std::string qrzSessionKey; std::string qrzalert; std::string qrzerror; std::string callsign; std::string lookup_name; std::string lookup_addr1; std::string lookup_addr2; std::string lookup_state; std::string lookup_province; std::string lookup_zip; std::string lookup_country; std::string lookup_born; std::string lookup_fname; std::string lookup_qth; std::string lookup_grid; std::string lookup_latd; std::string lookup_lond; std::string lookup_notes; qrz_xmlquery_t DB_XML_query = QRZXMLNONE; qrz_webquery_t DB_WEB_query = QRZWEBNONE; enum TAG { QRZ_IGNORE, QRZ_KEY, QRZ_ALERT, QRZ_ERROR, QRZ_CALL, QRZ_FNAME, QRZ_NAME, QRZ_ADDR1, QRZ_ADDR2, QRZ_STATE, QRZ_ZIP, QRZ_COUNTRY, QRZ_LATD, QRZ_LOND, QRZ_GRID, QRZ_DOB }; pthread_t* QRZ_thread = 0; pthread_mutex_t qrz_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t qrz_cond = PTHREAD_COND_INITIALIZER; static void *LOOKUP_loop(void *args); bool parseSessionKey(); bool parse_xml(); bool getSessionKey(std::string& sessionpage); bool QRZGetXML(std::string& xmlpage); int bearing(const char *, const char *); void qra(const char *, double &, double &); void QRZ_disp_result(); void QRZ_CD_query(); void Lookup_init(void); void QRZclose(void); void qthappend(std::string &qth, std::string &datum); void QRZAlert(); bool QRZLogin(std::string& sessionpage); void QRZquery(); void parse_html(const std::string& htmlpage); bool HAMCALLget(std::string& htmlpage); void HAMCALLquery(); void QRZ_DETAILS_query(); QRZ *qCall = 0; static notify_dialog *announce = 0; std::string percent_encode (std::string str) { std::string chars = " !#$&'()*+,/:;=?@[]{}"; std::string out; char chrstr[10]; for (size_t n = 0; n < str.length(); n++) { if (chars.find(str[n]) != std::string::npos) { snprintf(chrstr, sizeof(chrstr), "%%%2X", str[n]); out.append(chrstr); } else out += str[n]; } return out; } void print_query(const std::string &name, const std::string &s) { // LOG_WARN("%s query:\n%s", name.c_str(), s.c_str()); LOG_VERBOSE("%s query:\n%s", name.c_str(), s.c_str()); } void print_data(const std::string &name, const std::string &s) { // LOG_WARN("%s data:\n%s", name.c_str(), s.c_str()); LOG_VERBOSE("%s data:\n%s", name.c_str(), s.c_str()); } void clear_Lookup() { lookup_name.clear(); lookup_addr1.clear(); lookup_addr2.clear(); lookup_state.clear(); lookup_province.clear(); lookup_zip.clear(); lookup_born.clear(); lookup_fname.clear(); lookup_qth.clear(); lookup_grid.clear(); lookup_latd.clear(); lookup_lond.clear(); lookup_notes.clear(); lookup_country.clear(); } // ---------------------------------------------------------------------------- // QRZ subscription query // ---------------------------------------------------------------------------- bool parseSessionKey(const std::string& sessionpage) { if (sessionpage.find("Bad Request") != std::string::npos) { return false; } IrrXMLReader* xml = createIrrXMLReader(new IIrrXMLStringReader(sessionpage)); TAG tag=QRZ_IGNORE; while(xml && xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: case EXN_CDATA: switch (tag) { default: break; case QRZ_KEY: qrzSessionKey = xml->getNodeData(); break; case QRZ_ALERT: qrzalert = xml->getNodeData(); break; case QRZ_ERROR: qrzerror = xml->getNodeData(); break; } break; case EXN_ELEMENT_END: tag=QRZ_IGNORE; break; case EXN_ELEMENT: { const char *nodeName = xml->getNodeName(); if (!strcmp("Key", nodeName)) tag=QRZ_KEY; else if (!strcmp("Alert", nodeName)) tag=QRZ_ALERT; else if (!strcmp("Error", nodeName)) tag=QRZ_ERROR; else tag=QRZ_IGNORE; break; } case EXN_NONE: case EXN_COMMENT: case EXN_UNKNOWN: break; } } delete xml; return true; } bool parse_xml(const std::string& xmlpage) { print_data("xmldata.qrz.com", xmlpage); if (xmlpage.find("Not found") != std::string::npos) { if (!announce) announce = new notify_dialog; announce->notify("Not found", 2.0); REQ(show_notifier, announce); return false; } IrrXMLReader* xml = createIrrXMLReader(new IIrrXMLStringReader(xmlpage)); // If we got any result back, clear the session key so that it will be // refreshed by this response, or if not present, will be removed and we'll // know to log in next time. if (xml) { qrzSessionKey.clear(); qrzalert.clear(); qrzerror.clear(); clear_Lookup(); } TAG tag = QRZ_IGNORE; // parse the file until end reached while(xml && xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: case EXN_CDATA: switch (tag) { default: case QRZ_IGNORE: break; case QRZ_CALL: break; case QRZ_FNAME: lookup_fname = xml->getNodeData(); break; case QRZ_NAME: lookup_name = xml->getNodeData(); break; case QRZ_ADDR1: { lookup_addr1 = xml->getNodeData(); size_t apt = lookup_addr1.find("#"); if (apt != std::string::npos) lookup_addr1.erase(apt, lookup_addr1.length() - apt); break; } case QRZ_ADDR2: lookup_addr2 = xml->getNodeData(); break; case QRZ_STATE: lookup_state = xml->getNodeData(); break; case QRZ_ZIP: lookup_zip = xml->getNodeData(); break; case QRZ_COUNTRY: lookup_country = xml->getNodeData(); break; case QRZ_LATD: lookup_latd = xml->getNodeData(); break; case QRZ_LOND: lookup_lond = xml->getNodeData(); break; case QRZ_GRID: lookup_grid = xml->getNodeData(); break; case QRZ_ALERT: qrzalert = xml->getNodeData(); break; case QRZ_ERROR: qrzerror = xml->getNodeData(); break; case QRZ_KEY: qrzSessionKey = xml->getNodeData(); break; } break; case EXN_ELEMENT_END: tag=QRZ_IGNORE; break; case EXN_ELEMENT: { const char *nodeName = xml->getNodeName(); if (!strcmp("call", nodeName)) tag = QRZ_CALL; else if (!strcmp("fname", nodeName)) tag = QRZ_FNAME; else if (!strcmp("name", nodeName)) tag = QRZ_NAME; else if (!strcmp("addr1", nodeName)) tag = QRZ_ADDR1; else if (!strcmp("addr2", nodeName)) tag = QRZ_ADDR2; else if (!strcmp("state", nodeName)) tag = QRZ_STATE; else if (!strcmp("zip", nodeName)) tag = QRZ_ZIP; else if (!strcmp("country", nodeName)) tag = QRZ_COUNTRY; else if (!strcmp("lat", nodeName)) tag = QRZ_LATD; else if (!strcmp("lon", nodeName)) tag = QRZ_LOND; else if (!strcmp("grid", nodeName)) tag = QRZ_GRID; else if (!strcmp("dob", nodeName)) tag = QRZ_DOB; else if (!strcmp("Alert", nodeName)) tag = QRZ_ALERT; else if (!strcmp("Error", nodeName)) tag = QRZ_ERROR; else if (!strcmp("Key", nodeName)) tag = QRZ_KEY; else tag = QRZ_IGNORE; } break; case EXN_NONE: case EXN_COMMENT: case EXN_UNKNOWN: break; } } // delete the xml parser after usage delete xml; return true; } bool getSessionKey(std::string& sessionpage) { std::string html = "http://"; html.append(qrzhost); html.append(" /xml/current/?username="); html.append(percent_encode(progdefaults.QRZusername)); html.append(";password="); html.append(percent_encode(progdefaults.QRZuserpassword)); html.append(";agent="); html.append(PACKAGE_NAME); html.append("-"); html.append(PACKAGE_VERSION); return get_http(html, sessionpage, 5.0); } bool QRZGetXML(std::string& xmlpage) { std::string html; html.assign("http://").append(qrzhost); html.append(" /bin/xml?s="); html.append(qrzSessionKey); html.append(";callsign="); html.append(callsign); return get_http(html, xmlpage, 5.0); } void camel_case(std::string &s) { bool first_letter = true; for (size_t n = 0; n < s.length(); n++) { if (s[n] == ' ') first_letter = true; else if (first_letter) { s[n] = toupper(s[n]); first_letter = false; } else s[n] = tolower(s[n]); } } void QRZ_disp_result() { ENSURE_THREAD(FLMAIN_TID); if (lookup_fname.length() > 0) { camel_case(lookup_fname); std::string::size_type spacePos = lookup_fname.find(" "); // if fname is "ABC" then display "ABC" // or if fname is "A BCD" then display "A BCD" if (spacePos == std::string::npos || (spacePos == 1)) { inpName->value(lookup_fname.c_str()); } // if fname is "ABC Y" then display "ABC" else if (spacePos > 2) { std::string fname; fname.assign(lookup_fname, 0, spacePos); inpName->value(fname.c_str()); } // fname must be "ABC DEF" so display "ABC DEF" else { inpName->value(lookup_fname.c_str()); } } else if (lookup_name.length() > 0) { // only name is set; don't know first/last, so just show all inpName->value(lookup_name.c_str()); } inpQth->value(lookup_qth.c_str()); #if FLDIGI_FLTK_API_MINOR < 4 inpQth->position (0); #else inpQth->insert_position (0); #endif inpState->value(lookup_state.c_str()); #if FLDIGI_FLTK_API_MINOR < 4 inpState->position (0); #else inpState->insert_position (0); #endif inpVEprov->value(lookup_province.c_str()); #if FLDIGI_FLTK_API_MINOR < 4 inpVEprov->position (0); #else inpVEprov->insert_position (0); #endif inpLoc->value(lookup_grid.c_str()); #if FLDIGI_FLTK_API_MINOR < 4 inpLoc->position (0); #else inpLoc->insert_position (0); #endif if (!lookup_country.empty()) { cboCountry->value(lookup_country.c_str()); } if (!progdefaults.myLocator.empty() && !lookup_grid.empty()) { char buf[10]; buf[0] = '\0'; double distance, azimuth, lon[2], lat[2]; if (QRB::locator2longlat(&lon[0], &lat[0], progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::locator2longlat(&lon[1], &lat[1], lookup_grid.c_str()) == QRB::QRB_OK && QRB::qrb(lon[0], lat[0], lon[1], lat[1], &distance, &azimuth) == QRB::QRB_OK) snprintf(buf, sizeof(buf), "%03.0f", round(azimuth)); inpAZ->value(buf); #if FLDIGI_FLTK_API_MINOR < 4 inpAZ->position (0); #else inpAZ->insert_position (0); #endif } inpNotes->value(lookup_notes.c_str()); #if FLDIGI_FLTK_API_MINOR < 4 inpNotes->position (0); #else inpNotes->insert_position (0); #endif } void QRZ_CD_query() { ENSURE_THREAD(QRZ_TID); char srch[20]; size_t snip; memset( srch, 0, sizeof(srch) ); strncpy( srch, callsign.c_str(), 6 ); for (size_t i = 0; i < strlen(srch); i ++ ) srch[i] = toupper(srch[i]); std::string notes; if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); else notes.clear(); if( qCall->FindRecord( srch ) == 1) { lookup_fname = qCall->GetFname(); camel_case(lookup_fname); snip = lookup_fname.find(' '); if (snip != std::string::npos) lookup_fname.erase(snip, lookup_fname.length() - snip); lookup_qth = qCall->GetCity(); lookup_state = qCall->GetState(); lookup_grid.clear(); if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_fname).append(" ").append(lookup_name).append("\n"); notes.append(lookup_addr1).append("\n"); notes.append(lookup_addr2); if (!lookup_state.empty()) notes.append(", ").append(lookup_state).append(" ").append(lookup_zip); else if (!lookup_province.empty()) notes.append(", ").append(lookup_province).append(" ").append(lookup_zip); else notes.append(" ").append(lookup_country); } } else { lookup_fname.clear(); lookup_qth.clear(); lookup_grid.clear(); lookup_born.clear(); lookup_notes.append("Not found in CD database"); } REQ(QRZ_disp_result); } void Lookup_init(void) { ENSURE_THREAD(FLMAIN_TID); if (QRZ_thread) return; QRZ_thread = new pthread_t; if (pthread_create(QRZ_thread, NULL, LOOKUP_loop, NULL) != 0) { LOG_PERROR("pthread_create"); return; } MilliSleep(10); } void QRZclose(void) { ENSURE_THREAD(FLMAIN_TID); if (!QRZ_thread) return; CANCEL_THREAD(*QRZ_thread); DB_XML_query = QRZXML_EXIT; DB_WEB_query = QRZWEB_EXIT; pthread_mutex_lock(&qrz_mutex); pthread_cond_signal(&qrz_cond); pthread_mutex_unlock(&qrz_mutex); pthread_join(*QRZ_thread, NULL); delete QRZ_thread; QRZ_thread = 0; } void qthappend(std::string &qth, std::string &datum) { if (datum.empty()) return; if (!qth.empty()) qth += ", "; qth += datum; } void QRZAlert() { ENSURE_THREAD(FLMAIN_TID); std::string qrznote; if (!qrzalert.empty()) { qrznote.append("QRZ alert:\n"); qrznote.append(qrzalert); qrznote.append("\n"); qrzalert.clear(); } if (!qrzerror.empty()) { qrznote.append("QRZ error:\n"); qrznote.append(qrzerror); qrzerror.clear(); } std::string notes; if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); else notes.clear(); if (!qrznote.empty()) { if (!notes.empty()) notes.append("\n"); notes.append(qrznote); inpNotes->value(notes.c_str()); } } bool QRZLogin(std::string& sessionpage) { bool ok = true; if (qrzSessionKey.empty()) { ok = getSessionKey(sessionpage); if (ok) ok = parseSessionKey(sessionpage); } if (!ok) { LOG_VERBOSE("failed"); REQ(QRZAlert); } return ok; } void QRZquery() { ENSURE_THREAD(QRZ_TID); bool ok = true; std::string qrzpage; if (qrzSessionKey.empty()) ok = QRZLogin(qrzpage); if (ok) ok = QRZGetXML(qrzpage); if (ok) { parse_xml(qrzpage); if (!qrzalert.empty() || !qrzerror.empty()) REQ(QRZAlert); else { lookup_qth = lookup_addr2; if (lookup_country.find("Canada") != std::string::npos) { lookup_province = lookup_state; lookup_state.clear(); } std::string notes; if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); else notes.clear(); if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_fname).append(" ").append(lookup_name).append("\n"); notes.append(lookup_addr1).append("\n"); notes.append(lookup_addr2); if (!lookup_state.empty()) notes.append(", ").append(lookup_state).append(" ").append(lookup_zip); else if (!lookup_province.empty()) notes.append(", ").append(lookup_province).append(" ").append(lookup_zip); else notes.append(" ").append(lookup_country); } lookup_notes = notes; REQ(QRZ_disp_result); } } else { qrzerror = qrzpage; REQ(QRZAlert); } } // --------------------------------------------------------------------- // HTTP:://callook.info queries // --------------------------------------------------------------------- std::string node_data(const std::string &xmlpage, const std::string nodename) { size_t pos1, pos2; std::string test; test.assign("<").append(nodename).append(">"); pos1 = xmlpage.find(test); if (pos1 == std::string::npos) return ""; pos1 += test.length(); test.assign(""); pos2 = xmlpage.find(test); if (pos2 == std::string::npos) return ""; return xmlpage.substr(pos1, pos2 - pos1); } void parse_callook(std::string& xmlpage) { print_data("Callook info", xmlpage); if (xmlpage.find("INVALID") != std::string::npos) { if (!announce) announce = new notify_dialog; announce->notify("Call not found", 2.0); REQ(show_notifier, announce); return; } std::string nodestr = node_data(xmlpage, "current"); if (nodestr.empty()) { if (!announce) announce = new notify_dialog; announce->notify("no data from callook.info", 2.0); REQ(show_notifier, announce); return; } size_t start_pos = xmlpage.find(""); if (start_pos == std::string::npos) return; start_pos += 10; xmlpage = xmlpage.substr(start_pos); lookup_name = node_data(xmlpage, "name"); camel_case(lookup_name); lookup_fname = lookup_name; nodestr = node_data(xmlpage, "address"); if (!nodestr.empty()) { lookup_addr1 = node_data(nodestr, "line1"); lookup_addr2 = node_data(nodestr, "line2"); } nodestr = node_data(xmlpage, "location"); if (!nodestr.empty()) { lookup_lond = node_data(nodestr, "longitude"); lookup_latd = node_data(nodestr, "latitude"); lookup_grid = node_data(nodestr, "gridsquare"); } std::string notes; if (!progdefaults.clear_notes) notes.assign(inpNotes->value()); else notes.clear(); if (progdefaults.notes_address) { if (!notes.empty()) notes.append("\n"); notes.append(lookup_name).append("\n"); notes.append(lookup_addr1).append("\n"); notes.append(lookup_addr2); } lookup_notes = notes; size_t p = lookup_addr2.find(","); if (p != std::string::npos) { lookup_qth = lookup_addr2.substr(0, p); lookup_addr2.erase(0, p+2); p = lookup_addr2.find(" "); if (p != std::string::npos) lookup_state = lookup_addr2.substr(0, p); } } bool CALLOOKGetXML(std::string& xmlpage) { std::string url = progdefaults.callookurl; url.append(callsign).append("/xml"); bool res = get_http(url, xmlpage, 5.0); LOG_VERBOSE("result = %d", res); return res; } void CALLOOKquery() { ENSURE_THREAD(QRZ_TID); // bool ok = true; std::string CALLOOKpage; clear_Lookup(); // ok = CALLOOKGetXML(CALLOOKpage); // if (ok) parse_callook(CALLOOKpage); REQ(QRZ_disp_result); } // --------------------------------------------------------------------- // Hamcall specific functions // --------------------------------------------------------------------- #define HAMCALL_CALL (char)181 #define HAMCALL_FIRST (char)184 #define HAMCALL_CITY (char)191 #define HAMCALL_STATE (char)192 #define HAMCALL_GRID (char)202 #define HAMCALL_DOB (char)194 void parse_html(const std::string& htmlpage) { print_data("Hamcall data", htmlpage); size_t p; clear_Lookup(); if ((p = htmlpage.find(HAMCALL_FIRST)) != std::string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length() ) lookup_fname.append(1, htmlpage[p++]); camel_case(lookup_fname); } if ((p = htmlpage.find(HAMCALL_CITY)) != std::string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_qth.append(1, htmlpage[p++]); } if ((p = htmlpage.find(HAMCALL_STATE)) != std::string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_state.append(1, htmlpage[p++]); } if ((p = htmlpage.find(HAMCALL_GRID)) != std::string::npos) { p++; while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_grid.append(1, htmlpage[p++]); } if ((p = htmlpage.find(HAMCALL_DOB)) != std::string::npos) { p++; lookup_notes.append("DOB: "); while ((uchar)htmlpage[p] < 128 && p < htmlpage.length()) lookup_notes.append(1, htmlpage[p++]); } } bool HAMCALLget(std::string& htmlpage) { std::string html; size_t p1; html.assign(progdefaults.hamcallurl); if ((p1 = html.find("https")) != std::string::npos) html.erase(p1+4,1); if (html[html.length()-1] != '/') html += '/'; html.append("/call?username="); html.append(percent_encode(progdefaults.QRZusername)); html.append("&password="); html.append(percent_encode(progdefaults.QRZuserpassword)); html.append("&rawlookup=1&callsign="); html.append(callsign); html.append("&program=fldigi-"); html.append(VERSION); return get_http(html, htmlpage, 5.0); // print_query("hamcall", url_html); // std::string url = progdefaults.hamcallurl; // size_t p = url.find("//"); // std::string service = url.substr(0, p); // url.erase(0, p+2); // size_t len = url.length(); // if (url[len-1]=='/') url.erase(len-1, 1); // return network_query(url, service, url_html, htmlpage, 5.0); } void HAMCALLquery() { ENSURE_THREAD(QRZ_TID); std::string htmlpage; if (HAMCALLget(htmlpage)) parse_html(htmlpage); else lookup_notes = htmlpage; REQ(QRZ_disp_result); } // --------------------------------------------------------------------- // Hamcall specific functions // --------------------------------------------------------------------- static std::string HAMQTH_session_id = ""; static std::string HAMQTH_reply = ""; #define HAMQTH_DEBUG 1 #undef HAMQTH_DEBUG /* * send: https://www.hamqth.com/xml.php?u=username&p=password * response: 09b0ae90050be03c452ad235a1f2915ad684393c * * send: https://www.hamqth.com/xml.php?id=09b0ae90050be03c452ad235a1f2915ad684393c\ &callsign=ok7an&prg=YOUR_PROGRAM_NAME * response: ok7an Petr Neratovice Czech Republic 503 28 15 jo70gg Petr Hlozek 17. listopadu 1065 Neratovice 27711 Czech Republic 503 GZL Y Y Y Y petr@ok7an.com petr@ok7an.com PetrHH 1982 1998 https://www.ok7an.com 50.07 14.42 EU -1 https://www.hamqth.com/userfiles/o/ok/ok7an/_profile/ok7an_nove.jpg */ bool HAMQTH_get_session_id() { std::string url; std::string retstr = ""; size_t p1 = std::string::npos; size_t p2 = std::string::npos; url.assign(progdefaults.hamqthurl); if ((p1 = url.find("https")) != std::string::npos) url.erase(p1+4,1); if (url[url.length()-1] != '/') url += '/'; url.append("xml.php?u=").append(percent_encode(progdefaults.QRZusername)); url.append("&p=").append(percent_encode(progdefaults.QRZuserpassword)); HAMQTH_session_id.clear(); int ret = get_http(url, retstr, 5.0); if (ret == 0 ) { LOG_ERROR("get_http( %s, retstr, 5.0) failed\n", url.c_str()); return false; } LOG_VERBOSE("url: %s", url.c_str()); LOG_VERBOSE("reply: %s\n", retstr.c_str()); p1 = retstr.find(""); if (p1 != std::string::npos) { p2 = retstr.find(""); if (p2 != std::string::npos) { p1 += 7; lookup_notes = retstr.substr(p1, p2 - p1); } return false; } p1 = retstr.find(""); if (p1 == std::string::npos) { lookup_notes = "HamQTH not available"; return false; } p2 = retstr.find(""); HAMQTH_session_id = retstr.substr(p1 + 12, p2 - p1 - 12); print_data("HamQTH session id", HAMQTH_session_id); return true; } void parse_HAMQTH_html(const std::string& htmlpage) { print_data("HamQth html", htmlpage); size_t p = std::string::npos; size_t p1 = std::string::npos; std::string tempstr; clear_Lookup(); lookup_fname.clear(); lookup_qth.clear(); lookup_state.clear(); lookup_grid.clear(); lookup_notes.clear(); lookup_country.clear(); if ((p = htmlpage.find("")) != std::string::npos) { p += 7; p1 = htmlpage.find("", p); if (p1 != std::string::npos) { std::string errstr = htmlpage.substr(p, p1 - p); if (!announce) announce = new notify_dialog; announce->notify(errstr.c_str(), 2.0); REQ(show_notifier, announce); } return; } if ((p = htmlpage.find("")) != std::string::npos) { p += 6; p1 = htmlpage.find("", p); if (p1 != std::string::npos) { lookup_fname = htmlpage.substr(p, p1 - p); camel_case(lookup_fname); } } if ((p = htmlpage.find("")) != std::string::npos) { p += 5; p1 = htmlpage.find("", p); if (p1 != std::string::npos) lookup_qth = htmlpage.substr(p, p1 - p); } if ((p = htmlpage.find("")) != std::string::npos) { p += 9; p1 = htmlpage.find("", p); if (p1 != std::string::npos) { lookup_country = htmlpage.substr(p, p1 - p); if (lookup_country == "Canada") { p = htmlpage.find(""); if (p != std::string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != std::string::npos) lookup_province = htmlpage.substr(p, p1 - p); } } } } if ((p = htmlpage.find("")) != std::string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != std::string::npos) lookup_state = htmlpage.substr(p, p1 - p); } if ((p = htmlpage.find("")) != std::string::npos) { p += 6; p1 = htmlpage.find("", p); if (p1 != std::string::npos) lookup_grid = htmlpage.substr(p, p1 - p); } if ((p = htmlpage.find("")) != std::string::npos) { p += 9; p1 = htmlpage.find("", p); if (p1 != std::string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append("QSL via: ").append(tempstr).append("\n"); } } if (progdefaults.notes_address) { if ((p = htmlpage.find("")) != std::string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != std::string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(tempstr).append("\n"); } } if ((p = htmlpage.find("")) != std::string::npos) { p += 13; p1 = htmlpage.find("", p); if (p1 != std::string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(tempstr).append("\n"); } } if ((p = htmlpage.find("")) != std::string::npos) { p += 10; p1 = htmlpage.find("", p); if (p1 != std::string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(tempstr); if (!lookup_state.empty()) lookup_notes.append(", ").append(lookup_state); else if (!lookup_province.empty()) lookup_notes.append(", ").append(lookup_province); } } if ((p = htmlpage.find("")) != std::string::npos) { p += 9; p1 = htmlpage.find("", p); if (p1 != std::string::npos) { tempstr.assign(htmlpage.substr(p, p1 - p)); if (!tempstr.empty()) lookup_notes.append(" ").append(tempstr); } } } } bool HAMQTHget(std::string& htmlpage) { std::string url; bool ret; if (HAMQTH_session_id.empty()) { if (!HAMQTH_get_session_id()) { LOG_WARN("HAMQTH session id failed!"); lookup_notes = "Get session id failed!\n"; return false; } } size_t p1; url.assign(progdefaults.hamqthurl); if ((p1 = url.find("https")) != std::string::npos) url.erase(p1+4,1); if (url[url.length()-1] != '/') url += '/'; url.append("xml.php?id=").append(HAMQTH_session_id); url.append("&callsign=").append(callsign); url.append("&prg=FLDIGI"); print_query("HamQTH", url); ret = get_http(url, htmlpage, 5.0); size_t p = htmlpage.find("Session does not exist or expired"); if (p != std::string::npos) { htmlpage.clear(); LOG_WARN("HAMQTH session id expired!"); HAMQTH_session_id.clear(); if (!HAMQTH_get_session_id()) { LOG_WARN("HAMQTH get session id failed!"); lookup_notes = "Get session id failed!\n"; htmlpage.clear(); return false; } ret = get_http(url, htmlpage, 5.0); } #ifdef HAMQTH_DEBUG FILE *fetchit = fopen("fetchit.txt", "a"); fprintf(fetchit, "%s\n", htmlpage.c_str()); fclose(fetchit); #endif return ret; } void HAMQTHquery() { ENSURE_THREAD(QRZ_TID); std::string htmlpage; if (!HAMQTHget(htmlpage)) return; parse_HAMQTH_html(htmlpage); REQ(QRZ_disp_result); } // ---------------------------------------------------------------------------- void QRZ_DETAILS_query() { std::string qrz = progdefaults.qrzurl; qrz.append("db/").append(callsign); cb_mnuVisitURL(0, (void*)qrz.c_str()); } void HAMCALL_DETAILS_query() { std::string hamcall = progdefaults.hamcallurl; hamcall.append("call?callsign=").append(callsign); cb_mnuVisitURL(0, (void*)hamcall.c_str()); } void HAMQTH_DETAILS_query() { std::string hamqth = progdefaults.hamqthurl; hamqth.append(callsign); cb_mnuVisitURL(0, (void*)hamqth.c_str()); } void CALLOOK_DETAILS_query() { std::string hamcall = progdefaults.callookurl; hamcall.append(callsign); cb_mnuVisitURL(0, (void *)hamcall.c_str()); } // ---------------------------------------------------------------------------- static void *LOOKUP_loop(void *args) { SET_THREAD_ID(QRZ_TID); SET_THREAD_CANCEL(); for (;;) { TEST_THREAD_CANCEL(); pthread_mutex_lock(&qrz_mutex); pthread_cond_wait(&qrz_cond, &qrz_mutex); pthread_mutex_unlock(&qrz_mutex); switch (DB_XML_query) { case QRZCD : QRZ_CD_query(); break; case QRZNET : QRZquery(); break; case HAMCALLNET : HAMCALLquery(); break; case CALLOOK: CALLOOKquery(); break; case HAMQTH: HAMQTHquery(); break; case QRZXML_EXIT: return NULL; default: break; } switch (DB_WEB_query) { case QRZHTML : QRZ_DETAILS_query(); break; case HAMCALLHTML : HAMCALL_DETAILS_query(); break; case HAMQTHHTML : HAMQTH_DETAILS_query(); break; case CALLOOKHTML : CALLOOK_DETAILS_query(); break; case QRZWEB_EXIT: return NULL; default: break; } } return NULL; } void CALLSIGNquery() { ENSURE_THREAD(FLMAIN_TID); if (!QRZ_thread) Lookup_init(); // Filter callsign for nonsense characters (remove all but [A-Za-z0-9/]) callsign.clear(); for (const char* p = inpCall->value(); *p; p++) if (isalnum(*p) || *p == '/') callsign += *p; if (callsign.empty()) return; if (callsign != inpCall->value()) inpCall->value(callsign.c_str()); size_t slash; while ((slash = callsign.rfind('/')) != std::string::npos) { if (((slash+1) * 2) < callsign.length()) callsign.erase(0, slash + 1); else callsign.erase(slash); } switch (DB_XML_query = static_cast(progdefaults.QRZXML)) { case QRZNET: LOG_INFO("%s","Request sent to qrz.com..."); break; case HAMCALLNET: LOG_INFO("%s","Request sent to www.hamcall.net..."); break; case QRZCD: if (!qCall) qCall = new QRZ( "callbkc" ); if (progdefaults.QRZchanged) { qCall->NewDBpath("callbkc"); progdefaults.QRZchanged = false; } if (!qCall->getQRZvalid()) { LOG_ERROR("%s","QRZ DB error"); DB_XML_query = QRZXMLNONE; return; } break; case CALLOOK: LOG_INFO("Request sent to %s", progdefaults.callookurl.c_str()); break; case HAMQTH: LOG_INFO("Request sent to %s", progdefaults.hamqthurl.c_str()); break; case QRZXMLNONE: break; default: LOG_ERROR("Bad query type %d", DB_XML_query); return; } DB_WEB_query = static_cast(progdefaults.QRZWEB); pthread_mutex_lock(&qrz_mutex); pthread_cond_signal(&qrz_cond); pthread_mutex_unlock(&qrz_mutex); } /// With this constructor, no need to declare the array mode_info[] in the calling program. QsoHelper::QsoHelper(int the_mode) : qso_rec( new cQsoRec ) { qso_rec->putField(ADIF_MODE, mode_info[the_mode].adif_name ); } /// This saves the new record to a file and must be run in the main thread. static void QsoHelperSave(cQsoRec * qso_rec_ptr) { qsodb.qsoNewRec (qso_rec_ptr); qsodb.isdirty(0); qsodb.isdirty(0); loadBrowser(true); /// It is mandatory to do this in the main thread. TODO: Crash suspected. adifFile.writeLog (logbook_filename.c_str(), &qsodb); /// Beware that this object is created in a thread and deleted in the main one. delete qso_rec_ptr ; } /// This must be called from the main thread, according to writeLog(). QsoHelper::~QsoHelper() { qso_rec->setDateTime(true); qso_rec->setDateTime(false); qso_rec->setFrequency( wf->rfcarrier() ); REQ( QsoHelperSave, qso_rec ); // It will be deleted in the main thread. qso_rec = NULL ; } /// Adds one key-value pair to display in the ADIF file. void QsoHelper::Push( ADIF_FIELD_POS pos, const std::string & value ) { qso_rec->putField( pos, value.c_str() ); } fldigi-4.2.05/src/logbook/qso_db.cxx0000664000175000017500000004420314611711171014204 00000000000000// ---------------------------------------------------------------------------- // qso_db.cxx // // Copyright (C) 2006-2009 // Dave Freese, W1HKJ // Remi Chateauneu, 2011 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "qso_db.h" #include "field_def.h" #include "globals.h" #include "timeops.h" #include "debug.h" #include "pthread.h" static int compby = COMPDATE; static bool date_off = true; bool cQsoDb::reverse = false; cQsoRec::cQsoRec() { for (int i=0;i < NUMFIELDS; i++) { qsofield[i] = new std::string; qsofield[i]->clear(); } } cQsoRec::~cQsoRec () { for (int i = 0; i < NUMFIELDS; i++) delete qsofield[i]; } void cQsoRec::clearRec () { for (int i = 0; i < NUMFIELDS; i++) qsofield[i]->clear(); } int cQsoRec::validRec() { return 0; } void cQsoRec::checkBand() { size_t flen = qsofield[FREQ]->length(), blen = qsofield[BAND]->length(); if (flen == 0 && blen != 0) { for (size_t n = 0; n < blen; n++) (*qsofield[BAND])[n] = tolower((*qsofield[BAND])[n]); *qsofield[FREQ] = band_freq((*qsofield[BAND]).c_str()); } else if (blen == 0 && flen != 0) *qsofield[BAND] = band_name((*qsofield[FREQ]).c_str()); } void cQsoRec::checkDateTimes() { size_t len1 = qsofield[TIME_ON]->length(), len2 = qsofield[TIME_OFF]->length(); if (len1 == 0 && len2 != 0) *qsofield[TIME_ON] = *qsofield[TIME_OFF]; else if (len1 != 0 && len2 == 0) *qsofield[TIME_OFF] = *qsofield[TIME_ON]; len1 = qsofield[QSO_DATE]->length(); len2 = qsofield[QSO_DATE_OFF]->length(); if (len1 == 0 && len2 != 0) *qsofield[QSO_DATE] = *qsofield[QSO_DATE_OFF]; else if (len1 != 0 && len2 == 0) *qsofield[QSO_DATE_OFF] = *qsofield[QSO_DATE]; } // Sets the current time, with the right format. void cQsoRec::setDateTime(bool dtOn) { time_t tmp_time = time(NULL); struct tm tmp_tm ; if (localtime_r(&tmp_time, &tmp_tm)) { char buf_date[64] ; snprintf( buf_date, sizeof(buf_date), "%04d%02d%02d", 1900 + tmp_tm.tm_year, 1 + tmp_tm.tm_mon, tmp_tm.tm_mday ); char buf_time[64] ; snprintf( buf_time, sizeof(buf_time), "%02d%02d%02d", tmp_tm.tm_hour, tmp_tm.tm_min, tmp_tm.tm_sec ); if(dtOn) { putField(QSO_DATE, buf_date); putField(TIME_ON, buf_time); } else { putField(QSO_DATE_OFF, buf_date); putField(TIME_OFF, buf_time); } } } /// It must match a specific format. Input in Hertz. void cQsoRec::setFrequency(unsigned long long freq) { double freq_dbl = freq / 1000000.0 ; char buf_freq[64]; snprintf( buf_freq, sizeof(buf_freq), "%lf", freq_dbl ); putField(FREQ, buf_freq ); } void cQsoRec::putField (int n, const char *s){ if (n < 0 || n >= NUMFIELDS) return; qsofield[n]->assign(s);// = s; } void cQsoRec::putField (int n, const char *s, int len) { if (n < 0 || n >= NUMFIELDS) return; qsofield[n]->assign(s, len); } void cQsoRec::addtoField (int n, const char *s){ if (n < 0 || n >= NUMFIELDS) return; qsofield[n]->append(s); } void cQsoRec::trimFields () { size_t p; std::string s; for (int i = 0; i < NUMFIELDS; i++) { s = *qsofield[i]; //right trim string p = s.length(); while (p && s[p-1] == ' ') { s.erase(p - 1); p = s.length(); } //left trim string p = s.length(); while (p && s[0] == ' ') { s.erase(0,1); p = s.length(); } //make all upper case if Callsign or Mode if (i == CALL || i == ADIF_MODE) { for (p = 0; p < s.length(); p++) s[p] = toupper(s[p]); } *qsofield[i] = s; } } static const char *empty_field = ""; const char * cQsoRec::getField (int n) const { if (n < 0 || n >= NUMFIELDS) return empty_field; return (qsofield[n]->c_str()); } const cQsoRec &cQsoRec::operator=(const cQsoRec &right) { if (this != &right) { for (int i = 0; i < NUMFIELDS; i++) { (this->qsofield[i])->assign((right.qsofield[i])->c_str()); } } return *this; } int compareTimes (const cQsoRec &r1, const cQsoRec &r2) { if (date_off) return r1.qsofield[TIME_OFF]->compare(*r2.qsofield[TIME_OFF]); return r1.qsofield[TIME_ON]->compare(*r2.qsofield[TIME_ON]); } int compareDates (const cQsoRec &r1, const cQsoRec &r2) { if (date_off) return r1.qsofield[QSO_DATE_OFF]->compare(*r2.qsofield[QSO_DATE_OFF]); return r1.qsofield[QSO_DATE]->compare(*r2.qsofield[QSO_DATE]); } int compareCalls (const cQsoRec &r1, const cQsoRec &r2) { return (r1.qsofield[CALL])->compare( *r2.qsofield[CALL] ); } int compareModes (const cQsoRec &r1, const cQsoRec &r2) { return (r1.qsofield[ADIF_MODE])->compare( *r2.qsofield[ADIF_MODE] ); } int compareFreqs (const cQsoRec &r1, const cQsoRec &r2) { double f1, f2; f1 = atof(r1.qsofield[FREQ]->c_str()); f2 = atof(r2.qsofield[FREQ]->c_str()); return (f1 == f2 ? 0 : f1 < f2 ? -1 : 1); } int comparebydate(const void *p1, const void *p2) { cQsoRec *r1, *r2; if (cQsoDb::reverse) { r2 = (cQsoRec *)p1; r1 = (cQsoRec *)p2; } else { r1 = (cQsoRec *)p1; r2 = (cQsoRec *)p2; } int cmp; if ((cmp = compareDates(*r1, *r2))) return cmp; if ((cmp = compareTimes(*r1, *r2))) return cmp; if ((cmp = compareCalls(*r1, *r2))) return cmp; if ((cmp = compareModes(*r1, *r2))) return cmp; return compareFreqs(*r1, *r2); } int comparebymode(const void *p1, const void *p2) { cQsoRec *r1, *r2; if (cQsoDb::reverse) { r2 = (cQsoRec *)p1; r1 = (cQsoRec *)p2; } else { r1 = (cQsoRec *)p1; r2 = (cQsoRec *)p2; } int cmp; if ((cmp = compareModes(*r1, *r2)) != 0) return cmp; if ((cmp = compareDates(*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; return compareFreqs(*r1, *r2); } int comparebycall(const void *p1, const void *p2) { cQsoRec *r1, *r2; if (cQsoDb::reverse) { r2 = (cQsoRec *)p1; r1 = (cQsoRec *)p2; } else { r1 = (cQsoRec *)p1; r2 = (cQsoRec *)p2; } int cmp; if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; if ((cmp = compareDates(*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareModes(*r1, *r2)) != 0) return cmp; return compareFreqs(*r1, *r2); } int comparebyfreq(const void *p1, const void *p2) { cQsoRec *r1, *r2; if (cQsoDb::reverse) { r2 = (cQsoRec *)p1; r1 = (cQsoRec *)p2; } else { r1 = (cQsoRec *)p1; r2 = (cQsoRec *)p2; } int cmp; if ((cmp = compareFreqs(*r1, *r2)) != 0) return cmp; if ((cmp = compareDates(*r1, *r2)) != 0) return cmp; if ((cmp = compareTimes(*r1, *r2)) != 0) return cmp; if ((cmp = compareCalls(*r1, *r2)) != 0) return cmp; return compareModes(*r1, *r2); } bool cQsoRec::operator==(const cQsoRec &right) const { if (compareDates (*this, right) != 0) return false; if (compareTimes (*this, right) != 0) return false; if (compareCalls (*this, right) != 0) return false; if (compareFreqs (*this, right) != 0) return false; return true; } bool cQsoRec::operator<(const cQsoRec &right) const { if (compareDates (*this, right) > -1) return false; if (compareTimes (*this, right) > -1) return false; if (compareCalls (*this, right) > -1) return false; if (compareFreqs (*this, right) > -1) return false; return true; } static char delim_in = '\t'; static char delim_out = '\t'; static bool isVer3 = false; std::ostream &operator<< (std::ostream &output, const cQsoRec &rec) { for (int i = 0; i < EXPORT; i++) output << rec.qsofield[i]->c_str() << delim_out; return output; } std::istream &operator>> (std::istream &input, cQsoRec &rec ) { static char buf[1024]; // Must be big enough for a field. for (int i = 0; i < NUMFIELDS; i++) { input.getline( buf, sizeof(buf), delim_in ); *rec.qsofield[i] = buf ; } return input; } //====================================================================== // class cQsoDb #define MAXRECS 100000 #define INCRRECS 10000 cQsoDb::cQsoDb() { nbrrecs = 0; maxrecs = MAXRECS; qsorec = new cQsoRec[maxrecs]; compby = COMPDATE; dirty = 0; } cQsoDb::cQsoDb(cQsoDb *db) { nbrrecs = 0; maxrecs = db->nbrRecs(); qsorec = new cQsoRec[maxrecs]; for (int i = 0; i < maxrecs; i++) qsorec[i] = db->qsorec[i]; compby = COMPDATE; nbrrecs = maxrecs; dirty = 0; } cQsoDb::~cQsoDb() { delete [] qsorec; } void cQsoDb::deleteRecs() { delete [] qsorec; nbrrecs = 0; maxrecs = MAXRECS; qsorec = new cQsoRec[maxrecs]; dirty = 0; } void cQsoDb::clearDatabase() { deleteRecs(); } int cQsoDb::qsoFindRec(cQsoRec *rec) { for (int i = 0; i < nbrrecs; i++) if (qsorec[i] == *rec) return i; return -1; } void cQsoDb::qsoNewRec (cQsoRec *nurec) { if (nbrrecs == maxrecs) { maxrecs += INCRRECS; cQsoRec *atemp = new cQsoRec[maxrecs]; for (int i = 0; i < nbrrecs; i++) atemp[i] = qsorec[i]; delete [] qsorec; qsorec = atemp; } qsorec[nbrrecs] = *nurec; qsorec[nbrrecs].checkBand(); qsorec[nbrrecs].checkDateTimes(); nbrrecs++; } cQsoRec* cQsoDb::newrec() { if (nbrrecs == maxrecs) { maxrecs += INCRRECS; cQsoRec *atemp = new cQsoRec[maxrecs]; for (int i = 0; i < nbrrecs; i++) atemp[i] = qsorec[i]; delete [] qsorec; qsorec = atemp; } nbrrecs++; return &qsorec[nbrrecs - 1]; } void cQsoDb::qsoDelRec (int rnbr) { if (rnbr < 0 || rnbr > (nbrrecs - 1)) return; for (int i = rnbr; i < nbrrecs - 1; i++) qsorec[i] = qsorec[i+1]; nbrrecs--; qsorec[nbrrecs].clearRec(); } void cQsoDb::qsoUpdRec (int rnbr, cQsoRec *updrec) { if (rnbr < 0 || rnbr > (nbrrecs - 1)) return; qsorec[rnbr] = *updrec; qsorec[rnbr].checkBand(); return; } #if 1 void cQsoDb::SortByDate (bool how) { date_off = how; qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebydate); } void cQsoDb::SortByCall () { qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebycall); } void cQsoDb::SortByMode () { qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebymode); } void cQsoDb::SortByFreq () { qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebyfreq); } #else #include using Clock = std::chrono::steady_clock; using std::chrono::time_point; using std::chrono::duration_cast; using std::chrono::milliseconds; void cQsoDb::SortByDate (bool how) { date_off = how; time_point start = Clock::now(); qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebydate); time_point end = Clock::now(); milliseconds diff = duration_cast(end - start); LOG_VERBOSE("qsort in %.0f msec", 1.0* diff.count()); } void cQsoDb::SortByCall () { time_point start = Clock::now(); qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebycall); time_point end = Clock::now(); milliseconds diff = duration_cast(end - start); LOG_VERBOSE("qsort in %.0f msec", 1.0* diff.count()); } void cQsoDb::SortByMode () { time_point start = Clock::now(); qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebymode); time_point end = Clock::now(); milliseconds diff = duration_cast(end - start); LOG_VERBOSE("qsort in %.0f msec", 1.0* diff.count()); } void cQsoDb::SortByFreq () { time_point start = Clock::now(); qsort (qsorec, nbrrecs, sizeof (cQsoRec), comparebyfreq); time_point end = Clock::now(); milliseconds diff = duration_cast(end - start); LOG_VERBOSE("qsort in %.0f msec", 1.0* diff.count()); } #endif bool cQsoDb::qsoIsValidFile(const char *fname) { char buff[256]; std::ifstream inQsoFile (fname, std::ios::in); if (!inQsoFile) return false; inQsoFile.getline (buff, 256); if (strstr (buff, "_LOGBODUP DB") == 0) { inQsoFile.close(); return false; } inQsoFile.close(); return true; } int cQsoDb::qsoReadFile (const char *fname) { char buff[256]; std::ifstream inQsoFile (fname, std::ios::in); if (!inQsoFile) return 1; inQsoFile.getline (buff, 256); if (strstr (buff, "_LOGBODUP DB") == 0) { inQsoFile.close(); return 2; } if (strstr (buff, "_LOGBODUP DBX") == 0) // new file format delim_in = '\n'; if (strstr (buff, "3.0") != 0) isVer3 = true; cQsoRec inprec; while (inQsoFile >> inprec) qsoNewRec (&inprec); inQsoFile.close(); SortByDate(date_off); return 0; } int cQsoDb::qsoWriteFile (const char *fname) { std::ofstream outQsoFile (fname, std::ios::out); if (!outQsoFile) { return 1; } outQsoFile << "_LOGBODUP DBX 3.0" << '\n'; for (int i = 0; i < nbrrecs; i++) outQsoFile << qsorec[i]; outQsoFile.close(); return 0; } const int cQsoDb::jdays[2][13] = { { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }, { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 } }; bool cQsoDb::isleapyear( int y ) const { if( y % 400 == 0 || ( y % 100 != 0 && y % 4 == 0 ) ) return true; return false; } int cQsoDb::dayofyear (int year, int mon, int mday) { return mday + jdays[isleapyear (year) ? 1 : 0][mon]; } unsigned long cQsoDb::epoch_dt (const char *szdate, const char *sztime) { unsigned long doe; int era, cent, quad, rest; int year, mon, mday; int secs; year = ((szdate[0]*10 + szdate[1])*10 + szdate[2])*10 + szdate[3]; mon = szdate[4]*10 + szdate[5]; mday = szdate[6]*10 + szdate[7]; secs = ((sztime[0]*10 + sztime[1])*60 + sztime[2]*10 + sztime[3])*60 + + sztime[4]*10 + sztime[5]; /* break down the year into 400, 100, 4, and 1 year multiples */ rest = year - 1; quad = rest / 4; rest %= 4; cent = quad / 25; quad %= 25; era = cent / 4; cent %= 4; /* set up doe */ doe = dayofyear (year, mon, mday); doe += era * (400 * 365 + 97); doe += cent * (100 * 365 + 24); doe += quad * (4 * 365 + 1); doe += rest * 365; return doe*60*60*24 + secs; } int cQsoDb::duplicate( const char *callsign, const char *szdate, const char *sztime, unsigned int interval, bool chkdatetime, const char *freq, bool chkfreq, const char *state, bool chkstate, const char *mode, bool chkmode, const char *xchg1, bool chkxchg1 ) { bool b_freqDUP = true, b_stateDUP = true, b_modeDUP = true, b_xchg1DUP = true, b_dtimeDUP = true; unsigned long datetime = 0L; unsigned long qsodatetime = 0L; int f1 = 0; int f2 = 0; int isdup = 0; if (freq) f1 = (int)(atof(freq)/1000.0); if (chkdatetime) datetime = epoch_dt(szdate, sztime); for (int i = 0; i < nbrrecs; i++) { if (strcasecmp(qsorec[i].getField(CALL), callsign) == 0) { // found callsign duplicate if (!chkdatetime && !chkfreq && !chkstate && !chkmode && !chkxchg1) isdup = 2; if (szdate == NULL) return isdup; b_freqDUP = b_stateDUP = b_modeDUP = b_xchg1DUP = b_dtimeDUP = false; if (chkfreq) { f2 = (int)atof(qsorec[i].getField(FREQ)); b_freqDUP = (f1 == f2); } if (chkstate) b_stateDUP = (qsorec[i].getField(STATE)[0] == 0 && state[0] == 0) || (strcasestr(qsorec[i].getField(STATE), state) != 0); if (chkmode) b_modeDUP = (qsorec[i].getField(ADIF_MODE)[0] == 0 && mode[0] == 0) || (strcasestr(qsorec[i].getField(ADIF_MODE), mode) != 0); if (chkxchg1) b_xchg1DUP = (qsorec[i].getField(XCHG1)[0] == 0 && xchg1[0] == 0) || (strcasestr(qsorec[i].getField(XCHG1), xchg1) != 0); if (chkdatetime) { qsodatetime = epoch_dt ( qsorec[i].getField(QSO_DATE), qsorec[i].getField(TIME_OFF)); if ((datetime - qsodatetime) < interval*60) b_dtimeDUP = true; } if ( (!chkfreq || (chkfreq && b_freqDUP)) && (!chkstate || (chkstate && b_stateDUP)) && (!chkmode || (chkmode && b_modeDUP)) && (!chkxchg1 || (chkxchg1 && b_xchg1DUP)) && (!chkdatetime || (chkdatetime && b_dtimeDUP))) { isdup = 1; } } } return isdup; } // set epoch interval test to 15 * 60 static inline const char *adifmode(const char *mode) { for (int i = 0; i < NUM_MODES; i++) { if (strcasecmp(mode_info[i].sname, mode) == 0) return (mode_info[i].adif_name); } return ""; } int cQsoDb::matched( cQsoRec *rec ) { bool match = false; bool test = false; int interval = 60 * 15; const char *callsign = rec->getField(CALL); const char *date = rec->getField(QSO_DATE); const char *time = rec->getField(TIME_ON); const char *mode = rec->getField(ADIF_MODE); const char *band = rec->getField(BAND); unsigned long qsodatetime, lotwdatetime = epoch_dt(date, time); int freq = (int)(atof(rec->getField(FREQ)) / 1000.0); int difftime; for (int i = 0; i < nbrrecs; i++) { // test CALL match = (strcasecmp(qsorec[i].getField(CALL), callsign) == 0); if (!match) continue; // test FREQ test = (freq == (int)(atof(qsorec[i].getField(FREQ)) / 1000.0)); // test BAND iff FREQ test fails if (!test) test = (strcasecmp(qsorec[i].getField(BAND), band) == 0); match = match && test; if (!match) continue; // test MODE test = (qsorec[i].getField(ADIF_MODE)[0] == 0 && mode[0] == 0) || (strcasestr(qsorec[i].getField(ADIF_MODE), mode) != 0); if (!test) test = (strcasecmp(mode, adifmode(qsorec[i].getField(ADIF_MODE))) == 0); if (!test) test = (strcasecmp(mode, "DATA") == 0); match = match && test; if (!match) continue; // test date/time (epoch) qsodatetime = epoch_dt ( qsorec[i].getField(QSO_DATE), qsorec[i].getField(TIME_ON)); difftime = (int)(lotwdatetime - qsodatetime); if (abs(difftime) < interval) test = true; else test = false; match = match && test; if (!match) continue; // found match // printf("%10s, %12s, %s, %s, %s\n%10s, %12s, %s, %s, %s\n", // rec->getField(CALL), rec->getField(FREQ), rec->getField(QSO_DATE), rec->getField(TIME_ON), rec->getField(ADIF_MODE), // qsorec[i].getField(CALL), qsorec[i].getField(FREQ), qsorec[i].getField(QSO_DATE), qsorec[i].getField(TIME_ON), qsorec[i].getField(ADIF_MODE) ); // printf("epoch test: %ud ~= %ud ==> %d\n", (uint)lotwdatetime, (uint)qsodatetime, difftime); return i; } return -1; } fldigi-4.2.05/src/logbook/county_lists.cxx0000664000175000017500000023662414611711171015506 00000000000000// ---------------------------------------------------------------------------- // county lists // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "counties.h" //std::string strSQSO // US entries: // State, , , // , , // Canadian entries: // Province, , , // , , , // United Kingdom entries: // United Kingom, UK, , // , UK, , const char *szSQSO = "\ State/Province, ST/PR, County/City/District, CCD\n\ NIL, ,none,none\n\ Alaska,AK,AK1st (SE),SE\n\ ,AK,AK2nd (NW),NW\n\ ,AK,AK3rd (SC),SC\n\ ,AK,AK4th (C),C\n\ Alabama,AL,Autauga,AUTA\n\ ,AL,Baldwin,BALD\n\ ,AL,Barbour,BARB\n\ ,AL,Bibb,BIBB\n\ ,AL,Blount,BLOU\n\ ,AL,Bullock,BULL\n\ ,AL,Butler,BUTL\n\ ,AL,Calhoun,CHOU\n\ ,AL,Chambers,CHMB\n\ ,AL,Cherokee,CKEE\n\ ,AL,Chilton,CHIL\n\ ,AL,Choctaw,CHOC\n\ ,AL,Clarke,CLRK\n\ ,AL,Clay,CLAY\n\ ,AL,Cleburne,CLEB\n\ ,AL,Coffee,COFF\n\ ,AL,Colbert,COLB\n\ ,AL,Conecuh,CONE\n\ ,AL,Coosa,COOS\n\ ,AL,Covington,COVI\n\ ,AL,Crenshaw,CREN\n\ ,AL,Cullman,CULM\n\ ,AL,Dale,DALE\n\ ,AL,Dallas,DLLS\n\ ,AL,DeKalb,DKLB\n\ ,AL,Elmore,ELMO\n\ ,AL,Escambia,ESCA\n\ ,AL,Etowah,ETOW\n\ ,AL,Fayette,FAYE\n\ ,AL,Franklin,FRNK\n\ ,AL,Geneva,GENE\n\ ,AL,Greene,GREE\n\ ,AL,Hale,HALE\n\ ,AL,Henry,HNRY\n\ ,AL,Houston,HOUS\n\ ,AL,Jackson,JKSN\n\ ,AL,Jefferson,JEFF\n\ ,AL,Lamar,LAMA\n\ ,AL,Lauderdale,LAUD\n\ ,AL,Lawrence,LAWR\n\ ,AL,Lee,LEE\n\ ,AL,Limestone,LIME\n\ ,AL,Lowndes,LOWN\n\ ,AL,Macon,MACO\n\ ,AL,Madison,MDSN\n\ ,AL,Marengo,MRGO\n\ ,AL,Marion,MARI\n\ ,AL,Marshall,MRSH\n\ ,AL,Mobile,MOBI\n\ ,AL,Monroe,MNRO\n\ ,AL,Montgomery,MGMY\n\ ,AL,Morgan,MORG\n\ ,AL,Perry,PERR\n\ ,AL,Pickens,PICK\n\ ,AL,Pike,PIKE\n\ ,AL,Randolph,RAND\n\ ,AL,Russell,RSSL\n\ ,AL,Shelby,SHEL\n\ ,AL,St. Clair,SCLR\n\ ,AL,Sumter,SUMT\n\ ,AL,Talladega,TDEG\n\ ,AL,Tallapoosa,TPOO\n\ ,AL,Tuscaloosa,TUSC\n\ ,AL,Walker,WLKR\n\ ,AL,Washington,WASH\n\ ,AL,Wilcox,WLCX\n\ ,AL,Winston,WINS\n\ Alberta,AB,MD of Acadia No. 34,ACAD\n\ ,AB,Athabasca County,ATHA\n\ ,AB,County of Barrhead No. 11,BARR\n\ ,AB,Beaver County,BEAV\n\ ,AB,Big Lakes County,BIGL\n\ ,AB,MD of Bighorn No. 8,BIGH\n\ ,AB,Birch Hills County,BIRC\n\ ,AB,MD of Bonnyville No. 87,BONN\n\ ,AB,Brazeau County,BRAZ\n\ ,AB,Camrose County,CAMR\n\ ,AB,Cardston County,CARD\n\ ,AB,Clear Hills County,CLHI\n\ ,AB,Clearwater County,CLWA\n\ ,AB,Cypress County,CYPR\n\ ,AB,MD of Fairview No. 136,FAIR\n\ ,AB,Flagstaff County,FLAG\n\ ,AB,Foothills County,FOOT\n\ ,AB,County of Forty Mile No. 8,FORT\n\ ,AB,County of Grande Prairie No. 1,GRAN\n\ ,AB,MD of Greenview No. 16,GREE\n\ ,AB,Kneehill County,KNEE\n\ ,AB,Lac Ste. Anne County,LACS\n\ ,AB,Lacombe County,LACO\n\ ,AB,Lamont County,LAMO\n\ ,AB,Leduc County,LEDU\n\ ,AB,MD of Lesser Slave River No. 124,LESS\n\ ,AB,Lethbridge County,LETH\n\ ,AB,County of Minburn No. 27,MINB\n\ ,AB,Mountain View County,MOUN\n\ ,AB,County of Newell,NEWE\n\ ,AB,County of Northern Lights,NOLI\n\ ,AB,Northern Sunrise County,NOSU\n\ ,AB,MD of Opportunity No. 17,OPPO\n\ ,AB,County of Paintearth No. 18,PAIN\n\ ,AB,Parkland County,PARK\n\ ,AB,MD of Peace No. 135,PEAC\n\ ,AB,MD of Pincher Creek No. 9,PINC\n\ ,AB,Ponoka County,PONO\n\ ,AB,MD of Provost No. 52,PROV\n\ ,AB,MD of Ranchland No. 66,RANC\n\ ,AB,Red Deer County,RDDR\n\ ,AB,Rocky View County,ROCK\n\ ,AB,Saddle Hills County,SADD\n\ ,AB,Smoky Lake County,SMLA\n\ ,AB,MD of Smoky River No. 130,SMRI\n\ ,AB,MD of Spirit River No. 133,SPRI\n\ ,AB,County of St. Paul No. 19,STPA\n\ ,AB,Starland County,STAR\n\ ,AB,County of Stettler No. 6,STET\n\ ,AB,Sturgeon County,STUR\n\ ,AB,MD of Taber,TABR\n\ ,AB,Thorhild County,THOR\n\ ,AB,County of Two Hills No. 21,TWHI\n\ ,AB,County of Vermilion River,VERM\n\ ,AB,Vulcan County,VULC\n\ ,AB,MD of Wainwright No. 61,WAIN\n\ ,AB,County of Warner No. 5,WARN\n\ ,AB,Westlock County,WEST\n\ ,AB,County of Wetaskiwin No. 10,WETA\n\ ,AB,Wheatland County,WHEA\n\ ,AB,MD of Willow Creek No. 26,WILL\n\ ,AB,Woodlands County,WOOD\n\ ,AB,Yellowhead County,YELL\n\ Arizona,AZ,Apache,APH\n\ ,AZ,Cochise,CHS\n\ ,AZ,Coconino,CNO\n\ ,AZ,Gila,GLA\n\ ,AZ,Graham,GHM\n\ ,AZ,Greenlee,GLE\n\ ,AZ,La Paz,LPZ\n\ ,AZ,Maricopa,MCP\n\ ,AZ,Mohave,MHV\n\ ,AZ,Navajo,NVO\n\ ,AZ,Pima,PMA\n\ ,AZ,Pinal,PNL\n\ ,AZ,Santa Cruz,SCZ\n\ ,AZ,Yavapai,YVP\n\ ,AZ,Yuma,YMA\n\ Arkansas,AR,Arkansas,ARKA\n\ ,AR,Ashley,ASHL\n\ ,AR,Baxter,BAXT\n\ ,AR,Benton,BENT\n\ ,AR,Boone,BOON\n\ ,AR,Bradley,BRAD\n\ ,AR,Calhoun,CALH\n\ ,AR,Carroll,CARR\n\ ,AR,Chicot,CHIC\n\ ,AR,Clark,CLRK\n\ ,AR,Clay,CLAY\n\ ,AR,Cleburne,CLEB\n\ ,AR,Cleveland,CLEV\n\ ,AR,Columbia,COLU\n\ ,AR,Conway,CONW\n\ ,AR,Craighead,CRAG\n\ ,AR,Crawford,CRAW\n\ ,AR,Crittenden,CRIT\n\ ,AR,Cross,CROS\n\ ,AR,Dallas,DALL\n\ ,AR,Desha,DESH\n\ ,AR,Drew,DREW\n\ ,AR,Faulkner,FAUL\n\ ,AR,Franklin,FRNK\n\ ,AR,Fulton,FULT\n\ ,AR,Garland,GARL\n\ ,AR,Grant,GRNT\n\ ,AR,Greene,GREN\n\ ,AR,Hempstead,HEMP\n\ ,AR,Hot Spring,HSPR\n\ ,AR,Howard,HOWA\n\ ,AR,Independence,INDE\n\ ,AR,Izard,IZRD\n\ ,AR,Jackson,JACK\n\ ,AR,Jefferson,JEFF\n\ ,AR,Johnson,JOHN\n\ ,AR,Lafayette,LAFA\n\ ,AR,Lawrence,LAWR\n\ ,AR,Lee,LEE\n\ ,AR,Lincoln,LINC\n\ ,AR,Little River,LRVR\n\ ,AR,Logan,LOGN\n\ ,AR,Lonoke,LONO\n\ ,AR,Madison,MADI\n\ ,AR,Marion,MARI\n\ ,AR,Miller,MILL\n\ ,AR,Mississippi,MISS\n\ ,AR,Monroe,MONR\n\ ,AR,Montgomery,MTGY\n\ ,AR,Nevada,NEVA\n\ ,AR,Newton,NEWT\n\ ,AR,Ouachita,OUAC\n\ ,AR,Perry,PERR\n\ ,AR,Phillips,PHIL\n\ ,AR,Pike,PIKE\n\ ,AR,Poinsett,POIN\n\ ,AR,Polk,POLK\n\ ,AR,Pope,POPE\n\ ,AR,Prairie,PRAR\n\ ,AR,Pulaski,PULA\n\ ,AR,Randolph,RAND\n\ ,AR,Saline,SALI\n\ ,AR,Scott,SCOT\n\ ,AR,Searcy,SRCY\n\ ,AR,Sebastian,SEBA\n\ ,AR,Sevier,SEVR\n\ ,AR,Sharp,SHRP\n\ ,AR,St. Francis,STFR\n\ ,AR,Stone,STON\n\ ,AR,Union,UNIO\n\ ,AR,Van Buren,VBRN\n\ ,AR,Washington,WASH\n\ ,AR,White,WHIE\n\ ,AR,Woodruff,WOOD\n\ ,AR,Yell,YELL\n\ British Columbia,BC,Abbotsford,ABF\n\ ,BC,Burnaby North-Seymour,BNS\n\ ,BC,Burnaby South,BUS\n\ ,BC,Cariboo-Prince George,CPG\n\ ,BC,Central Okanagan-Similkameen-Nicola,CSN\n\ ,BC,Chilliwack-Hope,CHP\n\ ,BC,Cloverdale-Langley City,CLC\n\ ,BC,Coquitlam-Port Coquitlam,CPC\n\ ,BC,Courtenay-Alberni,COA\n\ ,BC,Cowichan-Malahat-Langford,CML\n\ ,BC,Delta,DEL\n\ ,BC,Esquimalt-Saanich-Sooke,ESQ\n\ ,BC,Fleetwood-Port Kells,FPK\n\ ,BC,Kamloops-Thompson-Cariboo,KTC\n\ ,BC,Kelowna-Lake Country,KEL\n\ ,BC,Kootenay-Columbia,KOC\n\ ,BC,Langley-Aldergrove,LAA\n\ ,BC,Mission-Matsqui-Fraser Canyon,MMF\n\ ,BC,Nanaimo-Ladysmith,NAL\n\ ,BC,New Westminster-Burnaby,NWB\n\ ,BC,North Island-Powell River,NPR\n\ ,BC,North Okanagan-Shuswap,NOS\n\ ,BC,North Vancouver,NVA\n\ ,BC,Pitt Meadows-Maple Ridge,PMM\n\ ,BC,Port Moody-Coquitlam,PMC\n\ ,BC,Prince George-Peace River-Northern Rockies,PPN\n\ ,BC,Richmond Center,RIC\n\ ,BC,Saanich-Gulf Islands,SGI\n\ ,BC,Skeena-Bulkley Valley,SBV\n\ ,BC,South Okanagan-West Kootenay,SWK\n\ ,BC,South Surrey-White Rock,SWR\n\ ,BC,Steveston-Richmond East,STR\n\ ,BC,Surrey Centre,SUC\n\ ,BC,Surrey-Newton,SUN\n\ ,BC,Vancouver Centre,VAC\n\ ,BC,Vancouver East,VAE\n\ ,BC,Vancouver Kingsway,VAK\n\ ,BC,Vancouver Quadra,VAQ\n\ ,BC,Vancouver South,VAS\n\ ,BC,Vancouver-Granville,VAG\n\ ,BC,Victoria,VIC\n\ ,BC,West Vanc,WVS\n\ California,CA,Alameda,ALAM\n\ ,CA,Alpine,ALPI\n\ ,CA,Amador,AMAD\n\ ,CA,Butte,BUTT\n\ ,CA,Calaveras,CALA\n\ ,CA,Colusa,COLU\n\ ,CA,Contra Costa,CCOS\n\ ,CA,Del Norte,DELN\n\ ,CA,El Dorado,ELDO\n\ ,CA,Fresno,FRES\n\ ,CA,Glenn,GLEN\n\ ,CA,Humboldt,HUMB\n\ ,CA,Imperial,IMPE\n\ ,CA,Inyo,INYO\n\ ,CA,Kern,KERN\n\ ,CA,Kings,KING\n\ ,CA,Lake,LAKE\n\ ,CA,Lassen,LASS\n\ ,CA,Los Angeles,LANG\n\ ,CA,Madera,MADE\n\ ,CA,Marin,MARN\n\ ,CA,Mariposa,MARP\n\ ,CA,Mendocino,MEND\n\ ,CA,Merced,MERC\n\ ,CA,Modoc,MODO\n\ ,CA,Mono,MONO\n\ ,CA,Monterey,MONT\n\ ,CA,Napa,NAPA\n\ ,CA,Nevada,NEVA\n\ ,CA,Orange,ORAN\n\ ,CA,Placer,PLAC\n\ ,CA,Plumas,PLUM\n\ ,CA,Riverside,RIVE\n\ ,CA,Sacramento,SACR\n\ ,CA,San Benito,SBEN\n\ ,CA,San Bernardino,SBER\n\ ,CA,San Diego,SDIE\n\ ,CA,San Francisco,SFRA\n\ ,CA,San Joaquin,SJOA\n\ ,CA,San Luis Obispo,SLUI\n\ ,CA,San Mateo,SMAT\n\ ,CA,Santa Barbara,SBAR\n\ ,CA,Santa Clara,SCLA\n\ ,CA,Santa Cruz,SCRU\n\ ,CA,Shasta,SHAS\n\ ,CA,Sierra,SIER\n\ ,CA,Siskiyou,SISK\n\ ,CA,Solano,SOLA\n\ ,CA,Sonoma,SONO\n\ ,CA,Stanislaus,STAN\n\ ,CA,Sutter,SUTT\n\ ,CA,Tehama,TEHA\n\ ,CA,Trinity,TRIN\n\ ,CA,Tulare,TULA\n\ ,CA,Tuolumne,TUOL\n\ ,CA,Ventura,VENT\n\ ,CA,Yolo,YOLO\n\ ,CA,Yuba,YUBA\n\ Colorado,CO,Adams,ADA\n\ ,CO,Alamosa,ALA\n\ ,CO,Arapahoe,ARA\n\ ,CO,Archuleta,ARC\n\ ,CO,Baca,BAC\n\ ,CO,Bent,BEN\n\ ,CO,Boulder,BOU\n\ ,CO,Broomfield,BRO\n\ ,CO,Chaffee,CHA\n\ ,CO,Cheyenne,CHE\n\ ,CO,Clear Creek,CLC\n\ ,CO,Conejos,CON\n\ ,CO,Costilla,COS\n\ ,CO,Crowley,CRO\n\ ,CO,Custer,CUS\n\ ,CO,Delta,DEL\n\ ,CO,Denver,DEN\n\ ,CO,Dolores,DOL\n\ ,CO,Douglas,DOU\n\ ,CO,Eagle,EAG\n\ ,CO,El Paso,ELP\n\ ,CO,Elbert,ELB\n\ ,CO,Fremont,FRE\n\ ,CO,Garfield,GAR\n\ ,CO,Gilpin,GIL\n\ ,CO,Grand,GRA\n\ ,CO,Gunnison,GUN\n\ ,CO,Hinsdale,HIN\n\ ,CO,Huerfano,HUE\n\ ,CO,Jackson,JAC\n\ ,CO,Jefferson,JEF\n\ ,CO,Kiowa,KIO\n\ ,CO,Kit Carson,KIC\n\ ,CO,La Plata,LAP\n\ ,CO,Lake,LAK\n\ ,CO,Larimer,LAR\n\ ,CO,Las Animas,LAA\n\ ,CO,Lincoln,LIN\n\ ,CO,Logan,LOG\n\ ,CO,Mesa,MES\n\ ,CO,Mineral,MIN\n\ ,CO,Moffat,MOF\n\ ,CO,Montezuma,MON\n\ ,CO,Montrose,MOT\n\ ,CO,Morgan,MOR\n\ ,CO,Otero,OTE\n\ ,CO,Ouray,OUR\n\ ,CO,Park,PAR\n\ ,CO,Phillips,PHI\n\ ,CO,Pitkin,PIT\n\ ,CO,Prowers,PRO\n\ ,CO,Pueblo,PUE\n\ ,CO,Rio Blanco,RIB\n\ ,CO,Rio Grande,RIG\n\ ,CO,Routt,ROU\n\ ,CO,Saguache,SAG\n\ ,CO,San Juan,SAJ\n\ ,CO,San Miguel,SAM\n\ ,CO,Sedgwick,SED\n\ ,CO,Summit,SUM\n\ ,CO,Teller,TEL\n\ ,CO,Washington,WAS\n\ ,CO,Weld,WEL\n\ ,CO,Yuma,YUM\n\ Connecticut,CT,Fairfield,FAI\n\ ,CT,Hartford,HAR\n\ ,CT,Litchfield,LIT\n\ ,CT,Middlesex,MIC\n\ ,CT,New Haven,NHV\n\ ,CT,New London,NLN\n\ ,CT,Tolland,TOL\n\ ,CT,Windham,WIN\n\ Delaware,DE,Kent,KDE\n\ ,DE,New Castle,NDE\n\ ,DE,Sussex,SDE\n\ Dist. of Col.,DC,District of Columbia,\n\ Florida,FL,ALACHUA,ALC\n\ ,FL,BAKER,BAK\n\ ,FL,BAY,BAY\n\ ,FL,BRADFORD,BRA\n\ ,FL,BREVARD,BRE\n\ ,FL,BROWARD,BRO\n\ ,FL,CALHOUN,CAH\n\ ,FL,CHARLOTTE,CHA\n\ ,FL,CITRUS,CIT\n\ ,FL,CLAY,CLA\n\ ,FL,COLLIER,CLR\n\ ,FL,COLUMBIA,CLM\n\ ,FL,MIAMI-DADE,DAD\n\ ,FL,DESOTO,DES\n\ ,FL,DIXIE,DIX\n\ ,FL,DUVAL,DUV\n\ ,FL,ESCAMBIA,ESC\n\ ,FL,FLAGLER,FLG\n\ ,FL,FRANKLIN,FRA\n\ ,FL,GADSDEN,GAD\n\ ,FL,GILCHRIST,GIL\n\ ,FL,GLADES,GLA\n\ ,FL,GULF,GUL\n\ ,FL,HAMILTON,HAM\n\ ,FL,HARDEE,HAR\n\ ,FL,HENDRY,HEN\n\ ,FL,HERNANDO,HER\n\ ,FL,HIGHLANDS,HIG\n\ ,FL,HILLSBOROUGH,HIL\n\ ,FL,HOLMES,HOL\n\ ,FL,INDIAN RIVER,IDR\n\ ,FL,JACKSON,JAC\n\ ,FL,JEFFERSON,JEF\n\ ,FL,LAFAYETTE,LAF\n\ ,FL,LAKE,LAK\n\ ,FL,LEE,LEE\n\ ,FL,LEON,LEO\n\ ,FL,LEVY,LEV\n\ ,FL,LIBERTY,LIB\n\ ,FL,MADISON,MAD\n\ ,FL,MANATEE,MTE\n\ ,FL,MARION,MAO\n\ ,FL,MARTIN,MRT\n\ ,FL,MONROE,MON\n\ ,FL,NASSAU,NAS\n\ ,FL,OKALOOSA,OKA\n\ ,FL,OKEECHOBEE,OKE\n\ ,FL,ORANGE,ORA\n\ ,FL,OSCEOLA,OSC\n\ ,FL,PALM BEACH,PAL\n\ ,FL,PASCO,PAS\n\ ,FL,PINELLAS,PIN\n\ ,FL,POLK,POL\n\ ,FL,PUTNAM,PUT\n\ ,FL,SANTA ROSA,SAN\n\ ,FL,SARASOTA,SAR\n\ ,FL,SEMINOLE,SEM\n\ ,FL,ST. JOHNS,STJ\n\ ,FL,ST. LUCIE,STL\n\ ,FL,SUMTER,SUM\n\ ,FL,SUWANNEE,SUW\n\ ,FL,TAYLOR,TAY\n\ ,FL,UNION,UNI\n\ ,FL,VOLUSIA,VOL\n\ ,FL,WAKULLA,WAK\n\ ,FL,WALTON,WAL\n\ ,FL,WASHINGTON,WAG\n\ Georgia,GA,Appling,APPL\n\ ,GA,Atkinson,ATKN\n\ ,GA,Bacon,BACN\n\ ,GA,Baker,BAKR\n\ ,GA,Baldwin,BALD\n\ ,GA,Banks,BANK\n\ ,GA,Barrow,BARR\n\ ,GA,Bartow,BART\n\ ,GA,Ben Hill,BENH\n\ ,GA,Berrien,BERR\n\ ,GA,Bibb,BIBB\n\ ,GA,Bleckley,BLEC\n\ ,GA,Brantley,BRAN\n\ ,GA,Brooks,BROK\n\ ,GA,Bryan,BRYN\n\ ,GA,Bulloch,BULL\n\ ,GA,Burke,BURK\n\ ,GA,Butts,BUTT\n\ ,GA,Calhoun,CALH\n\ ,GA,Camden,CMDN\n\ ,GA,Candler,CAND\n\ ,GA,Carroll,CARR\n\ ,GA,Catoosa,CATO\n\ ,GA,Charlton,CHAR\n\ ,GA,Chatham,CHTM\n\ ,GA,Chattahoochee,CHAT\n\ ,GA,Chattooga,CHGA\n\ ,GA,Cherokee,CHER\n\ ,GA,Clarke,CLKE\n\ ,GA,Clay,CLAY\n\ ,GA,Clayton,CLTN\n\ ,GA,Clinch,CLCH\n\ ,GA,Cobb,COBB\n\ ,GA,Coffee,COFF\n\ ,GA,Colquitt,COLQ\n\ ,GA,Columbia,COLU\n\ ,GA,Cook,COOK\n\ ,GA,Coweta,COWE\n\ ,GA,Crawford,CRAW\n\ ,GA,Crisp,CRIS\n\ ,GA,Dade,DADE\n\ ,GA,Dawson,DAWS\n\ ,GA,Decatur,DECA\n\ ,GA,DeKalb,DKLB\n\ ,GA,Dodge,DODG\n\ ,GA,Dooly,DOOL\n\ ,GA,Dougherty,DHTY\n\ ,GA,Douglas,DOUG\n\ ,GA,Early,EARL\n\ ,GA,Echols,ECHO\n\ ,GA,Effingham,EFFI\n\ ,GA,Elbert,ELBE\n\ ,GA,Emanuel,EMAN\n\ ,GA,Evans,EVAN\n\ ,GA,Fannin,FANN\n\ ,GA,Fayette,FAYE\n\ ,GA,Floyd,FLOY\n\ ,GA,Forsyth,FORS\n\ ,GA,Franklin,FRAN\n\ ,GA,Fulton,FULT\n\ ,GA,Gilmer,GILM\n\ ,GA,Glascock,GLAS\n\ ,GA,Glynn,GLYN\n\ ,GA,Gordon,GORD\n\ ,GA,Grady,GRAD\n\ ,GA,Greene,GREE\n\ ,GA,Gwinnett,GWIN\n\ ,GA,Habersham,HABE\n\ ,GA,Hall,HALL\n\ ,GA,Hancock,HANC\n\ ,GA,Haralson,HARA\n\ ,GA,Harris,HARR\n\ ,GA,Hart,HART\n\ ,GA,Heard,HEAR\n\ ,GA,Henry,HNRY\n\ ,GA,Houston,HOUS\n\ ,GA,Irwin,IRWI\n\ ,GA,Jackson,JACK\n\ ,GA,Jasper,JASP\n\ ,GA,Jeff Davis,JFDA\n\ ,GA,Jefferson,JEFF\n\ ,GA,Jenkins,JENK\n\ ,GA,Johnson,JOHN\n\ ,GA,Jones,JONE\n\ ,GA,Lamar,LAMA\n\ ,GA,Lanier,LANI\n\ ,GA,Laurens,LAUR\n\ ,GA,Lee,LEE\n\ ,GA,Liberty,LIBE\n\ ,GA,Lincoln,LINC\n\ ,GA,Long,LONG\n\ ,GA,Lowndes,LOWN\n\ ,GA,Lumpkin,LUMP\n\ ,GA,McDuffie,MCDU\n\ ,GA,McIntosh,MCIN\n\ ,GA,Macon,MACO\n\ ,GA,Madison,MADI\n\ ,GA,Marion,MARI\n\ ,GA,Meriwether,MERI\n\ ,GA,Miller,MILL\n\ ,GA,Mitchell,MITC\n\ ,GA,Monroe,MNRO\n\ ,GA,Montgomery,MONT\n\ ,GA,Morgan,MORG\n\ ,GA,Murray,MURR\n\ ,GA,Muscogee,MUSC\n\ ,GA,Newton,NEWT\n\ ,GA,Oconee,OCON\n\ ,GA,Oglethorpe,OGLE\n\ ,GA,Paulding,PAUL\n\ ,GA,Peach,PEAC\n\ ,GA,Pickens,PICK\n\ ,GA,Pierce,PIER\n\ ,GA,Pike,PIKE\n\ ,GA,Polk,POLK\n\ ,GA,Pulaski,PULA\n\ ,GA,Putnam,PUTN\n\ ,GA,Quitman,QCIT\n\ ,GA,Rabun,RABU\n\ ,GA,Randolph,RAND\n\ ,GA,Richmond,RICH\n\ ,GA,Rockdale,ROCK\n\ ,GA,Schley,SCHL\n\ ,GA,Screven,SCRE\n\ ,GA,Seminole,SEMI\n\ ,GA,Spalding,SPAL\n\ ,GA,Stephens,STEP\n\ ,GA,Stewart,STWT\n\ ,GA,Sumter,SUMT\n\ ,GA,Talbot,TLBT\n\ ,GA,Taliaferro,TALI\n\ ,GA,Tattnall,TATT\n\ ,GA,Taylor,TAYL\n\ ,GA,Telfair,TELF\n\ ,GA,Terrell,TERR\n\ ,GA,Thomas,THOM\n\ ,GA,Tift,TIFT\n\ ,GA,Toombs,TOOM\n\ ,GA,Towns,TOWN\n\ ,GA,Treutlen,TREU\n\ ,GA,Troup,TROU\n\ ,GA,Turner,TURN\n\ ,GA,Twiggs,TWIG\n\ ,GA,Union,UNIO\n\ ,GA,Upson,UPSO\n\ ,GA,Walker,WLKR\n\ ,GA,Walton,WALT\n\ ,GA,Ware,WARE\n\ ,GA,Warren,WARR\n\ ,GA,Washington,WASH\n\ ,GA,Wayne,WAYN\n\ ,GA,Webster,WEBS\n\ ,GA,Wheeler,WHEE\n\ ,GA,White,WHIT\n\ ,GA,Whitfield,WFLD\n\ ,GA,Wilcox,WCOX\n\ ,GA,Wilkes,WILK\n\ ,GA,Wilkinson,WKSN\n\ ,GA,Worth,WORT\n\ Guam,GU,Guam,\n\ Hawaii,HI,Hawaii-HIL,HIL\n\ ,HI,Hawaii-KOH,KOH\n\ ,HI,Hawaii-KON,KON\n\ ,HI,Hawaii-VOL,VOL\n\ ,HI,Honolulu-HON,HON\n\ ,HI,Honolulu-LHN,LHN\n\ ,HI,Honolulu-PRL,PRL\n\ ,HI,Honolulu-WHN,WHN\n\ ,HI,Kalawao-KAL,KAL\n\ ,HI,Kauai-KAU,KAU\n\ ,HI,Kauai-NII,NII\n\ ,HI,Maui-LAN,LAN\n\ ,HI,Maui-MAU,MAU\n\ ,HI,Maui-MOL,MOL\n\ Idaho,ID,Ada,ADA\n\ ,ID,Adams,ADM\n\ ,ID,Bannock,BAN\n\ ,ID,Bear Lake,BEA\n\ ,ID,Benewah,BEN\n\ ,ID,Bingham,BIN\n\ ,ID,Blaine,BLA\n\ ,ID,Boise,BOI\n\ ,ID,Bonner,BNR\n\ ,ID,Bonneville,BNV\n\ ,ID,Boundary,BOU\n\ ,ID,Butte,BUT\n\ ,ID,Camas,CAM\n\ ,ID,Canyon,CAN\n\ ,ID,Caribou,CAR\n\ ,ID,Cassia,CAS\n\ ,ID,Clark,CLA\n\ ,ID,Clearwater,CLE\n\ ,ID,Custer,CUS\n\ ,ID,Elmore,ELM\n\ ,ID,Franklin,FRA\n\ ,ID,Fremont,FRE\n\ ,ID,Gem,GEM\n\ ,ID,Gooding,GOO\n\ ,ID,Idaho,IDA\n\ ,ID,Jefferson,JEF\n\ ,ID,Jerome,JER\n\ ,ID,Kootenai,KOO\n\ ,ID,Latah,LAT\n\ ,ID,Lemhi,LEM\n\ ,ID,Lewis,LEW\n\ ,ID,Lincoln,LIN\n\ ,ID,Madison,MAD\n\ ,ID,Minidoka,MIN\n\ ,ID,Nez Perce,NEZ\n\ ,ID,Oneida,ONE\n\ ,ID,Owyhee,OWY\n\ ,ID,Payette,PAY\n\ ,ID,Power,POW\n\ ,ID,Shoshone,SHO\n\ ,ID,Teton,TET\n\ ,ID,Twin Falls,TWI\n\ ,ID,Valley,VAL\n\ ,ID,Washington,WAS\n\ Illinois,IL,Adams,ADAM\n\ ,IL,Alexander,ALEX\n\ ,IL,Bond,BOND\n\ ,IL,Boone,BOON\n\ ,IL,Brown,BROW\n\ ,IL,Bureau,BURO\n\ ,IL,Calhoun,CALH\n\ ,IL,Carroll,CARR\n\ ,IL,Cass,CASS\n\ ,IL,Champaign,CHAM\n\ ,IL,Christian,CHRS\n\ ,IL,Clark,CLRK\n\ ,IL,Clay,CLAY\n\ ,IL,Clinton,CLNT\n\ ,IL,Coles,COLE\n\ ,IL,Cook,COOK\n\ ,IL,Crawford,CRAW\n\ ,IL,Cumberland,CUMB\n\ ,IL,DeWitt,DEWT\n\ ,IL,DeKalb,DEKA\n\ ,IL,Douglas,DOUG\n\ ,IL,DuPage,DUPG\n\ ,IL,Edgar,EDGR\n\ ,IL,Edwards,EDWA\n\ ,IL,Effingham,EFFG\n\ ,IL,Fayette,FAYE\n\ ,IL,Ford,FORD\n\ ,IL,Franklin,FRNK\n\ ,IL,Fulton,FULT\n\ ,IL,Gallatin,GALL\n\ ,IL,Greene,GREE\n\ ,IL,Grundy,GRUN\n\ ,IL,Hamilton,HAML\n\ ,IL,Hancock,HANC\n\ ,IL,Hardin,HARD\n\ ,IL,Henderson,HNDR\n\ ,IL,Henry,HENR\n\ ,IL,Iroquois,IROQ\n\ ,IL,Jackson,JACK\n\ ,IL,Jasper,JASP\n\ ,IL,Jefferson,JEFF\n\ ,IL,Jersey,JERS\n\ ,IL,JoDaviess,JODA\n\ ,IL,Johnson,JOHN\n\ ,IL,Kane,KANE\n\ ,IL,Kankakee,KANK\n\ ,IL,Kendall,KEND\n\ ,IL,Knox,KNOX\n\ ,IL,LaSalle,LASA\n\ ,IL,Lake,LAKE\n\ ,IL,Lawrence,LAWR\n\ ,IL,Lee,LEE\n\ ,IL,Livingston,LIVG\n\ ,IL,Logan,LOGN\n\ ,IL,Macon,MACN\n\ ,IL,Macoupin,MCPN\n\ ,IL,Madison,MADN\n\ ,IL,Marion,MARI\n\ ,IL,Marshall,MSHL\n\ ,IL,Mason,MASN\n\ ,IL,Massac,MSSC\n\ ,IL,McDonough,MCDN\n\ ,IL,McHenry,MCHE\n\ ,IL,McLean,MCLN\n\ ,IL,Menard,MNRD\n\ ,IL,Mercer,MRCR\n\ ,IL,Monroe,MNRO\n\ ,IL,Montgomery,MNTG\n\ ,IL,Morgan,MORG\n\ ,IL,Moultrie,MOUL\n\ ,IL,Ogle,OGLE\n\ ,IL,Peoria,PEOR\n\ ,IL,Perry,PERR\n\ ,IL,Piatt,PIAT\n\ ,IL,Pike,PIKE\n\ ,IL,Pope,POPE\n\ ,IL,Pulaski,PULA\n\ ,IL,Putnam,PUTN\n\ ,IL,Randolph,RAND\n\ ,IL,Richland,RICH\n\ ,IL,Rock Island,ROCK\n\ ,IL,Saline,SALI\n\ ,IL,Sangamon,SANG\n\ ,IL,Schuyler,SCHY\n\ ,IL,Scott,SCOT\n\ ,IL,Shelby,SHEL\n\ ,IL,St. Clair,SCLA\n\ ,IL,Stark,STAR\n\ ,IL,Stephenson,STEP\n\ ,IL,Tazewell,TAZW\n\ ,IL,Union,UNIO\n\ ,IL,Vermilion,VERM\n\ ,IL,Wabash,WABA\n\ ,IL,Warren,WARR\n\ ,IL,Washington,WASH\n\ ,IL,Wayne,WAYN\n\ ,IL,White,WHIT\n\ ,IL,Whiteside,WTSD\n\ ,IL,Will,WILL\n\ ,IL,Williamson,WMSN\n\ ,IL,Winnebago,WBGO\n\ ,IL,Woodford,WOOD\n\ Indiana,IN,Adams,INADA\n\ ,IN,Allen,INALL\n\ ,IN,Bartholomew,INBAR\n\ ,IN,Benton,INBEN\n\ ,IN,Blackford,INBLA\n\ ,IN,Boone,INBOO\n\ ,IN,Brown,INBRO\n\ ,IN,Carroll,INCAR\n\ ,IN,Cass,INCAS\n\ ,IN,Clark,INCLR\n\ ,IN,Clay,INCLY\n\ ,IN,Clinton,INCLI\n\ ,IN,Crawford,INCRA\n\ ,IN,Daviess,INDAV\n\ ,IN,De Kalb,INDEK\n\ ,IN,Dearborn,INDEA\n\ ,IN,Decatur,INDEC\n\ ,IN,Delaware,INDEL\n\ ,IN,Dubois,INDUB\n\ ,IN,Elkhart,INELK\n\ ,IN,Fayette,INFAY\n\ ,IN,Floyd,INFLO\n\ ,IN,Fountain,INFOU\n\ ,IN,Franklin,INFRA\n\ ,IN,Fulton,INFUL\n\ ,IN,Gibson,INGIB\n\ ,IN,Grant,INGRA\n\ ,IN,Greene,INGRE\n\ ,IN,Hamilton,INHAM\n\ ,IN,Hancock,INHAN\n\ ,IN,Harrison,INHAR\n\ ,IN,Hendricks,INHND\n\ ,IN,Henry,INHNR\n\ ,IN,Howard,INHOW\n\ ,IN,Huntington,INHUN\n\ ,IN,Jackson,INJAC\n\ ,IN,Jasper,INJAS\n\ ,IN,Jay,INJAY\n\ ,IN,Jefferson,INJEF\n\ ,IN,Jennings,INJEN\n\ ,IN,Johnson,INJOH\n\ ,IN,Knox,INKNO\n\ ,IN,Kosciusko,INKOS\n\ ,IN,La Porte,INLAP\n\ ,IN,Lagrange,INLAG\n\ ,IN,Lake,INLAK\n\ ,IN,Lawrence,INLAW\n\ ,IN,Madison,INMAD\n\ ,IN,Marion,INMRN\n\ ,IN,Marshall,INMRS\n\ ,IN,Martin,INMRT\n\ ,IN,Miami,INMIA\n\ ,IN,Monroe,INMNR\n\ ,IN,Montgomery,INMNT\n\ ,IN,Morgan,INMOR\n\ ,IN,Newton,INNEW\n\ ,IN,Noble,INNOB\n\ ,IN,Ohio,INOHI\n\ ,IN,Orange,INORA\n\ ,IN,Owen,INOWE\n\ ,IN,Parke,INPAR\n\ ,IN,Perry,INPER\n\ ,IN,Pike,INPIK\n\ ,IN,Porter,INPOR\n\ ,IN,Posey,INPOS\n\ ,IN,Pulaski,INPUL\n\ ,IN,Putnam,INPUT\n\ ,IN,Randolph,INRAN\n\ ,IN,Ripley,INRIP\n\ ,IN,Rush,INRUS\n\ ,IN,Scott,INSCO\n\ ,IN,Shelby,INSHE\n\ ,IN,Spencer,INSPE\n\ ,IN,St. Joseph,INSTJ\n\ ,IN,Starke,INSTA\n\ ,IN,Steuben,INSTE\n\ ,IN,Sullivan,INSUL\n\ ,IN,Switzerland,INSWI\n\ ,IN,Tippecanoe,INTPP\n\ ,IN,Tipton,INTPT\n\ ,IN,Union,INUNI\n\ ,IN,Vanderburgh,INVAN\n\ ,IN,Vermillion,INVER\n\ ,IN,Vigo,INVIG\n\ ,IN,Wabash,INWAB\n\ ,IN,Warren,INWRN\n\ ,IN,Warrick,INWRK\n\ ,IN,Washington,INWAS\n\ ,IN,Wayne,INWAY\n\ ,IN,Wells,INWEL\n\ ,IN,White,INWHT\n\ ,IN,Whitley,INWHL\n\ Iowa,IA,Adair,ADR\n\ ,IA,Adams,ADM\n\ ,IA,Allamakee,ALL\n\ ,IA,Appanoose,APP\n\ ,IA,Audubon,AUD\n\ ,IA,Benton,BEN\n\ ,IA,Black Hawk,BKH\n\ ,IA,Boone,BOO\n\ ,IA,Bremer,BRE\n\ ,IA,Buchanan,BUC\n\ ,IA,Buena Vista,BNV\n\ ,IA,Butler,BTL\n\ ,IA,Calhoun,CAL\n\ ,IA,Carroll,CAR\n\ ,IA,Cass,CAS\n\ ,IA,Cedar,CED\n\ ,IA,Cerro Gordo,CEG\n\ ,IA,Cherokee,CHE\n\ ,IA,Chickasaw,CHI\n\ ,IA,Clarke,CLR\n\ ,IA,Clay,CLA\n\ ,IA,Clayton,CLT\n\ ,IA,Clinton,CLN\n\ ,IA,Crawford,CRF\n\ ,IA,Dallas,DAL\n\ ,IA,Davis,DAV\n\ ,IA,Decatur,DEC\n\ ,IA,Delaware,DEL\n\ ,IA,Des Moines,DSM\n\ ,IA,Dickinson,DIC\n\ ,IA,Dubuque,DUB\n\ ,IA,Emmet,EMM\n\ ,IA,Fayette,FAY\n\ ,IA,Floyd,FLO\n\ ,IA,Franklin,FRA\n\ ,IA,Fremont,FRE\n\ ,IA,Greene,GRE\n\ ,IA,Grundy,GRU\n\ ,IA,Guthrie,GUT\n\ ,IA,Hamilton,HAM\n\ ,IA,Hancock,HAN\n\ ,IA,Hardin,HDN\n\ ,IA,Harrison,HRS\n\ ,IA,Henry,HEN\n\ ,IA,Howard,HOW\n\ ,IA,Humboldt,HUM\n\ ,IA,Ida,IDA\n\ ,IA,Iowa,IOW\n\ ,IA,Jackson,JAC\n\ ,IA,Jasper,JAS\n\ ,IA,Jefferson,JEF\n\ ,IA,Johnson,JOH\n\ ,IA,Jones,JON\n\ ,IA,Keokuk,KEO\n\ ,IA,Kossuth,KOS\n\ ,IA,Lee,LEE\n\ ,IA,Linn,LIN\n\ ,IA,Louisa,LOU\n\ ,IA,Lucas,LUC\n\ ,IA,Lyon,LYN\n\ ,IA,Madison,MAD\n\ ,IA,Mahaska,MAH\n\ ,IA,Marion,MRN\n\ ,IA,Marshall,MSL\n\ ,IA,Mills,MIL\n\ ,IA,Mitchell,MIT\n\ ,IA,Monona,MNA\n\ ,IA,Monroe,MOE\n\ ,IA,Montgomery,MTG\n\ ,IA,Muscatine,MUS\n\ ,IA,O'Brien,OBR\n\ ,IA,Osceola,OSC\n\ ,IA,Page,PAG\n\ ,IA,Palo Alto,PLA\n\ ,IA,Plymouth,PLY\n\ ,IA,Pocahontas,POC\n\ ,IA,Polk,POL\n\ ,IA,Pottawattamie,POT\n\ ,IA,Poweshiek,POW\n\ ,IA,Ringgold,RIN\n\ ,IA,Sac,SAC\n\ ,IA,Scott,SCO\n\ ,IA,Shelby,SHE\n\ ,IA,Sioux,SIO\n\ ,IA,Story,STR\n\ ,IA,Tama,TAM\n\ ,IA,Taylor,TAY\n\ ,IA,Union,UNI\n\ ,IA,Van Buren,VAN\n\ ,IA,Wapello,WAP\n\ ,IA,Warren,WAR\n\ ,IA,Washington,WAS\n\ ,IA,Wayne,WAY\n\ ,IA,Webster,WEB\n\ ,IA,Winnebago,WNB\n\ ,IA,Winneshiek,WNS\n\ ,IA,Woodbury,WOO\n\ ,IA,Worth,WOR\n\ ,IA,Wright,WRI\n\ Kansas,KS,Allen,ALL\n\ ,KS,Anderson,AND\n\ ,KS,Atchison,ATC\n\ ,KS,Barber,BAR\n\ ,KS,Barton,BRT\n\ ,KS,Bourbon,BOU\n\ ,KS,Brown,BRO\n\ ,KS,Butler,BUT\n\ ,KS,Chase,CHS\n\ ,KS,Chautauqua,CHT\n\ ,KS,Cherokee,CHE\n\ ,KS,Cheyenne,CHY\n\ ,KS,Clark,CLK\n\ ,KS,Clay,CLY\n\ ,KS,Cloud,CLO\n\ ,KS,Coffey,COF\n\ ,KS,Comanche,COM\n\ ,KS,Cowley,COW\n\ ,KS,Crawford,CRA\n\ ,KS,Decatur,DEC\n\ ,KS,Dickinson,DIC\n\ ,KS,Doniphan,DON\n\ ,KS,Douglas,DOU\n\ ,KS,Edwards,EDW\n\ ,KS,Elk,ELK\n\ ,KS,Ellis,ELL\n\ ,KS,Ellsworth,ELS\n\ ,KS,Finney,FIN\n\ ,KS,Ford,FOR\n\ ,KS,Franklin,FRA\n\ ,KS,Geary,GEA\n\ ,KS,Gove,GOV\n\ ,KS,Graham,GRM\n\ ,KS,Grant,GRT\n\ ,KS,Gray,GRY\n\ ,KS,Greeley,GLY\n\ ,KS,Greenwood,GRE\n\ ,KS,Hamilton,HAM\n\ ,KS,Harper,HPR\n\ ,KS,Harvey,HVY\n\ ,KS,Haskell,HAS\n\ ,KS,Hodgeman,HOG\n\ ,KS,Jackson,JAC\n\ ,KS,Jefferson,JEF\n\ ,KS,Jewell,JEW\n\ ,KS,Johnson,JOH\n\ ,KS,Kearny,KEA\n\ ,KS,Kingman,KIN\n\ ,KS,Kiowa,KIO\n\ ,KS,Labette,LAB\n\ ,KS,Lane,LAN\n\ ,KS,Leavenworth,LEA\n\ ,KS,Lincoln,LCN\n\ ,KS,Linn,LIN\n\ ,KS,Logan,LOG\n\ ,KS,Lyon,LYO\n\ ,KS,Marion,MRN\n\ ,KS,Marshall,MSH\n\ ,KS,McPherson,MCP\n\ ,KS,Meade,MEA\n\ ,KS,Miami,MIA\n\ ,KS,Mitchell,MIT\n\ ,KS,Montgomery,MGY\n\ ,KS,Morris,MOR\n\ ,KS,Morton,MTN\n\ ,KS,Nemaha,NEM\n\ ,KS,Neosho,NEO\n\ ,KS,Ness,NES\n\ ,KS,Norton,NOR\n\ ,KS,Osage,OSA\n\ ,KS,Osborne,OSB\n\ ,KS,Ottawa,OTT\n\ ,KS,Pawnee,PAW\n\ ,KS,Phillips,PHI\n\ ,KS,Pottawatomie,POT\n\ ,KS,Pratt,PRA\n\ ,KS,Rawlins,RAW\n\ ,KS,Reno,REN\n\ ,KS,Republic,REP\n\ ,KS,Rice,RIC\n\ ,KS,Riley,RIL\n\ ,KS,Rooks,ROO\n\ ,KS,Rush,RUS\n\ ,KS,Russell,RSL\n\ ,KS,Saline,SAL\n\ ,KS,Scott,SCO\n\ ,KS,Sedgwick,SED\n\ ,KS,Seward,SEW\n\ ,KS,Shawnee,SHA\n\ ,KS,Sheridan,SHE\n\ ,KS,Sherman,SMN\n\ ,KS,Smith,SMI\n\ ,KS,Stafford,STA\n\ ,KS,Stanton,STN\n\ ,KS,Stevens,STE\n\ ,KS,Sumner,SUM\n\ ,KS,Thomas,THO\n\ ,KS,Trego,TRE\n\ ,KS,Wabaunsee,WAB\n\ ,KS,Wallace,WAL\n\ ,KS,Washington,WAS\n\ ,KS,Wichita,WIC\n\ ,KS,Wilson,WIL\n\ ,KS,Woodson,WOO\n\ ,KS,Wyandotte,WYA\n\ Kentucky,KY,Adair,ADA\n\ ,KY,Allen,ALL\n\ ,KY,Anderson,AND\n\ ,KY,Ballard,BAL\n\ ,KY,Barren,BAR\n\ ,KY,Bath,BAT\n\ ,KY,Bell,BEL\n\ ,KY,Boone,BOO\n\ ,KY,Bourbon,BOU\n\ ,KY,Boyd,BOY\n\ ,KY,Boyle,BOL\n\ ,KY,Bracken,BRA\n\ ,KY,Breathitt,BRE\n\ ,KY,Breckinridge,BRK\n\ ,KY,Bullitt,BUL\n\ ,KY,Butler,BUT\n\ ,KY,Caldwell,CAL\n\ ,KY,Calloway,CAW\n\ ,KY,Campbell,CAM\n\ ,KY,Carlisle,CAE\n\ ,KY,Carroll,CRL\n\ ,KY,Carter,CTR\n\ ,KY,Casey,CAS\n\ ,KY,Christian,CHR\n\ ,KY,Clark,CLA\n\ ,KY,Clay,CLY\n\ ,KY,Clinton,CLI\n\ ,KY,Crittenden,CRI\n\ ,KY,Cumberland,CUM\n\ ,KY,Daviess,DAV\n\ ,KY,Edmonson,EDM\n\ ,KY,Elliott,ELL\n\ ,KY,Estill,EST\n\ ,KY,Fayette,FAY\n\ ,KY,Fleming,FLE\n\ ,KY,Floyd,FLO\n\ ,KY,Franklin,FRA\n\ ,KY,Fulton,FUL\n\ ,KY,Gallatin,GAL\n\ ,KY,Garrard,GAR\n\ ,KY,Grant,GRT\n\ ,KY,Graves,GRV\n\ ,KY,Grayson,GRY\n\ ,KY,Green,GRE\n\ ,KY,Greenup,GRP\n\ ,KY,Hancock,HAN\n\ ,KY,Hardin,HAR\n\ ,KY,Harlan,HRL\n\ ,KY,Harrison,HSN\n\ ,KY,Hart,HRT\n\ ,KY,Henderson,HEN\n\ ,KY,Henry,HNY\n\ ,KY,Hickman,HIC\n\ ,KY,Hopkins,HOP\n\ ,KY,Jackson,JAC\n\ ,KY,Jefferson,JEF\n\ ,KY,Jessamine,JES\n\ ,KY,Johnson,JOH\n\ ,KY,Kenton,KEN\n\ ,KY,Knott,KNT\n\ ,KY,Knox,KNX\n\ ,KY,Larue,LAR\n\ ,KY,Laurel,LAU\n\ ,KY,Lawrence,LAW\n\ ,KY,LEE,LEE\n\ ,KY,Leslie,LES\n\ ,KY,Letcher,LET\n\ ,KY,Lewis,LEW\n\ ,KY,Lincoln,LIN\n\ ,KY,Livingston,LIV\n\ ,KY,Logan,LOG\n\ ,KY,Lyon,LYO\n\ ,KY,McCracken,MCC\n\ ,KY,McCreary,MCY\n\ ,KY,McLean,MCL\n\ ,KY,Madison,MAD\n\ ,KY,Magoffin,MAG\n\ ,KY,Marion,MAR\n\ ,KY,Marshall,MSL\n\ ,KY,Martin,MAT\n\ ,KY,Mason,MAS\n\ ,KY,Meade,MEA\n\ ,KY,Menifee,MEN\n\ ,KY,Mercer,MER\n\ ,KY,Metcalfe,MET\n\ ,KY,Monroe,MON\n\ ,KY,Montgomery,MOT\n\ ,KY,Morgan,MOR\n\ ,KY,Muhlenberg,MUH\n\ ,KY,Nelson,NEL\n\ ,KY,Nicholas,NIC\n\ ,KY,Ohio,OHI\n\ ,KY,Oldham,OLD\n\ ,KY,Owen,OWE\n\ ,KY,Owsley,OWS\n\ ,KY,Pendleton,PEN\n\ ,KY,Perry,PER\n\ ,KY,Pike,PIK\n\ ,KY,Powell,POW\n\ ,KY,Pulaski,PUL\n\ ,KY,Robertson,ROB\n\ ,KY,Rockcastle,ROC\n\ ,KY,Rowan,ROW\n\ ,KY,Russell,RUS\n\ ,KY,Scott,SCO\n\ ,KY,Shelby,SHE\n\ ,KY,Simpson,SIM\n\ ,KY,Spencer,SPE\n\ ,KY,Taylor,TAY\n\ ,KY,Todd,TOD\n\ ,KY,Trigg,TRI\n\ ,KY,Trimble,TRM\n\ ,KY,Union,UNI\n\ ,KY,Warren,WAR\n\ ,KY,Washington,WAS\n\ ,KY,Wayne,WAY\n\ ,KY,Webster,WEB\n\ ,KY,Whitley,WHI\n\ ,KY,Wolfe,WOL\n\ ,KY,Woodford,WOO\n\ Louisiana,LA,Acadia,ACAD\n\ ,LA,Allen,ALLE\n\ ,LA,Ascension,ASCE\n\ ,LA,Assumption,ASSU\n\ ,LA,Avoyelles,AVOY\n\ ,LA,Beauregard,BEAU\n\ ,LA,Bienville,BIEN\n\ ,LA,Bossier,BOSS\n\ ,LA,Caddo,CADD\n\ ,LA,Calcasieu,CALC\n\ ,LA,Caldwell,CALD\n\ ,LA,Cameron,CAME\n\ ,LA,Catahoula,CATA\n\ ,LA,Claiborne,CLAI\n\ ,LA,Concordia,CONC\n\ ,LA,De Soto,DESO\n\ ,LA,East Baton Rouge,EBR\n\ ,LA,East Carroll,ECAR\n\ ,LA,East Feliciana,EFEL\n\ ,LA,Evangeline,EVAN\n\ ,LA,Franklin,FRAN\n\ ,LA,Grant,GRAN\n\ ,LA,Iberia,IBER\n\ ,LA,Iberville,IBVL\n\ ,LA,Jackson,JACK\n\ ,LA,Jefferson,JEFF\n\ ,LA,Jefferson Davis,JFDV\n\ ,LA,La Salle,LASA\n\ ,LA,Lafayette,LAFA\n\ ,LA,Lafourche,LAFO\n\ ,LA,Lincoln,LINC\n\ ,LA,Livingston,LIVI\n\ ,LA,Madison,MADI\n\ ,LA,Morehouse,MORE\n\ ,LA,Natchitoches,NATC\n\ ,LA,Orleans,ORLE\n\ ,LA,Ouachita,OUAC\n\ ,LA,Plaquemines,PLAQ\n\ ,LA,Pointe Coupee,PCP\n\ ,LA,Rapides,RAPI\n\ ,LA,Red River,REDR\n\ ,LA,Richland,RICH\n\ ,LA,Sabine,SABI\n\ ,LA,St. Bernard,SBND\n\ ,LA,St. Charles,SCHL\n\ ,LA,St. Helena,SHEL\n\ ,LA,St. James,SJAM\n\ ,LA,St. John the Baptist,SJB\n\ ,LA,St. Landry,SLAN\n\ ,LA,St. Martin,SMT\n\ ,LA,St. Mary,SMAR\n\ ,LA,St. Tammany,STAM\n\ ,LA,Tangipahoa,TANG\n\ ,LA,Tensas,TENS\n\ ,LA,Terrebonne,TERR\n\ ,LA,Union,UNIO\n\ ,LA,Vermilion,VERM\n\ ,LA,Vernon,VERN\n\ ,LA,Washington,WASH\n\ ,LA,Webster,WEBS\n\ ,LA,West Baton Rouge,WBR\n\ ,LA,West Carroll,WCAR\n\ ,LA,West Feliciana,WFEL\n\ ,LA,Winn,WINN\n\ Massachusetts,MA,Barnstable,BAR\n\ ,MA,Berkshire,BER\n\ ,MA,Bristol,BRM\n\ ,MA,Dukes,DUK\n\ ,MA,Essex,ESM\n\ ,MA,Franklin,FRA\n\ ,MA,Hampden,HMD\n\ ,MA,Hampshire,MA\n\ ,MA,Middlesex,MIM\n\ ,MA,Nantucket,NAN\n\ ,MA,Norfolk,NOR\n\ ,MA,Plymouth,PLY\n\ ,MA,Suffolk,SUF\n\ ,MA,Worcester,WOR\n\ Maine,ME,Androscoggin,AND\n\ ,ME,Aroostook,ARO\n\ ,ME,Cumberland,CBL\n\ ,ME,Franklin,FRA\n\ ,ME,Hancock,HAN\n\ ,ME,Kennebec,KEN\n\ ,ME,Knox,KNO\n\ ,ME,Lincoln,LIN\n\ ,ME,Oxford,OXF\n\ ,ME,Penobscot,PEN\n\ ,ME,Piscataquis,PSQ\n\ ,ME,Sagadahoc,SAG\n\ ,ME,Somerset,SOM\n\ ,ME,Waldo,WAL\n\ ,ME,Washington,WAS\n\ ,ME,York,YOR\n\ Manitoba,MB,,\n\ Maryland,MD,Allegany,ALY\n\ ,MD,Anne Arundel,ANA\n\ ,MD,Baltimore City,BAL\n\ ,MD,Baltimore,BCT\n\ ,MD,Calvert,CLV\n\ ,MD,Caroline,CLN\n\ ,MD,Carroll,CRL\n\ ,MD,Cecil,CEC\n\ ,MD,Charles,CHS\n\ ,MD,Dorchester,DRC\n\ ,MD,Frederick,FRD\n\ ,MD,Garrett,GAR\n\ ,MD,Harford,HFD\n\ ,MD,Howard,HWD\n\ ,MD,Kent,KEN\n\ ,MD,Montgomery,MON\n\ ,MD,Prince George,PGE\n\ ,MD,Queen Anne,QAN\n\ ,MD,St. Mary,STM\n\ ,MD,Somerset,SMR\n\ ,MD,Talbot,TAL\n\ ,MD,Washington,WAS\n\ ,MD,Washington DC,WRC\n\ ,MD,Wicomico,WIC\n\ ,MD,Worcester,WRC\n\ ,MD,Worcester,\n\ Michigan,MI,Alcona,ALCO\n\ ,MI,Alger,ALGE\n\ ,MI,Allegan,ALLE\n\ ,MI,Alpena,ALPE\n\ ,MI,Antrim,ANTR\n\ ,MI,Arenac,AREN\n\ ,MI,Baraga,BARA\n\ ,MI,Barry,BARR\n\ ,MI,Bay,BAY\n\ ,MI,Benzie,BENZ\n\ ,MI,Berrien,BERR\n\ ,MI,Branch,BRAN\n\ ,MI,Calhoun,CALH\n\ ,MI,Cass,CASS\n\ ,MI,Charlevoix,CHAR\n\ ,MI,Cheboygan,CHEB\n\ ,MI,Chippewa,CHIP\n\ ,MI,Clare,CLAR\n\ ,MI,Clinton,CLIN\n\ ,MI,Crawford,CRAW\n\ ,MI,Delta,DELT\n\ ,MI,Dickinson,DICK\n\ ,MI,Eaton,EATO\n\ ,MI,Emmet,EMME\n\ ,MI,Genesee,GENE\n\ ,MI,Gladwin,GLAD\n\ ,MI,Gogebic,GOGE\n\ ,MI,Gratiot,GRAT\n\ ,MI,Grand Traverse,GRTR\n\ ,MI,Hillsdale,HILL\n\ ,MI,Houghton,HOUG\n\ ,MI,Huron,HURO\n\ ,MI,Ionia,IONI\n\ ,MI,Iosco,IOSC\n\ ,MI,Ingham,INGH\n\ ,MI,Iron,IRON\n\ ,MI,Isabella,ISAB\n\ ,MI,Jackson,JACK\n\ ,MI,Kalamazoo,KZOO\n\ ,MI,Kalkaska,KALK\n\ ,MI,Keweenaw,KEWE\n\ ,MI,Kent,KENT\n\ ,MI,Lake,LAKE\n\ ,MI,Lapeer,LAPE\n\ ,MI,Leelanau,LEEL\n\ ,MI,Lenawee,LENA\n\ ,MI,Livingston,LIVI\n\ ,MI,Luce,LUCE\n\ ,MI,Mackinac,MACK\n\ ,MI,Macomb,MACO\n\ ,MI,Manistee,MANI\n\ ,MI,Marquette,MARQ\n\ ,MI,Mason,MASO\n\ ,MI,Mecosta,MECO\n\ ,MI,Menominee,MENO\n\ ,MI,Midland,MIDL\n\ ,MI,Missaukee,MISS\n\ ,MI,Monroe,MONR\n\ ,MI,Montcalm,MCLM\n\ ,MI,Montmorency,MTMO\n\ ,MI,Muskegon,MUSK\n\ ,MI,Newaygo,NEWA\n\ ,MI,Oakland,OAKL\n\ ,MI,Oceana,OCEA\n\ ,MI,Ogemaw,OGEM\n\ ,MI,Ontonagon,ONTO\n\ ,MI,Osceola,OSCE\n\ ,MI,Oscoda,OSCO\n\ ,MI,Otsego,OTSE\n\ ,MI,Ottawa,OTTA\n\ ,MI,Presque Isle,PRES\n\ ,MI,Roscommon,ROSC\n\ ,MI,Saginaw,SAGI\n\ ,MI,Sanilac,SANI\n\ ,MI,Schoolcraft,SCHO\n\ ,MI,Shiawassee,SHIA\n\ ,MI,St. Clair,STCL\n\ ,MI,St. Joseph,STJO\n\ ,MI,Tuscola,TUSC\n\ ,MI,Van Buren,VANB\n\ ,MI,Washtenaw,WASH\n\ ,MI,Wayne,WAYN\n\ ,MI,Wexford,WEXF\n\ Minnesota,MN,Aitkin,AIT\n\ ,MN,Anoka,ANO\n\ ,MN,Becker,BEC\n\ ,MN,Beltrami,BEL\n\ ,MN,Benton,BEN\n\ ,MN,Big Stone,BIG\n\ ,MN,Blue Earth,BLU\n\ ,MN,Brown,BRO\n\ ,MN,Carlton,CRL\n\ ,MN,Carver,CRV\n\ ,MN,Cass,CAS\n\ ,MN,Chippewa,CHP\n\ ,MN,Chisago,CHS\n\ ,MN,Clay,CLA\n\ ,MN,Clearwater,CLE\n\ ,MN,Cook,COO\n\ ,MN,Cottonwood,COT\n\ ,MN,Crow Wing,CRO\n\ ,MN,Dakota,DAK\n\ ,MN,Dodge,DOD\n\ ,MN,Douglas,DOU\n\ ,MN,Fairbault,FAI\n\ ,MN,Fillmore,FIL\n\ ,MN,Freeborn,FRE\n\ ,MN,Goodhue,GOO\n\ ,MN,Grant,GRA\n\ ,MN,Hennepin,HEN\n\ ,MN,Houston,HOU\n\ ,MN,Hubbard,HUB\n\ ,MN,Isanti,ISA\n\ ,MN,Itasca,ITA\n\ ,MN,Jackson,JAC\n\ ,MN,Kanabec,KNB\n\ ,MN,Kandiyohi,KND\n\ ,MN,Kittson,KIT\n\ ,MN,Koochiching,KOO\n\ ,MN,Lac Qui Parle,LAC\n\ ,MN,Lake,LAK\n\ ,MN,Lake of the Woods,LKW\n\ ,MN,Le Sueur,LES\n\ ,MN,Lincoln,LIN\n\ ,MN,Lyon,LYO\n\ ,MN,McLeod,MCL\n\ ,MN,Mahnomen,MAH\n\ ,MN,Marshall,MRS\n\ ,MN,Martin,MRT\n\ ,MN,Meeker,MEE\n\ ,MN,Mille Lacs,MIL\n\ ,MN,Morrison,MOR\n\ ,MN,Mower,MOW\n\ ,MN,Murray,MUR\n\ ,MN,Nicollet,NIC\n\ ,MN,Nobles,NOB\n\ ,MN,Norman,NOR\n\ ,MN,Olmsted,OLM\n\ ,MN,Ottertail,OTT\n\ ,MN,Pennington,PEN\n\ ,MN,Pine,PIN\n\ ,MN,Pipestone,PIP\n\ ,MN,Polk,POL\n\ ,MN,Pope,POP\n\ ,MN,Ramsey,RAM\n\ ,MN,Red Lake,RDL\n\ ,MN,Redwood,RDW\n\ ,MN,Renville,REN\n\ ,MN,Rice,RIC\n\ ,MN,Rock,ROC\n\ ,MN,Roseau,ROS\n\ ,MN,St Louis,STL\n\ ,MN,Scott,SCO\n\ ,MN,Sherburne,SHE\n\ ,MN,Sibley,SIB\n\ ,MN,Stearns,STR\n\ ,MN,Steele,STE\n\ ,MN,Stevens,STV\n\ ,MN,St. Louis,STL\n\ ,MN,Swift,SWI\n\ ,MN,Todd,TOD\n\ ,MN,Traverse,TRA\n\ ,MN,Wabasha,WAB\n\ ,MN,Wadena,WAD\n\ ,MN,Waseca,WSC\n\ ,MN,Washington,WSH\n\ ,MN,Watonwan,WAT\n\ ,MN,Wilkin,WIL\n\ ,MN,Winona,WIN\n\ ,MN,Wright,WRI\n\ ,MN,Yellow Medicine,YEL\n\ Missouri,MO,Adair,ADR\n\ ,MO,Andrew,AND\n\ ,MO,Atchison,ATC\n\ ,MO,Audrain,AUD\n\ ,MO,Barry,BAR\n\ ,MO,Barton,BTN\n\ ,MO,Bates,BAT\n\ ,MO,Benton,BEN\n\ ,MO,Bollinger,BOL\n\ ,MO,Boone,BOO\n\ ,MO,Buchanan,BUC\n\ ,MO,Butler,BTR\n\ ,MO,Caldwell,CWL\n\ ,MO,Callaway,CAL\n\ ,MO,Camden,CAM\n\ ,MO,Cape Girardeau,CPG\n\ ,MO,Carroll,CRL\n\ ,MO,Carter,CAR\n\ ,MO,Cass,CAS\n\ ,MO,Cedar,CED\n\ ,MO,Chariton,CHN\n\ ,MO,Christian,CHR\n\ ,MO,Clark,CLK\n\ ,MO,Clay,CLA\n\ ,MO,Clinton,CLN\n\ ,MO,Cole,COL\n\ ,MO,Cooper,COP\n\ ,MO,Crawford,CRA\n\ ,MO,Dade,DAD\n\ ,MO,Dallas,DAL\n\ ,MO,Daviess,DVS\n\ ,MO,DeKalb,DEK\n\ ,MO,Dent,DEN\n\ ,MO,Douglas,DGL\n\ ,MO,Dunklin,DUN\n\ ,MO,Franklin,FRA\n\ ,MO,Gasconade,GAS\n\ ,MO,Gentry,GEN\n\ ,MO,Greene,GRN\n\ ,MO,Grundy,GRU\n\ ,MO,Harrison,HAR\n\ ,MO,Henry,HEN\n\ ,MO,Hickory,HIC\n\ ,MO,Holt,HLT\n\ ,MO,Howard,HOW\n\ ,MO,Howell,HWL\n\ ,MO,Iron,IRN\n\ ,MO,Jackson,JAC\n\ ,MO,Jasper,JAS\n\ ,MO,Jefferson,JEF\n\ ,MO,Johnson,JON\n\ ,MO,Knox,KNX\n\ ,MO,Laclede,LAC\n\ ,MO,Lafayette,LAF\n\ ,MO,Lawrence,LAW\n\ ,MO,Lewis,LEW\n\ ,MO,Lincoln,LCN\n\ ,MO,Linn,LIN\n\ ,MO,Livingston,LIV\n\ ,MO,Macon,MAC\n\ ,MO,Madison,MAD\n\ ,MO,Maries,MRE\n\ ,MO,Marion,MAR\n\ ,MO,McDonald,MCD\n\ ,MO,Mercer,MER\n\ ,MO,Miller,MIL\n\ ,MO,Mississippi,MIS\n\ ,MO,Moniteau,MNT\n\ ,MO,Monroe,MON\n\ ,MO,Montgomery,MGM\n\ ,MO,Morgan,MOR\n\ ,MO,New Madrid,NMD\n\ ,MO,Newton,NWT\n\ ,MO,Nodaway,NOD\n\ ,MO,Oregon,ORE\n\ ,MO,Osage,OSA\n\ ,MO,Ozark,OZA\n\ ,MO,Pemiscot,PEM\n\ ,MO,Perry,PER\n\ ,MO,Pettis,PET\n\ ,MO,Phelps,PHE\n\ ,MO,Pike,PIK\n\ ,MO,Platte,PLA\n\ ,MO,Polk,POL\n\ ,MO,Pulaski,PUL\n\ ,MO,Putnam,PUT\n\ ,MO,Ralls,RAL\n\ ,MO,Randolph,RAN\n\ ,MO,Ray,RAY\n\ ,MO,Reynolds,REY\n\ ,MO,Ripley,RIP\n\ ,MO,Saline,SAL\n\ ,MO,Schuyler,SCH\n\ ,MO,Scotland,SCT\n\ ,MO,Scott,SCO\n\ ,MO,Shannon,SHA\n\ ,MO,Shelby,SHL\n\ ,MO,St. Charles,STC\n\ ,MO,St. Clair,SCL\n\ ,MO,St. Francois,STF\n\ ,MO,St. Genevieve,STG\n\ ,MO,St. Louis City,STL\n\ ,MO,St. Louis,SLC\n\ ,MO,Stoddard,STD\n\ ,MO,Stone,STN\n\ ,MO,Sullivan,SUL\n\ ,MO,Taney,TAN\n\ ,MO,Texas,TEX\n\ ,MO,Vernon,VRN\n\ ,MO,Warren,WAR\n\ ,MO,Washington,WAS\n\ ,MO,Wayne,WAY\n\ ,MO,Webster,WEB\n\ ,MO,Worth,WOR\n\ ,MO,Wright,WRT\n\ Mississippi,MS,Adams,ADA\n\ ,MS,Alcorn,ALC\n\ ,MS,Amite,AMI\n\ ,MS,Attala,ATT\n\ ,MS,Benton,BEN\n\ ,MS,Bolivar,BOL\n\ ,MS,Calhoun,CAL\n\ ,MS,Carroll,CAR\n\ ,MS,Chickasaw,CHI\n\ ,MS,Choctaw,CHO\n\ ,MS,Claiborne,CLB\n\ ,MS,Clarke,CLK\n\ ,MS,Clay,CLA\n\ ,MS,Coahoma,COA\n\ ,MS,Copiah,COP\n\ ,MS,Covington,COV\n\ ,MS,DeSoto,DES\n\ ,MS,Forrest,FOR\n\ ,MS,Franklin,FRA\n\ ,MS,George,GEO\n\ ,MS,Greene,GRN\n\ ,MS,Grenada,GRE\n\ ,MS,Hancock,HAN\n\ ,MS,Harrison,HAR\n\ ,MS,Hinds,HIN\n\ ,MS,Holmes,HOL\n\ ,MS,Humphreys,HUM\n\ ,MS,Issaquena,ISS\n\ ,MS,Itawamba,ITA\n\ ,MS,Jackson,JAC\n\ ,MS,Jasper,JAS\n\ ,MS,Jefferson,JEF\n\ ,MS,Jefferson Davis,JDV\n\ ,MS,Jones,JON\n\ ,MS,Kemper,KEM\n\ ,MS,Lafayette,LAF\n\ ,MS,Lamar,LAM\n\ ,MS,Lauderdale,LAU\n\ ,MS,Lawrence,LAW\n\ ,MS,Leake,LEA\n\ ,MS,Lee,LEE\n\ ,MS,Leflore,LEF\n\ ,MS,Lincoln,LIN\n\ ,MS,Lowndes,LOW\n\ ,MS,Madison,MAD\n\ ,MS,Marion,MRN\n\ ,MS,Marshall,MAR\n\ ,MS,Monroe,MON\n\ ,MS,Montgomery,MGY\n\ ,MS,Neshoba,NES\n\ ,MS,Newton,NEW\n\ ,MS,Noxubee,NOX\n\ ,MS,Oktibbeha,OKT\n\ ,MS,Panola,PAN\n\ ,MS,Pearl River,PEA\n\ ,MS,Perry,PER\n\ ,MS,Pike,PIK\n\ ,MS,Pontotoc,PON\n\ ,MS,Prentiss,PRE\n\ ,MS,Quitman,QCI\n\ ,MS,Rankin,RAN\n\ ,MS,Scott,SCO\n\ ,MS,Sharkey,SHA\n\ ,MS,Simpson,SIM\n\ ,MS,Smith,SMI\n\ ,MS,Stone,STO\n\ ,MS,Sunflower,SUN\n\ ,MS,Tallahatchie,TAL\n\ ,MS,Tate,TAT\n\ ,MS,Tippah,TIP\n\ ,MS,Tishomingo,TIS\n\ ,MS,Tunica,TUN\n\ ,MS,Union,UNI\n\ ,MS,Walthall,WAL\n\ ,MS,Warren,WAR\n\ ,MS,Washington,WAS\n\ ,MS,Wayne,WAY\n\ ,MS,Webster,WEB\n\ ,MS,Wilkinson,WIL\n\ ,MS,Winston,WIN\n\ ,MS,Yalobusha,YAL\n\ ,MS,Yazoo,YAZ\n\ Montana,MT,Beaverhead,BEA\n\ ,MT,Big Horn,BIG\n\ ,MT,Blaine,BLA\n\ ,MT,Broadwater,BRO\n\ ,MT,Carbon,CRB\n\ ,MT,Carter,CRT\n\ ,MT,Cascade,CAS\n\ ,MT,Chouteau,CHO\n\ ,MT,Custer,CUS\n\ ,MT,Daniels,DAN\n\ ,MT,Dawson,DAW\n\ ,MT,Deer Lodge,DEE\n\ ,MT,Fallon,FAL\n\ ,MT,Fergus,FER\n\ ,MT,Flathead,FLA\n\ ,MT,Gallatin,GAL\n\ ,MT,Garfield,GAR\n\ ,MT,Glacier,GLA\n\ ,MT,Golden Valley,GOL\n\ ,MT,Granite,GRA\n\ ,MT,Hill,HIL\n\ ,MT,Jefferson,JEF\n\ ,MT,Judith Basin,JUD\n\ ,MT,Lake,LAK\n\ ,MT,Lewis & Clark,LEW\n\ ,MT,Liberty,LIB\n\ ,MT,Lincoln,LIN\n\ ,MT,Madison,MAD\n\ ,MT,McCone,MCC\n\ ,MT,Meagher,MEA\n\ ,MT,Mineral,MIN\n\ ,MT,Missoula,MIS\n\ ,MT,Musselshell,MUS\n\ ,MT,Park,PAR\n\ ,MT,Petroleum,PET\n\ ,MT,Phillips,PHI\n\ ,MT,Pondera,PON\n\ ,MT,Powder River,PWD\n\ ,MT,Powell,PWL\n\ ,MT,Prairie,PRA\n\ ,MT,Ravalli,RAV\n\ ,MT,Richland,RIC\n\ ,MT,Roosevelt,ROO\n\ ,MT,Rosebud,ROS\n\ ,MT,Sanders,SAN\n\ ,MT,Sheridan,SHE\n\ ,MT,Silver Bow,SIL\n\ ,MT,Stillwater,STI\n\ ,MT,Sweet Grass,SWE\n\ ,MT,Teton,TET\n\ ,MT,Toole,TOO\n\ ,MT,Treasure,TRE\n\ ,MT,Valley,VAL\n\ ,MT,Wheatland,WHE\n\ ,MT,Wibaux,WIB\n\ ,MT,Yellowstone,YEL\n\ North Carolina,NC,Alamance,ALA\n\ ,NC,Alexander,ALE\n\ ,NC,Alleghany,ALL\n\ ,NC,Anson,ANS\n\ ,NC,Ashe,ASH\n\ ,NC,Avery,AVE\n\ ,NC,Beaufort,BEA\n\ ,NC,Bertie,BER\n\ ,NC,Bladen,BLA\n\ ,NC,Brunswick,BRU\n\ ,NC,Buncombe,BUN\n\ ,NC,Burke,BUR\n\ ,NC,Cabarrus,CAB\n\ ,NC,Caldwell,CAL\n\ ,NC,Camden,CAM\n\ ,NC,Carteret,CAR\n\ ,NC,Caswell,CAS\n\ ,NC,Catawba,CAT\n\ ,NC,Chatham,CHA\n\ ,NC,Cherokee,CHE\n\ ,NC,Chowan,CHO\n\ ,NC,Clay,CLA\n\ ,NC,Cleveland,CLE\n\ ,NC,Columbus,COL\n\ ,NC,Craven,CRA\n\ ,NC,Cumberland,CUM\n\ ,NC,Currituck,CUR\n\ ,NC,Dare,DAR\n\ ,NC,Davidson,DVD\n\ ,NC,Davie,DAV\n\ ,NC,Duplin,DUP\n\ ,NC,Durham,DUR\n\ ,NC,Edgecombe,EDG\n\ ,NC,Forsyth,FOR\n\ ,NC,Franklin,FRA\n\ ,NC,Gaston,GAS\n\ ,NC,Gates,GAT\n\ ,NC,Graham,GRM\n\ ,NC,Granville,GRA\n\ ,NC,Greene,GRE\n\ ,NC,Guilford,GUI\n\ ,NC,Halifax,HAL\n\ ,NC,Harnett,HAR\n\ ,NC,Haywood,HAY\n\ ,NC,Henderson,HEN\n\ ,NC,Hertford,HER\n\ ,NC,Hoke,HOK\n\ ,NC,Hyde,HYD\n\ ,NC,Iredell,IRE\n\ ,NC,Jackson,JAC\n\ ,NC,Johnston,JOH\n\ ,NC,Jones,JON\n\ ,NC,Lee,LEE\n\ ,NC,Lenoir,LEN\n\ ,NC,Lincoln,LIN\n\ ,NC,Macon,MAC\n\ ,NC,Madison,MAD\n\ ,NC,Martin,MAR\n\ ,NC,McDowell,MCD\n\ ,NC,Mecklenburg,MEC\n\ ,NC,Mitchell,MIT\n\ ,NC,Montgomery,MON\n\ ,NC,Moore,MOO\n\ ,NC,Nash,NAS\n\ ,NC,New Hanover,NEW\n\ ,NC,Northampton,NOR\n\ ,NC,Onslow,ONS\n\ ,NC,Orange,ORA\n\ ,NC,Pamlico,PAM\n\ ,NC,Pasquotank,PAS\n\ ,NC,Pender,PEN\n\ ,NC,Perquimans,PEQ\n\ ,NC,Person,PER\n\ ,NC,Pitt,PIT\n\ ,NC,Polk,POL\n\ ,NC,Randolph,RAN\n\ ,NC,Richmond,RIC\n\ ,NC,Robeson,ROB\n\ ,NC,Rockingham,ROC\n\ ,NC,Rowan,ROW\n\ ,NC,Rutherford,RUT\n\ ,NC,Sampson,SAM\n\ ,NC,Scotland,SCO\n\ ,NC,Stanly,STA\n\ ,NC,Stokes,STO\n\ ,NC,Surry,SUR\n\ ,NC,Swain,SWA\n\ ,NC,Transylvania,TRA\n\ ,NC,Tyrrell,TYR\n\ ,NC,Union,UNI\n\ ,NC,Vance,VAN\n\ ,NC,Wake,WAK\n\ ,NC,Warren,WAR\n\ ,NC,Washington,WAS\n\ ,NC,Watauga,WAT\n\ ,NC,Wayne,WAY\n\ ,NC,Wilkes,WLK\n\ ,NC,Wilson,WIL\n\ ,NC,Yadkin,YAD\n\ ,NC,Yancey,YAN\n\ North Dakota,ND,Adams,ADM\n\ ,ND,Barnes,BRN\n\ ,ND,Benson,BSN\n\ ,ND,Billings,BLL\n\ ,ND,Bottineau,BOT\n\ ,ND,Bowman,BOW\n\ ,ND,Burke,BRK\n\ ,ND,Burleigh,BUR\n\ ,ND,Cass,CSS\n\ ,ND,Cavalier,CAV\n\ ,ND,Dickey,DIK\n\ ,ND,Divide,DIV\n\ ,ND,Dunn,DUN\n\ ,ND,Eddy,EDY\n\ ,ND,Emmons,EMN\n\ ,ND,Foster,FOS\n\ ,ND,Golden Valley,GNV\n\ ,ND,Grand Forks,GFK\n\ ,ND,Grant,GNT\n\ ,ND,Griggs,GRG\n\ ,ND,Hettinger,HET\n\ ,ND,Kidder,KDR\n\ ,ND,LaMoure,LMR\n\ ,ND,Logan,LOG\n\ ,ND,McHenry,MCH\n\ ,ND,McIntosh,MCI\n\ ,ND,McKenzie,MCK\n\ ,ND,McLean,MCL\n\ ,ND,Mercer,MCR\n\ ,ND,Morton,MTN\n\ ,ND,Mountrail,MRL\n\ ,ND,Nelson,NEL\n\ ,ND,Oliver,OLR\n\ ,ND,Pembina,PBA\n\ ,ND,Pierce,PRC\n\ ,ND,Ramsey,RMY\n\ ,ND,Ransom,RSM\n\ ,ND,Renville,REN\n\ ,ND,Richland,RLD\n\ ,ND,Rolette,ROL\n\ ,ND,Sargent,SGT\n\ ,ND,Sheridan,SRN\n\ ,ND,Sioux,SIX\n\ ,ND,Slope,SLP\n\ ,ND,Stark,STK\n\ ,ND,Steele,STL\n\ ,ND,Stutsman,STN\n\ ,ND,Towner,TWR\n\ ,ND,Traill,TRL\n\ ,ND,Walsh,WLH\n\ ,ND,Ward,WRD\n\ ,ND,Wells,WLS\n\ ,ND,Williams,WLM\n\ Nebraska,NE,Adams,ADMS\n\ ,NE,Antelope,ANTE\n\ ,NE,Arthur,ARTH\n\ ,NE,Banner,BANN\n\ ,NE,Blaine,BLAI\n\ ,NE,Boone,BOON\n\ ,NE,Box Butte,BOXB\n\ ,NE,Boyd,BOYD\n\ ,NE,Brown,BRWN\n\ ,NE,Buffalo,BUFF\n\ ,NE,Burt,BURT\n\ ,NE,Butler,BUTL\n\ ,NE,Cass,CASS\n\ ,NE,Cedar,CEDA\n\ ,NE,Chase,CHAS\n\ ,NE,Cherry,CHER\n\ ,NE,Cheyenne,CHEY\n\ ,NE,Clay,CLAY\n\ ,NE,Colfax,COLF\n\ ,NE,Cuming,CUMI\n\ ,NE,Custer,CUST\n\ ,NE,Dakota,DAKO\n\ ,NE,Dawes,DAWE\n\ ,NE,Dawson,DAWS\n\ ,NE,Deuel,DEUE\n\ ,NE,Dixon,DIXO\n\ ,NE,Dodge,DODG\n\ ,NE,Douglas,DGLS\n\ ,NE,Dundy,DUND\n\ ,NE,Fillmore,FILL\n\ ,NE,Franklin,FRNK\n\ ,NE,Frontier,FRON\n\ ,NE,Furnas,FURN\n\ ,NE,Gage,GAGE\n\ ,NE,Garden,GARD\n\ ,NE,Garfield,GARF\n\ ,NE,Gosper,GOSP\n\ ,NE,Grant,GRAN\n\ ,NE,Greeley,GREE\n\ ,NE,Hall,HALL\n\ ,NE,Hamilton,HAMI\n\ ,NE,Harlan,HRLN\n\ ,NE,Hayes,HAYE\n\ ,NE,Hitchcock,HITC\n\ ,NE,Holt,HOLT\n\ ,NE,Hooker,HOOK\n\ ,NE,Howard,HOWA\n\ ,NE,Jefferson,JEFF\n\ ,NE,Johnson,JOHN\n\ ,NE,Kearney,KEAR\n\ ,NE,Keith,KEIT\n\ ,NE,Keya Paha,KEYA\n\ ,NE,Kimball,KIMB\n\ ,NE,Knox,KNOX\n\ ,NE,Lancaster,LNCS\n\ ,NE,Lincoln,LINC\n\ ,NE,Logan,LOGA\n\ ,NE,Loup,LOUP\n\ ,NE,Madison,MDSN\n\ ,NE,McPherson,MCPH\n\ ,NE,Merrick,MERR\n\ ,NE,Morrill,MORR\n\ ,NE,Nance,NANC\n\ ,NE,Nemaha,NEMA\n\ ,NE,Nuckolls,NUCK\n\ ,NE,Otoe,OTOE\n\ ,NE,Pawnee,PAWN\n\ ,NE,Perkins,PERK\n\ ,NE,Phelps,PHEL\n\ ,NE,Pierce,PIER\n\ ,NE,Platte,PLAT\n\ ,NE,Polk,POLK\n\ ,NE,Red Willow,REDW\n\ ,NE,Richardson,RICH\n\ ,NE,Rock,ROCK\n\ ,NE,Saline,SALI\n\ ,NE,Sarpy,SARP\n\ ,NE,Saunders,SAUN\n\ ,NE,Scotts Bluff,SCOT\n\ ,NE,Seward,SEWA\n\ ,NE,Sheridan,SHRD\n\ ,NE,Sherman,SHRM\n\ ,NE,Sioux,SIOU\n\ ,NE,Stanton,STAN\n\ ,NE,Thayer,THAY\n\ ,NE,Thomas,THOM\n\ ,NE,Thurston,THUR\n\ ,NE,Valley,VLLY\n\ ,NE,Washington,WASH\n\ ,NE,Wayne,WAYN\n\ ,NE,Webster,WEBS\n\ ,NE,Wheeler,WHEE\n\ ,NE,York,YORK\n\ New Brunswick,NB,Albert,\n\ ,NB,Carleton,\n\ ,NB,Charlotte,\n\ ,NB,Gloucester,\n\ ,NB,Kent,\n\ ,NB,Kings,\n\ ,NB,Madawaska,\n\ ,NB,Northumberland,\n\ ,NB,Queens,\n\ ,NB,Restigouche,\n\ ,NB,Saint John,\n\ ,NB,Sunbury,\n\ ,NB,Victoria,\n\ ,NB,Westmorland,\n\ ,NB,York,\n\ Newfoundland and Labrador,NL,Avalon Peninsula-St. John's,\n\ ,NL,Burin Peninsula-Marystown,\n\ ,NL,South Coast-Channel-Port aux Basques,\n\ ,NL,St. George's-Stephenville,\n\ ,NL,Humber District-Corner Brook,\n\ ,NL,Central Newfoundland-Grand Falls-Windsor,\n\ ,NL,Bonavista/Trinity-Clarenville,\n\ ,NL,Notre Dame Bay-Lewisporte,\n\ ,NL,Northern Peninsula-St. Anthony,\n\ ,NL,Labrador-Happy Valley-Goose Bay,\n\ ,NL,Nunatsiavut-Nain,\n\ New Hampshire,NH,Belknap,BEL\n\ ,NH,Carroll,CAR\n\ ,NH,Cheshire,CHE\n\ ,NH,Coos,COO\n\ ,NH,Grafton,GRN\n\ ,NH,Hillsborough,HIL\n\ ,NH,Merrimack,MER\n\ ,NH,Rockingham,ROC\n\ ,NH,Strafford,STR\n\ ,NH,Sullivan,SUL\n\ New Jersey,NJ,Atlantic,ATLA\n\ ,NJ,Bergen,BERG\n\ ,NJ,Burlington,BURL\n\ ,NJ,Camden,CMDN\n\ ,NJ,Cape May,CAPE\n\ ,NJ,Cumberland,CUMB\n\ ,NJ,Essex,ESSE\n\ ,NJ,Gloucester,GLOU\n\ ,NJ,Hudson,HUDS\n\ ,NJ,Hunterdon,HUNT\n\ ,NJ,Mercer,MERC\n\ ,NJ,Middlesex,MIDD\n\ ,NJ,Monmouth,MONM\n\ ,NJ,Morris,MORR\n\ ,NJ,Ocean,OCEA\n\ ,NJ,Passaic,PASS\n\ ,NJ,Salem,SALE\n\ ,NJ,Somerset,SOME\n\ ,NJ,Sussex,SUSS\n\ ,NJ,Union,UNIO\n\ ,NJ,Warren,WRRN\n\ New Mexico,NM,Bernalillo,BER\n\ ,NM,Catron,CAT\n\ ,NM,Chaves,CHA\n\ ,NM,Cibola,CIB\n\ ,NM,Colfax,COL\n\ ,NM,Curry,CUR\n\ ,NM,De Baca,DEB\n\ ,NM,Dona Ana,DON\n\ ,NM,Eddy,EDD\n\ ,NM,Grant,GRA\n\ ,NM,Guadalupe,GUA\n\ ,NM,Harding,HAR\n\ ,NM,Hidalgo,HID\n\ ,NM,Lea,LEA\n\ ,NM,Lincoln,LIN\n\ ,NM,Los Alamos,LOS\n\ ,NM,Luna,LUN\n\ ,NM,McKinley,MCK\n\ ,NM,Mora,MOR\n\ ,NM,Otero,OTE\n\ ,NM,Quay,QCA\n\ ,NM,Rio Arriba,RIO\n\ ,NM,Roosevelt,ROO\n\ ,NM,San Juan,SJU\n\ ,NM,San Miguel,SMI\n\ ,NM,Sandoval,SAN\n\ ,NM,Santa Fe,SFE\n\ ,NM,Sierra,SIE\n\ ,NM,Socorro,SOC\n\ ,NM,Taos,TAO\n\ ,NM,Torrance,TOR\n\ ,NM,Union,UNI\n\ ,NM,Valencia,VAL\n\ Nevada,NV,Carson City,CAR\n\ ,NV,Churchill,CHU\n\ ,NV,Clark,CLA\n\ ,NV,Douglas,DOU\n\ ,NV,Elko,ELK\n\ ,NV,Esmeralda,ESM\n\ ,NV,Eureka,EUR\n\ ,NV,Humboldt,HUM\n\ ,NV,Lander,LAN\n\ ,NV,Lincoln,LIN\n\ ,NV,Lyon,LYO\n\ ,NV,Mineral,MIN\n\ ,NV,Nye,NYE\n\ ,NV,Pershing,PER\n\ ,NV,Storey,STO\n\ ,NV,Washoe,WAS\n\ ,NV,White Pine,WHI\n\ New York,NY,Albany,ALB\n\ ,NY,Allegany,ALL\n\ ,NY,Bronx,BRX\n\ ,NY,Broome,BRM\n\ ,NY,Cattaraugus,CAT\n\ ,NY,Cayuga,CAY\n\ ,NY,Chautauqua,CHA\n\ ,NY,Chemung,CHE\n\ ,NY,Chenango,CGO\n\ ,NY,Clinton,CLI\n\ ,NY,Columbia,COL\n\ ,NY,Cortland,COR\n\ ,NY,Delaware,DEL\n\ ,NY,Dutchess,DUT\n\ ,NY,Erie,ERI\n\ ,NY,Essex,ESS\n\ ,NY,Franklin,FRA\n\ ,NY,Fulton,FUL\n\ ,NY,Genesee,GEN\n\ ,NY,Greene,GRE\n\ ,NY,Hamilton,HAM\n\ ,NY,Herkimer,HER\n\ ,NY,Jefferson,JEF\n\ ,NY,Kings,KIN\n\ ,NY,Lewis,LEW\n\ ,NY,Livingston,LIV\n\ ,NY,Madison,MAD\n\ ,NY,Monroe,MON\n\ ,NY,Montgomery,MTG\n\ ,NY,Nassau,NAS\n\ ,NY,New York,NEW\n\ ,NY,Niagara,NIA\n\ ,NY,Oneida,ONE\n\ ,NY,Onondaga,ONO\n\ ,NY,Ontario,ONT\n\ ,NY,Orange,ORA\n\ ,NY,Orleans,ORL\n\ ,NY,Oswego,OSW\n\ ,NY,Otsego,OTS\n\ ,NY,Putnam,PUT\n\ ,NY,Queens,QCE\n\ ,NY,Rensselaer,REN\n\ ,NY,Rockland,ROC\n\ ,NY,Richmond,RIC\n\ ,NY,Saratoga,SAR\n\ ,NY,Schenectady,SCH\n\ ,NY,Schoharie,SCO\n\ ,NY,Schuyler,SCU\n\ ,NY,Seneca,SEN\n\ ,NY,St. Lawrence,STL\n\ ,NY,Steuben,STE\n\ ,NY,Suffolk,SUF\n\ ,NY,Sullivan,SUL\n\ ,NY,Tioga,TIO\n\ ,NY,Tompkins,TOM\n\ ,NY,Ulster,ULS\n\ ,NY,Warren,WAR\n\ ,NY,Washington,WAS\n\ ,NY,Wayne,WAY\n\ ,NY,Westchester,WES\n\ ,NY,Wyoming,WYO\n\ ,NY,Yates,YAT\n\ Northwest Territories,NT,Inuvik,\n\ ,NT,Norman Wells,\n\ ,NT,Behchokǫ̀,\n\ ,NT,Fort Simpson,\n\ ,NT,Fort Smith,\n\ ,NT,Yellowknife,\n\ Nova Scotia,NS,Halifax,\n\ ,NS,Sydney,\n\ ,NS,Kentville,\n\ ,NS,Truro,\n\ ,NS,Liverpool,\n\ ,NS,Shelburne,\n\ ,NS,Yarmouth,\n\ Nunavut,NU,Kitikmeot,\n\ ,NU,Qikiqtaaluk,\n\ ,NU,Kivalliq,\n\ Ohio,OH,Adams,ADAM\n\ ,OH,Allen,ALLE\n\ ,OH,Ashland,ASHL\n\ ,OH,Ashtabula,ASHT\n\ ,OH,Athens,ATHE\n\ ,OH,Auglaze,AUGL\n\ ,OH,Belmont,BELM\n\ ,OH,Brown,BROW\n\ ,OH,Butler,BUTL\n\ ,OH,Carroll,CARR\n\ ,OH,Champaign,CHAM\n\ ,OH,Clark,CLAR\n\ ,OH,Clermont,CLER\n\ ,OH,Clinton,CLIN\n\ ,OH,Columbiana,COLU\n\ ,OH,Coshocton,COSH\n\ ,OH,Crawford,CRAW\n\ ,OH,Cuyahoga,CUYA\n\ ,OH,Darke,DARK\n\ ,OH,Defiance,DEFI\n\ ,OH,Delaware,DELA\n\ ,OH,Erie,ERIE\n\ ,OH,Fairfield,FAIR\n\ ,OH,Fayette,FAYE\n\ ,OH,Franklin,FRAN\n\ ,OH,Fulton,FULT\n\ ,OH,Gallia,GALL\n\ ,OH,Geauga,GEAU\n\ ,OH,Greene,GREE\n\ ,OH,Guernsey,GUER\n\ ,OH,Hamilton,HAMI\n\ ,OH,Hancock,HANC\n\ ,OH,Hardin,HARD\n\ ,OH,Harrison,HARR\n\ ,OH,Henry,HENR\n\ ,OH,Highland,HIGH\n\ ,OH,Hocking,HOCK\n\ ,OH,Holmes,HOLM\n\ ,OH,Huron,HURO\n\ ,OH,Jackson,JACK\n\ ,OH,Jefferson,JEFF\n\ ,OH,Knox,KNOX\n\ ,OH,Lake,LAKE\n\ ,OH,Lawrence,LAWR\n\ ,OH,Licking,LICK\n\ ,OH,Logan,LOGA\n\ ,OH,Lorain,LORA\n\ ,OH,Lucas,LUCA\n\ ,OH,Madison,MADI\n\ ,OH,Mahoning,MAHO\n\ ,OH,Marion,MARI\n\ ,OH,Medina,MEDI\n\ ,OH,Meigs,MEIG\n\ ,OH,Mercer,MERC\n\ ,OH,Miami,MIAM\n\ ,OH,Monroe,MONR\n\ ,OH,Montgomery,MONT\n\ ,OH,Morgan,MORG\n\ ,OH,Morrow,MORR\n\ ,OH,Muskingum,MUSK\n\ ,OH,Noble,NOBL\n\ ,OH,Ottawa,OTTA\n\ ,OH,Paulding,PAUL\n\ ,OH,Perry,PERR\n\ ,OH,Pickaway,PICK\n\ ,OH,Pike,PIKE\n\ ,OH,Portage,PORT\n\ ,OH,Preble,PREB\n\ ,OH,Putnam,PUTN\n\ ,OH,Richland,RICH\n\ ,OH,Ross,ROSS\n\ ,OH,Sandusky,SAND\n\ ,OH,Scioto,SCIO\n\ ,OH,Seneca,SENE\n\ ,OH,Shelby,SHEL\n\ ,OH,Stark,STAR\n\ ,OH,Summit,SUMM\n\ ,OH,Trumbull,TRUM\n\ ,OH,Tuscarawas,TUSC\n\ ,OH,Union,UNIO\n\ ,OH,VanWert,VANW\n\ ,OH,Vinton,VINT\n\ ,OH,Warren,WARR\n\ ,OH,Washington,WASH\n\ ,OH,Wayne,WAYN\n\ ,OH,Williams,WILL\n\ ,OH,Wood,WOOD\n\ ,OH,Wyandot,WYAN\n\ Oklahoma,OK,Adair,ADA\n\ ,OK,Alfalfa,ALF\n\ ,OK,Atoka,ATO\n\ ,OK,Beaver,BEA\n\ ,OK,Beckham,BEC\n\ ,OK,Blaine,BLA\n\ ,OK,Bryan,BRY\n\ ,OK,Caddo,CAD\n\ ,OK,Canadian,CAN\n\ ,OK,Carter,CAR\n\ ,OK,Cherokee,CHE\n\ ,OK,Choctaw,CHO\n\ ,OK,Cimarron,CIM\n\ ,OK,Cleveland,CLE\n\ ,OK,Coal,COA\n\ ,OK,Comanche,COM\n\ ,OK,Cotton,COT\n\ ,OK,Craig,CRA\n\ ,OK,Creek,CRE\n\ ,OK,Custer,CUS\n\ ,OK,Delaware,DEL\n\ ,OK,Dewey,DEW\n\ ,OK,Ellis,ELL\n\ ,OK,Garfield,GAR\n\ ,OK,Garvin,GRV\n\ ,OK,Grady,GRA\n\ ,OK,Grant,GNT\n\ ,OK,Greer,GRE\n\ ,OK,Harmon,HAR\n\ ,OK,Harper,HRP\n\ ,OK,Haskell,HAS\n\ ,OK,Hughes,HUG\n\ ,OK,Jackson,JAC\n\ ,OK,Jefferson,JEF\n\ ,OK,Johnston,JOH\n\ ,OK,Kay,KAY\n\ ,OK,Kingfisher,KIN\n\ ,OK,Kiowa,KIO\n\ ,OK,Latimer,LAT\n\ ,OK,Le Flore,LEF\n\ ,OK,Lincoln,LIN\n\ ,OK,Logan,LOG\n\ ,OK,Love,LOV\n\ ,OK,McClain,MCL\n\ ,OK,McCurtain,MCU\n\ ,OK,McIntosh,MCI\n\ ,OK,Major,MAJ\n\ ,OK,Marshall,MAR\n\ ,OK,Mayes,MAY\n\ ,OK,Murray,MUR\n\ ,OK,Muskogee,MUS\n\ ,OK,Noble,NOB\n\ ,OK,Nowata,NOW\n\ ,OK,Okfuskee,OKF\n\ ,OK,Oklahoma,OKL\n\ ,OK,Okmulgee,OKM\n\ ,OK,Osage,OSA\n\ ,OK,Ottawa,OTT\n\ ,OK,Pawnee,PAW\n\ ,OK,Payne,PAY\n\ ,OK,Pittsburg,PIT\n\ ,OK,Pontotoc,PON\n\ ,OK,Pottawatomie,POT\n\ ,OK,Pushmataha,PUS\n\ ,OK,Roger Mills,RGM\n\ ,OK,Rogers,ROG\n\ ,OK,Seminole,SEM\n\ ,OK,Sequoyah,SEQ\n\ ,OK,Stephens,STE\n\ ,OK,Texas,TEX\n\ ,OK,Tillman,TIL\n\ ,OK,Tulsa,TUL\n\ ,OK,Wagoner,WAG\n\ ,OK,Washington,WAS\n\ ,OK,Washita,WAT\n\ ,OK,Woods,WOO\n\ ,OK,Woodward,WDW\n\ Ontario,ON,Algoma District,ALG\n\ ,ON,City of Brant,BRA\n\ ,ON,City of Brantford,BFD\n\ ,ON,Bruce County,BRU\n\ ,ON,City of Chatham-Kent,CHK\n\ ,ON,Cochrane District,COC\n\ ,ON,Dufferin County,DUF\n\ ,ON,Durham Regional Municipality,DUR\n\ ,ON,Elgin County,ELG\n\ ,ON,Essex County,ESX\n\ ,ON,Frontenac County,FRO\n\ ,ON,Grey County,GRY\n\ ,ON,Town of Haldimand,HAL\n\ ,ON,Haliburton County,HLB\n\ ,ON,Halton Regional Municipality,HTN\n\ ,ON,City of Hamilton,HAM\n\ ,ON,Hastings County,HAS\n\ ,ON,Huron County,HUR\n\ ,ON,City of Kawartha Lakes,KAW\n\ ,ON,Kenora District,KEN\n\ ,ON,Lambton County,LAM\n\ ,ON,Lanark County,LAN\n\ ,ON,Leeds Grenville United Counties,LGR\n\ ,ON,Lennox-Addington County,LXA\n\ ,ON,Manitoulin District,MAN\n\ ,ON,Middlesex County,MSX\n\ ,ON,Muskoka District,MUS\n\ ,ON,Niagara Regional Municipality,NIA\n\ ,ON,Nipissing District,NIP\n\ ,ON,Town of Norfolk,NFK\n\ ,ON,Northumberland County,NOR\n\ ,ON,City of Ottawa,OTT\n\ ,ON,Oxford County,OXF\n\ ,ON,Parry Sound District,PSD\n\ ,ON,Peel Regional Municipality,PEL\n\ ,ON,Perth County,PER\n\ ,ON,Peterborough County,PET\n\ ,ON,United Counties of Prescott Russell,PRU\n\ ,ON,City of Prince Edward,PED\n\ ,ON,Rainy River District,RAI\n\ ,ON,Renfrew County,REN\n\ ,ON,Simcoe County,SIM\n\ ,ON,United Counties of Stormont Dundas Glengarry,SDG\n\ ,ON,Sudbury District,SUD\n\ ,ON,Thunder Bay District,TBY\n\ ,ON,Timiskaming District,TIM\n\ ,ON,City of Toronto,TOR\n\ ,ON,Waterloo Regional Municipality,WAT\n\ ,ON,Wellington County,WEL\n\ ,ON,York Regional Municipality,YRK\n\ Oregon,OR,Baker,BAK\n\ ,OR,Benton,BEN\n\ ,OR,Clackamas,CLK\n\ ,OR,Clatsop,CLT\n\ ,OR,Columbia,COL\n\ ,OR,Coos,COO\n\ ,OR,Crook,CRO\n\ ,OR,Curry,CUR\n\ ,OR,Deschutes,DES\n\ ,OR,Douglas,DOU\n\ ,OR,Gilliam,GIL\n\ ,OR,Grant,GRA\n\ ,OR,Harney,HAR\n\ ,OR,Hood River,HOO\n\ ,OR,Jackson,JAC\n\ ,OR,Jefferson,JEF\n\ ,OR,Josephine,JOS\n\ ,OR,Klamath,KLA\n\ ,OR,Lake,LAK\n\ ,OR,Lane,LAN\n\ ,OR,Lincoln,LCN\n\ ,OR,Linn,LNN\n\ ,OR,Malheur,MAL\n\ ,OR,Marion,MAR\n\ ,OR,Morrow,MOR\n\ ,OR,Multnomah,MUL\n\ ,OR,Polk,POL\n\ ,OR,Sherman,SHE\n\ ,OR,Tillamook,TIL\n\ ,OR,Umatilla,UMA\n\ ,OR,Union,UNI\n\ ,OR,Wallowa,WAL\n\ ,OR,Wasco,WCO\n\ ,OR,Washington,WSH\n\ ,OR,Wheeler,WHE\n\ ,OR,Yamhill,YAM\n\ Pennsylvania,PA,Adams,ADA\n\ ,PA,Allegheny,ALL\n\ ,PA,Armstrong,ARM\n\ ,PA,Beaver,BEA\n\ ,PA,Bedford,BED\n\ ,PA,Berks,BER\n\ ,PA,Blair,BLA\n\ ,PA,Bradford,BRA\n\ ,PA,Bucks,BUX\n\ ,PA,Butler,BUT\n\ ,PA,Cambria,CMB\n\ ,PA,Cameron,CRN\n\ ,PA,Carbon,CAR\n\ ,PA,Centre,CEN\n\ ,PA,Chester,CHE\n\ ,PA,Clarion,CLA\n\ ,PA,Clearfield,CLE\n\ ,PA,Clinton,CLI\n\ ,PA,Columbia,COL\n\ ,PA,Crawford,CRA\n\ ,PA,Cumberland,CUM\n\ ,PA,Dauphin,DAU\n\ ,PA,Delaware,DCO\n\ ,PA,Elk,ELK\n\ ,PA,Erie,ERI\n\ ,PA,Fayette,FAY\n\ ,PA,Forest,FOR\n\ ,PA,Franklin,FRA\n\ ,PA,Fulton,FUL\n\ ,PA,Greene,GRE\n\ ,PA,Huntingdon,HUN\n\ ,PA,Indiana,INN\n\ ,PA,Jefferson,JEF\n\ ,PA,Juniata,JUN\n\ ,PA,Lackawanna,LAC\n\ ,PA,Lancaster,LAN\n\ ,PA,Lawrence,LAW\n\ ,PA,Lebanon,LEB\n\ ,PA,Lehigh,LEH\n\ ,PA,Luzerne,LUZ\n\ ,PA,Lycoming,LYC\n\ ,PA,Mc Kean,MCK\n\ ,PA,Mercer,MER\n\ ,PA,Mifflin,MIF\n\ ,PA,Monroe,MOE\n\ ,PA,Montgomery,MGY\n\ ,PA,Montour,MTR\n\ ,PA,Northampton,NHA\n\ ,PA,Northumberland,NUM\n\ ,PA,Perry,PER\n\ ,PA,Philadelphia,PHI\n\ ,PA,Pike,PIK\n\ ,PA,Potter,POT\n\ ,PA,Schuylkill,SCH\n\ ,PA,Snyder,SNY\n\ ,PA,Somerset,SOM\n\ ,PA,Sullivan,SUL\n\ ,PA,Susquehanna,SUS\n\ ,PA,Tioga,TIO\n\ ,PA,Union,UNI\n\ ,PA,Venango,VEN\n\ ,PA,Warren,WAR\n\ ,PA,Washington,WAS\n\ ,PA,Wayne,WAY\n\ ,PA,Westmoreland,WES\n\ ,PA,Wyoming,WYO\n\ ,PA,York,YOR\n\ Prince Edward Island,PE,Alberton,\n\ ,PE,Charlottetown,\n\ ,PE,Cornwall,\n\ ,PE,Georgetown,\n\ ,PE,Kensington,\n\ ,PE,Montague,\n\ ,PE,Souris,\n\ ,PE,Stratford,\n\ ,PE,Summerside,\n\ ,PE,Tignish,\n\ Puerto Rico,PR,Adjuntas Municipio,\n\ ,PR,Aguada Municipio,\n\ ,PR,Aguadilla Municipio,\n\ ,PR,Aguas Buenas Municipio,\n\ ,PR,Aibonito Municipio,\n\ ,PR,Anasco Municipio,\n\ ,PR,Arecibo Municipio,\n\ ,PR,Arroyo Municipio,\n\ ,PR,Barceloneta Municipio,\n\ ,PR,Barranquitas Municipio,\n\ ,PR,Bayamon Municipio,\n\ ,PR,Cabo Rojo Municipio,\n\ ,PR,Caguas Municipio,\n\ ,PR,Camuy Municipio,\n\ ,PR,Canovanas Municipio,\n\ ,PR,Carolina Municipio,\n\ ,PR,Catano Municipio,\n\ ,PR,Cayey Municipio,\n\ ,PR,Ceiba Municipio,\n\ ,PR,Ciales Municipio,\n\ ,PR,Cidra Municipio,\n\ ,PR,Coamo Municipio,\n\ ,PR,Comerio Municipio,\n\ ,PR,Corozal Municipio,\n\ ,PR,Culebra Municipio,\n\ ,PR,Dorado Municipio,\n\ ,PR,Fajardo Municipio,\n\ ,PR,Florida Municipio,\n\ ,PR,Guanica Municipio,\n\ ,PR,Guayama Municipio,\n\ ,PR,Guayanilla Municipio,\n\ ,PR,Guaynabo Municipio,\n\ ,PR,Gurabo Municipio,\n\ ,PR,Hatillo Municipio,\n\ ,PR,Hormigueros Municipio,\n\ ,PR,Humacao Municipio,\n\ ,PR,Isabela Municipio,\n\ ,PR,Jayuya Municipio,\n\ ,PR,Juana Diaz Municipio,\n\ ,PR,Juncos Municipio,\n\ ,PR,Lajas Municipio,\n\ ,PR,Lares Municipio,\n\ ,PR,Las Marias Municipio,\n\ ,PR,Las Piedras Municipio,\n\ ,PR,Loiza Municipio,\n\ ,PR,Luquillo Municipio,\n\ ,PR,Manati Municipio,\n\ ,PR,Maricao Municipio,\n\ ,PR,Maunabo Municipio,\n\ ,PR,Mayaguez Municipio,\n\ ,PR,Moca Municipio,\n\ ,PR,Morovis Municipio,\n\ ,PR,Naguabo Municipio,\n\ ,PR,Naranjito Municipio,\n\ ,PR,Orocovis Municipio,\n\ ,PR,Patillas Municipio,\n\ ,PR,Penuelas Municipio,\n\ ,PR,Ponce Municipio,\n\ ,PR,Quebradillas Municipio,\n\ ,PR,Rincon Municipio,\n\ ,PR,Rio Grande Municipio,\n\ ,PR,Sabana Grande Municipio,\n\ ,PR,Salinas Municipio,\n\ ,PR,San German Municipio,\n\ ,PR,San Juan Municipio,\n\ ,PR,San Lorenzo Municipio,\n\ ,PR,San Sebastian Municipio,\n\ ,PR,Santa Isabel Municipio,\n\ ,PR,Toa Alta Municipio,\n\ ,PR,Toa Baja Municipio,\n\ ,PR,Trujillo Alto Municipio,\n\ ,PR,Utuado Municipio,\n\ ,PR,Vega Alta Municipio,\n\ ,PR,Vega Baja Municipio,\n\ ,PR,Vieques Municipio,\n\ ,PR,Villalba Municipio,\n\ ,PR,Yabucoa Municipio,\n\ ,PR,Yauco Municipio,\n\ Quebec,QC,Bas-Saint-Laurent,\n\ ,QC,Saguenay–Lac-Saint-Jean,\n\ ,QC,Capitale-Nationale,\n\ ,QC,Mauricie,\n\ ,QC,Estrie,\n\ ,QC,Montréal,\n\ ,QC,Outaouais,\n\ ,QC,Abitibi-Témiscamingue,\n\ ,QC,Côte-Nord,\n\ ,QC,Nord-du-Québec,\n\ ,QC,CRÉ de la Baie-James,\n\ ,QC,Cree Regional Authority,\n\ ,QC,Kativik Regional Government,\n\ ,QC,Gaspésie–Îles-de-la-Madeleine,\n\ ,QC,Chaudière-Appalaches,\n\ ,QC,Laval,\n\ ,QC,Lanaudière,\n\ ,QC,Laurentides,\n\ ,QC,Montérégie,\n\ ,QC,CRÉ de Longueuil,\n\ ,QC,CRÉ Montérégie Est,\n\ ,QC,CRÉ Vallée-du-Haut-Saint-Laurent,\n\ ,QC,Centre-du-Québec,\n\ Rhode Island,RI,Bristol,BRI\n\ ,RI,Kent,KNT\n\ ,RI,Newport,NEW\n\ ,RI,Providence,PRO\n\ ,RI,Washington,WAR\n\ Saskatchewan,SA,,\n\ ,SA,Assiniboia,\n\ ,SA,Battleford,\n\ ,SA,Estevan,\n\ ,SA,Kindersley,\n\ ,SA,La Ronge,\n\ ,SA,Lloydminster,\n\ ,SA,Maple Creek,\n\ ,SA,Melfort,\n\ ,SA,Melville,\n\ ,SA,Moose Jaw,\n\ ,SA,North Battleford,\n\ ,SA,Prince Albert,\n\ ,SA,Regina,\n\ ,SA,Saskatoon,\n\ ,SA,Swift Current,\n\ ,SA,Weyburn,\n\ ,SA,Wynyard,\n\ ,SA,Yorkton,\n\ South Carolina,SC,Abbeville,ABBE\n\ ,SC,Aiken,AIKE\n\ ,SC,Allendale,ALLE\n\ ,SC,Anderson,ANDE\n\ ,SC,Bamberg,BAMB\n\ ,SC,Barnwell,BARN\n\ ,SC,Beaufort,BEAU\n\ ,SC,Berkeley,BERK\n\ ,SC,Calhoun,CHOU\n\ ,SC,Charleston,CHAR\n\ ,SC,Chester,CHES\n\ ,SC,Chesterfield,CHFD\n\ ,SC,Cherokee,CKEE\n\ ,SC,Clarendon,CLRN\n\ ,SC,Colleton,COLL\n\ ,SC,Darlington,DARL\n\ ,SC,Dillon,DILL\n\ ,SC,Dorchester,DORC\n\ ,SC,Edgefield,EDGE\n\ ,SC,Fairfield,FAIR\n\ ,SC,Florence,FLOR\n\ ,SC,Georgetown,GEOR\n\ ,SC,Greenwood,GRWD\n\ ,SC,Greenville,GVIL\n\ ,SC,Hampton,HAMP\n\ ,SC,Horry,HORR\n\ ,SC,Jasper,JASP\n\ ,SC,Kershaw,KERS\n\ ,SC,Laurens,LAUR\n\ ,SC,Lee,LEE\n\ ,SC,Lexington,LEXI\n\ ,SC,Lancaster,LNCS\n\ ,SC,Marion,MARI\n\ ,SC,Marlboro,MARL\n\ ,SC,McCormick,MCOR\n\ ,SC,Newberry,NEWB\n\ ,SC,Oconee,OCON\n\ ,SC,Orangeburg,ORNG\n\ ,SC,Pickens,PICK\n\ ,SC,Richland,RICH\n\ ,SC,Saluda,SALU\n\ ,SC,Spartanburg,SPAR\n\ ,SC,Sumter,SUMT\n\ ,SC,Union,UNIO\n\ ,SC,Williamsburg,WILL\n\ ,SC,York,YORK\n\ South Dakota,SD,Aurora,AURO\n\ ,SD,Beadle,BEAD\n\ ,SD,Bennett,BENN\n\ ,SD,Bon Homme,BONH\n\ ,SD,Brookings,BROO\n\ ,SD,Brule,BRUL\n\ ,SD,Brown,BRWN\n\ ,SD,Buffalo,BUFF\n\ ,SD,Butte,BUTT\n\ ,SD,Campbell,CAMP\n\ ,SD,Charles Mix,CHAR\n\ ,SD,Clay,CLAY\n\ ,SD,Clark,CLRK\n\ ,SD,Codington,CODI\n\ ,SD,Corson,CORS\n\ ,SD,Custer,CUST\n\ ,SD,Davison,DAVI\n\ ,SD,Day,DAY\n\ ,SD,Deuel,DEUE\n\ ,SD,Dewey,DEWY\n\ ,SD,Douglas,DGLS\n\ ,SD,Edmunds,EDMU\n\ ,SD,Fall River,FALL\n\ ,SD,Faulk,FAUL\n\ ,SD,Grant,GRAN\n\ ,SD,Gregory,GREG\n\ ,SD,Haakon,HAAK\n\ ,SD,Hamlin,HAML\n\ ,SD,Hand,HAND\n\ ,SD,Hanson,HNSN\n\ ,SD,Harding,HRDG\n\ ,SD,Hughes,HUGH\n\ ,SD,Hutchinson,HUTC\n\ ,SD,Hyde,HYDE\n\ ,SD,Jerauld,JERA\n\ ,SD,Jackson,JKSN\n\ ,SD,Jones,JONE\n\ ,SD,Kingsbury,KING\n\ ,SD,Lake,LAKE\n\ ,SD,Lawrence,LAWR\n\ ,SD,Lincoln,LINC\n\ ,SD,Lyman,LYMA\n\ ,SD,McCook,MCOO\n\ ,SD,McPherson,MCPH\n\ ,SD,Meade,MEAD\n\ ,SD,Mellette,MELL\n\ ,SD,Miner,MINE\n\ ,SD,Minnehaha,MINN\n\ ,SD,Moody,MOOD\n\ ,SD,Marshall,MRSH\n\ ,SD,Oglala Lakota,OGLA\n\ ,SD,Pennington,PENN\n\ ,SD,Perkins,PERK\n\ ,SD,Potter,POTT\n\ ,SD,Roberts,ROBE\n\ ,SD,Sanborn,SANB\n\ ,SD,Spink,SPIN\n\ ,SD,Stanley,STAN\n\ ,SD,Sully,SULL\n\ ,SD,Todd,TODD\n\ ,SD,Tripp,TRIP\n\ ,SD,Turner,TURN\n\ ,SD,Union,UNIO\n\ ,SD,Walworth,WALW\n\ ,SD,Yankton,YANK\n\ ,SD,Ziebach,ZIEB\n\ Tennessee,TN,Anderson,ANDE\n\ ,TN,Bedford,BEDF\n\ ,TN,Benton,BENT\n\ ,TN,Bledsoe,BLED\n\ ,TN,Blount,BLOU\n\ ,TN,Bradley,BRAD\n\ ,TN,Campbell,CAMP\n\ ,TN,Cannon,CANN\n\ ,TN,Carroll,CARR\n\ ,TN,Carter,CART\n\ ,TN,Cheatham,CHEA\n\ ,TN,Chester,CHES\n\ ,TN,Claiborne,CLAI\n\ ,TN,Clay,CLAY\n\ ,TN,Cocke,COCK\n\ ,TN,Coffee,COFF\n\ ,TN,Crockett,CROC\n\ ,TN,Cumberland,CUMB\n\ ,TN,Davidson,DAVI\n\ ,TN,Decatur,DECA\n\ ,TN,DeKalb,DEKA\n\ ,TN,Dickson,DICK\n\ ,TN,Dyer,DYER\n\ ,TN,Fayette,FAYE\n\ ,TN,Fentress,FENT\n\ ,TN,Franklin,FRAN\n\ ,TN,Gibson,GIBS\n\ ,TN,Giles,GILE\n\ ,TN,Grainger,GRAI\n\ ,TN,Greene,GREE\n\ ,TN,Grundy,GRUN\n\ ,TN,Hamblen,HAMB\n\ ,TN,Hamilton,HAMI\n\ ,TN,Hancock,HANC\n\ ,TN,Hardeman,HARD\n\ ,TN,Hardin,HARN\n\ ,TN,Hawkins,HAWK\n\ ,TN,Haywood,HAYW\n\ ,TN,Henderson,HEND\n\ ,TN,Henry,HENR\n\ ,TN,Hickman,HICK\n\ ,TN,Houston,HOUS\n\ ,TN,Humphreys,HUMP\n\ ,TN,Jackson,JACK\n\ ,TN,Jefferson,JEFF\n\ ,TN,Johnson,JOHN\n\ ,TN,Knox,KNOX\n\ ,TN,Lake,LAKE\n\ ,TN,Lauderdale,LAUD\n\ ,TN,Lawrence,LAWR\n\ ,TN,Lewis,LEWI\n\ ,TN,Lincoln,LINC\n\ ,TN,Loudon,LOUD\n\ ,TN,Macon,MACO\n\ ,TN,Madison,MADI\n\ ,TN,Marion,MARI\n\ ,TN,Marshall,MARS\n\ ,TN,Maury,MAUR\n\ ,TN,McMinn,MCMI\n\ ,TN,McNairy,MCNA\n\ ,TN,Meigs,MEIG\n\ ,TN,Monroe,MONR\n\ ,TN,Montgomery,MONT\n\ ,TN,Moore,MOOR\n\ ,TN,Morgan,MORG\n\ ,TN,Obion,OBIO\n\ ,TN,Overton,OVER\n\ ,TN,Perry,PERR\n\ ,TN,Pickett,PICK\n\ ,TN,Polk,POLK\n\ ,TN,Putnam,PUTN\n\ ,TN,Rhea,RHEA\n\ ,TN,Roane,ROAN\n\ ,TN,Robertson,ROBE\n\ ,TN,Rutherford,RUTH\n\ ,TN,Scott,SCOT\n\ ,TN,Sequatchie,SEQU\n\ ,TN,Sevier,SEVI\n\ ,TN,Shelby,SHEL\n\ ,TN,Smith,SMIT\n\ ,TN,Stewart,STEW\n\ ,TN,Sullivan,SULL\n\ ,TN,Sumner,SUMN\n\ ,TN,Tipton,TIPT\n\ ,TN,Trousdale,TROU\n\ ,TN,Unicoi,UNIC\n\ ,TN,Union,UNIO\n\ ,TN,Van Buren,VANB\n\ ,TN,Warren,WARR\n\ ,TN,Washington,WASH\n\ ,TN,Wayne,WAYN\n\ ,TN,Weakley,WEAK\n\ ,TN,White,WHIT\n\ ,TN,Williamson,WILL\n\ ,TN,Wilson,WILS\n\ Texas,TX,Anderson,ANDE\n\ ,TX,Andrews,ANDR\n\ ,TX,Angelina,ANGE\n\ ,TX,Aransas,ARAN\n\ ,TX,Archer,ARCH\n\ ,TX,Armstrong,ARMS\n\ ,TX,Atascosa,ATAS\n\ ,TX,Austin,AUST\n\ ,TX,Bailey,BAIL\n\ ,TX,Bandera,BAND\n\ ,TX,Bastrop,BAST\n\ ,TX,Baylor,BAYL\n\ ,TX,Bee,BEE\n\ ,TX,Bell,BELL\n\ ,TX,Bexar,BEXA\n\ ,TX,Blanco,BLAN\n\ ,TX,Borden,BORD\n\ ,TX,Bosque,BOSQ\n\ ,TX,Bowie,BOWI\n\ ,TX,Brazoria,BZIA\n\ ,TX,Brazos,BZOS\n\ ,TX,Brewster,BREW\n\ ,TX,Briscoe,BRIS\n\ ,TX,Brooks,BROO\n\ ,TX,Brown,BROW\n\ ,TX,Burleson,BURL\n\ ,TX,Burnet,BURN\n\ ,TX,Caldwell,CALD\n\ ,TX,Calhoun,CALH\n\ ,TX,Callahan,CALL\n\ ,TX,Cameron,CMRN\n\ ,TX,Camp,CAMP\n\ ,TX,Carson,CARS\n\ ,TX,Cass,CASS\n\ ,TX,Castro,CAST\n\ ,TX,Chambers,CHAM\n\ ,TX,Cherokee,CHER\n\ ,TX,Childress,CHIL\n\ ,TX,Clay,CLAY\n\ ,TX,Cochran,COCH\n\ ,TX,Coke,COKE\n\ ,TX,Coleman,COLE\n\ ,TX,Collin,COLN\n\ ,TX,Collingsworth,COLW\n\ ,TX,Colorado,COLO\n\ ,TX,Comal,COML\n\ ,TX,Comanche,COMA\n\ ,TX,Concho,CONC\n\ ,TX,Cooke,COOK\n\ ,TX,Coryell,CORY\n\ ,TX,Cottle,COTT\n\ ,TX,Crane,CRAN\n\ ,TX,Crockett,CROC\n\ ,TX,Crosby,CROS\n\ ,TX,Culberson,CULB\n\ ,TX,Dallam,DALM\n\ ,TX,Dallas,DALS\n\ ,TX,Dawson,DAWS\n\ ,TX,Deaf Smith,DSMI\n\ ,TX,Delta,DELT\n\ ,TX,Denton,DENT\n\ ,TX,Dewitt,DEWI\n\ ,TX,Dickens,DICK\n\ ,TX,Dimmit,DIMM\n\ ,TX,Donley,DONL\n\ ,TX,Duval,DUVA\n\ ,TX,Eastland,EAST\n\ ,TX,Ector,ECTO\n\ ,TX,Edwards,EDWA\n\ ,TX,El Paso,EPAS\n\ ,TX,Ellis,ELLI\n\ ,TX,Erath,ERAT\n\ ,TX,Falls,FALL\n\ ,TX,Fannin,FANN\n\ ,TX,Fayette,FAYE\n\ ,TX,Fisher,FISH\n\ ,TX,Floyd,FLOY\n\ ,TX,Foard,FOAR\n\ ,TX,Fort Bend,FBEN\n\ ,TX,Franklin,FRAN\n\ ,TX,Freestone,FREE\n\ ,TX,Frio,FRIO\n\ ,TX,Gaines,GAIN\n\ ,TX,Galveston,GALV\n\ ,TX,Garza,GARZ\n\ ,TX,Gillespie,GILL\n\ ,TX,Glasscock,GLAS\n\ ,TX,Goliad,GOLI\n\ ,TX,Gonzales,GONZ\n\ ,TX,Gray,GRAY\n\ ,TX,Grayson,GRSN\n\ ,TX,Gregg,GREG\n\ ,TX,Grimes,GRIM\n\ ,TX,Guadalupe,GUAD\n\ ,TX,Hale,HALE\n\ ,TX,Hall,HALL\n\ ,TX,Hamilton,HAMI\n\ ,TX,Hansford,HANS\n\ ,TX,Hardeman,HDMN\n\ ,TX,Hardin,HRDN\n\ ,TX,Harris,HARR\n\ ,TX,Harrison,HRSN\n\ ,TX,Hartley,HART\n\ ,TX,Haskell,HASK\n\ ,TX,Hays,HAYS\n\ ,TX,Hemphill,HEMP\n\ ,TX,Henderson,HEND\n\ ,TX,Hidalgo,HIDA\n\ ,TX,Hill,HILL\n\ ,TX,Hockley,HOCK\n\ ,TX,Hood,HOOD\n\ ,TX,Hopkins,HOPK\n\ ,TX,Houston,HOUS\n\ ,TX,Howard,HOWA\n\ ,TX,Hudspeth,HUDS\n\ ,TX,Hunt,HUNT\n\ ,TX,Hutchinson,HUTC\n\ ,TX,Irion,IRIO\n\ ,TX,Jack,JACK\n\ ,TX,Jackson,JKSN\n\ ,TX,Jasper,JASP\n\ ,TX,Jeff Davis,JDAV\n\ ,TX,Jefferson,JEFF\n\ ,TX,Jim Hogg,JHOG\n\ ,TX,Jim Wells,JWEL\n\ ,TX,Johnson,JOHN\n\ ,TX,Jones,JONE\n\ ,TX,Karnes,KARN\n\ ,TX,Kaufman,KAUF\n\ ,TX,Kendall,KEND\n\ ,TX,Kenedy,KENY\n\ ,TX,Kent,KENT\n\ ,TX,Kerr,KERR\n\ ,TX,Kimble,KIMB\n\ ,TX,King,KING\n\ ,TX,Kinney,KINN\n\ ,TX,Kleberg,KLEB\n\ ,TX,Knox,KNOX\n\ ,TX,Lamar,LAMA\n\ ,TX,Lamb,LAMB\n\ ,TX,Lampasas,LAMP\n\ ,TX,La Salle,LSAL\n\ ,TX,Lavaca,LAVA\n\ ,TX,Lee,LEE\n\ ,TX,Leon,LEON\n\ ,TX,Liberty,LIBE\n\ ,TX,Limestone,LIME\n\ ,TX,Lipscomb,LIPS\n\ ,TX,Live Oak,LIVO\n\ ,TX,Llano,LLAN\n\ ,TX,Loving,LOVI\n\ ,TX,Lubbock,LUBB\n\ ,TX,Lynn,LYNN\n\ ,TX,Madison,MADI\n\ ,TX,Marion,MARI\n\ ,TX,Martin,MART\n\ ,TX,Mason,MASO\n\ ,TX,Matagorda,MATA\n\ ,TX,Maverick,MAVE\n\ ,TX,McCulloch,MCUL\n\ ,TX,McLennan,MLEN\n\ ,TX,McMullen,MMUL\n\ ,TX,Medina,MEDI\n\ ,TX,Menard,MENA\n\ ,TX,Midland,MIDL\n\ ,TX,Milam,MILA\n\ ,TX,Mills,MILL\n\ ,TX,Mitchell,MITC\n\ ,TX,Montague,MONT\n\ ,TX,Montgomery,MGMY\n\ ,TX,Moore,MOOR\n\ ,TX,Morris,MORR\n\ ,TX,Motley,MOTL\n\ ,TX,Nacogdoches,NACO\n\ ,TX,Navarro,NAVA\n\ ,TX,Newton,NEWT\n\ ,TX,Nolan,NOLA\n\ ,TX,Nueces,NUEC\n\ ,TX,Ochiltree,OCHI\n\ ,TX,Oldham,OLDH\n\ ,TX,Orange,ORAN\n\ ,TX,Palo Pinto,PPIN\n\ ,TX,Panola,PANO\n\ ,TX,Parker,PARK\n\ ,TX,Parmer,PARM\n\ ,TX,Pecos,PECO\n\ ,TX,Polk,POLK\n\ ,TX,Potter,POTT\n\ ,TX,Presidio,PRES\n\ ,TX,Rains,RAIN\n\ ,TX,Randall,RAND\n\ ,TX,Reagan,REAG\n\ ,TX,Real,REAL\n\ ,TX,Red River,RRIV\n\ ,TX,Reeves,REEV\n\ ,TX,Refugio,REFU\n\ ,TX,Roberts,ROBE\n\ ,TX,Robertson,RBSN\n\ ,TX,Rockwall,ROCK\n\ ,TX,Runnels,RUNN\n\ ,TX,Rusk,RUSK\n\ ,TX,Sabine,SABI\n\ ,TX,San Augustine,SAUG\n\ ,TX,San Jacinto,SJAC\n\ ,TX,San Patricio,SPAT\n\ ,TX,San Saba,SSAB\n\ ,TX,Schleicher,SCHL\n\ ,TX,Scurry,SCUR\n\ ,TX,Shackelford,SHAC\n\ ,TX,Shelby,SHEL\n\ ,TX,Sherman,SHMN\n\ ,TX,Smith,SMIT\n\ ,TX,Somervell,SOME\n\ ,TX,Starr,STAR\n\ ,TX,Stephens,STEP\n\ ,TX,Sterling,STER\n\ ,TX,Stonewall,STON\n\ ,TX,Sutton,SUTT\n\ ,TX,Swisher,SWIS\n\ ,TX,Tarrant,TARR\n\ ,TX,Taylor,TAYL\n\ ,TX,Terrell,TERL\n\ ,TX,Terry,TERY\n\ ,TX,Throckmorton,THRO\n\ ,TX,Titus,TITU\n\ ,TX,Tom Green,TGRE\n\ ,TX,Travis,TRAV\n\ ,TX,Trinity,TRIN\n\ ,TX,Tyler,TYLE\n\ ,TX,Upshur,UPSH\n\ ,TX,Upton,UPTO\n\ ,TX,Uvalde,UVAL\n\ ,TX,Val Verde,VVER\n\ ,TX,Van Zandt,VZAN\n\ ,TX,Victoria,VICT\n\ ,TX,Walker,WALK\n\ ,TX,Waller,WALL\n\ ,TX,Ward,WARD\n\ ,TX,Washington,WASH\n\ ,TX,Webb,WEBB\n\ ,TX,Wharton,WHAR\n\ ,TX,Wheeler,WHEE\n\ ,TX,Wichita,WICH\n\ ,TX,Wilbarger,WILB\n\ ,TX,Willacy,WILY\n\ ,TX,Williamson,WMSN\n\ ,TX,Wilson,WLSN\n\ ,TX,Winkler,WINK\n\ ,TX,Wise,WISE\n\ ,TX,Wood,WOOD\n\ ,TX,Yoakum,YOAK\n\ ,TX,Young,YOUN\n\ ,TX,Zapata,ZAPA\n\ ,TX,Zavala,ZAVA\n\ Midway,UM,Midway Islands,\n\ Utah,UT,Beaver,BEA\n\ ,UT,Box Elder,BOX\n\ ,UT,Cache,CAC\n\ ,UT,Carbon,CAR\n\ ,UT,Daggett,DAG\n\ ,UT,Davis,DAV\n\ ,UT,Duchesne,DUC\n\ ,UT,Emery,EME\n\ ,UT,Garfield,GAR\n\ ,UT,Grand,GRA\n\ ,UT,Iron,IRO\n\ ,UT,Juab,JUA\n\ ,UT,Kane,KAN\n\ ,UT,Millard,MIL\n\ ,UT,Morgan,MOR\n\ ,UT,Piute,PIU\n\ ,UT,Rich,RIC\n\ ,UT,Salt Lake,SAL\n\ ,UT,San Juan,SNJ\n\ ,UT,Sanpete,SNP\n\ ,UT,Sevier,SEV\n\ ,UT,Summit,SUM\n\ ,UT,Tooele,TOO\n\ ,UT,Uintah,UIN\n\ ,UT,Utah,UTA\n\ ,UT,Wasatch,WST\n\ ,UT,Washington,WSH\n\ ,UT,Wayne,WAY\n\ ,UT,Weber,WEB\n\ Vermont,VT,Addison,ADD\n\ ,VT,Bennington,BEN\n\ ,VT,Caledonia,CAL\n\ ,VT,Chittenden,CHI\n\ ,VT,Essex,ESS\n\ ,VT,Franklin,FRA\n\ ,VT,Grand Isle,GRA\n\ ,VT,Lamoille,LAM\n\ ,VT,Orange,ORA\n\ ,VT,Orleans,ORL\n\ ,VT,Rutland,RUT\n\ ,VT,Washington,WAS\n\ ,VT,Windham,WNH\n\ ,VT,Windsor,WNS\n\ Virginia,VA,Accomack,ACC\n\ ,VA,Albemarle,ALB\n\ ,VA,Alexandria,ALX\n\ ,VA,Alleghany,ALL\n\ ,VA,Amelia,AME\n\ ,VA,Amherst,AMH\n\ ,VA,Appomattox,APP\n\ ,VA,Arlington,ARL\n\ ,VA,Augusta,AUG\n\ ,VA,Bath,BAT\n\ ,VA,Bedford,BED\n\ ,VA,Bland,BLA\n\ ,VA,Botetourt,BOT\n\ ,VA,Bristol,BRX\n\ ,VA,Brunswick,BRU\n\ ,VA,Buchanan,BCH\n\ ,VA,Buckingham,BHM\n\ ,VA,Buena Vista,BVX\n\ ,VA,Campbell,CAM\n\ ,VA,Caroline,CLN\n\ ,VA,Carroll,CRL\n\ ,VA,Charles City,CCY\n\ ,VA,Charlotte,CHA\n\ ,VA,Charlottesville,CHX\n\ ,VA,Chesapeake,CPX\n\ ,VA,Chesterfield,CHE\n\ ,VA,Clarke,CLA\n\ ,VA,Colonial Heights,COX\n\ ,VA,Covington,CVX\n\ ,VA,Craig,CRA\n\ ,VA,Culpeper,CUL\n\ ,VA,Cumberland,CUM\n\ ,VA,Danville,DAX\n\ ,VA,Dickenson,DIC\n\ ,VA,Dinwiddie,DIN\n\ ,VA,Emporia,EMX\n\ ,VA,Essex,ESS\n\ ,VA,Fairfax,FFX\n\ ,VA,Fairfax City,FXX\n\ ,VA,Falls Church,FCX\n\ ,VA,Fauquier,FAU\n\ ,VA,Floyd,FLO\n\ ,VA,Fluvanna,FLU\n\ ,VA,Franklin,FRA\n\ ,VA,Franklin City,FRX\n\ ,VA,Frederick,FRE\n\ ,VA,Fredericksburg,FBX\n\ ,VA,Galax,GAX\n\ ,VA,Giles,GIL\n\ ,VA,Gloucester,GLO\n\ ,VA,Goochland,GOO\n\ ,VA,Grayson,GRA\n\ ,VA,Greene,GRN\n\ ,VA,Greensville,GVL\n\ ,VA,Halifax,HAL\n\ ,VA,Hampton,HAX\n\ ,VA,Hanover,HAN\n\ ,VA,Harrisonburg,HBX\n\ ,VA,Henrico,HCO\n\ ,VA,Henry,HRY\n\ ,VA,Highland,HIG\n\ ,VA,Hopewell,HOX\n\ ,VA,Isle of Wight,IOW\n\ ,VA,James City,JAM\n\ ,VA,King and Queen,KQN\n\ ,VA,King George,KGE\n\ ,VA,King William,KWM\n\ ,VA,Lancaster,LAN\n\ ,VA,Lee,LEE\n\ ,VA,Lexington,LEX\n\ ,VA,Loudoun,LDN\n\ ,VA,Louisa,LSA\n\ ,VA,Lunenburg,LUN\n\ ,VA,Lynchburg,LYX\n\ ,VA,Madison,MAD\n\ ,VA,Manassas,MAX\n\ ,VA,Manassas Park,MPX\n\ ,VA,Martinsville,MVX\n\ ,VA,Mathews,MAT\n\ ,VA,Mecklenburg,MEC\n\ ,VA,Middlesex,MID\n\ ,VA,Montgomery,MON\n\ ,VA,Nelson,NEL\n\ ,VA,New Kent,NEW\n\ ,VA,Newport News,NNX\n\ ,VA,Norfolk,NFX\n\ ,VA,Northampton,NHA\n\ ,VA,Northumberland,NUM\n\ ,VA,Norton,NRX\n\ ,VA,Nottoway,NOT\n\ ,VA,Orange,ORG\n\ ,VA,Page,PAG\n\ ,VA,Patrick,PAT\n\ ,VA,Petersburg,PBX\n\ ,VA,Pittsylvania,PIT\n\ ,VA,Poquoson,PQX\n\ ,VA,Portsmouth,POX\n\ ,VA,Powhatan,POW\n\ ,VA,Prince Edward,PRE\n\ ,VA,Prince George,PRG\n\ ,VA,Prince William,PRW\n\ ,VA,Pulaski,PUL\n\ ,VA,Radford,RAX\n\ ,VA,Rappahannock,RAP\n\ ,VA,Richmond,RIC\n\ ,VA,Richmond City,RIX\n\ ,VA,Roanoke,ROA\n\ ,VA,Roanoke City,ROX\n\ ,VA,Rockbridge,RBR\n\ ,VA,Rockingham,RHM\n\ ,VA,Russell,RUS\n\ ,VA,Salem,SAX\n\ ,VA,Scott,SCO\n\ ,VA,Shenandoah,SHE\n\ ,VA,Smyth,SMY\n\ ,VA,Southampton,SHA\n\ ,VA,Spotsylvania,SPO\n\ ,VA,Stafford,STA\n\ ,VA,Staunton,STX\n\ ,VA,Suffolk,SUX\n\ ,VA,Surry,SUR\n\ ,VA,Sussex,SUS\n\ ,VA,Tazewell,TAZ\n\ ,VA,Virginia Beach,VBX\n\ ,VA,Warren,WAR\n\ ,VA,Washington,WAS\n\ ,VA,Waynesboro,WAX\n\ ,VA,Westmoreland,WES\n\ ,VA,Williamsburg,WMX\n\ ,VA,Winchester,WIX\n\ ,VA,Wise,WIS\n\ ,VA,Wythe,WYT\n\ ,VA,York,YOR\n\ U.S. Virgin Islands,VI,St. Croix Island,\n\ ,VI,St. John Island,\n\ ,VI,St. Thomas Island,\n\ Washington,WA,Adams,ADA\n\ ,WA,Asotin,ASO\n\ ,WA,Benton,BEN\n\ ,WA,Chelan,CHE\n\ ,WA,Clallam,CLAL\n\ ,WA,Clark,CLAR\n\ ,WA,Columbia,COL\n\ ,WA,Cowlitz,COW\n\ ,WA,Douglas,DOU\n\ ,WA,Ferry,FER\n\ ,WA,Franklin,FRA\n\ ,WA,Garfield,GAR\n\ ,WA,Grant,GRAN\n\ ,WA,Grays Harbor,GRAY\n\ ,WA,Island,ISL\n\ ,WA,Jefferson,JEFF\n\ ,WA,King,KING\n\ ,WA,Kitsap,KITS\n\ ,WA,Kittitas,KITT\n\ ,WA,Klickitat,KLI\n\ ,WA,Lewis,LEW\n\ ,WA,Lincoln,LIN\n\ ,WA,Mason,MAS\n\ ,WA,Okanogan,OKA\n\ ,WA,Pacific,PAC\n\ ,WA,Pend Oreille,PEND\n\ ,WA,Pierce,PIE\n\ ,WA,San Juan,SAN\n\ ,WA,Skagit,SKAG\n\ ,WA,Skamania,SKAM\n\ ,WA,Snohomish,SNO\n\ ,WA,Spokane,SPO\n\ ,WA,Stevens,STE\n\ ,WA,Thurston,THU\n\ ,WA,Wahkiakum,WAH\n\ ,WA,Walla Walla,WAL\n\ ,WA,Whatcom,WHA\n\ ,WA,Whitman,WHI\n\ ,WA,Yakima,YAK\n\ Wisconsin,WI,Adams,ADA\n\ ,WI,Ashland,ASH\n\ ,WI,Barron,BAR\n\ ,WI,Bayfield,BAY\n\ ,WI,Brown,BRO\n\ ,WI,Buffalo,BUF\n\ ,WI,Burnett,BUR\n\ ,WI,Calumet,CAL\n\ ,WI,Chippewa,CHI\n\ ,WI,Clark,CLA\n\ ,WI,Columbia,COL\n\ ,WI,Crawford,CRA\n\ ,WI,Dane,DAN\n\ ,WI,Dodge,DOD\n\ ,WI,Door,DOO\n\ ,WI,Douglas,DOU\n\ ,WI,Dunn,DUN\n\ ,WI,Eau Claire,EAU\n\ ,WI,Florence,FLO\n\ ,WI,Fond du Lac,FON\n\ ,WI,Forest,FOR\n\ ,WI,Grant,GRA\n\ ,WI,Green,GRE\n\ ,WI,Green Lake,GRL\n\ ,WI,Iowa,IOW\n\ ,WI,Iron,IRO\n\ ,WI,Jackson,JAC\n\ ,WI,Jefferson,JEF\n\ ,WI,Juneau,JUN\n\ ,WI,Kenosha,KEN\n\ ,WI,Kewaunee,KEW\n\ ,WI,La Crosse,LAC\n\ ,WI,Lafayette,LAF\n\ ,WI,Langlade,LAN\n\ ,WI,Lincoln,LIN\n\ ,WI,Manitowoc,MAN\n\ ,WI,Marathon,MAR\n\ ,WI,Marinette,MRN\n\ ,WI,Marquette,MRQ\n\ ,WI,Menominee,MEN\n\ ,WI,Milwaukee,MIL\n\ ,WI,Monroe,MON\n\ ,WI,Oconto,OCO\n\ ,WI,Oneida,ONE\n\ ,WI,Outagamie,OUT\n\ ,WI,Ozaukee,OZA\n\ ,WI,Pepin,PEP\n\ ,WI,Pierce,PIE\n\ ,WI,Polk,POL\n\ ,WI,Portage,POR\n\ ,WI,Price,PRI\n\ ,WI,Racine,RAC\n\ ,WI,Richland,RIC\n\ ,WI,Rock,ROC\n\ ,WI,Rusk,RUS\n\ ,WI,Sauk,SAU\n\ ,WI,Sawyer,SAW\n\ ,WI,Shawano,SHA\n\ ,WI,Sheboygan,SHE\n\ ,WI,St. Croix,STC\n\ ,WI,Taylor,TAY\n\ ,WI,Trempealeau,TRE\n\ ,WI,Vernon,VER\n\ ,WI,Vilas,VIL\n\ ,WI,Walworth,WAL\n\ ,WI,Washburn,WSB\n\ ,WI,Washington,WAS\n\ ,WI,Waukesha,WAU\n\ ,WI,Waupaca,WAP\n\ ,WI,Waushara,WSR\n\ ,WI,Winnebago,WIN\n\ ,WI,Wood,WOO\n\ West Virginia,WV,Barbour,BAR\n\ ,WV,Berkeley,BER\n\ ,WV,Boone,BOO\n\ ,WV,Braxton,BRA\n\ ,WV,Brooke,BRO\n\ ,WV,Cabell,CAB\n\ ,WV,Calhoun,CAL\n\ ,WV,Clay,CLA\n\ ,WV,Doddridge,DOD\n\ ,WV,Fayette,FAY\n\ ,WV,Gilmer,GIL\n\ ,WV,Grant,GRA\n\ ,WV,Greenbrier,GRE\n\ ,WV,Hampshire,HAM\n\ ,WV,Hancock,HAN\n\ ,WV,Hardy,HDY\n\ ,WV,Harrison,HAR\n\ ,WV,Jackson,JAC\n\ ,WV,Jefferson,JEF\n\ ,WV,Kanawha,KAN\n\ ,WV,Lewis,LEW\n\ ,WV,Lincoln,LIN\n\ ,WV,Logan,LOG\n\ ,WV,Marion,MRN\n\ ,WV,Marshall,MAR\n\ ,WV,Mason,MAS\n\ ,WV,McDowell,MCD\n\ ,WV,Mercer,MER\n\ ,WV,Mineral,MIN\n\ ,WV,Mingo,MGO\n\ ,WV,Monongalia,MON\n\ ,WV,Monroe,MRO\n\ ,WV,Morgan,MOR\n\ ,WV,Nicholas,NIC\n\ ,WV,Ohio,OHI\n\ ,WV,Pendleton,PEN\n\ ,WV,Pleasants,PLE\n\ ,WV,Pocahontas,POC\n\ ,WV,Preston,PRE\n\ ,WV,Putnam,PUT\n\ ,WV,Raleigh,RAL\n\ ,WV,Randolph,RAN\n\ ,WV,Ritchie,RIT\n\ ,WV,Roane,ROA\n\ ,WV,Summers,SUM\n\ ,WV,Taylor,TAY\n\ ,WV,Tucker,TUC\n\ ,WV,Tyler,TYL\n\ ,WV,Upshur,UPS\n\ ,WV,Wayne,WAY\n\ ,WV,Webster,WEB\n\ ,WV,Wetzel,WET\n\ ,WV,Wirt,WIR\n\ ,WV,Wood,WOO\n\ ,WV,Wyoming,WYO\n\ Wyoming,WY,Albany,ALB\n\ ,WY,Big Horn,BIG\n\ ,WY,Campbell,CAM\n\ ,WY,Carbon,CAR\n\ ,WY,Converse,CON\n\ ,WY,Crook,CRO\n\ ,WY,Fremont,FRE\n\ ,WY,Goshen,GOS\n\ ,WY,Hot Springs,HOT\n\ ,WY,Johnson,JOH\n\ ,WY,Laramie,LAR\n\ ,WY,Lincoln,LIN\n\ ,WY,Natrona,NAT\n\ ,WY,Niobrara,NIO\n\ ,WY,Park,PAR\n\ ,WY,Platte,PLA\n\ ,WY,Sheridan,SHE\n\ ,WY,Sublette,SUB\n\ ,WY,Sweetwater,SWE\n\ ,WY,Teton,TET\n\ ,WY,Uinta,UIN\n\ ,WY,Washakie,WAS\n\ ,WY,Weston,WES\n\ Yukon,YT,Carmacks,\n\ ,YT,Dawson,\n\ ,YT,Faro,\n\ ,YT,Haines Junction,\n\ ,YT,Mayo,\n\ ,YT,Teslin,\n\ ,YT,Watson Lake,\n\ ,YT,Whitehorse,\n\ United Kingdom,UK,Alderney,ALD\n\ ,UK,County Antrim,ATM\n\ ,UK,County Armagh,ARM\n\ ,UK,Avon,AVN\n\ ,UK,Bedfordshire,BFD\n\ ,UK,Berkshire,BRK,\n\ ,UK,Borders,BDS\n\ ,UK,Buckinghamshire,BUX\n\ ,UK,Cambridgeshire,CBE\n\ ,UK,Central,CTR\n\ ,UK,Cheshire,CHS\n\ ,UK,Cleveland,CVE\n\ ,UK,Clwyd,CLD\n\ ,UK,Cornwall,CNL\n\ ,UK,Cumbria,CBA\n\ ,UK,Derbyshire,DYS\n\ ,UK,Devon,DVN\n\ ,UK,Dorse,DOR\n\ ,UK,County Down,DWN\n\ ,UK,Dumfries and Galloway,DGL\n\ ,UK,County Durham,DHM\n\ ,UK,Dyfed,DFD\n\ ,UK,Essex,ESX\n\ ,UK,County Fermanagh,FMH\n\ ,UK,Fife,FFE\n\ ,UK,Mid Glamorgan,GNM\n\ ,UK,South Glamorgan,GNS\n\ ,UK,West Glamorgan,GNW\n\ ,UK,Gloucester,GLR\n\ ,UK,Grampian,GRN\n\ ,UK,Guernsey,GUR\n\ ,UK,Gwent,GWT\n\ ,UK,Gwynedd,GDD\n\ ,UK,Hampshire,HPH\n\ ,UK,Hereford and Worcester,HWR\n\ ,UK,Hertfordshire,HFD\n\ ,UK,Highlands,HLD\n\ ,UK,Humberside,HBS\n\ ,UK,Isle of Man,IOM\n\ ,UK,Isle of Wight,IOW\n\ ,UK,Jersey,JER\n\ ,UK,Kent,KNT\n\ ,UK,Lancashire,LNH\n\ ,UK,Leicestershire,LEC\n\ ,UK,Lincolnshire,LCN\n\ ,UK,Greater London,LDN\n\ ,UK,County Londonderry,LDR\n\ ,UK,Lothian,LTH\n\ ,UK,Greater Manchester,MCH\n\ ,UK,Merseyside,MSY\n\ ,UK,Norfolk,NOR\n\ ,UK,Northamptonshire,NHM\n\ ,UK,Northumberland,NLD\n\ ,UK,Nottinghamshire,NOT\n\ ,UK,Orkney,ORK\n\ ,UK,Oxfordshire,OFE\n\ ,UK,Powys,PWS\n\ ,UK,Shropshire,SPE\n\ ,UK,Sark,SRK\n\ ,UK,Shetland,SLD\n\ ,UK,Somerset,SOM\n\ ,UK,Staffordshire,SFD\n\ ,UK,Strathclyde,SCD\n\ ,UK,Suffolk,SFK\n\ ,UK,Surrey,SRY\n\ ,UK,East Sussex,SXE\n\ ,UK,West Sussex,SXW\n\ ,UK,Tayside,TYS\n\ ,UK,Tyne and Wear,TWR\n\ ,UK,County Tyrone,TYR\n\ ,UK,Warwickshire,WKS\n\ ,UK,Western Isles,WIL\n\ ,UK,West Midlands,WMD\n\ ,UK,Wiltshire,WLT\n\ ,UK,North Yorkshire,YSN\n\ ,UK,South Yorkshire,YSS\n\ ,UK,West Yorkshire,YSW"; //std::string strNEQP const char *szNEQP = "\ State, ST, County/City, CC\n\ Connecticut,CT,Fairfield,FAICT\n\ ,CT,Hartford,HARCT\n\ ,CT,Litchfield,LITCT\n\ ,CT,Middlesex,MIDCT\n\ ,CT,New Haven,NHVCT\n\ ,CT,New London,NLNCT\n\ ,CT,Tolland,TOLCT\n\ ,CT,Windham,WINCT\n\ Massechusetts,MA,Barnstable,BARMA\n\ ,MA,Berkshire,BERMA\n\ ,MA,Bristol,BRIMA\n\ ,MA,Dukes,DUKMA\n\ ,MA,Essex,ESSMA\n\ ,MA,Franklin,FRAMA\n\ ,MA,Hampden,HMDMA\n\ ,MA,Hampshire,HMPMA\n\ ,MA,Middlesex,MIDMA\n\ ,MA,Nantucket,NANMA\n\ ,MA,Norfolk,NORMA\n\ ,MA,Plymouth,PLYMA\n\ ,MA,Suffolk,SUFMA\n\ ,MA,Worcester,WORMA\n\ Maine,ME,Androscoggin,ANDME\n\ ,ME,Aroostook,AROME\n\ ,ME,Cumberland,CUMME\n\ ,ME,Franklin,FRAME\n\ ,ME,Hancock,HANME\n\ ,ME,Kennebec,KENME\n\ ,ME,Knox,KNOME\n\ ,ME,Lincoln,LINME\n\ ,ME,Oxford,OXFME\n\ ,ME,Penobscot,PENME\n\ ,ME,Piscataquis,PISME\n\ ,ME,Sagadahoc,SAGME\n\ ,ME,Somerset,SOMME\n\ ,ME,Waldo,WALME\n\ ,ME,Washington,WASME\n\ ,ME,York,YORME\n\ New Hampshire,NH,Belknap,BELNH\n\ ,NH,Carroll,CARNH\n\ ,NH,Cheshire,CHENH\n\ ,NH,Coos,COONH\n\ ,NH,Grafton,GRANH\n\ ,NH,Hillsborough,HILNH\n\ ,NH,Merrimack,MERNH\n\ ,NH,Rockingham,ROCNH\n\ ,NH,Strafford,STRNH\n\ ,NH,Sullivan,SULNH\n\ Rhode Island,RI,Bristol,BRIRI\n\ ,RI,Kent,KENRI\n\ ,RI,Newport,NEWRI\n\ ,RI,Providence,PRORI\n\ ,RI,Washington,WASRI\n\ Vermont,VT,Addison,ADDVT\n\ ,VT,Bennington,BENVT\n\ ,VT,Caledonia,CALVT\n\ ,VT,Chittenden,CHIVT\n\ ,VT,Essex,ESSVT\n\ ,VT,Franklin,FRAVT\n\ ,VT,Grand Isle,GRAVT\n\ ,VT,Lamoille,LAMVT\n\ ,VT,Orange,ORAVT\n\ ,VT,Orleans,ORLVT\n\ ,VT,Rutland,RUTVT\n\ ,VT,Washington,WASVT\n\ ,VT,Windham,WNHVT\n\ ,VT,Windsor,WNDVT\n"; //std::string str7QP const char *sz7QP = "\ State, ST, County/City, CC\n\ Arizona,AZ,Apache,AZAPH\n\ ,AZ,Cochise,AZCHS\n\ ,AZ,Coconino,AZCNO\n\ ,AZ,Gila,AZGLA\n\ ,AZ,Graham,AZGHM\n\ ,AZ,Greenlee,AZGLE\n\ ,AZ,La Paz,AZLPZ\n\ ,AZ,Maricopa,AZMCP\n\ ,AZ,Mohave,AZMHV\n\ ,AZ,Navajo,AZNVO\n\ ,AZ,Pima,AZPMA\n\ ,AZ,Pinal,AZPNL\n\ ,AZ,Santa Cruz,AZSCZ\n\ ,AZ,Yavapai,AZYVP\n\ ,AZ,Yuma,AZYMA\n\ Idaho,ID,Ada,IDADA\n\ ,ID,Adams,IDADM\n\ ,ID,Bannock,IDBAN\n\ ,ID,Bear Lake,IDBEA\n\ ,ID,Benewah,IDBEN\n\ ,ID,Bingham,IDBIN\n\ ,ID,Blaine,IDBLA\n\ ,ID,Boise,IDBOI\n\ ,ID,Bonner,IDBNR\n\ ,ID,Bonneville,IDBNV\n\ ,ID,Boundary,IDBOU\n\ ,ID,Butte,IDBUT\n\ ,ID,Camas,IDCAM\n\ ,ID,Canyon,IDCAN\n\ ,ID,Caribou,IDCAR\n\ ,ID,Cassia,IDCAS\n\ ,ID,Clark,IDCLA\n\ ,ID,Clearwater,IDCLE\n\ ,ID,Custer,IDCUS\n\ ,ID,Elmore,IDELM\n\ ,ID,Franklin,IDFRA\n\ ,ID,Fremont,IDFRE\n\ ,ID,Gem,IDGEM\n\ ,ID,Gooding,IDGOO\n\ ,ID,Idaho,IDIDA\n\ ,ID,Jefferson,IDJEF\n\ ,ID,Jerome,IDJER\n\ ,ID,Kootenai,IDKOO\n\ ,ID,Latah,IDLAT\n\ ,ID,Lemhi,IDLEM\n\ ,ID,Lewis,IDLEW\n\ ,ID,Lincoln,IDLIN\n\ ,ID,Madison,IDMAD\n\ ,ID,Minidoka,IDMIN\n\ ,ID,Nez Perce,IDNEZ\n\ ,ID,Oneida,IDONE\n\ ,ID,Owyhee,IDOWY\n\ ,ID,Payette,IDPAY\n\ ,ID,Power,IDPOW\n\ ,ID,Shoshone,IDSHO\n\ ,ID,Teton,IDTET\n\ ,ID,Twin Falls,IDTWI\n\ ,ID,Valley,IDVAL\n\ ,ID,Washington,IDWAS\n\ Montana,MT,Beaverhead,MTBEA\n\ ,MT,Big Horn,MTBIG\n\ ,MT,Blaine,MTBLA\n\ ,MT,Broadwater,MTBRO\n\ ,MT,Carbon,MTCRB\n\ ,MT,Carter,MTCRT\n\ ,MT,Cascade,MTCAS\n\ ,MT,Chouteau,MTCHO\n\ ,MT,Custer,MTCUS\n\ ,MT,Daniels,MTDAN\n\ ,MT,Dawson,MTDAW\n\ ,MT,Deer Lodge,MTDEE\n\ ,MT,Fallon,MTFAL\n\ ,MT,Fergus,MTFER\n\ ,MT,Flathead,MTFLA\n\ ,MT,Gallatin,MTGAL\n\ ,MT,Garfield,MTGAR\n\ ,MT,Glacier,MTGLA\n\ ,MT,Golden Valley,MTGOL\n\ ,MT,Granite,MTGRA\n\ ,MT,Hill,MTHIL\n\ ,MT,Jefferson,MTJEF\n\ ,MT,Judith Basin,MTJUD\n\ ,MT,Lake,MTLAK\n\ ,MT,Lewis & Clark,MTLEW\n\ ,MT,Liberty,MTLIB\n\ ,MT,Lincoln,MTLIN\n\ ,MT,Madison,MTMAD\n\ ,MT,McCone,MTMCC\n\ ,MT,Meagher,MTMEA\n\ ,MT,Mineral,MTMIN\n\ ,MT,Missoula,MTMIS\n\ ,MT,Musselshell,MTMUS\n\ ,MT,Park,MTPAR\n\ ,MT,Petroleum,MTPET\n\ ,MT,Phillips,MTPHI\n\ ,MT,Pondera,MTPON\n\ ,MT,Powder River,MTPWD\n\ ,MT,Powell,MTPWL\n\ ,MT,Prairie,MTPRA\n\ ,MT,Ravalli,MTRAV\n\ ,MT,Richland,MTRIC\n\ ,MT,Roosevelt,MTROO\n\ ,MT,Rosebud,MTROS\n\ ,MT,Sanders,MTSAN\n\ ,MT,Sheridan,MTSHE\n\ ,MT,Silver Bow,MTSIL\n\ ,MT,Stillwater,MTSTI\n\ ,MT,Sweet Grass,MTSWE\n\ ,MT,Teton,MTTET\n\ ,MT,Toole,MTTOO\n\ ,MT,Treasure,MTTRE\n\ ,MT,Valley,MTVAL\n\ ,MT,Wheatland,MTWHE\n\ ,MT,Wibaux,MTWIB\n\ ,MT,Yellowstone,MTYEL\n\ Nevada,NV,Carson City,NVCAR\n\ ,NV,Churchill,NVCHU\n\ ,NV,Clark,NVCLA\n\ ,NV,Douglas,NVDOU\n\ ,NV,Elko,NVELK\n\ ,NV,Esmeralda,NVESM\n\ ,NV,Eureka,NVEUR\n\ ,NV,Humboldt,NVHUM\n\ ,NV,Lander,NVLAN\n\ ,NV,Lincoln,NVLIN\n\ ,NV,Lyon,NVLYO\n\ ,NV,Mineral,NVMIN\n\ ,NV,Nye,NVNYE\n\ ,NV,Pershing,NVPER\n\ ,NV,Storey,NVSTO\n\ ,NV,Washoe,NVWAS\n\ ,NV,White Pine,NVWHI\n\ Oregon,OR,Baker,ORBAK\n\ ,OR,Benton,ORBEN\n\ ,OR,Clackamas,ORCLK\n\ ,OR,Clatsop,ORCLT\n\ ,OR,Columbia,ORCOL\n\ ,OR,Coos,ORCOO\n\ ,OR,Crook,ORCRO\n\ ,OR,Curry,ORCUR\n\ ,OR,Deschutes,ORDES\n\ ,OR,Douglas,ORDOU\n\ ,OR,Gilliam,ORGIL\n\ ,OR,Grant,ORGRA\n\ ,OR,Harney,ORHAR\n\ ,OR,Hood River,ORHOO\n\ ,OR,Jackson,ORJAC\n\ ,OR,Jefferson,ORJEF\n\ ,OR,Josephine,ORJOS\n\ ,OR,Klamath,ORKLA\n\ ,OR,Lake,ORLAK\n\ ,OR,Lane,ORLAN\n\ ,OR,Lincoln,ORLCN\n\ ,OR,Linn,ORLNN\n\ ,OR,Malheur,ORMAL\n\ ,OR,Marion,ORMAR\n\ ,OR,Morrow,ORMOR\n\ ,OR,Multnomah,ORMUL\n\ ,OR,Polk,ORPOL\n\ ,OR,Sherman,ORSHE\n\ ,OR,Tillamook,ORTIL\n\ ,OR,Umatilla,ORUMA\n\ ,OR,Union,ORUNI\n\ ,OR,Wallowa,ORWAL\n\ ,OR,Wasco,ORWCO\n\ ,OR,Washington,ORWSH\n\ ,OR,Wheeler,ORWHE\n\ ,OR,Yamhill,ORYAM\n\ Utah,UT,Beaver,UTBEA\n\ ,UT,Box Elder,UTBOX\n\ ,UT,Cache,UTCAC\n\ ,UT,Carbon,UTCAR\n\ ,UT,Daggett,UTDAG\n\ ,UT,Davis,UTDAV\n\ ,UT,Duchesne,UTDUC\n\ ,UT,Emery,UTEME\n\ ,UT,Garfield,UTGAR\n\ ,UT,Grand,UTGRA\n\ ,UT,Iron,UTIRO\n\ ,UT,Juab,UTJUA\n\ ,UT,Kane,UTKAN\n\ ,UT,Millard,UTMIL\n\ ,UT,Morgan,UTMOR\n\ ,UT,Piute,UTPIU\n\ ,UT,Rich,UTRIC\n\ ,UT,Salt Lake,UTSAL\n\ ,UT,San Juan,UTSNJ\n\ ,UT,Sanpete,UTSNP\n\ ,UT,Sevier,UTSEV\n\ ,UT,Summit,UTSUM\n\ ,UT,Tooele,UTTOO\n\ ,UT,Uintah,UTUIN\n\ ,UT,Utah,UTUTA\n\ ,UT,Wasatch,UTWST\n\ ,UT,Washington,UTWSH\n\ ,UT,Wayne,UTWAY\n\ ,UT,Weber,UTWEB\n\ Washington,WA,Adams,WAADA\n\ ,WA,Asotin,WAASO\n\ ,WA,Benton,WABEN\n\ ,WA,Chelan,WACHE\n\ ,WA,Clallam,WACLL\n\ ,WA,Clark,WACLR\n\ ,WA,Columbia,WACOL\n\ ,WA,Cowlitz,WACOW\n\ ,WA,Douglas,WADOU\n\ ,WA,Ferry,WAFER\n\ ,WA,Franklin,WAFRA\n\ ,WA,Garfield,WAGAR\n\ ,WA,Grant,WAGRN\n\ ,WA,Grays Harbor,WAGRY\n\ ,WA,Island,WAISL\n\ ,WA,Jefferson,WAJEF\n\ ,WA,Klickitat,WAKLI\n\ ,WA,King,WAKNG\n\ ,WA,Kitsap,WAKTP\n\ ,WA,Kittitas,WAKTT\n\ ,WA,Lewis,WALEW\n\ ,WA,Lincoln,WALIN\n\ ,WA,Mason,WAMAS\n\ ,WA,Okanogan,WAOKA\n\ ,WA,Pacific,WAPAC\n\ ,WA,Pend Oreille,WAPEN\n\ ,WA,Pierce,WAPIE\n\ ,WA,San Juan,WASAN\n\ ,WA,Skagit,WASKG\n\ ,WA,Skamania,WASKM\n\ ,WA,Snohomish,WASNO\n\ ,WA,Spokane,WASPO\n\ ,WA,Stevens,WASTE\n\ ,WA,Thurston,WATHU\n\ ,WA,Wahkiakum,WAWAH\n\ ,WA,Walla Walla,WAWAL\n\ ,WA,Whatcom,WAWHA\n\ ,WA,Whitman,WAWHI\n\ ,WA,Yakima,WAYAK\n\ Wyoming,WY,Albany,WYALB\n\ ,WY,Big Horn,WYBIG\n\ ,WY,Campbell,WYCAM\n\ ,WY,Carbon,WYCAR\n\ ,WY,Converse,WYCON\n\ ,WY,Crook,WYCRO\n\ ,WY,Fremont,WYFRE\n\ ,WY,Goshen,WYGOS\n\ ,WY,Hot Springs,WYHOT\n\ ,WY,Johnson,WYJOH\n\ ,WY,Laramie,WYLAR\n\ ,WY,Lincoln,WYLIN\n\ ,WY,Natrona,WYNAT\n\ ,WY,Niobrara,WYNIO\n\ ,WY,Park,WYPAR\n\ ,WY,Platte,WYPLA\n\ ,WY,Sheridan,WYSHE\n\ ,WY,Sublette,WYSUB\n\ ,WY,Sweetwater,WYSWE\n\ ,WY,Teton,WYTET\n\ ,WY,Uinta,WYUIN\n\ ,WY,Washakie,WYWAS\n\ ,WY,Weston,WYWES"; fldigi-4.2.05/src/logbook/textio.cxx0000664000175000017500000004202714611711171014253 00000000000000// ---------------------------------------------------------------------------- // textio.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "textio.h" #include "lgbook.h" #include "globals.h" #ifdef __WOE32__ static const char *szEOL = "\r\n"; #else static const char *szEOL = "\n"; #endif char * cTextFile::adif_to_date( char *s) { static char date[9]; strcpy(date, " / / "); for (int i = 0; i < 2; i++) { date[i+6] = s[i+2]; date[i] = s[i+4]; date[i+3] = s[i+6]; } return date; } char * cTextFile::adif_to_time( char *s) { static char time[6]; strcpy(time, " : "); for (int i = 0; i < 2; i++) { time[i] = s[i]; time[i+3] = s[i+2]; } return time; } void cTextFile::writeCSVHeader(FILE *txtFile) { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "%s", "\"DATE_ON\""); if (btnSelectQSOdateOff->value())fprintf (txtFile, "%s", ",\"DATE_OFF\""); if (btnSelectTimeON->value()) fprintf (txtFile, "%s", ",\"ON\""); if (btnSelectTimeOFF->value()) fprintf (txtFile, "%s", ",\"OFF\""); if (btnSelectCall->value()) fprintf (txtFile, "%s", ",\"CALL\""); if (btnSelectName->value()) fprintf (txtFile, "%s", ",\"NAME\""); if (btnSelectBand->value()) fprintf (txtFile, "%s", ",\"BAND\""); if (btnSelectFreq->value()) fprintf (txtFile, "%s", ",\"FREQ\""); if (btnSelectMode->value()) fprintf (txtFile, "%s", ",\"MODE\""); if (btnSelectTX_pwr->value()) fprintf (txtFile, "%s", ",\"TX_PWR\""); if (btnSelectRSTsent->value()) fprintf (txtFile, "%s", ",\"RSTSENT\""); if (btnSelectRSTrcvd->value()) fprintf (txtFile, "%s", ",\"RSTRCVD\""); if (btnSelectQth->value()) fprintf (txtFile, "%s", ",\"QTH\""); if (btnSelectState->value()) fprintf (txtFile, "%s", ",\"ST\""); if (btnSelectProvince->value()) fprintf (txtFile, "%s", ",\"PR\""); if (btnSelectCNTY->value()) fprintf (txtFile, "%s", ",\"CNTY\""); if (btnSelectCountry->value()) fprintf (txtFile, "%s", ",\"CNTRY\""); if (btnSelectDXCC->value()) fprintf (txtFile, "%s", ",\"DXCC\""); if (btnSelectCQZ->value()) fprintf (txtFile, "%s", ",\"CQZONE\""); if (btnSelectIOTA->value()) fprintf (txtFile, "%s", ",\"IOTA\""); if (btnSelectCONT->value()) fprintf (txtFile, "%s", ",\"CONT\""); if (btnSelectITUZ->value()) fprintf (txtFile, "%s", ",\"ITUZ\""); if (btnSelectLOC->value()) fprintf (txtFile, "%s", ",\"GRIDSQUARE\""); if (btnSelectQSLrcvd->value()) fprintf (txtFile, "%s", ",\"QSL_RCVD\""); if (btnSelectQSLsent->value()) fprintf (txtFile, "%s", ",\"QSL_SENT\""); if (btnSelecteQSLrcvd->value()) fprintf (txtFile, "%s", ",\"EQSL_RCVD\""); if (btnSelecteQSLsent->value()) fprintf (txtFile, "%s", ",\"EQSL_SENT\""); if (btnSelectLOTWrcvd->value()) fprintf (txtFile, "%s", ",\"LOTW_RCVD\""); if (btnSelectLOTWsent->value()) fprintf (txtFile, "%s", ",\"LOTW_SENT\""); if (btnSelectNotes->value()) fprintf (txtFile, "%s", ",\"NOTES\""); if (btnSelectSerialIN->value()) fprintf (txtFile, "%s", ",\"SERIAL RCVD\""); if (btnSelectSerialOUT->value()) fprintf (txtFile, "%s", ",\"SERIAL_SENT\""); if (btnSelectXchgIn->value()) fprintf (txtFile, "%s", ",\"XCHG1\""); if (btnSelectMyXchg->value()) fprintf (txtFile, "%s", ",\"MYXCHG\""); if (btnSelectClass->value()) fprintf (txtFile, "%s", ",\"CLASS\""); if (btnSelectSection->value()) fprintf (txtFile, "%s", ",\"ARRl_SECT\""); if (btnSelectOperator->value()) fprintf (txtFile, "%s", ",\"OPER\""); if (btnSelectStaCall->value()) fprintf (txtFile, "%s", ",\"STA_CALL\""); if (btnSelectStaGrid->value()) fprintf (txtFile, "%s", ",\"STA_GRID\""); if (btnSelectStaCity->value()) fprintf (txtFile, "%s", ",\"STA_CITY\""); if (btnSelectCheck->value()) fprintf (txtFile, "%s", ",\"CHECK\""); if (btnSelectAge->value()) fprintf (txtFile, "%s", ",\"AGE\""); if (btnSelect_1010->value()) fprintf (txtFile, "%s", ",\"10-10\""); fprintf (txtFile, "%s", szEOL); } int cTextFile::writeCSVFile (const char *fname, cQsoDb *db) { cQsoRec *pRec = (cQsoRec *)0; FILE *txtFile = fl_fopen (fname, "w"); if (!txtFile) return 1; if (txtFile) { writeCSVHeader(txtFile); for (int i = 0; i < db->nbrRecs(); i++) { pRec = db->getRec(i); if (pRec->getField(EXPORT)[0] == 'E') { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "\"%s\"", pRec->getField(QSO_DATE)); if (btnSelectQSOdateOff->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QSO_DATE_OFF)); if (btnSelectTimeON->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TIME_ON)); if (btnSelectTimeOFF->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TIME_OFF)); if (btnSelectCall->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CALL)); if (btnSelectName->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(NAME)); if (btnSelectBand->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(BAND)); if (btnSelectFreq->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(FREQ)); if (btnSelectMode->value()) { if (!adif2submode(pRec->getField(ADIF_MODE)).empty()) fprintf (txtFile, ",\"%s\"", adif2submode(pRec->getField(ADIF_MODE)).c_str()); else fprintf (txtFile, ",\"%s\"", adif2export(pRec->getField(ADIF_MODE)).c_str()); } if (btnSelectTX_pwr->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TX_PWR)); if (btnSelectRSTsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(RST_SENT)); if (btnSelectRSTrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(RST_RCVD)); if (btnSelectQth->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QTH)); if (btnSelectState->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(STATE)); if (btnSelectProvince->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(VE_PROV)); if (btnSelectCNTY->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CNTY)); if (btnSelectCountry->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(COUNTRY)); if (btnSelectDXCC->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(DXCC)); if (btnSelectCQZ->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CQZ)); if (btnSelectIOTA->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(IOTA)); if (btnSelectCONT->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CONT)); if (btnSelectITUZ->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(ITUZ)); if (btnSelectLOC->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(GRIDSQUARE)); if (btnSelectQSLrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QSLRDATE)); if (btnSelectQSLsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(QSLSDATE)); if (btnSelecteQSLrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(EQSLRDATE)); if (btnSelecteQSLsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(EQSLSDATE)); if (btnSelectLOTWrcvd->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(LOTWSDATE)); if (btnSelectLOTWsent->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(LOTWSDATE)); if (btnSelectNotes->value()) { std::string temp = pRec->getField(NOTES); for (size_t n = 0; n < temp.length(); n++) if (temp[n] == '\r' || temp[n] == '\n') temp[n] = '-'; fprintf (txtFile, ",\"%s\"", temp.c_str()); } if (btnSelectSerialIN->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(SRX)); if (btnSelectSerialOUT->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(STX)); if (btnSelectXchgIn->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(XCHG1)); if (btnSelectMyXchg->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(MYXCHG)); if (btnSelectClass->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CLASS)); if (btnSelectSection->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(ARRL_SECT)); if (btnSelectOperator->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(OP_CALL)); if (btnSelectStaCall->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(STA_CALL)); if (btnSelectStaGrid->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(MY_GRID)); if (btnSelectStaCity->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(MY_CITY)); if (btnSelectCheck->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(CHECK)); if (btnSelectAge->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(AGE)); if (btnSelect_1010->value()) fprintf (txtFile, ",\"%s\"", pRec->getField(TEN_TEN)); fprintf (txtFile, "%s", szEOL); pRec->putField(EXPORT,""); db->qsoUpdRec(i, pRec); } } fclose (txtFile); } return 0; } // text file in fixed fields void cTextFile::writeTXTHeader(FILE *txtFile) { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "%-10s", "DATE_ON"); if (btnSelectQSOdateOff->value())fprintf (txtFile, "%-10s", "DATE_OFF"); if (btnSelectTimeON->value()) fprintf (txtFile, "%-8s", "ON"); if (btnSelectTimeOFF->value()) fprintf (txtFile, "%-8s", "OFF"); if (btnSelectCall->value()) fprintf (txtFile, "%-10s", "CALL"); if (btnSelectName->value()) fprintf (txtFile, "%-15s", "NAME"); if (btnSelectBand->value()) fprintf (txtFile, "%-7s", "BAND"); if (btnSelectFreq->value()) fprintf (txtFile, "%-12s", "FREQ"); if (btnSelectMode->value()) fprintf (txtFile, "%-8s", "MODE"); if (btnSelectTX_pwr->value()) fprintf (txtFile, "%-8s", "TX_PWR"); if (btnSelectRSTsent->value()) fprintf (txtFile, "%-6s", "RSTX"); if (btnSelectRSTrcvd->value()) fprintf (txtFile, "%-6s", "RSTR"); if (btnSelectQth->value()) fprintf (txtFile, "%-20s", "QTH"); if (btnSelectState->value()) fprintf (txtFile, "%-5s", "ST"); if (btnSelectProvince->value()) fprintf (txtFile, "%-5s", "PR"); if (btnSelectCountry->value()) fprintf (txtFile, "%-15s", "CNTRY"); if (btnSelectCNTY->value()) fprintf (txtFile, "%-8s", "CNTY"); if (btnSelectDXCC->value()) fprintf (txtFile, "%-8s", "DXCC"); if (btnSelectCQZ->value()) fprintf (txtFile, "%-8s", "CQZONE"); if (btnSelectIOTA->value()) fprintf (txtFile, "%-8s", "IOTA"); if (btnSelectCONT->value()) fprintf (txtFile, "%-8s", "CONT"); if (btnSelectITUZ->value()) fprintf (txtFile, "%-8s", "ITUZ"); if (btnSelectLOC->value()) fprintf (txtFile, "%-15s", "GRIDSQUARE"); if (btnSelectQSLrcvd->value()) fprintf (txtFile, "%-10s", "QSLR"); if (btnSelectQSLsent->value()) fprintf (txtFile, "%-10s", "QSLS"); if (btnSelecteQSLrcvd->value()) fprintf (txtFile, "%-10s", "EQSLR"); if (btnSelecteQSLsent->value()) fprintf (txtFile, "%-10s", "EQSLS"); if (btnSelectLOTWrcvd->value()) fprintf (txtFile, "%-10s", "LOTWR"); if (btnSelectLOTWsent->value()) fprintf (txtFile, "%-10s", "LOTWS"); if (btnSelectNotes->value()) fprintf (txtFile, "%-80s", "NOTES"); if (btnSelectSerialIN->value()) fprintf (txtFile, "%-7s", "SRX"); if (btnSelectSerialOUT->value()) fprintf (txtFile, "%-7s", "STX"); if (btnSelectXchgIn->value()) fprintf (txtFile, "%-15s", "XCHG1"); if (btnSelectMyXchg->value()) fprintf (txtFile, "%-15s", "MYXCHG"); if (btnSelectClass->value()) fprintf (txtFile, "%-15s", "CLASS"); if (btnSelectSection->value()) fprintf (txtFile, "%-15s", "ARRL_SECT"); if (btnSelectOperator->value()) fprintf (txtFile, "%-15s", "OPER"); if (btnSelectStaCall->value()) fprintf (txtFile, "%-15s", "STA_CALL"); if (btnSelectStaGrid->value()) fprintf (txtFile, "%-15s", "STA_GRID"); if (btnSelectStaCity->value()) fprintf (txtFile, "%-15s", "STA_CITY"); if (btnSelectCheck->value()) fprintf (txtFile, "%-15s", "CHECK"); if (btnSelectAge->value()) fprintf (txtFile, "%-15s", "AGE"); if (btnSelect_1010->value()) fprintf (txtFile, "%-15s", "10-10"); fprintf (txtFile, "%s", szEOL); } int cTextFile::writeTXTFile (const char *fname, cQsoDb *db) { cQsoRec *pRec = (cQsoRec *)0; FILE *txtFile = fl_fopen (fname, "w"); if (!txtFile) return 1; if (txtFile) { writeTXTHeader(txtFile); for (int i = 0; i < db->nbrRecs(); i++) { pRec = db->getRec(i); if (pRec->getField(EXPORT)[0] == 'E') { if (btnSelectQSOdateOn->value()) fprintf (txtFile, "%-10s", pRec->getField(QSO_DATE)); if (btnSelectQSOdateOff->value()) fprintf (txtFile, "%-10s", pRec->getField(QSO_DATE_OFF)); if (btnSelectTimeON->value()) fprintf (txtFile, "%-8s", pRec->getField(TIME_ON)); if (btnSelectTimeOFF->value()) fprintf (txtFile, "%-8s", pRec->getField(TIME_OFF)); if (btnSelectCall->value()) fprintf (txtFile, "%-10s", pRec->getField(CALL)); if (btnSelectName->value()) fprintf (txtFile, "%-15s", pRec->getField(NAME)); if (btnSelectBand->value()) fprintf (txtFile, "%-7s", pRec->getField(BAND)); if (btnSelectFreq->value()) fprintf (txtFile, "%-12s", pRec->getField(FREQ)); if (btnSelectMode->value()) { if (!adif2submode(pRec->getField(ADIF_MODE)).empty()) fprintf (txtFile, "%-12s", adif2submode(pRec->getField(ADIF_MODE)).c_str()); else fprintf (txtFile, "%-12s", adif2export(pRec->getField(ADIF_MODE)).c_str()); } if (btnSelectTX_pwr->value()) fprintf (txtFile, "%-8s", pRec->getField(TX_PWR)); if (btnSelectRSTsent->value()) fprintf (txtFile, "%-6s", pRec->getField(RST_SENT)); if (btnSelectRSTrcvd->value()) fprintf (txtFile, "%-6s", pRec->getField(RST_RCVD)); if (btnSelectQth->value()) fprintf (txtFile, "%-20s", pRec->getField(QTH)); if (btnSelectState->value()) fprintf (txtFile, "%-5s", pRec->getField(STATE)); if (btnSelectProvince->value()) fprintf (txtFile, "%-5s", pRec->getField(VE_PROV)); if (btnSelectCountry->value()) fprintf (txtFile, "%-15s", pRec->getField(COUNTRY)); if (btnSelectCNTY->value()) fprintf (txtFile, "%-8s", pRec->getField(CNTY)); if (btnSelectDXCC->value()) fprintf (txtFile, "%-8s", pRec->getField(DXCC)); if (btnSelectCQZ->value()) fprintf (txtFile, "%-8s", pRec->getField(CQZ)); if (btnSelectIOTA->value()) fprintf (txtFile, "%-8s", pRec->getField(IOTA)); if (btnSelectCONT->value()) fprintf (txtFile, "%-8s", pRec->getField(CONT)); if (btnSelectITUZ->value()) fprintf (txtFile, "%-8s", pRec->getField(ITUZ)); if (btnSelectLOC->value()) fprintf (txtFile, "%-15s", pRec->getField(GRIDSQUARE)); if (btnSelectQSLrcvd->value()) fprintf (txtFile, "%-10s", pRec->getField(QSLRDATE)); if (btnSelectQSLsent->value()) fprintf (txtFile, "%-10s", pRec->getField(QSLSDATE)); if (btnSelecteQSLrcvd->value()) fprintf (txtFile, "%-10s", pRec->getField(EQSLRDATE)); if (btnSelecteQSLsent->value()) fprintf (txtFile, "%-10s", pRec->getField(EQSLSDATE)); if (btnSelectLOTWrcvd->value()) fprintf (txtFile, "%-10s", pRec->getField(LOTWRDATE)); if (btnSelectLOTWsent->value()) fprintf (txtFile, "%-10s", pRec->getField(LOTWSDATE)); if (btnSelectNotes->value()) { std::string temp = pRec->getField(NOTES); for (size_t n = 0; n < temp.length(); n++) if (temp[n] == '\n') temp[n] = ';'; fprintf (txtFile, "%-80s", temp.c_str()); } if (btnSelectSerialIN->value()) fprintf (txtFile, "%-7s", pRec->getField(SRX)); if (btnSelectSerialOUT->value()) fprintf (txtFile, "%-7s", pRec->getField(STX)); if (btnSelectXchgIn->value()) fprintf (txtFile, "%-15s", pRec->getField(XCHG1)); if (btnSelectMyXchg->value()) fprintf (txtFile, "%-15s", pRec->getField(MYXCHG)); if (btnSelectClass->value()) fprintf (txtFile, "%-15s", pRec->getField(CLASS)); if (btnSelectSection->value()) fprintf (txtFile, "%-15s", pRec->getField(ARRL_SECT)); if (btnSelectOperator->value()) fprintf (txtFile, "%-15s", pRec->getField(OP_CALL)); if (btnSelectStaCall->value()) fprintf (txtFile, "%-15s", pRec->getField(STA_CALL)); if (btnSelectStaGrid->value()) fprintf (txtFile, "%-15s", pRec->getField(MY_GRID)); if (btnSelectStaCity->value()) fprintf (txtFile, "%-15s", pRec->getField(MY_CITY)); if (btnSelectCheck->value()) fprintf (txtFile, "%-15s", pRec->getField(CHECK)); if (btnSelectAge->value()) fprintf (txtFile, "%-15s", pRec->getField(AGE)); if (btnSelect_1010->value()) fprintf (txtFile, "%-15s", pRec->getField(TEN_TEN)); fprintf (txtFile, "%s", szEOL); pRec->putField(EXPORT,""); db->qsoUpdRec(i, pRec); } } fclose (txtFile); } return 0; } fldigi-4.2.05/src/logbook/logbook.cxx0000664000175000017500000000364414611711171014375 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "main.h" #include "logbook.h" #include "logsupport.h" #include "configuration.h" #include "debug.h" #include "qrunner.h" #include "gettext.h" #include "icons.h" void start_logbook () { if (progdefaults.logbookfilename.empty()) { logbook_filename = LogsDir; logbook_filename.append("logbook." ADIF_SUFFIX); progdefaults.logbookfilename = logbook_filename; progdefaults.changed = true; } else logbook_filename = progdefaults.logbookfilename; qsodb.deleteRecs(); rotate_log(logbook_filename); adifFile.readFile (logbook_filename.c_str(), &qsodb); std::string label = "Logbook - "; label.append(fl_filename_name(logbook_filename.c_str())); dlgLogbook->copy_label(label.c_str()); txtLogFile->value(logbook_filename.c_str()); txtLogFile->redraw(); return; } void close_logbook() { // force immediate write to logbook adif file adifFile.writeLog (logbook_filename.c_str(), &qsodb, true); } fldigi-4.2.05/src/logbook/counties.cxx0000664000175000017500000003434214611711171014571 00000000000000// ---------------------------------------------------------------------------- // counties.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // Extracted from FIPS 2010 census data #include #include #include "main.h" #include "counties.h" #include "contest.h" #include "configuration.h" #include "debug.h" #include "strutil.h" //---------------------------------------------------------------------- Cstates states; std::vector vec_SQSO; std::vector vec_6QP; std::vector vec_7QP; void load_from_string(std::string &str, std::vector &vec) { size_t ptr1 = 0; size_t ptr2 = 0; size_t ptr3 = 0; std::string line; STATE_COUNTY_QUAD scq; vec.clear(); // eat first line ptr1 = str.find("\n"); line = str.substr(ptr1); LOG_INFO("%s data read from internal data string", (&vec == &vec_SQSO ? "SQSO" : &vec == &vec_6QP ? "NEQP" : "7QP")); ptr1++; ptr2 = str.find("\n", ptr1); while (ptr2 != std::string::npos) { line = str.substr(ptr1, ptr2 - ptr1); if (line.empty()) break; ptr3 = line.find(","); scq.state = line.substr(0,ptr3); line.erase(0, ptr3 + 1); ptr3 = line.find(","); scq.ST = line.substr(0,ptr3); line.erase(0, ptr3 + 1); ptr3 = line.find(","); scq.county = line.substr(0,ptr3); line.erase(0, ptr3 + 1); scq.CTY = line; if (!scq.ST.empty()) vec.push_back(scq); ptr1 = ptr2 + 1; ptr2 = str.find("\n", ptr1); } LOG_INFO("Read %d records", (int)vec.size()); } void load_from_file( std::string &fname, std::vector &vec) { std::ifstream csvfile(fname.c_str()); if (!csvfile) return; vec.clear(); std::string line; line.reserve(1024); char str[1024]; STATE_COUNTY_QUAD scq; // eat the header line memset(str, 0, 1024); csvfile.getline(str, 1024); LOG_INFO("%s data read from %s", (&vec == &vec_SQSO ? "SQSO" : &vec == &vec_6QP ? "NEQP" : "7QP"), fname.c_str()); size_t ptr = 0; while (!csvfile.eof()) { memset(str, 0, 1024); csvfile.getline(str, 1024); line = str; if (line.empty()) break; ptr = line.find(","); scq.state = line.substr(0,ptr); line.erase(0, ptr + 1); ptr = line.find(","); scq.ST = line.substr(0,ptr); line.erase(0, ptr + 1); ptr = line.find(","); scq.county = line.substr(0,ptr); line.erase(0, ptr + 1); scq.CTY = line; if (!scq.ST.empty()) vec.push_back(scq); } csvfile.close(); LOG_INFO("Read %d records", (int)vec.size()); } void load_SQSO() { std::string cnty_file = DATA_dir; cnty_file.append("SQSO.txt"); std::ifstream csvfile(cnty_file.c_str()); std::string str = szSQSO; if (!csvfile) { load_from_string( str, vec_SQSO ); return; } char line[1024]; csvfile.getline(line, 1024); std::string sline = line; std::string vertest = "Version "; vertest.append(FLDIGI_VERSION); if (sline.find(vertest) == std::string::npos) { csvfile.close(); load_from_string( str, vec_SQSO ); return; } csvfile.close(); load_from_file( cnty_file, vec_SQSO ); } void load_7qp() { std::string cnty_file = DATA_dir; cnty_file.append("7QP.txt"); std::ifstream csvfile(cnty_file.c_str()); if (!csvfile) { std::string str = sz7QP; load_from_string( str, vec_7QP ); return; } csvfile.close(); load_from_file( cnty_file, vec_7QP ); } void load_neqp() { std::string cnty_file = DATA_dir; cnty_file.append("NEQP.txt"); std::ifstream csvfile(cnty_file.c_str()); if (!csvfile) { std::string str = szNEQP; load_from_string(str, vec_6QP); return; } csvfile.close(); load_from_file( cnty_file, vec_6QP ); } void save_SQSO() { std::string cnty_file = DATA_dir; cnty_file.append("SQSO.txt"); std::ofstream csvfile(cnty_file.c_str()); if (!csvfile) { return; } csvfile << "State/Province, ST/PR, County/City/District, CCD -- Version "; csvfile << FLDIGI_VERSION << std::endl; for (size_t n = 0; n < vec_SQSO.size(); n++ ) csvfile << vec_SQSO[n].state << "," << vec_SQSO[n].ST << "," << vec_SQSO[n].county << "," << vec_SQSO[n].CTY << std::endl; csvfile.close(); } void save_7qp() { std::string cnty_file = DATA_dir; cnty_file.append("7QP.txt"); std::ofstream csvfile(cnty_file.c_str()); if (!csvfile) { // std::cout << "cannot create " << cnty_file << std::endl; return; } csvfile << "State, ST, County/City, CC" << std::endl; for (size_t n = 0; n < vec_7QP.size(); n++) csvfile << vec_7QP[n].state << "," << vec_7QP[n].ST << "," << vec_7QP[n].county << "," << vec_7QP[n].CTY << std::endl; csvfile.close(); //std::cout << vec_7QP.size() << " records written to " << cnty_file << std::endl; } void save_neqp() { std::string cnty_file = DATA_dir; cnty_file.append("NEQP.txt"); std::ofstream csvfile(cnty_file.c_str()); if (!csvfile) { // std::cout << "cannot create " << cnty_file << std::endl; return; } csvfile << "State, ST, County/City, CC" << std::endl; for (size_t n = 0; n < vec_6QP.size(); n++) csvfile << vec_6QP[n].state << "," << vec_6QP[n].ST << "," << vec_6QP[n].county << "," << vec_6QP[n].CTY << std::endl; csvfile.close(); //std::cout << vec_6QP.size() << " records written to " << cnty_file << std::endl; } void save_counties() { save_SQSO(); save_7qp(); save_neqp(); } void load_counties() { load_SQSO(); load_7qp(); load_neqp(); } //---------------------------------------------------------------------- bool Cstates::valid_county( std::string st, std::string cnty ) { std::string ST = ucasestr(st); std::string CNTY = ucasestr(cnty); std::string dST, dCNTY, dCOUNTY; if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP") { for (size_t n = 0; n < vec_7QP.size(); n++) { dST = ucasestr(vec_7QP[n].ST); dCNTY = ucasestr(vec_7QP[n].CTY); dCOUNTY = ucasestr(vec_7QP[n].county); if ( ST != dST ) continue; if (CNTY == dCNTY) return true; if (CNTY == dCOUNTY) return true; } } else if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { for (size_t n = 0; n < vec_6QP.size(); n++) { dST = ucasestr(vec_6QP[n].ST); dCNTY = ucasestr(vec_6QP[n].CTY); dCOUNTY = ucasestr(vec_6QP[n].county); if ( ST != dST ) continue; if (CNTY == dCNTY) return true; if (CNTY == dCOUNTY) return true; } } else { for (size_t n = 0; n < vec_SQSO.size(); n++) { dST = ucasestr(vec_SQSO[n].ST); dCNTY = ucasestr(vec_SQSO[n].CTY); dCOUNTY = ucasestr(vec_SQSO[n].county); if ( ST != dST ) continue; if (CNTY == dCNTY) return true; if (CNTY == dCOUNTY) return true; } } return false; } const std::string Cstates::names() { std::string _names = vec_SQSO[0].state; std::string _st = vec_SQSO[0].ST; for (size_t n = 0; n < vec_SQSO.size(); n++) { if (_st != vec_SQSO[n].ST && !vec_SQSO[n].ST.empty()) { _names.append("|").append(vec_SQSO[n].state); _st = vec_SQSO[n].ST; } } return _names; } const std::string Cstates::state_short(std::string ST) // ST can be either short or long form { if (ST == "NIL") return ""; for (size_t n = 0; n < vec_SQSO.size(); n++) if (ST == vec_SQSO[n].ST || ST == vec_SQSO[n].state) return vec_SQSO[n].ST; return ""; } const std::string Cstates::state(std::string ST) // ST can be either short or long form { if (ST == "NIL") return ""; for (size_t n = 0; n < vec_SQSO.size(); n++) if (ST == vec_SQSO[n].ST || ST == vec_SQSO[n].state) return vec_SQSO[n].state; return ""; } const std::string Cstates::counties(std::string ST) { std::string _counties = ""; if (ST == "NIL") return _counties; size_t n = 0; if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP") { for (n = 0; n < vec_7QP.size(); n++) { if (ST == vec_7QP[n].ST || ST == vec_7QP[n].state) { ST = vec_7QP[n].ST; if (!_counties.empty() ) _counties.append("|"); _counties.append(vec_7QP[n].county); continue; } if (!_counties.empty() && ST != vec_7QP[n].ST && ST != vec_7QP[n].state ) break; } } else if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { for (size_t n = 0; n < vec_6QP.size(); n++) { if (ST == vec_6QP[n].ST || ST == vec_6QP[n].state) { ST = vec_6QP[n].ST; if (!_counties.empty() ) _counties.append("|"); _counties.append(vec_6QP[n].county); continue; } if (!_counties.empty() && ST != vec_6QP[n].ST && ST != vec_6QP[n].state ) break; } } else { for (n = 0; n < vec_SQSO.size(); n++) { if (ST == vec_SQSO[n].ST || ST == vec_SQSO[n].state) { ST = vec_SQSO[n].ST; if (!_counties.empty() ) _counties.append("|"); _counties.append(vec_SQSO[n].county); continue; } if (!_counties.empty() && ST != vec_SQSO[n].ST && ST != vec_SQSO[n].state ) break; } } return _counties; } const std::string Cstates::cnty_short( std::string st, std::string cnty) // st/cnty can be either short or long { std::string ST = ucasestr(st); std::string CNTY = ucasestr(cnty); std::string dSTATE, dST, dCNTY, dCOUNTY; std::string answer = ""; size_t n = 0; bool OK = false; if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP") { for (n = 0; n < vec_7QP.size(); n++) { dST = ucasestr(vec_7QP[n].ST); dSTATE = ucasestr(vec_7QP[n].state); if (ST == dST) {OK = true; break;} if (ST == dSTATE) { OK = true; break; } } if (!OK) return answer; ST = vec_7QP[n].ST; for (size_t k = n; ST == vec_7QP[k].ST, k < vec_7QP.size(); k++) { dCNTY = ucasestr(vec_7QP[k].CTY); dCOUNTY = ucasestr(vec_7QP[k].county); if (CNTY == dCNTY) { answer = vec_7QP[k].CTY; break; } if (CNTY == dCOUNTY) { answer = vec_7QP[k].CTY; break; } } } else if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { for (n = 0; n < vec_6QP.size(); n++) { dST = ucasestr(vec_6QP[n].ST); dSTATE = ucasestr(vec_6QP[n].state); if (ST == dST) {OK = true; break;} if (ST == dSTATE) { OK = true; break; } } if (!OK) return answer; ST = vec_6QP[n].ST; for (size_t k = n; ST == vec_6QP[k].ST, k < vec_6QP.size(); k++) { dCNTY = ucasestr(vec_6QP[k].CTY); dCOUNTY = ucasestr(vec_6QP[k].county); if (CNTY == dCNTY) { answer = vec_6QP[k].CTY; break; } if (CNTY == dCOUNTY) { answer = vec_6QP[k].CTY; break; } } } else { for (n = 0; n < vec_SQSO.size(); n++) { dST = ucasestr(vec_SQSO[n].ST); dSTATE = ucasestr(vec_SQSO[n].state); if (ST == dST) {OK = true; break;} if (ST == dSTATE) { OK = true; break; } } if (!OK) return answer; ST = vec_SQSO[n].ST; for (size_t k = n; ST == vec_SQSO[k].ST, k < vec_SQSO.size(); k++) { dCNTY = ucasestr(vec_SQSO[k].CTY); dCOUNTY = ucasestr(vec_SQSO[k].county); if (CNTY == dCNTY) { answer = vec_SQSO[k].CTY; break; } if (CNTY == dCOUNTY) { answer = vec_SQSO[k].CTY; break; } } } return answer; } const std::string Cstates::county( std::string st, std::string cnty) // st/cnty can be either short or long { std::string ST = ucasestr(st); std::string CNTY = ucasestr(cnty); std::string dST, dCNTY, dCOUNTY; size_t n = 0; if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "7QP") { for (n = 0; n < vec_7QP.size(); n++) { dST = ucasestr(vec_7QP[n].ST); if (ST == dST) break; } if (ST != dST) return ""; ST = vec_7QP[n].ST; for (size_t k = n; ST == vec_7QP[k].ST, k < vec_7QP.size(); k++) { dCNTY = ucasestr(vec_7QP[k].CTY); dCOUNTY = ucasestr(vec_7QP[k].county); if (CNTY == dCNTY) return vec_7QP[k].county; if (CNTY == dCOUNTY) return vec_7QP[k].county; } return ""; } else if (std::string(QSOparties.qso_parties[progdefaults.SQSOcontest].state) == "6NE") { for (n = 0; n < vec_6QP.size(); n++) { dST = ucasestr(vec_6QP[n].ST); if (ST == dST) break; } if (ST != dST) return ""; ST = vec_6QP[n].ST; for (size_t k = n; ST == vec_6QP[k].ST, k < vec_6QP.size(); k++) { if (vec_6QP[k].ST.empty()) return ""; dCNTY = ucasestr(vec_6QP[k].CTY); dCOUNTY = ucasestr(vec_6QP[k].county); if (CNTY == dCNTY) return vec_6QP[k].county; if (CNTY == dCOUNTY) return vec_6QP[k].county; } return ""; } else { for (n = 0; n < vec_SQSO.size(); n++) { if (vec_SQSO[n].ST.empty()) return ""; dST = ucasestr(vec_SQSO[n].ST); if (ST == dST) break; } if (ST != dST) return ""; ST = vec_SQSO[n].ST; for (size_t k = n; ST == vec_SQSO[k].ST, k < vec_SQSO.size(); k++) { if (vec_SQSO[k].ST.empty()) return ""; dCNTY = ucasestr(vec_SQSO[k].CTY); dCOUNTY = ucasestr(vec_SQSO[k].county); if (CNTY == dCNTY) return vec_SQSO[k].county; if (CNTY == dCOUNTY) return vec_SQSO[k].county; } return ""; } return ""; } static std::string __counties; const std::string counties() { load_counties(); if (vec_SQSO.empty()) return ""; __counties.clear(); for (size_t n = 0; n < vec_SQSO.size(); n++ ) { __counties.append(vec_SQSO[n].ST).append(" ").append(vec_SQSO[n].county); if (n < (vec_SQSO.size() - 1)) __counties.append("|"); } return __counties; } /* const std::string seven_qp_counties() { load_7qp(); if (vec_7QP.empty()) return ""; __counties.clear(); for (size_t n = 0; n < vec_7QP.size(); n++ ) { __counties.append(vec_7QP[n].ST).append(" ").append(vec_7QP[n].county).append("|"); if (n < (vec_7QP.size() - 1)) __counties.append("|"); } return __counties; } const std::string six_qp_counties() { load_neqp(); if (vec_6QP.empty()) return ""; __counties.clear(); for (size_t n = 0; n < vec_6QP.size(); n++ ) { __counties.append(vec_6QP[n].ST).append(" ").append(vec_6QP[n].county).append("|"); if (n < (vec_6QP.size() - 1)) __counties.append("|"); } return __counties; } */ fldigi-4.2.05/src/logbook/n3fjp_logger.cxx0000664000175000017500000024060414611711171015317 00000000000000// ===================================================================== // // n3fjp_logger.cxx // // interface to multiple n3fjp tcpip logbook services // // Copyright (C) 2016 // Dave Freese, W1HKJ // Dave Anderson, KA3PMW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "threads.h" #include "socket.h" #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "logsupport.h" #include "n3fjp_logger.h" #include "confdialog.h" #include "rigsupport.h" #include "contest.h" #include "timeops.h" LOG_FILE_SOURCE(debug::LOG_N3FJP); static void send_log_data(); //====================================================================== // Socket N3FJP i/o used on all platforms //====================================================================== pthread_t n3fjp_thread; pthread_t n3fjp_rx_socket_thread; Socket *n3fjp_socket = 0; pthread_mutex_t n3fjp_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t send_this_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t report_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t n3fjp_socket_mutex = PTHREAD_MUTEX_INITIALIZER; static std::string send_this = ""; static std::string pathname; static std::stringstream result; bool n3fjp_connected = false; bool n3fjp_enabled = false; bool n3fjp_exit = false; std::string n3fjp_ip_address = ""; std::string n3fjp_ip_port = ""; std::string n3fjp_rxbuffer; std::string connected_to; void n3fjp_print(std::string s); enum {UNKNOWN, N3FJP, FLDIGI}; bool n3fjp_bool_add_record = false; int xcvr_controller = UNKNOWN; std::string tracked_freq = ""; int tracked_mode = -1; bool polling_enabled = true; enum { FJP_NONE, FJP_ACL, // Amateur Contact Log FJP_FD, // ARRL Field Day FJP_WFD, // ARRL Winter Field Day FJP_KD, // ARRL Kids Day FJP_ARR, // ARRL Rookie Roundup FJP_RTTY, // ARRL Rtty FJP_ASCR, // ARRL School Club Roundup FJP_JOTA, // ARRL Jamboree On The Air FJP_AICW, // ARRL International DX (CW) FJP_SS, // ARRL November Sweepstakes FJP_CQ_WPX, // CQ WPX FJP_CQWWRTTY, // CQWW Rtty FJP_CQWWDX, // CQWW DX FJP_IARI, // Italian ARI International DX FJP_NAQP, // North American QSO Party FJP_NAS, // North American Sprint FJP_1010, // Ten Ten FJP_AIDX, // Africa All Mode FJP_VHF, // VHF FJP_WAE, // Worked All Europe FJP_MDQP, // MD QSOP record format FJP_7QP, // 7QP record format FJP_NEQP, // New England QSO party record format FJP_QP1, // QSO party record format 1 / 7QP contest FJP_QP2, // QSO party record format 2 FJP_QP3, // QSO party record format 3 FJP_QP4, // QSO party record format 4 FJP_QP5, // QSO party record format 5 FJP_QP6 // QSO party record format 6 }; // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // // "7QP", "B", "B", "B", "", "I", "", "", "SSCCC" // "New Eng", "B", "B", "B", "", "I", "", "", "CCCSS" // "MD SQP" "", "B", "B", "", "", "", "B", "" // "QSOP 1" "B", "B", "B", "", "I", "", "", "" // "QSOP 2" "B", "B", "B", "", "B", "", "", "" // "QSOP 3" "", "B", "B", "B", "I", "", "", "" // "QSOP 4" "", "B", "B", "", "I", "B", "", "" // "QSOP 5" "B", "B", "B", "", "", "", "", "" // "QSOP 6" "B", "B", "B", "", "I", "", "", "" struct N3FJP_LOGGER { const char *program; int contest; bool in_state; } n3fjp_logger[] = { {"No Contest", FJP_NONE, false}, {"Amateur Contact Log", FJP_ACL, false}, {"Africa All-Mode International", FJP_AIDX, false}, {"ARRL Field Day", FJP_FD, false}, {"Winter FD", FJP_WFD, false}, {"ARRL International DX", FJP_AICW, false}, {"Jamboree on the Air", FJP_JOTA, false}, {"ARRL Kids Day", FJP_KD, false}, {"ARRL Rookie Roundup", FJP_ARR, false}, {"ARRL RTTY Roundup", FJP_RTTY, false}, {"School Club Roundup", FJP_ASCR, false}, {"ARRL November Sweepstakes", FJP_SS, false}, {"BARTG RTTY Contest", FJP_NONE, false}, {"CQ WPX Contest Log", FJP_CQ_WPX, false}, {"CQ WW DX Contest Log", FJP_CQWWDX, false}, {"CQ WW DX RTTY Contest Log", FJP_CQWWRTTY, false}, {"Italian A.R.I. International DX", FJP_IARI, false}, {"NAQP", FJP_NAQP, false}, {"NA Sprint", FJP_NAS, false}, {"Ten Ten", FJP_1010, false}, {"VHF", FJP_VHF, false}, {"Worked All Europe", FJP_WAE, false}, {"Alabama QSO Party Contest Log", FJP_QP1, true}, {"ALQP Contest Log (Out of State)", FJP_QP1, false}, {"Arkansas QSO Party Contest Log", FJP_QP1, true}, {"ARQP Contest Log (Out of State)", FJP_QP1, false}, {"British Columbia QSO Party Contest Log", FJP_QP1, true}, {"BCQP Contest Log (Out of Province)", FJP_QP1, false}, {"Florida QSO Party Contest Log", FJP_QP1, true}, {"FLQP Contest Log (Out of State)", FJP_QP1, false}, {"Georgia QSO Party Contest Log", FJP_QP1, true}, {"GAQP Contest Log (Out of State)", FJP_QP1, false}, {"Hawaii QSO Party Contest Log", FJP_QP1, true}, {"HIQP Contest Log (Out of State)", FJP_QP1, false}, {"Iowa QSO Party Contest Log", FJP_QP1, true}, {"IAQP Contest Log (Out of State)", FJP_QP1, false}, {"Idaho QSO Party Contest Log", FJP_QP1, true}, {"IDQP Contest Log (Out of State)", FJP_QP1, false}, {"Illinois QSO Party Contest Log", FJP_QP1, true}, {"ILQP Contest Log (Out of State)", FJP_QP1, false}, {"Indiana QSO Party Contest Log", FJP_QP1, true}, {"INQP Contest Log (Out of State)", FJP_QP1, false}, {"Kansas QSO Party Contest Log", FJP_QP1, true}, {"KSQP Contest Log (Out of State)", FJP_QP1, false}, {"Kentucky QSO Party Contest Log", FJP_QP1, true}, {"KYQP Contest Log (Out of State)", FJP_QP1, false}, {"Louisiana QSO Party Contest Log", FJP_QP1, true}, {"LAQP Contest Log (Out of State)", FJP_QP1, false}, {"Missouri QSO Party Contest Log", FJP_QP1, true}, {"MOQP Contest Log (Out of State)", FJP_QP1, false}, {"Mississippi QSO Party Contest Log", FJP_QP1, true}, {"MSQP Contest Log (Out of State)", FJP_QP1, false}, {"North Dakota QSO Party Contest Log", FJP_QP1, true}, {"NDQP Contest Log (Out of State)", FJP_QP1, false}, {"New Jersey QSO Party Contest Log", FJP_QP1, true}, {"NJQP Contest Log (Out of State)", FJP_QP1, false}, {"Montana QSO Party Contest Log", FJP_QP2, true}, {"MTQP Contest Log (Out of State)", FJP_QP2, false}, {"Nebraska QSO Party Contest Log", FJP_QP2, true}, {"NEQP Contest Log (Out of State)", FJP_QP2, false}, {"New York QSO Party Contest Log", FJP_QP2, true}, {"NYQP Contest Log (Out of State)", FJP_QP2, false}, {"Ohio QSO Party Contest Log", FJP_QP2, true}, {"OHQP Contest Log (Out of State)", FJP_QP2, false}, {"Oklahoma QSO Party Contest Log", FJP_QP2, true}, {"OKQP Contest Log (Out of State)", FJP_QP2, false}, {"Ontario QSO Party Contest Log", FJP_QP2, true}, {"ONQP Contest Log (Out of Province)", FJP_QP2, false}, {"South Dakota QSO Party Contest Log", FJP_QP2, true}, {"SDQP Contest Log (Out of State)", FJP_QP2, false}, {"Tennessee QSO Party Contest Log", FJP_QP2, true}, {"TNQP Contest Log (Out of State)", FJP_QP2, false}, {"Texas QSO Party Contest Log", FJP_QP2, true}, {"TXQP Contest Log (Out of State)", FJP_QP2, false}, {"Vermont QSO Party Contest Log", FJP_QP2, true}, {"VTQP Contest Log (Out of State)", FJP_QP2, false}, {"Washington Salmon Run QSO Party Contest Log", FJP_QP2, true}, {"WAQP Contest Log (Out of State)", FJP_QP2, false}, {"Maine QSO Party Contest Log", FJP_QP2, true}, {"MEQP Contest Log (Out of State)", FJP_QP2, false}, {"Arizona QSO Party Contest Log", FJP_QP3, true}, {"AZQP Contest Log (Out of State)", FJP_QP3, false}, {"California QSO Party Contest Log", FJP_QP3, true}, {"CAQP Contest Log (Out of State)", FJP_QP3, false}, {"Michigan QSO Party Contest Log", FJP_QP3, true}, {"MIQP Contest Log (Out of State)", FJP_QP3, false}, {"Pennsylvania QSO Party Contest Log", FJP_QP3, true}, {"PAQP Contest Log (Out of State)", FJP_QP3, false}, {"Virginia QSO Party Contest Log", FJP_QP3, true}, {"VAQP Contest Log (Out of State)", FJP_QP3, false}, {"Colorado QSO Party Contest Log", FJP_QP4, true}, {"COQP Contest Log (Out of State)", FJP_QP4, false}, {"Maryland QSO Party Contest Log", FJP_MDQP, true}, {"MDQP Contest Log (Out of State)", FJP_MDQP, false}, {"Minnesota QSO Party Contest Log", FJP_QP4, true}, {"MNQP Contest Log (Out of State)", FJP_QP4, false}, {"New Mexico QSO Party Contest Log", FJP_QP4, true}, {"NMQP Contest Log (Out of State)", FJP_QP4, false}, {"North Carolina QSO Party Contest Log", FJP_QP6, true}, {"NCQP Contest Log (Out of State)", FJP_QP6, false}, {"South Carolina QSO Party Contest Log", FJP_QP5, true}, {"SCQP Contest Log (Out of State)", FJP_QP5, false}, {"West Virginia QSO Party Contest Log", FJP_QP5, true}, {"WVQP Contest Log (Out of State)", FJP_QP5, false}, {"Wisconsin QSO Party Contest Log", FJP_QP6, true}, {"WIQP Contest Log (Out of State)", FJP_QP6, false}, {"7QP QSO Party Contest Log", FJP_7QP, true}, {"7QP Contest Log (Out of Region)", FJP_7QP, false}, {"New England QSO Party Contest Log", FJP_NEQP, true}, {"NEQP Contest Log (Out of Region)", FJP_NEQP, false} }; int n3fjp_contest = FJP_NONE; bool n3fjp_in_state = false; int n3fjp_wait = 0; void adjust_freq(std::string s); void n3fjp_parse_response(std::string s); void n3fjp_disp_report(std::string s, std::string fm = "", bool tofile = true); void n3fjp_send(std::string cmd, bool tofile = true); void n3fjp_rcv(std::string &rx, bool tofile = true); void n3fjp_clear_record(); void n3fjp_getfields(); void n3fjp_get_record(std::string call); static std::string ParseField(std::string &record, std::string fieldtag); static std::string ParseTextField(std::string &record, std::string fieldtag); static std::string ucasestr(std::string s); static void n3fjp_parse_data_stream(std::string buffer); static void n3fjp_parse_calltab_event(std::string buffer); std::string fmt_date(std::string date); std::string fmt_time(std::string time); std::string field_rec(std::string fld, std::string val); static std::string n3fjp_tstmode(); static std::string n3fjp_opmode(); static std::string n3fjp_opband(); static std::string n3fjp_freq(); static void send_control(const std::string ctl, std::string val); static void send_action(const std::string action); static void send_command(const std::string command, std::string val=""); static void send_data(); static void send_data_norig(); void do_n3fjp_add_record_entries(); void n3fjp_get_freq(); void n3fjp_set_freq(unsigned long long f); void n3fjp_set_ptt(int on); void n3fjp_add_record(cQsoRec &record); void n3fjp_parse_response(std::string tempbuff); void n3fjp_rcv_data(); static bool connect_to_n3fjp_server(); void n3fjp_start(); void n3fjp_disconnect(bool clearlog = false); void *n3fjp_loop(void *args); void n3fjp_init(void); void n3fjp_close(void); //====================================================================== // //====================================================================== static std::string strip(std::string s) { while (s.length() && (s[0] <= ' ')) s.erase(0,1); while (s.length() && (s[s.length()-1] <= ' ')) s.erase(s.length()-1, 1); return s; } //====================================================================== // //====================================================================== // N3FJP app sent us CHANGEFREQ void adjust_freq(std::string sfreq) { unsigned long long freq; size_t pp = sfreq.find("."); if (pp == std::string::npos) return; while ((sfreq.length() - pp) < 7) sfreq.append("0"); // Convert from MHz to Hz sfreq.erase(pp,1); freq = strtoull(sfreq.c_str(), NULL, 10); if (freq == 0) return; // N3FJP sends the READBMFRESPONSE message in response to a change of freq // while having rig control; we need to update our notion of what digi last sent to n3 // to match so (in other functions) we don't send redundant commands in reply. char szfreq[20]; snprintf(szfreq, sizeof(szfreq), "%.6lf", ((double)freq)/1000000.0); // "tracked" holds a record of what we last sent to save a transmission if it hasn't changed tracked_mode = active_modem->get_mode(); tracked_freq = szfreq; wf->rfcarrier(freq); wf->movetocenter(); show_frequency(freq); if (xcvr_controller == FLDIGI) sendFreq(freq); return; } //====================================================================== // //====================================================================== static notify_dialog *alert_window = 0; void set_connect_box() { if (!alert_window) alert_window = new notify_dialog; box_n3fjp_connected->color( n3fjp_connected ? FL_DARK_GREEN : FL_BACKGROUND2_COLOR); box_n3fjp_connected->redraw(); if (n3fjp_connected) { alert_window->notify(_("Connected to N3FJP logger"), 1.0); REQ(show_notifier, alert_window); REQ(update_main_title); } else { progdefaults.CONTESTnotes = ""; listbox_contest->index(0); listbox_QP_contests->index(0); inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); } } void n3fjp_print(std::string s) { if (bEXITING) return; FILE *n3fjplog = fl_fopen(pathname.c_str(), "a"); time_t t = time(NULL); struct tm stm; (void)localtime_r(&t, &stm); char sztime[12]; memset(sztime, 0, 11); snprintf(sztime, sizeof(sztime), "[%02d:%02d:%02d] ", stm.tm_hour, stm.tm_min, stm.tm_sec); s.insert(0, sztime); if (n3fjplog) { if (s[s.length()-1]!='\n') fprintf(n3fjplog, "%s\n", s.c_str()); else fprintf(n3fjplog, "%s", s.c_str()); fclose(n3fjplog); } LOG_VERBOSE("%s", s.c_str()); } void n3fjp_show(std::string s) { txt_N3FJP_data->insert(s.c_str()); txt_N3FJP_data->redraw(); } void n3fjp_disp_report(std::string s, std::string fm, bool tofile) { guard_lock report_lock(&report_mutex); if (s.empty()) return; std::string report = fm.append("\n").append(s); size_t p; p = report.find("\r\n"); while (p != std::string::npos) { report.replace(p,2,"\n"); p = report.find("\r\n"); } p = report.find(""); while (p != std::string::npos) { report.replace(p, 11, "\n"); p = report.find(""); } report.append("\n"); if (progdefaults.enable_N3FJP_log) REQ(n3fjp_show, report); if (tofile) n3fjp_print(report); } void n3fjp_send(std::string cmd, bool tofile) { guard_lock send_lock(&n3fjp_socket_mutex); if (!n3fjp_socket) { n3fjp_print("Socket not present"); return; } try { if (cmd.empty()) return; n3fjp_disp_report(cmd, "SEND:", tofile); cmd.append("\r\n"); n3fjp_socket->send(cmd); } catch (const SocketException& e) { result.str(""); result << "n3fjp_send()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void n3fjp_rcv(std::string &rx, bool tofile) { guard_lock read_lock(&n3fjp_socket_mutex); if (!n3fjp_socket) return; try { if (!n3fjp_socket->recv(rx)) rx.clear(); if (rx.empty()) return; n3fjp_disp_report(rx, "RCVD:", tofile); } catch (const SocketException& e) { result.str(""); result << "n3fjp_rcv()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } //====================================================================== // //====================================================================== static cQsoRec rec; static void n3fjp_sendRSTS(std::string s) { if (s.empty()) return; try { send_control("RSTS", s); } catch (...) { throw; } } static void n3fjp_sendRSTR(std::string s) { if (s.empty()) return; try { send_control("RSTR", s); } catch (...) { throw; } } void send_call(std::string s) { try { send_control("CALL", s.c_str()); } catch (const SocketException& e) { result.str(""); result << "send_call()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_freq(std::string s) { try { send_control("FREQUENCY", s); } catch (const SocketException& e) { result.str(""); result << "send_freq()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_band(std::string s) { try { send_control("BAND", s); } catch (const SocketException& e) { result.str(""); result << "send_band()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_mode(std::string s) { try { send_control("MODE", s); } catch (const SocketException& e) { result.str(""); result << "send_mode()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_state(std::string s) { try { send_control("STATE", s); } catch (const SocketException& e) { result.str(""); result << "send_state()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_county(std::string s) { try { send_control("COUNTYR", s); } catch (const SocketException& e) { result.str(""); result << "send_county()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_spcnum(std::string s) { try { send_control("SPCNUM", s); } catch (const SocketException& e) { result.str(""); result << "send_spcnum()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } void send_name(std::string s) { try { send_control("NAMER", s); } catch (const SocketException& e) { result.str(""); result << "send_name()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } //====================================================================== // //====================================================================== void n3fjp_clear_record() { if(!n3fjp_socket) return; if (!n3fjp_connected) return; std::string cmd = "CLEAR"; try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); n3fjp_wait = 100; } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); } catch (...) { throw; } } //====================================================================== // //====================================================================== bool n3fjp_calltab = false; void n3fjp_getfields() { std::string cmd =""; try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); n3fjp_wait = 100; } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); n3fjp_calltab = false; } catch (...) { throw; } } void n3fjp_get_record(std::string call) { if(!n3fjp_socket) return; if (!n3fjp_connected) return; if (!n3fjp_calltab) return; std::string cmd0, cmd1, cmd2; cmd0.assign("CLEAR"); cmd1.assign("TXTENTRYCALL"); cmd1.append(call).append(""); cmd2.assign("CALLTAB"); try { n3fjp_send(cmd0, progdefaults.enable_N3FJP_log); n3fjp_send(cmd1, progdefaults.enable_N3FJP_log); n3fjp_send(cmd2, progdefaults.enable_N3FJP_log); n3fjp_calltab = false; n3fjp_wait = 100; } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); n3fjp_calltab = false; } catch (...) { throw; } } //====================================================================== // parse string containing value, e.g. // 14.01310 //====================================================================== static std::string ParseField(std::string &record, std::string fieldtag) { std::string fld_tag_start, fld_tag_end; fld_tag_start.assign("<").append(fieldtag).append(">"); fld_tag_end.assign(""); size_t p1 = record.find(fld_tag_start); if (p1 == std::string::npos) return ""; p1 += fld_tag_start.length(); size_t p2 = record.find(fld_tag_end, p1); if (p2 == std::string::npos) return ""; return record.substr(p1, p2 - p1); } //====================================================================== // parse string containing text entry values, e.g. // TXTENTRYCOUNTYRSaint Louis City //====================================================================== static std::string ParseTextField(std::string &record, std::string fieldtag) { std::string fld_tag_start; fld_tag_start.assign("TXTENTRY").append(fieldtag).append(""); size_t p1 = record.find(fld_tag_start); if (p1 == std::string::npos) return ""; size_t p2 = record.find("", p1); if (p2 == std::string::npos) return ""; p2 += strlen(""); size_t p3 = record.find("", p2); if (p3 == std::string::npos) return ""; return record.substr(p2, p3 - p2); } //====================================================================== // parse value contents // valuestring //====================================================================== static std::string ParseValueField(std::string field, std::string &record) { std::string start = "<"; start.append(field).append(">"); std::string endvalue = ""; size_t p1 = record.find(start); size_t p2 = record.find(endvalue, p1); if ((p1 == std::string::npos) || (p2 == std::string::npos) || (p2 < p1) ) return ""; p1 += start.length(); return record.substr(p1, p2 - p1); } static std::string ucasestr(std::string s) { for (size_t n = 0; n < s.length(); n++) s[n] = toupper(s[n]); return s; } //====================================================================== // //====================================================================== static void n3fjp_parse_data_stream(std::string buffer) { std::string field; field = ParseTextField(buffer, "NAMER"); if (!field.empty() && ucasestr(field) != ucasestr(inpName->value())) { for (size_t n = 1; n < field.length(); n++) field[n] = tolower(field[n]); } field = ParseTextField(buffer, "COUNTYR"); if (!field.empty() && field != inpCounty->value() && n3fjp_contest != FJP_NEQP && n3fjp_contest != FJP_7QP) field = ParseTextField(buffer, "STATE"); if (!field.empty() && field != inpState->value() && n3fjp_contest != FJP_NEQP && n3fjp_contest != FJP_7QP) field = ParseTextField(buffer, "COUNTRYWORKED"); if (!field.empty() && field != cboCountry->value()) field = ParseTextField(buffer, "GRID"); if (!field.empty() && field != inpLoc->value()) field = ParseTextField(buffer, "FREQUENCY"); if (!field.empty()) { adjust_freq(field); } field = ParseTextField(buffer, "CQZONE"); if (!field.empty() && field != inp_CQzone->value()) // comments field does not contain \n delimiters // substitute \n for each '-' field = ParseTextField(buffer, "COMMENTS"); if (!field.empty()) { size_t p = field.find(" - "); while (p != std::string::npos) { field.replace(p, 3, "\n"); p = field.find(" - "); } } } //====================================================================== // // ON6NB/P // 40 // SSB // PH // 7.20000 // Belgium // , etc etc. // //====================================================================== static void n3fjp_parse_calltab_event(std::string buffer) { // inpCall->value(ParseField(buffer, "CALL").c_str()); cboCountry->value(ParseField(buffer, "COUNTRY").c_str()); n3fjp_getfields(); } //====================================================================== // //====================================================================== std::string fmt_date(std::string date) { if (date.length() > 6) date.insert(6,"/"); if (date.length() > 4) date.insert(4,"/"); return date; } std::string fmt_time(std::string time) { if (time.length() > 4) time.insert(4,":"); if (time.length() > 2) time.insert(2,":"); return time; } std::string field_rec(std::string fld, std::string val) { std::string s; s.assign("<").append(fld).append(">"); s.append(val); s.append(""); return s; } static std::string n3fjp_tstmode() { if (!active_modem) return "PH"; if (active_modem->get_mode() == MODE_CW) return "CW"; if (active_modem->get_mode() == MODE_SSB) return "PH"; if (active_modem->get_mode() < MODE_SSB) return mode_info[active_modem->get_mode()].adif_name; return ""; } static std::string n3fjp_opmode() { if (!active_modem) return "PH"; if (active_modem->get_mode() == MODE_CW) return "CW"; if (active_modem->get_mode() == MODE_SSB) return "PH"; if (active_modem->get_mode() < MODE_SSB) return mode_info[active_modem->get_mode()].adif_name; return ""; } static std::string n3fjp_opband() { if (!active_modem) return ""; double freq = qsoFreqDisp->value(); freq /= 1e6; if (freq >= 1.8 && freq < 3.5) return "160"; if (freq >= 3.5 && freq < 5.3) return "80"; if (freq >= 5.3 && freq < 5.5) return "60"; if (freq >= 7.0 && freq < 7.5) return "40"; if (freq >= 14.0 && freq < 18.0) return "20"; if (freq >= 18.0 && freq < 21.0) return "17"; if (freq >= 21.0 && freq < 24.0) return "15"; if (freq >= 24.0 && freq < 28.0) return "12"; if (freq >= 28.0 && freq < 50.0) return "10"; if (freq >= 50.0 && freq < 70.0) return "6"; if (freq >= 144.0 && freq < 222.0) return "2"; if (freq >= 222.0 && freq < 420.0) return "222"; if (freq >= 420.0 && freq < 444.0) return "440"; return ""; } static std::string n3fjp_freq() { if (!active_modem) return ""; double freq = qsoFreqDisp->value(); if (progdefaults.N3FJP_modem_carrier) { if (ModeIsLSB(mode_info[active_modem->get_mode()].adif_name)) { freq -= active_modem->get_txfreq(); if (active_modem->get_mode() == MODE_RTTY) freq -= progdefaults.rtty_shift / 2; } else { freq += active_modem->get_txfreq(); if (active_modem->get_mode() == MODE_RTTY) freq += progdefaults.rtty_shift / 2; } } freq /= 1e6; char szfreq[20]; snprintf(szfreq, sizeof(szfreq), "%lf", freq); return szfreq; } static void send_control(const std::string ctl, std::string val) { std::string cmd; cmd.assign("TXTENTRY").append(ctl); cmd.append(""); cmd.append(val); cmd.append(""); try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); n3fjp_wait = 100; } catch (...) { throw; } } static void send_action(const std::string action) { std::string cmd; cmd.assign(""); cmd.append(action); cmd.append(""); try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); n3fjp_wait = 200;//100; } catch (...) { throw; } } static void send_command(const std::string command, std::string val) { std::string cmd; cmd.assign("<").append(command).append(">"); if (!val.empty()) cmd.append("").append(val).append(""); cmd.append(""); try { n3fjp_send(cmd, progdefaults.enable_N3FJP_log); // MilliSleep(5); n3fjp_wait = 100; } catch (...) { throw; } } static void n3fjp_send_NONE() { try { send_control("DATE", fmt_date(rec.getField(QSO_DATE))); send_control("TIMEON", fmt_time(rec.getField(TIME_ON))); send_control("TIMEOFF", fmt_time(rec.getField(TIME_OFF))); send_name(strip(rec.getField(NAME))); send_control("COMMENTS", strip(rec.getField(NOTES))); send_control("POWER", strip(rec.getField(TX_PWR))); send_state(rec.getField(STATE)); send_control("GRID", strip(rec.getField(GRIDSQUARE))); send_control("QTHGROUP", strip(rec.getField(QTH))); send_county(rec.getField(CNTY)); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // ARRL Field Day static void n3fjp_send_FD() { try { send_control("MODETST", n3fjp_tstmode()); send_control("CLASS", strip(ucasestr(rec.getField(CLASS)))); send_control("SECTION", strip(ucasestr(rec.getField(ARRL_SECT)))); } catch (...) { throw; } } // Winter Field Day static void n3fjp_send_WFD() { try { send_control("MODETST", n3fjp_tstmode()); send_control("CLASS", strip(ucasestr(rec.getField(CLASS)))); send_control("SECTION", strip(ucasestr(rec.getField(ARRL_SECT)))); } catch (...) { throw; } } // Kids Day static void n3fjp_send_KD() { try { send_name(rec.getField(NAME)); send_control("AGE", rec.getField(AGE)); std::string stprc = strip(ucasestr(rec.getField(STATE))); if (stprc.empty()) stprc = strip(ucasestr(rec.getField(VE_PROV))); if (stprc.empty()) stprc = strip(rec.getField(COUNTRY)); send_spcnum(stprc); send_control("COMMENTS", strip(rec.getField(XCHG1))); } catch (...) { throw; } } // ARRL Rookie Roundup static void n3fjp_send_ARR() { try { send_name(rec.getField(NAME)); send_control("CHECK", rec.getField(CHECK)); if (rec.getField(XCHG1)[0]) send_spcnum(strip(ucasestr(rec.getField(XCHG1)))); else send_spcnum(strip(ucasestr(rec.getField(COUNTRY)))); } catch (...) { throw; } } // ARRL RTTY static void n3fjp_send_RTTY() { try { if (rec.getField(SRX)[0]) send_spcnum(strip(rec.getField(SRX))); else if (rec.getField(STATE)[0]) send_spcnum(strip(ucasestr(rec.getField(STATE)))); else if (rec.getField(VE_PROV)[0]) send_spcnum(strip(ucasestr(rec.getField(VE_PROV)))); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // ARRL School Club Roundup static void n3fjp_send_ASCR() { try { send_name(strip(rec.getField(NAME))); send_control("CLASS", ucasestr(rec.getField(CLASS))); send_spcnum(ucasestr(rec.getField(XCHG1))); } catch (...) { throw; } } // ARRL Jamboree On The Air static void n3fjp_send_JOTA() { try { send_name(rec.getField(SCOUTR)); // received scout name send_control("NAMES", rec.getField(SCOUTS)); // sent scout name send_control("CHECK", rec.getField(TROOPR)); // received troop number send_control("TROOPS", rec.getField(TROOPS)); // sent troop number if (state_test(rec.getField(STATE))) send_spcnum(ucasestr(rec.getField(STATE))); else if (province_test(rec.getField(VE_PROV))) send_spcnum(ucasestr(rec.getField(VE_PROV))); else send_spcnum(rec.getField(COUNTRY)); // St / Pr / Cntry send_control("COMMENTS", rec.getField(NOTES)); } catch (...) { throw; } } // CQ WPX static void n3fjp_send_WPX() { try { send_call(rec.getField(CALL)); send_freq(n3fjp_freq()); send_band(n3fjp_opband()); send_mode(n3fjp_opmode()); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); send_control("SERIALNOR", strip(rec.getField(SRX))); } catch (...) { throw; } } // Italian ARI International DX static void n3fjp_send_IARI() { try { if (rec.getField(SRX)[0]) send_spcnum(rec.getField(SRX)); else send_spcnum(ucasestr(rec.getField(XCHG1))); // send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // North American Sprint static void n3fjp_send_NAS() { try { send_name(rec.getField(NAME)); send_control("SERIALNOR", strip(rec.getField(SRX))); send_spcnum(strip(ucasestr(rec.getField(XCHG1)))); } catch (...) { throw; } } // CQ World Wide RTTY static void n3fjp_send_CQWWRTTY() { try { send_control("CQZONE", strip(rec.getField(CQZ))); send_state(rec.getField(STATE)); send_control("COUNTRYWORKED", strip(rec.getField(COUNTRY))); } catch (...) { throw; } } // CQ World Wide DX static void n3fjp_send_CQWWDX() { try { send_control("CQZONE", strip(rec.getField(CQZ))); send_control("COUNTRYWORKED", strip(rec.getField(COUNTRY))); } catch (...) { throw; } } // Sweepstakes static void n3fjp_send_SS() { try { send_control("SERIALNOR", strip(rec.getField(SS_SERNO))); send_control("PRECEDENCE", strip(rec.getField(SS_PREC))); send_control("CHECK", strip(rec.getField(SS_CHK))); send_control("SECTION", strip(rec.getField(SS_SEC))); } catch (...) { throw; } } // North American QSO Party static void n3fjp_send_NAQP() { try { send_name(rec.getField(NAME)); if (strlen(rec.getField(XCHG1)) > 0) send_spcnum(ucasestr(rec.getField(XCHG1))); } catch (...) { throw; } } // Ten Ten static void n3fjp_send_1010() { try { send_name(rec.getField(NAME)); send_control("1010", rec.getField(TEN_TEN)); if (strlen(rec.getField(XCHG1)) > 0) send_spcnum(ucasestr(rec.getField(XCHG1))); } catch (...) { throw; } } // Africa International DX static void n3fjp_send_AIDX() { try { send_control("SERIALNOR", strip(rec.getField(SRX))); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // ARRL International DX (CW) static void n3fjp_send_AICW() { try { send_spcnum(rec.getField(XCHG1)); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } static void n3fjp_send_GENERIC() { try { send_control("SERIALNOR", strip(rec.getField(SRX))); send_spcnum(strip(ucasestr(rec.getField(XCHG1)))); } catch (...) { throw; } } static void n3fjp_send_VHF() { try { std::string grid = strip(rec.getField(GRIDSQUARE)); if (grid.length() > 4) grid.erase(4); send_control("GRID", grid); } catch (...) { throw; } } static void n3fjp_send_WAE() { try { send_control("SERIALNOR", strip(rec.getField(SRX))); send_control("COUNTRYWORKED", rec.getField(COUNTRY)); } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "MD SQP" "", "B", "B", "", "", "", "B", "" static void n3fjp_send_MDQSP() { try { if (rec.getField(XCHG1)[0]) send_control("CATEGORY", ucasestr(strip(rec.getField(XCHG1)))); send_county(strip(rec.getField(CNTY))); if (n3fjp_in_state) { send_county(ucasestr(strip(rec.getField(CNTY)))); if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "New Eng", "B", "B", "B", "", "I", "", "", "CCCSS" // MA, NH, VT, MA, CT, RI static void n3fjp_send_NEQP() { try { if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "7QP", "B", "B", "B", "", "I", "", "", "SSCCC" // AZ ID OR MT NV WA WY static void n3fjp_send_7QP() { static std::string st7QP = "AZ ID OR MT NV WA WY UT"; try { std::string st = rec.getField(STATE); std::string cnty = rec.getField(CNTY); if (cnty.length() == 5) { if (st7QP.find(cnty.substr(0,2)) != std::string::npos) st = cnty.substr(0,2); } send_spcnum(st); send_county(cnty); if (progdefaults.SQSOinstate && !st.empty()) { // in region if (st7QP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } else send_spcnum(st); } else { // out of region if (!st.empty() && st7QP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 1" "B", "B", "B", "", "I", "", "", "" //AL, AR, FL, GA, HI, IA, ID, IL, KS, KY, LA, MO, MI, ND, NJ, BC, 7QP static void n3fjp_send_QP1() { try { std::string st = rec.getField(STATE); if (st.empty()) st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); if (rec.getField(CNTY)[0]) { if (st == "BC") { // British Columbia Cstates cs; send_county(cs.cnty_short(st, rec.getField(CNTY))); } else send_county(rec.getField(CNTY)); } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 2" "B", "B", "B", "", "B", "", "", "" // MT, NE, NY, OH, OK, ON, SK, TN, TX, VT, WA, ME static void n3fjp_send_QP2() { try { if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 3" "", "B", "B", "B", "I", "", "", "" // AZ, CA, MI, PA, VI static void n3fjp_send_QP3() { try { if (n3fjp_in_state) { // in state log if (rec.getField(STATE)[0]) { send_spcnum(rec.getField(STATE)); // string county = states.county(rec.getField(STATE), rec.getField(CNTY)); // if (!county.empty()) if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); } else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); } else { // out of state log std::string county = rec.getField(CNTY); if (!county.empty()) // { send_county(county); // } else // send_county(rec.getField(CNTY)); // may be ARRL section } send_control("SERIALNOR", strip(rec.getField(SRX))); } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 4" "", "B", "B", "", "I", "B", "", "" // CO, MN, NM static void n3fjp_send_QP4() { try { // RST sent/rcvd not required, but will be accepted by logger if (n3fjp_in_state) { if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); if (rec.getField(NAME)[0]) send_name(rec.getField(NAME)); if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); } else { // std::string st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; // send_county(states.county(st, rec.getField(CNTY))); send_county(rec.getField(CNTY)); if (rec.getField(NAME)[0]) send_name(rec.getField(NAME)); } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 5" "B", "I", "B", "", "", "", "", "" // SC, WV static void n3fjp_send_QP5() { try { if (n3fjp_in_state) { if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); send_county(rec.getField(CNTY)); } else { send_county(rec.getField(CNTY)); } } catch (...) { throw; } } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 6" "B", "B", "B", "", "I", "", "", "" // NC, WI static void n3fjp_send_QP6() { try { if (n3fjp_in_state) { if (rec.getField(STATE)[0]) send_spcnum(rec.getField(STATE)); else if (rec.getField(VE_PROV)[0]) send_spcnum(rec.getField(VE_PROV)); else if (rec.getField(COUNTRY)[0]) send_spcnum(rec.getField(COUNTRY)); if (rec.getField(CNTY)[0]) send_county(rec.getField(CNTY)); } else { // send_county(states.county(rec.getField(STATE), rec.getField(CNTY))); send_county(rec.getField(CNTY)); } } catch (...) { throw; } } // check fields for duplicates // ARRL Field Day static void n3fjp_check_FD() { try { send_control("MODETST", n3fjp_tstmode()); send_control("CLASS", inpClass->value()); send_control("SECTION", inpSection->value()); } catch (...) { throw; } return; } // Winter Field Day static void n3fjp_check_WFD() { try { send_control("MODETST", n3fjp_tstmode()); send_control("CLASS", inpClass->value()); send_control("SECTION", inpSection->value()); } catch (...) { throw; } return; } // Kids Day static void n3fjp_check_KD() { try { send_name(inpName->value()); send_control("AGE", inp_KD_age->value()); send_spcnum(ucasestr(inpQTH->value())); send_control("COMMENTS", inpXchgIn->value()); } catch (...) { throw; } return; } // ARRL Rookie Roundup static void n3fjp_check_ARR() { try { send_name(inpName->value()); send_control("CHECK", inp_ARR_check->value()); if (inpXchgIn->value()[0]) send_spcnum(ucasestr(inpXchgIn->value())); else send_spcnum(ucasestr(cboCountry->value())); } catch (...) { throw; } return; } // ARRL RTTY static void n3fjp_check_RTTY() { try { if (inpSerNo->value()[0]) send_spcnum(inpSerNo->value()); else if (inpState->value()[0]) send_spcnum(ucasestr(inpState->value())); else if (inpVEprov->value()[0]) send_spcnum(ucasestr(ucasestr(inpVEprov->value()))); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // ARRL School Club Roundup static void n3fjp_check_ASCR() { try { send_name(inpName->value()); send_spcnum(inpXchgIn->value()); send_control("CLASS", ucasestr(inpClass->value())); } catch (...) { throw; } return; } // ARRL Jamboree On The Air static void n3fjp_check_JOTA() { try { send_name(inpName->value()); send_control("CHECK", rec.getField(TROOPR)); // received troop number send_control("TROOPS", inp_JOTA_troop->value()); // sent troop number if (state_test(inpState->value())) send_spcnum(inpState->value()); else if (province_test(inpVEprov->value())) send_spcnum(inpVEprov->value()); else send_spcnum(ucasestr(cboCountry->value())); // St / Pr / Cntry send_control("CHECK", inp_JOTA_troop->value()); } catch (...) { throw; } return; } // CQ WPX static void n3fjp_check_WPX() { try { send_control("COUNTRYWORKED", cboCountry->value()); send_control("SERIALNOR", inpSerNo->value()); // send_control("CHECK", inpXchgIn->value()); } catch (...) { throw; } return; } // Italian ARI International DX static void n3fjp_check_IARI() { try { if (inpSerNo->value()[0]) send_spcnum(inpSerNo->value()); else send_spcnum(inpXchgIn->value()); // send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // North American Sprint static void n3fjp_check_NAS() { try { send_name(inpName->value()); send_control("SERIALNOR", inpSerNo->value()); send_spcnum(inpXchgIn->value()); } catch (...) { throw; } return; } // CQ World Wide RTTY static void n3fjp_check_CQWWRTTY() { try { send_control("CQZONE", inp_CQzone->value()); send_state(inpState->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // CQ World Wide DX static void n3fjp_check_CQWWDX() { try { send_control("CQZONE", inp_CQzone->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // Sweepstakes static void n3fjp_check_SS() { try { send_control("SERIALNOR", inpSerNo->value()); send_control("PRECEDENCE", inp_SS_Precedence->value()); send_control("CHECK", inp_SS_Check->value()); send_control("SECTION", inp_SS_Section->value()); } catch (...) { throw; } return; } // North American QSO Party static void n3fjp_check_NAQP() { try { send_name(inpName->value()); send_spcnum(inpXchgIn->value()); } catch (...) { throw; } return; } // Ten Ten static void n3fjp_check_1010() { try { send_name(inpName->value()); send_control("1010", inp_1010_nr->value()); send_spcnum(inpXchgIn->value()); } catch (...) { throw; } return; } // Africa International DX static void n3fjp_check_AIDX() { try { send_control("SERIALNOR", inpSerNo->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // ARRL International DX (CW) static void n3fjp_check_AICW() { try { send_spcnum(inpSPCnum->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } static void n3fjp_check_GENERIC() { try { send_control("SERIALNOR", inpSerNo->value()); send_spcnum(ucasestr(inpXchgIn->value())); } catch (...) { throw; } return; } static void n3fjp_check_VHF() { try { std::string grid = inpLoc->value(); if (grid.length() > 4) grid.erase(4); send_control("GRID", grid); } catch (...) { throw; } return; } static void n3fjp_check_WAE() { try { send_control("SERIALNOR", inpSerNo->value()); send_control("COUNTRYWORKED", cboCountry->value()); } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "MD SQP" "", "B", "B", "", "", "", "B", "" static void n3fjp_check_MDQSP() { try { send_county(inpCounty->value()); if (inpSQSO_category->value()[0]) send_control("CATEGORY", inpSQSO_category->value()); if (n3fjp_in_state) { if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (cboCountry->value()[0]) send_spcnum(cboCountry->value()); } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "New Eng", "B", "B", "B", "", "I", "", "", "CCCSS" // MA, NH, VT, MA, CT, RI static void n3fjp_check_NEQP() { static std::string stNEQP = "CT MA ME NH RI VT"; try { std::string st = inpState->value(); std::string cnty = inpCounty->value(); if (cnty.length() == 5) { if (stNEQP.find(cnty.substr(cnty.length() - 3, 2)) != std::string::npos) st = cnty.substr(cnty.length() - 3, 2); } if (progdefaults.SQSOinstate && !st.empty()) { // in region if (stNEQP.find(st) != std::string::npos) { if(!cnty.empty()) send_county(cnty); send_spcnum(st); } else send_spcnum(st); } else { // out of region if (!st.empty() && stNEQP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "7QP", "B", "B", "B", "", "I", "", "", "SSCCC" // AZ ID OR MT NV WA WY static void n3fjp_check_7QP() { try { static std::string st7QP = "AZ ID OR MT NV WA WY UT"; std::string st = inpState->value(); std::string cnty = inpCounty->value(); if (cnty.length() == 5 && !inpState->value()[0]) { if (st7QP.find(cnty.substr(0,2)) != std::string::npos) st = cnty.substr(0,2); } if (progdefaults.SQSOinstate && !st.empty()) { // in region if (st7QP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } else send_spcnum(st); } else { // out of region if (!st.empty() && st7QP.find(st) != std::string::npos) { if (!cnty.empty()) send_county(cnty); send_spcnum(st); } } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 1" "B", "B", "B", "", "I", "", "", "" //AL, AR, FL, GA, HI, IA, ID, IL, IN, KS, KY, LA, MO, MI, ND, NJ, BC, 7QP static void n3fjp_check_QP1() { try { std::string st = inpState->value(); std::string cntry = cboCountry->value(); if (st.empty()) st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (inpState->value()[0]) send_spcnum(inpState->value()); if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); if (!cntry.empty() && cntry != "USA") send_spcnum(cboCountry->value()); if (inpCounty->value()[0]) { if (st == "BC" ) { // British Columbia Cstates cs; send_county(cs.cnty_short("BC", inpCounty->value())); } else send_county(inpCounty->value()); } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 2" "B", "B", "B", "", "B", "", "", "" // MT, NE, NY, OH, OK, ON, SK, TN, TX, VT, WA, ME static void n3fjp_check_QP2() { try { if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (cboCountry->value()[0]) send_spcnum(cboCountry->value()); if (inpCounty->value()[0]) send_county(inpCounty->value()); } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 3" "", "B", "B", "B", "I", "", "", "" // AZ, CA, MI, PA, VI static void n3fjp_check_QP3() { try { if (n3fjp_in_state) { if (inpState->value()[0]) { send_spcnum(inpState->value()); // std::string county = states.county(inpState->value(), inpCounty->value()); // if (!county.empty()) // send_county(county); } if (inpCounty->value()[0]) send_county(inpCounty->value()); if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); if (cboCountry->value()[0] && (strcmp(cboCountry->value(), "USA") != 0)) send_spcnum(cboCountry->value()); } else { // std::string stsh = states.state_short(inpState->value()); // std::string county = states.county(stsh, inpCounty->value()); // if (!county.empty()) { // send_county(county); // } else if (inpCounty->value()[0]) send_county(inpCounty->value()); } send_control("SERIALNOR", inpSerNo->value()); } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 4" "", "B", "B", "", "I", "B", "", "" // CO, MN, NM /* N3FJP's Colorado QSO Party Contest Log TXTENTRYSPCNUM TXTENTRYNAMER TXTENTRYCOUNTYR TXTENTRYCALL LBLDIALOGUEReady to begin! */ static void n3fjp_check_QP4() { try { if (n3fjp_in_state) { std::string cntry = cboCountry->value(); if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (!cntry.empty() && cntry != "USA") send_county(inpCounty->value()); if (inpCounty->value()[0]) send_county(inpCounty->value()); if (inpName->value()[0]) send_name(inpName->value()); } else { std::string st = QSOparties.qso_parties[progdefaults.SQSOcontest].state; // send_county(states.county(st, inpCounty->value())); send_county(inpCounty->value()); if (inpName->value()[0]) send_name(inpName->value()); } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 5" "B", "I", "B", "", "", "", "", "" // SC, WV static void n3fjp_check_QP5() { try { if (n3fjp_in_state) { if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (cboCountry->value()[0]) send_spcnum(cboCountry->value()); if (inpCounty->value()[0]) send_county(inpCounty->value()); }else { send_county(inpCounty->value()); } } catch (...) { throw; } return; } // "QSO Party","rRST","rST","rCNTY","rSER","rXCHG","rNAM","rCAT","STCTY" // "QSOP 6" "B", "B", "B", "", "I", "", "", "" // NC, WI static void n3fjp_check_QP6() { try { if (n3fjp_in_state) { if (inpCounty->value()[0]) send_county(inpCounty->value()); if (inpState->value()[0]) send_spcnum(inpState->value()); else if (inpVEprov->value()[0]) send_spcnum(inpVEprov->value()); else if (cboCountry->value()[0]) send_spcnum(cboCountry->value()); } else { // send_county(states.county(inpState->value(), inpCounty->value())); send_county(inpCounty->value()); } } catch (...) { throw; } return; } static void check_log_data() { try{ switch (n3fjp_contest) { case FJP_FD: n3fjp_check_FD(); break; case FJP_WFD: n3fjp_check_WFD(); break; case FJP_KD: n3fjp_check_KD(); break; case FJP_ARR: n3fjp_check_ARR(); break; case FJP_RTTY: n3fjp_check_RTTY(); break; case FJP_ASCR: n3fjp_check_ASCR(); break; case FJP_JOTA: n3fjp_check_JOTA(); break; case FJP_CQ_WPX: n3fjp_check_WPX(); break; case FJP_IARI: n3fjp_check_IARI(); break; case FJP_NAS: n3fjp_check_NAS(); break; case FJP_CQWWRTTY: n3fjp_check_CQWWRTTY(); break; case FJP_CQWWDX: n3fjp_check_CQWWDX(); break; case FJP_SS: n3fjp_check_SS(); break; case FJP_NAQP: n3fjp_check_NAQP(); break; case FJP_1010: n3fjp_check_1010(); break; case FJP_AIDX: n3fjp_check_AIDX(); break; case FJP_AICW: n3fjp_check_AICW(); break; case FJP_VHF: n3fjp_check_VHF(); break; case FJP_WAE: n3fjp_check_WAE(); break; case FJP_MDQP: n3fjp_check_MDQSP(); break; case FJP_7QP: n3fjp_check_7QP(); break; case FJP_NEQP: n3fjp_check_NEQP(); break; case FJP_QP1: n3fjp_check_QP1(); break; case FJP_QP2: n3fjp_check_QP2(); break; case FJP_QP3: n3fjp_check_QP3(); break; case FJP_QP4: n3fjp_check_QP4(); break; case FJP_QP5: n3fjp_check_QP5(); break; case FJP_QP6: n3fjp_check_QP6(); break; case FJP_ACL: case FJP_NONE: default: n3fjp_check_GENERIC(); } } catch (...) { throw; } } int n3fjp_dupcheck() { guard_lock rx_lock(&n3fjp_mutex); std::string chkcall = inpCall->value(); if (chkcall.length() < 3) return false; if ((chkcall.length() == 3) && isdigit(chkcall[2])) return false; std::string cmd; try { send_call(chkcall); send_band(strip(n3fjp_opband())); send_mode(n3fjp_tstmode()); n3fjp_sendRSTS(inpRstOut->value()); n3fjp_sendRSTR(inpRstIn->value()); check_log_data(); send_action("CALLTAB"); } catch (...) { throw; } return 0; } static void send_log_data() { send_call(rec.getField(CALL)); send_band(strip(n3fjp_opband())); send_freq(n3fjp_freq()); send_mode(n3fjp_opmode()); n3fjp_sendRSTS(rec.getField(RST_SENT)); n3fjp_sendRSTR(rec.getField(RST_RCVD)); try { switch (n3fjp_contest) { case FJP_NONE: n3fjp_send_NONE(); break; case FJP_FD: n3fjp_send_FD(); break; case FJP_WFD: n3fjp_send_WFD(); break; case FJP_KD: n3fjp_send_KD(); break; case FJP_ARR: n3fjp_send_ARR(); break; case FJP_RTTY: n3fjp_send_RTTY(); break; case FJP_ASCR: n3fjp_send_ASCR(); break; case FJP_JOTA: n3fjp_send_JOTA(); break; case FJP_CQ_WPX: n3fjp_send_WPX(); break; case FJP_IARI: n3fjp_send_IARI(); break; case FJP_NAS: n3fjp_send_NAS(); break; case FJP_CQWWRTTY: n3fjp_send_CQWWRTTY(); break; case FJP_CQWWDX: n3fjp_send_CQWWDX(); break; case FJP_SS: n3fjp_send_SS(); break; case FJP_NAQP: n3fjp_send_NAQP(); break; case FJP_1010: n3fjp_send_1010(); break; case FJP_AIDX: n3fjp_send_AIDX(); break; case FJP_AICW: n3fjp_send_AICW(); break; case FJP_VHF: n3fjp_send_VHF(); break; case FJP_WAE: n3fjp_send_WAE(); break; case FJP_MDQP: n3fjp_send_MDQSP(); break; case FJP_7QP: n3fjp_send_7QP(); break; case FJP_NEQP: n3fjp_send_NEQP(); break; case FJP_QP1: n3fjp_send_QP1(); break; case FJP_QP2: n3fjp_send_QP2(); break; case FJP_QP3: n3fjp_send_QP3(); break; case FJP_QP4: n3fjp_send_QP4(); break; case FJP_QP5: n3fjp_send_QP5(); break; case FJP_QP6: n3fjp_send_QP6(); break; case FJP_ACL: n3fjp_send_NONE(); break; default: n3fjp_send_GENERIC(); break; } send_command("NEXTSERIALNUMBER"); } catch (...) { throw; } } static void enter_log_data() { try { send_log_data(); send_action("ENTER"); // if (n3fjp_contest != FJP_SS) { // std::string other = "XCVR:"; // char szfreq[6]; // snprintf(szfreq, sizeof(szfreq), "%d", (int)active_modem->get_txfreq()); // other.append(ModeIsLSB(rec.getField(ADIF_MODE)) ? "LSB" : "USB"); // other.append(" MODE:"); // other.append(strip(rec.getField(ADIF_MODE))); // other.append(" WF:"); // other.append(szfreq); // send_control("OTHER8", other); // } } catch (...) { throw; } } static void send_data() { try { send_command("IGNORERIGPOLLS", "TRUE"); enter_log_data(); send_command("IGNORERIGPOLLS", "FALSE"); } catch (...) { throw; } } static void send_data_norig() { try { std::string cmd; send_call(rec.getField(CALL)); cmd = ""; cmd.append("").append(n3fjp_opband()).append(""); cmd.append("").append(n3fjp_opmode()).append(""); cmd.append(""); n3fjp_send(cmd, progdefaults.enable_N3FJP_log); enter_log_data(); } catch (...) { throw; } } void n3fjp_get_freq() { try { send_command("READBMF"); } catch (...) { throw; } } void do_n3fjp_add_record_entries() { if(!n3fjp_socket) return; if (!n3fjp_connected) return; std::string cmd, response, val; try { if (xcvr_controller == N3FJP) send_data(); else send_data_norig(); } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); throw e; } n3fjp_bool_add_record = false; } // Setting band and frequency values is done in a non-time-aligned way. We have to do // some unintuitive things to prevent a freq change on the fldigi side (when fldigi is // using N3FJP for rig control) from getting overwritten by a response message from // N3 with inconsistent data; i.e., reflecting the band change without reflecting the // frequency change. Ideally we would atomically set freq / band / mode so that a click // on the fldigi frequency list would set all three simultaneously in N3. However ... // 1. We have to notify N3 of a band change, but N3 will respond with the new band // and the old frequency - so we need to discard that response. // 2. We have to notify N3 of a frequency change. We never need to process the // response and should discard it but it signals the end point of the update transaction // so we can use it to re-enable polling. // 3. We always need to wrap this sequence with IGNORERIGPOLLS because we do not want // stale information coming back asynchronously from rig polling during this exchange. void n3fjp_set_freq(unsigned long long f) { if (!active_modem) return; if (xcvr_controller == UNKNOWN) return; std::string cmd; char szfreq[20]; snprintf(szfreq, sizeof(szfreq), "%.6lf", ((double)f)/1000000.0); // "tracked" holds a record of what we last sent to save a transmission if it hasn't changed if (tracked_freq != szfreq) { tracked_freq = szfreq; if (xcvr_controller == FLDIGI) { cmd = ""; cmd.append(tracked_freq); cmd.append(""); cmd.append(n3fjp_opmode()); cmd.append(""); n3fjp_send(cmd, progdefaults.enable_N3FJP_log); } else { if (xcvr_controller == N3FJP) { // Disable polling for the freq change transaction. cmd = "TRUE"; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); polling_enabled = false; cmd = ""; cmd.append("").append(n3fjp_opband()).append(""); cmd.append("").append(n3fjp_opmode()).append(""); cmd.append(""); n3fjp_send(cmd, progdefaults.enable_N3FJP_log); cmd = ""; cmd.append(szfreq); cmd.append("TRUE"); n3fjp_send(cmd, progdefaults.enable_N3FJP_log); } } } return; } void n3fjp_set_ptt(int on) { if (xcvr_controller != N3FJP) return; std::string cmd = ""; if (on) { if (progdefaults.enable_N3FJP_RIGTX) cmd.append(""); else cmd.append(""); } else { if (progdefaults.enable_N3FJP_RIGTX) cmd.append(""); else cmd.append(""); } cmd.append(""); { guard_lock send_lock(&send_this_mutex); send_this = cmd; } } void n3fjp_add_record(cQsoRec &record) { if (!n3fjp_connected) return; rec = record; n3fjp_bool_add_record = true; } std::string n3fjp_serno = ""; void n3fjp_parse_next_serial(std::string buff) { n3fjp_serno = ParseValueField("NEXTSERIALNUMBERRESPONSE", buff); updateOutSerNo(); } //====================================================================== // //====================================================================== void n3fjp_parse_response(std::string tempbuff) { if (tempbuff.empty()) return; size_t p1 = std::string::npos, p2 = std::string::npos; if (tempbuff.find("RIGRESPONSE") != std::string::npos) { size_t p0 = tempbuff.find(""); if (p0 != std::string::npos) { p0 += strlen(""); std::string rigname = tempbuff.substr(p0); p0 = rigname.find(""); if (p0 != std::string::npos) { rigname.erase(p0); if (rigname != "None" && rigname != "Client API") { xcvr_controller = N3FJP; send_command("READBMF"); n3fjp_rcv_data(); // Need the recursive call here; have to resolve N3FJP's response // before returning to the thread loop to avoid a freq-setting // loop with the n3fjp_set_freq call. } else { xcvr_controller = FLDIGI; // n3fjp_set_freq(qsoFreqDisp->value()); } } } } // Regardless of which entity is controlling the rig, if a user changes // the frequency on any app we want the other apps to reflect the change. // The 'CHANGEFREQ' message is sent by N3FJP for any user-commanded frequency // change (i.e., via the Ctrl-F Frequency Dialog or entering a freq into // the Callsign box) or clicking on a spot regardless of which app is in control. if ((p1 = tempbuff.find("")) != std::string::npos) { p1 += strlen(""); p2 = tempbuff.find("", p1); if (p2 == std::string::npos) return; std::string sfreq = tempbuff.substr(p1, p2 - p1); REQ(adjust_freq, sfreq); } // If n3 is in control, a change at the radio is reported via an unsolicited READBMF "response". // However, we also get this message if fldigi sent the CHANGEBM/CHANGEFREQ command set // associated with an fldigi-initiated frequency change. In that case, we need to // ignore the overloaded READBMFRESPONSE result from that exchange and we // need to re-enable the poll responses we had to suppress during this action. // Ideally the N3FJP API response to the CHANGEBM command would be named CHANGEBMRESPONSE and contain // only band and mode (not frequency). That would be consistent with the rest of the N3FJP API and // would distinguish it from the unsolicited READBMFRESPONSE that is generated from a rig-poll cycle. if (xcvr_controller == N3FJP) { if (tempbuff.find("") != std::string::npos) { if (polling_enabled == true) { // This RBMF response due to a rig poll std::string sfreq = ParseField(tempbuff, "FREQ"); REQ(adjust_freq, sfreq); } } if (tempbuff.find("") != std::string::npos) { std::string cmd = "FALSE"; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); polling_enabled = true; } } if (tempbuff.find("") != std::string::npos) { n3fjp_rxbuffer = tempbuff; REQ(n3fjp_parse_calltab_event, tempbuff); } if (tempbuff.find("ALLFIELDSWVRESPONSE") != std::string::npos) { REQ(n3fjp_parse_data_stream, tempbuff); } if (tempbuff.find("") != std::string::npos) { send_command("NEXTSERIALNUMBER"); } if (tempbuff.find("") != std::string::npos) { REQ(n3fjp_parse_next_serial, tempbuff); } if (tempbuff.find("CALLTABDUPEEVENT") != std::string::npos && tempbuff.find("Duplicate") != std::string::npos) { if (tempbuff.find("Possible") != std::string::npos) REQ(show_dup, (void*)2); else REQ(show_dup, (void*)1); } } //====================================================================== // //====================================================================== void n3fjp_rcv_data() { std::string tempbuff = ""; try { n3fjp_rcv(tempbuff, progdefaults.enable_N3FJP_log); n3fjp_parse_response(tempbuff); } catch (const SocketException& e) { result.str(""); result << "n3fjp_rcv_data()::failed " << e.error() << " " << e.what(); n3fjp_print(result.str()); throw e; } catch (...) { throw; } } static int logger_nbr = 0; inline bool match(std::string s1, std::string s2) { return (s1.find(s2) != std::string::npos || s2.find(s1) != std::string::npos); } static void select_fldigi_logging() { // check for specific contest size_t n = 0; std::string logger = n3fjp_logger[logger_nbr].program; n3fjp_print(std::string("logger: ").append(logger)); if (logger == "Amateur Contact Log") { listbox_contest->index(0); progdefaults.logging = 0; UI_select(); return; } if ((n = logger.find("Jamboree") != std::string::npos)) { logger.insert(0, "ARRL "); } if (logger.find("CQ WW DX RTTY") != std::string::npos) logger = "WW DX RTTY"; progdefaults.CONTESTnotes = ""; for (int n = 2; !contests[n].name.empty(); n++) { if (match(contests[n].name, logger)) { progdefaults.logging = n; listbox_contest->index(n); listbox_QP_contests->index(0); UI_select(); progdefaults.CONTESTnotes = contests[progdefaults.logging].notes; inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); n3fjp_print(std::string("found: ").append(contests[n].name)); return; } } n3fjp_print(std::string("Check for SQSO: ").append(logger)); if ((n = logger.find("QP Contest Log")) != std::string::npos) { logger.erase(n + 2, 12); progdefaults.logging = LOG_SQSO; listbox_contest->index(progdefaults.logging); n3fjp_print(std::string("Out of state SQSO log: ").append(logger)); } else if ((n = logger.find(" QSO Party Contest Log")) != std::string::npos) { logger.erase(n + 10); progdefaults.logging = LOG_SQSO; listbox_contest->index(progdefaults.logging); n3fjp_print(std::string("In state SQSO log: ").append(logger)); } for (n = 1; QSOparties.qso_parties[n].contest[0]; n++) { if (logger == QSOparties.qso_parties[n].contest) { n3fjp_print(std::string("QSOparty: ").append(QSOparties.qso_parties[n].contest)); progdefaults.SQSOcontest = n; listbox_QP_contests->index(progdefaults.SQSOcontest - 1); inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); progdefaults.CONTESTnotes = QSOparties.qso_parties[progdefaults.SQSOcontest].notes; adjust_for_contest(0); } } inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); UI_select(); clearQSO(); return; } static void fldigi_no_contest() { progdefaults.SQSOcontest = 0;//1; progdefaults.logging = 0; adjust_for_contest(0); UI_select(); set_log_colors(); clearQSO(); listbox_contest->index(0); } static int connect_tries = 0; static bool connect_to_n3fjp_server() { try { n3fjp_serno.clear(); if (!n3fjp_connected) n3fjp_socket->connect(); if (!n3fjp_socket->is_connected()) { MilliSleep(200); n3fjp_socket->connect(); if (!n3fjp_socket->is_connected()) { if (!connect_tries--) { result.str(""); result << "Cannot connect to server: " << n3fjp_socket->fd(); n3fjp_print(result.str()); connect_tries = 20; } return false; } result.str(""); result << "connected to n3fjp server: " << n3fjp_socket->fd(); n3fjp_print(result.str()); connect_tries = 0; } std::string buffer; std::string cmd = ""; n3fjp_send(cmd, true); buffer.clear(); size_t n; for (n = 0; n < 10; n++) { n3fjp_rcv(buffer, true); if (!buffer.empty()) break; } if (buffer.empty()) { n3fjp_print("N3FJP logger not responding"); return false; } std::string info = ParseField(buffer, "PGM"); connected_to = info; n3fjp_contest = FJP_NONE; n = info.find("N3FJP's "); if (n != std::string::npos) info.erase(n, 8); if (info.find("Winter") != std::string::npos) info = "Winter FD"; n3fjp_print(std::string("Info: ").append(info)); for (n = 0; n < sizeof(n3fjp_logger) / sizeof(*n3fjp_logger); n++) { if (info.find(n3fjp_logger[n].program) == 0) { n3fjp_contest = n3fjp_logger[n].contest; n3fjp_in_state = n3fjp_logger[n].in_state; logger_nbr = n; REQ(select_fldigi_logging); break; } } if (n == sizeof(n3fjp_logger) / sizeof(*n3fjp_logger)) { n3fjp_print(std::string(info).append(" not supported by fldigi")); return false; } else n3fjp_print(std::string("Connected to: ").append(n3fjp_logger[n].program)); send_command("NEXTSERIALNUMBER"); info.insert(0, "Connected to "); std::string ver = ParseField(buffer, "VER"); info.append(", Ver ").append(ver); n3fjp_connected = true; REQ(set_connect_box); cmd = " "; n3fjp_send(cmd, true); buffer.clear(); n3fjp_rcv(buffer, true); cmd = "TRUE"; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); cmd = ""; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); cmd = ""; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); cmd = ""; n3fjp_send(cmd, progdefaults.enable_N3FJP_log); cmd = "RIGENABLED"; send_command(cmd); } catch (const SocketException& e) { result.str(""); result << e.what() << "(" << e.error() << ")"; n3fjp_print(result.str()); connected_to.clear(); LOG_ERROR("%s", result.str().c_str()); } catch (...) { n3fjp_print("Caught unknown error"); LOG_ERROR("%s", "Caught unknown error"); connected_to.clear(); } return true; } //====================================================================== // //====================================================================== void n3fjp_start() { n3fjp_ip_address = progdefaults.N3FJP_address; n3fjp_ip_port = progdefaults.N3FJP_port; try { if (n3fjp_socket) delete n3fjp_socket; n3fjp_socket = new Socket( Address( n3fjp_ip_address.c_str(), n3fjp_ip_port.c_str(), "tcp") ); if (!n3fjp_socket) return; n3fjp_socket->set_timeout(0.20);//0.05); n3fjp_socket->set_nonblocking(true); result.str(""); result << "Client socket " << n3fjp_socket->fd(); n3fjp_print(result.str()); } catch (const SocketException& e) { result.str(""); result << e.what() << "(" << e.error() << ")"; n3fjp_print(result.str()); LOG_ERROR("%s", result.str().c_str() ); delete n3fjp_socket; n3fjp_socket = 0; n3fjp_connected = false; REQ(set_connect_box); xcvr_controller = UNKNOWN; } catch (...) { n3fjp_print("Caught unknown error"); n3fjp_print(result.str()); LOG_ERROR("%s", result.str().c_str() ); delete n3fjp_socket; n3fjp_socket = 0; n3fjp_connected = false; REQ(set_connect_box); xcvr_controller = UNKNOWN; } } //====================================================================== // Disconnect from N3FJP tcpip server //====================================================================== void n3fjp_disconnect(bool clearlog) { if (n3fjp_socket) { n3fjp_send("", false);//progdefaults.enable_N3FJP_log); delete n3fjp_socket; n3fjp_socket = 0; } n3fjp_connected = false; xcvr_controller = UNKNOWN; n3fjp_serno.clear(); connected_to.clear(); REQ(set_connect_box); if (clearlog) REQ(fldigi_no_contest); n3fjp_print("Disconnected"); } //====================================================================== // Thread loop //====================================================================== void *n3fjp_loop(void *args) { SET_THREAD_ID(N3FJP_TID); int loopcount = 9; int n3fjp_looptime = 100; // initially 0.1 second delay to connect while(1) { if (n3fjp_exit) break; MilliSleep(10); if (n3fjp_wait) n3fjp_wait -= 10; if (n3fjp_looptime) n3fjp_looptime -= 10; if (n3fjp_wait > 0) continue; if (n3fjp_looptime > 0) continue; n3fjp_looptime = 250; // r/w to N3FJP logger every 1/4 second loopcount = (loopcount + 1) % 10; if (progdefaults.connect_to_n3fjp) { if (!n3fjp_socket || (n3fjp_socket->fd() == -1)) n3fjp_start(); else { if ((n3fjp_ip_address != progdefaults.N3FJP_address) || (n3fjp_ip_port != progdefaults.N3FJP_port) ) { n3fjp_disconnect(true); n3fjp_start(); } if (!n3fjp_connected) { if (loopcount == 0) if (!connect_to_n3fjp_server()) n3fjp_disconnect(false); } else try { // insure connection still up (2.5 second interval) if (loopcount == 0) { guard_lock send_lock(&send_this_mutex); std::string buffer; std::string cmd = ""; n3fjp_send(cmd, false); size_t n; for (n = 0; n < 10; n++) { n3fjp_rcv(buffer, false); if (!buffer.empty()) break; } if (buffer.empty()) { n3fjp_print(std::string("Lost server connection to ").append(connected_to)); n3fjp_disconnect(true); continue; } } if (!qsoFreqDisp->numeric_entry_mode()) n3fjp_set_freq(qsoFreqDisp->value()); if (!send_this.empty()) { guard_lock send_lock(&send_this_mutex); n3fjp_send(send_this, progdefaults.enable_N3FJP_log); send_this.clear(); } else if (n3fjp_bool_add_record) do_n3fjp_add_record_entries(); else { guard_lock rx_lock(&n3fjp_mutex); n3fjp_rcv_data(); } } catch (const SocketException& e) { result.str(""); result << "Error: " << e.error() << ", " << e.what(); n3fjp_print(result.str()); n3fjp_disconnect(true); } catch (...) { n3fjp_print("Caught unknown error"); n3fjp_disconnect(true); } } } else if (n3fjp_connected) n3fjp_disconnect(true); } // exit the n3fjp thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== void n3fjp_init(void) { n3fjp_enabled = false; n3fjp_exit = false; if (pthread_create(&n3fjp_thread, NULL, n3fjp_loop, NULL) < 0) { LOG_ERROR("pthread_create failed"); return; } LOG_INFO("N3FJP logger thread started"); pathname = DebugDir; pathname.append("n3fjp_data_stream.txt"); rotate_log(pathname); FILE *n3fjplog = fl_fopen(pathname.c_str(), "w"); fprintf(n3fjplog, "N3FJP / fldigi tcpip log\n\n"); fclose(n3fjplog); n3fjp_enabled = true; } //====================================================================== // //====================================================================== void n3fjp_close(void) { if (!n3fjp_enabled) return; guard_lock close_lock(&n3fjp_socket_mutex); n3fjp_exit = true; CANCEL_THREAD(n3fjp_thread); pthread_join(n3fjp_thread, NULL); n3fjp_enabled = false; LOG_INFO("%s", "N3FJP logger thread terminated. "); if(n3fjp_socket) { delete n3fjp_socket; n3fjp_socket = 0; } } /* FLDIGI log fields FREQ QSO frequency in Mhz CALL contacted stations CALLSIGN MODE QSO mode NAME contacted operators NAME QSO_DATE QSO date QSO_DATE_OFF QSO date OFF, according to ADIF 2.2.6 TIME_OFF HHMM or HHMMSS in UTC TIME_ON HHMM or HHMMSS in UTC QTH contacted stations city RST_RCVD received signal report RST_SENT sent signal report STATE contacted stations STATE VE_PROV 2 letter abbreviation for Canadian Province NOTES QSO notes QSLRDATE QSL received date QSLSDATE QSL sent date EQSLRDATE EQSL received date EQSLSDATE EQSL sent date LOTWRDATE EQSL received date LOTWSDATE EQSL sent date GRIDSQUARE contacted stations Maidenhead Grid Square BAND QSO band CNTY secondary political subdivision, ie: county COUNTRY contacted stations DXCC entity name CQZ contacted stations CQ Zone DXCC contacted stations Country Code QSL_VIA contacted stations QSL manager IOTA Islands on the air ITUZ ITU zone CONT contacted stations continent SRX received serial number for a contest QSO STX QSO transmitted serial number XCHG1 contest exchange received MYXCHG contest exchange sent CLASS Field Day class received ARRL_SECT Field Day section received TX_PWR power transmitted by this station OP_CALL Callsign of person logging the QSO STA_CALL Callsign of transmitting station MY_GRID Xmt station locator MY_CITY Xmt station city SS_SEC CW sweepstakes section SS_SERNO CW sweepstakes serial number received SS_PREC CW sweepstakes precedence SS_CHK CW sweepstakes check AGE contacted operators age in years TEN_TEN contacted stations ten ten # CHECK contacted stations contest identifier |-------------------------------------------------------------| | N3FJP field | FLDIGI LOG FIELD | |--------------------------------|----------------------------| | txtEntry1010 | rec.getField(TEN_TEN) | | txtEntryCall | rec.getField(CALL) | | txtEntryCheck (Rookie Roundup) | rec.getField(CHECK) | | txtEntryCheck (1010 ??) ) | rec.getField(CHECK) | | txtEntryClass | rec.getField(CLASS) | | txtEntryCountyR | rec.getField(CNTY) | | txtEntryGrid | rec.getField(GRIDSQUARE) | | txtEntryNameR | rec.getField(NAME) | | txtEntryRSTR | rec.getField(RST_RCVD) | | txtEntryRSTS | rec.getField(RST_SENT) | | txtEntrySection | rec.getField(ARRL_SECT) | | txtEntrySection | rec.getField(SS_SEC) | | txtEntrySerialNoT | rec.getField(STX) | | txtEntrySerialNoR | rec.getField(SRX) | | txtEntrySpcNum | rec.getField(XCHG1) | | txtEntryState | rec.getField(STATE) | | txtEntryState | rec.getField(VE_PROV) ?? | |-------------------------------------------------------------| Use this command to query N3FJP logger to find which fields are visible for any given program. TXTENTRYCOUNTYR TXTENTRYSTATE TXTENTRYCOUNTRYWORKED TXTENTRYMODE TXTENTRYBAND TXTENTRYDATE TXTENTRYTIMEOFF TXTENTRYTIMEON TXTENTRYRSTS TXTENTRYRSTR TXTENTRYPOWER TXTENTRYOTHER1 TXTENTRYNAMER TXTENTRYFREQUENCY TXTENTRYCOMMENTS TXTENTRYCALL LBLDIALOGUEReady to begin! Africa All Mode: RST / Serial Received ARRL Field Day: Class / Section ARRL Kids Day: Name / Age / SPCNum ARRL Rookie Roundup: Name / Check / SPCNum ARRL RTTY: RST / SPCNum ARRL School Club Roundup: RST / Class / SPCNum / Name (optional) CQ WPX: RST / Serial Received CQ WW RTTY: RST / CQ Zone (autofilled from call) / State (or Province) Italian ARI International DX: RST / SPCNum Jamboree On The Air (lots of unrequired fields) NCJ North American QSO Party: Name / SPCNum NCJ North American Sprint: Serial Received / Name / SPCNum State QSO Parties, varies: Name State County Serial Received Section SPCNum Ten Ten: Name / SPCNum / 1010 number VHF: Grid / RST Worked All Europe: RST / Serial Received (QTCs not coded in API) Winter Field Day: Category (use class, just like ARRL Field Day) / Section */ fldigi-4.2.05/src/logbook/cty-dat.cxx0000664000175000017500000024424014611711171014305 00000000000000// ---------------------------------------------------------------------------- // cty-dat.cxx // // Copyright (C) 2018 // David Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // internal data file string that is the latest cty.dat as of the // publishing date of the software #include #include std::string s_ctydat = "\ Sov Mil Order of Malta: 15: 28: EU: 41.90: -12.43: -1.0: 1A:\n\ 1A;\n\ Spratly Islands: 26: 50: AS: 9.88: -114.23: -8.0: 1S:\n\ 9M0,BM9S,BN9S,BO9S,BP9S,BQ9S,BU9S,BV9S,BW9S,BX9S;\n\ Monaco: 14: 27: EU: 43.73: -7.40: -1.0: 3A:\n\ 3A;\n\ Agalega & St. Brandon: 39: 53: AF: -10.45: -56.67: -4.0: 3B6:\n\ 3B6,3B7;\n\ Mauritius: 39: 53: AF: -20.35: -57.50: -4.0: 3B8:\n\ 3B8;\n\ Rodriguez Island: 39: 53: AF: -19.70: -63.42: -4.0: 3B9:\n\ 3B9;\n\ Equatorial Guinea: 36: 47: AF: 1.70: -10.33: -1.0: 3C:\n\ 3C;\n\ Annobon Island: 36: 52: AF: -1.43: -5.62: -1.0: 3C0:\n\ 3C0;\n\ Fiji: 32: 56: OC: -17.78: -177.92: -12.0: 3D2:\n\ 3D2;\n\ Conway Reef: 32: 56: OC: -22.00: -175.00: -12.0: 3D2/c:\n\ =3D2CR;\n\ Rotuma Island: 32: 56: OC: -12.48: -177.08: -12.0: 3D2/r:\n\ =3D2RI;\n\ Kingdom of Eswatini: 38: 57: AF: -26.65: -31.48: -2.0: 3DA:\n\ 3DA;\n\ Tunisia: 33: 37: AF: 35.40: -9.32: -1.0: 3V:\n\ 3V,TS;\n\ Vietnam: 26: 49: AS: 15.80: -107.90: -7.0: 3W:\n\ 3W,XV;\n\ Guinea: 35: 46: AF: 11.00: 10.68: 0.0: 3X:\n\ 3X;\n\ Bouvet: 38: 67: AF: -54.42: -3.38: -1.0: 3Y/b:\n\ =3Y0E;\n\ Peter 1 Island: 12: 72: SA: -68.77: 90.58: 4.0: 3Y/p:\n\ =3Y0X;\n\ Azerbaijan: 21: 29: AS: 40.45: -47.37: -4.0: 4J:\n\ 4J,4K;\n\ Georgia: 21: 29: AS: 42.00: -45.00: -4.0: 4L:\n\ 4L;\n\ Montenegro: 15: 28: EU: 42.50: -19.28: -1.0: 4O:\n\ 4O;\n\ Sri Lanka: 22: 41: AS: 7.60: -80.70: -5.5: 4S:\n\ 4P,4Q,4R,4S;\n\ ITU HQ: 14: 28: EU: 46.17: -6.05: -1.0: 4U1I:\n\ =4U1ITU,=4U1WRC;\n\ United Nations HQ: 05: 08: NA: 40.75: 73.97: 5.0: 4U1U:\n\ =4U1UN,=4U75UN;\n\ Vienna Intl Ctr: 15: 28: EU: 48.20: -16.30: -1.0: *4U1V:\n\ =4U0R,=4U1A,=4U1VIC,=4U2STAYHOME,=4U2U,=4U75A,=4Y1A,=C7A;\n\ Timor - Leste: 28: 54: OC: -8.80: -126.05: -9.0: 4W:\n\ 4W,=VERSION;\n\ Israel: 20: 39: AS: 31.32: -34.82: -2.0: 4X:\n\ 4X,4Z;\n\ Libya: 34: 38: AF: 27.20: -16.60: -2.0: 5A:\n\ 5A;\n\ Cyprus: 20: 39: AS: 35.00: -33.00: -2.0: 5B:\n\ 5B,C4,H2,P3;\n\ Tanzania: 37: 53: AF: -5.75: -33.92: -3.0: 5H:\n\ 5H,5I;\n\ Nigeria: 35: 46: AF: 9.87: -7.55: -1.0: 5N:\n\ 5N,5O;\n\ Madagascar: 39: 53: AF: -19.00: -46.58: -3.0: 5R:\n\ 5R,5S,6X;\n\ Mauritania: 35: 46: AF: 20.60: 10.50: 0.0: 5T:\n\ 5T;\n\ Niger: 35: 46: AF: 17.63: -9.43: -1.0: 5U:\n\ 5U;\n\ Togo: 35: 46: AF: 8.40: -1.28: 0.0: 5V:\n\ 5V;\n\ Samoa: 32: 62: OC: -13.93: 171.70: -13.0: 5W:\n\ 5W;\n\ Uganda: 37: 48: AF: 1.92: -32.60: -3.0: 5X:\n\ 5X;\n\ Kenya: 37: 48: AF: 0.32: -38.15: -3.0: 5Z:\n\ 5Y,5Z;\n\ Senegal: 35: 46: AF: 15.20: 14.63: 0.0: 6W:\n\ 6V,6W;\n\ Jamaica: 08: 11: NA: 18.20: 77.47: 5.0: 6Y:\n\ 6Y;\n\ Yemen: 21: 39: AS: 15.65: -48.12: -3.0: 7O:\n\ 7O;\n\ Lesotho: 38: 57: AF: -29.22: -27.88: -2.0: 7P:\n\ 7P;\n\ Malawi: 37: 53: AF: -14.00: -34.00: -2.0: 7Q:\n\ 7Q;\n\ Algeria: 33: 37: AF: 28.00: -2.00: -1.0: 7X:\n\ 7R,7T,7U,7V,7W,7X,7Y;\n\ Barbados: 08: 11: NA: 13.18: 59.53: 4.0: 8P:\n\ 8P;\n\ Maldives: 22: 41: AS: 4.15: -73.45: -5.0: 8Q:\n\ 8Q;\n\ Guyana: 09: 12: SA: 6.02: 59.45: 4.0: 8R:\n\ 8R;\n\ Croatia: 15: 28: EU: 45.18: -15.30: -1.0: 9A:\n\ 9A;\n\ Ghana: 35: 46: AF: 7.70: 1.57: 0.0: 9G:\n\ 9G;\n\ Malta: 15: 28: EU: 35.88: -14.42: -1.0: 9H:\n\ 9H;\n\ Zambia: 36: 53: AF: -14.22: -26.73: -2.0: 9J:\n\ 9I,9J;\n\ Kuwait: 21: 39: AS: 29.38: -47.38: -3.0: 9K:\n\ 9K,NLD;\n\ Sierra Leone: 35: 46: AF: 8.50: 13.25: 0.0: 9L:\n\ 9L;\n\ West Malaysia: 28: 54: AS: 3.95: -102.23: -8.0: 9M2:\n\ 9M,9W;\n\ East Malaysia: 28: 54: OC: 2.68: -113.32: -8.0: 9M6:\n\ 9M6,9M8,9W6,9W8,=9M4CAK,=9M4CPT,=9M4JAY,=9M4CCB,=9M4CKT,=9M4CRB,=9M4CRP;\n\ Nepal: 22: 42: AS: 27.70: -85.33: -5.75: 9N:\n\ 9N;\n\ Dem. Rep. of the Congo: 36: 52: AF: -3.12: -23.03: -1.0: 9Q:\n\ 9O,9P,9Q,9R,9S,9T;\n\ Burundi: 36: 52: AF: -3.17: -29.78: -2.0: 9U:\n\ 9U;\n\ Singapore: 28: 54: AS: 1.37: -103.78: -8.0: 9V:\n\ 9V,S6;\n\ Rwanda: 36: 52: AF: -1.75: -29.82: -2.0: 9X:\n\ 9X;\n\ Trinidad & Tobago: 09: 11: SA: 10.38: 61.28: 4.0: 9Y:\n\ 9Y,9Z;\n\ Botswana: 38: 57: AF: -22.00: -24.00: -2.0: A2:\n\ 8O,A2;\n\ Tonga: 32: 62: OC: -21.22: 175.13: -13.0: A3:\n\ A3;\n\ Oman: 21: 39: AS: 23.60: -58.55: -4.0: A4:\n\ A4;\n\ Bhutan: 22: 41: AS: 27.40: -90.18: -6.0: A5:\n\ A5;\n\ United Arab Emirates: 21: 39: AS: 24.00: -54.00: -4.0: A6:\n\ A6;\n\ Qatar: 21: 39: AS: 25.25: -51.13: -3.0: A7:\n\ A7;\n\ Bahrain: 21: 39: AS: 26.03: -50.53: -3.0: A9:\n\ A9;\n\ Pakistan: 21: 41: AS: 30.00: -70.00: -5.0: AP:\n\ 6P,6Q,6R,6S,AP,AQ,AR,AS;\n\ Scarborough Reef: 27: 50: AS: 15.08: -117.72: -8.0: BS7:\n\ =BS7H;\n\ Taiwan: 24: 44: AS: 23.72: -120.88: -8.0: BV:\n\ BM,BN,BO,BP,BQ,BU,BV,BW,BX;\n\ Pratas Island: 24: 44: AS: 20.70: -116.70: -8.0: BV9P:\n\ BM9P,BN9P,BO9P,BP9P,BQ9P,BU9P,BV9P,BW9P,BX9P;\n\ China: 24: 44: AS: 36.00: -102.00: -8.0: BY:\n\ 3H,3H0(23)[42],3H9(23)[43],3I,3I0(23)[42],3I9(23)[43],3J,3J0(23)[42],\n\ 3J9(23)[43],3K,3K0(23)[42],3K9(23)[43],3L,3L0(23)[42],3L9(23)[43],3M,\n\ 3M0(23)[42],3M9(23)[43],3N,3N0(23)[42],3N9(23)[43],3O,3O0(23)[42],\n\ 3O9(23)[43],3P,3P0(23)[42],3P9(23)[43],3Q,3Q0(23)[42],3Q9(23)[43],3R,\n\ 3R0(23)[42],3R9(23)[43],3S,3S0(23)[42],3S9(23)[43],3T,3T0(23)[42],\n\ 3T9(23)[43],3U,3U0(23)[42],3U9(23)[43],B0(23)[42],B2,B3,B4,B5,B6,B7,B8,\n\ B9(23)[43],BA,BA0(23)[42],BA9(23)[43],BD,BD0(23)[42],BD9(23)[43],BG,\n\ BG0(23)[42],BG9(23)[43],BH,BH0(23)[42],BH9(23)[43],BI,BI0(23)[42],\n\ BI9(23)[43],BJ,BJ0(23)[42],BJ9(23)[43],BL,BL0(23)[42],BL9(23)[43],BT,\n\ BT0(23)[42],BT9(23)[43],BY,BY0(23)[42],BY9(23)[43],BZ,BZ0(23)[42],\n\ BZ9(23)[43],XS,XS0(23)[42],XS9(23)[43],B1,B2A[33],B2B[33],B2C[33],B2D[33],\n\ B2E[33],B2F[33],B2G[33],B2H[33],B2I[33],B2J[33],B2K[33],B2L[33],B2M[33],\n\ B2N[33],B2O[33],B2P[33],B3G(23)[33],B3H(23)[33],B3I(23)[33],B3J(23)[33],\n\ B3K(23)[33],B3L(23)[33],B6Q[43],B6R[43],B6S[43],B6T[43],B6U[43],B6V[43],\n\ B6W[43],B6X[43],B7A[43],B7B[43],B7C[43],B7D[43],B7E[43],B7F[43],B7G[43],\n\ B7H[43],B7Q[43],B7R[43],B7S[43],B7T[43],B7U[43],B7V[43],B7W[43],B7X[43],\n\ B8A[43],B8B[43],B8C[43],B8D[43],B8E[43],B8F[43],B8G[43],B8H[43],B8I[43],\n\ B8J[43],B8K[43],B8L[43],B8M[43],B8N[43],B8O[43],B8P[43],B8Q[43],B8R[43],\n\ B8S[43],B8T[43],B8U[43],B8V[43],B8W[43],B8X[43],B9A(24)[43],B9B(24)[43],\n\ B9C(24)[43],B9D(24)[43],B9E(24)[43],B9F(24)[43],B9S(23)[42],B9T(23)[42],\n\ B9U(23)[42],B9V(23)[42],B9W(23)[42],B9X(23)[42],BA2A[33],BA2B[33],\n\ BA2C[33],BA2D[33],BA2E[33],BA2F[33],BA2G[33],BA2H[33],BA2I[33],BA2J[33],\n\ BA2K[33],BA2L[33],BA2M[33],BA2N[33],BA2O[33],BA2P[33],BA3G(23)[33],\n\ BA3H(23)[33],BA3I(23)[33],BA3J(23)[33],BA3K(23)[33],BA3L(23)[33],BA6Q[43],\n\ BA6R[43],BA6S[43],BA6T[43],BA6U[43],BA6V[43],BA6W[43],BA6X[43],BA7A[43],\n\ BA7B[43],BA7C[43],BA7D[43],BA7E[43],BA7F[43],BA7G[43],BA7H[43],BA7Q[43],\n\ BA7R[43],BA7S[43],BA7T[43],BA7U[43],BA7V[43],BA7W[43],BA7X[43],BA8A[43],\n\ BA8B[43],BA8C[43],BA8D[43],BA8E[43],BA8F[43],BA8G[43],BA8H[43],BA8I[43],\n\ BA8J[43],BA8K[43],BA8L[43],BA8M[43],BA8N[43],BA8O[43],BA8P[43],BA8Q[43],\n\ BA8R[43],BA8S[43],BA8T[43],BA8U[43],BA8V[43],BA8W[43],BA8X[43],\n\ BA9A(24)[43],BA9B(24)[43],BA9C(24)[43],BA9D(24)[43],BA9E(24)[43],\n\ BA9F(24)[43],BA9S(23)[42],BA9T(23)[42],BA9U(23)[42],BA9V(23)[42],\n\ BA9W(23)[42],BA9X(23)[42],BD2A[33],BD2B[33],BD2C[33],BD2D[33],BD2E[33],\n\ BD2F[33],BD2G[33],BD2H[33],BD2I[33],BD2J[33],BD2K[33],BD2L[33],BD2M[33],\n\ BD2N[33],BD2O[33],BD2P[33],BD3G(23)[33],BD3H(23)[33],BD3I(23)[33],\n\ BD3J(23)[33],BD3K(23)[33],BD3L(23)[33],BD6Q[43],BD6R[43],BD6S[43],\n\ BD6T[43],BD6U[43],BD6V[43],BD6W[43],BD6X[43],BD7A[43],BD7B[43],BD7C[43],\n\ BD7D[43],BD7E[43],BD7F[43],BD7G[43],BD7H[43],BD7Q[43],BD7R[43],BD7S[43],\n\ BD7T[43],BD7U[43],BD7V[43],BD7W[43],BD7X[43],BD8A[43],BD8B[43],BD8C[43],\n\ BD8D[43],BD8E[43],BD8F[43],BD8G[43],BD8H[43],BD8I[43],BD8J[43],BD8K[43],\n\ BD8L[43],BD8M[43],BD8N[43],BD8O[43],BD8P[43],BD8Q[43],BD8R[43],BD8S[43],\n\ BD8T[43],BD8U[43],BD8V[43],BD8W[43],BD8X[43],BD9A(24)[43],BD9B(24)[43],\n\ BD9C(24)[43],BD9D(24)[43],BD9E(24)[43],BD9F(24)[43],BD9S(23)[42],\n\ BD9T(23)[42],BD9U(23)[42],BD9V(23)[42],BD9W(23)[42],BD9X(23)[42],BG2A[33],\n\ BG2B[33],BG2C[33],BG2D[33],BG2E[33],BG2F[33],BG2G[33],BG2H[33],BG2I[33],\n\ BG2J[33],BG2K[33],BG2L[33],BG2M[33],BG2N[33],BG2O[33],BG2P[33],\n\ BG3G(23)[33],BG3H(23)[33],BG3I(23)[33],BG3J(23)[33],BG3K(23)[33],\n\ BG3L(23)[33],BG6Q[43],BG6R[43],BG6S[43],BG6T[43],BG6U[43],BG6V[43],\n\ BG6W[43],BG6X[43],BG7A[43],BG7B[43],BG7C[43],BG7D[43],BG7E[43],BG7F[43],\n\ BG7G[43],BG7H[43],BG7Q[43],BG7R[43],BG7S[43],BG7T[43],BG7U[43],BG7V[43],\n\ BG7W[43],BG7X[43],BG8A[43],BG8B[43],BG8C[43],BG8D[43],BG8E[43],BG8F[43],\n\ BG8G[43],BG8H[43],BG8I[43],BG8J[43],BG8K[43],BG8L[43],BG8M[43],BG8N[43],\n\ BG8O[43],BG8P[43],BG8Q[43],BG8R[43],BG8S[43],BG8T[43],BG8U[43],BG8V[43],\n\ BG8W[43],BG8X[43],BG9A(24)[43],BG9B(24)[43],BG9C(24)[43],BG9D(24)[43],\n\ BG9E(24)[43],BG9F(24)[43],BG9S(23)[42],BG9T(23)[42],BG9U(23)[42],\n\ BG9V(23)[42],BG9W(23)[42],BG9X(23)[42],BH2A[33],BH2B[33],BH2C[33],\n\ BH2D[33],BH2E[33],BH2F[33],BH2G[33],BH2H[33],BH2I[33],BH2J[33],BH2K[33],\n\ BH2L[33],BH2M[33],BH2N[33],BH2O[33],BH2P[33],BH3G(23)[33],BH3H(23)[33],\n\ BH3I(23)[33],BH3J(23)[33],BH3K(23)[33],BH3L(23)[33],BH6Q[43],BH6R[43],\n\ BH6S[43],BH6T[43],BH6U[43],BH6V[43],BH6W[43],BH6X[43],BH7A[43],BH7B[43],\n\ BH7C[43],BH7D[43],BH7E[43],BH7F[43],BH7G[43],BH7H[43],BH7Q[43],BH7R[43],\n\ BH7S[43],BH7T[43],BH7U[43],BH7V[43],BH7W[43],BH7X[43],BH8A[43],BH8B[43],\n\ BH8C[43],BH8D[43],BH8E[43],BH8F[43],BH8G[43],BH8H[43],BH8I[43],BH8J[43],\n\ BH8K[43],BH8L[43],BH8M[43],BH8N[43],BH8O[43],BH8P[43],BH8Q[43],BH8R[43],\n\ BH8S[43],BH8T[43],BH8U[43],BH8V[43],BH8W[43],BH8X[43],BH9A(24)[43],\n\ BH9B(24)[43],BH9C(24)[43],BH9D(24)[43],BH9E(24)[43],BH9F(24)[43],\n\ BH9S(23)[42],BH9T(23)[42],BH9U(23)[42],BH9V(23)[42],BH9W(23)[42],\n\ BH9X(23)[42],BI2A[33],BI2B[33],BI2C[33],BI2D[33],BI2E[33],BI2F[33],\n\ BI2G[33],BI2H[33],BI2I[33],BI2J[33],BI2K[33],BI2L[33],BI2M[33],BI2N[33],\n\ BI2O[33],BI2P[33],BI3G(23)[33],BI3H(23)[33],BI3I(23)[33],BI3J(23)[33],\n\ BI3K(23)[33],BI3L(23)[33],BI6Q[43],BI6R[43],BI6S[43],BI6T[43],BI6U[43],\n\ BI6V[43],BI6W[43],BI6X[43],BI7A[43],BI7B[43],BI7C[43],BI7D[43],BI7E[43],\n\ BI7F[43],BI7G[43],BI7H[43],BI7Q[43],BI7R[43],BI7S[43],BI7T[43],BI7U[43],\n\ BI7V[43],BI7W[43],BI7X[43],BI8A[43],BI8B[43],BI8C[43],BI8D[43],BI8E[43],\n\ BI8F[43],BI8G[43],BI8H[43],BI8I[43],BI8J[43],BI8K[43],BI8L[43],BI8M[43],\n\ BI8N[43],BI8O[43],BI8P[43],BI8Q[43],BI8R[43],BI8S[43],BI8T[43],BI8U[43],\n\ BI8V[43],BI8W[43],BI8X[43],BI9A(24)[43],BI9B(24)[43],BI9C(24)[43],\n\ BI9D(24)[43],BI9E(24)[43],BI9F(24)[43],BI9S(23)[42],BI9T(23)[42],\n\ BI9U(23)[42],BI9V(23)[42],BI9W(23)[42],BI9X(23)[42],BJ2A[33],BJ2B[33],\n\ BJ2C[33],BJ2D[33],BJ2E[33],BJ2F[33],BJ2G[33],BJ2H[33],BJ2I[33],BJ2J[33],\n\ BJ2K[33],BJ2L[33],BJ2M[33],BJ2N[33],BJ2O[33],BJ2P[33],BJ3G(23)[33],\n\ BJ3H(23)[33],BJ3I(23)[33],BJ3J(23)[33],BJ3K(23)[33],BJ3L(23)[33],BJ6Q[43],\n\ BJ6R[43],BJ6S[43],BJ6T[43],BJ6U[43],BJ6V[43],BJ6W[43],BJ6X[43],BJ7A[43],\n\ BJ7B[43],BJ7C[43],BJ7D[43],BJ7E[43],BJ7F[43],BJ7G[43],BJ7H[43],BJ7Q[43],\n\ BJ7R[43],BJ7S[43],BJ7T[43],BJ7U[43],BJ7V[43],BJ7W[43],BJ7X[43],BJ8A[43],\n\ BJ8B[43],BJ8C[43],BJ8D[43],BJ8E[43],BJ8F[43],BJ8G[43],BJ8H[43],BJ8I[43],\n\ BJ8J[43],BJ8K[43],BJ8L[43],BJ8M[43],BJ8N[43],BJ8O[43],BJ8P[43],BJ8Q[43],\n\ BJ8R[43],BJ8S[43],BJ8T[43],BJ8U[43],BJ8V[43],BJ8W[43],BJ8X[43],\n\ BJ9A(24)[43],BJ9B(24)[43],BJ9C(24)[43],BJ9D(24)[43],BJ9E(24)[43],\n\ BJ9F(24)[43],BJ9S(23)[42],BJ9T(23)[42],BJ9U(23)[42],BJ9V(23)[42],\n\ BJ9W(23)[42],BJ9X(23)[42],BL2A[33],BL2B[33],BL2C[33],BL2D[33],BL2E[33],\n\ BL2F[33],BL2G[33],BL2H[33],BL2I[33],BL2J[33],BL2K[33],BL2L[33],BL2M[33],\n\ BL2N[33],BL2O[33],BL2P[33],BL3G(23)[33],BL3H(23)[33],BL3I(23)[33],\n\ BL3J(23)[33],BL3K(23)[33],BL3L(23)[33],BL6Q[43],BL6R[43],BL6S[43],\n\ BL6T[43],BL6U[43],BL6V[43],BL6W[43],BL6X[43],BL7A[43],BL7B[43],BL7C[43],\n\ BL7D[43],BL7E[43],BL7F[43],BL7G[43],BL7H[43],BL7Q[43],BL7R[43],BL7S[43],\n\ BL7T[43],BL7U[43],BL7V[43],BL7W[43],BL7X[43],BL8A[43],BL8B[43],BL8C[43],\n\ BL8D[43],BL8E[43],BL8F[43],BL8G[43],BL8H[43],BL8I[43],BL8J[43],BL8K[43],\n\ BL8L[43],BL8M[43],BL8N[43],BL8O[43],BL8P[43],BL8Q[43],BL8R[43],BL8S[43],\n\ BL8T[43],BL8U[43],BL8V[43],BL8W[43],BL8X[43],BL9A(24)[43],BL9B(24)[43],\n\ BL9C(24)[43],BL9D(24)[43],BL9E(24)[43],BL9F(24)[43],BL9S(23)[42],\n\ BL9T(23)[42],BL9U(23)[42],BL9V(23)[42],BL9W(23)[42],BL9X(23)[42],BT2A[33],\n\ BT2B[33],BT2C[33],BT2D[33],BT2E[33],BT2F[33],BT2G[33],BT2H[33],BT2I[33],\n\ BT2J[33],BT2K[33],BT2L[33],BT2M[33],BT2N[33],BT2O[33],BT2P[33],\n\ BT3G(23)[33],BT3H(23)[33],BT3I(23)[33],BT3J(23)[33],BT3K(23)[33],\n\ BT3L(23)[33],BT6Q[43],BT6R[43],BT6S[43],BT6T[43],BT6U[43],BT6V[43],\n\ BT6W[43],BT6X[43],BT7A[43],BT7B[43],BT7C[43],BT7D[43],BT7E[43],BT7F[43],\n\ BT7G[43],BT7H[43],BT7Q[43],BT7R[43],BT7S[43],BT7T[43],BT7U[43],BT7V[43],\n\ BT7W[43],BT7X[43],BT8A[43],BT8B[43],BT8C[43],BT8D[43],BT8E[43],BT8F[43],\n\ BT8G[43],BT8H[43],BT8I[43],BT8J[43],BT8K[43],BT8L[43],BT8M[43],BT8N[43],\n\ BT8O[43],BT8P[43],BT8Q[43],BT8R[43],BT8S[43],BT8T[43],BT8U[43],BT8V[43],\n\ BT8W[43],BT8X[43],BT9A(24)[43],BT9B(24)[43],BT9C(24)[43],BT9D(24)[43],\n\ BT9E(24)[43],BT9F(24)[43],BT9S(23)[42],BT9T(23)[42],BT9U(23)[42],\n\ BT9V(23)[42],BT9W(23)[42],BT9X(23)[42],BY2A[33],BY2B[33],BY2C[33],\n\ BY2D[33],BY2E[33],BY2F[33],BY2G[33],BY2H[33],BY2I[33],BY2J[33],BY2K[33],\n\ BY2L[33],BY2M[33],BY2N[33],BY2O[33],BY2P[33],BY3G(23)[33],BY3H(23)[33],\n\ BY3I(23)[33],BY3J(23)[33],BY3K(23)[33],BY3L(23)[33],BY6Q[43],BY6R[43],\n\ BY6S[43],BY6T[43],BY6U[43],BY6V[43],BY6W[43],BY6X[43],BY7A[43],BY7B[43],\n\ BY7C[43],BY7D[43],BY7E[43],BY7F[43],BY7G[43],BY7H[43],BY7Q[43],BY7R[43],\n\ BY7S[43],BY7T[43],BY7U[43],BY7V[43],BY7W[43],BY7X[43],BY8A[43],BY8B[43],\n\ BY8C[43],BY8D[43],BY8E[43],BY8F[43],BY8G[43],BY8H[43],BY8I[43],BY8J[43],\n\ BY8K[43],BY8L[43],BY8M[43],BY8N[43],BY8O[43],BY8P[43],BY8Q[43],BY8R[43],\n\ BY8S[43],BY8T[43],BY8U[43],BY8V[43],BY8W[43],BY8X[43],BY9A(24)[43],\n\ BY9B(24)[43],BY9C(24)[43],BY9D(24)[43],BY9E(24)[43],BY9F(24)[43],\n\ BY9S(23)[42],BY9T(23)[42],BY9U(23)[42],BY9V(23)[42],BY9W(23)[42],\n\ BY9X(23)[42],BZ2A[33],BZ2B[33],BZ2C[33],BZ2D[33],BZ2E[33],BZ2F[33],\n\ BZ2G[33],BZ2H[33],BZ2I[33],BZ2J[33],BZ2K[33],BZ2L[33],BZ2M[33],BZ2N[33],\n\ BZ2O[33],BZ2P[33],BZ3G(23)[33],BZ3H(23)[33],BZ3I(23)[33],BZ3J(23)[33],\n\ BZ3K(23)[33],BZ3L(23)[33],BZ6Q[43],BZ6R[43],BZ6S[43],BZ6T[43],BZ6U[43],\n\ BZ6V[43],BZ6W[43],BZ6X[43],BZ7A[43],BZ7B[43],BZ7C[43],BZ7D[43],BZ7E[43],\n\ BZ7F[43],BZ7G[43],BZ7H[43],BZ7Q[43],BZ7R[43],BZ7S[43],BZ7T[43],BZ7U[43],\n\ BZ7V[43],BZ7W[43],BZ7X[43],BZ8A[43],BZ8B[43],BZ8C[43],BZ8D[43],BZ8E[43],\n\ BZ8F[43],BZ8G[43],BZ8H[43],BZ8I[43],BZ8J[43],BZ8K[43],BZ8L[43],BZ8M[43],\n\ BZ8N[43],BZ8O[43],BZ8P[43],BZ8Q[43],BZ8R[43],BZ8S[43],BZ8T[43],BZ8U[43],\n\ BZ8V[43],BZ8W[43],BZ8X[43],BZ9A(24)[43],BZ9B(24)[43],BZ9C(24)[43],\n\ BZ9D(24)[43],BZ9E(24)[43],BZ9F(24)[43],BZ9S(23)[42],BZ9T(23)[42],\n\ BZ9U(23)[42],BZ9V(23)[42],BZ9W(23)[42],BZ9X(23)[42];\n\ Nauru: 31: 65: OC: -0.52: -166.92: -12.0: C2:\n\ C2;\n\ Andorra: 14: 27: EU: 42.58: -1.62: -1.0: C3:\n\ C3;\n\ The Gambia: 35: 46: AF: 13.40: 16.38: 0.0: C5:\n\ C5;\n\ Bahamas: 08: 11: NA: 24.25: 76.00: 5.0: C6:\n\ C6;\n\ Mozambique: 37: 53: AF: -18.25: -35.00: -2.0: C9:\n\ C8,C9;\n\ Chile: 12: 14: SA: -30.00: 71.00: 4.0: CE:\n\ 3G,CA,CB,CC,CD,CE,XQ,XR,3G7[16],3G8[16],CA7[16],CA8[16],CB7[16],CB8[16],\n\ CC7[16],CC8[16],CD7[16],CD8[16],CE7[16],CE8[16],XQ7[16],XQ8[16],XR7[16],\n\ XR8[16],=XQ6CFX[16],=XQ6OA[16];\n\ San Felix & San Ambrosio: 12: 14: SA: -26.28: 80.07: 4.0: CE0X:\n\ 3G0X,CA0X,CB0X,CC0X,CD0X,CE0X,XQ0X,XR0X;\n\ Easter Island: 12: 63: SA: -27.10: 109.37: 6.0: CE0Y:\n\ 3G0,CA0,CB0,CC0,CD0,CE0,XQ0,XR0;\n\ Juan Fernandez Islands: 12: 14: SA: -33.60: 78.85: 4.0: CE0Z:\n\ 3G0Z,CA0Z,CB0Z,CC0Z,CD0Z,CE0I,CE0Z,XQ0Z,XR0Z;\n\ Antarctica: 13: 74: SA: -90.00: 0.00: 0.0: CE9:\n\ 3Y[73],AX0(39)[69],AY1Z[73],AY2Z[73],AY3Z[73],AY4Z[73],AY5Z[73],AY6Z[73],\n\ AY7Z[73],AY8Z[73],AY9Z[73],FT0Y(30)[70],FT1Y(30)[70],FT2Y(30)[70],\n\ FT3Y(30)[70],FT4Y(30)[70],FT5Y(30)[70],FT6Y(30)[70],FT7Y(30)[70],\n\ FT8Y(30)[70],LU1Z[73],LU2Z[73],LU3Z[73],LU4Z[73],LU5Z[73],LU6Z[73],\n\ LU7Z[73],LU8Z[73],LU9Z[73],RI1AN(29)[69],VI0(39)[69],VK0(39)[69],\n\ ZL5(30)[71],ZM5(30)[71],ZS7(38)[67],=8J1RL(39)[67],=DP0GVN(38)[67],\n\ =DP1POL(38)[67],=KC4AAA(39),=KC4AAC[73],=KC4USB(12),=KC4USV(30)[71],\n\ =LU3HRS/Z[73],=RI1ANC(29)[70],=VP8AL[73];\n\ Cuba: 08: 11: NA: 21.50: 80.00: 5.0: CM:\n\ CL,CM,CO,T4;\n\ Morocco: 33: 37: AF: 32.00: 5.00: 0.0: CN:\n\ 5C,5D,5E,5F,5G,CN;\n\ Bolivia: 10: 12: SA: -17.00: 65.00: 4.0: CP:\n\ CP,CP2[14],CP3[14],CP4[14],CP5[14],CP6[14],CP7[14];\n\ Portugal: 14: 37: EU: 39.50: 8.00: 0.0: CT:\n\ CQ,CR,CS,CT;\n\ Madeira Islands: 33: 36: AF: 32.75: 16.95: 0.0: CT3:\n\ CQ2,CQ3,CQ9,CR3,CR9,CS3,CS9,CT3,CT9;\n\ Azores: 14: 36: EU: 38.70: 27.23: 1.0: CU:\n\ CQ1,CQ8,CR1,CR2,CR8,CS4,CS8,CT8,CU;\n\ Uruguay: 13: 14: SA: -33.00: 56.00: 3.0: CX:\n\ CV,CW,CX;\n\ Sable Island: 05: 09: NA: 43.93: 59.90: 4.0: CY0:\n\ CY0;\n\ St. Paul Island: 05: 09: NA: 47.00: 60.00: 4.0: CY9:\n\ CY9;\n\ Angola: 36: 52: AF: -12.50: -18.50: -1.0: D2:\n\ D2,D3;\n\ Cape Verde: 35: 46: AF: 16.00: 24.00: 1.0: D4:\n\ D4;\n\ Comoros: 39: 53: AF: -11.63: -43.30: -3.0: D6:\n\ D6;\n\ Fed. Rep. of Germany: 14: 28: EU: 51.00: -10.00: -1.0: DL:\n\ DA,DB,DC,DD,DE,DF,DG,DH,DI,DJ,DK,DL,DM,DN,DO,DP,DQ,DR,Y2,Y3,Y4,Y5,Y6,Y7,\n\ Y8,Y9;\n\ Philippines: 27: 50: OC: 13.00: -122.00: -8.0: DU:\n\ 4D,4E,4F,4G,4H,4I,DU,DV,DW,DX,DY,DZ;\n\ Eritrea: 37: 48: AF: 15.00: -39.00: -3.0: E3:\n\ E3;\n\ Palestine: 20: 39: AS: 31.28: -34.27: -2.0: E4:\n\ E4;\n\ North Cook Islands: 32: 62: OC: -10.02: 161.08: 10.0: E5/n:\n\ =E51PT,=E51WL[63];\n\ South Cook Islands: 32: 63: OC: -21.90: 157.93: 10.0: E5/s:\n\ E5;\n\ Niue: 32: 62: OC: -19.03: 169.85: 11.0: E6:\n\ E6;\n\ Bosnia-Herzegovina: 15: 28: EU: 44.32: -17.57: -1.0: E7:\n\ E7;\n\ Spain: 14: 37: EU: 40.37: 4.88: -1.0: EA:\n\ AM,AN,AO,EA,EB,EC,ED,EE,EF,EG,EH,=EA2EZ/P,=EA5CC/P,=EA5EZ/P,=EA5URE/P,\n\ =EA5ZD/URE,=EA9HU;\n\ Balearic Islands: 14: 37: EU: 39.60: -2.95: -1.0: EA6:\n\ AM6,AN6,AO6,EA6,EB6,EC6,ED6,EE6,EF6,EG6,EH6;\n\ Canary Islands: 33: 36: AF: 28.32: 15.85: 0.0: EA8:\n\ AM8,AN8,AO8,EA8,EB8,EC8,ED8,EE8,EF8,EG8,EH8,=EA2EJO/8,=EA8VK/URE;\n\ Ceuta & Melilla: 33: 37: AF: 35.90: 5.27: -1.0: EA9:\n\ AM9,AN9,AO9,EA9,EB9,EC9,ED9,EE9,EF9,EG9,EH9;\n\ Ireland: 14: 27: EU: 53.13: 8.02: 0.0: EI:\n\ EI,EJ;\n\ Armenia: 21: 29: AS: 40.40: -44.90: -4.0: EK:\n\ EK;\n\ Liberia: 35: 46: AF: 6.50: 9.50: 0.0: EL:\n\ 5L,5M,6Z,A8,D5,EL;\n\ Iran: 21: 40: AS: 32.00: -53.00: -3.5: EP:\n\ 9B,9C,9D,EP,EQ;\n\ Moldova: 16: 29: EU: 47.00: -29.00: -2.0: ER:\n\ ER;\n\ Estonia: 15: 29: EU: 59.00: -25.00: -2.0: ES:\n\ ES;\n\ Ethiopia: 37: 48: AF: 9.00: -39.00: -3.0: ET:\n\ 9E,9F,ET;\n\ Belarus: 16: 29: EU: 54.00: -28.00: -2.0: EU:\n\ EU,EV,EW;\n\ Kyrgyzstan: 17: 30: AS: 41.70: -74.13: -6.0: EX:\n\ EX,EX0P[31],EX0Q[31],EX2P[31],EX2Q[31],EX6P[31],EX6Q[31],EX7P[31],\n\ EX7Q[31],EX8P[31],EX8Q[31];\n\ Tajikistan: 17: 30: AS: 38.82: -71.22: -5.0: EY:\n\ EY;\n\ Turkmenistan: 17: 30: AS: 38.00: -58.00: -5.0: EZ:\n\ EZ;\n\ France: 14: 27: EU: 46.00: -2.00: -1.0: F:\n\ F,HW,HX,HY,TH,TM,TP,TQ,TV;\n\ Guadeloupe: 08: 11: NA: 16.13: 61.67: 4.0: FG:\n\ FG,=TO10CWO;\n\ Mayotte: 39: 53: AF: -12.88: -45.15: -3.0: FH:\n\ FH;\n\ St. Barthelemy: 08: 11: NA: 17.90: 62.83: 4.0: FJ:\n\ FJ;\n\ New Caledonia: 32: 56: OC: -21.50: -165.50: -11.0: FK:\n\ FK;\n\ Chesterfield Islands: 30: 56: OC: -19.87: -158.32: -11.0: FK/c:\n\ =TX3X;\n\ Martinique: 08: 11: NA: 14.70: 61.03: 4.0: FM:\n\ FM,=TO5A,=TO5T,=TO7A;\n\ French Polynesia: 32: 63: OC: -17.65: 149.40: 10.0: FO:\n\ FO,=TX0T;\n\ Austral Islands: 32: 63: OC: -23.37: 149.48: 10.0: FO/a:\n\ =TX2A;\n\ Clipperton Island: 07: 10: NA: 10.28: 109.22: 8.0: FO/c:\n\ =TX5P;\n\ Marquesas Islands: 31: 63: OC: -8.92: 140.07: 9.5: FO/m:\n\ =FO/F6BCW;\n\ St. Pierre & Miquelon: 05: 09: NA: 46.77: 56.20: 3.0: FP:\n\ FP;\n\ Reunion Island: 39: 53: AF: -21.12: -55.48: -4.0: FR:\n\ FR;\n\ St. Martin: 08: 11: NA: 18.08: 63.03: 4.0: FS:\n\ FS;\n\ Glorioso Islands: 39: 53: AF: -11.55: -47.28: -4.0: FT/g:\n\ FT0G,FT1G,FT2G,FT3G,FT4G,FT5G,FT6G,FT7G,FT8G,FT9G;\n\ Juan de Nova, Europa: 39: 53: AF: -17.05: -42.72: -3.0: FT/j:\n\ FT0E,FT0J,FT1E,FT1J,FT2E,FT2J,FT3E,FT3J,FT4E,FT4J,FT6E,FT6J,FT7E,FT7J,\n\ FT8E,FT8J,FT9E,FT9J;\n\ Tromelin Island: 39: 53: AF: -15.88: -54.50: -4.0: FT/t:\n\ FT0T,FT1T,FT2T,FT3T,FT4T,FT5T,FT6T,FT7T,FT8T,FT9T;\n\ Crozet Island: 39: 68: AF: -46.42: -51.75: -5.0: FT/w:\n\ FT0W,FT4W,FT5W,FT8W;\n\ Kerguelen Islands: 39: 68: AF: -49.00: -69.27: -5.0: FT/x:\n\ FT0X,FT2X,FT4X,FT5X,FT8X;\n\ Amsterdam & St. Paul Is.: 39: 68: AF: -37.85: -77.53: -5.0: FT/z:\n\ FT0Z,FT1Z,FT2Z,FT3Z,FT4Z,FT5Z,FT6Z,FT7Z,FT8Z;\n\ Wallis & Futuna Islands: 32: 62: OC: -13.30: 176.20: -12.0: FW:\n\ FW,TW;\n\ French Guiana: 09: 12: SA: 4.00: 53.00: 3.0: FY:\n\ FY,=TO1A;\n\ England: 14: 27: EU: 52.77: 1.47: 0.0: G:\n\ 2E,G,M,=2E0CVN/NHS;\n\ Isle of Man: 14: 27: EU: 54.20: 4.53: 0.0: GD:\n\ 2D,GD,GT,MD,MT;\n\ Northern Ireland: 14: 27: EU: 54.73: 6.68: 0.0: GI:\n\ 2I,GI,GN,MI,MN,=2I0NGM/NHS,=GB3NGI,=GB5NHS,=GB8NHS,=GB9AFD;\n\ Jersey: 14: 27: EU: 49.22: 2.18: 0.0: GJ:\n\ 2J,GH,GJ,MH,MJ,=GH5DX/NHS;\n\ Shetland Islands: 14: 27: EU: 60.50: 1.50: 0.0: *GM/s:\n\ =2M0BDR,=2M0BDT,=2M0CPN,=2M0GFC,=2M0SEG,=2M0SPX,=2M0ZET,=GB2ELH,=GB3LER,\n\ =GB3LER/B,=GB4LER,=GM0AVR,=GM0CXQ,=GM0EKM,=GM0GFL,=GM0ILB,=GM0JDB,=GM1FGN,\n\ =GM1KKI,=GM1ZNR,=GM3WHT,=GM3ZET,=GM4IPK,=GM4JPI,=GM4LBE,=GM4LER,=GM4PXG,\n\ =GM4SLV,=GM4SSA,=GM4WXQ,=GM4ZHL,=GM6RQW,=GM6YQA,=GM7AFE,=GM7GWW,=GM8LNH,\n\ =GM8MMA,=GM8YEC,=GS3ZET,=MM0LSM,=MM0NQY,=MM0VIK,=MM0XAU,=MM0ZAL,=MM0ZCG,\n\ =MM0ZRC,=MM1FEO,=MM1FJM,=MM3VQO,=MM5PSL,=MM5YLO,=MM6BDU,=MM6BZQ,=MM6IKB,\n\ =MM6IMB,=MM6MFA,=MM6PTE,=MM6SJK,=MM6YLO,=MM6ZBG,=MM6ZDW,=MM7CGR,=MM8A,\n\ =MS0ZCG,=MS0ZET;\n\ Scotland: 14: 27: EU: 56.82: 4.18: 0.0: GM:\n\ 2A,2M,GM,GS,MA,MM,MS,=GB0CSG,=GB0SJR,=GB1RST,=GB2ELH,=GB2FEA,=GB2JCM,\n\ =GB2OWM,=GB2SBS,=GB3ANG,=GB3LER,=GB3LER/B,=GB4LER,=GM0WED/NHS,=GM3YDN/NHS,\n\ =GM4SQM/NHS,=GM4SQN/NHS,=GM6JNJ/NHS,=MM0DHQ/NHS,=MM3AWD/NHS,=MM3DDQ/NHS,\n\ =MM7WAB/NHS;\n\ Guernsey: 14: 27: EU: 49.45: 2.58: 0.0: GU:\n\ 2U,GP,GU,MP,MU,=GB100RS;\n\ Wales: 14: 27: EU: 52.28: 3.73: 0.0: GW:\n\ 2W,GC,GW,MC,MW,=GB1LWF,=GB1RTF,=GB1WIW,=GB2VK;\n\ Solomon Islands: 28: 51: OC: -9.00: -160.00: -11.0: H4:\n\ H4;\n\ Temotu Province: 32: 51: OC: -10.72: -165.80: -11.0: H40:\n\ H40;\n\ Hungary: 15: 28: EU: 47.12: -19.28: -1.0: HA:\n\ HA,HG;\n\ Switzerland: 14: 28: EU: 46.87: -8.12: -1.0: HB:\n\ HB,HE;\n\ Liechtenstein: 14: 28: EU: 47.13: -9.57: -1.0: HB0:\n\ HB0,HE0;\n\ Ecuador: 10: 12: SA: -1.40: 78.40: 5.0: HC:\n\ HC,HD;\n\ Galapagos Islands: 10: 12: SA: -0.78: 91.03: 6.0: HC8:\n\ HC8,HD8;\n\ Haiti: 08: 11: NA: 19.02: 72.18: 5.0: HH:\n\ 4V,HH;\n\ Dominican Republic: 08: 11: NA: 19.13: 70.68: 4.0: HI:\n\ HI;\n\ Colombia: 09: 12: SA: 5.00: 74.00: 5.0: HK:\n\ 5J,5K,HJ,HK;\n\ San Andres & Providencia: 07: 11: NA: 12.55: 81.72: 5.0: HK0/a:\n\ 5J0,5K0,HJ0,HK0;\n\ Malpelo Island: 09: 12: SA: 3.98: 81.58: 5.0: HK0/m:\n\ HJ0M,HK0M,=HK0TU;\n\ Republic of Korea: 25: 44: AS: 36.23: -127.90: -9.0: HL:\n\ 6K,6L,6M,6N,D7,D8,D9,DS,DT,HL,KL9K;\n\ Panama: 07: 11: NA: 9.00: 80.00: 5.0: HP:\n\ 3E,3F,H3,H8,H9,HO,HP;\n\ Honduras: 07: 11: NA: 15.00: 87.00: 6.0: HR:\n\ HQ,HR;\n\ Thailand: 26: 49: AS: 12.60: -99.70: -7.0: HS:\n\ E2,HS;\n\ Vatican City: 15: 28: EU: 41.90: -12.47: -1.0: HV:\n\ HV;\n\ Saudi Arabia: 21: 39: AS: 24.20: -43.83: -3.0: HZ:\n\ 7Z,8Z,HZ;\n\ Italy: 15: 28: EU: 42.82: -12.58: -1.0: I:\n\ I,=4U0WFP,=4U5F,=4U75B,=IT9ELM/0,=IT9PQJ/0;\n\ African Italy: 33: 37: AF: 35.67: -12.67: -1.0: *IG9:\n\ IG9,IH9;\n\ Sardinia: 15: 28: EU: 40.15: -9.27: -1.0: IS:\n\ IM0,IS,IW0U,IW0V,IW0W,IW0X,IW0Y,IW0Z,=II0GD,=II0ICH,=II0IDP,=II0M,=IQ0AG,\n\ =IQ0AH,=IQ0AI,=IQ0AK,=IQ0AK/P,=IQ0AL,=IQ0AM,=IQ0EH,=IQ0HO,=IQ0ID,=IQ0JY,\n\ =IQ0NU,=IQ0NV,=IQ0NV/P,=IQ0OG,=IQ0OH,=IQ0QP,=IQ0SS,=IY0GA;\n\ Sicily: 15: 28: EU: 37.50: -14.00: -1.0: *IT9:\n\ IB9,ID9,IE9,IF9,II9,IJ9,IO9,IQ9,IR9,IT9,IU9,IW9,IY9,=IQ6KX/9;\n\ Djibouti: 37: 48: AF: 11.75: -42.35: -3.0: J2:\n\ J2;\n\ Grenada: 08: 11: NA: 12.13: 61.68: 4.0: J3:\n\ J3;\n\ Guinea-Bissau: 35: 46: AF: 12.02: 14.80: 0.0: J5:\n\ J5;\n\ St. Lucia: 08: 11: NA: 13.87: 61.00: 4.0: J6:\n\ J6;\n\ Dominica: 08: 11: NA: 15.43: 61.35: 4.0: J7:\n\ J7;\n\ St. Vincent: 08: 11: NA: 13.23: 61.20: 4.0: J8:\n\ J8;\n\ Japan: 25: 45: AS: 36.40: -138.38: -9.0: JA:\n\ 7J,7K,7L,7M,7N,8J,8K,8L,8M,8N,JA,JE,JF,JG,JH,JI,JJ,JK,JL,JM,JN,JO,JP,JQ,\n\ JR,JS;\n\ Minami Torishima: 27: 90: OC: 24.28: -153.97: -10.0: JD/m:\n\ =JG8NQJ/JD1;\n\ Ogasawara: 27: 45: AS: 27.05: -142.20: -9.0: JD/o:\n\ JD1;\n\ Mongolia: 23: 32: AS: 46.77: -102.17: -7.0: JT:\n\ JT,JU,JV,JT2[33],JT3[33],JU2[33],JU3[33],JV2[33],JV3[33];\n\ Svalbard: 40: 18: EU: 78.00: -16.00: -1.0: JW:\n\ JW;\n\ Bear Island: 40: 18: EU: 74.43: -19.08: -1.0: *JW/b:\n\ =JW/LB2PG;\n\ Jan Mayen: 40: 18: EU: 71.05: 8.28: 1.0: JX:\n\ JX;\n\ Jordan: 20: 39: AS: 31.18: -36.42: -2.0: JY:\n\ JY;\n\ United States: 05: 08: NA: 37.53: 91.67: 5.0: K:\n\ AA,AB,AC,AD,AE,AF,AG,AI,AJ,AK,K,N,W,=4U1WB(5)[8],=AA0O(5)[8],=AA2IL(3)[6],\n\ =AA4DD(4)[8],=AA4Q(3)[6],=AA5JF(5)[8],=AA8R(5)[8],=AB4B(4)[8],\n\ =AB4GG(4)[8],=AB4IQ(4)[8],=AB8RL(5)[8],=AB8YZ(4)[7],=AC4CA(4)[7],\n\ =AC4G(4)[8],=AC4GW(4)[8],=AC6WI(5)[8],=AC6ZM(4)[8],=AC7AF(4)[7],\n\ =AC8Y(5)[8],=AC9TO(4)[7],=AD1C(4)[7],=AD4EB(4)[8],=AD4TA(4)[8],\n\ =AD8J(5)[8],=AE4ED(4)[8],=AE6JV(5)[8],=AE7AP(4)[6],=AF4T(4)[8],\n\ =AG4W(4)[8],=AH0U(3)[6],=AH2AV(4)[8],=AH2O(5)[8],=AH6FF(4)[8],\n\ =AI4DB(4)[8],=AI6O(4)[7],=AI9K(4)[7],=AJ4A(4)[8],=AJ4F(4)[7],=AJ7G(5)[8],\n\ =AL0A(5)[8],=AL1VE(3)[6],=AL4B(4)[8],=AL7CR(3)[6],=AL7RF(3)[6],\n\ =G8ERJ(5)[8],=K0ACP(4)[8],=K0EJ(4)[8],=K0IP(3)[6],=K0LUZ(5)[8],\n\ =K0NW(3)[6],=K0PJ(4)[8],=K0SN(4)[6],=K0TQ(4)[8],=K0ZR(5)[8],=K1DC(4)[8],\n\ =K1DW(4)[7],=K1GU(4)[8],=K1KD(4)[7],=K1LT(4)[8],=K1OU(4)[8],=K2DRH(4)[7],\n\ =K2DSW(4)[7],=K2GMY(3)[6],=K2KR(4)[7],=K2PM(4)[8],=K2PO(3)[6],=K2RD(3)[6],\n\ =K2RP(3)[6],=K2UR(4)[8],=K2VV(4)[7],=K3DMG(4)[8],=K3EST(3)[6],=K3IE(4)[8],\n\ =K3JWI(4)[8],=K3NT(4)[7],=K3PA(4)[7],=K3WT(4)[7],=K3WYC(3)[6],=K3YP(4)[8],\n\ =K4AB(4)[8],=K4AFE(4)[8],=K4AMC(4)[8],=K4AVX(4)[8],=K4BWP(4)[8],\n\ =K4BX(4)[8],=K4CWW(4)[8],=K4FN(4)[8],=K4FT(4)[8],=K4IE(4)[8],=K4IU(4)[7],\n\ =K4OAQ(4)[8],=K4OWR(4)[8],=K4RO(4)[8],=K4TCG(4)[8],=K4TZ(4)[8],\n\ =K4UU(4)[8],=K4WG(4)[8],=K4WI(4)[8],=K4WW(4)[8],=K4XU(3)[6],=K4YJ(4)[8],\n\ =K4ZGB(4)[8],=K5EK(5)[8],=K5GDX(4)[8],=K5KG(5)[8],=K5OA(3)[6],\n\ =K5VIP(5)[8],=K5ZD(5)[8],=K6BFL(4)[7],=K6XT(4)[7],=K7ABV(4)[6],\n\ =K7BG(4)[7],=K7BV(5)[8],=K7CS(4)[8],=K7DR(4)[8],=K7IA(4)[7],=K7MSO(4)[6],\n\ =K7OM(5)[8],=K7QA(4)[6],=K7SCX(4)[7],=K7SV(5)[8],=K7TD(4)[7],=K8AC(5)[8],\n\ =K8ARY(5)[8],=K8CN(5)[8],=K8IA(3)[6],=K8JQ(5)[8],=K8LBQ(5)[8],=K8LF(5)[8],\n\ =K8LS(4)[7],=K8NYG(5)[8],=K8PO(5)[8],=K8TE(4)[7],=K8TR(3)[6],=K9CHP(5)[8],\n\ =K9DR(4)[7],=K9DU(4)[7],=K9GWS(5)[8],=K9JF(3)[6],=K9JM(3)[6],=K9OM(5)[8],\n\ =K9OZ(4)[7],=K9RS(5)[8],=K9WA(4)[7],=K9WZB(3)[6],=K9YC(3)[6],\n\ =KA3MTT(4)[8],=KA4GAV(4)[7],=KA4OTB(4)[8],=KA8HDE(4)[7],=KA8Q(5)[8],\n\ =KA9FOX(4)[7],=KA9VVQ(4)[7],=KB4QZH(4)[8],=KB7Q(4)[6],=KB9S(4)[7],\n\ =KC2LM(4)[7],=KC4HW(4)[8],=KC4NX(4)[8],=KC4SAW(4)[8],=KC4TEO(4)[8],\n\ =KC4WQ(4)[8],=KC7QY(4)[7],=KC8GCR(5)[8],=KC8J(3)[6],=KC9K(4)[7],\n\ =KD0EE(4)[8],=KD2KW(4)[7],=KD4EE(4)[8],=KD4TRG(4)[8],=KD5DD(4)[8],\n\ =KE0L(4)[8],=KE0YI(4)[8],=KE1B(3)[6],=KE2VB(3)[6],=KE3K(4)[8],\n\ =KE4KY(4)[8],=KE8FT(3)[6],=KF4AV(4)[8],=KF5BA(4)[8],=KF5MU(4)[8],\n\ =KG0F(3)[6],=KG4CUY(4)[8],=KG5HVO(4)[8],=KH2BR(3)[6],=KH2D(5)[8],\n\ =KH2GM(4)[8],=KH2PM(5)[8],=KH2TJ(3)[6],=KH6CT(5)[8],=KH6DHK(5)[8],\n\ =KH6M(5)[8],=KH6VM(3)[6],=KH6XS(3)[6],=KI6DY(4)[8],=KI6QDH(4)[7],\n\ =KI7ID(4)[7],=KJ4AOM(4)[8],=KJ4IWZ(4)[8],=KJ4M(4)[8],=KJ9C(4)[6],\n\ =KK9A(5)[8],=KK9N(4)[7],=KL0SS(5)[8],=KL1SE(4)[8],=KL2AX(4)[7],\n\ =KL2RA(4)[7],=KL4CZ(4)[6],=KL7DJ(3)[6],=KL7HQR(3)[6],=KL7IKV(3)[6],\n\ =KL7NW(4)[7],=KL7QW(4)[7],=KL7SK(3)[6],=KM4FO(4)[8],=KM4JA(4)[8],\n\ =KM6Z(4)[8],=KM7W(4)[6],=KN1CBR(4)[7],=KN8U(5)[8],=KO4OL(4)[8],\n\ =KO8SCA(5)[8],=KO8V(5)[8],=KO9V(4)[7],=KP3M(5)[8],=KP4MD(3)[6],\n\ =KR4F(4)[8],=KS0CW(5)[8],=KS4X(4)[8],=KS7T(4)[6],=KS9W(4)[7],=KT3M(4)[7],\n\ =KT4O(4)[8],=KT4RR(4)[8],=KU1CW(3)[6],=KU8E(5)[8],=KV4T(4)[8],=KV8S(4)[7],\n\ =KW4J(4)[8],=KW7D(4)[7],=KW7Q(4)[7],=KX2P(4)[7],=KX4X(4)[8],=KY0Q(4)[8],\n\ =KZ1W(3)[6],=KZ4KX(4)[8],=KZ9V(4)[7],=N0SMX(5)[8],=N1JM(3)[6],=N1XK(4)[7],\n\ =N2AU(3)[6],=N2BJ(4)[8],=N2IC(4)[7],=N2JNR(3)[6],=N2NL(4)[8],=N3BB(4)[7],\n\ =N3CI(4)[7],=N3RA(4)[8],=N3RC(3)[6],=N3ZZ(3)[6],=N4ARO(4)[8],=N4AU(4)[8],\n\ =N4BAA(4)[8],=N4BCD(4)[8],=N4DW(4)[8],=N4EL(4)[8],=N4JRG(4)[8],\n\ =N4KC(4)[8],=N4KH(4)[8],=N4NA(4)[8],=N4NO(4)[8],=N4OGW(4)[8],=N4QS(4)[8],\n\ =N4SL(4)[6],=N4TZ(4)[8],=N4UC(4)[8],=N4UW(4)[8],=N4VI(4)[7],=N4VV(4)[8],\n\ =N4WE(4)[8],=N4ZY(4)[8],=N4ZZ(4)[8],=N5CR(3)[6],=N5CW(4)[8],=N5DX(5)[8],\n\ =N5KO(3)[6],=N5RP(4)[8],=N5SMQ(5)[8],=N5TB(5)[8],=N5TOO(5)[8],=N5YT(4)[8],\n\ =N5ZO(3)[6],=N6AR(5)[8],=N6DW(5)[8],=N6RSH(4)[7],=N7DR(4)[7],=N7IP(4)[6],\n\ =N7IV(4)[7],=N7MZW(4)[7],=N7NG(4)[7],=N7RCS(5)[8],=N7US(4)[8],=N7WY(4)[7],\n\ =N7ZZ(4)[8],=N8AID(5)[8],=N8GU(5)[8],=N8II(5)[8],=N8NA(5)[8],=N8NN(5)[8],\n\ =N8OO(4)[7],=N8RA(5)[8],=N8WXQ(5)[8],=N9CIQ(4)[7],=N9GB(4)[7],\n\ =N9HDE(4)[7],=N9JF(4)[7],=N9NA(3)[6],=N9NB(5)[8],=N9NC(5)[8],=N9NM(4)[7],\n\ =N9OU(5)[8],=N9RV(4)[6],=N9SB(4)[7],=N9VPV(4)[7],=NA5NN(4)[8],=ND2T(3)[6],\n\ =ND3N(4)[8],=ND4Y(4)[8],=NE8P(5)[8],=NE9U(4)[7],=NF4J(4)[8],=NG7A(4)[7],\n\ =NH6L(4)[7],=NH6T(4)[8],=NI7R(5)[8],=NJ4P(4)[8],=NJ8J(5)[8],=NJ8M(4)[7],\n\ =NK7U(5)[8],=NK8Q(5)[8],=NL7CQ(4)[7],=NL7D(3)[6],=NL7QC(4)[7],\n\ =NL7WA(5)[8],=NL7XM(5)[8],=NN1N(4)[7],=NN4NT(4)[8],=NN5O(4)[8],\n\ =NN7A(4)[7],=NN7CW(5)[8],=NN9DD(5)[8],=NO9E(5)[8],=NP2GG(5)[8],\n\ =NP3FB(4)[8],=NP3K(5)[8],=NQ6N(4)[8],=NR4L(4)[8],=NR5W(3)[6],=NR7DX(4)[6],\n\ =NS2X(4)[8],=NS4X(4)[8],=NT0K(5)[8],=NW2P(3)[6],=NW8U(5)[8],=NX1P(3)[6],\n\ =NX3U(4)[8],=NY6DX(5)[8],=NZ6T(5)[8],=NZ7Q(4)[7],=W0BR(5)[8],=W0NA(5)[8],\n\ =W0PV(5)[8],=W0QQG(5)[8],=W0RIC(3)[6],=W0YK(3)[6],=W0ZP(4)[8],\n\ =W1GKT(4)[8],=W1NN(4)[8],=W1PDI(4)[8],=W1PR(3)[6],=W1RH(3)[6],\n\ =W1SRD(3)[6],=W2ACY(4)[7],=W2GS(4)[7],=W2VJN(3)[6],=W3CB(4)[8],\n\ =W3HDH(4)[8],=W3HKK(4)[8],=W3NX(3)[6],=W3TB(4)[8],=W4BCG(4)[8],\n\ =W4DAN(4)[8],=W4ER(4)[8],=W4GKM(4)[8],=W4KW(4)[8],=W4LC(4)[8],\n\ =W4NBS(4)[8],=W4NI(4)[8],=W4NNF(4)[8],=W4NZ(4)[8],=W4PF(4)[8],\n\ =W4RYW(4)[8],=W4TLK(4)[8],=W4TTM(4)[8],=W4UT(4)[8],=W5JR(5)[8],\n\ =W5MX(4)[8],=W5NZ(4)[8],=W5UE(4)[8],=W5UJ(3)[6],=W5VE(5)[8],=W5VS(5)[8],\n\ =W6DVS(5)[8],=W6GMT(4)[7],=W6KGP(4)[7],=W6LFB(4)[7],=W6NWS(5)[8],\n\ =W6SFG(5)[8],=W6UB(4)[8],=W6XR(5)[8],=W7DXX(4)[7],=W7EE(4)[6],\n\ =W7GKF(5)[8],=W7HJ(5)[8],=W7II(4)[7],=W7IMP(5)[8],=W7IY(5)[8],=W7RY(4)[7],\n\ =W7UT(4)[7],=W8AT(5)[8],=W8FJ(5)[8],=W8FN(5)[8],=W8HAP(5)[8],=W8HGH(5)[8],\n\ =W8LYJ(4)[7],=W8OV(4)[7],=W8TK(3)[6],=W9CF(3)[6],=W9DC(5)[8],=W9ET(4)[7],\n\ =W9FI(3)[6],=W9JA(4)[7],=W9JEF(4)[7],=W9KKN(3)[6],=W9MAF(4)[7],\n\ =W9PL(3)[6],=W9RM(4)[7],=W9RNY(4)[7],=WA0LJM(5)[8],=WA0WWW(3)[6],\n\ =WA1FCN(4)[8],=WA1UJU(4)[8],=WA2VYA(4)[7],=WA3C(4)[8],=WA5POK(4)[8],\n\ =WA8KAN(5)[8],=WA8OJR(5)[8],=WA8ZBT(4)[7],=WB3JFS(3)[6],=WB4YDY(4)[8],\n\ =WB5WAJ(4)[8],=WB8BPU(5)[8],=WB8YYY(5)[8],=WB9QAF(4)[7],=WC7S(4)[7],\n\ =WE5P(4)[8],=WE6EZ(4)[7],=WF7T(4)[8],=WF9A(5)[8],=WH0AI(4)[7],\n\ =WH6AQ(5)[8],=WH6LE(5)[8],=WH7R(4)[7],=WJ4HCP(4)[8],=WJ9B(3)[6],\n\ =WL5H(4)[7],=WL7OU(4)[7],=WM5DX(4)[8],=WN7S(5)[8],=WN7Y(4)[7],=WO7U(4)[7],\n\ =WP2J(5)[8],=WP3ME(5)[8],=WQ5L(4)[8],=WR3O(4)[8],=WS6K(4)[8],=WS6X(5)[8],\n\ =WS7X(5)[8],=WS9M(5)[8],=WT2P(4)[8],=WT7TT(4)[7],=WT8WV(5)[8],=WU0B(5)[8],\n\ =WU9B(3)[6],=WV4P(4)[8],=WW4R(4)[8],=WW5M(4)[8],=WX4W(4)[8],=WX5S(3)[6],\n\ =WY6K(4)[7],=WY7FD(4)[7],=WZ1Y(4)[7],=WZ4F(4)[8],=WZ7I(5)[8],=WZ8T(3)[6];\n\ Guantanamo Bay: 08: 11: NA: 20.00: 75.00: 5.0: KG4:\n\ KG4,=KG4NE;\n\ Mariana Islands: 27: 64: OC: 15.18: -145.72: -10.0: KH0:\n\ AH0,KH0,NH0,WH0,=AA1AB,=K8RN,=KI5DQL,=NH2B;\n\ Baker & Howland Islands: 31: 61: OC: 0.00: 176.00: 12.0: KH1:\n\ AH1,KH1,NH1,WH1;\n\ Guam: 27: 64: OC: 13.37: -144.70: -10.0: KH2:\n\ AH2,KH2,NH2,WH2,=KG6DX,=KG6JDX,=KH6KK,=KN4LVP;\n\ Johnston Island: 31: 61: OC: 16.72: 169.53: 10.0: KH3:\n\ AH3,KH3,NH3,WH3;\n\ Midway Island: 31: 61: OC: 28.20: 177.37: 11.0: KH4:\n\ AH4,KH4,NH4,WH4;\n\ Palmyra & Jarvis Islands: 31: 61: OC: 5.87: 162.07: 11.0: KH5:\n\ AH5,KH5,NH5,WH5;\n\ Hawaii: 31: 61: OC: 21.12: 157.48: 10.0: KH6:\n\ AH6,AH7,KH6,KH7,NH6,NH7,WH6,WH7,=K1TOR,=K2GT,=K4JMB,=K4XV,=K5PKT,=K6HNL,\n\ =K9FD,=KB1KAC,=KB3HXI,=KB5OXR,=KC0HFI,=KC2CLQ,=KC6MCC,=KC8JNV,=KD0JNO,\n\ =KE0KIE,=KE7DES,=KE7DET,=KF4UJC,=KF5JFX,=KF6OHL,=KG5CH,=KG5CNO,=KG5IVP,\n\ =KG7TSD,=KH0WJ,=KH3AE,=KJ6CPN,=KJ6CQT,=KJ6FDF,=KK6DWS,=KL3JC,=KM6RWE,\n\ =KM6UVP,=N0VYO,=N3GWR,=N4BER,=N7JRO,=N7OBR,=NB6R,=ND1A,=NR0G,=W1ETT,\n\ =W1JJS,=W6QPV,=W7NX,=W7WKS,=WA6AW,=WA6CZL,=WA6QDQ,=WA7WSU,=WB4JTT,=WK1K;\n\ Kure Island: 31: 61: OC: 29.00: 178.00: 10.0: KH7K:\n\ AH7K,KH7K,NH7K,WH7K;\n\ American Samoa: 32: 62: OC: -14.32: 170.78: 11.0: KH8:\n\ AH8,KH8,NH8,WH8,=KD2UVU;\n\ Swains Island: 32: 62: OC: -11.05: 171.25: 11.0: KH8/s:\n\ =K9CS/KH8S;\n\ Wake Island: 31: 65: OC: 19.28: -166.63: -12.0: KH9:\n\ AH9,KH9,NH9,WH9;\n\ Alaska: 01: 01: NA: 61.40: 148.87: 8.0: KL:\n\ AL,KL,NL,WL,=AI7CF,=K0ESQ,=K1IEE,=K1LQ,=K1TMT,=K5RD,=K7BUF,=K7CAP,=K7VRK,\n\ =KA1NCN,=KB5NOW,=KB7RWK,=KB9THD,=KC0EFL,=KC1LVR,=KC3BWW,=KC3NUH,=KC5NHL,\n\ =KC7DNT,=KC9IKH,=KC9SXX,=KD5MQC,=KD5SHW,=KD8KQL,=KD9QKS,=KE0PRX,=KE5WGZ,\n\ =KE7ZXH,=KF7ARC,=KF7FLL,=KF7FLM,=KF7GCF,=KF7ING,=KF7ITN,=KF7KTH,=KF7WVE,\n\ =KG7OYE,=KG7ZEV,=KI4FJK,=KI7BKQ,=KJ6RFQ,=KK6SNS,=KM6YOD,=KN4ENR,=KN4LJD,\n\ =KW4XD,=N0JOB,=N4DBX,=N7CGC,=N7DUD,=N7ELD,=NH2LS,=W1LYD,=W2KRZ,=W3MKG,\n\ =W7EGG,=WA1FVJ,=WA1OUS,=WA4RRE,=WA7B;\n\ Navassa Island: 08: 11: NA: 18.40: 75.00: 5.0: KP1:\n\ KP1,NP1,WP1;\n\ US Virgin Islands: 08: 11: NA: 17.73: 64.80: 4.0: KP2:\n\ KP2,NP2,WP2,=K5KUB,=K9VV,=KV4CF,=KV4KW,=W4LIS;\n\ Puerto Rico: 08: 11: NA: 18.18: 66.55: 4.0: KP4:\n\ KP3,KP4,NP3,NP4,WP3,WP4,=KB2BVX,=KB3TTV,=KC2GRZ,=KC2TE,=KC5FWS,=KF5YGN,\n\ =KF5YGX,=KG6WWV,=KH2RU,=KI5KQH,=KM4ZWY,=N2FVA,=N4MMT,=N4NDL,=N8MQ;\n\ Desecheo Island: 08: 11: NA: 18.08: 67.88: 4.0: KP5:\n\ KP5,NP5,WP5;\n\ Norway: 14: 18: EU: 61.00: -9.00: -1.0: LA:\n\ LA,LB,LC,LD,LE,LF,LG,LH,LI,LJ,LK,LL,LM,LN;\n\ Argentina: 13: 14: SA: -34.80: 65.92: 3.0: LU:\n\ AY,AZ,L1,L2,L3,L4,L5,L6,L7,L8,L9,LO,LP,LQ,LR,LS,LT,LU,LV,LW,AY0V[16],\n\ AY0W[16],AY0X[16],AY0Y[16],AY1V[16],AY1W[16],AY1X[16],AY1Y[16],AY2V[16],\n\ AY2W[16],AY2X[16],AY2Y[16],AY3V[16],AY3W[16],AY3X[16],AY3Y[16],AY4V[16],\n\ AY4W[16],AY4X[16],AY4Y[16],AY5V[16],AY5W[16],AY5X[16],AY5Y[16],AY6V[16],\n\ AY6W[16],AY6X[16],AY6Y[16],AY7V[16],AY7W[16],AY7X[16],AY7Y[16],AY8V[16],\n\ AY8W[16],AY8X[16],AY8Y[16],AY9V[16],AY9W[16],AY9X[16],AY9Y[16],AZ0V[16],\n\ AZ0W[16],AZ0X[16],AZ0Y[16],AZ1V[16],AZ1W[16],AZ1X[16],AZ1Y[16],AZ2V[16],\n\ AZ2W[16],AZ2X[16],AZ2Y[16],AZ3V[16],AZ3W[16],AZ3X[16],AZ3Y[16],AZ4V[16],\n\ AZ4W[16],AZ4X[16],AZ4Y[16],AZ5V[16],AZ5W[16],AZ5X[16],AZ5Y[16],AZ6V[16],\n\ AZ6W[16],AZ6X[16],AZ6Y[16],AZ7V[16],AZ7W[16],AZ7X[16],AZ7Y[16],AZ8V[16],\n\ AZ8W[16],AZ8X[16],AZ8Y[16],AZ9V[16],AZ9W[16],AZ9X[16],AZ9Y[16],L20V[16],\n\ L20W[16],L20X[16],L20Y[16],L21V[16],L21W[16],L21X[16],L21Y[16],L22V[16],\n\ L22W[16],L22X[16],L22Y[16],L23V[16],L23W[16],L23X[16],L23Y[16],L24V[16],\n\ L24W[16],L24X[16],L24Y[16],L25V[16],L25W[16],L25X[16],L25Y[16],L26V[16],\n\ L26W[16],L26X[16],L26Y[16],L27V[16],L27W[16],L27X[16],L27Y[16],L28V[16],\n\ L28W[16],L28X[16],L28Y[16],L29V[16],L29W[16],L29X[16],L29Y[16],L30V[16],\n\ L30W[16],L30X[16],L30Y[16],L31V[16],L31W[16],L31X[16],L31Y[16],L32V[16],\n\ L32W[16],L32X[16],L32Y[16],L33V[16],L33W[16],L33X[16],L33Y[16],L34V[16],\n\ L34W[16],L34X[16],L34Y[16],L35V[16],L35W[16],L35X[16],L35Y[16],L36V[16],\n\ L36W[16],L36X[16],L36Y[16],L37V[16],L37W[16],L37X[16],L37Y[16],L38V[16],\n\ L38W[16],L38X[16],L38Y[16],L39V[16],L39W[16],L39X[16],L39Y[16],L40V[16],\n\ L40W[16],L40X[16],L40Y[16],L41V[16],L41W[16],L41X[16],L41Y[16],L42V[16],\n\ L42W[16],L42X[16],L42Y[16],L43V[16],L43W[16],L43X[16],L43Y[16],L44V[16],\n\ L44W[16],L44X[16],L44Y[16],L45V[16],L45W[16],L45X[16],L45Y[16],L46V[16],\n\ L46W[16],L46X[16],L46Y[16],L47V[16],L47W[16],L47X[16],L47Y[16],L48V[16],\n\ L48W[16],L48X[16],L48Y[16],L49V[16],L49W[16],L49X[16],L49Y[16],L50V[16],\n\ L50W[16],L50X[16],L50Y[16],L51V[16],L51W[16],L51X[16],L51Y[16],L52V[16],\n\ L52W[16],L52X[16],L52Y[16],L53V[16],L53W[16],L53X[16],L53Y[16],L54V[16],\n\ L54W[16],L54X[16],L54Y[16],L55V[16],L55W[16],L55X[16],L55Y[16],L56V[16],\n\ L56W[16],L56X[16],L56Y[16],L57V[16],L57W[16],L57X[16],L57Y[16],L58V[16],\n\ L58W[16],L58X[16],L58Y[16],L59V[16],L59W[16],L59X[16],L59Y[16],L60V[16],\n\ L60W[16],L60X[16],L60Y[16],L61V[16],L61W[16],L61X[16],L61Y[16],L62V[16],\n\ L62W[16],L62X[16],L62Y[16],L63V[16],L63W[16],L63X[16],L63Y[16],L64V[16],\n\ L64W[16],L64X[16],L64Y[16],L65V[16],L65W[16],L65X[16],L65Y[16],L66V[16],\n\ L66W[16],L66X[16],L66Y[16],L67V[16],L67W[16],L67X[16],L67Y[16],L68V[16],\n\ L68W[16],L68X[16],L68Y[16],L69V[16],L69W[16],L69X[16],L69Y[16],L70V[16],\n\ L70W[16],L70X[16],L70Y[16],L71V[16],L71W[16],L71X[16],L71Y[16],L72V[16],\n\ L72W[16],L72X[16],L72Y[16],L73V[16],L73W[16],L73X[16],L73Y[16],L74V[16],\n\ L74W[16],L74X[16],L74Y[16],L75V[16],L75W[16],L75X[16],L75Y[16],L76V[16],\n\ L76W[16],L76X[16],L76Y[16],L77V[16],L77W[16],L77X[16],L77Y[16],L78V[16],\n\ L78W[16],L78X[16],L78Y[16],L79V[16],L79W[16],L79X[16],L79Y[16],L80V[16],\n\ L80W[16],L80X[16],L80Y[16],L81V[16],L81W[16],L81X[16],L81Y[16],L82V[16],\n\ L82W[16],L82X[16],L82Y[16],L83V[16],L83W[16],L83X[16],L83Y[16],L84V[16],\n\ L84W[16],L84X[16],L84Y[16],L85V[16],L85W[16],L85X[16],L85Y[16],L86V[16],\n\ L86W[16],L86X[16],L86Y[16],L87V[16],L87W[16],L87X[16],L87Y[16],L88V[16],\n\ L88W[16],L88X[16],L88Y[16],L89V[16],L89W[16],L89X[16],L89Y[16],L90V[16],\n\ L90W[16],L90X[16],L90Y[16],L91V[16],L91W[16],L91X[16],L91Y[16],L92V[16],\n\ L92W[16],L92X[16],L92Y[16],L93V[16],L93W[16],L93X[16],L93Y[16],L94V[16],\n\ L94W[16],L94X[16],L94Y[16],L95V[16],L95W[16],L95X[16],L95Y[16],L96V[16],\n\ L96W[16],L96X[16],L96Y[16],L97V[16],L97W[16],L97X[16],L97Y[16],L98V[16],\n\ L98W[16],L98X[16],L98Y[16],L99V[16],L99W[16],L99X[16],L99Y[16],LO0V[16],\n\ LO0W[16],LO0X[16],LO0Y[16],LO1V[16],LO1W[16],LO1X[16],LO1Y[16],LO2V[16],\n\ LO2W[16],LO2X[16],LO2Y[16],LO3V[16],LO3W[16],LO3X[16],LO3Y[16],LO4V[16],\n\ LO4W[16],LO4X[16],LO4Y[16],LO5V[16],LO5W[16],LO5X[16],LO5Y[16],LO6V[16],\n\ LO6W[16],LO6X[16],LO6Y[16],LO7V[16],LO7W[16],LO7X[16],LO7Y[16],LO8V[16],\n\ LO8W[16],LO8X[16],LO8Y[16],LO9V[16],LO9W[16],LO9X[16],LO9Y[16],LP0V[16],\n\ LP0W[16],LP0X[16],LP0Y[16],LP1V[16],LP1W[16],LP1X[16],LP1Y[16],LP2V[16],\n\ LP2W[16],LP2X[16],LP2Y[16],LP3V[16],LP3W[16],LP3X[16],LP3Y[16],LP4V[16],\n\ LP4W[16],LP4X[16],LP4Y[16],LP5V[16],LP5W[16],LP5X[16],LP5Y[16],LP6V[16],\n\ LP6W[16],LP6X[16],LP6Y[16],LP7V[16],LP7W[16],LP7X[16],LP7Y[16],LP8V[16],\n\ LP8W[16],LP8X[16],LP8Y[16],LP9V[16],LP9W[16],LP9X[16],LP9Y[16],LQ0V[16],\n\ LQ0W[16],LQ0X[16],LQ0Y[16],LQ1V[16],LQ1W[16],LQ1X[16],LQ1Y[16],LQ2V[16],\n\ LQ2W[16],LQ2X[16],LQ2Y[16],LQ3V[16],LQ3W[16],LQ3X[16],LQ3Y[16],LQ4V[16],\n\ LQ4W[16],LQ4X[16],LQ4Y[16],LQ5V[16],LQ5W[16],LQ5X[16],LQ5Y[16],LQ6V[16],\n\ LQ6W[16],LQ6X[16],LQ6Y[16],LQ7V[16],LQ7W[16],LQ7X[16],LQ7Y[16],LQ8V[16],\n\ LQ8W[16],LQ8X[16],LQ8Y[16],LQ9V[16],LQ9W[16],LQ9X[16],LQ9Y[16],LR0V[16],\n\ LR0W[16],LR0X[16],LR0Y[16],LR1V[16],LR1W[16],LR1X[16],LR1Y[16],LR2V[16],\n\ LR2W[16],LR2X[16],LR2Y[16],LR3V[16],LR3W[16],LR3X[16],LR3Y[16],LR4V[16],\n\ LR4W[16],LR4X[16],LR4Y[16],LR5V[16],LR5W[16],LR5X[16],LR5Y[16],LR6V[16],\n\ LR6W[16],LR6X[16],LR6Y[16],LR7V[16],LR7W[16],LR7X[16],LR7Y[16],LR8V[16],\n\ LR8W[16],LR8X[16],LR8Y[16],LR9V[16],LR9W[16],LR9X[16],LR9Y[16],LS0V[16],\n\ LS0W[16],LS0X[16],LS0Y[16],LS1V[16],LS1W[16],LS1X[16],LS1Y[16],LS2V[16],\n\ LS2W[16],LS2X[16],LS2Y[16],LS3V[16],LS3W[16],LS3X[16],LS3Y[16],LS4V[16],\n\ LS4W[16],LS4X[16],LS4Y[16],LS5V[16],LS5W[16],LS5X[16],LS5Y[16],LS6V[16],\n\ LS6W[16],LS6X[16],LS6Y[16],LS7V[16],LS7W[16],LS7X[16],LS7Y[16],LS8V[16],\n\ LS8W[16],LS8X[16],LS8Y[16],LS9V[16],LS9W[16],LS9X[16],LS9Y[16],LT0V[16],\n\ LT0W[16],LT0X[16],LT0Y[16],LT1V[16],LT1W[16],LT1X[16],LT1Y[16],LT2V[16],\n\ LT2W[16],LT2X[16],LT2Y[16],LT3V[16],LT3W[16],LT3X[16],LT3Y[16],LT4V[16],\n\ LT4W[16],LT4X[16],LT4Y[16],LT5V[16],LT5W[16],LT5X[16],LT5Y[16],LT6V[16],\n\ LT6W[16],LT6X[16],LT6Y[16],LT7V[16],LT7W[16],LT7X[16],LT7Y[16],LT8V[16],\n\ LT8W[16],LT8X[16],LT8Y[16],LT9V[16],LT9W[16],LT9X[16],LT9Y[16],LU0V[16],\n\ LU0W[16],LU0X[16],LU0Y[16],LU1V[16],LU1W[16],LU1X[16],LU1Y[16],LU2V[16],\n\ LU2W[16],LU2X[16],LU2Y[16],LU3V[16],LU3W[16],LU3X[16],LU3Y[16],LU4V[16],\n\ LU4W[16],LU4X[16],LU4Y[16],LU5V[16],LU5W[16],LU5X[16],LU5Y[16],LU6V[16],\n\ LU6W[16],LU6X[16],LU6Y[16],LU7V[16],LU7W[16],LU7X[16],LU7Y[16],LU8V[16],\n\ LU8W[16],LU8X[16],LU8Y[16],LU9V[16],LU9W[16],LU9X[16],LU9Y[16],LV0V[16],\n\ LV0W[16],LV0X[16],LV0Y[16],LV1V[16],LV1W[16],LV1X[16],LV1Y[16],LV2V[16],\n\ LV2W[16],LV2X[16],LV2Y[16],LV3V[16],LV3W[16],LV3X[16],LV3Y[16],LV4V[16],\n\ LV4W[16],LV4X[16],LV4Y[16],LV5V[16],LV5W[16],LV5X[16],LV5Y[16],LV6V[16],\n\ LV6W[16],LV6X[16],LV6Y[16],LV7V[16],LV7W[16],LV7X[16],LV7Y[16],LV8V[16],\n\ LV8W[16],LV8X[16],LV8Y[16],LV9V[16],LV9W[16],LV9X[16],LV9Y[16],LW0V[16],\n\ LW0W[16],LW0X[16],LW0Y[16],LW1V[16],LW1W[16],LW1X[16],LW1Y[16],LW2V[16],\n\ LW2W[16],LW2X[16],LW2Y[16],LW3V[16],LW3W[16],LW3X[16],LW3Y[16],LW4V[16],\n\ LW4W[16],LW4X[16],LW4Y[16],LW5V[16],LW5W[16],LW5X[16],LW5Y[16],LW6V[16],\n\ LW6W[16],LW6X[16],LW6Y[16],LW7V[16],LW7W[16],LW7X[16],LW7Y[16],LW8V[16],\n\ LW8W[16],LW8X[16],LW8Y[16],LW9V[16],LW9W[16],LW9X[16],LW9Y[16],\n\ =LU1AW/X[16],=LU1HB/J,=LU1JGU/J,=LU2DVI/H,=LU3DVN/X[16],=LU4AA/D,=LU4AA/X,\n\ =LU4ARU/D,=LU6FLZ/F;\n\ Luxembourg: 14: 27: EU: 50.00: -6.00: -1.0: LX:\n\ LX,=LX9S/J;\n\ Lithuania: 15: 29: EU: 55.45: -23.63: -2.0: LY:\n\ LY;\n\ Bulgaria: 20: 28: EU: 42.83: -25.08: -2.0: LZ:\n\ LZ;\n\ Peru: 10: 12: SA: -10.00: 76.00: 5.0: OA:\n\ 4T,OA,OB,OC;\n\ Lebanon: 20: 39: AS: 33.83: -35.83: -2.0: OD:\n\ OD;\n\ Austria: 15: 28: EU: 47.33: -13.33: -1.0: OE:\n\ OE,=4U0R,=4U1A,=4U1VIC,=4U2STAYHOME,=4U2U,=4U75A,=4Y1A,=C7A;\n\ Finland: 15: 18: EU: 63.78: -27.08: -2.0: OH:\n\ OF,OG,OH,OI,OJ;\n\ Aland Islands: 15: 18: EU: 60.13: -20.37: -2.0: OH0:\n\ OF0,OG0,OH0,OI0;\n\ Market Reef: 15: 18: EU: 60.00: -19.00: -2.0: OJ0:\n\ OJ0;\n\ Czech Republic: 15: 28: EU: 50.00: -16.00: -1.0: OK:\n\ OK,OL;\n\ Slovak Republic: 15: 28: EU: 49.00: -20.00: -1.0: OM:\n\ OM;\n\ Belgium: 14: 27: EU: 50.70: -4.85: -1.0: ON:\n\ ON,OO,OP,OQ,OR,OS,OT;\n\ Greenland: 40: 05: NA: 74.00: 42.78: 3.0: OX:\n\ OX,XP;\n\ Faroe Islands: 14: 18: EU: 62.07: 6.93: 0.0: OY:\n\ OW,OY;\n\ Denmark: 14: 18: EU: 56.00: -10.00: -1.0: OZ:\n\ 5P,5Q,OU,OV,OZ;\n\ Papua New Guinea: 28: 51: OC: -9.50: -147.12: -10.0: P2:\n\ P2;\n\ Aruba: 09: 11: SA: 12.53: 69.98: 4.0: P4:\n\ P4;\n\ DPR of Korea: 25: 44: AS: 39.78: -126.30: -9.0: P5:\n\ P5,P6,P7,P8,P9;\n\ Netherlands: 14: 27: EU: 52.28: -5.47: -1.0: PA:\n\ PA,PB,PC,PD,PE,PF,PG,PH,PI,=PE1BOJ/J;\n\ Curacao: 09: 11: SA: 12.17: 69.00: 4.0: PJ2:\n\ PJ2;\n\ Bonaire: 09: 11: SA: 12.20: 68.25: 4.0: PJ4:\n\ PJ4;\n\ Saba & St. Eustatius: 08: 11: NA: 17.57: 63.10: 4.0: PJ5:\n\ PJ5,PJ6;\n\ Sint Maarten: 08: 11: NA: 18.07: 63.07: 4.0: PJ7:\n\ PJ0,PJ7,PJ8;\n\ Brazil: 11: 15: SA: -10.00: 53.00: 3.0: PY:\n\ PP,PQ,PR,PS,PT,PU,PV,PW,PX,PY,ZV,ZW,ZX,ZY,ZZ,PP6[13],PP7[13],PP8[12],\n\ PQ2[13],PQ8[13],PR7[13],PR8[13],PS7[13],PS8[13],PT2[13],PT7[13],PT8[12],\n\ PV8[12],PW8[12],PY6[13],PY7[13],PY8[13],PY9[13];\n\ Fernando de Noronha: 11: 13: SA: -3.85: 32.43: 2.0: PY0F:\n\ PP0F,PP0ZF,PQ0F,PQ0ZF,PR0F,PR0ZF,PS0F,PS0ZF,PT0F,PT0ZF,PU0F,PU0ZF,PV0F,\n\ PV0ZF,PW0F,PW0ZF,PX0F,PX0ZF,PY0F,PY0Z,ZV0F,ZV0ZF,ZW0F,ZW0ZF,ZX0F,ZX0ZF,\n\ ZY0F,ZY0Z,ZZ0F,ZZ0ZF,PP0R,PP0ZR,PQ0R,PQ0ZR,PR0R,PR0ZR,PS0R,PS0ZR,PT0R,\n\ PT0ZR,PU0R,PU0ZR,PV0R,PV0ZR,PW0R,PW0ZR,PX0R,PX0ZR,PY0R,ZV0R,ZV0ZR,ZW0R,\n\ ZW0ZR,ZX0R,ZX0ZR,ZY0R,ZZ0R,ZZ0ZR;\n\ St. Peter & St. Paul: 11: 13: SA: 0.00: 29.00: 2.0: PY0S:\n\ PP0S,PP0ZS,PQ0S,PQ0ZS,PR0S,PR0ZS,PS0S,PS0ZS,PT0S,PT0ZS,PU0S,PU0ZS,PV0S,\n\ PV0ZS,PW0S,PW0ZS,PX0S,PX0ZS,PY0S,PY0ZS,ZV0S,ZV0ZS,ZW0S,ZW0ZS,ZX0S,ZX0ZS,\n\ ZY0S,ZY0ZS,ZZ0S,ZZ0ZS;\n\ Trindade & Martim Vaz: 11: 15: SA: -20.50: 29.32: 2.0: PY0T:\n\ PP0T,PP0ZT,PQ0T,PQ0ZT,PR0T,PR0ZT,PS0T,PS0ZT,PT0T,PT0ZT,PU0T,PU0ZT,PV0T,\n\ PV0ZT,PW0T,PW0ZT,PX0T,PX0ZT,PY0T,PY0ZT,ZV0T,ZV0ZT,ZW0T,ZW0ZT,ZX0T,ZX0ZT,\n\ ZY0T,ZY0ZT,ZZ0T,ZZ0ZT;\n\ Suriname: 09: 12: SA: 4.00: 56.00: 3.0: PZ:\n\ PZ;\n\ Franz Josef Land: 40: 75: EU: 80.68: -49.92: -3.0: R1FJ:\n\ RI1F;\n\ Western Sahara: 33: 46: AF: 24.82: 13.85: 0.0: S0:\n\ S0;\n\ Bangladesh: 22: 41: AS: 24.12: -89.65: -6.0: S2:\n\ S2,S3;\n\ Slovenia: 15: 28: EU: 46.00: -14.00: -1.0: S5:\n\ S5;\n\ Seychelles: 39: 53: AF: -4.67: -55.47: -4.0: S7:\n\ S7;\n\ Sao Tome & Principe: 36: 47: AF: 0.22: -6.57: 0.0: S9:\n\ S9;\n\ Sweden: 14: 18: EU: 61.20: -14.57: -1.0: SM:\n\ 7S,8S,SA,SB,SC,SD,SE,SF,SG,SH,SI,SJ,SK,SL,SM;\n\ Poland: 15: 28: EU: 52.28: -18.67: -1.0: SP:\n\ 3Z,HF,SN,SO,SP,SQ,SR;\n\ Sudan: 34: 48: AF: 14.47: -28.62: -3.0: ST:\n\ 6T,6U,ST;\n\ Egypt: 34: 38: AF: 26.28: -28.60: -2.0: SU:\n\ 6A,6B,SS,SU;\n\ Greece: 20: 28: EU: 39.78: -21.78: -2.0: SV:\n\ J4,SV,SW,SX,SY,SZ,=SV2JAO/J;\n\ Mount Athos: 20: 28: EU: 40.00: -24.00: -2.0: SV/a:\n\ =SV2ASP/A,=SV2RSG/A;\n\ Dodecanese: 20: 28: EU: 36.17: -27.93: -2.0: SV5:\n\ J45,SV5,SW5,SX5,SY5,SZ5;\n\ Crete: 20: 28: EU: 35.23: -24.78: -2.0: SV9:\n\ J49,SV9,SW9,SX9,SY9,SZ9,=SV0XAZ;\n\ Tuvalu: 31: 65: OC: -8.50: -179.20: -12.0: T2:\n\ T2;\n\ Western Kiribati: 31: 65: OC: 1.42: -173.00: -12.0: T30:\n\ T30;\n\ Central Kiribati: 31: 62: OC: -2.83: 171.72: -13.0: T31:\n\ T31;\n\ Eastern Kiribati: 31: 61: OC: 1.80: 157.35: -14.0: T32:\n\ T32;\n\ Banaba Island: 31: 65: OC: -0.88: -169.53: -12.0: T33:\n\ T33;\n\ Somalia: 37: 48: AF: 2.03: -45.35: -3.0: T5:\n\ 6O,T5;\n\ San Marino: 15: 28: EU: 43.95: -12.45: -1.0: T7:\n\ T7;\n\ Palau: 27: 64: OC: 7.45: -134.53: -9.0: T8:\n\ T8;\n\ Asiatic Turkey: 20: 39: AS: 39.18: -35.65: -2.0: TA:\n\ TA,TB,TC,YM,=TA1C/2,=TA1CX/2,=TA1D/3,=TA1D/4,=TA1FA/2,=TA1HZ/2,=TA1UT/3;\n\ European Turkey: 20: 39: EU: 41.02: -28.97: -2.0: *TA1:\n\ TA1,TB1,TC1,YM1,=TA6CQ/1;\n\ Iceland: 40: 17: EU: 64.80: 18.73: 0.0: TF:\n\ TF;\n\ Guatemala: 07: 11: NA: 15.50: 90.30: 6.0: TG:\n\ TD,TG;\n\ Costa Rica: 07: 11: NA: 10.00: 84.00: 6.0: TI:\n\ TE,TI;\n\ Cocos Island: 07: 11: NA: 5.52: 87.05: 6.0: TI9:\n\ TE9,TI9;\n\ Cameroon: 36: 47: AF: 5.38: -11.87: -1.0: TJ:\n\ TJ;\n\ Corsica: 15: 28: EU: 42.00: -9.00: -1.0: TK:\n\ TK;\n\ Central African Republic: 36: 47: AF: 6.75: -20.33: -1.0: TL:\n\ TL;\n\ Republic of the Congo: 36: 52: AF: -1.02: -15.37: -1.0: TN:\n\ TN;\n\ Gabon: 36: 52: AF: -0.37: -11.73: -1.0: TR:\n\ TR;\n\ Chad: 36: 47: AF: 15.80: -18.17: -1.0: TT:\n\ TT;\n\ Cote d'Ivoire: 35: 46: AF: 7.58: 5.80: 0.0: TU:\n\ TU;\n\ Benin: 35: 46: AF: 9.87: -2.25: -1.0: TY:\n\ TY;\n\ Mali: 35: 46: AF: 18.00: 2.58: 0.0: TZ:\n\ TZ;\n\ European Russia: 16: 29: EU: 53.65: -41.37: -4.0: UA:\n\ R,U,R1I(17)[20],R1N[19],R1O[19],R1P[20],R1Z[19],R4H[30],R4I[30],R4W[30],\n\ R8F(17)[30],R8G(17)[30],R8X(17)[20],R9F(17)[30],R9G(17)[30],R9X(17)[20],\n\ RA1I(17)[20],RA1N[19],RA1O[19],RA1P[20],RA1Z[19],RA4H[30],RA4I[30],\n\ RA4W[30],RA8F(17)[30],RA8G(17)[30],RA8X(17)[20],RA9F(17)[30],RA9G(17)[30],\n\ RA9X(17)[20],RC1I(17)[20],RC1N[19],RC1O[19],RC1P[20],RC1Z[19],RC4H[30],\n\ RC4I[30],RC4W[30],RC8F(17)[30],RC8G(17)[30],RC8X(17)[20],RC9F(17)[30],\n\ RC9G(17)[30],RC9X(17)[20],RD1I(17)[20],RD1N[19],RD1O[19],RD1P[20],\n\ RD1Z[19],RD4H[30],RD4I[30],RD4W[30],RD8F(17)[30],RD8G(17)[30],\n\ RD8X(17)[20],RD9F(17)[30],RD9G(17)[30],RD9X(17)[20],RE1I(17)[20],RE1N[19],\n\ RE1O[19],RE1P[20],RE1Z[19],RE4H[30],RE4I[30],RE4W[30],RE8F(17)[30],\n\ RE8G(17)[30],RE8X(17)[20],RE9F(17)[30],RE9G(17)[30],RE9X(17)[20],\n\ RF1I(17)[20],RF1N[19],RF1O[19],RF1P[20],RF1Z[19],RF4H[30],RF4I[30],\n\ RF4W[30],RF8F(17)[30],RF8G(17)[30],RF8X(17)[20],RF9F(17)[30],RF9G(17)[30],\n\ RF9X(17)[20],RG1I(17)[20],RG1N[19],RG1O[19],RG1P[20],RG1Z[19],RG4H[30],\n\ RG4I[30],RG4W[30],RG8F(17)[30],RG8G(17)[30],RG8X(17)[20],RG9F(17)[30],\n\ RG9G(17)[30],RG9X(17)[20],RI8X(17)[20],RI9X(17)[20],RJ1I(17)[20],RJ1N[19],\n\ RJ1O[19],RJ1P[20],RJ1Z[19],RJ4H[30],RJ4I[30],RJ4W[30],RJ8F(17)[30],\n\ RJ8G(17)[30],RJ8X(17)[20],RJ9F(17)[30],RJ9G(17)[30],RJ9X(17)[20],\n\ RK1I(17)[20],RK1N[19],RK1O[19],RK1P[20],RK1Z[19],RK4H[30],RK4I[30],\n\ RK4W[30],RK8F(17)[30],RK8G(17)[30],RK8X(17)[20],RK9F(17)[30],RK9G(17)[30],\n\ RK9X(17)[20],RL1I(17)[20],RL1N[19],RL1O[19],RL1P[20],RL1Z[19],RL4H[30],\n\ RL4I[30],RL4W[30],RL8F(17)[30],RL8G(17)[30],RL8X(17)[20],RL9F(17)[30],\n\ RL9G(17)[30],RL9X(17)[20],RM1I(17)[20],RM1N[19],RM1O[19],RM1P[20],\n\ RM1Z[19],RM4H[30],RM4I[30],RM4W[30],RM8F(17)[30],RM8G(17)[30],\n\ RM8X(17)[20],RM9F(17)[30],RM9G(17)[30],RM9X(17)[20],RN1I(17)[20],RN1N[19],\n\ RN1O[19],RN1P[20],RN1Z[19],RN4H[30],RN4I[30],RN4W[30],RN8F(17)[30],\n\ RN8G(17)[30],RN8X(17)[20],RN9F(17)[30],RN9G(17)[30],RN9X(17)[20],\n\ RO1I(17)[20],RO1N[19],RO1O[19],RO1P[20],RO1Z[19],RO4H[30],RO4I[30],\n\ RO4W[30],RO8F(17)[30],RO8G(17)[30],RO8X(17)[20],RO9F(17)[30],RO9G(17)[30],\n\ RO9X(17)[20],RQ1I(17)[20],RQ1N[19],RQ1O[19],RQ1P[20],RQ1Z[19],RQ4H[30],\n\ RQ4I[30],RQ4W[30],RQ8F(17)[30],RQ8G(17)[30],RQ8X(17)[20],RQ9F(17)[30],\n\ RQ9G(17)[30],RQ9X(17)[20],RT1I(17)[20],RT1N[19],RT1O[19],RT1P[20],\n\ RT1Z[19],RT4H[30],RT4I[30],RT4W[30],RT8F(17)[30],RT8G(17)[30],\n\ RT8X(17)[20],RT9F(17)[30],RT9G(17)[30],RT9X(17)[20],RU1I(17)[20],RU1N[19],\n\ RU1O[19],RU1P[20],RU1Z[19],RU4H[30],RU4I[30],RU4W[30],RU8F(17)[30],\n\ RU8G(17)[30],RU8X(17)[20],RU9F(17)[30],RU9G(17)[30],RU9X(17)[20],\n\ RV1I(17)[20],RV1N[19],RV1O[19],RV1P[20],RV1Z[19],RV4H[30],RV4I[30],\n\ RV4W[30],RV8F(17)[30],RV8G(17)[30],RV8X(17)[20],RV9F(17)[30],RV9G(17)[30],\n\ RV9X(17)[20],RW1I(17)[20],RW1N[19],RW1O[19],RW1P[20],RW1Z[19],RW4H[30],\n\ RW4I[30],RW4W[30],RW8F(17)[30],RW8G(17)[30],RW8X(17)[20],RW9F(17)[30],\n\ RW9G(17)[30],RW9X(17)[20],RX1I(17)[20],RX1N[19],RX1O[19],RX1P[20],\n\ RX1Z[19],RX4H[30],RX4I[30],RX4W[30],RX8F(17)[30],RX8G(17)[30],\n\ RX8X(17)[20],RX9F(17)[30],RX9G(17)[30],RX9X(17)[20],RY1I(17)[20],RY1N[19],\n\ RY1O[19],RY1P[20],RY1Z[19],RY4H[30],RY4I[30],RY4W[30],RY8F(17)[30],\n\ RY8G(17)[30],RY8X(17)[20],RY9F(17)[30],RY9G(17)[30],RY9X(17)[20],\n\ RZ1I(17)[20],RZ1N[19],RZ1O[19],RZ1P[20],RZ1Z[19],RZ4H[30],RZ4I[30],\n\ RZ4W[30],RZ8F(17)[30],RZ8G(17)[30],RZ8X(17)[20],RZ9F(17)[30],RZ9G(17)[30],\n\ RZ9X(17)[20],U1I(17)[20],U1N[19],U1O[19],U1P[20],U1Z[19],U4H[30],U4I[30],\n\ U4W[30],U8F(17)[30],U8G(17)[30],U8X(17)[20],U9F(17)[30],U9G(17)[30],\n\ U9X(17)[20],UA1I(17)[20],UA1N[19],UA1O[19],UA1P[20],UA1Z[19],UA4H[30],\n\ UA4I[30],UA4W[30],UA8F(17)[30],UA8G(17)[30],UA8X(17)[20],UA9F(17)[30],\n\ UA9G(17)[30],UA9X(17)[20],UB1I(17)[20],UB1N[19],UB1O[19],UB1P[20],\n\ UB1Z[19],UB4H[30],UB4I[30],UB4W[30],UB8F(17)[30],UB8G(17)[30],\n\ UB8X(17)[20],UB9F(17)[30],UB9G(17)[30],UB9X(17)[20],UC1I(17)[20],UC1N[19],\n\ UC1O[19],UC1P[20],UC1Z[19],UC4H[30],UC4I[30],UC4W[30],UC8F(17)[30],\n\ UC8G(17)[30],UC8X(17)[20],UC9F(17)[30],UC9G(17)[30],UC9X(17)[20],\n\ UD1I(17)[20],UD1N[19],UD1O[19],UD1P[20],UD1Z[19],UD4H[30],UD4I[30],\n\ UD4W[30],UD8F(17)[30],UD8G(17)[30],UD8X(17)[20],UD9F(17)[30],UD9G(17)[30],\n\ UD9X(17)[20],UE1I(17)[20],UE1N[19],UE1O[19],UE1P[20],UE1Z[19],UE4H[30],\n\ UE4I[30],UE4W[30],UE8F(17)[30],UE8G(17)[30],UE8X(17)[20],UE9F(17)[30],\n\ UE9G(17)[30],UE9X(17)[20],UF1I(17)[20],UF1N[19],UF1O[19],UF1P[20],\n\ UF1Z[19],UF4H[30],UF4I[30],UF4W[30],UF8F(17)[30],UF8G(17)[30],\n\ UF8X(17)[20],UF9F(17)[30],UF9G(17)[30],UF9X(17)[20],UG1I(17)[20],UG1N[19],\n\ UG1O[19],UG1P[20],UG1Z[19],UG4H[30],UG4I[30],UG4W[30],UG8F(17)[30],\n\ UG8G(17)[30],UG8X(17)[20],UG9F(17)[30],UG9G(17)[30],UG9X(17)[20],\n\ UH1I(17)[20],UH1N[19],UH1O[19],UH1P[20],UH1Z[19],UH4H[30],UH4I[30],\n\ UH4W[30],UH8F(17)[30],UH8G(17)[30],UH8X(17)[20],UH9F(17)[30],UH9G(17)[30],\n\ UH9X(17)[20],UI1I(17)[20],UI1N[19],UI1O[19],UI1P[20],UI1Z[19],UI4H[30],\n\ UI4I[30],UI4W[30],UI8F(17)[30],UI8G(17)[30],UI8X(17)[20],UI9F(17)[30],\n\ UI9G(17)[30],UI9X(17)[20],=R7AB/P,=RA9UUY/6,=RT9T/3,=R0AI/3,=R100UD[30],\n\ =R4HAT[29],=R4HC[29],=R4HCE[29],=R4HCZ[29],=R4HD[29],=R4HDC[29],\n\ =R4HDR[29],=R4HL[29],=R4IC[29],=R4ID[29],=R4II[29],=R4IK[29],=R4IM[29],\n\ =R4IN[29],=R4IO[29],=R4IT[29],=R925RZ,=RA4HL[29],=RA4NCC[30],=RC4HT[29],\n\ =RC4I[29],=RC8C/6,=RJ4I[29],=RJ4P[30],=RK4HM[29],=RK4P[30],=RM4I[29],\n\ =RM4R[30],=RN2FA/3,=RN4HFJ[29],=RN4HIF[29],=RT30DX[30],=RT9K/6,=RU4HD[29],\n\ =RU4HP[29],=RU4I[29],=RU9CK/7,=RW4HM[29],=RW4HTK[29],=RW4HW[29],\n\ =RW4HZ[29],=RW9WJ/4[30],=RX9KT/6,=UA3LMR/P,=UA4H[29],=UA4HBM[29],\n\ =UA4HGL[29],=UA4HIP[29],=UA4HRZ[29],=UA4HY[29],=UA4NF[30],=UA4PN[30],\n\ =UA4RF[30],=UA9CSA/1[19],=UC4I[29],=UI4I[29];\n\ Kaliningrad: 15: 29: EU: 54.72: -20.52: -3.0: UA2:\n\ R2F,R2K,RA2,RC2F,RC2K,RD2F,RD2K,RE2F,RE2K,RF2F,RF2K,RG2F,RG2K,RJ2F,RJ2K,\n\ RK2F,RK2K,RL2F,RL2K,RM2F,RM2K,RN2F,RN2K,RO2F,RO2K,RQ2F,RQ2K,RT2F,RT2K,\n\ RU2F,RU2K,RV2F,RV2K,RW2F,RW2K,RX2F,RX2K,RY2F,RY2K,RZ2F,RZ2K,U2F,U2K,UA2,\n\ UB2,UC2,UD2,UE2,UF2,UG2,UH2,UI2,=R2MWO,=RN1M/P,=RV30DX;\n\ Asiatic Russia: 17: 30: AS: 55.88: -84.08: -7.0: UA9:\n\ R0,R8(17)[30],R9,RA0,RA8(17)[30],RA9,RC0,RC8(17)[30],RC9,RD0,RD8(17)[30],\n\ RD9,RE0,RE8(17)[30],RE9,RF0,RF8(17)[30],RF9,RG0,RG8(17)[30],RG9,RI0,\n\ RI8(17)[30],RI9,RJ0,RJ8(17)[30],RJ9,RK0,RK8(17)[30],RK9,RL0,RL8(17)[30],\n\ RL9,RM0,RM8(17)[30],RM9,RN0,RN8(17)[30],RN9,RO0,RO8(17)[30],RO9,RQ0,\n\ RQ8(17)[30],RQ9,RT0,RT8(17)[30],RT9,RU0,RU8(17)[30],RU9,RV0,RV8(17)[30],\n\ RV9,RW0,RW8(17)[30],RW9,RX0,RX8(17)[30],RX9,RY0,RY8(17)[30],RY9,RZ0,\n\ RZ8(17)[30],RZ9,U0,U8(17)[30],U9,UA0,UA8(17)[30],UA9,UB0,UB8(17)[30],UB9,\n\ UC0,UC8(17)[30],UC9,UD0,UD8(17)[30],UD9,UE0,UE8(17)[30],UE9,UF0,\n\ UF8(17)[30],UF9,UG0,UG8(17)[30],UG9,UH0,UH8(17)[30],UH9,UI0,UI8(17)[30],\n\ UI9,R0T(18)[32],R8H(18)[31],R8I(18)[31],R8O(18)[31],R8P(18)[31],\n\ R8S(16)[30],R8T(16)[30],R8U(18)[31],R8V(18)[31],R8W(16)[30],R8Y(18)[31],\n\ R8Z(18)[31],R9I(18)[31],R9M(17)[30],R9P(18)[31],R9S(16),R9T(16),\n\ R9V(18)[31],R9W(16),RA0T(18)[32],RA8H(18)[31],RA8I(18)[31],RA8O(18)[31],\n\ RA8P(18)[31],RA8S(16)[30],RA8T(16)[30],RA8U(18)[31],RA8V(18)[31],\n\ RA8W(16)[30],RA8Y(18)[31],RA8Z(18)[31],RA9I(18)[31],RA9M(17)[30],\n\ RA9P(18)[31],RA9S(16),RA9T(16),RA9V(18)[31],RA9W(16),RC0T(18)[32],\n\ RC8H(18)[31],RC8I(18)[31],RC8O(18)[31],RC8P(18)[31],RC8S(16)[30],\n\ RC8T(16)[30],RC8U(18)[31],RC8V(18)[31],RC8W(16)[30],RC8Y(18)[31],\n\ RC8Z(18)[31],RC9I(18)[31],RC9M(17)[30],RC9P(18)[31],RC9S(16),RC9T(16),\n\ RC9V(18)[31],RC9W(16),RD0T(18)[32],RD8H(18)[31],RD8I(18)[31],RD8O(18)[31],\n\ RD8P(18)[31],RD8S(16)[30],RD8T(16)[30],RD8U(18)[31],RD8V(18)[31],\n\ RD8W(16)[30],RD8Y(18)[31],RD8Z(18)[31],RD9I(18)[31],RD9M(17)[30],\n\ RD9P(18)[31],RD9S(16),RD9T(16),RD9V(18)[31],RD9W(16),RE0T(18)[32],\n\ RE8H(18)[31],RE8I(18)[31],RE8O(18)[31],RE8P(18)[31],RE8S(16)[30],\n\ RE8T(16)[30],RE8U(18)[31],RE8V(18)[31],RE8W(16)[30],RE8Y(18)[31],\n\ RE8Z(18)[31],RE9I(18)[31],RE9M(17)[30],RE9P(18)[31],RE9S(16),RE9T(16),\n\ RE9V(18)[31],RE9W(16),RF0T(18)[32],RF8H(18)[31],RF8I(18)[31],RF8O(18)[31],\n\ RF8P(18)[31],RF8S(16)[30],RF8T(16)[30],RF8U(18)[31],RF8V(18)[31],\n\ RF8W(16)[30],RF8Y(18)[31],RF8Z(18)[31],RF9I(18)[31],RF9M(17)[30],\n\ RF9P(18)[31],RF9S(16),RF9T(16),RF9V(18)[31],RF9W(16),RG0T(18)[32],\n\ RG8H(18)[31],RG8I(18)[31],RG8O(18)[31],RG8P(18)[31],RG8S(16)[30],\n\ RG8T(16)[30],RG8U(18)[31],RG8V(18)[31],RG8W(16)[30],RG8Y(18)[31],\n\ RG8Z(18)[31],RG9I(18)[31],RG9M(17)[30],RG9P(18)[31],RG9S(16),RG9T(16),\n\ RG9V(18)[31],RG9W(16),RJ0T(18)[32],RJ8H(18)[31],RJ8I(18)[31],RJ8O(18)[31],\n\ RJ8P(18)[31],RJ8S(16)[30],RJ8T(16)[30],RJ8U(18)[31],RJ8V(18)[31],\n\ RJ8W(16)[30],RJ8Y(18)[31],RJ8Z(18)[31],RJ9I(18)[31],RJ9M(17)[30],\n\ RJ9P(18)[31],RJ9S(16),RJ9T(16),RJ9V(18)[31],RJ9W(16),RK0T(18)[32],\n\ RK8H(18)[31],RK8I(18)[31],RK8O(18)[31],RK8P(18)[31],RK8S(16)[30],\n\ RK8T(16)[30],RK8U(18)[31],RK8V(18)[31],RK8W(16)[30],RK8Y(18)[31],\n\ RK8Z(18)[31],RK9I(18)[31],RK9M(17)[30],RK9P(18)[31],RK9S(16),RK9T(16),\n\ RK9V(18)[31],RK9W(16),RL0T(18)[32],RL8H(18)[31],RL8I(18)[31],RL8O(18)[31],\n\ RL8P(18)[31],RL8S(16)[30],RL8T(16)[30],RL8U(18)[31],RL8V(18)[31],\n\ RL8W(16)[30],RL8Y(18)[31],RL8Z(18)[31],RL9I(18)[31],RL9M(17)[30],\n\ RL9P(18)[31],RL9S(16),RL9T(16),RL9V(18)[31],RL9W(16),RM0T(18)[32],\n\ RM8H(18)[31],RM8I(18)[31],RM8O(18)[31],RM8P(18)[31],RM8S(16)[30],\n\ RM8T(16)[30],RM8U(18)[31],RM8V(18)[31],RM8W(16)[30],RM8Y(18)[31],\n\ RM8Z(18)[31],RM9I(18)[31],RM9M(17)[30],RM9P(18)[31],RM9S(16),RM9T(16),\n\ RM9V(18)[31],RM9W(16),RN0T(18)[32],RN8H(18)[31],RN8I(18)[31],RN8O(18)[31],\n\ RN8P(18)[31],RN8S(16)[30],RN8T(16)[30],RN8U(18)[31],RN8V(18)[31],\n\ RN8W(16)[30],RN8Y(18)[31],RN8Z(18)[31],RN9I(18)[31],RN9M(17)[30],\n\ RN9P(18)[31],RN9S(16),RN9T(16),RN9V(18)[31],RN9W(16),RO0T(18)[32],\n\ RO8H(18)[31],RO8I(18)[31],RO8O(18)[31],RO8P(18)[31],RO8S(16)[30],\n\ RO8T(16)[30],RO8U(18)[31],RO8V(18)[31],RO8W(16)[30],RO8Y(18)[31],\n\ RO8Z(18)[31],RO9I(18)[31],RO9M(17)[30],RO9P(18)[31],RO9S(16),RO9T(16),\n\ RO9V(18)[31],RO9W(16),RQ0T(18)[32],RQ8H(18)[31],RQ8I(18)[31],RQ8O(18)[31],\n\ RQ8P(18)[31],RQ8S(16)[30],RQ8T(16)[30],RQ8U(18)[31],RQ8V(18)[31],\n\ RQ8W(16)[30],RQ8Y(18)[31],RQ8Z(18)[31],RQ9I(18)[31],RQ9M(17)[30],\n\ RQ9P(18)[31],RQ9S(16),RQ9T(16),RQ9V(18)[31],RQ9W(16),RT0T(18)[32],\n\ RT8H(18)[31],RT8I(18)[31],RT8O(18)[31],RT8P(18)[31],RT8S(16)[30],\n\ RT8T(16)[30],RT8U(18)[31],RT8V(18)[31],RT8W(16)[30],RT8Y(18)[31],\n\ RT8Z(18)[31],RT9I(18)[31],RT9M(17)[30],RT9P(18)[31],RT9S(16),RT9T(16),\n\ RT9V(18)[31],RT9W(16),RU0T(18)[32],RU8H(18)[31],RU8I(18)[31],RU8O(18)[31],\n\ RU8P(18)[31],RU8S(16)[30],RU8T(16)[30],RU8U(18)[31],RU8V(18)[31],\n\ RU8W(16)[30],RU8Y(18)[31],RU8Z(18)[31],RU9I(18)[31],RU9M(17)[30],\n\ RU9P(18)[31],RU9S(16),RU9T(16),RU9V(18)[31],RU9W(16),RV0T(18)[32],\n\ RV8H(18)[31],RV8I(18)[31],RV8O(18)[31],RV8P(18)[31],RV8S(16)[30],\n\ RV8T(16)[30],RV8U(18)[31],RV8V(18)[31],RV8W(16)[30],RV8Y(18)[31],\n\ RV8Z(18)[31],RV9I(18)[31],RV9M(17)[30],RV9P(18)[31],RV9S(16),RV9T(16),\n\ RV9V(18)[31],RV9W(16),RW0T(18)[32],RW8H(18)[31],RW8I(18)[31],RW8O(18)[31],\n\ RW8P(18)[31],RW8S(16)[30],RW8T(16)[30],RW8U(18)[31],RW8V(18)[31],\n\ RW8W(16)[30],RW8Y(18)[31],RW8Z(18)[31],RW9I(18)[31],RW9M(17)[30],\n\ RW9P(18)[31],RW9S(16),RW9T(16),RW9V(18)[31],RW9W(16),RX0T(18)[32],\n\ RX8H(18)[31],RX8I(18)[31],RX8O(18)[31],RX8P(18)[31],RX8S(16)[30],\n\ RX8T(16)[30],RX8U(18)[31],RX8V(18)[31],RX8W(16)[30],RX8Y(18)[31],\n\ RX8Z(18)[31],RX9I(18)[31],RX9M(17)[30],RX9P(18)[31],RX9S(16),RX9T(16),\n\ RX9V(18)[31],RX9W(16),RY0T(18)[32],RY8H(18)[31],RY8I(18)[31],RY8O(18)[31],\n\ RY8P(18)[31],RY8S(16)[30],RY8T(16)[30],RY8U(18)[31],RY8V(18)[31],\n\ RY8W(16)[30],RY8Y(18)[31],RY8Z(18)[31],RY9I(18)[31],RY9M(17)[30],\n\ RY9P(18)[31],RY9S(16),RY9T(16),RY9V(18)[31],RY9W(16),RZ0T(18)[32],\n\ RZ8H(18)[31],RZ8I(18)[31],RZ8O(18)[31],RZ8P(18)[31],RZ8S(16)[30],\n\ RZ8T(16)[30],RZ8U(18)[31],RZ8V(18)[31],RZ8W(16)[30],RZ8Y(18)[31],\n\ RZ8Z(18)[31],RZ9I(18)[31],RZ9M(17)[30],RZ9P(18)[31],RZ9S(16),RZ9T(16),\n\ RZ9V(18)[31],RZ9W(16),U0T(18)[32],U8H(18)[31],U8I(18)[31],U8O(18)[31],\n\ U8P(18)[31],U8S(16)[30],U8T(16)[30],U8U(18)[31],U8V(18)[31],U8W(16)[30],\n\ U8Y(18)[31],U8Z(18)[31],U9I(18)[31],U9M(17)[30],U9P(18)[31],U9S(16),\n\ U9T(16),U9V(18)[31],U9W(16),UA0T(18)[32],UA8H(18)[31],UA8I(18)[31],\n\ UA8O(18)[31],UA8P(18)[31],UA8S(16)[30],UA8T(16)[30],UA8U(18)[31],\n\ UA8V(18)[31],UA8W(16)[30],UA8Y(18)[31],UA8Z(18)[31],UA9I(18)[31],\n\ UA9M(17)[30],UA9P(18)[31],UA9S(16),UA9T(16),UA9V(18)[31],UA9W(16),\n\ UB0T(18)[32],UB8H(18)[31],UB8I(18)[31],UB8O(18)[31],UB8P(18)[31],\n\ UB8S(16)[30],UB8T(16)[30],UB8U(18)[31],UB8V(18)[31],UB8W(16)[30],\n\ UB8Y(18)[31],UB8Z(18)[31],UB9I(18)[31],UB9M(17)[30],UB9P(18)[31],UB9S(16),\n\ UB9T(16),UB9V(18)[31],UB9W(16),UC0T(18)[32],UC8H(18)[31],UC8I(18)[31],\n\ UC8O(18)[31],UC8P(18)[31],UC8S(16)[30],UC8T(16)[30],UC8U(18)[31],\n\ UC8V(18)[31],UC8W(16)[30],UC8Y(18)[31],UC8Z(18)[31],UC9I(18)[31],\n\ UC9M(17)[30],UC9P(18)[31],UC9S(16),UC9T(16),UC9V(18)[31],UC9W(16),\n\ UD0T(18)[32],UD8H(18)[31],UD8I(18)[31],UD8O(18)[31],UD8P(18)[31],\n\ UD8S(16)[30],UD8T(16)[30],UD8U(18)[31],UD8V(18)[31],UD8W(16)[30],\n\ UD8Y(18)[31],UD8Z(18)[31],UD9I(18)[31],UD9M(17)[30],UD9P(18)[31],UD9S(16),\n\ UD9T(16),UD9V(18)[31],UD9W(16),UE0T(18)[32],UE8H(18)[31],UE8I(18)[31],\n\ UE8O(18)[31],UE8P(18)[31],UE8S(16)[30],UE8T(16)[30],UE8U(18)[31],\n\ UE8V(18)[31],UE8W(16)[30],UE8Y(18)[31],UE8Z(18)[31],UE9I(18)[31],\n\ UE9M(17)[30],UE9P(18)[31],UE9S(16),UE9T(16),UE9V(18)[31],UE9W(16),\n\ UF0T(18)[32],UF8H(18)[31],UF8I(18)[31],UF8O(18)[31],UF8P(18)[31],\n\ UF8S(16)[30],UF8T(16)[30],UF8U(18)[31],UF8V(18)[31],UF8W(16)[30],\n\ UF8Y(18)[31],UF8Z(18)[31],UF9I(18)[31],UF9M(17)[30],UF9P(18)[31],UF9S(16),\n\ UF9T(16),UF9V(18)[31],UF9W(16),UG0T(18)[32],UG8H(18)[31],UG8I(18)[31],\n\ UG8O(18)[31],UG8P(18)[31],UG8S(16)[30],UG8T(16)[30],UG8U(18)[31],\n\ UG8V(18)[31],UG8W(16)[30],UG8Y(18)[31],UG8Z(18)[31],UG9I(18)[31],\n\ UG9M(17)[30],UG9P(18)[31],UG9S(16),UG9T(16),UG9V(18)[31],UG9W(16),\n\ UH0T(18)[32],UH8H(18)[31],UH8I(18)[31],UH8O(18)[31],UH8P(18)[31],\n\ UH8S(16)[30],UH8T(16)[30],UH8U(18)[31],UH8V(18)[31],UH8W(16)[30],\n\ UH8Y(18)[31],UH8Z(18)[31],UH9I(18)[31],UH9M(17)[30],UH9P(18)[31],UH9S(16),\n\ UH9T(16),UH9V(18)[31],UH9W(16),UI0T(18)[32],UI8H(18)[31],UI8I(18)[31],\n\ UI8O(18)[31],UI8P(18)[31],UI8S(16)[30],UI8T(16)[30],UI8U(18)[31],\n\ UI8V(18)[31],UI8W(16)[30],UI8Y(18)[31],UI8Z(18)[31],UI9I(18)[31],\n\ UI9M(17)[30],UI9P(18)[31],UI9S(16),UI9T(16),UI9V(18)[31],UI9W(16),\n\ =R05SOTA(16),=R0WA/P(18)[32],=R1FW/0(19)[34],=R2ET/9(18)[31],=R30EMER,\n\ =R30MDXC(17)[30],=R8MZ/9(23)[32],=R9GM/8(17)[30],=RA/UT5IA(19)[23],\n\ =RA0QK/8(17)[30],=RA4RU/9[20],=RM30DX,=RN1CR/0(19)[34],=RN9S(16),\n\ =RQ30DX(18)[32],=RT8T(16)[30],=RT9S(16),=RV7B/9[20],=RX30DX(19)[34],\n\ =RX6DL/8(17)[30],=RY30DX,=RZ30DX(19)[34],=UD6AOP/0(19)[35];\n\ Uzbekistan: 17: 30: AS: 41.40: -63.97: -5.0: UK:\n\ UJ,UK,UL,UM;\n\ Kazakhstan: 17: 30: AS: 48.17: -65.18: -5.0: UN:\n\ UN,UO,UP,UQ,UN0F[31],UN0G[31],UN0J[31],UN0Q[31],UN2F[31],UN2G[31],\n\ UN2J[31],UN2Q[31],UN3F[31],UN3G[31],UN3J[31],UN3Q[31],UN4F[31],UN4G[31],\n\ UN4J[31],UN4Q[31],UN5F[31],UN5G[31],UN5J[31],UN5Q[31],UN6F[31],UN6G[31],\n\ UN6J[31],UN6Q[31],UN7F[31],UN7G[31],UN7J[31],UN7Q[31],UN8F[31],UN8G[31],\n\ UN8J[31],UN8Q[31],UN9F[31],UN9G[31],UN9J[31],UN9Q[31],UO0F[31],UO0G[31],\n\ UO0J[31],UO0Q[31],UO1F[31],UO1G[31],UO1J[31],UO1Q[31],UO2F[31],UO2G[31],\n\ UO2J[31],UO2Q[31],UO3F[31],UO3G[31],UO3J[31],UO3Q[31],UO4F[31],UO4G[31],\n\ UO4J[31],UO4Q[31],UO5F[31],UO5G[31],UO5J[31],UO5Q[31],UO6F[31],UO6G[31],\n\ UO6J[31],UO6Q[31],UO7F[31],UO7G[31],UO7J[31],UO7Q[31],UO8F[31],UO8G[31],\n\ UO8J[31],UO8Q[31],UO9F[31],UO9G[31],UO9J[31],UO9Q[31],UP0F[31],UP0G[31],\n\ UP0J[31],UP0Q[31],UP1F[31],UP1G[31],UP1J[31],UP1Q[31],UP2F[31],UP2G[31],\n\ UP2J[31],UP2Q[31],UP3F[31],UP3G[31],UP3J[31],UP3Q[31],UP4F[31],UP4G[31],\n\ UP4J[31],UP4Q[31],UP5F[31],UP5G[31],UP5J[31],UP5Q[31],UP6F[31],UP6G[31],\n\ UP6J[31],UP6Q[31],UP7F[31],UP7G[31],UP7J[31],UP7Q[31],UP8F[31],UP8G[31],\n\ UP8J[31],UP8Q[31],UP9F[31],UP9G[31],UP9J[31],UP9Q[31],UQ0F[31],UQ0G[31],\n\ UQ0J[31],UQ0Q[31],UQ1F[31],UQ1G[31],UQ1J[31],UQ1Q[31],UQ2F[31],UQ2G[31],\n\ UQ2J[31],UQ2Q[31],UQ3F[31],UQ3G[31],UQ3J[31],UQ3Q[31],UQ4F[31],UQ4G[31],\n\ UQ4J[31],UQ4Q[31],UQ5F[31],UQ5G[31],UQ5J[31],UQ5Q[31],UQ6F[31],UQ6G[31],\n\ UQ6J[31],UQ6Q[31],UQ7F[31],UQ7G[31],UQ7J[31],UQ7Q[31],UQ8F[31],UQ8G[31],\n\ UQ8J[31],UQ8Q[31],UQ9F[31],UQ9G[31],UQ9J[31],UQ9Q[31];\n\ Ukraine: 16: 29: EU: 50.00: -30.00: -2.0: UR:\n\ EM,EN,EO,U5,UR,US,UT,UU,UV,UW,UX,UY,UZ;\n\ Antigua & Barbuda: 08: 11: NA: 17.07: 61.80: 4.0: V2:\n\ V2;\n\ Belize: 07: 11: NA: 16.97: 88.67: 6.0: V3:\n\ V3;\n\ St. Kitts & Nevis: 08: 11: NA: 17.37: 62.78: 4.0: V4:\n\ V4;\n\ Namibia: 38: 57: AF: -22.00: -17.00: -1.0: V5:\n\ V5;\n\ Micronesia: 27: 65: OC: 6.88: -158.20: -10.0: V6:\n\ V6;\n\ Marshall Islands: 31: 65: OC: 9.08: -167.33: -12.0: V7:\n\ V7;\n\ Brunei Darussalam: 28: 54: OC: 4.50: -114.60: -8.0: V8:\n\ V8;\n\ Canada: 05: 09: NA: 44.35: 78.75: 5.0: VE:\n\ CF,CG,CJ,CK,VA,VB,VC,VE,VG,VX,VY9,XL,XM,CF2[4],CG2[4],CH1,CH2(2),\n\ CI0(2)[4],CI1(1)[2],CI2,CJ2[4],CK2[4],CY1,CY2(2),CZ0(2)[4],CZ1(1)[2],CZ2,\n\ VA2[4],VB2[4],VC2[4],VD1,VD2(2),VE2[4],VF0(2)[4],VF1(1)[2],VF2,VG2[4],VO1,\n\ VO2(2),VX2[4],VY0(2)[4],VY1(1)[2],VY2,XJ1,XJ2(2),XK0(2)[4],XK1(1)[2],XK2,\n\ XL2[4],XM2[4],XN1,XN2(2),XO0(2)[4],XO1(1)[2],XO2,=VER20201112,\n\ =VA2VVV(2)[4],=VE2CSI(2)[4],=VE2EKA(2)[4],=VE2FK[9],=VE2IDX(2)[4],\n\ =VE2IM(2)[4],=VE2TKH(2)[4],=VY0AA(4)[3],=VY0PW(4)[3];\n\ Australia: 30: 59: OC: -23.70: -132.33: -10.0: VK:\n\ AX,VH,VI,VJ,VK,VL,VM,VN,VZ,AX4[55],VH4[55],VI4[55],VJ4[55],VK4[55],\n\ VL4[55],VM4[55],VN4[55],VZ4[55],=VK65PFA[55];\n\ Heard Island: 39: 68: AF: -53.08: -73.50: -5.0: VK0H:\n\ =VK0EK;\n\ Macquarie Island: 30: 60: OC: -54.60: -158.88: -10.0: VK0M:\n\ =VK0AI;\n\ Cocos (Keeling) Islands: 29: 54: OC: -12.15: -96.82: -6.5: VK9C:\n\ AX9C,AX9Y,VH9C,VH9Y,VI9C,VI9Y,VJ9C,VJ9Y,VK9C,VK9FC,VK9KC,VK9Y,VK9ZY,VL9C,\n\ VL9Y,VM9C,VM9Y,VN9C,VN9Y,VZ9C,VZ9Y;\n\ Lord Howe Island: 30: 60: OC: -31.55: -159.08: -10.5: VK9L:\n\ AX9L,VH9L,VI9L,VJ9L,VK9FL,VK9L,VK9ZL,VL9L,VM9L,VN9L,VZ9L,=VK3YQS/9,\n\ =VK3YQS/VK9;\n\ Mellish Reef: 30: 56: OC: -17.40: -155.85: -10.0: VK9M:\n\ AX9M,VH9M,VI9M,VJ9M,VK9M,VL9M,VM9M,VN9M,VZ9M;\n\ Norfolk Island: 32: 60: OC: -29.03: -167.93: -11.5: VK9N:\n\ AX9,VH9,VI9,VJ9,VK9,VL9,VM9,VN9,VZ9;\n\ Willis Island: 30: 55: OC: -16.22: -150.02: -10.0: VK9W:\n\ AX9W,AX9Z,VH9W,VH9Z,VI9W,VI9Z,VJ9W,VJ9Z,VK9FW,VK9W,VK9Z,VL9W,VL9Z,VM9W,\n\ VM9Z,VN9W,VN9Z,VZ9W,VZ9Z;\n\ Christmas Island: 29: 54: OC: -10.48: -105.63: -7.0: VK9X:\n\ AX9X,VH9X,VI9X,VJ9X,VK9FX,VK9KX,VK9X,VL9X,VM9X,VN9X,VZ9X;\n\ Anguilla: 08: 11: NA: 18.23: 63.00: 4.0: VP2E:\n\ VP2E;\n\ Montserrat: 08: 11: NA: 16.75: 62.18: 4.0: VP2M:\n\ VP2M;\n\ British Virgin Islands: 08: 11: NA: 18.33: 64.75: 4.0: VP2V:\n\ VP2V;\n\ Turks & Caicos Islands: 08: 11: NA: 21.77: 71.75: 5.0: VP5:\n\ VP5,VQ5;\n\ Pitcairn Island: 32: 63: OC: -25.07: 130.10: 8.0: VP6:\n\ VP6;\n\ Ducie Island: 32: 63: OC: -24.70: 124.80: 8.0: VP6/d:\n\ =VP6D;\n\ Falkland Islands: 13: 16: SA: -51.63: 58.72: 4.0: VP8:\n\ VP8;\n\ South Georgia Island: 13: 73: SA: -54.48: 37.08: 2.0: VP8/g:\n\ =VP8CA;\n\ South Shetland Islands: 13: 73: SA: -62.08: 58.67: 4.0: VP8/h:\n\ CE9,XR9,=HF0POL;\n\ South Orkney Islands: 13: 73: SA: -60.60: 45.55: 3.0: VP8/o:\n\ =VP8PJ;\n\ South Sandwich Islands: 13: 73: SA: -58.43: 26.33: 2.0: VP8/s:\n\ =VP8DXU;\n\ Bermuda: 05: 11: NA: 32.32: 64.73: 4.0: VP9:\n\ VP9;\n\ Chagos Islands: 39: 41: AF: -7.32: -72.42: -6.0: VQ9:\n\ VQ9;\n\ Hong Kong: 24: 44: AS: 22.28: -114.18: -8.0: VR:\n\ VR;\n\ India: 22: 41: AS: 22.50: -77.58: -5.5: VU:\n\ 8T,8U,8V,8W,8X,8Y,AT,AU,AV,AW,VT,VU,VV,VW;\n\ Andaman & Nicobar Is.: 26: 49: AS: 12.37: -92.78: -5.5: VU4:\n\ VU4;\n\ Lakshadweep Islands: 22: 41: AS: 11.23: -72.78: -5.5: VU7:\n\ VU7;\n\ Mexico: 06: 10: NA: 21.32: 100.23: 6.0: XE:\n\ 4A,4B,4C,6D,6E,6F,6G,6H,6I,6J,XA,XB,XC,XD,XE,XF,XG,XH,XI;\n\ Revillagigedo: 06: 10: NA: 18.77: 110.97: 7.0: XF4:\n\ 4A4,4B4,4C4,6D4,6E4,6F4,6G4,6H4,6I4,6J4,XA4,XB4,XC4,XD4,XE4,XF4,XG4,XH4,\n\ XI4;\n\ Burkina Faso: 35: 46: AF: 12.00: 2.00: 0.0: XT:\n\ XT;\n\ Cambodia: 26: 49: AS: 12.93: -105.13: -7.0: XU:\n\ XU;\n\ Laos: 26: 49: AS: 18.20: -104.55: -7.0: XW:\n\ XW;\n\ Macao: 24: 44: AS: 22.10: -113.50: -8.0: XX9:\n\ XX9;\n\ Myanmar: 26: 49: AS: 20.00: -96.37: -6.5: XZ:\n\ XY,XZ;\n\ Afghanistan: 21: 40: AS: 34.70: -65.80: -4.5: YA:\n\ T6,YA;\n\ Indonesia: 28: 51: OC: -7.30: -109.88: -7.0: YB:\n\ 7A,7B,7C,7D,7E,7F,7G,7H,7I,8A,8B,8C,8D,8E,8F,8G,8H,8I,PK,PL,PM,PN,PO,YB,\n\ YC,YD,YE,YF,YG,YH,7A0[54],7A1[54],7A2[54],7A3[54],7A4[54],7A5[54],7A6[54],\n\ 7A7[54],7A8[54],7B0[54],7B1[54],7B2[54],7B3[54],7B4[54],7B5[54],7B6[54],\n\ 7B7[54],7B8[54],7C0[54],7C1[54],7C2[54],7C3[54],7C4[54],7C5[54],7C6[54],\n\ 7C7[54],7C8[54],7D0[54],7D1[54],7D2[54],7D3[54],7D4[54],7D5[54],7D6[54],\n\ 7D7[54],7D8[54],7E0[54],7E1[54],7E2[54],7E3[54],7E4[54],7E5[54],7E6[54],\n\ 7E7[54],7E8[54],7F0[54],7F1[54],7F2[54],7F3[54],7F4[54],7F5[54],7F6[54],\n\ 7F7[54],7F8[54],7G0[54],7G1[54],7G2[54],7G3[54],7G4[54],7G5[54],7G6[54],\n\ 7G7[54],7G8[54],7H0[54],7H1[54],7H2[54],7H3[54],7H4[54],7H5[54],7H6[54],\n\ 7H7[54],7H8[54],7I0[54],7I1[54],7I2[54],7I3[54],7I4[54],7I5[54],7I6[54],\n\ 7I7[54],7I8[54],8A0[54],8A1[54],8A2[54],8A3[54],8A4[54],8A5[54],8A6[54],\n\ 8A7[54],8A8[54],8B0[54],8B1[54],8B2[54],8B3[54],8B4[54],8B5[54],8B6[54],\n\ 8B7[54],8B8[54],8C0[54],8C1[54],8C2[54],8C3[54],8C4[54],8C5[54],8C6[54],\n\ 8C7[54],8C8[54],8D0[54],8D1[54],8D2[54],8D3[54],8D4[54],8D5[54],8D6[54],\n\ 8D7[54],8D8[54],8E0[54],8E1[54],8E2[54],8E3[54],8E4[54],8E5[54],8E6[54],\n\ 8E7[54],8E8[54],8F0[54],8F1[54],8F2[54],8F3[54],8F4[54],8F5[54],8F6[54],\n\ 8F7[54],8F8[54],8G0[54],8G1[54],8G2[54],8G3[54],8G4[54],8G5[54],8G6[54],\n\ 8G7[54],8G8[54],8H0[54],8H1[54],8H2[54],8H3[54],8H4[54],8H5[54],8H6[54],\n\ 8H7[54],8H8[54],8I0[54],8I1[54],8I2[54],8I3[54],8I4[54],8I5[54],8I6[54],\n\ 8I7[54],8I8[54],YB0[54],YB1[54],YB2[54],YB3[54],YB4[54],YB5[54],YB6[54],\n\ YB7[54],YB8[54],YC0[54],YC1[54],YC2[54],YC3[54],YC4[54],YC5[54],YC6[54],\n\ YC7[54],YC8[54],YD0[54],YD1[54],YD2[54],YD3[54],YD4[54],YD5[54],YD6[54],\n\ YD7[54],YD8[54],YE0[54],YE1[54],YE2[54],YE3[54],YE4[54],YE5[54],YE6[54],\n\ YE7[54],YE8[54],YF0[54],YF1[54],YF2[54],YF3[54],YF4[54],YF5[54],YF6[54],\n\ YF7[54],YF8[54],YG0[54],YG1[54],YG2[54],YG3[54],YG4[54],YG5[54],YG6[54],\n\ YG7[54],YG8[54],YH0[54],YH1[54],YH2[54],YH3[54],YH4[54],YH5[54],YH6[54],\n\ YH7[54],YH8[54];\n\ Iraq: 21: 39: AS: 33.92: -42.78: -3.0: YI:\n\ HN,YI;\n\ Vanuatu: 32: 56: OC: -17.67: -168.38: -11.0: YJ:\n\ YJ;\n\ Syria: 20: 39: AS: 35.38: -38.20: -2.0: YK:\n\ 6C,YK;\n\ Latvia: 15: 29: EU: 57.03: -24.65: -2.0: YL:\n\ YL;\n\ Nicaragua: 07: 11: NA: 12.88: 85.05: 6.0: YN:\n\ H6,H7,HT,YN;\n\ Romania: 20: 28: EU: 45.78: -24.70: -2.0: YO:\n\ YO,YP,YQ,YR;\n\ El Salvador: 07: 11: NA: 14.00: 89.00: 6.0: YS:\n\ HU,YS;\n\ Serbia: 15: 28: EU: 44.00: -21.00: -1.0: YU:\n\ YT,YU;\n\ Venezuela: 09: 12: SA: 8.00: 66.00: 4.5: YV:\n\ 4M,YV,YW,YX,YY;\n\ Aves Island: 08: 11: NA: 15.67: 63.60: 4.0: YV0:\n\ 4M0,YV0,YW0,YX0,YY0;\n\ Zimbabwe: 38: 53: AF: -18.00: -31.00: -2.0: Z2:\n\ Z2;\n\ North Macedonia: 15: 28: EU: 41.60: -21.65: -1.0: Z3:\n\ Z3;\n\ Republic of Kosovo: 15: 28: EU: 42.67: -21.17: -1.0: Z6:\n\ Z6;\n\ Republic of South Sudan: 34: 48: AF: 4.85: -31.60: -3.0: Z8:\n\ Z8;\n\ Albania: 15: 28: EU: 41.00: -20.00: -1.0: ZA:\n\ ZA;\n\ Gibraltar: 14: 37: EU: 36.15: 5.37: -1.0: ZB:\n\ ZB,ZG;\n\ UK Base Areas on Cyprus: 20: 39: AS: 35.32: -33.57: -2.0: ZC4:\n\ ZC4;\n\ St. Helena: 36: 66: AF: -15.97: 5.72: 0.0: ZD7:\n\ ZD7;\n\ Ascension Island: 36: 66: AF: -7.93: 14.37: 0.0: ZD8:\n\ ZD8;\n\ Tristan da Cunha & Gough: 38: 66: AF: -37.13: 12.30: 0.0: ZD9:\n\ ZD9;\n\ Cayman Islands: 08: 11: NA: 19.32: 81.22: 5.0: ZF:\n\ ZF;\n\ Tokelau Islands: 31: 62: OC: -9.40: 171.20: -13.0: ZK3:\n\ ZK3;\n\ New Zealand: 32: 60: OC: -39.03: -174.47: -12.0: ZL:\n\ ZK,ZL,ZL50,ZM;\n\ Chatham Islands: 32: 60: OC: -43.85: 176.48: -12.75: ZL7:\n\ ZL7,ZM7;\n\ Kermadec Islands: 32: 60: OC: -29.25: 177.92: -12.0: ZL8:\n\ ZL8,ZM8;\n\ N.Z. Subantarctic Is.: 32: 60: OC: -51.62: -167.62: -12.0: ZL9:\n\ ZL9;\n\ Paraguay: 11: 14: SA: -25.27: 57.67: 4.0: ZP:\n\ ZP;\n\ South Africa: 38: 57: AF: -29.07: -22.63: -2.0: ZS:\n\ H5,S4,S8,V9,ZR,ZS,ZT,ZU;\n\ Pr. Edward & Marion Is.: 38: 57: AF: -46.88: -37.72: -3.0: ZS8:\n\ ZR8,ZS8,ZT8,ZU8;\ " ; fldigi-4.2.05/src/logbook/lgbook.cxx0000664000175000017500000021717714611711171014226 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "gettext.h" #include "lgbook.h" #include #include #include "flmisc.h" #include "logsupport.h" #include "pixmaps.h" Fl_Double_Window *wExport=(Fl_Double_Window *)0; Fl_Check_Browser *chkExportBrowser=(Fl_Check_Browser *)0; Fl_Button *btnClearAll=(Fl_Button *)0; static void cb_btnClearAll(Fl_Button*, void*) { btn_export_by_date->value(0); chkExportBrowser->check_none(); } Fl_Button *btnCheckAll=(Fl_Button *)0; static void cb_btnCheckAll(Fl_Button*, void*) { btn_export_by_date->value(0); chkExportBrowser->check_all(); } Fl_DateInput *inp_export_start_date=(Fl_DateInput *)0; static void cb_inp_export_start_date(Fl_DateInput*, void*) { cb_export_date_select(); } Fl_DateInput *inp_export_stop_date=(Fl_DateInput *)0; static void cb_inp_export_stop_date(Fl_DateInput*, void*) { cb_export_date_select(); } Fl_Check_Button *btn_export_by_date=(Fl_Check_Button *)0; static void cb_btn_export_by_date(Fl_Check_Button*, void*) { cb_export_date_select(); } Fl_Check_Button *btnSelectCall=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectName=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectFreq=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectBand=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectMode=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSOdateOn=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSOdateOff=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectTimeON=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectTimeOFF=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectTX_pwr=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectRSTsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectRSTrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQth=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectLOC=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectState=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectAge=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectStaCall=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectStaCity=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectStaGrid=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectOperator=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectProvince=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCountry=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectNotes=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSLrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSLsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelecteQSLrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelecteQSLsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectLOTWrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectLOTWsent=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectQSL_VIA=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectSerialIN=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectSerialOUT=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCheck=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectXchgIn=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectMyXchg=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCNTY=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCONT=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectCQZ=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectDXCC=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectIOTA=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectITUZ=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectClass=(Fl_Check_Button *)0; Fl_Check_Button *btnSelectSection=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_cwss_serno=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_cwss_prec=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_cwss_check=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_cwss_section=(Fl_Check_Button *)0; Fl_Check_Button *btnSelect_1010=(Fl_Check_Button *)0; Fl_Button *btnClearAllFields=(Fl_Button *)0; static void cb_btnClearAllFields(Fl_Button*, void*) { btnSelectCall->value(0); btnSelectName->value(0); btnSelectFreq->value(0); btnSelectBand->value(0); btnSelectMode->value(0); btnSelectQSOdateOn->value(0); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(0); btnSelectTimeOFF->value(0); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0); } Fl_Button *btnCheckAllFields=(Fl_Button *)0; static void cb_btnCheckAllFields(Fl_Button*, void*) { btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectTX_pwr->value(1); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectQth->value(1); btnSelectLOC->value(1); btnSelectState->value(1); btnSelectAge->value(1); btnSelectStaCall->value(1); btnSelectStaGrid->value(1); btnSelectStaCity->value(1); btnSelectOperator->value(1); btnSelectProvince->value(1); btnSelectCountry->value(1); btnSelectNotes->value(1); btnSelectQSLrcvd->value(1); btnSelectQSLsent->value(1); btnSelecteQSLrcvd->value(1); btnSelecteQSLsent->value(1); btnSelectLOTWrcvd->value(1); btnSelectLOTWsent->value(1); btnSelectQSL_VIA->value(1); btnSelectSerialIN->value(1); btnSelectSerialOUT->value(1); btnSelectCheck->value(1); btnSelectXchgIn->value(1); btnSelectMyXchg->value(1); btnSelectCNTY->value(1); btnSelectCONT->value(1); btnSelectCQZ->value(1); btnSelectDXCC->value(1); btnSelectIOTA->value(1); btnSelectITUZ->value(1); btnSelectClass->value(1); btnSelectSection->value(1); btnSelect_cwss_serno->value(1); btnSelect_cwss_prec->value(1); btnSelect_cwss_check->value(1); btnSelect_cwss_section->value(1); btnSelect_1010->value(1); } Fl_Button *btnSetFieldDefaults=(Fl_Button *)0; static void cb_btnSetFieldDefaults(Fl_Button*, void*) { btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0); } Fl_Button *btnSetLoTWfields=(Fl_Button *)0; static void cb_btnSetLoTWfields(Fl_Button*, void*) { btnSelectCall->value(1); btnSelectName->value(0); btnSelectFreq->value(1); btnSelectBand->value(0); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(1); btnSelectTimeOFF->value(0); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0); } Fl_Return_Button *btnOK=(Fl_Return_Button *)0; static void cb_btnOK(Fl_Return_Button*, void*) { wExport->hide(); Export_log(); } Fl_Button *btnCancel=(Fl_Button *)0; static void cb_btnCancel(Fl_Button*, void*) { wExport->hide(); } Fl_Double_Window *dlgLogbook=(Fl_Double_Window *)0; Fl_DateInput *inpDate_log=(Fl_DateInput *)0; Fl_Input2 *inpTimeOn_log=(Fl_Input2 *)0; Fl_Input2 *inpCall_log=(Fl_Input2 *)0; Fl_Input2 *inpName_log=(Fl_Input2 *)0; Fl_Input2 *inpRstR_log=(Fl_Input2 *)0; Fl_Input2 *txtNbrRecs_log=(Fl_Input2 *)0; Fl_DateInput *inpDateOff_log=(Fl_DateInput *)0; Fl_Input2 *inpTimeOff_log=(Fl_Input2 *)0; Fl_Input2 *inpFreq_log=(Fl_Input2 *)0; Fl_Input2 *inpMode_log=(Fl_Input2 *)0; Fl_Input2 *inpTX_pwr_log=(Fl_Input2 *)0; Fl_Input2 *inpLoc_log=(Fl_Input2 *)0; Fl_Input2 *inpRstS_log=(Fl_Input2 *)0; Fl_Input2 *inpQth_log=(Fl_Input2 *)0; Fl_Input2 *inpState_log=(Fl_Input2 *)0; Fl_Input2 *inpVE_Prov_log=(Fl_Input2 *)0; Fl_Input2 *inpCountry_log=(Fl_Input2 *)0; Fl_Group *grpTabsSearch=(Fl_Group *)0; Fl_Tabs *Tabs=(Fl_Tabs *)0; Fl_Group *tab_log_qsl=(Fl_Group *)0; Fl_DateInput *inpQSLrcvddate_log=(Fl_DateInput *)0; Fl_DateInput *inpEQSLrcvddate_log=(Fl_DateInput *)0; Fl_DateInput *inpLOTWrcvddate_log=(Fl_DateInput *)0; Fl_DateInput *inpQSLsentdate_log=(Fl_DateInput *)0; Fl_DateInput *inpEQSLsentdate_log=(Fl_DateInput *)0; Fl_DateInput *inpLOTWsentdate_log=(Fl_DateInput *)0; Fl_Input2 *inpQSL_VIA_log=(Fl_Input2 *)0; Fl_Group *tab_log_other=(Fl_Group *)0; Fl_Input2 *inpCNTY_log=(Fl_Input2 *)0; Fl_Input2 *inpIOTA_log=(Fl_Input2 *)0; Fl_Input2 *inpCQZ_log=(Fl_Input2 *)0; Fl_Input2 *inpCONT_log=(Fl_Input2 *)0; Fl_Input2 *inpITUZ_log=(Fl_Input2 *)0; Fl_Input2 *inpDXCC_log=(Fl_Input2 *)0; Fl_Group *tab_log_notes=(Fl_Group *)0; Fl_Input2 *inpNotes_log=(Fl_Input2 *)0; Fl_Group *tab_log_my_station=(Fl_Group *)0; Fl_Input2 *inp_log_sta_call=(Fl_Input2 *)0; Fl_Input2 *inp_log_op_call=(Fl_Input2 *)0; Fl_Input2 *inp_log_sta_qth=(Fl_Input2 *)0; Fl_Input2 *inp_log_sta_loc=(Fl_Input2 *)0; Fl_Group *tab_log_contest=(Fl_Group *)0; Fl_Input2 *inpSerNoOut_log=(Fl_Input2 *)0; Fl_Input2 *inpMyXchg_log=(Fl_Input2 *)0; Fl_Input2 *inpSerNoIn_log=(Fl_Input2 *)0; Fl_Input2 *inpXchgIn_log=(Fl_Input2 *)0; Fl_Input2 *inpClass_log=(Fl_Input2 *)0; Fl_Input2 *inpSection_log=(Fl_Input2 *)0; Fl_Input2 *inp_age_log=(Fl_Input2 *)0; Fl_Input2 *inp_1010_log=(Fl_Input2 *)0; Fl_Input2 *inpBand_log=(Fl_Input2 *)0; Fl_Input2 *inp_check_log=(Fl_Input2 *)0; Fl_Group *tab_log_cwss=(Fl_Group *)0; Fl_Input2 *inp_log_cwss_serno=(Fl_Input2 *)0; Fl_Input2 *inp_log_cwss_sec=(Fl_Input2 *)0; Fl_Input2 *inp_log_cwss_prec=(Fl_Input2 *)0; Fl_Input2 *inp_log_cwss_chk=(Fl_Input2 *)0; Fl_Group *tab_log_jota=(Fl_Group *)0; Fl_Input2 *inp_log_troop_s=(Fl_Input2 *)0; Fl_Input2 *inp_log_troop_r=(Fl_Input2 *)0; Fl_Input2 *inp_log_scout_s=(Fl_Input2 *)0; Fl_Input2 *inp_log_scout_r=(Fl_Input2 *)0; Fl_Group *grpCallSearch=(Fl_Group *)0; Fl_Input2 *inpSearchString=(Fl_Input2 *)0; Fl_Button *bSearchPrev=(Fl_Button *)0; Fl_Button *bSearchNext=(Fl_Button *)0; Fl_Button *bRetrieve=(Fl_Button *)0; Fl_Group *grpFileButtons=(Fl_Group *)0; Fl_Button *bNewSave=(Fl_Button *)0; Fl_Button *bUpdateCancel=(Fl_Button *)0; Fl_Button *bDelete=(Fl_Button *)0; Fl_Output *txtLogFile=(Fl_Output *)0; Table *wBrowser=(Table *)0; Fl_Double_Window *wCabrillo=(Fl_Double_Window *)0; Fl_Check_Browser *chkCabBrowser=(Fl_Check_Browser *)0; Fl_Button *btnCabClearAll=(Fl_Button *)0; static void cb_btnCabClearAll(Fl_Button*, void*) { chkCabBrowser->check_none(); } Fl_Button *btnCabCheckAll=(Fl_Button *)0; static void cb_btnCabCheckAll(Fl_Button*, void*) { chkCabBrowser->check_all(); } Fl_Return_Button *btnCabOK=(Fl_Return_Button *)0; static void cb_btnCabOK(Fl_Return_Button*, void*) { wCabrillo->hide(); WriteCabrillo(); } Fl_Button *btnCabCancel=(Fl_Button *)0; static void cb_btnCabCancel(Fl_Button*, void*) { wCabrillo->hide(); } Fl_ComboBox *cboContest=(Fl_ComboBox *)0; static void cb_cboContest(Fl_ComboBox*, void*) { setContestType(); } Fl_Check_Button *btnCabCall=(Fl_Check_Button *)0; Fl_Check_Button *btnCabFreq=(Fl_Check_Button *)0; Fl_Check_Button *btnCabMode=(Fl_Check_Button *)0; Fl_Check_Button *btnCabQSOdate=(Fl_Check_Button *)0; Fl_Check_Button *btnCabTimeOFF=(Fl_Check_Button *)0; Fl_Check_Button *btnCabRSTsent=(Fl_Check_Button *)0; Fl_Check_Button *btnCabRSTrcvd=(Fl_Check_Button *)0; Fl_Check_Button *btnCabSerialIN=(Fl_Check_Button *)0; Fl_Check_Button *btnCabSerialOUT=(Fl_Check_Button *)0; Fl_Check_Button *btnCabXchgIn=(Fl_Check_Button *)0; Fl_Check_Button *btnCabMyXchg=(Fl_Check_Button *)0; Fl_Check_Button *btnCabState=(Fl_Check_Button *)0; Fl_Check_Button *btnCabCounty=(Fl_Check_Button *)0; Fl_Button *btnCabClearAllFields=(Fl_Button *)0; static void cb_btnCabClearAllFields(Fl_Button*, void*) { btnCabCall->value(0); btnCabFreq->value(0); btnCabMode->value(0); btnCabQSOdate->value(0); btnCabTimeOFF->value(0); btnCabSerialIN->value(0); btnCabSerialOUT->value(0); btnCabXchgIn->value(0); btnCabMyXchg->value(0); btnCabRSTsent->value(0); btnCabRSTrcvd->value(0); } Fl_Button *btnCabCheckAllFields=(Fl_Button *)0; static void cb_btnCabCheckAllFields(Fl_Button*, void*) { btnCabCall->value(1); btnCabFreq->value(1); btnCabMode->value(1); btnCabQSOdate->value(1); btnCabTimeOFF->value(1); btnCabSerialIN->value(1); btnCabSerialOUT->value(1); btnCabXchgIn->value(1); btnCabMyXchg->value(1); btnCabRSTsent->value(1); btnCabRSTrcvd->value(1); } void create_logbook_dialogs() { { wExport = new Fl_Double_Window(805, 440, _("Export Setup")); { Fl_Group* o = new Fl_Group(4, 4, 388, 430, _("Select Records to Export")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkExportBrowser = new Fl_Check_Browser(13, 25, 370, 330); } // Fl_Check_Browser* chkExportBrowser { btnClearAll = new Fl_Button(78, 362, 90, 20, _("Clear All")); btnClearAll->callback((Fl_Callback*)cb_btnClearAll); } // Fl_Button* btnClearAll { btnCheckAll = new Fl_Button(201, 362, 90, 20, _("Check All")); btnCheckAll->callback((Fl_Callback*)cb_btnCheckAll); } // Fl_Button* btnCheckAll { inp_export_start_date = new Fl_DateInput(20, 402, 100, 22, _("Start Date")); inp_export_start_date->tooltip(_("Start date for export")); inp_export_start_date->box(FL_DOWN_BOX); inp_export_start_date->color(FL_BACKGROUND2_COLOR); inp_export_start_date->selection_color(FL_SELECTION_COLOR); inp_export_start_date->labeltype(FL_NORMAL_LABEL); inp_export_start_date->labelfont(0); inp_export_start_date->labelsize(14); inp_export_start_date->labelcolor(FL_FOREGROUND_COLOR); inp_export_start_date->callback((Fl_Callback*)cb_inp_export_start_date); inp_export_start_date->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_export_start_date->when(FL_WHEN_RELEASE); inp_export_start_date->format(2); } // Fl_DateInput* inp_export_start_date { inp_export_stop_date = new Fl_DateInput(144, 402, 100, 22, _("Stop Date")); inp_export_stop_date->tooltip(_("Inclusive stop date for export")); inp_export_stop_date->box(FL_DOWN_BOX); inp_export_stop_date->color(FL_BACKGROUND2_COLOR); inp_export_stop_date->selection_color(FL_SELECTION_COLOR); inp_export_stop_date->labeltype(FL_NORMAL_LABEL); inp_export_stop_date->labelfont(0); inp_export_stop_date->labelsize(14); inp_export_stop_date->labelcolor(FL_FOREGROUND_COLOR); inp_export_stop_date->callback((Fl_Callback*)cb_inp_export_stop_date); inp_export_stop_date->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_export_stop_date->when(FL_WHEN_RELEASE); inp_export_stop_date->format(2); } // Fl_DateInput* inp_export_stop_date { btn_export_by_date = new Fl_Check_Button(269, 405, 70, 15, _("select by date")); btn_export_by_date->tooltip(_("Enable to select date range")); btn_export_by_date->down_box(FL_DOWN_BOX); btn_export_by_date->callback((Fl_Callback*)cb_btn_export_by_date); } // Fl_Check_Button* btn_export_by_date o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(392, 4, 414, 430, _("Select Fields to Export")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnSelectCall = new Fl_Check_Button(402, 26, 70, 15, _("Call")); btnSelectCall->down_box(FL_DOWN_BOX); btnSelectCall->value(1); } // Fl_Check_Button* btnSelectCall { btnSelectName = new Fl_Check_Button(402, 47, 70, 15, _("Name")); btnSelectName->down_box(FL_DOWN_BOX); btnSelectName->value(1); } // Fl_Check_Button* btnSelectName { btnSelectFreq = new Fl_Check_Button(402, 68, 70, 15, _("Freq")); btnSelectFreq->down_box(FL_DOWN_BOX); btnSelectFreq->value(1); } // Fl_Check_Button* btnSelectFreq { btnSelectBand = new Fl_Check_Button(402, 90, 70, 15, _("Band")); btnSelectBand->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectBand { btnSelectMode = new Fl_Check_Button(402, 111, 70, 15, _("Mode")); btnSelectMode->down_box(FL_DOWN_BOX); btnSelectMode->value(1); } // Fl_Check_Button* btnSelectMode { btnSelectQSOdateOn = new Fl_Check_Button(402, 133, 70, 15, _("QSO Date On")); btnSelectQSOdateOn->down_box(FL_DOWN_BOX); btnSelectQSOdateOn->value(1); } // Fl_Check_Button* btnSelectQSOdateOn { btnSelectQSOdateOff = new Fl_Check_Button(402, 154, 70, 15, _("QSO Date Off")); btnSelectQSOdateOff->down_box(FL_DOWN_BOX); btnSelectQSOdateOff->value(1); } // Fl_Check_Button* btnSelectQSOdateOff { btnSelectTimeON = new Fl_Check_Button(402, 176, 70, 15, _("Time ON")); btnSelectTimeON->down_box(FL_DOWN_BOX); btnSelectTimeON->value(1); } // Fl_Check_Button* btnSelectTimeON { btnSelectTimeOFF = new Fl_Check_Button(402, 197, 70, 15, _("Time OFF")); btnSelectTimeOFF->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectTimeOFF { btnSelectTX_pwr = new Fl_Check_Button(402, 219, 70, 15, _("TX Power")); btnSelectTX_pwr->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectTX_pwr { btnSelectRSTsent = new Fl_Check_Button(402, 240, 70, 15, _("RST sent")); btnSelectRSTsent->down_box(FL_DOWN_BOX); btnSelectRSTsent->value(1); } // Fl_Check_Button* btnSelectRSTsent { btnSelectRSTrcvd = new Fl_Check_Button(402, 262, 70, 15, _("RST rcvd")); btnSelectRSTrcvd->down_box(FL_DOWN_BOX); btnSelectRSTrcvd->value(1); } // Fl_Check_Button* btnSelectRSTrcvd { btnSelectQth = new Fl_Check_Button(402, 283, 70, 15, _("Qth")); btnSelectQth->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQth { btnSelectLOC = new Fl_Check_Button(402, 305, 70, 15, _("LOC")); btnSelectLOC->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectLOC { btnSelectState = new Fl_Check_Button(402, 326, 70, 15, _("State")); btnSelectState->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectState { btnSelectAge = new Fl_Check_Button(402, 348, 70, 15, _("Age")); btnSelectAge->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectAge { btnSelectStaCall = new Fl_Check_Button(536, 26, 70, 15, _("Station Call")); btnSelectStaCall->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectStaCall { btnSelectStaCity = new Fl_Check_Button(536, 47, 70, 15, _("Station QTH")); btnSelectStaCity->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectStaCity { btnSelectStaGrid = new Fl_Check_Button(536, 68, 70, 15, _("Station LOC")); btnSelectStaGrid->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectStaGrid { btnSelectOperator = new Fl_Check_Button(536, 90, 70, 15, _("Operator")); btnSelectOperator->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectOperator { btnSelectProvince = new Fl_Check_Button(536, 111, 70, 15, _("Province")); btnSelectProvince->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectProvince { btnSelectCountry = new Fl_Check_Button(536, 133, 70, 15, _("Country")); btnSelectCountry->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCountry { btnSelectNotes = new Fl_Check_Button(536, 154, 70, 15, _("Notes")); btnSelectNotes->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectNotes { btnSelectQSLrcvd = new Fl_Check_Button(536, 176, 70, 15, _("QSL rcvd date")); btnSelectQSLrcvd->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQSLrcvd { btnSelectQSLsent = new Fl_Check_Button(536, 197, 70, 15, _("QSL sent date")); btnSelectQSLsent->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQSLsent { btnSelecteQSLrcvd = new Fl_Check_Button(536, 219, 70, 15, _("eQSL rcvd date")); btnSelecteQSLrcvd->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelecteQSLrcvd { btnSelecteQSLsent = new Fl_Check_Button(536, 240, 70, 15, _("eQSL sent date")); btnSelecteQSLsent->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelecteQSLsent { btnSelectLOTWrcvd = new Fl_Check_Button(536, 262, 70, 15, _("LoTW rcvd date")); btnSelectLOTWrcvd->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectLOTWrcvd { btnSelectLOTWsent = new Fl_Check_Button(536, 283, 70, 15, _("LoTW sent date")); btnSelectLOTWsent->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectLOTWsent { btnSelectQSL_VIA = new Fl_Check_Button(536, 305, 70, 15, _("QSL-VIA")); btnSelectQSL_VIA->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectQSL_VIA { btnSelectSerialIN = new Fl_Check_Button(536, 326, 70, 15, _("Serial # in")); btnSelectSerialIN->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectSerialIN { btnSelectSerialOUT = new Fl_Check_Button(536, 348, 70, 15, _("Serial # out")); btnSelectSerialOUT->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectSerialOUT { btnSelectCheck = new Fl_Check_Button(670, 26, 70, 15, _("Check")); btnSelectCheck->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCheck { btnSelectXchgIn = new Fl_Check_Button(670, 47, 70, 15, _("Exchange In")); btnSelectXchgIn->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectXchgIn { btnSelectMyXchg = new Fl_Check_Button(670, 68, 70, 15, _("Exchange Out")); btnSelectMyXchg->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectMyXchg { btnSelectCNTY = new Fl_Check_Button(670, 90, 70, 15, _("County")); btnSelectCNTY->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCNTY { btnSelectCONT = new Fl_Check_Button(670, 111, 70, 15, _("Continent")); btnSelectCONT->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCONT { btnSelectCQZ = new Fl_Check_Button(670, 133, 70, 15, _("CQZ")); btnSelectCQZ->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectCQZ { btnSelectDXCC = new Fl_Check_Button(670, 154, 70, 15, _("DXCC")); btnSelectDXCC->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectDXCC { btnSelectIOTA = new Fl_Check_Button(670, 176, 70, 15, _("IOTA")); btnSelectIOTA->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectIOTA { btnSelectITUZ = new Fl_Check_Button(670, 197, 70, 15, _("ITUZ")); btnSelectITUZ->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectITUZ { btnSelectClass = new Fl_Check_Button(670, 219, 70, 15, _("FD class")); btnSelectClass->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectClass { btnSelectSection = new Fl_Check_Button(670, 240, 70, 15, _("FD section")); btnSelectSection->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelectSection { btnSelect_cwss_serno = new Fl_Check_Button(670, 262, 70, 15, _("CW SS SerNo R")); btnSelect_cwss_serno->tooltip(_("CW sweepstakes rcvd ser. no.")); btnSelect_cwss_serno->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_cwss_serno { btnSelect_cwss_prec = new Fl_Check_Button(670, 283, 70, 15, _("CW SS Prec\'")); btnSelect_cwss_prec->tooltip(_("CW sweepstakes precedence")); btnSelect_cwss_prec->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_cwss_prec { btnSelect_cwss_check = new Fl_Check_Button(670, 305, 70, 15, _("CW SS Check")); btnSelect_cwss_check->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_cwss_check { btnSelect_cwss_section = new Fl_Check_Button(670, 326, 70, 15, _("CW SS Section")); btnSelect_cwss_section->tooltip(_("CW sweepstakes section")); btnSelect_cwss_section->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_cwss_section { btnSelect_1010 = new Fl_Check_Button(670, 348, 70, 15, _("10-10")); btnSelect_1010->tooltip(_("CW sweepstakes section")); btnSelect_1010->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnSelect_1010 { btnClearAllFields = new Fl_Button(412, 373, 85, 20, _("Clear All")); btnClearAllFields->callback((Fl_Callback*)cb_btnClearAllFields); } // Fl_Button* btnClearAllFields { btnCheckAllFields = new Fl_Button(507, 373, 85, 20, _("Check All")); btnCheckAllFields->callback((Fl_Callback*)cb_btnCheckAllFields); } // Fl_Button* btnCheckAllFields { btnSetFieldDefaults = new Fl_Button(602, 373, 85, 20, _("Defaults")); btnSetFieldDefaults->callback((Fl_Callback*)cb_btnSetFieldDefaults); } // Fl_Button* btnSetFieldDefaults { btnSetLoTWfields = new Fl_Button(697, 373, 85, 20, _("LoTW")); btnSetLoTWfields->callback((Fl_Callback*)cb_btnSetLoTWfields); } // Fl_Button* btnSetLoTWfields { btnOK = new Fl_Return_Button(697, 403, 85, 20, _("OK")); btnOK->callback((Fl_Callback*)cb_btnOK); } // Fl_Return_Button* btnOK { btnCancel = new Fl_Button(602, 403, 85, 20, _("Cancel")); btnCancel->callback((Fl_Callback*)cb_btnCancel); } // Fl_Button* btnCancel o->end(); } // Fl_Group* o wExport->end(); } // Fl_Double_Window* wExport { Fl_Double_Window* o = dlgLogbook = new Fl_Double_Window(590, 390, _("Logbook")); { inpDate_log = new Fl_DateInput(4, 24, 100, 24, _("Date On")); inpDate_log->tooltip(_("Date QSO started")); inpDate_log->box(FL_DOWN_BOX); inpDate_log->color(FL_BACKGROUND2_COLOR); inpDate_log->selection_color(FL_SELECTION_COLOR); inpDate_log->labeltype(FL_NORMAL_LABEL); inpDate_log->labelfont(0); inpDate_log->labelsize(14); inpDate_log->labelcolor(FL_FOREGROUND_COLOR); inpDate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpDate_log->when(FL_WHEN_RELEASE); inpDate_log->format(2); } // Fl_DateInput* inpDate_log { inpTimeOn_log = new Fl_Input2(106, 24, 70, 24, _("Time On")); inpTimeOn_log->tooltip(_("Time QSO started")); inpTimeOn_log->box(FL_DOWN_BOX); inpTimeOn_log->color(FL_BACKGROUND2_COLOR); inpTimeOn_log->selection_color(FL_SELECTION_COLOR); inpTimeOn_log->labeltype(FL_NORMAL_LABEL); inpTimeOn_log->labelfont(0); inpTimeOn_log->labelsize(14); inpTimeOn_log->labelcolor(FL_FOREGROUND_COLOR); inpTimeOn_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTimeOn_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpTimeOn_log { inpCall_log = new Fl_Input2(178, 24, 100, 24, _("Call")); inpCall_log->tooltip(_("Call sign worked")); inpCall_log->box(FL_DOWN_BOX); inpCall_log->color(FL_BACKGROUND2_COLOR); inpCall_log->selection_color(FL_SELECTION_COLOR); inpCall_log->labeltype(FL_NORMAL_LABEL); inpCall_log->labelfont(0); inpCall_log->labelsize(14); inpCall_log->labelcolor(FL_FOREGROUND_COLOR); inpCall_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCall_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCall_log { inpName_log = new Fl_Input2(280, 24, 185, 24, _("Name")); inpName_log->tooltip(_("Operator worked")); inpName_log->box(FL_DOWN_BOX); inpName_log->color(FL_BACKGROUND2_COLOR); inpName_log->selection_color(FL_SELECTION_COLOR); inpName_log->labeltype(FL_NORMAL_LABEL); inpName_log->labelfont(0); inpName_log->labelsize(14); inpName_log->labelcolor(FL_FOREGROUND_COLOR); inpName_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpName_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpName_log { inpRstR_log = new Fl_Input2(468, 24, 36, 24, _("In")); inpRstR_log->tooltip(_("Rst received")); inpRstR_log->box(FL_DOWN_BOX); inpRstR_log->color(FL_BACKGROUND2_COLOR); inpRstR_log->selection_color(FL_SELECTION_COLOR); inpRstR_log->labeltype(FL_NORMAL_LABEL); inpRstR_log->labelfont(0); inpRstR_log->labelsize(14); inpRstR_log->labelcolor(FL_FOREGROUND_COLOR); inpRstR_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpRstR_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpRstR_log { txtNbrRecs_log = new Fl_Input2(520, 24, 65, 24, _("Recs")); txtNbrRecs_log->tooltip(_("# Records in logbook")); txtNbrRecs_log->box(FL_DOWN_BOX); txtNbrRecs_log->color(FL_BACKGROUND2_COLOR); txtNbrRecs_log->selection_color(FL_SELECTION_COLOR); txtNbrRecs_log->labeltype(FL_NORMAL_LABEL); txtNbrRecs_log->labelfont(0); txtNbrRecs_log->labelsize(14); txtNbrRecs_log->labelcolor(FL_FOREGROUND_COLOR); txtNbrRecs_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txtNbrRecs_log->when(FL_WHEN_RELEASE); } // Fl_Input2* txtNbrRecs_log { inpDateOff_log = new Fl_DateInput(4, 68, 100, 24, _("Date Off")); inpDateOff_log->tooltip(_("Date QSO Ended")); inpDateOff_log->box(FL_DOWN_BOX); inpDateOff_log->color(FL_BACKGROUND2_COLOR); inpDateOff_log->selection_color(FL_SELECTION_COLOR); inpDateOff_log->labeltype(FL_NORMAL_LABEL); inpDateOff_log->labelfont(0); inpDateOff_log->labelsize(14); inpDateOff_log->labelcolor(FL_FOREGROUND_COLOR); inpDateOff_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpDateOff_log->when(FL_WHEN_RELEASE); inpDateOff_log->format(2); } // Fl_DateInput* inpDateOff_log { inpTimeOff_log = new Fl_Input2(106, 68, 70, 24, _("Time Off")); inpTimeOff_log->tooltip(_("Time QSO ended")); inpTimeOff_log->box(FL_DOWN_BOX); inpTimeOff_log->color(FL_BACKGROUND2_COLOR); inpTimeOff_log->selection_color(FL_SELECTION_COLOR); inpTimeOff_log->labeltype(FL_NORMAL_LABEL); inpTimeOff_log->labelfont(0); inpTimeOff_log->labelsize(14); inpTimeOff_log->labelcolor(FL_FOREGROUND_COLOR); inpTimeOff_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTimeOff_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpTimeOff_log { inpFreq_log = new Fl_Input2(178, 68, 100, 24, _("Freq.")); inpFreq_log->tooltip(_("Frequency in MHz")); inpFreq_log->box(FL_DOWN_BOX); inpFreq_log->color(FL_BACKGROUND2_COLOR); inpFreq_log->selection_color(FL_SELECTION_COLOR); inpFreq_log->labeltype(FL_NORMAL_LABEL); inpFreq_log->labelfont(0); inpFreq_log->labelsize(14); inpFreq_log->labelcolor(FL_FOREGROUND_COLOR); inpFreq_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpFreq_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpFreq_log { inpMode_log = new Fl_Input2(280, 68, 146, 24, _("Mode")); inpMode_log->tooltip(_("Mode in use")); inpMode_log->box(FL_DOWN_BOX); inpMode_log->color(FL_BACKGROUND2_COLOR); inpMode_log->selection_color(FL_SELECTION_COLOR); inpMode_log->labeltype(FL_NORMAL_LABEL); inpMode_log->labelfont(0); inpMode_log->labelsize(14); inpMode_log->labelcolor(FL_FOREGROUND_COLOR); inpMode_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpMode_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMode_log { inpTX_pwr_log = new Fl_Input2(429, 68, 36, 24, _("Pwr")); inpTX_pwr_log->tooltip(_("Transmit power used")); inpTX_pwr_log->box(FL_DOWN_BOX); inpTX_pwr_log->color(FL_BACKGROUND2_COLOR); inpTX_pwr_log->selection_color(FL_SELECTION_COLOR); inpTX_pwr_log->labeltype(FL_NORMAL_LABEL); inpTX_pwr_log->labelfont(0); inpTX_pwr_log->labelsize(14); inpTX_pwr_log->labelcolor(FL_FOREGROUND_COLOR); inpTX_pwr_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTX_pwr_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpTX_pwr_log { inpLoc_log = new Fl_Input2(508, 68, 76, 24, _("Loc")); inpLoc_log->tooltip(_("Stations grid square")); inpLoc_log->box(FL_DOWN_BOX); inpLoc_log->color(FL_BACKGROUND2_COLOR); inpLoc_log->selection_color(FL_SELECTION_COLOR); inpLoc_log->labeltype(FL_NORMAL_LABEL); inpLoc_log->labelfont(0); inpLoc_log->labelsize(14); inpLoc_log->labelcolor(FL_FOREGROUND_COLOR); inpLoc_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpLoc_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpLoc_log { inpRstS_log = new Fl_Input2(468, 68, 36, 24, _("Out")); inpRstS_log->tooltip(_("Rst sent")); inpRstS_log->box(FL_DOWN_BOX); inpRstS_log->color(FL_BACKGROUND2_COLOR); inpRstS_log->selection_color(FL_SELECTION_COLOR); inpRstS_log->labeltype(FL_NORMAL_LABEL); inpRstS_log->labelfont(0); inpRstS_log->labelsize(14); inpRstS_log->labelcolor(FL_FOREGROUND_COLOR); inpRstS_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpRstS_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpRstS_log { inpQth_log = new Fl_Input2(5, 112, 280, 24, _("Qth")); inpQth_log->tooltip(_("City of station worked")); inpQth_log->box(FL_DOWN_BOX); inpQth_log->color(FL_BACKGROUND2_COLOR); inpQth_log->selection_color(FL_SELECTION_COLOR); inpQth_log->labeltype(FL_NORMAL_LABEL); inpQth_log->labelfont(0); inpQth_log->labelsize(14); inpQth_log->labelcolor(FL_FOREGROUND_COLOR); inpQth_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQth_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpQth_log { inpState_log = new Fl_Input2(288, 112, 44, 24, _("St")); inpState_log->tooltip(_("US state of station worked")); inpState_log->box(FL_DOWN_BOX); inpState_log->color(FL_BACKGROUND2_COLOR); inpState_log->selection_color(FL_SELECTION_COLOR); inpState_log->labeltype(FL_NORMAL_LABEL); inpState_log->labelfont(0); inpState_log->labelsize(14); inpState_log->labelcolor(FL_FOREGROUND_COLOR); inpState_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpState_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpState_log { inpVE_Prov_log = new Fl_Input2(335, 112, 44, 24, _("Pr")); inpVE_Prov_log->tooltip(_("Province of station worked")); inpVE_Prov_log->box(FL_DOWN_BOX); inpVE_Prov_log->color(FL_BACKGROUND2_COLOR); inpVE_Prov_log->selection_color(FL_SELECTION_COLOR); inpVE_Prov_log->labeltype(FL_NORMAL_LABEL); inpVE_Prov_log->labelfont(0); inpVE_Prov_log->labelsize(14); inpVE_Prov_log->labelcolor(FL_FOREGROUND_COLOR); inpVE_Prov_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpVE_Prov_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpVE_Prov_log { inpCountry_log = new Fl_Input2(382, 112, 202, 24, _("Country")); inpCountry_log->tooltip(_("Country of station worked")); inpCountry_log->box(FL_DOWN_BOX); inpCountry_log->color(FL_BACKGROUND2_COLOR); inpCountry_log->selection_color(FL_SELECTION_COLOR); inpCountry_log->labeltype(FL_NORMAL_LABEL); inpCountry_log->labelfont(0); inpCountry_log->labelsize(14); inpCountry_log->labelcolor(FL_FOREGROUND_COLOR); inpCountry_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCountry_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCountry_log { Fl_Group* o = grpTabsSearch = new Fl_Group(0, 137, 590, 125); { Tabs = new Fl_Tabs(0, 140, 481, 120); { tab_log_qsl = new Fl_Group(0, 161, 481, 97, _("QSL")); { Fl_DateInput* o = inpQSLrcvddate_log = new Fl_DateInput(14, 188, 100, 24, _("QSL-rcvd")); inpQSLrcvddate_log->tooltip(_("QSL received on this date")); inpQSLrcvddate_log->box(FL_DOWN_BOX); inpQSLrcvddate_log->color(FL_BACKGROUND2_COLOR); inpQSLrcvddate_log->selection_color(FL_SELECTION_COLOR); inpQSLrcvddate_log->labeltype(FL_NORMAL_LABEL); inpQSLrcvddate_log->labelfont(0); inpQSLrcvddate_log->labelsize(14); inpQSLrcvddate_log->labelcolor(FL_FOREGROUND_COLOR); inpQSLrcvddate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQSLrcvddate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpQSLrcvddate_log { Fl_DateInput* o = inpEQSLrcvddate_log = new Fl_DateInput(118, 188, 100, 24, _("EQSL-rcvd")); inpEQSLrcvddate_log->tooltip(_("QSL received on this date")); inpEQSLrcvddate_log->box(FL_DOWN_BOX); inpEQSLrcvddate_log->color(FL_BACKGROUND2_COLOR); inpEQSLrcvddate_log->selection_color(FL_SELECTION_COLOR); inpEQSLrcvddate_log->labeltype(FL_NORMAL_LABEL); inpEQSLrcvddate_log->labelfont(0); inpEQSLrcvddate_log->labelsize(14); inpEQSLrcvddate_log->labelcolor(FL_FOREGROUND_COLOR); inpEQSLrcvddate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpEQSLrcvddate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpEQSLrcvddate_log { Fl_DateInput* o = inpLOTWrcvddate_log = new Fl_DateInput(222, 188, 100, 24, _("LOTW-rcvd")); inpLOTWrcvddate_log->tooltip(_("QSL received on this date")); inpLOTWrcvddate_log->box(FL_DOWN_BOX); inpLOTWrcvddate_log->color(FL_BACKGROUND2_COLOR); inpLOTWrcvddate_log->selection_color(FL_SELECTION_COLOR); inpLOTWrcvddate_log->labeltype(FL_NORMAL_LABEL); inpLOTWrcvddate_log->labelfont(0); inpLOTWrcvddate_log->labelsize(14); inpLOTWrcvddate_log->labelcolor(FL_FOREGROUND_COLOR); inpLOTWrcvddate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpLOTWrcvddate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpLOTWrcvddate_log { Fl_DateInput* o = inpQSLsentdate_log = new Fl_DateInput(14, 234, 100, 24, _("QSL-sent")); inpQSLsentdate_log->tooltip(_("QSL sent on this date")); inpQSLsentdate_log->box(FL_DOWN_BOX); inpQSLsentdate_log->color(FL_BACKGROUND2_COLOR); inpQSLsentdate_log->selection_color(FL_SELECTION_COLOR); inpQSLsentdate_log->labeltype(FL_NORMAL_LABEL); inpQSLsentdate_log->labelfont(0); inpQSLsentdate_log->labelsize(14); inpQSLsentdate_log->labelcolor(FL_FOREGROUND_COLOR); inpQSLsentdate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQSLsentdate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpQSLsentdate_log { Fl_DateInput* o = inpEQSLsentdate_log = new Fl_DateInput(118, 234, 100, 24, _("EQSL-sent")); inpEQSLsentdate_log->tooltip(_("QSL sent on this date")); inpEQSLsentdate_log->box(FL_DOWN_BOX); inpEQSLsentdate_log->color(FL_BACKGROUND2_COLOR); inpEQSLsentdate_log->selection_color(FL_SELECTION_COLOR); inpEQSLsentdate_log->labeltype(FL_NORMAL_LABEL); inpEQSLsentdate_log->labelfont(0); inpEQSLsentdate_log->labelsize(14); inpEQSLsentdate_log->labelcolor(FL_FOREGROUND_COLOR); inpEQSLsentdate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpEQSLsentdate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpEQSLsentdate_log { Fl_DateInput* o = inpLOTWsentdate_log = new Fl_DateInput(222, 234, 100, 24, _("LOTW-sent")); inpLOTWsentdate_log->tooltip(_("QSL sent on this date")); inpLOTWsentdate_log->box(FL_DOWN_BOX); inpLOTWsentdate_log->color(FL_BACKGROUND2_COLOR); inpLOTWsentdate_log->selection_color(FL_SELECTION_COLOR); inpLOTWsentdate_log->labeltype(FL_NORMAL_LABEL); inpLOTWsentdate_log->labelfont(0); inpLOTWsentdate_log->labelsize(14); inpLOTWsentdate_log->labelcolor(FL_FOREGROUND_COLOR); inpLOTWsentdate_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpLOTWsentdate_log->when(FL_WHEN_RELEASE); o->format(2); } // Fl_DateInput* inpLOTWsentdate_log { inpQSL_VIA_log = new Fl_Input2(325, 188, 156, 70, _("QSL-VIA")); inpQSL_VIA_log->tooltip(_("QSL route of contacted station")); inpQSL_VIA_log->type(4); inpQSL_VIA_log->box(FL_DOWN_BOX); inpQSL_VIA_log->color(FL_BACKGROUND2_COLOR); inpQSL_VIA_log->selection_color(FL_SELECTION_COLOR); inpQSL_VIA_log->labeltype(FL_NORMAL_LABEL); inpQSL_VIA_log->labelfont(0); inpQSL_VIA_log->labelsize(14); inpQSL_VIA_log->labelcolor(FL_FOREGROUND_COLOR); inpQSL_VIA_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpQSL_VIA_log->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(inpQSL_VIA_log); } // Fl_Input2* inpQSL_VIA_log tab_log_qsl->end(); } // Fl_Group* tab_log_qsl { tab_log_other = new Fl_Group(0, 161, 475, 99, _("Other")); tab_log_other->hide(); { inpCNTY_log = new Fl_Input2(21, 192, 241, 24, _("County")); inpCNTY_log->tooltip(_("County")); inpCNTY_log->box(FL_DOWN_BOX); inpCNTY_log->color(FL_BACKGROUND2_COLOR); inpCNTY_log->selection_color(FL_SELECTION_COLOR); inpCNTY_log->labeltype(FL_NORMAL_LABEL); inpCNTY_log->labelfont(0); inpCNTY_log->labelsize(14); inpCNTY_log->labelcolor(FL_FOREGROUND_COLOR); inpCNTY_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCNTY_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCNTY_log { inpIOTA_log = new Fl_Input2(276, 192, 90, 24, _("IOTA")); inpIOTA_log->tooltip(_("Islands on the air")); inpIOTA_log->box(FL_DOWN_BOX); inpIOTA_log->color(FL_BACKGROUND2_COLOR); inpIOTA_log->selection_color(FL_SELECTION_COLOR); inpIOTA_log->labeltype(FL_NORMAL_LABEL); inpIOTA_log->labelfont(0); inpIOTA_log->labelsize(14); inpIOTA_log->labelcolor(FL_FOREGROUND_COLOR); inpIOTA_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpIOTA_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpIOTA_log { inpCQZ_log = new Fl_Input2(383, 192, 90, 24, _("CQZ")); inpCQZ_log->tooltip(_("CQ zone")); inpCQZ_log->box(FL_DOWN_BOX); inpCQZ_log->color(FL_BACKGROUND2_COLOR); inpCQZ_log->selection_color(FL_SELECTION_COLOR); inpCQZ_log->labeltype(FL_NORMAL_LABEL); inpCQZ_log->labelfont(0); inpCQZ_log->labelsize(14); inpCQZ_log->labelcolor(FL_FOREGROUND_COLOR); inpCQZ_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCQZ_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCQZ_log { inpCONT_log = new Fl_Input2(21, 236, 241, 24, _("Cont\'")); inpCONT_log->tooltip(_("Continent")); inpCONT_log->box(FL_DOWN_BOX); inpCONT_log->color(FL_BACKGROUND2_COLOR); inpCONT_log->selection_color(FL_SELECTION_COLOR); inpCONT_log->labeltype(FL_NORMAL_LABEL); inpCONT_log->labelfont(0); inpCONT_log->labelsize(14); inpCONT_log->labelcolor(FL_FOREGROUND_COLOR); inpCONT_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpCONT_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpCONT_log { inpITUZ_log = new Fl_Input2(277, 236, 90, 24, _("ITUZ")); inpITUZ_log->tooltip(_("ITU zone")); inpITUZ_log->box(FL_DOWN_BOX); inpITUZ_log->color(FL_BACKGROUND2_COLOR); inpITUZ_log->selection_color(FL_SELECTION_COLOR); inpITUZ_log->labeltype(FL_NORMAL_LABEL); inpITUZ_log->labelfont(0); inpITUZ_log->labelsize(14); inpITUZ_log->labelcolor(FL_FOREGROUND_COLOR); inpITUZ_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpITUZ_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpITUZ_log { inpDXCC_log = new Fl_Input2(383, 236, 90, 24, _("DXCC")); inpDXCC_log->tooltip(_("DXCC designator")); inpDXCC_log->box(FL_DOWN_BOX); inpDXCC_log->color(FL_BACKGROUND2_COLOR); inpDXCC_log->selection_color(FL_SELECTION_COLOR); inpDXCC_log->labeltype(FL_NORMAL_LABEL); inpDXCC_log->labelfont(0); inpDXCC_log->labelsize(14); inpDXCC_log->labelcolor(FL_FOREGROUND_COLOR); inpDXCC_log->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpDXCC_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpDXCC_log tab_log_other->end(); } // Fl_Group* tab_log_other { tab_log_notes = new Fl_Group(0, 161, 480, 96, _("Notes")); tab_log_notes->hide(); { inpNotes_log = new Fl_Input2(15, 171, 465, 85); inpNotes_log->tooltip(_("Interesting notes")); inpNotes_log->type(4); inpNotes_log->box(FL_DOWN_BOX); inpNotes_log->color(FL_BACKGROUND2_COLOR); inpNotes_log->selection_color(FL_SELECTION_COLOR); inpNotes_log->labeltype(FL_NORMAL_LABEL); inpNotes_log->labelfont(0); inpNotes_log->labelsize(14); inpNotes_log->labelcolor(FL_FOREGROUND_COLOR); inpNotes_log->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); inpNotes_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpNotes_log tab_log_notes->end(); } // Fl_Group* tab_log_notes { tab_log_my_station = new Fl_Group(0, 161, 475, 99, _("My Station")); tab_log_my_station->hide(); { inp_log_sta_call = new Fl_Input2(15, 192, 100, 24, _("Station Call")); inp_log_sta_call->tooltip(_("Interesting notes")); inp_log_sta_call->box(FL_DOWN_BOX); inp_log_sta_call->color(FL_BACKGROUND2_COLOR); inp_log_sta_call->selection_color(FL_SELECTION_COLOR); inp_log_sta_call->labeltype(FL_NORMAL_LABEL); inp_log_sta_call->labelfont(0); inp_log_sta_call->labelsize(14); inp_log_sta_call->labelcolor(FL_FOREGROUND_COLOR); inp_log_sta_call->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_log_sta_call->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_sta_call { inp_log_op_call = new Fl_Input2(140, 192, 100, 24, _("Operator Call")); inp_log_op_call->tooltip(_("Interesting notes")); inp_log_op_call->box(FL_DOWN_BOX); inp_log_op_call->color(FL_BACKGROUND2_COLOR); inp_log_op_call->selection_color(FL_SELECTION_COLOR); inp_log_op_call->labeltype(FL_NORMAL_LABEL); inp_log_op_call->labelfont(0); inp_log_op_call->labelsize(14); inp_log_op_call->labelcolor(FL_FOREGROUND_COLOR); inp_log_op_call->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_log_op_call->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_op_call { inp_log_sta_qth = new Fl_Input2(15, 236, 334, 24, _("Station QTH")); inp_log_sta_qth->tooltip(_("Interesting notes")); inp_log_sta_qth->box(FL_DOWN_BOX); inp_log_sta_qth->color(FL_BACKGROUND2_COLOR); inp_log_sta_qth->selection_color(FL_SELECTION_COLOR); inp_log_sta_qth->labeltype(FL_NORMAL_LABEL); inp_log_sta_qth->labelfont(0); inp_log_sta_qth->labelsize(14); inp_log_sta_qth->labelcolor(FL_FOREGROUND_COLOR); inp_log_sta_qth->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_log_sta_qth->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_sta_qth { inp_log_sta_loc = new Fl_Input2(355, 236, 120, 24, _("Station Locator")); inp_log_sta_loc->tooltip(_("Interesting notes")); inp_log_sta_loc->box(FL_DOWN_BOX); inp_log_sta_loc->color(FL_BACKGROUND2_COLOR); inp_log_sta_loc->selection_color(FL_SELECTION_COLOR); inp_log_sta_loc->labeltype(FL_NORMAL_LABEL); inp_log_sta_loc->labelfont(0); inp_log_sta_loc->labelsize(14); inp_log_sta_loc->labelcolor(FL_FOREGROUND_COLOR); inp_log_sta_loc->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_log_sta_loc->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_sta_loc tab_log_my_station->end(); } // Fl_Group* tab_log_my_station { tab_log_contest = new Fl_Group(0, 161, 480, 99, _("Contest")); tab_log_contest->hide(); { inpSerNoOut_log = new Fl_Input2(69, 179, 55, 24, _("Ser out")); inpSerNoOut_log->tooltip(_("Contest seral # sent")); inpSerNoOut_log->box(FL_DOWN_BOX); inpSerNoOut_log->color(FL_BACKGROUND2_COLOR); inpSerNoOut_log->selection_color(FL_SELECTION_COLOR); inpSerNoOut_log->labeltype(FL_NORMAL_LABEL); inpSerNoOut_log->labelfont(0); inpSerNoOut_log->labelsize(14); inpSerNoOut_log->labelcolor(FL_FOREGROUND_COLOR); inpSerNoOut_log->align(Fl_Align(FL_ALIGN_LEFT)); inpSerNoOut_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSerNoOut_log { inpMyXchg_log = new Fl_Input2(204, 179, 170, 24, _("Exch Out")); inpMyXchg_log->tooltip(_("Contest exchange sent")); inpMyXchg_log->box(FL_DOWN_BOX); inpMyXchg_log->color(FL_BACKGROUND2_COLOR); inpMyXchg_log->selection_color(FL_SELECTION_COLOR); inpMyXchg_log->labeltype(FL_NORMAL_LABEL); inpMyXchg_log->labelfont(0); inpMyXchg_log->labelsize(14); inpMyXchg_log->labelcolor(FL_FOREGROUND_COLOR); inpMyXchg_log->align(Fl_Align(FL_ALIGN_LEFT)); inpMyXchg_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpMyXchg_log { inpSerNoIn_log = new Fl_Input2(69, 207, 55, 24, _("Ser in")); inpSerNoIn_log->tooltip(_("Contest serial # received")); inpSerNoIn_log->box(FL_DOWN_BOX); inpSerNoIn_log->color(FL_BACKGROUND2_COLOR); inpSerNoIn_log->selection_color(FL_SELECTION_COLOR); inpSerNoIn_log->labeltype(FL_NORMAL_LABEL); inpSerNoIn_log->labelfont(0); inpSerNoIn_log->labelsize(14); inpSerNoIn_log->labelcolor(FL_FOREGROUND_COLOR); inpSerNoIn_log->align(Fl_Align(FL_ALIGN_LEFT)); inpSerNoIn_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSerNoIn_log { inpXchgIn_log = new Fl_Input2(204, 207, 170, 24, _("Exch In")); inpXchgIn_log->tooltip(_("Contest exchange received")); inpXchgIn_log->box(FL_DOWN_BOX); inpXchgIn_log->color(FL_BACKGROUND2_COLOR); inpXchgIn_log->selection_color(FL_SELECTION_COLOR); inpXchgIn_log->labeltype(FL_NORMAL_LABEL); inpXchgIn_log->labelfont(0); inpXchgIn_log->labelsize(14); inpXchgIn_log->labelcolor(FL_FOREGROUND_COLOR); inpXchgIn_log->align(Fl_Align(FL_ALIGN_LEFT)); inpXchgIn_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpXchgIn_log { inpClass_log = new Fl_Input2(69, 236, 55, 24, _("Class")); inpClass_log->tooltip(_("Field Day class received")); inpClass_log->box(FL_DOWN_BOX); inpClass_log->color(FL_BACKGROUND2_COLOR); inpClass_log->selection_color(FL_SELECTION_COLOR); inpClass_log->labeltype(FL_NORMAL_LABEL); inpClass_log->labelfont(0); inpClass_log->labelsize(14); inpClass_log->labelcolor(FL_FOREGROUND_COLOR); inpClass_log->align(Fl_Align(FL_ALIGN_LEFT)); inpClass_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpClass_log { inpSection_log = new Fl_Input2(204, 236, 56, 24, _("ARRL Sect")); inpSection_log->tooltip(_("Field Section received")); inpSection_log->box(FL_DOWN_BOX); inpSection_log->color(FL_BACKGROUND2_COLOR); inpSection_log->selection_color(FL_SELECTION_COLOR); inpSection_log->labeltype(FL_NORMAL_LABEL); inpSection_log->labelfont(0); inpSection_log->labelsize(14); inpSection_log->labelcolor(FL_FOREGROUND_COLOR); inpSection_log->align(Fl_Align(FL_ALIGN_LEFT)); inpSection_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSection_log { inp_age_log = new Fl_Input2(420, 179, 60, 24, _("Age")); inp_age_log->tooltip(_("Operators age received")); inp_age_log->box(FL_DOWN_BOX); inp_age_log->color(FL_BACKGROUND2_COLOR); inp_age_log->selection_color(FL_SELECTION_COLOR); inp_age_log->labeltype(FL_NORMAL_LABEL); inp_age_log->labelfont(0); inp_age_log->labelsize(14); inp_age_log->labelcolor(FL_FOREGROUND_COLOR); inp_age_log->align(Fl_Align(FL_ALIGN_LEFT)); inp_age_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_age_log { inp_1010_log = new Fl_Input2(420, 207, 60, 24, _("10-10")); inp_1010_log->tooltip(_("Ten Ten number received")); inp_1010_log->box(FL_DOWN_BOX); inp_1010_log->color(FL_BACKGROUND2_COLOR); inp_1010_log->selection_color(FL_SELECTION_COLOR); inp_1010_log->labeltype(FL_NORMAL_LABEL); inp_1010_log->labelfont(0); inp_1010_log->labelsize(14); inp_1010_log->labelcolor(FL_FOREGROUND_COLOR); inp_1010_log->align(Fl_Align(FL_ALIGN_LEFT)); inp_1010_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_1010_log { inpBand_log = new Fl_Input2(420, 236, 60, 24, _("Band")); inpBand_log->tooltip(_("Operating band")); inpBand_log->box(FL_DOWN_BOX); inpBand_log->color(FL_BACKGROUND2_COLOR); inpBand_log->selection_color(FL_SELECTION_COLOR); inpBand_log->labeltype(FL_NORMAL_LABEL); inpBand_log->labelfont(0); inpBand_log->labelsize(14); inpBand_log->labelcolor(FL_FOREGROUND_COLOR); inpBand_log->align(Fl_Align(FL_ALIGN_LEFT)); inpBand_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inpBand_log { inp_check_log = new Fl_Input2(314, 236, 60, 24, _("Check")); inp_check_log->tooltip(_("Check value received")); inp_check_log->box(FL_DOWN_BOX); inp_check_log->color(FL_BACKGROUND2_COLOR); inp_check_log->selection_color(FL_SELECTION_COLOR); inp_check_log->labeltype(FL_NORMAL_LABEL); inp_check_log->labelfont(0); inp_check_log->labelsize(14); inp_check_log->labelcolor(FL_FOREGROUND_COLOR); inp_check_log->align(Fl_Align(FL_ALIGN_LEFT)); inp_check_log->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_check_log tab_log_contest->end(); } // Fl_Group* tab_log_contest { tab_log_cwss = new Fl_Group(0, 161, 475, 96, _("CW SS")); tab_log_cwss->tooltip(_("CW Sweepstakes Contest")); tab_log_cwss->hide(); { inp_log_cwss_serno = new Fl_Input2(77, 179, 55, 24, _("Ser NoR")); inp_log_cwss_serno->tooltip(_("Contest seral # sent")); inp_log_cwss_serno->box(FL_DOWN_BOX); inp_log_cwss_serno->color(FL_BACKGROUND2_COLOR); inp_log_cwss_serno->selection_color(FL_SELECTION_COLOR); inp_log_cwss_serno->labeltype(FL_NORMAL_LABEL); inp_log_cwss_serno->labelfont(0); inp_log_cwss_serno->labelsize(14); inp_log_cwss_serno->labelcolor(FL_FOREGROUND_COLOR); inp_log_cwss_serno->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_cwss_serno->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_cwss_serno { inp_log_cwss_sec = new Fl_Input2(77, 207, 56, 24, _("Section")); inp_log_cwss_sec->tooltip(_("SS section")); inp_log_cwss_sec->box(FL_DOWN_BOX); inp_log_cwss_sec->color(FL_BACKGROUND2_COLOR); inp_log_cwss_sec->selection_color(FL_SELECTION_COLOR); inp_log_cwss_sec->labeltype(FL_NORMAL_LABEL); inp_log_cwss_sec->labelfont(0); inp_log_cwss_sec->labelsize(14); inp_log_cwss_sec->labelcolor(FL_FOREGROUND_COLOR); inp_log_cwss_sec->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_cwss_sec->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_cwss_sec { inp_log_cwss_prec = new Fl_Input2(238, 179, 77, 24, _("Precedence")); inp_log_cwss_prec->tooltip(_("Contest exchange sent")); inp_log_cwss_prec->box(FL_DOWN_BOX); inp_log_cwss_prec->color(FL_BACKGROUND2_COLOR); inp_log_cwss_prec->selection_color(FL_SELECTION_COLOR); inp_log_cwss_prec->labeltype(FL_NORMAL_LABEL); inp_log_cwss_prec->labelfont(0); inp_log_cwss_prec->labelsize(14); inp_log_cwss_prec->labelcolor(FL_FOREGROUND_COLOR); inp_log_cwss_prec->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_cwss_prec->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_cwss_prec { inp_log_cwss_chk = new Fl_Input2(238, 207, 77, 24, _("Check")); inp_log_cwss_chk->tooltip(_("Contest exchange received")); inp_log_cwss_chk->box(FL_DOWN_BOX); inp_log_cwss_chk->color(FL_BACKGROUND2_COLOR); inp_log_cwss_chk->selection_color(FL_SELECTION_COLOR); inp_log_cwss_chk->labeltype(FL_NORMAL_LABEL); inp_log_cwss_chk->labelfont(0); inp_log_cwss_chk->labelsize(14); inp_log_cwss_chk->labelcolor(FL_FOREGROUND_COLOR); inp_log_cwss_chk->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_cwss_chk->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_cwss_chk tab_log_cwss->end(); } // Fl_Group* tab_log_cwss { tab_log_jota = new Fl_Group(0, 161, 475, 96, _("JOTA")); tab_log_jota->tooltip(_("Jamboree On The Air")); tab_log_jota->hide(); { inp_log_troop_s = new Fl_Input2(115, 179, 100, 24, _("Troop-S")); inp_log_troop_s->tooltip(_("Sent troop number")); inp_log_troop_s->box(FL_DOWN_BOX); inp_log_troop_s->color(FL_BACKGROUND2_COLOR); inp_log_troop_s->selection_color(FL_SELECTION_COLOR); inp_log_troop_s->labeltype(FL_NORMAL_LABEL); inp_log_troop_s->labelfont(0); inp_log_troop_s->labelsize(14); inp_log_troop_s->labelcolor(FL_FOREGROUND_COLOR); inp_log_troop_s->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_troop_s->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_troop_s { inp_log_troop_r = new Fl_Input2(292, 179, 100, 24, _("Troop-R")); inp_log_troop_r->tooltip(_("Received troop number")); inp_log_troop_r->box(FL_DOWN_BOX); inp_log_troop_r->color(FL_BACKGROUND2_COLOR); inp_log_troop_r->selection_color(FL_SELECTION_COLOR); inp_log_troop_r->labeltype(FL_NORMAL_LABEL); inp_log_troop_r->labelfont(0); inp_log_troop_r->labelsize(14); inp_log_troop_r->labelcolor(FL_FOREGROUND_COLOR); inp_log_troop_r->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_troop_r->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_troop_r { inp_log_scout_s = new Fl_Input2(115, 215, 100, 24, _("Name-S")); inp_log_scout_s->tooltip(_("Sent scout name")); inp_log_scout_s->box(FL_DOWN_BOX); inp_log_scout_s->color(FL_BACKGROUND2_COLOR); inp_log_scout_s->selection_color(FL_SELECTION_COLOR); inp_log_scout_s->labeltype(FL_NORMAL_LABEL); inp_log_scout_s->labelfont(0); inp_log_scout_s->labelsize(14); inp_log_scout_s->labelcolor(FL_FOREGROUND_COLOR); inp_log_scout_s->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_scout_s->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_scout_s { inp_log_scout_r = new Fl_Input2(292, 215, 100, 24, _("Name-R")); inp_log_scout_r->tooltip(_("Received scout name")); inp_log_scout_r->box(FL_DOWN_BOX); inp_log_scout_r->color(FL_BACKGROUND2_COLOR); inp_log_scout_r->selection_color(FL_SELECTION_COLOR); inp_log_scout_r->labeltype(FL_NORMAL_LABEL); inp_log_scout_r->labelfont(0); inp_log_scout_r->labelsize(14); inp_log_scout_r->labelcolor(FL_FOREGROUND_COLOR); inp_log_scout_r->align(Fl_Align(FL_ALIGN_LEFT)); inp_log_scout_r->when(FL_WHEN_RELEASE); } // Fl_Input2* inp_log_scout_r tab_log_jota->end(); } // Fl_Group* tab_log_jota Tabs->end(); } // Fl_Tabs* Tabs { grpCallSearch = new Fl_Group(482, 137, 105, 125); { inpSearchString = new Fl_Input2(482, 160, 105, 24, _("Call Search")); inpSearchString->tooltip(_("Search for this callsign")); inpSearchString->box(FL_DOWN_BOX); inpSearchString->color(FL_BACKGROUND2_COLOR); inpSearchString->selection_color(FL_SELECTION_COLOR); inpSearchString->labeltype(FL_NORMAL_LABEL); inpSearchString->labelfont(0); inpSearchString->labelsize(14); inpSearchString->labelcolor(FL_FOREGROUND_COLOR); inpSearchString->align(Fl_Align(FL_ALIGN_TOP)); inpSearchString->when(FL_WHEN_RELEASE); } // Fl_Input2* inpSearchString { bSearchPrev = new Fl_Button(500, 193, 24, 22); bSearchPrev->tooltip(_("Find previous")); bSearchPrev->color(FL_LIGHT1); bSearchPrev->selection_color((Fl_Color)48); bSearchPrev->callback((Fl_Callback*)cb_search); bSearchPrev->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); bSearchPrev->image(new Fl_Pixmap(left_arrow_icon)); } // Fl_Button* bSearchPrev { bSearchNext = new Fl_Button(552, 193, 24, 22); bSearchNext->tooltip(_("Find next")); bSearchNext->color(FL_LIGHT1); bSearchNext->selection_color((Fl_Color)48); bSearchNext->callback((Fl_Callback*)cb_search); bSearchNext->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); bSearchNext->image(new Fl_Pixmap(right_arrow_icon)); } // Fl_Button* bSearchNext { bRetrieve = new Fl_Button(500, 223, 75, 22, _("Retrieve")); bRetrieve->tooltip(_("Retrieve for active modem use")); bRetrieve->shortcut(0x50066); bRetrieve->color(FL_LIGHT1); bRetrieve->selection_color((Fl_Color)48); bRetrieve->callback((Fl_Callback*)cb_btnRetrieve); } // Fl_Button* bRetrieve grpCallSearch->end(); } // Fl_Group* grpCallSearch o->resizable(Tabs); grpTabsSearch->end(); } // Fl_Group* grpTabsSearch { Fl_Group* o = grpFileButtons = new Fl_Group(0, 262, 589, 25); { bNewSave = new Fl_Button(396, 263, 59, 22, _("New")); bNewSave->tooltip(_("New record / Save record")); bNewSave->shortcut(0x8004e); bNewSave->color(FL_LIGHT1); bNewSave->selection_color((Fl_Color)48); bNewSave->callback((Fl_Callback*)cb_btnNewSave); } // Fl_Button* bNewSave { bUpdateCancel = new Fl_Button(459, 263, 59, 22, _("Update")); bUpdateCancel->tooltip(_("Update the current record")); bUpdateCancel->shortcut(0x80055); bUpdateCancel->color(FL_LIGHT1); bUpdateCancel->selection_color((Fl_Color)48); bUpdateCancel->callback((Fl_Callback*)cb_btnUpdateCancel); } // Fl_Button* bUpdateCancel { bDelete = new Fl_Button(522, 263, 59, 22, _("Delete")); bDelete->tooltip(_("Delete the current record")); bDelete->shortcut(0x80044); bDelete->color(FL_LIGHT1); bDelete->selection_color((Fl_Color)48); bDelete->callback((Fl_Callback*)cb_btnDelete); } // Fl_Button* bDelete { txtLogFile = new Fl_Output(35, 263, 357, 22, _("File:")); txtLogFile->color(FL_LIGHT3); } // Fl_Output* txtLogFile o->resizable(txtLogFile); grpFileButtons->end(); } // Fl_Group* grpFileButtons { wBrowser = new Table(2, 288, 586, 100); wBrowser->box(FL_DOWN_FRAME); wBrowser->color(FL_BACKGROUND2_COLOR); wBrowser->selection_color(FL_SELECTION_COLOR); wBrowser->labeltype(FL_NORMAL_LABEL); wBrowser->labelfont(0); wBrowser->labelsize(14); wBrowser->labelcolor(FL_FOREGROUND_COLOR); wBrowser->align(Fl_Align(FL_ALIGN_TOP)); wBrowser->when(FL_WHEN_RELEASE); wBrowser->end(); Fl_Group::current()->resizable(wBrowser); } // Table* wBrowser o->resizable(wBrowser); dlgLogbook->end(); } // Fl_Double_Window* dlgLogbook wBrowser->align (FL_ALIGN_TOP | FL_ALIGN_LEFT); wBrowser->addColumn (_("Date"),85); wBrowser->colcallback (0,cb_SortByDate); wBrowser->addColumn (_("Time"),47); wBrowser->addColumn (_("Callsign"),100); wBrowser->colcallback (2,cb_SortByCall); wBrowser->addColumn (_("Name"),110); wBrowser->addColumn (_("Frequency"),120); wBrowser->colcallback (4,cb_SortByFreq); wBrowser->addColumn (_("Mode"),103); wBrowser->colcallback (5,cb_SortByMode); wBrowser->addHiddenColumn ("rn"); wBrowser->allowSort(true); wBrowser->callback(cb_browser); wBrowser->when(FL_WHEN_CHANGED); wBrowser->rowSize (FL_NORMAL_SIZE); wBrowser->headerSize (FL_NORMAL_SIZE); wBrowser->allowResize (1); wBrowser->gridEnabled (0); dlgLogbook->xclass(PACKAGE_TARNAME); { wCabrillo = new Fl_Double_Window(675, 340, _("Cabrillo Setup")); { Fl_Group* o = new Fl_Group(4, 4, 388, 305, _("Select Records to Export")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkCabBrowser = new Fl_Check_Browser(13, 25, 370, 245); } // Fl_Check_Browser* chkCabBrowser { btnCabClearAll = new Fl_Button(69, 277, 110, 24, _("Clear All")); btnCabClearAll->callback((Fl_Callback*)cb_btnCabClearAll); } // Fl_Button* btnCabClearAll { btnCabCheckAll = new Fl_Button(200, 277, 110, 24, _("Check All")); btnCabCheckAll->callback((Fl_Callback*)cb_btnCabCheckAll); } // Fl_Button* btnCabCheckAll o->end(); } // Fl_Group* o { btnCabOK = new Fl_Return_Button(544, 312, 100, 24, _("OK")); btnCabOK->callback((Fl_Callback*)cb_btnCabOK); } // Fl_Return_Button* btnCabOK { btnCabCancel = new Fl_Button(414, 312, 100, 24, _("Cancel")); btnCabCancel->callback((Fl_Callback*)cb_btnCabCancel); } // Fl_Button* btnCabCancel { Fl_Group* o = new Fl_Group(390, 4, 283, 305, _("Select Cabrillo Contest & Fields")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { cboContest = new Fl_ComboBox(486, 41, 180, 20, _("Contest:")); cboContest->box(FL_BORDER_BOX); cboContest->color(FL_BACKGROUND2_COLOR); cboContest->selection_color(FL_BACKGROUND_COLOR); cboContest->labeltype(FL_NORMAL_LABEL); cboContest->labelfont(0); cboContest->labelsize(14); cboContest->labelcolor(FL_FOREGROUND_COLOR); cboContest->callback((Fl_Callback*)cb_cboContest); cboContest->align(Fl_Align(FL_ALIGN_LEFT)); cboContest->when(FL_WHEN_RELEASE); cboContest->end(); } // Fl_ComboBox* cboContest { btnCabCall = new Fl_Check_Button(423, 75, 70, 16, _("Call")); btnCabCall->down_box(FL_DOWN_BOX); btnCabCall->value(1); } // Fl_Check_Button* btnCabCall { btnCabFreq = new Fl_Check_Button(423, 100, 70, 15, _("Freq")); btnCabFreq->down_box(FL_DOWN_BOX); btnCabFreq->value(1); } // Fl_Check_Button* btnCabFreq { btnCabMode = new Fl_Check_Button(423, 124, 70, 15, _("Mode")); btnCabMode->down_box(FL_DOWN_BOX); btnCabMode->value(1); } // Fl_Check_Button* btnCabMode { btnCabQSOdate = new Fl_Check_Button(423, 148, 70, 15, _("QSO Date")); btnCabQSOdate->down_box(FL_DOWN_BOX); btnCabQSOdate->value(1); } // Fl_Check_Button* btnCabQSOdate { btnCabTimeOFF = new Fl_Check_Button(423, 172, 70, 15, _("Time OFF")); btnCabTimeOFF->down_box(FL_DOWN_BOX); btnCabTimeOFF->value(1); } // Fl_Check_Button* btnCabTimeOFF { btnCabRSTsent = new Fl_Check_Button(423, 196, 70, 15, _("RST sent")); btnCabRSTsent->down_box(FL_DOWN_BOX); btnCabRSTsent->value(1); } // Fl_Check_Button* btnCabRSTsent { btnCabRSTrcvd = new Fl_Check_Button(423, 221, 70, 16, _("RST rcvd")); btnCabRSTrcvd->down_box(FL_DOWN_BOX); btnCabRSTrcvd->value(1); } // Fl_Check_Button* btnCabRSTrcvd { btnCabSerialIN = new Fl_Check_Button(533, 100, 70, 15, _("Serial # in")); btnCabSerialIN->down_box(FL_DOWN_BOX); btnCabSerialIN->value(1); } // Fl_Check_Button* btnCabSerialIN { btnCabSerialOUT = new Fl_Check_Button(533, 124, 70, 15, _("Serial # out")); btnCabSerialOUT->down_box(FL_DOWN_BOX); btnCabSerialOUT->value(1); } // Fl_Check_Button* btnCabSerialOUT { btnCabXchgIn = new Fl_Check_Button(533, 148, 70, 15, _("Exchange In")); btnCabXchgIn->down_box(FL_DOWN_BOX); btnCabXchgIn->value(1); } // Fl_Check_Button* btnCabXchgIn { btnCabMyXchg = new Fl_Check_Button(533, 172, 70, 15, _("Exchange Out")); btnCabMyXchg->down_box(FL_DOWN_BOX); btnCabMyXchg->value(1); } // Fl_Check_Button* btnCabMyXchg { btnCabState = new Fl_Check_Button(533, 196, 70, 15, _("State")); btnCabState->down_box(FL_DOWN_BOX); btnCabState->value(1); } // Fl_Check_Button* btnCabState { btnCabCounty = new Fl_Check_Button(533, 221, 70, 15, _("County")); btnCabCounty->down_box(FL_DOWN_BOX); btnCabCounty->value(1); } // Fl_Check_Button* btnCabCounty { btnCabClearAllFields = new Fl_Button(409, 277, 110, 24, _("Clear All")); btnCabClearAllFields->callback((Fl_Callback*)cb_btnCabClearAllFields); } // Fl_Button* btnCabClearAllFields { btnCabCheckAllFields = new Fl_Button(539, 277, 110, 24, _("Check All")); btnCabCheckAllFields->callback((Fl_Callback*)cb_btnCabCheckAllFields); } // Fl_Button* btnCabCheckAllFields o->end(); } // Fl_Group* o wCabrillo->end(); } // Fl_Double_Window* wCabrillo } fldigi-4.2.05/src/logbook/lgbook.fl0000664000175000017500000007375614611711171014030 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0305 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include } {private local } decl {\#include "flmisc.h"} {private local } decl {\#include "logsupport.h"} {private local } decl {\#include "pixmaps.h"} {private local } decl {\#include "flinput2.h"} {public local } decl {// Avoid 'nitems' macro collision between FreeBSD's sys/params.h and fltk's // FL/Fl_Check_Browser.H (http://www.fltk.org/str.php?L2984) \#undef nitems \#include \#define FLTK_nitems nitems \#undef nitems // ^^^ Avoid 'nitems' macro collision extern Fl_Check_Browser *chkExportBrowser;} {public local } Function {create_logbook_dialogs()} {open return_type void } { Fl_Window wExport { label {Export Setup} xywh {494 421 805 440} type Double hide } { Fl_Group {} { label {Select Records to Export} xywh {4 4 388 430} box ENGRAVED_FRAME align 21 } { Fl_Check_Browser chkExportBrowser { xywh {13 25 370 330} } Fl_Button btnClearAll { label {Clear All} callback {btn_export_by_date->value(0); chkExportBrowser->check_none();} xywh {78 362 90 20} } Fl_Button btnCheckAll { label {Check All} callback {btn_export_by_date->value(0); chkExportBrowser->check_all();} xywh {201 362 90 20} } Fl_Input inp_export_start_date { label {Start Date} callback {cb_export_date_select();} tooltip {Start date for export} xywh {20 402 100 22} align 5 code0 {\#include "calendar.h"} code1 {inp_export_start_date->format(2);} class Fl_DateInput } Fl_Input inp_export_stop_date { label {Stop Date} callback {cb_export_date_select();} tooltip {Inclusive stop date for export} xywh {144 402 100 22} align 5 code0 {\#include "calendar.h"} code1 {inp_export_stop_date->format(2);} class Fl_DateInput } Fl_Check_Button btn_export_by_date { label {select by date} callback {cb_export_date_select();} tooltip {Enable to select date range} xywh {269 405 70 15} down_box DOWN_BOX } } Fl_Group {} { label {Select Fields to Export} open xywh {392 4 414 430} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnSelectCall { label Call xywh {402 26 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectName { label Name xywh {402 47 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectFreq { label Freq xywh {402 68 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectBand { label Band xywh {402 90 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectMode { label Mode xywh {402 111 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectQSOdateOn { label {QSO Date On} xywh {402 133 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectQSOdateOff { label {QSO Date Off} xywh {402 154 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectTimeON { label {Time ON} xywh {402 176 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectTimeOFF { label {Time OFF} xywh {402 197 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectTX_pwr { label {TX Power} xywh {402 219 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectRSTsent { label {RST sent} xywh {402 240 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectRSTrcvd { label {RST rcvd} xywh {402 262 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnSelectQth { label Qth xywh {402 283 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectLOC { label LOC xywh {402 305 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectState { label State xywh {402 326 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectAge { label Age xywh {402 348 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectStaCall { label {Station Call} xywh {536 26 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectStaCity { label {Station QTH} xywh {536 47 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectStaGrid { label {Station LOC} xywh {536 68 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectOperator { label Operator xywh {536 90 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectProvince { label Province xywh {536 111 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCountry { label Country xywh {536 133 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectNotes { label Notes xywh {536 154 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectQSLrcvd { label {QSL rcvd date} xywh {536 176 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectQSLsent { label {QSL sent date} xywh {536 197 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelecteQSLrcvd { label {eQSL rcvd date} xywh {536 219 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelecteQSLsent { label {eQSL sent date} xywh {536 240 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectLOTWrcvd { label {LoTW rcvd date} xywh {536 262 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectLOTWsent { label {LoTW sent date} xywh {536 283 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectQSL_VIA { label {QSL-VIA} xywh {536 305 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectSerialIN { label {Serial \# in} xywh {536 326 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectSerialOUT { label {Serial \# out} xywh {536 348 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCheck { label Check xywh {670 26 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectXchgIn { label {Exchange In} xywh {670 47 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectMyXchg { label {Exchange Out} xywh {670 68 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCNTY { label County xywh {670 90 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCONT { label Continent xywh {670 111 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectCQZ { label CQZ xywh {670 133 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectDXCC { label DXCC xywh {670 154 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectIOTA { label IOTA xywh {670 176 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectITUZ { label ITUZ xywh {670 197 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectClass { label {FD class} xywh {670 219 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelectSection { label {FD section} xywh {670 240 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_cwss_serno { label {CW SS SerNo R} tooltip {CW sweepstakes rcvd ser. no.} xywh {670 262 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_cwss_prec { label {CW SS Prec'} tooltip {CW sweepstakes precedence} xywh {670 283 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_cwss_check { label {CW SS Check} xywh {670 305 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_cwss_section { label {CW SS Section} tooltip {CW sweepstakes section} xywh {670 326 70 15} down_box DOWN_BOX } Fl_Check_Button btnSelect_1010 { label {10-10} tooltip {CW sweepstakes section} xywh {670 348 70 15} down_box DOWN_BOX } Fl_Button btnClearAllFields { label {Clear All} callback {btnSelectCall->value(0); btnSelectName->value(0); btnSelectFreq->value(0); btnSelectBand->value(0); btnSelectMode->value(0); btnSelectQSOdateOn->value(0); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(0); btnSelectTimeOFF->value(0); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0);} xywh {412 373 85 20} } Fl_Button btnCheckAllFields { label {Check All} callback {btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectTX_pwr->value(1); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectQth->value(1); btnSelectLOC->value(1); btnSelectState->value(1); btnSelectAge->value(1); btnSelectStaCall->value(1); btnSelectStaGrid->value(1); btnSelectStaCity->value(1); btnSelectOperator->value(1); btnSelectProvince->value(1); btnSelectCountry->value(1); btnSelectNotes->value(1); btnSelectQSLrcvd->value(1); btnSelectQSLsent->value(1); btnSelecteQSLrcvd->value(1); btnSelecteQSLsent->value(1); btnSelectLOTWrcvd->value(1); btnSelectLOTWsent->value(1); btnSelectQSL_VIA->value(1); btnSelectSerialIN->value(1); btnSelectSerialOUT->value(1); btnSelectCheck->value(1); btnSelectXchgIn->value(1); btnSelectMyXchg->value(1); btnSelectCNTY->value(1); btnSelectCONT->value(1); btnSelectCQZ->value(1); btnSelectDXCC->value(1); btnSelectIOTA->value(1); btnSelectITUZ->value(1); btnSelectClass->value(1); btnSelectSection->value(1); btnSelect_cwss_serno->value(1); btnSelect_cwss_prec->value(1); btnSelect_cwss_check->value(1); btnSelect_cwss_section->value(1); btnSelect_1010->value(1);} xywh {507 373 85 20} } Fl_Button btnSetFieldDefaults { label Defaults callback {btnSelectCall->value(1); btnSelectName->value(1); btnSelectFreq->value(1); btnSelectBand->value(1); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(1); btnSelectTimeON->value(1); btnSelectTimeOFF->value(1); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(1); btnSelectRSTrcvd->value(1); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0);} xywh {602 373 85 20} } Fl_Button btnSetLoTWfields { label LoTW callback {btnSelectCall->value(1); btnSelectName->value(0); btnSelectFreq->value(1); btnSelectBand->value(0); btnSelectMode->value(1); btnSelectQSOdateOn->value(1); btnSelectQSOdateOff->value(0); btnSelectTimeON->value(1); btnSelectTimeOFF->value(0); btnSelectTX_pwr->value(0); btnSelectRSTsent->value(0); btnSelectRSTrcvd->value(0); btnSelectQth->value(0); btnSelectLOC->value(0); btnSelectState->value(0); btnSelectAge->value(0); btnSelectStaCall->value(0); btnSelectStaGrid->value(0); btnSelectStaCity->value(0); btnSelectOperator->value(0); btnSelectProvince->value(0); btnSelectCountry->value(0); btnSelectNotes->value(0); btnSelectQSLrcvd->value(0); btnSelectQSLsent->value(0); btnSelecteQSLrcvd->value(0); btnSelecteQSLsent->value(0); btnSelectLOTWrcvd->value(0); btnSelectLOTWsent->value(0); btnSelectQSL_VIA->value(0); btnSelectSerialIN->value(0); btnSelectSerialOUT->value(0); btnSelectCheck->value(0); btnSelectXchgIn->value(0); btnSelectMyXchg->value(0); btnSelectCNTY->value(0); btnSelectCONT->value(0); btnSelectCQZ->value(0); btnSelectDXCC->value(0); btnSelectIOTA->value(0); btnSelectITUZ->value(0); btnSelectClass->value(0); btnSelectSection->value(0); btnSelect_cwss_serno->value(0); btnSelect_cwss_prec->value(0); btnSelect_cwss_check->value(0); btnSelect_1010->value(0);} xywh {697 373 85 20} } Fl_Return_Button btnOK { label OK callback {wExport->hide(); Export_log();} xywh {697 403 85 20} } Fl_Button btnCancel { label Cancel callback {wExport->hide();} xywh {602 403 85 20} } } } Fl_Window dlgLogbook { label Logbook xywh {533 50 590 390} type Double hide resizable code0 {o->resizable(wBrowser);} } { Fl_Input inpDate_log { label {Date On} tooltip {Date QSO started} xywh {4 24 100 24} align 5 code0 {\#include "calendar.h"} code1 {inpDate_log->format(2);} class Fl_DateInput } Fl_Input inpTimeOn_log { label {Time On} tooltip {Time QSO started} xywh {106 24 70 24} align 5 class Fl_Input2 } Fl_Input inpCall_log { label Call tooltip {Call sign worked} xywh {178 24 100 24} align 5 class Fl_Input2 } Fl_Input inpName_log { label Name tooltip {Operator worked} xywh {280 24 185 24} align 5 class Fl_Input2 } Fl_Input inpRstR_log { label In tooltip {Rst received} xywh {468 24 36 24} align 5 class Fl_Input2 } Fl_Input txtNbrRecs_log { label Recs tooltip {\# Records in logbook} xywh {520 24 65 24} align 5 class Fl_Input2 } Fl_Input inpDateOff_log { label {Date Off} tooltip {Date QSO Ended} xywh {4 68 100 24} align 5 code0 {\#include "calendar.h"} code1 {inpDateOff_log->format(2);} class Fl_DateInput } Fl_Input inpTimeOff_log { label {Time Off} tooltip {Time QSO ended} xywh {106 68 70 24} align 5 class Fl_Input2 } Fl_Input inpFreq_log { label {Freq.} tooltip {Frequency in MHz} xywh {178 68 100 24} align 5 class Fl_Input2 } Fl_Input inpMode_log { label Mode tooltip {Mode in use} xywh {280 68 146 24} align 5 class Fl_Input2 } Fl_Input inpTX_pwr_log { label Pwr tooltip {Transmit power used} xywh {429 68 36 24} align 5 class Fl_Input2 } Fl_Input inpLoc_log { label Loc tooltip {Stations grid square} xywh {508 68 76 24} align 5 class Fl_Input2 } Fl_Input inpRstS_log { label Out tooltip {Rst sent} xywh {468 68 36 24} align 5 class Fl_Input2 } Fl_Input inpQth_log { label Qth tooltip {City of station worked} xywh {5 112 280 24} align 5 class Fl_Input2 } Fl_Input inpState_log { label St tooltip {US state of station worked} xywh {288 112 44 24} align 5 class Fl_Input2 } Fl_Input inpVE_Prov_log { label Pr tooltip {Province of station worked} xywh {335 112 44 24} align 5 class Fl_Input2 } Fl_Input inpCountry_log { label Country tooltip {Country of station worked} xywh {382 112 202 24} align 5 class Fl_Input2 } Fl_Group grpTabsSearch {open xywh {0 137 590 125} code0 {o->resizable(Tabs);} } { Fl_Tabs Tabs { xywh {0 140 481 120} } { Fl_Group tab_log_qsl { label QSL open xywh {0 161 481 97} } { Fl_Input inpQSLrcvddate_log { label {QSL-rcvd} tooltip {QSL received on this date} xywh {14 188 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpEQSLrcvddate_log { label {EQSL-rcvd} tooltip {QSL received on this date} xywh {118 188 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpLOTWrcvddate_log { label {LOTW-rcvd} tooltip {QSL received on this date} xywh {222 188 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpQSLsentdate_log { label {QSL-sent} tooltip {QSL sent on this date} xywh {14 234 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpEQSLsentdate_log { label {EQSL-sent} tooltip {QSL sent on this date} xywh {118 234 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpLOTWsentdate_log { label {LOTW-sent} tooltip {QSL sent on this date} xywh {222 234 100 24} align 5 code1 {o->format(2);} class Fl_DateInput } Fl_Input inpQSL_VIA_log { label {QSL-VIA} tooltip {QSL route of contacted station} xywh {325 188 156 70} type Multiline align 5 resizable class Fl_Input2 } } Fl_Group tab_log_other { label Other open xywh {0 161 475 99} hide } { Fl_Input inpCNTY_log { label County tooltip County xywh {21 192 241 24} align 5 class Fl_Input2 } Fl_Input inpIOTA_log { label IOTA tooltip {Islands on the air} xywh {276 192 90 24} align 5 class Fl_Input2 } Fl_Input inpCQZ_log { label CQZ tooltip {CQ zone} xywh {383 192 90 24} align 5 class Fl_Input2 } Fl_Input inpCONT_log { label {Cont'} tooltip Continent xywh {21 236 241 24} align 5 class Fl_Input2 } Fl_Input inpITUZ_log { label ITUZ tooltip {ITU zone} xywh {277 236 90 24} align 5 class Fl_Input2 } Fl_Input inpDXCC_log { label DXCC tooltip {DXCC designator} xywh {383 236 90 24} align 5 class Fl_Input2 } } Fl_Group tab_log_notes { label Notes open xywh {0 161 480 96} hide } { Fl_Input inpNotes_log { tooltip {Interesting notes} xywh {15 171 465 85} type Multiline align 21 class Fl_Input2 } } Fl_Group tab_log_my_station { label {My Station} open xywh {0 161 475 99} hide } { Fl_Input inp_log_sta_call { label {Station Call} tooltip {Interesting notes} xywh {15 192 100 24} align 5 class Fl_Input2 } Fl_Input inp_log_op_call { label {Operator Call} tooltip {Interesting notes} xywh {140 192 100 24} align 5 class Fl_Input2 } Fl_Input inp_log_sta_qth { label {Station QTH} tooltip {Interesting notes} xywh {15 236 334 24} align 5 class Fl_Input2 } Fl_Input inp_log_sta_loc { label {Station Locator} tooltip {Interesting notes} xywh {355 236 120 24} align 5 class Fl_Input2 } } Fl_Group tab_log_contest { label Contest open xywh {0 161 480 99} hide } { Fl_Input inpSerNoOut_log { label {Ser out} tooltip {Contest seral \# sent} xywh {69 179 55 24} class Fl_Input2 } Fl_Input inpMyXchg_log { label {Exch Out} tooltip {Contest exchange sent} xywh {204 179 170 24} class Fl_Input2 } Fl_Input inpSerNoIn_log { label {Ser in} tooltip {Contest serial \# received} xywh {69 207 55 24} class Fl_Input2 } Fl_Input inpXchgIn_log { label {Exch In} tooltip {Contest exchange received} xywh {204 207 170 24} class Fl_Input2 } Fl_Input inpClass_log { label Class tooltip {Field Day class received} xywh {69 236 55 24} class Fl_Input2 } Fl_Input inpSection_log { label {ARRL Sect} tooltip {Field Section received} xywh {204 236 56 24} class Fl_Input2 } Fl_Input inp_age_log { label Age tooltip {Operators age received} xywh {420 179 60 24} class Fl_Input2 } Fl_Input inp_1010_log { label {10-10} tooltip {Ten Ten number received} xywh {420 207 60 24} class Fl_Input2 } Fl_Input inpBand_log { label Band tooltip {Operating band} xywh {420 236 60 24} class Fl_Input2 } Fl_Input inp_check_log { label Check tooltip {Check value received} xywh {314 236 60 24} class Fl_Input2 } } Fl_Group tab_log_cwss { label {CW SS} open tooltip {CW Sweepstakes Contest} xywh {0 161 475 96} hide } { Fl_Input inp_log_cwss_serno { label {Ser NoR} tooltip {Contest seral \# sent} xywh {77 179 55 24} class Fl_Input2 } Fl_Input inp_log_cwss_sec { label Section tooltip {SS section} xywh {77 207 56 24} class Fl_Input2 } Fl_Input inp_log_cwss_prec { label Precedence tooltip {Contest exchange sent} xywh {238 179 77 24} class Fl_Input2 } Fl_Input inp_log_cwss_chk { label Check tooltip {Contest exchange received} xywh {238 207 77 24} class Fl_Input2 } } Fl_Group tab_log_jota { label JOTA open tooltip {Jamboree On The Air} xywh {0 161 475 96} hide } { Fl_Input inp_log_troop_s { label {Troop-S} tooltip {Sent troop number} xywh {115 179 100 24} class Fl_Input2 } Fl_Input inp_log_troop_r { label {Troop-R} tooltip {Received troop number} xywh {292 179 100 24} class Fl_Input2 } Fl_Input inp_log_scout_s { label {Name-S} tooltip {Sent scout name} xywh {115 215 100 24} class Fl_Input2 } Fl_Input inp_log_scout_r { label {Name-R} tooltip {Received scout name} xywh {292 215 100 24} class Fl_Input2 } } } Fl_Group grpCallSearch {open xywh {482 137 105 125} } { Fl_Input inpSearchString { label {Call Search} tooltip {Search for this callsign} xywh {482 160 105 24} align 1 class Fl_Input2 } Fl_Button bSearchPrev { callback cb_search tooltip {Find previous} xywh {500 193 24 22} color 50 selection_color 48 align 16 code0 {bSearchPrev->image(new Fl_Pixmap(left_arrow_icon));} } Fl_Button bSearchNext { callback cb_search tooltip {Find next} xywh {552 193 24 22} color 50 selection_color 48 align 16 code0 {bSearchNext->image(new Fl_Pixmap(right_arrow_icon));} } Fl_Button bRetrieve { label Retrieve callback cb_btnRetrieve tooltip {Retrieve for active modem use} xywh {500 223 75 22} shortcut 0x50066 color 50 selection_color 48 } } } Fl_Group grpFileButtons { xywh {0 262 589 25} code0 {o->resizable(txtLogFile);} } { Fl_Button bNewSave { label New callback cb_btnNewSave tooltip {New record / Save record} xywh {396 263 59 22} shortcut 0x8004e color 50 selection_color 48 } Fl_Button bUpdateCancel { label Update callback cb_btnUpdateCancel tooltip {Update the current record} xywh {459 263 59 22} shortcut 0x80055 color 50 selection_color 48 } Fl_Button bDelete { label Delete callback cb_btnDelete tooltip {Delete the current record} xywh {522 263 59 22} shortcut 0x80044 color 50 selection_color 48 } Fl_Output txtLogFile { label {File:} xywh {35 263 357 22} color 54 } } Fl_Group wBrowser {open xywh {2 288 586 100} box DOWN_FRAME color 7 selection_color 15 resizable code0 {\#include "table.h"} class Table } {} } code {wBrowser->align (FL_ALIGN_TOP | FL_ALIGN_LEFT); wBrowser->addColumn (_("Date"),85); wBrowser->colcallback (0,cb_SortByDate); wBrowser->addColumn (_("Time"),47); wBrowser->addColumn (_("Callsign"),100); wBrowser->colcallback (2,cb_SortByCall); wBrowser->addColumn (_("Name"),110); wBrowser->addColumn (_("Frequency"),120); wBrowser->colcallback (4,cb_SortByFreq); wBrowser->addColumn (_("Mode"),103); wBrowser->colcallback (5,cb_SortByMode); wBrowser->addHiddenColumn ("rn"); wBrowser->allowSort(true); wBrowser->callback(cb_browser); wBrowser->when(FL_WHEN_CHANGED); wBrowser->rowSize (FL_NORMAL_SIZE); wBrowser->headerSize (FL_NORMAL_SIZE); wBrowser->allowResize (1); wBrowser->gridEnabled (0); dlgLogbook->xclass(PACKAGE_TARNAME);} {} Fl_Window wCabrillo { label {Cabrillo Setup} open xywh {495 31 675 340} type Double visible } { Fl_Group {} { label {Select Records to Export} open xywh {4 4 388 305} box ENGRAVED_FRAME align 21 } { Fl_Check_Browser chkCabBrowser { xywh {13 25 370 245} } Fl_Button btnCabClearAll { label {Clear All} callback {chkCabBrowser->check_none();} xywh {69 277 110 24} } Fl_Button btnCabCheckAll { label {Check All} callback {chkCabBrowser->check_all();} xywh {200 277 110 24} } } Fl_Return_Button btnCabOK { label OK callback {wCabrillo->hide(); WriteCabrillo();} xywh {544 312 100 24} } Fl_Button btnCabCancel { label Cancel callback {wCabrillo->hide();} xywh {414 312 100 24} } Fl_Group {} { label {Select Cabrillo Contest & Fields} open xywh {390 4 283 305} box ENGRAVED_FRAME align 21 } { Fl_Group cboContest { label {Contest:} callback {setContestType();} open xywh {486 41 180 20} box BORDER_BOX color 7 align 4 code0 {\#include "combo.h"} code1 {extern void setContestType();} class Fl_ComboBox } {} Fl_Check_Button btnCabCall { label Call xywh {423 75 70 16} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabFreq { label Freq xywh {423 100 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabMode { label Mode xywh {423 124 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabQSOdate { label {QSO Date} xywh {423 148 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabTimeOFF { label {Time OFF} xywh {423 172 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabRSTsent { label {RST sent} xywh {423 196 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabRSTrcvd { label {RST rcvd} xywh {423 221 70 16} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabSerialIN { label {Serial \# in} xywh {533 100 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabSerialOUT { label {Serial \# out} xywh {533 124 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabXchgIn { label {Exchange In} xywh {533 148 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabMyXchg { label {Exchange Out} xywh {533 172 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabState { label State selected xywh {533 196 70 15} down_box DOWN_BOX value 1 } Fl_Check_Button btnCabCounty { label County xywh {533 221 70 15} down_box DOWN_BOX value 1 } Fl_Button btnCabClearAllFields { label {Clear All} callback {btnCabCall->value(0); btnCabFreq->value(0); btnCabMode->value(0); btnCabQSOdate->value(0); btnCabTimeOFF->value(0); btnCabSerialIN->value(0); btnCabSerialOUT->value(0); btnCabXchgIn->value(0); btnCabMyXchg->value(0); btnCabRSTsent->value(0); btnCabRSTrcvd->value(0);} xywh {409 277 110 24} } Fl_Button btnCabCheckAllFields { label {Check All} callback {btnCabCall->value(1); btnCabFreq->value(1); btnCabMode->value(1); btnCabQSOdate->value(1); btnCabTimeOFF->value(1); btnCabSerialIN->value(1); btnCabSerialOUT->value(1); btnCabXchgIn->value(1); btnCabMyXchg->value(1); btnCabRSTsent->value(1); btnCabRSTrcvd->value(1);} xywh {539 277 110 24} } } } } fldigi-4.2.05/src/logbook/table.cxx0000664000175000017500000012430614611711171014027 00000000000000/* Copyright (c) 2004 Markus Niemistö Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include "table.h" //#define DAMAGE_HEADER FL_DAMAGE_USER1 //#define DAMAGE_ROWS FL_DAMAGE_USER2 #define DAMAGE_HEADER FL_DAMAGE_ALL #define DAMAGE_ROWS FL_DAMAGE_ALL /* * nullptr is not available in gcc < 4.6 * Redefine to NULL for CentOS 6 and OSX Darwin */ #ifndef __FreeBSD__ #ifndef nullptr #define nullptr NULL #endif #endif /* * ====================================== * void Table.drawHeader(int x, int y); * ====================================== * * Draws header buttons starting at (x, y). */ void Table::drawHeader(int x, int y) { int w; struct ColumnInfo col; fl_font(tbl_font, tbl_fontsize); /* * Draw all header cells that aren't clipped. */ for (int i = leftCol; i <= rightCol; i++) { col = header[i]; if (col.hidden) continue; // Draw box if (pushed != i) fl_draw_box(FL_THIN_UP_BOX, x, y, w = col.width, headerHeight, FL_GRAY); else fl_draw_box(FL_THIN_DOWN_BOX, x, y, w = col.width, headerHeight, FL_GRAY); fl_color(FL_FOREGROUND_COLOR); // Draw labels if (col.title != NULL) fl_draw(col.title, x + 2, y - 1, w - 2, headerHeight, col.hdr_align); x += w; // Draw "the sort arrow", if any. if (sortColumn == i) { int mod = headerHeight - 10; if (ascent) fl_polygon(x - mod - 6, y + 5, x - mod / 2 - 6, y + mod + 5, x - 6, y + 5); else fl_polygon(x - mod - 6, y + mod + 5, x - mod / 2 - 6, y + 5, x - 6, y + mod + 5); } } } /* * ============================================================= * void Table.drawRow(int row, char *rowData[], int x, int y); * ============================================================= * * Draws all items in the row. Starts drawing from (x, y). */ void Table::drawRow(int row, char *rowData[], int x, int y) { int w; ColumnInfo col; fl_font(tbl_font, tbl_fontsize); // Draw background box. if (row != selected) { Fl_Color bg; if (!withGrid && row % 2 == 0) // different bg for consecutive rows bg = color(); else { bg = fl_color_average(color(), FL_BLACK, .9); if (fl_contrast(bg, FL_BLACK) == FL_WHITE) // widget has very dark text bg bg = fl_color_average(color(), FL_WHITE, .9); } fl_rectf(iX, y, tableWidth - hScroll->value(), rowHeight, bg); fl_color(FL_FOREGROUND_COLOR); } else { if (Fl::focus() == this) { fl_rectf(iX, y, tableWidth - hScroll->value(), rowHeight, selection_color()); fl_color(FL_FOREGROUND_COLOR); // Draw focus fl_line_style(FL_DOT); fl_rect(iX, y, tableWidth - hScroll->value(), rowHeight); fl_line_style(FL_SOLID); } else fl_rectf(iX, y, tableWidth - hScroll->value(), rowHeight, selection_color()); fl_color(fl_contrast(FL_FOREGROUND_COLOR, selection_color())); } // Get color from highlighter. Fl_Color color; if ((highlighter != NULL) && (highlighter(row, rowData, &color))) fl_color(color); const char *str; // Draw the data. for (int i = leftCol; i <= rightCol; i++) { w = (col = header[i]).width; if (col.hidden) continue; if (withGrid == true) { fl_color(FL_FOREGROUND_COLOR); fl_line_style(FL_SOLID); fl_rect(x,y,w,rowHeight); fl_color(FL_FOREGROUND_COLOR); } if ((str = rowData[i]) != NULL) fl_draw(str, x + 1, y - 1, w - 2, rowHeight + 1, col.align); x += w; } } /* * ======================================================= * Table.Table(int x, int y, int w, int h, char *label); * ======================================================= * * This is standard FLTK constructor. See FLTK documentation for * more information. */ Table::Table(int x, int y, int w, int h, char *label) : Fl_Group(x, y, w, h, label) { // Setup variables. align((Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP)); box(FL_THIN_DOWN_FRAME); color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR); tbl_fontsize = 14; headerHeight = tbl_fontsize + 4; rowHeight = tbl_fontsize + 4; scrollbarSize = 16; // Create scrollbars. vScroll = new Fl_Scrollbar(x + w - scrollbarSize, y, scrollbarSize, h + scrollbarSize); vScroll->type(FL_VERTICAL); vScroll->linesize(3 * rowHeight); vScroll->callback(scrollCallback, (void*)this); vScroll->hide(); hScroll = new Fl_Scrollbar(x, y + h - scrollbarSize, w, scrollbarSize); hScroll->type(FL_HORIZONTAL); hScroll->callback(scrollCallback, (void*)this); hScroll->hide(); Fl_Group::end(); // Setup the rest of the variables to reasonable defaults. nCols = nRows = 0; cPos = 0; dragX = 0; resizing = -1; pushed = -1; curRow = NULL; highlighter = NULL; sortColumn = -1; selected = -1; canSort = true; canResize = true; ascent = false; noMoreColumns = false; dimensionsChanged = false; toBeSorted = false; headerEnabled = true; withGrid = false; popupMenu = NULL; menuAlloc = false; Vscroll = var; Hscroll = var; tbl_font = FL_HELVETICA; } /* * ================= * Table.~Table(); * ================= * * Destructor. */ Table::~Table() { delete vScroll; delete hScroll; menuClear(); clear(); } /* * ==================================== * bool Table.headerOn(); * void Table.headerOn(bool enabled); * ==================================== * * These methods get or set the value of variable controlling * whether header buttons are displayed. */ bool Table::headerOn() const { return headerEnabled; } void Table::headerOn(bool enabled) { headerEnabled = enabled; dimensionsChanged = true; redraw(); } /* * ==================================== * bool Table.gridEnabled(); * void Table.gridEnabled(bool enabled); * ==================================== * * These methods get or set the value of variable controlling * whether the table grid is displayed. */ bool Table::gridEnabled() const { return withGrid; } void Table::gridEnabled(bool enabled) { withGrid = enabled; dimensionsChanged = true; redraw(); } /* * ===================================== * bool Table.allowResize(); * void Table.allowResize(bool allow); * ===================================== * * These methods get or set the value of variable controlling * whether user may resize columns by dragging the column border. */ bool Table::allowResize() const { return canResize; } void Table::allowResize(bool allow) { canResize = allow; } /* * =================================== * bool Table.allowSort(); * void Table.allowSort(bool allow); * =================================== * * These methods get or set the value of variable controlling * whether user can determine how data on table is sorted by * clicking on the header buttons. */ bool Table::allowSort() const { return canSort; } void Table::allowSort(bool allow) { canSort = allow; } /* * ================================== * int Table.headerSize(); * void Table.headerSize(int size); * ================================== * * These methods get or set the value of variable controlling * the height of header buttons. */ int Table::headerSize() const { return headerHeight; } void Table::headerSize(int height) { headerHeight = height + 4; dimensionsChanged = true; redraw(); } /* * =============================== * int Table.rowSize(); * void Table.rowSize(int size); * =============================== * * These methods get or set the value of variable controlling * the height of rows. */ int Table::rowSize() const { return rowHeight; } void Table::rowSize(int height) { height += 4; rowHeight = height; vScroll->linesize(3 * height); dimensionsChanged = true; redraw(); } /* * =================================== * int Table.scrollbSize(); * void Table.scrollbSize(int size); * =================================== * * These methods get or set the value of variable controlling * the size (width) of the scrollbars. */ int Table::scrollbSize() const { return scrollbarSize; } void Table::scrollbSize(int size) { scrollbarSize = size; dimensionsChanged = true; redraw(); } /* * ===================================================== * Fl_Align Table.columnAlign(int column); * void Table.columnAlign(int column, Fl_Align align); * ===================================================== * * These methods get or set the value of variable controlling * the alignment of the specified column. */ Fl_Align Table::columnAlign(int column) const { if ((column < 0) && (column >= nCols)) return (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP); /* NOT REACHED */ return header[column].align; } void Table::columnAlign(int column, Fl_Align align) { if ((column < 0) || (column >= nCols)) return; /* NOT REACHED */ header[column].align = (Fl_Align)(align | FL_ALIGN_CLIP); redraw(); } Fl_Align Table::headerAlign(int column) const { if ((column < 0) && (column >= nCols)) return (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP); /* NOT REACHED */ return header[column].hdr_align; } void Table::headerAlign(int column, Fl_Align align) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ header[column].hdr_align = (Fl_Align)(align | FL_ALIGN_CLIP); redraw(); } /* * ===================================================== * int Table.columnWidth(int column); * void Table.columnWidth(int column, int width); * ===================================================== * * These methods get or set the value of variable controlling * the width of the specified column. */ int Table::columnWidth(int column) const { if ((column < 0) && (column >= nCols)) return 0; /* NOT REACHED */ return header[column].width; } void Table::columnWidth(int column, int width) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ header[column].width = width; dimensionsChanged = true; redraw(); } /* * ======================================================== * const char *Table.columnTitle(int column); * void Table.columnTitle(int column, const char *title); * ======================================================== * * These methods get or set the value of variable controlling * the width of the specified column. */ const char *Table::columnTitle(int column) { if ((column < 0) && (column >= nCols)) return NULL; /* NOT REACHED */ return header[column].title; } void Table::columnTitle(int column, const char *title) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ free((void*)header[column].title); header[column].title = strdup(title); damage(DAMAGE_HEADER); } /* * =================================================== * bool Table.columnHidden(int column); * void Table.columnHidden(int column, bool hidden); * =================================================== * * These methods get or set the value of variable controlling * whether column is visible or not. */ bool Table::columnHidden(int column) { if ((column < 0) && (column >= nCols)) return false; /* NOT REACHED */ return header[column].hidden; } void Table::columnHidden(int column, bool hidden) { if ((column < 0) && (column >= nCols)) return; /* NOT REACHED */ header[column].hidden = hidden; dimensionsChanged = true; damage(DAMAGE_HEADER | DAMAGE_ROWS); } /* * =================== * int Table.rows(); * =================== * * Returns the number of rows in table. */ int Table::rows() { return nRows; } /* * ====================== * int Table.columns(); * ====================== * * Returns the number of columns in table. */ int Table::columns() { return nCols; } /* * ================================== * void Table.value(int selection); * ================================== * * Sets the currently selected row. */ void Table::value(int selection) { if ((selection >= 0) && (selection < nRows)) selected = selection; damage(DAMAGE_ROWS); } /* * ==================== * int Table.value(); * ==================== * * Returns the number of the currently selected row. */ int Table::value() { return selected; } /* * ==================================================================== * void Table.addColumn(const char *label, int width, Fl_Align align, * int (*comparator)(const char*, const char*)); * ==================================================================== * * Adds column with label as title, width, align and comparator as * sort function. */ void Table::addColumn(const char *label, int width, Fl_Align align, int (*comparator)(const char*, const char*)) { if (!noMoreColumns) { struct ColumnInfo col; dimensionsChanged = true; col.title = strdup(label); col.width = width; col.hidden = false; col.align = (Fl_Align)(align | FL_ALIGN_CLIP); col.hdr_align = (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_CLIP); col.comparator = comparator; col.callback = NULL; header.push_back(col); nCols++; } } void Table::colcomparator(int col, int (*comparator)(const char*, const char*)) { header[col].comparator = comparator; } void Table::colcallback (int col, void (*callback)()) { header[col].callback = callback; } /* * ================================================ * void Table.addHiddenColumn(const char *label); * ================================================ * * Adds a nonvisible column with label as title. */ void Table::addHiddenColumn(const char *label) { if (!noMoreColumns) { struct ColumnInfo col; col.title = strdup(label); col.width = 0; col.hidden = true; col.align = FL_ALIGN_LEFT; col.comparator = NULL; header.push_back(col); nCols++; } } /* * ================================= * void Table.addCell(char *data); * ================================= * * Adds a cell with data to the table. */ void Table::addCell(char *data) { if (!noMoreColumns) noMoreColumns = true; if ((cPos >= nCols) || (curRow == NULL)) { this->data.push_back(curRow = new char*[nCols]); dimensionsChanged = true; nRows++; cPos = 0; } if (data != NULL) curRow[cPos] = strdup(data); else curRow[cPos] = strdup(""); if (cPos == sortColumn) toBeSorted = true; cPos++; } /* * =================================== * void Table.addRow(int cols, ...); * =================================== * * Adds cols number of cells to table. */ void Table::addRow(int cols, ...) { char *temp; if (!noMoreColumns) noMoreColumns = true; if ((cPos != 0) || (curRow == NULL)) { this->data.push_back(curRow = new char*[nCols]); dimensionsChanged = true; nRows++; cPos = 0; } if (cols > nCols) cols = nCols; va_list ap; va_start(ap, cols); for (int c = 0; c < cols; c++, cPos++) { if (cPos >= nCols) { this->data.push_back(curRow = new char*[nCols]); dimensionsChanged = true; nRows++; cPos = 0; } if ((temp = va_arg(ap, char *)) != NULL) curRow[cPos] = strdup(temp); else curRow[cPos] = strdup(""); } va_end(ap); toBeSorted = true; dimensionsChanged = true; } /* * ================================ * void Table.removeRow(int row); * ================================ * * Removes row referenced by row. */ void Table::removeRow(int row) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows)) { char **rowData = data[row]; if (rowData == curRow) curRow = NULL; for (int i = 0; i < nCols; i++) free(rowData[i]); data.erase(row + data.begin()); nRows--; dimensionsChanged = true; toBeSorted = true; selected = -1; } redraw (); } /* * ======================================= * void Table.clear(bool removeColumns); * ======================================= * * Frees all data in table. If removeColumns is true, frees also header * structures. */ void Table::clear(bool removeColumns) { nRows = 0; curRow = NULL; cPos = 0; // Delete row data. std::vector::iterator end = data.end(); char **row; for (std::vector::iterator i = data.begin(); i < end; ++i) { row = *i; for (int i = 0; i < nCols; i++) free(row[i]); delete [] row; } data.clear(); if (removeColumns) { // Delete header data. std::vector::iterator end = header.end(); for (std::vector::iterator i = header.begin(); i < end; ++i) free((void*)(*i).title); header.clear(); nCols = 0; } selected = -1; dimensionsChanged = true; redraw (); } /* * ============================================ * char *Table.valueAt(int row, int column); * int Table.intValueAt(int row, int column); * ============================================ * * Returns value in cell referenced by row and column. */ char *Table::valueAt(int row, int column) { if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) return data[row][column]; else if ((row == -1) && (selected >= 0) && (column >= 0) && (column < nCols)) return data[selected][column]; else return NULL; } int Table::intValueAt(int row, int column) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) return strtol(data[row][column], NULL, 10); else return 0; } /* * ====================================================== * void Table.valueAt(int row, int column, char *data); * void Table.valueAt(int row, int column, int data); * ====================================================== * * Sets alue in cell referenced by row and column. */ void Table::valueAt(int row, int column, char *data) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) { if (column == sortColumn) toBeSorted = true; if (this->data[row][column] != NULL) free(this->data[row][column]); this->data[row][column] = strdup(data); } } void Table::valueAt(int row, int column, int data) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows) && (column >= 0) && (column < nCols)) { if (column == sortColumn) toBeSorted = true; if (this->data[row][column] != NULL) free(this->data[row][column]); std::string temp = ""; temp += data; strcpy(this->data[row][column] = (char*)malloc(temp.length()), temp.c_str()); } } /* * ===================================== * const char **Table.getRow(int row); * ===================================== * * Returns pointer to the data of the row number row. */ const char **Table::getRow(int row) { if ((row == -1) && (selected >= 0)) row = selected; if ((row >= 0) && (row < nRows)) return (const char**)data[row]; else return NULL; } /* * ============== * Menu methods * ============== * * These work in the same way as in class Fl_Menu_ (methods menu, * copy and clear). These are used for handling the popup menu. */ const Fl_Menu_Item *Table::menu() { return popupMenu; } void Table::menu(const Fl_Menu_Item *m) { menuClear(); popupMenu = m; } void Table::menuCopy(const Fl_Menu_Item *m) { int n = m->size(); Fl_Menu_Item* newMenu = new Fl_Menu_Item[n]; memcpy(newMenu, m, n * sizeof(Fl_Menu_Item)); menu(newMenu); menuAlloc = true; } void Table::menuClear() { if (menuAlloc) delete[] popupMenu; popupMenu = NULL; } /* * ================================================================ * Table.where(int x, int y, int &row, int &column, int &resize); * ================================================================ * * Finds corresponding row and column for x and y coordinates. This function * uses Fl::event_inside() method. * * row = -1 means header and row = -2 means that coordinates don't * correspond any cell. */ void Table::where(int x, int y, int &row, int &column, int &resize) { int temp, temp2; // Inside the header if ((nCols > 0) && headerEnabled && Fl::event_inside(oX, oY, iW, headerHeight)) { row = -1; temp = leftColX + iX - hScroll->value(); // Scan visible columns until found one that matches. for (column = leftCol; column <= rightCol; column++ ) { if (header[column].hidden) continue; temp2 = temp; // Near the left border of the column header if ((x >= temp) && (x <= temp + 3)) { resize = 1; return; /* NOT REACHED */ } // Near the right border of the column header else if ((x >= (temp += header[column].width) - 3) && (x < temp)) { resize = 2; return; /* NOT REACHED */ } // Somewhere else else if ((x >= temp2) && (x < temp)) { resize = 0; return; /* NOT REACHED */ } } } // Header /* * Now the harder one. X and Y lie somewhere in the table. * Find correct row and column. */ else if ((nRows > 0) && Fl::event_inside(iX, iY, iW, iH)) { temp = topRowY; int yMod = iY - vScroll->value(); int leftX = leftColX + iX - hScroll->value(); // Scan rows for (row = topRow; row <= bottomRow; row++) { int temp2 = leftX; for (column = leftCol; column <= rightCol; column++) { if (header[column].hidden) continue; if (Fl::event_inside(temp2, temp + yMod, header[column].width, rowHeight)) return; /* NOT REACHED */ temp2 += header[column].width; } temp += rowHeight; } } row = column = -2; } void Table::FirstRow() { if (nRows == 0 || selected == 0) return; scrollTo (selected = 0); } void Table::PrevPage () { // Does it make sense to move up? if (selected > 0) { // Number of rows on the 'page' int step = iH / rowHeight; // Change selection if (selected >= step) selected -= step; else selected = 0; scrollTo(selected * rowHeight); } } void Table::PrevRow() { int newpos, oldpos; if (nRows == 0) return; selected = (selected > 0) ? selected - 1 : 0; oldpos = vScroll->value(); newpos = rowHeight * selected; if (newpos - oldpos > 0) scrollTo (oldpos); else scrollTo (newpos); } void Table::NextRow() { int newpos, oldpos, lastrow; if (nRows == 0 || selected == (nRows - 1)) return; lastrow = nRows -1; selected = (selected < lastrow) ? selected + 1 : lastrow; oldpos = vScroll->value(); newpos = rowHeight *(selected + 1) - iH; if (newpos - oldpos < 0) scrollTo (oldpos); else scrollTo (newpos); } void Table::NextPage () { if ((selected >= 0) && (selected < (nRows - 1))) { int step = iH / rowHeight; if ((selected += step) >= nRows) selected = nRows - 1; scrollTo(rowHeight * (selected + 1) - iH); } } void Table::LastRow() { if (nRows == 0) return; selected = nRows - 1; scrollTo (rowHeight * (selected + 1) - iH); } void Table::GotoRow(int n) { if (n >= 0 && (n < nRows)) { selected = n; scrollTo(rowHeight * (selected + 1) - iH); } } /* * ============================== * int Table.handle(int event); * ============================== * * FLTK internal. Handles incoming events. */ int Table::handle(int event) { int ret = 0; static int row, prev_row; int column, resize; if (event != FL_KEYDOWN) ret = Fl_Group::handle(event); /* * MAIN SWITCH */ switch (event) { /* * PUSH event */ case FL_PUSH: // Which row/column are we over? where(Fl::event_x(), Fl::event_y(), row, column, resize); switch (row) { // Push on nothing... Not interested case -2: if (selected != -1) { // selected = -1; damage(DAMAGE_ROWS); } break; // Push on header. case -1: if ((canResize) && (Fl::event_button() == 1) && (resize != 0)) { resizing = (resize == 1) ? column - 1 : column; dragX = Fl::event_x(); ret = 1; } else if ((canSort) && (Fl::event_button() == 1)) { pushed = column; damage(DAMAGE_HEADER); ret = 1; } break; // Push on cell. default: bool changed = selected != row; selected = row; // Create new selection int len = 0; char **tableRow = data[selected]; char *buffer = nullptr; for (int col = 0; col < nCols; col++) len += strlen(tableRow[col]) + 1; // Create a tab separated list from data. buffer = (char*)malloc(len); if (buffer != nullptr) { strcpy(buffer, tableRow[0]); for (int col = 1; col < nCols; col++) { strcat(buffer, "\t"); strcat(buffer, tableRow[col]); } Fl::selection(*this, buffer, len); free(buffer); } // Update view. damage(DAMAGE_ROWS); take_focus(); // Show popup menu if ((Fl::event_button() == 3) && (popupMenu != NULL)) { const Fl_Menu_Item *m; m = popupMenu->popup(Fl::event_x(), Fl::event_y()); if (m != NULL) m->do_callback(this, m->user_data()); ret = 1; break; } // Callback if ((Fl::event_clicks() != 0) && !changed && (when() & TABLE_WHEN_DCLICK)) { Fl::event_is_click(0); do_callback(); } else if (changed && (when() & FL_WHEN_CHANGED)) do_callback(); else if (!changed && (when() & FL_WHEN_NOT_CHANGED)) do_callback(); ret = 1; break; } // switch(row) break; /* * DRAG event */ case FL_DRAG: // Resizing... if (resizing > -1 ) { int offset = dragX - Fl::event_x(); int newWidth = header[resizing].width - offset; // Width must be at least 1. if (newWidth < 1) newWidth = 1; // Test if column really is resized. if (header[resizing].width != newWidth) { header[resizing].width = newWidth; dragX = Fl::event_x(); resized(); redraw(); } ret = 1; } else { prev_row = row; where(Fl::event_x(), Fl::event_y(), row, column, resize); if (row < 0 || pushed != -1) { ret = 1; break; } if (prev_row != row) { selected = row; damage(DAMAGE_ROWS); take_focus(); if (when() & FL_WHEN_CHANGED) do_callback(); } } break; /* * RELEASE event */ case FL_RELEASE: // Which row/column are we over? where(Fl::event_x(), Fl::event_y(), row, column, resize); // Restore cursor and end resizing. if (Fl::event_button() == 1) { fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); if ((pushed == column) && canSort) { if (this->header[pushed].callback != NULL) (this->header[pushed].callback)(); if (this->header[pushed].comparator != NULL) { if (sortColumn == pushed) { if (ascent) ascent = false; else sortColumn = -1; } else { ascent = true; sortColumn = pushed; } sort(); } redraw(); } pushed = -1; resizing = -1; ret = 1; } // Callback. if ((row >= 0) && (when() & FL_WHEN_RELEASE)) do_callback(); break; /* * MOVE event */ case FL_MOVE: // Which row/column are we over? where(Fl::event_x(), Fl::event_y(), row, column, resize); // If near header boundary. if ((row == -1) && canResize && resize) fl_cursor(FL_CURSOR_WE, FL_BLACK, FL_WHITE); else fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); ret = 1; break; case FL_ENTER: case FL_LEAVE: if (event == FL_LEAVE) fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); ret = 1; break; case FL_FOCUS: case FL_UNFOCUS: if (Fl::visible_focus()) { damage(DAMAGE_ROWS); ret = 1; } break; /* * KEYDOWN event */ case FL_KEYDOWN: switch(Fl::event_key()) { case FL_Enter: if ((selected > -1) && ((when() & TABLE_WHEN_DCLICK) || (when() & FL_WHEN_ENTER_KEY))) do_callback(); ret = 1; break; case FL_Home: FirstRow(); ret = 1; break; case FL_Up: PrevRow(); ret = 1; break; case FL_Down: NextRow(); ret = 1; break; case FL_End: LastRow(); ret = 1; break; case FL_Page_Up: PrevPage (); ret = 1; break; case FL_Page_Down: NextPage (); ret = 1; break; } break; } return ret; } /* * =============================== * void Table.scrollTo(int pos); * =============================== * * Scrolls table to given position. */ void Table::scrollTo(int pos) { if (vScroll->visible() || nRows > (iH / rowHeight)) { int max = rowHeight * nRows - iH; //printf ("pos %d, max %d\n", pos, max); fflush (stdout); if (pos < 0 || max < 0) pos = 0; if (pos > max) pos = max; vScroll->Fl_Valuator::value(1.0*pos); vScroll->damage (FL_DAMAGE_ALL); vScroll->redraw (); scrolled(); } damage(DAMAGE_ROWS); if (when() & FL_WHEN_CHANGED) do_callback(); } int Table::scrollPos() const { return (int)vScroll->value(); } /* * =========================================== * void Table.sort(int column, bool ascent); * =========================================== * * Sets sortColumn and ascent and sorts table. Does not redraw. */ void Table::sort(int column, bool ascent) { if ((column < -1) || (column >= nCols)) return; sortColumn = column; this->ascent = ascent; sort(); } void Table::aSort(int start, int end, int (*compare)(const char *, const char*)) { int i, j; const char *x; char **temp; x = data[(start + end) / 2][sortColumn]; i = start; j = end; for (;;) { while ((i < end) && (compare(data[i][sortColumn], x) < 0)) i++; while ((j > 0) && (compare(data[j][sortColumn], x) > 0)) j--; while ((i < end) && (i != j) && (compare(data[i][sortColumn], data[j][sortColumn]) == 0)) i++; if (i == j) break; temp = data[i]; data[i] = data[j]; data[j] = temp; } if (start < --i) aSort(start, i, compare); if (end > ++j) aSort(j, end, compare); } void Table::dSort(int start, int end, int (*compare)(const char *, const char*)) { int i, j; const char *x; char **temp; x = data[(start + end) / 2][sortColumn]; i = start; j = end; for (;;) { while ((i < end) && (compare(data[i][sortColumn], x) > 0)) i++; while ((j > 0) && (compare(data[j][sortColumn], x) < 0)) j--; while ((i < end) && (i != j) && (compare(data[i][sortColumn], data[j][sortColumn]) == 0)) i++; if (i == j) break; temp = data[i]; data[i] = data[j]; data[j] = temp; } if (start < --i) dSort(start, i, compare); if (end > ++j) dSort(j, end, compare); } /* * ==================== * void Table.sort(); * ==================== * * Sorts table according sortColumn and ascent. Does not redraw. */ void Table::sort() { if ((sortColumn == -1) || !canSort) return; /* NOT REACHED */ toBeSorted = false; int (*compare)(const char *, const char*); // Get comparator function or set it to the default. if (this->header[sortColumn].comparator == NULL) // compare = strcasecmp; return; else compare = header[sortColumn].comparator; // Sort in descending order. if ((nRows > 1) && ascent) aSort(0, nRows - 1, compare); // Sort in ascending order. else if (nRows > 1) dSort(0, nRows - 1, compare); } /* * ==================================================== * void Table.getSort(int &sortColumn, bool &ascent); * ==================================================== * * Set sortColumn and ascent according to current sort policy. */ void Table::getSort(int &sortColumn, bool &ascent) { sortColumn = this->sortColumn; ascent = this->ascent; } /* * ===================================================== * int compareInt(const char *val1, const char *val2); * ===================================================== * * This function compares values as numbers instead of strings. Solves * problem with string sorting (eg. 1 - 10 - 11 - 12 - 2 - 3 ...). */ int compareInt(const char *val1, const char *val2) { return strtol(val1, NULL, 0) - strtol(val2, NULL, 0); } /* * ============================================================================== * void Table.setHighlighter(bool (*highliter)(int, char **, Fl_Color &color)); * ============================================================================== * * Sets highlighter function to highlighter. Highlighter is used to determine * text color in Table.drawRow(). */ void Table::setHighlighter(bool (*highlighter)(int, char **, Fl_Color *)) { this->highlighter = highlighter; } /* * ==================== * void Table.draw(); * ==================== * * FLTK internal. Called when Table widget needs to be drawn. */ void Table::draw() { int damage; if (dimensionsChanged) { dimensionsChanged = false; resized(); } if (toBeSorted) sort(); damage = Fl_Widget::damage(); // Draw children. if (damage & (FL_DAMAGE_ALL | FL_DAMAGE_CHILD)) { fl_push_clip(oX, oY, oW, oH); Fl_Group::draw(); fl_pop_clip(); } // Draw box. if (damage & FL_DAMAGE_ALL) { // Draw box. draw_box(box(), x(), y(), w(), h(), FL_GRAY); // Draw label. draw_label(); } // Draw header. int xPos = leftColX + iX - hScroll->value(); if (headerEnabled && (damage & (FL_DAMAGE_ALL | DAMAGE_HEADER)) && (nCols > 0)) { fl_push_clip(iX, oY, iW, headerHeight); drawHeader(xPos, oY); fl_pop_clip(); } // Draw all the cells. if ((damage & (FL_DAMAGE_ALL | DAMAGE_ROWS)) && (nRows > 0) && (nCols > 0)) { fl_push_clip(iX, iY, iW, iH); int yMod = iY - vScroll->value(); for (int row = topRow, rowY = topRowY; row <= bottomRow; row++, rowY += rowHeight) drawRow(row, data[row], xPos, rowY + yMod); fl_pop_clip(); } fl_push_clip(oX, oY, oW, oH); if (tableWidth < iW) fl_rectf(iX + tableWidth, oY, iW - tableWidth, oH, FL_GRAY); // Table height smaller than window? Fill remainder with rectangle if (tableHeight < iH) fl_rectf(iX, iY + tableHeight, iW, iH - tableHeight, FL_GRAY); if (vScroll->visible()) { vScroll->damage (FL_DAMAGE_ALL); vScroll->redraw(); } if (hScroll->visible()) { hScroll->damage (FL_DAMAGE_ALL); hScroll->redraw(); } // Both scrollbars? Draw little box in lower right if (vScroll->visible() && hScroll->visible()) fl_rectf(vScroll->x(), hScroll->y(), vScroll->w(), hScroll->h(), FL_GRAY); fl_pop_clip(); } /* * ================================================ * void Table.resize(int x, int y, int w, int h); * ================================================ * * FLTK internal. Called when Table widget is resized. */ void Table::resize(int x, int y, int w2, int h) { // resize the columns proportionally if the width changes if (w2 != w()) { int iw = w() - (vScroll->visible() ? vScroll->w() : 0) - 4; int iw2 = w2 - (vScroll->visible() ? vScroll->w() : 0) - 4; if (iw > 0 && iw2 > 0) { int lastcol = 0; int iw3 = 0; for (int i = 0; i < nCols - 1; i++) { if (!header[i].hidden) { header[i].width = (int)(1.0 * header[i].width * iw2 / iw + 0.5); iw3 += header[i].width; lastcol = i; } } // adjust last visible column if (iw3 < iw2) header[lastcol].width += (iw2 - iw3); if (iw3 > iw2) header[lastcol].width -= (iw3 - iw2); } } Fl_Widget::resize(x, y, w2, h); resized(); damage(FL_DAMAGE_ALL); } /* * ============================== * void Table.calcDimensions(); * ============================== * * Calculates table dimensions. */ void Table::calcDimensions() { // Calculate width and height of the table (in pixels). tableWidth = 0; for (int i = 0; i < nCols; i++) if (!header[i].hidden) tableWidth +=header[i].width; tableHeight = nRows * rowHeight; Fl_Boxtype b; iX = oX = x() + Fl::box_dx(b = box()); iY = oY = y() + Fl::box_dy(b); iW = oW = w() - Fl::box_dw(b); iH = oH = h() - Fl::box_dh(b); // Trim inner size if header enabled. if (headerEnabled) { iY += headerHeight; iH -= headerHeight; } // Hide scrollbars if window is large enough int hideV, hideH; hideV = (tableHeight <= iH), hideH = (tableWidth <= iW); if (!hideH && hideV) hideV = (tableHeight - iH - scrollbarSize) <= 0; if (!hideV && hideH) hideH = (tableWidth - iW + scrollbarSize) <= 0; if (Vscroll == always) { vScroll->show(); iW -= scrollbarSize; } else if (Vscroll == never) { vScroll->hide(); vScroll->Fl_Valuator::value(0); } else if (hideV) { vScroll->hide(); vScroll->Fl_Valuator::value(0); } else { vScroll->show(); iW -= scrollbarSize; } if (Hscroll == always) { hScroll->show(); iH -= scrollbarSize; } else if (Hscroll == never) { hScroll->hide(); hScroll->Fl_Valuator::value(0); } else if (hideH) { hScroll->hide(); hScroll->Fl_Valuator::value(0); } else { hScroll->show(); iH -= scrollbarSize; } } /* * ======================== * void Table.scrolled(); * ======================== * * Calculates visible are after scroll or adding data. */ void Table::scrolled() { int y, row, voff = vScroll->value(); // First visible row row = voff / rowHeight; topRow = (row >= nRows) ? (nRows - 1) : row; topRow = (topRow < 0) ? 0 : topRow; y = topRow * rowHeight; if ((topRow > 0) && (y > voff)) { topRow--; y -= rowHeight; } topRowY = y; // Last visible row row = (voff + iH) / rowHeight; bottomRow = (row >= nRows) ? (nRows - 1) : row; // First visible column int x, col, h = hScroll->value(); for (col = x = 0; col < nCols; col++) { if (header[col].hidden) continue; x += header[col].width; if (x >= h) { x -= header[col].width; break; } } leftCol = (col >= nCols) ? (nCols - 1) : col; leftColX = x; // Last visible column h += iW; for (; col < nCols; col++) { if (header[col].hidden) continue; x += header[col].width; if (x >= h) break; } rightCol = (col >= nCols) ? (nCols - 1) : col; } /* * ======================= * void Table.resized(); * ======================= * * Calculates scrollbar properties after resizing or adding data. */ void Table::resized() { calcDimensions(); // Calculate properties for vertical scrollbar. if (vScroll->visible()) { vScroll->bounds(0, tableHeight - iH); vScroll->resize(oX + oW - scrollbarSize, oY, scrollbarSize, oH - (hScroll->visible() ? scrollbarSize : 0)); vScroll->Fl_Valuator::value(vScroll->clamp(vScroll->value())); vScroll->slider_size(iH > tableHeight ? 1 : (float)iH / tableHeight); } // Calculate properties for horizontal scrollbar. if (hScroll->visible()) { hScroll->bounds(0, tableWidth - iW); hScroll->resize(oX, oY + oH - scrollbarSize, oW - (vScroll->visible() ? scrollbarSize : 0), scrollbarSize); hScroll->Fl_Valuator::value(hScroll->clamp(hScroll->value())); hScroll->slider_size(iW > tableWidth ? 1 : (float)iW / tableWidth); } scrolled(); dimensionsChanged = false; } /* * =========================================================== * void Table.scrollCallback(Fl_Widget *widget, void *data); * =========================================================== * * Internal callback for scrollbars. Scrolls view. */ void Table::scrollCallback(Fl_Widget *widget, void *data) { Table *me = (Table*)data; me->scrolled(); if (widget == me->vScroll) me->damage(DAMAGE_ROWS); else me->damage(DAMAGE_ROWS | DAMAGE_HEADER); } #include "re.h" inline static bool search_row(const std::vector& data, int row, int col, int ncols, fre_t& re, bool allcols) { if (unlikely(allcols)) { for (col = 0; col < ncols; col++) if (re.match(data[row][col])) return true; } else if (re.match(data[row][col])) return true; return false; } /* * ================================================================== * void Table.search(int& row, int& col, bool rev, const char* re); * ================================================================== * * Searches Table data starting at `row', in direction indicated by `rev', * for column data matching regexp `re'. Looks in all row columns if `col' * is equal to nCols, or just the specified column if 0 <= col < nCols. * Returns true if found, in which case the `row' and `col' arguments will * point to the matching data. If false is returned, the contents of * `row' and `col' are undefined. */ bool Table::search(int& row, int& col, bool rev, const char* re) { if (unlikely(col < 0 || col > nCols || row < 0 || row >= nRows)) return false; bool allcols = col == nCols; fre_t sre(re, REG_EXTENDED | REG_ICASE | REG_NOSUB); if (!sre) return false; int r = row; if (rev) { for (; row >= 0; row--) if (search_row(data, row, col, nCols, sre, allcols)) return true; for (row = nRows - 1; row > r; row--) if (search_row(data, row, col, nCols, sre, allcols)) return true; } else { for (; row < nRows; row++) if (search_row(data, row, col, nCols, sre, allcols)) return true; for (row = 0; row < r; row++) if (search_row(data, row, col, nCols, sre, allcols)) return true; } return false; } fldigi-4.2.05/src/logbook/logsupport.cxx0000664000175000017500000020007514611711171015154 00000000000000// ---------------------------------------------------------------------------- // logsupport.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "main.h" #include "trx.h" #include "debug.h" #include "macros.h" #include "status.h" #include "date.h" #include "logger.h" #include "n3fjp_logger.h" #include "adif_io.h" #include "textio.h" #include "logbook.h" #include "logsupport.h" #include "rigsupport.h" #include "fd_logger.h" #include "fl_digi.h" #include "confdialog.h" #include "fileselect.h" #include "configuration.h" #include "main.h" #include "locator.h" #include "icons.h" #include "gettext.h" #include "qrunner.h" #include "flmisc.h" #include "network.h" #include "timeops.h" #include "strutil.h" #include #include #include #include #include #include extern std::vector lotw_recs_sent; cQsoDb qsodb; cAdifIO adifFile; cTextFile txtFile; std::string logbook_filename; sorttype lastsort = SORTDATE; bool callfwd = true; bool modefwd = true; bool freqfwd = true; int editNbr = 0; void restore_sort(); void addBrowserRow(cQsoRec *, int); void adjustBrowser(bool keep_pos = false); // convert to and from "00:00:00" <=> "000000" const char *timeview(const char *s) { static char ds[9]; int len = strlen(s); strcpy(ds, "00:00:00"); if (len < 4) return ds; ds[0] = s[0]; ds[1] = s[1]; ds[3] = s[2]; ds[4] = s[3]; if (len < 6) return ds; ds[6] = s[4]; ds[7] = s[5]; return ds; } const char *timestring(const char *s) { static char ds[7]; int len = strlen(s); if (len <= 4) return s; ds[0] = s[0]; ds[1] = s[1]; ds[2] = s[3]; ds[3] = s[4]; if (len < 8) { ds[4] = ds[5] = '0'; ds[6] = 0; return ds; } ds[4] = s[6]; ds[5] = s[7]; ds[6] = 0; return ds; } const char *timeview4(const char *s) { static char ds[6]; int len = strlen(s); strcpy(ds, "00:00"); if (len < 5) return ds; ds[0] = s[0]; ds[1] = s[1]; ds[3] = s[2]; ds[4] = s[3]; return ds; } const char *time4(const char *s) { static char ds[5]; int len = strlen(s); if (len <= 4) return ds; memset(ds, 0, 5); strncpy(ds, s, 4); return ds; } void Export_CSV() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; std::string title = _("Export to CSV file"); std::string filters = "CSV\t*.csv"; #ifdef __APPLE__ filters.append("\n"); #endif const char* p = FSEL::saveas( title.c_str(), filters.c_str(), "export.csv"); if (!p) return; if (!*p) return; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } std::string sp = p; if (sp.find(".csv") == std::string::npos) sp.append(".csv"); txtFile.writeCSVFile(sp.c_str(), &qsodb); } void Export_TXT() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; std::string title = _("Export to fixed field text file"); std::string filters = "TEXT\t*.txt"; #ifdef __APPLE__ filters.append("\n"); #endif const char* p = FSEL::saveas( title.c_str(), filters.c_str(), "export.txt"); if (!p) return; if (!*p) return; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } std::string sp = p; if (sp.find(".txt") == std::string::npos) sp.append(".txt"); txtFile.writeTXTFile(p, &qsodb); } void Export_ADIF() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; std::string title = _("Export to ADIF file"); std::string filters; std::string defname; filters.assign("ADIF\t*.").append(ADIF_SUFFIX); #ifdef __APPLE__ filters.append("\n"); #endif defname.assign("export.").append(ADIF_SUFFIX); const char* p = FSEL::saveas( title.c_str(), filters.c_str(), defname.c_str()); if (!p) return; if (!*p) return; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } std::string sp = p; std::string temp = "."; temp.append(ADIF_SUFFIX); if (sp.find(temp) == std::string::npos) sp.append(temp); adifFile.writeFile (sp.c_str(), &qsodb); } // refresh_logbook_dialog ONLY called as an Fl::awake process // insures that logbook dialog LOTWSDATE field is updated by // FLTK UI thread. // called by Export_LOTW() and saveRecord() static std::string lotwsdate; void refresh_logbook_dialog(void *) { inpLOTWsentdate_log->value(lotwsdate.c_str()); inpLOTWsentdate_log->redraw(); } void Export_LOTW() { if (chkExportBrowser->nchecked() == 0) return; cQsoRec *rec; if (str_lotw.empty()) str_lotw = "Fldigi LoTW upload file\n3.1.2\n\n"; std::string adifrec; for (int i = 0; i < chkExportBrowser->FLTK_nitems(); i++) { if (chkExportBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); rec->putField(LOTWSDATE, zdate()); qsodb.qsoUpdRec (i, rec); lotw_recs_sent.push_back(i); if (i == editNbr) { lotwsdate = rec->getField(LOTWSDATE); Fl::awake(refresh_logbook_dialog); } adifrec = lotw_rec(*rec); if (adifrec.empty()) { LOG_INFO("%s", "Invalid LOTW record"); } else str_lotw.append(adifrec); } } } Fl_Double_Window *lotw_review_dialog = 0; static Fl_Text_Buffer *buff = 0; static Fl_Text_Editor *disp = 0; static Fl_Button *lotw_close_review = 0; static Fl_Button *lotw_save_review = 0; static Fl_Button *lotw_clear_review = 0; void cb_lotw_close_review(Fl_Button *, void *) { lotw_review_dialog->hide(); delete lotw_review_dialog; lotw_review_dialog = 0; lotw_close_review = 0; buff = 0; disp = 0; } void cb_lotw_save_review(Fl_Button *, void *) { str_lotw = buff->text(); } void cb_lotw_clear_review(Fl_Button *, void *) { buff->text(""); } void cb_review_lotw() { if (str_lotw.empty()) return; if (!lotw_review_dialog) { lotw_review_dialog = new Fl_Double_Window(50,50, 640, 400, _("LoTW Review")); lotw_review_dialog->begin(); buff = new Fl_Text_Buffer(); disp = new Fl_Text_Editor(4, 4, 632, 364); disp->textfont(FL_SCREEN); disp->buffer(buff); // attach text buffer to display widget lotw_close_review = new Fl_Button(576, 372, 60, 24, _("Close")); lotw_close_review->callback((Fl_Callback *)cb_lotw_close_review); lotw_clear_review = new Fl_Button(4, 372, 60, 24, _("Clear")); lotw_clear_review->callback((Fl_Callback *)cb_lotw_clear_review); lotw_save_review = new Fl_Button(lotw_review_dialog->w()/2-30, 372, 60, 24, _("Save")); lotw_save_review->callback((Fl_Callback *)cb_lotw_save_review); lotw_review_dialog->end(); } buff->text(str_lotw.c_str()); lotw_review_dialog->show(); } void cb_send_lotw() { send_to_lotw(NULL); } static savetype export_to = ADIF; void Export_log() { if (export_to == LOTW) Export_LOTW(); else if (export_to == ADIF) Export_ADIF(); else if (export_to == CSV) Export_CSV(); else Export_TXT(); } void saveLogbook(bool force) { if (!force && !qsodb.isdirty()) return; if (!force && progdefaults.NagMe) if (!fl_choice2(_("Save changed Logbook?"), _("No"), _("Yes"), NULL)) return; qsodb.isdirty(0); restore_sort(); if (force) adifFile.writeLog (logbook_filename.c_str(), &qsodb, true); else adifFile.writeLog (logbook_filename.c_str(), &qsodb); } static void dxcc_entity_cache_clear(void); static void dxcc_entity_cache_add(cQsoRec* r); static void dxcc_entity_cache_rm(cQsoRec* r); static void dxcc_entity_cache_add(cQsoDb& db); void cb_mnuNewLogbook(Fl_Menu_* m, void* d){ saveLogbook(true); std::string title = _("Create new logbook file"); std::string filter; filter.assign("ADIF\t*.").append(ADIF_SUFFIX); #ifdef __APPLE__ filter.append("\n"); #endif logbook_filename = LogsDir; logbook_filename.append("newlog.").append(ADIF_SUFFIX); const char* p = FSEL::saveas( title.c_str(), filter.c_str(), logbook_filename.c_str()); if (!p) return; if (!*p) return; std::string temp = p; std::string suffix = "."; suffix.append(ADIF_SUFFIX); if (temp.find(suffix) == std::string::npos) temp.append(suffix); FILE *testopen = fl_fopen(temp.c_str(), "r"); if (testopen) { std::string warn = logbook_filename; int ans = fl_choice2( _("%s exists, overwrite?"), _("No"), _("Yes"), NULL, temp.c_str()); if (!ans) return; fclose(testopen); } progdefaults.logbookfilename = logbook_filename = temp; dlgLogbook->label(fl_filename_name(logbook_filename.c_str())); txtLogFile->value(logbook_filename.c_str()); txtLogFile->redraw(); progdefaults.changed = true; qsodb.deleteRecs(); dxcc_entity_cache_clear(); wBrowser->clear(); clearRecord(); qsodb.isdirty(1); saveLogbook(); } void adif_read_OK() { if (qsodb.nbrRecs() == 0) adifFile.writeFile(logbook_filename.c_str(), &qsodb); dxcc_entity_cache_clear(); dxcc_entity_cache_add(qsodb); qsodb.isdirty(0); restore_sort(); activateButtons(); loadBrowser(); } void cb_mnuOpenLogbook(Fl_Menu_* m, void* d) { std::string title = _("Open logbook file"); std::string filter; filter.assign("ADIF file\t*.{adi,adif}"); #ifdef __APPLE__ filter.append("\n"); #endif std::string deffilename = LogsDir; deffilename.append(fl_filename_name(logbook_filename.c_str())); const char* p = FSEL::select( title.c_str(), filter.c_str(), deffilename.c_str()); if (!p) return; if (!*p) return; saveLogbook(true); qsodb.deleteRecs(); logbook_filename = p; progdefaults.logbookfilename = logbook_filename; progdefaults.changed = true; adifFile.readFile (logbook_filename.c_str(), &qsodb); dlgLogbook->label(fl_filename_name(logbook_filename.c_str())); txtLogFile->value(logbook_filename.c_str()); txtLogFile->redraw(); qsodb.isdirty(0); } void cb_mnuSaveLogbook(Fl_Menu_*m, void* d) { std::string title = _("Save logbook file"); std::string filter; filter.assign("ADIF\t*.").append(ADIF_SUFFIX); #ifdef __APPLE__ filter.append("\n"); #endif std::string deffilename = LogsDir; deffilename.append(fl_filename_name(logbook_filename.c_str())); const char* p = FSEL::saveas( title.c_str(), filter.c_str(), deffilename.c_str()); if (!p) return; if (!*p) return; logbook_filename = p; std::string temp = "."; temp.append(ADIF_SUFFIX); if (logbook_filename.find(temp) == std::string::npos) logbook_filename.append(temp); progdefaults.logbookfilename = logbook_filename; progdefaults.changed = true; dlgLogbook->label(fl_filename_name(logbook_filename.c_str())); txtLogFile->value(logbook_filename.c_str()); txtLogFile->redraw(); // cQsoDb::reverse = false; // qsodb.SortByDate(progdefaults.sort_date_time_off); qsodb.isdirty(0); restore_sort(); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } //====================================================================== // separate thread for performing the database merger // // thread 'merge_thread' is instantiated for a database file merger // either on failure or successful merger the thread signals the main // UI thread to close the merge_thread and release all of it's resources // // merge_thread is not re-entrant. Only a single instance of the thread // is allowed. // // the user will be notified if an attempt is made to start a new merger // while one is already in progress. // //====================================================================== pthread_t* MERGE_thread = 0; pthread_mutex_t MERGE_mutex = PTHREAD_MUTEX_INITIALIZER; static std::string mrg_fname; static std::string disptxt; static bool abort_merger; static int num_merge_recs; static float read_secs; static void merge_announce_1(void *) { static char announce[500]; snprintf(announce, sizeof(announce), "Merging records:\n File: %s\n", mrg_fname.c_str()); ReceiveText->addstr(announce); ReceiveText->redraw(); Fl::flush(); } static void merge_announce_2(void *) { static char announce[500]; snprintf(announce, sizeof(announce), " Read %d records in %4.1f seconds\n Merging ... please wait", num_merge_recs, read_secs ); ReceiveText->addstr(announce); ReceiveText->redraw(); Fl::flush(); } void close_MERGE_thread (void *) { ENSURE_THREAD(FLMAIN_TID); if (!MERGE_thread) return; pthread_mutex_lock(&MERGE_mutex); abort_merger = true; pthread_mutex_unlock(&MERGE_mutex); pthread_join(*MERGE_thread, NULL); delete MERGE_thread; MERGE_thread = 0; abort_merger = false; qsodb.isdirty(1); saveLogbook(true); // force the save independent of user settings loadBrowser(); ReceiveText->addstr(disptxt.c_str()); ReceiveText->redraw(); } std::string adif_record(cQsoRec *rec) { static char recfield[200]; static std::string record; static std::string sFld; record.clear(); sFld.clear(); for (int j = 0; fields[j].type != NUMFIELDS; j++) { if (strcmp(fields[j].name,"MYXCHG") == 0) continue; if (strcmp(fields[j].name,"XCHG1") == 0) continue; sFld = rec->getField(fields[j].type); if (!sFld.empty()) { memset(recfield, 0, 200); snprintf(recfield, sizeof(recfield), "<%s:%lu>", fields[j].name, sFld.length()); record.append(recfield).append(sFld); } } record.append("\n"); return record; } std::string last_adif_record() { if (qsodb.nbrRecs() < 1) return "NONE"; cQsoRec *rec = qsodb.getRec(qsodb.nbrRecs() - 1); return adif_record(rec); } // entire logbook in adif standard format std::string all_adif_records() { cQsoRec *rec; std::string records; records.assign("Fldigi logbook records\n3.1.2\n\n"); for (int i = 0; i < qsodb.nbrRecs(); i++) { rec = qsodb.getRec(i); records.append(adif_record(rec)); } records.append("\n"); return records; } static void *merge_thread(void *args) { SET_THREAD_ID(ADIF_MERGE_TID); static char msg1[200]; sorttype orig_sort = lastsort; int orig_reverse = cQsoDb::reverse; cQsoDb::reverse = false; cQsoDb *db = &qsodb; cQsoDb *mrgdb = new cQsoDb; cQsoDb *merge_dups = new cQsoDb; cQsoDb *orig_dups = new cQsoDb; cQsoDb *copy = new cQsoDb(db); std::string mergedir; std::string mrg_dups_name; std::string orig_dups_name; std::string lg_recs_name; std::string fname; size_t pname; cQsoRec *lastrec = 0; cQsoRec *rec_n; cQsoRec *rec_m; int N; int M; int n = 0; int m = 0; int cmp = 0; int cmp2 = 0; int merged = 0; int merge_duplicates = 0; int orig_duplicates = 0; struct timespec t0, t1, t2; float merger_time = 0; Fl::awake(merge_announce_1); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif LOG_INFO("MERGE: adifFile.do_readfile(%s)", mrg_fname.c_str()); adifFile.do_readfile (mrg_fname.c_str(), mrgdb); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif N = copy->nbrRecs(); M = mrgdb->nbrRecs(); if (M == 0) { disptxt.assign("\n================================================\n"); disptxt.append("Merge file contains no records\n"); disptxt.append("\n================================================"); LOG_INFO("%s", disptxt.c_str()); disptxt.append("\n"); goto exit_merge_thread; } read_secs = t1.tv_sec - t0.tv_sec + (t1.tv_nsec- t0.tv_nsec)/1e9; num_merge_recs = M; Fl::awake(merge_announce_2); disptxt.assign("\n================================================\n"); copy->SortByCall(); mrgdb->SortByCall(); for (int i = 0; i < M; i++) { mrgdb->getRec(i)->checkBand(); mrgdb->getRec(i)->checkDateTimes(); } //writeLog("copy.adi", copy); //writeLog("mrgdb.adi", mrgdb); db->clearDatabase(); for (;;) { pthread_mutex_lock(&MERGE_mutex); if (abort_merger) goto abort; pthread_mutex_unlock(&MERGE_mutex); rec_n = copy->getRec(n); rec_m = mrgdb->getRec(m); if (N == 0) { if (m == M) break; if (lastrec == 0) { db->qsoNewRec(lastrec = rec_m); merged++; } else { cmp = comparebycall(lastrec, rec_m); if (cmp != 0) { db->qsoNewRec(lastrec = rec_m); merged++; } else { merge_dups->qsoNewRec(rec_m); merge_duplicates++; } } m++; continue; } if (n == N) { if (m == M) break; cmp = comparebycall(lastrec, rec_m); if (cmp == 0) { merge_dups->qsoNewRec(rec_m); merge_duplicates++; } else { db->qsoNewRec(lastrec = rec_m); merged++; } m++; continue; } if (m == M) { if (n == N) break; cmp = comparebycall(lastrec, rec_n); if (cmp == 0) { orig_dups->qsoNewRec(rec_n); orig_duplicates++; } else { db->qsoNewRec(lastrec = rec_n); } n++; continue; } if (lastrec == 0) { cmp = comparebycall(rec_n, rec_m); if (cmp < 0) { db->qsoNewRec(lastrec = rec_n); n++; continue; } if (cmp == 0) { db->qsoNewRec(lastrec = rec_n); n++; merge_dups->qsoNewRec(rec_m); m++; merge_duplicates++; continue; } // cmp > 0 db->qsoNewRec(lastrec = rec_m); m++; } else { // lastrec exists cmp = comparebycall(rec_n, rec_m); if (cmp == 0) { merge_dups->qsoNewRec(rec_m); merge_duplicates++; m++; cmp2 = comparebycall(lastrec, rec_n); if (cmp2 == 0) { orig_dups->qsoNewRec(rec_n); orig_duplicates++; } else db->qsoNewRec(lastrec = rec_n); n++; continue; } if (cmp < 0) { cmp2 = comparebycall(lastrec, rec_n); if (cmp2 == 0) { orig_dups->qsoNewRec(rec_n); orig_duplicates++; } else db->qsoNewRec(lastrec = rec_n); n++; continue; } // cmp > 0 cmp2 = comparebycall(lastrec, rec_m); if (cmp2 == 0) { merge_dups->qsoNewRec(rec_m); merge_duplicates++; } else if (cmp2 < 0) { db->qsoNewRec(lastrec = rec_m); merged++; } m++; } } mergedir = logbook_filename; fname = fl_filename_name(mergedir.c_str()); pname = mergedir.find(fname); mergedir.erase(pname); if (db->nbrRecs()) db->SortByCall(); if (merged > 0) { snprintf(msg1, sizeof(msg1), "Merged %d records\n", merged); disptxt.append(msg1); } if (merge_duplicates) { merge_dups->SortByCall(); mrg_dups_name = mergedir; mrg_dups_name.append("merge_file_dups"); #ifdef __WIN32__ mrg_dups_name.append(".adi"); #else mrg_dups_name.append(".adif"); #endif adifFile.writeLog (mrg_dups_name.c_str(), merge_dups, true); snprintf(msg1, sizeof(msg1), "Found %d duplicate records\n", merge_duplicates); disptxt.append(msg1); snprintf(msg1, sizeof(msg1), "Duplicate's saved in %s\n", mrg_dups_name.c_str()); disptxt.append(msg1); } if (orig_duplicates) { orig_dups->SortByCall(); orig_dups_name = mergedir; orig_dups_name.append("original_file_dups"); #ifdef __WIN32__ orig_dups_name.append(".adi"); #else orig_dups_name.append(".adif"); #endif adifFile.writeLog (orig_dups_name.c_str(), orig_dups, true); snprintf(msg1,sizeof(msg1), "Original database had %d duplicates\n", orig_duplicates); disptxt.append(msg1); snprintf(msg1, sizeof(msg1), "Duplicate's saved in %s\n", orig_dups_name.c_str()); disptxt.append(msg1); } #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t2); #else clock_gettime(CLOCK_REALTIME, &t2); #endif merger_time = t2.tv_sec - t0.tv_sec + (t2.tv_nsec- t2.tv_nsec)/1e9; snprintf(msg1, sizeof(msg1), "Merger took %4.1f seconds\n", merger_time); disptxt.append(msg1); disptxt.append("================================================"); LOG_INFO("%s", disptxt.c_str()); disptxt.append("\n"); exit_merge_thread: delete mrgdb; delete orig_dups; delete merge_dups; delete copy; lastsort = orig_sort; cQsoDb::reverse = orig_reverse; Fl::awake(close_MERGE_thread); return NULL; abort: pthread_mutex_unlock(&MERGE_mutex); disptxt.assign("Merger aborted"); delete mrgdb; delete orig_dups; delete merge_dups; delete copy; lastsort = orig_sort; cQsoDb::reverse = orig_reverse; Fl::awake(close_MERGE_thread); return NULL; } static notify_dialog *alert_window = 0; void cb_mnuMergeADIF_log(Fl_Menu_* m, void* d) { ENSURE_THREAD(FLMAIN_TID); if (MERGE_thread) { if (!alert_window) alert_window = new notify_dialog; alert_window->notify(_("Database merger in progress"), 5.0); REQ(show_notifier, alert_window); return; } const char* p = FSEL::select( _("Merge ADIF file"), "ADIF\t*.{adi,adif}", LogsDir.c_str()); fl_digi_main->redraw(); Fl::flush(); if (!p) return; if (!*p) return; mrg_fname = p; abort_merger = false; MERGE_thread = new pthread_t; if (pthread_create(MERGE_thread, NULL, merge_thread, NULL) != 0) { LOG_PERROR("pthread_create"); return; } MilliSleep(10); } //====================================================================== static std::string lotw_download_name = ""; static cQsoDb *lotw_db = 0; extern Fl_Button *btn_view_unmatched; void verify_lotw(void *) { lotw_db = new cQsoDb; LOG_INFO("VERIFY_LOTW: adifFile.do_readfile(%s", lotw_download_name.c_str()); adifFile.do_readfile (lotw_download_name.c_str(), lotw_db); std::stringstream ss_note; if (lotw_db->nbrRecs() == 0) { LOG_INFO("%s", _("No records in lotw download file")); } else { std::string report_fname = LoTWDir; report_fname.append("unverified.txt"); std::ofstream report_file(report_fname.c_str()); int matchrec; cQsoRec *qrec, *lrec; int nverified = 0; int unverified = 0; std::string date; std::string qdate; for (int i = 0; i < lotw_db->nbrRecs(); i++) { lrec = lotw_db->getRec(i); date = lrec->getField(QSLRDATE); matchrec = qsodb.matched( lrec ); if (matchrec != -1) { qrec = qsodb.getRec(matchrec); qdate = qrec->getField(LOTWRDATE); if (date != qdate) { qrec->putField(STATE, lrec->getField(STATE)); qrec->putField(GRIDSQUARE, lrec->getField(GRIDSQUARE)); qrec->putField(CQZ, lrec->getField(CQZ)); qrec->putField(COUNTRY, lrec->getField(COUNTRY)); qrec->putField(CNTY, lrec->getField(CNTY)); qrec->putField(DXCC, lrec->getField(DXCC)); qrec->putField(DXCC, lrec->getField(DXCC)); qrec->putField(LOTWRDATE, lrec->getField(QSLRDATE)); } nverified++; } else { unverified++; report_file << lrec->getField(CALL) << ", " << lrec->getField(QSO_DATE) << ", " << lrec->getField(TIME_ON) << ", " << lrec->getField(FREQ) << ", " << lrec->getField(BAND) << ", " << lrec->getField(ADIF_MODE) << "\n"; } } report_file.close(); if (!unverified) remove(report_fname.c_str()); ss_note << "LoTW download contains " << lotw_db->nbrRecs() << " records\n\n" << nverified << " verified\n"; if (unverified) { ss_note << unverified << " unverified\n\n" << "Check file " << report_fname; btn_view_unmatched->activate(); if (nverified) qsodb.isdirty(1); LOG_INFO("%d records verified", nverified); LOG_INFO("%d records unverified", unverified); } if (!alert_window) alert_window = new notify_dialog; alert_window->notify(ss_note.str().c_str(), 15.0); REQ(show_notifier, alert_window); } delete lotw_db; } static Fl_Window *unmatched_viewer = (Fl_Window *)0; static Fl_Text_Display *viewer = (Fl_Text_Display *)0; static Fl_Text_Buffer *buffer = (Fl_Text_Buffer *)0; static Fl_Button *close_viewer = (Fl_Button *)0; void cb_close_viewer(Fl_Button *, void *) { if (unmatched_viewer) { unmatched_viewer->hide(); delete unmatched_viewer; unmatched_viewer = 0; } } void cb_btn_view_unmatched(Fl_Button *, void *) { btn_view_unmatched->deactivate(); if (!unmatched_viewer) { unmatched_viewer = new Fl_Window(100,100, 400, 500, _("Unmatched LoTW Records")); viewer = new Fl_Text_Display(5, 5, 390, 470, ""); buffer = new Fl_Text_Buffer(8192); viewer->buffer(buffer); viewer->textfont(progdefaults.LOGBOOKtextfont); viewer->textsize(progdefaults.LOGBOOKtextsize); close_viewer = new Fl_Button(320, 477, 75, 20, _("Close")); close_viewer->callback((Fl_Callback *)cb_close_viewer); unmatched_viewer->end(); unmatched_viewer->resizable(viewer); } std::string report_fname = LoTWDir; report_fname.append("unverified.txt"); std::ifstream report_file(report_fname.c_str()); if (report_file) { char linebuff[1025]; viewer->buffer()->text(""); while (!report_file.eof()) { report_file.getline(linebuff, 1024); strcat(linebuff, "\n"); viewer->insert(linebuff); } report_file.close(); unmatched_viewer->show(); } } void cb_btn_verify_lotw(Fl_Button *, void *) { std::string deffname = LoTWDir; deffname.append("lotwreport.adi"); std::ifstream f(deffname.c_str()); if (!f) { std::string alert = _("\ Could not find LoTW report file.\n\n\ Download from ARRL's LoTW page after logging in at:\n\n\ https://lotw.arrl.org/lotwuser/default\n\n\ Store the report file to the fldigi LOTW folder,\n\n\ naming the file 'lotwreport.adi'"); if (!alert_window) alert_window = new notify_dialog; alert_window->notify(alert.c_str(), 20); REQ(show_notifier, alert_window); return; } f.close(); lotw_download_name = deffname; Fl::awake(verify_lotw); } void cb_export_date_select() { if (qsodb.nbrRecs() == 0) return; int start = atoi(inp_export_start_date->value()); int stop = atoi(inp_export_stop_date->value()); chkExportBrowser->check_none(); if (!start || !stop) return; int chkdate; if (!btn_export_by_date->value()) return; cQsoRec *rec; for (int i = 0; i < qsodb.nbrRecs(); i++) { rec = qsodb.getRec (i); chkdate = atoi(rec->getField(progdefaults.sort_date_time_off ? QSO_DATE_OFF : QSO_DATE)); if (chkdate >= start && chkdate <= stop) chkExportBrowser->checked(i+1, 1); } chkExportBrowser->redraw(); } inline const char *szfreq(const char *freq) { static char szf[11]; float f = atof(freq); snprintf(szf, sizeof(szf), "%10.6f", f); return szf; } void cb_Export_log() { if (qsodb.nbrRecs() == 0) return; cQsoRec *rec; char line[80]; chkExportBrowser->clear(); #ifdef __APPLE__ chkExportBrowser->textfont(FL_SCREEN_BOLD); chkExportBrowser->textsize(12); #else chkExportBrowser->textfont(FL_COURIER); chkExportBrowser->textsize(12); #endif for( int i = 0; i < qsodb.nbrRecs(); i++ ) { rec = qsodb.getRec (i); snprintf(line,sizeof(line),"%8s %4s %-10s %-10s %-s %-s", rec->getField(QSO_DATE), rec->getField((export_to == LOTW ? TIME_ON : TIME_OFF) ), rec->getField(CALL), szfreq(rec->getField(FREQ)), adif2export(rec->getField(ADIF_MODE)).c_str(), adif2submode(rec->getField(ADIF_MODE)).c_str() ); chkExportBrowser->add(line); } cb_export_date_select(); wExport->show(); } void cb_mnuExportADIF_log(Fl_Menu_* m, void* d) { export_to = ADIF; cb_Export_log(); } void cb_mnuExportCSV_log(Fl_Menu_* m, void* d) { export_to = CSV; cb_Export_log(); } void cb_btnExportLoTW() { export_to = LOTW; cb_Export_log(); } void cb_mnuExportTEXT_log(Fl_Menu_* m, void *d) { export_to = TEXT; cb_Export_log(); } void cb_mnuShowLogbook(Fl_Menu_* m, void* d) { dlgLogbook->resize( progStatus.logbook_x, progStatus.logbook_y, progStatus.logbook_w, progStatus.logbook_h); dlgLogbook->show(); } enum State {VIEWREC, NEWREC}; static State logState = VIEWREC; void activateButtons() { if (logState == NEWREC) { bNewSave->label(_("Save")); bUpdateCancel->label(_("Cancel")); bUpdateCancel->activate(); bDelete->deactivate (); bSearchNext->deactivate (); bSearchPrev->deactivate (); inpDate_log->take_focus(); return; } bNewSave->label(_("New")); bUpdateCancel->label(_("Update")); if (qsodb.nbrRecs() > 0) { bDelete->activate(); bUpdateCancel->activate(); bSearchNext->activate (); bSearchPrev->activate (); wBrowser->take_focus(); } else { bDelete->deactivate(); bUpdateCancel->deactivate(); bSearchNext->deactivate(); bSearchPrev->deactivate(); } } void cb_btnNewSave(Fl_Button* b, void* d) { if (logState == VIEWREC) { logState = NEWREC; clearRecord(); activateButtons(); } else { saveRecord(); qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); logState = VIEWREC; activateButtons(); } } void cb_btnUpdateCancel(Fl_Button* b, void* d) { if (logState == NEWREC) { logState = VIEWREC; activateButtons (); } else { updateRecord(); wBrowser->take_focus(); } } void cb_btnDelete(Fl_Button* b, void* d) { deleteRecord(); wBrowser->take_focus(); } void restore_sort() { switch (lastsort) { case SORTCALL : cQsoDb::reverse = callfwd; qsodb.SortByCall(); break; case SORTDATE : cQsoDb::reverse = progStatus.logbook_reverse; qsodb.SortByDate(progdefaults.sort_date_time_off); break; case SORTFREQ : cQsoDb::reverse = freqfwd; qsodb.SortByFreq(); break; case SORTMODE : cQsoDb::reverse = modefwd; qsodb.SortByMode(); break; default: break; } } void cb_SortByCall (void) { if (lastsort == SORTCALL) callfwd = !callfwd; else { callfwd = false; lastsort = SORTCALL; } cQsoDb::reverse = callfwd; qsodb.SortByCall(); loadBrowser(); } void cb_SortByDate (void) { if (lastsort == SORTDATE) progStatus.logbook_reverse = !progStatus.logbook_reverse; else { lastsort = SORTDATE; } cQsoDb::reverse = progStatus.logbook_reverse; qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); } void reload_browser() { qsodb.SortByDate(progdefaults.sort_date_time_off); loadBrowser(); } void cb_SortByMode (void) { if (lastsort == SORTMODE) modefwd = !modefwd; else { modefwd = false; lastsort = SORTMODE; } cQsoDb::reverse = modefwd; qsodb.SortByMode(); loadBrowser(); } void cb_SortByFreq (void) { if (lastsort == SORTFREQ) freqfwd = !freqfwd; else { freqfwd = false; lastsort = SORTFREQ; } cQsoDb::reverse = freqfwd; qsodb.SortByFreq(); loadBrowser(); } void show_dup(void *dup) { int cdup = 0; if (dup == (void *)1) cdup = 1; if (dup == (void *)2) cdup = 2; Fl_Color call_clr = progdefaults.LOGGINGcolor; Fl_Color dup_clr = fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); Fl_Color pdup_clr = fl_rgb_color( progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B); inpCall1->color(cdup == 1 ? dup_clr : cdup == 2 ? pdup_clr : call_clr); inpCall2->color(cdup == 1 ? dup_clr : cdup == 2 ? pdup_clr : call_clr); inpCall3->color(cdup == 1 ? dup_clr : cdup == 2 ? pdup_clr : call_clr); inpCall4->color(cdup == 1 ? dup_clr : cdup == 2 ? pdup_clr : call_clr); inpCall1->redraw(); inpCall2->redraw(); inpCall3->redraw(); inpCall4->redraw(); } void DupCheck() { size_t dup = 0; if (n3fjp_connected) { show_dup(0); n3fjp_dupcheck(); return; } if ( FD_logged_on && strlen(inpCall->value()) > 2) dup = FD_dupcheck(); else if ( progdefaults.xml_logbook) dup = xml_check_dup(); else { // check for call only for possible dup returns 2 if possible dup = qsodb.duplicate(inpCall->value()); if (dup && qsodb.duplicate( inpCall->value(), zdate(), ztime(), progdefaults.timespan, progdefaults.duptimespan, inpFreq->value(), progdefaults.dupband, inpState->value(), progdefaults.dupstate, mode_info[active_modem->get_mode()].adif_name, progdefaults.dupmode, inpXchgIn->value(), progdefaults.dupxchg1 ) ) dup = 1; } show_dup((void*)dup); } cQsoRec* SearchLog(const char *callsign) { if (progdefaults.xml_logbook) return search_fllog(callsign); size_t len = strlen(callsign); char* re = new char[len + 3]; snprintf(re, len + 3, "^%s$", callsign); int row = 0, col = 2; return wBrowser->search(row, col, !cQsoDb::reverse, re) ? qsodb.getRec(row) : 0; } void SearchLastQSO(const char *callsign) { if (n3fjp_connected) { n3fjp_get_record(callsign); return; } size_t len = strlen(callsign); if (len < 3) return; if (progdefaults.xml_logbook) { if(xml_get_record(callsign)) return; } Fl::focus(inpCall); char* re = new char[len + 3]; snprintf(re, len + 3, "^%s$", callsign); int row = 0, col = 2; if (wBrowser->search(row, col, !cQsoDb::reverse, re)) { wBrowser->GotoRow(row); inpName->value(inpName_log->value()); inpQTH->value(inpQth_log->value()); inpLoc1->value(inpLoc_log->value()); inpLoc1->position (0); inpState->value(inpState_log->value()); inpState->position (0); inpVEprov->value(inpVE_Prov_log->value ()); inpVEprov->position (0); inpCounty->value(inpCNTY_log->value ()); inpCounty->position (0); cboCountry->value(inpCountry_log->value ()); inpSearchString->value(callsign); inpNotes->value(inpNotes_log->value ()); if (inpLoc->value()[0]) { double lon1, lat1, lon2, lat2; double azimuth, distance; char szAZ[4]; if ( QRB::locator2longlat(&lon1, &lat1, progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::locator2longlat(&lon2, &lat2, inpLoc->value()) == QRB::QRB_OK && QRB::qrb(lon1, lat1, lon2, lat2, &distance, &azimuth) == QRB::QRB_OK ) { snprintf(szAZ,sizeof(szAZ),"%0.f", azimuth); inpAZ->value(szAZ); inpAZ->position (0); } else inpAZ->value(""); } else inpAZ->value(""); } else { clear_log_fields(); } delete [] re; } void cb_search(Fl_Widget* w, void*) { const char* str = inpSearchString->value(); if (!*str) return; bool rev = w == bSearchPrev; int col = 2, row = wBrowser->value() + (rev ? -1 : 1); row = WCLAMP(row, 0, wBrowser->rows() - 1); if (wBrowser->search(row, col, rev, str)) wBrowser->GotoRow(row); wBrowser->take_focus(); } int log_search_handler(int) { if (!(Fl::event_state() & FL_CTRL)) return 0; switch (Fl::event_key()) { case 's': bSearchNext->do_callback(); break; case 'r': bSearchPrev->do_callback(); break; default: return 0; } return 1; } void cb_btnRetrieve(Fl_Button* b, void* d) { double drf = atof(inpFreq_log->value()); if (!drf) return; unsigned long long rf1, rf; int audio; rf1 = drf * 1e6; rf = rf1 / 10000ULL; // Round down rf *= 10000ULL; // to nearest 10 kHz audio = rf1 - rf; // try to keep within normal xcvr bw, 500 - 3000 Hz while (audio > 3000) { audio -= 3000; rf += 3000; } if (audio < 500) { audio += 500; rf -= 500; } qsy(rf, audio); std::string mode_name = inpMode_log->value(); trx_mode m; for (m = 0; m < NUM_MODES; m++) if (mode_name == mode_info[m].adif_name) break; // do we have a valid modem? if (m < NUM_MODES && active_modem->get_mode() != mode_info[m].mode) init_modem(mode_info[m].mode); const cQsoRec *qsoPtr = qsodb.getRec(editNbr); inpCall->value(qsoPtr->getField(CALL)); inpName->value (qsoPtr->getField(NAME)); sDate_on = sDate_off = zdate(); sTime_on = sTime_off = ztime(); inpTimeOn->value(inpTimeOff->value()); inpTimeOn1->value(inpTimeOff->value()); inpTimeOn2->value(inpTimeOff->value()); inpTimeOn3->value(inpTimeOff->value()); inpTimeOn4->value(inpTimeOff->value()); inpTimeOn5->value(inpTimeOff->value()); inpState->value (qsoPtr->getField(STATE)); inpState->position (0); inpCounty->value (qsoPtr->getField(CNTY)); inpCounty->position (0); cboCountry->value (qsoPtr->getField(COUNTRY)); inpXchgIn->value(qsoPtr->getField(XCHG1)); inpQTH->value (qsoPtr->getField(QTH)); inpLoc1->value (qsoPtr->getField(GRIDSQUARE)); inpLoc1->position (0); inpNotes->value (qsoPtr->getField(NOTES)); wBrowser->take_focus(); if (n3fjp_connected) n3fjp_get_record(inpCall->value()); } void clearRecord() { Date tdy; inpCall_log->value (""); inpName_log->value (""); inpDate_log->value (tdy.szDate(2)); inpDateOff_log->value (tdy.szDate(2)); inpTimeOn_log->value (""); inpTimeOff_log->value (""); inpRstR_log->value (""); inpRstS_log->value (""); inpFreq_log->value (""); inpBand_log->value (""); inpMode_log->value (""); inpQth_log->value (""); inpState_log->value (""); inpVE_Prov_log->value (""); inpCountry_log->value (""); inpLoc_log->value (""); inpQSLrcvddate_log->value (""); inpQSLsentdate_log->value (""); inpEQSLrcvddate_log->value (""); inpEQSLsentdate_log->value (""); inpLOTWrcvddate_log->value (""); inpLOTWsentdate_log->value (""); inpSerNoOut_log->value (""); inpSerNoIn_log->value (""); inpXchgIn_log->value(""); inpMyXchg_log->value(progdefaults.myXchg.c_str()); inpNotes_log->value (""); inpIOTA_log->value(""); inpDXCC_log->value(""); inpQSL_VIA_log->value(""); inpCONT_log->value(""); inpCNTY_log->value(""); inpCQZ_log->value(""); inpITUZ_log->value(""); inpTX_pwr_log->value(""); inpSearchString->value (""); inp_log_sta_call->value(""); inp_log_op_call->value(""); inp_log_sta_qth->value(""); inp_log_sta_loc->value(""); inp_log_cwss_serno->value(""); inp_log_cwss_prec->value(""); inp_log_cwss_chk->value(""); inp_log_cwss_sec->value(""); } void saveRecord() { cQsoRec rec; rec.putField(CALL, inpCall_log->value()); rec.putField(NAME, inpName_log->value()); rec.putField(QSO_DATE, inpDate_log->value()); rec.putField(QSO_DATE_OFF, inpDateOff_log->value()); std::string tm = timestring(inpTimeOn_log->value()); rec.putField(TIME_ON, tm.c_str()); inpTimeOn_log->value(timeview(tm.c_str())); tm = timestring(inpTimeOff_log->value()); rec.putField(TIME_OFF, tm.c_str()); inpTimeOff_log->value(timeview(tm.c_str())); rec.putField(FREQ, inpFreq_log->value()); rec.putField(BAND, inpBand_log->value()); rec.putField(ADIF_MODE, inpMode_log->value()); rec.putField(QTH, inpQth_log->value()); rec.putField(STATE, inpState_log->value()); rec.putField(VE_PROV, inpVE_Prov_log->value()); rec.putField(COUNTRY, inpCountry_log->value()); rec.putField(GRIDSQUARE, inpLoc_log->value()); rec.putField(NOTES, inpNotes_log->value()); rec.putField(QSLRDATE, inpQSLrcvddate_log->value()); rec.putField(QSLSDATE, inpQSLsentdate_log->value()); rec.putField(EQSLRDATE, inpEQSLrcvddate_log->value()); rec.putField(EQSLSDATE, inpEQSLsentdate_log->value()); rec.putField(LOTWRDATE, inpLOTWrcvddate_log->value()); if (progdefaults.submit_lotw) { lotwsdate = zdate(); rec.putField(LOTWSDATE, lotwsdate.c_str()); Fl::awake(refresh_logbook_dialog); } else rec.putField(LOTWSDATE, inpLOTWsentdate_log->value()); rec.putField(RST_RCVD, inpRstR_log->value ()); rec.putField(RST_SENT, inpRstS_log->value ()); rec.putField(SRX, inpSerNoIn_log->value()); rec.putField(STX, inpSerNoOut_log->value()); if (inpSPCnum->value()[0]) { inpXchgIn_log->value(inpSPCnum->value()); rec.putField(XCHG1, inpSPCnum->value()); } else if (inpSQSO_category->value()[0]) { inpXchgIn_log->value(inpSQSO_category->value()); rec.putField(XCHG1, inpSQSO_category->value()); } else rec.putField(XCHG1, inpXchgIn_log->value()); rec.putField(CLASS, inpClass_log->value()); rec.putField(ARRL_SECT, inpSection_log->value()); if (!qso_exchange.empty()) { rec.putField(MYXCHG, qso_exchange.c_str()); qso_exchange.clear(); qso_time.clear(); } else if (!qso_time.empty()) { std::string myexch = inpMyXchg_log->value(); myexch.append(" ").append(qso_time); rec.putField(MYXCHG, myexch.c_str()); qso_time.clear(); } else { rec.putField(MYXCHG, inpMyXchg_log->value()); } rec.putField(CNTY, inpCNTY_log->value()); rec.putField(IOTA, inpIOTA_log->value()); rec.putField(DXCC, inpDXCC_log->value()); rec.putField(DXCC, inpQSL_VIA_log->value()); rec.putField(CONT, inpCONT_log->value()); rec.putField(CQZ, inpCQZ_log->value()); rec.putField(ITUZ, inpITUZ_log->value()); rec.putField(TX_PWR, log_power()); rec.putField(STA_CALL, inp_log_sta_call->value()); rec.putField(OP_CALL, inp_log_op_call->value()); rec.putField(MY_CITY, inp_log_sta_qth->value()); rec.putField(MY_STATE, inp_QP_state_short->value()); rec.putField(MY_GRID, inp_log_sta_loc->value()); rec.putField(SS_SERNO, inp_log_cwss_serno->value()); rec.putField(SS_PREC, inp_log_cwss_prec->value()); rec.putField(SS_CHK, inp_log_cwss_chk->value()); rec.putField(SS_SEC, inp_log_cwss_sec->value()); rec.putField(AGE, inp_age_log->value()); rec.putField(TEN_TEN, inp_1010_log->value()); rec.putField(CHECK, inp_check_log->value()); rec.putField(TROOPS, inp_log_troop_s->value()); rec.putField(TROOPR, inp_log_troop_r->value()); rec.putField(SCOUTS, inp_log_scout_s->value()); rec.putField(SCOUTR, inp_log_scout_r->value()); qsodb.qsoNewRec (&rec); lotw_recs_sent.push_back(qsodb.nbrRecs() - 1); dxcc_entity_cache_add(&rec); submit_record(rec); qsodb.isdirty(0); reload_browser(); if (qsodb.nbrRecs() == 1) adifFile.writeLog (logbook_filename.c_str(), &qsodb); else adifFile.writeAdifRec(&rec, logbook_filename.c_str()); } void updateRecord() { cQsoRec rec; if (qsodb.nbrRecs() == 0) return; rec.putField(CALL, inpCall_log->value()); rec.putField(NAME, inpName_log->value()); rec.putField(QSO_DATE, inpDate_log->value()); rec.putField(QSO_DATE_OFF, inpDateOff_log->value()); std::string tm = timestring(inpTimeOn_log->value()); rec.putField(TIME_ON, tm.c_str()); inpTimeOn_log->value(timeview(tm.c_str())); tm = timestring(inpTimeOff_log->value()); rec.putField(TIME_OFF, tm.c_str()); inpTimeOff_log->value(timeview(tm.c_str())); rec.putField(FREQ, inpFreq_log->value()); rec.putField(BAND, inpBand_log->value()); rec.putField(ADIF_MODE, inpMode_log->value()); rec.putField(QTH, inpQth_log->value()); rec.putField(STATE, inpState_log->value()); rec.putField(VE_PROV, inpVE_Prov_log->value()); rec.putField(COUNTRY, inpCountry_log->value()); rec.putField(GRIDSQUARE, inpLoc_log->value()); rec.putField(NOTES, inpNotes_log->value()); rec.putField(QSLRDATE, inpQSLrcvddate_log->value()); rec.putField(QSLSDATE, inpQSLsentdate_log->value()); rec.putField(EQSLRDATE, inpEQSLrcvddate_log->value()); rec.putField(EQSLSDATE, inpEQSLsentdate_log->value()); rec.putField(LOTWRDATE, inpLOTWrcvddate_log->value()); rec.putField(LOTWSDATE, inpLOTWsentdate_log->value()); rec.putField(RST_RCVD, inpRstR_log->value ()); rec.putField(RST_SENT, inpRstS_log->value ()); rec.putField(SRX, inpSerNoIn_log->value()); rec.putField(STX, inpSerNoOut_log->value()); rec.putField(XCHG1, inpXchgIn_log->value()); rec.putField(MYXCHG, inpMyXchg_log->value()); rec.putField(CLASS, inpClass_log->value()); rec.putField(ARRL_SECT, inpSection_log->value()); rec.putField(CNTY, inpCNTY_log->value()); rec.putField(IOTA, inpIOTA_log->value()); rec.putField(DXCC, inpDXCC_log->value()); rec.putField(QSL_VIA, inpQSL_VIA_log->value()); rec.putField(CONT, inpCONT_log->value()); rec.putField(CQZ, inpCQZ_log->value()); rec.putField(ITUZ, inpITUZ_log->value()); rec.putField(TX_PWR, log_power()); rec.putField(STA_CALL, inp_log_sta_call->value()); rec.putField(OP_CALL, inp_log_op_call->value()); rec.putField(MY_CITY, inp_log_sta_qth->value()); rec.putField(MY_GRID, inp_log_sta_loc->value()); rec.putField(SS_SERNO, inp_log_cwss_serno->value()); rec.putField(SS_PREC, inp_log_cwss_prec->value()); rec.putField(SS_CHK, inp_log_cwss_chk->value()); rec.putField(SS_SEC, inp_log_cwss_sec->value()); rec.putField(AGE, inp_age_log->value()); rec.putField(TEN_TEN, inp_1010_log->value()); rec.putField(CHECK, inp_check_log->value()); rec.putField(TROOPS, inp_log_troop_s->value()); rec.putField(TROOPR, inp_log_troop_r->value()); rec.putField(SCOUTS, inp_log_scout_s->value()); rec.putField(SCOUTR, inp_log_scout_r->value()); dxcc_entity_cache_rm(qsodb.getRec(editNbr)); qsodb.qsoUpdRec (editNbr, &rec); dxcc_entity_cache_add(&rec); qsodb.isdirty(0); restore_sort(); loadBrowser(true); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } void deleteRecord () { if (qsodb.nbrRecs() == 0 || fl_choice2(_("Really delete record for \"%s\"?"), _("Yes"), _("No"), NULL, wBrowser->valueAt(-1, 2))) return; dxcc_entity_cache_rm(qsodb.getRec(editNbr)); qsodb.qsoDelRec(editNbr); qsodb.isdirty(0); restore_sort(); loadBrowser(true); adifFile.writeLog (logbook_filename.c_str(), &qsodb); } void EditRecord( int i ) { cQsoRec *editQSO = qsodb.getRec (i); if( !editQSO ) return; inpCall_log->value (editQSO->getField(CALL)); inpName_log->value (editQSO->getField(NAME)); inpDate_log->value (editQSO->getField(QSO_DATE)); inpDateOff_log->value (editQSO->getField(QSO_DATE_OFF)); inpTimeOn_log->value (timeview(editQSO->getField(TIME_ON))); inpTimeOff_log->value (timeview(editQSO->getField(TIME_OFF))); inpRstR_log->value (editQSO->getField(RST_RCVD)); inpRstS_log->value (editQSO->getField(RST_SENT)); inpFreq_log->value (editQSO->getField(FREQ)); inpBand_log->value (editQSO->getField(BAND)); inpMode_log->value (editQSO->getField(ADIF_MODE)); inpState_log->value (editQSO->getField(STATE)); inpVE_Prov_log->value (editQSO->getField(VE_PROV)); inpCountry_log->value (editQSO->getField(COUNTRY)); inpQth_log->value (editQSO->getField(QTH)); inpLoc_log->value (editQSO->getField(GRIDSQUARE)); inpQSLrcvddate_log->value (editQSO->getField(QSLRDATE)); inpQSLsentdate_log->value (editQSO->getField(QSLSDATE)); inpEQSLrcvddate_log->value (editQSO->getField(EQSLRDATE)); inpEQSLsentdate_log->value (editQSO->getField(EQSLSDATE)); inpLOTWrcvddate_log->value (editQSO->getField(LOTWRDATE)); inpLOTWsentdate_log->value (editQSO->getField(LOTWSDATE)); inpNotes_log->value (editQSO->getField(NOTES)); inpSerNoIn_log->value(editQSO->getField(SRX)); inpSerNoOut_log->value(editQSO->getField(STX)); inpXchgIn_log->value(editQSO->getField(XCHG1)); inpClass_log->value(editQSO->getField(CLASS)); inpSection_log->value(editQSO->getField(ARRL_SECT)); inpMyXchg_log->value(editQSO->getField(MYXCHG)); inpCNTY_log->value(editQSO->getField(CNTY)); inpIOTA_log->value(editQSO->getField(IOTA)); inpDXCC_log->value(editQSO->getField(DXCC)); inpQSL_VIA_log->value(editQSO->getField(QSL_VIA)); inpCONT_log->value(editQSO->getField(CONT)); inpCQZ_log->value(editQSO->getField(CQZ)); inpITUZ_log->value(editQSO->getField(ITUZ)); inpTX_pwr_log->value(editQSO->getField(TX_PWR)); inp_log_sta_call->value(editQSO->getField(STA_CALL)); inp_log_op_call->value(editQSO->getField(OP_CALL)); inp_log_sta_qth->value(editQSO->getField(MY_CITY)); inp_log_sta_loc->value(editQSO->getField(MY_GRID)); inp_log_cwss_serno->value(editQSO->getField(SS_SERNO)); inp_log_cwss_prec->value(editQSO->getField(SS_PREC)); inp_log_cwss_chk->value(editQSO->getField(SS_CHK)); inp_log_cwss_sec->value(editQSO->getField(SS_SEC)); inp_age_log->value(editQSO->getField(AGE)); inp_1010_log->value(editQSO->getField(TEN_TEN)); inp_check_log->value(editQSO->getField(CHECK)); inp_log_troop_s->value(editQSO->getField(TROOPS)); inp_log_troop_r->value(editQSO->getField(TROOPR)); inp_log_scout_s->value(editQSO->getField(SCOUTS)); inp_log_scout_r->value(editQSO->getField(SCOUTR)); } std::string sDate_on = ""; std::string sTime_on = ""; std::string sDate_off = ""; std::string sTime_off = ""; const char *log_power() { static std::string stemp; if (progdefaults.log_power_meter) { static char sval[20]; snprintf(sval, sizeof(sval), "%3.0f", pwrmeter->peak()); stemp = sval; strtrim(stemp); } else stemp = progdefaults.mytxpower; return stemp.c_str(); } void AddRecord () { inpCall_log->value(inpCall->value()); inpName_log->value (inpName->value()); if (progdefaults.force_date_time) { inpDate_log->value(sDate_off.c_str()); inpTimeOn_log->value (timeview(sTime_off.c_str())); } else { inpDate_log->value(sDate_on.c_str()); inpTimeOn_log->value (timeview(sTime_on.c_str())); } inpDateOff_log->value(sDate_off.c_str()); inpTimeOff_log->value (timeview(sTime_off.c_str())); inpRstR_log->value (inpRstIn->value()); inpRstS_log->value (inpRstOut->value()); { char Mhz[30]; snprintf(Mhz, sizeof(Mhz), "%-.6lf", atof(inpFreq->value()) / 1000.0); inpFreq_log->value(Mhz); inpBand_log->value(band_name(Mhz)); } inpMode_log->value (logmode); inpState_log->value (ucasestr(inpState->value()).c_str()); inpVE_Prov_log->value (ucasestr(inpVEprov->value()).c_str()); inpCountry_log->value (cboCountry->value()); inpCNTY_log->value (inpCounty->value()); inpSerNoIn_log->value(inpSerNo->value()); inpSerNoOut_log->value(outSerNo->value()); inpXchgIn_log->value(inpXchgIn->value()); inpMyXchg_log->value(progdefaults.myXchg.c_str()); inpQth_log->value (inpQTH->value()); inpLoc_log->value (inpLoc->value()); inpQSLrcvddate_log->value (""); inpQSLsentdate_log->value (""); inpEQSLrcvddate_log->value (""); inpEQSLsentdate_log->value (""); inpLOTWrcvddate_log->value (""); inpLOTWsentdate_log->value (""); inpNotes_log->value (inpNotes->value()); if (progdefaults.log_power_meter) inpTX_pwr_log->value(log_power()); inpIOTA_log->value(""); inpDXCC_log->value(""); inpQSL_VIA_log->value(""); inpCONT_log->value(""); inpCQZ_log->value(inp_CQzone->value()); inpITUZ_log->value(""); inpClass_log->value(ucasestr(inpClass->value()).c_str()); inpSection_log->value(ucasestr(inpSection->value()).c_str()); inp_log_sta_call->value(progdefaults.myCall.c_str()); inp_log_op_call->value(progdefaults.operCall.c_str()); inp_log_sta_qth->value(progdefaults.myQth.c_str()); inp_log_sta_loc->value(progdefaults.myLocator.c_str()); inp_log_cwss_serno->value(ucasestr(inp_SS_SerialNoR->value()).c_str()); inp_log_cwss_prec->value(ucasestr(inp_SS_Precedence->value()).c_str()); inp_log_cwss_chk->value(ucasestr(inp_SS_Check->value()).c_str()); inp_log_cwss_sec->value(ucasestr(inp_SS_Section->value()).c_str()); inp_age_log->value(ucasestr(inp_KD_age->value()).c_str()); inp_check_log->value(ucasestr(inp_ARR_check->value()).c_str()); inp_1010_log->value(ucasestr(inp_1010_nr->value()).c_str()); inp_log_troop_s->value(progdefaults.my_JOTA_troop.c_str()); inp_log_troop_r->value(inp_JOTA_troop->value()); inp_log_scout_s->value(progdefaults.my_JOTA_scout.c_str()); inp_log_scout_r->value(inp_JOTA_scout->value()); saveRecord(); logState = VIEWREC; activateButtons(); } void cb_browser (Fl_Widget *w, void *data ) { Table *table = (Table *)w; editNbr = atoi(table->valueAt(-1,6)); EditRecord (editNbr); } void addBrowserRow(cQsoRec *rec, int nbr) { char sNbr[6]; snprintf(sNbr,sizeof(sNbr),"%d", nbr); wBrowser->addRow (7, rec->getField(progdefaults.sort_date_time_off ? QSO_DATE_OFF : QSO_DATE), timeview4(rec->getField(progdefaults.sort_date_time_off ? TIME_OFF : TIME_ON)), rec->getField(CALL), rec->getField(NAME), rec->getField(FREQ), rec->getField(ADIF_MODE), sNbr); } void adjustBrowser(bool keep_pos) { int row = wBrowser->value(), pos = wBrowser->scrollPos(); if (row >= qsodb.nbrRecs()) row = qsodb.nbrRecs() - 1; if (keep_pos && row >= 0) { wBrowser->value(row); wBrowser->scrollTo(pos); } else { if (cQsoDb::reverse == true) wBrowser->FirstRow (); else wBrowser->LastRow (); } char szRecs[6]; snprintf(szRecs, sizeof(szRecs), "%5d", qsodb.nbrRecs()); txtNbrRecs_log->value(szRecs); } void loadBrowser(bool keep_pos) { cQsoRec *rec; wBrowser->clear(); if (qsodb.nbrRecs() == 0) return; for( int i = 0; i < qsodb.nbrRecs(); i++ ) { rec = qsodb.getRec (i); addBrowserRow(rec, i); } adjustBrowser(keep_pos); } //============================================================================= // Cabrillo reporter //============================================================================= const char *szContests[] = { "AP-SPRINT", "ARRL-10", "ARRL-160", "ARRL-DX-CW", "ARRL-DX-SSB", "ARRL-SS-CW", "ARRL-SS-SSB", "ARRL-UHF-AUG", "ARRL-VHF-JAN", "ARRL-VHF-JUN", "ARRL-VHF-SEP", "ARRL-RTTY", "BARTG-RTTY", "BARTG-SPRINT", "CQ-160-CW", "CQ-160-SSB", "CQ-WPX-CW", "CQ-WPX-RTTY", "CQ-WPX-SSB", "CQ-VHF", "CQ-WW-CW", "CQ-WW-RTTY", "CQ-WW-SSB", "DARC-WAEDC-CW", "DARC-WAEDC-RTTY", "DARC-WAEDC-SSB", "FCG-FQP", "IARU-HF", "JIDX-CW", "JIDX-SSB", "NAQP-CW", "NAQP-RTTY", "NAQP-SSB", "NA-SPRINT-CW", "NA-SPRINT-SSB", "NCCC-CQP", "NEQP", "OCEANIA-DX-CW", "OCEANIA-DX-SSB", "RDXC", "RSGB-IOTA", "SAC-CW", "SAC-SSB", "STEW-PERRY", "TARA-RTTY", 0 }; enum icontest { AP_SPRINT, ARRL_10, ARRL_160, ARRL_DX_CW, ARRL_DX_SSB, ARRL_SS_CW, ARRL_SS_SSB, ARRL_UHF_AUG, ARRL_VHF_JAN, ARRL_VHF_JUN, ARRL_VHF_SEP, ARRL_RTTY, BARTG_RTTY, BARTG_SPRINT, CQ_160_CW, CQ_160_SSB, CQ_WPX_CW, CQ_WPX_RTTY, CQ_WPX_SSB, CQ_VHF, CQ_WW_CW, CQ_WW_RTTY, CQ_WW_SSB, DARC_WAEDC_CW, DARC_WAEDC_RTTY, DARC_WAEDC_SSB, FCG_FQP, IARU_HF, JIDX_CW, JIDX_SSB, NAQP_CW, NAQP_RTTY, NAQP_SSB, NA_SPRINT_CW, NA_SPRINT_SSB, NCCC_CQP, NEQP, OCEANIA_DX_CW, OCEANIA_DX_SSB, RDXC, RSGB_IOTA, SAC_CW, SAC_SSB, STEW_PERRY, TARA_RTTY }; bool bInitCombo = true; icontest contestnbr; void setContestType() { contestnbr = (icontest)cboContest->index(); btnCabCall->value(true); btnCabFreq->value(true); btnCabMode->value(true); btnCabQSOdate->value(true); btnCabTimeOFF->value(true); btnCabRSTsent->value(true); btnCabRSTrcvd->value(true); btnCabSerialIN->value(true);btnCabSerialOUT->value(true); btnCabXchgIn->value(true); btnCabMyXchg->value(true); btnCabCounty->value(true); btnCabState->value(true); switch (contestnbr) { case ARRL_SS_CW : case ARRL_SS_SSB : btnCabRSTrcvd->value(false); break; case BARTG_RTTY : case BARTG_SPRINT : break; case ARRL_UHF_AUG : case ARRL_VHF_JAN : case ARRL_VHF_JUN : case ARRL_VHF_SEP : case CQ_VHF : btnCabRSTrcvd->value(false); btnCabSerialIN->value(false); btnCabSerialOUT->value(false); break; case AP_SPRINT : case ARRL_10 : case ARRL_160 : case ARRL_DX_CW : case ARRL_DX_SSB : case CQ_160_CW : case CQ_160_SSB : case CQ_WPX_CW : case CQ_WPX_RTTY : case CQ_WPX_SSB : case RDXC : case OCEANIA_DX_CW : case OCEANIA_DX_SSB : break; case DARC_WAEDC_CW : case DARC_WAEDC_RTTY : case DARC_WAEDC_SSB : break; case NAQP_CW : case NAQP_RTTY : case NAQP_SSB : case NA_SPRINT_CW : case NA_SPRINT_SSB : break; case RSGB_IOTA : break; default : break; } } void cb_Export_Cabrillo(Fl_Menu_* m, void* d) { if (qsodb.nbrRecs() == 0) return; cQsoRec *rec; char line[80]; int indx = 0; if (bInitCombo) { bInitCombo = false; while (szContests[indx]) { cboContest->add(szContests[indx]); indx++; } } cboContest->index(0); chkCabBrowser->clear(); #ifdef __APPLE__ chkCabBrowser->textfont(FL_SCREEN_BOLD); chkCabBrowser->textsize(12); #else chkCabBrowser->textfont(FL_COURIER); chkCabBrowser->textsize(12); #endif for( int i = 0; i < qsodb.nbrRecs(); i++ ) { rec = qsodb.getRec (i); memset(line, 0, sizeof(line)); snprintf(line,sizeof(line),"%8s %4s %-10s %-10s %-s", rec->getField(QSO_DATE), time4(rec->getField(TIME_OFF)), rec->getField(CALL), szfreq(rec->getField(FREQ)), adif2export(rec->getField(ADIF_MODE)).c_str() ); chkCabBrowser->add(line); } wCabrillo->show(); } void cabrillo_append_qso (FILE *fp, cQsoRec *rec) { char freq[16] = ""; std::string rst_in, rst_out, exch_in, exch_out, date, time, mode, mycall, call, exch, state, county; std::string qsoline = "QSO: "; int ifreq = 0; size_t len = 0; size_t p = 0; exch_out.clear(); exch_in.clear(); exch.clear(); if (btnCabFreq->value()) { ifreq = (int)(1000.0 * atof(rec->getField(FREQ))); snprintf(freq, sizeof(freq), "%7d", ifreq); qsoline.append(freq); qsoline.append(" "); } if (btnCabMode->value()) { mode = adif2export(rec->getField(ADIF_MODE)); if (mode.compare("USB") == 0 || mode.compare("LSB") == 0 || mode.compare("FM") == 0 || mode.compare("SSB") == 0 || mode.compare("PH") == 0 ) mode = "PH"; else if (mode.compare("RTTY") == 0) mode = "RY"; if (mode.length() < 10) mode.append(10 - mode.length(), ' '); qsoline.append(mode).append(" "); } if (btnCabQSOdate->value()) { date = rec->getField(progdefaults.sort_date_time_off ? QSO_DATE_OFF : QSO_DATE); date.insert(4,"-"); date.insert(7,"-"); qsoline.append(date).append(" "); } if (btnCabTimeOFF->value()) { time = rec->getField(progdefaults.sort_date_time_off ? TIME_OFF : TIME_ON); qsoline.append(time4(time.c_str())).append(" "); } mycall = progdefaults.myCall; if (mycall.length() > 13) mycall = mycall.substr(0,13); len = mycall.length(); if (len < 13) mycall.append(13 - len, ' '); qsoline.append(mycall).append(" "); if (btnCabRSTsent->value() || contestnbr == BARTG_RTTY) { rst_out = rec->getField(RST_SENT); if (rst_out.length() > 3) rst_out = rst_out.substr(0, 3); len = rst_out.length(); if (len < 3) rst_out.append(3 - len, ' '); exch_out.append(rst_out).append(" "); } if (btnCabSerialOUT->value() || contestnbr == BARTG_RTTY) { exch_out.append(rec->getField(STX)).append(" "); } if (btnCabMyXchg->value()) { exch = rec->getField(MYXCHG); if (!exch.empty()) exch_out.append(exch).append(" "); } if (contestnbr == BARTG_RTTY) { std::string toff = rec->getField(TIME_OFF); if (toff.length() > 4) toff = toff.substr(0,4); toff = toff.append(" "); exch_out.append(toff); } // // ADD CONTESTNBR == FD // // if (exch_out.length() > 20) exch_out = exch_out.substr(0,20); len = exch_out.length(); if (len < 20) exch_out.append(20 - len, ' '); qsoline.append(exch_out); if (btnCabCall->value()) { call = rec->getField(CALL); if (call.length() > 13) call = call.substr(0,13); len = call.length(); if (len < 13) call.append(13 - len, ' '); qsoline.append(call); qsoline.append(" "); } if (btnCabRSTrcvd->value()) { rst_in = rec->getField(RST_RCVD); if (rst_in.length() > 3) rst_in = rst_in.substr(0,3); len = rst_in.length(); if (len < 3) rst_in.append(3 - len, ' '); qsoline.append(rst_in); qsoline.append(" "); } if (btnCabSerialIN->value()) { exch_in = exch_in.append(rec->getField(SRX)); if (exch_in.length()) exch_in += ' '; } if (btnCabXchgIn->value()) { exch = rec->getField(XCHG1); while ((p = exch.find(":")) != std::string::npos) exch.erase(p,1); while ((p = exch.find(" ")) != std::string::npos) exch.erase(p,1); if (exch[0] == ' ') exch.erase(0,1); exch_in.append(exch); } if (exch_in.length() > 14) exch_in = exch_in.substr(0,14); len = exch_in.length(); if (len < 14) exch_in.append(14 - len, ' '); if (btnCabState->value()) { state = rec->getField(STATE); if (!state.empty()) qsoline.append(state).append(" "); } if (btnCabCounty->value()) { county = rec->getField(CNTY); if (!county.empty()) qsoline.append(county).append(" "); } qsoline.append(exch_in); fprintf (fp, "%s\n", qsoline.c_str()); return; } void WriteCabrillo() { if (chkCabBrowser->nchecked() == 0) return; cQsoRec *rec; std::string title = _("Create cabrillo report"); std::string filters = "TEXT\t*.txt"; #ifdef __APPLE__ filters.append("\n"); #endif std::string strContest = ""; const char* p = FSEL::saveas( title.c_str(), filters.c_str(), "contest.txt"); if (!p) return; if (!*p) return; for (int i = 0; i < chkCabBrowser->FLTK_nitems(); i++) { if (chkCabBrowser->checked(i + 1)) { rec = qsodb.getRec(i); rec->putField(EXPORT, "E"); qsodb.qsoUpdRec (i, rec); } } std::string sp = p; if (sp.find(".txt") == std::string::npos) sp.append(".txt"); FILE *cabFile = fl_fopen (p, "w"); if (!cabFile) return; strContest = cboContest->value(); contestnbr = (icontest)cboContest->index(); fprintf (cabFile, "START-OF-LOG: 3.0\n\ CREATED-BY: %s %s\n\ \n\ # The callsign used during the contest.\n\ CALLSIGN: %s\n\ \n\ # ASSISTED or NON-ASSISTED\n\ CATEGORY-ASSISTED: \n\ \n\ # Band: ALL, 160M, 80M, 40M, 20M, 15M, 10M, 6M, 2M, 222, 432, 902, 1.2G\n\ CATEGORY-BAND: \n\ \n\ # Mode: SSB, CW, RTTY, MIXED \n\ CATEGORY-MODE: \n\ \n\ # Operator: SINGLE-OP, MULTI-OP, CHECKLOG \n\ CATEGORY-OPERATOR: \n\ \n\ # Power: HIGH, LOW, QRP \n\ CATEGORY-POWER: \n\ \n\ # Station: FIXED, MOBILE, PORTABLE, ROVER, EXPEDITION, HQ, SCHOOL \n\ CATEGORY-STATION: \n\ \n\ # Time: 6-HOURS, 12-HOURS, 24-HOURS \n\ CATEGORY-TIME: \n\ \n\ # Transmitter: ONE, TWO, LIMITED, UNLIMITED, SWL \n\ CATEGORY-TRANSMITTER: \n\ \n\ # Overlay: ROOKIE, TB-WIRES, NOVICE-TECH, OVER-50 \n\ CATEGORY-OVERLAY: \n\ \n\ # Integer number\n\ CLAIMED-SCORE: \n\ \n\ # Name of the radio club with which the score should be aggregated.\n\ CLUB: \n\ \n\ # Contest: AP-SPRINT, ARRL-10, ARRL-160, ARRL-DX-CW, ARRL-DX-SSB, ARRL-SS-CW,\n\ # ARRL-SS-SSB, ARRL-UHF-AUG, ARRL-VHF-JAN, ARRL-VHF-JUN, ARRL-VHF-SEP,\n\ # ARRL-RTTY, BARTG-RTTY, CQ-160-CW, CQ-160-SSB, CQ-WPX-CW, CQ-WPX-RTTY,\n\ # CQ-WPX-SSB, CQ-VHF, CQ-WW-CW, CQ-WW-RTTY, CQ-WW-SSB, DARC-WAEDC-CW,\n\ # DARC-WAEDC-RTTY, DARC-WAEDC-SSB, FCG-FQP, IARU-HF, JIDX-CW, JIDX-SSB,\n\ # NAQP-CW, NAQP-RTTY, NAQP-SSB, NA-SPRINT-CW, NA-SPRINT-SSB, NCCC-CQP,\n\ # NEQP, OCEANIA-DX-CW, OCEANIA-DX-SSB, RDXC, RSGB-IOTA, SAC-CW, SAC-SSB,\n\ # STEW-PERRY, TARA-RTTY \n\ CONTEST: %s\n\ \n\ # Optional email address\n\ EMAIL: \n\ \n\ LOCATION: \n\ \n\ # Operator name\n\ NAME: \n\ \n\ # Maximum 4 address lines.\n\ ADDRESS: \n\ ADDRESS: \n\ ADDRESS: \n\ ADDRESS: \n\ \n\ # A space-delimited list of operator callsign(s). \n\ OPERATORS: \n\ \n\ # Offtime yyyy-mm-dd nnnn yyyy-mm-dd nnnn \n\ # OFFTIME: \n\ \n\ # Soapbox comments.\n\ SOAPBOX: \n\ SOAPBOX: \n\ SOAPBOX: \n\n", PACKAGE_NAME, PACKAGE_VERSION, progdefaults.myCall.c_str(), strContest.c_str() ); qsodb.SortByDate(progdefaults.sort_date_time_off); for (int i = 0; i < qsodb.nbrRecs(); i++) { rec = qsodb.getRec(i); if (rec->getField(EXPORT)[0] == 'E') { cabrillo_append_qso(cabFile, rec); rec->putField(EXPORT,""); qsodb.qsoUpdRec(i, rec); } } fprintf(cabFile, "END-OF-LOG:\n"); fclose (cabFile); return; } #if HAVE_STD_HASH # include typedef std::unordered_map dxcc_entity_cache_t; #elif HAVE_STD_TR1_HASH # include typedef std::tr1::unordered_map dxcc_entity_cache_t; #else # error "No std::hash or std::tr1::hash support" #endif static dxcc_entity_cache_t dxcc_entity_cache; static bool dxcc_entity_cache_enabled = false; #include "dxcc.h" static void dxcc_entity_cache_clear(void) { if (dxcc_entity_cache_enabled) dxcc_entity_cache.clear(); } static void dxcc_entity_cache_add(cQsoRec* r) { if (!dxcc_entity_cache_enabled | !r) return; const dxcc* e = dxcc_lookup(r->getField(CALL)); if (e) dxcc_entity_cache[e->country]++; } static void dxcc_entity_cache_add(cQsoDb& db) { if (!dxcc_entity_cache_enabled) return; int n = db.nbrRecs(); for (int i = 0; i < n; i++) dxcc_entity_cache_add(db.getRec(i)); if (!dxcc_entity_cache.empty()) { unsigned int un = dxcc_entity_cache.size(); LOG_INFO("Found %u countries in %d QSO records", un, n); } } static void dxcc_entity_cache_rm(cQsoRec* r) { if (!dxcc_entity_cache_enabled || !r) return; const dxcc* e = dxcc_lookup(r->getField(CALL)); if (!e) return; dxcc_entity_cache_t::iterator i = dxcc_entity_cache.find(e->country); if (i != dxcc_entity_cache.end()) { if (i->second) i->second--; else dxcc_entity_cache.erase(i); } } void dxcc_entity_cache_enable(bool v) { if (dxcc_entity_cache_enabled == v) return; dxcc_entity_cache_clear(); if ((dxcc_entity_cache_enabled = v)) dxcc_entity_cache_add(qsodb); } bool qsodb_dxcc_entity_find(const char* country) { return dxcc_entity_cache.find(country) != dxcc_entity_cache.end(); } //====================================================================== // eQSL verification support //====================================================================== static std::string eqsl_download_name = ""; static cQsoDb *eqsl_db = 0; void verify_eqsl(void *) { eqsl_db = new cQsoDb; LOG_INFO("VERIFY_EQSL: adifFile.do_readfile(%s)", eqsl_download_name.c_str()); adifFile.do_readfile (eqsl_download_name.c_str(), eqsl_db); if (eqsl_db->nbrRecs() == 0) { LOG_INFO("No records in eqsl download file"); return; } LOG_INFO("logbook %d records, verify with %d records", qsodb.nbrRecs(), eqsl_db->nbrRecs()); int matchrec; cQsoRec *qrec, *lrec; int nverified = 0; for (int i = 0; i < eqsl_db->nbrRecs(); i++) { lrec = eqsl_db->getRec(i); matchrec = qsodb.matched( lrec ); if (matchrec != -1) { qrec = qsodb.getRec(matchrec); if (qrec->getField(EQSLRDATE)[0] == 0) { nverified++; qrec->putField(EQSLRDATE, zdate()); } } else { LOG_INFO("Could not match %s on %s", lrec->getField(CALL), lrec->getField(QSO_DATE)); } } LOG_INFO("%d records updated", nverified); delete eqsl_db; } void cb_btn_verify_eqsl(Fl_Button *, void *) { ENSURE_THREAD(FLMAIN_TID); const char* p = FSEL::select(_("LoTW download file"), "ADIF\t*.{adi,adif}", LoTWDir.c_str()); if (!p) return; if (!*p) return; eqsl_download_name = p; Fl::awake(verify_eqsl); } fldigi-4.2.05/src/logbook/adif_io.cxx0000664000175000017500000005332114611711171014330 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "fl_digi.h" #include "signal.h" #include "threads.h" #include "adif_io.h" #include "config.h" #include "configuration.h" #include "lgbook.h" #include "icons.h" #include "gettext.h" #include "debug.h" #include "util.h" #include "date.h" #include "logsupport.h" #include "qrunner.h" #include "timeops.h" static pthread_mutex_t logfile_mutex = PTHREAD_MUTEX_INITIALIZER; size_t ptr, ptr2; std::string sbuff; #ifdef __WOE32__ static const char *szEOL = "\r\n"; #else static const char *szEOL = "\n"; #endif static const char *szEOR = ""; // These ADIF fields define the ADIF database FIELD fields[] = { // TYPE, FSIZE, NAME, WIDGET {FREQ, 12, "FREQ", &btnSelectFreq}, // QSO frequency in Mhz {CALL, 30, "CALL", &btnSelectCall}, // contacted stations CALLSIGN {ADIF_MODE, 20, "MODE", &btnSelectMode}, // QSO mode {SUBMODE, 20, "SUBMODE", NULL}, // QSO submode {NAME, 80, "NAME", &btnSelectName}, // contacted operators NAME {QSO_DATE, 8, "QSO_DATE", &btnSelectQSOdateOn}, // QSO data {QSO_DATE_OFF, 8, "QSO_DATE_OFF", &btnSelectQSOdateOff},// QSO data OFF, according to ADIF 2.2.6 {TIME_OFF, 6, "TIME_OFF", &btnSelectTimeOFF}, // HHMM or HHMMSS in UTC {TIME_ON, 6, "TIME_ON", &btnSelectTimeON}, // HHMM or HHMMSS in UTC {QTH, 100, "QTH", &btnSelectQth}, // contacted stations city {RST_RCVD, 3, "RST_RCVD", &btnSelectRSTrcvd}, // received signal report {RST_SENT, 3, "RST_SENT", &btnSelectRSTsent}, // sent signal report {STATE, 20, "STATE", &btnSelectState}, // contacted stations STATE {VE_PROV, 20, "VE_PROV", &btnSelectProvince}, // 2 letter abbreviation for Canadian Province {NOTES, 512, "NOTES", &btnSelectNotes}, // QSO notes {QSLRDATE, 8, "QSLRDATE", &btnSelectQSLrcvd}, // QSL received date {QSLSDATE, 8, "QSLSDATE", &btnSelectQSLsent}, // QSL sent date {EQSLRDATE, 8, "EQSLRDATE", &btnSelecteQSLrcvd}, // EQSL received date {EQSLSDATE, 8, "EQSLSDATE", &btnSelecteQSLsent}, // EQSL sent date {LOTWRDATE, 8, "LOTWRDATE", &btnSelectLOTWrcvd}, // LOTW received date {LOTWSDATE, 8, "LOTWSDATE", &btnSelectLOTWsent}, // LOTW sent date {GRIDSQUARE, 8, "GRIDSQUARE", &btnSelectLOC}, // contacted stations Maidenhead Grid Square {BAND, 8, "BAND", &btnSelectBand}, // QSO band {CNTY, 60, "CNTY", &btnSelectCNTY}, // secondary political subdivision, ie: county {COUNTRY, 60, "COUNTRY", &btnSelectCountry}, // contacted stations DXCC entity name {CQZ, 8, "CQZ", &btnSelectCQZ}, // contacted stations CQ Zone {DXCC, 8, "DXCC", &btnSelectDXCC}, // contacted stations Country Code {QSL_VIA, 256, "QSL_VIA", &btnSelectQSL_VIA}, // contacted stations path {IOTA, 20, "IOTA", &btnSelectIOTA}, // Islands on the air {ITUZ, 20, "ITUZ", &btnSelectITUZ}, // ITU zone {CONT, 60, "CONT", &btnSelectCONT}, // contacted stations continent {SRX, 50, "SRX", &btnSelectSerialIN}, // received serial number for a contest QSO {STX, 50, "STX", &btnSelectSerialOUT}, // QSO transmitted serial number {XCHG1, 100, "SRX_STRING", &btnSelectXchgIn}, // contest exchange #1 / free1 in xlog {MYXCHG, 100, "STX_STRING", &btnSelectMyXchg}, // contest exchange sent {CLASS, 20, "CLASS", &btnSelectClass}, // Field Day / School RR class received {ARRL_SECT, 20, "ARRL_SECT", &btnSelectSection}, // ARRL section received {TX_PWR, 8, "TX_PWR", &btnSelectTX_pwr}, // power transmitted by this station {OP_CALL, 30, "OPERATOR", &btnSelectOperator}, // Callsign of person logging the QSO {STA_CALL, 30, "STATION_CALLSIGN", &btnSelectStaCall}, // Callsign of transmitting station {MY_GRID, 8, "MY_GRIDSQUARE", &btnSelectStaGrid}, // Xmt station locator {MY_CITY, 60, "MY_CITY", &btnSelectStaCity}, // Xmt station location {MY_STATE, 8, "MY_STATE", NULL}, // Xmt station location {SS_SEC, 20, "CWSS_SECTION", &btnSelect_cwss_section}, // CW sweepstakes {SS_SERNO, 20, "CWSS_SERNO", &btnSelect_cwss_serno}, {SS_PREC, 20, "CWSS_PREC", &btnSelect_cwss_prec}, {SS_CHK, 20, "CWSS_CHK", &btnSelect_cwss_check}, {AGE, 2, "AGE", &btnSelectAge}, // contacted operators age in years {TEN_TEN, 10, "TEN_TEN", &btnSelect_1010}, // ten ten # of other station {CHECK, 10, "CHECK", &btnSelectCheck}, // contest identifier {FD_CLASS, 20, "FD_CLASS", NULL}, // Field Day Rcvd {FD_SECTION, 20, "FD_SECTION", NULL}, // FD section received {TROOPS, 20, "TROOPS", NULL}, // JOTA troop number sent {TROOPR, 20, "TROOPR", NULL}, // JOTA troop number received {SCOUTS, 20, "SCOUTS", NULL}, {SCOUTR, 20, "SCOUTR", NULL}, {NUMFIELDS, 0, "", NULL} }; // This ADIF fields is in the fldigi QSO database, but not saved in the ADIF file /* {EXPORT, 0, "EXPORT", NULL}, // used to indicate record is to be exported */ // These ADIF fields are not in the fldigi QSO database /* {COMMENT, 256, "COMMENT", NULL}, // comment field for QSO {ADDRESS, 256, "ADDRESS", NULL}, // contacted stations mailing address {PFX, 20, "PFX", NULL}, // WPA prefix {PROP_MODE, 100, "PROP_MODE", NULL}, // propogation mode {QSL_MSG, 256, "QSL_MSG", NULL}, // personal message to appear on qsl card {QSL_RCVD, 4, "QSL_RCVD", NULL}, // QSL received status {QSL_SENT, 4, "QSL_SENT", NULL}, // QSL sent status {QSL_VIA, 20, "QSL_VIA", NULL}, // QSL via this person {RX_PWR, 8, "RX_PWR", NULL}, // power of other station in watts {SAT_MODE, 20, "SAT_MODE", NULL}, // satellite mode {SAT_NAME, 20, "SAT_NAME", NULL}, // satellite name }; */ static std::string read_errors; static int num_read_errors; static void write_rxtext(const char *s) { ReceiveText->addstr(s); } static char *fastlookup = 0; static unsigned int maxlen = 0; static void initfields() { if (fastlookup) return; // may have multiple instances using common code int i = 0; while (fields[i].type != NUMFIELDS) { if (strlen(fields[i].name) > maxlen) maxlen = strlen(fields[i].name); i++; } maxlen++; fastlookup = new char[maxlen * i + 1]; fastlookup[0] = 0; i = 0; while (fields[i].type != NUMFIELDS) { strcat(fastlookup, fields[i].name); unsigned int n = maxlen - strlen(fastlookup) % maxlen; if (n > 0 && n < maxlen) for (unsigned int j = 0; j < n; j++) strcat(fastlookup, " "); i++; } } static inline int findfield( char *p ) { if (strncasecmp (p, "EOR>", 4) == 0 || !maxlen) return -1; char *pos; char *p1 = strchr(p, ':'); char *p2 = strchr(p, '>'); if (p1 && p2) { if (p1 < p2) { pos = p; do { *pos = toupper(*pos); } while (++pos < p1); *p1 = 0; pos = strcasestr(fastlookup, p); *p1 = ':'; if (pos) { return fields[(pos - fastlookup) / maxlen].type; } } } return -2; //search key not found } int cAdifIO::instances = 0; cAdifIO::cAdifIO () { initfields(); instances++; } cAdifIO::~cAdifIO() { if (--instances == 0) { delete [] fastlookup; fastlookup = 0; } } char * cAdifIO::fillfield (int recnbr, int fieldnum, char *buff) { char *p1 = strchr(buff, ':'); char *p2 = strchr(buff, '>'); if (!p1 || !p2 || p2 < p1) { return 0; // bad ADIF specifier ---> no ':' after field name } p1++; int fldsize = 0; while (p1 != p2) { if (*p1 >= '0' && *p1 <= '9') { fldsize = fldsize * 10 + *p1 - '0'; } p1++; } std::string tmp = ""; tmp.assign(p2+1, fldsize); // added to disallow very large corrupted adif fields if (fldsize > fields[fieldnum].fsize) { std::string bfr = buff; tmp.erase(fields[fieldnum].fsize); static char szmsg[1000]; snprintf(szmsg, sizeof(szmsg), "In record # %d, <%s, too large, saving first %d characters\n", recnbr+1, bfr.substr(0, (int)(p2+1 - buff)).c_str(), fields[fieldnum].fsize ); read_errors.append(szmsg); num_read_errors++; } if ((fieldnum == TIME_ON || fieldnum == TIME_OFF) && fldsize < 6) while (tmp.length() < 6) tmp += '0'; adifqso->putField( fieldnum, tmp.c_str(), tmp.length() ); return p2 + fldsize + 1; } void cAdifIO::do_readfile(const char *fname, cQsoDb *db) { guard_lock lock(&logfile_mutex); int found; static char szmsg[500]; read_errors.clear(); num_read_errors = 0; // open the adif file FILE *adiFile = fl_fopen (fname, "rb"); if (adiFile == NULL) { LOG_ERROR("Could not open %s", fname); return; } /* struct timespec t0, t1, t2; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif */ char buff[16384]; sbuff.clear(); memset(buff, 0, 16384); int retnbr = fread(buff, 1, 16384, adiFile); while (retnbr) { sbuff.append(buff, retnbr); retnbr = fread(buff, 1, 16384, adiFile); } fclose(adiFile); size_t p;//, ptr, ptr2; p = sbuff.find(""); if (p == std::string::npos) p = sbuff.find(""); if (p == std::string::npos) { LOG_ERROR("Could not find in %s", fname); return; } if ((sbuff.find("") == std::string::npos) && (sbuff.find("") == std::string::npos)) { LOG_ERROR("Empty log file %s", fname); return; } size_t recend; int recnbr = 0; p = sbuff.find('<', p + 1); while (p != std::string::npos) { recend = sbuff.find("", p); if (recend == std::string::npos) recend = sbuff.find("", p); if (recend == std::string::npos) break; ptr = p; adifqso = 0; while (ptr != std::string::npos) { ptr2 = sbuff.find('<', ptr + 1); if (ptr2 == std::string::npos) break; found = findfield( &sbuff[ptr + 1] ); if (found > -1) { if (!adifqso) adifqso = db->newrec(); // need new record in db fillfield (recnbr, found, &sbuff[ptr + 1]); } else if (found == -1) { // reached; break; } ptr = ptr2; if (ptr == std::string::npos) break; // corrupt record } recnbr++; p = sbuff.find('<', recend + 1); } /* #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t2); #else clock_gettime(CLOCK_REALTIME, &t2); #endif float t = t1.tv_sec - t0.tv_sec + (t1.tv_nsec - t0.tv_nsec)/1e9; float tp = t2.tv_sec - t1.tv_sec + (t2.tv_nsec - t1.tv_nsec)/1e9; snprintf(szmsg, sizeof(szmsg), "\n\ ================================================\n\ Read Logbook: %s\n\ read %d records in %4.1f seconds\n\ parsed in %4.1f seconds\n\ ================================================\n", fname, db->nbrRecs(), t, tp); */ snprintf(szmsg, sizeof(szmsg), "\n\ ================================================\n\ Read Logbook: %s\n\ %d records\n\ ================================================\n", fname, db->nbrRecs()); if (progdefaults.DisplayLogbookRead && (db == &qsodb)) REQ(write_rxtext, szmsg); LOG_INFO("%s", szmsg); if (num_read_errors) { if (!read_errors.empty()) { read_errors.append("\n"); read_errors.append(szmsg); } else read_errors.assign(szmsg); snprintf(szmsg, sizeof(szmsg), "Corrected %d errors. Save logbook and then reload\n", num_read_errors); read_errors.append("\n\ ================================================\n").append(szmsg); read_errors.append("\ ================================================\n"); REQ(write_rxtext, read_errors.c_str()); } if (db == &qsodb) REQ(adif_read_OK); } static const char *adifmt = "<%s:%d>"; // write ALL or SELECTED records to the designated file int cAdifIO::writeFile (const char *fname, cQsoDb *db) { guard_lock lock(&logfile_mutex); std::string ADIFHEADER; ADIFHEADER = "File: %s"; ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append(""); ADIFHEADER.append(szEOL); // open the adif file cQsoRec *rec; std::string sFld; adiFile = fl_fopen (fname, "wb"); if (!adiFile) return 1; fprintf (adiFile, ADIFHEADER.c_str(), fl_filename_name(fname), strlen(ADIF_VERS), ADIF_VERS, strlen(PACKAGE_NAME), PACKAGE_NAME, strlen(PACKAGE_VERSION), PACKAGE_VERSION); std::string sName; int field_type; for (int i = 0; i < db->nbrRecs(); i++) { rec = db->getRec(i); if (rec->getField(EXPORT)[0] == 'E') { int j = 0; while (fields[j].type != NUMFIELDS) { if (strcmp(fields[j].name,"MYXCHG") == 0) { j++; continue; } if (strcmp(fields[j].name,"XCHG1") == 0) { j++; continue; } if (fields[j].btn != NULL) { if ((*fields[j].btn)->value()) { field_type = fields[j].type; sFld = rec->getField(field_type); sName = fields[j].name; if (field_type == ADIF_MODE && !sFld.empty()) { fprintf(adiFile, adifmt, "MODE", adif2export(sFld).length()); fprintf(adiFile, "%s", adif2export(sFld).c_str()); if (!adif2submode(sFld).empty()) { fprintf(adiFile, adifmt, "SUBMODE", adif2submode(sFld).length()); fprintf(adiFile, "%s", adif2submode(sFld).c_str()); } } else { if (!sFld.empty()) { fprintf(adiFile, adifmt, sName.c_str(), sFld.length()); //Exchange commas by dots in frequency for ADIF-conformity if (strcmp(fields[j].name,"FREQ") == 0) { char sfreq[20]; char* comma_position; memset(sfreq, 0, 20); strncpy (sfreq, sFld.c_str(), sizeof(sfreq) - 1); comma_position = strchr(sfreq,','); if (comma_position != NULL) { *comma_position = '.'; } fprintf(adiFile, "%s", sfreq); } else { fprintf(adiFile, "%s", sFld.c_str()); } } } } } j++; } rec->putField(EXPORT,""); db->qsoUpdRec(i, rec); fprintf(adiFile, "%s", szEOR); fprintf(adiFile, "%s", szEOL); } } fclose (adiFile); return 0; } // write ALL records to the common log //====================================================================== // thread support writing database //====================================================================== pthread_t* ADIF_RW_thread = 0; pthread_mutex_t ADIF_RW_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t ADIF_RW_cond = PTHREAD_COND_INITIALIZER; static void ADIF_RW_init(); static std::string adif_file_image; static std::string adif_file_name; static std::string records; static std::string record; static char recfield[200]; static bool ADIF_READ = false; static bool ADIF_WRITE = false; static cQsoDb *adif_db; static cAdifIO *adifIO = 0; void cAdifIO::readFile (const char *fname, cQsoDb *db) { ENSURE_THREAD(FLMAIN_TID); if (!ADIF_RW_thread) ADIF_RW_init(); pthread_mutex_lock(&ADIF_RW_mutex); adif_file_name = fname; adif_db = db; adifIO = this; ADIF_READ = true; pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); } static cQsoDb *adifdb = 0; static cQsoDb *wrdb = 0; static struct timespec t0, t1; std::string cAdifIO::adif_record(cQsoRec *rec) { static std::string record; static std::string sFld; record.clear(); for (int j = 0; fields[j].type != NUMFIELDS; j++) { if (strcmp(fields[j].name,"MYXCHG") == 0) continue; if (strcmp(fields[j].name,"XCHG1") == 0) continue; sFld = rec->getField(fields[j].type); if (!sFld.empty()) { snprintf(recfield, sizeof(recfield), adifmt, fields[j].name, sFld.length()); record.append(recfield).append(sFld); } } record.append(szEOR); record.append(szEOL); return record; } int cAdifIO::writeAdifRec (cQsoRec *rec, const char *fname) { std::string strRecord = adif_record(rec); FILE *adiFile = fl_fopen (fname, "ab"); if (!adiFile) { LOG_ERROR("Cannot write to %s", fname); return 1; } LOG_INFO("Write record to %s", fname); fprintf (adiFile, "%s", strRecord.c_str()); fclose (adiFile); return 0; } int cAdifIO::writeLog (const char *fname, cQsoDb *db, bool immediate) { ENSURE_THREAD(FLMAIN_TID); if (!ADIF_RW_thread) ADIF_RW_init(); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif if (!immediate) { pthread_mutex_lock(&ADIF_RW_mutex); adif_file_name = fname; adifIO = this; ADIF_WRITE = true; if (wrdb) delete wrdb; wrdb = new cQsoDb(db); adifdb = wrdb; pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); } else { adif_file_name = fname; adifdb = db; do_writelog(); } return 1; } void cAdifIO::do_writelog() { guard_lock lock(&logfile_mutex); std::string ADIFHEADER; ADIFHEADER = "File: %s"; ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append("%s"); ADIFHEADER.append(szEOL); ADIFHEADER.append(""); ADIFHEADER.append(szEOL); adiFile = fl_fopen (adif_file_name.c_str(), "wb"); if (!adiFile) { LOG_ERROR("Cannot write to %s", adif_file_name.c_str()); if (wrdb) delete wrdb; return; } LOG_INFO("Writing %s", adif_file_name.c_str()); cQsoRec *rec; fprintf ( adiFile, ADIFHEADER.c_str(), fl_filename_name(adif_file_name.c_str()), strlen(ADIF_VERS), ADIF_VERS, strlen(PACKAGE_NAME), PACKAGE_NAME, strlen(PACKAGE_VERSION), PACKAGE_VERSION ); for (int i = 0; i < adifdb->nbrRecs(); i++) { rec = adifdb->getRec(i); fprintf (adiFile, "%s", adif_record(rec).c_str()); if (wrdb) adifdb->qsoUpdRec(i, rec); } fflush (adiFile); fclose (adiFile); if (wrdb) delete wrdb; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif t0 = t1 - t0; float t = (t0.tv_sec + t0.tv_nsec/1e9); static char szmsg[50]; snprintf(szmsg, sizeof(szmsg), "%d records in %4.2f seconds", adifdb->nbrRecs(), t); LOG_INFO("%s", szmsg); snprintf(szmsg, sizeof(szmsg), "Wrote log %d recs", adifdb->nbrRecs()); put_status(szmsg, 5.0); return; } //====================================================================== // thread to support writing database in a separate thread //====================================================================== static void *ADIF_RW_loop(void *args); static bool ADIF_RW_EXIT = false; static void *ADIF_RW_loop(void *args) { SET_THREAD_ID(ADIF_RW_TID); for (;;) { pthread_mutex_lock(&ADIF_RW_mutex); pthread_cond_wait(&ADIF_RW_cond, &ADIF_RW_mutex); pthread_mutex_unlock(&ADIF_RW_mutex); if (ADIF_RW_EXIT) return NULL; if (ADIF_WRITE && adifIO) { LOG_INFO("ADIF_WRITE: adifIO->do_writelog()"); adifIO->do_writelog(); ADIF_WRITE = false; } else if (ADIF_READ && adifIO) { LOG_INFO("ADIF_READ: adifIO->do_readfile(%s)", adif_file_name.c_str()); adifIO->do_readfile(adif_file_name.c_str(), adif_db); ADIF_READ = false; } } return NULL; } void ADIF_RW_close(void) { ENSURE_THREAD(FLMAIN_TID); if (!ADIF_RW_thread) return; pthread_mutex_lock(&ADIF_RW_mutex); ADIF_RW_EXIT = true; LOG_INFO("%s", "Exiting ADIF_RW_thread"); pthread_cond_signal(&ADIF_RW_cond); pthread_mutex_unlock(&ADIF_RW_mutex); pthread_join(*ADIF_RW_thread, NULL); delete ADIF_RW_thread; ADIF_RW_thread = 0; LOG_INFO("%s", "ADIF_RW_thread closed"); } static void ADIF_RW_init() { ENSURE_THREAD(FLMAIN_TID); if (ADIF_RW_thread) return; ADIF_RW_thread = new pthread_t; ADIF_RW_EXIT = false; if (pthread_create(ADIF_RW_thread, NULL, ADIF_RW_loop, NULL) != 0) { LOG_PERROR("pthread_create"); return; } #ifdef __WIN32__ MilliSleep(100); #else MilliSleep(10); #endif } fldigi-4.2.05/src/main.cxx0000664000175000017500000020677314611711171012241 00000000000000// ---------------------------------------------------------------------------- // Digital Modem Program for the Fast Light Toolkit // // Copyright 2006-2010, Dave Freese, W1HKJ // Copyright 2007-2010, Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // // Please report all bugs and problems to fldigi-devel@lists.sourceforge.net. // ---------------------------------------------------------------------------- #include //++++++++++++++++++ #include extern Fl_Scroll *wefax_pic_rx_scroll; #include #include #include #include #include #include #if !defined(__WOE32__) && !defined(__APPLE__) # include # include #endif #ifdef __MINGW32__ # include "compat.h" #endif #include #if HAVE_SYS_UTSNAME_H # include #endif #include #include #include #include #include #include #include #include #include #ifdef __MINGW32__ # define dirent fl_dirent_no_thanks #endif #include #ifdef __WOE32__ # if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 # undef dirent # include # endif #else # include #endif #include "gettext.h" #include "main.h" #include "waterfall.h" #include "trx.h" #include "soundconf.h" #include "fl_digi.h" #include "rigio.h" #include "globals.h" #include "confdialog.h" #include "rxmon.h" #include "configuration.h" #include "macros.h" #include "status.h" #include "fileselect.h" #include "timeops.h" #include "debug.h" #include "pskrep.h" #include "notify.h" #include "logbook.h" #include "dxcc.h" #include "newinstall.h" #include "Viewer.h" #include "kmlserver.h" #include "data_io.h" #include "maclogger.h" #include "psm/psm.h" #include "fd_logger.h" #include "n3fjp_logger.h" #include "dx_cluster.h" #include "dx_dialog.h" #include "record_loader.h" #if USE_HAMLIB #include "rigclass.h" #endif #include "rigsupport.h" #include "log.h" #include "qrunner.h" #include "stacktrace.h" #include "xmlrpc.h" #include "icons.h" #include "nullmodem.h" #include "spectrum_viewer.h" #include "contest.h" #include "counties.h" #include "cmedia.h" #if BENCHMARK_MODE #include "benchmark.h" #endif using namespace std; string appname; string scDevice[2]; string BaseDir = ""; string HomeDir = ""; string RigsDir = ""; string ScriptsDir = ""; string PalettesDir = ""; string LogsDir = ""; string PicsDir = ""; string AvatarDir = ""; string HelpDir = ""; string MacrosDir = ""; string WrapDir = ""; string TalkDir = ""; string TempDir = ""; string DebugDir = ""; string LoTWDir = ""; string KmlDir = ""; string PskMailDir = ""; string AnalysisDir = ""; string FMTDir = ""; string NBEMS_dir = ""; string NBEMS_dir_default = ""; string DATA_dir = ""; string ARQ_dir = ""; string ARQ_files_dir = ""; string ARQ_recv_dir = ""; string ARQ_send = ""; string WRAP_dir = ""; string WRAP_recv_dir = ""; string WRAP_send_dir = ""; string WRAP_auto_dir = ""; string ICS_dir = ""; string ICS_msg_dir = ""; string ICS_tmp_dir = ""; string FLMSG_dir = ""; string FLMSG_dir_default = ""; string FLMSG_WRAP_dir = ""; string FLMSG_WRAP_recv_dir = ""; string FLMSG_WRAP_send_dir = ""; string FLMSG_WRAP_auto_dir = ""; string FLMSG_ICS_dir = ""; string FLMSG_ICS_msg_dir = ""; string FLMSG_ICS_tmp_dir = ""; string PskMailFile; string ArqFilename; string xmlfname; PTT *push2talk = (PTT *)0; #if USE_HAMLIB Rig *xcvr = (Rig *)0; #endif bool tlfio = false; cLogfile *logfile = 0; cLogfile *Maillogfile = (cLogfile *)0; FILE *server; FILE *client; bool mailserver = false, mailclient = false, arqmode = false; static bool show_cpucheck = false; static bool iconified = false; string option_help, version_text, build_text; qrunner *cbq[NUM_QRUNNER_THREADS]; void arqchecks(void); void generate_option_help(void); int parse_args(int argc, char **argv, int& idx); void generate_version_text(void); void debug_exec(char** argv); void set_platform_ui(void); double speed_test(int converter, unsigned repeat); static void setup_signal_handlers(void); static void checkdirectories(void); static void arg_error(const char* name, const char* arg, bool missing); static void fatal_error(string); /* from: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx BOOL WINAPI CreateProcess( _In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCTSTR lpCurrentDirectory, _In_ LPSTARTUPINFO lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation ); Parameters lpApplicationName [in, optional] The name of the module to be executed. This module can be a Windows-based application. It can be some other type of module (for example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer. The string can specify the full path and file name of the module to execute or it can specify a partial name. In the case of a partial name, the function uses the current drive and current directory to complete the specification. The function will not use the search path. This parameter must include the file name extension; no default extension is assumed. The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space–delimited token in the lpCommandLine string. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise, the file name is ambiguous. For example, consider the string "c:\program files\sub dir\program name". This string can be interpreted in a number of ways. The system tries to interpret the possibilities in the following order: c:\program.exe files\sub dir\program name c:\program files\sub.exe dir\program name c:\program files\sub dir\program.exe name c:\program files\sub dir\program name.exe If the executable module is a 16-bit application, lpApplicationName should be NULL, and the string pointed to by lpCommandLine should specify the executable module as well as its arguments. To run a batch file, you must start the command interpreter; set lpApplicationName to cmd.exe and set lpCommandLine to the following arguments: /c plus the name of the batch file. lpCommandLine [in, out, optional] The command line to be executed. The maximum length of this string is 32,768 characters, including the Unicode terminating null character. If lpApplicationName is NULL, the module name portion of lpCommandLine is limited to MAX_PATH characters. The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation. The lpCommandLine parameter can be NULL. In that case, the function uses the string pointed to by lpApplicationName as the command line. If both lpApplicationName and lpCommandLine are non-NULL, the null-terminated string pointed to by lpApplicationName specifies the module to execute, and the n ull-terminated string pointed to by lpCommandLine specifies the command line. The new process can use GetCommandLine to retrieve the entire command line. Console processes written in C can use the argc and argv arguments to parse the command line. Because argv[0] is the module name, C programmers generally repeat the module name as the first token in the command line. If lpApplicationName is NULL, the first white space–delimited token of the command line specifies the module name. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin (see the explanation for the lpApplicationName parameter). If the file name does not contain an extension, .exe is appended. Therefore, if the file name extension is .com, this parameter must include the .com extension. If the file name ends in a period (.) with no extension, or if the file name contains a path, .exe is not appended. If the file name does not contain a directory path, the system searches for the executable file in the following sequence: The directory from which the application loaded. The current directory for the parent process. The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory. The directories that are listed in the PATH environment variable. Note that this function does not search the per-application path specified by the App Paths registry key. To include this per-application path in the search sequence, use the ShellExecute function. The system adds a terminating null character to the command-line string to separate the file name from the arguments. This divides the original string into two strings for internal processing. lpProcessAttributes [in, optional] A pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle to the new process object can be inherited by child processes. If lpProcessAttributes is NULL, the handle cannot be inherited. The lpSecurityDescriptor member of the structure specifies a security descriptor for the new process. If lpProcessAttributes is NULL or lpSecurityDescriptor is NULL, the process gets a default security descriptor. The ACLs in the default security descriptor for a process come from the primary token of the creator. Windows XP: The ACLs in the default security descriptor for a process come from the primary or impersonation token of the creator. This behavior changed with Windows XP with SP2 and Windows Server 2003. lpThreadAttributes [in, optional] A pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle to the new thread object can be inherited by child processes. If lpThreadAttributes is NULL, the handle cannot be inherited. The lpSecurityDescriptor member of the structure specifies a security descriptor for the main thread. If lpThreadAttributes is NULL or lpSecurityDescriptor is NULL, the thread gets a default security descriptor. The ACLs in the default security descriptor for a thread come from the process token. Windows XP: The ACLs in the default security descriptor for a thread come from the primary or impersonation token of the creator. This behavior changed with Windows XP with SP2 and Windows Server 2003. bInheritHandles [in] If this parameter TRUE, each inheritable handle in the calling process is inherited by the new process. If the parameter is FALSE, the handles are not inherited. Note that inherited handles have the same value and access rights as the original handles. dwCreationFlags [in] The flags that control the priority class and the creation of the process. For a list of values, see Process Creation Flags. This parameter also controls the new process's priority class, which is used to determine the scheduling priorities of the process's threads. For a list of values, see GetPriorityClass. If none of the priority class flags is specified, the priority class defaults to NORMAL_PRIORITY_CLASS unless the priority class of the creating process is IDLE_PRIORITY_CLASS or BELOW_NORMAL_PRIORITY_CLASS. In this case, the child process receives the default priority class of the calling process. lpEnvironment [in, optional] A pointer to the environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process. An environment block consists of a null-terminated block of null-terminated strings. Each string is in the following form: name=value\0 Because the equal sign is used as a separator, it must not be used in the name of an environment variable. An environment block can contain either Unicode or ANSI characters. If the environment block pointed to by lpEnvironment contains Unicode characters, be sure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT. If this parameter is NULL and the environment block of the parent process contains Unicode characters, you must also ensure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT. The ANSI version of this function, CreateProcessA fails if the total size of the environment block for the process exceeds 32,767 characters. Note that an ANSI environment block is terminated by two zero bytes: one for the last string, one more to terminate the block. A Unicode environment block is terminated by four zero bytes: two for the last string, two more to terminate the block. lpCurrentDirectory [in, optional] The full path to the current directory for the process. The string can also specify a UNC path. If this parameter is NULL, the new process will have the same current drive and directory as the calling process. (This feature is provided primarily for shells that need to start an application and specify its initial drive and working directory.) lpStartupInfo [in] A pointer to a STARTUPINFO or STARTUPINFOEX structure. To set extended attributes, use a STARTUPINFOEX structure and specify EXTENDED_STARTUPINFO_PRESENT in the dwCreationFlags parameter. Handles in STARTUPINFO or STARTUPINFOEX must be closed with CloseHandle when they are no longer needed. Important The caller is responsible for ensuring that the standard handle fields in STARTUPINFO contain valid handle values. These fields are copied unchanged to the child process without validation, even when the dwFlags member specifies STARTF_USESTDHANDLES. Incorrect values can cause the child process to misbehave or crash. Use the Application Verifier runtime verification tool to detect invalid handles. lpProcessInformation [out] A pointer to a PROCESS_INFORMATION structure that receives identification information about the new process. Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed. Return value If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. Note that the function returns before the process has finished initialization. If a required DLL cannot be located or fails to initialize, the process is terminated. To get the termination status of a process, call GetExitCodeProcess. Remarks The process is assigned a process identifier. The identifier is valid until the process terminates. It can be used to identify the process, or specified in the OpenProcess function to open a handle to the process. The initial thread in the process is also assigned a thread identifier. It can be specified in the OpenThread function to open a handle to the thread. The identifier is valid until the thread terminates and can be used to uniquely identify the thread within the system. These identifiers are returned in the PROCESS_INFORMATION structure. The name of the executable in the command line that the operating system provides to a process is not necessarily identical to that in the command line that the calling process gives to the CreateProcess function. The operating system may prepend a fully qualified path to an executable name that is provided without a fully qualified path. The calling thread can use the WaitForInputIdle function to wait until the new process has finished its initialization and is waiting for user input with no input pending. This can be useful for synchronization between parent and child processes, because CreateProcess returns without waiting for the new process to finish its initialization. For example, the creating process would use WaitForInputIdle before trying to find a window associated with the new process. The preferred way to shut down a process is by using the ExitProcess function, because this function sends notification of approaching termination to all DLLs attached to the process. Other means of shutting down a process do not notify the attached DLLs. Note that when a thread calls ExitProcess, other threads of the process are terminated without an opportunity to execute any additional code (including the thread termination code of attached DLLs). For more information, see Terminating a Process. A parent process can directly alter the environment variables of a child process during process creation. This is the only situation when a process can directly change the environment settings of another process. For more information, see Changing Environment Variables. If an application provides an environment block, the current directory information of the system drives is not automatically propagated to the new process. For example, there is an environment variable named =C: whose value is the current directory on drive C. An application must manually pass the current directory information to the new process. To do so, the application must explicitly create these environment variable strings, sort them alphabetically (because the system uses a sorted environment), and put them into the environment block. Typically, they will go at the front of the environment block, due to the environment block sort order. One way to obtain the current directory information for a drive X is to make the following call: GetFullPathName("X:", ...). That avoids an application having to scan the environment block. If the full path returned is X:\, there is no need to pass that value on as environment data, since the root directory is the default current directory for drive X of a new process. When a process is created with CREATE_NEW_PROCESS_GROUP specified, an implicit call to SetConsoleCtrlHandler(NULL,TRUE) is made on behalf of the new process; this means that the new process has CTRL+C disabled. This lets shells handle CTRL+C themselves, and selectively pass that signal on to sub-processes. CTRL+BREAK is not disabled, and may be used to interrupt the process/process group. Security Remarks The first parameter, lpApplicationName, can be NULL, in which case the executable name must be in the white space–delimited string pointed to by lpCommandLine. If the executable or path name has a space in it, there is a risk that a different executable could be run because of the way the function parses spaces. The following example is dangerous because the function will attempt to run "Program.exe", if it exists, instead of "MyApp.exe". LPTSTR szCmdline = _tcsdup(TEXT("C:\\Program Files\\MyApp -L -S")); CreateProcess(NULL, szCmdline, ... ); If a malicious user were to create an application called "Program.exe" on a system, any program that incorrectly calls CreateProcess using the Program Files directory will run this application instead of the intended application. To avoid this problem, do not pass NULL for lpApplicationName. If you do pass NULL for lpApplicationName, use quotation marks around the executable path in lpCommandLine. */ void start_process(string executable) { while(executable[executable.length()-1] == ' ') executable.erase(executable.length()-1); if (!executable.empty()) { #ifdef __MINGW32__ static string cmdstr; cmdstr.assign(executable); STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); LOG_INFO("Starting external process: %s", cmdstr.c_str()); if (!CreateProcess( NULL, const_cast(cmdstr.c_str()), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); for (int i = 0; i < 5; i++) { MilliSleep(50); Fl::awake(); } // MilliSleep(100); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); LOG_INFO("Process handles closed"); #else #ifdef __APPLE__ string params = ""; size_t p = executable.find(".app/Contents/MacOS"); if (p == string::npos) { p = executable.find(".app"); if (p != string::npos) { params = executable.substr(p+4); executable.erase(p+4); if (executable[0] == '"') executable.erase(0,1); while ( (executable[executable.length()-1] == '"') || (executable[executable.length()-1] == ' ') ) executable.erase(executable.length()-1, 1); if (params[0] == '"') params.erase(0,1); while (params[0] == ' ') params.erase(0,1); DIR *dp = NULL; executable.append("/Contents/MacOS/"); dp = opendir(executable.c_str()); if (!dp) { fl_alert2("FOLDER NOT FOUND\n\n%s", executable.c_str()); return; } struct dirent *sd = NULL; sd = readdir(dp); string sds = sd->d_name; while (sds == "." || sds == "..") { sd = readdir(dp); sds = sd->d_name; } closedir(dp); executable.insert(0,"\""); executable.append(sds).append("\""); if (!params.empty()) executable.append(" ").append(params); } } #endif // __APPLE__ LOG_INFO("Start external process: %s", executable.c_str()); switch (fork()) { case -1: LOG_PERROR("fork"); // fall through default: break; case 0: execl("/bin/sh", "sh", "-c", executable.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } #endif } } void toggle_io_port_selection(int io_mode) { switch(io_mode) { case ARQ_IO: enable_arq(); progdefaults.changed = false; break; case KISS_IO: enable_kiss(); if(progdefaults.tcp_udp_auto_connect) { btn_connect_kiss_io->value(1); btn_connect_kiss_io->do_callback(); } if(progdefaults.kpsql_enabled && progdefaults.show_psm_btn) { btnPSQL->value(progdefaults.kpsql_enabled); btnPSQL->do_callback(); } progdefaults.changed = false; break; default: LOG_INFO("Unknown data io mode"); } } static void auto_start() { bool run_flamp = false; // Make sure we are in ARQ_IO mode if executing FLAMP if (!progdefaults.auto_flamp_pathname.empty() && progdefaults.flamp_auto_enable) { toggle_io_port_selection(ARQ_IO); run_flamp = true; } // A general wait to ensure FLDIGI initialization of // io ports. 1/4 to 3/4 second delay. int nloops = 0; while(nloops++ < 15) {// 3) { MilliSleep(50); Fl::awake(); // MilliSleep(250); if(arq_state() && data_io_enabled == ARQ_IO) break; // Exit early if verified. } if (!progdefaults.auto_flrig_pathname.empty() && progdefaults.flrig_auto_enable) start_process(progdefaults.auto_flrig_pathname); if (run_flamp) start_process(progdefaults.auto_flamp_pathname); if (!progdefaults.auto_fllog_pathname.empty() && progdefaults.fllog_auto_enable) start_process(progdefaults.auto_fllog_pathname); if (!progdefaults.auto_flnet_pathname.empty() && progdefaults.flnet_auto_enable) start_process(progdefaults.auto_flnet_pathname); if (!progdefaults.auto_prog1_pathname.empty() && progdefaults.prog1_auto_enable) start_process(progdefaults.auto_prog1_pathname); if (!progdefaults.auto_prog2_pathname.empty() && progdefaults.prog2_auto_enable) start_process(progdefaults.auto_prog2_pathname); if (!progdefaults.auto_prog3_pathname.empty() && progdefaults.prog3_auto_enable) start_process(progdefaults.auto_prog3_pathname); } // reset those default values that have been overriden by a command line parameter void check_overrides() { if (xmlrpc_address_override_flag) progdefaults.xmlrpc_address = override_xmlrpc_address; if (xmlrpc_port_override_flag) progdefaults.xmlrpc_port = override_xmlrpc_port; if (arq_address_override_flag) progdefaults.arq_address = override_arq_address; if (arq_port_override_flag) progdefaults.arq_port = override_arq_port; } // these functions are all started after Fl::run() is executing void delayed_startup(void *) { macros.loadDefault(); connect_to_log_server(); #ifdef __WIN32__ if (progdefaults.auto_talk) open_talker(); #else grpTalker->hide(); #endif XML_RPC_Server::start(progdefaults.xmlrpc_address.c_str(), progdefaults.xmlrpc_port.c_str()); FLRIG_start_flrig_thread(); data_io_enabled = DISABLED_IO; n3fjp_init(); arq_init(); FD_init(); DXcluster_init(); start_psm_thread(); if (progdefaults.connect_to_maclogger) maclogger_init(); data_io_enabled = progStatus.data_io_enabled; toggle_io_port_selection(data_io_enabled); disable_config_p2p_io_widgets(); notify_start(); if (progdefaults.pskrep_autostart) { if (!pskrep_start()) { LOG_ERROR("Could not start PSK reporter: %s", pskrep_error()); box_connected_to_pskrep->color(FL_WHITE); } else box_connected_to_pskrep->color(FL_GREEN); } auto_start(); if (progStatus.WK_online) { if (progStatus.WKFSK_mode) { btn_WKFSK_connect->value(1); WKFSK_connect(1); } else { btn_WKCW_connect->value(1); WKCW_connect(1); } } if (progStatus.Nav_online) { if (open_NavFSK()) btn_Nav_connect->value(1); } if (progStatus.Nav_config_online) { if (open_NavConfig()) btn_Nav_config->value(1); } if (progStatus.nanoCW_online) { if (open_nanoCW()) btn_nanoCW_connect->value(1); } if (progStatus.nanoFSK_online) { if (open_nanoIO()) btn_nanoIO_connect->value(1); } if (progStatus.useCW_KEYLINE) { if (!open_CW_KEYLINE()) progStatus.useCW_KEYLINE = false; } if (progdefaults.check_for_updates) cb_mnuCheckUpdate((Fl_Widget *)0, NULL); #if USE_PORTAUDIO try { audio_alert = 0; audio_alert = new Caudio_alert; } catch (...) { audio_alert = 0; LOG_ERROR("%s", "Failed to create audio alert object"); } if (audio_alert) LOG_INFO("%s", "Created audio alert object"); reset_audio_alerts(); #endif } std::string pname = ""; int main (int argc, char *argv[]) { pname = argv[0]; size_t pn = pname.rfind("/"); if (pn != std::string::npos) pname.erase(0, pn + 1); pn = pname.rfind("\\"); if (pn != std::string::npos) pname.erase(0, pn + 1); XmlRpc::set_pname(pname); // for KISS_IO status information program_start_time = time(0); active_modem = new NULLMODEM; string appdir = appname = argv[0]; string test_file_name; BaseDir.clear(); HomeDir.clear(); NBEMS_dir.clear(); FLMSG_dir.clear(); #ifdef __WOE32__ size_t p = appdir.rfind("fldigi.exe"); appdir.erase(p); p = appdir.find("FL_APPS\\"); if (p != string::npos) { BaseDir.assign(appdir.substr(0, p + 8)); progdefaults.flmsg_pathname.assign(BaseDir).append("flmsg.exe"); } else { BaseDir.clear(); HomeDir.clear(); NBEMS_dir.clear(); FLMSG_dir.clear(); } #else char apptemp[FL_PATH_MAX + 1]; fl_filename_absolute(apptemp, sizeof(apptemp), argv[0]); appdir.assign(apptemp); size_t p = appdir.rfind("fldigi"); if (p != string::npos) appdir.erase(p); p = appdir.find("FL_APPS/"); if (p != string::npos) { BaseDir.assign(appdir.substr(0, p + 8)); progdefaults.flmsg_pathname.assign(BaseDir).append("flmsg"); string test_dir; test_dir.assign(BaseDir).append("fldigi.files/"); DIR *isdir = opendir(test_dir.c_str()); if (isdir) { HomeDir = test_dir; closedir(isdir); } else { test_dir.assign(BaseDir).append(".fldigi/"); isdir = opendir(test_dir.c_str()); if (isdir) { HomeDir = test_dir; } else { HomeDir.clear(); } } if (!HomeDir.empty()) { test_dir.assign(BaseDir).append("NBEMS.files/"); isdir = opendir(test_dir.c_str()); if (isdir) { NBEMS_dir = test_dir; FLMSG_dir = test_dir; closedir(isdir); } else { test_dir.assign(BaseDir).append(".nbems/"); isdir = opendir(test_dir.c_str()); if (isdir) { NBEMS_dir = test_dir; FLMSG_dir = test_dir; } else { NBEMS_dir.clear(); FLMSG_dir.clear(); } } } } else { BaseDir.clear(); HomeDir.clear(); NBEMS_dir.clear(); FLMSG_dir.clear(); } #endif debug_exec(argv); CREATE_THREAD_ID(); // only call this once SET_THREAD_ID(FLMAIN_TID); for (int i = 0; i < NUM_QRUNNER_THREADS; i++) { cbq[i] = new qrunner; switch(i) { case TRX_TID: cbq[i]->attach(i, "TRX_TID"); break; case TOD_TID: cbq[i]->attach(i, "TOD_TID"); break; case QRZ_TID: cbq[i]->attach(i, "QRZ_TID"); break; case RIGCTL_TID: cbq[i]->attach(i, "RIGCTL_TID"); break; case NORIGCTL_TID: cbq[i]->attach(i, "NORIGCTL_TID"); break; case EQSL_TID: cbq[i]->attach(i, "EQSL_TID"); break; case ADIF_RW_TID: cbq[i]->attach(i, "ADIF_RW_TID"); break; case ADIF_MERGE_TID: cbq[i]->attach(i, "ADIF_MERGE_TID"); break; case XMLRPC_TID: cbq[i]->attach(i, "XMLRPC_TID"); break; case ARQ_TID: cbq[i]->attach(i, "ARQ_TID"); break; case ARQSOCKET_TID: cbq[i]->attach(i, "ARQSOCKET_TID"); break; case KISS_TID: cbq[i]->attach(i, "KISS_TID"); break; case KISSSOCKET_TID: cbq[i]->attach(i, "KISSSOCKET_TID"); break; case MACLOGGER_TID: cbq[i]->attach(i, "MACLOGGER_TID"); break; case PSM_TID: cbq[i]->attach(i, "PSM_TID"); break; case AUDIO_ALERT_TID: cbq[i]->attach(i, "AUDIO_ALERT_TID"); break; case FD_TID: cbq[i]->attach(i, "FD_TID"); break; case N3FJP_TID: cbq[i]->attach(i, "N3FJP_TID"); break; case DXCC_TID: cbq[i]->attach(i, "DXCC_TID"); break; case WKEY_TID: cbq[i]->attach(i, "WKEY_TID"); break; case ACTIVITY_TID: cbq[i]->attach(i, "ACTIVITY_TID"); break; case FLMAIN_TID: cbq[i]->attach(i, "FLMAIN_TID"); break; default: break; } } set_terminate(diediedie); setup_signal_handlers(); setlocale(LC_ALL, ""); #ifndef ENABLE_NLS setlocale(LC_TIME, ""); #endif set_platform_ui(); generate_version_text(); { char dirbuf[FL_PATH_MAX + 1]; #ifdef __WOE32__ if (BaseDir.empty()) { fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$USERPROFILE/"); BaseDir = dirbuf; } #else if (BaseDir.empty()) { fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$HOME/"); BaseDir = dirbuf; } #endif } generate_option_help(); // FL_NORMAL_SIZE = 14; int arg_idx; if (Fl::args(argc, argv, arg_idx, parse_args) != argc) arg_error(argv[0], NULL, false); if (argv_window_title.empty()) argv_window_title.assign(PACKAGE_TARNAME); #ifdef __WOE32__ if (HomeDir.empty()) HomeDir.assign(BaseDir).append("fldigi.files/"); if (PskMailDir.empty()) PskMailDir = BaseDir; if (DATA_dir.empty()) DATA_dir.assign(BaseDir).append("DATA.files/"); if (NBEMS_dir.empty()) NBEMS_dir.assign(BaseDir).append("NBEMS.files/"); if (FLMSG_dir.empty()) FLMSG_dir = NBEMS_dir; #else if (HomeDir.empty()) HomeDir.assign(BaseDir).append(".fldigi/"); if (PskMailDir.empty()) PskMailDir = BaseDir; if (DATA_dir.empty()) DATA_dir.assign(BaseDir).append("DATA.files/"); if (NBEMS_dir.empty()) NBEMS_dir.assign(BaseDir).append(".nbems/"); if (FLMSG_dir.empty()) FLMSG_dir = NBEMS_dir; #endif if (!FLMSG_dir_default.empty()) { char dirbuf[FL_PATH_MAX + 1]; if (FLMSG_dir_default[FLMSG_dir_default.length()-1] != '/') FLMSG_dir_default += '/'; fl_filename_expand(dirbuf, sizeof(dirbuf) - 1, FLMSG_dir_default.c_str()); FLMSG_dir = dirbuf; } if (!NBEMS_dir_default.empty()) { char dirbuf[FL_PATH_MAX + 1]; if (NBEMS_dir_default[NBEMS_dir_default.length()-1] != '/') NBEMS_dir_default += '/'; fl_filename_expand(dirbuf, sizeof(dirbuf) - 1, NBEMS_dir_default.c_str()); NBEMS_dir = dirbuf; } checkdirectories(); check_nbems_dirs(); check_data_dir(); try { debug::start(string(DebugDir).append("status_log.txt").c_str()); time_t t = time(NULL); LOG(debug::QUIET_LEVEL, debug::LOG_OTHER, _("%s log started on %s"), PACKAGE_STRING, ctime(&t)); LOG_THREAD_ID(); } catch (const char* error) { cerr << error << '\n'; debug::stop(); } TOD_init(); // initialize time of day thread LOG_INFO("appname: %s", appname.c_str()); LOG_INFO("%s", "Directories"); LOG_INFO("HomeDir: %s", HomeDir.c_str()); LOG_INFO("DATA_dir: %s", DATA_dir.c_str()); LOG_INFO("DebugDir: %s", DebugDir.c_str()); LOG_INFO("HelpDir: %s", HelpDir.c_str()); LOG_INFO("KmlDir: %s", KmlDir.c_str()); LOG_INFO("LogsDir: %s", LogsDir.c_str()); LOG_INFO("LoTWDir: %s", LoTWDir.c_str()); LOG_INFO("MacrosDir: %s", MacrosDir.c_str()); LOG_INFO("AnalysisDir: %s", AnalysisDir.c_str()); LOG_INFO("FMTDir: %s", FMTDir.c_str()); LOG_INFO("PalettesDir: %s", PalettesDir.c_str()); LOG_INFO("PicsDir: %s", PicsDir.c_str()); LOG_INFO("PskMailDir: %s", PskMailDir.c_str()); LOG_INFO("RigsDir: %s", RigsDir.c_str()); LOG_INFO("ScriptsDir: %s", ScriptsDir.c_str()); LOG_INFO("TalkDir: %s", TalkDir.c_str()); LOG_INFO("TempDir: %s", TempDir.c_str()); LOG_INFO("WrapDir: %s", WrapDir.c_str()); LOG_INFO("%s", "NBEMS directories"); LOG_INFO("NBEMS_dir: %s", NBEMS_dir.c_str()); LOG_INFO("ARQ_dir: %s", ARQ_dir.c_str()); LOG_INFO("ARQ_files_dir: %s", ARQ_files_dir.c_str()); LOG_INFO("ARQ_recv_dir: %s", ARQ_recv_dir.c_str()); LOG_INFO("ARQ_send: %s", ARQ_send.c_str()); LOG_INFO("WRAP_dir: %s", WRAP_dir.c_str()); LOG_INFO("WRAP_recv_dir: %s", WRAP_recv_dir.c_str()); LOG_INFO("WRAP_send_dir: %s", WRAP_send_dir.c_str()); LOG_INFO("WRAP_auto_dir: %s", WRAP_auto_dir.c_str()); LOG_INFO("ICS_dir: %s", ICS_dir.c_str()); LOG_INFO("ICS_msg_dir: %s", ICS_msg_dir.c_str()); LOG_INFO("ICS_tmp_dir: %s", ICS_tmp_dir.c_str()); LOG_INFO("%s", "FLMSG directories"); LOG_INFO("FLMSG_dir: %s", FLMSG_dir.c_str()); LOG_INFO("FLMSG_dir_default: %s", FLMSG_dir_default.c_str()); LOG_INFO("FLMSG_WRAP_dir: %s", FLMSG_WRAP_dir.c_str()); LOG_INFO("FLMSG_WRAP_recv_dir: %s", FLMSG_WRAP_recv_dir.c_str()); LOG_INFO("FLMSG_WRAP_send_dir: %s", FLMSG_WRAP_send_dir.c_str()); LOG_INFO("FLMSG_WRAP_auto_dir: %s", FLMSG_WRAP_auto_dir.c_str()); LOG_INFO("FLMSG_ICS_dir: %s", FLMSG_ICS_dir.c_str()); LOG_INFO("FLMSG_ICS_msg_dir: %s", FLMSG_ICS_msg_dir.c_str()); LOG_INFO("FLMSG_ICS_tmp_dir: %s", FLMSG_ICS_tmp_dir.c_str()); bool have_config = progdefaults.readDefaultsXML(); check_overrides(); xmlfname = HomeDir; xmlfname.append(DEFAULT_RIGXML_FILENAME); checkTLF(); Fl::lock(); // start the gui thread!! Fl::visual(FL_RGB); // insure 24 bit color operation // DST This call highly recommended by fltk 31.26.1 to enable // Xdbe on servers where double buffering does not exist for every visual. Fl::visual(FL_DOUBLE|FL_INDEX); fl_register_images(); Fl::set_fonts(0); Fl::scheme(progdefaults.ui_scheme.c_str()); font_browser = new Font_Browser; progdefaults.initFonts(); if (progdefaults.cty_dat_pathname.empty()) progdefaults.cty_dat_pathname = HomeDir; dxcc_open(string(progdefaults.cty_dat_pathname).append("cty.dat").c_str()); qsl_open(string(progdefaults.cty_dat_pathname).append("lotw1.txt").c_str(), QSL_LOTW); if (!qsl_open(string(progdefaults.cty_dat_pathname).append("eqsl.txt").c_str(), QSL_EQSL)) qsl_open(string(progdefaults.cty_dat_pathname).append("AGMemberList.txt").c_str(), QSL_EQSL); progStatus.loadLastState(); create_fl_digi_main(argc, argv); if (!have_config || show_cpucheck) { double speed = speed_test(SRC_SINC_FASTEST, 8); if (speed > 150.0) { // fast progdefaults.slowcpu = false; progdefaults.sample_converter = SRC_SINC_BEST_QUALITY; } else if (speed > 60.0) { // ok progdefaults.slowcpu = false; progdefaults.sample_converter = SRC_SINC_MEDIUM_QUALITY; } else if (speed > 15.0) { // slow progdefaults.slowcpu = true; progdefaults.sample_converter = SRC_SINC_FASTEST; } else { // recycle me progdefaults.slowcpu = true; progdefaults.sample_converter = SRC_LINEAR; } LOG_INFO("CPU speed factor=%f: setting slowcpu=%s, sample_converter=\"%s\"", speed, progdefaults.slowcpu ? "true" : "false", src_get_name(progdefaults.sample_converter)); } if (progdefaults.XmlRigFilename.empty()) progdefaults.XmlRigFilename = xmlfname; #if BENCHMARK_MODE return setup_benchmark(); #endif FSEL::create(); #if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 3 listbox_charset_status->hide(); #else listbox_charset_status->show(); #endif populate_charset_listbox(); set_default_charset(); setTabColors(); progdefaults.testCommPorts(); init_hids(); #if USE_HAMLIB xcvr = new Rig(); #endif push2talk = new PTT(); progdefaults.setDefaults(); atexit(sound_close); sound_init(); progdefaults.initInterface(); trx_start(); #if USE_PORTAUDIO try { audio_alert = 0; audio_alert = new Caudio_alert; } catch (...) { audio_alert = 0; LOG_ERROR("%s", "Failed to create audio alert object"); } if (audio_alert) LOG_INFO("%s", "Created audio alert object"); #endif if (!have_config) { show_wizard(argc, argv); Fl_Window* w; while ((w = Fl::first_window()) && w->visible()) Fl::wait(); } dlgViewer = createViewer(); dxcluster_viewer = dxc_window(); dxcluster_viewer->hide(); if (!dlgLogbook) create_logbook_dialogs(); LOGBOOK_colors_font(); rxaudio_dialog = make_rxaudio_dialog(); rxaudio_dialog->hide(); if( progdefaults.kml_save_dir.empty() ) { progdefaults.kml_save_dir = KmlDir ; } kml_init(true); if (progdefaults.kml_purge_on_startup) { KmlServer::GetInstance()->Reset(); } // OS X will prevent the main window from being resized if we change its // size *after* it has been shown. With some X11 window managers, OTOH, // the main window will not be restored at its exact saved position if // we move it *after* it has been shown. #ifndef __APPLE__ progStatus.initLastState(); fl_digi_main->show(argc, argv); # ifndef __WIN32__ // See https://groups.google.com/g/fltkgeneral/c/hcjV-rgjHWM // read in the current window hints, then modify them to allow icon transparency XWMHints* hints = XGetWMHints(fl_display, fl_xid(fl_digi_main)); hints->flags |= IconMaskHint; // ensure transparency mask is enabled for the XPM icon hints->icon_mask |= IconPixmapHint; XSetWMHints(fl_display, fl_xid(fl_digi_main), hints); XFree(hints); # endif #else # if FLDIGI_FLTK_API_MAJOR == 1 && FLDIGI_FLTK_API_MINOR < 4 fl_digi_main->show(argc, argv); progStatus.initLastState(); # else progStatus.initLastState(); fl_digi_main->show(argc, argv); # endif #endif if (iconified) for (Fl_Window* w = Fl::first_window(); w; w = Fl::next_window(w)) w->iconize(); update_main_title(); mode_browser = new Mode_Browser; clearQSO(); Fl::add_timeout(.25, delayed_startup); Fl::set_color(FL_SELECTION_COLOR, 0, 0, 128); return Fl::run(); } void exit_process() { LOG_INFO("Close Spectrum dialog"); close_spectrum_viewer(); LOG_INFO("Stop KML server"); if (progdefaults.kml_enabled) KmlServer::Exit(); LOG_INFO("Stop PSM processing"); stop_psm_thread(); LOG_INFO("Stop ARQ processing"); arq_close(); LOG_INFO("Close FD dialog"); FD_close(); LOG_INFO("Stop DX cluster i/o"); DXcluster_close(); LOG_INFO("Stop KISS processing"); kiss_close(false); LOG_INFO("Stop MacLogger i/o"); maclogger_close(); LOG_INFO("Stop xmlrpc processing"); XML_RPC_Server::stop(); LOG_INFO("Stop PSK reporter processing"); if (progdefaults.usepskrep) pskrep_stop(); LOG_INFO("Detach/delete qrunner threads"); for (int i = 0; i < NUM_QRUNNER_THREADS; i++) { LOG_INFO("thread %d", i); cbq[i]->detach(); delete cbq[i]; } LOG_INFO("FSEL::destroy()"); FSEL::destroy(); } void generate_option_help(void) { ostringstream help; string disp_base_dir = BaseDir; #ifdef __WOE32__ size_t p = 0; while ((p = disp_base_dir.find("/")) != string::npos) disp_base_dir[p] = '\\'; #endif help << "Usage:\n" << " " << PACKAGE_NAME << " [option...]\n\n"; help << PACKAGE_NAME << " options:\n\n" #if !defined(__WOE32__) << " --home-dir DIRECTORY\n" << " Set the home directory to full pathname of DIRECTORY\n" << " fldigi will put the file stores\n" << " .fldigi.files, and .nbems.files\n" << " in this directory\n" << " The default is: " << disp_base_dir << "\n\n" << " --config-dir DIRECTORY\n" << " Look for configuration files in DIRECTORY\n" << " The default is: " << disp_base_dir << ".fldigi/\n\n" #else << " --home-dir FOLDER\n" << " Set the home folder to full pathname of FOLDER\n" << " fldigi will put the file stores\n" << " fldigi.files, and nbems.files\n" << " in this folder\n" << " The default is: " << disp_base_dir << "\n\n" << " --config-dir FOLDER\n" << " Look for configuration files in FOLDER\n" << " The default is: " << disp_base_dir << "fldigi.files\\\n\n" #endif #if !defined(__WOE32__) && !defined(__APPLE__) << " --rx-ipc-key KEY\n" << " Set the receive message queue key\n" << " May be given in hex if prefixed with \"0x\"\n" << " The default is: " << progdefaults.rx_msgid << " or 0x" << hex << progdefaults.rx_msgid << dec << "\n\n" << " --tx-ipc-key KEY\n" << " Set the transmit message queue key\n" << " May be given in hex if prefixed with \"0x\"\n" << " The default is: " << progdefaults.tx_msgid << " or 0x" << hex << progdefaults.tx_msgid << dec << "\n\n" #endif << " --enable-io-port <" << ARQ_IO << "|" << KISS_IO << "> ARQ=" << ARQ_IO << " KISS=" << KISS_IO << "\n" << " Select the active IO Port\n" << " The default is: " << progdefaults.data_io_enabled << "\n\n" << " --kiss-server-address HOSTNAME\n" << " Set the KISS TCP/UDP server address\n" << " The default is: " << progdefaults.kiss_address << "\n\n" << " --kiss-server-port-io I/O PORT\n" << " Set the KISS TCP/UDP server I/O port\n" << " The default is: " << progdefaults.kiss_io_port << "\n\n" << " --kiss-server-port-o Output PORT\n" << " Set the KISS UDP server output port\n" << " The default is: " << progdefaults.kiss_out_port << "\n\n" << " --kiss-server-dual-port Dual Port Use (0=disable / 1=enable)\n" << " Set the KISS UDP server dual port flag\n" << " The default is: " << progdefaults.kiss_dual_port_enabled << "\n\n" << " --arq-server-address HOSTNAME\n" << " Set the ARQ TCP server address\n" << " The default is: " << progdefaults.arq_address << "\n\n" << " --arq-server-port PORT\n" << " Set the ARQ TCP server port\n" << " The default is: " << progdefaults.arq_port << "\n\n" << " --flmsg-dir DIRECTORY\n" << " Look for flmsg files in DIRECTORY\n" << " The default is " << FLMSG_dir_default << "\n\n" << " --auto-dir DIRECTORY\n" << " Look for auto-send files in DIRECTORY\n" << " The default is " << HomeDir << "/autosend" << "\n\n" << " --xmlrpc-server-address HOSTNAME\n" << " Set the XML-RPC server address\n" << " The default is: " << progdefaults.xmlrpc_address << "\n\n" << " --xmlrpc-server-port PORT\n" << " Set the XML-RPC server port\n" << " The default is: " << progdefaults.xmlrpc_port << "\n\n" << " --xmlrpc-allow REGEX\n" << " Allow only the methods whose names match REGEX\n\n" << " --xmlrpc-deny REGEX\n" << " Allow only the methods whose names don't match REGEX\n\n" << " --xmlrpc-list\n" << " List all available methods\n\n" #if BENCHMARK_MODE << " --benchmark-modem ID\n" << " Specify the modem\n" << " Default: " << mode_info[benchmark.modem].sname << "\n\n" << " --benchmark-frequency FREQ\n" << " Specify the modem frequency\n" << " Default: " << benchmark.freq << "\n\n" << " --benchmark-afc BOOLEAN\n" << " Set modem AFC\n" << " Default: " << benchmark.afc << " (" << boolalpha << benchmark.afc << noboolalpha << ")\n\n" << " --benchmark-squelch BOOLEAN\n" << " Set modem squelch\n" << " Default: " << benchmark.sql << " (" << boolalpha << benchmark.sql << noboolalpha << ")\n\n" << " --benchmark-squelch-level LEVEL\n" << " Set modem squelch level\n" << " Default: " << benchmark.sqlevel << " (%)\n\n" << " --benchmark-input INPUT\n" << " Specify the input\n" << " Must be a positive integer indicating the number of samples\n" " of silence to generate as the input" ", or a filename containing\n" " non-digit characters" "\n\n" << " --benchmark-output FILE\n" << " Specify the output data file\n" << " Default: decoder output is discarded\n\n" << " --benchmark-src-ratio RATIO\n" << " Specify the sample rate conversion ratio\n" << " Default: 1.0 (input is not resampled)\n\n" << " --benchmark-src-type TYPE\n" << " Specify the sample rate conversion type\n" << " Default: " << benchmark.src_type << " (" << src_get_name(benchmark.src_type) << ")\n\n" #endif << " --cpu-speed-test\n" << " Perform the CPU speed test, show results in the event log\n" << " and possibly change options.\n\n" << " --wfall-only\n" << " Hide all controls but the waterfall\n\n" << " --debug-level LEVEL\n" << " Set the event log verbosity\n\n" << " --version\n" << " Print version information\n\n" << " --build-info\n" << " Print build information\n\n" << " --help\n" << " Print this option help\n\n"; // Fl::help looks ugly so we'll write our own help << "Standard FLTK options:\n\n" << " -bg COLOR, -background COLOR\n" << " Set the background color\n" << " -bg2 COLOR, -background2 COLOR\n" << " Set the secondary (text) background color\n\n" << " -di DISPLAY, -display DISPLAY\n" << " Set the X display to use DISPLAY,\n" << " format is ``host:n.n''\n\n" << " -dn, -dnd or -nodn, -nodnd\n" << " Enable or disable drag and drop copy and paste in text fields\n\n" << " -fg COLOR, -foreground COLOR\n" << " Set the foreground color\n\n" << " -g GEOMETRY, -geometry GEOMETRY\n" << " Set the initial window size and position\n" << " GEOMETRY format is ``WxH+X+Y''\n" << " ** " << PACKAGE_NAME << " may override this setting **\n\n" << " -i, -iconic\n" << " Start " << PACKAGE_NAME << " in iconified state\n\n" << " -k, -kbd or -nok, -nokbd\n" << " Enable or disable visible keyboard focus in non-text widgets\n\n" << " -na CLASSNAME, -name CLASSNAME\n" << " Set the window class to CLASSNAME\n\n" << " -ti WINDOWTITLE, -title WINDOWTITLE\n" << " Set the window title\n\n"; help << "Additional UI options:\n\n" << " --font FONT[:SIZE]\n" << " Set the widget font and (optionally) size\n" << " The default is: " << Fl::get_font(FL_HELVETICA) << ':' << FL_NORMAL_SIZE << "\n\n" ; option_help = help.str(); } void exit_cb(void*) { fl_digi_main->do_callback(); } int parse_args(int argc, char **argv, int& idx) { // Only handle long options if (!(strlen(argv[idx]) >= 2 && strncmp(argv[idx], "--", 2) == 0)) { // Store the window title. We may need this early in the initialisation // process, before FLTK uses it to set the main window title. if (argv_window_title.empty() && argc > idx && (!strcmp(argv[idx], "-ti") || !strcmp(argv[idx], "-title"))) argv_window_title = argv[idx + 1]; else if (!strcmp(argv[idx], "-i") || !strcmp(argv[idx], "-iconic")) iconified = true; return 0; } enum { OPT_ZERO, #ifndef __WOE32__ OPT_RX_IPC_KEY, OPT_TX_IPC_KEY, #endif OPT_HOME_DIR, OPT_CONFIG_DIR, OPT_ARQ_ADDRESS, OPT_ARQ_PORT, OPT_SHOW_CPU_CHECK, OPT_FLMSG_DIR, OPT_NBEMS_DIR, OPT_AUTOSEND_DIR, OPT_CONFIG_XMLRPC_ADDRESS, OPT_CONFIG_XMLRPC_PORT, OPT_CONFIG_XMLRPC_ALLOW, OPT_CONFIG_XMLRPC_DENY, OPT_CONFIG_XMLRPC_LIST, OPT_CONFIG_KISS_ADDRESS, OPT_CONFIG_KISS_PORT_IO, OPT_CONFIG_KISS_PORT_O, OPT_CONFIG_KISS_DUAL_PORT, OPT_ENABLE_IO_PORT, #if BENCHMARK_MODE OPT_BENCHMARK_MODEM, OPT_BENCHMARK_AFC, OPT_BENCHMARK_SQL, OPT_BENCHMARK_SQLEVEL, OPT_BENCHMARK_FREQ, OPT_BENCHMARK_INPUT, OPT_BENCHMARK_OUTPUT, OPT_BENCHMARK_SRC_RATIO, OPT_BENCHMARK_SRC_TYPE, #endif OPT_FONT, OPT_WFALL_HEIGHT, OPT_WINDOW_WIDTH, OPT_WINDOW_HEIGHT, OPT_WFALL_ONLY, OPT_RX_ONLY, #if USE_PORTAUDIO OPT_FRAMES_PER_BUFFER, #endif OPT_DEBUG_LEVEL, OPT_EXIT_AFTER, OPT_DEPRECATED, OPT_HELP, OPT_VERSION, OPT_BUILD_INFO }; static const char shortopts[] = ":"; static const struct option longopts[] = { #ifndef __WOE32__ { "rx-ipc-key", 1, 0, OPT_RX_IPC_KEY }, { "tx-ipc-key", 1, 0, OPT_TX_IPC_KEY }, #endif { "home-dir", 1, 0, OPT_HOME_DIR }, { "config-dir", 1, 0, OPT_CONFIG_DIR }, { "arq-server-address", 1, 0, OPT_ARQ_ADDRESS }, { "arq-server-port", 1, 0, OPT_ARQ_PORT }, { "flmsg-dir", 1, 0, OPT_FLMSG_DIR }, { "nbems-dir", 1, 0, OPT_NBEMS_DIR }, { "auto-dir", 1, 0, OPT_AUTOSEND_DIR }, { "cpu-speed-test", 0, 0, OPT_SHOW_CPU_CHECK }, { "enable-io-port", 1, 0, OPT_ENABLE_IO_PORT }, { "kiss-server-address", 1, 0, OPT_CONFIG_KISS_ADDRESS }, { "kiss-server-port-io", 1, 0, OPT_CONFIG_KISS_PORT_IO }, { "kiss-server-port-o", 1, 0, OPT_CONFIG_KISS_PORT_O }, { "kiss-server-dual-port", 1, 0, OPT_CONFIG_KISS_DUAL_PORT }, { "xmlrpc-server-address", 1, 0, OPT_CONFIG_XMLRPC_ADDRESS }, { "xmlrpc-server-port", 1, 0, OPT_CONFIG_XMLRPC_PORT }, { "xmlrpc-allow", 1, 0, OPT_CONFIG_XMLRPC_ALLOW }, { "xmlrpc-deny", 1, 0, OPT_CONFIG_XMLRPC_DENY }, { "xmlrpc-list", 0, 0, OPT_CONFIG_XMLRPC_LIST }, #if BENCHMARK_MODE { "benchmark-modem", 1, 0, OPT_BENCHMARK_MODEM }, { "benchmark-frequency", 1, 0, OPT_BENCHMARK_FREQ }, { "benchmark-afc", 1, 0, OPT_BENCHMARK_AFC }, { "benchmark-squelch", 1, 0, OPT_BENCHMARK_SQL }, { "benchmark-squelch-level", 1, 0, OPT_BENCHMARK_SQLEVEL }, { "benchmark-input", 1, 0, OPT_BENCHMARK_INPUT }, { "benchmark-output", 1, 0, OPT_BENCHMARK_OUTPUT }, { "benchmark-src-ratio", 1, 0, OPT_BENCHMARK_SRC_RATIO }, { "benchmark-src-type", 1, 0, OPT_BENCHMARK_SRC_TYPE }, #endif { "font", 1, 0, OPT_FONT }, { "wfall-height", 1, 0, OPT_WFALL_HEIGHT }, { "window-width", 1, 0, OPT_WINDOW_WIDTH }, { "window-height", 1, 0, OPT_WINDOW_HEIGHT }, { "wfall-only", 0, 0, OPT_WFALL_ONLY }, { "wo", 0, 0, OPT_WFALL_ONLY }, { "rx-only", 0, 0, OPT_RX_ONLY }, { "ro", 0, 0, OPT_RX_ONLY }, #if USE_PORTAUDIO { "frames-per-buffer",1, 0, OPT_FRAMES_PER_BUFFER }, #endif { "exit-after", 1, 0, OPT_EXIT_AFTER }, { "debug-level", 1, 0, OPT_DEBUG_LEVEL }, { "help", 0, 0, OPT_HELP }, { "version", 0, 0, OPT_VERSION }, { "build-info", 0, 0, OPT_BUILD_INFO }, { 0 } }; int longindex; optind = idx; opterr = 0; int c = getopt_long(argc, argv, shortopts, longopts, &longindex); switch (c) { case -1: return 0; case 0: // handle options with non-0 flag here return 0; #if !defined(__WOE32__) && !defined(__APPLE__) case OPT_RX_IPC_KEY: case OPT_TX_IPC_KEY: { errno = 0; int key = strtol(optarg, NULL, (strncasecmp(optarg, "0x", 2) ? 10 : 16)); if (errno || key <= 0) cerr << "Hmm, " << key << " doesn't look like a valid IPC key\n"; if (c == OPT_RX_IPC_KEY) progdefaults.rx_msgid = key; else progdefaults.tx_msgid = key; } break; #endif case OPT_HOME_DIR: { char buf[FL_PATH_MAX + 1]; fl_filename_absolute(buf, sizeof(buf) - 1, optarg); BaseDir = buf; } if (*BaseDir.rbegin() != '/') BaseDir += '/'; break; case OPT_CONFIG_DIR: { char buf[FL_PATH_MAX + 1]; fl_filename_absolute(buf, sizeof(buf) - 1, optarg); HomeDir = buf; } if (*HomeDir.rbegin() != '/') HomeDir += '/'; break; case OPT_ARQ_ADDRESS: override_arq_address = optarg; arq_address_override_flag = true; break; case OPT_ARQ_PORT: override_arq_port = optarg; arq_port_override_flag = true; break; case OPT_FLMSG_DIR: FLMSG_dir_default = optarg; break; case OPT_NBEMS_DIR: NBEMS_dir_default = optarg; break; case OPT_AUTOSEND_DIR: FLMSG_WRAP_auto_dir = optarg; break; case OPT_ENABLE_IO_PORT: if(optarg) { switch(atoi(optarg)) { case ARQ_IO: progdefaults.data_io_enabled = ARQ_IO; override_data_io_enabled = ARQ_IO; arq_address_override_flag = true; break; case KISS_IO: progdefaults.data_io_enabled = KISS_IO; override_data_io_enabled = KISS_IO; kiss_address_override_flag = true; break; } } break; case OPT_CONFIG_KISS_ADDRESS: progdefaults.kiss_address = optarg; override_kiss_address = optarg; kiss_address_override_flag = true; break; case OPT_CONFIG_KISS_PORT_IO: progdefaults.kiss_io_port = optarg; override_kiss_io_port = optarg; kiss_address_override_flag = true; break; case OPT_CONFIG_KISS_PORT_O: progdefaults.kiss_out_port = optarg; override_kiss_out_port = optarg; kiss_address_override_flag = true; break; case OPT_CONFIG_KISS_DUAL_PORT: if((optarg) && atoi(optarg)) { progdefaults.kiss_dual_port_enabled = true; override_kiss_dual_port_enabled = true; kiss_address_override_flag = true; } else { progdefaults.kiss_dual_port_enabled = false; override_kiss_dual_port_enabled = false; kiss_address_override_flag = true; } break; case OPT_CONFIG_XMLRPC_ADDRESS: override_xmlrpc_address = optarg; xmlrpc_address_override_flag = true; break; case OPT_CONFIG_XMLRPC_PORT: override_xmlrpc_port = optarg; xmlrpc_port_override_flag = true; break; case OPT_CONFIG_XMLRPC_ALLOW: progdefaults.xmlrpc_allow = optarg; break; case OPT_CONFIG_XMLRPC_DENY: if (!progdefaults.xmlrpc_allow.empty()) cerr << "W: --" << longopts[longindex].name << " cannot be used together with --" << longopts[OPT_CONFIG_XMLRPC_ALLOW-1].name << " and will be ignored\n"; else progdefaults.xmlrpc_deny = optarg; break; case OPT_CONFIG_XMLRPC_LIST: XML_RPC_Server::list_methods(cout); exit(EXIT_SUCCESS); #if BENCHMARK_MODE case OPT_BENCHMARK_MODEM: benchmark.modem = strtol(optarg, NULL, 10); if (!(benchmark.modem >= 0 && benchmark.modem < NUM_MODES)) { fatal_error(_("Bad modem id")); } break; case OPT_BENCHMARK_FREQ: benchmark.freq = strtol(optarg, NULL, 10); if (benchmark.freq < 0) { fatal_error(_("Bad frequency")); } break; case OPT_BENCHMARK_AFC: benchmark.afc = strtol(optarg, NULL, 10); break; case OPT_BENCHMARK_SQL: benchmark.sql = strtol(optarg, NULL, 10); break; case OPT_BENCHMARK_SQLEVEL: benchmark.sqlevel = strtod(optarg, NULL); break; case OPT_BENCHMARK_INPUT: benchmark.input = optarg; break; case OPT_BENCHMARK_OUTPUT: benchmark.output = optarg; break; case OPT_BENCHMARK_SRC_RATIO: benchmark.src_ratio = strtod(optarg, NULL); break; case OPT_BENCHMARK_SRC_TYPE: benchmark.src_type = strtol(optarg, NULL, 10); break; #endif case OPT_FONT: { char *p; if ((p = strchr(optarg, ':'))) { *p = '\0'; FL_NORMAL_SIZE = strtol(p + 1, 0, 10); } } Fl::set_font(FL_HELVETICA, optarg); break; // case OPT_WFALL_HEIGHT: // progdefaults.wfheight = strtol(optarg, NULL, 10); // break; // case OPT_WINDOW_WIDTH: // WNOM = strtol(optarg, NULL, 10); // break; // case OPT_WINDOW_HEIGHT: // HNOM = strtol(optarg, NULL, 10); // break; #if USE_PORTAUDIO case OPT_FRAMES_PER_BUFFER: progdefaults.PortFramesPerBuffer = strtol(optarg, 0, 10); break; #endif // USE_PORTAUDIO case OPT_EXIT_AFTER: Fl::add_timeout(strtod(optarg, 0), exit_cb); break; case OPT_WFALL_ONLY: bWF_only = true; break; case OPT_RX_ONLY: rx_only = true; break; case OPT_SHOW_CPU_CHECK: show_cpucheck = true; break; case OPT_DEBUG_LEVEL: { int v = strtol(optarg, 0, 10); debug::level = (debug::level_e)CLAMP(v, 0, debug::LOG_NLEVELS-1); } break; case OPT_DEPRECATED: cerr << "W: the --" << longopts[longindex].name << " option has been deprecated and will be removed in a future version\n"; break; case OPT_HELP: cout << option_help; exit(EXIT_SUCCESS); case OPT_VERSION: cout << version_text; exit(EXIT_SUCCESS); case OPT_BUILD_INFO: cout << build_text; exit(EXIT_SUCCESS); case '?': case ':': default: arg_error(argv[0], argv[idx], (c == ':')); } // Increment idx by the number of args we used and return that number. // We must check whether the option argument is in the same argv element // as the option name itself, i.e., --opt=arg. c = longopts[longindex].has_arg ? 2 : 1; if (c == 2) { string arg = argv[idx]; string::size_type p; if ((p = arg.rfind(optarg)) != string::npos && arg[p-1] == '=') c = 1; } idx += c; return c; } void generate_version_text(void) { version_text.assign(PACKAGE_STRING "\nCopyright (C) 2007-2010 " PACKAGE_AUTHORS ".\n"); version_text.append(_("License GPLv3+: GNU GPL version 3 or later " "\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n")); ostringstream s; s << "Build information:\n"; s << " built : " << BUILD_DATE << " by " << BUILD_USER << '@' << BUILD_HOST << " on " << BUILD_BUILD_PLATFORM << " for " << BUILD_TARGET_PLATFORM << "\n\n" << " configure flags: " << BUILD_CONFIGURE_ARGS << "\n\n" << " compiler : " << BUILD_COMPILER << "\n\n" << " compiler flags : " << FLDIGI_BUILD_CXXFLAGS << "\n\n" << " linker flags : " << FLDIGI_BUILD_LDFLAGS << "\n\n" << " libraries : " "FLTK " FLTK_BUILD_VERSION "\n" << " " "libsamplerate " << SAMPLERATE_BUILD_VERSION "\n"; s << " " "libsndfile " << SNDFILE_BUILD_VERSION "\n"; #if USE_PORTAUDIO s << " " "PortAudio " << PORTAUDIO_BUILD_VERSION "\n"; #endif #if USE_PULSEAUDIO s << " " "PulseAudio " << PULSEAUDIO_BUILD_VERSION "\n"; #endif #if USE_HAMLIB s << " " "Hamlib " << HAMLIB_BUILD_VERSION "\n"; #endif s << "\nRuntime information:\n"; struct utsname u; if (uname(&u) != -1) { s << " system : " << u.sysname << ' ' << u.nodename << ' ' << u.release << ' ' << u.version << ' ' << u.machine << "\n\n"; } s << " libraries : " << src_get_version() << '\n'; char sndfile_version[32]; sf_command(NULL, SFC_GET_LIB_VERSION, sndfile_version, sizeof(sndfile_version)); s << " " << sndfile_version << '\n'; #if USE_PORTAUDIO s << " " << Pa_GetVersionText() << ' ' << Pa_GetVersion() << '\n'; #endif #if USE_PULSEAUDIO s << " " << "Pulseaudio " << pa_get_library_version() << '\n'; #endif #if USE_HAMLIB s << " " << hamlib_version << '\n'; #endif build_text = s.str(); } // When debugging is enabled, reexec with malloc debugging hooks enabled, unless // the env var FLDIGI_NO_EXEC is set, or our parent process is gdb. void debug_exec(char** argv) { #if !defined(NDEBUG) && defined(__GLIBC__) if (getenv("FLDIGI_NO_EXEC")) return; char ppath[32], lname[32]; ssize_t n; snprintf(ppath, sizeof(ppath), "/proc/%u/exe", getppid()); if ((n = readlink(ppath, lname, sizeof(lname))) > 0) { lname[n] = '\0'; if (strstr(lname, "gdb")) { cerr << "Not using malloc debugging hooks\n"; return; } } setenv("FLDIGI_NO_EXEC", "1", 0); setenv("MALLOC_CHECK_", "3", 0); setenv("MALLOC_PERTURB_", "42", 0); if (execvp(*argv, argv) == -1) perror("execvp"); #endif } void set_platform_ui(void) { #if defined(__APPLE__) FL_NORMAL_SIZE = 12; progdefaults.WaterfallFontsize = 12; progdefaults.RxFontsize = 12; progdefaults.TxFontsize = 12; #elif defined(__WOE32__) Fl::set_font(FL_HELVETICA, "Tahoma"); FL_NORMAL_SIZE = 11; progdefaults.WaterfallFontnbr = FL_HELVETICA; progdefaults.WaterfallFontsize = 12; progdefaults.RxFontsize = 12; progdefaults.TxFontsize = 12; #else FL_NORMAL_SIZE = 12; #endif } // Convert 1 second of 1-channel silence from IN_RATE Hz to OUT_RATE Hz, // Repeat test "repeat" times. Return (repeat / elapsed_time), // the faster-than-realtime factor averaged over "repeat" runs. // Some figures for SRC_SINC_FASTEST: // Pentium 4 2.8GHz: 70 // Pentium 3 550MHz: 13 // UltraSparc II 270MHz: 3.5 // Atom N280 1.66GHz: 17.7 #define IN_RATE 48000 #define OUT_RATE 8000 double speed_test(int converter, unsigned repeat) { float input_frames[IN_RATE]; float output_frames[OUT_RATE]; SRC_DATA src; src.src_ratio = (double)OUT_RATE / IN_RATE; src.input_frames = IN_RATE; src.output_frames = OUT_RATE; src.data_in = &input_frames[0]; src.data_out = &output_frames[0]; memset(input_frames, 0, sizeof(input_frames)); // warm up src_simple(&src, converter, 1); struct timespec t0, t1; #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t0); #else clock_gettime(CLOCK_REALTIME, &t0); #endif for (unsigned i = 0; i < repeat; i++) src_simple(&src, converter, 1); #ifdef _POSIX_MONOTONIC_CLOCK clock_gettime(CLOCK_MONOTONIC, &t1); #else clock_gettime(CLOCK_REALTIME, &t1); #endif t0 = t1 - t0; return repeat / (t0.tv_sec + t0.tv_nsec/1e9); } static void setup_signal_handlers(void) { #ifndef __WOE32__ struct sigaction action; memset(&action, 0, sizeof(struct sigaction)); // no child stopped notifications, no zombies action.sa_handler = SIG_DFL; action.sa_flags = SA_NOCLDSTOP; #ifdef SA_NOCLDWAIT action.sa_flags |= SA_NOCLDWAIT; #endif sigaction(SIGCHLD, &action, NULL); action.sa_flags = 0; action.sa_handler = handle_signal; sigaction(SIGSEGV, &action, NULL); sigaction(SIGILL, &action, NULL); sigaction(SIGABRT, &action, NULL); sigaction(SIGUSR2, &action, NULL); action.sa_handler = SIG_IGN; sigaction(SIGPIPE, &action, NULL); sigemptyset(&action.sa_mask); sigaddset(&action.sa_mask, SIGUSR2); pthread_sigmask(SIG_BLOCK, &action.sa_mask, NULL); #else signal(SIGSEGV, handle_signal); signal(SIGILL, handle_signal); signal(SIGABRT, handle_signal); #endif } // Show an error dialog and print to cerr if available. // On win32 Fl::fatal displays its own error window. static void fatal_error(string sz_error) { string s = "Fatal error!\n"; s.append(sz_error).append("\n").append(strerror(errno)); // Win32 will display a MessageBox error message #if !defined(__WOE32__) fl_message_font(FL_HELVETICA, FL_NORMAL_SIZE); fl_alert2("%s", s.c_str()); #endif Fl::fatal(s.c_str()); } static void checkdirectories(void) { struct DIRS { string& dir; const char* suffix; void (*new_dir_func)(void); }; DIRS fldigi_dirs[] = { { HomeDir, 0, 0 }, { RigsDir, "rigs", 0 }, { ScriptsDir, "scripts", 0 }, { PalettesDir, "palettes", create_new_palettes }, { LogsDir, "logs", 0 }, { PicsDir, "images", 0 }, { AvatarDir, "avatars", 0}, { HelpDir, "help", 0 }, { MacrosDir, "macros", create_new_macros }, { AnalysisDir, "analysis", 0 }, { FMTDir, "fmt", 0 }, { WrapDir, "wrap", 0 }, { TalkDir, "talk", 0 }, { TempDir, "temp", 0 }, { LoTWDir, "LOTW", 0 }, { KmlDir, "kml", 0 }, { DATA_dir, "data", 0 }, { DebugDir, "debug", 0 } }; int r; for (size_t i = 0; i < sizeof(fldigi_dirs)/sizeof(*fldigi_dirs); i++) { if (fldigi_dirs[i].suffix) fldigi_dirs[i].dir.assign(HomeDir).append(fldigi_dirs[i].suffix).append(PATH_SEP); r = mkdir(fldigi_dirs[i].dir.c_str(), 0777); if (r == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(fldigi_dirs[i].dir); fatal_error(s); } else if (r == 0 && fldigi_dirs[i].new_dir_func) fldigi_dirs[i].new_dir_func(); } } bool nbems_dirs_checked = false; void check_nbems_dirs(void) { if (nbems_dirs_checked) return; struct DIRS { string& dir; const char* suffix; void (*new_dir_func)(void); }; DIRS NBEMS_dirs[] = { { NBEMS_dir, 0, 0 }, { ARQ_dir, "ARQ", 0 }, { ARQ_files_dir, "ARQ/files", 0 }, { ARQ_recv_dir, "ARQ/recv", 0 }, { ARQ_send, "ARQ/send", 0 }, { WRAP_dir, "WRAP", 0 }, { WRAP_recv_dir, "WRAP/recv", 0 }, { WRAP_send_dir, "WRAP/send", 0 }, { WRAP_auto_dir, "WRAP/auto", 0 }, { ICS_dir, "ICS", 0 }, { ICS_msg_dir, "ICS/messages", 0 }, { ICS_tmp_dir, "ICS/templates", 0 }, }; int r; for (size_t i = 0; i < sizeof(NBEMS_dirs)/sizeof(*NBEMS_dirs); i++) { if (NBEMS_dirs[i].suffix) NBEMS_dirs[i].dir.assign(NBEMS_dir).append(NBEMS_dirs[i].suffix).append(PATH_SEP); if ((r = mkdir(NBEMS_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(NBEMS_dirs[i].dir).append(", ").append(strerror(errno)); fatal_error(s); } else if (r == 0 && NBEMS_dirs[i].new_dir_func) NBEMS_dirs[i].new_dir_func(); } DIRS FLMSG_dirs[] = { { FLMSG_dir, 0, 0 }, { FLMSG_WRAP_dir, "WRAP", 0 }, { FLMSG_WRAP_recv_dir, "WRAP/recv", 0 }, { FLMSG_WRAP_send_dir, "WRAP/send", 0 }, { FLMSG_WRAP_auto_dir, "WRAP/auto", 0 }, { FLMSG_ICS_dir, "ICS", 0 }, { FLMSG_ICS_msg_dir, "ICS/messages", 0 }, { FLMSG_ICS_tmp_dir, "ICS/templates", 0 }, }; for (size_t i = 0; i < sizeof(FLMSG_dirs)/sizeof(*FLMSG_dirs); i++) { if (FLMSG_dirs[i].dir.empty() && FLMSG_dirs[i].suffix) FLMSG_dirs[i].dir.assign(FLMSG_dir).append(FLMSG_dirs[i].suffix).append("/"); if ((r = mkdir(FLMSG_dirs[i].dir.c_str(), 0777)) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(FLMSG_dirs[i].dir); fatal_error(s); } else if (r == 0 && FLMSG_dirs[i].new_dir_func) FLMSG_dirs[i].new_dir_func(); } nbems_dirs_checked = true; } void check_data_dir(void) { if (mkdir(DATA_dir.c_str(), 0777) == -1 && errno != EEXIST) { string s = _("Could not make directory "); s.append(DATA_dir); fatal_error(s); } } // Print an error message and exit. static void arg_error(const char* name, const char* arg, bool missing) { ostringstream msg; msg << name << ": "; if (arg && *arg) { if (missing) msg << "option '" << arg << "' requires an argument\n"; else msg << "unrecognized option '" << arg << "'\n"; } else msg << "error while parsing command line\n"; msg << "See command line help for more information."; fatal_error(msg.str()); } /// Sets or resets the KML parameters, and loads existing files. void kml_init(bool load_files) { if (progdefaults.kml_enabled == false) return; // disabled kml service KmlServer::GetInstance()->InitParams( progdefaults.kml_command, progdefaults.kml_save_dir, (double)progdefaults.kml_merge_distance, progdefaults.kml_retention_time, progdefaults.kml_refresh_interval, progdefaults.kml_balloon_style); if (load_files) KmlServer::GetInstance()->ReloadKmlFiles(); /// TODO: Should do this only when the locator has changed. try { /// One special KML object for the user. CoordinateT::Pair myCoo( progdefaults.myLocator ); /// TODO: Fix this: It does not seem to create a polyline when changing the locator. KmlServer::CustomDataT custData ; custData.Push( "QTH", progdefaults.myQth ); custData.Push( "Locator", progdefaults.myLocator ); custData.Push( "Antenna", progdefaults.myAntenna ); custData.Push( "Name", progdefaults.myName ); KmlServer::GetInstance()->Broadcast( "User", KmlServer::UniqueEvent, myCoo, 0.0, // Altitude. progdefaults.myCall, progdefaults.myLocator, progdefaults.myQth, custData ); } catch( const std::exception & exc ) { ;// LOG_WARN("Cannot publish user position:%s", exc.what() ); } } /// Tests if a directory exists. int directory_is_created( const char * strdir ) { DIR *dir = opendir(strdir); if (dir) { closedir(dir); return true; } return false; } fldigi-4.2.05/src/dialogs/0000775000175000017500000000000014611714005012253 500000000000000fldigi-4.2.05/src/dialogs/htmlstrings.cxx0000664000175000017500000000510414611711171015276 00000000000000// ---------------------------------------------------------------------------- // // htmlstrings.cxx // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "dialogs/guide.cxx" const char* szAbout = "\n\ \n\ \n\ About\n\ \n\ \n\ \n\
\n\

Fldigi " PACKAGE_VERSION "

\n\
\n\ Fast and Light DIGItal modem program\n\
\n\

\n\ Copyright \251 2008-2014\n\

\n\ Distributed under the GNU General Public License version 3 or later.
\n\ This is free software: you are free to change and redistribute it.
\n\ There is NO WARRANTY, to the extent permitted by law.\n\

Programmers:

\n\
\
Dave Freese        W1HKJ\n\
Mike Black         W9MDB\n\
Stelios Bounanos   M0GLD\n\
Rem\355 Chateauneu    F4ECW\n\
John Douyere       VK2ETA\n\
Stefan Fendt       DL1SMF\n\
Leigh Klotz        WA5ZNU\n\
John Phelps        KL4YFD\n\
Andrej Lajovic     S57LN\n\
Rik van Riel       AB1KW\n\
Robert Stiles      KK5VD\n\
\

Beginners' Guide:

\n\
\
Murray Greenman      ZL1BPU
\n\
\

Localization:

\n\
\
Espa\361ol     Spanish      Pavel Milanes Costa CO7WT\n\
                         Christian W. Correa HK4QWC\n\
Deutsch     German       Marc Richter        DF2MR\n\
Catalan     Catalan      Xavi Pérez          EA3W\n\
Nederlands  Dutch        Peter van der Post  PA1POS\n\
Fran\347ais    French       Bernard Seront      F4GAR\n\
Ελληνικά    Greek        Haris Andrianos     SV1GRB\n\
Italiano    Italian      Emanuale Repetto    IZ1UKX\n\
Język       Polish       Roman Bagiński      SP4JEU\n\
Pусский     Russian      Alexandr Kalugin    RX9CDR\n\
\ \n\ \n\ "; fldigi-4.2.05/src/dialogs/testsigs.fl0000664000175000017500000000303114611711171014361 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0304 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include "configuration.h"} {private local } Function {make_testdialog()} {open } { Fl_Window {} { label {Test Signals} open xywh {999 31 480 100} type Double visible } { Fl_Counter noiseDB { label {Noise level (db)} callback {progdefaults.s2n = o->value();} selected xywh {10 41 127 21} align 1 minimum -30 maximum 60 value 20 code0 {o->value(progdefaults.s2n);} code1 {o->lstep(1);} code2 {\#include "flslider2.h"} class Fl_Counter2 } Fl_Check_Button btnNoiseOn { label {Noise on} callback {progdefaults.noise = o->value();} xywh {39 73 68 12} down_box DOWN_BOX code0 {o->value(progdefaults.noise);} } Fl_Counter ctrl_freq_offset { label {freq-offset} tooltip {ONLY FOR TESTING !} xywh {174 41 127 21} align 1 minimum -250 maximum 250 code0 {o->lstep(10);} } Fl_Check_Button btnOffsetOn { label {Offset on} xywh {203 73 68 12} down_box DOWN_BOX } Fl_Counter xmtimd { label {PSK IMD level (db)} xywh {339 41 127 21} align 1 minimum -40 maximum -15 value -30 code0 {o->lstep(1.0);} class Fl_Counter2 } Fl_Check_Button btn_imd_on { label {IMD on} xywh {368 73 68 12} down_box DOWN_BOX } Fl_Box {} { label {!! DO NOT USE ON LIVE TRANSMITER !!} xywh {2 2 368 20} labelcolor 80 } } } fldigi-4.2.05/src/dialogs/guide.cxx0000664000175000017500000030716614611711171014032 00000000000000const char* szBeginner = "\n\ \n\ \n\ \n\ \n\ \n\ Beginners' Guide to Fldigi\n\ \n\ \n\ \n\ \n\
\n\

Beginners' Guide to Fldigi

\n\
\n\
Table of Contents
\n\ \n\
\n\
\n\
\n\
\n\
\n\
\n\
\n\

Of necessity, this Beginners' Guide contains only as much as you need to know to\n\ get started. You should learn how to make best use of the program by reading the\n\ Online Documentation. You can also access it from within the Fldigi program from the Help\n\ menu item.

\n\

You can install the entire html help system by downloading from Source Forge:

\n\ \n\

Unzip the downloaded file into the same folder as this document. The menu\n\ item \"Help / Online documentation…\" will then open the local copy of the fldigi help system.

\n\
\n\
\n\
\n\
\n\

1. Beginners' Questions Answered

\n\
\n\
\n\

1.1. What is Fldigi?

\n\

Fldigi is a computer program intended for Amateur Radio Digital Modes\n\ operation using a PC (Personal Computer). Fldigi operates (as does most similar\n\ software) in conjunction with a conventional HF SSB radio transceiver, and uses\n\ the PC sound card as the main means of input from the radio, and output to the\n\ radio. These are audio-frequency signals. The software also controls the radio\n\ by means of another connection, typically a serial port.

\n\

Fldigi is multi-mode, which means that it is able to operate many popular\n\ digital modes without switching programs, so you only have one program to\n\ learn. Fldigi includes all the popular modes, such as DominoEX, MFSK16, PSK31,\n\ and RTTY.

\n\

Unusually, Fldigi is available for multiple computer operating systems;\n\ FreeBSD™; Linux™, OS X™ and Windows™.

\n\
\n\
\n\

1.2. What is a Digital Mode?

\n\

Digital Modes are a means of operating Amateur radio from the computer\n\ keyboard. The computer acts as modem (modulator - demodulator), as well as\n\ allowing you to type, and see what the other person types. It also controls the\n\ transmitter, changes modes as required, and provides various convenient features\n\ such as easy tuning of signals and prearranged messages.

\n\

In this context, we are talking about modes used on the HF (high frequency)\n\ bands, specifically chat modes, those used to have a regular conversation in a\n\ similar way to voice or Morse, where one operator talks for a minute or two,\n\ then another does the same. These chat modes allow multiple operators to take\n\ part in a net.

\n\

Because of sophisticated digital signal processing which takes place inside the\n\ computer, digital modes can offer performance that cannot be achieved using\n\ voice (and in some cases even Morse), through reduced bandwidth, improved\n\ signal-to-noise performance and reduced transmitter power requirement. Some\n\ modes also offer built-in automatic error correction.

\n\

Digital Mode operating procedure is not unlike Morse operation, and many of the\n\ same abbreviations are used. Software such as Fldigi makes this very simple as\n\ most of the procedural business is set up for you using the Function Keys at the\n\ top of the keyboard. These are easy to learn.

\n\
\n\
\n\

1.3. Why all the different modes?

\n\

HF propagation is very dependent on the ionosphere, which reflects the signals\n\ back to earth. There are strong interactions between different signals arriving\n\ from different paths. Experience has shown that particular modulation systems,\n\ speeds and bandwidths suit different operating conditions.

\n\

Other factors such as available band space, operating speed and convenience,\n\ noise level, signal level and available power also affect the choice of\n\ mode. While in many cases several different modes might be suitable, having a\n\ choice adds to the operating pleasure. It is difficult to advise which mode is\n\ best for each particular occasion, and experience plays an important role.\n\
[To gain a good insight into each mode and its capabilities, you might\n\ consider purchasing Digital Modes for All Occasions (ISBN 1-872309-82-8) by\n\ Murray Greenman ZL1BPU, published by the RSGB and also available from\n\ FUNKAMATEUR and CQ Communications; or the ARRL’s HF Digital Handbook (ISBN\n\ 0-87259-103-4) by Steve Ford, WB8IMY.]

\n\
\n\
\n\

1.4. How do I recognise and tune in the signals?

\n\

Recognising the different modes comes with experience. It is a matter of\n\ listening to the signal, and observing the appearance of the signal on the\n\ tuning display. You can also practise transmitting with the transceiver\n\ disconnected, listening to the sound of the signals coming from the\n\ computer. There is also (see later paragraph) an automatic tuning option which\n\ can recognise and tune in most modes for you.

\n\

The software provides a tuning display which shows the radio signals that are\n\ receivable within the transceiver passband. Using a point and click technique\n\ with the mouse, you can click on the centre of a signal to select it, and the\n\ software will tune it in for you. Some modes require more care than others, and\n\ of course you need to have the software set for the correct mode first — not\n\ always so easy!

\n\

The RSID (automatic mode detection and tuning) feature uses a\n\ special sequence of tones transmitted at the beginning of each transmission to\n\ identify and tune in the signals received. For this feature to work, not only do\n\ you need to enable the feature in the receiver, but in addition the stations you\n\ are wishing to tune in need to have this feature enabled on transmission. Other\n\ programs also offer this RSID feature as an option.

\n\
\n\
\n\
\n\
\n\

2. Setting Up

\n\
\n\
\n\

2.1. Fldigi settings

\n\
Essentials
    \n\
  • \n\

    \n\ Use the menu Configure→Operator item to set the operator name, callsign,\n\ locator and so on.\n\

    \n\
  • \n\
  • \n\

    \n\ If you have more than one sound card, use the menu Configure→Sound Card,\n\ Audio Devices tab, to select the sound card you wish to use. You can ignore\n\ the other tabs for now.\n\

    \n\
  • \n\
\n\
Rig Control
    \n\
  • \n\

    \n\ Use the menu Configure→Rig Control item to set how you will control the\n\ rig. If you will key the rig via a serial port, in the Hardware PTT tab\n\ select Use serial port PTT, the device name you will use, and which line\n\ controls PTT. If in doubt, check both RTS and DTR. You must then press\n\ the Initialize button.\n\

    \n\
  • \n\
  • \n\

    \n\ If you plan to use CAT control of the rig via the COM port, check Use Hamlib\n\ in the Hamlib tab. Select your rig model from the drop-down menu and set the\n\ serial port device name, baud rate, and RTS/CTS options as needed. If in\n\ addition you wish to use PTT control via CAT, also check PTT via Hamlib\n\ command. You must then press the Initialize button.\n\

    \n\
  • \n\
\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\

If your rig is CAT-capable but not yet supported by\n\ Hamlib, it may still be possible to control it via\n\ Fldigi’s RigCAT system. Refer to the Online Documentation for details.

\n\
\n\
\n\
CPU Speed
    \n\
  • \n\

    \n\ When you start Fldigi for the very first time, it makes a series of\n\ measurements to determine your computer’s processing speed. Although these\n\ measurements are usually accurate, if you have a very slow processor (under\n\ 700MHz), you should verify that Slow CPU under Configure→Misc→CPU has\n\ been enabled. The receiver decoding strategy of certain modems uses fewer\n\ processor cycles in this mode.\n\

    \n\
  • \n\
\n\
Modems
    \n\
  • \n\

    \n\ Each of the modems can be individually set up from the Configure→Modems\n\ multi-tabbed dialog. You need not change anything here to start with, although\n\ it might be a good idea to set the secondary text for DominoEX and THOR to\n\ something useful, such as your call and locator.
    [Secondary text is\n\ transmitted when the text you type does not keep up with the typing speed of\n\ the mode — this handy text appears in a small window at the very bottom of the\n\ screen.]
    Note that this set of tabs is also where you set the RTTY modem speed\n\ and shift, although the default values should be fine for normal operation.\n\

    \n\
  • \n\
\n\
Other settings
    \n\
  • \n\

    \n\ Use the menu Configure→UI, Restart tab, to set the aspect ratio of the\n\ waterfall display and whether or not you want to dock a second digiscope to\n\ the main window.\n\

    \n\
  • \n\
  • \n\

    \n\ Use the menu Configure→IDs item to set whether you wish to transmit RSID\n\ data at the start of each over (this is for the benefit of others and does not\n\ affect RSID reception). If you plan to regularly use the RSID feature on\n\ receive, you should deselect the option that starts new modems at the “sweet\n\ spot” frequencies in Misc→Sweet Spot.\n\

    \n\
  • \n\
\n\

Finally, use the menu item Configure→Save Config to save the new\n\ configuration.

\n\
\n\
\n\

2.2. Sound Card Mixer

\n\
    \n\
  • \n\

    \n\ Use your sound card Master Volume applet to select the sound card, the Wave\n\ output and set the transmit audio level. You can check the level using the\n\ Tune button, top right, beyond the Menu.\n\

    \n\
  • \n\
  • \n\

    \n\ On Windows, the Volume applet can usually be opened by clicking\n\ Start→Run… and entering sndvol32, or from the Control Panel.\n\

    \n\
  • \n\
  • \n\

    \n\ Use your sound card Recording Control applet to select the sound card, the\n\ Line or Mic input and set the receiver audio level. Watch the waterfall\n\ display for receiver noise when setting the level. If you see any dark blue\n\ noise, you have the right input and about the right level. The actual setting\n\ is not very important, provided you see blue noise. If the audio level is too\n\ high, the little diamond shaped indicator (bottom right) will show red. The\n\ waterfall may also show red bands. Performance will be degraded if the level\n\ is too high.\n\

    \n\
  • \n\
  • \n\

    \n\ On Windows, the Record applet can usually be opened by clicking\n\ Start→Run… and entering sndvol32, or from the Control Panel. If opened\n\ from the Control Panel, you’ll end up with the Master Volume applet, and need\n\ to switch using Options→Properties, and selecting the Recording radio\n\ button.\n\

    \n\
  • \n\
\n\
\n\
\n\
\n\
\n\

3. Guided Tour

\n\
\n\

The main window consists of three main panes. Study it carefully as you read\n\ these notes. From top to bottom, these are the Receive pane (navajo white), the\n\ Transmit pane (light cyan), and the Waterfall pane (black). At the top is the\n\ collection of entry items which form the Log Data, and at the very top, a\n\ conventional drop-down Menu system, with entries for File, Op Mode, Configure,\n\ View and Help.

\n\

Between the Transmit and the Waterfall panes is a line of boxes (buttons) which\n\ represent the Function Keys F1 - F12. This is the Macro group. Below the\n\ Waterfall pane is another line of boxes (buttons), which provide various control\n\ features. This is the Controls group. The program and various buttons can mostly\n\ be operated using the mouse or the keyboard, and users generally find it\n\ convenient to use the mouse while tuning around, and the keyboard and function\n\ keys during a QSO.

\n\
\n\

3.1. Receive Pane

\n\

This is where the text from decoded incoming signals is displayed, in black\n\ text. When you transmit, the transmitted text is also displayed here, but in red,\n\ so the Receive pane becomes a complete record of the QSO. The information in\n\ this pane can also be logged to a file.

\n\

The line at the bottom of this pane can be dragged up and down with the\n\ mouse. You might prefer to drag it down a bit to enlarge the Receive pane and\n\ reduce the size of the Transmit pane.

\n\
\n\
\n\

3.2. Transmit Pane

\n\

This is where you type what you want to transmit. The mouse must click in here\n\ before you type (to obtain focus) otherwise your text will go nowhere. You can\n\ type in here while you are receiving, and when you start transmitting, the text\n\ already typed will be sent first. This trick is a cool way to impress others\n\ with your typing speed! As the text is transmitted, the text colour changes from\n\ black to red. At the end of the over, all the transmitted text (and any as yet\n\ not transmitted) will be deleted.

\n\
\n\
\n\

3.3. Waterfall Pane

\n\

This is the main tuning facility. There are three modes, Waterfall, FFT and\n\ Signal, selected by a button in the Control group. For now, leave it in\n\ Waterfall mode, as this is the easiest to tune with, and gives the best\n\ identification of the signal.

\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\ WF (Waterfall)\n\
\n\
\n\

\n\ A spectrogram display of signal strength versus frequency over passing\n\ time. The receiver passband is analysed and displayed with lower frequencies\n\ to the left, higher to the right. Weak signals and background noise are dark\n\ while stronger signals show as brighter colours. As time passes (over a few\n\ seconds), the historic signals move downwards like a waterfall.\n\

\n\
\n\ FFT (Fast Fourier Transform)\n\
\n\
\n\

\n\ A spectrum display of the mean signal strength versus frequency. Again\n\ frequency is displayed from left to right, but now the vertical direction\n\ shows signal strength and there is no brightness or historic information.\n\

\n\
\n\ SIG (Signal)\n\
\n\
\n\

\n\ An oscilloscope type of display showing the raw audio being captured by the\n\ sound card.\n\

\n\
\n\

At the top of the pane is a scale of frequency in Hz, which corresponds to the\n\ frequency displayed immediately below it. This scale can be moved around and\n\ zoomed using buttons in the Control group.

\n\

As you move the mouse around in this pane you will see a yellow group of tuning\n\ marks following the mouse pointer. Tuning is achieved by left-clicking on a\n\ signal displayed by the waterfall in this pane. Use these yellow marks to\n\ exactly straddle the signal and then left-click on the centre of the signal. The\n\ tuning marks change to red. The red vertical lines will show the approximate\n\ width of the active signal area (the expected signal bandwidth), while a red\n\ horizontal bar above will indicate the receiver software’s active decoding\n\ range. When you left-click, the red marks move to where you clicked, and will\n\ attempt to auto-track the signal from there.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\
Audio history and “casual tuning”
\n\

You can temporarily “monitor” a different signal by right-clicking on it. As\n\ long as you hold the mouse button down, the signal under it will be decoded; as\n\ soon as you release the mouse, decoding will revert to the previously tuned spot\n\ (where the red marks are). If you also hold the Control key down before\n\ right-clicking, Fldigi will first decode all of its buffered audio at that\n\ frequency.

\n\
\n\
\n\
\n\
\n\

3.4. Log Data

\n\

Fldigi provides two QSO entry views, one for casual QSO logging and the second\n\ for contesting. The View→Contest fields menu item switches between the two\n\ modes.

\n\

The Frequency, Time Off, and (when in contest mode) #Out fields are filled\n\ by the program. All the others can be populated by manual keyboard entry or by\n\ selection from the Receive pane. The Time Off field is\n\ continuously updated with the current GMT time. The Time On field will be\n\ filled in when the Call is updated, but can be modified later by the operator.

\n\

A right click on the Receive pane brings up a context sensitive menu that will\n\ reflect which of the two QSO capture views you have open. If you highlight text\n\ in the Receive pane then the menu selection will operate on that text. If you\n\ simply point to a word of text and right click then the menu selection will\n\ operate on the single word.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\
Quick log entry
\n\

Certain fields (Call, Name, RST In, QTH and Locator) may also be\n\ populated semi-automatically. Point to a word in the Receive pane and either\n\ double-left-click or hold a Shift key down and left-click. The program will\n\ then use some simple heuristics to decide which log field will receive the text.

\n\
\n\
\n\

It is generally not possible to distinguish between Operator and QTH names. For\n\ this reason, Fldigi will use the first non-Call and non-Locator word to fill the\n\ Name field, and subsequent clicks will send text to the QTH field.\n\ Likewise, a text string may be both a valid callsign and a valid\n\ IARU (Maidenhead) locator.\n\ For best results, you should attempt to fill the log fields in the order in\n\ which they appear on the main window, and clear the log fields after logging the\n\ QSO. Of course, text can always be manually typed or pasted into any of the log\n\ fields!

\n\

You can query online and local (e.g. CD) database systems for data regarding a\n\ callsign. You make the query by either clicking on the globe button, or\n\ selecting Look up call from the popup menu. The latter will also move the\n\ call to the Call field.

\n\

When the Call field is filled in, the logbook will be searched for the most\n\ recent QSO with that station and, if an entry is found, the Name, QTH and\n\ other fields will be pre-filled. If the logbook dialog is open, that last QSO\n\ will also be selected for viewing in the logbook.

\n\

You open the logbook by selecting from the View menu; View→Logbook. The\n\ logbook title bar will show you which logbook you currently have open. Fldigi\n\ can maintain an unlimited (except for disk space) number of logbooks.

\n\
\n\
\n\

3.5. Menu

\n\

At the very top of the program window is a conventional drop-down menu. If you\n\ click on any of the items, a list of optional functions will appear. Keyboard\n\ menu selection is also provided. Where underscored characters are shown in the\n\ menu, you can select these menu items from the keyboard using the marked\n\ character and Alt at the same time, then moving around with the\n\ up/down/left/right keys. Press Esc to quit from the menu with no\n\ change.

\n\
\n\

3.5.1. Menu functions

\n\
File

Allows you to open or save Macros (we won’t get into that here), turn on/off\n\ logging to file, record/play audio samples, and exit the program. You can also\n\ exit the program by clicking on the X in the top right corner of the window,\n\ in the usual manner.

\n\
Op Mode

This is where you select the operating modem used for transmission and\n\ reception. Some modes only have one option. Where more are offered, drag the\n\ mouse down the list and sideways following the arrow to a secondary list, before\n\ releasing it. When you start the program next time, it will remember the last\n\ mode you used.

\n\

Not all the modes are widely used, so choose a mode which (a) maximises your\n\ chance of a QSO, and (b) is appropriate for the band, conditions, bandwidth\n\ requirements and permissions relevant to your operating licence.

\n\

At the bottom of the list are two “modes” which aren’t modes at all, and do not\n\ transmit (see Online Documentation for details). WWV mode allows you to receive a\n\ standard time signal so the beeps it transmits can be used for sound card\n\ calibration. Freq Analysis provides just a waterfall display with a very\n\ narrow cursor, and a frequency meter which indicates the received frequency in\n\ Hz to two decimal places. This is useful for on-air frequency measurement.

\n\
Configure

This is where you set up the program to suit your computer, yourself and your\n\ operating preferences. The operating settings of the program are grouped into\n\ several categories and there are menu items in which you enter your personal\n\ information, or define your computer sound card, for example. Modems can be\n\ individually changed, each having different adjustments. The Modems dialog has\n\ multiple tabs, so you can edit any one of them. Don’t fool with the settings\n\ until you know what you are doing! The final item, Save Config allows you to\n\ save the altered configuration for next time you start the program (otherwise\n\ changes are temporary).

\n\
View

This menu item allows you to open extra windows. Most will be greyed out, but\n\ two that are available are the Digiscope, and the PSK Browser. The Digiscope\n\ provides a mode-specific graphical analysis of the received signal, and can have\n\ more than one view (left click in the new window to change the view), or maybe\n\ none at all. The PSK Browser is a rather cool tool that allows you to monitor\n\ several PSK31 signals all at the same time! These windows can be resized to\n\ suit.

\n\
Help

Brings up the Online Documentation, the Fldigi Home Page, and various\n\ information about the program.

\n\
\n\
\n\

3.5.2. Other controls

\n\
RSID

The RxID button turns on the receive RSID (automatic mode detection and tuning)\n\ feature. When in use, the button turns yellow and no text reception is possible\n\ until a signal is identified, or the feature is turned off again. If you plan to\n\ use the RSID feature on receive, you must leave the Start New Modem at Sweet\n\ Spot item in the menu Configure→Defaults→Misc tab unchecked.

\n\
TUNE

This button transmits a continuous tone at the current audio frequency. The tone\n\ level will be at the maximum signal level for any modem, which makes this\n\ function useful for adjusting your transceiver’s output power.

\n\
\n\
\n\
\n\

3.6. Macro buttons

\n\

This line of buttons provides user-editable QSO features. For example, the first\n\ button on the left sends CQ for you. Both the function of these buttons (we call\n\ them Macros) and the label on each button, can be changed.

\n\

Select each button to use it by pressing the corresponding Function Key (F1 -\n\ F12, you’ll notice the buttons are grouped in patterns four to a group, just as\n\ the Function Keys are). You can also select them with a left-click of the\n\ mouse. If you right-click on the button, you are able to edit the button’s label\n\ and its function. A handy dialog pops up to allow this to be done. There are\n\ many standard shortcuts, such as <MYCALL>, which you can use within the\n\ Macros. Notice that the buttons also turn the transmitter on and off as\n\ necessary.

\n\

You can just about hold a complete QSO using these buttons from left to right\n\ (but please don’t!). Notice that at the right are two spare buttons you can set\n\ as you wish, and then a button labelled 1. Yes, this is the first set of\n\ four sets of Macros, and you can access the others using this button, which\n\ changes to read 2, 3, 4 then 1 again (right-click to go backwards), or\n\ by pressing Alt and the corresponding number (1-4, not F1-F4) at the same\n\ time.

\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\

If you really mess up the Macros and can’t see how to fix them, just close the\n\ program without saving them, and reopen it.

\n\
\n\
\n\
\n\
\n\

3.7. Controls

\n\

The line of buttons under the waterfall is used to control the program (as\n\ opposed to the QSO). If you hover the mouse over these buttons, you’ll see a\n\ little yellow hint box appear which tells you what each button does.

\n\

The first button switches between Waterfall, FFT and Scope modes. The next two\n\ buttons adjust the signal level over which the waterfall works. The default\n\ range is from 0dB downwards 70dB (i.e. to -70dB). Both of these values can be\n\ adjusted to suit your sound card and receiver audio level.

\n\

The next button sets the scale zoom factor (visible display width, ×1, ×2 or\n\ ×4), and the next three buttons move the visible waterfall area in relation to\n\ the bandwidth cursor.

\n\

The next button selects the waterfall speed. NORM or SLOW setting is best unless\n\ you have a very fast computer.

\n\

The next four buttons (two on either side of a number, the audio frequency in\n\ Hz) control the receiving frequency (they move the red cursor lines).

\n\

The QSY button moves the signal under the bandwidth cursor to a preset audio\n\ frequency (typically, the centre of the transceiver’s passband). The Store\n\ button allows you to store or recall the current frequency and mode. See the\n\ Online Documentation for details on these functions.

\n\

The Lk button locks the transmit frequency (and illuminates a green marker), and the\n\ Rv button turns the signal decoding upside down (some modes are sideband\n\ sensitive, and if they are the wrong way up, can’t be received\n\ correctly). Remember to turn this one off when you’re done, or you won’t receive\n\ anything! If every signal you hear is upside down, check your transceiver\n\ sideband setting.

\n\

The T/R button forces the transmitter on or off.

\n\
\n\ \n\ \n\ \n\
\n\ \"Caution\"\n\ \n\

Use the T/R button with care, as it will stop transmission immediately, losing\n\ whatever is in the buffer (what you have typed in the Transmit pane), or start\n\ it immediately, even if nothing is ready to transmit.

\n\
\n\
\n\

There are two further controls in the bottom right corner of the program, to the\n\ right of the Status line:

\n\
\n\
\n\ AFC (AFC) control\n\
\n\
\n\

\n\ When this button is pressed, an indicator on the button turns yellow, and the\n\ program will automatically retune to drifting signals. When the button is\n\ again pressed, AFC is off, and the tuning will stay where you leave it.\n\

\n\
\n\
\n\ SQL (Squelch) control\n\
\n\
\n\

\n\ When off (no coloured indicator on the button), the receiver displays all\n\ “text” received, even if there is no signal present, and the receiver is\n\ simply attempting to decode noise. When activated by pressing the button, the\n\ indicator turns yellow. If the incoming signal strength exceeds that set by\n\ the adjacent slider control (above the SQL button), the indicator turns\n\ green and the incoming signal is decoded and printed. The signal strength is\n\ indicated on the green bar beside the Squelch level slider. If nothing seems\n\ to be printing, the first thing to do is check the Squelch!\n\

\n\
\n\
\n\
\n\
\n\

3.8. Status Line

\n\

At the very bottom line of the Fldigi window is a row of useful information. At\n\ the left is the current operating mode. Next (some modes) is the measured\n\ signal-to-noise ratio at the receiver, and (in some modes) the measured signal\n\ intermodulation level (IMD).

\n\

The larger central box shows (in DominoEX and THOR modes) the received\n\ Secondary Text. This is information (such as station identification) which is\n\ transmitted automatically whenever the transmitter has completed all user text\n\ that is available to send. It is transmitted using special characters, and is\n\ automatically directed to this special window. Secondary text you transmit is\n\ also shown here. This box changes size when you enlarge the program window.

\n\
\n\
\n\
\n\
\n\

4. Operating

\n\
\n\
\n\

4.1. Procedure

\n\

Operating procedure for digital modes is similar to that for Morse. Some of the\n\ same abbreviations are used. For example, at the beginning of an over, you might\n\ send VK3XYZ de WB8ABC or just RR Jack and so on. At the end of an over, it\n\ is usual to send ZL1ABC de AA3AR K, and at the end of a QSO 73 F3XYZ de 3D2ZZ\n\ SK. When operating in a group or net it is usual to sign AA3AE es gp de ZK8WW\n\ K.

\n\

It is also considered a courtesy to send a blank line or two (press Enter)\n\ before any text at the start of an over, and following the last text at the end\n\ of an over. You can also place these in the macros. The purpose is to separate\n\ your text from the previous text, and especially from any rubbish that was\n\ printed between overs.

\n\

Fldigi does all of this for you. The Function Keys are set up to provide these\n\ start and end of over facilities, and can be edited to suit your preferences. In\n\ order that the other station’s callsign can appear when these keys are used, you\n\ need to set the other station’s callsign in the log data — it does not matter if\n\ you use the log facility or not.

\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\
Macro symbols
\n\

Some Function Key Macro buttons have graphic symbols on them which imply\n\ the following:

\n\
\n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\ \n\
\n\ >>\n\
\n\
\n\

\n\ The transmitter comes on and stays on when you use this button/macro.\n\

\n\
\n\ ||\n\
\n\
\n\

\n\ The transmitter goes off when the text from this button/macro has been\n\ sent.\n\

\n\
\n\ >|\n\
\n\
\n\

\n\ The transmitter comes on, sends the text from this button/macro, and\n\ goes off when the text from this button/macro has been sent.\n\

\n\
\n\
\n\
\n\

The Macros are set up to control the transmitter as necessary, but you can also\n\ switch the transmitter on at the start of an over with Ctrl and T or the TX\n\ macro button, and off again with Ctrl and R or the RX macro button. If you\n\ have Macros copied into or text already typed in the Transmit pane when you\n\ start the transmitter, this is sent first.

\n\

Calling another station you have tuned in is as simple as pushing a button. Put\n\ his callsign into the log data (right click, select Call) and press the ANS\n\ Macro button (or F2) when you are ready. If he replies, you are in business!\n\ Then press QSO (F3) to start each over, and BTU (F4) to end it, and SK\n\ (F5) to sign off.

\n\
\n\ \n\ \n\ \n\
\n\ \"Note\"\n\ \n\

When typing text, the correct use of upper and lower case is important:

\n\
    \n\
  • \n\

    \n\ Modes such as RTTY and THROB have no lower case capability.\n\

    \n\
  • \n\
  • \n\

    \n\ In most other modes, excessive use of upper case is considered impolite, like\n\ SHOUTING!\n\

    \n\
  • \n\
  • \n\

    \n\ Modes such as PSK31, MFSK16, DominoEX and THOR use character sets which are\n\ optimised for lower case. You should use lower case as much as possible in\n\ these modes to achieve maximum text speed. In these modes upper case\n\ characters are noticeably slower to send and also slightly more prone to\n\ errors.\n\

    \n\
  • \n\
\n\
\n\
\n\
\n\
\n\

4.2. Adjustment

\n\

Most digital modes do not require much transmitter power, as the receiver\n\ software is very sensitive. Many modes (PSK31, THROB, MT63) also require very\n\ high transmitter linearity, which is another reason to keep transmitter power\n\ below 30% of maximum. Some modes (Hellschreiber, Morse) have high peak power\n\ output, which may not indicate well on the conventional power meter, another\n\ reason to keep the average transmitted power low to prevent a very broad signal\n\ being transmitted.

\n\

Adjust the transmitter output power using the TUNE button, top right, beyond the\n\ Menu. The output will be the same as the peak power in other modes. Adjust the\n\ master Volume applet Wave Out and Master Volume controls to achieve the\n\ appropriate power. Use of excessive drive will result in distortion (signal\n\ difficult to tune in, and often poorer reception) and a very broad signal.

\n\

Some multi-carrier modes (MT63 for example) may require individual adjustment as\n\ the average power may be rather low.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\

Where possible, use the area above 1200Hz on the waterfall.

\n\
    \n\
  • \n\

    \n\ Below 1200Hz the second harmonic of the transmitted audio will pass through\n\ the transmitter filters.\n\

    \n\
  • \n\
  • \n\

    \n\ When using lower frequency tones, adjust the transmitter and audio level with\n\ great care, as the second (and even third) harmonic will appear in the\n\ transmitter passband, causing excessive signal width.\n\

    \n\
  • \n\
  • \n\

    \n\ A narrow (CW) filter in the rig is no help in this regard, as it is only used\n\ on receive. When you do use a narrow filter, this will restrict the area over\n\ which the receiver and transmitter will operate (without retuning of\n\ course). Try adjusting the passband tuning (if available).\n\

    \n\
  • \n\
  • \n\

    \n\ Keep the sound card audio level to a minimum and set the transmitter gain to a\n\ similar level used for SSB.\n\

    \n\
  • \n\
\n\
\n\
\n\
\n\
\n\

4.3. Waterfall Tuning

\n\

When using this program, as with most other digital modes programs, tuning is\n\ generally accomplished by leaving the transceiver VFO at a popular spot (for\n\ example 14.070MHz, USB), and performing all the tuning by moving around within\n\ the software.

\n\

The Fldigi software has a second “VFO” which is tuned by clicking on the\n\ waterfall. On a busy band, you may see many signals at the same time (especially\n\ with PSK31 or Morse), and so you can click with the mouse on any one of these\n\ signals to tune it in, receive it, and if the opportunity allows, reply to the\n\ station.

\n\

The software “VFO” operates in a transceive mode, so the transmitter signal is\n\ automatically and exactly tuned to the received frequency. If you click\n\ correctly on the signal, your reply will always be in tune with the other\n\ station.

\n\
\n\ \n\ \n\ \n\
\n\ \"Important\"\n\ \n\

You must not use RIT (Clarifier) when using digital modes.

\n\
    \n\
  • \n\

    \n\ With RIT on, you will probably have to retune after every over.\n\

    \n\
  • \n\
  • \n\

    \n\ Use of the RIT will also cause the other station to change frequency, and you\n\ will chase each other across the band.\n\

    \n\
  • \n\
  • \n\

    \n\ Older transceivers without digital synthesis may have an unwanted offset\n\ (frequency difference) between transmit and receive frequencies. Such rigs\n\ should not be used for digital modes.\n\

    \n\
  • \n\
\n\
\n\
\n\

Wider digital modes (MT63, Olivia) can be tuned using the rig if necessary, as\n\ tuning is not at all critical. The software tuning still operates, but because\n\ the signal is so wide, there is limited ability to move around in the waterfall\n\ tuning.

\n\
\n\
\n\
\n\
\n\

5. Special Keys

\n\
\n\

Several special keyboard controls are provided to make operating easier.

\n\
Start Transmission

Press Ctrl and T to start transmission if there is text ready in the transmit\n\ buffer.

\n\
Pause Transmission

Press Pause or Break while in receive, and the program will switch to\n\ transmit mode. It will continue with the text in the transmit buffer (the\n\ Transmit pane text) from the current point, i.e. where the red (previously sent)\n\ text ends and the black (yet to be sent) text begins. If the buffer only\n\ contains unsent text, then it will begin at the first character in the\n\ buffer. If the buffer is empty, the program will switch to transmit mode, and\n\ depending on the mode of operation, will send idle characters or nothing at all\n\ until characters are entered into the buffer.

\n\

If you press Pause or Break while in transmit mode, the program will return\n\ to receive mode. There may be a slight delay for some modes like MFSK, PSK and\n\ others, that requires the transmitter to send a postamble at the end of a\n\ transmission. The transmit text buffer stays intact, ready for the\n\ Pause/Break key to return you to the transmit mode .

\n\

Pressing Alt or Meta and R has the same effect as Pause/Break. You\n\ could think of the Pause/Break key as a software break-in capability.

\n\
Escape

Pressing Esc while transmitting will abort the transmission. Transmission\n\ stops as soon as possible, (any necessary postamble is sent), and the program\n\ returns to receive. Any unsent text in the transmit buffer will be lost.

\n\
\n\ \n\ \n\ \n\
\n\ \"Tip\"\n\ \n\

If you press Esc Esc (i.e. twice in quick succession), transmission stops\n\ immediately, without sending any postamble, and the program returns to\n\ receive. Any unsent text in the transmit buffer will be lost. Use this feature\n\ as an emergency stop.

\n\
\n\
\n\
Return to Receive

Press Ctrl and R to insert the ^r command in the transmit buffer at the\n\ current typing point. When transmission reaches this point, transmission will\n\ stop.

\n\
Move Typing Cursor

Press Tab to move the cursor (typing insertion point) to the end of the\n\ transmit buffer. This will also pause transmission. A Tab press at that\n\ position moves the cursor back to the character following the last one\n\ transmitted. Morse operation is slightly different. See the Online Documentation for CW.

\n\
Send Any ASCII Character

Press Ctrl and (at the same time) any three-digit number (on the numeric\n\ keypad or the normal numeric keys) to insert the ASCII character designated by\n\ that entry value into the transmit buffer. For example, Ctrl 177 is “±”\n\ (plus/minus) and Ctrl 176 is “°” (degree). If you press a key other than the\n\ numeric keypad’s 0-9 the sequence will be discarded.

\n\

Credits

\n\

Copyright © 2008 Murray Greenman, ZL1BPU.

\n\

Copyright © 2008-2009 David Freese, W1HKJ.

\n\

Copyright © 2009 Stelios Bounanos, M0GLD.

\n\ \n\
\n\
\n\
\n\

\n\
\n\
\n\ Last updated\n\ 2023-08-04 01:13:25 \n\
\n\
\n\ \n\ \"Valid\n\ \n\ \n\ \"Valid\n\ \n\
\n\
\n\ \n\ \n\n"; fldigi-4.2.05/src/dialogs/record_browse.fl0000664000175000017500000000252414611711171015361 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0305 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include "record_loader_gui.h"} {public global } decl {\#include } {public local } Function {make_record_loader_window()} {open } { Fl_Window {} { label {Data files sources} open tooltip {Data files update} xywh {216 357 540 280} type Double resizable visible } { Fl_Group tabDataFiles {open tooltip {Tabular data sources} xywh {3 18 535 255} resizable } { Fl_Table {} { label {Data files sources} open selected xywh {4 18 529 217} labeltype NO_LABEL resizable class DerivedRecordLst } {} Fl_Input_Choice inpDataSources { label {Data source} open tooltip {Data files repository} xywh {4 247 284 21} align 8 } {} Fl_Light_Button btnDataSourceUpdate { label Update callback {DerivedRecordLst::cbGuiUpdate();} tooltip {Update selected local data files with repository content} xywh {385 247 74 20} } Fl_Button btnDataSourceReset { label Reset callback {DerivedRecordLst::cbGuiReset();} tooltip {Delete local data files if selected.} xywh {463 247 70 20} } } } } fldigi-4.2.05/src/dialogs/notifydialog.fl0000664000175000017500000001440414532252172015215 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0300 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include "table.h"} {public global } decl {\#include "flinput2.h"} {public global } decl {\#include "flslider2.h"} {public global } decl {\#include "notify.h"} {private local } Function {make_notify_window()} {open } { Fl_Window {} { label Notifications open xywh {671 439 500 550} type Double resizable size_range {500 550 0 0} visible } { Fl_Group grpNotifyEvent { label Event open xywh {2 2 219 126} box ENGRAVED_FRAME align 21 } { Fl_Choice mnuNotifyEvent {open selected xywh {10 29 205 22} down_box BORDER_BOX } {} Fl_Light_Button btnNotifyEnabled { label Enabled xywh {131 94 80 23} } Fl_Input inpNotifyRE { label {RE:} xywh {36 61 175 23} code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Group grpNotifyFilter { label Filter open xywh {2 130 219 176} box ENGRAVED_FRAME align 21 } { Fl_Round_Button chkNotifyFilterCall { label Callsign callback {if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->show(); btnNotifyFilterDXCC->hide(); chkNotifyFilterDXCC->value(0);} xywh {12 157 80 20} down_box ROUND_DOWN_BOX } Fl_Input inpNotifyFilterCall { xywh {131 157 80 20} align 0 class Fl_Input2 } Fl_Round_Button chkNotifyFilterDXCC { label {DXCC entity} callback {if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->hide(); btnNotifyFilterDXCC->show(); chkNotifyFilterCall->value(0);} xywh {12 186 110 20} down_box ROUND_DOWN_BOX } Fl_Button btnNotifyFilterDXCC { tooltip {Show DXCC entities} xywh {183 183 28 23} } Fl_Check_Button chkNotifyFilterNWB { label {Not worked before} xywh {12 216 155 20} down_box DOWN_BOX } Fl_Check_Button chkNotifyFilterLOTW { label {LotW user} xywh {12 246 100 20} down_box DOWN_BOX } Fl_Check_Button chkNotifyFilterEQSL { label {eQSL user} xywh {12 276 100 20} down_box DOWN_BOX } } Fl_Group grpNotifyDup { label Duplicates xywh {2 308 219 149} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkNotifyDupIgnore { label {Ignore duplicates} xywh {12 337 145 20} down_box DOWN_BOX } Fl_Choice mnuNotifyDupWhich { label {in:} open xywh {33 367 120 20} down_box BORDER_BOX } {} Fl_Spinner cntNotifyDupTime { label {Time (s):} xywh {93 397 60 20} minimum 0 maximum 97200 value 600 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Check_Button chkNotifyDupBand { label Band xywh {12 427 65 20} down_box DOWN_BOX } Fl_Check_Button chkNotifyDupMode { label Mode xywh {94 427 60 20} down_box DOWN_BOX } } Fl_Group grpNotifyAction { label Action open xywh {222 2 276 394} box ENGRAVED_FRAME align 21 } { Fl_Spinner cntNotifyActionLimit { label {Trigger limit (s):} tooltip {Minimum time between events} xywh {232 40 52 20} align 5 minimum 0 maximum 3600 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Input inpNotifyActionDialog { label {Show alert window:} xywh {232 82 218 60} type Multiline align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionDialogDefault { tooltip {Insert default text} xywh {460 100 28 23} } Fl_Spinner cntNotifyActionDialogTimeout { label {Hide window after (s):} xywh {232 164 52 20} align 5 minimum 0 maximum 3600 value 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Input inpNotifyActionRXMarker { label {Append to RX text:} xywh {232 205 218 60} type Multiline align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionMarkerDefault { tooltip {Insert default text} xywh {460 223 28 23} } Fl_Input inpNotifyActionMacro { label {Append to TX text:} xywh {232 287 218 60} type Multiline align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionMacro { tooltip {Show macro editor} xywh {460 305 28 23} } Fl_Input inpNotifyActionProgram { label {Run program:} xywh {232 368 218 23} align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyActionProgram { xywh {460 368 28 23} } } Fl_Button btnNotifyAdd { xywh {223 402 90 23} } Fl_Button btnNotifyRemove { xywh {316 402 90 23} } Fl_Button btnNotifyUpdate { xywh {223 431 90 23} } Fl_Button btnNotifyTest { xywh {316 431 90 23} } Fl_Button btnNotifyClose { callback {o->window()->hide();} xywh {408 431 90 23} } Fl_Box tblNotifyList { xywh {2 460 496 88} box UP_FRAME selection_color 15 resizable class Table } } } Function {make_dxcc_window()} {open } { Fl_Window {} { label {DXCC entities} open xywh {618 147 435 450} type Double hide resizable size_range {300 400 0 0} } { Fl_Box tblNotifyFilterDXCC { xywh {2 2 432 370} box UP_FRAME color 7 selection_color 15 resizable class Table } Fl_Input inpNotifyDXCCSearchCountry { label {Find country:} tooltip {Press return to continue the search} xywh {104 382 120 23} code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpNotifyDXCCSearchCallsign { label {Find prefix:} xywh {104 415 120 23} code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnNotifyDXCCSelect { xywh {234 382 90 23} } Fl_Button btnNotifyDXCCDeselect { xywh {234 415 90 23} } Fl_Button btnNotifyDXCCClose { callback {o->window()->hide();} xywh {334 415 90 23} } } } fldigi-4.2.05/src/dialogs/rxmon.cxx0000664000175000017500000003123714611711171014071 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "gettext.h" #include "rxmon.h" #include #include #include #include #include #include "main.h" #include "fl_digi.h" #include "soundconf.h" #include "icons.h" #include "status.h" #include "fileselect.h" #include "audio_alert.h" Fl_Check_Button *btn_mon_xcvr_audio=(Fl_Check_Button *)0; static void cb_btn_mon_xcvr_audio(Fl_Check_Button* o, void*) { progdefaults.mon_xcvr_audio = o->value(); } Fl_Value_Slider2 *sldrRxFilt_vol=(Fl_Value_Slider2 *)0; static void cb_sldrRxFilt_vol(Fl_Value_Slider2* o, void*) { progdefaults.RxFilt_vol = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_rxgain_x10=(Fl_Check_Button *)0; static void cb_btn_rxgain_x10(Fl_Check_Button* o, void*) { progdefaults.rxgain_x10 = o->value(); } Fl_Check_Button *btn_mon_dsp_audio=(Fl_Check_Button *)0; static void cb_btn_mon_dsp_audio(Fl_Check_Button* o, void*) { progdefaults.mon_dsp_audio = o->value(); } Fl_Value_Slider2 *sldrRxFilt_bw=(Fl_Value_Slider2 *)0; static void cb_sldrRxFilt_bw(Fl_Value_Slider2* o, void*) { progdefaults.RxFilt_bw = o->value(); int bw2 = progdefaults.RxFilt_bw / 2; progdefaults.RxFilt_low = progdefaults.RxFilt_mid - bw2; if (progdefaults.RxFilt_low < 100) progdefaults.RxFilt_low = 100; progdefaults.RxFilt_high = progdefaults.RxFilt_mid + bw2; if (progdefaults.RxFilt_high > 4000) progdefaults.RxFilt_high = 4000; sldrRxFilt_low->value(progdefaults.RxFilt_low); sldrRxFilt_low->redraw(); sldrRxFilt_high->value(progdefaults.RxFilt_high); sldrRxFilt_high->redraw(); progdefaults.changed = true; audio_alert->init_filter(); } Fl_Value_Slider2 *sldrRxFilt_mid=(Fl_Value_Slider2 *)0; static void cb_sldrRxFilt_mid(Fl_Value_Slider2* o, void*) { progdefaults.RxFilt_mid = o->value(); int bw2 = progdefaults.RxFilt_bw / 2; progdefaults.RxFilt_low = progdefaults.RxFilt_mid - bw2; if (progdefaults.RxFilt_low < 100) progdefaults.RxFilt_low = 100; progdefaults.RxFilt_high = progdefaults.RxFilt_mid + bw2; if (progdefaults.RxFilt_high > 4000) progdefaults.RxFilt_high = 4000; sldrRxFilt_low->value(progdefaults.RxFilt_low); sldrRxFilt_low->redraw(); sldrRxFilt_high->value(progdefaults.RxFilt_high); sldrRxFilt_high->redraw(); progdefaults.changed = true; audio_alert->init_filter(); } Fl_Value_Slider2 *sldrRxFilt_low=(Fl_Value_Slider2 *)0; static void cb_sldrRxFilt_low(Fl_Value_Slider2* o, void*) { progdefaults.RxFilt_low = o->value(); int bw = progdefaults.RxFilt_high - progdefaults.RxFilt_low; progdefaults.RxFilt_bw = bw; sldrRxFilt_bw->value(bw); sldrRxFilt_bw->redraw(); int mid = (progdefaults.RxFilt_high + progdefaults.RxFilt_low) / 2; progdefaults.RxFilt_mid = mid; sldrRxFilt_mid->value(mid); sldrRxFilt_mid->redraw(); progdefaults.changed = true; audio_alert->init_filter(); } Fl_Value_Slider2 *sldrRxFilt_high=(Fl_Value_Slider2 *)0; static void cb_sldrRxFilt_high(Fl_Value_Slider2* o, void*) { progdefaults.RxFilt_high = o->value(); int bw = progdefaults.RxFilt_high - progdefaults.RxFilt_low; progdefaults.RxFilt_bw = bw; sldrRxFilt_bw->value(bw); sldrRxFilt_bw->redraw(); int mid = (progdefaults.RxFilt_high + progdefaults.RxFilt_low) / 2; progdefaults.RxFilt_mid = mid; sldrRxFilt_mid->value(mid); sldrRxFilt_mid->redraw(); progdefaults.changed = true; audio_alert->init_filter(); } Fl_Check_Button *btn_RxFilt_at_track=(Fl_Check_Button *)0; static void cb_btn_RxFilt_at_track(Fl_Check_Button* o, void*) { progdefaults.RxFilt_track_wf = o->value(); if (o->value() == 1) center_rxfilt_at_track(); } Fl_Check_Button *btn_mon_wf_display=(Fl_Check_Button *)0; static void cb_btn_mon_wf_display(Fl_Check_Button* o, void*) { progdefaults.mon_wf_display = o->value(); } Fl_Check_Button *btn_mon_xmt_audio=(Fl_Check_Button *)0; static void cb_btn_mon_xmt_audio(Fl_Check_Button* o, void*) { progdefaults.mon_xmt_audio = o->value(); } Fl_Value_Slider2 *sldr_tx_vol=(Fl_Value_Slider2 *)0; static void cb_sldr_tx_vol(Fl_Value_Slider2* o, void*) { progdefaults.mon_tx_vol = o->value(); progdefaults.changed = true; } Fl_Double_Window* make_rxaudio_dialog() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(360, 290, _("Rx Audio Monitor")); w = o; if (w) {/* empty */} { Fl_Group* o = new Fl_Group(5, 4, 350, 50); o->box(FL_BORDER_FRAME); o->color(FL_FOREGROUND_COLOR); { Fl_Check_Button* o = btn_mon_xcvr_audio = new Fl_Check_Button(15, 8, 70, 18, _("RX Monitor")); btn_mon_xcvr_audio->tooltip(_("Rx audio stream ON")); btn_mon_xcvr_audio->down_box(FL_DOWN_BOX); btn_mon_xcvr_audio->callback((Fl_Callback*)cb_btn_mon_xcvr_audio); o->value(progdefaults.mon_xcvr_audio); } // Fl_Check_Button* btn_mon_xcvr_audio { Fl_Value_Slider2* o = sldrRxFilt_vol = new Fl_Value_Slider2(15, 28, 290, 20, _("Rx Vol")); sldrRxFilt_vol->tooltip(_("Rx audio volume")); sldrRxFilt_vol->type(5); sldrRxFilt_vol->box(FL_DOWN_BOX); sldrRxFilt_vol->color((Fl_Color)206); sldrRxFilt_vol->selection_color((Fl_Color)2); sldrRxFilt_vol->labeltype(FL_NORMAL_LABEL); sldrRxFilt_vol->labelfont(0); sldrRxFilt_vol->labelsize(14); sldrRxFilt_vol->labelcolor(FL_FOREGROUND_COLOR); sldrRxFilt_vol->maximum(100); sldrRxFilt_vol->step(1); sldrRxFilt_vol->value(50); sldrRxFilt_vol->textsize(14); sldrRxFilt_vol->callback((Fl_Callback*)cb_sldrRxFilt_vol); sldrRxFilt_vol->align(Fl_Align(FL_ALIGN_RIGHT)); sldrRxFilt_vol->when(FL_WHEN_CHANGED); o->value(progdefaults.RxFilt_vol); } // Fl_Value_Slider2* sldrRxFilt_vol { Fl_Check_Button* o = btn_rxgain_x10 = new Fl_Check_Button(212, 7, 93, 18, _("Gain X 10")); btn_rxgain_x10->tooltip(_("Rx audio stream ON")); btn_rxgain_x10->down_box(FL_DOWN_BOX); btn_rxgain_x10->callback((Fl_Callback*)cb_btn_rxgain_x10); o->value(progdefaults.rxgain_x10); } // Fl_Check_Button* btn_rxgain_x10 o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 58, 350, 168, _("Filter Settings")); o->box(FL_BORDER_FRAME); o->color(FL_FOREGROUND_COLOR); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_mon_dsp_audio = new Fl_Check_Button(191, 68, 70, 18, _("Rx audio filter ON")); btn_mon_dsp_audio->tooltip(_("Enable DSP filtering of rx audio stream")); btn_mon_dsp_audio->down_box(FL_DOWN_BOX); btn_mon_dsp_audio->callback((Fl_Callback*)cb_btn_mon_dsp_audio); o->value(progdefaults.mon_dsp_audio); } // Fl_Check_Button* btn_mon_dsp_audio { Fl_Value_Slider2* o = sldrRxFilt_bw = new Fl_Value_Slider2(10, 93, 300, 20, _("BW")); sldrRxFilt_bw->tooltip(_("Filter bandwidth")); sldrRxFilt_bw->type(5); sldrRxFilt_bw->box(FL_DOWN_BOX); sldrRxFilt_bw->color((Fl_Color)206); sldrRxFilt_bw->selection_color((Fl_Color)2); sldrRxFilt_bw->labeltype(FL_NORMAL_LABEL); sldrRxFilt_bw->labelfont(0); sldrRxFilt_bw->labelsize(14); sldrRxFilt_bw->labelcolor(FL_FOREGROUND_COLOR); sldrRxFilt_bw->minimum(50); sldrRxFilt_bw->maximum(4000); sldrRxFilt_bw->step(10); sldrRxFilt_bw->value(500); sldrRxFilt_bw->textsize(14); sldrRxFilt_bw->callback((Fl_Callback*)cb_sldrRxFilt_bw); sldrRxFilt_bw->align(Fl_Align(FL_ALIGN_RIGHT)); sldrRxFilt_bw->when(FL_WHEN_CHANGED); o->value(progdefaults.RxFilt_bw); } // Fl_Value_Slider2* sldrRxFilt_bw { Fl_Value_Slider2* o = sldrRxFilt_mid = new Fl_Value_Slider2(10, 120, 300, 20, _("Mid")); sldrRxFilt_mid->tooltip(_("Filter center frequ ency")); sldrRxFilt_mid->type(5); sldrRxFilt_mid->box(FL_DOWN_BOX); sldrRxFilt_mid->color((Fl_Color)206); sldrRxFilt_mid->selection_color((Fl_Color)2); sldrRxFilt_mid->labeltype(FL_NORMAL_LABEL); sldrRxFilt_mid->labelfont(0); sldrRxFilt_mid->labelsize(14); sldrRxFilt_mid->labelcolor(FL_FOREGROUND_COLOR); sldrRxFilt_mid->minimum(400); sldrRxFilt_mid->maximum(3500); sldrRxFilt_mid->step(10); sldrRxFilt_mid->value(1500); sldrRxFilt_mid->textsize(14); sldrRxFilt_mid->callback((Fl_Callback*)cb_sldrRxFilt_mid); sldrRxFilt_mid->align(Fl_Align(FL_ALIGN_RIGHT)); sldrRxFilt_mid->when(FL_WHEN_CHANGED); o->value(progdefaults.RxFilt_mid); } // Fl_Value_Slider2* sldrRxFilt_mid { Fl_Value_Slider2* o = sldrRxFilt_low = new Fl_Value_Slider2(10, 147, 300, 20, _("Low")); sldrRxFilt_low->tooltip(_("Filter low cutoff frequency")); sldrRxFilt_low->type(5); sldrRxFilt_low->box(FL_DOWN_BOX); sldrRxFilt_low->color((Fl_Color)206); sldrRxFilt_low->selection_color((Fl_Color)2); sldrRxFilt_low->labeltype(FL_NORMAL_LABEL); sldrRxFilt_low->labelfont(0); sldrRxFilt_low->labelsize(14); sldrRxFilt_low->labelcolor(FL_FOREGROUND_COLOR); sldrRxFilt_low->minimum(100); sldrRxFilt_low->maximum(3000); sldrRxFilt_low->step(10); sldrRxFilt_low->value(500); sldrRxFilt_low->textsize(14); sldrRxFilt_low->callback((Fl_Callback*)cb_sldrRxFilt_low); sldrRxFilt_low->align(Fl_Align(FL_ALIGN_RIGHT)); sldrRxFilt_low->when(FL_WHEN_CHANGED); o->value(progdefaults.RxFilt_low); } // Fl_Value_Slider2* sldrRxFilt_low { Fl_Value_Slider2* o = sldrRxFilt_high = new Fl_Value_Slider2(10, 174, 300, 20, _("High")); sldrRxFilt_high->tooltip(_("Filter high cutoff frequency")); sldrRxFilt_high->type(5); sldrRxFilt_high->box(FL_DOWN_BOX); sldrRxFilt_high->color((Fl_Color)206); sldrRxFilt_high->selection_color((Fl_Color)2); sldrRxFilt_high->labeltype(FL_NORMAL_LABEL); sldrRxFilt_high->labelfont(0); sldrRxFilt_high->labelsize(14); sldrRxFilt_high->labelcolor(FL_FOREGROUND_COLOR); sldrRxFilt_high->minimum(500); sldrRxFilt_high->maximum(4000); sldrRxFilt_high->step(10); sldrRxFilt_high->value(900); sldrRxFilt_high->textsize(14); sldrRxFilt_high->callback((Fl_Callback*)cb_sldrRxFilt_high); sldrRxFilt_high->align(Fl_Align(FL_ALIGN_RIGHT)); sldrRxFilt_high->when(FL_WHEN_CHANGED); o->value(progdefaults.RxFilt_high); } // Fl_Value_Slider2* sldrRxFilt_high { Fl_Check_Button* o = btn_RxFilt_at_track = new Fl_Check_Button(15, 201, 70, 18, _("track WF cursor")); btn_RxFilt_at_track->tooltip(_("Filter center freq tracks waterfall track point")); btn_RxFilt_at_track->down_box(FL_DOWN_BOX); btn_RxFilt_at_track->callback((Fl_Callback*)cb_btn_RxFilt_at_track); o->value(progdefaults.RxFilt_track_wf); } // Fl_Check_Button* btn_RxFilt_at_track { Fl_Check_Button* o = btn_mon_wf_display = new Fl_Check_Button(195, 201, 70, 18, _("Waterfall display")); btn_mon_wf_display->tooltip(_("DSP filter width visible on waterfall")); btn_mon_wf_display->down_box(FL_DOWN_BOX); btn_mon_wf_display->callback((Fl_Callback*)cb_btn_mon_wf_display); o->value(progdefaults.mon_wf_display); } // Fl_Check_Button* btn_mon_wf_display o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(5, 230, 350, 54); o->box(FL_BORDER_FRAME); o->color(FL_FOREGROUND_COLOR); { Fl_Check_Button* o = btn_mon_xmt_audio = new Fl_Check_Button(10, 238, 70, 18, _("TX Monitor")); btn_mon_xmt_audio->tooltip(_("Transmit audio monitored")); btn_mon_xmt_audio->down_box(FL_DOWN_BOX); btn_mon_xmt_audio->callback((Fl_Callback*)cb_btn_mon_xmt_audio); o->value(progdefaults.mon_xmt_audio); } // Fl_Check_Button* btn_mon_xmt_audio { Fl_Value_Slider2* o = sldr_tx_vol = new Fl_Value_Slider2(10, 257, 290, 20, _("Tx Vol")); sldr_tx_vol->tooltip(_("Rx audio volume")); sldr_tx_vol->type(5); sldr_tx_vol->box(FL_DOWN_BOX); sldr_tx_vol->color((Fl_Color)206); sldr_tx_vol->selection_color((Fl_Color)2); sldr_tx_vol->labeltype(FL_NORMAL_LABEL); sldr_tx_vol->labelfont(0); sldr_tx_vol->labelsize(14); sldr_tx_vol->labelcolor(FL_FOREGROUND_COLOR); sldr_tx_vol->maximum(100); sldr_tx_vol->step(1); sldr_tx_vol->value(50); sldr_tx_vol->textsize(14); sldr_tx_vol->callback((Fl_Callback*)cb_sldr_tx_vol); sldr_tx_vol->align(Fl_Align(FL_ALIGN_RIGHT)); sldr_tx_vol->when(FL_WHEN_CHANGED); o->value(progdefaults.mon_tx_vol); } // Fl_Value_Slider2* sldr_tx_vol o->end(); } // Fl_Group* o o->end(); } // Fl_Double_Window* o return w; } fldigi-4.2.05/src/dialogs/font_browser.cxx0000664000175000017500000002326114611711171015435 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "font_browser.h" #include "flslider2.h" #include "gettext.h" #include "threads.h" #include "debug.h" #include #include void find_fonts(); Font_Browser* font_browser; //====================================================================== // static members int Font_Browser::instance = 0; int *Font_Browser::fixed = 0; int Font_Browser::numfonts = 100; std::list Font_Browser::font_list; //====================================================================== static inline std::string ucase(std::string s) { for (size_t n = 0; n < s.length(); n++) s[n] = toupper(s[n]); return s; } static bool font_compare(font_pair &p1, font_pair &p2) { if (ucase(p1.name) > ucase(p2.name)) return false; return true; } // Font Color selected void Font_Browser::ColorSelect() { unsigned char r, g, b; Fl::get_color(fontcolor, r, g, b); if (fl_color_chooser(_("Font color"), r, g, b) == 0) return; fontcolor = fl_rgb_color(r, g, b); btn_Color->color(fontcolor); btn_Color->labelcolor( fl_contrast(FL_BLACK, fontcolor)); } void Font_Browser::fb_callback(Fl_Widget* w, void* arg) { Font_Browser* fb = reinterpret_cast(arg); if (w == fb->btn_fixed) { if (fb->btn_fixed->value()) fb->fontFilter(FIXED_WIDTH); else fb->fontFilter(ALL_TYPES); return; } if (w == fb->btn_Cancel) fb->hide(); else if (w == fb->btn_OK) { if (fb->callback_) (*fb->callback_)(fb, fb->data_); } else if (w == fb->btn_Color) fb->ColorSelect(); else if (w == fb->lst_Font) fb->FontNameSelect(); else { if (w == fb->lst_Size) fb->txt_Size->value(strtol(fb->lst_Size->text(fb->lst_Size->value()), NULL, 10)); fb->fontsize = static_cast(fb->txt_Size->value()); } fb->box_Example->SetFont(fb->fontnbr, fb->fontsize, fb->fontcolor); } // Font Name changed callback void Font_Browser::FontNameSelect() { int fn = lst_Font->value(); if (!fn) return; fontnbr = (Fl_Font)reinterpret_cast(lst_Font->data(fn)); // get sizes and fill browser; skip first element if it is zero lst_Size->clear(); int nsizes, *sizes; char buf[4]; nsizes = Fl::get_font_sizes(fontnbr, sizes); // for (int i = !*sizes; i < nsizes; i++) if ((size_t)snprintf(buf, sizeof(buf), "%d", sizes[i]) < sizeof(buf)) lst_Size->add(buf, reinterpret_cast(sizes[i])); // scalable font with no suggested sizes if (!lst_Size->size()) { for (int i = 1; i <= 48; i++) { snprintf(buf, sizeof(buf), "%d", i); lst_Size->add(buf, reinterpret_cast(i)); } } fontSize(fontsize); } Font_Browser::Font_Browser(int x, int y, int w, int h, const char *lbl ) : Fl_Window(x, y, w, h, lbl) { lst_Font = new Fl_Browser(5, 15, 280, 125, _("Font:")); lst_Font->align(FL_ALIGN_TOP_LEFT); lst_Font->type(FL_HOLD_BROWSER); lst_Font->callback(fb_callback, this); txt_Size = new Fl_Value_Input2(290, 15, 50, 22, _("Size:")); txt_Size->align(FL_ALIGN_TOP_LEFT); txt_Size->range(1.0, 48.0); txt_Size->step(1.0); txt_Size->callback(fb_callback, this); lst_Size = new Fl_Browser(290, 40, 50, 100); lst_Size->type(FL_HOLD_BROWSER); lst_Size->callback(fb_callback, this); btn_fixed = new Fl_Check_Button(345, 15, 18, 18, _("Fixed")); btn_fixed->callback(fb_callback, this); btn_fixed->value(0); btn_OK = new Fl_Return_Button(345, 40, 80, 25, _("&OK")); btn_OK->shortcut(0x8006f); btn_OK->callback(fb_callback, this); btn_Cancel = new Fl_Button(345, 70, 80, 25, _("Cancel")); btn_Cancel->labelsize(12); btn_Cancel->callback(fb_callback, this); btn_Color = new Fl_Button(345, 100, 80, 25, _("Color")); btn_Color->down_box(FL_BORDER_BOX); btn_Color->color(FL_FOREGROUND_COLOR); btn_Color->labelcolor( fl_contrast(FL_BLACK, FL_FOREGROUND_COLOR)); btn_Color->callback(fb_callback, this); box_Example = new Preview_Box(5, 145, 420, 75, _("\ abcdefghijklmnopqrstuvwxyz\n\ ABCDEFGHIJKLMNOPQRSTUVWXYZ\n\ 0123456789" ) ); box_Example->box(FL_DOWN_BOX); box_Example->align(FL_ALIGN_WRAP|FL_ALIGN_CLIP|FL_ALIGN_CENTER|FL_ALIGN_INSIDE); resizable(box_Example); set_modal(); end(); // Initializations this->callback_ = 0; // Initialize Widgets callback this->data_ = 0; // And the data std::string fntname; bool ok = true; if (instance == 0) { ++instance; numfonts = Fl::set_fonts("*"); // Nr of fonts available on the server font_list.clear(); fixed = new int[numfonts]; int j = 0; for (int i = 0; i < numfonts; i++) { fntname = Fl::get_font_name((Fl_Font)i); ok = true; for (size_t k = 0; k < fntname.length(); k++) { if (fntname[k] < ' ' || fntname[k] > 'z' || fntname[k] == '\\' || fntname[k] == '@') { // disallowed chars in browser widget ok = false; break; } } if (fntname.empty()) ok = false; if (ok) { nufont.name = fntname; nufont.nbr = i; font_list.push_back(nufont); j++; } } numfonts = j; font_list.sort(font_compare); std::list temp_list = font_list; int i = 0; while (!temp_list.empty()) { nufont = temp_list.front(); lst_Font->add( nufont.name.c_str(), reinterpret_cast(nufont.nbr) ); temp_list.pop_front(); fixed[i++] = 0; } find_fonts(); } else { ++instance; std::list temp_list = font_list; while (!temp_list.empty()) { nufont = temp_list.front(); lst_Font->add( nufont.name.c_str(), reinterpret_cast(nufont.nbr) ); temp_list.pop_front(); } } fontnbr = FL_HELVETICA;; fontsize = FL_NORMAL_SIZE; fontcolor = FL_FOREGROUND_COLOR; filter = ALL_TYPES; lst_Font->value(1); FontNameSelect(); xclass(PACKAGE_NAME); } Font_Browser::~Font_Browser() { --instance; if (instance == 0) { delete [] fixed; fixed = 0; font_list.clear(); } } void Font_Browser::fontNumber(Fl_Font n) { fontnbr = n; lst_Font->value(1); int s = lst_Font->size(); for (int i = 1; i < s; i++ ) { if ((Fl_Font)reinterpret_cast(lst_Font->data(i)) == n) { lst_Font->value(i); FontNameSelect(); break; } } } void Font_Browser::fontSize(int s) { fontsize = s; int n = lst_Size->size(); for (int i = 1; i < n; i++) { if ((intptr_t)lst_Size->data(i) == fontsize) { lst_Size->value(i); break; } } txt_Size->value(s); } void Font_Browser::fontColor(Fl_Color c) { btn_Color->color(fontcolor = c); box_Example->SetFont(fontnbr, fontsize, fontcolor); box_Example->redraw(); } void Font_Browser::fontName(const char* n) { int s = lst_Font->size(); for (int i = 1; i < s; i++) { if (!strcmp(lst_Font->text(i), n)) { lst_Font->value(i); FontNameSelect(); } } } void Font_Browser::fontFilter(filter_t filter) { int s = lst_Font->size(); switch (filter) { case FIXED_WIDTH: for (int i = 0; i < s; i++) { if (fixed[i]) lst_Font->show(i + 1); else lst_Font->hide(i + 1); } btn_fixed->value(1); break; case VARIABLE_WIDTH: for (int i = 0; i < s; i++) { if (!fixed[i]) lst_Font->show(i + 1); else lst_Font->hide(i + 1); } btn_fixed->value(0); break; case ALL_TYPES: for (int i = 0; i < s; i++) lst_Font->show(i + 1); btn_fixed->value(0); break; } lst_Font->redraw(); lst_Font->topline(lst_Font->value()); } // separate thread used to evaluate fixed / proportional fonts // friend of Font_Browser // launched by Font_Browser instance 1 static pthread_t find_font_thread; static int is_fixed; Fl_Font test_font; void font_test(void *) { fl_font(test_font, FL_NORMAL_SIZE); is_fixed = (fl_width(".") == fl_width("W")); } void *find_fixed_fonts(void *) { std::list temp_list = Font_Browser::font_list; int i = 0; while (!temp_list.empty()) { test_font = temp_list.front().nbr; is_fixed = -1; Fl::awake(font_test); while (is_fixed == -1) { MilliSleep(1); } Font_Browser::fixed[i] = is_fixed; i++; temp_list.pop_front(); } return NULL; } void find_fonts() { if (pthread_create(&find_font_thread, NULL, find_fixed_fonts, NULL) < 0) { LOG_ERROR("%s", "pthread_create find_fixed_fonts failed"); } return; } bool Font_Browser::fixed_width(Fl_Font f) { fl_font(f, FL_NORMAL_SIZE); return fl_width(".") == fl_width("W"); } //---------------------------------------------------------------------- Preview_Box::Preview_Box(int x, int y, int w, int h, const char* l) : Fl_Widget(x, y, w, h, l) { fontName = 1; fontSize = FL_NORMAL_SIZE; box(FL_DOWN_BOX); color(FL_BACKGROUND2_COLOR); fontColor = FL_FOREGROUND_COLOR; } void Preview_Box::draw() { draw_box(); fl_font((Fl_Font)fontName, fontSize); fl_color(fontColor); fl_draw(label(), x()+3, y()+3, w()-6, h()-6, align()); } void Preview_Box::SetFont(int fontname, int fontsize, Fl_Color c) { fontName = fontname; fontSize = fontsize; fontColor = c; redraw(); } fldigi-4.2.05/src/dialogs/fl_digi_main.cxx0000664000175000017500000032012114611711171015320 00000000000000void create_fl_digi_main_primary() { // bx used as a temporary spacer Fl_Box *bx; int Wmacrobtn; int xpos; int ypos; int wBLANK; int fnt = progdefaults.FreqControlFontnbr; int freqheight = Hentry; fl_font(fnt, freqheight); int freqwidth = (int)fl_width("9") * 10; fl_font(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize); int Y = 0; #ifdef __APPLE__ fl_mac_set_about(cb_mnuAboutURL, 0); #endif IMAGE_WIDTH = 4000; Hwfall = progdefaults.wfheight; Wwfall = progStatus.mainW - 2 * DEFAULT_SW; int fixed_height = Hmenu + Hqsoframe + Hwfall + Hstatus; int hmacros = TB_HEIGHT * 4; fixed_height += hmacros; //---------------------------------------------------------------------- // needed to prevent user from manually modifying fldigi_def.xml // with values to would cause the UI to seg fault if (progdefaults.HellRcvHeight < 14) progdefaults.HellRcvHeight = 14; if (progdefaults.HellRcvHeight > 42) progdefaults.HellRcvHeight = 42; if (progdefaults.HellRcvWidth < 1) progdefaults.HellRcvWidth = 1; if (progdefaults.HellRcvWidth > 4) progdefaults.HellRcvWidth = 4; //---------------------------------------------------------------------- minhtext = 2 * progdefaults.HellRcvHeight + 4;//6; int Htext = 3 * minhtext; if (Htext < 120) Htext = 120; main_hmin = Htext + fixed_height; // developer usage //cout << "=============================================================" << endl; //cout << "min main_height ..... " << main_hmin << endl; //cout << " = Hmenu ............ " << Hmenu << endl; //cout << " + Hqsoframe ........ " << Hqsoframe << endl; //cout << " + Hwfall ........... " << Hwfall << endl; //cout << " + Hstatus ......... " << Hstatus << endl; //cout << " + Hmacros .......... " << hmacros << endl; //cout << " + text height ...... " << Htext << endl; //cout << "=============================================================" << endl; if (progStatus.mainH < main_hmin) { progStatus.mainH = main_hmin; } if (progStatus.tile_y > Htext) progStatus.tile_y = Htext / 2; int W = progStatus.mainW; int H = main_hmin; int xtmp = 0; fl_digi_main = new Fl_Double_Window( progStatus.mainX, progStatus.mainY, W, H); int lfont = progdefaults.MenuFontnbr; int lsize = progdefaults.MenuFontsize; fl_font(lfont, lsize); { // mnuFrame mnuFrame = new Fl_Group(0,0, W, Hmenu); mnu = new Fl_Menu_Bar(0, 0, W - 325, Hmenu); // do some more work on the menu for (int i = 0; i < main_menu_size; i++) { // set the icon label for items with the multi label type if (menu_[i].labeltype() == _FL_MULTI_LABEL) icons::set_icon_label(&menu_[i]); } mnu->menu(menu_); toggle_visible_modes(NULL, NULL); tx_timer = new Fl_Box(W - 325, 0, 75, Hmenu, ""); tx_timer->box(FL_UP_BOX); tx_timer->color(FL_BACKGROUND_COLOR); tx_timer->labelcolor(FL_BACKGROUND_COLOR); tx_timer->labelsize(FL_NORMAL_SIZE - 1); tx_timer->labelfont(lfont); btnAutoSpot = new Fl_Light_Button(W - 250, 0, 50, Hmenu, "Spot"); btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->callback(cbAutoSpot, 0); btnAutoSpot->deactivate(); btnAutoSpot->labelsize(FL_NORMAL_SIZE - 1); btnAutoSpot->labelfont(lfont); btnRSID = new Fl_Light_Button(W - 200, 0, 50, Hmenu, "RxID"); btnRSID->tooltip("Receive RSID"); btnRSID->selection_color( progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor); btnRSID->value(progdefaults.rsid); btnRSID->callback(cbRSID, 0); btnRSID->labelsize(FL_NORMAL_SIZE - 1); btnRSID->labelfont(lfont); btnTxRSID = new Fl_Light_Button(W - 150, 0, 50, Hmenu, "TxID"); btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->tooltip("Transmit RSID"); btnTxRSID->callback(cbTxRSID, 0); btnTxRSID->labelsize(FL_NORMAL_SIZE - 1); btnTxRSID->labelfont(lfont); btnTune = new Fl_Light_Button(W - 100, 0, 50, Hmenu, "TUNE"); btnTune->selection_color(progdefaults.TuneColor); btnTune->callback(cbTune, 0); btnTune->labelsize(FL_NORMAL_SIZE - 1); btnTune->labelfont(lfont); btnMacroTimer = new Fl_Button(W - 50, 0, 50, Hmenu); btnMacroTimer->labelcolor(FL_DARK_RED); btnMacroTimer->callback(cbMacroTimerButton); btnMacroTimer->set_output(); btnMacroTimer->labelsize(FL_NORMAL_SIZE - 1); btnMacroTimer->labelfont(lfont); mnuFrame->resizable(mnu); mnuFrame->end(); } int alt_btn_width = 2 * DEFAULT_SW; { // Constants // reset the message dialog font fl_message_font(FL_HELVETICA, FL_NORMAL_SIZE); // reset the tooltip font Fl_Tooltip::font(FL_HELVETICA); Fl_Tooltip::size(FL_NORMAL_SIZE); Fl_Tooltip::hoverdelay(0.5); Fl_Tooltip::delay(2.0); Fl_Tooltip::enable(progdefaults.tooltips); Y += mnuFrame->h(); } TopFrame1 = new Fl_Group( 0, Y, fl_digi_main->w(), Hqsoframe); { // TopFrame1 int fnt1 = progdefaults.FreqControlFontnbr; int freqheight1 = 2 * Hentry + pad - 2; fl_font(fnt1, freqheight1); int freqwidth1 = (int)fl_width("9") * 10; int mode_cbo_w = (freqwidth1 - 2 * Wbtn - 3 * pad) / 2; int bw_cbo_w = freqwidth1 - 2 * Wbtn - 3 * pad - mode_cbo_w; int smeter_w = mode_cbo_w + bw_cbo_w + pad; int rig_control_frame_width = freqwidth1 + 3 * pad; fl_font(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize); RigControlFrame = new Fl_Group( 0, TopFrame1->y(), rig_control_frame_width, Hqsoframe); { // RigControlFrame 1 RigControlFrame->box(FL_FLAT_BOX); qsoFreqDisp1 = new cFreqControl( pad, RigControlFrame->y() + pad, freqwidth1, freqheight1, "10"); qsoFreqDisp1->box(FL_DOWN_BOX); qsoFreqDisp1->color(FL_BACKGROUND_COLOR); qsoFreqDisp1->selection_color(FL_BACKGROUND_COLOR); qsoFreqDisp1->labeltype(FL_NORMAL_LABEL); qsoFreqDisp1->font(progdefaults.FreqControlFontnbr); qsoFreqDisp1->labelsize(12); qsoFreqDisp1->labelcolor(FL_FOREGROUND_COLOR); qsoFreqDisp1->align(FL_ALIGN_CENTER); qsoFreqDisp1->when(FL_WHEN_RELEASE); qsoFreqDisp1->callback(qso_movFreq); qsoFreqDisp1->SetCOLORS( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp1->value(0); qsoFreqDisp1->end(); pwrmeter = new PWRmeter( qsoFreqDisp1->x(), qsoFreqDisp1->y() + qsoFreqDisp1->h() + pad, smeter_w, Hentry); pwrmeter->select(progdefaults.PWRselect); pwrmeter->tooltip(_("Click to set power level")); pwrmeter->callback( (Fl_Callback *) cb_meters); pwrmeter->hide(); smeter = new Smeter( qsoFreqDisp1->x(), qsoFreqDisp1->y() + qsoFreqDisp1->h() + pad, smeter_w, Hentry); set_smeter_colors(); smeter->tooltip(_("Click to set power level")); smeter->callback( (Fl_Callback *) cb_meters); smeter->hide(); pwrlevel_grp = new Fl_Group( smeter->x(), smeter->y(), smeter->w(), smeter->h()); pwr_level = new Fl_Value_Slider2( pwrlevel_grp->x(), pwrlevel_grp->y(), pwrlevel_grp->w() - 50, pwrlevel_grp->h()); pwr_level->type(FL_HOR_NICE_SLIDER); pwr_level->range(0, 100.0); pwr_level->step(1); pwr_level->callback( (Fl_Callback *) cb_set_pwr_level ); pwr_level->color( fl_rgb_color( progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G, progdefaults.bwsrSliderColor.B)); pwr_level->selection_color( fl_rgb_color( progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G, progdefaults.bwsrSldrSelColor.B)); pwr_level->tooltip(_("Adjust Power Level")); set_pwr_level = new Fl_Button( pwr_level->x() + pwr_level->w(), pwr_level->y(), 50, pwr_level->h(), _("Done")); set_pwr_level->tooltip(_("Return to Smeter / Pmeter")); set_pwr_level->callback( (Fl_Callback *) cb_exit_pwr_level ); pwrlevel_grp->end(); pwrlevel_grp->hide(); qso_combos = new Fl_Group( qsoFreqDisp1->x(), qsoFreqDisp1->y() + qsoFreqDisp1->h() + pad, smeter_w, Hentry); qso_combos->box(FL_FLAT_BOX); qso_opMODE = new Fl_ListBox( smeter->x(), smeter->y(), mode_cbo_w, Hentry); qso_opMODE->box(FL_DOWN_BOX); qso_opMODE->color(FL_BACKGROUND2_COLOR); qso_opMODE->selection_color(FL_BACKGROUND_COLOR); qso_opMODE->labeltype(FL_NORMAL_LABEL); qso_opMODE->labelfont(0); qso_opMODE->labelsize(FL_NORMAL_SIZE); qso_opMODE->labelcolor(FL_FOREGROUND_COLOR); qso_opMODE->callback((Fl_Callback*)cb_qso_opMODE); qso_opMODE->align(FL_ALIGN_TOP); qso_opMODE->when(FL_WHEN_RELEASE); qso_opMODE->readonly(true); qso_opMODE->end(); qso_opBW = new Fl_ListBox( qso_opMODE->x() + mode_cbo_w + pad, smeter->y(), bw_cbo_w, Hentry); qso_opBW->box(FL_DOWN_BOX); qso_opBW->color(FL_BACKGROUND2_COLOR); qso_opBW->selection_color(FL_BACKGROUND_COLOR); qso_opBW->labeltype(FL_NORMAL_LABEL); qso_opBW->labelfont(0); qso_opBW->labelsize(FL_NORMAL_SIZE); qso_opBW->labelcolor(FL_FOREGROUND_COLOR); qso_opBW->callback((Fl_Callback*)cb_qso_opBW); qso_opBW->align(FL_ALIGN_TOP); qso_opBW->when(FL_WHEN_RELEASE); qso_opBW->readonly(true); qso_opBW->end(); qso_opGROUP = new Fl_Group( qso_opMODE->x() + mode_cbo_w + pad, smeter->y(), bw_cbo_w, Hentry); qso_opGROUP->box(FL_FLAT_BOX); qso_btnBW1 = new Fl_Button( qso_opGROUP->x(), qso_opGROUP->y(), qso_opGROUP->h() * 3 / 4, qso_opGROUP->h()); qso_btnBW1->callback((Fl_Callback*)cb_qso_btnBW1); qso_opBW1 = new Fl_ListBox( qso_btnBW1->x()+qso_btnBW1->w(), qso_btnBW1->y(), qso_opGROUP->w() - qso_btnBW1->w(), qso_btnBW1->h()); qso_opBW1->box(FL_DOWN_BOX); qso_opBW1->color(FL_BACKGROUND2_COLOR); qso_opBW1->selection_color(FL_BACKGROUND_COLOR); qso_opBW1->labeltype(FL_NORMAL_LABEL); qso_opBW1->labelfont(0); qso_opBW1->labelsize(FL_NORMAL_SIZE); qso_opBW1->labelcolor(FL_FOREGROUND_COLOR); qso_opBW1->callback((Fl_Callback*)cb_qso_opBW1); qso_opBW1->align(FL_ALIGN_TOP); qso_opBW1->when(FL_WHEN_RELEASE); qso_opBW1->end(); qso_btnBW1->hide(); qso_opBW1->hide(); qso_btnBW2 = new Fl_Button( qso_opGROUP->x(), qso_opGROUP->y(), qso_opGROUP->h() * 3 / 4, qso_opGROUP->h()); qso_btnBW2->callback((Fl_Callback*)cb_qso_btnBW2); qso_opBW2 = new Fl_ListBox( qso_btnBW2->x()+qso_btnBW2->w(), qso_btnBW2->y(), qso_opGROUP->w() - qso_btnBW2->w(), qso_btnBW2->h()); qso_opBW2->box(FL_DOWN_BOX); qso_opBW2->color(FL_BACKGROUND2_COLOR); qso_opBW2->selection_color(FL_BACKGROUND_COLOR); qso_opBW2->labeltype(FL_NORMAL_LABEL); qso_opBW2->labelfont(0); qso_opBW2->labelsize(FL_NORMAL_SIZE); qso_opBW2->labelcolor(FL_FOREGROUND_COLOR); qso_opBW2->callback((Fl_Callback*)cb_qso_opBW2); qso_opBW2->align(FL_ALIGN_TOP); qso_opBW2->when(FL_WHEN_RELEASE); qso_opBW2->end(); qso_opGROUP->end(); qso_opGROUP->hide(); qso_combos->end(); Fl_Button *smeter_toggle = new Fl_Button( qso_opBW->x() + qso_opBW->w() + pad, smeter->y(), Wbtn, Hentry); smeter_toggle->callback(cb_toggle_smeter, 0); smeter_toggle->tooltip(_("Toggle smeter / combo controls")); smeter_toggle->image(new Fl_Pixmap(tango_view_refresh)); qso_opPICK = new Fl_Button( smeter_toggle->x() + Wbtn + pad, smeter->y(), Wbtn, Hentry); addrbookpixmap = new Fl_Pixmap(address_book_icon); qso_opPICK->image(addrbookpixmap); qso_opPICK->callback(showOpBrowserView, 0); qso_opPICK->tooltip(_("Open List")); RigControlFrame->resizable(NULL); RigControlFrame->end(); } Fl_Group *rightframes = new Fl_Group( rightof(RigControlFrame) + pad, RigControlFrame->y(), W - rightof(RigControlFrame) - pad, Hqsoframe); rightframes->box(FL_FLAT_BOX); { // rightframes RigViewerFrame = new Fl_Group( rightframes->x(), rightframes->y(), rightframes->w(), rightframes->h()); { // RigViewerFrame qso_btnSelFreq = new Fl_Button( RigViewerFrame->x(), RigViewerFrame->y() + pad, Wbtn, Hentry); qso_btnSelFreq->image(new Fl_Pixmap(left_arrow_icon)); qso_btnSelFreq->tooltip(_("Select")); qso_btnSelFreq->callback((Fl_Callback*)cb_qso_btnSelFreq); qso_btnAddFreq = new Fl_Button( rightof(qso_btnSelFreq) + pad, RigViewerFrame->y() + pad, Wbtn, Hentry); qso_btnAddFreq->image(new Fl_Pixmap(plus_icon)); qso_btnAddFreq->tooltip(_("Add current frequency")); qso_btnAddFreq->callback((Fl_Callback*)cb_qso_btnAddFreq); qso_btnClearList = new Fl_Button( RigViewerFrame->x(), RigViewerFrame->y() + Hentry + 2 * pad, Wbtn, Hentry); qso_btnClearList->image(new Fl_Pixmap(trash_icon)); qso_btnClearList->tooltip(_("Load/Save/Clear list\nLoad - SHIFT\nSave - CNTRL")); qso_btnClearList->callback((Fl_Callback*)cb_qso_btnClearList); qso_btnDelFreq = new Fl_Button( rightof(qso_btnClearList) + pad, RigViewerFrame->y() + Hentry + 2 * pad, Wbtn, Hentry); qso_btnDelFreq->image(new Fl_Pixmap(minus_icon)); qso_btnDelFreq->tooltip(_("Delete from list")); qso_btnDelFreq->callback((Fl_Callback*)cb_qso_btnDelFreq); qso_btnAct = new Fl_Button( RigViewerFrame->x(), RigViewerFrame->y() + 2*(Hentry + pad) + pad, Wbtn, Hentry); qso_btnAct->image(new Fl_Pixmap(chat_icon)); qso_btnAct->callback(cb_qso_inpAct); qso_btnAct->tooltip("Show active frequencies"); qso_inpAct = new Fl_Input2( rightof(qso_btnAct) + pad, RigViewerFrame->y() + 2*(Hentry + pad) + pad, Wbtn, Hentry); qso_inpAct->when(FL_WHEN_ENTER_KEY); qso_inpAct->callback(cb_qso_inpAct); qso_inpAct->tooltip("Grid prefix for activity list"); // fwidths set in rigsupport.cxx qso_opBrowser = new Fl_Browser( rightof(qso_btnDelFreq) + pad, RigViewerFrame->y() + pad, rightframes->w() - 2*Wbtn - pad, Hqsoframe - 2 * pad ); qso_opBrowser->column_widths(fwidths); qso_opBrowser->column_char('|'); qso_opBrowser->tooltip(_("Select operating parameters")); qso_opBrowser->callback((Fl_Callback*)cb_qso_opBrowser); qso_opBrowser->type(FL_MULTI_BROWSER); qso_opBrowser->box(FL_DOWN_BOX); qso_opBrowser->labelfont(4); qso_opBrowser->labelsize(12); #ifdef __APPLE__ qso_opBrowser->textfont(FL_SCREEN_BOLD); qso_opBrowser->textsize(13); #else qso_opBrowser->textfont(FL_HELVETICA); qso_opBrowser->textsize(13); #endif opUsageFrame = new Fl_Group( qso_opBrowser->x(), qso_opBrowser->y(), qso_opBrowser->w(), Hentry); opUsageFrame->box(FL_DOWN_BOX); opOutUsage = new Fl_Output( opUsageFrame->x() + pad, opUsageFrame->y() + opUsageFrame->h() / 2 - Hentry / 2, opUsageFrame->w() * 4 / 10, Hentry); opOutUsage->color(FL_BACKGROUND_COLOR); opUsage = new Fl_Input2( opOutUsage->x() + opOutUsage->w() + pad, opOutUsage->y(), opUsageFrame->w() - opOutUsage->w() - 50 - 3 * pad, Hentry); opUsageEnter = new Fl_Button( opUsage->x() + opUsage->w() , opUsage->y(), 50, Hentry, "Enter"); opUsageEnter->callback((Fl_Callback*)cb_opUsageEnter); opUsageFrame->end(); opUsageFrame->hide(); RigViewerFrame->resizable(qso_opBrowser); RigViewerFrame->end(); RigViewerFrame->hide(); } int y2 = TopFrame1->y() + Hentry + 2 * pad; int y3 = TopFrame1->y() + 2 * (Hentry + pad) + pad; x_qsoframe = RigViewerFrame->x(); Logging_frame = new Fl_Group( rightframes->x(), rightframes->y(), rightframes->w(), rightframes->h()); { // Logging frame { // buttons btnQRZ = new Fl_Button( x_qsoframe, qsoFreqDisp1->y(), Wbtn, Hentry); btnQRZ->image(new Fl_Pixmap(net_icon)); btnQRZ->callback(cb_QRZ, 0); btnQRZ->tooltip(_("QRZ")); qsoClear = new Fl_Button( x_qsoframe, btnQRZ->y() + pad + Wbtn, Wbtn, Hentry); qsoClear->image(new Fl_Pixmap(edit_clear_icon)); qsoClear->callback(qsoClear_cb, 0); qsoClear->tooltip(_("Clear")); qsoSave = new Fl_Button( x_qsoframe, qsoClear->y() + pad + Wbtn, Wbtn, Hentry); qsoSave->image(new Fl_Pixmap(save_icon)); qsoSave->callback(qsoSave_cb, 0); qsoSave->tooltip(_("Save")); } fl_font(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize); wf1 = fl_width("xFreq") + 90 + Hentry + 40 + fl_width("xOff") + 40 + fl_width("xIn") + 35 + fl_width("xOut") + 35; Logging_frame_1 = new Fl_Group( rightof(btnQRZ) + pad, TopFrame1->y(), wf1, Hqsoframe); { // Logging frame 1 { // Line 1 inpFreq1 = new Fl_Input2( Logging_frame_1->x() + fl_width("xFreq"), TopFrame1->y() + pad, 90, Hentry, _("Freq")); inpFreq1->type(FL_NORMAL_OUTPUT); inpFreq1->tooltip(_("frequency kHz")); inpFreq1->align(FL_ALIGN_LEFT); btnTimeOn = new Fl_Button( rightof(inpFreq1), TopFrame1->y() + pad, Hentry, Hentry, _("On")); btnTimeOn->tooltip(_("Press to update QSO start time")); btnTimeOn->callback(cb_btnTimeOn); inpTimeOn1 = new Fl_Input2( rightof(btnTimeOn), TopFrame1->y() + pad, 40, Hentry, ""); inpTimeOn1->tooltip(_("QSO start time")); inpTimeOn1->align(FL_ALIGN_LEFT); inpTimeOn1->type(FL_INT_INPUT); inpTimeOff1 = new Fl_Input2( rightof(inpTimeOn1) + fl_width("xOff"), TopFrame1->y() + pad, 40, Hentry, _("Off")); inpTimeOff1->tooltip(_("QSO end time")); inpRstIn1 = new Fl_Input2( rightof(inpTimeOff1) + fl_width("xIn"), TopFrame1->y() + pad, 35, Hentry, _("In")); inpRstIn1->tooltip("RST in"); inpRstIn1->align(FL_ALIGN_LEFT); inpRstOut1 = new Fl_Input2( rightof(inpRstIn1) + fl_width("xOut"), TopFrame1->y() + pad, 35, Hentry, _("Out")); inpRstOut1->tooltip("RST out"); inpRstOut1->align(FL_ALIGN_LEFT); inpCall1 = new Fl_Input2( inpFreq1->x(), y2, rightof(inpTimeOn1) - inpFreq1->x(), Hentry, _("Call")); inpCall1->tooltip(_("call sign")); inpCall1->align(FL_ALIGN_LEFT); inpName1 = new Fl_Input2( inpTimeOff1->x(), y2, rightof(inpRstIn1) - inpTimeOff1->x(),Hentry, _("Op")); inpName1->tooltip(_("Operator name")); inpName1->align(FL_ALIGN_LEFT); inpAZ = new Fl_Input2( inpRstOut1->x(), y2, 35, Hentry, "Az"); inpAZ->tooltip(_("Azimuth")); inpAZ->align(FL_ALIGN_LEFT); } gGEN_QSO_1 = new Fl_Group (x_qsoframe, y3, wf1, Hentry + pad); { // QSO frame 1 inpQth = new Fl_Input2( inpCall1->x(), y3, inpCall1->w(), Hentry, "Qth"); inpQth->tooltip(_("QTH City")); inpQth->align(FL_ALIGN_LEFT); inpQTH = inpQth; inpState1 = new Fl_Input2( rightof(inpQth) + 20, y3, 30, Hentry, "St"); inpState1->tooltip(_("US State")); inpState1->align(FL_ALIGN_LEFT); inpState = inpState1; inpVEprov = new Fl_Input2( rightof(inpState1) + 20, y3, 30, Hentry, "Pr"); inpVEprov->tooltip(_("Can. Province")); inpVEprov->align(FL_ALIGN_LEFT); inpLoc1 = new Fl_Input2( rightof(inpVEprov) + 15, y3, rightof(inpAZ) - (rightof(inpVEprov) + 15), Hentry, "L"); inpLoc1->tooltip(_("Maidenhead Locator")); inpLoc1->align(FL_ALIGN_LEFT); gGEN_QSO_1->end(); } gGEN_CONTEST = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // Contest - LOG_GENERIC outSerNo1 = new Fl_Input2( inpFreq1->x(), y3, 40, Hentry, "S#"); outSerNo1->align(FL_ALIGN_LEFT); outSerNo1->tooltip(_("Sent serial number (read only)")); outSerNo1->type(FL_NORMAL_OUTPUT); inpSerNo1 = new Fl_Input2( rightof(outSerNo1) + fl_width("xR#"), y3, 40, Hentry, "R#"); inpSerNo1->align(FL_ALIGN_LEFT); inpSerNo1->tooltip(_("Received serial number")); xtmp = rightof(inpSerNo1) + fl_width("xXch"); inpXchgIn1 = new Fl_Input2( xtmp, y3, Logging_frame_1->x() + Logging_frame_1->w() - xtmp, Hentry, "Xch"); inpXchgIn1->align(FL_ALIGN_LEFT); inpXchgIn1->tooltip(_("Contest exchange in")); gGEN_CONTEST->end(); gGEN_CONTEST->hide(); } gFD = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // Field Day - LOG_FD inp_FD_class1 = new Fl_Input2( Logging_frame_1->x() + fl_width("xClass"), y3, 40, Hentry, "Class"); inp_FD_class1->align(FL_ALIGN_LEFT); inp_FD_class1->tooltip(_("Received FD class")); inp_FD_class1->type(FL_NORMAL_INPUT); inp_FD_section1 = new Fl_Input2( rightof(inp_FD_class1) + fl_width("xSection"), y3, 40, Hentry, "Section"); inp_FD_section1->align(FL_ALIGN_LEFT); inp_FD_section1->tooltip(_("Received FD section")); inp_FD_section1->type(FL_NORMAL_INPUT); gFD->end(); gFD->hide(); } gKD_1 = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // ARRL Kids Day - LOG_KD inp_KD_age1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "Age"); inp_KD_age1->align(FL_ALIGN_LEFT); inp_KD_age1->tooltip(_("Guest operators age")); inp_KD_age1->type(FL_NORMAL_INPUT); inp_KD_state1 = new Fl_Input2( rightof(inp_KD_age1) + fl_width("xSt"), y3, 40, Hentry, "St"); inp_KD_state1->align(FL_ALIGN_LEFT); inp_KD_state1->tooltip(_("Station state")); inp_KD_state1->type(FL_NORMAL_INPUT); inp_KD_VEprov1 = new Fl_Input2( rightof(inp_KD_state1) + fl_width("xPr"), y3, 40, Hentry, "Pr"); inp_KD_VEprov1->align(FL_ALIGN_LEFT); inp_KD_VEprov1->tooltip(_("Station province")); inp_KD_VEprov1->type(FL_NORMAL_INPUT); inp_KD_XchgIn1 = new Fl_Input2( rightof(inp_KD_VEprov1) + fl_width("xXchg"), y3, gKD_1->x() + gKD_1->w() - (rightof(inp_KD_VEprov1) + fl_width("xXchg")), Hentry, "Xch"); inp_KD_XchgIn1->align(FL_ALIGN_LEFT); inp_KD_XchgIn1->tooltip(_("Additional Exchange")); inp_KD_XchgIn1->type(FL_NORMAL_INPUT); gKD_1->end(); gKD_1->hide(); } gARR = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_ARR rookie roundup inp_ARR_check1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "Chk"); inp_ARR_check1->align(FL_ALIGN_LEFT); inp_ARR_check1->tooltip(_("Check / birth-year")); inp_ARR_check1->type(FL_NORMAL_INPUT); inp_ARR_XchgIn1 = new Fl_Input2( rightof(inp_ARR_check1) + fl_width("xXchg"), y3, gARR->x() + gARR->w() - (rightof(inp_ARR_check1) + fl_width("xXchg")), Hentry, "Xchg"); inp_ARR_XchgIn1->align(FL_ALIGN_LEFT); inp_ARR_XchgIn1->tooltip(_("Round Up Exchange - State, Province, Country")); inp_ARR_XchgIn1->type(FL_NORMAL_INPUT); gARR->end(); gARR->hide(); } g1010 = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_1010 inp_1010_nr1 = new Fl_Input2( g1010->x() + fl_width("x1010#"), y3, 60, Hentry, "1010#"); inp_1010_nr1->align(FL_ALIGN_LEFT); inp_1010_nr1->tooltip(_("1010 number")); inp_1010_nr1->type(FL_NORMAL_INPUT); inp_1010_XchgIn1 = new Fl_Input2( rightof(inp_1010_nr1) + fl_width("xXchg"), y3, g1010->x() + g1010->w() - (rightof(inp_1010_nr1) + fl_width("xXchg")), Hentry, "Xchg"); inp_1010_XchgIn1->align(FL_ALIGN_LEFT); inp_1010_XchgIn1->tooltip(_("1010 exchange")); inp_1010_XchgIn1->type(FL_NORMAL_INPUT); g1010->end(); g1010->hide(); } gVHF = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_VHF inp_vhf_RSTin1 = new Fl_Input2( gVHF->x() + fl_width("xRSTin"), y3, 60, Hentry, "RSTin"); inp_vhf_RSTin1->align(FL_ALIGN_LEFT); inp_vhf_RSTin1->tooltip(_("Received RST")); inp_vhf_RSTin1->type(FL_NORMAL_INPUT); inp_vhf_RSTout1 = new Fl_Input2( rightof(inp_vhf_RSTin1) + fl_width("xout"), y3, 60, Hentry, "out"); inp_vhf_RSTout1->align(FL_ALIGN_LEFT); inp_vhf_RSTout1->tooltip(_("Sent RST")); inp_vhf_RSTout1->type(FL_NORMAL_INPUT); inp_vhf_Loc1 = new Fl_Input2( rightof(inp_vhf_RSTout1) + fl_width("xGrid"), y3, 80, Hentry, "Grid"); inp_vhf_Loc1->align(FL_ALIGN_LEFT); inp_vhf_Loc1->tooltip(_("Grid Locator")); inp_vhf_Loc1->type(FL_NORMAL_INPUT); gVHF->end(); gVHF->hide(); } gCQWW_RTTY = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // CQWW RTTY - LOG_CQWW_RTTY inp_CQzone1 = new Fl_Input2( gCQWW_RTTY->x() + fl_width("xCQz"), y3, 40, Hentry, "CQz"); inp_CQzone1->align(FL_ALIGN_LEFT); inp_CQzone1->tooltip(_("Received CQ zone")); inp_CQzone1->type(FL_NORMAL_INPUT); inp_CQstate1 = new Fl_Input2( rightof(inp_CQzone1) + fl_width("xCQs"), y3, 40, Hentry, "CQs"); inp_CQstate1->align(FL_ALIGN_LEFT); inp_CQstate1->tooltip(_("Received State/Prov")); inp_CQstate1->type(FL_NORMAL_INPUT); gCQWW_RTTY->end(); gCQWW_RTTY->hide(); } gCQWW_DX = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // CQWW DX -- LOG_CQWWDX0 inp_CQDXzone1 = new Fl_Input2( gCQWW_DX->x() + fl_width("xCQz"), y3, 40, Hentry, "CQz"); inp_CQDXzone1->align(FL_ALIGN_LEFT); inp_CQDXzone1->tooltip(_("Received CQ zone")); inp_CQDXzone1->type(FL_NORMAL_INPUT); gCQWW_DX->end(); gCQWW_DX->hide(); } gCQWPX = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_CQWPX outSerNo_WPX1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "S #"); outSerNo_WPX1->align(FL_ALIGN_LEFT); outSerNo_WPX1->tooltip(_("Sent serno")); outSerNo_WPX1->type(FL_NORMAL_OUTPUT); inpSerNo_WPX1 = new Fl_Input2( rightof(outSerNo_WPX1) + fl_width("xR#"), y3, 40, Hentry, "R#"); inpSerNo_WPX1->align(FL_ALIGN_LEFT); inpSerNo_WPX1->tooltip(_("Received serno")); inpSerNo_WPX1->type(FL_NORMAL_INPUT); gCQWPX->end(); gCQWPX->hide(); } gCWSS = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // CW Sweepstakes - LOG_CWSS outSerNo3 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "S#"); outSerNo3->align(FL_ALIGN_LEFT); outSerNo3->tooltip(_("Sent serno")); outSerNo3->type(FL_NORMAL_OUTPUT); inp_SS_SerialNoR1 = new Fl_Input2( rightof(outSerNo3) + fl_width("xR#"), y3, 40, Hentry, "R#"); inp_SS_SerialNoR1->align(FL_ALIGN_LEFT); inp_SS_SerialNoR1->tooltip(_("Received serno")); inp_SS_SerialNoR1->type(FL_NORMAL_INPUT); inp_SS_Precedence1 = new Fl_Input2( rightof(inp_SS_SerialNoR1) + fl_width("xPre"), y3, 40, Hentry, "Pre"); inp_SS_Precedence1->align(FL_ALIGN_LEFT); inp_SS_Precedence1->tooltip(_("SS Precedence")); inp_SS_Precedence1->type(FL_NORMAL_INPUT); inp_SS_Check1 = new Fl_Input2( rightof(inp_SS_Precedence1) + fl_width("xChk"), y3, 40, Hentry, "Chk"); inp_SS_Check1->align(FL_ALIGN_LEFT); inp_SS_Check1->tooltip(_("SS Check")); inp_SS_Check1->type(FL_NORMAL_INPUT); inp_SS_Section1 = new Fl_Input2( rightof(inp_SS_Check1) + fl_width("xSec"), y3, 40, Hentry, "Sec"); inp_SS_Section1->align(FL_ALIGN_LEFT); inp_SS_Section1->tooltip(_("SS section")); inp_SS_Section1->type(FL_NORMAL_INPUT); gCWSS->end(); gCWSS->hide(); } gASCR = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // School Roundup - LOG_ASCR inp_ASCR_class1 = new Fl_Input2( Logging_frame_1->x() + fl_width("xClass"), y3, 30, Hentry, "Class"); inp_ASCR_class1->align(FL_ALIGN_LEFT); inp_ASCR_class1->tooltip(_("ASCR class, I/C/S")); inp_ASCR_class1->type(FL_NORMAL_INPUT); inp_ASCR_class1->hide(); xtmp = rightof(inp_ASCR_class1) + fl_width("xSPC"); inp_ASCR_XchgIn1 = new Fl_Input2( xtmp, y3, Logging_frame_1->x() + Logging_frame_1->w() - xtmp - pad, Hentry, "SPC"); inp_ASCR_XchgIn1->align(FL_ALIGN_LEFT); inp_ASCR_XchgIn1->tooltip(_("State/Province/Country received")); inp_ASCR_XchgIn1->type(FL_NORMAL_INPUT); inp_ASCR_XchgIn1->hide(); gASCR->end(); gASCR->hide(); } gIARI = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // IARI - Italian International DX LOG_IARI inp_IARI_PR1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "Pr"); inp_IARI_PR1->align(FL_ALIGN_LEFT); inp_IARI_PR1->tooltip(_("Received Province / Ser #")); inp_IARI_PR1->type(FL_NORMAL_INPUT); out_IARI_SerNo1 = new Fl_Input2( rightof(inp_IARI_PR1) + fl_width("xS#"), y3, 40, Hentry, "S#"); out_IARI_SerNo1->align(FL_ALIGN_LEFT); out_IARI_SerNo1->tooltip(_("Sent serno")); out_IARI_SerNo1->type(FL_NORMAL_OUTPUT); inp_IARI_SerNo1 = new Fl_Input2( rightof(out_IARI_SerNo1) + fl_width("xR#"), y3, 40, Hentry, "R#"); inp_IARI_SerNo1->align(FL_ALIGN_LEFT); inp_IARI_SerNo1->tooltip(_("Received serno")); inp_IARI_SerNo1->type(FL_NORMAL_INPUT); gIARI->end(); gIARI->hide(); } gNAQP = new Fl_Group( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // North American Qso Party - LOG_NAQP inpSPCnum_NAQP1 = new Fl_Input2( Logging_frame_1->x() + fl_width("xNAQP xchg"), y3, 100, Hentry, "NAQP xchg"); inpSPCnum_NAQP1->align(FL_ALIGN_LEFT); inpSPCnum_NAQP1->tooltip(_("Received State/Province/Country")); inpSPCnum_NAQP1->type(FL_NORMAL_INPUT); inpSPCnum_NAQP1->hide(); gNAQP->end(); gNAQP->hide(); } gARRL_RTTY = new Fl_Group( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_RTTY ARRL RTTY Roundup inpRTU_stpr1 = new Fl_Input2( inpCall1->x(), y3, fl_width("xWWW"), Hentry, "S/P"); inpRTU_stpr1->align(FL_ALIGN_LEFT); inpRTU_stpr1->tooltip(_("State/Province/#")); inpRTU_stpr1->type(FL_NORMAL_INPUT); xtmp = rightof(inpRTU_stpr1) + fl_width("xSer"); inpRTU_serno1 = new Fl_Input2( xtmp, y3, fl_width("x9999"), Hentry, "Ser"); inpRTU_serno1->align(FL_ALIGN_LEFT); inpRTU_serno1->tooltip(_("Serial number received")); inpRTU_serno1->type(FL_NORMAL_INPUT); gARRL_RTTY->end(); gARRL_RTTY->hide(); } gNAS = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // NA Sprint - LOG_NAS outSerNo5 = new Fl_Input2( Logging_frame_1->x() + fl_width("xS#"), y3, 40, Hentry, "S#"); outSerNo5->align(FL_ALIGN_LEFT); outSerNo5->tooltip(_("Sent serial number")); outSerNo5->type(FL_NORMAL_OUTPUT); outSerNo5->hide(); xtmp = rightof(outSerNo5) + fl_width("xR#"); inp_ser_NAS1 = new Fl_Input2( xtmp, y3, 40, Hentry, "R #"); inp_ser_NAS1->align(FL_ALIGN_LEFT); inp_ser_NAS1->tooltip(_("Received serial number")); inp_ser_NAS1->type(FL_NORMAL_INPUT); inp_ser_NAS1->hide(); xtmp = rightof(inp_ser_NAS1) + fl_width("xS/P/C"); inpSPCnum_NAS1 = new Fl_Input2( xtmp, y3, Logging_frame_1->x() + Logging_frame_1->w() - xtmp - pad, Hentry, "S/P/C"); inpSPCnum_NAS1->align(FL_ALIGN_LEFT); inpSPCnum_NAS1->tooltip(_("State/Province/Country received")); inpSPCnum_NAS1->type(FL_NORMAL_INPUT); inpSPCnum_NAS1->hide(); gASCR->end(); gASCR->hide(); } gAIDX = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_AAM outSerNo7 = new Fl_Input2( Logging_frame_1->x() + fl_width("xS#"), y3, 40, Hentry, "S#"); outSerNo7->align(FL_ALIGN_LEFT); outSerNo7->tooltip(_("Sent serial number")); outSerNo7->type(FL_NORMAL_OUTPUT); outSerNo7->hide(); xtmp = rightof(outSerNo7) + fl_width("xR#"); inpSerNo3 = new Fl_Input2( xtmp, y3, 40, Hentry, "R#"); inpSerNo3->align(FL_ALIGN_LEFT); inpSerNo3->tooltip(_("Received serial number")); inpSerNo3->type(FL_NORMAL_INPUT); inpSerNo3->hide(); gAIDX->end(); gAIDX->hide(); } gJOTA = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_JOTA - Jamboree On The Air xtmp = Logging_frame_1->x() + fl_width("xTroop"); inp_JOTA_troop1 = new Fl_Input2( xtmp, y3, 60, Hentry, "Troop"); inp_JOTA_troop1->align(FL_ALIGN_LEFT); inp_JOTA_troop1->tooltip(_("Troop received")); inp_JOTA_troop1->type(FL_NORMAL_INPUT); inp_JOTA_troop1->hide(); xtmp = rightof(inp_JOTA_troop1) + fl_width("xScout"); inp_JOTA_scout1 = new Fl_Input2( xtmp, y3, 80, Hentry, "Scout"); inp_JOTA_scout1->align(FL_ALIGN_LEFT); inp_JOTA_scout1->tooltip(_("Scout name received")); inp_JOTA_scout1->type(FL_NORMAL_INPUT); inp_JOTA_scout1->hide(); xtmp = rightof(inp_JOTA_scout1) + fl_width("xS/P/C"); inp_JOTA_spc1 = new Fl_Input2( xtmp, y3, Logging_frame_1->x() + Logging_frame_1->w() - xtmp - pad, Hentry, "S/P/C"); inp_JOTA_spc1->align(FL_ALIGN_LEFT); inp_JOTA_spc1->tooltip(_("State/Province/Country received")); inp_JOTA_spc1->type(FL_NORMAL_INPUT); inp_JOTA_spc1->hide(); gJOTA->end(); gJOTA->hide(); } gAICW = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_AICW - ARRL International DX - CW xtmp = Logging_frame_1->x() + fl_width("xPwr-R"); inpSPCnum_AICW1 = new Fl_Input2( xtmp, y3, 60, Hentry, "Pwr-R"); inpSPCnum_AICW1->align(FL_ALIGN_LEFT); inpSPCnum_AICW1->tooltip(_("Power received")); inpSPCnum_AICW1->type(FL_NORMAL_INPUT); inpSPCnum_AICW1->hide(); gAICW->end(); gAICW->hide(); } gSQSO = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_SQSO - all state QSO party controls xtmp = inpCall1->x(); inpSQSO_state1 = new Fl_Input2( xtmp, y3, fl_width("xWW"), Hentry, "St"); inpSQSO_state1->align(FL_ALIGN_LEFT); inpSQSO_state1->tooltip(_("State received")); inpSQSO_state1->type(FL_NORMAL_INPUT); inpSQSO_state1->hide(); xtmp = rightof(inpSQSO_state1) + fl_width("xCnty"); inpSQSO_county1 = new Fl_Input2( xtmp, y3, fl_width("WWWWW"), Hentry, "Cnty"); inpSQSO_county1->align(FL_ALIGN_LEFT); inpSQSO_county1->tooltip(_("County received")); inpSQSO_county1->type(FL_NORMAL_INPUT); inpSQSO_county1->hide(); inpCounty = inpSQSO_county1; xtmp = rightof(inpSQSO_county1) + fl_width("xS#"); outSQSO_serno1 = new Fl_Input2( xtmp, y3, fl_width("9999"), Hentry, "S#"); outSQSO_serno1->align(FL_ALIGN_LEFT); outSQSO_serno1->tooltip(_("Sent serial number")); outSQSO_serno1->type(FL_NORMAL_INPUT); outSQSO_serno1->hide(); xtmp = rightof(outSQSO_serno1) + fl_width("xR#"); inpSQSO_serno1 = new Fl_Input2( xtmp, y3, fl_width("9999"), Hentry, "R#"); inpSQSO_serno1->align(FL_ALIGN_LEFT); inpSQSO_serno1->tooltip(_("Received serial number")); inpSQSO_serno1->type(FL_NORMAL_INPUT); inpSQSO_serno1->hide(); xtmp = rightof(inpSQSO_serno1) + fl_width("x Cat"); inpSQSO_category1 = new Fl_Input2( xtmp, y3, gSQSO->x() + gSQSO->w() - xtmp - pad, Hentry, "Cat"); inpSQSO_category1->tooltip(_("Category: CLB, MOB, QRP, STD")); inpSQSO_category1->type(FL_NORMAL_INPUT); inpSQSO_category1->hide(); inpSQSO_category = inpSQSO_category1; gSQSO->end(); gSQSO->hide(); } gWAE = new Fl_Group ( Logging_frame_1->x(), y3, wf1, Hentry + pad); { // LOG_WAE outSerNo_WAE1 = new Fl_Input2( inpCall1->x(), y3, 40, Hentry, "S #"); outSerNo_WAE1->align(FL_ALIGN_LEFT); outSerNo_WAE1->tooltip(_("Sent serno")); outSerNo_WAE1->type(FL_NORMAL_OUTPUT); inpSerNo_WAE1 = new Fl_Input2( rightof(outSerNo_WAE1) + fl_width("xR#"), y3, 40, Hentry, "R#"); inpSerNo_WAE1->align(FL_ALIGN_LEFT); inpSerNo_WAE1->tooltip(_("Received serno")); inpSerNo_WAE1->type(FL_NORMAL_INPUT); // xtmp = rightof(inpSerNo_WAE1) + fl_width("xCntry"); // cboCountryWAE1 = new Fl_ComboBox( // xtmp, y3, // Logging_frame_1->x() + Logging_frame_1->w() - xtmp - pad, Hentry, // "Cntry"); // cboCountryWAE1->align(FL_ALIGN_LEFT); // cboCountryWAE1->tooltip(_("Country")); // cboCountryWAE1->end(); gWAE->end(); gWAE->hide(); } Logging_frame_1->resizable(NULL); Logging_frame_1->end(); } { // NFtabs groups // Logging frame 2 int nfx = rightof(Logging_frame_1) + pad; int nfy = Logging_frame_1->y(); int nfw = W - nfx - pad - 59 - pad; int nfh = Logging_frame_1->h(); NFtabs_group = new Fl_Group(nfx, nfy, nfw, nfh, ""); NFtabs_group->box(FL_FLAT_BOX); NFtabs = new Fl_Tabs(nfx, nfy, nfw, nfh, ""); int cax = nfx + pad; int caw = nfw - 2*pad; int cay = nfy + Hentry; int cah = nfh - Hentry; Ccframe = new Fl_Group(cax, cay, caw, cah, "Cnty/Cntry"); cboCountyQSO = new Fl_ComboBox( cax + pad, inpCall1->y(), caw - 2*pad, Hentry, ""); cboCountyQSO->tooltip(_("County")); cboCountyQSO->callback(cb_CountyQSO); cboCountyQSO->readonly(); cboCountyQSO->end(); cboCountryQSO = new Fl_ComboBox( cax + pad, inpQth->y(), caw - 2*pad, Hentry, ""); cboCountryQSO->tooltip(_("Country")); cboCountryQSO->readonly(); cboCountryQSO->end(); Ccframe->end(); NotesFrame = new Fl_Group(cax, cay, caw, cah,"Notes"); inpNotes = new Fl_Input2( cax + pad, cay + pad, caw-2*pad, cah-2*pad, ""); inpNotes->type(FL_MULTILINE_INPUT); inpNotes->tooltip(_("Notes")); NotesFrame->end(); NFtabs->end(); NFtabs_group->end(); NFtabs_group->show(); } // NFtabs end ifkp_avatar = new picture( W - 59 - pad, NFtabs->y(), 59, 74); ifkp_avatar->box(FL_FLAT_BOX); ifkp_avatar->noslant(); ifkp_avatar->callback(cb_ifkp_send_avatar); ifkp_avatar->tooltip(_("Left click - save avatar\nRight click - send my avatar")); ifkp_load_avatar(); ifkp_avatar->hide(); thor_avatar = new picture( W - 59 - pad, NFtabs->y(), 59, 74); thor_avatar->box(FL_FLAT_BOX); thor_avatar->noslant(); thor_avatar->callback(cb_thor_send_avatar); thor_avatar->tooltip(_("Left click - save avatar\nRight click - send my avatar")); thor_load_avatar(); thor_avatar->hide(); Logging_frame->end(); Logging_frame->resizable(NFtabs); // Logging_frame->resizable(Logging_frame_2); } rightframes->end(); } TopFrame1->resizable(rightframes); TopFrame1->end(); } TopFrame2 = new Fl_Group(0, TopFrame1->y(), W, Hentry + 2 * pad); { // TopFrame2 int y = TopFrame1->y() + pad; int h = Hentry; qsoFreqDisp2 = new cFreqControl( pad, y, freqwidth, freqheight, "10"); qsoFreqDisp2->box(FL_DOWN_BOX); qsoFreqDisp2->color(FL_BACKGROUND_COLOR); qsoFreqDisp2->selection_color(FL_BACKGROUND_COLOR); qsoFreqDisp2->labeltype(FL_NORMAL_LABEL); qsoFreqDisp2->align(FL_ALIGN_CENTER); qsoFreqDisp2->when(FL_WHEN_RELEASE); qsoFreqDisp2->callback(qso_movFreq); qsoFreqDisp2->font(progdefaults.FreqControlFontnbr); qsoFreqDisp2->SetCOLORS( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp2->value(0); qso_opPICK2 = new Fl_Button( rightof(qsoFreqDisp2), y, Wbtn, Hentry); qso_opPICK2->align(FL_ALIGN_INSIDE); qso_opPICK2->image(addrbookpixmap); qso_opPICK2->callback(showOpBrowserView2, 0); qso_opPICK2->tooltip(_("Open List")); btnQRZ2 = new Fl_Button( pad + rightof(qso_opPICK2), y, Wbtn, Hentry); btnQRZ2->align(FL_ALIGN_INSIDE); btnQRZ2->image(new Fl_Pixmap(net_icon)); btnQRZ2->callback(cb_QRZ, 0); btnQRZ2->tooltip(_("QRZ")); qsoClear2 = new Fl_Button( pad + rightof(btnQRZ2), y, Wbtn, Hentry); qsoClear2->align(FL_ALIGN_INSIDE); qsoClear2->image(new Fl_Pixmap(edit_clear_icon)); qsoClear2->callback(qsoClear_cb, 0); qsoClear2->tooltip(_("Clear")); qsoSave2 = new Fl_Button( pad + rightof(qsoClear2), y, Wbtn, Hentry); qsoSave2->align(FL_ALIGN_INSIDE); qsoSave2->image(new Fl_Pixmap(save_icon)); qsoSave2->callback(qsoSave_cb, 0); qsoSave2->tooltip(_("Save")); const char *label2 = _("On"); btnTimeOn2 = new Fl_Button( pad + rightof(qsoSave2), y, static_cast(fl_width(label2)), h, label2); btnTimeOn2->tooltip(_("Press to update")); btnTimeOn2->callback(cb_btnTimeOn); inpTimeOn2 = new Fl_Input2( pad + btnTimeOn2->x() + btnTimeOn2->w(), y, w_inpTime2, h, ""); inpTimeOn2->tooltip(_("Time On")); inpTimeOn2->type(FL_INT_INPUT); const char *label3 = _("Off"); Fl_Box *bx3 = new Fl_Box(pad + rightof(inpTimeOn2), y, static_cast(fl_width(label3)), h, label3); inpTimeOff2 = new Fl_Input2( pad + bx3->x() + bx3->w(), y, w_inpTime2, h, ""); inpTimeOff2->tooltip(_("Time Off")); inpTimeOff2->type(FL_NORMAL_OUTPUT); const char *label4 = _("Call"); Fl_Box *bx4 = new Fl_Box(pad + rightof(inpTimeOff2), y, static_cast(fl_width(label4)), h, label4); inpCall2 = new Fl_Input2( pad + bx4->x() + bx4->w(), y, w_inpCall2, h, ""); inpCall2->tooltip(_("Other call")); const char *label6 = _("In"); Fl_Box *bx6 = new Fl_Box(pad + rightof(inpCall2), y, static_cast(fl_width(label6)), h, label6); inpRstIn2 = new Fl_Input2( pad + bx6->x() + bx6->w(), y, w_inpRstIn2, h, ""); inpRstIn2->tooltip(_("Received RST")); const char *label7 = _("Out"); Fl_Box *bx7 = new Fl_Box(pad + rightof(inpRstIn2), y, static_cast(fl_width(label7)), h, label7); inpRstOut2 = new Fl_Input2( pad + bx7->x() + bx7->w(), y, w_inpRstOut2, h, ""); inpRstOut2->tooltip(_("Sent RST")); const char *label5 = _("Nm"); Fl_Box *bx5 = new Fl_Box(pad + rightof(inpRstOut2), y, static_cast(fl_width(label5)), h, label5); int xn = pad + bx5->x() + bx5->w(); inpName2 = new Fl_Input2( xn, y, W - xn - pad, h, ""); inpName2->tooltip(_("Other name")); TopFrame2->resizable(inpName2); TopFrame2->end(); TopFrame2->hide(); } TopFrame3 = new Fl_Group(0, TopFrame1->y(), W, Hentry + 2 * pad); { // TopFrame3 int y = TopFrame3->y() + pad; int h = Hentry; fl_font(progdefaults.LOGGINGtextfont, progdefaults.LOGGINGtextsize); const char *xData = "x8888"; const char *xCall = "xWW8WWW"; const char *xRST = "x599"; int wData = static_cast(fl_width(xData)); int wCall = static_cast(fl_width(xCall)); int wRST = static_cast(fl_width(xRST)); int w3a = pad + freqwidth + 3*(pad + Wbtn) + fl_width("xCall") + wCall; // Top Frame 3a // freqdisp, oppick, qsoclear, qsosave, call TopFrame3a = new Fl_Group( 0, TopFrame1->y(), w3a, Hentry,""); qsoFreqDisp3 = new cFreqControl( pad, y, freqwidth, freqheight, "10"); qsoFreqDisp3->box(FL_DOWN_BOX); qsoFreqDisp3->color(FL_BACKGROUND_COLOR); qsoFreqDisp3->selection_color(FL_BACKGROUND_COLOR); qsoFreqDisp3->labeltype(FL_NORMAL_LABEL); qsoFreqDisp3->align(FL_ALIGN_CENTER); qsoFreqDisp3->when(FL_WHEN_RELEASE); qsoFreqDisp3->callback(qso_movFreq); qsoFreqDisp3->font(progdefaults.FreqControlFontnbr); qsoFreqDisp3->SetCOLORS( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp3->value(0); qso_opPICK3 = new Fl_Button( pad + rightof(qsoFreqDisp3), y, Wbtn, Hentry); qso_opPICK3->align(FL_ALIGN_INSIDE); qso_opPICK3->image(addrbookpixmap); qso_opPICK3->callback(showOpBrowserView2, 0); qso_opPICK3->tooltip(_("Open List")); qsoClear3 = new Fl_Button( pad + rightof(qso_opPICK3), y, Wbtn, Hentry); qsoClear3->align(FL_ALIGN_INSIDE); qsoClear3->image(new Fl_Pixmap(edit_clear_icon)); qsoClear3->callback(qsoClear_cb, 0); qsoClear3->tooltip(_("Clear")); qsoSave3 = new Fl_Button( pad + rightof(qsoClear3), y, Wbtn, Hentry); qsoSave3->align(FL_ALIGN_INSIDE); qsoSave3->image(new Fl_Pixmap(save_icon)); qsoSave3->callback(qsoSave_cb, 0); qsoSave3->tooltip(_("Save")); inpCall3 = new Fl_Input2( rightof(qsoSave3) + fl_width("Call"), y, wCall, h, "Call"); inpCall3->align(FL_ALIGN_LEFT); inpCall3->tooltip(_("Other call")); TopFrame3a->end(); TopFrame3b = new Fl_Group( rightof(TopFrame3a), TopFrame1->y(), W - rightof(TopFrame3a), Hentry,""); // LOG_GENERIC - partial log_generic_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); btnTimeOn3 = new Fl_Button( rightof(inpCall3) + pad, y, h, h, "On"); btnTimeOn3->tooltip(_("Press to update")); btnTimeOn3->callback(cb_btnTimeOn); inpTimeOn3 = new Fl_Input2( rightof(btnTimeOn3) + pad, y, wData, h, ""); inpTimeOn3->tooltip(_("Time On")); inpTimeOn3->type(FL_INT_INPUT); inpTimeOff3 = new Fl_Input2( rightof(inpTimeOn3) + fl_width("xOff"), y, wData, h, "Off"); inpTimeOff3->tooltip(_("Time Off")); inpTimeOff3->type(FL_NORMAL_OUTPUT); inpSerNo2 = new Fl_Input2( rightof(inpTimeOff3) + fl_width("xR#"), y, wData, h, "R#"); inpSerNo2->align(FL_ALIGN_LEFT); inpSerNo2->tooltip(_("Received serial number")); outSerNo2 = new Fl_Input2( rightof(inpSerNo2) + fl_width("xS#"), y, wData, h, "S#"); outSerNo2->align(FL_ALIGN_LEFT); outSerNo2->tooltip(_("Sent serial number (read only)")); inpXchgIn2 = new Fl_Input2( rightof(outSerNo2) + fl_width("xXch"), y, fl_digi_main->w() - (rightof(outSerNo2) + fl_width("xXchg"))- pad, h, "Xch"); inpXchgIn2->align(FL_ALIGN_LEFT); inpXchgIn2->tooltip(_("Contest exchange in")); Fl_Box lgf_box(rightof(inpXchgIn2), y, pad, h,""); lgf_box.box(FL_FLAT_BOX); log_generic_frame->end(); log_generic_frame->hide(); log_generic_frame->resizable(lgf_box); // end LOG_GENERIC - partial // LOG_FD - partial log_fd_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); btnTimeOn4 = new Fl_Button( rightof(inpCall3) + pad, y, h, h, "On"); btnTimeOn4->tooltip(_("Press to update")); btnTimeOn4->callback(cb_btnTimeOn); inpTimeOn4 = new Fl_Input2( rightof(btnTimeOn4) + pad, y, wData, h, ""); inpTimeOn4->tooltip(_("Time On")); inpTimeOn4->type(FL_INT_INPUT); inpTimeOff4 = new Fl_Input2( rightof(inpTimeOn4) + fl_width("xOff"), y, wData, h, "Off"); inpTimeOff4->tooltip(_("Time Off")); inpTimeOff4->type(FL_NORMAL_OUTPUT); inp_FD_class2 = new Fl_Input2( rightof(inpTimeOff4) + fl_width("xClass"), y, wData, h, " Class"); inp_FD_class2->align(FL_ALIGN_LEFT); inp_FD_class2->tooltip(_("Received FD class")); inp_FD_class2->type(FL_NORMAL_INPUT); inp_FD_section2 = new Fl_Input2( rightof(inp_FD_class2) + fl_width("xSect") - pad, y, wData, h, "Sect"); inp_FD_section2->align(FL_ALIGN_LEFT); inp_FD_section2->tooltip(_("Received FD section")); inp_FD_section2->type(FL_NORMAL_INPUT); Fl_Box lfd_box(rightof(inp_FD_section2), y, pad, h,""); lfd_box.box(FL_FLAT_BOX); log_fd_frame->end(); log_fd_frame->hide(); log_fd_frame->resizable(lfd_box); // end LOG_FD - partial // LOG_KD - partial log_kd_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_KD_name2 = new Fl_Input2( rightof(inpCall3) + fl_width("xNam"), y, 70, h, "Nam"); inp_KD_name2->align(FL_ALIGN_LEFT); inp_KD_name2->tooltip("Guest operator"); inp_KD_name2->type(FL_NORMAL_INPUT); inp_KD_age2 = new Fl_Input2( rightof(inp_KD_name2) + fl_width("xAge"), y, wData, h, "Age"); inp_KD_age2->align(FL_ALIGN_LEFT); inp_KD_age2->tooltip(_("Guest operators age")); inp_KD_age2->type(FL_NORMAL_INPUT); inp_KD_state2 = new Fl_Input2( rightof(inp_KD_age2) + fl_width("xSt"), y, 40, h, "St"); inp_KD_state2->align(FL_ALIGN_LEFT); inp_KD_state2->tooltip(_("Station state")); inp_KD_state2->type(FL_NORMAL_INPUT); inp_KD_VEprov2 = new Fl_Input2( rightof(inp_KD_state2) + fl_width("xPr"), y, 40, h, "Pr"); inp_KD_VEprov2->align(FL_ALIGN_LEFT); inp_KD_VEprov2->tooltip(_("Station province")); inp_KD_VEprov2->type(FL_NORMAL_INPUT); inp_KD_XchgIn2 = new Fl_Input2( rightof(inp_KD_VEprov2) + fl_width("xXch"), y, fl_digi_main->w() - (rightof(inp_KD_state2) + fl_width("xXch")) - pad, h, "Xch"); inp_KD_XchgIn2->align(FL_ALIGN_LEFT); inp_KD_XchgIn2->tooltip(_("Special Kids Day Special Exchange")); inp_KD_XchgIn2->type(FL_NORMAL_INPUT); Fl_Box lkd_box(rightof(inp_KD_XchgIn2), y, pad, h,""); lkd_box.box(FL_FLAT_BOX); log_kd_frame->end(); log_kd_frame->hide(); log_kd_frame->resizable(lkd_box); // end LOG_KD -partial // LOG_1010 - partial log_1010_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_1010_name2 = new Fl_Input2( rightof(inpCall3) + fl_width("xOp"), y, 80, h, "Op"); inp_1010_name2->align(FL_ALIGN_LEFT); inp_1010_name2->tooltip("Operator's name"); inp_1010_name2->type(FL_NORMAL_INPUT); inp_1010_nr2 = new Fl_Input2( rightof(inp_1010_name2) + fl_width("x1010"), y, wData, h, "1010"); inp_1010_nr2->align(FL_ALIGN_LEFT); inp_1010_nr2->tooltip(_("1010 number")); inp_1010_nr2->type(FL_NORMAL_INPUT); inp_1010_XchgIn2 = new Fl_Input2( rightof(inp_1010_nr2) + fl_width("xXch"), y, fl_digi_main->w() - (rightof(inp_1010_nr2) + fl_width("xXch")) - pad, h, "Xch"); inp_1010_XchgIn2->align(FL_ALIGN_LEFT); inp_1010_XchgIn2->tooltip(_("1010 Exchange")); inp_1010_XchgIn2->type(FL_NORMAL_INPUT); Fl_Box l1010_box(rightof(inp_1010_XchgIn2), y, pad, h,""); l1010_box.box(FL_FLAT_BOX); log_1010_frame->end(); log_1010_frame->hide(); log_1010_frame->resizable(l1010_box); // end LOG_1010 -partial // LOG_ARR - partial log_arr_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_ARR_Name2 = new Fl_Input2( rightof(inpCall3) + fl_width("xNam"), y, 80, h, "Nam"); inp_ARR_Name2->align(FL_ALIGN_LEFT); inp_ARR_Name2->tooltip("Operator's name"); inp_ARR_Name2->type(FL_NORMAL_INPUT); inp_ARR_check2 = new Fl_Input2( rightof(inp_ARR_Name2) + fl_width("xChk"), y, 40, h, "Chk"); inp_ARR_check2->align(FL_ALIGN_LEFT); inp_ARR_check2->tooltip(_("Check / birth-year")); inp_ARR_check2->type(FL_NORMAL_INPUT); inp_ARR_XchgIn2 = new Fl_Input2( rightof(inp_ARR_check2) + fl_width("xXch"), y, fl_digi_main->w() - (rightof(inp_ARR_check2) + fl_width("xXch")) - pad, Hentry, "Xch"); inp_ARR_XchgIn2->align(FL_ALIGN_LEFT); inp_ARR_XchgIn2->tooltip(_("Round Up Exchange")); inp_ARR_XchgIn2->type(FL_NORMAL_INPUT); Fl_Box larr_box(rightof(inp_ARR_XchgIn2), y, pad, h,""); larr_box.box(FL_FLAT_BOX); log_arr_frame->end(); log_arr_frame->hide(); log_arr_frame->resizable(larr_box); // end LOG_ARR - partial // LOG_VHF - partial log_vhf_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_vhf_RSTin2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inp_vhf_RSTin2->align(FL_ALIGN_LEFT); inp_vhf_RSTin2->tooltip(_("Received RST")); inp_vhf_RSTin2->type(FL_NORMAL_INPUT); inp_vhf_RSTout2 = new Fl_Input2( rightof(inp_vhf_RSTin2) + fl_width("xOut"), y, wRST, h, "Out"); inp_vhf_RSTout2->align(FL_ALIGN_LEFT); inp_vhf_RSTout2->tooltip(_("Sent RST")); inp_vhf_RSTout2->type(FL_NORMAL_INPUT); inp_vhf_Loc2 = new Fl_Input2( rightof(inp_vhf_RSTout2) + fl_width("xGr")- pad, y, 80, h, "Gr"); inp_vhf_Loc2->align(FL_ALIGN_LEFT); inp_vhf_Loc2->tooltip(_("Grid Locator")); inp_vhf_Loc2->type(FL_NORMAL_INPUT); Fl_Box lvhf_box(rightof(inp_vhf_Loc2), y, pad, h,""); lvhf_box.box(FL_FLAT_BOX); log_vhf_frame->end(); log_vhf_frame->hide(); log_vhf_frame->resizable(lvhf_box); // end LOG_VHF - partial // LOG_CQWW_DX - partial log_cqww_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_CQDX_RSTin2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inp_CQDX_RSTin2->align(FL_ALIGN_LEFT); inp_CQDX_RSTin2->tooltip(_("Received RST")); inp_CQDX_RSTin2->type(FL_NORMAL_INPUT); inp_CQDX_RSTout2 = new Fl_Input2( rightof(inp_CQDX_RSTin2) + fl_width("xOut"), y, wRST, h, "Out"); inp_CQDX_RSTout2->align(FL_ALIGN_LEFT); inp_CQDX_RSTout2->tooltip(_("Sent RST")); inp_CQDX_RSTout2->type(FL_NORMAL_INPUT); inp_CQDXzone2 = new Fl_Input2( rightof(inp_CQDX_RSTout2) + fl_width("xCQz"), y, 40, h, "CQz"); inp_CQDXzone2->align(FL_ALIGN_LEFT); inp_CQDXzone2->tooltip(_("Received CQ zone")); inp_CQDXzone2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_CQDXzone2) + fl_width("xCQc"); cboCountryCQDX2 = new Fl_ComboBox( xtmp, y, fl_digi_main->w() - xtmp - pad, Hentry, "CQc"); cboCountryCQDX2->align(FL_ALIGN_LEFT); cboCountryCQDX2->tooltip(_("Received CQ country")); cboCountryCQDX2->end(); Fl_Box lcqdx_box(rightof(cboCountryCQDX2), y, pad, h,""); lcqdx_box.box(FL_FLAT_BOX); log_cqww_frame->end(); log_cqww_frame->hide(); log_cqww_frame->resizable(lcqdx_box); // end LOG_CQWW_DX - partial // LOG_CQWW_RTTY - partial log_cqww_rtty_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_CQ_RSTin2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inp_CQ_RSTin2->align(FL_ALIGN_LEFT); inp_CQ_RSTin2->tooltip(_("Received RST")); inp_CQ_RSTin2->type(FL_NORMAL_INPUT); inp_CQ_RSTout2 = new Fl_Input2( rightof(inp_CQ_RSTin2) + fl_width("xOut"), y, wRST, h, "Out"); inp_CQ_RSTout2->align(FL_ALIGN_LEFT); inp_CQ_RSTout2->tooltip(_("Sent RST")); inp_CQ_RSTout2->type(FL_NORMAL_INPUT); inp_CQzone2 = new Fl_Input2( rightof(inp_CQ_RSTout2) + fl_width("xCQz"), y, 40, h, "CQz"); inp_CQzone2->align(FL_ALIGN_LEFT); inp_CQzone2->tooltip(_("Received CQ zone")); inp_CQzone2->type(FL_NORMAL_INPUT); inp_CQstate2 = new Fl_Input2( rightof(inp_CQzone2) + fl_width("xCQst"), y, 40, h, "CQst"); inp_CQstate2->align(FL_ALIGN_LEFT); inp_CQstate2->tooltip(_("Received CQ State/Prov")); inp_CQstate2->type(FL_NORMAL_INPUT); cboCountryCQ2 = new Fl_ComboBox( rightof(inp_CQstate2) + fl_width("xCQc"), y, fl_digi_main->w() - (rightof(inp_CQstate2) + fl_width("xCQc")) - pad, Hentry, "CQc"); cboCountryCQ2->align(FL_ALIGN_LEFT); cboCountryCQ2->tooltip(_("Received CQ country")); cboCountryCQ2->end(); Fl_Box lcq_box(rightof(cboCountryCQ2), y, pad, h,""); lcq_box.box(FL_FLAT_BOX); log_cqww_rtty_frame->end(); log_cqww_rtty_frame->hide(); log_cqww_rtty_frame->resizable(lcq_box); // end LOG_CQWW_RTTY - partial // LOG CWSS - partial log_cqss_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); outSerNo4 = new Fl_Input2( rightof(inpCall3) + fl_width("xS#"), y, 40, h, "S#"); outSerNo4->align(FL_ALIGN_LEFT); outSerNo4->tooltip(_("Sent serno")); outSerNo4->type(FL_NORMAL_OUTPUT); inp_SS_SerialNoR2 = new Fl_Input2( rightof(outSerNo4) + fl_width("xR#"), y, 40, Hentry, "R#"); inp_SS_SerialNoR2->align(FL_ALIGN_LEFT); inp_SS_SerialNoR2->tooltip(_("Received serno")); inp_SS_SerialNoR2->type(FL_NORMAL_INPUT); inp_SS_Precedence2 = new Fl_Input2( rightof(inp_SS_SerialNoR2) + fl_width("xPre"), y, 40, Hentry, "Pre"); inp_SS_Precedence2->align(FL_ALIGN_LEFT); inp_SS_Precedence2->tooltip(_("SS Precedence")); inp_SS_Precedence2->type(FL_NORMAL_INPUT); inp_SS_Check2 = new Fl_Input2( rightof(inp_SS_Precedence2) + fl_width("xChk"), y, 40, Hentry, "Chk"); inp_SS_Check2->align(FL_ALIGN_LEFT); inp_SS_Check2->tooltip(_("SS Check")); inp_SS_Check2->type(FL_NORMAL_INPUT); inp_SS_Section2 = new Fl_Input2( rightof(inp_SS_Check2) + fl_width("xSec"), y, 40, Hentry, "Sec"); inp_SS_Section2->align(FL_ALIGN_LEFT); inp_SS_Section2->tooltip(_("SS section")); inp_SS_Section2->type(FL_NORMAL_INPUT); Fl_Box lss_box(rightof(inp_SS_Section2), y, pad, h,""); lss_box.box(FL_FLAT_BOX); log_cqss_frame->end(); log_cqss_frame->hide(); log_cqss_frame->resizable(lss_box); // end LOG CWSS - partial // LOG_CQWPX - partial log_cqwpx_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inpRstIn_WPX2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inpRstIn_WPX2->align(FL_ALIGN_LEFT); inpRstIn_WPX2->tooltip(_("Received RST")); inpRstIn_WPX2->type(FL_NORMAL_INPUT); inpRstOut_WPX2 = new Fl_Input2( rightof(inpRstIn_WPX2) + fl_width("xOut"), y, wRST, h, "Out"); inpRstOut_WPX2->align(FL_ALIGN_LEFT); inpRstOut_WPX2->tooltip(_("Sent RST")); inpRstOut_WPX2->type(FL_NORMAL_INPUT); outSerNo_WPX2 = new Fl_Input2( rightof(inpRstOut_WPX2) + fl_width("xS#"), y, 40, h, "S#"); outSerNo_WPX2->align(FL_ALIGN_LEFT); outSerNo_WPX2->tooltip(_("Sent serial number")); outSerNo_WPX2->type(FL_NORMAL_INPUT); inpSerNo_WPX2 = new Fl_Input2( rightof(outSerNo_WPX2) + fl_width("xR#") - pad, y, 40, h, "R#"); inpSerNo_WPX2->align(FL_ALIGN_LEFT); inpSerNo_WPX2->tooltip(_("Received serial number")); inpSerNo_WPX2->type(FL_NORMAL_INPUT); Fl_Box lwpx_box(rightof(inpSerNo_WPX2), y, pad, h,""); lwpx_box.box(FL_FLAT_BOX); log_cqwpx_frame->end(); log_cqwpx_frame->hide(); log_cqwpx_frame->resizable(lwpx_box); // end LOG_CQWPX - partial // LOG_ASCR - partial log_ascr_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inp_ASCR_name2 = new Fl_Input2( rightof(inpCall3) + fl_width("xNam"), y, 80, h, "Nam"); inp_ASCR_name2->align(FL_ALIGN_LEFT); inp_ASCR_name2->tooltip(_("Rcvd name")); inp_ASCR_name2->type(FL_NORMAL_INPUT); inp_ASCR_RSTin2 = new Fl_Input2( rightof(inp_ASCR_name2) + fl_width("xIn"), y, wRST, Hentry, "In"); inp_ASCR_RSTin2->align(FL_ALIGN_LEFT); inp_ASCR_RSTin2->tooltip(_("Received RST")); inp_ASCR_RSTin2->type(FL_NORMAL_INPUT); inp_ASCR_RSTout2 = new Fl_Input2( rightof(inp_ASCR_RSTin2) + fl_width("xOut"), y, wRST, Hentry, "Out"); inp_ASCR_RSTout2->align(FL_ALIGN_LEFT); inp_ASCR_RSTout2->tooltip(_("Sent RST")); inp_ASCR_RSTout2->type(FL_NORMAL_INPUT); inp_ASCR_class2 = new Fl_Input2( rightof(inp_ASCR_RSTout2) + fl_width("xClass"), y, 30, Hentry, "Class"); inp_ASCR_class2->align(FL_ALIGN_LEFT); inp_ASCR_class2->tooltip(_("ASCR class")); inp_ASCR_class2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_ASCR_class2) + fl_width("xSPC"); inp_ASCR_XchgIn2 = new Fl_Input2( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "SPC"); inp_ASCR_XchgIn2->align(FL_ALIGN_LEFT); inp_ASCR_XchgIn2->tooltip(_("State/Province/Country received")); inp_ASCR_XchgIn2->type(FL_NORMAL_INPUT); Fl_Box lascr_box(rightof(inp_ASCR_XchgIn2), y, pad, h,""); lascr_box.box(FL_FLAT_BOX); log_ascr_frame->end(); log_ascr_frame->hide(); log_ascr_frame->resizable(lascr_box); // end LOG_ASCR - partial // LOG_NAQP - partial log_naqp_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); btnTimeOn5 = new Fl_Button( rightof(inpCall3) + pad, y, h, h, "On"); btnTimeOn5->tooltip(_("Press to update")); btnTimeOn5->callback(cb_btnTimeOn); inpTimeOn5 = new Fl_Input2( rightof(btnTimeOn3) + pad, y, wData, h, ""); inpTimeOn5->tooltip(_("Time On")); inpTimeOn5->type(FL_INT_INPUT); inpTimeOff5 = new Fl_Input2( rightof(inpTimeOn5) + fl_width("xOff"), y, wData, h, "Off"); inpTimeOff5->tooltip(_("Time Off")); inpTimeOff5->type(FL_NORMAL_OUTPUT); inpNAQPname2 = new Fl_Input2( rightof(inpTimeOff5) + fl_width("xNam"), y, 100, h, "Nam"); inpNAQPname2->align(FL_ALIGN_LEFT); inpNAQPname2->tooltip(_("Received operator name")); inpNAQPname2->type(FL_NORMAL_INPUT); inpSPCnum_NAQP2 = new Fl_Input2( rightof(inpNAQPname2) + fl_width("xXch"), y, 80, h, "Xch"); inpSPCnum_NAQP2->align(FL_ALIGN_LEFT); inpSPCnum_NAQP2->tooltip(_("Received State/Province/Country")); inpSPCnum_NAQP2->type(FL_NORMAL_INPUT); Fl_Box lnaqp_box(rightof(inpSPCnum_NAQP2), y, pad, h,""); lnaqp_box.box(FL_FLAT_BOX); log_naqp_frame->end(); log_naqp_frame->hide(); log_naqp_frame->resizable(lnaqp_box); // LOG_NAQP - partial // LOG_RTTY - partial log_rtty_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inpRTU_stpr2 = new Fl_Input2( rightof(inpCall3) + fl_width("xS/P"), y, fl_width("xWW"), Hentry, "S/P"); inpRTU_stpr2->align(FL_ALIGN_LEFT); inpRTU_stpr2->tooltip(_("State/Province")); inpRTU_stpr2->type(FL_NORMAL_INPUT); inpRTU_serno2 = new Fl_Input2( rightof(inpRTU_stpr2) + fl_width("xSer"), y, fl_width("x9999"), Hentry, "Ser"); inpRTU_serno2->align(FL_ALIGN_LEFT); inpRTU_serno2->tooltip(_("Serial number received")); inpRTU_serno2->type(FL_NORMAL_INPUT); inpRTU_RSTin2 = new Fl_Input2( rightof(inpRTU_serno2) + fl_width("xR"), y, wRST, Hentry, "R"); inpRTU_RSTin2->align(FL_ALIGN_LEFT); inpRTU_RSTin2->tooltip("Received RST"); inpRTU_RSTin2->type(FL_NORMAL_INPUT); inpRTU_RSTout2 = new Fl_Input2( rightof(inpRTU_RSTin2) + fl_width("xS"), y, wRST, Hentry, "S"); inpRTU_RSTout2->align(FL_ALIGN_LEFT); inpRTU_RSTout2->tooltip("Sent RST"); inpRTU_RSTout2->type(FL_NORMAL_INPUT); xtmp = rightof(inpRTU_RSTout2) + fl_width("xCntry"); cboCountryRTU2 = new Fl_ComboBox( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Cntry"); cboCountryRTU2->align(FL_ALIGN_LEFT); cboCountryRTU2->tooltip(_("Country")); cboCountryRTU2->end(); log_rtty_frame->end(); log_rtty_frame->hide(); log_rtty_frame->resizable(cboCountryRTU2); // end LOG_RTTY - partial // LOG_IARI - partial log_iari_frame = new Fl_Group( rightof(TopFrame3a), TopFrame1->y(), W - rightof(TopFrame3a), Hentry,""); inp_IARI_RSTin2 = new Fl_Input2( rightof(inpCall3) + fl_width("In"), y, wRST, h, "In"); inp_IARI_RSTin2->align(FL_ALIGN_LEFT); inp_IARI_RSTin2->tooltip(_("Received RST")); inp_IARI_RSTin2->type(FL_NORMAL_INPUT); inp_IARI_RSTout2 = new Fl_Input2( rightof(inp_IARI_RSTin2) + fl_width("Out"), y, wRST, h, "Out"); inp_IARI_RSTout2->align(FL_ALIGN_LEFT); inp_IARI_RSTout2->tooltip(_("Sent RST")); inp_IARI_RSTout2->type(FL_NORMAL_INPUT); inp_IARI_PR2 = new Fl_Input2( rightof(inp_IARI_RSTout2) + fl_width("xPr"), y, fl_width("WW"), Hentry, "Pr"); inp_IARI_PR2->align(FL_ALIGN_LEFT); inp_IARI_PR2->tooltip(_("Received IARI Province")); inp_IARI_PR2->type(FL_NORMAL_INPUT); out_IARI_SerNo2 = new Fl_Input2( rightof(inp_IARI_PR2) + fl_width("S#"), y, wRST, Hentry, "S#"); out_IARI_SerNo2->align(FL_ALIGN_LEFT); out_IARI_SerNo2->tooltip(_("Sent serno")); out_IARI_SerNo2->type(FL_NORMAL_OUTPUT); inp_IARI_SerNo2 = new Fl_Input2( rightof(out_IARI_SerNo2) + fl_width("R#"), y, wRST, Hentry, "R#"); inp_IARI_SerNo2->align(FL_ALIGN_LEFT); inp_IARI_SerNo2->tooltip(_("Received serno")); inp_IARI_SerNo2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_IARI_SerNo2) + fl_width("Cntry"); cboCountryIARI2 = new Fl_ComboBox( xtmp, y, fl_digi_main->w() - xtmp - pad, Hentry, "Cntry"); cboCountryIARI2->align(FL_ALIGN_LEFT); cboCountryIARI2->tooltip(_("Received IARI country")); cboCountryIARI2->end(); Fl_Box liari_box(rightof(cboCountryIARI2), y, pad, h,""); liari_box.box(FL_FLAT_BOX); log_iari_frame->end(); log_iari_frame->hide(); log_iari_frame->resizable(liari_box); // end LOG_IARI - partial // LOG_NAS - partial log_nas_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); outSerNo6 = new Fl_Input2( rightof(inpCall3) + fl_width("xS#"), y, 40, h, "S#"); outSerNo6->align(FL_ALIGN_LEFT); outSerNo6->tooltip(_("Sent serial number")); outSerNo6->type(FL_NORMAL_OUTPUT); inp_ser_NAS2 = new Fl_Input2( rightof(outSerNo6) + fl_width("xR#"), y, 40, Hentry, "R#"); inp_ser_NAS2->align(FL_ALIGN_LEFT); inp_ser_NAS2->tooltip(_("Received serno")); inp_ser_NAS2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_ser_NAS2) + fl_width("xS/P/C"); inpSPCnum_NAS2 = new Fl_Input2( xtmp, y, 80, Hentry, "S/P/C"); inpSPCnum_NAS2->align(FL_ALIGN_LEFT); inpSPCnum_NAS2->tooltip(_("Received State/Province/Country")); inpSPCnum_NAS2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSPCnum_NAS2) + fl_width("xNm"); inp_name_NAS2 = new Fl_Input2( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Nm"); inp_name_NAS2->align(FL_ALIGN_LEFT); inp_name_NAS2->tooltip(_("Name")); inp_name_NAS2->type(FL_NORMAL_INPUT); Fl_Box lnas_box(rightof(inp_name_NAS2), y, pad, h,""); lnas_box.box(FL_FLAT_BOX); log_nas_frame->end(); log_nas_frame->hide(); log_nas_frame->resizable(lnas_box); // end LOG_NAS - partial // LOG_AIDX - partial log_aidx_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); outSerNo8 = new Fl_Input2( rightof(inpCall3) + fl_width("xS#"), y, 40, Hentry, "S#"); outSerNo8->align(FL_ALIGN_LEFT); outSerNo8->tooltip(_("Sent serial number")); outSerNo8->type(FL_NORMAL_OUTPUT); inpSerNo4 = new Fl_Input2( rightof(outSerNo8) + fl_width("xR#"), y, 40, Hentry, "R#"); inpSerNo4->align(FL_ALIGN_LEFT); inpSerNo4->tooltip(_("Received serial number")); inpSerNo4->type(FL_NORMAL_INPUT); xtmp = rightof(inpSerNo4) + fl_width("xIn"); inpRstIn3 = new Fl_Input2( xtmp, y, wRST, Hentry, "In"); inpRstIn3->align(FL_ALIGN_LEFT); inpRstIn3->tooltip(_("Received RST")); inpRstIn3->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstIn3) + fl_width("xOut"); inpRstOut3 = new Fl_Input2( xtmp, y, wRST, Hentry, "Out"); inpRstOut3->align(FL_ALIGN_LEFT); inpRstOut3->tooltip(_("Sent RST")); inpRstOut3->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstOut3) + fl_width("xCntry"); cboCountryAIDX2 = new Fl_ComboBox( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Cntry"); cboCountryAIDX2->align(FL_ALIGN_LEFT); cboCountryAIDX2->tooltip(_("Received Country")); cboCountryAIDX2->end(); Fl_Box laam_box(rightof(cboCountryAIDX2), y, pad, h,""); laam_box.box(FL_FLAT_BOX); log_aidx_frame->end(); log_aidx_frame->hide(); log_aidx_frame->resizable(laam_box); // end LOG_AIDX - partial // LOG_JOTA - partial log_jota_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); xtmp = rightof(inpCall3) + fl_width("xIn"); inpRstIn4 = new Fl_Input2( xtmp, y, wRST, Hentry, "In"); inpRstIn4->align(FL_ALIGN_LEFT); inpRstIn4->tooltip(_("Received RST")); inpRstIn4->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstIn4) + fl_width("xOut"); inpRstOut4 = new Fl_Input2( xtmp, y, wRST, Hentry, "Out"); inpRstOut4->align(FL_ALIGN_LEFT); inpRstOut4->tooltip(_("Sent RST")); inpRstOut4->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstOut4) + fl_width("xSc"); inp_JOTA_troop2 = new Fl_Input2( xtmp, y, 50, Hentry, "Tp"); inp_JOTA_troop2->align(FL_ALIGN_LEFT); inp_JOTA_troop2->tooltip(_("Received troop number")); inp_JOTA_troop2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_JOTA_troop2) + fl_width("xTNm"); inp_JOTA_scout2 = new Fl_Input2( xtmp, y, 80, Hentry, "Nm"); inp_JOTA_scout2->align(FL_ALIGN_LEFT); inp_JOTA_scout2->tooltip(_("Received scout name")); inp_JOTA_scout2->type(FL_NORMAL_INPUT); xtmp = rightof(inp_JOTA_scout2) + fl_width("xSPC"); inp_JOTA_spc2 = new Fl_Input2( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "SPC"); inp_JOTA_spc2->align(FL_ALIGN_LEFT); inp_JOTA_spc2->tooltip(_("State/Province,Country received")); inp_JOTA_spc2->type(FL_NORMAL_INPUT); Fl_Box ljota_box(rightof(inp_JOTA_spc2), y, pad, h,""); ljota_box.box(FL_FLAT_BOX); log_jota_frame->end(); log_jota_frame->hide(); log_jota_frame->resizable(ljota_box); // LOG_JOTA - partial // LOG_AICW - partial log_aicw_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); xtmp = rightof(inpCall3) + fl_width("xIn"); inpRstIn_AICW2 = new Fl_Input2( xtmp, y, wRST, Hentry, "In"); inpRstIn_AICW2->align(FL_ALIGN_LEFT); inpRstIn_AICW2->tooltip(_("Received RST")); inpRstIn_AICW2->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstIn_AICW2) + fl_width("xOut"); inpRstOut_AICW2 = new Fl_Input2( xtmp, y, wRST, Hentry, "Out"); inpRstOut_AICW2->align(FL_ALIGN_LEFT); inpRstOut_AICW2->tooltip(_("Sent RST")); inpRstOut_AICW2->type(FL_NORMAL_INPUT); xtmp = rightof(inpRstOut_AICW2) + fl_width("xPwr-R"); inpSPCnum_AICW2 = new Fl_Input2( xtmp, y, 50, Hentry, "Pwr-R"); inpSPCnum_AICW2->align(FL_ALIGN_LEFT); inpSPCnum_AICW2->tooltip(_("Received power")); inpSPCnum_AICW2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSPCnum_AICW2) + fl_width("xCntry"); cboCountryAICW2 = new Fl_ComboBox( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Cntry"); cboCountryAICW2->align(FL_ALIGN_LEFT); cboCountryAICW2->tooltip(_("Country received")); cboCountryAICW2->end(); Fl_Box laicw_box(rightof(cboCountryAICW2), y, pad, h,""); laicw_box.box(FL_FLAT_BOX); log_aicw_frame->end(); log_aicw_frame->hide(); log_aicw_frame->resizable(laicw_box); // LOG_AICW - partial // LOG_SQSO - partial log_sqso_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); xtmp = rightof(inpCall3) + fl_width("St"); inpSQSO_state2 = new Fl_Input2( xtmp, y, 35, Hentry, "St"); inpSQSO_state2->align(FL_ALIGN_LEFT); inpSQSO_state2->tooltip(_("State")); inpSQSO_state2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSQSO_state2) + fl_width("Co"); inpSQSO_county2 = new Fl_Input2( xtmp, y, 50, Hentry, "Cy"); inpSQSO_county2->align(FL_ALIGN_LEFT); inpSQSO_county2->tooltip(_("County")); inpSQSO_county2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSQSO_county2) + fl_width("Ca"); inpSQSO_category2 = new Fl_Input2( xtmp, y , 40, Hentry, "Cat"); inpSQSO_category2->align(FL_ALIGN_LEFT); inpSQSO_category2->tooltip(_("Category: CLB, MOB, QRP, STD")); inpSQSO_category2->type(FL_NORMAL_INPUT); inpSQSO_category2->hide(); xtmp = rightof(inpSQSO_county2) + fl_width("In"); inpRstIn_SQSO2 = new Fl_Input2( xtmp, y, wRST, Hentry, "In"); inpRstIn_SQSO2->align(FL_ALIGN_LEFT); inpRstIn_SQSO2->tooltip(_("Received RST")); inpRstIn_SQSO2->type(FL_NORMAL_INPUT); inpRstIn_SQSO2->hide(); xtmp = rightof(inpRstIn_SQSO2) + fl_width("Out"); inpRstOut_SQSO2 = new Fl_Input2( xtmp, y, wRST, Hentry, "Out"); inpRstOut_SQSO2->align(FL_ALIGN_LEFT); inpRstOut_SQSO2->tooltip(_("Sent RST")); inpRstOut_SQSO2->type(FL_NORMAL_INPUT); inpRstOut_SQSO2->hide(); xtmp = rightof(inpRstOut_SQSO2) + fl_width("S#"); outSQSO_serno2 = new Fl_Input2( xtmp, y, 30, Hentry, "S#"); outSQSO_serno2->align(FL_ALIGN_LEFT); outSQSO_serno2->tooltip(_("Sent serial number")); outSQSO_serno2->type(FL_NORMAL_INPUT); outSQSO_serno2->hide(); xtmp = rightof(outSQSO_serno2) + fl_width("R#"); inpSQSO_serno2 = new Fl_Input2( xtmp, y, 30, Hentry, "R#"); inpSQSO_serno2->align(FL_ALIGN_LEFT); inpSQSO_serno2->tooltip(_("Received serial number")); inpSQSO_serno2->type(FL_NORMAL_INPUT); inpSQSO_serno2->hide(); xtmp = rightof(inpSQSO_serno2) + fl_width("Nm"); inpSQSO_name2 = new Fl_Input2( xtmp, y, TopFrame3b->x() + TopFrame3b->w() - xtmp - pad, Hentry, "Nm"); inpSQSO_name2->align(FL_ALIGN_LEFT); inpSQSO_name2->tooltip(_("Rx name")); inpSQSO_name2->type(FL_NORMAL_INPUT); inpSQSO_name2->hide(); Fl_Box lsqso_box(rightof(inpSQSO_name2), y, pad, h,""); lsqso_box.box(FL_FLAT_BOX); log_sqso_frame->end(); log_sqso_frame->hide(); log_sqso_frame->resizable(lsqso_box); // end LOG_SQSO - partial // LOG_WAE - partial log_wae_frame = new Fl_Group( TopFrame3b->x(), TopFrame3b->y(), TopFrame3b->w(), Hentry,""); inpRstIn_WAE2 = new Fl_Input2( rightof(inpCall3) + fl_width("xIn"), y, wRST, h, "In"); inpRstIn_WAE2->align(FL_ALIGN_LEFT); inpRstIn_WAE2->tooltip(_("Received RST")); inpRstIn_WAE2->type(FL_NORMAL_INPUT); inpRstOut_WAE2 = new Fl_Input2( rightof(inpRstIn_WAE2) + fl_width("xOut"), y, wRST, h, "Out"); inpRstOut_WAE2->align(FL_ALIGN_LEFT); inpRstOut_WAE2->tooltip(_("Sent RST")); inpRstOut_WAE2->type(FL_NORMAL_INPUT); outSerNo_WAE2 = new Fl_Input2( rightof(inpRstOut_WAE2) + fl_width("xS#"), y, 40, h, "S#"); outSerNo_WAE2->align(FL_ALIGN_LEFT); outSerNo_WAE2->tooltip(_("Sent serial number")); outSerNo_WAE2->type(FL_NORMAL_INPUT); inpSerNo_WAE2 = new Fl_Input2( rightof(outSerNo_WAE2) + fl_width("xR#"), y, 40, h, "R#"); inpSerNo_WAE2->align(FL_ALIGN_LEFT); inpSerNo_WAE2->tooltip(_("Received serial number")); inpSerNo_WAE2->type(FL_NORMAL_INPUT); xtmp = rightof(inpSerNo_WAE2) + fl_width("xCntry"); cboCountryWAE2 = new Fl_ComboBox( xtmp, y, TopFrame3->x() + TopFrame3->w() - xtmp - pad, Hentry, "Cntry"); cboCountryWAE2->align(FL_ALIGN_LEFT); cboCountryWAE2->tooltip(_("Country worked")); cboCountryWAE2->end(); Fl_Box lwae_box(rightof(cboCountryWAE2), y, pad, h,""); lwae_box.box(FL_FLAT_BOX); log_wae_frame->end(); log_wae_frame->hide(); log_wae_frame->resizable(lwae_box); // LOG_WAE - partial TopFrame3b->end(); TopFrame3->end(); TopFrame3->resizable(TopFrame3b); TopFrame3->hide(); } { // default controls inpFreq = inpFreq1; inpCall = inpCall1; inpTimeOn = inpTimeOn1; inpTimeOff = inpTimeOff1; inpName = inpName1; inpRstIn = inpRstIn1; inpRstOut = inpRstOut1; qsoFreqDisp = qsoFreqDisp1; inpSerNo = inpSerNo1; outSerNo = outSerNo1; inpXchgIn = inpXchgIn1; inpClass = inp_FD_class1; inpSection = inp_FD_section1; inp_CQzone = inp_CQzone1; inp_CQstate = inp_CQstate1; cboCountry = cboCountryQSO;//cboCountryCQ1; inpLoc = inpLoc1; inp_SS_Check = inp_SS_Check1; inp_SS_Precedence = inp_SS_Precedence1; inp_SS_Section = inp_SS_Section1; inp_SS_SerialNoR = inp_SS_SerialNoR1; inp_KD_age = inp_KD_age1; inp_1010_nr = inp_1010_nr1; inp_ARR_check = inp_ARR_check1; inpSPCnum = inpSPCnum_NAQP1; inp_JOTA_troop = inp_JOTA_troop1; inp_JOTA_scout = inp_JOTA_scout1; inp_JOTA_spc = inp_JOTA_spc1; qsoFreqDisp1->set_lsd(progdefaults.sel_lsd); qsoFreqDisp2->set_lsd(progdefaults.sel_lsd); qsoFreqDisp3->set_lsd(progdefaults.sel_lsd); } { // Top Macro group Y = TopFrame1->y() + Hqsoframe + pad; //------------------- 4 bar macros tbar = new Fl_Group(0, Y, fl_digi_main->w(), TB_HEIGHT * 4); { int xpos = tbar->x(); int ypos = Y; int Wbtn = tbar->w() / 12; int remainder = tbar->w() - Wbtn * 12; tbar->box(FL_FLAT_BOX); for (int i = 0; i < 48; i++) { btnDockMacro[i] = new Fl_Button( xpos, ypos, (remainder > 0) ? Wbtn + 1 : Wbtn, TB_HEIGHT, ""); remainder--; btnDockMacro[i]->box(FL_THIN_UP_BOX); btnDockMacro[i]->tooltip(_("Left Click - execute\nRight Click - edit")); btnDockMacro[i]->callback(macro_cb, reinterpret_cast(i | 0x80)); xpos += btnDockMacro[i]->w(); if (i == 11 || i == 23 || i == 35) { xpos = tbar->x(); remainder = tbar->w() - Wbtn * 12; ypos += TB_HEIGHT; } } tbar->end(); tbar->hide(); } //-------------------------------- macroFrame2 = new Fl_Group(0, Y, W, MACROBAR_MAX); macroFrame2->box(FL_FLAT_BOX); mf_group2 = new Fl_Group(0, Y, W - alt_btn_width, macroFrame2->h()); Wmacrobtn = (mf_group2->w()) / NUMMACKEYS; wBLANK = (mf_group2->w() - NUMMACKEYS * Wmacrobtn) / 2; xpos = 0; ypos = mf_group2->y(); for (int i = 0; i < NUMMACKEYS; i++) { if (i == 4 || i == 8) { bx = new Fl_Box(xpos, ypos, wBLANK, macroFrame2->h()); bx->box(FL_FLAT_BOX); xpos += wBLANK; } btnMacro[NUMMACKEYS + i] = new Fl_Button(xpos, ypos, Wmacrobtn, macroFrame2->h(), macros.name[NUMMACKEYS + i].c_str()); btnMacro[NUMMACKEYS + i]->callback(macro_cb, reinterpret_cast(NUMMACKEYS + i)); btnMacro[NUMMACKEYS + i]->tooltip( _("Left Click - execute\nShift-Fkey - execute\nRight Click - edit")); xpos += Wmacrobtn; } mf_group2->end(); btnAltMacros2 = new Fl_Button( W - alt_btn_width, ypos, alt_btn_width, MACROBAR_MAX, "2"); btnAltMacros2->callback(altmacro_cb, 0); btnAltMacros2->tooltip(_("Shift-key macro set")); macroFrame2->resizable(mf_group2); macroFrame2->end(); Y += Hmacros; } { // Center group Rx/Tx/Raster displays center_group = new Fl_Group(0, Y, W, Htext); center_group->box(FL_FLAT_BOX); text_group = new Fl_Group(0, Y, center_group->w(), center_group->h()); text_group->box(FL_FLAT_BOX); text_panel = new Panel(0, Y, center_group->w(), center_group->h()); text_panel->box(FL_FLAT_BOX); mvgroup = new Fl_Group( text_panel->x(), text_panel->y(), text_panel->w()/2, Htext, ""); mainViewer = new pskBrowser(mvgroup->x(), mvgroup->y(), mvgroup->w(), mvgroup->h()-42, ""); mainViewer->box(FL_DOWN_BOX); mainViewer->has_scrollbar(Fl_Browser_::VERTICAL); mainViewer->callback((Fl_Callback*)cb_mainViewer); mainViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); mainViewer->tooltip(_("Left click - select\nRight click - clear line")); // mainViewer uses same regular expression evaluator as Viewer mainViewer->seek_re = &seek_re; Fl_Group* gseek = new Fl_Group(mvgroup->x(), mvgroup->y() + mvgroup->h() - 42, mvgroup->w(), 20); // search field gseek->box(FL_FLAT_BOX); int seek_x = mvgroup->x(); int seek_y = mvgroup->y() + Htext - 42; int seek_w = mvgroup->w(); txtInpSeek = new Fl_Input2( seek_x, seek_y, seek_w, gseek->h(), ""); txtInpSeek->callback((Fl_Callback*)cb_mainViewer_Seek); txtInpSeek->when(FL_WHEN_CHANGED); txtInpSeek->textfont(FL_HELVETICA); txtInpSeek->value(progStatus.browser_search.c_str()); txtInpSeek->do_callback(); txtInpSeek->tooltip(_("seek - regular expression")); gseek->resizable(txtInpSeek); gseek->end(); Fl_Group *g = new Fl_Group( mvgroup->x(), mvgroup->y() + mvgroup->h() - 22, mvgroup->w(), 22); g->box(FL_DOWN_BOX); // squelch mvsquelch = new Fl_Value_Slider2(g->x(), g->y(), g->w() - 75, g->h()); mvsquelch->type(FL_HOR_NICE_SLIDER); mvsquelch->range(-3.0, 6.0); mvsquelch->value(progStatus.VIEWER_psksquelch); mvsquelch->step(0.1); mvsquelch->color( fl_rgb_color( progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G, progdefaults.bwsrSliderColor.B)); mvsquelch->selection_color( fl_rgb_color( progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G, progdefaults.bwsrSldrSelColor.B)); mvsquelch->callback( (Fl_Callback *)cb_mvsquelch); mvsquelch->tooltip(_("Set Viewer Squelch")); // clear button btnClearMViewer = new Fl_Button( mvsquelch->x() + mvsquelch->w(), g->y(), 75, g->h(), icons::make_icon_label(_("Clear"), edit_clear_icon)); btnClearMViewer->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); icons::set_icon_label(btnClearMViewer); btnClearMViewer->callback((Fl_Callback*)cb_btnClearMViewer); g->resizable(mvsquelch); g->end(); mvgroup->resizable(mainViewer); mvgroup->end(); save_mvx = mvgroup->w(); int rh = progStatus.tile_y_ratio * text_panel->h(); if (progdefaults.rxtx_swap) rh = text_panel->h() - rh; ReceiveText = new FTextRX( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), rh, "" ); ReceiveText->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); ReceiveText->setFont(progdefaults.RxFontnbr); ReceiveText->setFontSize(progdefaults.RxFontsize); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); FHdisp = new Raster( text_panel->x() + mvgroup->w(), text_panel->y(), text_panel->w() - mvgroup->w(), rh, progdefaults.HellRcvHeight); FHdisp->align(FL_ALIGN_CLIP); FHdisp->reverse(progdefaults.HellBlackboard); FHdisp->clear(); FHdisp->hide(); TransmitText = new FTextTX( text_panel->x() + mvgroup->w(), text_panel->y() + ReceiveText->h(), text_panel->w() - mvgroup->w(), text_panel->h() - ReceiveText->h() ); TransmitText->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); TransmitText->setFont(progdefaults.TxFontnbr); TransmitText->setFontSize(progdefaults.TxFontsize); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->align(FL_ALIGN_CLIP); minbox = new Fl_Box( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); minbox->hide(); text_panel->resizable(minbox); text_panel->end(); text_group->end(); text_group->resizable(text_panel); // wefax_group = new Fl_Group(0, Y, W, Htext); // wefax_group->box(FL_FLAT_BOX); // wefax_group = wefax_pic::create_wefax_rx_viewer(wefax_group->x(), wefax_group->y(), wefax_group->w(), wefax_group->h()); wefax_group = create_wefax_rx_viewer(0, Y, W, Htext); wefax_group->end(); // wefax_pic::create_both( true ); // wefax_group->end(); // wefax_pic:: wefax_pic::create_wefax_tx_viewer(0, 0, 800, 400 ); fsq_group = new Fl_Group(0, Y, W, Htext); fsq_group->box(FL_FLAT_BOX); // left, resizable rx/tx widgets fsq_left = new Panel( 0, Y, W - 180, Htext); fsq_left->box(FL_FLAT_BOX); // add rx & monitor fsq_rx_text = new FTextRX( 0, Y, fsq_left->w(), fsq_left->h() / 2); fsq_rx_text->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); fsq_rx_text->setFont(progdefaults.RxFontnbr); fsq_rx_text->setFontSize(progdefaults.RxFontsize); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_rx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); fsq_rx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); fsq_rx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); fsq_rx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); fsq_tx_text = new FTextTX( 0, Y + fsq_rx_text->h(), fsq_left->w(), fsq_left->h() - fsq_rx_text->h()); fsq_tx_text->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); fsq_tx_text->setFont(progdefaults.TxFontnbr); fsq_tx_text->setFontSize(progdefaults.TxFontsize); fsq_tx_text->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); fsq_tx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); fsq_tx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); fsq_tx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); fsq_tx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); fsq_tx_text->align(FL_ALIGN_CLIP); fsq_minbox = new Fl_Box( 0, Y + minhtext, fsq_tx_text->w(), fsq_left->h() - 2 * minhtext); fsq_minbox->hide(); fsq_left->resizable(fsq_minbox); fsq_left->end(); // right, heard list, special fsq controls, s/n indicator Fl_Group *fsq_right = new Fl_Group( fsq_left->w(), Y, 180, fsq_left->h()); fsq_right->box(FL_FLAT_BOX); int bh = 20; int qh = bh + bh + 1 + 8 + image_s2n.h(); static int heard_widths[] = { 40*fsq_right->w()/100, 30*fsq_right->w()/100, 0 }; fsq_heard = new Fl_Browser( fsq_right->x(), fsq_right->y(), fsq_right->w(), fsq_right->h() - qh);//minhtext); fsq_heard->column_widths(heard_widths); fsq_heard->column_char(','); fsq_heard->tooltip(_("Select FSQ station")); fsq_heard->callback((Fl_Callback*)cb_fsq_heard); fsq_heard->type(FL_MULTI_BROWSER); fsq_heard->box(FL_DOWN_BOX); fsq_heard->add("allcall"); fsq_heard->labelfont(progdefaults.RxFontnbr); fsq_heard->labelsize(11); #ifdef __APPLE__ fsq_heard->textfont(FL_SCREEN_BOLD); fsq_heard->textsize(13); #else fsq_heard->textfont(FL_HELVETICA); fsq_heard->textsize(13); #endif int qw = fsq_right->w(); int bw2 = qw / 2; int bw4 = qw / 4; fsq_lower_right = new Fl_Group( fsq_right->x(), fsq_heard->y() + fsq_heard->h(), qw, qh); fsq_lower_right->box(FL_FLAT_BOX); fsq_lower_right->color(FL_WHITE); int _yp = fsq_lower_right->y(); int _xp = fsq_lower_right->x(); btn_FSQCALL = new Fl_Light_Button( _xp, _yp, bw2, bh, "FSQ-ON"); btn_FSQCALL->value(progdefaults.fsq_directed); btn_FSQCALL->selection_color(FL_DARK_GREEN); btn_FSQCALL->callback(cbFSQCALL, 0); btn_FSQCALL->tooltip("Left click - on/off"); _xp += bw2; btn_SELCAL = new Fl_Light_Button( _xp, _yp, bw2, bh, "ACTIVE"); btn_SELCAL->selection_color(FL_DARK_RED); btn_SELCAL->value(1); btn_SELCAL->callback(cbSELCAL, 0); btn_SELCAL->tooltip("Sleep / Active"); _xp = fsq_lower_right->x(); _yp += bh; btn_MONITOR = new Fl_Light_Button( _xp, _yp, bw4, bh, "MON"); btn_MONITOR->selection_color(FL_DARK_GREEN); btn_MONITOR->value(progdefaults.fsq_show_monitor = false); btn_MONITOR->callback(cbMONITOR, 0); btn_MONITOR->tooltip("Monitor Open/Close"); _xp += bw4; btn_FSQQTH = new Fl_Button( _xp, _yp, bw4, bh, "QTH"); btn_FSQQTH->callback(cbFSQQTH, 0); btn_FSQQTH->tooltip("QTH->tx panel\nright click - edit"); _xp += bw4; btn_FSQQTC = new Fl_Button( _xp, _yp, bw4, bh, "QTC"); btn_FSQQTC->callback(cbFSQQTC, 0); btn_FSQQTC->tooltip("QTC->tx panel\nright click - edit"); _xp += bw4; btn_FSQCQ = new Fl_Button( _xp, _yp, bw4, bh, "CQ"); btn_FSQCQ->callback(cbFSQCQ, 0); btn_FSQCQ->tooltip("Xmt cqcqcq"); _xp = fsq_lower_right->x(); _yp += (bh + 1); ind_fsq_s2n = new Progress( _xp + 10, _yp, qw - 20, 8, ""); ind_fsq_s2n->color(FL_WHITE, FL_DARK_GREEN); ind_fsq_s2n->type(Progress::HORIZONTAL); ind_fsq_s2n->value(40); _yp += 8; int th = fsq_tx_text->y() + fsq_tx_text->h(); th = (th - _yp); // Clear remainder of area if needed. if(th > image_s2n.h()) { Fl_Box *_nA = new Fl_Box(_xp, _yp, qw, th, ""); _nA->box(FL_FLAT_BOX); _nA->color(FL_WHITE); } // Add S/N rule Fl_Box *s2n = new Fl_Box( _xp + 10, _yp, qw - 20, image_s2n.h(), ""); s2n->box(FL_FLAT_BOX); s2n->color(FL_WHITE); s2n->align(FL_ALIGN_INSIDE | FL_ALIGN_TOP | FL_ALIGN_CENTER | FL_ALIGN_CLIP); s2n->image(image_s2n); fsq_lower_right->end(); fsq_right->resizable(fsq_heard); fsq_right->end(); fsq_group->resizable(fsq_left); fsq_group->end(); ifkp_group = new Fl_Group(0, Y, W, Htext); ifkp_group->box(FL_FLAT_BOX); // upper, receive ifkp widgets ifkp_left = new Panel( 0, Y, W - (image_s2n.w()+4), Htext); // add rx & tx ifkp_rx_text = new FTextRX( 0, Y, ifkp_left->w(), ifkp_group->h() / 2); ifkp_rx_text->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); ifkp_rx_text->setFont(progdefaults.RxFontnbr); ifkp_rx_text->setFontSize(progdefaults.RxFontsize); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ifkp_rx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ifkp_rx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ifkp_rx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ifkp_tx_text = new FTextTX( 0, Y + ifkp_rx_text->h(), ifkp_rx_text->w(), ifkp_group->h() - ifkp_rx_text->h()); ifkp_tx_text->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); ifkp_tx_text->setFont(progdefaults.TxFontnbr); ifkp_tx_text->setFontSize(progdefaults.TxFontsize); ifkp_tx_text->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); ifkp_tx_text->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ifkp_tx_text->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ifkp_tx_text->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ifkp_tx_text->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ifkp_tx_text->align(FL_ALIGN_CLIP); ifkp_minbox = new Fl_Box( 0, Y + minhtext, ifkp_tx_text->w(), ifkp_left->h() - 2 * minhtext); ifkp_minbox->hide(); ifkp_left->resizable(ifkp_minbox); ifkp_left->end(); ifkp_right = new Fl_Group( ifkp_left->w(), Y, image_s2n.w()+4, ifkp_group->h()); ifkp_right->box(FL_FLAT_BOX); static int ifkp_heard_widths[] = { 40*ifkp_right->w()/100, 30*ifkp_right->w()/100, 0 }; ifkp_heard = new Fl_Browser( ifkp_right->x(), ifkp_right->y(), image_s2n.w()+4, ifkp_right->h() - (14 + image_s2n.h())); ifkp_heard->column_widths(ifkp_heard_widths); ifkp_heard->type(FL_MULTI_BROWSER); ifkp_heard->callback((Fl_Callback*)cb_ifkp_heard); ifkp_heard->column_char(','); ifkp_heard->tooltip(_("Stations Heard")); ifkp_heard->box(FL_DOWN_BOX); ifkp_heard->labelfont(progdefaults.RxFontnbr); ifkp_heard->labelsize(11); #ifdef __APPLE__ ifkp_heard->textfont(FL_SCREEN_BOLD); ifkp_heard->textsize(13); #else ifkp_heard->textfont(FL_HELVETICA); ifkp_heard->textsize(13); #endif Fl_Group *ifkp_sn_box = new Fl_Group( ifkp_heard->x(), ifkp_heard->y() + ifkp_heard->h(), ifkp_heard->w(), 14 + image_s2n.h(), ""); ifkp_sn_box->box(FL_DOWN_BOX); ifkp_sn_box->color(FL_WHITE); ifkp_s2n_progress = new Progress( ifkp_sn_box->x() + 2, ifkp_sn_box->y() + 2, image_s2n.w(), 10, ""); ifkp_s2n_progress->color(FL_WHITE, FL_DARK_GREEN); ifkp_s2n_progress->type(Progress::HORIZONTAL); ifkp_s2n_progress->value(40); Fl_Box *ifkp_s2n = new Fl_Box( ifkp_s2n_progress->x(), ifkp_s2n_progress->y() + ifkp_s2n_progress->h(), image_s2n.w(), image_s2n.h(), ""); ifkp_s2n->box(FL_FLAT_BOX); ifkp_s2n->color(FL_WHITE); ifkp_s2n->align(FL_ALIGN_INSIDE | FL_ALIGN_TOP | FL_ALIGN_CENTER | FL_ALIGN_CLIP); ifkp_s2n->image(image_s2n); ifkp_sn_box->end(); ifkp_right->end(); ifkp_right->resizable(ifkp_heard); ifkp_right->end(); // lower, transmit ifkp widgets ifkp_group->resizable(ifkp_left); ifkp_group->end(); fmt_group = fmt_panel(0, Y, W, Htext); fmt_group->end(); center_group->end(); text_group->show(); wefax_group->hide(); fsq_group->hide(); ifkp_group->hide(); fmt_group->hide(); } { // Bottom Macro group Y += center_group->h(); Fl::add_handler(default_handler); macroFrame1 = new Fl_Group(0, Y, W, MACROBAR_MAX); macroFrame1->box(FL_FLAT_BOX); mf_group1 = new Fl_Group(0, Y, W - alt_btn_width, macroFrame1->h()); Wmacrobtn = (mf_group1->w()) / NUMMACKEYS; wBLANK = (mf_group1->w() - NUMMACKEYS * Wmacrobtn) / 2; xpos = 0; ypos = mf_group1->y(); for (int i = 0; i < NUMMACKEYS; i++) { if (i == 4 || i == 8) { bx = new Fl_Box(xpos, ypos, wBLANK, macroFrame1->h()); bx->box(FL_FLAT_BOX); xpos += wBLANK; } btnMacro[i] = new Fl_Button(xpos, ypos, Wmacrobtn, macroFrame1->h(), macros.name[i].c_str()); btnMacro[i]->callback(macro_cb, reinterpret_cast(i)); btnMacro[i]->tooltip(_("Left Click - execute\nFkey - execute\nRight Click - edit")); xpos += Wmacrobtn; } mf_group1->end(); btnAltMacros1 = new Fl_Button( W - alt_btn_width, ypos, alt_btn_width, macroFrame1->h(), "1"); btnAltMacros1->callback(altmacro_cb, 0); btnAltMacros1->labelsize(progdefaults.MacroBtnFontsize); btnAltMacros1->tooltip(_("Primary macro set")); macroFrame1->resizable(mf_group1); macroFrame1->end(); Y += Hmacros; } { // Waterfall group wf_group = new Fl_Group(0, Y, W, Hwfall); wf = new waterfall(0, Y, Wwfall, Hwfall); wf->wfscope->bk_color(progdefaults.digi_background); wf->wfscope->axis_color(progdefaults.digi_axis_color); wf->wfscope->user_color_1(progdefaults.digi_color_1); wf->wfscope->user_color_2(progdefaults.digi_color_2); wf->wfscope->user_color_3(progdefaults.digi_color_3); wf->wfscope->user_color_4(progdefaults.digi_color_4); wf->end(); pgrsSquelch = new Progress( rightof(wf), Y, DEFAULT_SW, Hwfall, ""); pgrsSquelch->color(FL_BACKGROUND2_COLOR, FL_DARK_GREEN); pgrsSquelch->type(Progress::VERTICAL); pgrsSquelch->tooltip(_("Detected signal level")); sldrSquelch = new Fl_Slider2( rightof(pgrsSquelch), Y, DEFAULT_SW, Hwfall, ""); sldrSquelch->minimum(100); sldrSquelch->maximum(0); sldrSquelch->step(1); sldrSquelch->value(progStatus.sldrSquelchValue); sldrSquelch->callback((Fl_Callback*)cb_sldrSquelch); sldrSquelch->color(FL_INACTIVE_COLOR); sldrSquelch->tooltip(_("Squelch level")); wf_group->end(); wf_group->resizable(wf); } { // Status bar group Y += Hwfall; status_group = new Fl_Group(0, Y, W, Hstatus); MODEstatus = new Fl_Button(0, Y, Wmode, Hstatus, ""); MODEstatus->box(FL_DOWN_BOX); MODEstatus->color(FL_BACKGROUND2_COLOR); MODEstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); MODEstatus->callback(status_cb, (void *)0); MODEstatus->when(FL_WHEN_CHANGED); MODEstatus->tooltip(_("Left click: change mode\nRight click: configure")); cntCW_WPM = new Fl_Counter2( rightof(MODEstatus), Y, Ws2n - Hstatus, Hstatus, ""); cntCW_WPM->callback(cb_cntCW_WPM); cntCW_WPM->minimum(progdefaults.CWlowerlimit); cntCW_WPM->maximum(progdefaults.CWupperlimit); cntCW_WPM->value(progdefaults.CWspeed); cntCW_WPM->type(1); cntCW_WPM->step(1); cntCW_WPM->tooltip(_("CW transmit WPM")); cntCW_WPM->hide(); btnCW_Default = new Fl_Button( rightof(cntCW_WPM), Y, Hstatus, Hstatus, "*"); btnCW_Default->callback(cb_btnCW_Default); btnCW_Default->tooltip(_("Default WPM")); btnCW_Default->hide(); Status1 = new Fl_Box( rightof(MODEstatus), Y, Ws2n, Hstatus, "STATUS1"); Status1->box(FL_DOWN_BOX); Status1->color(FL_BACKGROUND2_COLOR); Status1->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); Status2 = new Fl_Box( rightof(Status1), Y, Wimd, Hstatus, "STATUS2"); Status2->box(FL_DOWN_BOX); Status2->color(FL_BACKGROUND2_COLOR); Status2->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); inpCall4 = new Fl_Input2( rightof(Status1), Y, Wimd, Hstatus, ""); inpCall4->align(FL_ALIGN_LEFT); inpCall4->tooltip(_("Other call")); inpCall4->hide(); // see corner_box below // corner_box used to leave room for OS X corner drag handle #ifdef __APPLE__ #define cbwidth DEFAULT_SW #else #define cbwidth 0 #endif StatusBar = new status_box( rightof(Status2), Y, W - rightof(Status2) - bwAfcOnOff - bwSqlOnOff - Wwarn - bwTxLevel - bwSqlOnOff - cbwidth, Hstatus, ""); StatusBar->box(FL_DOWN_BOX); StatusBar->color(FL_BACKGROUND2_COLOR); StatusBar->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); StatusBar->callback((Fl_Callback *)StatusBar_cb); StatusBar->when(FL_WHEN_RELEASE_ALWAYS); StatusBar->tooltip(_("Left click to toggle VuMeter")); VuMeter = new vumeter(StatusBar->x(), StatusBar->y(), StatusBar->w() - 2, StatusBar->h(), ""); VuMeter->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); VuMeter->when(FL_WHEN_RELEASE); VuMeter->callback((Fl_Callback *)VuMeter_cb); VuMeter->when(FL_WHEN_RELEASE_ALWAYS); VuMeter->tooltip(_("Left click to toggle Status Bar")); if (progStatus.vumeter_shown) { VuMeter->show(); StatusBar->hide(); } else { VuMeter->hide(); StatusBar->show(); } Fl_Box vuspacer(rightof(VuMeter),Y,2,Hstatus,""); vuspacer.box(FL_FLAT_BOX); cntTxLevel = new Fl_Counter2( rightof(&vuspacer), Y, bwTxLevel, Hstatus, ""); cntTxLevel->minimum(-30); cntTxLevel->maximum(0); cntTxLevel->value(-6); cntTxLevel->callback((Fl_Callback*)cb_cntTxLevel); cntTxLevel->value(progStatus.txlevel); cntTxLevel->lstep(1.0); cntTxLevel->tooltip(_("Tx level attenuator (dB)")); WARNstatus = new Fl_Box( rightof(cntTxLevel) + pad, Y, Wwarn, Hstatus, ""); WARNstatus->box(FL_DIAMOND_DOWN_BOX); WARNstatus->color(FL_BACKGROUND_COLOR); WARNstatus->labelcolor(FL_RED); WARNstatus->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); btnAFC = new Fl_Light_Button( rightof(WARNstatus) + pad, Y, bwAfcOnOff, Hstatus, "AFC"); btnSQL = new Fl_Light_Button( rightof(btnAFC), Y, bwSqlOnOff, Hstatus, "SQL"); // btnPSQL will be resized later depending on the state of the // configuration parameter to show that widget btnPSQL = new Fl_Light_Button( rightof(btnSQL), Y, bwSqlOnOff, Hstatus, "PSM"); btnSQL->selection_color(progdefaults.Sql1Color); btnAFC->callback(cbAFC, 0); btnAFC->value(1); btnAFC->tooltip(_("Automatic Frequency Control")); btnSQL->callback(cbSQL, 0); btnSQL->value(1); btnSQL->tooltip(_("Squelch")); btnPSQL->selection_color(progdefaults.Sql1Color); btnPSQL->value(progdefaults.kpsql_enabled); btnPSQL->callback(cbPwrSQL, 0); btnPSQL->tooltip(_("Power Signal Monitor")); corner_box = new Fl_Box( fl_digi_main->w() - cbwidth, Y, cbwidth, Hstatus, ""); corner_box->box(FL_FLAT_BOX); status_group->end(); status_group->resizable(VuMeter); Y += status_group->h(); } { // adjust callbacks showMacroSet(); Fl_Widget* logfields[] = { inpCall1, inpCall2, inpCall3, inpCall4, inpLoc1, inp_vhf_Loc1, inp_vhf_Loc2, inpName1, inpName1, inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOff1, inpTimeOff2, inpTimeOff3, inpRstIn1, inpRstIn2, inpRstIn3, inpRstIn4, inpRstIn_AICW2, inpRstOut1, inpRstOut2, inpRstOut3, inpRstOut4, inpRstOut_AICW2, inpQth, inpVEprov, inpAZ, inpNotes, inpState1, inpSerNo1, inpSerNo2, outSerNo1, outSerNo2, outSerNo3, inp_SS_Check1, inp_SS_Precedence1, inp_SS_Section1, inp_SS_SerialNoR1, outSerNo4, inp_SS_Check2, inp_SS_Precedence2, inp_SS_Section2, inp_SS_SerialNoR2, inpXchgIn1, inpXchgIn2, inp_FD_class1, inp_FD_class2, inp_FD_section1, inp_FD_section2, inp_KD_age1, inp_KD_age2, inp_KD_state1, inp_KD_state2, inp_KD_VEprov1, inp_KD_VEprov2, inp_KD_XchgIn1, inp_KD_XchgIn2, inp_vhf_RSTin1, inp_vhf_RSTin2, inp_vhf_RSTout1, inp_vhf_RSTout2, inp_1010_XchgIn1, inp_1010_XchgIn2, inp_1010_name2, inp_1010_nr1, inp_1010_nr2, inp_ARR_Name2, inp_ARR_XchgIn1, inp_ARR_XchgIn2, inp_ARR_check1, inp_ARR_check2, inp_ASCR_RSTin2, inp_ASCR_RSTout2, inp_ASCR_XchgIn1, inp_ASCR_XchgIn2, inp_ASCR_class1, inp_ASCR_class2, inp_ASCR_name2, inpSPCnum_NAQP1, inpSPCnum_NAQP2, inpRTU_stpr1, inpRTU_stpr2, inpRTU_serno1, inpRTU_serno2, cboCountryRTU2, inpRTU_RSTin2, inp_IARI_PR1, inp_IARI_PR2, inp_IARI_RSTin2, inp_IARI_RSTout2, out_IARI_SerNo1, inp_IARI_SerNo1, out_IARI_SerNo2, inp_IARI_SerNo2, inp_IARI_PR2, cboCountryIARI2, inp_JOTA_scout1, inp_JOTA_scout2, inp_JOTA_spc1, inp_JOTA_spc2, inp_JOTA_troop1, inp_JOTA_troop2, inp_CQzone1, inpSPCnum_AICW1, inpSPCnum_AICW2, inpSQSO_state1, inpSQSO_state2, inpSQSO_county1, inpSQSO_county2, inpSQSO_serno1, inpSQSO_serno2, outSQSO_serno1, outSQSO_serno2, inpSQSO_name2, inpSQSO_category1, inpSQSO_category2 }; for (size_t i = 0; i < sizeof(logfields)/sizeof(*logfields); i++) { logfields[i]->callback(cb_log); logfields[i]->when(FL_WHEN_CHANGED);//RELEASE || FL_WHEN_ENTER_KEY );//CHANGED); } Fl_ComboBox *country_fields[] = { cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2// , // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->callback(cb_country); country_fields[i]->when(FL_WHEN_CHANGED); } // exceptions inpCall1->callback(cb_call); inpCall1->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS); inpCall2->callback(cb_call); inpCall2->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS); inpCall3->callback(cb_call); inpCall3->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS); inpCall4->callback(cb_call); inpCall4->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS); inpNotes->when(FL_WHEN_RELEASE); } fl_digi_main->end(); fl_digi_main->callback(cb_wMain); fl_digi_main->resizable(center_group); { // scope view dialog scopeview = new Fl_Double_Window(0,0,140,140, _("Scope")); scopeview->xclass(PACKAGE_NAME); digiscope = new Digiscope (0, 0, 140, 140); digiscope->bk_color(progdefaults.digi_background); digiscope->axis_color(progdefaults.digi_axis_color); digiscope->user_color_1(progdefaults.digi_color_1); digiscope->user_color_2(progdefaults.digi_color_2); digiscope->user_color_3(progdefaults.digi_color_3); digiscope->user_color_4(progdefaults.digi_color_4); scopeview->resizable(digiscope); scopeview->size_range(SCOPEWIN_MIN_WIDTH, SCOPEWIN_MIN_HEIGHT); scopeview->end(); scopeview->hide(); } { // field day viewer dialog field_day_viewer = make_fd_view(); field_day_viewer->hide(); } { // adjust menu toggle items if (!progdefaults.menuicons) icons::toggle_icon_labels(); // Set the state of checked toggle menu items. Never changes. const struct { bool var; const char* label; } toggles[] = { { progStatus.LOGenabled, LOG_TO_FILE_MLABEL }, { progStatus.WF_UI, WF_MLABEL }, { progStatus.Rig_Log_UI, RIGLOG_PARTIAL_MLABEL }, { !progStatus.Rig_Log_UI, RIGLOG_FULL_MLABEL }, { progStatus.NO_RIGLOG, RIGLOG_NONE_MLABEL }, { progStatus.DOCKEDSCOPE, DOCKEDSCOPE_MLABEL } }; Fl_Menu_Item* toggle; for (size_t i = 0; i < sizeof(toggles)/sizeof(*toggles); i++) { if (toggles[i].var && (toggle = getMenuItem(toggles[i].label))) { toggle->set(); if (toggle->callback()) { mnu->value(toggle); toggle->do_callback(reinterpret_cast(mnu)); } } } } if (!dxcc_is_open()) getMenuItem(COUNTRIES_MLABEL)->hide(); toggle_smeter(); adjust_for_contest(0); UI_select(); wf->UI_select(progStatus.WF_UI); LOGGING_colors_font(); init_country_fields(); clearQSO(); fsqMonitor = create_fsqMonitor(); createConfig(); createRecordLoader(); switch (progdefaults.mbar_scheme) { case 0: btn_scheme_0->setonly(); break; case 1: btn_scheme_1->setonly(); break; case 2: btn_scheme_2->setonly(); break; case 3: btn_scheme_3->setonly(); break; case 4: btn_scheme_4->setonly(); break; case 5: btn_scheme_5->setonly(); break; case 6: btn_scheme_6->setonly(); break; case 7: btn_scheme_7->setonly(); break; case 8: btn_scheme_8->setonly(); break; case 9: btn_scheme_9->setonly(); break; case 10: btn_scheme_10->setonly(); break; case 11: btn_scheme_11->setonly(); break; case 12: btn_scheme_12->setonly(); break; } colorize_macros(); if (rx_only) { btnTune->deactivate(); wf->xmtrcv->deactivate(); } set_mode_controls(active_modem->get_mode()); create_wefax_tx_viewer(0, 0, 800, 400 ); change_menu_fonts(progdefaults.MenuFontnbr, progdefaults.MenuFontsize); } fldigi-4.2.05/src/dialogs/confdialog.fl0000664000175000017500000164144514611711171014643 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0309 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include "main.h"} {private local } decl {\#include "fl_digi.h"} {private local } decl {\#include "data_io.h"} {private local } decl {\#include "Viewer.h"} {private global } decl {\#include "font_browser.h"} {public global } decl {\#include "soundconf.h"} {private local } decl {\#include "globals.h"} {public local } decl {\#include "modem.h"} {public local } decl {\#include "configuration.h"} {public local } decl {\#include "combo.h"} {public local } decl {\#include "waterfall.h"} {private local } decl {\#include "rigxml.h"} {private local } decl {\#include "lookupcall.h"} {private local } decl {\#include "icons.h"} {private local } decl {\#include "Viewer.h"} {private local } decl {\#include "pskrep.h"} {private global } decl {\#include "flinput2.h"} {public local } decl {\#include "flslider2.h"} {public local } decl {\#include "flmisc.h"} {public local } decl {\#include "logsupport.h"} {private local } decl {\#include "notify.h"} {private local } decl {\#include "debug.h"} {private local } decl {\#include "status.h"} {private local } decl {\#include "rx_extract.h"} {private local } decl {\#include "kmlserver.h"} {private local } decl {\#include "macroedit.h"} {private local } decl {\#include "fileselect.h"} {private local } decl {\#include "psm/psm.h"} {private local } decl {\#include "thor.h"} {private local } decl {\#include "ifkp.h"} {private local } decl {\#include "dx_cluster.h"} {private local } decl {\#include "dx_dialog.h"} {private local } decl {\#include "fsq.h"} {private local } decl {\#include "network.h"} {private local } decl {\#include } {private local } decl {\#if USE_HAMLIB \#include "hamlib.h" \#endif} {private local } decl {extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata);} {private local } decl {Fl_Double_Window *dlgConfig;} {public local } decl {Mode_Browser* mode_browser;} {public local } decl {struct CONFIG_PAGE {Fl_Group *grp; std::string label; CONFIG_PAGE(Fl_Group *_grp = 0, std::string _lbl = "") { grp = _grp; label = _lbl; } ~CONFIG_PAGE() { if (grp) delete grp; } };} {public global } decl {std::vector config_pages;} {public local } decl {Fl_Group *current = 0;} {private local } Function {SelectItem_CB(Fl_Widget *w)} {open return_type void } { code {Fl_Tree *tree = (Fl_Tree*)w; Fl_Tree_Item *item = tree->callback_item(); tree->select_only(item, 0); if (tree->callback_reason() == FL_TREE_REASON_SELECTED) { std::string pname; char pn[200]; tree->item_pathname(pn, 200, item); pname = pn; size_t pos = std::string::npos; for (size_t i = 0; i < config_pages.size(); i++) { if ((pos = pname.find(config_pages[i]->label)) != std::string::npos) { if (pname.substr(pos) == config_pages[i]->label) { if (current) current->hide(); current = config_pages[i]->grp; current->show(); return; } } } }} {} } Function {choose_color(Fl_Color & c)} {open private return_type void } { code {unsigned char r, g, b; Fl::get_color(c, r, g, b); if (fl_color_chooser("Font color", r, g, b)) c = fl_rgb_color(r, g, b);} {} } Function {cbMenuFontBrowser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); progdefaults.MenuFontnbr = font; progdefaults.MenuFontsize = size; //progdefaults.MenuFontcolor = color; font_browser->hide(); change_menu_fonts(font, size); progdefaults.changed = true;} {} } Function {cbRxFontBrowser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); RxText->textfont(font); RxText->textsize(size); RxText->textcolor(color); RxText->redraw(); progdefaults.RxFontnbr = font; progdefaults.RxFontsize = size; progdefaults.RxFontcolor = color; ReceiveText->setFont(font); ReceiveText->setFontSize(size); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_rx_text->setFont(font); fsq_rx_text->setFontSize(size); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFont(font); ifkp_rx_text->setFontSize(size); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbTxFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); TxText->textfont(font); TxText->textsize(size); TxText->textcolor(color); TxText->redraw(); progdefaults.TxFontnbr = font; progdefaults.TxFontsize = size; progdefaults.TxFontcolor = color; TransmitText->setFont(font); TransmitText->setFontSize(size); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); fsq_tx_text->setFont(font); fsq_tx_text->setFontSize(size); fsq_tx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFont(font); ifkp_rx_text->setFontSize(size); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbDXfont_browser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.DXfontcolor = color; progdefaults.DXfontnbr = font; progdefaults.DXfontsize = size; brws_tcpip_stream->setFont(font); brws_tcpip_stream->setFontSize(size); brws_tcpip_stream->setFontColor(color, FTextBase::RECV); brws_tcpip_stream->redraw(); ed_telnet_cmds->setFont(font); ed_telnet_cmds->setFontSize(size); ed_telnet_cmds->setFontColor(color); ed_telnet_cmds->redraw(); StreamText->textcolor(color); StreamText->redraw(); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFont(font); brws_dxc_help->setFontSize(size); brws_dxc_help->setFontColor(color, FTextBase::RECV); brws_dxc_help->redraw(); font_browser->hide(); dxcluster_hosts_load(); progdefaults.changed = true;} {} } Function {cbDXC_FontBrowser(Fl_Widget*, void*)} {open private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.DXC_textfont = font; progdefaults.DXC_textsize = size; progdefaults.DXC_textcolor = color; DXC_display->textsize(size); DXC_display->textcolor(color); DXC_display->textfont(font); DXC_display->redraw(); font_browser->hide(); dxc_lines_redraw(); progdefaults.changed = true;} {} } Function {cbMacroEditFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); MacroText->textfont(font); MacroText->textsize(size); MacroText->redraw(); progdefaults.MacroEditFontnbr = font; progdefaults.MacroEditFontsize = size; update_macroedit_font(); MacroText->textfont(font); MacroText->textsize(size); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbWaterfallFontBrowser(Fl_Widget*, void*)} {return_type void } { code {Fl_Font fnt = font_browser->fontNumber(); int size = font_browser->fontSize(); progdefaults.WaterfallFontnbr = fnt; progdefaults.WaterfallFontsize = size; progdefaults.changed = true; font_browser->hide();} {} } Function {cbMacroBtnFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {progdefaults.MacroBtnFontnbr = font_browser->fontNumber(); progdefaults.MacroBtnFontsize = font_browser->fontSize();; progdefaults.MacroBtnFontcolor = font_browser->fontColor(); font_browser->hide(); btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->redraw_label(); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup2->labelfont(progdefaults.MacroBtnFontnbr); btnGroup2->labelsize(progdefaults.MacroBtnFontsize); btnGroup2->redraw_label(); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup3->labelfont(progdefaults.MacroBtnFontnbr); btnGroup3->labelsize(progdefaults.MacroBtnFontsize); btnGroup3->redraw_label(); progdefaults.changed = true; colorize_macros();} {} } Function {cbViewerFontBrowser(Fl_Widget*, void*)} {return_type void } { code {progdefaults.ViewerFontnbr = font_browser->fontNumber(); progdefaults.ViewerFontsize = font_browser->fontSize(); initViewer(); progdefaults.changed = true; font_browser->hide();} {} } Function {cbFreqControlFontBrowser(Fl_Widget*, void*)} {return_type void } { code {Fl_Font fnt = font_browser->fontNumber(); progdefaults.FreqControlFontnbr = fnt; progdefaults.changed = true; FDdisplay->labelfont(progdefaults.FreqControlFontnbr); FDdisplay->redraw(); qsoFreqDisp1->font(progdefaults.FreqControlFontnbr); qsoFreqDisp2->font(progdefaults.FreqControlFontnbr); qsoFreqDisp3->font(progdefaults.FreqControlFontnbr); qsoFreqDisp1->redraw(); qsoFreqDisp2->redraw(); qsoFreqDisp3->redraw(); font_browser->hide();} {} } Function {cbLOGGINGFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGGINGtextfont = font; progdefaults.LOGGINGtextsize = size; progdefaults.LOGGINGtextcolor = color; LOGGINGdisplay->textsize(size); LOGGINGdisplay->textcolor(color); LOGGINGdisplay->textfont(font); LOGGINGdisplay->redraw(); LOGGING_colors_font(); font_browser->hide(); progdefaults.changed = true;} {} } Function {cbLOGBOOKFontBrowser(Fl_Widget*, void*)} {private return_type void } { code {Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGBOOKtextfont = font; progdefaults.LOGBOOKtextsize = size; progdefaults.LOGBOOKtextcolor = color; LOGBOOKdisplay->textsize(size); LOGBOOKdisplay->textcolor(color); LOGBOOKdisplay->textfont(font); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); font_browser->hide(); progdefaults.changed = true;} {} } Function {set_qrzxml_buttons(Fl_Button* b)} {return_type void } { code {Fl_Button* qrzbxml[] = { btnQRZXMLnotavailable, btnQRZcdrom, btnQRZsub, btnHamcall, btnCALLOOK, btnHamQTH}; for (size_t i = 0; i < sizeof(qrzbxml)/sizeof(*qrzbxml); i++) qrzbxml[i]->value(b == qrzbxml[i]);} {} } Function {set_qrzweb_buttons(Fl_Button* b)} {open return_type void } { code {Fl_Button* qrzbweb[] = { btnQRZWEBnotavailable, btnQRZonline, btnHAMCALLonline, btnHamQTHonline, btnCallookOnline }; for (size_t i = 0; i < sizeof(qrzbweb)/sizeof(*qrzbweb); i++) qrzbweb[i]->value(b == qrzbweb[i]);} {} } decl {class Fl_File_Chooser ;} {public global } Function {createConfig()} {return_type void } { code {if (!dlgConfig) { dlgConfig = ConfigureDialog(); dlgConfig->xclass(PACKAGE_NAME); }} {} } Function {ConfigureDialog()} {open } { code {static const char szShifts[] = "23|85|160|170|182|200|240|350|425|850|Custom"; static const char szBauds[] = "45|45.45|50|56|75|100|110|150|200|300"; static const char szSelBits[] = "5 (baudot)|7 (ascii)|8 (ascii)"; static const char szParity[] = "none|even|odd|zero|one"; static const char szStopBits[] = "1|1.5|2"; static const char szOliviaTones[] = "2|4|8|16|32|64|128|256"; static const char szOliviaBandwidth[] = "125|250|500|1000|2000"; static const char szContestiaTones[] = "2|4|8|16|32|64|128|256"; static const char szContestiaBandwidth[] = "125|250|500|1000|2000"; static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600|115200|230400|460800"; static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| ";} {} Fl_Window {} { label {Fldigi configuration} open xywh {544 31 800 380} type Double color 45 selection_color 51 labelsize 18 align 80 resizable size_range {750 380 0 380} visible } { Fl_Group {} {open xywh {0 0 201 380} resizable } { Fl_Tree tab_tree { callback SelectItem_CB xywh {0 0 200 350} resizable code0 {o->root_label(_("Configure"));} code1 {o->selectmode(FL_TREE_SELECT_SINGLE);} code2 {o->connectorstyle(FL_TREE_CONNECTOR_DOTTED); // default is NONE on Mac} code3 {o->connectorwidth(15); // default is 17} } Fl_Group {} {open xywh {0 350 201 30} } { Fl_Group {} {open xywh {0 350 100 30} resizable } {} Fl_Button btn_collapse_tab_tree { label {Collapse Tree} callback {tab_tree->close(_("Colors-Fonts")); tab_tree->close(_("Contests")); tab_tree->close(_("IDs")); tab_tree->close(_("Logging")); tab_tree->close(_("Modem")); tab_tree->close(_("Misc")); tab_tree->close(_("Rig Control")); tab_tree->close(_("Soundcard")); tab_tree->close(_("UI")); tab_tree->close(_("Waterfall")); tab_tree->close(_("Web"));} xywh {95 353 105 22} } } } Fl_Group {} { label {Call/Lookup} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Call/Lookup"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Call/Lookup"));} } { Fl_Group {} { label {Web Browser lookup} open xywh {208 24 585 131} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnQRZWEBnotavailable { label None callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZWEBNONE; progdefaults.changed = true;} tooltip {Do not use callsign lookup via web browser} xywh {248 43 61 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.QRZWEB == QRZWEBNONE);} } Fl_Round_Button btnQRZonline { label {QRZ on line} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZHTML; progdefaults.changed = true;} tooltip {Visit QRZ web site} xywh {248 63 83 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == QRZHTML);} } Fl_Round_Button btnHAMCALLonline { label {HamCall online} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMCALLHTML; progdefaults.changed = true;} tooltip {Visit Hamcall web site} xywh {248 84 83 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == HAMCALLHTML);} } Fl_Round_Button btnHamQTHonline { label {HamQTH online} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMQTHHTML; progdefaults.changed = true;} tooltip {Visit hamQTH web site} xywh {248 105 20 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == HAMQTHHTML);} } Fl_Round_Button btnCallookOnline { label {Callook online} callback {set_qrzweb_buttons(o); progdefaults.QRZWEB = CALLOOKHTML; progdefaults.changed = true;} tooltip {Visit hamQTH web site} xywh {248 126 20 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZWEB == CALLOOKHTML);} } Fl_Input inp_qrzurl { label QRZ callback {progdefaults.qrzurl = o->value(); progdefaults.changed=true;} xywh {502 37 270 22} code0 {o->value(progdefaults.qrzurl.c_str());} class Fl_Input2 } Fl_Input inp_hamcallurl { label Hamcall callback {progdefaults.hamcallurl = o->value(); progdefaults.changed = true;} xywh {502 64 270 22} code0 {o->value(progdefaults.hamcallurl.c_str());} class Fl_Input2 } Fl_Input inp_hamqthurl { label HamQTH callback {progdefaults.hamqthurl = o->value(); progdefaults.changed = true;} xywh {502 92 270 22} code0 {o->value(progdefaults.hamqthurl.c_str());} class Fl_Input2 } Fl_Input inp_callook_url { label Callook callback {progdefaults.callookurl = o->value(); progdefaults.changed = true;} tooltip {Callook.info web site} xywh {502 121 270 22} code0 {o->value(progdefaults.callookurl.c_str());} class Fl_Input2 } } Fl_Group {} { label {Data base lookup} open xywh {208 156 585 185} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnQRZXMLnotavailable { label None callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZXMLNONE; progdefaults.changed = true;} tooltip {Do not use callsign database} xywh {255 179 69 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.QRZXML == QRZXMLNONE);} } Fl_Round_Button btnQRZcdrom { label {QRZ cdrom} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZCD; progdefaults.changed = true;} tooltip {Use CD or hard drive CD image} xywh {255 205 76 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == QRZCD);} } Fl_Round_Button btnQRZsub { label {QRZ.com} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = QRZNET; progdefaults.changed = true;} tooltip {You need a paid QRZ online subscription to access} xywh {255 231 137 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == QRZNET);} } Fl_Round_Button btnHamcall { label {Hamcall.net} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = HAMCALLNET; progdefaults.changed = true;} tooltip {You need a paid Hamcall online subscription to access} xywh {255 258 137 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == HAMCALLNET);} } Fl_Round_Button btnHamQTH { label {HamQTH.com} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = HAMQTH; progdefaults.changed = true;} tooltip {Free service courtesy of OK} xywh {255 284 137 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == HAMQTH);} } Fl_Round_Button btnCALLOOK { label {Callook.info} callback {set_qrzxml_buttons(o); progdefaults.QRZXML = CALLOOK; progdefaults.changed = true;} tooltip {Callook.info lookup (free service US callsigns only)} xywh {255 311 113 20} down_box DOWN_BOX code0 {o->value(progdefaults.QRZXML == CALLOOK);} } Fl_Input txtQRZpathname { callback {progdefaults.QRZpathname = o->value(); progdefaults.QRZchanged = true; progdefaults.changed = true;} tooltip {ie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for database} xywh {372 204 401 22} code0 {o->value(progdefaults.QRZpathname.c_str());} code1 {txtQRZpathname->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpQRZusername { label {User name} callback {progdefaults.QRZusername = o->value(); progdefaults.changed = true;} tooltip {Login name for QRZ / Hamcall / HamQTH} xywh {482 230 163 22} code0 {o->value(progdefaults.QRZusername.c_str());} code1 {inpQRZusername->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpQRZuserpassword { label Password callback {progdefaults.QRZuserpassword = o->value(); progdefaults.changed = true;} tooltip {Password for QRZ / Hamcall / HamQTH} xywh {482 257 163 22} code0 {o->value(progdefaults.QRZuserpassword.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {inpQRZuserpassword->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnQRZpasswordShow { label Show callback {inpQRZuserpassword->type(inpQRZuserpassword->type() ^ FL_SECRET_INPUT); inpQRZuserpassword->redraw(); o->label((inpQRZuserpassword->type() & FL_SECRET_INPUT) ? "Show" : "Hide");} tooltip {Show password in plain text} xywh {657 257 76 22} } Fl_Group {} {open xywh {377 307 403 27} box ENGRAVED_FRAME } { Fl_Check_Button btn_notes_address { label {Add address to notes field} callback {progdefaults.notes_address = o->value(); progdefaults.changed = true;} xywh {401 313 207 15} down_box DOWN_BOX code0 {o->value(progdefaults.notes_address);} } Fl_Check_Button btn_clear_notes { label {clear old data} callback {progdefaults.clear_notes = o->value(); progdefaults.changed= true;} xywh {628 313 122 15} down_box DOWN_BOX code0 {o->value(progdefaults.clear_notes);} } } } } Fl_Group {} { label {Call/cty.dat} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Call/Cty.dat"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Call/Cty.dat"));} code3 {tab_tree->close(_("Call"));} } { Fl_Input txt_cty_dat_pathname { label {cty.dat folder} callback {progdefaults.cty_dat_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-name for cty.dat folder} xywh {330 56 346 24} when 1 code0 {o->value(progdefaults.cty_dat_pathname.c_str());} code1 {\#include "dxcc.h"} class Fl_Input2 } Fl_Button btn_select_cty_dat { label Browse callback {select_cty_dat_pathname();} tooltip {Locate cty.dat file} xywh {235 101 75 24} } Fl_Button btn_default_cty_dat { label Default callback {default_cty_dat_pathname();} tooltip {Restore cty.dat default folder} xywh {330 101 75 24} } Fl_Button btn_reload_cty_dat { label Reload callback {reload_cty_dat();} tooltip {Reload cty.dat} xywh {425 101 75 24} } } Fl_Group {} { label {Colors-Fonts/Buttons-Menus} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Buttons-Menus"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Colors-Fonts/Buttons-Menus"));} } { Fl_Button btnSpotColor { label Spot callback {progdefaults.SpotColor = fl_show_colormap(progdefaults.SpotColor); spotcolor->color(progdefaults.SpotColor); spotcolor->redraw(); spot_selection_color(); progdefaults.changed = true;} xywh {284 75 100 21} } Fl_Button btnRevColor { label Rev callback {progdefaults.RevColor = fl_show_colormap(progdefaults.RevColor); revcolor->color(progdefaults.RevColor); revcolor->redraw(); rev_selection_color(); progdefaults.changed = true;} xywh {284 111 100 21} } Fl_Button btnTuneColor { label Tune callback {progdefaults.TuneColor = fl_show_colormap(progdefaults.TuneColor); tunecolor->color(progdefaults.TuneColor); tunecolor->redraw(); tune_selection_color(); progdefaults.changed = true;} xywh {284 148 100 21} } Fl_Button btnRxIDColor { label {RxID nar} callback {progdefaults.RxIDColor = fl_show_colormap(progdefaults.RxIDColor); rxidcolor->color(progdefaults.RxIDColor); rxidcolor->redraw(); rxid_selection_color(); progdefaults.changed = true; Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw();} xywh {284 183 100 21} } Fl_Button btnLkColor { label Lk callback {progdefaults.LkColor = fl_show_colormap(progdefaults.LkColor); lockcolor->color(progdefaults.LkColor); lockcolor->redraw(); xmtlock_selection_color(); progdefaults.changed = true;} xywh {473 75 100 21} } Fl_Button btnSql1Color { label {SQL-1} callback {progdefaults.Sql1Color = fl_show_colormap(progdefaults.Sql1Color); sql1color->color(progdefaults.Sql1Color); sql1color->redraw(); sql_selection_color(); progdefaults.changed = true;} xywh {473 111 100 21} } Fl_Button btnXmtColor { label {T/R} callback {progdefaults.XmtColor = fl_show_colormap(progdefaults.XmtColor); xmtcolor->color(progdefaults.XmtColor); xmtcolor->redraw(); xmtrcv_selection_color(); progdefaults.changed = true;} xywh {473 148 100 20} } Fl_Button btnRxIDwideColor { label {RxID wide} callback {progdefaults.RxIDwideColor = fl_show_colormap(progdefaults.RxIDwideColor); rxidcolorwide->color(progdefaults.RxIDwideColor); rxidcolorwide->redraw(); rxid_selection_color(); progdefaults.changed = true; Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw();} xywh {473 183 100 21} } Fl_Button btnAfcColor { label AFC callback {progdefaults.AfcColor = fl_show_colormap(progdefaults.AfcColor); afccolor->color(progdefaults.AfcColor); afccolor->redraw(); afc_selection_color(); progdefaults.changed = true;} xywh {663 75 100 21} } Fl_Button btnSql2Color { label {SQL-2} callback {progdefaults.Sql2Color = fl_show_colormap(progdefaults.Sql2Color); sql2color->color(progdefaults.Sql2Color); sql2color->redraw(); sql_selection_color(); progdefaults.changed = true;} xywh {663 111 100 20} } Fl_Button btnTxIDColor { label TxID callback {progdefaults.TxIDColor = fl_show_colormap(progdefaults.TxIDColor); txidcolor->color(progdefaults.TxIDColor); txidcolor->redraw(); txid_selection_color(); progdefaults.changed = true; btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->redraw();} xywh {662 183 100 20} } Fl_Box spotcolor { xywh {254 76 18 19} box THIN_DOWN_BOX color 3 code0 {o->color(progdefaults.SpotColor);} } Fl_Box revcolor { xywh {254 112 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.RevColor);} } Fl_Box tunecolor { xywh {254 149 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.TuneColor);} } Fl_Box rxidcolor { xywh {254 184 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.RxIDColor);} } Fl_Box lockcolor { xywh {442 76 18 19} box THIN_DOWN_BOX color 3 code0 {o->color(progdefaults.LkColor);} } Fl_Box sql1color { xywh {442 112 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.Sql1Color);} } Fl_Box rxidcolorwide { xywh {442 184 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.RxIDwideColor);} } Fl_Box xmtcolor { xywh {442 149 18 18} box THIN_DOWN_BOX code0 {o->color(progdefaults.XmtColor);} } Fl_Box afccolor { xywh {630 76 18 19} box THIN_DOWN_BOX color 3 code0 {o->color(progdefaults.AfcColor);} } Fl_Box sql2color { xywh {630 112 18 18} box THIN_DOWN_BOX code0 {o->color(progdefaults.Sql2Color);} } Fl_Box txidcolor { xywh {630 184 18 18} box THIN_DOWN_BOX code0 {o->color(progdefaults.TxIDColor);} } Fl_Button btn_default_btn_color { label {Lighted Btns} callback {progdefaults.default_btn_color = fl_show_colormap(progdefaults.default_btn_color); default_btn_color->color(progdefaults.default_btn_color); default_btn_color->redraw(); set_default_btn_color(); progdefaults.changed = true;} xywh {284 218 100 21} } Fl_Box default_btn_color { xywh {254 220 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.default_btn_color);} } Fl_Button btn_check_btn_color { label {Check Btns} callback {progdefaults.default_check_btn_color = fl_show_colormap(progdefaults.default_check_btn_color); default_check_btn_color->color(progdefaults.default_check_btn_color); default_check_btn_color->redraw(); set_default_btn_color(); progdefaults.changed = true;} xywh {473 218 100 21} } Fl_Box default_check_btn_color { xywh {442 220 18 19} box THIN_DOWN_BOX code0 {o->color(progdefaults.default_check_btn_color);} } Fl_Button btn_default_round_btn_color { label {Round Btns} callback {progdefaults.default_round_btn_color = fl_show_colormap(progdefaults.default_round_btn_color); default_round_btn_color->color(progdefaults.default_round_btn_color); default_round_btn_color->redraw(); set_default_btn_color(); progdefaults.changed = true;} xywh {662 218 100 21} } Fl_Box default_round_btn_color { xywh {630 220 18 19} box ROUND_DOWN_BOX code0 {o->color(progdefaults.default_round_btn_color);} } Fl_Button btnMenuFont { label {Menu font} callback {font_browser->fontNumber(progdefaults.MenuFontnbr); font_browser->fontSize(progdefaults.MenuFontsize); font_browser->callback(cbMenuFontBrowser); font_browser->show();} xywh {284 278 100 21} } } Fl_Group {} { label {Colors-Fonts/FreqDisp - Meters} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/FreqDisp - Meters"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Colors-Fonts/FreqDisp - Meters"));} } { Fl_Group {} {open xywh {304 51 395 87} box ENGRAVED_FRAME } { Fl_Box FDdisplay { label {14070.150} xywh {384 55 235 45} box DOWN_BOX color 55 labelfont 4 labelsize 40 code0 {o->color(fl_rgb_color(progdefaults.FDbackground.R,progdefaults.FDbackground.G,progdefaults.FDbackground.B));} code1 {o->labelcolor(fl_rgb_color(progdefaults.FDforeground.R,progdefaults.FDforeground.G,progdefaults.FDforeground.B));} code2 {o->labelfont(progdefaults.FreqControlFontnbr);} } Fl_Button btn_freq_control_font { label Font callback {font_browser->fontNumber(progdefaults.FreqControlFontnbr); font_browser->fontSize(14); font_browser->fontColor(FL_FOREGROUND_COLOR); if (font_browser->fixed_width(progdefaults.FreqControlFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbFreqControlFontBrowser); font_browser->show();} xywh {311 106 90 24} } Fl_Button btnBackgroundColor { label {Bg Color} callback {uchar r, g, b; r = progdefaults.FDbackground.R; g = progdefaults.FDbackground.G; b = progdefaults.FDbackground.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetCOLORS( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true;} xywh {407 106 90 24} } Fl_Button btnForegroundColor { label {Digit Color} callback {uchar r, g, b; r = progdefaults.FDforeground.R; g = progdefaults.FDforeground.G; b = progdefaults.FDforeground.B; if (!fl_color_chooser("Foreground", r, g, b)) return; progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; FDdisplay->labelcolor(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetCOLORS( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true;} xywh {503 106 90 24} } Fl_Button btnFD_SystemColor { label {Sys Colors} callback {uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(clr); clr = FL_FOREGROUND_COLOR; Fl::get_color(clr, r, g, b); FDdisplay->labelcolor(clr); FDdisplay->redraw(); progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; if (qsoFreqDisp) { qsoFreqDisp->SetCOLORS( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true;} xywh {599 106 90 24} } } Fl_Group {} { label {S-meter} open xywh {304 142 395 62} box ENGRAVED_FRAME align 21 } { Fl_Button btnSmeter_bg_color { label {Bg Color} callback {uchar r, g, b; r = progdefaults.Smeter_bg_color.R; g = progdefaults.Smeter_bg_color.G; b = progdefaults.Smeter_bg_color.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.Smeter_bg_color.R = r; progdefaults.Smeter_bg_color.G = g; progdefaults.Smeter_bg_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {311 169 90 24} } Fl_Button btnSmeter_scale_color { label {Scale Color} callback {uchar r, g, b; r = progdefaults.Smeter_scale_color.R; g = progdefaults.Smeter_scale_color.G; b = progdefaults.Smeter_scale_color.B; if (!fl_color_chooser("Scale", r, g, b)) return; progdefaults.Smeter_scale_color.R = r; progdefaults.Smeter_scale_color.G = g; progdefaults.Smeter_scale_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {407 169 90 24} } Fl_Button btnSmeter_meter_color { label {Meter Color} callback {uchar r, g, b; r = progdefaults.Smeter_meter_color.R; g = progdefaults.Smeter_meter_color.G; b = progdefaults.Smeter_meter_color.B; if (!fl_color_chooser("Meter", r, g, b)) return; progdefaults.Smeter_meter_color.R = r; progdefaults.Smeter_meter_color.G = g; progdefaults.Smeter_meter_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {503 169 90 24} } } Fl_Group {} { label {PWR-meter} open xywh {304 211 395 67} box ENGRAVED_FRAME align 21 } { Fl_Button btnPWR_bg_color { label {Bg Color} callback {uchar r, g, b; r = progdefaults.PWRmeter_bg_color.R; g = progdefaults.PWRmeter_bg_color.G; b = progdefaults.PWRmeter_bg_color.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.PWRmeter_bg_color.R = r; progdefaults.PWRmeter_bg_color.G = g; progdefaults.PWRmeter_bg_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {311 238 90 24} } Fl_Button btnPWR_scale_color { label {Scale Color} callback {uchar r, g, b; r = progdefaults.PWRmeter_scale_color.R; g = progdefaults.PWRmeter_scale_color.G; b = progdefaults.PWRmeter_scale_color.B; if (!fl_color_chooser("Scale", r, g, b)) return; progdefaults.PWRmeter_scale_color.R = r; progdefaults.PWRmeter_scale_color.G = g; progdefaults.PWRmeter_scale_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {407 238 90 24} } Fl_Button btnPWR_meter_Color { label {Meter Color} callback {uchar r, g, b; r = progdefaults.PWRmeter_meter_color.R; g = progdefaults.PWRmeter_meter_color.G; b = progdefaults.PWRmeter_meter_color.B; if (!fl_color_chooser("Meter", r, g, b)) return; progdefaults.PWRmeter_meter_color.R = r; progdefaults.PWRmeter_meter_color.G = g; progdefaults.PWRmeter_meter_color.B = b; set_smeter_colors(); progdefaults.changed = true;} xywh {503 238 90 24} } Fl_Group listboxPWRselect { label {Power scale} callback {progdefaults.PWRselect = o->index(); set_smeter_colors(); progdefaults.changed = true;} open tooltip {Select the type of FFT prefilter} xywh {599 238 80 24} box DOWN_BOX color 7 code0 {o->add(_("25 W")); o->add("50 W");} code1 {o->add("100 W"); o->add("200 W"); o->add("AUTO");} code3 {o->index(progdefaults.PWRselect);o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } } Fl_Group {} { label {Colors-Fonts/Function keys} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Function keys"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Colors-Fonts/Function keys"));} } { Fl_Check_Button btnUseGroupColors { label {Use colored buttons} callback {progdefaults.useGroupColors = o->value(); colorize_macros(); progdefaults.changed = true;} xywh {337 92 165 21} down_box DOWN_BOX code0 {btnUseGroupColors->value(progdefaults.useGroupColors);} } Fl_Button btnGroup1 { label {Group 1} callback {uchar r, g, b; r = progdefaults.btnGroup1.R; g = progdefaults.btnGroup1.G; b = progdefaults.btnGroup1.B; if (fl_color_chooser("Group 1", r, g, b) == 0) return; progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true;} tooltip {Background color for Function key group 1} xywh {305 140 90 30} code0 {btnGroup1->color(fl_rgb_color(progdefaults.btnGroup1.R, progdefaults.btnGroup1.G,progdefaults.btnGroup1.B));} code1 {btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor);} } Fl_Button btnGroup2 { label {Group 2} callback {uchar r, g, b; r = progdefaults.btnGroup2.R; g = progdefaults.btnGroup2.G; b = progdefaults.btnGroup2.B; if (fl_color_chooser("Group 2", r, g, b) == 0) return; progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true;} tooltip {Background color for Function key group 2} xywh {407 140 90 30} code0 {btnGroup2->color(fl_rgb_color(progdefaults.btnGroup2.R, progdefaults.btnGroup2.G,progdefaults.btnGroup2.B));} code1 {btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor);} } Fl_Button btnGroup3 { label {Group 3} callback {uchar r, g, b; r = progdefaults.btnGroup3.R; g = progdefaults.btnGroup3.G; b = progdefaults.btnGroup3.B; if (fl_color_chooser("Group 3", r, g, b) == 0) return; progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true;} tooltip {Background color for Function key group 3} xywh {509 140 90 30} code0 {btnGroup3->color(fl_rgb_color(progdefaults.btnGroup3.R, progdefaults.btnGroup3.G,progdefaults.btnGroup3.B));} code1 {btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor);} } Fl_Button btnFkeyDEfaults { label Defaults callback {uchar r, g, b; Fl_Color clr; r = 80; g = 144; b = 144; clr = fl_rgb_color(r,g,b); btnGroup1->color(clr); progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; r = 144; g = 80; b = 80; clr = fl_rgb_color(r,g,b); btnGroup2->color(clr); progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; r = 80; g = 80; b = 144; clr = fl_rgb_color(r,g,b); btnGroup3->color(clr); progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; progdefaults.MacroBtnFontcolor = FL_BLACK; progdefaults.MacroBtnFontnbr = FL_HELVETICA; progdefaults.MacroBtnFontsize = 12; btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup2->labelfont(progdefaults.MacroBtnFontnbr); btnGroup3->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup2->labelsize(progdefaults.MacroBtnFontsize); btnGroup3->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->redraw_label(); btnGroup2->redraw_label(); btnGroup3->redraw_label(); colorize_macros(); progdefaults.changed = true;} xywh {612 140 90 30} } Fl_Button btnMacroBtnFont { label {Font/Color} callback {font_browser->fontNumber(progdefaults.MacroBtnFontnbr); font_browser->fontSize(progdefaults.MacroBtnFontsize); font_browser->fontColor(progdefaults.MacroBtnFontcolor); if (font_browser->fixed_width(progdefaults.MacroBtnFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbMacroBtnFontBrowser); font_browser->show();} xywh {509 87 90 30} } } Fl_Group {} { label {Colors-Fonts/Logging controls} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Logging controls"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Colors-Fonts/Logging controls"));} } { Fl_Group {} { label {Logging Panel Controls} open xywh {205 33 590 65} box ENGRAVED_FRAME align 21 } { Fl_Output LOGGINGdisplay { xywh {233 57 184 25} code0 {o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGGINGtextcolor);} code1 {o->color(progdefaults.LOGGINGcolor);} code2 {o->value("W1HKJ");} code3 {o->redraw();} } Fl_Button btnLOGGING_color { label {Bg Color} callback {uchar r, g, b; Fl::get_color(progdefaults.LOGGINGcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGGINGcolor = fl_rgb_color(r, g, b); LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true;} xywh {476 57 80 25} } Fl_Button btn_LOGGING_font { label Font callback {font_browser->fontNumber(progdefaults.LOGGINGtextfont); font_browser->fontSize(progdefaults.LOGGINGtextsize); font_browser->fontColor(progdefaults.LOGGINGtextcolor); if (font_browser->fixed_width(progdefaults.LOGGINGtextfont)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGGINGFontBrowser); font_browser->show();} xywh {566 57 55 25} } Fl_Button btnLOGGINGdefault_colors_font { label Default callback {progdefaults.LOGGINGcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGGINGtextfont = (Fl_Font)0; progdefaults.LOGGINGtextsize = 14; progdefaults.LOGGINGtextcolor = FL_BLACK; LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->textsize(progdefaults.LOGGINGtextsize); LOGGINGdisplay->textcolor(progdefaults.LOGGINGtextcolor); LOGGINGdisplay->textfont(progdefaults.LOGGINGtextfont); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true;} xywh {632 57 80 25} } } Fl_Group {} { label {Logbook Dialog} open xywh {205 99 590 65} box ENGRAVED_FRAME align 21 } { Fl_Output LOGBOOKdisplay { xywh {233 123 184 25} code0 {o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGBOOKtextcolor);} code1 {o->color(progdefaults.LOGBOOKcolor);} code2 {o->value("14.070000");} code3 {o->redraw();} } Fl_Button btnLOGBOOK_color { label {Bg Color} callback {uchar r, g, b; Fl::get_color(progdefaults.LOGBOOKcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGBOOKcolor = fl_rgb_color(r, g, b); LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {475 123 80 25} } Fl_Button btn_LOGBOOK_font { label Font callback {font_browser->fontNumber(progdefaults.LOGBOOKtextfont); font_browser->fontSize(progdefaults.LOGBOOKtextsize); font_browser->fontColor(progdefaults.LOGBOOKtextcolor); if (font_browser->fixed_width(progdefaults.LOGBOOKtextfont)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGBOOKFontBrowser); font_browser->show();} xywh {565 123 55 25} } Fl_Button btnLOGBOOKdefault_colors_font { label Default callback {progdefaults.LOGBOOKcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGBOOKtextfont = (Fl_Font)0; progdefaults.LOGBOOKtextsize = 14; progdefaults.LOGBOOKtextcolor = FL_BLACK; LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->textsize(progdefaults.LOGBOOKtextsize); LOGBOOKdisplay->textcolor(progdefaults.LOGBOOKtextcolor); LOGBOOKdisplay->textfont(progdefaults.LOGBOOKtextfont); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {631 123 80 25} } } Fl_Group {} { label {DX Cluster Dialog} open xywh {205 168 590 147} box ENGRAVED_FRAME align 21 } { Fl_Output DXC_display { label {Report Browser} xywh {233 203 184 25} align 5 code0 {o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);} code2 {o->value("DX de W1HKJ-1");} code3 {o->redraw();} } Fl_Button btn_DXC_font { label Font callback {font_browser->fontNumber(progdefaults.DXC_textfont); font_browser->fontSize(progdefaults.DXC_textsize); font_browser->fontColor(progdefaults.DXC_textcolor); if (font_browser->fixed_width(progdefaults.DXC_textfont)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbDXC_FontBrowser); font_browser->show();} xywh {422 203 86 25} } Fl_Button btnDXCdefault_colors_font { label Default callback {progdefaults.DXC_textfont = FL_COURIER; progdefaults.DXC_textsize = 14; progdefaults.DXC_textcolor = FL_BLACK; progdefaults.DXC_even_color = 7; progdefaults.DXC_odd_color = 246; DXC_display->textsize(progdefaults.DXC_textsize); DXC_display->textcolor(progdefaults.DXC_textcolor); DXC_display->textfont(progdefaults.DXC_textfont); DXC_display->redraw();} xywh {514 203 86 25} } Fl_Button btn_DXC_even_lines { label {Even Lines} callback {progdefaults.DXC_even_color = fl_show_colormap((Fl_Color)progdefaults.DXC_even_color); o->color(progdefaults.DXC_even_color); o->redraw(); dxc_lines_redraw(); progdefaults.changed = true} xywh {422 234 86 25} color 55 code0 {o->color(progdefaults.DXC_even_color);} } Fl_Button btn_DXC_odd_lines { label {Odd Lines} callback {progdefaults.DXC_odd_color = fl_show_colormap((Fl_Color)progdefaults.DXC_odd_color); o->color(progdefaults.DXC_odd_color); o->redraw(); dxc_lines_redraw(); progdefaults.changed = true} xywh {514 234 86 25} color 246 code0 {o->color(progdefaults.DXC_odd_color);} } Fl_Input StreamText { label {Stream Text} xywh {233 273 184 25} align 5 code0 {o->value("DX de W1HKJ...");} code1 {o->color(fl_rgb_color(progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B));} code2 {o->textfont(progdefaults.DXfontnbr); o->textsize(progdefaults.DXfontsize); o->textcolor(progdefaults.DXfontcolor);} } Fl_Button btnDXcolor { label {Bg color} callback {uchar r, g, b; r = progdefaults.DX_Color.R; g = progdefaults.DX_Color.G; b = progdefaults.DX_Color.B; if (!fl_color_chooser("DX Color", r, g, b)) return; progdefaults.DX_Color.R = r; progdefaults.DX_Color.G = g; progdefaults.DX_Color.B = b; StreamText->color(fl_rgb_color(r,g,b)); StreamText->redraw(); brws_tcpip_stream->color(fl_rgb_color(r,g,b)); brws_tcpip_stream->redraw(); brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); brws_dxcluster_hosts->redraw(); brws_dxc_help->color(fl_rgb_color(r,g,b)); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->redraw(); ed_telnet_cmds->color(fl_rgb_color(r,g,b)); ed_telnet_cmds->redraw(); dxcluster_hosts_load(); progdefaults.changed = true;} xywh {422 273 86 25} } Fl_Button btnDXfont { label Font callback {font_browser->fontNumber(progdefaults.DXfontnbr); font_browser->fontSize(progdefaults.DXfontsize); font_browser->fontColor(progdefaults.DXfontcolor); if (font_browser->fixed_width(progdefaults.DXfontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbDXfont_browser); font_browser->show();} xywh {514 273 86 25} } Fl_Button btnDXalt_color { label {Alt Color} callback {choose_color(progdefaults.DXalt_color); o->labelcolor(progdefaults.DXalt_color); o->redraw_label(); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->redraw(); progdefaults.changed = true;} tooltip {Color for outgoing telnet text} xywh {606 272 86 25} code0 {o->labelcolor(progdefaults.DXalt_color);} } Fl_Button btnDXdefault_colors_font { label Default callback {progdefaults.DX_Color.R = 255; progdefaults.DX_Color.G = 255; progdefaults.DX_Color.B = 255; progdefaults.DXfontnbr = FL_COURIER; progdefaults.DXfontsize = 14; progdefaults.DXfontcolor = FL_BLACK; progdefaults.DXalt_color = fl_rgb_color(200, 0, 0); btnDXalt_color->labelcolor(progdefaults.DXalt_color); btnDXalt_color->redraw_label(); brws_tcpip_stream->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_tcpip_stream->setFont(progdefaults.DXfontnbr); brws_tcpip_stream->setFontSize(progdefaults.DXfontsize); brws_tcpip_stream->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->redraw(); ed_telnet_cmds->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); ed_telnet_cmds->setFont(progdefaults.DXfontnbr); ed_telnet_cmds->setFontSize(progdefaults.DXfontsize); ed_telnet_cmds->setFontColor(progdefaults.DXfontcolor); ed_telnet_cmds->redraw(); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->redraw(); StreamText->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); StreamText->textcolor(progdefaults.DXfontcolor); StreamText->redraw(); dxcluster_hosts_load(); font_browser->hide(); progdefaults.changed = true;} xywh {700 272 86 25} } } } Fl_Group {} { label {Colors-Fonts/Rx-Tx} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Rx-Tx"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Colors-Fonts/Rx-Tx"));} } { Fl_Group listbox_charset_status { label {Rx/Tx Character set} open tooltip {Select Rx/Tx Character Set} xywh {293 40 165 24} box BORDER_BOX color 55 align 8 code0 {\#include "fl_digi.h"} code1 {o->labelsize(FL_NORMAL_SIZE); listbox_charset_status->callback(cb_listbox_charset, 0);} class Fl_ListBox } {} Fl_Input RxText { xywh {293 71 220 36} code0 {RxText->value("Receive Text");} code1 {RxText->color(fl_rgb_color(progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B));} code2 {RxText->textfont(progdefaults.RxFontnbr); RxText->textsize(progdefaults.RxFontsize); RxText->textcolor(progdefaults.RxFontcolor);} code3 {RxText->type(FL_MULTILINE_INPUT_WRAP);} } Fl_Button btnRxColor { label {Rx bkgnd} callback {uchar r, g, b; r = progdefaults.RxColor.R; g = progdefaults.RxColor.G; b = progdefaults.RxColor.B; if (!fl_color_chooser("Rx Color", r, g, b)) return; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; RxText->color(fl_rgb_color(r,g,b)); ReceiveText->color(RxText->color()); RxText->redraw(); ReceiveText->redraw(); progdefaults.changed = true;} xywh {523 78 75 21} } Fl_Button btnTxColor { label {Tx bkgnd} callback {uchar r, g, b; r = progdefaults.TxColor.R; g = progdefaults.TxColor.G; b = progdefaults.TxColor.B; if (!fl_color_chooser("Tx Color", r, g, b)) return; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(fl_rgb_color(r,g,b)); TransmitText->color(TxText->color()); TxText->redraw(); TransmitText->redraw(); progdefaults.changed = true;} xywh {523 121 75 21} } Fl_Input TxText { xywh {293 113 220 37} code0 {TxText->value("Transmit Text");} code1 {TxText->color(fl_rgb_color(progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B));} code2 {TxText->textfont(progdefaults.TxFontnbr); TxText->textsize(progdefaults.TxFontsize); TxText->textcolor(progdefaults.TxFontcolor);} code3 {TxText->type(FL_MULTILINE_INPUT_WRAP);} } Fl_Button btnRxFont { label {Rx font} callback {font_browser->fontNumber(progdefaults.RxFontnbr); font_browser->fontSize(progdefaults.RxFontsize); font_browser->fontColor(progdefaults.RxFontcolor); if (font_browser->fixed_width(progdefaults.RxFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbRxFontBrowser); font_browser->show();} xywh {608 78 75 21} } Fl_Button btnTxFont { label {Tx font} callback {font_browser->fontNumber(progdefaults.TxFontnbr); font_browser->fontSize(progdefaults.TxFontsize); font_browser->fontColor(progdefaults.TxFontcolor); if (font_browser->fixed_width(progdefaults.TxFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbTxFontBrowser); font_browser->show();} xywh {608 121 75 21} } Fl_Input MacroText { xywh {293 156 220 37} code0 {MacroText->value("Macro editor text");} code1 {MacroText->textfont(progdefaults.MacroEditFontnbr);} code2 {MacroText->textsize(progdefaults.MacroEditFontsize);} code3 {MacroText->type(FL_MULTILINE_INPUT_WRAP);} } Fl_Button btnMacroEditFont { label {Macro Edit Font} callback {font_browser->fontNumber(progdefaults.MacroEditFontnbr); font_browser->fontSize(progdefaults.MacroEditFontsize); if (font_browser->fixed_width(progdefaults.MacroEditFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbMacroEditFontBrowser); font_browser->show();} xywh {523 164 120 21} } Fl_Group {} { label {Text Highlighting} open xywh {283 203 404 81} box ENGRAVED_FRAME align 17 } { Fl_Button btnXMIT { label XMIT callback {choose_color(progdefaults.XMITcolor); btnXMIT->color( progdefaults.XMITcolor ); btnXMIT->redraw(); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); progdefaults.changed = true;} tooltip {Sent chars in Rx/Tx pane} xywh {301 231 40 21} align 2 code0 {btnXMIT->color(progdefaults.XMITcolor);} } Fl_Button btnCTRL { label CTRL callback {choose_color(progdefaults.CTRLcolor); btnCTRL->color( progdefaults.CTRLcolor ); btnCTRL->redraw(); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); progdefaults.changed = true;} tooltip {Control chars in Rx/Tx pane} xywh {344 231 40 21} align 2 code0 {btnCTRL->color(progdefaults.CTRLcolor);} } Fl_Button btnSKIP { label SKIP callback {choose_color(progdefaults.SKIPcolor); btnSKIP->color( progdefaults.SKIPcolor ); btnSKIP->redraw(); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); progdefaults.changed = true;} tooltip {Skipped chars in Tx pane (Tx on/off in CW)} xywh {388 231 40 21} align 2 code0 {btnSKIP->color(progdefaults.SKIPcolor);} } Fl_Button btnALTR { label ALTR callback {choose_color(progdefaults.ALTRcolor); btnALTR->color( progdefaults.ALTRcolor ); btnALTR->redraw(); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); progdefaults.changed = true;} tooltip {Alternate character color in Rx panelr} xywh {431 231 40 21} align 2 code0 {btnALTR->color(progdefaults.ALTRcolor);} } Fl_Button btnSEL { label SEL callback {choose_color(progdefaults.RxTxSelectcolor); btnSEL->color( progdefaults.RxTxSelectcolor ); btnSEL->redraw(); ReceiveText->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); TransmitText->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); progdefaults.changed = true;} tooltip {Selection background color in Rx Tx panels} xywh {475 231 39 21} align 2 code0 {btnSEL->color(progdefaults.RxTxSelectcolor);} } Fl_Button btnNoTextColor { label System callback {uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true;} xywh {522 231 70 21} } Fl_Button btnTextDefaults { label Defaults callback {uchar r, g, b; Fl_Color clr; progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); r = 255; g = 242; b = 190; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); r = 200; g = 235; b = 255; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; clr = fl_rgb_color(r,g,b); TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true;} xywh {596 231 70 21} } } Fl_Check_Button btn_show_all_codes { label {display Rx control chars as ascii string} callback {progdefaults.show_all_codes=o->value(); progdefaults.changed = true;} xywh {307 295 25 25} down_box DOWN_BOX code0 {o->value(progdefaults.show_all_codes);} } } Fl_Group {} { label {Colors-Fonts/Tabs} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Tabs"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Colors-Fonts/Tabs"));} } { Fl_Button btnTabColor { label {Tab Color} callback {progdefaults.TabsColor = fl_show_colormap(progdefaults.TabsColor); setTabColors(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {396 69 75 21} } Fl_Button btnTabDefaultColor { label System callback {progdefaults.TabsColor = FL_BACKGROUND2_COLOR; setTabColors(); LOGBOOK_colors_font(); progdefaults.changed = true;} xywh {526 69 75 21} } } Fl_Group {} { label {Colors-Fonts/Signal Level} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Signal Level"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Colors-Fonts/Signal Level"));} code3 {tab_tree->close(_("Colors-Fonts"));} } { Fl_Box {} { label {Signal Level Indicator} xywh {340 39 316 21} } Fl_Box lowcolor { xywh {365 96 21 21} box DIAMOND_DOWN_BOX color 0 code0 {o->color(progdefaults.LowSignal);} } Fl_Button btnLowSignal { label Low callback {progdefaults.LowSignal = fl_show_colormap(progdefaults.LowSignal); lowcolor->color(progdefaults.LowSignal); lowcolor->redraw(); progdefaults.changed = true;} xywh {402 75 70 22} } Fl_Box normalcolor { xywh {365 142 21 21} box DIAMOND_DOWN_BOX color 2 code0 {o->color(progdefaults.NormSignal);} } Fl_Counter cnt_normal_signal_level { label {Transition Level (dB)} callback {progdefaults.normal_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level);} xywh {480 99 114 21} align 1 minimum -90 maximum 0 code0 {o->value(progdefaults.normal_signal_level);} code1 {o->lstep(1.0);} } Fl_Button btnNormalSignal { label Normal callback {progdefaults.NormSignal = fl_show_colormap(progdefaults.NormSignal); normalcolor->color(progdefaults.NormSignal); normalcolor->redraw(); progdefaults.changed = true;} xywh {402 122 70 21} } Fl_Box highcolor { xywh {365 189 21 21} box DIAMOND_DOWN_BOX color 3 code0 {o->color(progdefaults.HighSignal);} } Fl_Counter cnt_high_signal_level { callback {progdefaults.high_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level);} xywh {480 145 114 21} minimum -90 maximum 0 code0 {o->value(progdefaults.high_signal_level);} code1 {o->lstep(1.0);} } Fl_Button btnHighSignal { label High callback {progdefaults.HighSignal = fl_show_colormap(progdefaults.HighSignal); highcolor->color(progdefaults.HighSignal); highcolor->redraw(); progdefaults.changed = true;} xywh {402 169 70 21} } Fl_Box overcolor { xywh {365 236 21 21} box DIAMOND_DOWN_BOX color 1 code0 {o->color(progdefaults.OverSignal);} } Fl_Counter cnt_over_signal_level { callback {progdefaults.over_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level);} xywh {480 192 114 21} minimum -90 maximum 0 code0 {o->value(progdefaults.over_signal_level);} code1 {o->lstep(1.0);} } Fl_Button btnOverSignal { label Over callback {progdefaults.OverSignal = fl_show_colormap(progdefaults.OverSignal); overcolor->color(progdefaults.OverSignal); overcolor->redraw(); progdefaults.changed = true;} xywh {402 216 70 21} } Fl_Progress {} { label label xywh {295 289 416 25} hide } Fl_Progress sig_vumeter { label label xywh {322 260 360 24} code0 {\#include "vumeter.h"} class vumeter } Fl_Box {} { label {Input signal level} xywh {375 287 237 17} } Fl_Button btn_default_signal_levels { label Default callback {cnt_normal_signal_level->value( progdefaults.normal_signal_level = -60.0); cnt_high_signal_level->value( progdefaults.high_signal_level = -6.0); cnt_over_signal_level->value( progdefaults.over_signal_level = -3.0);} xywh {618 146 70 20} } Fl_Check_Button btn_use_wsjtx_vumeter_scale { label {Use wsjtx scale} callback {progdefaults.use_wsjtx_vumeter_scale=o->value(); btn_use_wsjtx_vumeter_scale2->value(o->value());} tooltip {default scale is audo "Vu Meter" enable to emulate wsjtx scale} xywh {332 315 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.use_wsjtx_vumeter_scale);} } } Fl_Group {} { label {Colors-Fonts/Digiscope} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Digiscope"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Colors-Fonts/Digiscope"));} code3 {tab_tree->close(_("Colors-Fonts"));} } { Fl_Box {} { label {Digital Scope Colors} xywh {340 39 316 21} } Fl_Box scope_background { xywh {365 80 21 21} box DOWN_BOX color 0 code0 {o->color(progdefaults.digi_background);} } Fl_Button btnScopeBackground { label Background callback {progdefaults.digi_background = fl_show_colormap(progdefaults.digi_background); scope_background->color(progdefaults.digi_background); scope_background->redraw(); set_scope_colors(); progdefaults.changed = true;} xywh {402 79 104 22} } Fl_Box scope_axis { xywh {365 121 21 21} box DOWN_BOX color 2 code0 {o->color(progdefaults.digi_axis_color);} } Fl_Button btnScopeAxis { label Axis callback {progdefaults.digi_axis_color = fl_show_colormap(progdefaults.digi_axis_color); scope_axis->color(progdefaults.digi_axis_color); scope_axis->redraw(); set_scope_colors(); progdefaults.changed = true;} xywh {402 120 104 22} } Fl_Box scope_color_1 { xywh {365 163 21 21} box DOWN_BOX color 3 code0 {o->color(progdefaults.digi_color_1);} } Fl_Button btnScopeColor_1 { label {Color 1} callback {progdefaults.digi_color_1 = fl_show_colormap(progdefaults.digi_color_1); scope_color_1->color(progdefaults.digi_color_1); scope_color_1->redraw(); set_scope_colors(); progdefaults.changed = true;} xywh {402 162 104 22} } Fl_Box scope_color_2 { xywh {365 205 21 21} box DOWN_BOX color 1 code0 {o->color(progdefaults.digi_color_2);} } Fl_Button btnScopeColor_2 { label {Color 2} callback {progdefaults.digi_color_2 = fl_show_colormap(progdefaults.digi_color_2); scope_color_2->color(progdefaults.digi_color_2); scope_color_2->redraw(); set_scope_colors(); progdefaults.changed = true;} xywh {402 204 104 22} } Fl_Progress {} { label label xywh {295 289 416 25} hide } Fl_Button btn_default_scope_colors { label Default callback {progdefaults.digi_background = FL_BLACK; progdefaults.digi_axis_color = FL_WHITE; progdefaults.digi_color_1 = FL_GREEN; progdefaults.digi_color_2 = FL_YELLOW; progdefaults.digi_color_3 = FL_CYAN; progdefaults.digi_color_4 = FL_MAGENTA; scope_background->color(progdefaults.digi_background); scope_background->redraw(); scope_axis->color(progdefaults.digi_axis_color); scope_axis->redraw(); scope_color_1->color(progdefaults.digi_color_1); scope_color_1->redraw(); scope_color_2->color(progdefaults.digi_color_2); scope_color_2->redraw(); scope_color_3->color(progdefaults.digi_color_3); scope_color_3->redraw(); scope_color_4->color(progdefaults.digi_color_4); scope_color_4->redraw(); set_scope_colors(); progdefaults.changed = true;} xywh {618 146 70 20} } Fl_Box scope_color_3 { xywh {365 247 21 21} box DOWN_BOX color 1 code0 {o->color(progdefaults.digi_color_3);} } Fl_Button btnScopeColor_3 { label {Color 3} callback {progdefaults.digi_color_3 = fl_show_colormap(progdefaults.digi_color_3); scope_color_3->color(progdefaults.digi_color_3); scope_color_3->redraw(); set_scope_colors(); progdefaults.changed = true;} xywh {402 246 104 22} } Fl_Box scope_color_4 { xywh {365 289 21 21} box DOWN_BOX color 1 code0 {o->color(progdefaults.digi_color_4);} } Fl_Button btnScopeColor_4 { label {Color 4} callback {progdefaults.digi_color_4 = fl_show_colormap(progdefaults.digi_color_4); scope_color_4->color(progdefaults.digi_color_4); scope_color_4->redraw(); set_scope_colors(); progdefaults.changed = true;} xywh {402 288 104 22} } } Fl_Group {} { label {Contests/General} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Contests/General"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Contests/General"));} } { Fl_Group listbox_contest { label Contest callback {progdefaults.logging = o->index(); if (contests[progdefaults.logging].name == "State QSO parties") { progdefaults.CONTESTnotes = QSOparties.qso_parties[progdefaults.SQSOcontest].notes; progdefaults.SQSOinstate = (QSOparties.qso_parties[progdefaults.SQSOcontest].instate[0] == 'T'); } else { listbox_QP_contests->index(0); progdefaults.CONTESTnotes = contests[progdefaults.logging].notes; } inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); UI_select(); clear_log_fields(); clearQSO(); progdefaults.changed = true;} open tooltip {Select Logging as QSO or Contest} xywh {287 41 500 24} box DOWN_BOX color 7 align 4 code0 {\#include "contest.h"} code1 {o->add(contest_names().c_str());} code2 {o->index(progdefaults.logging);} class Fl_ListBox } {} Fl_Group listbox_QP_contests { label {State QSO Party} callback {int n = o->index(); progdefaults.SQSOcontest = n; progdefaults.SQSOinstate = (QSOparties.qso_parties[n].instate[0] == 'T'); if (contests[progdefaults.logging].name == "State QSO parties") { progdefaults.CONTESTnotes = QSOparties.qso_parties[n].notes; inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); } else inp_contest_notes->value(""); adjust_for_contest(0); UI_select(); clear_log_fields(); clearQSO(); progdefaults.changed = true;} open xywh {367 75 420 24} box DOWN_BOX color 7 align 4 code0 {\#include "contest.h"} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->add(QSOparties.names().c_str());} code3 {o->index(progdefaults.SQSOcontest);} class Fl_ListBox } {} Fl_Input inp_contest_notes { label {Text capture order} tooltip {Context Notes} xywh {367 110 420 24} code0 {o->value(progdefaults.CONTESTnotes.c_str());} class Fl_Input2 } Fl_Group {} { label {Duplicate check, CALL plus} open xywh {204 149 590 86} box ENGRAVED_FRAME align 21 } { Fl_Light_Button btnDupCheckOn { label {On/Off} callback {progdefaults.EnableDupCheck = o->value(); progdefaults.changed = true;} tooltip {Check for duplicates} xywh {221 174 74 20} selection_color 2 code0 {o->value(progdefaults.EnableDupCheck);} } Fl_Check_Button btnDupBand { label Band callback {progdefaults.dupband = o->value(); progdefaults.changed = true;} tooltip {Bands must match} xywh {333 174 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupband);} } Fl_Check_Button btnDupMode { label Mode callback {progdefaults.dupmode = o->value(); progdefaults.changed = true;} tooltip {Mode must match} xywh {446 174 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupmode);} } Fl_Check_Button btnDupTimeSpan { label {Time span over} callback {progdefaults.duptimespan=(int)o->value(); progdefaults.changed = true;} tooltip {QSO must not occur within a time period of} xywh {571 174 129 20} down_box DOWN_BOX code0 {o->value(progdefaults.duptimespan);} } Fl_Button btnDupColor { label {Dup Color} callback {fl_color_chooser("Dup Check", progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); o->color( fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B)); o->redraw(); progdefaults.changed = true;} tooltip {Left click to select dup color} xywh {221 201 90 24} box DOWN_BOX down_box DOWN_BOX color 7 selection_color 7 code0 {o->color(fl_rgb_color(progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B));} code1 {\#include } } Fl_Button btnPossibleDupColor { label {? Dup Color} callback {fl_color_chooser("Possible_Dup Check", progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B); o->color( fl_rgb_color( progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B)); o->redraw(); progdefaults.changed = true;} tooltip {Left click to select possible dup color} xywh {333 201 90 24} box DOWN_BOX down_box DOWN_BOX color 7 selection_color 7 code0 {o->color(fl_rgb_color(progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B));} code1 {\#include } } Fl_Check_Button btnDupXchg1 { label {Exchange In} callback {progdefaults.dupxchg1 = o->value(); progdefaults.changed = true;} tooltip {free form 1 must match} xywh {446 203 105 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupxchg1);} } Fl_Check_Button btnDupState { label State callback {progdefaults.dupstate = o->value(); progdefaults.changed = true;} tooltip {State must match} xywh {571 203 70 20} down_box DOWN_BOX code0 {o->value(progdefaults.dupstate);} } Fl_Value_Input nbrTimeSpan { label minutes callback {progdefaults.timespan = (int)o->value(); progdefaults.changed = true;} tooltip {Enter time span in minutes} xywh {664 201 53 24} align 8 maximum 1440 step 1 value 120 code0 {o->value(progdefaults.timespan);} class Fl_Value_Input2 } } Fl_Group {} { label {Contest Exchange / Serial \#} open xywh {204 233 590 100} box ENGRAVED_FRAME align 21 } { Fl_Input inpSend1 { label Send callback {progdefaults.myXchg=o->value(); progdefaults.changed = true;} tooltip {free form exchange} xywh {269 257 200 24} code0 {o->value(progdefaults.myXchg.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button btn599 { label {RST always 599/59} callback {progdefaults.fixed599 = o->value(); progdefaults.changed = true;} tooltip {Force RST in/out to 599/59} xywh {484 259 130 20} down_box DOWN_BOX code0 {o->value(progdefaults.fixed599);} } Fl_Check_Button btnCutNbrs { label {Send CW cut \#'s} callback {progdefaults.cutnbrs=o->value(); progdefaults.changed = true;} tooltip {0 = T; 9 = N} xywh {644 259 139 20} down_box DOWN_BOX code0 {o->value(progdefaults.cutnbrs);} } Fl_Group {} {open xywh {211 286 576 42} box ENGRAVED_FRAME } { Fl_Value_Input nbrContestStart { label {Start Nbr} callback {progdefaults.ContestStart = (int)o->value(); progdefaults.changed = true;} tooltip {Starting number} xywh {298 295 45 24} maximum 10000 step 1 code0 {o->value(progdefaults.ContestStart);} class Fl_Value_Input2 } Fl_Value_Input nbrContestDigits { label Digits callback {progdefaults.ContestDigits = (int)o->value(); progdefaults.changed = true;} tooltip {Number of digits in serial number} xywh {420 295 46 24} minimum 1 maximum 5 step 1 value 3 class Fl_Value_Input2 } Fl_Check_Button btnUseLeadingZeros { label {Use leading zeros} callback {progdefaults.UseLeadingZeros = o->value(); progdefaults.changed = true;} tooltip {Insert leading zeros into Xmtd serial number} xywh {485 297 157 20} down_box DOWN_BOX value 1 } Fl_Button btnResetSerNbr { label Reset callback {cb_ResetSerNbr();} tooltip {Initialize the QSO logging fields} xywh {682 295 71 24} } } } } Fl_Group {} { label {Contests/Field Day} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Contests/Field Day"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Contests/Field Day"));} } { Fl_Input inp_my_FD_call { label {Operator Call} callback {progdefaults.fd_op_call=o->value(); progdefaults.changed = true;} tooltip {Field Day Callsign May be same as OP callsign} xywh {346 73 80 24} code0 {o->value(progdefaults.fd_op_call.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inp_my_FD_section { label {My Section} callback {progdefaults.my_FD_section=o->value(); progdefaults.changed = true;} tooltip {Field Day Section} xywh {654 73 45 24} code0 {o->value(progdefaults.my_FD_section.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inp_my_FD_class { label {My Class} callback {progdefaults.my_FD_class=o->value(); progdefaults.changed = true;} tooltip {Field Day Class} xywh {507 73 50 24} code0 {o->value(progdefaults.my_FD_class.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Group {} { label {Contests/JOTA School} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Contests/JOTA School"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Contests/JOTA School"));} code3 {tab_tree->close(_("Contests"));} } { Fl_Group {} { label {School Round Up} open xywh {211 137 580 53} box ENGRAVED_BOX align 21 } { Fl_Input inp_my_SCR_class { label {My Class} callback {progdefaults.my_SCR_class=o->value(); progdefaults.changed = true;} tooltip {School Round Up - allowable I, H, O - see rules} xywh {397 159 69 24} code0 {o->value(progdefaults.my_SCR_class.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Group {} { label {Jamboree OTA} open xywh {211 44 580 89} box ENGRAVED_BOX align 21 } { Fl_Input inp_my_JOTA_troop { label {My Troop} callback {progdefaults.my_JOTA_troop=o->value(); progdefaults.changed = true;} tooltip {My JOTA Troop} xywh {396 67 200 24} code0 {o->value(progdefaults.my_JOTA_troop.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inp_my_JOTA_scout { label {Scout Op'} callback {progdefaults.my_JOTA_scout = o->value(); progdefaults.changed=true;} tooltip {Scout Operator Name} xywh {396 98 200 24} code0 {o->value(progdefaults.my_JOTA_scout.c_str());} code1 {inpSend1->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } } Fl_Group {} { label {IDs/CW} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("IDs/CW"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("IDs/CW"));} } { Fl_Group sld { label {CW Postamble ID} open xywh {234 83 536 127} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnCWID { label {Transmit callsign} callback {progdefaults.CWid = o->value(); progdefaults.changed = true;} tooltip {Send Callsign in CW at end of every transmission} xywh {287 121 140 24} down_box DOWN_BOX code0 {o->value(progdefaults.CWid);} } Fl_Value_Slider sldrCWIDwpm { label {Speed (WPM):} callback {progdefaults.CWIDwpm = (int)o->value(); progdefaults.changed = true;} tooltip {Send at this WPM} xywh {287 164 180 20} type Horizontal align 1 minimum 15 maximum 40 step 1 value 18 textsize 14 code0 {o->value(progdefaults.CWIDwpm);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Button bCWIDModes { label {CW ID modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.cwid_modes); progdefaults.changed = true;} xywh {485 121 120 24} } } } Fl_Group {} { label {IDs/RsID} open xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("IDs/RsID"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("IDs/RsID"));} } { Fl_Group {} { label {Reed-Solomon ID (Rx)} open xywh {216 20 560 220} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkRSidNotifyOnly { label {Notify only} callback {progdefaults.rsid_notify_only = o->value(); notify_create_rsid_event(progdefaults.rsid_notify_only); if (progdefaults.rsid_notify_only) { chkRetainFreqLock->deactivate(); chkDisableFreqChange->deactivate(); } else { chkRetainFreqLock->activate(); chkDisableFreqChange->activate(); } progdefaults.changed = true;} tooltip {Check this to be notified when an RSID is received without changing modem and frequency} xywh {241 87 168 20} down_box DOWN_BOX code0 {chkRSidNotifyOnly->value(progdefaults.rsid_notify_only);} } Fl_Button bRSIDRxModes { label {Rx modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.rsid_rx_modes); progdefaults.changed = true;} xywh {224 46 87 24} } Fl_Check_Button chkRSidMark { label {Mark prev freq/mode} callback {progdefaults.rsid_mark = o->value(); progdefaults.changed = true;} tooltip {Insert RX text marker before changing frequency and modem} xywh {241 147 203 20} down_box DOWN_BOX code0 {chkRSidMark->value(progdefaults.rsid_mark);} } Fl_Group listbox_rsid_errors { label {Allow errors} callback {progdefaults.RsID_label_type = o->index(); progdefaults.changed = true;} open tooltip {Low = zero errors Medium = 1 error High = 2 errors} xywh {224 208 100 22} box DOWN_BOX color 7 align 8 code0 {listbox_rsid_errors->add(_("Low")); listbox_rsid_errors->add(_("Medium")); listbox_rsid_errors->add(_("High"));} code1 {listbox_rsid_errors->index(progdefaults.RsID_label_type);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button chkRSidShowAlert { label {Disable alert dialog} callback {progdefaults.disable_rsid_warning_dialog_box = o->value(); progdefaults.changed = true;} tooltip {Do not show RsID alert dialog box} xywh {464 87 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.disable_rsid_warning_dialog_box);} } Fl_Check_Button chkRSidAutoDisable { label {Disables detector} callback {progdefaults.rsid_auto_disable = o->value(); progdefaults.changed = true;} tooltip {Disable further detection when RSID is received} xywh {464 113 203 20} down_box DOWN_BOX code0 {if (progdefaults.rsid_notify_only) progdefaults.rsid_auto_disable = false;} code1 {chkRSidAutoDisable->value(progdefaults.rsid_auto_disable);} code2 {if (progdefaults.rsid_notify_only) chkRSidAutoDisable->deactivate();} } Fl_Check_Button chkRetainFreqLock { label {Retain tx freq lock} callback {progdefaults.retain_freq_lock = o->value(); progdefaults.changed = true;} tooltip {Retain TX lock frequency (Lk) when changing to RX RsID frequency} xywh {241 117 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.retain_freq_lock);} } Fl_Check_Button chkDisableFreqChange { label {Disable freq change} callback {progdefaults.disable_rsid_freq_change = o->value(); progdefaults.changed = true;} tooltip {Do not automatically change to RX RsID frequency} xywh {464 147 203 20} down_box DOWN_BOX code0 {o->value(progdefaults.disable_rsid_freq_change);} } Fl_Check_Button chk_RSID_EOT { label {Rx/Tx RsID EOT} callback {progdefaults.rsid_eot_squelch = o->value(); progdefaults.changed = true;} tooltip {Do not automatically change to RX RsID frequency} xywh {464 177 232 20} down_box DOWN_BOX code0 {o->value(progdefaults.rsid_eot_squelch);} } Fl_Counter val_RSIDsquelch { label {Squelch open (sec)} callback {progdefaults.rsid_squelch = (int)o->value(); progdefaults.changed = true;} tooltip {Use for triggering amplifier carrier detect} xywh {444 208 140 21} align 8 minimum 0 maximum 300 step 1 code0 {o->value(progdefaults.rsid_squelch);} code1 {o->lstep(10.0);} } Fl_Group {} { label {The RsID notification message contents and display characteristics are configured on the "Notifications" tab.} open xywh {336 43 406 38} box BORDER_BOX align 21 } {} } Fl_Group {} { label {Pre-Signal Tone} open xywh {216 243 180 100} box ENGRAVED_FRAME align 21 } { Fl_Counter val_pretone { label Seconds callback {progdefaults.pretone = o->value(); progdefaults.changed = true;} tooltip {Use for triggering amplifier carrier detect} xywh {228 281 120 21} minimum 0 maximum 10 code0 {o->value(progdefaults.pretone);} } } Fl_Group {} { label {Reed-Solomon ID (Tx)} open xywh {406 243 180 100} box ENGRAVED_FRAME align 21 } { Fl_Button bRSIDTxModes { label {Transmit modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.rsid_tx_modes); progdefaults.changed = true;} xywh {412 269 130 26} } Fl_Check_Button btn_post_rsid { label {End of xmt ID} callback {progdefaults.rsid_post=o->value(); progdefaults.changed = true;} tooltip {Add RsID signal to end of transmission} xywh {426 306 97 18} down_box DOWN_BOX code0 {o->value(progdefaults.rsid_post);} } } Fl_Group {} { label {Min BW Detection} open xywh {596 243 180 100} box ENGRAVED_FRAME align 21 } { Fl_Counter val_rsid_min_bw { label Hertz callback {progdefaults.rsid_min_bw = o->value(); progdefaults.changed = true;} tooltip {Minimum bandwidth} xywh {635 271 100 21} type Simple minimum 180 maximum 1000 step 10 value 200 code0 {o->value(progdefaults.rsid_min_bw);} } Fl_Check_Button chkRSidWideSearch { label Passband callback {progdefaults.rsidWideSearch=o->value(); rxid_selection_color(); progdefaults.changed = true;} tooltip {ON - search over entire waterfall OFF - limit search to BW selector} xywh {601 316 93 20} down_box DOWN_BOX code0 {o->value(progdefaults.rsidWideSearch);} } Fl_Button btn_rsid_default_bw { label Default callback {val_rsid_min_bw->value(200); progdefaults.rsid_min_bw = 200; progdefaults.changed = true;} xywh {696 315 70 20} } } } Fl_Group {} { label {IDs/Video} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("IDs/Video"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("IDs/Video"));} code3 {tab_tree->close(_("IDs"));} } { Fl_Group {} { label {Video Preamble ID} open xywh {237 47 536 189} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnsendid { label {Transmit mode ID} callback {progdefaults.sendid=o->value(); progdefaults.changed = true;} tooltip {Waterfall video ID} xywh {255 81 150 20} down_box DOWN_BOX } Fl_Check_Button btnsendvideotext { label {Transmit video text} callback {progdefaults.sendtextid=o->value(); progdefaults.changed = true;} tooltip {Waterfall video text} xywh {255 113 155 20} down_box DOWN_BOX code0 {o->value(progdefaults.sendtextid);} } Fl_Input valVideotext { label {:} callback {progdefaults.strTextid = o->value(); progdefaults.changed = true;} tooltip {Limit to a few characters, as in CQEM or IOTA etc.} xywh {422 111 323 24} code0 {o->value(progdefaults.strTextid.c_str());} code1 {valVideotext->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button chkID_SMALL { label {Use small font} callback {progdefaults.ID_SMALL=o->value(); progdefaults.changed = true;} tooltip {ON - small font OFF - large font} xywh {255 145 120 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.ID_SMALL);} } Fl_Value_Slider sldrVideowidth { label {Chars/Row:} callback {progdefaults.videowidth = (int)o->value(); progdefaults.changed = true;} tooltip {Set the number of characters per row} xywh {495 143 125 24} type Horizontal align 4 minimum 1 maximum 8 step 1 value 4 textsize 14 code0 {o->value(progdefaults.videowidth);} code2 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btn_vidlimit { label {500 Hz limit} callback {progdefaults.vidlimit=o->value(); progdefaults.changed = true;} xywh {255 177 110 15} down_box DOWN_BOX code0 {o->value(progdefaults.vidlimit);} } Fl_Check_Button btn_vidmodelimit { label {Mode width limit} callback {progdefaults.vidmodelimit=o->value(); progdefaults.changed=true;} xywh {255 205 110 15} down_box DOWN_BOX code0 {o->value(progdefaults.vidmodelimit);} } Fl_Button bVideoIDModes { label {Video ID modes} callback {mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.videoid_modes); progdefaults.changed = true;} xywh {625 78 120 24} } } } Fl_Group {} { label {Logging/MacLogger} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/MacLogger"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Logging/MacLogger"));} } { Fl_Check_Button btnConnectToMaclogger { label {Connect to MacLogger} callback {progdefaults.connect_to_maclogger = o->value(); if (progdefaults.connect_to_maclogger == false) maclogger_close(); else maclogger_init(); progdefaults.changed = true;} xywh {211 35 186 20} down_box DOWN_BOX code0 {o->value(progdefaults.connect_to_maclogger);} code1 {\#include "maclogger.h"} } Fl_Check_Button btn_capture_maclogger_radio { label {Capture Radio Report} callback {progdefaults.capture_maclogger_radio = o->value(); progdefaults.changed = true;} xywh {406 35 186 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.capture_maclogger_radio);} } Fl_Check_Button btn_capture_maclogger_log { label {Capture Log Report} callback {progdefaults.capture_maclogger_log = o->value(); progdefaults.changed = true;} xywh {406 60 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_log);} } Fl_Check_Button btn_capture_maclogger_lookup { label {Capture Lookup } callback {progdefaults.capture_maclogger_lookup = o->value(); progdefaults.changed = true;} xywh {606 35 186 20} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_lookup);} } Fl_Check_Button btn_capture_maclogger_spot_tune { label {Capture Spot Tune} callback {progdefaults.capture_maclogger_spot_tune = o->value(); progdefaults.changed = true;} xywh {606 60 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_spot_tune);} } Fl_Check_Button btn_capture_maclogger_spot_report { label {Capture Spot Report} callback {progdefaults.capture_maclogger_spot_report = o->value(); progdefaults.changed = true;} xywh {606 88 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.capture_maclogger_spot_report);} } Fl_Check_Button btn_enable_maclogger_log { label {Enable UDP log file} callback {progdefaults.enable_maclogger_log = o->value(); progdefaults.changed = true;} xywh {211 117 165 26} down_box DOWN_BOX code0 {o->value(progdefaults.enable_maclogger_log);} } Fl_Text_Display txt_UDP_data { label {UDP data stream} xywh {210 164 580 161} align 5 code0 {Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer();} code1 {o->buffer(txtbuffer);} } Fl_Output txt_maclogger_log_filename { xywh {379 117 272 26} code0 {o->value(progdefaults.maclogger_log_filename.c_str());} } Fl_Button {} { label {Clear UDP text} callback {txt_UDP_data->buffer()->text("");} xywh {661 117 129 26} } Fl_Check_Button btn_maclogger_spot_rx { label {Tune to Rx Spot} callback {progdefaults.maclogger_spot_rx = o->value(); progdefaults.changed = true;} tooltip {ON - use Rx spot freq OFF - use Tx spot freq} xywh {406 88 186 21} down_box DOWN_BOX code0 {o->value(progdefaults.maclogger_spot_rx);} } } Fl_Group {} { label {Logging/N3FJP logs} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/N3FJP logs"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Logging/N3FJP logs"));} } { Fl_Text_Display txt_N3FJP_data { label {TCP/IP Data Stream} xywh {205 94 590 150} align 5 code0 {Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer();} code1 {o->buffer(txtbuffer);} } Fl_Button {} { label {Clear text} callback {txt_N3FJP_data->buffer()->text("");} xywh {701 247 90 24} } Fl_Input txt_N3FJP_ip_address { label Address callback {progdefaults.N3FJP_address = o->value(); progdefaults.changed = true;} tooltip {N3FJP Server IP Address} xywh {205 49 350 25} align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.N3FJP_address.c_str());} class Fl_Input2 } Fl_Input txt_N3FJP_ip_port_no { label Port callback {progdefaults.N3FJP_port = o->value(); progdefaults.changed = true;} tooltip {N3FJP Server IP Port} xywh {565 49 55 25} align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.N3FJP_port.c_str());} class Fl_Input2 } Fl_Button btn_default_N3FJP_ip { label Default callback {txt_N3FJP_ip_address->value("127.0.0.1"); progdefaults.N3FJP_address = "127.0.0.1"; txt_N3FJP_ip_port_no->value("1100"); progdefaults.N3FJP_port = "1100"; progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {623 49 67 25} } Fl_Check_Button btn_enable_N3FJP_log { label {Enable Data Stream} callback {progdefaults.enable_N3FJP_log = o->value(); progdefaults.changed = true;} xywh {210 246 165 26} down_box DOWN_BOX code0 {o->value(progdefaults.enable_N3FJP_log);} } Fl_Check_Button btn_connect_to_n3fjp { label Connect callback {progdefaults.connect_to_n3fjp=o->value(); progdefaults.changed=true;} xywh {695 39 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.connect_to_n3fjp);} } Fl_Box box_n3fjp_connected { label Connected xywh {695 66 16 16} box DIAMOND_DOWN_BOX color 52 selection_color 58 align 8 } Fl_Check_Button btn_N3FJP_sweet_spot { label {Center DXspot freq at sweet spot} callback {progdefaults.N3FJP_sweet_spot = o->value(); progdefaults.changed = true;} tooltip {N3FJP DX spots centered on mode sweet spot} xywh {210 299 255 26} down_box DOWN_BOX code0 {o->value(progdefaults.N3FJP_sweet_spot);} } Fl_Check_Button btn_N3FJP_modem_carrier { label {Report actual modem RF frequency} callback {progdefaults.N3FJP_modem_carrier = o->value(); progdefaults.changed = true;} tooltip {Suppressed carrier +/- AF injection frequency} xywh {475 299 255 26} down_box DOWN_BOX code0 {o->value(progdefaults.N3FJP_modem_carrier);} } Fl_Check_Button btn_enable_N3FJP_RIGTX { label {PTT via and } callback {progdefaults.enable_N3FJP_RIGTX = o->value(); progdefaults.changed = true;} xywh {210 273 165 26} down_box DOWN_BOX code0 {o->value(progdefaults.enable_N3FJP_RIGTX);} } } Fl_Group {} { label {Logging/eQSL} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/eQSL"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Logging/eQSL"));} } { Fl_Input inpEQSL_www_url { label {www url} callback {progdefaults.eqsl_www_url = o->value(); progdefaults.changed = true;} tooltip {Your login name} xywh {355 20 390 22} code0 {o->value(progdefaults.eqsl_www_url.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpEQSL_id { label {User ID} callback {progdefaults.eqsl_id = o->value(); progdefaults.changed = true;} tooltip {Your login name} xywh {354 43 150 22} code0 {o->value(progdefaults.eqsl_id.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpEQSL_pwd { label Password callback {progdefaults.eqsl_pwd = o->value(); progdefaults.changed = true;} tooltip {Your login password} xywh {354 66 150 22} code0 {o->value(progdefaults.eqsl_pwd.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnEQSL_pwd_show { label Show callback {inpEQSL_pwd->type(inpEQSL_pwd->type() ^ FL_SECRET_INPUT); inpEQSL_pwd->redraw(); o->label((inpEQSL_pwd->type() & FL_SECRET_INPUT) ? _("Show") : _("Hide"));} tooltip {Show password in plain text} xywh {510 66 70 22} } Fl_Input inpEQSL_nick { label {QTH Nickname} callback {progdefaults.eqsl_nick = o->value(); progdefaults.changed = true;} tooltip {Your login name} xywh {354 90 150 22} code0 {o->value(progdefaults.eqsl_nick.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btn_verify_eqsl { label Verify callback cb_btn_verify_eqsl tooltip {Verify database with eQSL download file} xywh {675 90 70 22} } Fl_Group {} { label Options open xywh {242 118 516 223} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_send_when_logged { label {send when logged (log button, , )} callback {progdefaults.eqsl_when_logged = o->value(); progdefaults.changed = true;} tooltip {automatic data upload} xywh {326 127 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.eqsl_when_logged);} } Fl_Check_Button btn_send_datetime_off { label {Use date/time off for log entry} callback {progdefaults.eqsl_datetime_off = o->value(); progdefaults.changed = true;} tooltip {default uses date/time on} xywh {326 147 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.eqsl_datetime_off);} } Fl_Check_Button btn_show_eqsl_delivery { label {Show delivery message} callback {progdefaults.eqsl_show_delivery = o->value(); progdefaults.changed = true;} tooltip {Display timed delivery message if enabled} xywh {326 167 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.eqsl_show_delivery);} } Fl_Input txt_eqsl_default_message { label {Default message} callback {progdefaults.eqsl_default_message = o->value(); progdefaults.changed = true;} tooltip {default text to send with etc} xywh {295 208 451 40} type Multiline align 5 when 1 code0 {o->value(progdefaults.eqsl_default_message.c_str());} class Fl_Input2 } Fl_Group {} { label {Text Tags (tags use {} delimiters)} open xywh {258 254 481 81} box FLAT_BOX align 21 } { Fl_Box eqsl_txt1 { label { {CALL} other ops call sign} xywh {264 294 220 17} align 20 } Fl_Box eqsl_txt2 { label { {MODE} full mode / submode} xywh {262 313 220 17} align 20 } Fl_Box eqsl_txt3 { label {{NAME} other ops name} xywh {510 294 220 17} align 20 } Fl_Box {} { label {These tags can also be used in } xywh {280 273 440 17} } } } } Fl_Group {} { label {Logging/LoTW} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/LoTW"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Logging/LoTW"));} } { Fl_Input txt_lotw_pathname { label {tqsl:} callback {progdefaults.lotw_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for tqsl executable} xywh {283 50 422 24} when 1 code0 {o->value(progdefaults.lotw_pathname.c_str());} class Fl_Input2 } Fl_Input inpLOTW_pwd { label Password callback {progdefaults.lotw_pwd = o->value(); progdefaults.changed = true;} tooltip {Your tqsl login password} xywh {283 85 225 24} code0 {o->value(progdefaults.lotw_pwd.c_str());} code1 {o->type(FL_SECRET_INPUT);} code2 {inpLOTW_pwd->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button btn_submit_lotw_password { label {Password required} callback {progdefaults.submit_lotw_password=o->value(); progdefaults.changed=true;} tooltip {Submit password with each upload} xywh {605 89 162 16} down_box DOWN_BOX code0 {o->value(progdefaults.submit_lotw_password);} } Fl_Input inpLOTW_location { label Location callback {progdefaults.lotw_location = o->value(); progdefaults.changed = true;} tooltip {tqsl station location} xywh {283 116 250 24} code0 {o->value(progdefaults.lotw_location.c_str());} code1 {inpLOTW_pwd->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btn_select_lotw { label Locate callback {std::string str = select_binary_pathname(progdefaults.lotw_pathname); txt_lotw_pathname->value(str.c_str()); progdefaults.lotw_pathname = str; progdefaults.changed = true;} tooltip {Locate tqsl executable} xywh {710 50 70 24} } Fl_Check_Button btn_lotw_quiet_mode { label {Quiet mode [-q], do not open tqsl dialog} callback {progdefaults.lotw_quiet_mode=o->value(); progdefaults.changed=true;} tooltip {Operate tqsl in batch mode (no dialog)} xywh {243 149 309 16} down_box DOWN_BOX code0 {o->value(progdefaults.lotw_quiet_mode);} } Fl_Check_Button btn_submit_lotw { label {Send QSO data to LoTW when logged} callback {progdefaults.submit_lotw=o->value(); progdefaults.changed=true;} tooltip {Submit each QSO as logged} xywh {243 176 289 16} down_box DOWN_BOX code0 {o->value(progdefaults.submit_lotw);} } Fl_Check_Button btn_show_lotw_delivery { label {Show delivery message} callback {progdefaults.lotw_show_delivery = o->value(); progdefaults.changed = true;} tooltip {Display timed delivery message if enabled} xywh {243 203 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.lotw_show_delivery);} } Fl_Button btn_export_lotw { label Export callback {cb_btnExportLoTW();} tooltip {Export records for LoTW upload} xywh {216 232 70 24} } Fl_Button btn_review_lotw { label Check callback {cb_review_lotw();} tooltip {Review lotw.adif file before sending with tqsl} xywh {216 259 70 24} } Fl_Button btn_send_lotw { label Send callback {cb_send_lotw();} tooltip {Send lotw.adif via tqsl} xywh {216 287 70 24} } Fl_Box {} { label {Export logbook records for LoTW upload} xywh {291 232 346 24} align 20 } Fl_Box {} { label {Review / edit the exported LoTW upload adif file} xywh {291 259 346 24} align 20 } Fl_Box {} { label {Submit the upload adif file to LoTW} xywh {291 287 346 24} align 20 } Fl_Box {} { label {You must have tqsl installed and it's location recorded for LoTW updates to work!} xywh {212 22 574 24} align 16 } Fl_Button btnLOTW_pwd_show { label Show callback {inpLOTW_pwd->type(inpLOTW_pwd->type() ^ FL_SECRET_INPUT); inpLOTW_pwd->redraw(); o->label((inpLOTW_pwd->type() & FL_SECRET_INPUT) ? _("Show") : _("Hide"));} tooltip {Show password in plain text} xywh {516 85 70 24} } Fl_Box {} { label {Use this tqsl station location} xywh {540 116 211 24} align 20 } Fl_Button btn_verify_lotw { label Match callback cb_btn_verify_lotw tooltip {Verify database with LoTW download file} xywh {216 315 70 24} } Fl_Box {} { label {Match logbook records with LoTW download file} xywh {291 315 346 24} align 20 } Fl_Button btn_view_unmatched { label {View Unmatched} callback cb_btn_view_unmatched tooltip {Verify database with LoTW download file} xywh {645 313 139 24} deactivate } Fl_Counter cnt_tracefile_timeout { label Timeout callback {progdefaults.tracefile_timeout = o->value();} tooltip {Wait NN seconds for LoTW response} xywh {647 146 79 21} type Simple align 4 minimum 4 maximum 60 step 1 value 5 code0 {o->value(progdefaults.tracefile_timeout);} } } Fl_Group {} { label {Logging/Cloudlog} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/Cloudlog"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Logging/Cloudlog"));} code3 {tab_tree->close(_("Logging"));} } { Fl_Group {} { label {This allows for logging of QSOs to a Cloudlog instance.} open xywh {205 25 590 35} align 16 } {} Fl_Check_Button btnEnCloudlog { label {Enable Cloudlog API logging} callback {btnEnCloudlog->value(o->value()); progdefaults.EnCloudlog=o->value(); progdefaults.changed = true;} tooltip {This enables logging of QSOs to Cloudlog via API} xywh {265 76 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.EnCloudlog);} } Fl_Input txt_cloudlog_api_url { label {API URL:} callback {progdefaults.cloudlog_api_url = o->value(); progdefaults.changed = true;} tooltip {Enter the URL of your Cloudlog API} xywh {310 131 379 24} code0 {o->value(progdefaults.cloudlog_api_url.c_str());} class Fl_Input2 } Fl_Input txt_cloudlog_api_key { label {API Key:} callback {progdefaults.cloudlog_api_key = o->value(); progdefaults.changed = true;} tooltip {Enter the API key for your Cloudlog instance} xywh {310 171 379 24} code0 {o->value(progdefaults.cloudlog_api_key.c_str());} class Fl_Input2 } Fl_Spinner sp_cloudlog_station_id { label {Station ID:} callback {progdefaults.cloudlog_station_id=o->value(); progdefaults.changed = true;} xywh {310 215 60 25} maximum 9999 code0 {o->value(progdefaults.cloudlog_station_id);} } Fl_Button btnTestApiKey { label Initialize callback {std::string url; std::string apiKey; url = txt_cloudlog_api_url->value(); apiKey = txt_cloudlog_api_key->value(); if (url.empty() || apiKey.empty()) { btnTestApiKey->labelcolor(FL_RED); } else if (test_api_key(url.c_str(), apiKey.c_str(), 5.0) == 0) { btnTestApiKey->color(FL_GREEN); } else if (test_api_key(url.c_str(), apiKey.c_str(), 5.0) == 1) { btnTestApiKey->color(FL_YELLOW); } else { btnTestApiKey->color(FL_RED); } progdefaults.changed = true;} tooltip {Test API Key} xywh {696 313 80 24} } } Fl_Group {} { label {Logging/QSO logging} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/QSO logging"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Logging/QSO logging"));} code3 {tab_tree->close(_("Logging"));} } { Fl_Check_Button btnNagMe { label {Prompt to save log on exit} callback {btn2NagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true;} tooltip {Bug me about saving log entries} xywh {255 63 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.NagMe);} } Fl_Check_Button btnClearOnSave { label {Clear on save} callback {progdefaults.ClearOnSave=o->value(); progdefaults.changed = true;} tooltip {Clear log entries after saving or using macro } xywh {255 92 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.ClearOnSave);} } Fl_Check_Button btnCallUpperCase { label {Convert callsign to upper case} callback {progdefaults.calluppercase = o->value(); progdefaults.changed = true;} tooltip {Force callsign field to UPPERCASE} xywh {255 121 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.calluppercase);} } Fl_Check_Button btnAutoFillQSO { label {Auto-fill Country and Azimuth} callback {progdefaults.autofill_qso_fields = o->value(); progdefaults.changed = true;} tooltip {Fill in Country / Azimuth using cty.dat information} xywh {255 151 236 20} down_box DOWN_BOX code0 {o->value(progdefaults.autofill_qso_fields);} } Fl_Check_Button btnDateTimeSort { label {Sort by Date/Time OFF} callback {progdefaults.sort_date_time_off = o->value(); progdefaults.changed = true; reload_browser();} tooltip {Sort by date/time OFF - effects all ADIF/Cabrillo reports} xywh {508 63 190 20} down_box DOWN_BOX code0 {o->value(progdefaults.sort_date_time_off);} } Fl_Check_Button btndate_time_force { label {Date time ON == OFF} callback {progdefaults.force_date_time = o->value(); progdefaults.changed = true;} tooltip {Force date/time ON == date/time OFF} xywh {508 92 190 20} down_box DOWN_BOX code0 {o->value(progdefaults.force_date_time);} } Fl_Check_Button btnRSTindefault { label {Default RST in to 599/59} callback {progdefaults.RSTin_default = o->value(); progdefaults.changed = true;} tooltip {Clear log controls sets RST in to 599/59} xywh {508 121 213 20} down_box DOWN_BOX code0 {o->value(progdefaults.RSTin_default);} } Fl_Check_Button btnRSTdefault { label {Default RST out to 599/59} callback {progdefaults.RSTdefault = o->value(); progdefaults.changed = true;} tooltip {Clear log controls sets RST out to 599/59} xywh {508 151 216 20} down_box DOWN_BOX code0 {o->value(progdefaults.RSTdefault);} } Fl_Input inpMyPower { label {Transmit Power} callback {progdefaults.mytxpower = o->value(); progdefaults.changed = true;} tooltip {Tx power used for logbook entries} xywh {368 219 50 24} code0 {o->value(progdefaults.mytxpower.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button btnDisplayLogbookRead { label {Display logbook read datum at start} callback {progdefaults.DisplayLogbookRead = o->value(); progdefaults.changed = true;} tooltip {The filename is written to the RX text area} xywh {255 181 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.DisplayLogbookRead);} } Fl_Check_Button btn_log_power_meter { label {Log power meter } callback {progdefaults.log_power_meter=o->value(); progdefaults.changed = true;} tooltip {Bug me about saving log entries} xywh {444 221 155 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.log_power_meter);} } } Fl_Group {} { label {Modem/CW/General} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/General"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/General"));} } { Fl_Group {} { label Receive xywh {225 22 560 147} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnCWuseSOMdecoding { label {SOM decoding} callback {progdefaults.CWuseSOMdecoding = o->value(); progdefaults.changed = true;} tooltip {Self Organizing Mapping} xywh {296 57 125 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWuseSOMdecoding);} } Fl_Check_Button btnCWrcvTrack { label {WPM Tracking} callback {progdefaults.CWtrack = o->value(); progdefaults.changed = true;} tooltip {Automatic Rx speed tracking} xywh {450 57 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWtrack);} } Fl_Value_Slider sldrCWbandwidth { label {Filter bandwidth} callback {progdefaults.CWbandwidth = (int)o->value(); progdefaults.changed = true;} tooltip {CW dsp filter bandwidth} xywh {250 98 250 20} type Horizontal align 5 minimum 10 maximum 400 step 1 value 66 textsize 14 code0 {o->value(progdefaults.CWbandwidth);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btnCWmfilt { label {Matched Filt'} callback {progdefaults.CWmfilt = o->value(); progdefaults.changed = true;} tooltip {Matched Filter bandwidth} xywh {503 98 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.CWmfilt);} } Fl_Value_Output valCWrcvWPM { label {Rx WPM} callback {progdefaults.changed = true;} xywh {250 137 35 20} color 7 align 5 } Fl_Progress prgsCWrcvWPM { tooltip {Tracked CW speed in WPM} xywh {286 137 214 20} color 49 selection_color 15 align 0 } Fl_Counter cntLower { label Lower callback {progdefaults.CWlower = o->value(); progdefaults.changed = true;} tooltip {Detector low threshold} xywh {409 57 65 20} type Simple align 1 minimum 0.01 maximum 0.99 step 0.01 value 0.45 hide code0 {o->value(progdefaults.CWlower);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntUpper { label Upper callback {progdefaults.CWupper = o->value(); progdefaults.changed = true;} tooltip {Detector high threshold} xywh {502 57 65 20} type Simple align 1 minimum 0.01 maximum 0.99 step 0.01 value 0.55 hide code0 {o->value(progdefaults.CWupper);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntCWrange { label Range callback {progdefaults.CWrange = (int)o->value(); progdefaults.changed = true;} tooltip {Range +/- wpm} xywh {503 136 65 20} type Simple align 8 minimum 5 maximum 25 step 1 value 10 code0 {o->value(progdefaults.CWrange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group {} { label {Signal tracking} open xywh {625 30 135 124} box ENGRAVED_BOX align 17 } { Fl_Choice mnu_cwrx_attack { label Attack callback {progdefaults.cwrx_attack = o->value(); progdefaults.changed = true;} open xywh {680 55 72 20} down_box BORDER_BOX code0 {o->add("Slow|Med|Fast");} code1 {o->value(progdefaults.cwrx_attack);} } {} Fl_Choice mnu_cwrx_decay { label Decay callback {progdefaults.cwrx_decay = o->value(); progdefaults.changed = true;} open xywh {680 90 72 20} down_box BORDER_BOX code0 {o->add("Slow|Med|Fast");} code1 {o->value(progdefaults.cwrx_decay);} } {} Fl_Button btn_cw_tracking_defaults { label Defaults callback {progdefaults.cwrx_attack = 1; progdefaults.cwrx_decay = 0; mnu_cwrx_attack->value(progdefaults.cwrx_attack); mnu_cwrx_decay->value(progdefaults.cwrx_decay); progdefaults.changed = true;} xywh {680 120 70 20} } } } Fl_Group {} { label Transmit open xywh {225 170 560 174} box ENGRAVED_FRAME align 21 } { Fl_Value_Slider sldrCWxmtWPM { label {char WPM} callback {progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); cntr_nanoCW_WPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters();} tooltip {My transmit CW WPM} xywh {250 195 440 20} type Horizontal align 8 minimum 5 maximum 100 step 1 value 20 textsize 14 code0 {o->value(progdefaults.CWspeed);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Counter cntCWdefWPM { label Default callback {progdefaults.defCWspeed = (int)o->value(); progdefaults.changed = true;} tooltip {The default CW speed} xywh {307 224 64 20} type Simple align 4 minimum 5 maximum 200 step 1 value 18 code0 {o->value(progdefaults.defCWspeed);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntCWlowerlimit { label {Lower limit} callback {progdefaults.CWlowerlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->minimum(progdefaults.CWlowerlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWupperlimit->minimum(progdefaults.CWlowerlimit+20); cntCW_WPM->minimum(progdefaults.CWlowerlimit);} tooltip {No slower than this} xywh {497 224 65 20} type Simple align 4 minimum 5 maximum 20 step 5 value 10 code0 {o->value(progdefaults.CWlowerlimit);} code1 {o->labelsize(FL_NORMAL_SIZE);} } Fl_Counter cntCWupperlimit { label {Upper limit} callback {progdefaults.CWupperlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->maximum(progdefaults.CWupperlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWlowerlimit->maximum(progdefaults.CWupperlimit-20); cntCW_WPM->maximum(progdefaults.CWupperlimit);} tooltip {No faster than this} xywh {688 224 65 20} type Simple align 4 minimum 25 maximum 200 step 5 value 100 code0 {o->value(progdefaults.CWupperlimit);} code1 {o->labelsize(FL_NORMAL_SIZE);} } Fl_Value_Slider sldrCWfarnsworth { label {text WPM} callback {progdefaults.CWfarnsworth = (int)o->value(); progdefaults.changed = true;} tooltip {My transmit CW WPM} xywh {250 271 400 20} type Horizontal align 8 minimum 5 maximum 50 step 1 value 15 textsize 14 code0 {o->value(progdefaults.CWfarnsworth);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btnCWusefarnsworth { label {Use Farnsworth timing} callback {progdefaults.CWusefarnsworth=o->value(); progdefaults.changed = true;} tooltip {text WPM <= char WPM} xywh {270 252 180 15} down_box DOWN_BOX code0 {o->value(progdefaults.CWusefarnsworth);} } Fl_Value_Slider sldrCWwordsworth { label {Spacing WPM} callback {progdefaults.CWwordsworth = (int)o->value(); progdefaults.changed = true;} tooltip {My transmit CW WPM} xywh {251 319 400 20} type Horizontal align 8 minimum 5 maximum 50 step 1 value 15 textsize 14 code0 {o->value(progdefaults.CWwordsworth);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button btnCWusewordsworth { label {Use Wordsworth timing} callback {progdefaults.CWusewordsworth=o->value(); progdefaults.changed = true;} tooltip {text WPM <= char WPM} xywh {271 300 180 15} down_box DOWN_BOX code0 {o->value(progdefaults.CWusewordsworth);} } } } Fl_Group {} { label {Modem/CW/Timing and QSK} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/Timing and QSK"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/Timing and QSK"));} } { Fl_Group {} { label Timing open xywh {205 28 590 124} box ENGRAVED_FRAME align 21 } { Fl_Counter cntCWdash2dot { label {Dash/Dot} callback {progdefaults.CWdash2dot=o->value(); cnt_nanoCWdash2dot->value(progdefaults.CWdash2dot); progdefaults.changed = true;} tooltip {Dash to dot ratio} xywh {335 44 125 24} align 8 minimum 2.5 maximum 4 value 3 code0 {o->value(progdefaults.CWdash2dot);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(1);} class Fl_Counter2 } Fl_Counter cntCWrisetime { label {Edge timing} callback {progdefaults.CWrisetime=o->value(); progdefaults.changed = true;} tooltip {Leading and Trailing edge risetimes (msec)} xywh {335 75 125 24} align 8 minimum 0 maximum 15 value 4 code0 {o->value(progdefaults.CWrisetime);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(1);} class Fl_Counter2 } Fl_Group i_listboxQSKshape { label {Edge shape} callback {progdefaults.QSKshape = o->index(); progdefaults.changed = true;} open tooltip {Hanning/Blackman - use edge timing BPF - use BPF bandwidth} xywh {335 108 125 24} box DOWN_BOX color 7 align 8 code0 {o->add("Hanning|Blackman");} code1 {o->index(progdefaults.QSKshape);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } Fl_Group {} { label QSK open xywh {205 155 590 153} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnQSK { label {QSK on right audio channel} callback {progdefaults.QSK = o->value(); btnQSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); }} tooltip {Generate square wave signal on right channel} xywh {267 172 217 20} down_box DOWN_BOX code0 {o->value(progdefaults.QSK);} } Fl_Counter cntQSKfrequency { label {QSK frequency} callback {progdefaults.QSKfrequency=o->value(); progdefaults.changed = true;} tooltip {Fundamental frequency of QSK square wave signal} xywh {215 206 125 24} align 8 minimum 800 maximum 8000 step 5 value 3200 code0 {o->value(progdefaults.QSKfrequency);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(100);} class Fl_Counter2 } Fl_Counter cntPreTiming { label {Pre-keydown timing (ms)} callback {progdefaults.CWpre = o->value(); progdefaults.changed = true;} tooltip {Msec pre-keydown} xywh {476 206 125 24} align 8 minimum 0 maximum 100 code0 {o->value(progdefaults.CWpre);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(1);} class Fl_Counter2 } Fl_Counter cntPostTiming { label {Post-keydown timing (ms)} callback {progdefaults.CWpost = o->value(); progdefaults.changed = true;} tooltip {Msec post-keydown} xywh {476 237 125 24} align 8 minimum 0 maximum 100 code0 {o->value(progdefaults.CWpost);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(1);} class Fl_Counter2 } Fl_Counter cntQSKamp { label {QSK amplitude} callback {progdefaults.QSKamp=o->value(); progdefaults.changed = true;} tooltip {Amplitude of right channel QSK signal} xywh {215 237 125 24} align 8 minimum 0 maximum 1 step 0.01 value 0.8 code0 {o->value(progdefaults.QSKamp);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(0.1);} class Fl_Counter2 } Fl_Counter cntQSKrisetime { label {Edge timing} callback {progdefaults.QSKrisetime=o->value(); progdefaults.changed = true;} tooltip {Leading and Trailing edge risetimes (msec)} xywh {215 270 125 24} align 8 minimum 0 maximum 15 value 4 code0 {o->value(progdefaults.QSKrisetime);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(1);} class Fl_Counter2 } } Fl_Group {} { label {Send Test character} open xywh {205 310 590 40} box ENGRAVED_BOX align 21 } { Fl_Group i_listbox_test_char { label {Test char} callback {progdefaults.TestChar = o->index();} open tooltip {Test character for QSK adjustment} xywh {391 319 112 22} box DOWN_BOX color 7 align 8 code0 {extern char szTestChar[];} code1 {o->add(szTestChar);} code2 {o->index(progdefaults.TestChar);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnQSKadjust { label {Send continuously} callback {progdefaults.QSKadjust = o->value();} tooltip {Send a continuous stream of test characters} xywh {585 321 152 18} down_box DOWN_BOX code0 {o->value(progdefaults.QSKadjust);} } } } Fl_Group {} { label {Modem/CW/Prosigns} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/Prosigns"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/Prosigns"));} } { Fl_Group {} { label {Use these for WinKeyer and nanoCW} xywh {555 39 182 262} box ENGRAVED_FRAME align 17 } { Fl_Box {} { label {" RR} tooltip {.-..-.} xywh {615 70 59 22} } Fl_Box {} { label {$ SX} tooltip {...-..-} xywh {615 90 59 22} } Fl_Box {} { label {' WG} tooltip {.----.} xywh {615 109 59 22} } Fl_Box {} { label {( KN} tooltip {-.--.} xywh {615 128 59 22} } Fl_Box {} { label {) KK} tooltip {-.--.-} xywh {615 147 59 22} } Fl_Box {} { label {+ AR} tooltip {.-.-.} xywh {615 166 59 22} } Fl_Box {} { label {< AR} tooltip {.-.-.} xywh {615 185 59 22} } Fl_Box {} { label {> SK} tooltip {...-.-} xywh {615 204 59 22} } Fl_Box {} { label {= BT} tooltip {-...-} xywh {615 223 59 22} } Fl_Box {} { label {- DU} tooltip {-....-} xywh {615 242 59 22} } Fl_Box {} { label {@@ AC} tooltip {.--.-.} xywh {615 263 59 22} } } Fl_Group {listbox_prosign[0]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[0] = ps[c]; progdefaults.changed = true;} open xywh {304 50 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[0];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[1]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[1] = ps[c]; progdefaults.changed = true;} open xywh {304 77 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[1];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[2]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[2] = ps[c]; progdefaults.changed = true;} open xywh {304 105 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[2];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[3]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[3] = ps[c]; progdefaults.changed = true;} open xywh {304 132 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[3];} code2 {o->value(s);} class Fl_ListBox } {} Fl_Group {listbox_prosign[4]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[4] = ps[c]; progdefaults.changed = true;} open xywh {304 160 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[4];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[5]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[5] = ps[c]; progdefaults.changed = true;} open xywh {304 188 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[5];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[6]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[6] = ps[c]; progdefaults.changed = true;} open xywh {304 215 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[6];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[7]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[7] = ps[c]; progdefaults.changed = true;;} open xywh {304 243 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[7];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {listbox_prosign[8]} { label {} callback {int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[8] = ps[c]; progdefaults.changed = true;} open xywh {304 271 47 22} box DOWN_BOX color 7 align 4 code0 {o->add(szProsigns);} code1 {char s[2] = " "; s[0] = progdefaults.CW_prosigns[8];} code2 {o->value(s); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnCW_use_paren { label {Use '(' paren not KN} callback {progdefaults.CW_use_paren=o->value(); progdefaults.changed = true;} xywh {354 187 68 15} down_box DOWN_BOX code0 {o->value(progdefaults.CW_use_paren);} } Fl_Check_Button btnCW_prosign_display { label {Display decoded as assigned key} callback {progdefaults.CW_prosign_display=o->value(); progdefaults.changed = true;} tooltip {Display the decoded prosign in the RX text using the short cut key} xywh {304 301 68 15} down_box DOWN_BOX code0 {o->value(progdefaults.CW_prosign_display);} } } Fl_Group {} { label {Modem/CW/Extended Chars.} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/Extended Chars."));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/Extended Chars."));} } { Fl_Group {} { label {Check to enable character encode/decode Select one character from each group} open xywh {205 30 590 286} box FLAT_BOX align 17 } { Fl_Group {} {open xywh {210 109 99 80} box ENGRAVED_FRAME } { Fl_Check_Button btn_A_aelig { label {A aelig} callback {progdefaults.A_aelig = o->value(); if (progdefaults.A_aelig) { progdefaults.A_umlaut = false; btn_A_umlaut->value(0); } btn_A_umlaut->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {216 125 70 15} down_box DOWN_BOX code0 {\#include "cw.h"} code1 {o->value(progdefaults.A_aelig);} } Fl_Check_Button btn_A_umlaut { label { A umlaut} callback {progdefaults.A_umlaut = o->value(); if (progdefaults.A_umlaut) { progdefaults.A_aelig = false; btn_A_aelig->value(0); } btn_A_aelig->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {216 162 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.A_umlaut);} } } Fl_Check_Button btn_A_ring { label { A ring} callback {progdefaults.A_ring = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {216 199 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.A_ring);} } Fl_Group {} {open xywh {311 109 99 120} box ENGRAVED_FRAME } { Fl_Check_Button btn_O_acute { label { O acute} callback {progdefaults.O_acute = o->value(); if (progdefaults.O_acute) { progdefaults.O_umlaut = false; btn_O_umlaut->value(0); progdefaults.O_slash = false; btn_O_slash->value(0); } btn_O_umlaut->redraw(); btn_O_slash->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {316 125 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.O_acute);} } Fl_Check_Button btn_O_slash { label { O slash} callback {progdefaults.O_slash = o->value(); if (progdefaults.O_slash) { progdefaults.O_umlaut = false; btn_O_umlaut->value(0); progdefaults.O_acute = false; btn_O_acute->value(0); } btn_O_umlaut->redraw(); btn_O_acute->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {316 199 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.O_slash);} } Fl_Check_Button btn_O_umlaut { label { O umlaut} callback {progdefaults.O_umlaut = o->value(); if (progdefaults.O_umlaut) { progdefaults.O_acute = false; btn_O_acute->value(0); progdefaults.O_slash = false; btn_O_slash->value(0); } btn_O_acute->redraw(); btn_O_slash->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {316 162 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.O_umlaut);} } } Fl_Check_Button btn_C_cedilla { label { C cedilla} callback {progdefaults.C_cedilla = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {413 125 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.C_cedilla);} } Fl_Check_Button btn_E_grave { label { E grave} callback {progdefaults.E_grave = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {511 125 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.E_grave);} } Fl_Check_Button btn_E_acute { label { E acute} callback {progdefaults.E_acute = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {511 162 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.E_acute);} } Fl_Check_Button btn_N_tilde { label { N tilde} callback {progdefaults.N_tilde = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {604 125 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.N_tilde);} } Fl_Group {} {open xywh {690 109 99 80} box ENGRAVED_FRAME } { Fl_Check_Button btn_U_umlaut { label { U umlaut} callback {progdefaults.U_umlaut = o->value(); if (progdefaults.U_umlaut) { progdefaults.U_circ = false; btn_U_circ->value(0); } btn_U_circ->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {695 125 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.U_umlaut);} } Fl_Check_Button btn_U_circ { label { U circ} callback {progdefaults.U_circ = o->value(); if (progdefaults.U_circ) { progdefaults.U_umlaut = false; btn_U_umlaut->value(0); } btn_U_umlaut->redraw(); progdefaults.changed = true; CW_table_changed = true;} tooltip {Swap left/right keyer contacts} xywh {695 162 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.U_circ);} } } Fl_Group {} { label {See https://en.wikipedia.org/wiki/Morse_code for information regarding extended Morse characters.} open xywh {310 249 403 45} align 17 } {} } } Fl_Group {} { label {Punctuation/Noise Processing} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/Punctuation-Noise"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/Punctuation-Noise"));} } { Fl_Group {} { label {Check to enable character encode/decode} open xywh {205 30 590 190} box ENGRAVED_BOX align 17 } { Fl_Check_Button btn_CW_backslash { label { backslash \\ ".-..-."} callback {progdefaults.CW_backslash = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {265 65 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_backslash);} } Fl_Check_Button btn_CW_apostrophe { label { apostrophe ' ".----."} callback {progdefaults.CW_apostrophe = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {265 90 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_apostrophe);} } Fl_Check_Button btn_CW_quote { label { quote " ".-..-."} callback {progdefaults.CW_quote = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {265 115 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_quote);} } Fl_Check_Button btn_CW_dollar_sign { label { dollar sign $ "...-..-"} callback {progdefaults.CW_dollar_sign = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {265 140 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_dollar_sign);} } Fl_Check_Button btn_CW_open_paren { label { open_paren ( "-.--."} callback {progdefaults.CW_open_paren = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {265 165 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_open_paren);} } Fl_Check_Button btn_CW_close_paren { label { close paren ) "-.--.-"} callback {progdefaults.CW_close_paren = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {265 190 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_close_paren);} } Fl_Check_Button btn_CW_colon { label { colon : "---..."} callback {progdefaults.CW_colon = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {535 65 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_colon);} } Fl_Check_Button btn_CW_semi_colon { label { semi colon ; "-.-.-."} callback {progdefaults.CW_semi_colon = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {535 90 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_semi_colon);} } Fl_Check_Button btn_CW_underscore { label { underscore _ "..--.-"} callback {progdefaults.CW_underscore = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {535 115 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_underscore);} } Fl_Check_Button btn_CW_at_symbol { label { at symbol @@ ".--.-."} callback {progdefaults.CW_at_symbol = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {535 140 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_at_symbol);} } Fl_Check_Button btn_CW_exclamation { label { exclamation ! "-.-.--"} callback {progdefaults.CW_exclamation = o->value(); progdefaults.changed = true; CW_table_changed = true;} tooltip {disable for no printed character} xywh {535 165 70 15} down_box DOWN_BOX value 1 labelfont 4 code0 {o->value(progdefaults.CW_exclamation);} } } Fl_Group {} { label {Unknown character decode (noise)} open xywh {205 224 590 120} box ENGRAVED_BOX align 17 } { Fl_Check_Button btn_CW_noise0 { label { Do not display unknown MORSE symbol} callback {progdefaults.CW_noise = 0; if (o->value()) { btn_CW_noise1->value(0); btn_CW_noise2->value(0); btn_CW_noise3->value(0); } else progdefaults.CW_noise = 0; progdefaults.changed = true;} tooltip {disable '*'or no printed character} xywh {265 248 193 15} down_box DOWN_BOX labelfont 4 code0 {o->value(progdefaults.CW_noise == 0);} } Fl_Check_Button btn_CW_noise1 { label { Display '*' character for unknown MORSE symbol} callback {progdefaults.CW_noise = '*'; if (o->value()) { btn_CW_noise0->value(0); btn_CW_noise2->value(0); btn_CW_noise3->value(0); } else progdefaults.CW_noise = 0; progdefaults.changed = true;} tooltip {disable '*'or no printed character} xywh {265 264 193 24} down_box DOWN_BOX labelfont 4 code0 {o->value(progdefaults.CW_noise == '*');} } Fl_Check_Button btn_CW_noise2 { label { Display '_' character for unknown MORSE symbol} callback {progdefaults.CW_noise = o->value(); if (o->value()) { btn_CW_noise0->value(0); btn_CW_noise1->value(0); btn_CW_noise3->value(0); } else progdefaults.CW_noise = 0; progdefaults.changed = true;} tooltip {disable '_' for no printed character} xywh {265 289 193 24} down_box DOWN_BOX labelfont 4 code0 {o->value(progdefaults.CW_noise == '_');} } Fl_Check_Button btn_CW_noise3 { label { Display ' ' character for unknown MORSE symbol} callback {progdefaults.CW_noise = ' '; if (o->value()) { btn_CW_noise0->value(0); btn_CW_noise1->value(0); btn_CW_noise2->value(0); } else progdefaults.CW_noise = 0; progdefaults.changed = true;} tooltip {disable ' ' for no printed character} xywh {265 314 193 24} down_box DOWN_BOX labelfont 4 code0 {o->value(progdefaults.CW_noise == ' ');} } } } Fl_Group {} { label {Modem/CW/WinKeyer} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/WinKeyer"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/WinKeyer"));} } { Fl_Group select_WK_CommPort { label {Ser. Port} callback {progStatus.WK_serial_port_name = o->value(); select_WKFSK_CommPort->value(progStatus.WK_serial_port_name.c_str());} open tooltip {Xcvr serial port} xywh {274 30 405 25} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {\#include "winkeyer.h"} code2 {o->value(progStatus.WK_serial_port_name.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_WKCW_connect { label Connect callback {WKCW_connect(o->value());} tooltip {Connect / Disconnect from WinKeyer} xywh {705 30 80 25} code0 {o->value(progStatus.WK_online);} } Fl_Box box_WK_wait { label Wait xywh {269 66 16 16} box DIAMOND_DOWN_BOX align 8 } Fl_Box box_WK_break_in { label Bk xywh {344 66 16 16} box DIAMOND_DOWN_BOX align 8 } Fl_Box box_WK_busy { label Busy xywh {419 66 16 16} box DIAMOND_DOWN_BOX align 8 } Fl_Box box_WK_xoff { label Bfr xywh {494 66 16 16} box DIAMOND_DOWN_BOX align 8 } Fl_Box box_WK_keydown { label Key xywh {570 66 16 16} box DIAMOND_DOWN_BOX align 8 } Fl_Group choice_WK_keyer_mode { label {Keyer Mode} callback {WK_change_choice_keyer_mode();} open xywh {237 104 90 22} box BORDER_BOX color 55 code0 {\#include "combo.h"} class Fl_ComboBox } {} Fl_Group choice_WK_hang { label Hang callback {WK_change_choice_hang();} open xywh {383 104 90 22} box BORDER_BOX color 55 class Fl_ComboBox } {} Fl_Group choice_WK_sidetone { label Sidetone callback {WK_change_choice_sidetone();} open xywh {530 104 90 22} box BORDER_BOX color 55 class Fl_ComboBox } {} Fl_Group choice_WK_output_pins { label {Output PIns} callback {WK_change_choice_output_pins();} open xywh {677 104 90 22} box BORDER_BOX color 55 class Fl_ComboBox } {} Fl_Check_Button btn_WK_use_pot { label {Use Pot} callback {WK_use_pot_changed();} tooltip {Winkeyer pot controls WPM} xywh {623 64 20 16} down_box DOWN_BOX align 8 when 1 } Fl_Output txt_WK_wpm { tooltip {WPM setting} xywh {710 61 50 24} } Fl_Group {} { label ModeReg open xywh {210 132 134 184} box ENGRAVED_FRAME align 17 } { Fl_Check_Button btn_WK_swap { label Swap callback {WK_change_btn_swap();} tooltip {Swap left/right keyer contacts} xywh {220 174 70 15} down_box DOWN_BOX } Fl_Check_Button btn_WK_auto_space { label {Auto Space} callback {WK_change_btn_auto_space();} tooltip {Enable paddle auto spacing of characters} xywh {220 204 70 15} down_box DOWN_BOX } Fl_Check_Button btn_WK_ct_space { label {CT space} callback {WK_change_btn_ct_space();} tooltip {Enable contest character spacing} xywh {220 234 70 15} down_box DOWN_BOX } Fl_Check_Button btn_WK_paddledog { label {Paddle Dog} callback {WK_change_btn_paddledog();} xywh {220 264 70 15} down_box DOWN_BOX } Fl_Check_Button btn_WK_cut_zeronine { label {Cut 0/9} callback {WK_change_btn_cut_zeronine();} tooltip {Use T/N for 0/9} xywh {220 294 70 15} down_box DOWN_BOX } } Fl_Group {} { label ModeReg open xywh {367 132 134 184} box ENGRAVED_FRAME align 17 } { Fl_Check_Button btn_WK_paddle_echo { label {Paddle echo} callback {WK_change_btn_paddle_echo();} tooltip {Echo paddle chars to Rx Panel} xywh {373 174 70 16} down_box DOWN_BOX } Fl_Check_Button btn_WK_serial_echo { label {Serial echo} callback {WK_change_btn_serial_echo();} xywh {373 204 70 16} down_box DOWN_BOX value 1 } Fl_Check_Button btn_WK_sidetone_on { label {Tone Keyer} callback {WK_change_btn_sidetone_on();} tooltip {Enable Winkeyer tone keying} xywh {373 234 103 16} down_box DOWN_BOX } Fl_Check_Button btn_WK_tone_on { label {Tone ON} callback {WK_change_btn_tone_on();} tooltip {Enable Winkeyer audio tone} xywh {373 264 87 16} down_box DOWN_BOX } Fl_Check_Button btn_WK_ptt_on { label {PTT ON} callback {WK_change_btn_ptt_on();} tooltip {Enable Winkeyer PTT output} xywh {373 294 87 16} down_box DOWN_BOX } } Fl_Group {} { label {WPM Settings} open xywh {510 132 112 209} box ENGRAVED_FRAME align 17 } { Fl_Counter cntr_WK_min_wpm { label {Min WPM} callback {WK_change_cntr_min_wpm(); if ((o->value() + cntr_WK_rng_wpm->value()) > 55) cntr_WK_rng_wpm->value(55 - o->value());} tooltip {Minimum WPM setting default = 10} xywh {531 172 64 22} type Simple minimum 10 maximum 30 step 1 value 10 } Fl_Counter cntr_WK_rng_wpm { label {Rng WPM} callback {WK_change_cntr_rng_wpm(); if ((cntr_WK_min_wpm->value() + o->value()) > 55) o->value(55 - cntr_WK_min_wpm->value());} tooltip {Range WPM setting default = 25} xywh {531 215 64 21} type Simple } Fl_Counter cntr_WK_farnsworth { label Farsnworth callback {WK_change_cntr_farnsworth();} tooltip {Farnsworth keying (0 = none) default = 0} xywh {531 257 64 22} type Simple } Fl_Counter cntr_WK_cmd_wpm { label {Cmd WPM} callback {WK_change_cntr_cmd_wpm();} tooltip {WPM speed for Winkeyer Command strings default = 18} xywh {531 300 64 22} type Simple } } Fl_Group {} { label {Timing/Settings} open xywh {630 132 160 209} box ENGRAVED_FRAME align 17 } { Fl_Counter cntr_WK_ratio { label Ratio callback {WK_change_cntr_ratio();} tooltip {Keying ratio default = 3.0} xywh {642 172 64 22} type Simple } Fl_Counter cntr_WK_comp { label Comp callback {WK_change_cntr_comp();} tooltip {Compensation in msec default = 0} xywh {642 215 64 21} type Simple } Fl_Counter cntr_WK_first_ext { label {1st Ext} callback {WK_change_cntr_first_ext();} tooltip {Extra duration to first dit/dot in msec default = 0} xywh {642 257 64 22} type Simple } Fl_Counter cntr_WK_sample { label Sample callback {WK_change_cntr_sample();} tooltip {Paddle sampling (see Winkeyer manual) default = 50} xywh {642 300 64 22} type Simple } Fl_Counter cntr_WK_weight { label Weight callback {WK_change_cntr_weight();} tooltip {Keying weight default = 50} xywh {713 172 64 22} type Simple } Fl_Counter cntr_WK_leadin { label Leadin callback {WK_change_cntr_leadin();} tooltip {Leadin in msec default = 0} xywh {713 215 64 21} type Simple } Fl_Counter cntr_WK_tail { label Tail callback {WK_change_cntr_tail();} tooltip {Extend last dit/dot in msec default = 0} xywh {713 257 64 22} type Simple } } Fl_Group {} {open xywh {210 317 291 25} box ENGRAVED_FRAME } { Fl_Check_Button btnK3NG { label {K3NG Arduino sketch emulation} callback {progdefaults.WK_K3NGsketch = o->value(); progdefaults.changed = true;} tooltip {Activate for Mortty K3NG sketch} xywh {220 324 223 15} down_box DOWN_BOX code0 {o->value(progdefaults.WK_K3NGsketch);} } } } Fl_Group {} { label {Modem/CW/nanoIO} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/nanoIO"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/nanoIO"));} } { Fl_Group select_nanoCW_CommPort { label {Ser. Port} callback {progdefaults.nanoIO_serial_port_name = o->value();} open tooltip {nanoIO serial port} xywh {270 21 435 23} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {\#include "nanoIO.h"} code2 {o->value(progdefaults.nanoIO_serial_port_name.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_nanoCW_connect { label Connect callback {if (o->value()) { if (open_nanoCW()) { btn_nanoIO_connect->value(1); chk_nanoIO_CW_io->value(1); } else { o->value(0); btn_nanoIO_connect->value(0); chk_nanoIO_CW_io->value(0); chk_nanoIO_FSK_io->value(0); } } else { close_nanoIO(); o->value(0); btn_nanoIO_connect->value(0); chk_nanoIO_FSK_io->value(0); chk_nanoIO_CW_io->value(0); }} tooltip {Connect / Disconnect from nanoIO} xywh {711 21 80 22} } Fl_Counter cntr_nanoCW_paddle_WPM { label Paddle callback {progdefaults.CW_keyspeed = (int)o->value(); set_nano_keyerWPM(progdefaults.CW_keyspeed); progdefaults.changed = true;} tooltip {CW wpm using paddle keyer} xywh {260 48 110 22} align 4 minimum 5 maximum 100 step 1 value 20 code0 {o->value(progdefaults.CW_keyspeed);} code1 {o->lstep(5);} } Fl_Text_Display txt_nano_CW_io { xywh {204 155 590 189} align 25 code0 {\#include "FTextRXTX.h"} code1 {o->setFont(progdefaults.RxFontnbr);} code2 {o->setFontSize(12);} class FTextView } Fl_Counter cntr_nanoCW_WPM { label {Comp'} callback {progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); sldrCWxmtWPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters();} tooltip {CW wpm keyboard strings} xywh {260 74 110 22} align 4 minimum 5 maximum 100 step 1 value 20 code0 {o->value(progdefaults.CWspeed);} code1 {o->lstep(5);} } Fl_Counter cnt_nanoCWdash2dot { label {Dash/Dot} callback {progdefaults.CWdash2dot=o->value(); cntCWdash2dot->value(progdefaults.CWdash2dot); progdefaults.changed = true;} tooltip {Dash to dot ratio} xywh {292 100 78 22} type Simple align 4 minimum 2.5 maximum 3.5 value 3 code0 {o->value(progdefaults.CWdash2dot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group listbox_nanoIO_serbaud { label Baud callback {progdefaults.nanoIO_serbaud = o->index(); listbox_nanoIO_serbaud2->index(o->index()); progdefaults.changed = true;} open xywh {594 47 110 24} box DOWN_BOX color 7 align 4 code0 {o->add("1200|4800|9600|19200|38400|57600|115200");} code1 {o->index(progdefaults.nanoIO_serbaud);} class Fl_ListBox } {} Fl_Group listbox_nano_keyer { label Keyer callback {progdefaults.nanoIO_CW_keyer = o->index(); set_nanoIO_keyer(o->index()); progdefaults.changed = true;} open xywh {595 73 110 24} box DOWN_BOX color 7 align 4 code0 {o->add("Iambic-A|Iambic-B|Straight");} code1 {o->index(progdefaults.nanoIO_CW_keyer);} class Fl_ListBox } {} Fl_Group listbox_incr { label {Incr'} callback {progdefaults.nanoIO_CW_incr = o->index() + '1'; set_nanoIO_incr(); progdefaults.changed = true;} open xywh {645 99 60 24} box DOWN_BOX color 7 align 4 code0 {o->add("1|2|3|4|5");} code1 {o->index(progdefaults.nanoIO_CW_incr - '1');} class Fl_ListBox } {} Fl_Button btn_cwfsk_save { label Save callback {nano_CW_save();} tooltip {Write state of nanoIO to Arduino EEPROM} xywh {711 74 80 22} } Fl_Button btn_cwfsk_query { label Status callback {nano_CW_query();} tooltip {Query state of nanoIO} xywh {711 100 80 22} } Fl_Group {} {open xywh {375 45 154 80} box FLAT_BOX } { Fl_Check_Button btn_nanoIO_pot { label {Use WPM pot'} callback {progdefaults.nanoIO_speed_pot=o->value(); progdefaults.changed=true; nanoIO_use_pot();} tooltip {WPM pot update to nanoIO required} xywh {502 48 21 22} down_box DOWN_BOX align 4 code0 {o->value(progdefaults.nanoIO_speed_pot);} } Fl_Counter cntr_nanoIO_min_wpm { label {Min WPM} callback {if ((o->value() + cntr_nanoIO_rng_wpm->value()) > 100) cntr_nanoIO_rng_wpm->value(100 - o->value()); set_nanoIO_min_max();} tooltip {Minimum WPM setting default = 10} xywh {447 74 75 22} type Simple align 4 minimum 10 maximum 30 step 1 value 10 } Fl_Counter cntr_nanoIO_rng_wpm { label {Rng WPM} callback {if ((cntr_nanoIO_min_wpm->value() + o->value()) > 100) o->value(100 - cntr_nanoIO_min_wpm->value()); set_nanoIO_min_max();} tooltip {Range WPM setting default = 20} xywh {447 100 75 22} type Simple align 4 minimum 10 maximum 40 step 1 value 20 } } Fl_Check_Button btn_disable_CW_PTT { label {PTT off} callback {progdefaults.disable_CW_PTT=o->value(); progdefaults.changed=true; nanoIO_set_cw_ptt();} tooltip {Disable PTT} xywh {531 99 70 24} down_box DOWN_BOX code0 {o->value(progdefaults.disable_CW_PTT);} } Fl_Group {} { label {Comp'} open xywh {204 125 590 30} box ENGRAVED_BOX align 20 } { Fl_Counter cntrWPMtest { label WPM callback {progdefaults.nanoCW_test_wpm = o->value(); progdefaults.changed=true;} xywh {302 129 78 22} type Simple align 4 minimum 5 maximum 50 step 1 value 30 code0 {o->value(progdefaults.nanoCW_test_wpm);} } Fl_Button btn_cal_variable { label {Test =>} callback {nanoIO_wpm_cal();} tooltip {Send "paris " WPM times} xywh {384 129 70 22} } Fl_Value_Input corr_var_wpm { label {secs' =>} tooltip {Test duration (60 seconds)} xywh {458 129 70 22} color 255 align 8 } Fl_Value_Input usec_correc { label {Comp'} tooltip {Compensationin microseconds} xywh {645 129 60 22} color 255 code0 {o->value(progdefaults.usec_correc);} } Fl_Button btn_correction { label Adjust callback {nanoIO_correction();} tooltip {send compensation to nanoIO} xywh {711 129 80 22} } } Fl_Check_Button chk_nanoIO_CW_io { label {CW i/o} callback {if (o->value() == 0) { o->value(1); return; } set_nanoCW(); chk_nanoIO_FSK_io->value(0);} tooltip {Enable CW operation} xywh {711 47 70 24} down_box DOWN_BOX } } Fl_Group {} { label {Modem/CW/DTR-RTS keying} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/DTR-RTS keying"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/DTR-RTS keying"));} } { Fl_Group {} {open xywh {205 25 590 79} box ENGRAVED_BOX } { Fl_Box {} { label {DTR/RTS keying may be assigned to flrig, share the RigCat serial port, share the Separate PTT serial port, or be assigned to separate serial port. No settings for baud, stops bits, etc are needed.} xywh {208 27 580 72} align 20 } } Fl_Group {} {open xywh {205 107 590 40} box ENGRAVED_FRAME } { Fl_Check_Button btn_CW_KEYLINE_flrig { label {Use flrig DTR/RTS keying} callback {int val = o->value(); progdefaults.use_FLRIGkeying = val; if (val) { progdefaults.CW_KEYLINE_on_cat_port = 0; progdefaults.CW_KEYLINE_on_ptt_port = 0; btn_CW_KEYLINE_catport->value(0); btn_CW_KEYLINE_shared_PTT->value(0); } progdefaults.CW_KEYLINE_changed = true;} xywh {215 120 23 15} down_box DOWN_BOX align 8 code0 {o->value(progdefaults.use_FLRIGkeying);} } Fl_Check_Button btn_FLRIG_CW_disable_ptt { label {Disable flrig CW PTT} callback {progdefaults.CATkeying_disable_ptt = o->value(); btn_CAT_CW_disable_ptt->value(o->value()); progdefaults.changed = true;} tooltip {Required for some transceivers e.g. TS-480} xywh {475 120 70 14} down_box DOWN_BOX code0 {o->value(progdefaults.CATkeying_disable_ptt);} } } Fl_Group {} {open xywh {205 151 590 195} box ENGRAVED_FRAME } { Fl_Check_Button btn_CW_KEYLINE_catport { label {Share RIGCAT port} callback {int val = o->value(); progdefaults.CW_KEYLINE_on_cat_port = val; if (val) { progdefaults.CW_KEYLINE_on_ptt_port = 0; progdefaults.use_FLRIGkeying = 0; btn_CW_KEYLINE_shared_PTT->value(0); btn_CW_KEYLINE_flrig->value(0); } progdefaults.CW_KEYLINE_changed = true;} xywh {215 167 23 15} down_box DOWN_BOX align 8 code0 {o->value(progdefaults.CW_KEYLINE_on_cat_port);} } Fl_Check_Button btn_CW_KEYLINE_shared_PTT { label {Share Separate PTT port} callback {int val = o->value(); progdefaults.CW_KEYLINE_on_ptt_port = val; if (val) { progdefaults.CW_KEYLINE_on_cat_port = 0; progdefaults.use_FLRIGkeying = 0; btn_CW_KEYLINE_catport->value(0); btn_CW_KEYLINE_flrig->value(0); } progdefaults.CW_KEYLINE_changed = true;} xywh {215 199 23 15} down_box DOWN_BOX align 8 code0 {o->value(progdefaults.CW_KEYLINE_on_ptt_port);} } Fl_Group listbox_CW_KEYLINE { label {CW Keyline} callback {progdefaults.CW_KEYLINE = o->index();} open xywh {454 162 90 24} box DOWN_BOX color 7 align 8 code0 {o->add("None|RTS|DTR");} code1 {o->index(progdefaults.CW_KEYLINE);} class Fl_ListBox } {} Fl_Counter cntCWkeycomp { label {Keying compensation (msec)} callback {progdefaults.CWkeycomp =o->value(); progdefaults.changed = true;} tooltip {Dot / Space timing increment} xywh {454 194 125 24} align 8 minimum -10 maximum 10 step 0.01 code0 {o->value(progdefaults.CWkeycomp);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(1.0);} class Fl_Counter2 } Fl_Group listbox_PTT_KEYLINE { label {PTT keyline} callback {progdefaults.PTT_KEYLINE = o->index(); progdefaults.changed = true;} open xywh {693 162 90 24} box DOWN_BOX color 7 align 4 hide code0 {o->add("None|RTS|DTR");} code1 {o->index(0);//progdefaults.PTT_KEYLINE);} class Fl_ListBox } {} Fl_Group select_CW_KEYLINE_CommPort { label {Use Separate Keying Serial Port} callback {progdefaults.CW_KEYLINE_serial_port_name = o->value(); if (progStatus.useCW_KEYLINE) { close_CW_KEYLINE(); if (!open_CW_KEYLINE()) { btn_CW_KEYLINE_connect->value(0); progStatus.useCW_KEYLINE = 0; } progStatus.useCW_KEYLINE = 1; } progdefaults.CW_KEYLINE_changed = true;} open tooltip {nanoIO serial port} xywh {215 241 470 24} box DOWN_BOX color 55 align 5 code0 {\#include "combo.h"} code1 {\#include "nanoIO.h"} code2 {o->value(progdefaults.CW_KEYLINE_serial_port_name.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_CW_KEYLINE_connect { label Connect callback {if (o->value()) { if (!open_CW_KEYLINE()) o->value(0); else { progStatus.useCW_KEYLINE = 1; btn_use_ELCTkeying->value(0); btn_use_KNWDkeying->value(0); btn_use_ICOMkeying->value(0); btn_use_YAESUkeying->value(0); progdefaults.use_ELCTkeying = 0; progdefaults.use_ICOMkeying = 0; progdefaults.use_KNWDkeying = 0; progdefaults.use_YAESUkeying = 0; } } else { close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; }} tooltip {Connect / Disconnect from nanoIO} xywh {698 241 90 24} code0 {o->value(progStatus.useCW_KEYLINE);} } Fl_Light_Button btn_cw_dtr_calibrate { label {Speed test} callback {calibrate_cwio();} tooltip {1 minute 'PARIS '} xywh {215 305 100 24} selection_color 6 } Fl_Output cwio_test_result { label Result xywh {376 305 300 24} } } } Fl_Group {} { label {Modem/CW/CAT Keying} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/CAT keying"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/CAT keying"));} } { Fl_Box {} { label {CW keying using CAT command strings. Available for supported transceivers. Use with RigCAT or flrig transceiver control. A separate serial port is NOT needed. Disable CAT PTT if transceiver interprets that as a keydown command (e.g. TS480). Recommend setting transceiver to either semi or full break-in. Enter correct CIV address for Icom transceivers.} xywh {213 23 575 140} box THIN_DOWN_BOX color 54 selection_color 54 labelsize 13 align 20 } Fl_Check_Button btn_use_ICOMkeying { label Icom callback {progdefaults.use_ICOMkeying = o->value(); if (o->value()) { btn_use_ELCTkeying->value(0); btn_use_KNWDkeying->value(0); btn_use_YAESUkeying->value(0); progdefaults.use_ELCTkeying = 0; progdefaults.use_KNWDkeying = 0; progdefaults.use_YAESUkeying = 0; close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; btn_cw_dtr_calibrate->value(0); } progdefaults.changed=true;} xywh {273 192 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.use_ICOMkeying);} } Fl_Input val_ICOMcivaddr { label {Hex CIV addr} callback {progdefaults.ICOMcivaddr=o->value(); progdefaults.changed=true;} tooltip {Enter transceiver HEX CIV address} xywh {343 188 58 22} align 8 code0 {o->value(progdefaults.ICOMcivaddr.c_str());} } Fl_Check_Button btn_use_ELCTkeying { label Elecraft callback {progdefaults.use_ELCTkeying = o->value(); if (o->value()) { btn_use_YAESUkeying->value(0); btn_use_ICOMkeying->value(0); btn_use_KNWDkeying->value(0); progdefaults.use_YAESUkeying = 0; progdefaults.use_ICOMkeying = 0; progdefaults.use_KNWDkeying = 0; close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; btn_cw_dtr_calibrate->value(0); } progdefaults.changed=true;} xywh {273 216 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.use_ELCTkeying);} } Fl_Check_Button btn_use_KNWDkeying { label Kenwood callback {progdefaults.use_KNWDkeying = o->value(); if (o->value()) { btn_use_YAESUkeying->value(0); btn_use_ICOMkeying->value(0); btn_use_ELCTkeying->value(0); progdefaults.use_YAESUkeying = 0; progdefaults.use_ICOMkeying = 0; progdefaults.use_ELCTkeying = 0; close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; btn_cw_dtr_calibrate->value(0); } progdefaults.changed=true;} xywh {455 216 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.use_KNWDkeying);} } Fl_Check_Button btn_use_YAESUkeying { label Yaesu callback {progdefaults.use_YAESUkeying = o->value(); if (o->value()) { btn_use_ELCTkeying->value(0); btn_use_KNWDkeying->value(0); btn_use_ICOMkeying->value(0); progdefaults.use_ELCTkeying = 0; progdefaults.use_KNWDkeying = 0; progdefaults.use_ICOMkeying = 0; close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; btn_cw_dtr_calibrate->value(0); } progdefaults.changed=true;} xywh {637 216 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.use_YAESUkeying);} } Fl_Check_Button btn_CAT_CW_disable_ptt { label {Disable CAT PTT} callback {progdefaults.CATkeying_disable_ptt = o->value(); btn_FLRIG_CW_disable_ptt->value(o->value()); progdefaults.changed = true;} tooltip {Required for some transceivers e.g. TS-480} xywh {273 240 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.CATkeying_disable_ptt);} } } Fl_Group {} { label {CW CAT & WinKeyer Compensation} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/CAT comp'"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/CW/CAT comp'"));} } { Fl_Box {} { label {Compute timing compensation for CAT CW and WinKeyer CW. Computation at current WPM . Set WPM to nominal (suggest 20 WPM). Compensation will be good over a +/- 10 WPM range. Calibration/Test is 1 minute of 'PARIS '.} xywh {210 33 575 118} box ENGRAVED_BOX color 53 labelsize 13 align 20 } Fl_Button btn_CAT_keying_calibrate { label Calibrate callback {CAT_keying_calibrate();} tooltip {Send WPM 'PARIS ' words} xywh {245 184 80 22} code0 {extern void CAT_keying_calibrate();} } Fl_Value_Input out_CATkeying_compensation { label {Compensate (secs)} callback {progdefaults.CATkeying_compensation = o->value() * 1000; progdefaults.changed=true;} xywh {329 184 50 22} align 8 maximum 10 step 0.01 code0 {o->value(progdefaults.CATkeying_compensation / 1000.0);} } Fl_Button btn_CAT_keying_clear { label Clear callback {progdefaults.CATkeying_compensation = 0; out_CATkeying_compensation->value(0); out_CATkeying_test_result->value(0);} tooltip {Clear compensation} xywh {525 184 50 22} } Fl_Button btn_CAT_keying_test { label Test callback {CAT_keying_test();} tooltip {Send WPM 'PARIS ' words} xywh {589 184 50 22} code0 {extern void CAT_keying_test();} } Fl_Value_Input out_CATkeying_test_result { label secs xywh {645 184 50 22} align 8 maximum 10 step 0.01 code0 {o->value(0);} } } Fl_Group {} { label {Modem/DominoEX} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/DominoEX"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/DominoEX"));} } { Fl_Input txtSecondary { label {Secondary Text} callback {progdefaults.secText = o->value(); progdefaults.changed = true;} tooltip {Text to send during keyboard idle times} xywh {310 88 360 40} type Multiline align 5 when 1 code0 {txtSecondary->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button valDominoEX_FILTER { label Filtering callback {progdefaults.DOMINOEX_FILTER = o->value(); resetDOMEX(); progdefaults.changed = true;} tooltip {Use DSP filter before decoder} xywh {310 142 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.DOMINOEX_FILTER);} } Fl_Counter valDominoEX_BW { label {Filter bandwidth factor} callback {progdefaults.DOMINOEX_BW = o->value(); resetDOMEX(); progdefaults.changed = true;} tooltip {Filter bandwidth relative to signal width} xywh {451 142 63 20} type Simple align 8 minimum 1 maximum 2 value 1.5 code0 {o->value(progdefaults.DOMINOEX_BW);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button chkDominoEX_FEC { label FEC callback {progdefaults.DOMINOEX_FEC = o->value(); progdefaults.changed = true;} tooltip {Enable MultiPSK-compatible FEC} xywh {310 172 51 20} down_box DOWN_BOX code0 {o->value(progdefaults.DOMINOEX_FEC);} } Fl_Value_Slider valDomCWI { label {CWI threshold} callback {progdefaults.DomCWI = o->value(); progdefaults.changed = true;} tooltip {CWI detection and suppression} xywh {310 208 260 20} type Horizontal align 1 textsize 14 code0 {o->value(progdefaults.DomCWI);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Counter valDominoEX_PATHS { label {Paths (hidden)} callback {progdefaults.DOMINOEX_PATHS = (int)o->value(); progdefaults.changed = true;} xywh {634 195 63 20} type Simple minimum 4 maximum 8 step 1 value 5 code0 {o->value(progdefaults.DOMINOEX_PATHS);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->hide();} class Fl_Counter2 } } Fl_Group {} { label {Modem/Feld Hell} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Feld Hell"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/Feld Hell"));} } { Fl_Group {} { label {Hell Transmit Parameters} open xywh {247 31 500 133} box ENGRAVED_FRAME align 17 } { Fl_Group listboxHellFont { label {Transmit font} callback {progdefaults.feldfontnbr=o->index(); progdefaults.changed = true;} open tooltip {Select TX raster font} xywh {262 56 225 22} box DOWN_BOX color 7 align 8 code0 {\#include "fontdef.h"} code1 {o->add(szFeldFonts);} code2 {o->index(progdefaults.feldfontnbr); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group listboxHellPulse { label {Pulse shape} callback {progdefaults.HellPulseFast = o->index(); progdefaults.changed = true;} open tooltip {Raised cosine pulse shape factor} xywh {262 104 150 22} box DOWN_BOX color 7 align 5 code0 {o->add(_("Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying"));} code2 {o->index(progdefaults.HellPulseFast); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnFeldHellIdle { label {Transmit periods (.) when idle} callback {progdefaults.HellXmtIdle=o->value(); progdefaults.changed = true;} tooltip {Transmits a diddle dot when no keyboard activity} xywh {262 139 230 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.HellXmtIdle);} } Fl_Value_Slider valHellXmtWidth { label {Tx Width Multiplier} callback {progdefaults.HellXmtWidth=(int)o->value(); progdefaults.changed = true;} tooltip {Range 1...3} xywh {443 104 150 22} type {Horz Knob} color 54 align 8 minimum 1 maximum 3 step 1 value 1 textsize 14 code0 {o->value(progdefaults.HellXmtWidth);} } } Fl_Group {} { label {Hell Receive Parameters} open xywh {247 167 500 173} box ENGRAVED_FRAME align 17 } { Fl_Check_Button btnBlackboard { label {Reverse video} callback {progdefaults.HellBlackboard=o->value(); FHdisp->reverse(progdefaults.HellBlackboard); progdefaults.changed = true;} tooltip {Display RX in reverse video} xywh {262 191 125 20} down_box DOWN_BOX code0 {o->value(progdefaults.HellBlackboard);} } Fl_Check_Button btnHellMarquee { label {Marquee text} callback {progdefaults.HellMarquee=o->value(); FHdisp->set_marquee(progdefaults.HellMarquee); progdefaults.changed = true;} tooltip {Display RX as a scrolling marquee} xywh {447 191 125 20} down_box DOWN_BOX code0 {o->value(progdefaults.HellMarquee);} } Fl_Value_Slider valHellRcvWidth { label {Rx Width Multiplier} callback {progdefaults.HellRcvWidth=(int)o->value(); progdefaults.changed = true;} tooltip {Range 1...4} xywh {262 227 120 22} type {Horz Knob} color 54 align 8 minimum 1 maximum 4 step 1 value 1 textsize 14 code0 {o->value(progdefaults.HellRcvWidth);} } Fl_Value_Slider valHellRcvHeight { label {Rx Height in pixels} callback {FHdisp_char_height();} tooltip {May require resizing the Rx/Tx panel} xywh {262 266 250 22} type {Horz Knob} color 54 align 8 minimum 14 maximum 42 step 2 value 20 textsize 14 code0 {o->value(progdefaults.HellRcvHeight);} } Fl_Value_Slider sldrHellBW { label {Receive filter bandwidth} callback {progdefaults.HELL_BW = sldrHellBW->value();} tooltip {Adjust the DSP bandwidth} xywh {262 305 250 22} type Horizontal color 54 align 8 minimum 10 maximum 2400 step 5 value 400 textsize 14 code0 {o->value(progdefaults.HELL_BW);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Value_Slider val_hellagc { label {Rx AGC} callback {progdefaults.hellagc=(int)o->value(); progdefaults.changed = true;} tooltip {1 - Slow, 2 - Medium, 3 - Fast} xywh {527 227 120 22} type {Horz Knob} color 54 align 8 minimum 1 maximum 3 step 1 value 2 textsize 14 code0 {o->value(progdefaults.hellagc);} } } } Fl_Group {} { label {Modem/FMT} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {\#include "fmt_dialog.h"} code1 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/FMT"));} code2 {config_pages.push_back(p);} code3 {tab_tree->add(_("Modem/FMT"));} } { Fl_Group {} { label {Audio Stream Procesing} xywh {203 24 412 75} box ENGRAVED_FRAME align 21 } { Fl_Group listbox_fmt_sr { label {Sample rate} callback {progdefaults.FMT_sr=o->index(); progdefaults.changed = true;} open tooltip {FMT sample rate} xywh {276 66 100 22} box DOWN_BOX color 7 code1 {o->add("8000|11025|12000|16000|22050|24000|44100|48000");} code2 {o->index(progdefaults.FMT_sr);} class Fl_ListBox } {} Fl_Counter cnt_fmt_rx_ppm { label {Rx Codec PPM} callback {progdefaults.RX_corr = (int)o->value(); cntRxRateCorr->value(progdefaults.RX_corr); progdefaults.changed = true;} tooltip {Audio Codec ppm correction} xywh {419 66 120 22} align 1 minimum -500 maximum 500 step 1 code0 {o->value(progdefaults.RX_corr);} code1 {o->lstep(10);} } } Fl_Group {} { label Tracking open xywh {203 99 412 90} box ENGRAVED_FRAME align 21 } { Fl_Button btnFMT_plot_background { label Bgnd callback {static uchar r, g, b; Fl::get_color(progdefaults.FMT_background, r, g, b); if (!fl_color_chooser("FMT Background", r, g, b)) return; progdefaults.FMT_background = fl_rgb_color(r,g,b); fmt_plot->bk_color(progdefaults.FMT_background); fmt_plot->redraw(); progdefaults.changed = true;} tooltip {Change plot background color} xywh {209 122 60 22} } Fl_Button btnFMT_unk_color { label Unkn callback {static uchar r, g, b; Fl::get_color(progdefaults.FMT_unk_color, r, g, b); if (!fl_color_chooser("FMT Background", r, g, b)) return; progdefaults.FMT_unk_color = fl_rgb_color(r,g,b); fmt_plot->line_color_1(progdefaults.FMT_unk_color); fmt_plot->redraw(); unk_color->color(progdefaults.FMT_unk_color); unk_color->redraw(); progdefaults.changed = true;} tooltip {Change plot unknown track color} xywh {209 153 60 22} } Fl_Button btnFMT_plot_ref_color { label Ref callback {static uchar r, g, b; Fl::get_color(progdefaults.FMT_ref_color, r, g, b); if (!fl_color_chooser("FMT Background", r, g, b)) return; progdefaults.FMT_ref_color = fl_rgb_color(r,g,b); fmt_plot->line_color_2(progdefaults.FMT_ref_color); fmt_plot->redraw(); ref_color->color(progdefaults.FMT_ref_color); ref_color->redraw(); progdefaults.changed = true;} tooltip {Change plot reference track color} xywh {274 153 60 22} } Fl_Button btnFMT_plot_axis { label Axis callback {static uchar r, g, b; Fl::get_color(progdefaults.FMT_axis_color, r, g, b); if (!fl_color_chooser("FMT Axis Color", r, g, b)) return; progdefaults.FMT_axis_color = fl_rgb_color(r,g,b); fmt_plot->axis_color(progdefaults.FMT_axis_color); fmt_plot->redraw(); progdefaults.changed = true;} tooltip {Change Axis' color} xywh {274 122 60 22} } Fl_Button btnFMT_legend_color { label Lgnd callback {static uchar r, g, b; Fl::get_color(progdefaults.FMT_legend_color, r, g, b); if (!fl_color_chooser("FMT Legend Color", r, g, b)) return; progdefaults.FMT_legend_color = fl_rgb_color(r,g,b); fmt_plot->legend_color(progdefaults.FMT_legend_color); fmt_plot->redraw(); progdefaults.changed = true;} tooltip {Change legend color} xywh {339 107 60 22} } Fl_Check_Button btn_fmt_plot_over_axis { label {Line/Axis} callback {progdefaults.FMT_plot_over_axis = o->value(); fmt_plot->plot_over_axis(progdefaults.FMT_plot_over_axis); progdefaults.changed = true;} tooltip {Enable to always plot data over axis} xywh {341 135 31 18} down_box DOWN_BOX code0 {o->value(progdefaults.FMT_plot_over_axis);} } Fl_Check_Button btn_fmt_thick_lines { label {Thick lines} callback {progdefaults.FMT_thick_lines = o->value(); fmt_plot->thick_lines(progdefaults.FMT_thick_lines); progdefaults.changed = true;} tooltip {Enable to plot track lines 3 pixels wide} xywh {341 160 31 18} down_box DOWN_BOX code0 {o->value(progdefaults.FMT_thick_lines);} } Fl_Counter cnt_fmt_freq_corr { label {Freq Correction} callback {progdefaults.FMT_freq_corr=o->value(); progdefaults.RIT=progdefaults.FMT_freq_corr; cntRIT->value(progdefaults.RIT); progdefaults.changed = true;} tooltip {Offset plot lines on vertical scale} xywh {465 118 123 24} align 1 minimum -5 maximum 5 step 0.001 code0 {o->value(progdefaults.FMT_freq_corr);} code1 {o->lstep(0.01);} } Fl_Button bnt_FMT_dec_corr { label {@|<} callback {progdefaults.FMT_freq_corr -= 0.1; cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr); progdefaults.RIT=progdefaults.FMT_freq_corr; cntRIT->value(progdefaults.RIT); progdefaults.changed = true;} xywh {446 119 19 24} labelsize 10 } Fl_Button btn_FMT_incr_corr { label {@>|} callback {progdefaults.FMT_freq_corr += 0.1; cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr); progdefaults.RIT=progdefaults.FMT_freq_corr; cntRIT->value(progdefaults.RIT); progdefaults.changed = true;} xywh {588 119 18 24} labelsize 10 } Fl_Counter cnt_fmt_freq_err { label {Max Error} callback {progdefaults.FMT_freq_err=o->value(); progdefaults.changed = true;} tooltip {Limit freq estimate error to this value} xywh {470 160 123 24} align 1 minimum 0.5 maximum 10 value 2 code0 {o->value(progdefaults.FMT_freq_err);} code1 {o->lstep(1.0);} } } Fl_Group {} { label {DFT Estimator} open xywh {203 190 207 86} box ENGRAVED_FRAME align 21 } { Fl_Counter cnt_FMT_movavg_len { label {Data Filter} callback {progdefaults.FMT_movavg_len = o->value(); progdefaults.changed = true;} tooltip {Moving average - average over NN seconds^0 - no averaging} xywh {214 232 110 24} align 1 minimum 0 maximum 10 value 1 code0 {o->value(progdefaults.FMT_movavg_len);} code1 {o->lstep(1.0);} } Fl_Group listbox_fmt_dft_rate { label {DFT rate} callback {progdefaults.FMT_dft_rate=o->index(); progdefaults.changed = true;} open tooltip {\# DFT computations / second} xywh {334 232 60 24} box DOWN_BOX color 7 code1 {o->add("1|2|3|4|5|6|7|8");} code2 {o->index(progdefaults.FMT_dft_rate);} class Fl_ListBox } {} } Fl_Group {} { label {FIR Filter} open xywh {411 190 205 86} box ENGRAVED_BOX align 21 } { Fl_Counter cnt_FMT_bpf { label Width callback {progdefaults.FMT_bpf_width = o->value(); progdefaults.changed = true;} tooltip {Band pass filter / unknown / reference} xywh {457 218 100 24} align 1 minimum 5 maximum 200 step 5 value 100 code0 {o->value(progdefaults.FMT_bpf_width);} code1 {o->lstep(50.0);} } Fl_Check_Button btn_fmt_unk_bpf_on { label {bpf Unk'} callback {progdefaults.FMT_unk_bpf_on = o->value(); progdefaults.changed = true;} tooltip {ON - band pass filter unknown signal} xywh {429 246 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.FMT_unk_bpf_on);} } Fl_Check_Button btn_fmt_ref_bpf_on { label {bpf Ref'} callback {progdefaults.FMT_ref_bpf_on = o->value(); progdefaults.changed = true;} tooltip {ON - band pass filter reference signal} xywh {526 246 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.FMT_ref_bpf_on);} } } Fl_Group {} { label {CSV Data Recording} open xywh {617 190 178 86} box ENGRAVED_BOX align 21 } { Fl_Check_Button btn_fmt_autorecord { label {Auto record} tooltip {Automatically start csv data file recording with wav playback} xywh {658 246 107 18} down_box DOWN_BOX } Fl_Counter cnt_fmt_auto_record_time { tooltip {Record data for NN minutes after auto start} xywh {672 218 66 24} type Simple align 17 minimum 2 maximum 60 step 2 value 2 } } Fl_Group {} { label {Wav file recording} xywh {203 277 592 66} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_fmt_record_wav { label {Record Audio} callback {cb_fmt_record_wav(o->value()); if (o->value() == 1) btn_fmt_sync_wav->deactivate(); else btn_fmt_sync_wav->activate();} tooltip {Wav file recording - START IMMEDIATELY} xywh {464 288 118 18} down_box DOWN_BOX code0 {if (progdefaults.fmt_sync_wav_file) o->deactivate();} } Fl_Check_Button btn_fmt_sync_wav { label {Sync to data record} callback {progdefaults.fmt_sync_wav_file = o->value(); if (o->value() == 1) btn_fmt_record_wav->deactivate(); else btn_fmt_record_wav->activate(); progdefaults.changed = true;} tooltip {Wav file recording - SYNCHRONIZE with data recording} xywh {599 288 118 18} down_box DOWN_BOX code0 {o->value(progdefaults.fmt_sync_wav_file);} } Fl_Output txt_fmt_wav_filename { label {File pathname:} tooltip {Computer generated file name} xywh {213 314 570 24} align 5 } } Fl_Group {} { label Waterfall xywh {616 24 180 131} box ENGRAVED_FRAME align 21 } { Fl_Box {} { label {Shft-click: select unknown Ctrl-click: select reference} xywh {626 44 168 35} labelsize 12 align 20 } Fl_Check_Button btn_fmt_center_on_unknown { label {Center on Unknown} callback {progdefaults.fmt_center_on_unknown = o->value(); if (o->value()) { progdefaults.fmt_center_on_median = 0; progdefaults.fmt_center_on_reference = 0; btn_fmt_center_on_median->value(0); btn_fmt_center_on_reference->value(0); } progdefaults.changed = true;} tooltip {Waterfall Centered on unknown signal} xywh {626 85 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.fmt_center_on_unknown);} } Fl_Check_Button btn_fmt_center_on_reference { label {Center on Reference} callback {progdefaults.fmt_center_on_reference = o->value(); if (o->value()) { progdefaults.fmt_center_on_unknown = 0; progdefaults.fmt_center_on_median = 0; btn_fmt_center_on_median->value(0); btn_fmt_center_on_unknown->value(0); } progdefaults.changed = true;} tooltip {Waterfall centered on reference signal} xywh {626 109 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.fmt_center_on_reference);} } Fl_Check_Button btn_fmt_center_on_median { label {Center on median} callback {progdefaults.fmt_center_on_median = o->value(); if (o->value()) { progdefaults.fmt_center_on_unknown = 0; progdefaults.fmt_center_on_reference = 0; btn_fmt_center_on_unknown->value(0); btn_fmt_center_on_reference->value(0); } progdefaults.changed = true;} tooltip {Waterfall centered 1/2 way between unknown & reference} xywh {627 133 70 17} down_box DOWN_BOX code0 {o->value(progdefaults.fmt_center_on_median);} } } Fl_Group {} { xywh {616 156 180 32} box ENGRAVED_FRAME } { Fl_Check_Button btn_fmt_use_tabs { label {Use TAB delimiters} callback {progdefaults.FMT_use_tabs = o->value(); progdefaults.changed = true;} tooltip {Use tab delimiters between columns on csv export file.} xywh {627 165 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.FMT_use_tabs);} } } } Fl_Group {} { label {Modem/FSQ} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/FSQ"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/FSQ"));} } { Fl_Group {} { label {Rx Parameters} open xywh {208 23 585 60} box ENGRAVED_BOX align 21 } { Fl_Value_Slider valhits { label {Min Hits} callback {progdefaults.fsqhits=(int)o->value(); progdefaults.changed = true;} tooltip {Minimum \# hits in tone detector} xywh {343 28 125 22} type {Horz Knob} align 8 minimum 3 maximum 6 step 1 value 3 textsize 14 code0 {o->value(progdefaults.fsqhits);} } Fl_Choice sel_fsq_lpf { label {Image LPF} callback {progdefaults.fsq_img_filter=o->value(); progdefaults.changed = true;} open tooltip {Narrow LPF if image noisy} xywh {366 53 102 22} down_box BORDER_BOX code0 {o->add("None"); o->add("300 Hz"); o->add("400 Hz"); o->add("500 Hz");} code1 {o->value(progdefaults.fsq_img_filter);} } {} Fl_Value_Slider sldrMovAvg { label {MovAvg:} callback {progdefaults.fsq_movavg = o->value(); progdefaults.changed = true;} tooltip {Filter FFT output} xywh {613 28 125 22} type Horizontal align 4 minimum 1 maximum 15 step 1 value 4 textsize 14 code0 {o->value(progdefaults.fsq_movavg);} code1 {o->maximum(MOVAVGLIMIT);} } Fl_Choice sel_fsq_heard_aging { label {Heard aging} callback {progdefaults.fsq_heard_aging=o->value(); progdefaults.changed = true;} open tooltip {Remove call after ...} xywh {636 53 102 22} down_box BORDER_BOX code0 {o->add("Never"); o->add("1 min"); o->add("5 min");o->add("10 min"); o->add("20 min"); o->add("20 min"); o->add("30 min"); o->add("60 min"); o->add("90 min"); o->add("120 min");} code1 {o->value(progdefaults.fsq_heard_aging);} } {} } Fl_Group {} { label {Tx Parameters} open xywh {208 83 585 100} box ENGRAVED_BOX align 21 } { Fl_Round_Button {btn_fsqbaud[0]} { label {1.5 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 1.5; btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true;} xywh {340 90 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 1.5);} } Fl_Round_Button {btn_fsqbaud[1]} { label {2 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 2; btn_fsqbaud[0]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true;} xywh {430 90 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 2);} } Fl_Round_Button {btn_fsqbaud[2]} { label {3 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 3; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true;} xywh {520 90 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 3);} } Fl_Round_Button {btn_fsqbaud[3]} { label {4.5 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 4.5; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true;} xywh {610 90 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 4.5);} } Fl_Round_Button {btn_fsqbaud[4]} { label {6 baud} callback {if (o->value() == 1) { progdefaults.fsqbaud = 6; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); } progdefaults.changed = true;} xywh {700 90 55 15} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.fsqbaud == 6);} } Fl_Choice sel_fsq_frequency { label {Center freq} callback {progdefaults.fsq_frequency=o->value(); progdefaults.changed = true;} open xywh {638 110 102 22} down_box BORDER_BOX code0 {o->add("1150"); o->add("1500"); o->add("Variable");} code1 {o->value(progdefaults.fsq_frequency);} } {} Fl_Choice sel_fsq_sounder { label Sounder callback {progdefaults.fsq_sounder=o->value(); progdefaults.changed = true;} open tooltip {Send beacon every ...} xywh {283 110 100 22} down_box BORDER_BOX code0 {o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min"); o->add("60 min");} code1 {o->value(progdefaults.fsq_sounder);} } {} Fl_Counter cntr_FSQ_time_out { label {Time out} callback {progdefaults.fsq_time_out = o->value(); progdefaults.changed = true;} tooltip {Time out xmt attempt in XX seconds} xywh {457 110 80 22} type Simple align 4 minimum 2 maximum 20 step 1 value 6 code0 {o->value(progdefaults.fsq_time_out);} } Fl_Input {} { label {QTC:} callback {progdefaults.fsqQTCtext = o->value(); progdefaults.changed = true;} tooltip {Enter QTC text} xywh {284 135 456 22} code0 {o->value(progdefaults.fsqQTCtext.c_str());} } Fl_Check_Button btn_fsq_lowercase { label {MYCALL lower case} callback {progdefaults.fsq_lowercase=o->value(); progdefaults.changed = true;} tooltip {convert operator callsign to lower case} xywh {214 162 214 15} down_box DOWN_BOX code0 {o->value(progdefaults.fsq_lowercase);} } Fl_Input inpMyFSQQth { label {QTH:} callback {progdefaults.myQth = o->value(); inpMyQth->value(o->value()); progdefaults.changed = true;} tooltip {Operators QTH} xywh {420 158 320 22} code0 {inpMyFSQQth->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.myQth.c_str());} class Fl_Input2 } } Fl_Group {} { label {Message Logging} open xywh {208 184 585 44} box ENGRAVED_BOX align 21 } { Fl_Check_Button btn_fsq_msg_dt_stamp { label {Add date/time} callback {progdefaults.add_fsq_msg_dt=o->value(); progdefaults.changed=true;} tooltip {Add date/time stamp to each \# received message} xywh {238 205 135 15} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.add_fsq_msg_dt);} } Fl_Check_Button btn_fsq_msg_append { label {always append to file(s)} callback {progdefaults.always_append=o->value(); progdefaults.changed=true;} tooltip {append \# directive msgs to named file} xywh {385 205 210 15} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.always_append);} } Fl_Counter cntr_FSQ_notify_time_out { label {Notify time out} callback {progdefaults.fsq_notify_time_out = o->value(); progdefaults.changed = true;} tooltip {Notification dialog closes after XX seconds;^j0 == dialog remains open} xywh {698 201 80 22} type Simple align 4 minimum 0 maximum 30 step 1 value 10 code0 {o->value(progdefaults.fsq_notify_time_out);} } } Fl_Group {} { label Logging open xywh {208 228 585 80} box ENGRAVED_BOX align 21 } { Fl_Output txtAuditLog { label {Audit log} xywh {285 248 325 22} code0 {o->value(progdefaults.fsq_audit_log.c_str());} } Fl_Light_Button btn_enable_auditlog { label Enable callback {progdefaults.fsq_enable_audit_log = o->value(); progdefaults.changed = true;} xywh {624 249 74 20} selection_color 2 code0 {o->value(progdefaults.fsq_enable_audit_log);} } Fl_Button btn_select_auditlog { label Select callback {std::string str = std::string(TempDir); str.append(progdefaults.fsq_audit_log); const char *fname = FSEL::saveas("Audit log", "*.txt\\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.fsq_audit_log = fl_filename_name(fname); txtAuditLog->value(progdefaults.fsq_audit_log.c_str()); progdefaults.changed = true;} xywh {712 249 70 20} } Fl_Output txtHeardLog { label {Heard log} xywh {285 276 325 22} code0 {o->value(progdefaults.fsq_heard_log.c_str());} } Fl_Light_Button btn_enable_fsq_heard_log { label Enable callback {progdefaults.fsq_enable_heard_log = o->value(); progdefaults.changed = true;} xywh {624 277 74 20} selection_color 2 code0 {o->value(progdefaults.fsq_enable_heard_log);} } Fl_Button btn_select_fsq_heard_log { label Select callback {std::string str = std::string(TempDir); str.append(progdefaults.fsq_heard_log); const char *fname = FSEL::saveas("Heard log", "*.txt\\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.fsq_heard_log = fl_filename_name(fname); txtHeardLog->value(progdefaults.fsq_heard_log.c_str()); progdefaults.changed = true;} xywh {712 277 70 20} } } Fl_Group {} { label {Text Colors} open xywh {208 308 585 35} box ENGRAVED_BOX align 21 } { Fl_Button btn_fsq_xmt_color { label XMIT callback {choose_color(progdefaults.fsq_xmt_color); btn_fsq_xmt_color->color( progdefaults.fsq_xmt_color ); btn_fsq_xmt_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); progdefaults.changed = true;} tooltip {Transmit text} xywh {348 315 40 20} align 4 code0 {btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color);} } Fl_Button btn_fsq_directed_color { label DIRECTED callback {choose_color(progdefaults.fsq_directed_color); btn_fsq_directed_color->color( progdefaults.fsq_directed_color ); btn_fsq_directed_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); progdefaults.changed = true;} tooltip {Directed received text} xywh {478 315 40 20} align 4 code0 {btn_fsq_directed_color->color(progdefaults.fsq_directed_color);} } Fl_Button btn_fsq_undirected_color { label UNDIRECTED callback {choose_color(progdefaults.fsq_undirected_color); btn_fsq_undirected_color->color( progdefaults.fsq_undirected_color); btn_fsq_undirected_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true;} tooltip {Undirected received text} xywh {628 315 40 20} align 4 code0 {btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color);} } Fl_Button btn_fsq_color_defaults { label Defaults callback {progdefaults.fsq_xmt_color = FL_RED; btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); btn_fsq_xmt_color->redraw(); progdefaults.fsq_directed_color = FL_BLUE; btn_fsq_directed_color->color(progdefaults.fsq_directed_color); btn_fsq_directed_color->redraw(); progdefaults.fsq_undirected_color = FL_DARK_GREEN; btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); btn_fsq_undirected_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true;} xywh {710 315 74 20} } } } Fl_Group {} { label {Modem/IFKP} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/IFKP"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/IFKP"));} } { Fl_Group {} { label {Tx Parameters} open xywh {208 25 587 110} box ENGRAVED_BOX align 21 } { Fl_Round_Button {btn_ifkpbaud[0]} { label {1/2 speed} callback {if (o->value() == 1) { progdefaults.ifkp_baud = 0; btn_ifkpbaud[1]->value(0); btn_ifkpbaud[2]->value(0); } progdefaults.changed = true;} xywh {303 53 100 17} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.ifkp_baud == 0);} } Fl_Round_Button {btn_ifkpbaud[1]} { label {1x speed} callback {if (o->value() == 1) { progdefaults.ifkp_baud = 1; btn_ifkpbaud[0]->value(0); btn_ifkpbaud[2]->value(0); } progdefaults.changed = true;} tooltip default xywh {411 53 100 17} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.ifkp_baud == 1);} } Fl_Round_Button {btn_ifkpbaud[2]} { label {2x speed} callback {if (o->value() == 1) { progdefaults.ifkp_baud = 2; btn_ifkpbaud[0]->value(0); btn_ifkpbaud[1]->value(0); } progdefaults.changed = true;} xywh {519 53 100 17} down_box ROUND_DOWN_BOX code0 {o->value(progdefaults.ifkp_baud == 2);} } Fl_Check_Button btn_ifkp_lowercase { label {MYCALL always lower case} callback {progdefaults.ifkp_lowercase=o->value(); progdefaults.changed = true;} tooltip {convert operator callsign to lower case} xywh {303 82 220 15} down_box DOWN_BOX code0 {o->value(progdefaults.ifkp_lowercase);} } Fl_Check_Button btn_ifkp_lowercase_call { label {CALLSIGN always lower case} callback {progdefaults.ifkp_lowercase_call=o->value(); progdefaults.changed = true;} tooltip {convert other callsign to lower case} xywh {528 82 220 15} down_box DOWN_BOX code0 {o->value(progdefaults.ifkp_lowercase_call);} } Fl_Check_Button btn_ifkp_freqlock { label {lock WF at 1500 Hz} callback {progdefaults.ifkp_freqlock=o->value(); if (active_modem == ifkp_modem && o->value() ) active_modem->set_freq(1500); progdefaults.changed = true;} tooltip {Always transmit at 1500 Hertz center freq.} xywh {303 109 220 15} down_box DOWN_BOX code0 {\#include "trx.h"} code1 {o->value(progdefaults.ifkp_freqlock);} } } Fl_Group {} { label Logging open xywh {208 138 587 92} box ENGRAVED_BOX align 21 } { Fl_Output txt_ifkp_audit_log { label {Audit log} xywh {295 164 323 25} code0 {o->value(progdefaults.ifkp_audit_log.c_str());} } Fl_Light_Button btn_enable_ifkp_audit_log { label Enable callback {progdefaults.ifkp_enable_audit_log = o->value(); progdefaults.changed = true;} xywh {632 164 73 25} selection_color 2 code0 {o->value(progdefaults.ifkp_enable_audit_log);} } Fl_Button btn_ifkp_select_auditlog { label Select callback {std::string str = std::string(TempDir); str.append(progdefaults.ifkp_audit_log); const char *fname = FSEL::saveas("Audit log", "*.txt\\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.ifkp_audit_log = fl_filename_name(fname); txt_ifkp_audit_log->value(progdefaults.ifkp_audit_log.c_str()); progdefaults.changed = true;} xywh {713 164 70 25} } Fl_Output txt_ifkp_heard_log { label {Heard log} xywh {295 193 323 25} code0 {o->value(progdefaults.ifkp_heard_log.c_str());} } Fl_Light_Button btn_enable_ifkp_heard_log { label Enable callback {progdefaults.ifkp_enable_heard_log = o->value(); progdefaults.changed = true;} xywh {632 193 73 25} selection_color 2 code0 {o->value(progdefaults.ifkp_enable_heard_log);} } Fl_Button btn_select_ifkp_heard_log { label Select callback {std::string str = std::string(TempDir); str.append(progdefaults.ifkp_heard_log); const char *fname = FSEL::saveas("Heard log", "*.txt\\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.ifkp_heard_log = fl_filename_name(fname); txt_ifkp_heard_log->value(progdefaults.ifkp_heard_log.c_str()); progdefaults.changed = true;} xywh {713 193 70 25} } } Fl_Box ifkp_image_box { label { Operator avatar} xywh {295 236 59 74} box FLAT_BOX color 56 align 2 code0 {init_def_ifkp_avatar(o);} class Fl_Group } } Fl_Group {} { label {Modem/MT-63} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/MT-63"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/MT-63"));} } { Fl_Group {} {open xywh {249 36 490 84} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnMT63_8bit { label {8-bit extended characters (UTF-8)} callback {progdefaults.mt63_8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 characters} xywh {394 50 205 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.mt63_8bit);} } Fl_Check_Button btnMT63_rx_integration { label {Long receive integration} callback {progdefaults.mt63_rx_integration = o->value(); progdefaults.changed = true;} tooltip {Enable for very weak signals} xywh {394 80 190 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.mt63_rx_integration);} } } Fl_Group {} {open xywh {249 132 490 178} box ENGRAVED_FRAME } { Fl_Check_Button btnMT63_usetones { label {Transmit lower start tone} callback {progdefaults.mt63_usetones = o->value(); if (!o->value()) { btnMT63_upper_lower->value(0); btnMT63_upper_lower->do_callback(); btnMT63_upper_lower->deactivate(); } else btnMT63_upper_lower->activate(); progdefaults.changed = true;} xywh {393 140 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_usetones);} } Fl_Check_Button btnMT63_upper_lower { label {Transmit upper start tone} callback {progdefaults.mt63_twotones = o->value(); progdefaults.changed = true;} xywh {393 170 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_twotones);} code1 {if (!btnMT63_usetones->value()) o->deactivate();} } Fl_Spinner MT63_tone_duration { label {Tone Duration (secs)} callback {progdefaults.mt63_tone_duration=(int)o->value(); progdefaults.changed = true;} xywh {393 196 40 20} align 8 maximum 10 value 4 code0 {o->value(progdefaults.mt63_tone_duration);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Check_Button btnMT63_at500 { label {Low tone at 500 Hz} callback {o->value(1); progdefaults.mt63_at500 = true; progdefaults.mt63_centered = false; btnMT63_centered->value(0); btnMT63_manual->value(0); progdefaults.changed = true;} xywh {393 225 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_at500);} } Fl_Check_Button btnMT63_centered { label {Centered at 1500 Hz (SHARES)} callback {o->value(1); progdefaults.mt63_centered = true; progdefaults.mt63_at500 = false; btnMT63_at500->value(0); btnMT63_manual->value(0); progdefaults.changed = true;} xywh {393 250 248 20} down_box DOWN_BOX code0 {o->value(progdefaults.mt63_centered);} } Fl_Check_Button btnMT63_manual { label {Manual tuning} callback {o->value(1); progdefaults.mt63_centered = false; progdefaults.mt63_at500 = false; btnMT63_at500->value(0); btnMT63_centered->value(0); progdefaults.changed = true;} xywh {393 275 200 20} down_box DOWN_BOX code0 {o->value(!progdefaults.mt63_at500 && !progdefaults.mt63_centered);} } } } Fl_Group {} { label {Modem/Contestia} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Contestia"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/Contestia"));} } { Fl_Group {} {open xywh {257 40 490 240} box ENGRAVED_FRAME } { Fl_Group i_listbox_contestia_bandwidth { label Bandwidth callback {progdefaults.contestiabw = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true;} open tooltip {Select bandwidth} xywh {312 60 85 22} box DOWN_BOX color 7 align 8 code0 {o->add(szContestiaBandwidth);} code1 {o->index(progdefaults.contestiabw);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group i_listbox_contestia_tones { label Tones callback {progdefaults.contestiatones = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true;} open tooltip {Select number of tones} xywh {573 60 70 22} box DOWN_BOX color 7 align 8 code0 {o->add(szContestiaTones);} code1 {o->index(progdefaults.contestiatones);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {} { label {Receive synchronizer} open xywh {295 99 414 101} box ENGRAVED_FRAME align 21 } { Fl_Counter cntContestia_smargin { label {Tune margin (tone frequency spacing)} callback {progdefaults.contestiasmargin = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {314 130 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 8 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntContestia_sinteg { label {Integration period (FEC blocks)} callback {progdefaults.contestiasinteg = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {314 162 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Check_Button btnContestia_8bit { label {8-bit extended characters} callback {progdefaults.contestia8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for Latin-1 accented characters} xywh {312 209 200 20} down_box DOWN_BOX } Fl_Check_Button btnContestia_start_stop_tones { label {xmt start/stop tones} callback {progdefaults.contestia_start_tones = o->value(); progdefaults.changed = true;} tooltip {Enable this to send start/stop tones} xywh {312 240 265 20} down_box DOWN_BOX code0 {o->value(progdefaults.contestia_start_tones);} } } } Fl_Group {} { label {Modem/Olivia} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Olivia"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/Olivia"));} } { Fl_Group {} {open xywh {253 40 490 280} box ENGRAVED_FRAME } { Fl_Group i_listbox_olivia_bandwidth { label Bandwidth callback {progdefaults.oliviabw = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true;} open tooltip {Select bandwidth} xywh {308 60 85 22} box DOWN_BOX color 7 align 8 code0 {o->add(szOliviaBandwidth);} code1 {o->index(progdefaults.oliviabw);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group i_listbox_olivia_tones { label Tones callback {progdefaults.oliviatones = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true;} open tooltip {Select number of tones} xywh {569 60 70 22} box DOWN_BOX color 7 align 8 code0 {o->add(szOliviaTones);} code1 {o->index(progdefaults.oliviatones);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group {} { label {Receive synchronizer} open xywh {308 99 379 133} box ENGRAVED_FRAME align 21 } { Fl_Counter cntOlivia_smargin { label {Tune margin (tone frequency spacing)} callback {progdefaults.oliviasmargin = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {323 130 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 8 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.oliviasmargin);} class Fl_Counter2 } Fl_Counter cntOlivia_sinteg { label {Integration period (FEC blocks)} callback {progdefaults.oliviasinteg = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true;} tooltip {Change ONLY to experiment} xywh {323 162 70 22} type Simple align 8 minimum 2 maximum 128 step 1 value 4 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.oliviasinteg);} class Fl_Counter2 } Fl_Check_Button btn_olivia_reset_fec { label {Reset FEC blocks when changing BW or Tones} callback {progdefaults.olivia_reset_fec = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 character transmission} xywh {324 194 349 20} down_box DOWN_BOX code0 {o->value(progdefaults.olivia_reset_fec);} } } Fl_Check_Button btnOlivia_8bit { label {8-bit extended characters (UTF-8)} callback {progdefaults.olivia8bit = o->value(); progdefaults.changed = true;} tooltip {Enable this for UTF-8 character transmission} xywh {329 255 265 20} down_box DOWN_BOX code0 {o->value(progdefaults.olivia8bit);} } Fl_Check_Button btnOlivia_start_stop_tones { label {xmt start/stop tones} callback {progdefaults.olivia_start_tones = o->value(); progdefaults.changed = true;} tooltip {Enable this to send start/stop tones} xywh {329 279 265 20} down_box DOWN_BOX code0 {o->value(progdefaults.olivia_start_tones);} } } } Fl_Group {} { label {Modem/Psk} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Psk"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/Psk"));} } { Fl_Group {} { label {AFC behavior} open xywh {255 33 490 86} box ENGRAVED_FRAME align 21 } { Fl_Counter cntSearchRange { label {Acquisition search range (Hz)} callback {progdefaults.SearchRange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Capture signals within this frequency range} xywh {400 57 75 20} type Simple align 8 minimum 10 maximum 500 step 10 value 200 code0 {o->value(progdefaults.SearchRange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntACQsn { label {Acquisition S/N (dB)} callback {progdefaults.ACQsn = o->value(); progdefaults.changed = true;} tooltip {Capture signals over this threshold} xywh {400 86 75 20} type Simple align 8 minimum 3 maximum 20 step 1 value 6 code0 {o->value(progdefaults.ACQsn);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} { label {S/N and IMD behavior} open xywh {255 121 490 65} box ENGRAVED_FRAME align 21 } { Fl_Group listbox_psk_status_timeout { label after callback {progdefaults.StatusDim = o->index(); progdefaults.changed = true;} open tooltip {Behavior of s/n imd} xywh {380 152 80 20} box DOWN_BOX color 7 align 8 code0 {o->add(_("Clear")); o->add(_("Dim"));} code1 {o->index(progdefaults.StatusDim); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter {} { label seconds callback {progdefaults.StatusTimeout = (int)(o->value()); progdefaults.changed = true;} tooltip {Will occur after this time in seconds} xywh {521 152 75 20} type Simple align 8 minimum 0 maximum 30 step 1 code0 {o->value(progdefaults.StatusTimeout);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} { label {Multi-Channel Signal Processing} open xywh {255 191 490 80} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnEnablePSKbrowsing { label {Multi-channel detector} callback {progdefaults.pskbrowser_on = o->value(); progdefaults.changed = true;} xywh {425 241 180 20} down_box DOWN_BOX code0 {o->value(progdefaults.pskbrowser_on);} } Fl_Box {} { label {Disable on very slow CPUs or if signal browser is not used} xywh {265 218 440 20} align 20 } } Fl_Group {} { label {8 psk} open xywh {255 273 490 47} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnPSKpilot { label {Pilot tone} callback {progdefaults.pskpilot = o->value(); progdefaults.changed = true;} tooltip {Enable encode/decode vestigial pilot tone} xywh {300 286 113 20} down_box DOWN_BOX code0 {o->value(progdefaults.pskpilot);} } Fl_Counter cnt_pilot_power { label {pilot power (dB)} callback {progdefaults.pilot_power = o->value(); progdefaults.changed = true;} tooltip {Pilot tone power relative to signal} xywh {405 286 75 20} type Simple align 8 minimum -60 maximum -20 step 1 value -30 code0 {o->value(progdefaults.pilot_power);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnPSK8Preamble { label {Short Preamble} callback {progStatus.psk8DCDShortFlag = o->value();} tooltip {Enable short preamble for 8PSK transmission} xywh {610 286 113 20} down_box DOWN_BOX code0 {o->value(progStatus.psk8DCDShortFlag);} } } } Fl_Group {} { label {Modem/TTY/Rx} xywh {200 0 600 350} box FLAT_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Rx"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/TTY/Rx"));} } { Fl_Group {} { label Receive open xywh {202 22 595 50} box ENGRAVED_FRAME align 21 } { Fl_Group i_listbox_rtty_afc_speed { label {AFC speed} callback {progdefaults.rtty_afcspeed = o->index(); progdefaults.changed = true;} open tooltip {AFC tracking speed} xywh {296 43 90 22} box DOWN_BOX color 7 align 4 code0 {o->add("Slow"); o->add("Normal"); o->add("Fast");} code1 {o->index(progdefaults.rtty_afcspeed);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button chkUOSrx { label {RX - unshift on space} callback {progdefaults.UOSrx=o->value(); progdefaults.changed = true;} tooltip {Revert to unshifted char's on a space} xywh {400 45 63 18} down_box DOWN_BOX code0 {o->value(progdefaults.UOSrx);} } Fl_Value_Input rtty_rx_shape { label {Filter Shape Factor} callback {progdefaults.rtty_filter = o->value(); progStatus.rtty_filter_changed = true; progdefaults.changed = true;} tooltip {rcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500} xywh {745 42 48 25} minimum 1 maximum 2 step 0.001 value 1.25 code0 {o->value(progdefaults.rtty_filter);} } } Fl_Group {} { label {Decode (CWI suppression)} open xywh {202 72 595 55} box ENGRAVED_FRAME align 21 } { Fl_Check_Button {btnRxTones[0]} { label {Mark-Space} callback {if (o->value()) { btnRxTones[1]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 0; }} xywh {308 98 77 13} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_cwi == 0);} } Fl_Check_Button {btnRxTones[1]} { label {Mark only} callback {if (o->value()) { btnRxTones[0]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 1; }} xywh {455 98 77 13} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_cwi == 1);} } Fl_Check_Button {btnRxTones[2]} { label {Space only} callback {if (o->value()) { btnRxTones[1]->value(0); btnRxTones[0]->value(0); progdefaults.rtty_cwi = 2; }} xywh {602 98 78 13} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_cwi == 2);} } } Fl_Group {} { label {RTTY Scope Display} open xywh {202 128 595 55} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnPreferXhairScope { label {Use cross hair scope} callback {progdefaults.PreferXhairScope=o->value(); progdefaults.changed = true;} tooltip {Default to cross hair digiscope} xywh {308 150 182 20} down_box DOWN_BOX code0 {o->value(progdefaults.PreferXhairScope);} } Fl_Check_Button chk_true_scope { label {XY - classic scope} callback {progdefaults.true_scope=o->value(); progdefaults.changed = true;} tooltip {Enabled - use Mark/Space filter outputs Disabled - use pseudo signals} xywh {551 150 77 20} down_box DOWN_BOX code0 {o->value(progdefaults.true_scope);} } } Fl_Group {} { label {Log RTTY frequency} open xywh {202 184 595 54} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chk_useMARKfreq { label {Use MARK freq'} callback {progdefaults.useMARKfreq=o->value(); progdefaults.changed = true;} tooltip {Enabled - log QSO using Mark frequency Disabled - log QSO using center frequency} xywh {308 208 161 17} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.useMARKfreq);} } Fl_Button btnRTTY_mark_color { label {track color} callback {if (fl_color_chooser("MARK freq track", progdefaults.rttymarkRGBI.R, progdefaults.rttymarkRGBI.G, progdefaults.rttymarkRGBI.B) ) { o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Color of Mark Track} xywh {551 205 45 20} color 2 align 8 code0 {o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B));} } } Fl_Group {} { label {RTTY Bell} open xywh {202 240 595 104} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chk_audibleBELL { label {Audible BELL} callback {progdefaults.audibleBELL=o->value(); progdefaults.changed = true;} tooltip {Enabled - log QSO using Mark frequency Disabled - log QSO using center frequency} xywh {308 259 161 22} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.audibleBELL);} } Fl_Check_Button chk_visibleBELL { label {Visible BELL} callback {progdefaults.visibleBELL=o->value(); progdefaults.changed = true;} tooltip {Enabled - log QSO using Mark frequency Disabled - log QSO using center frequency} xywh {551 259 161 22} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.visibleBELL);} } Fl_File_Input inp_wav_fname_bell_ring { label {RTTY Bell audio wav} xywh {223 301 301 35} align 5 code0 {o->value(progdefaults.BELL_RING.c_str());} } Fl_Button btn_select_bell_ring_wav { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.{mp3,wav}\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BELL_RING = fnfc.filename(); inp_wav_fname_bell_ring->value(progdefaults.BELL_RING.c_str()); progdefaults.BELL_RING_MENU = 0; mnu_bell_ring_menu->value(progdefaults.BELL_RING_MENU); break; // FILE CHOSEN } }} xywh {526 312 59 24} } Fl_Choice mnu_bell_ring_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BELL_RING = "bark"; break; case 2 : progdefaults.BELL_RING = "checkout"; break; case 3 : progdefaults.BELL_RING = "diesel"; break; case 4 : progdefaults.BELL_RING = "steam_train"; break; case 5 : progdefaults.BELL_RING = "doesnot"; break; case 6 : progdefaults.BELL_RING = "beeboo"; break; case 7 : progdefaults.BELL_RING = "phone"; break; case 8 : progdefaults.BELL_RING = "dinner_bell"; break; case 9 : progdefaults.BELL_RING = "rtty_bell"; break; case 10 : progdefaults.BELL_RING = "standard_tone"; break; } inp_wav_fname_bell_ring->value(progdefaults.BELL_RING.c_str()); } progdefaults.BELL_RING_MENU = o->value();} open xywh {589 312 134 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone");} code1 {o->value(progdefaults.BELL_RING_MENU);} } {} Fl_Button btn_test_bell_ring_wav { label Test callback {audio_alert->alert(progdefaults.BELL_RING.c_str());} xywh {728 312 59 24} } } } Fl_Group {} { label {Modem/TTY/Tx} xywh {200 0 600 350} box FLAT_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Tx"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/TTY/Tx"));} } { Fl_Group {} { label {Sound Card FSK} open xywh {205 21 590 200} box ENGRAVED_FRAME align 21 } { Fl_Group selShift { label {Carrier shift} callback {progdefaults.rtty_shift = o->index(); sel_xcvr_FSK_shift->index(progdefaults.rtty_shift); if (progdefaults.rtty_shift == o->lsize() - 1) selCustomShift->activate(); else selCustomShift->deactivate(); selCustomShift->redraw(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select carrier shift} xywh {281 43 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szShifts);o->index(progdefaults.rtty_shift); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter selCustomShift { label {Custom shift} callback {progdefaults.rtty_custom_shift = o->value(); resetRTTY(); progdefaults.changed = true;} tooltip {Input carrier shift} xywh {281 73 100 22} align 8 minimum 10 maximum 1200 step 10 value 450 code0 {o->lstep(100.0);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group selBaud { label {Baud rate} callback {progdefaults.rtty_baud = o->index(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select carrier baudrate} xywh {281 103 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szBauds);} code1 {o->index(progdefaults.rtty_baud);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group selBits { label {Bits per character} callback {progdefaults.rtty_bits = o->index(); selParity->do_callback();} open tooltip {Select \# bits / char} xywh {281 133 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szSelBits);o->index(progdefaults.rtty_bits); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group selParity { label Parity callback {if (progdefaults.rtty_bits == 0) { progdefaults.rtty_parity = rtty::RTTY_PARITY_NONE; o->index(progdefaults.rtty_parity); } else progdefaults.rtty_parity = o->index(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select parity} xywh {281 163 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szParity);o->index(progdefaults.rtty_parity); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group selStopBits { label {Stop bits} callback {progdefaults.rtty_stop = o->index(); resetRTTY(); progdefaults.changed = true;} open tooltip {Select \# stop bits} xywh {281 193 100 22} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szStopBits);o->index(progdefaults.rtty_stop); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btnAUTOCRLF { label AutoCRLF callback {progdefaults.rtty_autocrlf = o->value(); progdefaults.changed = true;} tooltip {Add CRLF after page width characters} xywh {532 43 90 22} down_box DOWN_BOX code0 {o->value(progdefaults.rtty_autocrlf);} } Fl_Counter cntrAUTOCRLF { label chars callback {progdefaults.rtty_autocount = (int)o->value(); progdefaults.changed = true;} tooltip {Auto CRLF line length} xywh {643 43 75 22} type Simple align 8 minimum 68 maximum 80 step 1 value 72 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnCRCRLF { label {CR-CR-LF} callback {progdefaults.rtty_crcrlf = o->value(); progdefaults.changed = true;} tooltip {Use "cr cr lf" for "cr lf"} xywh {532 73 90 22} down_box DOWN_BOX when 6 code0 {o->value(progdefaults.rtty_crcrlf);} } Fl_Check_Button chkUOStx { label {TX - unshift on space} callback {progdefaults.UOStx=o->value(); progdefaults.changed = true;} tooltip {Revert to Unsifted char's on a space} xywh {532 103 63 22} down_box DOWN_BOX code0 {o->value(progdefaults.UOStx);} } Fl_Check_Button chk_shaped_rtty { label {Shaped Tx} callback {progStatus.shaped_rtty = o->value();} tooltip {Use wave shaping on Tx signal} xywh {532 133 212 22} down_box DOWN_BOX value 1 code0 {o->value(progStatus.shaped_rtty);} } Fl_Check_Button chkPseudoFSK { label {Pseudo-FSK - right channel} callback {progdefaults.PseudoFSK = o->value(); chkPseudoFSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); }} tooltip {Create keyed square wave on right audio channel} xywh {532 163 212 22} down_box DOWN_BOX code0 {o->value(progdefaults.PseudoFSK);} } Fl_Counter cnt_TTY_LTRS { label {LTRS at start} callback {progdefaults.TTY_LTRS = (int)o->value(); progdefaults.changed = true;} tooltip {Insert NN LTRS bytes at start of each transmission} xywh {532 193 75 22} type Simple align 8 minimum 0 maximum 10 step 1 value 1 code0 {o->value(progdefaults.TTY_LTRS);} } } } Fl_Group {} { label {Modem/TTY/FSK} xywh {200 0 600 350} box FLAT_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/FSK"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/TTY/FSK"));} } { Fl_Group {} { label {DTR/RTS signal line FSK} open xywh {205 21 590 165} box ENGRAVED_BOX align 21 } { Fl_Check_Button btnFSKenabled { label Enabled callback {progdefaults.useFSK = o->value(); resetRTTY(); resetFSK(); progdefaults.changed = true;} tooltip {Enable FSK on serial port} xywh {224 56 90 22} down_box DOWN_BOX when 6 code0 {o->value(progdefaults.useFSK);} } Fl_Check_Button btnFSKshared { label {Shares RIGIO serial port, or uses} callback {progdefaults.fsk_shares_port = o->value(); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true;} tooltip {Share the RIGIO port} xywh {333 56 90 22} down_box DOWN_BOX when 6 code0 {o->value(progdefaults.fsk_shares_port);} } Fl_Group select_FSK_CommPort { label {Serial Port} callback {progdefaults.fsk_port = o->value(); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true;} open tooltip {FSK independent serial port} xywh {314 88 470 24} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code2 {o->value(progdefaults.fsk_port.c_str());} class Fl_ComboBox } {} Fl_Check_Button btnFSKreverse { label {MARK/SPACE reversed} callback {progdefaults.fsk_reverse = o->value(); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true;} tooltip {Reverse Mark/Space} xywh {225 120 90 22} down_box DOWN_BOX when 6 code0 {o->value(progdefaults.fsk_reverse);} } Fl_Check_Button btnFSKuseDTR { label {Use DTR} callback {progdefaults.fsk_on_dtr = o->value(); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true;} tooltip {Enable DTR signal line, default is RTS} xywh {460 120 90 22} down_box DOWN_BOX when 6 code0 {o->value(progdefaults.fsk_on_dtr);} } Fl_Button btnFSKreset { label Reset callback {resetRTTY(); resetFSK();} tooltip {Restart the FSK interface Necessary if changes made to configuration} xywh {714 152 70 24} hide } Fl_Counter cntr_xcvr_FSK_MARK { label Mark callback {progdefaults.xcvr_FSK_MARK = o->value(); progdefaults.RTTYsweetspot = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift] / 2; valRTTYsweetspot->value(progdefaults.RTTYsweetspot); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true;} tooltip {Mark frequency in Hertz} xywh {225 152 126 24} align 8 minimum 500 maximum 3000 step 1 value 1275 code0 {o->value(progdefaults.xcvr_FSK_MARK);} code1 {o->lstep(10);} } Fl_Group sel_xcvr_FSK_shift { label {Carrier shift} callback {progdefaults.rtty_shift = o->index(); selShift->index(progdefaults.rtty_shift); progdefaults.RTTYsweetspot = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift] / 2; valRTTYsweetspot->value(progdefaults.RTTYsweetspot); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true;} open tooltip {Carrier shift in Hertz} xywh {460 152 100 24} box DOWN_BOX color 7 align 8 when 1 code0 {o->add(szShifts);} code1 {o->index(progdefaults.rtty_shift);} class Fl_ListBox } {} Fl_Check_Button btnFSK_STOPBITS { label {1.5 stop bits} callback {progdefaults.fsk_STOPBITS = o->value(); progdefaults.changed = true;} tooltip {Enabled - 1.5 stop bits Disabled - 2 stop bits} xywh {640 120 111 22} down_box DOWN_BOX when 6 code0 {o->value(progdefaults.fsk_STOPBITS);} } } Fl_Group {} {open xywh {205 193 590 39} box ENGRAVED_FRAME } { Fl_Check_Button btn_FSK_KEYLINE_flrig { label {Use flrig FSK keying} callback {int val = o->value(); progdefaults.use_FLRIG_FSK = val; progdefaults.changed = true;} tooltip {Enable to use flrig FSK keyer} xywh {225 205 23 15} down_box DOWN_BOX align 8 code0 {o->value(progdefaults.use_FLRIG_FSK);} } } } Fl_Group {} { label {Modem/TTY/nanoIO} xywh {200 0 600 350} box FLAT_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/nanoIO"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/TTY/nanoIO"));} } { Fl_Group select_nanoIO_CommPort { label {Ser. Port} callback {progdefaults.nanoIO_serial_port_name = o->value();} open tooltip {nanoIO serial port} xywh {290 23 420 25} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {\#include "nanoIO.h"} code2 {o->value(progdefaults.nanoIO_serial_port_name.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_nanoIO_connect { label Connect callback {if (o->value()) { if (open_nanoIO()) { btn_nanoCW_connect->value(1); chk_nanoIO_FSK_io->value(1); } else { o->value(0); btn_nanoCW_connect->value(0); chk_nanoIO_CW_io->value(0); chk_nanoIO_FSK_io->value(0); } } else { close_nanoIO(); o->value(0); btn_nanoCW_connect->value(0); chk_nanoIO_FSK_io->value(0); chk_nanoIO_CW_io->value(0); }} tooltip {Connect / Disconnect from nanoIO} xywh {715 23 80 25} } Fl_Group listbox_nanoIO_serbaud2 { label {Serial Baud} callback {progdefaults.nanoIO_serbaud = o->index(); listbox_nanoIO_serbaud->index(o->index()); progdefaults.changed = true;} open xywh {293 57 92 24} box DOWN_BOX color 7 align 4 code0 {o->add("1200|4800|9600|19200|38400|57600|115200");} code1 {o->index(progdefaults.nanoIO_serbaud);} class Fl_ListBox } {} Fl_Text_Display txt_nano_io { label {USB serial I/O} xywh {202 126 596 220} align 5 code0 {\#include "FTextRXTX.h"} code1 {o->setFont(progdefaults.RxFontnbr);} code2 {o->setFontSize(12);} class FTextView } Fl_Button btn_nanofsk_save { label Save callback {nano_CW_save();} tooltip {Write state of nanoIO to Arduino EEPROM} xywh {715 90 80 25} } Fl_Button btn_nanofsk_query { label Status callback {nano_CW_query();} tooltip {Query state of nanoIO} xywh {630 57 80 25} } Fl_Check_Button chk_nanoIO_polarity { label {MARK polarity} callback {progdefaults.nanoIO_polarity=o->value(); nano_mark_polarity(progdefaults.nanoIO_polarity); progdefaults.changed = true;} tooltip {Set - mark logical HIGH Read from nanoIO} xywh {323 90 53 24} down_box DOWN_BOX code0 {o->value(progdefaults.nanoIO_polarity);} } Fl_Group sel_nanoIO_baud { label {TTY Baud} callback {progdefaults.nanoIO_baud = o->index(); nano_set_baud(progdefaults.nanoIO_baud); progdefaults.changed = true;} open tooltip {nanoIO - TTY baud} xywh {447 90 84 25} box DOWN_BOX color 7 align 8 when 1 code0 {o->add("45.45|50.0|75.0|100.0");} code1 {o->index(progdefaults.nanoIO_baud);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group grp_nanoio_debug { label {Debug Output} open xywh {202 126 596 220} box ENGRAVED_FRAME align 5 hide resizable } { Fl_Browser brws_nanoio_sent { xywh {202 126 298 190} align 18 } Fl_Browser brws_nanoio_rcvd { xywh {500 126 298 190} align 18 } Fl_Button btn_nanoio_clear_sent { label {Clear Sent} callback {brws_nanoio_sent->clear();} xywh {309 319 85 20} } Fl_Button btn_nanoio_clear_both { label {Clear Both} callback {brws_nanoio_rcvd->clear(); brws_nanoio_sent->clear();} xywh {457 319 85 20} } Fl_Button btn_nanoio_clear_rcvd { label {Clear Rcvd} callback {brws_nanoio_rcvd->clear();} xywh {605 319 85 20} } } Fl_Light_Button btn_nanoio_debug { label Debug callback {if (o->value()) { grp_nanoio_debug->show(); txt_nano_io->hide(); } else { grp_nanoio_debug->hide(); txt_nano_io->show(); }} xywh {630 90 80 25} } Fl_Check_Button chk_nanoIO_FSK_io { label {TTY i/o} callback {if (o->value() == 0) { o->value(1); return; } set_nanoIO(); chk_nanoIO_CW_io->value(0);} tooltip {Enable TTY operation} xywh {715 57 70 24} down_box DOWN_BOX } } Fl_Group {} { label {Modem/TTY/Navigator} xywh {200 0 600 350} box FLAT_BOX align 21 hide code0 {\#include "Nav.h"} code1 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Navigator"));} code2 {config_pages.push_back(p);} code3 {tab_tree->add(_("Modem/TTY/Navigator"));} } { Fl_Group {} { label {FSK Interface} open xywh {206 36 591 70} box ENGRAVED_FRAME align 21 } { Fl_Group select_USN_FSK_port { label Port callback {progdefaults.Nav_FSK_port = o->value();} open tooltip {Navigator serial port} xywh {249 65 455 23} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {\#include "Nav.h"} code2 {o->value(progdefaults.Nav_FSK_port.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_Nav_connect { label FSK callback {if (o->value()) { if (!open_NavFSK()) o->value(0); } else { close_NavFSK(); }} tooltip {Connect / Disconnect from Nav FSK port} xywh {711 65 80 23} } } Fl_Group {} { label {Configuration Interface} open xywh {206 107 591 239} box ENGRAVED_FRAME align 21 } { Fl_Group select_Nav_config_port { label Port callback {progdefaults.Nav_config_port = o->value();} open tooltip {Navigator configuration port} xywh {250 137 455 23} box DOWN_BOX color 55 align 4 code0 {o->value(progdefaults.Nav_config_port.c_str());} class Fl_ComboBox } {} Fl_Group sel_Nav_ch1 { label {Channel 1 Attenuator} callback {progdefaults.Nav_channel_1_att = o->index(); Nav_set_channel_1_att(progdefaults.Nav_channel_1_att); progdefaults.changed = true;} open tooltip {Nav Channel 1 attenuator} xywh {378 164 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->add("15 db|Normal");} code2 {o->index(progdefaults.Nav_channel_1_att);} class Fl_ListBox } {} Fl_Group sel_Nav_ch2 { label {Channel 2 attenuator} callback {progdefaults.Nav_channel_2_att = o->index(); Nav_set_channel_2_att(progdefaults.Nav_channel_2_att); progdefaults.changed = true;} open tooltip {NavChannel 2 Attenuator} xywh {378 193 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->add("15 db|Normal");} code2 {o->index(progdefaults.Nav_channel_2_att);} class Fl_ListBox } {} Fl_Group sel_Nav_rf_att { label {RF attenuator} callback {progdefaults.Nav_rf_att = o->index(); Nav_set_rf_att(progdefaults.Nav_rf_att); progdefaults.changed = true;} open tooltip {NavRF Attenuator} xywh {378 223 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->add("20 db|Normal");} code2 {o->index(progdefaults.Nav_rf_att);} class Fl_ListBox } {} Fl_Group sel_Nav_wk_ptt { label {WinKey PTT} callback {progdefaults.Nav_wk_ptt = o->index(); Nav_set_wk_ptt(progdefaults.Nav_wk_ptt); progdefaults.changed = true;} open tooltip {NavWinkey PTT} xywh {378 253 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->index(progdefaults.Nav_wk_ptt);} code2 {o->add("On|Off");} class Fl_ListBox } {} Fl_Group sel_Nav_LED { label {LED brightness} callback {progdefaults.Nav_led = o->index(); Nav_set_led(progdefaults.Nav_led); progdefaults.changed = true;} open tooltip {NavLED brightness} xywh {378 283 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->index(progdefaults.Nav_led);} code2 {o->add("Dim|Normal");} class Fl_ListBox } {} Fl_Group sel_Nav_CAT_LED { label {CAT LED state} callback {progdefaults.Nav_cat_led = o->index(); Nav_set_cat_led(progdefaults.Nav_cat_led); progdefaults.changed = true;} open tooltip {NavCAT state LED} xywh {378 313 80 23} box DOWN_BOX color 7 align 4 when 1 code1 {o->index(progdefaults.Nav_cat_led);} code2 {o->add("Steady|Polling");} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_baud { label {Baud rate} callback {progdefaults.Nav_FSK_baud = o->index(); Nav_set_baud(progdefaults.Nav_FSK_baud); progdefaults.changed = true;} open tooltip {Nav FSK baud rate} xywh {586 164 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("45.45|75|100");} code1 {o->index(progdefaults.Nav_FSK_baud);} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_stopbits { label {Stop bits} callback {progdefaults.Nav_FSK_stopbits = o->index(); Nav_set_stopbits(progdefaults.Nav_FSK_stopbits); progdefaults.changed = true;} open tooltip {Nav FSK Stop bits} xywh {585 193 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("1|1.5|2");} code1 {o->index(progdefaults.Nav_FSK_stopbits);} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_polarity { label {Mark Polarity} callback {progdefaults.Nav_FSK_polarity = o->index(); Nav_set_polarity(progdefaults.Nav_FSK_polarity); progdefaults.changed = true;} open tooltip {Nav FSK MARK Polarity} xywh {585 223 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Normal|Reverse");} code1 {o->index(progdefaults.Nav_FSK_polarity);} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_sidetone { label {Side tone} callback {progdefaults.Nav_FSK_sidetone = o->index(); Nav_set_sidetone(progdefaults.Nav_FSK_sidetone); progdefaults.changed = true;} open tooltip {Nav FSK side tone} xywh {585 253 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("On|Off");} code1 {o->index(progdefaults.Nav_FSK_sidetone);} class Fl_ListBox } {} Fl_Group sel_Nav_FSK_ptt { label {FSK PTT} callback {progdefaults.Nav_FSK_ptt = o->index(); Nav_set_ptt(progdefaults.Nav_FSK_ptt); progdefaults.changed = true;} open tooltip {Nav FSK PTT - should always be on} xywh {585 283 80 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("On|Off");} code1 {o->index(progdefaults.Nav_FSK_ptt);} class Fl_ListBox } {} Fl_Light_Button btn_Nav_config { label Config callback {if (o->value()) { if (!open_NavConfig()) o->value(0); } else { close_NavConfig(); }} tooltip {Connect / Disconnect from Nav Config port} xywh {710 137 80 23} } } } Fl_Group {} { label {Modem/TTY/Synop} xywh {200 0 600 350} box FLAT_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Synop"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/TTY/Synop"));} } { Fl_Check_Button btnSynopAdifDecoding { label {SYNOP to ADIF} callback {progdefaults.SynopAdifDecoding=o->value(); progdefaults.changed = true;} tooltip {Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file} xywh {406 71 127 24} down_box DOWN_BOX align 148 code0 {o->value(progdefaults.SynopAdifDecoding);} } Fl_Check_Button btnSynopKmlDecoding { label {SYNOP to KML} callback {progdefaults.SynopKmlDecoding=o->value(); progdefaults.changed = true;} tooltip {Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)} xywh {406 112 120 24} down_box DOWN_BOX align 148 code0 {o->value(progdefaults.SynopKmlDecoding);} } Fl_Check_Button btnSynopInterleaved { label {Interleave SYNOP and text} callback {progdefaults.SynopInterleaved=o->value(); progdefaults.changed = true;} tooltip {Interleave text with decoded SYNOP messages, or replacement.} xywh {406 154 211 24} down_box DOWN_BOX align 148 code0 {o->value(progdefaults.SynopInterleaved);} } } Fl_Group {} { label {Modem/TTY/Winkeyer 3} xywh {200 0 600 350} box FLAT_BOX align 21 hide code0 {\#include "winkeyer.h"} code1 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Winkeyer 3"));} code2 {config_pages.push_back(p);} code3 {tab_tree->add(_("Modem/TTY/Winkeyer 3"));} } { Fl_Group {} { label {Serial Interface} open xywh {206 43 591 72} box ENGRAVED_FRAME align 21 } { Fl_Group select_WKFSK_CommPort { label Port callback {progStatus.WK_serial_port_name = o->value(); select_WK_CommPort->value(progStatus.WK_serial_port_name.c_str());} open tooltip {Xcvr serial port} xywh {274 71 405 23} box DOWN_BOX color 55 align 4 code0 {\#include "combo.h"} code1 {o->value(progStatus.WK_serial_port_name.c_str());} class Fl_ComboBox } {} Fl_Light_Button btn_WKFSK_connect { label Connect callback {WKFSK_connect(o->value());} tooltip {Connect / Disconnect from WinKeyer} xywh {705 71 80 23} code0 {o->value(progStatus.WK_online);} } } Fl_Group {} { label {Configuration Interface} open xywh {206 116 591 231} box ENGRAVED_FRAME align 21 } { Fl_Group sel_WKFSK_baud { label {Baud rate} callback {progStatus.WKFSK_baud = o->index(); WKFSK_init();} open tooltip {Nav FSK baud rate} xywh {391 148 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("45.45|50|75|100");} code1 {o->index(progStatus.WKFSK_baud);} class Fl_ListBox } {} Fl_Group sel_WKFSK_stopbits { label {Stop bits} callback {progStatus.WKFSK_stopbits = o->index(); WKFSK_init();} open tooltip {Nav FSK Stop bits} xywh {391 177 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("2|1.5");} code1 {o->index(progStatus.WKFSK_stopbits);} class Fl_ListBox } {} Fl_Group sel_WKFSK_ptt { label {FSK port} callback {progStatus.WKFSK_ptt = o->index(); WKFSK_init();} open tooltip {NavWinkey PTT} xywh {391 206 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("On PTT|On KEY");} code1 {o->index(progStatus.WKFSK_ptt);} class Fl_ListBox } {} Fl_Group sel_WKFSK_polarity { label {Mark Polarity} callback {progStatus.WKFSK_polarity = o->index(); WKFSK_init();} open tooltip {Nav FSK MARK Polarity} xywh {391 236 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Normal|Reverse");} code1 {o->index(progStatus.WKFSK_polarity);} class Fl_ListBox } {} Fl_Group sel_WKFSK_sidetone { label Sidetone callback {progStatus.WKFSK_sidetone = o->index(); WKFSK_init();} open tooltip {Nav FSK side tone} xywh {391 265 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_sidetone);} class Fl_ListBox } {} Fl_Group sel_WKFSK_auto_crlf { label {Auto CRLF} callback {progStatus.WKFSK_auto_crlf = o->index(); WKFSK_init();} open tooltip {Nav FSK side tone} xywh {391 295 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_auto_crlf);} class Fl_ListBox } {} Fl_Group sel_WKFSK_diddle { label Diddle callback {progStatus.WKFSK_diddle = o->index(); WKFSK_init();} open tooltip {Diddle On/OFF} xywh {581 148 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_diddle);} class Fl_ListBox } {} Fl_Group sel_WKFSK_diddle_char { label {Diddle char} callback {progStatus.WKFSK_diddle_char = o->index(); WKFSK_init();} open tooltip {Diddle character} xywh {581 177 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("BLANK|LTRS");} code1 {o->index(progStatus.WKFSK_diddle_char);} class Fl_ListBox } {} Fl_Group sel_WKFSK_usos { label USOS callback {progStatus.WKFSK_usos = o->index(); WKFSK_init();} open tooltip {Unshift on space} xywh {581 206 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_usos);} class Fl_ListBox } {} Fl_Group sel_WKFSK_monitor { label Echo callback {progStatus.WKFSK_monitor = o->index(); WKFSK_init();} open tooltip {Unshift on space} xywh {581 236 78 23} box DOWN_BOX color 7 align 4 when 1 code0 {o->add("Off|On");} code1 {o->index(progStatus.WKFSK_monitor);} class Fl_ListBox } {} } } Fl_Group {} { label {Modem/Thor} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Thor"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/Thor"));} } { Fl_Input txtTHORSecondary { label {Secondary Text} callback {progdefaults.THORsecText = o->value(); progdefaults.changed = true;} tooltip {Text to send during keyboard idle times} xywh {245 51 430 40} type Multiline align 5 when 1 code0 {txtTHORSecondary->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button valTHOR_FILTER { label Filtering callback {progdefaults.THOR_FILTER = o->value(); resetTHOR(); progdefaults.changed = true;} tooltip {Enable DSP prior to decoder} xywh {245 105 80 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.THOR_FILTER);} } Fl_Counter valTHOR_BW { label {Filter bandwidth factor} callback {progdefaults.THOR_BW = o->value(); resetTHOR(); progdefaults.changed = true;} tooltip {Filter bandwidth relative to signal width} xywh {390 105 63 20} type Simple align 8 minimum 1 maximum 2 value 1.5 code0 {o->value(progdefaults.THOR_BW);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Value_Slider valThorCWI { label {CWI threshold} callback {progdefaults.ThorCWI = o->value(); progdefaults.changed = true;} tooltip {CWI detection and suppression} xywh {245 158 260 20} type Horizontal align 1 textsize 14 code0 {o->value(progdefaults.ThorCWI);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } Fl_Check_Button valTHOR_PREAMBLE { label {Preamble Detection} callback {progdefaults.THOR_PREAMBLE = o->value(); progdefaults.changed = true;} tooltip {Detect the THOR preamble Clear the Rx pipeline} xywh {245 200 200 20} down_box DOWN_BOX code0 {o->value(progdefaults.THOR_PREAMBLE);} } Fl_Check_Button valTHOR_SOFTSYMBOLS { label {Soft-symbol decoding} callback {progdefaults.THOR_SOFTSYMBOLS = o->value(); progdefaults.changed = true;} tooltip {Use soft-decision decoding for symbol detection Assists soft-bit decoding} xywh {245 230 190 20} down_box DOWN_BOX code0 {o->value(progdefaults.THOR_SOFTSYMBOLS);} } Fl_Check_Button valTHOR_SOFTBITS { label {Soft-bit decoding} callback {progdefaults.THOR_SOFTBITS = o->value(); progdefaults.changed = true;} tooltip {Use soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabled} xywh {245 260 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.THOR_SOFTBITS);} } Fl_Counter valTHOR_PATHS { label {Paths (hidden)} callback {progdefaults.THOR_PATHS = (int)o->value(); progdefaults.changed = true;} xywh {255 314 75 21} type Simple align 1 minimum 4 maximum 8 step 1 value 5 code0 {o->value(progdefaults.THOR_PATHS);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->hide();} class Fl_Counter2 } Fl_Box thor_image_box { label { Operator Avatar} xywh {616 158 59 74} box FLAT_BOX color 0 align 2 code0 {init_def_thor_avatar(o);} class Fl_Group } } Fl_Group {} { label {Modem/Navtex} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Navtex"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/Navtex"));} } { Fl_Check_Button btnNvtxAdifLog { label {Log Navtex messages to Adif file} callback {progdefaults.NVTX_AdifLog=o->value(); progdefaults.changed = true;} xywh {316 84 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.NVTX_AdifLog);} } Fl_Check_Button btnNvtxKmlLog { label {Log Navtex messages to KML} callback {progdefaults.NVTX_KmlLog=o->value(); progdefaults.changed = true;} tooltip {Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)} xywh {315 130 270 30} down_box DOWN_BOX code0 {o->value(progdefaults.NVTX_KmlLog);} } } Fl_Group {} { label {Modem/Wefax} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Wefax"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Modem/Wefax"));} } { Fl_Counter cntrWEFAX_Shift { label {Frequency shift} callback {progdefaults.WEFAX_Shift=o->value(); progdefaults.changed = true;} tooltip {Frequency shift of WEFAX signal Nominal 800 Hz} xywh {262 50 150 24} align 1 minimum 750 maximum 900 step 10 value 800 code0 {o->value(progdefaults.WEFAX_Shift);} code1 {o->lstep(100.0);} } Fl_Counter cntrWEFAX_Center { label {Center freq} callback {progdefaults.WEFAX_Center=o->value(); progdefaults.changed = true;} tooltip {Center of WEFAX signal Nominal 1900 Hz} xywh {262 99 150 24} align 1 minimum 1000 maximum 2000 step 10 value 1900 code0 {o->value(progdefaults.WEFAX_Center);} code1 {o->lstep(100.0);} } Fl_Counter cntrWEFAX_MaxRows { label {Max Image Rows} callback {progdefaults.WEFAX_MaxRows=o->value(); progdefaults.changed = true;} tooltip {Force save split image} xywh {588 50 150 24} align 1 minimum 1000 maximum 10000 step 100 value 1500 code0 {o->value(progdefaults.WEFAX_MaxRows);} code1 {o->lstep(1000.0);} } Fl_Input btnWefaxSaveDir { label {Fax images destination directory} callback {progdefaults.wefax_save_dir=o->value(); progdefaults.changed = true;} tooltip {Store images in this directory} xywh {216 267 470 24} align 5 code0 {o->value(progdefaults.wefax_save_dir.c_str());} } Fl_Button btnSelectFaxDestDir { label {Directory...} callback {Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(WefaxDestDirSet); fc->show();} tooltip {Select destination directory} xywh {695 267 90 24} } Fl_Check_Button btnWefaxAdifLog { label {Log Wefax messages to Adif file} callback {progdefaults.WEFAX_AdifLog=o->value(); progdefaults.changed = true;} tooltip {Sent and received faxes are logged to Adif file.} xywh {216 298 235 30} down_box DOWN_BOX code0 {o->value(progdefaults.WEFAX_AdifLog);} } Fl_Choice wefax_choice_rx_filter { label Filter callback {progdefaults.wefax_filter=o->value();} open xywh {302 137 110 24} down_box BORDER_BOX code0 {o->add("Narrow|Medium|Wide");} code1 {o->value(progdefaults.wefax_filter < 3 ? progdefaults.wefax_filter : 0);} } {} Fl_Counter auto_after_nrows { label {Enable Auto-align after} callback {progdefaults.wefax_auto_after = o->value(); progdefaults.changed = true;} xywh {588 81 150 24} align 4 minimum 5 maximum 100 step 5 value 50 code0 {o->value(progdefaults.wefax_auto_after);} code1 {o->lstep(50);} } Fl_Counter align_stop_after { label {Stop Auto-align after} callback {progdefaults.wefax_align_stop = o->value(); progdefaults.changed = true;} xywh {588 113 150 24} align 4 minimum 50 maximum 500 step 5 value 500 code0 {o->value(progdefaults.wefax_align_stop);} code1 {o->lstep(50);} } Fl_Counter align_every_nrows { label {Auto-align every} callback {progdefaults.wefax_align_rows = o->value(); if (auto_after_nrows->minimum() < progdefaults.wefax_align_rows) { auto_after_nrows->minimum(progdefaults.wefax_align_rows); auto_after_nrows->value(progdefaults.wefax_align_rows); } progdefaults.changed = true;} xywh {624 145 80 24} type Simple align 4 minimum 5 maximum 100 step 5 value 25 code0 {o->value(progdefaults.wefax_align_rows);} } Fl_Box {} { label rows xywh {743 81 42 22} align 20 } Fl_Box {} { label rows xywh {743 113 42 22} align 20 } Fl_Box {} { label rows xywh {706 146 42 22} align 20 } Fl_Counter wefax_correlation { label Correlation callback {progdefaults.wefax_correlation = o->value(); progdefaults.changed = true;} tooltip {Row-to-row correlation Used to detect presence of WEFAX signal Lower: more false detections} xywh {589 179 150 24} align 4 minimum 0.01 maximum 0.1 step 0.001 value 0.05 code0 {o->value(progdefaults.wefax_correlation);} code1 {o->lstep (0.01);} } Fl_Counter cntr_correlation_rows { label {\# Correlation rows} callback {progdefaults.wefax_correlation_rows = o->value(); progdefaults.changed = true;} tooltip {Compute correlation factor over this \# rows} xywh {624 213 80 24} type Simple align 4 minimum 2 maximum 50 step 1 value 10 code0 {o->value(progdefaults.wefax_correlation_rows);} } } Fl_Group {} { label {Misc/Autostart} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/Autostart"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/Autostart"));} } { Fl_Input txt_auto_flrig_pathname { label {flrig:} callback {progdefaults.auto_flrig_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for flrig} xywh {267 56 310 24} when 1 code0 {o->value(progdefaults.auto_flrig_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_flrig { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_flrig_pathname); txt_auto_flrig_pathname->value(str.c_str()); progdefaults.auto_flrig_pathname = str; progdefaults.changed = true;} tooltip {Locate flrig executable} xywh {599 56 70 24} } Fl_Input txt_auto_flamp_pathname { label {flamp:} callback {progdefaults.auto_flamp_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for flamp} xywh {267 94 310 24} when 1 code0 {o->value(progdefaults.auto_flamp_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_auto_flamp { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_flamp_pathname); txt_auto_flamp_pathname->value(str.c_str()); progdefaults.auto_flamp_pathname = str; progdefaults.changed = true;} tooltip {Locate flamp executable} xywh {599 94 70 24} } Fl_Input txt_auto_flnet_pathname { label {flnet:} callback {progdefaults.auto_flnet_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for flnet} xywh {267 132 310 24} when 1 code0 {o->value(progdefaults.auto_flnet_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_auto_flnet { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_flnet_pathname); txt_auto_flnet_pathname->value(str.c_str()); progdefaults.auto_flnet_pathname = str; progdefaults.changed = true;} tooltip {Locate flnet executable} xywh {599 132 70 24} } Fl_Input txt_auto_fllog_pathname { label {fllog:} callback {progdefaults.auto_fllog_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for fllog} xywh {267 171 310 24} when 1 code0 {o->value(progdefaults.auto_fllog_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_fllog { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_fllog_pathname); txt_auto_fllog_pathname->value(str.c_str()); progdefaults.auto_fllog_pathname = str; progdefaults.changed = true;} tooltip {Locate fllog executable} xywh {599 171 70 24} } Fl_Input txt_auto_prog1_pathname { label {Prog 1:} callback {progdefaults.auto_prog1_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program} xywh {267 209 310 24} when 1 code0 {o->value(progdefaults.auto_prog1_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_prog1 { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_prog1_pathname); txt_auto_prog1_pathname->value(str.c_str()); progdefaults.auto_prog1_pathname = str; progdefaults.changed = true;} tooltip {Locate program \#1 executable} xywh {599 209 70 24} } Fl_Input txt_auto_prog2_pathname { label {Prog 2:} callback {progdefaults.auto_prog2_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program} xywh {267 247 310 24} when 1 code0 {o->value(progdefaults.auto_prog2_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_prog2 { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_prog2_pathname); txt_auto_prog2_pathname->value(str.c_str()); progdefaults.auto_prog2_pathname = str; progdefaults.changed = true;} tooltip {Locate program \#2 executable} xywh {599 247 70 24} } Fl_Input txt_auto_prog3_pathname { label {Prog 3:} callback {progdefaults.auto_prog3_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for external program} xywh {267 286 310 24} when 1 code0 {o->value(progdefaults.auto_prog3_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_prog3 { label Locate callback {std::string str = select_binary_pathname(progdefaults.auto_prog3_pathname); txt_auto_prog3_pathname->value(str.c_str()); progdefaults.auto_prog3_pathname = str; progdefaults.changed = true;} tooltip {Locate program \#3 executable} xywh {599 286 70 24} } Fl_Check_Button btn_flrig_auto_enable { label {Enable -} callback {progdefaults.flrig_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {679 60 19 15} down_box DOWN_BOX align 1 code0 {o->value(progdefaults.flrig_auto_enable);} } Fl_Check_Button btn_flamp_auto_enable { callback {progdefaults.flamp_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {679 98 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.flamp_auto_enable);} } Fl_Check_Button btn_flnet_auto_enable { callback {progdefaults.flnet_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {679 136 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.flnet_auto_enable);} } Fl_Check_Button btn_fllog_auto_enable { callback {progdefaults.fllog_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {679 175 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.fllog_auto_enable);} } Fl_Check_Button btn_prog1_auto_enable { callback {progdefaults.prog1_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {679 213 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.prog1_auto_enable);} } Fl_Check_Button btn_prog2_auto_enable { callback {progdefaults.prog2_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {679 251 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.prog2_auto_enable);} } Fl_Check_Button btn_prog3_auto_enable { callback {progdefaults.prog3_auto_enable = o->value(); progdefaults.changed = true;} tooltip {Enable this entry when fldigi first starts} xywh {679 290 23 15} down_box DOWN_BOX code0 {o->value(progdefaults.prog3_auto_enable);} } Fl_Button btn_test_flrig { label Test callback {start_process(progdefaults.auto_flrig_pathname);} tooltip {Start flrig} xywh {709 56 70 24} } Fl_Button btn_test_flamp { label Test callback {start_process(progdefaults.auto_flamp_pathname);} tooltip {Start flamp} xywh {709 94 70 24} } Fl_Button btn_test_flnet { label Test callback {start_process(progdefaults.auto_flnet_pathname);} tooltip {Start flnet} xywh {709 132 70 24} } Fl_Button btn_test_fllog { label Test callback {start_process(progdefaults.auto_fllog_pathname);} tooltip {Start fllog} xywh {709 171 70 24} } Fl_Button btn_test_prog1 { label Test callback {start_process(progdefaults.auto_prog1_pathname);} tooltip {Start prog1} xywh {709 209 70 24} } Fl_Button btn_test_prog2 { label Test callback {start_process(progdefaults.auto_prog2_pathname);} tooltip {Start prog2} xywh {709 247 70 24} } Fl_Button btn_test_prog3 { label Test callback {start_process(progdefaults.auto_prog3_pathname);} tooltip {Start prog3} xywh {709 286 70 24} } } Fl_Group {} { label {Misc/CPU} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/CPU"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/CPU"));} } { Fl_Check_Button chkSlowCpu { label {Slow CPU (less than 700MHz)} callback {progdefaults.slowcpu = o->value(); progdefaults.changed = true;} tooltip {Enable if you're computer does not decode properly} xywh {305 65 225 20} down_box DOWN_BOX code0 {o->value(progdefaults.slowcpu);} } } Fl_Group {} { label {Misc/DTMF} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/DTMF"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/DTMF"));} } { Fl_Check_Button chkDTMFdecode { label {Decode DTMF tones} callback {progdefaults.DTMFdecode = o->value();} tooltip {Decode received DTMF tones} xywh {372 79 175 20} down_box DOWN_BOX code0 {o->value(progdefaults.DTMFdecode);} } } Fl_Group {} { label {Misc/KML} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/KML"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/KML"));} } { Fl_Input btnKmlSaveDir { label {KML files directory} callback {progdefaults.kml_save_dir=o->value(); progdefaults.changed = true; kml_init();} tooltip {Where generated KML documents are stored.} xywh {232 47 390 24} align 69 code0 {o->value(progdefaults.kml_save_dir.c_str());} } Fl_Input inputKmlRootFile { label {KML root file} xywh {231 91 300 24} align 5 code0 {o->value("fldigi.kml");} } Fl_Counter cntKmlMergeDistance { label {Minimum distance for splitting aliases (Meters)} callback {progdefaults.kml_merge_distance = o->value(); progdefaults.changed = true; kml_init();} tooltip {Minimum distance for splitting alias nodes (Meters)} xywh {232 127 100 24} align 8 minimum 0 maximum 100000 step 10 value 1000 code0 {o->value(progdefaults.kml_merge_distance);} code1 {o->lstep(1000);} } Fl_Counter cntKmlRetentionTime { label {Data retention time, in hours (0 for no limit)} callback {progdefaults.kml_retention_time = o->value(); progdefaults.changed = true; kml_init();} tooltip {Number of hours data is kept for each node. Zero means keeping everything.} xywh {231 163 100 24} align 8 minimum 0 maximum 500 step 1 code0 {o->value(progdefaults.kml_retention_time);} code1 {o->lstep(24);} } Fl_Spinner cntKmlRefreshInterval { label {KML refresh interval (seconds)} callback {progdefaults.kml_refresh_interval = (int)(o->value()); progdefaults.changed = true; kml_init();} tooltip {Refresh time interval written in KML file (Seconds)} xywh {230 199 50 24} align 8 value 10 code0 {o->minimum(1); o->maximum(3600); o->step(1);} code1 {o->value(progdefaults.kml_refresh_interval);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Group listbox_kml_balloon_style { label {KML balloon display style} callback {progdefaults.kml_balloon_style = o->index(); progdefaults.changed = true; kml_init();} tooltip {KML balloon in plain text, or HTML, in plain tables or matrices.} xywh {230 235 201 24} box DOWN_BOX color 7 align 8 when 1 code0 {o->add("Plain text|HTML tables|Single HTML matrix");o->index(progdefaults.kml_balloon_style);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Input btnKmlCommand { label {Command run on KML creation} callback {progdefaults.kml_command=o->value(); progdefaults.changed = true; kml_init();} tooltip {Command started when KML files are generated. Subprocesses are started once, and restarted if needed.} xywh {230 271 246 24} align 72 code0 {o->value(progdefaults.kml_command.c_str());} } Fl_Button btlTestKmlCommand { label {Test command} callback {KmlServer::SpawnProcess();} tooltip {Execute command on KML files.} xywh {230 307 191 24} } Fl_Button btnSelectKmlDestDir { label {Change dir...} callback {Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(KmlDestDirSet); fc->show();} tooltip {Choose directory to store KML documents} xywh {631 47 101 24} } Fl_Button btlPurge { label {Cleanup KML data now !} callback {KmlServer::GetInstance()->Reset();} tooltip {Cleanups KML documents, empties Google Earth display.} xywh {542 91 190 24} } Fl_Check_Button btnKmlPurgeOnStartup { label {Cleanup on startup} callback {progdefaults.kml_purge_on_startup = o->value(); progdefaults.changed = true;} tooltip {Empties KML documents when starting program.} xywh {528 203 172 15} down_box DOWN_BOX code0 {o->value(progdefaults.kml_purge_on_startup);} } Fl_Group {} {open xywh {475 301 310 40} box ENGRAVED_FRAME } { Fl_Check_Button btn_kml_enabled { label {KML server enabled (On / Off)} callback {progdefaults.kml_enabled = o->value(); if (progdefaults.kml_enabled) { kml_init(true); progdefaults.changed = true; } else { KmlServer::Exit(); }} tooltip {Uncheck if KML is never used} xywh {497 311 242 19} down_box DOWN_BOX code0 {o->value(progdefaults.kml_enabled);} } } } Fl_Group {} { label {Misc/NBEMS interface} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/NBEMS interface"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/NBEMS interface"));} } { Fl_Group {} { label {NBEMS data file interface} open xywh {251 35 500 75} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkAutoExtract { label Enable callback {progdefaults.autoextract = o->value(); progdefaults.changed = true;} tooltip {Extract files for use with external "wrap / flmsg" program} xywh {305 66 75 20} down_box DOWN_BOX code0 {o->value(progdefaults.autoextract);} } Fl_Check_Button chk_open_wrap_folder { label {Open message folder} callback {progdefaults.open_nbems_folder = o->value(); progdefaults.changed = true;} tooltip {Opens NBEMS file folder upon successful capture} xywh {511 66 146 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_nbems_folder);} } } Fl_Group {} { label {Reception of flmsg files} open xywh {251 111 500 199} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chk_open_flmsg { label {Open with flmsg} callback {progdefaults.open_flmsg = o->value(); progdefaults.changed = true;} tooltip {Open message with flmsg} xywh {305 211 136 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_flmsg);} } Fl_Check_Button chk_open_flmsg_print { label {Open in browser} callback {progdefaults.open_flmsg_print = o->value(); progdefaults.changed = true;} tooltip {Open file with default browser} xywh {511 211 136 20} down_box DOWN_BOX code0 {o->value(progdefaults.open_flmsg_print);} } Fl_Input txt_flmsg_pathname { label {flmsg:} callback {progdefaults.flmsg_pathname = o->value(); progdefaults.changed = true;} tooltip {Enter full path-filename for flmsg} xywh {305 241 330 24} when 1 code0 {o->value(progdefaults.flmsg_pathname.c_str());} class Fl_Input2 } Fl_Button btn_select_flmsg { label {Locate flmsg} callback {select_flmsg_pathname();} tooltip {Locate flmsg executable} xywh {642 241 100 24} } Fl_Value_Slider sldr_extract_timeout { label {Timeout (secs)} callback {progdefaults.extract_timeout=o->value(); progdefaults.changed=true;} tooltip {Extract times out after NN seconds of inactivity.} xywh {271 279 364 21} type {Horz Knob} color 54 selection_color 0 align 8 minimum 1 maximum 20 step 0.5 value 10 textsize 14 code0 {o->value(progdefaults.extract_timeout);} } Fl_Group {} { label {Selection of transfer direct takes precedence over all other flmsg reception settings} open xywh {256 130 490 76} box ENGRAVED_FRAME align 17 } { Fl_Check_Button chk_transfer__to_open_flmsg { label {Transfer direct to executing flmsg} callback {progdefaults.flmsg_transfer_direct = o->value(); progdefaults.changed = true;} tooltip {Send data stream directly to executing flmsg} xywh {361 174 271 20} down_box DOWN_BOX code0 {o->value(progdefaults.flmsg_transfer_direct);} } } } } Fl_Group {} { label {Misc/PSK reporter} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/PSK reporter"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/PSK reporter"));} } { Fl_Check_Button btnPSKRepAuto { label {Automatically spot callsigns in decoded text} callback {progdefaults.pskrep_auto = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {Parse all incoming text} xywh {252 65 324 20} down_box DOWN_BOX code0 {btnPSKRepAuto->value(progdefaults.pskrep_auto);} } Fl_Check_Button btnPSKRepLog { label {Send reception report when logging a QSO} callback {progdefaults.pskrep_log = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {Send report only when QSO is logged} xywh {252 96 327 20} down_box DOWN_BOX code0 {btnPSKRepLog->value(progdefaults.pskrep_log);} } Fl_Check_Button btnPSKRepQRG { label {Report rig frequency (enable only if you have rig control!)} callback {progdefaults.pskrep_qrg = o->value(); progdefaults.changed = true;} tooltip {Include the transmit frequency} xywh {252 128 416 20} down_box DOWN_BOX code0 {btnPSKRepQRG->value(progdefaults.pskrep_qrg);} } Fl_Check_Button btn_report_when_visible { label {Disable spotting when signal browser(s) are not visible.} callback {progdefaults.report_when_visible = o->value(); progdefaults.changed = true;} tooltip {Check to reduce CPU load in PSK and RTTY modes.} xywh {252 160 416 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.report_when_visible);} } Fl_Check_Button btn_pskrep_autostart { label {Log on to pskrep when starting fldigi} callback {progdefaults.pskrep_autostart = o->value(); progdefaults.changed = true;} tooltip {Automatically start psk reporter socket connection} xywh {252 192 291 20} down_box DOWN_BOX code0 {o->value(progdefaults.pskrep_autostart);} } Fl_Box box_connected_to_pskrep { label Connected xywh {562 193 18 18} box DIAMOND_DOWN_BOX color 7 align 8 } Fl_Input inpPSKRepHost { label {Host:} callback {progdefaults.pskrep_host = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {To whom the connection is made} xywh {295 230 220 24} when 1 code0 {inpPSKRepHost->value(progdefaults.pskrep_host.c_str());} code1 {inpPSKRepHost->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpPSKRepPort { label {Port:} callback {progdefaults.pskrep_port = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true;} tooltip {Using UDP port \#} xywh {664 230 60 24} when 1 code0 {inpPSKRepPort->value(progdefaults.pskrep_port.c_str());} code1 {inpPSKRepPort->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnPSKRepInit { label Initialize callback {pskrep_stop(); if (!pskrep_start()) { boxPSKRepMsg->copy_label(pskrep_error()); progdefaults.usepskrep = false; box_connected_to_pskrep->color(FL_WHITE); box_connected_to_pskrep->redraw(); } else { boxPSKRepMsg->label(0); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.usepskrep = true; box_connected_to_pskrep->color(FL_GREEN); box_connected_to_pskrep->redraw(); }} tooltip {Initialize the socket client} xywh {644 275 80 24} } Fl_Box boxPSKRepMsg { label {} xywh {254 259 300 48} labelfont 2 code0 {boxPSKRepMsg->label(0);} } } Fl_Group {} { label {Misc/PSM} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/PSM"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/PSM"));} } { Fl_Group {} {open xywh {204 32 590 108} box ENGRAVED_BOX align 21 } { Fl_Counter cntBusyChannelSeconds { label {Allow TX After Signal Detection (Secs)} callback {progStatus.busyChannelSeconds = (int) o->value(); progdefaults.busyChannelSeconds = (int) o->value(); progdefaults.changed = true;} tooltip {Allow transmits after 'N' seconds of a signal detection.} xywh {380 38 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.busyChannelSeconds);} code1 {o->step(1,10);} } Fl_Check_Button btnEnableBusyChannel { label {Enable Busy Channel} callback {if(o->value()) { progStatus.enableBusyChannel = true; progdefaults.enableBusyChannel = true; } else { progStatus.enableBusyChannel = false; progdefaults.enableBusyChannel = false; } progdefaults.changed = true;} tooltip {Enable to inhibit TX on signal Detections} xywh {210 40 115 20} down_box DOWN_BOX code0 {if(progdefaults.enableBusyChannel) o->value(true);} code1 {else o->value(false);} } Fl_Counter cntPSMTXBufferFlushTimer { label {TX Buffer Flush Timer (Mins, 0=Disable)} callback {progStatus.psm_flush_buffer_timeout = (int) o->value(); progdefaults.psm_flush_buffer_timeout = (int) o->value(); progdefaults.changed = true;} tooltip {Flushes the TX buffer after x period when Busy Channel remains on (TX inhibited)} xywh {380 63 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.psm_flush_buffer_timeout);} code1 {o->step(1,10); o->minimum(0); o->maximum(999);} } Fl_Counter cntPSMBandwidthMargins { label {Modem Bandwidth Margins } callback {progStatus.psm_minimum_bandwidth_margin = (int) o->value(); progdefaults.psm_minimum_bandwidth_margin = (int) o->value(); progdefaults.changed = true;} tooltip {Monitor signals in modem bandwitdh plus margins.} xywh {380 88 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.psm_minimum_bandwidth_margin);} code1 {o->step(1,10);} } Fl_Counter cntPSMValidSamplePeriod { label {Valid Signal Sample Period (msecs)} callback {progStatus.psm_hit_time_window = (int) o->value(); progdefaults.psm_hit_time_window = (int) o->value(); progdefaults.changed = true;} tooltip {Valid signal sample period in Milliseconds} xywh {380 114 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.psm_hit_time_window);} code1 {o->step(1,10);} } } Fl_Group {} {open xywh {204 140 590 84} box ENGRAVED_BOX align 21 } { Fl_Check_Button btnEnable_csma { label {Enable CSMA} callback {if(o->value()) { progStatus.csma_enabled = true; progdefaults.csma_enabled = true; } else { progStatus.csma_enabled = false; progdefaults.csma_enabled = false; } progdefaults.changed = true;} tooltip {Carrier Sense Mulitiple Access} xywh {214 148 114 20} down_box DOWN_BOX code0 {if(progdefaults.csma_enabled) o->value(true);} } Fl_Counter cntPersistance { label Persistance callback {progStatus.csma_persistance = (int) o->value(); progdefaults.csma_persistance = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_PERSISTANCE);} tooltip {Used to adjust the aggressiveness of TX} xywh {333 148 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.csma_persistance);} code1 {o->step(1,10); o->minimum(0); o->maximum(255);} } Fl_Counter cntSlotTime { label {Slot Time} callback {progStatus.csma_slot_time = (int) o->value(); progdefaults.csma_slot_time = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_SLOT_TIME);} tooltip {Non transmit window after a transmit period} xywh {333 173 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.csma_slot_time);} code1 {o->step(1,10); o->minimum(1); o->maximum(255);} } Fl_Counter cntTransmitDelay { label {Transmit Data Delay} callback {progStatus.csma_transmit_delay = (int) o->value(); progdefaults.csma_transmit_delay = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_TX_DELAY);} tooltip {Idle transmit before data sent} xywh {333 198 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.csma_transmit_delay);} code1 {o->step(1,10); o->minimum(1); o->maximum(255);} } Fl_Output OutputSlotTimeMS { label MilliSeconds tooltip {Displays the Slot Time in Milliseconds} xywh {599 173 95 20} align 8 } Fl_Output OutputTransmitDelayMS { label MilliSeconds tooltip {Displays the Transmit Delay in Milliseconds} xywh {599 198 95 20} align 8 } Fl_Output OutputPersistancePercent { label {Percent (%)} tooltip {Displays the Slot Time in Milliseconds} xywh {599 147 95 20} align 8 } } Fl_Group {} {open xywh {204 223 590 31} box ENGRAVED_BOX align 21 } { Fl_Check_Button btnEnable_histogram { label {Enable Histogram} callback {if(o->value()) { progStatus.psm_use_histogram = true; progdefaults.psm_use_histogram = true; } else { progStatus.psm_use_histogram = false; progdefaults.psm_use_histogram = false; } progdefaults.changed = true;} tooltip {Enable Histogram threshold signal monitoring} xywh {216 230 139 20} down_box DOWN_BOX code0 {if(progdefaults.psm_use_histogram) o->value(true);} } Fl_Counter cntPSMThreshold { label {PSM Histogram Threshold} callback {progStatus.psm_histogram_offset_threshold = (int) o->value(); progdefaults.psm_histogram_offset_threshold = (int) o->value(); progdefaults.changed = true;} tooltip {Sets the theshold level to x value above the noise level} xywh {380 230 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.psm_histogram_offset_threshold);} code1 {o->step(1,10); o->minimum(1); o->maximum(20);} } } Fl_Group {} {open xywh {204 254 590 34} box ENGRAVED_BOX align 21 } { Fl_Counter cntKPSQLAttenuation { label {PSM Attenuate} callback {progStatus.kpsql_attenuation = (int) o->value(); progdefaults.kpsql_attenuation = (int) o->value(); update_kpsql_fractional_gain(progStatus.kpsql_attenuation); progdefaults.changed = true;} tooltip {Adjust sensitivity by 1/N fractional values.} xywh {380 261 110 20} align 8 minimum 1 maximum 999 step 1 value 1 code0 {o->value(progdefaults.kpsql_attenuation);} code1 {o->step(1,10); o->minimum(1); o->maximum(999);} code2 {update_kpsql_fractional_gain(progdefaults.kpsql_attenuation);} } } Fl_Group {} {open xywh {204 287 590 28} box ENGRAVED_BOX align 21 } { Fl_Check_Button btn_show_psm_button { label {Show and enable Power Signal Monitor button (PSM)} callback {progdefaults.show_psm_btn = o->value(); UI_select(); progdefaults.changed = true;} tooltip {display PSM button on main dialog} xywh {214 291 150 20} down_box DOWN_BOX code0 {o->value(progdefaults.show_psm_btn);} } } Fl_Button btnBuyChannelDefaults { label {Default Settings} callback {psm_set_defaults();} xywh {669 320 126 22} } } Fl_Group {} { label {Misc/Rx text capture} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/Rx text capture"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/Rx text capture"));} } { Fl_Group grpTalker { label {Talker Socket (MS only)} open xywh {252 107 490 73} box ENGRAVED_FRAME align 21 } { Fl_Light_Button btnConnectTalker { label Talker callback {if (o->value()) open_talker(); else close_talker();} xywh {278 127 74 20} selection_color 60 code0 {extern void open_talker();} code1 {extern void close_talker();} } Fl_Box {} { label {Connect/disconnect to Talker socket server} xywh {357 127 345 20} align 20 } Fl_Check_Button btn_auto_talk { label {Auto connect when fldigi opens (server must be up)} callback {progdefaults.auto_talk = o->value();} xywh {278 155 391 15} down_box DOWN_BOX code0 {o->value(progdefaults.auto_talk);} } } Fl_Group {} { label {Capture rx text to external file} open xywh {252 47 490 56} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkRxStream { label {Enable rx text stream} callback {progdefaults.speak = o->value(); progdefaults.changed = true;} tooltip {Send rx text to file: textout.txt} xywh {278 74 175 20} down_box DOWN_BOX code0 {o->value(progdefaults.speak);} } } } Fl_Group {} { label {Misc/Save Parameters} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/Save Parameters"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/Save Parameters"));} } { Fl_Check_Button btnTXLEVEL_by_mode { label {Transmit level control} callback {progdefaults.txlevel_by_mode=o->value(); progdefaults.changed = true;} tooltip {Save transmit level control by mode} xywh {360 96 235 30} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.txlevel_by_mode);} } Fl_Check_Button btnSQLCH_by_mode { label {Squelch level/activated control(s)} callback {progdefaults.sqlch_by_mode=o->value(); progdefaults.changed = true;} tooltip {Save Squelch level and state by mode} xywh {360 140 270 30} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.sqlch_by_mode);} } Fl_Box {} { label {Enable specific parameter to Save & Restore on a per mode/band basis.} xywh {211 28 575 39} box ENGRAVED_BOX color 53 labelsize 13 align 16 } Fl_Check_Button btnAFC_by_mode { label {AFC control} callback {progdefaults.afc_by_mode=o->value(); progdefaults.changed = true;} tooltip {Save AFC state by mode} xywh {360 184 270 30} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.afc_by_mode);} } Fl_Check_Button btnREVERSE_by_mode { label {Reverse (Rv) control} callback {progdefaults.reverse_by_mode=o->value(); progdefaults.changed = true;} tooltip {Save Reverse state by mode} xywh {360 228 270 30} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.reverse_by_mode);} } } Fl_Group {} { label {Misc/Sweet Spot} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/Sweet Spot"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/Sweet Spot"));} } { Fl_Group {} {open xywh {253 70 490 75} box ENGRAVED_FRAME align 21 } { Fl_Value_Input valCWsweetspot { label CW callback {progdefaults.CWsweetspot=o->value(); progdefaults.changed = true;} tooltip {Default CW tracking point} xywh {290 81 65 20} minimum 200 maximum 4000 step 1 value 1000 code0 {o->value(progdefaults.CWsweetspot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input valRTTYsweetspot { label RTTY callback {progdefaults.RTTYsweetspot=o->value(); cntr_xcvr_FSK_MARK->value(progdefaults.RTTYsweetspot - rtty::SHIFT[progdefaults.rtty_shift] / 2); resetRTTY(); progdefaults.changed = true;} tooltip {Default RTTY tracking point} xywh {468 81 65 20} minimum 200 maximum 4000 step 1 value 1000 code0 {o->value(progdefaults.RTTYsweetspot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input valPSKsweetspot { label {PSK et al.} callback {progdefaults.PSKsweetspot=o->value(); progdefaults.changed = true;} tooltip {Default for all other modems} xywh {668 81 65 20} minimum 200 maximum 4000 step 1 value 1000 code0 {o->value(progdefaults.PSKsweetspot);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Check_Button btnStartAtSweetSpot { label {Always start new modems at these frequencies} callback {progdefaults.StartAtSweetSpot = o->value(); progdefaults.changed = true;} tooltip {ON - start at default OFF - keep current wf cursor position} xywh {263 111 348 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.StartAtSweetSpot);} } } Fl_Group {} { label {K3 A1A configuation} open xywh {253 150 490 60} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnCWIsLSB { label {CW is LSB} callback {progdefaults.CWIsLSB=o->value(); progdefaults.changed=true;} tooltip {Select this for Elecraft K3 Other radios should not need it.} xywh {468 171 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.CWIsLSB);} } } } Fl_Group {} { label {Misc/TCP-IP sessions} callback {btnDisable_p2p_io_widgets->value(1);} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/TCP-IP sessions"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Misc/TCP-IP sessions"));} code3 {tab_tree->close(_("Misc"));} } { Fl_Group {} {open xywh {205 18 588 102} box ENGRAVED_BOX align 21 } { Fl_Check_Button btnDisable_p2p_io_widgets { label Lock user_data_type long callback {progStatus.ip_lock = o->value(); if(o->value()) disable_config_p2p_io_widgets(); else enable_config_p2p_io_widgets(); kiss_io_set_button_state(0);} tooltip {Allow/Disallow Changes} xywh {211 96 85 20} down_box DOWN_BOX code0 {o->value(progStatus.ip_lock);} } Fl_Check_Button btnEnable_arq { label {Enable ARQ} callback {if(o->value()) { enable_arq(); } progdefaults.changed = true;} tooltip {Used For PSKMail and FLDIGI Suite of Programs} xywh {295 96 115 20} type Radio down_box DOWN_BOX code0 {if(progStatus.data_io_enabled == ARQ_IO) o->value(true);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnEnable_kiss { label {Enable KISS} callback {if(o->value()) { enable_kiss(); } progdefaults.changed = true;} tooltip {Used for BPQ32} xywh {420 96 115 20} type Radio down_box DOWN_BOX code0 {if(progStatus.data_io_enabled == KISS_IO) o->value(true);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Box {} { label {Enable ARQ for programs that support TCP and FLDIGI ARQ protocol. Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol. Only one interface (ARQ/KISS) can be active at any given time. KISS/ARQ/XML Addr/Port changes require program restart.} xywh {207 21 582 72} } } Fl_Group {} { label KISS open xywh {205 122 588 80} box ENGRAVED_FRAME align 21 } { Fl_Input txtKiss_ip_address { label Addr callback {progStatus.kiss_address = o->value(); progdefaults.kiss_address = o->value(); progdefaults.changed = true;} tooltip {IP Address for KISS interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {254 175 230 22} align 8 when 1 code0 {txtKiss_ip_address->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.kiss_address.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txtKiss_ip_io_port_no { label {I/O} callback {progStatus.kiss_io_port = o->value(); progdefaults.kiss_io_port = o->value(); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {529 175 55 22} align 8 when 1 code0 {txtKiss_ip_io_port_no->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.kiss_io_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txtKiss_ip_out_port_no { label O callback {progStatus.kiss_out_port = o->value(); progdefaults.kiss_out_port = o->value(); progdefaults.changed = true;} tooltip {Output port number when same IP address used} xywh {621 175 55 22} align 8 when 1 code0 {txtKiss_ip_out_port_no->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.kiss_out_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Check_Button btnEnable_dual_port { label DP callback {if(o->value()) { progStatus.kiss_dual_port_enabled = true; progdefaults.kiss_dual_port_enabled = true; } else { progStatus.kiss_dual_port_enabled = false; progdefaults.kiss_dual_port_enabled = false; } progdefaults.changed = true;} tooltip {Enable when both programs are using the same IP address} xywh {330 126 140 20} down_box DOWN_BOX code0 {if(progdefaults.kiss_dual_port_enabled) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btn_restart_kiss { label Restart callback {//restart_kiss_server();} xywh {705 149 82 22} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btn_connect_kiss_io { label Start callback {connect_to_kiss_io(true);} tooltip {Return KISS TCP IO connection to a Listening state} xywh {617 149 82 22} code0 {(progStatus.ip_lock || !progdefaults.kiss_tcp_io) ? o->deactivate() : o->activate();} } Fl_Button btnDefault_kiss_ip { label Default callback {set_ip_to_default(KISS_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {705 175 82 22} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnKissTCPIO { label {TCP/IP} callback {if(o->value()) { progStatus.kiss_tcp_io = true; progdefaults.kiss_tcp_io = true; } else { progStatus.kiss_tcp_io = false; progdefaults.kiss_tcp_io = false; } kiss_io_set_button_state(0); progdefaults.changed = true;} tooltip {Check to enable TCP/IP IO Connection} xywh {416 126 70 20} down_box DOWN_BOX code0 {if(progdefaults.kiss_tcp_io) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnKissUDPIO { label {UDP/IP} callback {if(o->value()) { progStatus.kiss_tcp_io = false; progdefaults.kiss_tcp_io = false; } else { progStatus.kiss_tcp_io = true; progdefaults.kiss_tcp_io = true; } kiss_io_set_button_state(0); progdefaults.changed = true;} tooltip {Check to enable UDP/IP IO} xywh {254 126 70 20} down_box DOWN_BOX code0 {if(progdefaults.kiss_tcp_io) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnKissTCPListen { label {Listen / Bind} callback {if(o->value()) { progStatus.kiss_tcp_listen = true; progdefaults.kiss_tcp_listen = true; } else { progStatus.kiss_tcp_listen = false; progdefaults.kiss_tcp_listen = false; } progdefaults.changed = true;} tooltip {Monitor for TCP connection.} xywh {500 126 95 20} down_box DOWN_BOX code0 {if(progStatus.kiss_tcp_listen) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnEnable_7bit_modem_inhibit { label {Inhibit 7bit Modem} callback {if(o->value()) { progStatus.kiss_io_modem_change_inhibit = true; progdefaults.kiss_io_modem_change_inhibit = true; } else { progStatus.kiss_io_modem_change_inhibit = false; progdefaults.kiss_io_modem_change_inhibit = false; } progdefaults.changed = true;} tooltip {Inhibit 7 bit modem change notice on user or RSID reception} xywh {254 149 140 20} down_box DOWN_BOX code0 {if(progdefaults.kiss_io_modem_change_inhibit) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnEnable_auto_connect { label {Auto Connect / Retry} callback {if(o->value()) { progdefaults.tcp_udp_auto_connect = true; } else { progdefaults.tcp_udp_auto_connect = false; } progdefaults.changed = true;} tooltip {Connect to host program on FLDIGI start up} xywh {416 149 155 20} down_box DOWN_BOX code0 {if(progdefaults.tcp_udp_auto_connect) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Check_Button btnEnable_ax25_decode { label {AX25 Decode} callback {if(o->value()) { progStatus.ax25_decode_enabled = true; progdefaults.ax25_decode_enabled = true; } else { progStatus.ax25_decode_enabled = false; progdefaults.ax25_decode_enabled = false; } progdefaults.changed = true;} tooltip {Decode AX25 Packets into human readable form} xywh {610 126 115 20} down_box DOWN_BOX code0 {if(progdefaults.ax25_decode_enabled) o->value(true); else o->value(false);} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } Fl_Group {} { label ARQ open xywh {205 203 588 35} box ENGRAVED_FRAME align 21 } { Fl_Input txtArq_ip_address { label Addr callback {progdefaults.arq_address = o->value(); progdefaults.changed = true;} tooltip {IP Address for ARQ interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {255 207 230 22} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.arq_address.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txtArq_ip_port_no { label Port callback {progdefaults.arq_port = o->value(); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {529 207 55 22} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.arq_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Button btnDefault_arq_ip { label Default callback {set_ip_to_default(ARQ_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {624 207 73 22} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btn_restart_arq { label Restart callback {//arq_restart();} xywh {704 207 82 22} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } Fl_Group {} { label XML open xywh {205 239 588 35} box ENGRAVED_FRAME align 21 } { Fl_Button btnDefault_xmlrpc_ip { label Default callback {set_ip_to_default(XMLRPC_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {624 243 73 22} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Input txtXmlrpc_ip_address { label Addr callback {progdefaults.xmlrpc_address = o->value(); progdefaults.changed = true;} tooltip {IP Address for XMLRPC interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {255 243 230 22} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.xmlrpc_address.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txtXmlrpc_ip_port_no { label Port callback {progdefaults.xmlrpc_port = o->value(); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {529 243 55 22} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.xmlrpc_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Button btn_restart_xml { label Restart callback {//restart_xml_server();} xywh {704 243 82 22} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } Fl_Group {} { label flrig open xywh {205 277 588 30} box ENGRAVED_FRAME align 21 } { Fl_Button btnDefault_flrig_ip { label Default callback {set_ip_to_default(FLRIG_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {624 282 73 25} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Input txt_flrig_ip_address { label Addr callback {progdefaults.flrig_ip_address = o->value(); progdefaults.changed = true;} tooltip {IP Address for flrig interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {255 282 230 22} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.flrig_ip_address.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Input txt_flrig_ip_port { label Port callback {progdefaults.flrig_ip_port = o->value(); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {529 282 55 22} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.flrig_ip_port.c_str());} code2 {progStatus.ip_lock ? o->deactivate() : o->activate();} class Fl_Input2 } Fl_Button btn_reconnect_flrig_server { label Reconnect callback {reconnect_to_flrig();} xywh {704 282 82 22} code0 {\#include "rigsupport.h"} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } Fl_Group {} { label fllog open xywh {205 308 588 36} box ENGRAVED_FRAME align 21 } { Fl_Input txt_fllog_ip_address { label Addr callback {progdefaults.xmllog_address = o->value();} tooltip {IP Address for fllog interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {255 313 230 22} align 8 code0 {o->value(progdefaults.xmllog_address.c_str());} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Input txt_fllog_ip_port { label Port callback {progdefaults.xmllog_port = o->value();} tooltip {IP Address Port Number} xywh {529 313 55 22} align 8 code0 {o->value(progdefaults.xmllog_port.c_str());} code1 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btn_reconnect_log_server { label Reconnect callback {progdefaults.xml_logbook = true; progdefaults.changed = true; connect_to_log_server();} xywh {704 313 82 22} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } Fl_Button btnDefault_fllog_ip { label Default callback {set_ip_to_default(FLLOG_IO); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {624 313 73 22} code0 {progStatus.ip_lock ? o->deactivate() : o->activate();} } } } Fl_Group grpOperator { label {Operator-Station} open xywh {200 0 600 350} box ENGRAVED_BOX color 50 align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Operator-Station"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Operator-Station"));} } { Fl_Input inpMyCallsign { label {Station Callsign:} callback {const char *triggers = " !\#$%&'()*+,-.;<=>?@[\\\\]^_{|}~"; std::string mycall = inpMyCallsign->value(); bool modified = false; for (size_t k = 0; k < mycall.length(); k++) { for (size_t n = 0; n < strlen(triggers); n++) { if (mycall[k] == triggers[n]) { if ( fl_choice2("Replace FSQ trigger character with slash /", _("no"), _("yes"), NULL ) ) { mycall[k] = '/'; modified = true; } } } } if (modified) { int p = inpMyCallsign->position(); inpMyCallsign->value(mycall.c_str()); inpMyCallsign->position(p); // causes a redraw } progdefaults.myCall = mycall; if (progdefaults.THORsecText.empty()) { progdefaults.THORsecText = mycall; progdefaults.THORsecText.append(" "); txtTHORSecondary->value(progdefaults.THORsecText.c_str()); } if (progdefaults.secText.empty()) { progdefaults.secText = mycall; progdefaults.secText.append(" "); txtSecondary->value(progdefaults.secText.c_str()); } update_main_title(); notify_change_callsign(); progdefaults.changed = true;} tooltip {Station callsign} xywh {386 54 110 24} when 1 code0 {inpMyCallsign->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpOperCallsign { label {Operator Callsign:} callback {progdefaults.operCall = o->value(); progdefaults.changed = true;} tooltip {Operator callsign (if different than station callsign)} xywh {386 84 110 24} code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.operCall.c_str());} class Fl_Input2 } Fl_Input inpMyName { label {Operator Name:} callback {progdefaults.myName = o->value(); progdefaults.changed = true;} tooltip {Operators name} xywh {386 115 140 24} code0 {inpMyName->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpMyAntenna { label {Antenna:} callback {progdefaults.myAntenna = o->value(); progdefaults.changed = true;} tooltip {Short description of antenna} xywh {386 145 320 24} code0 {inpMyAntenna->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Input inpMyQth { label {Station City:} callback {progdefaults.myQth = o->value(); inpMyFSQQth->value(o->value()); progdefaults.changed = true;} tooltip {Operators QTH} xywh {386 176 320 24} code0 {inpMyQth->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.myQth.c_str());} class Fl_Input2 } Fl_Input inpMyLocator { label {Station Locator:} callback {progdefaults.myLocator = o->value(); progdefaults.changed = true;} tooltip {Maidenhead locator as in EM64qv} xywh {386 206 85 24} code0 {inpMyLocator->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Group listbox_states { label {State/Prov./Country} callback {listbox_counties->clear(); listbox_counties->add(states.counties(o->value()).c_str()); listbox_counties->index(0); inp_QP_short_county->value(states.cnty_short(listbox_states->value(),listbox_counties->value()).c_str()); inp_QP_state_short->value(states.state_short(o->value()).c_str()); progdefaults.SQSOstate = o->index(); progdefaults.changed = true;} open tooltip {US States / Canadian Provinces} xywh {386 237 319 24} box DOWN_BOX color 7 align 4 code0 {\#include "counties.h"} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->add(states.names().c_str());} code3 {o->index(progdefaults.SQSOstate);} class Fl_ListBox } {} Fl_Input inp_QP_state_short { tooltip {Abbreviation for State/Province} xywh {710 237 60 24} align 5 code0 {o->value(states.state_short(listbox_states->value()).c_str());} class Fl_Input2 } Fl_Group listbox_counties { label {Counties / Regions} callback {inp_QP_short_county->value(states.cnty_short(listbox_states->value(),o->value()).c_str()); progdefaults.SQSOcounty = o->index(); progdefaults.changed = true;} open tooltip {US/Canadian Counties / Regions} xywh {386 268 319 24} box DOWN_BOX color 7 align 4 code0 {o->clear(); o->add(states.counties(listbox_states->value()).c_str());} code1 {o->index(progdefaults.SQSOcounty);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Input inp_QP_short_county { tooltip {Abbreviation for County/Region} xywh {710 268 60 24} align 5 code0 {inp_QP_short_county->value(states.cnty_short(listbox_states->value(),listbox_counties->value()).c_str());} class Fl_Input2 } } Fl_Group grpRigFlrig { label {Rig Control/flrig} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/flrig"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Rig Control/flrig"));} } { Fl_Group {} { label {"Disable PTT keys modem if multiple instances of fldigi (client) are connected to a single flrig (server).} open xywh {209 233 580 90} box ENGRAVED_BOX align 17 } { Fl_Check_Button chk_flrig_keys_modem { label {Flrig PTT keys modem} callback {progdefaults.flrig_keys_modem = o->value(); progdefaults.changed = true;} tooltip {" "} xywh {439 281 183 20} down_box DOWN_BOX code0 {o->value(progdefaults.flrig_keys_modem);} } } Fl_Group {} { label {flrig xmlrpc server parameters these controls are mirrored on the IO configuration tab} open xywh {209 148 580 81} box ENGRAVED_FRAME align 21 } { Fl_Button btnDefault_flrig_ip_mirror { label Default callback {set_ip_to_default(FLRIG_IO); txt_flrig_ip_address_mirror->value(progdefaults.flrig_ip_address.c_str()); txt_flrig_ip_port_mirror->value(progdefaults.flrig_ip_port.c_str()); progdefaults.changed = true;} tooltip {Returns IP Address and port number to the default value.} xywh {613 194 73 24} } Fl_Input txt_flrig_ip_address_mirror { label Addr callback {progdefaults.flrig_ip_address = o->value(); txt_flrig_ip_address->value(progdefaults.flrig_ip_address.c_str()); progdefaults.changed = true;} tooltip {IP Address for flrig interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhost} xywh {244 194 230 24} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.flrig_ip_address.c_str());} class Fl_Input2 } Fl_Input txt_flrig_ip_port_mirror { label Port callback {progdefaults.flrig_ip_port = o->value(); txt_flrig_ip_port->value(progdefaults.flrig_ip_port.c_str()); progdefaults.changed = true;} tooltip {IP Address Port Number} xywh {518 194 55 24} align 8 when 1 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.flrig_ip_port.c_str());} class Fl_Input2 } Fl_Button btn_reconnect_flrig_server_mirror { label Reconnect callback {reconnect_to_flrig();} tooltip {Press only if you change the address/port} xywh {693 194 82 24} code0 {\#include "rigsupport.h"} } } Fl_Group {} { label {flrig is the preferred method of tranceiver control} open xywh {209 54 580 90} box ENGRAVED_BOX align 17 } { Fl_Check_Button btn_fldigi_client_to_flrig { label {Enable flrig xcvr control with fldigi as client} callback {progdefaults.fldigi_client_to_flrig=o->value(); if (o->value()) { progdefaults.chkUSEHAMLIBis = false; progdefaults.chkUSERIGCATis = false; chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); } progdefaults.changed=true;} tooltip {Disable if flrig not used.} xywh {234 81 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.fldigi_client_to_flrig);} } Fl_Check_Button btn_flrig_auto_shutdown { label {Shutdown flrig with fldigi} callback {progdefaults.flrig_auto_shutdown=o->value(); progdefaults.changed=true;} tooltip {Disable if flrig not used.} xywh {234 112 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.flrig_auto_shutdown);} } Fl_Counter val_flrig_poll { label {Poll Interval (msec)} callback {progdefaults.flrig_poll = o->value();} tooltip {Request updates every 'poll interval' milliseconds} xywh {620 107 130 24} align 4 minimum 50 maximum 5000 step 10 value 1 code0 {o->value(progdefaults.flrig_poll);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(100);} class Fl_Counter2 } } } Fl_Group grpRigCat { label {Rig Control/CAT (rigcat)} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/CAT (rigcat)"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Rig Control/CAT (rigcat)"));} } { Fl_Check_Button chkUSERIGCAT { label {Use RigCAT} callback {if (o->value() == 1) { chkUSEHAMLIB->value(0); btn_fldigi_client_to_flrig->value(0); progdefaults.chkUSERIGCATis = true; progdefaults.fldigi_client_to_flrig = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); } else { progdefaults.chkUSERIGCATis = false; progdefaults.initInterface(); } progdefaults.changed=true;} tooltip {RigCAT used for rig control} xywh {434 32 110 20} down_box DOWN_BOX } Fl_Group grpRigCAT {open xywh {244 55 490 279} box ENGRAVED_FRAME align 17 } { Fl_Output txtXmlRigFilename { label {Rig description file:} tooltip {Use Open to select descriptor file} xywh {254 79 130 22} color 52 align 5 code0 {o->value(fl_filename_name(progdefaults.XmlRigFilename.c_str()));} } Fl_Button btnSelectRigXmlFile { label {Open...} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); selectRigXmlFilename();} tooltip {Select rig descriptor file} xywh {387 79 60 22} align 16 } Fl_Group inpXmlRigDevice { label {Device:} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} open xywh {580 79 144 22} box DOWN_BOX color 7 align 4 code0 {o->value(progdefaults.XmlRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ComboBox } {} Fl_Value_Input cntRigCatRetries { label Retries callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {\# retries before giving up} xywh {269 122 60 22} align 5 maximum 1000 step 1 code0 {o->value(progdefaults.RigCatRetries);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntRigCatTimeout { label {Retry interval (ms)} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Time between retires in msec} xywh {399 122 60 22} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.RigCatTimeout);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntRigCatWait { label {Write delay (ms)} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Wait for response to subsequent command} xywh {269 162 60 22} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.RigCatWait);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Group listbox_xml_rig_baudrate { label {Baud rate:} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} open xywh {625 122 99 22} box DOWN_BOX color 7 align 4 code0 {o->add(szBaudRates);} code1 {o->index(progdefaults.XmlRigBaudrate); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter valRigCatStopbits { label Stopbits callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw();} xywh {627 156 95 21} type Simple align 4 minimum 1 maximum 2 step 1 value 1 code0 {o->value(progdefaults.RigCatStopbits);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Button btnInitRIGCAT { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Initialize RigCAT interface} xywh {604 293 113 24} align 16 } Fl_Check_Button btnRigCatEcho { label {Commands are echoed} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); progdefaults.changed = true;} tooltip {Rig or interface echos serial data} xywh {289 188 192 22} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatECHO);} } Fl_Round_Button btnRigCatCMDptt { label {CAT command for PTT} callback {if (o->value()== 1) { btnRigCatRTSptt->value(0); btnRigCatDTRptt->value(0); progdefaults.RigCatCMDptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatCMDptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw();} tooltip {PTT is a CAT command (not hardware)} xywh {495 189 207 20} down_box DOWN_BOX selection_color 1 code0 {o->value(progdefaults.RigCatCMDptt);} } Fl_Round_Button btnRigCatRTSptt { label {Toggle RTS for PTT} callback {if (o->value() == 1) { btnRigCatCMDptt->value(0); progdefaults.RigCatRTSptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatRTSptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {RTS is ptt line} xywh {289 218 160 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRTSptt);} } Fl_Round_Button btnRigCatDTRptt { label {Toggle DTR for PTT} callback {if (o->value() == 1) { btnRigCatCMDptt->value(0); progdefaults.RigCatDTRptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatDTRptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {DTR is ptt line} xywh {495 216 160 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatDTRptt);} } Fl_Check_Button btnRigCatRTSplus { label {RTS +12 v} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Initial state of RTS} xywh {289 247 100 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRTSplus);} } Fl_Check_Button btnRigCatDTRplus { label {DTR +12 v} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Initial state of DTR} xywh {495 244 100 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatDTRplus);} } Fl_Check_Button chkRigCatRTSCTSflow { label {RTS/CTS flow control} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Rig uses RTS/CTS handshake} xywh {289 275 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRTSCTSflow);} } Fl_Check_Button chk_restore_tio { label {Restore UART Settings on Close} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Restore the serial (COM) port settings} xywh {289 304 205 20} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatRestoreTIO);} } Fl_Check_Button chkRigCatVSP { label {VSP Enable} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Virtual Serial Port Emulator - suppress WARNINGS} xywh {495 272 100 25} down_box DOWN_BOX code0 {o->value(progdefaults.RigCatVSP);} } Fl_Value_Input cntRigCatInitDelay { label {Init delay (ms)} callback {btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label();} tooltip {Wait for response to first CAT command} xywh {399 162 75 22} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.RigCatInitDelay);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } } } Fl_Group grpRigGPIO { label {Rig Control/GPIO} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/GPIO"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Rig Control/GPIO"));} } { Fl_Check_Button btn_gpio_ptt2 { label {Enable GPIO PTT (Pi specific controls)} callback {btnTTYptt->value(0); btnUsePPortPTT->value(0); btn_gpio_ptt->value(o->value()); if (o->value()) { progdefaults.gpio_ptt = true; progdefaults.UseUHrouterPTT = progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.gpio_ptt = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT2->labelcolor(FL_RED); btnInitHWPTT->redraw(); btnInitHWPTT2->redraw(); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {256 25 330 15} down_box DOWN_BOX labelfont 4 code0 {o->value(progdefaults.gpio_ptt);} } Fl_Button btnInitHWPTT2 { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); o->redraw(); btnInitHWPTT->labelcolor(FL_FOREGROUND_COLOR); btnInitHWPTT2->redraw(); progdefaults.changed = true;} tooltip {Initialize the H/W PTT interface} xywh {640 20 113 24} } Fl_Box {} { label {BCM GPIO pin Value} xywh {265 53 189 17} labelfont 4 align 20 } Fl_Check_Button {btn_enable_gpio[0]} { label {17 00 11} callback {if (o->value()){ progdefaults.enable_gpio |= 1; export_gpio(0); } else { progdefaults.enable_gpio &= ~1; unexport_gpio(0); } progdefaults.changed = true;} tooltip {Select pin number} xywh {255 78 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value(progdefaults.enable_gpio & 0x01);} } Fl_Check_Button {btn_enable_gpio[1]} { label {18 01 12} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<1); export_gpio(1); } else { progdefaults.enable_gpio &= ~(1<<1); unexport_gpio(1); } progdefaults.changed = true;} tooltip {Select pin number} xywh {255 107 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 1) & 0x01);} } Fl_Check_Button {btn_enable_gpio[2]} { label {27 02 13} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<2); export_gpio(2); } else { progdefaults.enable_gpio &= ~(1<<2); unexport_gpio(2); } progdefaults.changed = true;} tooltip {Select pin number} xywh {255 137 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 2) & 0x01);} } Fl_Check_Button {btn_enable_gpio[3]} { label {22 03 15} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<3); export_gpio(3); } else { progdefaults.enable_gpio &= ~(1<<3); unexport_gpio(3); } progdefaults.changed = true;} tooltip {Select pin number} xywh {255 167 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 3) & 0x01);} } Fl_Check_Button {btn_enable_gpio[4]} { label {23 04 16} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<4); export_gpio(4); } else { progdefaults.enable_gpio &= ~(1<<4); unexport_gpio(4); } progdefaults.changed = true;} tooltip {Select pin number} xywh {255 197 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 4) & 0x01);} } Fl_Check_Button {btn_enable_gpio[5]} { label {24 05 18} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<5); export_gpio(5); } else { progdefaults.enable_gpio &= ~(1<<5); unexport_gpio(5); } progdefaults.changed = true;} tooltip {Select pin number} xywh {255 227 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 5) & 0x01);} } Fl_Check_Button {btn_enable_gpio[6]} { label {25 06 22} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<6); export_gpio(6); } else { progdefaults.enable_gpio &= ~(1<<6); unexport_gpio(6); } progdefaults.changed = true;} tooltip {Select pin number} xywh {255 257 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 6) & 0x01);} } Fl_Check_Button {btn_enable_gpio[7]} { label { 4 07 7} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<7); export_gpio(7); } else { progdefaults.enable_gpio &= ~(1<<7); unexport_gpio(7); } progdefaults.changed = true;} tooltip {Select pin number} xywh {255 287 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 7) & 0x01);} } Fl_Check_Button {btn_enable_gpio[8]} { label { 5 21 29} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<8); export_gpio(8); } else { progdefaults.enable_gpio &= ~(1<<8); unexport_gpio(8); } progdefaults.changed = true;} tooltip {Select pin number} xywh {515 78 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 8) & 0x01);} } Fl_Check_Button {btn_enable_gpio[9]} { label { 6 22 31} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<9); export_gpio(9); } else { progdefaults.enable_gpio &= ~(1<<9); unexport_gpio(9); } progdefaults.changed = true;} tooltip {Select pin number} xywh {515 107 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 9) & 0x01);} } Fl_Check_Button {btn_enable_gpio[10]} { label {13 23 33} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<10); export_gpio(10); } else { progdefaults.enable_gpio &= ~(1<<10); unexport_gpio(10); } progdefaults.changed = true;} tooltip {Select pin number} xywh {515 137 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 10) & 0x01);} } Fl_Check_Button {btn_enable_gpio[11]} { label {19 24 35} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<11); export_gpio(11); } else { progdefaults.enable_gpio &= ~(1<<11); unexport_gpio(11); } progdefaults.changed = true;} tooltip {Select pin number} xywh {515 167 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 11) & 0x01);} } Fl_Check_Button {btn_enable_gpio[12]} { label {26 25 37} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<12); export_gpio(12); } else { progdefaults.enable_gpio &= ~(1<<12); unexport_gpio(12); } progdefaults.changed = true;} tooltip {Select pin number} xywh {515 197 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 12) & 0x01);} } Fl_Check_Button {btn_enable_gpio[13]} { label {12 26 32} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<13); export_gpio(13); } else { progdefaults.enable_gpio &= ~(1<<13); unexport_gpio(13); } progdefaults.changed = true;} tooltip {Select pin number} xywh {515 227 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 13) & 0x01);} } Fl_Check_Button {btn_enable_gpio[14]} { label {16 27 36} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<14); export_gpio(14); } else { progdefaults.enable_gpio &= ~(1<<14); unexport_gpio(14); } progdefaults.changed = true;} tooltip {Select pin number} xywh {515 257 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 14) & 0x01);} } Fl_Check_Button {btn_enable_gpio[15]} { label {20 28 38} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<15); export_gpio(15); } else { progdefaults.enable_gpio &= ~(1<<15); unexport_gpio(15); } progdefaults.changed = true;} tooltip {Select pin number} xywh {515 287 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 15) & 0x01);} } Fl_Check_Button {btn_enable_gpio[16]} { label {21 29 40} callback {if (o->value()){ progdefaults.enable_gpio |= (1<<16); export_gpio(16); } else { progdefaults.enable_gpio &= ~(1<<16); unexport_gpio(16); } progdefaults.changed = true;} tooltip {Select pin number} xywh {515 317 125 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.enable_gpio >> 16) & 0x01);} } Fl_Check_Button {btn_gpio_on[0]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= 1; } else { progdefaults.gpio_on &= ~1; } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {395 77 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on) & 0x01);} } Fl_Check_Button {btn_gpio_on[1]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<1); } else { progdefaults.gpio_on &= ~(1<<1); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {395 107 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 1) & 0x01);} } Fl_Check_Button {btn_gpio_on[2]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<2); } else { progdefaults.gpio_on &= ~(1<<2); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {395 137 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 2) & 0x01);} } Fl_Check_Button {btn_gpio_on[3]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<3); } else { progdefaults.gpio_on &= ~(1<<3); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {395 167 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 3) & 0x01);} } Fl_Check_Button {btn_gpio_on[4]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<4); } else { progdefaults.gpio_on &= ~(1<<4); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {395 197 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 4) & 0x01);} } Fl_Check_Button {btn_gpio_on[5]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<5); } else { progdefaults.gpio_on &= ~(1<<5); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {395 227 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 5) & 0x01);} } Fl_Check_Button {btn_gpio_on[6]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<6); } else { progdefaults.gpio_on &= ~(1<<6); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {395 257 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 6) & 0x01);} } Fl_Check_Button {btn_gpio_on[7]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<7); } else { progdefaults.gpio_on &= ~(1<<7); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {395 287 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 7) & 0x01);} } Fl_Check_Button {btn_gpio_on[8]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<8); } else { progdefaults.gpio_on &= ~(1<<8); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {655 78 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 8) & 0x01);} } Fl_Check_Button {btn_gpio_on[9]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<9); } else { progdefaults.gpio_on &= ~(1<<9); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {655 107 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 9) & 0x01);} } Fl_Check_Button {btn_gpio_on[10]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<10); } else { progdefaults.gpio_on &= ~(1<<10); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {655 137 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 10) & 0x01);} } Fl_Check_Button {btn_gpio_on[11]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<11); } else { progdefaults.gpio_on &= ~(1<<11); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {655 167 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 11) & 0x01);} } Fl_Check_Button {btn_gpio_on[12]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<12); } else { progdefaults.gpio_on &= ~(1<<12); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {655 197 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 12) & 0x01);} } Fl_Check_Button {btn_gpio_on[13]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<13); } else { progdefaults.gpio_on &= ~(1<<13); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {655 227 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 13) & 0x01);} } Fl_Check_Button {btn_gpio_on[14]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<14); } else { progdefaults.gpio_on &= ~(1<<14); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {655 257 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 14) & 0x01);} } Fl_Check_Button {btn_gpio_on[15]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<15); } else { progdefaults.gpio_on &= ~(1<<15); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {655 287 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 15) & 0x01);} } Fl_Check_Button {btn_gpio_on[16]} { label {= 1 (on)} callback {if (o->value()){ progdefaults.gpio_on |= (1<<16); } else { progdefaults.gpio_on &= ~(1<<16); } wf->xmtrcv->value(0); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {655 317 84 15} down_box DOWN_BOX labelfont 4 code0 {o->value((progdefaults.gpio_on >> 16) & 0x01);} } Fl_Box {} { label {BCM GPIO pin Value} xywh {525 53 194 17} labelfont 4 align 20 } Fl_Counter cnt_gpio_pulse_width { label {Pulse width (msec)} callback {progdefaults.gpio_pulse_width=(int)o->value(); progdefaults.changed=true;} tooltip {Set >0 if pulsed PTT used} xywh {255 314 80 21} type Simple align 8 minimum 0 maximum 50 step 1 code0 {o->value(progdefaults.gpio_pulse_width);} } } Fl_Group grpRigHamlib { label {Rig Control/Hamlib} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/Hamlib"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Rig Control/Hamlib"));} } { Fl_Check_Button chkUSEHAMLIB { label {Use Hamlib} callback {progdefaults.chkUSEHAMLIBis = o->value(); if (o->value() == 1) { chkUSERIGCAT->value(0); btn_fldigi_client_to_flrig->value(0); progdefaults.chkUSERIGCATis = false; progdefaults.fldigi_client_to_flrig = false; btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->activate(); btnInitHAMLIB->redraw(); } else { progdefaults.initInterface(); } progdefaults.changed = true;} tooltip {Hamlib used for rig control} xywh {451 21 100 20} down_box DOWN_BOX } Fl_Group grpHamlib {open xywh {206 51 585 293} box ENGRAVED_FRAME } { Fl_Group cboHamlibRig { label {Rig:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); \#if USE_HAMLIB hamlib_get_defaults(); \#endif} open xywh {242 61 250 22} box DOWN_BOX color 7 align 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group inpRIGdev { label {Device:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} open xywh {556 61 220 22} box DOWN_BOX color 7 align 4 code0 {o->value(progdefaults.HamRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ComboBox } {} Fl_Value_Input cntHamlibRetries { label Retries callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {\# times to resend command before giving up} xywh {241 101 70 24} align 5 maximum 1000 step 1 code0 {o->value(progdefaults.HamlibRetries);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntHamlibTimeout { label {Timeout (msec)} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Hamlib read timeout} xywh {381 101 70 24} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.HamlibTimeout);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntHamlibWriteDelay { label {Write delay (msec)} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Msec's between sequential commands} xywh {241 144 70 24} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.HamlibWriteDelay);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Value_Input cntHamlibWait { label {Post write delay (msec)} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Wait interval (msecs) before reading response} xywh {381 144 70 24} align 5 maximum 10000 step 1 code0 {o->value(progdefaults.HamlibWait);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Value_Input2 } Fl_Group listbox_baudrate { label {Baud rate:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} open xywh {677 89 99 22} box DOWN_BOX color 7 align 4 code0 {o->add(szBaudRates);} code1 {o->index(progdefaults.HamRigBaudrate); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter valHamRigStopbits { label Stopbits callback {progdefaults.HamRigStopbits = (int)o->value(); progdefaults.changed = true;} xywh {681 117 95 21} type Simple align 4 minimum 1 maximum 2 step 1 value 1 code0 {o->value(progdefaults.HamRigStopbits);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter valHamRigPollrate { label {Polling Interval (msec)} callback {progdefaults.HamRigPollrate = (int)o->value(); progdefaults.changed = true;} xywh {681 145 95 21} type Simple align 4 minimum 100 maximum 2000 step 50 value 100 code0 {o->value(progdefaults.HamRigPollrate);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnHamlibCMDptt { label {PTT via Hamlib command} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); if (o->value()) { progdefaults.HamlibCMDptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = false; } else progdefaults.HamlibCMDptt = false; progdefaults.changed = true;} tooltip {PTT using hamlib command} xywh {256 192 215 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibCMDptt);} } Fl_Check_Button btnHamlibPTT_ON_DATA { label {Audio on Auxiliary Port} callback {progdefaults.hamlib_ptt_on_data = o->value();} tooltip {PTT enables auxiliary audio source} xywh {256 217 215 20} down_box DOWN_BOX code0 {o->value(progdefaults.hamlib_ptt_on_data);} } Fl_Check_Button btnHamlibDTRplus { label {DTR +12} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Initial state of DTR} xywh {256 243 90 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibDTRplus);} } Fl_Check_Button chkHamlibRTSplus { label {RTS +12} callback {if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Initial state of RTS} xywh {446 243 85 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSplus);} } Fl_Check_Button chkHamlibRTSCTSflow { label {RTS/CTS flow control} callback {if (o->value() == 1) { chkHamlibXONXOFFflow->value(0); chkHamlibRTSplus->deactivate(); } else chkHamlibRTSplus->activate(); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Rig requires RTS/CTS flow control} xywh {256 269 170 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibRTSCTSflow);} code1 {if (o->value()) chkHamlibRTSplus->deactivate();} } Fl_Check_Button chkHamlibXONXOFFflow { label {XON/XOFF flow control} callback {if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Rig requires Xon/Xoff flow control} xywh {446 269 185 20} down_box DOWN_BOX code0 {o->value(progdefaults.HamlibXONXOFFflow);} } Fl_Check_Button chk_hamlib_cw_is_lsb { label {CW is LSB mode} callback {progdefaults.hamlib_cw_islsb = o->value();} tooltip {Check if xcvr uses LSB for CW} xywh {636 243 142 20} down_box DOWN_BOX code0 {o->value(progdefaults.hamlib_cw_islsb);} } Fl_Check_Button chk_hamlib_rtty_is_usb { label {RTTY is USB mode} callback {progdefaults.hamlib_rtty_isusb = o->value();} tooltip {Check if xcvr uses USB for RTTY} xywh {636 269 152 20} down_box DOWN_BOX code0 {o->value(progdefaults.hamlib_rtty_isusb);} } Fl_Counter val_hamlib_mode_delay { label {Mode delay (msec)} callback {progdefaults.hamlib_mode_delay = (int)o->value(); progdefaults.changed = true;} tooltip {Delay NN msec after executing mode change} xywh {681 191 95 21} type Simple align 4 minimum 0 maximum 2000 step 100 value 200 code0 {o->value(progdefaults.hamlib_mode_delay);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Group listbox_sideband { label {Sideband:} open xywh {632 216 144 22} box DOWN_BOX color 7 align 4 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Input inpHamlibConfig { label {Advanced configuration:} callback {btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label();} tooltip {Optional configuration in format: param=val ...} xywh {231 313 460 24} align 5 code0 {inpHamlibConfig->value(progdefaults.HamConfig.c_str());} code1 {inpHamlibConfig->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Button btnInitHAMLIB { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Initialize hamlib interface} xywh {696 313 80 24} } } Fl_Button btn_hamlib_get_defaults { label Defaults callback {\#if USE_HAMLIB hamlib_get_defaults(); \#endif} xywh {696 19 80 24} } } Fl_Group grpRigHardware { label {Rig Control/Hardware PTT} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/Hardware PTT"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Rig Control/Hardware PTT"));} code3 {tab_tree->close(_("Rig Control"));} } { Fl_Group {} {open xywh {209 27 580 38} box ENGRAVED_FRAME } { Fl_Check_Button btnPTTrightchannel { label {PTT tone on right audio channel } callback {progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel2->value(o->value()); if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); } progdefaults.changed = true;} tooltip {Can be used in lieu of or in addition to other PTT types} xywh {224 36 250 20} down_box DOWN_BOX code0 {o->value(progdefaults.PTTrightchannel);} } } Fl_Group {} { label {h/w ptt device-pin} open xywh {209 67 580 184} box ENGRAVED_FRAME align 21 } { Fl_Round_Button btnTTYptt { label {Use separate serial port PTT} callback {btnUsePPortPTT->value(0); btnUseUHrouterPTT->value(0); btn_gpio_ptt->value(0); if (o->value()) { progdefaults.TTYptt = true; progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.gpio_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.TTYptt = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} xywh {224 94 220 20} down_box DOWN_BOX selection_color 1 } Fl_Group inpTTYdev { label {Device:} callback {progdefaults.PTTdev = o->value(); btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} open xywh {217 135 350 22} box DOWN_BOX color 7 align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.PTTdev.c_str());} class Fl_ComboBox } {} Fl_Round_Button btnSCU_17 { label {Port is second SCU-17 device} callback {progdefaults.SCU_17=o->value(); progdefaults.changed = true;} tooltip {Driver requires stop bits to be ZERO!} xywh {459 94 236 20} down_box DOWN_BOX selection_color 1 code0 {o->value(progdefaults.SCU_17);} } Fl_Round_Button btnUsePPortPTT { label {Use parallel port PTT} callback {btnTTYptt->value(0); btnUseUHrouterPTT->value(0); btn_gpio_ptt->value(0); if (o->value()) { progdefaults.UsePPortPTT = true; progdefaults.TTYptt = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.gpio_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.UsePPortPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} xywh {224 168 170 20} down_box DOWN_BOX selection_color 1 } Fl_Round_Button btnUseUHrouterPTT { label {Use uHRouter PTT} callback {btnTTYptt->value(0); btnUsePPortPTT->value(0); btn_gpio_ptt->value(0); if (o->value()) { progdefaults.UseUHrouterPTT = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.gpio_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.UseUHrouterPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} xywh {224 194 170 20} down_box DOWN_BOX selection_color 1 } Fl_Round_Button btnRTSptt { label {Use RTS} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {RTS is PTT signal line} xywh {579 123 85 20} down_box DOWN_BOX } Fl_Round_Button btnRTSplusV { label {RTS = +V} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {Initial voltage on RTS} xywh {670 123 100 20} down_box DOWN_BOX } Fl_Round_Button btnDTRptt { label {Use DTR} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {DTR is PTT signal line} xywh {579 155 85 20} down_box DOWN_BOX } Fl_Round_Button btnDTRplusV { label {DTR = +V} callback {btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true;} tooltip {Initial voltage on DTR} xywh {670 155 100 20} down_box DOWN_BOX } Fl_Check_Button btn_gpio_ptt { label {GPIO PTT (Pi specific controls)} callback {btnTTYptt->value(0); btnUsePPortPTT->value(0); btn_gpio_ptt2->value(o->value()); if (o->value()) { progdefaults.gpio_ptt = true; progdefaults.UseUHrouterPTT = progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.gpio_ptt = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT2->labelcolor(FL_RED); btnInitHWPTT->redraw(); btnInitHWPTT2->redraw(); progdefaults.changed = true;} tooltip {Select PTT on state} xywh {224 221 278 15} down_box DOWN_BOX labelfont 4 code0 {o->value(progdefaults.gpio_ptt);} } Fl_Button btnInitHWPTT { label Initialize callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); o->redraw(); btnInitHWPTT2->labelcolor(FL_FOREGROUND_COLOR); btnInitHWPTT2->redraw(); progdefaults.changed = true;} tooltip {Initialize the H/W PTT interface} xywh {649 212 113 24} } } Fl_Group grpPTTdelays { label {PTT delays valid for all CAT/PTT types} open xywh {210 252 580 91} box ENGRAVED_FRAME align 21 } { Fl_Counter cntPTT_on_delay { label {Start of transmit PTT delay} callback {progdefaults.PTT_on_delay = o->value(); progdefaults.changed = true;} tooltip {Delay NN msec before starting audio} xywh {274 279 100 21} align 8 minimum 0 maximum 5000 step 10 code0 {o->value(progdefaults.PTT_on_delay);} code1 {o->lstep(100);} } Fl_Counter cntPTT_off_delay { label {PTT end of transmit delay} callback {progdefaults.PTT_off_delay = o->value(); progdefaults.changed = true;} tooltip {Delay NN msec before releasing PTT} xywh {274 309 100 21} align 8 minimum 0 maximum 5000 step 10 code0 {o->value(progdefaults.PTT_off_delay);} code1 {o->lstep(100);} } } } Fl_Group grp_cmedia_ptt { label {C-Media PTT} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("C-Media PTT"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Rig Control/C-Media PTT"));} code3 {tab_tree->close(_("Rig Control"));} } { Fl_Group {} { label {C-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. GPIO signal line 3 (pin 13) is used for PTT control. Fldigi accesses the GPIO lines as a Human Interface Device (HID). Discovered C-Media devices are enumerated in the 'C-Media device' list box. On Linux: add a file named cmedia.rules to /etc/udev/rules.d/ The file should contain a single line KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"} open xywh {205 30 590 173} align 148 } {} Fl_Round_Button btn_use_cmedia_PTT { label {Use C-Media PTT} callback {if (o->value()) { progdefaults.cmedia_ptt = true; progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; btn_init_cmedia_PTT->labelcolor(FL_RED); btn_init_cmedia_PTT->redraw(); } else { progdefaults.cmedia_ptt = false; close_cmedia(); } progdefaults.changed = true;} xywh {235 218 220 20} down_box DOWN_BOX selection_color 1 } Fl_Group inp_cmedia_dev { label {C-Media device} callback {close_cmedia(); progdefaults.cmedia_device = o->value(); btn_init_cmedia_PTT->labelcolor(FL_RED); btn_init_cmedia_PTT->redraw(); progdefaults.changed = true;} open xywh {235 261 350 22} box DOWN_BOX color 7 align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.cmedia_device.c_str());} class Fl_ComboBox } {} Fl_Group inp_cmedia_GPIO_line { label {GPIO line} callback {progdefaults.cmedia_gpio_line = o->value();} open xywh {235 304 114 22} box DOWN_BOX color 7 align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} code1 {o->value(progdefaults.cmedia_gpio_line);} code2 {o->add("GPIO-1|GPIO-2|GPIO-3|GPIO-4");} class Fl_ComboBox } {} Fl_Button btn_init_cmedia_PTT { label Select callback {progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true;} tooltip {Select device & Initialize the H/W PTT interface} xywh {600 261 70 22} } Fl_Button btn_test_cmedia { label TEST callback {test_hid_ptt();} tooltip {Toggles PTT line 20x; check DRA-30 ptt LED} xywh {695 261 70 22} code0 {\#include "cmedia.h"} } } Fl_Group {} { label {Soundcard/Alerts} xywh {200 0 600 350} box ENGRAVED_BOX color 50 selection_color 50 align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Alerts"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Soundcard/Alerts"));} } { Fl_Group {} {open xywh {203 18 590 64} box ENGRAVED_BOX align 17 } { Fl_File_Input inp_wav_fname_regex { label {REGEX detected wav} xywh {208 41 304 35} align 5 code0 {o->value(progdefaults.BWSR_REGEX_MATCH.c_str());} } Fl_Button btn_select_regex_wav { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.{mp3,wav}\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BWSR_REGEX_MATCH = fnfc.filename(); inp_wav_fname_regex->value(progdefaults.BWSR_REGEX_MATCH.c_str()); progdefaults.REGEX_ALERT_MENU = 0; mnu_regex_alert_menu->value(progdefaults.REGEX_ALERT_MENU); break; // FILE CHOSEN } }} xywh {514 52 60 24} code0 {\#include } } Fl_Choice mnu_regex_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BWSR_REGEX_MATCH = "bark"; break; case 2 : progdefaults.BWSR_REGEX_MATCH = "checkout"; break; case 3 : progdefaults.BWSR_REGEX_MATCH = "diesel"; break; case 4 : progdefaults.BWSR_REGEX_MATCH = "steam_train"; break; case 5 : progdefaults.BWSR_REGEX_MATCH = "doesnot"; break; case 6 : progdefaults.BWSR_REGEX_MATCH = "beeboo"; break; case 7 : progdefaults.BWSR_REGEX_MATCH = "phone"; break; case 8 : progdefaults.BWSR_REGEX_MATCH = "dinner_bell"; break; case 9 : progdefaults.BWSR_REGEX_MATCH = "rtty_bell"; break; case 10 : progdefaults.BWSR_REGEX_MATCH = "standard_tone"; break; } inp_wav_fname_regex->value(progdefaults.BWSR_REGEX_MATCH.c_str()); } progdefaults.REGEX_ALERT_MENU = o->value();} open xywh {578 52 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone");} code1 {o->value(progdefaults.REGEX_ALERT_MENU);} } {} Fl_Check_Button btn_enable_regex_match_wa { label Enable callback {progdefaults.ENABLE_BWSR_REGEX_MATCH=o->value();} xywh {718 31 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_BWSR_REGEX_MATCH);} } Fl_Button btn_test_regex_wav { label Test callback {audio_alert->alert(progdefaults.BWSR_REGEX_MATCH.c_str());} xywh {718 52 60 24} code0 {\#include "audio_alert.h"} } } Fl_Group {} {open xywh {203 81 590 64} box ENGRAVED_BOX align 17 } { Fl_File_Input inp_wav_fname_mycall { label {MYCALL detected wav} xywh {208 103 304 35} align 5 code0 {o->value(progdefaults.BWSR_MYCALL_MATCH.c_str());} } Fl_Button btn_select_mycall_wav { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.{mp3,wav}\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BWSR_MYCALL_MATCH = fnfc.filename(); inp_wav_fname_mycall->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); progdefaults.MYCALL_ALERT_MENU = 0; mnu_mycall_alert_menu->value(progdefaults.MYCALL_ALERT_MENU); break; // FILE CHOSEN } }} xywh {514 114 60 24} } Fl_Choice mnu_mycall_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BWSR_MYCALL_MATCH = "bark"; break; case 2 : progdefaults.BWSR_MYCALL_MATCH = "checkout"; break; case 3 : progdefaults.BWSR_MYCALL_MATCH = "diesel"; break; case 4 : progdefaults.BWSR_MYCALL_MATCH = "steam_train"; break; case 5 : progdefaults.BWSR_MYCALL_MATCH = "doesnot"; break; case 6 : progdefaults.BWSR_MYCALL_MATCH = "beeboo"; break; case 7 : progdefaults.BWSR_MYCALL_MATCH = "phone"; break; case 8 : progdefaults.BWSR_MYCALL_MATCH = "dinner_bell"; break; case 9 : progdefaults.BWSR_MYCALL_MATCH = "rtty_bell"; break; case 10 : progdefaults.BWSR_MYCALL_MATCH = "standard_tone"; break; } inp_wav_fname_mycall->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); } progdefaults.MYCALL_ALERT_MENU = o->value();} open xywh {578 114 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone");} code1 {o->value(progdefaults.MYCALL_ALERT_MENU);} } {} Fl_Check_Button btn_enable_mycall_match_wav { label Enable callback {progdefaults.ENABLE_BWSR_MYCALL_MATCH=o->value();} xywh {718 92 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_BWSR_MYCALL_MATCH);} } Fl_Button btn_test_mycall_wav { label Test callback {audio_alert->alert(progdefaults.BWSR_MYCALL_MATCH.c_str());} xywh {718 114 60 24} } } Fl_Group {} {open xywh {203 144 590 64} box ENGRAVED_BOX align 17 } { Fl_File_Input inp_wav_fname_rsid { label {RsID audio alert wav} xywh {208 166 304 35} align 5 code0 {o->value(progdefaults.RSID_MATCH.c_str());} } Fl_Button btn_select_rsid_wav { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.{mp3,wav}\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RSID_MATCH = fnfc.filename(); inp_wav_fname_rsid->value(progdefaults.RSID_MATCH.c_str()); progdefaults.RSID_ALERT_MENU = 0; mnu_rsid_alert_menu->value(progdefaults.RSID_ALERT_MENU); break; // FILE CHOSEN } }} xywh {514 177 60 24} } Fl_Choice mnu_rsid_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RSID_MATCH = "bark"; break; case 2 : progdefaults.RSID_MATCH = "checkout"; break; case 3 : progdefaults.RSID_MATCH = "diesel"; break; case 4 : progdefaults.RSID_MATCH = "steam_train"; break; case 5 : progdefaults.RSID_MATCH = "doesnot"; break; case 6 : progdefaults.RSID_MATCH = "beeboo"; break; case 7 : progdefaults.RSID_MATCH = "phone"; break; case 8 : progdefaults.RSID_MATCH = "dinner_bell"; break; case 9 : progdefaults.RSID_MATCH = "rtty_bell"; break; case 10 : progdefaults.RSID_MATCH = "standard_tone"; break; } inp_wav_fname_rsid->value(progdefaults.RSID_MATCH.c_str()); } progdefaults.RSID_ALERT_MENU = o->value();} open xywh {578 177 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone");} code1 {o->value(progdefaults.RSID_ALERT_MENU);} } {} Fl_Check_Button btn_enable_rsid_match_wav { label Enable callback {progdefaults.ENABLE_RSID_MATCH=o->value();} xywh {718 156 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_RSID_MATCH);} } Fl_Button btn_test_rsid_wav { label Test callback {audio_alert->alert(progdefaults.RSID_MATCH.c_str());} xywh {718 177 60 24} } } Fl_Group {} {open xywh {203 207 590 114} box ENGRAVED_BOX align 17 } { Fl_File_Input inp_wav_flmsg_rcvd { label {flmsg received wav} xywh {208 227 304 35} align 5 code0 {o->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str());} } Fl_Button btn_select_rx_extract_msg { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.{mp3,wav}\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RX_EXTRACT_MSG_RCVD = fnfc.filename(); inp_wav_flmsg_rcvd->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); progdefaults.RX_EXTRACT_ALERT_MENU = 0; mnu_rx_extract_alert_menu->value(progdefaults.RX_EXTRACT_ALERT_MENU); break; // FILE CHOSEN } }} xywh {514 238 60 24} } Fl_Choice mnu_rx_extract_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RX_EXTRACT_MSG_RCVD = "bark"; break; case 2 : progdefaults.RX_EXTRACT_MSG_RCVD = "checkout"; break; case 3 : progdefaults.RX_EXTRACT_MSG_RCVD = "diesel"; break; case 4 : progdefaults.RX_EXTRACT_MSG_RCVD = "steam_train"; break; case 5 : progdefaults.RX_EXTRACT_MSG_RCVD = "doesnot"; break; case 6 : progdefaults.RX_EXTRACT_MSG_RCVD = "beeboo"; break; case 7 : progdefaults.RX_EXTRACT_MSG_RCVD = "phone"; break; case 8 : progdefaults.RX_EXTRACT_MSG_RCVD = "dinner_bell"; break; case 9 : progdefaults.RX_EXTRACT_MSG_RCVD = "rtty_bell"; break; case 10 : progdefaults.RX_EXTRACT_MSG_RCVD = "standard_tone"; break; } inp_wav_flmsg_rcvd->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); } progdefaults.RX_EXTRACT_ALERT_MENU = o->value();} open xywh {578 238 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone");} code1 {o->value(progdefaults.RX_EXTRACT_ALERT_MENU);} } {} Fl_Check_Button btn_enable_flmsg_wav { label Enable callback {progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD=o->value();} xywh {718 216 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD);} } Fl_Button btn_test_flmsg_extract_wav { label Test callback {audio_alert->alert(progdefaults.RX_EXTRACT_MSG_RCVD.c_str());} xywh {718 238 60 24} } Fl_File_Input inp_wav_flmsg_timed_out { label {flmsg timed out wav} xywh {208 282 304 35} align 5 code0 {o->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str());} } Fl_Button btn_select_rx_extract_timed_out { label Select callback {Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\\t*.{mp3,wav}\\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RX_EXTRACT_TIMED_OUT = fnfc.filename(); inp_wav_flmsg_timed_out->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); progdefaults.TIMED_OUT_ALERT_MENU = 0; mnu_rx_timed_out_alert_menu->value(progdefaults.TIMED_OUT_ALERT_MENU); break; // FILE CHOSEN } }} xywh {514 293 60 24} } Fl_Choice mnu_rx_timed_out_alert_menu { label {Sound:} callback {if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RX_EXTRACT_TIMED_OUT = "bark"; break; case 2 : progdefaults.RX_EXTRACT_TIMED_OUT = "checkout"; break; case 3 : progdefaults.RX_EXTRACT_TIMED_OUT = "diesel"; break; case 4 : progdefaults.RX_EXTRACT_TIMED_OUT = "steam_train"; break; case 5 : progdefaults.RX_EXTRACT_TIMED_OUT = "doesnot"; break; case 6 : progdefaults.RX_EXTRACT_TIMED_OUT = "beeboo"; break; case 7 : progdefaults.RX_EXTRACT_TIMED_OUT = "phone"; break; case 8 : progdefaults.RX_EXTRACT_TIMED_OUT = "dinner_bell"; break; case 9 : progdefaults.RX_EXTRACT_TIMED_OUT = "rtty_bell"; break; case 10 : progdefaults.RX_EXTRACT_TIMED_OUT = "standard_tone"; break; } inp_wav_flmsg_timed_out->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); } progdefaults.TIMED_OUT_ALERT_MENU = o->value();} open xywh {578 293 135 24} box DOWN_BOX down_box BORDER_BOX color 53 align 5 code0 {o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone");} code1 {o->value(progdefaults.TIMED_OUT_ALERT_MENU);} } {} Fl_Button btn_test_rx_extract_timed_out { label Test callback {audio_alert->alert(progdefaults.RX_EXTRACT_TIMED_OUT.c_str());} xywh {718 293 60 24} } Fl_Check_Button btn_enable_flmsg_time_out_wav { label Enable callback {progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT=o->value();} xywh {718 271 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT);} } } Fl_Value_Slider sldrAlertVolume { label {Alert volume} callback {progdefaults.alert_volume = (int)o->value(); progdefaults.changed = true;} xywh {256 325 403 20} type Horizontal align 8 maximum 100 step 1 value 20 textsize 14 code0 {o->value(progdefaults.alert_volume);} code1 {o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE);} class Fl_Value_Slider2 } } Fl_Group grpSoundDevices { label {Soundcard/Devices} xywh {200 -4 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Devices"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Soundcard/Devices"));} } { Fl_Group AudioOSS {open xywh {255 20 500 45} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[0]} { label OSS callback {sound_update(SND_IDX_OSS); progdefaults.changed = true; resetSoundCard();} tooltip {Use OSS audio server} xywh {267 30 53 25} down_box DOWN_BOX selection_color 1 } Fl_Input_Choice menuOSSDev { label {Device:} callback {scDevice[0] = scDevice[1] = progdefaults.OSSdevice = o->value(); resetSoundCard(); progdefaults.changed = true;} open tooltip {Select device} xywh {572 30 165 25} code0 {o->value(progdefaults.OSSdevice.c_str());} } {} } Fl_Group AudioPort {open xywh {255 65 500 79} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[1]} { label PortAudio callback {sound_update(SND_IDX_PORT); progdefaults.changed = true; resetSoundCard();} tooltip {Use Port Audio server} xywh {267 93 95 25} down_box DOWN_BOX selection_color 1 } Fl_Choice menuPortInDev { label {Capture:} callback {scDevice[0] = progdefaults.PortInDevice = o->text(); progdefaults.PortInIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true;} open tooltip {Audio input device} xywh {427 76 310 25} down_box BORDER_BOX } {} Fl_Choice menuPortOutDev { label {Playback:} callback {scDevice[1] = progdefaults.PortOutDevice = o->text(); progdefaults.PortOutIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true;} open tooltip {Audio output device} xywh {427 111 310 25} down_box BORDER_BOX } {} } Fl_Group AudioPulse {open xywh {255 145 500 45} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[2]} { label PulseAudio callback {sound_update(SND_IDX_PULSE); progdefaults.changed = true; resetSoundCard();} tooltip {Use Pulse Audio server} xywh {267 156 100 25} down_box DOWN_BOX selection_color 1 } Fl_Input inpPulseServer { label {Server string:} callback {scDevice[0] = scDevice[1] = progdefaults.PulseServer = o->value(); resetSoundCard(); progdefaults.changed = true;} tooltip {Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStrings} xywh {512 156 225 24} code0 {o->value(progdefaults.PulseServer.c_str());} code1 {inpPulseServer->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } } Fl_Group AudioNull {open xywh {255 190 135 45} box ENGRAVED_FRAME } { Fl_Round_Button {btnAudioIO[3]} { label {File I/O only} callback {sound_update(SND_IDX_NULL); progdefaults.changed = true; resetSoundCard();} tooltip {NO AUDIO DEVICE AVAILABLE (or testing)} xywh {268 200 100 25} down_box DOWN_BOX selection_color 1 } } Fl_Group AudioDuplex {open xywh {390 190 365 45} box ENGRAVED_FRAME } { Fl_Round_Button btn_is_full_duplex { label {Device supports full duplex} callback {progdefaults.is_full_duplex = o->value(); progdefaults.changed = true; resetSoundCard();} tooltip {Capture/Playback supports full duplex operation} xywh {433 200 225 25} down_box DOWN_BOX value 1 selection_color 1 code0 {o->value(progdefaults.is_full_duplex);} } } Fl_Group AudioAlerts {open xywh {255 235 500 90} box ENGRAVED_FRAME align 0 } { Fl_Choice menuAlertsDev { label {Audio device shared by Audio Alerts and Rx Monitor} callback {progdefaults.AlertDevice = o->text(); progdefaults.AlertIndex = reinterpret_cast(o->mvalue()->user_data()); progdefaults.changed = true;} open tooltip {Audio output device} xywh {265 260 365 25} down_box BORDER_BOX align 5 } {} Fl_Round_Button btn_enable_audio_alerts { label Enable callback {progdefaults.enable_audio_alerts = o->value(); progdefaults.changed = true; reset_audio_alerts();} tooltip {First select audio alert playback device} xywh {657 260 76 25} down_box DOWN_BOX selection_color 1 code0 {o->value(progdefaults.enable_audio_alerts);} } Fl_Box {} { label {Note: must be selected and enabled for Rx Audio monitoring!} xywh {265 295 473 22} align 16 } } } Fl_Group {} { label {Soundcard/Right channel} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Right channel"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Soundcard/Right channel"));} } { Fl_Group {} { label {Transmit Usage} open xywh {236 33 550 246} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkAudioStereoOut { label {Modem signal on left and right channels} callback {progdefaults.sig_on_right_channel = o->value(); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }} tooltip {Left and right channels both contain modem audio} xywh {376 54 280 20} down_box DOWN_BOX code0 {chkAudioStereoOut->value(progdefaults.sig_on_right_channel);} } Fl_Check_Button chkReverseAudio { label {Reverse Left/Right channels} callback {progdefaults.ReverseAudio = o->value(); progdefaults.changed = true;} tooltip {Software reversal of left-right audio channels} xywh {376 84 270 20} down_box DOWN_BOX code0 {o->value(progdefaults.ReverseAudio);} } Fl_Group {} { label {... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...} open xywh {286 107 454 162} box ENGRAVED_FRAME align 18 } { Fl_Check_Button btnPTTrightchannel2 { label {PTT tone on right audio channel } callback {progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); }} tooltip {1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types} xywh {376 114 250 20} down_box DOWN_BOX code0 {o->value(progdefaults.PTTrightchannel);} } Fl_Check_Button btnQSK2 { label {CW QSK signal on right channel} callback {progdefaults.QSK = o->value(); btnQSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }} tooltip {Generate 1000 Hz square wave signal on right channel} xywh {376 144 211 20} down_box DOWN_BOX code0 {o->value(progdefaults.QSK);} } Fl_Check_Button chkPseudoFSK2 { label {Pseudo-FSK on right audio channel} callback {progdefaults.PseudoFSK = o->value(); chkPseudoFSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }} tooltip {Create 1000 Hz square wave on right channel} xywh {376 175 270 20} down_box DOWN_BOX code0 {o->value(progdefaults.PseudoFSK);} } } } Fl_Group {} { label {Receive Usage} open xywh {236 282 550 60} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkReverseRxAudio { label {Reverse Left/Right channels} callback {progdefaults.ReverseRxAudio = o->value(); progdefaults.changed = true;} tooltip {Software reversal of left-right audio channels} xywh {376 300 270 20} down_box DOWN_BOX code0 {o->value(progdefaults.ReverseRxAudio);} } } } Fl_Group {} { label {Soundcard/Settings} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Settings"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Soundcard/Settings"));} } { Fl_Group grpAudioSampleRate { label {Sample rate} open xywh {260 48 490 90} box ENGRAVED_FRAME align 21 } { Fl_Group menuInSampleRate { label Capture callback {progdefaults.in_sample_rate = o->index() > 1 ? strtol(o->value(), 0, 10) : o->index(); resetSoundCard(); progdefaults.changed = true;} open tooltip {Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.} xywh {284 77 100 22} box DOWN_BOX color 7 align 8 code0 {o->clear_changed();} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group menuOutSampleRate { label Playback callback {progdefaults.out_sample_rate = o->index() > 1 ? strtol(o->value(), 0, 10) : o->index(); resetSoundCard(); progdefaults.changed = true;} open xywh {284 107 100 22} box DOWN_BOX color 7 align 8 code0 {o->clear_changed();} code1 {o->tooltip(menuInSampleRate->tooltip());} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Group menuSampleConverter { label Converter callback {if ((o->index()) == FLDIGI_SRC_BEST) fl_alert2("The best quality SINC interpolator has very high CPU overhead"); progdefaults.sample_converter = sample_rate_converters[o->index()]; resetSoundCard(); progdefaults.changed = true; o->tooltip(src_get_description(progdefaults.sample_converter));} open tooltip {Set the type of resampler used of offset correction} xywh {524 77 216 22} box DOWN_BOX color 7 align 5 code0 {\#include } code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } Fl_Group {} { label Corrections open xywh {260 138 490 62} box ENGRAVED_FRAME align 21 } { Fl_Spinner cntRxRateCorr { label {RX ppm} callback {progdefaults.RX_corr = (int)o->value(); cnt_fmt_rx_ppm->value(progdefaults.RX_corr); progdefaults.changed = true;} tooltip {RX sound card correction} xywh {284 165 85 20} align 8 code0 {o->step(1);} code1 {o->minimum(-50000);} code2 {o->maximum(50000);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Spinner cntTxRateCorr { label {TX ppm} callback {progdefaults.TX_corr = (int)o->value(); progdefaults.changed = true;} tooltip {TX sound card correction} xywh {431 165 85 20} align 8 code0 {o->step(1);} code1 {o->minimum(-50000);} code2 {o->maximum(50000);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Spinner cntTxOffset { label {TX offset} callback {progdefaults.TxOffset = (int)o->value(); progdefaults.changed = true;} tooltip {Difference between Rx & Tx freq (rig offset)} xywh {591 165 85 20} align 8 code0 {o->value(progdefaults.TxOffset);} code1 {o->step(1);} code2 {o->minimum(-50); o->maximum(50);} code3 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } } Fl_Group {} { label {Frequency Analysis / FMT Rx Correction} open xywh {260 200 490 76} box ENGRAVED_FRAME align 21 } { Fl_Button bnt_dec_rit { label {@|<} callback {progdefaults.RIT -= 0.1; cntRIT->value(progdefaults.RIT); progdefaults.FMT_freq_corr=o->value(); cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr); progdefaults.changed = true;} xywh {285 227 18 24} labelsize 10 align 16 } Fl_Counter cntRIT { label {Frequency Correction} callback {progdefaults.RIT=o->value(); progdefaults.FMT_freq_corr=o->value(); cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr);} tooltip {Used ONLY for frequency analysis mode} xywh {303 227 130 24} minimum -5 maximum 5 step 0.001 code0 {o->value(progdefaults.RIT);} code1 {o->lstep(0.01);} } Fl_Button btn_incr_rit { label {@>|} callback {progdefaults.RIT += 0.1; cntRIT->value(progdefaults.RIT); progdefaults.FMT_freq_corr=o->value(); cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr); progdefaults.changed = true;} xywh {433 227 18 24} labelsize 10 align 16 } } } Fl_Group {} { label {Signal Level} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Signal Level"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Soundcard/Signal Level"));} } { Fl_Box {} { label {Signal Levels} xywh {340 39 316 21} } Fl_Box lowcolor2 { xywh {365 78 21 21} box DIAMOND_DOWN_BOX color 0 code0 {o->color(progdefaults.LowSignal);} } Fl_Button btnLowSignal2 { label Low callback {progdefaults.LowSignal = fl_show_colormap(progdefaults.LowSignal); lowcolor->color(progdefaults.LowSignal); lowcolor->redraw(); lowcolor2->color(progdefaults.LowSignal); lowcolor2->redraw(); progdefaults.changed = true;} xywh {402 78 70 21} } Fl_Box normalcolor2 { xywh {365 122 21 21} box DIAMOND_DOWN_BOX color 2 code0 {o->color(progdefaults.NormSignal);} } Fl_Counter cnt_normal_signal_level2 { label {Transition Level (dB)} callback {progdefaults.normal_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level); cnt_normal_signal_level2->value(progdefaults.normal_signal_level); cnt_high_signal_level2->value(progdefaults.high_signal_level); cnt_over_signal_level2->value(progdefaults.over_signal_level);} xywh {480 100 114 21} align 1 minimum -90 maximum 0 code0 {o->value(progdefaults.normal_signal_level);} code1 {o->lstep(1.0);} } Fl_Button btnNormalSignal2 { label Normal callback {progdefaults.NormSignal = fl_show_colormap(progdefaults.NormSignal); normalcolor->color(progdefaults.NormSignal); normalcolor->redraw(); normalcolor2->color(progdefaults.NormSignal); normalcolor2->redraw(); progdefaults.changed = true;} xywh {402 122 70 21} } Fl_Box highcolor2 { xywh {365 166 21 21} box DIAMOND_DOWN_BOX color 3 code0 {o->color(progdefaults.HighSignal);} } Fl_Counter cnt_high_signal_level2 { callback {progdefaults.high_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level); cnt_normal_signal_level2->value(progdefaults.normal_signal_level); cnt_high_signal_level2->value(progdefaults.high_signal_level); cnt_over_signal_level2->value(progdefaults.over_signal_level);} xywh {480 145 114 21} minimum -90 maximum 0 code0 {o->value(progdefaults.high_signal_level);} code1 {o->lstep(1.0);} } Fl_Button btnHighSignal2 { label High callback {progdefaults.HighSignal = fl_show_colormap(progdefaults.HighSignal); highcolor->color(progdefaults.HighSignal); highcolor->redraw(); highcolor2->color(progdefaults.HighSignal); highcolor2->redraw(); progdefaults.changed = true;} xywh {402 166 70 21} } Fl_Box overcolor2 { xywh {365 210 21 21} box DIAMOND_DOWN_BOX color 1 code0 {o->color(progdefaults.OverSignal);} } Fl_Counter cnt_over_signal_level2 { callback {progdefaults.over_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level); cnt_normal_signal_level2->value(progdefaults.normal_signal_level); cnt_high_signal_level2->value(progdefaults.high_signal_level); cnt_over_signal_level2->value(progdefaults.over_signal_level);} xywh {480 191 114 21} minimum -90 maximum 0 code0 {o->value(progdefaults.over_signal_level);} code1 {o->lstep(1.0);} } Fl_Button btnOverSignal2 { label Over callback {progdefaults.OverSignal = fl_show_colormap(progdefaults.OverSignal); overcolor->color(progdefaults.OverSignal); overcolor->redraw(); overcolor2->color(progdefaults.OverSignal); overcolor2->redraw(); progdefaults.changed = true;} xywh {402 210 70 21} } Fl_Progress {} { label label xywh {295 289 416 25} hide } Fl_Progress sig_vumeter2 { label label xywh {322 248 360 24} code0 {\#include "vumeter.h"} class vumeter } Fl_Box {} { label {Input signal level} xywh {383 275 237 17} } Fl_Button btn_default_signal_levels2 { label Default callback {cnt_normal_signal_level->value( progdefaults.normal_signal_level = -60.0); cnt_high_signal_level->value( progdefaults.high_signal_level = -6.0); cnt_over_signal_level->value( progdefaults.over_signal_level = -3.0); cnt_normal_signal_level2->value(progdefaults.normal_signal_level); cnt_high_signal_level2->value(progdefaults.high_signal_level); cnt_over_signal_level2->value(progdefaults.over_signal_level);} xywh {618 145 70 20} } Fl_Check_Button btn_use_wsjtx_vumeter_scale2 { label {Use wsjtx scale} callback {progdefaults.use_wsjtx_vumeter_scale=o->value(); btn_use_wsjtx_vumeter_scale->value(o->value());} tooltip {default scale is audo "Vu Meter" enable to emulate wsjtx scale} xywh {322 305 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.use_wsjtx_vumeter_scale);} } } Fl_Group {} { label {Soundcard/Wav file recording} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Wav file recording"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Soundcard/Wav file recording"));} code3 {tab_tree->close(_("Soundcard"));} } { Fl_Group listbox_wav_samplerate { label {Wav write sample rate} callback {progdefaults.wavSampleRate = o->index(); progdefaults.changed = true;} open tooltip {Pick baud rate from list} xywh {399 91 150 24} box DOWN_BOX color 7 align 5 code0 {o->add("8000|11025|16000|22050|24000|44100|48000");} code1 {o->index(progdefaults.wavSampleRate);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Check_Button btn_record_both { label {Record both channels} callback {progdefaults.record_both_channels=o->value(); progdefaults.changed=true;} xywh {399 140 176 15} down_box DOWN_BOX code0 {o->value(progdefaults.record_both_channels);} } } Fl_Group {} { label {UI/Browser/Channels} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Browser/Channels"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("UI/Browser/Channels"));} } { Fl_Spinner cntChannels { label {Channels, first channel starts at waterfall lower limit} callback {progdefaults.VIEWERchannels = (int)(o->value()); initViewer();} tooltip {Change \# of psk viewer channels} xywh {278 54 50 24} align 8 maximum 30 value 30 code0 {o->minimum(5); o->maximum(30); o->step(1);} code1 {o->value(progdefaults.VIEWERchannels);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Spinner cntTimeout { label {Inactivity timeout} callback {progdefaults.VIEWERtimeout = (int)(o->value()); progdefaults.changed = true;} tooltip {Clear channel text after \# seconds of inactivity} xywh {278 90 50 24} align 8 value 10 code0 {o->minimum(1); o->maximum(180); o->step(1);} code1 {o->value(progdefaults.VIEWERtimeout);} code2 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Spinner2 } Fl_Group listboxViewerLabel { label {Channel label} callback {progdefaults.VIEWERlabeltype = o->index(); initViewer(); progdefaults.changed = true;} open tooltip {Appearance of label on each channel} xywh {278 130 150 24} box DOWN_BOX color 7 align 8 code0 {listboxViewerLabel->add(_("None")); listboxViewerLabel->add(_("Audio frequency"));} code1 {listboxViewerLabel->add(_("Radio frequency")); listboxViewerLabel->add(_("Channel number"));} code3 {listboxViewerLabel->index(progdefaults.VIEWERlabeltype); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Button btnViewerFont { label {Font...} callback {font_browser->fontNumber(progdefaults.ViewerFontnbr); font_browser->fontSize(progdefaults.ViewerFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); if (font_browser->fixed_width(progdefaults.ViewerFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbViewerFontBrowser); font_browser->show();} tooltip {select browser font} xywh {563 130 70 24} } Fl_Check_Button btnFixedIntervals { label {Fixed Intervals} callback {progdefaults.VIEWERfixed = o->value(); progdefaults.changed = true; initViewer();} tooltip {Force channel spacing to even 100 Hz increments} xywh {468 92 165 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.VIEWERfixed);} } Fl_Check_Button btnMarquee { label {Continuous scrolling} callback {progdefaults.VIEWERmarquee = o->value(); progdefaults.changed = true; initViewer();} tooltip {ON - Marquee style OFF - Clear & restart} xywh {278 168 165 20} down_box DOWN_BOX code0 {o->value(progdefaults.VIEWERmarquee);} } Fl_Check_Button btnAscend { label {Lowest freq on bottom of viewer} callback {progdefaults.VIEWERascend = o->value(); progdefaults.changed = true; initViewer();} tooltip {Change positions of low to high channels} xywh {278 192 253 20} down_box DOWN_BOX code0 {o->value(progdefaults.VIEWERascend);} } Fl_Check_Button btnBrowserHistory { label {Play back history when active channel selected} callback {progdefaults.VIEWERhistory = o->value(); progdefaults.changed = true;} tooltip {Audio stream history decoded on selected signal} xywh {278 217 356 20} down_box DOWN_BOX code0 {o->value(progdefaults.VIEWERhistory);} } } Fl_Group {} { label {UI/Browser/Colors} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Browser/Colors"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("UI/Browser/Colors"));} } { Fl_Button bwsrHiLite_1_color { label {HiLite 1} callback {progdefaults.bwsrHiLight1 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight1); bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1); viewer_redraw(); progdefaults.changed = true;} tooltip {PSK/RTTY Viewer HiLite Color 1} xywh {259 113 62 22} align 1 code0 {bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1);} code1 {\#include "Viewer.h"} } Fl_Button bwsrHiLite_2_color { label {HiLite 2} callback {progdefaults.bwsrHiLight2 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight2); bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2); viewer_redraw(); progdefaults.changed = true;} tooltip {PSK/RTTY Viewer HiLite Color 2} xywh {361 113 62 22} align 1 code0 {bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2);} } Fl_Button bwsrHiLite_even_lines { label Even callback {progdefaults.bwsrBackgnd2 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd2); bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2); viewer_redraw(); progdefaults.changed = true;;} tooltip {Even lines} xywh {464 113 62 22} align 1 code0 {bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2);} } Fl_Button bwsrHiLite_odd_lines { label Odd callback {progdefaults.bwsrBackgnd1 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd1); bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1); viewer_redraw(); progdefaults.changed = true;} tooltip {Odd lines} xywh {567 113 62 22} align 1 code0 {bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1);} } Fl_Button bwsrHiLite_select { label Select callback {progdefaults.bwsrSelect = fl_show_colormap((Fl_Color)progdefaults.bwsrSelect); bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect); viewer_redraw(); progdefaults.changed = true;} tooltip {Select line} xywh {671 113 62 22} align 1 code0 {bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect);} } } Fl_Group {} { label {UI/Browser/Detection Level} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Browser/Detection Level"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("UI/Browser/Detection Level"));} } { Fl_Button bwsrSliderColor { label Backgnd callback {uchar r, g, b; r = progdefaults.bwsrSliderColor.R; g = progdefaults.bwsrSliderColor.G; b = progdefaults.bwsrSliderColor.B; if (fl_color_chooser("Slider Color", r, g, b) == 0) return; progdefaults.bwsrSliderColor.R = r; progdefaults.bwsrSliderColor.G = g; progdefaults.bwsrSliderColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true;} tooltip {Background color of signal viewer squelch control} xywh {294 118 112 24} align 1 code0 {bwsrSliderColor->color(fl_rgb_color(progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G,progdefaults.bwsrSliderColor.B));} } Fl_Button bwsrSldrSelColor { label Button callback {uchar r, g, b; r = progdefaults.bwsrSldrSelColor.R; g = progdefaults.bwsrSldrSelColor.G; b = progdefaults.bwsrSldrSelColor.B; if (fl_color_chooser("Button Color", r, g, b) == 0) return; progdefaults.bwsrSldrSelColor.R = r; progdefaults.bwsrSldrSelColor.G = g; progdefaults.bwsrSldrSelColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->selection_color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->selection_color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true;} tooltip {Slider hilite color of signal viewer squelch control} xywh {545 118 112 24} align 1 code0 {bwsrSldrSelColor->color(fl_rgb_color(progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G,progdefaults.bwsrSliderColor.B));} } } Fl_Group {} { label {UI/General} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/General"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("UI/General"));} } { Fl_Group {} {open xywh {206 21 590 76} box ENGRAVED_FRAME } { Fl_Check_Button btnShowTooltips { label {Show tooltips} callback {progdefaults.tooltips = o->value(); Fl_Tooltip::enable(progdefaults.tooltips); progdefaults.changed = true;} tooltip {Enable / disable tooltips} xywh {276 34 120 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.tooltips);} } Fl_Check_Button chkMenuIcons { label {Show menu icons} callback {progdefaults.menuicons = o->value(); icons::toggle_icon_labels(); progdefaults.changed = true;} tooltip {Enable / disable icons on menus} xywh {420 34 150 20} down_box DOWN_BOX code0 {o->value(progdefaults.menuicons);} } Fl_Group listboxScheme { label {UI scheme} callback {progdefaults.ui_scheme = o->value(); Fl::scheme(progdefaults.ui_scheme.c_str()); progdefaults.changed = true;} open tooltip {Change application look and feel} xywh {394 63 80 20} box DOWN_BOX color 7 align 8 code0 {listboxScheme->add("base");} code1 {listboxScheme->add("gtk+");} code2 {listboxScheme->add("plastic"); listboxScheme->add("gleam");} code3 {listboxScheme->value(progdefaults.ui_scheme.c_str()); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Button bVisibleModes { label {Visible modes} callback {mode_browser->label(o->label()); mode_browser->callback(toggle_visible_modes); mode_browser->show_(&progdefaults.visible_modes); progdefaults.changed = true;} tooltip {Select modes for menu access} xywh {259 63 110 20} } Fl_Group listbox_language { label {UI language} callback {progdefaults.ui_language = o->index(); progdefaults.changed = true;} open tooltip {Changes take effect on next program startup} xywh {576 63 170 20} box DOWN_BOX color 7 labelsize 12 align 5 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } Fl_Group {} {open xywh {206 103 590 34} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_rx_lowercase { label {Print CW / RTTY / THROB / CONTESTIA in lowercase} callback {progdefaults.rx_lowercase = o->value(); progdefaults.changed = true;} xywh {246 110 441 20} down_box DOWN_BOX code0 {o->value(progdefaults.rx_lowercase);} } } Fl_Group {} {open xywh {206 139 294 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_tx_lowercase { label {Transmit lower case text} callback {progdefaults.tx_lowercase = o->value(); progdefaults.changed = true;} xywh {241 148 199 20} down_box DOWN_BOX code0 {o->value(progdefaults.tx_lowercase);} } } Fl_Group {} { label {Exit prompts} xywh {206 206 590 76} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_save_config_on_exit { label {Prompt to save Configuration} callback {progdefaults.SaveConfig = o->value(); progdefaults.changed = true;} xywh {246 230 264 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveConfig);} } Fl_Check_Button btn2_save_macros_on_exit { label {Prompt to save macro file} callback {btn_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true;} tooltip {Write current macro set on program exit} xywh {246 252 264 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveMacros);} } Fl_Check_Button btn2NagMe { label {Prompt to save log} callback {btnNagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true;} tooltip {Bug me about saving log entries} xywh {523 230 188 20} down_box DOWN_BOX code0 {o->value(progdefaults.NagMe);} } Fl_Check_Button btn2_confirm_exit { label {Confirm exit} callback {btn2_confirm_exit->value(o->value()); progdefaults.confirmExit=o->value(); progdefaults.changed = true;} xywh {523 252 226 20} down_box DOWN_BOX code0 {o->value(progdefaults.confirmExit);} } } Fl_Group {} { label {Check for updates} open xywh {206 285 590 60} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_check_for_updates { label {Check for updates when starting program} callback {progdefaults.check_for_updates = o->value(); progdefaults.changed = true;} xywh {246 308 367 20} down_box DOWN_BOX code0 {o->value(progdefaults.check_for_updates);} } } Fl_Group {} {open xywh {501 139 295 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_tx_show_timer { label {Show TX timer} callback {progdefaults.show_tx_timer = o->value(); progdefaults.changed = true;} xywh {520 148 219 20} down_box DOWN_BOX code0 {o->value(progdefaults.show_tx_timer);} } Fl_Spinner val_tx_timeout { label {TX deadmen timeout (mins)} callback {progdefaults.tx_timeout=o->value(); progdefaults.changed = true;} xywh {521 173 45 24} align 8 minimum 0 maximum 60 value 10 code0 {o->value(progdefaults.tx_timeout);} } } } Fl_Group {} { label {UI/Macro buttons} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Macro buttons"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("UI/Macro buttons"));} } { Fl_Group {} {open xywh {205 205 590 35} box ENGRAVED_FRAME } { Fl_Check_Button btnMacroMouseWheel { label {Mouse wheel active on macro buttons} callback {progdefaults.macro_wheel = o->value(); progdefaults.changed = true;} tooltip {enable mouse wheel control of macro bar} xywh {262 213 296 20} down_box DOWN_BOX code0 {o->value(progdefaults.macro_wheel);} } } Fl_Group {} { label {Number and position of macro bars} open xywh {205 25 590 180} box ENGRAVED_FRAME align 21 } { Fl_Counter cnt_macro_height { label {Button Height} callback {progdefaults.macro_height = (int)o->value(); progdefaults.changed = true; set_macroLabels(); UI_select();} tooltip {Height of macro bar} xywh {415 50 89 22} type Simple align 8 minimum 18 maximum 30 step 1 value 20 code0 {o->value(progdefaults.macro_height);} } Fl_Round_Button btn_scheme_0 { label {One above Rx/Tx} callback {progdefaults.mbar_scheme = 0; set_macroLabels(); UI_select(); progdefaults.changed = true;} tooltip {Single macro bar below logging panel variable height} xywh {261 78 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_1 { label {One above waterfall} callback {progdefaults.mbar_scheme = 1; set_macroLabels(); UI_select(); progdefaults.changed = true;} xywh {261 103 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_2 { label {One below waterfall} callback {progdefaults.mbar_scheme = 2; set_macroLabels(); UI_select(); progdefaults.changed = true;} xywh {261 128 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_3 { label {Two scheme 1} callback {progdefaults.mbar_scheme = 3; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {428 78 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_4 { label {Two scheme 2} callback {progdefaults.mbar_scheme = 4; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {596 78 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_5 { label {Two scheme 3} callback {progdefaults.mbar_scheme = 5; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {428 103 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_6 { label {Two scheme 4} callback {progdefaults.mbar_scheme = 6; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {596 103 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_7 { label {Two scheme 5} callback {progdefaults.mbar_scheme = 7; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {428 128 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_8 { label {Two scheme 6} callback {progdefaults.mbar_scheme = 8; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {596 128 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_9 { label {Two scheme 7} callback {progdefaults.mbar_scheme = 9; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {428 153 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_10 { label {Two scheme 8} callback {progdefaults.mbar_scheme = 10; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {596 153 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_11 { label {Two scheme 9} callback {progdefaults.mbar_scheme = 11; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {428 178 144 22} type Radio down_box ROUND_DOWN_BOX } Fl_Round_Button btn_scheme_12 { label {Two scheme 10} callback {progdefaults.mbar_scheme = 12; progdefaults.changed = true; set_macroLabels(); UI_select();} xywh {596 178 144 22} type Radio down_box ROUND_DOWN_BOX } } Fl_Group {} {open xywh {205 240 590 55} box ENGRAVED_FRAME } { Fl_Check_Button btnUseLastMacro { label {Load last used macro file at start} callback {progdefaults.UseLastMacro = o->value(); update_main_title(); progdefaults.changed = true;} tooltip {ON - use last set of macros OFF - use default set} xywh {262 245 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseLastMacro);} } Fl_Check_Button btnDisplayMacroFilename { label {Display macro filename at start} callback {progdefaults.DisplayMacroFilename = o->value(); progdefaults.changed = true;} tooltip {The filename is written to the RX text area} xywh {262 267 277 20} down_box DOWN_BOX code0 {o->value(progdefaults.DisplayMacroFilename);} } Fl_Check_Button btn_save_macros_on_exit { label {Prompt to save macro file} callback {btn2_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true;} tooltip {Write current macro set on program exit} xywh {545 245 216 20} down_box DOWN_BOX code0 {o->value(progdefaults.SaveMacros);} } } Fl_Group {} {open xywh {205 295 295 45} box ENGRAVED_FRAME } { Fl_Check_Button btn_macro_post { label {Show macro control codes} callback {progdefaults.macro_post = o->value(); progdefaults.changed = true;} tooltip {print ^! execution codes in Rx panel} xywh {265 307 216 20} down_box DOWN_BOX code0 {o->value(progdefaults.macro_post);} } } Fl_Group {} {open xywh {500 295 295 45} box ENGRAVED_FRAME } { Fl_Check_Button btn_4bar_position { label {4 bar macro set below Tx} callback {progdefaults.four_bar_position = o->value(); UI_select(); progdefaults.changed = true;} tooltip {Position the 4 bar macro set below Tx panel Default above Rx panel} xywh {532 307 216 20} down_box DOWN_BOX code0 {o->value(progdefaults.four_bar_position);} } } } Fl_Group {} { label {UI/Rx Text} xywh {200 2 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Rx Text"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("UI/Rx Text"));} } { Fl_Check_Button btnRXClicks { label {Single-click to capture} callback {progdefaults.rxtext_clicks_qso_data = o->value(); progdefaults.changed = true;} tooltip {Enable for single click capure of text in Rx panel} xywh {242 118 191 20} down_box DOWN_BOX code0 {o->value(progdefaults.rxtext_clicks_qso_data);} } Fl_Check_Button btnRXTooltips { label {callsign tooltips in received text} callback {progdefaults.rxtext_tooltips = o->value(); progdefaults.changed = true;} tooltip {Popup info after a 2 second hover on a callsign} xywh {484 118 254 20} down_box DOWN_BOX code0 {o->value(progdefaults.rxtext_tooltips);} } Fl_Input inpNonword { label {Word delimiters} callback {progdefaults.nonwordchars = o->value(); progdefaults.changed = true;} tooltip {RX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.} xywh {384 84 279 24} textfont 4 code0 {o->value(progdefaults.nonwordchars.c_str());} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Input2 } Fl_Check_Button btnUSunits { label {US units of distance (QRB)} callback {progdefaults.us_units = o->value(); progdefaults.changed = true;} tooltip {Enable for single click capure of text in Rx panel} xywh {484 147 220 20} down_box DOWN_BOX code0 {o->value(progdefaults.us_units);} } Fl_Check_Button btn_clear_fields { label {Clear log fields - new CALL} callback {progdefaults.clear_fields=o->value(); progdefaults.changed = true;} xywh {242 147 198 20} down_box DOWN_BOX code0 {o->value(progdefaults.clear_fields);} } } Fl_Group {} { label {UI/Touch} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Touch"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("UI/Touch"));} code3 {tab_tree->close(_("UI"));} } { Fl_Box {} { label {Note: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.} xywh {216 44 570 52} align 20 } Fl_Group {} { label {Arrow Key Control of Frequency Entry} open xywh {216 110 570 102} box ENGRAVED_BOX align 21 } { Fl_Box {} { label {Right/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSD} xywh {231 135 290 74} align 16 } Fl_Choice sel_lsd { label {Right/Left Select Least Signficant Digit} callback {progdefaults.sel_lsd = o->value(); set_freq_control_lsd(); progdefaults.changed = true;} open xywh {621 171 90 24} down_box BORDER_BOX align 1 code0 {o->add("1 Hz|10 Hz|100 Hz|1 kHz");} code1 {o->value(progdefaults.sel_lsd);} } {} } Fl_Group {} { label {Rx / Tx Panels} open xywh {216 221 570 64} box ENGRAVED_BOX align 21 } { Fl_Check_Button btn_rxtx_swap { label {Tx above Rx} callback {progdefaults.rxtx_swap = o->value(); progdefaults.changed = true; UI_select();} tooltip {Enable to put Tx panel above Rx panel} xywh {336 225 116 30} down_box DOWN_BOX code0 {o->value(progdefaults.rxtx_swap);} } } } Fl_Group {} { label {Waterfall/Buttons & Controls} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/Buttons & Controls"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Waterfall/Buttons & Controls"));} } { Fl_Box {} { label {Enable check box to show each respective operator control} xywh {285 70 446 25} box FLAT_BOX align 16 } Fl_Check_Button btnWF_UIrev { label Reverse callback {progdefaults.WF_UIrev = o->value(); progdefaults.changed = true; WF_UI();} xywh {312 103 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIrev);} } Fl_Check_Button btnWF_UIx1 { label {WF Magnification} callback {progdefaults.WF_UIx1 = o->value(); progdefaults.changed = true; WF_UI();} xywh {531 103 162 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIx1);} } Fl_Check_Button btnWF_UIwfcarrier { label {WF carrier} callback {progdefaults.WF_UIwfcarrier = o->value(); progdefaults.changed = true; WF_UI();} xywh {312 134 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfcarrier);} } Fl_Check_Button btnWF_UIwfshift { label {WF Shift Controls} callback {progdefaults.WF_UIwfshift = o->value(); progdefaults.changed = true; WF_UI();} xywh {531 134 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfshift);} } Fl_Check_Button btnWF_UIwfreflevel { label {WF ref level} callback {progdefaults.WF_UIwfreflevel = o->value(); progdefaults.changed = true; WF_UI();} xywh {312 166 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfreflevel);} } Fl_Check_Button btnWF_UIwfdrop { label {WF drop rate} callback {progdefaults.WF_UIwfdrop = o->value(); progdefaults.changed = true; WF_UI();} xywh {531 166 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfdrop);} } Fl_Check_Button btnWF_UIwfampspan { label {WF amp span} callback {progdefaults.WF_UIwfampspan = o->value(); progdefaults.changed = true; WF_UI();} xywh {312 198 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfampspan);} } Fl_Check_Button btnWF_UIwfstore { label {WF Store} callback {progdefaults.WF_UIwfstore = o->value(); progdefaults.changed = true; WF_UI();} xywh {531 198 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfstore);} } Fl_Check_Button btnWF_UIwfmode { label {WF mode} callback {progdefaults.WF_UIwfmode = o->value(); progdefaults.changed = true; WF_UI();} xywh {312 230 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIwfmode);} } Fl_Check_Button btnWF_UIqsy { label QSY callback {progdefaults.WF_UIqsy = o->value(); progdefaults.changed = true; WF_UI();} xywh {531 230 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIqsy);} } Fl_Check_Button btnWF_UIxmtlock { label {XMT lock} callback {progdefaults.WF_UIxmtlock = o->value(); progdefaults.changed = true; WF_UI();} xywh {531 262 150 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.WF_UIxmtlock);} } Fl_Button btn_wf_enable_all { label {Enable all} callback {btnWF_UIrev->value(progdefaults.WF_UIrev = 1); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 1); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 1); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 1); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 1); btnWF_UIx1->value(progdefaults.WF_UIx1 = 1); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 1); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 1); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 1); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 1); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 1); progdefaults.changed = true; WF_UI();} xywh {356 285 88 20} } Fl_Button btn_wf_disable_all { label {Disable all} callback {btnWF_UIrev->value(progdefaults.WF_UIrev = 0); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 0); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 0); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 0); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 0); btnWF_UIx1->value(progdefaults.WF_UIx1 = 0); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 0); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 0); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 0); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 0); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 0); progdefaults.changed = true; WF_UI();} xywh {555 285 88 20} } } Fl_Group {} { label {Waterfall/Display} open selected xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/Display"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Waterfall/Display"));} } { Fl_Group {} { label {Colors and cursors} open xywh {210 32 580 190} box ENGRAVED_FRAME align 21 } { Fl_Button WF_Palette { label aa callback {progdefaults.changed = true;} xywh {219 68 380 24} box DOWN_BOX color 0 labelsize 12 align 5 code0 {\#include "colorbox.h"} code1 {o->label(progdefaults.PaletteName.c_str());} code2 {o->labelsize(FL_NORMAL_SIZE);} class colorbox } Fl_Button {btnColor[0]} { callback {selectColor(0); progdefaults.changed = true;} tooltip {Change color} xywh {219 94 20 24} } Fl_Button {btnColor[1]} { callback {selectColor(1); progdefaults.changed = true;} tooltip {Change color} xywh {264 94 20 24} } Fl_Button {btnColor[2]} { callback {selectColor(2); progdefaults.changed = true;} tooltip {Change color} xywh {309 94 20 24} } Fl_Button {btnColor[3]} { callback {selectColor(3); progdefaults.changed = true;} tooltip {Change color} xywh {354 94 20 24} } Fl_Button {btnColor[4]} { callback {selectColor(4); progdefaults.changed = true;} tooltip {Change color} xywh {399 94 20 24} } Fl_Button {btnColor[5]} { callback {selectColor(5); progdefaults.changed = true;} tooltip {Change color} xywh {444 94 20 24} } Fl_Button {btnColor[6]} { callback {selectColor(6); progdefaults.changed = true;} tooltip {Change color} xywh {489 94 20 24} } Fl_Button {btnColor[7]} { callback {selectColor(7); progdefaults.changed = true;} tooltip {Change color} xywh {534 94 20 24} } Fl_Button {btnColor[8]} { callback {selectColor(8); progdefaults.changed = true;} tooltip {Change color} xywh {579 94 20 24} } Fl_Button btnLoadPalette { label {Load...} callback {loadPalette(); progdefaults.changed = true;} tooltip {Load a new palette} xywh {609 68 70 24} code0 {\#include "colorbox.h"} } Fl_Button btnSavePalette { label {Save...} callback {savePalette();} tooltip {Save this palette} xywh {609 94 70 24} code0 {\#include "colorbox.h"} } Fl_Group {} { label {Signal BW} open xywh {218 122 90 96} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseCursorLines { label ON callback {progdefaults.UseCursorLines = o->value(); if (o->value()) btnCursorBWcolor->activate(); else btnCursorBWcolor->deactivate(); progdefaults.changed = true;} tooltip {Show cursor with bandwidth lines} xywh {220 142 56 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseCursorLines);} } Fl_Button btnCursorBWcolor { label Color callback {if (fl_color_chooser("Cursor BW Lines", progdefaults.cursorLineRGBI.R, progdefaults.cursorLineRGBI.G, progdefaults.cursorLineRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B)); o->redraw(); progdefaults.changed = true; }} tooltip {Change color} xywh {220 165 20 20} color 3 align 8 code0 {\#include } code1 {o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B));} } Fl_Check_Button btnUseWideCursor { label Wide callback {progdefaults.UseWideCursor = o->value(); progdefaults.changed = true;} xywh {220 188 62 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseWideCursor);} } } Fl_Group {} { label {Center line} open xywh {312 122 90 96} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseCursorCenterLine { label ON callback {progdefaults.UseCursorCenterLine = o->value(); progdefaults.changed = true;} tooltip {Show cursor with center line} xywh {318 142 48 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseCursorCenterLine);} } Fl_Button btnCursorCenterLineColor { label Color callback {if (fl_color_chooser("Cursor Center Line", progdefaults.cursorCenterRGBI.R, progdefaults.cursorCenterRGBI.G, progdefaults.cursorCenterRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B)); o->redraw(); progdefaults.changed = true; }} tooltip {Change color} xywh {318 165 20 20} color 7 align 8 code0 {o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B));} } Fl_Check_Button btnUseWideCenter { label Wide callback {progdefaults.UseWideCenter = o->value(); progdefaults.changed = true;} xywh {318 190 69 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseWideCenter);} } } Fl_Group {} { label {Signal trks} open xywh {406 122 90 96} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnUseBWTracks { label ON callback {progdefaults.UseBWTracks = o->value(); progdefaults.changed = true;} tooltip {Show bandwidth tracks on waterfall} xywh {408 141 56 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseBWTracks);} } Fl_Button btnBwTracksColor { label Color callback {if (fl_color_chooser("Track Lines", progdefaults.bwTrackRGBI.R, progdefaults.bwTrackRGBI.G, progdefaults.bwTrackRGBI.B) ) { o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Change color} xywh {408 164 20 20} color 1 align 8 code0 {o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B));} } Fl_Check_Button btnUseWideTracks { label Wide callback {progdefaults.UseWideTracks = o->value(); progdefaults.changed = true;} xywh {408 188 74 20} down_box DOWN_BOX code0 {o->value(progdefaults.UseWideTracks);} } } Fl_Group {} { label Notch open xywh {501 122 90 96} box ENGRAVED_FRAME align 21 } { Fl_Button btnNotchColor { label Color callback {if (fl_color_chooser("Notch Indicator", progdefaults.notchRGBI.R, progdefaults.notchRGBI.G, progdefaults.notchRGBI.B) ) { o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Change color} xywh {503 164 20 20} color 1 align 8 code0 {o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B));} } } Fl_Group {} { label {RsID Zone} open xywh {595 124 90 96} box ENGRAVED_FRAME align 21 } { Fl_Button btnRsIDZoneColor { label Color callback {if (fl_color_chooser("RsID Zone Lines", progdefaults.rsidRGBI.R, progdefaults.rsidRGBI.G, progdefaults.rsidRGBI.B) ) { o->color(fl_rgb_color(progdefaults.rsidRGBI.R,progdefaults.rsidRGBI.G,progdefaults.rsidRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Change color} xywh {597 166 20 20} color 1 align 8 code0 {o->color(fl_rgb_color(progdefaults.rsidRGBI.R,progdefaults.rsidRGBI.G,progdefaults.rsidRGBI.B));} } } Fl_Group {} { label Monitor open tooltip {Audio monitor} xywh {690 122 90 96} box ENGRAVED_FRAME align 21 } { Fl_Button btnMonitorColor { label Color callback {if (fl_color_chooser("Notch Indicator", progdefaults.monitorRGBI.R, progdefaults.monitorRGBI.G, progdefaults.monitorRGBI.B) ) { o->color(fl_rgb_color(progdefaults.monitorRGBI.R,progdefaults.monitorRGBI.G,progdefaults.monitorRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }} tooltip {Change color} xywh {692 164 20 20} color 2 align 8 code0 {o->color(fl_rgb_color(progdefaults.monitorRGBI.R,progdefaults.monitorRGBI.G,progdefaults.monitorRGBI.B));} } Fl_Check_Button btnUseWideMonitor { label Wide callback {progdefaults.mon_wide_tracks = o->value(); progdefaults.changed = true;} xywh {692 190 74 20} down_box DOWN_BOX code0 {o->value(progdefaults.mon_wide_tracks);} } } } Fl_Group {} { label {Frequency scale} open xywh {210 223 580 55} box ENGRAVED_FRAME align 21 } { Fl_Check_Button chkShowAudioScale { label {Always show audio frequencies} callback {progdefaults.wf_audioscale = o->value(); progdefaults.changed = true;} tooltip {Audio or RF frequencies on waterfall scale} xywh {219 246 241 20} down_box DOWN_BOX code0 {o->value(progdefaults.wf_audioscale);} } Fl_Button btnWaterfallFont { label {Font...} callback {font_browser->fontNumber(progdefaults.WaterfallFontnbr); font_browser->fontSize(progdefaults.WaterfallFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); if (font_browser->fixed_width(progdefaults.WaterfallFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback((Fl_Callback*)cbWaterfallFontBrowser); font_browser->show();} tooltip {Select waterfall scale font} xywh {519 246 71 24} } } Fl_Group {} { label {Transmit signal} open xywh {210 279 580 65} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btnViewXmtSignal { label {Monitor transmitted signal} callback {progdefaults.viewXmtSignal=o->value(); progdefaults.changed = true;} tooltip {Show transmit signal on waterfall} xywh {219 305 208 20} down_box DOWN_BOX code0 {o->value(progdefaults.viewXmtSignal);} } Fl_Counter valTxMonitorLevel { label {Signal Level (dB)} callback {progdefaults.TxMonitorLevel = pow(10.0, o->value()/20); progdefaults.changed = true;} tooltip {Set level for good viewing} xywh {497 304 114 21} align 1 minimum -80 maximum 0 step 1 value -20 code0 {o->value(20*log10(progdefaults.TxMonitorLevel));} code1 {o->lstep(10);} } } } Fl_Group {} { label {Waterfall/FFT Processing} open xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/FFT Processing"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Waterfall/FFT Processing"));} } { Fl_Group {} {open xywh {251 25 490 135} box ENGRAVED_FRAME } { Fl_Counter cntLowFreqCutoff { label {Lower limit} callback {progdefaults.LowFreqCutoff=(int)(o->value()); progdefaults.changed = true; setwfrange();} tooltip {Low frequency limit in Hz} xywh {296 43 70 22} type Simple align 8 minimum 0 maximum 500 step 50 value 300 code0 {o->value(progdefaults.LowFreqCutoff);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnWFaveraging { label {FFT averaging} callback {progdefaults.WFaveraging = o->value(); progdefaults.changed = true;} tooltip {Use averaging to decrease waterfall noise} xywh {296 79 120 20} down_box DOWN_BOX code0 {o->value(progdefaults.WFaveraging);} } Fl_Group listboxFFTPrefilter { label {FFT prefilter window function} callback {progdefaults.wfPreFilter = o->index(); progdefaults.changed = true;} open tooltip {Select the type of FFT prefilter} xywh {296 109 120 24} box DOWN_BOX color 7 align 8 code0 {listboxFFTPrefilter->add(_("Rectangular")); listboxFFTPrefilter->add("Blackman");} code1 {listboxFFTPrefilter->add("Hamming"); listboxFFTPrefilter->add("Hanning");} code2 {listboxFFTPrefilter->add(_("Triangular"));} code3 {listboxFFTPrefilter->index(progdefaults.wfPreFilter); o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} Fl_Counter cntrWfwidth { label {Upper limit} callback {progdefaults.HighFreqCutoff = (int)o->value(); progdefaults.changed = true; setwfrange();} tooltip {High frequency limit in Hz} xywh {519 43 95 22} type Simple align 8 minimum 2000 maximum 4000 step 100 value 3000 code0 {o->value(progdefaults.HighFreqCutoff);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter wf_latency { label Latency callback {progdefaults.wf_latency = (int)o->value(); progdefaults.changed = true;} tooltip {Signal averaging over time 0 - least 4 - greatest} xywh {519 78 95 22} type Simple align 8 minimum 1 maximum 16 step 1 value 8 code0 {o->value(progdefaults.wf_latency);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } } Fl_Group {} {open tooltip {Show me more or less waterfall} xywh {251 166 490 73} box ENGRAVED_FRAME align 17 } { Fl_Counter cntr_drop_speed { label {Slow drop rate} callback {progdefaults.drop_speed=(int)o->value(); progdefaults.changed=true;} tooltip {Normal drop speed / value} xywh {296 188 95 22} type Simple align 11 minimum 4 maximum 32 step 2 value 4 code0 {o->value(progdefaults.drop_speed);} } } Fl_Group {} { label {Changes take effect on next program startup} open tooltip {Show me more or less waterfall} xywh {251 246 490 73} box ENGRAVED_FRAME align 17 } { Fl_Counter cntrWfheight { label {Waterfall height in pixels} callback {progdefaults.wfheight = (int)o->value(); progdefaults.changed = true;} tooltip {CPU usage increases with waterfall height} xywh {296 276 120 22} align 8 minimum 100 maximum 500 step 5 value 120 code0 {o->value(progdefaults.wfheight);} code1 {o->labelsize(FL_NORMAL_SIZE);} code2 {o->lstep(50);} class Fl_Counter2 } } } Fl_Group {} { label {Waterfall/Mouse usage} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/Mouse usage"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Waterfall/Mouse usage"));} } { Fl_Group {} {open xywh {211 50 580 170} box ENGRAVED_FRAME } { Fl_Check_Button btnWaterfallHistoryDefault { label {Left or right click always replays audio history} callback {progdefaults.WaterfallHistoryDefault = o->value(); progdefaults.changed = true;} tooltip {Replay trackline audio} xywh {266 65 340 20} down_box DOWN_BOX code0 {o->value(progdefaults.WaterfallHistoryDefault);} } Fl_Check_Button btnWaterfallQSY { label {Dragging on the waterfall scale changes frequency} callback {progdefaults.WaterfallQSY = o->value(); progdefaults.changed = true;} tooltip {Enable drag cursor on waterfall scale} xywh {266 95 380 20} down_box DOWN_BOX code0 {o->value(progdefaults.WaterfallQSY);} } Fl_Check_Button btnWaterfallClickInsert { label {Insert text on single left click} callback {progdefaults.WaterfallClickInsert = o->value(); if (progdefaults.WaterfallClickInsert) inpWaterfallClickText->activate(); else inpWaterfallClickText->deactivate(); progdefaults.changed = true;} tooltip {Insert special text in Rx panel when waterfall clicked} xywh {266 137 225 20} down_box DOWN_BOX code0 {o->value(progdefaults.WaterfallClickInsert);} } Fl_Input inpWaterfallClickText { callback {progdefaults.WaterfallClickText = o->value(); progdefaults.changed = true;} tooltip {The string is replaced with the current modem and frequency} xywh {552 125 180 50} align 8 class Fl_Input2 } Fl_Group listboxWaterfallWheelAction { label {Wheel action} callback {progdefaults.WaterfallWheelAction = o->index(); progdefaults.changed = true;} open tooltip {Select how the mouse wheel behaves inside the waterfall} xywh {266 178 150 22} box DOWN_BOX color 7 align 8 code0 {o->labelsize(FL_NORMAL_SIZE);} class Fl_ListBox } {} } } Fl_Group {} { label {Waterfall/Spectrum} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/Spectrum"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Waterfall/Spectrum"));} code3 {tab_tree->close(_("Waterfall"));} } { Fl_Group {} { label {Spectrum Scope / Waterfall interaction} open xywh {210 50 580 150} box ENGRAVED_BOX align 17 } { Fl_Check_Button btnWFspectrum_center { label {left click transfers frequency to scope center frequency} callback {progdefaults.wf_spectrum_center = o->value(); progdefaults.changed = true;} tooltip {left click on WF recenters spectrum scope} xywh {275 92 365 20} down_box DOWN_BOX code0 {o->value(progdefaults.wf_spectrum_center);} } Fl_Check_Button btnWFspectrum_dbvals { label {use waterfall range/limit values} callback {progdefaults.wf_spectrum_dbvals = o->value(); progdefaults.changed = true;} tooltip {values left/below waterfall} xywh {275 123 221 20} down_box DOWN_BOX code0 {o->value(progdefaults.wf_spectrum_dbvals);} } Fl_Counter cntr_spectrum_freq_scale { label {freq scale = N * modem bandwidth} callback {progdefaults.wf_spectrum_scale_factor = o->value(); progdefaults.changed = true;} xywh {275 155 75 20} type Simple align 8 minimum 1 maximum 10 step 1 value 5 code0 {o->value(progdefaults.wf_spectrum_scale_factor);} } Fl_Check_Button btn_spectrum_modem_scale { label use callback {progdefaults.wf_spectrum_modem_scale = o->value(); progdefaults.changed = true;} tooltip {scale spectrum display linked to modem bandwidth} xywh {585 155 55 20} down_box DOWN_BOX code0 {o->value(progdefaults.wf_spectrum_modem_scale);} } } } Fl_Group {} { label {Web/Pskmail} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Web/Pskmail"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Web/Pskmail"));} } { Fl_Group {} { label {Mail Server Attributes} open xywh {256 52 490 174} box ENGRAVED_FRAME align 21 } { Fl_Counter cntServerCarrier { label {Carrier frequency (Hz)} callback {progdefaults.ServerCarrier = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Default listen / transmit frequency} xywh {307 80 80 20} type Simple align 8 minimum 500 maximum 2500 step 25 value 1500 code0 {o->value(progdefaults.ServerCarrier);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntServerOffset { label {Search range (Hz)} callback {progdefaults.ServerOffset = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Listen for signals within this range} xywh {307 117 80 20} type Simple align 8 minimum 10 maximum 500 step 10 value 100 code0 {o->value(progdefaults.SearchRange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntServerACQsn { label {Acquisition S/N (dB)} callback {progdefaults.ServerACQsn = o->value(); progdefaults.changed = true;} tooltip {Capture signals over this threshold} xywh {307 154 80 20} type Simple align 8 minimum 3 maximum 20 step 1 value 6 code0 {o->value(progdefaults.ServerACQsn);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Counter cntServerAFCrange { label {AFC range (Hz)} callback {progdefaults.ServerAFCrange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true;} tooltip {Limit AFC movement to this range} xywh {307 191 80 20} type Simple align 8 minimum 10 maximum 500 step 10 value 25 code0 {o->value(progdefaults.SearchRange);} code1 {o->labelsize(FL_NORMAL_SIZE);} class Fl_Counter2 } Fl_Check_Button btnPSKmailSweetSpot { label {Reset to Carrier} callback {progdefaults.PSKmailSweetSpot = o->value(); progdefaults.changed = true;} tooltip {When no signal present} xywh {562 80 142 20} down_box DOWN_BOX value 1 code0 {o->value(progdefaults.PSKmailSweetSpot);} } } Fl_Group {} { label General open xywh {256 228 490 72} box ENGRAVED_FRAME align 21 } { Fl_Check_Button btn_arq_s2n_report { label {Report ARQ frames average S/N} callback {progdefaults.Pskmails2nreport=o->value();} xywh {281 253 250 20} down_box DOWN_BOX code0 {o->value(progdefaults.Pskmails2nreport);} } } } Fl_Group {} { label {Web/WX} xywh {200 0 600 350} box ENGRAVED_BOX align 21 hide code0 {CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Web/WX"));} code1 {config_pages.push_back(p);} code2 {tab_tree->add(_("Web/WX"));} code3 {tab_tree->close(_("Web"));} } { Fl_Input txt_wx_url { label {Access URL} callback {progdefaults.wx_url = o->value(); progdefaults.changed = true;} tooltip {Enter METAR data internet URL} xywh {295 63 430 25} when 1 code0 {o->value(progdefaults.wx_url.c_str());} } Fl_Button btn_default_wx_url { label Default callback {txt_wx_url->value( "https://tgftp.nws.noaa.gov/data/observations/metar/decoded"); progdefaults.wx_url=txt_wx_url->value(); progdefaults.changed=true;} tooltip {Default URL} xywh {727 63 60 25} } Fl_Input inpWXsta { label {METAR station ID code} callback {progdefaults.wx_sta = o->value(); progdefaults.changed = true;} tooltip {for example KMDQ for Huntsville-Madison Executive Airport, AL} xywh {295 99 50 24} align 8 code0 {o->value(progdefaults.wx_sta.c_str());} } Fl_Button btn_metar_search { label {Search on web} callback {get_METAR_station();} xywh {528 99 130 24} code0 {\#include "weather.h"} } Fl_Check_Button btn_wx_full { label {Full report} callback {progdefaults.wx_full=o->value(); progdefaults.changed = true;} tooltip {Insert full METAR report} xywh {303 138 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_full);} } Fl_Check_Button btn_wx_station_name { label {METAR station location} callback {progdefaults.wx_station_name = o->value(); progdefaults.changed = true;} tooltip {Add geopolitical name of METAR station} xywh {303 162 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_station_name);} } Fl_Check_Button btn_wx_condx { label Conditions callback {progdefaults.wx_condx=o->value(); progdefaults.changed = true;} tooltip {current wx conditions} xywh {303 188 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_condx);} } Fl_Check_Button btn_wx_fahrenheit { label Fahrenheit callback {progdefaults.wx_fahrenheit=o->value(); progdefaults.changed = true;} tooltip {report Fahrenheit} xywh {303 227 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_fahrenheit);} } Fl_Check_Button btn_wx_celsius { label Celsius callback {progdefaults.wx_celsius=o->value(); progdefaults.changed = true;} tooltip {report Celsius} xywh {522 227 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_celsius);} } Fl_Check_Button btn_wx_mph { label {Miles / Hour} callback {progdefaults.wx_mph=o->value(); progdefaults.changed = true;} tooltip {report miles per hour} xywh {303 253 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_mph);} } Fl_Check_Button btn_wx_kph { label {kilometers / hour} callback {progdefaults.wx_kph=o->value(); progdefaults.changed = true;} tooltip {report kilometers per hour} xywh {521 253 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_kph);} } Fl_Check_Button btn_wx_inches { label {Inches Hg.} callback {progdefaults.wx_inches=o->value(); progdefaults.changed = true;} tooltip {report inches mercury} xywh {303 280 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_inches);} } Fl_Check_Button btn_wx_mbars { label mbars callback {progdefaults.wx_mbars=o->value(); progdefaults.changed = true;} tooltip {report millibars} xywh {522 280 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_mbars);} } Fl_Check_Button btn_wx_raw { label {Unprocessed METAR data} callback {progdefaults.wx_raw=o->value(); progdefaults.changed = true;} tooltip {Insert full METAR report} xywh {522 138 70 15} down_box DOWN_BOX code0 {o->value(progdefaults.wx_raw);} } } Fl_Button btnSaveConfig { label Save callback {progdefaults.saveDefaults();} xywh {492 355 130 22} } Fl_Return_Button btnCloseConfig { label Close callback {closeDialog();} xywh {665 355 130 22} } Fl_Button btnResetConfig { label {Restore defaults} callback {if (fl_choice2("This will effect every configuration item!\\nConfirm", "Yes", "No", NULL)) { progdefaults.resetDefaults(); progdefaults.changed = false; }} tooltip {WARNING - this will over write ALL settings} xywh {238 355 130 22} } } } Function {openConfig()} {return_type void } { code {if (!dlgConfig) createConfig(); progdefaults.loadDefaults();} {} } Function {closeDialog()} {return_type void } { code {if (dlgConfig) dlgConfig->hide();} {} } Function {WefaxDestDirSet(Fl_File_Chooser *w, void *userdata)} {return_type void } { code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnWefaxSaveDir->value( w->value() ); btnWefaxSaveDir->redraw(); cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL ); }} {} } Function {KmlDestDirSet(Fl_File_Chooser *w, void *userdata)} {return_type void } { code {/* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnKmlSaveDir->value( w->value() ); btnKmlSaveDir->redraw(); cb_btnKmlSaveDir( btnKmlSaveDir, NULL ); }} {} } fldigi-4.2.05/src/dialogs/tod_clock.cxx0000664000175000017500000001436114611711171014666 00000000000000// ===================================================================== // // TOD_clock.cxx // // interface to tcpip application fdserver.tcl // fdserver is a multiple client tcpip server // // Copyright (C) 2016 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ===================================================================== #include #include #include #include #include #include #include #include #include "fl_digi.h" #include "rigsupport.h" #include "modem.h" #include "trx.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "debug.h" #include "status.h" #include "icons.h" #include "logsupport.h" #include "fd_logger.h" #include "fd_view.h" #include "confdialog.h" #include "timeops.h" #include "nanoIO.h" LOG_FILE_SOURCE(debug::LOG_FD); static pthread_t TOD_thread; static pthread_mutex_t TX_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t time_mutex = PTHREAD_MUTEX_INITIALIZER; static char ztbuf[20] = "20120602 123000"; static char ltbuf[20] = "20120602 123000"; static struct timeval tx_start_val; static struct timeval tx_last_val; static struct timeval now_val; extern void xmtrcv_cb(Fl_Widget *, void *); static int tx_timeout = 0; static int macro_time = -1; void kill_tx(void *) { wf->xmtrcv->value(0); xmtrcv_cb(wf->xmtrcv, 0); fl_alert2("TX timeout expired!\nAre you awake?"); } void service_deadman() { guard_lock txlock(&TX_mutex); if (!tx_timeout) return; if (--tx_timeout == 0) { Fl::awake(kill_tx); } } void start_deadman() { guard_lock txlock(&TX_mutex); tx_timeout = 60 * progdefaults.tx_timeout; } void stop_deadman() { guard_lock txlock(&TX_mutex); tx_timeout = 0; } void start_macro_time() { macro_time = 0; } int stop_macro_time() { return macro_time; } const timeval tmval(void) { struct timeval t1; { guard_lock lk(&time_mutex); gettimeofday(&t1, NULL); } return t1; } const double zusec(void) { struct timeval t1; { guard_lock lk(&time_mutex); gettimeofday(&t1, NULL); } double usecs = t1.tv_sec * 1000000L; usecs += t1.tv_usec; return usecs; } const unsigned long zmsec(void) { struct timeval t1; { guard_lock lk(&time_mutex); gettimeofday(&t1, NULL); } unsigned long msecs = t1.tv_sec * 1000000L; msecs += t1.tv_usec; msecs /= 1000L; return msecs; } const char* zdate(void) { return ztbuf; } const char* ztime(void) { return ztbuf + 9; } const char* ldate(void) { return ltbuf; } const char *ltime(void) { return ltbuf + 9; } const char* zshowtime(void) { static char s[5]; strncpy(s, &ztbuf[9], 4); s[4] = 0; return (const char *)s; } static char tx_time[20]; static bool TOD_exit = false; static bool TOD_enabled = false; static bool tx_timer_active = false; void show_tx_timer() { if (!tx_timer) return; if (progdefaults.show_tx_timer && tx_timer_active) { snprintf(tx_time, sizeof(tx_time),"%02d:%02d", (int)((now_val.tv_sec - tx_start_val.tv_sec)/60), (int)((now_val.tv_sec - tx_start_val.tv_sec) % 60 )); tx_timer->color(FL_DARK_RED); tx_timer->labelcolor(FL_YELLOW); tx_timer->label(tx_time); tx_timer->redraw_label(); tx_timer->redraw(); } else { tx_timer->color(FL_BACKGROUND_COLOR); tx_timer->labelcolor(FL_BACKGROUND_COLOR); tx_timer->redraw_label(); tx_timer->redraw(); } } void start_tx_timer() { tx_last_val = tx_start_val = now_val; tx_timer_active = true; REQ(show_tx_timer); } void stop_tx_timer() { if (!tx_timer) return; tx_timer_active = false; } void update_tx_timer() { if (tx_last_val.tv_sec == now_val.tv_sec) return; tx_last_val = now_val; show_tx_timer(); service_deadman(); macro_time++; } //void ztimer(void *) static void show_ztimer() { if (!inpTimeOff1) return; update_tx_timer(); sTime_off = zshowtime(); sDate_off = zdate(); inpTimeOff1->value(zshowtime()); inpTimeOff2->value(zshowtime()); inpTimeOff3->value(zshowtime()); inpTimeOff1->redraw(); inpTimeOff2->redraw(); inpTimeOff3->redraw(); } static void ztimer() { struct tm ztm, ltm; time_t t_temp; t_temp=(time_t)now_val.tv_sec; gmtime_r(&t_temp, &ztm); if (!strftime(ztbuf, sizeof(ztbuf), "%Y%m%d %H%M%S", &ztm)) memset(ztbuf, 0, sizeof(ztbuf)); else ztbuf[8] = '\0'; localtime_r(&t_temp, <m); if (!strftime(ltbuf, sizeof(ltbuf), "%Y%m%d %H%M%S", <m)) memset(ltbuf, 0, sizeof(ltbuf)); else ltbuf[8] = '\0'; REQ(show_ztimer); } //====================================================================== // TOD Thread loop //====================================================================== void *TOD_loop(void *args) { SET_THREAD_ID(TOD_TID); #define LOOP 250 int cnt = 0; while(1) { if (TOD_exit) break; if (++cnt == 4) { guard_lock tmlock(&time_mutex); gettimeofday(&now_val, NULL); ztimer(); cnt = 0; } REQ(nanoIO_read_pot); MilliSleep(LOOP); } // exit the TOD thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== void TOD_init(void) { TOD_exit = false; if (pthread_create(&TOD_thread, NULL, TOD_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); return; } LOG_INFO("%s", "Time Of Day thread started"); TOD_enabled = true; } //====================================================================== // //====================================================================== void TOD_close(void) { if (!TOD_enabled) return; TOD_exit = true; pthread_join(TOD_thread, NULL); TOD_enabled = false; LOG_INFO("%s", "Time Of Day thread terminated. "); } fldigi-4.2.05/src/dialogs/rxmon.fl0000664000175000017500000001571714611711171013675 00000000000000# data file for the Fltk User Interface Designer (fluid) version 1.0308 i18n_type 1 i18n_include "gettext.h" i18n_function _ header_name {.h} code_name {.cxx} decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include } {private local } decl {\#include "main.h"} {private local } decl {\#include "fl_digi.h"} {private local } decl {\#include "soundconf.h"} {private local } decl {\#include "configuration.h"} {public local } decl {\#include "combo.h"} {public local } decl {\#include "icons.h"} {private local } decl {\#include "flinput2.h"} {public local } decl {\#include "flslider2.h"} {public local } decl {\#include "status.h"} {private local } decl {\#include "fileselect.h"} {private local } decl {\#include "audio_alert.h"} {private local } Function {make_rxaudio_dialog()} {open } { Fl_Window {} { label {Rx Audio Monitor} open xywh {611 189 360 290} type Double visible } { Fl_Group {} {open xywh {5 4 350 50} box BORDER_FRAME color 0 } { Fl_Check_Button btn_mon_xcvr_audio { label {RX Monitor} callback {progdefaults.mon_xcvr_audio = o->value();} tooltip {Rx audio stream ON} xywh {15 8 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.mon_xcvr_audio);} } Fl_Value_Slider sldrRxFilt_vol { label {Rx Vol} callback {progdefaults.RxFilt_vol = o->value(); progdefaults.changed = true;} tooltip {Rx audio volume} xywh {15 28 290 20} type {Horz Knob} color 206 selection_color 2 align 8 maximum 100 step 1 value 50 textsize 14 code0 {o->value(progdefaults.RxFilt_vol);} class Fl_Value_Slider2 } Fl_Check_Button btn_rxgain_x10 { label {Gain X 10} callback {progdefaults.rxgain_x10 = o->value();} selected tooltip {Rx audio stream ON} xywh {212 7 93 18} down_box DOWN_BOX code0 {o->value(progdefaults.rxgain_x10);} } } Fl_Group {} { label {Filter Settings} open xywh {5 58 350 168} box BORDER_FRAME color 0 align 21 } { Fl_Check_Button btn_mon_dsp_audio { label {Rx audio filter ON} callback {progdefaults.mon_dsp_audio = o->value();} tooltip {Enable DSP filtering of rx audio stream} xywh {191 68 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.mon_dsp_audio);} } Fl_Value_Slider sldrRxFilt_bw { label BW callback {progdefaults.RxFilt_bw = o->value(); int bw2 = progdefaults.RxFilt_bw / 2; progdefaults.RxFilt_low = progdefaults.RxFilt_mid - bw2; if (progdefaults.RxFilt_low < 100) progdefaults.RxFilt_low = 100; progdefaults.RxFilt_high = progdefaults.RxFilt_mid + bw2; if (progdefaults.RxFilt_high > 4000) progdefaults.RxFilt_high = 4000; sldrRxFilt_low->value(progdefaults.RxFilt_low); sldrRxFilt_low->redraw(); sldrRxFilt_high->value(progdefaults.RxFilt_high); sldrRxFilt_high->redraw(); progdefaults.changed = true; audio_alert->init_filter();} tooltip {Filter bandwidth} xywh {10 93 300 20} type {Horz Knob} color 206 selection_color 2 align 8 minimum 50 maximum 4000 step 10 value 500 textsize 14 code0 {o->value(progdefaults.RxFilt_bw);} class Fl_Value_Slider2 } Fl_Value_Slider sldrRxFilt_mid { label Mid callback {progdefaults.RxFilt_mid = o->value(); int bw2 = progdefaults.RxFilt_bw / 2; progdefaults.RxFilt_low = progdefaults.RxFilt_mid - bw2; if (progdefaults.RxFilt_low < 100) progdefaults.RxFilt_low = 100; progdefaults.RxFilt_high = progdefaults.RxFilt_mid + bw2; if (progdefaults.RxFilt_high > 4000) progdefaults.RxFilt_high = 4000; sldrRxFilt_low->value(progdefaults.RxFilt_low); sldrRxFilt_low->redraw(); sldrRxFilt_high->value(progdefaults.RxFilt_high); sldrRxFilt_high->redraw(); progdefaults.changed = true; audio_alert->init_filter();} tooltip {Filter center frequ ency} xywh {10 120 300 20} type {Horz Knob} color 206 selection_color 2 align 8 minimum 400 maximum 3500 step 10 value 1500 textsize 14 code0 {o->value(progdefaults.RxFilt_mid);} class Fl_Value_Slider2 } Fl_Value_Slider sldrRxFilt_low { label Low callback {progdefaults.RxFilt_low = o->value(); int bw = progdefaults.RxFilt_high - progdefaults.RxFilt_low; progdefaults.RxFilt_bw = bw; sldrRxFilt_bw->value(bw); sldrRxFilt_bw->redraw(); int mid = (progdefaults.RxFilt_high + progdefaults.RxFilt_low) / 2; progdefaults.RxFilt_mid = mid; sldrRxFilt_mid->value(mid); sldrRxFilt_mid->redraw(); progdefaults.changed = true; audio_alert->init_filter();} tooltip {Filter low cutoff frequency} xywh {10 147 300 20} type {Horz Knob} color 206 selection_color 2 align 8 minimum 100 maximum 3000 step 10 value 500 textsize 14 code0 {o->value(progdefaults.RxFilt_low);} class Fl_Value_Slider2 } Fl_Value_Slider sldrRxFilt_high { label High callback {progdefaults.RxFilt_high = o->value(); int bw = progdefaults.RxFilt_high - progdefaults.RxFilt_low; progdefaults.RxFilt_bw = bw; sldrRxFilt_bw->value(bw); sldrRxFilt_bw->redraw(); int mid = (progdefaults.RxFilt_high + progdefaults.RxFilt_low) / 2; progdefaults.RxFilt_mid = mid; sldrRxFilt_mid->value(mid); sldrRxFilt_mid->redraw(); progdefaults.changed = true; audio_alert->init_filter();} tooltip {Filter high cutoff frequency} xywh {10 174 300 20} type {Horz Knob} color 206 selection_color 2 align 8 minimum 500 maximum 4000 step 10 value 900 textsize 14 code0 {o->value(progdefaults.RxFilt_high);} class Fl_Value_Slider2 } Fl_Check_Button btn_RxFilt_at_track { label {track WF cursor} callback {progdefaults.RxFilt_track_wf = o->value(); if (o->value() == 1) center_rxfilt_at_track();} tooltip {Filter center freq tracks waterfall track point} xywh {15 201 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.RxFilt_track_wf);} } Fl_Check_Button btn_mon_wf_display { label {Waterfall display} callback {progdefaults.mon_wf_display = o->value();} tooltip {DSP filter width visible on waterfall} xywh {195 201 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.mon_wf_display);} } } Fl_Group {} {open xywh {5 230 350 54} box BORDER_FRAME color 0 } { Fl_Check_Button btn_mon_xmt_audio { label {TX Monitor} callback {progdefaults.mon_xmt_audio = o->value();} tooltip {Transmit audio monitored} xywh {10 238 70 18} down_box DOWN_BOX code0 {o->value(progdefaults.mon_xmt_audio);} } Fl_Value_Slider sldr_tx_vol { label {Tx Vol} callback {progdefaults.mon_tx_vol = o->value(); progdefaults.changed = true;} tooltip {Rx audio volume} xywh {10 257 290 20} type {Horz Knob} color 206 selection_color 2 align 8 maximum 100 step 1 value 50 textsize 14 code0 {o->value(progdefaults.mon_tx_vol);} class Fl_Value_Slider2 } } } } fldigi-4.2.05/src/dialogs/Viewer.cxx0000664000175000017500000002747614611711171014201 00000000000000// ---------------------------------------------------------------------------- // // Viewer.cxx -- PSK browser // // Copyright (C) 2008-2009 // David Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "Viewer.h" #include "trx.h" #include "main.h" #include "configuration.h" #include "confdialog.h" #include "status.h" #include "waterfall.h" #include "fl_digi.h" #include "re.h" #include "gettext.h" #include "flmisc.h" #include "spot.h" #include "icons.h" #include "psk_browser.h" #include "view_rtty.h" #include "spectrum_viewer.h" extern pskBrowser *mainViewer; // // External viewer dialog // Fl_Double_Window *dlgViewer = 0; static Fl_Button *btnCloseViewer; static Fl_Button *btnClearViewer; Fl_Input2 *viewer_inp_seek; Fl_Value_Slider2 *sldrViewerSquelch; pskBrowser *brwsViewer; static long long rfc; static bool usb; void initViewer() { usb = wf->USB(); rfc = wf->rfcarrier(); if (mainViewer) { mainViewer->usb = usb; mainViewer->rfc = rfc; mainViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); mainViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); mainViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); mainViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); mainViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); mainViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); mainViewer->makecolors(); mainViewer->clear(); if (active_modem->get_mode() == MODE_RTTY) { mvsquelch->range(-12.0, 6.0); mvsquelch->value(progStatus.VIEWER_rttysquelch); } else if (active_modem->get_mode() == MODE_CW) { mvsquelch->range(0.0, 40.0); mvsquelch->value(progStatus.VIEWER_cwsquelch); } else { mvsquelch->range(-3.0, 6.0); mvsquelch->value(progStatus.VIEWER_psksquelch); } mvsquelch->redraw(); } if (brwsViewer) { brwsViewer->usb = usb; brwsViewer->rfc = rfc; brwsViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); brwsViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); brwsViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); brwsViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); brwsViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); brwsViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); brwsViewer->makecolors(); brwsViewer->clear(); dlgViewer->size(dlgViewer->w(), dlgViewer->h() - brwsViewer->h() + pskBrowser::cheight * progdefaults.VIEWERchannels + 4); if (active_modem->get_mode() == MODE_RTTY) { sldrViewerSquelch->range(-12.0, 6.0); sldrViewerSquelch->value(progStatus.VIEWER_rttysquelch); } else if (active_modem->get_mode() == MODE_CW) { sldrViewerSquelch->range(0.0, 40.0); sldrViewerSquelch->value(progStatus.VIEWER_cwsquelch); } else { sldrViewerSquelch->range(-3.0, 6.0); sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); } sldrViewerSquelch->redraw(); } active_modem->clear_viewer(); } void viewaddchr(int ch, int freq, char c, int md) { if (mainViewer) { if (mainViewer->rfc != wf->rfcarrier() || mainViewer->usb != wf->USB()) { mainViewer->rfc = wf->rfcarrier(); mainViewer->usb = wf->USB(); mainViewer->redraw(); } mainViewer->addchr(ch, freq, c, md, true); } if (dlgViewer) { if (brwsViewer->rfc != wf->rfcarrier() || brwsViewer->usb != wf->USB()) { brwsViewer->rfc = wf->rfcarrier(); brwsViewer->usb = wf->USB(); brwsViewer->redraw(); } brwsViewer->addchr(ch, freq, c, md); } if (progStatus.spot_recv && freq != NULLFREQ) spot_recv(c, ch, freq, md); } void viewclearchannel(int ch) // 0 < ch < channels - 1 { if (mainViewer) mainViewer->clearch(ch, NULLFREQ); if (dlgViewer) brwsViewer->clearch(ch, NULLFREQ); } void viewerswap(int i, int j) { if (mainViewer) mainViewer->swap(i,j); if (dlgViewer) brwsViewer->swap(i,j); } void viewer_redraw() { usb = wf->USB(); rfc = wf->rfcarrier(); if (mainViewer) { mainViewer->usb = usb; mainViewer->rfc = rfc; mainViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); mainViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); mainViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); mainViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); mainViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); mainViewer->makecolors(); mainViewer->resize(mainViewer->x(), mainViewer->y(), mainViewer->w(), mainViewer->h()); } if (dlgViewer) { brwsViewer->usb = usb; brwsViewer->rfc = rfc; brwsViewer->resize( brwsViewer->x(), brwsViewer->y(), brwsViewer->w(), brwsViewer->h()); brwsViewer->HighLight_1((Fl_Color)progdefaults.bwsrHiLight1); brwsViewer->HighLight_2((Fl_Color)progdefaults.bwsrHiLight2); brwsViewer->SelectColor((Fl_Color)progdefaults.bwsrSelect); brwsViewer->Background1((Fl_Color)progdefaults.bwsrBackgnd1); brwsViewer->Background2((Fl_Color)progdefaults.bwsrBackgnd2); brwsViewer->makecolors(); dlgViewer->redraw(); } } static void cb_btnCloseViewer(Fl_Button*, void*) { progStatus.VIEWERxpos = dlgViewer->x(); progStatus.VIEWERypos = dlgViewer->y(); progStatus.VIEWERwidth = dlgViewer->w(); progStatus.VIEWERheight = dlgViewer->h(); dlgViewer->hide(); } static void cb_btnClearViewer(Fl_Button*, void*) { brwsViewer->clear(); if (mainViewer) mainViewer->clear(); active_modem->clear_viewer(); } static void cb_brwsViewer(Fl_Hold_Browser*, void*) { int sel = brwsViewer->value(); if (sel == 0 || sel > progdefaults.VIEWERchannels) return; switch (Fl::event_button()) { case FL_LEFT_MOUSE: if (brwsViewer->freq(sel) != NULLFREQ) { if (progdefaults.VIEWERhistory) { ReceiveText->addchr('\n', FTextBase::RECV); bHistory = true; } else { ReceiveText->addchr('\n', FTextBase::ALTR); ReceiveText->addstr(brwsViewer->line(sel).c_str(), FTextBase::ALTR); } active_modem->set_freq(brwsViewer->freq(sel)); recenter_spectrum_viewer(); active_modem->set_sigsearch(SIGSEARCH); if (mainViewer) mainViewer->select(sel); } else brwsViewer->deselect(); break; case FL_MIDDLE_MOUSE: // copy from modem // set_freq(sel, active_modem->get_freq()); break; case FL_RIGHT_MOUSE: // reset { int ch = progdefaults.VIEWERascend ? progdefaults.VIEWERchannels - sel : sel - 1; active_modem->clear_ch(ch); brwsViewer->deselect(); if (mainViewer) mainViewer->deselect(); } default: break; } } static void cb_Squelch(Fl_Slider *, void *) { if (active_modem->get_mode() == MODE_RTTY) progStatus.VIEWER_rttysquelch = sldrViewerSquelch->value(); else if (active_modem->get_mode() == MODE_CW) progStatus.VIEWER_cwsquelch = sldrViewerSquelch->value(); else progStatus.VIEWER_psksquelch = sldrViewerSquelch->value(); if (mainViewer) mvsquelch->value(sldrViewerSquelch->value()); } static void cb_Seek(Fl_Input *, void *) { static Fl_Color seek_color[2] = { FL_FOREGROUND_COLOR, adjust_color(FL_RED, FL_BACKGROUND2_COLOR) }; // invalid RE seek_re.recompile(*viewer_inp_seek->value() ? viewer_inp_seek->value() : "[invalid"); if (viewer_inp_seek->textcolor() != seek_color[!seek_re]) { viewer_inp_seek->textcolor(seek_color[!seek_re]); viewer_inp_seek->redraw(); } progStatus.browser_search = viewer_inp_seek->value(); if (mainViewer) txtInpSeek->value(progStatus.browser_search.c_str()); } Fl_Double_Window* createViewer(void) { fl_font(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); pskBrowser::cwidth = (int)fl_width("W"); pskBrowser::cheight = fl_height(); int pad = BWSR_BORDER / 2; int viewerwidth = progStatus.VIEWERwidth - 2*BWSR_BORDER; int viewerheight = progStatus.VIEWERheight - 2 * BWSR_BORDER - pad - 20; Fl_Double_Window* w = new Fl_Double_Window(progStatus.VIEWERxpos, progStatus.VIEWERypos, viewerwidth + 2 * BWSR_BORDER, viewerheight + 2 * BWSR_BORDER + pad + 20 + 20, _("Signal Browser")); Fl_Group* gseek = new Fl_Group(BWSR_BORDER, BWSR_BORDER, viewerwidth, 20); // search field const char* label = _("Find: "); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); viewer_inp_seek = new Fl_Input2(static_cast(BWSR_BORDER + fl_width(label) + fl_width("X")), BWSR_BORDER, 200, gseek->h(), label); viewer_inp_seek->labelfont(FL_HELVETICA); viewer_inp_seek->callback((Fl_Callback*)cb_Seek); viewer_inp_seek->when(FL_WHEN_CHANGED); viewer_inp_seek->textfont(FL_HELVETICA); viewer_inp_seek->value(progStatus.browser_search.c_str()); viewer_inp_seek->do_callback(); gseek->resizable(0); gseek->end(); brwsViewer = new pskBrowser(BWSR_BORDER, viewer_inp_seek->y() + viewer_inp_seek->h(), viewerwidth, viewerheight); brwsViewer->callback((Fl_Callback*)cb_brwsViewer); brwsViewer->setfont(progdefaults.ViewerFontnbr, progdefaults.ViewerFontsize); brwsViewer->seek_re = &seek_re; Fl_Group *g = new Fl_Group(BWSR_BORDER, brwsViewer->y() + brwsViewer->h() + pad, viewerwidth, 20); // close button btnCloseViewer = new Fl_Button(g->w() + BWSR_BORDER - 75, g->y(), 75, g->h(), icons::make_icon_label(_("Close"), close_icon)); btnCloseViewer->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); icons::set_icon_label(btnCloseViewer); btnCloseViewer->callback((Fl_Callback*)cb_btnCloseViewer); // clear button btnClearViewer = new Fl_Button(btnCloseViewer->x() - btnCloseViewer->w() - pad, btnCloseViewer->y(), btnCloseViewer->w(), btnCloseViewer->h(), icons::make_icon_label(_("Clear"), edit_clear_icon)); btnClearViewer->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); icons::set_icon_label(btnClearViewer); btnClearViewer->callback((Fl_Callback*)cb_btnClearViewer); btnClearViewer->tooltip(_("Left click to clear text\nRight click to reset frequencies")); // squelch sldrViewerSquelch = new Fl_Value_Slider2(BWSR_BORDER, g->y(), btnClearViewer->x() - BWSR_BORDER - pad, g->h()); sldrViewerSquelch->align(FL_ALIGN_RIGHT); sldrViewerSquelch->tooltip(_("Set Viewer Squelch")); sldrViewerSquelch->type(FL_HOR_NICE_SLIDER); sldrViewerSquelch->range(-12.0, 6.0); sldrViewerSquelch->step(0.1); sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); sldrViewerSquelch->callback((Fl_Callback*)cb_Squelch); sldrViewerSquelch->color( fl_rgb_color( progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G, progdefaults.bwsrSliderColor.B)); sldrViewerSquelch->selection_color( fl_rgb_color( progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G, progdefaults.bwsrSldrSelColor.B)); g->resizable(sldrViewerSquelch); g->end(); w->end(); w->callback((Fl_Callback*)cb_btnCloseViewer); w->resizable(brwsViewer); w->size_range( (30 * pskBrowser::cwidth) + pskBrowser::sbarwidth + 2 * BWSR_BORDER, 5 * pskBrowser::cheight + 20 + 2 * BWSR_BORDER + pad); w->xclass(PACKAGE_NAME); w->hide(); return w; } void openViewer() { if (!dlgViewer) { dlgViewer = createViewer(); } initViewer(); dlgViewer->show(); dlgViewer->redraw(); } void viewer_paste_freq(int freq) { for (int i = 0; i < progdefaults.VIEWERchannels; i++) { int ftest = active_modem->viewer_get_freq(i); if (ftest == NULLFREQ) continue; if (fabs(ftest - freq) <= 50) { if (progdefaults.VIEWERascend) i = (progdefaults.VIEWERchannels - i); else i++; if (mainViewer) mainViewer->select(i); if (brwsViewer) brwsViewer->select(i); return; } } } fldigi-4.2.05/src/dialogs/fl_digi.cxx0000664000175000017500000123350114611711171014322 00000000000000// ---------------------------------------------------------------------------- // // fl_digi.cxx // // Copyright (C) 2006-2021 // Dave Freese, W1HKJ // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2020-2021 // John Phelps, KL4YFD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #ifdef __WOE32__ # ifdef __CYGWIN__ # include # else # include # endif #endif #include #include #include #include #include #include #ifndef __WOE32__ #include #endif //++++++++++++++++++ #include extern Fl_Scroll *wefax_pic_rx_scroll; #include "gettext.h" #include "fl_digi.h" #include #include #include #include //#include #include #include #include #include #include #include #include #include "waterfall.h" #include "raster.h" #include "progress.h" #include "Panel.h" #include "main.h" #include "threads.h" #include "trx.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "timeops.h" #include "rigio.h" #include "nullmodem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "mt63.h" #include "view_rtty.h" #include "olivia.h" #include "contestia.h" #include "thor.h" #include "dominoex.h" #include "feld.h" #include "throb.h" //#include "pkt.h" #include "fsq.h" #include "ifkp.h" #include "wwv.h" #include "analysis.h" #include "ssb.h" #include "fmt.h" #include "fmt_dialog.h" #include "fileselect.h" #include "smeter.h" #include "pwrmeter.h" #include "ascii.h" #include "globals.h" #include "misc.h" #include "FTextRXTX.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "macros.h" #include "macroedit.h" #include "logger.h" #include "lookupcall.h" #include "fd_logger.h" #include "fd_view.h" #include "font_browser.h" #include "icons.h" #include "pixmaps.h" #include "rigsupport.h" #include "logsupport.h" #include "qrunner.h" #include "Viewer.h" #include "soundconf.h" #include "htmlstrings.h" # include "xmlrpc.h" #if BENCHMARK_MODE # include "benchmark.h" #endif #include "debug.h" #include "re.h" #include "network.h" #include "spot.h" #include "dxcc.h" #include "locator.h" #include "notify.h" #include "strutil.h" #include "test_signal.h" #include "logbook.h" #include "rx_extract.h" #include "speak.h" #include "flmisc.h" #include "arq_io.h" #include "data_io.h" #include "kmlserver.h" #include "psm/psm.h" #include "n3fjp_logger.h" #include "dx_cluster.h" #include "dx_dialog.h" #include "notifydialog.h" #include "macroedit.h" #include "rx_extract.h" #include "wefax-pic.h" #include "charsetdistiller.h" #include "charsetlist.h" #include "outputencoder.h" #include "record_loader.h" #include "record_browse.h" #include "squelch_status.h" #include "winkeyer.h" #include "nanoIO.h" #include "audio_alert.h" #include "spectrum_viewer.h" #include "contest.h" #include "tabdefs.h" #define CB_WHEN FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED | FL_WHEN_ENTER_KEY_ALWAYS | FL_WHEN_RELEASE_ALWAYS #define LOG_TO_FILE_MLABEL _("Log all RX/TX text") #define RIGCONTROL_MLABEL TAB_RIG_CONTROL #define OPMODES_MLABEL _("Op &Mode") #define OPMODES_FEWER _("Show fewer modes") #define OPMODES_ALL _("Show all modes") #define OLIVIA_MLABEL "Olivia" #define CONTESTIA_MLABEL "Contestia" #define RTTY_MLABEL "RTTY" #define VIEW_MLABEL _("&View") #define MFSK_IMAGE_MLABEL _("MFSK Image") #define THOR_IMAGE_MLABEL _("THOR Raw Image") #define IFKP_IMAGE_MLABEL _("IFKP Raw Image") #define WEFAX_TX_IMAGE_MLABEL _("Weather Fax Image TX") #define CONTEST_MLABEL _("Contest") #define COUNTRIES_MLABEL _("C&ountries") #define UI_MLABEL _("&UI") #define RIGLOG_FULL_MLABEL _("Full") #define RIGLOG_PARTIAL_MLABEL _("Partial") #define RIGLOG_NONE_MLABEL _("None") #define DOCKEDSCOPE_MLABEL _("Docked scope") #define WF_MLABEL _("Minimal controls") #define SHOW_CHANNELS _("Show channels") #define LOG_CONNECT_SERVER _("Connect to server") // MAXIMUM allowable std::string lengths in log fields #define MAX_FREQ 14 #define MAX_TIME 4 #define MAX_RST 3 #define MAX_CALL 30 #define MAX_NAME 30 #define MAX_AZ 3 #define MAX_QTH 50 #define MAX_STATE 2 #define MAX_LOC 8 #define MAX_SERNO 10 #define MAX_XCHG_IN 50 #define MAX_COUNTRY 50 #define MAX_COUNTY 100 #define MAX_NOTES 400 #define MAX_SECTION 20 #define MAX_CLASS 10 void set599(); //regular expression parser using by mainViewer (pskbrowser) fre_t seek_re("CQ", REG_EXTENDED | REG_ICASE | REG_NOSUB); bool bWF_only = false; Fl_Double_Window *fl_digi_main = (Fl_Double_Window *)0; Fl_Double_Window *scopeview = (Fl_Double_Window *)0; Fl_Double_Window *field_day_viewer = (Fl_Double_Window *)0; Fl_Double_Window *dxcluster_viewer = (Fl_Double_Window *)0; Fl_Double_Window *rxaudio_dialog = (Fl_Double_Window *)0; Fl_Help_Dialog *help_dialog = (Fl_Help_Dialog *)0; Fl_Button *btnDockMacro[48]; Fl_Group *mnuFrame; Fl_Menu_Bar *mnu; Fl_Box *tx_timer = (Fl_Box *)0; Fl_Light_Button *btnAutoSpot = (Fl_Light_Button *)0; Fl_Light_Button *btnTune = (Fl_Light_Button *)0; Fl_Light_Button *btnRSID = (Fl_Light_Button *)0; Fl_Light_Button *btnTxRSID = (Fl_Light_Button *)0; Fl_Button *btnMacroTimer = (Fl_Button *)0; Fl_Group *center_group = (Fl_Group *)0; Fl_Group *text_group; Fl_Group *wefax_group = 0; Fl_Group *mvgroup = 0; Panel *text_panel = 0; //------------------------------------------------------------------------------ // groups and widgets used exclusively for FSQCALL Fl_Group *fsq_group = 0; Fl_Group *fsq_upper = 0; Fl_Group *fsq_lower = 0; Fl_Group *fsq_upper_left = 0; Fl_Group *fsq_upper_right = 0; Fl_Group *fsq_lower_left = 0; Fl_Group *fsq_lower_right = 0; Panel *fsq_left = (Panel *)0; Fl_Box *fsq_minbox = (Fl_Box *)0; FTextRX *fsq_rx_text = (FTextRX *)0; FTextTX *fsq_tx_text = (FTextTX *)0; Fl_Browser *fsq_heard = (Fl_Browser *)0; Fl_Light_Button *btn_FSQCALL = (Fl_Light_Button *)0; Fl_Light_Button *btn_SELCAL = (Fl_Light_Button *)0; Fl_Light_Button *btn_MONITOR = (Fl_Light_Button *)0; Fl_Button *btn_FSQQTH = (Fl_Button *)0; Fl_Button *btn_FSQQTC = (Fl_Button *)0; Fl_Button *btn_FSQCQ = (Fl_Button *)0; Progress *ind_fsq_speed = (Progress *)0; Progress *ind_fsq_s2n = (Progress *)0; //------------------------------------------------------------------------------ // groups and widgets used exclusively for IFKP Fl_Group *ifkp_group = (Fl_Group *)0; Fl_Box *ifkp_minbox = (Fl_Box *)0; Fl_Group *ifkp_left = (Fl_Group *)0; FTextRX *ifkp_rx_text = (FTextRX *)0; FTextTX *ifkp_tx_text = (FTextTX *)0; Fl_Group *ifkp_right = (Fl_Group *)0; Fl_Browser *ifkp_heard = (Fl_Browser *)0; Progress *ifkp_s2n_progress = (Progress *)0; picture *ifkp_avatar = (picture *)0; //---------------------------------------------------------------------- // FMT group Fl_Group *fmt_group = (Fl_Group *)0; //------------------------------------------------------------------------------ // thor avatar picture *thor_avatar = (picture *)0; //------------------------------------------------------------------------------ Fl_Group *macroFrame1 = (Fl_Group *)0; Fl_Group *macroFrame2 = (Fl_Group *)0; Fl_Group *mf_group1 = (Fl_Group *)0; Fl_Group *mf_group2 = (Fl_Group *)0; Fl_Group *tbar = (Fl_Group *)0; FTextRX *ReceiveText = 0; FTextTX *TransmitText = 0; Raster *FHdisp; Fl_Box *minbox; int oix; pskBrowser *mainViewer = (pskBrowser *)0; Fl_Input2 *txtInpSeek = (Fl_Input2 *)0; status_box *StatusBar = (status_box *)0; Fl_Box *Status2 = (Fl_Box *)0; Fl_Box *Status1 = (Fl_Box *)0; Fl_Counter2 *cntTxLevel = (Fl_Counter2 *)0; Fl_Counter2 *cntCW_WPM=(Fl_Counter2 *)0; Fl_Button *btnCW_Default=(Fl_Button *)0; Fl_Box *WARNstatus = (Fl_Box *)0; Fl_Button *MODEstatus = (Fl_Button *)0; Fl_Button *btnMacro[NUMMACKEYS * NUMKEYROWS]; Fl_Button *btnAltMacros1 = (Fl_Button *)0; Fl_Button *btnAltMacros2 = (Fl_Button *)0; Fl_Light_Button *btnAFC = (Fl_Light_Button *)0; Fl_Light_Button *btnSQL = (Fl_Light_Button *)0; Fl_Light_Button *btnPSQL = (Fl_Light_Button *)0; Fl_Box *corner_box = (Fl_Box *)0; vumeter *VuMeter = (vumeter *)0; Fl_Box *VuBox = (Fl_Box *)0; Fl_Group *RigControlFrame = (Fl_Group *)0; Fl_Group *RigViewerFrame = (Fl_Group *)0; cFreqControl *qsoFreqDisp = (cFreqControl *)0; Fl_Group *qso_combos = (Fl_Group *)0; Fl_ListBox *qso_opMODE = (Fl_ListBox *)0; Fl_Group *qso_opGROUP = (Fl_Group *)0; Fl_ListBox *qso_opBW = (Fl_ListBox *)0; Fl_Button *qso_btnBW1 = (Fl_Button *)0; Fl_ListBox *qso_opBW1 = (Fl_ListBox *)0; Fl_Button *qso_btnBW2 = (Fl_Button *)0; Fl_ListBox *qso_opBW2 = (Fl_ListBox *)0; Fl_Button *qso_opPICK = (Fl_Button *)0; Fl_Button *qsoClear; Fl_Button *qsoSave; Fl_Input2 *inpFreq = (Fl_Input2 *)0; Fl_Input2 *inpTimeOff = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn = (Fl_Input2 *)0; Fl_Button *btnTimeOn; Fl_Input2 *inpCall = (Fl_Input2 *)0; Fl_Input2 *inpName = (Fl_Input2 *)0; Fl_Input2 *inpRstIn = (Fl_Input2 *)0; Fl_Input2 *inpRstOut = (Fl_Input2 *)0; Fl_Input2 *inpQTH = (Fl_Input2 *)0; Fl_Input2 *inpQth = (Fl_Input2 *)0; Fl_Input2 *inpLoc = (Fl_Input2 *)0; Fl_Input2 *inpState = (Fl_Input2 *)0; Fl_Input2 *inpCounty = (Fl_Input2 *)0; Fl_ComboBox *cboCountyQSO = (Fl_ComboBox *)0; Fl_ComboBox *cboCountry = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryQSO = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryAICW2 = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryAIDX = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryWAE2 = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryAIDX2 = (Fl_ComboBox *)0; Fl_ComboBox *cboCountryRTU2 = (Fl_ComboBox *)0; Fl_Input2 *inpSerNo = (Fl_Input2 *)0; Fl_Input2 *outSerNo = (Fl_Input2 *)0; Fl_Input2 *inpXchgIn = (Fl_Input2 *)0; // Field Day fields Fl_Input2 *inpClass = (Fl_Input2 *)0; Fl_Input2 *inpSection = (Fl_Input2 *)0; // CQWW fields Fl_Input2 *inp_CQzone = (Fl_Input2 *)0; Fl_Input2 *inp_CQstate = (Fl_Input2 *)0; // Kids Day fields Fl_Input2 *inp_KD_age = (Fl_Input2 *)0; Fl_Input2 *inpVEprov = (Fl_Input2 *)0; Fl_Input2 *inpNotes = (Fl_Input2 *)0; Fl_Input2 *inpAZ = (Fl_Input2 *)0; Fl_Button *qsoTime; Fl_Button *btnQRZ; //Fl_Button *CFtoggle = (Fl_Button *)0; // Top Frame 1 group controls Fl_Group *Logging_frame = (Fl_Group *)0; Fl_Group *Logging_frame_1 = (Fl_Group *)0; Fl_Group *NFtabs_group = (Fl_Group *)0; Fl_Tabs *NFtabs = (Fl_Tabs *)0; Fl_Group *gGEN_QSO_1 = (Fl_Group *)0; Fl_Group *NotesFrame = (Fl_Group *)0; Fl_Group *Ccframe = (Fl_Group *)0; Fl_Group *TopFrame1 = (Fl_Group *)0; Fl_Input2 *inpFreq1 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOff1 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn1 = (Fl_Input2 *)0; Fl_Button *btnTimeOn1; Fl_Input2 *inpCall1 = (Fl_Input2 *)0; Fl_Input2 *inpName1 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn1 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut1 = (Fl_Input2 *)0; Fl_Input2 *inpState1 = (Fl_Input2 *)0; Fl_Input2 *inpLoc1 = (Fl_Input2 *)0; // Generic contest sub frame Fl_Group *gGEN_CONTEST = (Fl_Group *)0; Fl_Input2 *inpXchgIn1 = (Fl_Input2 *)0; Fl_Input2 *outSerNo1 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo1 = (Fl_Input2 *)0; // FD contest sub frame Fl_Group *gFD = (Fl_Group *)0; Fl_Input2 *inp_FD_class1 = (Fl_Input2 *)0; Fl_Input2 *inp_FD_section1 = (Fl_Input2 *)0; // Kids Day fields Fl_Group *gKD_1 = (Fl_Group *)0; Fl_Input2 *inp_KD_age1 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_state1 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_VEprov1 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_XchgIn1 = (Fl_Input2 *)0; // CQWW RTTY contest sub frame Fl_Group *gCQWW_RTTY = (Fl_Group *)0; Fl_Input2 *inp_CQzone1 = (Fl_Input2 *)0; Fl_Input2 *inp_CQstate1 = (Fl_Input2 *)0; // CQWW DX contest sub frame Fl_Group *gCQWW_DX = (Fl_Group *)0; Fl_Input2 *inp_CQDXzone1 = (Fl_Input2 *)0; // CW Sweepstakes contest sub frame Fl_Group *gCWSS = (Fl_Group *)0; Fl_Input2 *outSerNo3 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_SerialNoR = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Precedence = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Check = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Section = (Fl_Input2 *)0; Fl_Input2 *inp_SS_SerialNoR1 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Precedence1 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Check1 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Section1 = (Fl_Input2 *)0; // 1010 contest Fl_Group *g1010 = (Fl_Group *)0; Fl_Input2 *inp_1010_nr = (Fl_Input2 *)0; Fl_Input2 *inp_1010_nr1 = (Fl_Input2 *)0; Fl_Input2 *inp_1010_XchgIn1 = (Fl_Input2 *)0; // VHF contest Fl_Group *gVHF = (Fl_Group *)0; Fl_Input2 *inp_vhf_RSTin1 = (Fl_Input2 *)0; Fl_Input2 *inp_vhf_RSTout1 = (Fl_Input2 *)0; Fl_Input2 *inp_vhf_Loc1 = (Fl_Input2 *)0; // ARRL Round Up Contest Fl_Group *gARR = (Fl_Group *)0; Fl_Input2 *inp_ARR_Name2 = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_check = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_check1 = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_check2 = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_XchgIn1 = (Fl_Input2 *)0; Fl_Input2 *inp_ARR_XchgIn2 = (Fl_Input2 *)0; // ARRL School Roundup - LOG_ASCR Fl_Group *gASCR = (Fl_Group *)0; Fl_Input2 *inp_ASCR_class1 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_XchgIn1 = (Fl_Input2 *)0; // LOG_NAQP - North American QSO Party Fl_Group *gNAQP = (Fl_Group *)0; Fl_Input2 *inpSPCnum = (Fl_Input2 *)0; // same name used in N3FJP loggers Fl_Input2 *inpSPCnum_NAQP1 = (Fl_Input2 *)0; // LOG_ARRL_RTTY - ARRL RTTY Roundup Fl_Group *gARRL_RTTY= (Fl_Group *)0; Fl_Input2 *inpRTU_stpr1 = (Fl_Input2 *)0; Fl_Input2 *inpRTU_serno1 = (Fl_Input2 *)0; // LOG_IARI - Italian International DX Fl_Group *gIARI = (Fl_Group *)0; Fl_Input2 *inp_IARI_PR1 = (Fl_Input2 *)0; Fl_Input2 *out_IARI_SerNo1 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_SerNo1 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *out_IARI_SerNo2 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_SerNo2 = (Fl_Input2 *)0; Fl_Input2 *inp_IARI_PR2= (Fl_Input2 *)0; Fl_ComboBox *cboCountryIARI2 = (Fl_ComboBox *)0; // LOG_NAS - North American Sprint Fl_Group *gNAS = (Fl_Group *)0; Fl_Input2 *outSerNo5 = (Fl_Input2 *)0; Fl_Input2 *inp_ser_NAS1 = (Fl_Input2 *)0; Fl_Input2 *inpSPCnum_NAS1 = (Fl_Input2 *)0; // LOG_AIDX - African All Mode Fl_Group *gAIDX = (Fl_Group *)0; Fl_Input2 *outSerNo7 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo3 = (Fl_Input2 *)0; // LOG_JOTA - Jamboree On The Air Fl_Group *gJOTA = (Fl_Group *)0; Fl_Input2 *inp_JOTA_troop = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_scout = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_scout1 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_troop1 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_spc = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_spc1 = (Fl_Input2 *)0; // LOG_AICW - ARRL International DX (cw) Fl_Group *gAICW = (Fl_Group *)0; Fl_Input2 *inpSPCnum_AICW1 = (Fl_Input2 *)0; // LOG_SQSO Fl_Group *gSQSO = (Fl_Group *)0; Fl_Input2 *inpSQSO_state1 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_state2 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_county1 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_county2 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_serno1 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_serno2 = (Fl_Input2 *)0; Fl_Input2 *outSQSO_serno1 = (Fl_Input2 *)0; Fl_Input2 *outSQSO_serno2 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn_SQSO2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut_SQSO2 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_name2 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_category = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_category1 = (Fl_Input2 *)0; Fl_Input2 *inpSQSO_category2 = (Fl_Input2 *)0; // LOG_CQ_WPX Fl_Group *gCQWPX = (Fl_Group *)0; Fl_Input2 *inpSerNo_WPX1 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo_WPX2 = (Fl_Input2 *)0; Fl_Input2 *outSerNo_WPX1 = (Fl_Input2 *)0; Fl_Input2 *outSerNo_WPX2 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn_WPX2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut_WPX2 = (Fl_Input2 *)0; // LOG_WAE Fl_Group *gWAE = (Fl_Group *)0; Fl_Input2 *inpSerNo_WAE1 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo_WAE2 = (Fl_Input2 *)0; Fl_Input2 *outSerNo_WAE1 = (Fl_Input2 *)0; Fl_Input2 *outSerNo_WAE2 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn_WAE2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut_WAE2 = (Fl_Input2 *)0; //---------------------------------------------------------------------- // Single Line Rig / Logging Controls cFreqControl *qsoFreqDisp1 = (cFreqControl *)0; // Top Frame 2 group controls - no contest Fl_Group *TopFrame2 = (Fl_Group *)0; cFreqControl *qsoFreqDisp2 = (cFreqControl *)0; Fl_Input2 *inpTimeOff2 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn2 = (Fl_Input2 *)0; Fl_Button *btnTimeOn2; Fl_Input2 *inpCall2 = (Fl_Input2 *)0; Fl_Input2 *inpName2 = (Fl_Input2 *)0; Fl_Input2 *inpRstIn2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut2 = (Fl_Input2 *)0; Fl_Button *qso_opPICK2; Fl_Button *qsoClear2; Fl_Button *qsoSave2; Fl_Button *btnQRZ2; // Top Frame 3 group controls - contest Fl_Group *TopFrame3 = (Fl_Group *)0; Fl_Group *TopFrame3a = (Fl_Group *)0; Fl_Group *log_generic_frame = (Fl_Group *)0; Fl_Group *log_fd_frame = (Fl_Group *)0; Fl_Group *log_kd_frame = (Fl_Group *)0; Fl_Group *log_1010_frame = (Fl_Group *)0; Fl_Group *log_arr_frame = (Fl_Group *)0; Fl_Group *log_vhf_frame = (Fl_Group *)0; Fl_Group *log_cqww_frame = (Fl_Group *)0; Fl_Group *log_cqww_rtty_frame = (Fl_Group *)0; Fl_Group *log_cqss_frame = (Fl_Group *)0; Fl_Group *log_cqwpx_frame = (Fl_Group *)0; Fl_Group *log_ascr_frame = (Fl_Group *)0; Fl_Group *log_naqp_frame = (Fl_Group *)0; Fl_Group *log_rtty_frame = (Fl_Group *)0; Fl_Group *log_iari_frame = (Fl_Group *)0; Fl_Group *log_nas_frame = (Fl_Group *)0; Fl_Group *log_aidx_frame = (Fl_Group *)0; Fl_Group *log_jota_frame = (Fl_Group *)0; Fl_Group *log_aicw_frame = (Fl_Group *)0; Fl_Group *log_sqso_frame = (Fl_Group *)0; Fl_Group *log_wae_frame = (Fl_Group *)0; cFreqControl *qsoFreqDisp3 = (cFreqControl *)0; Fl_Button *qso_opPICK3; Fl_Button *qsoClear3; Fl_Button *qsoSave3; Fl_Group *TopFrame3b = (Fl_Group *)0; Fl_Input2 *inpCall3 = (Fl_Input2 *)0; // Generic contest fields Fl_Input2 *inpTimeOff3 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn3 = (Fl_Input2 *)0; Fl_Button *btnTimeOn3; Fl_Input2 *outSerNo2 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo2 = (Fl_Input2 *)0; Fl_Input2 *inpXchgIn2 = (Fl_Input2 *)0; // Field Day fields Fl_Input2 *inpTimeOff4 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn4 = (Fl_Input2 *)0; Fl_Button *btnTimeOn4; Fl_Input2 *inp_FD_class2 = (Fl_Input2 *)0; Fl_Input2 *inp_FD_section2 = (Fl_Input2 *)0; // Kids Day fields Fl_Input2 *inp_KD_name2 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_age2 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_state2 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_VEprov2 = (Fl_Input2 *)0; Fl_Input2 *inp_KD_XchgIn2 = (Fl_Input2 *)0; // CQWW RTTY fields Fl_Input2 *inp_CQ_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQ_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQzone2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQstate2 = (Fl_Input2 *)0; Fl_ComboBox *cboCountryCQ2 = (Fl_ComboBox *)0; // CQWW DX fields Fl_Input2 *inp_CQDX_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQDX_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *inp_CQDXzone2 = (Fl_Input2 *)0; Fl_ComboBox *cboCountryCQDX2 = (Fl_ComboBox *)0; // CW Sweepstakes contest sub frame Fl_Input2 *outSerNo4 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_SerialNoR2 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Precedence2 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Check2 = (Fl_Input2 *)0; Fl_Input2 *inp_SS_Section2 = (Fl_Input2 *)0; // 1010 contest Fl_Input2 *inp_1010_name2 = (Fl_Input2 *)0; Fl_Input2 *inp_1010_nr2 = (Fl_Input2 *)0; Fl_Input2 *inp_1010_XchgIn2 = (Fl_Input2 *)0; // VHF contest Fl_Input2 *inp_vhf_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_vhf_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *inp_vhf_Loc2 = (Fl_Input2 *)0; // ARRL School Roundup - LOG_ASCR Fl_Input2 *inp_ASCR_name2 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_class2 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_XchgIn2 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inp_ASCR_RSTout2 = (Fl_Input2 *)0; // LOG_NAQP Fl_Input2 *inpTimeOff5 = (Fl_Input2 *)0; Fl_Input2 *inpTimeOn5 = (Fl_Input2 *)0; Fl_Button *btnTimeOn5; Fl_Input2 *inpNAQPname2; Fl_Input2 *inpSPCnum_NAQP2 = (Fl_Input2 *)0; // LOG_ARRL_RTTY - ARRL RTTY Roundup Fl_Input2 *inpRTU_stpr2 = (Fl_Input2 *)0; Fl_Input2 *inpRTU_RSTin2 = (Fl_Input2 *)0; Fl_Input2 *inpRTU_RSTout2 = (Fl_Input2 *)0; Fl_Input2 *inpRTU_serno2 = (Fl_Input2 *)0; // LOG_NAS - NA Sprint Fl_Input2 *outSerNo6 = (Fl_Input2 *)0; Fl_Input2 *inp_ser_NAS2 = (Fl_Input2 *)0; Fl_Input2 *inpSPCnum_NAS2 = (Fl_Input2 *)0; Fl_Input2 *inp_name_NAS2 = (Fl_Input2 *)0; // LOG_AIDX - African All Mode Fl_Input2 *inpRstIn3 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut3 = (Fl_Input2 *)0; Fl_Input2 *outSerNo8 = (Fl_Input2 *)0; Fl_Input2 *inpSerNo4 = (Fl_Input2 *)0; // LOG_JOTA - Jamboree On The Air Fl_Input2 *inpRstIn4 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut4 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_scout2 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_troop2 = (Fl_Input2 *)0; Fl_Input2 *inp_JOTA_spc2 = (Fl_Input2 *)0; // LOG_AICW - ARRL International DX (cw) Fl_Input2 *inpRstIn_AICW2 = (Fl_Input2 *)0; Fl_Input2 *inpRstOut_AICW2 = (Fl_Input2 *)0; Fl_Input2 *inpSPCnum_AICW2 = (Fl_Input2 *)0; // Used when no logging frame visible Fl_Input2 *inpCall4 = (Fl_Input2 *)0; Fl_Browser *qso_opBrowser = (Fl_Browser *)0; Fl_Button *qso_btnAddFreq = (Fl_Button *)0; Fl_Button *qso_btnSelFreq = (Fl_Button *)0; Fl_Button *qso_btnDelFreq = (Fl_Button *)0; Fl_Button *qso_btnClearList = (Fl_Button *)0; Fl_Button *qso_btnAct = 0; Fl_Input2 *qso_inpAct = (Fl_Input2 *)0; Fl_Group *opUsageFrame = (Fl_Group *)0; Fl_Output *opOutUsage = (Fl_Output *)0; Fl_Input2 *opUsage = (Fl_Input2 *)0; Fl_Button *opUsageEnter = (Fl_Button *)0; Fl_Group *wf_group = (Fl_Group *)0; Fl_Group *status_group = (Fl_Group *)0; Fl_Value_Slider2 *mvsquelch = (Fl_Value_Slider2 *)0; Fl_Button *btnClearMViewer = 0; static const int pad = 1; static const int Hentry = 24; static const int Wbtn = Hentry; static int x_qsoframe = Wbtn; int Hmenu = 24; static const int Hqsoframe = 2*pad + 3 * (Hentry + pad); int Hstatus = 20; int Hmacros = 20; #define TB_HEIGHT 20 #define MACROBAR_MIN 18 #define MACROBAR_MAX 30 static int wf1 = 355; static const int w_inpTime2 = 40; static const int w_inpCall2 = 100; static const int w_inpRstIn2 = 30; static const int w_inpRstOut2 = 30; // maximum 1 row height for raster display, FeldHell static int minhtext = 42*2+6; static int main_hmin;// = HMIN; time_t program_start_time = 0; bool xmlrpc_address_override_flag = false; bool xmlrpc_port_override_flag = false; bool arq_address_override_flag = false; bool arq_port_override_flag = false; bool kiss_address_override_flag = false; std::string override_xmlrpc_address = ""; std::string override_xmlrpc_port = ""; std::string override_arq_address = ""; std::string override_arq_port = ""; std::string override_kiss_address = ""; std::string override_kiss_io_port = ""; std::string override_kiss_out_port = ""; int override_kiss_dual_port_enabled = -1; // Ensure this remains negative until assigned int override_data_io_enabled = DISABLED_IO; int IMAGE_WIDTH; int Hwfall; int Wwfall; int altMacros = 0; waterfall *wf = (waterfall *)0; Digiscope *digiscope = (Digiscope *)0; Fl_Slider2 *sldrSquelch = (Fl_Slider2 *)0; Progress *pgrsSquelch = (Progress *)0; Smeter *smeter = (Smeter *)0; PWRmeter *pwrmeter = (PWRmeter *)0; Fl_Group *pwrlevel_grp = (Fl_Group *)0; Fl_Value_Slider2 *pwr_level = (Fl_Value_Slider2 *)0; Fl_Button *set_pwr_level = (Fl_Button *)0; static Fl_Pixmap *addrbookpixmap = 0; #if !defined(__APPLE__) && !defined(__WOE32__) && USE_X Pixmap fldigi_icon_pixmap; #endif // for character set conversion int rxtx_charset; static CharsetDistiller rx_chd; static CharsetDistiller echo_chd; static OutputEncoder tx_encoder; Fl_Menu_Item *getMenuItem(const char *caption, Fl_Menu_Item* submenu = 0); void UI_select(); bool clean_exit(bool ask); void cb_init_mode(Fl_Widget *, void *arg); void cb_oliviaCustom(Fl_Widget *w, void *arg); void cb_contestiaCustom(Fl_Widget *w, void *arg); void cb_rtty45(Fl_Widget *w, void *arg); void cb_rtty50(Fl_Widget *w, void *arg); void cb_rtty75N(Fl_Widget *w, void *arg); void cb_rtty75W(Fl_Widget *w, void *arg); void cb_rtty100(Fl_Widget *w, void *arg); void cb_rttyCustom(Fl_Widget *w, void *arg); void cb_fsq2(Fl_Widget *w, void *arg); void cb_fsq3(Fl_Widget *w, void *arg); void cb_fsq4p5(Fl_Widget *w, void *arg); void cb_fsq6(Fl_Widget *w, void *arg); void cb_fsq1p5(Fl_Widget *w, void *arg); void cb_ifkp0p5(Fl_Widget *w, void *arg); void cb_ifkp1p0(Fl_Widget *w, void *arg); void cb_ifkp2p0(Fl_Widget *w, void *arg); void cb_ifkp0p5a(Fl_Widget *w, void *arg); void cb_ifkp1p0a(Fl_Widget *w, void *arg); void cb_ifkp2p0a(Fl_Widget *w, void *arg); void set_colors(); //void cb_pkt1200(Fl_Widget *w, void *arg); //void cb_pkt300(Fl_Widget *w, void *arg); //void cb_pkt2400(Fl_Widget *w, void *arg); Fl_Widget *modem_config_tab; static Fl_Menu_Item *quick_change; static Fl_Menu_Item quick_change_psk[] = { { mode_info[MODE_PSK31].name, 0, cb_init_mode, (void *)MODE_PSK31 }, { mode_info[MODE_PSK63].name, 0, cb_init_mode, (void *)MODE_PSK63 }, { mode_info[MODE_PSK63F].name, 0, cb_init_mode, (void *)MODE_PSK63F }, { mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125 }, { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250 }, { mode_info[MODE_PSK500].name, 0, cb_init_mode, (void *)MODE_PSK500 }, { mode_info[MODE_PSK1000].name, 0, cb_init_mode, (void *)MODE_PSK1000 }, { 0 } }; static Fl_Menu_Item quick_change_qpsk[] = { { mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31 }, { mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63 }, { mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125 }, { mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250 }, { mode_info[MODE_QPSK500].name, 0, cb_init_mode, (void *)MODE_QPSK500 }, { 0 } }; static Fl_Menu_Item quick_change_8psk[] = { { mode_info[MODE_8PSK125].name, 0, cb_init_mode, (void *)MODE_8PSK125 }, { mode_info[MODE_8PSK250].name, 0, cb_init_mode, (void *)MODE_8PSK250 }, { mode_info[MODE_8PSK500].name, 0, cb_init_mode, (void *)MODE_8PSK500 }, { mode_info[MODE_8PSK1000].name, 0, cb_init_mode, (void *)MODE_8PSK1000 }, { mode_info[MODE_8PSK125FL].name, 0, cb_init_mode, (void *)MODE_8PSK125FL }, { mode_info[MODE_8PSK125F].name, 0, cb_init_mode, (void *)MODE_8PSK125F }, { mode_info[MODE_8PSK250F].name, 0, cb_init_mode, (void *)MODE_8PSK250F }, { mode_info[MODE_8PSK250FL].name, 0, cb_init_mode, (void *)MODE_8PSK250FL }, { mode_info[MODE_8PSK500F].name, 0, cb_init_mode, (void *)MODE_8PSK500F }, { mode_info[MODE_8PSK1000F].name, 0, cb_init_mode, (void *)MODE_8PSK1000F }, { mode_info[MODE_8PSK1200F].name, 0, cb_init_mode, (void *)MODE_8PSK1200F }, { 0 } }; static Fl_Menu_Item quick_change_ofdm[] = { { mode_info[MODE_OFDM_500F].name, 0, cb_init_mode, (void *)MODE_OFDM_500F }, { mode_info[MODE_OFDM_750F].name, 0, cb_init_mode, (void *)MODE_OFDM_750F }, // { mode_info[MODE_OFDM_2000F].name, 0, cb_init_mode, (void *)MODE_OFDM_2000F }, // { mode_info[MODE_OFDM_2000].name, 0, cb_init_mode, (void *)MODE_OFDM_2000 }, { mode_info[MODE_OFDM_3500].name, 0, cb_init_mode, (void *)MODE_OFDM_3500 }, { 0 } }; static Fl_Menu_Item quick_change_pskr[] = { { mode_info[MODE_PSK125R].name, 0, cb_init_mode, (void *)MODE_PSK125R }, { mode_info[MODE_PSK250R].name, 0, cb_init_mode, (void *)MODE_PSK250R }, { mode_info[MODE_PSK500R].name, 0, cb_init_mode, (void *)MODE_PSK500R }, { mode_info[MODE_PSK1000R].name, 0, cb_init_mode, (void *)MODE_PSK1000R }, { 0 } }; static Fl_Menu_Item quick_change_psk_multiR[] = { { mode_info[MODE_4X_PSK63R].name, 0, cb_init_mode, (void *)MODE_4X_PSK63R }, { mode_info[MODE_5X_PSK63R].name, 0, cb_init_mode, (void *)MODE_5X_PSK63R }, { mode_info[MODE_10X_PSK63R].name, 0, cb_init_mode, (void *)MODE_10X_PSK63R }, { mode_info[MODE_20X_PSK63R].name, 0, cb_init_mode, (void *)MODE_20X_PSK63R }, { mode_info[MODE_32X_PSK63R].name, 0, cb_init_mode, (void *)MODE_32X_PSK63R }, { mode_info[MODE_4X_PSK125R].name, 0, cb_init_mode, (void *)MODE_4X_PSK125R }, { mode_info[MODE_5X_PSK125R].name, 0, cb_init_mode, (void *)MODE_5X_PSK125R }, { mode_info[MODE_10X_PSK125R].name, 0, cb_init_mode, (void *)MODE_10X_PSK125R }, { mode_info[MODE_12X_PSK125R].name, 0, cb_init_mode, (void *)MODE_12X_PSK125R }, { mode_info[MODE_16X_PSK125R].name, 0, cb_init_mode, (void *)MODE_16X_PSK125R }, { mode_info[MODE_2X_PSK250R].name, 0, cb_init_mode, (void *)MODE_2X_PSK250R }, { mode_info[MODE_3X_PSK250R].name, 0, cb_init_mode, (void *)MODE_3X_PSK250R }, { mode_info[MODE_5X_PSK250R].name, 0, cb_init_mode, (void *)MODE_5X_PSK250R }, { mode_info[MODE_6X_PSK250R].name, 0, cb_init_mode, (void *)MODE_6X_PSK250R }, { mode_info[MODE_7X_PSK250R].name, 0, cb_init_mode, (void *)MODE_7X_PSK250R }, { mode_info[MODE_2X_PSK500R].name, 0, cb_init_mode, (void *)MODE_2X_PSK500R }, { mode_info[MODE_3X_PSK500R].name, 0, cb_init_mode, (void *)MODE_3X_PSK500R }, { mode_info[MODE_4X_PSK500R].name, 0, cb_init_mode, (void *)MODE_4X_PSK500R }, { mode_info[MODE_2X_PSK800R].name, 0, cb_init_mode, (void *)MODE_2X_PSK800R }, { mode_info[MODE_2X_PSK1000R].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000R }, { 0 } }; static Fl_Menu_Item quick_change_psk_multi[] = { { mode_info[MODE_12X_PSK125].name, 0, cb_init_mode, (void *)MODE_12X_PSK125 }, { mode_info[MODE_6X_PSK250].name, 0, cb_init_mode, (void *)MODE_6X_PSK250 }, { mode_info[MODE_2X_PSK500].name, 0, cb_init_mode, (void *)MODE_2X_PSK500 }, { mode_info[MODE_4X_PSK500].name, 0, cb_init_mode, (void *)MODE_4X_PSK500 }, { mode_info[MODE_2X_PSK800].name, 0, cb_init_mode, (void *)MODE_2X_PSK800 }, { mode_info[MODE_2X_PSK1000].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000 }, { 0 } }; static Fl_Menu_Item quick_change_mfsk[] = { { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4 }, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8 }, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16 }, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11 }, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22 }, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31 }, { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32 }, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64 }, { mode_info[MODE_MFSK128].name, 0, cb_init_mode, (void *)MODE_MFSK128 }, { mode_info[MODE_MFSK64L].name, 0, cb_init_mode, (void *)MODE_MFSK64L }, { mode_info[MODE_MFSK128L].name, 0, cb_init_mode, (void *)MODE_MFSK128L }, { 0 } }; static Fl_Menu_Item quick_change_wefax[] = { { mode_info[MODE_WEFAX_576].name, 0, cb_init_mode, (void *)MODE_WEFAX_576 }, { mode_info[MODE_WEFAX_288].name, 0, cb_init_mode, (void *)MODE_WEFAX_288 }, { 0 } }; static Fl_Menu_Item quick_change_navtex[] = { { mode_info[MODE_NAVTEX].name, 0, cb_init_mode, (void *)MODE_NAVTEX }, { mode_info[MODE_SITORB].name, 0, cb_init_mode, (void *)MODE_SITORB }, { 0 } }; static Fl_Menu_Item quick_change_mt63[] = { { mode_info[MODE_MT63_500S].name, 0, cb_init_mode, (void *)MODE_MT63_500S }, { mode_info[MODE_MT63_500L].name, 0, cb_init_mode, (void *)MODE_MT63_500L }, { mode_info[MODE_MT63_1000S].name, 0, cb_init_mode, (void *)MODE_MT63_1000S }, { mode_info[MODE_MT63_1000L].name, 0, cb_init_mode, (void *)MODE_MT63_1000L }, { mode_info[MODE_MT63_2000S].name, 0, cb_init_mode, (void *)MODE_MT63_2000S }, { mode_info[MODE_MT63_2000L].name, 0, cb_init_mode, (void *)MODE_MT63_2000L }, { 0 } }; static Fl_Menu_Item quick_change_thor[] = { { mode_info[MODE_THORMICRO].name, 0, cb_init_mode, (void *)MODE_THORMICRO }, { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4 }, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5 }, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8 }, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11 }, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16 }, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22 }, { mode_info[MODE_THOR32].name, 0, cb_init_mode, (void *)MODE_THOR32 }, { mode_info[MODE_THOR44].name, 0, cb_init_mode, (void *)MODE_THOR44 }, { mode_info[MODE_THOR56].name, 0, cb_init_mode, (void *)MODE_THOR56 }, { mode_info[MODE_THOR25x4].name, 0, cb_init_mode, (void *)MODE_THOR25x4 }, { mode_info[MODE_THOR50x1].name, 0, cb_init_mode, (void *)MODE_THOR50x1 }, { mode_info[MODE_THOR50x2].name, 0, cb_init_mode, (void *)MODE_THOR50x2 }, { mode_info[MODE_THOR100].name, 0, cb_init_mode, (void *)MODE_THOR100 }, { 0 } }; static Fl_Menu_Item quick_change_domino[] = { { mode_info[MODE_DOMINOEXMICRO].name, 0, cb_init_mode, (void *)MODE_DOMINOEXMICRO }, { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4 }, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5 }, { mode_info[MODE_DOMINOEX8].name, 0, cb_init_mode, (void *)MODE_DOMINOEX8 }, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11 }, { mode_info[MODE_DOMINOEX16].name, 0, cb_init_mode, (void *)MODE_DOMINOEX16 }, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22 }, { mode_info[MODE_DOMINOEX44].name, 0, cb_init_mode, (void *)MODE_DOMINOEX44 }, { mode_info[MODE_DOMINOEX88].name, 0, cb_init_mode, (void *)MODE_DOMINOEX88 }, { 0 } }; static Fl_Menu_Item quick_change_feld[] = { { mode_info[MODE_FELDHELL].name, 0, cb_init_mode, (void *)MODE_FELDHELL }, { mode_info[MODE_SLOWHELL].name, 0, cb_init_mode, (void *)MODE_SLOWHELL }, { mode_info[MODE_HELLX5].name, 0, cb_init_mode, (void *)MODE_HELLX5 }, { mode_info[MODE_HELLX9].name, 0, cb_init_mode, (void *)MODE_HELLX9 }, { mode_info[MODE_FSKH245].name, 0, cb_init_mode, (void *)MODE_FSKH245 }, { mode_info[MODE_FSKH105].name, 0, cb_init_mode, (void *)MODE_FSKH105 }, { mode_info[MODE_HELL80].name, 0, cb_init_mode, (void *)MODE_HELL80 }, { 0 } }; static Fl_Menu_Item quick_change_throb[] = { { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1 }, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2 }, { mode_info[MODE_THROB4].name, 0, cb_init_mode, (void *)MODE_THROB4 }, { mode_info[MODE_THROBX1].name, 0, cb_init_mode, (void *)MODE_THROBX1 }, { mode_info[MODE_THROBX2].name, 0, cb_init_mode, (void *)MODE_THROBX2 }, { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4 }, { 0 } }; static Fl_Menu_Item quick_change_olivia[] = { { mode_info[MODE_OLIVIA_4_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_125 }, { mode_info[MODE_OLIVIA_4_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_250 }, { mode_info[MODE_OLIVIA_4_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_500 }, { mode_info[MODE_OLIVIA_4_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_1000 }, { mode_info[MODE_OLIVIA_4_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_2000 }, { mode_info[MODE_OLIVIA_8_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_125 }, { mode_info[MODE_OLIVIA_8_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_250 }, { mode_info[MODE_OLIVIA_8_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_500 }, { mode_info[MODE_OLIVIA_8_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_1000 }, { mode_info[MODE_OLIVIA_8_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_2000 }, { mode_info[MODE_OLIVIA_16_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_500 }, { mode_info[MODE_OLIVIA_16_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_1000 }, { mode_info[MODE_OLIVIA_16_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_2000 }, { mode_info[MODE_OLIVIA_32_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_1000 }, { mode_info[MODE_OLIVIA_32_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_2000 }, { mode_info[MODE_OLIVIA_64_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_500 }, { mode_info[MODE_OLIVIA_64_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_1000 }, { mode_info[MODE_OLIVIA_64_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_2000 }, { _("Custom..."), 0, cb_oliviaCustom, (void *)MODE_OLIVIA }, { 0 } }; static Fl_Menu_Item quick_change_contestia[] = { { mode_info[MODE_CONTESTIA_4_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_125 }, { mode_info[MODE_CONTESTIA_4_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_250 }, { mode_info[MODE_CONTESTIA_4_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_500 }, { mode_info[MODE_CONTESTIA_4_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_1000 }, { mode_info[MODE_CONTESTIA_4_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_2000 }, { mode_info[MODE_CONTESTIA_8_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_125 }, { mode_info[MODE_CONTESTIA_8_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_250 }, { mode_info[MODE_CONTESTIA_8_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_500 }, { mode_info[MODE_CONTESTIA_8_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_1000 }, { mode_info[MODE_CONTESTIA_8_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_2000 }, { mode_info[MODE_CONTESTIA_16_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_250 }, { mode_info[MODE_CONTESTIA_16_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_500 }, { mode_info[MODE_CONTESTIA_16_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_1000 }, { mode_info[MODE_CONTESTIA_16_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_2000 }, { mode_info[MODE_CONTESTIA_32_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_1000 }, { mode_info[MODE_CONTESTIA_32_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_2000 }, { mode_info[MODE_CONTESTIA_64_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_500 }, { mode_info[MODE_CONTESTIA_64_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_1000 }, { mode_info[MODE_CONTESTIA_64_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_2000 }, { _("Custom..."), 0, cb_contestiaCustom, (void *)MODE_CONTESTIA }, { 0 } }; static Fl_Menu_Item quick_change_rtty[] = { { "RTTY-45", 0, cb_rtty45, (void *)MODE_RTTY }, { "RTTY-50", 0, cb_rtty50, (void *)MODE_RTTY }, { "RTTY-75N", 0, cb_rtty75N, (void *)MODE_RTTY }, { "RTTY-75W", 0, cb_rtty75W, (void *)MODE_RTTY }, { "RTTY-100", 0, cb_rtty100, (void *)MODE_RTTY }, { _("Custom..."), 0, cb_rttyCustom, (void *)MODE_RTTY }, { 0 } }; static Fl_Menu_Item quick_change_fsq[] = { { "FSQ1.5", 0, cb_fsq1p5, (void *)MODE_FSQ }, { "FSQ2", 0, cb_fsq2, (void *)MODE_FSQ }, { "FSQ3", 0, cb_fsq3, (void *)MODE_FSQ }, { "FSQ4.5", 0, cb_fsq4p5, (void *)MODE_FSQ }, { "FSQ6", 0, cb_fsq6, (void *)MODE_FSQ }, { 0 } }; static Fl_Menu_Item quick_change_ifkp[] = { { "IFKP 0.5", 0, cb_ifkp0p5a, (void *)MODE_IFKP }, { "IFKP 1.0", 0, cb_ifkp1p0a, (void *)MODE_IFKP }, { "IFKP 2.0", 0, cb_ifkp2p0a, (void *)MODE_IFKP }, { 0} }; //Fl_Menu_Item quick_change_pkt[] = { // { " 300 baud", 0, cb_pkt300, (void *)MODE_PACKET }, // { "1200 baud", 0, cb_pkt1200, (void *)MODE_PACKET }, // { "2400 baud", 0, cb_pkt2400, (void *)MODE_PACKET }, // { 0 } //}; inline int minmax(int val, int min, int max) { val = val < max ? val : max; return val > min ? val : min; } // Olivia void set_olivia_default_integ() { if (!progdefaults.olivia_reset_fec) return; int tones = progdefaults.oliviatones; int bw = progdefaults.oliviabw; if (tones < 1) tones = 1; int depth = minmax( (8 * (1 << bw)) / (1 << tones), 4, 4 * (1 << bw)); progdefaults.oliviasinteg = depth; cntOlivia_sinteg->value(depth); } void set_olivia_tab_widgets() { i_listbox_olivia_bandwidth->index(progdefaults.oliviabw); i_listbox_olivia_tones->index(progdefaults.oliviatones); set_olivia_default_integ(); } void close_tree_items() { std::string tabs[] = { _("Colors-Fonts"), _("Contests"), _("IDs"), _("Logging"), _("Modem/CW"), _("Modem/TTY"), _("Modem"), _("Misc"), _("Rig Control"), _("Soundcard"), _("UI"), _("Waterfall"), _("Web") }; for (size_t n = 0; n < sizeof(tabs) / sizeof(*tabs); n++) tab_tree->close(tabs[n].c_str(),0); } void select_tab_tree(const char *tab) { close_tree_items(); std::string pname = tab; size_t p = pname.find("/"); while (p != std::string::npos) { tab_tree->open(pname.substr(0,p).c_str()); p = pname.find("/", p+1); } tab_tree->open(pname.c_str(),0); tab_tree->select(tab,1); SelectItem_CB(tab_tree); } void open_config(const char *tab) { select_tab_tree(tab); dlgConfig->show(); } void cb_oliviaCustom(Fl_Widget *w, void *arg) { open_config(TAB_OLIVIA); cb_init_mode(w, arg); } // Contestia void set_contestia_default_integ() { if (!progdefaults.contestia_reset_fec) return; int tones = progdefaults.contestiatones; int bw = progdefaults.contestiabw; if (tones < 1) tones = 1; int depth = minmax( (8 * (1 << bw)) / (1 << tones), 4, 4 * (1 << bw)); progdefaults.contestiasinteg = depth; cntContestia_sinteg->value(depth); } void set_contestia_tab_widgets() { i_listbox_contestia_bandwidth->index(progdefaults.contestiabw); i_listbox_contestia_tones->index(progdefaults.contestiatones); set_contestia_default_integ(); } void cb_contestiaCustom(Fl_Widget *w, void *arg) { open_config(TAB_CONTESTIA); cb_init_mode(w, arg); } // rtty void set_rtty_tab_widgets() { selShift->index(progdefaults.rtty_shift); selCustomShift->deactivate(); selBits->index(progdefaults.rtty_bits); selBaud->index(progdefaults.rtty_baud); selParity->index(progdefaults.rtty_parity); selStopBits->index(progdefaults.rtty_stop); } void enable_rtty_quickchange() { if (active_modem->get_mode() == MODE_RTTY) quick_change = quick_change_rtty; } void disable_rtty_quickchange() { if (active_modem->get_mode() == MODE_RTTY) quick_change = 0; } void cb_rtty45(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 1; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty50(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 2; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty75N(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 4; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty75W(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 4; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 9; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rtty100(Fl_Widget *w, void *arg) { progdefaults.rtty_baud = 5; progdefaults.rtty_bits = 0; progdefaults.rtty_shift = 3; set_rtty_tab_widgets(); cb_init_mode(w, arg); } void cb_rttyCustom(Fl_Widget *w, void *arg) { open_config(TAB_RTTY); cb_init_mode(w, arg); } void set_fsq_tab_widgets() { btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); if (progdefaults.fsqbaud == 1.5) btn_fsqbaud[0]->value(1); else if (progdefaults.fsqbaud == 2.0) btn_fsqbaud[1]->value(1); else if (progdefaults.fsqbaud == 3.0) btn_fsqbaud[2]->value(1); else if (progdefaults.fsqbaud == 4.5) btn_fsqbaud[3]->value(1); else btn_fsqbaud[4]->value(1); } void cb_fsq1p5(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 1.5; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void cb_fsq2(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 2.0; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void cb_fsq3(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 3.0; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void cb_fsq4p5(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 4.5; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void cb_fsq6(Fl_Widget *w, void *arg) { progdefaults.fsqbaud = 6.0; set_fsq_tab_widgets(); cb_init_mode(w, arg); } void set_ifkp_tab_widgets() { btn_ifkpbaud[0]->value(0); btn_ifkpbaud[1]->value(0); btn_ifkpbaud[2]->value(0); if (progdefaults.ifkp_baud == 0) { btn_ifkpbaud[0]->value(1); put_MODEstatus("IFKP 0.5"); } else if (progdefaults.ifkp_baud == 1) { btn_ifkpbaud[1]->value(1); put_MODEstatus("IFKP 1.0"); } else { btn_ifkpbaud[2]->value(1); put_MODEstatus("IFKP 2.0"); } } void cb_ifkp0p5 (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 0; set_ifkp_tab_widgets(); cb_init_mode(w, arg); } void cb_ifkp0p5a (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 0; set_ifkp_tab_widgets(); } void cb_ifkp1p0 (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 1; set_ifkp_tab_widgets(); cb_init_mode(w, arg); } void cb_ifkp1p0a (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 1; set_ifkp_tab_widgets(); } void cb_ifkp2p0 (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 2; set_ifkp_tab_widgets(); cb_init_mode(w, arg); } void cb_ifkp2p0a (Fl_Widget *w, void *arg) { progdefaults.ifkp_baud = 2; set_ifkp_tab_widgets(); } void set_dominoex_tab_widgets() { chkDominoEX_FEC->value(progdefaults.DOMINOEX_FEC); } //void cb_pkt1200(Fl_Widget *w, void *arg) //{ // progdefaults.PKT_BAUD_SELECT = 0; // selPacket_Baud->value(progdefaults.PKT_BAUD_SELECT); // cb_init_mode(w, arg); //} //void cb_pkt300(Fl_Widget *w, void *arg) //{ // progdefaults.PKT_BAUD_SELECT = 1; // selPacket_Baud->value(progdefaults.PKT_BAUD_SELECT); // cb_init_mode(w, arg); //} //void cb_pkt2400(Fl_Widget *w, void *arg) //{ // progdefaults.PKT_BAUD_SELECT = 2; // selPacket_Baud->value(progdefaults.PKT_BAUD_SELECT); // cb_init_mode(w, arg); //} void set_mode_controls(trx_mode id) { if (id == MODE_CW) { cntCW_WPM->show(); btnCW_Default->show(); Status1->hide(); if (mvsquelch) { mvsquelch->value(progStatus.VIEWER_cwsquelch); mvsquelch->range(0, 40.0); mvsquelch->redraw(); } if (sldrViewerSquelch) { sldrViewerSquelch->value(progStatus.VIEWER_cwsquelch); sldrViewerSquelch->range(0, 40.0); sldrViewerSquelch->redraw(); } } else { cntCW_WPM->hide(); btnCW_Default->hide(); Status1->show(); } if (id == MODE_RTTY) { if (mvsquelch) { mvsquelch->value(progStatus.VIEWER_rttysquelch); mvsquelch->range(-6.0, 34.0); } if (sldrViewerSquelch) { sldrViewerSquelch->value(progStatus.VIEWER_rttysquelch); sldrViewerSquelch->range(-12.0, 6.0); } } if (id >= MODE_PSK_FIRST && id <= MODE_PSK_LAST) { if (mvsquelch) { mvsquelch->value(progStatus.VIEWER_psksquelch); mvsquelch->range(-3.0, 6.0); } if (sldrViewerSquelch) { sldrViewerSquelch->value(progStatus.VIEWER_psksquelch); sldrViewerSquelch->range(-3.0, 6.0); } } if (!bWF_only) { if (id >= MODE_WEFAX_FIRST && id <= MODE_WEFAX_LAST) { text_group->hide(); fsq_group->hide(); ifkp_group->hide(); fmt_group->hide(); wefax_group->show(); center_group->redraw(); } else if (id == MODE_FSQ) { text_group->hide(); wefax_group->hide(); ifkp_group->hide(); fmt_group->hide(); fsq_group->show(); center_group->redraw(); } else if (id == MODE_IFKP) { text_group->hide(); wefax_group->hide(); fsq_group->hide(); fmt_group->hide(); ifkp_group->show(); center_group->redraw(); } else if (id == MODE_FMT) { text_group->hide(); wefax_group->hide(); fsq_group->hide(); ifkp_group->hide(); fmt_group->show(); center_group->redraw(); } else { text_group->show(); wefax_group->hide(); fsq_group->hide(); ifkp_group->hide(); fmt_group->hide(); if (id >= MODE_HELL_FIRST && id <= MODE_HELL_LAST) { ReceiveText->hide(); FHdisp->show(); } else { FHdisp->hide(); ReceiveText->show(); } center_group->redraw(); } ifkp_avatar->hide(); thor_avatar->hide(); std::string call = inpCall->value(); if (id == MODE_IFKP) { ifkp_avatar->resize(fl_digi_main->w() - 59 - pad, NFtabs_group->y(), 59, 74); thor_avatar->resize(fl_digi_main->w() - pad - 1, NFtabs_group->y(), 1, 74); NFtabs_group->resize( NFtabs_group->x(), NFtabs_group->y(), fl_digi_main->w() - NFtabs_group->x() - ifkp_avatar->w() - 2 * pad, NFtabs_group->h()); ifkp_avatar->show(); thor_avatar->hide(); if (!call.empty()) ifkp_load_avatar(inpCall->value()); else ifkp_load_avatar(); } else if ( ((id >= MODE_THOR11) && (id <= MODE_THOR56))) { thor_avatar->resize(fl_digi_main->w() - 59 - pad, NFtabs_group->y(), 59, 74); ifkp_avatar->resize(fl_digi_main->w() - pad - 1, NFtabs_group->y(), 1, 74); NFtabs_group->resize( NFtabs_group->x(), NFtabs_group->y(), fl_digi_main->w() - NFtabs_group->x() - thor_avatar->w() - 2 * pad, NFtabs_group->h()); thor_avatar->show(); ifkp_avatar->hide(); if (!call.empty()) thor_load_avatar(inpCall->value()); else thor_load_avatar(); } else { ifkp_avatar->resize(fl_digi_main->w() - pad - 1, NFtabs_group->y(), 1, 74); thor_avatar->resize(fl_digi_main->w() - pad - 1, NFtabs_group->y(), 1, 74); NFtabs_group->resize( NFtabs_group->x(), NFtabs_group->y(), fl_digi_main->w() - NFtabs_group->x() - pad - 1, NFtabs_group->h()); ifkp_avatar->hide(); thor_avatar->hide(); } ifkp_avatar->redraw(); thor_avatar->redraw(); NFtabs_group->init_sizes(); NFtabs_group->redraw(); } } void startup_modem(modem* m, int f) { trx_start_modem(m, f); #if BENCHMARK_MODE return; #endif restoreFocus(1); trx_mode mode = m->get_mode(); set_mode_controls(mode); if (mode >= MODE_PSK_FIRST && mode <= MODE_PSK_LAST) { m->set_sigsearch(SIGSEARCH); } /* if (progdefaults.sqlch_by_mode) { progStatus.sldrSquelchValue = get_mode_squelch(mode); progStatus.sqlonoff = get_mode_squelch_onoff(mode); sldrSquelch->value(progStatus.sldrSquelchValue); btnSQL->value(progStatus.sqlonoff); } if (progdefaults.txlevel_by_mode) progStatus.txlevel = get_mode_txlevel(mode); cntTxLevel->value(progStatus.txlevel); if (progdefaults.afc_by_mode) progStatus.afconoff = get_mode_afc(mode); if (m->get_cap() & modem::CAP_AFC) { btnAFC->value(progStatus.afconoff); btnAFC->activate(); } else { btnAFC->value(0); btnAFC->deactivate(); } if (progdefaults.reverse_by_mode) progStatus.reverse = get_mode_reverse(mode); else progStatus.reverse = wf->Reverse(); */ if (m->get_cap() & modem::CAP_REV) { wf->btnRev->value(progStatus.reverse); wf->btnRev->activate(); } else { wf->btnRev->value(0); wf->btnRev->deactivate(); } } void cb_mnuOpenMacro(Fl_Menu_*, void*) { if (macros.changed) { switch (fl_choice2(_("Save changed macros?"), _("Cancel"), _("Save"), _("Don't save"))) { case 0: return; case 1: macros.saveMacroFile(); // fall through case 2: break; } } macros.openMacroFile(); macros.changed = false; restoreFocus(2); } void cb_mnuSaveMacro(Fl_Menu_*, void*) { macros.saveMacroFile(); restoreFocus(3); } void remove_windows() { std::string titles[] = { "scope view", "record loader", "cluster viewer", "dxcc window", "viewer", "logbook", "lotw review", "export", "cabrillo", "config", "notify", "mfsk rxwin", "mfsk txwin", "thor rxwin", "thor txwin", "fsq monitor", "fsq rxwin", "fsq txwin", "ifkp rxwin", "ifkp txwin", "macro editor", "test signals", "rx audio", "wefax tx dialog" }; Fl_Double_Window *w[] = { scopeview, dlgRecordLoader, dxcluster_viewer, dxcc_window, dlgViewer, dlgLogbook, lotw_review_dialog, wExport, wCabrillo, dlgConfig, notify_window, picRxWin, picTxWin, thorpicRxWin, thorpicTxWin, fsqMonitor, fsqpicRxWin, fsqpicTxWin, ifkppicRxWin, ifkppicTxWin, MacroEditDialog, test_signal_window, rxaudio_dialog, wefax_pic_tx_win }; std::string sdeleting = "\nDeleting dialogs / Stopping debug session"; for (size_t n = 0; n < sizeof(w) / sizeof(*w); n++) { if (w[n]) { sdeleting.append("\n ").append(titles[n]); w[n]->hide(); delete w[n]; w[n] = 0; } } if (font_browser) { sdeleting.append("\n font browser"); font_browser->hide(); delete font_browser; font_browser = 0; } LOG_INFO("%s", sdeleting.c_str()); MilliSleep(50); debug::stop(); } // callback executed from Escape / Window decoration 'X' or OS X cmd-Q void cb_wMain(Fl_Widget*, void*) { if (!clean_exit(true)) return; remove_windows(); LOG_INFO("Hiding main window"); fl_digi_main->hide(); } // callback executed from menu item File/Exit void cb_E(Fl_Menu_*, void*) { if (!clean_exit(true)) return; remove_windows(); LOG_INFO("Hiding main window"); // this will make Fl::run return fl_digi_main->hide(); } static int squelch_val; void rsid_squelch_timer(void*) { progStatus.sqlonoff = squelch_val; modeband.set_mode_squelch_onoff(squelch_val); if (progStatus.sqlonoff) { btnSQL->value(1); } } void init_modem_squelch(trx_mode mode, int freq) { squelch_val = progStatus.sqlonoff; progStatus.sqlonoff = 0; btnSQL->value(0); if (!progdefaults.rsid_eot_squelch) Fl::add_timeout(progdefaults.rsid_squelch, rsid_squelch_timer); init_modem(mode, freq); } void rsid_eot_squelch() { progStatus.sqlonoff = squelch_val; modeband.set_mode_squelch_onoff(squelch_val); if (progStatus.sqlonoff) btnSQL->value(1); Fl::remove_timeout(rsid_squelch_timer); } extern bool valid_kiss_modem(std::string modem_name); void init_modem(trx_mode mode, int freq) { ENSURE_THREAD(FLMAIN_TID); if (bWF_only) if (mode == MODE_FSQ || mode == MODE_IFKP || mode == MODE_FELDHELL || mode == MODE_SLOWHELL || mode == MODE_HELLX5 || mode == MODE_HELLX9 || mode == MODE_FSKH245 || mode == MODE_FSKH105 || mode == MODE_HELL80 || mode == MODE_WEFAX_576 || mode == MODE_WEFAX_288 || mode == MODE_NAVTEX || mode == MODE_SITORB ) mode = MODE_PSK31; stopMacroTimer(); if (data_io_enabled == KISS_IO) { trx_mode current_mode = active_modem->get_mode(); if(!bcast_rsid_kiss_frame(freq, mode, (int) active_modem->get_txfreq(), current_mode, progdefaults.rsid_notify_only ? RSID_KISS_NOTIFY : RSID_KISS_ACTIVE)) { LOG_INFO("Invaild Modem for KISS I/O (%s)", mode_info[mode].sname); int _yes = false; if(!progdefaults.kiss_io_modem_change_inhibit) _yes = fl_choice2(_("Switch to ARQ I/O"), _("No"), _("Yes"), NULL); if(_yes) { enable_arq(); } else { std::string modem_name; modem_name.assign(mode_info[current_mode].sname); bool valid = valid_kiss_modem(modem_name); if(!valid) current_mode = MODE_PSK250; mode = current_mode; } } } //LOG_INFO("mode: %d, freq: %d", (int)mode, freq); #if !BENCHMARK_MODE quick_change = 0; // modem_config_tab = tabsModems->child(0); #endif switch (mode) { case MODE_NEXT: if ((mode = active_modem->get_mode() + 1) == NUM_MODES) mode = 0; return init_modem(mode, freq); case MODE_PREV: if ((mode = active_modem->get_mode() - 1) < 0) mode = NUM_MODES - 1; return init_modem(mode, freq); case MODE_NULL: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new NULLMODEM, freq); break; case MODE_CW: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new cw, freq); // modem_config_tab = tabCW; break; case MODE_THORMICRO: case MODE_THOR4: case MODE_THOR5: case MODE_THOR8: case MODE_THOR11:case MODE_THOR16: case MODE_THOR22: case MODE_THOR32: case MODE_THOR44: case MODE_THOR56: case MODE_THOR25x4: case MODE_THOR50x1: case MODE_THOR50x2: case MODE_THOR100: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new thor(mode), freq); quick_change = quick_change_thor; // modem_config_tab = tabTHOR; break; case MODE_DOMINOEXMICRO: case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: case MODE_DOMINOEX44: case MODE_DOMINOEX88: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new dominoex(mode), freq); quick_change = quick_change_domino; // modem_config_tab = tabDomEX; break; case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5: case MODE_HELLX9: case MODE_FSKH245: case MODE_FSKH105: case MODE_HELL80: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new feld(mode), freq); quick_change = quick_change_feld; // modem_config_tab = tabFeld; break; case MODE_MFSK4: case MODE_MFSK11: case MODE_MFSK22: case MODE_MFSK31: case MODE_MFSK64: case MODE_MFSK8: case MODE_MFSK16: case MODE_MFSK32: case MODE_MFSK128: case MODE_MFSK64L: case MODE_MFSK128L: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new mfsk(mode), freq); quick_change = quick_change_mfsk; break; case MODE_WEFAX_576: case MODE_WEFAX_288: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new wefax(mode), freq); quick_change = quick_change_wefax; // modem_config_tab = tabWefax; break; case MODE_NAVTEX: case MODE_SITORB: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new navtex(mode), freq); quick_change = quick_change_navtex; // modem_config_tab = tabNavtex; break; case MODE_MT63_500S: case MODE_MT63_1000S: case MODE_MT63_2000S : case MODE_MT63_500L: case MODE_MT63_1000L: case MODE_MT63_2000L : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new mt63(mode), freq); quick_change = quick_change_mt63; // modem_config_tab = tabMT63; break; case MODE_PSK31: case MODE_PSK63: case MODE_PSK63F: case MODE_PSK125: case MODE_PSK250: case MODE_PSK500: case MODE_PSK1000: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk; // modem_config_tab = tabPSK; break; case MODE_QPSK31: case MODE_QPSK63: case MODE_QPSK125: case MODE_QPSK250: case MODE_QPSK500: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_qpsk; // modem_config_tab = tabPSK; break; case MODE_8PSK125: case MODE_8PSK250: case MODE_8PSK500: case MODE_8PSK1000: case MODE_8PSK125FL: case MODE_8PSK125F: case MODE_8PSK250FL: case MODE_8PSK250F: case MODE_8PSK500F: case MODE_8PSK1000F: case MODE_8PSK1200F: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_8psk; // modem_config_tab = tabPSK; break; case MODE_OFDM_500F: case MODE_OFDM_750F: // case MODE_OFDM_2000F: // case MODE_OFDM_2000: case MODE_OFDM_3500: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_ofdm; // modem_config_tab = tabPSK; break; case MODE_PSK125R: case MODE_PSK250R: case MODE_PSK500R: case MODE_PSK1000R: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_pskr; // modem_config_tab = tabPSK; break; case MODE_12X_PSK125 : case MODE_6X_PSK250 : case MODE_2X_PSK500 : case MODE_4X_PSK500 : case MODE_2X_PSK800 : case MODE_2X_PSK1000 : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk_multi; // modem_config_tab = tabPSK; break; case MODE_4X_PSK63R : case MODE_5X_PSK63R : case MODE_10X_PSK63R : case MODE_20X_PSK63R : case MODE_32X_PSK63R : case MODE_4X_PSK125R : case MODE_5X_PSK125R : case MODE_10X_PSK125R : case MODE_12X_PSK125R : case MODE_16X_PSK125R : case MODE_2X_PSK250R : case MODE_3X_PSK250R : case MODE_5X_PSK250R : case MODE_6X_PSK250R : case MODE_7X_PSK250R : case MODE_2X_PSK500R : case MODE_3X_PSK500R : case MODE_4X_PSK500R : case MODE_2X_PSK800R : case MODE_2X_PSK1000R : startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk_multiR; // modem_config_tab = tabPSK; break; case MODE_OLIVIA: case MODE_OLIVIA_4_125: case MODE_OLIVIA_4_250: case MODE_OLIVIA_4_500: case MODE_OLIVIA_4_1000: case MODE_OLIVIA_4_2000: case MODE_OLIVIA_8_125: case MODE_OLIVIA_8_250: case MODE_OLIVIA_8_500: case MODE_OLIVIA_8_1000: case MODE_OLIVIA_8_2000: case MODE_OLIVIA_16_500: case MODE_OLIVIA_16_1000: case MODE_OLIVIA_16_2000: case MODE_OLIVIA_32_1000: case MODE_OLIVIA_32_2000: case MODE_OLIVIA_64_500: case MODE_OLIVIA_64_1000: case MODE_OLIVIA_64_2000: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new olivia(mode), freq); // modem_config_tab = tabOlivia; quick_change = quick_change_olivia; break; case MODE_CONTESTIA: case MODE_CONTESTIA_4_125: case MODE_CONTESTIA_4_250: case MODE_CONTESTIA_4_500: case MODE_CONTESTIA_4_1000: case MODE_CONTESTIA_4_2000: case MODE_CONTESTIA_8_125: case MODE_CONTESTIA_8_250: case MODE_CONTESTIA_8_500: case MODE_CONTESTIA_8_1000: case MODE_CONTESTIA_8_2000: case MODE_CONTESTIA_16_250: case MODE_CONTESTIA_16_500: case MODE_CONTESTIA_16_1000: case MODE_CONTESTIA_16_2000: case MODE_CONTESTIA_32_1000: case MODE_CONTESTIA_32_2000: case MODE_CONTESTIA_64_500: case MODE_CONTESTIA_64_1000: case MODE_CONTESTIA_64_2000: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new contestia(mode), freq); // modem_config_tab = tabContestia; quick_change = quick_change_contestia; break; case MODE_FSQ: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new fsq(mode), freq); // modem_config_tab = tabFSQ; quick_change = quick_change_fsq; break; case MODE_IFKP: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new ifkp(mode), freq); // modem_config_tab = tabIFKP; quick_change = quick_change_ifkp; break; case MODE_RTTY: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new rtty(mode), freq); // modem_config_tab = tabRTTY; if (progStatus.nanoFSK_online || progStatus.Nav_online || progdefaults.useFSK) quick_change = 0; else quick_change = quick_change_rtty; break; case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: case MODE_THROBX1: case MODE_THROBX2: case MODE_THROBX4: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new throb(mode), freq); quick_change = quick_change_throb; break; // case MODE_PACKET: // startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : // *mode_info[mode].modem = new pkt(mode), freq); // modem_config_tab = tabNavtex; // quick_change = quick_change_pkt; // break; case MODE_WWV: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new wwv, freq); break; case MODE_ANALYSIS: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new anal, freq); break; case MODE_FMT: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new fmt, freq); break; case MODE_SSB: startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new ssb, freq); break; default: LOG_ERROR("Unknown mode: %d", (int)mode); mode = MODE_PSK31; startup_modem(*mode_info[mode].modem ? *mode_info[mode].modem : *mode_info[mode].modem = new psk(mode), freq); quick_change = quick_change_psk; // modem_config_tab = tabPSK; break; } #if BENCHMARK_MODE return; #endif clear_StatusMessages(); progStatus.lastmode = mode; if (wf->xmtlock->value() == 1 && !mailserver) { if(!progdefaults.retain_freq_lock) { wf->xmtlock->value(0); wf->xmtlock->damage(); active_modem->set_freqlock(false); } } // if (FD_logged_on) FD_mode_check(); } void init_modem_sync(trx_mode m, int f) { ENSURE_THREAD(FLMAIN_TID); int count = 2000; if (trx_state != STATE_RX) { LOG_INFO("Waiting for %s", mode_info[active_modem->get_mode()].name); abort_tx(); while (trx_state != STATE_RX && count) { LOG_DEBUG("%0.2f secs remaining", count / 100.0); Fl::awake(); MilliSleep(10); count--; } if (count == 0) { LOG_ERROR("%s", "TIMED OUT!!"); return; // abort modem selection } } init_modem(m, f); count = 500; if (trx_state != STATE_RX) { while (trx_state != STATE_RX && count) { Fl::awake(); MilliSleep(10); count--; } if (count == 0) LOG_ERROR("%s", "Wait for STATE_RX timed out"); } REQ_FLUSH(TRX_TID); } void cb_init_mode(Fl_Widget *, void *mode) { init_modem(reinterpret_cast(mode)); } // character set selection menu void set_charset_listbox(int rxtx_charset) { int tiniconv_id = charset_list[rxtx_charset].tiniconv_id; // order all converters to switch to the new encoding rx_chd.set_input_encoding(tiniconv_id); echo_chd.set_input_encoding(tiniconv_id); tx_encoder.set_output_encoding(tiniconv_id); if (mainViewer) mainViewer->set_input_encoding(tiniconv_id); if (brwsViewer) brwsViewer->set_input_encoding(tiniconv_id); // update the button progdefaults.charset_name = charset_list[rxtx_charset].name; listbox_charset_status->value(progdefaults.charset_name.c_str()); restoreFocus(4); } void cb_listbox_charset(Fl_Widget *w, void *) { Fl_ListBox * lbox = (Fl_ListBox *)w; set_charset_listbox(lbox->index()); } void populate_charset_listbox(void) { for (unsigned int i = 0; i < number_of_charsets; i++) listbox_charset_status->add( charset_list[i].name ); listbox_charset_status->value(progdefaults.charset_name.c_str()); } // find the position of the default charset in charset_list[] and trigger the callback void set_default_charset(void) { for (unsigned int i = 0; i < number_of_charsets; i++) { if (strcmp(charset_list[i].name, progdefaults.charset_name.c_str()) == 0) { set_charset_listbox(i); return; } } } // if w is not NULL, give focus to TransmitText only if the last event was an Enter keypress void restoreFocus(int n) { if (Fl::focus() == NULL) return; if (!active_modem) { TransmitText->take_focus(); return; } if (active_modem->get_mode() == MODE_FSQ && fsq_tx_text) fsq_tx_text->take_focus(); else if (active_modem->get_mode() == MODE_IFKP && ifkp_tx_text) ifkp_tx_text->take_focus(); else if (TransmitText) TransmitText->take_focus(); } void macro_cb(Fl_Widget *w, void *v) { // if (active_modem->get_mode() == MODE_FSQ) // return; int b = (int)(reinterpret_cast (v)); if (b & 0x80) { // 4 bar docked macros b &= 0x7F; } else { if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (b >= NUMMACKEYS) b += (altMacros - 1) * NUMMACKEYS; } else { b += altMacros * NUMMACKEYS; } } int mouse = Fl::event_button(); if (mouse == FL_LEFT_MOUSE && !macros.text[b].empty()) { if (progStatus.timer) return; stopMacroTimer(); progStatus.skip_sked_macro = false; macros.execute(b); } else if (mouse == FL_RIGHT_MOUSE) editMacro(b); if (Fl::focus() != qsoFreqDisp) restoreFocus(5); } void colorize_48macros(int i) { if (progdefaults.useGroupColors == true) { int k = i / 4; if (k == 0 || k == 3 || k == 6 || k == 9) btnDockMacro[i]->color(fl_rgb_color( progdefaults.btnGroup1.R, progdefaults.btnGroup1.G, progdefaults.btnGroup1.B)); else if (k == 1 || k == 4 || k == 7 || k == 10) btnDockMacro[i]->color(fl_rgb_color( progdefaults.btnGroup2.R, progdefaults.btnGroup2.G, progdefaults.btnGroup2.B)); else btnDockMacro[i]->color(fl_rgb_color( progdefaults.btnGroup3.R, progdefaults.btnGroup3.G, progdefaults.btnGroup3.B)); btnDockMacro[i]->labelcolor( fl_rgb_color( progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.G, progdefaults.btnFkeyTextColor.B )); btnDockMacro[i]->labelcolor(progdefaults.MacroBtnFontcolor); btnDockMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); btnDockMacro[i]->labelsize(progdefaults.MacroBtnFontsize); } else { btnDockMacro[i]->color(FL_BACKGROUND_COLOR); btnDockMacro[i]->labelcolor(FL_FOREGROUND_COLOR); btnDockMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); btnDockMacro[i]->labelsize(progdefaults.MacroBtnFontsize); } } void colorize_macro(int i) { int j = i % NUMMACKEYS; if (progdefaults.useGroupColors == true) { if (j < 4) { btnMacro[i]->color(fl_rgb_color( progdefaults.btnGroup1.R, progdefaults.btnGroup1.G, progdefaults.btnGroup1.B)); } else if (j < 8) { btnMacro[i]->color(fl_rgb_color( progdefaults.btnGroup2.R, progdefaults.btnGroup2.G, progdefaults.btnGroup2.B)); } else { btnMacro[i]->color(fl_rgb_color( progdefaults.btnGroup3.R, progdefaults.btnGroup3.G, progdefaults.btnGroup3.B)); } btnMacro[i]->labelcolor( fl_rgb_color( progdefaults.btnFkeyTextColor.R, progdefaults.btnFkeyTextColor.G, progdefaults.btnFkeyTextColor.B )); btnMacro[i]->labelcolor(progdefaults.MacroBtnFontcolor); btnMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); btnMacro[i]->labelsize(progdefaults.MacroBtnFontsize); } else { btnMacro[i]->color(FL_BACKGROUND_COLOR); btnMacro[i]->labelcolor(FL_FOREGROUND_COLOR); btnMacro[i]->labelfont(progdefaults.MacroBtnFontnbr); btnMacro[i]->labelsize(progdefaults.MacroBtnFontsize); } btnMacro[i]->redraw_label(); } void colorize_macros() { for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) colorize_macro(i); for (int i = 0; i < 48; i++) colorize_48macros(i); btnAltMacros1->labelsize(progdefaults.MacroBtnFontsize); btnAltMacros1->redraw_label(); btnAltMacros2->labelsize(progdefaults.MacroBtnFontsize); btnAltMacros2->redraw_label(); } void altmacro_cb(Fl_Widget *w, void *v) { static char alt_text[2] = "1"; intptr_t arg = reinterpret_cast(v); if (arg) altMacros += arg; else altMacros = altMacros + (Fl::event_button() == FL_RIGHT_MOUSE ? -1 : 1); if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { // alternate set altMacros = WCLAMP(altMacros, 1, 3); alt_text[0] = '1' + altMacros; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i + NUMMACKEYS]->label(macros.name[i + (altMacros * NUMMACKEYS)].c_str()); btnMacro[i + NUMMACKEYS]->redraw_label(); } btnAltMacros2->label(alt_text); btnAltMacros2->redraw_label(); } else { // primary set altMacros = WCLAMP(altMacros, 0, 3); alt_text[0] = '1' + altMacros; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label(macros.name[i + (altMacros * NUMMACKEYS)].c_str()); btnMacro[i]->redraw_label(); } btnAltMacros1->label(alt_text); btnAltMacros1->redraw_label(); } restoreFocus(6); } void cb_mnuConfigNotify(Fl_Menu_*, void*) { notify_show(); } void cb_mnuTestSignals(Fl_Menu_*, void*) { show_testdialog(); } void cb_mnuConfigModems(Fl_Menu_*, void*) { switch (active_modem->get_mode()) { case MODE_CW: open_config(TAB_CW); break; case MODE_THORMICRO: case MODE_THOR4: case MODE_THOR5: case MODE_THOR8: case MODE_THOR11: case MODE_THOR16: case MODE_THOR22: case MODE_THOR32: case MODE_THOR44: case MODE_THOR56: case MODE_THOR25x4: case MODE_THOR50x1: case MODE_THOR50x2: case MODE_THOR100: open_config(TAB_THOR); break; case MODE_DOMINOEXMICRO: case MODE_DOMINOEX4: case MODE_DOMINOEX5: case MODE_DOMINOEX8: case MODE_DOMINOEX11: case MODE_DOMINOEX16: case MODE_DOMINOEX22: case MODE_DOMINOEX44: case MODE_DOMINOEX88: open_config(TAB_DOMINOEX); break; case MODE_FELDHELL: case MODE_SLOWHELL: case MODE_HELLX5: case MODE_HELLX9: case MODE_FSKH245: case MODE_FSKH105:case MODE_HELL80: open_config(TAB_FELDHELL); break; case MODE_WEFAX_576: case MODE_WEFAX_288: open_config(TAB_WEFAX); break; case MODE_NAVTEX: case MODE_SITORB: open_config(TAB_NAVTEX); break; case MODE_MT63_500S: case MODE_MT63_1000S: case MODE_MT63_2000S : case MODE_MT63_500L: case MODE_MT63_1000L: case MODE_MT63_2000L : quick_change = quick_change_mt63; open_config(TAB_MT63); break; case MODE_OLIVIA: case MODE_OLIVIA_4_125: case MODE_OLIVIA_4_250: case MODE_OLIVIA_4_500: case MODE_OLIVIA_4_1000: case MODE_OLIVIA_4_2000: case MODE_OLIVIA_8_125: case MODE_OLIVIA_8_250: case MODE_OLIVIA_8_500: case MODE_OLIVIA_8_1000: case MODE_OLIVIA_8_2000: case MODE_OLIVIA_16_500: case MODE_OLIVIA_16_1000: case MODE_OLIVIA_16_2000: case MODE_OLIVIA_32_1000: case MODE_OLIVIA_32_2000: case MODE_OLIVIA_64_500: case MODE_OLIVIA_64_1000: case MODE_OLIVIA_64_2000: open_config(TAB_OLIVIA); break; case MODE_CONTESTIA: case MODE_CONTESTIA_4_125: case MODE_CONTESTIA_4_250: case MODE_CONTESTIA_4_500: case MODE_CONTESTIA_4_1000: case MODE_CONTESTIA_4_2000: case MODE_CONTESTIA_8_125: case MODE_CONTESTIA_8_250: case MODE_CONTESTIA_8_500: case MODE_CONTESTIA_8_1000: case MODE_CONTESTIA_8_2000: case MODE_CONTESTIA_16_250: case MODE_CONTESTIA_16_500: case MODE_CONTESTIA_16_1000: case MODE_CONTESTIA_16_2000: case MODE_CONTESTIA_32_1000: case MODE_CONTESTIA_32_2000: case MODE_CONTESTIA_64_500: case MODE_CONTESTIA_64_1000: case MODE_CONTESTIA_64_2000: open_config(TAB_CONTESTIA); break; case MODE_FSQ: open_config(TAB_FSQ); break; case MODE_IFKP: open_config(TAB_IFKP); break; case MODE_RTTY: open_config(TAB_RTTY); break; default: open_config(TAB_PSK); break; } } /* void cb_mnuConfigWinkeyer(Fl_Menu_*, void*) { open_config(TAB_CW); } void cb_mnuConfigWFcontrols(Fl_Menu_ *, void*) { open_config(TAB_UI_WATERFALL); } void cb_n3fjp_logs(Fl_Menu_ *, void*) { open_config(TAB_UI_N3FJP); } void cb_maclogger(Fl_Menu_ *, void*) { open_config(TAB_UI_MACLOGGER); } */ void cb_mnuConfigLoTW(Fl_Menu_ *, void *) { open_config(TAB_LOG_LOTW); } void cb_logfile(Fl_Widget* w, void*) { progStatus.LOGenabled = reinterpret_cast(w)->mvalue()->value(); if (progStatus.LOGenabled == true) { Date tdy; std::string lfname = HomeDir; lfname.append("fldigi"); lfname.append(tdy.szDate(2)); lfname.append(".log"); logfile = new cLogfile(lfname); logfile->log_to_file_start(); } else { logfile->log_to_file_stop(); delete logfile; logfile = 0; } } // LOGBOOK server connect void cb_log_server(Fl_Widget* w, void*) { progdefaults.xml_logbook = reinterpret_cast(w)->mvalue()->value(); close_logbook(); connect_to_log_server(); } void cb_fd_viewer(Fl_Widget* w, void*) { if (field_day_viewer->visible()) field_day_viewer->hide(); else field_day_viewer->show(); } void cb_dxc_viewer(Fl_Widget* w, void*) { if (dxcluster_viewer->visible()) dxcluster_viewer->hide(); else dxcluster_viewer->show(); } void set_server_label(bool val) { Fl_Menu_Item *m = getMenuItem(LOG_CONNECT_SERVER); if (val) m->set(); else m->clear(); } static int save_mvx = 0; void cb_view_hide_channels(Fl_Menu_ *w, void *d) { int mvgw = mvgroup->w(); progStatus.show_channels = !(mvgw > mvgroup->x()); if (!progStatus.show_channels) { save_mvx = mvgw; progStatus.tile_x = mvgroup->x(); } else { progStatus.tile_x = save_mvx; } if (progdefaults.rxtx_swap) { progStatus.tile_y = TransmitText->h(); progStatus.tile_y_ratio = 1.0 * TransmitText->h() / text_panel->h(); } else { progStatus.tile_y = ReceiveText->h(); progStatus.tile_y_ratio = 1.0 * ReceiveText->h() / text_panel->h(); } UI_select(); return; } static bool capval = false; static bool genval = false; static bool playval = false; void cb_mnuCapture(Fl_Widget *w, void *d) { if (!RXscard) return; Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label()); //eek if (playval || genval) { m->clear(); return; } capval = m->value(); if (!m->value()) { RXscard->stopCapture(); return; } std::string fname; int format; SND_SUPPORT::get_file_params("capture", fname, format, true); if (fname.empty()) { m->clear(); capval = 0; return; } if(!RXscard->startCapture(fname, format)) { m->clear(); capval = false; } } void cb_mnuGenerate(Fl_Widget *w, void *d) { Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label()); if (capval || playval) { m->clear(); return; } if (!TXscard) return; genval = m->value(); if (!genval) { TXscard->stopGenerate(); return; } std::string fname; int format; SND_SUPPORT::get_file_params("generate", fname, format, true); if (fname.empty()) { m->clear(); genval = 0; return; } if (!TXscard->startGenerate(fname, format)) { m->clear(); genval = false; } } Fl_Menu_Item *Playback_menu_item = (Fl_Menu_Item *)0; void reset_mnuPlayback() { if (Playback_menu_item == 0) return; Playback_menu_item->clear(); playval = false; } void cb_mnuPlayback(Fl_Widget *w, void *d) { if (!RXscard) return; Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label()); Playback_menu_item = m; if (capval || genval) { m->clear(); bHighSpeed = false; return; } playval = m->value(); if (!playval) { bHighSpeed = false; RXscard->stopPlayback(); return; } std::string fname; int format; SND_SUPPORT::get_file_params("playback", fname, format, false); if (fname.empty()) { m->clear(); playval = 0; return; } progdefaults.loop_playback = fl_choice2(_("Playback continuous loop?"), _("No"), _("Yes"), NULL); int err = RXscard->startPlayback(fname, format); if(err) { fl_alert2(_("Unsupported audio format")); m->clear(); playval = false; bHighSpeed = false; progdefaults.loop_playback = false; } else if (btnAutoSpot->value()) { put_status(_("Spotting disabled"), 3.0); btnAutoSpot->value(0); btnAutoSpot->do_callback(); } } bool first_tab_select = true; void cb_mnu_config_dialog(Fl_Menu_*, void*) { if (first_tab_select) { select_tab_tree(TAB_STATION); first_tab_select = false; } dlgConfig->show(); } void cb_mnuSaveConfig(Fl_Menu_ *, void *) { progdefaults.saveDefaults(); restoreFocus(7); } // This function may be called by the QRZ thread void cb_mnuVisitURL(Fl_Widget*, void* arg) { const char* url = reinterpret_cast(arg); #ifndef __WOE32__ const char* browsers[] = { # ifdef __APPLE__ getenv("FLDIGI_BROWSER"), // valid for any OS - set by user "open" // OS X # else "fl-xdg-open", // Puppy Linux "xdg-open", // other Unix-Linux distros getenv("FLDIGI_BROWSER"), // force use of spec'd browser getenv("BROWSER"), // most Linux distributions "sensible-browser", "firefox", "mozilla" // must be something out there! # endif }; switch (fork()) { case 0: # ifndef NDEBUG unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); # endif for (size_t i = 0; i < sizeof(browsers)/sizeof(browsers[0]); i++) if (browsers[i]) execlp(browsers[i], browsers[i], url, (char*)0); exit(EXIT_FAILURE); case -1: fl_alert2(_("Could not run a web browser:\n%s\n\n" "Open this URL manually:\n%s"), strerror(errno), url); } #else // gurgle... gurgle... HOWL // "The return value is cast as an HINSTANCE for backward // compatibility with 16-bit Windows applications. It is // not a true HINSTANCE, however. The only thing that can // be done with the returned HINSTANCE is to cast it to an // int and compare it with the value 32 or one of the error // codes below." (Error codes omitted to preserve sanity). if ((INT_PTR)ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL) <= 32) fl_alert2(_("Could not open url:\n%s\n"), url); #endif } void open_recv_folder(const char *folder) { cb_mnuVisitURL(0, (void*)folder); } void cb_mnuVisitPSKRep(Fl_Widget*, void*) { cb_mnuVisitURL(0, (void*)std::string("http://pskreporter.info/pskmap?").append(progdefaults.myCall).c_str()); } void html_help( const std::string &Html) { if (!help_dialog) help_dialog = new Fl_Help_Dialog; help_dialog->value(Html.c_str()); help_dialog->show(); } void cb_mnuBeginnersURL(Fl_Widget*, void*) { std::string deffname = HelpDir; deffname.append("beginners.html"); std::ofstream f(deffname.c_str()); if (!f) return; f << szBeginner; f.close(); #ifndef __WOE32__ cb_mnuVisitURL(NULL, (void *)deffname.insert(0, "file://").c_str()); #else cb_mnuVisitURL(NULL, (void *)deffname.c_str()); #endif } void cb_mnuOnLineDOCS(Fl_Widget *, void *) { std::string helpfile = HelpDir; helpfile.append("fldigi-help/index.html"); std::ifstream f(helpfile.c_str()); if (!f) { cb_mnuVisitURL(0, (void *)PACKAGE_DOCS); } else { f.close(); cb_mnuVisitURL(0, (void *)helpfile.c_str()); } } inline int version_check(std::string v1, std::string v2) { long v1a, v1b, v1c; long v2a, v2b, v2c; size_t p; v1a = atol(v1.c_str()); p = v1.find("."); v1.erase(0, p + 1); v1b = atol(v1.c_str()); p = v1.find("."); v1.erase(0, p + 1); v1c = atol(v1.c_str()); p = v1.find("."); v1.erase(0, p + 1); v2a = atol(v2.c_str()); p = v2.find("."); v2.erase(0, p + 1); v2b = atol(v2.c_str()); p = v2.find("."); v2.erase(0, p + 1); v2c = atol(v2.c_str()); p = v2.find("."); v2.erase(0, p + 1); long l1, l2; l1 = v1a * 10000 + v1b * 100 + v1c; l2 = v2a * 10000 + v2b * 100 + v2c; if (l1 < l2) return -1; if (l1 > l2) return 1; if (v1 == v2) return 0; return 1; } static notify_dialog *latest_dialog = 0; void cb_mnuCheckUpdate(Fl_Widget *, void *) { const char *url = "http://www.w1hkj.com/files/fldigi/"; std::string version_str; std::string reply; put_status(_("Checking for updates...")); int ret = get_http(url, reply, 20.0); if (!ret) { put_status(_("Update site not available"), 10); return; } size_t p = reply.find("_setup.exe"); size_t p2 = reply.rfind("fldigi", p); p2 += 7; version_str = reply.substr(p2, p - p2); int is_ok = version_check(std::string(PACKAGE_VERSION), version_str); if (!latest_dialog) latest_dialog = new notify_dialog; if (is_ok == 0) { latest_dialog->notify(_("You are running the latest version"), 5.0); REQ(show_notifier, latest_dialog); } else if (is_ok > 0) { std::string probable; probable.assign(_("You are probably running an alpha version ")); probable.append( PACKAGE_VERSION ).append(_("\nPosted version: ")); probable.append(version_str); latest_dialog->notify(probable.c_str(), 5.0); REQ(show_notifier, latest_dialog); } else fl_message2(_("Version %s is available at Source Forge"), version_str.c_str()); put_status(""); } void cb_mnuAboutURL(Fl_Widget*, void*) { if (!help_dialog) help_dialog = new Fl_Help_Dialog; help_dialog->value(szAbout); help_dialog->resize(help_dialog->x(), help_dialog->y(), help_dialog->w(), 440); help_dialog->show(); } void fldigi_help(const std::string& theHelp) { std::string htmlHelp = "" "" "" PACKAGE " Help" "" "" "" "

"; for (size_t i = 0; i < theHelp.length(); i++) { if (theHelp[i] == '\n') { if (theHelp[i+1] == '\n') { htmlHelp += "

"; i++; } else htmlHelp += "
"; } else if (theHelp[i] == ' ' && theHelp[i+1] == ' ') { htmlHelp += "  "; i++; } else htmlHelp += theHelp[i]; } htmlHelp += "

" "" ""; html_help(htmlHelp); } void cb_mnuCmdLineHelp(Fl_Widget*, void*) { extern std::string option_help; fldigi_help(option_help); restoreFocus(8); } void cb_mnuBuildInfo(Fl_Widget*, void*) { extern std::string build_text; fldigi_help(build_text); restoreFocus(9); } void cb_mnuDebug(Fl_Widget*, void*) { debug::show(); } #ifndef NDEBUG void cb_mnuFun(Fl_Widget*, void*) { fl_message2(_("Sunspot creation underway!")); } #endif void cb_mnuAudioInfo(Fl_Widget*, void*) { if (progdefaults.btnAudioIOis != SND_IDX_PORT) { fl_alert2(_("Audio device information is only available for the PortAudio backend")); return; } #if USE_PORTAUDIO size_t ndev; std::string devtext[2], headers[2]; SoundPort::devices_info(devtext[0], devtext[1]); if (devtext[0] != devtext[1]) { headers[0] = _("Capture device"); headers[1] = _("Playback device"); ndev = 2; } else { headers[0] = _("Capture and playback devices"); ndev = 1; } std::string audio_info; for (size_t i = 0; i < ndev; i++) { audio_info.append("

").append(headers[i]).append("

\n\n"); std::string::size_type j, n = 0; while ((j = devtext[i].find(": ", n)) != std::string::npos) { audio_info.append("") .append(""); if ((n = devtext[i].find('\n', j)) == std::string::npos) { devtext[i] += '\n'; n = devtext[i].length() - 1; } audio_info.append("") .append("\n"); } audio_info.append("
") .append(devtext[i].substr(n, j-n)) .append("") .append(devtext[i].substr(j+2, n-j-2)) .append("

\n"); } fldigi_help(audio_info); #endif } void cb_ShowConfig(Fl_Widget*, void*) { cb_mnuVisitURL(0, (void*)HomeDir.c_str()); } static void cb_ShowDATA(Fl_Widget*, void*) { /// Must be already created by createRecordLoader() dlgRecordLoader->show(); } bool ask_dir_creation( const std::string & dir ) { if ( 0 == directory_is_created(dir.c_str())) { int ans = fl_choice2(_("%s: Do not exist, create?"), _("No"), _("Yes"), 0, dir.c_str() ); if (!ans) return false ; return true ; } return false ; } void cb_ShowNBEMS(Fl_Widget*, void*) { if ( ask_dir_creation(NBEMS_dir)) { check_nbems_dirs(); } cb_mnuVisitURL(0, (void*)NBEMS_dir.c_str()); } void cb_ShowFLMSG(Fl_Widget*, void*) { if ( ask_dir_creation(FLMSG_dir)) { check_nbems_dirs(); } cb_mnuVisitURL(0, (void*)FLMSG_dir.c_str()); } void cb_ShowWEFAX_images(Fl_Widget*, void*) { if (progdefaults.wefax_save_dir.empty()) cb_mnuVisitURL(0, (void*)PicsDir.c_str()); else cb_mnuVisitURL(0, (void*)progdefaults.wefax_save_dir.c_str()); } void cbTune(Fl_Widget *w, void *) { Fl_Button *b = (Fl_Button *)w; if (!(active_modem->get_cap() & modem::CAP_TX)) { b->value(0); return; } if (b->value() == 1) { b->labelcolor(FL_RED); trx_tune(); } else { b->labelcolor(FL_FOREGROUND_COLOR); trx_receive(); } restoreFocus(10); } void cb_quick_rsid (Fl_Widget *w, void *) { progdefaults.rsidWideSearch = !progdefaults.rsidWideSearch; if (progdefaults.rsidWideSearch) chkRSidWideSearch->set(); else chkRSidWideSearch->clear(); } static Fl_Menu_Item quick_change_rsid[] = { { "Passband", 0, cb_quick_rsid, 0, FL_MENU_TOGGLE }, {0,0,0,0,0,0,0,0,0} }; void cbRSID(Fl_Widget *w, void *) { if (Fl::focus() != btnRSID) { progdefaults.rsid = btnRSID->value(); btnRSID->redraw(); return; } switch (Fl::event_button()) { case FL_LEFT_MOUSE: progdefaults.rsid = btnRSID->value(); progdefaults.changed = true; break; case FL_RIGHT_MOUSE: { btnRSID->value(progdefaults.rsid); btnRSID->redraw(); if (progdefaults.rsidWideSearch) quick_change_rsid[0].set(); else quick_change_rsid[0].clear(); const Fl_Menu_Item *m = quick_change_rsid->popup( btnRSID->x(), btnRSID->y() + btnRSID->h()); if (m && m->callback()) m->do_callback(0); break; } default: break; } Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw(); restoreFocus(11); } void cbTxRSID(Fl_Widget *w, void*) { progdefaults.TransmitRSid = btnTxRSID->value(); if (Fl::focus() != btnTxRSID) { btnTxRSID->redraw(); return; } progdefaults.changed = true; restoreFocus(12); } void cbAutoSpot(Fl_Widget* w, void*) { progStatus.spot_recv = static_cast(w)->value(); } void toggleRSID() { progdefaults.rsid = !progdefaults.rsid; cbRSID(NULL, NULL); } static notify_dialog *rx_monitor_alert = 0; void cb_mnuRxAudioDialog(Fl_Menu_ *w, void *d) { if (!progdefaults.enable_audio_alerts) { if (!rx_monitor_alert) rx_monitor_alert = new notify_dialog; rx_monitor_alert->notify("Audio-Alert / Rx-Monitor device NOT enabled", 10.0); show_notifier(rx_monitor_alert); return; } if (rxaudio_dialog) rxaudio_dialog->show(); } void cb_mnuDigiscope(Fl_Menu_ *w, void *d) { if (scopeview) scopeview->show(); } void cb_mnuViewer(Fl_Menu_ *, void *) { openViewer(); } void cb_mnuSpectrum (Fl_Menu_ *, void *) { open_spectrum_viewer(); } void cb_mnuShowCountries(Fl_Menu_ *, void *) { notify_dxcc_show(); } void set_macroLabels() { if (bWF_only) return; if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { altMacros = 1; for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label(macros.name[i].c_str()); btnMacro[i]->redraw_label(); btnMacro[NUMMACKEYS + i]->label( macros.name[(altMacros * NUMMACKEYS) + i].c_str()); btnMacro[NUMMACKEYS + i]->redraw_label(); } btnAltMacros1->label("1"); btnAltMacros1->redraw_label(); btnAltMacros2->label("2"); btnAltMacros2->redraw_label(); } else { altMacros = 0; btnAltMacros1->label("1"); btnAltMacros1->redraw_label(); for (int i = 0; i < NUMMACKEYS; i++) { btnMacro[i]->label(macros.name[i].c_str()); btnMacro[i]->redraw_label(); } } for (int i = 0; i < 48; i++) { btnDockMacro[i]->label(macros.name[i].c_str()); btnDockMacro[i]->redraw_label(); } } void cb_mnuPicViewer(Fl_Menu_ *, void *) { if (picRxWin) { picRx->redraw(); picRxWin->show(); } } void cb_mnuThorViewRaw(Fl_Menu_ *, void *) { thor_load_raw_video(); } void cb_mnuIfkpViewRaw(Fl_Menu_ *, void *) { ifkp_load_raw_video(); } void cb_sldrSquelch(Fl_Slider* o, void*) { if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { progStatus.sldrPwrSquelchValue = o->value(); } else { progStatus.sldrSquelchValue = o->value(); modeband.set_mode_squelch( progStatus.sldrSquelchValue ); } restoreFocus(13); } bool oktoclear = true; void updateOutSerNo() { Fl_Input2* outsn[] = { outSQSO_serno1, outSQSO_serno2, outSerNo1, outSerNo2, outSerNo3, outSerNo4, outSerNo5, outSerNo6, outSerNo7, outSerNo8, out_IARI_SerNo1, out_IARI_SerNo2, // outSerNo_WAE1, outSerNo_WAE2, outSerNo_WPX1, outSerNo_WPX2 }; size_t num_fields = sizeof(outsn)/sizeof(*outsn); for (size_t i = 0; i < num_fields; i++) { outsn[i]->value(""); outsn[i]->redraw(); } int nr = contest_count.count; if (!n3fjp_serno.empty()) { sscanf(n3fjp_serno.c_str(), "%d", &nr); } char szcnt[10] = ""; contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(szcnt, sizeof(szcnt), contest_count.fmt.c_str(), nr); for (size_t i = 0; i < num_fields; i++) { outsn[i]->value(szcnt); outsn[i]->redraw(); } } static std::string old_call; static std::string new_call; void set599() { if (bWF_only) return; Fl_Input2* rstin[] = { inpRstIn1, inpRstIn2, inpRstIn3, inpRstIn4, inpRstIn_AICW2, inpRstIn_SQSO2, inp_IARI_RSTin2, // inpRstIn_WAE2, inpRstIn_WPX2}; Fl_Input2* rstout[] = { inpRstOut1, inpRstOut2, inpRstOut3, inpRstOut4, inpRstIn_AICW2, inpRstOut_SQSO2, inp_IARI_RSTout2, // inpRstOut_WAE2, inpRstOut_WPX2}; if (!active_modem) return; std::string defrst = (active_modem->get_mode() == MODE_SSB) ? "59" : "599"; if (progdefaults.RSTin_default) { size_t num_fields = sizeof(rstin)/sizeof(*rstin); for (size_t i = 0; i < num_fields; i++) rstin[i]->value(defrst.c_str()); } if (progdefaults.RSTdefault) { size_t num_fields = sizeof(rstout)/sizeof(*rstout); for (size_t i = 0; i < num_fields; i++) rstout[i]->value(defrst.c_str()); } if (progdefaults.logging > 0 && progdefaults.fixed599) { size_t num_fields = sizeof(rstout)/sizeof(*rstout); for (size_t i = 0; i < num_fields; i++) rstout[i]->value(defrst.c_str()); } } void init_country_fields() { Fl_ComboBox *country_fields[] = { cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2//, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->add(cbolist.c_str()); } cboCountyQSO->add(counties().c_str()); } void set_log_colors() { Fl_Input2* qso_fields[] = { inpCall1, inpCall2, inpCall3, inpCall4, inpName1, inpName2, inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOn4, inpTimeOn5, inpRstIn1, inpRstIn2, inpRstOut1, inpRstOut2, inpQth, inpLoc1, inpAZ, inpVEprov, inpState1, inpSerNo1, inpSerNo2, inpSerNo3, inpSerNo4, outSerNo1, outSerNo2, outSerNo3, outSerNo4, outSerNo5, outSerNo6, outSerNo7, outSerNo8, inpXchgIn1, inpXchgIn2, inp_FD_class1, inp_FD_section1, inp_FD_class2, inp_FD_section2, inp_KD_name2, inp_KD_age1, inp_KD_age2, inp_KD_state1, inp_KD_state2, inp_KD_VEprov1, inp_KD_VEprov2, inp_KD_XchgIn1, inp_KD_XchgIn2, inp_SS_Check1, inp_SS_Precedence1, inp_SS_Section1, inp_SS_SerialNoR1, inp_SS_Check2, inp_SS_Precedence2, inp_SS_Section2, inp_SS_SerialNoR2, inp_CQ_RSTin2, inp_CQDX_RSTin2, inp_CQ_RSTout2, inp_CQDX_RSTout2, inp_CQstate1, inp_CQstate2, inp_CQzone1, inp_CQzone2, inp_CQDXzone1, inp_CQDXzone2, inp_1010_XchgIn1, inp_1010_XchgIn2, inp_1010_name2, inp_1010_nr1, inp_1010_nr2, inp_ARR_Name2, inp_ARR_XchgIn1, inp_ARR_XchgIn2, inp_ARR_check1, inp_ARR_check2, inp_ASCR_RSTin2, inp_ASCR_RSTout2, inp_ASCR_XchgIn1, inp_ASCR_XchgIn2, inp_ASCR_class1, inp_ASCR_class2, inp_ASCR_name2, inp_vhf_Loc1, inp_vhf_Loc2, inp_vhf_RSTin1, inp_vhf_RSTin2, inp_vhf_RSTout1, inp_vhf_RSTout2, inpSPCnum_NAQP1, inpSPCnum_NAQP2, inpNAQPname2, inp_name_NAS2, inp_ser_NAS1, inpSPCnum_NAS1, inp_ser_NAS2, inpSPCnum_NAS2, inpRTU_stpr1, inpRTU_stpr2, inpRTU_RSTin2, inpRTU_RSTout2, inpRTU_serno1, inpRTU_serno2, inp_IARI_PR1, inp_IARI_PR2, inp_IARI_RSTin2, inp_IARI_RSTout2, out_IARI_SerNo1, inp_IARI_SerNo1, out_IARI_SerNo2, inp_IARI_SerNo2, inpRstIn3, inpRstOut3, inpRstIn4, inpRstOut4, inp_JOTA_scout1, inp_JOTA_scout2, inp_JOTA_troop1, inp_JOTA_troop2, inp_JOTA_spc1, inp_JOTA_spc2, inpRstIn_AICW2, inpRstOut_AICW2, inpSPCnum_AICW1, inpSPCnum_AICW2, inpSQSO_state1, inpSQSO_state2, inpSQSO_county1, inpSQSO_county2, inpSQSO_serno1, inpSQSO_serno2, outSQSO_serno1, outSQSO_serno2, inpRstIn_SQSO2, inpRstOut_SQSO2, inpSQSO_name2, inpSQSO_category1, inpSQSO_category2, inpSerNo_WPX1, inpSerNo_WPX2, inpRstIn_WPX2, inpRstOut_WPX2, outSerNo_WPX1, outSerNo_WPX2, inpSerNo_WAE1, inpSerNo_WAE2, outSerNo_WAE1, outSerNo_WAE2, inpRstIn_WAE2, inpRstOut_WAE2, inpNotes }; if (!bWF_only) { Fl_ComboBox *country_fields[] = { cboCountyQSO, cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2 //, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->redraw(); combo_color_font(country_fields[i]); } size_t num_fields = sizeof(qso_fields)/sizeof(*qso_fields); for (size_t i = 0; i < num_fields; i++) { qso_fields[i]->textsize(progdefaults.LOGGINGtextsize); qso_fields[i]->textfont(progdefaults.LOGGINGtextfont); qso_fields[i]->textcolor(progdefaults.LOGGINGtextcolor); qso_fields[i]->color(progdefaults.LOGGINGcolor); qso_fields[i]->labelfont(progdefaults.LOGGINGtextfont); qso_fields[i]->redraw_label(); } if (!progdefaults.SQSOlogstate) { inpSQSO_state1->hide(); inpSQSO_state2->hide(); } if (!progdefaults.SQSOlogcounty) { inpSQSO_county1->hide(); inpSQSO_county2->hide(); } if (!progdefaults.SQSOlogserno) { inpSQSO_serno1->hide(); inpSQSO_serno2->hide(); outSQSO_serno1->hide(); outSQSO_serno2->hide(); } if (!progdefaults.SQSOlogrst) { inpRstIn_SQSO2->hide(); inpRstOut_SQSO2->hide(); } if (!progdefaults.SQSOlogname) { inpSQSO_name2->hide(); } if (!progdefaults.SQSOlogcat) { inpSQSO_category1->hide(); inpSQSO_category2->hide(); } for (size_t i = 0; i < num_fields; i++) { qso_fields[i]->redraw(); } } } void clear_time_on() { Fl_Input2* log_fields[] = { inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOn4, inpTimeOn5 }; size_t num_fields = sizeof(log_fields)/sizeof(*log_fields); for (size_t i = 0; i < num_fields; i++) { log_fields[i]->value(""); log_fields[i]->textsize(progdefaults.LOGGINGtextsize); log_fields[i]->textfont(progdefaults.LOGGINGtextfont); log_fields[i]->textcolor(progdefaults.LOGGINGtextcolor); log_fields[i]->color(progdefaults.LOGGINGcolor); log_fields[i]->labelfont(progdefaults.LOGGINGtextfont); log_fields[i]->show(); log_fields[i]->redraw_label(); log_fields[i]->redraw(); } } void clear_log_fields() { Fl_Input2* log_fields[] = { inpName1, inpName2, // inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOn4, inpTimeOn5, inpRstIn1, inpRstIn2, inpRstOut1, inpRstOut2, inpQth, inpLoc1, inpAZ, inpVEprov, inpState1, inpSerNo1, inpSerNo2, outSerNo1, outSerNo2, outSerNo3, outSerNo4, inpXchgIn1, inpXchgIn2, inp_FD_class1, inp_FD_section1, inp_FD_class2, inp_FD_section2, inp_KD_name2, inp_KD_age1, inp_KD_age2, inp_KD_state1, inp_KD_state2, inp_KD_VEprov1, inp_KD_VEprov2, inp_KD_XchgIn1, inp_KD_XchgIn2, inp_SS_Check1, inp_SS_Precedence1, inp_SS_Section1, inp_SS_SerialNoR1, inp_SS_Check2, inp_SS_Precedence2, inp_SS_Section2, inp_SS_SerialNoR2, inp_CQ_RSTin2, inp_CQDX_RSTin2, inp_CQ_RSTout2, inp_CQDX_RSTout2, inp_CQstate1, inp_CQstate2, inp_CQzone1, inp_CQzone2, inp_CQDXzone1, inp_CQDXzone2, inp_1010_XchgIn1, inp_1010_XchgIn2, inp_1010_name2, inp_1010_nr1, inp_1010_nr2, inp_ARR_Name2, inp_ARR_XchgIn1, inp_ARR_XchgIn2, inp_ARR_check1, inp_ARR_check2, inp_ASCR_RSTin2, inp_ASCR_RSTout2, inp_ASCR_XchgIn1, inp_ASCR_XchgIn2, inp_ASCR_class1, inp_ASCR_class2, inp_ASCR_name2, inp_vhf_Loc1, inp_vhf_Loc2, inp_vhf_RSTin1, inp_vhf_RSTin2, inp_vhf_RSTout1, inp_vhf_RSTout2, inpSPCnum_NAQP1, inpSPCnum_NAQP2, inpNAQPname2, inp_name_NAS2, outSerNo4, inp_ser_NAS1, inpSPCnum_NAS1, outSerNo5, inp_ser_NAS2, inpSPCnum_NAS2, inpRTU_stpr1, inpRTU_stpr2, inpRTU_RSTin2, inpRTU_RSTout2, inpRTU_serno1, inpRTU_serno2, inp_IARI_RSTin2, inp_IARI_RSTout2, out_IARI_SerNo1, inp_IARI_SerNo1, out_IARI_SerNo2, inp_IARI_SerNo2, inp_IARI_PR1, inp_IARI_PR2, inpSerNo3, inpSerNo4, outSerNo7, outSerNo8, inpRstIn3, inpRstOut3, inpRstIn4, inpRstOut4, inp_JOTA_scout1, inp_JOTA_scout2, inp_JOTA_troop1, inp_JOTA_troop2, inp_JOTA_spc1, inp_JOTA_spc2, inpRstIn_AICW2, inpRstOut_AICW2, inpSPCnum_AICW1, inpSPCnum_AICW2, inpSerNo_WPX1, inpSerNo_WPX2, inpRstIn_WPX2, inpRstOut_WPX2, inpSerNo_WAE1, inpSerNo_WAE2, outSerNo_WAE1, outSerNo_WAE2, inpRstIn_WAE2, inpRstOut_WAE2, inpSQSO_category1, inpSQSO_category2, inpSQSO_county1, inpSQSO_county2, inpSQSO_name2, inpSQSO_serno1, inpSQSO_serno2, inpSQSO_state1, inpSQSO_state2, inpNotes }; size_t num_fields = sizeof(log_fields)/sizeof(*log_fields); for (size_t i = 0; i < num_fields; i++) { log_fields[i]->value(""); log_fields[i]->textsize(progdefaults.LOGGINGtextsize); log_fields[i]->textfont(progdefaults.LOGGINGtextfont); log_fields[i]->textcolor(progdefaults.LOGGINGtextcolor); log_fields[i]->color(progdefaults.LOGGINGcolor); log_fields[i]->labelfont(progdefaults.LOGGINGtextfont); log_fields[i]->show(); log_fields[i]->redraw_label(); log_fields[i]->redraw(); } Fl_ComboBox *country_fields[] = { cboCountyQSO, cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2 //, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->value(""); country_fields[i]->redraw(); combo_color_font(country_fields[i]); } if (!progdefaults.SQSOlogstate) { inpSQSO_state1->hide(); inpSQSO_state2->hide(); } if (!progdefaults.SQSOlogcounty) { inpSQSO_county1->hide(); inpSQSO_county2->hide(); } if (!progdefaults.SQSOlogserno) { inpSQSO_serno1->hide(); inpSQSO_serno2->hide(); outSQSO_serno1->hide(); outSQSO_serno2->hide(); } if (!progdefaults.SQSOlogrst) { inpRstIn_SQSO2->hide(); inpRstOut_SQSO2->hide(); } if (!progdefaults.SQSOlogname) { inpSQSO_name2->hide(); } if (!progdefaults.SQSOlogcat) { inpSQSO_category1->hide(); inpSQSO_category2->hide(); } if (progdefaults.logging == LOG_SQSO) { std::string tmp = QSOparties.qso_parties[progdefaults.SQSOcontest].state; if (!progdefaults.SQSOinstate && (tmp != "7QP") && (tmp != "6NE")) inpState->value(tmp.c_str()); } set599(); updateOutSerNo(); } void clearQSO() { if (bWF_only) return; Fl_Input2* call_fields[] = { inpCall1, inpCall2, inpCall3, inpCall4 }; size_t num_fields = sizeof(call_fields)/sizeof(*call_fields); for (size_t i = 0; i < num_fields; i++) { call_fields[i]->value(""); call_fields[i]->textsize(progdefaults.LOGGINGtextsize); call_fields[i]->textfont(progdefaults.LOGGINGtextfont); call_fields[i]->textcolor(progdefaults.LOGGINGtextcolor); call_fields[i]->color(progdefaults.LOGGINGcolor); call_fields[i]->labelfont(progdefaults.LOGGINGtextfont); call_fields[i]->show(); call_fields[i]->redraw_label(); call_fields[i]->redraw(); } clear_log_fields(); clear_time_on(); if (inpSearchString) inpSearchString->value (""); old_call.clear(); new_call.clear(); qso_time.clear(); qso_exchange.clear(); oktoclear = true; inpCall->take_focus(); if (n3fjp_connected) n3fjp_clear_record(); set599(); updateOutSerNo(); } void cb_ResetSerNbr() { contest_count.count = progdefaults.ContestStart; updateOutSerNo(); } void cb_btnTimeOn(Fl_Widget* w, void*) { inpTimeOn->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn1->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn2->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn3->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn4->value(inpTimeOff->value(), inpTimeOff->size()); inpTimeOn5->value(inpTimeOff->value(), inpTimeOff->size()); sTime_on = sTime_off = ztime(); sDate_on = sDate_off = zdate(); restoreFocus(14); } void cb_loc(Fl_Widget* w, void*) { Fl_Input2 *inp = (Fl_Input2 *) w; inpLoc1->value(inp->value()); inp_vhf_Loc1->value(inp->value()); inp_vhf_Loc2->value(inp->value()); std::string s; s = inp->value(); if (s.length() < 3) return; double lon[2], lat[2], distance, azimuth; size_t len = s.length(); if (len > MAX_LOC) { s.erase(MAX_LOC); len = MAX_LOC; } bool ok = true; for (size_t i = 0; i < len; i++) { if (ok) switch (i) { case 0 : case 1 : case 4 : case 5 : ok = isalpha(s[i]); break; case 2 : case 3 : case 6 : case 7 : ok = (s[i] >= '0' && s[i] <= '9'); } } if ( !ok) { inpLoc1->value(""); inp_vhf_Loc1->value(""); inp_vhf_Loc2->value(""); return; } if (QRB::locator2longlat(&lon[0], &lat[0], progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::locator2longlat(&lon[1], &lat[1], s.c_str()) == QRB::QRB_OK && QRB::qrb(lon[0], lat[0], lon[1], lat[1], &distance, &azimuth) == QRB::QRB_OK) { char az[4]; snprintf(az, sizeof(az), "%3.0f", azimuth); inpAZ->value(az); } else inpAZ->value(""); if (Fl::event() == FL_KEYBOARD) { int k = Fl::event_key(); if (k == FL_Enter || k == FL_KP_Enter) restoreFocus(15); } } void cb_call(Fl_Widget* w, void*) { if (bWF_only) return; qsodb.isdirty(1); if (progdefaults.calluppercase) { int pos = inpCall->position(); char* uc = new char[inpCall->size()]; std::transform(inpCall->value(), inpCall->value() + inpCall->size(), uc, static_cast(std::toupper)); inpCall->value(uc, inpCall->size()); inpCall->position(pos); delete [] uc; } new_call = inpCall->value(); if (new_call.length() > MAX_CALL) { new_call.erase(MAX_CALL); } if (new_call != old_call) clear_log_fields(); inpCall1->value(new_call.c_str()); inpCall2->value(new_call.c_str()); inpCall3->value(new_call.c_str()); inpCall4->value(new_call.c_str()); sDate_on = sDate_off = zdate(); sTime_on = sTime_off = ztime(); inpTimeOn->value(inpTimeOff->value()); inpTimeOn1->value(inpTimeOff->value()); inpTimeOn2->value(inpTimeOff->value()); inpTimeOn3->value(inpTimeOff->value()); inpTimeOn4->value(inpTimeOff->value()); inpTimeOn5->value(inpTimeOff->value()); if (progStatus.timer && (Fl::event() != FL_HIDE)) stopMacroTimer(); if (Fl::event() == FL_KEYBOARD) { int k = Fl::event_key(); if (k == FL_Enter || k == FL_KP_Enter) { restoreFocus(16); n3fjp_calltab = true; } if (k == FL_Tab) { n3fjp_calltab = true; } } if (old_call == new_call) { if (n3fjp_calltab && n3fjp_connected) SearchLastQSO(inpCall->value()); return; } if (new_call.empty()) { if (n3fjp_connected) n3fjp_clear_record(); ifkp_load_avatar(); thor_load_avatar(); updateOutSerNo(); oktoclear = true; return; } old_call = new_call; oktoclear = false; SearchLastQSO(inpCall->value()); if (active_modem->get_mode() == MODE_IFKP) ifkp_load_avatar(inpCall->value()); if (active_modem->get_mode() >= MODE_THOR11 && active_modem->get_mode() <= MODE_THOR56) thor_load_avatar(inpCall->value()); const struct dxcc* e = dxcc_lookup(inpCall->value()); if (e) { if (progdefaults.autofill_qso_fields || progdefaults.logging != LOG_QSO) { double lon, lat, distance, azimuth; if (QRB::locator2longlat(&lon, &lat, progdefaults.myLocator.c_str()) == QRB::QRB_OK && QRB::qrb(lon, lat, -e->longitude, e->latitude, &distance, &azimuth) == QRB::QRB_OK) { char az[4]; snprintf(az, sizeof(az), "%3.0f", azimuth); inpAZ->value(az, sizeof(az) - 1); } } std::string cntry = e->country; std::ostringstream zone; zone << e->cq_zone; if (cntry.find("United States") != std::string::npos) cntry = "USA"; cboCountry->value(cntry.c_str()); inp_CQzone->value(zone.str().c_str()); } if (progdefaults.EnableDupCheck || FD_logged_on) { DupCheck(); } updateOutSerNo(); if (w != inpCall) restoreFocus(17); } void cb_country(Fl_Widget *w, void*) { Fl_ComboBox * inp = (Fl_ComboBox *) w; std::string str = inp->value(); Fl_ComboBox *country_fields[] = { cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2 //, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(country_fields)/sizeof(*country_fields); i++) { country_fields[i]->value(str.c_str()); country_fields[i]->position(0); country_fields[i]->redraw(); } if (progdefaults.EnableDupCheck || FD_logged_on) { DupCheck(); } if (Fl::event() == FL_KEYBOARD) { int k = Fl::event_key(); if (k == FL_Enter || k == FL_KP_Enter) restoreFocus(18); } } void cb_log(Fl_Widget* w, void*) { Fl_Input2 *inp = (Fl_Input2 *) w; if (inp == inpName1 || inp == inpName2 || inp == inp_KD_name2 || inp == inp_1010_name2 || inp == inp_ARR_Name2 || inp == inpNAQPname2 ) { int p = inp->position(); std::string val = inp->value(); inpName1->value(val.c_str()); inpName2->value(val.c_str()); inp_KD_name2->value(val.c_str()); inp_1010_name2->value(val.c_str()); inp_ARR_Name2->value(val.c_str()); inpNAQPname2->value(val.c_str()); inp->position(p); } else if (inp == inp_KD_name2 || inp == inp_1010_name2 || inp == inp_ARR_Name2 || inp == inpNAQPname2) { int p = inp->position(); std::string val = inp->value(); inpName1->value(val.c_str()); inpName2->value(val.c_str()); inp_KD_name2->value(val.c_str()); inp_1010_name2->value(val.c_str()); inp_ARR_Name2->value(val.c_str()); inpNAQPname2->value(val.c_str()); inp->position(p); } else if (inp == inpRstIn1 || inp == inpRstIn2 || inp == inpRstIn3 || inp == inpRstIn4 || inp == inpRstIn_AICW2 || inp == inpRTU_RSTin2 || inp == inp_CQ_RSTin2 || inp == inp_vhf_RSTin1 || inp == inp_vhf_RSTin2 ) { int p = inp->position(); std::string val = inp->value(); inpRstIn1->value(val.c_str()); inpRstIn2->value(val.c_str()); inpRstIn3->value(val.c_str()); inpRstIn4->value(val.c_str()); inpRstIn_AICW2->value(val.c_str()); inpRTU_RSTin2->value(val.c_str()); inp_vhf_RSTin1->value(val.c_str()); inp_vhf_RSTin2->value(val.c_str()); inp_CQ_RSTin2->value(val.c_str()); inp->position(p); } else if (inp == inpRstOut1 || inp == inpRstOut2 || inp == inp_CQ_RSTout2 || inp == inpRTU_RSTout2 || inp == inpRstOut3 || inp == inpRstOut4 || inp == inpRstOut_AICW2 || inp == inp_vhf_RSTout1 || inp == inp_vhf_RSTout2 ) { int p = inp->position(); std::string val = inp->value(); inpRstOut1->value(val.c_str()); inpRstOut2->value(val.c_str()); inpRstOut3->value(val.c_str()); inpRstOut4->value(val.c_str()); inpRTU_RSTout2->value(val.c_str()); inpRstOut_AICW2->value(val.c_str()); inp_CQ_RSTout2->value(val.c_str()); inp_vhf_RSTout1->value(val.c_str()); inp_vhf_RSTout2->value(val.c_str()); inp->position(p); } else if (inp == inpTimeOn1 || inp == inpTimeOn2 || inp == inpTimeOn3 || inp == inpTimeOn4 || inp == inpTimeOn5) { int p = inp->position(); std::string val = inp->value(); inpTimeOn1->value(val.c_str()); inpTimeOn2->value(val.c_str()); inpTimeOn3->value(val.c_str()); inpTimeOn4->value(val.c_str()); inpTimeOn5->value(val.c_str()); inp->position(p); } else if (inp == inpTimeOff1 || inp == inpTimeOff2 || inp == inpTimeOff3 || inp == inpTimeOff4 || inp == inpTimeOff5) { int p = inp->position(); std::string val = inp->value(); inpTimeOff1->value(val.c_str()); inpTimeOff2->value(val.c_str()); inpTimeOff3->value(val.c_str()); inpTimeOff4->value(val.c_str()); inpTimeOff5->value(val.c_str()); inp->position(p); } else if (inp == inpXchgIn1 || inp == inpXchgIn2 ) { int p = inp->position(); std::string val = inp->value(); inpXchgIn1->value(val.c_str()); inpXchgIn2->value(val.c_str()); inp_KD_XchgIn1->value(val.c_str()); inp_KD_XchgIn2->value(val.c_str()); inp_1010_XchgIn1->value(val.c_str()); inp_1010_XchgIn2->value(val.c_str()); inp_ARR_XchgIn1->value(val.c_str()); inp_ARR_XchgIn2->value(val.c_str()); inp->position(p); } else if (inp == inp_KD_XchgIn1 || inp == inp_KD_XchgIn2) { int p = inp->position(); std::string val = inp->value(); inpXchgIn1->value(val.c_str()); inpXchgIn2->value(val.c_str()); inp_KD_XchgIn1->value(val.c_str()); inp_KD_XchgIn2->value(val.c_str()); inp_1010_XchgIn1->value(val.c_str()); inp_1010_XchgIn2->value(val.c_str()); inp_ARR_XchgIn1->value(val.c_str()); inp_ARR_XchgIn2->value(val.c_str()); inp->position(p); } else if (inp == inp_1010_XchgIn1 || inp == inp_1010_XchgIn2) { int p = inp->position(); std::string val = inp->value(); inpXchgIn1->value(val.c_str()); inpXchgIn2->value(val.c_str()); inp_KD_XchgIn1->value(val.c_str()); inp_KD_XchgIn2->value(val.c_str()); inp_1010_XchgIn1->value(val.c_str()); inp_1010_XchgIn2->value(val.c_str()); inp_ARR_XchgIn1->value(val.c_str()); inp_ARR_XchgIn2->value(val.c_str()); inp->position(p); } else if (inp == inp_ARR_XchgIn1 || inp == inp_ARR_XchgIn2) { int p = inp->position(); std::string val = inp->value(); inpXchgIn1->value(val.c_str()); inpXchgIn2->value(val.c_str()); inp_KD_XchgIn1->value(val.c_str()); inp_KD_XchgIn2->value(val.c_str()); inp_1010_XchgIn1->value(val.c_str()); inp_1010_XchgIn2->value(val.c_str()); inp_ARR_XchgIn1->value(val.c_str()); inp_ARR_XchgIn2->value(val.c_str()); inp->position(p); } else if (inp == inpSerNo1 || inp == inpSerNo2 || inp == inpRTU_serno1 || inp == inpRTU_serno2 || inp == inp_SS_SerialNoR1 || inp == inp_SS_SerialNoR2 ) { int p = inp->position(); std::string val = inp->value(); inpSerNo1->value(val.c_str()); inpSerNo2->value(val.c_str()); inp_SS_SerialNoR1->value(val.c_str()); inp_SS_SerialNoR2->value(val.c_str()); inpRTU_serno1->value(val.c_str()); inpRTU_serno2->value(val.c_str()); inp->position(p); } else if (inp == inp_SS_Precedence1 || inp == inp_SS_Precedence2) { int p = inp->position(); std::string val = inp->value(); inp_SS_Precedence1->value(val.c_str()); inp_SS_Precedence2->value(val.c_str()); inp->position(p); } else if (inp == inp_SS_Check1 || inp == inp_SS_Check2) { int p = inp->position(); std::string val = inp->value(); inp_SS_Check1->value(val.c_str()); inp_SS_Check2->value(val.c_str()); inp->position(p); } else if (inp == inp_SS_Section1 || inp == inp_SS_Section2) { int p = inp->position(); std::string val = inp->value(); inp_SS_Section1->value(val.c_str()); inp_SS_Section2->value(val.c_str()); inp->position(p); } else if (inp == inpSPCnum_NAQP1 || inp == inpSPCnum_NAQP2) { int p = inp->position(); std::string val = inp->value(); inpSPCnum_NAQP1->value(val.c_str()); inpSPCnum_NAQP2->value(val.c_str()); inp->position(p); } else if (inp == inpSPCnum_AICW1 || inp == inpSPCnum_AICW2) { // Rx power int p = inp->position(); std::string val = inp->value(); inpSPCnum_AICW1->value(val.c_str()); inpSPCnum_AICW2->value(val.c_str()); inp->position(p); } else if (inp == inp_ARR_check1 || inp == inp_ARR_check2) { int p = inp->position(); std::string val = inp->value(); inp_ARR_check1->value(val.c_str()); inp_ARR_check2->value(val.c_str()); inp->position(p); } else if (inp == inp_1010_nr1 || inp == inp_1010_nr2) { int p = inp->position(); std::string val = inp->value(); inp_1010_nr1->value(val.c_str()); inp_1010_nr2->value(val.c_str()); inp->position(p); } else if (inp == inp_FD_class1 || inp == inp_FD_class2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_FD_class1->value(str.c_str()); inp_FD_class2->value(str.c_str()); inp->position(p); } else if (inp == inp_ASCR_class1 || inp == inp_ASCR_class2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_ASCR_class1->value(str.c_str()); inp_ASCR_class2->value(str.c_str()); inp->position(p); } else if (inp == inp_FD_section1 || inp == inp_FD_section2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_FD_section1->value(str.c_str()); inp_FD_section2->value(str.c_str()); inp->position(p); } else if (inp == inp_KD_age1 || inp == inp_KD_age2) { int p = inp->position(); std::string val = inp->value(); inp_KD_age1->value(val.c_str()); inp_KD_age2->value(val.c_str()); inp->position(p); } else if (inp == inp_KD_state1 || inp == inp_KD_state2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_KD_state1->value(str.c_str()); inp_KD_state2->value(str.c_str()); inp->position(p); } else if (inp == inp_KD_VEprov1 || inp == inp_KD_VEprov2) { int p = inp->position(); std::string str = ucasestr(inp->value()); inp_KD_VEprov1->value(str.c_str()); inp_KD_VEprov2->value(str.c_str()); inp->position(p); } else if (inp == inp_ser_NAS1 || inp == inp_ser_NAS2) { int p = inp->position(); std::string val = inp->value(); inp_ser_NAS1->value(val.c_str()); inp_ser_NAS2->value(val.c_str()); inp->position(p); } else if (inp == inp_JOTA_scout1 || inp == inp_JOTA_scout2) { int p = inp->position(); std::string val = inp->value(); inp_JOTA_scout1->value(val.c_str()); inp_JOTA_scout2->value(val.c_str()); inp->position(p); } else if (inp == inp_JOTA_troop1 || inp == inp_JOTA_troop2) { int p = inp->position(); std::string val = inp->value(); inp_JOTA_troop1->value(val.c_str()); inp_JOTA_troop2->value(val.c_str()); inp->position(p); } else if (inp == inp_JOTA_spc1 || inp == inp_JOTA_spc2) { int p = inp->position(); std::string val = inp->value(); inp_JOTA_spc1->value(val.c_str()); inp_JOTA_spc2->value(val.c_str()); inp->position(p); } else if (inp == inpState) { Cstates st; if (inpCounty->value()[0]) cboCountyQSO->value( std::string(st.state_short(inpState->value())).append(" "). append(st.county(inpState->value(), inpCounty->value())).c_str()); else cboCountyQSO->clear_entry(); cboCountyQSO->redraw(); } else if (inp == inpCounty) { Cstates st; if (inpState->value()[0]) cboCountyQSO->value( std::string(st.state_short(inpState->value())).append(" "). append(st.county(inpState->value(), inpCounty->value())).c_str()); else cboCountyQSO->clear_entry(); cboCountyQSO->redraw(); } if (progdefaults.EnableDupCheck || FD_logged_on) { DupCheck(); } if (Fl::event() == FL_KEYBOARD) { int k = Fl::event_key(); if (k == FL_Enter || k == FL_KP_Enter) restoreFocus(18); } } void cbClearCall(Fl_Widget *b, void *) { clearQSO(); } void qsoClear_cb(Fl_Widget *b, void *) { bool CLEARLOG = true; if (progdefaults.NagMe && !oktoclear) CLEARLOG = (fl_choice2(_("Clear log fields?"), _("Cancel"), _("OK"), NULL) == 1); if (CLEARLOG) { clearQSO(); } clear_Lookup(); if (active_modem->get_mode() == MODE_IFKP) ifkp_clear_avatar(); if (active_modem->get_mode() >= MODE_THOR11 && active_modem->get_mode() <= MODE_THOR56) thor_clear_avatar(); qsodb.isdirty(0); } extern cQsoDb qsodb; void qso_save_now() { // if (!qsodb.isdirty()) return; std::string havecall = inpCall->value(); std::string timeon = inpTimeOn->value(); while (!havecall.empty() && havecall[0] <= ' ') havecall.erase(0,1); while (!havecall.empty() && havecall[havecall.length() - 1] <= ' ') havecall.erase(havecall.length()-1, 1); if (havecall.empty()) return; sDate_off = zdate(); sTime_off = ztime(); if (!timeon.empty()) sTime_on = timeon.c_str(); else sTime_on = sTime_off; submit_log(); if (progdefaults.ClearOnSave) clearQSO(); } void qsoSave_cb(Fl_Widget *b, void *) { qso_save_now(); ReceiveText->mark(FTextBase::XMIT); restoreFocus(20); } void cb_QRZ(Fl_Widget *b, void *) { if (!*inpCall->value()) return restoreFocus(21); switch (Fl::event_button()) { case FL_LEFT_MOUSE: CALLSIGNquery(); oktoclear = false; break; case FL_RIGHT_MOUSE: if (quick_choice(std::string("Spot \"").append(inpCall->value()).append("\"?").c_str(), 2, _("Confirm"), _("Cancel"), NULL) == 1) spot_manual(inpCall->value(), inpLoc->value()); break; default: break; } restoreFocus(22); } void status_cb(Fl_Widget *b, void *arg) { if (Fl::event_button() == FL_RIGHT_MOUSE) { trx_mode md = active_modem->get_mode(); if (md == MODE_FMT) open_config(TAB_FMT); else if (md == MODE_CW) open_config(TAB_CW); else if (md == MODE_IFKP) open_config(TAB_IFKP); else if (md == MODE_FSQ) open_config(TAB_FSQ); else if (md == MODE_RTTY) open_config(TAB_RTTY); else if (md >= MODE_THOR_FIRST && md <= MODE_THOR_LAST) open_config(TAB_THOR); else if (md >= MODE_OLIVIA_FIRST && md <= MODE_OLIVIA_LAST) open_config(TAB_OLIVIA); else if (md >= MODE_PSK_FIRST && md <= MODE_PSK_LAST) open_config(TAB_PSK); else if (md >= MODE_QPSK_FIRST && md <= MODE_QPSK_LAST) open_config(TAB_PSK); else if (md >= MODE_8PSK_FIRST && md <= MODE_8PSK_LAST) open_config(TAB_PSK); else if (md >= MODE_MT63_FIRST && md <= MODE_MT63_LAST) open_config(TAB_MT63); else if (md >= MODE_NAVTEX_FIRST && md <= MODE_NAVTEX_LAST) open_config(TAB_NAVTEX); else if (md >= MODE_WEFAX_FIRST && md <= MODE_WEFAX_LAST) open_config(TAB_WEFAX); else if (md >= MODE_HELL_FIRST && md <= MODE_HELL_LAST) open_config(TAB_FELDHELL); else if (md >= MODE_DOMINOEX_FIRST && md <= MODE_DOMINOEX_LAST) open_config(TAB_DOMINOEX); else if (md >= MODE_CONTESTIA_FIRST && md <= MODE_CONTESTIA_LAST) open_config(TAB_CONTESTIA); } else { if (!quick_change) return; const Fl_Menu_Item *m = quick_change->popup(Fl::event_x(), Fl::event_y()); if (m && m->callback()) m->do_callback(0); } static_cast(b)->clear(); restoreFocus(23); } void cbAFC(Fl_Widget *w, void *vi) { Fl_Button *b = (Fl_Button *)w; int v = b->value(); progStatus.afconoff = v; modeband.set_mode_afc(progStatus.afconoff); } void cbSQL(Fl_Widget *w, void *vi) { Fl_Button *b = (Fl_Button *)w; int v = b->value(); progStatus.sqlonoff = v ? true : false; modeband.set_mode_squelch_onoff( progStatus.sqlonoff ); } extern void set_wf_mode(void); void cbPwrSQL(Fl_Widget *w, void *vi) { Fl_Button *b = (Fl_Button *)w; int v = b->value(); if(!v) { sldrSquelch->value(progStatus.sldrSquelchValue); progStatus.kpsql_enabled = false; progdefaults.kpsql_enabled = false; b->clear(); } else { sldrSquelch->value(progStatus.sldrPwrSquelchValue); progStatus.kpsql_enabled = true; progdefaults.kpsql_enabled = true; set_wf_mode(); b->set(); } } void startMacroTimer() { ENSURE_THREAD(FLMAIN_TID); btnMacroTimer->color(fl_rgb_color(240, 240, 0)); btnMacroTimer->clear_output(); Fl::add_timeout(0.0, macro_timer); } void stopMacroTimer() { ENSURE_THREAD(FLMAIN_TID); progStatus.timer = 0; progStatus.repeatMacro = -1; local_timed_exec = false; Fl::remove_timeout(macro_timer); Fl::remove_timeout(macro_timed_execute); btnMacroTimer->label(0); btnMacroTimer->color(FL_BACKGROUND_COLOR); btnMacroTimer->set_output(); } void macro_timer(void*) { char buf[8]; snprintf(buf, sizeof(buf), "%d", progStatus.timer); btnMacroTimer->copy_label(buf); if (progStatus.timer-- == 0) { stopMacroTimer(); if (active_modem->get_mode() == MODE_IFKP) { ifkp_tx_text->clear(); } else { TransmitText->clear(); } macros.execute(progStatus.timerMacro); } else Fl::repeat_timeout(1.0, macro_timer); } static long mt_xdt, mt_xtm; // called by main loop...ok to write to widget void show_clock(bool yes) { if (!yes) { StatusBar->label(""); StatusBar->redraw(); return; } static char s_clk_time[40]; time_t sked_time = time(NULL); tm sked_tm; gmtime_r(&sked_time, &sked_tm); int hrs = sked_tm.tm_hour; int mins = sked_tm.tm_min; int secs = sked_tm.tm_sec; snprintf(s_clk_time, sizeof(s_clk_time), "%02d:%02d:%02d", hrs, mins, secs); StatusBar->label(s_clk_time); StatusBar->redraw(); } static int timed_ptt = -1; void macro_timed_execute(void *) { long dt, tm; dt = atol(local_timed_exec ? ldate() : zdate()); tm = atol(local_timed_exec ? ltime() : ztime()); if (dt >= mt_xdt && tm >= mt_xtm) { show_clock(false); if (timed_ptt != 1) { push2talk->set(true); timed_ptt = 1; } macros.timed_execute(); btnMacroTimer->label(0); btnMacroTimer->color(FL_BACKGROUND_COLOR); btnMacroTimer->set_output(); mt_xdt = mt_xtm = 0; } else { show_clock(true); if (timed_ptt != 0) { push2talk->set(false); timed_ptt = 0; } Fl::repeat_timeout(1.0, macro_timed_execute); } } void startTimedExecute(std::string &title) { ENSURE_THREAD(FLMAIN_TID); std::string txt = "Macro '"; txt.append(title). append("' scheduled on "). append(exec_date.substr(0,4)).append("/"). append(exec_date.substr(4,2)).append("/"). append(exec_date.substr(6,2)). append(" at "). append(exec_time.substr(0,2)).append(":"). append(exec_time.substr(2,2)).append(":"). append(exec_time.substr(4,2)). append(local_timed_exec ? " Local" : " Zulu"). append("\n"); btnMacroTimer->label("SKED"); btnMacroTimer->color(fl_rgb_color(240, 240, 0)); btnMacroTimer->redraw_label(); ReceiveText->clear(); ReceiveText->addstr(txt, FTextBase::CTRL); mt_xdt = atol(exec_date.c_str()); mt_xtm = atol(exec_time.c_str()); Fl::add_timeout(0.0, macro_timed_execute); } void cbMacroTimerButton(Fl_Widget*, void*) { stopMacroTimer(); restoreFocus(24); } void cb_mvsquelch(Fl_Widget *w, void *d) { progStatus.squelch_value = mvsquelch->value(); if (active_modem->get_mode() == MODE_CW) progStatus.VIEWER_cwsquelch = progStatus.squelch_value; else if (active_modem->get_mode() == MODE_RTTY) progStatus.VIEWER_rttysquelch = progStatus.squelch_value; else progStatus.VIEWER_psksquelch = progStatus.squelch_value; if (sldrViewerSquelch) sldrViewerSquelch->value(progStatus.squelch_value); } void cb_btnClearMViewer(Fl_Widget *w, void *d) { if (brwsViewer) brwsViewer->clear(); mainViewer->clear(); active_modem->clear_viewer(); } int default_handler(int event) { if (bWF_only) { if (Fl::event_key() == FL_Escape) return 1; return 0; } if (event != FL_SHORTCUT) return 0; if (RigViewerFrame && Fl::event_key() == FL_Escape && RigViewerFrame->visible() && Fl::event_inside(RigViewerFrame)) { CloseQsoView(); return 1; } Fl_Widget* w = Fl::focus(); int key = Fl::event_key(); if ((key == FL_F + 4) && Fl::event_alt()) clean_exit(true); if (fl_digi_main->contains(w)) { if (key == FL_Escape || (key >= FL_F && key <= FL_F_Last) || ((key == '1' || key == '2' || key == '3' || key == '4') && Fl::event_alt())) { TransmitText->take_focus(); TransmitText->handle(FL_KEYBOARD); return 1; } #ifdef __APPLE__ if ((key == '=') && (Fl::event_state() == FL_COMMAND)) #else if (key == '=' && Fl::event_alt()) #endif { progStatus.txlevel += 0.1; if (progStatus.txlevel > 0) progStatus.txlevel = 0; cntTxLevel->value(progStatus.txlevel); modeband.set_mode_txlevel(progStatus.txlevel); return 1; } #ifdef __APPLE__ if ((key == '-') && (Fl::event_state() == FL_COMMAND)) #else if (key == '-' && Fl::event_alt()) #endif { progStatus.txlevel -= 0.1; if (progStatus.txlevel < -30) progStatus.txlevel = -30; cntTxLevel->value(progStatus.txlevel); modeband.set_mode_txlevel(progStatus.txlevel); return 1; } } else if (dlgLogbook->contains(w)) return log_search_handler(event); else if (Fl::event_key() == FL_Escape) return 1; else if ( (fl_digi_main->contains(w) || dlgLogbook->contains(w)) && Fl::event_ctrl() ) return w->handle(FL_KEYBOARD); return 0; } int wo_default_handler(int event) { if (event != FL_SHORTCUT) return 0; if (RigViewerFrame && Fl::event_key() == FL_Escape && RigViewerFrame->visible() && Fl::event_inside(RigViewerFrame)) { CloseQsoView(); return 1; } Fl_Widget* w = Fl::focus(); int key = Fl::event_key(); if ((key == FL_F + 4) && Fl::event_alt()) clean_exit(true); if (fl_digi_main->contains(w)) { if (key == FL_Escape || (key >= FL_F && key <= FL_F_Last) || ((key == '1' || key == '2' || key == '3' || key == '4') && Fl::event_alt())) { return 1; } #ifdef __APPLE__ if ((key == '=') && (Fl::event_state() == FL_COMMAND)) #else if (key == '=' && Fl::event_alt()) #endif { progStatus.txlevel += 0.1; if (progStatus.txlevel > 0) progStatus.txlevel = 0; cntTxLevel->value(progStatus.txlevel); modeband.set_mode_txlevel(progStatus.txlevel); return 1; } #ifdef __APPLE__ if ((key == '-') && (Fl::event_state() == FL_COMMAND)) #else if (key == '-' && Fl::event_alt()) #endif { progStatus.txlevel -= 0.1; if (progStatus.txlevel < -30) progStatus.txlevel = -30; cntTxLevel->value(progStatus.txlevel); return 1; } } else if (Fl::event_ctrl()) return w->handle(FL_KEYBOARD); return 0; } void save_on_exit() { if (progdefaults.changed && progdefaults.SaveConfig) { switch (fl_choice2(_("Save changed configuration?"), NULL, _("Yes"), _("No"))) { case 1: progdefaults.saveDefaults(); default: break; } } if (macros.changed && progdefaults.SaveMacros) { switch (fl_choice2(_("Save changed macros?"), NULL, _("Yes"), _("No"))) { case 1: macros.writeMacroFile(); default: break; } } if (!oktoclear && progdefaults.NagMe) { switch (fl_choice2(_("Save log entry?"), NULL, _("Yes"), _("No"))) { case 1: qsoSave_cb(0, 0); default: break; } } return; } bool first_use = false; bool bEXITING = false; bool clean_exit(bool ask) { if (ask && first_use) { switch(fl_choice2(_("Confirm Quit"), NULL, _("Yes"), _("No"))) { case 2: return false; default: break; } progdefaults.saveDefaults(); macros.writeMacroFile(); if (!oktoclear) { switch (fl_choice2(_("Save log entry?"), NULL, _("Yes"), _("No"))) { case 1: qsoSave_cb(0, 0); default: break; } } } else { if (ask && progdefaults.confirmExit && (!(progdefaults.changed && progdefaults.SaveConfig) || !(macros.changed && progdefaults.SaveMacros) || !(!oktoclear && progdefaults.NagMe))) { switch (fl_choice2(_("Confirm quit?"), NULL, _("Yes"), _("No"))) { case 1: break; default: return false; } } if (ask) save_on_exit(); } bEXITING = true; if (Maillogfile) Maillogfile->log_to_file_stop(); if (logfile) logfile->log_to_file_stop(); saveFreqList(); progStatus.saveLastState();//(true); if (scopeview) scopeview->hide(); if (dlgViewer) dlgViewer->hide(); if (dlgLogbook) dlgLogbook->hide(); if (trx_state != STATE_RX) { LOG_INFO("Disable TUNE"); btnTune->labelcolor(FL_FOREGROUND_COLOR); Fl::flush(); push2talk->set(0); set_flrig_ptt(0); trx_receive(); MilliSleep(200); } LOG_INFO("Disable PTT"); delete push2talk; #if USE_HAMLIB LOG_INFO("Close hamlib"); hamlib_close(); #endif LOG_INFO("Close rigCAT"); rigCAT_close(); LOG_INFO("Close ADIF i/o"); ADIF_RW_close(); LOG_INFO("Close T/R processing"); trx_close(); #if USE_HAMLIB if (xcvr) delete xcvr; #endif LOG_INFO("Close logbook"); close_logbook(); MilliSleep(50); LOG_INFO("Send shutdown signal to flrig"); if (progdefaults.flrig_auto_shutdown) xmlrpc_shutdown_flrig(); LOG_INFO("Stop flrig i/o"); stop_flrig_thread(); LOG_INFO("Stop N3FJP logging"); n3fjp_close(); LOG_INFO("Stop FMT process"); FMT_thread_close(); LOG_INFO("Close WinKeyer i/o"); WK_exit(); LOG_INFO("Stop TOD clock"); TOD_close(); LOG_INFO("Delete audio_alert"); delete audio_alert; LOG_INFO("Exit_process"); exit_process(); if (field_day_viewer) if (field_day_viewer->visible()) field_day_viewer->hide(); if (dxcluster_viewer) if (dxcluster_viewer->visible()) dxcluster_viewer->hide(); save_counties(); return true; } bool first_check = true; void UI_check_swap() { int mv_x = text_panel->x(); int mv_y = text_panel->y(); int mv_w = mvgroup->w() > 1 ? mvgroup->w() : text_panel->w() / 2; int mv_h = text_panel->h(); int tx_y = 0, tx_h = 0, tx_x = 0, tx_w = 0; int rx_y = 0, rx_h = 0, rx_x = 0, rx_w = 0; if (progdefaults.rxtx_swap && (ReceiveText->y() <= TransmitText->y())) { tx_y = ReceiveText->y(); tx_h = first_check ? progStatus.tile_y : TransmitText->h(); tx_x = mv_x + mv_w; tx_w = text_panel->w() - mv_w; rx_y = tx_y + tx_h; rx_h = mv_h - tx_h; rx_x = tx_x; rx_w = tx_w; text_panel->remove(minbox); text_panel->remove(TransmitText); text_panel->remove(FHdisp); text_panel->remove(ReceiveText); text_panel->remove(mvgroup); mvgroup->resize(mv_x, mv_y, mv_w, mv_h); TransmitText->resize(tx_x, tx_y, tx_w, tx_h); ReceiveText->resize(rx_x, rx_y, rx_w, rx_h); FHdisp->resize(rx_x, rx_y, rx_w, rx_h); minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); text_panel->add(mvgroup); text_panel->add(TransmitText); text_panel->add(ReceiveText); text_panel->add(FHdisp); text_panel->add(minbox); text_panel->resizable(minbox); progStatus.tile_y = TransmitText->h(); progStatus.tile_y_ratio = 1.0 * TransmitText->h() / text_panel->h(); } else if (!progdefaults.rxtx_swap && ReceiveText->y() > TransmitText->y()) { rx_y = TransmitText->y(); rx_h = first_check ? progStatus.tile_y : ReceiveText->h(); rx_x = mv_x + mv_w; rx_w = text_panel->w() - mv_w; tx_y = rx_y + rx_h; tx_h = mv_h - rx_h; tx_x = rx_x; tx_w = rx_w; text_panel->remove(minbox); text_panel->remove(TransmitText); text_panel->remove(FHdisp); text_panel->remove(ReceiveText); text_panel->remove(mvgroup); mvgroup->resize(mv_x, mv_y, mv_w, mv_h); TransmitText->resize(tx_x, tx_y, tx_w, tx_h); ReceiveText->resize(rx_x, rx_y, rx_w, rx_h); FHdisp->resize(rx_x, rx_y, rx_w, rx_h); minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); text_panel->add(mvgroup); text_panel->add(ReceiveText); text_panel->add(FHdisp); text_panel->add(TransmitText); text_panel->add(minbox); text_panel->resizable(minbox); progStatus.tile_y = ReceiveText->h(); progStatus.tile_y_ratio = 1.0 * ReceiveText->h() / text_panel->h(); } // resize fsq UI int fsq_rx_h = text_panel->h() * progStatus.fsq_ratio; if (fsq_rx_h < minhtext) fsq_rx_h = minhtext; int fsq_tx_h = text_panel->h() - fsq_rx_h; if (fsq_tx_h < minhtext) { fsq_tx_h = minhtext; fsq_rx_h = text_panel->h() - fsq_tx_h; } fsq_left->remove(fsq_minbox); fsq_left->remove(fsq_rx_text); fsq_left->remove(fsq_tx_text); fsq_rx_text->resize(fsq_left->x(), fsq_left->y(), fsq_left->w(), fsq_rx_h); fsq_tx_text->resize(fsq_left->x(), fsq_left->y() + fsq_rx_text->h(), fsq_left->w(), fsq_tx_h); fsq_minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); fsq_left->add(fsq_rx_text); fsq_left->add(fsq_tx_text); fsq_left->add(fsq_minbox); fsq_left->resizable(fsq_minbox); // resize IFKP UI int ifkp_rx_h = text_panel->h() * progStatus.ifkp_ratio; if (ifkp_rx_h < minhtext) ifkp_rx_h = minhtext; int ifkp_tx_h = text_panel->h() - ifkp_rx_h; if (ifkp_tx_h < minhtext) { ifkp_tx_h = minhtext; ifkp_rx_h = text_panel->h() - ifkp_tx_h; } ifkp_left->remove(ifkp_minbox); ifkp_left->remove(ifkp_rx_text); ifkp_left->remove(ifkp_tx_text); ifkp_rx_text->resize( ifkp_left->x(), ifkp_left->y(), ifkp_left->w(), ifkp_rx_h); ifkp_tx_text->resize( ifkp_left->x(), ifkp_left->y() + ifkp_rx_text->h(), ifkp_left->w(), ifkp_tx_h); ifkp_minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); ifkp_left->add(ifkp_rx_text); ifkp_left->add(ifkp_tx_text); ifkp_left->add(ifkp_minbox); ifkp_left->resizable(ifkp_minbox); first_check = false; } static bool restore_minimize = false; void UI_select_central_frame(int y, int ht) { text_panel->resize(0, y, fl_digi_main->w(), ht); center_group->init_sizes(); } void resize_macroframe_1(int x, int y, int w, int h) { macroFrame1->resize(x, y, w, h); macroFrame1->init_sizes(); macroFrame1->redraw(); } void resize_macroframe_2(int x, int y, int w, int h) { macroFrame2->resize(x, y, w, h); macroFrame2->init_sizes(); macroFrame2->redraw(); } void UI_position_macros(int x, int y1, int w, int HTh) { int mh = progdefaults.macro_height; if (progdefaults.display_48macros) { macroFrame2->hide(); macroFrame1->hide(); if (!progdefaults.four_bar_position) { tbar->resize(x, y1, w, 4 * TB_HEIGHT); tbar->show(); y1 += tbar->h(); HTh -= tbar->h(); center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); } else { int htbar = 4 * TB_HEIGHT; HTh -= htbar; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; tbar->resize(x, y1, w, htbar); tbar->show(); y1 += htbar; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); } fl_digi_main->init_sizes(); return; } tbar->hide(); switch (progdefaults.mbar_scheme) { // 0, 1, 2 one bar schema case 0: resize_macroframe_2(x,y1,w,mh); macroFrame2->hide(); btnAltMacros2->deactivate(); resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->activate(); y1 += mh; HTh -= mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; default: case 1: resize_macroframe_2(x,y1,w,mh); macroFrame2->hide(); btnAltMacros2->deactivate(); HTh -= mh; center_group->resize(x, y1, w, HTh); // text_panel->resize(x, y1, w, HTh); // wefax_group->resize(x, y1, w, HTh); // fsq_group->resize(x, y1, w, HTh); // ifkp_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->activate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 2: resize_macroframe_2(x,y1,w,mh); macroFrame2->hide(); btnAltMacros2->deactivate(); HTh -= mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->activate(); y1 += mh; status_group->position(x, y1); break; case 3: resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; HTh -= mh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; HTh -= mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 4: resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; HTh -= mh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; HTh -= mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 5: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 6: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); y1 += HTh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 7: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); y1 += mh; status_group->position(x, y1); break; case 8: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); y1 += HTh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; status_group->position(x, y1); break; case 9: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; status_group->position(x, y1); break; case 10: HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; wf_group->position(x, y1); y1 += wf_group->h(); resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; status_group->position(x, y1); break; case 11: resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; case 12: resize_macroframe_1(x, y1, w, mh); macroFrame1->show(); btnAltMacros1->deactivate(); y1 += mh; HTh -= 2*mh; center_group->resize(x, y1, w, HTh); text_panel->resize(x, y1, w, HTh); wefax_group->resize(x, y1, w, HTh); fsq_group->resize(x, y1, w, HTh); ifkp_group->resize(x, y1, w, HTh); fmt_group->resize(x, y1, w, HTh); UI_select_central_frame(y1, HTh); y1 += HTh; resize_macroframe_2(x, y1, w, mh); macroFrame2->show(); btnAltMacros2->activate(); y1 += mh; wf_group->position(x, y1); y1 += wf_group->h(); status_group->position(x, y1); break; } fl_digi_main->init_sizes(); return; } bool UI_first = true; void UI_select() { if (bWF_only) { int Y = cntTxLevel->y(); int psm_width = progdefaults.show_psm_btn ? bwSqlOnOff : 0; int X = rightof(Status2); int W = fl_digi_main->w() - X - bwTxLevel - Wwarn - bwAfcOnOff - bwSqlOnOff - psm_width; StatusBar->resize( X, Y, W, StatusBar->h()); VuMeter->resize( X, Y, W, VuMeter->h()); cntTxLevel->position(rightof(VuMeter), Y); WARNstatus->position(rightof(cntTxLevel), Y); btnAFC->position(rightof(WARNstatus), Y); btnSQL->position(rightof(btnAFC), Y); btnPSQL->resize(rightof(btnSQL), Y, psm_width, btnPSQL->h()); if (progdefaults.show_psm_btn) btnPSQL->show(); else btnPSQL->hide(); cntTxLevel->redraw(); WARNstatus->redraw(); btnAFC->redraw(); btnSQL->redraw(); btnPSQL->redraw(); StatusBar->redraw(); status_group->init_sizes(); status_group->redraw(); fl_digi_main->init_sizes(); fl_digi_main->redraw(); return; } int x = 0; int y1 = Hmenu; int w = fl_digi_main->w(); int HTh = fl_digi_main->h() - y1; if (cnt_macro_height) { cnt_macro_height->minimum(MACROBAR_MIN); cnt_macro_height->maximum(MACROBAR_MAX); cnt_macro_height->step(1); if (progdefaults.macro_height < MACROBAR_MIN) progdefaults.macro_height = MACROBAR_MIN; if (progdefaults.macro_height > MACROBAR_MAX) progdefaults.macro_height = MACROBAR_MAX; cnt_macro_height->value(progdefaults.macro_height); } HTh -= wf_group->h(); HTh -= status_group->h(); if (progStatus.NO_RIGLOG && !restore_minimize) { TopFrame1->hide(); TopFrame2->hide(); TopFrame3->hide(); Status2->hide(); inpCall4->show(); inpCall = inpCall4; UI_position_macros(x, y1, w, HTh); goto UI_return; } if (!progStatus.Rig_Log_UI || restore_minimize) { TopFrame1->resize( x, y1, w, Hqsoframe ); y1 += (TopFrame1->h()); HTh -= (TopFrame1->h()); UI_position_macros(x, y1, w, HTh); TopFrame2->hide(); TopFrame3->hide(); TopFrame1->show(); inpFreq = inpFreq1; inpCall = inpCall1; inpTimeOn = inpTimeOn1; inpTimeOff = inpTimeOff1; inpName = inpName1; inpRstIn = inpRstIn1; inpRstOut = inpRstOut1; inpSerNo = inpSerNo1; outSerNo = outSerNo1; inpXchgIn = inpXchgIn1; inpState = inpState1; inpLoc = inpLoc1; inpQTH = inpQth; inp_JOTA_scout = inp_JOTA_scout1; inp_JOTA_troop = inp_JOTA_troop1; cboCountry = cboCountryQSO; gGEN_QSO_1->hide(); gGEN_CONTEST->hide(); gCQWW_RTTY->hide(); gCQWW_DX->hide(); gFD->hide(); gCWSS->hide(); gKD_1->hide(); gARR->hide(); g1010->hide(); gVHF->hide(); gASCR->hide(); gNAQP->hide(); gARRL_RTTY->hide(); gIARI->hide(); gNAS->hide(); gAIDX->hide(); gJOTA->hide(); gAICW->hide(); gSQSO->hide(); gCQWPX->hide(); gWAE->hide(); switch (progdefaults.logging) { case LOG_FD: inpClass = inp_FD_class1; inpSection = inp_FD_section1; gFD->show(); break; case LOG_WFD: inpClass = inp_FD_class1; inpSection = inp_FD_section1; gFD->show(); break; case LOG_KD: inp_KD_age = inp_KD_age1; inpState = inp_KD_state1; inpVEprov = inp_KD_VEprov1; inpXchgIn = inp_KD_XchgIn1; gKD_1->show(); break; case LOG_ARR: inpCall = inpCall1; inpName = inpName; inp_ARR_check = inp_ARR_check1; inpXchgIn = inp_ARR_XchgIn1; gARR->show(); break; case LOG_1010: inp_1010_nr = inp_1010_nr1; inpXchgIn = inp_1010_XchgIn1; g1010->show(); break; case LOG_VHF: inpRstIn = inp_vhf_RSTin1; inpRstOut = inp_vhf_RSTout1; inpLoc = inp_vhf_Loc1; inp_vhf_Loc1->show(); inp_vhf_RSTin1->show(); inp_vhf_RSTout1->show(); gVHF->show(); break; case LOG_CQ_WPX: inpSerNo = inpSerNo_WPX1; outSerNo = outSerNo_WPX1; inpSerNo_WPX1->show(); outSerNo_WPX1->show(); gCQWPX->show(); break; case LOG_CQWW_DX: cboCountry = cboCountryQSO; inp_CQzone = inp_CQDXzone1; inp_CQDXzone1->show(); gCQWW_DX->show(); break; case LOG_CQWW_RTTY: inpState = inp_CQstate = inp_CQstate1; cboCountry = cboCountryQSO; inp_CQzone = inp_CQzone1; gCQWW_RTTY->show(); break; case LOG_CWSS: outSerNo = outSerNo3; inpSerNo = inp_SS_SerialNoR1; inp_SS_SerialNoR = inp_SS_SerialNoR1; inp_SS_Check = inp_SS_Check1; inp_SS_Precedence = inp_SS_Precedence1; inp_SS_Section = inp_SS_Section1; gCWSS->show(); break; case LOG_ASCR: inpClass = inp_ASCR_class1; inpXchgIn = inp_ASCR_XchgIn1; inp_ASCR_class1->show(); inp_ASCR_XchgIn1->show(); gASCR->show(); break; case LOG_IARI: inpXchgIn = inp_IARI_PR1; cboCountry = cboCountryQSO; inp_IARI_PR1->show(); gIARI->show(); break; case LOG_NAQP: inpSPCnum = inpSPCnum_NAQP1; inpSPCnum_NAQP1->show(); gNAQP->show(); break; case LOG_RTTY: inpState = inpRTU_stpr1; inpSerNo = inpRTU_serno1; cboCountry = cboCountryQSO; gARRL_RTTY->show(); break; case LOG_NAS: inpSerNo = inp_ser_NAS1; inpXchgIn = inpSPCnum_NAS1; outSerNo5->show(); inp_ser_NAS1->show(); inpSPCnum_NAS1->show(); gNAS->show(); break; case LOG_AIDX: outSerNo = outSerNo7; inpSerNo = inpSerNo3; cboCountry = cboCountryAIDX = cboCountryQSO; outSerNo7->show(); inpSerNo3->show(); gAIDX->show(); break; case LOG_JOTA: inp_JOTA_scout = inp_JOTA_scout1; inp_JOTA_troop = inp_JOTA_troop1; inpXchgIn = inp_JOTA_spc1; inp_JOTA_scout1->show(); inp_JOTA_spc1->show(); inp_JOTA_troop1->show(); gJOTA->show(); break; case LOG_AICW: inpSPCnum = inpSPCnum_AICW1; cboCountry = cboCountryQSO;//cboCountryAICW1; inpSPCnum_AICW1->show(); gAICW->show(); break; case LOG_SQSO: inpRstIn = inpRstIn1; inpRstOut = inpRstOut1; inpCounty = inpSQSO_county1; inpSQSO_county1->show(); outSerNo = outSQSO_serno1; outSQSO_serno1->show(); inpSerNo = inpSQSO_serno1; inpSQSO_serno1->show(); inpState = inpSQSO_state1; inpSQSO_state1->show(); if (progdefaults.SQSOlogcat) { inpSQSO_category1->show(); inpSQSO_category = inpSQSO_category1; } else { inpSQSO_category1->hide(); } gSQSO->show(); break; // case LOG_WAE: // inpSerNo = inpSerNo_WAE1; // inpSerNo_WAE1->show(); // outSerNo = outSerNo_WAE1; // outSerNo_WAE1->show(); // cboCountry = cboCountryWAE1; // cboCountryWAE1->show(); // gWAE->show(); // break; case LOG_BART: case LOG_GENERIC: gGEN_CONTEST->show(); break; default: // no contest gGEN_QSO_1->show(); } gGEN_QSO_1->redraw(); gGEN_CONTEST->redraw(); gCQWW_RTTY->redraw(); gCQWW_DX->redraw(); gFD->redraw(); gCWSS->redraw(); gKD_1->redraw(); gARR->redraw(); g1010->redraw(); gVHF->redraw(); gIARI->redraw(); gAICW->redraw(); gSQSO->redraw(); gCQWPX->redraw(); gWAE->redraw(); qsoFreqDisp = qsoFreqDisp1; TopFrame1->init_sizes(); goto UI_return; } else { if (progdefaults.logging == LOG_QSO) { // no contest TopFrame2->resize( x, y1, w, Hentry + 2 * pad); y1 += TopFrame2->h(); HTh -= TopFrame2->h(); UI_position_macros(x, y1, w, HTh); TopFrame1->hide(); TopFrame3->hide(); TopFrame2->show(); inpCall = inpCall2; inpTimeOn = inpTimeOn2; inpTimeOff = inpTimeOff2; inpName = inpName2; inpSerNo = inpSerNo1; outSerNo = outSerNo1; inpRstIn = inpRstIn2; inpRstOut = inpRstOut2; inpState = inpState1; inpLoc = inpLoc1; inpQTH = inpQth; qsoFreqDisp = qsoFreqDisp2; inpCall4->hide(); Status2->show(); goto UI_return; } TopFrame3->resize( x, y1, w, Hentry + 2 * pad); y1 += TopFrame3->h(); HTh -= TopFrame3->h(); UI_position_macros(x, y1, w, HTh); TopFrame1->hide(); TopFrame2->hide(); TopFrame3->show(); inpCall = inpCall3; inpTimeOn = inpTimeOn3; inpTimeOff = inpTimeOff3; inpSerNo = inpSerNo2; outSerNo = outSerNo2; inpXchgIn = inpXchgIn2; // inpSQSO_category2->hide(); log_generic_frame->hide(); log_fd_frame->hide(); log_kd_frame->hide(); log_1010_frame->hide(); log_arr_frame->hide(); log_vhf_frame->hide(); log_cqww_frame->hide(); log_cqww_rtty_frame->hide(); log_cqss_frame->hide(); log_cqwpx_frame->hide(); log_ascr_frame->hide(); log_naqp_frame->hide(); log_rtty_frame->hide(); log_iari_frame->hide(); log_nas_frame->hide(); log_aidx_frame->hide(); log_jota_frame->hide(); log_aicw_frame->hide(); log_sqso_frame->hide(); log_wae_frame->hide(); switch (progdefaults.logging) { case LOG_QSO: log_generic_frame->show(); break; case LOG_FD: log_fd_frame->show(); inpClass = inp_FD_class2; inpSection = inp_FD_section2; break; case LOG_WFD: log_fd_frame->show(); inpClass = inp_FD_class2; inpSection = inp_FD_section2; break; case LOG_KD: log_kd_frame->show(); inpName = inp_KD_name2; inp_KD_age = inp_KD_age2; inpState = inp_KD_state2; inpVEprov = inp_KD_VEprov2; inpXchgIn = inp_KD_XchgIn2; break; case LOG_ARR: log_arr_frame->show(); inpCall = inpCall3; inpName = inp_ARR_Name2; inp_ARR_check = inp_ARR_check2; inpXchgIn = inp_ARR_XchgIn2; break; case LOG_1010: log_1010_frame->show(); inpName = inp_1010_name2; inp_1010_nr = inp_1010_nr1; inpXchgIn = inp_1010_XchgIn2; break; case LOG_VHF: log_vhf_frame->show(); inpRstIn = inp_vhf_RSTin2; inpRstOut = inp_vhf_RSTout2; inpLoc = inp_vhf_Loc2; break; case LOG_CQWW_DX: log_cqww_frame->show(); inpRstIn = inp_CQDX_RSTin2; inpRstOut = inp_CQDX_RSTout2; inp_CQzone = inp_CQDXzone2; cboCountry = cboCountryCQDX2; break; case LOG_CQWW_RTTY: log_cqww_rtty_frame->show(); inpRstIn = inp_CQ_RSTin2; inpRstOut = inp_CQ_RSTout2; inpState = inp_CQstate = inp_CQstate2; inp_CQzone = inp_CQzone2; cboCountry = cboCountryCQ2; break; case LOG_CWSS: log_cqss_frame->show(); outSerNo = outSerNo4; inpSerNo = inp_SS_SerialNoR2; inpTimeOff = inpTimeOff3; inpTimeOn = inpTimeOn3; inp_SS_Check = inp_SS_Check2; inp_SS_Precedence = inp_SS_Precedence2; inp_SS_Section = inp_SS_Section2; inp_SS_SerialNoR = inp_SS_SerialNoR2; break; case LOG_ASCR: log_ascr_frame->show(); inpName = inp_ASCR_name2; inpRstIn = inp_ASCR_RSTin2; inpRstOut = inp_ASCR_RSTout2; inpClass = inp_ASCR_class2; inpXchgIn = inp_ASCR_XchgIn2; break; case LOG_IARI: log_iari_frame->show(); inpRstIn = inp_IARI_RSTin2; inpRstOut = inp_IARI_RSTout2; inpSerNo = inp_IARI_SerNo2; outSerNo = out_IARI_SerNo2; inpXchgIn = inp_IARI_PR2; cboCountry = cboCountryIARI2; break; case LOG_NAQP: log_naqp_frame->show(); inpName = inpNAQPname2; inpSPCnum = inpSPCnum_NAQP2; break; case LOG_RTTY: log_rtty_frame->show(); inpState = inpRTU_stpr2; inpRstIn = inpRTU_RSTin2; inpRstOut = inpRTU_RSTout2; inpSerNo = inpRTU_serno2; cboCountry = cboCountryRTU2; break; case LOG_AIDX: log_aidx_frame->show(); inpRstIn = inpRstIn3; inpRstOut = inpRstOut3; outSerNo = outSerNo8; inpSerNo = inpSerNo4; cboCountry = cboCountryAIDX = cboCountryAIDX2; break; case LOG_JOTA: log_jota_frame->show(); inpRstIn = inpRstIn4; inpRstOut = inpRstOut4; inp_JOTA_scout = inp_JOTA_scout2; inp_JOTA_troop = inp_JOTA_troop2; inpXchgIn = inp_JOTA_spc2; break; case LOG_AICW: log_aicw_frame->show(); inpRstIn = inpRstIn_AICW2; inpRstOut = inpRstOut_AICW2; cboCountry = cboCountryAICW2; inpSPCnum = inpSPCnum_AICW2; break; case LOG_SQSO: inpSQSO_category2->hide(); inpSQSO_name2->hide(); inpSQSO_serno2->hide(); inpRstOut_SQSO2->hide(); inpRstIn_SQSO2->hide(); inpState = inpSQSO_state2; inpSQSO_state2->show(); inpCounty = inpSQSO_county2; inpSQSO_county2->show(); if (progdefaults.SQSOlogcat) { inpSQSO_category2->show(); inpSQSO_category2->redraw(); inpSQSO_category = inpSQSO_category2; } if (progdefaults.SQSOlogrst) { inpRstIn = inpRstIn_SQSO2; inpRstIn_SQSO2->show(); inpRstOut = inpRstOut_SQSO2; inpRstOut_SQSO2->show(); } if (progdefaults.SQSOlogserno) { inpSerNo = inpSQSO_serno2; inpSQSO_serno2->show(); outSerNo = outSQSO_serno2; outSQSO_serno2->show(); } if (progdefaults.SQSOlogname) { inpName = inpSQSO_name2; inpSQSO_name2->show(); } inpSQSO_category2->redraw(); inpSQSO_name2->redraw(); inpSQSO_serno2->redraw(); inpRstOut_SQSO2->redraw(); inpRstIn_SQSO2->redraw(); inpSQSO_state2->redraw(); inpSQSO_county2->redraw(); log_sqso_frame->show(); break; case LOG_NAS: inpSerNo = inp_ser_NAS2; inpXchgIn = inpSPCnum_NAS2; inpName = inp_name_NAS2; log_nas_frame->show(); break; case LOG_CQ_WPX: log_cqwpx_frame->show(); inpSerNo = inpSerNo_WPX2; outSerNo = outSerNo_WPX2; inpRstIn = inpRstIn_WPX2; inpRstOut = inpRstOut_WPX2; break; // case LOG_WAE: // log_wae_frame->show(); // inpSerNo = inpSerNo_WAE2; // outSerNo = outSerNo_WAE2; // inpRstIn = inpRstIn_WAE2; // inpRstOut = inpRstOut_WAE2; // cboCountry = cboCountryWAE2; // break; case LOG_BART: case LOG_GENERIC: default: log_generic_frame->show(); inpTimeOn = inpTimeOn3; inpTimeOff = inpTimeOff3; inpSerNo = inpSerNo2; inpXchgIn = inpXchgIn2; break; } qsoFreqDisp = qsoFreqDisp3; TopFrame3->redraw(); inpCall4->hide(); Status2->show(); goto UI_return; } UI_return: UI_check_swap(); if (UI_first) { UI_first = false; } else { int orgx = text_panel->orgx(); int orgy = text_panel->orgy(); int nux = text_panel->x() + progStatus.tile_x; int nuy = text_panel->y() + progStatus.tile_y_ratio * text_panel->h(); text_panel->position(orgx, orgy, nux, nuy); } { int Y = status_group->y(); int psm_width = progdefaults.show_psm_btn ? bwSqlOnOff : 0; int vuw = fl_digi_main->w() - Status2->x() - Status2->w() - 2 - bwTxLevel - // tx level control Wwarn - // Warn indicator bwAfcOnOff - // afc button bwSqlOnOff - // sql button psm_width - // psm button, bwSqlOnOff / 0 corner_box->w(); StatusBar->resize( Status2->x() + Status2->w() + 2, Y, vuw, StatusBar->h()); VuMeter->resize( Status2->x() + Status2->w() + 2, Y, vuw, VuMeter->h()); cntTxLevel->position(rightof(VuMeter), Y); WARNstatus->position(rightof(cntTxLevel), Y); btnAFC->position(rightof(WARNstatus), Y); btnSQL->position(rightof(btnAFC), Y); btnPSQL->resize(rightof(btnSQL), Y, psm_width, btnPSQL->h()); if (progdefaults.show_psm_btn) btnPSQL->show(); else btnPSQL->hide(); status_group->init_sizes(); status_group->redraw(); } RigControlFrame->init_sizes(); RigControlFrame->redraw(); smeter->redraw(); pwrmeter->redraw(); center_group->redraw(); text_panel->redraw(); wefax_group->redraw(); fsq_group->redraw(); ifkp_group->redraw(); fmt_group->redraw(); macroFrame1->redraw(); macroFrame2->redraw(); viewer_redraw(); fl_digi_main->init_sizes(); update_main_title(); LOGBOOK_colors_font(); fl_digi_main->redraw(); Fl::flush(); } void cb_mnu_wf_all(Fl_Menu_* w, void *d) { wf->UI_select(progStatus.WF_UI = w->mvalue()->value()); } void cb_mnu_riglog_all(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.Rig_Log_UI = false; progStatus.NO_RIGLOG = false; UI_select(); } void cb_mnu_riglog_partial(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.Rig_Log_UI = true; progStatus.NO_RIGLOG = false; UI_select(); } void cb_mnu_riglog_none(Fl_Menu_* w, void *d) { getMenuItem(w->mvalue()->label())->setonly(); progStatus.NO_RIGLOG = true; progStatus.Rig_Log_UI = false; UI_select(); } void cb_mnuDockedscope(Fl_Menu_ *w, void *d) { wf->show_scope(progStatus.DOCKEDSCOPE = w->mvalue()->value()); } void WF_UI() { wf->UI_select(progStatus.WF_UI); } void toggle_smeter() { if (progStatus.meters && !smeter->visible()) { pwrmeter->hide(); smeter->show(); qso_combos->hide(); } else if (!progStatus.meters && smeter->visible()) { pwrmeter->hide(); smeter->hide(); qso_combos->show(); } RigControlFrame->redraw(); } void cb_toggle_smeter(Fl_Widget *w, void *v) { progStatus.meters = !progStatus.meters; toggle_smeter(); } extern void cb_scripts(bool); void cb_menu_scripts(Fl_Widget*, void*) { cb_scripts(false); } extern void cb_create_default_script(void); void cb_menu_make_default_scripts(Fl_Widget*, void*) { cb_create_default_script(); } void cb_48macros(Fl_Widget*, void*) { progdefaults.display_48macros = !progdefaults.display_48macros; UI_select(); } static void cb_opmode_show(Fl_Widget* w, void*); Fl_Menu_Item menu_[] = { {_("&File"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Folders")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Fldigi config..."), folder_open_icon), 0, cb_ShowConfig, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("FLMSG files..."), folder_open_icon), 0, cb_ShowFLMSG, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("NBEMS files..."), folder_open_icon), 0, cb_ShowNBEMS, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("WEFAX images..."), folder_open_icon), 0, cb_ShowWEFAX_images, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Data files..."), folder_open_icon), 0, cb_ShowDATA, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Macros")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Open ..."), file_open_icon), 0, (Fl_Callback*)cb_mnuOpenMacro, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Save ..."), save_as_icon), 0, (Fl_Callback*)cb_mnuSaveMacro, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Config Scripts")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { _("Execute"), 0, (Fl_Callback*)cb_menu_scripts, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Generate"), 0, (Fl_Callback*)cb_menu_make_default_scripts, 0, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { 0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Text Capture")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { LOG_TO_FILE_MLABEL, 0, cb_logfile, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Audio")), 0, 0, 0, FL_MENU_DIVIDER | FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, {_("RX capture"), 0, (Fl_Callback*)cb_mnuCapture, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {_("TX generate"), 0, (Fl_Callback*)cb_mnuGenerate, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {_("Playback"), 0, (Fl_Callback*)cb_mnuPlayback, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Exit"), log_out_icon), 'x', (Fl_Callback*)cb_E, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { OPMODES_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CW].name, 0, cb_init_mode, (void *)MODE_CW, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"Contestia", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_32_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_32_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_contestiaCustom, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"DominoEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEXMICRO].name, 0, cb_init_mode, (void *)MODE_DOMINOEXMICRO, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX8].name, 0, cb_init_mode, (void *)MODE_DOMINOEX8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX16].name, 0, cb_init_mode, (void *)MODE_DOMINOEX16, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX44].name, 0, cb_init_mode, (void *)MODE_DOMINOEX44, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX88].name, 0, cb_init_mode, (void *)MODE_DOMINOEX88, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { "FSQ", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-6", 0, cb_fsq6, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-4.5", 0, cb_fsq4p5, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-3", 0, cb_fsq3, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-2", 0, cb_fsq2, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "FSQ-1.5", 0, cb_fsq1p5, (void *)MODE_FSQ, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Hell", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FELDHELL].name, 0, cb_init_mode, (void *)MODE_FELDHELL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SLOWHELL].name, 0, cb_init_mode, (void *)MODE_SLOWHELL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_HELLX5].name, 0, cb_init_mode, (void *)MODE_HELLX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_HELLX9].name, 0, cb_init_mode, (void *)MODE_HELLX9, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FSKH245].name, 0, cb_init_mode, (void *)MODE_FSKH245, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FSKH105].name, 0, cb_init_mode, (void *)MODE_FSKH105, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_HELL80].name, 0, cb_init_mode, (void *)MODE_HELL80, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { "IFKP", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "IFKP 0.5", 0, cb_ifkp0p5, (void *)MODE_IFKP, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "IFKP 1.0", 0, cb_ifkp1p0, (void *)MODE_IFKP, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "IFKP 2.0", 0, cb_ifkp2p0, (void *)MODE_IFKP, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MFSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128].name, 0, cb_init_mode, (void *)MODE_MFSK128, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64L].name, 0, cb_init_mode, (void *)MODE_MFSK64L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128L].name, 0, cb_init_mode, (void *)MODE_MFSK128L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MT63", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500S].name, 0, cb_init_mode, (void *)MODE_MT63_500S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500L].name, 0, cb_init_mode, (void *)MODE_MT63_500L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000S].name, 0, cb_init_mode, (void *)MODE_MT63_1000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000L].name, 0, cb_init_mode, (void *)MODE_MT63_1000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000S].name, 0, cb_init_mode, (void *)MODE_MT63_2000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000L].name, 0, cb_init_mode, (void *)MODE_MT63_2000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"OFDM", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OFDM_500F].name, 0, cb_init_mode, (void *)MODE_OFDM_500F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OFDM_750F].name, 0, cb_init_mode, (void *)MODE_OFDM_750F, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, //{ mode_info[MODE_OFDM_2000F].name, 0, cb_init_mode, (void *)MODE_OFDM_2000F, 0, FL_NORMAL_LABEL, 0, 14, 0}, //{ mode_info[MODE_OFDM_2000].name, 0, cb_init_mode, (void *)MODE_OFDM_2000, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OFDM_3500].name, 0, cb_init_mode, (void *)MODE_OFDM_3500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { OLIVIA_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_oliviaCustom, (void *)MODE_OLIVIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK31].name, 0, cb_init_mode, (void *)MODE_PSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63].name, 0, cb_init_mode, (void *)MODE_PSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63F].name, 0, cb_init_mode, (void *)MODE_PSK63F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500].name, 0, cb_init_mode, (void *)MODE_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK1000].name, 0, cb_init_mode, (void *)MODE_PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"MultiCarrier", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_12X_PSK125].name, 0, cb_init_mode, (void *)MODE_12X_PSK125, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_6X_PSK250].name, 0, cb_init_mode, (void *)MODE_6X_PSK250, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK500].name, 0, cb_init_mode, (void *)MODE_2X_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK500].name, 0, cb_init_mode, (void *)MODE_4X_PSK500, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK800].name, 0, cb_init_mode, (void *)MODE_2X_PSK800, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK1000].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {"QPSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK500].name, 0, cb_init_mode, (void *)MODE_QPSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"8PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125].name, 0, cb_init_mode, (void *)MODE_8PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250].name, 0, cb_init_mode, (void *)MODE_8PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500].name, 0, cb_init_mode, (void *)MODE_8PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000].name, 0, cb_init_mode, (void *)MODE_8PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125FL].name, 0, cb_init_mode, (void *)MODE_8PSK125FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125F].name, 0, cb_init_mode, (void *)MODE_8PSK125F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250FL].name, 0, cb_init_mode, (void *)MODE_8PSK250FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250F].name, 0, cb_init_mode, (void *)MODE_8PSK250F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500F].name, 0, cb_init_mode, (void *)MODE_8PSK500F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000F].name, 0, cb_init_mode, (void *)MODE_8PSK1000F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1200F].name, 0, cb_init_mode, (void *)MODE_8PSK1200F, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSKR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125R].name, 0, cb_init_mode, (void *)MODE_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250R].name, 0, cb_init_mode, (void *)MODE_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500R].name, 0, cb_init_mode, (void *)MODE_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK1000R].name, 0, cb_init_mode, (void *)MODE_PSK1000R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"MultiCarrier", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK63R].name, 0, cb_init_mode, (void *)MODE_4X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK63R].name, 0, cb_init_mode, (void *)MODE_5X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_10X_PSK63R].name, 0, cb_init_mode, (void *)MODE_10X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_20X_PSK63R].name, 0, cb_init_mode, (void *)MODE_20X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_32X_PSK63R].name, 0, cb_init_mode, (void *)MODE_32X_PSK63R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK125R].name, 0, cb_init_mode, (void *)MODE_4X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK125R].name, 0, cb_init_mode, (void *)MODE_5X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_10X_PSK125R].name, 0, cb_init_mode, (void *)MODE_10X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_12X_PSK125R].name, 0, cb_init_mode, (void *)MODE_12X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_16X_PSK125R].name, 0, cb_init_mode, (void *)MODE_16X_PSK125R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK250R].name, 0, cb_init_mode, (void *)MODE_2X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_3X_PSK250R].name, 0, cb_init_mode, (void *)MODE_3X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK250R].name, 0, cb_init_mode, (void *)MODE_5X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_6X_PSK250R].name, 0, cb_init_mode, (void *)MODE_6X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_7X_PSK250R].name, 0, cb_init_mode, (void *)MODE_7X_PSK250R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK500R].name, 0, cb_init_mode, (void *)MODE_2X_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_3X_PSK500R].name, 0, cb_init_mode, (void *)MODE_3X_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK500R].name, 0, cb_init_mode, (void *)MODE_4X_PSK500R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK800R].name, 0, cb_init_mode, (void *)MODE_2X_PSK800R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK1000R].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { RTTY_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-45", 0, cb_rtty45, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-50", 0, cb_rtty50, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75N", 0, cb_rtty75N, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75W", 0, cb_rtty75W, (void *)MODE_RTTY, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_rttyCustom, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"THOR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THORMICRO].name, 0, cb_init_mode, (void *)MODE_THORMICRO, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR32].name, 0, cb_init_mode, (void *)MODE_THOR32, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR44].name, 0, cb_init_mode, (void *)MODE_THOR44, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR56].name, 0, cb_init_mode, (void *)MODE_THOR56, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR25x4].name, 0, cb_init_mode, (void *)MODE_THOR25x4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR50x1].name, 0, cb_init_mode, (void *)MODE_THOR50x1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR50x2].name, 0, cb_init_mode, (void *)MODE_THOR50x2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR100].name, 0, cb_init_mode, (void *)MODE_THOR100, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Throb", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB4].name, 0, cb_init_mode, (void *)MODE_THROB4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX1].name, 0, cb_init_mode, (void *)MODE_THROBX1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX2].name, 0, cb_init_mode, (void *)MODE_THROBX2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, //{ "Packet", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, //{ " 300 baud", 0, cb_pkt300, (void *)MODE_PACKET, 0, FL_NORMAL_LABEL, 0, 14, 0}, //{ "1200 baud", 0, cb_pkt1200, (void *)MODE_PACKET, 0, FL_NORMAL_LABEL, 0, 14, 0}, //{ "2400 baud", 0, cb_pkt2400, (void *)MODE_PACKET, 0, FL_NORMAL_LABEL, 0, 14, 0}, //{0,0,0,0,0,0,0,0,0}, {"WEFAX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_WEFAX_576].name, 0, cb_init_mode, (void *)MODE_WEFAX_576, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_WEFAX_288].name, 0, cb_init_mode, (void *)MODE_WEFAX_288, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Navtex/SitorB", 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NAVTEX].name, 0, cb_init_mode, (void *)MODE_NAVTEX, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SITORB].name, 0, cb_init_mode, (void *)MODE_SITORB, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { mode_info[MODE_WWV].name, 0, cb_init_mode, (void *)MODE_WWV, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_ANALYSIS].name, 0, cb_init_mode, (void *)MODE_ANALYSIS, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_FMT].name, 0, cb_init_mode, (void *)MODE_FMT, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NULL].name, 0, cb_init_mode, (void *)MODE_NULL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SSB].name, 0, cb_init_mode, (void *)MODE_SSB, 0, FL_NORMAL_LABEL, 0, 14, 0}, { OPMODES_FEWER, 0, cb_opmode_show, 0, FL_MENU_INVISIBLE, FL_NORMAL_LABEL, FL_HELVETICA_ITALIC, 14, 0 }, {0,0,0,0,0,0,0,0,0}, {_("&Configure"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Config Dialog")), 0, (Fl_Callback*)cb_mnu_config_dialog, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Save Config"), save_icon), 0, (Fl_Callback*)cb_mnuSaveConfig, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Notifications")), 0, (Fl_Callback*)cb_mnuConfigNotify, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Test Signals")), 0, (Fl_Callback*)cb_mnuTestSignals, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { VIEW_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, #if USE_PORTAUDIO { icons::make_icon_label(_("Rx Audio Dialog")), 'a', (Fl_Callback*)cb_mnuRxAudioDialog, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, #endif { icons::make_icon_label(_("View/Hide Channels")), 'c', (Fl_Callback*)cb_view_hide_channels, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Signal browser")), 'b', (Fl_Callback*)cb_mnuViewer, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("View/Hide 48 macros")), 'm', (Fl_Callback*)cb_48macros, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("DX Cluster")), 'd', (Fl_Callback*)cb_dxc_viewer, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Floating scope"), utilities_system_monitor_icon), 'f', (Fl_Callback*)cb_mnuDigiscope, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Spectrum scope"), utilities_system_monitor_icon), 's', (Fl_Callback*)cb_mnuSpectrum, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(THOR_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuThorViewRaw,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(IFKP_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuIfkpViewRaw,0, FL_MENU_INACTIVE | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(WEFAX_TX_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(COUNTRIES_MLABEL), 0, (Fl_Callback*)cb_mnuShowCountries, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Rig/Log Controls")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { RIGLOG_FULL_MLABEL, 0, (Fl_Callback*)cb_mnu_riglog_all, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { RIGLOG_PARTIAL_MLABEL, 0, (Fl_Callback*)cb_mnu_riglog_partial, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, { RIGLOG_NONE_MLABEL, 0, (Fl_Callback*)cb_mnu_riglog_none, 0, FL_MENU_RADIO, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("Waterfall")), 0, 0, 0, FL_SUBMENU, _FL_MULTI_LABEL, 0, 14, 0}, { DOCKEDSCOPE_MLABEL, 0, (Fl_Callback*)cb_mnuDockedscope, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, { WF_MLABEL, 0, (Fl_Callback*)cb_mnu_wf_all, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { _("&Logbook"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("View")), 'l', (Fl_Callback*)cb_mnuShowLogbook, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Files")), 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Open...")), 0, (Fl_Callback*)cb_mnuOpenLogbook, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Save")), 0, (Fl_Callback*)cb_mnuSaveLogbook, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("New")), 0, (Fl_Callback*)cb_mnuNewLogbook, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("ADIF")), 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Merge...")), 0, (Fl_Callback*)cb_mnuMergeADIF_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Export...")), 0, (Fl_Callback*)cb_mnuExportADIF_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { icons::make_icon_label(_("LoTW")), 0, (Fl_Callback*)cb_mnuConfigLoTW, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Reports")), 0, 0, 0, FL_SUBMENU | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Text...")), 0, (Fl_Callback*)cb_mnuExportTEXT_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("CSV...")), 0, (Fl_Callback*)cb_mnuExportCSV_log, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Cabrillo...")), 0, (Fl_Callback*)cb_Export_Cabrillo, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { LOG_CONNECT_SERVER, 0, (Fl_Callback*)cb_log_server, 0, FL_MENU_TOGGLE | FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Field Day Logging")), 0, (Fl_Callback*)cb_fd_viewer, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {" ", 0, 0, 0, FL_MENU_INACTIVE, FL_NORMAL_LABEL, 0, 14, 0}, {_("&Help"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, #ifndef NDEBUG // settle the gmfsk vs fldigi argument once and for all { icons::make_icon_label(_("Create sunspots"), weather_clear_icon), 0, cb_mnuFun, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, #endif { icons::make_icon_label(_("Beginners' Guide"), start_here_icon), 0, cb_mnuBeginnersURL, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Online documentation..."), help_browser_icon), 0, cb_mnuOnLineDOCS, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Fldigi web site..."), net_icon), 0, cb_mnuVisitURL, (void *)PACKAGE_HOME, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Reception reports..."), pskr_icon), 0, cb_mnuVisitPSKRep, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Command line options"), utilities_terminal_icon), 0, cb_mnuCmdLineHelp, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Audio device info"), audio_card_icon), 0, cb_mnuAudioInfo, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Build info"), executable_icon), 0, cb_mnuBuildInfo, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Event log"), dialog_information_icon), 0, cb_mnuDebug, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Check for updates..."), system_software_update_icon), 0, cb_mnuCheckUpdate, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("&About"), help_about_icon), 'a', cb_mnuAboutURL, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {" ", 0, 0, 0, FL_MENU_INACTIVE, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, }; int main_menu_size = sizeof(menu_)/sizeof(menu_[0]); static int count_visible_items(Fl_Menu_Item* menu) { int n = 0; if (menu->flags & FL_SUBMENU) menu++; while (menu->label()) { if (!(menu->flags & FL_SUBMENU) && menu->visible()) n++; menu++; } return n; } static bool modes_hidden; static void cb_opmode_show(Fl_Widget* w, void*) { Fl_Menu_* m = (Fl_Menu_*)w; const char* label = m->mvalue()->label(); Fl_Menu_Item *item = 0, *first = 0, *last = 0; item = first = getMenuItem(OPMODES_MLABEL) + 1; if (!strcmp(label, OPMODES_ALL)) { last = getMenuItem(OPMODES_ALL); while (item != last) { if (item->label()) item->show(); item++; } menu_[m->value()].label(OPMODES_FEWER); modes_hidden = false; } else { last = getMenuItem(OPMODES_FEWER); while (item != last) { if (item->label() && item->callback() == cb_init_mode) { intptr_t mode = (intptr_t)item->user_data(); if (mode < NUM_MODES) { if (progdefaults.visible_modes.test(mode)) item->show(); else item->hide(); } } item++; } item = first; while (item != last) { if (item->flags & FL_SUBMENU) { if (count_visible_items(item)) item->show(); else item->hide(); } item++; } if (progdefaults.visible_modes.test(MODE_OLIVIA)) getMenuItem("Olivia")->show(); else getMenuItem("Olivia")->hide(); if (progdefaults.visible_modes.test(MODE_CONTESTIA)) getMenuItem("Contestia")->show(); else getMenuItem("Contestia")->hide(); if (progdefaults.visible_modes.test(MODE_RTTY)) getMenuItem("RTTY")->show(); else getMenuItem("RTTY")->hide(); if (progdefaults.visible_modes.test(MODE_IFKP)) getMenuItem("IFKP")->show(); else getMenuItem("IFKP")->hide(); if (progdefaults.visible_modes.test(MODE_FSQ)) getMenuItem("FSQ")->show(); else getMenuItem("FSQ")->hide(); menu_[m->value()].label(OPMODES_ALL); modes_hidden = true; } m->redraw(); } void toggle_visible_modes(Fl_Widget*, void*) { Fl_Menu_Item* show_modes = modes_hidden ? getMenuItem(OPMODES_ALL) : getMenuItem(OPMODES_FEWER); if (!(~progdefaults.visible_modes).none()) { // some modes disabled show_modes->label(OPMODES_FEWER); show_modes->show(); (show_modes - 1)->flags |= FL_MENU_DIVIDER; mnu->value(show_modes); show_modes->do_callback(mnu, (void*)0); } else { mnu->value(show_modes); show_modes->do_callback(mnu, (void*)0); show_modes->hide(); (show_modes - 1)->flags &= ~FL_MENU_DIVIDER; } } Fl_Menu_Item *getMenuItem(const char *caption, Fl_Menu_Item* submenu) { if (submenu == 0 || !(submenu->flags & FL_SUBMENU)) { if ( menu_->size() != sizeof(menu_)/sizeof(*menu_) ) { LOG_ERROR("FIXME: the menu_ table is corrupt!"); abort(); } submenu = menu_; } int size = submenu->size() - 1; Fl_Menu_Item *item = 0; const char* label; for (int i = 0; i < size; i++) { label = (submenu[i].labeltype() == _FL_MULTI_LABEL) ? icons::get_icon_label_text(&submenu[i]) : submenu[i].text; if (label && !strcmp(label, caption)) { item = submenu + i; break; } } if (!item) { LOG_ERROR("FIXME: could not find menu item \"%s\"", caption); abort(); } return item; } void activate_wefax_image_item(bool b) { /// Maybe do not do anything if the new modem has activated this menu item. /// This is necessary because of trx_start_modem_loop which deletes /// the current modem after the new one is created.. if( ( b == false ) && ( active_modem->get_cap() & modem::CAP_IMG ) && ( active_modem->get_mode() >= MODE_WEFAX_FIRST ) && ( active_modem->get_mode() <= MODE_WEFAX_LAST ) ) { return ; } Fl_Menu_Item *wefax_tx_item = getMenuItem(WEFAX_TX_IMAGE_MLABEL); if (wefax_tx_item) icons::set_active(wefax_tx_item, b); } void activate_menu_item(const char *caption, bool val) { Fl_Menu_Item *m = getMenuItem(caption); icons::set_active(m, val); } void activate_mfsk_image_item(bool b) { Fl_Menu_Item *mfsk_item = getMenuItem(MFSK_IMAGE_MLABEL); if (mfsk_item) icons::set_active(mfsk_item, b); } void activate_thor_image_item(bool b) { Fl_Menu_Item *menu_item = getMenuItem(THOR_IMAGE_MLABEL); if (menu_item) icons::set_active(menu_item, b); } void activate_ifkp_image_item(bool b) { Fl_Menu_Item *menu_item = getMenuItem(IFKP_IMAGE_MLABEL); if (menu_item) icons::set_active(menu_item, b); } inline int rightof(Fl_Widget* w) { return w->x() + w->w(); } inline int leftof(Fl_Widget* w) { unsigned int a = w->align(); if (a == FL_ALIGN_CENTER || a & FL_ALIGN_INSIDE) return w->x(); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); int lw = static_cast(ceil(fl_width(w->label()))); if (a & (FL_ALIGN_TOP | FL_ALIGN_BOTTOM)) { if (a & FL_ALIGN_LEFT) return w->x(); else if (a & FL_ALIGN_RIGHT) return w->x() - (lw > w->w() ? lw - w->w() : 0); else return w->x() - (lw > w->w() ? (lw - w->w())/2 : 0); } else { if (a & FL_ALIGN_LEFT) return w->x() - lw; else return w->x(); } } inline int above(Fl_Widget* w) { unsigned int a = w->align(); if (a == FL_ALIGN_CENTER || a & FL_ALIGN_INSIDE) return w->y(); return (a & FL_ALIGN_TOP) ? w->y() + FL_NORMAL_SIZE : w->y(); } inline int below(Fl_Widget* w) { unsigned int a = w->align(); if (a == FL_ALIGN_CENTER || a & FL_ALIGN_INSIDE) return w->y() + w->h(); return (a & FL_ALIGN_BOTTOM) ? w->y() + w->h() + FL_NORMAL_SIZE : w->y() + w->h(); } std::string argv_window_title; std::string main_window_title; std::string xcvr_title; void update_main_title() { std::string buf = argv_window_title; buf.append(" ver").append(PACKAGE_VERSION); if (!xcvr_title.empty()) { buf.append(" / ").append(xcvr_title); } buf.append(" - "); if (bWF_only) buf.append(_("waterfall-only mode")); else { buf.append(progdefaults.myCall.empty() ? _("NO CALLSIGN SET") : progdefaults.myCall.c_str()); if (progdefaults.logging > LOG_QSO && progdefaults.logging < LOG_SQSO) buf.append(" : ").append(contests[progdefaults.logging].name); if (progdefaults.logging == LOG_SQSO) { buf.append(" : ").append(QSOparties.qso_parties[progdefaults.SQSOcontest].contest); } if (progdefaults.logging == 0 && n3fjp_connected) { buf.append(" : N3FJP Amateur Contact Log"); } } if (fl_digi_main) { fl_digi_main->copy_label(buf.c_str()); fl_digi_main->redraw(); } } void showOpBrowserView(Fl_Widget *, void *) { if (RigViewerFrame->visible()) return CloseQsoView(); Logging_frame->hide(); RigViewerFrame->show(); qso_opPICK->box(FL_DOWN_BOX); qso_opBrowser->take_focus(); qso_opPICK->tooltip(_("Close List")); } void CloseQsoView() { RigViewerFrame->hide(); Logging_frame->show(); qso_opPICK->box(FL_UP_BOX); qso_opPICK->tooltip(_("Open List")); if (restore_minimize) { restore_minimize = false; UI_select(); } } void showOpBrowserView2(Fl_Widget *w, void *) { restore_minimize = true; UI_select(); showOpBrowserView(w, NULL); } void cb_qso_btnSelFreq(Fl_Widget *, void *) { qso_selectFreq(); } void cb_qso_btnDelFreq(Fl_Widget *, void *) { qso_delFreq(); } void cb_qso_btnAddFreq(Fl_Widget *, void *) { qso_addFreq(); } void cb_qso_btnClearList(Fl_Widget *, void *) { if ((Fl::event_state() & (FL_SHIFT)) == FL_SHIFT) { readFreqList(true); return; } if ((Fl::event_state() & FL_CTRL) == FL_CTRL) { saveFreqList(true); return; } if (quick_choice(_("Clear list?"), 2, _("Confirm"), _("Cancel"), NULL) == 1) clearList(); } //====================================================================== // PSK reporter interface // use separate thread to accomodate very slow responses from // remote server //====================================================================== #define PSKREP_MENU_MAX 8 static pthread_t PSKREP_thread; static std::string pskrep_data, pskrep_url, popup_title; static std::string pskrep_str[PSKREP_MENU_MAX]; static std::string::size_type pskrep_i; static Fl_Menu_Item pskrep_menu[PSKREP_MENU_MAX + 1]; static bool pskrep_working = false; void do_pskreporter_popup() { int j; int sel = 0; int t = Fl_Tooltip::enabled(); const Fl_Menu_Item* p = (Fl_Menu_Item *)0; put_status(""); Fl_Tooltip::disable(); p = pskrep_menu->popup( qso_inpAct->x() + qso_inpAct->w(), qso_inpAct->y() + qso_inpAct->h(), popup_title.c_str(), pskrep_menu + sel); j = p ? p - pskrep_menu + 1 : 0; if (j) qsy(strtoll(pskrep_str[j - 1].erase(pskrep_str[j - 1].find(' ')).c_str(), NULL, 10)); Fl_Tooltip::enable(t); } void *do_pskreporter_lookup(void *) // thread action { SET_THREAD_ID(ACTIVITY_TID); pskrep_working = true; pskrep_data.clear(); pskrep_url.assign("https://pskreporter.info/cgi-bin/psk-freq.pl"); pskrep_url.append("?mode=").append(mode_info[active_modem->get_mode()].export_mode); if (qso_inpAct->size()) pskrep_url.append("&grid=").append(qso_inpAct->value()); else if (progdefaults.myLocator.length() > 2) pskrep_url.append("&grid=").append(progdefaults.myLocator, 0, 2); if (get_http(pskrep_url, pskrep_data, 20.0) != MBEDTLS_EXIT_SUCCESS) { LOG_ERROR("Error while fetching \"%s\": %s", pskrep_url.c_str(), pskrep_data.c_str()); pskrep_working = false; return NULL; } if (pskrep_data.find("IP has made too many requests") != std::string::npos) { popup_title.assign(progdefaults.myName).append("\nSlow down the requests\nLAST data"); REQ(do_pskreporter_popup); pskrep_working = false; return NULL; } pskrep_i = pskrep_data.rfind("\r\n\r\n"); if (pskrep_i == std::string::npos) { LOG_ERROR("Pskreporter return invalid: %s", pskrep_data.c_str()); pskrep_working = false; return NULL; } pskrep_i += 4; pskrep_i = pskrep_data.find("\r\n", pskrep_i); pskrep_i += 2; re_t re("([[:digit:]]{6,}) [[:digit:]]+ ([[:digit:]]+)[[:space:]]+", REG_EXTENDED); size_t j = 0; memset(pskrep_menu, 0, sizeof(pskrep_menu)); std::string title; while (re.match(pskrep_data.substr(pskrep_i).c_str()) && j < PSKREP_MENU_MAX) { pskrep_i = pskrep_data.find("\r\n", pskrep_i + 1); if (pskrep_i == std::string::npos) break; pskrep_i += 2; pskrep_str[j].assign(re.submatch(1)).append(" (").append(re.submatch(2)). append(" ").append(atoi(re.submatch(2).c_str()) == 1 ? _("report") : _("reports")).append(")"); pskrep_menu[j].label(pskrep_str[j].c_str()); pskrep_menu[++j].label(NULL); } if ((pskrep_i = pskrep_data.rfind(" grid ")) != std::string::npos) { popup_title.assign(_("Recent activity for grid ")). append(pskrep_data.substr(pskrep_i + 5, 3)); } else { popup_title = " (?) Check network event log!\n"; #ifdef __WIN32__ popup_title.append("fldigi.files\\debug\\network_debug.txt"); #else popup_title.append("~/.fldigi/debug/network_debug.txt"); #endif } REQ(do_pskreporter_popup); pskrep_working = false; return NULL; } void cb_qso_inpAct(Fl_Widget*, void*) { if (pskrep_working) { return; } if (pthread_create(&PSKREP_thread, NULL, do_pskreporter_lookup, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); return; } put_status("Fetching PSK Reporter data", 15); } //====================================================================== static int i_opUsage; static std::string s_opEntry; static std::string s_opUsageEntry; static std::string s_outEntry; void cb_opUsageEnter(Fl_Button *, void*) { s_opUsageEntry = opUsage->value(); s_opEntry.append(s_opUsageEntry); qso_opBrowser->text(i_opUsage, s_opEntry.c_str()); qso_updateEntry(i_opUsage, s_opUsageEntry); opUsageFrame->hide(); qso_opBrowser->show(); } void qso_opBrowser_amend(int i) { size_t pos; s_opEntry = qso_opBrowser->text(i); pos = s_opEntry.rfind('|'); s_opUsageEntry = s_opEntry.substr(pos+1); s_opEntry.erase(pos + 1); s_outEntry = s_opEntry.substr(0, pos); while ((pos = s_outEntry.find('|')) != std::string::npos) s_outEntry.replace(pos, 1, " "); opOutUsage->value(s_outEntry.c_str()); opUsage->value(s_opUsageEntry.c_str()); i_opUsage = i; qso_opBrowser->hide(); opUsageFrame->show(); } void cb_qso_opBrowser(Fl_Browser*, void*) { int i = qso_opBrowser->value(); if (!i) return; // This makes the multi browser behave more like a hold browser, // but with the ability to invoke the callback via space/return. qso_opBrowser->deselect(); qso_opBrowser->select(i); int ikey = Fl::event_key(); switch (ikey) { case FL_Enter: case FL_KP_Enter: case FL_Button + FL_LEFT_MOUSE: if (ikey == FL_Button + FL_LEFT_MOUSE && !Fl::event_clicks()) break; qso_selectFreq(); CloseQsoView(); break; case ' ': case FL_Button + FL_RIGHT_MOUSE: if ((Fl::event_state() & FL_SHIFT) == FL_SHIFT) { qso_opBrowser_amend(i); } else qso_setFreq(); break; case FL_Button + FL_MIDDLE_MOUSE: i = qso_opBrowser->value(); qso_delFreq(); qso_addFreq(); qso_opBrowser->select(i); break; } } void _show_frequency(unsigned long long freq) { if (!qsoFreqDisp1 || !qsoFreqDisp2 || !qsoFreqDisp3) return; qsoFreqDisp1->value(freq); qsoFreqDisp2->value(freq); qsoFreqDisp3->value(freq); } void show_frequency(unsigned long long freq) { REQ(_show_frequency, freq); } void show_mode(const std::string sMode) { REQ(&Fl_ListBox::put_value, qso_opMODE, sMode.c_str()); } void show_bw(const std::string sWidth) { REQ(&Fl_ListBox::put_value, qso_opBW, sWidth.c_str()); } void show_bw1(const std::string sVal) { REQ(&Fl_ListBox::put_value, qso_opBW1, sVal.c_str()); } void show_bw2(const std::string sVal) { REQ(&Fl_ListBox::put_value, qso_opBW2, sVal.c_str()); } void show_spot(bool v) { //if (bWF_only) return; static bool oldval = false; if (v) { mnu->size(btnAutoSpot->x(), mnu->h()); if (oldval) progStatus.spot_recv = true; btnAutoSpot->value(progStatus.spot_recv); btnAutoSpot->activate(); } else { btnAutoSpot->deactivate(); oldval = btnAutoSpot->value(); btnAutoSpot->value(v); btnAutoSpot->do_callback(); mnu->size(btnRSID->x(), mnu->h()); } mnu->redraw(); } void setTabColors() { if (dlgConfig->visible()) dlgConfig->redraw(); if (dxcluster_viewer) { cluster_tabs->selection_color(progdefaults.TabsColor); if (dxcluster_viewer->visible()) dxcluster_viewer->redraw(); } } void showMacroSet() { set_macroLabels(); } void showDTMF(const std::string s) { std::string dtmfstr = "\n "; dtmfstr.append(s); ReceiveText->addstr(dtmfstr); } void setwfrange() { wf->opmode(); } void sync_cw_parameters() { active_modem->sync_parameters(); active_modem->update_Status(); } void cb_cntCW_WPM(Fl_Widget * w, void *v) { Fl_Counter2 *cnt = (Fl_Counter2 *) w; if (progStatus.WK_online && progStatus.WK_use_pot) { cnt->value(progStatus.WK_speed_wpm); return; } if (progStatus.WK_online && cnt->value() > 55) cnt->value(55); if (use_nanoIO && cnt->value() > 60) cnt->value(60); if (use_nanoIO && cnt->value() < 5) cnt->value(5); progdefaults.CWspeed = (int)cnt->value(); LOG_INFO("%f WPM", progdefaults.CWspeed); sldrCWxmtWPM->value(progdefaults.CWspeed); cntr_nanoCW_WPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters(); if (progStatus.WK_online) WK_set_wpm(); flrig_set_wpm(); restoreFocus(25); } void cb_btnCW_Default(Fl_Widget *w, void *v) { active_modem->toggleWPM(); restoreFocus(26); } static void cb_mainViewer_Seek(Fl_Input *, void *) { static const Fl_Color seek_color[2] = { FL_FOREGROUND_COLOR, adjust_color(FL_RED, FL_BACKGROUND2_COLOR) }; // invalid RE seek_re.recompile(*txtInpSeek->value() ? txtInpSeek->value() : "[invalid"); if (txtInpSeek->textcolor() != seek_color[!seek_re]) { txtInpSeek->textcolor(seek_color[!seek_re]); txtInpSeek->redraw(); } progStatus.browser_search = txtInpSeek->value(); if (viewer_inp_seek) viewer_inp_seek->value(progStatus.browser_search.c_str()); } static void cb_cntTxLevel(Fl_Counter2* o, void*) { progStatus.txlevel = o->value(); modeband.set_mode_txlevel(progStatus.txlevel); } static void cb_mainViewer(Fl_Hold_Browser*, void*) { int sel = mainViewer->value(); if (sel == 0 || sel > progdefaults.VIEWERchannels) return; switch (Fl::event_button()) { case FL_LEFT_MOUSE: if (mainViewer->freq(sel) != NULLFREQ) { if (progdefaults.VIEWERhistory){ ReceiveText->addchr('\n', FTextBase::RECV); bHistory = true; } else { ReceiveText->addchr('\n', FTextBase::ALTR); ReceiveText->addstr(mainViewer->line(sel), FTextBase::ALTR); } active_modem->set_freq(mainViewer->freq(sel)); recenter_spectrum_viewer(); active_modem->set_sigsearch(SIGSEARCH); if (brwsViewer) brwsViewer->select(sel); } else mainViewer->deselect(); break; case FL_MIDDLE_MOUSE: // copy from modem // set_freq(sel, active_modem->get_freq()); break; case FL_RIGHT_MOUSE: // reset { int ch = progdefaults.VIEWERascend ? progdefaults.VIEWERchannels - sel : sel - 1; active_modem->clear_ch(ch); mainViewer->deselect(); if (brwsViewer) brwsViewer->deselect(); break; } default: break; } } void widget_color_font(Fl_Widget *widget) { widget->labelsize(progdefaults.LOGGINGtextsize); widget->labelfont(progdefaults.LOGGINGtextfont); widget->labelcolor(progdefaults.LOGGINGtextcolor); widget->color(progdefaults.LOGGINGcolor); widget->redraw_label(); widget->redraw(); } void input_color_font(Fl_Input *input) { input->textsize(progdefaults.LOGGINGtextsize); input->textfont(progdefaults.LOGGINGtextfont); input->textcolor(progdefaults.LOGGINGtextcolor); input->color(progdefaults.LOGGINGcolor); input->redraw(); } void counter_color_font(Fl_Counter2 * cntr) { cntr->textsize(progdefaults.LOGGINGtextsize); cntr->textfont(progdefaults.LOGGINGtextfont); cntr->textcolor(progdefaults.LOGGINGtextcolor); cntr->textbkcolor(progdefaults.LOGGINGcolor); cntr->redraw(); } void combo_color_font(Fl_ComboBox *cbo) { cbo->color(progdefaults.LOGGINGcolor); cbo->selection_color(progdefaults.LOGGINGcolor); cbo->textfont(progdefaults.LOGGINGtextfont); cbo->textsize(progdefaults.LOGGINGtextsize); cbo->textcolor(progdefaults.LOGGINGtextcolor); cbo->redraw(); cbo->redraw_label(); } void LOGGING_colors_font() { Fl_Input* in[] = { inpFreq1, inpCall1, inpCall2, inpCall3, inpCall4, inpName1, inpName2, inpTimeOn1, inpTimeOn2, inpTimeOn3, inpTimeOn4, inpTimeOn5, inpTimeOff1, inpTimeOff2, inpTimeOff3, inpTimeOff4, inpTimeOff5, inpRstIn1, inpRstIn2, inpRstOut1, inpRstOut2, inpQth, inpLoc, inpAZ, inpVEprov, inpState1, inpLoc1, inpSerNo1, inpSerNo2, outSerNo1, outSerNo2, outSerNo3, outSerNo4, inp_SS_Check1, inp_SS_Precedence1, inp_SS_Section1, inp_SS_SerialNoR1, inp_SS_Check2, inp_SS_Precedence2, inp_SS_Section2, inp_SS_SerialNoR2, inpXchgIn1, inpXchgIn2, inp_FD_class1, inp_FD_class2, inp_FD_section1, inp_FD_section2, inp_KD_age1, inp_KD_age2, inp_KD_state1, inp_KD_state2, inp_KD_VEprov1, inp_KD_VEprov2, inp_KD_XchgIn1, inp_KD_XchgIn2, inp_CQ_RSTin2, inp_CQ_RSTout2, inp_CQzone1, inp_CQzone2, inp_CQstate1, inp_CQstate2, inp_CQDX_RSTin2, inp_CQDX_RSTout2, inp_CQDXzone1, inp_CQDXzone2, inp_ASCR_RSTin2, inp_ASCR_RSTout2, inp_ASCR_XchgIn1, inp_ASCR_XchgIn2, inp_ASCR_class1, inp_ASCR_class2, inp_ASCR_name2, inpNAQPname2, inp_name_NAS2, inpSPCnum_NAQP1, inpSPCnum_NAQP2, inpRTU_stpr1, inpRTU_stpr2, inpRTU_RSTin2, inpRTU_RSTout2, inpRTU_serno1, inpRTU_serno2, outSerNo4, inp_ser_NAS1, inpSPCnum_NAS1, outSerNo5, inp_ser_NAS2, inpSPCnum_NAS2, inpSerNo3, inpSerNo4, outSerNo7, outSerNo8, inpRstIn3, inpRstOut3, inp_JOTA_scout1, inp_JOTA_scout2, inp_JOTA_troop1, inp_JOTA_troop2, inp_JOTA_spc1, inp_JOTA_spc2, inpRstIn_AICW2, inpRstOut_AICW2, inpSPCnum_AICW1, inpSPCnum_AICW2 }; for (size_t i = 0; i < sizeof(in)/sizeof(*in); i++) { input_color_font(in[i]); } input_color_font(inpNotes); // buttons, boxes Fl_Widget *wid[] = { MODEstatus, Status1, Status2, StatusBar, WARNstatus }; for (size_t i = 0; i < sizeof(wid)/sizeof(*wid); i++) widget_color_font(wid[i]); // counters counter_color_font(cntCW_WPM); counter_color_font(cntTxLevel); counter_color_font(wf->wfRefLevel); counter_color_font(wf->wfAmpSpan); counter_color_font(wf->wfcarrier); // combo boxes Fl_ComboBox *cbo_widgets[] = { qso_opMODE, qso_opBW, qso_opBW1, qso_opBW2, cboCountyQSO, cboCountryQSO, cboCountryAICW2, cboCountryAIDX2, cboCountryCQ2, cboCountryCQDX2, cboCountryIARI2, cboCountryRTU2 //, // cboCountryWAE2 }; for (size_t i = 0; i < sizeof(cbo_widgets)/sizeof(*cbo_widgets); i++) { combo_color_font(cbo_widgets[i]); } fl_digi_main->redraw(); } inline void inp_font_pos(Fl_Input2* inp, int x, int y, int w, int h) { inp->textsize(progdefaults.LOGBOOKtextsize); inp->textfont(progdefaults.LOGBOOKtextfont); inp->textcolor(progdefaults.LOGBOOKtextcolor); inp->color(progdefaults.LOGBOOKcolor); inp->labelfont(progdefaults.LOGBOOKtextfont); int ls = progdefaults.LOGBOOKtextsize - 1; ls = ls < 12 ? 12 : (ls > 14 ? 14 : ls); inp->labelsize(ls); inp->redraw_label(); inp->resize(x, y, w, h); inp->redraw(); } inline void date_font_pos(Fl_DateInput* inp, int x, int y, int w, int h) { inp->textsize(progdefaults.LOGBOOKtextsize); inp->textfont(progdefaults.LOGBOOKtextfont); inp->textcolor(progdefaults.LOGBOOKtextcolor); inp->color(progdefaults.LOGBOOKcolor); inp->labelfont(progdefaults.LOGBOOKtextfont); int ls = progdefaults.LOGBOOKtextsize - 1; ls = ls < 10 ? 10 : (ls > 14 ? 14 : ls); inp->labelsize(ls); inp->redraw_label(); inp->resize(x, y, w, h); } inline void btn_font_pos(Fl_Widget* btn, int x, int y, int w, int h) { btn->labelfont(progdefaults.LOGBOOKtextfont); int ls = progdefaults.LOGBOOKtextsize - 1; ls = ls < 10 ? 10 : (ls > 14 ? 14 : ls); btn->labelsize(ls); btn->redraw_label(); btn->resize(x, y, w, h); btn->redraw(); } inline void tab_font_pos(Fl_Widget* tab, int x, int y, int w, int h, int ls) { tab->labelfont(progdefaults.LOGBOOKtextfont); tab->labelsize(ls); tab->redraw_label(); tab->resize(x, y, w, h); tab->redraw(); } inline void chc_font_pos(Fl_Choice* chc, int x, int y, int w, int h) { chc->labelfont(progdefaults.LOGBOOKtextfont); int ls = progdefaults.LOGBOOKtextsize - 1; ls = ls < 10 ? 10 : (ls > 14 ? 14 : ls); chc->labelsize(ls); chc->redraw_label(); chc->resize(x, y, w, h); chc->redraw(); } void LOGBOOK_colors_font() { if (!dlgLogbook) return; int ls = progdefaults.LOGBOOKtextsize; // input / output / date / text fields fl_font(progdefaults.LOGBOOKtextfont, ls); int wh = fl_height() + 4;// + 8; int width_date = fl_width("888888888") + wh; int width_time = fl_width("23:59:599"); int width_freq = fl_width("WW/WW8WWW/WW.");//fl_width("99.9999999"); int width_rst = fl_width("5999"); int width_pwr = fl_width("0000"); int width_loc = fl_width("XX88XXX"); int width_mode = fl_width("CONTESTIA"); int width_state = fl_width("WWWW"); int width_province = fl_width("WWW."); int width_country = fl_width("WWWWWWWWWWWWWWWWWWWW"); int dlg_width = 2 + width_date + 2 + width_time + 2 + width_freq + 2 + width_mode + 2 + width_pwr + 2 + width_rst + 2 + width_loc + 2; int newheight = 4*(wh + 20) + 3*wh + 2 + wh + 2 + wBrowser->h() + 2; //+ 24; if (dlg_width > progStatus.logbook_w) progStatus.logbook_w = dlg_width; else dlg_width = progStatus.logbook_w; if (newheight > progStatus.logbook_h) progStatus.logbook_h = newheight; else newheight = progStatus.logbook_h; dlgLogbook->resize( dlgLogbook->x(), dlgLogbook->y(), progStatus.logbook_w, progStatus.logbook_h); // row1 int ypos = 24; // date on int xpos = 2; date_font_pos(inpDate_log, xpos, ypos, width_date, wh); // timeon xpos += width_date + 2; inp_font_pos(inpTimeOn_log, xpos, ypos, width_time, wh); // call xpos += width_time + 2; inp_font_pos(inpCall_log, xpos, ypos, width_freq, wh); // name xpos += width_freq + 2; int wname = dlg_width - xpos - width_rst - width_loc - 6; inp_font_pos(inpName_log, xpos, ypos, wname, wh); // rcvd RST xpos += wname + 2; inp_font_pos(inpRstR_log, xpos, ypos, width_rst, wh); // nbr records xpos += width_rst + 2; inp_font_pos(txtNbrRecs_log, xpos, ypos, width_loc, wh); // row2 ypos += wh + 20; //date off xpos = 2; date_font_pos(inpDateOff_log, xpos, ypos, width_date, wh); //time off xpos += width_date + 2; inp_font_pos(inpTimeOff_log, xpos, ypos, width_time, wh); //frequency xpos += width_time + 2; inp_font_pos(inpFreq_log, xpos, ypos, width_freq, wh); //mode xpos += width_freq + 2; int wmode = dlg_width - xpos - width_rst - width_pwr - width_loc - 8; inp_font_pos(inpMode_log, xpos, ypos, wmode, wh); //power xpos += wmode + 2; inp_font_pos(inpTX_pwr_log, xpos, ypos, width_pwr, wh); //sent RST xpos += width_pwr + 2; inp_font_pos(inpRstS_log, xpos, ypos, width_rst, wh); // locator xpos += width_rst + 2; inp_font_pos(inpLoc_log, xpos, ypos, width_loc, wh); // row 3 // QTH ypos += wh + 20; xpos = 2; int wqth = dlg_width - 4 - width_state - 2 - width_province - 2 - width_country - 2; inp_font_pos(inpQth_log, xpos, ypos, wqth, wh); // state xpos += wqth + 2; inp_font_pos(inpState_log, xpos, ypos, width_state, wh); // province xpos += width_state + 2; inp_font_pos(inpVE_Prov_log, xpos, ypos, width_province, wh); // country xpos += width_province + 2; inp_font_pos(inpCountry_log, xpos, ypos, width_country, wh); ypos += wh + 2; grpTabsSearch->position(0, ypos); Tabs->position(2, grpTabsSearch->y() + 2); inp_font_pos(inpSearchString, Tabs->x() + Tabs->w() + 4, Tabs->y() + 30, dlgLogbook->w() - Tabs->w() - 8, wh); int tab_h = wh * 14 / progdefaults.LOGBOOKtextsize; int tab_grp_h = 4 * wh + 4; // Tabs->resize(2, ypos, dlg_width - 6 - inpSearchString->w(), tab_grp_h + tab_h); Tabs->selection_color(progdefaults.TabsColor); tab_font_pos(tab_log_qsl, 2, ypos + tab_h, Tabs->w(), tab_grp_h, 14); tab_font_pos(tab_log_contest, 2, ypos + tab_h, Tabs->w(), tab_grp_h, 14); tab_font_pos(tab_log_other, 2, ypos + tab_h, Tabs->w(), tab_grp_h, 14); tab_font_pos(tab_log_notes, 2, ypos + tab_h, Tabs->w(), tab_grp_h, 14); Fl_Input2* qso_fields[] = { inpTimeOn_log, inpCall_log, inpName_log, inpRstR_log, inpTimeOff_log, inpFreq_log, inpMode_log, inpTX_pwr_log, inpRstS_log, inpQth_log, inpState_log, inpVE_Prov_log, inpLoc_log, inpCountry_log, inpQSL_VIA_log, inpCNTY_log, inpIOTA_log, inpCQZ_log, inpCONT_log, inpITUZ_log, inpDXCC_log, inpNotes_log, inp_log_sta_call, inp_log_op_call, inp_log_sta_qth, inp_log_sta_loc, inpSerNoOut_log, inpMyXchg_log, inpSerNoIn_log, inpXchgIn_log, inpClass_log, inpSection_log, inp_age_log, inp_1010_log, inpBand_log, inp_check_log, inp_log_cwss_serno, inp_log_cwss_sec, inp_log_cwss_prec, inp_log_cwss_chk, inp_log_troop_s, inp_log_troop_r, inp_log_scout_s, inp_log_scout_r, inpSearchString, txtNbrRecs_log }; Fl_DateInput* dti[] = { inp_export_start_date, inp_export_stop_date, inpDate_log, inpDateOff_log, inpQSLrcvddate_log, inpEQSLrcvddate_log, inpLOTWrcvddate_log, inpQSLsentdate_log, inpEQSLsentdate_log, inpLOTWsentdate_log }; for (size_t i = 0; i < sizeof(qso_fields) / sizeof(*qso_fields); i++) inp_font_pos( qso_fields[i], qso_fields[i]->x(), qso_fields[i]->y(), qso_fields[i]->w(), wh); for (size_t i = 0; i < sizeof(dti) / sizeof(*dti); i++) date_font_pos( dti[i], dti[i]->x(), dti[i]->y(), dti[i]->w(), wh); inpNotes_log->resize( tab_log_notes->x() + 2, tab_log_notes->y() + 4, tab_log_notes->w() - 4, tab_log_notes->h() - 6); ypos += grpTabsSearch->h() + 2; grpFileButtons->resize(0, ypos, dlgLogbook->w(), grpFileButtons->h()); grpFileButtons->redraw(); txtLogFile->textsize(ls); txtLogFile->textfont(progdefaults.LOGBOOKtextfont); txtLogFile->textcolor(progdefaults.LOGBOOKtextcolor); txtLogFile->color(progdefaults.LOGBOOKcolor); ypos += grpFileButtons->h() + 2; wBrowser->font(progdefaults.LOGBOOKtextfont); wBrowser->fontsize(progdefaults.LOGBOOKtextsize); wBrowser->color(progdefaults.LOGBOOKcolor); wBrowser->selection_color(FL_SELECTION_COLOR); int datewidth = wBrowser->columnWidth(0); int timewidth = wBrowser->columnWidth(1); int callwidth = wBrowser->columnWidth(2); int namewidth = wBrowser->columnWidth(3); int freqwidth = wBrowser->columnWidth(4); int modewidth = wBrowser->columnWidth(5); int totalwidth = datewidth + timewidth + callwidth + namewidth + freqwidth + modewidth; int nuwidth = dlgLogbook->w() - 2*wBrowser->x(); wBrowser->resize(wBrowser->x(), ypos, nuwidth, dlgLogbook->h() - 2 - ypos); nuwidth -= wBrowser->vScrollWidth(); datewidth *= (1.0 * nuwidth / totalwidth); timewidth *= (1.0 * nuwidth / totalwidth); callwidth *= (1.0 * nuwidth / totalwidth); freqwidth *= (1.0 * nuwidth / totalwidth); modewidth *= (1.0 * nuwidth / totalwidth); namewidth = nuwidth - datewidth - timewidth - callwidth - freqwidth - modewidth; wBrowser->columnWidth (0, datewidth); // Date column wBrowser->columnWidth (1, timewidth); // Time column wBrowser->columnWidth (2, callwidth); // Callsign column wBrowser->columnWidth (3, namewidth); // Name column wBrowser->columnWidth (4, freqwidth); // Frequency column wBrowser->columnWidth (5, modewidth); // Mode column dlgLogbook->init_sizes(); dlgLogbook->damage(); dlgLogbook->redraw(); } void set_smeter_colors() { Fl_Color clr = fl_rgb_color( progdefaults.Smeter_bg_color.R, progdefaults.Smeter_bg_color.G, progdefaults.Smeter_bg_color.B); smeter->set_background(clr); clr = fl_rgb_color( progdefaults.Smeter_meter_color.R, progdefaults.Smeter_meter_color.G, progdefaults.Smeter_meter_color.B); smeter->set_metercolor(clr); clr = fl_rgb_color( progdefaults.Smeter_scale_color.R, progdefaults.Smeter_scale_color.G, progdefaults.Smeter_scale_color.B); smeter->set_scalecolor(clr); smeter->redraw(); clr = fl_rgb_color( progdefaults.PWRmeter_bg_color.R, progdefaults.PWRmeter_bg_color.G, progdefaults.PWRmeter_bg_color.B); pwrmeter->set_background(clr); clr = fl_rgb_color( progdefaults.PWRmeter_meter_color.R, progdefaults.PWRmeter_meter_color.G, progdefaults.PWRmeter_meter_color.B); pwrmeter->set_metercolor(clr); clr = fl_rgb_color( progdefaults.PWRmeter_scale_color.R, progdefaults.PWRmeter_scale_color.G, progdefaults.PWRmeter_scale_color.B); pwrmeter->set_scalecolor(clr); pwrmeter->select(progdefaults.PWRselect); pwrmeter->redraw(); } void FREQ_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_FREQ) s.erase(MAX_FREQ); w->value(s.c_str()); } void TIME_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_TIME) s.erase(MAX_TIME); w->value(s.c_str()); } void RST_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_RST) s.erase(MAX_RST); w->value(s.c_str()); } void CALL_callback(Fl_Input2 *w) { cb_call(w, NULL); } void NAME_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_NAME) s.erase(MAX_NAME); w->value(s.c_str()); } void AZ_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_AZ) s.erase(MAX_AZ); w->value(s.c_str()); } void QTH_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_QTH) s.erase(MAX_QTH); w->value(s.c_str()); } void STATE_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_STATE) s.erase(MAX_STATE); w->value(s.c_str()); } void VEPROV_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_STATE) s.erase(MAX_STATE); w->value(s.c_str()); } void LOC_callback(Fl_Input2 *w) { cb_loc(w, NULL); } void SERNO_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_SERNO) s.erase(MAX_SERNO); w->value(s.c_str()); } void XCHG_IN_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_XCHG_IN) s.erase(MAX_XCHG_IN); w->value(s.c_str()); } void COUNTRY_callback(Fl_ComboBox *w) { std::string s; s = w->value(); if (s.length() > MAX_COUNTRY) s.erase(MAX_COUNTRY); if (country_test(s)) w->value(country_match.c_str()); else w->value(s.c_str()); } void COUNTY_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_COUNTY) s.erase(MAX_COUNTY); w->value(s.c_str()); } void NOTES_callback(Fl_Input2 *w) { std::string s; s = w->value(); if (s.length() > MAX_NOTES) s.erase(MAX_NOTES); w->value(s.c_str()); } void log_callback(Fl_Widget *w) { if (w == inpCall) { n3fjp_calltab = true; CALL_callback((Fl_Input2 *)w); DupCheck(); return; } if (w == inpName) { NAME_callback((Fl_Input2 *)w); return; } if (w == cboCountry) { COUNTRY_callback((Fl_ComboBox *)w); return; } if (w == inpCounty) { COUNTY_callback((Fl_Input2 *)w); return; } if (w == inpNotes) { NOTES_callback((Fl_Input2 *)w); return; } if (w == inpLoc) { LOC_callback((Fl_Input2 *)w); return; } if (w == inpXchgIn) { XCHG_IN_callback((Fl_Input2 *)w); return; } if (w == inpState) { STATE_callback((Fl_Input2 *)w); return; } if (w == inpVEprov) { VEPROV_callback((Fl_Input2 *)w); return; } if (w == inpQTH) { QTH_callback((Fl_Input2 *)w); return; } if (w == inpAZ) { AZ_callback((Fl_Input2 *)w); return; } if (w == inpSerNo) { SERNO_callback((Fl_Input2 *)w); return; } if (w == inpRstIn) { RST_callback((Fl_Input2 *)w); return; } if (w == inpTimeOff || w == inpTimeOn) { TIME_callback((Fl_Input2 *)w); return; } // LOG_ERROR("unknown widget %p", w); } void cb_CountyQSO(Fl_Widget *) { std::string sc = cboCountyQSO->value(); if (sc.empty()) return; Cstates st; std::string ST = sc.substr(0,2); std::string CNTY = st.cnty_short(sc.substr(0,2), sc.substr(3)); if (inpState) inpState->value(ST.c_str()); if (inpState1) inpState1->value(ST.c_str()); if (inp_CQstate1) inp_CQstate1->value(ST.c_str()); if (inp_CQstate2) inp_CQstate2->value(ST.c_str()); if (inpSQSO_state1) inpSQSO_state1->value(ST.c_str()); if (inpSQSO_state2) inpSQSO_state2->value(ST.c_str()); if (inpSQSO_county1) inpSQSO_county1->value(CNTY.c_str()); if (inpSQSO_county2) inpSQSO_county2->value(CNTY.c_str()); } void cb_meters(Fl_Widget *) { if (!rigCAT_active()) return; pwrlevel_grp->show(); } void cb_set_pwr_level(void *) { rigCAT_set_pwrlevel((int)pwr_level->value()); } void cb_exit_pwr_level(void*) { pwrlevel_grp->hide(); } #include "fl_digi_main.cxx" void cb_mnuAltDockedscope(Fl_Menu_ *w, void *d); static Fl_Menu_Item alt_menu_[] = { {_("&File"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Exit"), log_out_icon), 'x', (Fl_Callback*)cb_E, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {_("Op &Mode"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CW].name, 0, cb_init_mode, (void *)MODE_CW, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"Contestia", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_4_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_4_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_125].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_8_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_8_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_250].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_16_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_16_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_32_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_32_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_32_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_500].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_1000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_CONTESTIA_64_2000].name, 0, cb_init_mode, (void *)MODE_CONTESTIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_contestiaCustom, (void *)MODE_CONTESTIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"DominoEX", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEXMICRO].name, 0, cb_init_mode, (void *)MODE_DOMINOEXMICRO, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX4].name, 0, cb_init_mode, (void *)MODE_DOMINOEX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX5].name, 0, cb_init_mode, (void *)MODE_DOMINOEX5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX8].name, 0, cb_init_mode, (void *)MODE_DOMINOEX8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX11].name, 0, cb_init_mode, (void *)MODE_DOMINOEX11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX16].name, 0, cb_init_mode, (void *)MODE_DOMINOEX16, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX22].name, 0, cb_init_mode, (void *)MODE_DOMINOEX22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX44].name, 0, cb_init_mode, (void *)MODE_DOMINOEX44, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_DOMINOEX88].name, 0, cb_init_mode, (void *)MODE_DOMINOEX88, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MFSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK4].name, 0, cb_init_mode, (void *)MODE_MFSK4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK8].name, 0, cb_init_mode, (void *)MODE_MFSK8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK11].name, 0, cb_init_mode, (void *)MODE_MFSK11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK16].name, 0, cb_init_mode, (void *)MODE_MFSK16, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK22].name, 0, cb_init_mode, (void *)MODE_MFSK22, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK31].name, 0, cb_init_mode, (void *)MODE_MFSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK32].name, 0, cb_init_mode, (void *)MODE_MFSK32, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64].name, 0, cb_init_mode, (void *)MODE_MFSK64, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128].name, 0, cb_init_mode, (void *)MODE_MFSK128, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK64L].name, 0, cb_init_mode, (void *)MODE_MFSK64L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MFSK128L].name, 0, cb_init_mode, (void *)MODE_MFSK128L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"MT63", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500S].name, 0, cb_init_mode, (void *)MODE_MT63_500S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_500L].name, 0, cb_init_mode, (void *)MODE_MT63_500L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000S].name, 0, cb_init_mode, (void *)MODE_MT63_1000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_1000L].name, 0, cb_init_mode, (void *)MODE_MT63_1000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000S].name, 0, cb_init_mode, (void *)MODE_MT63_2000S, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_MT63_2000L].name, 0, cb_init_mode, (void *)MODE_MT63_2000L, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"OFDM", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OFDM_500F].name, 0, cb_init_mode, (void *)MODE_OFDM_500F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OFDM_750F].name, 0, cb_init_mode, (void *)MODE_OFDM_750F, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, //{ mode_info[MODE_OFDM_2000F].name, 0, cb_init_mode, (void *)MODE_OFDM_2000F, 0, FL_NORMAL_LABEL, 0, 14, 0}, //{ mode_info[MODE_OFDM_2000].name, 0, cb_init_mode, (void *)MODE_OFDM_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OFDM_3500].name, 0, cb_init_mode, (void *)MODE_OFDM_3500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Olivia", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_4_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_4_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_125].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_250].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_8_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_8_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_16_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_16_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_32_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_32_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_500].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_1000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_OLIVIA_64_2000].name, 0, cb_init_mode, (void *)MODE_OLIVIA_64_2000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_oliviaCustom, (void *)MODE_OLIVIA, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK31].name, 0, cb_init_mode, (void *)MODE_PSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63].name, 0, cb_init_mode, (void *)MODE_PSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK63F].name, 0, cb_init_mode, (void *)MODE_PSK63F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125].name, 0, cb_init_mode, (void *)MODE_PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250].name, 0, cb_init_mode, (void *)MODE_PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500].name, 0, cb_init_mode, (void *)MODE_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK1000].name, 0, cb_init_mode, (void *)MODE_PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"MultiCarrier", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_12X_PSK125].name, 0, cb_init_mode, (void *)MODE_12X_PSK125, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_6X_PSK250].name, 0, cb_init_mode, (void *)MODE_6X_PSK250, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK500].name, 0, cb_init_mode, (void *)MODE_2X_PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK500].name, 0, cb_init_mode, (void *)MODE_4X_PSK500, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK800].name, 0, cb_init_mode, (void *)MODE_2X_PSK800, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK1000].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, {"QPSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK31].name, 0, cb_init_mode, (void *)MODE_QPSK31, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK63].name, 0, cb_init_mode, (void *)MODE_QPSK63, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK125].name, 0, cb_init_mode, (void *)MODE_QPSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK250].name, 0, cb_init_mode, (void *)MODE_QPSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_QPSK500].name, 0, cb_init_mode, (void *)MODE_QPSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"8PSK", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125].name, 0, cb_init_mode, (void *)MODE_8PSK125, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250].name, 0, cb_init_mode, (void *)MODE_8PSK250, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500].name, 0, cb_init_mode, (void *)MODE_8PSK500, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000].name, 0, cb_init_mode, (void *)MODE_8PSK1000, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125FL].name, 0, cb_init_mode, (void *)MODE_8PSK125FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK125F].name, 0, cb_init_mode, (void *)MODE_8PSK125F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250FL].name, 0, cb_init_mode, (void *)MODE_8PSK250FL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK250F].name, 0, cb_init_mode, (void *)MODE_8PSK250F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK500F].name, 0, cb_init_mode, (void *)MODE_8PSK500F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1000F].name, 0, cb_init_mode, (void *)MODE_8PSK1000F, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_8PSK1200F].name, 0, cb_init_mode, (void *)MODE_8PSK1200F, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"PSKR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK125R].name, 0, cb_init_mode, (void *)MODE_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK250R].name, 0, cb_init_mode, (void *)MODE_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK500R].name, 0, cb_init_mode, (void *)MODE_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_PSK1000R].name, 0, cb_init_mode, (void *)MODE_PSK1000R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {"MultiCarrier", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK63R].name, 0, cb_init_mode, (void *)MODE_4X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK63R].name, 0, cb_init_mode, (void *)MODE_5X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_10X_PSK63R].name, 0, cb_init_mode, (void *)MODE_10X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_20X_PSK63R].name, 0, cb_init_mode, (void *)MODE_20X_PSK63R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_32X_PSK63R].name, 0, cb_init_mode, (void *)MODE_32X_PSK63R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK125R].name, 0, cb_init_mode, (void *)MODE_4X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK125R].name, 0, cb_init_mode, (void *)MODE_5X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_10X_PSK125R].name, 0, cb_init_mode, (void *)MODE_10X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_12X_PSK125R].name, 0, cb_init_mode, (void *)MODE_12X_PSK125R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_16X_PSK125R].name, 0, cb_init_mode, (void *)MODE_16X_PSK125R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK250R].name, 0, cb_init_mode, (void *)MODE_2X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_3X_PSK250R].name, 0, cb_init_mode, (void *)MODE_3X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_5X_PSK250R].name, 0, cb_init_mode, (void *)MODE_5X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_6X_PSK250R].name, 0, cb_init_mode, (void *)MODE_6X_PSK250R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_7X_PSK250R].name, 0, cb_init_mode, (void *)MODE_7X_PSK250R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK500R].name, 0, cb_init_mode, (void *)MODE_2X_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_3X_PSK500R].name, 0, cb_init_mode, (void *)MODE_3X_PSK500R, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_4X_PSK500R].name, 0, cb_init_mode, (void *)MODE_4X_PSK500R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK800R].name, 0, cb_init_mode, (void *)MODE_2X_PSK800R, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_2X_PSK1000R].name, 0, cb_init_mode, (void *)MODE_2X_PSK1000R, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, { RTTY_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-45", 0, cb_rtty45, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-50", 0, cb_rtty50, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75N", 0, cb_rtty75N, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, { "RTTY-75W", 0, cb_rtty75W, (void *)MODE_RTTY, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { _("Custom..."), 0, cb_rttyCustom, (void *)MODE_RTTY, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"THOR", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THORMICRO].name, 0, cb_init_mode, (void *)MODE_THORMICRO, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR4].name, 0, cb_init_mode, (void *)MODE_THOR4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR5].name, 0, cb_init_mode, (void *)MODE_THOR5, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR8].name, 0, cb_init_mode, (void *)MODE_THOR8, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR11].name, 0, cb_init_mode, (void *)MODE_THOR11, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR16].name, 0, cb_init_mode, (void *)MODE_THOR16, FL_MENU_DIVIDER, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR22].name, 0, cb_init_mode, (void *)MODE_THOR22, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR32].name, 0, cb_init_mode, (void *)MODE_THOR32, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR44].name, 0, cb_init_mode, (void *)MODE_THOR44, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR56].name, 0, cb_init_mode, (void *)MODE_THOR56, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR25x4].name, 0, cb_init_mode, (void *)MODE_THOR25x4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR50x1].name, 0, cb_init_mode, (void *)MODE_THOR50x1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR50x2].name, 0, cb_init_mode, (void *)MODE_THOR50x2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THOR100].name, 0, cb_init_mode, (void *)MODE_THOR100, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {"Throb", 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB1].name, 0, cb_init_mode, (void *)MODE_THROB1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB2].name, 0, cb_init_mode, (void *)MODE_THROB2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROB4].name, 0, cb_init_mode, (void *)MODE_THROB4, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX1].name, 0, cb_init_mode, (void *)MODE_THROBX1, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX2].name, 0, cb_init_mode, (void *)MODE_THROBX2, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_THROBX4].name, 0, cb_init_mode, (void *)MODE_THROBX4, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { mode_info[MODE_WWV].name, 0, cb_init_mode, (void *)MODE_WWV, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_NULL].name, 0, cb_init_mode, (void *)MODE_NULL, 0, FL_NORMAL_LABEL, 0, 14, 0}, { mode_info[MODE_SSB].name, 0, cb_init_mode, (void *)MODE_SSB, 0, FL_NORMAL_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {_("&Configure"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Config Dialog")), 0, (Fl_Callback*)cb_mnu_config_dialog, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Test Signals")), 0, (Fl_Callback*)cb_mnuTestSignals, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Notifications")), 0, (Fl_Callback*)cb_mnuConfigNotify, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Save Config"), save_icon), 0, (Fl_Callback*)cb_mnuSaveConfig, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, { VIEW_MLABEL, 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Rx Audio Dialog")), 'a', (Fl_Callback*)cb_mnuRxAudioDialog, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Signal Browser")), 0, (Fl_Callback*)cb_mnuViewer, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Spectrum scope")), 0, (Fl_Callback*)cb_mnuSpectrum, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Floating scope"), utilities_system_monitor_icon), 'f', (Fl_Callback*)cb_mnuDigiscope, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { DOCKEDSCOPE_MLABEL, 0, (Fl_Callback*)cb_mnuAltDockedscope, 0, FL_MENU_TOGGLE, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(MFSK_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuPicViewer, 0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(THOR_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuThorViewRaw,0, FL_MENU_INACTIVE, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(IFKP_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)cb_mnuIfkpViewRaw,0, FL_MENU_INACTIVE | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(WEFAX_TX_IMAGE_MLABEL, image_icon), 0, (Fl_Callback*)wefax_pic::cb_mnu_pic_viewer_tx,0, FL_MENU_INACTIVE | FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {_("&Help"), 0, 0, 0, FL_SUBMENU, FL_NORMAL_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Online documentation..."), help_browser_icon), 0, cb_mnuOnLineDOCS, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Event log"), dialog_information_icon), 0, cb_mnuDebug, 0, FL_MENU_DIVIDER, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("Check for updates..."), system_software_update_icon), 0, cb_mnuCheckUpdate, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, { icons::make_icon_label(_("&About"), help_about_icon), 'a', cb_mnuAboutURL, 0, 0, _FL_MULTI_LABEL, 0, 14, 0}, {0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0}, }; void cb_mnuAltDockedscope(Fl_Menu_ *w, void *d) { Fl_Menu_Item *m = getMenuItem(((Fl_Menu_*)w)->mvalue()->label(), alt_menu_); progStatus.DOCKEDSCOPE = m->value(); wf->show_scope(progStatus.DOCKEDSCOPE); } #define defwidget 0, 0, 10, 10, "" void noop_controls() // create and then hide all controls not being used { Fl_Double_Window *dummywindow = new Fl_Double_Window(0,0,100,100,""); btnMacroTimer = new Fl_Button(defwidget); btnMacroTimer->hide(); ReceiveText = new FTextRX(0,0,100,100); ReceiveText->hide(); TransmitText = new FTextTX(0,0,100,100); TransmitText->hide(); FHdisp = new Raster(0,0,10,100); FHdisp->hide(); for (int i = 0; i < NUMMACKEYS * NUMKEYROWS; i++) { btnMacro[i] = new Fl_Button(defwidget); btnMacro[i]->hide(); } for (int i = 0; i < 48; i++) { btnDockMacro[i] = new Fl_Button(defwidget); btnDockMacro[i]->hide(); } inpQth = new Fl_Input2(defwidget); inpQth->hide(); inpLoc1 = new Fl_Input2(defwidget); inpLoc1->hide(); inpState1 = new Fl_Input2(defwidget); inpState1->hide(); cboCountryQSO = new Fl_ComboBox(defwidget); cboCountryQSO->end(); cboCountryQSO->hide(); cboCountyQSO = new Fl_ComboBox(defwidget); cboCountyQSO->hide(); cboCountyQSO->hide(); inpSerNo = new Fl_Input2(defwidget); inpSerNo->hide(); outSerNo = new Fl_Input2(defwidget); outSerNo->hide(); inpXchgIn = new Fl_Input2(defwidget); inpXchgIn->hide(); inpVEprov = new Fl_Input2(defwidget); inpVEprov->hide(); inpNotes = new Fl_Input2(defwidget); inpNotes->hide(); inpAZ = new Fl_Input2(defwidget); inpAZ->hide(); qsoTime = new Fl_Button(defwidget); qsoTime->hide(); btnQRZ = new Fl_Button(defwidget); btnQRZ->hide(); qsoClear = new Fl_Button(defwidget); qsoClear->hide(); qsoSave = new Fl_Button(defwidget); qsoSave->hide(); qsoFreqDisp = new cFreqControl(0,0,80,20,""); qsoFreqDisp->hide(); qso_opMODE = new Fl_ListBox(defwidget); qso_opMODE->hide(); qso_opBW = new Fl_ListBox(defwidget); qso_opBW->hide(); qso_opPICK = new Fl_Button(defwidget); qso_opPICK->hide(); qso_opGROUP = new Fl_Group(defwidget); qso_opGROUP->hide(); inpFreq = new Fl_Input2(defwidget); inpFreq->hide(); inpTimeOff = new Fl_Input2(defwidget); inpTimeOff->hide(); inpTimeOn = new Fl_Input2(defwidget); inpTimeOn->hide(); btnTimeOn = new Fl_Button(defwidget); btnTimeOn->hide(); inpCall = new Fl_Input2(defwidget); inpCall->hide(); inpName = new Fl_Input2(defwidget); inpName->hide(); inpRstIn = new Fl_Input2(defwidget); inpRstIn->hide(); inpRstOut = new Fl_Input2(defwidget); inpRstOut->hide(); inpFreq1 = new Fl_Input2(defwidget); inpFreq1->hide(); inpTimeOff1 = new Fl_Input2(defwidget); inpTimeOff1->hide(); inpTimeOn1 = new Fl_Input2(defwidget); inpTimeOn1->hide(); btnTimeOn1 = new Fl_Button(defwidget); btnTimeOn1->hide(); inpCall1 = new Fl_Input2(defwidget); inpCall1->hide(); inpName1 = new Fl_Input2(defwidget); inpName1->hide(); inpRstIn1 = new Fl_Input2(defwidget); inpRstIn1->hide(); inpRstOut1 = new Fl_Input2(defwidget); inpRstOut1->hide(); inpXchgIn1 = new Fl_Input2(defwidget); inpXchgIn1->hide(); outSerNo1 = new Fl_Input2(defwidget); outSerNo1->hide(); inpSerNo1 = new Fl_Input2(defwidget); inpSerNo1->hide(); qsoFreqDisp1 = new cFreqControl(0,0,80,20,""); qsoFreqDisp1->hide(); inp_FD_class1 = new Fl_Input2(defwidget); inp_FD_class1->hide(); inp_FD_class2 = new Fl_Input2(defwidget); inp_FD_class2->hide(); inp_FD_section1 = new Fl_Input2(defwidget); inp_FD_section1->hide(); inp_FD_section2 = new Fl_Input2(defwidget); inp_FD_section2->hide(); inp_KD_name2 = new Fl_Input2(defwidget); inp_KD_name2->hide(); inp_KD_age1 = new Fl_Input2(defwidget); inp_KD_age1->hide(); inp_KD_age2 = new Fl_Input2(defwidget); inp_KD_age2->hide(); inp_KD_state1 = new Fl_Input2(defwidget); inp_KD_state1->hide(); inp_KD_state2 = new Fl_Input2(defwidget); inp_KD_state2->hide(); inp_KD_VEprov1 = new Fl_Input2(defwidget); inp_KD_VEprov1->hide(); inp_KD_VEprov2 = new Fl_Input2(defwidget); inp_KD_VEprov2->hide(); inp_KD_XchgIn1 = new Fl_Input2(defwidget); inp_KD_XchgIn1->hide(); inp_KD_XchgIn2 = new Fl_Input2(defwidget); inp_KD_XchgIn2->hide(); inp_1010_XchgIn1 = new Fl_Input2(defwidget); inp_1010_XchgIn1->hide(); inp_1010_XchgIn2 = new Fl_Input2(defwidget); inp_1010_XchgIn2->hide(); inp_1010_nr1 = new Fl_Input2(defwidget); inp_1010_nr1->hide(); inp_1010_nr2 = new Fl_Input2(defwidget); inp_1010_nr2->hide(); inp_1010_name2 = new Fl_Input2(defwidget); inp_1010_name2->hide(); inp_ARR_Name2 = new Fl_Input2(defwidget); inp_ARR_Name2->hide(); inp_ARR_XchgIn1 = new Fl_Input2(defwidget); inp_ARR_XchgIn1->hide(); inp_ARR_XchgIn2 = new Fl_Input2(defwidget); inp_ARR_XchgIn2->hide(); inp_ARR_check1 = new Fl_Input2(defwidget); inp_ARR_check1->hide(); inp_ARR_check2 = new Fl_Input2(defwidget); inp_ARR_check2->hide(); inp_vhf_Loc1 = new Fl_Input2(defwidget); inp_vhf_Loc1->hide(); inp_vhf_Loc2 = new Fl_Input2(defwidget); inp_vhf_Loc2->hide(); inp_vhf_RSTin1 = new Fl_Input2(defwidget); inp_vhf_RSTin1->hide(); inp_vhf_RSTin2 = new Fl_Input2(defwidget); inp_vhf_RSTin2->hide(); inp_vhf_RSTout1 = new Fl_Input2(defwidget); inp_vhf_RSTout1->hide(); inp_vhf_RSTout2 = new Fl_Input2(defwidget); inp_vhf_RSTout2->hide(); inp_CQ_RSTin2 = new Fl_Input2(defwidget); inp_CQ_RSTin2->hide(); inp_CQ_RSTout2 = new Fl_Input2(defwidget); inp_CQ_RSTout2->hide(); inp_CQstate1 = new Fl_Input2(defwidget); inp_CQstate1->hide(); inp_CQstate2 = new Fl_Input2(defwidget); inp_CQstate2->hide(); inp_CQzone1 = new Fl_Input2(defwidget); inp_CQzone1->hide(); inp_CQzone2 = new Fl_Input2(defwidget); inp_CQzone2->hide(); cboCountryCQ2 = new Fl_ComboBox(defwidget); cboCountryCQ2->end(); cboCountryCQ2->hide(); inp_CQDX_RSTin2 = new Fl_Input2(defwidget); inp_CQDX_RSTin2->hide(); inp_CQDX_RSTout2 = new Fl_Input2(defwidget); inp_CQDX_RSTout2->hide(); cboCountryCQDX2 = new Fl_ComboBox(defwidget); cboCountryCQDX2->end(); cboCountryCQDX2->hide(); inp_CQDXzone1 = new Fl_Input2(defwidget); inp_CQDXzone1->hide(); inp_CQDXzone2 = new Fl_Input2(defwidget); inp_CQDXzone2->hide(); inpTimeOff2 = new Fl_Input2(defwidget); inpTimeOff2->hide(); inpTimeOn2 = new Fl_Input2(defwidget); inpTimeOn2->hide(); btnTimeOn2 = new Fl_Button(defwidget); btnTimeOn2->hide(); inpCall2 = new Fl_Input2(defwidget); inpCall2->hide(); inpName2 = new Fl_Input2(defwidget); inpName2->hide(); inpRstIn2 = new Fl_Input2(defwidget); inpRstIn2->hide(); inpRstOut2 = new Fl_Input2(defwidget); inpRstOut2->hide(); qsoFreqDisp2 = new cFreqControl(0,0,80,20,""); qsoFreqDisp2->hide(); qso_opPICK2 = new Fl_Button(defwidget); qso_opPICK2->hide(); qsoClear2 = new Fl_Button(defwidget); qsoClear2->hide(); qsoSave2 = new Fl_Button(defwidget); qsoSave2->hide(); btnQRZ2 = new Fl_Button(defwidget); btnQRZ2->hide(); inpTimeOff3 = new Fl_Input2(defwidget); inpTimeOff3->hide(); inpTimeOn3 = new Fl_Input2(defwidget); inpTimeOn3->hide(); btnTimeOn3 = new Fl_Button(defwidget); btnTimeOn3->hide(); inpCall3 = new Fl_Input2(defwidget); inpCall3->hide(); outSerNo2 = new Fl_Input2(defwidget); outSerNo2->hide(); inpSerNo2 = new Fl_Input2(defwidget); inpSerNo2->hide(); inpXchgIn2 = new Fl_Input2(defwidget); inpXchgIn2->hide(); qsoFreqDisp3 = new cFreqControl(0,0,80,20,""); qsoFreqDisp3->hide(); inpTimeOff4 = new Fl_Input2(defwidget); inpTimeOff4->hide(); inpTimeOn4 = new Fl_Input2(defwidget); inpTimeOn4->hide(); btnTimeOn4 = new Fl_Button(defwidget); btnTimeOn4->hide(); inpTimeOff5 = new Fl_Input2(defwidget); inpTimeOff5->hide(); inpTimeOn5 = new Fl_Input2(defwidget); inpTimeOn5->hide(); btnTimeOn5 = new Fl_Button(defwidget); btnTimeOn5->hide(); outSerNo3 = new Fl_Input2(defwidget); outSerNo3->hide(); inp_SS_SerialNoR1 = new Fl_Input2(defwidget); inp_SS_SerialNoR1->hide(); inp_SS_Precedence1 = new Fl_Input2(defwidget); inp_SS_Precedence1->hide(); inp_SS_Check1 = new Fl_Input2(defwidget); inp_SS_Check1->hide(); inp_SS_Section1 = new Fl_Input2(defwidget); inp_SS_Section1->hide(); outSerNo4 = new Fl_Input2(defwidget); outSerNo4->hide(); inp_SS_SerialNoR2 = new Fl_Input2(defwidget); inp_SS_SerialNoR2->hide(); inp_SS_Precedence2 = new Fl_Input2(defwidget); inp_SS_Precedence2->hide(); inp_SS_Check2 = new Fl_Input2(defwidget); inp_SS_Check2->hide(); inp_SS_Section2 = new Fl_Input2(defwidget); inp_SS_Section2->hide(); inp_ASCR_class1 = new Fl_Input2(defwidget); inp_ASCR_class1->hide(); inp_ASCR_XchgIn1 = new Fl_Input2(defwidget); inp_ASCR_XchgIn1->hide(); inp_ASCR_name2 = new Fl_Input2(defwidget); inp_ASCR_name2->hide(); inp_ASCR_class2 = new Fl_Input2(defwidget); inp_ASCR_class2->hide(); inp_ASCR_XchgIn2 = new Fl_Input2(defwidget); inp_ASCR_XchgIn2->hide(); inp_ASCR_RSTin2 = new Fl_Input2(defwidget); inp_ASCR_RSTin2->hide(); inp_ASCR_RSTout2 = new Fl_Input2(defwidget); inp_ASCR_RSTout2->hide(); inpNAQPname2 = new Fl_Input2(defwidget); inpNAQPname2->hide(); inpSPCnum_NAQP1 = new Fl_Input2(defwidget); inpSPCnum_NAQP1->hide(); inpSPCnum_NAQP2 = new Fl_Input2(defwidget); inpSPCnum_NAQP2->hide(); inpRTU_stpr1 = new Fl_Input2(defwidget); inpRTU_stpr1->hide(); inpRTU_serno1 = new Fl_Input2(defwidget); inpRTU_serno1->hide(); inpRTU_RSTin2 = new Fl_Input2(defwidget); inpRTU_RSTin2->hide(); inpRTU_RSTout2 = new Fl_Input2(defwidget); inpRTU_RSTout2->hide(); inpRTU_stpr2 = new Fl_Input2(defwidget); inpRTU_stpr2->hide(); inpRTU_serno2 = new Fl_Input2(defwidget); inpRTU_serno2->hide(); cboCountryRTU2 = new Fl_ComboBox(defwidget); cboCountryRTU2->end(); cboCountryRTU2->hide(); inp_IARI_PR1 = new Fl_Input2(defwidget); inp_IARI_PR1->hide(); inp_IARI_RSTin2 = new Fl_Input2(defwidget); inp_IARI_RSTin2->hide(); inp_IARI_RSTout2 = new Fl_Input2(defwidget); inp_IARI_RSTout2->hide(); out_IARI_SerNo1 = new Fl_Input2(defwidget); out_IARI_SerNo1->hide(); inp_IARI_SerNo1 = new Fl_Input2(defwidget); inp_IARI_SerNo1->hide(); out_IARI_SerNo2 = new Fl_Input2(defwidget); out_IARI_SerNo2->hide(); inp_IARI_SerNo2 = new Fl_Input2(defwidget); inp_IARI_SerNo2->hide(); inp_IARI_PR2 = new Fl_Input2(defwidget); inp_IARI_PR2->hide(); cboCountryIARI2 = new Fl_ComboBox(defwidget); cboCountryIARI2->end(); cboCountryIARI2->hide(); outSerNo5 = new Fl_Input2(defwidget); outSerNo4->hide(); inp_ser_NAS1 = new Fl_Input2(defwidget); inp_ser_NAS1->hide(); inpSPCnum_NAS1 = new Fl_Input2(defwidget); inpSPCnum_NAS1->hide(); outSerNo6 = new Fl_Input2(defwidget); outSerNo5->hide(); inp_ser_NAS2 = new Fl_Input2(defwidget); inp_ser_NAS2->hide(); inpSPCnum_NAS2 = new Fl_Input2(defwidget); inpSPCnum_NAS2->hide(); inp_name_NAS2 = new Fl_Input2(defwidget); inp_name_NAS2->hide(); outSerNo7 = new Fl_Input2(defwidget); outSerNo7->hide(); inpSerNo3 = new Fl_Input2(defwidget); inpSerNo3->hide(); cboCountryAIDX2 = new Fl_ComboBox(defwidget); cboCountryAIDX2->end(); cboCountryAIDX2->hide(); inpRstIn3 = new Fl_Input2(defwidget); inpRstIn3->hide(); inpRstOut3 = new Fl_Input2(defwidget); inpRstOut3->hide(); outSerNo8 = new Fl_Input2(defwidget); outSerNo8->hide(); inpSerNo4 = new Fl_Input2(defwidget); inpSerNo4->hide(); inp_JOTA_troop1 = new Fl_Input2(defwidget); inp_JOTA_troop1->hide(); inp_JOTA_troop2 = new Fl_Input2(defwidget); inp_JOTA_troop2->hide(); inp_JOTA_scout1 = new Fl_Input2(defwidget); inp_JOTA_scout1->hide(); inp_JOTA_scout2 = new Fl_Input2(defwidget); inp_JOTA_scout2->hide(); inp_JOTA_spc1 = new Fl_Input2(defwidget); inp_JOTA_spc1->hide(); inp_JOTA_spc2 = new Fl_Input2(defwidget); inp_JOTA_spc2->hide(); inpSPCnum_AICW1 = new Fl_Input2(defwidget); inpSPCnum_AICW1->hide(); inpSPCnum_AICW2 = new Fl_Input2(defwidget); inpSPCnum_AICW2->hide(); inpRstIn_AICW2 = new Fl_Input2(defwidget); inpRstIn_AICW2->hide(); inpRstOut_AICW2 = new Fl_Input2(defwidget); inpRstOut_AICW2->hide(); inpSQSO_state1 = new Fl_Input2(defwidget); inpSQSO_state1->hide(); inpSQSO_state2 = new Fl_Input2(defwidget); inpSQSO_state2->hide(); inpSQSO_county1 = new Fl_Input2(defwidget); inpSQSO_county1->hide(); inpSQSO_county2 = new Fl_Input2(defwidget); inpSQSO_county2->hide(); inpSQSO_serno1 = new Fl_Input2(defwidget); inpSQSO_serno1->hide(); inpSQSO_serno2 = new Fl_Input2(defwidget); inpSQSO_serno2->hide(); outSQSO_serno1 = new Fl_Input2(defwidget); outSQSO_serno1->hide(); outSQSO_serno2 = new Fl_Input2(defwidget); outSQSO_serno2->hide(); inpSQSO_name2 = new Fl_Input2(defwidget); inpSQSO_name2->hide(); inpRstIn_SQSO2 = new Fl_Input2(defwidget); inpRstIn_SQSO2->hide(); inpRstOut_SQSO2 = new Fl_Input2(defwidget); inpRstOut_SQSO2->hide(); inpSQSO_category1 = new Fl_Input2(defwidget); inpSQSO_category1->hide(); inpSQSO_category2 = new Fl_Input2(defwidget); inpSQSO_category2->hide(); inpSerNo_WPX1 = new Fl_Input2(defwidget); inpSerNo_WPX1->hide(); outSerNo_WPX1 = new Fl_Input2(defwidget); outSerNo_WPX1->hide(); inpSerNo_WPX2 = new Fl_Input2(defwidget); inpSerNo_WPX2->hide(); outSerNo_WPX2 = new Fl_Input2(defwidget); outSerNo_WPX2->hide(); inpRstIn_WPX2 = new Fl_Input2(defwidget); inpRstIn_WPX2->hide(); inpRstOut_WPX2 = new Fl_Input2(defwidget); inpRstOut_WPX2->hide(); inpSerNo_WAE1 = new Fl_Input2(defwidget); inpSerNo_WAE1->hide(); inpSerNo_WAE2 = new Fl_Input2(defwidget); inpSerNo_WAE2->hide(); outSerNo_WAE1 = new Fl_Input2(defwidget); outSerNo_WAE1->hide(); outSerNo_WAE2 = new Fl_Input2(defwidget); outSerNo_WAE2->hide(); inpRstIn_WAE2 = new Fl_Input2(defwidget); inpRstIn_WAE2->hide(); inpRstOut_WAE2 = new Fl_Input2(defwidget); inpRstOut_WAE2->hide(); cboCountryWAE2 = new Fl_ComboBox(defwidget); cboCountryWAE2->end(); cboCountryWAE2->hide(); qso_opPICK3 = new Fl_Button(defwidget); qso_opPICK3->hide(); qsoClear3 = new Fl_Button(defwidget); qsoClear3->hide(); qsoSave3 = new Fl_Button(defwidget); qsoSave3->hide(); inpCall4 = new Fl_Input2(defwidget); inpCall4->hide(); qso_opBrowser = new Fl_Browser(defwidget); qso_opBrowser->hide(); qso_btnAddFreq = new Fl_Button(defwidget); qso_btnAddFreq->hide(); qso_btnSelFreq = new Fl_Button(defwidget); qso_btnSelFreq->hide(); qso_btnDelFreq = new Fl_Button(defwidget); qso_btnDelFreq->hide(); qso_btnClearList = new Fl_Button(defwidget); qso_btnClearList->hide(); qso_btnAct = new Fl_Button(defwidget); qso_btnAct->hide(); qso_inpAct = new Fl_Input2(defwidget); qso_inpAct->hide(); pwrmeter = new PWRmeter(defwidget); pwrmeter->hide(); smeter = new Smeter(defwidget); smeter->hide(); pwr_level = new Fl_Value_Slider2(defwidget); pwr_level->hide(); set_pwr_level = new Fl_Button(defwidget); set_pwr_level->hide(); dummywindow->end(); dummywindow->hide(); } void make_scopeviewer() { scopeview = new Fl_Double_Window(0,0,140,140, _("Scope")); scopeview->xclass(PACKAGE_NAME); digiscope = new Digiscope (0, 0, 140, 140); digiscope->bk_color(progdefaults.digi_background); digiscope->axis_color(progdefaults.digi_axis_color); digiscope->user_color_1(progdefaults.digi_color_1); digiscope->user_color_2(progdefaults.digi_color_2); digiscope->user_color_3(progdefaults.digi_color_3); digiscope->user_color_4(progdefaults.digi_color_4); scopeview->resizable(digiscope); scopeview->size_range(SCOPEWIN_MIN_WIDTH, SCOPEWIN_MIN_HEIGHT); scopeview->end(); scopeview->hide(); } static int WF_only_height = 0; void create_fl_digi_main_WF_only() { int fnt = fl_font(); int fsize = fl_size(); int freqheight = Hentry + 2 * pad; int Y = 0; int W = progStatus.mainW; fl_font(fnt, freqheight); fl_font(fnt, fsize); IMAGE_WIDTH = 4000; Hwfall = progdefaults.wfheight; Wwfall = W - 2 * DEFAULT_SW - 2 * pad; WF_only_height = Hmenu + Hwfall + Hstatus + 4 * pad; fl_digi_main = new Fl_Double_Window(W, WF_only_height); mnuFrame = new Fl_Group(0, 0, W, Hmenu); mnu = new Fl_Menu_Bar(0, 0, W - 275 - pad, Hmenu); // do some more work on the menu for (size_t i = 0; i < sizeof(alt_menu_)/sizeof(alt_menu_[0]); i++) { // FL_NORMAL_SIZE may have changed; update the menu items if (alt_menu_[i].text) { alt_menu_[i].labelsize_ = FL_NORMAL_SIZE; } // set the icon label for items with the multi label type if (alt_menu_[i].labeltype() == _FL_MULTI_LABEL) icons::set_icon_label(&alt_menu_[i]); } mnu->menu(alt_menu_); tx_timer = new Fl_Box(W - 275 - pad, 0, 75 - pad, Hmenu, ""); tx_timer->box(FL_UP_BOX); tx_timer->color(FL_BACKGROUND_COLOR); tx_timer->labelcolor(FL_BACKGROUND_COLOR); btnAutoSpot = new Fl_Light_Button(W - 200 - pad, 0, 50, Hmenu, "Spot"); btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->callback(cbAutoSpot, 0); btnAutoSpot->deactivate(); btnRSID = new Fl_Light_Button(W - 150 - pad, 0, 50, Hmenu, "RxID"); btnRSID->tooltip("Receive RSID"); btnRSID->value(progdefaults.rsid); btnRSID->callback(cbRSID, 0); btnTxRSID = new Fl_Light_Button(W - 100 - pad, 0, 50, Hmenu, "TxID"); btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->tooltip("Transmit RSID"); btnTxRSID->callback(cbTxRSID, 0); btnTune = new Fl_Light_Button(W - 50 - pad, 0, 50, Hmenu, "TUNE"); btnTune->selection_color(progdefaults.TuneColor); btnTune->callback(cbTune, 0); mnuFrame->resizable(mnu); mnuFrame->end(); Y = Hmenu + pad; wf_group = new Fl_Group(0, Y, W, Hwfall); wf = new waterfall(0, Y, Wwfall, Hwfall); wf->end(); pgrsSquelch = new Progress( rightof(wf), Y + pad, DEFAULT_SW, Hwfall - 2 * pad, ""); pgrsSquelch->color(FL_BACKGROUND2_COLOR, FL_DARK_GREEN); pgrsSquelch->type(Progress::VERTICAL); pgrsSquelch->tooltip(_("Detected signal level")); sldrSquelch = new Fl_Slider2( rightof(pgrsSquelch), Y + pad, DEFAULT_SW, Hwfall - 2 * pad, ""); sldrSquelch->minimum(100); sldrSquelch->maximum(0); sldrSquelch->step(1); sldrSquelch->value(progStatus.sldrSquelchValue); sldrSquelch->callback((Fl_Callback*)cb_sldrSquelch); sldrSquelch->color(FL_INACTIVE_COLOR); sldrSquelch->tooltip(_("Squelch level")); Fl_Group::current()->resizable(wf); wf_group->end(); Y += (Hwfall + pad); status_group = new Fl_Group(0, Y, W, Hstatus); MODEstatus = new Fl_Button( 0, Y, Wmode, Hstatus, ""); MODEstatus->box(FL_DOWN_BOX); MODEstatus->color(FL_BACKGROUND2_COLOR); MODEstatus->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); MODEstatus->callback(status_cb, (void *)0); MODEstatus->when(FL_WHEN_CHANGED); MODEstatus->tooltip(_("Left click: change mode\nRight click: configure")); cntCW_WPM = new Fl_Counter2( rightof(MODEstatus), Y, Ws2n - Hstatus, Hstatus, ""); cntCW_WPM->callback(cb_cntCW_WPM); cntCW_WPM->minimum(progdefaults.CWlowerlimit); cntCW_WPM->maximum(progdefaults.CWupperlimit); cntCW_WPM->value(progdefaults.CWspeed); cntCW_WPM->tooltip(_("CW transmit WPM")); cntCW_WPM->type(1); cntCW_WPM->step(1); cntCW_WPM->hide(); btnCW_Default = new Fl_Button( rightof(cntCW_WPM), Y, Hstatus, Hstatus, "*"); btnCW_Default->callback(cb_btnCW_Default); btnCW_Default->tooltip(_("Default WPM")); btnCW_Default->hide(); Status1 = new Fl_Box( rightof(MODEstatus), Y, Ws2n, Hstatus, ""); Status1->box(FL_DOWN_BOX); Status1->color(FL_BACKGROUND2_COLOR); Status1->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); Status2 = new Fl_Box( rightof(Status1), Y, Wimd, Hstatus, ""); Status2->box(FL_DOWN_BOX); Status2->color(FL_BACKGROUND2_COLOR); Status2->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); StatusBar = new status_box( rightof(Status2), Y, W - rightof(Status2) - bwAfcOnOff - bwSqlOnOff - Wwarn - bwTxLevel - bwSqlOnOff - cbwidth, Hstatus, ""); StatusBar->box(FL_DOWN_BOX); StatusBar->color(FL_BACKGROUND2_COLOR); StatusBar->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); StatusBar->callback((Fl_Callback *)StatusBar_cb); StatusBar->when(FL_WHEN_RELEASE_ALWAYS); StatusBar->tooltip(_("Left click to toggle VuMeter")); StatusBar->show(); VuMeter = new vumeter(StatusBar->x(), StatusBar->y(), StatusBar->w(), StatusBar->h(), "" ); VuMeter->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); VuMeter->when(FL_WHEN_RELEASE_ALWAYS); VuMeter->tooltip(_("Left click to toggle Status Bar")); VuMeter->callback((Fl_Callback *)VuMeter_cb); cntTxLevel = new Fl_Counter2( rightof(StatusBar), Y, bwTxLevel, Hstatus, ""); cntTxLevel->minimum(-30); cntTxLevel->maximum(0); cntTxLevel->value(-6); cntTxLevel->callback((Fl_Callback*)cb_cntTxLevel); cntTxLevel->value(progStatus.txlevel); cntTxLevel->lstep(1.0); cntTxLevel->tooltip(_("Tx level attenuator (dB)")); WARNstatus = new Fl_Box( rightof(cntTxLevel), Y, Wwarn, Hstatus, ""); WARNstatus->box(FL_DIAMOND_DOWN_BOX); WARNstatus->color(FL_BACKGROUND_COLOR); WARNstatus->labelcolor(FL_RED); WARNstatus->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE); btnAFC = new Fl_Light_Button( rightof(WARNstatus), Y, bwAfcOnOff, Hstatus, "AFC"); btnAFC->selection_color(progdefaults.AfcColor); btnSQL = new Fl_Light_Button( rightof(btnAFC), Y, bwSqlOnOff, Hstatus, "SQL"); // btnPSQL will be resized later depending on the state of the // configuration parameter to show that widget btnPSQL = new Fl_Light_Button( rightof(btnSQL), Y, bwSqlOnOff, Hstatus, "PSM"); btnAFC->callback(cbAFC, 0); btnAFC->value(1); btnAFC->tooltip(_("Automatic Frequency Control")); btnSQL->callback(cbSQL, 0); btnSQL->selection_color(progdefaults.Sql1Color); btnSQL->value(1); btnSQL->tooltip(_("Squelch")); btnPSQL->selection_color(progdefaults.Sql1Color); btnPSQL->callback(cbPwrSQL, 0); btnPSQL->value(progdefaults.kpsql_enabled); btnPSQL->tooltip(_("Power Signal Monitor")); Fl_Group::current()->resizable(VuMeter); status_group->end(); Fl::add_handler(wo_default_handler); fl_digi_main->end(); fl_digi_main->callback(cb_wMain); fl_digi_main->resizable(wf); const struct { bool var; const char* label; } toggles[] = { { progStatus.DOCKEDSCOPE, DOCKEDSCOPE_MLABEL } }; Fl_Menu_Item* toggle; for (size_t i = 0; i < sizeof(toggles)/sizeof(*toggles); i++) { if (toggles[i].var && (toggle = getMenuItem(toggles[i].label, alt_menu_))) { toggle->set(); if (toggle->callback()) { mnu->value(toggle); toggle->do_callback(reinterpret_cast(mnu)); } } } make_scopeviewer(); noop_controls(); progdefaults.WF_UIwfcarrier = progdefaults.WF_UIwfreflevel = progdefaults.WF_UIwfampspan = progdefaults.WF_UIwfmode = progdefaults.WF_UIx1 = progdefaults.WF_UIwfshift = progdefaults.WF_UIrev = progdefaults.WF_UIwfstore = progdefaults.WF_UIxmtlock = progdefaults.WF_UIwfdrop = progdefaults.WF_UIqsy = true; wf->UI_select(true); load_counties(); createConfig(); createRecordLoader(); if (rx_only) { btnTune->deactivate(); wf->xmtrcv->deactivate(); } UI_select(); } void create_fl_digi_main(int argc, char** argv) { if (bWF_only) create_fl_digi_main_WF_only(); else create_fl_digi_main_primary(); #if defined(__WOE32__) # ifndef IDI_ICON # define IDI_ICON 101 # endif fl_digi_main->icon((char*)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON))); #elif !defined(__APPLE__) && USE_X make_pixmap(&fldigi_icon_pixmap, fldigi_icon, argc, argv); fl_digi_main->icon((char *)fldigi_icon_pixmap); #endif fl_digi_main->xclass(PACKAGE_NAME); if (bWF_only) { fl_digi_main->size_range(WMIN, WF_only_height, 0, WF_only_height); wf->setQSY(false); } else fl_digi_main->size_range(WMIN, main_hmin, 0, 0); set_colors(); } void put_freq(double frequency) { wf->carrier((int)floor(frequency + 0.5)); } void put_Bandwidth(int bandwidth) { wf->Bandwidth ((int)bandwidth); } void callback_set_metric(double metric) { pgrsSquelch->value(metric); if (active_modem->get_mode() == MODE_FSQ) ind_fsq_s2n->value(metric); if (active_modem->get_mode() == MODE_IFKP) ifkp_s2n_progress->value(metric); if (progdefaults.show_psm_btn && progStatus.kpsql_enabled) { if ((metric >= progStatus.sldrPwrSquelchValue) || inhibit_tx_seconds) btnPSQL->selection_color(progdefaults.Sql2Color); else btnPSQL->selection_color(progdefaults.Sql1Color); btnPSQL->redraw_label(); } else if(progStatus.sqlonoff) { if (metric < progStatus.sldrSquelchValue) btnSQL->selection_color(progdefaults.Sql1Color); else btnSQL->selection_color(progdefaults.Sql2Color); btnSQL->redraw_label(); } } void put_cwRcvWPM(double wpm) { int U = progdefaults.CWupperlimit; int L = progdefaults.CWlowerlimit; double dWPM = 100.0*(wpm - L)/(U - L); REQ_DROP(static_cast(&Fl_Progress::value), prgsCWrcvWPM, dWPM); REQ_DROP(static_cast(&Fl_Value_Output::value), valCWrcvWPM, (int)wpm); } void set_scope_mode(Digiscope::scope_mode md) { if (digiscope) { digiscope->mode(md); REQ(&Fl_Window::size_range, scopeview, SCOPEWIN_MIN_WIDTH, SCOPEWIN_MIN_HEIGHT, 0, 0, 0, 0, (md == Digiscope::PHASE || md == Digiscope::XHAIRS)); } wf->wfscope->mode(md); if (md == Digiscope::SCOPE) set_scope_clear_axis(); } void set_scope(double *data, int len, bool autoscale) { if (digiscope) digiscope->data(data, len, autoscale); wf->wfscope->data(data, len, autoscale); } void set_phase(double phase, double quality, bool highlight) { if (digiscope) digiscope->phase(phase, quality, highlight); wf->wfscope->phase(phase, quality, highlight); } void set_rtty(double flo, double fhi, double amp) { if (digiscope) digiscope->rtty(flo, fhi, amp); wf->wfscope->rtty(flo, fhi, amp); } void set_video(double *data, int len, bool dir) { if (digiscope) digiscope->video(data, len, dir); wf->wfscope->video(data, len, dir); } void set_zdata(cmplx *zarray, int len) { if (digiscope) digiscope->zdata(zarray, len); wf->wfscope->zdata(zarray, len); } void set_scope_xaxis_1(double y1) { if (digiscope) digiscope->xaxis_1(y1); wf->wfscope->xaxis_1(y1); } void set_scope_xaxis_2(double y2) { if (digiscope) digiscope->xaxis_2(y2); wf->wfscope->xaxis_2(y2); } void set_scope_yaxis_1(double x1) { if (digiscope) digiscope->yaxis_1(x1); wf->wfscope->yaxis_1(x1); } void set_scope_yaxis_2(double x2) { if (digiscope) digiscope->yaxis_2(x2); wf->wfscope->yaxis_2(x2); } void set_scope_colors() { if (digiscope) { digiscope->bk_color(progdefaults.digi_background); digiscope->axis_color(progdefaults.digi_axis_color); digiscope->user_color_1(progdefaults.digi_color_1); digiscope->user_color_2(progdefaults.digi_color_2); digiscope->user_color_3(progdefaults.digi_color_3); digiscope->user_color_4(progdefaults.digi_color_4); digiscope->redraw(); } wf->wfscope->bk_color(progdefaults.digi_background); wf->wfscope->axis_color(progdefaults.digi_axis_color); wf->wfscope->user_color_1(progdefaults.digi_color_1); wf->wfscope->user_color_2(progdefaults.digi_color_2); wf->wfscope->user_color_3(progdefaults.digi_color_3); wf->wfscope->user_color_4(progdefaults.digi_color_4); wf->wfscope->redraw(); } void set_scope_clear_axis() { if (digiscope) { digiscope->xaxis_1(0); digiscope->xaxis_2(0); digiscope->yaxis_1(0); digiscope->yaxis_2(0); } wf->wfscope->xaxis_1(0); wf->wfscope->xaxis_2(0); wf->wfscope->yaxis_1(0); wf->wfscope->yaxis_2(0); set_scope_colors(); } // raw buffer functions can ONLY be called by FLMAIN_TID //====================================================================== #define RAW_BUFF_LEN 4096 static char rxtx_raw_chars[RAW_BUFF_LEN+1] = ""; static char rxtx_raw_buff[RAW_BUFF_LEN+1] = ""; static int rxtx_raw_len = 0; char *get_rxtx_data() { ENSURE_THREAD(FLMAIN_TID); memset(rxtx_raw_chars, 0, RAW_BUFF_LEN+1); strcpy(rxtx_raw_chars, rxtx_raw_buff); memset(rxtx_raw_buff, 0, RAW_BUFF_LEN+1); rxtx_raw_len = 0; return rxtx_raw_chars; } void add_rxtx_char(int data) { ENSURE_THREAD(FLMAIN_TID); if (rxtx_raw_len == RAW_BUFF_LEN) { memset(rxtx_raw_buff, 0, RAW_BUFF_LEN+1); rxtx_raw_len = 0; } rxtx_raw_buff[rxtx_raw_len++] = (unsigned char)data; } //====================================================================== static char rx_raw_chars[RAW_BUFF_LEN+1] = ""; static char rx_raw_buff[RAW_BUFF_LEN+1] = ""; static int rx_raw_len = 0; static pthread_mutex_t rx_data_mutex = PTHREAD_MUTEX_INITIALIZER; char *get_rx_data() { // ENSURE_THREAD(FLMAIN_TID); guard_lock datalock(&rx_data_mutex); memset(rx_raw_chars, 0, RAW_BUFF_LEN+1); strcpy(rx_raw_chars, rx_raw_buff); memset(rx_raw_buff, 0, RAW_BUFF_LEN+1); rx_raw_len = 0; return rx_raw_chars; } void add_rx_char(int data) { // ENSURE_THREAD(FLMAIN_TID); guard_lock datalock(&rx_data_mutex); add_rxtx_char(data); if (rx_raw_len == RAW_BUFF_LEN) { memset(rx_raw_buff, 0, RAW_BUFF_LEN+1); rx_raw_len = 0; } rx_raw_buff[rx_raw_len++] = (unsigned char)data; } //====================================================================== static char tx_raw_chars[RAW_BUFF_LEN+1] = ""; static char tx_raw_buff[RAW_BUFF_LEN+1] = ""; static int tx_raw_len = 0; char *get_tx_data() { ENSURE_THREAD(FLMAIN_TID); memset(tx_raw_chars, 0, RAW_BUFF_LEN+1); strcpy(tx_raw_chars, tx_raw_buff); memset(tx_raw_buff, 0, RAW_BUFF_LEN+1); tx_raw_len = 0; return tx_raw_chars; } void add_tx_char(int data) { ENSURE_THREAD(FLMAIN_TID); add_rxtx_char(data); if (tx_raw_len == RAW_BUFF_LEN) { memset(tx_raw_buff, 0, RAW_BUFF_LEN+1); tx_raw_len = 0; } tx_raw_buff[tx_raw_len++] = (unsigned char)data; } //====================================================================== static void TTY_bell() { if (progdefaults.audibleBELL) audio_alert->alert(progdefaults.BELL_RING); } static void display_rx_data(const unsigned char data, int style) { if (data != '\r') { if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(data,style); else if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(data,style); else ReceiveText->add(data, style); } if (bWF_only) return; speak(data); if (Maillogfile) Maillogfile->log_to_file(cLogfile::LOG_RX, std::string(1, (const char)data)); if (progStatus.LOGenabled) logfile->log_to_file(cLogfile::LOG_RX, std::string(1, (const char)data)); } static void rx_parser(const unsigned char data, int style) { // assign a style to the incoming data if (extract_wrap || extract_flamp) style = FTextBase::RECV; if ((data < ' ') && iscntrl(data)) style = FTextBase::CTRL; if (wf->tmp_carrier()) style = FTextBase::ALTR; // Collapse the "\r\n" sequence into "\n". // // The 'data' variable possibly contains only a part of a multi-byte // UTF-8 character. This is not a problem. All data has passed // through a distiller before we got here, so we can be sure that // the input is valid UTF-8. All bytes of a multi-byte character // will therefore have the eight bit set and can not match either // '\r' or '\n'. static unsigned int lastdata = 0; if (data == '\n' && lastdata == '\r'); else if (data == '\r') { display_rx_data('\n', style); } else { display_rx_data(data, style); } lastdata = data; if (!(data < ' ' && iscntrl(data)) && progStatus.spot_recv) spot_recv(data); } static void put_rx_char_flmain(unsigned int data, int style) { ENSURE_THREAD(FLMAIN_TID); // possible destinations for the data enum dest_type { DEST_RECV, // ordinary received text DEST_ALTR // alternate received text }; static enum dest_type destination = DEST_RECV; static enum dest_type prev_destination = DEST_RECV; // Determine the destination of the incoming data. If the destination had // changed, clear the contents of the distiller. destination = (wf->tmp_carrier() ? DEST_ALTR : DEST_RECV); if (destination != prev_destination) { rx_chd.reset(); rx_chd.clear(); } // select a byte translation table trx_mode mode = active_modem->get_mode(); add_rx_char(data & 0xFF); if (mailclient || mailserver) rx_chd.rx((unsigned char *)ascii2[data & 0xFF]); else if (progdefaults.show_all_codes && iscntrl(data & 0xFF)) rx_chd.rx((unsigned char *)ascii3[data & 0xFF]); else if (mode == MODE_RTTY) if (data == '\a') { if (progdefaults.visibleBELL) rx_chd.rx((unsigned char *)ascii2[7]); REQ(TTY_bell); } else rx_chd.rx((unsigned char *)ascii[data & 0xFF]); else rx_chd.rx(data & 0xFF); // feed the decoded data into the RX parser if (rx_chd.data_length() > 0) { const char *ptr = rx_chd.data().data(); const char *end = ptr + rx_chd.data_length(); while (ptr < end) rx_parser((const unsigned char)*ptr++, style); rx_chd.clear(); } } static std::string rx_process_buf = ""; static std::string tx_process_buf = ""; static pthread_mutex_t rx_proc_mutex = PTHREAD_MUTEX_INITIALIZER; void put_rx_processed_char(unsigned int data, int style) { guard_lock rx_proc_lock(&rx_proc_mutex); if(style == FTextBase::XMIT) { tx_process_buf += (char) (data & 0xff); } else if(style == FTextBase::RECV) { rx_process_buf += (char) (data & 0xff); } } void disp_rx_processed_char(void) { guard_lock rx_proc_lock(&rx_proc_mutex); unsigned int index = 0; if(!rx_process_buf.empty()) { unsigned int count = rx_process_buf.size(); for(index = 0; index < count; index++) REQ(put_rx_char_flmain, rx_process_buf[index], FTextBase::RECV); rx_process_buf.clear(); } if(!tx_process_buf.empty()) { unsigned int count = tx_process_buf.size(); for(index = 0; index < count; index++) REQ(put_rx_char_flmain, tx_process_buf[index], FTextBase::XMIT); tx_process_buf.clear(); } } void put_rx_char(unsigned int data, int style) { #if BENCHMARK_MODE if (!benchmark.output.empty()) { if (unlikely(benchmark.buffer.length() + 16 > benchmark.buffer.capacity())) benchmark.buffer.reserve(benchmark.buffer.capacity() + BUFSIZ); benchmark.buffer += (char)data; } #else if (progdefaults.autoextract == true) rx_extract_add(data); if (active_modem->get_mode() == MODE_FSQ) { REQ(put_rx_char_flmain, data, style); return; } switch(data_io_enabled) { case ARQ_IO: WriteARQ(data); break; case KISS_IO: WriteKISS(data); break; } if(progdefaults.ax25_decode_enabled && data_io_enabled == KISS_IO) disp_rx_processed_char(); else REQ(put_rx_char_flmain, data, style); #endif } static std::string strSecText = ""; static void put_sec_char_flmain(char chr) { ENSURE_THREAD(FLMAIN_TID); fl_font(FL_HELVETICA, FL_NORMAL_SIZE); char s[2] = "W"; int lc = (int)ceil(fl_width(s)); int w = StatusBar->w(); int lw = (int)ceil(fl_width(StatusBar->label())); int over = 2 * lc + lw - w; if (chr >= ' ' && chr <= 'z') { if ( over > 0 ) strSecText.erase(0, (int)(1.0 * over / lc + 0.5)); strSecText.append(1, chr); StatusBar->label(strSecText.c_str()); WARNstatus->damage(); } } void put_sec_char(char chr) { REQ(put_sec_char_flmain, chr); } static void clear_status_cb(void* arg) { reinterpret_cast(arg)->label(""); } static void dim_status_cb(void* arg) { reinterpret_cast(arg)->deactivate(); } static void (*const timeout_action[STATUS_NUM])(void*) = { clear_status_cb, dim_status_cb }; struct PSM_STRUCT { Fl_Widget *w; double timeout; status_timeout action; std::string msg; }; void put_status_msg(void *d) { PSM_STRUCT *psm = (PSM_STRUCT *)d; psm->w->activate(); psm->w->label(psm->msg.c_str()); if (psm->timeout > 0.0) { Fl::remove_timeout(timeout_action[psm->action], psm->w); Fl::add_timeout(psm->timeout, timeout_action[psm->action], psm->w); } } void put_status(const char *msg, double timeout, status_timeout action) { static PSM_STRUCT ps; ps.msg.clear(); ps.msg.assign(msg); ps.timeout = timeout; ps.action = action; ps.w = StatusBar; Fl::awake(put_status_msg, (void *)&ps); } void put_Status2(const char *msg, double timeout, status_timeout action) { static PSM_STRUCT ps; ps.msg.clear(); ps.msg.assign(msg); ps.timeout = timeout; ps.action = action; ps.w = Status2; info2msg = msg; Fl::awake(put_status_msg, (void *)&ps); } void put_Status1(const char *msg, double timeout, status_timeout action) { static PSM_STRUCT ps; ps.msg.clear(); ps.msg.assign(msg); ps.timeout = timeout; ps.action = action; ps.w = Status1; info1msg = msg; if (!active_modem) return; if (progStatus.NO_RIGLOG && active_modem->get_mode() != MODE_FSQ) return; Fl::awake(put_status_msg, (void *)&ps); } void put_WARNstatus(double v) { double val = 20 * log10(v == 0 ? 1e-9 : v); if (val < progdefaults.normal_signal_level) WARNstatus->color(progdefaults.LowSignal); else if (val < progdefaults.high_signal_level ) WARNstatus->color(progdefaults.NormSignal); else if (val < progdefaults.over_signal_level) WARNstatus->color(progdefaults.HighSignal); else WARNstatus->color(progdefaults.OverSignal); WARNstatus->redraw(); } void set_CWwpm() { if (sldrCWxmtWPM) sldrCWxmtWPM->value(progdefaults.CWspeed); if (cntCW_WPM) cntCW_WPM->value(progdefaults.CWspeed); if (use_nanoIO) set_nanoWPM(progdefaults.CWspeed); } void clear_StatusMessages() { StatusBar->label(""); Status1->label(""); Status2->label(""); info1msg = ""; info2msg = ""; } void put_MODEstatus(const char* fmt, ...) { static char s[32]; va_list args; va_start(args, fmt); vsnprintf(s, sizeof(s), fmt, args); va_end(args); REQ(static_cast(&Fl_Button::label), MODEstatus, s); REQ(static_cast(&Fl_Button::redraw_label), MODEstatus); } void put_MODEstatus(trx_mode mode) { put_MODEstatus("%s", mode_info[mode].sname); } void put_rx_data(int *data, int len) { FHdisp->data(data, len); } bool idling = false; void get_tx_char_idle(void *) { idling = false; progStatus.repeatIdleTime = 0; } int Qwait_time = 0; int Qidle_time = 0; static int que_timeout = 0; bool que_ok = true; bool tx_queue_done = true; bool que_waiting = true; void post_queue_execute(void*) { if (!que_timeout) { LOG_ERROR("%s", "timed out"); return; } while (!que_ok && trx_state != STATE_RX) { que_timeout--; Fl::repeat_timeout(0.05, post_queue_execute); Fl::awake(); } trx_transmit(); } void queue_execute_after_rx(void*) { que_waiting = false; if (!que_timeout) { LOG_ERROR("%s", "timed out"); return; } while (trx_state == STATE_TX) { que_timeout--; Fl::repeat_timeout(0.05, queue_execute_after_rx); Fl::awake(); return; } que_timeout = 100; // 5 seconds Fl::add_timeout(0.05, post_queue_execute); que_ok = false; tx_queue_done = false; Tx_queue_execute(); } void do_que_execute(void *) { tx_queue_done = false; que_ok = false; Tx_queue_execute(); que_waiting = false; } char szTestChar[] = "E|I|S|T|M|O|A|V"; //std::string bools = "------"; //char testbools[7]; extern int get_fsq_tx_char(); bool disable_lowercase = false; int get_tx_char(void) { enum { STATE_CHAR, STATE_CTRL }; static int state = STATE_CHAR; if (idling || csma_idling ) { return GET_TX_CHAR_NODATA; } // Keep this a the top of the list (CSMA TX delay). if (active_modem->get_mode() == MODE_FSQ) return get_fsq_tx_char(); if (!que_ok) { return GET_TX_CHAR_NODATA; } if (Qwait_time) { return GET_TX_CHAR_NODATA; } if (Qidle_time) { return GET_TX_CHAR_NODATA; } if (macro_idle_on) { return GET_TX_CHAR_NODATA; } if ((progStatus.repeatMacro > -1) && text2repeat.length()) { std::string repeat_content; int utf8size = fl_utf8len1(text2repeat[repeatchar]); for (int i = 0; i < utf8size; i++) repeat_content += text2repeat[repeatchar + i]; repeatchar += utf8size; tx_encoder.push(repeat_content); if (repeatchar >= text2repeat.length()) { text2repeat.clear(); macros.repeat(progStatus.repeatMacro); } goto transmit; } int c; if (!macrochar.empty()) { c = macrochar[0]; macrochar.erase(0,1); start_deadman(); return c; } if (xmltest_char_available) { num_cps_chars++; start_deadman(); return xmltest_char(); } if (data_io_enabled == ARQ_IO && arq_text_available) { start_deadman(); c = arq_get_char(); return c; } else if (data_io_enabled == KISS_IO && kiss_text_available) { start_deadman(); c = kiss_get_char(); return c; } if (active_modem == cw_modem && progdefaults.QSKadjust) { start_deadman(); c = szTestChar[2 * progdefaults.TestChar]; return c; } if ( (progStatus.repeatMacro > -1) && progStatus.repeatIdleTime > 0 && !idling ) { Fl::add_timeout(progStatus.repeatIdleTime, get_tx_char_idle); idling = true; return GET_TX_CHAR_NODATA; } if ((c = tx_encoder.pop()) != -1) { start_deadman(); return(c); } if ((progStatus.repeatMacro > -1) && text2repeat.length()) { std::string repeat_content; int utf8size = fl_utf8len1(text2repeat[repeatchar]); for (int i = 0; i < utf8size; i++) repeat_content += text2repeat[repeatchar + i]; repeatchar += utf8size; tx_encoder.push(repeat_content); if (repeatchar >= text2repeat.length()) { text2repeat.clear(); macros.repeat(progStatus.repeatMacro); } goto transmit; } disable_lowercase = false; if (xmltest_char_available) { num_cps_chars++; start_deadman(); c = xmltest_char(); disable_lowercase = true; } else if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else if ((c = next_buffered_macro_char()) == 0) // preference given to buffered macro chars c = TransmitText->nextChar(); if (c == GET_TX_CHAR_ETX) { return c; } if (c == '^' && state == STATE_CHAR) { state = STATE_CTRL; if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else if ((c = next_buffered_macro_char()) == 0) // preference given to buffered macro chars c = TransmitText->nextChar(); } if (c == -1) { return(GET_TX_CHAR_NODATA); } if (state == STATE_CTRL) { state = STATE_CHAR; switch (c) { case 'a': case 'A': if (active_modem->get_mode() == MODE_IFKP) active_modem->m_ifkp_send_avatar(); else if (active_modem->get_mode() >= MODE_THOR_FIRST && active_modem->get_mode() <= MODE_THOR_LAST) active_modem->m_thor_send_avatar(); return(GET_TX_CHAR_NODATA); case 'i': case 'I': { std::string fname; if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else if ((c = next_buffered_macro_char()) == 0) // preference given to buffered macro chars c = TransmitText->nextChar(); if (c == '[') { if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else if ((c = next_buffered_macro_char()) == 0) // preference given to buffered macro chars c = TransmitText->nextChar(); while (c != ']' && c != -1) { fname += c; if (active_modem->get_mode() == MODE_IFKP) c = ifkp_tx_text->nextChar(); else if ((c = next_buffered_macro_char()) == 0) // preference given to buffered macro chars c = TransmitText->nextChar(); } if (c == -1) return (GET_TX_CHAR_NODATA); if (active_modem->get_mode() == MODE_IFKP) { ifkp_load_scaled_image(fname); return (GET_TX_CHAR_NODATA); } if (active_modem->get_mode() >= MODE_THOR_FIRST && active_modem->get_mode() <= MODE_THOR_LAST) { thor_load_scaled_image(fname); return (GET_TX_CHAR_NODATA); } active_modem->send_color_image(fname); } } return(GET_TX_CHAR_NODATA); case 'p': case 'P': TransmitText->pause(); break; case 'r': local_timed_exec = false; active_modem->set_CW_EOT(); if (active_modem->get_mode() == MODE_IFKP) REQ(&FTextTX::clear, ifkp_tx_text); else REQ(&FTextTX::clear, TransmitText); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); break; case 'R': local_timed_exec = false; active_modem->set_CW_EOT(); if (active_modem->get_mode() == MODE_IFKP) { if (ifkp_tx_text->eot()) { REQ(&FTextTX::clear, ifkp_tx_text); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); } else return(GET_TX_CHAR_NODATA); } else { REQ(&FTextTX::clear, TransmitText); REQ(Rx_queue_execute); return(GET_TX_CHAR_ETX); } break; case 'L': REQ(qso_save_now); return(GET_TX_CHAR_NODATA); break; case 'C': REQ(clearQSO); return(GET_TX_CHAR_NODATA); break; case '!': if (queue_must_rx()) { que_timeout = 400; // 20 seconds REQ(queue_execute_after_rx, (void *)0); while(que_waiting) { MilliSleep(10); Fl::awake(); } return(GET_TX_CHAR_ETX); } else { if (active_modem->get_stopflag()) { return (GET_TX_CHAR_NODATA); } REQ(do_que_execute, (void*)0); MilliSleep(10); while (do_tune_on) return (GET_TX_CHAR_NODATA); while (que_waiting) { MilliSleep(10); Fl::awake(); } return (GET_TX_CHAR_NODATA); } break; default: char utf8_char[6]; int utf8_len = fl_utf8encode(c, utf8_char); tx_encoder.push("^" + std::string(utf8_char, utf8_len)); } } else if (c == '\n') { tx_encoder.push("\r\n"); } else { char utf8_char[6]; int utf8_len = fl_utf8encode(c, utf8_char); tx_encoder.push(std::string(utf8_char, utf8_len)); } transmit: c = tx_encoder.pop(); if (c == -1) { LOG_ERROR("TX encoding conversion error: pushed content, but got nothing back"); return(GET_TX_CHAR_NODATA); } if (progdefaults.tx_lowercase && !disable_lowercase) c = fl_tolower(c); start_deadman(); return(c); } void put_echo_char(unsigned int data, int style) { // suppress print to rx widget when making timing tests if (PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) return; if(progdefaults.ax25_decode_enabled && data_io_enabled == KISS_IO) { disp_rx_processed_char(); return; } trx_mode mode = active_modem->get_mode(); if (mode == MODE_CW && progdefaults.QSKadjust) return; REQ(&add_tx_char, data & 0xFF); // select a byte translation table const char **asc = NULL;//ascii; if (mailclient || mailserver) { asc = ascii2; style = FTextBase::CTRL; } else if ((progdefaults.show_all_codes && iscntrl(data & 0xFF)) || PERFORM_CPS_TEST || active_modem->XMLRPC_CPS_TEST) asc = ascii3; // receive and convert the data static unsigned int lastdata = 0; if (data == '\r' && lastdata == '\r') // reject multiple CRs return; if (mode == MODE_RTTY && data == '\a') { if (progdefaults.visibleBELL) echo_chd.rx((unsigned char *)ascii2[7]); REQ(TTY_bell); } else if (asc == NULL) echo_chd.rx(data & 0xFF); else echo_chd.rx((unsigned char *)asc[data & 0xFF]); lastdata = data; if (Maillogfile) { std::string s = iscntrl(data & 0x7F) ? ascii2[data & 0x7F] : std::string(1, data); Maillogfile->log_to_file(cLogfile::LOG_TX, s); } if (echo_chd.data_length() > 0) { if (active_modem->get_mode() == MODE_FSQ) REQ(&FTextRX::addstr, fsq_rx_text, echo_chd.data(), style); else if (active_modem->get_mode() == MODE_IFKP) REQ(&FTextRX::addstr, ifkp_rx_text, echo_chd.data(), style); else REQ(&FTextRX::addstr, ReceiveText, echo_chd.data(), style); if (progStatus.LOGenabled) logfile->log_to_file(cLogfile::LOG_TX, echo_chd.data()); echo_chd.clear(); } } void resetRTTY() { if (active_modem->get_mode() == MODE_RTTY) trx_start_modem(active_modem); } void resetFSK() { if (active_modem->get_mode() == MODE_RTTY) active_modem->resetFSK(); } void resetOLIVIA() { trx_mode md = active_modem->get_mode(); if (md >= MODE_OLIVIA && md <= MODE_OLIVIA_64_2000) trx_start_modem(active_modem); } void resetCONTESTIA() { if (active_modem->get_mode() == MODE_CONTESTIA) trx_start_modem(active_modem); } //void updatePACKET() { // if (active_modem->get_mode() == MODE_PACKET) // trx_start_modem(active_modem); //} void resetTHOR() { trx_mode md = active_modem->get_mode(); if (md == MODE_THORMICRO || md == MODE_THOR4 || md == MODE_THOR5 || md == MODE_THOR8 || md == MODE_THOR11 || md == MODE_THOR16 || md == MODE_THOR22 || md == MODE_THOR32 || md == MODE_THOR44 || md == MODE_THOR56 || md == MODE_THOR25x4 || md == MODE_THOR50x1 || md == MODE_THOR50x2 || md == MODE_THOR100 ) trx_start_modem(active_modem); } void resetDOMEX() { trx_mode md = active_modem->get_mode(); if (md == MODE_DOMINOEXMICRO || md == MODE_DOMINOEX4 || md == MODE_DOMINOEX5 || md == MODE_DOMINOEX8 || md == MODE_DOMINOEX11 || md == MODE_DOMINOEX16 || md == MODE_DOMINOEX22 || md == MODE_DOMINOEX44 || md == MODE_DOMINOEX88 ) trx_start_modem(active_modem); } void resetSoundCard() { trx_reset(); } void setReverse(int rev) { active_modem->set_reverse(rev); } void start_tx() { if (!(active_modem->get_cap() & modem::CAP_TX)) return; trx_transmit(); } void abort_tx() { if (trx_state == STATE_TUNE) { btnTune->value(0); btnTune->do_callback(); return; } if (trx_state == STATE_TX) { queue_reset(); trx_start_modem(active_modem); } } void set_rx_tx() { abort_tx(); rx_only = false; btnTune->activate(); wf->xmtrcv->activate(); } void set_rx_only() { abort_tx(); rx_only = true; btnTune->deactivate(); wf->xmtrcv->deactivate(); } void qsy(unsigned long long rfc, int fmid) { if (rfc <= 0ULL) { rfc = wf->rfcarrier(); } if (fmid > 0) { if (active_modem->freqlocked()) active_modem->set_freqlock(false); else active_modem->set_freq(fmid); // required for modems that will not change their freq (e.g. mt63) int adj = active_modem->get_freq() - fmid; if (adj) rfc += (wf->USB() ? adj : -adj); } if (connected_to_flrig) REQ(xmlrpc_rig_set_qsy, rfc); else if (progdefaults.chkUSERIGCATis) REQ(rigCAT_set_qsy, rfc); #if USE_HAMLIB else if (progdefaults.chkUSEHAMLIBis) REQ(hamlib_set_qsy, rfc); #endif else qso_selectFreq(rfc, fmid); std::string testmode = qso_opMODE->value(); bool xcvr_useFSK = (testmode.find("RTTY") != std::string::npos); if (xcvr_useFSK) { int fmid = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift]/2; wf->carrier(fmid); } } std::map qrg_marks; qrg_mode_t last_marked_qrg; void note_qrg(bool no_dup, const char* prefix, const char* suffix, trx_mode mode, unsigned long long rfc, int afreq) { qrg_mode_t m; m.rfcarrier = (rfc ? rfc : wf->rfcarrier()); m.carrier = (afreq ? afreq : active_modem->get_freq()); m.mode = (mode < NUM_MODES ? mode : active_modem->get_mode()); if (no_dup && last_marked_qrg == m) return; last_marked_qrg = m; char buf[64]; time_t t = time(NULL); struct tm tm; gmtime_r(&t, &tm); size_t r1; if ((r1 = strftime(buf, sizeof(buf), "<<%Y-%m-%dT%H:%MZ ", &tm)) == 0) return; size_t r2; if (m.rfcarrier) r2 = snprintf(buf+r1, sizeof(buf)-r1, "%s @ %lld%c%04d>>", mode_info[m.mode].name, m.rfcarrier, (wf->USB() ? '+' : '-'), m.carrier); else r2 = snprintf(buf+r1, sizeof(buf)-r1, "%s @ %04d>>", mode_info[m.mode].name, m.carrier); if (r2 >= sizeof(buf)-r1) return; qrg_marks[buf] = m; if (prefix && *prefix) ReceiveText->addstr(prefix); ReceiveText->addstr(buf, FTextBase::QSY); ReceiveText->mark(); if (suffix && *suffix) ReceiveText->addstr(suffix); } // To be called from the main thread. void * set_xmtrcv_button_true(void) { wf->xmtrcv->value(true); wf->xmtrcv->redraw(); return (void *)0; } // To be called from the main thread. void * set_xmtrcv_button_false(void) { wf->xmtrcv->value(false); wf->xmtrcv->redraw(); return (void *)0; } // To be called from the main thread. void * set_xmtrcv_selection_color_transmitting(void) { wf->xmtrcv_selection_color(progdefaults.XmtColor); return (void *)0; } // To be called from the main thread. void * set_xmtrcv_selection_color_pending(void) { wf->xmtrcv_selection_color(FL_YELLOW); return (void *)0; } void xmtrcv_selection_color(Fl_Color clr) { wf->xmtrcv_selection_color(clr); } void xmtrcv_selection_color() { wf->xmtrcv_selection_color(progdefaults.XmtColor); } void rev_selection_color() { wf->reverse_selection_color(progdefaults.RevColor); } void xmtlock_selection_color() { wf->xmtlock_selection_color(progdefaults.LkColor); } void sql_selection_color() { if (!btnSQL) return; btnSQL->selection_color(progdefaults.Sql1Color); btnSQL->redraw(); } void afc_selection_color() { if (!btnAFC) return; btnAFC->selection_color(progdefaults.AfcColor); btnAFC->redraw(); } void rxid_selection_color() { cbRSID(NULL, NULL); } void txid_selection_color() { if (!btnTxRSID) return; btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->redraw(); } void tune_selection_color() { if (!btnTune) return; btnTune->selection_color(progdefaults.TuneColor); btnTune->redraw(); } void spot_selection_color() { if (!btnAutoSpot) return; btnAutoSpot->selection_color(progdefaults.SpotColor); btnAutoSpot->redraw(); } // additional includes needed for button references #include "rxmon.h" #include "debug_dialog.h" #include "font_browser.h" void set_default_btn_color() { Fl_Light_Button *buttons[] = { btn_ref_enable, btn_unk_enable, btn_fmt_record , btnNotifyEnabled, btnDataSourceUpdate, btnDupCheckOn, btn_WKCW_connect, btn_nanoCW_connect, btn_CW_KEYLINE_connect, btn_cw_dtr_calibrate, btn_enable_auditlog, btn_enable_fsq_heard_log, btn_enable_ifkp_audit_log, btn_enable_ifkp_heard_log, btn_nanoIO_connect, btn_nanoio_debug, btn_Nav_connect, btn_Nav_config, btn_WKFSK_connect, btnConnectTalker, btn_FSQCALL, btn_SELCAL, btn_MONITOR, btnAFC, btnSQL, btnPSQL, btnTxRSID, btnTune, btnAutoSpot }; size_t nbtns = sizeof(buttons)/sizeof(*buttons); for (size_t i = 0; i < nbtns; i++) { if (buttons[i] != NULL) { buttons[i]->selection_color(progdefaults.default_btn_color); buttons[i]->redraw(); } } Fl_Check_Button *check_buttons[] = { btn_fd_connect, btn_export_by_date, btnSelectCall, btnSelectName, btnSelectFreq, btnSelectBand, btnSelectMode, btnSelectQSOdateOn, btnSelectQSOdateOff, btnSelectTimeON, btnSelectTimeOFF, btnSelectTX_pwr, btnSelectRSTsent, btnSelectRSTrcvd, btnSelectQth, btnSelectLOC, btnSelectState, btnSelectAge, btnSelectStaCall, btnSelectStaCity, btnSelectStaGrid, btnSelectOperator, btnSelectProvince, btnSelectCountry, btnSelectNotes, btnSelectQSLrcvd, btnSelectQSLsent, btnSelecteQSLrcvd, btnSelecteQSLsent, btnSelectLOTWrcvd, btnSelectLOTWsent, btnSelectQSL_VIA, btnSelectSerialIN, btnSelectSerialOUT, btnSelectCheck, btnSelectXchgIn, btnSelectMyXchg, btnSelectCNTY, btnSelectCONT, btnSelectCQZ, btnSelectDXCC, btnSelectIOTA, btnSelectITUZ, btnSelectClass, btnSelectSection, btnSelect_cwss_serno, btnSelect_cwss_prec, btnSelect_cwss_check, btnSelect_cwss_section, btnSelect_1010, btnCabCall, btnCabFreq, btnCabMode, btnCabQSOdate, btnCabTimeOFF, btnCabRSTsent, btnCabRSTrcvd, btnCabSerialIN, btnCabSerialOUT, btnCabXchgIn, btnCabMyXchg, btnCabState, btnCabCounty, btn_dxcc_connect, btn_dxc_auto_connect, brws_order, btn_spot_when_logged, btn_dxc_hertz, source_code[0], source_code[1], source_code[2], source_code[3], source_code[4], source_code[5], source_code[6], source_code[7], source_code[8], source_code[9], source_code[10], source_code[11], source_code[12], source_code[13], source_code[14], btn_mon_xcvr_audio, btn_rxgain_x10, btn_mon_dsp_audio, btn_RxFilt_at_track, btn_mon_wf_display, btn_mon_xmt_audio, // font_browser->btn_fixed, chkNotifyFilterNWB, chkNotifyFilterLOTW, chkNotifyFilterEQSL, chkNotifyDupIgnore, chkNotifyDupBand, chkNotifyDupMode, btn_notes_address, btn_clear_notes, btnUseGroupColors, btn_show_all_codes, btn_use_wsjtx_vumeter_scale, btnDupBand, btnDupMode, btnDupTimeSpan, btnDupXchg1, btnDupState, btn599, btnCutNbrs, btnUseLeadingZeros, btnCWID, chkRSidNotifyOnly, chkRSidWideSearch, chkRSidMark, chkRSidAutoDisable, chkRSidShowAlert, chkRetainFreqLock, chkDisableFreqChange, chk_RSID_EOT, btn_post_rsid, btnsendid, btnsendvideotext, chkID_SMALL, btn_vidlimit, btn_vidmodelimit, btnConnectToMaclogger, btn_capture_maclogger_radio, btn_capture_maclogger_log, btn_capture_maclogger_lookup, btn_capture_maclogger_spot_tune, btn_capture_maclogger_spot_report, btn_enable_maclogger_log, btn_maclogger_spot_rx, btn_enable_N3FJP_log, btn_connect_to_n3fjp, btn_N3FJP_sweet_spot, btn_N3FJP_modem_carrier, btn_enable_N3FJP_RIGTX, btn_send_when_logged, btn_send_datetime_off, btn_show_eqsl_delivery, btn_submit_lotw_password, btn_lotw_quiet_mode, btn_submit_lotw, btn_show_lotw_delivery, btnEnCloudlog, btnNagMe, btnClearOnSave, btnCallUpperCase, btnAutoFillQSO, btnDateTimeSort, btndate_time_force, btnRSTindefault, btnRSTdefault, btnDisplayLogbookRead, btn_log_power_meter, btnCWuseSOMdecoding, btnCWrcvTrack, btnCWmfilt, btnCWusefarnsworth, btnQSK, btnQSKadjust, btnCW_use_paren, btnCW_prosign_display, btn_A_aelig, btn_A_umlaut, btn_A_ring, btn_O_acute, btn_O_slash, btn_O_umlaut, btn_C_cedilla, btn_E_grave, btn_E_acute, btn_N_tilde, btn_U_umlaut, btn_U_circ, btn_CW_backslash, btn_CW_apostrophe, btn_CW_quote, btn_CW_dollar_sign, btn_CW_open_paren, btn_CW_close_paren, btn_CW_colon, btn_CW_semi_colon, btn_CW_underscore, btn_CW_at_symbol, btn_CW_exclamation, btn_CW_noise0, btn_CW_noise1, btn_CW_noise2, btn_CW_noise3, btn_WK_use_pot, btn_WK_swap, btn_WK_auto_space, btn_WK_ct_space, btn_WK_paddledog, btn_WK_cut_zeronine, btn_WK_paddle_echo, btn_WK_serial_echo, btn_WK_sidetone_on, btn_WK_tone_on, btn_WK_ptt_on, btnK3NG, btn_nanoIO_pot, btn_disable_CW_PTT, chk_nanoIO_CW_io, btn_CW_KEYLINE_flrig, btn_FLRIG_CW_disable_ptt, btn_CW_KEYLINE_catport, btn_CW_KEYLINE_shared_PTT, btn_use_ICOMkeying, btn_use_ELCTkeying, btn_use_KNWDkeying, btn_use_YAESUkeying, btn_CAT_CW_disable_ptt, valDominoEX_FILTER, chkDominoEX_FEC, btnFeldHellIdle, btnBlackboard, btnHellMarquee, btn_fmt_plot_over_axis, btn_fmt_thick_lines, btn_fmt_unk_bpf_on, btn_fmt_ref_bpf_on, btn_fmt_autorecord, btn_fmt_record_wav, btn_fmt_sync_wav, btn_fmt_center_on_unknown, btn_fmt_center_on_reference, btn_fmt_center_on_median, btn_fmt_use_tabs, btn_fsq_lowercase, btn_fsq_msg_dt_stamp, btn_fsq_msg_append, btn_ifkp_lowercase, btn_ifkp_lowercase_call, btn_ifkp_freqlock, btnMT63_8bit, btnMT63_rx_integration, btnMT63_usetones, btnMT63_upper_lower, btnMT63_at500, btnMT63_centered, btnMT63_manual, btnContestia_8bit, btnContestia_start_stop_tones, btn_olivia_reset_fec, btnOlivia_8bit, btnOlivia_start_stop_tones, btnEnablePSKbrowsing, btnPSKpilot, btnPSK8Preamble, chkUOSrx, btnRxTones[0], btnRxTones[1], btnRxTones[2], btnPreferXhairScope, chk_true_scope, chk_useMARKfreq, chk_audibleBELL, chk_visibleBELL, btnAUTOCRLF, btnCRCRLF, chkUOStx, chk_shaped_rtty, chkPseudoFSK, btnFSKenabled, btnFSKshared, btnFSKreverse, btnFSKuseDTR, btnFSK_STOPBITS, btn_FSK_KEYLINE_flrig, chk_nanoIO_polarity, chk_nanoIO_FSK_io, btnSynopAdifDecoding, btnSynopKmlDecoding, btnSynopInterleaved, valTHOR_FILTER, valTHOR_PREAMBLE, valTHOR_SOFTSYMBOLS, valTHOR_SOFTBITS, btnNvtxAdifLog, btnNvtxKmlLog, btnWefaxAdifLog, btn_flrig_auto_enable, btn_flamp_auto_enable, btn_flnet_auto_enable, btn_fllog_auto_enable, btn_prog1_auto_enable, btn_prog2_auto_enable, btn_prog3_auto_enable, chkSlowCpu, chkDTMFdecode, btnKmlPurgeOnStartup, btn_kml_enabled, chkAutoExtract, chk_open_wrap_folder, chk_open_flmsg, chk_open_flmsg_print, chk_transfer__to_open_flmsg, btnPSKRepAuto, btnPSKRepLog, btnPSKRepQRG, btn_report_when_visible, btn_pskrep_autostart, btnEnableBusyChannel, btnEnable_csma, btnEnable_histogram, btn_show_psm_button, btn_auto_talk, chkRxStream, btnTXLEVEL_by_mode, btnSQLCH_by_mode, btnAFC_by_mode, btnREVERSE_by_mode, btnStartAtSweetSpot, btnCWIsLSB, btnDisable_p2p_io_widgets, btnEnable_arq, btnEnable_kiss, btnEnable_dual_port, btnKissTCPIO, btnKissUDPIO, btnKissTCPListen, btnEnable_7bit_modem_inhibit, btnEnable_auto_connect, btnEnable_ax25_decode, chk_flrig_keys_modem, btn_fldigi_client_to_flrig, btn_flrig_auto_shutdown, chkUSERIGCAT, btnRigCatEcho, btnRigCatRTSplus, btnRigCatDTRplus, chkRigCatRTSCTSflow, chk_restore_tio, chkRigCatVSP, btn_gpio_ptt2, btn_enable_gpio[0], btn_enable_gpio[1], btn_enable_gpio[2], btn_enable_gpio[3], btn_enable_gpio[4], btn_enable_gpio[5], btn_enable_gpio[6], btn_enable_gpio[7], btn_enable_gpio[8], btn_enable_gpio[9], btn_enable_gpio[10], btn_enable_gpio[11], btn_enable_gpio[12], btn_enable_gpio[13], btn_enable_gpio[14], btn_enable_gpio[15], btn_enable_gpio[16], btn_gpio_on[0], btn_gpio_on[1], btn_gpio_on[2], btn_gpio_on[3], btn_gpio_on[4], btn_gpio_on[5], btn_gpio_on[6], btn_gpio_on[7], btn_gpio_on[8], btn_gpio_on[9], btn_gpio_on[10], btn_gpio_on[11], btn_gpio_on[12], btn_gpio_on[13], btn_gpio_on[14], btn_gpio_on[15], btn_gpio_on[16], chkUSEHAMLIB, btnHamlibCMDptt, btnHamlibPTT_ON_DATA, btnHamlibDTRplus, chkHamlibRTSplus, chkHamlibRTSCTSflow, chkHamlibXONXOFFflow, chk_hamlib_cw_is_lsb, chk_hamlib_rtty_is_usb, btnPTTrightchannel, btn_gpio_ptt, btn_enable_regex_match_wa, btn_enable_mycall_match_wav, btn_enable_rsid_match_wav, btn_enable_flmsg_wav, btn_enable_flmsg_time_out_wav, chkAudioStereoOut, chkReverseAudio, btnPTTrightchannel2, btnQSK2, chkPseudoFSK2, chkReverseRxAudio, btn_use_wsjtx_vumeter_scale2, btn_record_both, btnFixedIntervals, btnMarquee, btnAscend, btnBrowserHistory, btnShowTooltips, chkMenuIcons, btn_rx_lowercase, btn_tx_lowercase, btn_save_config_on_exit, btn2_save_macros_on_exit, btn2NagMe, btn2_confirm_exit, btn_check_for_updates, btn_tx_show_timer, btnMacroMouseWheel, btnUseLastMacro, btnDisplayMacroFilename, btn_save_macros_on_exit, btn_macro_post, btn_4bar_position, btnRXClicks, btnRXTooltips, btnUSunits, btn_clear_fields, btn_rxtx_swap, btnWF_UIrev, btnWF_UIx1, btnWF_UIwfcarrier, btnWF_UIwfshift, btnWF_UIwfreflevel, btnWF_UIwfdrop, btnWF_UIwfampspan, btnWF_UIwfstore, btnWF_UIwfmode, btnWF_UIqsy, btnWF_UIxmtlock, btnUseCursorLines, btnUseWideCursor, btnUseCursorCenterLine, btnUseWideCenter, btnUseBWTracks, btnUseWideTracks, btnUseWideMonitor, chkShowAudioScale, btnViewXmtSignal, btnWFaveraging, btnWaterfallHistoryDefault, btnWaterfallQSY, btnWaterfallClickInsert, btnWFspectrum_center, btnWFspectrum_dbvals, btn_spectrum_modem_scale, btnPSKmailSweetSpot, btn_arq_s2n_report, btn_wx_full, btn_wx_station_name, btn_wx_condx, btn_wx_fahrenheit, btn_wx_celsius, btn_wx_mph, btn_wx_kph, btn_wx_inches, btn_wx_mbars, btn_wx_raw, btnNoiseOn, btnOffsetOn, btn_imd_on }; size_t ncheck_btns = sizeof(check_buttons)/sizeof(*check_buttons); for (size_t i = 0; i < ncheck_btns; i++) { if (check_buttons[i] != NULL) { check_buttons[i]->color(progdefaults.default_check_btn_color); check_buttons[i]->redraw(); } } Fl_Round_Button *round_buttons[] = { chkNotifyFilterCall, chkNotifyFilterDXCC, btnQRZWEBnotavailable, btnQRZonline, btnHAMCALLonline, btnHamQTHonline, btnCallookOnline, btnQRZXMLnotavailable, btnQRZcdrom, btnQRZsub, btnHamcall, btnHamQTH, btnCALLOOK, btn_fsqbaud[0], btn_fsqbaud[1], btn_fsqbaud[2], btn_fsqbaud[3], btn_fsqbaud[4], btn_ifkpbaud[0], btn_ifkpbaud[1], btn_ifkpbaud[2], btnRigCatCMDptt, btnRigCatRTSptt, btnRigCatDTRptt, btnTTYptt, btnSCU_17, btnUsePPortPTT, btnUseUHrouterPTT, btnRTSptt, btnRTSplusV, btnDTRptt, btnDTRplusV, btn_use_cmedia_PTT, btnAudioIO[0], btnAudioIO[1], btnAudioIO[2], btnAudioIO[3], btn_is_full_duplex, btn_enable_audio_alerts, btn_scheme_0, btn_scheme_1, btn_scheme_2, btn_scheme_3, btn_scheme_4, btn_scheme_5, btn_scheme_6, btn_scheme_7, btn_scheme_8, btn_scheme_9, btn_scheme_10, btn_scheme_11, btn_scheme_12 }; size_t nround_btns = sizeof(round_buttons)/sizeof(*round_buttons); for (size_t i = 0; i < nround_btns; i++) { if (round_buttons[i] != NULL) { round_buttons[i]->selection_color(progdefaults.default_round_btn_color); round_buttons[i]->redraw(); } } trx_mode md = active_modem->get_mode(); if ((md > MODE_WEFAX_FIRST) && (md <= MODE_WEFAX_LAST)) { wefax_round_rx_noise_removal->selection_color(progdefaults.default_btn_color); wefax_round_rx_binary->selection_color(progdefaults.default_btn_color); wefax_round_rx_non_stop->selection_color(progdefaults.default_btn_color); } } void set_colors() { set_default_btn_color(); spot_selection_color(); tune_selection_color(); txid_selection_color(); rxid_selection_color(); sql_selection_color(); afc_selection_color(); xmtlock_selection_color(); tune_selection_color(); set_log_colors(); } // Olivia void set_olivia_bw(int bw) { int i; if (bw == 125) i = 0; else if (bw == 250) i = 1; else if (bw == 500) i = 2; else if (bw == 1000) i = 3; else i = 4; bool changed = progdefaults.changed; i_listbox_olivia_bandwidth->index(i); i_listbox_olivia_bandwidth->do_callback(); progdefaults.changed = changed; } void set_olivia_tones(int tones) { unsigned i = -1; while (tones >>= 1) i++; bool changed = progdefaults.changed; i_listbox_olivia_tones->index(i);//+1); i_listbox_olivia_tones->do_callback(); progdefaults.changed = changed; } //Contestia void set_contestia_bw(int bw) { int i; if (bw == 125) i = 0; else if (bw == 250) i = 1; else if (bw == 500) i = 2; else if (bw == 1000) i = 3; else i = 4; bool changed = progdefaults.changed; i_listbox_contestia_bandwidth->index(i); i_listbox_contestia_bandwidth->do_callback(); progdefaults.changed = changed; } void set_contestia_tones(int tones) { unsigned i = -1; while (tones >>= 1) i++; bool changed = progdefaults.changed; i_listbox_contestia_tones->index(i); i_listbox_contestia_tones->do_callback(); progdefaults.changed = changed; } void set_rtty_shift(int shift) { if (shift < selCustomShift->minimum() || shift > selCustomShift->maximum()) return; // Static const array otherwise will be built at each call. static const int shifts[] = { 23, 85, 160, 170, 182, 200, 240, 350, 425, 850 }; size_t i; for (i = 0; i < sizeof(shifts)/sizeof(*shifts); i++) if (shifts[i] == shift) break; selShift->index(i); selShift->do_callback(); if (i == sizeof(shifts)/sizeof(*shifts)) { selCustomShift->value(shift); selCustomShift->do_callback(); } } void set_rtty_baud(float baud) { // Static const array otherwise will be rebuilt at each call. static const float bauds[] = { 45.0f, 45.45f, 50.0f, 56.0f, 75.0f, 100.0f, 110.0f, 150.0f, 200.0f, 300.0f }; for (size_t i = 0; i < sizeof(bauds)/sizeof(*bauds); i++) { if (bauds[i] == baud) { selBaud->index(i); selBaud->do_callback(); break; } } } void set_rtty_bits(int bits) { // Static const array otherwise will be built at each call. static const int bits_[] = { 5, 7, 8 }; for (size_t i = 0; i < sizeof(bits_)/sizeof(*bits_); i++) { if (bits_[i] == bits) { selBits->index(i); selBits->do_callback(); break; } } } void set_rtty_bw(float bw) { } int notch_frequency = 0; void notch_on(int freq) { notch_frequency = freq; if (progdefaults.fldigi_client_to_flrig) set_flrig_notch(); else rigCAT_set_notch(notch_frequency); } void notch_off() { notch_frequency = 0; if (progdefaults.fldigi_client_to_flrig) set_flrig_notch(); else rigCAT_set_notch(notch_frequency); } void enable_kiss(void) { if(btnEnable_arq->value()) { btnEnable_arq->value(false); } progdefaults.changed = true; progdefaults.data_io_enabled = KISS_IO; progStatus.data_io_enabled = KISS_IO; data_io_enabled = KISS_IO; btnEnable_kiss->value(true); enable_disable_kpsql(); } void enable_arq(void) { if(btnEnable_kiss->value()) { btnEnable_kiss->value(false); } progdefaults.changed = true; progdefaults.data_io_enabled = ARQ_IO; progStatus.data_io_enabled = ARQ_IO; data_io_enabled = ARQ_IO; btnEnable_arq->value(true); enable_disable_kpsql(); } void enable_disable_kpsql(void) { if (progdefaults.data_io_enabled == KISS_IO) { check_kiss_modem(); //btnPSQL->activate(); //if(progStatus.kpsql_enabled || progdefaults.kpsql_enabled) { // btnPSQL->value(true); // btnPSQL->do_callback(); //} } else { sldrSquelch->value(progStatus.sldrSquelchValue); //btnPSQL->value(false); //btnPSQL->deactivate(); } progStatus.data_io_enabled = progdefaults.data_io_enabled; } void disable_config_p2p_io_widgets(void) { btnEnable_arq->deactivate(); btnEnable_kiss->deactivate(); btnEnable_ax25_decode->deactivate(); //btnEnable_csma->deactivate(); txtKiss_ip_address->deactivate(); txtKiss_ip_io_port_no->deactivate(); txtKiss_ip_out_port_no->deactivate(); btnEnable_dual_port->deactivate(); //btnEnableBusyChannel->deactivate(); //cntKPSQLAttenuation->deactivate(); //cntBusyChannelSeconds->deactivate(); btnDefault_kiss_ip->deactivate(); btn_restart_kiss->deactivate(); btnEnable_7bit_modem_inhibit->deactivate(); btnEnable_auto_connect->deactivate(); btnKissTCPIO->deactivate(); btnKissUDPIO->deactivate(); btnKissTCPListen->deactivate(); btn_connect_kiss_io->deactivate(); txtArq_ip_address->deactivate(); txtArq_ip_port_no->deactivate(); btnDefault_arq_ip->deactivate(); btn_restart_arq->deactivate(); txtXmlrpc_ip_address->deactivate(); txtXmlrpc_ip_port_no->deactivate(); btnDefault_xmlrpc_ip->deactivate(); btn_restart_xml->deactivate(); txt_flrig_ip_address->deactivate(); txt_flrig_ip_port->deactivate(); btnDefault_flrig_ip->deactivate(); btn_reconnect_flrig_server->deactivate(); txt_fllog_ip_address->deactivate(); txt_fllog_ip_port->deactivate(); btnDefault_fllog_ip->deactivate(); btn_reconnect_log_server->deactivate(); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void enable_config_p2p_io_widgets(void) { btnEnable_arq->activate(); btnEnable_kiss->activate(); btnEnable_ax25_decode->activate(); //btnEnable_csma->activate(); txtKiss_ip_address->activate(); txtKiss_ip_io_port_no->activate(); txtKiss_ip_out_port_no->activate(); btnEnable_dual_port->activate(); //btnEnableBusyChannel->activate(); //cntKPSQLAttenuation->activate(); //cntBusyChannelSeconds->activate(); btnDefault_kiss_ip->activate(); btn_restart_kiss->activate(); btnEnable_7bit_modem_inhibit->activate(); btnEnable_auto_connect->activate(); btnKissTCPIO->activate(); btnKissUDPIO->activate(); btnKissTCPListen->activate(); btn_connect_kiss_io->activate(); txtArq_ip_address->activate(); txtArq_ip_port_no->activate(); btnDefault_arq_ip->activate(); btn_restart_arq->activate(); txtXmlrpc_ip_address->activate(); txtXmlrpc_ip_port_no->activate(); btnDefault_xmlrpc_ip->activate(); btn_restart_xml->activate(); txt_flrig_ip_address->activate(); txt_flrig_ip_port->activate(); btnDefault_flrig_ip->activate(); btn_reconnect_flrig_server->activate(); txt_fllog_ip_address->activate(); txt_fllog_ip_port->activate(); btnDefault_fllog_ip->activate(); btn_reconnect_log_server->activate(); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void set_ip_to_default(int which_io) { switch(which_io) { case ARQ_IO: txtArq_ip_address->value(DEFAULT_ARQ_IP_ADDRESS); txtArq_ip_port_no->value(DEFAULT_ARQ_IP_PORT); txtArq_ip_address->do_callback(); txtArq_ip_port_no->do_callback(); break; case KISS_IO: txtKiss_ip_address->value(DEFAULT_KISS_IP_ADDRESS); txtKiss_ip_io_port_no->value(DEFAULT_KISS_IP_IO_PORT); txtKiss_ip_out_port_no->value(DEFAULT_KISS_IP_OUT_PORT); btnEnable_dual_port->value(false); txtKiss_ip_address->do_callback(); txtKiss_ip_io_port_no->do_callback(); txtKiss_ip_out_port_no->do_callback(); btnEnable_dual_port->do_callback(); break; case XMLRPC_IO: txtXmlrpc_ip_address->value(DEFAULT_XMLPRC_IP_ADDRESS); txtXmlrpc_ip_port_no->value(DEFAULT_XMLRPC_IP_PORT); txtXmlrpc_ip_address->do_callback(); txtXmlrpc_ip_port_no->do_callback(); break; case FLRIG_IO: txt_flrig_ip_address->value(DEFAULT_FLRIG_IP_ADDRESS); txt_flrig_ip_port->value(DEFAULT_FLRIG_IP_PORT); txt_flrig_ip_address->do_callback(); txt_flrig_ip_port->do_callback(); break; case FLLOG_IO: txt_fllog_ip_address->value(DEFAULT_FLLOG_IP_ADDRESS); txt_fllog_ip_port->value(DEFAULT_FLLOG_IP_PORT); txt_fllog_ip_address->do_callback(); txt_fllog_ip_port->do_callback(); break; } } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void kiss_io_set_button_state(void *ptr) { if(progStatus.kiss_tcp_io) { btn_connect_kiss_io->activate(); btn_connect_kiss_io->redraw(); btnKissTCPIO->activate(); btnKissTCPIO->value(true); btnKissTCPListen->activate(); btnKissUDPIO->value(false); btnKissUDPIO->activate(); btnEnable_dual_port->deactivate(); } else { btn_connect_kiss_io->activate(); btnKissTCPIO->value(false); btnKissTCPIO->activate(); btnKissTCPListen->activate(); btnKissUDPIO->value(true); btnKissUDPIO->activate(); btnEnable_dual_port->activate(); } char *label = (char *)0; if(ptr) label = (char *)ptr; if(label) { btn_connect_kiss_io->label(label); btn_connect_kiss_io->redraw(); } if(progStatus.ip_lock) { btn_connect_kiss_io->deactivate(); btnKissTCPIO->deactivate(); btnKissUDPIO->deactivate(); btnKissTCPListen->deactivate(); btnEnable_dual_port->deactivate(); } } //----------------------------------------------------------------------------- // Update CSMA Display Widgets in the IO Configuration Panel //----------------------------------------------------------------------------- void update_csma_io_config(int which) { char buf[32]; if(which & CSMA_PERSISTANCE) { cntPersistance->value(progStatus.csma_persistance); if(progStatus.csma_persistance >= 0) { float results = ((progStatus.csma_persistance + 1) / 256.0) * 100.0; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%f", results); OutputPersistancePercent->value(buf); } } if(which & CSMA_SLOT_TIME) { cntSlotTime->value(progStatus.csma_slot_time); int results = progStatus.csma_slot_time * 10; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%d", results); OutputSlotTimeMS->value(buf); } if(which & CSMA_TX_DELAY) { cntTransmitDelay->value(progStatus.csma_transmit_delay); int results = progStatus.csma_transmit_delay * 10; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%d", results); OutputTransmitDelayMS->value(buf); } } //----------------------------------------------------------------------------- // Set PSM configuration panel defaults values. //----------------------------------------------------------------------------- void psm_set_defaults(void) { progdefaults.csma_persistance = progStatus.csma_persistance = 63; progdefaults.csma_slot_time = progStatus.csma_slot_time = 10; progdefaults.csma_transmit_delay = progStatus.csma_transmit_delay = 50; progdefaults.psm_flush_buffer_timeout = progStatus.psm_flush_buffer_timeout = 15; progdefaults.psm_minimum_bandwidth_margin = progStatus.psm_minimum_bandwidth_margin = 10; progdefaults.psm_histogram_offset_threshold = progStatus.psm_histogram_offset_threshold = 3; progdefaults.psm_hit_time_window = progStatus.psm_hit_time_window = 15; progdefaults.kpsql_attenuation = progStatus.kpsql_attenuation = 2; progdefaults.busyChannelSeconds = progStatus.busyChannelSeconds = 3; cntPersistance->value(progStatus.csma_persistance); cntSlotTime->value(progStatus.csma_slot_time); cntTransmitDelay->value(progStatus.csma_transmit_delay); cntPSMTXBufferFlushTimer->value(progStatus.psm_flush_buffer_timeout); cntPSMBandwidthMargins->value(progStatus.psm_minimum_bandwidth_margin); cntPSMThreshold->value(progStatus.psm_histogram_offset_threshold); cntPSMValidSamplePeriod->value(progStatus.psm_hit_time_window); cntKPSQLAttenuation->value(progdefaults.kpsql_attenuation); cntBusyChannelSeconds->value(progStatus.busyChannelSeconds); update_csma_io_config(CSMA_ALL); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void set_CSV(int start) { if (active_modem->get_mode() == MODE_ANALYSIS) { if (active_modem->get_mode() != MODE_ANALYSIS) return; if (start == 1) active_modem->start_csv(); else if (start == 0) active_modem->stop_csv(); else if (active_modem->write_to_csv == true) active_modem->stop_csv(); else active_modem->start_csv(); } } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- void set_freq_control_lsd() { qsoFreqDisp1->set_lsd(progdefaults.sel_lsd); qsoFreqDisp2->set_lsd(progdefaults.sel_lsd); qsoFreqDisp3->set_lsd(progdefaults.sel_lsd); } //----------------------------------------------------------------------------- // FSQ mode control interface functions //----------------------------------------------------------------------------- std::string fsq_selected_call = "allcall"; static int heard_picked; void clear_heard_list(); void cb_heard_delete(Fl_Widget *w, void *) { int sel = fl_choice2(_("Delete entry?"), _("All"), _("No"), _("Yes")); if (sel == 2) { fsq_heard->remove(heard_picked); fsq_heard->redraw(); } if (sel == 0) clear_heard_list(); } void cb_heard_copy(Fl_Widget *w, void *) { // copy to clipboard Fl::copy(fsq_selected_call.c_str(), fsq_selected_call.length(), 1); } void cb_heard_copy_to_log(Fl_Widget *w, void *) { inpCall->value(fsq_selected_call.c_str()); cb_call(inpCall, (void *)0); } void cb_heard_copy_all(Fl_Widget *w, void *) { if (fsq_heard->size() < 2) return; fsq_selected_call.clear(); for (int i = 2; i <= fsq_heard->size(); i++) { fsq_selected_call.append(fsq_heard->text(i)); size_t p = fsq_selected_call.find(','); if (p != std::string::npos) fsq_selected_call.erase(p); fsq_selected_call.append(" "); } Fl::copy(fsq_selected_call.c_str(), fsq_selected_call.length(), 1); } void cb_heard_query_snr(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("?"); fsq_xmt(s); } void cb_heard_query_heard(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("$"); fsq_xmt(s); } void cb_heard_query_at(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("@"); fsq_xmt(s); } void cb_heard_query_carat(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("^^"); fsq_xmt(s); } void cb_heard_query_amp(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("&"); fsq_xmt(s); } void cb_heard_send_file(Fl_Widget *w, void *) { std::string deffilename = TempDir; deffilename.append("fsq.txt"); const char* p = FSEL::select( "Select send file", "*.txt", deffilename.c_str()); if (!p) return; if (!*p) return; std::string fname = fl_filename_name(p); std::ifstream txfile(p); if (!txfile) return; std::stringstream text; char ch = txfile.get(); while (!txfile.eof()) { text << ch; ch = txfile.get(); } txfile.close(); std::string s = fsq_selected_call.c_str(); s.append("#["); s.append(fname.c_str()); s.append("]\n"); s.append(text.str().c_str()); fsq_xmt(s); } void cb_heard_read_file(Fl_Widget *w, void*) { const char *p = fl_input2("File name"); if (p == NULL) return; std::string fname = p; if (fname.empty()) return; std::string s = fsq_selected_call.c_str(); s.append("+["); s.append(fname.c_str()); s.append("]^r"); fsq_xmt(s); } void cb_heard_query_plus(Fl_Widget *w, void *) { std::string s = fsq_selected_call.c_str(); s.append("+"); fsq_xmt(s); } void cb_heard_send_msg(Fl_Widget *w, void*) { const char *p = fl_input2("Send message"); if (p == NULL) return; std::string msg = p; if (msg.empty()) return; std::string s = fsq_selected_call.c_str(); s.append("#["); s.append(active_modem->fsq_mycall()); s.append("]"); s.append(msg.c_str()); fsq_xmt(s); } void cb_heard_send_image(Fl_Widget *w, void *) { fsq_showTxViewer('L'); } static Fl_Menu_Item *heard_popup; static Fl_Menu_Item all_popup[] = { { "Copy", 0, cb_heard_copy, 0 }, { "Copy All", 0, cb_heard_copy_all, 0 , FL_MENU_DIVIDER }, { "Send File To... (#)", 0, cb_heard_send_file, 0, FL_MENU_DIVIDER }, { "Send Image To... (%)", 0, cb_heard_send_image, 0 }, { 0, 0, 0, 0 } }; static Fl_Menu_Item directed_popup[] = { { "Copy", 0, cb_heard_copy, 0 }, { "Log call", 0, cb_heard_copy_to_log, 0 }, { "Copy All", 0, cb_heard_copy_all, 0 }, { "Delete", 0, cb_heard_delete, 0, FL_MENU_DIVIDER }, { "Query SNR (?)", 0, cb_heard_query_snr, 0 }, { "Query Heard ($)", 0, cb_heard_query_heard, 0 }, { "Query Location (@@)", 0, cb_heard_query_at, 0 }, { "Query Station Msg (&&)", 0, cb_heard_query_amp, 0 }, { "Query program version (^)", 0, cb_heard_query_carat, 0, FL_MENU_DIVIDER }, { "Send Message To... (#)", 0, cb_heard_send_msg, 0 }, { "Read Messages From (+)", 0, cb_heard_query_plus, 0, FL_MENU_DIVIDER }, { "Send File To... (#)", 0, cb_heard_send_file, 0 }, { "Read File From... (+)", 0, cb_heard_read_file, 0, FL_MENU_DIVIDER }, { "Send Image To... (%)", 0, cb_heard_send_image, 0 }, { 0, 0, 0, 0 } }; std::string heard_list() { std::string heard; if (fsq_heard->size() < 2) return heard; for (int i = 2; i <= fsq_heard->size(); i++) heard.append(fsq_heard->text(i)).append("\n"); heard.erase(heard.length() - 1); // remove last LF size_t p = heard.find(","); while (p != std::string::npos) { heard.insert(p+1," "); p = heard.find(",", p+2); } return heard; } void clear_heard_list() { if (active_modem->get_mode() == MODE_FSQ) { fsq_heard->clear(); fsq_heard->add("allcall"); fsq_heard->redraw(); } else { ifkp_heard->clear(); ifkp_heard->redraw(); } } int tm2int(std::string s) { int t = (s[2]-'0')*10 + s[3] - '0'; t += 60*((s[0] - '0')*10 + s[1] - '0'); return t * 60; } void age_heard_list() { std::string entry; std::string now = ztime(); now.erase(4); int tnow = tm2int(now); std::string tm; int aging_secs; switch (progdefaults.fsq_heard_aging) { case 1: aging_secs = 60; break; // 1 minute case 2: aging_secs = 300; break; // 5 minutes case 3: aging_secs = 600; break; // 10 minutes case 4: aging_secs = 1200; break; // 20 minutes case 5: aging_secs = 1800; break; // 30 minutes case 6: aging_secs = 3600; break; // 60 minutes case 7: aging_secs = 5400; break; // 90 minutes case 8: aging_secs = 7200; break; // 120 minutes case 0: default: return; // no aging } if (active_modem->get_mode() == MODE_FSQ) { if (fsq_heard->size() < 2) return; for (int i = fsq_heard->size(); i > 1; i--) { entry = fsq_heard->text(i); size_t pos = entry.find(","); tm = entry.substr(pos+1,5); tm.erase(2,1); int tdiff = tnow - tm2int(tm); if (tdiff < 0) tdiff += 24*60*60; if (tdiff >= aging_secs) fsq_heard->remove(i); } fsq_heard->redraw(); } else { if (ifkp_heard->size() == 0) return; for (int i = ifkp_heard->size(); i > 0; i--) { entry = ifkp_heard->text(i); size_t pos = entry.find(","); tm = entry.substr(pos+1,5); tm.erase(2,1); int tdiff = tnow - tm2int(tm); if (tdiff < 0) tdiff += 24*60*60; if (tdiff >= aging_secs) ifkp_heard->remove(i); } ifkp_heard->redraw(); } } void add_to_heard_list(std::string szcall, std::string szdb) { int found = 0; size_t pos_comma; std::string testcall; std::string line; std::string time = inpTimeOff->value(); std::string str = szcall; str.append(","); str += time[0]; str += time[1]; str += ':'; str += time[2]; str += time[3]; str.append(",").append(szdb); if (active_modem->get_mode() == MODE_FSQ) { if (fsq_heard->size() < 2) { fsq_heard->add(str.c_str()); } else { for (int i = 2; i <= fsq_heard->size(); i++) { line = fsq_heard->text(i); pos_comma = line.find(","); if (pos_comma != std::string::npos) { testcall = line.substr(0, pos_comma); if (testcall == szcall) { found = i; break; } } } if (found) fsq_heard->remove(found); fsq_heard->insert(2, str.c_str()); } fsq_heard->redraw(); } else { if (ifkp_heard->size() == 0) { ifkp_heard->add(str.c_str()); } else { for (int i = 1; i <= ifkp_heard->size(); i++) { line = ifkp_heard->text(i); pos_comma = line.find(","); if (pos_comma != std::string::npos) { testcall = line.substr(0, pos_comma); if (testcall == szcall) { found = i; break; } } } if (found) ifkp_heard->remove(found); ifkp_heard->insert(1, str.c_str()); } ifkp_heard->redraw(); } if (progStatus.spot_recv) spot_log( szcall.c_str(), inpLoc->value()); } bool in_heard(std::string call) { std::string line; for (int i = 1; i <= fsq_heard->size(); i++) { line = fsq_heard->text(i); if (line.find(call) == 0) return true; } return false; } void fsq_repeat_last_heard() { fsq_tx_text->add(fsq_selected_call.c_str()); } void cb_fsq_heard(Fl_Browser*, void*) { heard_picked = fsq_heard->value(); if (!heard_picked) return; int k = Fl::event_key(); fsq_selected_call = fsq_heard->text(heard_picked); size_t p = fsq_selected_call.find(','); if (p != std::string::npos) fsq_selected_call.erase(p); switch (k) { case FL_Button + FL_LEFT_MOUSE: if (Fl::event_clicks()) { if (!fsq_tx_text->eot()) fsq_tx_text->add(" "); fsq_tx_text->add(fsq_selected_call.c_str()); } break; case FL_Button + FL_RIGHT_MOUSE: if (heard_picked == 1) heard_popup = all_popup; else heard_popup = directed_popup; const Fl_Menu_Item *m = heard_popup->popup(Fl::event_x(), Fl::event_y()); if (m && m->callback()) m->do_callback(0); break; } restoreFocus(); } void cb_ifkp_heard(Fl_Browser*, void*) { heard_picked = ifkp_heard->value(); if (!heard_picked) return; int k = Fl::event_key(); std::string selected_call = ifkp_heard->text(heard_picked); size_t p = selected_call.find(','); if (p != std::string::npos) selected_call.erase(p); switch (k) { case FL_Button + FL_LEFT_MOUSE: if (Fl::event_clicks()) { ifkp_tx_text->add(" "); ifkp_tx_text->add(selected_call.c_str()); } break; case FL_Button + FL_RIGHT_MOUSE: ifkp_heard->remove(heard_picked); break; } restoreFocus(); } static void do_fsq_rx_text(std::string text, int style) { for (size_t n = 0; n < text.length(); n++) rx_parser( text[n], style ); } void display_fsq_rx_text(std::string text, int style) { REQ(do_fsq_rx_text, text, style); } void display_fsq_mon_text(std::string text, int style) { REQ(&FTextRX::addstr, fsq_monitor, text, style); } void cbFSQQTC(Fl_Widget *w, void *d) { int mouse = Fl::event_button(); if (mouse == FL_RIGHT_MOUSE) { open_config(TAB_FSQ); return; } fsq_tx_text->add(progdefaults.fsqQTCtext.c_str()); restoreFocus(); } void cbFSQQTH(Fl_Widget *w, void *d) { int mouse = Fl::event_button(); if (mouse == FL_RIGHT_MOUSE) { open_config(TAB_FSQ); return; } fsq_tx_text->add(progdefaults.myQth.c_str()); restoreFocus(); } void cbFSQCQ(Fl_Widget *w, void *d) { fsq_xmt("cqcqcq"); restoreFocus(); } void cbMONITOR(Fl_Widget *w, void *d) { Fl_Light_Button *btn = (Fl_Light_Button *)w; if (btn->value() == 1) open_fsqMonitor(); else { progStatus.fsqMONITORxpos = fsqMonitor->x(); progStatus.fsqMONITORypos = fsqMonitor->y(); progStatus.fsqMONITORwidth = fsqMonitor->w(); progStatus.fsqMONITORheight = fsqMonitor->h(); fsqMonitor->hide(); } } void close_fsqMonitor() { if (!fsqMonitor) return; btn_MONITOR->value(0); progStatus.fsqMONITORxpos = fsqMonitor->x(); progStatus.fsqMONITORypos = fsqMonitor->y(); progStatus.fsqMONITORwidth = fsqMonitor->w(); progStatus.fsqMONITORheight = fsqMonitor->h(); fsqMonitor->hide(); } void cbSELCAL(Fl_Widget *w, void *d) { Fl_Light_Button *btn = (Fl_Light_Button *)w; int val = btn->value(); if (val) { btn->label("ACTIVE"); } else { btn->label("ASLEEP"); } btn->redraw_label(); restoreFocus(); } void enableSELCAL() { btn_SELCAL->value(1); cbSELCAL(btn_SELCAL, (void *)0); } void cbFSQCALL(Fl_Widget *w, void *d) { Fl_Light_Button *btn = (Fl_Light_Button *)w; int mouse = Fl::event_button(); int val = btn->value(); if (mouse == FL_LEFT_MOUSE) { progdefaults.fsq_directed = val; progdefaults.changed = true; if (val == 0) { btn_SELCAL->value(0); btn_SELCAL->deactivate(); btn->label("FSQ-OFF"); btn->redraw_label(); } else { btn_SELCAL->activate(); btn_SELCAL->value(1); cbSELCAL(btn_SELCAL, 0); btn->label("FSQ-ON"); btn->redraw_label(); } } restoreFocus(); } //====================================================================== //FeldHell resizable Rx character height //====================================================================== extern pthread_mutex_t feld_mutex; void FHdisp_char_height() { guard_lock raster_lock(&feld_mutex); int rh = progdefaults.HellRcvHeight = (int)valHellRcvHeight->value(); rh = FHdisp->change_rowheight(rh); if (rh != progdefaults.HellRcvHeight) { progdefaults.HellRcvHeight = rh; valHellRcvHeight->value(rh); valHellRcvHeight->redraw(); fl_alert2("Selection too large for current Rx height\nIncrease Rx height"); } else progdefaults.changed = true; trx_mode mode = active_modem->get_mode(); if ( (mode >= MODE_HELL_FIRST) && (mode <= MODE_HELL_LAST) ) active_modem->rx_init(); // adjust upper/lower bounds of Rx/Tx panel minhtext = 2 * progdefaults.HellRcvHeight + 4;//6; minbox->resize( text_panel->x(), text_panel->y() + minhtext, text_panel->w() - 100, text_panel->h() - 2*minhtext); minbox->redraw(); // UI_select(); } void VuMeter_cb(vumeter *vu, void *d) { VuMeter->hide(); StatusBar->show(); progStatus.vumeter_shown = 0; } void StatusBar_cb(Fl_Box *bx, void *d) { StatusBar->hide(); VuMeter->show(); progStatus.vumeter_shown = 1; } void change_menu_fonts( Fl_Font font, int size) { for (int i = 0; i < main_menu_size; i++) { if (menu_[i].text) { menu_[i].labelfont_ = font; menu_[i].labelsize_ = size; } } mnuFrame->redraw(); for (size_t n = 0; n < sizeof(quick_change_ifkp) / sizeof(*quick_change_ifkp); n++) { quick_change_ifkp[n].labelfont_ = font; quick_change_ifkp[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_fsq) / sizeof(*quick_change_fsq); n++) { quick_change_fsq[n].labelfont_ = font; quick_change_fsq[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_rtty) / sizeof(*quick_change_rtty); n++) { quick_change_rtty[n].labelfont_ = font; quick_change_rtty[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_contestia) / sizeof(*quick_change_contestia); n++) { quick_change_contestia[n].labelfont_ = font; quick_change_contestia[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_olivia) / sizeof(*quick_change_olivia); n++) { quick_change_olivia[n].labelfont_ = font; quick_change_olivia[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_throb) / sizeof(*quick_change_throb); n++) { quick_change_throb[n].labelfont_ = font; quick_change_throb[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_feld) / sizeof(*quick_change_feld); n++) { quick_change_feld[n].labelfont_ = font; quick_change_feld[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_domino) / sizeof(*quick_change_domino); n++) { quick_change_domino[n].labelfont_ = font; quick_change_domino[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_thor) / sizeof(*quick_change_thor); n++) { quick_change_thor[n].labelfont_ = font; quick_change_thor[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_mt63) / sizeof(*quick_change_mt63); n++) { quick_change_mt63[n].labelfont_ = font; quick_change_mt63[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_navtex) / sizeof(*quick_change_navtex); n++) { quick_change_navtex[n].labelfont_ = font; quick_change_navtex[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_wefax) / sizeof(*quick_change_wefax); n++) { quick_change_wefax[n].labelfont_ = font; quick_change_wefax[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_mfsk) / sizeof(*quick_change_mfsk); n++) { quick_change_mfsk[n].labelfont_ = font; quick_change_mfsk[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_psk_multi) / sizeof(*quick_change_psk_multi); n++) { quick_change_psk_multi[n].labelfont_ = font; quick_change_psk_multi[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_psk) / sizeof(*quick_change_psk); n++) { quick_change_psk[n].labelfont_ = font; quick_change_psk[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_psk_multiR) / sizeof(*quick_change_psk_multiR); n++) { quick_change_psk_multiR[n].labelfont_ = font; quick_change_psk_multiR[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_pskr) / sizeof(*quick_change_pskr); n++) { quick_change_pskr[n].labelfont_ = font; quick_change_pskr[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_ofdm) / sizeof(*quick_change_ofdm); n++) { quick_change_ofdm[n].labelfont_ = font; quick_change_ofdm[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_8psk) / sizeof(*quick_change_8psk); n++) { quick_change_8psk[n].labelfont_ = font; quick_change_8psk[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(quick_change_qpsk) / sizeof(*quick_change_qpsk); n++) { quick_change_qpsk[n].labelfont_ = font; quick_change_qpsk[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(all_popup) / sizeof(*all_popup); n++) { all_popup[n].labelfont_ = font; all_popup[n].labelsize_ = size; } for (size_t n = 0; n < sizeof(directed_popup) / sizeof(*directed_popup); n++) { directed_popup[n].labelfont_ = font; directed_popup[n].labelsize_ = size; } int timer_width = 75 * size / 12; int btn_width = 50 * size / 12; btnMacroTimer->labelsize(size); btnMacroTimer->labelfont(font); btnMacroTimer->redraw_label(); btnMacroTimer->resize(fl_digi_main->w() - btn_width, 0, btn_width, Hmenu); btnMacroTimer->redraw(); btnTune->labelsize(size); btnTune->labelfont(font); btnTune->redraw_label(); btnTune->resize(btnMacroTimer->x() - btn_width, 0, btn_width, Hmenu); btnTune->redraw(); btnTxRSID->labelsize(size); btnTxRSID->labelfont(font); btnTxRSID->redraw_label(); btnTxRSID->resize(btnTune->x() - btn_width, 0, btn_width, Hmenu); btnTxRSID->redraw(); btnRSID->labelsize(size); btnRSID->labelfont(font); btnRSID->redraw_label(); btnRSID->resize(btnTxRSID->x() - btn_width, 0, btn_width, Hmenu); btnRSID->redraw(); btnAutoSpot->labelsize(size); btnAutoSpot->labelfont(font); btnAutoSpot->redraw_label(); btnAutoSpot->resize(btnRSID->x() - btn_width, 0, btn_width, Hmenu); btnAutoSpot->redraw(); tx_timer->labelsize(size); tx_timer->labelfont(font); tx_timer->redraw_label(); tx_timer->resize(btnAutoSpot->x() - timer_width, 0, timer_width, Hmenu); tx_timer->redraw(); } fldigi-4.2.05/src/dialogs/notifydialog.cxx0000664000175000017500000004205214611711171015413 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "gettext.h" #include "notifydialog.h" #include #include "notify.h" Fl_Group *grpNotifyEvent=(Fl_Group *)0; Fl_Choice *mnuNotifyEvent=(Fl_Choice *)0; Fl_Light_Button *btnNotifyEnabled=(Fl_Light_Button *)0; Fl_Input2 *inpNotifyRE=(Fl_Input2 *)0; Fl_Group *grpNotifyFilter=(Fl_Group *)0; Fl_Round_Button *chkNotifyFilterCall=(Fl_Round_Button *)0; static void cb_chkNotifyFilterCall(Fl_Round_Button* o, void*) { if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->show(); btnNotifyFilterDXCC->hide(); chkNotifyFilterDXCC->value(0); } Fl_Input2 *inpNotifyFilterCall=(Fl_Input2 *)0; Fl_Round_Button *chkNotifyFilterDXCC=(Fl_Round_Button *)0; static void cb_chkNotifyFilterDXCC(Fl_Round_Button* o, void*) { if (!o->value()) { o->value(1); return; } inpNotifyFilterCall->hide(); btnNotifyFilterDXCC->show(); chkNotifyFilterCall->value(0); } Fl_Button *btnNotifyFilterDXCC=(Fl_Button *)0; Fl_Check_Button *chkNotifyFilterNWB=(Fl_Check_Button *)0; Fl_Check_Button *chkNotifyFilterLOTW=(Fl_Check_Button *)0; Fl_Check_Button *chkNotifyFilterEQSL=(Fl_Check_Button *)0; Fl_Group *grpNotifyDup=(Fl_Group *)0; Fl_Check_Button *chkNotifyDupIgnore=(Fl_Check_Button *)0; Fl_Choice *mnuNotifyDupWhich=(Fl_Choice *)0; Fl_Spinner2 *cntNotifyDupTime=(Fl_Spinner2 *)0; Fl_Check_Button *chkNotifyDupBand=(Fl_Check_Button *)0; Fl_Check_Button *chkNotifyDupMode=(Fl_Check_Button *)0; Fl_Group *grpNotifyAction=(Fl_Group *)0; Fl_Spinner2 *cntNotifyActionLimit=(Fl_Spinner2 *)0; Fl_Input2 *inpNotifyActionDialog=(Fl_Input2 *)0; Fl_Button *btnNotifyActionDialogDefault=(Fl_Button *)0; Fl_Spinner2 *cntNotifyActionDialogTimeout=(Fl_Spinner2 *)0; Fl_Input2 *inpNotifyActionRXMarker=(Fl_Input2 *)0; Fl_Button *btnNotifyActionMarkerDefault=(Fl_Button *)0; Fl_Input2 *inpNotifyActionMacro=(Fl_Input2 *)0; Fl_Button *btnNotifyActionMacro=(Fl_Button *)0; Fl_Input2 *inpNotifyActionProgram=(Fl_Input2 *)0; Fl_Button *btnNotifyActionProgram=(Fl_Button *)0; Fl_Button *btnNotifyAdd=(Fl_Button *)0; Fl_Button *btnNotifyRemove=(Fl_Button *)0; Fl_Button *btnNotifyUpdate=(Fl_Button *)0; Fl_Button *btnNotifyTest=(Fl_Button *)0; Fl_Button *btnNotifyClose=(Fl_Button *)0; static void cb_btnNotifyClose(Fl_Button* o, void*) { o->window()->hide(); } Table *tblNotifyList=(Table *)0; Fl_Double_Window* make_notify_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(500, 550, _("Notifications")); w = o; if (w) {/* empty */} { grpNotifyEvent = new Fl_Group(2, 2, 219, 126, _("Event")); grpNotifyEvent->box(FL_ENGRAVED_FRAME); grpNotifyEvent->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { mnuNotifyEvent = new Fl_Choice(10, 29, 205, 22); mnuNotifyEvent->down_box(FL_BORDER_BOX); } // Fl_Choice* mnuNotifyEvent { btnNotifyEnabled = new Fl_Light_Button(131, 94, 80, 23, _("Enabled")); } // Fl_Light_Button* btnNotifyEnabled { Fl_Input2* o = inpNotifyRE = new Fl_Input2(36, 61, 175, 23, _("RE:")); inpNotifyRE->box(FL_DOWN_BOX); inpNotifyRE->color(FL_BACKGROUND2_COLOR); inpNotifyRE->selection_color(FL_SELECTION_COLOR); inpNotifyRE->labeltype(FL_NORMAL_LABEL); inpNotifyRE->labelfont(0); inpNotifyRE->labelsize(14); inpNotifyRE->labelcolor(FL_FOREGROUND_COLOR); inpNotifyRE->align(Fl_Align(FL_ALIGN_LEFT)); inpNotifyRE->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyRE grpNotifyEvent->end(); } // Fl_Group* grpNotifyEvent { grpNotifyFilter = new Fl_Group(2, 130, 219, 176, _("Filter")); grpNotifyFilter->box(FL_ENGRAVED_FRAME); grpNotifyFilter->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkNotifyFilterCall = new Fl_Round_Button(12, 157, 80, 20, _("Callsign")); chkNotifyFilterCall->down_box(FL_ROUND_DOWN_BOX); chkNotifyFilterCall->callback((Fl_Callback*)cb_chkNotifyFilterCall); } // Fl_Round_Button* chkNotifyFilterCall { inpNotifyFilterCall = new Fl_Input2(131, 157, 80, 20); inpNotifyFilterCall->box(FL_DOWN_BOX); inpNotifyFilterCall->color(FL_BACKGROUND2_COLOR); inpNotifyFilterCall->selection_color(FL_SELECTION_COLOR); inpNotifyFilterCall->labeltype(FL_NORMAL_LABEL); inpNotifyFilterCall->labelfont(0); inpNotifyFilterCall->labelsize(14); inpNotifyFilterCall->labelcolor(FL_FOREGROUND_COLOR); inpNotifyFilterCall->align(Fl_Align(FL_ALIGN_CENTER)); inpNotifyFilterCall->when(FL_WHEN_RELEASE); } // Fl_Input2* inpNotifyFilterCall { chkNotifyFilterDXCC = new Fl_Round_Button(12, 186, 110, 20, _("DXCC entity")); chkNotifyFilterDXCC->down_box(FL_ROUND_DOWN_BOX); chkNotifyFilterDXCC->callback((Fl_Callback*)cb_chkNotifyFilterDXCC); } // Fl_Round_Button* chkNotifyFilterDXCC { btnNotifyFilterDXCC = new Fl_Button(183, 183, 28, 23); btnNotifyFilterDXCC->tooltip(_("Show DXCC entities")); } // Fl_Button* btnNotifyFilterDXCC { chkNotifyFilterNWB = new Fl_Check_Button(12, 216, 155, 20, _("Not worked before")); chkNotifyFilterNWB->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyFilterNWB { chkNotifyFilterLOTW = new Fl_Check_Button(12, 246, 100, 20, _("LotW user")); chkNotifyFilterLOTW->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyFilterLOTW { chkNotifyFilterEQSL = new Fl_Check_Button(12, 276, 100, 20, _("eQSL user")); chkNotifyFilterEQSL->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyFilterEQSL grpNotifyFilter->end(); } // Fl_Group* grpNotifyFilter { grpNotifyDup = new Fl_Group(2, 308, 219, 149, _("Duplicates")); grpNotifyDup->box(FL_ENGRAVED_FRAME); grpNotifyDup->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkNotifyDupIgnore = new Fl_Check_Button(12, 337, 145, 20, _("Ignore duplicates")); chkNotifyDupIgnore->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyDupIgnore { mnuNotifyDupWhich = new Fl_Choice(33, 367, 120, 20, _("in:")); mnuNotifyDupWhich->down_box(FL_BORDER_BOX); } // Fl_Choice* mnuNotifyDupWhich { Fl_Spinner2* o = cntNotifyDupTime = new Fl_Spinner2(93, 397, 60, 20, _("Time (s):")); cntNotifyDupTime->box(FL_NO_BOX); cntNotifyDupTime->color(FL_BACKGROUND_COLOR); cntNotifyDupTime->selection_color(FL_BACKGROUND_COLOR); cntNotifyDupTime->labeltype(FL_NORMAL_LABEL); cntNotifyDupTime->labelfont(0); cntNotifyDupTime->labelsize(14); cntNotifyDupTime->labelcolor(FL_FOREGROUND_COLOR); cntNotifyDupTime->minimum(0); cntNotifyDupTime->maximum(97200); cntNotifyDupTime->value(600); cntNotifyDupTime->align(Fl_Align(FL_ALIGN_LEFT)); cntNotifyDupTime->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntNotifyDupTime { chkNotifyDupBand = new Fl_Check_Button(12, 427, 65, 20, _("Band")); chkNotifyDupBand->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyDupBand { chkNotifyDupMode = new Fl_Check_Button(94, 427, 60, 20, _("Mode")); chkNotifyDupMode->down_box(FL_DOWN_BOX); } // Fl_Check_Button* chkNotifyDupMode grpNotifyDup->end(); } // Fl_Group* grpNotifyDup { grpNotifyAction = new Fl_Group(222, 2, 276, 394, _("Action")); grpNotifyAction->box(FL_ENGRAVED_FRAME); grpNotifyAction->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Spinner2* o = cntNotifyActionLimit = new Fl_Spinner2(232, 40, 52, 20, _("Trigger limit (s):")); cntNotifyActionLimit->tooltip(_("Minimum time between events")); cntNotifyActionLimit->box(FL_NO_BOX); cntNotifyActionLimit->color(FL_BACKGROUND_COLOR); cntNotifyActionLimit->selection_color(FL_BACKGROUND_COLOR); cntNotifyActionLimit->labeltype(FL_NORMAL_LABEL); cntNotifyActionLimit->labelfont(0); cntNotifyActionLimit->labelsize(14); cntNotifyActionLimit->labelcolor(FL_FOREGROUND_COLOR); cntNotifyActionLimit->minimum(0); cntNotifyActionLimit->maximum(3600); cntNotifyActionLimit->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntNotifyActionLimit->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntNotifyActionLimit { Fl_Input2* o = inpNotifyActionDialog = new Fl_Input2(232, 82, 218, 60, _("Show alert window:")); inpNotifyActionDialog->type(4); inpNotifyActionDialog->box(FL_DOWN_BOX); inpNotifyActionDialog->color(FL_BACKGROUND2_COLOR); inpNotifyActionDialog->selection_color(FL_SELECTION_COLOR); inpNotifyActionDialog->labeltype(FL_NORMAL_LABEL); inpNotifyActionDialog->labelfont(0); inpNotifyActionDialog->labelsize(14); inpNotifyActionDialog->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionDialog->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionDialog->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionDialog { btnNotifyActionDialogDefault = new Fl_Button(460, 100, 28, 23); btnNotifyActionDialogDefault->tooltip(_("Insert default text")); } // Fl_Button* btnNotifyActionDialogDefault { Fl_Spinner2* o = cntNotifyActionDialogTimeout = new Fl_Spinner2(232, 164, 52, 20, _("Hide window after (s):")); cntNotifyActionDialogTimeout->box(FL_NO_BOX); cntNotifyActionDialogTimeout->color(FL_BACKGROUND_COLOR); cntNotifyActionDialogTimeout->selection_color(FL_BACKGROUND_COLOR); cntNotifyActionDialogTimeout->labeltype(FL_NORMAL_LABEL); cntNotifyActionDialogTimeout->labelfont(0); cntNotifyActionDialogTimeout->labelsize(14); cntNotifyActionDialogTimeout->labelcolor(FL_FOREGROUND_COLOR); cntNotifyActionDialogTimeout->minimum(0); cntNotifyActionDialogTimeout->maximum(3600); cntNotifyActionDialogTimeout->value(5); cntNotifyActionDialogTimeout->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntNotifyActionDialogTimeout->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntNotifyActionDialogTimeout { Fl_Input2* o = inpNotifyActionRXMarker = new Fl_Input2(232, 205, 218, 60, _("Append to RX text:")); inpNotifyActionRXMarker->type(4); inpNotifyActionRXMarker->box(FL_DOWN_BOX); inpNotifyActionRXMarker->color(FL_BACKGROUND2_COLOR); inpNotifyActionRXMarker->selection_color(FL_SELECTION_COLOR); inpNotifyActionRXMarker->labeltype(FL_NORMAL_LABEL); inpNotifyActionRXMarker->labelfont(0); inpNotifyActionRXMarker->labelsize(14); inpNotifyActionRXMarker->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionRXMarker->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionRXMarker->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionRXMarker { btnNotifyActionMarkerDefault = new Fl_Button(460, 223, 28, 23); btnNotifyActionMarkerDefault->tooltip(_("Insert default text")); } // Fl_Button* btnNotifyActionMarkerDefault { Fl_Input2* o = inpNotifyActionMacro = new Fl_Input2(232, 287, 218, 60, _("Append to TX text:")); inpNotifyActionMacro->type(4); inpNotifyActionMacro->box(FL_DOWN_BOX); inpNotifyActionMacro->color(FL_BACKGROUND2_COLOR); inpNotifyActionMacro->selection_color(FL_SELECTION_COLOR); inpNotifyActionMacro->labeltype(FL_NORMAL_LABEL); inpNotifyActionMacro->labelfont(0); inpNotifyActionMacro->labelsize(14); inpNotifyActionMacro->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionMacro->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionMacro->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionMacro { btnNotifyActionMacro = new Fl_Button(460, 305, 28, 23); btnNotifyActionMacro->tooltip(_("Show macro editor")); } // Fl_Button* btnNotifyActionMacro { Fl_Input2* o = inpNotifyActionProgram = new Fl_Input2(232, 368, 218, 23, _("Run program:")); inpNotifyActionProgram->box(FL_DOWN_BOX); inpNotifyActionProgram->color(FL_BACKGROUND2_COLOR); inpNotifyActionProgram->selection_color(FL_SELECTION_COLOR); inpNotifyActionProgram->labeltype(FL_NORMAL_LABEL); inpNotifyActionProgram->labelfont(0); inpNotifyActionProgram->labelsize(14); inpNotifyActionProgram->labelcolor(FL_FOREGROUND_COLOR); inpNotifyActionProgram->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpNotifyActionProgram->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyActionProgram { btnNotifyActionProgram = new Fl_Button(460, 368, 28, 23); } // Fl_Button* btnNotifyActionProgram grpNotifyAction->end(); } // Fl_Group* grpNotifyAction { btnNotifyAdd = new Fl_Button(223, 402, 90, 23); } // Fl_Button* btnNotifyAdd { btnNotifyRemove = new Fl_Button(316, 402, 90, 23); } // Fl_Button* btnNotifyRemove { btnNotifyUpdate = new Fl_Button(223, 431, 90, 23); } // Fl_Button* btnNotifyUpdate { btnNotifyTest = new Fl_Button(316, 431, 90, 23); } // Fl_Button* btnNotifyTest { btnNotifyClose = new Fl_Button(408, 431, 90, 23); btnNotifyClose->callback((Fl_Callback*)cb_btnNotifyClose); } // Fl_Button* btnNotifyClose { tblNotifyList = new Table(2, 460, 496, 88); tblNotifyList->box(FL_UP_FRAME); tblNotifyList->color(FL_BACKGROUND_COLOR); tblNotifyList->selection_color(FL_SELECTION_COLOR); tblNotifyList->labeltype(FL_NORMAL_LABEL); tblNotifyList->labelfont(0); tblNotifyList->labelsize(14); tblNotifyList->labelcolor(FL_FOREGROUND_COLOR); tblNotifyList->align(Fl_Align(FL_ALIGN_CENTER)); tblNotifyList->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(tblNotifyList); } // Table* tblNotifyList o->size_range(500, 550); o->end(); } // Fl_Double_Window* o return w; } Table *tblNotifyFilterDXCC=(Table *)0; Fl_Input2 *inpNotifyDXCCSearchCountry=(Fl_Input2 *)0; Fl_Input2 *inpNotifyDXCCSearchCallsign=(Fl_Input2 *)0; Fl_Button *btnNotifyDXCCSelect=(Fl_Button *)0; Fl_Button *btnNotifyDXCCDeselect=(Fl_Button *)0; Fl_Button *btnNotifyDXCCClose=(Fl_Button *)0; static void cb_btnNotifyDXCCClose(Fl_Button* o, void*) { o->window()->hide(); } Fl_Double_Window* make_dxcc_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(435, 450, _("DXCC entities")); w = o; if (w) {/* empty */} { tblNotifyFilterDXCC = new Table(2, 2, 432, 370); tblNotifyFilterDXCC->box(FL_UP_FRAME); tblNotifyFilterDXCC->color(FL_BACKGROUND2_COLOR); tblNotifyFilterDXCC->selection_color(FL_SELECTION_COLOR); tblNotifyFilterDXCC->labeltype(FL_NORMAL_LABEL); tblNotifyFilterDXCC->labelfont(0); tblNotifyFilterDXCC->labelsize(14); tblNotifyFilterDXCC->labelcolor(FL_FOREGROUND_COLOR); tblNotifyFilterDXCC->align(Fl_Align(FL_ALIGN_CENTER)); tblNotifyFilterDXCC->when(FL_WHEN_RELEASE); Fl_Group::current()->resizable(tblNotifyFilterDXCC); } // Table* tblNotifyFilterDXCC { Fl_Input2* o = inpNotifyDXCCSearchCountry = new Fl_Input2(104, 382, 120, 23, _("Find country:")); inpNotifyDXCCSearchCountry->tooltip(_("Press return to continue the search")); inpNotifyDXCCSearchCountry->box(FL_DOWN_BOX); inpNotifyDXCCSearchCountry->color(FL_BACKGROUND2_COLOR); inpNotifyDXCCSearchCountry->selection_color(FL_SELECTION_COLOR); inpNotifyDXCCSearchCountry->labeltype(FL_NORMAL_LABEL); inpNotifyDXCCSearchCountry->labelfont(0); inpNotifyDXCCSearchCountry->labelsize(14); inpNotifyDXCCSearchCountry->labelcolor(FL_FOREGROUND_COLOR); inpNotifyDXCCSearchCountry->align(Fl_Align(FL_ALIGN_LEFT)); inpNotifyDXCCSearchCountry->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyDXCCSearchCountry { Fl_Input2* o = inpNotifyDXCCSearchCallsign = new Fl_Input2(104, 415, 120, 23, _("Find prefix:")); inpNotifyDXCCSearchCallsign->box(FL_DOWN_BOX); inpNotifyDXCCSearchCallsign->color(FL_BACKGROUND2_COLOR); inpNotifyDXCCSearchCallsign->selection_color(FL_SELECTION_COLOR); inpNotifyDXCCSearchCallsign->labeltype(FL_NORMAL_LABEL); inpNotifyDXCCSearchCallsign->labelfont(0); inpNotifyDXCCSearchCallsign->labelsize(14); inpNotifyDXCCSearchCallsign->labelcolor(FL_FOREGROUND_COLOR); inpNotifyDXCCSearchCallsign->align(Fl_Align(FL_ALIGN_LEFT)); inpNotifyDXCCSearchCallsign->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNotifyDXCCSearchCallsign { btnNotifyDXCCSelect = new Fl_Button(234, 382, 90, 23); } // Fl_Button* btnNotifyDXCCSelect { btnNotifyDXCCDeselect = new Fl_Button(234, 415, 90, 23); } // Fl_Button* btnNotifyDXCCDeselect { btnNotifyDXCCClose = new Fl_Button(334, 415, 90, 23); btnNotifyDXCCClose->callback((Fl_Callback*)cb_btnNotifyDXCCClose); } // Fl_Button* btnNotifyDXCCClose o->size_range(300, 400); o->end(); } // Fl_Double_Window* o return w; } fldigi-4.2.05/src/dialogs/record_browse.cxx0000664000175000017500000000450514611711171015563 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "gettext.h" #include "record_browse.h" #include Fl_Group *tabDataFiles=(Fl_Group *)0; Fl_Input_Choice *inpDataSources=(Fl_Input_Choice *)0; Fl_Light_Button *btnDataSourceUpdate=(Fl_Light_Button *)0; static void cb_btnDataSourceUpdate(Fl_Light_Button*, void*) { DerivedRecordLst::cbGuiUpdate(); } Fl_Button *btnDataSourceReset=(Fl_Button *)0; static void cb_btnDataSourceReset(Fl_Button*, void*) { DerivedRecordLst::cbGuiReset(); } Fl_Double_Window* make_record_loader_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(540, 280, _("Data files sources")); w = o; if (w) {/* empty */} o->tooltip(_("Data files update")); { tabDataFiles = new Fl_Group(3, 18, 535, 255); tabDataFiles->tooltip(_("Tabular data sources")); { DerivedRecordLst* o = new DerivedRecordLst(4, 18, 529, 217, _("Data files sources")); o->box(FL_THIN_DOWN_FRAME); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_BACKGROUND_COLOR); o->labeltype(FL_NO_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->align(Fl_Align(FL_ALIGN_TOP)); o->when(FL_WHEN_RELEASE); o->end(); Fl_Group::current()->resizable(o); } // DerivedRecordLst* o { inpDataSources = new Fl_Input_Choice(4, 247, 284, 21, _("Data source")); inpDataSources->tooltip(_("Data files repository")); inpDataSources->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Input_Choice* inpDataSources { btnDataSourceUpdate = new Fl_Light_Button(385, 247, 74, 20, _("Update")); btnDataSourceUpdate->tooltip(_("Update selected local data files with repository content")); btnDataSourceUpdate->callback((Fl_Callback*)cb_btnDataSourceUpdate); } // Fl_Light_Button* btnDataSourceUpdate { btnDataSourceReset = new Fl_Button(463, 247, 70, 20, _("Reset")); btnDataSourceReset->tooltip(_("Delete local data files if selected.")); btnDataSourceReset->callback((Fl_Callback*)cb_btnDataSourceReset); } // Fl_Button* btnDataSourceReset tabDataFiles->end(); Fl_Group::current()->resizable(tabDataFiles); } // Fl_Group* tabDataFiles o->end(); } // Fl_Double_Window* o return w; } fldigi-4.2.05/src/dialogs/testsigs.cxx0000664000175000017500000000605414611711171014572 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "gettext.h" #include "testsigs.h" #include "configuration.h" Fl_Counter2 *noiseDB=(Fl_Counter2 *)0; static void cb_noiseDB(Fl_Counter2* o, void*) { progdefaults.s2n = o->value(); } Fl_Check_Button *btnNoiseOn=(Fl_Check_Button *)0; static void cb_btnNoiseOn(Fl_Check_Button* o, void*) { progdefaults.noise = o->value(); } Fl_Counter *ctrl_freq_offset=(Fl_Counter *)0; Fl_Check_Button *btnOffsetOn=(Fl_Check_Button *)0; Fl_Counter2 *xmtimd=(Fl_Counter2 *)0; Fl_Check_Button *btn_imd_on=(Fl_Check_Button *)0; Fl_Double_Window* make_testdialog() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(480, 100, _("Test Signals")); w = o; if (w) {/* empty */} { Fl_Counter2* o = noiseDB = new Fl_Counter2(10, 41, 127, 21, _("Noise level (db)")); noiseDB->box(FL_UP_BOX); noiseDB->color(FL_BACKGROUND_COLOR); noiseDB->selection_color(FL_INACTIVE_COLOR); noiseDB->labeltype(FL_NORMAL_LABEL); noiseDB->labelfont(0); noiseDB->labelsize(14); noiseDB->labelcolor(FL_FOREGROUND_COLOR); noiseDB->minimum(-30); noiseDB->maximum(60); noiseDB->value(20); noiseDB->callback((Fl_Callback*)cb_noiseDB); noiseDB->align(Fl_Align(FL_ALIGN_TOP)); noiseDB->when(FL_WHEN_CHANGED); o->value(progdefaults.s2n); o->lstep(1); } // Fl_Counter2* noiseDB { Fl_Check_Button* o = btnNoiseOn = new Fl_Check_Button(39, 73, 68, 12, _("Noise on")); btnNoiseOn->down_box(FL_DOWN_BOX); btnNoiseOn->callback((Fl_Callback*)cb_btnNoiseOn); o->value(progdefaults.noise); } // Fl_Check_Button* btnNoiseOn { Fl_Counter* o = ctrl_freq_offset = new Fl_Counter(174, 41, 127, 21, _("freq-offset")); ctrl_freq_offset->tooltip(_("ONLY FOR TESTING !")); ctrl_freq_offset->minimum(-250); ctrl_freq_offset->maximum(250); ctrl_freq_offset->align(Fl_Align(FL_ALIGN_TOP)); o->lstep(10); } // Fl_Counter* ctrl_freq_offset { btnOffsetOn = new Fl_Check_Button(203, 73, 68, 12, _("Offset on")); btnOffsetOn->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btnOffsetOn { Fl_Counter2* o = xmtimd = new Fl_Counter2(339, 41, 127, 21, _("PSK IMD\nlevel (db)")); xmtimd->box(FL_UP_BOX); xmtimd->color(FL_BACKGROUND_COLOR); xmtimd->selection_color(FL_INACTIVE_COLOR); xmtimd->labeltype(FL_NORMAL_LABEL); xmtimd->labelfont(0); xmtimd->labelsize(14); xmtimd->labelcolor(FL_FOREGROUND_COLOR); xmtimd->minimum(-40); xmtimd->maximum(-15); xmtimd->value(-30); xmtimd->align(Fl_Align(FL_ALIGN_TOP)); xmtimd->when(FL_WHEN_CHANGED); o->lstep(1.0); } // Fl_Counter2* xmtimd { btn_imd_on = new Fl_Check_Button(368, 73, 68, 12, _("IMD on")); btn_imd_on->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btn_imd_on { Fl_Box* o = new Fl_Box(2, 2, 368, 20, _("!! DO NOT USE ON LIVE TRANSMITER !!")); o->labelcolor((Fl_Color)80); } // Fl_Box* o o->end(); } // Fl_Double_Window* o return w; } fldigi-4.2.05/src/dialogs/confdialog.cxx0000664000175000017500000320774714611711171015051 00000000000000// generated by Fast Light User Interface Designer (fluid) version 1.0309 #include "gettext.h" #include "confdialog.h" #include #include #include #include #include #include #include "main.h" #include "fl_digi.h" #include "data_io.h" #include "Viewer.h" #include "soundconf.h" #include "waterfall.h" #include "rigxml.h" #include "lookupcall.h" #include "icons.h" #include "Viewer.h" #include "pskrep.h" #include "logsupport.h" #include "notify.h" #include "debug.h" #include "status.h" #include "rx_extract.h" #include "kmlserver.h" #include "macroedit.h" #include "fileselect.h" #include "psm/psm.h" #include "thor.h" #include "ifkp.h" #include "dx_cluster.h" #include "dx_dialog.h" #include "fsq.h" #include "network.h" #include #if USE_HAMLIB #include "hamlib.h" #endif extern void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata); Fl_Double_Window *dlgConfig; Mode_Browser* mode_browser; std::vector config_pages; static Fl_Group *current = 0; void SelectItem_CB(Fl_Widget *w) { Fl_Tree *tree = (Fl_Tree*)w; Fl_Tree_Item *item = tree->callback_item(); tree->select_only(item, 0); if (tree->callback_reason() == FL_TREE_REASON_SELECTED) { std::string pname; char pn[200]; tree->item_pathname(pn, 200, item); pname = pn; size_t pos = std::string::npos; for (size_t i = 0; i < config_pages.size(); i++) { if ((pos = pname.find(config_pages[i]->label)) != std::string::npos) { if (pname.substr(pos) == config_pages[i]->label) { if (current) current->hide(); current = config_pages[i]->grp; current->show(); return; } } } } } static void choose_color(Fl_Color & c) { unsigned char r, g, b; Fl::get_color(c, r, g, b); if (fl_color_chooser("Font color", r, g, b)) c = fl_rgb_color(r, g, b); } static void cbMenuFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); progdefaults.MenuFontnbr = font; progdefaults.MenuFontsize = size; //progdefaults.MenuFontcolor = color; font_browser->hide(); change_menu_fonts(font, size); progdefaults.changed = true; } static void cbRxFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); RxText->textfont(font); RxText->textsize(size); RxText->textcolor(color); RxText->redraw(); progdefaults.RxFontnbr = font; progdefaults.RxFontsize = size; progdefaults.RxFontcolor = color; ReceiveText->setFont(font); ReceiveText->setFontSize(size); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); fsq_rx_text->setFont(font); fsq_rx_text->setFontSize(size); fsq_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFont(font); ifkp_rx_text->setFontSize(size); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true; } static void cbTxFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); TxText->textfont(font); TxText->textsize(size); TxText->textcolor(color); TxText->redraw(); progdefaults.TxFontnbr = font; progdefaults.TxFontsize = size; progdefaults.TxFontcolor = color; TransmitText->setFont(font); TransmitText->setFontSize(size); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); fsq_tx_text->setFont(font); fsq_tx_text->setFontSize(size); fsq_tx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ifkp_rx_text->setFont(font); ifkp_rx_text->setFontSize(size); ifkp_rx_text->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); font_browser->hide(); progdefaults.changed = true; } static void cbDXfont_browser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.DXfontcolor = color; progdefaults.DXfontnbr = font; progdefaults.DXfontsize = size; brws_tcpip_stream->setFont(font); brws_tcpip_stream->setFontSize(size); brws_tcpip_stream->setFontColor(color, FTextBase::RECV); brws_tcpip_stream->redraw(); ed_telnet_cmds->setFont(font); ed_telnet_cmds->setFontSize(size); ed_telnet_cmds->setFontColor(color); ed_telnet_cmds->redraw(); StreamText->textcolor(color); StreamText->redraw(); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFont(font); brws_dxc_help->setFontSize(size); brws_dxc_help->setFontColor(color, FTextBase::RECV); brws_dxc_help->redraw(); font_browser->hide(); dxcluster_hosts_load(); progdefaults.changed = true; } static void cbDXC_FontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.DXC_textfont = font; progdefaults.DXC_textsize = size; progdefaults.DXC_textcolor = color; DXC_display->textsize(size); DXC_display->textcolor(color); DXC_display->textfont(font); DXC_display->redraw(); font_browser->hide(); dxc_lines_redraw(); progdefaults.changed = true; } static void cbMacroEditFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); MacroText->textfont(font); MacroText->textsize(size); MacroText->redraw(); progdefaults.MacroEditFontnbr = font; progdefaults.MacroEditFontsize = size; update_macroedit_font(); MacroText->textfont(font); MacroText->textsize(size); font_browser->hide(); progdefaults.changed = true; } void cbWaterfallFontBrowser(Fl_Widget*, void*) { Fl_Font fnt = font_browser->fontNumber(); int size = font_browser->fontSize(); progdefaults.WaterfallFontnbr = fnt; progdefaults.WaterfallFontsize = size; progdefaults.changed = true; font_browser->hide(); } static void cbMacroBtnFontBrowser(Fl_Widget*, void*) { progdefaults.MacroBtnFontnbr = font_browser->fontNumber(); progdefaults.MacroBtnFontsize = font_browser->fontSize();; progdefaults.MacroBtnFontcolor = font_browser->fontColor(); font_browser->hide(); btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->redraw_label(); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup2->labelfont(progdefaults.MacroBtnFontnbr); btnGroup2->labelsize(progdefaults.MacroBtnFontsize); btnGroup2->redraw_label(); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup3->labelfont(progdefaults.MacroBtnFontnbr); btnGroup3->labelsize(progdefaults.MacroBtnFontsize); btnGroup3->redraw_label(); progdefaults.changed = true; colorize_macros(); } void cbViewerFontBrowser(Fl_Widget*, void*) { progdefaults.ViewerFontnbr = font_browser->fontNumber(); progdefaults.ViewerFontsize = font_browser->fontSize(); initViewer(); progdefaults.changed = true; font_browser->hide(); } void cbFreqControlFontBrowser(Fl_Widget*, void*) { Fl_Font fnt = font_browser->fontNumber(); progdefaults.FreqControlFontnbr = fnt; progdefaults.changed = true; FDdisplay->labelfont(progdefaults.FreqControlFontnbr); FDdisplay->redraw(); qsoFreqDisp1->font(progdefaults.FreqControlFontnbr); qsoFreqDisp2->font(progdefaults.FreqControlFontnbr); qsoFreqDisp3->font(progdefaults.FreqControlFontnbr); qsoFreqDisp1->redraw(); qsoFreqDisp2->redraw(); qsoFreqDisp3->redraw(); font_browser->hide(); } static void cbLOGGINGFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGGINGtextfont = font; progdefaults.LOGGINGtextsize = size; progdefaults.LOGGINGtextcolor = color; LOGGINGdisplay->textsize(size); LOGGINGdisplay->textcolor(color); LOGGINGdisplay->textfont(font); LOGGINGdisplay->redraw(); LOGGING_colors_font(); font_browser->hide(); progdefaults.changed = true; } static void cbLOGBOOKFontBrowser(Fl_Widget*, void*) { Fl_Font font = font_browser->fontNumber(); int size = font_browser->fontSize(); Fl_Color color = font_browser->fontColor(); progdefaults.LOGBOOKtextfont = font; progdefaults.LOGBOOKtextsize = size; progdefaults.LOGBOOKtextcolor = color; LOGBOOKdisplay->textsize(size); LOGBOOKdisplay->textcolor(color); LOGBOOKdisplay->textfont(font); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); font_browser->hide(); progdefaults.changed = true; } void set_qrzxml_buttons(Fl_Button* b) { Fl_Button* qrzbxml[] = { btnQRZXMLnotavailable, btnQRZcdrom, btnQRZsub, btnHamcall, btnCALLOOK, btnHamQTH}; for (size_t i = 0; i < sizeof(qrzbxml)/sizeof(*qrzbxml); i++) qrzbxml[i]->value(b == qrzbxml[i]); } void set_qrzweb_buttons(Fl_Button* b) { Fl_Button* qrzbweb[] = { btnQRZWEBnotavailable, btnQRZonline, btnHAMCALLonline, btnHamQTHonline, btnCallookOnline }; for (size_t i = 0; i < sizeof(qrzbweb)/sizeof(*qrzbweb); i++) qrzbweb[i]->value(b == qrzbweb[i]); } void createConfig() { if (!dlgConfig) { dlgConfig = ConfigureDialog(); dlgConfig->xclass(PACKAGE_NAME); } } Fl_Tree *tab_tree=(Fl_Tree *)0; Fl_Button *btn_collapse_tab_tree=(Fl_Button *)0; static void cb_btn_collapse_tab_tree(Fl_Button*, void*) { tab_tree->close(_("Colors-Fonts")); tab_tree->close(_("Contests")); tab_tree->close(_("IDs")); tab_tree->close(_("Logging")); tab_tree->close(_("Modem")); tab_tree->close(_("Misc")); tab_tree->close(_("Rig Control")); tab_tree->close(_("Soundcard")); tab_tree->close(_("UI")); tab_tree->close(_("Waterfall")); tab_tree->close(_("Web")); } Fl_Round_Button *btnQRZWEBnotavailable=(Fl_Round_Button *)0; static void cb_btnQRZWEBnotavailable(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZWEBNONE; progdefaults.changed = true; } Fl_Round_Button *btnQRZonline=(Fl_Round_Button *)0; static void cb_btnQRZonline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = QRZHTML; progdefaults.changed = true; } Fl_Round_Button *btnHAMCALLonline=(Fl_Round_Button *)0; static void cb_btnHAMCALLonline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMCALLHTML; progdefaults.changed = true; } Fl_Round_Button *btnHamQTHonline=(Fl_Round_Button *)0; static void cb_btnHamQTHonline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = HAMQTHHTML; progdefaults.changed = true; } Fl_Round_Button *btnCallookOnline=(Fl_Round_Button *)0; static void cb_btnCallookOnline(Fl_Round_Button* o, void*) { set_qrzweb_buttons(o); progdefaults.QRZWEB = CALLOOKHTML; progdefaults.changed = true; } Fl_Input2 *inp_qrzurl=(Fl_Input2 *)0; static void cb_inp_qrzurl(Fl_Input2* o, void*) { progdefaults.qrzurl = o->value(); progdefaults.changed=true; } Fl_Input2 *inp_hamcallurl=(Fl_Input2 *)0; static void cb_inp_hamcallurl(Fl_Input2* o, void*) { progdefaults.hamcallurl = o->value(); progdefaults.changed = true; } Fl_Input2 *inp_hamqthurl=(Fl_Input2 *)0; static void cb_inp_hamqthurl(Fl_Input2* o, void*) { progdefaults.hamqthurl = o->value(); progdefaults.changed = true; } Fl_Input2 *inp_callook_url=(Fl_Input2 *)0; static void cb_inp_callook_url(Fl_Input2* o, void*) { progdefaults.callookurl = o->value(); progdefaults.changed = true; } Fl_Round_Button *btnQRZXMLnotavailable=(Fl_Round_Button *)0; static void cb_btnQRZXMLnotavailable(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = QRZXMLNONE; progdefaults.changed = true; } Fl_Round_Button *btnQRZcdrom=(Fl_Round_Button *)0; static void cb_btnQRZcdrom(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = QRZCD; progdefaults.changed = true; } Fl_Round_Button *btnQRZsub=(Fl_Round_Button *)0; static void cb_btnQRZsub(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = QRZNET; progdefaults.changed = true; } Fl_Round_Button *btnHamcall=(Fl_Round_Button *)0; static void cb_btnHamcall(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = HAMCALLNET; progdefaults.changed = true; } Fl_Round_Button *btnHamQTH=(Fl_Round_Button *)0; static void cb_btnHamQTH(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = HAMQTH; progdefaults.changed = true; } Fl_Round_Button *btnCALLOOK=(Fl_Round_Button *)0; static void cb_btnCALLOOK(Fl_Round_Button* o, void*) { set_qrzxml_buttons(o); progdefaults.QRZXML = CALLOOK; progdefaults.changed = true; } Fl_Input2 *txtQRZpathname=(Fl_Input2 *)0; static void cb_txtQRZpathname(Fl_Input2* o, void*) { progdefaults.QRZpathname = o->value(); progdefaults.QRZchanged = true; progdefaults.changed = true; } Fl_Input2 *inpQRZusername=(Fl_Input2 *)0; static void cb_inpQRZusername(Fl_Input2* o, void*) { progdefaults.QRZusername = o->value(); progdefaults.changed = true; } Fl_Input2 *inpQRZuserpassword=(Fl_Input2 *)0; static void cb_inpQRZuserpassword(Fl_Input2* o, void*) { progdefaults.QRZuserpassword = o->value(); progdefaults.changed = true; } Fl_Button *btnQRZpasswordShow=(Fl_Button *)0; static void cb_btnQRZpasswordShow(Fl_Button* o, void*) { inpQRZuserpassword->type(inpQRZuserpassword->type() ^ FL_SECRET_INPUT); inpQRZuserpassword->redraw(); o->label((inpQRZuserpassword->type() & FL_SECRET_INPUT) ? "Show" : "Hide"); } Fl_Check_Button *btn_notes_address=(Fl_Check_Button *)0; static void cb_btn_notes_address(Fl_Check_Button* o, void*) { progdefaults.notes_address = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_clear_notes=(Fl_Check_Button *)0; static void cb_btn_clear_notes(Fl_Check_Button* o, void*) { progdefaults.clear_notes = o->value(); progdefaults.changed= true; } Fl_Input2 *txt_cty_dat_pathname=(Fl_Input2 *)0; static void cb_txt_cty_dat_pathname(Fl_Input2* o, void*) { progdefaults.cty_dat_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_cty_dat=(Fl_Button *)0; static void cb_btn_select_cty_dat(Fl_Button*, void*) { select_cty_dat_pathname(); } Fl_Button *btn_default_cty_dat=(Fl_Button *)0; static void cb_btn_default_cty_dat(Fl_Button*, void*) { default_cty_dat_pathname(); } Fl_Button *btn_reload_cty_dat=(Fl_Button *)0; static void cb_btn_reload_cty_dat(Fl_Button*, void*) { reload_cty_dat(); } Fl_Button *btnSpotColor=(Fl_Button *)0; static void cb_btnSpotColor(Fl_Button*, void*) { progdefaults.SpotColor = fl_show_colormap(progdefaults.SpotColor); spotcolor->color(progdefaults.SpotColor); spotcolor->redraw(); spot_selection_color(); progdefaults.changed = true; } Fl_Button *btnRevColor=(Fl_Button *)0; static void cb_btnRevColor(Fl_Button*, void*) { progdefaults.RevColor = fl_show_colormap(progdefaults.RevColor); revcolor->color(progdefaults.RevColor); revcolor->redraw(); rev_selection_color(); progdefaults.changed = true; } Fl_Button *btnTuneColor=(Fl_Button *)0; static void cb_btnTuneColor(Fl_Button*, void*) { progdefaults.TuneColor = fl_show_colormap(progdefaults.TuneColor); tunecolor->color(progdefaults.TuneColor); tunecolor->redraw(); tune_selection_color(); progdefaults.changed = true; } Fl_Button *btnRxIDColor=(Fl_Button *)0; static void cb_btnRxIDColor(Fl_Button*, void*) { progdefaults.RxIDColor = fl_show_colormap(progdefaults.RxIDColor); rxidcolor->color(progdefaults.RxIDColor); rxidcolor->redraw(); rxid_selection_color(); progdefaults.changed = true; Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw(); } Fl_Button *btnLkColor=(Fl_Button *)0; static void cb_btnLkColor(Fl_Button*, void*) { progdefaults.LkColor = fl_show_colormap(progdefaults.LkColor); lockcolor->color(progdefaults.LkColor); lockcolor->redraw(); xmtlock_selection_color(); progdefaults.changed = true; } Fl_Button *btnSql1Color=(Fl_Button *)0; static void cb_btnSql1Color(Fl_Button*, void*) { progdefaults.Sql1Color = fl_show_colormap(progdefaults.Sql1Color); sql1color->color(progdefaults.Sql1Color); sql1color->redraw(); sql_selection_color(); progdefaults.changed = true; } Fl_Button *btnXmtColor=(Fl_Button *)0; static void cb_btnXmtColor(Fl_Button*, void*) { progdefaults.XmtColor = fl_show_colormap(progdefaults.XmtColor); xmtcolor->color(progdefaults.XmtColor); xmtcolor->redraw(); xmtrcv_selection_color(); progdefaults.changed = true; } Fl_Button *btnRxIDwideColor=(Fl_Button *)0; static void cb_btnRxIDwideColor(Fl_Button*, void*) { progdefaults.RxIDwideColor = fl_show_colormap(progdefaults.RxIDwideColor); rxidcolorwide->color(progdefaults.RxIDwideColor); rxidcolorwide->redraw(); rxid_selection_color(); progdefaults.changed = true; Fl_Color clr = progdefaults.rsidWideSearch ? progdefaults.RxIDwideColor : progdefaults.RxIDColor; btnRSID->selection_color(clr); btnRSID->redraw(); } Fl_Button *btnAfcColor=(Fl_Button *)0; static void cb_btnAfcColor(Fl_Button*, void*) { progdefaults.AfcColor = fl_show_colormap(progdefaults.AfcColor); afccolor->color(progdefaults.AfcColor); afccolor->redraw(); afc_selection_color(); progdefaults.changed = true; } Fl_Button *btnSql2Color=(Fl_Button *)0; static void cb_btnSql2Color(Fl_Button*, void*) { progdefaults.Sql2Color = fl_show_colormap(progdefaults.Sql2Color); sql2color->color(progdefaults.Sql2Color); sql2color->redraw(); sql_selection_color(); progdefaults.changed = true; } Fl_Button *btnTxIDColor=(Fl_Button *)0; static void cb_btnTxIDColor(Fl_Button*, void*) { progdefaults.TxIDColor = fl_show_colormap(progdefaults.TxIDColor); txidcolor->color(progdefaults.TxIDColor); txidcolor->redraw(); txid_selection_color(); progdefaults.changed = true; btnTxRSID->selection_color(progdefaults.TxIDColor); btnTxRSID->redraw(); } Fl_Box *spotcolor=(Fl_Box *)0; Fl_Box *revcolor=(Fl_Box *)0; Fl_Box *tunecolor=(Fl_Box *)0; Fl_Box *rxidcolor=(Fl_Box *)0; Fl_Box *lockcolor=(Fl_Box *)0; Fl_Box *sql1color=(Fl_Box *)0; Fl_Box *rxidcolorwide=(Fl_Box *)0; Fl_Box *xmtcolor=(Fl_Box *)0; Fl_Box *afccolor=(Fl_Box *)0; Fl_Box *sql2color=(Fl_Box *)0; Fl_Box *txidcolor=(Fl_Box *)0; Fl_Button *btn_default_btn_color=(Fl_Button *)0; static void cb_btn_default_btn_color(Fl_Button*, void*) { progdefaults.default_btn_color = fl_show_colormap(progdefaults.default_btn_color); default_btn_color->color(progdefaults.default_btn_color); default_btn_color->redraw(); set_default_btn_color(); progdefaults.changed = true; } Fl_Box *default_btn_color=(Fl_Box *)0; Fl_Button *btn_check_btn_color=(Fl_Button *)0; static void cb_btn_check_btn_color(Fl_Button*, void*) { progdefaults.default_check_btn_color = fl_show_colormap(progdefaults.default_check_btn_color); default_check_btn_color->color(progdefaults.default_check_btn_color); default_check_btn_color->redraw(); set_default_btn_color(); progdefaults.changed = true; } Fl_Box *default_check_btn_color=(Fl_Box *)0; Fl_Button *btn_default_round_btn_color=(Fl_Button *)0; static void cb_btn_default_round_btn_color(Fl_Button*, void*) { progdefaults.default_round_btn_color = fl_show_colormap(progdefaults.default_round_btn_color); default_round_btn_color->color(progdefaults.default_round_btn_color); default_round_btn_color->redraw(); set_default_btn_color(); progdefaults.changed = true; } Fl_Box *default_round_btn_color=(Fl_Box *)0; Fl_Button *btnMenuFont=(Fl_Button *)0; static void cb_btnMenuFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.MenuFontnbr); font_browser->fontSize(progdefaults.MenuFontsize); font_browser->callback(cbMenuFontBrowser); font_browser->show(); } Fl_Box *FDdisplay=(Fl_Box *)0; Fl_Button *btn_freq_control_font=(Fl_Button *)0; static void cb_btn_freq_control_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.FreqControlFontnbr); font_browser->fontSize(14); font_browser->fontColor(FL_FOREGROUND_COLOR); if (font_browser->fixed_width(progdefaults.FreqControlFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbFreqControlFontBrowser); font_browser->show(); } Fl_Button *btnBackgroundColor=(Fl_Button *)0; static void cb_btnBackgroundColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.FDbackground.R; g = progdefaults.FDbackground.G; b = progdefaults.FDbackground.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetCOLORS( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true; } Fl_Button *btnForegroundColor=(Fl_Button *)0; static void cb_btnForegroundColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.FDforeground.R; g = progdefaults.FDforeground.G; b = progdefaults.FDforeground.B; if (!fl_color_chooser("Foreground", r, g, b)) return; progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; FDdisplay->labelcolor(fl_rgb_color(r,g,b)); FDdisplay->redraw(); if (qsoFreqDisp) { qsoFreqDisp->SetCOLORS( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true; } Fl_Button *btnFD_SystemColor=(Fl_Button *)0; static void cb_btnFD_SystemColor(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.FDbackground.R = r; progdefaults.FDbackground.G = g; progdefaults.FDbackground.B = b; FDdisplay->color(clr); clr = FL_FOREGROUND_COLOR; Fl::get_color(clr, r, g, b); FDdisplay->labelcolor(clr); FDdisplay->redraw(); progdefaults.FDforeground.R = r; progdefaults.FDforeground.G = g; progdefaults.FDforeground.B = b; if (qsoFreqDisp) { qsoFreqDisp->SetCOLORS( fl_rgb_color( progdefaults.FDforeground.R, progdefaults.FDforeground.G, progdefaults.FDforeground.B), fl_rgb_color( progdefaults.FDbackground.R, progdefaults.FDbackground.G, progdefaults.FDbackground.B)); qsoFreqDisp->redraw(); } progdefaults.changed = true; } Fl_Button *btnSmeter_bg_color=(Fl_Button *)0; static void cb_btnSmeter_bg_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.Smeter_bg_color.R; g = progdefaults.Smeter_bg_color.G; b = progdefaults.Smeter_bg_color.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.Smeter_bg_color.R = r; progdefaults.Smeter_bg_color.G = g; progdefaults.Smeter_bg_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnSmeter_scale_color=(Fl_Button *)0; static void cb_btnSmeter_scale_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.Smeter_scale_color.R; g = progdefaults.Smeter_scale_color.G; b = progdefaults.Smeter_scale_color.B; if (!fl_color_chooser("Scale", r, g, b)) return; progdefaults.Smeter_scale_color.R = r; progdefaults.Smeter_scale_color.G = g; progdefaults.Smeter_scale_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnSmeter_meter_color=(Fl_Button *)0; static void cb_btnSmeter_meter_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.Smeter_meter_color.R; g = progdefaults.Smeter_meter_color.G; b = progdefaults.Smeter_meter_color.B; if (!fl_color_chooser("Meter", r, g, b)) return; progdefaults.Smeter_meter_color.R = r; progdefaults.Smeter_meter_color.G = g; progdefaults.Smeter_meter_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnPWR_bg_color=(Fl_Button *)0; static void cb_btnPWR_bg_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.PWRmeter_bg_color.R; g = progdefaults.PWRmeter_bg_color.G; b = progdefaults.PWRmeter_bg_color.B; if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.PWRmeter_bg_color.R = r; progdefaults.PWRmeter_bg_color.G = g; progdefaults.PWRmeter_bg_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnPWR_scale_color=(Fl_Button *)0; static void cb_btnPWR_scale_color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.PWRmeter_scale_color.R; g = progdefaults.PWRmeter_scale_color.G; b = progdefaults.PWRmeter_scale_color.B; if (!fl_color_chooser("Scale", r, g, b)) return; progdefaults.PWRmeter_scale_color.R = r; progdefaults.PWRmeter_scale_color.G = g; progdefaults.PWRmeter_scale_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_Button *btnPWR_meter_Color=(Fl_Button *)0; static void cb_btnPWR_meter_Color(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.PWRmeter_meter_color.R; g = progdefaults.PWRmeter_meter_color.G; b = progdefaults.PWRmeter_meter_color.B; if (!fl_color_chooser("Meter", r, g, b)) return; progdefaults.PWRmeter_meter_color.R = r; progdefaults.PWRmeter_meter_color.G = g; progdefaults.PWRmeter_meter_color.B = b; set_smeter_colors(); progdefaults.changed = true; } Fl_ListBox *listboxPWRselect=(Fl_ListBox *)0; static void cb_listboxPWRselect(Fl_ListBox* o, void*) { progdefaults.PWRselect = o->index(); set_smeter_colors(); progdefaults.changed = true; } Fl_Check_Button *btnUseGroupColors=(Fl_Check_Button *)0; static void cb_btnUseGroupColors(Fl_Check_Button* o, void*) { progdefaults.useGroupColors = o->value(); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnGroup1=(Fl_Button *)0; static void cb_btnGroup1(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnGroup1.R; g = progdefaults.btnGroup1.G; b = progdefaults.btnGroup1.B; if (fl_color_chooser("Group 1", r, g, b) == 0) return; progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnGroup2=(Fl_Button *)0; static void cb_btnGroup2(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnGroup2.R; g = progdefaults.btnGroup2.G; b = progdefaults.btnGroup2.B; if (fl_color_chooser("Group 2", r, g, b) == 0) return; progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnGroup3=(Fl_Button *)0; static void cb_btnGroup3(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.btnGroup3.R; g = progdefaults.btnGroup3.G; b = progdefaults.btnGroup3.B; if (fl_color_chooser("Group 3", r, g, b) == 0) return; progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; o->color(fl_rgb_color(r,g,b)); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnFkeyDEfaults=(Fl_Button *)0; static void cb_btnFkeyDEfaults(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr; r = 80; g = 144; b = 144; clr = fl_rgb_color(r,g,b); btnGroup1->color(clr); progdefaults.btnGroup1.R = r; progdefaults.btnGroup1.G = g; progdefaults.btnGroup1.B = b; r = 144; g = 80; b = 80; clr = fl_rgb_color(r,g,b); btnGroup2->color(clr); progdefaults.btnGroup2.R = r; progdefaults.btnGroup2.G = g; progdefaults.btnGroup2.B = b; r = 80; g = 80; b = 144; clr = fl_rgb_color(r,g,b); btnGroup3->color(clr); progdefaults.btnGroup3.R = r; progdefaults.btnGroup3.G = g; progdefaults.btnGroup3.B = b; progdefaults.MacroBtnFontcolor = FL_BLACK; progdefaults.MacroBtnFontnbr = FL_HELVETICA; progdefaults.MacroBtnFontsize = 12; btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); btnGroup1->labelfont(progdefaults.MacroBtnFontnbr); btnGroup2->labelfont(progdefaults.MacroBtnFontnbr); btnGroup3->labelfont(progdefaults.MacroBtnFontnbr); btnGroup1->labelsize(progdefaults.MacroBtnFontsize); btnGroup2->labelsize(progdefaults.MacroBtnFontsize); btnGroup3->labelsize(progdefaults.MacroBtnFontsize); btnGroup1->redraw_label(); btnGroup2->redraw_label(); btnGroup3->redraw_label(); colorize_macros(); progdefaults.changed = true; } Fl_Button *btnMacroBtnFont=(Fl_Button *)0; static void cb_btnMacroBtnFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.MacroBtnFontnbr); font_browser->fontSize(progdefaults.MacroBtnFontsize); font_browser->fontColor(progdefaults.MacroBtnFontcolor); if (font_browser->fixed_width(progdefaults.MacroBtnFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbMacroBtnFontBrowser); font_browser->show(); } Fl_Output *LOGGINGdisplay=(Fl_Output *)0; Fl_Button *btnLOGGING_color=(Fl_Button *)0; static void cb_btnLOGGING_color(Fl_Button*, void*) { uchar r, g, b; Fl::get_color(progdefaults.LOGGINGcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGGINGcolor = fl_rgb_color(r, g, b); LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true; } Fl_Button *btn_LOGGING_font=(Fl_Button *)0; static void cb_btn_LOGGING_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.LOGGINGtextfont); font_browser->fontSize(progdefaults.LOGGINGtextsize); font_browser->fontColor(progdefaults.LOGGINGtextcolor); if (font_browser->fixed_width(progdefaults.LOGGINGtextfont)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGGINGFontBrowser); font_browser->show(); } Fl_Button *btnLOGGINGdefault_colors_font=(Fl_Button *)0; static void cb_btnLOGGINGdefault_colors_font(Fl_Button*, void*) { progdefaults.LOGGINGcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGGINGtextfont = (Fl_Font)0; progdefaults.LOGGINGtextsize = 14; progdefaults.LOGGINGtextcolor = FL_BLACK; LOGGINGdisplay->color(progdefaults.LOGGINGcolor); LOGGINGdisplay->textsize(progdefaults.LOGGINGtextsize); LOGGINGdisplay->textcolor(progdefaults.LOGGINGtextcolor); LOGGINGdisplay->textfont(progdefaults.LOGGINGtextfont); LOGGINGdisplay->redraw(); LOGGING_colors_font(); progdefaults.changed = true; } Fl_Output *LOGBOOKdisplay=(Fl_Output *)0; Fl_Button *btnLOGBOOK_color=(Fl_Button *)0; static void cb_btnLOGBOOK_color(Fl_Button*, void*) { uchar r, g, b; Fl::get_color(progdefaults.LOGBOOKcolor, r, g, b); if (!fl_color_chooser("Background", r, g, b)) return; progdefaults.LOGBOOKcolor = fl_rgb_color(r, g, b); LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Button *btn_LOGBOOK_font=(Fl_Button *)0; static void cb_btn_LOGBOOK_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.LOGBOOKtextfont); font_browser->fontSize(progdefaults.LOGBOOKtextsize); font_browser->fontColor(progdefaults.LOGBOOKtextcolor); if (font_browser->fixed_width(progdefaults.LOGBOOKtextfont)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbLOGBOOKFontBrowser); font_browser->show(); } Fl_Button *btnLOGBOOKdefault_colors_font=(Fl_Button *)0; static void cb_btnLOGBOOKdefault_colors_font(Fl_Button*, void*) { progdefaults.LOGBOOKcolor = FL_BACKGROUND2_COLOR; progdefaults.LOGBOOKtextfont = (Fl_Font)0; progdefaults.LOGBOOKtextsize = 14; progdefaults.LOGBOOKtextcolor = FL_BLACK; LOGBOOKdisplay->color(progdefaults.LOGBOOKcolor); LOGBOOKdisplay->textsize(progdefaults.LOGBOOKtextsize); LOGBOOKdisplay->textcolor(progdefaults.LOGBOOKtextcolor); LOGBOOKdisplay->textfont(progdefaults.LOGBOOKtextfont); LOGBOOKdisplay->redraw(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Output *DXC_display=(Fl_Output *)0; Fl_Button *btn_DXC_font=(Fl_Button *)0; static void cb_btn_DXC_font(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.DXC_textfont); font_browser->fontSize(progdefaults.DXC_textsize); font_browser->fontColor(progdefaults.DXC_textcolor); if (font_browser->fixed_width(progdefaults.DXC_textfont)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbDXC_FontBrowser); font_browser->show(); } Fl_Button *btnDXCdefault_colors_font=(Fl_Button *)0; static void cb_btnDXCdefault_colors_font(Fl_Button*, void*) { progdefaults.DXC_textfont = FL_COURIER; progdefaults.DXC_textsize = 14; progdefaults.DXC_textcolor = FL_BLACK; progdefaults.DXC_even_color = 7; progdefaults.DXC_odd_color = 246; DXC_display->textsize(progdefaults.DXC_textsize); DXC_display->textcolor(progdefaults.DXC_textcolor); DXC_display->textfont(progdefaults.DXC_textfont); DXC_display->redraw(); } Fl_Button *btn_DXC_even_lines=(Fl_Button *)0; static void cb_btn_DXC_even_lines(Fl_Button* o, void*) { progdefaults.DXC_even_color = fl_show_colormap((Fl_Color)progdefaults.DXC_even_color); o->color(progdefaults.DXC_even_color); o->redraw(); dxc_lines_redraw(); progdefaults.changed = true; } Fl_Button *btn_DXC_odd_lines=(Fl_Button *)0; static void cb_btn_DXC_odd_lines(Fl_Button* o, void*) { progdefaults.DXC_odd_color = fl_show_colormap((Fl_Color)progdefaults.DXC_odd_color); o->color(progdefaults.DXC_odd_color); o->redraw(); dxc_lines_redraw(); progdefaults.changed = true; } Fl_Input *StreamText=(Fl_Input *)0; Fl_Button *btnDXcolor=(Fl_Button *)0; static void cb_btnDXcolor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.DX_Color.R; g = progdefaults.DX_Color.G; b = progdefaults.DX_Color.B; if (!fl_color_chooser("DX Color", r, g, b)) return; progdefaults.DX_Color.R = r; progdefaults.DX_Color.G = g; progdefaults.DX_Color.B = b; StreamText->color(fl_rgb_color(r,g,b)); StreamText->redraw(); brws_tcpip_stream->color(fl_rgb_color(r,g,b)); brws_tcpip_stream->redraw(); brws_dxcluster_hosts->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxcluster_hosts->textcolor(progdefaults.DXfontcolor); brws_dxcluster_hosts->textfont(progdefaults.DXfontnbr); brws_dxcluster_hosts->textsize(progdefaults.DXfontsize); brws_dxcluster_hosts->redraw(); brws_dxc_help->color(fl_rgb_color(r,g,b)); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->redraw(); ed_telnet_cmds->color(fl_rgb_color(r,g,b)); ed_telnet_cmds->redraw(); dxcluster_hosts_load(); progdefaults.changed = true; } Fl_Button *btnDXfont=(Fl_Button *)0; static void cb_btnDXfont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.DXfontnbr); font_browser->fontSize(progdefaults.DXfontsize); font_browser->fontColor(progdefaults.DXfontcolor); if (font_browser->fixed_width(progdefaults.DXfontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbDXfont_browser); font_browser->show(); } Fl_Button *btnDXalt_color=(Fl_Button *)0; static void cb_btnDXalt_color(Fl_Button* o, void*) { choose_color(progdefaults.DXalt_color); o->labelcolor(progdefaults.DXalt_color); o->redraw_label(); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->redraw(); progdefaults.changed = true; } Fl_Button *btnDXdefault_colors_font=(Fl_Button *)0; static void cb_btnDXdefault_colors_font(Fl_Button*, void*) { progdefaults.DX_Color.R = 255; progdefaults.DX_Color.G = 255; progdefaults.DX_Color.B = 255; progdefaults.DXfontnbr = FL_COURIER; progdefaults.DXfontsize = 14; progdefaults.DXfontcolor = FL_BLACK; progdefaults.DXalt_color = fl_rgb_color(200, 0, 0); btnDXalt_color->labelcolor(progdefaults.DXalt_color); btnDXalt_color->redraw_label(); brws_tcpip_stream->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_tcpip_stream->setFont(progdefaults.DXfontnbr); brws_tcpip_stream->setFontSize(progdefaults.DXfontsize); brws_tcpip_stream->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_tcpip_stream->setFontColor(progdefaults.DXalt_color, FTextBase::XMIT); brws_tcpip_stream->redraw(); ed_telnet_cmds->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); ed_telnet_cmds->setFont(progdefaults.DXfontnbr); ed_telnet_cmds->setFontSize(progdefaults.DXfontsize); ed_telnet_cmds->setFontColor(progdefaults.DXfontcolor); ed_telnet_cmds->redraw(); brws_dxc_help->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); brws_dxc_help->setFont(progdefaults.DXfontnbr); brws_dxc_help->setFontSize(progdefaults.DXfontsize); brws_dxc_help->setFontColor(progdefaults.DXfontcolor, FTextBase::RECV); brws_dxc_help->redraw(); StreamText->color(fl_rgb_color( progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); StreamText->textcolor(progdefaults.DXfontcolor); StreamText->redraw(); dxcluster_hosts_load(); font_browser->hide(); progdefaults.changed = true; } Fl_ListBox *listbox_charset_status=(Fl_ListBox *)0; Fl_Input *RxText=(Fl_Input *)0; Fl_Button *btnRxColor=(Fl_Button *)0; static void cb_btnRxColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.RxColor.R; g = progdefaults.RxColor.G; b = progdefaults.RxColor.B; if (!fl_color_chooser("Rx Color", r, g, b)) return; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; RxText->color(fl_rgb_color(r,g,b)); ReceiveText->color(RxText->color()); RxText->redraw(); ReceiveText->redraw(); progdefaults.changed = true; } Fl_Button *btnTxColor=(Fl_Button *)0; static void cb_btnTxColor(Fl_Button*, void*) { uchar r, g, b; r = progdefaults.TxColor.R; g = progdefaults.TxColor.G; b = progdefaults.TxColor.B; if (!fl_color_chooser("Tx Color", r, g, b)) return; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(fl_rgb_color(r,g,b)); TransmitText->color(TxText->color()); TxText->redraw(); TransmitText->redraw(); progdefaults.changed = true; } Fl_Input *TxText=(Fl_Input *)0; Fl_Button *btnRxFont=(Fl_Button *)0; static void cb_btnRxFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.RxFontnbr); font_browser->fontSize(progdefaults.RxFontsize); font_browser->fontColor(progdefaults.RxFontcolor); if (font_browser->fixed_width(progdefaults.RxFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbRxFontBrowser); font_browser->show(); } Fl_Button *btnTxFont=(Fl_Button *)0; static void cb_btnTxFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.TxFontnbr); font_browser->fontSize(progdefaults.TxFontsize); font_browser->fontColor(progdefaults.TxFontcolor); if (font_browser->fixed_width(progdefaults.TxFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbTxFontBrowser); font_browser->show(); } Fl_Input *MacroText=(Fl_Input *)0; Fl_Button *btnMacroEditFont=(Fl_Button *)0; static void cb_btnMacroEditFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.MacroEditFontnbr); font_browser->fontSize(progdefaults.MacroEditFontsize); if (font_browser->fixed_width(progdefaults.MacroEditFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbMacroEditFontBrowser); font_browser->show(); } Fl_Button *btnXMIT=(Fl_Button *)0; static void cb_btnXMIT(Fl_Button*, void*) { choose_color(progdefaults.XMITcolor); btnXMIT->color( progdefaults.XMITcolor ); btnXMIT->redraw(); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); progdefaults.changed = true; } Fl_Button *btnCTRL=(Fl_Button *)0; static void cb_btnCTRL(Fl_Button*, void*) { choose_color(progdefaults.CTRLcolor); btnCTRL->color( progdefaults.CTRLcolor ); btnCTRL->redraw(); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); progdefaults.changed = true; } Fl_Button *btnSKIP=(Fl_Button *)0; static void cb_btnSKIP(Fl_Button*, void*) { choose_color(progdefaults.SKIPcolor); btnSKIP->color( progdefaults.SKIPcolor ); btnSKIP->redraw(); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); progdefaults.changed = true; } Fl_Button *btnALTR=(Fl_Button *)0; static void cb_btnALTR(Fl_Button*, void*) { choose_color(progdefaults.ALTRcolor); btnALTR->color( progdefaults.ALTRcolor ); btnALTR->redraw(); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); progdefaults.changed = true; } Fl_Button *btnSEL=(Fl_Button *)0; static void cb_btnSEL(Fl_Button*, void*) { choose_color(progdefaults.RxTxSelectcolor); btnSEL->color( progdefaults.RxTxSelectcolor ); btnSEL->redraw(); ReceiveText->color( fl_rgb_color( progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B), progdefaults.RxTxSelectcolor); TransmitText->color( fl_rgb_color( progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B), progdefaults.RxTxSelectcolor); progdefaults.changed = true; } Fl_Button *btnNoTextColor=(Fl_Button *)0; static void cb_btnNoTextColor(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr = FL_BACKGROUND2_COLOR; Fl::get_color(clr, r, g, b); progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true; } Fl_Button *btnTextDefaults=(Fl_Button *)0; static void cb_btnTextDefaults(Fl_Button*, void*) { uchar r, g, b; Fl_Color clr; progdefaults.TxFontcolor = FL_BLACK; progdefaults.RxFontcolor = FL_BLACK; progdefaults.XMITcolor = FL_RED; progdefaults.CTRLcolor = FL_DARK_GREEN; progdefaults.SKIPcolor = FL_BLUE; progdefaults.ALTRcolor = FL_DARK_MAGENTA; btnXMIT->color(progdefaults.XMITcolor); btnCTRL->color(progdefaults.CTRLcolor); btnSKIP->color(progdefaults.SKIPcolor); btnALTR->color(progdefaults.ALTRcolor); btnXMIT->redraw(); btnCTRL->redraw(); btnSKIP->redraw(); btnALTR->redraw(); r = 255; g = 242; b = 190; progdefaults.RxColor.R = r; progdefaults.RxColor.G = g; progdefaults.RxColor.B = b; clr = fl_rgb_color(r,g,b); RxText->color(clr); RxText->textcolor(progdefaults.RxFontcolor); RxText->redraw(); ReceiveText->color(clr); ReceiveText->setFontColor(progdefaults.RxFontcolor, FTextBase::RECV); ReceiveText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); ReceiveText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); ReceiveText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); ReceiveText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); ReceiveText->redraw(); r = 200; g = 235; b = 255; progdefaults.TxColor.R = r; progdefaults.TxColor.G = g; progdefaults.TxColor.B = b; clr = fl_rgb_color(r,g,b); TxText->color(clr); TxText->textcolor(progdefaults.TxFontcolor); TxText->redraw(); TransmitText->color(clr); TransmitText->setFontColor(progdefaults.TxFontcolor, FTextBase::RECV); TransmitText->setFontColor(progdefaults.XMITcolor, FTextBase::XMIT); TransmitText->setFontColor(progdefaults.CTRLcolor, FTextBase::CTRL); TransmitText->setFontColor(progdefaults.SKIPcolor, FTextBase::SKIP); TransmitText->setFontColor(progdefaults.ALTRcolor, FTextBase::ALTR); TransmitText->redraw(); progdefaults.changed = true; } Fl_Check_Button *btn_show_all_codes=(Fl_Check_Button *)0; static void cb_btn_show_all_codes(Fl_Check_Button* o, void*) { progdefaults.show_all_codes=o->value(); progdefaults.changed = true; } Fl_Button *btnTabColor=(Fl_Button *)0; static void cb_btnTabColor(Fl_Button*, void*) { progdefaults.TabsColor = fl_show_colormap(progdefaults.TabsColor); setTabColors(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Button *btnTabDefaultColor=(Fl_Button *)0; static void cb_btnTabDefaultColor(Fl_Button*, void*) { progdefaults.TabsColor = FL_BACKGROUND2_COLOR; setTabColors(); LOGBOOK_colors_font(); progdefaults.changed = true; } Fl_Box *lowcolor=(Fl_Box *)0; Fl_Button *btnLowSignal=(Fl_Button *)0; static void cb_btnLowSignal(Fl_Button*, void*) { progdefaults.LowSignal = fl_show_colormap(progdefaults.LowSignal); lowcolor->color(progdefaults.LowSignal); lowcolor->redraw(); progdefaults.changed = true; } Fl_Box *normalcolor=(Fl_Box *)0; Fl_Counter *cnt_normal_signal_level=(Fl_Counter *)0; static void cb_cnt_normal_signal_level(Fl_Counter* o, void*) { progdefaults.normal_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level); } Fl_Button *btnNormalSignal=(Fl_Button *)0; static void cb_btnNormalSignal(Fl_Button*, void*) { progdefaults.NormSignal = fl_show_colormap(progdefaults.NormSignal); normalcolor->color(progdefaults.NormSignal); normalcolor->redraw(); progdefaults.changed = true; } Fl_Box *highcolor=(Fl_Box *)0; Fl_Counter *cnt_high_signal_level=(Fl_Counter *)0; static void cb_cnt_high_signal_level(Fl_Counter* o, void*) { progdefaults.high_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level); } Fl_Button *btnHighSignal=(Fl_Button *)0; static void cb_btnHighSignal(Fl_Button*, void*) { progdefaults.HighSignal = fl_show_colormap(progdefaults.HighSignal); highcolor->color(progdefaults.HighSignal); highcolor->redraw(); progdefaults.changed = true; } Fl_Box *overcolor=(Fl_Box *)0; Fl_Counter *cnt_over_signal_level=(Fl_Counter *)0; static void cb_cnt_over_signal_level(Fl_Counter* o, void*) { progdefaults.over_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level); } Fl_Button *btnOverSignal=(Fl_Button *)0; static void cb_btnOverSignal(Fl_Button*, void*) { progdefaults.OverSignal = fl_show_colormap(progdefaults.OverSignal); overcolor->color(progdefaults.OverSignal); overcolor->redraw(); progdefaults.changed = true; } vumeter *sig_vumeter=(vumeter *)0; Fl_Button *btn_default_signal_levels=(Fl_Button *)0; static void cb_btn_default_signal_levels(Fl_Button*, void*) { cnt_normal_signal_level->value( progdefaults.normal_signal_level = -60.0); cnt_high_signal_level->value( progdefaults.high_signal_level = -6.0); cnt_over_signal_level->value( progdefaults.over_signal_level = -3.0); } Fl_Check_Button *btn_use_wsjtx_vumeter_scale=(Fl_Check_Button *)0; static void cb_btn_use_wsjtx_vumeter_scale(Fl_Check_Button* o, void*) { progdefaults.use_wsjtx_vumeter_scale=o->value(); btn_use_wsjtx_vumeter_scale2->value(o->value()); } Fl_Box *scope_background=(Fl_Box *)0; Fl_Button *btnScopeBackground=(Fl_Button *)0; static void cb_btnScopeBackground(Fl_Button*, void*) { progdefaults.digi_background = fl_show_colormap(progdefaults.digi_background); scope_background->color(progdefaults.digi_background); scope_background->redraw(); set_scope_colors(); progdefaults.changed = true; } Fl_Box *scope_axis=(Fl_Box *)0; Fl_Button *btnScopeAxis=(Fl_Button *)0; static void cb_btnScopeAxis(Fl_Button*, void*) { progdefaults.digi_axis_color = fl_show_colormap(progdefaults.digi_axis_color); scope_axis->color(progdefaults.digi_axis_color); scope_axis->redraw(); set_scope_colors(); progdefaults.changed = true; } Fl_Box *scope_color_1=(Fl_Box *)0; Fl_Button *btnScopeColor_1=(Fl_Button *)0; static void cb_btnScopeColor_1(Fl_Button*, void*) { progdefaults.digi_color_1 = fl_show_colormap(progdefaults.digi_color_1); scope_color_1->color(progdefaults.digi_color_1); scope_color_1->redraw(); set_scope_colors(); progdefaults.changed = true; } Fl_Box *scope_color_2=(Fl_Box *)0; Fl_Button *btnScopeColor_2=(Fl_Button *)0; static void cb_btnScopeColor_2(Fl_Button*, void*) { progdefaults.digi_color_2 = fl_show_colormap(progdefaults.digi_color_2); scope_color_2->color(progdefaults.digi_color_2); scope_color_2->redraw(); set_scope_colors(); progdefaults.changed = true; } Fl_Button *btn_default_scope_colors=(Fl_Button *)0; static void cb_btn_default_scope_colors(Fl_Button*, void*) { progdefaults.digi_background = FL_BLACK; progdefaults.digi_axis_color = FL_WHITE; progdefaults.digi_color_1 = FL_GREEN; progdefaults.digi_color_2 = FL_YELLOW; progdefaults.digi_color_3 = FL_CYAN; progdefaults.digi_color_4 = FL_MAGENTA; scope_background->color(progdefaults.digi_background); scope_background->redraw(); scope_axis->color(progdefaults.digi_axis_color); scope_axis->redraw(); scope_color_1->color(progdefaults.digi_color_1); scope_color_1->redraw(); scope_color_2->color(progdefaults.digi_color_2); scope_color_2->redraw(); scope_color_3->color(progdefaults.digi_color_3); scope_color_3->redraw(); scope_color_4->color(progdefaults.digi_color_4); scope_color_4->redraw(); set_scope_colors(); progdefaults.changed = true; } Fl_Box *scope_color_3=(Fl_Box *)0; Fl_Button *btnScopeColor_3=(Fl_Button *)0; static void cb_btnScopeColor_3(Fl_Button*, void*) { progdefaults.digi_color_3 = fl_show_colormap(progdefaults.digi_color_3); scope_color_3->color(progdefaults.digi_color_3); scope_color_3->redraw(); set_scope_colors(); progdefaults.changed = true; } Fl_Box *scope_color_4=(Fl_Box *)0; Fl_Button *btnScopeColor_4=(Fl_Button *)0; static void cb_btnScopeColor_4(Fl_Button*, void*) { progdefaults.digi_color_4 = fl_show_colormap(progdefaults.digi_color_4); scope_color_4->color(progdefaults.digi_color_4); scope_color_4->redraw(); set_scope_colors(); progdefaults.changed = true; } Fl_ListBox *listbox_contest=(Fl_ListBox *)0; static void cb_listbox_contest(Fl_ListBox* o, void*) { progdefaults.logging = o->index(); if (contests[progdefaults.logging].name == "State QSO parties") { progdefaults.CONTESTnotes = QSOparties.qso_parties[progdefaults.SQSOcontest].notes; progdefaults.SQSOinstate = (QSOparties.qso_parties[progdefaults.SQSOcontest].instate[0] == 'T'); } else { listbox_QP_contests->index(0); progdefaults.CONTESTnotes = contests[progdefaults.logging].notes; } inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); UI_select(); clear_log_fields(); clearQSO(); progdefaults.changed = true; } Fl_ListBox *listbox_QP_contests=(Fl_ListBox *)0; static void cb_listbox_QP_contests(Fl_ListBox* o, void*) { int n = o->index(); progdefaults.SQSOcontest = n; progdefaults.SQSOinstate = (QSOparties.qso_parties[n].instate[0] == 'T'); if (contests[progdefaults.logging].name == "State QSO parties") { progdefaults.CONTESTnotes = QSOparties.qso_parties[n].notes; inp_contest_notes->value(progdefaults.CONTESTnotes.c_str()); } else inp_contest_notes->value(""); adjust_for_contest(0); UI_select(); clear_log_fields(); clearQSO(); progdefaults.changed = true; } Fl_Input2 *inp_contest_notes=(Fl_Input2 *)0; Fl_Light_Button *btnDupCheckOn=(Fl_Light_Button *)0; static void cb_btnDupCheckOn(Fl_Light_Button* o, void*) { progdefaults.EnableDupCheck = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupBand=(Fl_Check_Button *)0; static void cb_btnDupBand(Fl_Check_Button* o, void*) { progdefaults.dupband = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupMode=(Fl_Check_Button *)0; static void cb_btnDupMode(Fl_Check_Button* o, void*) { progdefaults.dupmode = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupTimeSpan=(Fl_Check_Button *)0; static void cb_btnDupTimeSpan(Fl_Check_Button* o, void*) { progdefaults.duptimespan=(int)o->value(); progdefaults.changed = true; } Fl_Button *btnDupColor=(Fl_Button *)0; static void cb_btnDupColor(Fl_Button* o, void*) { fl_color_chooser("Dup Check", progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B); o->color( fl_rgb_color( progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B)); o->redraw(); progdefaults.changed = true; } Fl_Button *btnPossibleDupColor=(Fl_Button *)0; static void cb_btnPossibleDupColor(Fl_Button* o, void*) { fl_color_chooser("Possible_Dup Check", progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B); o->color( fl_rgb_color( progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B)); o->redraw(); progdefaults.changed = true; } Fl_Check_Button *btnDupXchg1=(Fl_Check_Button *)0; static void cb_btnDupXchg1(Fl_Check_Button* o, void*) { progdefaults.dupxchg1 = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDupState=(Fl_Check_Button *)0; static void cb_btnDupState(Fl_Check_Button* o, void*) { progdefaults.dupstate = o->value(); progdefaults.changed = true; } Fl_Value_Input2 *nbrTimeSpan=(Fl_Value_Input2 *)0; static void cb_nbrTimeSpan(Fl_Value_Input2* o, void*) { progdefaults.timespan = (int)o->value(); progdefaults.changed = true; } Fl_Input2 *inpSend1=(Fl_Input2 *)0; static void cb_inpSend1(Fl_Input2* o, void*) { progdefaults.myXchg=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn599=(Fl_Check_Button *)0; static void cb_btn599(Fl_Check_Button* o, void*) { progdefaults.fixed599 = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCutNbrs=(Fl_Check_Button *)0; static void cb_btnCutNbrs(Fl_Check_Button* o, void*) { progdefaults.cutnbrs=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *nbrContestStart=(Fl_Value_Input2 *)0; static void cb_nbrContestStart(Fl_Value_Input2* o, void*) { progdefaults.ContestStart = (int)o->value(); progdefaults.changed = true; } Fl_Value_Input2 *nbrContestDigits=(Fl_Value_Input2 *)0; static void cb_nbrContestDigits(Fl_Value_Input2* o, void*) { progdefaults.ContestDigits = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUseLeadingZeros=(Fl_Check_Button *)0; static void cb_btnUseLeadingZeros(Fl_Check_Button* o, void*) { progdefaults.UseLeadingZeros = o->value(); progdefaults.changed = true; } Fl_Button *btnResetSerNbr=(Fl_Button *)0; static void cb_btnResetSerNbr(Fl_Button*, void*) { cb_ResetSerNbr(); } Fl_Input2 *inp_my_FD_call=(Fl_Input2 *)0; static void cb_inp_my_FD_call(Fl_Input2* o, void*) { progdefaults.fd_op_call=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_my_FD_section=(Fl_Input2 *)0; static void cb_inp_my_FD_section(Fl_Input2* o, void*) { progdefaults.my_FD_section=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_my_FD_class=(Fl_Input2 *)0; static void cb_inp_my_FD_class(Fl_Input2* o, void*) { progdefaults.my_FD_class=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_my_SCR_class=(Fl_Input2 *)0; static void cb_inp_my_SCR_class(Fl_Input2* o, void*) { progdefaults.my_SCR_class=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_my_JOTA_troop=(Fl_Input2 *)0; static void cb_inp_my_JOTA_troop(Fl_Input2* o, void*) { progdefaults.my_JOTA_troop=o->value(); progdefaults.changed = true; } Fl_Input2 *inp_my_JOTA_scout=(Fl_Input2 *)0; static void cb_inp_my_JOTA_scout(Fl_Input2* o, void*) { progdefaults.my_JOTA_scout = o->value(); progdefaults.changed=true; } Fl_Group *sld=(Fl_Group *)0; Fl_Check_Button *btnCWID=(Fl_Check_Button *)0; static void cb_btnCWID(Fl_Check_Button* o, void*) { progdefaults.CWid = o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrCWIDwpm=(Fl_Value_Slider2 *)0; static void cb_sldrCWIDwpm(Fl_Value_Slider2* o, void*) { progdefaults.CWIDwpm = (int)o->value(); progdefaults.changed = true; } Fl_Button *bCWIDModes=(Fl_Button *)0; static void cb_bCWIDModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.cwid_modes); progdefaults.changed = true; } Fl_Check_Button *chkRSidNotifyOnly=(Fl_Check_Button *)0; static void cb_chkRSidNotifyOnly(Fl_Check_Button* o, void*) { progdefaults.rsid_notify_only = o->value(); notify_create_rsid_event(progdefaults.rsid_notify_only); if (progdefaults.rsid_notify_only) { chkRetainFreqLock->deactivate(); chkDisableFreqChange->deactivate(); } else { chkRetainFreqLock->activate(); chkDisableFreqChange->activate(); } progdefaults.changed = true; } Fl_Button *bRSIDRxModes=(Fl_Button *)0; static void cb_bRSIDRxModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.rsid_rx_modes); progdefaults.changed = true; } Fl_Check_Button *chkRSidMark=(Fl_Check_Button *)0; static void cb_chkRSidMark(Fl_Check_Button* o, void*) { progdefaults.rsid_mark = o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_rsid_errors=(Fl_ListBox *)0; static void cb_listbox_rsid_errors(Fl_ListBox* o, void*) { progdefaults.RsID_label_type = o->index(); progdefaults.changed = true; } Fl_Check_Button *chkRSidShowAlert=(Fl_Check_Button *)0; static void cb_chkRSidShowAlert(Fl_Check_Button* o, void*) { progdefaults.disable_rsid_warning_dialog_box = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRSidAutoDisable=(Fl_Check_Button *)0; static void cb_chkRSidAutoDisable(Fl_Check_Button* o, void*) { progdefaults.rsid_auto_disable = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRetainFreqLock=(Fl_Check_Button *)0; static void cb_chkRetainFreqLock(Fl_Check_Button* o, void*) { progdefaults.retain_freq_lock = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkDisableFreqChange=(Fl_Check_Button *)0; static void cb_chkDisableFreqChange(Fl_Check_Button* o, void*) { progdefaults.disable_rsid_freq_change = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_RSID_EOT=(Fl_Check_Button *)0; static void cb_chk_RSID_EOT(Fl_Check_Button* o, void*) { progdefaults.rsid_eot_squelch = o->value(); progdefaults.changed = true; } Fl_Counter *val_RSIDsquelch=(Fl_Counter *)0; static void cb_val_RSIDsquelch(Fl_Counter* o, void*) { progdefaults.rsid_squelch = (int)o->value(); progdefaults.changed = true; } Fl_Counter *val_pretone=(Fl_Counter *)0; static void cb_val_pretone(Fl_Counter* o, void*) { progdefaults.pretone = o->value(); progdefaults.changed = true; } Fl_Button *bRSIDTxModes=(Fl_Button *)0; static void cb_bRSIDTxModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.rsid_tx_modes); progdefaults.changed = true; } Fl_Check_Button *btn_post_rsid=(Fl_Check_Button *)0; static void cb_btn_post_rsid(Fl_Check_Button* o, void*) { progdefaults.rsid_post=o->value(); progdefaults.changed = true; } Fl_Counter *val_rsid_min_bw=(Fl_Counter *)0; static void cb_val_rsid_min_bw(Fl_Counter* o, void*) { progdefaults.rsid_min_bw = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkRSidWideSearch=(Fl_Check_Button *)0; static void cb_chkRSidWideSearch(Fl_Check_Button* o, void*) { progdefaults.rsidWideSearch=o->value(); rxid_selection_color(); progdefaults.changed = true; } Fl_Button *btn_rsid_default_bw=(Fl_Button *)0; static void cb_btn_rsid_default_bw(Fl_Button*, void*) { val_rsid_min_bw->value(200); progdefaults.rsid_min_bw = 200; progdefaults.changed = true; } Fl_Check_Button *btnsendid=(Fl_Check_Button *)0; static void cb_btnsendid(Fl_Check_Button* o, void*) { progdefaults.sendid=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnsendvideotext=(Fl_Check_Button *)0; static void cb_btnsendvideotext(Fl_Check_Button* o, void*) { progdefaults.sendtextid=o->value(); progdefaults.changed = true; } Fl_Input2 *valVideotext=(Fl_Input2 *)0; static void cb_valVideotext(Fl_Input2* o, void*) { progdefaults.strTextid = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkID_SMALL=(Fl_Check_Button *)0; static void cb_chkID_SMALL(Fl_Check_Button* o, void*) { progdefaults.ID_SMALL=o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrVideowidth=(Fl_Value_Slider2 *)0; static void cb_sldrVideowidth(Fl_Value_Slider2* o, void*) { progdefaults.videowidth = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_vidlimit=(Fl_Check_Button *)0; static void cb_btn_vidlimit(Fl_Check_Button* o, void*) { progdefaults.vidlimit=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_vidmodelimit=(Fl_Check_Button *)0; static void cb_btn_vidmodelimit(Fl_Check_Button* o, void*) { progdefaults.vidmodelimit=o->value(); progdefaults.changed=true; } Fl_Button *bVideoIDModes=(Fl_Button *)0; static void cb_bVideoIDModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(0); mode_browser->show_(&progdefaults.videoid_modes); progdefaults.changed = true; } Fl_Check_Button *btnConnectToMaclogger=(Fl_Check_Button *)0; static void cb_btnConnectToMaclogger(Fl_Check_Button* o, void*) { progdefaults.connect_to_maclogger = o->value(); if (progdefaults.connect_to_maclogger == false) maclogger_close(); else maclogger_init(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_radio=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_radio(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_radio = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_log=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_log(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_log = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_lookup=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_lookup(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_lookup = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_spot_tune=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_spot_tune(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_spot_tune = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_capture_maclogger_spot_report=(Fl_Check_Button *)0; static void cb_btn_capture_maclogger_spot_report(Fl_Check_Button* o, void*) { progdefaults.capture_maclogger_spot_report = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_enable_maclogger_log=(Fl_Check_Button *)0; static void cb_btn_enable_maclogger_log(Fl_Check_Button* o, void*) { progdefaults.enable_maclogger_log = o->value(); progdefaults.changed = true; } Fl_Text_Display *txt_UDP_data=(Fl_Text_Display *)0; Fl_Output *txt_maclogger_log_filename=(Fl_Output *)0; static void cb_Clear(Fl_Button*, void*) { txt_UDP_data->buffer()->text(""); } Fl_Check_Button *btn_maclogger_spot_rx=(Fl_Check_Button *)0; static void cb_btn_maclogger_spot_rx(Fl_Check_Button* o, void*) { progdefaults.maclogger_spot_rx = o->value(); progdefaults.changed = true; } Fl_Text_Display *txt_N3FJP_data=(Fl_Text_Display *)0; static void cb_Clear1(Fl_Button*, void*) { txt_N3FJP_data->buffer()->text(""); } Fl_Input2 *txt_N3FJP_ip_address=(Fl_Input2 *)0; static void cb_txt_N3FJP_ip_address(Fl_Input2* o, void*) { progdefaults.N3FJP_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_N3FJP_ip_port_no=(Fl_Input2 *)0; static void cb_txt_N3FJP_ip_port_no(Fl_Input2* o, void*) { progdefaults.N3FJP_port = o->value(); progdefaults.changed = true; } Fl_Button *btn_default_N3FJP_ip=(Fl_Button *)0; static void cb_btn_default_N3FJP_ip(Fl_Button*, void*) { txt_N3FJP_ip_address->value("127.0.0.1"); progdefaults.N3FJP_address = "127.0.0.1"; txt_N3FJP_ip_port_no->value("1100"); progdefaults.N3FJP_port = "1100"; progdefaults.changed = true; } Fl_Check_Button *btn_enable_N3FJP_log=(Fl_Check_Button *)0; static void cb_btn_enable_N3FJP_log(Fl_Check_Button* o, void*) { progdefaults.enable_N3FJP_log = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_connect_to_n3fjp=(Fl_Check_Button *)0; static void cb_btn_connect_to_n3fjp(Fl_Check_Button* o, void*) { progdefaults.connect_to_n3fjp=o->value(); progdefaults.changed=true; } Fl_Box *box_n3fjp_connected=(Fl_Box *)0; Fl_Check_Button *btn_N3FJP_sweet_spot=(Fl_Check_Button *)0; static void cb_btn_N3FJP_sweet_spot(Fl_Check_Button* o, void*) { progdefaults.N3FJP_sweet_spot = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_N3FJP_modem_carrier=(Fl_Check_Button *)0; static void cb_btn_N3FJP_modem_carrier(Fl_Check_Button* o, void*) { progdefaults.N3FJP_modem_carrier = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_enable_N3FJP_RIGTX=(Fl_Check_Button *)0; static void cb_btn_enable_N3FJP_RIGTX(Fl_Check_Button* o, void*) { progdefaults.enable_N3FJP_RIGTX = o->value(); progdefaults.changed = true; } Fl_Input2 *inpEQSL_www_url=(Fl_Input2 *)0; static void cb_inpEQSL_www_url(Fl_Input2* o, void*) { progdefaults.eqsl_www_url = o->value(); progdefaults.changed = true; } Fl_Input2 *inpEQSL_id=(Fl_Input2 *)0; static void cb_inpEQSL_id(Fl_Input2* o, void*) { progdefaults.eqsl_id = o->value(); progdefaults.changed = true; } Fl_Input2 *inpEQSL_pwd=(Fl_Input2 *)0; static void cb_inpEQSL_pwd(Fl_Input2* o, void*) { progdefaults.eqsl_pwd = o->value(); progdefaults.changed = true; } Fl_Button *btnEQSL_pwd_show=(Fl_Button *)0; static void cb_btnEQSL_pwd_show(Fl_Button* o, void*) { inpEQSL_pwd->type(inpEQSL_pwd->type() ^ FL_SECRET_INPUT); inpEQSL_pwd->redraw(); o->label((inpEQSL_pwd->type() & FL_SECRET_INPUT) ? _("Show") : _("Hide")); } Fl_Input2 *inpEQSL_nick=(Fl_Input2 *)0; static void cb_inpEQSL_nick(Fl_Input2* o, void*) { progdefaults.eqsl_nick = o->value(); progdefaults.changed = true; } Fl_Button *btn_verify_eqsl=(Fl_Button *)0; Fl_Check_Button *btn_send_when_logged=(Fl_Check_Button *)0; static void cb_btn_send_when_logged(Fl_Check_Button* o, void*) { progdefaults.eqsl_when_logged = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_send_datetime_off=(Fl_Check_Button *)0; static void cb_btn_send_datetime_off(Fl_Check_Button* o, void*) { progdefaults.eqsl_datetime_off = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_show_eqsl_delivery=(Fl_Check_Button *)0; static void cb_btn_show_eqsl_delivery(Fl_Check_Button* o, void*) { progdefaults.eqsl_show_delivery = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_eqsl_default_message=(Fl_Input2 *)0; static void cb_txt_eqsl_default_message(Fl_Input2* o, void*) { progdefaults.eqsl_default_message = o->value(); progdefaults.changed = true; } Fl_Box *eqsl_txt1=(Fl_Box *)0; Fl_Box *eqsl_txt2=(Fl_Box *)0; Fl_Box *eqsl_txt3=(Fl_Box *)0; Fl_Input2 *txt_lotw_pathname=(Fl_Input2 *)0; static void cb_txt_lotw_pathname(Fl_Input2* o, void*) { progdefaults.lotw_pathname = o->value(); progdefaults.changed = true; } Fl_Input2 *inpLOTW_pwd=(Fl_Input2 *)0; static void cb_inpLOTW_pwd(Fl_Input2* o, void*) { progdefaults.lotw_pwd = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_submit_lotw_password=(Fl_Check_Button *)0; static void cb_btn_submit_lotw_password(Fl_Check_Button* o, void*) { progdefaults.submit_lotw_password=o->value(); progdefaults.changed=true; } Fl_Input2 *inpLOTW_location=(Fl_Input2 *)0; static void cb_inpLOTW_location(Fl_Input2* o, void*) { progdefaults.lotw_location = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_lotw=(Fl_Button *)0; static void cb_btn_select_lotw(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.lotw_pathname); txt_lotw_pathname->value(str.c_str()); progdefaults.lotw_pathname = str; progdefaults.changed = true; } Fl_Check_Button *btn_lotw_quiet_mode=(Fl_Check_Button *)0; static void cb_btn_lotw_quiet_mode(Fl_Check_Button* o, void*) { progdefaults.lotw_quiet_mode=o->value(); progdefaults.changed=true; } Fl_Check_Button *btn_submit_lotw=(Fl_Check_Button *)0; static void cb_btn_submit_lotw(Fl_Check_Button* o, void*) { progdefaults.submit_lotw=o->value(); progdefaults.changed=true; } Fl_Check_Button *btn_show_lotw_delivery=(Fl_Check_Button *)0; static void cb_btn_show_lotw_delivery(Fl_Check_Button* o, void*) { progdefaults.lotw_show_delivery = o->value(); progdefaults.changed = true; } Fl_Button *btn_export_lotw=(Fl_Button *)0; static void cb_btn_export_lotw(Fl_Button*, void*) { cb_btnExportLoTW(); } Fl_Button *btn_review_lotw=(Fl_Button *)0; static void cb_btn_review_lotw(Fl_Button*, void*) { cb_review_lotw(); } Fl_Button *btn_send_lotw=(Fl_Button *)0; static void cb_btn_send_lotw(Fl_Button*, void*) { cb_send_lotw(); } Fl_Button *btnLOTW_pwd_show=(Fl_Button *)0; static void cb_btnLOTW_pwd_show(Fl_Button* o, void*) { inpLOTW_pwd->type(inpLOTW_pwd->type() ^ FL_SECRET_INPUT); inpLOTW_pwd->redraw(); o->label((inpLOTW_pwd->type() & FL_SECRET_INPUT) ? _("Show") : _("Hide")); } Fl_Button *btn_verify_lotw=(Fl_Button *)0; Fl_Button *btn_view_unmatched=(Fl_Button *)0; Fl_Counter *cnt_tracefile_timeout=(Fl_Counter *)0; static void cb_cnt_tracefile_timeout(Fl_Counter* o, void*) { progdefaults.tracefile_timeout = o->value(); } Fl_Check_Button *btnEnCloudlog=(Fl_Check_Button *)0; static void cb_btnEnCloudlog(Fl_Check_Button* o, void*) { btnEnCloudlog->value(o->value()); progdefaults.EnCloudlog=o->value(); progdefaults.changed = true; } Fl_Input2 *txt_cloudlog_api_url=(Fl_Input2 *)0; static void cb_txt_cloudlog_api_url(Fl_Input2* o, void*) { progdefaults.cloudlog_api_url = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_cloudlog_api_key=(Fl_Input2 *)0; static void cb_txt_cloudlog_api_key(Fl_Input2* o, void*) { progdefaults.cloudlog_api_key = o->value(); progdefaults.changed = true; } Fl_Spinner *sp_cloudlog_station_id=(Fl_Spinner *)0; static void cb_sp_cloudlog_station_id(Fl_Spinner* o, void*) { progdefaults.cloudlog_station_id=o->value(); progdefaults.changed = true; } Fl_Button *btnTestApiKey=(Fl_Button *)0; static void cb_btnTestApiKey(Fl_Button*, void*) { std::string url; std::string apiKey; url = txt_cloudlog_api_url->value(); apiKey = txt_cloudlog_api_key->value(); if (url.empty() || apiKey.empty()) { btnTestApiKey->labelcolor(FL_RED); } else if (test_api_key(url.c_str(), apiKey.c_str(), 5.0) == 0) { btnTestApiKey->color(FL_GREEN); } else if (test_api_key(url.c_str(), apiKey.c_str(), 5.0) == 1) { btnTestApiKey->color(FL_YELLOW); } else { btnTestApiKey->color(FL_RED); } progdefaults.changed = true; } Fl_Check_Button *btnNagMe=(Fl_Check_Button *)0; static void cb_btnNagMe(Fl_Check_Button* o, void*) { btn2NagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnClearOnSave=(Fl_Check_Button *)0; static void cb_btnClearOnSave(Fl_Check_Button* o, void*) { progdefaults.ClearOnSave=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCallUpperCase=(Fl_Check_Button *)0; static void cb_btnCallUpperCase(Fl_Check_Button* o, void*) { progdefaults.calluppercase = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnAutoFillQSO=(Fl_Check_Button *)0; static void cb_btnAutoFillQSO(Fl_Check_Button* o, void*) { progdefaults.autofill_qso_fields = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDateTimeSort=(Fl_Check_Button *)0; static void cb_btnDateTimeSort(Fl_Check_Button* o, void*) { progdefaults.sort_date_time_off = o->value(); progdefaults.changed = true; reload_browser(); } Fl_Check_Button *btndate_time_force=(Fl_Check_Button *)0; static void cb_btndate_time_force(Fl_Check_Button* o, void*) { progdefaults.force_date_time = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRSTindefault=(Fl_Check_Button *)0; static void cb_btnRSTindefault(Fl_Check_Button* o, void*) { progdefaults.RSTin_default = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRSTdefault=(Fl_Check_Button *)0; static void cb_btnRSTdefault(Fl_Check_Button* o, void*) { progdefaults.RSTdefault = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyPower=(Fl_Input2 *)0; static void cb_inpMyPower(Fl_Input2* o, void*) { progdefaults.mytxpower = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnDisplayLogbookRead=(Fl_Check_Button *)0; static void cb_btnDisplayLogbookRead(Fl_Check_Button* o, void*) { progdefaults.DisplayLogbookRead = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_log_power_meter=(Fl_Check_Button *)0; static void cb_btn_log_power_meter(Fl_Check_Button* o, void*) { progdefaults.log_power_meter=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWuseSOMdecoding=(Fl_Check_Button *)0; static void cb_btnCWuseSOMdecoding(Fl_Check_Button* o, void*) { progdefaults.CWuseSOMdecoding = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWrcvTrack=(Fl_Check_Button *)0; static void cb_btnCWrcvTrack(Fl_Check_Button* o, void*) { progdefaults.CWtrack = o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrCWbandwidth=(Fl_Value_Slider2 *)0; static void cb_sldrCWbandwidth(Fl_Value_Slider2* o, void*) { progdefaults.CWbandwidth = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWmfilt=(Fl_Check_Button *)0; static void cb_btnCWmfilt(Fl_Check_Button* o, void*) { progdefaults.CWmfilt = o->value(); progdefaults.changed = true; } Fl_Value_Output *valCWrcvWPM=(Fl_Value_Output *)0; static void cb_valCWrcvWPM(Fl_Value_Output*, void*) { progdefaults.changed = true; } Fl_Progress *prgsCWrcvWPM=(Fl_Progress *)0; Fl_Counter2 *cntLower=(Fl_Counter2 *)0; static void cb_cntLower(Fl_Counter2* o, void*) { progdefaults.CWlower = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntUpper=(Fl_Counter2 *)0; static void cb_cntUpper(Fl_Counter2* o, void*) { progdefaults.CWupper = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntCWrange=(Fl_Counter2 *)0; static void cb_cntCWrange(Fl_Counter2* o, void*) { progdefaults.CWrange = (int)o->value(); progdefaults.changed = true; } Fl_Choice *mnu_cwrx_attack=(Fl_Choice *)0; static void cb_mnu_cwrx_attack(Fl_Choice* o, void*) { progdefaults.cwrx_attack = o->value(); progdefaults.changed = true; } Fl_Choice *mnu_cwrx_decay=(Fl_Choice *)0; static void cb_mnu_cwrx_decay(Fl_Choice* o, void*) { progdefaults.cwrx_decay = o->value(); progdefaults.changed = true; } Fl_Button *btn_cw_tracking_defaults=(Fl_Button *)0; static void cb_btn_cw_tracking_defaults(Fl_Button*, void*) { progdefaults.cwrx_attack = 1; progdefaults.cwrx_decay = 0; mnu_cwrx_attack->value(progdefaults.cwrx_attack); mnu_cwrx_decay->value(progdefaults.cwrx_decay); progdefaults.changed = true; } Fl_Value_Slider2 *sldrCWxmtWPM=(Fl_Value_Slider2 *)0; static void cb_sldrCWxmtWPM(Fl_Value_Slider2* o, void*) { progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); cntr_nanoCW_WPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters(); } Fl_Counter2 *cntCWdefWPM=(Fl_Counter2 *)0; static void cb_cntCWdefWPM(Fl_Counter2* o, void*) { progdefaults.defCWspeed = (int)o->value(); progdefaults.changed = true; } Fl_Counter *cntCWlowerlimit=(Fl_Counter *)0; static void cb_cntCWlowerlimit(Fl_Counter* o, void*) { progdefaults.CWlowerlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->minimum(progdefaults.CWlowerlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWupperlimit->minimum(progdefaults.CWlowerlimit+20); cntCW_WPM->minimum(progdefaults.CWlowerlimit); } Fl_Counter *cntCWupperlimit=(Fl_Counter *)0; static void cb_cntCWupperlimit(Fl_Counter* o, void*) { progdefaults.CWupperlimit = (int)o->value(); progdefaults.changed = true; sldrCWxmtWPM->maximum(progdefaults.CWupperlimit); sldrCWxmtWPM->value(progdefaults.CWspeed); sldrCWxmtWPM->redraw(); cntCWlowerlimit->maximum(progdefaults.CWupperlimit-20); cntCW_WPM->maximum(progdefaults.CWupperlimit); } Fl_Value_Slider2 *sldrCWfarnsworth=(Fl_Value_Slider2 *)0; static void cb_sldrCWfarnsworth(Fl_Value_Slider2* o, void*) { progdefaults.CWfarnsworth = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWusefarnsworth=(Fl_Check_Button *)0; static void cb_btnCWusefarnsworth(Fl_Check_Button* o, void*) { progdefaults.CWusefarnsworth=o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *sldrCWwordsworth=(Fl_Value_Slider2 *)0; static void cb_sldrCWwordsworth(Fl_Value_Slider2* o, void*) { progdefaults.CWwordsworth = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWusewordsworth=(Fl_Check_Button *)0; static void cb_btnCWusewordsworth(Fl_Check_Button* o, void*) { progdefaults.CWusewordsworth=o->value(); progdefaults.changed = true; } Fl_Counter2 *cntCWdash2dot=(Fl_Counter2 *)0; static void cb_cntCWdash2dot(Fl_Counter2* o, void*) { progdefaults.CWdash2dot=o->value(); cnt_nanoCWdash2dot->value(progdefaults.CWdash2dot); progdefaults.changed = true; } Fl_Counter2 *cntCWrisetime=(Fl_Counter2 *)0; static void cb_cntCWrisetime(Fl_Counter2* o, void*) { progdefaults.CWrisetime=o->value(); progdefaults.changed = true; } Fl_ListBox *i_listboxQSKshape=(Fl_ListBox *)0; static void cb_i_listboxQSKshape(Fl_ListBox* o, void*) { progdefaults.QSKshape = o->index(); progdefaults.changed = true; } Fl_Check_Button *btnQSK=(Fl_Check_Button *)0; static void cb_btnQSK(Fl_Check_Button* o, void*) { progdefaults.QSK = o->value(); btnQSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); }; } Fl_Counter2 *cntQSKfrequency=(Fl_Counter2 *)0; static void cb_cntQSKfrequency(Fl_Counter2* o, void*) { progdefaults.QSKfrequency=o->value(); progdefaults.changed = true; } Fl_Counter2 *cntPreTiming=(Fl_Counter2 *)0; static void cb_cntPreTiming(Fl_Counter2* o, void*) { progdefaults.CWpre = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntPostTiming=(Fl_Counter2 *)0; static void cb_cntPostTiming(Fl_Counter2* o, void*) { progdefaults.CWpost = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntQSKamp=(Fl_Counter2 *)0; static void cb_cntQSKamp(Fl_Counter2* o, void*) { progdefaults.QSKamp=o->value(); progdefaults.changed = true; } Fl_Counter2 *cntQSKrisetime=(Fl_Counter2 *)0; static void cb_cntQSKrisetime(Fl_Counter2* o, void*) { progdefaults.QSKrisetime=o->value(); progdefaults.changed = true; } Fl_ListBox *i_listbox_test_char=(Fl_ListBox *)0; static void cb_i_listbox_test_char(Fl_ListBox* o, void*) { progdefaults.TestChar = o->index(); } Fl_Check_Button *btnQSKadjust=(Fl_Check_Button *)0; static void cb_btnQSKadjust(Fl_Check_Button* o, void*) { progdefaults.QSKadjust = o->value(); } static void cb_listbox_prosign(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[0] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign1(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[1] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign2(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[2] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign3(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[3] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign4(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[4] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign5(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[5] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign6(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[6] = ps[c]; progdefaults.changed = true; } static void cb_listbox_prosign7(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[7] = ps[c]; progdefaults.changed = true;; } Fl_ListBox *listbox_prosign[9]={(Fl_ListBox *)0}; static void cb_listbox_prosign8(Fl_ListBox* o, void*) { int c = o->index(); for (int i = 0; i < 9; i++) if (listbox_prosign[i]->index() == c) { listbox_prosign[i]->index(12); progdefaults.CW_prosigns[i] = ' '; } o->index(c); char ps[] = "~%&+={}<>[] "; progdefaults.CW_prosigns[8] = ps[c]; progdefaults.changed = true; } Fl_Check_Button *btnCW_use_paren=(Fl_Check_Button *)0; static void cb_btnCW_use_paren(Fl_Check_Button* o, void*) { progdefaults.CW_use_paren=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCW_prosign_display=(Fl_Check_Button *)0; static void cb_btnCW_prosign_display(Fl_Check_Button* o, void*) { progdefaults.CW_prosign_display=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_A_aelig=(Fl_Check_Button *)0; static void cb_btn_A_aelig(Fl_Check_Button* o, void*) { progdefaults.A_aelig = o->value(); if (progdefaults.A_aelig) { progdefaults.A_umlaut = false; btn_A_umlaut->value(0); } btn_A_umlaut->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_A_umlaut=(Fl_Check_Button *)0; static void cb_btn_A_umlaut(Fl_Check_Button* o, void*) { progdefaults.A_umlaut = o->value(); if (progdefaults.A_umlaut) { progdefaults.A_aelig = false; btn_A_aelig->value(0); } btn_A_aelig->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_A_ring=(Fl_Check_Button *)0; static void cb_btn_A_ring(Fl_Check_Button* o, void*) { progdefaults.A_ring = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_O_acute=(Fl_Check_Button *)0; static void cb_btn_O_acute(Fl_Check_Button* o, void*) { progdefaults.O_acute = o->value(); if (progdefaults.O_acute) { progdefaults.O_umlaut = false; btn_O_umlaut->value(0); progdefaults.O_slash = false; btn_O_slash->value(0); } btn_O_umlaut->redraw(); btn_O_slash->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_O_slash=(Fl_Check_Button *)0; static void cb_btn_O_slash(Fl_Check_Button* o, void*) { progdefaults.O_slash = o->value(); if (progdefaults.O_slash) { progdefaults.O_umlaut = false; btn_O_umlaut->value(0); progdefaults.O_acute = false; btn_O_acute->value(0); } btn_O_umlaut->redraw(); btn_O_acute->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_O_umlaut=(Fl_Check_Button *)0; static void cb_btn_O_umlaut(Fl_Check_Button* o, void*) { progdefaults.O_umlaut = o->value(); if (progdefaults.O_umlaut) { progdefaults.O_acute = false; btn_O_acute->value(0); progdefaults.O_slash = false; btn_O_slash->value(0); } btn_O_acute->redraw(); btn_O_slash->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_C_cedilla=(Fl_Check_Button *)0; static void cb_btn_C_cedilla(Fl_Check_Button* o, void*) { progdefaults.C_cedilla = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_E_grave=(Fl_Check_Button *)0; static void cb_btn_E_grave(Fl_Check_Button* o, void*) { progdefaults.E_grave = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_E_acute=(Fl_Check_Button *)0; static void cb_btn_E_acute(Fl_Check_Button* o, void*) { progdefaults.E_acute = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_N_tilde=(Fl_Check_Button *)0; static void cb_btn_N_tilde(Fl_Check_Button* o, void*) { progdefaults.N_tilde = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_U_umlaut=(Fl_Check_Button *)0; static void cb_btn_U_umlaut(Fl_Check_Button* o, void*) { progdefaults.U_umlaut = o->value(); if (progdefaults.U_umlaut) { progdefaults.U_circ = false; btn_U_circ->value(0); } btn_U_circ->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_U_circ=(Fl_Check_Button *)0; static void cb_btn_U_circ(Fl_Check_Button* o, void*) { progdefaults.U_circ = o->value(); if (progdefaults.U_circ) { progdefaults.U_umlaut = false; btn_U_umlaut->value(0); } btn_U_umlaut->redraw(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_backslash=(Fl_Check_Button *)0; static void cb_btn_CW_backslash(Fl_Check_Button* o, void*) { progdefaults.CW_backslash = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_apostrophe=(Fl_Check_Button *)0; static void cb_btn_CW_apostrophe(Fl_Check_Button* o, void*) { progdefaults.CW_apostrophe = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_quote=(Fl_Check_Button *)0; static void cb_btn_CW_quote(Fl_Check_Button* o, void*) { progdefaults.CW_quote = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_dollar_sign=(Fl_Check_Button *)0; static void cb_btn_CW_dollar_sign(Fl_Check_Button* o, void*) { progdefaults.CW_dollar_sign = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_open_paren=(Fl_Check_Button *)0; static void cb_btn_CW_open_paren(Fl_Check_Button* o, void*) { progdefaults.CW_open_paren = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_close_paren=(Fl_Check_Button *)0; static void cb_btn_CW_close_paren(Fl_Check_Button* o, void*) { progdefaults.CW_close_paren = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_colon=(Fl_Check_Button *)0; static void cb_btn_CW_colon(Fl_Check_Button* o, void*) { progdefaults.CW_colon = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_semi_colon=(Fl_Check_Button *)0; static void cb_btn_CW_semi_colon(Fl_Check_Button* o, void*) { progdefaults.CW_semi_colon = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_underscore=(Fl_Check_Button *)0; static void cb_btn_CW_underscore(Fl_Check_Button* o, void*) { progdefaults.CW_underscore = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_at_symbol=(Fl_Check_Button *)0; static void cb_btn_CW_at_symbol(Fl_Check_Button* o, void*) { progdefaults.CW_at_symbol = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_exclamation=(Fl_Check_Button *)0; static void cb_btn_CW_exclamation(Fl_Check_Button* o, void*) { progdefaults.CW_exclamation = o->value(); progdefaults.changed = true; CW_table_changed = true; } Fl_Check_Button *btn_CW_noise0=(Fl_Check_Button *)0; static void cb_btn_CW_noise0(Fl_Check_Button* o, void*) { progdefaults.CW_noise = 0; if (o->value()) { btn_CW_noise1->value(0); btn_CW_noise2->value(0); btn_CW_noise3->value(0); } else progdefaults.CW_noise = 0; progdefaults.changed = true; } Fl_Check_Button *btn_CW_noise1=(Fl_Check_Button *)0; static void cb_btn_CW_noise1(Fl_Check_Button* o, void*) { progdefaults.CW_noise = '*'; if (o->value()) { btn_CW_noise0->value(0); btn_CW_noise2->value(0); btn_CW_noise3->value(0); } else progdefaults.CW_noise = 0; progdefaults.changed = true; } Fl_Check_Button *btn_CW_noise2=(Fl_Check_Button *)0; static void cb_btn_CW_noise2(Fl_Check_Button* o, void*) { progdefaults.CW_noise = o->value(); if (o->value()) { btn_CW_noise0->value(0); btn_CW_noise1->value(0); btn_CW_noise3->value(0); } else progdefaults.CW_noise = 0; progdefaults.changed = true; } Fl_Check_Button *btn_CW_noise3=(Fl_Check_Button *)0; static void cb_btn_CW_noise3(Fl_Check_Button* o, void*) { progdefaults.CW_noise = ' '; if (o->value()) { btn_CW_noise0->value(0); btn_CW_noise1->value(0); btn_CW_noise2->value(0); } else progdefaults.CW_noise = 0; progdefaults.changed = true; } Fl_ComboBox *select_WK_CommPort=(Fl_ComboBox *)0; static void cb_select_WK_CommPort(Fl_ComboBox* o, void*) { progStatus.WK_serial_port_name = o->value(); select_WKFSK_CommPort->value(progStatus.WK_serial_port_name.c_str()); } Fl_Light_Button *btn_WKCW_connect=(Fl_Light_Button *)0; static void cb_btn_WKCW_connect(Fl_Light_Button* o, void*) { WKCW_connect(o->value()); } Fl_Box *box_WK_wait=(Fl_Box *)0; Fl_Box *box_WK_break_in=(Fl_Box *)0; Fl_Box *box_WK_busy=(Fl_Box *)0; Fl_Box *box_WK_xoff=(Fl_Box *)0; Fl_Box *box_WK_keydown=(Fl_Box *)0; Fl_ComboBox *choice_WK_keyer_mode=(Fl_ComboBox *)0; static void cb_choice_WK_keyer_mode(Fl_ComboBox*, void*) { WK_change_choice_keyer_mode(); } Fl_ComboBox *choice_WK_hang=(Fl_ComboBox *)0; static void cb_choice_WK_hang(Fl_ComboBox*, void*) { WK_change_choice_hang(); } Fl_ComboBox *choice_WK_sidetone=(Fl_ComboBox *)0; static void cb_choice_WK_sidetone(Fl_ComboBox*, void*) { WK_change_choice_sidetone(); } Fl_ComboBox *choice_WK_output_pins=(Fl_ComboBox *)0; static void cb_choice_WK_output_pins(Fl_ComboBox*, void*) { WK_change_choice_output_pins(); } Fl_Check_Button *btn_WK_use_pot=(Fl_Check_Button *)0; static void cb_btn_WK_use_pot(Fl_Check_Button*, void*) { WK_use_pot_changed(); } Fl_Output *txt_WK_wpm=(Fl_Output *)0; Fl_Check_Button *btn_WK_swap=(Fl_Check_Button *)0; static void cb_btn_WK_swap(Fl_Check_Button*, void*) { WK_change_btn_swap(); } Fl_Check_Button *btn_WK_auto_space=(Fl_Check_Button *)0; static void cb_btn_WK_auto_space(Fl_Check_Button*, void*) { WK_change_btn_auto_space(); } Fl_Check_Button *btn_WK_ct_space=(Fl_Check_Button *)0; static void cb_btn_WK_ct_space(Fl_Check_Button*, void*) { WK_change_btn_ct_space(); } Fl_Check_Button *btn_WK_paddledog=(Fl_Check_Button *)0; static void cb_btn_WK_paddledog(Fl_Check_Button*, void*) { WK_change_btn_paddledog(); } Fl_Check_Button *btn_WK_cut_zeronine=(Fl_Check_Button *)0; static void cb_btn_WK_cut_zeronine(Fl_Check_Button*, void*) { WK_change_btn_cut_zeronine(); } Fl_Check_Button *btn_WK_paddle_echo=(Fl_Check_Button *)0; static void cb_btn_WK_paddle_echo(Fl_Check_Button*, void*) { WK_change_btn_paddle_echo(); } Fl_Check_Button *btn_WK_serial_echo=(Fl_Check_Button *)0; static void cb_btn_WK_serial_echo(Fl_Check_Button*, void*) { WK_change_btn_serial_echo(); } Fl_Check_Button *btn_WK_sidetone_on=(Fl_Check_Button *)0; static void cb_btn_WK_sidetone_on(Fl_Check_Button*, void*) { WK_change_btn_sidetone_on(); } Fl_Check_Button *btn_WK_tone_on=(Fl_Check_Button *)0; static void cb_btn_WK_tone_on(Fl_Check_Button*, void*) { WK_change_btn_tone_on(); } Fl_Check_Button *btn_WK_ptt_on=(Fl_Check_Button *)0; static void cb_btn_WK_ptt_on(Fl_Check_Button*, void*) { WK_change_btn_ptt_on(); } Fl_Counter *cntr_WK_min_wpm=(Fl_Counter *)0; static void cb_cntr_WK_min_wpm(Fl_Counter* o, void*) { WK_change_cntr_min_wpm(); if ((o->value() + cntr_WK_rng_wpm->value()) > 55) cntr_WK_rng_wpm->value(55 - o->value()); } Fl_Counter *cntr_WK_rng_wpm=(Fl_Counter *)0; static void cb_cntr_WK_rng_wpm(Fl_Counter* o, void*) { WK_change_cntr_rng_wpm(); if ((cntr_WK_min_wpm->value() + o->value()) > 55) o->value(55 - cntr_WK_min_wpm->value()); } Fl_Counter *cntr_WK_farnsworth=(Fl_Counter *)0; static void cb_cntr_WK_farnsworth(Fl_Counter*, void*) { WK_change_cntr_farnsworth(); } Fl_Counter *cntr_WK_cmd_wpm=(Fl_Counter *)0; static void cb_cntr_WK_cmd_wpm(Fl_Counter*, void*) { WK_change_cntr_cmd_wpm(); } Fl_Counter *cntr_WK_ratio=(Fl_Counter *)0; static void cb_cntr_WK_ratio(Fl_Counter*, void*) { WK_change_cntr_ratio(); } Fl_Counter *cntr_WK_comp=(Fl_Counter *)0; static void cb_cntr_WK_comp(Fl_Counter*, void*) { WK_change_cntr_comp(); } Fl_Counter *cntr_WK_first_ext=(Fl_Counter *)0; static void cb_cntr_WK_first_ext(Fl_Counter*, void*) { WK_change_cntr_first_ext(); } Fl_Counter *cntr_WK_sample=(Fl_Counter *)0; static void cb_cntr_WK_sample(Fl_Counter*, void*) { WK_change_cntr_sample(); } Fl_Counter *cntr_WK_weight=(Fl_Counter *)0; static void cb_cntr_WK_weight(Fl_Counter*, void*) { WK_change_cntr_weight(); } Fl_Counter *cntr_WK_leadin=(Fl_Counter *)0; static void cb_cntr_WK_leadin(Fl_Counter*, void*) { WK_change_cntr_leadin(); } Fl_Counter *cntr_WK_tail=(Fl_Counter *)0; static void cb_cntr_WK_tail(Fl_Counter*, void*) { WK_change_cntr_tail(); } Fl_Check_Button *btnK3NG=(Fl_Check_Button *)0; static void cb_btnK3NG(Fl_Check_Button* o, void*) { progdefaults.WK_K3NGsketch = o->value(); progdefaults.changed = true; } Fl_ComboBox *select_nanoCW_CommPort=(Fl_ComboBox *)0; static void cb_select_nanoCW_CommPort(Fl_ComboBox* o, void*) { progdefaults.nanoIO_serial_port_name = o->value(); } Fl_Light_Button *btn_nanoCW_connect=(Fl_Light_Button *)0; static void cb_btn_nanoCW_connect(Fl_Light_Button* o, void*) { if (o->value()) { if (open_nanoCW()) { btn_nanoIO_connect->value(1); chk_nanoIO_CW_io->value(1); } else { o->value(0); btn_nanoIO_connect->value(0); chk_nanoIO_CW_io->value(0); chk_nanoIO_FSK_io->value(0); } } else { close_nanoIO(); o->value(0); btn_nanoIO_connect->value(0); chk_nanoIO_FSK_io->value(0); chk_nanoIO_CW_io->value(0); }; } Fl_Counter *cntr_nanoCW_paddle_WPM=(Fl_Counter *)0; static void cb_cntr_nanoCW_paddle_WPM(Fl_Counter* o, void*) { progdefaults.CW_keyspeed = (int)o->value(); set_nano_keyerWPM(progdefaults.CW_keyspeed); progdefaults.changed = true; } FTextView *txt_nano_CW_io=(FTextView *)0; Fl_Counter *cntr_nanoCW_WPM=(Fl_Counter *)0; static void cb_cntr_nanoCW_WPM(Fl_Counter* o, void*) { progdefaults.CWspeed = (int)o->value(); cntCW_WPM->value(progdefaults.CWspeed); sldrCWxmtWPM->value(progdefaults.CWspeed); progdefaults.changed = true; sync_cw_parameters(); } Fl_Counter2 *cnt_nanoCWdash2dot=(Fl_Counter2 *)0; static void cb_cnt_nanoCWdash2dot(Fl_Counter2* o, void*) { progdefaults.CWdash2dot=o->value(); cntCWdash2dot->value(progdefaults.CWdash2dot); progdefaults.changed = true; } Fl_ListBox *listbox_nanoIO_serbaud=(Fl_ListBox *)0; static void cb_listbox_nanoIO_serbaud(Fl_ListBox* o, void*) { progdefaults.nanoIO_serbaud = o->index(); listbox_nanoIO_serbaud2->index(o->index()); progdefaults.changed = true; } Fl_ListBox *listbox_nano_keyer=(Fl_ListBox *)0; static void cb_listbox_nano_keyer(Fl_ListBox* o, void*) { progdefaults.nanoIO_CW_keyer = o->index(); set_nanoIO_keyer(o->index()); progdefaults.changed = true; } Fl_ListBox *listbox_incr=(Fl_ListBox *)0; static void cb_listbox_incr(Fl_ListBox* o, void*) { progdefaults.nanoIO_CW_incr = o->index() + '1'; set_nanoIO_incr(); progdefaults.changed = true; } Fl_Button *btn_cwfsk_save=(Fl_Button *)0; static void cb_btn_cwfsk_save(Fl_Button*, void*) { nano_CW_save(); } Fl_Button *btn_cwfsk_query=(Fl_Button *)0; static void cb_btn_cwfsk_query(Fl_Button*, void*) { nano_CW_query(); } Fl_Check_Button *btn_nanoIO_pot=(Fl_Check_Button *)0; static void cb_btn_nanoIO_pot(Fl_Check_Button* o, void*) { progdefaults.nanoIO_speed_pot=o->value(); progdefaults.changed=true; nanoIO_use_pot(); } Fl_Counter *cntr_nanoIO_min_wpm=(Fl_Counter *)0; static void cb_cntr_nanoIO_min_wpm(Fl_Counter* o, void*) { if ((o->value() + cntr_nanoIO_rng_wpm->value()) > 100) cntr_nanoIO_rng_wpm->value(100 - o->value()); set_nanoIO_min_max(); } Fl_Counter *cntr_nanoIO_rng_wpm=(Fl_Counter *)0; static void cb_cntr_nanoIO_rng_wpm(Fl_Counter* o, void*) { if ((cntr_nanoIO_min_wpm->value() + o->value()) > 100) o->value(100 - cntr_nanoIO_min_wpm->value()); set_nanoIO_min_max(); } Fl_Check_Button *btn_disable_CW_PTT=(Fl_Check_Button *)0; static void cb_btn_disable_CW_PTT(Fl_Check_Button* o, void*) { progdefaults.disable_CW_PTT=o->value(); progdefaults.changed=true; nanoIO_set_cw_ptt(); } Fl_Counter *cntrWPMtest=(Fl_Counter *)0; static void cb_cntrWPMtest(Fl_Counter* o, void*) { progdefaults.nanoCW_test_wpm = o->value(); progdefaults.changed=true; } Fl_Button *btn_cal_variable=(Fl_Button *)0; static void cb_btn_cal_variable(Fl_Button*, void*) { nanoIO_wpm_cal(); } Fl_Value_Input *corr_var_wpm=(Fl_Value_Input *)0; Fl_Value_Input *usec_correc=(Fl_Value_Input *)0; Fl_Button *btn_correction=(Fl_Button *)0; static void cb_btn_correction(Fl_Button*, void*) { nanoIO_correction(); } Fl_Check_Button *chk_nanoIO_CW_io=(Fl_Check_Button *)0; static void cb_chk_nanoIO_CW_io(Fl_Check_Button* o, void*) { if (o->value() == 0) { o->value(1); return; } set_nanoCW(); chk_nanoIO_FSK_io->value(0); } Fl_Check_Button *btn_CW_KEYLINE_flrig=(Fl_Check_Button *)0; static void cb_btn_CW_KEYLINE_flrig(Fl_Check_Button* o, void*) { int val = o->value(); progdefaults.use_FLRIGkeying = val; if (val) { progdefaults.CW_KEYLINE_on_cat_port = 0; progdefaults.CW_KEYLINE_on_ptt_port = 0; btn_CW_KEYLINE_catport->value(0); btn_CW_KEYLINE_shared_PTT->value(0); } progdefaults.CW_KEYLINE_changed = true; } Fl_Check_Button *btn_FLRIG_CW_disable_ptt=(Fl_Check_Button *)0; static void cb_btn_FLRIG_CW_disable_ptt(Fl_Check_Button* o, void*) { progdefaults.CATkeying_disable_ptt = o->value(); btn_CAT_CW_disable_ptt->value(o->value()); progdefaults.changed = true; } Fl_Check_Button *btn_CW_KEYLINE_catport=(Fl_Check_Button *)0; static void cb_btn_CW_KEYLINE_catport(Fl_Check_Button* o, void*) { int val = o->value(); progdefaults.CW_KEYLINE_on_cat_port = val; if (val) { progdefaults.CW_KEYLINE_on_ptt_port = 0; progdefaults.use_FLRIGkeying = 0; btn_CW_KEYLINE_shared_PTT->value(0); btn_CW_KEYLINE_flrig->value(0); } progdefaults.CW_KEYLINE_changed = true; } Fl_Check_Button *btn_CW_KEYLINE_shared_PTT=(Fl_Check_Button *)0; static void cb_btn_CW_KEYLINE_shared_PTT(Fl_Check_Button* o, void*) { int val = o->value(); progdefaults.CW_KEYLINE_on_ptt_port = val; if (val) { progdefaults.CW_KEYLINE_on_cat_port = 0; progdefaults.use_FLRIGkeying = 0; btn_CW_KEYLINE_catport->value(0); btn_CW_KEYLINE_flrig->value(0); } progdefaults.CW_KEYLINE_changed = true; } Fl_ListBox *listbox_CW_KEYLINE=(Fl_ListBox *)0; static void cb_listbox_CW_KEYLINE(Fl_ListBox* o, void*) { progdefaults.CW_KEYLINE = o->index(); } Fl_Counter2 *cntCWkeycomp=(Fl_Counter2 *)0; static void cb_cntCWkeycomp(Fl_Counter2* o, void*) { progdefaults.CWkeycomp =o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_PTT_KEYLINE=(Fl_ListBox *)0; static void cb_listbox_PTT_KEYLINE(Fl_ListBox* o, void*) { progdefaults.PTT_KEYLINE = o->index(); progdefaults.changed = true; } Fl_ComboBox *select_CW_KEYLINE_CommPort=(Fl_ComboBox *)0; static void cb_select_CW_KEYLINE_CommPort(Fl_ComboBox* o, void*) { progdefaults.CW_KEYLINE_serial_port_name = o->value(); if (progStatus.useCW_KEYLINE) { close_CW_KEYLINE(); if (!open_CW_KEYLINE()) { btn_CW_KEYLINE_connect->value(0); progStatus.useCW_KEYLINE = 0; } progStatus.useCW_KEYLINE = 1; } progdefaults.CW_KEYLINE_changed = true; } Fl_Light_Button *btn_CW_KEYLINE_connect=(Fl_Light_Button *)0; static void cb_btn_CW_KEYLINE_connect(Fl_Light_Button* o, void*) { if (o->value()) { if (!open_CW_KEYLINE()) o->value(0); else { progStatus.useCW_KEYLINE = 1; btn_use_ELCTkeying->value(0); btn_use_KNWDkeying->value(0); btn_use_ICOMkeying->value(0); btn_use_YAESUkeying->value(0); progdefaults.use_ELCTkeying = 0; progdefaults.use_ICOMkeying = 0; progdefaults.use_KNWDkeying = 0; progdefaults.use_YAESUkeying = 0; } } else { close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; }; } Fl_Light_Button *btn_cw_dtr_calibrate=(Fl_Light_Button *)0; static void cb_btn_cw_dtr_calibrate(Fl_Light_Button*, void*) { calibrate_cwio(); } Fl_Output *cwio_test_result=(Fl_Output *)0; Fl_Check_Button *btn_use_ICOMkeying=(Fl_Check_Button *)0; static void cb_btn_use_ICOMkeying(Fl_Check_Button* o, void*) { progdefaults.use_ICOMkeying = o->value(); if (o->value()) { btn_use_ELCTkeying->value(0); btn_use_KNWDkeying->value(0); btn_use_YAESUkeying->value(0); progdefaults.use_ELCTkeying = 0; progdefaults.use_KNWDkeying = 0; progdefaults.use_YAESUkeying = 0; close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; btn_cw_dtr_calibrate->value(0); } progdefaults.changed=true; } Fl_Input *val_ICOMcivaddr=(Fl_Input *)0; static void cb_val_ICOMcivaddr(Fl_Input* o, void*) { progdefaults.ICOMcivaddr=o->value(); progdefaults.changed=true; } Fl_Check_Button *btn_use_ELCTkeying=(Fl_Check_Button *)0; static void cb_btn_use_ELCTkeying(Fl_Check_Button* o, void*) { progdefaults.use_ELCTkeying = o->value(); if (o->value()) { btn_use_YAESUkeying->value(0); btn_use_ICOMkeying->value(0); btn_use_KNWDkeying->value(0); progdefaults.use_YAESUkeying = 0; progdefaults.use_ICOMkeying = 0; progdefaults.use_KNWDkeying = 0; close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; btn_cw_dtr_calibrate->value(0); } progdefaults.changed=true; } Fl_Check_Button *btn_use_KNWDkeying=(Fl_Check_Button *)0; static void cb_btn_use_KNWDkeying(Fl_Check_Button* o, void*) { progdefaults.use_KNWDkeying = o->value(); if (o->value()) { btn_use_YAESUkeying->value(0); btn_use_ICOMkeying->value(0); btn_use_ELCTkeying->value(0); progdefaults.use_YAESUkeying = 0; progdefaults.use_ICOMkeying = 0; progdefaults.use_ELCTkeying = 0; close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; btn_cw_dtr_calibrate->value(0); } progdefaults.changed=true; } Fl_Check_Button *btn_use_YAESUkeying=(Fl_Check_Button *)0; static void cb_btn_use_YAESUkeying(Fl_Check_Button* o, void*) { progdefaults.use_YAESUkeying = o->value(); if (o->value()) { btn_use_ELCTkeying->value(0); btn_use_KNWDkeying->value(0); btn_use_ICOMkeying->value(0); progdefaults.use_ELCTkeying = 0; progdefaults.use_KNWDkeying = 0; progdefaults.use_ICOMkeying = 0; close_CW_KEYLINE(); progStatus.useCW_KEYLINE = 0; btn_cw_dtr_calibrate->value(0); } progdefaults.changed=true; } Fl_Check_Button *btn_CAT_CW_disable_ptt=(Fl_Check_Button *)0; static void cb_btn_CAT_CW_disable_ptt(Fl_Check_Button* o, void*) { progdefaults.CATkeying_disable_ptt = o->value(); btn_FLRIG_CW_disable_ptt->value(o->value()); progdefaults.changed = true; } Fl_Button *btn_CAT_keying_calibrate=(Fl_Button *)0; static void cb_btn_CAT_keying_calibrate(Fl_Button*, void*) { CAT_keying_calibrate(); } Fl_Value_Input *out_CATkeying_compensation=(Fl_Value_Input *)0; static void cb_out_CATkeying_compensation(Fl_Value_Input* o, void*) { progdefaults.CATkeying_compensation = o->value() * 1000; progdefaults.changed=true; } Fl_Button *btn_CAT_keying_clear=(Fl_Button *)0; static void cb_btn_CAT_keying_clear(Fl_Button*, void*) { progdefaults.CATkeying_compensation = 0; out_CATkeying_compensation->value(0); out_CATkeying_test_result->value(0); } Fl_Button *btn_CAT_keying_test=(Fl_Button *)0; static void cb_btn_CAT_keying_test(Fl_Button*, void*) { CAT_keying_test(); } Fl_Value_Input *out_CATkeying_test_result=(Fl_Value_Input *)0; Fl_Input2 *txtSecondary=(Fl_Input2 *)0; static void cb_txtSecondary(Fl_Input2* o, void*) { progdefaults.secText = o->value(); progdefaults.changed = true; } Fl_Check_Button *valDominoEX_FILTER=(Fl_Check_Button *)0; static void cb_valDominoEX_FILTER(Fl_Check_Button* o, void*) { progdefaults.DOMINOEX_FILTER = o->value(); resetDOMEX(); progdefaults.changed = true; } Fl_Counter2 *valDominoEX_BW=(Fl_Counter2 *)0; static void cb_valDominoEX_BW(Fl_Counter2* o, void*) { progdefaults.DOMINOEX_BW = o->value(); resetDOMEX(); progdefaults.changed = true; } Fl_Check_Button *chkDominoEX_FEC=(Fl_Check_Button *)0; static void cb_chkDominoEX_FEC(Fl_Check_Button* o, void*) { progdefaults.DOMINOEX_FEC = o->value(); progdefaults.changed = true; } Fl_Value_Slider2 *valDomCWI=(Fl_Value_Slider2 *)0; static void cb_valDomCWI(Fl_Value_Slider2* o, void*) { progdefaults.DomCWI = o->value(); progdefaults.changed = true; } Fl_Counter2 *valDominoEX_PATHS=(Fl_Counter2 *)0; static void cb_valDominoEX_PATHS(Fl_Counter2* o, void*) { progdefaults.DOMINOEX_PATHS = (int)o->value(); progdefaults.changed = true; } Fl_ListBox *listboxHellFont=(Fl_ListBox *)0; static void cb_listboxHellFont(Fl_ListBox* o, void*) { progdefaults.feldfontnbr=o->index(); progdefaults.changed = true; } Fl_ListBox *listboxHellPulse=(Fl_ListBox *)0; static void cb_listboxHellPulse(Fl_ListBox* o, void*) { progdefaults.HellPulseFast = o->index(); progdefaults.changed = true; } Fl_Check_Button *btnFeldHellIdle=(Fl_Check_Button *)0; static void cb_btnFeldHellIdle(Fl_Check_Button* o, void*) { progdefaults.HellXmtIdle=o->value(); progdefaults.changed = true; } Fl_Value_Slider *valHellXmtWidth=(Fl_Value_Slider *)0; static void cb_valHellXmtWidth(Fl_Value_Slider* o, void*) { progdefaults.HellXmtWidth=(int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnBlackboard=(Fl_Check_Button *)0; static void cb_btnBlackboard(Fl_Check_Button* o, void*) { progdefaults.HellBlackboard=o->value(); FHdisp->reverse(progdefaults.HellBlackboard); progdefaults.changed = true; } Fl_Check_Button *btnHellMarquee=(Fl_Check_Button *)0; static void cb_btnHellMarquee(Fl_Check_Button* o, void*) { progdefaults.HellMarquee=o->value(); FHdisp->set_marquee(progdefaults.HellMarquee); progdefaults.changed = true; } Fl_Value_Slider *valHellRcvWidth=(Fl_Value_Slider *)0; static void cb_valHellRcvWidth(Fl_Value_Slider* o, void*) { progdefaults.HellRcvWidth=(int)o->value(); progdefaults.changed = true; } Fl_Value_Slider *valHellRcvHeight=(Fl_Value_Slider *)0; static void cb_valHellRcvHeight(Fl_Value_Slider*, void*) { FHdisp_char_height(); } Fl_Value_Slider2 *sldrHellBW=(Fl_Value_Slider2 *)0; static void cb_sldrHellBW(Fl_Value_Slider2*, void*) { progdefaults.HELL_BW = sldrHellBW->value(); } Fl_Value_Slider *val_hellagc=(Fl_Value_Slider *)0; static void cb_val_hellagc(Fl_Value_Slider* o, void*) { progdefaults.hellagc=(int)o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_fmt_sr=(Fl_ListBox *)0; static void cb_listbox_fmt_sr(Fl_ListBox* o, void*) { progdefaults.FMT_sr=o->index(); progdefaults.changed = true; } Fl_Counter *cnt_fmt_rx_ppm=(Fl_Counter *)0; static void cb_cnt_fmt_rx_ppm(Fl_Counter* o, void*) { progdefaults.RX_corr = (int)o->value(); cntRxRateCorr->value(progdefaults.RX_corr); progdefaults.changed = true; } Fl_Button *btnFMT_plot_background=(Fl_Button *)0; static void cb_btnFMT_plot_background(Fl_Button*, void*) { static uchar r, g, b; Fl::get_color(progdefaults.FMT_background, r, g, b); if (!fl_color_chooser("FMT Background", r, g, b)) return; progdefaults.FMT_background = fl_rgb_color(r,g,b); fmt_plot->bk_color(progdefaults.FMT_background); fmt_plot->redraw(); progdefaults.changed = true; } Fl_Button *btnFMT_unk_color=(Fl_Button *)0; static void cb_btnFMT_unk_color(Fl_Button*, void*) { static uchar r, g, b; Fl::get_color(progdefaults.FMT_unk_color, r, g, b); if (!fl_color_chooser("FMT Background", r, g, b)) return; progdefaults.FMT_unk_color = fl_rgb_color(r,g,b); fmt_plot->line_color_1(progdefaults.FMT_unk_color); fmt_plot->redraw(); unk_color->color(progdefaults.FMT_unk_color); unk_color->redraw(); progdefaults.changed = true; } Fl_Button *btnFMT_plot_ref_color=(Fl_Button *)0; static void cb_btnFMT_plot_ref_color(Fl_Button*, void*) { static uchar r, g, b; Fl::get_color(progdefaults.FMT_ref_color, r, g, b); if (!fl_color_chooser("FMT Background", r, g, b)) return; progdefaults.FMT_ref_color = fl_rgb_color(r,g,b); fmt_plot->line_color_2(progdefaults.FMT_ref_color); fmt_plot->redraw(); ref_color->color(progdefaults.FMT_ref_color); ref_color->redraw(); progdefaults.changed = true; } Fl_Button *btnFMT_plot_axis=(Fl_Button *)0; static void cb_btnFMT_plot_axis(Fl_Button*, void*) { static uchar r, g, b; Fl::get_color(progdefaults.FMT_axis_color, r, g, b); if (!fl_color_chooser("FMT Axis Color", r, g, b)) return; progdefaults.FMT_axis_color = fl_rgb_color(r,g,b); fmt_plot->axis_color(progdefaults.FMT_axis_color); fmt_plot->redraw(); progdefaults.changed = true; } Fl_Button *btnFMT_legend_color=(Fl_Button *)0; static void cb_btnFMT_legend_color(Fl_Button*, void*) { static uchar r, g, b; Fl::get_color(progdefaults.FMT_legend_color, r, g, b); if (!fl_color_chooser("FMT Legend Color", r, g, b)) return; progdefaults.FMT_legend_color = fl_rgb_color(r,g,b); fmt_plot->legend_color(progdefaults.FMT_legend_color); fmt_plot->redraw(); progdefaults.changed = true; } Fl_Check_Button *btn_fmt_plot_over_axis=(Fl_Check_Button *)0; static void cb_btn_fmt_plot_over_axis(Fl_Check_Button* o, void*) { progdefaults.FMT_plot_over_axis = o->value(); fmt_plot->plot_over_axis(progdefaults.FMT_plot_over_axis); progdefaults.changed = true; } Fl_Check_Button *btn_fmt_thick_lines=(Fl_Check_Button *)0; static void cb_btn_fmt_thick_lines(Fl_Check_Button* o, void*) { progdefaults.FMT_thick_lines = o->value(); fmt_plot->thick_lines(progdefaults.FMT_thick_lines); progdefaults.changed = true; } Fl_Counter *cnt_fmt_freq_corr=(Fl_Counter *)0; static void cb_cnt_fmt_freq_corr(Fl_Counter* o, void*) { progdefaults.FMT_freq_corr=o->value(); progdefaults.RIT=progdefaults.FMT_freq_corr; cntRIT->value(progdefaults.RIT); progdefaults.changed = true; } Fl_Button *bnt_FMT_dec_corr=(Fl_Button *)0; static void cb_bnt_FMT_dec_corr(Fl_Button*, void*) { progdefaults.FMT_freq_corr -= 0.1; cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr); progdefaults.RIT=progdefaults.FMT_freq_corr; cntRIT->value(progdefaults.RIT); progdefaults.changed = true; } Fl_Button *btn_FMT_incr_corr=(Fl_Button *)0; static void cb_btn_FMT_incr_corr(Fl_Button*, void*) { progdefaults.FMT_freq_corr += 0.1; cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr); progdefaults.RIT=progdefaults.FMT_freq_corr; cntRIT->value(progdefaults.RIT); progdefaults.changed = true; } Fl_Counter *cnt_fmt_freq_err=(Fl_Counter *)0; static void cb_cnt_fmt_freq_err(Fl_Counter* o, void*) { progdefaults.FMT_freq_err=o->value(); progdefaults.changed = true; } Fl_Counter *cnt_FMT_movavg_len=(Fl_Counter *)0; static void cb_cnt_FMT_movavg_len(Fl_Counter* o, void*) { progdefaults.FMT_movavg_len = o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_fmt_dft_rate=(Fl_ListBox *)0; static void cb_listbox_fmt_dft_rate(Fl_ListBox* o, void*) { progdefaults.FMT_dft_rate=o->index(); progdefaults.changed = true; } Fl_Counter *cnt_FMT_bpf=(Fl_Counter *)0; static void cb_cnt_FMT_bpf(Fl_Counter* o, void*) { progdefaults.FMT_bpf_width = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fmt_unk_bpf_on=(Fl_Check_Button *)0; static void cb_btn_fmt_unk_bpf_on(Fl_Check_Button* o, void*) { progdefaults.FMT_unk_bpf_on = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fmt_ref_bpf_on=(Fl_Check_Button *)0; static void cb_btn_fmt_ref_bpf_on(Fl_Check_Button* o, void*) { progdefaults.FMT_ref_bpf_on = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fmt_autorecord=(Fl_Check_Button *)0; Fl_Counter *cnt_fmt_auto_record_time=(Fl_Counter *)0; Fl_Check_Button *btn_fmt_record_wav=(Fl_Check_Button *)0; static void cb_btn_fmt_record_wav(Fl_Check_Button* o, void*) { cb_fmt_record_wav(o->value()); if (o->value() == 1) btn_fmt_sync_wav->deactivate(); else btn_fmt_sync_wav->activate(); } Fl_Check_Button *btn_fmt_sync_wav=(Fl_Check_Button *)0; static void cb_btn_fmt_sync_wav(Fl_Check_Button* o, void*) { progdefaults.fmt_sync_wav_file = o->value(); if (o->value() == 1) btn_fmt_record_wav->deactivate(); else btn_fmt_record_wav->activate(); progdefaults.changed = true; } Fl_Output *txt_fmt_wav_filename=(Fl_Output *)0; Fl_Check_Button *btn_fmt_center_on_unknown=(Fl_Check_Button *)0; static void cb_btn_fmt_center_on_unknown(Fl_Check_Button* o, void*) { progdefaults.fmt_center_on_unknown = o->value(); if (o->value()) { progdefaults.fmt_center_on_median = 0; progdefaults.fmt_center_on_reference = 0; btn_fmt_center_on_median->value(0); btn_fmt_center_on_reference->value(0); } progdefaults.changed = true; } Fl_Check_Button *btn_fmt_center_on_reference=(Fl_Check_Button *)0; static void cb_btn_fmt_center_on_reference(Fl_Check_Button* o, void*) { progdefaults.fmt_center_on_reference = o->value(); if (o->value()) { progdefaults.fmt_center_on_unknown = 0; progdefaults.fmt_center_on_median = 0; btn_fmt_center_on_median->value(0); btn_fmt_center_on_unknown->value(0); } progdefaults.changed = true; } Fl_Check_Button *btn_fmt_center_on_median=(Fl_Check_Button *)0; static void cb_btn_fmt_center_on_median(Fl_Check_Button* o, void*) { progdefaults.fmt_center_on_median = o->value(); if (o->value()) { progdefaults.fmt_center_on_unknown = 0; progdefaults.fmt_center_on_reference = 0; btn_fmt_center_on_unknown->value(0); btn_fmt_center_on_reference->value(0); } progdefaults.changed = true; } Fl_Check_Button *btn_fmt_use_tabs=(Fl_Check_Button *)0; static void cb_btn_fmt_use_tabs(Fl_Check_Button* o, void*) { progdefaults.FMT_use_tabs = o->value(); progdefaults.changed = true; } Fl_Value_Slider *valhits=(Fl_Value_Slider *)0; static void cb_valhits(Fl_Value_Slider* o, void*) { progdefaults.fsqhits=(int)o->value(); progdefaults.changed = true; } Fl_Choice *sel_fsq_lpf=(Fl_Choice *)0; static void cb_sel_fsq_lpf(Fl_Choice* o, void*) { progdefaults.fsq_img_filter=o->value(); progdefaults.changed = true; } Fl_Value_Slider *sldrMovAvg=(Fl_Value_Slider *)0; static void cb_sldrMovAvg(Fl_Value_Slider* o, void*) { progdefaults.fsq_movavg = o->value(); progdefaults.changed = true; } Fl_Choice *sel_fsq_heard_aging=(Fl_Choice *)0; static void cb_sel_fsq_heard_aging(Fl_Choice* o, void*) { progdefaults.fsq_heard_aging=o->value(); progdefaults.changed = true; } static void cb_btn_fsqbaud(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 1.5; btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true; } static void cb_btn_fsqbaud1(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 2; btn_fsqbaud[0]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true; } static void cb_btn_fsqbaud2(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 3; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[3]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true; } static void cb_btn_fsqbaud3(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 4.5; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[4]->value(0); } progdefaults.changed = true; } Fl_Round_Button *btn_fsqbaud[5]={(Fl_Round_Button *)0}; static void cb_btn_fsqbaud4(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.fsqbaud = 6; btn_fsqbaud[0]->value(0); btn_fsqbaud[1]->value(0); btn_fsqbaud[2]->value(0); btn_fsqbaud[3]->value(0); } progdefaults.changed = true; } Fl_Choice *sel_fsq_frequency=(Fl_Choice *)0; static void cb_sel_fsq_frequency(Fl_Choice* o, void*) { progdefaults.fsq_frequency=o->value(); progdefaults.changed = true; } Fl_Choice *sel_fsq_sounder=(Fl_Choice *)0; static void cb_sel_fsq_sounder(Fl_Choice* o, void*) { progdefaults.fsq_sounder=o->value(); progdefaults.changed = true; } Fl_Counter *cntr_FSQ_time_out=(Fl_Counter *)0; static void cb_cntr_FSQ_time_out(Fl_Counter* o, void*) { progdefaults.fsq_time_out = o->value(); progdefaults.changed = true; } static void cb_QTC(Fl_Input* o, void*) { progdefaults.fsqQTCtext = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fsq_lowercase=(Fl_Check_Button *)0; static void cb_btn_fsq_lowercase(Fl_Check_Button* o, void*) { progdefaults.fsq_lowercase=o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyFSQQth=(Fl_Input2 *)0; static void cb_inpMyFSQQth(Fl_Input2* o, void*) { progdefaults.myQth = o->value(); inpMyQth->value(o->value()); progdefaults.changed = true; } Fl_Check_Button *btn_fsq_msg_dt_stamp=(Fl_Check_Button *)0; static void cb_btn_fsq_msg_dt_stamp(Fl_Check_Button* o, void*) { progdefaults.add_fsq_msg_dt=o->value(); progdefaults.changed=true; } Fl_Check_Button *btn_fsq_msg_append=(Fl_Check_Button *)0; static void cb_btn_fsq_msg_append(Fl_Check_Button* o, void*) { progdefaults.always_append=o->value(); progdefaults.changed=true; } Fl_Counter *cntr_FSQ_notify_time_out=(Fl_Counter *)0; static void cb_cntr_FSQ_notify_time_out(Fl_Counter* o, void*) { progdefaults.fsq_notify_time_out = o->value(); progdefaults.changed = true; } Fl_Output *txtAuditLog=(Fl_Output *)0; Fl_Light_Button *btn_enable_auditlog=(Fl_Light_Button *)0; static void cb_btn_enable_auditlog(Fl_Light_Button* o, void*) { progdefaults.fsq_enable_audit_log = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_auditlog=(Fl_Button *)0; static void cb_btn_select_auditlog(Fl_Button*, void*) { std::string str = std::string(TempDir); str.append(progdefaults.fsq_audit_log); const char *fname = FSEL::saveas("Audit log", "*.txt\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.fsq_audit_log = fl_filename_name(fname); txtAuditLog->value(progdefaults.fsq_audit_log.c_str()); progdefaults.changed = true; } Fl_Output *txtHeardLog=(Fl_Output *)0; Fl_Light_Button *btn_enable_fsq_heard_log=(Fl_Light_Button *)0; static void cb_btn_enable_fsq_heard_log(Fl_Light_Button* o, void*) { progdefaults.fsq_enable_heard_log = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_fsq_heard_log=(Fl_Button *)0; static void cb_btn_select_fsq_heard_log(Fl_Button*, void*) { std::string str = std::string(TempDir); str.append(progdefaults.fsq_heard_log); const char *fname = FSEL::saveas("Heard log", "*.txt\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.fsq_heard_log = fl_filename_name(fname); txtHeardLog->value(progdefaults.fsq_heard_log.c_str()); progdefaults.changed = true; } Fl_Button *btn_fsq_xmt_color=(Fl_Button *)0; static void cb_btn_fsq_xmt_color(Fl_Button*, void*) { choose_color(progdefaults.fsq_xmt_color); btn_fsq_xmt_color->color( progdefaults.fsq_xmt_color ); btn_fsq_xmt_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); progdefaults.changed = true; } Fl_Button *btn_fsq_directed_color=(Fl_Button *)0; static void cb_btn_fsq_directed_color(Fl_Button*, void*) { choose_color(progdefaults.fsq_directed_color); btn_fsq_directed_color->color( progdefaults.fsq_directed_color ); btn_fsq_directed_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); progdefaults.changed = true; } Fl_Button *btn_fsq_undirected_color=(Fl_Button *)0; static void cb_btn_fsq_undirected_color(Fl_Button*, void*) { choose_color(progdefaults.fsq_undirected_color); btn_fsq_undirected_color->color( progdefaults.fsq_undirected_color); btn_fsq_undirected_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true; } Fl_Button *btn_fsq_color_defaults=(Fl_Button *)0; static void cb_btn_fsq_color_defaults(Fl_Button*, void*) { progdefaults.fsq_xmt_color = FL_RED; btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); btn_fsq_xmt_color->redraw(); progdefaults.fsq_directed_color = FL_BLUE; btn_fsq_directed_color->color(progdefaults.fsq_directed_color); btn_fsq_directed_color->redraw(); progdefaults.fsq_undirected_color = FL_DARK_GREEN; btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); btn_fsq_undirected_color->redraw(); fsq_rx_text->setFontColor(progdefaults.fsq_xmt_color, FTextBase::FSQ_TX); fsq_rx_text->setFontColor(progdefaults.fsq_directed_color, FTextBase::FSQ_DIR); fsq_rx_text->setFontColor(progdefaults.fsq_undirected_color, FTextBase::FSQ_UND); progdefaults.changed = true; } static void cb_btn_ifkpbaud(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.ifkp_baud = 0; btn_ifkpbaud[1]->value(0); btn_ifkpbaud[2]->value(0); } progdefaults.changed = true; } static void cb_btn_ifkpbaud1(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.ifkp_baud = 1; btn_ifkpbaud[0]->value(0); btn_ifkpbaud[2]->value(0); } progdefaults.changed = true; } Fl_Round_Button *btn_ifkpbaud[3]={(Fl_Round_Button *)0}; static void cb_btn_ifkpbaud2(Fl_Round_Button* o, void*) { if (o->value() == 1) { progdefaults.ifkp_baud = 2; btn_ifkpbaud[0]->value(0); btn_ifkpbaud[1]->value(0); } progdefaults.changed = true; } Fl_Check_Button *btn_ifkp_lowercase=(Fl_Check_Button *)0; static void cb_btn_ifkp_lowercase(Fl_Check_Button* o, void*) { progdefaults.ifkp_lowercase=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_ifkp_lowercase_call=(Fl_Check_Button *)0; static void cb_btn_ifkp_lowercase_call(Fl_Check_Button* o, void*) { progdefaults.ifkp_lowercase_call=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_ifkp_freqlock=(Fl_Check_Button *)0; static void cb_btn_ifkp_freqlock(Fl_Check_Button* o, void*) { progdefaults.ifkp_freqlock=o->value(); if (active_modem == ifkp_modem && o->value() ) active_modem->set_freq(1500); progdefaults.changed = true; } Fl_Output *txt_ifkp_audit_log=(Fl_Output *)0; Fl_Light_Button *btn_enable_ifkp_audit_log=(Fl_Light_Button *)0; static void cb_btn_enable_ifkp_audit_log(Fl_Light_Button* o, void*) { progdefaults.ifkp_enable_audit_log = o->value(); progdefaults.changed = true; } Fl_Button *btn_ifkp_select_auditlog=(Fl_Button *)0; static void cb_btn_ifkp_select_auditlog(Fl_Button*, void*) { std::string str = std::string(TempDir); str.append(progdefaults.ifkp_audit_log); const char *fname = FSEL::saveas("Audit log", "*.txt\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.ifkp_audit_log = fl_filename_name(fname); txt_ifkp_audit_log->value(progdefaults.ifkp_audit_log.c_str()); progdefaults.changed = true; } Fl_Output *txt_ifkp_heard_log=(Fl_Output *)0; Fl_Light_Button *btn_enable_ifkp_heard_log=(Fl_Light_Button *)0; static void cb_btn_enable_ifkp_heard_log(Fl_Light_Button* o, void*) { progdefaults.ifkp_enable_heard_log = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_ifkp_heard_log=(Fl_Button *)0; static void cb_btn_select_ifkp_heard_log(Fl_Button*, void*) { std::string str = std::string(TempDir); str.append(progdefaults.ifkp_heard_log); const char *fname = FSEL::saveas("Heard log", "*.txt\t*", str.c_str()); if (!fname) return; if (!*fname) return; progdefaults.ifkp_heard_log = fl_filename_name(fname); txt_ifkp_heard_log->value(progdefaults.ifkp_heard_log.c_str()); progdefaults.changed = true; } Fl_Group *ifkp_image_box=(Fl_Group *)0; Fl_Check_Button *btnMT63_8bit=(Fl_Check_Button *)0; static void cb_btnMT63_8bit(Fl_Check_Button* o, void*) { progdefaults.mt63_8bit = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_rx_integration=(Fl_Check_Button *)0; static void cb_btnMT63_rx_integration(Fl_Check_Button* o, void*) { progdefaults.mt63_rx_integration = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_usetones=(Fl_Check_Button *)0; static void cb_btnMT63_usetones(Fl_Check_Button* o, void*) { progdefaults.mt63_usetones = o->value(); if (!o->value()) { btnMT63_upper_lower->value(0); btnMT63_upper_lower->do_callback(); btnMT63_upper_lower->deactivate(); } else btnMT63_upper_lower->activate(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_upper_lower=(Fl_Check_Button *)0; static void cb_btnMT63_upper_lower(Fl_Check_Button* o, void*) { progdefaults.mt63_twotones = o->value(); progdefaults.changed = true; } Fl_Spinner2 *MT63_tone_duration=(Fl_Spinner2 *)0; static void cb_MT63_tone_duration(Fl_Spinner2* o, void*) { progdefaults.mt63_tone_duration=(int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMT63_at500=(Fl_Check_Button *)0; static void cb_btnMT63_at500(Fl_Check_Button* o, void*) { o->value(1); progdefaults.mt63_at500 = true; progdefaults.mt63_centered = false; btnMT63_centered->value(0); btnMT63_manual->value(0); progdefaults.changed = true; } Fl_Check_Button *btnMT63_centered=(Fl_Check_Button *)0; static void cb_btnMT63_centered(Fl_Check_Button* o, void*) { o->value(1); progdefaults.mt63_centered = true; progdefaults.mt63_at500 = false; btnMT63_at500->value(0); btnMT63_manual->value(0); progdefaults.changed = true; } Fl_Check_Button *btnMT63_manual=(Fl_Check_Button *)0; static void cb_btnMT63_manual(Fl_Check_Button* o, void*) { o->value(1); progdefaults.mt63_centered = false; progdefaults.mt63_at500 = false; btnMT63_at500->value(0); btnMT63_centered->value(0); progdefaults.changed = true; } Fl_ListBox *i_listbox_contestia_bandwidth=(Fl_ListBox *)0; static void cb_i_listbox_contestia_bandwidth(Fl_ListBox* o, void*) { progdefaults.contestiabw = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true; } Fl_ListBox *i_listbox_contestia_tones=(Fl_ListBox *)0; static void cb_i_listbox_contestia_tones(Fl_ListBox* o, void*) { progdefaults.contestiatones = o->index(); set_contestia_default_integ(); resetCONTESTIA(); progdefaults.changed = true; } Fl_Counter2 *cntContestia_smargin=(Fl_Counter2 *)0; static void cb_cntContestia_smargin(Fl_Counter2* o, void*) { progdefaults.contestiasmargin = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true; } Fl_Counter2 *cntContestia_sinteg=(Fl_Counter2 *)0; static void cb_cntContestia_sinteg(Fl_Counter2* o, void*) { progdefaults.contestiasinteg = (int)(o->value()); resetCONTESTIA(); progdefaults.changed = true; } Fl_Check_Button *btnContestia_8bit=(Fl_Check_Button *)0; static void cb_btnContestia_8bit(Fl_Check_Button* o, void*) { progdefaults.contestia8bit = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnContestia_start_stop_tones=(Fl_Check_Button *)0; static void cb_btnContestia_start_stop_tones(Fl_Check_Button* o, void*) { progdefaults.contestia_start_tones = o->value(); progdefaults.changed = true; } Fl_ListBox *i_listbox_olivia_bandwidth=(Fl_ListBox *)0; static void cb_i_listbox_olivia_bandwidth(Fl_ListBox* o, void*) { progdefaults.oliviabw = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true; } Fl_ListBox *i_listbox_olivia_tones=(Fl_ListBox *)0; static void cb_i_listbox_olivia_tones(Fl_ListBox* o, void*) { progdefaults.oliviatones = o->index(); set_olivia_default_integ(); resetOLIVIA(); progdefaults.changed = true; } Fl_Counter2 *cntOlivia_smargin=(Fl_Counter2 *)0; static void cb_cntOlivia_smargin(Fl_Counter2* o, void*) { progdefaults.oliviasmargin = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true; } Fl_Counter2 *cntOlivia_sinteg=(Fl_Counter2 *)0; static void cb_cntOlivia_sinteg(Fl_Counter2* o, void*) { progdefaults.oliviasinteg = (int)(o->value()); resetOLIVIA(); progdefaults.changed = true; } Fl_Check_Button *btn_olivia_reset_fec=(Fl_Check_Button *)0; static void cb_btn_olivia_reset_fec(Fl_Check_Button* o, void*) { progdefaults.olivia_reset_fec = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnOlivia_8bit=(Fl_Check_Button *)0; static void cb_btnOlivia_8bit(Fl_Check_Button* o, void*) { progdefaults.olivia8bit = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnOlivia_start_stop_tones=(Fl_Check_Button *)0; static void cb_btnOlivia_start_stop_tones(Fl_Check_Button* o, void*) { progdefaults.olivia_start_tones = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntSearchRange=(Fl_Counter2 *)0; static void cb_cntSearchRange(Fl_Counter2* o, void*) { progdefaults.SearchRange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Counter2 *cntACQsn=(Fl_Counter2 *)0; static void cb_cntACQsn(Fl_Counter2* o, void*) { progdefaults.ACQsn = o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_psk_status_timeout=(Fl_ListBox *)0; static void cb_listbox_psk_status_timeout(Fl_ListBox* o, void*) { progdefaults.StatusDim = o->index(); progdefaults.changed = true; } static void cb_seconds(Fl_Counter2* o, void*) { progdefaults.StatusTimeout = (int)(o->value()); progdefaults.changed = true; } Fl_Check_Button *btnEnablePSKbrowsing=(Fl_Check_Button *)0; static void cb_btnEnablePSKbrowsing(Fl_Check_Button* o, void*) { progdefaults.pskbrowser_on = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnPSKpilot=(Fl_Check_Button *)0; static void cb_btnPSKpilot(Fl_Check_Button* o, void*) { progdefaults.pskpilot = o->value(); progdefaults.changed = true; } Fl_Counter2 *cnt_pilot_power=(Fl_Counter2 *)0; static void cb_cnt_pilot_power(Fl_Counter2* o, void*) { progdefaults.pilot_power = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnPSK8Preamble=(Fl_Check_Button *)0; static void cb_btnPSK8Preamble(Fl_Check_Button* o, void*) { progStatus.psk8DCDShortFlag = o->value(); } Fl_ListBox *i_listbox_rtty_afc_speed=(Fl_ListBox *)0; static void cb_i_listbox_rtty_afc_speed(Fl_ListBox* o, void*) { progdefaults.rtty_afcspeed = o->index(); progdefaults.changed = true; } Fl_Check_Button *chkUOSrx=(Fl_Check_Button *)0; static void cb_chkUOSrx(Fl_Check_Button* o, void*) { progdefaults.UOSrx=o->value(); progdefaults.changed = true; } Fl_Value_Input *rtty_rx_shape=(Fl_Value_Input *)0; static void cb_rtty_rx_shape(Fl_Value_Input* o, void*) { progdefaults.rtty_filter = o->value(); progStatus.rtty_filter_changed = true; progdefaults.changed = true; } static void cb_btnRxTones(Fl_Check_Button* o, void*) { if (o->value()) { btnRxTones[1]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 0; }; } static void cb_btnRxTones1(Fl_Check_Button* o, void*) { if (o->value()) { btnRxTones[0]->value(0); btnRxTones[2]->value(0); progdefaults.rtty_cwi = 1; }; } Fl_Check_Button *btnRxTones[3]={(Fl_Check_Button *)0}; static void cb_btnRxTones2(Fl_Check_Button* o, void*) { if (o->value()) { btnRxTones[1]->value(0); btnRxTones[0]->value(0); progdefaults.rtty_cwi = 2; }; } Fl_Check_Button *btnPreferXhairScope=(Fl_Check_Button *)0; static void cb_btnPreferXhairScope(Fl_Check_Button* o, void*) { progdefaults.PreferXhairScope=o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_true_scope=(Fl_Check_Button *)0; static void cb_chk_true_scope(Fl_Check_Button* o, void*) { progdefaults.true_scope=o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_useMARKfreq=(Fl_Check_Button *)0; static void cb_chk_useMARKfreq(Fl_Check_Button* o, void*) { progdefaults.useMARKfreq=o->value(); progdefaults.changed = true; } Fl_Button *btnRTTY_mark_color=(Fl_Button *)0; static void cb_btnRTTY_mark_color(Fl_Button* o, void*) { if (fl_color_chooser("MARK freq track", progdefaults.rttymarkRGBI.R, progdefaults.rttymarkRGBI.G, progdefaults.rttymarkRGBI.B) ) { o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Check_Button *chk_audibleBELL=(Fl_Check_Button *)0; static void cb_chk_audibleBELL(Fl_Check_Button* o, void*) { progdefaults.audibleBELL=o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_visibleBELL=(Fl_Check_Button *)0; static void cb_chk_visibleBELL(Fl_Check_Button* o, void*) { progdefaults.visibleBELL=o->value(); progdefaults.changed = true; } Fl_File_Input *inp_wav_fname_bell_ring=(Fl_File_Input *)0; Fl_Button *btn_select_bell_ring_wav=(Fl_Button *)0; static void cb_btn_select_bell_ring_wav(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.{mp3,wav}\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BELL_RING = fnfc.filename(); inp_wav_fname_bell_ring->value(progdefaults.BELL_RING.c_str()); progdefaults.BELL_RING_MENU = 0; mnu_bell_ring_menu->value(progdefaults.BELL_RING_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_bell_ring_menu=(Fl_Choice *)0; static void cb_mnu_bell_ring_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BELL_RING = "bark"; break; case 2 : progdefaults.BELL_RING = "checkout"; break; case 3 : progdefaults.BELL_RING = "diesel"; break; case 4 : progdefaults.BELL_RING = "steam_train"; break; case 5 : progdefaults.BELL_RING = "doesnot"; break; case 6 : progdefaults.BELL_RING = "beeboo"; break; case 7 : progdefaults.BELL_RING = "phone"; break; case 8 : progdefaults.BELL_RING = "dinner_bell"; break; case 9 : progdefaults.BELL_RING = "rtty_bell"; break; case 10 : progdefaults.BELL_RING = "standard_tone"; break; } inp_wav_fname_bell_ring->value(progdefaults.BELL_RING.c_str()); } progdefaults.BELL_RING_MENU = o->value(); } Fl_Button *btn_test_bell_ring_wav=(Fl_Button *)0; static void cb_btn_test_bell_ring_wav(Fl_Button*, void*) { audio_alert->alert(progdefaults.BELL_RING.c_str()); } Fl_ListBox *selShift=(Fl_ListBox *)0; static void cb_selShift(Fl_ListBox* o, void*) { progdefaults.rtty_shift = o->index(); sel_xcvr_FSK_shift->index(progdefaults.rtty_shift); if (progdefaults.rtty_shift == o->lsize() - 1) selCustomShift->activate(); else selCustomShift->deactivate(); selCustomShift->redraw(); resetRTTY(); progdefaults.changed = true; } Fl_Counter2 *selCustomShift=(Fl_Counter2 *)0; static void cb_selCustomShift(Fl_Counter2* o, void*) { progdefaults.rtty_custom_shift = o->value(); resetRTTY(); progdefaults.changed = true; } Fl_ListBox *selBaud=(Fl_ListBox *)0; static void cb_selBaud(Fl_ListBox* o, void*) { progdefaults.rtty_baud = o->index(); resetRTTY(); progdefaults.changed = true; } Fl_ListBox *selBits=(Fl_ListBox *)0; static void cb_selBits(Fl_ListBox* o, void*) { progdefaults.rtty_bits = o->index(); selParity->do_callback(); } Fl_ListBox *selParity=(Fl_ListBox *)0; static void cb_selParity(Fl_ListBox* o, void*) { if (progdefaults.rtty_bits == 0) { progdefaults.rtty_parity = rtty::RTTY_PARITY_NONE; o->index(progdefaults.rtty_parity); } else progdefaults.rtty_parity = o->index(); resetRTTY(); progdefaults.changed = true; } Fl_ListBox *selStopBits=(Fl_ListBox *)0; static void cb_selStopBits(Fl_ListBox* o, void*) { progdefaults.rtty_stop = o->index(); resetRTTY(); progdefaults.changed = true; } Fl_Check_Button *btnAUTOCRLF=(Fl_Check_Button *)0; static void cb_btnAUTOCRLF(Fl_Check_Button* o, void*) { progdefaults.rtty_autocrlf = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntrAUTOCRLF=(Fl_Counter2 *)0; static void cb_cntrAUTOCRLF(Fl_Counter2* o, void*) { progdefaults.rtty_autocount = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCRCRLF=(Fl_Check_Button *)0; static void cb_btnCRCRLF(Fl_Check_Button* o, void*) { progdefaults.rtty_crcrlf = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkUOStx=(Fl_Check_Button *)0; static void cb_chkUOStx(Fl_Check_Button* o, void*) { progdefaults.UOStx=o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_shaped_rtty=(Fl_Check_Button *)0; static void cb_chk_shaped_rtty(Fl_Check_Button* o, void*) { progStatus.shaped_rtty = o->value(); } Fl_Check_Button *chkPseudoFSK=(Fl_Check_Button *)0; static void cb_chkPseudoFSK(Fl_Check_Button* o, void*) { progdefaults.PseudoFSK = o->value(); chkPseudoFSK2->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); }; } Fl_Counter *cnt_TTY_LTRS=(Fl_Counter *)0; static void cb_cnt_TTY_LTRS(Fl_Counter* o, void*) { progdefaults.TTY_LTRS = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnFSKenabled=(Fl_Check_Button *)0; static void cb_btnFSKenabled(Fl_Check_Button* o, void*) { progdefaults.useFSK = o->value(); resetRTTY(); resetFSK(); progdefaults.changed = true; } Fl_Check_Button *btnFSKshared=(Fl_Check_Button *)0; static void cb_btnFSKshared(Fl_Check_Button* o, void*) { progdefaults.fsk_shares_port = o->value(); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true; } Fl_ComboBox *select_FSK_CommPort=(Fl_ComboBox *)0; static void cb_select_FSK_CommPort(Fl_ComboBox* o, void*) { progdefaults.fsk_port = o->value(); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true; } Fl_Check_Button *btnFSKreverse=(Fl_Check_Button *)0; static void cb_btnFSKreverse(Fl_Check_Button* o, void*) { progdefaults.fsk_reverse = o->value(); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true; } Fl_Check_Button *btnFSKuseDTR=(Fl_Check_Button *)0; static void cb_btnFSKuseDTR(Fl_Check_Button* o, void*) { progdefaults.fsk_on_dtr = o->value(); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true; } Fl_Button *btnFSKreset=(Fl_Button *)0; static void cb_btnFSKreset(Fl_Button*, void*) { resetRTTY(); resetFSK(); } Fl_Counter *cntr_xcvr_FSK_MARK=(Fl_Counter *)0; static void cb_cntr_xcvr_FSK_MARK(Fl_Counter* o, void*) { progdefaults.xcvr_FSK_MARK = o->value(); progdefaults.RTTYsweetspot = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift] / 2; valRTTYsweetspot->value(progdefaults.RTTYsweetspot); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true; } Fl_ListBox *sel_xcvr_FSK_shift=(Fl_ListBox *)0; static void cb_sel_xcvr_FSK_shift(Fl_ListBox* o, void*) { progdefaults.rtty_shift = o->index(); selShift->index(progdefaults.rtty_shift); progdefaults.RTTYsweetspot = progdefaults.xcvr_FSK_MARK + rtty::SHIFT[progdefaults.rtty_shift] / 2; valRTTYsweetspot->value(progdefaults.RTTYsweetspot); if (progdefaults.useFSK) { resetRTTY(); resetFSK(); } progdefaults.changed = true; } Fl_Check_Button *btnFSK_STOPBITS=(Fl_Check_Button *)0; static void cb_btnFSK_STOPBITS(Fl_Check_Button* o, void*) { progdefaults.fsk_STOPBITS = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_FSK_KEYLINE_flrig=(Fl_Check_Button *)0; static void cb_btn_FSK_KEYLINE_flrig(Fl_Check_Button* o, void*) { int val = o->value(); progdefaults.use_FLRIG_FSK = val; progdefaults.changed = true; } Fl_ComboBox *select_nanoIO_CommPort=(Fl_ComboBox *)0; static void cb_select_nanoIO_CommPort(Fl_ComboBox* o, void*) { progdefaults.nanoIO_serial_port_name = o->value(); } Fl_Light_Button *btn_nanoIO_connect=(Fl_Light_Button *)0; static void cb_btn_nanoIO_connect(Fl_Light_Button* o, void*) { if (o->value()) { if (open_nanoIO()) { btn_nanoCW_connect->value(1); chk_nanoIO_FSK_io->value(1); } else { o->value(0); btn_nanoCW_connect->value(0); chk_nanoIO_CW_io->value(0); chk_nanoIO_FSK_io->value(0); } } else { close_nanoIO(); o->value(0); btn_nanoCW_connect->value(0); chk_nanoIO_FSK_io->value(0); chk_nanoIO_CW_io->value(0); }; } Fl_ListBox *listbox_nanoIO_serbaud2=(Fl_ListBox *)0; static void cb_listbox_nanoIO_serbaud2(Fl_ListBox* o, void*) { progdefaults.nanoIO_serbaud = o->index(); listbox_nanoIO_serbaud->index(o->index()); progdefaults.changed = true; } FTextView *txt_nano_io=(FTextView *)0; Fl_Button *btn_nanofsk_save=(Fl_Button *)0; static void cb_btn_nanofsk_save(Fl_Button*, void*) { nano_CW_save(); } Fl_Button *btn_nanofsk_query=(Fl_Button *)0; static void cb_btn_nanofsk_query(Fl_Button*, void*) { nano_CW_query(); } Fl_Check_Button *chk_nanoIO_polarity=(Fl_Check_Button *)0; static void cb_chk_nanoIO_polarity(Fl_Check_Button* o, void*) { progdefaults.nanoIO_polarity=o->value(); nano_mark_polarity(progdefaults.nanoIO_polarity); progdefaults.changed = true; } Fl_ListBox *sel_nanoIO_baud=(Fl_ListBox *)0; static void cb_sel_nanoIO_baud(Fl_ListBox* o, void*) { progdefaults.nanoIO_baud = o->index(); nano_set_baud(progdefaults.nanoIO_baud); progdefaults.changed = true; } Fl_Group *grp_nanoio_debug=(Fl_Group *)0; Fl_Browser *brws_nanoio_sent=(Fl_Browser *)0; Fl_Browser *brws_nanoio_rcvd=(Fl_Browser *)0; Fl_Button *btn_nanoio_clear_sent=(Fl_Button *)0; static void cb_btn_nanoio_clear_sent(Fl_Button*, void*) { brws_nanoio_sent->clear(); } Fl_Button *btn_nanoio_clear_both=(Fl_Button *)0; static void cb_btn_nanoio_clear_both(Fl_Button*, void*) { brws_nanoio_rcvd->clear(); brws_nanoio_sent->clear(); } Fl_Button *btn_nanoio_clear_rcvd=(Fl_Button *)0; static void cb_btn_nanoio_clear_rcvd(Fl_Button*, void*) { brws_nanoio_rcvd->clear(); } Fl_Light_Button *btn_nanoio_debug=(Fl_Light_Button *)0; static void cb_btn_nanoio_debug(Fl_Light_Button* o, void*) { if (o->value()) { grp_nanoio_debug->show(); txt_nano_io->hide(); } else { grp_nanoio_debug->hide(); txt_nano_io->show(); }; } Fl_Check_Button *chk_nanoIO_FSK_io=(Fl_Check_Button *)0; static void cb_chk_nanoIO_FSK_io(Fl_Check_Button* o, void*) { if (o->value() == 0) { o->value(1); return; } set_nanoIO(); chk_nanoIO_CW_io->value(0); } Fl_ComboBox *select_USN_FSK_port=(Fl_ComboBox *)0; static void cb_select_USN_FSK_port(Fl_ComboBox* o, void*) { progdefaults.Nav_FSK_port = o->value(); } Fl_Light_Button *btn_Nav_connect=(Fl_Light_Button *)0; static void cb_btn_Nav_connect(Fl_Light_Button* o, void*) { if (o->value()) { if (!open_NavFSK()) o->value(0); } else { close_NavFSK(); }; } Fl_ComboBox *select_Nav_config_port=(Fl_ComboBox *)0; static void cb_select_Nav_config_port(Fl_ComboBox* o, void*) { progdefaults.Nav_config_port = o->value(); } Fl_ListBox *sel_Nav_ch1=(Fl_ListBox *)0; static void cb_sel_Nav_ch1(Fl_ListBox* o, void*) { progdefaults.Nav_channel_1_att = o->index(); Nav_set_channel_1_att(progdefaults.Nav_channel_1_att); progdefaults.changed = true; } Fl_ListBox *sel_Nav_ch2=(Fl_ListBox *)0; static void cb_sel_Nav_ch2(Fl_ListBox* o, void*) { progdefaults.Nav_channel_2_att = o->index(); Nav_set_channel_2_att(progdefaults.Nav_channel_2_att); progdefaults.changed = true; } Fl_ListBox *sel_Nav_rf_att=(Fl_ListBox *)0; static void cb_sel_Nav_rf_att(Fl_ListBox* o, void*) { progdefaults.Nav_rf_att = o->index(); Nav_set_rf_att(progdefaults.Nav_rf_att); progdefaults.changed = true; } Fl_ListBox *sel_Nav_wk_ptt=(Fl_ListBox *)0; static void cb_sel_Nav_wk_ptt(Fl_ListBox* o, void*) { progdefaults.Nav_wk_ptt = o->index(); Nav_set_wk_ptt(progdefaults.Nav_wk_ptt); progdefaults.changed = true; } Fl_ListBox *sel_Nav_LED=(Fl_ListBox *)0; static void cb_sel_Nav_LED(Fl_ListBox* o, void*) { progdefaults.Nav_led = o->index(); Nav_set_led(progdefaults.Nav_led); progdefaults.changed = true; } Fl_ListBox *sel_Nav_CAT_LED=(Fl_ListBox *)0; static void cb_sel_Nav_CAT_LED(Fl_ListBox* o, void*) { progdefaults.Nav_cat_led = o->index(); Nav_set_cat_led(progdefaults.Nav_cat_led); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_baud=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_baud(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_baud = o->index(); Nav_set_baud(progdefaults.Nav_FSK_baud); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_stopbits=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_stopbits(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_stopbits = o->index(); Nav_set_stopbits(progdefaults.Nav_FSK_stopbits); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_polarity=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_polarity(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_polarity = o->index(); Nav_set_polarity(progdefaults.Nav_FSK_polarity); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_sidetone=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_sidetone(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_sidetone = o->index(); Nav_set_sidetone(progdefaults.Nav_FSK_sidetone); progdefaults.changed = true; } Fl_ListBox *sel_Nav_FSK_ptt=(Fl_ListBox *)0; static void cb_sel_Nav_FSK_ptt(Fl_ListBox* o, void*) { progdefaults.Nav_FSK_ptt = o->index(); Nav_set_ptt(progdefaults.Nav_FSK_ptt); progdefaults.changed = true; } Fl_Light_Button *btn_Nav_config=(Fl_Light_Button *)0; static void cb_btn_Nav_config(Fl_Light_Button* o, void*) { if (o->value()) { if (!open_NavConfig()) o->value(0); } else { close_NavConfig(); }; } Fl_Check_Button *btnSynopAdifDecoding=(Fl_Check_Button *)0; static void cb_btnSynopAdifDecoding(Fl_Check_Button* o, void*) { progdefaults.SynopAdifDecoding=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnSynopKmlDecoding=(Fl_Check_Button *)0; static void cb_btnSynopKmlDecoding(Fl_Check_Button* o, void*) { progdefaults.SynopKmlDecoding=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnSynopInterleaved=(Fl_Check_Button *)0; static void cb_btnSynopInterleaved(Fl_Check_Button* o, void*) { progdefaults.SynopInterleaved=o->value(); progdefaults.changed = true; } Fl_ComboBox *select_WKFSK_CommPort=(Fl_ComboBox *)0; static void cb_select_WKFSK_CommPort(Fl_ComboBox* o, void*) { progStatus.WK_serial_port_name = o->value(); select_WK_CommPort->value(progStatus.WK_serial_port_name.c_str()); } Fl_Light_Button *btn_WKFSK_connect=(Fl_Light_Button *)0; static void cb_btn_WKFSK_connect(Fl_Light_Button* o, void*) { WKFSK_connect(o->value()); } Fl_ListBox *sel_WKFSK_baud=(Fl_ListBox *)0; static void cb_sel_WKFSK_baud(Fl_ListBox* o, void*) { progStatus.WKFSK_baud = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_stopbits=(Fl_ListBox *)0; static void cb_sel_WKFSK_stopbits(Fl_ListBox* o, void*) { progStatus.WKFSK_stopbits = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_ptt=(Fl_ListBox *)0; static void cb_sel_WKFSK_ptt(Fl_ListBox* o, void*) { progStatus.WKFSK_ptt = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_polarity=(Fl_ListBox *)0; static void cb_sel_WKFSK_polarity(Fl_ListBox* o, void*) { progStatus.WKFSK_polarity = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_sidetone=(Fl_ListBox *)0; static void cb_sel_WKFSK_sidetone(Fl_ListBox* o, void*) { progStatus.WKFSK_sidetone = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_auto_crlf=(Fl_ListBox *)0; static void cb_sel_WKFSK_auto_crlf(Fl_ListBox* o, void*) { progStatus.WKFSK_auto_crlf = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_diddle=(Fl_ListBox *)0; static void cb_sel_WKFSK_diddle(Fl_ListBox* o, void*) { progStatus.WKFSK_diddle = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_diddle_char=(Fl_ListBox *)0; static void cb_sel_WKFSK_diddle_char(Fl_ListBox* o, void*) { progStatus.WKFSK_diddle_char = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_usos=(Fl_ListBox *)0; static void cb_sel_WKFSK_usos(Fl_ListBox* o, void*) { progStatus.WKFSK_usos = o->index(); WKFSK_init(); } Fl_ListBox *sel_WKFSK_monitor=(Fl_ListBox *)0; static void cb_sel_WKFSK_monitor(Fl_ListBox* o, void*) { progStatus.WKFSK_monitor = o->index(); WKFSK_init(); } Fl_Input2 *txtTHORSecondary=(Fl_Input2 *)0; static void cb_txtTHORSecondary(Fl_Input2* o, void*) { progdefaults.THORsecText = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_FILTER=(Fl_Check_Button *)0; static void cb_valTHOR_FILTER(Fl_Check_Button* o, void*) { progdefaults.THOR_FILTER = o->value(); resetTHOR(); progdefaults.changed = true; } Fl_Counter2 *valTHOR_BW=(Fl_Counter2 *)0; static void cb_valTHOR_BW(Fl_Counter2* o, void*) { progdefaults.THOR_BW = o->value(); resetTHOR(); progdefaults.changed = true; } Fl_Value_Slider2 *valThorCWI=(Fl_Value_Slider2 *)0; static void cb_valThorCWI(Fl_Value_Slider2* o, void*) { progdefaults.ThorCWI = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_PREAMBLE=(Fl_Check_Button *)0; static void cb_valTHOR_PREAMBLE(Fl_Check_Button* o, void*) { progdefaults.THOR_PREAMBLE = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_SOFTSYMBOLS=(Fl_Check_Button *)0; static void cb_valTHOR_SOFTSYMBOLS(Fl_Check_Button* o, void*) { progdefaults.THOR_SOFTSYMBOLS = o->value(); progdefaults.changed = true; } Fl_Check_Button *valTHOR_SOFTBITS=(Fl_Check_Button *)0; static void cb_valTHOR_SOFTBITS(Fl_Check_Button* o, void*) { progdefaults.THOR_SOFTBITS = o->value(); progdefaults.changed = true; } Fl_Counter2 *valTHOR_PATHS=(Fl_Counter2 *)0; static void cb_valTHOR_PATHS(Fl_Counter2* o, void*) { progdefaults.THOR_PATHS = (int)o->value(); progdefaults.changed = true; } Fl_Group *thor_image_box=(Fl_Group *)0; Fl_Check_Button *btnNvtxAdifLog=(Fl_Check_Button *)0; static void cb_btnNvtxAdifLog(Fl_Check_Button* o, void*) { progdefaults.NVTX_AdifLog=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnNvtxKmlLog=(Fl_Check_Button *)0; static void cb_btnNvtxKmlLog(Fl_Check_Button* o, void*) { progdefaults.NVTX_KmlLog=o->value(); progdefaults.changed = true; } Fl_Counter *cntrWEFAX_Shift=(Fl_Counter *)0; static void cb_cntrWEFAX_Shift(Fl_Counter* o, void*) { progdefaults.WEFAX_Shift=o->value(); progdefaults.changed = true; } Fl_Counter *cntrWEFAX_Center=(Fl_Counter *)0; static void cb_cntrWEFAX_Center(Fl_Counter* o, void*) { progdefaults.WEFAX_Center=o->value(); progdefaults.changed = true; } Fl_Counter *cntrWEFAX_MaxRows=(Fl_Counter *)0; static void cb_cntrWEFAX_MaxRows(Fl_Counter* o, void*) { progdefaults.WEFAX_MaxRows=o->value(); progdefaults.changed = true; } Fl_Input *btnWefaxSaveDir=(Fl_Input *)0; static void cb_btnWefaxSaveDir(Fl_Input* o, void*) { progdefaults.wefax_save_dir=o->value(); progdefaults.changed = true; } Fl_Button *btnSelectFaxDestDir=(Fl_Button *)0; static void cb_btnSelectFaxDestDir(Fl_Button*, void*) { Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(WefaxDestDirSet); fc->show(); } Fl_Check_Button *btnWefaxAdifLog=(Fl_Check_Button *)0; static void cb_btnWefaxAdifLog(Fl_Check_Button* o, void*) { progdefaults.WEFAX_AdifLog=o->value(); progdefaults.changed = true; } Fl_Choice *wefax_choice_rx_filter=(Fl_Choice *)0; static void cb_wefax_choice_rx_filter(Fl_Choice* o, void*) { progdefaults.wefax_filter=o->value(); } Fl_Counter *auto_after_nrows=(Fl_Counter *)0; static void cb_auto_after_nrows(Fl_Counter* o, void*) { progdefaults.wefax_auto_after = o->value(); progdefaults.changed = true; } Fl_Counter *align_stop_after=(Fl_Counter *)0; static void cb_align_stop_after(Fl_Counter* o, void*) { progdefaults.wefax_align_stop = o->value(); progdefaults.changed = true; } Fl_Counter *align_every_nrows=(Fl_Counter *)0; static void cb_align_every_nrows(Fl_Counter* o, void*) { progdefaults.wefax_align_rows = o->value(); if (auto_after_nrows->minimum() < progdefaults.wefax_align_rows) { auto_after_nrows->minimum(progdefaults.wefax_align_rows); auto_after_nrows->value(progdefaults.wefax_align_rows); } progdefaults.changed = true; } Fl_Counter *wefax_correlation=(Fl_Counter *)0; static void cb_wefax_correlation(Fl_Counter* o, void*) { progdefaults.wefax_correlation = o->value(); progdefaults.changed = true; } Fl_Counter *cntr_correlation_rows=(Fl_Counter *)0; static void cb_cntr_correlation_rows(Fl_Counter* o, void*) { progdefaults.wefax_correlation_rows = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_auto_flrig_pathname=(Fl_Input2 *)0; static void cb_txt_auto_flrig_pathname(Fl_Input2* o, void*) { progdefaults.auto_flrig_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_flrig=(Fl_Button *)0; static void cb_btn_select_flrig(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_flrig_pathname); txt_auto_flrig_pathname->value(str.c_str()); progdefaults.auto_flrig_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_flamp_pathname=(Fl_Input2 *)0; static void cb_txt_auto_flamp_pathname(Fl_Input2* o, void*) { progdefaults.auto_flamp_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_auto_flamp=(Fl_Button *)0; static void cb_btn_select_auto_flamp(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_flamp_pathname); txt_auto_flamp_pathname->value(str.c_str()); progdefaults.auto_flamp_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_flnet_pathname=(Fl_Input2 *)0; static void cb_txt_auto_flnet_pathname(Fl_Input2* o, void*) { progdefaults.auto_flnet_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_auto_flnet=(Fl_Button *)0; static void cb_btn_select_auto_flnet(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_flnet_pathname); txt_auto_flnet_pathname->value(str.c_str()); progdefaults.auto_flnet_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_fllog_pathname=(Fl_Input2 *)0; static void cb_txt_auto_fllog_pathname(Fl_Input2* o, void*) { progdefaults.auto_fllog_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_fllog=(Fl_Button *)0; static void cb_btn_select_fllog(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_fllog_pathname); txt_auto_fllog_pathname->value(str.c_str()); progdefaults.auto_fllog_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_prog1_pathname=(Fl_Input2 *)0; static void cb_txt_auto_prog1_pathname(Fl_Input2* o, void*) { progdefaults.auto_prog1_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_prog1=(Fl_Button *)0; static void cb_btn_select_prog1(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_prog1_pathname); txt_auto_prog1_pathname->value(str.c_str()); progdefaults.auto_prog1_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_prog2_pathname=(Fl_Input2 *)0; static void cb_txt_auto_prog2_pathname(Fl_Input2* o, void*) { progdefaults.auto_prog2_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_prog2=(Fl_Button *)0; static void cb_btn_select_prog2(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_prog2_pathname); txt_auto_prog2_pathname->value(str.c_str()); progdefaults.auto_prog2_pathname = str; progdefaults.changed = true; } Fl_Input2 *txt_auto_prog3_pathname=(Fl_Input2 *)0; static void cb_txt_auto_prog3_pathname(Fl_Input2* o, void*) { progdefaults.auto_prog3_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_prog3=(Fl_Button *)0; static void cb_btn_select_prog3(Fl_Button*, void*) { std::string str = select_binary_pathname(progdefaults.auto_prog3_pathname); txt_auto_prog3_pathname->value(str.c_str()); progdefaults.auto_prog3_pathname = str; progdefaults.changed = true; } Fl_Check_Button *btn_flrig_auto_enable=(Fl_Check_Button *)0; static void cb_btn_flrig_auto_enable(Fl_Check_Button* o, void*) { progdefaults.flrig_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_flamp_auto_enable=(Fl_Check_Button *)0; static void cb_btn_flamp_auto_enable(Fl_Check_Button* o, void*) { progdefaults.flamp_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_flnet_auto_enable=(Fl_Check_Button *)0; static void cb_btn_flnet_auto_enable(Fl_Check_Button* o, void*) { progdefaults.flnet_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_fllog_auto_enable=(Fl_Check_Button *)0; static void cb_btn_fllog_auto_enable(Fl_Check_Button* o, void*) { progdefaults.fllog_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_prog1_auto_enable=(Fl_Check_Button *)0; static void cb_btn_prog1_auto_enable(Fl_Check_Button* o, void*) { progdefaults.prog1_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_prog2_auto_enable=(Fl_Check_Button *)0; static void cb_btn_prog2_auto_enable(Fl_Check_Button* o, void*) { progdefaults.prog2_auto_enable = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_prog3_auto_enable=(Fl_Check_Button *)0; static void cb_btn_prog3_auto_enable(Fl_Check_Button* o, void*) { progdefaults.prog3_auto_enable = o->value(); progdefaults.changed = true; } Fl_Button *btn_test_flrig=(Fl_Button *)0; static void cb_btn_test_flrig(Fl_Button*, void*) { start_process(progdefaults.auto_flrig_pathname); } Fl_Button *btn_test_flamp=(Fl_Button *)0; static void cb_btn_test_flamp(Fl_Button*, void*) { start_process(progdefaults.auto_flamp_pathname); } Fl_Button *btn_test_flnet=(Fl_Button *)0; static void cb_btn_test_flnet(Fl_Button*, void*) { start_process(progdefaults.auto_flnet_pathname); } Fl_Button *btn_test_fllog=(Fl_Button *)0; static void cb_btn_test_fllog(Fl_Button*, void*) { start_process(progdefaults.auto_fllog_pathname); } Fl_Button *btn_test_prog1=(Fl_Button *)0; static void cb_btn_test_prog1(Fl_Button*, void*) { start_process(progdefaults.auto_prog1_pathname); } Fl_Button *btn_test_prog2=(Fl_Button *)0; static void cb_btn_test_prog2(Fl_Button*, void*) { start_process(progdefaults.auto_prog2_pathname); } Fl_Button *btn_test_prog3=(Fl_Button *)0; static void cb_btn_test_prog3(Fl_Button*, void*) { start_process(progdefaults.auto_prog3_pathname); } Fl_Check_Button *chkSlowCpu=(Fl_Check_Button *)0; static void cb_chkSlowCpu(Fl_Check_Button* o, void*) { progdefaults.slowcpu = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkDTMFdecode=(Fl_Check_Button *)0; static void cb_chkDTMFdecode(Fl_Check_Button* o, void*) { progdefaults.DTMFdecode = o->value(); } Fl_Input *btnKmlSaveDir=(Fl_Input *)0; static void cb_btnKmlSaveDir(Fl_Input* o, void*) { progdefaults.kml_save_dir=o->value(); progdefaults.changed = true; kml_init(); } Fl_Input *inputKmlRootFile=(Fl_Input *)0; Fl_Counter *cntKmlMergeDistance=(Fl_Counter *)0; static void cb_cntKmlMergeDistance(Fl_Counter* o, void*) { progdefaults.kml_merge_distance = o->value(); progdefaults.changed = true; kml_init(); } Fl_Counter *cntKmlRetentionTime=(Fl_Counter *)0; static void cb_cntKmlRetentionTime(Fl_Counter* o, void*) { progdefaults.kml_retention_time = o->value(); progdefaults.changed = true; kml_init(); } Fl_Spinner2 *cntKmlRefreshInterval=(Fl_Spinner2 *)0; static void cb_cntKmlRefreshInterval(Fl_Spinner2* o, void*) { progdefaults.kml_refresh_interval = (int)(o->value()); progdefaults.changed = true; kml_init(); } Fl_ListBox *listbox_kml_balloon_style=(Fl_ListBox *)0; static void cb_listbox_kml_balloon_style(Fl_ListBox* o, void*) { progdefaults.kml_balloon_style = o->index(); progdefaults.changed = true; kml_init(); } Fl_Input *btnKmlCommand=(Fl_Input *)0; static void cb_btnKmlCommand(Fl_Input* o, void*) { progdefaults.kml_command=o->value(); progdefaults.changed = true; kml_init(); } Fl_Button *btlTestKmlCommand=(Fl_Button *)0; static void cb_btlTestKmlCommand(Fl_Button*, void*) { KmlServer::SpawnProcess(); } Fl_Button *btnSelectKmlDestDir=(Fl_Button *)0; static void cb_btnSelectKmlDestDir(Fl_Button*, void*) { Fl_File_Chooser *fc = new Fl_File_Chooser(".",NULL,Fl_File_Chooser::DIRECTORY,"Input File"); fc->callback(KmlDestDirSet); fc->show(); } Fl_Button *btlPurge=(Fl_Button *)0; static void cb_btlPurge(Fl_Button*, void*) { KmlServer::GetInstance()->Reset(); } Fl_Check_Button *btnKmlPurgeOnStartup=(Fl_Check_Button *)0; static void cb_btnKmlPurgeOnStartup(Fl_Check_Button* o, void*) { progdefaults.kml_purge_on_startup = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_kml_enabled=(Fl_Check_Button *)0; static void cb_btn_kml_enabled(Fl_Check_Button* o, void*) { progdefaults.kml_enabled = o->value(); if (progdefaults.kml_enabled) { kml_init(true); progdefaults.changed = true; } else { KmlServer::Exit(); }; } Fl_Check_Button *chkAutoExtract=(Fl_Check_Button *)0; static void cb_chkAutoExtract(Fl_Check_Button* o, void*) { progdefaults.autoextract = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_open_wrap_folder=(Fl_Check_Button *)0; static void cb_chk_open_wrap_folder(Fl_Check_Button* o, void*) { progdefaults.open_nbems_folder = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_open_flmsg=(Fl_Check_Button *)0; static void cb_chk_open_flmsg(Fl_Check_Button* o, void*) { progdefaults.open_flmsg = o->value(); progdefaults.changed = true; } Fl_Check_Button *chk_open_flmsg_print=(Fl_Check_Button *)0; static void cb_chk_open_flmsg_print(Fl_Check_Button* o, void*) { progdefaults.open_flmsg_print = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_flmsg_pathname=(Fl_Input2 *)0; static void cb_txt_flmsg_pathname(Fl_Input2* o, void*) { progdefaults.flmsg_pathname = o->value(); progdefaults.changed = true; } Fl_Button *btn_select_flmsg=(Fl_Button *)0; static void cb_btn_select_flmsg(Fl_Button*, void*) { select_flmsg_pathname(); } Fl_Value_Slider *sldr_extract_timeout=(Fl_Value_Slider *)0; static void cb_sldr_extract_timeout(Fl_Value_Slider* o, void*) { progdefaults.extract_timeout=o->value(); progdefaults.changed=true; } Fl_Check_Button *chk_transfer__to_open_flmsg=(Fl_Check_Button *)0; static void cb_chk_transfer__to_open_flmsg(Fl_Check_Button* o, void*) { progdefaults.flmsg_transfer_direct = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnPSKRepAuto=(Fl_Check_Button *)0; static void cb_btnPSKRepAuto(Fl_Check_Button* o, void*) { progdefaults.pskrep_auto = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Check_Button *btnPSKRepLog=(Fl_Check_Button *)0; static void cb_btnPSKRepLog(Fl_Check_Button* o, void*) { progdefaults.pskrep_log = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Check_Button *btnPSKRepQRG=(Fl_Check_Button *)0; static void cb_btnPSKRepQRG(Fl_Check_Button* o, void*) { progdefaults.pskrep_qrg = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_report_when_visible=(Fl_Check_Button *)0; static void cb_btn_report_when_visible(Fl_Check_Button* o, void*) { progdefaults.report_when_visible = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_pskrep_autostart=(Fl_Check_Button *)0; static void cb_btn_pskrep_autostart(Fl_Check_Button* o, void*) { progdefaults.pskrep_autostart = o->value(); progdefaults.changed = true; } Fl_Box *box_connected_to_pskrep=(Fl_Box *)0; Fl_Input2 *inpPSKRepHost=(Fl_Input2 *)0; static void cb_inpPSKRepHost(Fl_Input2* o, void*) { progdefaults.pskrep_host = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Input2 *inpPSKRepPort=(Fl_Input2 *)0; static void cb_inpPSKRepPort(Fl_Input2* o, void*) { progdefaults.pskrep_port = o->value(); btnPSKRepInit->labelcolor(FL_RED); btnPSKRepInit->redraw_label(); progdefaults.changed = true; } Fl_Button *btnPSKRepInit=(Fl_Button *)0; static void cb_btnPSKRepInit(Fl_Button* o, void*) { pskrep_stop(); if (!pskrep_start()) { boxPSKRepMsg->copy_label(pskrep_error()); progdefaults.usepskrep = false; box_connected_to_pskrep->color(FL_WHITE); box_connected_to_pskrep->redraw(); } else { boxPSKRepMsg->label(0); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.usepskrep = true; box_connected_to_pskrep->color(FL_GREEN); box_connected_to_pskrep->redraw(); }; } Fl_Box *boxPSKRepMsg=(Fl_Box *)0; Fl_Counter *cntBusyChannelSeconds=(Fl_Counter *)0; static void cb_cntBusyChannelSeconds(Fl_Counter* o, void*) { progStatus.busyChannelSeconds = (int) o->value(); progdefaults.busyChannelSeconds = (int) o->value(); progdefaults.changed = true; } Fl_Check_Button *btnEnableBusyChannel=(Fl_Check_Button *)0; static void cb_btnEnableBusyChannel(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.enableBusyChannel = true; progdefaults.enableBusyChannel = true; } else { progStatus.enableBusyChannel = false; progdefaults.enableBusyChannel = false; } progdefaults.changed = true; } Fl_Counter *cntPSMTXBufferFlushTimer=(Fl_Counter *)0; static void cb_cntPSMTXBufferFlushTimer(Fl_Counter* o, void*) { progStatus.psm_flush_buffer_timeout = (int) o->value(); progdefaults.psm_flush_buffer_timeout = (int) o->value(); progdefaults.changed = true; } Fl_Counter *cntPSMBandwidthMargins=(Fl_Counter *)0; static void cb_cntPSMBandwidthMargins(Fl_Counter* o, void*) { progStatus.psm_minimum_bandwidth_margin = (int) o->value(); progdefaults.psm_minimum_bandwidth_margin = (int) o->value(); progdefaults.changed = true; } Fl_Counter *cntPSMValidSamplePeriod=(Fl_Counter *)0; static void cb_cntPSMValidSamplePeriod(Fl_Counter* o, void*) { progStatus.psm_hit_time_window = (int) o->value(); progdefaults.psm_hit_time_window = (int) o->value(); progdefaults.changed = true; } Fl_Check_Button *btnEnable_csma=(Fl_Check_Button *)0; static void cb_btnEnable_csma(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.csma_enabled = true; progdefaults.csma_enabled = true; } else { progStatus.csma_enabled = false; progdefaults.csma_enabled = false; } progdefaults.changed = true; } Fl_Counter *cntPersistance=(Fl_Counter *)0; static void cb_cntPersistance(Fl_Counter* o, void*) { progStatus.csma_persistance = (int) o->value(); progdefaults.csma_persistance = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_PERSISTANCE); } Fl_Counter *cntSlotTime=(Fl_Counter *)0; static void cb_cntSlotTime(Fl_Counter* o, void*) { progStatus.csma_slot_time = (int) o->value(); progdefaults.csma_slot_time = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_SLOT_TIME); } Fl_Counter *cntTransmitDelay=(Fl_Counter *)0; static void cb_cntTransmitDelay(Fl_Counter* o, void*) { progStatus.csma_transmit_delay = (int) o->value(); progdefaults.csma_transmit_delay = (int) o->value(); progdefaults.changed = true; update_csma_io_config(CSMA_TX_DELAY); } Fl_Output *OutputSlotTimeMS=(Fl_Output *)0; Fl_Output *OutputTransmitDelayMS=(Fl_Output *)0; Fl_Output *OutputPersistancePercent=(Fl_Output *)0; Fl_Check_Button *btnEnable_histogram=(Fl_Check_Button *)0; static void cb_btnEnable_histogram(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.psm_use_histogram = true; progdefaults.psm_use_histogram = true; } else { progStatus.psm_use_histogram = false; progdefaults.psm_use_histogram = false; } progdefaults.changed = true; } Fl_Counter *cntPSMThreshold=(Fl_Counter *)0; static void cb_cntPSMThreshold(Fl_Counter* o, void*) { progStatus.psm_histogram_offset_threshold = (int) o->value(); progdefaults.psm_histogram_offset_threshold = (int) o->value(); progdefaults.changed = true; } Fl_Counter *cntKPSQLAttenuation=(Fl_Counter *)0; static void cb_cntKPSQLAttenuation(Fl_Counter* o, void*) { progStatus.kpsql_attenuation = (int) o->value(); progdefaults.kpsql_attenuation = (int) o->value(); update_kpsql_fractional_gain(progStatus.kpsql_attenuation); progdefaults.changed = true; } Fl_Check_Button *btn_show_psm_button=(Fl_Check_Button *)0; static void cb_btn_show_psm_button(Fl_Check_Button* o, void*) { progdefaults.show_psm_btn = o->value(); UI_select(); progdefaults.changed = true; } Fl_Button *btnBuyChannelDefaults=(Fl_Button *)0; static void cb_btnBuyChannelDefaults(Fl_Button*, void*) { psm_set_defaults(); } Fl_Group *grpTalker=(Fl_Group *)0; Fl_Light_Button *btnConnectTalker=(Fl_Light_Button *)0; static void cb_btnConnectTalker(Fl_Light_Button* o, void*) { if (o->value()) open_talker(); else close_talker(); } Fl_Check_Button *btn_auto_talk=(Fl_Check_Button *)0; static void cb_btn_auto_talk(Fl_Check_Button* o, void*) { progdefaults.auto_talk = o->value(); } Fl_Check_Button *chkRxStream=(Fl_Check_Button *)0; static void cb_chkRxStream(Fl_Check_Button* o, void*) { progdefaults.speak = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnTXLEVEL_by_mode=(Fl_Check_Button *)0; static void cb_btnTXLEVEL_by_mode(Fl_Check_Button* o, void*) { progdefaults.txlevel_by_mode=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnSQLCH_by_mode=(Fl_Check_Button *)0; static void cb_btnSQLCH_by_mode(Fl_Check_Button* o, void*) { progdefaults.sqlch_by_mode=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnAFC_by_mode=(Fl_Check_Button *)0; static void cb_btnAFC_by_mode(Fl_Check_Button* o, void*) { progdefaults.afc_by_mode=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnREVERSE_by_mode=(Fl_Check_Button *)0; static void cb_btnREVERSE_by_mode(Fl_Check_Button* o, void*) { progdefaults.reverse_by_mode=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *valCWsweetspot=(Fl_Value_Input2 *)0; static void cb_valCWsweetspot(Fl_Value_Input2* o, void*) { progdefaults.CWsweetspot=o->value(); progdefaults.changed = true; } Fl_Value_Input2 *valRTTYsweetspot=(Fl_Value_Input2 *)0; static void cb_valRTTYsweetspot(Fl_Value_Input2* o, void*) { progdefaults.RTTYsweetspot=o->value(); cntr_xcvr_FSK_MARK->value(progdefaults.RTTYsweetspot - rtty::SHIFT[progdefaults.rtty_shift] / 2); resetRTTY(); progdefaults.changed = true; } Fl_Value_Input2 *valPSKsweetspot=(Fl_Value_Input2 *)0; static void cb_valPSKsweetspot(Fl_Value_Input2* o, void*) { progdefaults.PSKsweetspot=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnStartAtSweetSpot=(Fl_Check_Button *)0; static void cb_btnStartAtSweetSpot(Fl_Check_Button* o, void*) { progdefaults.StartAtSweetSpot = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnCWIsLSB=(Fl_Check_Button *)0; static void cb_btnCWIsLSB(Fl_Check_Button* o, void*) { progdefaults.CWIsLSB=o->value(); progdefaults.changed=true; } static void cb_Misc(Fl_Group*, void*) { btnDisable_p2p_io_widgets->value(1); } Fl_Check_Button *btnDisable_p2p_io_widgets=(Fl_Check_Button *)0; static void cb_btnDisable_p2p_io_widgets(Fl_Check_Button* o, long) { progStatus.ip_lock = o->value(); if(o->value()) disable_config_p2p_io_widgets(); else enable_config_p2p_io_widgets(); kiss_io_set_button_state(0); } Fl_Check_Button *btnEnable_arq=(Fl_Check_Button *)0; static void cb_btnEnable_arq(Fl_Check_Button* o, void*) { if(o->value()) { enable_arq(); } progdefaults.changed = true; } Fl_Check_Button *btnEnable_kiss=(Fl_Check_Button *)0; static void cb_btnEnable_kiss(Fl_Check_Button* o, void*) { if(o->value()) { enable_kiss(); } progdefaults.changed = true; } Fl_Input2 *txtKiss_ip_address=(Fl_Input2 *)0; static void cb_txtKiss_ip_address(Fl_Input2* o, void*) { progStatus.kiss_address = o->value(); progdefaults.kiss_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txtKiss_ip_io_port_no=(Fl_Input2 *)0; static void cb_txtKiss_ip_io_port_no(Fl_Input2* o, void*) { progStatus.kiss_io_port = o->value(); progdefaults.kiss_io_port = o->value(); progdefaults.changed = true; } Fl_Input2 *txtKiss_ip_out_port_no=(Fl_Input2 *)0; static void cb_txtKiss_ip_out_port_no(Fl_Input2* o, void*) { progStatus.kiss_out_port = o->value(); progdefaults.kiss_out_port = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnEnable_dual_port=(Fl_Check_Button *)0; static void cb_btnEnable_dual_port(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_dual_port_enabled = true; progdefaults.kiss_dual_port_enabled = true; } else { progStatus.kiss_dual_port_enabled = false; progdefaults.kiss_dual_port_enabled = false; } progdefaults.changed = true; } Fl_Button *btn_restart_kiss=(Fl_Button *)0; static void cb_btn_restart_kiss(Fl_Button*, void*) { //restart_kiss_server(); } Fl_Button *btn_connect_kiss_io=(Fl_Button *)0; static void cb_btn_connect_kiss_io(Fl_Button*, void*) { connect_to_kiss_io(true); } Fl_Button *btnDefault_kiss_ip=(Fl_Button *)0; static void cb_btnDefault_kiss_ip(Fl_Button*, void*) { set_ip_to_default(KISS_IO); progdefaults.changed = true; } Fl_Check_Button *btnKissTCPIO=(Fl_Check_Button *)0; static void cb_btnKissTCPIO(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_tcp_io = true; progdefaults.kiss_tcp_io = true; } else { progStatus.kiss_tcp_io = false; progdefaults.kiss_tcp_io = false; } kiss_io_set_button_state(0); progdefaults.changed = true; } Fl_Check_Button *btnKissUDPIO=(Fl_Check_Button *)0; static void cb_btnKissUDPIO(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_tcp_io = false; progdefaults.kiss_tcp_io = false; } else { progStatus.kiss_tcp_io = true; progdefaults.kiss_tcp_io = true; } kiss_io_set_button_state(0); progdefaults.changed = true; } Fl_Check_Button *btnKissTCPListen=(Fl_Check_Button *)0; static void cb_btnKissTCPListen(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_tcp_listen = true; progdefaults.kiss_tcp_listen = true; } else { progStatus.kiss_tcp_listen = false; progdefaults.kiss_tcp_listen = false; } progdefaults.changed = true; } Fl_Check_Button *btnEnable_7bit_modem_inhibit=(Fl_Check_Button *)0; static void cb_btnEnable_7bit_modem_inhibit(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.kiss_io_modem_change_inhibit = true; progdefaults.kiss_io_modem_change_inhibit = true; } else { progStatus.kiss_io_modem_change_inhibit = false; progdefaults.kiss_io_modem_change_inhibit = false; } progdefaults.changed = true; } Fl_Check_Button *btnEnable_auto_connect=(Fl_Check_Button *)0; static void cb_btnEnable_auto_connect(Fl_Check_Button* o, void*) { if(o->value()) { progdefaults.tcp_udp_auto_connect = true; } else { progdefaults.tcp_udp_auto_connect = false; } progdefaults.changed = true; } Fl_Check_Button *btnEnable_ax25_decode=(Fl_Check_Button *)0; static void cb_btnEnable_ax25_decode(Fl_Check_Button* o, void*) { if(o->value()) { progStatus.ax25_decode_enabled = true; progdefaults.ax25_decode_enabled = true; } else { progStatus.ax25_decode_enabled = false; progdefaults.ax25_decode_enabled = false; } progdefaults.changed = true; } Fl_Input2 *txtArq_ip_address=(Fl_Input2 *)0; static void cb_txtArq_ip_address(Fl_Input2* o, void*) { progdefaults.arq_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txtArq_ip_port_no=(Fl_Input2 *)0; static void cb_txtArq_ip_port_no(Fl_Input2* o, void*) { progdefaults.arq_port = o->value(); progdefaults.changed = true; } Fl_Button *btnDefault_arq_ip=(Fl_Button *)0; static void cb_btnDefault_arq_ip(Fl_Button*, void*) { set_ip_to_default(ARQ_IO); progdefaults.changed = true; } Fl_Button *btn_restart_arq=(Fl_Button *)0; static void cb_btn_restart_arq(Fl_Button*, void*) { //arq_restart(); } Fl_Button *btnDefault_xmlrpc_ip=(Fl_Button *)0; static void cb_btnDefault_xmlrpc_ip(Fl_Button*, void*) { set_ip_to_default(XMLRPC_IO); progdefaults.changed = true; } Fl_Input2 *txtXmlrpc_ip_address=(Fl_Input2 *)0; static void cb_txtXmlrpc_ip_address(Fl_Input2* o, void*) { progdefaults.xmlrpc_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txtXmlrpc_ip_port_no=(Fl_Input2 *)0; static void cb_txtXmlrpc_ip_port_no(Fl_Input2* o, void*) { progdefaults.xmlrpc_port = o->value(); progdefaults.changed = true; } Fl_Button *btn_restart_xml=(Fl_Button *)0; static void cb_btn_restart_xml(Fl_Button*, void*) { //restart_xml_server(); } Fl_Button *btnDefault_flrig_ip=(Fl_Button *)0; static void cb_btnDefault_flrig_ip(Fl_Button*, void*) { set_ip_to_default(FLRIG_IO); progdefaults.changed = true; } Fl_Input2 *txt_flrig_ip_address=(Fl_Input2 *)0; static void cb_txt_flrig_ip_address(Fl_Input2* o, void*) { progdefaults.flrig_ip_address = o->value(); progdefaults.changed = true; } Fl_Input2 *txt_flrig_ip_port=(Fl_Input2 *)0; static void cb_txt_flrig_ip_port(Fl_Input2* o, void*) { progdefaults.flrig_ip_port = o->value(); progdefaults.changed = true; } Fl_Button *btn_reconnect_flrig_server=(Fl_Button *)0; static void cb_btn_reconnect_flrig_server(Fl_Button*, void*) { reconnect_to_flrig(); } Fl_Input *txt_fllog_ip_address=(Fl_Input *)0; static void cb_txt_fllog_ip_address(Fl_Input* o, void*) { progdefaults.xmllog_address = o->value(); } Fl_Input *txt_fllog_ip_port=(Fl_Input *)0; static void cb_txt_fllog_ip_port(Fl_Input* o, void*) { progdefaults.xmllog_port = o->value(); } Fl_Button *btn_reconnect_log_server=(Fl_Button *)0; static void cb_btn_reconnect_log_server(Fl_Button*, void*) { progdefaults.xml_logbook = true; progdefaults.changed = true; connect_to_log_server(); } Fl_Button *btnDefault_fllog_ip=(Fl_Button *)0; static void cb_btnDefault_fllog_ip(Fl_Button*, void*) { set_ip_to_default(FLLOG_IO); progdefaults.changed = true; } Fl_Group *grpOperator=(Fl_Group *)0; Fl_Input2 *inpMyCallsign=(Fl_Input2 *)0; static void cb_inpMyCallsign(Fl_Input2*, void*) { const char *triggers = " !#$%&'()*+,-.;<=>?@[\\]^_{|}~"; std::string mycall = inpMyCallsign->value(); bool modified = false; for (size_t k = 0; k < mycall.length(); k++) { for (size_t n = 0; n < strlen(triggers); n++) { if (mycall[k] == triggers[n]) { if ( fl_choice2("Replace FSQ trigger character with slash /", _("no"), _("yes"), NULL ) ) { mycall[k] = '/'; modified = true; } } } } if (modified) { int p = inpMyCallsign->position(); inpMyCallsign->value(mycall.c_str()); inpMyCallsign->position(p); // causes a redraw } progdefaults.myCall = mycall; if (progdefaults.THORsecText.empty()) { progdefaults.THORsecText = mycall; progdefaults.THORsecText.append(" "); txtTHORSecondary->value(progdefaults.THORsecText.c_str()); } if (progdefaults.secText.empty()) { progdefaults.secText = mycall; progdefaults.secText.append(" "); txtSecondary->value(progdefaults.secText.c_str()); } update_main_title(); notify_change_callsign(); progdefaults.changed = true; } Fl_Input2 *inpOperCallsign=(Fl_Input2 *)0; static void cb_inpOperCallsign(Fl_Input2* o, void*) { progdefaults.operCall = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyName=(Fl_Input2 *)0; static void cb_inpMyName(Fl_Input2* o, void*) { progdefaults.myName = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyAntenna=(Fl_Input2 *)0; static void cb_inpMyAntenna(Fl_Input2* o, void*) { progdefaults.myAntenna = o->value(); progdefaults.changed = true; } Fl_Input2 *inpMyQth=(Fl_Input2 *)0; static void cb_inpMyQth(Fl_Input2* o, void*) { progdefaults.myQth = o->value(); inpMyFSQQth->value(o->value()); progdefaults.changed = true; } Fl_Input2 *inpMyLocator=(Fl_Input2 *)0; static void cb_inpMyLocator(Fl_Input2* o, void*) { progdefaults.myLocator = o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_states=(Fl_ListBox *)0; static void cb_listbox_states(Fl_ListBox* o, void*) { listbox_counties->clear(); listbox_counties->add(states.counties(o->value()).c_str()); listbox_counties->index(0); inp_QP_short_county->value(states.cnty_short(listbox_states->value(),listbox_counties->value()).c_str()); inp_QP_state_short->value(states.state_short(o->value()).c_str()); progdefaults.SQSOstate = o->index(); progdefaults.changed = true; } Fl_Input2 *inp_QP_state_short=(Fl_Input2 *)0; Fl_ListBox *listbox_counties=(Fl_ListBox *)0; static void cb_listbox_counties(Fl_ListBox* o, void*) { inp_QP_short_county->value(states.cnty_short(listbox_states->value(),o->value()).c_str()); progdefaults.SQSOcounty = o->index(); progdefaults.changed = true; } Fl_Input2 *inp_QP_short_county=(Fl_Input2 *)0; Fl_Group *grpRigFlrig=(Fl_Group *)0; Fl_Check_Button *chk_flrig_keys_modem=(Fl_Check_Button *)0; static void cb_chk_flrig_keys_modem(Fl_Check_Button* o, void*) { progdefaults.flrig_keys_modem = o->value(); progdefaults.changed = true; } Fl_Button *btnDefault_flrig_ip_mirror=(Fl_Button *)0; static void cb_btnDefault_flrig_ip_mirror(Fl_Button*, void*) { set_ip_to_default(FLRIG_IO); txt_flrig_ip_address_mirror->value(progdefaults.flrig_ip_address.c_str()); txt_flrig_ip_port_mirror->value(progdefaults.flrig_ip_port.c_str()); progdefaults.changed = true; } Fl_Input2 *txt_flrig_ip_address_mirror=(Fl_Input2 *)0; static void cb_txt_flrig_ip_address_mirror(Fl_Input2* o, void*) { progdefaults.flrig_ip_address = o->value(); txt_flrig_ip_address->value(progdefaults.flrig_ip_address.c_str()); progdefaults.changed = true; } Fl_Input2 *txt_flrig_ip_port_mirror=(Fl_Input2 *)0; static void cb_txt_flrig_ip_port_mirror(Fl_Input2* o, void*) { progdefaults.flrig_ip_port = o->value(); txt_flrig_ip_port->value(progdefaults.flrig_ip_port.c_str()); progdefaults.changed = true; } Fl_Button *btn_reconnect_flrig_server_mirror=(Fl_Button *)0; static void cb_btn_reconnect_flrig_server_mirror(Fl_Button*, void*) { reconnect_to_flrig(); } Fl_Check_Button *btn_fldigi_client_to_flrig=(Fl_Check_Button *)0; static void cb_btn_fldigi_client_to_flrig(Fl_Check_Button* o, void*) { progdefaults.fldigi_client_to_flrig=o->value(); if (o->value()) { progdefaults.chkUSEHAMLIBis = false; progdefaults.chkUSERIGCATis = false; chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); } progdefaults.changed=true; } Fl_Check_Button *btn_flrig_auto_shutdown=(Fl_Check_Button *)0; static void cb_btn_flrig_auto_shutdown(Fl_Check_Button* o, void*) { progdefaults.flrig_auto_shutdown=o->value(); progdefaults.changed=true; } Fl_Counter2 *val_flrig_poll=(Fl_Counter2 *)0; static void cb_val_flrig_poll(Fl_Counter2* o, void*) { progdefaults.flrig_poll = o->value(); } Fl_Group *grpRigCat=(Fl_Group *)0; Fl_Check_Button *chkUSERIGCAT=(Fl_Check_Button *)0; static void cb_chkUSERIGCAT(Fl_Check_Button* o, void*) { if (o->value() == 1) { chkUSEHAMLIB->value(0); btn_fldigi_client_to_flrig->value(0); progdefaults.chkUSERIGCATis = true; progdefaults.fldigi_client_to_flrig = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); } else { progdefaults.chkUSERIGCATis = false; progdefaults.initInterface(); } progdefaults.changed=true; } Fl_Group *grpRigCAT=(Fl_Group *)0; Fl_Output *txtXmlRigFilename=(Fl_Output *)0; Fl_Button *btnSelectRigXmlFile=(Fl_Button *)0; static void cb_btnSelectRigXmlFile(Fl_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); selectRigXmlFilename(); } Fl_ComboBox *inpXmlRigDevice=(Fl_ComboBox *)0; static void cb_inpXmlRigDevice(Fl_ComboBox*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Value_Input2 *cntRigCatRetries=(Fl_Value_Input2 *)0; static void cb_cntRigCatRetries(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Value_Input2 *cntRigCatTimeout=(Fl_Value_Input2 *)0; static void cb_cntRigCatTimeout(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Value_Input2 *cntRigCatWait=(Fl_Value_Input2 *)0; static void cb_cntRigCatWait(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_ListBox *listbox_xml_rig_baudrate=(Fl_ListBox *)0; static void cb_listbox_xml_rig_baudrate(Fl_ListBox*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Counter2 *valRigCatStopbits=(Fl_Counter2 *)0; static void cb_valRigCatStopbits(Fl_Counter2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); } Fl_Button *btnInitRIGCAT=(Fl_Button *)0; static void cb_btnInitRIGCAT(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } Fl_Check_Button *btnRigCatEcho=(Fl_Check_Button *)0; static void cb_btnRigCatEcho(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); progdefaults.changed = true; } Fl_Round_Button *btnRigCatCMDptt=(Fl_Round_Button *)0; static void cb_btnRigCatCMDptt(Fl_Round_Button* o, void*) { if (o->value()== 1) { btnRigCatRTSptt->value(0); btnRigCatDTRptt->value(0); progdefaults.RigCatCMDptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatCMDptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw(); } Fl_Round_Button *btnRigCatRTSptt=(Fl_Round_Button *)0; static void cb_btnRigCatRTSptt(Fl_Round_Button* o, void*) { if (o->value() == 1) { btnRigCatCMDptt->value(0); progdefaults.RigCatRTSptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatRTSptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Round_Button *btnRigCatDTRptt=(Fl_Round_Button *)0; static void cb_btnRigCatDTRptt(Fl_Round_Button* o, void*) { if (o->value() == 1) { btnRigCatCMDptt->value(0); progdefaults.RigCatDTRptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; } else progdefaults.RigCatDTRptt = false; btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *btnRigCatRTSplus=(Fl_Check_Button *)0; static void cb_btnRigCatRTSplus(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *btnRigCatDTRplus=(Fl_Check_Button *)0; static void cb_btnRigCatDTRplus(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *chkRigCatRTSCTSflow=(Fl_Check_Button *)0; static void cb_chkRigCatRTSCTSflow(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *chk_restore_tio=(Fl_Check_Button *)0; static void cb_chk_restore_tio(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Check_Button *chkRigCatVSP=(Fl_Check_Button *)0; static void cb_chkRigCatVSP(Fl_Check_Button*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Value_Input2 *cntRigCatInitDelay=(Fl_Value_Input2 *)0; static void cb_cntRigCatInitDelay(Fl_Value_Input2*, void*) { btnInitRIGCAT->labelcolor(FL_RED); btnInitRIGCAT->redraw_label(); } Fl_Group *grpRigGPIO=(Fl_Group *)0; Fl_Check_Button *btn_gpio_ptt2=(Fl_Check_Button *)0; static void cb_btn_gpio_ptt2(Fl_Check_Button* o, void*) { btnTTYptt->value(0); btnUsePPortPTT->value(0); btn_gpio_ptt->value(o->value()); if (o->value()) { progdefaults.gpio_ptt = true; progdefaults.UseUHrouterPTT = progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.gpio_ptt = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT2->labelcolor(FL_RED); btnInitHWPTT->redraw(); btnInitHWPTT2->redraw(); progdefaults.changed = true; } Fl_Button *btnInitHWPTT2=(Fl_Button *)0; static void cb_btnInitHWPTT2(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); o->redraw(); btnInitHWPTT->labelcolor(FL_FOREGROUND_COLOR); btnInitHWPTT2->redraw(); progdefaults.changed = true; } static void cb_btn_enable_gpio(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= 1; export_gpio(0); } else { progdefaults.enable_gpio &= ~1; unexport_gpio(0); } progdefaults.changed = true; } static void cb_btn_enable_gpio1(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<1); export_gpio(1); } else { progdefaults.enable_gpio &= ~(1<<1); unexport_gpio(1); } progdefaults.changed = true; } static void cb_btn_enable_gpio2(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<2); export_gpio(2); } else { progdefaults.enable_gpio &= ~(1<<2); unexport_gpio(2); } progdefaults.changed = true; } static void cb_btn_enable_gpio3(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<3); export_gpio(3); } else { progdefaults.enable_gpio &= ~(1<<3); unexport_gpio(3); } progdefaults.changed = true; } static void cb_btn_enable_gpio4(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<4); export_gpio(4); } else { progdefaults.enable_gpio &= ~(1<<4); unexport_gpio(4); } progdefaults.changed = true; } static void cb_btn_enable_gpio5(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<5); export_gpio(5); } else { progdefaults.enable_gpio &= ~(1<<5); unexport_gpio(5); } progdefaults.changed = true; } static void cb_btn_enable_gpio6(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<6); export_gpio(6); } else { progdefaults.enable_gpio &= ~(1<<6); unexport_gpio(6); } progdefaults.changed = true; } static void cb_btn_enable_gpio7(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<7); export_gpio(7); } else { progdefaults.enable_gpio &= ~(1<<7); unexport_gpio(7); } progdefaults.changed = true; } static void cb_btn_enable_gpio8(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<8); export_gpio(8); } else { progdefaults.enable_gpio &= ~(1<<8); unexport_gpio(8); } progdefaults.changed = true; } static void cb_btn_enable_gpio9(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<9); export_gpio(9); } else { progdefaults.enable_gpio &= ~(1<<9); unexport_gpio(9); } progdefaults.changed = true; } static void cb_btn_enable_gpioa(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<10); export_gpio(10); } else { progdefaults.enable_gpio &= ~(1<<10); unexport_gpio(10); } progdefaults.changed = true; } static void cb_btn_enable_gpiob(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<11); export_gpio(11); } else { progdefaults.enable_gpio &= ~(1<<11); unexport_gpio(11); } progdefaults.changed = true; } static void cb_btn_enable_gpioc(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<12); export_gpio(12); } else { progdefaults.enable_gpio &= ~(1<<12); unexport_gpio(12); } progdefaults.changed = true; } static void cb_btn_enable_gpiod(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<13); export_gpio(13); } else { progdefaults.enable_gpio &= ~(1<<13); unexport_gpio(13); } progdefaults.changed = true; } static void cb_btn_enable_gpioe(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<14); export_gpio(14); } else { progdefaults.enable_gpio &= ~(1<<14); unexport_gpio(14); } progdefaults.changed = true; } static void cb_btn_enable_gpiof(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<15); export_gpio(15); } else { progdefaults.enable_gpio &= ~(1<<15); unexport_gpio(15); } progdefaults.changed = true; } Fl_Check_Button *btn_enable_gpio[17]={(Fl_Check_Button *)0}; static void cb_btn_enable_gpio10(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.enable_gpio |= (1<<16); export_gpio(16); } else { progdefaults.enable_gpio &= ~(1<<16); unexport_gpio(16); } progdefaults.changed = true; } static void cb_btn_gpio_on(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= 1; } else { progdefaults.gpio_on &= ~1; } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on1(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<1); } else { progdefaults.gpio_on &= ~(1<<1); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on2(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<2); } else { progdefaults.gpio_on &= ~(1<<2); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on3(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<3); } else { progdefaults.gpio_on &= ~(1<<3); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on4(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<4); } else { progdefaults.gpio_on &= ~(1<<4); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on5(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<5); } else { progdefaults.gpio_on &= ~(1<<5); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on6(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<6); } else { progdefaults.gpio_on &= ~(1<<6); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on7(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<7); } else { progdefaults.gpio_on &= ~(1<<7); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on8(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<8); } else { progdefaults.gpio_on &= ~(1<<8); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_on9(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<9); } else { progdefaults.gpio_on &= ~(1<<9); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_ona(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<10); } else { progdefaults.gpio_on &= ~(1<<10); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_onb(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<11); } else { progdefaults.gpio_on &= ~(1<<11); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_onc(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<12); } else { progdefaults.gpio_on &= ~(1<<12); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_ond(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<13); } else { progdefaults.gpio_on &= ~(1<<13); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_one(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<14); } else { progdefaults.gpio_on &= ~(1<<14); } wf->xmtrcv->value(0); progdefaults.changed = true; } static void cb_btn_gpio_onf(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<15); } else { progdefaults.gpio_on &= ~(1<<15); } wf->xmtrcv->value(0); progdefaults.changed = true; } Fl_Check_Button *btn_gpio_on[17]={(Fl_Check_Button *)0}; static void cb_btn_gpio_on10(Fl_Check_Button* o, void*) { if (o->value()){ progdefaults.gpio_on |= (1<<16); } else { progdefaults.gpio_on &= ~(1<<16); } wf->xmtrcv->value(0); progdefaults.changed = true; } Fl_Counter *cnt_gpio_pulse_width=(Fl_Counter *)0; static void cb_cnt_gpio_pulse_width(Fl_Counter* o, void*) { progdefaults.gpio_pulse_width=(int)o->value(); progdefaults.changed=true; } Fl_Group *grpRigHamlib=(Fl_Group *)0; Fl_Check_Button *chkUSEHAMLIB=(Fl_Check_Button *)0; static void cb_chkUSEHAMLIB(Fl_Check_Button* o, void*) { progdefaults.chkUSEHAMLIBis = o->value(); if (o->value() == 1) { chkUSERIGCAT->value(0); btn_fldigi_client_to_flrig->value(0); progdefaults.chkUSERIGCATis = false; progdefaults.fldigi_client_to_flrig = false; btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->activate(); btnInitHAMLIB->redraw(); } else { progdefaults.initInterface(); } progdefaults.changed = true; } Fl_Group *grpHamlib=(Fl_Group *)0; Fl_ListBox *cboHamlibRig=(Fl_ListBox *)0; static void cb_cboHamlibRig(Fl_ListBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); #if USE_HAMLIB hamlib_get_defaults(); #endif } Fl_ComboBox *inpRIGdev=(Fl_ComboBox *)0; static void cb_inpRIGdev(Fl_ComboBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Value_Input2 *cntHamlibRetries=(Fl_Value_Input2 *)0; static void cb_cntHamlibRetries(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Value_Input2 *cntHamlibTimeout=(Fl_Value_Input2 *)0; static void cb_cntHamlibTimeout(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Value_Input2 *cntHamlibWriteDelay=(Fl_Value_Input2 *)0; static void cb_cntHamlibWriteDelay(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Value_Input2 *cntHamlibWait=(Fl_Value_Input2 *)0; static void cb_cntHamlibWait(Fl_Value_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_ListBox *listbox_baudrate=(Fl_ListBox *)0; static void cb_listbox_baudrate(Fl_ListBox*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Counter2 *valHamRigStopbits=(Fl_Counter2 *)0; static void cb_valHamRigStopbits(Fl_Counter2* o, void*) { progdefaults.HamRigStopbits = (int)o->value(); progdefaults.changed = true; } Fl_Counter2 *valHamRigPollrate=(Fl_Counter2 *)0; static void cb_valHamRigPollrate(Fl_Counter2* o, void*) { progdefaults.HamRigPollrate = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnHamlibCMDptt=(Fl_Check_Button *)0; static void cb_btnHamlibCMDptt(Fl_Check_Button* o, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); if (o->value()) { progdefaults.HamlibCMDptt = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = false; } else progdefaults.HamlibCMDptt = false; progdefaults.changed = true; } Fl_Check_Button *btnHamlibPTT_ON_DATA=(Fl_Check_Button *)0; static void cb_btnHamlibPTT_ON_DATA(Fl_Check_Button* o, void*) { progdefaults.hamlib_ptt_on_data = o->value(); } Fl_Check_Button *btnHamlibDTRplus=(Fl_Check_Button *)0; static void cb_btnHamlibDTRplus(Fl_Check_Button*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Check_Button *chkHamlibRTSplus=(Fl_Check_Button *)0; static void cb_chkHamlibRTSplus(Fl_Check_Button* o, void*) { if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Check_Button *chkHamlibRTSCTSflow=(Fl_Check_Button *)0; static void cb_chkHamlibRTSCTSflow(Fl_Check_Button* o, void*) { if (o->value() == 1) { chkHamlibXONXOFFflow->value(0); chkHamlibRTSplus->deactivate(); } else chkHamlibRTSplus->activate(); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Check_Button *chkHamlibXONXOFFflow=(Fl_Check_Button *)0; static void cb_chkHamlibXONXOFFflow(Fl_Check_Button* o, void*) { if (o->value() == 1) chkHamlibRTSCTSflow->value(0); btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Check_Button *chk_hamlib_cw_is_lsb=(Fl_Check_Button *)0; static void cb_chk_hamlib_cw_is_lsb(Fl_Check_Button* o, void*) { progdefaults.hamlib_cw_islsb = o->value(); } Fl_Check_Button *chk_hamlib_rtty_is_usb=(Fl_Check_Button *)0; static void cb_chk_hamlib_rtty_is_usb(Fl_Check_Button* o, void*) { progdefaults.hamlib_rtty_isusb = o->value(); } Fl_Counter2 *val_hamlib_mode_delay=(Fl_Counter2 *)0; static void cb_val_hamlib_mode_delay(Fl_Counter2* o, void*) { progdefaults.hamlib_mode_delay = (int)o->value(); progdefaults.changed = true; } Fl_ListBox *listbox_sideband=(Fl_ListBox *)0; Fl_Input2 *inpHamlibConfig=(Fl_Input2 *)0; static void cb_inpHamlibConfig(Fl_Input2*, void*) { btnInitHAMLIB->labelcolor(FL_RED); btnInitHAMLIB->redraw_label(); } Fl_Button *btnInitHAMLIB=(Fl_Button *)0; static void cb_btnInitHAMLIB(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } Fl_Button *btn_hamlib_get_defaults=(Fl_Button *)0; static void cb_btn_hamlib_get_defaults(Fl_Button*, void*) { #if USE_HAMLIB hamlib_get_defaults(); #endif } Fl_Group *grpRigHardware=(Fl_Group *)0; Fl_Check_Button *btnPTTrightchannel=(Fl_Check_Button *)0; static void cb_btnPTTrightchannel(Fl_Check_Button* o, void*) { progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel2->value(o->value()); if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); } progdefaults.changed = true; } Fl_Round_Button *btnTTYptt=(Fl_Round_Button *)0; static void cb_btnTTYptt(Fl_Round_Button* o, void*) { btnUsePPortPTT->value(0); btnUseUHrouterPTT->value(0); btn_gpio_ptt->value(0); if (o->value()) { progdefaults.TTYptt = true; progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.gpio_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.TTYptt = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_ComboBox *inpTTYdev=(Fl_ComboBox *)0; static void cb_inpTTYdev(Fl_ComboBox* o, void*) { progdefaults.PTTdev = o->value(); btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnSCU_17=(Fl_Round_Button *)0; static void cb_btnSCU_17(Fl_Round_Button* o, void*) { progdefaults.SCU_17=o->value(); progdefaults.changed = true; } Fl_Round_Button *btnUsePPortPTT=(Fl_Round_Button *)0; static void cb_btnUsePPortPTT(Fl_Round_Button* o, void*) { btnTTYptt->value(0); btnUseUHrouterPTT->value(0); btn_gpio_ptt->value(0); if (o->value()) { progdefaults.UsePPortPTT = true; progdefaults.TTYptt = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.gpio_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.UsePPortPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnUseUHrouterPTT=(Fl_Round_Button *)0; static void cb_btnUseUHrouterPTT(Fl_Round_Button* o, void*) { btnTTYptt->value(0); btnUsePPortPTT->value(0); btn_gpio_ptt->value(0); if (o->value()) { progdefaults.UseUHrouterPTT = true; progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.gpio_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.UseUHrouterPTT = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnRTSptt=(Fl_Round_Button *)0; static void cb_btnRTSptt(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnRTSplusV=(Fl_Round_Button *)0; static void cb_btnRTSplusV(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnDTRptt=(Fl_Round_Button *)0; static void cb_btnDTRptt(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Round_Button *btnDTRplusV=(Fl_Round_Button *)0; static void cb_btnDTRplusV(Fl_Round_Button*, void*) { btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT->redraw(); progdefaults.changed = true; } Fl_Check_Button *btn_gpio_ptt=(Fl_Check_Button *)0; static void cb_btn_gpio_ptt(Fl_Check_Button* o, void*) { btnTTYptt->value(0); btnUsePPortPTT->value(0); btn_gpio_ptt2->value(o->value()); if (o->value()) { progdefaults.gpio_ptt = true; progdefaults.UseUHrouterPTT = progdefaults.TTYptt = progdefaults.UsePPortPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.cmedia_ptt = progdefaults.HamlibCMDptt = false; } else progdefaults.gpio_ptt = false; btnInitHWPTT->labelcolor(FL_RED); btnInitHWPTT2->labelcolor(FL_RED); btnInitHWPTT->redraw(); btnInitHWPTT2->redraw(); progdefaults.changed = true; } Fl_Button *btnInitHWPTT=(Fl_Button *)0; static void cb_btnInitHWPTT(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); o->redraw(); btnInitHWPTT2->labelcolor(FL_FOREGROUND_COLOR); btnInitHWPTT2->redraw(); progdefaults.changed = true; } Fl_Group *grpPTTdelays=(Fl_Group *)0; Fl_Counter *cntPTT_on_delay=(Fl_Counter *)0; static void cb_cntPTT_on_delay(Fl_Counter* o, void*) { progdefaults.PTT_on_delay = o->value(); progdefaults.changed = true; } Fl_Counter *cntPTT_off_delay=(Fl_Counter *)0; static void cb_cntPTT_off_delay(Fl_Counter* o, void*) { progdefaults.PTT_off_delay = o->value(); progdefaults.changed = true; } Fl_Group *grp_cmedia_ptt=(Fl_Group *)0; Fl_Round_Button *btn_use_cmedia_PTT=(Fl_Round_Button *)0; static void cb_btn_use_cmedia_PTT(Fl_Round_Button* o, void*) { if (o->value()) { progdefaults.cmedia_ptt = true; progdefaults.UsePPortPTT = progdefaults.UseUHrouterPTT = progdefaults.RigCatRTSptt = progdefaults.RigCatDTRptt = progdefaults.RigCatCMDptt = progdefaults.HamlibCMDptt = false; btn_init_cmedia_PTT->labelcolor(FL_RED); btn_init_cmedia_PTT->redraw(); } else { progdefaults.cmedia_ptt = false; close_cmedia(); } progdefaults.changed = true; } Fl_ComboBox *inp_cmedia_dev=(Fl_ComboBox *)0; static void cb_inp_cmedia_dev(Fl_ComboBox* o, void*) { close_cmedia(); progdefaults.cmedia_device = o->value(); btn_init_cmedia_PTT->labelcolor(FL_RED); btn_init_cmedia_PTT->redraw(); progdefaults.changed = true; } Fl_ComboBox *inp_cmedia_GPIO_line=(Fl_ComboBox *)0; static void cb_inp_cmedia_GPIO_line(Fl_ComboBox* o, void*) { progdefaults.cmedia_gpio_line = o->value(); } Fl_Button *btn_init_cmedia_PTT=(Fl_Button *)0; static void cb_btn_init_cmedia_PTT(Fl_Button* o, void*) { progdefaults.initInterface(); o->labelcolor(FL_FOREGROUND_COLOR); progdefaults.changed = true; } Fl_Button *btn_test_cmedia=(Fl_Button *)0; static void cb_btn_test_cmedia(Fl_Button*, void*) { test_hid_ptt(); } Fl_File_Input *inp_wav_fname_regex=(Fl_File_Input *)0; Fl_Button *btn_select_regex_wav=(Fl_Button *)0; static void cb_btn_select_regex_wav(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.{mp3,wav}\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BWSR_REGEX_MATCH = fnfc.filename(); inp_wav_fname_regex->value(progdefaults.BWSR_REGEX_MATCH.c_str()); progdefaults.REGEX_ALERT_MENU = 0; mnu_regex_alert_menu->value(progdefaults.REGEX_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_regex_alert_menu=(Fl_Choice *)0; static void cb_mnu_regex_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BWSR_REGEX_MATCH = "bark"; break; case 2 : progdefaults.BWSR_REGEX_MATCH = "checkout"; break; case 3 : progdefaults.BWSR_REGEX_MATCH = "diesel"; break; case 4 : progdefaults.BWSR_REGEX_MATCH = "steam_train"; break; case 5 : progdefaults.BWSR_REGEX_MATCH = "doesnot"; break; case 6 : progdefaults.BWSR_REGEX_MATCH = "beeboo"; break; case 7 : progdefaults.BWSR_REGEX_MATCH = "phone"; break; case 8 : progdefaults.BWSR_REGEX_MATCH = "dinner_bell"; break; case 9 : progdefaults.BWSR_REGEX_MATCH = "rtty_bell"; break; case 10 : progdefaults.BWSR_REGEX_MATCH = "standard_tone"; break; } inp_wav_fname_regex->value(progdefaults.BWSR_REGEX_MATCH.c_str()); } progdefaults.REGEX_ALERT_MENU = o->value(); } Fl_Check_Button *btn_enable_regex_match_wa=(Fl_Check_Button *)0; static void cb_btn_enable_regex_match_wa(Fl_Check_Button* o, void*) { progdefaults.ENABLE_BWSR_REGEX_MATCH=o->value(); } Fl_Button *btn_test_regex_wav=(Fl_Button *)0; static void cb_btn_test_regex_wav(Fl_Button*, void*) { audio_alert->alert(progdefaults.BWSR_REGEX_MATCH.c_str()); } Fl_File_Input *inp_wav_fname_mycall=(Fl_File_Input *)0; Fl_Button *btn_select_mycall_wav=(Fl_Button *)0; static void cb_btn_select_mycall_wav(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.{mp3,wav}\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.BWSR_MYCALL_MATCH = fnfc.filename(); inp_wav_fname_mycall->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); progdefaults.MYCALL_ALERT_MENU = 0; mnu_mycall_alert_menu->value(progdefaults.MYCALL_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_mycall_alert_menu=(Fl_Choice *)0; static void cb_mnu_mycall_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.BWSR_MYCALL_MATCH = "bark"; break; case 2 : progdefaults.BWSR_MYCALL_MATCH = "checkout"; break; case 3 : progdefaults.BWSR_MYCALL_MATCH = "diesel"; break; case 4 : progdefaults.BWSR_MYCALL_MATCH = "steam_train"; break; case 5 : progdefaults.BWSR_MYCALL_MATCH = "doesnot"; break; case 6 : progdefaults.BWSR_MYCALL_MATCH = "beeboo"; break; case 7 : progdefaults.BWSR_MYCALL_MATCH = "phone"; break; case 8 : progdefaults.BWSR_MYCALL_MATCH = "dinner_bell"; break; case 9 : progdefaults.BWSR_MYCALL_MATCH = "rtty_bell"; break; case 10 : progdefaults.BWSR_MYCALL_MATCH = "standard_tone"; break; } inp_wav_fname_mycall->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); } progdefaults.MYCALL_ALERT_MENU = o->value(); } Fl_Check_Button *btn_enable_mycall_match_wav=(Fl_Check_Button *)0; static void cb_btn_enable_mycall_match_wav(Fl_Check_Button* o, void*) { progdefaults.ENABLE_BWSR_MYCALL_MATCH=o->value(); } Fl_Button *btn_test_mycall_wav=(Fl_Button *)0; static void cb_btn_test_mycall_wav(Fl_Button*, void*) { audio_alert->alert(progdefaults.BWSR_MYCALL_MATCH.c_str()); } Fl_File_Input *inp_wav_fname_rsid=(Fl_File_Input *)0; Fl_Button *btn_select_rsid_wav=(Fl_Button *)0; static void cb_btn_select_rsid_wav(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.{mp3,wav}\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RSID_MATCH = fnfc.filename(); inp_wav_fname_rsid->value(progdefaults.RSID_MATCH.c_str()); progdefaults.RSID_ALERT_MENU = 0; mnu_rsid_alert_menu->value(progdefaults.RSID_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_rsid_alert_menu=(Fl_Choice *)0; static void cb_mnu_rsid_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RSID_MATCH = "bark"; break; case 2 : progdefaults.RSID_MATCH = "checkout"; break; case 3 : progdefaults.RSID_MATCH = "diesel"; break; case 4 : progdefaults.RSID_MATCH = "steam_train"; break; case 5 : progdefaults.RSID_MATCH = "doesnot"; break; case 6 : progdefaults.RSID_MATCH = "beeboo"; break; case 7 : progdefaults.RSID_MATCH = "phone"; break; case 8 : progdefaults.RSID_MATCH = "dinner_bell"; break; case 9 : progdefaults.RSID_MATCH = "rtty_bell"; break; case 10 : progdefaults.RSID_MATCH = "standard_tone"; break; } inp_wav_fname_rsid->value(progdefaults.RSID_MATCH.c_str()); } progdefaults.RSID_ALERT_MENU = o->value(); } Fl_Check_Button *btn_enable_rsid_match_wav=(Fl_Check_Button *)0; static void cb_btn_enable_rsid_match_wav(Fl_Check_Button* o, void*) { progdefaults.ENABLE_RSID_MATCH=o->value(); } Fl_Button *btn_test_rsid_wav=(Fl_Button *)0; static void cb_btn_test_rsid_wav(Fl_Button*, void*) { audio_alert->alert(progdefaults.RSID_MATCH.c_str()); } Fl_File_Input *inp_wav_flmsg_rcvd=(Fl_File_Input *)0; Fl_Button *btn_select_rx_extract_msg=(Fl_Button *)0; static void cb_btn_select_rx_extract_msg(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.{mp3,wav}\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RX_EXTRACT_MSG_RCVD = fnfc.filename(); inp_wav_flmsg_rcvd->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); progdefaults.RX_EXTRACT_ALERT_MENU = 0; mnu_rx_extract_alert_menu->value(progdefaults.RX_EXTRACT_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_rx_extract_alert_menu=(Fl_Choice *)0; static void cb_mnu_rx_extract_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RX_EXTRACT_MSG_RCVD = "bark"; break; case 2 : progdefaults.RX_EXTRACT_MSG_RCVD = "checkout"; break; case 3 : progdefaults.RX_EXTRACT_MSG_RCVD = "diesel"; break; case 4 : progdefaults.RX_EXTRACT_MSG_RCVD = "steam_train"; break; case 5 : progdefaults.RX_EXTRACT_MSG_RCVD = "doesnot"; break; case 6 : progdefaults.RX_EXTRACT_MSG_RCVD = "beeboo"; break; case 7 : progdefaults.RX_EXTRACT_MSG_RCVD = "phone"; break; case 8 : progdefaults.RX_EXTRACT_MSG_RCVD = "dinner_bell"; break; case 9 : progdefaults.RX_EXTRACT_MSG_RCVD = "rtty_bell"; break; case 10 : progdefaults.RX_EXTRACT_MSG_RCVD = "standard_tone"; break; } inp_wav_flmsg_rcvd->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); } progdefaults.RX_EXTRACT_ALERT_MENU = o->value(); } Fl_Check_Button *btn_enable_flmsg_wav=(Fl_Check_Button *)0; static void cb_btn_enable_flmsg_wav(Fl_Check_Button* o, void*) { progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD=o->value(); } Fl_Button *btn_test_flmsg_extract_wav=(Fl_Button *)0; static void cb_btn_test_flmsg_extract_wav(Fl_Button*, void*) { audio_alert->alert(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); } Fl_File_Input *inp_wav_flmsg_timed_out=(Fl_File_Input *)0; Fl_Button *btn_select_rx_extract_timed_out=(Fl_Button *)0; static void cb_btn_select_rx_extract_timed_out(Fl_Button*, void*) { Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("wav files\t*.{mp3,wav}\n"); fnfc.directory("./"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: break; // ERROR case 1: break; // CANCEL default: { progdefaults.RX_EXTRACT_TIMED_OUT = fnfc.filename(); inp_wav_flmsg_timed_out->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); progdefaults.TIMED_OUT_ALERT_MENU = 0; mnu_rx_timed_out_alert_menu->value(progdefaults.TIMED_OUT_ALERT_MENU); break; // FILE CHOSEN } }; } Fl_Choice *mnu_rx_timed_out_alert_menu=(Fl_Choice *)0; static void cb_mnu_rx_timed_out_alert_menu(Fl_Choice* o, void*) { if (o->value() > 0) { switch (o->value()) { case 1 : progdefaults.RX_EXTRACT_TIMED_OUT = "bark"; break; case 2 : progdefaults.RX_EXTRACT_TIMED_OUT = "checkout"; break; case 3 : progdefaults.RX_EXTRACT_TIMED_OUT = "diesel"; break; case 4 : progdefaults.RX_EXTRACT_TIMED_OUT = "steam_train"; break; case 5 : progdefaults.RX_EXTRACT_TIMED_OUT = "doesnot"; break; case 6 : progdefaults.RX_EXTRACT_TIMED_OUT = "beeboo"; break; case 7 : progdefaults.RX_EXTRACT_TIMED_OUT = "phone"; break; case 8 : progdefaults.RX_EXTRACT_TIMED_OUT = "dinner_bell"; break; case 9 : progdefaults.RX_EXTRACT_TIMED_OUT = "rtty_bell"; break; case 10 : progdefaults.RX_EXTRACT_TIMED_OUT = "standard_tone"; break; } inp_wav_flmsg_timed_out->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); } progdefaults.TIMED_OUT_ALERT_MENU = o->value(); } Fl_Button *btn_test_rx_extract_timed_out=(Fl_Button *)0; static void cb_btn_test_rx_extract_timed_out(Fl_Button*, void*) { audio_alert->alert(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); } Fl_Check_Button *btn_enable_flmsg_time_out_wav=(Fl_Check_Button *)0; static void cb_btn_enable_flmsg_time_out_wav(Fl_Check_Button* o, void*) { progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT=o->value(); } Fl_Value_Slider2 *sldrAlertVolume=(Fl_Value_Slider2 *)0; static void cb_sldrAlertVolume(Fl_Value_Slider2* o, void*) { progdefaults.alert_volume = (int)o->value(); progdefaults.changed = true; } Fl_Group *grpSoundDevices=(Fl_Group *)0; Fl_Group *AudioOSS=(Fl_Group *)0; static void cb_btnAudioIO(Fl_Round_Button*, void*) { sound_update(SND_IDX_OSS); progdefaults.changed = true; resetSoundCard(); } Fl_Input_Choice *menuOSSDev=(Fl_Input_Choice *)0; static void cb_menuOSSDev(Fl_Input_Choice* o, void*) { scDevice[0] = scDevice[1] = progdefaults.OSSdevice = o->value(); resetSoundCard(); progdefaults.changed = true; } Fl_Group *AudioPort=(Fl_Group *)0; static void cb_btnAudioIO1(Fl_Round_Button*, void*) { sound_update(SND_IDX_PORT); progdefaults.changed = true; resetSoundCard(); } Fl_Choice *menuPortInDev=(Fl_Choice *)0; static void cb_menuPortInDev(Fl_Choice* o, void*) { scDevice[0] = progdefaults.PortInDevice = o->text(); progdefaults.PortInIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true; } Fl_Choice *menuPortOutDev=(Fl_Choice *)0; static void cb_menuPortOutDev(Fl_Choice* o, void*) { scDevice[1] = progdefaults.PortOutDevice = o->text(); progdefaults.PortOutIndex = reinterpret_cast(o->mvalue()->user_data()); resetSoundCard(); progdefaults.changed = true; } Fl_Group *AudioPulse=(Fl_Group *)0; static void cb_btnAudioIO2(Fl_Round_Button*, void*) { sound_update(SND_IDX_PULSE); progdefaults.changed = true; resetSoundCard(); } Fl_Input2 *inpPulseServer=(Fl_Input2 *)0; static void cb_inpPulseServer(Fl_Input2* o, void*) { scDevice[0] = scDevice[1] = progdefaults.PulseServer = o->value(); resetSoundCard(); progdefaults.changed = true; } Fl_Group *AudioNull=(Fl_Group *)0; Fl_Round_Button *btnAudioIO[4]={(Fl_Round_Button *)0}; static void cb_btnAudioIO3(Fl_Round_Button*, void*) { sound_update(SND_IDX_NULL); progdefaults.changed = true; resetSoundCard(); } Fl_Group *AudioDuplex=(Fl_Group *)0; Fl_Round_Button *btn_is_full_duplex=(Fl_Round_Button *)0; static void cb_btn_is_full_duplex(Fl_Round_Button* o, void*) { progdefaults.is_full_duplex = o->value(); progdefaults.changed = true; resetSoundCard(); } Fl_Group *AudioAlerts=(Fl_Group *)0; Fl_Choice *menuAlertsDev=(Fl_Choice *)0; static void cb_menuAlertsDev(Fl_Choice* o, void*) { progdefaults.AlertDevice = o->text(); progdefaults.AlertIndex = reinterpret_cast(o->mvalue()->user_data()); progdefaults.changed = true; } Fl_Round_Button *btn_enable_audio_alerts=(Fl_Round_Button *)0; static void cb_btn_enable_audio_alerts(Fl_Round_Button* o, void*) { progdefaults.enable_audio_alerts = o->value(); progdefaults.changed = true; reset_audio_alerts(); } Fl_Check_Button *chkAudioStereoOut=(Fl_Check_Button *)0; static void cb_chkAudioStereoOut(Fl_Check_Button* o, void*) { progdefaults.sig_on_right_channel = o->value(); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }; } Fl_Check_Button *chkReverseAudio=(Fl_Check_Button *)0; static void cb_chkReverseAudio(Fl_Check_Button* o, void*) { progdefaults.ReverseAudio = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnPTTrightchannel2=(Fl_Check_Button *)0; static void cb_btnPTTrightchannel2(Fl_Check_Button* o, void*) { progdefaults.PTTrightchannel = o->value(); btnPTTrightchannel->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.QSK = false; btnQSK->value(0); btnQSK2->value(0); progdefaults.PseudoFSK = false; chkPseudoFSK->value(0); chkPseudoFSK2->value(0); progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); }; } Fl_Check_Button *btnQSK2=(Fl_Check_Button *)0; static void cb_btnQSK2(Fl_Check_Button* o, void*) { progdefaults.QSK = o->value(); btnQSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }; } Fl_Check_Button *chkPseudoFSK2=(Fl_Check_Button *)0; static void cb_chkPseudoFSK2(Fl_Check_Button* o, void*) { progdefaults.PseudoFSK = o->value(); chkPseudoFSK->value(o->value()); progdefaults.changed = true; if (o->value()) { progdefaults.sig_on_right_channel = false; chkAudioStereoOut->value(0); progdefaults.PTTrightchannel = false; btnPTTrightchannel->value(0); btnPTTrightchannel2->value(0); }; } Fl_Check_Button *chkReverseRxAudio=(Fl_Check_Button *)0; static void cb_chkReverseRxAudio(Fl_Check_Button* o, void*) { progdefaults.ReverseRxAudio = o->value(); progdefaults.changed = true; } Fl_Group *grpAudioSampleRate=(Fl_Group *)0; Fl_ListBox *menuInSampleRate=(Fl_ListBox *)0; static void cb_menuInSampleRate(Fl_ListBox* o, void*) { progdefaults.in_sample_rate = o->index() > 1 ? strtol(o->value(), 0, 10) : o->index(); resetSoundCard(); progdefaults.changed = true; } Fl_ListBox *menuOutSampleRate=(Fl_ListBox *)0; static void cb_menuOutSampleRate(Fl_ListBox* o, void*) { progdefaults.out_sample_rate = o->index() > 1 ? strtol(o->value(), 0, 10) : o->index(); resetSoundCard(); progdefaults.changed = true; } Fl_ListBox *menuSampleConverter=(Fl_ListBox *)0; static void cb_menuSampleConverter(Fl_ListBox* o, void*) { if ((o->index()) == FLDIGI_SRC_BEST) fl_alert2("The best quality SINC interpolator has very high CPU overhead"); progdefaults.sample_converter = sample_rate_converters[o->index()]; resetSoundCard(); progdefaults.changed = true; o->tooltip(src_get_description(progdefaults.sample_converter)); } Fl_Spinner2 *cntRxRateCorr=(Fl_Spinner2 *)0; static void cb_cntRxRateCorr(Fl_Spinner2* o, void*) { progdefaults.RX_corr = (int)o->value(); cnt_fmt_rx_ppm->value(progdefaults.RX_corr); progdefaults.changed = true; } Fl_Spinner2 *cntTxRateCorr=(Fl_Spinner2 *)0; static void cb_cntTxRateCorr(Fl_Spinner2* o, void*) { progdefaults.TX_corr = (int)o->value(); progdefaults.changed = true; } Fl_Spinner2 *cntTxOffset=(Fl_Spinner2 *)0; static void cb_cntTxOffset(Fl_Spinner2* o, void*) { progdefaults.TxOffset = (int)o->value(); progdefaults.changed = true; } Fl_Button *bnt_dec_rit=(Fl_Button *)0; static void cb_bnt_dec_rit(Fl_Button* o, void*) { progdefaults.RIT -= 0.1; cntRIT->value(progdefaults.RIT); progdefaults.FMT_freq_corr=o->value(); cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr); progdefaults.changed = true; } Fl_Counter *cntRIT=(Fl_Counter *)0; static void cb_cntRIT(Fl_Counter* o, void*) { progdefaults.RIT=o->value(); progdefaults.FMT_freq_corr=o->value(); cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr); } Fl_Button *btn_incr_rit=(Fl_Button *)0; static void cb_btn_incr_rit(Fl_Button* o, void*) { progdefaults.RIT += 0.1; cntRIT->value(progdefaults.RIT); progdefaults.FMT_freq_corr=o->value(); cnt_fmt_freq_corr->value(progdefaults.FMT_freq_corr); progdefaults.changed = true; } Fl_Box *lowcolor2=(Fl_Box *)0; Fl_Button *btnLowSignal2=(Fl_Button *)0; static void cb_btnLowSignal2(Fl_Button*, void*) { progdefaults.LowSignal = fl_show_colormap(progdefaults.LowSignal); lowcolor->color(progdefaults.LowSignal); lowcolor->redraw(); lowcolor2->color(progdefaults.LowSignal); lowcolor2->redraw(); progdefaults.changed = true; } Fl_Box *normalcolor2=(Fl_Box *)0; Fl_Counter *cnt_normal_signal_level2=(Fl_Counter *)0; static void cb_cnt_normal_signal_level2(Fl_Counter* o, void*) { progdefaults.normal_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level); cnt_normal_signal_level2->value(progdefaults.normal_signal_level); cnt_high_signal_level2->value(progdefaults.high_signal_level); cnt_over_signal_level2->value(progdefaults.over_signal_level); } Fl_Button *btnNormalSignal2=(Fl_Button *)0; static void cb_btnNormalSignal2(Fl_Button*, void*) { progdefaults.NormSignal = fl_show_colormap(progdefaults.NormSignal); normalcolor->color(progdefaults.NormSignal); normalcolor->redraw(); normalcolor2->color(progdefaults.NormSignal); normalcolor2->redraw(); progdefaults.changed = true; } Fl_Box *highcolor2=(Fl_Box *)0; Fl_Counter *cnt_high_signal_level2=(Fl_Counter *)0; static void cb_cnt_high_signal_level2(Fl_Counter* o, void*) { progdefaults.high_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level); cnt_normal_signal_level2->value(progdefaults.normal_signal_level); cnt_high_signal_level2->value(progdefaults.high_signal_level); cnt_over_signal_level2->value(progdefaults.over_signal_level); } Fl_Button *btnHighSignal2=(Fl_Button *)0; static void cb_btnHighSignal2(Fl_Button*, void*) { progdefaults.HighSignal = fl_show_colormap(progdefaults.HighSignal); highcolor->color(progdefaults.HighSignal); highcolor->redraw(); highcolor2->color(progdefaults.HighSignal); highcolor2->redraw(); progdefaults.changed = true; } Fl_Box *overcolor2=(Fl_Box *)0; Fl_Counter *cnt_over_signal_level2=(Fl_Counter *)0; static void cb_cnt_over_signal_level2(Fl_Counter* o, void*) { progdefaults.over_signal_level = o->value(); if (progdefaults.normal_signal_level > progdefaults.high_signal_level) progdefaults.high_signal_level = progdefaults.normal_signal_level + 0.1; if (progdefaults.high_signal_level > progdefaults.over_signal_level) progdefaults.over_signal_level = progdefaults.high_signal_level + 0.1; if (progdefaults.over_signal_level > 0) progdefaults.over_signal_level = 0; cnt_normal_signal_level->value(progdefaults.normal_signal_level); cnt_high_signal_level->value(progdefaults.high_signal_level); cnt_over_signal_level->value(progdefaults.over_signal_level); cnt_normal_signal_level2->value(progdefaults.normal_signal_level); cnt_high_signal_level2->value(progdefaults.high_signal_level); cnt_over_signal_level2->value(progdefaults.over_signal_level); } Fl_Button *btnOverSignal2=(Fl_Button *)0; static void cb_btnOverSignal2(Fl_Button*, void*) { progdefaults.OverSignal = fl_show_colormap(progdefaults.OverSignal); overcolor->color(progdefaults.OverSignal); overcolor->redraw(); overcolor2->color(progdefaults.OverSignal); overcolor2->redraw(); progdefaults.changed = true; } vumeter *sig_vumeter2=(vumeter *)0; Fl_Button *btn_default_signal_levels2=(Fl_Button *)0; static void cb_btn_default_signal_levels2(Fl_Button*, void*) { cnt_normal_signal_level->value( progdefaults.normal_signal_level = -60.0); cnt_high_signal_level->value( progdefaults.high_signal_level = -6.0); cnt_over_signal_level->value( progdefaults.over_signal_level = -3.0); cnt_normal_signal_level2->value(progdefaults.normal_signal_level); cnt_high_signal_level2->value(progdefaults.high_signal_level); cnt_over_signal_level2->value(progdefaults.over_signal_level); } Fl_Check_Button *btn_use_wsjtx_vumeter_scale2=(Fl_Check_Button *)0; static void cb_btn_use_wsjtx_vumeter_scale2(Fl_Check_Button* o, void*) { progdefaults.use_wsjtx_vumeter_scale=o->value(); btn_use_wsjtx_vumeter_scale->value(o->value()); } Fl_ListBox *listbox_wav_samplerate=(Fl_ListBox *)0; static void cb_listbox_wav_samplerate(Fl_ListBox* o, void*) { progdefaults.wavSampleRate = o->index(); progdefaults.changed = true; } Fl_Check_Button *btn_record_both=(Fl_Check_Button *)0; static void cb_btn_record_both(Fl_Check_Button* o, void*) { progdefaults.record_both_channels=o->value(); progdefaults.changed=true; } Fl_Spinner2 *cntChannels=(Fl_Spinner2 *)0; static void cb_cntChannels(Fl_Spinner2* o, void*) { progdefaults.VIEWERchannels = (int)(o->value()); initViewer(); } Fl_Spinner2 *cntTimeout=(Fl_Spinner2 *)0; static void cb_cntTimeout(Fl_Spinner2* o, void*) { progdefaults.VIEWERtimeout = (int)(o->value()); progdefaults.changed = true; } Fl_ListBox *listboxViewerLabel=(Fl_ListBox *)0; static void cb_listboxViewerLabel(Fl_ListBox* o, void*) { progdefaults.VIEWERlabeltype = o->index(); initViewer(); progdefaults.changed = true; } Fl_Button *btnViewerFont=(Fl_Button *)0; static void cb_btnViewerFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.ViewerFontnbr); font_browser->fontSize(progdefaults.ViewerFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); if (font_browser->fixed_width(progdefaults.ViewerFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback(cbViewerFontBrowser); font_browser->show(); } Fl_Check_Button *btnFixedIntervals=(Fl_Check_Button *)0; static void cb_btnFixedIntervals(Fl_Check_Button* o, void*) { progdefaults.VIEWERfixed = o->value(); progdefaults.changed = true; initViewer(); } Fl_Check_Button *btnMarquee=(Fl_Check_Button *)0; static void cb_btnMarquee(Fl_Check_Button* o, void*) { progdefaults.VIEWERmarquee = o->value(); progdefaults.changed = true; initViewer(); } Fl_Check_Button *btnAscend=(Fl_Check_Button *)0; static void cb_btnAscend(Fl_Check_Button* o, void*) { progdefaults.VIEWERascend = o->value(); progdefaults.changed = true; initViewer(); } Fl_Check_Button *btnBrowserHistory=(Fl_Check_Button *)0; static void cb_btnBrowserHistory(Fl_Check_Button* o, void*) { progdefaults.VIEWERhistory = o->value(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_1_color=(Fl_Button *)0; static void cb_bwsrHiLite_1_color(Fl_Button*, void*) { progdefaults.bwsrHiLight1 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight1); bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_2_color=(Fl_Button *)0; static void cb_bwsrHiLite_2_color(Fl_Button*, void*) { progdefaults.bwsrHiLight2 = fl_show_colormap((Fl_Color)progdefaults.bwsrHiLight2); bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_even_lines=(Fl_Button *)0; static void cb_bwsrHiLite_even_lines(Fl_Button*, void*) { progdefaults.bwsrBackgnd2 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd2); bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2); viewer_redraw(); progdefaults.changed = true;; } Fl_Button *bwsrHiLite_odd_lines=(Fl_Button *)0; static void cb_bwsrHiLite_odd_lines(Fl_Button*, void*) { progdefaults.bwsrBackgnd1 = fl_show_colormap((Fl_Color)progdefaults.bwsrBackgnd1); bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrHiLite_select=(Fl_Button *)0; static void cb_bwsrHiLite_select(Fl_Button*, void*) { progdefaults.bwsrSelect = fl_show_colormap((Fl_Color)progdefaults.bwsrSelect); bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect); viewer_redraw(); progdefaults.changed = true; } Fl_Button *bwsrSliderColor=(Fl_Button *)0; static void cb_bwsrSliderColor(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.bwsrSliderColor.R; g = progdefaults.bwsrSliderColor.G; b = progdefaults.bwsrSliderColor.B; if (fl_color_chooser("Slider Color", r, g, b) == 0) return; progdefaults.bwsrSliderColor.R = r; progdefaults.bwsrSliderColor.G = g; progdefaults.bwsrSliderColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true; } Fl_Button *bwsrSldrSelColor=(Fl_Button *)0; static void cb_bwsrSldrSelColor(Fl_Button* o, void*) { uchar r, g, b; r = progdefaults.bwsrSldrSelColor.R; g = progdefaults.bwsrSldrSelColor.G; b = progdefaults.bwsrSldrSelColor.B; if (fl_color_chooser("Button Color", r, g, b) == 0) return; progdefaults.bwsrSldrSelColor.R = r; progdefaults.bwsrSldrSelColor.G = g; progdefaults.bwsrSldrSelColor.B = b; o->color(fl_rgb_color(r,g,b)); o->redraw(); sldrViewerSquelch->selection_color(fl_rgb_color(r,g,b)); sldrViewerSquelch->redraw(); mvsquelch->selection_color(fl_rgb_color(r,g,b)); mvsquelch->redraw(); progdefaults.changed = true; } Fl_Check_Button *btnShowTooltips=(Fl_Check_Button *)0; static void cb_btnShowTooltips(Fl_Check_Button* o, void*) { progdefaults.tooltips = o->value(); Fl_Tooltip::enable(progdefaults.tooltips); progdefaults.changed = true; } Fl_Check_Button *chkMenuIcons=(Fl_Check_Button *)0; static void cb_chkMenuIcons(Fl_Check_Button* o, void*) { progdefaults.menuicons = o->value(); icons::toggle_icon_labels(); progdefaults.changed = true; } Fl_ListBox *listboxScheme=(Fl_ListBox *)0; static void cb_listboxScheme(Fl_ListBox* o, void*) { progdefaults.ui_scheme = o->value(); Fl::scheme(progdefaults.ui_scheme.c_str()); progdefaults.changed = true; } Fl_Button *bVisibleModes=(Fl_Button *)0; static void cb_bVisibleModes(Fl_Button* o, void*) { mode_browser->label(o->label()); mode_browser->callback(toggle_visible_modes); mode_browser->show_(&progdefaults.visible_modes); progdefaults.changed = true; } Fl_ListBox *listbox_language=(Fl_ListBox *)0; static void cb_listbox_language(Fl_ListBox* o, void*) { progdefaults.ui_language = o->index(); progdefaults.changed = true; } Fl_Check_Button *btn_rx_lowercase=(Fl_Check_Button *)0; static void cb_btn_rx_lowercase(Fl_Check_Button* o, void*) { progdefaults.rx_lowercase = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_tx_lowercase=(Fl_Check_Button *)0; static void cb_btn_tx_lowercase(Fl_Check_Button* o, void*) { progdefaults.tx_lowercase = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_save_config_on_exit=(Fl_Check_Button *)0; static void cb_btn_save_config_on_exit(Fl_Check_Button* o, void*) { progdefaults.SaveConfig = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn2_save_macros_on_exit=(Fl_Check_Button *)0; static void cb_btn2_save_macros_on_exit(Fl_Check_Button* o, void*) { btn_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn2NagMe=(Fl_Check_Button *)0; static void cb_btn2NagMe(Fl_Check_Button* o, void*) { btnNagMe->value(o->value()); progdefaults.NagMe=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn2_confirm_exit=(Fl_Check_Button *)0; static void cb_btn2_confirm_exit(Fl_Check_Button* o, void*) { btn2_confirm_exit->value(o->value()); progdefaults.confirmExit=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_check_for_updates=(Fl_Check_Button *)0; static void cb_btn_check_for_updates(Fl_Check_Button* o, void*) { progdefaults.check_for_updates = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_tx_show_timer=(Fl_Check_Button *)0; static void cb_btn_tx_show_timer(Fl_Check_Button* o, void*) { progdefaults.show_tx_timer = o->value(); progdefaults.changed = true; } Fl_Spinner *val_tx_timeout=(Fl_Spinner *)0; static void cb_val_tx_timeout(Fl_Spinner* o, void*) { progdefaults.tx_timeout=o->value(); progdefaults.changed = true; } Fl_Check_Button *btnMacroMouseWheel=(Fl_Check_Button *)0; static void cb_btnMacroMouseWheel(Fl_Check_Button* o, void*) { progdefaults.macro_wheel = o->value(); progdefaults.changed = true; } Fl_Counter *cnt_macro_height=(Fl_Counter *)0; static void cb_cnt_macro_height(Fl_Counter* o, void*) { progdefaults.macro_height = (int)o->value(); progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_0=(Fl_Round_Button *)0; static void cb_btn_scheme_0(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 0; set_macroLabels(); UI_select(); progdefaults.changed = true; } Fl_Round_Button *btn_scheme_1=(Fl_Round_Button *)0; static void cb_btn_scheme_1(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 1; set_macroLabels(); UI_select(); progdefaults.changed = true; } Fl_Round_Button *btn_scheme_2=(Fl_Round_Button *)0; static void cb_btn_scheme_2(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 2; set_macroLabels(); UI_select(); progdefaults.changed = true; } Fl_Round_Button *btn_scheme_3=(Fl_Round_Button *)0; static void cb_btn_scheme_3(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 3; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_4=(Fl_Round_Button *)0; static void cb_btn_scheme_4(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 4; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_5=(Fl_Round_Button *)0; static void cb_btn_scheme_5(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 5; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_6=(Fl_Round_Button *)0; static void cb_btn_scheme_6(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 6; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_7=(Fl_Round_Button *)0; static void cb_btn_scheme_7(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 7; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_8=(Fl_Round_Button *)0; static void cb_btn_scheme_8(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 8; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_9=(Fl_Round_Button *)0; static void cb_btn_scheme_9(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 9; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_10=(Fl_Round_Button *)0; static void cb_btn_scheme_10(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 10; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_11=(Fl_Round_Button *)0; static void cb_btn_scheme_11(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 11; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Round_Button *btn_scheme_12=(Fl_Round_Button *)0; static void cb_btn_scheme_12(Fl_Round_Button*, void*) { progdefaults.mbar_scheme = 12; progdefaults.changed = true; set_macroLabels(); UI_select(); } Fl_Check_Button *btnUseLastMacro=(Fl_Check_Button *)0; static void cb_btnUseLastMacro(Fl_Check_Button* o, void*) { progdefaults.UseLastMacro = o->value(); update_main_title(); progdefaults.changed = true; } Fl_Check_Button *btnDisplayMacroFilename=(Fl_Check_Button *)0; static void cb_btnDisplayMacroFilename(Fl_Check_Button* o, void*) { progdefaults.DisplayMacroFilename = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_save_macros_on_exit=(Fl_Check_Button *)0; static void cb_btn_save_macros_on_exit(Fl_Check_Button* o, void*) { btn2_save_macros_on_exit->value(o->value()); progdefaults.SaveMacros = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_macro_post=(Fl_Check_Button *)0; static void cb_btn_macro_post(Fl_Check_Button* o, void*) { progdefaults.macro_post = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_4bar_position=(Fl_Check_Button *)0; static void cb_btn_4bar_position(Fl_Check_Button* o, void*) { progdefaults.four_bar_position = o->value(); UI_select(); progdefaults.changed = true; } Fl_Check_Button *btnRXClicks=(Fl_Check_Button *)0; static void cb_btnRXClicks(Fl_Check_Button* o, void*) { progdefaults.rxtext_clicks_qso_data = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnRXTooltips=(Fl_Check_Button *)0; static void cb_btnRXTooltips(Fl_Check_Button* o, void*) { progdefaults.rxtext_tooltips = o->value(); progdefaults.changed = true; } Fl_Input2 *inpNonword=(Fl_Input2 *)0; static void cb_inpNonword(Fl_Input2* o, void*) { progdefaults.nonwordchars = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUSunits=(Fl_Check_Button *)0; static void cb_btnUSunits(Fl_Check_Button* o, void*) { progdefaults.us_units = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_clear_fields=(Fl_Check_Button *)0; static void cb_btn_clear_fields(Fl_Check_Button* o, void*) { progdefaults.clear_fields=o->value(); progdefaults.changed = true; } Fl_Choice *sel_lsd=(Fl_Choice *)0; static void cb_sel_lsd(Fl_Choice* o, void*) { progdefaults.sel_lsd = o->value(); set_freq_control_lsd(); progdefaults.changed = true; } Fl_Check_Button *btn_rxtx_swap=(Fl_Check_Button *)0; static void cb_btn_rxtx_swap(Fl_Check_Button* o, void*) { progdefaults.rxtx_swap = o->value(); progdefaults.changed = true; UI_select(); } Fl_Check_Button *btnWF_UIrev=(Fl_Check_Button *)0; static void cb_btnWF_UIrev(Fl_Check_Button* o, void*) { progdefaults.WF_UIrev = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIx1=(Fl_Check_Button *)0; static void cb_btnWF_UIx1(Fl_Check_Button* o, void*) { progdefaults.WF_UIx1 = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfcarrier=(Fl_Check_Button *)0; static void cb_btnWF_UIwfcarrier(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfcarrier = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfshift=(Fl_Check_Button *)0; static void cb_btnWF_UIwfshift(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfshift = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfreflevel=(Fl_Check_Button *)0; static void cb_btnWF_UIwfreflevel(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfreflevel = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfdrop=(Fl_Check_Button *)0; static void cb_btnWF_UIwfdrop(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfdrop = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfampspan=(Fl_Check_Button *)0; static void cb_btnWF_UIwfampspan(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfampspan = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfstore=(Fl_Check_Button *)0; static void cb_btnWF_UIwfstore(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfstore = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIwfmode=(Fl_Check_Button *)0; static void cb_btnWF_UIwfmode(Fl_Check_Button* o, void*) { progdefaults.WF_UIwfmode = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIqsy=(Fl_Check_Button *)0; static void cb_btnWF_UIqsy(Fl_Check_Button* o, void*) { progdefaults.WF_UIqsy = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Check_Button *btnWF_UIxmtlock=(Fl_Check_Button *)0; static void cb_btnWF_UIxmtlock(Fl_Check_Button* o, void*) { progdefaults.WF_UIxmtlock = o->value(); progdefaults.changed = true; WF_UI(); } Fl_Button *btn_wf_enable_all=(Fl_Button *)0; static void cb_btn_wf_enable_all(Fl_Button*, void*) { btnWF_UIrev->value(progdefaults.WF_UIrev = 1); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 1); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 1); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 1); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 1); btnWF_UIx1->value(progdefaults.WF_UIx1 = 1); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 1); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 1); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 1); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 1); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 1); progdefaults.changed = true; WF_UI(); } Fl_Button *btn_wf_disable_all=(Fl_Button *)0; static void cb_btn_wf_disable_all(Fl_Button*, void*) { btnWF_UIrev->value(progdefaults.WF_UIrev = 0); btnWF_UIwfcarrier->value(progdefaults.WF_UIwfcarrier = 0); btnWF_UIwfreflevel->value(progdefaults.WF_UIwfreflevel = 0); btnWF_UIwfampspan->value(progdefaults.WF_UIwfampspan = 0); btnWF_UIwfmode->value(progdefaults.WF_UIwfmode = 0); btnWF_UIx1->value(progdefaults.WF_UIx1 = 0); btnWF_UIwfshift->value(progdefaults.WF_UIwfshift = 0); btnWF_UIwfdrop->value(progdefaults.WF_UIwfdrop = 0); btnWF_UIwfstore->value(progdefaults.WF_UIwfstore = 0); btnWF_UIqsy->value(progdefaults.WF_UIqsy = 0); btnWF_UIxmtlock->value(progdefaults.WF_UIxmtlock = 0); progdefaults.changed = true; WF_UI(); } colorbox *WF_Palette=(colorbox *)0; static void cb_WF_Palette(colorbox*, void*) { progdefaults.changed = true; } static void cb_btnColor(Fl_Button*, void*) { selectColor(0); progdefaults.changed = true; } static void cb_btnColor1(Fl_Button*, void*) { selectColor(1); progdefaults.changed = true; } static void cb_btnColor2(Fl_Button*, void*) { selectColor(2); progdefaults.changed = true; } static void cb_btnColor3(Fl_Button*, void*) { selectColor(3); progdefaults.changed = true; } static void cb_btnColor4(Fl_Button*, void*) { selectColor(4); progdefaults.changed = true; } static void cb_btnColor5(Fl_Button*, void*) { selectColor(5); progdefaults.changed = true; } static void cb_btnColor6(Fl_Button*, void*) { selectColor(6); progdefaults.changed = true; } static void cb_btnColor7(Fl_Button*, void*) { selectColor(7); progdefaults.changed = true; } Fl_Button *btnColor[9]={(Fl_Button *)0}; static void cb_btnColor8(Fl_Button*, void*) { selectColor(8); progdefaults.changed = true; } Fl_Button *btnLoadPalette=(Fl_Button *)0; static void cb_btnLoadPalette(Fl_Button*, void*) { loadPalette(); progdefaults.changed = true; } Fl_Button *btnSavePalette=(Fl_Button *)0; static void cb_btnSavePalette(Fl_Button*, void*) { savePalette(); } Fl_Check_Button *btnUseCursorLines=(Fl_Check_Button *)0; static void cb_btnUseCursorLines(Fl_Check_Button* o, void*) { progdefaults.UseCursorLines = o->value(); if (o->value()) btnCursorBWcolor->activate(); else btnCursorBWcolor->deactivate(); progdefaults.changed = true; } Fl_Button *btnCursorBWcolor=(Fl_Button *)0; static void cb_btnCursorBWcolor(Fl_Button* o, void*) { if (fl_color_chooser("Cursor BW Lines", progdefaults.cursorLineRGBI.R, progdefaults.cursorLineRGBI.G, progdefaults.cursorLineRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B)); o->redraw(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideCursor=(Fl_Check_Button *)0; static void cb_btnUseWideCursor(Fl_Check_Button* o, void*) { progdefaults.UseWideCursor = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUseCursorCenterLine=(Fl_Check_Button *)0; static void cb_btnUseCursorCenterLine(Fl_Check_Button* o, void*) { progdefaults.UseCursorCenterLine = o->value(); progdefaults.changed = true; } Fl_Button *btnCursorCenterLineColor=(Fl_Button *)0; static void cb_btnCursorCenterLineColor(Fl_Button* o, void*) { if (fl_color_chooser("Cursor Center Line", progdefaults.cursorCenterRGBI.R, progdefaults.cursorCenterRGBI.G, progdefaults.cursorCenterRGBI.B) ) { o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B)); o->redraw(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideCenter=(Fl_Check_Button *)0; static void cb_btnUseWideCenter(Fl_Check_Button* o, void*) { progdefaults.UseWideCenter = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnUseBWTracks=(Fl_Check_Button *)0; static void cb_btnUseBWTracks(Fl_Check_Button* o, void*) { progdefaults.UseBWTracks = o->value(); progdefaults.changed = true; } Fl_Button *btnBwTracksColor=(Fl_Button *)0; static void cb_btnBwTracksColor(Fl_Button* o, void*) { if (fl_color_chooser("Track Lines", progdefaults.bwTrackRGBI.R, progdefaults.bwTrackRGBI.G, progdefaults.bwTrackRGBI.B) ) { o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideTracks=(Fl_Check_Button *)0; static void cb_btnUseWideTracks(Fl_Check_Button* o, void*) { progdefaults.UseWideTracks = o->value(); progdefaults.changed = true; } Fl_Button *btnNotchColor=(Fl_Button *)0; static void cb_btnNotchColor(Fl_Button* o, void*) { if (fl_color_chooser("Notch Indicator", progdefaults.notchRGBI.R, progdefaults.notchRGBI.G, progdefaults.notchRGBI.B) ) { o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Button *btnRsIDZoneColor=(Fl_Button *)0; static void cb_btnRsIDZoneColor(Fl_Button* o, void*) { if (fl_color_chooser("RsID Zone Lines", progdefaults.rsidRGBI.R, progdefaults.rsidRGBI.G, progdefaults.rsidRGBI.B) ) { o->color(fl_rgb_color(progdefaults.rsidRGBI.R,progdefaults.rsidRGBI.G,progdefaults.rsidRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Button *btnMonitorColor=(Fl_Button *)0; static void cb_btnMonitorColor(Fl_Button* o, void*) { if (fl_color_chooser("Notch Indicator", progdefaults.monitorRGBI.R, progdefaults.monitorRGBI.G, progdefaults.monitorRGBI.B) ) { o->color(fl_rgb_color(progdefaults.monitorRGBI.R,progdefaults.monitorRGBI.G,progdefaults.monitorRGBI.B)); o->redraw(); wf->redraw_marker(); progdefaults.changed = true; }; } Fl_Check_Button *btnUseWideMonitor=(Fl_Check_Button *)0; static void cb_btnUseWideMonitor(Fl_Check_Button* o, void*) { progdefaults.mon_wide_tracks = o->value(); progdefaults.changed = true; } Fl_Check_Button *chkShowAudioScale=(Fl_Check_Button *)0; static void cb_chkShowAudioScale(Fl_Check_Button* o, void*) { progdefaults.wf_audioscale = o->value(); progdefaults.changed = true; } Fl_Button *btnWaterfallFont=(Fl_Button *)0; static void cb_btnWaterfallFont(Fl_Button*, void*) { font_browser->fontNumber(progdefaults.WaterfallFontnbr); font_browser->fontSize(progdefaults.WaterfallFontsize); font_browser->fontColor(FL_FOREGROUND_COLOR); if (font_browser->fixed_width(progdefaults.WaterfallFontnbr)) font_browser->fontFilter(Font_Browser::FIXED_WIDTH); else font_browser->fontFilter(Font_Browser::ALL_TYPES); font_browser->callback((Fl_Callback*)cbWaterfallFontBrowser); font_browser->show(); } Fl_Check_Button *btnViewXmtSignal=(Fl_Check_Button *)0; static void cb_btnViewXmtSignal(Fl_Check_Button* o, void*) { progdefaults.viewXmtSignal=o->value(); progdefaults.changed = true; } Fl_Counter *valTxMonitorLevel=(Fl_Counter *)0; static void cb_valTxMonitorLevel(Fl_Counter* o, void*) { progdefaults.TxMonitorLevel = pow(10.0, o->value()/20); progdefaults.changed = true; } Fl_Counter2 *cntLowFreqCutoff=(Fl_Counter2 *)0; static void cb_cntLowFreqCutoff(Fl_Counter2* o, void*) { progdefaults.LowFreqCutoff=(int)(o->value()); progdefaults.changed = true; setwfrange(); } Fl_Check_Button *btnWFaveraging=(Fl_Check_Button *)0; static void cb_btnWFaveraging(Fl_Check_Button* o, void*) { progdefaults.WFaveraging = o->value(); progdefaults.changed = true; } Fl_ListBox *listboxFFTPrefilter=(Fl_ListBox *)0; static void cb_listboxFFTPrefilter(Fl_ListBox* o, void*) { progdefaults.wfPreFilter = o->index(); progdefaults.changed = true; } Fl_Counter2 *cntrWfwidth=(Fl_Counter2 *)0; static void cb_cntrWfwidth(Fl_Counter2* o, void*) { progdefaults.HighFreqCutoff = (int)o->value(); progdefaults.changed = true; setwfrange(); } Fl_Counter2 *wf_latency=(Fl_Counter2 *)0; static void cb_wf_latency(Fl_Counter2* o, void*) { progdefaults.wf_latency = (int)o->value(); progdefaults.changed = true; } Fl_Counter *cntr_drop_speed=(Fl_Counter *)0; static void cb_cntr_drop_speed(Fl_Counter* o, void*) { progdefaults.drop_speed=(int)o->value(); progdefaults.changed=true; } Fl_Counter2 *cntrWfheight=(Fl_Counter2 *)0; static void cb_cntrWfheight(Fl_Counter2* o, void*) { progdefaults.wfheight = (int)o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWaterfallHistoryDefault=(Fl_Check_Button *)0; static void cb_btnWaterfallHistoryDefault(Fl_Check_Button* o, void*) { progdefaults.WaterfallHistoryDefault = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWaterfallQSY=(Fl_Check_Button *)0; static void cb_btnWaterfallQSY(Fl_Check_Button* o, void*) { progdefaults.WaterfallQSY = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWaterfallClickInsert=(Fl_Check_Button *)0; static void cb_btnWaterfallClickInsert(Fl_Check_Button* o, void*) { progdefaults.WaterfallClickInsert = o->value(); if (progdefaults.WaterfallClickInsert) inpWaterfallClickText->activate(); else inpWaterfallClickText->deactivate(); progdefaults.changed = true; } Fl_Input2 *inpWaterfallClickText=(Fl_Input2 *)0; static void cb_inpWaterfallClickText(Fl_Input2* o, void*) { progdefaults.WaterfallClickText = o->value(); progdefaults.changed = true; } Fl_ListBox *listboxWaterfallWheelAction=(Fl_ListBox *)0; static void cb_listboxWaterfallWheelAction(Fl_ListBox* o, void*) { progdefaults.WaterfallWheelAction = o->index(); progdefaults.changed = true; } Fl_Check_Button *btnWFspectrum_center=(Fl_Check_Button *)0; static void cb_btnWFspectrum_center(Fl_Check_Button* o, void*) { progdefaults.wf_spectrum_center = o->value(); progdefaults.changed = true; } Fl_Check_Button *btnWFspectrum_dbvals=(Fl_Check_Button *)0; static void cb_btnWFspectrum_dbvals(Fl_Check_Button* o, void*) { progdefaults.wf_spectrum_dbvals = o->value(); progdefaults.changed = true; } Fl_Counter *cntr_spectrum_freq_scale=(Fl_Counter *)0; static void cb_cntr_spectrum_freq_scale(Fl_Counter* o, void*) { progdefaults.wf_spectrum_scale_factor = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_spectrum_modem_scale=(Fl_Check_Button *)0; static void cb_btn_spectrum_modem_scale(Fl_Check_Button* o, void*) { progdefaults.wf_spectrum_modem_scale = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntServerCarrier=(Fl_Counter2 *)0; static void cb_cntServerCarrier(Fl_Counter2* o, void*) { progdefaults.ServerCarrier = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Counter2 *cntServerOffset=(Fl_Counter2 *)0; static void cb_cntServerOffset(Fl_Counter2* o, void*) { progdefaults.ServerOffset = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Counter2 *cntServerACQsn=(Fl_Counter2 *)0; static void cb_cntServerACQsn(Fl_Counter2* o, void*) { progdefaults.ServerACQsn = o->value(); progdefaults.changed = true; } Fl_Counter2 *cntServerAFCrange=(Fl_Counter2 *)0; static void cb_cntServerAFCrange(Fl_Counter2* o, void*) { progdefaults.ServerAFCrange = (int)o->value(); wf->redraw_marker(); progdefaults.changed = true; } Fl_Check_Button *btnPSKmailSweetSpot=(Fl_Check_Button *)0; static void cb_btnPSKmailSweetSpot(Fl_Check_Button* o, void*) { progdefaults.PSKmailSweetSpot = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_arq_s2n_report=(Fl_Check_Button *)0; static void cb_btn_arq_s2n_report(Fl_Check_Button* o, void*) { progdefaults.Pskmails2nreport=o->value(); } Fl_Input *txt_wx_url=(Fl_Input *)0; static void cb_txt_wx_url(Fl_Input* o, void*) { progdefaults.wx_url = o->value(); progdefaults.changed = true; } Fl_Button *btn_default_wx_url=(Fl_Button *)0; static void cb_btn_default_wx_url(Fl_Button*, void*) { txt_wx_url->value( "https://tgftp.nws.noaa.gov/data/observations/metar/decoded"); progdefaults.wx_url=txt_wx_url->value(); progdefaults.changed=true; } Fl_Input *inpWXsta=(Fl_Input *)0; static void cb_inpWXsta(Fl_Input* o, void*) { progdefaults.wx_sta = o->value(); progdefaults.changed = true; } Fl_Button *btn_metar_search=(Fl_Button *)0; static void cb_btn_metar_search(Fl_Button*, void*) { get_METAR_station(); } Fl_Check_Button *btn_wx_full=(Fl_Check_Button *)0; static void cb_btn_wx_full(Fl_Check_Button* o, void*) { progdefaults.wx_full=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_station_name=(Fl_Check_Button *)0; static void cb_btn_wx_station_name(Fl_Check_Button* o, void*) { progdefaults.wx_station_name = o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_condx=(Fl_Check_Button *)0; static void cb_btn_wx_condx(Fl_Check_Button* o, void*) { progdefaults.wx_condx=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_fahrenheit=(Fl_Check_Button *)0; static void cb_btn_wx_fahrenheit(Fl_Check_Button* o, void*) { progdefaults.wx_fahrenheit=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_celsius=(Fl_Check_Button *)0; static void cb_btn_wx_celsius(Fl_Check_Button* o, void*) { progdefaults.wx_celsius=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_mph=(Fl_Check_Button *)0; static void cb_btn_wx_mph(Fl_Check_Button* o, void*) { progdefaults.wx_mph=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_kph=(Fl_Check_Button *)0; static void cb_btn_wx_kph(Fl_Check_Button* o, void*) { progdefaults.wx_kph=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_inches=(Fl_Check_Button *)0; static void cb_btn_wx_inches(Fl_Check_Button* o, void*) { progdefaults.wx_inches=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_mbars=(Fl_Check_Button *)0; static void cb_btn_wx_mbars(Fl_Check_Button* o, void*) { progdefaults.wx_mbars=o->value(); progdefaults.changed = true; } Fl_Check_Button *btn_wx_raw=(Fl_Check_Button *)0; static void cb_btn_wx_raw(Fl_Check_Button* o, void*) { progdefaults.wx_raw=o->value(); progdefaults.changed = true; } Fl_Button *btnSaveConfig=(Fl_Button *)0; static void cb_btnSaveConfig(Fl_Button*, void*) { progdefaults.saveDefaults(); } Fl_Return_Button *btnCloseConfig=(Fl_Return_Button *)0; static void cb_btnCloseConfig(Fl_Return_Button*, void*) { closeDialog(); } Fl_Button *btnResetConfig=(Fl_Button *)0; static void cb_btnResetConfig(Fl_Button*, void*) { if (fl_choice2("This will effect every configuration item!\nConfirm", "Yes", "No", NULL)) { progdefaults.resetDefaults(); progdefaults.changed = false; }; } Fl_Double_Window* ConfigureDialog() { Fl_Double_Window* w; static const char szShifts[] = "23|85|160|170|182|200|240|350|425|850|Custom"; static const char szBauds[] = "45|45.45|50|56|75|100|110|150|200|300"; static const char szSelBits[] = "5 (baudot)|7 (ascii)|8 (ascii)"; static const char szParity[] = "none|even|odd|zero|one"; static const char szStopBits[] = "1|1.5|2"; static const char szOliviaTones[] = "2|4|8|16|32|64|128|256"; static const char szOliviaBandwidth[] = "125|250|500|1000|2000"; static const char szContestiaTones[] = "2|4|8|16|32|64|128|256"; static const char szContestiaBandwidth[] = "125|250|500|1000|2000"; static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600|115200|230400|460800"; static const char szProsigns[] = "~|%|&|+|=|{|}|<|>|[|]| "; { Fl_Double_Window* o = new Fl_Double_Window(800, 380, _("Fldigi configuration")); w = o; if (w) {/* empty */} o->color(FL_DARK2); o->selection_color((Fl_Color)51); o->labelsize(18); o->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE)); { Fl_Group* o = new Fl_Group(0, 0, 201, 380); { Fl_Tree* o = tab_tree = new Fl_Tree(0, 0, 200, 350); tab_tree->callback((Fl_Callback*)SelectItem_CB); Fl_Group::current()->resizable(tab_tree); o->root_label(_("Configure")); o->selectmode(FL_TREE_SELECT_SINGLE); o->connectorstyle(FL_TREE_CONNECTOR_DOTTED); // default is NONE on Mac o->connectorwidth(15); // default is 17 } // Fl_Tree* tab_tree { Fl_Group* o = new Fl_Group(0, 350, 201, 30); { Fl_Group* o = new Fl_Group(0, 350, 100, 30); o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o { btn_collapse_tab_tree = new Fl_Button(95, 353, 105, 22, _("Collapse Tree")); btn_collapse_tab_tree->callback((Fl_Callback*)cb_btn_collapse_tab_tree); } // Fl_Button* btn_collapse_tab_tree o->end(); } // Fl_Group* o o->end(); Fl_Group::current()->resizable(o); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Call/Lookup")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(208, 24, 585, 131, _("Web Browser lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btnQRZWEBnotavailable = new Fl_Round_Button(248, 43, 61, 20, _("None")); btnQRZWEBnotavailable->tooltip(_("Do not use callsign lookup via web browser")); btnQRZWEBnotavailable->down_box(FL_DOWN_BOX); btnQRZWEBnotavailable->value(1); btnQRZWEBnotavailable->callback((Fl_Callback*)cb_btnQRZWEBnotavailable); o->value(progdefaults.QRZWEB == QRZWEBNONE); } // Fl_Round_Button* btnQRZWEBnotavailable { Fl_Round_Button* o = btnQRZonline = new Fl_Round_Button(248, 63, 83, 20, _("QRZ on line")); btnQRZonline->tooltip(_("Visit QRZ web site")); btnQRZonline->down_box(FL_DOWN_BOX); btnQRZonline->callback((Fl_Callback*)cb_btnQRZonline); o->value(progdefaults.QRZWEB == QRZHTML); } // Fl_Round_Button* btnQRZonline { Fl_Round_Button* o = btnHAMCALLonline = new Fl_Round_Button(248, 84, 83, 20, _("HamCall online")); btnHAMCALLonline->tooltip(_("Visit Hamcall web site")); btnHAMCALLonline->down_box(FL_DOWN_BOX); btnHAMCALLonline->callback((Fl_Callback*)cb_btnHAMCALLonline); o->value(progdefaults.QRZWEB == HAMCALLHTML); } // Fl_Round_Button* btnHAMCALLonline { Fl_Round_Button* o = btnHamQTHonline = new Fl_Round_Button(248, 105, 20, 20, _("HamQTH online")); btnHamQTHonline->tooltip(_("Visit hamQTH web site")); btnHamQTHonline->down_box(FL_DOWN_BOX); btnHamQTHonline->callback((Fl_Callback*)cb_btnHamQTHonline); o->value(progdefaults.QRZWEB == HAMQTHHTML); } // Fl_Round_Button* btnHamQTHonline { Fl_Round_Button* o = btnCallookOnline = new Fl_Round_Button(248, 126, 20, 20, _("Callook online")); btnCallookOnline->tooltip(_("Visit hamQTH web site")); btnCallookOnline->down_box(FL_DOWN_BOX); btnCallookOnline->callback((Fl_Callback*)cb_btnCallookOnline); o->value(progdefaults.QRZWEB == CALLOOKHTML); } // Fl_Round_Button* btnCallookOnline { Fl_Input2* o = inp_qrzurl = new Fl_Input2(502, 37, 270, 22, _("QRZ")); inp_qrzurl->box(FL_DOWN_BOX); inp_qrzurl->color(FL_BACKGROUND2_COLOR); inp_qrzurl->selection_color(FL_SELECTION_COLOR); inp_qrzurl->labeltype(FL_NORMAL_LABEL); inp_qrzurl->labelfont(0); inp_qrzurl->labelsize(14); inp_qrzurl->labelcolor(FL_FOREGROUND_COLOR); inp_qrzurl->callback((Fl_Callback*)cb_inp_qrzurl); inp_qrzurl->align(Fl_Align(FL_ALIGN_LEFT)); inp_qrzurl->when(FL_WHEN_RELEASE); o->value(progdefaults.qrzurl.c_str()); } // Fl_Input2* inp_qrzurl { Fl_Input2* o = inp_hamcallurl = new Fl_Input2(502, 64, 270, 22, _("Hamcall")); inp_hamcallurl->box(FL_DOWN_BOX); inp_hamcallurl->color(FL_BACKGROUND2_COLOR); inp_hamcallurl->selection_color(FL_SELECTION_COLOR); inp_hamcallurl->labeltype(FL_NORMAL_LABEL); inp_hamcallurl->labelfont(0); inp_hamcallurl->labelsize(14); inp_hamcallurl->labelcolor(FL_FOREGROUND_COLOR); inp_hamcallurl->callback((Fl_Callback*)cb_inp_hamcallurl); inp_hamcallurl->align(Fl_Align(FL_ALIGN_LEFT)); inp_hamcallurl->when(FL_WHEN_RELEASE); o->value(progdefaults.hamcallurl.c_str()); } // Fl_Input2* inp_hamcallurl { Fl_Input2* o = inp_hamqthurl = new Fl_Input2(502, 92, 270, 22, _("HamQTH")); inp_hamqthurl->box(FL_DOWN_BOX); inp_hamqthurl->color(FL_BACKGROUND2_COLOR); inp_hamqthurl->selection_color(FL_SELECTION_COLOR); inp_hamqthurl->labeltype(FL_NORMAL_LABEL); inp_hamqthurl->labelfont(0); inp_hamqthurl->labelsize(14); inp_hamqthurl->labelcolor(FL_FOREGROUND_COLOR); inp_hamqthurl->callback((Fl_Callback*)cb_inp_hamqthurl); inp_hamqthurl->align(Fl_Align(FL_ALIGN_LEFT)); inp_hamqthurl->when(FL_WHEN_RELEASE); o->value(progdefaults.hamqthurl.c_str()); } // Fl_Input2* inp_hamqthurl { Fl_Input2* o = inp_callook_url = new Fl_Input2(502, 121, 270, 22, _("Callook")); inp_callook_url->tooltip(_("Callook.info web site")); inp_callook_url->box(FL_DOWN_BOX); inp_callook_url->color(FL_BACKGROUND2_COLOR); inp_callook_url->selection_color(FL_SELECTION_COLOR); inp_callook_url->labeltype(FL_NORMAL_LABEL); inp_callook_url->labelfont(0); inp_callook_url->labelsize(14); inp_callook_url->labelcolor(FL_FOREGROUND_COLOR); inp_callook_url->callback((Fl_Callback*)cb_inp_callook_url); inp_callook_url->align(Fl_Align(FL_ALIGN_LEFT)); inp_callook_url->when(FL_WHEN_RELEASE); o->value(progdefaults.callookurl.c_str()); } // Fl_Input2* inp_callook_url o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(208, 156, 585, 185, _("Data base lookup")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btnQRZXMLnotavailable = new Fl_Round_Button(255, 179, 69, 20, _("None")); btnQRZXMLnotavailable->tooltip(_("Do not use callsign database")); btnQRZXMLnotavailable->down_box(FL_DOWN_BOX); btnQRZXMLnotavailable->value(1); btnQRZXMLnotavailable->callback((Fl_Callback*)cb_btnQRZXMLnotavailable); o->value(progdefaults.QRZXML == QRZXMLNONE); } // Fl_Round_Button* btnQRZXMLnotavailable { Fl_Round_Button* o = btnQRZcdrom = new Fl_Round_Button(255, 205, 76, 20, _("QRZ cdrom")); btnQRZcdrom->tooltip(_("Use CD or hard drive CD image")); btnQRZcdrom->down_box(FL_DOWN_BOX); btnQRZcdrom->callback((Fl_Callback*)cb_btnQRZcdrom); o->value(progdefaults.QRZXML == QRZCD); } // Fl_Round_Button* btnQRZcdrom { Fl_Round_Button* o = btnQRZsub = new Fl_Round_Button(255, 231, 137, 20, _("QRZ.com")); btnQRZsub->tooltip(_("You need a paid QRZ online\nsubscription to access")); btnQRZsub->down_box(FL_DOWN_BOX); btnQRZsub->callback((Fl_Callback*)cb_btnQRZsub); o->value(progdefaults.QRZXML == QRZNET); } // Fl_Round_Button* btnQRZsub { Fl_Round_Button* o = btnHamcall = new Fl_Round_Button(255, 258, 137, 20, _("Hamcall.net")); btnHamcall->tooltip(_("You need a paid Hamcall online\nsubscription to access")); btnHamcall->down_box(FL_DOWN_BOX); btnHamcall->callback((Fl_Callback*)cb_btnHamcall); o->value(progdefaults.QRZXML == HAMCALLNET); } // Fl_Round_Button* btnHamcall { Fl_Round_Button* o = btnHamQTH = new Fl_Round_Button(255, 284, 137, 20, _("HamQTH.com")); btnHamQTH->tooltip(_("Free service courtesy of OK")); btnHamQTH->down_box(FL_DOWN_BOX); btnHamQTH->callback((Fl_Callback*)cb_btnHamQTH); o->value(progdefaults.QRZXML == HAMQTH); } // Fl_Round_Button* btnHamQTH { Fl_Round_Button* o = btnCALLOOK = new Fl_Round_Button(255, 311, 113, 20, _("Callook.info")); btnCALLOOK->tooltip(_("Callook.info lookup (free service US callsigns only)")); btnCALLOOK->down_box(FL_DOWN_BOX); btnCALLOOK->callback((Fl_Callback*)cb_btnCALLOOK); o->value(progdefaults.QRZXML == CALLOOK); } // Fl_Round_Button* btnCALLOOK { Fl_Input2* o = txtQRZpathname = new Fl_Input2(372, 204, 401, 22); txtQRZpathname->tooltip(_("ie: /home/dave/CALLBK/ or C:/CALLBK/\nLeave blank to search for database")); txtQRZpathname->box(FL_DOWN_BOX); txtQRZpathname->color(FL_BACKGROUND2_COLOR); txtQRZpathname->selection_color(FL_SELECTION_COLOR); txtQRZpathname->labeltype(FL_NORMAL_LABEL); txtQRZpathname->labelfont(0); txtQRZpathname->labelsize(14); txtQRZpathname->labelcolor(FL_FOREGROUND_COLOR); txtQRZpathname->callback((Fl_Callback*)cb_txtQRZpathname); txtQRZpathname->align(Fl_Align(FL_ALIGN_LEFT)); txtQRZpathname->when(FL_WHEN_RELEASE); o->value(progdefaults.QRZpathname.c_str()); txtQRZpathname->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtQRZpathname { Fl_Input2* o = inpQRZusername = new Fl_Input2(482, 230, 163, 22, _("User name")); inpQRZusername->tooltip(_("Login name for QRZ / Hamcall / HamQTH")); inpQRZusername->box(FL_DOWN_BOX); inpQRZusername->color(FL_BACKGROUND2_COLOR); inpQRZusername->selection_color(FL_SELECTION_COLOR); inpQRZusername->labeltype(FL_NORMAL_LABEL); inpQRZusername->labelfont(0); inpQRZusername->labelsize(14); inpQRZusername->labelcolor(FL_FOREGROUND_COLOR); inpQRZusername->callback((Fl_Callback*)cb_inpQRZusername); inpQRZusername->align(Fl_Align(FL_ALIGN_LEFT)); inpQRZusername->when(FL_WHEN_RELEASE); o->value(progdefaults.QRZusername.c_str()); inpQRZusername->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpQRZusername { Fl_Input2* o = inpQRZuserpassword = new Fl_Input2(482, 257, 163, 22, _("Password")); inpQRZuserpassword->tooltip(_("Password for QRZ / Hamcall / HamQTH")); inpQRZuserpassword->box(FL_DOWN_BOX); inpQRZuserpassword->color(FL_BACKGROUND2_COLOR); inpQRZuserpassword->selection_color(FL_SELECTION_COLOR); inpQRZuserpassword->labeltype(FL_NORMAL_LABEL); inpQRZuserpassword->labelfont(0); inpQRZuserpassword->labelsize(14); inpQRZuserpassword->labelcolor(FL_FOREGROUND_COLOR); inpQRZuserpassword->callback((Fl_Callback*)cb_inpQRZuserpassword); inpQRZuserpassword->align(Fl_Align(FL_ALIGN_LEFT)); inpQRZuserpassword->when(FL_WHEN_RELEASE); o->value(progdefaults.QRZuserpassword.c_str()); o->type(FL_SECRET_INPUT); inpQRZuserpassword->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpQRZuserpassword { btnQRZpasswordShow = new Fl_Button(657, 257, 76, 22, _("Show")); btnQRZpasswordShow->tooltip(_("Show password in plain text")); btnQRZpasswordShow->callback((Fl_Callback*)cb_btnQRZpasswordShow); } // Fl_Button* btnQRZpasswordShow { Fl_Group* o = new Fl_Group(377, 307, 403, 27); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_notes_address = new Fl_Check_Button(401, 313, 207, 15, _("Add address to notes field")); btn_notes_address->down_box(FL_DOWN_BOX); btn_notes_address->callback((Fl_Callback*)cb_btn_notes_address); o->value(progdefaults.notes_address); } // Fl_Check_Button* btn_notes_address { Fl_Check_Button* o = btn_clear_notes = new Fl_Check_Button(628, 313, 122, 15, _("clear old data")); btn_clear_notes->down_box(FL_DOWN_BOX); btn_clear_notes->callback((Fl_Callback*)cb_btn_clear_notes); o->value(progdefaults.clear_notes); } // Fl_Check_Button* btn_clear_notes o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Call/Lookup")); config_pages.push_back(p); tab_tree->add(_("Call/Lookup")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Call/cty.dat")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Input2* o = txt_cty_dat_pathname = new Fl_Input2(330, 56, 346, 24, _("cty.dat folder")); txt_cty_dat_pathname->tooltip(_("Enter full path-name for cty.dat folder")); txt_cty_dat_pathname->box(FL_DOWN_BOX); txt_cty_dat_pathname->color(FL_BACKGROUND2_COLOR); txt_cty_dat_pathname->selection_color(FL_SELECTION_COLOR); txt_cty_dat_pathname->labeltype(FL_NORMAL_LABEL); txt_cty_dat_pathname->labelfont(0); txt_cty_dat_pathname->labelsize(14); txt_cty_dat_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_cty_dat_pathname->callback((Fl_Callback*)cb_txt_cty_dat_pathname); txt_cty_dat_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_cty_dat_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.cty_dat_pathname.c_str()); } // Fl_Input2* txt_cty_dat_pathname { btn_select_cty_dat = new Fl_Button(235, 101, 75, 24, _("Browse")); btn_select_cty_dat->tooltip(_("Locate cty.dat file")); btn_select_cty_dat->callback((Fl_Callback*)cb_btn_select_cty_dat); } // Fl_Button* btn_select_cty_dat { btn_default_cty_dat = new Fl_Button(330, 101, 75, 24, _("Default")); btn_default_cty_dat->tooltip(_("Restore cty.dat default folder")); btn_default_cty_dat->callback((Fl_Callback*)cb_btn_default_cty_dat); } // Fl_Button* btn_default_cty_dat { btn_reload_cty_dat = new Fl_Button(425, 101, 75, 24, _("Reload")); btn_reload_cty_dat->tooltip(_("Reload cty.dat")); btn_reload_cty_dat->callback((Fl_Callback*)cb_btn_reload_cty_dat); } // Fl_Button* btn_reload_cty_dat CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Call/Cty.dat")); config_pages.push_back(p); tab_tree->add(_("Call/Cty.dat")); tab_tree->close(_("Call")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Colors-Fonts/Buttons-Menus")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { btnSpotColor = new Fl_Button(284, 75, 100, 21, _("Spot")); btnSpotColor->callback((Fl_Callback*)cb_btnSpotColor); } // Fl_Button* btnSpotColor { btnRevColor = new Fl_Button(284, 111, 100, 21, _("Rev")); btnRevColor->callback((Fl_Callback*)cb_btnRevColor); } // Fl_Button* btnRevColor { btnTuneColor = new Fl_Button(284, 148, 100, 21, _("Tune")); btnTuneColor->callback((Fl_Callback*)cb_btnTuneColor); } // Fl_Button* btnTuneColor { btnRxIDColor = new Fl_Button(284, 183, 100, 21, _("RxID nar")); btnRxIDColor->callback((Fl_Callback*)cb_btnRxIDColor); } // Fl_Button* btnRxIDColor { btnLkColor = new Fl_Button(473, 75, 100, 21, _("Lk")); btnLkColor->callback((Fl_Callback*)cb_btnLkColor); } // Fl_Button* btnLkColor { btnSql1Color = new Fl_Button(473, 111, 100, 21, _("SQL-1")); btnSql1Color->callback((Fl_Callback*)cb_btnSql1Color); } // Fl_Button* btnSql1Color { btnXmtColor = new Fl_Button(473, 148, 100, 20, _("T/R")); btnXmtColor->callback((Fl_Callback*)cb_btnXmtColor); } // Fl_Button* btnXmtColor { btnRxIDwideColor = new Fl_Button(473, 183, 100, 21, _("RxID wide")); btnRxIDwideColor->callback((Fl_Callback*)cb_btnRxIDwideColor); } // Fl_Button* btnRxIDwideColor { btnAfcColor = new Fl_Button(663, 75, 100, 21, _("AFC")); btnAfcColor->callback((Fl_Callback*)cb_btnAfcColor); } // Fl_Button* btnAfcColor { btnSql2Color = new Fl_Button(663, 111, 100, 20, _("SQL-2")); btnSql2Color->callback((Fl_Callback*)cb_btnSql2Color); } // Fl_Button* btnSql2Color { btnTxIDColor = new Fl_Button(662, 183, 100, 20, _("TxID")); btnTxIDColor->callback((Fl_Callback*)cb_btnTxIDColor); } // Fl_Button* btnTxIDColor { Fl_Box* o = spotcolor = new Fl_Box(254, 76, 18, 19); spotcolor->box(FL_THIN_DOWN_BOX); spotcolor->color((Fl_Color)3); o->color(progdefaults.SpotColor); } // Fl_Box* spotcolor { Fl_Box* o = revcolor = new Fl_Box(254, 112, 18, 19); revcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.RevColor); } // Fl_Box* revcolor { Fl_Box* o = tunecolor = new Fl_Box(254, 149, 18, 19); tunecolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.TuneColor); } // Fl_Box* tunecolor { Fl_Box* o = rxidcolor = new Fl_Box(254, 184, 18, 19); rxidcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.RxIDColor); } // Fl_Box* rxidcolor { Fl_Box* o = lockcolor = new Fl_Box(442, 76, 18, 19); lockcolor->box(FL_THIN_DOWN_BOX); lockcolor->color((Fl_Color)3); o->color(progdefaults.LkColor); } // Fl_Box* lockcolor { Fl_Box* o = sql1color = new Fl_Box(442, 112, 18, 19); sql1color->box(FL_THIN_DOWN_BOX); o->color(progdefaults.Sql1Color); } // Fl_Box* sql1color { Fl_Box* o = rxidcolorwide = new Fl_Box(442, 184, 18, 19); rxidcolorwide->box(FL_THIN_DOWN_BOX); o->color(progdefaults.RxIDwideColor); } // Fl_Box* rxidcolorwide { Fl_Box* o = xmtcolor = new Fl_Box(442, 149, 18, 18); xmtcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.XmtColor); } // Fl_Box* xmtcolor { Fl_Box* o = afccolor = new Fl_Box(630, 76, 18, 19); afccolor->box(FL_THIN_DOWN_BOX); afccolor->color((Fl_Color)3); o->color(progdefaults.AfcColor); } // Fl_Box* afccolor { Fl_Box* o = sql2color = new Fl_Box(630, 112, 18, 18); sql2color->box(FL_THIN_DOWN_BOX); o->color(progdefaults.Sql2Color); } // Fl_Box* sql2color { Fl_Box* o = txidcolor = new Fl_Box(630, 184, 18, 18); txidcolor->box(FL_THIN_DOWN_BOX); o->color(progdefaults.TxIDColor); } // Fl_Box* txidcolor { btn_default_btn_color = new Fl_Button(284, 218, 100, 21, _("Lighted Btns")); btn_default_btn_color->callback((Fl_Callback*)cb_btn_default_btn_color); } // Fl_Button* btn_default_btn_color { Fl_Box* o = default_btn_color = new Fl_Box(254, 220, 18, 19); default_btn_color->box(FL_THIN_DOWN_BOX); o->color(progdefaults.default_btn_color); } // Fl_Box* default_btn_color { btn_check_btn_color = new Fl_Button(473, 218, 100, 21, _("Check Btns")); btn_check_btn_color->callback((Fl_Callback*)cb_btn_check_btn_color); } // Fl_Button* btn_check_btn_color { Fl_Box* o = default_check_btn_color = new Fl_Box(442, 220, 18, 19); default_check_btn_color->box(FL_THIN_DOWN_BOX); o->color(progdefaults.default_check_btn_color); } // Fl_Box* default_check_btn_color { btn_default_round_btn_color = new Fl_Button(662, 218, 100, 21, _("Round Btns")); btn_default_round_btn_color->callback((Fl_Callback*)cb_btn_default_round_btn_color); } // Fl_Button* btn_default_round_btn_color { Fl_Box* o = default_round_btn_color = new Fl_Box(630, 220, 18, 19); default_round_btn_color->box(FL_ROUND_DOWN_BOX); o->color(progdefaults.default_round_btn_color); } // Fl_Box* default_round_btn_color { btnMenuFont = new Fl_Button(284, 278, 100, 21, _("Menu font")); btnMenuFont->callback((Fl_Callback*)cb_btnMenuFont); } // Fl_Button* btnMenuFont CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Buttons-Menus")); config_pages.push_back(p); tab_tree->add(_("Colors-Fonts/Buttons-Menus")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Colors-Fonts/FreqDisp - Meters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(304, 51, 395, 87); o->box(FL_ENGRAVED_FRAME); { Fl_Box* o = FDdisplay = new Fl_Box(384, 55, 235, 45, _("14070.150")); FDdisplay->box(FL_DOWN_BOX); FDdisplay->color((Fl_Color)55); FDdisplay->labelfont(4); FDdisplay->labelsize(40); o->color(fl_rgb_color(progdefaults.FDbackground.R,progdefaults.FDbackground.G,progdefaults.FDbackground.B)); o->labelcolor(fl_rgb_color(progdefaults.FDforeground.R,progdefaults.FDforeground.G,progdefaults.FDforeground.B)); o->labelfont(progdefaults.FreqControlFontnbr); } // Fl_Box* FDdisplay { btn_freq_control_font = new Fl_Button(311, 106, 90, 24, _("Font")); btn_freq_control_font->callback((Fl_Callback*)cb_btn_freq_control_font); } // Fl_Button* btn_freq_control_font { btnBackgroundColor = new Fl_Button(407, 106, 90, 24, _("Bg Color")); btnBackgroundColor->callback((Fl_Callback*)cb_btnBackgroundColor); } // Fl_Button* btnBackgroundColor { btnForegroundColor = new Fl_Button(503, 106, 90, 24, _("Digit Color")); btnForegroundColor->callback((Fl_Callback*)cb_btnForegroundColor); } // Fl_Button* btnForegroundColor { btnFD_SystemColor = new Fl_Button(599, 106, 90, 24, _("Sys Colors")); btnFD_SystemColor->callback((Fl_Callback*)cb_btnFD_SystemColor); } // Fl_Button* btnFD_SystemColor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(304, 142, 395, 62, _("S-meter")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnSmeter_bg_color = new Fl_Button(311, 169, 90, 24, _("Bg Color")); btnSmeter_bg_color->callback((Fl_Callback*)cb_btnSmeter_bg_color); } // Fl_Button* btnSmeter_bg_color { btnSmeter_scale_color = new Fl_Button(407, 169, 90, 24, _("Scale Color")); btnSmeter_scale_color->callback((Fl_Callback*)cb_btnSmeter_scale_color); } // Fl_Button* btnSmeter_scale_color { btnSmeter_meter_color = new Fl_Button(503, 169, 90, 24, _("Meter Color")); btnSmeter_meter_color->callback((Fl_Callback*)cb_btnSmeter_meter_color); } // Fl_Button* btnSmeter_meter_color o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(304, 211, 395, 67, _("PWR-meter")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnPWR_bg_color = new Fl_Button(311, 238, 90, 24, _("Bg Color")); btnPWR_bg_color->callback((Fl_Callback*)cb_btnPWR_bg_color); } // Fl_Button* btnPWR_bg_color { btnPWR_scale_color = new Fl_Button(407, 238, 90, 24, _("Scale Color")); btnPWR_scale_color->callback((Fl_Callback*)cb_btnPWR_scale_color); } // Fl_Button* btnPWR_scale_color { btnPWR_meter_Color = new Fl_Button(503, 238, 90, 24, _("Meter Color")); btnPWR_meter_Color->callback((Fl_Callback*)cb_btnPWR_meter_Color); } // Fl_Button* btnPWR_meter_Color { Fl_ListBox* o = listboxPWRselect = new Fl_ListBox(599, 238, 80, 24, _("Power scale")); listboxPWRselect->tooltip(_("Select the type of FFT prefilter")); listboxPWRselect->box(FL_DOWN_BOX); listboxPWRselect->color(FL_BACKGROUND2_COLOR); listboxPWRselect->selection_color(FL_BACKGROUND_COLOR); listboxPWRselect->labeltype(FL_NORMAL_LABEL); listboxPWRselect->labelfont(0); listboxPWRselect->labelsize(14); listboxPWRselect->labelcolor(FL_FOREGROUND_COLOR); listboxPWRselect->callback((Fl_Callback*)cb_listboxPWRselect); listboxPWRselect->align(Fl_Align(FL_ALIGN_TOP)); listboxPWRselect->when(FL_WHEN_RELEASE); o->add(_("25 W")); o->add("50 W"); o->add("100 W"); o->add("200 W"); o->add("AUTO"); o->index(progdefaults.PWRselect);o->labelsize(FL_NORMAL_SIZE); listboxPWRselect->end(); } // Fl_ListBox* listboxPWRselect o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/FreqDisp - Meters")); config_pages.push_back(p); tab_tree->add(_("Colors-Fonts/FreqDisp - Meters")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Colors-Fonts/Function keys")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { btnUseGroupColors = new Fl_Check_Button(337, 92, 165, 21, _("Use colored buttons")); btnUseGroupColors->down_box(FL_DOWN_BOX); btnUseGroupColors->callback((Fl_Callback*)cb_btnUseGroupColors); btnUseGroupColors->value(progdefaults.useGroupColors); } // Fl_Check_Button* btnUseGroupColors { btnGroup1 = new Fl_Button(305, 140, 90, 30, _("Group 1")); btnGroup1->tooltip(_("Background color for Function key group 1")); btnGroup1->callback((Fl_Callback*)cb_btnGroup1); btnGroup1->color(fl_rgb_color(progdefaults.btnGroup1.R, progdefaults.btnGroup1.G,progdefaults.btnGroup1.B)); btnGroup1->labelcolor(progdefaults.MacroBtnFontcolor); } // Fl_Button* btnGroup1 { btnGroup2 = new Fl_Button(407, 140, 90, 30, _("Group 2")); btnGroup2->tooltip(_("Background color for Function key group 2")); btnGroup2->callback((Fl_Callback*)cb_btnGroup2); btnGroup2->color(fl_rgb_color(progdefaults.btnGroup2.R, progdefaults.btnGroup2.G,progdefaults.btnGroup2.B)); btnGroup2->labelcolor(progdefaults.MacroBtnFontcolor); } // Fl_Button* btnGroup2 { btnGroup3 = new Fl_Button(509, 140, 90, 30, _("Group 3")); btnGroup3->tooltip(_("Background color for Function key group 3")); btnGroup3->callback((Fl_Callback*)cb_btnGroup3); btnGroup3->color(fl_rgb_color(progdefaults.btnGroup3.R, progdefaults.btnGroup3.G,progdefaults.btnGroup3.B)); btnGroup3->labelcolor(progdefaults.MacroBtnFontcolor); } // Fl_Button* btnGroup3 { btnFkeyDEfaults = new Fl_Button(612, 140, 90, 30, _("Defaults")); btnFkeyDEfaults->callback((Fl_Callback*)cb_btnFkeyDEfaults); } // Fl_Button* btnFkeyDEfaults { btnMacroBtnFont = new Fl_Button(509, 87, 90, 30, _("Font/Color")); btnMacroBtnFont->callback((Fl_Callback*)cb_btnMacroBtnFont); } // Fl_Button* btnMacroBtnFont CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Function keys")); config_pages.push_back(p); tab_tree->add(_("Colors-Fonts/Function keys")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Colors-Fonts/Logging controls")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 33, 590, 65, _("Logging Panel Controls")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = LOGGINGdisplay = new Fl_Output(233, 57, 184, 25); o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGGINGtextcolor); o->color(progdefaults.LOGGINGcolor); o->value("W1HKJ"); o->redraw(); } // Fl_Output* LOGGINGdisplay { btnLOGGING_color = new Fl_Button(476, 57, 80, 25, _("Bg Color")); btnLOGGING_color->callback((Fl_Callback*)cb_btnLOGGING_color); } // Fl_Button* btnLOGGING_color { btn_LOGGING_font = new Fl_Button(566, 57, 55, 25, _("Font")); btn_LOGGING_font->callback((Fl_Callback*)cb_btn_LOGGING_font); } // Fl_Button* btn_LOGGING_font { btnLOGGINGdefault_colors_font = new Fl_Button(632, 57, 80, 25, _("Default")); btnLOGGINGdefault_colors_font->callback((Fl_Callback*)cb_btnLOGGINGdefault_colors_font); } // Fl_Button* btnLOGGINGdefault_colors_font o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 99, 590, 65, _("Logbook Dialog")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = LOGBOOKdisplay = new Fl_Output(233, 123, 184, 25); o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize);o->textcolor(progdefaults.LOGBOOKtextcolor); o->color(progdefaults.LOGBOOKcolor); o->value("14.070000"); o->redraw(); } // Fl_Output* LOGBOOKdisplay { btnLOGBOOK_color = new Fl_Button(475, 123, 80, 25, _("Bg Color")); btnLOGBOOK_color->callback((Fl_Callback*)cb_btnLOGBOOK_color); } // Fl_Button* btnLOGBOOK_color { btn_LOGBOOK_font = new Fl_Button(565, 123, 55, 25, _("Font")); btn_LOGBOOK_font->callback((Fl_Callback*)cb_btn_LOGBOOK_font); } // Fl_Button* btn_LOGBOOK_font { btnLOGBOOKdefault_colors_font = new Fl_Button(631, 123, 80, 25, _("Default")); btnLOGBOOKdefault_colors_font->callback((Fl_Callback*)cb_btnLOGBOOKdefault_colors_font); } // Fl_Button* btnLOGBOOKdefault_colors_font o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 168, 590, 147, _("DX Cluster Dialog")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = DXC_display = new Fl_Output(233, 203, 184, 25, _("Report Browser")); DXC_display->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->textfont(progdefaults.LOGGINGtextfont);o->textsize(progdefaults.LOGGINGtextsize); o->value("DX de W1HKJ-1"); o->redraw(); } // Fl_Output* DXC_display { btn_DXC_font = new Fl_Button(422, 203, 86, 25, _("Font")); btn_DXC_font->callback((Fl_Callback*)cb_btn_DXC_font); } // Fl_Button* btn_DXC_font { btnDXCdefault_colors_font = new Fl_Button(514, 203, 86, 25, _("Default")); btnDXCdefault_colors_font->callback((Fl_Callback*)cb_btnDXCdefault_colors_font); } // Fl_Button* btnDXCdefault_colors_font { Fl_Button* o = btn_DXC_even_lines = new Fl_Button(422, 234, 86, 25, _("Even Lines")); btn_DXC_even_lines->color((Fl_Color)55); btn_DXC_even_lines->callback((Fl_Callback*)cb_btn_DXC_even_lines); o->color(progdefaults.DXC_even_color); } // Fl_Button* btn_DXC_even_lines { Fl_Button* o = btn_DXC_odd_lines = new Fl_Button(514, 234, 86, 25, _("Odd Lines")); btn_DXC_odd_lines->color((Fl_Color)246); btn_DXC_odd_lines->callback((Fl_Callback*)cb_btn_DXC_odd_lines); o->color(progdefaults.DXC_odd_color); } // Fl_Button* btn_DXC_odd_lines { Fl_Input* o = StreamText = new Fl_Input(233, 273, 184, 25, _("Stream Text")); StreamText->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value("DX de W1HKJ..."); o->color(fl_rgb_color(progdefaults.DX_Color.R, progdefaults.DX_Color.G, progdefaults.DX_Color.B)); o->textfont(progdefaults.DXfontnbr); o->textsize(progdefaults.DXfontsize); o->textcolor(progdefaults.DXfontcolor); } // Fl_Input* StreamText { btnDXcolor = new Fl_Button(422, 273, 86, 25, _("Bg color")); btnDXcolor->callback((Fl_Callback*)cb_btnDXcolor); } // Fl_Button* btnDXcolor { btnDXfont = new Fl_Button(514, 273, 86, 25, _("Font")); btnDXfont->callback((Fl_Callback*)cb_btnDXfont); } // Fl_Button* btnDXfont { Fl_Button* o = btnDXalt_color = new Fl_Button(606, 272, 86, 25, _("Alt Color")); btnDXalt_color->tooltip(_("Color for outgoing telnet text")); btnDXalt_color->callback((Fl_Callback*)cb_btnDXalt_color); o->labelcolor(progdefaults.DXalt_color); } // Fl_Button* btnDXalt_color { btnDXdefault_colors_font = new Fl_Button(700, 272, 86, 25, _("Default")); btnDXdefault_colors_font->callback((Fl_Callback*)cb_btnDXdefault_colors_font); } // Fl_Button* btnDXdefault_colors_font o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Logging controls")); config_pages.push_back(p); tab_tree->add(_("Colors-Fonts/Logging controls")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Colors-Fonts/Rx-Tx")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_ListBox* o = listbox_charset_status = new Fl_ListBox(293, 40, 165, 24, _("Rx/Tx Character set")); listbox_charset_status->tooltip(_("Select Rx/Tx Character Set")); listbox_charset_status->box(FL_BORDER_BOX); listbox_charset_status->color((Fl_Color)55); listbox_charset_status->selection_color(FL_BACKGROUND_COLOR); listbox_charset_status->labeltype(FL_NORMAL_LABEL); listbox_charset_status->labelfont(0); listbox_charset_status->labelsize(14); listbox_charset_status->labelcolor(FL_FOREGROUND_COLOR); listbox_charset_status->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_charset_status->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_charset_status->callback(cb_listbox_charset, 0); listbox_charset_status->end(); } // Fl_ListBox* listbox_charset_status { RxText = new Fl_Input(293, 71, 220, 36); RxText->value("Receive Text"); RxText->color(fl_rgb_color(progdefaults.RxColor.R, progdefaults.RxColor.G, progdefaults.RxColor.B)); RxText->textfont(progdefaults.RxFontnbr); RxText->textsize(progdefaults.RxFontsize); RxText->textcolor(progdefaults.RxFontcolor); RxText->type(FL_MULTILINE_INPUT_WRAP); } // Fl_Input* RxText { btnRxColor = new Fl_Button(523, 78, 75, 21, _("Rx bkgnd")); btnRxColor->callback((Fl_Callback*)cb_btnRxColor); } // Fl_Button* btnRxColor { btnTxColor = new Fl_Button(523, 121, 75, 21, _("Tx bkgnd")); btnTxColor->callback((Fl_Callback*)cb_btnTxColor); } // Fl_Button* btnTxColor { TxText = new Fl_Input(293, 113, 220, 37); TxText->value("Transmit Text"); TxText->color(fl_rgb_color(progdefaults.TxColor.R, progdefaults.TxColor.G, progdefaults.TxColor.B)); TxText->textfont(progdefaults.TxFontnbr); TxText->textsize(progdefaults.TxFontsize); TxText->textcolor(progdefaults.TxFontcolor); TxText->type(FL_MULTILINE_INPUT_WRAP); } // Fl_Input* TxText { btnRxFont = new Fl_Button(608, 78, 75, 21, _("Rx font")); btnRxFont->callback((Fl_Callback*)cb_btnRxFont); } // Fl_Button* btnRxFont { btnTxFont = new Fl_Button(608, 121, 75, 21, _("Tx font")); btnTxFont->callback((Fl_Callback*)cb_btnTxFont); } // Fl_Button* btnTxFont { MacroText = new Fl_Input(293, 156, 220, 37); MacroText->value("Macro editor text"); MacroText->textfont(progdefaults.MacroEditFontnbr); MacroText->textsize(progdefaults.MacroEditFontsize); MacroText->type(FL_MULTILINE_INPUT_WRAP); } // Fl_Input* MacroText { btnMacroEditFont = new Fl_Button(523, 164, 120, 21, _("Macro Edit Font")); btnMacroEditFont->callback((Fl_Callback*)cb_btnMacroEditFont); } // Fl_Button* btnMacroEditFont { Fl_Group* o = new Fl_Group(283, 203, 404, 81, _("Text Highlighting")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { btnXMIT = new Fl_Button(301, 231, 40, 21, _("XMIT")); btnXMIT->tooltip(_("Sent chars in Rx/Tx pane")); btnXMIT->callback((Fl_Callback*)cb_btnXMIT); btnXMIT->align(Fl_Align(FL_ALIGN_BOTTOM)); btnXMIT->color(progdefaults.XMITcolor); } // Fl_Button* btnXMIT { btnCTRL = new Fl_Button(344, 231, 40, 21, _("CTRL")); btnCTRL->tooltip(_("Control chars in Rx/Tx pane")); btnCTRL->callback((Fl_Callback*)cb_btnCTRL); btnCTRL->align(Fl_Align(FL_ALIGN_BOTTOM)); btnCTRL->color(progdefaults.CTRLcolor); } // Fl_Button* btnCTRL { btnSKIP = new Fl_Button(388, 231, 40, 21, _("SKIP")); btnSKIP->tooltip(_("Skipped chars in Tx pane\n(Tx on/off in CW)")); btnSKIP->callback((Fl_Callback*)cb_btnSKIP); btnSKIP->align(Fl_Align(FL_ALIGN_BOTTOM)); btnSKIP->color(progdefaults.SKIPcolor); } // Fl_Button* btnSKIP { btnALTR = new Fl_Button(431, 231, 40, 21, _("ALTR")); btnALTR->tooltip(_("Alternate character color in Rx panelr")); btnALTR->callback((Fl_Callback*)cb_btnALTR); btnALTR->align(Fl_Align(FL_ALIGN_BOTTOM)); btnALTR->color(progdefaults.ALTRcolor); } // Fl_Button* btnALTR { btnSEL = new Fl_Button(475, 231, 39, 21, _("SEL")); btnSEL->tooltip(_("Selection background color in Rx Tx panels")); btnSEL->callback((Fl_Callback*)cb_btnSEL); btnSEL->align(Fl_Align(FL_ALIGN_BOTTOM)); btnSEL->color(progdefaults.RxTxSelectcolor); } // Fl_Button* btnSEL { btnNoTextColor = new Fl_Button(522, 231, 70, 21, _("System")); btnNoTextColor->callback((Fl_Callback*)cb_btnNoTextColor); } // Fl_Button* btnNoTextColor { btnTextDefaults = new Fl_Button(596, 231, 70, 21, _("Defaults")); btnTextDefaults->callback((Fl_Callback*)cb_btnTextDefaults); } // Fl_Button* btnTextDefaults o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_show_all_codes = new Fl_Check_Button(307, 295, 25, 25, _("display Rx control chars as ascii string")); btn_show_all_codes->down_box(FL_DOWN_BOX); btn_show_all_codes->callback((Fl_Callback*)cb_btn_show_all_codes); o->value(progdefaults.show_all_codes); } // Fl_Check_Button* btn_show_all_codes CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Rx-Tx")); config_pages.push_back(p); tab_tree->add(_("Colors-Fonts/Rx-Tx")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Colors-Fonts/Tabs")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { btnTabColor = new Fl_Button(396, 69, 75, 21, _("Tab Color")); btnTabColor->callback((Fl_Callback*)cb_btnTabColor); } // Fl_Button* btnTabColor { btnTabDefaultColor = new Fl_Button(526, 69, 75, 21, _("System")); btnTabDefaultColor->callback((Fl_Callback*)cb_btnTabDefaultColor); } // Fl_Button* btnTabDefaultColor CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Tabs")); config_pages.push_back(p); tab_tree->add(_("Colors-Fonts/Tabs")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Colors-Fonts/Signal Level")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { new Fl_Box(340, 39, 316, 21, _("Signal Level Indicator")); } // Fl_Box* o { Fl_Box* o = lowcolor = new Fl_Box(365, 96, 21, 21); lowcolor->box(FL_DIAMOND_DOWN_BOX); lowcolor->color(FL_FOREGROUND_COLOR); o->color(progdefaults.LowSignal); } // Fl_Box* lowcolor { btnLowSignal = new Fl_Button(402, 75, 70, 22, _("Low")); btnLowSignal->callback((Fl_Callback*)cb_btnLowSignal); } // Fl_Button* btnLowSignal { Fl_Box* o = normalcolor = new Fl_Box(365, 142, 21, 21); normalcolor->box(FL_DIAMOND_DOWN_BOX); normalcolor->color((Fl_Color)2); o->color(progdefaults.NormSignal); } // Fl_Box* normalcolor { Fl_Counter* o = cnt_normal_signal_level = new Fl_Counter(480, 99, 114, 21, _("Transition\nLevel (dB)")); cnt_normal_signal_level->minimum(-90); cnt_normal_signal_level->maximum(0); cnt_normal_signal_level->callback((Fl_Callback*)cb_cnt_normal_signal_level); cnt_normal_signal_level->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.normal_signal_level); o->lstep(1.0); } // Fl_Counter* cnt_normal_signal_level { btnNormalSignal = new Fl_Button(402, 122, 70, 21, _("Normal")); btnNormalSignal->callback((Fl_Callback*)cb_btnNormalSignal); } // Fl_Button* btnNormalSignal { Fl_Box* o = highcolor = new Fl_Box(365, 189, 21, 21); highcolor->box(FL_DIAMOND_DOWN_BOX); highcolor->color((Fl_Color)3); o->color(progdefaults.HighSignal); } // Fl_Box* highcolor { Fl_Counter* o = cnt_high_signal_level = new Fl_Counter(480, 145, 114, 21); cnt_high_signal_level->minimum(-90); cnt_high_signal_level->maximum(0); cnt_high_signal_level->callback((Fl_Callback*)cb_cnt_high_signal_level); o->value(progdefaults.high_signal_level); o->lstep(1.0); } // Fl_Counter* cnt_high_signal_level { btnHighSignal = new Fl_Button(402, 169, 70, 21, _("High")); btnHighSignal->callback((Fl_Callback*)cb_btnHighSignal); } // Fl_Button* btnHighSignal { Fl_Box* o = overcolor = new Fl_Box(365, 236, 21, 21); overcolor->box(FL_DIAMOND_DOWN_BOX); overcolor->color((Fl_Color)1); o->color(progdefaults.OverSignal); } // Fl_Box* overcolor { Fl_Counter* o = cnt_over_signal_level = new Fl_Counter(480, 192, 114, 21); cnt_over_signal_level->minimum(-90); cnt_over_signal_level->maximum(0); cnt_over_signal_level->callback((Fl_Callback*)cb_cnt_over_signal_level); o->value(progdefaults.over_signal_level); o->lstep(1.0); } // Fl_Counter* cnt_over_signal_level { btnOverSignal = new Fl_Button(402, 216, 70, 21, _("Over")); btnOverSignal->callback((Fl_Callback*)cb_btnOverSignal); } // Fl_Button* btnOverSignal { Fl_Progress* o = new Fl_Progress(295, 289, 416, 25, _("label")); o->hide(); } // Fl_Progress* o { sig_vumeter = new vumeter(322, 260, 360, 24, _("label")); sig_vumeter->box(FL_DOWN_BOX); sig_vumeter->color(FL_BACKGROUND2_COLOR); sig_vumeter->selection_color(FL_YELLOW); sig_vumeter->labeltype(FL_NORMAL_LABEL); sig_vumeter->labelfont(0); sig_vumeter->labelsize(14); sig_vumeter->labelcolor(FL_FOREGROUND_COLOR); sig_vumeter->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); sig_vumeter->when(FL_WHEN_RELEASE); } // vumeter* sig_vumeter { new Fl_Box(375, 287, 237, 17, _("Input signal level")); } // Fl_Box* o { btn_default_signal_levels = new Fl_Button(618, 146, 70, 20, _("Default")); btn_default_signal_levels->callback((Fl_Callback*)cb_btn_default_signal_levels); } // Fl_Button* btn_default_signal_levels { Fl_Check_Button* o = btn_use_wsjtx_vumeter_scale = new Fl_Check_Button(332, 315, 70, 18, _("Use wsjtx scale")); btn_use_wsjtx_vumeter_scale->tooltip(_("default scale is audo \"Vu Meter\"\nenable to emulate wsjtx scale")); btn_use_wsjtx_vumeter_scale->down_box(FL_DOWN_BOX); btn_use_wsjtx_vumeter_scale->callback((Fl_Callback*)cb_btn_use_wsjtx_vumeter_scale); o->value(progdefaults.use_wsjtx_vumeter_scale); } // Fl_Check_Button* btn_use_wsjtx_vumeter_scale CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Signal Level")); config_pages.push_back(p); tab_tree->add(_("Colors-Fonts/Signal Level")); tab_tree->close(_("Colors-Fonts")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Colors-Fonts/Digiscope")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { new Fl_Box(340, 39, 316, 21, _("Digital Scope Colors")); } // Fl_Box* o { Fl_Box* o = scope_background = new Fl_Box(365, 80, 21, 21); scope_background->box(FL_DOWN_BOX); scope_background->color(FL_FOREGROUND_COLOR); o->color(progdefaults.digi_background); } // Fl_Box* scope_background { btnScopeBackground = new Fl_Button(402, 79, 104, 22, _("Background")); btnScopeBackground->callback((Fl_Callback*)cb_btnScopeBackground); } // Fl_Button* btnScopeBackground { Fl_Box* o = scope_axis = new Fl_Box(365, 121, 21, 21); scope_axis->box(FL_DOWN_BOX); scope_axis->color((Fl_Color)2); o->color(progdefaults.digi_axis_color); } // Fl_Box* scope_axis { btnScopeAxis = new Fl_Button(402, 120, 104, 22, _("Axis")); btnScopeAxis->callback((Fl_Callback*)cb_btnScopeAxis); } // Fl_Button* btnScopeAxis { Fl_Box* o = scope_color_1 = new Fl_Box(365, 163, 21, 21); scope_color_1->box(FL_DOWN_BOX); scope_color_1->color((Fl_Color)3); o->color(progdefaults.digi_color_1); } // Fl_Box* scope_color_1 { btnScopeColor_1 = new Fl_Button(402, 162, 104, 22, _("Color 1")); btnScopeColor_1->callback((Fl_Callback*)cb_btnScopeColor_1); } // Fl_Button* btnScopeColor_1 { Fl_Box* o = scope_color_2 = new Fl_Box(365, 205, 21, 21); scope_color_2->box(FL_DOWN_BOX); scope_color_2->color((Fl_Color)1); o->color(progdefaults.digi_color_2); } // Fl_Box* scope_color_2 { btnScopeColor_2 = new Fl_Button(402, 204, 104, 22, _("Color 2")); btnScopeColor_2->callback((Fl_Callback*)cb_btnScopeColor_2); } // Fl_Button* btnScopeColor_2 { Fl_Progress* o = new Fl_Progress(295, 289, 416, 25, _("label")); o->hide(); } // Fl_Progress* o { btn_default_scope_colors = new Fl_Button(618, 146, 70, 20, _("Default")); btn_default_scope_colors->callback((Fl_Callback*)cb_btn_default_scope_colors); } // Fl_Button* btn_default_scope_colors { Fl_Box* o = scope_color_3 = new Fl_Box(365, 247, 21, 21); scope_color_3->box(FL_DOWN_BOX); scope_color_3->color((Fl_Color)1); o->color(progdefaults.digi_color_3); } // Fl_Box* scope_color_3 { btnScopeColor_3 = new Fl_Button(402, 246, 104, 22, _("Color 3")); btnScopeColor_3->callback((Fl_Callback*)cb_btnScopeColor_3); } // Fl_Button* btnScopeColor_3 { Fl_Box* o = scope_color_4 = new Fl_Box(365, 289, 21, 21); scope_color_4->box(FL_DOWN_BOX); scope_color_4->color((Fl_Color)1); o->color(progdefaults.digi_color_4); } // Fl_Box* scope_color_4 { btnScopeColor_4 = new Fl_Button(402, 288, 104, 22, _("Color 4")); btnScopeColor_4->callback((Fl_Callback*)cb_btnScopeColor_4); } // Fl_Button* btnScopeColor_4 CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Colors-Fonts/Digiscope")); config_pages.push_back(p); tab_tree->add(_("Colors-Fonts/Digiscope")); tab_tree->close(_("Colors-Fonts")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Contests/General")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_ListBox* o = listbox_contest = new Fl_ListBox(287, 41, 500, 24, _("Contest")); listbox_contest->tooltip(_("Select Logging as QSO or Contest")); listbox_contest->box(FL_DOWN_BOX); listbox_contest->color(FL_BACKGROUND2_COLOR); listbox_contest->selection_color(FL_BACKGROUND_COLOR); listbox_contest->labeltype(FL_NORMAL_LABEL); listbox_contest->labelfont(0); listbox_contest->labelsize(14); listbox_contest->labelcolor(FL_FOREGROUND_COLOR); listbox_contest->callback((Fl_Callback*)cb_listbox_contest); listbox_contest->align(Fl_Align(FL_ALIGN_LEFT)); listbox_contest->when(FL_WHEN_RELEASE); o->add(contest_names().c_str()); o->index(progdefaults.logging); listbox_contest->end(); } // Fl_ListBox* listbox_contest { Fl_ListBox* o = listbox_QP_contests = new Fl_ListBox(367, 75, 420, 24, _("State QSO Party")); listbox_QP_contests->box(FL_DOWN_BOX); listbox_QP_contests->color(FL_BACKGROUND2_COLOR); listbox_QP_contests->selection_color(FL_BACKGROUND_COLOR); listbox_QP_contests->labeltype(FL_NORMAL_LABEL); listbox_QP_contests->labelfont(0); listbox_QP_contests->labelsize(14); listbox_QP_contests->labelcolor(FL_FOREGROUND_COLOR); listbox_QP_contests->callback((Fl_Callback*)cb_listbox_QP_contests); listbox_QP_contests->align(Fl_Align(FL_ALIGN_LEFT)); listbox_QP_contests->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->add(QSOparties.names().c_str()); o->index(progdefaults.SQSOcontest); listbox_QP_contests->end(); } // Fl_ListBox* listbox_QP_contests { Fl_Input2* o = inp_contest_notes = new Fl_Input2(367, 110, 420, 24, _("Text capture order")); inp_contest_notes->tooltip(_("Context Notes")); inp_contest_notes->box(FL_DOWN_BOX); inp_contest_notes->color(FL_BACKGROUND2_COLOR); inp_contest_notes->selection_color(FL_SELECTION_COLOR); inp_contest_notes->labeltype(FL_NORMAL_LABEL); inp_contest_notes->labelfont(0); inp_contest_notes->labelsize(14); inp_contest_notes->labelcolor(FL_FOREGROUND_COLOR); inp_contest_notes->align(Fl_Align(FL_ALIGN_LEFT)); inp_contest_notes->when(FL_WHEN_RELEASE); o->value(progdefaults.CONTESTnotes.c_str()); } // Fl_Input2* inp_contest_notes { Fl_Group* o = new Fl_Group(204, 149, 590, 86, _("Duplicate check, CALL plus")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Light_Button* o = btnDupCheckOn = new Fl_Light_Button(221, 174, 74, 20, _("On/Off")); btnDupCheckOn->tooltip(_("Check for duplicates")); btnDupCheckOn->selection_color((Fl_Color)2); btnDupCheckOn->callback((Fl_Callback*)cb_btnDupCheckOn); o->value(progdefaults.EnableDupCheck); } // Fl_Light_Button* btnDupCheckOn { Fl_Check_Button* o = btnDupBand = new Fl_Check_Button(333, 174, 70, 20, _("Band")); btnDupBand->tooltip(_("Bands must match")); btnDupBand->down_box(FL_DOWN_BOX); btnDupBand->callback((Fl_Callback*)cb_btnDupBand); o->value(progdefaults.dupband); } // Fl_Check_Button* btnDupBand { Fl_Check_Button* o = btnDupMode = new Fl_Check_Button(446, 174, 70, 20, _("Mode")); btnDupMode->tooltip(_("Mode must match")); btnDupMode->down_box(FL_DOWN_BOX); btnDupMode->callback((Fl_Callback*)cb_btnDupMode); o->value(progdefaults.dupmode); } // Fl_Check_Button* btnDupMode { Fl_Check_Button* o = btnDupTimeSpan = new Fl_Check_Button(571, 174, 129, 20, _("Time span over")); btnDupTimeSpan->tooltip(_("QSO must not occur within a time period of")); btnDupTimeSpan->down_box(FL_DOWN_BOX); btnDupTimeSpan->callback((Fl_Callback*)cb_btnDupTimeSpan); o->value(progdefaults.duptimespan); } // Fl_Check_Button* btnDupTimeSpan { Fl_Button* o = btnDupColor = new Fl_Button(221, 201, 90, 24, _("Dup Color")); btnDupColor->tooltip(_("Left click to select dup color")); btnDupColor->box(FL_DOWN_BOX); btnDupColor->down_box(FL_DOWN_BOX); btnDupColor->color(FL_BACKGROUND2_COLOR); btnDupColor->selection_color(FL_BACKGROUND2_COLOR); btnDupColor->callback((Fl_Callback*)cb_btnDupColor); o->color(fl_rgb_color(progdefaults.dup_color.R, progdefaults.dup_color.G, progdefaults.dup_color.B)); } // Fl_Button* btnDupColor { Fl_Button* o = btnPossibleDupColor = new Fl_Button(333, 201, 90, 24, _("? Dup Color")); btnPossibleDupColor->tooltip(_("Left click to select possible dup color")); btnPossibleDupColor->box(FL_DOWN_BOX); btnPossibleDupColor->down_box(FL_DOWN_BOX); btnPossibleDupColor->color(FL_BACKGROUND2_COLOR); btnPossibleDupColor->selection_color(FL_BACKGROUND2_COLOR); btnPossibleDupColor->callback((Fl_Callback*)cb_btnPossibleDupColor); o->color(fl_rgb_color(progdefaults.possible_dup_color.R, progdefaults.possible_dup_color.G, progdefaults.possible_dup_color.B)); } // Fl_Button* btnPossibleDupColor { Fl_Check_Button* o = btnDupXchg1 = new Fl_Check_Button(446, 203, 105, 20, _("Exchange In")); btnDupXchg1->tooltip(_("free form 1 must match")); btnDupXchg1->down_box(FL_DOWN_BOX); btnDupXchg1->callback((Fl_Callback*)cb_btnDupXchg1); o->value(progdefaults.dupxchg1); } // Fl_Check_Button* btnDupXchg1 { Fl_Check_Button* o = btnDupState = new Fl_Check_Button(571, 203, 70, 20, _("State")); btnDupState->tooltip(_("State must match")); btnDupState->down_box(FL_DOWN_BOX); btnDupState->callback((Fl_Callback*)cb_btnDupState); o->value(progdefaults.dupstate); } // Fl_Check_Button* btnDupState { Fl_Value_Input2* o = nbrTimeSpan = new Fl_Value_Input2(664, 201, 53, 24, _("minutes")); nbrTimeSpan->tooltip(_("Enter time span in minutes")); nbrTimeSpan->box(FL_DOWN_BOX); nbrTimeSpan->color(FL_BACKGROUND2_COLOR); nbrTimeSpan->selection_color(FL_SELECTION_COLOR); nbrTimeSpan->labeltype(FL_NORMAL_LABEL); nbrTimeSpan->labelfont(0); nbrTimeSpan->labelsize(14); nbrTimeSpan->labelcolor(FL_FOREGROUND_COLOR); nbrTimeSpan->maximum(1440); nbrTimeSpan->step(1); nbrTimeSpan->value(120); nbrTimeSpan->callback((Fl_Callback*)cb_nbrTimeSpan); nbrTimeSpan->align(Fl_Align(FL_ALIGN_RIGHT)); nbrTimeSpan->when(FL_WHEN_CHANGED); o->value(progdefaults.timespan); } // Fl_Value_Input2* nbrTimeSpan o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(204, 233, 590, 100, _("Contest Exchange / Serial #")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = inpSend1 = new Fl_Input2(269, 257, 200, 24, _("Send")); inpSend1->tooltip(_("free form exchange")); inpSend1->box(FL_DOWN_BOX); inpSend1->color(FL_BACKGROUND2_COLOR); inpSend1->selection_color(FL_SELECTION_COLOR); inpSend1->labeltype(FL_NORMAL_LABEL); inpSend1->labelfont(0); inpSend1->labelsize(14); inpSend1->labelcolor(FL_FOREGROUND_COLOR); inpSend1->callback((Fl_Callback*)cb_inpSend1); inpSend1->align(Fl_Align(FL_ALIGN_LEFT)); inpSend1->when(FL_WHEN_RELEASE); o->value(progdefaults.myXchg.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpSend1 { Fl_Check_Button* o = btn599 = new Fl_Check_Button(484, 259, 130, 20, _("RST always 599/59")); btn599->tooltip(_("Force RST in/out to 599/59")); btn599->down_box(FL_DOWN_BOX); btn599->callback((Fl_Callback*)cb_btn599); o->value(progdefaults.fixed599); } // Fl_Check_Button* btn599 { Fl_Check_Button* o = btnCutNbrs = new Fl_Check_Button(644, 259, 139, 20, _("Send CW cut #\'s")); btnCutNbrs->tooltip(_("0 = T; 9 = N")); btnCutNbrs->down_box(FL_DOWN_BOX); btnCutNbrs->callback((Fl_Callback*)cb_btnCutNbrs); o->value(progdefaults.cutnbrs); } // Fl_Check_Button* btnCutNbrs { Fl_Group* o = new Fl_Group(211, 286, 576, 42); o->box(FL_ENGRAVED_FRAME); { Fl_Value_Input2* o = nbrContestStart = new Fl_Value_Input2(298, 295, 45, 24, _("Start Nbr")); nbrContestStart->tooltip(_("Starting number")); nbrContestStart->box(FL_DOWN_BOX); nbrContestStart->color(FL_BACKGROUND2_COLOR); nbrContestStart->selection_color(FL_SELECTION_COLOR); nbrContestStart->labeltype(FL_NORMAL_LABEL); nbrContestStart->labelfont(0); nbrContestStart->labelsize(14); nbrContestStart->labelcolor(FL_FOREGROUND_COLOR); nbrContestStart->maximum(10000); nbrContestStart->step(1); nbrContestStart->callback((Fl_Callback*)cb_nbrContestStart); nbrContestStart->align(Fl_Align(FL_ALIGN_LEFT)); nbrContestStart->when(FL_WHEN_CHANGED); o->value(progdefaults.ContestStart); } // Fl_Value_Input2* nbrContestStart { nbrContestDigits = new Fl_Value_Input2(420, 295, 46, 24, _("Digits")); nbrContestDigits->tooltip(_("Number of digits in serial number")); nbrContestDigits->box(FL_DOWN_BOX); nbrContestDigits->color(FL_BACKGROUND2_COLOR); nbrContestDigits->selection_color(FL_SELECTION_COLOR); nbrContestDigits->labeltype(FL_NORMAL_LABEL); nbrContestDigits->labelfont(0); nbrContestDigits->labelsize(14); nbrContestDigits->labelcolor(FL_FOREGROUND_COLOR); nbrContestDigits->minimum(1); nbrContestDigits->maximum(5); nbrContestDigits->step(1); nbrContestDigits->value(3); nbrContestDigits->callback((Fl_Callback*)cb_nbrContestDigits); nbrContestDigits->align(Fl_Align(FL_ALIGN_LEFT)); nbrContestDigits->when(FL_WHEN_CHANGED); } // Fl_Value_Input2* nbrContestDigits { btnUseLeadingZeros = new Fl_Check_Button(485, 297, 157, 20, _("Use leading zeros")); btnUseLeadingZeros->tooltip(_("Insert leading zeros into Xmtd serial number")); btnUseLeadingZeros->down_box(FL_DOWN_BOX); btnUseLeadingZeros->value(1); btnUseLeadingZeros->callback((Fl_Callback*)cb_btnUseLeadingZeros); } // Fl_Check_Button* btnUseLeadingZeros { btnResetSerNbr = new Fl_Button(682, 295, 71, 24, _("Reset")); btnResetSerNbr->tooltip(_("Initialize the QSO logging fields")); btnResetSerNbr->callback((Fl_Callback*)cb_btnResetSerNbr); } // Fl_Button* btnResetSerNbr o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Contests/General")); config_pages.push_back(p); tab_tree->add(_("Contests/General")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Contests/Field Day")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Input2* o = inp_my_FD_call = new Fl_Input2(346, 73, 80, 24, _("Operator Call")); inp_my_FD_call->tooltip(_("Field Day Callsign\nMay be same as OP callsign")); inp_my_FD_call->box(FL_DOWN_BOX); inp_my_FD_call->color(FL_BACKGROUND2_COLOR); inp_my_FD_call->selection_color(FL_SELECTION_COLOR); inp_my_FD_call->labeltype(FL_NORMAL_LABEL); inp_my_FD_call->labelfont(0); inp_my_FD_call->labelsize(14); inp_my_FD_call->labelcolor(FL_FOREGROUND_COLOR); inp_my_FD_call->callback((Fl_Callback*)cb_inp_my_FD_call); inp_my_FD_call->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_FD_call->when(FL_WHEN_RELEASE); o->value(progdefaults.fd_op_call.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_FD_call { Fl_Input2* o = inp_my_FD_section = new Fl_Input2(654, 73, 45, 24, _("My Section")); inp_my_FD_section->tooltip(_("Field Day Section")); inp_my_FD_section->box(FL_DOWN_BOX); inp_my_FD_section->color(FL_BACKGROUND2_COLOR); inp_my_FD_section->selection_color(FL_SELECTION_COLOR); inp_my_FD_section->labeltype(FL_NORMAL_LABEL); inp_my_FD_section->labelfont(0); inp_my_FD_section->labelsize(14); inp_my_FD_section->labelcolor(FL_FOREGROUND_COLOR); inp_my_FD_section->callback((Fl_Callback*)cb_inp_my_FD_section); inp_my_FD_section->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_FD_section->when(FL_WHEN_RELEASE); o->value(progdefaults.my_FD_section.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_FD_section { Fl_Input2* o = inp_my_FD_class = new Fl_Input2(507, 73, 50, 24, _("My Class")); inp_my_FD_class->tooltip(_("Field Day Class")); inp_my_FD_class->box(FL_DOWN_BOX); inp_my_FD_class->color(FL_BACKGROUND2_COLOR); inp_my_FD_class->selection_color(FL_SELECTION_COLOR); inp_my_FD_class->labeltype(FL_NORMAL_LABEL); inp_my_FD_class->labelfont(0); inp_my_FD_class->labelsize(14); inp_my_FD_class->labelcolor(FL_FOREGROUND_COLOR); inp_my_FD_class->callback((Fl_Callback*)cb_inp_my_FD_class); inp_my_FD_class->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_FD_class->when(FL_WHEN_RELEASE); o->value(progdefaults.my_FD_class.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_FD_class CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Contests/Field Day")); config_pages.push_back(p); tab_tree->add(_("Contests/Field Day")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Contests/JOTA School")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(211, 137, 580, 53, _("School Round Up")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = inp_my_SCR_class = new Fl_Input2(397, 159, 69, 24, _("My Class")); inp_my_SCR_class->tooltip(_("School Round Up - allowable I, H, O - see rules")); inp_my_SCR_class->box(FL_DOWN_BOX); inp_my_SCR_class->color(FL_BACKGROUND2_COLOR); inp_my_SCR_class->selection_color(FL_SELECTION_COLOR); inp_my_SCR_class->labeltype(FL_NORMAL_LABEL); inp_my_SCR_class->labelfont(0); inp_my_SCR_class->labelsize(14); inp_my_SCR_class->labelcolor(FL_FOREGROUND_COLOR); inp_my_SCR_class->callback((Fl_Callback*)cb_inp_my_SCR_class); inp_my_SCR_class->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_SCR_class->when(FL_WHEN_RELEASE); o->value(progdefaults.my_SCR_class.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_SCR_class o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(211, 44, 580, 89, _("Jamboree OTA")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = inp_my_JOTA_troop = new Fl_Input2(396, 67, 200, 24, _("My Troop")); inp_my_JOTA_troop->tooltip(_("My JOTA Troop")); inp_my_JOTA_troop->box(FL_DOWN_BOX); inp_my_JOTA_troop->color(FL_BACKGROUND2_COLOR); inp_my_JOTA_troop->selection_color(FL_SELECTION_COLOR); inp_my_JOTA_troop->labeltype(FL_NORMAL_LABEL); inp_my_JOTA_troop->labelfont(0); inp_my_JOTA_troop->labelsize(14); inp_my_JOTA_troop->labelcolor(FL_FOREGROUND_COLOR); inp_my_JOTA_troop->callback((Fl_Callback*)cb_inp_my_JOTA_troop); inp_my_JOTA_troop->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_JOTA_troop->when(FL_WHEN_RELEASE); o->value(progdefaults.my_JOTA_troop.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_JOTA_troop { Fl_Input2* o = inp_my_JOTA_scout = new Fl_Input2(396, 98, 200, 24, _("Scout Op\'")); inp_my_JOTA_scout->tooltip(_("Scout Operator Name")); inp_my_JOTA_scout->box(FL_DOWN_BOX); inp_my_JOTA_scout->color(FL_BACKGROUND2_COLOR); inp_my_JOTA_scout->selection_color(FL_SELECTION_COLOR); inp_my_JOTA_scout->labeltype(FL_NORMAL_LABEL); inp_my_JOTA_scout->labelfont(0); inp_my_JOTA_scout->labelsize(14); inp_my_JOTA_scout->labelcolor(FL_FOREGROUND_COLOR); inp_my_JOTA_scout->callback((Fl_Callback*)cb_inp_my_JOTA_scout); inp_my_JOTA_scout->align(Fl_Align(FL_ALIGN_LEFT)); inp_my_JOTA_scout->when(FL_WHEN_RELEASE); o->value(progdefaults.my_JOTA_scout.c_str()); inpSend1->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inp_my_JOTA_scout o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Contests/JOTA School")); config_pages.push_back(p); tab_tree->add(_("Contests/JOTA School")); tab_tree->close(_("Contests")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("IDs/CW")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { sld = new Fl_Group(234, 83, 536, 127, _("CW Postamble ID")); sld->box(FL_ENGRAVED_FRAME); sld->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnCWID = new Fl_Check_Button(287, 121, 140, 24, _("Transmit callsign")); btnCWID->tooltip(_("Send Callsign in CW at end of every transmission")); btnCWID->down_box(FL_DOWN_BOX); btnCWID->callback((Fl_Callback*)cb_btnCWID); o->value(progdefaults.CWid); } // Fl_Check_Button* btnCWID { Fl_Value_Slider2* o = sldrCWIDwpm = new Fl_Value_Slider2(287, 164, 180, 20, _("Speed (WPM):")); sldrCWIDwpm->tooltip(_("Send at this WPM")); sldrCWIDwpm->type(1); sldrCWIDwpm->box(FL_DOWN_BOX); sldrCWIDwpm->color(FL_BACKGROUND_COLOR); sldrCWIDwpm->selection_color(FL_BACKGROUND_COLOR); sldrCWIDwpm->labeltype(FL_NORMAL_LABEL); sldrCWIDwpm->labelfont(0); sldrCWIDwpm->labelsize(14); sldrCWIDwpm->labelcolor(FL_FOREGROUND_COLOR); sldrCWIDwpm->minimum(15); sldrCWIDwpm->maximum(40); sldrCWIDwpm->step(1); sldrCWIDwpm->value(18); sldrCWIDwpm->textsize(14); sldrCWIDwpm->callback((Fl_Callback*)cb_sldrCWIDwpm); sldrCWIDwpm->align(Fl_Align(FL_ALIGN_TOP)); sldrCWIDwpm->when(FL_WHEN_CHANGED); o->value(progdefaults.CWIDwpm); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWIDwpm { bCWIDModes = new Fl_Button(485, 121, 120, 24, _("CW ID modes")); bCWIDModes->callback((Fl_Callback*)cb_bCWIDModes); } // Fl_Button* bCWIDModes sld->end(); } // Fl_Group* sld CONFIG_PAGE *p = new CONFIG_PAGE(o, _("IDs/CW")); config_pages.push_back(p); tab_tree->add(_("IDs/CW")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("IDs/RsID")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(216, 20, 560, 220, _("Reed-Solomon ID (Rx)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkRSidNotifyOnly = new Fl_Check_Button(241, 87, 168, 20, _("Notify only")); chkRSidNotifyOnly->tooltip(_("Check this to be notified when an RSID is received\nwithout changing modem an\ d frequency")); chkRSidNotifyOnly->down_box(FL_DOWN_BOX); chkRSidNotifyOnly->callback((Fl_Callback*)cb_chkRSidNotifyOnly); chkRSidNotifyOnly->value(progdefaults.rsid_notify_only); } // Fl_Check_Button* chkRSidNotifyOnly { bRSIDRxModes = new Fl_Button(224, 46, 87, 24, _("Rx modes")); bRSIDRxModes->callback((Fl_Callback*)cb_bRSIDRxModes); } // Fl_Button* bRSIDRxModes { chkRSidMark = new Fl_Check_Button(241, 147, 203, 20, _("Mark prev freq/mode")); chkRSidMark->tooltip(_("Insert RX text marker before\nchanging frequency and modem")); chkRSidMark->down_box(FL_DOWN_BOX); chkRSidMark->callback((Fl_Callback*)cb_chkRSidMark); chkRSidMark->value(progdefaults.rsid_mark); } // Fl_Check_Button* chkRSidMark { Fl_ListBox* o = listbox_rsid_errors = new Fl_ListBox(224, 208, 100, 22, _("Allow errors")); listbox_rsid_errors->tooltip(_("Low = zero errors\nMedium = 1 error\nHigh = 2 errors")); listbox_rsid_errors->box(FL_DOWN_BOX); listbox_rsid_errors->color(FL_BACKGROUND2_COLOR); listbox_rsid_errors->selection_color(FL_BACKGROUND_COLOR); listbox_rsid_errors->labeltype(FL_NORMAL_LABEL); listbox_rsid_errors->labelfont(0); listbox_rsid_errors->labelsize(14); listbox_rsid_errors->labelcolor(FL_FOREGROUND_COLOR); listbox_rsid_errors->callback((Fl_Callback*)cb_listbox_rsid_errors); listbox_rsid_errors->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_rsid_errors->when(FL_WHEN_RELEASE); listbox_rsid_errors->add(_("Low")); listbox_rsid_errors->add(_("Medium")); listbox_rsid_errors->add(_("High")); listbox_rsid_errors->index(progdefaults.RsID_label_type); o->labelsize(FL_NORMAL_SIZE); listbox_rsid_errors->end(); } // Fl_ListBox* listbox_rsid_errors { Fl_Check_Button* o = chkRSidShowAlert = new Fl_Check_Button(464, 87, 203, 20, _("Disable alert dialog")); chkRSidShowAlert->tooltip(_("Do not show RsID alert dialog box")); chkRSidShowAlert->down_box(FL_DOWN_BOX); chkRSidShowAlert->callback((Fl_Callback*)cb_chkRSidShowAlert); o->value(progdefaults.disable_rsid_warning_dialog_box); } // Fl_Check_Button* chkRSidShowAlert { chkRSidAutoDisable = new Fl_Check_Button(464, 113, 203, 20, _("Disables detector")); chkRSidAutoDisable->tooltip(_("Disable further detection when RSID is received")); chkRSidAutoDisable->down_box(FL_DOWN_BOX); chkRSidAutoDisable->callback((Fl_Callback*)cb_chkRSidAutoDisable); if (progdefaults.rsid_notify_only) progdefaults.rsid_auto_disable = false; chkRSidAutoDisable->value(progdefaults.rsid_auto_disable); if (progdefaults.rsid_notify_only) chkRSidAutoDisable->deactivate(); } // Fl_Check_Button* chkRSidAutoDisable { Fl_Check_Button* o = chkRetainFreqLock = new Fl_Check_Button(241, 117, 203, 20, _("Retain tx freq lock")); chkRetainFreqLock->tooltip(_("Retain TX lock frequency (Lk) when changing to RX RsID frequency")); chkRetainFreqLock->down_box(FL_DOWN_BOX); chkRetainFreqLock->callback((Fl_Callback*)cb_chkRetainFreqLock); o->value(progdefaults.retain_freq_lock); } // Fl_Check_Button* chkRetainFreqLock { Fl_Check_Button* o = chkDisableFreqChange = new Fl_Check_Button(464, 147, 203, 20, _("Disable freq change")); chkDisableFreqChange->tooltip(_("Do not automatically change to RX RsID frequency")); chkDisableFreqChange->down_box(FL_DOWN_BOX); chkDisableFreqChange->callback((Fl_Callback*)cb_chkDisableFreqChange); o->value(progdefaults.disable_rsid_freq_change); } // Fl_Check_Button* chkDisableFreqChange { Fl_Check_Button* o = chk_RSID_EOT = new Fl_Check_Button(464, 177, 232, 20, _("Rx/Tx RsID EOT")); chk_RSID_EOT->tooltip(_("Do not automatically change to RX RsID frequency")); chk_RSID_EOT->down_box(FL_DOWN_BOX); chk_RSID_EOT->callback((Fl_Callback*)cb_chk_RSID_EOT); o->value(progdefaults.rsid_eot_squelch); } // Fl_Check_Button* chk_RSID_EOT { Fl_Counter* o = val_RSIDsquelch = new Fl_Counter(444, 208, 140, 21, _("Squelch open (sec)")); val_RSIDsquelch->tooltip(_("Use for triggering amplifier carrier detect")); val_RSIDsquelch->minimum(0); val_RSIDsquelch->maximum(300); val_RSIDsquelch->step(1); val_RSIDsquelch->callback((Fl_Callback*)cb_val_RSIDsquelch); val_RSIDsquelch->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.rsid_squelch); o->lstep(10.0); } // Fl_Counter* val_RSIDsquelch { Fl_Group* o = new Fl_Group(336, 43, 406, 38, _("The RsID notification message contents and display\ncharacteristics are confi\ gured on the \"Notifications\" tab.")); o->box(FL_BORDER_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(216, 243, 180, 100, _("Pre-Signal Tone")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = val_pretone = new Fl_Counter(228, 281, 120, 21, _("Seconds")); val_pretone->tooltip(_("Use for triggering amplifier carrier detect")); val_pretone->minimum(0); val_pretone->maximum(10); val_pretone->callback((Fl_Callback*)cb_val_pretone); o->value(progdefaults.pretone); } // Fl_Counter* val_pretone o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(406, 243, 180, 100, _("Reed-Solomon ID (Tx)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { bRSIDTxModes = new Fl_Button(412, 269, 130, 26, _("Transmit modes")); bRSIDTxModes->callback((Fl_Callback*)cb_bRSIDTxModes); } // Fl_Button* bRSIDTxModes { Fl_Check_Button* o = btn_post_rsid = new Fl_Check_Button(426, 306, 97, 18, _("End of xmt ID")); btn_post_rsid->tooltip(_("Add RsID signal to end of transmission")); btn_post_rsid->down_box(FL_DOWN_BOX); btn_post_rsid->callback((Fl_Callback*)cb_btn_post_rsid); o->value(progdefaults.rsid_post); } // Fl_Check_Button* btn_post_rsid o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(596, 243, 180, 100, _("Min BW Detection")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = val_rsid_min_bw = new Fl_Counter(635, 271, 100, 21, _("Hertz")); val_rsid_min_bw->tooltip(_("Minimum bandwidth")); val_rsid_min_bw->type(1); val_rsid_min_bw->minimum(180); val_rsid_min_bw->maximum(1000); val_rsid_min_bw->step(10); val_rsid_min_bw->value(200); val_rsid_min_bw->callback((Fl_Callback*)cb_val_rsid_min_bw); o->value(progdefaults.rsid_min_bw); } // Fl_Counter* val_rsid_min_bw { Fl_Check_Button* o = chkRSidWideSearch = new Fl_Check_Button(601, 316, 93, 20, _("Passband")); chkRSidWideSearch->tooltip(_("ON - search over entire waterfall\nOFF - limit search to BW selector")); chkRSidWideSearch->down_box(FL_DOWN_BOX); chkRSidWideSearch->callback((Fl_Callback*)cb_chkRSidWideSearch); o->value(progdefaults.rsidWideSearch); } // Fl_Check_Button* chkRSidWideSearch { btn_rsid_default_bw = new Fl_Button(696, 315, 70, 20, _("Default")); btn_rsid_default_bw->callback((Fl_Callback*)cb_btn_rsid_default_bw); } // Fl_Button* btn_rsid_default_bw o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("IDs/RsID")); config_pages.push_back(p); tab_tree->add(_("IDs/RsID")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("IDs/Video")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(237, 47, 536, 189, _("Video Preamble ID")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnsendid = new Fl_Check_Button(255, 81, 150, 20, _("Transmit mode ID")); btnsendid->tooltip(_("Waterfall video ID")); btnsendid->down_box(FL_DOWN_BOX); btnsendid->callback((Fl_Callback*)cb_btnsendid); } // Fl_Check_Button* btnsendid { Fl_Check_Button* o = btnsendvideotext = new Fl_Check_Button(255, 113, 155, 20, _("Transmit video text")); btnsendvideotext->tooltip(_("Waterfall video text")); btnsendvideotext->down_box(FL_DOWN_BOX); btnsendvideotext->callback((Fl_Callback*)cb_btnsendvideotext); o->value(progdefaults.sendtextid); } // Fl_Check_Button* btnsendvideotext { Fl_Input2* o = valVideotext = new Fl_Input2(422, 111, 323, 24, _(":")); valVideotext->tooltip(_("Limit to a few characters,\nas in CQEM or IOTA etc.")); valVideotext->box(FL_DOWN_BOX); valVideotext->color(FL_BACKGROUND2_COLOR); valVideotext->selection_color(FL_SELECTION_COLOR); valVideotext->labeltype(FL_NORMAL_LABEL); valVideotext->labelfont(0); valVideotext->labelsize(14); valVideotext->labelcolor(FL_FOREGROUND_COLOR); valVideotext->callback((Fl_Callback*)cb_valVideotext); valVideotext->align(Fl_Align(FL_ALIGN_LEFT)); valVideotext->when(FL_WHEN_RELEASE); o->value(progdefaults.strTextid.c_str()); valVideotext->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* valVideotext { Fl_Check_Button* o = chkID_SMALL = new Fl_Check_Button(255, 145, 120, 20, _("Use small font")); chkID_SMALL->tooltip(_("ON - small font\nOFF - large font")); chkID_SMALL->down_box(FL_DOWN_BOX); chkID_SMALL->value(1); chkID_SMALL->callback((Fl_Callback*)cb_chkID_SMALL); o->value(progdefaults.ID_SMALL); } // Fl_Check_Button* chkID_SMALL { Fl_Value_Slider2* o = sldrVideowidth = new Fl_Value_Slider2(495, 143, 125, 24, _("Chars/Row:")); sldrVideowidth->tooltip(_("Set the number of characters per row")); sldrVideowidth->type(1); sldrVideowidth->box(FL_DOWN_BOX); sldrVideowidth->color(FL_BACKGROUND_COLOR); sldrVideowidth->selection_color(FL_BACKGROUND_COLOR); sldrVideowidth->labeltype(FL_NORMAL_LABEL); sldrVideowidth->labelfont(0); sldrVideowidth->labelsize(14); sldrVideowidth->labelcolor(FL_FOREGROUND_COLOR); sldrVideowidth->minimum(1); sldrVideowidth->maximum(8); sldrVideowidth->step(1); sldrVideowidth->value(4); sldrVideowidth->textsize(14); sldrVideowidth->callback((Fl_Callback*)cb_sldrVideowidth); sldrVideowidth->align(Fl_Align(FL_ALIGN_LEFT)); sldrVideowidth->when(FL_WHEN_CHANGED); o->value(progdefaults.videowidth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrVideowidth { Fl_Check_Button* o = btn_vidlimit = new Fl_Check_Button(255, 177, 110, 15, _("500 Hz limit")); btn_vidlimit->down_box(FL_DOWN_BOX); btn_vidlimit->callback((Fl_Callback*)cb_btn_vidlimit); o->value(progdefaults.vidlimit); } // Fl_Check_Button* btn_vidlimit { Fl_Check_Button* o = btn_vidmodelimit = new Fl_Check_Button(255, 205, 110, 15, _("Mode width limit")); btn_vidmodelimit->down_box(FL_DOWN_BOX); btn_vidmodelimit->callback((Fl_Callback*)cb_btn_vidmodelimit); o->value(progdefaults.vidmodelimit); } // Fl_Check_Button* btn_vidmodelimit { bVideoIDModes = new Fl_Button(625, 78, 120, 24, _("Video ID modes")); bVideoIDModes->callback((Fl_Callback*)cb_bVideoIDModes); } // Fl_Button* bVideoIDModes o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("IDs/Video")); config_pages.push_back(p); tab_tree->add(_("IDs/Video")); tab_tree->close(_("IDs")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Logging/MacLogger")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Check_Button* o = btnConnectToMaclogger = new Fl_Check_Button(211, 35, 186, 20, _("Connect to MacLogger")); btnConnectToMaclogger->down_box(FL_DOWN_BOX); btnConnectToMaclogger->callback((Fl_Callback*)cb_btnConnectToMaclogger); o->value(progdefaults.connect_to_maclogger); } // Fl_Check_Button* btnConnectToMaclogger { Fl_Check_Button* o = btn_capture_maclogger_radio = new Fl_Check_Button(406, 35, 186, 20, _("Capture Radio Report")); btn_capture_maclogger_radio->down_box(FL_DOWN_BOX); btn_capture_maclogger_radio->value(1); btn_capture_maclogger_radio->callback((Fl_Callback*)cb_btn_capture_maclogger_radio); o->value(progdefaults.capture_maclogger_radio); } // Fl_Check_Button* btn_capture_maclogger_radio { Fl_Check_Button* o = btn_capture_maclogger_log = new Fl_Check_Button(406, 60, 186, 21, _("Capture Log Report")); btn_capture_maclogger_log->down_box(FL_DOWN_BOX); btn_capture_maclogger_log->callback((Fl_Callback*)cb_btn_capture_maclogger_log); o->value(progdefaults.capture_maclogger_log); } // Fl_Check_Button* btn_capture_maclogger_log { Fl_Check_Button* o = btn_capture_maclogger_lookup = new Fl_Check_Button(606, 35, 186, 20, _("Capture Lookup ")); btn_capture_maclogger_lookup->down_box(FL_DOWN_BOX); btn_capture_maclogger_lookup->callback((Fl_Callback*)cb_btn_capture_maclogger_lookup); o->value(progdefaults.capture_maclogger_lookup); } // Fl_Check_Button* btn_capture_maclogger_lookup { Fl_Check_Button* o = btn_capture_maclogger_spot_tune = new Fl_Check_Button(606, 60, 186, 21, _("Capture Spot Tune")); btn_capture_maclogger_spot_tune->down_box(FL_DOWN_BOX); btn_capture_maclogger_spot_tune->callback((Fl_Callback*)cb_btn_capture_maclogger_spot_tune); o->value(progdefaults.capture_maclogger_spot_tune); } // Fl_Check_Button* btn_capture_maclogger_spot_tune { Fl_Check_Button* o = btn_capture_maclogger_spot_report = new Fl_Check_Button(606, 88, 186, 21, _("Capture Spot Report")); btn_capture_maclogger_spot_report->down_box(FL_DOWN_BOX); btn_capture_maclogger_spot_report->callback((Fl_Callback*)cb_btn_capture_maclogger_spot_report); o->value(progdefaults.capture_maclogger_spot_report); } // Fl_Check_Button* btn_capture_maclogger_spot_report { Fl_Check_Button* o = btn_enable_maclogger_log = new Fl_Check_Button(211, 117, 165, 26, _("Enable UDP log file")); btn_enable_maclogger_log->down_box(FL_DOWN_BOX); btn_enable_maclogger_log->callback((Fl_Callback*)cb_btn_enable_maclogger_log); o->value(progdefaults.enable_maclogger_log); } // Fl_Check_Button* btn_enable_maclogger_log { Fl_Text_Display* o = txt_UDP_data = new Fl_Text_Display(210, 164, 580, 161, _("UDP data stream")); txt_UDP_data->align(Fl_Align(FL_ALIGN_TOP_LEFT)); Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer(); o->buffer(txtbuffer); } // Fl_Text_Display* txt_UDP_data { Fl_Output* o = txt_maclogger_log_filename = new Fl_Output(379, 117, 272, 26); o->value(progdefaults.maclogger_log_filename.c_str()); } // Fl_Output* txt_maclogger_log_filename { Fl_Button* o = new Fl_Button(661, 117, 129, 26, _("Clear UDP text")); o->callback((Fl_Callback*)cb_Clear); } // Fl_Button* o { Fl_Check_Button* o = btn_maclogger_spot_rx = new Fl_Check_Button(406, 88, 186, 21, _("Tune to Rx Spot")); btn_maclogger_spot_rx->tooltip(_("ON - use Rx spot freq\nOFF - use Tx spot freq")); btn_maclogger_spot_rx->down_box(FL_DOWN_BOX); btn_maclogger_spot_rx->callback((Fl_Callback*)cb_btn_maclogger_spot_rx); o->value(progdefaults.maclogger_spot_rx); } // Fl_Check_Button* btn_maclogger_spot_rx CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/MacLogger")); config_pages.push_back(p); tab_tree->add(_("Logging/MacLogger")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Logging/N3FJP logs")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Text_Display* o = txt_N3FJP_data = new Fl_Text_Display(205, 94, 590, 150, _("TCP/IP Data Stream")); txt_N3FJP_data->align(Fl_Align(FL_ALIGN_TOP_LEFT)); Fl_Text_Buffer *txtbuffer = new Fl_Text_Buffer(); o->buffer(txtbuffer); } // Fl_Text_Display* txt_N3FJP_data { Fl_Button* o = new Fl_Button(701, 247, 90, 24, _("Clear text")); o->callback((Fl_Callback*)cb_Clear1); } // Fl_Button* o { Fl_Input2* o = txt_N3FJP_ip_address = new Fl_Input2(205, 49, 350, 25, _("Address")); txt_N3FJP_ip_address->tooltip(_("N3FJP Server IP Address")); txt_N3FJP_ip_address->box(FL_DOWN_BOX); txt_N3FJP_ip_address->color(FL_BACKGROUND2_COLOR); txt_N3FJP_ip_address->selection_color(FL_SELECTION_COLOR); txt_N3FJP_ip_address->labeltype(FL_NORMAL_LABEL); txt_N3FJP_ip_address->labelfont(0); txt_N3FJP_ip_address->labelsize(14); txt_N3FJP_ip_address->labelcolor(FL_FOREGROUND_COLOR); txt_N3FJP_ip_address->callback((Fl_Callback*)cb_txt_N3FJP_ip_address); txt_N3FJP_ip_address->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_N3FJP_ip_address->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.N3FJP_address.c_str()); } // Fl_Input2* txt_N3FJP_ip_address { Fl_Input2* o = txt_N3FJP_ip_port_no = new Fl_Input2(565, 49, 55, 25, _("Port")); txt_N3FJP_ip_port_no->tooltip(_("N3FJP Server IP Port")); txt_N3FJP_ip_port_no->box(FL_DOWN_BOX); txt_N3FJP_ip_port_no->color(FL_BACKGROUND2_COLOR); txt_N3FJP_ip_port_no->selection_color(FL_SELECTION_COLOR); txt_N3FJP_ip_port_no->labeltype(FL_NORMAL_LABEL); txt_N3FJP_ip_port_no->labelfont(0); txt_N3FJP_ip_port_no->labelsize(14); txt_N3FJP_ip_port_no->labelcolor(FL_FOREGROUND_COLOR); txt_N3FJP_ip_port_no->callback((Fl_Callback*)cb_txt_N3FJP_ip_port_no); txt_N3FJP_ip_port_no->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_N3FJP_ip_port_no->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.N3FJP_port.c_str()); } // Fl_Input2* txt_N3FJP_ip_port_no { btn_default_N3FJP_ip = new Fl_Button(623, 49, 67, 25, _("Default")); btn_default_N3FJP_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btn_default_N3FJP_ip->callback((Fl_Callback*)cb_btn_default_N3FJP_ip); } // Fl_Button* btn_default_N3FJP_ip { Fl_Check_Button* o = btn_enable_N3FJP_log = new Fl_Check_Button(210, 246, 165, 26, _("Enable Data Stream")); btn_enable_N3FJP_log->down_box(FL_DOWN_BOX); btn_enable_N3FJP_log->callback((Fl_Callback*)cb_btn_enable_N3FJP_log); o->value(progdefaults.enable_N3FJP_log); } // Fl_Check_Button* btn_enable_N3FJP_log { Fl_Check_Button* o = btn_connect_to_n3fjp = new Fl_Check_Button(695, 39, 70, 15, _("Connect")); btn_connect_to_n3fjp->down_box(FL_DOWN_BOX); btn_connect_to_n3fjp->callback((Fl_Callback*)cb_btn_connect_to_n3fjp); o->value(progdefaults.connect_to_n3fjp); } // Fl_Check_Button* btn_connect_to_n3fjp { box_n3fjp_connected = new Fl_Box(695, 66, 16, 16, _("Connected")); box_n3fjp_connected->box(FL_DIAMOND_DOWN_BOX); box_n3fjp_connected->color(FL_LIGHT2); box_n3fjp_connected->selection_color((Fl_Color)58); box_n3fjp_connected->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_n3fjp_connected { Fl_Check_Button* o = btn_N3FJP_sweet_spot = new Fl_Check_Button(210, 299, 255, 26, _("Center DXspot freq at sweet spot")); btn_N3FJP_sweet_spot->tooltip(_("N3FJP DX spots centered on mode sweet spot")); btn_N3FJP_sweet_spot->down_box(FL_DOWN_BOX); btn_N3FJP_sweet_spot->callback((Fl_Callback*)cb_btn_N3FJP_sweet_spot); o->value(progdefaults.N3FJP_sweet_spot); } // Fl_Check_Button* btn_N3FJP_sweet_spot { Fl_Check_Button* o = btn_N3FJP_modem_carrier = new Fl_Check_Button(475, 299, 255, 26, _("Report actual modem RF frequency")); btn_N3FJP_modem_carrier->tooltip(_("Suppressed carrier +/- AF injection frequency")); btn_N3FJP_modem_carrier->down_box(FL_DOWN_BOX); btn_N3FJP_modem_carrier->callback((Fl_Callback*)cb_btn_N3FJP_modem_carrier); o->value(progdefaults.N3FJP_modem_carrier); } // Fl_Check_Button* btn_N3FJP_modem_carrier { Fl_Check_Button* o = btn_enable_N3FJP_RIGTX = new Fl_Check_Button(210, 273, 165, 26, _("PTT via and ")); btn_enable_N3FJP_RIGTX->down_box(FL_DOWN_BOX); btn_enable_N3FJP_RIGTX->callback((Fl_Callback*)cb_btn_enable_N3FJP_RIGTX); o->value(progdefaults.enable_N3FJP_RIGTX); } // Fl_Check_Button* btn_enable_N3FJP_RIGTX CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/N3FJP logs")); config_pages.push_back(p); tab_tree->add(_("Logging/N3FJP logs")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Logging/eQSL")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Input2* o = inpEQSL_www_url = new Fl_Input2(355, 20, 390, 22, _("www url")); inpEQSL_www_url->tooltip(_("Your login name")); inpEQSL_www_url->box(FL_DOWN_BOX); inpEQSL_www_url->color(FL_BACKGROUND2_COLOR); inpEQSL_www_url->selection_color(FL_SELECTION_COLOR); inpEQSL_www_url->labeltype(FL_NORMAL_LABEL); inpEQSL_www_url->labelfont(0); inpEQSL_www_url->labelsize(14); inpEQSL_www_url->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_www_url->callback((Fl_Callback*)cb_inpEQSL_www_url); inpEQSL_www_url->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_www_url->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_www_url.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_www_url { Fl_Input2* o = inpEQSL_id = new Fl_Input2(354, 43, 150, 22, _("User ID")); inpEQSL_id->tooltip(_("Your login name")); inpEQSL_id->box(FL_DOWN_BOX); inpEQSL_id->color(FL_BACKGROUND2_COLOR); inpEQSL_id->selection_color(FL_SELECTION_COLOR); inpEQSL_id->labeltype(FL_NORMAL_LABEL); inpEQSL_id->labelfont(0); inpEQSL_id->labelsize(14); inpEQSL_id->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_id->callback((Fl_Callback*)cb_inpEQSL_id); inpEQSL_id->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_id->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_id.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_id { Fl_Input2* o = inpEQSL_pwd = new Fl_Input2(354, 66, 150, 22, _("Password")); inpEQSL_pwd->tooltip(_("Your login password")); inpEQSL_pwd->box(FL_DOWN_BOX); inpEQSL_pwd->color(FL_BACKGROUND2_COLOR); inpEQSL_pwd->selection_color(FL_SELECTION_COLOR); inpEQSL_pwd->labeltype(FL_NORMAL_LABEL); inpEQSL_pwd->labelfont(0); inpEQSL_pwd->labelsize(14); inpEQSL_pwd->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_pwd->callback((Fl_Callback*)cb_inpEQSL_pwd); inpEQSL_pwd->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_pwd->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_pwd.c_str()); o->type(FL_SECRET_INPUT); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_pwd { btnEQSL_pwd_show = new Fl_Button(510, 66, 70, 22, _("Show")); btnEQSL_pwd_show->tooltip(_("Show password in plain text")); btnEQSL_pwd_show->callback((Fl_Callback*)cb_btnEQSL_pwd_show); } // Fl_Button* btnEQSL_pwd_show { Fl_Input2* o = inpEQSL_nick = new Fl_Input2(354, 90, 150, 22, _("QTH Nickname")); inpEQSL_nick->tooltip(_("Your login name")); inpEQSL_nick->box(FL_DOWN_BOX); inpEQSL_nick->color(FL_BACKGROUND2_COLOR); inpEQSL_nick->selection_color(FL_SELECTION_COLOR); inpEQSL_nick->labeltype(FL_NORMAL_LABEL); inpEQSL_nick->labelfont(0); inpEQSL_nick->labelsize(14); inpEQSL_nick->labelcolor(FL_FOREGROUND_COLOR); inpEQSL_nick->callback((Fl_Callback*)cb_inpEQSL_nick); inpEQSL_nick->align(Fl_Align(FL_ALIGN_LEFT)); inpEQSL_nick->when(FL_WHEN_RELEASE); o->value(progdefaults.eqsl_nick.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpEQSL_nick { btn_verify_eqsl = new Fl_Button(675, 90, 70, 22, _("Verify")); btn_verify_eqsl->tooltip(_("Verify database with eQSL download file")); btn_verify_eqsl->callback((Fl_Callback*)cb_btn_verify_eqsl); } // Fl_Button* btn_verify_eqsl { Fl_Group* o = new Fl_Group(242, 118, 516, 223, _("Options")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_send_when_logged = new Fl_Check_Button(326, 127, 70, 15, _("send when logged (log button, , )")); btn_send_when_logged->tooltip(_("automatic data upload")); btn_send_when_logged->down_box(FL_DOWN_BOX); btn_send_when_logged->callback((Fl_Callback*)cb_btn_send_when_logged); o->value(progdefaults.eqsl_when_logged); } // Fl_Check_Button* btn_send_when_logged { Fl_Check_Button* o = btn_send_datetime_off = new Fl_Check_Button(326, 147, 70, 15, _("Use date/time off for log entry")); btn_send_datetime_off->tooltip(_("default uses date/time on")); btn_send_datetime_off->down_box(FL_DOWN_BOX); btn_send_datetime_off->callback((Fl_Callback*)cb_btn_send_datetime_off); o->value(progdefaults.eqsl_datetime_off); } // Fl_Check_Button* btn_send_datetime_off { Fl_Check_Button* o = btn_show_eqsl_delivery = new Fl_Check_Button(326, 167, 70, 15, _("Show delivery message")); btn_show_eqsl_delivery->tooltip(_("Display timed delivery message if enabled")); btn_show_eqsl_delivery->down_box(FL_DOWN_BOX); btn_show_eqsl_delivery->callback((Fl_Callback*)cb_btn_show_eqsl_delivery); o->value(progdefaults.eqsl_show_delivery); } // Fl_Check_Button* btn_show_eqsl_delivery { Fl_Input2* o = txt_eqsl_default_message = new Fl_Input2(295, 208, 451, 40, _("Default message")); txt_eqsl_default_message->tooltip(_("default text to send with etc")); txt_eqsl_default_message->type(4); txt_eqsl_default_message->box(FL_DOWN_BOX); txt_eqsl_default_message->color(FL_BACKGROUND2_COLOR); txt_eqsl_default_message->selection_color(FL_SELECTION_COLOR); txt_eqsl_default_message->labeltype(FL_NORMAL_LABEL); txt_eqsl_default_message->labelfont(0); txt_eqsl_default_message->labelsize(14); txt_eqsl_default_message->labelcolor(FL_FOREGROUND_COLOR); txt_eqsl_default_message->callback((Fl_Callback*)cb_txt_eqsl_default_message); txt_eqsl_default_message->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_eqsl_default_message->when(FL_WHEN_CHANGED); o->value(progdefaults.eqsl_default_message.c_str()); } // Fl_Input2* txt_eqsl_default_message { Fl_Group* o = new Fl_Group(258, 254, 481, 81, _("Text Tags (tags use {} delimiters)")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { eqsl_txt1 = new Fl_Box(264, 294, 220, 17, _(" {CALL} other ops call sign")); eqsl_txt1->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* eqsl_txt1 { eqsl_txt2 = new Fl_Box(262, 313, 220, 17, _(" {MODE} full mode / submode")); eqsl_txt2->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* eqsl_txt2 { eqsl_txt3 = new Fl_Box(510, 294, 220, 17, _("{NAME} other ops name")); eqsl_txt3->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* eqsl_txt3 { new Fl_Box(280, 273, 440, 17, _("These tags can also be used in ")); } // Fl_Box* o o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/eQSL")); config_pages.push_back(p); tab_tree->add(_("Logging/eQSL")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Logging/LoTW")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Input2* o = txt_lotw_pathname = new Fl_Input2(283, 50, 422, 24, _("tqsl:")); txt_lotw_pathname->tooltip(_("Enter full path-filename for tqsl executable")); txt_lotw_pathname->box(FL_DOWN_BOX); txt_lotw_pathname->color(FL_BACKGROUND2_COLOR); txt_lotw_pathname->selection_color(FL_SELECTION_COLOR); txt_lotw_pathname->labeltype(FL_NORMAL_LABEL); txt_lotw_pathname->labelfont(0); txt_lotw_pathname->labelsize(14); txt_lotw_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_lotw_pathname->callback((Fl_Callback*)cb_txt_lotw_pathname); txt_lotw_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_lotw_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.lotw_pathname.c_str()); } // Fl_Input2* txt_lotw_pathname { Fl_Input2* o = inpLOTW_pwd = new Fl_Input2(283, 85, 225, 24, _("Password")); inpLOTW_pwd->tooltip(_("Your tqsl login password")); inpLOTW_pwd->box(FL_DOWN_BOX); inpLOTW_pwd->color(FL_BACKGROUND2_COLOR); inpLOTW_pwd->selection_color(FL_SELECTION_COLOR); inpLOTW_pwd->labeltype(FL_NORMAL_LABEL); inpLOTW_pwd->labelfont(0); inpLOTW_pwd->labelsize(14); inpLOTW_pwd->labelcolor(FL_FOREGROUND_COLOR); inpLOTW_pwd->callback((Fl_Callback*)cb_inpLOTW_pwd); inpLOTW_pwd->align(Fl_Align(FL_ALIGN_LEFT)); inpLOTW_pwd->when(FL_WHEN_RELEASE); o->value(progdefaults.lotw_pwd.c_str()); o->type(FL_SECRET_INPUT); inpLOTW_pwd->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpLOTW_pwd { Fl_Check_Button* o = btn_submit_lotw_password = new Fl_Check_Button(605, 89, 162, 16, _("Password required")); btn_submit_lotw_password->tooltip(_("Submit password with each upload")); btn_submit_lotw_password->down_box(FL_DOWN_BOX); btn_submit_lotw_password->callback((Fl_Callback*)cb_btn_submit_lotw_password); o->value(progdefaults.submit_lotw_password); } // Fl_Check_Button* btn_submit_lotw_password { Fl_Input2* o = inpLOTW_location = new Fl_Input2(283, 116, 250, 24, _("Location")); inpLOTW_location->tooltip(_("tqsl station location")); inpLOTW_location->box(FL_DOWN_BOX); inpLOTW_location->color(FL_BACKGROUND2_COLOR); inpLOTW_location->selection_color(FL_SELECTION_COLOR); inpLOTW_location->labeltype(FL_NORMAL_LABEL); inpLOTW_location->labelfont(0); inpLOTW_location->labelsize(14); inpLOTW_location->labelcolor(FL_FOREGROUND_COLOR); inpLOTW_location->callback((Fl_Callback*)cb_inpLOTW_location); inpLOTW_location->align(Fl_Align(FL_ALIGN_LEFT)); inpLOTW_location->when(FL_WHEN_RELEASE); o->value(progdefaults.lotw_location.c_str()); inpLOTW_pwd->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpLOTW_location { btn_select_lotw = new Fl_Button(710, 50, 70, 24, _("Locate")); btn_select_lotw->tooltip(_("Locate tqsl executable")); btn_select_lotw->callback((Fl_Callback*)cb_btn_select_lotw); } // Fl_Button* btn_select_lotw { Fl_Check_Button* o = btn_lotw_quiet_mode = new Fl_Check_Button(243, 149, 309, 16, _("Quiet mode [-q], do not open tqsl dialog")); btn_lotw_quiet_mode->tooltip(_("Operate tqsl in batch mode (no dialog)")); btn_lotw_quiet_mode->down_box(FL_DOWN_BOX); btn_lotw_quiet_mode->callback((Fl_Callback*)cb_btn_lotw_quiet_mode); o->value(progdefaults.lotw_quiet_mode); } // Fl_Check_Button* btn_lotw_quiet_mode { Fl_Check_Button* o = btn_submit_lotw = new Fl_Check_Button(243, 176, 289, 16, _("Send QSO data to LoTW when logged")); btn_submit_lotw->tooltip(_("Submit each QSO as logged")); btn_submit_lotw->down_box(FL_DOWN_BOX); btn_submit_lotw->callback((Fl_Callback*)cb_btn_submit_lotw); o->value(progdefaults.submit_lotw); } // Fl_Check_Button* btn_submit_lotw { Fl_Check_Button* o = btn_show_lotw_delivery = new Fl_Check_Button(243, 203, 70, 15, _("Show delivery message")); btn_show_lotw_delivery->tooltip(_("Display timed delivery message if enabled")); btn_show_lotw_delivery->down_box(FL_DOWN_BOX); btn_show_lotw_delivery->callback((Fl_Callback*)cb_btn_show_lotw_delivery); o->value(progdefaults.lotw_show_delivery); } // Fl_Check_Button* btn_show_lotw_delivery { btn_export_lotw = new Fl_Button(216, 232, 70, 24, _("Export")); btn_export_lotw->tooltip(_("Export records for LoTW upload")); btn_export_lotw->callback((Fl_Callback*)cb_btn_export_lotw); } // Fl_Button* btn_export_lotw { btn_review_lotw = new Fl_Button(216, 259, 70, 24, _("Check")); btn_review_lotw->tooltip(_("Review lotw.adif file before sending with tqsl")); btn_review_lotw->callback((Fl_Callback*)cb_btn_review_lotw); } // Fl_Button* btn_review_lotw { btn_send_lotw = new Fl_Button(216, 287, 70, 24, _("Send")); btn_send_lotw->tooltip(_("Send lotw.adif via tqsl")); btn_send_lotw->callback((Fl_Callback*)cb_btn_send_lotw); } // Fl_Button* btn_send_lotw { Fl_Box* o = new Fl_Box(291, 232, 346, 24, _("Export logbook records for LoTW upload")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(291, 259, 346, 24, _("Review / edit the exported LoTW upload adif file")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(291, 287, 346, 24, _("Submit the upload adif file to LoTW")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(212, 22, 574, 24, _("You must have tqsl installed and it\'s location recorded for LoTW updates to \ work!")); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Box* o { btnLOTW_pwd_show = new Fl_Button(516, 85, 70, 24, _("Show")); btnLOTW_pwd_show->tooltip(_("Show password in plain text")); btnLOTW_pwd_show->callback((Fl_Callback*)cb_btnLOTW_pwd_show); } // Fl_Button* btnLOTW_pwd_show { Fl_Box* o = new Fl_Box(540, 116, 211, 24, _("Use this tqsl station location")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { btn_verify_lotw = new Fl_Button(216, 315, 70, 24, _("Match")); btn_verify_lotw->tooltip(_("Verify database with LoTW download file")); btn_verify_lotw->callback((Fl_Callback*)cb_btn_verify_lotw); } // Fl_Button* btn_verify_lotw { Fl_Box* o = new Fl_Box(291, 315, 346, 24, _("Match logbook records with LoTW download file")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { btn_view_unmatched = new Fl_Button(645, 313, 139, 24, _("View Unmatched")); btn_view_unmatched->tooltip(_("Verify database with LoTW download file")); btn_view_unmatched->callback((Fl_Callback*)cb_btn_view_unmatched); btn_view_unmatched->deactivate(); } // Fl_Button* btn_view_unmatched { Fl_Counter* o = cnt_tracefile_timeout = new Fl_Counter(647, 146, 79, 21, _("Timeout")); cnt_tracefile_timeout->tooltip(_("Wait NN seconds for LoTW response")); cnt_tracefile_timeout->type(1); cnt_tracefile_timeout->minimum(4); cnt_tracefile_timeout->maximum(60); cnt_tracefile_timeout->step(1); cnt_tracefile_timeout->value(5); cnt_tracefile_timeout->callback((Fl_Callback*)cb_cnt_tracefile_timeout); cnt_tracefile_timeout->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.tracefile_timeout); } // Fl_Counter* cnt_tracefile_timeout CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/LoTW")); config_pages.push_back(p); tab_tree->add(_("Logging/LoTW")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Logging/Cloudlog")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 25, 590, 35, _("This allows for logging of QSOs to a Cloudlog instance.")); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); o->end(); } // Fl_Group* o { Fl_Check_Button* o = btnEnCloudlog = new Fl_Check_Button(265, 76, 70, 15, _("Enable Cloudlog API logging")); btnEnCloudlog->tooltip(_("This enables logging of QSOs to Cloudlog via API")); btnEnCloudlog->down_box(FL_DOWN_BOX); btnEnCloudlog->callback((Fl_Callback*)cb_btnEnCloudlog); o->value(progdefaults.EnCloudlog); } // Fl_Check_Button* btnEnCloudlog { Fl_Input2* o = txt_cloudlog_api_url = new Fl_Input2(310, 131, 379, 24, _("API URL:")); txt_cloudlog_api_url->tooltip(_("Enter the URL of your Cloudlog API")); txt_cloudlog_api_url->box(FL_DOWN_BOX); txt_cloudlog_api_url->color(FL_BACKGROUND2_COLOR); txt_cloudlog_api_url->selection_color(FL_SELECTION_COLOR); txt_cloudlog_api_url->labeltype(FL_NORMAL_LABEL); txt_cloudlog_api_url->labelfont(0); txt_cloudlog_api_url->labelsize(14); txt_cloudlog_api_url->labelcolor(FL_FOREGROUND_COLOR); txt_cloudlog_api_url->callback((Fl_Callback*)cb_txt_cloudlog_api_url); txt_cloudlog_api_url->align(Fl_Align(FL_ALIGN_LEFT)); txt_cloudlog_api_url->when(FL_WHEN_RELEASE); o->value(progdefaults.cloudlog_api_url.c_str()); } // Fl_Input2* txt_cloudlog_api_url { Fl_Input2* o = txt_cloudlog_api_key = new Fl_Input2(310, 171, 379, 24, _("API Key:")); txt_cloudlog_api_key->tooltip(_("Enter the API key for your Cloudlog instance")); txt_cloudlog_api_key->box(FL_DOWN_BOX); txt_cloudlog_api_key->color(FL_BACKGROUND2_COLOR); txt_cloudlog_api_key->selection_color(FL_SELECTION_COLOR); txt_cloudlog_api_key->labeltype(FL_NORMAL_LABEL); txt_cloudlog_api_key->labelfont(0); txt_cloudlog_api_key->labelsize(14); txt_cloudlog_api_key->labelcolor(FL_FOREGROUND_COLOR); txt_cloudlog_api_key->callback((Fl_Callback*)cb_txt_cloudlog_api_key); txt_cloudlog_api_key->align(Fl_Align(FL_ALIGN_LEFT)); txt_cloudlog_api_key->when(FL_WHEN_RELEASE); o->value(progdefaults.cloudlog_api_key.c_str()); } // Fl_Input2* txt_cloudlog_api_key { Fl_Spinner* o = sp_cloudlog_station_id = new Fl_Spinner(310, 215, 60, 25, _("Station ID:")); sp_cloudlog_station_id->maximum(9999); sp_cloudlog_station_id->callback((Fl_Callback*)cb_sp_cloudlog_station_id); o->value(progdefaults.cloudlog_station_id); } // Fl_Spinner* sp_cloudlog_station_id { btnTestApiKey = new Fl_Button(696, 313, 80, 24, _("Initialize")); btnTestApiKey->tooltip(_("Test API Key")); btnTestApiKey->callback((Fl_Callback*)cb_btnTestApiKey); } // Fl_Button* btnTestApiKey CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/Cloudlog")); config_pages.push_back(p); tab_tree->add(_("Logging/Cloudlog")); tab_tree->close(_("Logging")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Logging/QSO logging")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Check_Button* o = btnNagMe = new Fl_Check_Button(255, 63, 236, 20, _("Prompt to save log on exit")); btnNagMe->tooltip(_("Bug me about saving log entries")); btnNagMe->down_box(FL_DOWN_BOX); btnNagMe->callback((Fl_Callback*)cb_btnNagMe); o->value(progdefaults.NagMe); } // Fl_Check_Button* btnNagMe { Fl_Check_Button* o = btnClearOnSave = new Fl_Check_Button(255, 92, 236, 20, _("Clear on save")); btnClearOnSave->tooltip(_("Clear log entries after saving or using macro ")); btnClearOnSave->down_box(FL_DOWN_BOX); btnClearOnSave->callback((Fl_Callback*)cb_btnClearOnSave); o->value(progdefaults.ClearOnSave); } // Fl_Check_Button* btnClearOnSave { Fl_Check_Button* o = btnCallUpperCase = new Fl_Check_Button(255, 121, 236, 20, _("Convert callsign to upper case")); btnCallUpperCase->tooltip(_("Force callsign field to UPPERCASE")); btnCallUpperCase->down_box(FL_DOWN_BOX); btnCallUpperCase->callback((Fl_Callback*)cb_btnCallUpperCase); o->value(progdefaults.calluppercase); } // Fl_Check_Button* btnCallUpperCase { Fl_Check_Button* o = btnAutoFillQSO = new Fl_Check_Button(255, 151, 236, 20, _("Auto-fill Country and Azimuth")); btnAutoFillQSO->tooltip(_("Fill in Country / Azimuth using cty.dat information")); btnAutoFillQSO->down_box(FL_DOWN_BOX); btnAutoFillQSO->callback((Fl_Callback*)cb_btnAutoFillQSO); o->value(progdefaults.autofill_qso_fields); } // Fl_Check_Button* btnAutoFillQSO { Fl_Check_Button* o = btnDateTimeSort = new Fl_Check_Button(508, 63, 190, 20, _("Sort by Date/Time OFF")); btnDateTimeSort->tooltip(_("Sort by date/time OFF - effects all ADIF/Cabrillo reports")); btnDateTimeSort->down_box(FL_DOWN_BOX); btnDateTimeSort->callback((Fl_Callback*)cb_btnDateTimeSort); o->value(progdefaults.sort_date_time_off); } // Fl_Check_Button* btnDateTimeSort { Fl_Check_Button* o = btndate_time_force = new Fl_Check_Button(508, 92, 190, 20, _("Date time ON == OFF")); btndate_time_force->tooltip(_("Force date/time ON == date/time OFF")); btndate_time_force->down_box(FL_DOWN_BOX); btndate_time_force->callback((Fl_Callback*)cb_btndate_time_force); o->value(progdefaults.force_date_time); } // Fl_Check_Button* btndate_time_force { Fl_Check_Button* o = btnRSTindefault = new Fl_Check_Button(508, 121, 213, 20, _("Default RST in to 599/59")); btnRSTindefault->tooltip(_("Clear log controls sets RST in to 599/59")); btnRSTindefault->down_box(FL_DOWN_BOX); btnRSTindefault->callback((Fl_Callback*)cb_btnRSTindefault); o->value(progdefaults.RSTin_default); } // Fl_Check_Button* btnRSTindefault { Fl_Check_Button* o = btnRSTdefault = new Fl_Check_Button(508, 151, 216, 20, _("Default RST out to 599/59")); btnRSTdefault->tooltip(_("Clear log controls sets RST out to 599/59")); btnRSTdefault->down_box(FL_DOWN_BOX); btnRSTdefault->callback((Fl_Callback*)cb_btnRSTdefault); o->value(progdefaults.RSTdefault); } // Fl_Check_Button* btnRSTdefault { Fl_Input2* o = inpMyPower = new Fl_Input2(368, 219, 50, 24, _("Transmit Power")); inpMyPower->tooltip(_("Tx power used for logbook entries")); inpMyPower->box(FL_DOWN_BOX); inpMyPower->color(FL_BACKGROUND2_COLOR); inpMyPower->selection_color(FL_SELECTION_COLOR); inpMyPower->labeltype(FL_NORMAL_LABEL); inpMyPower->labelfont(0); inpMyPower->labelsize(14); inpMyPower->labelcolor(FL_FOREGROUND_COLOR); inpMyPower->callback((Fl_Callback*)cb_inpMyPower); inpMyPower->align(Fl_Align(FL_ALIGN_LEFT)); inpMyPower->when(FL_WHEN_RELEASE); o->value(progdefaults.mytxpower.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyPower { Fl_Check_Button* o = btnDisplayLogbookRead = new Fl_Check_Button(255, 181, 277, 20, _("Display logbook read datum at start")); btnDisplayLogbookRead->tooltip(_("The filename is written to the RX text area")); btnDisplayLogbookRead->down_box(FL_DOWN_BOX); btnDisplayLogbookRead->callback((Fl_Callback*)cb_btnDisplayLogbookRead); o->value(progdefaults.DisplayLogbookRead); } // Fl_Check_Button* btnDisplayLogbookRead { Fl_Check_Button* o = btn_log_power_meter = new Fl_Check_Button(444, 221, 155, 20, _("Log power meter ")); btn_log_power_meter->tooltip(_("Bug me about saving log entries")); btn_log_power_meter->down_box(FL_DOWN_BOX); btn_log_power_meter->value(1); btn_log_power_meter->callback((Fl_Callback*)cb_btn_log_power_meter); o->value(progdefaults.log_power_meter); } // Fl_Check_Button* btn_log_power_meter CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Logging/QSO logging")); config_pages.push_back(p); tab_tree->add(_("Logging/QSO logging")); tab_tree->close(_("Logging")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/CW/General")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(225, 22, 560, 147, _("Receive")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnCWuseSOMdecoding = new Fl_Check_Button(296, 57, 125, 20, _("SOM decoding")); btnCWuseSOMdecoding->tooltip(_("Self Organizing Mapping")); btnCWuseSOMdecoding->down_box(FL_DOWN_BOX); btnCWuseSOMdecoding->value(1); btnCWuseSOMdecoding->callback((Fl_Callback*)cb_btnCWuseSOMdecoding); o->value(progdefaults.CWuseSOMdecoding); } // Fl_Check_Button* btnCWuseSOMdecoding { Fl_Check_Button* o = btnCWrcvTrack = new Fl_Check_Button(450, 57, 80, 20, _("WPM Tracking")); btnCWrcvTrack->tooltip(_("Automatic Rx speed tracking")); btnCWrcvTrack->down_box(FL_DOWN_BOX); btnCWrcvTrack->value(1); btnCWrcvTrack->callback((Fl_Callback*)cb_btnCWrcvTrack); o->value(progdefaults.CWtrack); } // Fl_Check_Button* btnCWrcvTrack { Fl_Value_Slider2* o = sldrCWbandwidth = new Fl_Value_Slider2(250, 98, 250, 20, _("Filter bandwidth")); sldrCWbandwidth->tooltip(_("CW dsp filter bandwidth")); sldrCWbandwidth->type(1); sldrCWbandwidth->box(FL_DOWN_BOX); sldrCWbandwidth->color(FL_BACKGROUND_COLOR); sldrCWbandwidth->selection_color(FL_BACKGROUND_COLOR); sldrCWbandwidth->labeltype(FL_NORMAL_LABEL); sldrCWbandwidth->labelfont(0); sldrCWbandwidth->labelsize(14); sldrCWbandwidth->labelcolor(FL_FOREGROUND_COLOR); sldrCWbandwidth->minimum(10); sldrCWbandwidth->maximum(400); sldrCWbandwidth->step(1); sldrCWbandwidth->value(66); sldrCWbandwidth->textsize(14); sldrCWbandwidth->callback((Fl_Callback*)cb_sldrCWbandwidth); sldrCWbandwidth->align(Fl_Align(FL_ALIGN_TOP_LEFT)); sldrCWbandwidth->when(FL_WHEN_CHANGED); o->value(progdefaults.CWbandwidth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWbandwidth { Fl_Check_Button* o = btnCWmfilt = new Fl_Check_Button(503, 98, 80, 20, _("Matched Filt\'")); btnCWmfilt->tooltip(_("Matched Filter bandwidth")); btnCWmfilt->down_box(FL_DOWN_BOX); btnCWmfilt->value(1); btnCWmfilt->callback((Fl_Callback*)cb_btnCWmfilt); o->value(progdefaults.CWmfilt); } // Fl_Check_Button* btnCWmfilt { valCWrcvWPM = new Fl_Value_Output(250, 137, 35, 20, _("Rx WPM")); valCWrcvWPM->color(FL_BACKGROUND2_COLOR); valCWrcvWPM->callback((Fl_Callback*)cb_valCWrcvWPM); valCWrcvWPM->align(Fl_Align(FL_ALIGN_TOP_LEFT)); } // Fl_Value_Output* valCWrcvWPM { prgsCWrcvWPM = new Fl_Progress(286, 137, 214, 20); prgsCWrcvWPM->tooltip(_("Tracked CW speed in WPM")); prgsCWrcvWPM->color(FL_BACKGROUND_COLOR); prgsCWrcvWPM->selection_color(FL_SELECTION_COLOR); prgsCWrcvWPM->align(Fl_Align(FL_ALIGN_CENTER)); } // Fl_Progress* prgsCWrcvWPM { Fl_Counter2* o = cntLower = new Fl_Counter2(409, 57, 65, 20, _("Lower")); cntLower->tooltip(_("Detector low threshold")); cntLower->type(1); cntLower->box(FL_UP_BOX); cntLower->color(FL_BACKGROUND_COLOR); cntLower->selection_color(FL_INACTIVE_COLOR); cntLower->labeltype(FL_NORMAL_LABEL); cntLower->labelfont(0); cntLower->labelsize(14); cntLower->labelcolor(FL_FOREGROUND_COLOR); cntLower->minimum(0.01); cntLower->maximum(0.99); cntLower->step(0.01); cntLower->value(0.45); cntLower->callback((Fl_Callback*)cb_cntLower); cntLower->align(Fl_Align(FL_ALIGN_TOP)); cntLower->when(FL_WHEN_CHANGED); cntLower->hide(); o->value(progdefaults.CWlower); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntLower { Fl_Counter2* o = cntUpper = new Fl_Counter2(502, 57, 65, 20, _("Upper")); cntUpper->tooltip(_("Detector high threshold")); cntUpper->type(1); cntUpper->box(FL_UP_BOX); cntUpper->color(FL_BACKGROUND_COLOR); cntUpper->selection_color(FL_INACTIVE_COLOR); cntUpper->labeltype(FL_NORMAL_LABEL); cntUpper->labelfont(0); cntUpper->labelsize(14); cntUpper->labelcolor(FL_FOREGROUND_COLOR); cntUpper->minimum(0.01); cntUpper->maximum(0.99); cntUpper->step(0.01); cntUpper->value(0.55); cntUpper->callback((Fl_Callback*)cb_cntUpper); cntUpper->align(Fl_Align(FL_ALIGN_TOP)); cntUpper->when(FL_WHEN_CHANGED); cntUpper->hide(); o->value(progdefaults.CWupper); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntUpper { Fl_Counter2* o = cntCWrange = new Fl_Counter2(503, 136, 65, 20, _("Range")); cntCWrange->tooltip(_("Range +/- wpm")); cntCWrange->type(1); cntCWrange->box(FL_UP_BOX); cntCWrange->color(FL_BACKGROUND_COLOR); cntCWrange->selection_color(FL_INACTIVE_COLOR); cntCWrange->labeltype(FL_NORMAL_LABEL); cntCWrange->labelfont(0); cntCWrange->labelsize(14); cntCWrange->labelcolor(FL_FOREGROUND_COLOR); cntCWrange->minimum(5); cntCWrange->maximum(25); cntCWrange->step(1); cntCWrange->value(10); cntCWrange->callback((Fl_Callback*)cb_cntCWrange); cntCWrange->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWrange->when(FL_WHEN_CHANGED); o->value(progdefaults.CWrange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWrange { Fl_Group* o = new Fl_Group(625, 30, 135, 124, _("Signal tracking")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Choice* o = mnu_cwrx_attack = new Fl_Choice(680, 55, 72, 20, _("Attack")); mnu_cwrx_attack->down_box(FL_BORDER_BOX); mnu_cwrx_attack->callback((Fl_Callback*)cb_mnu_cwrx_attack); o->add("Slow|Med|Fast"); o->value(progdefaults.cwrx_attack); } // Fl_Choice* mnu_cwrx_attack { Fl_Choice* o = mnu_cwrx_decay = new Fl_Choice(680, 90, 72, 20, _("Decay")); mnu_cwrx_decay->down_box(FL_BORDER_BOX); mnu_cwrx_decay->callback((Fl_Callback*)cb_mnu_cwrx_decay); o->add("Slow|Med|Fast"); o->value(progdefaults.cwrx_decay); } // Fl_Choice* mnu_cwrx_decay { btn_cw_tracking_defaults = new Fl_Button(680, 120, 70, 20, _("Defaults")); btn_cw_tracking_defaults->callback((Fl_Callback*)cb_btn_cw_tracking_defaults); } // Fl_Button* btn_cw_tracking_defaults o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(225, 170, 560, 174, _("Transmit")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Slider2* o = sldrCWxmtWPM = new Fl_Value_Slider2(250, 195, 440, 20, _("char WPM")); sldrCWxmtWPM->tooltip(_("My transmit CW WPM")); sldrCWxmtWPM->type(1); sldrCWxmtWPM->box(FL_DOWN_BOX); sldrCWxmtWPM->color(FL_BACKGROUND_COLOR); sldrCWxmtWPM->selection_color(FL_BACKGROUND_COLOR); sldrCWxmtWPM->labeltype(FL_NORMAL_LABEL); sldrCWxmtWPM->labelfont(0); sldrCWxmtWPM->labelsize(14); sldrCWxmtWPM->labelcolor(FL_FOREGROUND_COLOR); sldrCWxmtWPM->minimum(5); sldrCWxmtWPM->maximum(100); sldrCWxmtWPM->step(1); sldrCWxmtWPM->value(20); sldrCWxmtWPM->textsize(14); sldrCWxmtWPM->callback((Fl_Callback*)cb_sldrCWxmtWPM); sldrCWxmtWPM->align(Fl_Align(FL_ALIGN_RIGHT)); sldrCWxmtWPM->when(FL_WHEN_CHANGED); o->value(progdefaults.CWspeed); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWxmtWPM { Fl_Counter2* o = cntCWdefWPM = new Fl_Counter2(307, 224, 64, 20, _("Default")); cntCWdefWPM->tooltip(_("The default CW speed")); cntCWdefWPM->type(1); cntCWdefWPM->box(FL_UP_BOX); cntCWdefWPM->color(FL_BACKGROUND_COLOR); cntCWdefWPM->selection_color(FL_INACTIVE_COLOR); cntCWdefWPM->labeltype(FL_NORMAL_LABEL); cntCWdefWPM->labelfont(0); cntCWdefWPM->labelsize(14); cntCWdefWPM->labelcolor(FL_FOREGROUND_COLOR); cntCWdefWPM->minimum(5); cntCWdefWPM->maximum(200); cntCWdefWPM->step(1); cntCWdefWPM->value(18); cntCWdefWPM->callback((Fl_Callback*)cb_cntCWdefWPM); cntCWdefWPM->align(Fl_Align(FL_ALIGN_LEFT)); cntCWdefWPM->when(FL_WHEN_CHANGED); o->value(progdefaults.defCWspeed); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntCWdefWPM { Fl_Counter* o = cntCWlowerlimit = new Fl_Counter(497, 224, 65, 20, _("Lower limit")); cntCWlowerlimit->tooltip(_("No slower than this")); cntCWlowerlimit->type(1); cntCWlowerlimit->minimum(5); cntCWlowerlimit->maximum(20); cntCWlowerlimit->step(5); cntCWlowerlimit->value(10); cntCWlowerlimit->callback((Fl_Callback*)cb_cntCWlowerlimit); cntCWlowerlimit->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.CWlowerlimit); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter* cntCWlowerlimit { Fl_Counter* o = cntCWupperlimit = new Fl_Counter(688, 224, 65, 20, _("Upper limit")); cntCWupperlimit->tooltip(_("No faster than this")); cntCWupperlimit->type(1); cntCWupperlimit->minimum(25); cntCWupperlimit->maximum(200); cntCWupperlimit->step(5); cntCWupperlimit->value(100); cntCWupperlimit->callback((Fl_Callback*)cb_cntCWupperlimit); cntCWupperlimit->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.CWupperlimit); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter* cntCWupperlimit { Fl_Value_Slider2* o = sldrCWfarnsworth = new Fl_Value_Slider2(250, 271, 400, 20, _("text WPM")); sldrCWfarnsworth->tooltip(_("My transmit CW WPM")); sldrCWfarnsworth->type(1); sldrCWfarnsworth->box(FL_DOWN_BOX); sldrCWfarnsworth->color(FL_BACKGROUND_COLOR); sldrCWfarnsworth->selection_color(FL_BACKGROUND_COLOR); sldrCWfarnsworth->labeltype(FL_NORMAL_LABEL); sldrCWfarnsworth->labelfont(0); sldrCWfarnsworth->labelsize(14); sldrCWfarnsworth->labelcolor(FL_FOREGROUND_COLOR); sldrCWfarnsworth->minimum(5); sldrCWfarnsworth->maximum(50); sldrCWfarnsworth->step(1); sldrCWfarnsworth->value(15); sldrCWfarnsworth->textsize(14); sldrCWfarnsworth->callback((Fl_Callback*)cb_sldrCWfarnsworth); sldrCWfarnsworth->align(Fl_Align(FL_ALIGN_RIGHT)); sldrCWfarnsworth->when(FL_WHEN_CHANGED); o->value(progdefaults.CWfarnsworth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWfarnsworth { Fl_Check_Button* o = btnCWusefarnsworth = new Fl_Check_Button(270, 252, 180, 15, _("Use Farnsworth timing")); btnCWusefarnsworth->tooltip(_("text WPM <= char WPM")); btnCWusefarnsworth->down_box(FL_DOWN_BOX); btnCWusefarnsworth->callback((Fl_Callback*)cb_btnCWusefarnsworth); o->value(progdefaults.CWusefarnsworth); } // Fl_Check_Button* btnCWusefarnsworth { Fl_Value_Slider2* o = sldrCWwordsworth = new Fl_Value_Slider2(251, 319, 400, 20, _("Spacing WPM")); sldrCWwordsworth->tooltip(_("My transmit CW WPM")); sldrCWwordsworth->type(1); sldrCWwordsworth->box(FL_DOWN_BOX); sldrCWwordsworth->color(FL_BACKGROUND_COLOR); sldrCWwordsworth->selection_color(FL_BACKGROUND_COLOR); sldrCWwordsworth->labeltype(FL_NORMAL_LABEL); sldrCWwordsworth->labelfont(0); sldrCWwordsworth->labelsize(14); sldrCWwordsworth->labelcolor(FL_FOREGROUND_COLOR); sldrCWwordsworth->minimum(5); sldrCWwordsworth->maximum(50); sldrCWwordsworth->step(1); sldrCWwordsworth->value(15); sldrCWwordsworth->textsize(14); sldrCWwordsworth->callback((Fl_Callback*)cb_sldrCWwordsworth); sldrCWwordsworth->align(Fl_Align(FL_ALIGN_RIGHT)); sldrCWwordsworth->when(FL_WHEN_CHANGED); o->value(progdefaults.CWwordsworth); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrCWwordsworth { Fl_Check_Button* o = btnCWusewordsworth = new Fl_Check_Button(271, 300, 180, 15, _("Use Wordsworth timing")); btnCWusewordsworth->tooltip(_("text WPM <= char WPM")); btnCWusewordsworth->down_box(FL_DOWN_BOX); btnCWusewordsworth->callback((Fl_Callback*)cb_btnCWusewordsworth); o->value(progdefaults.CWusewordsworth); } // Fl_Check_Button* btnCWusewordsworth o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/General")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/General")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/CW/Timing and QSK")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 28, 590, 124, _("Timing")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntCWdash2dot = new Fl_Counter2(335, 44, 125, 24, _("Dash/Dot")); cntCWdash2dot->tooltip(_("Dash to dot ratio")); cntCWdash2dot->box(FL_UP_BOX); cntCWdash2dot->color(FL_BACKGROUND_COLOR); cntCWdash2dot->selection_color(FL_INACTIVE_COLOR); cntCWdash2dot->labeltype(FL_NORMAL_LABEL); cntCWdash2dot->labelfont(0); cntCWdash2dot->labelsize(14); cntCWdash2dot->labelcolor(FL_FOREGROUND_COLOR); cntCWdash2dot->minimum(2.5); cntCWdash2dot->maximum(4); cntCWdash2dot->value(3); cntCWdash2dot->callback((Fl_Callback*)cb_cntCWdash2dot); cntCWdash2dot->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWdash2dot->when(FL_WHEN_CHANGED); o->value(progdefaults.CWdash2dot); o->labelsize(FL_NORMAL_SIZE); o->lstep(1); } // Fl_Counter2* cntCWdash2dot { Fl_Counter2* o = cntCWrisetime = new Fl_Counter2(335, 75, 125, 24, _("Edge timing")); cntCWrisetime->tooltip(_("Leading and Trailing edge risetimes (msec)")); cntCWrisetime->box(FL_UP_BOX); cntCWrisetime->color(FL_BACKGROUND_COLOR); cntCWrisetime->selection_color(FL_INACTIVE_COLOR); cntCWrisetime->labeltype(FL_NORMAL_LABEL); cntCWrisetime->labelfont(0); cntCWrisetime->labelsize(14); cntCWrisetime->labelcolor(FL_FOREGROUND_COLOR); cntCWrisetime->minimum(0); cntCWrisetime->maximum(15); cntCWrisetime->value(4); cntCWrisetime->callback((Fl_Callback*)cb_cntCWrisetime); cntCWrisetime->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWrisetime->when(FL_WHEN_CHANGED); o->value(progdefaults.CWrisetime); o->labelsize(FL_NORMAL_SIZE); o->lstep(1); } // Fl_Counter2* cntCWrisetime { Fl_ListBox* o = i_listboxQSKshape = new Fl_ListBox(335, 108, 125, 24, _("Edge shape")); i_listboxQSKshape->tooltip(_("Hanning/Blackman - use edge timing\nBPF - use BPF bandwidth")); i_listboxQSKshape->box(FL_DOWN_BOX); i_listboxQSKshape->color(FL_BACKGROUND2_COLOR); i_listboxQSKshape->selection_color(FL_BACKGROUND_COLOR); i_listboxQSKshape->labeltype(FL_NORMAL_LABEL); i_listboxQSKshape->labelfont(0); i_listboxQSKshape->labelsize(14); i_listboxQSKshape->labelcolor(FL_FOREGROUND_COLOR); i_listboxQSKshape->callback((Fl_Callback*)cb_i_listboxQSKshape); i_listboxQSKshape->align(Fl_Align(FL_ALIGN_RIGHT)); i_listboxQSKshape->when(FL_WHEN_RELEASE); o->add("Hanning|Blackman"); o->index(progdefaults.QSKshape); o->labelsize(FL_NORMAL_SIZE); i_listboxQSKshape->end(); } // Fl_ListBox* i_listboxQSKshape o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 155, 590, 153, _("QSK")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnQSK = new Fl_Check_Button(267, 172, 217, 20, _("QSK on right audio channel")); btnQSK->tooltip(_("Generate square wave signal on right channel")); btnQSK->down_box(FL_DOWN_BOX); btnQSK->callback((Fl_Callback*)cb_btnQSK); o->value(progdefaults.QSK); } // Fl_Check_Button* btnQSK { Fl_Counter2* o = cntQSKfrequency = new Fl_Counter2(215, 206, 125, 24, _("QSK frequency")); cntQSKfrequency->tooltip(_("Fundamental frequency of QSK square wave signal")); cntQSKfrequency->box(FL_UP_BOX); cntQSKfrequency->color(FL_BACKGROUND_COLOR); cntQSKfrequency->selection_color(FL_INACTIVE_COLOR); cntQSKfrequency->labeltype(FL_NORMAL_LABEL); cntQSKfrequency->labelfont(0); cntQSKfrequency->labelsize(14); cntQSKfrequency->labelcolor(FL_FOREGROUND_COLOR); cntQSKfrequency->minimum(800); cntQSKfrequency->maximum(8000); cntQSKfrequency->step(5); cntQSKfrequency->value(3200); cntQSKfrequency->callback((Fl_Callback*)cb_cntQSKfrequency); cntQSKfrequency->align(Fl_Align(FL_ALIGN_RIGHT)); cntQSKfrequency->when(FL_WHEN_CHANGED); o->value(progdefaults.QSKfrequency); o->labelsize(FL_NORMAL_SIZE); o->lstep(100); } // Fl_Counter2* cntQSKfrequency { Fl_Counter2* o = cntPreTiming = new Fl_Counter2(476, 206, 125, 24, _("Pre-keydown timing (ms)")); cntPreTiming->tooltip(_("Msec pre-keydown")); cntPreTiming->box(FL_UP_BOX); cntPreTiming->color(FL_BACKGROUND_COLOR); cntPreTiming->selection_color(FL_INACTIVE_COLOR); cntPreTiming->labeltype(FL_NORMAL_LABEL); cntPreTiming->labelfont(0); cntPreTiming->labelsize(14); cntPreTiming->labelcolor(FL_FOREGROUND_COLOR); cntPreTiming->minimum(0); cntPreTiming->maximum(100); cntPreTiming->callback((Fl_Callback*)cb_cntPreTiming); cntPreTiming->align(Fl_Align(FL_ALIGN_RIGHT)); cntPreTiming->when(FL_WHEN_CHANGED); o->value(progdefaults.CWpre); o->labelsize(FL_NORMAL_SIZE); o->lstep(1); } // Fl_Counter2* cntPreTiming { Fl_Counter2* o = cntPostTiming = new Fl_Counter2(476, 237, 125, 24, _("Post-keydown timing (ms)")); cntPostTiming->tooltip(_("Msec post-keydown")); cntPostTiming->box(FL_UP_BOX); cntPostTiming->color(FL_BACKGROUND_COLOR); cntPostTiming->selection_color(FL_INACTIVE_COLOR); cntPostTiming->labeltype(FL_NORMAL_LABEL); cntPostTiming->labelfont(0); cntPostTiming->labelsize(14); cntPostTiming->labelcolor(FL_FOREGROUND_COLOR); cntPostTiming->minimum(0); cntPostTiming->maximum(100); cntPostTiming->callback((Fl_Callback*)cb_cntPostTiming); cntPostTiming->align(Fl_Align(FL_ALIGN_RIGHT)); cntPostTiming->when(FL_WHEN_CHANGED); o->value(progdefaults.CWpost); o->labelsize(FL_NORMAL_SIZE); o->lstep(1); } // Fl_Counter2* cntPostTiming { Fl_Counter2* o = cntQSKamp = new Fl_Counter2(215, 237, 125, 24, _("QSK amplitude")); cntQSKamp->tooltip(_("Amplitude of right channel QSK signal")); cntQSKamp->box(FL_UP_BOX); cntQSKamp->color(FL_BACKGROUND_COLOR); cntQSKamp->selection_color(FL_INACTIVE_COLOR); cntQSKamp->labeltype(FL_NORMAL_LABEL); cntQSKamp->labelfont(0); cntQSKamp->labelsize(14); cntQSKamp->labelcolor(FL_FOREGROUND_COLOR); cntQSKamp->minimum(0); cntQSKamp->maximum(1); cntQSKamp->step(0.01); cntQSKamp->value(0.8); cntQSKamp->callback((Fl_Callback*)cb_cntQSKamp); cntQSKamp->align(Fl_Align(FL_ALIGN_RIGHT)); cntQSKamp->when(FL_WHEN_CHANGED); o->value(progdefaults.QSKamp); o->labelsize(FL_NORMAL_SIZE); o->lstep(0.1); } // Fl_Counter2* cntQSKamp { Fl_Counter2* o = cntQSKrisetime = new Fl_Counter2(215, 270, 125, 24, _("Edge timing")); cntQSKrisetime->tooltip(_("Leading and Trailing edge risetimes (msec)")); cntQSKrisetime->box(FL_UP_BOX); cntQSKrisetime->color(FL_BACKGROUND_COLOR); cntQSKrisetime->selection_color(FL_INACTIVE_COLOR); cntQSKrisetime->labeltype(FL_NORMAL_LABEL); cntQSKrisetime->labelfont(0); cntQSKrisetime->labelsize(14); cntQSKrisetime->labelcolor(FL_FOREGROUND_COLOR); cntQSKrisetime->minimum(0); cntQSKrisetime->maximum(15); cntQSKrisetime->value(4); cntQSKrisetime->callback((Fl_Callback*)cb_cntQSKrisetime); cntQSKrisetime->align(Fl_Align(FL_ALIGN_RIGHT)); cntQSKrisetime->when(FL_WHEN_CHANGED); o->value(progdefaults.QSKrisetime); o->labelsize(FL_NORMAL_SIZE); o->lstep(1); } // Fl_Counter2* cntQSKrisetime o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 310, 590, 40, _("Send Test character")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = i_listbox_test_char = new Fl_ListBox(391, 319, 112, 22, _("Test char")); i_listbox_test_char->tooltip(_("Test character for QSK adjustment")); i_listbox_test_char->box(FL_DOWN_BOX); i_listbox_test_char->color(FL_BACKGROUND2_COLOR); i_listbox_test_char->selection_color(FL_BACKGROUND_COLOR); i_listbox_test_char->labeltype(FL_NORMAL_LABEL); i_listbox_test_char->labelfont(0); i_listbox_test_char->labelsize(14); i_listbox_test_char->labelcolor(FL_FOREGROUND_COLOR); i_listbox_test_char->callback((Fl_Callback*)cb_i_listbox_test_char); i_listbox_test_char->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_test_char->when(FL_WHEN_RELEASE); o->add(szTestChar); o->index(progdefaults.TestChar); o->labelsize(FL_NORMAL_SIZE); i_listbox_test_char->end(); } // Fl_ListBox* i_listbox_test_char { Fl_Check_Button* o = btnQSKadjust = new Fl_Check_Button(585, 321, 152, 18, _("Send continuously")); btnQSKadjust->tooltip(_("Send a continuous stream of test characters")); btnQSKadjust->down_box(FL_DOWN_BOX); btnQSKadjust->callback((Fl_Callback*)cb_btnQSKadjust); o->value(progdefaults.QSKadjust); } // Fl_Check_Button* btnQSKadjust o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/Timing and QSK")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/Timing and QSK")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/CW/Prosigns")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(555, 39, 182, 262, _("Use these for WinKeyer\nand nanoCW")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Box* o = new Fl_Box(615, 70, 59, 22, _("\" RR")); o->tooltip(_(".-..-.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 90, 59, 22, _("$ SX")); o->tooltip(_("...-..-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 109, 59, 22, _("\' WG")); o->tooltip(_(".----.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 128, 59, 22, _("( KN")); o->tooltip(_("-.--.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 147, 59, 22, _(") KK")); o->tooltip(_("-.--.-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 166, 59, 22, _("+ AR")); o->tooltip(_(".-.-.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 185, 59, 22, _("< AR")); o->tooltip(_(".-.-.")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 204, 59, 22, _("> SK")); o->tooltip(_("...-.-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 223, 59, 22, _("= BT")); o->tooltip(_("-...-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 242, 59, 22, _("- DU")); o->tooltip(_("-....-")); } // Fl_Box* o { Fl_Box* o = new Fl_Box(615, 263, 59, 22, _("@@ AC")); o->tooltip(_(".--.-.")); } // Fl_Box* o o->end(); } // Fl_Group* o { Fl_ListBox* o = listbox_prosign[0] = new Fl_ListBox(304, 50, 47, 22, _("")); listbox_prosign[0]->box(FL_DOWN_BOX); listbox_prosign[0]->color(FL_BACKGROUND2_COLOR); listbox_prosign[0]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[0]->labeltype(FL_NORMAL_LABEL); listbox_prosign[0]->labelfont(0); listbox_prosign[0]->labelsize(14); listbox_prosign[0]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[0]->callback((Fl_Callback*)cb_listbox_prosign); listbox_prosign[0]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[0]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[0]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[0]->end(); } // Fl_ListBox* listbox_prosign[0] { Fl_ListBox* o = listbox_prosign[1] = new Fl_ListBox(304, 77, 47, 22, _("")); listbox_prosign[1]->box(FL_DOWN_BOX); listbox_prosign[1]->color(FL_BACKGROUND2_COLOR); listbox_prosign[1]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[1]->labeltype(FL_NORMAL_LABEL); listbox_prosign[1]->labelfont(0); listbox_prosign[1]->labelsize(14); listbox_prosign[1]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[1]->callback((Fl_Callback*)cb_listbox_prosign1); listbox_prosign[1]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[1]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[1]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[1]->end(); } // Fl_ListBox* listbox_prosign[1] { Fl_ListBox* o = listbox_prosign[2] = new Fl_ListBox(304, 105, 47, 22, _("")); listbox_prosign[2]->box(FL_DOWN_BOX); listbox_prosign[2]->color(FL_BACKGROUND2_COLOR); listbox_prosign[2]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[2]->labeltype(FL_NORMAL_LABEL); listbox_prosign[2]->labelfont(0); listbox_prosign[2]->labelsize(14); listbox_prosign[2]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[2]->callback((Fl_Callback*)cb_listbox_prosign2); listbox_prosign[2]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[2]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[2]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[2]->end(); } // Fl_ListBox* listbox_prosign[2] { Fl_ListBox* o = listbox_prosign[3] = new Fl_ListBox(304, 132, 47, 22, _("")); listbox_prosign[3]->box(FL_DOWN_BOX); listbox_prosign[3]->color(FL_BACKGROUND2_COLOR); listbox_prosign[3]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[3]->labeltype(FL_NORMAL_LABEL); listbox_prosign[3]->labelfont(0); listbox_prosign[3]->labelsize(14); listbox_prosign[3]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[3]->callback((Fl_Callback*)cb_listbox_prosign3); listbox_prosign[3]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[3]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[3]; o->value(s); listbox_prosign[3]->end(); } // Fl_ListBox* listbox_prosign[3] { Fl_ListBox* o = listbox_prosign[4] = new Fl_ListBox(304, 160, 47, 22, _("")); listbox_prosign[4]->box(FL_DOWN_BOX); listbox_prosign[4]->color(FL_BACKGROUND2_COLOR); listbox_prosign[4]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[4]->labeltype(FL_NORMAL_LABEL); listbox_prosign[4]->labelfont(0); listbox_prosign[4]->labelsize(14); listbox_prosign[4]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[4]->callback((Fl_Callback*)cb_listbox_prosign4); listbox_prosign[4]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[4]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[4]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[4]->end(); } // Fl_ListBox* listbox_prosign[4] { Fl_ListBox* o = listbox_prosign[5] = new Fl_ListBox(304, 188, 47, 22, _("")); listbox_prosign[5]->box(FL_DOWN_BOX); listbox_prosign[5]->color(FL_BACKGROUND2_COLOR); listbox_prosign[5]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[5]->labeltype(FL_NORMAL_LABEL); listbox_prosign[5]->labelfont(0); listbox_prosign[5]->labelsize(14); listbox_prosign[5]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[5]->callback((Fl_Callback*)cb_listbox_prosign5); listbox_prosign[5]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[5]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[5]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[5]->end(); } // Fl_ListBox* listbox_prosign[5] { Fl_ListBox* o = listbox_prosign[6] = new Fl_ListBox(304, 215, 47, 22, _("")); listbox_prosign[6]->box(FL_DOWN_BOX); listbox_prosign[6]->color(FL_BACKGROUND2_COLOR); listbox_prosign[6]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[6]->labeltype(FL_NORMAL_LABEL); listbox_prosign[6]->labelfont(0); listbox_prosign[6]->labelsize(14); listbox_prosign[6]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[6]->callback((Fl_Callback*)cb_listbox_prosign6); listbox_prosign[6]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[6]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[6]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[6]->end(); } // Fl_ListBox* listbox_prosign[6] { Fl_ListBox* o = listbox_prosign[7] = new Fl_ListBox(304, 243, 47, 22, _("")); listbox_prosign[7]->box(FL_DOWN_BOX); listbox_prosign[7]->color(FL_BACKGROUND2_COLOR); listbox_prosign[7]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[7]->labeltype(FL_NORMAL_LABEL); listbox_prosign[7]->labelfont(0); listbox_prosign[7]->labelsize(14); listbox_prosign[7]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[7]->callback((Fl_Callback*)cb_listbox_prosign7); listbox_prosign[7]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[7]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[7]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[7]->end(); } // Fl_ListBox* listbox_prosign[7] { Fl_ListBox* o = listbox_prosign[8] = new Fl_ListBox(304, 271, 47, 22, _("")); listbox_prosign[8]->box(FL_DOWN_BOX); listbox_prosign[8]->color(FL_BACKGROUND2_COLOR); listbox_prosign[8]->selection_color(FL_BACKGROUND_COLOR); listbox_prosign[8]->labeltype(FL_NORMAL_LABEL); listbox_prosign[8]->labelfont(0); listbox_prosign[8]->labelsize(14); listbox_prosign[8]->labelcolor(FL_FOREGROUND_COLOR); listbox_prosign[8]->callback((Fl_Callback*)cb_listbox_prosign8); listbox_prosign[8]->align(Fl_Align(FL_ALIGN_LEFT)); listbox_prosign[8]->when(FL_WHEN_RELEASE); o->add(szProsigns); char s[2] = " "; s[0] = progdefaults.CW_prosigns[8]; o->value(s); o->labelsize(FL_NORMAL_SIZE); listbox_prosign[8]->end(); } // Fl_ListBox* listbox_prosign[8] { Fl_Check_Button* o = btnCW_use_paren = new Fl_Check_Button(354, 187, 68, 15, _("Use \'(\' paren not KN")); btnCW_use_paren->down_box(FL_DOWN_BOX); btnCW_use_paren->callback((Fl_Callback*)cb_btnCW_use_paren); o->value(progdefaults.CW_use_paren); } // Fl_Check_Button* btnCW_use_paren { Fl_Check_Button* o = btnCW_prosign_display = new Fl_Check_Button(304, 301, 68, 15, _("Display decoded as assigned key")); btnCW_prosign_display->tooltip(_("Display the decoded prosign in the RX text using the short cut key")); btnCW_prosign_display->down_box(FL_DOWN_BOX); btnCW_prosign_display->callback((Fl_Callback*)cb_btnCW_prosign_display); o->value(progdefaults.CW_prosign_display); } // Fl_Check_Button* btnCW_prosign_display CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/Prosigns")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/Prosigns")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/CW/Extended Chars.")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 30, 590, 286, _("Check to enable character encode/decode\nSelect one character from each group")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Group* o = new Fl_Group(210, 109, 99, 80); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_A_aelig = new Fl_Check_Button(216, 125, 70, 15, _("A aelig")); btn_A_aelig->tooltip(_("Swap left/right keyer contacts")); btn_A_aelig->down_box(FL_DOWN_BOX); btn_A_aelig->callback((Fl_Callback*)cb_btn_A_aelig); o->value(progdefaults.A_aelig); } // Fl_Check_Button* btn_A_aelig { Fl_Check_Button* o = btn_A_umlaut = new Fl_Check_Button(216, 162, 70, 15, _(" A umlaut")); btn_A_umlaut->tooltip(_("Swap left/right keyer contacts")); btn_A_umlaut->down_box(FL_DOWN_BOX); btn_A_umlaut->callback((Fl_Callback*)cb_btn_A_umlaut); o->value(progdefaults.A_umlaut); } // Fl_Check_Button* btn_A_umlaut o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_A_ring = new Fl_Check_Button(216, 199, 70, 15, _(" A ring")); btn_A_ring->tooltip(_("Swap left/right keyer contacts")); btn_A_ring->down_box(FL_DOWN_BOX); btn_A_ring->callback((Fl_Callback*)cb_btn_A_ring); o->value(progdefaults.A_ring); } // Fl_Check_Button* btn_A_ring { Fl_Group* o = new Fl_Group(311, 109, 99, 120); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_O_acute = new Fl_Check_Button(316, 125, 70, 15, _(" O acute")); btn_O_acute->tooltip(_("Swap left/right keyer contacts")); btn_O_acute->down_box(FL_DOWN_BOX); btn_O_acute->callback((Fl_Callback*)cb_btn_O_acute); o->value(progdefaults.O_acute); } // Fl_Check_Button* btn_O_acute { Fl_Check_Button* o = btn_O_slash = new Fl_Check_Button(316, 199, 70, 15, _(" O slash")); btn_O_slash->tooltip(_("Swap left/right keyer contacts")); btn_O_slash->down_box(FL_DOWN_BOX); btn_O_slash->callback((Fl_Callback*)cb_btn_O_slash); o->value(progdefaults.O_slash); } // Fl_Check_Button* btn_O_slash { Fl_Check_Button* o = btn_O_umlaut = new Fl_Check_Button(316, 162, 70, 15, _(" O umlaut")); btn_O_umlaut->tooltip(_("Swap left/right keyer contacts")); btn_O_umlaut->down_box(FL_DOWN_BOX); btn_O_umlaut->callback((Fl_Callback*)cb_btn_O_umlaut); o->value(progdefaults.O_umlaut); } // Fl_Check_Button* btn_O_umlaut o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_C_cedilla = new Fl_Check_Button(413, 125, 70, 15, _(" C cedilla")); btn_C_cedilla->tooltip(_("Swap left/right keyer contacts")); btn_C_cedilla->down_box(FL_DOWN_BOX); btn_C_cedilla->callback((Fl_Callback*)cb_btn_C_cedilla); o->value(progdefaults.C_cedilla); } // Fl_Check_Button* btn_C_cedilla { Fl_Check_Button* o = btn_E_grave = new Fl_Check_Button(511, 125, 70, 15, _(" E grave")); btn_E_grave->tooltip(_("Swap left/right keyer contacts")); btn_E_grave->down_box(FL_DOWN_BOX); btn_E_grave->callback((Fl_Callback*)cb_btn_E_grave); o->value(progdefaults.E_grave); } // Fl_Check_Button* btn_E_grave { Fl_Check_Button* o = btn_E_acute = new Fl_Check_Button(511, 162, 70, 15, _(" E acute")); btn_E_acute->tooltip(_("Swap left/right keyer contacts")); btn_E_acute->down_box(FL_DOWN_BOX); btn_E_acute->callback((Fl_Callback*)cb_btn_E_acute); o->value(progdefaults.E_acute); } // Fl_Check_Button* btn_E_acute { Fl_Check_Button* o = btn_N_tilde = new Fl_Check_Button(604, 125, 70, 15, _(" N tilde")); btn_N_tilde->tooltip(_("Swap left/right keyer contacts")); btn_N_tilde->down_box(FL_DOWN_BOX); btn_N_tilde->callback((Fl_Callback*)cb_btn_N_tilde); o->value(progdefaults.N_tilde); } // Fl_Check_Button* btn_N_tilde { Fl_Group* o = new Fl_Group(690, 109, 99, 80); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_U_umlaut = new Fl_Check_Button(695, 125, 70, 15, _(" U umlaut")); btn_U_umlaut->tooltip(_("Swap left/right keyer contacts")); btn_U_umlaut->down_box(FL_DOWN_BOX); btn_U_umlaut->callback((Fl_Callback*)cb_btn_U_umlaut); o->value(progdefaults.U_umlaut); } // Fl_Check_Button* btn_U_umlaut { Fl_Check_Button* o = btn_U_circ = new Fl_Check_Button(695, 162, 70, 15, _(" U circ")); btn_U_circ->tooltip(_("Swap left/right keyer contacts")); btn_U_circ->down_box(FL_DOWN_BOX); btn_U_circ->callback((Fl_Callback*)cb_btn_U_circ); o->value(progdefaults.U_circ); } // Fl_Check_Button* btn_U_circ o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(310, 249, 403, 45, _("See https://en.wikipedia.org/wiki/Morse_code\nfor information regarding exten\ ded Morse characters.")); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/Extended Chars.")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/Extended Chars.")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Punctuation/Noise Processing")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 30, 590, 190, _("Check to enable character encode/decode")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_CW_backslash = new Fl_Check_Button(265, 65, 70, 15, _(" backslash \\ \".-..-.\"")); btn_CW_backslash->tooltip(_("disable for no printed character")); btn_CW_backslash->down_box(FL_DOWN_BOX); btn_CW_backslash->value(1); btn_CW_backslash->labelfont(4); btn_CW_backslash->callback((Fl_Callback*)cb_btn_CW_backslash); o->value(progdefaults.CW_backslash); } // Fl_Check_Button* btn_CW_backslash { Fl_Check_Button* o = btn_CW_apostrophe = new Fl_Check_Button(265, 90, 70, 15, _(" apostrophe \' \".----.\"")); btn_CW_apostrophe->tooltip(_("disable for no printed character")); btn_CW_apostrophe->down_box(FL_DOWN_BOX); btn_CW_apostrophe->value(1); btn_CW_apostrophe->labelfont(4); btn_CW_apostrophe->callback((Fl_Callback*)cb_btn_CW_apostrophe); o->value(progdefaults.CW_apostrophe); } // Fl_Check_Button* btn_CW_apostrophe { Fl_Check_Button* o = btn_CW_quote = new Fl_Check_Button(265, 115, 70, 15, _(" quote \" \".-..-.\"")); btn_CW_quote->tooltip(_("disable for no printed character")); btn_CW_quote->down_box(FL_DOWN_BOX); btn_CW_quote->value(1); btn_CW_quote->labelfont(4); btn_CW_quote->callback((Fl_Callback*)cb_btn_CW_quote); o->value(progdefaults.CW_quote); } // Fl_Check_Button* btn_CW_quote { Fl_Check_Button* o = btn_CW_dollar_sign = new Fl_Check_Button(265, 140, 70, 15, _(" dollar sign $ \"...-..-\"")); btn_CW_dollar_sign->tooltip(_("disable for no printed character")); btn_CW_dollar_sign->down_box(FL_DOWN_BOX); btn_CW_dollar_sign->value(1); btn_CW_dollar_sign->labelfont(4); btn_CW_dollar_sign->callback((Fl_Callback*)cb_btn_CW_dollar_sign); o->value(progdefaults.CW_dollar_sign); } // Fl_Check_Button* btn_CW_dollar_sign { Fl_Check_Button* o = btn_CW_open_paren = new Fl_Check_Button(265, 165, 70, 15, _(" open_paren ( \"-.--.\"")); btn_CW_open_paren->tooltip(_("disable for no printed character")); btn_CW_open_paren->down_box(FL_DOWN_BOX); btn_CW_open_paren->value(1); btn_CW_open_paren->labelfont(4); btn_CW_open_paren->callback((Fl_Callback*)cb_btn_CW_open_paren); o->value(progdefaults.CW_open_paren); } // Fl_Check_Button* btn_CW_open_paren { Fl_Check_Button* o = btn_CW_close_paren = new Fl_Check_Button(265, 190, 70, 15, _(" close paren ) \"-.--.-\"")); btn_CW_close_paren->tooltip(_("disable for no printed character")); btn_CW_close_paren->down_box(FL_DOWN_BOX); btn_CW_close_paren->value(1); btn_CW_close_paren->labelfont(4); btn_CW_close_paren->callback((Fl_Callback*)cb_btn_CW_close_paren); o->value(progdefaults.CW_close_paren); } // Fl_Check_Button* btn_CW_close_paren { Fl_Check_Button* o = btn_CW_colon = new Fl_Check_Button(535, 65, 70, 15, _(" colon : \"---...\"")); btn_CW_colon->tooltip(_("disable for no printed character")); btn_CW_colon->down_box(FL_DOWN_BOX); btn_CW_colon->value(1); btn_CW_colon->labelfont(4); btn_CW_colon->callback((Fl_Callback*)cb_btn_CW_colon); o->value(progdefaults.CW_colon); } // Fl_Check_Button* btn_CW_colon { Fl_Check_Button* o = btn_CW_semi_colon = new Fl_Check_Button(535, 90, 70, 15, _(" semi colon ; \"-.-.-.\"")); btn_CW_semi_colon->tooltip(_("disable for no printed character")); btn_CW_semi_colon->down_box(FL_DOWN_BOX); btn_CW_semi_colon->value(1); btn_CW_semi_colon->labelfont(4); btn_CW_semi_colon->callback((Fl_Callback*)cb_btn_CW_semi_colon); o->value(progdefaults.CW_semi_colon); } // Fl_Check_Button* btn_CW_semi_colon { Fl_Check_Button* o = btn_CW_underscore = new Fl_Check_Button(535, 115, 70, 15, _(" underscore _ \"..--.-\"")); btn_CW_underscore->tooltip(_("disable for no printed character")); btn_CW_underscore->down_box(FL_DOWN_BOX); btn_CW_underscore->value(1); btn_CW_underscore->labelfont(4); btn_CW_underscore->callback((Fl_Callback*)cb_btn_CW_underscore); o->value(progdefaults.CW_underscore); } // Fl_Check_Button* btn_CW_underscore { Fl_Check_Button* o = btn_CW_at_symbol = new Fl_Check_Button(535, 140, 70, 15, _(" at symbol @@ \".--.-.\"")); btn_CW_at_symbol->tooltip(_("disable for no printed character")); btn_CW_at_symbol->down_box(FL_DOWN_BOX); btn_CW_at_symbol->value(1); btn_CW_at_symbol->labelfont(4); btn_CW_at_symbol->callback((Fl_Callback*)cb_btn_CW_at_symbol); o->value(progdefaults.CW_at_symbol); } // Fl_Check_Button* btn_CW_at_symbol { Fl_Check_Button* o = btn_CW_exclamation = new Fl_Check_Button(535, 165, 70, 15, _(" exclamation ! \"-.-.--\"")); btn_CW_exclamation->tooltip(_("disable for no printed character")); btn_CW_exclamation->down_box(FL_DOWN_BOX); btn_CW_exclamation->value(1); btn_CW_exclamation->labelfont(4); btn_CW_exclamation->callback((Fl_Callback*)cb_btn_CW_exclamation); o->value(progdefaults.CW_exclamation); } // Fl_Check_Button* btn_CW_exclamation o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 224, 590, 120, _("Unknown character decode (noise)")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_CW_noise0 = new Fl_Check_Button(265, 248, 193, 15, _(" Do not display unknown MORSE symbol")); btn_CW_noise0->tooltip(_("disable \'*\'or no printed character")); btn_CW_noise0->down_box(FL_DOWN_BOX); btn_CW_noise0->labelfont(4); btn_CW_noise0->callback((Fl_Callback*)cb_btn_CW_noise0); o->value(progdefaults.CW_noise == 0); } // Fl_Check_Button* btn_CW_noise0 { Fl_Check_Button* o = btn_CW_noise1 = new Fl_Check_Button(265, 264, 193, 24, _(" Display \'*\' character for unknown MORSE symbol")); btn_CW_noise1->tooltip(_("disable \'*\'or no printed character")); btn_CW_noise1->down_box(FL_DOWN_BOX); btn_CW_noise1->labelfont(4); btn_CW_noise1->callback((Fl_Callback*)cb_btn_CW_noise1); o->value(progdefaults.CW_noise == '*'); } // Fl_Check_Button* btn_CW_noise1 { Fl_Check_Button* o = btn_CW_noise2 = new Fl_Check_Button(265, 289, 193, 24, _(" Display \'_\' character for unknown MORSE symbol")); btn_CW_noise2->tooltip(_("disable \'_\' for no printed character")); btn_CW_noise2->down_box(FL_DOWN_BOX); btn_CW_noise2->labelfont(4); btn_CW_noise2->callback((Fl_Callback*)cb_btn_CW_noise2); o->value(progdefaults.CW_noise == '_'); } // Fl_Check_Button* btn_CW_noise2 { Fl_Check_Button* o = btn_CW_noise3 = new Fl_Check_Button(265, 314, 193, 24, _(" Display \' \' character for unknown MORSE symbol")); btn_CW_noise3->tooltip(_("disable \' \' for no printed character")); btn_CW_noise3->down_box(FL_DOWN_BOX); btn_CW_noise3->labelfont(4); btn_CW_noise3->callback((Fl_Callback*)cb_btn_CW_noise3); o->value(progdefaults.CW_noise == ' '); } // Fl_Check_Button* btn_CW_noise3 o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/Punctuation-Noise")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/Punctuation-Noise")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/CW/WinKeyer")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_ComboBox* o = select_WK_CommPort = new Fl_ComboBox(274, 30, 405, 25, _("Ser. Port")); select_WK_CommPort->tooltip(_("Xcvr serial port")); select_WK_CommPort->box(FL_DOWN_BOX); select_WK_CommPort->color((Fl_Color)55); select_WK_CommPort->selection_color(FL_BACKGROUND_COLOR); select_WK_CommPort->labeltype(FL_NORMAL_LABEL); select_WK_CommPort->labelfont(0); select_WK_CommPort->labelsize(14); select_WK_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_WK_CommPort->callback((Fl_Callback*)cb_select_WK_CommPort); select_WK_CommPort->align(Fl_Align(FL_ALIGN_LEFT)); select_WK_CommPort->when(FL_WHEN_RELEASE); o->value(progStatus.WK_serial_port_name.c_str()); select_WK_CommPort->end(); } // Fl_ComboBox* select_WK_CommPort { Fl_Light_Button* o = btn_WKCW_connect = new Fl_Light_Button(705, 30, 80, 25, _("Connect")); btn_WKCW_connect->tooltip(_("Connect / Disconnect from WinKeyer")); btn_WKCW_connect->callback((Fl_Callback*)cb_btn_WKCW_connect); o->value(progStatus.WK_online); } // Fl_Light_Button* btn_WKCW_connect { box_WK_wait = new Fl_Box(269, 66, 16, 16, _("Wait")); box_WK_wait->box(FL_DIAMOND_DOWN_BOX); box_WK_wait->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_wait { box_WK_break_in = new Fl_Box(344, 66, 16, 16, _("Bk")); box_WK_break_in->box(FL_DIAMOND_DOWN_BOX); box_WK_break_in->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_break_in { box_WK_busy = new Fl_Box(419, 66, 16, 16, _("Busy")); box_WK_busy->box(FL_DIAMOND_DOWN_BOX); box_WK_busy->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_busy { box_WK_xoff = new Fl_Box(494, 66, 16, 16, _("Bfr")); box_WK_xoff->box(FL_DIAMOND_DOWN_BOX); box_WK_xoff->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_xoff { box_WK_keydown = new Fl_Box(570, 66, 16, 16, _("Key")); box_WK_keydown->box(FL_DIAMOND_DOWN_BOX); box_WK_keydown->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_WK_keydown { choice_WK_keyer_mode = new Fl_ComboBox(237, 104, 90, 22, _("Keyer Mode")); choice_WK_keyer_mode->box(FL_BORDER_BOX); choice_WK_keyer_mode->color((Fl_Color)55); choice_WK_keyer_mode->selection_color(FL_BACKGROUND_COLOR); choice_WK_keyer_mode->labeltype(FL_NORMAL_LABEL); choice_WK_keyer_mode->labelfont(0); choice_WK_keyer_mode->labelsize(14); choice_WK_keyer_mode->labelcolor(FL_FOREGROUND_COLOR); choice_WK_keyer_mode->callback((Fl_Callback*)cb_choice_WK_keyer_mode); choice_WK_keyer_mode->align(Fl_Align(FL_ALIGN_TOP)); choice_WK_keyer_mode->when(FL_WHEN_RELEASE); choice_WK_keyer_mode->end(); } // Fl_ComboBox* choice_WK_keyer_mode { choice_WK_hang = new Fl_ComboBox(383, 104, 90, 22, _("Hang")); choice_WK_hang->box(FL_BORDER_BOX); choice_WK_hang->color((Fl_Color)55); choice_WK_hang->selection_color(FL_BACKGROUND_COLOR); choice_WK_hang->labeltype(FL_NORMAL_LABEL); choice_WK_hang->labelfont(0); choice_WK_hang->labelsize(14); choice_WK_hang->labelcolor(FL_FOREGROUND_COLOR); choice_WK_hang->callback((Fl_Callback*)cb_choice_WK_hang); choice_WK_hang->align(Fl_Align(FL_ALIGN_TOP)); choice_WK_hang->when(FL_WHEN_RELEASE); choice_WK_hang->end(); } // Fl_ComboBox* choice_WK_hang { choice_WK_sidetone = new Fl_ComboBox(530, 104, 90, 22, _("Sidetone")); choice_WK_sidetone->box(FL_BORDER_BOX); choice_WK_sidetone->color((Fl_Color)55); choice_WK_sidetone->selection_color(FL_BACKGROUND_COLOR); choice_WK_sidetone->labeltype(FL_NORMAL_LABEL); choice_WK_sidetone->labelfont(0); choice_WK_sidetone->labelsize(14); choice_WK_sidetone->labelcolor(FL_FOREGROUND_COLOR); choice_WK_sidetone->callback((Fl_Callback*)cb_choice_WK_sidetone); choice_WK_sidetone->align(Fl_Align(FL_ALIGN_TOP)); choice_WK_sidetone->when(FL_WHEN_RELEASE); choice_WK_sidetone->end(); } // Fl_ComboBox* choice_WK_sidetone { choice_WK_output_pins = new Fl_ComboBox(677, 104, 90, 22, _("Output PIns")); choice_WK_output_pins->box(FL_BORDER_BOX); choice_WK_output_pins->color((Fl_Color)55); choice_WK_output_pins->selection_color(FL_BACKGROUND_COLOR); choice_WK_output_pins->labeltype(FL_NORMAL_LABEL); choice_WK_output_pins->labelfont(0); choice_WK_output_pins->labelsize(14); choice_WK_output_pins->labelcolor(FL_FOREGROUND_COLOR); choice_WK_output_pins->callback((Fl_Callback*)cb_choice_WK_output_pins); choice_WK_output_pins->align(Fl_Align(FL_ALIGN_TOP)); choice_WK_output_pins->when(FL_WHEN_RELEASE); choice_WK_output_pins->end(); } // Fl_ComboBox* choice_WK_output_pins { btn_WK_use_pot = new Fl_Check_Button(623, 64, 20, 16, _("Use Pot")); btn_WK_use_pot->tooltip(_("Winkeyer pot controls WPM")); btn_WK_use_pot->down_box(FL_DOWN_BOX); btn_WK_use_pot->callback((Fl_Callback*)cb_btn_WK_use_pot); btn_WK_use_pot->align(Fl_Align(FL_ALIGN_RIGHT)); btn_WK_use_pot->when(FL_WHEN_CHANGED); } // Fl_Check_Button* btn_WK_use_pot { txt_WK_wpm = new Fl_Output(710, 61, 50, 24); txt_WK_wpm->tooltip(_("WPM setting")); } // Fl_Output* txt_WK_wpm { Fl_Group* o = new Fl_Group(210, 132, 134, 184, _("ModeReg")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { btn_WK_swap = new Fl_Check_Button(220, 174, 70, 15, _("Swap")); btn_WK_swap->tooltip(_("Swap left/right keyer contacts")); btn_WK_swap->down_box(FL_DOWN_BOX); btn_WK_swap->callback((Fl_Callback*)cb_btn_WK_swap); } // Fl_Check_Button* btn_WK_swap { btn_WK_auto_space = new Fl_Check_Button(220, 204, 70, 15, _("Auto Space")); btn_WK_auto_space->tooltip(_("Enable paddle auto spacing of characters")); btn_WK_auto_space->down_box(FL_DOWN_BOX); btn_WK_auto_space->callback((Fl_Callback*)cb_btn_WK_auto_space); } // Fl_Check_Button* btn_WK_auto_space { btn_WK_ct_space = new Fl_Check_Button(220, 234, 70, 15, _("CT space")); btn_WK_ct_space->tooltip(_("Enable contest character spacing")); btn_WK_ct_space->down_box(FL_DOWN_BOX); btn_WK_ct_space->callback((Fl_Callback*)cb_btn_WK_ct_space); } // Fl_Check_Button* btn_WK_ct_space { btn_WK_paddledog = new Fl_Check_Button(220, 264, 70, 15, _("Paddle Dog")); btn_WK_paddledog->down_box(FL_DOWN_BOX); btn_WK_paddledog->callback((Fl_Callback*)cb_btn_WK_paddledog); } // Fl_Check_Button* btn_WK_paddledog { btn_WK_cut_zeronine = new Fl_Check_Button(220, 294, 70, 15, _("Cut 0/9")); btn_WK_cut_zeronine->tooltip(_("Use T/N for 0/9")); btn_WK_cut_zeronine->down_box(FL_DOWN_BOX); btn_WK_cut_zeronine->callback((Fl_Callback*)cb_btn_WK_cut_zeronine); } // Fl_Check_Button* btn_WK_cut_zeronine o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(367, 132, 134, 184, _("ModeReg")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { btn_WK_paddle_echo = new Fl_Check_Button(373, 174, 70, 16, _("Paddle echo")); btn_WK_paddle_echo->tooltip(_("Echo paddle chars to Rx Panel")); btn_WK_paddle_echo->down_box(FL_DOWN_BOX); btn_WK_paddle_echo->callback((Fl_Callback*)cb_btn_WK_paddle_echo); } // Fl_Check_Button* btn_WK_paddle_echo { btn_WK_serial_echo = new Fl_Check_Button(373, 204, 70, 16, _("Serial echo")); btn_WK_serial_echo->down_box(FL_DOWN_BOX); btn_WK_serial_echo->value(1); btn_WK_serial_echo->callback((Fl_Callback*)cb_btn_WK_serial_echo); } // Fl_Check_Button* btn_WK_serial_echo { btn_WK_sidetone_on = new Fl_Check_Button(373, 234, 103, 16, _("Tone Keyer")); btn_WK_sidetone_on->tooltip(_("Enable Winkeyer tone keying")); btn_WK_sidetone_on->down_box(FL_DOWN_BOX); btn_WK_sidetone_on->callback((Fl_Callback*)cb_btn_WK_sidetone_on); } // Fl_Check_Button* btn_WK_sidetone_on { btn_WK_tone_on = new Fl_Check_Button(373, 264, 87, 16, _("Tone ON")); btn_WK_tone_on->tooltip(_("Enable Winkeyer audio tone")); btn_WK_tone_on->down_box(FL_DOWN_BOX); btn_WK_tone_on->callback((Fl_Callback*)cb_btn_WK_tone_on); } // Fl_Check_Button* btn_WK_tone_on { btn_WK_ptt_on = new Fl_Check_Button(373, 294, 87, 16, _("PTT ON")); btn_WK_ptt_on->tooltip(_("Enable Winkeyer PTT output")); btn_WK_ptt_on->down_box(FL_DOWN_BOX); btn_WK_ptt_on->callback((Fl_Callback*)cb_btn_WK_ptt_on); } // Fl_Check_Button* btn_WK_ptt_on o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(510, 132, 112, 209, _("WPM Settings")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { cntr_WK_min_wpm = new Fl_Counter(531, 172, 64, 22, _("Min WPM")); cntr_WK_min_wpm->tooltip(_("Minimum WPM setting\ndefault = 10")); cntr_WK_min_wpm->type(1); cntr_WK_min_wpm->minimum(10); cntr_WK_min_wpm->maximum(30); cntr_WK_min_wpm->step(1); cntr_WK_min_wpm->value(10); cntr_WK_min_wpm->callback((Fl_Callback*)cb_cntr_WK_min_wpm); } // Fl_Counter* cntr_WK_min_wpm { cntr_WK_rng_wpm = new Fl_Counter(531, 215, 64, 21, _("Rng WPM")); cntr_WK_rng_wpm->tooltip(_("Range WPM setting\ndefault = 25")); cntr_WK_rng_wpm->type(1); cntr_WK_rng_wpm->callback((Fl_Callback*)cb_cntr_WK_rng_wpm); } // Fl_Counter* cntr_WK_rng_wpm { cntr_WK_farnsworth = new Fl_Counter(531, 257, 64, 22, _("Farsnworth")); cntr_WK_farnsworth->tooltip(_("Farnsworth keying (0 = none)\ndefault = 0")); cntr_WK_farnsworth->type(1); cntr_WK_farnsworth->callback((Fl_Callback*)cb_cntr_WK_farnsworth); } // Fl_Counter* cntr_WK_farnsworth { cntr_WK_cmd_wpm = new Fl_Counter(531, 300, 64, 22, _("Cmd WPM")); cntr_WK_cmd_wpm->tooltip(_("WPM speed for Winkeyer Command strings\ndefault = 18")); cntr_WK_cmd_wpm->type(1); cntr_WK_cmd_wpm->callback((Fl_Callback*)cb_cntr_WK_cmd_wpm); } // Fl_Counter* cntr_WK_cmd_wpm o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(630, 132, 160, 209, _("Timing/Settings")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { cntr_WK_ratio = new Fl_Counter(642, 172, 64, 22, _("Ratio")); cntr_WK_ratio->tooltip(_("Keying ratio\ndefault = 3.0")); cntr_WK_ratio->type(1); cntr_WK_ratio->callback((Fl_Callback*)cb_cntr_WK_ratio); } // Fl_Counter* cntr_WK_ratio { cntr_WK_comp = new Fl_Counter(642, 215, 64, 21, _("Comp")); cntr_WK_comp->tooltip(_("Compensation in msec\ndefault = 0")); cntr_WK_comp->type(1); cntr_WK_comp->callback((Fl_Callback*)cb_cntr_WK_comp); } // Fl_Counter* cntr_WK_comp { cntr_WK_first_ext = new Fl_Counter(642, 257, 64, 22, _("1st Ext")); cntr_WK_first_ext->tooltip(_("Extra duration to first dit/dot in msec\ndefault = 0")); cntr_WK_first_ext->type(1); cntr_WK_first_ext->callback((Fl_Callback*)cb_cntr_WK_first_ext); } // Fl_Counter* cntr_WK_first_ext { cntr_WK_sample = new Fl_Counter(642, 300, 64, 22, _("Sample")); cntr_WK_sample->tooltip(_("Paddle sampling (see Winkeyer manual)\ndefault = 50")); cntr_WK_sample->type(1); cntr_WK_sample->callback((Fl_Callback*)cb_cntr_WK_sample); } // Fl_Counter* cntr_WK_sample { cntr_WK_weight = new Fl_Counter(713, 172, 64, 22, _("Weight")); cntr_WK_weight->tooltip(_("Keying weight\ndefault = 50")); cntr_WK_weight->type(1); cntr_WK_weight->callback((Fl_Callback*)cb_cntr_WK_weight); } // Fl_Counter* cntr_WK_weight { cntr_WK_leadin = new Fl_Counter(713, 215, 64, 21, _("Leadin")); cntr_WK_leadin->tooltip(_("Leadin in msec\ndefault = 0")); cntr_WK_leadin->type(1); cntr_WK_leadin->callback((Fl_Callback*)cb_cntr_WK_leadin); } // Fl_Counter* cntr_WK_leadin { cntr_WK_tail = new Fl_Counter(713, 257, 64, 22, _("Tail")); cntr_WK_tail->tooltip(_("Extend last dit/dot in msec\ndefault = 0")); cntr_WK_tail->type(1); cntr_WK_tail->callback((Fl_Callback*)cb_cntr_WK_tail); } // Fl_Counter* cntr_WK_tail o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(210, 317, 291, 25); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnK3NG = new Fl_Check_Button(220, 324, 223, 15, _("K3NG Arduino sketch emulation")); btnK3NG->tooltip(_("Activate for Mortty K3NG sketch")); btnK3NG->down_box(FL_DOWN_BOX); btnK3NG->callback((Fl_Callback*)cb_btnK3NG); o->value(progdefaults.WK_K3NGsketch); } // Fl_Check_Button* btnK3NG o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/WinKeyer")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/WinKeyer")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/CW/nanoIO")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_ComboBox* o = select_nanoCW_CommPort = new Fl_ComboBox(270, 21, 435, 23, _("Ser. Port")); select_nanoCW_CommPort->tooltip(_("nanoIO serial port")); select_nanoCW_CommPort->box(FL_DOWN_BOX); select_nanoCW_CommPort->color((Fl_Color)55); select_nanoCW_CommPort->selection_color(FL_BACKGROUND_COLOR); select_nanoCW_CommPort->labeltype(FL_NORMAL_LABEL); select_nanoCW_CommPort->labelfont(0); select_nanoCW_CommPort->labelsize(14); select_nanoCW_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_nanoCW_CommPort->callback((Fl_Callback*)cb_select_nanoCW_CommPort); select_nanoCW_CommPort->align(Fl_Align(FL_ALIGN_LEFT)); select_nanoCW_CommPort->when(FL_WHEN_RELEASE); o->value(progdefaults.nanoIO_serial_port_name.c_str()); select_nanoCW_CommPort->end(); } // Fl_ComboBox* select_nanoCW_CommPort { btn_nanoCW_connect = new Fl_Light_Button(711, 21, 80, 22, _("Connect")); btn_nanoCW_connect->tooltip(_("Connect / Disconnect from nanoIO")); btn_nanoCW_connect->callback((Fl_Callback*)cb_btn_nanoCW_connect); } // Fl_Light_Button* btn_nanoCW_connect { Fl_Counter* o = cntr_nanoCW_paddle_WPM = new Fl_Counter(260, 48, 110, 22, _("Paddle")); cntr_nanoCW_paddle_WPM->tooltip(_("CW wpm using paddle keyer")); cntr_nanoCW_paddle_WPM->minimum(5); cntr_nanoCW_paddle_WPM->maximum(100); cntr_nanoCW_paddle_WPM->step(1); cntr_nanoCW_paddle_WPM->value(20); cntr_nanoCW_paddle_WPM->callback((Fl_Callback*)cb_cntr_nanoCW_paddle_WPM); cntr_nanoCW_paddle_WPM->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.CW_keyspeed); o->lstep(5); } // Fl_Counter* cntr_nanoCW_paddle_WPM { FTextView* o = txt_nano_CW_io = new FTextView(204, 155, 590, 189); txt_nano_CW_io->box(FL_DOWN_FRAME); txt_nano_CW_io->color(FL_BACKGROUND2_COLOR); txt_nano_CW_io->selection_color(FL_SELECTION_COLOR); txt_nano_CW_io->labeltype(FL_NORMAL_LABEL); txt_nano_CW_io->labelfont(0); txt_nano_CW_io->labelsize(14); txt_nano_CW_io->labelcolor(FL_FOREGROUND_COLOR); txt_nano_CW_io->align(Fl_Align(FL_ALIGN_TOP_RIGHT|FL_ALIGN_INSIDE)); txt_nano_CW_io->when(FL_WHEN_RELEASE); o->setFont(progdefaults.RxFontnbr); o->setFontSize(12); } // FTextView* txt_nano_CW_io { Fl_Counter* o = cntr_nanoCW_WPM = new Fl_Counter(260, 74, 110, 22, _("Comp\'")); cntr_nanoCW_WPM->tooltip(_("CW wpm keyboard strings")); cntr_nanoCW_WPM->minimum(5); cntr_nanoCW_WPM->maximum(100); cntr_nanoCW_WPM->step(1); cntr_nanoCW_WPM->value(20); cntr_nanoCW_WPM->callback((Fl_Callback*)cb_cntr_nanoCW_WPM); cntr_nanoCW_WPM->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.CWspeed); o->lstep(5); } // Fl_Counter* cntr_nanoCW_WPM { Fl_Counter2* o = cnt_nanoCWdash2dot = new Fl_Counter2(292, 100, 78, 22, _("Dash/Dot")); cnt_nanoCWdash2dot->tooltip(_("Dash to dot ratio")); cnt_nanoCWdash2dot->type(1); cnt_nanoCWdash2dot->box(FL_UP_BOX); cnt_nanoCWdash2dot->color(FL_BACKGROUND_COLOR); cnt_nanoCWdash2dot->selection_color(FL_INACTIVE_COLOR); cnt_nanoCWdash2dot->labeltype(FL_NORMAL_LABEL); cnt_nanoCWdash2dot->labelfont(0); cnt_nanoCWdash2dot->labelsize(14); cnt_nanoCWdash2dot->labelcolor(FL_FOREGROUND_COLOR); cnt_nanoCWdash2dot->minimum(2.5); cnt_nanoCWdash2dot->maximum(3.5); cnt_nanoCWdash2dot->value(3); cnt_nanoCWdash2dot->callback((Fl_Callback*)cb_cnt_nanoCWdash2dot); cnt_nanoCWdash2dot->align(Fl_Align(FL_ALIGN_LEFT)); cnt_nanoCWdash2dot->when(FL_WHEN_CHANGED); o->value(progdefaults.CWdash2dot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cnt_nanoCWdash2dot { Fl_ListBox* o = listbox_nanoIO_serbaud = new Fl_ListBox(594, 47, 110, 24, _("Baud")); listbox_nanoIO_serbaud->box(FL_DOWN_BOX); listbox_nanoIO_serbaud->color(FL_BACKGROUND2_COLOR); listbox_nanoIO_serbaud->selection_color(FL_BACKGROUND_COLOR); listbox_nanoIO_serbaud->labeltype(FL_NORMAL_LABEL); listbox_nanoIO_serbaud->labelfont(0); listbox_nanoIO_serbaud->labelsize(14); listbox_nanoIO_serbaud->labelcolor(FL_FOREGROUND_COLOR); listbox_nanoIO_serbaud->callback((Fl_Callback*)cb_listbox_nanoIO_serbaud); listbox_nanoIO_serbaud->align(Fl_Align(FL_ALIGN_LEFT)); listbox_nanoIO_serbaud->when(FL_WHEN_RELEASE); o->add("1200|4800|9600|19200|38400|57600|115200"); o->index(progdefaults.nanoIO_serbaud); listbox_nanoIO_serbaud->end(); } // Fl_ListBox* listbox_nanoIO_serbaud { Fl_ListBox* o = listbox_nano_keyer = new Fl_ListBox(595, 73, 110, 24, _("Keyer")); listbox_nano_keyer->box(FL_DOWN_BOX); listbox_nano_keyer->color(FL_BACKGROUND2_COLOR); listbox_nano_keyer->selection_color(FL_BACKGROUND_COLOR); listbox_nano_keyer->labeltype(FL_NORMAL_LABEL); listbox_nano_keyer->labelfont(0); listbox_nano_keyer->labelsize(14); listbox_nano_keyer->labelcolor(FL_FOREGROUND_COLOR); listbox_nano_keyer->callback((Fl_Callback*)cb_listbox_nano_keyer); listbox_nano_keyer->align(Fl_Align(FL_ALIGN_LEFT)); listbox_nano_keyer->when(FL_WHEN_RELEASE); o->add("Iambic-A|Iambic-B|Straight"); o->index(progdefaults.nanoIO_CW_keyer); listbox_nano_keyer->end(); } // Fl_ListBox* listbox_nano_keyer { Fl_ListBox* o = listbox_incr = new Fl_ListBox(645, 99, 60, 24, _("Incr\'")); listbox_incr->box(FL_DOWN_BOX); listbox_incr->color(FL_BACKGROUND2_COLOR); listbox_incr->selection_color(FL_BACKGROUND_COLOR); listbox_incr->labeltype(FL_NORMAL_LABEL); listbox_incr->labelfont(0); listbox_incr->labelsize(14); listbox_incr->labelcolor(FL_FOREGROUND_COLOR); listbox_incr->callback((Fl_Callback*)cb_listbox_incr); listbox_incr->align(Fl_Align(FL_ALIGN_LEFT)); listbox_incr->when(FL_WHEN_RELEASE); o->add("1|2|3|4|5"); o->index(progdefaults.nanoIO_CW_incr - '1'); listbox_incr->end(); } // Fl_ListBox* listbox_incr { btn_cwfsk_save = new Fl_Button(711, 74, 80, 22, _("Save")); btn_cwfsk_save->tooltip(_("Write state of nanoIO to Arduino EEPROM")); btn_cwfsk_save->callback((Fl_Callback*)cb_btn_cwfsk_save); } // Fl_Button* btn_cwfsk_save { btn_cwfsk_query = new Fl_Button(711, 100, 80, 22, _("Status")); btn_cwfsk_query->tooltip(_("Query state of nanoIO")); btn_cwfsk_query->callback((Fl_Callback*)cb_btn_cwfsk_query); } // Fl_Button* btn_cwfsk_query { Fl_Group* o = new Fl_Group(375, 45, 154, 80); o->box(FL_FLAT_BOX); { Fl_Check_Button* o = btn_nanoIO_pot = new Fl_Check_Button(502, 48, 21, 22, _("Use WPM pot\'")); btn_nanoIO_pot->tooltip(_("WPM pot update to nanoIO required")); btn_nanoIO_pot->down_box(FL_DOWN_BOX); btn_nanoIO_pot->callback((Fl_Callback*)cb_btn_nanoIO_pot); btn_nanoIO_pot->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.nanoIO_speed_pot); } // Fl_Check_Button* btn_nanoIO_pot { cntr_nanoIO_min_wpm = new Fl_Counter(447, 74, 75, 22, _("Min WPM")); cntr_nanoIO_min_wpm->tooltip(_("Minimum WPM setting\ndefault = 10")); cntr_nanoIO_min_wpm->type(1); cntr_nanoIO_min_wpm->minimum(10); cntr_nanoIO_min_wpm->maximum(30); cntr_nanoIO_min_wpm->step(1); cntr_nanoIO_min_wpm->value(10); cntr_nanoIO_min_wpm->callback((Fl_Callback*)cb_cntr_nanoIO_min_wpm); cntr_nanoIO_min_wpm->align(Fl_Align(FL_ALIGN_LEFT)); } // Fl_Counter* cntr_nanoIO_min_wpm { cntr_nanoIO_rng_wpm = new Fl_Counter(447, 100, 75, 22, _("Rng WPM")); cntr_nanoIO_rng_wpm->tooltip(_("Range WPM setting\ndefault = 20")); cntr_nanoIO_rng_wpm->type(1); cntr_nanoIO_rng_wpm->minimum(10); cntr_nanoIO_rng_wpm->maximum(40); cntr_nanoIO_rng_wpm->step(1); cntr_nanoIO_rng_wpm->value(20); cntr_nanoIO_rng_wpm->callback((Fl_Callback*)cb_cntr_nanoIO_rng_wpm); cntr_nanoIO_rng_wpm->align(Fl_Align(FL_ALIGN_LEFT)); } // Fl_Counter* cntr_nanoIO_rng_wpm o->end(); } // Fl_Group* o { Fl_Check_Button* o = btn_disable_CW_PTT = new Fl_Check_Button(531, 99, 70, 24, _("PTT off")); btn_disable_CW_PTT->tooltip(_("Disable PTT")); btn_disable_CW_PTT->down_box(FL_DOWN_BOX); btn_disable_CW_PTT->callback((Fl_Callback*)cb_btn_disable_CW_PTT); o->value(progdefaults.disable_CW_PTT); } // Fl_Check_Button* btn_disable_CW_PTT { Fl_Group* o = new Fl_Group(204, 125, 590, 30, _("Comp\'")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntrWPMtest = new Fl_Counter(302, 129, 78, 22, _("WPM")); cntrWPMtest->type(1); cntrWPMtest->minimum(5); cntrWPMtest->maximum(50); cntrWPMtest->step(1); cntrWPMtest->value(30); cntrWPMtest->callback((Fl_Callback*)cb_cntrWPMtest); cntrWPMtest->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.nanoCW_test_wpm); } // Fl_Counter* cntrWPMtest { btn_cal_variable = new Fl_Button(384, 129, 70, 22, _("Test =>")); btn_cal_variable->tooltip(_("Send \"paris \" WPM times")); btn_cal_variable->callback((Fl_Callback*)cb_btn_cal_variable); } // Fl_Button* btn_cal_variable { corr_var_wpm = new Fl_Value_Input(458, 129, 70, 22, _("secs\' =>")); corr_var_wpm->tooltip(_("Test duration (60 seconds)")); corr_var_wpm->color(FL_WHITE); corr_var_wpm->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Value_Input* corr_var_wpm { Fl_Value_Input* o = usec_correc = new Fl_Value_Input(645, 129, 60, 22, _("Comp\'")); usec_correc->tooltip(_("Compensationin microseconds")); usec_correc->color(FL_WHITE); o->value(progdefaults.usec_correc); } // Fl_Value_Input* usec_correc { btn_correction = new Fl_Button(711, 129, 80, 22, _("Adjust")); btn_correction->tooltip(_("send compensation to nanoIO")); btn_correction->callback((Fl_Callback*)cb_btn_correction); } // Fl_Button* btn_correction o->end(); } // Fl_Group* o { chk_nanoIO_CW_io = new Fl_Check_Button(711, 47, 70, 24, _("CW i/o")); chk_nanoIO_CW_io->tooltip(_("Enable CW operation")); chk_nanoIO_CW_io->down_box(FL_DOWN_BOX); chk_nanoIO_CW_io->callback((Fl_Callback*)cb_chk_nanoIO_CW_io); } // Fl_Check_Button* chk_nanoIO_CW_io CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/nanoIO")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/nanoIO")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/CW/DTR-RTS keying")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 25, 590, 79); o->box(FL_ENGRAVED_BOX); { Fl_Box* o = new Fl_Box(208, 27, 580, 72, _("DTR/RTS keying may be assigned to flrig, share the RigCat serial port,\nshare\ the Separate PTT serial port, or be assigned to separate serial port.\n\nNo s\ ettings for baud, stops bits, etc are needed.")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 107, 590, 40); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_CW_KEYLINE_flrig = new Fl_Check_Button(215, 120, 23, 15, _("Use flrig DTR/RTS keying")); btn_CW_KEYLINE_flrig->down_box(FL_DOWN_BOX); btn_CW_KEYLINE_flrig->callback((Fl_Callback*)cb_btn_CW_KEYLINE_flrig); btn_CW_KEYLINE_flrig->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.use_FLRIGkeying); } // Fl_Check_Button* btn_CW_KEYLINE_flrig { Fl_Check_Button* o = btn_FLRIG_CW_disable_ptt = new Fl_Check_Button(475, 120, 70, 14, _("Disable flrig CW PTT")); btn_FLRIG_CW_disable_ptt->tooltip(_("Required for some transceivers\ne.g. TS-480")); btn_FLRIG_CW_disable_ptt->down_box(FL_DOWN_BOX); btn_FLRIG_CW_disable_ptt->callback((Fl_Callback*)cb_btn_FLRIG_CW_disable_ptt); o->value(progdefaults.CATkeying_disable_ptt); } // Fl_Check_Button* btn_FLRIG_CW_disable_ptt o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 151, 590, 195); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_CW_KEYLINE_catport = new Fl_Check_Button(215, 167, 23, 15, _("Share RIGCAT port")); btn_CW_KEYLINE_catport->down_box(FL_DOWN_BOX); btn_CW_KEYLINE_catport->callback((Fl_Callback*)cb_btn_CW_KEYLINE_catport); btn_CW_KEYLINE_catport->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.CW_KEYLINE_on_cat_port); } // Fl_Check_Button* btn_CW_KEYLINE_catport { Fl_Check_Button* o = btn_CW_KEYLINE_shared_PTT = new Fl_Check_Button(215, 199, 23, 15, _("Share Separate PTT port")); btn_CW_KEYLINE_shared_PTT->down_box(FL_DOWN_BOX); btn_CW_KEYLINE_shared_PTT->callback((Fl_Callback*)cb_btn_CW_KEYLINE_shared_PTT); btn_CW_KEYLINE_shared_PTT->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.CW_KEYLINE_on_ptt_port); } // Fl_Check_Button* btn_CW_KEYLINE_shared_PTT { Fl_ListBox* o = listbox_CW_KEYLINE = new Fl_ListBox(454, 162, 90, 24, _("CW Keyline")); listbox_CW_KEYLINE->box(FL_DOWN_BOX); listbox_CW_KEYLINE->color(FL_BACKGROUND2_COLOR); listbox_CW_KEYLINE->selection_color(FL_BACKGROUND_COLOR); listbox_CW_KEYLINE->labeltype(FL_NORMAL_LABEL); listbox_CW_KEYLINE->labelfont(0); listbox_CW_KEYLINE->labelsize(14); listbox_CW_KEYLINE->labelcolor(FL_FOREGROUND_COLOR); listbox_CW_KEYLINE->callback((Fl_Callback*)cb_listbox_CW_KEYLINE); listbox_CW_KEYLINE->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_CW_KEYLINE->when(FL_WHEN_RELEASE); o->add("None|RTS|DTR"); o->index(progdefaults.CW_KEYLINE); listbox_CW_KEYLINE->end(); } // Fl_ListBox* listbox_CW_KEYLINE { Fl_Counter2* o = cntCWkeycomp = new Fl_Counter2(454, 194, 125, 24, _("Keying compensation (msec)")); cntCWkeycomp->tooltip(_("Dot / Space timing increment")); cntCWkeycomp->box(FL_UP_BOX); cntCWkeycomp->color(FL_BACKGROUND_COLOR); cntCWkeycomp->selection_color(FL_INACTIVE_COLOR); cntCWkeycomp->labeltype(FL_NORMAL_LABEL); cntCWkeycomp->labelfont(0); cntCWkeycomp->labelsize(14); cntCWkeycomp->labelcolor(FL_FOREGROUND_COLOR); cntCWkeycomp->minimum(-10); cntCWkeycomp->maximum(10); cntCWkeycomp->step(0.01); cntCWkeycomp->callback((Fl_Callback*)cb_cntCWkeycomp); cntCWkeycomp->align(Fl_Align(FL_ALIGN_RIGHT)); cntCWkeycomp->when(FL_WHEN_CHANGED); o->value(progdefaults.CWkeycomp); o->labelsize(FL_NORMAL_SIZE); o->lstep(1.0); } // Fl_Counter2* cntCWkeycomp { Fl_ListBox* o = listbox_PTT_KEYLINE = new Fl_ListBox(693, 162, 90, 24, _("PTT keyline")); listbox_PTT_KEYLINE->box(FL_DOWN_BOX); listbox_PTT_KEYLINE->color(FL_BACKGROUND2_COLOR); listbox_PTT_KEYLINE->selection_color(FL_BACKGROUND_COLOR); listbox_PTT_KEYLINE->labeltype(FL_NORMAL_LABEL); listbox_PTT_KEYLINE->labelfont(0); listbox_PTT_KEYLINE->labelsize(14); listbox_PTT_KEYLINE->labelcolor(FL_FOREGROUND_COLOR); listbox_PTT_KEYLINE->callback((Fl_Callback*)cb_listbox_PTT_KEYLINE); listbox_PTT_KEYLINE->align(Fl_Align(FL_ALIGN_LEFT)); listbox_PTT_KEYLINE->when(FL_WHEN_RELEASE); listbox_PTT_KEYLINE->hide(); o->add("None|RTS|DTR"); o->index(0);//progdefaults.PTT_KEYLINE); listbox_PTT_KEYLINE->end(); } // Fl_ListBox* listbox_PTT_KEYLINE { Fl_ComboBox* o = select_CW_KEYLINE_CommPort = new Fl_ComboBox(215, 241, 470, 24, _("Use Separate Keying Serial Port")); select_CW_KEYLINE_CommPort->tooltip(_("nanoIO serial port")); select_CW_KEYLINE_CommPort->box(FL_DOWN_BOX); select_CW_KEYLINE_CommPort->color((Fl_Color)55); select_CW_KEYLINE_CommPort->selection_color(FL_BACKGROUND_COLOR); select_CW_KEYLINE_CommPort->labeltype(FL_NORMAL_LABEL); select_CW_KEYLINE_CommPort->labelfont(0); select_CW_KEYLINE_CommPort->labelsize(14); select_CW_KEYLINE_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_CW_KEYLINE_CommPort->callback((Fl_Callback*)cb_select_CW_KEYLINE_CommPort); select_CW_KEYLINE_CommPort->align(Fl_Align(FL_ALIGN_TOP_LEFT)); select_CW_KEYLINE_CommPort->when(FL_WHEN_RELEASE); o->value(progdefaults.CW_KEYLINE_serial_port_name.c_str()); select_CW_KEYLINE_CommPort->end(); } // Fl_ComboBox* select_CW_KEYLINE_CommPort { Fl_Light_Button* o = btn_CW_KEYLINE_connect = new Fl_Light_Button(698, 241, 90, 24, _("Connect")); btn_CW_KEYLINE_connect->tooltip(_("Connect / Disconnect from nanoIO")); btn_CW_KEYLINE_connect->callback((Fl_Callback*)cb_btn_CW_KEYLINE_connect); o->value(progStatus.useCW_KEYLINE); } // Fl_Light_Button* btn_CW_KEYLINE_connect { btn_cw_dtr_calibrate = new Fl_Light_Button(215, 305, 100, 24, _("Speed test")); btn_cw_dtr_calibrate->tooltip(_("1 minute \'PARIS \'")); btn_cw_dtr_calibrate->selection_color((Fl_Color)6); btn_cw_dtr_calibrate->callback((Fl_Callback*)cb_btn_cw_dtr_calibrate); } // Fl_Light_Button* btn_cw_dtr_calibrate { cwio_test_result = new Fl_Output(376, 305, 300, 24, _("Result")); } // Fl_Output* cwio_test_result o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/DTR-RTS keying")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/DTR-RTS keying")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/CW/CAT Keying")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Box* o = new Fl_Box(213, 23, 575, 140, _("CW keying using CAT command strings. Available for supported transceivers.\n\ Use with RigCAT or flrig transceiver control. A separate serial port is NOT n\ eeded.\n\nDisable CAT PTT if transceiver interprets that as a keydown command \ (e.g. TS480).\nRecommend setting transceiver to either semi or full break-in.\ \n\nEnter correct CIV address for Icom transceivers.")); o->box(FL_THIN_DOWN_BOX); o->color(FL_LIGHT3); o->selection_color(FL_LIGHT3); o->labelsize(13); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btn_use_ICOMkeying = new Fl_Check_Button(273, 192, 70, 15, _("Icom")); btn_use_ICOMkeying->down_box(FL_DOWN_BOX); btn_use_ICOMkeying->callback((Fl_Callback*)cb_btn_use_ICOMkeying); o->value(progdefaults.use_ICOMkeying); } // Fl_Check_Button* btn_use_ICOMkeying { Fl_Input* o = val_ICOMcivaddr = new Fl_Input(343, 188, 58, 22, _("Hex CIV addr")); val_ICOMcivaddr->tooltip(_("Enter transceiver HEX CIV address")); val_ICOMcivaddr->callback((Fl_Callback*)cb_val_ICOMcivaddr); val_ICOMcivaddr->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.ICOMcivaddr.c_str()); } // Fl_Input* val_ICOMcivaddr { Fl_Check_Button* o = btn_use_ELCTkeying = new Fl_Check_Button(273, 216, 70, 15, _("Elecraft")); btn_use_ELCTkeying->down_box(FL_DOWN_BOX); btn_use_ELCTkeying->callback((Fl_Callback*)cb_btn_use_ELCTkeying); o->value(progdefaults.use_ELCTkeying); } // Fl_Check_Button* btn_use_ELCTkeying { Fl_Check_Button* o = btn_use_KNWDkeying = new Fl_Check_Button(455, 216, 70, 15, _("Kenwood")); btn_use_KNWDkeying->down_box(FL_DOWN_BOX); btn_use_KNWDkeying->callback((Fl_Callback*)cb_btn_use_KNWDkeying); o->value(progdefaults.use_KNWDkeying); } // Fl_Check_Button* btn_use_KNWDkeying { Fl_Check_Button* o = btn_use_YAESUkeying = new Fl_Check_Button(637, 216, 70, 15, _("Yaesu")); btn_use_YAESUkeying->down_box(FL_DOWN_BOX); btn_use_YAESUkeying->callback((Fl_Callback*)cb_btn_use_YAESUkeying); o->value(progdefaults.use_YAESUkeying); } // Fl_Check_Button* btn_use_YAESUkeying { Fl_Check_Button* o = btn_CAT_CW_disable_ptt = new Fl_Check_Button(273, 240, 70, 15, _("Disable CAT PTT")); btn_CAT_CW_disable_ptt->tooltip(_("Required for some transceivers\ne.g. TS-480")); btn_CAT_CW_disable_ptt->down_box(FL_DOWN_BOX); btn_CAT_CW_disable_ptt->callback((Fl_Callback*)cb_btn_CAT_CW_disable_ptt); o->value(progdefaults.CATkeying_disable_ptt); } // Fl_Check_Button* btn_CAT_CW_disable_ptt CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/CAT keying")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/CAT keying")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("CW CAT & WinKeyer Compensation")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Box* o = new Fl_Box(210, 33, 575, 118, _("Compute timing compensation for CAT CW and WinKeyer CW. Computation at curre\ nt\nWPM . Set WPM to nominal (suggest 20 WPM).\n\nCompensation will be good o\ ver a +/- 10 WPM range. Calibration/Test is 1 minute of\n\'PARIS \'.")); o->box(FL_ENGRAVED_BOX); o->color((Fl_Color)53); o->labelsize(13); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { btn_CAT_keying_calibrate = new Fl_Button(245, 184, 80, 22, _("Calibrate")); btn_CAT_keying_calibrate->tooltip(_("Send WPM \'PARIS \' words")); btn_CAT_keying_calibrate->callback((Fl_Callback*)cb_btn_CAT_keying_calibrate); } // Fl_Button* btn_CAT_keying_calibrate { Fl_Value_Input* o = out_CATkeying_compensation = new Fl_Value_Input(329, 184, 50, 22, _("Compensate (secs)")); out_CATkeying_compensation->maximum(10); out_CATkeying_compensation->step(0.01); out_CATkeying_compensation->callback((Fl_Callback*)cb_out_CATkeying_compensation); out_CATkeying_compensation->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.CATkeying_compensation / 1000.0); } // Fl_Value_Input* out_CATkeying_compensation { btn_CAT_keying_clear = new Fl_Button(525, 184, 50, 22, _("Clear")); btn_CAT_keying_clear->tooltip(_("Clear compensation")); btn_CAT_keying_clear->callback((Fl_Callback*)cb_btn_CAT_keying_clear); } // Fl_Button* btn_CAT_keying_clear { btn_CAT_keying_test = new Fl_Button(589, 184, 50, 22, _("Test")); btn_CAT_keying_test->tooltip(_("Send WPM \'PARIS \' words")); btn_CAT_keying_test->callback((Fl_Callback*)cb_btn_CAT_keying_test); } // Fl_Button* btn_CAT_keying_test { Fl_Value_Input* o = out_CATkeying_test_result = new Fl_Value_Input(645, 184, 50, 22, _("secs")); out_CATkeying_test_result->maximum(10); out_CATkeying_test_result->step(0.01); out_CATkeying_test_result->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(0); } // Fl_Value_Input* out_CATkeying_test_result CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/CW/CAT comp'")); config_pages.push_back(p); tab_tree->add(_("Modem/CW/CAT comp'")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/DominoEX")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { txtSecondary = new Fl_Input2(310, 88, 360, 40, _("Secondary Text")); txtSecondary->tooltip(_("Text to send during keyboard idle times")); txtSecondary->type(4); txtSecondary->box(FL_DOWN_BOX); txtSecondary->color(FL_BACKGROUND2_COLOR); txtSecondary->selection_color(FL_SELECTION_COLOR); txtSecondary->labeltype(FL_NORMAL_LABEL); txtSecondary->labelfont(0); txtSecondary->labelsize(14); txtSecondary->labelcolor(FL_FOREGROUND_COLOR); txtSecondary->callback((Fl_Callback*)cb_txtSecondary); txtSecondary->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txtSecondary->when(FL_WHEN_CHANGED); txtSecondary->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtSecondary { Fl_Check_Button* o = valDominoEX_FILTER = new Fl_Check_Button(310, 142, 80, 20, _("Filtering")); valDominoEX_FILTER->tooltip(_("Use DSP filter before decoder")); valDominoEX_FILTER->down_box(FL_DOWN_BOX); valDominoEX_FILTER->value(1); valDominoEX_FILTER->callback((Fl_Callback*)cb_valDominoEX_FILTER); o->value(progdefaults.DOMINOEX_FILTER); } // Fl_Check_Button* valDominoEX_FILTER { Fl_Counter2* o = valDominoEX_BW = new Fl_Counter2(451, 142, 63, 20, _("Filter bandwidth factor")); valDominoEX_BW->tooltip(_("Filter bandwidth relative to signal width")); valDominoEX_BW->type(1); valDominoEX_BW->box(FL_UP_BOX); valDominoEX_BW->color(FL_BACKGROUND_COLOR); valDominoEX_BW->selection_color(FL_INACTIVE_COLOR); valDominoEX_BW->labeltype(FL_NORMAL_LABEL); valDominoEX_BW->labelfont(0); valDominoEX_BW->labelsize(14); valDominoEX_BW->labelcolor(FL_FOREGROUND_COLOR); valDominoEX_BW->minimum(1); valDominoEX_BW->maximum(2); valDominoEX_BW->value(1.5); valDominoEX_BW->callback((Fl_Callback*)cb_valDominoEX_BW); valDominoEX_BW->align(Fl_Align(FL_ALIGN_RIGHT)); valDominoEX_BW->when(FL_WHEN_CHANGED); o->value(progdefaults.DOMINOEX_BW); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valDominoEX_BW { Fl_Check_Button* o = chkDominoEX_FEC = new Fl_Check_Button(310, 172, 51, 20, _("FEC")); chkDominoEX_FEC->tooltip(_("Enable MultiPSK-compatible FEC")); chkDominoEX_FEC->down_box(FL_DOWN_BOX); chkDominoEX_FEC->callback((Fl_Callback*)cb_chkDominoEX_FEC); o->value(progdefaults.DOMINOEX_FEC); } // Fl_Check_Button* chkDominoEX_FEC { Fl_Value_Slider2* o = valDomCWI = new Fl_Value_Slider2(310, 208, 260, 20, _("CWI threshold")); valDomCWI->tooltip(_("CWI detection and suppression")); valDomCWI->type(1); valDomCWI->box(FL_DOWN_BOX); valDomCWI->color(FL_BACKGROUND_COLOR); valDomCWI->selection_color(FL_BACKGROUND_COLOR); valDomCWI->labeltype(FL_NORMAL_LABEL); valDomCWI->labelfont(0); valDomCWI->labelsize(14); valDomCWI->labelcolor(FL_FOREGROUND_COLOR); valDomCWI->textsize(14); valDomCWI->callback((Fl_Callback*)cb_valDomCWI); valDomCWI->align(Fl_Align(FL_ALIGN_TOP)); valDomCWI->when(FL_WHEN_CHANGED); o->value(progdefaults.DomCWI); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* valDomCWI { Fl_Counter2* o = valDominoEX_PATHS = new Fl_Counter2(634, 195, 63, 20, _("Paths (hidden)")); valDominoEX_PATHS->type(1); valDominoEX_PATHS->box(FL_UP_BOX); valDominoEX_PATHS->color(FL_BACKGROUND_COLOR); valDominoEX_PATHS->selection_color(FL_INACTIVE_COLOR); valDominoEX_PATHS->labeltype(FL_NORMAL_LABEL); valDominoEX_PATHS->labelfont(0); valDominoEX_PATHS->labelsize(14); valDominoEX_PATHS->labelcolor(FL_FOREGROUND_COLOR); valDominoEX_PATHS->minimum(4); valDominoEX_PATHS->maximum(8); valDominoEX_PATHS->step(1); valDominoEX_PATHS->value(5); valDominoEX_PATHS->callback((Fl_Callback*)cb_valDominoEX_PATHS); valDominoEX_PATHS->align(Fl_Align(FL_ALIGN_BOTTOM)); valDominoEX_PATHS->when(FL_WHEN_CHANGED); o->value(progdefaults.DOMINOEX_PATHS); o->labelsize(FL_NORMAL_SIZE); o->hide(); } // Fl_Counter2* valDominoEX_PATHS CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/DominoEX")); config_pages.push_back(p); tab_tree->add(_("Modem/DominoEX")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/Feld Hell")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(247, 31, 500, 133, _("Hell Transmit Parameters")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_ListBox* o = listboxHellFont = new Fl_ListBox(262, 56, 225, 22, _("Transmit font")); listboxHellFont->tooltip(_("Select TX raster font")); listboxHellFont->box(FL_DOWN_BOX); listboxHellFont->color(FL_BACKGROUND2_COLOR); listboxHellFont->selection_color(FL_BACKGROUND_COLOR); listboxHellFont->labeltype(FL_NORMAL_LABEL); listboxHellFont->labelfont(0); listboxHellFont->labelsize(14); listboxHellFont->labelcolor(FL_FOREGROUND_COLOR); listboxHellFont->callback((Fl_Callback*)cb_listboxHellFont); listboxHellFont->align(Fl_Align(FL_ALIGN_RIGHT)); listboxHellFont->when(FL_WHEN_RELEASE); o->add(szFeldFonts); o->index(progdefaults.feldfontnbr); o->labelsize(FL_NORMAL_SIZE); listboxHellFont->end(); } // Fl_ListBox* listboxHellFont { Fl_ListBox* o = listboxHellPulse = new Fl_ListBox(262, 104, 150, 22, _("Pulse shape")); listboxHellPulse->tooltip(_("Raised cosine pulse shape factor")); listboxHellPulse->box(FL_DOWN_BOX); listboxHellPulse->color(FL_BACKGROUND2_COLOR); listboxHellPulse->selection_color(FL_BACKGROUND_COLOR); listboxHellPulse->labeltype(FL_NORMAL_LABEL); listboxHellPulse->labelfont(0); listboxHellPulse->labelsize(14); listboxHellPulse->labelcolor(FL_FOREGROUND_COLOR); listboxHellPulse->callback((Fl_Callback*)cb_listboxHellPulse); listboxHellPulse->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listboxHellPulse->when(FL_WHEN_RELEASE); o->add(_("Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying")); o->index(progdefaults.HellPulseFast); o->labelsize(FL_NORMAL_SIZE); listboxHellPulse->end(); } // Fl_ListBox* listboxHellPulse { Fl_Check_Button* o = btnFeldHellIdle = new Fl_Check_Button(262, 139, 230, 20, _("Transmit periods (.) when idle")); btnFeldHellIdle->tooltip(_("Transmits a diddle dot when no keyboard activity")); btnFeldHellIdle->down_box(FL_DOWN_BOX); btnFeldHellIdle->value(1); btnFeldHellIdle->callback((Fl_Callback*)cb_btnFeldHellIdle); o->value(progdefaults.HellXmtIdle); } // Fl_Check_Button* btnFeldHellIdle { Fl_Value_Slider* o = valHellXmtWidth = new Fl_Value_Slider(443, 104, 150, 22, _("Tx Width Multiplier")); valHellXmtWidth->tooltip(_("Range 1...3")); valHellXmtWidth->type(5); valHellXmtWidth->color(FL_LIGHT3); valHellXmtWidth->minimum(1); valHellXmtWidth->maximum(3); valHellXmtWidth->step(1); valHellXmtWidth->value(1); valHellXmtWidth->textsize(14); valHellXmtWidth->callback((Fl_Callback*)cb_valHellXmtWidth); valHellXmtWidth->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.HellXmtWidth); } // Fl_Value_Slider* valHellXmtWidth o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(247, 167, 500, 173, _("Hell Receive Parameters")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnBlackboard = new Fl_Check_Button(262, 191, 125, 20, _("Reverse video")); btnBlackboard->tooltip(_("Display RX in reverse video")); btnBlackboard->down_box(FL_DOWN_BOX); btnBlackboard->callback((Fl_Callback*)cb_btnBlackboard); o->value(progdefaults.HellBlackboard); } // Fl_Check_Button* btnBlackboard { Fl_Check_Button* o = btnHellMarquee = new Fl_Check_Button(447, 191, 125, 20, _("Marquee text")); btnHellMarquee->tooltip(_("Display RX as a scrolling marquee")); btnHellMarquee->down_box(FL_DOWN_BOX); btnHellMarquee->callback((Fl_Callback*)cb_btnHellMarquee); o->value(progdefaults.HellMarquee); } // Fl_Check_Button* btnHellMarquee { Fl_Value_Slider* o = valHellRcvWidth = new Fl_Value_Slider(262, 227, 120, 22, _("Rx Width Multiplier")); valHellRcvWidth->tooltip(_("Range 1...4")); valHellRcvWidth->type(5); valHellRcvWidth->color(FL_LIGHT3); valHellRcvWidth->minimum(1); valHellRcvWidth->maximum(4); valHellRcvWidth->step(1); valHellRcvWidth->value(1); valHellRcvWidth->textsize(14); valHellRcvWidth->callback((Fl_Callback*)cb_valHellRcvWidth); valHellRcvWidth->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.HellRcvWidth); } // Fl_Value_Slider* valHellRcvWidth { Fl_Value_Slider* o = valHellRcvHeight = new Fl_Value_Slider(262, 266, 250, 22, _("Rx Height in pixels")); valHellRcvHeight->tooltip(_("May require resizing the Rx/Tx panel")); valHellRcvHeight->type(5); valHellRcvHeight->color(FL_LIGHT3); valHellRcvHeight->minimum(14); valHellRcvHeight->maximum(42); valHellRcvHeight->step(2); valHellRcvHeight->value(20); valHellRcvHeight->textsize(14); valHellRcvHeight->callback((Fl_Callback*)cb_valHellRcvHeight); valHellRcvHeight->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.HellRcvHeight); } // Fl_Value_Slider* valHellRcvHeight { Fl_Value_Slider2* o = sldrHellBW = new Fl_Value_Slider2(262, 305, 250, 22, _("Receive filter bandwidth")); sldrHellBW->tooltip(_("Adjust the DSP bandwidth")); sldrHellBW->type(1); sldrHellBW->box(FL_DOWN_BOX); sldrHellBW->color(FL_LIGHT3); sldrHellBW->selection_color(FL_BACKGROUND_COLOR); sldrHellBW->labeltype(FL_NORMAL_LABEL); sldrHellBW->labelfont(0); sldrHellBW->labelsize(14); sldrHellBW->labelcolor(FL_FOREGROUND_COLOR); sldrHellBW->minimum(10); sldrHellBW->maximum(2400); sldrHellBW->step(5); sldrHellBW->value(400); sldrHellBW->textsize(14); sldrHellBW->callback((Fl_Callback*)cb_sldrHellBW); sldrHellBW->align(Fl_Align(FL_ALIGN_RIGHT)); sldrHellBW->when(FL_WHEN_CHANGED); o->value(progdefaults.HELL_BW); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrHellBW { Fl_Value_Slider* o = val_hellagc = new Fl_Value_Slider(527, 227, 120, 22, _("Rx AGC")); val_hellagc->tooltip(_("1 - Slow, 2 - Medium, 3 - Fast")); val_hellagc->type(5); val_hellagc->color(FL_LIGHT3); val_hellagc->minimum(1); val_hellagc->maximum(3); val_hellagc->step(1); val_hellagc->value(2); val_hellagc->textsize(14); val_hellagc->callback((Fl_Callback*)cb_val_hellagc); val_hellagc->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.hellagc); } // Fl_Value_Slider* val_hellagc o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Feld Hell")); config_pages.push_back(p); tab_tree->add(_("Modem/Feld Hell")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/FMT")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(203, 24, 412, 75, _("Audio Stream Procesing")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = listbox_fmt_sr = new Fl_ListBox(276, 66, 100, 22, _("Sample rate")); listbox_fmt_sr->tooltip(_("FMT sample rate")); listbox_fmt_sr->box(FL_DOWN_BOX); listbox_fmt_sr->color(FL_BACKGROUND2_COLOR); listbox_fmt_sr->selection_color(FL_BACKGROUND_COLOR); listbox_fmt_sr->labeltype(FL_NORMAL_LABEL); listbox_fmt_sr->labelfont(0); listbox_fmt_sr->labelsize(14); listbox_fmt_sr->labelcolor(FL_FOREGROUND_COLOR); listbox_fmt_sr->callback((Fl_Callback*)cb_listbox_fmt_sr); listbox_fmt_sr->align(Fl_Align(FL_ALIGN_TOP)); listbox_fmt_sr->when(FL_WHEN_RELEASE); o->add("8000|11025|12000|16000|22050|24000|44100|48000"); o->index(progdefaults.FMT_sr); listbox_fmt_sr->end(); } // Fl_ListBox* listbox_fmt_sr { Fl_Counter* o = cnt_fmt_rx_ppm = new Fl_Counter(419, 66, 120, 22, _("Rx Codec PPM")); cnt_fmt_rx_ppm->tooltip(_("Audio Codec ppm correction")); cnt_fmt_rx_ppm->minimum(-500); cnt_fmt_rx_ppm->maximum(500); cnt_fmt_rx_ppm->step(1); cnt_fmt_rx_ppm->callback((Fl_Callback*)cb_cnt_fmt_rx_ppm); cnt_fmt_rx_ppm->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.RX_corr); o->lstep(10); } // Fl_Counter* cnt_fmt_rx_ppm o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(203, 99, 412, 90, _("Tracking")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnFMT_plot_background = new Fl_Button(209, 122, 60, 22, _("Bgnd")); btnFMT_plot_background->tooltip(_("Change plot background color")); btnFMT_plot_background->callback((Fl_Callback*)cb_btnFMT_plot_background); } // Fl_Button* btnFMT_plot_background { btnFMT_unk_color = new Fl_Button(209, 153, 60, 22, _("Unkn")); btnFMT_unk_color->tooltip(_("Change plot unknown track color")); btnFMT_unk_color->callback((Fl_Callback*)cb_btnFMT_unk_color); } // Fl_Button* btnFMT_unk_color { btnFMT_plot_ref_color = new Fl_Button(274, 153, 60, 22, _("Ref")); btnFMT_plot_ref_color->tooltip(_("Change plot reference track color")); btnFMT_plot_ref_color->callback((Fl_Callback*)cb_btnFMT_plot_ref_color); } // Fl_Button* btnFMT_plot_ref_color { btnFMT_plot_axis = new Fl_Button(274, 122, 60, 22, _("Axis")); btnFMT_plot_axis->tooltip(_("Change Axis\' color")); btnFMT_plot_axis->callback((Fl_Callback*)cb_btnFMT_plot_axis); } // Fl_Button* btnFMT_plot_axis { btnFMT_legend_color = new Fl_Button(339, 107, 60, 22, _("Lgnd")); btnFMT_legend_color->tooltip(_("Change legend color")); btnFMT_legend_color->callback((Fl_Callback*)cb_btnFMT_legend_color); } // Fl_Button* btnFMT_legend_color { Fl_Check_Button* o = btn_fmt_plot_over_axis = new Fl_Check_Button(341, 135, 31, 18, _("Line/Axis")); btn_fmt_plot_over_axis->tooltip(_("Enable to always plot data over axis")); btn_fmt_plot_over_axis->down_box(FL_DOWN_BOX); btn_fmt_plot_over_axis->callback((Fl_Callback*)cb_btn_fmt_plot_over_axis); o->value(progdefaults.FMT_plot_over_axis); } // Fl_Check_Button* btn_fmt_plot_over_axis { Fl_Check_Button* o = btn_fmt_thick_lines = new Fl_Check_Button(341, 160, 31, 18, _("Thick lines")); btn_fmt_thick_lines->tooltip(_("Enable to plot track lines 3 pixels wide")); btn_fmt_thick_lines->down_box(FL_DOWN_BOX); btn_fmt_thick_lines->callback((Fl_Callback*)cb_btn_fmt_thick_lines); o->value(progdefaults.FMT_thick_lines); } // Fl_Check_Button* btn_fmt_thick_lines { Fl_Counter* o = cnt_fmt_freq_corr = new Fl_Counter(465, 118, 123, 24, _("Freq Correction")); cnt_fmt_freq_corr->tooltip(_("Offset plot lines on vertical scale")); cnt_fmt_freq_corr->minimum(-5); cnt_fmt_freq_corr->maximum(5); cnt_fmt_freq_corr->step(0.001); cnt_fmt_freq_corr->callback((Fl_Callback*)cb_cnt_fmt_freq_corr); cnt_fmt_freq_corr->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.FMT_freq_corr); o->lstep(0.01); } // Fl_Counter* cnt_fmt_freq_corr { bnt_FMT_dec_corr = new Fl_Button(446, 119, 19, 24, _("@|<")); bnt_FMT_dec_corr->labelsize(10); bnt_FMT_dec_corr->callback((Fl_Callback*)cb_bnt_FMT_dec_corr); } // Fl_Button* bnt_FMT_dec_corr { btn_FMT_incr_corr = new Fl_Button(588, 119, 18, 24, _("@>|")); btn_FMT_incr_corr->labelsize(10); btn_FMT_incr_corr->callback((Fl_Callback*)cb_btn_FMT_incr_corr); } // Fl_Button* btn_FMT_incr_corr { Fl_Counter* o = cnt_fmt_freq_err = new Fl_Counter(470, 160, 123, 24, _("Max Error")); cnt_fmt_freq_err->tooltip(_("Limit freq estimate error to this value")); cnt_fmt_freq_err->minimum(0.5); cnt_fmt_freq_err->maximum(10); cnt_fmt_freq_err->value(2); cnt_fmt_freq_err->callback((Fl_Callback*)cb_cnt_fmt_freq_err); cnt_fmt_freq_err->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.FMT_freq_err); o->lstep(1.0); } // Fl_Counter* cnt_fmt_freq_err o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(203, 190, 207, 86, _("DFT Estimator")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cnt_FMT_movavg_len = new Fl_Counter(214, 232, 110, 24, _("Data Filter")); cnt_FMT_movavg_len->tooltip(_("Moving average - average over NN seconds^0 - no averaging")); cnt_FMT_movavg_len->minimum(0); cnt_FMT_movavg_len->maximum(10); cnt_FMT_movavg_len->value(1); cnt_FMT_movavg_len->callback((Fl_Callback*)cb_cnt_FMT_movavg_len); cnt_FMT_movavg_len->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.FMT_movavg_len); o->lstep(1.0); } // Fl_Counter* cnt_FMT_movavg_len { Fl_ListBox* o = listbox_fmt_dft_rate = new Fl_ListBox(334, 232, 60, 24, _("DFT rate")); listbox_fmt_dft_rate->tooltip(_("# DFT computations / second")); listbox_fmt_dft_rate->box(FL_DOWN_BOX); listbox_fmt_dft_rate->color(FL_BACKGROUND2_COLOR); listbox_fmt_dft_rate->selection_color(FL_BACKGROUND_COLOR); listbox_fmt_dft_rate->labeltype(FL_NORMAL_LABEL); listbox_fmt_dft_rate->labelfont(0); listbox_fmt_dft_rate->labelsize(14); listbox_fmt_dft_rate->labelcolor(FL_FOREGROUND_COLOR); listbox_fmt_dft_rate->callback((Fl_Callback*)cb_listbox_fmt_dft_rate); listbox_fmt_dft_rate->align(Fl_Align(FL_ALIGN_TOP)); listbox_fmt_dft_rate->when(FL_WHEN_RELEASE); o->add("1|2|3|4|5|6|7|8"); o->index(progdefaults.FMT_dft_rate); listbox_fmt_dft_rate->end(); } // Fl_ListBox* listbox_fmt_dft_rate o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(411, 190, 205, 86, _("FIR Filter")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cnt_FMT_bpf = new Fl_Counter(457, 218, 100, 24, _("Width")); cnt_FMT_bpf->tooltip(_("Band pass filter / unknown / reference")); cnt_FMT_bpf->minimum(5); cnt_FMT_bpf->maximum(200); cnt_FMT_bpf->step(5); cnt_FMT_bpf->value(100); cnt_FMT_bpf->callback((Fl_Callback*)cb_cnt_FMT_bpf); cnt_FMT_bpf->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.FMT_bpf_width); o->lstep(50.0); } // Fl_Counter* cnt_FMT_bpf { Fl_Check_Button* o = btn_fmt_unk_bpf_on = new Fl_Check_Button(429, 246, 70, 18, _("bpf Unk\'")); btn_fmt_unk_bpf_on->tooltip(_("ON - band pass filter unknown signal")); btn_fmt_unk_bpf_on->down_box(FL_DOWN_BOX); btn_fmt_unk_bpf_on->callback((Fl_Callback*)cb_btn_fmt_unk_bpf_on); o->value(progdefaults.FMT_unk_bpf_on); } // Fl_Check_Button* btn_fmt_unk_bpf_on { Fl_Check_Button* o = btn_fmt_ref_bpf_on = new Fl_Check_Button(526, 246, 70, 18, _("bpf Ref\'")); btn_fmt_ref_bpf_on->tooltip(_("ON - band pass filter reference signal")); btn_fmt_ref_bpf_on->down_box(FL_DOWN_BOX); btn_fmt_ref_bpf_on->callback((Fl_Callback*)cb_btn_fmt_ref_bpf_on); o->value(progdefaults.FMT_ref_bpf_on); } // Fl_Check_Button* btn_fmt_ref_bpf_on o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(617, 190, 178, 86, _("CSV Data Recording")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btn_fmt_autorecord = new Fl_Check_Button(658, 246, 107, 18, _("Auto record")); btn_fmt_autorecord->tooltip(_("Automatically start csv data file recording with wav playback")); btn_fmt_autorecord->down_box(FL_DOWN_BOX); } // Fl_Check_Button* btn_fmt_autorecord { cnt_fmt_auto_record_time = new Fl_Counter(672, 218, 66, 24); cnt_fmt_auto_record_time->tooltip(_("Record data for NN minutes after auto start")); cnt_fmt_auto_record_time->type(1); cnt_fmt_auto_record_time->minimum(2); cnt_fmt_auto_record_time->maximum(60); cnt_fmt_auto_record_time->step(2); cnt_fmt_auto_record_time->value(2); cnt_fmt_auto_record_time->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); } // Fl_Counter* cnt_fmt_auto_record_time o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(203, 277, 592, 66, _("Wav file recording")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_fmt_record_wav = new Fl_Check_Button(464, 288, 118, 18, _("Record Audio")); btn_fmt_record_wav->tooltip(_("Wav file recording - START IMMEDIATELY")); btn_fmt_record_wav->down_box(FL_DOWN_BOX); btn_fmt_record_wav->callback((Fl_Callback*)cb_btn_fmt_record_wav); if (progdefaults.fmt_sync_wav_file) o->deactivate(); } // Fl_Check_Button* btn_fmt_record_wav { Fl_Check_Button* o = btn_fmt_sync_wav = new Fl_Check_Button(599, 288, 118, 18, _("Sync to data record")); btn_fmt_sync_wav->tooltip(_("Wav file recording - SYNCHRONIZE with data recording")); btn_fmt_sync_wav->down_box(FL_DOWN_BOX); btn_fmt_sync_wav->callback((Fl_Callback*)cb_btn_fmt_sync_wav); o->value(progdefaults.fmt_sync_wav_file); } // Fl_Check_Button* btn_fmt_sync_wav { txt_fmt_wav_filename = new Fl_Output(213, 314, 570, 24, _("File pathname:")); txt_fmt_wav_filename->tooltip(_("Computer generated file name")); txt_fmt_wav_filename->align(Fl_Align(FL_ALIGN_TOP_LEFT)); } // Fl_Output* txt_fmt_wav_filename o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(616, 24, 180, 131, _("Waterfall")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Box* o = new Fl_Box(626, 44, 168, 35, _("Shft-click: select unknown\nCtrl-click: select reference")); o->labelsize(12); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btn_fmt_center_on_unknown = new Fl_Check_Button(626, 85, 70, 18, _("Center on Unknown")); btn_fmt_center_on_unknown->tooltip(_("Waterfall Centered on unknown signal")); btn_fmt_center_on_unknown->down_box(FL_DOWN_BOX); btn_fmt_center_on_unknown->callback((Fl_Callback*)cb_btn_fmt_center_on_unknown); o->value(progdefaults.fmt_center_on_unknown); } // Fl_Check_Button* btn_fmt_center_on_unknown { Fl_Check_Button* o = btn_fmt_center_on_reference = new Fl_Check_Button(626, 109, 70, 18, _("Center on Reference")); btn_fmt_center_on_reference->tooltip(_("Waterfall centered on reference signal")); btn_fmt_center_on_reference->down_box(FL_DOWN_BOX); btn_fmt_center_on_reference->callback((Fl_Callback*)cb_btn_fmt_center_on_reference); o->value(progdefaults.fmt_center_on_reference); } // Fl_Check_Button* btn_fmt_center_on_reference { Fl_Check_Button* o = btn_fmt_center_on_median = new Fl_Check_Button(627, 133, 70, 17, _("Center on median")); btn_fmt_center_on_median->tooltip(_("Waterfall centered 1/2 way between unknown & reference")); btn_fmt_center_on_median->down_box(FL_DOWN_BOX); btn_fmt_center_on_median->callback((Fl_Callback*)cb_btn_fmt_center_on_median); o->value(progdefaults.fmt_center_on_median); } // Fl_Check_Button* btn_fmt_center_on_median o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(616, 156, 180, 32); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_fmt_use_tabs = new Fl_Check_Button(627, 165, 70, 18, _("Use TAB delimiters")); btn_fmt_use_tabs->tooltip(_("Use tab delimiters between columns on csv export file.")); btn_fmt_use_tabs->down_box(FL_DOWN_BOX); btn_fmt_use_tabs->callback((Fl_Callback*)cb_btn_fmt_use_tabs); o->value(progdefaults.FMT_use_tabs); } // Fl_Check_Button* btn_fmt_use_tabs o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/FMT")); config_pages.push_back(p); tab_tree->add(_("Modem/FMT")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/FSQ")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(208, 23, 585, 60, _("Rx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Slider* o = valhits = new Fl_Value_Slider(343, 28, 125, 22, _("Min Hits")); valhits->tooltip(_("Minimum # hits in tone detector")); valhits->type(5); valhits->minimum(3); valhits->maximum(6); valhits->step(1); valhits->value(3); valhits->textsize(14); valhits->callback((Fl_Callback*)cb_valhits); valhits->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.fsqhits); } // Fl_Value_Slider* valhits { Fl_Choice* o = sel_fsq_lpf = new Fl_Choice(366, 53, 102, 22, _("Image LPF")); sel_fsq_lpf->tooltip(_("Narrow LPF if image noisy")); sel_fsq_lpf->down_box(FL_BORDER_BOX); sel_fsq_lpf->callback((Fl_Callback*)cb_sel_fsq_lpf); o->add("None"); o->add("300 Hz"); o->add("400 Hz"); o->add("500 Hz"); o->value(progdefaults.fsq_img_filter); } // Fl_Choice* sel_fsq_lpf { Fl_Value_Slider* o = sldrMovAvg = new Fl_Value_Slider(613, 28, 125, 22, _("MovAvg:")); sldrMovAvg->tooltip(_("Filter FFT output")); sldrMovAvg->type(1); sldrMovAvg->minimum(1); sldrMovAvg->maximum(15); sldrMovAvg->step(1); sldrMovAvg->value(4); sldrMovAvg->textsize(14); sldrMovAvg->callback((Fl_Callback*)cb_sldrMovAvg); sldrMovAvg->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.fsq_movavg); o->maximum(MOVAVGLIMIT); } // Fl_Value_Slider* sldrMovAvg { Fl_Choice* o = sel_fsq_heard_aging = new Fl_Choice(636, 53, 102, 22, _("Heard aging")); sel_fsq_heard_aging->tooltip(_("Remove call after ...")); sel_fsq_heard_aging->down_box(FL_BORDER_BOX); sel_fsq_heard_aging->callback((Fl_Callback*)cb_sel_fsq_heard_aging); o->add("Never"); o->add("1 min"); o->add("5 min");o->add("10 min"); o->add("20 min"); o->add("20 min"); o->add("30 min"); o->add("60 min"); o->add("90 min"); o->add("120 min"); o->value(progdefaults.fsq_heard_aging); } // Fl_Choice* sel_fsq_heard_aging o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(208, 83, 585, 100, _("Tx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btn_fsqbaud[0] = new Fl_Round_Button(340, 90, 55, 15, _("1.5 baud")); btn_fsqbaud[0]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[0]->callback((Fl_Callback*)cb_btn_fsqbaud); o->value(progdefaults.fsqbaud == 1.5); } // Fl_Round_Button* btn_fsqbaud[0] { Fl_Round_Button* o = btn_fsqbaud[1] = new Fl_Round_Button(430, 90, 55, 15, _("2 baud")); btn_fsqbaud[1]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[1]->callback((Fl_Callback*)cb_btn_fsqbaud1); o->value(progdefaults.fsqbaud == 2); } // Fl_Round_Button* btn_fsqbaud[1] { Fl_Round_Button* o = btn_fsqbaud[2] = new Fl_Round_Button(520, 90, 55, 15, _("3 baud")); btn_fsqbaud[2]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[2]->callback((Fl_Callback*)cb_btn_fsqbaud2); o->value(progdefaults.fsqbaud == 3); } // Fl_Round_Button* btn_fsqbaud[2] { Fl_Round_Button* o = btn_fsqbaud[3] = new Fl_Round_Button(610, 90, 55, 15, _("4.5 baud")); btn_fsqbaud[3]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[3]->callback((Fl_Callback*)cb_btn_fsqbaud3); o->value(progdefaults.fsqbaud == 4.5); } // Fl_Round_Button* btn_fsqbaud[3] { Fl_Round_Button* o = btn_fsqbaud[4] = new Fl_Round_Button(700, 90, 55, 15, _("6 baud")); btn_fsqbaud[4]->down_box(FL_ROUND_DOWN_BOX); btn_fsqbaud[4]->callback((Fl_Callback*)cb_btn_fsqbaud4); o->value(progdefaults.fsqbaud == 6); } // Fl_Round_Button* btn_fsqbaud[4] { Fl_Choice* o = sel_fsq_frequency = new Fl_Choice(638, 110, 102, 22, _("Center freq")); sel_fsq_frequency->down_box(FL_BORDER_BOX); sel_fsq_frequency->callback((Fl_Callback*)cb_sel_fsq_frequency); o->add("1150"); o->add("1500"); o->add("Variable"); o->value(progdefaults.fsq_frequency); } // Fl_Choice* sel_fsq_frequency { Fl_Choice* o = sel_fsq_sounder = new Fl_Choice(283, 110, 100, 22, _("Sounder")); sel_fsq_sounder->tooltip(_("Send beacon every ...")); sel_fsq_sounder->down_box(FL_BORDER_BOX); sel_fsq_sounder->callback((Fl_Callback*)cb_sel_fsq_sounder); o->add("OFF"); o->add("1 min"); o->add("10 min"); o->add("30 min"); o->add("60 min"); o->value(progdefaults.fsq_sounder); } // Fl_Choice* sel_fsq_sounder { Fl_Counter* o = cntr_FSQ_time_out = new Fl_Counter(457, 110, 80, 22, _("Time out")); cntr_FSQ_time_out->tooltip(_("Time out xmt attempt in XX seconds")); cntr_FSQ_time_out->type(1); cntr_FSQ_time_out->minimum(2); cntr_FSQ_time_out->maximum(20); cntr_FSQ_time_out->step(1); cntr_FSQ_time_out->value(6); cntr_FSQ_time_out->callback((Fl_Callback*)cb_cntr_FSQ_time_out); cntr_FSQ_time_out->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.fsq_time_out); } // Fl_Counter* cntr_FSQ_time_out { Fl_Input* o = new Fl_Input(284, 135, 456, 22, _("QTC:")); o->tooltip(_("Enter QTC text")); o->callback((Fl_Callback*)cb_QTC); o->value(progdefaults.fsqQTCtext.c_str()); } // Fl_Input* o { Fl_Check_Button* o = btn_fsq_lowercase = new Fl_Check_Button(214, 162, 214, 15, _("MYCALL lower case")); btn_fsq_lowercase->tooltip(_("convert operator callsign to lower case")); btn_fsq_lowercase->down_box(FL_DOWN_BOX); btn_fsq_lowercase->callback((Fl_Callback*)cb_btn_fsq_lowercase); o->value(progdefaults.fsq_lowercase); } // Fl_Check_Button* btn_fsq_lowercase { Fl_Input2* o = inpMyFSQQth = new Fl_Input2(420, 158, 320, 22, _("QTH:")); inpMyFSQQth->tooltip(_("Operators QTH")); inpMyFSQQth->box(FL_DOWN_BOX); inpMyFSQQth->color(FL_BACKGROUND2_COLOR); inpMyFSQQth->selection_color(FL_SELECTION_COLOR); inpMyFSQQth->labeltype(FL_NORMAL_LABEL); inpMyFSQQth->labelfont(0); inpMyFSQQth->labelsize(14); inpMyFSQQth->labelcolor(FL_FOREGROUND_COLOR); inpMyFSQQth->callback((Fl_Callback*)cb_inpMyFSQQth); inpMyFSQQth->align(Fl_Align(FL_ALIGN_LEFT)); inpMyFSQQth->when(FL_WHEN_RELEASE); inpMyFSQQth->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.myQth.c_str()); } // Fl_Input2* inpMyFSQQth o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(208, 184, 585, 44, _("Message Logging")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_fsq_msg_dt_stamp = new Fl_Check_Button(238, 205, 135, 15, _("Add date/time")); btn_fsq_msg_dt_stamp->tooltip(_("Add date/time stamp to each # received message")); btn_fsq_msg_dt_stamp->down_box(FL_DOWN_BOX); btn_fsq_msg_dt_stamp->value(1); btn_fsq_msg_dt_stamp->callback((Fl_Callback*)cb_btn_fsq_msg_dt_stamp); o->value(progdefaults.add_fsq_msg_dt); } // Fl_Check_Button* btn_fsq_msg_dt_stamp { Fl_Check_Button* o = btn_fsq_msg_append = new Fl_Check_Button(385, 205, 210, 15, _("always append to file(s)")); btn_fsq_msg_append->tooltip(_("append # directive msgs to named file")); btn_fsq_msg_append->down_box(FL_DOWN_BOX); btn_fsq_msg_append->value(1); btn_fsq_msg_append->callback((Fl_Callback*)cb_btn_fsq_msg_append); o->value(progdefaults.always_append); } // Fl_Check_Button* btn_fsq_msg_append { Fl_Counter* o = cntr_FSQ_notify_time_out = new Fl_Counter(698, 201, 80, 22, _("Notify time out")); cntr_FSQ_notify_time_out->tooltip(_("Notification dialog closes after XX seconds;^j0 == dialog remains open")); cntr_FSQ_notify_time_out->type(1); cntr_FSQ_notify_time_out->minimum(0); cntr_FSQ_notify_time_out->maximum(30); cntr_FSQ_notify_time_out->step(1); cntr_FSQ_notify_time_out->value(10); cntr_FSQ_notify_time_out->callback((Fl_Callback*)cb_cntr_FSQ_notify_time_out); cntr_FSQ_notify_time_out->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.fsq_notify_time_out); } // Fl_Counter* cntr_FSQ_notify_time_out o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(208, 228, 585, 80, _("Logging")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = txtAuditLog = new Fl_Output(285, 248, 325, 22, _("Audit log")); o->value(progdefaults.fsq_audit_log.c_str()); } // Fl_Output* txtAuditLog { Fl_Light_Button* o = btn_enable_auditlog = new Fl_Light_Button(624, 249, 74, 20, _("Enable")); btn_enable_auditlog->selection_color((Fl_Color)2); btn_enable_auditlog->callback((Fl_Callback*)cb_btn_enable_auditlog); o->value(progdefaults.fsq_enable_audit_log); } // Fl_Light_Button* btn_enable_auditlog { btn_select_auditlog = new Fl_Button(712, 249, 70, 20, _("Select")); btn_select_auditlog->callback((Fl_Callback*)cb_btn_select_auditlog); } // Fl_Button* btn_select_auditlog { Fl_Output* o = txtHeardLog = new Fl_Output(285, 276, 325, 22, _("Heard log")); o->value(progdefaults.fsq_heard_log.c_str()); } // Fl_Output* txtHeardLog { Fl_Light_Button* o = btn_enable_fsq_heard_log = new Fl_Light_Button(624, 277, 74, 20, _("Enable")); btn_enable_fsq_heard_log->selection_color((Fl_Color)2); btn_enable_fsq_heard_log->callback((Fl_Callback*)cb_btn_enable_fsq_heard_log); o->value(progdefaults.fsq_enable_heard_log); } // Fl_Light_Button* btn_enable_fsq_heard_log { btn_select_fsq_heard_log = new Fl_Button(712, 277, 70, 20, _("Select")); btn_select_fsq_heard_log->callback((Fl_Callback*)cb_btn_select_fsq_heard_log); } // Fl_Button* btn_select_fsq_heard_log o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(208, 308, 585, 35, _("Text Colors")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btn_fsq_xmt_color = new Fl_Button(348, 315, 40, 20, _("XMIT")); btn_fsq_xmt_color->tooltip(_("Transmit text")); btn_fsq_xmt_color->callback((Fl_Callback*)cb_btn_fsq_xmt_color); btn_fsq_xmt_color->align(Fl_Align(FL_ALIGN_LEFT)); btn_fsq_xmt_color->color(progdefaults.fsq_xmt_color); } // Fl_Button* btn_fsq_xmt_color { btn_fsq_directed_color = new Fl_Button(478, 315, 40, 20, _("DIRECTED")); btn_fsq_directed_color->tooltip(_("Directed received text")); btn_fsq_directed_color->callback((Fl_Callback*)cb_btn_fsq_directed_color); btn_fsq_directed_color->align(Fl_Align(FL_ALIGN_LEFT)); btn_fsq_directed_color->color(progdefaults.fsq_directed_color); } // Fl_Button* btn_fsq_directed_color { btn_fsq_undirected_color = new Fl_Button(628, 315, 40, 20, _("UNDIRECTED")); btn_fsq_undirected_color->tooltip(_("Undirected received text")); btn_fsq_undirected_color->callback((Fl_Callback*)cb_btn_fsq_undirected_color); btn_fsq_undirected_color->align(Fl_Align(FL_ALIGN_LEFT)); btn_fsq_undirected_color->color(progdefaults.fsq_undirected_color); } // Fl_Button* btn_fsq_undirected_color { btn_fsq_color_defaults = new Fl_Button(710, 315, 74, 20, _("Defaults")); btn_fsq_color_defaults->callback((Fl_Callback*)cb_btn_fsq_color_defaults); } // Fl_Button* btn_fsq_color_defaults o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/FSQ")); config_pages.push_back(p); tab_tree->add(_("Modem/FSQ")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/IFKP")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(208, 25, 587, 110, _("Tx Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Round_Button* o = btn_ifkpbaud[0] = new Fl_Round_Button(303, 53, 100, 17, _("1/2 speed")); btn_ifkpbaud[0]->down_box(FL_ROUND_DOWN_BOX); btn_ifkpbaud[0]->callback((Fl_Callback*)cb_btn_ifkpbaud); o->value(progdefaults.ifkp_baud == 0); } // Fl_Round_Button* btn_ifkpbaud[0] { Fl_Round_Button* o = btn_ifkpbaud[1] = new Fl_Round_Button(411, 53, 100, 17, _("1x speed")); btn_ifkpbaud[1]->tooltip(_("default")); btn_ifkpbaud[1]->down_box(FL_ROUND_DOWN_BOX); btn_ifkpbaud[1]->callback((Fl_Callback*)cb_btn_ifkpbaud1); o->value(progdefaults.ifkp_baud == 1); } // Fl_Round_Button* btn_ifkpbaud[1] { Fl_Round_Button* o = btn_ifkpbaud[2] = new Fl_Round_Button(519, 53, 100, 17, _("2x speed")); btn_ifkpbaud[2]->down_box(FL_ROUND_DOWN_BOX); btn_ifkpbaud[2]->callback((Fl_Callback*)cb_btn_ifkpbaud2); o->value(progdefaults.ifkp_baud == 2); } // Fl_Round_Button* btn_ifkpbaud[2] { Fl_Check_Button* o = btn_ifkp_lowercase = new Fl_Check_Button(303, 82, 220, 15, _("MYCALL always lower case")); btn_ifkp_lowercase->tooltip(_("convert operator callsign to lower case")); btn_ifkp_lowercase->down_box(FL_DOWN_BOX); btn_ifkp_lowercase->callback((Fl_Callback*)cb_btn_ifkp_lowercase); o->value(progdefaults.ifkp_lowercase); } // Fl_Check_Button* btn_ifkp_lowercase { Fl_Check_Button* o = btn_ifkp_lowercase_call = new Fl_Check_Button(528, 82, 220, 15, _("CALLSIGN always lower case")); btn_ifkp_lowercase_call->tooltip(_("convert other callsign to lower case")); btn_ifkp_lowercase_call->down_box(FL_DOWN_BOX); btn_ifkp_lowercase_call->callback((Fl_Callback*)cb_btn_ifkp_lowercase_call); o->value(progdefaults.ifkp_lowercase_call); } // Fl_Check_Button* btn_ifkp_lowercase_call { Fl_Check_Button* o = btn_ifkp_freqlock = new Fl_Check_Button(303, 109, 220, 15, _("lock WF at 1500 Hz")); btn_ifkp_freqlock->tooltip(_("Always transmit at 1500 Hertz center freq.")); btn_ifkp_freqlock->down_box(FL_DOWN_BOX); btn_ifkp_freqlock->callback((Fl_Callback*)cb_btn_ifkp_freqlock); o->value(progdefaults.ifkp_freqlock); } // Fl_Check_Button* btn_ifkp_freqlock o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(208, 138, 587, 92, _("Logging")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Output* o = txt_ifkp_audit_log = new Fl_Output(295, 164, 323, 25, _("Audit log")); o->value(progdefaults.ifkp_audit_log.c_str()); } // Fl_Output* txt_ifkp_audit_log { Fl_Light_Button* o = btn_enable_ifkp_audit_log = new Fl_Light_Button(632, 164, 73, 25, _("Enable")); btn_enable_ifkp_audit_log->selection_color((Fl_Color)2); btn_enable_ifkp_audit_log->callback((Fl_Callback*)cb_btn_enable_ifkp_audit_log); o->value(progdefaults.ifkp_enable_audit_log); } // Fl_Light_Button* btn_enable_ifkp_audit_log { btn_ifkp_select_auditlog = new Fl_Button(713, 164, 70, 25, _("Select")); btn_ifkp_select_auditlog->callback((Fl_Callback*)cb_btn_ifkp_select_auditlog); } // Fl_Button* btn_ifkp_select_auditlog { Fl_Output* o = txt_ifkp_heard_log = new Fl_Output(295, 193, 323, 25, _("Heard log")); o->value(progdefaults.ifkp_heard_log.c_str()); } // Fl_Output* txt_ifkp_heard_log { Fl_Light_Button* o = btn_enable_ifkp_heard_log = new Fl_Light_Button(632, 193, 73, 25, _("Enable")); btn_enable_ifkp_heard_log->selection_color((Fl_Color)2); btn_enable_ifkp_heard_log->callback((Fl_Callback*)cb_btn_enable_ifkp_heard_log); o->value(progdefaults.ifkp_enable_heard_log); } // Fl_Light_Button* btn_enable_ifkp_heard_log { btn_select_ifkp_heard_log = new Fl_Button(713, 193, 70, 25, _("Select")); btn_select_ifkp_heard_log->callback((Fl_Callback*)cb_btn_select_ifkp_heard_log); } // Fl_Button* btn_select_ifkp_heard_log o->end(); } // Fl_Group* o { Fl_Group* o = ifkp_image_box = new Fl_Group(295, 236, 59, 74, _("\nOperator avatar")); ifkp_image_box->box(FL_FLAT_BOX); ifkp_image_box->color(FL_BLACK); ifkp_image_box->selection_color(FL_BACKGROUND_COLOR); ifkp_image_box->labeltype(FL_NORMAL_LABEL); ifkp_image_box->labelfont(0); ifkp_image_box->labelsize(14); ifkp_image_box->labelcolor(FL_FOREGROUND_COLOR); ifkp_image_box->align(Fl_Align(FL_ALIGN_BOTTOM)); ifkp_image_box->when(FL_WHEN_RELEASE); init_def_ifkp_avatar(o); } // Fl_Group* ifkp_image_box CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/IFKP")); config_pages.push_back(p); tab_tree->add(_("Modem/IFKP")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/MT-63")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(249, 36, 490, 84); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnMT63_8bit = new Fl_Check_Button(394, 50, 205, 20, _("8-bit extended characters (UTF-8)")); btnMT63_8bit->tooltip(_("Enable this for UTF-8 characters")); btnMT63_8bit->down_box(FL_DOWN_BOX); btnMT63_8bit->value(1); btnMT63_8bit->callback((Fl_Callback*)cb_btnMT63_8bit); o->value(progdefaults.mt63_8bit); } // Fl_Check_Button* btnMT63_8bit { Fl_Check_Button* o = btnMT63_rx_integration = new Fl_Check_Button(394, 80, 190, 20, _("Long receive integration")); btnMT63_rx_integration->tooltip(_("Enable for very weak signals")); btnMT63_rx_integration->down_box(FL_DOWN_BOX); btnMT63_rx_integration->value(1); btnMT63_rx_integration->callback((Fl_Callback*)cb_btnMT63_rx_integration); o->value(progdefaults.mt63_rx_integration); } // Fl_Check_Button* btnMT63_rx_integration o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(249, 132, 490, 178); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnMT63_usetones = new Fl_Check_Button(393, 140, 200, 20, _("Transmit lower start tone")); btnMT63_usetones->down_box(FL_DOWN_BOX); btnMT63_usetones->callback((Fl_Callback*)cb_btnMT63_usetones); o->value(progdefaults.mt63_usetones); } // Fl_Check_Button* btnMT63_usetones { Fl_Check_Button* o = btnMT63_upper_lower = new Fl_Check_Button(393, 170, 200, 20, _("Transmit upper start tone")); btnMT63_upper_lower->down_box(FL_DOWN_BOX); btnMT63_upper_lower->callback((Fl_Callback*)cb_btnMT63_upper_lower); o->value(progdefaults.mt63_twotones); if (!btnMT63_usetones->value()) o->deactivate(); } // Fl_Check_Button* btnMT63_upper_lower { Fl_Spinner2* o = MT63_tone_duration = new Fl_Spinner2(393, 196, 40, 20, _("Tone Duration (secs)")); MT63_tone_duration->box(FL_NO_BOX); MT63_tone_duration->color(FL_BACKGROUND_COLOR); MT63_tone_duration->selection_color(FL_BACKGROUND_COLOR); MT63_tone_duration->labeltype(FL_NORMAL_LABEL); MT63_tone_duration->labelfont(0); MT63_tone_duration->labelsize(14); MT63_tone_duration->labelcolor(FL_FOREGROUND_COLOR); MT63_tone_duration->maximum(10); MT63_tone_duration->value(4); MT63_tone_duration->callback((Fl_Callback*)cb_MT63_tone_duration); MT63_tone_duration->align(Fl_Align(FL_ALIGN_RIGHT)); MT63_tone_duration->when(FL_WHEN_RELEASE); o->value(progdefaults.mt63_tone_duration); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* MT63_tone_duration { Fl_Check_Button* o = btnMT63_at500 = new Fl_Check_Button(393, 225, 200, 20, _("Low tone at 500 Hz")); btnMT63_at500->down_box(FL_DOWN_BOX); btnMT63_at500->callback((Fl_Callback*)cb_btnMT63_at500); o->value(progdefaults.mt63_at500); } // Fl_Check_Button* btnMT63_at500 { Fl_Check_Button* o = btnMT63_centered = new Fl_Check_Button(393, 250, 248, 20, _("Centered at 1500 Hz (SHARES)")); btnMT63_centered->down_box(FL_DOWN_BOX); btnMT63_centered->callback((Fl_Callback*)cb_btnMT63_centered); o->value(progdefaults.mt63_centered); } // Fl_Check_Button* btnMT63_centered { Fl_Check_Button* o = btnMT63_manual = new Fl_Check_Button(393, 275, 200, 20, _("Manual tuning")); btnMT63_manual->down_box(FL_DOWN_BOX); btnMT63_manual->callback((Fl_Callback*)cb_btnMT63_manual); o->value(!progdefaults.mt63_at500 && !progdefaults.mt63_centered); } // Fl_Check_Button* btnMT63_manual o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/MT-63")); config_pages.push_back(p); tab_tree->add(_("Modem/MT-63")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/Contestia")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(257, 40, 490, 240); o->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = i_listbox_contestia_bandwidth = new Fl_ListBox(312, 60, 85, 22, _("Bandwidth")); i_listbox_contestia_bandwidth->tooltip(_("Select bandwidth")); i_listbox_contestia_bandwidth->box(FL_DOWN_BOX); i_listbox_contestia_bandwidth->color(FL_BACKGROUND2_COLOR); i_listbox_contestia_bandwidth->selection_color(FL_BACKGROUND_COLOR); i_listbox_contestia_bandwidth->labeltype(FL_NORMAL_LABEL); i_listbox_contestia_bandwidth->labelfont(0); i_listbox_contestia_bandwidth->labelsize(14); i_listbox_contestia_bandwidth->labelcolor(FL_FOREGROUND_COLOR); i_listbox_contestia_bandwidth->callback((Fl_Callback*)cb_i_listbox_contestia_bandwidth); i_listbox_contestia_bandwidth->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_contestia_bandwidth->when(FL_WHEN_RELEASE); o->add(szContestiaBandwidth); o->index(progdefaults.contestiabw); o->labelsize(FL_NORMAL_SIZE); i_listbox_contestia_bandwidth->end(); } // Fl_ListBox* i_listbox_contestia_bandwidth { Fl_ListBox* o = i_listbox_contestia_tones = new Fl_ListBox(573, 60, 70, 22, _("Tones")); i_listbox_contestia_tones->tooltip(_("Select number of tones")); i_listbox_contestia_tones->box(FL_DOWN_BOX); i_listbox_contestia_tones->color(FL_BACKGROUND2_COLOR); i_listbox_contestia_tones->selection_color(FL_BACKGROUND_COLOR); i_listbox_contestia_tones->labeltype(FL_NORMAL_LABEL); i_listbox_contestia_tones->labelfont(0); i_listbox_contestia_tones->labelsize(14); i_listbox_contestia_tones->labelcolor(FL_FOREGROUND_COLOR); i_listbox_contestia_tones->callback((Fl_Callback*)cb_i_listbox_contestia_tones); i_listbox_contestia_tones->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_contestia_tones->when(FL_WHEN_RELEASE); o->add(szContestiaTones); o->index(progdefaults.contestiatones); o->labelsize(FL_NORMAL_SIZE); i_listbox_contestia_tones->end(); } // Fl_ListBox* i_listbox_contestia_tones { Fl_Group* o = new Fl_Group(295, 99, 414, 101, _("Receive synchronizer")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntContestia_smargin = new Fl_Counter2(314, 130, 70, 22, _("Tune margin (tone frequency spacing)")); cntContestia_smargin->tooltip(_("Change ONLY to experiment")); cntContestia_smargin->type(1); cntContestia_smargin->box(FL_UP_BOX); cntContestia_smargin->color(FL_BACKGROUND_COLOR); cntContestia_smargin->selection_color(FL_INACTIVE_COLOR); cntContestia_smargin->labeltype(FL_NORMAL_LABEL); cntContestia_smargin->labelfont(0); cntContestia_smargin->labelsize(14); cntContestia_smargin->labelcolor(FL_FOREGROUND_COLOR); cntContestia_smargin->minimum(2); cntContestia_smargin->maximum(128); cntContestia_smargin->step(1); cntContestia_smargin->value(8); cntContestia_smargin->callback((Fl_Callback*)cb_cntContestia_smargin); cntContestia_smargin->align(Fl_Align(FL_ALIGN_RIGHT)); cntContestia_smargin->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntContestia_smargin { Fl_Counter2* o = cntContestia_sinteg = new Fl_Counter2(314, 162, 70, 22, _("Integration period (FEC blocks)")); cntContestia_sinteg->tooltip(_("Change ONLY to experiment")); cntContestia_sinteg->type(1); cntContestia_sinteg->box(FL_UP_BOX); cntContestia_sinteg->color(FL_BACKGROUND_COLOR); cntContestia_sinteg->selection_color(FL_INACTIVE_COLOR); cntContestia_sinteg->labeltype(FL_NORMAL_LABEL); cntContestia_sinteg->labelfont(0); cntContestia_sinteg->labelsize(14); cntContestia_sinteg->labelcolor(FL_FOREGROUND_COLOR); cntContestia_sinteg->minimum(2); cntContestia_sinteg->maximum(128); cntContestia_sinteg->step(1); cntContestia_sinteg->value(4); cntContestia_sinteg->callback((Fl_Callback*)cb_cntContestia_sinteg); cntContestia_sinteg->align(Fl_Align(FL_ALIGN_RIGHT)); cntContestia_sinteg->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntContestia_sinteg o->end(); } // Fl_Group* o { btnContestia_8bit = new Fl_Check_Button(312, 209, 200, 20, _("8-bit extended characters")); btnContestia_8bit->tooltip(_("Enable this for Latin-1 accented characters")); btnContestia_8bit->down_box(FL_DOWN_BOX); btnContestia_8bit->callback((Fl_Callback*)cb_btnContestia_8bit); } // Fl_Check_Button* btnContestia_8bit { Fl_Check_Button* o = btnContestia_start_stop_tones = new Fl_Check_Button(312, 240, 265, 20, _("xmt start/stop tones")); btnContestia_start_stop_tones->tooltip(_("Enable this to send start/stop tones")); btnContestia_start_stop_tones->down_box(FL_DOWN_BOX); btnContestia_start_stop_tones->callback((Fl_Callback*)cb_btnContestia_start_stop_tones); o->value(progdefaults.contestia_start_tones); } // Fl_Check_Button* btnContestia_start_stop_tones o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Contestia")); config_pages.push_back(p); tab_tree->add(_("Modem/Contestia")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/Olivia")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(253, 40, 490, 280); o->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = i_listbox_olivia_bandwidth = new Fl_ListBox(308, 60, 85, 22, _("Bandwidth")); i_listbox_olivia_bandwidth->tooltip(_("Select bandwidth")); i_listbox_olivia_bandwidth->box(FL_DOWN_BOX); i_listbox_olivia_bandwidth->color(FL_BACKGROUND2_COLOR); i_listbox_olivia_bandwidth->selection_color(FL_BACKGROUND_COLOR); i_listbox_olivia_bandwidth->labeltype(FL_NORMAL_LABEL); i_listbox_olivia_bandwidth->labelfont(0); i_listbox_olivia_bandwidth->labelsize(14); i_listbox_olivia_bandwidth->labelcolor(FL_FOREGROUND_COLOR); i_listbox_olivia_bandwidth->callback((Fl_Callback*)cb_i_listbox_olivia_bandwidth); i_listbox_olivia_bandwidth->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_olivia_bandwidth->when(FL_WHEN_RELEASE); o->add(szOliviaBandwidth); o->index(progdefaults.oliviabw); o->labelsize(FL_NORMAL_SIZE); i_listbox_olivia_bandwidth->end(); } // Fl_ListBox* i_listbox_olivia_bandwidth { Fl_ListBox* o = i_listbox_olivia_tones = new Fl_ListBox(569, 60, 70, 22, _("Tones")); i_listbox_olivia_tones->tooltip(_("Select number of tones")); i_listbox_olivia_tones->box(FL_DOWN_BOX); i_listbox_olivia_tones->color(FL_BACKGROUND2_COLOR); i_listbox_olivia_tones->selection_color(FL_BACKGROUND_COLOR); i_listbox_olivia_tones->labeltype(FL_NORMAL_LABEL); i_listbox_olivia_tones->labelfont(0); i_listbox_olivia_tones->labelsize(14); i_listbox_olivia_tones->labelcolor(FL_FOREGROUND_COLOR); i_listbox_olivia_tones->callback((Fl_Callback*)cb_i_listbox_olivia_tones); i_listbox_olivia_tones->align(Fl_Align(FL_ALIGN_RIGHT)); i_listbox_olivia_tones->when(FL_WHEN_RELEASE); o->add(szOliviaTones); o->index(progdefaults.oliviatones); o->labelsize(FL_NORMAL_SIZE); i_listbox_olivia_tones->end(); } // Fl_ListBox* i_listbox_olivia_tones { Fl_Group* o = new Fl_Group(308, 99, 379, 133, _("Receive synchronizer")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntOlivia_smargin = new Fl_Counter2(323, 130, 70, 22, _("Tune margin (tone frequency spacing)")); cntOlivia_smargin->tooltip(_("Change ONLY to experiment")); cntOlivia_smargin->type(1); cntOlivia_smargin->box(FL_UP_BOX); cntOlivia_smargin->color(FL_BACKGROUND_COLOR); cntOlivia_smargin->selection_color(FL_INACTIVE_COLOR); cntOlivia_smargin->labeltype(FL_NORMAL_LABEL); cntOlivia_smargin->labelfont(0); cntOlivia_smargin->labelsize(14); cntOlivia_smargin->labelcolor(FL_FOREGROUND_COLOR); cntOlivia_smargin->minimum(2); cntOlivia_smargin->maximum(128); cntOlivia_smargin->step(1); cntOlivia_smargin->value(8); cntOlivia_smargin->callback((Fl_Callback*)cb_cntOlivia_smargin); cntOlivia_smargin->align(Fl_Align(FL_ALIGN_RIGHT)); cntOlivia_smargin->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.oliviasmargin); } // Fl_Counter2* cntOlivia_smargin { Fl_Counter2* o = cntOlivia_sinteg = new Fl_Counter2(323, 162, 70, 22, _("Integration period (FEC blocks)")); cntOlivia_sinteg->tooltip(_("Change ONLY to experiment")); cntOlivia_sinteg->type(1); cntOlivia_sinteg->box(FL_UP_BOX); cntOlivia_sinteg->color(FL_BACKGROUND_COLOR); cntOlivia_sinteg->selection_color(FL_INACTIVE_COLOR); cntOlivia_sinteg->labeltype(FL_NORMAL_LABEL); cntOlivia_sinteg->labelfont(0); cntOlivia_sinteg->labelsize(14); cntOlivia_sinteg->labelcolor(FL_FOREGROUND_COLOR); cntOlivia_sinteg->minimum(2); cntOlivia_sinteg->maximum(128); cntOlivia_sinteg->step(1); cntOlivia_sinteg->value(4); cntOlivia_sinteg->callback((Fl_Callback*)cb_cntOlivia_sinteg); cntOlivia_sinteg->align(Fl_Align(FL_ALIGN_RIGHT)); cntOlivia_sinteg->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.oliviasinteg); } // Fl_Counter2* cntOlivia_sinteg { Fl_Check_Button* o = btn_olivia_reset_fec = new Fl_Check_Button(324, 194, 349, 20, _("Reset FEC blocks when changing BW or Tones")); btn_olivia_reset_fec->tooltip(_("Enable this for UTF-8 character transmission")); btn_olivia_reset_fec->down_box(FL_DOWN_BOX); btn_olivia_reset_fec->callback((Fl_Callback*)cb_btn_olivia_reset_fec); o->value(progdefaults.olivia_reset_fec); } // Fl_Check_Button* btn_olivia_reset_fec o->end(); } // Fl_Group* o { Fl_Check_Button* o = btnOlivia_8bit = new Fl_Check_Button(329, 255, 265, 20, _("8-bit extended characters (UTF-8)")); btnOlivia_8bit->tooltip(_("Enable this for UTF-8 character transmission")); btnOlivia_8bit->down_box(FL_DOWN_BOX); btnOlivia_8bit->callback((Fl_Callback*)cb_btnOlivia_8bit); o->value(progdefaults.olivia8bit); } // Fl_Check_Button* btnOlivia_8bit { Fl_Check_Button* o = btnOlivia_start_stop_tones = new Fl_Check_Button(329, 279, 265, 20, _("xmt start/stop tones")); btnOlivia_start_stop_tones->tooltip(_("Enable this to send start/stop tones")); btnOlivia_start_stop_tones->down_box(FL_DOWN_BOX); btnOlivia_start_stop_tones->callback((Fl_Callback*)cb_btnOlivia_start_stop_tones); o->value(progdefaults.olivia_start_tones); } // Fl_Check_Button* btnOlivia_start_stop_tones o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Olivia")); config_pages.push_back(p); tab_tree->add(_("Modem/Olivia")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/Psk")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(255, 33, 490, 86, _("AFC behavior")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntSearchRange = new Fl_Counter2(400, 57, 75, 20, _("Acquisition search range (Hz)")); cntSearchRange->tooltip(_("Capture signals within this frequency range")); cntSearchRange->type(1); cntSearchRange->box(FL_UP_BOX); cntSearchRange->color(FL_BACKGROUND_COLOR); cntSearchRange->selection_color(FL_INACTIVE_COLOR); cntSearchRange->labeltype(FL_NORMAL_LABEL); cntSearchRange->labelfont(0); cntSearchRange->labelsize(14); cntSearchRange->labelcolor(FL_FOREGROUND_COLOR); cntSearchRange->minimum(10); cntSearchRange->maximum(500); cntSearchRange->step(10); cntSearchRange->value(200); cntSearchRange->callback((Fl_Callback*)cb_cntSearchRange); cntSearchRange->align(Fl_Align(FL_ALIGN_RIGHT)); cntSearchRange->when(FL_WHEN_CHANGED); o->value(progdefaults.SearchRange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntSearchRange { Fl_Counter2* o = cntACQsn = new Fl_Counter2(400, 86, 75, 20, _("Acquisition S/N (dB)")); cntACQsn->tooltip(_("Capture signals over this threshold")); cntACQsn->type(1); cntACQsn->box(FL_UP_BOX); cntACQsn->color(FL_BACKGROUND_COLOR); cntACQsn->selection_color(FL_INACTIVE_COLOR); cntACQsn->labeltype(FL_NORMAL_LABEL); cntACQsn->labelfont(0); cntACQsn->labelsize(14); cntACQsn->labelcolor(FL_FOREGROUND_COLOR); cntACQsn->minimum(3); cntACQsn->maximum(20); cntACQsn->step(1); cntACQsn->value(6); cntACQsn->callback((Fl_Callback*)cb_cntACQsn); cntACQsn->align(Fl_Align(FL_ALIGN_RIGHT)); cntACQsn->when(FL_WHEN_CHANGED); o->value(progdefaults.ACQsn); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntACQsn o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(255, 121, 490, 65, _("S/N and IMD behavior")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = listbox_psk_status_timeout = new Fl_ListBox(380, 152, 80, 20, _("after")); listbox_psk_status_timeout->tooltip(_("Behavior of s/n imd")); listbox_psk_status_timeout->box(FL_DOWN_BOX); listbox_psk_status_timeout->color(FL_BACKGROUND2_COLOR); listbox_psk_status_timeout->selection_color(FL_BACKGROUND_COLOR); listbox_psk_status_timeout->labeltype(FL_NORMAL_LABEL); listbox_psk_status_timeout->labelfont(0); listbox_psk_status_timeout->labelsize(14); listbox_psk_status_timeout->labelcolor(FL_FOREGROUND_COLOR); listbox_psk_status_timeout->callback((Fl_Callback*)cb_listbox_psk_status_timeout); listbox_psk_status_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_psk_status_timeout->when(FL_WHEN_RELEASE); o->add(_("Clear")); o->add(_("Dim")); o->index(progdefaults.StatusDim); o->labelsize(FL_NORMAL_SIZE); listbox_psk_status_timeout->end(); } // Fl_ListBox* listbox_psk_status_timeout { Fl_Counter2* o = new Fl_Counter2(521, 152, 75, 20, _("seconds")); o->tooltip(_("Will occur after this time in seconds")); o->type(1); o->box(FL_UP_BOX); o->color(FL_BACKGROUND_COLOR); o->selection_color(FL_INACTIVE_COLOR); o->labeltype(FL_NORMAL_LABEL); o->labelfont(0); o->labelsize(14); o->labelcolor(FL_FOREGROUND_COLOR); o->minimum(0); o->maximum(30); o->step(1); o->callback((Fl_Callback*)cb_seconds); o->align(Fl_Align(FL_ALIGN_RIGHT)); o->when(FL_WHEN_CHANGED); o->value(progdefaults.StatusTimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(255, 191, 490, 80, _("Multi-Channel Signal Processing")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnEnablePSKbrowsing = new Fl_Check_Button(425, 241, 180, 20, _("Multi-channel detector")); btnEnablePSKbrowsing->down_box(FL_DOWN_BOX); btnEnablePSKbrowsing->callback((Fl_Callback*)cb_btnEnablePSKbrowsing); o->value(progdefaults.pskbrowser_on); } // Fl_Check_Button* btnEnablePSKbrowsing { Fl_Box* o = new Fl_Box(265, 218, 440, 20, _("Disable on very slow CPUs or if signal browser is not used")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(255, 273, 490, 47, _("8 psk")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnPSKpilot = new Fl_Check_Button(300, 286, 113, 20, _("Pilot tone")); btnPSKpilot->tooltip(_("Enable encode/decode vestigial pilot tone")); btnPSKpilot->down_box(FL_DOWN_BOX); btnPSKpilot->callback((Fl_Callback*)cb_btnPSKpilot); o->value(progdefaults.pskpilot); } // Fl_Check_Button* btnPSKpilot { Fl_Counter2* o = cnt_pilot_power = new Fl_Counter2(405, 286, 75, 20, _("pilot power (dB)")); cnt_pilot_power->tooltip(_("Pilot tone power relative to signal")); cnt_pilot_power->type(1); cnt_pilot_power->box(FL_UP_BOX); cnt_pilot_power->color(FL_BACKGROUND_COLOR); cnt_pilot_power->selection_color(FL_INACTIVE_COLOR); cnt_pilot_power->labeltype(FL_NORMAL_LABEL); cnt_pilot_power->labelfont(0); cnt_pilot_power->labelsize(14); cnt_pilot_power->labelcolor(FL_FOREGROUND_COLOR); cnt_pilot_power->minimum(-60); cnt_pilot_power->maximum(-20); cnt_pilot_power->step(1); cnt_pilot_power->value(-30); cnt_pilot_power->callback((Fl_Callback*)cb_cnt_pilot_power); cnt_pilot_power->align(Fl_Align(FL_ALIGN_RIGHT)); cnt_pilot_power->when(FL_WHEN_CHANGED); o->value(progdefaults.pilot_power); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cnt_pilot_power { Fl_Check_Button* o = btnPSK8Preamble = new Fl_Check_Button(610, 286, 113, 20, _("Short Preamble")); btnPSK8Preamble->tooltip(_("Enable short preamble for 8PSK transmission")); btnPSK8Preamble->down_box(FL_DOWN_BOX); btnPSK8Preamble->callback((Fl_Callback*)cb_btnPSK8Preamble); o->value(progStatus.psk8DCDShortFlag); } // Fl_Check_Button* btnPSK8Preamble o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Psk")); config_pages.push_back(p); tab_tree->add(_("Modem/Psk")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/TTY/Rx")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(202, 22, 595, 50, _("Receive")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = i_listbox_rtty_afc_speed = new Fl_ListBox(296, 43, 90, 22, _("AFC speed")); i_listbox_rtty_afc_speed->tooltip(_("AFC tracking speed")); i_listbox_rtty_afc_speed->box(FL_DOWN_BOX); i_listbox_rtty_afc_speed->color(FL_BACKGROUND2_COLOR); i_listbox_rtty_afc_speed->selection_color(FL_BACKGROUND_COLOR); i_listbox_rtty_afc_speed->labeltype(FL_NORMAL_LABEL); i_listbox_rtty_afc_speed->labelfont(0); i_listbox_rtty_afc_speed->labelsize(14); i_listbox_rtty_afc_speed->labelcolor(FL_FOREGROUND_COLOR); i_listbox_rtty_afc_speed->callback((Fl_Callback*)cb_i_listbox_rtty_afc_speed); i_listbox_rtty_afc_speed->align(Fl_Align(FL_ALIGN_LEFT)); i_listbox_rtty_afc_speed->when(FL_WHEN_RELEASE); o->add("Slow"); o->add("Normal"); o->add("Fast"); o->index(progdefaults.rtty_afcspeed); o->labelsize(FL_NORMAL_SIZE); i_listbox_rtty_afc_speed->end(); } // Fl_ListBox* i_listbox_rtty_afc_speed { Fl_Check_Button* o = chkUOSrx = new Fl_Check_Button(400, 45, 63, 18, _("RX - unshift on space")); chkUOSrx->tooltip(_("Revert to unshifted char\'s on a space")); chkUOSrx->down_box(FL_DOWN_BOX); chkUOSrx->callback((Fl_Callback*)cb_chkUOSrx); o->value(progdefaults.UOSrx); } // Fl_Check_Button* chkUOSrx { Fl_Value_Input* o = rtty_rx_shape = new Fl_Value_Input(745, 42, 48, 25, _("Filter Shape Factor")); rtty_rx_shape->tooltip(_("rcos timing coefficient:\n1.0 ... 2.0\nW1HKJ best 1.275\nDO2SMF best 1.500")); rtty_rx_shape->minimum(1); rtty_rx_shape->maximum(2); rtty_rx_shape->step(0.001); rtty_rx_shape->value(1.25); rtty_rx_shape->callback((Fl_Callback*)cb_rtty_rx_shape); o->value(progdefaults.rtty_filter); } // Fl_Value_Input* rtty_rx_shape o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(202, 72, 595, 55, _("Decode (CWI suppression)")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnRxTones[0] = new Fl_Check_Button(308, 98, 77, 13, _("Mark-Space")); btnRxTones[0]->down_box(FL_DOWN_BOX); btnRxTones[0]->callback((Fl_Callback*)cb_btnRxTones); o->value(progdefaults.rtty_cwi == 0); } // Fl_Check_Button* btnRxTones[0] { Fl_Check_Button* o = btnRxTones[1] = new Fl_Check_Button(455, 98, 77, 13, _("Mark only")); btnRxTones[1]->down_box(FL_DOWN_BOX); btnRxTones[1]->callback((Fl_Callback*)cb_btnRxTones1); o->value(progdefaults.rtty_cwi == 1); } // Fl_Check_Button* btnRxTones[1] { Fl_Check_Button* o = btnRxTones[2] = new Fl_Check_Button(602, 98, 78, 13, _("Space only")); btnRxTones[2]->down_box(FL_DOWN_BOX); btnRxTones[2]->callback((Fl_Callback*)cb_btnRxTones2); o->value(progdefaults.rtty_cwi == 2); } // Fl_Check_Button* btnRxTones[2] o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(202, 128, 595, 55, _("RTTY Scope Display")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnPreferXhairScope = new Fl_Check_Button(308, 150, 182, 20, _("Use cross hair scope")); btnPreferXhairScope->tooltip(_("Default to cross hair digiscope")); btnPreferXhairScope->down_box(FL_DOWN_BOX); btnPreferXhairScope->callback((Fl_Callback*)cb_btnPreferXhairScope); o->value(progdefaults.PreferXhairScope); } // Fl_Check_Button* btnPreferXhairScope { Fl_Check_Button* o = chk_true_scope = new Fl_Check_Button(551, 150, 77, 20, _("XY - classic scope")); chk_true_scope->tooltip(_("Enabled - use Mark/Space filter outputs\nDisabled - use pseudo signals")); chk_true_scope->down_box(FL_DOWN_BOX); chk_true_scope->callback((Fl_Callback*)cb_chk_true_scope); o->value(progdefaults.true_scope); } // Fl_Check_Button* chk_true_scope o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(202, 184, 595, 54, _("Log RTTY frequency")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_useMARKfreq = new Fl_Check_Button(308, 208, 161, 17, _("Use MARK freq\'")); chk_useMARKfreq->tooltip(_("Enabled - log QSO using Mark frequency\nDisabled - log QSO using center frequ\ ency")); chk_useMARKfreq->down_box(FL_DOWN_BOX); chk_useMARKfreq->value(1); chk_useMARKfreq->callback((Fl_Callback*)cb_chk_useMARKfreq); o->value(progdefaults.useMARKfreq); } // Fl_Check_Button* chk_useMARKfreq { Fl_Button* o = btnRTTY_mark_color = new Fl_Button(551, 205, 45, 20, _("track color")); btnRTTY_mark_color->tooltip(_("Color of Mark Track")); btnRTTY_mark_color->color((Fl_Color)2); btnRTTY_mark_color->callback((Fl_Callback*)cb_btnRTTY_mark_color); btnRTTY_mark_color->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.rttymarkRGBI.R,progdefaults.rttymarkRGBI.G,progdefaults.rttymarkRGBI.B)); } // Fl_Button* btnRTTY_mark_color o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(202, 240, 595, 104, _("RTTY Bell")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_audibleBELL = new Fl_Check_Button(308, 259, 161, 22, _("Audible BELL")); chk_audibleBELL->tooltip(_("Enabled - log QSO using Mark frequency\nDisabled - log QSO using center frequ\ ency")); chk_audibleBELL->down_box(FL_DOWN_BOX); chk_audibleBELL->value(1); chk_audibleBELL->callback((Fl_Callback*)cb_chk_audibleBELL); o->value(progdefaults.audibleBELL); } // Fl_Check_Button* chk_audibleBELL { Fl_Check_Button* o = chk_visibleBELL = new Fl_Check_Button(551, 259, 161, 22, _("Visible BELL")); chk_visibleBELL->tooltip(_("Enabled - log QSO using Mark frequency\nDisabled - log QSO using center frequ\ ency")); chk_visibleBELL->down_box(FL_DOWN_BOX); chk_visibleBELL->value(1); chk_visibleBELL->callback((Fl_Callback*)cb_chk_visibleBELL); o->value(progdefaults.visibleBELL); } // Fl_Check_Button* chk_visibleBELL { Fl_File_Input* o = inp_wav_fname_bell_ring = new Fl_File_Input(223, 301, 301, 35, _("RTTY Bell audio wav")); inp_wav_fname_bell_ring->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.BELL_RING.c_str()); } // Fl_File_Input* inp_wav_fname_bell_ring { btn_select_bell_ring_wav = new Fl_Button(526, 312, 59, 24, _("Select")); btn_select_bell_ring_wav->callback((Fl_Callback*)cb_btn_select_bell_ring_wav); } // Fl_Button* btn_select_bell_ring_wav { Fl_Choice* o = mnu_bell_ring_menu = new Fl_Choice(589, 312, 134, 24, _("Sound:")); mnu_bell_ring_menu->box(FL_DOWN_BOX); mnu_bell_ring_menu->down_box(FL_BORDER_BOX); mnu_bell_ring_menu->color((Fl_Color)53); mnu_bell_ring_menu->callback((Fl_Callback*)cb_mnu_bell_ring_menu); mnu_bell_ring_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone"); o->value(progdefaults.BELL_RING_MENU); } // Fl_Choice* mnu_bell_ring_menu { btn_test_bell_ring_wav = new Fl_Button(728, 312, 59, 24, _("Test")); btn_test_bell_ring_wav->callback((Fl_Callback*)cb_btn_test_bell_ring_wav); } // Fl_Button* btn_test_bell_ring_wav o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Rx")); config_pages.push_back(p); tab_tree->add(_("Modem/TTY/Rx")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/TTY/Tx")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 21, 590, 200, _("Sound Card FSK")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = selShift = new Fl_ListBox(281, 43, 100, 22, _("Carrier shift")); selShift->tooltip(_("Select carrier shift")); selShift->box(FL_DOWN_BOX); selShift->color(FL_BACKGROUND2_COLOR); selShift->selection_color(FL_BACKGROUND_COLOR); selShift->labeltype(FL_NORMAL_LABEL); selShift->labelfont(0); selShift->labelsize(14); selShift->labelcolor(FL_FOREGROUND_COLOR); selShift->callback((Fl_Callback*)cb_selShift); selShift->align(Fl_Align(FL_ALIGN_RIGHT)); selShift->when(FL_WHEN_CHANGED); o->add(szShifts);o->index(progdefaults.rtty_shift); o->labelsize(FL_NORMAL_SIZE); selShift->end(); } // Fl_ListBox* selShift { Fl_Counter2* o = selCustomShift = new Fl_Counter2(281, 73, 100, 22, _("Custom shift")); selCustomShift->tooltip(_("Input carrier shift")); selCustomShift->box(FL_UP_BOX); selCustomShift->color(FL_BACKGROUND_COLOR); selCustomShift->selection_color(FL_INACTIVE_COLOR); selCustomShift->labeltype(FL_NORMAL_LABEL); selCustomShift->labelfont(0); selCustomShift->labelsize(14); selCustomShift->labelcolor(FL_FOREGROUND_COLOR); selCustomShift->minimum(10); selCustomShift->maximum(1200); selCustomShift->step(10); selCustomShift->value(450); selCustomShift->callback((Fl_Callback*)cb_selCustomShift); selCustomShift->align(Fl_Align(FL_ALIGN_RIGHT)); selCustomShift->when(FL_WHEN_CHANGED); o->lstep(100.0); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* selCustomShift { Fl_ListBox* o = selBaud = new Fl_ListBox(281, 103, 100, 22, _("Baud rate")); selBaud->tooltip(_("Select carrier baudrate")); selBaud->box(FL_DOWN_BOX); selBaud->color(FL_BACKGROUND2_COLOR); selBaud->selection_color(FL_BACKGROUND_COLOR); selBaud->labeltype(FL_NORMAL_LABEL); selBaud->labelfont(0); selBaud->labelsize(14); selBaud->labelcolor(FL_FOREGROUND_COLOR); selBaud->callback((Fl_Callback*)cb_selBaud); selBaud->align(Fl_Align(FL_ALIGN_RIGHT)); selBaud->when(FL_WHEN_CHANGED); o->add(szBauds); o->index(progdefaults.rtty_baud); o->labelsize(FL_NORMAL_SIZE); selBaud->end(); } // Fl_ListBox* selBaud { Fl_ListBox* o = selBits = new Fl_ListBox(281, 133, 100, 22, _("Bits per character")); selBits->tooltip(_("Select # bits / char")); selBits->box(FL_DOWN_BOX); selBits->color(FL_BACKGROUND2_COLOR); selBits->selection_color(FL_BACKGROUND_COLOR); selBits->labeltype(FL_NORMAL_LABEL); selBits->labelfont(0); selBits->labelsize(14); selBits->labelcolor(FL_FOREGROUND_COLOR); selBits->callback((Fl_Callback*)cb_selBits); selBits->align(Fl_Align(FL_ALIGN_RIGHT)); selBits->when(FL_WHEN_CHANGED); o->add(szSelBits);o->index(progdefaults.rtty_bits); o->labelsize(FL_NORMAL_SIZE); selBits->end(); } // Fl_ListBox* selBits { Fl_ListBox* o = selParity = new Fl_ListBox(281, 163, 100, 22, _("Parity")); selParity->tooltip(_("Select parity")); selParity->box(FL_DOWN_BOX); selParity->color(FL_BACKGROUND2_COLOR); selParity->selection_color(FL_BACKGROUND_COLOR); selParity->labeltype(FL_NORMAL_LABEL); selParity->labelfont(0); selParity->labelsize(14); selParity->labelcolor(FL_FOREGROUND_COLOR); selParity->callback((Fl_Callback*)cb_selParity); selParity->align(Fl_Align(FL_ALIGN_RIGHT)); selParity->when(FL_WHEN_CHANGED); o->add(szParity);o->index(progdefaults.rtty_parity); o->labelsize(FL_NORMAL_SIZE); selParity->end(); } // Fl_ListBox* selParity { Fl_ListBox* o = selStopBits = new Fl_ListBox(281, 193, 100, 22, _("Stop bits")); selStopBits->tooltip(_("Select # stop bits")); selStopBits->box(FL_DOWN_BOX); selStopBits->color(FL_BACKGROUND2_COLOR); selStopBits->selection_color(FL_BACKGROUND_COLOR); selStopBits->labeltype(FL_NORMAL_LABEL); selStopBits->labelfont(0); selStopBits->labelsize(14); selStopBits->labelcolor(FL_FOREGROUND_COLOR); selStopBits->callback((Fl_Callback*)cb_selStopBits); selStopBits->align(Fl_Align(FL_ALIGN_RIGHT)); selStopBits->when(FL_WHEN_CHANGED); o->add(szStopBits);o->index(progdefaults.rtty_stop); o->labelsize(FL_NORMAL_SIZE); selStopBits->end(); } // Fl_ListBox* selStopBits { Fl_Check_Button* o = btnAUTOCRLF = new Fl_Check_Button(532, 43, 90, 22, _("AutoCRLF")); btnAUTOCRLF->tooltip(_("Add CRLF after page width characters")); btnAUTOCRLF->down_box(FL_DOWN_BOX); btnAUTOCRLF->callback((Fl_Callback*)cb_btnAUTOCRLF); o->value(progdefaults.rtty_autocrlf); } // Fl_Check_Button* btnAUTOCRLF { Fl_Counter2* o = cntrAUTOCRLF = new Fl_Counter2(643, 43, 75, 22, _("chars")); cntrAUTOCRLF->tooltip(_("Auto CRLF line length")); cntrAUTOCRLF->type(1); cntrAUTOCRLF->box(FL_UP_BOX); cntrAUTOCRLF->color(FL_BACKGROUND_COLOR); cntrAUTOCRLF->selection_color(FL_INACTIVE_COLOR); cntrAUTOCRLF->labeltype(FL_NORMAL_LABEL); cntrAUTOCRLF->labelfont(0); cntrAUTOCRLF->labelsize(14); cntrAUTOCRLF->labelcolor(FL_FOREGROUND_COLOR); cntrAUTOCRLF->minimum(68); cntrAUTOCRLF->maximum(80); cntrAUTOCRLF->step(1); cntrAUTOCRLF->value(72); cntrAUTOCRLF->callback((Fl_Callback*)cb_cntrAUTOCRLF); cntrAUTOCRLF->align(Fl_Align(FL_ALIGN_RIGHT)); cntrAUTOCRLF->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntrAUTOCRLF { Fl_Check_Button* o = btnCRCRLF = new Fl_Check_Button(532, 73, 90, 22, _("CR-CR-LF")); btnCRCRLF->tooltip(_("Use \"cr cr lf\" for \"cr lf\"")); btnCRCRLF->down_box(FL_DOWN_BOX); btnCRCRLF->callback((Fl_Callback*)cb_btnCRCRLF); btnCRCRLF->when(FL_WHEN_RELEASE_ALWAYS); o->value(progdefaults.rtty_crcrlf); } // Fl_Check_Button* btnCRCRLF { Fl_Check_Button* o = chkUOStx = new Fl_Check_Button(532, 103, 63, 22, _("TX - unshift on space")); chkUOStx->tooltip(_("Revert to Unsifted char\'s on a space")); chkUOStx->down_box(FL_DOWN_BOX); chkUOStx->callback((Fl_Callback*)cb_chkUOStx); o->value(progdefaults.UOStx); } // Fl_Check_Button* chkUOStx { Fl_Check_Button* o = chk_shaped_rtty = new Fl_Check_Button(532, 133, 212, 22, _("Shaped Tx")); chk_shaped_rtty->tooltip(_("Use wave shaping on Tx signal")); chk_shaped_rtty->down_box(FL_DOWN_BOX); chk_shaped_rtty->value(1); chk_shaped_rtty->callback((Fl_Callback*)cb_chk_shaped_rtty); o->value(progStatus.shaped_rtty); } // Fl_Check_Button* chk_shaped_rtty { Fl_Check_Button* o = chkPseudoFSK = new Fl_Check_Button(532, 163, 212, 22, _("Pseudo-FSK - right channel")); chkPseudoFSK->tooltip(_("Create keyed square wave on right audio channel")); chkPseudoFSK->down_box(FL_DOWN_BOX); chkPseudoFSK->callback((Fl_Callback*)cb_chkPseudoFSK); o->value(progdefaults.PseudoFSK); } // Fl_Check_Button* chkPseudoFSK { Fl_Counter* o = cnt_TTY_LTRS = new Fl_Counter(532, 193, 75, 22, _("LTRS at start")); cnt_TTY_LTRS->tooltip(_("Insert NN LTRS bytes at start of each transmission")); cnt_TTY_LTRS->type(1); cnt_TTY_LTRS->minimum(0); cnt_TTY_LTRS->maximum(10); cnt_TTY_LTRS->step(1); cnt_TTY_LTRS->value(1); cnt_TTY_LTRS->callback((Fl_Callback*)cb_cnt_TTY_LTRS); cnt_TTY_LTRS->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.TTY_LTRS); } // Fl_Counter* cnt_TTY_LTRS o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Tx")); config_pages.push_back(p); tab_tree->add(_("Modem/TTY/Tx")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/TTY/FSK")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 21, 590, 165, _("DTR/RTS signal line FSK")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnFSKenabled = new Fl_Check_Button(224, 56, 90, 22, _("Enabled")); btnFSKenabled->tooltip(_("Enable FSK on serial port")); btnFSKenabled->down_box(FL_DOWN_BOX); btnFSKenabled->callback((Fl_Callback*)cb_btnFSKenabled); btnFSKenabled->when(FL_WHEN_RELEASE_ALWAYS); o->value(progdefaults.useFSK); } // Fl_Check_Button* btnFSKenabled { Fl_Check_Button* o = btnFSKshared = new Fl_Check_Button(333, 56, 90, 22, _("Shares RIGIO serial port, or uses")); btnFSKshared->tooltip(_("Share the RIGIO port")); btnFSKshared->down_box(FL_DOWN_BOX); btnFSKshared->callback((Fl_Callback*)cb_btnFSKshared); btnFSKshared->when(FL_WHEN_RELEASE_ALWAYS); o->value(progdefaults.fsk_shares_port); } // Fl_Check_Button* btnFSKshared { Fl_ComboBox* o = select_FSK_CommPort = new Fl_ComboBox(314, 88, 470, 24, _("Serial Port")); select_FSK_CommPort->tooltip(_("FSK independent serial port")); select_FSK_CommPort->box(FL_DOWN_BOX); select_FSK_CommPort->color((Fl_Color)55); select_FSK_CommPort->selection_color(FL_BACKGROUND_COLOR); select_FSK_CommPort->labeltype(FL_NORMAL_LABEL); select_FSK_CommPort->labelfont(0); select_FSK_CommPort->labelsize(14); select_FSK_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_FSK_CommPort->callback((Fl_Callback*)cb_select_FSK_CommPort); select_FSK_CommPort->align(Fl_Align(FL_ALIGN_LEFT)); select_FSK_CommPort->when(FL_WHEN_RELEASE); o->value(progdefaults.fsk_port.c_str()); select_FSK_CommPort->end(); } // Fl_ComboBox* select_FSK_CommPort { Fl_Check_Button* o = btnFSKreverse = new Fl_Check_Button(225, 120, 90, 22, _("MARK/SPACE reversed")); btnFSKreverse->tooltip(_("Reverse Mark/Space")); btnFSKreverse->down_box(FL_DOWN_BOX); btnFSKreverse->callback((Fl_Callback*)cb_btnFSKreverse); btnFSKreverse->when(FL_WHEN_RELEASE_ALWAYS); o->value(progdefaults.fsk_reverse); } // Fl_Check_Button* btnFSKreverse { Fl_Check_Button* o = btnFSKuseDTR = new Fl_Check_Button(460, 120, 90, 22, _("Use DTR")); btnFSKuseDTR->tooltip(_("Enable DTR signal line, default is RTS")); btnFSKuseDTR->down_box(FL_DOWN_BOX); btnFSKuseDTR->callback((Fl_Callback*)cb_btnFSKuseDTR); btnFSKuseDTR->when(FL_WHEN_RELEASE_ALWAYS); o->value(progdefaults.fsk_on_dtr); } // Fl_Check_Button* btnFSKuseDTR { btnFSKreset = new Fl_Button(714, 152, 70, 24, _("Reset")); btnFSKreset->tooltip(_("Restart the FSK interface\nNecessary if changes made to configuration")); btnFSKreset->callback((Fl_Callback*)cb_btnFSKreset); btnFSKreset->hide(); } // Fl_Button* btnFSKreset { Fl_Counter* o = cntr_xcvr_FSK_MARK = new Fl_Counter(225, 152, 126, 24, _("Mark")); cntr_xcvr_FSK_MARK->tooltip(_("Mark frequency in Hertz")); cntr_xcvr_FSK_MARK->minimum(500); cntr_xcvr_FSK_MARK->maximum(3000); cntr_xcvr_FSK_MARK->step(1); cntr_xcvr_FSK_MARK->value(1275); cntr_xcvr_FSK_MARK->callback((Fl_Callback*)cb_cntr_xcvr_FSK_MARK); cntr_xcvr_FSK_MARK->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.xcvr_FSK_MARK); o->lstep(10); } // Fl_Counter* cntr_xcvr_FSK_MARK { Fl_ListBox* o = sel_xcvr_FSK_shift = new Fl_ListBox(460, 152, 100, 24, _("Carrier shift")); sel_xcvr_FSK_shift->tooltip(_("Carrier shift in Hertz")); sel_xcvr_FSK_shift->box(FL_DOWN_BOX); sel_xcvr_FSK_shift->color(FL_BACKGROUND2_COLOR); sel_xcvr_FSK_shift->selection_color(FL_BACKGROUND_COLOR); sel_xcvr_FSK_shift->labeltype(FL_NORMAL_LABEL); sel_xcvr_FSK_shift->labelfont(0); sel_xcvr_FSK_shift->labelsize(14); sel_xcvr_FSK_shift->labelcolor(FL_FOREGROUND_COLOR); sel_xcvr_FSK_shift->callback((Fl_Callback*)cb_sel_xcvr_FSK_shift); sel_xcvr_FSK_shift->align(Fl_Align(FL_ALIGN_RIGHT)); sel_xcvr_FSK_shift->when(FL_WHEN_CHANGED); o->add(szShifts); o->index(progdefaults.rtty_shift); sel_xcvr_FSK_shift->end(); } // Fl_ListBox* sel_xcvr_FSK_shift { Fl_Check_Button* o = btnFSK_STOPBITS = new Fl_Check_Button(640, 120, 111, 22, _("1.5 stop bits")); btnFSK_STOPBITS->tooltip(_("Enabled - 1.5 stop bits\nDisabled - 2 stop bits")); btnFSK_STOPBITS->down_box(FL_DOWN_BOX); btnFSK_STOPBITS->callback((Fl_Callback*)cb_btnFSK_STOPBITS); btnFSK_STOPBITS->when(FL_WHEN_RELEASE_ALWAYS); o->value(progdefaults.fsk_STOPBITS); } // Fl_Check_Button* btnFSK_STOPBITS o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 193, 590, 39); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_FSK_KEYLINE_flrig = new Fl_Check_Button(225, 205, 23, 15, _("Use flrig FSK keying")); btn_FSK_KEYLINE_flrig->tooltip(_("Enable to use flrig FSK keyer")); btn_FSK_KEYLINE_flrig->down_box(FL_DOWN_BOX); btn_FSK_KEYLINE_flrig->callback((Fl_Callback*)cb_btn_FSK_KEYLINE_flrig); btn_FSK_KEYLINE_flrig->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.use_FLRIG_FSK); } // Fl_Check_Button* btn_FSK_KEYLINE_flrig o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/FSK")); config_pages.push_back(p); tab_tree->add(_("Modem/TTY/FSK")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/TTY/nanoIO")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_ComboBox* o = select_nanoIO_CommPort = new Fl_ComboBox(290, 23, 420, 25, _("Ser. Port")); select_nanoIO_CommPort->tooltip(_("nanoIO serial port")); select_nanoIO_CommPort->box(FL_DOWN_BOX); select_nanoIO_CommPort->color((Fl_Color)55); select_nanoIO_CommPort->selection_color(FL_BACKGROUND_COLOR); select_nanoIO_CommPort->labeltype(FL_NORMAL_LABEL); select_nanoIO_CommPort->labelfont(0); select_nanoIO_CommPort->labelsize(14); select_nanoIO_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_nanoIO_CommPort->callback((Fl_Callback*)cb_select_nanoIO_CommPort); select_nanoIO_CommPort->align(Fl_Align(FL_ALIGN_LEFT)); select_nanoIO_CommPort->when(FL_WHEN_RELEASE); o->value(progdefaults.nanoIO_serial_port_name.c_str()); select_nanoIO_CommPort->end(); } // Fl_ComboBox* select_nanoIO_CommPort { btn_nanoIO_connect = new Fl_Light_Button(715, 23, 80, 25, _("Connect")); btn_nanoIO_connect->tooltip(_("Connect / Disconnect from nanoIO")); btn_nanoIO_connect->callback((Fl_Callback*)cb_btn_nanoIO_connect); } // Fl_Light_Button* btn_nanoIO_connect { Fl_ListBox* o = listbox_nanoIO_serbaud2 = new Fl_ListBox(293, 57, 92, 24, _("Serial Baud")); listbox_nanoIO_serbaud2->box(FL_DOWN_BOX); listbox_nanoIO_serbaud2->color(FL_BACKGROUND2_COLOR); listbox_nanoIO_serbaud2->selection_color(FL_BACKGROUND_COLOR); listbox_nanoIO_serbaud2->labeltype(FL_NORMAL_LABEL); listbox_nanoIO_serbaud2->labelfont(0); listbox_nanoIO_serbaud2->labelsize(14); listbox_nanoIO_serbaud2->labelcolor(FL_FOREGROUND_COLOR); listbox_nanoIO_serbaud2->callback((Fl_Callback*)cb_listbox_nanoIO_serbaud2); listbox_nanoIO_serbaud2->align(Fl_Align(FL_ALIGN_LEFT)); listbox_nanoIO_serbaud2->when(FL_WHEN_RELEASE); o->add("1200|4800|9600|19200|38400|57600|115200"); o->index(progdefaults.nanoIO_serbaud); listbox_nanoIO_serbaud2->end(); } // Fl_ListBox* listbox_nanoIO_serbaud2 { FTextView* o = txt_nano_io = new FTextView(202, 126, 596, 220, _("USB serial I/O")); txt_nano_io->box(FL_DOWN_FRAME); txt_nano_io->color(FL_BACKGROUND2_COLOR); txt_nano_io->selection_color(FL_SELECTION_COLOR); txt_nano_io->labeltype(FL_NORMAL_LABEL); txt_nano_io->labelfont(0); txt_nano_io->labelsize(14); txt_nano_io->labelcolor(FL_FOREGROUND_COLOR); txt_nano_io->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txt_nano_io->when(FL_WHEN_RELEASE); o->setFont(progdefaults.RxFontnbr); o->setFontSize(12); } // FTextView* txt_nano_io { btn_nanofsk_save = new Fl_Button(715, 90, 80, 25, _("Save")); btn_nanofsk_save->tooltip(_("Write state of nanoIO to Arduino EEPROM")); btn_nanofsk_save->callback((Fl_Callback*)cb_btn_nanofsk_save); } // Fl_Button* btn_nanofsk_save { btn_nanofsk_query = new Fl_Button(630, 57, 80, 25, _("Status")); btn_nanofsk_query->tooltip(_("Query state of nanoIO")); btn_nanofsk_query->callback((Fl_Callback*)cb_btn_nanofsk_query); } // Fl_Button* btn_nanofsk_query { Fl_Check_Button* o = chk_nanoIO_polarity = new Fl_Check_Button(323, 90, 53, 24, _("MARK polarity")); chk_nanoIO_polarity->tooltip(_("Set - mark logical HIGH\nRead from nanoIO")); chk_nanoIO_polarity->down_box(FL_DOWN_BOX); chk_nanoIO_polarity->callback((Fl_Callback*)cb_chk_nanoIO_polarity); o->value(progdefaults.nanoIO_polarity); } // Fl_Check_Button* chk_nanoIO_polarity { Fl_ListBox* o = sel_nanoIO_baud = new Fl_ListBox(447, 90, 84, 25, _("TTY Baud")); sel_nanoIO_baud->tooltip(_("nanoIO - TTY baud")); sel_nanoIO_baud->box(FL_DOWN_BOX); sel_nanoIO_baud->color(FL_BACKGROUND2_COLOR); sel_nanoIO_baud->selection_color(FL_BACKGROUND_COLOR); sel_nanoIO_baud->labeltype(FL_NORMAL_LABEL); sel_nanoIO_baud->labelfont(0); sel_nanoIO_baud->labelsize(14); sel_nanoIO_baud->labelcolor(FL_FOREGROUND_COLOR); sel_nanoIO_baud->callback((Fl_Callback*)cb_sel_nanoIO_baud); sel_nanoIO_baud->align(Fl_Align(FL_ALIGN_RIGHT)); sel_nanoIO_baud->when(FL_WHEN_CHANGED); o->add("45.45|50.0|75.0|100.0"); o->index(progdefaults.nanoIO_baud); o->labelsize(FL_NORMAL_SIZE); sel_nanoIO_baud->end(); } // Fl_ListBox* sel_nanoIO_baud { grp_nanoio_debug = new Fl_Group(202, 126, 596, 220, _("Debug Output")); grp_nanoio_debug->box(FL_ENGRAVED_FRAME); grp_nanoio_debug->align(Fl_Align(FL_ALIGN_TOP_LEFT)); grp_nanoio_debug->hide(); { brws_nanoio_sent = new Fl_Browser(202, 126, 298, 190); brws_nanoio_sent->align(Fl_Align(FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE)); } // Fl_Browser* brws_nanoio_sent { brws_nanoio_rcvd = new Fl_Browser(500, 126, 298, 190); brws_nanoio_rcvd->align(Fl_Align(FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE)); } // Fl_Browser* brws_nanoio_rcvd { btn_nanoio_clear_sent = new Fl_Button(309, 319, 85, 20, _("Clear Sent")); btn_nanoio_clear_sent->callback((Fl_Callback*)cb_btn_nanoio_clear_sent); } // Fl_Button* btn_nanoio_clear_sent { btn_nanoio_clear_both = new Fl_Button(457, 319, 85, 20, _("Clear Both")); btn_nanoio_clear_both->callback((Fl_Callback*)cb_btn_nanoio_clear_both); } // Fl_Button* btn_nanoio_clear_both { btn_nanoio_clear_rcvd = new Fl_Button(605, 319, 85, 20, _("Clear Rcvd")); btn_nanoio_clear_rcvd->callback((Fl_Callback*)cb_btn_nanoio_clear_rcvd); } // Fl_Button* btn_nanoio_clear_rcvd grp_nanoio_debug->end(); Fl_Group::current()->resizable(grp_nanoio_debug); } // Fl_Group* grp_nanoio_debug { btn_nanoio_debug = new Fl_Light_Button(630, 90, 80, 25, _("Debug")); btn_nanoio_debug->callback((Fl_Callback*)cb_btn_nanoio_debug); } // Fl_Light_Button* btn_nanoio_debug { chk_nanoIO_FSK_io = new Fl_Check_Button(715, 57, 70, 24, _("TTY i/o")); chk_nanoIO_FSK_io->tooltip(_("Enable TTY operation")); chk_nanoIO_FSK_io->down_box(FL_DOWN_BOX); chk_nanoIO_FSK_io->callback((Fl_Callback*)cb_chk_nanoIO_FSK_io); } // Fl_Check_Button* chk_nanoIO_FSK_io CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/nanoIO")); config_pages.push_back(p); tab_tree->add(_("Modem/TTY/nanoIO")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/TTY/Navigator")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(206, 36, 591, 70, _("FSK Interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ComboBox* o = select_USN_FSK_port = new Fl_ComboBox(249, 65, 455, 23, _("Port")); select_USN_FSK_port->tooltip(_("Navigator serial port")); select_USN_FSK_port->box(FL_DOWN_BOX); select_USN_FSK_port->color((Fl_Color)55); select_USN_FSK_port->selection_color(FL_BACKGROUND_COLOR); select_USN_FSK_port->labeltype(FL_NORMAL_LABEL); select_USN_FSK_port->labelfont(0); select_USN_FSK_port->labelsize(14); select_USN_FSK_port->labelcolor(FL_FOREGROUND_COLOR); select_USN_FSK_port->callback((Fl_Callback*)cb_select_USN_FSK_port); select_USN_FSK_port->align(Fl_Align(FL_ALIGN_LEFT)); select_USN_FSK_port->when(FL_WHEN_RELEASE); o->value(progdefaults.Nav_FSK_port.c_str()); select_USN_FSK_port->end(); } // Fl_ComboBox* select_USN_FSK_port { btn_Nav_connect = new Fl_Light_Button(711, 65, 80, 23, _("FSK")); btn_Nav_connect->tooltip(_("Connect / Disconnect from Nav FSK port")); btn_Nav_connect->callback((Fl_Callback*)cb_btn_Nav_connect); } // Fl_Light_Button* btn_Nav_connect o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(206, 107, 591, 239, _("Configuration Interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ComboBox* o = select_Nav_config_port = new Fl_ComboBox(250, 137, 455, 23, _("Port")); select_Nav_config_port->tooltip(_("Navigator configuration port")); select_Nav_config_port->box(FL_DOWN_BOX); select_Nav_config_port->color((Fl_Color)55); select_Nav_config_port->selection_color(FL_BACKGROUND_COLOR); select_Nav_config_port->labeltype(FL_NORMAL_LABEL); select_Nav_config_port->labelfont(0); select_Nav_config_port->labelsize(14); select_Nav_config_port->labelcolor(FL_FOREGROUND_COLOR); select_Nav_config_port->callback((Fl_Callback*)cb_select_Nav_config_port); select_Nav_config_port->align(Fl_Align(FL_ALIGN_LEFT)); select_Nav_config_port->when(FL_WHEN_RELEASE); o->value(progdefaults.Nav_config_port.c_str()); select_Nav_config_port->end(); } // Fl_ComboBox* select_Nav_config_port { Fl_ListBox* o = sel_Nav_ch1 = new Fl_ListBox(378, 164, 80, 23, _("Channel 1 Attenuator")); sel_Nav_ch1->tooltip(_("Nav Channel 1 attenuator")); sel_Nav_ch1->box(FL_DOWN_BOX); sel_Nav_ch1->color(FL_BACKGROUND2_COLOR); sel_Nav_ch1->selection_color(FL_BACKGROUND_COLOR); sel_Nav_ch1->labeltype(FL_NORMAL_LABEL); sel_Nav_ch1->labelfont(0); sel_Nav_ch1->labelsize(14); sel_Nav_ch1->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_ch1->callback((Fl_Callback*)cb_sel_Nav_ch1); sel_Nav_ch1->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_ch1->when(FL_WHEN_CHANGED); o->add("15 db|Normal"); o->index(progdefaults.Nav_channel_1_att); sel_Nav_ch1->end(); } // Fl_ListBox* sel_Nav_ch1 { Fl_ListBox* o = sel_Nav_ch2 = new Fl_ListBox(378, 193, 80, 23, _("Channel 2 attenuator")); sel_Nav_ch2->tooltip(_("NavChannel 2 Attenuator")); sel_Nav_ch2->box(FL_DOWN_BOX); sel_Nav_ch2->color(FL_BACKGROUND2_COLOR); sel_Nav_ch2->selection_color(FL_BACKGROUND_COLOR); sel_Nav_ch2->labeltype(FL_NORMAL_LABEL); sel_Nav_ch2->labelfont(0); sel_Nav_ch2->labelsize(14); sel_Nav_ch2->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_ch2->callback((Fl_Callback*)cb_sel_Nav_ch2); sel_Nav_ch2->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_ch2->when(FL_WHEN_CHANGED); o->add("15 db|Normal"); o->index(progdefaults.Nav_channel_2_att); sel_Nav_ch2->end(); } // Fl_ListBox* sel_Nav_ch2 { Fl_ListBox* o = sel_Nav_rf_att = new Fl_ListBox(378, 223, 80, 23, _("RF attenuator")); sel_Nav_rf_att->tooltip(_("NavRF Attenuator")); sel_Nav_rf_att->box(FL_DOWN_BOX); sel_Nav_rf_att->color(FL_BACKGROUND2_COLOR); sel_Nav_rf_att->selection_color(FL_BACKGROUND_COLOR); sel_Nav_rf_att->labeltype(FL_NORMAL_LABEL); sel_Nav_rf_att->labelfont(0); sel_Nav_rf_att->labelsize(14); sel_Nav_rf_att->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_rf_att->callback((Fl_Callback*)cb_sel_Nav_rf_att); sel_Nav_rf_att->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_rf_att->when(FL_WHEN_CHANGED); o->add("20 db|Normal"); o->index(progdefaults.Nav_rf_att); sel_Nav_rf_att->end(); } // Fl_ListBox* sel_Nav_rf_att { Fl_ListBox* o = sel_Nav_wk_ptt = new Fl_ListBox(378, 253, 80, 23, _("WinKey PTT")); sel_Nav_wk_ptt->tooltip(_("NavWinkey PTT")); sel_Nav_wk_ptt->box(FL_DOWN_BOX); sel_Nav_wk_ptt->color(FL_BACKGROUND2_COLOR); sel_Nav_wk_ptt->selection_color(FL_BACKGROUND_COLOR); sel_Nav_wk_ptt->labeltype(FL_NORMAL_LABEL); sel_Nav_wk_ptt->labelfont(0); sel_Nav_wk_ptt->labelsize(14); sel_Nav_wk_ptt->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_wk_ptt->callback((Fl_Callback*)cb_sel_Nav_wk_ptt); sel_Nav_wk_ptt->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_wk_ptt->when(FL_WHEN_CHANGED); o->index(progdefaults.Nav_wk_ptt); o->add("On|Off"); sel_Nav_wk_ptt->end(); } // Fl_ListBox* sel_Nav_wk_ptt { Fl_ListBox* o = sel_Nav_LED = new Fl_ListBox(378, 283, 80, 23, _("LED brightness")); sel_Nav_LED->tooltip(_("NavLED brightness")); sel_Nav_LED->box(FL_DOWN_BOX); sel_Nav_LED->color(FL_BACKGROUND2_COLOR); sel_Nav_LED->selection_color(FL_BACKGROUND_COLOR); sel_Nav_LED->labeltype(FL_NORMAL_LABEL); sel_Nav_LED->labelfont(0); sel_Nav_LED->labelsize(14); sel_Nav_LED->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_LED->callback((Fl_Callback*)cb_sel_Nav_LED); sel_Nav_LED->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_LED->when(FL_WHEN_CHANGED); o->index(progdefaults.Nav_led); o->add("Dim|Normal"); sel_Nav_LED->end(); } // Fl_ListBox* sel_Nav_LED { Fl_ListBox* o = sel_Nav_CAT_LED = new Fl_ListBox(378, 313, 80, 23, _("CAT LED state")); sel_Nav_CAT_LED->tooltip(_("NavCAT state LED")); sel_Nav_CAT_LED->box(FL_DOWN_BOX); sel_Nav_CAT_LED->color(FL_BACKGROUND2_COLOR); sel_Nav_CAT_LED->selection_color(FL_BACKGROUND_COLOR); sel_Nav_CAT_LED->labeltype(FL_NORMAL_LABEL); sel_Nav_CAT_LED->labelfont(0); sel_Nav_CAT_LED->labelsize(14); sel_Nav_CAT_LED->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_CAT_LED->callback((Fl_Callback*)cb_sel_Nav_CAT_LED); sel_Nav_CAT_LED->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_CAT_LED->when(FL_WHEN_CHANGED); o->index(progdefaults.Nav_cat_led); o->add("Steady|Polling"); sel_Nav_CAT_LED->end(); } // Fl_ListBox* sel_Nav_CAT_LED { Fl_ListBox* o = sel_Nav_FSK_baud = new Fl_ListBox(586, 164, 80, 23, _("Baud rate")); sel_Nav_FSK_baud->tooltip(_("Nav FSK baud rate")); sel_Nav_FSK_baud->box(FL_DOWN_BOX); sel_Nav_FSK_baud->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_baud->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_baud->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_baud->labelfont(0); sel_Nav_FSK_baud->labelsize(14); sel_Nav_FSK_baud->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_baud->callback((Fl_Callback*)cb_sel_Nav_FSK_baud); sel_Nav_FSK_baud->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_baud->when(FL_WHEN_CHANGED); o->add("45.45|75|100"); o->index(progdefaults.Nav_FSK_baud); sel_Nav_FSK_baud->end(); } // Fl_ListBox* sel_Nav_FSK_baud { Fl_ListBox* o = sel_Nav_FSK_stopbits = new Fl_ListBox(585, 193, 80, 23, _("Stop bits")); sel_Nav_FSK_stopbits->tooltip(_("Nav FSK Stop bits")); sel_Nav_FSK_stopbits->box(FL_DOWN_BOX); sel_Nav_FSK_stopbits->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_stopbits->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_stopbits->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_stopbits->labelfont(0); sel_Nav_FSK_stopbits->labelsize(14); sel_Nav_FSK_stopbits->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_stopbits->callback((Fl_Callback*)cb_sel_Nav_FSK_stopbits); sel_Nav_FSK_stopbits->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_stopbits->when(FL_WHEN_CHANGED); o->add("1|1.5|2"); o->index(progdefaults.Nav_FSK_stopbits); sel_Nav_FSK_stopbits->end(); } // Fl_ListBox* sel_Nav_FSK_stopbits { Fl_ListBox* o = sel_Nav_FSK_polarity = new Fl_ListBox(585, 223, 80, 23, _("Mark Polarity")); sel_Nav_FSK_polarity->tooltip(_("Nav FSK MARK Polarity")); sel_Nav_FSK_polarity->box(FL_DOWN_BOX); sel_Nav_FSK_polarity->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_polarity->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_polarity->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_polarity->labelfont(0); sel_Nav_FSK_polarity->labelsize(14); sel_Nav_FSK_polarity->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_polarity->callback((Fl_Callback*)cb_sel_Nav_FSK_polarity); sel_Nav_FSK_polarity->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_polarity->when(FL_WHEN_CHANGED); o->add("Normal|Reverse"); o->index(progdefaults.Nav_FSK_polarity); sel_Nav_FSK_polarity->end(); } // Fl_ListBox* sel_Nav_FSK_polarity { Fl_ListBox* o = sel_Nav_FSK_sidetone = new Fl_ListBox(585, 253, 80, 23, _("Side tone")); sel_Nav_FSK_sidetone->tooltip(_("Nav FSK side tone")); sel_Nav_FSK_sidetone->box(FL_DOWN_BOX); sel_Nav_FSK_sidetone->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_sidetone->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_sidetone->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_sidetone->labelfont(0); sel_Nav_FSK_sidetone->labelsize(14); sel_Nav_FSK_sidetone->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_sidetone->callback((Fl_Callback*)cb_sel_Nav_FSK_sidetone); sel_Nav_FSK_sidetone->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_sidetone->when(FL_WHEN_CHANGED); o->add("On|Off"); o->index(progdefaults.Nav_FSK_sidetone); sel_Nav_FSK_sidetone->end(); } // Fl_ListBox* sel_Nav_FSK_sidetone { Fl_ListBox* o = sel_Nav_FSK_ptt = new Fl_ListBox(585, 283, 80, 23, _("FSK PTT")); sel_Nav_FSK_ptt->tooltip(_("Nav FSK PTT - should always be on")); sel_Nav_FSK_ptt->box(FL_DOWN_BOX); sel_Nav_FSK_ptt->color(FL_BACKGROUND2_COLOR); sel_Nav_FSK_ptt->selection_color(FL_BACKGROUND_COLOR); sel_Nav_FSK_ptt->labeltype(FL_NORMAL_LABEL); sel_Nav_FSK_ptt->labelfont(0); sel_Nav_FSK_ptt->labelsize(14); sel_Nav_FSK_ptt->labelcolor(FL_FOREGROUND_COLOR); sel_Nav_FSK_ptt->callback((Fl_Callback*)cb_sel_Nav_FSK_ptt); sel_Nav_FSK_ptt->align(Fl_Align(FL_ALIGN_LEFT)); sel_Nav_FSK_ptt->when(FL_WHEN_CHANGED); o->add("On|Off"); o->index(progdefaults.Nav_FSK_ptt); sel_Nav_FSK_ptt->end(); } // Fl_ListBox* sel_Nav_FSK_ptt { btn_Nav_config = new Fl_Light_Button(710, 137, 80, 23, _("Config")); btn_Nav_config->tooltip(_("Connect / Disconnect from Nav Config port")); btn_Nav_config->callback((Fl_Callback*)cb_btn_Nav_config); } // Fl_Light_Button* btn_Nav_config o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Navigator")); config_pages.push_back(p); tab_tree->add(_("Modem/TTY/Navigator")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/TTY/Synop")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Check_Button* o = btnSynopAdifDecoding = new Fl_Check_Button(406, 71, 127, 24, _("SYNOP to ADIF")); btnSynopAdifDecoding->tooltip(_("Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file")); btnSynopAdifDecoding->down_box(FL_DOWN_BOX); btnSynopAdifDecoding->callback((Fl_Callback*)cb_btnSynopAdifDecoding); btnSynopAdifDecoding->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->value(progdefaults.SynopAdifDecoding); } // Fl_Check_Button* btnSynopAdifDecoding { Fl_Check_Button* o = btnSynopKmlDecoding = new Fl_Check_Button(406, 112, 120, 24, _("SYNOP to KML")); btnSynopKmlDecoding->tooltip(_("Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Goog\ le Earth)")); btnSynopKmlDecoding->down_box(FL_DOWN_BOX); btnSynopKmlDecoding->callback((Fl_Callback*)cb_btnSynopKmlDecoding); btnSynopKmlDecoding->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->value(progdefaults.SynopKmlDecoding); } // Fl_Check_Button* btnSynopKmlDecoding { Fl_Check_Button* o = btnSynopInterleaved = new Fl_Check_Button(406, 154, 211, 24, _("Interleave SYNOP and text")); btnSynopInterleaved->tooltip(_("Interleave text with decoded SYNOP messages, or replacement.")); btnSynopInterleaved->down_box(FL_DOWN_BOX); btnSynopInterleaved->callback((Fl_Callback*)cb_btnSynopInterleaved); btnSynopInterleaved->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->value(progdefaults.SynopInterleaved); } // Fl_Check_Button* btnSynopInterleaved CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Synop")); config_pages.push_back(p); tab_tree->add(_("Modem/TTY/Synop")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/TTY/Winkeyer 3")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(206, 43, 591, 72, _("Serial Interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ComboBox* o = select_WKFSK_CommPort = new Fl_ComboBox(274, 71, 405, 23, _("Port")); select_WKFSK_CommPort->tooltip(_("Xcvr serial port")); select_WKFSK_CommPort->box(FL_DOWN_BOX); select_WKFSK_CommPort->color((Fl_Color)55); select_WKFSK_CommPort->selection_color(FL_BACKGROUND_COLOR); select_WKFSK_CommPort->labeltype(FL_NORMAL_LABEL); select_WKFSK_CommPort->labelfont(0); select_WKFSK_CommPort->labelsize(14); select_WKFSK_CommPort->labelcolor(FL_FOREGROUND_COLOR); select_WKFSK_CommPort->callback((Fl_Callback*)cb_select_WKFSK_CommPort); select_WKFSK_CommPort->align(Fl_Align(FL_ALIGN_LEFT)); select_WKFSK_CommPort->when(FL_WHEN_RELEASE); o->value(progStatus.WK_serial_port_name.c_str()); select_WKFSK_CommPort->end(); } // Fl_ComboBox* select_WKFSK_CommPort { Fl_Light_Button* o = btn_WKFSK_connect = new Fl_Light_Button(705, 71, 80, 23, _("Connect")); btn_WKFSK_connect->tooltip(_("Connect / Disconnect from WinKeyer")); btn_WKFSK_connect->callback((Fl_Callback*)cb_btn_WKFSK_connect); o->value(progStatus.WK_online); } // Fl_Light_Button* btn_WKFSK_connect o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(206, 116, 591, 231, _("Configuration Interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = sel_WKFSK_baud = new Fl_ListBox(391, 148, 78, 23, _("Baud rate")); sel_WKFSK_baud->tooltip(_("Nav FSK baud rate")); sel_WKFSK_baud->box(FL_DOWN_BOX); sel_WKFSK_baud->color(FL_BACKGROUND2_COLOR); sel_WKFSK_baud->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_baud->labeltype(FL_NORMAL_LABEL); sel_WKFSK_baud->labelfont(0); sel_WKFSK_baud->labelsize(14); sel_WKFSK_baud->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_baud->callback((Fl_Callback*)cb_sel_WKFSK_baud); sel_WKFSK_baud->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_baud->when(FL_WHEN_CHANGED); o->add("45.45|50|75|100"); o->index(progStatus.WKFSK_baud); sel_WKFSK_baud->end(); } // Fl_ListBox* sel_WKFSK_baud { Fl_ListBox* o = sel_WKFSK_stopbits = new Fl_ListBox(391, 177, 78, 23, _("Stop bits")); sel_WKFSK_stopbits->tooltip(_("Nav FSK Stop bits")); sel_WKFSK_stopbits->box(FL_DOWN_BOX); sel_WKFSK_stopbits->color(FL_BACKGROUND2_COLOR); sel_WKFSK_stopbits->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_stopbits->labeltype(FL_NORMAL_LABEL); sel_WKFSK_stopbits->labelfont(0); sel_WKFSK_stopbits->labelsize(14); sel_WKFSK_stopbits->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_stopbits->callback((Fl_Callback*)cb_sel_WKFSK_stopbits); sel_WKFSK_stopbits->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_stopbits->when(FL_WHEN_CHANGED); o->add("2|1.5"); o->index(progStatus.WKFSK_stopbits); sel_WKFSK_stopbits->end(); } // Fl_ListBox* sel_WKFSK_stopbits { Fl_ListBox* o = sel_WKFSK_ptt = new Fl_ListBox(391, 206, 78, 23, _("FSK port")); sel_WKFSK_ptt->tooltip(_("NavWinkey PTT")); sel_WKFSK_ptt->box(FL_DOWN_BOX); sel_WKFSK_ptt->color(FL_BACKGROUND2_COLOR); sel_WKFSK_ptt->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_ptt->labeltype(FL_NORMAL_LABEL); sel_WKFSK_ptt->labelfont(0); sel_WKFSK_ptt->labelsize(14); sel_WKFSK_ptt->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_ptt->callback((Fl_Callback*)cb_sel_WKFSK_ptt); sel_WKFSK_ptt->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_ptt->when(FL_WHEN_CHANGED); o->add("On PTT|On KEY"); o->index(progStatus.WKFSK_ptt); sel_WKFSK_ptt->end(); } // Fl_ListBox* sel_WKFSK_ptt { Fl_ListBox* o = sel_WKFSK_polarity = new Fl_ListBox(391, 236, 78, 23, _("Mark Polarity")); sel_WKFSK_polarity->tooltip(_("Nav FSK MARK Polarity")); sel_WKFSK_polarity->box(FL_DOWN_BOX); sel_WKFSK_polarity->color(FL_BACKGROUND2_COLOR); sel_WKFSK_polarity->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_polarity->labeltype(FL_NORMAL_LABEL); sel_WKFSK_polarity->labelfont(0); sel_WKFSK_polarity->labelsize(14); sel_WKFSK_polarity->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_polarity->callback((Fl_Callback*)cb_sel_WKFSK_polarity); sel_WKFSK_polarity->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_polarity->when(FL_WHEN_CHANGED); o->add("Normal|Reverse"); o->index(progStatus.WKFSK_polarity); sel_WKFSK_polarity->end(); } // Fl_ListBox* sel_WKFSK_polarity { Fl_ListBox* o = sel_WKFSK_sidetone = new Fl_ListBox(391, 265, 78, 23, _("Sidetone")); sel_WKFSK_sidetone->tooltip(_("Nav FSK side tone")); sel_WKFSK_sidetone->box(FL_DOWN_BOX); sel_WKFSK_sidetone->color(FL_BACKGROUND2_COLOR); sel_WKFSK_sidetone->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_sidetone->labeltype(FL_NORMAL_LABEL); sel_WKFSK_sidetone->labelfont(0); sel_WKFSK_sidetone->labelsize(14); sel_WKFSK_sidetone->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_sidetone->callback((Fl_Callback*)cb_sel_WKFSK_sidetone); sel_WKFSK_sidetone->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_sidetone->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_sidetone); sel_WKFSK_sidetone->end(); } // Fl_ListBox* sel_WKFSK_sidetone { Fl_ListBox* o = sel_WKFSK_auto_crlf = new Fl_ListBox(391, 295, 78, 23, _("Auto CRLF")); sel_WKFSK_auto_crlf->tooltip(_("Nav FSK side tone")); sel_WKFSK_auto_crlf->box(FL_DOWN_BOX); sel_WKFSK_auto_crlf->color(FL_BACKGROUND2_COLOR); sel_WKFSK_auto_crlf->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_auto_crlf->labeltype(FL_NORMAL_LABEL); sel_WKFSK_auto_crlf->labelfont(0); sel_WKFSK_auto_crlf->labelsize(14); sel_WKFSK_auto_crlf->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_auto_crlf->callback((Fl_Callback*)cb_sel_WKFSK_auto_crlf); sel_WKFSK_auto_crlf->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_auto_crlf->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_auto_crlf); sel_WKFSK_auto_crlf->end(); } // Fl_ListBox* sel_WKFSK_auto_crlf { Fl_ListBox* o = sel_WKFSK_diddle = new Fl_ListBox(581, 148, 78, 23, _("Diddle")); sel_WKFSK_diddle->tooltip(_("Diddle On/OFF")); sel_WKFSK_diddle->box(FL_DOWN_BOX); sel_WKFSK_diddle->color(FL_BACKGROUND2_COLOR); sel_WKFSK_diddle->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_diddle->labeltype(FL_NORMAL_LABEL); sel_WKFSK_diddle->labelfont(0); sel_WKFSK_diddle->labelsize(14); sel_WKFSK_diddle->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_diddle->callback((Fl_Callback*)cb_sel_WKFSK_diddle); sel_WKFSK_diddle->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_diddle->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_diddle); sel_WKFSK_diddle->end(); } // Fl_ListBox* sel_WKFSK_diddle { Fl_ListBox* o = sel_WKFSK_diddle_char = new Fl_ListBox(581, 177, 78, 23, _("Diddle char")); sel_WKFSK_diddle_char->tooltip(_("Diddle character")); sel_WKFSK_diddle_char->box(FL_DOWN_BOX); sel_WKFSK_diddle_char->color(FL_BACKGROUND2_COLOR); sel_WKFSK_diddle_char->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_diddle_char->labeltype(FL_NORMAL_LABEL); sel_WKFSK_diddle_char->labelfont(0); sel_WKFSK_diddle_char->labelsize(14); sel_WKFSK_diddle_char->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_diddle_char->callback((Fl_Callback*)cb_sel_WKFSK_diddle_char); sel_WKFSK_diddle_char->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_diddle_char->when(FL_WHEN_CHANGED); o->add("BLANK|LTRS"); o->index(progStatus.WKFSK_diddle_char); sel_WKFSK_diddle_char->end(); } // Fl_ListBox* sel_WKFSK_diddle_char { Fl_ListBox* o = sel_WKFSK_usos = new Fl_ListBox(581, 206, 78, 23, _("USOS")); sel_WKFSK_usos->tooltip(_("Unshift on space")); sel_WKFSK_usos->box(FL_DOWN_BOX); sel_WKFSK_usos->color(FL_BACKGROUND2_COLOR); sel_WKFSK_usos->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_usos->labeltype(FL_NORMAL_LABEL); sel_WKFSK_usos->labelfont(0); sel_WKFSK_usos->labelsize(14); sel_WKFSK_usos->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_usos->callback((Fl_Callback*)cb_sel_WKFSK_usos); sel_WKFSK_usos->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_usos->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_usos); sel_WKFSK_usos->end(); } // Fl_ListBox* sel_WKFSK_usos { Fl_ListBox* o = sel_WKFSK_monitor = new Fl_ListBox(581, 236, 78, 23, _("Echo")); sel_WKFSK_monitor->tooltip(_("Unshift on space")); sel_WKFSK_monitor->box(FL_DOWN_BOX); sel_WKFSK_monitor->color(FL_BACKGROUND2_COLOR); sel_WKFSK_monitor->selection_color(FL_BACKGROUND_COLOR); sel_WKFSK_monitor->labeltype(FL_NORMAL_LABEL); sel_WKFSK_monitor->labelfont(0); sel_WKFSK_monitor->labelsize(14); sel_WKFSK_monitor->labelcolor(FL_FOREGROUND_COLOR); sel_WKFSK_monitor->callback((Fl_Callback*)cb_sel_WKFSK_monitor); sel_WKFSK_monitor->align(Fl_Align(FL_ALIGN_LEFT)); sel_WKFSK_monitor->when(FL_WHEN_CHANGED); o->add("Off|On"); o->index(progStatus.WKFSK_monitor); sel_WKFSK_monitor->end(); } // Fl_ListBox* sel_WKFSK_monitor o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/TTY/Winkeyer 3")); config_pages.push_back(p); tab_tree->add(_("Modem/TTY/Winkeyer 3")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/Thor")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { txtTHORSecondary = new Fl_Input2(245, 51, 430, 40, _("Secondary Text")); txtTHORSecondary->tooltip(_("Text to send during keyboard idle times")); txtTHORSecondary->type(4); txtTHORSecondary->box(FL_DOWN_BOX); txtTHORSecondary->color(FL_BACKGROUND2_COLOR); txtTHORSecondary->selection_color(FL_SELECTION_COLOR); txtTHORSecondary->labeltype(FL_NORMAL_LABEL); txtTHORSecondary->labelfont(0); txtTHORSecondary->labelsize(14); txtTHORSecondary->labelcolor(FL_FOREGROUND_COLOR); txtTHORSecondary->callback((Fl_Callback*)cb_txtTHORSecondary); txtTHORSecondary->align(Fl_Align(FL_ALIGN_TOP_LEFT)); txtTHORSecondary->when(FL_WHEN_CHANGED); txtTHORSecondary->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* txtTHORSecondary { Fl_Check_Button* o = valTHOR_FILTER = new Fl_Check_Button(245, 105, 80, 20, _("Filtering")); valTHOR_FILTER->tooltip(_("Enable DSP prior to decoder")); valTHOR_FILTER->down_box(FL_DOWN_BOX); valTHOR_FILTER->value(1); valTHOR_FILTER->callback((Fl_Callback*)cb_valTHOR_FILTER); o->value(progdefaults.THOR_FILTER); } // Fl_Check_Button* valTHOR_FILTER { Fl_Counter2* o = valTHOR_BW = new Fl_Counter2(390, 105, 63, 20, _("Filter bandwidth factor")); valTHOR_BW->tooltip(_("Filter bandwidth relative to signal width")); valTHOR_BW->type(1); valTHOR_BW->box(FL_UP_BOX); valTHOR_BW->color(FL_BACKGROUND_COLOR); valTHOR_BW->selection_color(FL_INACTIVE_COLOR); valTHOR_BW->labeltype(FL_NORMAL_LABEL); valTHOR_BW->labelfont(0); valTHOR_BW->labelsize(14); valTHOR_BW->labelcolor(FL_FOREGROUND_COLOR); valTHOR_BW->minimum(1); valTHOR_BW->maximum(2); valTHOR_BW->value(1.5); valTHOR_BW->callback((Fl_Callback*)cb_valTHOR_BW); valTHOR_BW->align(Fl_Align(FL_ALIGN_RIGHT)); valTHOR_BW->when(FL_WHEN_CHANGED); o->value(progdefaults.THOR_BW); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valTHOR_BW { Fl_Value_Slider2* o = valThorCWI = new Fl_Value_Slider2(245, 158, 260, 20, _("CWI threshold")); valThorCWI->tooltip(_("CWI detection and suppression")); valThorCWI->type(1); valThorCWI->box(FL_DOWN_BOX); valThorCWI->color(FL_BACKGROUND_COLOR); valThorCWI->selection_color(FL_BACKGROUND_COLOR); valThorCWI->labeltype(FL_NORMAL_LABEL); valThorCWI->labelfont(0); valThorCWI->labelsize(14); valThorCWI->labelcolor(FL_FOREGROUND_COLOR); valThorCWI->textsize(14); valThorCWI->callback((Fl_Callback*)cb_valThorCWI); valThorCWI->align(Fl_Align(FL_ALIGN_TOP)); valThorCWI->when(FL_WHEN_CHANGED); o->value(progdefaults.ThorCWI); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* valThorCWI { Fl_Check_Button* o = valTHOR_PREAMBLE = new Fl_Check_Button(245, 200, 200, 20, _("Preamble Detection")); valTHOR_PREAMBLE->tooltip(_("Detect the THOR preamble\nClear the Rx pipeline")); valTHOR_PREAMBLE->down_box(FL_DOWN_BOX); valTHOR_PREAMBLE->callback((Fl_Callback*)cb_valTHOR_PREAMBLE); o->value(progdefaults.THOR_PREAMBLE); } // Fl_Check_Button* valTHOR_PREAMBLE { Fl_Check_Button* o = valTHOR_SOFTSYMBOLS = new Fl_Check_Button(245, 230, 190, 20, _("Soft-symbol decoding")); valTHOR_SOFTSYMBOLS->tooltip(_("Use soft-decision decoding for symbol detection\nAssists soft-bit decoding")); valTHOR_SOFTSYMBOLS->down_box(FL_DOWN_BOX); valTHOR_SOFTSYMBOLS->callback((Fl_Callback*)cb_valTHOR_SOFTSYMBOLS); o->value(progdefaults.THOR_SOFTSYMBOLS); } // Fl_Check_Button* valTHOR_SOFTSYMBOLS { Fl_Check_Button* o = valTHOR_SOFTBITS = new Fl_Check_Button(245, 260, 170, 20, _("Soft-bit decoding")); valTHOR_SOFTBITS->tooltip(_("Use soft-bit viterbi decoding for better Forward Error Correction\nWorks best\ with soft-symbol decoding enabled")); valTHOR_SOFTBITS->down_box(FL_DOWN_BOX); valTHOR_SOFTBITS->callback((Fl_Callback*)cb_valTHOR_SOFTBITS); o->value(progdefaults.THOR_SOFTBITS); } // Fl_Check_Button* valTHOR_SOFTBITS { Fl_Counter2* o = valTHOR_PATHS = new Fl_Counter2(255, 314, 75, 21, _("Paths (hidden)")); valTHOR_PATHS->type(1); valTHOR_PATHS->box(FL_UP_BOX); valTHOR_PATHS->color(FL_BACKGROUND_COLOR); valTHOR_PATHS->selection_color(FL_INACTIVE_COLOR); valTHOR_PATHS->labeltype(FL_NORMAL_LABEL); valTHOR_PATHS->labelfont(0); valTHOR_PATHS->labelsize(14); valTHOR_PATHS->labelcolor(FL_FOREGROUND_COLOR); valTHOR_PATHS->minimum(4); valTHOR_PATHS->maximum(8); valTHOR_PATHS->step(1); valTHOR_PATHS->value(5); valTHOR_PATHS->callback((Fl_Callback*)cb_valTHOR_PATHS); valTHOR_PATHS->align(Fl_Align(FL_ALIGN_TOP)); valTHOR_PATHS->when(FL_WHEN_CHANGED); o->value(progdefaults.THOR_PATHS); o->labelsize(FL_NORMAL_SIZE); o->hide(); } // Fl_Counter2* valTHOR_PATHS { Fl_Group* o = thor_image_box = new Fl_Group(616, 158, 59, 74, _("\nOperator Avatar")); thor_image_box->box(FL_FLAT_BOX); thor_image_box->color(FL_FOREGROUND_COLOR); thor_image_box->selection_color(FL_BACKGROUND_COLOR); thor_image_box->labeltype(FL_NORMAL_LABEL); thor_image_box->labelfont(0); thor_image_box->labelsize(14); thor_image_box->labelcolor(FL_FOREGROUND_COLOR); thor_image_box->align(Fl_Align(FL_ALIGN_BOTTOM)); thor_image_box->when(FL_WHEN_RELEASE); init_def_thor_avatar(o); } // Fl_Group* thor_image_box CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Thor")); config_pages.push_back(p); tab_tree->add(_("Modem/Thor")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/Navtex")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Check_Button* o = btnNvtxAdifLog = new Fl_Check_Button(316, 84, 235, 30, _("Log Navtex messages to Adif file")); btnNvtxAdifLog->down_box(FL_DOWN_BOX); btnNvtxAdifLog->callback((Fl_Callback*)cb_btnNvtxAdifLog); o->value(progdefaults.NVTX_AdifLog); } // Fl_Check_Button* btnNvtxAdifLog { Fl_Check_Button* o = btnNvtxKmlLog = new Fl_Check_Button(315, 130, 270, 30, _("Log Navtex messages to KML")); btnNvtxKmlLog->tooltip(_("Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)")); btnNvtxKmlLog->down_box(FL_DOWN_BOX); btnNvtxKmlLog->callback((Fl_Callback*)cb_btnNvtxKmlLog); o->value(progdefaults.NVTX_KmlLog); } // Fl_Check_Button* btnNvtxKmlLog CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Navtex")); config_pages.push_back(p); tab_tree->add(_("Modem/Navtex")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Modem/Wefax")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Counter* o = cntrWEFAX_Shift = new Fl_Counter(262, 50, 150, 24, _("Frequency shift")); cntrWEFAX_Shift->tooltip(_("Frequency shift of WEFAX signal\nNominal 800 Hz")); cntrWEFAX_Shift->minimum(750); cntrWEFAX_Shift->maximum(900); cntrWEFAX_Shift->step(10); cntrWEFAX_Shift->value(800); cntrWEFAX_Shift->callback((Fl_Callback*)cb_cntrWEFAX_Shift); cntrWEFAX_Shift->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.WEFAX_Shift); o->lstep(100.0); } // Fl_Counter* cntrWEFAX_Shift { Fl_Counter* o = cntrWEFAX_Center = new Fl_Counter(262, 99, 150, 24, _("Center freq")); cntrWEFAX_Center->tooltip(_("Center of WEFAX signal\nNominal 1900 Hz")); cntrWEFAX_Center->minimum(1000); cntrWEFAX_Center->maximum(2000); cntrWEFAX_Center->step(10); cntrWEFAX_Center->value(1900); cntrWEFAX_Center->callback((Fl_Callback*)cb_cntrWEFAX_Center); cntrWEFAX_Center->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.WEFAX_Center); o->lstep(100.0); } // Fl_Counter* cntrWEFAX_Center { Fl_Counter* o = cntrWEFAX_MaxRows = new Fl_Counter(588, 50, 150, 24, _("Max Image Rows")); cntrWEFAX_MaxRows->tooltip(_("Force save split image")); cntrWEFAX_MaxRows->minimum(1000); cntrWEFAX_MaxRows->maximum(10000); cntrWEFAX_MaxRows->step(100); cntrWEFAX_MaxRows->value(1500); cntrWEFAX_MaxRows->callback((Fl_Callback*)cb_cntrWEFAX_MaxRows); cntrWEFAX_MaxRows->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.WEFAX_MaxRows); o->lstep(1000.0); } // Fl_Counter* cntrWEFAX_MaxRows { Fl_Input* o = btnWefaxSaveDir = new Fl_Input(216, 267, 470, 24, _("Fax images destination directory")); btnWefaxSaveDir->tooltip(_("Store images in this directory")); btnWefaxSaveDir->callback((Fl_Callback*)cb_btnWefaxSaveDir); btnWefaxSaveDir->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.wefax_save_dir.c_str()); } // Fl_Input* btnWefaxSaveDir { btnSelectFaxDestDir = new Fl_Button(695, 267, 90, 24, _("Directory...")); btnSelectFaxDestDir->tooltip(_("Select destination directory")); btnSelectFaxDestDir->callback((Fl_Callback*)cb_btnSelectFaxDestDir); } // Fl_Button* btnSelectFaxDestDir { Fl_Check_Button* o = btnWefaxAdifLog = new Fl_Check_Button(216, 298, 235, 30, _("Log Wefax messages to Adif file")); btnWefaxAdifLog->tooltip(_("Sent and received faxes are logged to Adif file.")); btnWefaxAdifLog->down_box(FL_DOWN_BOX); btnWefaxAdifLog->callback((Fl_Callback*)cb_btnWefaxAdifLog); o->value(progdefaults.WEFAX_AdifLog); } // Fl_Check_Button* btnWefaxAdifLog { Fl_Choice* o = wefax_choice_rx_filter = new Fl_Choice(302, 137, 110, 24, _("Filter")); wefax_choice_rx_filter->down_box(FL_BORDER_BOX); wefax_choice_rx_filter->callback((Fl_Callback*)cb_wefax_choice_rx_filter); o->add("Narrow|Medium|Wide"); o->value(progdefaults.wefax_filter < 3 ? progdefaults.wefax_filter : 0); } // Fl_Choice* wefax_choice_rx_filter { Fl_Counter* o = auto_after_nrows = new Fl_Counter(588, 81, 150, 24, _("Enable Auto-align after")); auto_after_nrows->minimum(5); auto_after_nrows->maximum(100); auto_after_nrows->step(5); auto_after_nrows->value(50); auto_after_nrows->callback((Fl_Callback*)cb_auto_after_nrows); auto_after_nrows->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.wefax_auto_after); o->lstep(50); } // Fl_Counter* auto_after_nrows { Fl_Counter* o = align_stop_after = new Fl_Counter(588, 113, 150, 24, _("Stop Auto-align after")); align_stop_after->minimum(50); align_stop_after->maximum(500); align_stop_after->step(5); align_stop_after->value(500); align_stop_after->callback((Fl_Callback*)cb_align_stop_after); align_stop_after->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.wefax_align_stop); o->lstep(50); } // Fl_Counter* align_stop_after { Fl_Counter* o = align_every_nrows = new Fl_Counter(624, 145, 80, 24, _("Auto-align every")); align_every_nrows->type(1); align_every_nrows->minimum(5); align_every_nrows->maximum(100); align_every_nrows->step(5); align_every_nrows->value(25); align_every_nrows->callback((Fl_Callback*)cb_align_every_nrows); align_every_nrows->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.wefax_align_rows); } // Fl_Counter* align_every_nrows { Fl_Box* o = new Fl_Box(743, 81, 42, 22, _("rows")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(743, 113, 42, 22, _("rows")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Box* o = new Fl_Box(706, 146, 42, 22, _("rows")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Counter* o = wefax_correlation = new Fl_Counter(589, 179, 150, 24, _("Correlation")); wefax_correlation->tooltip(_("Row-to-row correlation\nUsed to detect presence of WEFAX signal\nLower: more \ false detections")); wefax_correlation->minimum(0.01); wefax_correlation->maximum(0.1); wefax_correlation->step(0.001); wefax_correlation->value(0.05); wefax_correlation->callback((Fl_Callback*)cb_wefax_correlation); wefax_correlation->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.wefax_correlation); o->lstep (0.01); } // Fl_Counter* wefax_correlation { Fl_Counter* o = cntr_correlation_rows = new Fl_Counter(624, 213, 80, 24, _("# Correlation rows")); cntr_correlation_rows->tooltip(_("Compute correlation factor over this # rows")); cntr_correlation_rows->type(1); cntr_correlation_rows->minimum(2); cntr_correlation_rows->maximum(50); cntr_correlation_rows->step(1); cntr_correlation_rows->value(10); cntr_correlation_rows->callback((Fl_Callback*)cb_cntr_correlation_rows); cntr_correlation_rows->align(Fl_Align(FL_ALIGN_LEFT)); o->value(progdefaults.wefax_correlation_rows); } // Fl_Counter* cntr_correlation_rows CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Modem/Wefax")); config_pages.push_back(p); tab_tree->add(_("Modem/Wefax")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/Autostart")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Input2* o = txt_auto_flrig_pathname = new Fl_Input2(267, 56, 310, 24, _("flrig:")); txt_auto_flrig_pathname->tooltip(_("Enter full path-filename for flrig")); txt_auto_flrig_pathname->box(FL_DOWN_BOX); txt_auto_flrig_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_flrig_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_flrig_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_flrig_pathname->labelfont(0); txt_auto_flrig_pathname->labelsize(14); txt_auto_flrig_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_flrig_pathname->callback((Fl_Callback*)cb_txt_auto_flrig_pathname); txt_auto_flrig_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_flrig_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_flrig_pathname.c_str()); } // Fl_Input2* txt_auto_flrig_pathname { btn_select_flrig = new Fl_Button(599, 56, 70, 24, _("Locate")); btn_select_flrig->tooltip(_("Locate flrig executable")); btn_select_flrig->callback((Fl_Callback*)cb_btn_select_flrig); } // Fl_Button* btn_select_flrig { Fl_Input2* o = txt_auto_flamp_pathname = new Fl_Input2(267, 94, 310, 24, _("flamp:")); txt_auto_flamp_pathname->tooltip(_("Enter full path-filename for flamp")); txt_auto_flamp_pathname->box(FL_DOWN_BOX); txt_auto_flamp_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_flamp_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_flamp_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_flamp_pathname->labelfont(0); txt_auto_flamp_pathname->labelsize(14); txt_auto_flamp_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_flamp_pathname->callback((Fl_Callback*)cb_txt_auto_flamp_pathname); txt_auto_flamp_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_flamp_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_flamp_pathname.c_str()); } // Fl_Input2* txt_auto_flamp_pathname { btn_select_auto_flamp = new Fl_Button(599, 94, 70, 24, _("Locate")); btn_select_auto_flamp->tooltip(_("Locate flamp executable")); btn_select_auto_flamp->callback((Fl_Callback*)cb_btn_select_auto_flamp); } // Fl_Button* btn_select_auto_flamp { Fl_Input2* o = txt_auto_flnet_pathname = new Fl_Input2(267, 132, 310, 24, _("flnet:")); txt_auto_flnet_pathname->tooltip(_("Enter full path-filename for flnet")); txt_auto_flnet_pathname->box(FL_DOWN_BOX); txt_auto_flnet_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_flnet_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_flnet_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_flnet_pathname->labelfont(0); txt_auto_flnet_pathname->labelsize(14); txt_auto_flnet_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_flnet_pathname->callback((Fl_Callback*)cb_txt_auto_flnet_pathname); txt_auto_flnet_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_flnet_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_flnet_pathname.c_str()); } // Fl_Input2* txt_auto_flnet_pathname { btn_select_auto_flnet = new Fl_Button(599, 132, 70, 24, _("Locate")); btn_select_auto_flnet->tooltip(_("Locate flnet executable")); btn_select_auto_flnet->callback((Fl_Callback*)cb_btn_select_auto_flnet); } // Fl_Button* btn_select_auto_flnet { Fl_Input2* o = txt_auto_fllog_pathname = new Fl_Input2(267, 171, 310, 24, _("fllog:")); txt_auto_fllog_pathname->tooltip(_("Enter full path-filename for fllog")); txt_auto_fllog_pathname->box(FL_DOWN_BOX); txt_auto_fllog_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_fllog_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_fllog_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_fllog_pathname->labelfont(0); txt_auto_fllog_pathname->labelsize(14); txt_auto_fllog_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_fllog_pathname->callback((Fl_Callback*)cb_txt_auto_fllog_pathname); txt_auto_fllog_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_fllog_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_fllog_pathname.c_str()); } // Fl_Input2* txt_auto_fllog_pathname { btn_select_fllog = new Fl_Button(599, 171, 70, 24, _("Locate")); btn_select_fllog->tooltip(_("Locate fllog executable")); btn_select_fllog->callback((Fl_Callback*)cb_btn_select_fllog); } // Fl_Button* btn_select_fllog { Fl_Input2* o = txt_auto_prog1_pathname = new Fl_Input2(267, 209, 310, 24, _("Prog 1:")); txt_auto_prog1_pathname->tooltip(_("Enter full path-filename for external program")); txt_auto_prog1_pathname->box(FL_DOWN_BOX); txt_auto_prog1_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_prog1_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_prog1_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_prog1_pathname->labelfont(0); txt_auto_prog1_pathname->labelsize(14); txt_auto_prog1_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_prog1_pathname->callback((Fl_Callback*)cb_txt_auto_prog1_pathname); txt_auto_prog1_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_prog1_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_prog1_pathname.c_str()); } // Fl_Input2* txt_auto_prog1_pathname { btn_select_prog1 = new Fl_Button(599, 209, 70, 24, _("Locate")); btn_select_prog1->tooltip(_("Locate program #1 executable")); btn_select_prog1->callback((Fl_Callback*)cb_btn_select_prog1); } // Fl_Button* btn_select_prog1 { Fl_Input2* o = txt_auto_prog2_pathname = new Fl_Input2(267, 247, 310, 24, _("Prog 2:")); txt_auto_prog2_pathname->tooltip(_("Enter full path-filename for external program")); txt_auto_prog2_pathname->box(FL_DOWN_BOX); txt_auto_prog2_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_prog2_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_prog2_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_prog2_pathname->labelfont(0); txt_auto_prog2_pathname->labelsize(14); txt_auto_prog2_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_prog2_pathname->callback((Fl_Callback*)cb_txt_auto_prog2_pathname); txt_auto_prog2_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_prog2_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_prog2_pathname.c_str()); } // Fl_Input2* txt_auto_prog2_pathname { btn_select_prog2 = new Fl_Button(599, 247, 70, 24, _("Locate")); btn_select_prog2->tooltip(_("Locate program #2 executable")); btn_select_prog2->callback((Fl_Callback*)cb_btn_select_prog2); } // Fl_Button* btn_select_prog2 { Fl_Input2* o = txt_auto_prog3_pathname = new Fl_Input2(267, 286, 310, 24, _("Prog 3:")); txt_auto_prog3_pathname->tooltip(_("Enter full path-filename for external program")); txt_auto_prog3_pathname->box(FL_DOWN_BOX); txt_auto_prog3_pathname->color(FL_BACKGROUND2_COLOR); txt_auto_prog3_pathname->selection_color(FL_SELECTION_COLOR); txt_auto_prog3_pathname->labeltype(FL_NORMAL_LABEL); txt_auto_prog3_pathname->labelfont(0); txt_auto_prog3_pathname->labelsize(14); txt_auto_prog3_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_auto_prog3_pathname->callback((Fl_Callback*)cb_txt_auto_prog3_pathname); txt_auto_prog3_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_auto_prog3_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.auto_prog3_pathname.c_str()); } // Fl_Input2* txt_auto_prog3_pathname { btn_select_prog3 = new Fl_Button(599, 286, 70, 24, _("Locate")); btn_select_prog3->tooltip(_("Locate program #3 executable")); btn_select_prog3->callback((Fl_Callback*)cb_btn_select_prog3); } // Fl_Button* btn_select_prog3 { Fl_Check_Button* o = btn_flrig_auto_enable = new Fl_Check_Button(679, 60, 19, 15, _("Enable\n-")); btn_flrig_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_flrig_auto_enable->down_box(FL_DOWN_BOX); btn_flrig_auto_enable->callback((Fl_Callback*)cb_btn_flrig_auto_enable); btn_flrig_auto_enable->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.flrig_auto_enable); } // Fl_Check_Button* btn_flrig_auto_enable { Fl_Check_Button* o = btn_flamp_auto_enable = new Fl_Check_Button(679, 98, 23, 15); btn_flamp_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_flamp_auto_enable->down_box(FL_DOWN_BOX); btn_flamp_auto_enable->callback((Fl_Callback*)cb_btn_flamp_auto_enable); o->value(progdefaults.flamp_auto_enable); } // Fl_Check_Button* btn_flamp_auto_enable { Fl_Check_Button* o = btn_flnet_auto_enable = new Fl_Check_Button(679, 136, 23, 15); btn_flnet_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_flnet_auto_enable->down_box(FL_DOWN_BOX); btn_flnet_auto_enable->callback((Fl_Callback*)cb_btn_flnet_auto_enable); o->value(progdefaults.flnet_auto_enable); } // Fl_Check_Button* btn_flnet_auto_enable { Fl_Check_Button* o = btn_fllog_auto_enable = new Fl_Check_Button(679, 175, 23, 15); btn_fllog_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_fllog_auto_enable->down_box(FL_DOWN_BOX); btn_fllog_auto_enable->callback((Fl_Callback*)cb_btn_fllog_auto_enable); o->value(progdefaults.fllog_auto_enable); } // Fl_Check_Button* btn_fllog_auto_enable { Fl_Check_Button* o = btn_prog1_auto_enable = new Fl_Check_Button(679, 213, 23, 15); btn_prog1_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_prog1_auto_enable->down_box(FL_DOWN_BOX); btn_prog1_auto_enable->callback((Fl_Callback*)cb_btn_prog1_auto_enable); o->value(progdefaults.prog1_auto_enable); } // Fl_Check_Button* btn_prog1_auto_enable { Fl_Check_Button* o = btn_prog2_auto_enable = new Fl_Check_Button(679, 251, 23, 15); btn_prog2_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_prog2_auto_enable->down_box(FL_DOWN_BOX); btn_prog2_auto_enable->callback((Fl_Callback*)cb_btn_prog2_auto_enable); o->value(progdefaults.prog2_auto_enable); } // Fl_Check_Button* btn_prog2_auto_enable { Fl_Check_Button* o = btn_prog3_auto_enable = new Fl_Check_Button(679, 290, 23, 15); btn_prog3_auto_enable->tooltip(_("Enable this entry when fldigi first starts")); btn_prog3_auto_enable->down_box(FL_DOWN_BOX); btn_prog3_auto_enable->callback((Fl_Callback*)cb_btn_prog3_auto_enable); o->value(progdefaults.prog3_auto_enable); } // Fl_Check_Button* btn_prog3_auto_enable { btn_test_flrig = new Fl_Button(709, 56, 70, 24, _("Test")); btn_test_flrig->tooltip(_("Start flrig")); btn_test_flrig->callback((Fl_Callback*)cb_btn_test_flrig); } // Fl_Button* btn_test_flrig { btn_test_flamp = new Fl_Button(709, 94, 70, 24, _("Test")); btn_test_flamp->tooltip(_("Start flamp")); btn_test_flamp->callback((Fl_Callback*)cb_btn_test_flamp); } // Fl_Button* btn_test_flamp { btn_test_flnet = new Fl_Button(709, 132, 70, 24, _("Test")); btn_test_flnet->tooltip(_("Start flnet")); btn_test_flnet->callback((Fl_Callback*)cb_btn_test_flnet); } // Fl_Button* btn_test_flnet { btn_test_fllog = new Fl_Button(709, 171, 70, 24, _("Test")); btn_test_fllog->tooltip(_("Start fllog")); btn_test_fllog->callback((Fl_Callback*)cb_btn_test_fllog); } // Fl_Button* btn_test_fllog { btn_test_prog1 = new Fl_Button(709, 209, 70, 24, _("Test")); btn_test_prog1->tooltip(_("Start prog1")); btn_test_prog1->callback((Fl_Callback*)cb_btn_test_prog1); } // Fl_Button* btn_test_prog1 { btn_test_prog2 = new Fl_Button(709, 247, 70, 24, _("Test")); btn_test_prog2->tooltip(_("Start prog2")); btn_test_prog2->callback((Fl_Callback*)cb_btn_test_prog2); } // Fl_Button* btn_test_prog2 { btn_test_prog3 = new Fl_Button(709, 286, 70, 24, _("Test")); btn_test_prog3->tooltip(_("Start prog3")); btn_test_prog3->callback((Fl_Callback*)cb_btn_test_prog3); } // Fl_Button* btn_test_prog3 CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/Autostart")); config_pages.push_back(p); tab_tree->add(_("Misc/Autostart")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/CPU")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Check_Button* o = chkSlowCpu = new Fl_Check_Button(305, 65, 225, 20, _("Slow CPU (less than 700MHz)")); chkSlowCpu->tooltip(_("Enable if you\'re computer does not decode properly")); chkSlowCpu->down_box(FL_DOWN_BOX); chkSlowCpu->callback((Fl_Callback*)cb_chkSlowCpu); o->value(progdefaults.slowcpu); } // Fl_Check_Button* chkSlowCpu CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/CPU")); config_pages.push_back(p); tab_tree->add(_("Misc/CPU")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/DTMF")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Check_Button* o = chkDTMFdecode = new Fl_Check_Button(372, 79, 175, 20, _("Decode DTMF tones")); chkDTMFdecode->tooltip(_("Decode received DTMF tones")); chkDTMFdecode->down_box(FL_DOWN_BOX); chkDTMFdecode->callback((Fl_Callback*)cb_chkDTMFdecode); o->value(progdefaults.DTMFdecode); } // Fl_Check_Button* chkDTMFdecode CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/DTMF")); config_pages.push_back(p); tab_tree->add(_("Misc/DTMF")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/KML")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Input* o = btnKmlSaveDir = new Fl_Input(232, 47, 390, 24, _("KML files directory")); btnKmlSaveDir->tooltip(_("Where generated KML documents are stored.")); btnKmlSaveDir->callback((Fl_Callback*)cb_btnKmlSaveDir); btnKmlSaveDir->align(Fl_Align(69)); o->value(progdefaults.kml_save_dir.c_str()); } // Fl_Input* btnKmlSaveDir { Fl_Input* o = inputKmlRootFile = new Fl_Input(231, 91, 300, 24, _("KML root file")); inputKmlRootFile->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value("fldigi.kml"); } // Fl_Input* inputKmlRootFile { Fl_Counter* o = cntKmlMergeDistance = new Fl_Counter(232, 127, 100, 24, _("Minimum distance for splitting aliases (Meters)")); cntKmlMergeDistance->tooltip(_("Minimum distance for splitting alias nodes (Meters)")); cntKmlMergeDistance->minimum(0); cntKmlMergeDistance->maximum(100000); cntKmlMergeDistance->step(10); cntKmlMergeDistance->value(1000); cntKmlMergeDistance->callback((Fl_Callback*)cb_cntKmlMergeDistance); cntKmlMergeDistance->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.kml_merge_distance); o->lstep(1000); } // Fl_Counter* cntKmlMergeDistance { Fl_Counter* o = cntKmlRetentionTime = new Fl_Counter(231, 163, 100, 24, _("Data retention time, in hours (0 for no limit)")); cntKmlRetentionTime->tooltip(_("Number of hours data is kept for each node. Zero means keeping everything.")); cntKmlRetentionTime->minimum(0); cntKmlRetentionTime->maximum(500); cntKmlRetentionTime->step(1); cntKmlRetentionTime->callback((Fl_Callback*)cb_cntKmlRetentionTime); cntKmlRetentionTime->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.kml_retention_time); o->lstep(24); } // Fl_Counter* cntKmlRetentionTime { Fl_Spinner2* o = cntKmlRefreshInterval = new Fl_Spinner2(230, 199, 50, 24, _("KML refresh interval (seconds)")); cntKmlRefreshInterval->tooltip(_("Refresh time interval written in KML file (Seconds)")); cntKmlRefreshInterval->box(FL_NO_BOX); cntKmlRefreshInterval->color(FL_BACKGROUND_COLOR); cntKmlRefreshInterval->selection_color(FL_BACKGROUND_COLOR); cntKmlRefreshInterval->labeltype(FL_NORMAL_LABEL); cntKmlRefreshInterval->labelfont(0); cntKmlRefreshInterval->labelsize(14); cntKmlRefreshInterval->labelcolor(FL_FOREGROUND_COLOR); cntKmlRefreshInterval->value(10); cntKmlRefreshInterval->callback((Fl_Callback*)cb_cntKmlRefreshInterval); cntKmlRefreshInterval->align(Fl_Align(FL_ALIGN_RIGHT)); cntKmlRefreshInterval->when(FL_WHEN_RELEASE); o->minimum(1); o->maximum(3600); o->step(1); o->value(progdefaults.kml_refresh_interval); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntKmlRefreshInterval { Fl_ListBox* o = listbox_kml_balloon_style = new Fl_ListBox(230, 235, 201, 24, _("KML balloon display style")); listbox_kml_balloon_style->tooltip(_("KML balloon in plain text, or HTML, in plain tables or matrices.")); listbox_kml_balloon_style->box(FL_DOWN_BOX); listbox_kml_balloon_style->color(FL_BACKGROUND2_COLOR); listbox_kml_balloon_style->selection_color(FL_BACKGROUND_COLOR); listbox_kml_balloon_style->labeltype(FL_NORMAL_LABEL); listbox_kml_balloon_style->labelfont(0); listbox_kml_balloon_style->labelsize(14); listbox_kml_balloon_style->labelcolor(FL_FOREGROUND_COLOR); listbox_kml_balloon_style->callback((Fl_Callback*)cb_listbox_kml_balloon_style); listbox_kml_balloon_style->align(Fl_Align(FL_ALIGN_RIGHT)); listbox_kml_balloon_style->when(FL_WHEN_CHANGED); o->add("Plain text|HTML tables|Single HTML matrix");o->index(progdefaults.kml_balloon_style); o->labelsize(FL_NORMAL_SIZE); listbox_kml_balloon_style->end(); } // Fl_ListBox* listbox_kml_balloon_style { Fl_Input* o = btnKmlCommand = new Fl_Input(230, 271, 246, 24, _("Command run on KML creation")); btnKmlCommand->tooltip(_("Command started when KML files are generated. Subprocesses are started once, \ and restarted if needed.")); btnKmlCommand->callback((Fl_Callback*)cb_btnKmlCommand); btnKmlCommand->align(Fl_Align(72)); o->value(progdefaults.kml_command.c_str()); } // Fl_Input* btnKmlCommand { btlTestKmlCommand = new Fl_Button(230, 307, 191, 24, _("Test command")); btlTestKmlCommand->tooltip(_("Execute command on KML files.")); btlTestKmlCommand->callback((Fl_Callback*)cb_btlTestKmlCommand); } // Fl_Button* btlTestKmlCommand { btnSelectKmlDestDir = new Fl_Button(631, 47, 101, 24, _("Change dir...")); btnSelectKmlDestDir->tooltip(_("Choose directory to store KML documents")); btnSelectKmlDestDir->callback((Fl_Callback*)cb_btnSelectKmlDestDir); } // Fl_Button* btnSelectKmlDestDir { btlPurge = new Fl_Button(542, 91, 190, 24, _("Cleanup KML data now !")); btlPurge->tooltip(_("Cleanups KML documents, empties Google Earth display.")); btlPurge->callback((Fl_Callback*)cb_btlPurge); } // Fl_Button* btlPurge { Fl_Check_Button* o = btnKmlPurgeOnStartup = new Fl_Check_Button(528, 203, 172, 15, _("Cleanup on startup")); btnKmlPurgeOnStartup->tooltip(_("Empties KML documents when starting program.")); btnKmlPurgeOnStartup->down_box(FL_DOWN_BOX); btnKmlPurgeOnStartup->callback((Fl_Callback*)cb_btnKmlPurgeOnStartup); o->value(progdefaults.kml_purge_on_startup); } // Fl_Check_Button* btnKmlPurgeOnStartup { Fl_Group* o = new Fl_Group(475, 301, 310, 40); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_kml_enabled = new Fl_Check_Button(497, 311, 242, 19, _("KML server enabled (On / Off)")); btn_kml_enabled->tooltip(_("Uncheck if KML is never used")); btn_kml_enabled->down_box(FL_DOWN_BOX); btn_kml_enabled->callback((Fl_Callback*)cb_btn_kml_enabled); o->value(progdefaults.kml_enabled); } // Fl_Check_Button* btn_kml_enabled o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/KML")); config_pages.push_back(p); tab_tree->add(_("Misc/KML")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/NBEMS interface")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(251, 35, 500, 75, _("NBEMS data file interface")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkAutoExtract = new Fl_Check_Button(305, 66, 75, 20, _("Enable")); chkAutoExtract->tooltip(_("Extract files for use with external \"wrap / flmsg\" program")); chkAutoExtract->down_box(FL_DOWN_BOX); chkAutoExtract->callback((Fl_Callback*)cb_chkAutoExtract); o->value(progdefaults.autoextract); } // Fl_Check_Button* chkAutoExtract { Fl_Check_Button* o = chk_open_wrap_folder = new Fl_Check_Button(511, 66, 146, 20, _("Open message folder")); chk_open_wrap_folder->tooltip(_("Opens NBEMS file folder upon successful capture")); chk_open_wrap_folder->down_box(FL_DOWN_BOX); chk_open_wrap_folder->callback((Fl_Callback*)cb_chk_open_wrap_folder); o->value(progdefaults.open_nbems_folder); } // Fl_Check_Button* chk_open_wrap_folder o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(251, 111, 500, 199, _("Reception of flmsg files")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_open_flmsg = new Fl_Check_Button(305, 211, 136, 20, _("Open with flmsg")); chk_open_flmsg->tooltip(_("Open message with flmsg")); chk_open_flmsg->down_box(FL_DOWN_BOX); chk_open_flmsg->callback((Fl_Callback*)cb_chk_open_flmsg); o->value(progdefaults.open_flmsg); } // Fl_Check_Button* chk_open_flmsg { Fl_Check_Button* o = chk_open_flmsg_print = new Fl_Check_Button(511, 211, 136, 20, _("Open in browser")); chk_open_flmsg_print->tooltip(_("Open file with default browser")); chk_open_flmsg_print->down_box(FL_DOWN_BOX); chk_open_flmsg_print->callback((Fl_Callback*)cb_chk_open_flmsg_print); o->value(progdefaults.open_flmsg_print); } // Fl_Check_Button* chk_open_flmsg_print { Fl_Input2* o = txt_flmsg_pathname = new Fl_Input2(305, 241, 330, 24, _("flmsg:")); txt_flmsg_pathname->tooltip(_("Enter full path-filename for flmsg")); txt_flmsg_pathname->box(FL_DOWN_BOX); txt_flmsg_pathname->color(FL_BACKGROUND2_COLOR); txt_flmsg_pathname->selection_color(FL_SELECTION_COLOR); txt_flmsg_pathname->labeltype(FL_NORMAL_LABEL); txt_flmsg_pathname->labelfont(0); txt_flmsg_pathname->labelsize(14); txt_flmsg_pathname->labelcolor(FL_FOREGROUND_COLOR); txt_flmsg_pathname->callback((Fl_Callback*)cb_txt_flmsg_pathname); txt_flmsg_pathname->align(Fl_Align(FL_ALIGN_LEFT)); txt_flmsg_pathname->when(FL_WHEN_CHANGED); o->value(progdefaults.flmsg_pathname.c_str()); } // Fl_Input2* txt_flmsg_pathname { btn_select_flmsg = new Fl_Button(642, 241, 100, 24, _("Locate flmsg")); btn_select_flmsg->tooltip(_("Locate flmsg executable")); btn_select_flmsg->callback((Fl_Callback*)cb_btn_select_flmsg); } // Fl_Button* btn_select_flmsg { Fl_Value_Slider* o = sldr_extract_timeout = new Fl_Value_Slider(271, 279, 364, 21, _("Timeout (secs)")); sldr_extract_timeout->tooltip(_("Extract times out after NN seconds of inactivity.")); sldr_extract_timeout->type(5); sldr_extract_timeout->color(FL_LIGHT3); sldr_extract_timeout->selection_color(FL_FOREGROUND_COLOR); sldr_extract_timeout->minimum(1); sldr_extract_timeout->maximum(20); sldr_extract_timeout->step(0.5); sldr_extract_timeout->value(10); sldr_extract_timeout->textsize(14); sldr_extract_timeout->callback((Fl_Callback*)cb_sldr_extract_timeout); sldr_extract_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.extract_timeout); } // Fl_Value_Slider* sldr_extract_timeout { Fl_Group* o = new Fl_Group(256, 130, 490, 76, _("Selection of transfer direct takes precedence\nover all other flmsg reception\ settings")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_transfer__to_open_flmsg = new Fl_Check_Button(361, 174, 271, 20, _("Transfer direct to executing flmsg")); chk_transfer__to_open_flmsg->tooltip(_("Send data stream directly to executing flmsg")); chk_transfer__to_open_flmsg->down_box(FL_DOWN_BOX); chk_transfer__to_open_flmsg->callback((Fl_Callback*)cb_chk_transfer__to_open_flmsg); o->value(progdefaults.flmsg_transfer_direct); } // Fl_Check_Button* chk_transfer__to_open_flmsg o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/NBEMS interface")); config_pages.push_back(p); tab_tree->add(_("Misc/NBEMS interface")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/PSK reporter")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { btnPSKRepAuto = new Fl_Check_Button(252, 65, 324, 20, _("Automatically spot callsigns in decoded text")); btnPSKRepAuto->tooltip(_("Parse all incoming text")); btnPSKRepAuto->down_box(FL_DOWN_BOX); btnPSKRepAuto->callback((Fl_Callback*)cb_btnPSKRepAuto); btnPSKRepAuto->value(progdefaults.pskrep_auto); } // Fl_Check_Button* btnPSKRepAuto { btnPSKRepLog = new Fl_Check_Button(252, 96, 327, 20, _("Send reception report when logging a QSO")); btnPSKRepLog->tooltip(_("Send report only when QSO is logged")); btnPSKRepLog->down_box(FL_DOWN_BOX); btnPSKRepLog->callback((Fl_Callback*)cb_btnPSKRepLog); btnPSKRepLog->value(progdefaults.pskrep_log); } // Fl_Check_Button* btnPSKRepLog { btnPSKRepQRG = new Fl_Check_Button(252, 128, 416, 20, _("Report rig frequency (enable only if you have rig control!)")); btnPSKRepQRG->tooltip(_("Include the transmit frequency")); btnPSKRepQRG->down_box(FL_DOWN_BOX); btnPSKRepQRG->callback((Fl_Callback*)cb_btnPSKRepQRG); btnPSKRepQRG->value(progdefaults.pskrep_qrg); } // Fl_Check_Button* btnPSKRepQRG { Fl_Check_Button* o = btn_report_when_visible = new Fl_Check_Button(252, 160, 416, 20, _("Disable spotting when signal browser(s) are not visible.")); btn_report_when_visible->tooltip(_("Check to reduce CPU load in PSK and RTTY modes.")); btn_report_when_visible->down_box(FL_DOWN_BOX); btn_report_when_visible->value(1); btn_report_when_visible->callback((Fl_Callback*)cb_btn_report_when_visible); o->value(progdefaults.report_when_visible); } // Fl_Check_Button* btn_report_when_visible { Fl_Check_Button* o = btn_pskrep_autostart = new Fl_Check_Button(252, 192, 291, 20, _("Log on to pskrep when starting fldigi")); btn_pskrep_autostart->tooltip(_("Automatically start psk reporter socket connection")); btn_pskrep_autostart->down_box(FL_DOWN_BOX); btn_pskrep_autostart->callback((Fl_Callback*)cb_btn_pskrep_autostart); o->value(progdefaults.pskrep_autostart); } // Fl_Check_Button* btn_pskrep_autostart { box_connected_to_pskrep = new Fl_Box(562, 193, 18, 18, _("Connected")); box_connected_to_pskrep->box(FL_DIAMOND_DOWN_BOX); box_connected_to_pskrep->color(FL_BACKGROUND2_COLOR); box_connected_to_pskrep->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Box* box_connected_to_pskrep { inpPSKRepHost = new Fl_Input2(295, 230, 220, 24, _("Host:")); inpPSKRepHost->tooltip(_("To whom the connection is made")); inpPSKRepHost->box(FL_DOWN_BOX); inpPSKRepHost->color(FL_BACKGROUND2_COLOR); inpPSKRepHost->selection_color(FL_SELECTION_COLOR); inpPSKRepHost->labeltype(FL_NORMAL_LABEL); inpPSKRepHost->labelfont(0); inpPSKRepHost->labelsize(14); inpPSKRepHost->labelcolor(FL_FOREGROUND_COLOR); inpPSKRepHost->callback((Fl_Callback*)cb_inpPSKRepHost); inpPSKRepHost->align(Fl_Align(FL_ALIGN_LEFT)); inpPSKRepHost->when(FL_WHEN_CHANGED); inpPSKRepHost->value(progdefaults.pskrep_host.c_str()); inpPSKRepHost->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpPSKRepHost { inpPSKRepPort = new Fl_Input2(664, 230, 60, 24, _("Port:")); inpPSKRepPort->tooltip(_("Using UDP port #")); inpPSKRepPort->box(FL_DOWN_BOX); inpPSKRepPort->color(FL_BACKGROUND2_COLOR); inpPSKRepPort->selection_color(FL_SELECTION_COLOR); inpPSKRepPort->labeltype(FL_NORMAL_LABEL); inpPSKRepPort->labelfont(0); inpPSKRepPort->labelsize(14); inpPSKRepPort->labelcolor(FL_FOREGROUND_COLOR); inpPSKRepPort->callback((Fl_Callback*)cb_inpPSKRepPort); inpPSKRepPort->align(Fl_Align(FL_ALIGN_LEFT)); inpPSKRepPort->when(FL_WHEN_CHANGED); inpPSKRepPort->value(progdefaults.pskrep_port.c_str()); inpPSKRepPort->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpPSKRepPort { btnPSKRepInit = new Fl_Button(644, 275, 80, 24, _("Initialize")); btnPSKRepInit->tooltip(_("Initialize the socket client")); btnPSKRepInit->callback((Fl_Callback*)cb_btnPSKRepInit); } // Fl_Button* btnPSKRepInit { boxPSKRepMsg = new Fl_Box(254, 259, 300, 48, _("")); boxPSKRepMsg->labelfont(2); boxPSKRepMsg->label(0); } // Fl_Box* boxPSKRepMsg CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/PSK reporter")); config_pages.push_back(p); tab_tree->add(_("Misc/PSK reporter")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/PSM")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(204, 32, 590, 108); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntBusyChannelSeconds = new Fl_Counter(380, 38, 110, 20, _("Allow TX After Signal Detection (Secs)")); cntBusyChannelSeconds->tooltip(_("Allow transmits after \'N\' seconds of a signal detection.")); cntBusyChannelSeconds->minimum(1); cntBusyChannelSeconds->maximum(999); cntBusyChannelSeconds->step(1); cntBusyChannelSeconds->value(1); cntBusyChannelSeconds->callback((Fl_Callback*)cb_cntBusyChannelSeconds); cntBusyChannelSeconds->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.busyChannelSeconds); o->step(1,10); } // Fl_Counter* cntBusyChannelSeconds { Fl_Check_Button* o = btnEnableBusyChannel = new Fl_Check_Button(210, 40, 115, 20, _("Enable Busy Channel")); btnEnableBusyChannel->tooltip(_("Enable to inhibit TX on signal Detections")); btnEnableBusyChannel->down_box(FL_DOWN_BOX); btnEnableBusyChannel->callback((Fl_Callback*)cb_btnEnableBusyChannel); if(progdefaults.enableBusyChannel) o->value(true); else o->value(false); } // Fl_Check_Button* btnEnableBusyChannel { Fl_Counter* o = cntPSMTXBufferFlushTimer = new Fl_Counter(380, 63, 110, 20, _("TX Buffer Flush Timer (Mins, 0=Disable)")); cntPSMTXBufferFlushTimer->tooltip(_("Flushes the TX buffer after x period when Busy Channel remains on (TX inhibit\ ed)")); cntPSMTXBufferFlushTimer->minimum(1); cntPSMTXBufferFlushTimer->maximum(999); cntPSMTXBufferFlushTimer->step(1); cntPSMTXBufferFlushTimer->value(1); cntPSMTXBufferFlushTimer->callback((Fl_Callback*)cb_cntPSMTXBufferFlushTimer); cntPSMTXBufferFlushTimer->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.psm_flush_buffer_timeout); o->step(1,10); o->minimum(0); o->maximum(999); } // Fl_Counter* cntPSMTXBufferFlushTimer { Fl_Counter* o = cntPSMBandwidthMargins = new Fl_Counter(380, 88, 110, 20, _("Modem Bandwidth Margins ")); cntPSMBandwidthMargins->tooltip(_("Monitor signals in modem bandwitdh plus margins.")); cntPSMBandwidthMargins->minimum(1); cntPSMBandwidthMargins->maximum(999); cntPSMBandwidthMargins->step(1); cntPSMBandwidthMargins->value(1); cntPSMBandwidthMargins->callback((Fl_Callback*)cb_cntPSMBandwidthMargins); cntPSMBandwidthMargins->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.psm_minimum_bandwidth_margin); o->step(1,10); } // Fl_Counter* cntPSMBandwidthMargins { Fl_Counter* o = cntPSMValidSamplePeriod = new Fl_Counter(380, 114, 110, 20, _("Valid Signal Sample Period (msecs)")); cntPSMValidSamplePeriod->tooltip(_("Valid signal sample period in Milliseconds")); cntPSMValidSamplePeriod->minimum(1); cntPSMValidSamplePeriod->maximum(999); cntPSMValidSamplePeriod->step(1); cntPSMValidSamplePeriod->value(1); cntPSMValidSamplePeriod->callback((Fl_Callback*)cb_cntPSMValidSamplePeriod); cntPSMValidSamplePeriod->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.psm_hit_time_window); o->step(1,10); } // Fl_Counter* cntPSMValidSamplePeriod o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(204, 140, 590, 84); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnEnable_csma = new Fl_Check_Button(214, 148, 114, 20, _("Enable CSMA")); btnEnable_csma->tooltip(_("Carrier Sense Mulitiple Access")); btnEnable_csma->down_box(FL_DOWN_BOX); btnEnable_csma->callback((Fl_Callback*)cb_btnEnable_csma); if(progdefaults.csma_enabled) o->value(true); } // Fl_Check_Button* btnEnable_csma { Fl_Counter* o = cntPersistance = new Fl_Counter(333, 148, 110, 20, _("Persistance")); cntPersistance->tooltip(_("Used to adjust the aggressiveness of TX")); cntPersistance->minimum(1); cntPersistance->maximum(999); cntPersistance->step(1); cntPersistance->value(1); cntPersistance->callback((Fl_Callback*)cb_cntPersistance); cntPersistance->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.csma_persistance); o->step(1,10); o->minimum(0); o->maximum(255); } // Fl_Counter* cntPersistance { Fl_Counter* o = cntSlotTime = new Fl_Counter(333, 173, 110, 20, _("Slot Time")); cntSlotTime->tooltip(_("Non transmit window after a transmit period")); cntSlotTime->minimum(1); cntSlotTime->maximum(999); cntSlotTime->step(1); cntSlotTime->value(1); cntSlotTime->callback((Fl_Callback*)cb_cntSlotTime); cntSlotTime->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.csma_slot_time); o->step(1,10); o->minimum(1); o->maximum(255); } // Fl_Counter* cntSlotTime { Fl_Counter* o = cntTransmitDelay = new Fl_Counter(333, 198, 110, 20, _("Transmit Data Delay")); cntTransmitDelay->tooltip(_("Idle transmit before data sent")); cntTransmitDelay->minimum(1); cntTransmitDelay->maximum(999); cntTransmitDelay->step(1); cntTransmitDelay->value(1); cntTransmitDelay->callback((Fl_Callback*)cb_cntTransmitDelay); cntTransmitDelay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.csma_transmit_delay); o->step(1,10); o->minimum(1); o->maximum(255); } // Fl_Counter* cntTransmitDelay { OutputSlotTimeMS = new Fl_Output(599, 173, 95, 20, _("MilliSeconds")); OutputSlotTimeMS->tooltip(_("Displays the Slot Time in Milliseconds")); OutputSlotTimeMS->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Output* OutputSlotTimeMS { OutputTransmitDelayMS = new Fl_Output(599, 198, 95, 20, _("MilliSeconds")); OutputTransmitDelayMS->tooltip(_("Displays the Transmit Delay in Milliseconds")); OutputTransmitDelayMS->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Output* OutputTransmitDelayMS { OutputPersistancePercent = new Fl_Output(599, 147, 95, 20, _("Percent (%)")); OutputPersistancePercent->tooltip(_("Displays the Slot Time in Milliseconds")); OutputPersistancePercent->align(Fl_Align(FL_ALIGN_RIGHT)); } // Fl_Output* OutputPersistancePercent o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(204, 223, 590, 31); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnEnable_histogram = new Fl_Check_Button(216, 230, 139, 20, _("Enable Histogram")); btnEnable_histogram->tooltip(_("Enable Histogram threshold signal monitoring")); btnEnable_histogram->down_box(FL_DOWN_BOX); btnEnable_histogram->callback((Fl_Callback*)cb_btnEnable_histogram); if(progdefaults.psm_use_histogram) o->value(true); } // Fl_Check_Button* btnEnable_histogram { Fl_Counter* o = cntPSMThreshold = new Fl_Counter(380, 230, 110, 20, _("PSM Histogram Threshold")); cntPSMThreshold->tooltip(_("Sets the theshold level to x value above the noise level")); cntPSMThreshold->minimum(1); cntPSMThreshold->maximum(999); cntPSMThreshold->step(1); cntPSMThreshold->value(1); cntPSMThreshold->callback((Fl_Callback*)cb_cntPSMThreshold); cntPSMThreshold->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.psm_histogram_offset_threshold); o->step(1,10); o->minimum(1); o->maximum(20); } // Fl_Counter* cntPSMThreshold o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(204, 254, 590, 34); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntKPSQLAttenuation = new Fl_Counter(380, 261, 110, 20, _("PSM Attenuate")); cntKPSQLAttenuation->tooltip(_("Adjust sensitivity by 1/N fractional values.")); cntKPSQLAttenuation->minimum(1); cntKPSQLAttenuation->maximum(999); cntKPSQLAttenuation->step(1); cntKPSQLAttenuation->value(1); cntKPSQLAttenuation->callback((Fl_Callback*)cb_cntKPSQLAttenuation); cntKPSQLAttenuation->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.kpsql_attenuation); o->step(1,10); o->minimum(1); o->maximum(999); update_kpsql_fractional_gain(progdefaults.kpsql_attenuation); } // Fl_Counter* cntKPSQLAttenuation o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(204, 287, 590, 28); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_show_psm_button = new Fl_Check_Button(214, 291, 150, 20, _("Show and enable Power Signal Monitor button (PSM)")); btn_show_psm_button->tooltip(_("display PSM button on main dialog")); btn_show_psm_button->down_box(FL_DOWN_BOX); btn_show_psm_button->callback((Fl_Callback*)cb_btn_show_psm_button); o->value(progdefaults.show_psm_btn); } // Fl_Check_Button* btn_show_psm_button o->end(); } // Fl_Group* o { btnBuyChannelDefaults = new Fl_Button(669, 320, 126, 22, _("Default Settings")); btnBuyChannelDefaults->callback((Fl_Callback*)cb_btnBuyChannelDefaults); } // Fl_Button* btnBuyChannelDefaults CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/PSM")); config_pages.push_back(p); tab_tree->add(_("Misc/PSM")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/Rx text capture")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { grpTalker = new Fl_Group(252, 107, 490, 73, _("Talker Socket (MS only)")); grpTalker->box(FL_ENGRAVED_FRAME); grpTalker->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnConnectTalker = new Fl_Light_Button(278, 127, 74, 20, _("Talker")); btnConnectTalker->selection_color(FL_DARK_GREEN); btnConnectTalker->callback((Fl_Callback*)cb_btnConnectTalker); } // Fl_Light_Button* btnConnectTalker { Fl_Box* o = new Fl_Box(357, 127, 345, 20, _("Connect/disconnect to Talker socket server")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btn_auto_talk = new Fl_Check_Button(278, 155, 391, 15, _("Auto connect when fldigi opens (server must be up)")); btn_auto_talk->down_box(FL_DOWN_BOX); btn_auto_talk->callback((Fl_Callback*)cb_btn_auto_talk); o->value(progdefaults.auto_talk); } // Fl_Check_Button* btn_auto_talk grpTalker->end(); } // Fl_Group* grpTalker { Fl_Group* o = new Fl_Group(252, 47, 490, 56, _("Capture rx text to external file")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkRxStream = new Fl_Check_Button(278, 74, 175, 20, _("Enable rx text stream")); chkRxStream->tooltip(_("Send rx text to file: textout.txt")); chkRxStream->down_box(FL_DOWN_BOX); chkRxStream->callback((Fl_Callback*)cb_chkRxStream); o->value(progdefaults.speak); } // Fl_Check_Button* chkRxStream o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/Rx text capture")); config_pages.push_back(p); tab_tree->add(_("Misc/Rx text capture")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/Save Parameters")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Check_Button* o = btnTXLEVEL_by_mode = new Fl_Check_Button(360, 96, 235, 30, _("Transmit level control")); btnTXLEVEL_by_mode->tooltip(_("Save transmit level control by mode")); btnTXLEVEL_by_mode->down_box(FL_DOWN_BOX); btnTXLEVEL_by_mode->value(1); btnTXLEVEL_by_mode->callback((Fl_Callback*)cb_btnTXLEVEL_by_mode); o->value(progdefaults.txlevel_by_mode); } // Fl_Check_Button* btnTXLEVEL_by_mode { Fl_Check_Button* o = btnSQLCH_by_mode = new Fl_Check_Button(360, 140, 270, 30, _("Squelch level/activated control(s)")); btnSQLCH_by_mode->tooltip(_("Save Squelch level and state by mode")); btnSQLCH_by_mode->down_box(FL_DOWN_BOX); btnSQLCH_by_mode->value(1); btnSQLCH_by_mode->callback((Fl_Callback*)cb_btnSQLCH_by_mode); o->value(progdefaults.sqlch_by_mode); } // Fl_Check_Button* btnSQLCH_by_mode { Fl_Box* o = new Fl_Box(211, 28, 575, 39, _("Enable specific parameter to Save & Restore on a per mode/band basis.")); o->box(FL_ENGRAVED_BOX); o->color((Fl_Color)53); o->labelsize(13); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btnAFC_by_mode = new Fl_Check_Button(360, 184, 270, 30, _("AFC control")); btnAFC_by_mode->tooltip(_("Save AFC state by mode")); btnAFC_by_mode->down_box(FL_DOWN_BOX); btnAFC_by_mode->value(1); btnAFC_by_mode->callback((Fl_Callback*)cb_btnAFC_by_mode); o->value(progdefaults.afc_by_mode); } // Fl_Check_Button* btnAFC_by_mode { Fl_Check_Button* o = btnREVERSE_by_mode = new Fl_Check_Button(360, 228, 270, 30, _("Reverse (Rv) control")); btnREVERSE_by_mode->tooltip(_("Save Reverse state by mode")); btnREVERSE_by_mode->down_box(FL_DOWN_BOX); btnREVERSE_by_mode->value(1); btnREVERSE_by_mode->callback((Fl_Callback*)cb_btnREVERSE_by_mode); o->value(progdefaults.reverse_by_mode); } // Fl_Check_Button* btnREVERSE_by_mode CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/Save Parameters")); config_pages.push_back(p); tab_tree->add(_("Misc/Save Parameters")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/Sweet Spot")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(253, 70, 490, 75); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Value_Input2* o = valCWsweetspot = new Fl_Value_Input2(290, 81, 65, 20, _("CW")); valCWsweetspot->tooltip(_("Default CW tracking point")); valCWsweetspot->box(FL_DOWN_BOX); valCWsweetspot->color(FL_BACKGROUND2_COLOR); valCWsweetspot->selection_color(FL_SELECTION_COLOR); valCWsweetspot->labeltype(FL_NORMAL_LABEL); valCWsweetspot->labelfont(0); valCWsweetspot->labelsize(14); valCWsweetspot->labelcolor(FL_FOREGROUND_COLOR); valCWsweetspot->minimum(200); valCWsweetspot->maximum(4000); valCWsweetspot->step(1); valCWsweetspot->value(1000); valCWsweetspot->callback((Fl_Callback*)cb_valCWsweetspot); valCWsweetspot->align(Fl_Align(FL_ALIGN_LEFT)); valCWsweetspot->when(FL_WHEN_CHANGED); o->value(progdefaults.CWsweetspot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* valCWsweetspot { Fl_Value_Input2* o = valRTTYsweetspot = new Fl_Value_Input2(468, 81, 65, 20, _("RTTY")); valRTTYsweetspot->tooltip(_("Default RTTY tracking point")); valRTTYsweetspot->box(FL_DOWN_BOX); valRTTYsweetspot->color(FL_BACKGROUND2_COLOR); valRTTYsweetspot->selection_color(FL_SELECTION_COLOR); valRTTYsweetspot->labeltype(FL_NORMAL_LABEL); valRTTYsweetspot->labelfont(0); valRTTYsweetspot->labelsize(14); valRTTYsweetspot->labelcolor(FL_FOREGROUND_COLOR); valRTTYsweetspot->minimum(200); valRTTYsweetspot->maximum(4000); valRTTYsweetspot->step(1); valRTTYsweetspot->value(1000); valRTTYsweetspot->callback((Fl_Callback*)cb_valRTTYsweetspot); valRTTYsweetspot->align(Fl_Align(FL_ALIGN_LEFT)); valRTTYsweetspot->when(FL_WHEN_CHANGED); o->value(progdefaults.RTTYsweetspot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* valRTTYsweetspot { Fl_Value_Input2* o = valPSKsweetspot = new Fl_Value_Input2(668, 81, 65, 20, _("PSK et al.")); valPSKsweetspot->tooltip(_("Default for all other modems")); valPSKsweetspot->box(FL_DOWN_BOX); valPSKsweetspot->color(FL_BACKGROUND2_COLOR); valPSKsweetspot->selection_color(FL_SELECTION_COLOR); valPSKsweetspot->labeltype(FL_NORMAL_LABEL); valPSKsweetspot->labelfont(0); valPSKsweetspot->labelsize(14); valPSKsweetspot->labelcolor(FL_FOREGROUND_COLOR); valPSKsweetspot->minimum(200); valPSKsweetspot->maximum(4000); valPSKsweetspot->step(1); valPSKsweetspot->value(1000); valPSKsweetspot->callback((Fl_Callback*)cb_valPSKsweetspot); valPSKsweetspot->align(Fl_Align(FL_ALIGN_LEFT)); valPSKsweetspot->when(FL_WHEN_CHANGED); o->value(progdefaults.PSKsweetspot); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* valPSKsweetspot { Fl_Check_Button* o = btnStartAtSweetSpot = new Fl_Check_Button(263, 111, 348, 20, _("Always start new modems at these frequencies")); btnStartAtSweetSpot->tooltip(_("ON - start at default\nOFF - keep current wf cursor position")); btnStartAtSweetSpot->down_box(FL_DOWN_BOX); btnStartAtSweetSpot->value(1); btnStartAtSweetSpot->callback((Fl_Callback*)cb_btnStartAtSweetSpot); o->value(progdefaults.StartAtSweetSpot); } // Fl_Check_Button* btnStartAtSweetSpot o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(253, 150, 490, 60, _("K3 A1A configuation")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnCWIsLSB = new Fl_Check_Button(468, 171, 70, 15, _("CW is LSB")); btnCWIsLSB->tooltip(_("Select this for Elecraft K3\nOther radios should not need it.")); btnCWIsLSB->down_box(FL_DOWN_BOX); btnCWIsLSB->callback((Fl_Callback*)cb_btnCWIsLSB); o->value(progdefaults.CWIsLSB); } // Fl_Check_Button* btnCWIsLSB o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/Sweet Spot")); config_pages.push_back(p); tab_tree->add(_("Misc/Sweet Spot")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Misc/TCP-IP sessions")); o->box(FL_ENGRAVED_BOX); o->callback((Fl_Callback*)cb_Misc); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 18, 588, 102); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnDisable_p2p_io_widgets = new Fl_Check_Button(211, 96, 85, 20, _("Lock")); btnDisable_p2p_io_widgets->tooltip(_("Allow/Disallow Changes")); btnDisable_p2p_io_widgets->down_box(FL_DOWN_BOX); btnDisable_p2p_io_widgets->callback((Fl_Callback*)cb_btnDisable_p2p_io_widgets); o->value(progStatus.ip_lock); } // Fl_Check_Button* btnDisable_p2p_io_widgets { Fl_Check_Button* o = btnEnable_arq = new Fl_Check_Button(295, 96, 115, 20, _("Enable ARQ")); btnEnable_arq->tooltip(_("Used For PSKMail and FLDIGI Suite of Programs")); btnEnable_arq->type(102); btnEnable_arq->down_box(FL_DOWN_BOX); btnEnable_arq->callback((Fl_Callback*)cb_btnEnable_arq); if(progStatus.data_io_enabled == ARQ_IO) o->value(true); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_arq { Fl_Check_Button* o = btnEnable_kiss = new Fl_Check_Button(420, 96, 115, 20, _("Enable KISS")); btnEnable_kiss->tooltip(_("Used for BPQ32")); btnEnable_kiss->type(102); btnEnable_kiss->down_box(FL_DOWN_BOX); btnEnable_kiss->callback((Fl_Callback*)cb_btnEnable_kiss); if(progStatus.data_io_enabled == KISS_IO) o->value(true); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_kiss { new Fl_Box(207, 21, 582, 72, _("Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\nEnable KIS\ S for programs that supports TCP/UDP and TNC-2 KISS protocol.\nOnly one interf\ ace (ARQ/KISS) can be active at any given time.\nKISS/ARQ/XML Addr/Port change\ s require program restart.")); } // Fl_Box* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 122, 588, 80, _("KISS")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = txtKiss_ip_address = new Fl_Input2(254, 175, 230, 22, _("Addr")); txtKiss_ip_address->tooltip(_("IP Address for KISS interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: i\ .e. localhost")); txtKiss_ip_address->box(FL_DOWN_BOX); txtKiss_ip_address->color(FL_BACKGROUND2_COLOR); txtKiss_ip_address->selection_color(FL_SELECTION_COLOR); txtKiss_ip_address->labeltype(FL_NORMAL_LABEL); txtKiss_ip_address->labelfont(0); txtKiss_ip_address->labelsize(14); txtKiss_ip_address->labelcolor(FL_FOREGROUND_COLOR); txtKiss_ip_address->callback((Fl_Callback*)cb_txtKiss_ip_address); txtKiss_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); txtKiss_ip_address->when(FL_WHEN_CHANGED); txtKiss_ip_address->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.kiss_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtKiss_ip_address { Fl_Input2* o = txtKiss_ip_io_port_no = new Fl_Input2(529, 175, 55, 22, _("I/O")); txtKiss_ip_io_port_no->tooltip(_("IP Address Port Number")); txtKiss_ip_io_port_no->box(FL_DOWN_BOX); txtKiss_ip_io_port_no->color(FL_BACKGROUND2_COLOR); txtKiss_ip_io_port_no->selection_color(FL_SELECTION_COLOR); txtKiss_ip_io_port_no->labeltype(FL_NORMAL_LABEL); txtKiss_ip_io_port_no->labelfont(0); txtKiss_ip_io_port_no->labelsize(14); txtKiss_ip_io_port_no->labelcolor(FL_FOREGROUND_COLOR); txtKiss_ip_io_port_no->callback((Fl_Callback*)cb_txtKiss_ip_io_port_no); txtKiss_ip_io_port_no->align(Fl_Align(FL_ALIGN_RIGHT)); txtKiss_ip_io_port_no->when(FL_WHEN_CHANGED); txtKiss_ip_io_port_no->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.kiss_io_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtKiss_ip_io_port_no { Fl_Input2* o = txtKiss_ip_out_port_no = new Fl_Input2(621, 175, 55, 22, _("O")); txtKiss_ip_out_port_no->tooltip(_("Output port number when same IP address used")); txtKiss_ip_out_port_no->box(FL_DOWN_BOX); txtKiss_ip_out_port_no->color(FL_BACKGROUND2_COLOR); txtKiss_ip_out_port_no->selection_color(FL_SELECTION_COLOR); txtKiss_ip_out_port_no->labeltype(FL_NORMAL_LABEL); txtKiss_ip_out_port_no->labelfont(0); txtKiss_ip_out_port_no->labelsize(14); txtKiss_ip_out_port_no->labelcolor(FL_FOREGROUND_COLOR); txtKiss_ip_out_port_no->callback((Fl_Callback*)cb_txtKiss_ip_out_port_no); txtKiss_ip_out_port_no->align(Fl_Align(FL_ALIGN_RIGHT)); txtKiss_ip_out_port_no->when(FL_WHEN_CHANGED); txtKiss_ip_out_port_no->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.kiss_out_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtKiss_ip_out_port_no { Fl_Check_Button* o = btnEnable_dual_port = new Fl_Check_Button(330, 126, 140, 20, _("DP")); btnEnable_dual_port->tooltip(_("Enable when both programs are using the same IP address")); btnEnable_dual_port->down_box(FL_DOWN_BOX); btnEnable_dual_port->callback((Fl_Callback*)cb_btnEnable_dual_port); if(progdefaults.kiss_dual_port_enabled) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_dual_port { Fl_Button* o = btn_restart_kiss = new Fl_Button(705, 149, 82, 22, _("Restart")); btn_restart_kiss->callback((Fl_Callback*)cb_btn_restart_kiss); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_restart_kiss { Fl_Button* o = btn_connect_kiss_io = new Fl_Button(617, 149, 82, 22, _("Start")); btn_connect_kiss_io->tooltip(_("Return KISS TCP IO connection to a Listening state")); btn_connect_kiss_io->callback((Fl_Callback*)cb_btn_connect_kiss_io); (progStatus.ip_lock || !progdefaults.kiss_tcp_io) ? o->deactivate() : o->activate(); } // Fl_Button* btn_connect_kiss_io { Fl_Button* o = btnDefault_kiss_ip = new Fl_Button(705, 175, 82, 22, _("Default")); btnDefault_kiss_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_kiss_ip->callback((Fl_Callback*)cb_btnDefault_kiss_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_kiss_ip { Fl_Check_Button* o = btnKissTCPIO = new Fl_Check_Button(416, 126, 70, 20, _("TCP/IP")); btnKissTCPIO->tooltip(_("Check to enable TCP/IP IO Connection")); btnKissTCPIO->down_box(FL_DOWN_BOX); btnKissTCPIO->callback((Fl_Callback*)cb_btnKissTCPIO); if(progdefaults.kiss_tcp_io) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnKissTCPIO { Fl_Check_Button* o = btnKissUDPIO = new Fl_Check_Button(254, 126, 70, 20, _("UDP/IP")); btnKissUDPIO->tooltip(_("Check to enable UDP/IP IO")); btnKissUDPIO->down_box(FL_DOWN_BOX); btnKissUDPIO->callback((Fl_Callback*)cb_btnKissUDPIO); if(progdefaults.kiss_tcp_io) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnKissUDPIO { Fl_Check_Button* o = btnKissTCPListen = new Fl_Check_Button(500, 126, 95, 20, _("Listen / Bind")); btnKissTCPListen->tooltip(_("Monitor for TCP connection.")); btnKissTCPListen->down_box(FL_DOWN_BOX); btnKissTCPListen->callback((Fl_Callback*)cb_btnKissTCPListen); if(progStatus.kiss_tcp_listen) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnKissTCPListen { Fl_Check_Button* o = btnEnable_7bit_modem_inhibit = new Fl_Check_Button(254, 149, 140, 20, _("Inhibit 7bit Modem")); btnEnable_7bit_modem_inhibit->tooltip(_("Inhibit 7 bit modem change notice on user or RSID reception")); btnEnable_7bit_modem_inhibit->down_box(FL_DOWN_BOX); btnEnable_7bit_modem_inhibit->callback((Fl_Callback*)cb_btnEnable_7bit_modem_inhibit); if(progdefaults.kiss_io_modem_change_inhibit) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_7bit_modem_inhibit { Fl_Check_Button* o = btnEnable_auto_connect = new Fl_Check_Button(416, 149, 155, 20, _("Auto Connect / Retry")); btnEnable_auto_connect->tooltip(_("Connect to host program on FLDIGI start up")); btnEnable_auto_connect->down_box(FL_DOWN_BOX); btnEnable_auto_connect->callback((Fl_Callback*)cb_btnEnable_auto_connect); if(progdefaults.tcp_udp_auto_connect) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_auto_connect { Fl_Check_Button* o = btnEnable_ax25_decode = new Fl_Check_Button(610, 126, 115, 20, _("AX25 Decode")); btnEnable_ax25_decode->tooltip(_("Decode AX25 Packets into human readable form")); btnEnable_ax25_decode->down_box(FL_DOWN_BOX); btnEnable_ax25_decode->callback((Fl_Callback*)cb_btnEnable_ax25_decode); if(progdefaults.ax25_decode_enabled) o->value(true); else o->value(false); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Check_Button* btnEnable_ax25_decode o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 203, 588, 35, _("ARQ")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input2* o = txtArq_ip_address = new Fl_Input2(255, 207, 230, 22, _("Addr")); txtArq_ip_address->tooltip(_("IP Address for ARQ interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: i.\ e. localhost")); txtArq_ip_address->box(FL_DOWN_BOX); txtArq_ip_address->color(FL_BACKGROUND2_COLOR); txtArq_ip_address->selection_color(FL_SELECTION_COLOR); txtArq_ip_address->labeltype(FL_NORMAL_LABEL); txtArq_ip_address->labelfont(0); txtArq_ip_address->labelsize(14); txtArq_ip_address->labelcolor(FL_FOREGROUND_COLOR); txtArq_ip_address->callback((Fl_Callback*)cb_txtArq_ip_address); txtArq_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); txtArq_ip_address->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.arq_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtArq_ip_address { Fl_Input2* o = txtArq_ip_port_no = new Fl_Input2(529, 207, 55, 22, _("Port")); txtArq_ip_port_no->tooltip(_("IP Address Port Number")); txtArq_ip_port_no->box(FL_DOWN_BOX); txtArq_ip_port_no->color(FL_BACKGROUND2_COLOR); txtArq_ip_port_no->selection_color(FL_SELECTION_COLOR); txtArq_ip_port_no->labeltype(FL_NORMAL_LABEL); txtArq_ip_port_no->labelfont(0); txtArq_ip_port_no->labelsize(14); txtArq_ip_port_no->labelcolor(FL_FOREGROUND_COLOR); txtArq_ip_port_no->callback((Fl_Callback*)cb_txtArq_ip_port_no); txtArq_ip_port_no->align(Fl_Align(FL_ALIGN_RIGHT)); txtArq_ip_port_no->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.arq_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtArq_ip_port_no { Fl_Button* o = btnDefault_arq_ip = new Fl_Button(624, 207, 73, 22, _("Default")); btnDefault_arq_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_arq_ip->callback((Fl_Callback*)cb_btnDefault_arq_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_arq_ip { Fl_Button* o = btn_restart_arq = new Fl_Button(704, 207, 82, 22, _("Restart")); btn_restart_arq->callback((Fl_Callback*)cb_btn_restart_arq); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_restart_arq o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 239, 588, 35, _("XML")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnDefault_xmlrpc_ip = new Fl_Button(624, 243, 73, 22, _("Default")); btnDefault_xmlrpc_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_xmlrpc_ip->callback((Fl_Callback*)cb_btnDefault_xmlrpc_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_xmlrpc_ip { Fl_Input2* o = txtXmlrpc_ip_address = new Fl_Input2(255, 243, 230, 22, _("Addr")); txtXmlrpc_ip_address->tooltip(_("IP Address for XMLRPC interface\nIP Address format: nnn.nnn.nnn.nnn\nor name:\ i.e. localhost")); txtXmlrpc_ip_address->box(FL_DOWN_BOX); txtXmlrpc_ip_address->color(FL_BACKGROUND2_COLOR); txtXmlrpc_ip_address->selection_color(FL_SELECTION_COLOR); txtXmlrpc_ip_address->labeltype(FL_NORMAL_LABEL); txtXmlrpc_ip_address->labelfont(0); txtXmlrpc_ip_address->labelsize(14); txtXmlrpc_ip_address->labelcolor(FL_FOREGROUND_COLOR); txtXmlrpc_ip_address->callback((Fl_Callback*)cb_txtXmlrpc_ip_address); txtXmlrpc_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); txtXmlrpc_ip_address->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.xmlrpc_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtXmlrpc_ip_address { Fl_Input2* o = txtXmlrpc_ip_port_no = new Fl_Input2(529, 243, 55, 22, _("Port")); txtXmlrpc_ip_port_no->tooltip(_("IP Address Port Number")); txtXmlrpc_ip_port_no->box(FL_DOWN_BOX); txtXmlrpc_ip_port_no->color(FL_BACKGROUND2_COLOR); txtXmlrpc_ip_port_no->selection_color(FL_SELECTION_COLOR); txtXmlrpc_ip_port_no->labeltype(FL_NORMAL_LABEL); txtXmlrpc_ip_port_no->labelfont(0); txtXmlrpc_ip_port_no->labelsize(14); txtXmlrpc_ip_port_no->labelcolor(FL_FOREGROUND_COLOR); txtXmlrpc_ip_port_no->callback((Fl_Callback*)cb_txtXmlrpc_ip_port_no); txtXmlrpc_ip_port_no->align(Fl_Align(FL_ALIGN_RIGHT)); txtXmlrpc_ip_port_no->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.xmlrpc_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txtXmlrpc_ip_port_no { Fl_Button* o = btn_restart_xml = new Fl_Button(704, 243, 82, 22, _("Restart")); btn_restart_xml->callback((Fl_Callback*)cb_btn_restart_xml); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_restart_xml o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 277, 588, 30, _("flrig")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnDefault_flrig_ip = new Fl_Button(624, 282, 73, 25, _("Default")); btnDefault_flrig_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_flrig_ip->callback((Fl_Callback*)cb_btnDefault_flrig_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_flrig_ip { Fl_Input2* o = txt_flrig_ip_address = new Fl_Input2(255, 282, 230, 22, _("Addr")); txt_flrig_ip_address->tooltip(_("IP Address for flrig interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: \ i.e. localhost")); txt_flrig_ip_address->box(FL_DOWN_BOX); txt_flrig_ip_address->color(FL_BACKGROUND2_COLOR); txt_flrig_ip_address->selection_color(FL_SELECTION_COLOR); txt_flrig_ip_address->labeltype(FL_NORMAL_LABEL); txt_flrig_ip_address->labelfont(0); txt_flrig_ip_address->labelsize(14); txt_flrig_ip_address->labelcolor(FL_FOREGROUND_COLOR); txt_flrig_ip_address->callback((Fl_Callback*)cb_txt_flrig_ip_address); txt_flrig_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); txt_flrig_ip_address->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.flrig_ip_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txt_flrig_ip_address { Fl_Input2* o = txt_flrig_ip_port = new Fl_Input2(529, 282, 55, 22, _("Port")); txt_flrig_ip_port->tooltip(_("IP Address Port Number")); txt_flrig_ip_port->box(FL_DOWN_BOX); txt_flrig_ip_port->color(FL_BACKGROUND2_COLOR); txt_flrig_ip_port->selection_color(FL_SELECTION_COLOR); txt_flrig_ip_port->labeltype(FL_NORMAL_LABEL); txt_flrig_ip_port->labelfont(0); txt_flrig_ip_port->labelsize(14); txt_flrig_ip_port->labelcolor(FL_FOREGROUND_COLOR); txt_flrig_ip_port->callback((Fl_Callback*)cb_txt_flrig_ip_port); txt_flrig_ip_port->align(Fl_Align(FL_ALIGN_RIGHT)); txt_flrig_ip_port->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.flrig_ip_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input2* txt_flrig_ip_port { Fl_Button* o = btn_reconnect_flrig_server = new Fl_Button(704, 282, 82, 22, _("Reconnect")); btn_reconnect_flrig_server->callback((Fl_Callback*)cb_btn_reconnect_flrig_server); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_reconnect_flrig_server o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 308, 588, 36, _("fllog")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Input* o = txt_fllog_ip_address = new Fl_Input(255, 313, 230, 22, _("Addr")); txt_fllog_ip_address->tooltip(_("IP Address for fllog interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: \ i.e. localhost")); txt_fllog_ip_address->callback((Fl_Callback*)cb_txt_fllog_ip_address); txt_fllog_ip_address->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.xmllog_address.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input* txt_fllog_ip_address { Fl_Input* o = txt_fllog_ip_port = new Fl_Input(529, 313, 55, 22, _("Port")); txt_fllog_ip_port->tooltip(_("IP Address Port Number")); txt_fllog_ip_port->callback((Fl_Callback*)cb_txt_fllog_ip_port); txt_fllog_ip_port->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.xmllog_port.c_str()); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Input* txt_fllog_ip_port { Fl_Button* o = btn_reconnect_log_server = new Fl_Button(704, 313, 82, 22, _("Reconnect")); btn_reconnect_log_server->callback((Fl_Callback*)cb_btn_reconnect_log_server); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btn_reconnect_log_server { Fl_Button* o = btnDefault_fllog_ip = new Fl_Button(624, 313, 73, 22, _("Default")); btnDefault_fllog_ip->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_fllog_ip->callback((Fl_Callback*)cb_btnDefault_fllog_ip); progStatus.ip_lock ? o->deactivate() : o->activate(); } // Fl_Button* btnDefault_fllog_ip o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Misc/TCP-IP sessions")); config_pages.push_back(p); tab_tree->add(_("Misc/TCP-IP sessions")); tab_tree->close(_("Misc")); o->end(); } // Fl_Group* o { Fl_Group* o = grpOperator = new Fl_Group(200, 0, 600, 350, _("Operator-Station")); grpOperator->box(FL_ENGRAVED_BOX); grpOperator->color(FL_LIGHT1); grpOperator->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); grpOperator->hide(); { inpMyCallsign = new Fl_Input2(386, 54, 110, 24, _("Station Callsign:")); inpMyCallsign->tooltip(_("Station callsign")); inpMyCallsign->box(FL_DOWN_BOX); inpMyCallsign->color(FL_BACKGROUND2_COLOR); inpMyCallsign->selection_color(FL_SELECTION_COLOR); inpMyCallsign->labeltype(FL_NORMAL_LABEL); inpMyCallsign->labelfont(0); inpMyCallsign->labelsize(14); inpMyCallsign->labelcolor(FL_FOREGROUND_COLOR); inpMyCallsign->callback((Fl_Callback*)cb_inpMyCallsign); inpMyCallsign->align(Fl_Align(FL_ALIGN_LEFT)); inpMyCallsign->when(FL_WHEN_CHANGED); inpMyCallsign->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyCallsign { Fl_Input2* o = inpOperCallsign = new Fl_Input2(386, 84, 110, 24, _("Operator Callsign:")); inpOperCallsign->tooltip(_("Operator callsign (if different than station callsign)")); inpOperCallsign->box(FL_DOWN_BOX); inpOperCallsign->color(FL_BACKGROUND2_COLOR); inpOperCallsign->selection_color(FL_SELECTION_COLOR); inpOperCallsign->labeltype(FL_NORMAL_LABEL); inpOperCallsign->labelfont(0); inpOperCallsign->labelsize(14); inpOperCallsign->labelcolor(FL_FOREGROUND_COLOR); inpOperCallsign->callback((Fl_Callback*)cb_inpOperCallsign); inpOperCallsign->align(Fl_Align(FL_ALIGN_LEFT)); inpOperCallsign->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.operCall.c_str()); } // Fl_Input2* inpOperCallsign { inpMyName = new Fl_Input2(386, 115, 140, 24, _("Operator Name:")); inpMyName->tooltip(_("Operators name")); inpMyName->box(FL_DOWN_BOX); inpMyName->color(FL_BACKGROUND2_COLOR); inpMyName->selection_color(FL_SELECTION_COLOR); inpMyName->labeltype(FL_NORMAL_LABEL); inpMyName->labelfont(0); inpMyName->labelsize(14); inpMyName->labelcolor(FL_FOREGROUND_COLOR); inpMyName->callback((Fl_Callback*)cb_inpMyName); inpMyName->align(Fl_Align(FL_ALIGN_LEFT)); inpMyName->when(FL_WHEN_RELEASE); inpMyName->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyName { inpMyAntenna = new Fl_Input2(386, 145, 320, 24, _("Antenna:")); inpMyAntenna->tooltip(_("Short description of antenna")); inpMyAntenna->box(FL_DOWN_BOX); inpMyAntenna->color(FL_BACKGROUND2_COLOR); inpMyAntenna->selection_color(FL_SELECTION_COLOR); inpMyAntenna->labeltype(FL_NORMAL_LABEL); inpMyAntenna->labelfont(0); inpMyAntenna->labelsize(14); inpMyAntenna->labelcolor(FL_FOREGROUND_COLOR); inpMyAntenna->callback((Fl_Callback*)cb_inpMyAntenna); inpMyAntenna->align(Fl_Align(FL_ALIGN_LEFT)); inpMyAntenna->when(FL_WHEN_RELEASE); inpMyAntenna->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyAntenna { Fl_Input2* o = inpMyQth = new Fl_Input2(386, 176, 320, 24, _("Station City:")); inpMyQth->tooltip(_("Operators QTH")); inpMyQth->box(FL_DOWN_BOX); inpMyQth->color(FL_BACKGROUND2_COLOR); inpMyQth->selection_color(FL_SELECTION_COLOR); inpMyQth->labeltype(FL_NORMAL_LABEL); inpMyQth->labelfont(0); inpMyQth->labelsize(14); inpMyQth->labelcolor(FL_FOREGROUND_COLOR); inpMyQth->callback((Fl_Callback*)cb_inpMyQth); inpMyQth->align(Fl_Align(FL_ALIGN_LEFT)); inpMyQth->when(FL_WHEN_RELEASE); inpMyQth->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.myQth.c_str()); } // Fl_Input2* inpMyQth { inpMyLocator = new Fl_Input2(386, 206, 85, 24, _("Station Locator:")); inpMyLocator->tooltip(_("Maidenhead locator as in EM64qv")); inpMyLocator->box(FL_DOWN_BOX); inpMyLocator->color(FL_BACKGROUND2_COLOR); inpMyLocator->selection_color(FL_SELECTION_COLOR); inpMyLocator->labeltype(FL_NORMAL_LABEL); inpMyLocator->labelfont(0); inpMyLocator->labelsize(14); inpMyLocator->labelcolor(FL_FOREGROUND_COLOR); inpMyLocator->callback((Fl_Callback*)cb_inpMyLocator); inpMyLocator->align(Fl_Align(FL_ALIGN_LEFT)); inpMyLocator->when(FL_WHEN_RELEASE); inpMyLocator->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpMyLocator { Fl_ListBox* o = listbox_states = new Fl_ListBox(386, 237, 319, 24, _("State/Prov./Country")); listbox_states->tooltip(_("US States / Canadian Provinces")); listbox_states->box(FL_DOWN_BOX); listbox_states->color(FL_BACKGROUND2_COLOR); listbox_states->selection_color(FL_BACKGROUND_COLOR); listbox_states->labeltype(FL_NORMAL_LABEL); listbox_states->labelfont(0); listbox_states->labelsize(14); listbox_states->labelcolor(FL_FOREGROUND_COLOR); listbox_states->callback((Fl_Callback*)cb_listbox_states); listbox_states->align(Fl_Align(FL_ALIGN_LEFT)); listbox_states->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->add(states.names().c_str()); o->index(progdefaults.SQSOstate); listbox_states->end(); } // Fl_ListBox* listbox_states { Fl_Input2* o = inp_QP_state_short = new Fl_Input2(710, 237, 60, 24); inp_QP_state_short->tooltip(_("Abbreviation for State/Province")); inp_QP_state_short->box(FL_DOWN_BOX); inp_QP_state_short->color(FL_BACKGROUND2_COLOR); inp_QP_state_short->selection_color(FL_SELECTION_COLOR); inp_QP_state_short->labeltype(FL_NORMAL_LABEL); inp_QP_state_short->labelfont(0); inp_QP_state_short->labelsize(14); inp_QP_state_short->labelcolor(FL_FOREGROUND_COLOR); inp_QP_state_short->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_QP_state_short->when(FL_WHEN_RELEASE); o->value(states.state_short(listbox_states->value()).c_str()); } // Fl_Input2* inp_QP_state_short { Fl_ListBox* o = listbox_counties = new Fl_ListBox(386, 268, 319, 24, _("Counties / Regions")); listbox_counties->tooltip(_("US/Canadian Counties / Regions")); listbox_counties->box(FL_DOWN_BOX); listbox_counties->color(FL_BACKGROUND2_COLOR); listbox_counties->selection_color(FL_BACKGROUND_COLOR); listbox_counties->labeltype(FL_NORMAL_LABEL); listbox_counties->labelfont(0); listbox_counties->labelsize(14); listbox_counties->labelcolor(FL_FOREGROUND_COLOR); listbox_counties->callback((Fl_Callback*)cb_listbox_counties); listbox_counties->align(Fl_Align(FL_ALIGN_LEFT)); listbox_counties->when(FL_WHEN_RELEASE); o->clear(); o->add(states.counties(listbox_states->value()).c_str()); o->index(progdefaults.SQSOcounty); o->labelsize(FL_NORMAL_SIZE); listbox_counties->end(); } // Fl_ListBox* listbox_counties { inp_QP_short_county = new Fl_Input2(710, 268, 60, 24); inp_QP_short_county->tooltip(_("Abbreviation for County/Region")); inp_QP_short_county->box(FL_DOWN_BOX); inp_QP_short_county->color(FL_BACKGROUND2_COLOR); inp_QP_short_county->selection_color(FL_SELECTION_COLOR); inp_QP_short_county->labeltype(FL_NORMAL_LABEL); inp_QP_short_county->labelfont(0); inp_QP_short_county->labelsize(14); inp_QP_short_county->labelcolor(FL_FOREGROUND_COLOR); inp_QP_short_county->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_QP_short_county->when(FL_WHEN_RELEASE); inp_QP_short_county->value(states.cnty_short(listbox_states->value(),listbox_counties->value()).c_str()); } // Fl_Input2* inp_QP_short_county CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Operator-Station")); config_pages.push_back(p); tab_tree->add(_("Operator-Station")); grpOperator->end(); } // Fl_Group* grpOperator { Fl_Group* o = grpRigFlrig = new Fl_Group(200, 0, 600, 350, _("Rig Control/flrig")); grpRigFlrig->box(FL_ENGRAVED_BOX); grpRigFlrig->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); grpRigFlrig->hide(); { Fl_Group* o = new Fl_Group(209, 233, 580, 90, _("\"Disable PTT keys modem if multiple instances of fldigi (client)\nare connec\ ted to a single flrig (server).")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chk_flrig_keys_modem = new Fl_Check_Button(439, 281, 183, 20, _("Flrig PTT keys modem")); chk_flrig_keys_modem->tooltip(_("\" \"")); chk_flrig_keys_modem->down_box(FL_DOWN_BOX); chk_flrig_keys_modem->callback((Fl_Callback*)cb_chk_flrig_keys_modem); o->value(progdefaults.flrig_keys_modem); } // Fl_Check_Button* chk_flrig_keys_modem o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(209, 148, 580, 81, _("flrig xmlrpc server parameters\nthese controls are mirrored on the IO configu\ ration tab")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnDefault_flrig_ip_mirror = new Fl_Button(613, 194, 73, 24, _("Default")); btnDefault_flrig_ip_mirror->tooltip(_("Returns IP Address and port\nnumber to the default value.")); btnDefault_flrig_ip_mirror->callback((Fl_Callback*)cb_btnDefault_flrig_ip_mirror); } // Fl_Button* btnDefault_flrig_ip_mirror { Fl_Input2* o = txt_flrig_ip_address_mirror = new Fl_Input2(244, 194, 230, 24, _("Addr")); txt_flrig_ip_address_mirror->tooltip(_("IP Address for flrig interface\nIP Address format: nnn.nnn.nnn.nnn\nor name: \ i.e. localhost")); txt_flrig_ip_address_mirror->box(FL_DOWN_BOX); txt_flrig_ip_address_mirror->color(FL_BACKGROUND2_COLOR); txt_flrig_ip_address_mirror->selection_color(FL_SELECTION_COLOR); txt_flrig_ip_address_mirror->labeltype(FL_NORMAL_LABEL); txt_flrig_ip_address_mirror->labelfont(0); txt_flrig_ip_address_mirror->labelsize(14); txt_flrig_ip_address_mirror->labelcolor(FL_FOREGROUND_COLOR); txt_flrig_ip_address_mirror->callback((Fl_Callback*)cb_txt_flrig_ip_address_mirror); txt_flrig_ip_address_mirror->align(Fl_Align(FL_ALIGN_RIGHT)); txt_flrig_ip_address_mirror->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.flrig_ip_address.c_str()); } // Fl_Input2* txt_flrig_ip_address_mirror { Fl_Input2* o = txt_flrig_ip_port_mirror = new Fl_Input2(518, 194, 55, 24, _("Port")); txt_flrig_ip_port_mirror->tooltip(_("IP Address Port Number")); txt_flrig_ip_port_mirror->box(FL_DOWN_BOX); txt_flrig_ip_port_mirror->color(FL_BACKGROUND2_COLOR); txt_flrig_ip_port_mirror->selection_color(FL_SELECTION_COLOR); txt_flrig_ip_port_mirror->labeltype(FL_NORMAL_LABEL); txt_flrig_ip_port_mirror->labelfont(0); txt_flrig_ip_port_mirror->labelsize(14); txt_flrig_ip_port_mirror->labelcolor(FL_FOREGROUND_COLOR); txt_flrig_ip_port_mirror->callback((Fl_Callback*)cb_txt_flrig_ip_port_mirror); txt_flrig_ip_port_mirror->align(Fl_Align(FL_ALIGN_RIGHT)); txt_flrig_ip_port_mirror->when(FL_WHEN_CHANGED); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.flrig_ip_port.c_str()); } // Fl_Input2* txt_flrig_ip_port_mirror { btn_reconnect_flrig_server_mirror = new Fl_Button(693, 194, 82, 24, _("Reconnect")); btn_reconnect_flrig_server_mirror->tooltip(_("Press only if you change the address/port")); btn_reconnect_flrig_server_mirror->callback((Fl_Callback*)cb_btn_reconnect_flrig_server_mirror); } // Fl_Button* btn_reconnect_flrig_server_mirror o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(209, 54, 580, 90, _("flrig is the preferred method of tranceiver control")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_fldigi_client_to_flrig = new Fl_Check_Button(234, 81, 70, 15, _("Enable flrig xcvr control with fldigi as client")); btn_fldigi_client_to_flrig->tooltip(_("Disable if flrig not used.")); btn_fldigi_client_to_flrig->down_box(FL_DOWN_BOX); btn_fldigi_client_to_flrig->callback((Fl_Callback*)cb_btn_fldigi_client_to_flrig); o->value(progdefaults.fldigi_client_to_flrig); } // Fl_Check_Button* btn_fldigi_client_to_flrig { Fl_Check_Button* o = btn_flrig_auto_shutdown = new Fl_Check_Button(234, 112, 70, 15, _("Shutdown flrig with fldigi")); btn_flrig_auto_shutdown->tooltip(_("Disable if flrig not used.")); btn_flrig_auto_shutdown->down_box(FL_DOWN_BOX); btn_flrig_auto_shutdown->callback((Fl_Callback*)cb_btn_flrig_auto_shutdown); o->value(progdefaults.flrig_auto_shutdown); } // Fl_Check_Button* btn_flrig_auto_shutdown { Fl_Counter2* o = val_flrig_poll = new Fl_Counter2(620, 107, 130, 24, _("Poll Interval (msec)")); val_flrig_poll->tooltip(_("Request updates every \'poll interval\' milliseconds")); val_flrig_poll->box(FL_UP_BOX); val_flrig_poll->color(FL_BACKGROUND_COLOR); val_flrig_poll->selection_color(FL_INACTIVE_COLOR); val_flrig_poll->labeltype(FL_NORMAL_LABEL); val_flrig_poll->labelfont(0); val_flrig_poll->labelsize(14); val_flrig_poll->labelcolor(FL_FOREGROUND_COLOR); val_flrig_poll->minimum(50); val_flrig_poll->maximum(5000); val_flrig_poll->step(10); val_flrig_poll->value(1); val_flrig_poll->callback((Fl_Callback*)cb_val_flrig_poll); val_flrig_poll->align(Fl_Align(FL_ALIGN_LEFT)); val_flrig_poll->when(FL_WHEN_CHANGED); o->value(progdefaults.flrig_poll); o->labelsize(FL_NORMAL_SIZE); o->lstep(100); } // Fl_Counter2* val_flrig_poll o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/flrig")); config_pages.push_back(p); tab_tree->add(_("Rig Control/flrig")); grpRigFlrig->end(); } // Fl_Group* grpRigFlrig { Fl_Group* o = grpRigCat = new Fl_Group(200, 0, 600, 350, _("Rig Control/CAT (rigcat)")); grpRigCat->box(FL_ENGRAVED_BOX); grpRigCat->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); grpRigCat->hide(); { chkUSERIGCAT = new Fl_Check_Button(434, 32, 110, 20, _("Use RigCAT")); chkUSERIGCAT->tooltip(_("RigCAT used for rig control")); chkUSERIGCAT->down_box(FL_DOWN_BOX); chkUSERIGCAT->callback((Fl_Callback*)cb_chkUSERIGCAT); } // Fl_Check_Button* chkUSERIGCAT { grpRigCAT = new Fl_Group(244, 55, 490, 279); grpRigCAT->box(FL_ENGRAVED_FRAME); grpRigCAT->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Output* o = txtXmlRigFilename = new Fl_Output(254, 79, 130, 22, _("Rig description file:")); txtXmlRigFilename->tooltip(_("Use Open to select descriptor file")); txtXmlRigFilename->color(FL_LIGHT2); txtXmlRigFilename->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(fl_filename_name(progdefaults.XmlRigFilename.c_str())); } // Fl_Output* txtXmlRigFilename { btnSelectRigXmlFile = new Fl_Button(387, 79, 60, 22, _("Open...")); btnSelectRigXmlFile->tooltip(_("Select rig descriptor file")); btnSelectRigXmlFile->callback((Fl_Callback*)cb_btnSelectRigXmlFile); btnSelectRigXmlFile->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Button* btnSelectRigXmlFile { Fl_ComboBox* o = inpXmlRigDevice = new Fl_ComboBox(580, 79, 144, 22, _("Device:")); inpXmlRigDevice->box(FL_DOWN_BOX); inpXmlRigDevice->color(FL_BACKGROUND2_COLOR); inpXmlRigDevice->selection_color(FL_BACKGROUND_COLOR); inpXmlRigDevice->labeltype(FL_NORMAL_LABEL); inpXmlRigDevice->labelfont(0); inpXmlRigDevice->labelsize(14); inpXmlRigDevice->labelcolor(FL_FOREGROUND_COLOR); inpXmlRigDevice->callback((Fl_Callback*)cb_inpXmlRigDevice); inpXmlRigDevice->align(Fl_Align(FL_ALIGN_LEFT)); inpXmlRigDevice->when(FL_WHEN_RELEASE); o->value(progdefaults.XmlRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE); inpXmlRigDevice->end(); } // Fl_ComboBox* inpXmlRigDevice { Fl_Value_Input2* o = cntRigCatRetries = new Fl_Value_Input2(269, 122, 60, 22, _("Retries")); cntRigCatRetries->tooltip(_("# retries before giving up")); cntRigCatRetries->box(FL_DOWN_BOX); cntRigCatRetries->color(FL_BACKGROUND2_COLOR); cntRigCatRetries->selection_color(FL_SELECTION_COLOR); cntRigCatRetries->labeltype(FL_NORMAL_LABEL); cntRigCatRetries->labelfont(0); cntRigCatRetries->labelsize(14); cntRigCatRetries->labelcolor(FL_FOREGROUND_COLOR); cntRigCatRetries->maximum(1000); cntRigCatRetries->step(1); cntRigCatRetries->callback((Fl_Callback*)cb_cntRigCatRetries); cntRigCatRetries->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatRetries->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatRetries); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatRetries { Fl_Value_Input2* o = cntRigCatTimeout = new Fl_Value_Input2(399, 122, 60, 22, _("Retry interval (ms)")); cntRigCatTimeout->tooltip(_("Time between retires in msec")); cntRigCatTimeout->box(FL_DOWN_BOX); cntRigCatTimeout->color(FL_BACKGROUND2_COLOR); cntRigCatTimeout->selection_color(FL_SELECTION_COLOR); cntRigCatTimeout->labeltype(FL_NORMAL_LABEL); cntRigCatTimeout->labelfont(0); cntRigCatTimeout->labelsize(14); cntRigCatTimeout->labelcolor(FL_FOREGROUND_COLOR); cntRigCatTimeout->maximum(10000); cntRigCatTimeout->step(1); cntRigCatTimeout->callback((Fl_Callback*)cb_cntRigCatTimeout); cntRigCatTimeout->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatTimeout->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatTimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatTimeout { Fl_Value_Input2* o = cntRigCatWait = new Fl_Value_Input2(269, 162, 60, 22, _("Write delay (ms)")); cntRigCatWait->tooltip(_("Wait for response to subsequent command")); cntRigCatWait->box(FL_DOWN_BOX); cntRigCatWait->color(FL_BACKGROUND2_COLOR); cntRigCatWait->selection_color(FL_SELECTION_COLOR); cntRigCatWait->labeltype(FL_NORMAL_LABEL); cntRigCatWait->labelfont(0); cntRigCatWait->labelsize(14); cntRigCatWait->labelcolor(FL_FOREGROUND_COLOR); cntRigCatWait->maximum(10000); cntRigCatWait->step(1); cntRigCatWait->callback((Fl_Callback*)cb_cntRigCatWait); cntRigCatWait->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatWait->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatWait); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatWait { Fl_ListBox* o = listbox_xml_rig_baudrate = new Fl_ListBox(625, 122, 99, 22, _("Baud rate:")); listbox_xml_rig_baudrate->box(FL_DOWN_BOX); listbox_xml_rig_baudrate->color(FL_BACKGROUND2_COLOR); listbox_xml_rig_baudrate->selection_color(FL_BACKGROUND_COLOR); listbox_xml_rig_baudrate->labeltype(FL_NORMAL_LABEL); listbox_xml_rig_baudrate->labelfont(0); listbox_xml_rig_baudrate->labelsize(14); listbox_xml_rig_baudrate->labelcolor(FL_FOREGROUND_COLOR); listbox_xml_rig_baudrate->callback((Fl_Callback*)cb_listbox_xml_rig_baudrate); listbox_xml_rig_baudrate->align(Fl_Align(FL_ALIGN_LEFT)); listbox_xml_rig_baudrate->when(FL_WHEN_RELEASE); o->add(szBaudRates); o->index(progdefaults.XmlRigBaudrate); o->labelsize(FL_NORMAL_SIZE); listbox_xml_rig_baudrate->end(); } // Fl_ListBox* listbox_xml_rig_baudrate { Fl_Counter2* o = valRigCatStopbits = new Fl_Counter2(627, 156, 95, 21, _("Stopbits")); valRigCatStopbits->type(1); valRigCatStopbits->box(FL_UP_BOX); valRigCatStopbits->color(FL_BACKGROUND_COLOR); valRigCatStopbits->selection_color(FL_INACTIVE_COLOR); valRigCatStopbits->labeltype(FL_NORMAL_LABEL); valRigCatStopbits->labelfont(0); valRigCatStopbits->labelsize(14); valRigCatStopbits->labelcolor(FL_FOREGROUND_COLOR); valRigCatStopbits->minimum(1); valRigCatStopbits->maximum(2); valRigCatStopbits->step(1); valRigCatStopbits->value(1); valRigCatStopbits->callback((Fl_Callback*)cb_valRigCatStopbits); valRigCatStopbits->align(Fl_Align(FL_ALIGN_LEFT)); valRigCatStopbits->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatStopbits); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valRigCatStopbits { btnInitRIGCAT = new Fl_Button(604, 293, 113, 24, _("Initialize")); btnInitRIGCAT->tooltip(_("Initialize RigCAT interface")); btnInitRIGCAT->callback((Fl_Callback*)cb_btnInitRIGCAT); btnInitRIGCAT->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Button* btnInitRIGCAT { Fl_Check_Button* o = btnRigCatEcho = new Fl_Check_Button(289, 188, 192, 22, _("Commands are echoed")); btnRigCatEcho->tooltip(_("Rig or interface echos serial data")); btnRigCatEcho->down_box(FL_DOWN_BOX); btnRigCatEcho->callback((Fl_Callback*)cb_btnRigCatEcho); o->value(progdefaults.RigCatECHO); } // Fl_Check_Button* btnRigCatEcho { Fl_Round_Button* o = btnRigCatCMDptt = new Fl_Round_Button(495, 189, 207, 20, _("CAT command for PTT")); btnRigCatCMDptt->tooltip(_("PTT is a CAT command (not hardware)")); btnRigCatCMDptt->down_box(FL_DOWN_BOX); btnRigCatCMDptt->selection_color((Fl_Color)1); btnRigCatCMDptt->callback((Fl_Callback*)cb_btnRigCatCMDptt); o->value(progdefaults.RigCatCMDptt); } // Fl_Round_Button* btnRigCatCMDptt { Fl_Round_Button* o = btnRigCatRTSptt = new Fl_Round_Button(289, 218, 160, 20, _("Toggle RTS for PTT")); btnRigCatRTSptt->tooltip(_("RTS is ptt line")); btnRigCatRTSptt->down_box(FL_DOWN_BOX); btnRigCatRTSptt->callback((Fl_Callback*)cb_btnRigCatRTSptt); o->value(progdefaults.RigCatRTSptt); } // Fl_Round_Button* btnRigCatRTSptt { Fl_Round_Button* o = btnRigCatDTRptt = new Fl_Round_Button(495, 216, 160, 20, _("Toggle DTR for PTT")); btnRigCatDTRptt->tooltip(_("DTR is ptt line")); btnRigCatDTRptt->down_box(FL_DOWN_BOX); btnRigCatDTRptt->callback((Fl_Callback*)cb_btnRigCatDTRptt); o->value(progdefaults.RigCatDTRptt); } // Fl_Round_Button* btnRigCatDTRptt { Fl_Check_Button* o = btnRigCatRTSplus = new Fl_Check_Button(289, 247, 100, 20, _("RTS +12 v")); btnRigCatRTSplus->tooltip(_("Initial state of RTS")); btnRigCatRTSplus->down_box(FL_DOWN_BOX); btnRigCatRTSplus->callback((Fl_Callback*)cb_btnRigCatRTSplus); o->value(progdefaults.RigCatRTSplus); } // Fl_Check_Button* btnRigCatRTSplus { Fl_Check_Button* o = btnRigCatDTRplus = new Fl_Check_Button(495, 244, 100, 20, _("DTR +12 v")); btnRigCatDTRplus->tooltip(_("Initial state of DTR")); btnRigCatDTRplus->down_box(FL_DOWN_BOX); btnRigCatDTRplus->callback((Fl_Callback*)cb_btnRigCatDTRplus); o->value(progdefaults.RigCatDTRplus); } // Fl_Check_Button* btnRigCatDTRplus { Fl_Check_Button* o = chkRigCatRTSCTSflow = new Fl_Check_Button(289, 275, 170, 20, _("RTS/CTS flow control")); chkRigCatRTSCTSflow->tooltip(_("Rig uses RTS/CTS handshake")); chkRigCatRTSCTSflow->down_box(FL_DOWN_BOX); chkRigCatRTSCTSflow->callback((Fl_Callback*)cb_chkRigCatRTSCTSflow); o->value(progdefaults.RigCatRTSCTSflow); } // Fl_Check_Button* chkRigCatRTSCTSflow { Fl_Check_Button* o = chk_restore_tio = new Fl_Check_Button(289, 304, 205, 20, _("Restore UART Settings on Close")); chk_restore_tio->tooltip(_("Restore the serial (COM) port settings")); chk_restore_tio->down_box(FL_DOWN_BOX); chk_restore_tio->callback((Fl_Callback*)cb_chk_restore_tio); o->value(progdefaults.RigCatRestoreTIO); } // Fl_Check_Button* chk_restore_tio { Fl_Check_Button* o = chkRigCatVSP = new Fl_Check_Button(495, 272, 100, 25, _("VSP Enable")); chkRigCatVSP->tooltip(_("Virtual Serial Port Emulator - suppress WARNINGS")); chkRigCatVSP->down_box(FL_DOWN_BOX); chkRigCatVSP->callback((Fl_Callback*)cb_chkRigCatVSP); o->value(progdefaults.RigCatVSP); } // Fl_Check_Button* chkRigCatVSP { Fl_Value_Input2* o = cntRigCatInitDelay = new Fl_Value_Input2(399, 162, 75, 22, _("Init delay (ms)")); cntRigCatInitDelay->tooltip(_("Wait for response to first CAT command")); cntRigCatInitDelay->box(FL_DOWN_BOX); cntRigCatInitDelay->color(FL_BACKGROUND2_COLOR); cntRigCatInitDelay->selection_color(FL_SELECTION_COLOR); cntRigCatInitDelay->labeltype(FL_NORMAL_LABEL); cntRigCatInitDelay->labelfont(0); cntRigCatInitDelay->labelsize(14); cntRigCatInitDelay->labelcolor(FL_FOREGROUND_COLOR); cntRigCatInitDelay->maximum(10000); cntRigCatInitDelay->step(1); cntRigCatInitDelay->callback((Fl_Callback*)cb_cntRigCatInitDelay); cntRigCatInitDelay->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntRigCatInitDelay->when(FL_WHEN_CHANGED); o->value(progdefaults.RigCatInitDelay); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntRigCatInitDelay grpRigCAT->end(); } // Fl_Group* grpRigCAT CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/CAT (rigcat)")); config_pages.push_back(p); tab_tree->add(_("Rig Control/CAT (rigcat)")); grpRigCat->end(); } // Fl_Group* grpRigCat { Fl_Group* o = grpRigGPIO = new Fl_Group(200, 0, 600, 350, _("Rig Control/GPIO")); grpRigGPIO->box(FL_ENGRAVED_BOX); grpRigGPIO->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); grpRigGPIO->hide(); { Fl_Check_Button* o = btn_gpio_ptt2 = new Fl_Check_Button(256, 25, 330, 15, _("Enable GPIO PTT (Pi specific controls)")); btn_gpio_ptt2->tooltip(_("Select PTT on state")); btn_gpio_ptt2->down_box(FL_DOWN_BOX); btn_gpio_ptt2->labelfont(4); btn_gpio_ptt2->callback((Fl_Callback*)cb_btn_gpio_ptt2); o->value(progdefaults.gpio_ptt); } // Fl_Check_Button* btn_gpio_ptt2 { btnInitHWPTT2 = new Fl_Button(640, 20, 113, 24, _("Initialize")); btnInitHWPTT2->tooltip(_("Initialize the H/W PTT interface")); btnInitHWPTT2->callback((Fl_Callback*)cb_btnInitHWPTT2); } // Fl_Button* btnInitHWPTT2 { Fl_Box* o = new Fl_Box(265, 53, 189, 17, _("BCM GPIO pin Value")); o->labelfont(4); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btn_enable_gpio[0] = new Fl_Check_Button(255, 78, 125, 15, _("17 00 11")); btn_enable_gpio[0]->tooltip(_("Select pin number")); btn_enable_gpio[0]->down_box(FL_DOWN_BOX); btn_enable_gpio[0]->labelfont(4); btn_enable_gpio[0]->callback((Fl_Callback*)cb_btn_enable_gpio); o->value(progdefaults.enable_gpio & 0x01); } // Fl_Check_Button* btn_enable_gpio[0] { Fl_Check_Button* o = btn_enable_gpio[1] = new Fl_Check_Button(255, 107, 125, 15, _("18 01 12")); btn_enable_gpio[1]->tooltip(_("Select pin number")); btn_enable_gpio[1]->down_box(FL_DOWN_BOX); btn_enable_gpio[1]->labelfont(4); btn_enable_gpio[1]->callback((Fl_Callback*)cb_btn_enable_gpio1); o->value((progdefaults.enable_gpio >> 1) & 0x01); } // Fl_Check_Button* btn_enable_gpio[1] { Fl_Check_Button* o = btn_enable_gpio[2] = new Fl_Check_Button(255, 137, 125, 15, _("27 02 13")); btn_enable_gpio[2]->tooltip(_("Select pin number")); btn_enable_gpio[2]->down_box(FL_DOWN_BOX); btn_enable_gpio[2]->labelfont(4); btn_enable_gpio[2]->callback((Fl_Callback*)cb_btn_enable_gpio2); o->value((progdefaults.enable_gpio >> 2) & 0x01); } // Fl_Check_Button* btn_enable_gpio[2] { Fl_Check_Button* o = btn_enable_gpio[3] = new Fl_Check_Button(255, 167, 125, 15, _("22 03 15")); btn_enable_gpio[3]->tooltip(_("Select pin number")); btn_enable_gpio[3]->down_box(FL_DOWN_BOX); btn_enable_gpio[3]->labelfont(4); btn_enable_gpio[3]->callback((Fl_Callback*)cb_btn_enable_gpio3); o->value((progdefaults.enable_gpio >> 3) & 0x01); } // Fl_Check_Button* btn_enable_gpio[3] { Fl_Check_Button* o = btn_enable_gpio[4] = new Fl_Check_Button(255, 197, 125, 15, _("23 04 16")); btn_enable_gpio[4]->tooltip(_("Select pin number")); btn_enable_gpio[4]->down_box(FL_DOWN_BOX); btn_enable_gpio[4]->labelfont(4); btn_enable_gpio[4]->callback((Fl_Callback*)cb_btn_enable_gpio4); o->value((progdefaults.enable_gpio >> 4) & 0x01); } // Fl_Check_Button* btn_enable_gpio[4] { Fl_Check_Button* o = btn_enable_gpio[5] = new Fl_Check_Button(255, 227, 125, 15, _("24 05 18")); btn_enable_gpio[5]->tooltip(_("Select pin number")); btn_enable_gpio[5]->down_box(FL_DOWN_BOX); btn_enable_gpio[5]->labelfont(4); btn_enable_gpio[5]->callback((Fl_Callback*)cb_btn_enable_gpio5); o->value((progdefaults.enable_gpio >> 5) & 0x01); } // Fl_Check_Button* btn_enable_gpio[5] { Fl_Check_Button* o = btn_enable_gpio[6] = new Fl_Check_Button(255, 257, 125, 15, _("25 06 22")); btn_enable_gpio[6]->tooltip(_("Select pin number")); btn_enable_gpio[6]->down_box(FL_DOWN_BOX); btn_enable_gpio[6]->labelfont(4); btn_enable_gpio[6]->callback((Fl_Callback*)cb_btn_enable_gpio6); o->value((progdefaults.enable_gpio >> 6) & 0x01); } // Fl_Check_Button* btn_enable_gpio[6] { Fl_Check_Button* o = btn_enable_gpio[7] = new Fl_Check_Button(255, 287, 125, 15, _(" 4 07 7")); btn_enable_gpio[7]->tooltip(_("Select pin number")); btn_enable_gpio[7]->down_box(FL_DOWN_BOX); btn_enable_gpio[7]->labelfont(4); btn_enable_gpio[7]->callback((Fl_Callback*)cb_btn_enable_gpio7); o->value((progdefaults.enable_gpio >> 7) & 0x01); } // Fl_Check_Button* btn_enable_gpio[7] { Fl_Check_Button* o = btn_enable_gpio[8] = new Fl_Check_Button(515, 78, 125, 15, _(" 5 21 29")); btn_enable_gpio[8]->tooltip(_("Select pin number")); btn_enable_gpio[8]->down_box(FL_DOWN_BOX); btn_enable_gpio[8]->labelfont(4); btn_enable_gpio[8]->callback((Fl_Callback*)cb_btn_enable_gpio8); o->value((progdefaults.enable_gpio >> 8) & 0x01); } // Fl_Check_Button* btn_enable_gpio[8] { Fl_Check_Button* o = btn_enable_gpio[9] = new Fl_Check_Button(515, 107, 125, 15, _(" 6 22 31")); btn_enable_gpio[9]->tooltip(_("Select pin number")); btn_enable_gpio[9]->down_box(FL_DOWN_BOX); btn_enable_gpio[9]->labelfont(4); btn_enable_gpio[9]->callback((Fl_Callback*)cb_btn_enable_gpio9); o->value((progdefaults.enable_gpio >> 9) & 0x01); } // Fl_Check_Button* btn_enable_gpio[9] { Fl_Check_Button* o = btn_enable_gpio[10] = new Fl_Check_Button(515, 137, 125, 15, _("13 23 33")); btn_enable_gpio[10]->tooltip(_("Select pin number")); btn_enable_gpio[10]->down_box(FL_DOWN_BOX); btn_enable_gpio[10]->labelfont(4); btn_enable_gpio[10]->callback((Fl_Callback*)cb_btn_enable_gpioa); o->value((progdefaults.enable_gpio >> 10) & 0x01); } // Fl_Check_Button* btn_enable_gpio[10] { Fl_Check_Button* o = btn_enable_gpio[11] = new Fl_Check_Button(515, 167, 125, 15, _("19 24 35")); btn_enable_gpio[11]->tooltip(_("Select pin number")); btn_enable_gpio[11]->down_box(FL_DOWN_BOX); btn_enable_gpio[11]->labelfont(4); btn_enable_gpio[11]->callback((Fl_Callback*)cb_btn_enable_gpiob); o->value((progdefaults.enable_gpio >> 11) & 0x01); } // Fl_Check_Button* btn_enable_gpio[11] { Fl_Check_Button* o = btn_enable_gpio[12] = new Fl_Check_Button(515, 197, 125, 15, _("26 25 37")); btn_enable_gpio[12]->tooltip(_("Select pin number")); btn_enable_gpio[12]->down_box(FL_DOWN_BOX); btn_enable_gpio[12]->labelfont(4); btn_enable_gpio[12]->callback((Fl_Callback*)cb_btn_enable_gpioc); o->value((progdefaults.enable_gpio >> 12) & 0x01); } // Fl_Check_Button* btn_enable_gpio[12] { Fl_Check_Button* o = btn_enable_gpio[13] = new Fl_Check_Button(515, 227, 125, 15, _("12 26 32")); btn_enable_gpio[13]->tooltip(_("Select pin number")); btn_enable_gpio[13]->down_box(FL_DOWN_BOX); btn_enable_gpio[13]->labelfont(4); btn_enable_gpio[13]->callback((Fl_Callback*)cb_btn_enable_gpiod); o->value((progdefaults.enable_gpio >> 13) & 0x01); } // Fl_Check_Button* btn_enable_gpio[13] { Fl_Check_Button* o = btn_enable_gpio[14] = new Fl_Check_Button(515, 257, 125, 15, _("16 27 36")); btn_enable_gpio[14]->tooltip(_("Select pin number")); btn_enable_gpio[14]->down_box(FL_DOWN_BOX); btn_enable_gpio[14]->labelfont(4); btn_enable_gpio[14]->callback((Fl_Callback*)cb_btn_enable_gpioe); o->value((progdefaults.enable_gpio >> 14) & 0x01); } // Fl_Check_Button* btn_enable_gpio[14] { Fl_Check_Button* o = btn_enable_gpio[15] = new Fl_Check_Button(515, 287, 125, 15, _("20 28 38")); btn_enable_gpio[15]->tooltip(_("Select pin number")); btn_enable_gpio[15]->down_box(FL_DOWN_BOX); btn_enable_gpio[15]->labelfont(4); btn_enable_gpio[15]->callback((Fl_Callback*)cb_btn_enable_gpiof); o->value((progdefaults.enable_gpio >> 15) & 0x01); } // Fl_Check_Button* btn_enable_gpio[15] { Fl_Check_Button* o = btn_enable_gpio[16] = new Fl_Check_Button(515, 317, 125, 15, _("21 29 40")); btn_enable_gpio[16]->tooltip(_("Select pin number")); btn_enable_gpio[16]->down_box(FL_DOWN_BOX); btn_enable_gpio[16]->labelfont(4); btn_enable_gpio[16]->callback((Fl_Callback*)cb_btn_enable_gpio10); o->value((progdefaults.enable_gpio >> 16) & 0x01); } // Fl_Check_Button* btn_enable_gpio[16] { Fl_Check_Button* o = btn_gpio_on[0] = new Fl_Check_Button(395, 77, 84, 15, _("= 1 (on)")); btn_gpio_on[0]->tooltip(_("Select PTT on state")); btn_gpio_on[0]->down_box(FL_DOWN_BOX); btn_gpio_on[0]->labelfont(4); btn_gpio_on[0]->callback((Fl_Callback*)cb_btn_gpio_on); o->value((progdefaults.gpio_on) & 0x01); } // Fl_Check_Button* btn_gpio_on[0] { Fl_Check_Button* o = btn_gpio_on[1] = new Fl_Check_Button(395, 107, 84, 15, _("= 1 (on)")); btn_gpio_on[1]->tooltip(_("Select PTT on state")); btn_gpio_on[1]->down_box(FL_DOWN_BOX); btn_gpio_on[1]->labelfont(4); btn_gpio_on[1]->callback((Fl_Callback*)cb_btn_gpio_on1); o->value((progdefaults.gpio_on >> 1) & 0x01); } // Fl_Check_Button* btn_gpio_on[1] { Fl_Check_Button* o = btn_gpio_on[2] = new Fl_Check_Button(395, 137, 84, 15, _("= 1 (on)")); btn_gpio_on[2]->tooltip(_("Select PTT on state")); btn_gpio_on[2]->down_box(FL_DOWN_BOX); btn_gpio_on[2]->labelfont(4); btn_gpio_on[2]->callback((Fl_Callback*)cb_btn_gpio_on2); o->value((progdefaults.gpio_on >> 2) & 0x01); } // Fl_Check_Button* btn_gpio_on[2] { Fl_Check_Button* o = btn_gpio_on[3] = new Fl_Check_Button(395, 167, 84, 15, _("= 1 (on)")); btn_gpio_on[3]->tooltip(_("Select PTT on state")); btn_gpio_on[3]->down_box(FL_DOWN_BOX); btn_gpio_on[3]->labelfont(4); btn_gpio_on[3]->callback((Fl_Callback*)cb_btn_gpio_on3); o->value((progdefaults.gpio_on >> 3) & 0x01); } // Fl_Check_Button* btn_gpio_on[3] { Fl_Check_Button* o = btn_gpio_on[4] = new Fl_Check_Button(395, 197, 84, 15, _("= 1 (on)")); btn_gpio_on[4]->tooltip(_("Select PTT on state")); btn_gpio_on[4]->down_box(FL_DOWN_BOX); btn_gpio_on[4]->labelfont(4); btn_gpio_on[4]->callback((Fl_Callback*)cb_btn_gpio_on4); o->value((progdefaults.gpio_on >> 4) & 0x01); } // Fl_Check_Button* btn_gpio_on[4] { Fl_Check_Button* o = btn_gpio_on[5] = new Fl_Check_Button(395, 227, 84, 15, _("= 1 (on)")); btn_gpio_on[5]->tooltip(_("Select PTT on state")); btn_gpio_on[5]->down_box(FL_DOWN_BOX); btn_gpio_on[5]->labelfont(4); btn_gpio_on[5]->callback((Fl_Callback*)cb_btn_gpio_on5); o->value((progdefaults.gpio_on >> 5) & 0x01); } // Fl_Check_Button* btn_gpio_on[5] { Fl_Check_Button* o = btn_gpio_on[6] = new Fl_Check_Button(395, 257, 84, 15, _("= 1 (on)")); btn_gpio_on[6]->tooltip(_("Select PTT on state")); btn_gpio_on[6]->down_box(FL_DOWN_BOX); btn_gpio_on[6]->labelfont(4); btn_gpio_on[6]->callback((Fl_Callback*)cb_btn_gpio_on6); o->value((progdefaults.gpio_on >> 6) & 0x01); } // Fl_Check_Button* btn_gpio_on[6] { Fl_Check_Button* o = btn_gpio_on[7] = new Fl_Check_Button(395, 287, 84, 15, _("= 1 (on)")); btn_gpio_on[7]->tooltip(_("Select PTT on state")); btn_gpio_on[7]->down_box(FL_DOWN_BOX); btn_gpio_on[7]->labelfont(4); btn_gpio_on[7]->callback((Fl_Callback*)cb_btn_gpio_on7); o->value((progdefaults.gpio_on >> 7) & 0x01); } // Fl_Check_Button* btn_gpio_on[7] { Fl_Check_Button* o = btn_gpio_on[8] = new Fl_Check_Button(655, 78, 84, 15, _("= 1 (on)")); btn_gpio_on[8]->tooltip(_("Select PTT on state")); btn_gpio_on[8]->down_box(FL_DOWN_BOX); btn_gpio_on[8]->labelfont(4); btn_gpio_on[8]->callback((Fl_Callback*)cb_btn_gpio_on8); o->value((progdefaults.gpio_on >> 8) & 0x01); } // Fl_Check_Button* btn_gpio_on[8] { Fl_Check_Button* o = btn_gpio_on[9] = new Fl_Check_Button(655, 107, 84, 15, _("= 1 (on)")); btn_gpio_on[9]->tooltip(_("Select PTT on state")); btn_gpio_on[9]->down_box(FL_DOWN_BOX); btn_gpio_on[9]->labelfont(4); btn_gpio_on[9]->callback((Fl_Callback*)cb_btn_gpio_on9); o->value((progdefaults.gpio_on >> 9) & 0x01); } // Fl_Check_Button* btn_gpio_on[9] { Fl_Check_Button* o = btn_gpio_on[10] = new Fl_Check_Button(655, 137, 84, 15, _("= 1 (on)")); btn_gpio_on[10]->tooltip(_("Select PTT on state")); btn_gpio_on[10]->down_box(FL_DOWN_BOX); btn_gpio_on[10]->labelfont(4); btn_gpio_on[10]->callback((Fl_Callback*)cb_btn_gpio_ona); o->value((progdefaults.gpio_on >> 10) & 0x01); } // Fl_Check_Button* btn_gpio_on[10] { Fl_Check_Button* o = btn_gpio_on[11] = new Fl_Check_Button(655, 167, 84, 15, _("= 1 (on)")); btn_gpio_on[11]->tooltip(_("Select PTT on state")); btn_gpio_on[11]->down_box(FL_DOWN_BOX); btn_gpio_on[11]->labelfont(4); btn_gpio_on[11]->callback((Fl_Callback*)cb_btn_gpio_onb); o->value((progdefaults.gpio_on >> 11) & 0x01); } // Fl_Check_Button* btn_gpio_on[11] { Fl_Check_Button* o = btn_gpio_on[12] = new Fl_Check_Button(655, 197, 84, 15, _("= 1 (on)")); btn_gpio_on[12]->tooltip(_("Select PTT on state")); btn_gpio_on[12]->down_box(FL_DOWN_BOX); btn_gpio_on[12]->labelfont(4); btn_gpio_on[12]->callback((Fl_Callback*)cb_btn_gpio_onc); o->value((progdefaults.gpio_on >> 12) & 0x01); } // Fl_Check_Button* btn_gpio_on[12] { Fl_Check_Button* o = btn_gpio_on[13] = new Fl_Check_Button(655, 227, 84, 15, _("= 1 (on)")); btn_gpio_on[13]->tooltip(_("Select PTT on state")); btn_gpio_on[13]->down_box(FL_DOWN_BOX); btn_gpio_on[13]->labelfont(4); btn_gpio_on[13]->callback((Fl_Callback*)cb_btn_gpio_ond); o->value((progdefaults.gpio_on >> 13) & 0x01); } // Fl_Check_Button* btn_gpio_on[13] { Fl_Check_Button* o = btn_gpio_on[14] = new Fl_Check_Button(655, 257, 84, 15, _("= 1 (on)")); btn_gpio_on[14]->tooltip(_("Select PTT on state")); btn_gpio_on[14]->down_box(FL_DOWN_BOX); btn_gpio_on[14]->labelfont(4); btn_gpio_on[14]->callback((Fl_Callback*)cb_btn_gpio_one); o->value((progdefaults.gpio_on >> 14) & 0x01); } // Fl_Check_Button* btn_gpio_on[14] { Fl_Check_Button* o = btn_gpio_on[15] = new Fl_Check_Button(655, 287, 84, 15, _("= 1 (on)")); btn_gpio_on[15]->tooltip(_("Select PTT on state")); btn_gpio_on[15]->down_box(FL_DOWN_BOX); btn_gpio_on[15]->labelfont(4); btn_gpio_on[15]->callback((Fl_Callback*)cb_btn_gpio_onf); o->value((progdefaults.gpio_on >> 15) & 0x01); } // Fl_Check_Button* btn_gpio_on[15] { Fl_Check_Button* o = btn_gpio_on[16] = new Fl_Check_Button(655, 317, 84, 15, _("= 1 (on)")); btn_gpio_on[16]->tooltip(_("Select PTT on state")); btn_gpio_on[16]->down_box(FL_DOWN_BOX); btn_gpio_on[16]->labelfont(4); btn_gpio_on[16]->callback((Fl_Callback*)cb_btn_gpio_on10); o->value((progdefaults.gpio_on >> 16) & 0x01); } // Fl_Check_Button* btn_gpio_on[16] { Fl_Box* o = new Fl_Box(525, 53, 194, 17, _("BCM GPIO pin Value")); o->labelfont(4); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Counter* o = cnt_gpio_pulse_width = new Fl_Counter(255, 314, 80, 21, _("Pulse width (msec)")); cnt_gpio_pulse_width->tooltip(_("Set >0 if pulsed PTT used")); cnt_gpio_pulse_width->type(1); cnt_gpio_pulse_width->minimum(0); cnt_gpio_pulse_width->maximum(50); cnt_gpio_pulse_width->step(1); cnt_gpio_pulse_width->callback((Fl_Callback*)cb_cnt_gpio_pulse_width); cnt_gpio_pulse_width->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.gpio_pulse_width); } // Fl_Counter* cnt_gpio_pulse_width CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/GPIO")); config_pages.push_back(p); tab_tree->add(_("Rig Control/GPIO")); grpRigGPIO->end(); } // Fl_Group* grpRigGPIO { Fl_Group* o = grpRigHamlib = new Fl_Group(200, 0, 600, 350, _("Rig Control/Hamlib")); grpRigHamlib->box(FL_ENGRAVED_BOX); grpRigHamlib->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); grpRigHamlib->hide(); { chkUSEHAMLIB = new Fl_Check_Button(451, 21, 100, 20, _("Use Hamlib")); chkUSEHAMLIB->tooltip(_("Hamlib used for rig control")); chkUSEHAMLIB->down_box(FL_DOWN_BOX); chkUSEHAMLIB->callback((Fl_Callback*)cb_chkUSEHAMLIB); } // Fl_Check_Button* chkUSEHAMLIB { grpHamlib = new Fl_Group(206, 51, 585, 293); grpHamlib->box(FL_ENGRAVED_FRAME); { Fl_ListBox* o = cboHamlibRig = new Fl_ListBox(242, 61, 250, 22, _("Rig:")); cboHamlibRig->box(FL_DOWN_BOX); cboHamlibRig->color(FL_BACKGROUND2_COLOR); cboHamlibRig->selection_color(FL_BACKGROUND_COLOR); cboHamlibRig->labeltype(FL_NORMAL_LABEL); cboHamlibRig->labelfont(0); cboHamlibRig->labelsize(14); cboHamlibRig->labelcolor(FL_FOREGROUND_COLOR); cboHamlibRig->callback((Fl_Callback*)cb_cboHamlibRig); cboHamlibRig->align(Fl_Align(FL_ALIGN_LEFT)); cboHamlibRig->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); cboHamlibRig->end(); } // Fl_ListBox* cboHamlibRig { Fl_ComboBox* o = inpRIGdev = new Fl_ComboBox(556, 61, 220, 22, _("Device:")); inpRIGdev->box(FL_DOWN_BOX); inpRIGdev->color(FL_BACKGROUND2_COLOR); inpRIGdev->selection_color(FL_BACKGROUND_COLOR); inpRIGdev->labeltype(FL_NORMAL_LABEL); inpRIGdev->labelfont(0); inpRIGdev->labelsize(14); inpRIGdev->labelcolor(FL_FOREGROUND_COLOR); inpRIGdev->callback((Fl_Callback*)cb_inpRIGdev); inpRIGdev->align(Fl_Align(FL_ALIGN_LEFT)); inpRIGdev->when(FL_WHEN_RELEASE); o->value(progdefaults.HamRigDevice.c_str()); o->labelsize(FL_NORMAL_SIZE); inpRIGdev->end(); } // Fl_ComboBox* inpRIGdev { Fl_Value_Input2* o = cntHamlibRetries = new Fl_Value_Input2(241, 101, 70, 24, _("Retries")); cntHamlibRetries->tooltip(_("# times to resend command before giving up")); cntHamlibRetries->box(FL_DOWN_BOX); cntHamlibRetries->color(FL_BACKGROUND2_COLOR); cntHamlibRetries->selection_color(FL_SELECTION_COLOR); cntHamlibRetries->labeltype(FL_NORMAL_LABEL); cntHamlibRetries->labelfont(0); cntHamlibRetries->labelsize(14); cntHamlibRetries->labelcolor(FL_FOREGROUND_COLOR); cntHamlibRetries->maximum(1000); cntHamlibRetries->step(1); cntHamlibRetries->callback((Fl_Callback*)cb_cntHamlibRetries); cntHamlibRetries->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibRetries->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibRetries); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibRetries { Fl_Value_Input2* o = cntHamlibTimeout = new Fl_Value_Input2(381, 101, 70, 24, _("Timeout (msec)")); cntHamlibTimeout->tooltip(_("Hamlib read timeout")); cntHamlibTimeout->box(FL_DOWN_BOX); cntHamlibTimeout->color(FL_BACKGROUND2_COLOR); cntHamlibTimeout->selection_color(FL_SELECTION_COLOR); cntHamlibTimeout->labeltype(FL_NORMAL_LABEL); cntHamlibTimeout->labelfont(0); cntHamlibTimeout->labelsize(14); cntHamlibTimeout->labelcolor(FL_FOREGROUND_COLOR); cntHamlibTimeout->maximum(10000); cntHamlibTimeout->step(1); cntHamlibTimeout->callback((Fl_Callback*)cb_cntHamlibTimeout); cntHamlibTimeout->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibTimeout->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibTimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibTimeout { Fl_Value_Input2* o = cntHamlibWriteDelay = new Fl_Value_Input2(241, 144, 70, 24, _("Write delay (msec)")); cntHamlibWriteDelay->tooltip(_("Msec\'s between sequential commands")); cntHamlibWriteDelay->box(FL_DOWN_BOX); cntHamlibWriteDelay->color(FL_BACKGROUND2_COLOR); cntHamlibWriteDelay->selection_color(FL_SELECTION_COLOR); cntHamlibWriteDelay->labeltype(FL_NORMAL_LABEL); cntHamlibWriteDelay->labelfont(0); cntHamlibWriteDelay->labelsize(14); cntHamlibWriteDelay->labelcolor(FL_FOREGROUND_COLOR); cntHamlibWriteDelay->maximum(10000); cntHamlibWriteDelay->step(1); cntHamlibWriteDelay->callback((Fl_Callback*)cb_cntHamlibWriteDelay); cntHamlibWriteDelay->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibWriteDelay->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibWriteDelay); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibWriteDelay { Fl_Value_Input2* o = cntHamlibWait = new Fl_Value_Input2(381, 144, 70, 24, _("Post write delay (msec)")); cntHamlibWait->tooltip(_("Wait interval (msecs) before reading response")); cntHamlibWait->box(FL_DOWN_BOX); cntHamlibWait->color(FL_BACKGROUND2_COLOR); cntHamlibWait->selection_color(FL_SELECTION_COLOR); cntHamlibWait->labeltype(FL_NORMAL_LABEL); cntHamlibWait->labelfont(0); cntHamlibWait->labelsize(14); cntHamlibWait->labelcolor(FL_FOREGROUND_COLOR); cntHamlibWait->maximum(10000); cntHamlibWait->step(1); cntHamlibWait->callback((Fl_Callback*)cb_cntHamlibWait); cntHamlibWait->align(Fl_Align(FL_ALIGN_TOP_LEFT)); cntHamlibWait->when(FL_WHEN_CHANGED); o->value(progdefaults.HamlibWait); o->labelsize(FL_NORMAL_SIZE); } // Fl_Value_Input2* cntHamlibWait { Fl_ListBox* o = listbox_baudrate = new Fl_ListBox(677, 89, 99, 22, _("Baud rate:")); listbox_baudrate->box(FL_DOWN_BOX); listbox_baudrate->color(FL_BACKGROUND2_COLOR); listbox_baudrate->selection_color(FL_BACKGROUND_COLOR); listbox_baudrate->labeltype(FL_NORMAL_LABEL); listbox_baudrate->labelfont(0); listbox_baudrate->labelsize(14); listbox_baudrate->labelcolor(FL_FOREGROUND_COLOR); listbox_baudrate->callback((Fl_Callback*)cb_listbox_baudrate); listbox_baudrate->align(Fl_Align(FL_ALIGN_LEFT)); listbox_baudrate->when(FL_WHEN_RELEASE); o->add(szBaudRates); o->index(progdefaults.HamRigBaudrate); o->labelsize(FL_NORMAL_SIZE); listbox_baudrate->end(); } // Fl_ListBox* listbox_baudrate { Fl_Counter2* o = valHamRigStopbits = new Fl_Counter2(681, 117, 95, 21, _("Stopbits")); valHamRigStopbits->type(1); valHamRigStopbits->box(FL_UP_BOX); valHamRigStopbits->color(FL_BACKGROUND_COLOR); valHamRigStopbits->selection_color(FL_INACTIVE_COLOR); valHamRigStopbits->labeltype(FL_NORMAL_LABEL); valHamRigStopbits->labelfont(0); valHamRigStopbits->labelsize(14); valHamRigStopbits->labelcolor(FL_FOREGROUND_COLOR); valHamRigStopbits->minimum(1); valHamRigStopbits->maximum(2); valHamRigStopbits->step(1); valHamRigStopbits->value(1); valHamRigStopbits->callback((Fl_Callback*)cb_valHamRigStopbits); valHamRigStopbits->align(Fl_Align(FL_ALIGN_LEFT)); valHamRigStopbits->when(FL_WHEN_CHANGED); o->value(progdefaults.HamRigStopbits); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valHamRigStopbits { Fl_Counter2* o = valHamRigPollrate = new Fl_Counter2(681, 145, 95, 21, _("Polling Interval (msec)")); valHamRigPollrate->type(1); valHamRigPollrate->box(FL_UP_BOX); valHamRigPollrate->color(FL_BACKGROUND_COLOR); valHamRigPollrate->selection_color(FL_INACTIVE_COLOR); valHamRigPollrate->labeltype(FL_NORMAL_LABEL); valHamRigPollrate->labelfont(0); valHamRigPollrate->labelsize(14); valHamRigPollrate->labelcolor(FL_FOREGROUND_COLOR); valHamRigPollrate->minimum(100); valHamRigPollrate->maximum(2000); valHamRigPollrate->step(50); valHamRigPollrate->value(100); valHamRigPollrate->callback((Fl_Callback*)cb_valHamRigPollrate); valHamRigPollrate->align(Fl_Align(FL_ALIGN_LEFT)); valHamRigPollrate->when(FL_WHEN_CHANGED); o->value(progdefaults.HamRigPollrate); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* valHamRigPollrate { Fl_Check_Button* o = btnHamlibCMDptt = new Fl_Check_Button(256, 192, 215, 20, _("PTT via Hamlib command")); btnHamlibCMDptt->tooltip(_("PTT using hamlib command")); btnHamlibCMDptt->down_box(FL_DOWN_BOX); btnHamlibCMDptt->callback((Fl_Callback*)cb_btnHamlibCMDptt); o->value(progdefaults.HamlibCMDptt); } // Fl_Check_Button* btnHamlibCMDptt { Fl_Check_Button* o = btnHamlibPTT_ON_DATA = new Fl_Check_Button(256, 217, 215, 20, _("Audio on Auxiliary Port")); btnHamlibPTT_ON_DATA->tooltip(_("PTT enables auxiliary audio source")); btnHamlibPTT_ON_DATA->down_box(FL_DOWN_BOX); btnHamlibPTT_ON_DATA->callback((Fl_Callback*)cb_btnHamlibPTT_ON_DATA); o->value(progdefaults.hamlib_ptt_on_data); } // Fl_Check_Button* btnHamlibPTT_ON_DATA { Fl_Check_Button* o = btnHamlibDTRplus = new Fl_Check_Button(256, 243, 90, 20, _("DTR +12")); btnHamlibDTRplus->tooltip(_("Initial state of DTR")); btnHamlibDTRplus->down_box(FL_DOWN_BOX); btnHamlibDTRplus->callback((Fl_Callback*)cb_btnHamlibDTRplus); o->value(progdefaults.HamlibDTRplus); } // Fl_Check_Button* btnHamlibDTRplus { Fl_Check_Button* o = chkHamlibRTSplus = new Fl_Check_Button(446, 243, 85, 20, _("RTS +12")); chkHamlibRTSplus->tooltip(_("Initial state of RTS")); chkHamlibRTSplus->down_box(FL_DOWN_BOX); chkHamlibRTSplus->callback((Fl_Callback*)cb_chkHamlibRTSplus); o->value(progdefaults.HamlibRTSplus); } // Fl_Check_Button* chkHamlibRTSplus { Fl_Check_Button* o = chkHamlibRTSCTSflow = new Fl_Check_Button(256, 269, 170, 20, _("RTS/CTS flow control")); chkHamlibRTSCTSflow->tooltip(_("Rig requires RTS/CTS flow control")); chkHamlibRTSCTSflow->down_box(FL_DOWN_BOX); chkHamlibRTSCTSflow->callback((Fl_Callback*)cb_chkHamlibRTSCTSflow); o->value(progdefaults.HamlibRTSCTSflow); if (o->value()) chkHamlibRTSplus->deactivate(); } // Fl_Check_Button* chkHamlibRTSCTSflow { Fl_Check_Button* o = chkHamlibXONXOFFflow = new Fl_Check_Button(446, 269, 185, 20, _("XON/XOFF flow control")); chkHamlibXONXOFFflow->tooltip(_("Rig requires Xon/Xoff flow control")); chkHamlibXONXOFFflow->down_box(FL_DOWN_BOX); chkHamlibXONXOFFflow->callback((Fl_Callback*)cb_chkHamlibXONXOFFflow); o->value(progdefaults.HamlibXONXOFFflow); } // Fl_Check_Button* chkHamlibXONXOFFflow { Fl_Check_Button* o = chk_hamlib_cw_is_lsb = new Fl_Check_Button(636, 243, 142, 20, _("CW is LSB mode")); chk_hamlib_cw_is_lsb->tooltip(_("Check if xcvr uses LSB for CW")); chk_hamlib_cw_is_lsb->down_box(FL_DOWN_BOX); chk_hamlib_cw_is_lsb->callback((Fl_Callback*)cb_chk_hamlib_cw_is_lsb); o->value(progdefaults.hamlib_cw_islsb); } // Fl_Check_Button* chk_hamlib_cw_is_lsb { Fl_Check_Button* o = chk_hamlib_rtty_is_usb = new Fl_Check_Button(636, 269, 152, 20, _("RTTY is USB mode")); chk_hamlib_rtty_is_usb->tooltip(_("Check if xcvr uses USB for RTTY")); chk_hamlib_rtty_is_usb->down_box(FL_DOWN_BOX); chk_hamlib_rtty_is_usb->callback((Fl_Callback*)cb_chk_hamlib_rtty_is_usb); o->value(progdefaults.hamlib_rtty_isusb); } // Fl_Check_Button* chk_hamlib_rtty_is_usb { Fl_Counter2* o = val_hamlib_mode_delay = new Fl_Counter2(681, 191, 95, 21, _("Mode delay (msec)")); val_hamlib_mode_delay->tooltip(_("Delay NN msec after executing mode change")); val_hamlib_mode_delay->type(1); val_hamlib_mode_delay->box(FL_UP_BOX); val_hamlib_mode_delay->color(FL_BACKGROUND_COLOR); val_hamlib_mode_delay->selection_color(FL_INACTIVE_COLOR); val_hamlib_mode_delay->labeltype(FL_NORMAL_LABEL); val_hamlib_mode_delay->labelfont(0); val_hamlib_mode_delay->labelsize(14); val_hamlib_mode_delay->labelcolor(FL_FOREGROUND_COLOR); val_hamlib_mode_delay->minimum(0); val_hamlib_mode_delay->maximum(2000); val_hamlib_mode_delay->step(100); val_hamlib_mode_delay->value(200); val_hamlib_mode_delay->callback((Fl_Callback*)cb_val_hamlib_mode_delay); val_hamlib_mode_delay->align(Fl_Align(FL_ALIGN_LEFT)); val_hamlib_mode_delay->when(FL_WHEN_CHANGED); o->value(progdefaults.hamlib_mode_delay); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* val_hamlib_mode_delay { Fl_ListBox* o = listbox_sideband = new Fl_ListBox(632, 216, 144, 22, _("Sideband:")); listbox_sideband->box(FL_DOWN_BOX); listbox_sideband->color(FL_BACKGROUND2_COLOR); listbox_sideband->selection_color(FL_BACKGROUND_COLOR); listbox_sideband->labeltype(FL_NORMAL_LABEL); listbox_sideband->labelfont(0); listbox_sideband->labelsize(14); listbox_sideband->labelcolor(FL_FOREGROUND_COLOR); listbox_sideband->align(Fl_Align(FL_ALIGN_LEFT)); listbox_sideband->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_sideband->end(); } // Fl_ListBox* listbox_sideband { inpHamlibConfig = new Fl_Input2(231, 313, 460, 24, _("Advanced configuration:")); inpHamlibConfig->tooltip(_("Optional configuration\nin format: param=val ...")); inpHamlibConfig->box(FL_DOWN_BOX); inpHamlibConfig->color(FL_BACKGROUND2_COLOR); inpHamlibConfig->selection_color(FL_SELECTION_COLOR); inpHamlibConfig->labeltype(FL_NORMAL_LABEL); inpHamlibConfig->labelfont(0); inpHamlibConfig->labelsize(14); inpHamlibConfig->labelcolor(FL_FOREGROUND_COLOR); inpHamlibConfig->callback((Fl_Callback*)cb_inpHamlibConfig); inpHamlibConfig->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpHamlibConfig->when(FL_WHEN_RELEASE); inpHamlibConfig->value(progdefaults.HamConfig.c_str()); inpHamlibConfig->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpHamlibConfig { btnInitHAMLIB = new Fl_Button(696, 313, 80, 24, _("Initialize")); btnInitHAMLIB->tooltip(_("Initialize hamlib interface")); btnInitHAMLIB->callback((Fl_Callback*)cb_btnInitHAMLIB); } // Fl_Button* btnInitHAMLIB grpHamlib->end(); } // Fl_Group* grpHamlib { btn_hamlib_get_defaults = new Fl_Button(696, 19, 80, 24, _("Defaults")); btn_hamlib_get_defaults->callback((Fl_Callback*)cb_btn_hamlib_get_defaults); } // Fl_Button* btn_hamlib_get_defaults CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/Hamlib")); config_pages.push_back(p); tab_tree->add(_("Rig Control/Hamlib")); grpRigHamlib->end(); } // Fl_Group* grpRigHamlib { Fl_Group* o = grpRigHardware = new Fl_Group(200, 0, 600, 350, _("Rig Control/Hardware PTT")); grpRigHardware->box(FL_ENGRAVED_BOX); grpRigHardware->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); grpRigHardware->hide(); { Fl_Group* o = new Fl_Group(209, 27, 580, 38); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnPTTrightchannel = new Fl_Check_Button(224, 36, 250, 20, _("PTT tone on right audio channel ")); btnPTTrightchannel->tooltip(_("Can be used in lieu of or in addition to other PTT types")); btnPTTrightchannel->down_box(FL_DOWN_BOX); btnPTTrightchannel->callback((Fl_Callback*)cb_btnPTTrightchannel); o->value(progdefaults.PTTrightchannel); } // Fl_Check_Button* btnPTTrightchannel o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(209, 67, 580, 184, _("h/w ptt device-pin")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { btnTTYptt = new Fl_Round_Button(224, 94, 220, 20, _("Use separate serial port PTT")); btnTTYptt->down_box(FL_DOWN_BOX); btnTTYptt->selection_color((Fl_Color)1); btnTTYptt->callback((Fl_Callback*)cb_btnTTYptt); } // Fl_Round_Button* btnTTYptt { Fl_ComboBox* o = inpTTYdev = new Fl_ComboBox(217, 135, 350, 22, _("Device:")); inpTTYdev->box(FL_DOWN_BOX); inpTTYdev->color(FL_BACKGROUND2_COLOR); inpTTYdev->selection_color(FL_BACKGROUND_COLOR); inpTTYdev->labeltype(FL_NORMAL_LABEL); inpTTYdev->labelfont(0); inpTTYdev->labelsize(14); inpTTYdev->labelcolor(FL_FOREGROUND_COLOR); inpTTYdev->callback((Fl_Callback*)cb_inpTTYdev); inpTTYdev->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inpTTYdev->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.PTTdev.c_str()); inpTTYdev->end(); } // Fl_ComboBox* inpTTYdev { Fl_Round_Button* o = btnSCU_17 = new Fl_Round_Button(459, 94, 236, 20, _("Port is second SCU-17 device")); btnSCU_17->tooltip(_("Driver requires stop bits to be ZERO!")); btnSCU_17->down_box(FL_DOWN_BOX); btnSCU_17->selection_color((Fl_Color)1); btnSCU_17->callback((Fl_Callback*)cb_btnSCU_17); o->value(progdefaults.SCU_17); } // Fl_Round_Button* btnSCU_17 { btnUsePPortPTT = new Fl_Round_Button(224, 168, 170, 20, _("Use parallel port PTT")); btnUsePPortPTT->down_box(FL_DOWN_BOX); btnUsePPortPTT->selection_color((Fl_Color)1); btnUsePPortPTT->callback((Fl_Callback*)cb_btnUsePPortPTT); } // Fl_Round_Button* btnUsePPortPTT { btnUseUHrouterPTT = new Fl_Round_Button(224, 194, 170, 20, _("Use uHRouter PTT")); btnUseUHrouterPTT->down_box(FL_DOWN_BOX); btnUseUHrouterPTT->selection_color((Fl_Color)1); btnUseUHrouterPTT->callback((Fl_Callback*)cb_btnUseUHrouterPTT); } // Fl_Round_Button* btnUseUHrouterPTT { btnRTSptt = new Fl_Round_Button(579, 123, 85, 20, _("Use RTS")); btnRTSptt->tooltip(_("RTS is PTT signal line")); btnRTSptt->down_box(FL_DOWN_BOX); btnRTSptt->callback((Fl_Callback*)cb_btnRTSptt); } // Fl_Round_Button* btnRTSptt { btnRTSplusV = new Fl_Round_Button(670, 123, 100, 20, _("RTS = +V")); btnRTSplusV->tooltip(_("Initial voltage on RTS")); btnRTSplusV->down_box(FL_DOWN_BOX); btnRTSplusV->callback((Fl_Callback*)cb_btnRTSplusV); } // Fl_Round_Button* btnRTSplusV { btnDTRptt = new Fl_Round_Button(579, 155, 85, 20, _("Use DTR")); btnDTRptt->tooltip(_("DTR is PTT signal line")); btnDTRptt->down_box(FL_DOWN_BOX); btnDTRptt->callback((Fl_Callback*)cb_btnDTRptt); } // Fl_Round_Button* btnDTRptt { btnDTRplusV = new Fl_Round_Button(670, 155, 100, 20, _("DTR = +V")); btnDTRplusV->tooltip(_("Initial voltage on DTR")); btnDTRplusV->down_box(FL_DOWN_BOX); btnDTRplusV->callback((Fl_Callback*)cb_btnDTRplusV); } // Fl_Round_Button* btnDTRplusV { Fl_Check_Button* o = btn_gpio_ptt = new Fl_Check_Button(224, 221, 278, 15, _("GPIO PTT (Pi specific controls)")); btn_gpio_ptt->tooltip(_("Select PTT on state")); btn_gpio_ptt->down_box(FL_DOWN_BOX); btn_gpio_ptt->labelfont(4); btn_gpio_ptt->callback((Fl_Callback*)cb_btn_gpio_ptt); o->value(progdefaults.gpio_ptt); } // Fl_Check_Button* btn_gpio_ptt { btnInitHWPTT = new Fl_Button(649, 212, 113, 24, _("Initialize")); btnInitHWPTT->tooltip(_("Initialize the H/W PTT interface")); btnInitHWPTT->callback((Fl_Callback*)cb_btnInitHWPTT); } // Fl_Button* btnInitHWPTT o->end(); } // Fl_Group* o { grpPTTdelays = new Fl_Group(210, 252, 580, 91, _("PTT delays valid for all CAT/PTT types")); grpPTTdelays->box(FL_ENGRAVED_FRAME); grpPTTdelays->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntPTT_on_delay = new Fl_Counter(274, 279, 100, 21, _("Start of transmit PTT delay")); cntPTT_on_delay->tooltip(_("Delay NN msec before starting audio")); cntPTT_on_delay->minimum(0); cntPTT_on_delay->maximum(5000); cntPTT_on_delay->step(10); cntPTT_on_delay->callback((Fl_Callback*)cb_cntPTT_on_delay); cntPTT_on_delay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.PTT_on_delay); o->lstep(100); } // Fl_Counter* cntPTT_on_delay { Fl_Counter* o = cntPTT_off_delay = new Fl_Counter(274, 309, 100, 21, _("PTT end of transmit delay")); cntPTT_off_delay->tooltip(_("Delay NN msec before releasing PTT")); cntPTT_off_delay->minimum(0); cntPTT_off_delay->maximum(5000); cntPTT_off_delay->step(10); cntPTT_off_delay->callback((Fl_Callback*)cb_cntPTT_off_delay); cntPTT_off_delay->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.PTT_off_delay); o->lstep(100); } // Fl_Counter* cntPTT_off_delay grpPTTdelays->end(); } // Fl_Group* grpPTTdelays CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Rig Control/Hardware PTT")); config_pages.push_back(p); tab_tree->add(_("Rig Control/Hardware PTT")); tab_tree->close(_("Rig Control")); grpRigHardware->end(); } // Fl_Group* grpRigHardware { Fl_Group* o = grp_cmedia_ptt = new Fl_Group(200, 0, 600, 350, _("C-Media PTT")); grp_cmedia_ptt->box(FL_ENGRAVED_BOX); grp_cmedia_ptt->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); grp_cmedia_ptt->hide(); { Fl_Group* o = new Fl_Group(205, 30, 590, 173, _("C-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. G\ PIO signal line 3 (pin 13) is used for PTT control.\n\nFldigi accesses the GPI\ O lines as a Human Interface Device (HID). Discovered C-Media devices are enu\ merated in the \'C-Media device\' list box.\n\nOn Linux: add a file named cmed\ ia.rules to /etc/udev/rules.d/\nThe file should contain a single line\n\nKERNE\ L==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"")); o->align(Fl_Align(132|FL_ALIGN_INSIDE)); o->end(); } // Fl_Group* o { btn_use_cmedia_PTT = new Fl_Round_Button(235, 218, 220, 20, _("Use C-Media PTT")); btn_use_cmedia_PTT->down_box(FL_DOWN_BOX); btn_use_cmedia_PTT->selection_color((Fl_Color)1); btn_use_cmedia_PTT->callback((Fl_Callback*)cb_btn_use_cmedia_PTT); } // Fl_Round_Button* btn_use_cmedia_PTT { Fl_ComboBox* o = inp_cmedia_dev = new Fl_ComboBox(235, 261, 350, 22, _("C-Media device")); inp_cmedia_dev->box(FL_DOWN_BOX); inp_cmedia_dev->color(FL_BACKGROUND2_COLOR); inp_cmedia_dev->selection_color(FL_BACKGROUND_COLOR); inp_cmedia_dev->labeltype(FL_NORMAL_LABEL); inp_cmedia_dev->labelfont(0); inp_cmedia_dev->labelsize(14); inp_cmedia_dev->labelcolor(FL_FOREGROUND_COLOR); inp_cmedia_dev->callback((Fl_Callback*)cb_inp_cmedia_dev); inp_cmedia_dev->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_cmedia_dev->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.cmedia_device.c_str()); inp_cmedia_dev->end(); } // Fl_ComboBox* inp_cmedia_dev { Fl_ComboBox* o = inp_cmedia_GPIO_line = new Fl_ComboBox(235, 304, 114, 22, _("GPIO line")); inp_cmedia_GPIO_line->box(FL_DOWN_BOX); inp_cmedia_GPIO_line->color(FL_BACKGROUND2_COLOR); inp_cmedia_GPIO_line->selection_color(FL_BACKGROUND_COLOR); inp_cmedia_GPIO_line->labeltype(FL_NORMAL_LABEL); inp_cmedia_GPIO_line->labelfont(0); inp_cmedia_GPIO_line->labelsize(14); inp_cmedia_GPIO_line->labelcolor(FL_FOREGROUND_COLOR); inp_cmedia_GPIO_line->callback((Fl_Callback*)cb_inp_cmedia_GPIO_line); inp_cmedia_GPIO_line->align(Fl_Align(FL_ALIGN_TOP_LEFT)); inp_cmedia_GPIO_line->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); o->value(progdefaults.cmedia_gpio_line); o->add("GPIO-1|GPIO-2|GPIO-3|GPIO-4"); inp_cmedia_GPIO_line->end(); } // Fl_ComboBox* inp_cmedia_GPIO_line { btn_init_cmedia_PTT = new Fl_Button(600, 261, 70, 22, _("Select")); btn_init_cmedia_PTT->tooltip(_("Select device & Initialize the H/W PTT interface")); btn_init_cmedia_PTT->callback((Fl_Callback*)cb_btn_init_cmedia_PTT); } // Fl_Button* btn_init_cmedia_PTT { btn_test_cmedia = new Fl_Button(695, 261, 70, 22, _("TEST")); btn_test_cmedia->tooltip(_("Toggles PTT line 20x; check DRA-30 ptt LED")); btn_test_cmedia->callback((Fl_Callback*)cb_btn_test_cmedia); } // Fl_Button* btn_test_cmedia CONFIG_PAGE *p = new CONFIG_PAGE(o, _("C-Media PTT")); config_pages.push_back(p); tab_tree->add(_("Rig Control/C-Media PTT")); tab_tree->close(_("Rig Control")); grp_cmedia_ptt->end(); } // Fl_Group* grp_cmedia_ptt { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Soundcard/Alerts")); o->box(FL_ENGRAVED_BOX); o->color(FL_LIGHT1); o->selection_color(FL_LIGHT1); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(203, 18, 590, 64); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_File_Input* o = inp_wav_fname_regex = new Fl_File_Input(208, 41, 304, 35, _("REGEX detected wav")); inp_wav_fname_regex->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.BWSR_REGEX_MATCH.c_str()); } // Fl_File_Input* inp_wav_fname_regex { btn_select_regex_wav = new Fl_Button(514, 52, 60, 24, _("Select")); btn_select_regex_wav->callback((Fl_Callback*)cb_btn_select_regex_wav); } // Fl_Button* btn_select_regex_wav { Fl_Choice* o = mnu_regex_alert_menu = new Fl_Choice(578, 52, 135, 24, _("Sound:")); mnu_regex_alert_menu->box(FL_DOWN_BOX); mnu_regex_alert_menu->down_box(FL_BORDER_BOX); mnu_regex_alert_menu->color((Fl_Color)53); mnu_regex_alert_menu->callback((Fl_Callback*)cb_mnu_regex_alert_menu); mnu_regex_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone"); o->value(progdefaults.REGEX_ALERT_MENU); } // Fl_Choice* mnu_regex_alert_menu { Fl_Check_Button* o = btn_enable_regex_match_wa = new Fl_Check_Button(718, 31, 70, 15, _("Enable")); btn_enable_regex_match_wa->down_box(FL_DOWN_BOX); btn_enable_regex_match_wa->callback((Fl_Callback*)cb_btn_enable_regex_match_wa); o->value(progdefaults.ENABLE_BWSR_REGEX_MATCH); } // Fl_Check_Button* btn_enable_regex_match_wa { btn_test_regex_wav = new Fl_Button(718, 52, 60, 24, _("Test")); btn_test_regex_wav->callback((Fl_Callback*)cb_btn_test_regex_wav); } // Fl_Button* btn_test_regex_wav o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(203, 81, 590, 64); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_File_Input* o = inp_wav_fname_mycall = new Fl_File_Input(208, 103, 304, 35, _("MYCALL detected wav")); inp_wav_fname_mycall->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.BWSR_MYCALL_MATCH.c_str()); } // Fl_File_Input* inp_wav_fname_mycall { btn_select_mycall_wav = new Fl_Button(514, 114, 60, 24, _("Select")); btn_select_mycall_wav->callback((Fl_Callback*)cb_btn_select_mycall_wav); } // Fl_Button* btn_select_mycall_wav { Fl_Choice* o = mnu_mycall_alert_menu = new Fl_Choice(578, 114, 135, 24, _("Sound:")); mnu_mycall_alert_menu->box(FL_DOWN_BOX); mnu_mycall_alert_menu->down_box(FL_BORDER_BOX); mnu_mycall_alert_menu->color((Fl_Color)53); mnu_mycall_alert_menu->callback((Fl_Callback*)cb_mnu_mycall_alert_menu); mnu_mycall_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone"); o->value(progdefaults.MYCALL_ALERT_MENU); } // Fl_Choice* mnu_mycall_alert_menu { Fl_Check_Button* o = btn_enable_mycall_match_wav = new Fl_Check_Button(718, 92, 70, 15, _("Enable")); btn_enable_mycall_match_wav->down_box(FL_DOWN_BOX); btn_enable_mycall_match_wav->callback((Fl_Callback*)cb_btn_enable_mycall_match_wav); o->value(progdefaults.ENABLE_BWSR_MYCALL_MATCH); } // Fl_Check_Button* btn_enable_mycall_match_wav { btn_test_mycall_wav = new Fl_Button(718, 114, 60, 24, _("Test")); btn_test_mycall_wav->callback((Fl_Callback*)cb_btn_test_mycall_wav); } // Fl_Button* btn_test_mycall_wav o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(203, 144, 590, 64); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_File_Input* o = inp_wav_fname_rsid = new Fl_File_Input(208, 166, 304, 35, _("RsID audio alert wav")); inp_wav_fname_rsid->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.RSID_MATCH.c_str()); } // Fl_File_Input* inp_wav_fname_rsid { btn_select_rsid_wav = new Fl_Button(514, 177, 60, 24, _("Select")); btn_select_rsid_wav->callback((Fl_Callback*)cb_btn_select_rsid_wav); } // Fl_Button* btn_select_rsid_wav { Fl_Choice* o = mnu_rsid_alert_menu = new Fl_Choice(578, 177, 135, 24, _("Sound:")); mnu_rsid_alert_menu->box(FL_DOWN_BOX); mnu_rsid_alert_menu->down_box(FL_BORDER_BOX); mnu_rsid_alert_menu->color((Fl_Color)53); mnu_rsid_alert_menu->callback((Fl_Callback*)cb_mnu_rsid_alert_menu); mnu_rsid_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone"); o->value(progdefaults.RSID_ALERT_MENU); } // Fl_Choice* mnu_rsid_alert_menu { Fl_Check_Button* o = btn_enable_rsid_match_wav = new Fl_Check_Button(718, 156, 70, 15, _("Enable")); btn_enable_rsid_match_wav->down_box(FL_DOWN_BOX); btn_enable_rsid_match_wav->callback((Fl_Callback*)cb_btn_enable_rsid_match_wav); o->value(progdefaults.ENABLE_RSID_MATCH); } // Fl_Check_Button* btn_enable_rsid_match_wav { btn_test_rsid_wav = new Fl_Button(718, 177, 60, 24, _("Test")); btn_test_rsid_wav->callback((Fl_Callback*)cb_btn_test_rsid_wav); } // Fl_Button* btn_test_rsid_wav o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(203, 207, 590, 114); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_File_Input* o = inp_wav_flmsg_rcvd = new Fl_File_Input(208, 227, 304, 35, _("flmsg received wav")); inp_wav_flmsg_rcvd->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.RX_EXTRACT_MSG_RCVD.c_str()); } // Fl_File_Input* inp_wav_flmsg_rcvd { btn_select_rx_extract_msg = new Fl_Button(514, 238, 60, 24, _("Select")); btn_select_rx_extract_msg->callback((Fl_Callback*)cb_btn_select_rx_extract_msg); } // Fl_Button* btn_select_rx_extract_msg { Fl_Choice* o = mnu_rx_extract_alert_menu = new Fl_Choice(578, 238, 135, 24, _("Sound:")); mnu_rx_extract_alert_menu->box(FL_DOWN_BOX); mnu_rx_extract_alert_menu->down_box(FL_BORDER_BOX); mnu_rx_extract_alert_menu->color((Fl_Color)53); mnu_rx_extract_alert_menu->callback((Fl_Callback*)cb_mnu_rx_extract_alert_menu); mnu_rx_extract_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone"); o->value(progdefaults.RX_EXTRACT_ALERT_MENU); } // Fl_Choice* mnu_rx_extract_alert_menu { Fl_Check_Button* o = btn_enable_flmsg_wav = new Fl_Check_Button(718, 216, 70, 15, _("Enable")); btn_enable_flmsg_wav->down_box(FL_DOWN_BOX); btn_enable_flmsg_wav->callback((Fl_Callback*)cb_btn_enable_flmsg_wav); o->value(progdefaults.ENABLE_RX_EXTRACT_MSG_RCVD); } // Fl_Check_Button* btn_enable_flmsg_wav { btn_test_flmsg_extract_wav = new Fl_Button(718, 238, 60, 24, _("Test")); btn_test_flmsg_extract_wav->callback((Fl_Callback*)cb_btn_test_flmsg_extract_wav); } // Fl_Button* btn_test_flmsg_extract_wav { Fl_File_Input* o = inp_wav_flmsg_timed_out = new Fl_File_Input(208, 282, 304, 35, _("flmsg timed out wav")); inp_wav_flmsg_timed_out->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->value(progdefaults.RX_EXTRACT_TIMED_OUT.c_str()); } // Fl_File_Input* inp_wav_flmsg_timed_out { btn_select_rx_extract_timed_out = new Fl_Button(514, 293, 60, 24, _("Select")); btn_select_rx_extract_timed_out->callback((Fl_Callback*)cb_btn_select_rx_extract_timed_out); } // Fl_Button* btn_select_rx_extract_timed_out { Fl_Choice* o = mnu_rx_timed_out_alert_menu = new Fl_Choice(578, 293, 135, 24, _("Sound:")); mnu_rx_timed_out_alert_menu->box(FL_DOWN_BOX); mnu_rx_timed_out_alert_menu->down_box(FL_BORDER_BOX); mnu_rx_timed_out_alert_menu->color((Fl_Color)53); mnu_rx_timed_out_alert_menu->callback((Fl_Callback*)cb_mnu_rx_timed_out_alert_menu); mnu_rx_timed_out_alert_menu->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->add("wav file|bark|checkout|diesel|steam_train|doesnot|beeboo|phone|dinner_bell|rtty_bell|standard_tone"); o->value(progdefaults.TIMED_OUT_ALERT_MENU); } // Fl_Choice* mnu_rx_timed_out_alert_menu { btn_test_rx_extract_timed_out = new Fl_Button(718, 293, 60, 24, _("Test")); btn_test_rx_extract_timed_out->callback((Fl_Callback*)cb_btn_test_rx_extract_timed_out); } // Fl_Button* btn_test_rx_extract_timed_out { Fl_Check_Button* o = btn_enable_flmsg_time_out_wav = new Fl_Check_Button(718, 271, 70, 15, _("Enable")); btn_enable_flmsg_time_out_wav->down_box(FL_DOWN_BOX); btn_enable_flmsg_time_out_wav->callback((Fl_Callback*)cb_btn_enable_flmsg_time_out_wav); o->value(progdefaults.ENABLE_RX_EXTRACT_TIMED_OUT); } // Fl_Check_Button* btn_enable_flmsg_time_out_wav o->end(); } // Fl_Group* o { Fl_Value_Slider2* o = sldrAlertVolume = new Fl_Value_Slider2(256, 325, 403, 20, _("Alert volume")); sldrAlertVolume->type(1); sldrAlertVolume->box(FL_DOWN_BOX); sldrAlertVolume->color(FL_BACKGROUND_COLOR); sldrAlertVolume->selection_color(FL_BACKGROUND_COLOR); sldrAlertVolume->labeltype(FL_NORMAL_LABEL); sldrAlertVolume->labelfont(0); sldrAlertVolume->labelsize(14); sldrAlertVolume->labelcolor(FL_FOREGROUND_COLOR); sldrAlertVolume->maximum(100); sldrAlertVolume->step(1); sldrAlertVolume->value(20); sldrAlertVolume->textsize(14); sldrAlertVolume->callback((Fl_Callback*)cb_sldrAlertVolume); sldrAlertVolume->align(Fl_Align(FL_ALIGN_RIGHT)); sldrAlertVolume->when(FL_WHEN_CHANGED); o->value(progdefaults.alert_volume); o->labelsize(FL_NORMAL_SIZE); o->textsize(FL_NORMAL_SIZE); } // Fl_Value_Slider2* sldrAlertVolume CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Alerts")); config_pages.push_back(p); tab_tree->add(_("Soundcard/Alerts")); o->end(); } // Fl_Group* o { Fl_Group* o = grpSoundDevices = new Fl_Group(200, -4, 600, 350, _("Soundcard/Devices")); grpSoundDevices->box(FL_ENGRAVED_BOX); grpSoundDevices->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); grpSoundDevices->hide(); { AudioOSS = new Fl_Group(255, 20, 500, 45); AudioOSS->box(FL_ENGRAVED_FRAME); { btnAudioIO[0] = new Fl_Round_Button(267, 30, 53, 25, _("OSS")); btnAudioIO[0]->tooltip(_("Use OSS audio server")); btnAudioIO[0]->down_box(FL_DOWN_BOX); btnAudioIO[0]->selection_color((Fl_Color)1); btnAudioIO[0]->callback((Fl_Callback*)cb_btnAudioIO); } // Fl_Round_Button* btnAudioIO[0] { Fl_Input_Choice* o = menuOSSDev = new Fl_Input_Choice(572, 30, 165, 25, _("Device:")); menuOSSDev->tooltip(_("Select device")); menuOSSDev->callback((Fl_Callback*)cb_menuOSSDev); o->value(progdefaults.OSSdevice.c_str()); } // Fl_Input_Choice* menuOSSDev AudioOSS->end(); } // Fl_Group* AudioOSS { AudioPort = new Fl_Group(255, 65, 500, 79); AudioPort->box(FL_ENGRAVED_FRAME); { btnAudioIO[1] = new Fl_Round_Button(267, 93, 95, 25, _("PortAudio")); btnAudioIO[1]->tooltip(_("Use Port Audio server")); btnAudioIO[1]->down_box(FL_DOWN_BOX); btnAudioIO[1]->selection_color((Fl_Color)1); btnAudioIO[1]->callback((Fl_Callback*)cb_btnAudioIO1); } // Fl_Round_Button* btnAudioIO[1] { menuPortInDev = new Fl_Choice(427, 76, 310, 25, _("Capture:")); menuPortInDev->tooltip(_("Audio input device")); menuPortInDev->down_box(FL_BORDER_BOX); menuPortInDev->callback((Fl_Callback*)cb_menuPortInDev); } // Fl_Choice* menuPortInDev { menuPortOutDev = new Fl_Choice(427, 111, 310, 25, _("Playback:")); menuPortOutDev->tooltip(_("Audio output device")); menuPortOutDev->down_box(FL_BORDER_BOX); menuPortOutDev->callback((Fl_Callback*)cb_menuPortOutDev); } // Fl_Choice* menuPortOutDev AudioPort->end(); } // Fl_Group* AudioPort { AudioPulse = new Fl_Group(255, 145, 500, 45); AudioPulse->box(FL_ENGRAVED_FRAME); { btnAudioIO[2] = new Fl_Round_Button(267, 156, 100, 25, _("PulseAudio")); btnAudioIO[2]->tooltip(_("Use Pulse Audio server")); btnAudioIO[2]->down_box(FL_DOWN_BOX); btnAudioIO[2]->selection_color((Fl_Color)1); btnAudioIO[2]->callback((Fl_Callback*)cb_btnAudioIO2); } // Fl_Round_Button* btnAudioIO[2] { Fl_Input2* o = inpPulseServer = new Fl_Input2(512, 156, 225, 24, _("Server string:")); inpPulseServer->tooltip(_("Leave this blank or refer to\nhttp://www.pulseaudio.org/wiki/ServerStrings")); inpPulseServer->box(FL_DOWN_BOX); inpPulseServer->color(FL_BACKGROUND2_COLOR); inpPulseServer->selection_color(FL_SELECTION_COLOR); inpPulseServer->labeltype(FL_NORMAL_LABEL); inpPulseServer->labelfont(0); inpPulseServer->labelsize(14); inpPulseServer->labelcolor(FL_FOREGROUND_COLOR); inpPulseServer->callback((Fl_Callback*)cb_inpPulseServer); inpPulseServer->align(Fl_Align(FL_ALIGN_LEFT)); inpPulseServer->when(FL_WHEN_RELEASE); o->value(progdefaults.PulseServer.c_str()); inpPulseServer->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpPulseServer AudioPulse->end(); } // Fl_Group* AudioPulse { AudioNull = new Fl_Group(255, 190, 135, 45); AudioNull->box(FL_ENGRAVED_FRAME); { btnAudioIO[3] = new Fl_Round_Button(268, 200, 100, 25, _("File I/O only")); btnAudioIO[3]->tooltip(_("NO AUDIO DEVICE AVAILABLE (or testing)")); btnAudioIO[3]->down_box(FL_DOWN_BOX); btnAudioIO[3]->selection_color((Fl_Color)1); btnAudioIO[3]->callback((Fl_Callback*)cb_btnAudioIO3); } // Fl_Round_Button* btnAudioIO[3] AudioNull->end(); } // Fl_Group* AudioNull { AudioDuplex = new Fl_Group(390, 190, 365, 45); AudioDuplex->box(FL_ENGRAVED_FRAME); { Fl_Round_Button* o = btn_is_full_duplex = new Fl_Round_Button(433, 200, 225, 25, _("Device supports full duplex")); btn_is_full_duplex->tooltip(_("Capture/Playback supports full duplex operation")); btn_is_full_duplex->down_box(FL_DOWN_BOX); btn_is_full_duplex->value(1); btn_is_full_duplex->selection_color((Fl_Color)1); btn_is_full_duplex->callback((Fl_Callback*)cb_btn_is_full_duplex); o->value(progdefaults.is_full_duplex); } // Fl_Round_Button* btn_is_full_duplex AudioDuplex->end(); } // Fl_Group* AudioDuplex { AudioAlerts = new Fl_Group(255, 235, 500, 90); AudioAlerts->box(FL_ENGRAVED_FRAME); AudioAlerts->align(Fl_Align(FL_ALIGN_CENTER)); { menuAlertsDev = new Fl_Choice(265, 260, 365, 25, _("Audio device shared by Audio Alerts and Rx Monitor")); menuAlertsDev->tooltip(_("Audio output device")); menuAlertsDev->down_box(FL_BORDER_BOX); menuAlertsDev->callback((Fl_Callback*)cb_menuAlertsDev); menuAlertsDev->align(Fl_Align(FL_ALIGN_TOP_LEFT)); } // Fl_Choice* menuAlertsDev { Fl_Round_Button* o = btn_enable_audio_alerts = new Fl_Round_Button(657, 260, 76, 25, _("Enable")); btn_enable_audio_alerts->tooltip(_("First select audio alert playback device")); btn_enable_audio_alerts->down_box(FL_DOWN_BOX); btn_enable_audio_alerts->selection_color((Fl_Color)1); btn_enable_audio_alerts->callback((Fl_Callback*)cb_btn_enable_audio_alerts); o->value(progdefaults.enable_audio_alerts); } // Fl_Round_Button* btn_enable_audio_alerts { Fl_Box* o = new Fl_Box(265, 295, 473, 22, _("Note: must be selected and enabled for Rx Audio monitoring!")); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Box* o AudioAlerts->end(); } // Fl_Group* AudioAlerts CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Devices")); config_pages.push_back(p); tab_tree->add(_("Soundcard/Devices")); grpSoundDevices->end(); } // Fl_Group* grpSoundDevices { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Soundcard/Right channel")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(236, 33, 550, 246, _("Transmit Usage")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { chkAudioStereoOut = new Fl_Check_Button(376, 54, 280, 20, _("Modem signal on left and right channels")); chkAudioStereoOut->tooltip(_("Left and right channels both contain modem audio")); chkAudioStereoOut->down_box(FL_DOWN_BOX); chkAudioStereoOut->callback((Fl_Callback*)cb_chkAudioStereoOut); chkAudioStereoOut->value(progdefaults.sig_on_right_channel); } // Fl_Check_Button* chkAudioStereoOut { Fl_Check_Button* o = chkReverseAudio = new Fl_Check_Button(376, 84, 270, 20, _("Reverse Left/Right channels")); chkReverseAudio->tooltip(_("Software reversal of left-right audio channels")); chkReverseAudio->down_box(FL_DOWN_BOX); chkReverseAudio->callback((Fl_Callback*)cb_chkReverseAudio); o->value(progdefaults.ReverseAudio); } // Fl_Check_Button* chkReverseAudio { Fl_Group* o = new Fl_Group(286, 107, 454, 162, _("...\nThese controls are on other tabs.\nThey are replicated here for convenie\ nce.\nYou may change the state from either location.\n...")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnPTTrightchannel2 = new Fl_Check_Button(376, 114, 250, 20, _("PTT tone on right audio channel ")); btnPTTrightchannel2->tooltip(_("1000 Hz tone when PTT enabled\nCan be used in lieu of or in addition to other\ PTT types")); btnPTTrightchannel2->down_box(FL_DOWN_BOX); btnPTTrightchannel2->callback((Fl_Callback*)cb_btnPTTrightchannel2); o->value(progdefaults.PTTrightchannel); } // Fl_Check_Button* btnPTTrightchannel2 { Fl_Check_Button* o = btnQSK2 = new Fl_Check_Button(376, 144, 211, 20, _("CW QSK signal on right channel")); btnQSK2->tooltip(_("Generate 1000 Hz square wave signal on right channel")); btnQSK2->down_box(FL_DOWN_BOX); btnQSK2->callback((Fl_Callback*)cb_btnQSK2); o->value(progdefaults.QSK); } // Fl_Check_Button* btnQSK2 { Fl_Check_Button* o = chkPseudoFSK2 = new Fl_Check_Button(376, 175, 270, 20, _("Pseudo-FSK on right audio channel")); chkPseudoFSK2->tooltip(_("Create 1000 Hz square wave on right channel")); chkPseudoFSK2->down_box(FL_DOWN_BOX); chkPseudoFSK2->callback((Fl_Callback*)cb_chkPseudoFSK2); o->value(progdefaults.PseudoFSK); } // Fl_Check_Button* chkPseudoFSK2 o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(236, 282, 550, 60, _("Receive Usage")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkReverseRxAudio = new Fl_Check_Button(376, 300, 270, 20, _("Reverse Left/Right channels")); chkReverseRxAudio->tooltip(_("Software reversal of left-right audio channels")); chkReverseRxAudio->down_box(FL_DOWN_BOX); chkReverseRxAudio->callback((Fl_Callback*)cb_chkReverseRxAudio); o->value(progdefaults.ReverseRxAudio); } // Fl_Check_Button* chkReverseRxAudio o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Right channel")); config_pages.push_back(p); tab_tree->add(_("Soundcard/Right channel")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Soundcard/Settings")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { grpAudioSampleRate = new Fl_Group(260, 48, 490, 90, _("Sample rate")); grpAudioSampleRate->box(FL_ENGRAVED_FRAME); grpAudioSampleRate->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_ListBox* o = menuInSampleRate = new Fl_ListBox(284, 77, 100, 22, _("Capture")); menuInSampleRate->tooltip(_("Force a specific sample rate. Select \"Native\" if \"Auto\"\ndoes not work we\ ll with your audio device.")); menuInSampleRate->box(FL_DOWN_BOX); menuInSampleRate->color(FL_BACKGROUND2_COLOR); menuInSampleRate->selection_color(FL_BACKGROUND_COLOR); menuInSampleRate->labeltype(FL_NORMAL_LABEL); menuInSampleRate->labelfont(0); menuInSampleRate->labelsize(14); menuInSampleRate->labelcolor(FL_FOREGROUND_COLOR); menuInSampleRate->callback((Fl_Callback*)cb_menuInSampleRate); menuInSampleRate->align(Fl_Align(FL_ALIGN_RIGHT)); menuInSampleRate->when(FL_WHEN_RELEASE); o->clear_changed(); o->labelsize(FL_NORMAL_SIZE); menuInSampleRate->end(); } // Fl_ListBox* menuInSampleRate { Fl_ListBox* o = menuOutSampleRate = new Fl_ListBox(284, 107, 100, 22, _("Playback")); menuOutSampleRate->box(FL_DOWN_BOX); menuOutSampleRate->color(FL_BACKGROUND2_COLOR); menuOutSampleRate->selection_color(FL_BACKGROUND_COLOR); menuOutSampleRate->labeltype(FL_NORMAL_LABEL); menuOutSampleRate->labelfont(0); menuOutSampleRate->labelsize(14); menuOutSampleRate->labelcolor(FL_FOREGROUND_COLOR); menuOutSampleRate->callback((Fl_Callback*)cb_menuOutSampleRate); menuOutSampleRate->align(Fl_Align(FL_ALIGN_RIGHT)); menuOutSampleRate->when(FL_WHEN_RELEASE); o->clear_changed(); o->tooltip(menuInSampleRate->tooltip()); o->labelsize(FL_NORMAL_SIZE); menuOutSampleRate->end(); } // Fl_ListBox* menuOutSampleRate { Fl_ListBox* o = menuSampleConverter = new Fl_ListBox(524, 77, 216, 22, _("Converter")); menuSampleConverter->tooltip(_("Set the type of resampler used of offset correction")); menuSampleConverter->box(FL_DOWN_BOX); menuSampleConverter->color(FL_BACKGROUND2_COLOR); menuSampleConverter->selection_color(FL_BACKGROUND_COLOR); menuSampleConverter->labeltype(FL_NORMAL_LABEL); menuSampleConverter->labelfont(0); menuSampleConverter->labelsize(14); menuSampleConverter->labelcolor(FL_FOREGROUND_COLOR); menuSampleConverter->callback((Fl_Callback*)cb_menuSampleConverter); menuSampleConverter->align(Fl_Align(FL_ALIGN_TOP_LEFT)); menuSampleConverter->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); menuSampleConverter->end(); } // Fl_ListBox* menuSampleConverter grpAudioSampleRate->end(); } // Fl_Group* grpAudioSampleRate { Fl_Group* o = new Fl_Group(260, 138, 490, 62, _("Corrections")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Spinner2* o = cntRxRateCorr = new Fl_Spinner2(284, 165, 85, 20, _("RX ppm")); cntRxRateCorr->tooltip(_("RX sound card correction")); cntRxRateCorr->box(FL_NO_BOX); cntRxRateCorr->color(FL_BACKGROUND_COLOR); cntRxRateCorr->selection_color(FL_BACKGROUND_COLOR); cntRxRateCorr->labeltype(FL_NORMAL_LABEL); cntRxRateCorr->labelfont(0); cntRxRateCorr->labelsize(14); cntRxRateCorr->labelcolor(FL_FOREGROUND_COLOR); cntRxRateCorr->callback((Fl_Callback*)cb_cntRxRateCorr); cntRxRateCorr->align(Fl_Align(FL_ALIGN_RIGHT)); cntRxRateCorr->when(FL_WHEN_RELEASE); o->step(1); o->minimum(-50000); o->maximum(50000); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntRxRateCorr { Fl_Spinner2* o = cntTxRateCorr = new Fl_Spinner2(431, 165, 85, 20, _("TX ppm")); cntTxRateCorr->tooltip(_("TX sound card correction")); cntTxRateCorr->box(FL_NO_BOX); cntTxRateCorr->color(FL_BACKGROUND_COLOR); cntTxRateCorr->selection_color(FL_BACKGROUND_COLOR); cntTxRateCorr->labeltype(FL_NORMAL_LABEL); cntTxRateCorr->labelfont(0); cntTxRateCorr->labelsize(14); cntTxRateCorr->labelcolor(FL_FOREGROUND_COLOR); cntTxRateCorr->callback((Fl_Callback*)cb_cntTxRateCorr); cntTxRateCorr->align(Fl_Align(FL_ALIGN_RIGHT)); cntTxRateCorr->when(FL_WHEN_RELEASE); o->step(1); o->minimum(-50000); o->maximum(50000); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntTxRateCorr { Fl_Spinner2* o = cntTxOffset = new Fl_Spinner2(591, 165, 85, 20, _("TX offset")); cntTxOffset->tooltip(_("Difference between Rx & Tx freq (rig offset)")); cntTxOffset->box(FL_NO_BOX); cntTxOffset->color(FL_BACKGROUND_COLOR); cntTxOffset->selection_color(FL_BACKGROUND_COLOR); cntTxOffset->labeltype(FL_NORMAL_LABEL); cntTxOffset->labelfont(0); cntTxOffset->labelsize(14); cntTxOffset->labelcolor(FL_FOREGROUND_COLOR); cntTxOffset->callback((Fl_Callback*)cb_cntTxOffset); cntTxOffset->align(Fl_Align(FL_ALIGN_RIGHT)); cntTxOffset->when(FL_WHEN_RELEASE); o->value(progdefaults.TxOffset); o->step(1); o->minimum(-50); o->maximum(50); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntTxOffset o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(260, 200, 490, 76, _("Frequency Analysis / FMT Rx Correction")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { bnt_dec_rit = new Fl_Button(285, 227, 18, 24, _("@|<")); bnt_dec_rit->labelsize(10); bnt_dec_rit->callback((Fl_Callback*)cb_bnt_dec_rit); bnt_dec_rit->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Button* bnt_dec_rit { Fl_Counter* o = cntRIT = new Fl_Counter(303, 227, 130, 24, _("Frequency Correction")); cntRIT->tooltip(_("Used ONLY for frequency analysis mode")); cntRIT->minimum(-5); cntRIT->maximum(5); cntRIT->step(0.001); cntRIT->callback((Fl_Callback*)cb_cntRIT); o->value(progdefaults.RIT); o->lstep(0.01); } // Fl_Counter* cntRIT { btn_incr_rit = new Fl_Button(433, 227, 18, 24, _("@>|")); btn_incr_rit->labelsize(10); btn_incr_rit->callback((Fl_Callback*)cb_btn_incr_rit); btn_incr_rit->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Button* btn_incr_rit o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Settings")); config_pages.push_back(p); tab_tree->add(_("Soundcard/Settings")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Signal Level")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { new Fl_Box(340, 39, 316, 21, _("Signal Levels")); } // Fl_Box* o { Fl_Box* o = lowcolor2 = new Fl_Box(365, 78, 21, 21); lowcolor2->box(FL_DIAMOND_DOWN_BOX); lowcolor2->color(FL_FOREGROUND_COLOR); o->color(progdefaults.LowSignal); } // Fl_Box* lowcolor2 { btnLowSignal2 = new Fl_Button(402, 78, 70, 21, _("Low")); btnLowSignal2->callback((Fl_Callback*)cb_btnLowSignal2); } // Fl_Button* btnLowSignal2 { Fl_Box* o = normalcolor2 = new Fl_Box(365, 122, 21, 21); normalcolor2->box(FL_DIAMOND_DOWN_BOX); normalcolor2->color((Fl_Color)2); o->color(progdefaults.NormSignal); } // Fl_Box* normalcolor2 { Fl_Counter* o = cnt_normal_signal_level2 = new Fl_Counter(480, 100, 114, 21, _("Transition\nLevel (dB)")); cnt_normal_signal_level2->minimum(-90); cnt_normal_signal_level2->maximum(0); cnt_normal_signal_level2->callback((Fl_Callback*)cb_cnt_normal_signal_level2); cnt_normal_signal_level2->align(Fl_Align(FL_ALIGN_TOP)); o->value(progdefaults.normal_signal_level); o->lstep(1.0); } // Fl_Counter* cnt_normal_signal_level2 { btnNormalSignal2 = new Fl_Button(402, 122, 70, 21, _("Normal")); btnNormalSignal2->callback((Fl_Callback*)cb_btnNormalSignal2); } // Fl_Button* btnNormalSignal2 { Fl_Box* o = highcolor2 = new Fl_Box(365, 166, 21, 21); highcolor2->box(FL_DIAMOND_DOWN_BOX); highcolor2->color((Fl_Color)3); o->color(progdefaults.HighSignal); } // Fl_Box* highcolor2 { Fl_Counter* o = cnt_high_signal_level2 = new Fl_Counter(480, 145, 114, 21); cnt_high_signal_level2->minimum(-90); cnt_high_signal_level2->maximum(0); cnt_high_signal_level2->callback((Fl_Callback*)cb_cnt_high_signal_level2); o->value(progdefaults.high_signal_level); o->lstep(1.0); } // Fl_Counter* cnt_high_signal_level2 { btnHighSignal2 = new Fl_Button(402, 166, 70, 21, _("High")); btnHighSignal2->callback((Fl_Callback*)cb_btnHighSignal2); } // Fl_Button* btnHighSignal2 { Fl_Box* o = overcolor2 = new Fl_Box(365, 210, 21, 21); overcolor2->box(FL_DIAMOND_DOWN_BOX); overcolor2->color((Fl_Color)1); o->color(progdefaults.OverSignal); } // Fl_Box* overcolor2 { Fl_Counter* o = cnt_over_signal_level2 = new Fl_Counter(480, 191, 114, 21); cnt_over_signal_level2->minimum(-90); cnt_over_signal_level2->maximum(0); cnt_over_signal_level2->callback((Fl_Callback*)cb_cnt_over_signal_level2); o->value(progdefaults.over_signal_level); o->lstep(1.0); } // Fl_Counter* cnt_over_signal_level2 { btnOverSignal2 = new Fl_Button(402, 210, 70, 21, _("Over")); btnOverSignal2->callback((Fl_Callback*)cb_btnOverSignal2); } // Fl_Button* btnOverSignal2 { Fl_Progress* o = new Fl_Progress(295, 289, 416, 25, _("label")); o->hide(); } // Fl_Progress* o { sig_vumeter2 = new vumeter(322, 248, 360, 24, _("label")); sig_vumeter2->box(FL_DOWN_BOX); sig_vumeter2->color(FL_BACKGROUND2_COLOR); sig_vumeter2->selection_color(FL_YELLOW); sig_vumeter2->labeltype(FL_NORMAL_LABEL); sig_vumeter2->labelfont(0); sig_vumeter2->labelsize(14); sig_vumeter2->labelcolor(FL_FOREGROUND_COLOR); sig_vumeter2->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); sig_vumeter2->when(FL_WHEN_RELEASE); } // vumeter* sig_vumeter2 { new Fl_Box(383, 275, 237, 17, _("Input signal level")); } // Fl_Box* o { btn_default_signal_levels2 = new Fl_Button(618, 145, 70, 20, _("Default")); btn_default_signal_levels2->callback((Fl_Callback*)cb_btn_default_signal_levels2); } // Fl_Button* btn_default_signal_levels2 { Fl_Check_Button* o = btn_use_wsjtx_vumeter_scale2 = new Fl_Check_Button(322, 305, 70, 18, _("Use wsjtx scale")); btn_use_wsjtx_vumeter_scale2->tooltip(_("default scale is audo \"Vu Meter\"\nenable to emulate wsjtx scale")); btn_use_wsjtx_vumeter_scale2->down_box(FL_DOWN_BOX); btn_use_wsjtx_vumeter_scale2->callback((Fl_Callback*)cb_btn_use_wsjtx_vumeter_scale2); o->value(progdefaults.use_wsjtx_vumeter_scale); } // Fl_Check_Button* btn_use_wsjtx_vumeter_scale2 CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Signal Level")); config_pages.push_back(p); tab_tree->add(_("Soundcard/Signal Level")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Soundcard/Wav file recording")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_ListBox* o = listbox_wav_samplerate = new Fl_ListBox(399, 91, 150, 24, _("Wav write sample rate")); listbox_wav_samplerate->tooltip(_("Pick baud rate from list")); listbox_wav_samplerate->box(FL_DOWN_BOX); listbox_wav_samplerate->color(FL_BACKGROUND2_COLOR); listbox_wav_samplerate->selection_color(FL_BACKGROUND_COLOR); listbox_wav_samplerate->labeltype(FL_NORMAL_LABEL); listbox_wav_samplerate->labelfont(0); listbox_wav_samplerate->labelsize(14); listbox_wav_samplerate->labelcolor(FL_FOREGROUND_COLOR); listbox_wav_samplerate->callback((Fl_Callback*)cb_listbox_wav_samplerate); listbox_wav_samplerate->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listbox_wav_samplerate->when(FL_WHEN_RELEASE); o->add("8000|11025|16000|22050|24000|44100|48000"); o->index(progdefaults.wavSampleRate); o->labelsize(FL_NORMAL_SIZE); listbox_wav_samplerate->end(); } // Fl_ListBox* listbox_wav_samplerate { Fl_Check_Button* o = btn_record_both = new Fl_Check_Button(399, 140, 176, 15, _("Record both channels")); btn_record_both->down_box(FL_DOWN_BOX); btn_record_both->callback((Fl_Callback*)cb_btn_record_both); o->value(progdefaults.record_both_channels); } // Fl_Check_Button* btn_record_both CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Soundcard/Wav file recording")); config_pages.push_back(p); tab_tree->add(_("Soundcard/Wav file recording")); tab_tree->close(_("Soundcard")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("UI/Browser/Channels")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Spinner2* o = cntChannels = new Fl_Spinner2(278, 54, 50, 24, _("Channels, first channel starts at waterfall lower limit")); cntChannels->tooltip(_("Change # of psk viewer channels")); cntChannels->box(FL_NO_BOX); cntChannels->color(FL_BACKGROUND_COLOR); cntChannels->selection_color(FL_BACKGROUND_COLOR); cntChannels->labeltype(FL_NORMAL_LABEL); cntChannels->labelfont(0); cntChannels->labelsize(14); cntChannels->labelcolor(FL_FOREGROUND_COLOR); cntChannels->maximum(30); cntChannels->value(30); cntChannels->callback((Fl_Callback*)cb_cntChannels); cntChannels->align(Fl_Align(FL_ALIGN_RIGHT)); cntChannels->when(FL_WHEN_RELEASE); o->minimum(5); o->maximum(30); o->step(1); o->value(progdefaults.VIEWERchannels); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntChannels { Fl_Spinner2* o = cntTimeout = new Fl_Spinner2(278, 90, 50, 24, _("Inactivity timeout")); cntTimeout->tooltip(_("Clear channel text after\n# seconds of inactivity")); cntTimeout->box(FL_NO_BOX); cntTimeout->color(FL_BACKGROUND_COLOR); cntTimeout->selection_color(FL_BACKGROUND_COLOR); cntTimeout->labeltype(FL_NORMAL_LABEL); cntTimeout->labelfont(0); cntTimeout->labelsize(14); cntTimeout->labelcolor(FL_FOREGROUND_COLOR); cntTimeout->value(10); cntTimeout->callback((Fl_Callback*)cb_cntTimeout); cntTimeout->align(Fl_Align(FL_ALIGN_RIGHT)); cntTimeout->when(FL_WHEN_RELEASE); o->minimum(1); o->maximum(180); o->step(1); o->value(progdefaults.VIEWERtimeout); o->labelsize(FL_NORMAL_SIZE); } // Fl_Spinner2* cntTimeout { Fl_ListBox* o = listboxViewerLabel = new Fl_ListBox(278, 130, 150, 24, _("Channel label")); listboxViewerLabel->tooltip(_("Appearance of label on each channel")); listboxViewerLabel->box(FL_DOWN_BOX); listboxViewerLabel->color(FL_BACKGROUND2_COLOR); listboxViewerLabel->selection_color(FL_BACKGROUND_COLOR); listboxViewerLabel->labeltype(FL_NORMAL_LABEL); listboxViewerLabel->labelfont(0); listboxViewerLabel->labelsize(14); listboxViewerLabel->labelcolor(FL_FOREGROUND_COLOR); listboxViewerLabel->callback((Fl_Callback*)cb_listboxViewerLabel); listboxViewerLabel->align(Fl_Align(FL_ALIGN_RIGHT)); listboxViewerLabel->when(FL_WHEN_RELEASE); listboxViewerLabel->add(_("None")); listboxViewerLabel->add(_("Audio frequency")); listboxViewerLabel->add(_("Radio frequency")); listboxViewerLabel->add(_("Channel number")); listboxViewerLabel->index(progdefaults.VIEWERlabeltype); o->labelsize(FL_NORMAL_SIZE); listboxViewerLabel->end(); } // Fl_ListBox* listboxViewerLabel { btnViewerFont = new Fl_Button(563, 130, 70, 24, _("Font...")); btnViewerFont->tooltip(_("select browser font")); btnViewerFont->callback((Fl_Callback*)cb_btnViewerFont); } // Fl_Button* btnViewerFont { Fl_Check_Button* o = btnFixedIntervals = new Fl_Check_Button(468, 92, 165, 20, _("Fixed Intervals")); btnFixedIntervals->tooltip(_("Force channel spacing to even 100 Hz increments")); btnFixedIntervals->down_box(FL_DOWN_BOX); btnFixedIntervals->value(1); btnFixedIntervals->callback((Fl_Callback*)cb_btnFixedIntervals); o->value(progdefaults.VIEWERfixed); } // Fl_Check_Button* btnFixedIntervals { Fl_Check_Button* o = btnMarquee = new Fl_Check_Button(278, 168, 165, 20, _("Continuous scrolling")); btnMarquee->tooltip(_("ON - Marquee style\nOFF - Clear & restart")); btnMarquee->down_box(FL_DOWN_BOX); btnMarquee->callback((Fl_Callback*)cb_btnMarquee); o->value(progdefaults.VIEWERmarquee); } // Fl_Check_Button* btnMarquee { Fl_Check_Button* o = btnAscend = new Fl_Check_Button(278, 192, 253, 20, _("Lowest freq on bottom of viewer")); btnAscend->tooltip(_("Change positions of low to high channels")); btnAscend->down_box(FL_DOWN_BOX); btnAscend->callback((Fl_Callback*)cb_btnAscend); o->value(progdefaults.VIEWERascend); } // Fl_Check_Button* btnAscend { Fl_Check_Button* o = btnBrowserHistory = new Fl_Check_Button(278, 217, 356, 20, _("Play back history when active channel selected")); btnBrowserHistory->tooltip(_("Audio stream history decoded on selected signal")); btnBrowserHistory->down_box(FL_DOWN_BOX); btnBrowserHistory->callback((Fl_Callback*)cb_btnBrowserHistory); o->value(progdefaults.VIEWERhistory); } // Fl_Check_Button* btnBrowserHistory CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Browser/Channels")); config_pages.push_back(p); tab_tree->add(_("UI/Browser/Channels")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("UI/Browser/Colors")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { bwsrHiLite_1_color = new Fl_Button(259, 113, 62, 22, _("HiLite 1")); bwsrHiLite_1_color->tooltip(_("PSK/RTTY Viewer HiLite Color 1")); bwsrHiLite_1_color->callback((Fl_Callback*)cb_bwsrHiLite_1_color); bwsrHiLite_1_color->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_1_color->color((Fl_Color)progdefaults.bwsrHiLight1); } // Fl_Button* bwsrHiLite_1_color { bwsrHiLite_2_color = new Fl_Button(361, 113, 62, 22, _("HiLite 2")); bwsrHiLite_2_color->tooltip(_("PSK/RTTY Viewer HiLite Color 2")); bwsrHiLite_2_color->callback((Fl_Callback*)cb_bwsrHiLite_2_color); bwsrHiLite_2_color->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_2_color->color((Fl_Color)progdefaults.bwsrHiLight2); } // Fl_Button* bwsrHiLite_2_color { bwsrHiLite_even_lines = new Fl_Button(464, 113, 62, 22, _("Even")); bwsrHiLite_even_lines->tooltip(_("Even lines")); bwsrHiLite_even_lines->callback((Fl_Callback*)cb_bwsrHiLite_even_lines); bwsrHiLite_even_lines->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_even_lines->color((Fl_Color)progdefaults.bwsrBackgnd2); } // Fl_Button* bwsrHiLite_even_lines { bwsrHiLite_odd_lines = new Fl_Button(567, 113, 62, 22, _("Odd")); bwsrHiLite_odd_lines->tooltip(_("Odd lines")); bwsrHiLite_odd_lines->callback((Fl_Callback*)cb_bwsrHiLite_odd_lines); bwsrHiLite_odd_lines->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_odd_lines->color((Fl_Color)progdefaults.bwsrBackgnd1); } // Fl_Button* bwsrHiLite_odd_lines { bwsrHiLite_select = new Fl_Button(671, 113, 62, 22, _("Select")); bwsrHiLite_select->tooltip(_("Select line")); bwsrHiLite_select->callback((Fl_Callback*)cb_bwsrHiLite_select); bwsrHiLite_select->align(Fl_Align(FL_ALIGN_TOP)); bwsrHiLite_select->color((Fl_Color)progdefaults.bwsrSelect); } // Fl_Button* bwsrHiLite_select CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Browser/Colors")); config_pages.push_back(p); tab_tree->add(_("UI/Browser/Colors")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("UI/Browser/Detection Level")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { bwsrSliderColor = new Fl_Button(294, 118, 112, 24, _("Backgnd")); bwsrSliderColor->tooltip(_("Background color of signal viewer squelch control")); bwsrSliderColor->callback((Fl_Callback*)cb_bwsrSliderColor); bwsrSliderColor->align(Fl_Align(FL_ALIGN_TOP)); bwsrSliderColor->color(fl_rgb_color(progdefaults.bwsrSliderColor.R, progdefaults.bwsrSliderColor.G,progdefaults.bwsrSliderColor.B)); } // Fl_Button* bwsrSliderColor { bwsrSldrSelColor = new Fl_Button(545, 118, 112, 24, _("Button")); bwsrSldrSelColor->tooltip(_("Slider hilite color of signal viewer squelch control")); bwsrSldrSelColor->callback((Fl_Callback*)cb_bwsrSldrSelColor); bwsrSldrSelColor->align(Fl_Align(FL_ALIGN_TOP)); bwsrSldrSelColor->color(fl_rgb_color(progdefaults.bwsrSldrSelColor.R, progdefaults.bwsrSldrSelColor.G,progdefaults.bwsrSliderColor.B)); } // Fl_Button* bwsrSldrSelColor CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Browser/Detection Level")); config_pages.push_back(p); tab_tree->add(_("UI/Browser/Detection Level")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("UI/General")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(206, 21, 590, 76); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnShowTooltips = new Fl_Check_Button(276, 34, 120, 20, _("Show tooltips")); btnShowTooltips->tooltip(_("Enable / disable tooltips")); btnShowTooltips->down_box(FL_DOWN_BOX); btnShowTooltips->value(1); btnShowTooltips->callback((Fl_Callback*)cb_btnShowTooltips); o->value(progdefaults.tooltips); } // Fl_Check_Button* btnShowTooltips { Fl_Check_Button* o = chkMenuIcons = new Fl_Check_Button(420, 34, 150, 20, _("Show menu icons")); chkMenuIcons->tooltip(_("Enable / disable icons on menus")); chkMenuIcons->down_box(FL_DOWN_BOX); chkMenuIcons->callback((Fl_Callback*)cb_chkMenuIcons); o->value(progdefaults.menuicons); } // Fl_Check_Button* chkMenuIcons { Fl_ListBox* o = listboxScheme = new Fl_ListBox(394, 63, 80, 20, _("UI scheme")); listboxScheme->tooltip(_("Change application look and feel")); listboxScheme->box(FL_DOWN_BOX); listboxScheme->color(FL_BACKGROUND2_COLOR); listboxScheme->selection_color(FL_BACKGROUND_COLOR); listboxScheme->labeltype(FL_NORMAL_LABEL); listboxScheme->labelfont(0); listboxScheme->labelsize(14); listboxScheme->labelcolor(FL_FOREGROUND_COLOR); listboxScheme->callback((Fl_Callback*)cb_listboxScheme); listboxScheme->align(Fl_Align(FL_ALIGN_RIGHT)); listboxScheme->when(FL_WHEN_RELEASE); listboxScheme->add("base"); listboxScheme->add("gtk+"); listboxScheme->add("plastic"); listboxScheme->add("gleam"); listboxScheme->value(progdefaults.ui_scheme.c_str()); o->labelsize(FL_NORMAL_SIZE); listboxScheme->end(); } // Fl_ListBox* listboxScheme { bVisibleModes = new Fl_Button(259, 63, 110, 20, _("Visible modes")); bVisibleModes->tooltip(_("Select modes for menu access")); bVisibleModes->callback((Fl_Callback*)cb_bVisibleModes); } // Fl_Button* bVisibleModes { Fl_ListBox* o = listbox_language = new Fl_ListBox(576, 63, 170, 20, _("UI language")); listbox_language->tooltip(_("Changes take effect on next program startup")); listbox_language->box(FL_DOWN_BOX); listbox_language->color(FL_BACKGROUND2_COLOR); listbox_language->selection_color(FL_BACKGROUND_COLOR); listbox_language->labeltype(FL_NORMAL_LABEL); listbox_language->labelfont(0); listbox_language->labelsize(12); listbox_language->labelcolor(FL_FOREGROUND_COLOR); listbox_language->callback((Fl_Callback*)cb_listbox_language); listbox_language->align(Fl_Align(FL_ALIGN_TOP_LEFT)); listbox_language->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listbox_language->end(); } // Fl_ListBox* listbox_language o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(206, 103, 590, 34); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_rx_lowercase = new Fl_Check_Button(246, 110, 441, 20, _("Print CW / RTTY / THROB / CONTESTIA in lowercase")); btn_rx_lowercase->down_box(FL_DOWN_BOX); btn_rx_lowercase->callback((Fl_Callback*)cb_btn_rx_lowercase); o->value(progdefaults.rx_lowercase); } // Fl_Check_Button* btn_rx_lowercase o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(206, 139, 294, 65); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_tx_lowercase = new Fl_Check_Button(241, 148, 199, 20, _("Transmit lower case text")); btn_tx_lowercase->down_box(FL_DOWN_BOX); btn_tx_lowercase->callback((Fl_Callback*)cb_btn_tx_lowercase); o->value(progdefaults.tx_lowercase); } // Fl_Check_Button* btn_tx_lowercase o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(206, 206, 590, 76, _("Exit prompts")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_save_config_on_exit = new Fl_Check_Button(246, 230, 264, 20, _("Prompt to save Configuration")); btn_save_config_on_exit->down_box(FL_DOWN_BOX); btn_save_config_on_exit->callback((Fl_Callback*)cb_btn_save_config_on_exit); o->value(progdefaults.SaveConfig); } // Fl_Check_Button* btn_save_config_on_exit { Fl_Check_Button* o = btn2_save_macros_on_exit = new Fl_Check_Button(246, 252, 264, 20, _("Prompt to save macro file")); btn2_save_macros_on_exit->tooltip(_("Write current macro set on program exit")); btn2_save_macros_on_exit->down_box(FL_DOWN_BOX); btn2_save_macros_on_exit->callback((Fl_Callback*)cb_btn2_save_macros_on_exit); o->value(progdefaults.SaveMacros); } // Fl_Check_Button* btn2_save_macros_on_exit { Fl_Check_Button* o = btn2NagMe = new Fl_Check_Button(523, 230, 188, 20, _("Prompt to save log")); btn2NagMe->tooltip(_("Bug me about saving log entries")); btn2NagMe->down_box(FL_DOWN_BOX); btn2NagMe->callback((Fl_Callback*)cb_btn2NagMe); o->value(progdefaults.NagMe); } // Fl_Check_Button* btn2NagMe { Fl_Check_Button* o = btn2_confirm_exit = new Fl_Check_Button(523, 252, 226, 20, _("Confirm exit")); btn2_confirm_exit->down_box(FL_DOWN_BOX); btn2_confirm_exit->callback((Fl_Callback*)cb_btn2_confirm_exit); o->value(progdefaults.confirmExit); } // Fl_Check_Button* btn2_confirm_exit o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(206, 285, 590, 60, _("Check for updates")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_check_for_updates = new Fl_Check_Button(246, 308, 367, 20, _("Check for updates when starting program")); btn_check_for_updates->down_box(FL_DOWN_BOX); btn_check_for_updates->callback((Fl_Callback*)cb_btn_check_for_updates); o->value(progdefaults.check_for_updates); } // Fl_Check_Button* btn_check_for_updates o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(501, 139, 295, 65); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_tx_show_timer = new Fl_Check_Button(520, 148, 219, 20, _("Show TX timer")); btn_tx_show_timer->down_box(FL_DOWN_BOX); btn_tx_show_timer->callback((Fl_Callback*)cb_btn_tx_show_timer); o->value(progdefaults.show_tx_timer); } // Fl_Check_Button* btn_tx_show_timer { Fl_Spinner* o = val_tx_timeout = new Fl_Spinner(521, 173, 45, 24, _("TX deadmen timeout (mins)")); val_tx_timeout->minimum(0); val_tx_timeout->maximum(60); val_tx_timeout->value(10); val_tx_timeout->callback((Fl_Callback*)cb_val_tx_timeout); val_tx_timeout->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.tx_timeout); } // Fl_Spinner* val_tx_timeout o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/General")); config_pages.push_back(p); tab_tree->add(_("UI/General")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("UI/Macro buttons")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(205, 205, 590, 35); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnMacroMouseWheel = new Fl_Check_Button(262, 213, 296, 20, _("Mouse wheel active on macro buttons")); btnMacroMouseWheel->tooltip(_("enable mouse wheel control of macro bar")); btnMacroMouseWheel->down_box(FL_DOWN_BOX); btnMacroMouseWheel->callback((Fl_Callback*)cb_btnMacroMouseWheel); o->value(progdefaults.macro_wheel); } // Fl_Check_Button* btnMacroMouseWheel o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 25, 590, 180, _("Number and position of macro bars")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter* o = cnt_macro_height = new Fl_Counter(415, 50, 89, 22, _("Button Height")); cnt_macro_height->tooltip(_("Height of macro bar")); cnt_macro_height->type(1); cnt_macro_height->minimum(18); cnt_macro_height->maximum(30); cnt_macro_height->step(1); cnt_macro_height->value(20); cnt_macro_height->callback((Fl_Callback*)cb_cnt_macro_height); cnt_macro_height->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.macro_height); } // Fl_Counter* cnt_macro_height { btn_scheme_0 = new Fl_Round_Button(261, 78, 144, 22, _("One above Rx/Tx")); btn_scheme_0->tooltip(_("Single macro bar below logging panel\nvariable height")); btn_scheme_0->type(102); btn_scheme_0->down_box(FL_ROUND_DOWN_BOX); btn_scheme_0->callback((Fl_Callback*)cb_btn_scheme_0); } // Fl_Round_Button* btn_scheme_0 { btn_scheme_1 = new Fl_Round_Button(261, 103, 144, 22, _("One above waterfall")); btn_scheme_1->type(102); btn_scheme_1->down_box(FL_ROUND_DOWN_BOX); btn_scheme_1->callback((Fl_Callback*)cb_btn_scheme_1); } // Fl_Round_Button* btn_scheme_1 { btn_scheme_2 = new Fl_Round_Button(261, 128, 144, 22, _("One below waterfall")); btn_scheme_2->type(102); btn_scheme_2->down_box(FL_ROUND_DOWN_BOX); btn_scheme_2->callback((Fl_Callback*)cb_btn_scheme_2); } // Fl_Round_Button* btn_scheme_2 { btn_scheme_3 = new Fl_Round_Button(428, 78, 144, 22, _("Two scheme 1")); btn_scheme_3->type(102); btn_scheme_3->down_box(FL_ROUND_DOWN_BOX); btn_scheme_3->callback((Fl_Callback*)cb_btn_scheme_3); } // Fl_Round_Button* btn_scheme_3 { btn_scheme_4 = new Fl_Round_Button(596, 78, 144, 22, _("Two scheme 2")); btn_scheme_4->type(102); btn_scheme_4->down_box(FL_ROUND_DOWN_BOX); btn_scheme_4->callback((Fl_Callback*)cb_btn_scheme_4); } // Fl_Round_Button* btn_scheme_4 { btn_scheme_5 = new Fl_Round_Button(428, 103, 144, 22, _("Two scheme 3")); btn_scheme_5->type(102); btn_scheme_5->down_box(FL_ROUND_DOWN_BOX); btn_scheme_5->callback((Fl_Callback*)cb_btn_scheme_5); } // Fl_Round_Button* btn_scheme_5 { btn_scheme_6 = new Fl_Round_Button(596, 103, 144, 22, _("Two scheme 4")); btn_scheme_6->type(102); btn_scheme_6->down_box(FL_ROUND_DOWN_BOX); btn_scheme_6->callback((Fl_Callback*)cb_btn_scheme_6); } // Fl_Round_Button* btn_scheme_6 { btn_scheme_7 = new Fl_Round_Button(428, 128, 144, 22, _("Two scheme 5")); btn_scheme_7->type(102); btn_scheme_7->down_box(FL_ROUND_DOWN_BOX); btn_scheme_7->callback((Fl_Callback*)cb_btn_scheme_7); } // Fl_Round_Button* btn_scheme_7 { btn_scheme_8 = new Fl_Round_Button(596, 128, 144, 22, _("Two scheme 6")); btn_scheme_8->type(102); btn_scheme_8->down_box(FL_ROUND_DOWN_BOX); btn_scheme_8->callback((Fl_Callback*)cb_btn_scheme_8); } // Fl_Round_Button* btn_scheme_8 { btn_scheme_9 = new Fl_Round_Button(428, 153, 144, 22, _("Two scheme 7")); btn_scheme_9->type(102); btn_scheme_9->down_box(FL_ROUND_DOWN_BOX); btn_scheme_9->callback((Fl_Callback*)cb_btn_scheme_9); } // Fl_Round_Button* btn_scheme_9 { btn_scheme_10 = new Fl_Round_Button(596, 153, 144, 22, _("Two scheme 8")); btn_scheme_10->type(102); btn_scheme_10->down_box(FL_ROUND_DOWN_BOX); btn_scheme_10->callback((Fl_Callback*)cb_btn_scheme_10); } // Fl_Round_Button* btn_scheme_10 { btn_scheme_11 = new Fl_Round_Button(428, 178, 144, 22, _("Two scheme 9")); btn_scheme_11->type(102); btn_scheme_11->down_box(FL_ROUND_DOWN_BOX); btn_scheme_11->callback((Fl_Callback*)cb_btn_scheme_11); } // Fl_Round_Button* btn_scheme_11 { btn_scheme_12 = new Fl_Round_Button(596, 178, 144, 22, _("Two scheme 10")); btn_scheme_12->type(102); btn_scheme_12->down_box(FL_ROUND_DOWN_BOX); btn_scheme_12->callback((Fl_Callback*)cb_btn_scheme_12); } // Fl_Round_Button* btn_scheme_12 o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 240, 590, 55); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnUseLastMacro = new Fl_Check_Button(262, 245, 277, 20, _("Load last used macro file at start")); btnUseLastMacro->tooltip(_("ON - use last set of macros\nOFF - use default set")); btnUseLastMacro->down_box(FL_DOWN_BOX); btnUseLastMacro->callback((Fl_Callback*)cb_btnUseLastMacro); o->value(progdefaults.UseLastMacro); } // Fl_Check_Button* btnUseLastMacro { Fl_Check_Button* o = btnDisplayMacroFilename = new Fl_Check_Button(262, 267, 277, 20, _("Display macro filename at start")); btnDisplayMacroFilename->tooltip(_("The filename is written to the RX text area")); btnDisplayMacroFilename->down_box(FL_DOWN_BOX); btnDisplayMacroFilename->callback((Fl_Callback*)cb_btnDisplayMacroFilename); o->value(progdefaults.DisplayMacroFilename); } // Fl_Check_Button* btnDisplayMacroFilename { Fl_Check_Button* o = btn_save_macros_on_exit = new Fl_Check_Button(545, 245, 216, 20, _("Prompt to save macro file")); btn_save_macros_on_exit->tooltip(_("Write current macro set on program exit")); btn_save_macros_on_exit->down_box(FL_DOWN_BOX); btn_save_macros_on_exit->callback((Fl_Callback*)cb_btn_save_macros_on_exit); o->value(progdefaults.SaveMacros); } // Fl_Check_Button* btn_save_macros_on_exit o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(205, 295, 295, 45); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_macro_post = new Fl_Check_Button(265, 307, 216, 20, _("Show macro control codes")); btn_macro_post->tooltip(_("print ^! execution codes in Rx panel")); btn_macro_post->down_box(FL_DOWN_BOX); btn_macro_post->callback((Fl_Callback*)cb_btn_macro_post); o->value(progdefaults.macro_post); } // Fl_Check_Button* btn_macro_post o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(500, 295, 295, 45); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btn_4bar_position = new Fl_Check_Button(532, 307, 216, 20, _("4 bar macro set below Tx")); btn_4bar_position->tooltip(_("Position the 4 bar macro set below Tx panel\nDefault above Rx panel")); btn_4bar_position->down_box(FL_DOWN_BOX); btn_4bar_position->callback((Fl_Callback*)cb_btn_4bar_position); o->value(progdefaults.four_bar_position); } // Fl_Check_Button* btn_4bar_position o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Macro buttons")); config_pages.push_back(p); tab_tree->add(_("UI/Macro buttons")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 2, 600, 350, _("UI/Rx Text")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Check_Button* o = btnRXClicks = new Fl_Check_Button(242, 118, 191, 20, _("Single-click to capture")); btnRXClicks->tooltip(_("Enable for single click capure of text in Rx panel")); btnRXClicks->down_box(FL_DOWN_BOX); btnRXClicks->callback((Fl_Callback*)cb_btnRXClicks); o->value(progdefaults.rxtext_clicks_qso_data); } // Fl_Check_Button* btnRXClicks { Fl_Check_Button* o = btnRXTooltips = new Fl_Check_Button(484, 118, 254, 20, _("callsign tooltips in received text")); btnRXTooltips->tooltip(_("Popup info after a 2 second hover on a callsign")); btnRXTooltips->down_box(FL_DOWN_BOX); btnRXTooltips->callback((Fl_Callback*)cb_btnRXTooltips); o->value(progdefaults.rxtext_tooltips); } // Fl_Check_Button* btnRXTooltips { Fl_Input2* o = inpNonword = new Fl_Input2(384, 84, 279, 24, _("Word delimiters")); inpNonword->tooltip(_("RX text QSO data entry is bounded by the non-word characters\ndefined here. T\ ab and newline are automatically included.")); inpNonword->box(FL_DOWN_BOX); inpNonword->color(FL_BACKGROUND2_COLOR); inpNonword->selection_color(FL_SELECTION_COLOR); inpNonword->labeltype(FL_NORMAL_LABEL); inpNonword->labelfont(0); inpNonword->labelsize(14); inpNonword->labelcolor(FL_FOREGROUND_COLOR); inpNonword->textfont(4); inpNonword->callback((Fl_Callback*)cb_inpNonword); inpNonword->align(Fl_Align(FL_ALIGN_LEFT)); inpNonword->when(FL_WHEN_RELEASE); o->value(progdefaults.nonwordchars.c_str()); o->labelsize(FL_NORMAL_SIZE); } // Fl_Input2* inpNonword { Fl_Check_Button* o = btnUSunits = new Fl_Check_Button(484, 147, 220, 20, _("US units of distance (QRB)")); btnUSunits->tooltip(_("Enable for single click capure of text in Rx panel")); btnUSunits->down_box(FL_DOWN_BOX); btnUSunits->callback((Fl_Callback*)cb_btnUSunits); o->value(progdefaults.us_units); } // Fl_Check_Button* btnUSunits { Fl_Check_Button* o = btn_clear_fields = new Fl_Check_Button(242, 147, 198, 20, _("Clear log fields - new CALL")); btn_clear_fields->down_box(FL_DOWN_BOX); btn_clear_fields->callback((Fl_Callback*)cb_btn_clear_fields); o->value(progdefaults.clear_fields); } // Fl_Check_Button* btn_clear_fields CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Rx Text")); config_pages.push_back(p); tab_tree->add(_("UI/Rx Text")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("UI/Touch")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Box* o = new Fl_Box(216, 44, 570, 52, _("Note:\nThese configuration items are useful for but not unique to using fldig\ i on a\ntouch screen device such as a tablet.")); o->align(Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Group* o = new Fl_Group(216, 110, 570, 102, _("Arrow Key Control of Frequency Entry")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Box* o = new Fl_Box(231, 135, 290, 74, _("Right/Left = 1 x LSD\nUp/Dn= 10 x LSD\nShift - Right/Left = 100 x LSD\nShift \ - Up/Dn = 1000 x LSD")); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Choice* o = sel_lsd = new Fl_Choice(621, 171, 90, 24, _("Right/Left\nSelect Least Signficant Digit")); sel_lsd->down_box(FL_BORDER_BOX); sel_lsd->callback((Fl_Callback*)cb_sel_lsd); sel_lsd->align(Fl_Align(FL_ALIGN_TOP)); o->add("1 Hz|10 Hz|100 Hz|1 kHz"); o->value(progdefaults.sel_lsd); } // Fl_Choice* sel_lsd o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(216, 221, 570, 64, _("Rx / Tx Panels")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_rxtx_swap = new Fl_Check_Button(336, 225, 116, 30, _("Tx above Rx")); btn_rxtx_swap->tooltip(_("Enable to put Tx panel above Rx panel")); btn_rxtx_swap->down_box(FL_DOWN_BOX); btn_rxtx_swap->callback((Fl_Callback*)cb_btn_rxtx_swap); o->value(progdefaults.rxtx_swap); } // Fl_Check_Button* btn_rxtx_swap o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("UI/Touch")); config_pages.push_back(p); tab_tree->add(_("UI/Touch")); tab_tree->close(_("UI")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Waterfall/Buttons & Controls")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Box* o = new Fl_Box(285, 70, 446, 25, _("Enable check box to show each respective operator control")); o->box(FL_FLAT_BOX); o->align(Fl_Align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE)); } // Fl_Box* o { Fl_Check_Button* o = btnWF_UIrev = new Fl_Check_Button(312, 103, 150, 20, _("Reverse")); btnWF_UIrev->down_box(FL_DOWN_BOX); btnWF_UIrev->value(1); btnWF_UIrev->callback((Fl_Callback*)cb_btnWF_UIrev); o->value(progdefaults.WF_UIrev); } // Fl_Check_Button* btnWF_UIrev { Fl_Check_Button* o = btnWF_UIx1 = new Fl_Check_Button(531, 103, 162, 20, _("WF Magnification")); btnWF_UIx1->down_box(FL_DOWN_BOX); btnWF_UIx1->value(1); btnWF_UIx1->callback((Fl_Callback*)cb_btnWF_UIx1); o->value(progdefaults.WF_UIx1); } // Fl_Check_Button* btnWF_UIx1 { Fl_Check_Button* o = btnWF_UIwfcarrier = new Fl_Check_Button(312, 134, 150, 20, _("WF carrier")); btnWF_UIwfcarrier->down_box(FL_DOWN_BOX); btnWF_UIwfcarrier->value(1); btnWF_UIwfcarrier->callback((Fl_Callback*)cb_btnWF_UIwfcarrier); o->value(progdefaults.WF_UIwfcarrier); } // Fl_Check_Button* btnWF_UIwfcarrier { Fl_Check_Button* o = btnWF_UIwfshift = new Fl_Check_Button(531, 134, 150, 20, _("WF Shift Controls")); btnWF_UIwfshift->down_box(FL_DOWN_BOX); btnWF_UIwfshift->value(1); btnWF_UIwfshift->callback((Fl_Callback*)cb_btnWF_UIwfshift); o->value(progdefaults.WF_UIwfshift); } // Fl_Check_Button* btnWF_UIwfshift { Fl_Check_Button* o = btnWF_UIwfreflevel = new Fl_Check_Button(312, 166, 150, 20, _("WF ref level")); btnWF_UIwfreflevel->down_box(FL_DOWN_BOX); btnWF_UIwfreflevel->value(1); btnWF_UIwfreflevel->callback((Fl_Callback*)cb_btnWF_UIwfreflevel); o->value(progdefaults.WF_UIwfreflevel); } // Fl_Check_Button* btnWF_UIwfreflevel { Fl_Check_Button* o = btnWF_UIwfdrop = new Fl_Check_Button(531, 166, 150, 20, _("WF drop rate")); btnWF_UIwfdrop->down_box(FL_DOWN_BOX); btnWF_UIwfdrop->value(1); btnWF_UIwfdrop->callback((Fl_Callback*)cb_btnWF_UIwfdrop); o->value(progdefaults.WF_UIwfdrop); } // Fl_Check_Button* btnWF_UIwfdrop { Fl_Check_Button* o = btnWF_UIwfampspan = new Fl_Check_Button(312, 198, 150, 20, _("WF amp span")); btnWF_UIwfampspan->down_box(FL_DOWN_BOX); btnWF_UIwfampspan->value(1); btnWF_UIwfampspan->callback((Fl_Callback*)cb_btnWF_UIwfampspan); o->value(progdefaults.WF_UIwfampspan); } // Fl_Check_Button* btnWF_UIwfampspan { Fl_Check_Button* o = btnWF_UIwfstore = new Fl_Check_Button(531, 198, 150, 20, _("WF Store")); btnWF_UIwfstore->down_box(FL_DOWN_BOX); btnWF_UIwfstore->value(1); btnWF_UIwfstore->callback((Fl_Callback*)cb_btnWF_UIwfstore); o->value(progdefaults.WF_UIwfstore); } // Fl_Check_Button* btnWF_UIwfstore { Fl_Check_Button* o = btnWF_UIwfmode = new Fl_Check_Button(312, 230, 150, 20, _("WF mode")); btnWF_UIwfmode->down_box(FL_DOWN_BOX); btnWF_UIwfmode->value(1); btnWF_UIwfmode->callback((Fl_Callback*)cb_btnWF_UIwfmode); o->value(progdefaults.WF_UIwfmode); } // Fl_Check_Button* btnWF_UIwfmode { Fl_Check_Button* o = btnWF_UIqsy = new Fl_Check_Button(531, 230, 150, 20, _("QSY")); btnWF_UIqsy->down_box(FL_DOWN_BOX); btnWF_UIqsy->value(1); btnWF_UIqsy->callback((Fl_Callback*)cb_btnWF_UIqsy); o->value(progdefaults.WF_UIqsy); } // Fl_Check_Button* btnWF_UIqsy { Fl_Check_Button* o = btnWF_UIxmtlock = new Fl_Check_Button(531, 262, 150, 20, _("XMT lock")); btnWF_UIxmtlock->down_box(FL_DOWN_BOX); btnWF_UIxmtlock->value(1); btnWF_UIxmtlock->callback((Fl_Callback*)cb_btnWF_UIxmtlock); o->value(progdefaults.WF_UIxmtlock); } // Fl_Check_Button* btnWF_UIxmtlock { btn_wf_enable_all = new Fl_Button(356, 285, 88, 20, _("Enable all")); btn_wf_enable_all->callback((Fl_Callback*)cb_btn_wf_enable_all); } // Fl_Button* btn_wf_enable_all { btn_wf_disable_all = new Fl_Button(555, 285, 88, 20, _("Disable all")); btn_wf_disable_all->callback((Fl_Callback*)cb_btn_wf_disable_all); } // Fl_Button* btn_wf_disable_all CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/Buttons & Controls")); config_pages.push_back(p); tab_tree->add(_("Waterfall/Buttons & Controls")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Waterfall/Display")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(210, 32, 580, 190, _("Colors and cursors")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { colorbox* o = WF_Palette = new colorbox(219, 68, 380, 24, _("aa")); WF_Palette->box(FL_DOWN_BOX); WF_Palette->color(FL_FOREGROUND_COLOR); WF_Palette->selection_color(FL_BACKGROUND_COLOR); WF_Palette->labeltype(FL_NORMAL_LABEL); WF_Palette->labelfont(0); WF_Palette->labelsize(12); WF_Palette->labelcolor(FL_FOREGROUND_COLOR); WF_Palette->callback((Fl_Callback*)cb_WF_Palette); WF_Palette->align(Fl_Align(FL_ALIGN_TOP_LEFT)); WF_Palette->when(FL_WHEN_RELEASE); o->label(progdefaults.PaletteName.c_str()); o->labelsize(FL_NORMAL_SIZE); } // colorbox* WF_Palette { btnColor[0] = new Fl_Button(219, 94, 20, 24); btnColor[0]->tooltip(_("Change color")); btnColor[0]->callback((Fl_Callback*)cb_btnColor); } // Fl_Button* btnColor[0] { btnColor[1] = new Fl_Button(264, 94, 20, 24); btnColor[1]->tooltip(_("Change color")); btnColor[1]->callback((Fl_Callback*)cb_btnColor1); } // Fl_Button* btnColor[1] { btnColor[2] = new Fl_Button(309, 94, 20, 24); btnColor[2]->tooltip(_("Change color")); btnColor[2]->callback((Fl_Callback*)cb_btnColor2); } // Fl_Button* btnColor[2] { btnColor[3] = new Fl_Button(354, 94, 20, 24); btnColor[3]->tooltip(_("Change color")); btnColor[3]->callback((Fl_Callback*)cb_btnColor3); } // Fl_Button* btnColor[3] { btnColor[4] = new Fl_Button(399, 94, 20, 24); btnColor[4]->tooltip(_("Change color")); btnColor[4]->callback((Fl_Callback*)cb_btnColor4); } // Fl_Button* btnColor[4] { btnColor[5] = new Fl_Button(444, 94, 20, 24); btnColor[5]->tooltip(_("Change color")); btnColor[5]->callback((Fl_Callback*)cb_btnColor5); } // Fl_Button* btnColor[5] { btnColor[6] = new Fl_Button(489, 94, 20, 24); btnColor[6]->tooltip(_("Change color")); btnColor[6]->callback((Fl_Callback*)cb_btnColor6); } // Fl_Button* btnColor[6] { btnColor[7] = new Fl_Button(534, 94, 20, 24); btnColor[7]->tooltip(_("Change color")); btnColor[7]->callback((Fl_Callback*)cb_btnColor7); } // Fl_Button* btnColor[7] { btnColor[8] = new Fl_Button(579, 94, 20, 24); btnColor[8]->tooltip(_("Change color")); btnColor[8]->callback((Fl_Callback*)cb_btnColor8); } // Fl_Button* btnColor[8] { btnLoadPalette = new Fl_Button(609, 68, 70, 24, _("Load...")); btnLoadPalette->tooltip(_("Load a new palette")); btnLoadPalette->callback((Fl_Callback*)cb_btnLoadPalette); } // Fl_Button* btnLoadPalette { btnSavePalette = new Fl_Button(609, 94, 70, 24, _("Save...")); btnSavePalette->tooltip(_("Save this palette")); btnSavePalette->callback((Fl_Callback*)cb_btnSavePalette); } // Fl_Button* btnSavePalette { Fl_Group* o = new Fl_Group(218, 122, 90, 96, _("Signal BW")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnUseCursorLines = new Fl_Check_Button(220, 142, 56, 20, _("ON")); btnUseCursorLines->tooltip(_("Show cursor with bandwidth lines")); btnUseCursorLines->down_box(FL_DOWN_BOX); btnUseCursorLines->callback((Fl_Callback*)cb_btnUseCursorLines); o->value(progdefaults.UseCursorLines); } // Fl_Check_Button* btnUseCursorLines { Fl_Button* o = btnCursorBWcolor = new Fl_Button(220, 165, 20, 20, _("Color")); btnCursorBWcolor->tooltip(_("Change color")); btnCursorBWcolor->color((Fl_Color)3); btnCursorBWcolor->callback((Fl_Callback*)cb_btnCursorBWcolor); btnCursorBWcolor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.cursorLineRGBI.R,progdefaults.cursorLineRGBI.G,progdefaults.cursorLineRGBI.B)); } // Fl_Button* btnCursorBWcolor { Fl_Check_Button* o = btnUseWideCursor = new Fl_Check_Button(220, 188, 62, 20, _("Wide")); btnUseWideCursor->down_box(FL_DOWN_BOX); btnUseWideCursor->callback((Fl_Callback*)cb_btnUseWideCursor); o->value(progdefaults.UseWideCursor); } // Fl_Check_Button* btnUseWideCursor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(312, 122, 90, 96, _("Center line")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnUseCursorCenterLine = new Fl_Check_Button(318, 142, 48, 20, _("ON")); btnUseCursorCenterLine->tooltip(_("Show cursor with center line")); btnUseCursorCenterLine->down_box(FL_DOWN_BOX); btnUseCursorCenterLine->callback((Fl_Callback*)cb_btnUseCursorCenterLine); o->value(progdefaults.UseCursorCenterLine); } // Fl_Check_Button* btnUseCursorCenterLine { Fl_Button* o = btnCursorCenterLineColor = new Fl_Button(318, 165, 20, 20, _("Color")); btnCursorCenterLineColor->tooltip(_("Change color")); btnCursorCenterLineColor->color(FL_BACKGROUND2_COLOR); btnCursorCenterLineColor->callback((Fl_Callback*)cb_btnCursorCenterLineColor); btnCursorCenterLineColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.cursorCenterRGBI.R,progdefaults.cursorCenterRGBI.G,progdefaults.cursorCenterRGBI.B)); } // Fl_Button* btnCursorCenterLineColor { Fl_Check_Button* o = btnUseWideCenter = new Fl_Check_Button(318, 190, 69, 20, _("Wide")); btnUseWideCenter->down_box(FL_DOWN_BOX); btnUseWideCenter->callback((Fl_Callback*)cb_btnUseWideCenter); o->value(progdefaults.UseWideCenter); } // Fl_Check_Button* btnUseWideCenter o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(406, 122, 90, 96, _("Signal trks")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnUseBWTracks = new Fl_Check_Button(408, 141, 56, 20, _("ON")); btnUseBWTracks->tooltip(_("Show bandwidth tracks on waterfall")); btnUseBWTracks->down_box(FL_DOWN_BOX); btnUseBWTracks->callback((Fl_Callback*)cb_btnUseBWTracks); o->value(progdefaults.UseBWTracks); } // Fl_Check_Button* btnUseBWTracks { Fl_Button* o = btnBwTracksColor = new Fl_Button(408, 164, 20, 20, _("Color")); btnBwTracksColor->tooltip(_("Change color")); btnBwTracksColor->color((Fl_Color)1); btnBwTracksColor->callback((Fl_Callback*)cb_btnBwTracksColor); btnBwTracksColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.bwTrackRGBI.R,progdefaults.bwTrackRGBI.G,progdefaults.bwTrackRGBI.B)); } // Fl_Button* btnBwTracksColor { Fl_Check_Button* o = btnUseWideTracks = new Fl_Check_Button(408, 188, 74, 20, _("Wide")); btnUseWideTracks->down_box(FL_DOWN_BOX); btnUseWideTracks->callback((Fl_Callback*)cb_btnUseWideTracks); o->value(progdefaults.UseWideTracks); } // Fl_Check_Button* btnUseWideTracks o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(501, 122, 90, 96, _("Notch")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnNotchColor = new Fl_Button(503, 164, 20, 20, _("Color")); btnNotchColor->tooltip(_("Change color")); btnNotchColor->color((Fl_Color)1); btnNotchColor->callback((Fl_Callback*)cb_btnNotchColor); btnNotchColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.notchRGBI.R,progdefaults.notchRGBI.G,progdefaults.notchRGBI.B)); } // Fl_Button* btnNotchColor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(595, 124, 90, 96, _("RsID Zone")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnRsIDZoneColor = new Fl_Button(597, 166, 20, 20, _("Color")); btnRsIDZoneColor->tooltip(_("Change color")); btnRsIDZoneColor->color((Fl_Color)1); btnRsIDZoneColor->callback((Fl_Callback*)cb_btnRsIDZoneColor); btnRsIDZoneColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.rsidRGBI.R,progdefaults.rsidRGBI.G,progdefaults.rsidRGBI.B)); } // Fl_Button* btnRsIDZoneColor o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(690, 122, 90, 96, _("Monitor")); o->tooltip(_("Audio monitor")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Button* o = btnMonitorColor = new Fl_Button(692, 164, 20, 20, _("Color")); btnMonitorColor->tooltip(_("Change color")); btnMonitorColor->color((Fl_Color)2); btnMonitorColor->callback((Fl_Callback*)cb_btnMonitorColor); btnMonitorColor->align(Fl_Align(FL_ALIGN_RIGHT)); o->color(fl_rgb_color(progdefaults.monitorRGBI.R,progdefaults.monitorRGBI.G,progdefaults.monitorRGBI.B)); } // Fl_Button* btnMonitorColor { Fl_Check_Button* o = btnUseWideMonitor = new Fl_Check_Button(692, 190, 74, 20, _("Wide")); btnUseWideMonitor->down_box(FL_DOWN_BOX); btnUseWideMonitor->callback((Fl_Callback*)cb_btnUseWideMonitor); o->value(progdefaults.mon_wide_tracks); } // Fl_Check_Button* btnUseWideMonitor o->end(); } // Fl_Group* o o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(210, 223, 580, 55, _("Frequency scale")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = chkShowAudioScale = new Fl_Check_Button(219, 246, 241, 20, _("Always show audio frequencies")); chkShowAudioScale->tooltip(_("Audio or RF frequencies on waterfall scale")); chkShowAudioScale->down_box(FL_DOWN_BOX); chkShowAudioScale->callback((Fl_Callback*)cb_chkShowAudioScale); o->value(progdefaults.wf_audioscale); } // Fl_Check_Button* chkShowAudioScale { btnWaterfallFont = new Fl_Button(519, 246, 71, 24, _("Font...")); btnWaterfallFont->tooltip(_("Select waterfall scale font")); btnWaterfallFont->callback((Fl_Callback*)cb_btnWaterfallFont); } // Fl_Button* btnWaterfallFont o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(210, 279, 580, 65, _("Transmit signal")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnViewXmtSignal = new Fl_Check_Button(219, 305, 208, 20, _("Monitor transmitted signal")); btnViewXmtSignal->tooltip(_("Show transmit signal on waterfall")); btnViewXmtSignal->down_box(FL_DOWN_BOX); btnViewXmtSignal->callback((Fl_Callback*)cb_btnViewXmtSignal); o->value(progdefaults.viewXmtSignal); } // Fl_Check_Button* btnViewXmtSignal { Fl_Counter* o = valTxMonitorLevel = new Fl_Counter(497, 304, 114, 21, _("Signal Level (dB)")); valTxMonitorLevel->tooltip(_("Set level for good viewing")); valTxMonitorLevel->minimum(-80); valTxMonitorLevel->maximum(0); valTxMonitorLevel->step(1); valTxMonitorLevel->value(-20); valTxMonitorLevel->callback((Fl_Callback*)cb_valTxMonitorLevel); valTxMonitorLevel->align(Fl_Align(FL_ALIGN_TOP)); o->value(20*log10(progdefaults.TxMonitorLevel)); o->lstep(10); } // Fl_Counter* valTxMonitorLevel o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/Display")); config_pages.push_back(p); tab_tree->add(_("Waterfall/Display")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Waterfall/FFT Processing")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(251, 25, 490, 135); o->box(FL_ENGRAVED_FRAME); { Fl_Counter2* o = cntLowFreqCutoff = new Fl_Counter2(296, 43, 70, 22, _("Lower limit")); cntLowFreqCutoff->tooltip(_("Low frequency limit in Hz")); cntLowFreqCutoff->type(1); cntLowFreqCutoff->box(FL_UP_BOX); cntLowFreqCutoff->color(FL_BACKGROUND_COLOR); cntLowFreqCutoff->selection_color(FL_INACTIVE_COLOR); cntLowFreqCutoff->labeltype(FL_NORMAL_LABEL); cntLowFreqCutoff->labelfont(0); cntLowFreqCutoff->labelsize(14); cntLowFreqCutoff->labelcolor(FL_FOREGROUND_COLOR); cntLowFreqCutoff->minimum(0); cntLowFreqCutoff->maximum(500); cntLowFreqCutoff->step(50); cntLowFreqCutoff->value(300); cntLowFreqCutoff->callback((Fl_Callback*)cb_cntLowFreqCutoff); cntLowFreqCutoff->align(Fl_Align(FL_ALIGN_RIGHT)); cntLowFreqCutoff->when(FL_WHEN_CHANGED); o->value(progdefaults.LowFreqCutoff); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntLowFreqCutoff { Fl_Check_Button* o = btnWFaveraging = new Fl_Check_Button(296, 79, 120, 20, _("FFT averaging")); btnWFaveraging->tooltip(_("Use averaging to decrease waterfall noise")); btnWFaveraging->down_box(FL_DOWN_BOX); btnWFaveraging->callback((Fl_Callback*)cb_btnWFaveraging); o->value(progdefaults.WFaveraging); } // Fl_Check_Button* btnWFaveraging { Fl_ListBox* o = listboxFFTPrefilter = new Fl_ListBox(296, 109, 120, 24, _("FFT prefilter window function")); listboxFFTPrefilter->tooltip(_("Select the type of FFT prefilter")); listboxFFTPrefilter->box(FL_DOWN_BOX); listboxFFTPrefilter->color(FL_BACKGROUND2_COLOR); listboxFFTPrefilter->selection_color(FL_BACKGROUND_COLOR); listboxFFTPrefilter->labeltype(FL_NORMAL_LABEL); listboxFFTPrefilter->labelfont(0); listboxFFTPrefilter->labelsize(14); listboxFFTPrefilter->labelcolor(FL_FOREGROUND_COLOR); listboxFFTPrefilter->callback((Fl_Callback*)cb_listboxFFTPrefilter); listboxFFTPrefilter->align(Fl_Align(FL_ALIGN_RIGHT)); listboxFFTPrefilter->when(FL_WHEN_RELEASE); listboxFFTPrefilter->add(_("Rectangular")); listboxFFTPrefilter->add("Blackman"); listboxFFTPrefilter->add("Hamming"); listboxFFTPrefilter->add("Hanning"); listboxFFTPrefilter->add(_("Triangular")); listboxFFTPrefilter->index(progdefaults.wfPreFilter); o->labelsize(FL_NORMAL_SIZE); listboxFFTPrefilter->end(); } // Fl_ListBox* listboxFFTPrefilter { Fl_Counter2* o = cntrWfwidth = new Fl_Counter2(519, 43, 95, 22, _("Upper limit")); cntrWfwidth->tooltip(_("High frequency limit in Hz")); cntrWfwidth->type(1); cntrWfwidth->box(FL_UP_BOX); cntrWfwidth->color(FL_BACKGROUND_COLOR); cntrWfwidth->selection_color(FL_INACTIVE_COLOR); cntrWfwidth->labeltype(FL_NORMAL_LABEL); cntrWfwidth->labelfont(0); cntrWfwidth->labelsize(14); cntrWfwidth->labelcolor(FL_FOREGROUND_COLOR); cntrWfwidth->minimum(2000); cntrWfwidth->maximum(4000); cntrWfwidth->step(100); cntrWfwidth->value(3000); cntrWfwidth->callback((Fl_Callback*)cb_cntrWfwidth); cntrWfwidth->align(Fl_Align(FL_ALIGN_RIGHT)); cntrWfwidth->when(FL_WHEN_CHANGED); o->value(progdefaults.HighFreqCutoff); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntrWfwidth { Fl_Counter2* o = wf_latency = new Fl_Counter2(519, 78, 95, 22, _("Latency")); wf_latency->tooltip(_("Signal averaging over time\n0 - least\n4 - greatest")); wf_latency->type(1); wf_latency->box(FL_UP_BOX); wf_latency->color(FL_BACKGROUND_COLOR); wf_latency->selection_color(FL_INACTIVE_COLOR); wf_latency->labeltype(FL_NORMAL_LABEL); wf_latency->labelfont(0); wf_latency->labelsize(14); wf_latency->labelcolor(FL_FOREGROUND_COLOR); wf_latency->minimum(1); wf_latency->maximum(16); wf_latency->step(1); wf_latency->value(8); wf_latency->callback((Fl_Callback*)cb_wf_latency); wf_latency->align(Fl_Align(FL_ALIGN_RIGHT)); wf_latency->when(FL_WHEN_CHANGED); o->value(progdefaults.wf_latency); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* wf_latency o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(251, 166, 490, 73); o->tooltip(_("Show me more or less waterfall")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Counter* o = cntr_drop_speed = new Fl_Counter(296, 188, 95, 22, _("Slow drop rate")); cntr_drop_speed->tooltip(_("Normal drop speed / value")); cntr_drop_speed->type(1); cntr_drop_speed->minimum(4); cntr_drop_speed->maximum(32); cntr_drop_speed->step(2); cntr_drop_speed->value(4); cntr_drop_speed->callback((Fl_Callback*)cb_cntr_drop_speed); cntr_drop_speed->align(Fl_Align(FL_ALIGN_RIGHT_TOP)); o->value(progdefaults.drop_speed); } // Fl_Counter* cntr_drop_speed o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(251, 246, 490, 73, _("Changes take effect on next program startup")); o->tooltip(_("Show me more or less waterfall")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntrWfheight = new Fl_Counter2(296, 276, 120, 22, _("Waterfall height in pixels")); cntrWfheight->tooltip(_("CPU usage increases with waterfall height")); cntrWfheight->box(FL_UP_BOX); cntrWfheight->color(FL_BACKGROUND_COLOR); cntrWfheight->selection_color(FL_INACTIVE_COLOR); cntrWfheight->labeltype(FL_NORMAL_LABEL); cntrWfheight->labelfont(0); cntrWfheight->labelsize(14); cntrWfheight->labelcolor(FL_FOREGROUND_COLOR); cntrWfheight->minimum(100); cntrWfheight->maximum(500); cntrWfheight->step(5); cntrWfheight->value(120); cntrWfheight->callback((Fl_Callback*)cb_cntrWfheight); cntrWfheight->align(Fl_Align(FL_ALIGN_RIGHT)); cntrWfheight->when(FL_WHEN_CHANGED); o->value(progdefaults.wfheight); o->labelsize(FL_NORMAL_SIZE); o->lstep(50); } // Fl_Counter2* cntrWfheight o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/FFT Processing")); config_pages.push_back(p); tab_tree->add(_("Waterfall/FFT Processing")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Waterfall/Mouse usage")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(211, 50, 580, 170); o->box(FL_ENGRAVED_FRAME); { Fl_Check_Button* o = btnWaterfallHistoryDefault = new Fl_Check_Button(266, 65, 340, 20, _("Left or right click always replays audio history")); btnWaterfallHistoryDefault->tooltip(_("Replay trackline audio")); btnWaterfallHistoryDefault->down_box(FL_DOWN_BOX); btnWaterfallHistoryDefault->callback((Fl_Callback*)cb_btnWaterfallHistoryDefault); o->value(progdefaults.WaterfallHistoryDefault); } // Fl_Check_Button* btnWaterfallHistoryDefault { Fl_Check_Button* o = btnWaterfallQSY = new Fl_Check_Button(266, 95, 380, 20, _("Dragging on the waterfall scale changes frequency")); btnWaterfallQSY->tooltip(_("Enable drag cursor on waterfall scale")); btnWaterfallQSY->down_box(FL_DOWN_BOX); btnWaterfallQSY->callback((Fl_Callback*)cb_btnWaterfallQSY); o->value(progdefaults.WaterfallQSY); } // Fl_Check_Button* btnWaterfallQSY { Fl_Check_Button* o = btnWaterfallClickInsert = new Fl_Check_Button(266, 137, 225, 20, _("Insert text on single left click")); btnWaterfallClickInsert->tooltip(_("Insert special text in Rx panel\nwhen waterfall clicked")); btnWaterfallClickInsert->down_box(FL_DOWN_BOX); btnWaterfallClickInsert->callback((Fl_Callback*)cb_btnWaterfallClickInsert); o->value(progdefaults.WaterfallClickInsert); } // Fl_Check_Button* btnWaterfallClickInsert { inpWaterfallClickText = new Fl_Input2(552, 125, 180, 50); inpWaterfallClickText->tooltip(_("The string is replaced with\nthe current modem and frequency")); inpWaterfallClickText->box(FL_DOWN_BOX); inpWaterfallClickText->color(FL_BACKGROUND2_COLOR); inpWaterfallClickText->selection_color(FL_SELECTION_COLOR); inpWaterfallClickText->labeltype(FL_NORMAL_LABEL); inpWaterfallClickText->labelfont(0); inpWaterfallClickText->labelsize(14); inpWaterfallClickText->labelcolor(FL_FOREGROUND_COLOR); inpWaterfallClickText->callback((Fl_Callback*)cb_inpWaterfallClickText); inpWaterfallClickText->align(Fl_Align(FL_ALIGN_RIGHT)); inpWaterfallClickText->when(FL_WHEN_RELEASE); } // Fl_Input2* inpWaterfallClickText { Fl_ListBox* o = listboxWaterfallWheelAction = new Fl_ListBox(266, 178, 150, 22, _("Wheel action")); listboxWaterfallWheelAction->tooltip(_("Select how the mouse wheel\nbehaves inside the waterfall")); listboxWaterfallWheelAction->box(FL_DOWN_BOX); listboxWaterfallWheelAction->color(FL_BACKGROUND2_COLOR); listboxWaterfallWheelAction->selection_color(FL_BACKGROUND_COLOR); listboxWaterfallWheelAction->labeltype(FL_NORMAL_LABEL); listboxWaterfallWheelAction->labelfont(0); listboxWaterfallWheelAction->labelsize(14); listboxWaterfallWheelAction->labelcolor(FL_FOREGROUND_COLOR); listboxWaterfallWheelAction->callback((Fl_Callback*)cb_listboxWaterfallWheelAction); listboxWaterfallWheelAction->align(Fl_Align(FL_ALIGN_RIGHT)); listboxWaterfallWheelAction->when(FL_WHEN_RELEASE); o->labelsize(FL_NORMAL_SIZE); listboxWaterfallWheelAction->end(); } // Fl_ListBox* listboxWaterfallWheelAction o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/Mouse usage")); config_pages.push_back(p); tab_tree->add(_("Waterfall/Mouse usage")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Waterfall/Spectrum")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(210, 50, 580, 150, _("Spectrum Scope / Waterfall interaction")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btnWFspectrum_center = new Fl_Check_Button(275, 92, 365, 20, _("left click transfers frequency to scope center frequency")); btnWFspectrum_center->tooltip(_("left click on WF recenters spectrum scope")); btnWFspectrum_center->down_box(FL_DOWN_BOX); btnWFspectrum_center->callback((Fl_Callback*)cb_btnWFspectrum_center); o->value(progdefaults.wf_spectrum_center); } // Fl_Check_Button* btnWFspectrum_center { Fl_Check_Button* o = btnWFspectrum_dbvals = new Fl_Check_Button(275, 123, 221, 20, _("use waterfall range/limit values")); btnWFspectrum_dbvals->tooltip(_("values left/below waterfall")); btnWFspectrum_dbvals->down_box(FL_DOWN_BOX); btnWFspectrum_dbvals->callback((Fl_Callback*)cb_btnWFspectrum_dbvals); o->value(progdefaults.wf_spectrum_dbvals); } // Fl_Check_Button* btnWFspectrum_dbvals { Fl_Counter* o = cntr_spectrum_freq_scale = new Fl_Counter(275, 155, 75, 20, _("freq scale = N * modem bandwidth")); cntr_spectrum_freq_scale->type(1); cntr_spectrum_freq_scale->minimum(1); cntr_spectrum_freq_scale->maximum(10); cntr_spectrum_freq_scale->step(1); cntr_spectrum_freq_scale->value(5); cntr_spectrum_freq_scale->callback((Fl_Callback*)cb_cntr_spectrum_freq_scale); cntr_spectrum_freq_scale->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.wf_spectrum_scale_factor); } // Fl_Counter* cntr_spectrum_freq_scale { Fl_Check_Button* o = btn_spectrum_modem_scale = new Fl_Check_Button(585, 155, 55, 20, _("use")); btn_spectrum_modem_scale->tooltip(_("scale spectrum display linked to modem bandwidth")); btn_spectrum_modem_scale->down_box(FL_DOWN_BOX); btn_spectrum_modem_scale->callback((Fl_Callback*)cb_btn_spectrum_modem_scale); o->value(progdefaults.wf_spectrum_modem_scale); } // Fl_Check_Button* btn_spectrum_modem_scale o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Waterfall/Spectrum")); config_pages.push_back(p); tab_tree->add(_("Waterfall/Spectrum")); tab_tree->close(_("Waterfall")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Web/Pskmail")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Group* o = new Fl_Group(256, 52, 490, 174, _("Mail Server Attributes")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Counter2* o = cntServerCarrier = new Fl_Counter2(307, 80, 80, 20, _("Carrier frequency (Hz)")); cntServerCarrier->tooltip(_("Default listen / transmit frequency")); cntServerCarrier->type(1); cntServerCarrier->box(FL_UP_BOX); cntServerCarrier->color(FL_BACKGROUND_COLOR); cntServerCarrier->selection_color(FL_INACTIVE_COLOR); cntServerCarrier->labeltype(FL_NORMAL_LABEL); cntServerCarrier->labelfont(0); cntServerCarrier->labelsize(14); cntServerCarrier->labelcolor(FL_FOREGROUND_COLOR); cntServerCarrier->minimum(500); cntServerCarrier->maximum(2500); cntServerCarrier->step(25); cntServerCarrier->value(1500); cntServerCarrier->callback((Fl_Callback*)cb_cntServerCarrier); cntServerCarrier->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerCarrier->when(FL_WHEN_CHANGED); o->value(progdefaults.ServerCarrier); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerCarrier { Fl_Counter2* o = cntServerOffset = new Fl_Counter2(307, 117, 80, 20, _("Search range (Hz)")); cntServerOffset->tooltip(_("Listen for signals within this range")); cntServerOffset->type(1); cntServerOffset->box(FL_UP_BOX); cntServerOffset->color(FL_BACKGROUND_COLOR); cntServerOffset->selection_color(FL_INACTIVE_COLOR); cntServerOffset->labeltype(FL_NORMAL_LABEL); cntServerOffset->labelfont(0); cntServerOffset->labelsize(14); cntServerOffset->labelcolor(FL_FOREGROUND_COLOR); cntServerOffset->minimum(10); cntServerOffset->maximum(500); cntServerOffset->step(10); cntServerOffset->value(100); cntServerOffset->callback((Fl_Callback*)cb_cntServerOffset); cntServerOffset->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerOffset->when(FL_WHEN_CHANGED); o->value(progdefaults.SearchRange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerOffset { Fl_Counter2* o = cntServerACQsn = new Fl_Counter2(307, 154, 80, 20, _("Acquisition S/N (dB)")); cntServerACQsn->tooltip(_("Capture signals over this threshold")); cntServerACQsn->type(1); cntServerACQsn->box(FL_UP_BOX); cntServerACQsn->color(FL_BACKGROUND_COLOR); cntServerACQsn->selection_color(FL_INACTIVE_COLOR); cntServerACQsn->labeltype(FL_NORMAL_LABEL); cntServerACQsn->labelfont(0); cntServerACQsn->labelsize(14); cntServerACQsn->labelcolor(FL_FOREGROUND_COLOR); cntServerACQsn->minimum(3); cntServerACQsn->maximum(20); cntServerACQsn->step(1); cntServerACQsn->value(6); cntServerACQsn->callback((Fl_Callback*)cb_cntServerACQsn); cntServerACQsn->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerACQsn->when(FL_WHEN_CHANGED); o->value(progdefaults.ServerACQsn); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerACQsn { Fl_Counter2* o = cntServerAFCrange = new Fl_Counter2(307, 191, 80, 20, _("AFC range (Hz)")); cntServerAFCrange->tooltip(_("Limit AFC movement to this range")); cntServerAFCrange->type(1); cntServerAFCrange->box(FL_UP_BOX); cntServerAFCrange->color(FL_BACKGROUND_COLOR); cntServerAFCrange->selection_color(FL_INACTIVE_COLOR); cntServerAFCrange->labeltype(FL_NORMAL_LABEL); cntServerAFCrange->labelfont(0); cntServerAFCrange->labelsize(14); cntServerAFCrange->labelcolor(FL_FOREGROUND_COLOR); cntServerAFCrange->minimum(10); cntServerAFCrange->maximum(500); cntServerAFCrange->step(10); cntServerAFCrange->value(25); cntServerAFCrange->callback((Fl_Callback*)cb_cntServerAFCrange); cntServerAFCrange->align(Fl_Align(FL_ALIGN_RIGHT)); cntServerAFCrange->when(FL_WHEN_CHANGED); o->value(progdefaults.SearchRange); o->labelsize(FL_NORMAL_SIZE); } // Fl_Counter2* cntServerAFCrange { Fl_Check_Button* o = btnPSKmailSweetSpot = new Fl_Check_Button(562, 80, 142, 20, _("Reset to Carrier")); btnPSKmailSweetSpot->tooltip(_("When no signal present")); btnPSKmailSweetSpot->down_box(FL_DOWN_BOX); btnPSKmailSweetSpot->value(1); btnPSKmailSweetSpot->callback((Fl_Callback*)cb_btnPSKmailSweetSpot); o->value(progdefaults.PSKmailSweetSpot); } // Fl_Check_Button* btnPSKmailSweetSpot o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(256, 228, 490, 72, _("General")); o->box(FL_ENGRAVED_FRAME); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); { Fl_Check_Button* o = btn_arq_s2n_report = new Fl_Check_Button(281, 253, 250, 20, _("Report ARQ frames average S/N")); btn_arq_s2n_report->down_box(FL_DOWN_BOX); btn_arq_s2n_report->callback((Fl_Callback*)cb_btn_arq_s2n_report); o->value(progdefaults.Pskmails2nreport); } // Fl_Check_Button* btn_arq_s2n_report o->end(); } // Fl_Group* o CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Web/Pskmail")); config_pages.push_back(p); tab_tree->add(_("Web/Pskmail")); o->end(); } // Fl_Group* o { Fl_Group* o = new Fl_Group(200, 0, 600, 350, _("Web/WX")); o->box(FL_ENGRAVED_BOX); o->align(Fl_Align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE)); o->hide(); { Fl_Input* o = txt_wx_url = new Fl_Input(295, 63, 430, 25, _("Access URL")); txt_wx_url->tooltip(_("Enter METAR data internet URL")); txt_wx_url->callback((Fl_Callback*)cb_txt_wx_url); txt_wx_url->when(FL_WHEN_CHANGED); o->value(progdefaults.wx_url.c_str()); } // Fl_Input* txt_wx_url { btn_default_wx_url = new Fl_Button(727, 63, 60, 25, _("Default")); btn_default_wx_url->tooltip(_("Default URL")); btn_default_wx_url->callback((Fl_Callback*)cb_btn_default_wx_url); } // Fl_Button* btn_default_wx_url { Fl_Input* o = inpWXsta = new Fl_Input(295, 99, 50, 24, _("METAR station ID code")); inpWXsta->tooltip(_("for example KMDQ for\nHuntsville-Madison Executive Airport, AL")); inpWXsta->callback((Fl_Callback*)cb_inpWXsta); inpWXsta->align(Fl_Align(FL_ALIGN_RIGHT)); o->value(progdefaults.wx_sta.c_str()); } // Fl_Input* inpWXsta { btn_metar_search = new Fl_Button(528, 99, 130, 24, _("Search on web")); btn_metar_search->callback((Fl_Callback*)cb_btn_metar_search); } // Fl_Button* btn_metar_search { Fl_Check_Button* o = btn_wx_full = new Fl_Check_Button(303, 138, 70, 15, _("Full report")); btn_wx_full->tooltip(_("Insert full METAR report")); btn_wx_full->down_box(FL_DOWN_BOX); btn_wx_full->callback((Fl_Callback*)cb_btn_wx_full); o->value(progdefaults.wx_full); } // Fl_Check_Button* btn_wx_full { Fl_Check_Button* o = btn_wx_station_name = new Fl_Check_Button(303, 162, 70, 15, _("METAR station location")); btn_wx_station_name->tooltip(_("Add geopolitical name of METAR station")); btn_wx_station_name->down_box(FL_DOWN_BOX); btn_wx_station_name->callback((Fl_Callback*)cb_btn_wx_station_name); o->value(progdefaults.wx_station_name); } // Fl_Check_Button* btn_wx_station_name { Fl_Check_Button* o = btn_wx_condx = new Fl_Check_Button(303, 188, 70, 15, _("Conditions")); btn_wx_condx->tooltip(_("current wx conditions")); btn_wx_condx->down_box(FL_DOWN_BOX); btn_wx_condx->callback((Fl_Callback*)cb_btn_wx_condx); o->value(progdefaults.wx_condx); } // Fl_Check_Button* btn_wx_condx { Fl_Check_Button* o = btn_wx_fahrenheit = new Fl_Check_Button(303, 227, 70, 15, _("Fahrenheit")); btn_wx_fahrenheit->tooltip(_("report Fahrenheit")); btn_wx_fahrenheit->down_box(FL_DOWN_BOX); btn_wx_fahrenheit->callback((Fl_Callback*)cb_btn_wx_fahrenheit); o->value(progdefaults.wx_fahrenheit); } // Fl_Check_Button* btn_wx_fahrenheit { Fl_Check_Button* o = btn_wx_celsius = new Fl_Check_Button(522, 227, 70, 15, _("Celsius")); btn_wx_celsius->tooltip(_("report Celsius")); btn_wx_celsius->down_box(FL_DOWN_BOX); btn_wx_celsius->callback((Fl_Callback*)cb_btn_wx_celsius); o->value(progdefaults.wx_celsius); } // Fl_Check_Button* btn_wx_celsius { Fl_Check_Button* o = btn_wx_mph = new Fl_Check_Button(303, 253, 70, 15, _("Miles / Hour")); btn_wx_mph->tooltip(_("report miles per hour")); btn_wx_mph->down_box(FL_DOWN_BOX); btn_wx_mph->callback((Fl_Callback*)cb_btn_wx_mph); o->value(progdefaults.wx_mph); } // Fl_Check_Button* btn_wx_mph { Fl_Check_Button* o = btn_wx_kph = new Fl_Check_Button(521, 253, 70, 15, _("kilometers / hour")); btn_wx_kph->tooltip(_("report kilometers per hour")); btn_wx_kph->down_box(FL_DOWN_BOX); btn_wx_kph->callback((Fl_Callback*)cb_btn_wx_kph); o->value(progdefaults.wx_kph); } // Fl_Check_Button* btn_wx_kph { Fl_Check_Button* o = btn_wx_inches = new Fl_Check_Button(303, 280, 70, 15, _("Inches Hg.")); btn_wx_inches->tooltip(_("report inches mercury")); btn_wx_inches->down_box(FL_DOWN_BOX); btn_wx_inches->callback((Fl_Callback*)cb_btn_wx_inches); o->value(progdefaults.wx_inches); } // Fl_Check_Button* btn_wx_inches { Fl_Check_Button* o = btn_wx_mbars = new Fl_Check_Button(522, 280, 70, 15, _("mbars")); btn_wx_mbars->tooltip(_("report millibars")); btn_wx_mbars->down_box(FL_DOWN_BOX); btn_wx_mbars->callback((Fl_Callback*)cb_btn_wx_mbars); o->value(progdefaults.wx_mbars); } // Fl_Check_Button* btn_wx_mbars { Fl_Check_Button* o = btn_wx_raw = new Fl_Check_Button(522, 138, 70, 15, _("Unprocessed METAR data")); btn_wx_raw->tooltip(_("Insert full METAR report")); btn_wx_raw->down_box(FL_DOWN_BOX); btn_wx_raw->callback((Fl_Callback*)cb_btn_wx_raw); o->value(progdefaults.wx_raw); } // Fl_Check_Button* btn_wx_raw CONFIG_PAGE *p = new CONFIG_PAGE(o, _("Web/WX")); config_pages.push_back(p); tab_tree->add(_("Web/WX")); tab_tree->close(_("Web")); o->end(); } // Fl_Group* o { btnSaveConfig = new Fl_Button(492, 355, 130, 22, _("Save")); btnSaveConfig->callback((Fl_Callback*)cb_btnSaveConfig); } // Fl_Button* btnSaveConfig { btnCloseConfig = new Fl_Return_Button(665, 355, 130, 22, _("Close")); btnCloseConfig->callback((Fl_Callback*)cb_btnCloseConfig); } // Fl_Return_Button* btnCloseConfig { btnResetConfig = new Fl_Button(238, 355, 130, 22, _("Restore defaults")); btnResetConfig->tooltip(_("WARNING - this will over write ALL settings")); btnResetConfig->callback((Fl_Callback*)cb_btnResetConfig); } // Fl_Button* btnResetConfig o->size_range(750, 380, 0, 380); o->end(); } // Fl_Double_Window* o return w; } void openConfig() { if (!dlgConfig) createConfig(); progdefaults.loadDefaults(); } void closeDialog() { if (dlgConfig) dlgConfig->hide(); } void WefaxDestDirSet(Fl_File_Chooser *w, void *userdata) { /* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnWefaxSaveDir->value( w->value() ); btnWefaxSaveDir->redraw(); cb_btnWefaxSaveDir( btnWefaxSaveDir, NULL ); } } void KmlDestDirSet(Fl_File_Chooser *w, void *userdata) { /* http://www.fltk.org/documentation.php/doc-1.1/Fl_File_Chooser.html */ if( ( w->value() != NULL ) && ( ! w->shown() ) ) { btnKmlSaveDir->value( w->value() ); btnKmlSaveDir->redraw(); cb_btnKmlSaveDir( btnKmlSaveDir, NULL ); } } fldigi-4.2.05/src/thor/0000775000175000017500000000000014611714005011605 500000000000000fldigi-4.2.05/src/thor/thorvaricode.cxx0000664000175000017500000001337314532252172014755 00000000000000// ---------------------------------------------------------------------------- // // thorvaricode.cxx -- THOR Varicode // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "mfskvaricode.h" #include "thorvaricode.h" // THOR varicode is an extended set of the IZ8BLY MFSK varicode that uses the // unallocated remaining 12 bit codes for a secondary character set. // Primary character set (same as MFSK) // extended 12 bit codes for secondary characters // 90 used, leaving 10 for possible special use // encoding table static const char *thor_varicode[] = { "101110000000", /* 032 - */ "101110100000", /* 033 - ! */ "101110101000", /* 034 - '"' */ "101110101100", /* 035 - # */ "101110110000", /* 036 - $ */ "101110110100", /* 037 - % */ "101110111000", /* 038 - & */ "101110111100", /* 039 - ' */ "101111000000", /* 040 - ( */ "101111010000", /* 041 - ) */ "101111010100", /* 042 - * */ "101111011000", /* 043 - + */ "101111011100", /* 044 - , */ "101111100000", /* 045 - - */ "101111101000", /* 046 - . */ "101111101100", /* 047 - / */ "101111110000", /* 048 - 0 */ "101111110100", /* 049 - 1 */ "101111111000", /* 050 - 2 */ "101111111100", /* 051 - 3 */ "110000000000", /* 052 - 4 */ "110100000000", /* 053 - 5 */ "110101000000", /* 054 - 6 */ "110101010100", /* 055 - 7 */ "110101011000", /* 056 - 8 */ "110101011100", /* 057 - 9 */ "110101100000", /* 058 - : */ "110101101000", /* 059 - ; */ "110101101100", /* 060 - < */ "110101110000", /* 061 - = */ "110101110100", /* 062 - > */ "110101111000", /* 063 - ? */ "110101111100", /* 064 - @ */ "110110000000", /* 065 - A */ "110110100000", /* 066 - B */ "110110101000", /* 067 - C */ "110110101100", /* 068 - D */ "110110110000", /* 069 - E */ "110110110100", /* 070 - F */ "110110111000", /* 071 - G */ "110110111100", /* 072 - H */ "110111000000", /* 073 - I */ "110111010000", /* 074 - J */ "110111010100", /* 075 - K */ "110111011000", /* 076 - L */ "110111011100", /* 077 - M */ "110111100000", /* 078 - N */ "110111101000", /* 079 - O */ "110111101100", /* 080 - P */ "110111110000", /* 081 - Q */ "110111110100", /* 082 - R */ "110111111000", /* 083 - S */ "110111111100", /* 084 - T */ "111000000000", /* 085 - U */ "111010000000", /* 086 - V */ "111010100000", /* 087 - W */ "111010101100", /* 088 - X */ "111010110000", /* 089 - Y */ "111010110100", /* 090 - Z */ "111010111000", /* 091 - [ */ "111010111100", /* 092 - \ */ "111011000000", /* 093 - ] */ "111011010000", /* 094 - ^ */ "111011010100", /* 095 - _ */ "111011011000", /* 096 - ` */ "111011011100", /* 097 - a */ "111011100000", /* 098 - b */ "111011101000", /* 099 - c */ "111011101100", /* 100 - d */ "111011110000", /* 101 - e */ "111011110100", /* 102 - f */ "111011111000", /* 103 - g */ "111011111100", /* 104 - h */ "111100000000", /* 105 - i */ "111101000000", /* 106 - j */ "111101010000", /* 107 - k */ "111101010100", /* 108 - l */ "111101011000", /* 109 - m */ "111101011100", /* 110 - n */ "111101100000", /* 111 - o */ "111101101000", /* 112 - p */ "111101101100", /* 113 - q */ "111101110000", /* 114 - r */ "111101110100", /* 115 - s */ "111101111000", /* 116 - t */ "111101111100", /* 117 - u */ "111110000000", /* 118 - v */ "111110100000", /* 119 - w */ "111110101000", /* 120 - x */ "111110101100", /* 121 - y */ "111110110000" /* 122 - z */ }; // unused 12 bit varicodes /* static char *unused[] = { "111110110100", "111110111000", "111110111100", "111111000000", "111111010100", "111111011000", "111111011100", "111111100000", "111111101000", "111111101100", "111111110000", "111111110100", "111111111100" }; */ // decoding table static const unsigned int thor_varidecode[] = { 0xB80, 0xBA0, 0xBA8, 0xBAC, 0xBB0, 0xBB4, 0xBB8, 0xBBC, 0xBC0, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE8, 0xBEC, 0xBF0, 0xBF4, 0xBF8, 0xBFC, 0xC00, 0xD00, 0xD40, 0xD54, 0xD58, 0xD5C, 0xD60, 0xD68, 0xD6C, 0xD70, 0xD74, 0xD78, 0xD7C, 0xD80, 0xDA0, 0xDA8, 0xDAC, 0xDB0, 0xDB4, 0xDB8, 0xDBC, 0xDC0, 0xDD0, 0xDD4, 0xDD8, 0xDDC, 0xDE0, 0xDE8, 0xDEC, 0xDF0, 0xDF4, 0xDF8, 0xDFC, 0xE00, 0xE80, 0xEA0, 0xEAC, 0xEB0, 0xEB4, 0xEB8, 0xEBC, 0xEC0, 0xED0, 0xED4, 0xED8, 0xEDC, 0xEE0, 0xEE8, 0xEEC, 0xEF0, 0xEF4, 0xEF8, 0xEFC, 0xF00, 0xF40, 0xF50, 0xF54, 0xF58, 0xF5C, 0xF60, 0xF68, 0xF6C, 0xF70, 0xF74, 0xF78, 0xF7C, 0xF80, 0xFA0, 0xFA8, 0xFAC, 0xFB0 }; static int limit = sizeof(thor_varidecode)/sizeof(unsigned int); const char *thorvarienc(int c, int sec) { if (sec == 0) return varienc(c); // mfsk varicode else if (c >= ' ' && c <= 'z') return thor_varicode[c - ' ']; return varienc(0); // return code for NULL if not in tables } int thorvaridec(unsigned int symbol) { int i; if (symbol < 0xB80) return varidec(symbol); // find in the MFSK decode table for (i = 0; i < limit; i++) if (symbol == thor_varidecode[i]) return (' ' + i + 0x100); // found in the extended decode table return -1; // not found } fldigi-4.2.05/src/thor/thor.cxx0000664000175000017500000010674714611711171013245 00000000000000// ---------------------------------------------------------------------------- // thor.cxx -- thor modem // // Copyright (C) 2008-2012 // David Freese // John Douyere // John Phelps // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "confdialog.h" #include "status.h" #include "thor.h" #include "trx.h" #include "fl_digi.h" #include "filters.h" #include "misc.h" #include "sound.h" #include "thorvaricode.h" #include "ascii.h" #include "main.h" #include "debug.h" // Enable to enable profiling output for the soft-decision decoder #define SOFTPROFILE false //#define SOFTPROFILE true static char thormsg[80]; static char confidence[80]; static double s2nvals[500]; static double quavals[500]; static int s2nptr = 0; #include "thor-pic.cxx" void thor::tx_init() { txstate = TX_STATE_PREAMBLE; txprevtone = 0; bitstate = 0; counter = 0; txphase = 0; videoText(); strSecXmtText = progdefaults.THORsecText; if (strSecXmtText.length() == 0) strSecXmtText = "fldigi " PACKAGE_VERSION " "; cptr = 0; } void thor::rx_init() { synccounter = 0; symcounter = 0; met1 = 0.0; met2 = 0.0; counter = 0; phase[0] = 0.0; currmag = prev1mag = prev2mag = 0.0; // avgsig = 1e-20; for (int i = 0; i < THORMAXFFTS; i++) phase[i+1] = 0.0; put_MODEstatus(mode); put_sec_char(0); syncfilter->reset(); datashreg = 1; sig = noise = 6; s2n_valid = false; txstate = TX_STATE_RECEIVE; state = TEXT; pic_str = " "; img_phase = 0.0; } void thor::reset_filters() { //LOG_INFO("%s", "Reset filters"); // fft filter at first IF frequency if (fft) fft->create_filter( (THORFIRSTIF - 0.5 * progdefaults.THOR_BW * bandwidth) / samplerate, (THORFIRSTIF + 0.5 * progdefaults.THOR_BW * bandwidth)/ samplerate ); for (int i = 0; i < THORMAXFFTS; i++) if (binsfft[i]) { delete binsfft[i]; binsfft[i] = 0; } if (slowcpu) { extones = 4; paths = THORSLOWPATHS; } else { extones = THORNUMTONES / 2; paths = THORFASTPATHS; } lotone = basetone - extones * doublespaced; hitone = basetone + THORNUMTONES * doublespaced + extones * doublespaced; numbins = hitone - lotone; //LOG_INFO("MAX ARRAY SIZE %d, paths %d, numbins %d, array_size %d", MAXPATHS, paths, numbins, numbins * paths); for (int i = 0; i < paths; i++) { if (binsfft[i]) delete binsfft[i]; binsfft[i] = new sfft (symlen, lotone, hitone); } //LOG_INFO("binsfft(%d) initialized", paths); for (int i = 0; i < THORSCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; vidfilter[i] = new Cmovavg(16); } //LOG_INFO("vidfilter(%d) initialized", THORSCOPESIZE); if (syncfilter) delete syncfilter; syncfilter = new Cmovavg(8); //LOG_INFO("%s", "syncfilter initialized"); filter_reset = false; } void thor::restart() { filter_reset = true; } void thor::init() { //LOG_INFO("%s", "thor::init"); modem::init(); if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); // reset_filters(); rx_init(); imageheader.clear(); avatarheader.clear(); set_scope_mode(Digiscope::DOMDATA); } thor::~thor() { if (hilbert) delete hilbert; for (int i = 0; i < THORMAXFFTS; i++) { if (binsfft[i]) delete binsfft[i]; } for (int i = 0; i < THORSCOPESIZE; i++) { if (vidfilter[i]) delete vidfilter[i]; } if (syncfilter) delete syncfilter; if (pipe) delete [] pipe; if (fft) delete fft; if (Rxinlv) delete Rxinlv; if (Txinlv) delete Txinlv; if (Dec) delete Dec; if (Enc) delete Enc; delete picfilter; delete pixfilter; delete pixsyncfilter; activate_thor_image_item(false); } thor::thor(trx_mode md) : hilbert(0), fft(0), filter_reset(false) { cap |= CAP_REV; mode = md; int isize = 4; int idepth = 10; flushlength = 4; switch (mode) { // 11.025 kHz modes case MODE_THOR5: symlen = 2048; doublespaced = 2; samplerate = 11025; break; case MODE_THOR11: cap |= CAP_IMG; symlen = 1024; doublespaced = 1; samplerate = 11025; break; case MODE_THOR22: cap |= CAP_IMG; symlen = 512; doublespaced = 1; samplerate = 11025; break; case MODE_THOR44: cap |= CAP_IMG; symlen = 256; doublespaced = 1; samplerate = 11025; break; // 8kHz modes case MODE_THORMICRO: symlen = 4000; doublespaced = 1; samplerate = 8000; idepth = 4; break; case MODE_THOR4: symlen = 2048; doublespaced = 2; samplerate = 8000; break; case MODE_THOR8: symlen = 1024; doublespaced = 2; samplerate = 8000; break; case MODE_THOR25x4: symlen = 320; doublespaced = 4; samplerate = 8000; idepth = 50; // 2 sec interleave flushlength = 40; break; case MODE_THOR50x1: symlen = 160; doublespaced = 1; samplerate = 8000; idepth = 50; // 1 sec interleave flushlength = 40; break; case MODE_THOR50x2: symlen = 160; doublespaced = 2; samplerate = 8000; idepth = 50; // 1 sec interleave flushlength = 40; break; case MODE_THOR100: symlen = 80; doublespaced = 1; samplerate = 8000; idepth = 50; // 0.5 sec interleave flushlength = 40; break; case MODE_THOR32: cap |= CAP_IMG; symlen = 256; doublespaced = 1; samplerate = 8000; break; // 16000 samplerate modes case MODE_THOR56: cap |= CAP_IMG; symlen = 290; doublespaced = 1; samplerate = 16000; break; // default mode case MODE_THOR16: default: cap |= CAP_IMG; symlen = 512; doublespaced = 1; samplerate = 8000; } tonespacing = 1.0 * samplerate * doublespaced / symlen; bandwidth = THORNUMTONES * tonespacing; hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); // fft filter at first if frequency fft = new fftfilt( (THORFIRSTIF - 0.5 * progdefaults.THOR_BW * bandwidth) / samplerate, (THORFIRSTIF + 0.5 * progdefaults.THOR_BW * bandwidth)/ samplerate, 1024 ); basetone = (int)floor(THORBASEFREQ * symlen / samplerate + 0.5); slowcpu = progdefaults.slowcpu; for (int i = 0; i < THORMAXFFTS; i++) binsfft[i] = 0; for (int i = 0; i < THORSCOPESIZE; i++) vidfilter[i] = 0; syncfilter = 0; reset_filters(); twosym = 2 * symlen; pipe = new THORrxpipe[twosym]; scopedata.alloc(THORSCOPESIZE); videodata.alloc(THORMAXFFTS * numbins ); pipeptr = 0; symcounter = 0; metric = 0.0; for (int n = 0; n < 500; n++) { s2nvals[n] = -20; quavals[n] = 0; } fragmentsize = symlen; s2n = 0.0; prev1symbol = prev2symbol = 0; prev1symbol = prev2symbol = 0; if ( mode == MODE_THOR100 || mode == MODE_THOR50x1 || mode == MODE_THOR50x2 || mode == MODE_THOR25x4 ) { Enc = new encoder (THOR_K15, K15_POLY1, K15_POLY2); Dec = new viterbi (THOR_K15, K15_POLY1, K15_POLY2); Dec->settraceback (15 * 12); // Long constraint length codes require longer traceback } else { Enc = new encoder (THOR_K, THOR_POLY1, THOR_POLY2); Dec = new viterbi (THOR_K, THOR_POLY1, THOR_POLY2); Dec->settraceback (45); } Txinlv = new interleave (isize, idepth, INTERLEAVE_FWD); Rxinlv = new interleave (isize, idepth, INTERLEAVE_REV); Dec->setchunksize (1); bitstate = 0; symbolpair[0] = symbolpair[1] = 0; datashreg = 1; picfilter = new C_FIR_filter(); picfilter->init_lowpass(257, 1, 1.0 * bandwidth / samplerate); IMAGEspp = THOR_IMAGESPP; pixfilter = new Cmovavg(IMAGEspp); pixsyncfilter = new Cmovavg(IMAGEspp * 2);//3*IMAGEspp); init(); activate_thor_image_item(true); } //===================================================================== // rx modules cmplx thor::mixer(int n, const cmplx& in) { double f; // first IF mixer (n == 0) plus // THORMAXFFTS mixers are supported each separated by 1/THORMAXFFTS bin size // n == 1, 2, 3, 4 ... THORMAXFFTS if (n == 0) f = frequency - THORFIRSTIF; else f = THORFIRSTIF - THORBASEFREQ - bandwidth*0.5 + (samplerate / symlen) * ( (double)n / paths); cmplx z( cos(phase[n]), sin(phase[n]) ); z *= in; phase[n] -= TWOPI * f / samplerate; if (phase[n] < 0) phase[n] += TWOPI; return z; } void thor::s2nreport(void) { modem::s2nreport(); s2n_valid = false; } void thor::parse_pic(int ch) { pic_str.erase(0,1); pic_str += ch; b_ava = false; image_mode = 0; if (pic_str.find("pic%") == 0) { switch (pic_str[4]) { case 'A': picW = 59; picH = 74; b_ava = true; break; case 'T': picW = 59; picH = 74; break; case 't': picW = 59; picH = 74; image_mode = 1; break; case 'S': picW = 160; picH = 120; break; case 's': picW = 160; picH = 120; image_mode = 1; break; case 'L': picW = 320; picH = 240; break; case 'l': picW = 320; picH = 240; image_mode = 1; break; case 'V': picW = 640; picH = 480; break; case 'v': picW = 640; picH = 480; image_mode = 1; break; case 'F': picW = 640; picH = 480; image_mode = 1; break; case 'P': picW = 240; picH = 300; break; case 'p': picW = 240; picH = 300; image_mode = 1; break; case 'M': picW = 120; picH = 150; break; case 'm': picW = 120; picH = 150; image_mode = 1; break; default: return; } } else return; if (b_ava) REQ( thor_clear_avatar ); else REQ( thor_showRxViewer, pic_str[4]); image_counter = -symlen / 2; col = row = rgb = 0; pixsyncfilter->reset(); pixfilter->reset(); state = IMAGE_START; } void thor::recvchar(int c) { if (c == -1) return; if (c & 0x100) put_sec_char(c & 0xFF); else { parse_pic(c); put_rx_char(c & 0xFF); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { if (((c & 0xFF) == SOH) && !s2n_valid) { // starts collecting s2n from first SOH in stream (since start of RX) s2n_valid = true; s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } if (s2n_valid) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount++; if ((c & 0xFF) == EOT) s2nreport(); } } } } //============================================================================= // Receive //============================================================================= void thor::decodePairs(unsigned char symbol) { int c, ch, met; symbolpair[0] = symbolpair[1]; symbolpair[1] = symbol; symcounter = symcounter ? 0 : 1; if (symcounter) return; c = Dec->decode (symbolpair, &met); if (c == -1) return; // differential modem, running average of FEC confidence static int fec_confidence; if(met < 255 / 2) fec_confidence -= 2 + fec_confidence / 2; else fec_confidence += 2; if (fec_confidence < 0) fec_confidence = 0; if (fec_confidence > 100) fec_confidence = 100; // Update confidence value for later display in GUI update_quality(fec_confidence); if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) return; datashreg = (datashreg << 1) | !!c; if ((datashreg & 7) == 1) { ch = thorvaridec(datashreg >> 1); recvchar(ch); //LOG_INFO("thorvaridec %X = %d", datashreg >> 1, ch); datashreg = 1; } } void thor::decodesymbol() { int c; double fdiff;//, softmag; unsigned char symbols[4]; bool outofrange = false; // Decode the IFK+ sequence, which results in a single nibble fdiff = currsymbol - prev1symbol; if (reverse) fdiff = -fdiff; fdiff /= paths; fdiff /= doublespaced; if (fabs(fdiff) > 17) outofrange = true; c = (int)floor(fdiff + .5); { if (progdefaults.THOR_PREAMBLE) { if ( preambledetect(c) ) { softflushrx(); // Flush the soft rx pipeline with punctures (interleaver & viterbi decoder) return; } } } c -= 2; if (c < 0) c += THORNUMTONES; if (staticburst == true || outofrange == true) // puncture the code symbols[3] = symbols[2] = symbols[1] = symbols[0] = 128; else { symbols[3] = (c & 1) == 1 ? 255 : 0; c /= 2; symbols[2] = (c & 1) == 1 ? 255 : 0; c /= 2; symbols[1] = (c & 1) == 1 ? 255 : 0; c /= 2; symbols[0] = (c & 1) == 1 ? 255 : 0; c /= 2; } Rxinlv->symbols(symbols); for (int i = 0; i < 4; i++) decodePairs(symbols[i]); } void thor::softdecodesymbol() { unsigned char one, zero; int c, nextmag=127, rawdoppler=0; static int lastc=0, lastmag=0, nowmag=0, prev1rawdoppler=0; static double lastdoppler=0, nowdoppler=0; unsigned char lastsymbols[4]; bool outofrange=false; double fdiff = currsymbol - prev1symbol; if (reverse) fdiff = -fdiff; fdiff /= paths; fdiff /= doublespaced; c = (int)floor(fdiff + .5); { if (c < -16 || 0 == c || 1 == c || c > 17) outofrange = true; // Out of the range of the function thor::sendsymbol() if (progdefaults.THOR_PREAMBLE) { if ( preambledetect(c) ) { softflushrx(); // Flush the soft rx pipeline with punctures (interleaver & viterbi decoder) lastmag = 0; return; } } #if SOFTPROFILE LOG_INFO("Symbol: %3d; DELTAf: +%3d",currsymbol, c); #endif } c -= 2; if (c < 0) c += THORNUMTONES; // Calculate soft-doppler / frequency-error of the symbol // For a perfect & undistorted symbol, rawdoppler will == 0 (be a perfect multiple of paths*doublespaced) rawdoppler = (currsymbol - prev1symbol) % (paths * doublespaced) ; #if SOFTPROFILE LOG_INFO("Raw Doppler: %3d", rawdoppler); #endif if ( 0 == rawdoppler) nowdoppler = 1.0f; // Perfect symbol: assign probability = 100% else { // Detect modem "de-sync + immediate re-sync" events and reverse the incurred soft-penalty // Probability of these events increases as baudrate increases if ( -1 * prev1rawdoppler == rawdoppler) { rawdoppler = 0; lastdoppler = 1.0f; } // calculate the nowdoppler soft-value as a probability >= 50% // centering the "50% confidence point" directly between two symbols. if ( abs(rawdoppler) <= paths * doublespaced / 2 ) nowdoppler = 1.0 - ((1.0 / (paths * doublespaced)) * abs(rawdoppler)) ; else nowdoppler = 0.0 + ((1.0 / (paths * doublespaced)) * abs(rawdoppler)) ; } prev1rawdoppler = rawdoppler; // save raw-value for comparison on next run #if SOFTPROFILE LOG_INFO("Doppler Confidence: %3.1f", nowdoppler); #endif // Since the THOR modem is differential, when an outofrange error occurs // there are 2 possibilities: // . either previous (reference) symbol or current with a 50% // probability of each being the culprit. // Either way, the current symbol is lost, puncture it. There is also a // 50% probability the next symbol will have an error if (outofrange){ lastmag /= 2; nowmag = 0; nextmag /= 2; } // O is puncture/null-symbol from softdecode if (0 == currsymbol) { nowmag = 0; nextmag = 0; } // puncture while squelched if (progStatus.sqlonoff && metric < progStatus.sldrSquelchValue) nowmag = 0; // One in 16 chance the correct reference tone chosen in staticburst if (staticburst){ nowmag /= 16; nextmag /= 16; } // Apply the soft-doppler probability to the previous symbol's soft-magnitude lastmag *= lastdoppler; if (lastmag <= 0) { // puncture one = 128; zero = 128; } else if (lastmag > 127) { // limit one = 255; zero = 0; } else { // Calculate soft bits one = static_cast( lastmag+128 ); // never > 255 zero = static_cast( 127-lastmag ); // never < 0 } #if SOFTPROFILE if (outofrange) LOG_INFO("%s","outofrange"); if (staticburst) LOG_INFO("%s","staticburst"); LOG_INFO("next mag %.3d | now mag %.3d | last mag %.3d \n",nextmag, nowmag, lastmag); #endif lastsymbols[3] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; lastsymbols[2] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; lastsymbols[1] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; lastsymbols[0] = (lastc & 1) == 1 ? one : zero ; lastc /= 2; Rxinlv->symbols(lastsymbols); for (int i = 0; i < 4; i++) decodePairs(lastsymbols[i]); // Since modem is differential, wait until next symbol (to detect errors) // then decode. lastc = c; lastmag = nowmag; nowmag = nextmag; lastdoppler = nowdoppler; } int thor::harddecode() { double x, max = 0.0; int symbol = 0; double avg = 0.0; static bool cwi[MAXPATHS]; //[paths * numbins]; double cwmag; for (int i = 0; i < MAXPATHS; i++) cwi[i] = false; for (int i = 0; i < paths * numbins; i++) avg += abs(pipe[pipeptr].vector[i]); avg /= (paths * numbins); if (avg < 1e-10) avg = 1e-10; int numtests = 10; int count = 0; for (int i = 0; i < paths * numbins; i++) { cwmag = 0.0; count = 0; for (int j = 1; j <= numtests; j++) { int p = pipeptr - j; if (p < 0) p += twosym; cwmag = abs(pipe[j].vector[i])/numtests; if (cwmag >= 50.0 * (1.0 - progdefaults.ThorCWI) * avg) count++; } cwi[i] = (count == numtests); } for (int i = 0; i < paths * numbins ; i++) { if (cwi[i] == false) { x = abs(pipe[pipeptr].vector[i]); if (x > max) { max = x; symbol = i; } } else LOG_DEBUG("cwi detected in bin %d", i); } staticburst = (max / avg < 1.2); return symbol; } int thor::softdecode() { static bool lastCWI[MAXPATHS] = {false}; static bool nextCWI[MAXPATHS] = {false}; static const int SoftBailout=6; // Max number of attempts to get a valid symbol double x, max = 0.0, avg = 0.0; int symbol = 0; int avgcount = 0; int soft_symbol_trycount=0; int lowest_tone = 0; int highest_tone = paths * numbins; // Clear nextCWI bool array for this run for (int i = 0; i < MAXPATHS; i++) nextCWI[i] = false; // for (int i = lowest_tone; i < highest_tone; i++) nextCWI[i] = false; // Allow for case where symbol == prev2symbol (before calculating signal average...) if (prev2symbol && (prev2symbol < MAXPATHS - 1)) // array bounds checking lastCWI[prev2symbol-1] = lastCWI[prev2symbol] = lastCWI[prev2symbol+1] = false; // Constrict the tone set further so CWI detect & set does not go out of intended range lowest_tone += 1; highest_tone -= 1; // Calculate signal average, ignoring CWI signals for (int i = lowest_tone; i < highest_tone; i++) { if ( !lastCWI[i] ) { avg += abs(pipe[pipeptr].vector[i]); avgcount++; } } avg /= avgcount; if (avg < 1e-10) avg = 1e-10; // Run symbol-decoder until a non-CWI && non-Repeated symbol is selected do { soft_symbol_trycount++; max = 0.0; for (int i = lowest_tone; i < highest_tone; i++) { x = abs(pipe[pipeptr].vector[i]); if ( x > max && !nextCWI[i-1] && !nextCWI[i] && !nextCWI[i+1] ) { max = x; symbol = i; } } if (symbol && (symbol < MAXPATHS - 1)) { // array bounds checking // detect repeated symbols (an invalid pattern for IFK+ modems) if ( abs(prev1symbol - symbol) < paths ) { nextCWI[symbol-1] = nextCWI[symbol] = nextCWI[symbol+1] = true; } // Update the next CWI mask if the tone from last-run persists else if ( lastCWI[symbol-1] || lastCWI[symbol] || lastCWI[symbol+1] ) { nextCWI[symbol-1] = nextCWI[symbol] = nextCWI[symbol+1] = true; } } } while ( nextCWI[symbol] && soft_symbol_trycount < SoftBailout ); // Run while the detected symbol has been identified as CWI (alt: bailout after 6 trys) // Copy the newly-detected CWI mask to the static lastCWI array for use on next function call for (int i = lowest_tone-1; i < highest_tone+1; i++) lastCWI[i] = nextCWI[i]; staticburst = (max / avg < 1.2); // Return a NULL / Puncture symbol if a bailout occured if (soft_symbol_trycount >= SoftBailout) return 0; else return symbol; } bool thor::preambledetect(int c) { static int preamblecheck=0, twocount=0; static bool neg16seen=false; if (twocount > 14 ) twocount = 0; if (-16 == c && twocount > 2 ) neg16seen = true; // 2 does not reset the neg16seen bool else if (2 != c) neg16seen = false; else if (2 == c) twocount ++; // -16 does not reset the twos counter if (-16 != c && 2 != c) if (twocount > 1) twocount -= 2; #if SOFTPROFILE LOG_INFO("[2count:pcheck] [%d:%d]",twocount, preamblecheck); #endif if ( twocount > 4 && neg16seen ){ if ( ++preamblecheck > 4 ) return true; } else preamblecheck = 0; return false; } // Flush the interleaver and convolutional decoder with punctures void thor::softflushrx() { #if SOFTPROFILE LOG_INFO("%s", "softflushrx()"); #endif unsigned char puncture[2], flushsymbols[4]; puncture[0]=128; puncture[1]=128; for (int i = 0; i < 4; i++) flushsymbols[i] = 128; // flush interleaver with punctured symbols for(int i = 0; i < 90; i++) Rxinlv->symbols(flushsymbols); // flush viterbi with puncture soft-bits for (int j = 0; j < 128; j++) Dec->decode (puncture, NULL); } void thor::update_syncscope() { double max = 0, min = 1e6, range, mag; memset(videodata, 0, paths * numbins * sizeof(double)); //LOG_INFO("%s", "cleared videodata"); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (int i = 0; i < paths * numbins; i++ ) { mag = abs(pipe[pipeptr].vector[i]); if (max < mag) max = mag; if (min > mag) min = mag; } range = max - min; for (int i = 0; i < paths * numbins; i++ ) { if (range > 2) { mag = (abs(pipe[pipeptr].vector[i]) - min) / range + 0.0001; mag = 1 + 2 * log10(mag); if (mag < 0) mag = 0; } else mag = 0; videodata[(i + paths * numbins / 2)/2] = 255*mag; } } set_video(videodata, paths * numbins, false); videodata.next(); memset(scopedata, 0, THORSCOPESIZE * sizeof(double)); if (!progStatus.sqlonoff || metric >= progStatus.sldrSquelchValue) { for (unsigned int i = 0, j = 0; i < THORSCOPESIZE; i++) { j = (pipeptr + i * twosym / THORSCOPESIZE + 1) % (twosym); scopedata[i] = vidfilter[i]->run(abs(pipe[j].vector[prev1symbol])); } } set_scope(scopedata, THORSCOPESIZE); scopedata.next(); } void thor::synchronize() { double syn = -1; double val, max = 0.0; if (staticburst == true) return; if (currsymbol == prev1symbol) return; if (prev1symbol == prev2symbol) return; for (unsigned int i = 0, j = pipeptr; i < twosym; i++) { val = abs(pipe[j].vector[prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % twosym; } syn = syncfilter->run(syn); synccounter += (int) floor(1.0 * (syn - symlen) / THORNUMTONES + 0.5); update_syncscope(); } void thor::eval_s2n() { double s = abs(pipe[pipeptr].vector[currsymbol]); double n = (THORNUMTONES - 1) * abs( pipe[(pipeptr + symlen) % twosym].vector[currsymbol]); if (trx_state != STATE_RX) return; sig = decayavg( sig, s, s - sig > 0 ? 4 : 20); noise = decayavg( noise, n, 64); if (noise == 0) noise = sig / 1000.0; s2n = 20*log10(sig / noise); // To partially offset the increase of noise by (THORNUMTONES -1) // in the noise calculation above, // add 15*log10(THORNUMTONES -1) = 18.4, and multiply by 6 metric = 6 * (s2n + 18.4); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { // s2n reporting: re-calibrate s2n_metric = metric * 2.5 - 70; s2n_metric = CLAMP(s2n_metric, 0.0, 100.0); } metric = metric < 0 ? 0 : metric > 100 ? 100 : metric; display_metric(metric); s2nvals[s2nptr] = s2n; quavals[s2nptr] = get_quality(); ++s2nptr; if (s2nptr == 100) s2nptr = 0; double maxs2n = -20; double maxqual = 0; for (int n = 0; n < 500; n++) { if (s2nvals[n] > maxs2n) maxs2n = s2nvals[n]; if (quavals[n] > maxqual) maxqual = quavals[n]; } if (metric < progStatus.sldrSquelchValue) return; if (maxs2n >= -14) { snprintf(thormsg, sizeof(thormsg), "s/n %3.0f dB", maxs2n ); put_Status1(thormsg, 15, STATUS_CLEAR); } if (maxqual >= 10) { snprintf(confidence, sizeof(confidence), "err: %3d %%", (int)(100 - maxqual)); put_Status2(confidence, 15, STATUS_CLEAR); } } void thor::recvpic(double smpl) { phidiff = 2.0 * M_PI * frequency / samplerate; img_phase -= phidiff; if (img_phase < 0) img_phase += 2.0 * M_PI; cmplx z = smpl * cmplx( cos(img_phase), sin(img_phase ) ); picfilter->run( z, currz); double dphase = arg(conj(prevz) * currz); pixel = (samplerate / TWOPI) * pixfilter->run(dphase); sync = (samplerate / TWOPI) * pixsyncfilter->run(dphase); prevz = currz; image_counter++; if (image_counter < 0) return; if (state == IMAGE_START) { if (sync < -0.59 * bandwidth) { state = IMAGE_SYNC; } return; } if (state == IMAGE_SYNC) { if (sync > -0.5 * bandwidth) {//-0.51 * bandwidth) { state = IMAGE; } return; } if ((image_counter % IMAGEspp) == 0) { byte = pixel * 256.0 / bandwidth + 128; byte = (int)CLAMP( byte, 0.0, 255.0); if (image_mode == 1) { // bw transmission pixelnbr = 3 * (col + row * picW); if (b_ava) { REQ(thor_update_avatar, byte, pixelnbr); REQ(thor_update_avatar, byte, pixelnbr + 1); REQ(thor_update_avatar, byte, pixelnbr + 2); } else { REQ(thor_updateRxPic, byte, pixelnbr); REQ(thor_updateRxPic, byte, pixelnbr + 1); REQ(thor_updateRxPic, byte, pixelnbr + 2); } if (++ col == picW) { col = 0; row++; if (row >= picH) { state = TEXT; REQ(thor_enableshift); } } } else { // color transmission pixelnbr = rgb + 3 * (col + row * picW); if (b_ava) REQ(thor_update_avatar, byte, pixelnbr); else REQ(thor_updateRxPic, byte, pixelnbr); if (++col == picW) { col = 0; if (++rgb == 3) { rgb = 0; ++row; } } if (row > picH) { state = TEXT; REQ(thor_enableshift); } } } } int thor::rx_process(const double *buf, int len) { cmplx zref, *zp; cmplx zarray[1]; int n; if (slowcpu != progdefaults.slowcpu) { slowcpu = progdefaults.slowcpu; filter_reset = true; } if (filter_reset) reset_filters(); while (len) { if (state != TEXT) { recvpic(*buf); } else { // create analytic signal at first IF zref = cmplx( *buf, *buf ); hilbert->run(zref, zref); zref = mixer(0, zref); if (progdefaults.THOR_FILTER && fft) { // filter using fft convolution n = fft->run(zref, &zp); } else { zarray[0] = zref; zp = zarray; n = 1; } if (n) { for (int i = 0; i < n; i++) { cmplx * pipe_pipeptr_vector = pipe[pipeptr].vector ; const cmplx zp_i = zp[i]; // process THORMAXFFTS sets of sliding FFTs spaced at 1/THORMAXFFTS bin intervals each of which // is a matched filter for the current symbol length for (int k = 0; k < paths; k++) { // shift in frequency to base band for the sliding DFTs const cmplx z = mixer(k + 1, zp_i ); // copy current vector to the pipe interleaving the FFT vectors binsfft[k]->run(z, pipe_pipeptr_vector + k, paths ); } if (--synccounter <= 0) { synccounter = symlen; if (progdefaults.THOR_SOFTSYMBOLS) currsymbol = softdecode(); else currsymbol = harddecode(); currmag = abs(pipe_pipeptr_vector[currsymbol]); eval_s2n(); if (progdefaults.THOR_SOFTBITS) softdecodesymbol(); else decodesymbol(); synchronize(); prev2symbol = prev1symbol; prev1symbol = currsymbol; prev2mag = prev1mag; prev1mag = currmag; } pipeptr++; if (pipeptr >= twosym) pipeptr = 0; } } } buf++; --len; } return 0; } //============================================================================= // Transmit methods //============================================================================= int thor::get_secondary_char() { char chr; if (cptr >= strSecXmtText.length()) cptr = 0; chr = strSecXmtText[cptr++]; put_sec_char( chr ); return chr; } void thor::sendtone(int tone, int duration) { double f, phaseincr; f = (tone + 0.5) * tonespacing + get_txfreq_woffset() - bandwidth / 2; phaseincr = TWOPI * f / samplerate; for (int j = 0; j < duration; j++) { for (int i = 0; i < symlen; i++) { outbuf[i] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, symlen); } } void thor::sendsymbol(int sym) { cmplx z; int tone; tone = (txprevtone + 2 + sym) % THORNUMTONES; txprevtone = tone; if (reverse) tone = (THORNUMTONES - 1) - tone; sendtone(tone, 1); } // Send THOR FEC varicode void thor::sendchar(unsigned char c, int secondary) { const char *code; code = thorvarienc(c, secondary); while (*code) { int data = Enc->encode(*code++ - '0'); for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == 4) { Txinlv->bits(&bitshreg); sendsymbol(bitshreg); bitstate = 0; bitshreg = 0; } } } if (!secondary) put_echo_char(c); } void thor::sendidle() { sendchar(0, 0); // } void thor::sendsecondary() { int c = get_secondary_char(); sendchar(c & 0xFF, 1); } void thor::Clearbits() { int data = Enc->encode(0); for (int k = 0; k < 1400; k++) { for (int i = 0; i < 2; i++) { bitshreg = (bitshreg << 1) | ((data >> i) & 1); bitstate++; if (bitstate == 4) { Txinlv->bits(&bitshreg); bitstate = 0; bitshreg = 0; } } } } void thor::flushtx() { // flush the varicode decoder at the other end // flush the convolutional encoder and interleaver for (int i = 0; i < flushlength; i++) sendidle(); bitstate = 0; } static bool hide_after_sending = false; int thor::tx_process() { modem::tx_process(); int i = 0; switch (txstate) { case TX_STATE_PREAMBLE: Clearbits(); for (int j = 0; j < 16; j++) sendsymbol(0); sendidle(); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r', 0); if (mode != MODE_THORMICRO) { sendchar(2, 0); // STX sendchar('\r', 0); } txstate = TX_STATE_DATA; break; case TX_STATE_DATA: if (imageheader.length()) { txstate = TX_STATE_IMAGE; break; } if (avatarheader.length()) { txstate = TX_STATE_AVATAR; break; } i = get_tx_char(); if (i == GET_TX_CHAR_NODATA) sendsecondary(); else if (i == GET_TX_CHAR_ETX) txstate = TX_STATE_END; else sendchar(i, 0); if (stopflag) { txstate = TX_STATE_END; stopflag = false; } break; case TX_STATE_END: sendchar('\r', 0); if (mode != MODE_THORMICRO) { sendchar(4, 0); // EOT sendchar('\r', 0); } txstate = TX_STATE_FLUSH; break; case TX_STATE_FLUSH: flushtx(); txstate = TX_STATE_RECEIVE; return -1; case TX_STATE_IMAGE: for (size_t n = 0; n < imageheader.length(); n++) sendchar(imageheader[n], 0); flushtx(); send_image(); if (hide_after_sending) thorpicTxWin->hide(); hide_after_sending = false; txstate = TX_STATE_DATA; break; case TX_STATE_AVATAR: for (size_t n = 0; n < avatarheader.length(); n++) sendchar(avatarheader[n], 0); flushtx(); send_avatar(); txstate = TX_STATE_DATA; break; } return 0; } // image support #define PHASE_CORR 20 static bool send_gray = false; void thor::send_image() { int W = 640, H = 480; // grey scale transfer (FAX) float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; imageheader.clear(); if (!thorpicTxWin || !thorpicTxWin->visible()) { return; } switch (selthorpicSize->value()) { case 0 : W = 59; H = 74; break; case 1 : W = 120; H = 150; break; case 2 : W = 240; H = 300; break; case 3 : W = 160; H = 120; break; case 4 : W = 320; H = 240; break; case 5 : W = 640; H = 480; break; } REQ(thor_clear_tximage); stop_deadman(); double black[symlen]; memset(black, 0, sizeof(*black) * symlen); for (int i = 0; i < PHASE_CORR; i++) ModulateXmtr(black, symlen); freq = frequency - 0.6 * bandwidth; phaseincr = radians * freq; for (int i = 0; i < PHASE_CORR; i++) { for (int n = 0; n < symlen; n++) { black[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(black, symlen); } if (send_gray) { // grey scale image for (int row = 0; row < H; row++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = 0.3 * thorpic_TxGetPixel(tx_pixelnbr, 0) + // red 0.6 * thorpic_TxGetPixel(tx_pixelnbr, 1) + // green 0.1 * thorpic_TxGetPixel(tx_pixelnbr, 2); // blue REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + 0); REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + 1); REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + 2); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, IMAGEspp); Fl::awake(); } } } else { for (int row = 0; row < H; row++) { for (int color = 0; color < 3; color++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = thorpic_TxGetPixel(tx_pixelnbr, color); REQ(thor_updateTxPic, tx_pixel, tx_pixelnbr*3 + color); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, IMAGEspp); } Fl::awake(); } } } start_deadman(); } void thor::thor_send_image(std::string image_str, bool gray) { if (!image_str.empty()) { send_gray = gray; hide_after_sending = true; imageheader = image_str; } if (txstate == TX_STATE_RECEIVE) start_tx(); } void thor::send_avatar() { int W = 59, H = 74; float freq, phaseincr; float radians = 2.0 * M_PI / samplerate; avatarheader.clear(); double black[symlen]; memset(black, 0, sizeof(*black) * symlen); freq = frequency - 0.6 * bandwidth; phaseincr = radians * freq; for (int i = 0; i < PHASE_CORR; i++) ModulateXmtr(black, symlen); for (int i = 0; i < PHASE_CORR; i++) { for (int n = 0; n < symlen; n++) { black[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(black, symlen); } for (int row = 0; row < H; row++) { for (int color = 0; color < 3; color++) { memset(outbuf, 0, IMAGEspp * sizeof(*outbuf)); for (int col = 0; col < W; col++) { if (stopflag) return; tx_pixelnbr = col + row * W; tx_pixel = thor_get_avatar_pixel(tx_pixelnbr, color); freq = frequency + (tx_pixel - 128) * bandwidth / 256.0; phaseincr = radians * freq; for (int n = 0; n < IMAGEspp; n++) { outbuf[n] = cos(txphase); txphase -= phaseincr; if (txphase < 0) txphase += TWOPI; } ModulateXmtr(outbuf, IMAGEspp); } Fl::awake(); } } } void thor::thor_send_avatar() { if (txstate == TX_STATE_RECEIVE) { start_tx(); } } void thor::m_thor_send_avatar() { // std::string mycall = progdefaults.myCall; // for (size_t n = 0; n < mycall.length(); n++) // mycall[n] = tolower(mycall[n]); std::string fname = AvatarDir; // fname.append(mycall).append(".png"); fname.append(progdefaults.thor_avatar_image_file); my_avatar_img = Fl_Shared_Image::get(fname.c_str(), 59, 74); if (!my_avatar_img) return; unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; memset(avatar, 0, sizeof(avatar)); int D = my_avatar_img->d(); if (D == 3) memcpy(avatar, img_data, 59*74*3); else if (D == 4) { int i, j, k; for (i = 0; i < 59*74; i++) { j = i*3; k = i*4; avatar[j] = img_data[k]; avatar[j+1] = img_data[k+1]; avatar[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < 59*74; i++) { j = i * 3; avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; } } else { return; } avatarheader = "\npic%A"; thor_send_avatar(); } fldigi-4.2.05/src/thor/thor-pic.cxx0000664000175000017500000007075414611711171014014 00000000000000// ---------------------------------------------------------------------------- // thorpic.cxx -- thor image support functions // // Copyright (C) 2015 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gthor source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "gettext.h" #include "fileselect.h" #include "qrunner.h" #include "timeops.h" void thor_createTxViewer(); void thor_showRxViewer(char); Fl_Double_Window *thorpicRxWin = (Fl_Double_Window *)0; picture *thorpicRx = (picture *)0; Fl_Button *btnthorRxReset = (Fl_Button *)0; Fl_Button *btnthorRxSave = (Fl_Button *)0; Fl_Button *btnthorRxClose = (Fl_Button *)0; Fl_Counter *thorcnt_phase = (Fl_Counter *)0; Fl_Counter *thorcnt_slant = (Fl_Counter *)0; Fl_Double_Window *thorpicTxWin = (Fl_Double_Window *)0; picture *thorpicTx = (picture *)0; Fl_Button *btnthorpicTransmit = (Fl_Button *)0; Fl_Button *btnthorpicTxSendAbort = (Fl_Button *)0; Fl_Button *btnthorpicTxLoad = (Fl_Button *)0; Fl_Button *btnthorpicTxClose = (Fl_Button *)0; Fl_Choice *selthorpicSize = (Fl_Choice *)0; Fl_Check_Button *btnthorTxGrey = (Fl_Check_Button *)0; void thor_showRxViewer(char c); void thor_createRxViewer(); Fl_Shared_Image *thorTxImg = (Fl_Shared_Image *)0; unsigned char *thorxmtimg = (unsigned char *)0; unsigned char *thorxmtpicbuff = (unsigned char *)0; #define RAWSIZE 640*(480 + 8)*3*thor::IMAGEspp #define RAWSTART 640*4*3*thor::IMAGEspp unsigned char *thor_rawvideo = 0;//[RAWSIZE + 1]; int thor_numpixels; int thor_pixelptr; int thor_rawcol; int thor_rawrow; int thor_rawrgb; char thor_image_type = 'S'; char thor_txclr_tooltip[24]; char thor_txgry_tooltip[24]; static int translate = 0; static bool enabled = false; std::string thor::imageheader; std::string thor::avatarheader; int thor::IMAGEspp = THOR_IMAGESPP; static std::string thor_fname; void thor_correct_video() { int W = thorpicRx->w(); int H = thorpicRx->h(); int slant = thorcnt_slant->value(); int vidsize = W * H; int index, rowptr, colptr; float ratio = (((float)vidsize - (float)slant)/(float)vidsize); unsigned char vid[W * H * 3]; for (int row = 0; row < H; row++) { rowptr = W * 3 * row * thor::IMAGEspp; for (int col = 0; col < W; col++) { colptr = thor::IMAGEspp*col; for (int rgb = 0; rgb < 3; rgb++) { index = ratio*(rowptr + colptr + thor::IMAGEspp*W*rgb); index += RAWSTART - thor::IMAGEspp*thor_pixelptr; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[rgb + 3 * (col + row * W)] = thor_rawvideo[index]; } } } thorpicRx->video(vid, W*H*3); } void thor_updateRxPic(unsigned char data, int pos) { if (!thorpicRxWin->shown()) thorpicRx->show(); thorpicRx->pixel(data, pos); int W = thorpicRx->w(); if (thor_image_type == 'F' || thor_image_type == 'p' || thor_image_type == 'm' || thor_image_type == 'l' || thor_image_type == 's' || thor_image_type == 'v') { int n = RAWSTART + thor::IMAGEspp*(thor_rawcol + W * (thor_rawrgb + 3 * thor_rawrow)); if (n < RAWSIZE) for (int i = 0; i < thor::IMAGEspp; i++) thor_rawvideo[n + i] = data; thor_rawrgb++; if (thor_rawrgb == 3) { thor_rawrgb = 0; thor_rawcol++; if (thor_rawcol == W) { thor_rawcol = 0; thor_rawrow++; } } } else for (int i = 0; i < thor::IMAGEspp; i++) thor_rawvideo[RAWSTART + thor::IMAGEspp*thor_numpixels + i] = data; thor_numpixels++; if (thor_numpixels >= (RAWSIZE - RAWSTART - thor::IMAGEspp)) thor_numpixels = RAWSIZE - RAWSTART - thor::IMAGEspp; } void cb_btnthorRxReset(Fl_Widget *, void *) { // progStatus.thor_rx_abort = true; } void thor_save_raw_video() { time_t time_sec = time(0); struct tm ztime; (void)gmtime_r(&time_sec, &ztime); char sztime[20]; strftime(sztime, sizeof(sztime), "%Y%m%d%H%M%Sz", &ztime); thor_fname.assign(PicsDir).append("THOR").append(sztime); FILE *raw = fl_fopen(std::string(thor_fname).append(".raw").c_str(), "wb"); fwrite(&thor_image_type, 1, 1, raw); fwrite(thor_rawvideo, 1, RAWSIZE, raw); fclose(raw); } void thor_load_raw_video() { // abort & close any Rx video processing int image_type = 0; std::string image_types = "TtSsLlFVvPpMm"; if (!thorpicRxWin) thor_createRxViewer(); else thorpicRxWin->hide(); const char *p = FSEL::select( _("Load raw image file"), "Image\t*.raw\n", PicsDir.c_str()); if (!p || !*p) return; thor_fname.assign(p); size_t p_raw = thor_fname.find(".raw"); if (p_raw != std::string::npos) thor_fname.erase(p_raw); FILE *raw = fl_fopen(p, "rb"); int numread = fread(&image_type, 1, 1, raw); if (numread != 1) { fclose(raw); return; } if (image_types.find(thor_image_type) != std::string::npos) { thor_showRxViewer(image_type); numread = fread(thor_rawvideo, 1, RAWSIZE, raw); if (numread == RAWSIZE) { thorcnt_phase->activate(); thorcnt_slant->activate(); btnthorRxSave->activate(); thor_correct_video(); thorpicRxWin->redraw(); } } fclose(raw); } void cb_btnthorRxSave(Fl_Widget *, void *) { thorpicRx->save_png(std::string(thor_fname).append(".png").c_str()); } void cb_btnthorRxClose(Fl_Widget *, void *) { thorpicRxWin->hide(); } void cb_thor_cnt_phase(Fl_Widget *, void *data) { thor_pixelptr = thorcnt_phase->value(); if (thor_pixelptr >= RAWSTART/thor::IMAGEspp) { thor_pixelptr = RAWSTART/thor::IMAGEspp - 1; thorcnt_phase->value(thor_pixelptr); } if (thor_pixelptr < -RAWSTART/thor::IMAGEspp) { thor_pixelptr = -RAWSTART/thor::IMAGEspp; thorcnt_phase->value(thor_pixelptr); } thor_correct_video(); } void cb_thor_cnt_slant(Fl_Widget *, void *) { thor_correct_video(); } void thor_disableshift() { if (!thorpicRxWin) return; thorcnt_phase->deactivate(); thorcnt_slant->deactivate(); btnthorRxSave->deactivate(); thorpicRxWin->redraw(); } void thor_enableshift() { if (!thorpicRxWin) return; thorcnt_phase->activate(); thorcnt_slant->activate(); btnthorRxSave->activate(); thor_save_raw_video(); thorpicRxWin->redraw(); } void thor_createRxViewer() { thorpicRxWin = new Fl_Double_Window(324, 274, _("thor Rx Image")); thorpicRxWin->xclass(PACKAGE_NAME); thorpicRxWin->begin(); thorpicRx = new picture(2, 2, 320, 240); thorpicRx->noslant(); Fl_Group *buttons = new Fl_Group(0, thorpicRxWin->h() - 26, thorpicRxWin->w(), 26, ""); buttons->box(FL_FLAT_BOX); btnthorRxReset = new Fl_Button(2, thorpicRxWin->h() - 26, 40, 24, "Reset"); btnthorRxReset->callback(cb_btnthorRxReset, 0); thorcnt_phase = new Fl_Counter(46, thorpicRxWin->h() - 24, 80, 20, ""); thorcnt_phase->step(1); thorcnt_phase->lstep(10); thorcnt_phase->minimum(-RAWSTART + 1); thorcnt_phase->maximum(RAWSTART - 1); thorcnt_phase->value(0); thorcnt_phase->callback(cb_thor_cnt_phase, 0); thorcnt_phase->tooltip(_("Phase correction")); thorcnt_slant = new Fl_Counter(140, thorpicRxWin->h() - 24, 80, 20, ""); thorcnt_slant->step(1); thorcnt_slant->lstep(10); thorcnt_slant->minimum(-200); thorcnt_slant->maximum(200); thorcnt_slant->value(0); thorcnt_slant->callback(cb_thor_cnt_slant, 0); thorcnt_slant->tooltip(_("Slant correction")); btnthorRxSave = new Fl_Button(226, thorpicRxWin->h() - 26, 45, 24, _("Save")); btnthorRxSave->callback(cb_btnthorRxSave, 0); btnthorRxClose = new Fl_Button(273, thorpicRxWin->h() - 26, 45, 24, _("Close")); btnthorRxClose->callback(cb_btnthorRxClose, 0); buttons->end(); thorpicRxWin->end(); thorpicRxWin->resizable(thorpicRx); thor_numpixels = 0; } void thor_showRxViewer(char itype) { int W = 320; int H = 240; switch (itype) { case 'L' : case 'l' : W = 320; H = 240; break; case 'S' : case 's' : W = 160; H = 120; break; case 'V' : case 'F' : W = 640; H = 480; break; case 'P' : case 'p' : W = 240; H = 300; break; case 'M' : case 'm' : W = 120; H = 150; break; case 'T' : W = 59; H = 74; break; } if (!thorpicRxWin) thor_createRxViewer(); int winW, winH; int thorpicX, thorpicY; winW = W < 320 ? 324 : W + 4; winH = H < 240 ? 274 : H + 34; thorpicX = (winW - W) / 2; thorpicY = (winH - 30 - H) / 2; thorpicRxWin->size(winW, winH); thorpicRx->resize(thorpicX, thorpicY, W, H); thorpicRxWin->init_sizes(); thorpicRx->clear(); thorpicRxWin->show(); thor_disableshift(); if (thor_rawvideo == 0) thor_rawvideo = new unsigned char [RAWSIZE + 1]; memset(thor_rawvideo, 0, RAWSIZE); thor_numpixels = 0; thor_pixelptr = 0; thor_rawrow = thor_rawrgb = thor_rawcol = 0; thor_image_type = itype; } void thor_clear_rximage() { thorpicRx->clear(); thor_disableshift(); translate = 0; enabled = false; thor_numpixels = 0; thor_pixelptr = 0; thorcnt_phase->value(0); thorcnt_slant->value(0); thor_rawrow = thor_rawrgb = thor_rawcol = 0; } //------------------------------------------------------------------------------ // image transmit functions //------------------------------------------------------------------------------ void thor_load_scaled_image(std::string fname, bool gray) { if (!thorpicTxWin) thor_createTxViewer(); int D = 0; unsigned char *img_data; int W = 160; int H = 120; int winW = 644; int winH = 512; int thorpicX = 0; int thorpicY = 0; std::string picmode = "pic% \n"; if (thorTxImg) { thorTxImg->release(); thorTxImg = 0; } thorTxImg = Fl_Shared_Image::get(fname.c_str()); if (!thorTxImg) return; int iW = thorTxImg->w(); int iH = thorTxImg->h(); int aspect = 0; if (iW > iH ) { if (iW >= 640) { W = 640; H = 480; winW = 644; winH = 484; aspect = 5; picmode[4] = 'V'; if (gray) { picmode[4] = 'F'; } } else if (iW >= 320) { W = 320; H = 240; winW = 324; winH = 244; aspect = 4; picmode[4] = 'L'; if (gray) { picmode[4] = 'l'; } } else { W = 160; H = 120; winW = 164; winH = 124; aspect = 3; picmode[4] = 'S'; if (gray) { picmode[4] = 's'; } } } else { if (iH >= 300) { W = 240; H = 300; winW = 244; winH = 304; aspect = 2; picmode[4] = 'P'; if (gray) { picmode[4] = 'p'; } } else if (iH >= 150) { W = 120; H = 150; winW = 124; winH = 154; aspect = 1; picmode[4] = 'M'; if (gray) { picmode[4] = 'm'; } } else { W = 59; H = 74; winW = 67; winH = 82; aspect = 0; picmode[4] = 'T'; if (gray) { aspect = 0; picmode[4] = 't'; } } } { Fl_Image *temp; selthorpicSize->value(aspect); temp = thorTxImg->copy(W, H); thorTxImg->release(); thorTxImg = (Fl_Shared_Image *)temp; } if (thorTxImg->count() > 1) { thorTxImg->release(); thorTxImg = 0; return; } thorpicTx->hide(); thorpicTx->clear(); img_data = (unsigned char *)thorTxImg->data()[0]; D = thorTxImg->d(); if (thorxmtimg) delete [] thorxmtimg; thorxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(thorxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; thorxmtimg[j] = img_data[k]; thorxmtimg[j+1] = img_data[k+1]; thorxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; thorxmtimg[j] = thorxmtimg[j+1] = thorxmtimg[j+2] = img_data[i]; } } else return; char* label = strdup(fname.c_str()); thorpicTxWin->copy_label(basename(label)); free(label); // load the thorpicture widget with the rgb image thorpicTxWin->size(winW, winH); thorpicX = (winW - W) / 2; thorpicY = (winH - H) / 2; thorpicTx->resize(thorpicX, thorpicY, W, H); selthorpicSize->hide(); btnthorpicTransmit->hide(); btnthorpicTxLoad->hide(); btnthorpicTxClose->hide(); btnthorpicTxSendAbort->hide(); thorpicTx->video(thorxmtimg, W * H * 3); thorpicTx->show(); thorpicTxWin->show(); active_modem->thor_send_image(picmode, gray); return; } int thor_load_image(const char *n) { int D = 0; unsigned char *img_data; int W = 640; int H = 480; switch (selthorpicSize->value()) { case 0 : W = 59; H = 74; break; case 1 : W = 120; H = 150; break; case 2 : W = 240; H = 300; break; case 3 : W = 160; H = 120; break; case 4 : W = 320; H = 240; break; case 5 : W = 640; H = 480; break; } if (thorTxImg) { thorTxImg->release(); thorTxImg = 0; } thorTxImg = Fl_Shared_Image::get(n, W, H); if (!thorTxImg) return 0; if (thorTxImg->count() > 1) { thorTxImg->release(); thorTxImg = 0; return 0; } thorpicTx->hide(); thorpicTx->clear(); img_data = (unsigned char *)thorTxImg->data()[0]; D = thorTxImg->d(); if (thorxmtimg) delete [] thorxmtimg; thorxmtimg = new unsigned char [W * H * 3]; if (D == 3) memcpy(thorxmtimg, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; thorxmtimg[j] = img_data[k]; thorxmtimg[j+1] = img_data[k+1]; thorxmtimg[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; thorxmtimg[j] = thorxmtimg[j+1] = thorxmtimg[j+2] = img_data[i]; } } else return 0; char* label = strdup(n); thorpicTxWin->copy_label(basename(label)); free(label); // load the thorpicture widget with the rgb image thorpicTx->show(); thorpicTxWin->redraw(); thorpicTx->video(thorxmtimg, W * H * 3); btnthorpicTransmit->activate(); return 1; } void thor_updateTxPic(unsigned char data, int pos) { if (!thorpicTxWin->shown()) thorpicTx->show(); thorpicTx->pixel(data, pos); } void cb_thorpicTxLoad(Fl_Widget *, void *) { const char *fn = FSEL::select(_("Load image file"), "Image\t*.{png,,gif,jpg,jpeg}\n", PicsDir.c_str()); if (!fn) return; if (!*fn) return; thor_load_image(fn); } void thor_clear_tximage() { thorpicTx->clear(); } void cb_thorpicTxClose( Fl_Widget *w, void *) { thorpicTxWin->hide(); } int thorpic_TxGetPixel(int pos, int color) { return thorxmtimg[3*pos + color]; // color = {RED, GREEN, BLUE} } void cb_thorpicTransmit( Fl_Widget *w, void *) { std::string header = "pic% "; bool grey = btnthorTxGrey->value(); char ch = ' '; switch (selthorpicSize->value()) { case 0 : thor_showTxViewer(ch = (grey ? 't' : 'T')); break; // 59 x 74 case 1 : thor_showTxViewer(ch = (grey ? 'm' : 'M')); break; // 120 x 150 case 2 : thor_showTxViewer(ch = (grey ? 'p' : 'P')); break; // 240 x 300 case 3 : thor_showTxViewer(ch = (grey ? 's' : 'S')); break; // 160 x 120 case 4 : thor_showTxViewer(ch = (grey ? 'l' : 'L')); break; // 320 x 240 case 5 : thor_showTxViewer(ch = (grey ? 'F' : 'V')); break; // 640 x 480 } header[4] = ch; active_modem->thor_send_image(header, grey); } void cb_thorpicTxSendAbort( Fl_Widget *w, void *) { } void cb_selthorpicSize( Fl_Widget *w, void *) { switch (selthorpicSize->value()) { case 0 : thor_showTxViewer('T'); break; // 59 x 74 case 1 : thor_showTxViewer('M'); break; // 120 x 150 case 2 : thor_showTxViewer('P'); break; // 240 x 300 case 3 : thor_showTxViewer('S'); break; // 160 x 120 case 4 : thor_showTxViewer('L'); break; // 320 x 240 case 5 : thor_showTxViewer('V'); break; // 640 x 480 } } void thor_createTxViewer() { thorpicTxWin = new Fl_Double_Window(324, 270, _("thor Send image")); thorpicTxWin->xclass(PACKAGE_NAME); thorpicTxWin->begin(); thorpicTx = new picture (2, 2, 320, 240); thorpicTx->noslant(); thorpicTx->hide(); selthorpicSize = new Fl_Choice(5, 244, 90, 24); selthorpicSize->add("59 x 74"); selthorpicSize->add("120x150"); selthorpicSize->add("240x300"); selthorpicSize->add("160x120"); selthorpicSize->add("320x240"); selthorpicSize->add("640x480"); selthorpicSize->value(1); selthorpicSize->callback(cb_selthorpicSize, 0); btnthorTxGrey = new Fl_Check_Button(99, 247, 18, 18); btnthorTxGrey->value(0); btnthorTxGrey->tooltip(_("Check for grey image")); btnthorpicTxLoad = new Fl_Button(133, 244, 60, 24, _("Load")); btnthorpicTxLoad->callback(cb_thorpicTxLoad, 0); btnthorpicTransmit = new Fl_Button(thorpicTxWin->w() - 130, 244, 60, 24, "Xmt"); btnthorpicTransmit->callback(cb_thorpicTransmit, 0); btnthorpicTxSendAbort = new Fl_Button(thorpicTxWin->w() - 130, 244, 60, 24, "Abort Xmt"); btnthorpicTxSendAbort->callback(cb_thorpicTxSendAbort, 0); btnthorpicTxClose = new Fl_Button(thorpicTxWin->w() - 65, 244, 60, 24, _("Close")); btnthorpicTxClose->callback(cb_thorpicTxClose, 0); btnthorpicTxSendAbort->hide(); btnthorpicTransmit->deactivate(); thorpicTxWin->end(); } void thor_showTxViewer(char c) { if (!thorpicTxWin) thor_createTxViewer(); int winW = 644, winH = 512, W = 480, H = 320; int thorpicX, thorpicY; thorpicTx->clear(); switch (c) { case 'T' : case 't' : W = 59; H = 74; winW = 324; winH = 184; selthorpicSize->value(0); break; case 'S' : case 's' : W = 160; H = 120; winW = 324; winH = 154; selthorpicSize->value(3); break; case 'L' : case 'l' : W = 320; H = 240; winW = 324; winH = 274; selthorpicSize->value(4); break; case 'F' : case 'V' : W = 640; H = 480; winW = 644; winH = 514; selthorpicSize->value(5); break; case 'P' : case 'p' : W = 240; H = 300; winW = 324; winH = 334; selthorpicSize->value(2); break; case 'M' : case 'm' : W = 120; H = 150; winW = 324; winH = 184; selthorpicSize->value(1); break; } thorpicTxWin->size(winW, winH); thorpicX = (winW - W) / 2; thorpicY = (winH - 26 - H) / 2; thorpicTx->resize(thorpicX, thorpicY, W, H); selthorpicSize->resize(5, winH - 26, 90, 24); btnthorTxGrey->resize(selthorpicSize->x() + selthorpicSize->w() + 4, winH - 23, 18, 18); btnthorpicTxLoad->resize(btnthorTxGrey->x() + btnthorTxGrey->w() + 4, winH - 26, 60, 24); btnthorpicTransmit->resize(winW - 130, winH - 26, 60, 24); btnthorpicTxSendAbort->resize(winW - 130, winH - 26, 60, 24); btnthorpicTxClose->resize(winW -65, winH - 26, 60, 24); selthorpicSize->show(); btnthorpicTransmit->show(); btnthorpicTxLoad->show(); btnthorpicTxClose->show(); btnthorpicTxSendAbort->hide(); thorpicTxWin->show(); } void thor_deleteTxViewer() { if (thorpicTxWin) thorpicTxWin->hide(); if (thorpicTx) { delete thorpicTx; thorpicTx = 0; } delete [] thorxmtimg; thorxmtimg = 0; delete [] thorxmtpicbuff; thorxmtpicbuff = 0; if (thorpicTxWin) delete thorpicTxWin; thorpicTxWin = 0; } void thor_deleteRxViewer() { if (thorpicRxWin) thorpicRxWin->hide(); if (thorpicRx) { delete thorpicRx; thorpicRx = 0; } if (thorpicRxWin) { delete thorpicRxWin; thorpicRxWin = 0; } } int thor_print_time_left(float time_sec, char *str, size_t len, const char *prefix, const char *suffix) { int time_min = (int)(time_sec / 60); time_sec -= time_min * 60; if (time_min) return snprintf(str, len, "%s %02dm %2.1fs%s", prefix, time_min, time_sec, suffix); else return snprintf(str, len, "%s %2.1fs%s", prefix, time_sec, suffix); } // ----------------------------------------------------------------------------- // avatar send/recv // ----------------------------------------------------------------------------- static Fl_Shared_Image *shared_avatar_img = (Fl_Shared_Image *)0; static unsigned char *avatar_img = (unsigned char *)0; static Fl_Shared_Image *my_avatar_img = (Fl_Shared_Image *)0; static int avatar_phase_correction = 0; static unsigned char avatar[59 * 74 * 3]; void thor_clear_avatar() { thor_avatar->clear(); avatar_phase_correction = 0; thor_numpixels = 0; thor_rawrow = thor_rawrgb = thor_rawcol = 0; thor_avatar->video(tux_img, 59 * 74 * 3); } // W always 59, H always 74 int thor_load_avatar(std::string image_fname, int W, int H) { W = 59; H = 74; if (image_fname.empty()) { thor_clear_avatar(); return 1; } int D = 0; unsigned char *img_data; if (shared_avatar_img) { shared_avatar_img->release(); shared_avatar_img = 0; } for (size_t n = 0; n < image_fname.length(); n++) image_fname[n] = tolower(image_fname[n]); std::string fname = AvatarDir; fname.append(image_fname).append(".png"); FILE *temp = fl_fopen(fname.c_str(), "rb"); if (temp) { fseek(temp, 0L, SEEK_SET); fclose(temp); } else { thor_avatar->video(tux_img, W * H * 3); return 1; } shared_avatar_img = Fl_Shared_Image::get(fname.c_str(), W, H); if (!shared_avatar_img) { thor_avatar->video(tux_img, W * H * 3); return 1; } // force image to be retrieved from hard drive vice shared image memory shared_avatar_img->reload(); if (shared_avatar_img->count() > 1) { shared_avatar_img->release(); shared_avatar_img = 0; thor_avatar->video(tux_img, W * H * 3); return 0; } img_data = (unsigned char *)shared_avatar_img->data()[0]; D = shared_avatar_img->d(); if (avatar_img) delete [] avatar_img; avatar_img = new unsigned char [W * H * 3]; if (D == 3) memcpy(avatar_img, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; avatar_img[j] = img_data[k]; avatar_img[j+1] = img_data[k+1]; avatar_img[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; avatar_img[j] = avatar_img[j+1] = avatar_img[j+2] = img_data[i]; } } else { thor_avatar->video(tux_img, W * H * 3); return 0; } thor_avatar->video(avatar_img, W * H * 3); shared_avatar_img->release(); shared_avatar_img = 0; return 1; } void thor_correct_avatar() { int W = 59; int H = 74; int index, rowptr, colptr; unsigned char vid[W * H * 3]; if (avatar_phase_correction >= RAWSTART/thor::IMAGEspp) { avatar_phase_correction = RAWSTART/thor::IMAGEspp - 1; } if (avatar_phase_correction < -RAWSTART/thor::IMAGEspp) { avatar_phase_correction = -RAWSTART/thor::IMAGEspp; } for (int row = 0; row < H; row++) { rowptr = W * 3 * row * thor::IMAGEspp; for (int col = 0; col < W; col++) { colptr = thor::IMAGEspp*col; for (int rgb = 0; rgb < 3; rgb++) { index = rowptr + colptr + W*rgb*thor::IMAGEspp; index += RAWSTART - thor::IMAGEspp * avatar_phase_correction; if (index < 2) index = 2; if (index > RAWSIZE - 2) index = RAWSIZE - 2; vid[rgb + 3 * (col + row * W)] = thor_rawvideo[index]; } } } thor_avatar->video(vid, W*H*3); } void thor_update_avatar(unsigned char data, int pos) { if (thor_rawvideo == 0) { thor_rawvideo = new unsigned char [RAWSIZE + 1]; memset(thor_rawvideo, 0, RAWSIZE); } thor_avatar->pixel(data, pos); for (int i = 0; i < thor::IMAGEspp; i++) thor_rawvideo[RAWSTART + thor::IMAGEspp*thor_numpixels + i] = data; thor_numpixels++; if (thor_numpixels >= (RAWSIZE - RAWSTART - thor::IMAGEspp)) thor_numpixels = RAWSIZE - RAWSTART - thor::IMAGEspp; } int thor_get_avatar_pixel(int pos, int color) { // color = {RED, GREEN, BLUE} return (int)avatar[3*pos + color]; } // ADD CALLBACK HANDLING OF PHASE CORRECTIONS void cb_thor_send_avatar( Fl_Widget *w, void *) { if (Fl::event_button() == FL_RIGHT_MOUSE) { if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { if (thor_numpixels == 0) return; avatar_phase_correction += 5; thor_correct_avatar(); return; } if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { if (thor_numpixels == 0) return; avatar_phase_correction++; thor_correct_avatar(); return; } std::string image_fname = progdefaults.thor_avatar_image_file; if (image_fname.empty()) { image_fname = progdefaults.operCall; if (image_fname.empty()) { image_fname = progdefaults.myCall; if (image_fname.empty()) { return; } } } if (image_fname.find(".gif") == std::string::npos && image_fname.find(".png") == std::string::npos && image_fname.find(".PNG") == std::string::npos && image_fname.find(".jp") == std::string::npos && // jpg, jpeg image_fname.find(".JP") == std::string::npos ) { // JPG, JPEG for (size_t n = 0; n < image_fname.length(); n++) image_fname[n] = tolower(image_fname[n]); std::string fname = AvatarDir; fname.append(image_fname).append(".png"); } my_avatar_img = Fl_Shared_Image::get(image_fname.c_str(), 59, 74); if (!my_avatar_img) return; unsigned char *img_data = (unsigned char *)my_avatar_img->data()[0]; memset(avatar, 0, sizeof(avatar)); int D = my_avatar_img->d(); if (D == 3) memcpy(avatar, img_data, 59 * 74 * 3); else if (D == 4) { int i, j, k; for (i = 0; i < 59 * 74; i++) { j = i * 3; k = i * 4; avatar[j] = img_data[k]; avatar[j+1] = img_data[k+1]; avatar[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < 59 * 74; i++) { j = i * 3; avatar[j] = avatar[j+1] = avatar[j+2] = img_data[i]; } } else return; thor::avatarheader = "\npic%A"; active_modem->thor_send_avatar(); return; } if (Fl::event_button() == FL_LEFT_MOUSE) { if (Fl::get_key (FL_Shift_L) || Fl::get_key(FL_Shift_R)) { if (thor_numpixels == 0) return; avatar_phase_correction -= 5; thor_correct_avatar(); return; } if (Fl::get_key (FL_Control_L) || Fl::get_key(FL_Control_R)) { if (thor_numpixels == 0) return; avatar_phase_correction--; thor_correct_avatar(); return; } std::string urcall = inpCall->value(); size_t ptr = urcall.rfind("/"); if (ptr != std::string::npos) urcall.erase(ptr); if (urcall.empty()) return; for (size_t n = 0; n < urcall.length(); n++) urcall[n] = tolower(urcall[n]); std::string fname = AvatarDir; fname.append(urcall).append(".png"); thor_avatar->save_png(fname.c_str()); } } static picture *def_thor_avatar = (picture *)0; void load_default_thor_image(std::string fname, int W, int H) { static Fl_Shared_Image *shared_image = (Fl_Shared_Image *)0; static unsigned char *image_array = (unsigned char *)0; int D = 0; unsigned char *img_data; shared_image = Fl_Shared_Image::get(fname.c_str(), W, H); if (!shared_image) { def_thor_avatar->video(tux_img, W * H * 3); return; } // force image to be retrieved from hard drive vice shared image memory shared_image->reload(); if (shared_image->count() > 1) { shared_image->release(); shared_image = 0; def_thor_avatar->video(tux_img, W * H * 3); return; } img_data = (unsigned char *)shared_image->data()[0]; D = shared_image->d(); if (image_array) delete [] image_array; image_array = new unsigned char [W * H * 3]; if (D == 3) memcpy(image_array, img_data, W*H*3); else if (D == 4) { int i, j, k; for (i = 0; i < W*H; i++) { j = i*3; k = i*4; image_array[j] = img_data[k]; image_array[j+1] = img_data[k+1]; image_array[j+2] = img_data[k+2]; } } else if (D == 1) { int i, j; for (i = 0; i < W*H; i++) { j = i * 3; image_array[j] = image_array[j+1] = image_array[j+2] = img_data[i]; } } else { def_thor_avatar->video(tux_img, W * H * 3); return; } def_thor_avatar->video(image_array, W * H * 3); shared_image->release(); shared_image = 0; return; } void select_thor_avatar(Fl_Widget *w, void *d) { const char *p = FSEL::select( _("Select operator avatar image"), "Avatar\t*.{gif,jpg,jpeg,png}\n", AvatarDir.c_str()); if (!p || !*p) return; std::string avatar_file; avatar_file.assign(p); load_default_thor_image(avatar_file, 59, 74); progdefaults.thor_avatar_image_file = avatar_file; return; } void init_def_thor_avatar(Fl_Group *w) { if (def_thor_avatar == (picture *)0) { def_thor_avatar = new picture(w->x(), w->y(), w->w(), w->h()); def_thor_avatar->noslant(); def_thor_avatar->callback(select_thor_avatar); def_thor_avatar->tooltip(_("Select operator avatar")); w->add(def_thor_avatar); } def_thor_avatar->show(); int W = w->w(); int H = w->h(); std::string image_fname = progdefaults.thor_avatar_image_file; if (image_fname.empty()) { image_fname = progdefaults.operCall; if (image_fname.empty()) { image_fname = progdefaults.myCall; if (image_fname.empty()) { def_thor_avatar->video(tux_img, W * H * 3); return; } } } if (image_fname.find(".gif") == std::string::npos && image_fname.find(".png") == std::string::npos && image_fname.find(".PNG") == std::string::npos && image_fname.find(".jp") == std::string::npos && // jpg, jpeg image_fname.find(".JP") == std::string::npos ) { // JPG, JPEG for (size_t n = 0; n < image_fname.length(); n++) image_fname[n] = tolower(image_fname[n]); std::string fname = AvatarDir; fname.append(image_fname).append(".png"); } FILE *temp = fl_fopen(image_fname.c_str(), "rb"); if (temp) { fseek(temp, 0L, SEEK_SET); fclose(temp); } else { def_thor_avatar->video(tux_img, W * H * 3); return; } load_default_thor_image(image_fname, W, H); } fldigi-4.2.05/src/fmt/0000775000175000017500000000000014611714005011417 500000000000000fldigi-4.2.05/src/fmt/fmt.cxx0000664000175000017500000005776314611711171012674 00000000000000// ---------------------------------------------------------------------------- // fmt.cxx -- fmt modem // // Copyright (C) 2020 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "configuration.h" #include "confdialog.h" #include "fmt.h" #include "fmt_dialog.h" #include "modem.h" #include "misc.h" #include "filters.h" #include "fftfilt.h" #include "digiscope.h" #include "waterfall.h" #include "main.h" #include "fl_digi.h" #include "timeops.h" #include "debug.h" #include "qrunner.h" #include "status.h" // RnA discriminator #define fmt_DFT_LEN 51200 #define fmt_LPF_LEN 512 #define fmt_BPF_LEN 512 static int srs[] = {8000, 11025, 12000, 16000, 22050, 24000, 44100, 48000}; //static int dftlen[] = {1024, 1536, 1536, 2048, 2560, 2560, 5120, 6144}; // ~8 DFTs per second //static int dftlen[] = {2048, 2560, 3072, 4096, 5632, 6144, 11264, 12288}; // ~4 DFTs per second //static int dftlen[] = {4096, 5632, 6144, 8192, 11264, 12288, 22528, 24576}; // ~2 DFTs per second static int dftlen[] = {8192, 11264, 12288, 16384, 22528, 24576, 45056, 49152}; // ~1 DFTs per second //static int dftblocks[] = {16, 22, 24, 32, 44, 48, 88, 96}; // # 512 sample blocks for 1 DFT / second static char msg1[80]; static char msg1a[80]; static char msg2[80]; static char msg2a[80]; static double fmt_ref_frequency = 0; static double fmt_ref_base_freq = 0; static double fmt_ref_amp = 0; static double fmt_unk_frequency = 0; static double fmt_unk_base_freq = 0; static double fmt_unk_amp = 0; static std::string fmt_filename; static std::string fmt_wav_filename; static std::string fmt_wav_pathfname; static char file_datetime_name[200]; pthread_mutex_t scope_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t data_mutex = PTHREAD_MUTEX_INITIALIZER; //====================================================================== // FMT Thread loop //====================================================================== static pthread_t FMT_thread; static int rec_interval[] = { 10, 25, 50, 100, 200, 500, 1000 }; bool record_unk = false; bool record_ref = false; bool write_recs = false; static bool FMT_exit = false; static bool FMT_enabled = false; static bool is_recording = false; static char s_clk_time[40]; static int csvrow = 0; static bool fmt_start = true; static bool record_ok = false; static time_t fmt_time = 0; static time_t last_epoch = 0; static time_t curr_epoch = 0; static struct tm fmt_tm; static struct timeval fmt_tv; static double ufreq = 0, uamp = 0; static double rfreq = 0, ramp = 0; // formatting std::strings used by csv export method static std::string csv_string; static std::string buffered_csv_string; // uncomment next line to enable debugging data file //#define DEBUG_CSV #ifdef DEBUG_CSV static std::string debug_csv_string; #endif static char comma_format[] = "\ \"T %02d:%02d:%02d.%02d\",\ \"%6.2f\",\ \"%13.3lf\",\ \"%13.4f\",\ \"%0.4f\",\ \"%6.4f\",\ \"%s\",\ \"%6.2f\",,\ \"%13.4f\",\ \"%0.4f\",\ \"%s\",\ \"%6.2f\"\ ,,\"=L%d-F%d-D%d\"\n"; static char tab_format[] = "\ \"T %02d:%02d:%02d.%02d\"\t\ \"%6.2f\"\t\ \"%13.3lf\"\t\ \"%13.4f\"\t\ \"%0.4f\"\t\ \"%6.4f\"\t\ \"%s\"\t\ \"%6.2f\"\t\t\ \"%13.4f\"\t\ \"%0.4f\"\t\ \"%s\"\t\ \"%6.2f\"\ \t\t\"=L%d-F%d-D%d\"\n"; static char usb_ref_equation[] = "=C%d + (D%d + E%d + F%d)"; static char lsb_ref_equation[] = "=C%d - (D%d + E%d + F%d)"; static char usb_unk_equation[] = "=C%d + (D%d + J%d + K%d)"; static char lsb_unk_equation[] = "=C%d - (D%d + J%d + K%d)"; static char ref_equation[50]; static char unk_equation[50]; void set_button ( void *d ) { Fl_Button *b = (Fl_Button *)d; b->value(1); } void clear_button ( void *d ) { Fl_Button *b = (Fl_Button *)d; b->value(0); } std::string txtout; void set_output (void *) { txt_fmt_wav_filename->value(txtout.c_str()); } void start_fmt_wav_record() { time_t wav_time = time(NULL); struct tm File_Start_Date; gmtime_r(&wav_time, &File_Start_Date); static char temp[200]; strftime(temp, sizeof(temp), "fmt_%Y.%m.%d.%H.%M.%S", &File_Start_Date); fmt_wav_pathfname.assign(FMTDir). append(temp). append(".").append((progdefaults.myCall.empty() ? "nil" : progdefaults.myCall)). append(".wav"); if(!RXscard->startCapture(fmt_wav_pathfname, SF_FORMAT_WAV | SF_FORMAT_PCM_16)) { Fl::awake( clear_button, btn_fmt_record_wav); txtout.clear(); Fl::awake (set_output); is_recording = false; return; } is_recording = true; txtout = temp; Fl::awake (set_output); } void cb_fmt_record_wav(bool b) { if (!b) { RXscard->stopCapture(); txtout.clear(); Fl::awake (set_output); is_recording = false; return; } if (!is_recording) start_fmt_wav_record(); } static void show(void *) { btn_fmt_record_wav->value(1); txt_fmt_wav_filename->value(fmt_wav_pathfname.c_str()); } static void noshow(void *) { btn_fmt_record_wav->value(0); txt_fmt_wav_filename->value(""); } static std::ofstream csv_file; static void fmt_create_file() { struct tm File_Start_Date; gmtime_r(&curr_epoch, &File_Start_Date); std::string call = progdefaults.myCall.empty() ? "nil" : progdefaults.myCall; strftime((char*)file_datetime_name, sizeof(file_datetime_name), "%Y.%m.%d.%H.%M.%S", &File_Start_Date); fmt_filename.assign(FMTDir). append("fmt_"). append(file_datetime_name). append(".").append(call). append(".csv"); csv_file.open(fmt_filename.c_str()); if (!csv_file.is_open()) { LOG_ERROR("fl_fopen: %s", fmt_filename.c_str()); return; } // A , B , C , D , E , F , G , H ,I, J , K , L , M ,N, O , P, Q , R // Clock,Elapsed,Xcvr VFO,Freq Corr,Ref WF Freq,Ref Corr,Ref Est Freq,Ref dBVpk, ,Unk WF Freq,Unk Corr,Unk Est Freq,Unk dBVpk, ,Unk Compensated , // , , , , , , , , , , , , , , ,Average:,=average(O:O) // , , , , , , , , , , , , , , ,Std Dev:,=stdev(O:O) csv_string.assign("\ \"Clock\",\"Elapsed\",\"Xcvr VFO\",\"Freq Corr\",\ \"Ref WF Freq\",\"Ref Corr\",\"Ref Est Freq\",\"Ref dBVpk\",,\ \"Unk WF Freq\",\"Unk Corr\",\"Unk Est Freq\",\"Unk dBVpk\",,\ \"Unk Compensated\","); csv_string.append(call).append(",").append(file_datetime_name).append("\n"); csv_string.append("\ ,,,,,,,,,,,,,,,\"Average:\",\"=average(O:O)\"\n"), csv_string.append("\ ,,,,,,,,,,,,,,,\"Std Dev:\",\"=stdev(O:O)\"\n"); if (progdefaults.FMT_use_tabs) { for (size_t n = 0; n < csv_string.length(); n++) if (csv_string[n] == ',') csv_string[n] = '\t'; } csvrow = 4; if (progdefaults.fmt_sync_wav_file && !is_recording) { fmt_wav_pathfname.assign(FMTDir). append(file_datetime_name). append(".").append(call). append(".wav"); if(!RXscard->startCapture(fmt_wav_pathfname, SF_FORMAT_WAV | SF_FORMAT_PCM_16)) { Fl::awake (noshow); is_recording = false; } else { Fl::awake (show); is_recording = true; } } #ifdef DEBUG_CSV debug_csv_string = csv_string; #endif put_status (file_datetime_name); } void fmt_reset_record() { Fl::awake (clear_button, btn_fmt_record); if (progdefaults.fmt_sync_wav_file) { Fl::awake ( clear_button, btn_fmt_record_wav); cb_fmt_record_wav(false); } txtout.clear(); Fl::awake (set_output); } void fmt_show_recording(void *on) { if (on == (void *)1) { box_fmt_recording->color(FL_DARK_RED); } else { box_fmt_recording->color(FL_WHITE); } box_fmt_recording->redraw(); } int fmt_auto_record = false; int start_auto_record = 0; int autorecord_time = 0; void start_auto_tracking(void *) { LOG_INFO("%s", "start auto record in 10 secs"); btn_unk_enable->value(1); btn_unk_enable->redraw(); btn_ref_enable->value(1); btn_ref_enable->redraw(); } void start_auto_recording(void *) { LOG_INFO("%s", "start auto record now"); btn_fmt_record->value(1); btn_fmt_record->redraw(); fmt_create_file(); return; } void stop_auto_recording(void *) { LOG_INFO("%s", "stop auto record"); btn_unk_enable->value(0); btn_unk_enable->redraw(); btn_ref_enable->value(0); btn_ref_enable->redraw(); btn_fmt_record->value(0); btn_fmt_record->redraw(); write_recs = false; } static char sz_temp[512]; #ifdef DEBUG_CSV // debugging void write_debug_string() { std::string debug_filename; debug_filename.assign(FMTDir).append("debug.csv"); rotate_log(debug_filename); FILE *csv_debug = fopen(debug_filename.c_str(), "w"); fprintf(csv_debug, "%s", debug_csv_string.c_str()); fclose(csv_debug); debug_csv_string.clear(); } #endif void fmt_write_file() { fmt_start = true; static int ticks = 0; static int hrs = 0, mins = 0, secs = 0; static bool reset_ticks = false; if (gettimeofday (&fmt_tv, NULL)) { return; } fmt_time = time(NULL); last_epoch = fmt_time + 1; while (fmt_time < last_epoch) { MilliSleep(1); fmt_time = time(NULL); } gmtime_r(&fmt_time, &fmt_tm); last_epoch = fmt_time; hrs = fmt_tm.tm_hour; mins = fmt_tm.tm_min; secs = fmt_tm.tm_sec; ticks = 0; for (;;) { if (FMT_exit || active_modem->get_mode() != MODE_FMT) break; curr_epoch = time(NULL); if (curr_epoch != last_epoch) { last_epoch = curr_epoch; if (++secs >= 60) { secs = 0; if (++mins >= 60) { mins = 0; if (++hrs >= 24) hrs = 0; } } if (fmt_auto_record == 2 && secs == start_auto_record) { Fl::awake(start_auto_recording); fmt_auto_record = 3; autorecord_time = -1; } if ((++autorecord_time >= cnt_fmt_auto_record_time->value()) && fmt_auto_record == 3) { Fl::awake(stop_auto_recording); fmt_auto_record = 0; } if (reset_ticks) { ticks = 0; reset_ticks = false; } else { if (ticks % 100 < 50) ticks = ticks - ticks % 100; else ticks = ticks - ticks % 100 + 100; } snprintf(s_clk_time, sizeof(s_clk_time), "%02d:%02d:%02d", hrs, mins, secs); put_Status1 (s_clk_time); record_ok = true; } if (btn_fmt_autorecord->value()) { if (fmt_auto_record == 1) { Fl::awake(start_auto_tracking); start_auto_record = secs + 10; if (start_auto_record > 60) start_auto_record -= 60; fmt_auto_record = 2; } } else fmt_auto_record = 0; if (!record_unk && !record_ref && !btn_fmt_autorecord->value()) { if (csv_file.is_open()) { buffered_csv_string.assign(csv_string); csv_file << buffered_csv_string; csv_file.flush(); csv_file.close(); #ifdef DEBUG_CSV debug_csv_string.append(csv_string); write_debug_string(); #endif csv_string.clear(); } Fl::awake (fmt_show_recording, (void *)0); fmt_reset_record(); put_Status1 (""); put_status (""); MilliSleep(50); break; } if (write_recs && !csv_file.is_open()) { fmt_create_file(); record_ok = false; reset_ticks = true; Fl::awake (fmt_show_recording, (void *)1); } else if (!write_recs && csv_file.is_open()) { Fl::awake (fmt_show_recording, (void *)0); buffered_csv_string.assign(csv_string); csv_file << buffered_csv_string; csv_file.flush(); csv_file.close(); #ifdef DEBUG_CSV debug_csv_string.append(csv_string); write_debug_string(); #endif csv_string.clear(); put_Status1 (""); put_status (""); fmt_reset_record(); } if (ticks % rec_interval[progStatus.FMT_rec_interval] == 0) { if (record_ok && (record_unk || record_ref) && write_recs && csv_file.is_open()) { { guard_lock datalock (&data_mutex); ufreq = fmt_unk_base_freq; uamp = fmt_unk_amp; rfreq = fmt_ref_base_freq; ramp = fmt_ref_amp; } if (record_unk) { uamp = 20.0 * log10( (uamp == 0 ? 1e-6 : uamp) ); } else { ufreq = 0; uamp = -160; } if (record_ref) { ramp = 20.0 * log10( (ramp == 0 ? 1e-6 : ramp) ); } else { rfreq = 0; ramp = -160; } if (wf->USB()) { snprintf(ref_equation, sizeof(ref_equation), usb_ref_equation, csvrow, csvrow, csvrow, csvrow); snprintf(unk_equation, sizeof(unk_equation), usb_unk_equation, csvrow, csvrow, csvrow, csvrow); } else { snprintf(ref_equation, sizeof(ref_equation), lsb_ref_equation, csvrow, csvrow, csvrow, csvrow); snprintf(unk_equation, sizeof(unk_equation), lsb_unk_equation, csvrow, csvrow, csvrow, csvrow); } snprintf(sz_temp, sizeof(sz_temp), (progdefaults.FMT_use_tabs ? tab_format : comma_format), hrs, mins, secs, ticks % 100, ticks * 0.01, 1.0 * (double) qsoFreqDisp->value(), progdefaults.FMT_freq_corr, (record_ref ? progStatus.FMT_ref_freq : 0), rfreq, (record_ref ? ref_equation : "0"), ramp, (record_unk ? progStatus.FMT_unk_freq : 0), ufreq, (record_unk ? unk_equation : "0"), uamp, csvrow, csvrow, csvrow); csv_string.append(sz_temp); csvrow++; buffered_csv_string.assign(csv_string); csv_file << buffered_csv_string; csv_file.flush(); #ifdef DEBUG_CSV debug_csv_string.append(csv_string); #endif csv_string.clear(); } } ticks++; MilliSleep(10); } } void *FMT_loop(void *args) { SET_THREAD_ID(FMT_TID); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); while(1) { MilliSleep(50); if (FMT_exit) break; record_unk = btn_unk_enable->value(); record_ref = btn_ref_enable->value(); if (record_unk || record_ref || btn_fmt_autorecord->value()) { fmt_write_file(); } } // exit the FMT thread SET_THREAD_CANCEL(); return NULL; } //====================================================================== // //====================================================================== void FMT_thread_init(void) { FMT_exit = false; if (pthread_create(&FMT_thread, NULL, FMT_loop, NULL) < 0) { LOG_ERROR("%s", "pthread_create failed"); return; } LOG_INFO("%s", "FMT thread started"); FMT_enabled = true; } //====================================================================== // //====================================================================== void FMT_thread_close(void) { if (!FMT_enabled) return; FMT_exit = true; pthread_join(FMT_thread, NULL); FMT_enabled = false; FMT_thread = 0; LOG_INFO("%s", "FMT thread closed"); } void fmt::tx_init() { } void fmt::rx_init() { put_MODEstatus(mode); } void fmt::init() { modem::init(); rx_init(); } fmt::~fmt() { delete unk_ffilt; delete unk_afilt; delete ref_ffilt; delete ref_afilt; delete [] unk_pipe; delete [] ref_pipe; // RnA delete [] fftbuff; delete [] unkbuff; delete [] refbuff; delete [] BLACKMAN; delete unk_bpfilter; delete ref_bpfilter; cb_fmt_record_wav(false); } bool clear_unknown_pipe = false; void fmt::clear_unk_pipe() { clear_unknown_pipe = true; } bool clear_reference_pipe = false; void fmt::clear_ref_pipe() { clear_reference_pipe = true; } double fmt::blackman(double omega) { return (0.42 - 0.50 * cos(twoPI * omega) + 0.08 * cos(4 * M_PI * omega)); } void fmt::restart() { if (progdefaults.FMT_sr < 0) progdefaults.FMT_sr = 0; if (progdefaults.FMT_sr > 7) progdefaults.FMT_sr = 7; sr = progdefaults.FMT_sr; samplerate = srs[sr]; Ts = 1.0 / samplerate; set_samplerate(samplerate); unk_ffilt->setLength (movavg_len = 0); unk_afilt->setLength (movavg_len); ref_ffilt->setLength (movavg_len); ref_afilt->setLength (movavg_len); unk_freq = progStatus.FMT_unk_freq; unk_ffilt->reset(); unk_afilt->reset(); unk_count = 0; dspcnt = DSP_CNT; for (int i = 0; i < MAX_DATA_PTS; i++) { unk_pipe[i].x = i + 1; unk_pipe[i].y = 100; } ref_ffilt->reset(); ref_afilt->reset(); ref_freq = progStatus.FMT_ref_freq; ref_count = 0; { guard_lock datalock (&scope_mutex); for (int i = 0; i < MAX_DATA_PTS; i++) { ref_pipe[i].x = i + 1; ref_pipe[i].y = 100; } } double tau = 1.0 / (dftlen[sr] - 1); for (int i = 0; i < dftlen[sr]; i++) { BLACKMAN[i] = blackman( i * tau ); } for (int i = 0; i < fmt_DFT_LEN; i++) { fftbuff[i] = 0; unkbuff[i] = 0; refbuff[i] = 0; } reset_bpf(); // delta conversion coefficients, only change with change in sample rate dmK = tan(M_PI / (2.0 * dftlen[sr])); srK = srs[sr] / M_PI; } fmt::fmt() { mode = MODE_FMT; if (progdefaults.FMT_sr < 1) progdefaults.FMT_sr = 1; if (progdefaults.FMT_sr > 6) progdefaults.FMT_sr = 6; samplerate = srs[progdefaults.FMT_sr]; unk_pipe = new PLOT_XY[MAX_DATA_PTS]; ref_pipe = new PLOT_XY[MAX_DATA_PTS]; movavg_len = progdefaults.FMT_movavg_len; unk_ffilt = new Cmovavg(movavg_len); unk_afilt = new Cmovavg(movavg_len); ref_ffilt = new Cmovavg(movavg_len); ref_afilt = new Cmovavg(movavg_len); cap &= ~CAP_TX; // RnA BLACKMAN = new double[fmt_DFT_LEN]; fftbuff = new double[fmt_DFT_LEN]; unkbuff = new double[fmt_DFT_LEN]; refbuff = new double[fmt_DFT_LEN]; unk_bpfilter = new C_FIR_filter(); ref_bpfilter = new C_FIR_filter(); twoPI = 2.0 * M_PI; restart(); FMT_thread_init(); } void fmt::reset_unknown() { unk_count = 0; } void fmt::reset_reference() { ref_count = 0; } // --------------------------------------------------------------------- // DFT estimator using T&R algorithm // --------------------------------------------------------------------- void fmt::reset_bpf() { int fillen = fmt_BPF_LEN; double fhi = 0; double flo = 0; bpf_width = progdefaults.FMT_bpf_width; fhi = 1.0 * (unk_freq + bpf_width / 2) / samplerate; flo = 1.0 * (unk_freq - bpf_width / 2) / samplerate; unk_bpfilter->init_bandpass (fillen, 1, flo, fhi); fhi = 1.0 * (ref_freq + bpf_width / 2) / samplerate; flo = 1.0 * (ref_freq - bpf_width / 2) / samplerate; ref_bpfilter->init_bandpass (fillen, 1, flo, fhi); set_bandwidth(20); } double fmt::absdft (double *buff, double fm, double incr) { double rval = 0; double ival = 0; double omega = fm * Ts + incr / dftlen[sr]; for( int i = 0; i < dftlen[sr]; i++) { rval += buff[i] * cos(twoPI * i * omega); ival += buff[i] * sin(twoPI * i * omega); } return 2.0 * sqrt(rval * rval + ival * ival) / dftlen[sr]; } double fmt::evaluate_dft(double &freq){ for (int n = 0; n < 2; n++) { am = absdft (fftbuff, freq, -0.5); bm = absdft (fftbuff, freq, 0.5 ); if (am + bm == 0) break; dm = (bm - am) / (bm + am); delta = srK * atan(dm * dmK); if (abs(delta) > progdefaults.FMT_HL_level) { if (progdefaults.FMT_HL_on) { LOG_ERROR("HDL: %f", delta); delta = (delta < 0 ? -1 : 1) * progdefaults.FMT_HL_level; } else if (progdefaults.FMT_dft_cull_on) { LOG_ERROR("CUL: %f", delta); delta = 0; } } freq += delta; } return 2.39883 * absdft(fftbuff, freq, 0); } int fmt::rx_process_dft() { double amp; if (unk_count == 0 || ((fabs(dft_unk_base) > progdefaults.FMT_freq_err) && record_unk) ) { unk_freq = progStatus.FMT_unk_freq; unk_count = 1; LOG_VERBOSE("FMT unknown freq reset to track @ %f Hz", progStatus.FMT_unk_freq); } if (ref_count == 0 || ((fabs(dft_ref_base) > progdefaults.FMT_freq_err) && record_ref) ) { ref_freq = progStatus.FMT_ref_freq; ref_count = 1; LOG_VERBOSE("FMT reference freq reset to track @ %f Hz", progStatus.FMT_ref_freq); } // unknown tracking for (int i = 0; i < dftlen[sr]; i++) fftbuff[i] = BLACKMAN[i] * unkbuff[i]; amp = evaluate_dft(unk_freq); if (progdefaults.FMT_movavg_len > 0) { dft_unk_base = unk_ffilt->run (unk_freq - progStatus.FMT_unk_freq); dft_unk_amp = unk_afilt->run (amp); } else { dft_unk_base = unk_freq - progStatus.FMT_unk_freq; dft_unk_amp = amp; } // reference tracking for (int i = 0; i < dftlen[sr]; i++) fftbuff[i] = BLACKMAN[i] * refbuff[i]; amp = evaluate_dft(ref_freq); if (progdefaults.FMT_movavg_len > 0) { dft_ref_base = ref_ffilt->run (ref_freq - progStatus.FMT_ref_freq); dft_ref_amp = ref_afilt->run (amp); } else { dft_ref_base = ref_freq - progStatus.FMT_ref_freq; dft_ref_amp = amp; } return 0; } static int smpl_counter = 0; static int blk_counter = 0; int fmt::rx_process(const double *buf, int len) { if (sr != progdefaults.FMT_sr) { restart(); ref_count = 0; unk_count = 0; } if (movavg_len != progdefaults.FMT_movavg_len) { movavg_len = progdefaults.FMT_movavg_len; unk_ffilt->setLength (movavg_len * samplerate / len); unk_afilt->setLength (movavg_len * samplerate / len); ref_ffilt->setLength (movavg_len * samplerate / len); ref_afilt->setLength (movavg_len * samplerate / len); } if (clear_unknown_pipe) { guard_lock datalock (&scope_mutex); for (int i = 0; i < MAX_DATA_PTS; i++) { unk_pipe[i].x = i + 1; unk_pipe[i].y = 100; } clear_unknown_pipe = false; REQ (clear_unk_scope); } if (clear_reference_pipe) { guard_lock datalock (&scope_mutex); for (int i = 0; i < MAX_DATA_PTS; i++) { ref_pipe[i].x = i + 1; ref_pipe[i].y = 100; } clear_reference_pipe = false; REQ (clear_ref_scope); } double out, in; for (int i = 0; i < fmt_DFT_LEN - len; i++) { unkbuff[i] = unkbuff[i + len]; refbuff[i] = refbuff[i + len]; } for (int i = 0; i < len; i++) { in = buf[i]; if (progdefaults.FMT_unk_bpf_on) { unk_bpfilter->Irun(in, out); unkbuff[fmt_DFT_LEN - len + i] = out; } else unkbuff[fmt_DFT_LEN - len + i] = in; if (progdefaults.FMT_ref_bpf_on) { ref_bpfilter->Irun(in, out); refbuff[fmt_DFT_LEN - len + i] = out; } else refbuff[fmt_DFT_LEN - len + i] = in; } if ((blk_counter += len) >= dftlen[sr] / (progdefaults.FMT_dft_rate + 1)) { if (bpf_width != progdefaults.FMT_bpf_width || unk_count == 0 || ref_count == 0) reset_bpf(); rx_process_dft (); unk_base_freq = dft_unk_base; unk_amp = dft_unk_amp; ref_base_freq = dft_ref_base; ref_amp = dft_ref_amp; blk_counter = 0; } if (++smpl_counter >= (samplerate / len) / 20.0) { // 0.05 second guard_lock datalock (&data_mutex); fmt_unk_frequency = unk_freq; fmt_unk_base_freq = unk_base_freq; fmt_unk_amp = unk_amp; fmt_ref_frequency = ref_freq; fmt_ref_base_freq = ref_base_freq; fmt_ref_amp = ref_amp; smpl_counter = 0; } dspcnt -= (1.0 * len / samplerate); if (dspcnt <= 0) { { guard_lock datalock(&scope_mutex); for (int i = 1; i < MAX_DATA_PTS; i++) { unk_pipe[i-1].y = unk_pipe[i].y; ref_pipe[i-1].y = ref_pipe[i].y; } if (btn_unk_enable->value()) { unk_pipe[MAX_DATA_PTS -1].y = 1.0 * unk_base_freq + progdefaults.FMT_freq_corr; snprintf(msg1, sizeof(msg1), "%13.3f", wf->rfcarrier() + (unk_freq + progdefaults.FMT_freq_corr) * (wf->USB() ? 1 : -1)); REQ (put_unk_value, msg1); snprintf(msg1a, sizeof(msg1a), "%6.1f", 20.0 * log10( (fmt_unk_amp == 0 ? 1e-6 : fmt_unk_amp) ) ); REQ (put_unk_amp, msg1a); fmt_plot->show_1(true); } else { unk_pipe[MAX_DATA_PTS -1].y = 0.0; REQ (put_unk_value, ""); REQ (put_unk_amp, ""); fmt_plot->show_1(false); } if (btn_ref_enable->value()) { ref_pipe[MAX_DATA_PTS -1].y = 1.0 * ref_base_freq + progdefaults.FMT_freq_corr; snprintf(msg2, sizeof(msg2), "%13.3f", wf->rfcarrier() + (ref_freq + progdefaults.FMT_freq_corr) * (wf->USB() ? 1 : -1)); REQ (put_ref_value, msg2); snprintf(msg2a, sizeof(msg2a), "%6.1f", 20.0 * log10( (fmt_ref_amp == 0 ? 1e-6 : fmt_ref_amp) ) ); REQ (put_ref_amp, msg2a); fmt_plot->show_2(true); } else { ref_pipe[MAX_DATA_PTS -1].y = 0.0; REQ (put_ref_value, ""); REQ (put_ref_amp, ""); fmt_plot->show_2(false); } } REQ (set_fmt_scope); dspcnt = DSP_CNT; } return 0; } //===================================================================== // fmt transmit //===================================================================== int fmt::tx_process() { return -1; } fldigi-4.2.05/src/fmt/fmt_dialog.cxx0000664000175000017500000003637014611711171014202 00000000000000// ---------------------------------------------------------------------------- // fmt_dialog.cxx -- fmt modem // // Copyright (C) 2020 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include "configuration.h" #include "confdialog.h" #include "gettext.h" #include "fmt_dialog.h" #include "fmt.h" #include "fl_digi.h" #include "modem.h" #include "status.h" plot_xy *fmt_plot = (plot_xy *)0; Fl_Group *ref_group = (Fl_Group *)0; Fl_Light_Button *btn_ref_enable = (Fl_Light_Button *)0; Fl_Button *btn_ref_up = (Fl_Button *)0; Fl_Counter *cnt_ref_freq = (Fl_Counter *)0; Fl_Button *btn_ref_dn = (Fl_Button *)0; Fl_Button *btn_ref_reset = (Fl_Button *)0; Fl_Button *btn_ref_clear = (Fl_Button *)0; Fl_Output *fmt_ref_val = (Fl_Output *)0; Fl_Output *fmt_ref_db = (Fl_Output *)0; Fl_Box *ref_color = (Fl_Box *)0; Fl_Group *unk_group = (Fl_Group *)0; Fl_Light_Button *btn_unk_enable = (Fl_Light_Button *)0; Fl_Button *btn_unk_up = (Fl_Button *)0; Fl_Counter *cnt_unk_freq = (Fl_Counter *)0; Fl_Button *btn_unk_dn = (Fl_Button *)0; Fl_Button *btn_unk_reset = (Fl_Button *)0; Fl_Button *btn_unk_clear = (Fl_Button *)0; Fl_Output *fmt_unk_val = (Fl_Output *)0; Fl_Output *fmt_unk_db = (Fl_Output *)0; Fl_Box *unk_color = (Fl_Box *)0; Fl_Light_Button *btn_fmt_record = (Fl_Light_Button *)0; Fl_Box *box_fmt_recording = (Fl_Box *)0; Fl_ListBox *fmt_rec_interval = (Fl_ListBox *)0; Fl_ListBox *fmt_scale = (Fl_ListBox *)0; Fl_ListBox *fmt_cntr_minutes = (Fl_ListBox *)0; static const char *legend_p100 = "-.010|-.008|-.006|-.004|-.002|0|.002|.004|.006|.008|.010"; static const char *legend_p50 = "-0.05|-0.04|-0.03|-0.02|-0.01|0|0.01|0.02|0.03|0.04|0.05"; static const char *legend_p10 = "-.10|-.08|-.06|-.04|-.02|0|.02|.04|.06|.08|.10"; static const char *legend_p25 = "-0.25|-0.2|-0.15|-0.10|-0.05|0|0.05|0.10|0.15|0.20|0.25"; static const char *legend_p5 = "-0.5|-0.4|-0.3|-0.2|-0.1|0|0.1|0.2|0.3|0.4|0.5"; static const char *legend_1p = "-1.0|-0.8|-0.6|-0.4|-0.2|0|0.2|0.4|0.6|0.8|1.0"; static const char *legend_2p = "-2.0|-1.5|-1.0|-0.5|0|0.5|1.0|1.5|2.0"; static const char *legend_4p = "-4.0|-3.5|-3.0|-2.5|-2.0|-1.5|-1.0|-0.5|0|0.5|1.0|1.5|2.0|2.5|3.0|3.5|4.0"; static const char *legend_5p = "5.0|-4.0|-3.0|-2.0|-1.0|0|1.0|2.0|3.0|4.0|5.0"; static const char *legend_10p = "-10.0|-8.0|-6.0|-4.0|-2.0|0|2.0|4.0|6.0|8.0|10.0"; static const char *legend_5 = " |4|3|2|1| |"; static const char *legend_15 = " |14|13|12|11|10|9|8|7|6|5|4|3|2|1| |"; static const char *legend_30 = " |28|26|24|22|20|18|16|14|12|10|8|6|4|2| |"; static const char *legend_60 = " |55|50|45|40|35|30|25|20|15|10|5| |"; static const char *legend_120 = " |110|100|90|80|70|60|50|40|30|20|10| |"; static int seconds[5] = {300, 900, 1800, 3600, 7200}; void cb_unk_up(void *) { double f = cnt_unk_freq->value () + 10; if (f > 3000) f = 3000; cnt_unk_freq->value (f); cnt_unk_freq->callback (); } void cb_unk_dn(void *) { double f = cnt_unk_freq->value () - 10; if (f < 100) f = 100; cnt_unk_freq->value (f); cnt_unk_freq->callback (); } void cb_ref_up(void *) { double f = cnt_ref_freq->value () + 10; if (f > 3000) f = 3000; cnt_ref_freq->value (f); cnt_ref_freq->callback (); } void cb_ref_dn(void *) { double f = cnt_ref_freq->value () - 10; if (f < 100) f = 100; cnt_ref_freq->value (f); cnt_ref_freq->callback (); } void cb_btn_fmt_record(void *) { write_recs = btn_fmt_record->value(); } void cb_btn_unk_enable(void *) { set_unk_freq(NULL); record_unk = btn_unk_enable->value(); } void cb_btn_ref_enable(void *) { set_ref_freq(NULL); record_ref = btn_ref_enable->value(); } void fmt_rec_interval_cb(void *) { progStatus.FMT_rec_interval = fmt_rec_interval->index(); } void fmt_set_x_scale() { int minutes = 0; int markers = 0; const char *legend = NULL; switch (progStatus.FMT_minutes) { case 4: minutes = 120; markers = 12; legend = legend_120; break; case 3: minutes = 60; markers = 12; legend = legend_60; break; case 2: minutes = 30; markers = 15; legend = legend_30; break; case 1: minutes = 15; markers = 15; legend = legend_15; break; case 0: default: minutes = 5; markers = 5; legend = legend_5; } fmt_plot->x_scale (MAX_DATA_PTS - 60 * minutes, MAX_DATA_PTS, markers); fmt_plot->set_x_legend (legend); fmt_plot->thick_lines(progdefaults.FMT_thick_lines); fmt_plot->plot_over_axis(progdefaults.FMT_plot_over_axis); fmt_plot->redraw(); } void fmt_set_y_scale() { switch (progStatus.FMT_trk_scale) { case 0 : fmt_plot->y_scale(-0.01, 0.01, 10); fmt_plot->set_y_legend(legend_p100); break; case 1 : fmt_plot->y_scale(-0.05, .05, 10); fmt_plot->set_y_legend(legend_p50); break; case 2 : fmt_plot->y_scale(-0.10, 0.10, 10); fmt_plot->set_y_legend(legend_p10); break; case 3 : fmt_plot->y_scale(-0.25, .25, 10); fmt_plot->set_y_legend(legend_p25); break; case 4 : fmt_plot->y_scale(-0.5, .5, 10); fmt_plot->set_y_legend(legend_p5); break; case 5 : fmt_plot->y_scale(-1.0, 1.0, 10); fmt_plot->set_y_legend(legend_1p); break; case 6 : fmt_plot->y_scale(-2.0, 2.0, 8); fmt_plot->set_y_legend(legend_2p); break; case 7 : fmt_plot->y_scale(-4.0, 4.0, 16); fmt_plot->set_y_legend(legend_4p); break; case 8 : fmt_plot->y_scale(-5.0, 5.0, 10); fmt_plot->set_y_legend(legend_5p); break; case 9 : fmt_plot->y_scale(-10.0, 10.0, 10); fmt_plot->set_y_legend(legend_10p); break; default: fmt_plot->y_scale(-1.0, 1.0, 10); fmt_plot->set_y_legend(legend_1p); break; } fmt_plot->redraw(); } void fmt_scale_cb(void *) { progStatus.FMT_trk_scale = fmt_scale->index(); fmt_set_y_scale(); } void fmt_cntr_minutes_cb(void *) { progStatus.FMT_minutes = fmt_cntr_minutes->index(); fmt_set_x_scale(); } Fl_Group* fmt_panel(int X, int Y, int W, int H) { Fl_Group* grp = new Fl_Group(X, Y, W, H); int grp_height = 24; fmt_plot = new plot_xy ( grp->x() + 2, grp->y() + 2, grp->w() - 4, grp->h() - 4- 2 * grp_height, ""); fmt_plot->reverse_x(progdefaults.FMT_reverse); fmt_plot->bk_color (progdefaults.FMT_background); fmt_plot->line_color_1 (progdefaults.FMT_unk_color); fmt_plot->line_color_2 (progdefaults.FMT_ref_color); fmt_plot->axis_color (progdefaults.FMT_axis_color); fmt_plot->legend_color (progdefaults.FMT_legend_color); fmt_set_x_scale (); fmt_set_y_scale (); fmt_plot->show_1(false); fmt_plot->show_2(false); ref_group = new Fl_Group( fmt_plot->x(), fmt_plot->y() + fmt_plot->h(), fmt_plot->w(), 24); ref_group->box(FL_ENGRAVED_BOX); btn_unk_enable = new Fl_Light_Button( ref_group->x() + 2, ref_group->y() + 2, 50, 20, "Unk'"); btn_unk_enable->selection_color(progdefaults.default_btn_color); btn_unk_enable->callback((Fl_Callback *)cb_btn_unk_enable); unk_color = new Fl_Box( btn_unk_enable->x() + btn_unk_enable->w() + 2, btn_unk_enable->y() + 4, 12, 12, ""); unk_color->box(FL_DOWN_BOX); unk_color->color(progdefaults.FMT_unk_color); btn_unk_dn = new Fl_Button( unk_color->x() + unk_color->w() + 2, btn_unk_enable->y(), 20, 20, "@|<"); btn_unk_dn->callback((Fl_Callback*)cb_unk_dn); cnt_unk_freq = new Fl_Counter( btn_unk_dn->x() + btn_unk_dn->w(), btn_unk_dn->y(), 120, 20, ""); cnt_unk_freq->minimum(100); cnt_unk_freq->maximum(4000); cnt_unk_freq->step(0.1); cnt_unk_freq->lstep(1.0); cnt_unk_freq->value(progStatus.FMT_unk_freq); cnt_unk_freq->callback((Fl_Callback*)set_unk_freq); btn_unk_up = new Fl_Button( cnt_unk_freq->x() + cnt_unk_freq->w(), cnt_unk_freq->y(), 20, 20, "@>|"); btn_unk_up->callback((Fl_Callback*)cb_unk_up); btn_unk_reset = new Fl_Button( btn_unk_up->x() + btn_unk_up->w() + 2, btn_unk_up->y(), 50, 20, "Reset"); btn_unk_reset->callback((Fl_Callback*)cb_unk_reset); btn_unk_reset->tooltip("Reset unknown frequency"); fmt_unk_val = new Fl_Output( btn_unk_reset->x() + btn_unk_reset->w() + 4, btn_unk_enable->y(), 110, 20, ""); fmt_unk_val->value(0); fmt_unk_db = new Fl_Output( fmt_unk_val->x() + fmt_unk_val->w() + 6, btn_unk_enable->y(), 50, 20, ""); fmt_unk_db->value(""); fmt_unk_db->tooltip("amplitude in dBvp"); btn_unk_clear = new Fl_Button( fmt_unk_db->x() + fmt_unk_db->w() + 6, fmt_unk_val->y(), 60, 20, "Clear"); btn_unk_clear->callback((Fl_Callback*)cb_unk_clear); btn_unk_clear->tooltip("Clear unknown plot"); Fl_Group *dmy1 = new Fl_Group( btn_unk_clear->x() + btn_unk_clear->w(), btn_unk_clear->y(), 1, btn_unk_clear->h()); dmy1->box(FL_FLAT_BOX); dmy1->end(); btn_fmt_record = new Fl_Light_Button( ref_group->x() + ref_group->w() - 84, dmy1->y(), 80, 20, "Record"); btn_fmt_record->callback((Fl_Callback *)cb_btn_fmt_record); box_fmt_recording = new Fl_Box( btn_fmt_record->x() - 20, btn_fmt_record->y() + 4, 12, 12, ""); box_fmt_recording->box(FL_DOWN_BOX); box_fmt_recording->color(FL_WHITE); fmt_rec_interval = new Fl_ListBox( box_fmt_recording->x() - 110, btn_fmt_record->y(), 85, 20, "Interval"); fmt_rec_interval->align(FL_ALIGN_LEFT); fmt_rec_interval->add("0.10 sec"); fmt_rec_interval->add("0.25 sec"); fmt_rec_interval->add("0.50 sec"); fmt_rec_interval->add("1.0 sec"); fmt_rec_interval->add("2.0 sec"); fmt_rec_interval->add("5.0 sec"); fmt_rec_interval->add("10.0 sec"); fmt_rec_interval->color(FL_WHITE); fmt_rec_interval->index(progStatus.FMT_rec_interval); fmt_rec_interval->callback((Fl_Callback *)fmt_rec_interval_cb); fmt_rec_interval->tooltip(_("Record update every NN seconds")); ref_group->end(); ref_group->resizable(dmy1); unk_group = new Fl_Group( ref_group->x(), ref_group->y() + ref_group->h(), ref_group->w(), grp_height); unk_group->box(FL_ENGRAVED_BOX); btn_ref_enable = new Fl_Light_Button( unk_group->x() + 2, unk_group->y() + 2, 50, 20, "Ref'"); btn_ref_enable->selection_color(progdefaults.default_btn_color); btn_ref_enable->callback((Fl_Callback *)cb_btn_ref_enable); ref_color = new Fl_Box( btn_ref_enable->x() + btn_ref_enable->w() + 2, btn_ref_enable->y() + 4, 12, 12, ""); ref_color->box(FL_DOWN_BOX); ref_color->color(progdefaults.FMT_ref_color); btn_ref_dn = new Fl_Button( unk_color->x() + unk_color->w() + 2, btn_ref_enable->y(), 20, 20, "@|<"); btn_ref_dn->callback((Fl_Callback*)cb_ref_dn); cnt_ref_freq = new Fl_Counter( cnt_unk_freq->x(), btn_ref_dn->y(), 120, 20, ""); cnt_ref_freq->minimum(100); cnt_ref_freq->maximum(4000); cnt_ref_freq->step(0.1); cnt_ref_freq->lstep(1.0); cnt_ref_freq->value(progStatus.FMT_ref_freq); cnt_ref_freq->callback((Fl_Callback*)set_ref_freq); btn_ref_up = new Fl_Button( btn_unk_up->x(), cnt_ref_freq->y(), 20, 20, "@>|"); btn_ref_up->callback((Fl_Callback*)cb_ref_up); btn_ref_reset = new Fl_Button( btn_ref_up->x() + btn_ref_up->w() + 2, btn_ref_up->y(), 50, 20, "Reset"); btn_ref_reset->callback((Fl_Callback*)cb_ref_reset); btn_ref_reset->tooltip("Reset unknown tracking frequency"); fmt_ref_val = new Fl_Output( btn_ref_reset->x() + btn_ref_reset->w() + 2, btn_ref_reset->y(), 110, 20, ""); fmt_ref_val->value(""); fmt_ref_db = new Fl_Output( fmt_unk_db->x(), fmt_ref_val->y(), 50, 20, ""); fmt_ref_db->value(""); fmt_ref_db->tooltip("amplitude in dBvp"); btn_ref_clear = new Fl_Button( btn_unk_clear->x(), fmt_ref_val->y(), 60, 20, "Clear"); btn_ref_clear->callback((Fl_Callback*)cb_ref_clear); btn_ref_clear->tooltip("Clear reference plot"); Fl_Group *dmy2 = new Fl_Group( btn_ref_clear->x() + btn_ref_clear->w(), btn_ref_clear->y(), 1, btn_ref_clear->h()); dmy2->box(FL_FLAT_BOX); dmy2->end(); fmt_scale = new Fl_ListBox( unk_group->x() + unk_group->w() - 84, dmy2->y(), 80, 20, "Scale"); fmt_scale->align(FL_ALIGN_LEFT); fmt_scale->add("+/- .01"); fmt_scale->add("+/- .05"); fmt_scale->add("+/- .10"); fmt_scale->add("+/- .25"); fmt_scale->add("+/- .5"); fmt_scale->add("+/- 1"); fmt_scale->add("+/- 2"); fmt_scale->add("+/- 4"); fmt_scale->add("+/- 5"); fmt_scale->add("-/- 10"); fmt_scale->color(FL_WHITE); fmt_scale->index(progStatus.FMT_trk_scale); fmt_scale->callback((Fl_Callback *)fmt_scale_cb); fmt_scale->tooltip(_("Vertical scale of tracks")); fmt_cntr_minutes = new Fl_ListBox( fmt_scale->x() - 130, fmt_scale->y(), 85, 20, "T-scale"); fmt_cntr_minutes->align(FL_ALIGN_LEFT); fmt_cntr_minutes->add("5 min"); fmt_cntr_minutes->add("15 min"); fmt_cntr_minutes->add("30 min"); fmt_cntr_minutes->add("60 min"); fmt_cntr_minutes->add("120 min"); fmt_cntr_minutes->color(FL_WHITE); fmt_cntr_minutes->index(progStatus.FMT_minutes); fmt_cntr_minutes->callback((Fl_Callback *)fmt_cntr_minutes_cb); fmt_cntr_minutes->tooltip(_("Time scale span in minutes")); unk_group->end(); unk_group->resizable(dmy2); grp->end(); grp->resizable (fmt_plot); return grp; } void put_unk_value (const char *msg) { fmt_unk_val->value (msg); } void put_ref_value (const char *msg) { fmt_ref_val->value (msg); } void put_unk_amp (const char *msg) { fmt_unk_db->value (msg); } void put_ref_amp (const char *msg) { fmt_ref_db->value (msg); } void set_ref_freq (void *) { progStatus.FMT_ref_freq = cnt_ref_freq->value(); wf->draw_fmt_marker(); active_modem->reset_reference(); } void set_unk_freq (void *) { progStatus.FMT_unk_freq = cnt_unk_freq->value(); wf->draw_fmt_marker(); active_modem->reset_unknown(); } void set_unk_freq_value(double f) { cnt_unk_freq->value(f); progStatus.FMT_unk_freq = f; wf->draw_fmt_marker(); active_modem->reset_unknown(); } void set_ref_freq_value(double f) { cnt_ref_freq->value(f); progStatus.FMT_ref_freq = f; wf->draw_fmt_marker(); active_modem->reset_reference(); } void cb_unk_reset (void *) { active_modem->reset_unknown(); } void cb_unk_clear (void *) { fmt_modem->clear_unk_pipe(); fmt_plot->data_1(NULL, 0); fmt_plot->redraw(); } void cb_ref_reset (void *) { active_modem->reset_reference(); } void cb_ref_clear (void *) { fmt_modem->clear_ref_pipe(); fmt_plot->data_2(NULL, 0); fmt_plot->redraw(); } void set_fmt_scope() { guard_lock datalock (&scope_mutex); int num_pts = seconds[progStatus.FMT_minutes]; fmt_plot->data_1 (&fmt_modem->unk_pipe[MAX_DATA_PTS - num_pts], num_pts); fmt_plot->data_2 (&fmt_modem->ref_pipe[MAX_DATA_PTS - num_pts], num_pts); fmt_plot->redraw(); } void clear_ref_scope() { fmt_plot->data_2 (&fmt_modem->ref_pipe[MAX_DATA_PTS], MAX_DATA_PTS); fmt_plot->redraw(); Fl::flush(); } void clear_unk_scope() { fmt_plot->data_1 (&fmt_modem->ref_pipe[MAX_DATA_PTS], MAX_DATA_PTS); fmt_plot->redraw(); Fl::flush(); } fldigi-4.2.05/src/misc/0000775000175000017500000000000014611714005011564 500000000000000fldigi-4.2.05/src/misc/stack.cxx0000664000175000017500000003143614532252172013350 00000000000000// Copyright 2007 Edd Dawson. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include "stack.h" #if defined(_WIN32) #include #include #if defined(__MINGW32__) #include // link against libbfd and libiberty #include // link against psapi #include #endif #elif defined(__GNUC__) #include #include #endif namespace { #if defined(__GNUC__) std::string demangle(const char *name) { int status = 0; char *d = 0; std::string ret = name; try { if ((d = abi::__cxa_demangle(name, 0, 0, &status))) ret = d; } catch(...) { } free(d); return ret; } #endif #if defined(_WIN32) class uncopyable { public: uncopyable() { } private: uncopyable(const uncopyable &); // remains undefined uncopyable &operator= (const uncopyable &); // remains undefined }; #if defined(__MINGW32__) class bfd_context : uncopyable { private: struct find_data { std::string func; asymbol **symbol_table; bfd_vma counter; }; public: bfd_context() : abfd_(0), sec_(0), symbol_table_(0) { char procname[MAX_PATH]; GetModuleFileNameEx(GetCurrentProcess(), NULL, procname, sizeof procname); bfd_init(); abfd_ = bfd_openr(procname, 0); if (!abfd_) throw dbg::stack_error("Failed to parse object data for the executable"); char **formats = 0; bool b1 = bfd_check_format(abfd_, bfd_object); bool b2 = bfd_check_format_matches(abfd_, bfd_object, &formats); bool b3 = bfd_get_file_flags(abfd_) & HAS_SYMS; if (!(b1 && b2 && b3)) { bfd_close(abfd_); free(formats); throw dbg::stack_error("Failed to parse object data for the executable"); } free(formats); // Load symbol table unsigned dummy = 0; if (bfd_read_minisymbols(abfd_, FALSE, (void **)&symbol_table_, &dummy) == 0 && bfd_read_minisymbols(abfd_, TRUE, (void **)&symbol_table_, &dummy) < 0) { free(symbol_table_); bfd_close(abfd_); throw dbg::stack_error("Failed to parse object data for the executable"); } } ~bfd_context() { free(symbol_table_); bfd_close(abfd_); } std::string get_function_name(DWORD offset) { find_data data; data.symbol_table = symbol_table_; data.counter = offset; bfd_map_over_sections(abfd_, &find_function_name_in_section, &data); return data.func; } private: static void find_function_name_in_section(bfd *abfd, asection *sec, void *opaque_data) { assert(sec); assert(opaque_data); find_data &data = *static_cast(opaque_data); if (!data.func.empty()) return; // already found it if (!(bfd_get_section_flags(abfd, sec) & SEC_ALLOC)) return; bfd_vma vma = bfd_get_section_vma(abfd, sec); if (data.counter < vma || vma + bfd_get_section_size(sec) <= data.counter) return; const char *func = 0; const char *file = 0; unsigned line = 0; if (bfd_find_nearest_line(abfd, sec, data.symbol_table, data.counter - vma, &file, &func, &line) && func) data.func = demangle(func); } private: bfd *abfd_; asection *sec_; asymbol **symbol_table_; }; #endif // __MINGW32__ class auto_cast_function_ptr { public: template explicit auto_cast_function_ptr(FuncPtr f) : fptr_(reinterpret_cast(f)) { } template operator FuncPtr() const { return reinterpret_cast(fptr_); } private: void (*fptr_)(void); }; class windows_dll : uncopyable { public: explicit windows_dll(const std::string &libname) : name_(libname), lib_(LoadLibrary(name_.c_str())) { if (!lib_) throw dbg::stack_error("Failed to load dll " + name_); } ~windows_dll() { FreeLibrary(lib_); } const std::string &name() const { return name_; } auto_cast_function_ptr function(const std::string &func_name) const { FARPROC proc = GetProcAddress(lib_, func_name.c_str()); if (!proc) throw dbg::stack_error("failed to load function " + func_name + " from library " + name_); return auto_cast_function_ptr(proc); } private: std::string name_; HMODULE lib_; }; class symbol_context : uncopyable { public: symbol_context() { SymInitialize(GetCurrentProcess(), 0, true); } ~symbol_context() { SymCleanup(GetCurrentProcess()); } }; class mutex : uncopyable { public: mutex() { InitializeCriticalSection(&cs_); } ~mutex() { DeleteCriticalSection(&cs_); } void lock() { EnterCriticalSection(&cs_); } void unlock() { LeaveCriticalSection(&cs_); } private: CRITICAL_SECTION cs_; }; class scoped_lock : uncopyable { public: scoped_lock(mutex &m) : m_(m) { m_.lock(); } ~scoped_lock() { m_.unlock(); } private: mutex &m_; }; mutex fill_frames_mtx_; void fill_frames(std::list &frames, dbg::stack::depth_type limit) { scoped_lock lk(fill_frames_mtx_); #if defined(__MINGW32__) static bfd_context bfdc; #endif symbol_context sc; STACKFRAME frame; std::memset(&frame, 0, sizeof frame); CONTEXT context; std::memset(&context, 0, sizeof(CONTEXT)); context.ContextFlags = CONTEXT_FULL; windows_dll kernel32("kernel32.dll"); void (WINAPI *RtlCaptureContext_) (CONTEXT*) = kernel32.function("RtlCaptureContext"); RtlCaptureContext_(&context); frame.AddrPC.Offset = context.Eip; frame.AddrPC.Mode = AddrModeFlat; frame.AddrStack.Offset = context.Esp; frame.AddrStack.Mode = AddrModeFlat; frame.AddrFrame.Offset = context.Ebp; frame.AddrFrame.Mode = AddrModeFlat; HANDLE process = GetCurrentProcess(); HANDLE thread = GetCurrentThread(); dbg::stack::depth_type skip = 0; bool has_limit = limit != 0; char symbol_buffer[sizeof(IMAGEHLP_SYMBOL) + 255]; char module_name_raw[MAX_PATH]; while(StackWalk(IMAGE_FILE_MACHINE_I386, process, thread, &frame, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0 )) { if (skip < 1) { ++skip; continue; } if (has_limit && limit-- == 0) break; IMAGEHLP_SYMBOL *symbol = reinterpret_cast(symbol_buffer); symbol->SizeOfStruct = (sizeof *symbol) + 255; symbol->MaxNameLength = 254; DWORD module_base = SymGetModuleBase(process, frame.AddrPC.Offset); std::string module_name = "[unknown module]"; if( module_base && GetModuleFileName(reinterpret_cast(module_base), module_name_raw, MAX_PATH)) module_name = module_name_raw; #if defined(__MINGW32__) std::string func = bfdc.get_function_name(frame.AddrPC.Offset); if (func.empty()) { DWORD displacement = 0; // dummy variable BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); func = got_symbol ? symbol->Name : "[unknown function]"; } #else DWORD displacement = 0; // dummy variable BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &displacement, symbol); std::string func = got_symbol ? symbol->Name : "[unknown function]"; #endif dbg::stack_frame f(reinterpret_cast(frame.AddrPC.Offset), func + " in " + module_name); frames.push_back(f); } } #elif defined(__GNUC__) #if defined(__i386__) || defined(__x86_64__) void fill_frames(std::list &frames, dbg::stack::depth_type limit) { // Based on code found at: // http://www.tlug.org.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGV Dl_info info; void **frame = static_cast(__builtin_frame_address(0)); void **bp = static_cast(*frame); void *ip = frame[1]; bool has_limit = limit != 0; dbg::stack::depth_type skip = 0; while(bp && ip && dladdr(ip, &info)) { if (skip < 1) ++skip; else { if (has_limit && limit-- == 0) break; frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); if(info.dli_sname && !strcmp(info.dli_sname, "main")) break; } ip = bp[1]; bp = static_cast(bp[0]); } } #elif defined(__ppc__) void fill_frames(std::list &frames, dbg::stack::depth_type limit) { // Based on code found at: // http://www.informit.com/articles/article.aspx?p=606582&seqNum=4&rl=1 void *ip = __builtin_return_address(0); void **frame = static_cast(__builtin_frame_address(1)); bool has_limit = limit != 0; Dl_info info; do { if (has_limit && limit-- == 0) break; if (dladdr(ip, &info)) frames.push_back(dbg::stack_frame(ip, demangle(info.dli_sname) + " in " + info.dli_fname)); if (frame && (frame = static_cast(*frame))) ip = *(frame + 2); } while (frame && ip); } #else // GNU, but neither x86 or PPC #error "Sorry but dbg::stack is not supported on this architecture" #endif #else // Unsupported compiler #error "Sorry but dbg::stack is not supported on this compiler" #endif } namespace dbg { stack_error::stack_error(const std::string &what) : what_(what) { } stack_error::~stack_error() throw() { } const char *stack_error::what() const throw() { return what_.c_str(); } stack_frame::stack_frame(const void *instruction, const std::string &function) : instruction_(instruction), function_(function) { } const void *stack_frame::instruction() const { return instruction_; } const std::string &stack_frame::function() const { return function_; } std::ostream &operator<< (std::ostream &out, const stack_frame &frame) { return out << frame.instruction() << ": " << frame.function(); } stack::stack(depth_type limit) { fill_frames(frames_, limit); } stack::const_iterator stack::begin() const { return frames_.begin(); } stack::const_iterator stack::end() const { return frames_.end(); } stack::depth_type stack::depth() const { return frames_.size(); } } // close namespace dbg fldigi-4.2.05/src/misc/stacktrace.cxx0000664000175000017500000001012314611711171014352 00000000000000// ---------------------------------------------------------------------------- // stacktrace.cxx: portable stack trace and error handlers // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #if HAVE_DBG_STACK # include #endif #include #include #include #include #include #ifdef BUILD_FLDIGI # include "main.h" # include "debug.h" #else # include "flarq.h" #endif static volatile sig_atomic_t signum = 0; #if !HAVE_DBG_STACK static void pstack(int fd, unsigned skip = 0); #else static void pstack(ostream& out, unsigned skip = 0); #endif void diediedie(void) { #ifndef __MINGW32__ // If this environment variable is set, creates a core dump. if( getenv("FLDIGI_COREDUMP") ) { signal(SIGSEGV, SIG_DFL); kill(getpid(), SIGSEGV); } #endif static bool print_trace = true; if (!print_trace) exit(128 + (signum ? signum : SIGABRT)); #define CRASH_HEADER "\nAborting " PACKAGE_TARNAME " due to a fatal error.\n" \ "Please report this to: " PACKAGE_BUGREPORT \ "\nor file a bug report at: " PACKAGE_NEWBUG \ "\n\n****** Stack trace:\n" #ifndef __MINGW32__ if (isatty(STDERR_FILENO)) #endif { if (signum) std::cerr << "\nCaught signal " << signum; std::cerr << CRASH_HEADER; #if !HAVE_DBG_STACK pstack(STDERR_FILENO); #else pstack(std::cerr); #endif extern std::string version_text, build_text; std::cerr << "\n****** Version information:\n" << version_text << "\n****** Build information:\n" << build_text; std::string stfname; #ifdef BUILD_FLDIGI stfname.assign(DebugDir).append("stacktrace.txt"); rotate_log(stfname); #else stfname = Logfile; #endif #if !HAVE_DBG_STACK FILE* stfile = fl_fopen(stfname.c_str(), "w"); if (stfile) { pstack(fileno(stfile), 1); fprintf(stfile, "%s\n****** Version information:\n%s\n****** Build information:%s\n", CRASH_HEADER, version_text.c_str(), build_text.c_str()); } #else ofstream stfile(stfname.c_str()); if (stfile) { stfile << CRASH_HEADER; pstack(stfile, 1); stfile << "\n****** Version information:\n" << version_text; stfile << "\n****** Build information:\n" << build_text; } #endif } print_trace = false; exit(128 + (signum ? signum : SIGABRT)); } #if !HAVE_DBG_STACK # if HAVE_EXECINFO_H # include # define MAX_STACK_FRAMES 64 void pstack(int fd, unsigned skip) { void* stack[MAX_STACK_FRAMES]; ++skip; backtrace_symbols_fd(stack + skip, backtrace(stack, MAX_STACK_FRAMES) - skip, fd); } # else void pstack(int fd, unsigned skip) { } # endif #else # include # include # include "stack.h" static void pstack(ostream& out, unsigned skip) { dbg::stack s; dbg::stack::const_iterator start = s.begin(), end = s.end(); while (skip-- && ++start != end); copy(start, end, ostream_iterator(out, "\n")); } #endif void pstack_maybe(void) { static bool trace = getenv("FLDIGI_TRACE_LOCKS"); if (trace) #if !HAVE_DBG_STACK pstack(STDERR_FILENO, 1); #else pstack(std::cerr, 1); #endif } // this may not give us anything useful, but we can try... void handle_signal(int s) { if (s != SIGUSR2) { signum = s; diediedie(); } } fldigi-4.2.05/src/misc/arq_io.cxx0000664000175000017500000006003614611711171013510 00000000000000// ---------------------------------------------------------------------------- // arq_io.cxx // // support for ARQ server/client system such as pskmail and fl_arq // // Copyright (C) 2006-2017 // Dave Freese, W1HKJ // Copyright (C) 2008-2013 // Stelios Bounanos, M0GLD // Copyright (C) 2009-2013 // John Douyere, VK2ETA // Copyright (c) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #if !defined(__WIN32__) && !defined(__APPLE__) # include # include #endif #include #include "main.h" #include "configuration.h" #include "fl_digi.h" #include "trx.h" #include "arq_io.h" #include "threads.h" #include "socket.h" #include "debug.h" #include "qrunner.h" #include #include LOG_FILE_SOURCE(debug::LOG_ARQCONTROL); // ===================================================================== static pthread_t arq_thread; static pthread_mutex_t arq_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t arq_rx_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t tosend_mutex = PTHREAD_MUTEX_INITIALIZER; static void *arq_loop(void *args); static bool arq_exit = false; static bool arq_enabled; static bool abort_flag = false; /// Any access to shared variables must be protected. static std::string tosend = ""; // Protected by tosend_mutex //static std::string enroute = ""; // Protected by tosend_mutex static std::string arqtext = ""; // Protected by arq_rx_mutex static std::string txstring = ""; // Protected by arq_rx_mutex bool arq_text_available = false; // Protected by arq_rx_mutex // Beware 'arq_text_available' is accessed by other modules. // ===================================================================== static const char *asc[128] = { "", "", "", "", "", "", "", "", "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "" }; std::string noctrl(std::string src) { static std::string retstr; retstr.clear(); char hexstr[10]; int c; for (size_t i = 0; i < src.length(); i++) { c = src[i]; if ( c > 0 && c < 128) retstr.append(asc[c]); else { snprintf(hexstr, sizeof(hexstr), "<%0X>", c & 0xFF); retstr.append(hexstr); } } return retstr; } //====================================================================== extern void parse_arqtext(std::string &toparse); static void set_button(Fl_Button* button, bool value) { button->value(value); button->do_callback(); } void ParseMode(std::string src) { LOG_INFO("%s", src.c_str()); if ((src.find("XMTTUNE") != std::string::npos) || (src.find("PTTTUNE") != std::string::npos)) { int msecs = 100; if (src.length() > 7) { int ret = sscanf( src.substr(7, src.length() - 7).c_str(), "%d", &msecs); if (ret != 1 || msecs < 10 || msecs > 20000) msecs = 100; } // if (debug_pskmail) LOG_INFO("%s %5.2f sec", "ARQ set ptt-tune on", msecs/1000.0); REQ_SYNC(&waterfall::set_XmtRcvBtn, wf, true); REQ_SYNC(trx_tune); MilliSleep(msecs); // if (debug_pskmail) LOG_INFO("%s", "ARQ set ptt-tune off"); REQ_SYNC(&waterfall::set_XmtRcvBtn, wf, false); REQ_SYNC(trx_receive); } else for (size_t i = 0; i < NUM_MODES; ++i) { if (strlen(mode_info[i].pskmail_name) > 0) { if (src == mode_info[i].pskmail_name) { if (active_modem->get_mode() == mode_info[i].mode) { LOG_INFO("Active modem already set to %s", src.c_str()); } else { REQ_SYNC(init_modem_sync, mode_info[i].mode, 0); MilliSleep(100); // AbortARQ(); // if (debug_pskmail) LOG_INFO("Modem set to %s", mode_info[i].pskmail_name); } break; } } } WriteARQ('\002'); } void ParseRSID(std::string src) { if (src == "ON") { // if (debug_pskmail) LOG_INFO("%s", "RsID turned ON"); REQ(set_button, btnRSID, 1); } if (src == "OFF") { // if (debug_pskmail) LOG_INFO("%s", "RsID turned OFF"); REQ(set_button, btnRSID, 0); } } void ParseTxRSID(std::string src) { if (src == "ON") { // if (debug_pskmail) LOG_INFO("%s", "TxRsID turned ON"); REQ(set_button, btnTxRSID, 1); } if (src == "OFF") { // if (debug_pskmail) LOG_INFO("%s", "TxRsID turned OFF"); REQ(set_button, btnTxRSID, 0); } } void parse_arqtext(std::string &toparse) { static std::string strCmdText; static std::string strSubCmd; unsigned long int idxCmd, idxCmdEnd, idxSubCmd, idxSubCmdEnd; if (toparse.empty()) return; LOG_VERBOSE("parsing: %s", noctrl(toparse).c_str()); idxCmd = toparse.find(""); idxCmdEnd = toparse.find(""); while ( idxCmd != std::string::npos && idxCmdEnd != std::string::npos && idxCmdEnd > idxCmd ) { LOG_VERBOSE("Parsing: %s", noctrl(toparse.substr(idxCmd, idxCmdEnd - idxCmd + 6)).c_str()); strCmdText = toparse.substr(idxCmd + 5, idxCmdEnd - idxCmd - 5); if (strCmdText == "server" && mailserver == false && mailclient == false) { mailserver = true; mailclient = false; std::string PskMailLogName; PskMailLogName.assign(PskMailDir); PskMailLogName.append("gMFSK.log"); Maillogfile = new cLogfile(PskMailLogName.c_str()); Maillogfile->log_to_file_start(); REQ(set_button, wf->xmtlock, 1); if (progdefaults.PSKmailSweetSpot) active_modem->set_freq(progdefaults.PSKsweetspot); active_modem->set_freqlock(true); LOG_INFO("%s", "ARQ is set to pskmail server"); } else if (strCmdText == "client" && mailclient == false && mailserver == false) { mailclient = true; mailserver = false; std::string PskMailLogName; PskMailLogName.assign(PskMailDir); PskMailLogName.append("gMFSK.log"); Maillogfile = new cLogfile(PskMailLogName.c_str()); Maillogfile->log_to_file_start(); REQ(set_button, wf->xmtlock, 0); active_modem->set_freqlock(false); LOG_INFO("%s", "ARQ is set to pskmail client"); } else if (strCmdText == "normal") { mailserver = false; mailclient = false; if (Maillogfile) { delete Maillogfile; Maillogfile = 0; } REQ(set_button, wf->xmtlock, 0); active_modem->set_freqlock(false); LOG_INFO("%s", "ARQ is reset to normal ops"); } else if ((idxSubCmd = strCmdText.find("")) != std::string::npos) { idxSubCmdEnd = strCmdText.find(""); if ( idxSubCmdEnd != std::string::npos && idxSubCmdEnd > idxSubCmd ) { strSubCmd = strCmdText.substr(idxSubCmd + 6, idxSubCmdEnd - idxSubCmd - 6); LOG_INFO("%s %s", "ARQ mode ", strSubCmd.c_str()); ParseMode(strSubCmd); } } else if ((idxSubCmd = strCmdText.find("")) != std::string::npos) { idxSubCmdEnd = strCmdText.find(""); if ( idxSubCmdEnd != std::string::npos && idxSubCmdEnd > idxSubCmd ) { strSubCmd = strCmdText.substr(idxSubCmd + 6, idxSubCmdEnd - idxSubCmd - 6); ParseRSID(strSubCmd); LOG_INFO("%s %s", "ARQ rsid ", strSubCmd.c_str()); } } else if ((idxSubCmd = strCmdText.find("")) != std::string::npos) { idxSubCmdEnd = strCmdText.find(""); if ( idxSubCmdEnd != std::string::npos && idxSubCmdEnd > idxSubCmd ) { strSubCmd = strCmdText.substr(idxSubCmd + 8, idxSubCmdEnd - idxSubCmd - 8); ParseTxRSID(strSubCmd); LOG_INFO("%s %s", "ARQ txrsid ", strSubCmd.c_str()); } } else if (strCmdText == "abort") { LOG_INFO("%s", "Abort current ARQ ops"); abort_flag = true; } toparse.erase(idxCmd, idxCmdEnd - idxCmd + 6); while (toparse[0] == '\n' || toparse[0] == '\r') toparse.erase(0, 1); idxCmd = toparse.find(""); idxCmdEnd = toparse.find(""); } if (!toparse.empty()) LOG_VERBOSE("Remaining text: %s", noctrl(toparse).c_str()); } #define TIMEOUT 180 // 3 minutes //====================================================================== // Gmfsk ARQ file i/o used only on Linux //====================================================================== // checkTLF // look for files named // TLFfldigi ==> tlfio is true and // ==> mailclient is true // in $HOME void checkTLF() { static std::string TLFfile; static std::string TLFlogname; std::ifstream testFile; tlfio = mailserver = mailclient = false; TLFfile.assign(PskMailDir); TLFfile.append("TLFfldigi"); testFile.open(TLFfile.c_str()); if (testFile.is_open()) { testFile.close(); mailclient = true; tlfio = true; TLFlogname.assign(PskMailDir); TLFlogname.append("gMFSK.log"); Maillogfile = new cLogfile(TLFlogname.c_str()); Maillogfile->log_to_file_start(); } } static bool TLF_arqRx() { /// The mutex is automatically unlocked when returning. #if defined(__WIN32__) || defined(__APPLE__) return false; #else time_t start_time, prog_time; static char mailline[1000]; static std::string sAutoFile(""); sAutoFile.assign(PskMailDir); sAutoFile.append("gmfsk_autofile"); std::ifstream autofile(sAutoFile.c_str()); if(autofile) { time(&start_time); while (!autofile.eof()) { memset(mailline, 0, sizeof(mailline)); autofile.getline(mailline, 998); // leave space for "\n" and null byte txstring.append(mailline); txstring.append("\n"); time(&prog_time); if (prog_time - start_time > TIMEOUT) { LOG_ERROR("TLF file I/O failure"); autofile.close(); std::remove (sAutoFile.c_str()); return false; } } autofile.close(); std::remove (sAutoFile.c_str()); parse_arqtext(txstring); if (abort_flag) { AbortARQ(); abort_flag = false; return true; } if (!txstring.empty()) { guard_lock arq_rx_lock(&arq_rx_mutex); if (arqtext.empty()) { arqtext = txstring; if (mailserver && progdefaults.PSKmailSweetSpot) active_modem->set_freq(progdefaults.PSKsweetspot); arq_text_available = true; active_modem->set_stopflag(false); start_tx(); } else { arqtext.append(txstring); active_modem->set_stopflag(false); } txstring.clear(); } } return true; #endif } //====================================================================== // Auto transmit of file contained in WRAP_auto_dir //====================================================================== bool WRAP_auto_arqRx() { time_t start_time, prog_time; static char mailline[1000]; static std::string sAutoFile(""); std::ifstream autofile; if (sAutoFile.empty()) { sAutoFile.assign(FLMSG_WRAP_auto_dir); sAutoFile.append("wrap_auto_file"); autofile.open(sAutoFile.c_str()); if (!autofile) { sAutoFile.assign(WRAP_auto_dir); sAutoFile.append("wrap_auto_file"); autofile.open(sAutoFile.c_str()); } } else autofile.open(sAutoFile.c_str()); if(autofile) { /// Mutex is unlocked when leaving the block. guard_lock arq_rx_lock(&arq_rx_mutex); txstring.clear(); time(&start_time); while (!autofile.eof()) { memset(mailline,0,1000); autofile.getline(mailline, 998); // leave space for "\n" and null byte txstring.append(mailline); txstring.append("\n"); time(&prog_time); if (prog_time - start_time > TIMEOUT) { LOG_ERROR("autowrap file I/O failure"); autofile.close(); std::remove (sAutoFile.c_str()); return false; } } autofile.close(); std::remove (sAutoFile.c_str()); if (!txstring.empty()) { arqtext.assign("\n....start\n"); arqtext.append(txstring); arqtext.append("\n......end\n"); arq_text_available = true; LOG_DEBUG("%s", arqtext.c_str()); start_tx(); txstring.clear(); return true; } } return false; } //====================================================================== // Socket ARQ i/o used on all platforms //====================================================================== #define ARQLOOP_TIMING 50 // 100 // msec #define CLIENT_TIMEOUT 5 // timeout after 5 secs struct ARQCLIENT { Socket sock; time_t keep_alive; }; static std::string errstring; static pthread_t* arq_socket_thread = 0; ARQ_SOCKET_Server* ARQ_SOCKET_Server::inst = 0; static std::vector arqclient; // Protected by arq_mutex void arq_run(Socket); ARQ_SOCKET_Server::ARQ_SOCKET_Server() { server_socket = new Socket; arq_socket_thread = new pthread_t; run = true; } ARQ_SOCKET_Server::~ARQ_SOCKET_Server() { run = false; if (arq_socket_thread) { CANCEL_THREAD(*arq_socket_thread); pthread_join(*arq_socket_thread, NULL); delete arq_socket_thread; arq_socket_thread = 0; } delete server_socket; } bool ARQ_SOCKET_Server::start(const char* node, const char* service) { if (inst) return false; inst = new ARQ_SOCKET_Server; try { inst->server_socket->open(Address(node, service)); inst->server_socket->bind(); #ifdef __WIN32__ inst->server_socket->listen(); inst->server_socket->set_timeout(0.1); #endif } catch (const SocketException& e) { errstring.assign("Could not start ARQ server ("); errstring.append(e.what()).append(")"); if (e.error() == EADDRINUSE) errstring.append("\nMultiple instances of fldigi??"); LOG_ERROR("%s", errstring.c_str()); delete arq_socket_thread; arq_socket_thread = 0; delete inst; inst = 0; return false; } return !pthread_create(arq_socket_thread, NULL, thread_func, NULL); } bool server_stopped = false; void ARQ_SOCKET_Server::stop(void) { if (!inst) return; inst->run = false; SET_THREAD_CANCEL(); MilliSleep(50); #if !defined(__WOE32__) && !defined(__APPLE__) int timeout = 10; while(!server_stopped) { MilliSleep(100); Fl::awake(); if (--timeout == 0) break; } #endif delete inst; inst = 0; } void* ARQ_SOCKET_Server::thread_func(void*) { SET_THREAD_ID(ARQSOCKET_TID); SET_THREAD_CANCEL(); // On POSIX we block indefinitely and are interrupted by a signal. // On WIN32 we block for a short time and test for cancellation. while (inst->run) { try { #ifdef __WIN32__ if (inst->server_socket->wait(0)) arq_run(inst->server_socket->accept()); #else arq_run(inst->server_socket->accept()); TEST_THREAD_CANCEL(); #endif } catch (const SocketException& e) { if (e.error() != EINTR) { errstring = e.what(); LOG_ERROR("%s", errstring.c_str()); break; } } catch (...) { break; } } { /// Mutex is unlocked when leaving the block. guard_lock arq_lock(&arq_mutex); if (!arqclient.empty()) { for (std::vector::iterator p = arqclient.begin(); p < arqclient.end(); p++) { (*p)->sock.close(); arqclient.erase(p); } } } inst->server_socket->close(); server_stopped = true; return NULL; } void arq_reset() { /// Mutex is unlocked when returning from function guard_lock arq_rx_lock(&arq_rx_mutex); arqmode = mailserver = mailclient = false; // txstring.clear(); // arqtext.clear(); } void arq_run(Socket s) { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_mutex); struct timeval t = { 0, 20000 }; s.set_timeout(t); s.set_nonblocking(); ARQCLIENT *client = new ARQCLIENT; client->sock = s; client->keep_alive = time(0); arqclient.push_back(client); arqmode = true; std::vector::iterator p = arqclient.begin(); std::ostringstream outs; outs << "Clients: "; while (p != arqclient.end()) { outs << (*p)->sock.fd() << " "; p++; } LOG_INFO("%s", outs.str().c_str()); } void WriteARQsocket(unsigned char* data, size_t len) { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_mutex); if (arqclient.empty()) return; static std::string instr; instr.clear(); std::string outs = ""; for (unsigned int i = 0; i < len; i++) outs += asc[data[i] & 0x7F]; LOG_INFO("%s", outs.c_str()); std::vector::iterator p; for (p = arqclient.begin(); p < arqclient.end(); p++) { try { (*p)->sock.wait(1); (*p)->sock.send(data, len); (*p)->keep_alive = time(0); p++; } catch (const SocketException& e) { LOG_INFO("closing socket fd %d %s", (*p)->sock.fd(), e.what()); try { (*p)->sock.close(); } catch (const SocketException& e) { LOG_ERROR("Socket error on # %d, %d: %s", (*p)->sock.fd(), e.error(), e.what()); } arqclient.erase(p); } } if (arqclient.empty()) arq_reset(); } void test_arq_clients() { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_mutex); if (arqclient.empty()) return; static std::string instr; instr.clear(); std::vector::iterator p; p = arqclient.begin(); time_t now; size_t ret; while (p < arqclient.end()) { if (difftime(now = time(0), (*p)->keep_alive) > CLIENT_TIMEOUT) { try { (*p)->sock.wait(1); ret = (*p)->sock.send("\0", 1); if (ret <= 0) { LOG_INFO("closing inactive socket %d", (int)((*p)->sock.fd())); (*p)->sock.close(); arqclient.erase(p); // sets p to next iterator } else { (*p)->keep_alive = now; p++; } } catch (const SocketException& e) { LOG_INFO("socket %d timed out, error %d, %s", (*p)->sock.fd(), e.error(), e.what()); try { (*p)->sock.close(); } catch (const SocketException& e) { LOG_ERROR("Socket error on # %d, %d: %s", (*p)->sock.fd(), e.error(), e.what()); } arqclient.erase(p); } } else { p++; } } if (arqclient.empty()) arq_reset(); } bool Socket_arqRx() { { /// Mutex is unlocked when leaving block guard_lock arq_lock(&arq_mutex); if (arqclient.empty()) return false; static std::string instr; std::vector::iterator p = arqclient.begin(); size_t n = 0; instr.clear(); while (p != arqclient.end()) { try { (*p)->sock.wait(0); while ( (n = (*p)->sock.recv(instr)) > 0) { txstring.append(instr); LOG_VERBOSE("%s", txstring.c_str()); } p++; } catch (const SocketException& e) { txstring.clear(); LOG_INFO("closing socket fd %d, %d: %s", (*p)->sock.fd(), e.error(), e.what()); try { (*p)->sock.close(); } catch (const SocketException& e) { LOG_ERROR("socket error on # %d, %d: %s", (*p)->sock.fd(), e.error(), e.what()); } arqclient.erase(p); } } if (arqclient.empty()) arq_reset(); } if (!txstring.empty()) parse_arqtext(txstring); if (abort_flag) { AbortARQ(); abort_flag = false; return true; } { /// Mutex is unlocked when leaving block guard_lock arq_rx_lock(&arq_rx_mutex); if (txstring.empty()) return false; arqtext.append(txstring); if (mailserver && progdefaults.PSKmailSweetSpot) active_modem->set_freq(progdefaults.PSKsweetspot); if (trx_state != STATE_TX) start_tx(); txstring.clear(); arq_text_available = true; active_modem->set_stopflag(false); } return true; } //====================================================================== // Implementation using thread vice the fldigi timeout facility //====================================================================== void WriteARQ(unsigned char data) { if (active_modem->get_mode() == MODE_FSQ) return; guard_lock tosend_lock(&tosend_mutex); tosend += data; } void WriteARQ(const char *data) { if (active_modem->get_mode() == MODE_FSQ) return; guard_lock tosend_lock(&tosend_mutex); tosend.append(data); } static void *arq_loop(void *args) { SET_THREAD_ID(ARQ_TID); for (;;) { /* see if we are being canceled */ if (arq_exit) break; test_arq_clients(); { /// Mutex is unlocked when exiting block guard_lock tosend_lock(&tosend_mutex); // enroute.clear(); if (!tosend.empty()) { // enroute = tosend; WriteARQsocket((unsigned char*)tosend.c_str(), tosend.length()); tosend.clear(); } // if (!enroute.empty()) { // WriteARQsocket((unsigned char*)enroute.c_str(), enroute.length()); // } } if (arq_exit) break; // order of precedence; Socket, Wrap autofile, TLF autofile if (!Socket_arqRx()) if (!WRAP_auto_arqRx()) TLF_arqRx(); MilliSleep(ARQLOOP_TIMING); } // exit the arq thread return NULL; } bool arq_state(void) { return arq_enabled; } void arq_init() { arq_enabled = false; txstring.clear(); arqclient.clear(); if (!ARQ_SOCKET_Server::start( progdefaults.arq_address.c_str(), progdefaults.arq_port.c_str() )) { arq_enabled = false; return; } if (pthread_create(&arq_thread, NULL, arq_loop, NULL) < 0) { LOG_ERROR("arq init: pthread_create failed"); arq_enabled = false; return; } arq_enabled = true; } void arq_close(void) { if (!arq_enabled) return; ARQ_SOCKET_Server::stop(); // tell the arq thread to kill it self { guard_lock arqclose(&tosend_mutex); arq_exit = true; } // and then wait for it to die pthread_join(arq_thread, NULL); arq_enabled = false; LOG_INFO("ARQ closed"); if(data_io_enabled == ARQ_IO) data_io_enabled = DISABLED_IO ; arq_exit = false; } int arq_get_char() { /// Mutex is unlocked when returning from function guard_lock arq_rx_lock(&arq_rx_mutex); int c = 0; if (arq_text_available) { if (!arqtext.empty()) { c = arqtext[0] & 0xFF; arqtext.erase(0,1); } else { arq_text_available = false; c = GET_TX_CHAR_ETX; } } return c; } void flush_arq_tx_buffer(void) { guard_lock arq_rx_lock(&arq_rx_mutex); arq_text_available = false; // arqtext.clear(); } //====================================================================== // following function used if the T/R button is pressed to stop a transmission // that is servicing the ARQ text buffer. It allows the ARQ client to reset // itself properly //====================================================================== void AbortARQ() { /// Mutex is unlocked when returning from function guard_lock arq_lock(&arq_rx_mutex); arqtext.clear(); txstring.clear(); arq_text_available = false; } //====================================================================== // Special notification for PSKMAIL: new mode marked only, in following // format: "", with = '0x12'. //====================================================================== void pskmail_notify_rsid(trx_mode mode) { static char buf[64]; memset(buf, 0, sizeof(buf)); int n = snprintf(buf, sizeof(buf), "\x12\n", mode_info[mode].name); if (n > 0 && n < (int)sizeof(buf)) { WriteARQ((const char *)buf); REQ(&FTextBase::addstr, ReceiveText, buf, FTextBase::CTRL); LOG_INFO("%s", buf); } } //====================================================================== // Special notification for PSKMAIL: signal to noise measured by decoder // format "" // where CC = count, A.a = average s/n, D.d = Std dev of s/n //====================================================================== void pskmail_notify_s2n(double s2n_ncount, double s2n_avg, double s2n_stddev) { static char buf[64]; memset(buf, 0, sizeof(buf)); int n = snprintf(buf, sizeof(buf), "\x12\n", s2n_ncount, s2n_avg, s2n_stddev); if (n > 0 && n < (int)sizeof(buf)) { WriteARQ((const char *)buf); REQ(&FTextBase::addstr, ReceiveText, buf, FTextBase::CTRL); LOG_INFO("%s", buf); } } fldigi-4.2.05/src/misc/timeops.cxx0000664000175000017500000001240114611711171013707 00000000000000// ---------------------------------------------------------------------------- // timeops.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "timeops.h" #ifdef __MINGW32__ # include "compat.h" #endif #if !HAVE_CLOCK_GETTIME # ifdef __APPLE__ # include # endif # if HAVE_SYS_TIME_H # include # endif # include int clock_gettime(clockid_t clock_id, struct timespec* tp) { if (clock_id == CLOCK_REALTIME) { struct timeval t; if (unlikely(gettimeofday(&t, NULL) != 0)) return -1; tp->tv_sec = t.tv_sec; tp->tv_nsec = t.tv_usec * 1000; } else if (clock_id == CLOCK_MONOTONIC) { #if defined(__WOE32__) int32_t msec = GetTickCount(); tp->tv_sec = msec / 1000; tp->tv_nsec = (msec % 1000) * 1000000; #elif defined(__APPLE__) static mach_timebase_info_data_t info = { 0, 0 }; if (unlikely(info.denom == 0)) mach_timebase_info(&info); uint64_t t = mach_absolute_time() * info.numer / info.denom; tp->tv_sec = t / 1000000000; tp->tv_nsec = t % 1000000000; #endif } else { errno = EINVAL; return -1; } return 0; } #endif // !HAVE_CLOCK_GETTIME struct timespec operator+(const struct timespec &t0, const double &t) { struct timespec r; r.tv_sec = t0.tv_sec + static_cast(t); r.tv_nsec = t0.tv_nsec + static_cast((t - static_cast(t)) * 1e9); if (r.tv_nsec > 1000000000) { r.tv_nsec -= 1000000000; r.tv_sec++; } return r; } struct timespec operator-(const struct timespec &t0, const struct timespec &t1) { struct timespec r = t0; if (r.tv_nsec < t1.tv_nsec) { --r.tv_sec; r.tv_nsec += 1000000000L; } r.tv_sec -= t1.tv_sec; r.tv_nsec -= t1.tv_nsec; return r; } struct timespec& operator-=(struct timespec &t0, const struct timespec &t1) { if (t0.tv_nsec < t1.tv_nsec) { --t0.tv_sec; t0.tv_nsec += 1000000000L; } t0.tv_sec -= t1.tv_sec; t0.tv_nsec -= t1.tv_nsec; return t0; } bool operator>(const struct timespec &t0, const struct timespec &t1) { if (t0.tv_sec == t1.tv_sec) return t0.tv_nsec > t1.tv_nsec; else if (t0.tv_sec > t1.tv_sec) return true; else return false; } bool operator==(const struct timespec &t0, const struct timespec &t1) { return t0.tv_sec == t1.tv_sec && t0.tv_nsec == t1.tv_nsec; } struct timeval operator+(const struct timeval &t0, const double &t) { struct timeval r; r.tv_sec = t0.tv_sec + static_cast(t); r.tv_usec = t0.tv_usec + static_cast((t - static_cast(t)) * 1e9); if (r.tv_usec > 1000000) { r.tv_usec -= 1000000; r.tv_sec++; } return r; } struct timeval operator-(const struct timeval &t0, const struct timeval &t1) { struct timeval r = t0; if (r.tv_usec < t1.tv_usec) { --r.tv_sec; r.tv_usec += 1000000; } r.tv_sec -= t1.tv_sec; r.tv_usec -= t1.tv_usec; return r; } struct timeval& operator-=(struct timeval &t0, const struct timeval &t1) { if (t0.tv_usec < t1.tv_usec) { --t0.tv_sec; t0.tv_usec += 1000000L; } t0.tv_sec -= t1.tv_sec; t0.tv_usec -= t1.tv_usec; return t0; } bool operator>(const struct timeval &t0, const struct timeval &t1) { if (t0.tv_sec == t1.tv_sec) return t0.tv_usec > t1.tv_usec; else if (t0.tv_sec > t1.tv_sec) return true; else return false; } bool operator==(const struct timeval &t0, const struct timeval &t1) { return t0.tv_sec == t1.tv_sec && t0.tv_usec == t1.tv_usec; } #ifndef HAVE_GMTIME_R #include "threads.h" static pthread_mutex_t gmtime_r_mutex = PTHREAD_MUTEX_INITIALIZER; struct tm *gmtime_r(const time_t *_Time, struct tm *_Tm) { pthread_mutex_lock (&gmtime_r_mutex); struct tm *p = gmtime(_Time); if (p && _Tm) memcpy (_Tm, p, sizeof (struct tm)); pthread_mutex_unlock (&gmtime_r_mutex); return p; } static pthread_mutex_t gmtime_local_mutex = PTHREAD_MUTEX_INITIALIZER; struct tm *localtime_r(const time_t *_Time,struct tm *_Tm) { pthread_mutex_lock (&gmtime_local_mutex); struct tm *p = localtime(_Time); if (p && _Tm) memcpy (_Tm, p, sizeof (struct tm)); pthread_mutex_unlock (&gmtime_local_mutex); return p; } #endif fldigi-4.2.05/src/misc/configuration.cxx0000664000175000017500000007022314611711171015104 00000000000000// ---------------------------------------------------------------------------- // configuration.cxx // // Copyright (C) 2006-2010 // Dave Freese, W1HKJ // Copyright (C) 2007-2008 // Leigh L. Klotz, Jr., WA5ZNU // Copyright (C) 2007-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "configuration.h" #include "confdialog.h" #include "xmlreader.h" #include "soundconf.h" #include "fl_digi.h" #include "main.h" #include "gettext.h" #include "nls.h" #include "icons.h" #include "rigsupport.h" #include "contest.h" #if USE_HAMLIB #include "hamlib.h" #include "rigclass.h" #endif #include "rigio.h" #include "rigxml.h" #include "nanoIO.h" #include "debug.h" #include #include #include #include #include #include #ifdef __linux__ # include # include # include # include #endif #ifdef __APPLE__ # include #endif #ifndef __CYGWIN__ # include #else # include #endif // this tests depends on a modified FL/filename.H in the Fltk-1.3.0 // change //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) // to //# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) && !defined(__WOE32__) #include const char *szBaudRates[] = { "", "300","600","1200","2400", "4800","9600","19200","38400", "57600","115200","230400","460800"}; const char *szBands[] = { "", "1830", "3580", "7030", "7070", "10138", "14070", "18100", "21070", "21080", "24920", "28070", "28120", 0}; std::ostream& operator<<(std::ostream& out, const RGB& rgb) { return out << (int)rgb.R << ' ' << (int)rgb.G << ' ' << (int)rgb.B; } std::istream& operator>>(std::istream& in, RGB& rgb) { int i; in >> i; rgb.R = i; in >> i; rgb.G = i; in >> i; rgb.B = i; return in; } std::ostream& operator<<(std::ostream& out, const RGBI& rgbi) { return out << (int)rgbi.R << ' ' << (int)rgbi.G << ' ' << (int)rgbi.B; } std::istream& operator>>(std::istream& in, RGBI& rgbi) { int i; in >> i; rgbi.R = i; in >> i; rgbi.G = i; in >> i; rgbi.B = i; return in; } // This allows to put tag elements into containers class tag_base { public: tag_base(const char* t, const char* d = "") : tag(t), doc(d) { } virtual void write(std::ostream& out) const = 0; virtual void read(const char* data) = 0; virtual ~tag_base() { } const char* tag; const char* doc; }; // This will handle every type that has << and >> stream operators template class tag_elem : public tag_base { public: tag_elem(const char* t, const char* d, T& v) : tag_base(t, d), var(v) { } void write(std::ostream& out) const { out << "\n" << '<' << tag << '>' << var << "\n\n"; } void read(const char* data) { std::istringstream iss(data); iss >> var; } T& var; }; // Instantiate an explicit tag_elem for types that require unusual handling. // Special handling for strings template <> class tag_elem : public tag_base { public: tag_elem(const char* t, const char* d, std::string& s) : tag_base(t, d), str(s) { } void write(std::ostream& out) const { std::string s = str; std::string s2 = doc; std::string::size_type i = s.find('&'); while (i != std::string::npos) { s.replace(i, 1, "&"); i = s.find('&', i + 1); } while ((i = s.find('<')) != std::string::npos) s.replace(i, 1, "<"); while ((i = s.find('>')) != std::string::npos) s.replace(i, 1, ">"); while ((i = s.find('"')) != std::string::npos) s.replace(i, 1, """); while ((i = s.find('\'')) != std::string::npos) s.replace(i, 1, "'"); i = s2.find('&'); while (i != std::string::npos) { s2.replace(i, 1, "&"); i = s2.find('&', i + 1); } while ((i = s2.find('<')) != std::string::npos) s2.replace(i, 1, "<"); while ((i = s2.find('>')) != std::string::npos) s2.replace(i, 1, ">"); while ((i = s2.find('"')) != std::string::npos) s2.replace(i, 1, """); while ((i = s2.find('\'')) != std::string::npos) s2.replace(i, 1, "'"); out << "\n" << '<' << tag << '>' << s << "\n\n"; } void read(const char* data) { str = data; } std::string& str; }; // Special handling for mode bitsets template <> class tag_elem : public tag_base { public: tag_elem(const char* t, const char* d, mode_set_t& m) : tag_base(t, d), modes(m) { } void write(std::ostream& out) const { out << "\n" << '<' << tag << '>'; for (size_t i = 0; i < modes.size(); i++) { if (!modes.test(i)) out << mode_info[i].name << ','; } out << ",\n\n"; } void read(const char* data) { std::string sdata = data, smode, tstmode; modes.set(); size_t p = sdata.find(","); while ((p != std::string::npos) && (p != 0)) { smode = sdata.substr(0, p); for (size_t i = 0; i < modes.size(); i++) { tstmode = mode_info[i].name; if (smode == tstmode) { modes.set(i,0); break; } } sdata.erase(0, p+1); p = sdata.find(","); } } mode_set_t& modes; }; // By redefining the ELEM_ macro, we can control what the CONFIG_LIST macro // will expand to, and accomplish several things: // 1) Declare "struct configuration". See ELEM_DECLARE_CONFIGURATION // in configuration.h. // 2) Define progdefaults, the configuration struct that is initialised with // fldigi's default options #define ELEM_PROGDEFAULTS(type_, var_, tag_, doc_, ...) __VA_ARGS__, // 3) Define an array of tag element pointers #define ELEM_TAG_ARRAY(type_, var_, tag_, doc_, ...) \ (*tag_ ? new tag_elem(tag_, "type: " #type_ "; default: " #__VA_ARGS__ "\n" doc_, \ progdefaults.var_) : 0), // First define the default config #undef ELEM_ #define ELEM_ ELEM_PROGDEFAULTS configuration progdefaults = { CONFIG_LIST }; void configuration::writeDefaultsXML() { std::string deffname(HomeDir); deffname.append("fldigi_def.xml"); std::string deffname_backup(deffname); deffname_backup.append("-old"); remove(deffname_backup.c_str()); rename(deffname.c_str(), deffname_backup.c_str()); std::ofstream f(deffname.c_str()); if (!f) { LOG_ERROR("Could not write %s", deffname.c_str()); return; } // create an array #undef ELEM_ #define ELEM_ ELEM_TAG_ARRAY tag_base* tag_list[] = { CONFIG_LIST }; // write all variables with non-empty tags to f f << "\n\n"; for (size_t i = 0; i < sizeof(tag_list)/sizeof(*tag_list); i++) { if (tag_list[i]) { tag_list[i]->write(f); delete tag_list[i]; } } f << "\n"; f.close(); } static void log_excluded_modes(void) { return; struct { mode_set_t* modes; const char* msgstr; } excluded[] = { { &progdefaults.rsid_rx_modes, "RSID (rx)" }, { &progdefaults.rsid_tx_modes, "RSID (tx)" }, { &progdefaults.cwid_modes, "CWID" }, { &progdefaults.videoid_modes, "VIDEOID" } }; std::string buf; for (size_t i = 0; i < sizeof(excluded)/sizeof(*excluded); i++) { size_t n = excluded[i].modes->size(); if (excluded[i].modes->count() == n) continue; buf.erase(); for (size_t j = 0; j < n; j++) { if (!excluded[i].modes->test(j)) { if (!buf.empty()) buf += ' '; buf += mode_info[j].sname; } } LOG(debug::QUIET_LEVEL, debug::LOG_OTHER, "%-10s: %s", excluded[i].msgstr, buf.c_str()); } } bool configuration::readDefaultsXML() { // Decode all RSID modes rsid_rx_modes.set(); // Don't transmit RSID or VideoID for CW, PSK31, RTTY rsid_tx_modes.set().reset(MODE_CW).reset(MODE_PSK31).reset(MODE_RTTY); videoid_modes = rsid_tx_modes; // Don't transmit CWID for CW cwid_modes.set().reset(MODE_CW); // Show all op modes visible_modes.set(); std::string deffname = HomeDir; deffname.append("fldigi_def.xml"); std::ifstream f(deffname.c_str()); if (!f) return false; std::string xmlbuf; f.seekg(0, std::ios::end); xmlbuf.reserve(f.tellg()); // reserve some space to avoid reallocations f.seekg(0, std::ios::beg); char line[2048]; while (f.getline(line, sizeof(line))) xmlbuf.append(line).append("\n"); f.close(); IrrXMLReader* xml = createIrrXMLReader(new IIrrXMLStringReader(xmlbuf)); if (!xml) return false; // create a TAG_NAME -> ELEMENT map typedef std::map tag_map_t; tag_map_t tag_map; tag_base* tag_list[] = { CONFIG_LIST }; for (size_t i = 0; i < sizeof(tag_list)/sizeof(*tag_list); i++) if (tag_list[i]) tag_map[tag_list[i]->tag] = tag_list[i]; // parse the xml buffer tag_map_t::const_iterator i = tag_map.end(); while(xml->read()) { switch(xml->getNodeType()) { case EXN_TEXT: case EXN_CDATA: if (i != tag_map.end()) // do we know about this tag? i->second->read(xml->getNodeData()); break; case EXN_ELEMENT_END: i = tag_map.end(); // ignore the next EXN_CDATA break; case EXN_ELEMENT: i = tag_map.find(xml->getNodeName()); break; case EXN_NONE: case EXN_COMMENT: case EXN_UNKNOWN: break; } } delete xml; // delete the tag objects for (size_t i = 0; i < sizeof(tag_list)/sizeof(*tag_list); i++) delete tag_list[i]; log_excluded_modes(); return true; } void configuration::loadDefaults() { // RTTY selShift->index(rtty_shift); if (progdefaults.rtty_shift == selShift->lsize() - 1) { selCustomShift->activate(); selCustomShift->value(rtty_custom_shift); } else selCustomShift->deactivate(); selBaud->index(rtty_baud); selBits->index(rtty_bits); selParity->index(rtty_parity); // chkMsbFirst->value(rtty_msbfirst); selStopBits->index(rtty_stop); btnCRCRLF->value(rtty_crcrlf); btnAUTOCRLF->value(rtty_autocrlf); cntrAUTOCRLF->value(rtty_autocount); chkPseudoFSK->value(PseudoFSK); chkUOSrx->value(UOSrx); chkUOStx->value(UOStx); i_listbox_rtty_afc_speed->index(rtty_afcspeed); btnPreferXhairScope->value(PreferXhairScope); // OLIVIA i_listbox_olivia_tones->index(oliviatones); i_listbox_olivia_bandwidth->index(oliviabw); cntOlivia_smargin->value(oliviasmargin); cntOlivia_sinteg->value(oliviasinteg); btnOlivia_8bit->value(olivia8bit); // CONTESTIA i_listbox_contestia_tones->index(contestiatones); i_listbox_contestia_bandwidth->index(contestiabw); cntContestia_smargin->value(contestiasmargin); cntContestia_sinteg->value(contestiasinteg); btnContestia_8bit->value(contestia8bit); chkDominoEX_FEC->value(DOMINOEX_FEC); Fl_Tooltip::enable(tooltips); // contest settings for state qso parties adjust_for_contest(0); UI_select(); set_log_colors(); clear_log_fields(); clearQSO(); } void configuration::saveDefaults() { ENSURE_THREAD(FLMAIN_TID); memcpy(&cfgpal0, &palette[0], sizeof(cfgpal0)); memcpy(&cfgpal1, &palette[1], sizeof(cfgpal1)); memcpy(&cfgpal2, &palette[2], sizeof(cfgpal2)); memcpy(&cfgpal3, &palette[3], sizeof(cfgpal3)); memcpy(&cfgpal4, &palette[4], sizeof(cfgpal4)); memcpy(&cfgpal5, &palette[5], sizeof(cfgpal5)); memcpy(&cfgpal6, &palette[6], sizeof(cfgpal6)); memcpy(&cfgpal7, &palette[7], sizeof(cfgpal7)); memcpy(&cfgpal8, &palette[8], sizeof(cfgpal8)); RxFontName = Fl::get_font_name(RxFontnbr); TxFontName = Fl::get_font_name(TxFontnbr); WaterfallFontName = Fl::get_font_name(WaterfallFontnbr); ViewerFontName = Fl::get_font_name(ViewerFontnbr); FreqControlFontName = Fl::get_font_name(FreqControlFontnbr); MacroEditFontName = Fl::get_font_name(MacroEditFontnbr); MacroBtnFontName = Fl::get_font_name(MacroBtnFontnbr); DXC_textname = Fl::get_font_name(DXC_textfont); DXfontname = Fl::get_font_name(DXfontnbr); LOGGINGfontname = Fl::get_font_name(LOGGINGtextfont); LOGBOOKtextname = Fl::get_font_name(LOGBOOKtextfont); #if ENABLE_NLS && defined(__WOE32__) set_ui_lang(listbox_language->index()); #endif writeDefaultsXML(); changed = false; } #if USE_HAMLIB static int fill_hamlib_menu(const char* rigname) { cboHamlibRig->add(rigname); return 1; } #endif int configuration::setDefaults() { ENSURE_THREAD(FLMAIN_TID); #if USE_HAMLIB hamlib_get_rigs(); hamlib_get_rig_str(fill_hamlib_menu); if (HamRigModel == 0 && !HamRigName.empty()) { // compatibility with < 3.04 HamRigModel = hamlib_get_rig_model_compat(HamRigName.c_str()); LOG_VERBOSE("Found rig model %d for \"%s\"", HamRigModel, HamRigName.c_str()); } #endif inpMyCallsign->value(myCall.c_str()); inpMyName->value(myName.c_str()); inpMyQth->value(myQth.c_str()); inpMyLocator->value(myLocator.c_str()); inpMyAntenna->value(myAntenna.c_str()); UseLeadingZeros = btnUseLeadingZeros->value(); ContestStart = (int)nbrContestStart->value(); ContestDigits = (int)nbrContestDigits->value(); txtSecondary->value(secText.c_str()); txtTHORSecondary->value(THORsecText.c_str()); valTHOR_BW->value(THOR_BW); valTHOR_FILTER->value(THOR_FILTER); valTHOR_PATHS->value(THOR_PATHS); valThorCWI->value(ThorCWI); valTHOR_PREAMBLE->value(THOR_PREAMBLE); valTHOR_SOFTSYMBOLS->value(THOR_SOFTSYMBOLS); valTHOR_SOFTBITS->value(THOR_SOFTBITS); valDominoEX_BW->value(DOMINOEX_BW); valDominoEX_FILTER->value(DOMINOEX_FILTER); chkDominoEX_FEC->value(DOMINOEX_FEC); valDominoEX_PATHS->value(DOMINOEX_PATHS); valDomCWI->value(DomCWI); btnRigCatCMDptt->value(RigCatCMDptt); btnTTYptt->value(TTYptt); btnUsePPortPTT->value(progdefaults.UsePPortPTT); btnUseUHrouterPTT->value(progdefaults.UseUHrouterPTT); btn_use_cmedia_PTT->value(progdefaults.cmedia_ptt); #if USE_HAMLIB listbox_sideband->add(_("Rig mode")); listbox_sideband->add(_("Always LSB")); listbox_sideband->add(_("Always USB")); listbox_sideband->index(HamlibSideband); btnHamlibCMDptt->value(HamlibCMDptt); inpRIGdev->show(); listbox_baudrate->show(); cboHamlibRig->show(); cboHamlibRig->value(HamRigName.c_str()); #else tab_tree->remove(tab_tree->find_item(_("Rig Control/Hamlib"))); #endif btnRTSptt->value(RTSptt); btnDTRptt->value(DTRptt); btnRTSplusV->value(RTSplus); btnDTRplusV->value(DTRplus); inpTTYdev->value(PTTdev.c_str()); chkUSEHAMLIB->value(0); chkUSERIGCAT->value(0); if (chkUSEHAMLIBis) chkUSEHAMLIB->value(1); if (chkUSERIGCATis) chkUSERIGCAT->value(1); if (!XmlRigFilename.empty()) readRigXML(); inpRIGdev->value(HamRigDevice.c_str()); listbox_baudrate->index(HamRigBaudrate); inpXmlRigDevice->value(XmlRigDevice.c_str()); listbox_xml_rig_baudrate->index(XmlRigBaudrate); select_nanoIO_CommPort->value(nanoIO_serial_port_name.c_str()); select_nanoCW_CommPort->value(nanoIO_serial_port_name.c_str()); select_CW_KEYLINE_CommPort->value(CW_KEYLINE_serial_port_name.c_str()); select_FSK_CommPort->value(fsk_port.c_str()); select_USN_FSK_port->value(Nav_FSK_port.c_str()); select_Nav_config_port->value(Nav_config_port.c_str()); valCWsweetspot->value(CWsweetspot); valRTTYsweetspot->value(RTTYsweetspot); valPSKsweetspot->value(PSKsweetspot); btnWaterfallHistoryDefault->value(WaterfallHistoryDefault); btnWaterfallQSY->value(WaterfallQSY); inpWaterfallClickText->input_type(FL_MULTILINE_INPUT); inpWaterfallClickText->value(WaterfallClickText.c_str()); if (!WaterfallClickInsert) inpWaterfallClickText->deactivate(); for (size_t i = 0; i < sizeof(waterfall::wf_wheel_action)/sizeof(*waterfall::wf_wheel_action); i++) listboxWaterfallWheelAction->add(waterfall::wf_wheel_action[i]); listboxWaterfallWheelAction->index(WaterfallWheelAction); btnStartAtSweetSpot->value(StartAtSweetSpot); btnPSKmailSweetSpot->value(PSKmailSweetSpot); cntSearchRange->value(SearchRange); cntServerOffset->value(ServerOffset); cntACQsn->value(ACQsn); btnCursorBWcolor->color( fl_rgb_color(cursorLineRGBI.R, cursorLineRGBI.G, cursorLineRGBI.B) ); btnCursorCenterLineColor->color( fl_rgb_color(cursorCenterRGBI.R, cursorCenterRGBI.G, cursorCenterRGBI.B) ); btnBwTracksColor->color( fl_rgb_color(bwTrackRGBI.R, bwTrackRGBI.G, bwTrackRGBI.B) ); sldrCWxmtWPM->value(CWspeed); cntCWdefWPM->value(defCWspeed); sldrCWbandwidth->value(CWbandwidth); btnCWrcvTrack->value(CWtrack); cntCWrange->value(CWrange); cntCWlowerlimit->value(CWlowerlimit); cntCWupperlimit->value(CWupperlimit); cntCWlowerlimit->maximum(CWupperlimit - 20); cntCWupperlimit->minimum(CWlowerlimit + 20); cntCWrisetime->value(CWrisetime); cntCWdash2dot->value(CWdash2dot); i_listboxQSKshape->index(QSKshape); sldrCWxmtWPM->minimum(CWlowerlimit); sldrCWxmtWPM->maximum(CWupperlimit); btnQSK->value(QSK); cntPreTiming->value(CWpre); cntPostTiming->value(CWpost); btnCWID->value(CWid); listboxHellFont->index(feldfontnbr); btnFeldHellIdle->value(HellXmtIdle); btnTxRSID->value(TransmitRSid); btnRSID->value(rsid); chkRSidWideSearch->value(rsidWideSearch); chkSlowCpu->value(slowcpu); Fl_Button* qrzb = btnQRZXMLnotavailable; Fl_Button* qrzb2 = btnQRZWEBnotavailable; switch (QRZXML) { case QRZCD: qrzb = btnQRZcdrom; break; case QRZNET: qrzb = btnQRZsub; break; case HAMCALLNET: qrzb = btnHamcall; break; case CALLOOK: qrzb = btnCALLOOK; break; case HAMQTH: qrzb = btnHamQTH; break; case QRZXMLNONE: default : break; } switch (QRZWEB) { case QRZHTML: qrzb2 = btnQRZonline; break; case HAMCALLHTML: qrzb2 = btnHAMCALLonline; break; case HAMQTHHTML: qrzb2 = btnHamQTHonline; break; case QRZWEBNONE: default : break; } set_qrzxml_buttons(qrzb); set_qrzweb_buttons(qrzb2); txtQRZpathname->value(QRZpathname.c_str()); btnsendid->value(sendid); btnsendvideotext->value(sendtextid); chkID_SMALL->value(ID_SMALL); wf->setPrefilter(wfPreFilter); btnWFaveraging->value(WFaveraging); memcpy(&palette[0], &cfgpal0, sizeof(palette[0])); memcpy(&palette[1], &cfgpal1, sizeof(palette[1])); memcpy(&palette[2], &cfgpal2, sizeof(palette[2])); memcpy(&palette[3], &cfgpal3, sizeof(palette[3])); memcpy(&palette[4], &cfgpal4, sizeof(palette[4])); memcpy(&palette[5], &cfgpal5, sizeof(palette[5])); memcpy(&palette[6], &cfgpal6, sizeof(palette[6])); memcpy(&palette[7], &cfgpal7, sizeof(palette[7])); memcpy(&palette[8], &cfgpal8, sizeof(palette[8])); wf->setcolors(); setColorButtons(); #if !HAVE_UHROUTER btnUseUHrouterPTT->hide(); #endif #if !HAVE_PARPORT btnUsePPortPTT->hide(); #endif #if ENABLE_NLS && defined(__WOE32__) std::ostringstream ss; for (lang_def_t* p = ui_langs; p->lang; p++) { ss.str(""); ss << p->native_name; listbox_language->add(ss.str().c_str()); } listbox_language->index(get_ui_lang()); listbox_language->show(); #else listbox_language->hide(); #endif return 1; } void configuration::resetDefaults(void) { if (!fl_choice2(_("\ Reset all options to their default values?\n\n\ Reset options will take effect at the next start\n\ Files: fldigi_def.xml and fldigi.prefs will be deleted!\n"), _("OK"), _("Cancel"), NULL) && Fl::event_key() != FL_Escape) { if (!fl_choice2(_("Confirm RESET"), _("Yes"), _("No"), NULL) && Fl::event_key() != FL_Escape) { reset(); atexit(reset); } } } void configuration::reset(void) { remove(std::string(HomeDir).append("fldigi_def.xml").c_str()); remove(std::string(HomeDir).append("fldigi.prefs").c_str()); } #include "rigio.h" void configuration::initInterface() { ENSURE_THREAD(FLMAIN_TID); // close down any possible rig interface threads LOG_INFO("Closing rig interface threads"); #if USE_HAMLIB hamlib_close(); // MilliSleep(100); #endif rigCAT_close(); // MilliSleep(100); RigCatCMDptt = btnRigCatCMDptt->value(); TTYptt = btnTTYptt->value(); RTSptt = btnRTSptt->value(); DTRptt = btnDTRptt->value(); RTSplus = btnRTSplusV->value(); DTRplus = btnDTRplusV->value(); PTTdev = inpTTYdev->value(); #if USE_HAMLIB chkUSEHAMLIBis = chkUSEHAMLIB->value(); HamlibCMDptt = btnHamlibCMDptt->value(); #endif chkUSERIGCATis = chkUSERIGCAT->value(); #if USE_HAMLIB if (*cboHamlibRig->value() == '\0') // no selection at start up cboHamlibRig->index(hamlib_get_index(HamRigModel)); else HamRigModel = hamlib_get_rig_model(cboHamlibRig->index()); HamRigDevice = inpRIGdev->value(); HamRigBaudrate = listbox_baudrate->index(); #else cboHamlibRig->hide(); inpRIGdev->hide(); listbox_baudrate->hide(); #endif if (connected_to_flrig) { LOG_INFO("%s", "using flrig xcvr control"); wf->setQSY(1); } else if (chkUSERIGCATis) { // start the rigCAT thread if (rigCAT_init()) { LOG_INFO("%s", "using rigCAT xcvr control"); wf->USB(true); wf->setQSY(1); rigCAT_get_pwrlevel(); } else { LOG_INFO("%s", "defaulting to no xcvr control"); noCAT_init(); wf->USB(true); wf->setQSY(0); chkUSERIGCATis = false; } #if USE_HAMLIB } else if (chkUSEHAMLIBis) { // start the hamlib thread if (hamlib_init(HamlibCMDptt)) { LOG_INFO("%s", "using HAMLIB xcvr control"); btnInitHAMLIB->deactivate(); wf->USB(true); wf->setQSY(1); } else { LOG_INFO("%s", "defaulting to no xcvr control"); noCAT_init(); wf->USB(true); wf->setQSY(0); } #endif } else { LOG_INFO("%s", "No xcvr control selected"); noCAT_init(); wf->USB(true); wf->setQSY(0); } build_frequencies2_list(); if (HamlibCMDptt && chkUSEHAMLIBis) push2talk->reset(PTT::PTT_HAMLIB); else if ((RigCatCMDptt || RigCatRTSptt || RigCatDTRptt) && chkUSERIGCATis) push2talk->reset(PTT::PTT_RIGCAT); else if (TTYptt) push2talk->reset(PTT::PTT_TTY); else if (UsePPortPTT) push2talk->reset(PTT::PTT_PARPORT); else if (UseUHrouterPTT) push2talk->reset(PTT::PTT_UHROUTER); else if (cmedia_ptt) push2talk->reset(PTT::PTT_CMEDIA); else if (gpio_ptt) push2talk->reset(PTT::PTT_GPIO); else push2talk->reset(PTT::PTT_NONE); wf->setRefLevel(); wf->setAmpSpan(); cntLowFreqCutoff->value(LowFreqCutoff); } const char* configuration::strBaudRate() { return (szBaudRates[HamRigBaudrate + 1]); } int configuration::nBaudRate(const char *szBR) { for (size_t i = 1; i < sizeof(szBaudRates); i++) if (strcmp(szBaudRates[i], szBR) == 0) return i - 1; return 0; } int configuration::BaudRate(size_t n) { if (n > sizeof(szBaudRates) + 1) return 1200; return (atoi(szBaudRates[n + 1])); } #ifdef __WOE32__ static bool open_serial(const char* dev) { bool ret = false; #ifdef __CYGWIN__ int fd = fl_open(dev, O_RDWR | O_NOCTTY | O_NDELAY | O_CLOEXEC); if (fd != -1) { close(fd); ret = true; } #elif defined(__MINGW32__) HANDLE fd = CreateFile(dev, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (fd != INVALID_HANDLE_VALUE) { CloseHandle(fd); ret = true; } #endif return ret; } #endif // __WOE32__ void configuration::testCommPorts() { inpTTYdev->clear(); inpRIGdev->clear(); inpXmlRigDevice->clear(); #ifndef PATH_MAX # define PATH_MAX 1024 #endif #ifndef __WOE32__ struct stat st; #endif #ifndef __APPLE__ char ttyname[PATH_MAX + 1]; #endif const char* tty_fmt[] = { #if defined(__linux__) "/dev/ttyS%u", "/dev/ttyUSB%u", "/dev/usb/ttyUSB%u", "/dev/ttyACM%u", "/dev/usb/ttyACM%u", "/dev/rfcomm%u", "/opt/vttyS%u" #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) "/dev/tty%2.2u" #elif defined(__CYGWIN__) "/dev/ttyS%u" #elif defined(__MINGW32__) "//./COM%u" #elif defined(__APPLE__) "/dev/cu.*", "/dev/tty.*" #endif }; #if defined(__WOE32__) # define TTY_MAX 255 #elif defined(__OpenBSD__) || defined(__NetBSD__) # define TTY_MAX 4 #else # define TTY_MAX 8 #endif #ifdef __linux__ glob_t gbuf; glob("/dev/serial/by-id/*", 0, NULL, &gbuf); for (size_t j = 0; j < gbuf.gl_pathc; j++) { if ( !(stat(gbuf.gl_pathv[j], &st) == 0 && S_ISCHR(st.st_mode)) || strstr(gbuf.gl_pathv[j], "modem") ) continue; LOG_INFO("Found serial port %s", gbuf.gl_pathv[j]); inpTTYdev->add(gbuf.gl_pathv[j]); # if USE_HAMLIB inpRIGdev->add(gbuf.gl_pathv[j]); # endif inpXmlRigDevice->add(gbuf.gl_pathv[j]); select_nanoIO_CommPort->add(gbuf.gl_pathv[j]); select_nanoCW_CommPort->add(gbuf.gl_pathv[j]); select_CW_KEYLINE_CommPort->add(gbuf.gl_pathv[j]); select_FSK_CommPort->add(gbuf.gl_pathv[j]); select_USN_FSK_port->add(gbuf.gl_pathv[j]); select_Nav_config_port->add(gbuf.gl_pathv[j]); select_WK_CommPort->add(gbuf.gl_pathv[j]); select_WKFSK_CommPort->add(gbuf.gl_pathv[j]); } globfree(&gbuf); #endif for (size_t i = 0; i < sizeof(tty_fmt)/sizeof(*tty_fmt); i++) { #ifndef __APPLE__ for (unsigned j = 0; j < TTY_MAX; j++) { snprintf(ttyname, sizeof(ttyname), tty_fmt[i], j); # ifndef __WOE32__ if ( !(stat(ttyname, &st) == 0 && S_ISCHR(st.st_mode)) ) continue; # else // __WOE32__ LOG_DEBUG("Testing serial port %s", ttyname); if (!open_serial(ttyname)) continue; # ifdef __CYGWIN__ snprintf(ttyname, sizeof(ttyname), "COM%u", j+1); # else snprintf(ttyname, sizeof(ttyname), "COM%u", j); # endif # endif // __WOE32__ LOG_VERBOSE("Found serial port %s", ttyname); inpTTYdev->add(ttyname); # if USE_HAMLIB inpRIGdev->add(ttyname); # endif inpXmlRigDevice->add(ttyname); select_nanoIO_CommPort->add(ttyname); select_nanoCW_CommPort->add(ttyname); select_CW_KEYLINE_CommPort->add(ttyname); select_FSK_CommPort->add(ttyname); select_USN_FSK_port->add(ttyname); select_Nav_config_port->add(ttyname); select_WK_CommPort->add(ttyname); select_WKFSK_CommPort->add(ttyname); } #else // __APPLE__ glob_t gbuf; glob(tty_fmt[i], 0, NULL, &gbuf); for (size_t j = 0; j < gbuf.gl_pathc; j++) { int ret1 = !stat(gbuf.gl_pathv[j], &st); int ret2 = S_ISCHR(st.st_mode); if (ret1) { LOG_INFO("Serial port %s", gbuf.gl_pathv[j]); LOG_INFO(" device mode: %X", st.st_mode); LOG_INFO(" char device? %s", ret2 ? "Y" : "N"); } else LOG_INFO("%s does not return stat query", gbuf.gl_pathv[j]); if ( (ret1 && ret2 ) || strstr(gbuf.gl_pathv[j], "modem") ) inpTTYdev->add(gbuf.gl_pathv[j]); else continue; # if USE_HAMLIB inpRIGdev->add(gbuf.gl_pathv[j]); # endif inpXmlRigDevice->add(gbuf.gl_pathv[j]); select_nanoIO_CommPort->add(gbuf.gl_pathv[j]); select_nanoCW_CommPort->add(gbuf.gl_pathv[j]); select_CW_KEYLINE_CommPort->add(gbuf.gl_pathv[j]); select_FSK_CommPort->add(gbuf.gl_pathv[j]); select_USN_FSK_port->add(gbuf.gl_pathv[j]); select_Nav_config_port->add(gbuf.gl_pathv[j]); select_WK_CommPort->add(gbuf.gl_pathv[j]); select_WKFSK_CommPort->add(gbuf.gl_pathv[j]); } globfree(&gbuf); #endif // __APPLE__ } #if HAVE_UHROUTER if (stat(UHROUTER_FIFO_PREFIX "Read", &st) != -1 && S_ISFIFO(st.st_mode) && stat(UHROUTER_FIFO_PREFIX "Write", &st) != -1 && S_ISFIFO(st.st_mode)) inpTTYdev->add(UHROUTER_FIFO_PREFIX); #endif // HAVE_UHROUTER } Fl_Font font_number(const char* name) { int n = (int)Fl::set_fonts(0); for (int i = 0; i < n; i++) { if (strcmp(Fl::get_font_name((Fl_Font)i), name) == 0) return (Fl_Font)i; } return FL_HELVETICA; } void configuration::initFonts(void) { RxFontnbr = TxFontnbr = WaterfallFontnbr = ViewerFontnbr = FreqControlFontnbr = MacroBtnFontnbr = MacroEditFontnbr = DXC_textfont = DXfontnbr = LOGGINGtextfont = LOGBOOKtextfont = FL_HELVETICA; if (!RxFontName.empty()) RxFontnbr = font_number(RxFontName.c_str()); if (!TxFontName.empty()) TxFontnbr = font_number(TxFontName.c_str()); if (!WaterfallFontName.empty()) WaterfallFontnbr = font_number(WaterfallFontName.c_str()); if (!ViewerFontName.empty()) ViewerFontnbr = font_number(ViewerFontName.c_str()); if (!FreqControlFontName.empty()) FreqControlFontnbr = font_number(FreqControlFontName.c_str()); if (!MacroEditFontName.empty()) MacroEditFontnbr = font_number(MacroEditFontName.c_str()); if (!MacroBtnFontName.empty()) MacroBtnFontnbr = font_number(MacroBtnFontName.c_str()); if (!DXC_textname.empty()) DXC_textfont = font_number(DXC_textname.c_str()); if (!DXfontname.empty()) DXfontnbr = font_number(DXfontname.c_str()); if (!LOGGINGfontname.empty()) LOGGINGtextfont = font_number(LOGGINGfontname.c_str()); if (!LOGBOOKtextname.empty()) LOGBOOKtextfont = font_number(LOGBOOKtextname.c_str()); } fldigi-4.2.05/src/misc/pixmaps_tango.cxx0000664000175000017500000032652114532252172015116 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include // This file contains pixmap versions of icons from the Tango Icon Library // (version 0.8.90) at http://tango.freedesktop.org/Tango_Icon_Library // which was released into the Public Domain. This file was prepared by // Kamal Mostafa , and is likewise released into the // Public Domain. // These #define's map the (new) Tango icon names (named after their source // files) to the pixmap identifier names used throughout the fldigi source: #define tango_x_office_address_book address_book_icon #define tango_applications_system applications_system_icon #define tango_internet_group_chat chat_icon #define tango_dialog_information dialog_information_icon #define tango_edit_clear edit_clear_icon #define tango_edit_copy edit_copy_icon #define tango_edit_cut edit_cut_icon #define tango_edit_paste edit_paste_icon #define tango_edit_select_all edit_select_all_icon #define tango_edit_undo edit_undo_icon #define tango_emblem_system emblems_system_icon #define tango_application_x_executable executable_icon #define tango_document_open file_open_icon #define tango_folder_open folder_open_icon #define tango_help_browser help_browser_icon #define tango_image_x_generic image_icon #define tango_go_previous left_arrow_icon #define tango_system_log_out log_out_icon #define tango_list_remove minus_icon #define tango_multimedia_player multimedia_player_icon #define tango_internet_web_browser net_icon #define tango_list_add plus_icon #define tango_preferences_desktop_font preferences_desktop_font_icon #define tango_process_stop process_stop_icon #define tango_view_refresh refresh_icon #define tango_go_next right_arrow_icon #define tango_document_save_as save_as_icon #define tango_document_save save_icon #define tango_system_shutdown shutdown_icon #define tango_start_here start_here_icon #define tango_system_software_update system_software_update_icon #define tango_system_users system_users_icon #define tango_accessories_text_editor text_editor_icon #define tango_text_x_generic text_icon #define tango_x_office_calendar time_icon #define tango_user_trash trash_icon #define tango_utilities_system_monitor utilities_system_monitor_icon #define tango_utilities_terminal utilities_terminal_icon #define tango_weather_clear weather_clear_icon #define tango48_dialog_information dialog_information_48_icon #define tango48_dialog_warning dialog_warning_48_icon // --------------------------------------------------------------------- // Tango icons // --------------------------------------------------------------------- /* mimetypes/x-office-address-book.png */ /* XPM */ const char *tango_x_office_address_book[] = { /* width height ncolors chars_per_pixel */ "16 16 125 2", /* colors */ " c #000000", " . c #C0D2E4", " X c #ACC3DA", " o c #A78AB1", " O c #9DB029", " + c #C3CFE0", " @ c #9AA5C5", " # c #D8E4F1", " $ c #A7BFD8", " % c #D7E4F0", " & c #99A7C7", " * c #A9B8D0", " = c #D2DEEB", " - c #ABB0BE", " ; c #A887AE", " : c #9CA2C3", " > c #AC80A8", " , c #CBD8E7", " < c #A789B0", " 1 c #617296", " 2 c #AB82AA", " 3 c #C3D0E2", " 4 c #AA84AC", " 5 c #B7CBE0", " 6 c #A9B3CF", " 7 c #8290AC", " 8 c #7E8CA8", " 9 c #ACB1BE", " 0 c #95B1CF", " q c #CEDBE9", " w c #99A580", " e c #7E8CAB", " r c #AAACC9", " t c #B5B5B6", " y c #A491B6", " u c #7B8AA8", " i c #7A88A7", " p c #9BA3C4", " a c #727E0A", " s c #DEDEDE", " d c #AB92B6", " f c #8F9FB8", " g c #96AECC", " h c #B1C0D6", " j c #AA83AB", " k c #A2AB7B", " l c #FCE94F", " z c #808DA9", " x c #C7D7E8", " c c #8F9E86", " v c #95B0CE", " b c #CC0000", " n c #A5BDD7", " m c #A8B8D0", " M c #D1DEEB", " N c #D0DCEA", " B c #CFDCE9", " V c #CEDAE8", " C c #A8AEBC", " Z c #A889AF", " A c #AC80A9", " S c #9BA2C3", " D c #CFDCEC", " F c #9DB7D2", " G c #6F6384", " H c #5A7AA4", " J c #A78BB1", " K c #67837F", " L c #9AA4C5", " P c #AFBAC9", " I c #B9CBE0", " U c #B4B9C4", " Y c #9E9DBF", " T c #BCC8D9", " R c #828EAA", " E c #95AFCD", " W c #9FABC3", " Q c #D7E3F0", " ! c #D3DFEC", " ~ c #A9B9D0", " ^ c #9D9FC1", " / c #B4C9DE", " ( c #AFB5C2", " ) c #ABB1BE", " _ c #EDD400", " ` c #C1C1C3", " ' c #9CA1C3", " ] c #698373", " [ c #A7ADBD", " { c #A9C1D9", " } c #A8BFD8", " | c #A9ACB8", ". c #AA85AC", ".. c #9D9EC0", ".X c #B7CAE0", ".o c #818FAB", ".O c #808DAA", ".+ c #AC8BB1", ".@ c #A987AE", ".# c #8B96AE", ".$ c #CFDCEA", ".% c #6C7CA0", ".& c #785977", ".* c #A889B0", ".= c #AC82AA", ".- c #DDDDDD", ".; c #CCDAEA", ".: c #9AA6C6", ".> c #BACDE2", "., c #B8CBE0", ".< c #9E9DC0", ".1 c #8390AC", ".2 c #EF2929", ".3 c #C6D6E7", ".4 c #95AFCE", ".5 c #A58DB3", ".6 c #A986AD", ".7 c #BFCCE0", ".8 c #A9B9D1", ".9 c #CFDBE9", ".0 c #B9B9B9", ".q c #CEDBE8", ".w c #B7B7B7", ".e c #CBD7E5", ".r c None", /* pixels */ ".r H H H H H H H H H H H H H.r.r", " H.% =.3.> / n n $ $ } } F c _.r", " H T N 3 D { L < A. .< 0 X c l _", " H +.$ h.; 6 4 p.4 & ; S X w l _", " H.e B m.; d ^ Y 2 j & o X k l _", " H M.9 m.;.= g 4...6 E A X ] O a", " H Q q *.; A E A '.@ : Z X ] O a", " H #.q ~.;.+ L y.*.5 4.: X K O a", " H #.q.8.; r ; & v 0 0 0 X G.2 b", " H % V.7.; { @ J >.6 0 0 X G.2 b", " H Q ! D x ..X 5 5.,.,., I G.2 b", " H , e R z 8 i u.o 7.1.O 1.& b.r", " H W t.w.w.w.w.w.w.w.0 P H H.r.r", " H f `.-.-.-.-.- s s s U H H.r.r", " H H.# [ ( - - ) ) 9 9 C | H.r.r", ".r H H H H H H H H H H H H H.r.r" }; /* categories/applications-system.png */ /* XPM */ const char *tango_applications_system[] = { /* width height ncolors chars_per_pixel */ "16 16 19 1", /* colors */ " c #000000", ". c #7CA1CF", "X c #497CBA", "o c #3F638F", "O c #6490C7", "+ c #467ABA", "@ c #395578", "# c #436FA5", "$ c #BCCDE3", "% c #5682B7", "& c #86A7D2", "* c #82A5D1", "= c #4C7FBD", "- c #426B9C", "; c #5686C3", ": c #9DB8DA", "> c #457ABE", ", c #8FAED5", "< c None", /* pixels */ "<<<<<<<<<<<<<<<<", "<<<<<<>>><<<<<<<", "<<<>><>$><>><<<<", "<<>$&>O:O>&$><<<", "<<>&:::::::&><<<", "<<<>:.+;+*:><<<<", "<>>O:+-><<", "<>$::;<<<;::$><<", "<>>O:=%<#+:O>><<", "<<<>$.=;+,:><<<<", "<<>&:::::::&><<<", "<<>$&>O:O>&$><<<", "<<<>><>$><>><<<<", "<<<<<<>>><<<<<<<", "<<<<<<<<<<<<<<<<", "<<<<<<<<<<<<<<<<" }; /* apps/internet-group-chat.png */ /* XPM */ const char *tango_internet_group_chat[] = { /* width height ncolors chars_per_pixel */ "16 16 23 1", /* colors */ " c #000000", ". c #9D9D9D", "X c #F2F2F2", "o c #F0F0F0", "O c #EEEEEE", "+ c #ECECEC", "@ c #EAEAEA", "# c #2D2D2D", "$ c #767774", "% c #888A85", "& c #858682", "* c #797A76", "= c #C6C6C4", "- c #FFFFFF", "; c #F1F1F1", ": c #EFEFEF", "> c #EDEDED", ", c #EBEBEB", "< c #E9E9E9", "1 c #343434", "2 c #2A2A2A", "3 c #868884", "4 c None", /* pixels */ "4444%%%%%%%%%%%4", "444%-----------%", "444%-,@<<<<<<<-%", "4%%%%%%%%%%%=<-%", "%-----------%<-%", "%-<<<<<<<@,-%@-%", "%-<<<<<@,++-%,-%", "%-<<<<@,+>O-%--%", "%-<<@,+>O::-%-%4", "%-@,++>O:o;-%-%4", "%-,+>O::o;X-%%%4", "%--O:-------%4%4", "4%-:-%%%%%%%.444", "4%--%44444444444", "4%%%444444444444", "4%44444444444444" }; /* status/dialog-information.png */ /* XPM */ const char *tango_dialog_information[] = { /* width height ncolors chars_per_pixel */ "16 16 127 2", /* colors */ " c #000000", " . c #394B7A", " X c #E8EFF4", " o c #4A577A", " O c #CBD9E8", " + c #40507A", " @ c #E3E6BA", " # c #F5F8FA", " $ c #80805C", " % c #C8D7E8", " & c #C5D5E5", " * c #3B4C78", " = c #3A4A77", " - c #D4E0ED", " ; c #C1CCD7", " : c #E0E9F2", " > c #546083", " , c #394A79", " < c #EBF0F6", " 1 c #475780", " 2 c #EBEDC1", " 3 c #46557F", " 4 c #F7F9FB", " 5 c #C5D2E1", " 6 c #5988B9", " 7 c #3D4D76", " 8 c #D9E3EE", " 9 c #495985", " 0 c #595942", " q c #B5C7DB", " w c #586383", " e c #9BAEC8", " r c #A9C0D9", " t c #3C4D78", " y c #F3F7FA", " u c #3B4B77", " i c #5382B6", " p c #D3DFEB", " a c #EDEFF4", " s c #E2EAF3", " d c #393936", " f c #5E8DBA", " g c #F5F8CA", " h c #A5BED8", " j c #616471", " k c #384977", " l c #EEF3F8", " z c #D0DDEB", " x c #CEDBE9", " c c #4F5873", " v c #FAFCFD", " b c #779DC5", " n c #485883", " m c #E8EFF5", " M c #ABB198", " N c #B5C6DA", " B c #E2E7EF", " V c #AAC1D9", " C c #3E4E79", " Z c #E0E5ED", " A c #DDDFAB", " S c #435177", " D c #8C9BB8", " F c #C3D3E4", " G c #98A4BD", " H c #B5CAE0", " J c #D0D5E0", " K c #DFE7F2", " L c #DEE7F1", " P c #91AECD", " I c #384A79", " U c #41517B", " Y c #8A8B66", " T c #E0E6EC", " R c #5E5E3E", " E c #B9C4D6", " W c #5E6880", " Q c #8D9CB8", " ! c #3A4B77", " ~ c #EFF3F7", " ^ c #9AA5BE", " / c #FCFCFD", " ( c #A6AC98", " ) c #789DC4", " _ c #C1D2E4", " ` c #F3F6C9", " ' c #3A4B7A", " ] c #C0D0E3", " [ c #384978", " { c #87A8CC", " } c #ECF1F7", " | c #4B7EB2", ". c #45547E", ".. c #CCD9E8", ".X c #D3D5B0", ".o c #3D4C76", ".O c #D8E2ED", ".+ c #4A5A86", ".@ c #D4E0EC", ".# c #5281B5", ".$ c #7E90B2", ".% c #FFFFFF", ".& c #A7AD98", ".* c #608EBC", ".= c #C2D3E4", ".- c #464646", ".; c #4B5B83", ".: c #EBF0F5", ".> c #FAFBFD", "., c #A4ADC3", ".< c #303030", ".1 c #C9D6E7", ".2 c #C7D6E5", ".3 c #F4F7FA", ".4 c #C2D0E0", ".5 c #D6E1ED", ".6 c #9DB9D6", ".7 c #7E91B1", ".8 c #B7C2D5", ".9 c #59627C", ".0 c #A6BED8", ".q c #A8AA84", ".w c #D2DAE2", ".e c #DFE8F2", ".r c #5C89BA", ".t c #5B89B9", ".y c None", /* pixels */ ".y.y.y.y.y u = [ I !.o.y.y.y.y.y", ".y.y.y.y *., a / 4 B ^ C.y.y.y.y", ".y.y.y t J # X s 8 p.O E U.y.y.y", ".y.y 7., # ~.3 <.e -.= & Q S.y.y", ".y.y + a m y v } K z _ ) 5 3.y.y", ".y.y ,.> : l.%.%.%.% ;.y x ..y.y", ".y.y '.3.5 L.%.: T.w P.y.1 ..y.y", ".y.y. Z O %.% ] H.6.y.* q n.y.y", ".y.y o G.@.0.% h {.y | V.7 >.y.y", ".y.y.y 1.8 F b.%.y f r e 9.y.y.y", ".y.y.y.y 1 D.4...2 N.$.+.y.y.y.y", ".y.y.y.y.y w.; (.& M W.y.y.y.y.y", ".y.y.y.y.y.y R 2 g A R.y.y.y.y.y", ".y.y.y.y.y.y R $.q Y R.y.y.y.y.y", ".y.y.y.y.y.y R @ `.X R.y.y.y.y.y", ".y.y.y.y.y.y.y d.-.<.y.y.y.y.y.y" }; /* actions/edit-clear.png */ /* XPM */ const char *tango_edit_clear[] = { /* width height ncolors chars_per_pixel */ "16 16 113 2", /* colors */ " c #E7D75B", " . c #EED723", " X c #AB1B0D", " o c #C86D33", " O c #BBA529", " + c #FDEC6D", " @ c #C5B536", " # c #DCC407", " $ c #EDDA46", " % c #A08E01", " & c #9F8E00", " * c #CDBD41", " = c #E8DA6C", " - c #D7B162", " ; c #E6D656", " : c #E1D35B", " > c #CCBD43", " , c #FDE952", " < c #E7D018", " 1 c #9C8800", " 2 c #C6B633", " 3 c #C5B432", " 4 c #BC7A0F", " 5 c #FDEA5F", " 6 c #CFC149", " 7 c #A29009", " 8 c #A19008", " 9 c #FDEB6C", " 0 c #D2C34F", " q c #DCC610", " w c #AE9E1B", " e c #F8EA88", " r c #AB6D0B", " t c #C17D10", " y c #F3E365", " u c #B2760B", " i c #9E8D01", " p c #E4D249", " a c #ECDC68", " s c #E7D96D", " d c #BB4A28", " f c #9F8F05", " g c #F6D861", " h c #9A8500", " j c #FDEC6B", " k c #FDEB61", " l c #EBDD77", " z c #804E01", " x c #DAC203", " c c #9F8E01", " v c #AB9B1A", " b c #E2D467", " n c #9F8E04", " m c #EADC72", " M c #A12400", " N c #B8381D", " B c #876400", " V c #FDEA63", " C c #DDCF5E", " Z c #FDEF84", " A c #A08F01", " S c #9F8D00", " D c #D8C84F", " F c #E3CB11", " G c #A96B0A", " H c #C6B530", " J c #BEAE32", " K c #FDEE7D", " L c #B2720C", " P c #9C8B00", " I c #9C7F00", " U c #A6690A", " Y c #FDEF8A", " T c #E5D44E", " R c #B06917", " E c #F3DB2A", " W c #DCC510", " Q c #FBED8B", " ! c #A18801", " ~ c #D6C856", " ^ c #7B4A00", " / c #FBEA84", " ( c #FFFFFF", " ) c #9D8C00", " _ c #FCE53C", " ` c #A03600", " ' c #E4D34C", " ] c #DCCD58", " [ c #DFCA26", " { c #784800", " } c #EBDE77", " | c #B1A01D", ". c #C0B02F", ".. c #DBC304", ".X c #F6DE2F", ".o c #AD4213", ".O c #E7D85F", ".+ c #A59411", ".@ c #FBE437", ".# c #7C4B00", ".$ c #9F8D01", ".% c #9E8D00", ".& c #E5CD14", ".* c #FBE544", ".= c #DCC615", ".- c #FDE63C", ".; c #865203", ".: c #845201", ".> c #A08F05", "., c #CDBE45", ".< c #794900", ".1 c #8A6900", ".2 c None", /* pixels */ ".2.# ^.2.2.2.2.2.2.2.2.2.2.2.2.2", " ^ U r ^.2.2.2.2.2.2.2.2.2.2.2.2", " ^ L t G ^.2 P.2.2.2.2.2.2.2.2.2", ".2.; 4 t.: h P.2.2.2.2.2.2.2.2.2", ".2 ^ z u ! J |.2.2.2.2.2.2.2.2.2", ".2.2 B 1 * } R ` A.2.2.2.2.2.2.2", ".2.2 i D a o X - m > 7 c.2.2.2.2", ".2.2.% O d N g V 9 K e., f &.2.2", ".2.2.2 M.o / j Z + ,.* y l 6 w )", ".2.2.2.2. Y 5 k ,.- E < q p b.$", ".2.2.2.2.+ Q _.@.X ..&.. x ; 2 &", ".2.2.2.2 % C $ < F # x x ' ] n.2", ".2.2.2.2.2 v = W x x.= ~.>.2.2", ".2.2.2.2.2 & @.O [ T s 3.%.2.2.2", ".2.2.2.2.2.2.% 0 : H 8 S.2.2.2.2", ".2.2.2.2.2.2.2 ).%.%.2.2.2.2.2.2" }; /* actions/edit-copy.png */ /* XPM */ const char *tango_edit_copy[] = { /* width height ncolors chars_per_pixel */ "16 16 44 1", /* colors */ " c #000000", ". c #E3E4E2", "X c #9A9B97", "o c #8D8F8A", "O c #898B86", "+ c #C8C8C7", "@ c #C6C6C5", "# c #C4C4C3", "$ c #8F908B", "% c #FEFEFE", "& c #FAFAFA", "* c #F4F4F4", "= c #F2F2F2", "- c #EEEEEE", "; c #ECECEC", ": c #EAEAEA", "> c #8E9189", ", c #D4D4D4", "< c #C3C4C3", "1 c #F7F7F6", "2 c #F3F3F2", "3 c #EFEFEE", "4 c #EDEDEC", "5 c #E3E3E2", "6 c #989A95", "7 c #8C8E89", "8 c #8A8C87", "9 c #888A85", "0 c #C7C7C6", "q c #FFFFFF", "w c #FBFBFB", "e c #F9F9F9", "r c #F3F3F3", "t c #EBEBEB", "y c #989A96", "u c #FEFEFD", "i c #FCFCFB", "p c #FAFAF9", "a c #F8F8F7", "s c #F6F6F5", "d c #F4F4F3", "f c #F0F0EF", "g c #EEEEED", "h c None", /* pixels */ "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhhhhhhhhhhhhh", "hhhhX9999999999o", "hhhh8qqqqqqqqqq9", "hhhhOqffffffffq9", "hhhh8qf000000fq9", "hhhhOqffffffffq9", "hhhh8qf00000ffq9", "hhhhOqfffffff&r9", "hhhh8qf00000-1<9", "hhhh8qfffff77779", "hhhhOuffff&6&a.9", "hhhhOpfff&&6&599", "hhhhO*1siw,y.9hh", "hhhh7O9999999hhh" }; /* actions/edit-cut.png */ /* XPM */ const char *tango_edit_cut[] = { /* width height ncolors chars_per_pixel */ "16 16 94 2", /* colors */ " c #000000", " . c #AA0909", " X c #A80707", " o c #959792", " O c #939590", " + c #91938E", " @ c #AB0D0D", " # c #90918D", " $ c #8F918C", " % c #A90B0B", " & c #8D8F8A", " * c #8B8D88", " = c #CB1F1F", " - c #9C2F2C", " ; c #B3B2AF", " : c #C01514", " > c #A80403", " , c #A70202", " < c #AB1313", " 1 c #AA0808", " 2 c #A80606", " 3 c #E1E1DF", " 4 c #AE1919", " 5 c #B70F0E", " 6 c #CE1E1E", " 7 c #A90A0A", " 8 c #D2D3D0", " 9 c #AA0E0E", " 0 c #DB2727", " q c #F5F6F5", " w c #AE1818", " e c #EFF0EF", " r c #D01F1F", " t c #CE1D1D", " y c #CD1D1C", " u c #898984", " i c #CCCEC9", " p c #C6C8C3", " a c #AA0D0D", " s c #B8BAB5", " d c #AB1111", " f c #B6B8B3", " g c #B5B6B2", " h c #F7F7F6", " j c #D42222", " k c #AAACA7", " l c #A60202", " z c #D22020", " x c #B80D0D", " c c #9FA09C", " v c #A70606", " b c #9A9C97", " n c #92948F", " m c #C91A1A", " M c #AA0C0C", " N c #8E908B", " B c #8C8E89", " V c #8A8C87", " C c #AB1010", " Z c #D62323", " A c #A80303", " S c #A60101", " D c #A90707", " F c #AF1A1A", " G c #A40502", " H c #AB1616", " J c #DBDCD9", " K c #CD1D1D", " L c #CA1B1A", " P c #AA0B0B", " I c #D2D4D0", " U c #CDCECB", " Y c #C5C6C3", " T c #C01513", " R c #B5B6B3", " E c #F7F7F7", " W c #AD1717", " Q c #D12020", " ! c #A34A45", " ~ c #B50B0B", " ^ c #A60606", " / c #A00A00", " ( c #C71A19", " ) c #BABBB7", " _ c #B3B5B0", " ` c #AEAFAB", " ' c #D52323", " ] c #D32121", " [ c #A8A9A5", " { c #D11F1F", " } c #AB1414", " | c #CF1D1D", ". c #E7E8E6", ".. c None", /* pixels */ "........ * O........ * $........", "...... N E *........ # 8 $......", "...... * I e n...... k p &......", "...... & _ h *.... N i ` *......", "........ * J e + B f U *........", "........ & g E * c R s *........", ".......... * 3 q b [ *..........", ".......... & ). k N V..........", "............ u Y ; -............", "........ w H ^ ! l ( W w........", "...... D z 6 5 G > m Q = 7......", ".... 2 r A : S.... y T A K v....", ".. } '.... t 7.... A L.... Q }..", ".. @ |.. ~ ] M.... . Z x.. { d..", ".. < 0 r t X........ 1 j | t <..", ".... 9 C H............ a P %...." }; /* actions/edit-paste.png */ /* XPM */ const char *tango_edit_paste[] = { /* width height ncolors chars_per_pixel */ "16 16 79 1", /* colors */ " c #000000", ". c #6A6C68", "X c #666864", "o c #C68827", "O c #6E4602", "+ c #6D4401", "@ c #C08424", "# c #7F7F7C", "$ c #EFEFED", "% c #EDEDEB", "& c #EBEBE9", "* c #E9E9E7", "= c #E7E7E5", "- c #676964", "; c #DBDBD9", ": c #B2B4B4", "> c #6E6C64", ", c #CCCDCA", "< c #6B4301", "1 c #FEFEFE", "2 c #F2F2F2", "3 c #EDEEED", "4 c #BA7F23", "5 c #D8D8D5", "6 c #E0E0E0", "7 c #A77D3B", "8 c #5C5C5B", "9 c #6C4401", "0 c #C1C2BE", "q c #B9BAB6", "w c #6B4403", "e c #B37B22", "r c #EFEFEE", "t c #EDEDEC", "y c #EBEBEA", "u c #C58726", "i c #97978A", "p c #6E4502", "a c #80807D", "s c #7E7E7B", "d c #ECECEA", "f c #EAEAE8", "g c #716F64", "h c #E8E8E6", "j c #706D63", "k c #DADAD8", "l c #6F4602", "z c #B97F23", "x c #B3B5B5", "c c #6E6D64", "v c #CDCECB", "b c #A17C40", "n c #5E5E5E", "m c #5C5C5C", "M c #6A4200", "N c #C28628", "B c #FFFFFF", "V c #E7E7E4", "C c #F1F1F1", "Z c #D9D9D6", "A c #B1B2B2", "S c #C58727", "D c #5F5F5E", "F c #959589", "G c #6C4301", "H c #6B4300", "J c #B9B9B6", "K c #B8B9B5", "L c #FEFEFD", "P c #B7B7B4", "I c #736F64", "U c #BBBBBB", "Y c #F0F0EF", "T c #EEEEED", "R c #A47E3E", "E c #A37C3D", "W c #ECECEB", "Q c #706D64", "! c None", /* pixels */ "!!!!!DmmmmD!!!!!", "!!+9w8FiiF8w99!!", "!+@RQn#aasn>bzG!", "!logC6UUUU62cSM!", "!loXBYYYYYYB-NM!", "!luXBYxxxxrB-NM!", "!luXBYYYY$%B-NM!", "!OuXBYxx:AfB-NM!", "!OuXBYrtyf;B-NM!", "!OuXBTW&*k,B-NM!", "!OuXBdfhvqKB-NM!", "!puXB*=ZJBBB-NM!", "!puXBV50PBB-SNM!", "!puj3111rL-SSSM!", "!G47I.....EEEe c #F2F2F2", ", c #F0F0F0", "< c #EEEEEE", "1 c #ECECEC", "2 c #8B8D89", "3 c #B2C8E0", "4 c #B0C6DE", "5 c #AEC4DC", "6 c #ACC2DA", "7 c #AAC0D8", "8 c #8C8E89", "9 c #A8BED6", "0 c #888A85", "q c #8298B0", "w c #FFFFFF", "e c #FDFDFD", "r c #FBFBFB", "t c #F9F9F9", "y c #F7F7F7", "u c #F5F5F5", "i c #EBEBEB", "p c None", /* pixels */ "p20000000000008p", "p0e&&ee**rr==t$p", "p0e9##77+++++-$p", "p0&#%%%%6%%%6-$p", "p0e7%%%%OOOOO-$p", "p0e7%%%%O555i-$p", "p0*+%%%%5%%o1-$p", "p0*66O5oo444<-$p", "p0*6O5oo44XX,-$p", "p0r6%%%%%%%3>y$p", "p0rO5o44 3 .:y$p", "p0=O5o4X3 u;;y$p", "p0tOqqqq3 y-yy$p", "p0tO5o4X3 yt-y$p", "p0------ - ---$p", "p8000000000000@p" }; /* actions/edit-undo.png */ /* XPM */ const char *tango_edit_undo[] = { /* width height ncolors chars_per_pixel */ "16 16 70 1", /* colors */ " c #000000", ". c #F3E56A", "X c #F4DF2C", "o c #F1DB29", "O c #F9EA69", "+ c #DFC80A", "@ c #BB9F15", "# c #F6E131", "$ c #EBDC6F", "% c #C4A000", "& c #EFE276", "* c #D6C004", "= c #C19E00", "- c #BBA11B", "; c #EEE16E", ": c #FAEC73", "> c #BCA015", ", c #F8E232", "< c #DAC304", "1 c #F5E02F", "2 c #C1A313", "3 c #7D7905", "4 c #FAEB6F", "5 c #DFC90F", "6 c #BEA113", "7 c #ECD936", "8 c #E3CD16", "9 c #BF9D00", "0 c #C1A319", "q c #DBC443", "w c #C8AC02", "e c #BCA114", "r c #F7DD05", "t c #FBED76", "y c #DFC80B", "u c #FBED79", "i c #B99900", "p c #7C7A06", "a c #D8C207", "s c #E9DA5D", "d c #CBAA0E", "f c #F7E86E", "g c #F2E469", "h c #E8D21D", "j c #C0A41A", "k c #F7E232", "l c #FBF3AD", "z c #C1A314", "x c #F6E769", "c c #FBE425", "v c #C5AB1B", "b c #C4A71A", "n c #C0A623", "m c #E1CD40", "M c #C2A611", "N c #BDA116", "B c #C2A211", "V c #FAE320", "C c #BFA31B", "Z c #EADB66", "A c #C3A618", "S c #F7E86C", "D c #F2E788", "F c #E3CE41", "G c #F5E66D", "H c #F6E02F", "J c #D8C543", "K c #7E7905", "L c #C4A901", "P c None", /* pixels */ "PPPPPP%PPPPPPPPP", "PPPPP%%PPPPPPPPP", "PPPP%l%PPPPPPPPP", "PPP%lc%%6@-PPPPP", "PP%l#V:4fSezPPPP", "P%lHko1o87xF2PPP", "%lH,kk1ohhh7mNPP", "P%u,X***hhhy.v>P", "PP%t c #979993", ", c #C0C0BE", "< c None", /* pixels */ "<<<<<<<<<<<<<<<<", "<<<<<<---<<<<<<<", "<<<--<-:-<--<<<<", "<<-:,-@&@-,:-<<<", "<<-,&&&&&&&,-<<<", "<<<-&O+>+;&-<<<<", "<--@&+%<*#&@--<<", "<-:&&><<<>&&:-<<", "<--@&oX<$+&@--<<", "<<<-:Oo>+.&-<<<<", "<<-,&&&&&&&,-<<<", "<<-:,-@&@-,:-<<<", "<<<--<-:-<--<<<<", "<<<<<<---<<<<<<<", "<<<<<<<<<<<<<<<<", "<<<<<<<<<<<<<<<<" }; /* mimetypes/application-x-executable.png */ /* XPM */ const char *tango_application_x_executable[] = { /* width height ncolors chars_per_pixel */ "16 16 70 1", /* colors */ " c #000000", ". c #9BABC3", "X c #8790B6", "o c #ADB8CE", "O c #ABB6CC", "+ c #5F7A9F", "@ c #7F90B1", "# c #A5B2C9", "$ c #A4B2C8", "% c #9197BC", "& c #9FAEC6", "* c #8991B7", "= c #AFB9CF", "- c #AEB9CE", "; c #BFC4D8", ": c #7382AB", "> c #95A2BF", ", c #949ABE", "< c #7D89B1", "1 c #7C89B0", "2 c #8D9EBA", "3 c #8E9CBB", "4 c #A0AFC6", "5 c #B0BACF", "6 c #9D9FC3", "7 c #C1C5D9", "8 c #7483AB", "9 c #99A3C2", "0 c #858EB5", "q c #AAB6CC", "w c #8F9BBB", "e c #9099BC", "r c #A2AEC7", "t c #A1AAC6", "y c #7786AD", "u c #8895B7", "i c #ACB7CD", "p c #7182AA", "a c #566F99", "s c #7A87AF", "d c #ACB0CC", "f c #8394B4", "g c #A8B4CB", "h c #A7B4CA", "j c #A7B2CA", "k c #50688F", "l c #A5B0C8", "z c #C8CADD", "x c #546C96", "c c #7C8EB0", "v c #7C8CB0", "b c #7B88AF", "n c #8D9FBA", "m c #7A88AE", "M c #B2BBD1", "N c #B1BBD0", "B c #516A96", "V c #7584AC", "C c #364878", "Z c #858FB5", "A c #98A2C1", "S c #ABB5CD", "D c #A9B5CB", "F c #A9B3CB", "G c #A7B1C9", "H c #486490", "J c #A3B1C8", "K c #B3BCD1", "L c #C3C7DA", "P c None", /* pixels */ "PPPPPPPCPPPPPPPP", "PPPPPPCLCPPPPPPP", "PPPPPCL.+CPPPPPP", "PPPPCL&4nHCPPPPP", "PPPCLJ$#2BaCPPPP", "PPCLhgDqcf@aCPPP", "PCLOio-rv>FpaCPP", "CL=5NMj3SKy:VaCP", "PCLGlwu8t9b c #969796", " , c #BFD2E9", " < c #7EA7D4", " 1 c #98B9DD", " 2 c #BBD2E8", " 3 c #797979", " 4 c #737373", " 5 c #3768A5", " 6 c #3666A4", " 7 c #C5D7EB", " 8 c #5689C0", " 9 c #85ACD7", " 0 c #9FA09E", " q c #656565", " w c #5F5F5F", " e c #C1D5EA", " r c #5B5B5B", " t c #555555", " y c #7FA8D4", " u c #515151", " i c #FEFEFE", " p c #FCFCFC", " a c #8AAFD8", " s c #494949", " d c #FAFAFA", " f c #95B8DC", " g c #EAEAEA", " h c #E8E8E8", " j c #E6E6E6", " k c #E2E2E2", " l c #E0E0E0", " z c #DEDEDE", " x c #77A2D2", " c c #DCDCDC", " v c #3667A6", " b c #DADADA", " n c #3465A4", " m c #5B5E5A", " M c #D2D2D2", " N c #81A9D5", " B c #D0D0D0", " V c #4B7EB7", " C c #3265A5", " Z c #8BB0D8", " A c #C4C4C4", " S c #96B7DC", " D c #3968A5", " F c #B0B0B0", " G c #B9D0E7", " H c #AEAEAE", " J c #ACACAC", " K c #AAAAAA", " L c #79A3D3", " P c #92B5DB", " I c #A6A6A6", " U c #5F615D", " Y c #3666A5", " T c #3566A4", " R c #5D5F5B", " E c #5B5D59", " W c #595B57", " Q c #D5D5D4", " ! c #575955", " ~ c #83AAD6", " ^ c #82AAD5", " / c #555753", " ( c #9BBADD", " ) c #C0D5EA", " _ c #C1C1C0", " ` c #7A7A7A", " ' c #787878", " ] c #3767A5", " [ c #A5A5A4", " { c #6E6E6E", " } c #5B5C58", " | c #5588BF", ". c #6A6A6A", ".. c #9C9D9B", ".X c #3567A6", ".o c #8FB2DA", ".O c #8EB2D9", ".+ c #939392", ".@ c #3465A5", ".# c #C1D6EA", ".$ c #565656", ".% c #B1C9E4", ".& c #4C4C4C", ".* c #FDFDFD", ".= c #FBFBFB", ".- c #484848", ".; c #F9F9F9", ".: c #F7F7F7", ".> c #7BA5D3", "., c #95B7DC", ".< c #94B5DB", ".1 c #3868A5", ".2 c #EBEBEB", ".3 c #E9E9E9", ".4 c #E7E7E7", ".5 c #E5E5E5", ".6 c #E3E3E3", ".7 c #B8CEE7", ".8 c #DFDFDF", ".9 c #DDDDDD", ".0 c #3566A5", ".q c #3466A4", ".w c #D9D9D9", ".e c #D3D3D3", ".r c #D0D1D0", ".t c #9ABADD", ".y c #CFCFCF", ".u c #CDCDCD", ".i c #C9C9C9", ".p c #C7C7C7", ".a c #C5C5C5", ".s c #A5C1E1", ".d c #7DA6D4", ".f c #BDBDBD", ".g c #95B6DB", ".h c #B7B7B7", ".j c #454A51", ".k c #B3B3B3", ".l c None", /* pixels */ ".l.l.l.l = ! = ! ! W * U.l.l.l.l", " ` 3 3 3 =.:.; d.=.= p $ }.l.l.l", " '.i.p A / b.e.e M.y.u i.+ m.l.l", " 4.a F J / c - - - - Q i.* > E.l", " { _ J K = k.8 z z.9 l.3.5 B R.l", ". .f o + = j 0.......9.6.6.r E.l", " q.h I & !.2 g g.3.3 h h.4.w %.l", " w.k X.1.1 5 Y Y.0 T T T n n n O", " r H.0 ) ) ) ) ) ) e.#.#.#.# 2.@", ".$ o T # P P P P P P P P P f G.q", " u [ 6 7 1 1 1 1 1 1 1 1 1.,.7.0", ".& & ] , (.t.t.t.t.t.t S.o Z.%.0", ".- ;.1.s.O a 9 ~ N < L x x.>.g.X", " s : D.< ^.d.d.d.d.d.d.d.d y Y", ".- . D | 8 8 8 8 8 8 8 8 8 8 V v", ".j n n n n n n n n n n n n n @.l" }; /* status/folder-open.png */ /* XPM */ const char *tango_folder_open[] = { /* width height ncolors chars_per_pixel */ "16 16 123 2", /* colors */ " c #000000", " . c #ADADAD", " X c #ABABAB", " o c #A9A9A9", " O c #92B6DB", " + c #92B4DB", " @ c #A7A7A7", " # c #3667A5", " $ c #A5A5A5", " % c #A3A3A3", " & c #A1A1A1", " * c #9F9F9F", " = c #9DBDDF", " - c #9D9D9D", " ; c #9B9B9B", " : c #B5CDE6", " > c #999999", " , c #7EA7D4", " < c #3968A4", " 1 c #484849", " 2 c #797979", " 3 c #757575", " 4 c #94B7DC", " 5 c #737373", " 6 c #93B5DB", " 7 c #6D6D6D", " 8 c #86AED8", " 9 c #6B6B6B", " 0 c #B7CEE7", " q c #656565", " w c #5F5F5F", " e c #C1D5EA", " r c #5B5B5B", " t c #7FA8D4", " y c #515151", " u c #B1CAE4", " i c #4779B4", " p c #494949", " a c #A2BFDF", " s c #86ABD4", " d c #95B8DC", " f c #AEC8E4", " g c #4971A5", " h c #B8CFE7", " j c #3567A5", " k c #4F79AE", " l c #3465A4", " z c #81A9D5", " x c #9BBBDE", " c c #3C6AA5", " v c #CACACA", " b c #C8C8C8", " n c #8CB0D9", " m c #C4C4C4", " M c #C0C0C0", " N c #BABABA", " B c #3968A5", " V c #3766A3", " C c #88AED8", " Z c #B2B2B2", " A c #B0B0B0", " S c #AEAEAE", " D c #ACACAC", " F c #AAAAAA", " G c #92B5DB", " H c #3868A7", " J c #A6A6A6", " K c #3666A5", " L c #A4A4A4", " P c #C4D7EB", " I c #A0A0A0", " U c #9E9E9E", " Y c #82AAD5", " T c #9C9C9C", " R c #9A9A9A", " E c #406DA8", " W c #6A7F99", " Q c #8EB3DA", " ! c #C1C1C0", " ~ c #808080", " ^ c #7A7A7A", " / c #787878", " ( c #454F5D", " ) c #747474", " _ c #94B6DC", " ` c #93B6DB", " ' c #A5A5A4", " ] c #598CC3", " [ c #6E6E6E", " { c #3463A2", " } c #6C6C6C", " | c #6A6A6A", ". c #84ABD6", ".. c #B7CFE7", ".X c #606060", ".o c #608FC3", ".O c #3465A5", ".+ c #565656", ".@ c #B3CBE6", ".# c #8F949B", ".$ c #FFFFFF", ".% c #4C4C4C", ".& c #8BB0D9", ".* c #484848", ".= c #688FBD", ".- c #3868A5", ".; c #85ACD6", ".: c #B7CEE6", ".> c #68809F", "., c #91B5DB", ".< c #3768A7", ".1 c #3566A5", ".2 c #B4CCE6", ".3 c #C9C9C9", ".4 c #8DB1DA", ".5 c #C7C7C7", ".6 c #C5C5C5", ".7 c #BED3E9", ".8 c #BDBDBD", ".9 c #5C8EC4", ".0 c #B7B7B7", ".q c #B3B3B3", ".w c None", /* pixels */ ".w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w", " ^ 2 2 2 2 2 2.w.w.w.w.w.w.w.w.w", " /.3.5.6 m m Z 3.w.w.w.w.w.w.w.w", " 5.6 A . X F F ^ 7 } 9 9 | [.w.w", " [ ! D F @ $ L o N.6 b v M q.w.w", " |.8 o J % & I * * I & % % w.w.w", " q.0 J % I - T ; R ; T U U r.w.w", " w.q % g B B B B B B B B B V K.<", " r S I.-.2 0 0...:.:.:.:.:.: u.O", ".+ o U <.7 O., G O O O O ` d.@.1", " y ' T c e 4 4 4 4 4 4 4 Q 8 :.1", ".% & ; E P x x x x x _.& C.4 h.1", ".* ;.# k f 6 + n.; t , , , Y a #", " p >.>.= =.& Y z z z z z z. s H", " 1 W B.o.9 ] ] ] ] ] ] ] ] ] i j", " ( l l l l l l l l l l l l l l.w" }; /* apps/help-browser.png */ /* XPM */ const char *tango_help_browser[] = { /* width height ncolors chars_per_pixel */ "16 16 153 2", /* colors */ " c #7497C1", " . c #D6DEE9", " X c #466DA1", " o c #8BA5C7", " O c #2F5891", " + c #E6EBF2", " @ c #E4E9F0", " # c #4B6E9F", " $ c #8CA2C1", " % c #6B8FBB", " & c #567CAD", " * c #5278A9", " = c #829DC1", " - c #AABAD1", " ; c #EDF0F5", " : c #FDFDFE", " > c #6387B6", " , c #4B72A5", " < c #345D95", " 1 c #6482AD", " 2 c #335B94", " 3 c #617EAA", " 4 c #BAC9DD", " 5 c #CDDAE9", " 6 c #E8ECF3", " 7 c #2E558F", " 8 c #2D558E", " 9 c #E6EAF1", " 0 c #C8D4E4", " q c #7296C1", " w c #C2CEDE", " e c #4D6FA0", " r c #A0B9D7", " t c #5A7FB0", " y c #728FB7", " u c #5B7AA7", " i c #2A538E", " p c #7999C1", " a c #F2F5F9", " s c #F0F3F7", " d c #365C93", " f c #BDCADC", " g c #FEFEFE", " h c #597AA8", " j c #6D8BB5", " k c #6B89B3", " l c #6987B1", " z c #6286B4", " x c #4D73A6", " c c #386098", " v c #214B88", " b c #6381AB", " n c #EDF1F7", " m c #315891", " M c #E9EDF3", " N c #6C8DB7", " B c #2D5690", " V c #86A1C3", " C c #5C7BA7", " Z c #9BB2D1", " A c #C9D7E7", " S c #6C88B0", " D c #6587B3", " F c #BDC9DB", " G c #547AAC", " H c #3B639A", " J c #6B88B2", " K c #244E8A", " L c #234C89", " P c #224C88", " I c #8FA8C8", " U c #6582AC", " Y c #CBD6E5", " T c #6085B4", " R c #94A9C6", " E c #5E83B2", " W c #325B94", " Q c #E5EAF1", " ! c #3B6096", " ~ c #C0CCDD", " ^ c #8CA1C1", " / c #6A8EBA", " ( c #5978A6", " ) c #5878A5", " _ c #3C649A", " ` c #264F8B", " ' c #254F8A", " ] c #94ADCC", " [ c #6284B2", " { c #F1F5F9", " } c #F0F3F8", " | c #EFF3F7", ". c #A9B9D0", ".. c #496FA3", ".X c #345C95", ".o c #335C94", ".O c #E8EDF3", ".+ c #B7C6DA", ".@ c #E7EBF2", ".# c #2C548D", ".$ c #A6B9D3", ".% c #7093BF", ".& c #42699F", ".* c #40679D", ".= c #5176A7", ".- c #27508B", ".; c #6A86AF", ".: c #ADBCD3", ".> c #F1F4F8", "., c #7594BD", ".< c #EFF2F6", ".1 c #A0B5D0", ".2 c #FFFFFF", ".3 c #678BB9", ".4 c #9BAFCB", ".5 c #6589B7", ".6 c #4C72A5", ".7 c #204A87", ".8 c #6482AC", ".9 c #A7B8D0", ".0 c #E9EEF3", ".q c #2F578F", ".w c #2D558D", ".e c #CAD6E5", ".r c #F9FBFC", ".t c #C6D2E1", ".y c #7396C1", ".u c #90A5C3", ".i c #6F92BD", ".p c #456CA1", ".a c #9FB7D5", ".s c #436A9F", ".d c #5D7CA8", ".f c #718DB5", ".g c #E3E8F0", ".h c #385E94", ".j c #9DB7D6", ".k c #D1DBE8", ".l c #47699C", ".z c #A0B4CF", ".x c #3A6299", ".c c #254F8B", ".v c #386097", ".b c #234D89", ".n c #224B88", ".m c #EFF3F8", ".M c #7191BB", ".N c #EBEFF4", ".B c #89A1C2", ".V c #CCD7E6", ".C c #FBFCFD", ".Z c #789BC5", ".A c None", /* pixels */ ".A.A.A.A.A.7.7.7.7.7.7.A.A.A.A.A", ".A.A.A.A.# ^ F.N.N F $.#.A.A.A.A", ".A.A.7 u.g. U ! ! U - @ C.7.A.A", ".A.A 3.@ (.l w s 9.9 e 1.O.d.A.A", ".A 8 Q ).7 S : ..<.2 f c k +.w.A", ".7.u. .7.7 # e W h.2.C X.s.+ R.7", ".7 ~ U.7.- B.X.x.B.2 6 , x V.t L", ".7 ; d ' B < H j.r g = G & N | v", ".7 ;.h i 2.x.&.O.2.1 t E T., }.n", ".7 ~.; O.v.*.= 0.e z >.3 / Z.V K", ".7.u.:.o _.p * I ].5 %.%.y A.z v", ".A 8 + l.*.. [.2.2.i q.Z.j n.q.A", ".A.A b.0 y.6 D.2.2 .Z r { J.A.A", ".A.A.7.8 M 4 o.M p.a 5.m.f `.A.A", ".A.A.A.A 7.4 Y.> a.k.$ m.A.A.A.A", ".A.A.A.A.A.7.b P P.c v.A.A.A.A.A" }; /* mimetypes/image-x-generic.png */ /* XPM */ const char *tango_image_x_generic[] = { /* width height ncolors chars_per_pixel */ "16 16 87 1", /* colors */ " c #6583AF", ". c #95A8C7", "X c #6381AD", "o c #617FAB", "O c #A5B5D0", "+ c #738EB6", "@ c #3F516F", "# c #384151", "$ c #3D4F6D", "% c #5B7BA8", "& c #45546E", "* c #7A8698", "= c #5475A4", "- c #98ABC9", "; c #67758F", ": c #A8B8D2", "> c #9CA7B9", ", c #839ABE", "< c #6180AD", "1 c #D1DCB1", "2 c #8691A3", "3 c #A4B8A9", "4 c #515151", "5 c #FEFEFE", "6 c #485773", "7 c #E2EBBE", "8 c #5778A6", "9 c #9AACCA", "0 c #7D899D", "q c #F6F6F6", "w c #9EA8BA", "e c #7892B9", "r c #A8B7D1", "t c #374762", "y c #818A9A", "u c #93A6C6", "i c #A2B3CE", "p c #8099BD", "a c #FFFFFE", "s c #405374", "d c #889EC1", "f c #869CBF", "g c #455672", "h c #435470", "j c #96A9C8", "k c #A6B6D1", "l c #33476A", "z c #FEFEF9", "x c #3D4E6D", "c c #888A85", "v c #3B4C6B", "b c #B6C5B2", "n c #8CA1C1", "m c #6D89B3", "M c #415474", "N c #C4D1AF", "B c #EEF3CB", "V c #475773", "C c #818DA2", "Z c #2F4262", "A c #DCE5B9", "S c #384C6E", "D c #A7B7D1", "F c #7590B7", "G c #34486A", "H c #9DAFC7", "J c #5072A3", "K c #6884AA", "L c #233659", "P c #8FA6AF", "I c #FDFDFD", "U c #6986B1", "Y c #819AB8", "T c #9FA9BB", "R c #9EA9BA", "E c #5F7EAA", "W c #B3C2B7", "Q c #728DB6", "! c #A1B3C3", "~ c #FCFDEE", "^ c #8EA3C4", "/ c #F7FADF", "( c #495973", ") c #C5D1B1", "_ c #3D5071", "` c #718DA7", "' c None", /* pixels */ "cccccccccccccccc", "c55555555555555c", "cI*tttttttttt*qc", "c5@oXK`E%8==Jtqc", "cIh+PAB3mU 44ytqc", "cItx$$xvZL44#tqc", "cItMs_SGl4444tqc", "cItC;;;;;;;;;tqc", "cI*tttttttttt*qc", "c5qqqqqqqqqqqqIc", "cccccccccccccccc" }; /* actions/go-previous.png */ /* XPM */ const char *tango_go_previous[] = { /* width height ncolors chars_per_pixel */ "16 16 99 2", /* colors */ " c #65A827", " . c #6EC915", " X c #C6DEAE", " o c #C2DCAA", " O c #52891E", " + c #3B7504", " @ c #CAE0B5", " # c #7CC833", " $ c #67C111", " % c #AACF88", " & c #97DA54", " * c #97BD72", " = c #6BA236", " - c #A0C37E", " ; c #55A409", " : c #61B70E", " > c #A9D480", " , c #60B50D", " < c #87B65B", " 1 c #3C7604", " 2 c #C7DFB1", " 3 c #9DC477", " 4 c #87BB54", " 5 c #3A7405", " 6 c #82B74F", " 7 c #A5DC6E", " 8 c #457C13", " 9 c #88BB58", " 0 c #60A420", " q c #B8D69B", " w c #90BF63", " e c #B3D296", " r c #3D7904", " t c #A6CF7F", " y c #C5DEAE", " u c #8DC459", " i c #96CA65", " p c #3A7304", " a c #59AC0B", " s c #598B29", " d c #578927", " f c #41790E", " g c #ACD881", " h c #5EA31D", " j c #70AD35", " k c #6EA23D", " l c #7FB947", " z c #C4DDAC", " x c #7AB742", " c c #4E9A06", " v c #3B7604", " b c #4D8419", " n c #3B7404", " m c #A5D576", " M c #A3CA7E", " N c #5AAD0B", " B c #AEDB82", " V c #65B519", " C c #A9D77D", " Z c #5A8C2C", " A c #7DA855", " S c #8BBD5C", " D c #61B60E", " F c #71B035", " G c #7BB642", " H c #66AF20", " J c #BFDAA6", " K c #75B23C", " L c #B0DE83", " P c #3F790A", " I c #A7CD84", " U c #FFFFFF", " Y c #A5C982", " T c #80B64D", " R c #5D8D2E", " E c #7FA956", " W c #56A609", " Q c #8ABC5A", " ! c #89BC59", " ~ c #87BA57", " ^ c #91C064", " / c #68A92B", " ( c #BDD9A3", " ) c #519E07", " _ c #5EB30D", " ` c #94C26A", " ' c #C8DFB1", " ] c #A3D572", " [ c #69C211", " { c #66AC22", " } c #3A7404", " | c #5CAD0E", ". c #7DB549", ".. c #58A90A", ".X c #437A10", ".o c #62AF17", ".O c #85B954", ".+ c #B5D497", ".@ c None", /* pixels */ ".@.@.@.@.@.@.@.@.@.@ +.@.@.@.@.@", ".@.@.@.@.@.@.@.@ n s p.@.@.@.@.@", ".@.@.@.@.@.@.@ } E ' p.@.@.@.@.@", ".@.@.@.@.@.@.X - ( @ p.@.@.@.@.@", ".@.@.@.@ n R e % ^ 2 v p p p p }", ".@.@.@ 5 A.+ ` ~ S z y X y z o p", ".@.@ 8 * I T. 6.O 9 ! Q ! 9 J p", " + Z Y w j K G l x F h 0 / q p", " + d 3 4 { H.o | a.. ; ) c c M p", ".@.@ f < i V , : D _ N W ) c M p", ".@.@.@ + k m # [ $ B g > t M M p", ".@.@.@.@ v O ] & . L r p p p p }", ".@.@.@.@.@.@ P u 7 L p.@.@.@.@.@", ".@.@.@.@.@.@.@ 1 = C p.@.@.@.@.@", ".@.@.@.@.@.@.@.@ v b p.@.@.@.@.@", ".@.@.@.@.@.@.@.@.@.@ +.@.@.@.@.@" }; /* actions/system-log-out.png */ /* XPM */ const char *tango_system_log_out[] = { /* width height ncolors chars_per_pixel */ "16 16 186 2", /* colors */ " c #E26E6E", " . c #D94141", " X c #E5E6E4", " o c #ECE3E1", " O c #AFAFAF", " + c #ADADAD", " @ c #ABABAB", " # c #A9A9A9", " $ c #A7A7A7", " % c #E88E8E", " & c #A5A5A5", " * c #A3A3A3", " = c #5C5E5A", " - c #A1A1A1", " ; c #A20E0E", " : c #585A56", " > c #9D9D9D", " , c #565854", " < c #D23D3D", " 1 c #999999", " 2 c #979797", " 3 c #959595", " 4 c #939393", " 5 c #AC1111", " 6 c #919191", " 7 c #8F8F8F", " 8 c #8D8D8D", " 9 c #8B8B8B", " 0 c #898989", " q c #EA9696", " w c #E16969", " e c #F1F1EF", " r c #858585", " t c #A50000", " y c #EFEFED", " u c #645F5E", " i c #7F7F7F", " p c #EB9A9A", " a c #797979", " s c #A60404", " d c #757575", " f c #A11616", " g c #E88D8D", " h c #6F6F6F", " j c #D9DBD7", " k c #A61111", " l c #D7D9D5", " z c #656565", " x c #D23C3C", " c c #989897", " v c #DB4848", " b c #D21B1B", " n c #5D5D5D", " m c #C7C9C5", " M c #C6C9C4", " N c #595959", " B c #B02121", " V c #898A88", " C c #EA9595", " Z c #CF0E0E", " A c #878886", " S c #EDD4D3", " D c #FAFAFA", " F c #E78888", " G c #A60303", " H c #CD6161", " J c #686A67", " K c #D32525", " L c #9A9B98", " P c #D73636", " I c #D79292", " U c #929390", " Y c #8A6464", " T c #C6C8C3", " R c #B12221", " E c #8D8F8B", " W c #DD5656", " Q c #B51B1B", " ! c #C42D2D", " ~ c #D0D2D0", " ^ c #F3F1EF", " / c #D63838", " ( c #7F817D", " ) c #FBFBFA", " _ c #D52D2D", " ` c #BEBEBE", " ' c #F3F3F2", " ] c #BABABA", " [ c #737571", " { c #EFEFEE", " } c #DB4D4D", " | c #AC1515", ". c #C46C6B", ".. c #E4E5E3", ".X c #686966", ".o c #656763", ".O c #DC5151", ".+ c #646562", ".@ c #AAAAAA", ".# c #C58886", ".$ c #61635F", ".% c #CE0808", ".& c #A6A6A6", ".* c #5F615D", ".= c #A4A4A4", ".- c #A2A2A2", ".; c #5B5D59", ".: c #C5C7C1", ".> c #A0A0A0", "., c #595B57", ".< c #9E9E9E", ".1 c #575955", ".2 c #9C9C9C", ".3 c #555753", ".4 c #9A9A9A", ".5 c #989898", ".6 c #969696", ".7 c #949494", ".8 c #BC2424", ".9 c #929292", ".0 c #867979", ".q c #8C8C8C", ".w c #F4F4F2", ".e c #888888", ".r c #868686", ".t c #858685", ".y c #F0F0EE", ".u c #DB4C4C", ".i c #BC3E3E", ".p c #828282", ".a c #808080", ".s c #7E7E7E", ".d c #767676", ".f c #707070", ".g c #7E6A6A", ".h c #6E6E6E", ".j c #D8DAD6", ".k c #C53636", ".l c #A2A3A1", ".z c #6C6C6C", ".x c #AC2524", ".c c #D6D8D4", ".v c #AA0B0B", ".b c #D4D6D2", ".n c #B01E1E", ".m c #686868", ".M c #646464", ".N c #DA9696", ".B c #606060", ".V c #B72828", ".C c #A51413", ".Z c #D11A1A", ".A c #C3C6C1", ".S c #8B7373", ".D c #BC3030", ".F c #FFFFFF", ".G c #FBFBFB", ".H c #F9F9F9", ".J c #D43A3A", ".K c #ECA7A7", ".L c #C76565", ".P c #696B68", ".I c #C6C9C3", ".U c #A90C0C", ".Y c #BEC1BB", ".T c #CE0C0C", ".R c #D33535", ".E c #DB4A4A", ".W c #C45151", ".Q c #C3C3C3", ".! c #F8F8F7", ".~ c #F6F6F5", ".^ c #BB4948", "./ c #CF1010", ".( c #F4F4F3", ".) c #BDBDBD", "._ c #BBBBBB", ".` c #B64543", ".' c #A50101", ".] c #EDEEEC", ".[ c #D26565", ".{ c #B93C3C", ".} c #6D6E6B", ".| c #A28988", "X c #D55E5E", "X. c None", /* pixels */ ".;.3.3.3.3.3.3.3 , =.+.X J.o.}X.", ".3.& r a.h z n N y e.(.~.~.] (X.", ".3 +.q i d.z.M.B y '.! ).G.H LX.", ".3 ] 3 0.s d.h.m {.w.H I.i D.lX.", ".3._ >.7 0 i.d.f.y ^.L.W | S.|X.", ".3.).> 2 7.r.s.d o.{ H.K.D.V R.'", ".3 `.-.4 6.e.a.g B.[ F % C q p.'", ".3 `.=.2 4 9 Y kX w v.E.u } g G", ".3 ` $.<.6 8 f.k W _ K.Z./ b s", ".3 ` # -.5 7.S ; ! P.%.T.T Z.O.'", ".3 `.@ *.4.9 0.0.x.8 / ..J x < t", ".3 `.@ & > 3 7.p u.^ Q.R s.n.C.v", ".3 `.@ # - 1 h V ~... 5.U X AX.", ".3 ` @ O.t E m.b l.j j.#.`.c [X.", ".3.Q c U.Y.A T.I M M M M M.:.$X.", ".;.P ,.1 : : : :.,.,.,.,., :.*X." }; /* actions/list-remove.png */ /* XPM */ const char *tango_list_remove[] = { /* width height ncolors chars_per_pixel */ "16 16 20 1", /* colors */ " c #000000", ". c #7DA6D7", "X c #86ADD9", "o c #9FBEE0", "O c #B6CCE6", "+ c #83AAD8", "@ c #BBD1E7", "# c #7FA8D7", "$ c #94B6DB", "% c #3465A4", "& c #95B7DB", "* c #B5CCE6", "= c #B4CCE5", "- c #92B4DA", "; c #B6CDE6", ": c #B7CEE6", "> c #90B3DA", ", c #C0D3E8", "< c #BCD1E7", "1 c None", /* pixels */ "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "11%%%%%%%%%%%%11", "11%,@<::::;*O%11", "11%=&$->X+#.o%11", "11%%%%%%%%%%%%11", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111", "1111111111111111" }; /* devices/multimedia-player.png */ /* XPM */ const char *tango_multimedia_player[] = { /* width height ncolors chars_per_pixel */ "16 16 79 1", /* colors */ " c #666864", ". c #626460", "X c #858782", "o c #80817D", "O c #7E7F7B", "+ c #7D7F7A", "@ c #7C7D79", "# c #7B7D78", "$ c #CBCFAC", "% c #7A7B77", "& c #696B66", "* c #CBD0A5", "= c #676964", "- c #C9D0A3", "; c #A4A6A3", ": c #D1D6AE", "> c #5B5B58", ", c #BDC58D", "< c #B2B796", "1 c #C3C996", "2 c #8A8C89", "3 c #B8B9B6", "4 c #A5A7A3", "5 c #989996", "6 c #C3C79F", "7 c #BFC59B", "8 c #C5C9A4", "9 c #838581", "0 c #7C7D7A", "q c #AEAEAB", "w c #A8AAA5", "e c #6E6F6C", "r c #A2A49F", "t c #BEC496", "y c #969893", "u c #92948F", "i c #91928E", "p c #BBC096", "a c #555753", "s c #535551", "d c #888A85", "f c #80827D", "g c #B8BCAA", "h c #CFD4B0", "j c #7E807B", "k c #7C7E79", "l c #7A7C77", "z c #787A75", "x c #747671", "c c #70726D", "v c #6E706B", "b c #6C6E69", "n c #6A6C67", "m c #686A65", "M c #9B9D9A", "N c #939592", "B c #C3CA96", "V c #B6B6B4", "C c #B4B5A8", "Z c #BBC291", "A c #ADAEAB", "S c #A5A6A3", "D c #A4A6A2", "F c #9FA09D", "G c #696968", "H c #B8BCA8", "J c #B3BC78", "K c #B6BAA6", "L c #898A87", "P c #C4CAA3", "I c #C5CB9A", "U c #B9B9B6", "Y c #C9CEAB", "T c #787A76", "R c #767874", "E c #BBC286", "W c #747672", "Q c #A6A7A3", "! c None", /* pixels */ "saaaaaaaaaaaaaaa", "aRQQQ444444S;DRa", "a5i%%%@@@@@Ood5a", "a5N<68Y$P7tZh25a", "a5rpBI-*1,EJ:y5a", "a5uCgHHHHHHKKX5a", "a5vbbnbvbnnbnn5a", "a5&=m==&m==&=m5a", "a5zqMwAWxWc>. 5a", "a5L3DVU+++TG0e5a", "a5+++++++++9fj5a", "a5kkkkkkkkkkkk5a", "a5#F#F########5a", "a5llllllllllll5a", "aR555555555555Ra", "aaaaaaaaaaaaaaaa" }; /* apps/internet-web-browser.png */ /* XPM */ const char *tango_internet_web_browser[] = { /* width height ncolors chars_per_pixel */ "16 16 167 2", /* colors */ " c #000000", " . c #56719D", " X c #6984A9", " o c #DCE1E5", " O c #F1F2F3", " + c #8BA7C7", " @ c #84A6CA", " # c #DFEFFF", " $ c #93B6DC", " % c #EDEEEF", " & c #5A79A4", " * c #5979A3", " = c #5877A2", " - c #BCC4CC", " ; c #B1C0D5", " : c #E3E4E5", " > c #5685B7", " , c #B1CEEC", " < c #627CA5", " 1 c #B3C1D0", " 2 c #F0F4F8", " 3 c #B5BEC8", " 4 c #CCDDEF", " 5 c #DBDEE0", " 6 c #7591B4", " 7 c #759FCB", " 8 c #BED4EB", " 9 c #F8F9F9", " 0 c #B7C2CD", " q c #BECFE1", " w c #BCCDDF", " e c #5B7AA4", " r c #B5C5D8", " t c #5978A2", " y c #93ABC7", " u c #C6CFD8", " i c #D4DDE9", " p c #A3B8D0", " a c #A0B4CD", " s c #BEC7D0", " d c #CAD5DF", " f c #5988BC", " g c #E0E3E4", " h c #DFE1E3", " j c #83A7CE", " k c #637FA8", " l c #617FA6", " z c #FEFEFE", " x c #D7D9DB", " c c #DCE4ED", " v c #F6F6F6", " b c #5E7DA6", " n c #628FC1", " m c #CCD9E7", " M c #E6EBF0", " N c #C0C6CE", " B c #57759F", " V c #DBE4EF", " C c #E2E2E2", " Z c #80A7D1", " A c #E0E0E0", " S c #B7C8DC", " D c #B1C2D6", " F c #DCE3E9", " G c #6B96C6", " H c #7A95B7", " J c #BABFC4", " K c #A9BCD1", " L c #D9E1E9", " P c #CED0D1", " I c #6983A6", " U c #C8CFD5", " Y c #7591B5", " T c #9DA6AE", " R c #6D90B7", " E c #D2E5F9", " W c #819ABA", " Q c #DEE2E7", " ! c #D6DFE9", " ~ c #A3B6CE", " ^ c #DAEAFA", " / c #CFD9E2", " ( c #5A7AA4", " ) c #5C8ABD", " _ c #A2BDDA", " ` c #D5DFEB", " ' c #A5B7C9", " ] c #CCD7E2", " [ c #C3D2E3", " { c #5686BA", " } c #E3F1FF", " | c #C8CED4", ". c #E2EFFE", ".. c #7792B6", ".X c #516994", ".o c #9BB2CC", ".O c #9AB0CB", ".+ c #839BBB", ".@ c #C9E1F9", ".# c #F4F4F5", ".$ c #CED1D3", ".% c #E0EFFF", ".& c #4F80B6", ".* c #CEDBEA", ".= c #5D7DA6", ".- c #5A79A3", ".; c #5877A1", ".: c #E0E5EB", ".> c #94ACC8", "., c #7E97B9", ".< c #6C96C5", ".1 c #BECBDA", ".2 c #E6EBF4", ".3 c #DAEBFC", ".4 c #D4E5F6", ".5 c #E4E6E8", ".6 c #E2E4E6", ".7 c #9CBDE0", ".8 c #6380A8", ".9 c #C7CDD2", ".0 c #ACCAE9", ".q c #BBC9DA", ".w c #9DB3CD", ".e c #5E7AA3", ".r c #FDFDFD", ".t c #BCD7F2", ".y c #FBFBFB", ".u c #5A769F", ".i c #F9F9F9", ".p c #58749D", ".a c #AABED3", ".s c #F5F5F5", ".d c #E1F0FF", ".f c #EFEFEF", ".g c #BECAD6", ".h c #BCC8D4", ".j c #5876A0", ".k c #719BC9", ".l c #B5D1EE", ".z c #B8BFC6", ".x c #576F95", ".c c #D5DFE9", ".v c #DEEEFF", ".b c #B8C9DD", ".n c #627BA3", ".m c #101221", ".M c #AEB5BC", ".N c #AFBFD4", ".B c #4B6189", ".V c #D3D3D3", ".C c #D1D1D1", ".Z c #7994B6", ".A c #DCDDDF", ".S c #B4C7DC", ".D c #9FB4CE", ".F c #A4B5C9", ".G c #9CB2CB", ".H c #708AAD", ".J c #CCE3FA", ".K c #ABBDD3", ".L c #B3CCE8", ".P c #E2F1FF", ".I c #617FA8", ".U c #DEEDFB", ".Y c #D5E8FC", ".T c #5977A0", ".R c None", /* pixels */ ".R.R.R.R.R.j e ( t =.R.R.R.R.R.R", ".R.R.R.e.+.q c.2 ` D., *.R.R.R.R", ".R.R l ;.: / J.1 8.g L ~.-.R.R.R", ".R X.N Q.$. .U.4.h N 5 M a (.R.R", ".n W 2 : d.P } ^ u x.#.y.c.Z.R.R", ".H r g 4.%.d.d.3.9 s.F 3.5 p (.R", ".8 i.a.J.v # #.*.r z.r.6.A w (.R", " e V.0.t.@.Y E U z z z.i.M [ (.R", " b m 0 |.L.l , K 9 O z.f P.b (.R", " k.K o z h _.7 $ @ +.s C T.w (.R", " < H ! z z % j Z 7.< A.V ' Y.R.R", ".R.I.G F v.z.k G n f.C -.> (.R.R", ".R.R.=.O ] R ) {.& > 1 y *.R.R.R", ".R.R.R I...D S q.S.o 6.T.R.R.R.R", ".R.R.R.R.x.u.- & t.p.R.R.R.R.R.R", ".R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R" }; /* actions/list-add.png */ /* XPM */ const char *tango_list_add[] = { /* width height ncolors chars_per_pixel */ "16 16 20 1", /* colors */ " c #000000", ". c #7DA6D7", "X c #86ADD9", "o c #9FBEE0", "O c #B6CCE6", "+ c #83AAD8", "@ c #BBD1E7", "# c #7FA8D7", "$ c #94B6DB", "% c #3465A4", "& c #95B7DB", "* c #B5CCE6", "= c #B4CCE5", "- c #92B4DA", "; c #B6CDE6", ": c #B7CEE6", "> c #90B3DA", ", c #C0D3E8", "< c #BCD1E7", "1 c None", /* pixels */ "1111111111111111", "1111111111111111", "111111%%%%111111", "111111%::%111111", "111111%::%111111", "111111%::%111111", "11%%%%%::%%%%%11", "11%,@<::::;*O%11", "11%=&$->X+#.o%11", "11%%%%%XX%%%%%11", "111111%:X%111111", "111111%:X%111111", "111111%::%111111", "111111%%%%111111", "1111111111111111", "1111111111111111" }; /* apps/preferences-desktop-font.png */ /* XPM */ const char *tango_preferences_desktop_font[] = { /* width height ncolors chars_per_pixel */ "16 16 79 1", /* colors */ " c #000000", ". c #B1B1B1", "X c #ADADAD", "o c #A7A7A7", "O c #797979", "+ c #EAEBEB", "@ c #E9E9EA", "# c #E8E9E9", "$ c #5F5F5F", "% c #4D4D4D", "& c #4B4B4B", "* c #FCFCFC", "= c #494949", "- c #FAFAFA", "; c #474747", ": c #F8F8F8", "> c #F6F6F6", ", c #F4F4F4", "< c #F2F2F2", "1 c #F0F0F0", "2 c #EEEEEE", "3 c #ECECEC", "4 c #E8E8E8", "5 c #E6E6E6", "6 c #E5E6E5", "7 c #E4E4E4", "8 c #E2E2E2", "9 c #2F2F2F", "0 c #CECECE", "q c #050505", "w c #EAE9E9", "e c #010101", "r c #E8E7E7", "t c #E7E7E6", "y c #8A8C87", "u c #888A85", "i c #828282", "p c #7C7C7C", "a c #767676", "s c #747474", "d c #E4E4E5", "f c #666666", "g c #626262", "h c #565656", "j c #FFFFFF", "k c #FDFDFD", "l c #4A4A4A", "z c #FBFBFB", "x c #484848", "c c #F9F9F9", "v c #F7F7F7", "b c #F5F5F5", "n c #F3F3F3", "m c #F1F1F1", "M c #EFEFEF", "N c #EDEDED", "B c #ECEDEC", "V c #ECEBEC", "C c #EBEBEB", "Z c #EAEBEA", "A c #E9E9E9", "S c #E6E7E6", "D c #343434", "F c #E4E5E4", "G c #E4E3E4", "H c #E3E3E3", "J c #2E2E2E", "K c #2C2C2C", "L c #DBDBDB", "P c #222222", "I c #D3D3D3", "U c #202020", "Y c #BFBFBF", "T c #B8B9B8", "R c #060606", "E c #ECECEB", "W c #040404", "Q c #EBEAEA", "! c None", /* pixels */ "!uuuuuuuuuuuuuu!", "ujjjjjjjjjjjjjju", "ujHoi99H5555HHku", "ujH8L09H4A44HHku", "ujH.9s95S56dGHku", "ujH9IY9AAw#r5Fzu", "uj7999T&9BV+Atzu", "uj53N2M;K1M2E@:u", "uj4NM1mxUD eg<>u", "ujwM1=RmzI aMu", "uj+<,>vl Ov$ XMu", "ujQ<,>:hJPW %vMu", "uj******--->>>Mu", "!uuuuuuuuuuuuuu!" }; /* actions/process-stop.png */ /* XPM */ const char *tango_process_stop[] = { /* width height ncolors chars_per_pixel */ "16 16 136 2", /* colors */ " c #000000", " . c #BF0000", " X c #EB4C4C", " o c #F68888", " O c #D89292", " + c #E8BCBC", " @ c #FCF7F7", " # c #EF6A6A", " $ c #DB3C3C", " % c #ED4747", " & c #DF2C2C", " * c #B22424", " = c #B82323", " - c #D75F5F", " ; c #D52F2F", " : c #F58383", " > c #C41B1B", " , c #B41F1F", " < c #F26969", " 1 c #C10101", " 2 c #CC0F0F", " 3 c #E4AAAA", " 4 c #E9A5A5", " 5 c #F68787", " 6 c #D22F2F", " 7 c #C70000", " 8 c #BF1919", " 9 c #F78B8B", " 0 c #E6A5A5", " q c #D13131", " w c #DF2B2B", " e c #BF0505", " r c #D85C5C", " t c #CF2F2F", " y c #BD0303", " u c #E83737", " i c #E6E0E0", " p c #C92929", " a c #FEFEFE", " s c #880000", " d c #CC2F2F", " f c #DB4141", " g c #C10000", " h c #E6ABAB", " j c #E6D9D9", " k c #DA6464", " l c #ECECEC", " z c #EA3F3F", " x c #E8E8E8", " c c #D75757", " v c #DACDCD", " b c #EB4343", " n c #D85B5B", " m c #ED5252", " M c #BD0202", " N c #D31111", " B c #BC1818", " V c #E6DFDF", " C c #E63434", " Z c #B32626", " A c #AF2222", " S c #DB4040", " D c #B41D1D", " F c #EC6161", " G c #EF5A5A", " H c #890303", " J c #D65F5F", " K c #ED6565", " L c #D85A5A", " P c #D65858", " I c #DA3B3B", " U c #E39696", " Y c #E5A5A5", " T c #BE0505", " R c #CE2F2F", " E c #C30000", " W c #D01010", " Q c #E73737", " ! c #B01818", " ~ c #D21F1F", " ^ c #890202", " / c #CB0101", " ( c #870000", " ) c #E83B3B", " _ c #CE2828", " ` c #F17575", " ' c #EE6868", " ] c #BD0000", " [ c #F3EDED", " { c #F68A8A", " } c #DB5F5F", " | c #C70303", ". c #B12222", ".. c #BE0404", ".X c #D75B5B", ".o c #E5DFDF", ".O c #E94545", ".+ c #C71D1D", ".@ c #B72121", ".# c #F9F9F9", ".$ c #DC4242", ".% c #B11B1B", ".& c #F1F1F1", ".* c #9E3333", ".= c #EDEDED", ".- c #F58585", ".; c #F38383", ".: c #DFDFDF", ".> c #DA6767", "., c #DBDBDB", ".< c #F68989", ".1 c #D23131", ".2 c #A43F3F", ".3 c #D02F2F", ".4 c #C50000", ".5 c #D93B3B", ".6 c #D53737", ".7 c #DE9292", ".8 c #DF2D2D", ".9 c #F06F6F", ".0 c #890000", ".q c #C51A1A", ".w c #B11A1A", ".e c #D63B3B", ".r c #D52323", ".t c #EC4A4A", ".y c #E2DEDE", ".u c #D89999", ".i c #DEACAC", ".p c #B82424", ".a c #D76060", ".s c #D53030", ".d c #DAD6D6", ".f c #880202", ".g c #860000", ".h c None", /* pixels */ ".h.h.h.h.0.g.g.g.g.g.g.0.h.h.h.h", ".h.h.h.0 A o 9 9 { 5 : =.0.h.h.h", ".h.h.0. .;.$ ; ; ; ; $ ` ,.0.h.h", ".h.0 *.;.$.6 ; ; ; ;.6 I.9.%.0.h", ".0 Z.; f c v - ; ; r j }.5 # !.0", ".f.< S ; O.,.d.a L i.= Y 6.e '.f", " H o ; ;.s.u.:.y V l h.1.3 R K ^", " H o ; ; ;.s.i x l + q t R d F ^", " H o ; ; ; n V l.& [ k R d p.O ^", " H.- ; ;.X.o l 3 0.# @.>.q M u ^", ".f <.r ~.7 l 3.3 _ 4 a U ] y C ^", ".0.p G N / P |.4 E 1 J M.. w.+ (", ".h.0.@ m W 7.4 E g . ] T & > s.h", ".h.h.0 D X 2 E g . ] e.8 8 s.h.h", ".h.h.h.0.w.t % b z ) Q B s.h.h.h", ".h.h.h.h.0.g.g.g.g.g.g s.h.h.h.h" }; /* actions/view-refresh.png */ /* XPM */ const char *tango_view_refresh[] = { /* width height ncolors chars_per_pixel */ "16 16 100 2", /* colors */ " c #9DBDDC", " . c #6990C0", " X c #3767A6", " o c #3667A5", " O c #3565A4", " + c #DDE8F3", " @ c #8AACD3", " # c #99B9DB", " $ c #B4CBE5", " % c #D8E4F1", " & c #5783BB", " * c #537FB7", " = c #4B77AF", " - c #A0BEDE", " ; c #3868A6", " : c #3768A5", " > c #4C79B3", " , c #769DCF", " < c #5580B5", " 1 c #97B6D8", " 2 c #8FACD0", " 3 c #E4ECF5", " 4 c #4E7AB1", " 5 c #C8D8EA", " 6 c #4C78AF", " 7 c #8FB0D3", " 8 c #6D94C2", " 9 c #6891C7", " 0 c #3C6BA9", " q c #3A69A7", " w c #3969A6", " e c #C6D8EB", " r c #4774AD", " t c #C1D2E6", " y c #6890C0", " u c #CDDBEB", " i c #3465A4", " p c #6188B9", " a c #DBE6F2", " s c #BFD2E7", " d c #84A6CE", " f c #E5EDF5", " g c #C9D9EA", " h c #8FADD2", " j c #A1BEDD", " k c #3A6AA6", " l c #E2EBF5", " z c #88A7CE", " x c #3768A6", " c c #95B2D4", " v c #3566A4", " b c #C4D7EB", " n c #4371AB", " m c #A1BBD9", " M c #E7EEF6", " N c #BFD3E9", " B c #5F87B9", " V c #7298C5", " C c #5D85B7", " Z c #6C95C9", " A c #82A5CE", " S c #9CB7D7", " D c #C9DAEC", " F c #E3ECF5", " G c #4C78B0", " H c #8EAED3", " J c #4F7CB6", " K c #3969A7", " L c #3869A6", " P c #3767A5", " I c #A8C2DF", " U c #93B1D4", " Y c #4170AB", " T c #CCDDEE", " R c #B0C9E3", " E c #E5EDF6", " W c #E4EDF5", " Q c #FFFFFF", " ! c #4D79B0", " ~ c #C7D7E9", " ^ c #4C77AF", " / c #5B84B7", " ( c #D5E2F0", " ) c #3C6CA9", " _ c #3A6AA7", " ` c #E0E9F4", " ' c #A8C1DE", " ] c #8CADD3", " [ c #B4CAE3", " { c #3566A5", " } c #7299CD", " | c #88ABD2", ". c #CCDCED", ".. c #E6EEF6", ".X c #BCD1E7", ".o c #7EA4D5", ".O c #3D6DA9", ".+ c #3C6BA8", ".@ c #3B6BA7", ".# c None", /* pixels */ ".#.#.#.# q _ o K _.#.#.#.#.#.#.#", ".#.#.# ; y 7 I ' U B P.#.#.# i.#", ".#.# w ] j $ N T ( s = o n v.#", ".# K . V.+ v _ C m % a + z 5 _.#", ".# ; Y ) _.#.#.# L p u l.... _.#", ".# O _ 9 P.#.#.#.#.# v ~ e F k.#", ".# i.#.#.#.#.#.#.# ; 2 M a.. k.#", ".#.#.#.#.#.#.#.# i i r ^ ^ 6 i.#", ".# i i i i i i i.#.#.#.#.#.#.#.#", ".# i f E 3 S x.#.#.#.#.#.#.# i.#", ".# v.. b g i.#.#.#.#.# { Z * i.#", ".# P.. F W t ! L.#.#.# 0 J _ :.#", ".# ; % c ` +. h G { w w.O G _.#", ".# P / o 4 [ D.X R - | A H ;.#.#", ".# i o.#.# X < d 1 # @ 8 ;.#.#.#", ".# i.#.#.#.#.# _ L v _.@.#.#.#.#" }; /* actions/go-next.png */ /* XPM */ const char *tango_go_next[] = { /* width height ncolors chars_per_pixel */ "16 16 101 2", /* colors */ " c #8BBB5D", " . c #78B63D", " X c #9CD267", " o c #A7D17F", " O c #B7D49C", " + c #6EAC33", " @ c #C3DCAB", " # c #9EC976", " $ c #C2DCAA", " % c #66B817", " & c #8AC255", " * c #CBE0B6", " = c #3B7504", " - c #5AAC0B", " ; c #66BF10", " : c #5F8F31", " > c #5E8F30", " , c #82AB5A", " < c #6FBA26", " 1 c #9CC37A", " 2 c #54A408", " 3 c #89C350", " 4 c #61B70E", " 5 c #BBD99F", " 6 c #6CBF1C", " 7 c #C0DBA7", " 8 c #74AF3B", " 9 c #4F9C06", " 0 c #3C7804", " q c #3C7604", " w c #4D8418", " e c #A4CC7E", " r c #8BC158", " t c #AFD48C", " y c #CEE3BB", " u c #3A7405", " i c #598C2A", " p c #467C14", " a c #B1D291", " s c #88BB58", " d c #ABD781", " f c #A4C684", " g c #91C164", " h c #5FB20E", " j c #C7DEB0", " k c #C6DEAF", " l c #40790A", " z c #3A7304", " x c #568926", " c c #9BCA6D", " v c #81AB5A", " b c #52A007", " n c #A5D773", " m c #C5DDAD", " M c #4E9A06", " N c #3B7604", " B c #3B7404", " V c #A3CA7E", " C c #427A0E", " Z c #80BE44", " A c #8BBD5C", " S c #64BA11", " D c #AAD581", " F c #82BE49", " G c #92D352", " H c #6BAC2F", " J c #538B1E", " K c #A8DA78", " L c #5BAE0B", " P c #6CBA1F", " I c #8DC25A", " U c #FFFFFF", " Y c #8CBE5C", " T c #8BBC5B", " R c #ABD681", " E c #62B90E", " W c #B9D79C", " Q c #71A63E", " ! c #A0D56C", " ~ c #68A92B", " ^ c #9DC873", " / c #BDD9A3", " ( c #99C46F", " ) c #5EB30D", " _ c #7FCB34", " ` c #8CC358", " ' c #CBE1B7", " ] c #3A7404", " [ c #8DC15C", " { c #57A709", " } c #437A10", " | c #64BC0F", ". c #88C44D", ".. c #AACE89", ".X c #85B954", ".o c #84C249", ".O c #A6D37B", ".+ c #8FC161", ".@ c #6AA136", ".# c #8DC655", ".$ c None", /* pixels */ ".$.$.$.$.$ =.$.$.$.$.$.$.$.$.$.$", ".$.$.$.$.$ z i ].$.$.$.$.$.$.$.$", ".$.$.$.$.$ z ' , ].$.$.$.$.$.$.$", ".$.$.$.$.$ z y @ f }.$.$.$.$.$.$", " ] z z z z N * ( a O : B.$.$.$.$", " z 7 $ m k j j g.+ ^ 5 v u.$.$.$", " z /.X s T A Y [ I & ` t 1 p.$.$", " z W 8 + ~ H . F 3. .o Z c.. > =", " z V M M M b { L h % P <.# # x =", " z V M M 9 2 - ) E | 6 X C.$.$", " z V V V e o D 4 ; _ K Q N.$.$.$", " ] z z z z 0 R S G n J q.$.$.$.$", ".$.$.$.$.$ z d ! r l.$.$.$.$.$.$", ".$.$.$.$.$ z.O.@ q.$.$.$.$.$.$.$", ".$.$.$.$.$ z w N.$.$.$.$.$.$.$.$", ".$.$.$.$.$ =.$.$.$.$.$.$.$.$.$.$" }; /* actions/document-save-as.png */ /* XPM */ const char *tango_document_save_as[] = { /* width height ncolors chars_per_pixel */ "16 16 101 2", /* colors */ " c #000000", " . c #739FC0", " X c #6C8577", " o c #81ADD1", " O c #DFE2DE", " + c #DCDCDB", " @ c #8FB3CE", " # c #96BBD8", " $ c #4A7180", " % c #95A9AF", " & c #B7B8B6", " * c #4E6A7D", " = c #3D698A", " - c #AFB0AE", " ; c #AEB0AD", " : c #ACCBE3", " > c #ABCBE2", " , c #EDEDEE", " < c #E9E9EA", " 1 c #A2A4A1", " 2 c #6B716E", " 3 c #9BC2DF", " 4 c #38678B", " 5 c #6E99B6", " 6 c #FCFCFC", " 7 c #FAFAFA", " 8 c #6B7F88", " 9 c #F4F4F4", " 0 c #F3F4F3", " q c #F2F2F2", " w c #CED4C8", " e c #F0F0F0", " r c #EFEEEF", " t c #EEEEEE", " y c #EDEEED", " u c #ECECEC", " i c #627075", " p c #3F6C8E", " a c #719FBF", " s c #E4E4E4", " d c #79A7CA", " f c #DCDCDC", " g c #DBDCDB", " h c #C9D6DD", " j c #DDE1D6", " k c #D5DFE5", " l c #AEB0AE", " z c #44789F", " x c #5186AF", " c c #7798B0", " v c #ACBCC3", " b c #DCDBDB", " n c #C5DBEC", " m c #3D6B8E", " M c #58787A", " N c #C1D9EB", " B c #6A7F5A", " V c #3B6B8F", " C c #9EBFD9", " Z c #E2E6DD", " A c #9AAEB4", " S c #ABC8DF", " D c #6E706B", " F c #92A6AC", " G c #EEEEEF", " H c #EDEEEE", " J c #427092", " K c #EBECEC", " L c #688BA0", " P c #D0DFEF", " I c #6296BB", " U c #DBDCDC", " Y c #72756B", " T c #92B7D3", " R c #667173", " E c #98BFDC", " W c #FFFFFF", " Q c #FDFDFD", " ! c #FCFBFC", " ~ c #F9F9F9", " ^ c #F7F7F7", " / c #AFB0AD", " ( c #F3F3F3", " ) c #F1F1F1", " _ c #41749A", " ` c #EFEFEF", " ' c #EEEFEE", " ] c #CACFC4", " [ c #EDEDED", " { c #EAE9EA", " } c #A3A4A1", " | c #C5CBBF", ". c #4A6D85", ".. c #436E88", ".X c #E3E3E3", ".o c #DCDBDC", ".O c #5892BD", ".+ c #B1CEE6", ".@ c #4D7991", ".# c #547D9B", ".$ c None", /* pixels */ ".$.$.$ 4 4 4 = $ M.$.$.$.$.$.$.$", ".$.$.$.+ P n 3 L...$.$.$.$.$.$.$", " 8 R i. _ z C N x * D D D D D D", " 2 Z W j h 5 4 > T.# k W W W 9 D", " Y Q t [ O c 4 d @ m v , H y 0 D", " D ! K 4 4 4 4 d.O 4 4 4 4 u ( D", " D 7 < ] 4 E a a a . # 4 % { q D", " D ~ 7 s | 4 E . . S 4 F s 9 ) D", " D ~ t 7 s | 4 : E V F s 7 t ) D", " D ^.X t 7 7 w p 4 A 7 6 t.X e D", " D } 1 } } } } } } } } } } } } D", " D f b + f.o +.o f g U + U f D", " D ` / l - ; / / / / r ' G r D", " D W & & & & & & & & W W W W D", " D W W W W W W W W W W W W W D", " D D D D D D D D D D D D D D D D" }; /* actions/document-save.png */ /* XPM */ const char *tango_document_save[] = { /* width height ncolors chars_per_pixel */ "16 16 114 2", /* colors */ " c #000000", " . c #739FC0", " X c #AFAFAF", " o c #6C8577", " O c #81ADD1", " + c #DFE2DE", " @ c #A9A9A9", " # c #A8A7A8", " $ c #8FB3CE", " % c #9F9F9F", " & c #96BBD8", " * c #4A7180", " = c #95A9AF", " - c #B7B6B6", " ; c #4E6A7D", " : c #3D698A", " > c #AAAAA9", " , c #ACCBE3", " < c #ABCBE2", " 1 c #EDEDEE", " 2 c #E9E9EA", " 3 c #6B716E", " 4 c #9BC2DF", " 5 c #38678B", " 6 c #6E99B6", " 7 c #FEFEFE", " 8 c #FCFCFC", " 9 c #FAFAFA", " 0 c #6B7F88", " q c #F4F4F4", " w c #F3F4F3", " e c #F2F2F2", " r c #CED4C8", " t c #F0F0F0", " y c #EEEEEE", " u c #EDEEED", " i c #ECECEC", " p c #627075", " a c #3F6C8E", " s c #719FBF", " d c #E4E4E4", " f c #79A7CA", " g c #DCDCDC", " h c #D6D6D6", " j c #C9D6DD", " k c #D2D2D2", " l c #D0D0D0", " z c #CECECE", " x c #DDE1D6", " c c #CACACA", " v c #C8C8C8", " b c #C4C4C4", " n c #C2C2C2", " m c #BCBCBC", " M c #D5DFE5", " N c #B4B4B4", " B c #44789F", " V c #5186AF", " C c #7798B0", " Z c #ACBCC3", " A c #C5DBEC", " S c #3D6B8E", " D c #58787A", " F c #C1D9EB", " G c #6A7F5A", " H c #3B6B8F", " J c #9EBFD9", " K c #E2E6DD", " L c #9AAEB4", " P c #ABC8DF", " I c #6E706B", " U c #92A6AC", " Y c #A8A7A7", " T c #EDEEEE", " R c #427092", " E c #EBECEC", " W c #688BA0", " Q c #D0DFEF", " ! c #6296BB", " ~ c #72756B", " ^ c #92B7D3", " / c #667173", " ( c #98BFDC", " ) c #FFFFFF", " _ c #FDFDFD", " ` c #FCFBFC", " ' c #F9F9F9", " ] c #F7F7F7", " [ c #F3F3F3", " { c #F1F1F1", " } c #41749A", " | c #CACFC4", ". c #EDEDED", ".. c #EBEBEB", ".X c #EAE9EA", ".o c #C5CBBF", ".O c #4A6D85", ".+ c #436E88", ".@ c #E3E3E3", ".# c #DDDDDD", ".$ c #D5D5D5", ".% c #D1D1D1", ".& c #CFCFCF", ".* c #CDCDCD", ".= c #CBCBCB", ".- c #C9C9C9", ".; c #5892BD", ".: c #C5C5C5", ".> c #C3C3C3", "., c #B1CEE6", ".< c #4D7991", ".1 c #B9B9B9", ".2 c #547D9B", ".3 c None", /* pixels */ ".3.3.3 5 5 5 : * D.3.3.3.3.3.3.3", ".3.3.3., Q A 4 W.+.3.3.3.3.3.3.3", " 0 / p.O } B J F V ; I I I I I I", " 3 K ) x j 6 5 < ^.2 M ) ) ) q I", " ~ _ y. + C 5 f $ S Z 1 T u w I", " I ` E 5 5 5 5 f.; 5 5 5 5 i [ I", " I 9 2 | 5 ( s s s . & 5 =.X e I", " I ' 9 d.o 5 ( . . P 5 U d q { I", " I ' y 9 d.o 5 , ( H U d 9 y { I", " I ].@ y 9 9 r a 5 L 9 8 y.@ t I", " I 7 ) ) ) ) ) ) ) q q.....@ t I", " I z.-.-.-.-.:.-.-.:.:.:.:.: h I", " I z.: % X m b v l @ k @ k.1 c I", " I.*.> > N n b v.= #.% Y.% - c I", " I.# g g g.$.$.&.&.&.&.&.&.& c I", " I I I I I I I I I I I I I I I I" }; /* actions/system-shutdown.png */ /* XPM */ const char *tango_system_shutdown[] = { /* width height ncolors chars_per_pixel */ "16 16 66 1", /* colors */ " c #ABABAB", ". c #A9A9A9", "X c #8F8F8F", "o c #858585", "O c #7D7D7D", "+ c #6F6F6F", "@ c #6D6D6D", "# c #656565", "$ c #616161", "% c #5F5F5F", "& c #555555", "* c #515151", "= c #F6F6F6", "- c #F4F4F4", "; c #F0F0F0", ": c #EEEEEE", "> c #ECECEC", ", c #EAEAEA", "< c #E8E8E8", "1 c #E6E6E6", "2 c #E4E4E4", "3 c #E2E2E2", "4 c #E0E0E0", "5 c #2D2D2D", "6 c #DEDEDE", "7 c #2B2B2B", "8 c #272727", "9 c #D8D8D8", "0 c #D4D4D4", "q c #D2D2D2", "w c #CCCCCC", "e c #C2C2C2", "r c #BCBCBC", "t c #A6A6A6", "y c #A2A2A2", "u c #A0A0A0", "i c #888A85", "p c #8E8E8E", "a c #848484", "s c #808080", "d c #7A7A7A", "f c #6C6C6C", "g c #606060", "h c #F7F7F7", "j c #F5F5F5", "k c #F3F3F3", "l c #F1F1F1", "z c #EFEFEF", "x c #EDEDED", "c c #EBEBEB", "v c #E9E9E9", "b c #E7E7E7", "n c #E5E5E5", "m c #E3E3E3", "M c #E1E1E1", "N c #DFDFDF", "B c #282828", "V c #C9C9C9", "C c #C7C7C7", "Z c #C5C5C5", "A c #C3C3C3", "S c #C1C1C1", "D c #BBBBBB", "F c #B9B9B9", "G c #B3B3B3", "H c None", /* pixels */ "HiiiiiiiiiiiiiiH", "immmmmmmmmmmmmmi", "i3mz=hhhhhhh=1mi", "imz=jjjjjjjjjk2i", "in-kkwaooop;kkbi", "i1-ll*****B3lli", "ix,22dC>>m%22m:i", "i:<33O6jjj+63Mzi", "iz144oyeeDO946;i", "iz,66wf@$f q6Nli", "izlcMM6rSZV0M;li", "illlllllllllllli", "HiiiiiiiiiiiiiiH" }; /* places/start-here.png */ /* XPM */ const char *tango_start_here[] = { /* width height ncolors chars_per_pixel */ "16 16 53 1", /* colors */ " c #6593C6", ". c #5080B8", "X c #3869A7", "o c #3667A5", "O c #2F5F9E", "+ c #4474AF", "@ c #4272AD", "# c #234E8B", "$ c #214C89", "% c #204A88", "& c #507FB7", "* c #3A6AA8", "= c #295694", "- c #3868A6", "; c #5E8CC1", ": c #214B88", "> c #25518F", ", c #2C5B99", "< c #3667A6", "1 c #3465A4", "2 c #4070AC", "3 c #25508E", "4 c #24508D", "5 c #6492C5", "6 c #2A5896", "7 c #4E7DB6", "8 c #3768A6", "9 c #3566A4", "0 c #3162A0", "q c #30609F", "w c #729FCF", "e c #5B8ABF", "r c #4575B0", "t c #244F8C", "y c #214B89", "u c #204B88", "i c #6895C8", "p c #6795C7", "a c #5180B8", "s c #285593", "d c #31619F", "f c #2F5F9D", "g c #5D8BC0", "h c #FFFFFF", "j c #6B98CA", "k c #6996C8", "l c #5483BA", "z c #204A87", "x c #3D6EAA", "c c #2D5C9A", "v c #3566A5", "b c #234F8C", "n c None", /* pixels */ "nnnnnnnnnn%z:nnn", "nno9-nnnnn#d6unn", "nnxklunn", "nn2 ronnnnzzunnn", "nnvv c #B1CEEC", " , c #607AA3", " < c #B3C1D0", " 1 c #B5BEC8", " 2 c #5B6D94", " 3 c #5A6B93", " 4 c #CCDDEF", " 5 c #DBDEE0", " 6 c #7591B4", " 7 c #759FCB", " 8 c #BED4EB", " 9 c #F8F9F9", " 0 c #B7C2CD", " q c #BECFE1", " w c #BCCDDF", " e c #506A96", " r c #5978A2", " t c #93ABC7", " y c #B4BCCD", " u c #C6CFD8", " i c #A3B8D0", " p c #843345", " a c #A0B4CD", " s c #516790", " d c #BEC7D0", " f c #CAD5DF", " g c #5988BC", " h c #DFE1E3", " j c #83A7CE", " k c #AFB8CB", " l c #FEFEFE", " z c #D7D9DB", " x c #5C77A1", " c c #DCE4ED", " v c #F6F6F6", " b c #6B7B9F", " n c #628FC1", " m c #E6EBF0", " M c #C0C6CE", " N c #768BAD", " B c #E2E2E2", " V c #80A7D1", " C c #E0E0E0", " Z c #B7C8DC", " A c #B1C2D6", " S c #DCE3E9", " D c #6B96C6", " F c #705472", " G c #9E080B", " H c #7A95B7", " J c #656588", " K c #4E648F", " L c #6F5674", " P c #BABFC4", " I c #A9BCD1", " U c #D9E1E9", " Y c #CED0D1", " T c #6983A6", " R c #C8CFD5", " E c #8593B1", " W c #546E98", " Q c #A40000", " ! c #D9DCDF", " ~ c #9DA6AE", " ^ c #6D90B7", " / c #686284", " ( c #991116", " ) c #D2E5F9", " _ c #ADB9CE", " ` c #D6DFE9", " ' c #A3B6CE", " ] c #DAEAFA", " [ c #CFD9E2", " { c #5A7AA4", " } c #5C8ABD", " | c #A2BDDA", ". c #597199", ".. c #D5DFEB", ".X c #A5B7C9", ".o c #CCD7E2", ".O c #C3D2E3", ".+ c #5686BA", ".@ c #E3F1FF", ".# c #C8CED4", ".$ c #E2EFFE", ".% c #7792B6", ".& c #516994", ".* c #9BB2CC", ".= c #9AB0CB", ".- c #9EADC5", ".; c #C9E1F9", ".: c #F4F4F5", ".> c #CED1D3", "., c #E0EFFF", ".< c #4F80B6", ".1 c #CEDBEA", ".2 c #405583", ".3 c #5D7DA6", ".4 c #5A79A3", ".5 c #94ACC8", ".6 c #7E97B9", ".7 c #6C96C5", ".8 c #BECBDA", ".9 c #C4CAD6", ".0 c #E6EBF4", ".q c #DAEBFC", ".w c #D4E5F6", ".e c #E4E6E8", ".r c #E2E4E6", ".t c #9CBDE0", ".y c #6E5471", ".u c #95A7C2", ".i c #C7CDD2", ".p c #ACCAE9", ".a c #9DB3CD", ".s c #FDFDFD", ".d c #BCD7F2", ".f c #FBFBFB", ".g c #5A769F", ".h c #F9F9F9", ".j c #58749D", ".k c #AABED3", ".l c #F5F5F5", ".z c #E1F0FF", ".x c #EFEFEF", ".c c #BECAD6", ".v c #BCC8D4", ".b c #719BC9", ".n c #B5D1EE", ".m c #B8BFC6", ".M c #364878", ".N c #576F95", ".B c #D5DFE9", ".V c #DEEEFF", ".C c #B8C9DD", ".Z c #101221", ".A c #AEB5BC", ".S c #4B6189", ".D c #D3D3D3", ".F c #D1D1D1", ".G c #7994B6", ".H c #DCDDDF", ".J c #931821", ".K c #B4C7DC", ".L c #9FB4CE", ".P c #A4B5C9", ".I c #9CB2CB", ".U c #CCE3FA", ".Y c #B3CCE8", ".T c #E2F1FF", ".R c #617FA8", ".E c #DEEDFB", ".W c #D5E8FC", ".Q c None", /* pixels */ ".Q.M.M.M.M.M.M.M r =.Q.Q.Q.Q.Q.Q", ".Q.Q.M.M.M b c.0.. A.6 *.Q.Q.Q.Q", ".Q.Q W 3 y [ P.8 8.c U '.4.Q.Q.Q", ".Q. 3.9.>.$.E.w.v M 5 m a {.Q.Q", " K.M k ; f.T.@ ] u z.:.f.B.G.Q.Q", " s 2 ! 4.,.z.z.q.i d.P 1.e i {.Q", ".2 E.k.U.V @ @.1.s l.s.r.H w /.Q", ".M _.p.d.;.W ) R l l l.h.A.O F.Q", " e.- 0.#.Y.n > I 9 o l.x Y.C L.Q", " x.u X l h |.t # + O.l B ~.a p Q", " , H ` l l $ j V 7.7 C.D.X N ( Q", ".Q.R.I S v.m.b D n g.F -.5 % Q.Q", ".Q.Q.3.=.o ^ }.+.< : < t J G.Q.Q", ".Q.Q.Q T.%.L Z q.K.* 6.y G.Q.Q.Q", ".Q.Q.Q.Q.N.g.4 & r.j.J Q Q Q.Q.Q", ".Q.Q.Q.Q.Q.Q.Q.Q Q Q Q Q Q Q Q.Q" }; /* apps/system-users.png */ /* XPM */ const char *tango_system_users[] = { /* width height ncolors chars_per_pixel */ "16 16 147 2", /* colors */ " c #000000", " . c #F3BE71", " X c #ECBD74", " o c #4071AF", " O c #E6AA4D", " + c #868F41", " @ c #4A78B2", " # c #7E6040", " $ c #AF7D2E", " % c #E3A340", " & c #3263A1", " * c #547FB5", " = c #905841", " - c #616519", " ; c #797F37", " : c #B99355", " > c #6C3F3B", " , c #E3A23C", " < c #EBAA5B", " 1 c #4172AF", " 2 c #F6CB8A", " 3 c #E5A255", " 4 c #D1A55F", " 5 c #C0934B", " 6 c #6D4A0A", " 7 c #9F5203", " 8 c #6A692B", " 9 c #8BA6C9", " 0 c #D08F4A", " q c #723C51", " w c #3E558E", " e c #E3A256", " r c #F3C680", " t c #5C3B59", " y c #3466A5", " u c #895443", " i c #C2893C", " p c #6087B9", " a c #5A3464", " s c #C16710", " d c #3568A9", " f c #DDA053", " g c #AF8033", " h c #BC8E43", " j c #ECB868", " k c #C29142", " l c #8B6B58", " z c #8E5105", " x c #5A85B9", " c c #614D7E", " v c #687214", " b c #90563F", " n c #DAAE6D", " m c #D8994A", " M c #5F86B7", " N c #E6A251", " B c #645370", " V c #E0992A", " C c #D6DBE3", " Z c #E5A746", " A c #3467A7", " S c #E09B2D", " D c #BF6C10", " F c #767B35", " G c #829FC5", " H c #32629E", " J c #B78940", " K c #616B09", " L c #F1BD6F", " P c #864F06", " I c #5E83B2", " U c #386DB1", " Y c #3D538B", " T c #C77D28", " R c #485F99", " E c #3364A2", " W c #3264A1", " Q c #E1A23E", " ! c #6F7131", " ~ c #955104", " ^ c #6D712F", " / c #E8AA5C", " ( c #B88530", " ) c #624F0D", " _ c #C16404", " ` c #BA5C11", " ' c #E5AE5C", " ] c #D9AC64", " [ c #DDAB5E", " { c #815107", " } c #AA7722", " | c #A9A3B9", ". c #F9C780", ".. c #A0B6D1", ".X c #C4680A", ".o c #6B8BB4", ".O c #8DA7C8", ".+ c #B68134", ".@ c #C38F44", ".# c #E2B369", ".$ c #596921", ".% c #465440", ".& c #CC5E01", ".* c #C49A52", ".= c #6A6A2B", ".- c #CC5E04", ".; c #B98633", ".: c #5C3566", ".> c #DCA552", "., c #A35403", ".< c #55315F", ".1 c #4576B2", ".2 c #965435", ".3 c #B4C1D3", ".4 c #EFC075", ".5 c #885106", ".6 c #366BAD", ".7 c #BC7625", ".8 c #32629F", ".9 c #30609D", ".0 c #EBBC74", ".q c #5680B5", ".w c #DF8E3A", ".e c #D56402", ".r c #3466A4", ".t c #3364A3", ".y c #CB9A51", ".u c #685D14", ".i c #6E771D", ".p c #3B6EAE", ".a c #815330", ".s c #B0B6CB", ".d c #4F649A", ".f c #C99C66", ".g c #3568A8", ".h c #9E5807", ".j c #B85410", ".k c #E6AD54", ".l c #5981B4", ".z c #844240", ".x c #366AAC", ".c c #D16604", ".v c #A6ACC4", ".b c #CF9D51", ".n c #F0CE99", ".m c #CD5C00", ".M c None", /* pixels */ ".M.M.M.M P ~ z.,.M.M.M.M.M.M.M.M", ".M.M.M.c m 4.b.@ 7.M.M.M.M.M.M.M", ".M.M.h f.* 5.;.7 s.m.&.m.M.M.M.M", ".M.M.5.y h : T.X N 2 . /.m.M.M.M", ".M.M { k ( J D < r.0 O.4.w.m.M.M", ".M.M ) i g }.e. X.n.k , '.m.M.M", ".M.M >.a.+ $ _ L Z.# S Q.>.m.M.M", ".M.% ^ - # 6.u 3 j V % ] 0.j.M.M", ".% F.i + + 8 q = e [ n.f b.z.M.M", ".% F v +.=.: 9 B l.- `.2 u p.:.:", ".% F v v.:.O.x U.s c |.v.g W p.:", ".% F.$ K t p A.6.. C x G y.9.p.:", ".% F ; !.: M.t A d.3.l.r & &.p.:", ".M.%.%.%.: I.t w E.o & H Y.8.p.:", ".M.M.M.M.:.q *.d @ o o o R 1.1.:", ".M.M.M.M.<.:.:.:.:.:.:.:.:.:.: a" }; /* apps/accessories-text-editor.png */ /* XPM */ const char *tango_accessories_text_editor[] = { /* width height ncolors chars_per_pixel */ "16 16 52 1", /* colors */ " c #000000", ". c #B1B1B1", "X c #705B39", "o c #9D9D9D", "O c #C89F64", "+ c #C4A000", "@ c #8F8F8F", "# c #A08457", "$ c #CFAD71", "% c #D2AC6A", "& c #757575", "* c #EBB13D", "= c #717171", "- c #A48757", "; c #636363", ": c #A08356", "> c #EEEEEE", ", c #ECECEC", "< c #EAEAEA", "1 c #EEEAC6", "2 c #EDE6C5", "3 c #DADADA", "4 c #D6D6D6", "5 c #CCCCCC", "6 c #CACACA", "7 c #C2AB8A", "8 c #C4C4C4", "9 c #BCBCBC", "0 c #B8B8B8", "q c #B2B2B2", "w c #AEAEAE", "e c #F9E8C6", "r c #EDE5C4", "t c #4C4226", "y c #A18355", "u c #888A85", "i c #8C8C8C", "p c #868686", "a c #6B5736", "s c #FFFFFF", "d c #EBEBEB", "f c #E9E9E9", "g c #A38555", "h c #CFAA69", "j c #CEA668", "k c #EFEBC7", "l c #DBDBDB", "z c #D3D3D3", "x c #CBCBCB", "c c #8F5902", "v c #B7B7B7", "b c None", /* pixels */ "bbbbbbbbbbbbbbbb", "bbb+b+b+b+b+bbbb", "bb+e+e+e+e+e+bbb", "bu+*+*+*+*+*+ccb", "bud+9+0+0+0+c1$c", "bus,,,,,,,zck%yc", "busl55555vck%-cb", "bus,,,,,zc1h:cbb", "busl555vc2j#cubb", "bus,,,dcrO-c=ubb", "busl5x&X7gc@pubb", "bus,,fctaco4wubb", "buslx8 c;i63qubb", "bus,d<qqqqqqq.qqubb", "buuuuuuuuuuuuubb" }; /* mimetypes/text-x-generic.png */ /* XPM */ const char *tango_text_x_generic[] = { /* width height ncolors chars_per_pixel */ "16 16 22 1", /* colors */ " c #000000", ". c #EDEDE5", "X c #999999", "o c #959595", "O c #818181", "+ c #F2F2F2", "@ c #F0F0F0", "# c #EEEEEE", "$ c #ECECEC", "% c #EAEAEA", "& c #EDEDE6", "* c #C8C8C8", "= c #C6C6C6", "- c #C4C4C4", "; c #FFFFFF", ": c #F1F1F1", "> c #EFEFEF", ", c #EDEDED", "< c #EBEBEB", "1 c #C7C7C7", "2 c #C5C5C5", "3 c None", /* pixels */ "XOOOOOOOOOOOO333", "O;;;;;;;;;;;;O33", "O;$%%<<<$$,@;O33", "O;%-22====1@;O33", "O;%<<$$$,,#@;O33", "O;<2======1@;O33", "O;<<$$,,.$#@;O33", "O;<====##&#@;O33", "O;$$,,##>>>@;O33", "O;$===11***@;O33", "O;$,##>>@:::;O33", "O;,=11***::+;O33", "O;,,#>>@@:++;O33", "O;;;;;;;;;;;;O33", "oOOOOOOOOOOOOo33", "3333333333333333" }; /* mimetypes/x-office-calendar.png */ /* XPM */ const char *tango_x_office_calendar[] = { /* width height ncolors chars_per_pixel */ "16 16 61 1", /* colors */ " c #000000", ". c #686A66", "X c #646662", "o c #818485", "O c #CACAC9", "+ c #C3C4C2", "@ c #959798", "# c #C2C4C4", "$ c #9B9C9A", "% c #4D5254", "& c #3B4042", "* c #393E40", "= c #C9C9CA", "- c #B0B1AE", "; c #AAABA8", ": c #EEEEEE", "> c #ECECEC", ", c #E6E6E6", "< c #E4E4E4", "1 c #E2E2E2", "2 c #E0E0E0", "3 c #939591", "4 c #D6D6D6", "5 c #D2D2D2", "6 c #CDCECD", "7 c #C8C8C8", "8 c #FBFBFA", "9 c #E3E3E2", "0 c #636561", "q c #61635F", "w c #B0B2B3", "e c #555753", "r c #898C86", "t c #888A85", "y c #4A5052", "u c #A0A2A3", "i c #7C7E79", "p c #C2C3C1", "a c #404648", "s c #383E40", "d c #B8B9B7", "f c #C8C9CA", "g c #32383A", "h c #2E3436", "j c #4C5153", "k c #414748", "l c #FFFFFF", "z c #FDFDFD", "x c #C5C6C6", "c c #F3F3F3", "v c #F1F1F1", "b c #E9E9E9", "n c #E7E7E7", "m c #E3E3E3", "M c #E1E1E1", "N c #DFDFDF", "B c #D9D9D9", "V c #CECFCE", "C c #CACBCA", "Z c #6E706C", "A c None", /* pixels */ "AAttAAAtAAAtAAAA", "AtttttttttttttAA", "tlt+llt4zzt4zltA", "tlt3,,tt9,tt,ltA", "tl4B,,44<,444ltA", "il,:v,VCdc-$XA", "Xlllllllllll;ZXA", "0qqqqqqqqqqqqqXA", "AhteeeeeeeeeehAA", "AhhhhhhhhhhhhhAA" }; /* places/user-trash.png */ /* XPM */ const char *tango_user_trash[] = { /* width height ncolors chars_per_pixel */ "16 16 135 2", /* colors */ " c #000000", " . c #6A6C68", " X c #D6DBC8", " o c #686A66", " O c #CCD29D", " + c #D3D8BB", " @ c #5E605C", " # c #A9B260", " $ c #959E49", " % c #BCC662", " & c #8A915C", " * c #CDD2A1", " = c #AAB264", " - c #5D6329", " ; c #BAC36D", " : c #B1B4AD", " > c #7F865E", " , c #6B6D68", " < c #545B23", " 1 c #D4D9BB", " 2 c #989A94", " 3 c #D2D7B9", " 4 c #61635E", " 5 c #B5BB82", " 6 c #C3CA89", " 7 c #A0A956", " 8 c #CCD19F", " 9 c #C8CEA5", " 0 c #A8AD75", " q c #A1A76E", " w c #BDC765", " e c #909946", " r c #D1D793", " t c #98A247", " y c #666D2D", " u c #B8BE84", " i c #BDC675", " p c #939A59", " a c #494D4C", " s c #81893A", " d c #8C9548", " f c #646663", " g c #4E541F", " h c #B2B881", " j c #B6BBA6", " k c #9FA46B", " l c #A5AE49", " z c #D0D691", " x c #788134", " c c #9AA252", " v c #8C9162", " b c #929C4A", " n c #ACB27E", " m c #545B21", " M c #797B77", " N c #757773", " B c #737571", " V c #737B32", " C c #6D6F6B", " Z c #CAD184", " A c #C7CC8B", " S c #919A4C", " D c #8A9259", " F c #B8C065", " G c #767B77", " H c #D4D9BC", " J c #636561", " K c #D3D9BB", " L c #61682A", " P c #879042", " I c #6F7731", " U c #969F4A", " Y c #BDC763", " T c #BBC561", " R c #9FA956", " E c #7A8235", " W c #B5C051", " Q c #A9B259", " ! c #ADB17E", " ~ c #787A75", " ^ c #798237", " / c #BCC286", " ( c #B8C257", " ) c #CDD590", " _ c #B7BE81", " ` c #70726D", " ' c #575E26", " ] c #535A22", " [ c #686A65", " { c #666863", " } c #62645F", " | c #C4CB9E", ". c #A7AF67", ".. c #A9AD94", ".X c #5C5E59", ".o c #BCC661", ".O c #A8B154", ".+ c #8B9348", ".@ c #CBD09E", ".# c #4C521E", ".$ c #8B943E", ".% c #A5AC72", ".& c #AEB75D", ".* c #ADB75C", ".= c #AAB263", ".- c #565D21", ".; c #A6AF55", ".: c #B2BB64", ".> c #767F33", "., c #CCD28E", ".< c #B2BD50", ".1 c #C3CA99", ".2 c #5B6129", ".3 c #96A04F", ".4 c #888E69", ".5 c #C9D181", ".6 c #BBC469", ".7 c #BBC55F", ".8 c #B9C35D", ".9 c #899245", ".0 c #6C732F", ".q c #BFC687", ".w c #B3BD5A", ".e c #A3AB72", ".r c #B3BE50", ".t c #98A150", ".y c #C7D07E", ".u c #9CA64D", ".i c #727470", ".p c #DBE0D7", ".a c #70726E", ".s c #C9D18D", ".d c #ADB757", ".f c #949D4F", ".g c None", /* pixels */ ".g.g.g.g.g.g.g.g.g.g.g.g.g.g.g.g", ".g.g < < < < < < < < < < < <.g.g", ".g >.p.p.p.p.p.p.p.p.p.p.p.p.4.g", " <.p G.X @ 4 J { o , C `.i :.p <", " <.p a } f [ . C.a B N ~ M 2.p <", " < j.p.p.p.p.p.p.p.p.p.p.p.p.. <", " < < p E x.> V I.0 y L -.2 ' < ]", ".g <.y W W.r l.; = t.$ s ^ D <.g", ".g <.y W W.< F X X.@ 7 $ d & <.g", ".g <.5 W W O ;.: 8 * R c.f k <.g", ".g < Z (.o 1 X.* Q # _.t S.% <.g", ".g < z w Y K i.& 9.= 3.3.+ 0 <.g", ".g < r % T.6 *.1 H +. b.9.e <.g", ".g < ).7.8.w.d.O |.u U e P q <.g", ".g < !.,.s A 6.q / u 5 h n v <.g", ".g.g < < < < < < < < < < < <.g.g" }; /* apps/utilities-system-monitor.png */ /* XPM */ const char *tango_utilities_system_monitor[] = { /* width height ncolors chars_per_pixel */ "16 16 116 2", /* colors */ " c #000000", " . c #8199BA", " X c #DEE0DD", " o c #EDEAB0", " O c #F6F8FB", " + c #F5F8FA", " @ c #316696", " # c #4280AD", " $ c #407EAB", " % c #316A99", " & c #7D7D7A", " * c #2F6697", " = c #F1F6F9", " - c #2C6294", " ; c #3772A2", " : c #BFCFA0", " > c #97B893", " , c #E7E8B0", " < c #E4E5E2", " 1 c #E2E3E0", " 2 c #DFE1DD", " 3 c #BBC774", " 4 c #265987", " 5 c #D7D9D5", " 6 c #D5D7D3", " 7 c #4D8DB7", " 8 c #98C0D9", " 9 c #CCCFCA", " 0 c #EEE788", " q c #4D8FBA", " w c #D7E5EF", " e c #3D79A7", " r c #3D77A7", " t c #4A8DB7", " y c #7792B5", " u c #FEFEFE", " i c #F9FAF9", " p c #B6C496", " a c #829B7A", " s c #90AF8B", " d c #89A584", " f c #85A180", " g c #E9F1F6", " h c #C9CCC6", " j c #5294BE", " k c #346A9A", " l c #D8E6EF", " z c #316697", " x c #4D8EB9", " c c #D6E4ED", " v c #2C6292", " b c #3A74A3", " n c #4584B1", " m c #346E9D", " M c #B4B6B1", " N c #316A9A", " B c #F9F9F8", " V c #EFF4F8", " C c #F4F5F3", " Z c #8CAA86", " A c #89A483", " S c #87A481", " D c #E5E7E4", " F c #829C7C", " G c #2C5D8E", " H c #DCDDDB", " J c #5495BF", " K c #BAD1E1", " L c #4887B3", " P c #7E7E7B", " I c #3D7BA8", " U c #F0F5F8", " Y c #BECE9F", " T c #DBDCD9", " R c #DADCD8", " E c #D3D6D1", " W c #D0D2CE", " Q c #2C6090", " ! c #CBCEC9", " ~ c #4280AC", " ^ c #488AB5", " / c #3772A1", " ( c #FFFFFF", " ) c #34709E", " _ c #4284AF", " ` c #346E9E", " ' c #316C9B", " ] c #FAFBFA", " [ c #96B691", " { c #F8F9F8", " } c #3D7CAA", " | c #94B48F", ". c #F6F7F6", ".. c #93B28E", ".X c #849E7C", ".o c #204A87", ".O c #91B08C", ".+ c #90AE8B", ".@ c #8EAC89", ".# c #8BAA86", ".$ c #D5DBA7", ".% c #D3D9A5", ".& c #85A280", ".* c #D6E3ED", ".= c #3D77A6", ".- c #4587B1", ".; c #4283AE", ".: c #B4B7B1", ".> c #96B590", "., c #F0F5F9", ".< c #EEEEED", ".1 c #8BA785", ".2 c #BACA9C", ".3 c #E9EAE8", ".4 c #B7C699", ".5 c None", /* pixels */ " P P P P P P P P P P P P P P P &", " P B { ( ( ( ( ( ( ( ( u ] ] ] P", " P B y.o.o.o.o.o.o.o.o.o.o y H P", " P u.o 4 G - a F ' N % @ v.o D P", " P u.o Q z.X o.& b b ; ) k.o 1 P", " P u.o * ` p V.4.1 } I.= /.o X P", " P u.o m S.% K c.@ n.; $ e.o T P", " P u.o f d.*.2 w.O 3 s.@.#.o 5 P", " P u.o + O.$.O l Y 0 =., U.o E P", " P u.o A Z.+.. : g 8 |.O.@.o W P", " P u.o r # L x [ , >.> 7 n.o 9 P", " P u.o.= ~.- t | J j q ^ _.o h P", " P B ..o.o.o.o.o.o.o.o.o.o y M P", " P B. i C.<.3 < 2 R 6 W !.:.: P", " P P P P P P P P P P P P P P P &", ".5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5" }; /* apps/utilities-terminal.png */ /* XPM */ const char *tango_utilities_terminal[] = { /* width height ncolors chars_per_pixel */ "16 16 163 2", /* colors */ " c #000000", " . c #A0A19D", " X c #8E9F74", " o c #8C9D72", " O c #9A9B97", " + c #989995", " @ c #DDDEDC", " # c #849074", " $ c #939590", " % c #D7D8D6", " & c #8F918C", " * c #374525", " = c #8D8F8A", " - c #CDCECC", " ; c #81837E", " : c #E0E3DB", " > c #ACBC94", " , c #0A0B09", " < c #090908", " 1 c #657C41", " 2 c #AABA92", " 3 c #192011", " 4 c #070706", " 5 c #4F6332", " 6 c #ECEDEA", " 7 c #A5B68D", " 8 c #B2B4B1", " 9 c #DBDBD9", " 0 c #29331D", " q c #26311A", " w c #91928D", " e c #D7D7D5", " r c #364423", " t c #555952", " y c #46572C", " u c #8B8C87", " i c #7E807A", " p c #7D8079", " a c #6A7559", " s c #0F100D", " d c #C0C1BE", " f c #787C74", " g c #777A73", " h c #747870", " j c #A9B990", " k c #6A6E66", " l c #B0B1AE", " z c #D3D6CD", " x c #B1BF9B", " c c #646860", " v c #5F625B", " b c #29341C", " n c #28341B", " m c #828E70", " M c #92958D", " N c #27321A", " B c #374523", " V c #8C8F87", " C c #46562B", " Z c #888B83", " A c #989996", " S c #DDDEDD", " D c #4E5E36", " F c #D7D8D7", " G c #A8B88E", " H c #A3A69D", " J c #B4B6B1", " K c #AFBE98", " L c #F2F3F1", " P c #747772", " I c #768560", " U c #536537", " Y c #182011", " T c #060706", " R c #3C4C27", " E c #4E6132", " W c #3B4A26", " Q c #4C5A3A", " ! c #273119", " ~ c #020302", " ^ c #808D6D", " / c #343633", " ( c #90A076", " ) c #CFD3CB", " _ c #DDDDDC", " ` c #969893", " ' c #616A55", " ] c #4C563D", " [ c #94A27D", " { c #D6D7D5", " } c #8A8C87", " | c #657152", ". c #647151", ".. c #CCCDCB", ".X c #848681", ".o c #131412", ".O c #A2B387", ".+ c #0D0E0C", ".@ c #0B0C0A", ".# c #080807", ".$ c #070806", ".% c #758954", ".& c #4F6232", ".* c #D9DED4", ".= c #7F8C6B", ".- c #2F312D", ".; c #636660", ".: c #73825F", ".> c #27321B", "., c #5A5E57", ".< c #364523", ".1 c #364323", ".2 c #545851", ".3 c #878983", ".4 c #868782", ".5 c #616E4D", ".6 c #82857E", ".7 c #81837D", ".8 c #7E817A", ".9 c #7D7F79", ".0 c #797D75", ".q c #7A846C", ".w c #767972", ".e c #6F736B", ".r c #A3A69E", ".t c #7E8B69", ".y c #7C8967", ".u c #9DA098", ".i c #798764", ".p c #656961", ".a c #999C94", ".s c #CED1C8", ".d c #99A38A", ".f c #62655E", ".g c #979A92", ".h c #859869", ".j c #29351C", ".k c #3B4A27", ".l c #28331B", ".z c #27311A", ".x c #92A279", ".c c #8D9088", ".v c #878A82", ".b c #97A681", ".n c #83867E", ".m c #95A47F", ".M c #232423", ".N c #737D64", ".B c #B7B9B4", ".V c #A4B58A", ".C c #A2A59C", ".Z c #7B8865", ".A c #697850", ".S c #AEBD97", ".D c #CDD2C6", ".F c #181F11", ".G c #060606", ".H c #849071", ".J c #3C4B27", ".K c #28321A", ".L c #273019", ".P c #010201", ".I c None", /* pixels */ ".I.u.a M.c Z.n.8.0 h.e k.p.f.,.I", " H J e S @ _ _ _ _ _ _ 9.. 8 P t", " H { /.#.#.#.#.#.#.#.# 4 4.- A t", ".C F s x K.S > 2 j G 7.V.O O.2", ".C F.+ #.H m ^.=.t.y.Z.i I `.2", ".C F.@.b.m [.x ( X o.h.% 1 $.2", ".C F , a.*.q |. .5 D C C y w.2", ".C F <.:.d :.D.A U E.&.& 5 =.2", ".C F.$ ] ' ) z *.1 r r.< B }.2", ".C F 4 Q.s.N.k W W W.J.J R .3.2", ".C F 4 0.z.L ! L L L 6.K.K .X.2", ".C F T q N.>.>.l.l n b b.j .7.2", ".C F.G.F.F.F.F.F.F.F Y 3 3 i.2", " H %.M ~.P.P.P.P.P.P.P.P.P.o.w t", ".r.B - d l . + $ & u.4 ;.9 g.; t", ".I.u.g M V.v.6 p f h.e k c v.,.I" }; /* status/weather-clear.png */ /* XPM */ const char *tango_weather_clear[] = { /* width height ncolors chars_per_pixel */ "16 16 82 1", /* colors */ " c #000000", ". c #FBBD5B", "X c #FDF4AC", "o c #FCF4AB", "O c #FDF3A2", "+ c #FEFCEF", "@ c #FCB23E", "# c #FCB03E", "$ c #FBAE3D", "% c #FBB94A", "& c #FCE34E", "* c #FAB43F", "= c #FCEB65", "- c #FBBA57", "; c #FCE768", ": c #FCEF82", "> c #FEF8D0", ", c #FEFEFB", "< c #FBB13F", "1 c #FDCD83", "2 c #FEF8E7", "3 c #FDF5B1", "4 c #FCED71", "5 c #FDF6BE", "6 c #FCE55D", "7 c #FCD549", "8 c #FDE6C1", "9 c #FEF9CF", "0 c #FDEAAD", "q c #FEFCF0", "w c #FCB43F", "e c #FCB23F", "r c #FDF4B0", "t c #FCE459", "y c #FCC66D", "u c #FCC470", "i c #FDF08B", "p c #FEF8CE", "a c #FDF0A2", "s c #FBC168", "d c #FCB33E", "f c #FCB13E", "g c #FCAF3E", "h c #FBAF3D", "j c #FBC16E", "k c #FCEC68", "l c #FDE6BF", "z c #FDF3A1", "x c #FAB545", "c c #FBD349", "v c #FCEA57", "b c #FDF4AE", "n c #FCF4AD", "m c #FEF9D0", "M c #FEFCF1", "N c #FCE86E", "B c #FBB43F", "V c #FEF9E7", "C c #FCCC82", "Z c #FBAE3F", "A c #FCEA5A", "S c #FCBC57", "D c #FCD964", "F c #FDF089", "G c #FDECB4", "H c #FDF1AA", "J c #FDF08C", "K c #FEFAE3", "L c #FCE956", "P c #FCEF81", "I c #FCB953", "U c #FEFDF0", "Y c #FCB33F", "T c #FBB13E", "R c #FBDB6C", "E c #FCE959", "W c #FCEF84", "Q c #FCCD84", "! c #FEF9DF", "~ c #FCEF87", "^ c #FCC570", "/ c None", /* pixels */ "////////////////", "///////#f///////", "///////ff///////", "///ge/1CuI/@g///", "///@ylVq!0-Ye///", "////8,+prnax////", "///12UU9XF~Dd///", "/ffQM>m5zPk;Tf#/", "/#f^K3bOJ4Et c #B4C9E2", " , c #7DA3CD", " < c #C5C7A0", " 1 c #D8DAAC", " 2 c #A7A472", " 3 c #C6D6ED", " 4 c #ABC2E3", " 5 c #C5D4EC", " 6 c #717168", " 7 c #8EAED7", " 8 c #C3D4EA", " 9 c #BDC4CD", " 0 c #BCBEA1", " q c #F7FAFC", " w c #DCE6F2", " e c #DDE4F3", " r c #A2AEC3", " t c #626677", " y c #505037", " u c #C0D2E7", " i c #616676", " p c #DBE4F1", " a c #BFD2E6", " s c #868997", " d c #89ACD2", " f c #D9E4EF", " g c #88ACD1", " h c #85A7D8", " j c #848795", " k c #63636E", " l c #A4A686", " z c #4A4A31", " x c #DFE0E1", " c c #B4C9E5", " v c #EEF0F3", " b c #EAEDF9", " n c #7EA3D1", " m c #B3C9E4", " M c #4B4B28", " N c #C6CDCF", " B c #CCDBEC", " V c #CBDBEB", " C c #CBD9EB", " Z c #AFC7E0", " A c #CAD9EA", " S c #E4EDF3", " D c #EBEDBB", " F c #AEC5DF", " G c #1A1A0F", " H c #9EB1CC", " J c #E9EBB9", " K c #C4C698", " L c #DBDC9E", " P c #A7C0E2", " I c #E7E9B7", " U c #C2C496", " Y c #686841", " T c #A8A862", " R c #8BACD7", " E c #A0A499", " W c #8D8D8D", " Q c #F4F7C7", " ! c #D7E4F0", " ~ c #9EA497", " ^ c #626570", " / c #D7E2F0", " ( c #E5E7E0", " ) c #D6E2EF", " _ c #F0F4F8", " ` c #9FBCDA", " ' c #9FBADA", " ] c #B6C9EA", " [ c #83A8CF", " { c #4D4D2D", " } c #73767A", " | c #A7ABAD", ". c #799ED9", ".. c #DBDEE0", ".X c #ECEEF4", ".o c #B7BA8B", ".O c #E4EDF6", ".+ c #C8D9EB", ".@ c #84887A", ".# c #57573A", ".$ c #C7D9EA", ".% c #E2EBF4", ".& c #C7D7EA", ".* c #C6D7E9", ".= c #8FB1D4", ".- c #AAC3DE", ".; c #C5D5E8", ".: c #8FAFD4", ".> c #656976", "., c #B9C4CF", ".< c #7098D0", ".1 c #636774", ".2 c #C0C2C2", ".3 c #616572", ".4 c #606371", ".5 c #D5E0F1", ".6 c #9EBADC", ".7 c #777777", ".8 c #D2E0EE", ".9 c #D1DEED", ".0 c #B6CAE3", ".q c #7FA4CE", ".w c #F8FADB", ".e c #B2B7BE", ".r c #727C93", ".t c #C8CDC3", ".y c #CBD6E7", ".u c #B5B782", ".i c #A7BEE8", ".p c #8FAFD7", ".a c #C4D5EA", ".s c #DEE9F3", ".d c #7098D3", ".f c #6D6D6D", ".g c #DDE7F2", ".h c #A7C1DE", ".j c #C2D3E8", ".k c #DDE5F2", ".l c #F7F9FB", ".z c #C1D3E7", ".x c #8BADD3", ".c c #616775", ".v c #3F3F22", ".b c #616575", ".n c #606574", ".m c #9C9C70", ".M c #A3A359", ".N c #4B4B31", ".B c #515123", ".V c #F0F1F4", ".C c #D5D7BF", ".Z c #CEDEED", ".A c #4C4C28", ".S c #CDDCEC", ".D c #CCDAEB", ".F c #ECEDF0", ".G c #B0C8E0", ".H c #CBDAEA", ".J c #7AA2CC", ".K c #95B4D6", ".L c #6B6E78", ".P c #98AED9", ".I c #C6D5EF", ".U c #79A0CB", ".Y c #B2C5D8", ".T c #6F98D5", ".R c #5B5B5B", ".E c #BABFA1", ".W c #ABAC5A", ".Q c #7099CC", ".! c #595959", ".~ c #DAE5F2", ".^ c #86A8DB", "./ c #D9E5F1", ".( c #ABBCDB", ".) c #A3BFDD", "._ c #BDD1E6", ".` c #D8E3F0", ".' c #A2BDDC", ".] c #80A3DF", ".[ c #D7E3EF", ".{ c #A1BDDB", ".} c #F1F5F8", ".| c #606042", "X c #555555", "X. c #D6E1EE", "XX c #91927C", "Xo c #F2F4C4", "XO c #686A61", "X+ c #F1F4C3", "X@ c #535353", "X# c #83A7CE", "X$ c #555580", "X% c #858459", "X& c #7A9FD9", "X* c #CDCE99", "X= c #7D8290", "X- c #D2D5BF", "X; c #EBEEBD", "X: c #84854E", "X> c #C9DAEB", "X, c #C9D8EB", "X< c #929494", "X1 c #C8D8EA", "X2 c #696C79", "X3 c #464625", "X4 c #C7D8E9", "X5 c #E2EAF3", "X6 c #91B2D5", "X7 c #ACC4DF", "X8 c #C0C2A0", "X9 c #C6D6E8", "X0 c #759ECA", "Xq c #474747", "Xw c #636673", "Xe c #626672", "Xr c #96977A", "Xt c #A8A85A", "Xy c #616471", "Xu c #EFF5F9", "Xi c #BEBE8A", "Xp c #9CB9D9", "Xa c #B7CBE3", "Xs c #D4D68F", "Xd c #81A5CF", "Xf c #9BB9D8", "Xg c #80A5CE", "Xh c #F0F0F0", "Xj c #555744", "Xk c #BFC3AC", "Xl c #A4AFA2", "Xz c #AFC6E5", "Xx c #96AEDD", "Xc c #686C7B", "Xv c #676C7A", "Xb c #A6AC9A", "Xn c #DCDFCF", "Xm c #C4D6E9", "XM c #D9DBA1", "XN c #DDE8F1", "XB c #636876", "XV c #C1D4E6", "XC c #8BAED2", "XZ c #C1D2E6", "XA c #626675", "XS c #9FB8E9", "XD c #DBE4EF", "XF c #A1A495", "XG c #52512D", "XH c #313131", "XJ c #75744C", "XK c #6C7282", "XL c #EBF1F8", "XP c #CFDFED", "XI c #DADFE4", "XU c #CFDDED", "XY c #CEDDEC", "XT c #98B7D8", "XR c #B3C9E2", "XE c #97B7D7", "XW c #CDDBEB", "XQ c #96B5D6", "X! c #494924", "X~ c #749CCF", "X^ c #81837C", "X/ c #BCC6CD", "X( c #626878", "X) c #DBE6F2", "X_ c #C6CBB9", "X` c #BFD2E7", "X' c #DFE5EC", "X] c #A4BEDD", "X[ c #BED2E6", "X{ c #A3BEDC", "X} c #D8E4EF", "X| c #51512F", "o c #B9CBEB", "o. c #828594", "oX c #F1F3C2", "oo c #EAEDFA", "oO c #DDDFAB", "o+ c #E6EDF6", "o@ c #5D5E34", "o# c #CBD9EC", "o$ c #CAD9EB", "o% c #EBEDBC", "o& c #AEC7E0", "o* c #B6B688", "o= c #C9D9EA", "o- c #8DABE4", "o; c #AEC5E0", "o: c #C8D9E9", "o> c #E6EAEC", "o, c #E5E8EB", "o< c #C0C3CA", "o1 c #646773", "o2 c #9EB9E4", "o3 c #626571", "o4 c #BFC4BF", "o5 c #C0C0C0", "o6 c #60656F", "o7 c #D5E2EF", "o8 c #9FBCDB", "o9 c #D4E0EE", "o0 c #C9CFD6", "oq c #C5CCDC", "ow c #9EBADA", "oe c #D7DFE7", "or c #9BB8D7", "ot c #848785", "oy c #AEBCC2", "ou c #7E8289", "oi c #BAB985", "op c #95ADDB", "oa c #E3E9F6", "os c #E2E9F5", "od c #C6D7EA", "of c #303018", "og c #B2BAB2", "oh c #E0E9F3", "oj c #6C7995", "ok c #AAC3DF", "ol c #DFE9F2", "oz c #879AC0", "ox c #7D817E", "oc c #C4D5E8", "ov c #DEE9F1", "ob c #AAB0BE", "on c #C3D5E7", "om c #DEE7F1", "oM c #85A7DF", "oN c #626774", "oB c #B0B0B0", "oV c #616573", "oC c #616373", "oZ c #D5E0F2", "oA c #EDEECE", "oS c #9AB5E3", "oD c #D1E0EE", "oF c #72747D", "oG c #B6CCE4", "oH c #D1DEEE", "oJ c #D0DEED", "oK c #CFDEEC", "oL c #B3B595", "oP c #CFDCEC", "oI c #8F94A0", "oU c #B3CAE1", "oY c #B4B461", "oT c #98B6D7", "oR c #B2CAE0", "oE c #B3C8E1", "oW c #D8DCE1", "oQ c #57573E", "o! c #A1A276", "o~ c #DEE9F4", "o^ c #D5D7A9", "o/ c #F3F4D7", "o( c #DCE7F2", "o) c #8999BB", "o_ c #626777", "o` c #BFD1E6", "o' c #89ABD2", "o] c #51522E", "o[ c #64646F", "o{ c #A2BDDA", "o} c #DCE4E8", "o| c #9C9C9C", "O c #9FB6E1", "O. c #ECEEFB", "OX c #808491", "Oo c #C4C7AC", "OO c #EEF1F3", "O+ c #4C4C29", "O@ c #A0B3D8", "O# c #D8DCE4", "O$ c #C3C9D6", "O% c #C9CB9D", "O& c #CCDCEC", "O* c #686D80", "O= c #CCDAEC", "O- c #CBDAEB", "O; c #9B9E87", "O: c #CADAEA", "O> c #E5ECF4", "O, c #94B4D6", "O< c #AFC6E0", "O1 c #919266", "O2 c #94B2D6", "O3 c #E4EAF3", "O4 c #5B5B31", "O5 c #78A0CB", "O6 c #59592F", "O7 c #E3E6F2", "O8 c #E6E8B6", "O9 c #C8CBB3", "O0 c #F2F5FA", "Oq c #61666F", "Ow c #F1F5F9", "Oe c #D6E1EF", "Or c #9CB8E1", "Ot c #D5E1EE", "Oy c #9FBBDA", "Ou c #CCD1CE", "Oi c #E9EEFB", "Op c #CDCE9A", "Oa c #BDBC87", "Os c #E8ECFA", "Od c #878B7D", "Of c #769DD6", "Og c #CACA97", "Oh c #C9D8EC", "Oj c #C8D8EB", "Ok c #C7D8EA", "Ol c #949162", "Oz c #C8C895", "Ox c #E1EAF3", "Oc c #595932", "Ov c #C6D6E9", "Ob c #E0EAF2", "On c #9B9B80", "Om c #BBC3D1", "OM c #8FB0D4", "ON c #666677", "OB c #424222", "OV c #646875", "OC c #8DAED2", "OZ c #919480", "OA c #616472", "OS c #D3E1EF", "OD c #646436", "OF c #D4DDF0", "OG c #D2DFEE", "OH c #EDF1F8", "OJ c #D1DFED", "OK c #99976A", "OL c #B6CBE3", "OP c #D0DDEC", "OI c #9AB7D8", "OU c #CFDDEB", "OY c #7BA0D4", "OT c #A8B09D", "OR c #759BD8", "OE c #8890A2", "OW c #C6C9CB", "OQ c #8EADE0", "O! c #98ADD6", "O~ c #9FA4A8", "O^ c #7D8AAB", "O/ c #F4F5D7", "O( c #DEE8F3", "O) c #ABBEE2", "O_ c #DDE8F2", "O` c #7E8BA2", "O' c #F2F3D5", "O] c #636877", "O[ c #C1D4E7", "O{ c #626876", "O} c #F6FAFA", "O| c #C1D2E7", "+ c #626676", "+. c #DBE6F0", "+X c #9FB8EA", "+o c #8AAED2", "+O c #626276", "++ c #686868", "+@ c #8B895C", "+# c #3C3C1F", "+$ c #828592", "+% c #888559", "+& c #B1B9CA", "+* c #EAF1F8", "+= c #4D4D29", "+- c #CEDDED", "+; c #606035", "+: c #B9C8DF", "+> c #CDDBEC", "+, c #CCDBEB", "+< c #CBDBEA", "+1 c #666C7D", "+2 c #94B3D5", "+3 c #6B6A43", "+4 c #E8EAEC", "+5 c #E2E9F0", "+6 c #626879", "+7 c #93A9D4", "+8 c #DAE6F2", "+9 c #535332", "+0 c #8C8B60", "+q c #585858", "+w c #5D6874", "+e c #292916", "+r c #D8E4F0", "+t c #F4F7C6", "+y c #BDD0E6", "+u c #9B9972", "+i c #65643D", "+p c #3C3C22", "+a c #BCD0E5", "+s c #565656", "+d c #636370", "+f c #61656E", "+g c #D6E2EE", "+h c #85A8D0", "+j c #BACEE3", "+k c #80A5D5", "+l c #E8EDF9", "+z c #B8BA8B", "+x c #505050", "+c c #CDD9EF", "+v c #6C6F7C", "+b c #8CA2C3", "+n c #E7EBF8", "+m c #B4B9BC", "+M c #CAD9EC", "+N c #FFFFFF", "+B c #AFC5E2", "+V c #C9D9EB", "+C c #C8D9EA", "+Z c #B1B38E", "+A c #939460", "+S c #E2EBF3", "+D c #92B1D6", "+F c #ACC5DF", "+G c #C7D7E9", "+H c #E2E9F3", "+J c #B8C3D7", "+K c #D6D8DA", "+L c #90B1D4", "+P c #80804A", "+I c #CFD5DD", "+U c #56562E", "+Y c #464646", "+T c #7A7D79", "+R c #636373", "+E c #616571", "+W c #606370", "+Q c #B9CEE5", "+! c #D4E0EF", "+~ c #DEE2E5", "+^ c #83A8D1", "+/ c #9EBADB", "+( c #D3E0EE", "+) c #EEF2F8", "+_ c #798499", "+` c #9DBADA", "+' c #D2E0ED", "+] c #96B2E7", "+[ c #B6CCE2", "+{ c #71747A", "+} c #909074", "+| c #80A4CE", "@ c #7CA1D4", "@. c #E6EBFA", "@X c #B4B45F", "@o c #474729", "@O c #99B2D6", "@+ c #ACC3E2", "@@ c #E0E9F4", "@# c #E5EAEF", "@$ c #D6D9A8", "@% c #C4D5E9", "@& c #A1A074", "@* c #F9FBFC", "@= c #C3D5E8", "@- c #646977", "@; c #DDE7F1", "@: c #A7C1DD", "@> c #C2D3E7", "@, c #636776", "@< c #719BC9", "@1 c #8CADD3", "@2 c #626775", "@3 c #8D9AB3", "@4 c #C1CFE6", "@5 c #A1BAE1", "@6 c #F4F5F7", "@7 c #64646D", "@8 c #EDEECF", "@9 c #9A9A6D", "@0 c #B8CCE7", "@q c #F2F3F5", "@w c #D1DEEF", "@e c #4E4E29", "@r c #C7CBD8", "@t c #D0DEEE", "@y c #CFDEED", "@u c #ACAFA3", "@i c #99B6D9", "@p c #6A6F80", "@a c #CEDCEC", "@s c #EAECF7", "@d c #CDDCEB", "@f c #2C2C2C", "@g c #759CDA", "@h c #7CA2CD", "@j c #BCC6D7", "@k c #B3B6B7", "@l c #8199C8", "@z c #BCC5CD", "@x c #DEE5F5", "@c c #C2C4C9", "@v c #626778", "@b c #DBE7F2", "@n c #616777", "@m c #DBE5F2", "@M c #DAE5F1", "@N c #AABED9", "@B c #F5F8C6", "@V c #BED1E6", "@C c #D9E3F0", "@Z c #646470", "@A c #BDCFE5", "@S c #B0C0CB", "@D c #BBCFE3", "@F c #F1F4C2", "@G c #DFE1E2", "@H c #D0DCF1", "@J c #EFF1F5", "@K c #E8F2F8", "@L c #EFF2C0", "@P c #1C1C1C", "@I c #DDDFE0", "@U c #DEE0AC", "@Y c #E8EEF8", "@T c #D6D8B8", "@R c #CCDCED", "@E c #1A1A1A", "@W c #92A2BE", "@Q c #B2C4E4", "@! c #E6ECF6", "@~ c #B0C6E2", "@^ c #CADAEB", "@/ c #CFDBE6", "@( c #CAD8EB", "@) c #AEC6E0", "@_ c #C8D8E9", "@` c #DCE5F6", "@' c #6F778B", "@] c #F2F7FB", "@[ c #F3F6C7", "@{ c #D6E3F0", "@} c #626471", "@| c #B2BCD0", "# c #D6E1F0", "#. c #626271", "#X c #E0E3E6", "#o c #D5E1EF", "#O c #6B7387", "#+ c #D4E1EE", "#@ c #98B3E8", "## c #EFF3F8", "#$ c #515128", "#% c #9EBBDA", "#& c #B9CDE4", "#* c #9B996A", "#= c #B8CDE3", "#- c #D3DFED", "#; c #CED09C", "#: c #CCCFCF", "#> c #6B707D", "#, c #ADC3EC", "#< c #B9B9B9", "#1 c #CAD8EE", "#2 c #686C7A", "#3 c #E2EAF5", "#4 c #ACC4E1", "#5 c #AFB28E", "#6 c #C6D6EA", "#7 c #C5D6E9", "#8 c #B1C1DC", "#9 c #C4D6E8", "#0 c #DFE8F2", "#q c #A9C2DE", "#w c #8DAED3", "#e c #C2D4E6", "#r c #DDE6F0", "#t c None", /* pixels */ "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t.b+6o_oVoVo_+6.c#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t@n#Oo)O@O) ]o @Q.(@W@'@n#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t@2O*O!#,oS.^@ X~X~ n R P.I#8XK@2#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tXAO^.iOQ.d+k.p+/o;oG+F.'@1X0.6+c@3XA#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t+1+7XS. h c.*.&X1Ok.&+GOv.;o`.: [ 5+:@p#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t iopo-X& 4#6X4.$X1o=+CX1X1+GX9oc@AXdO5@+@4+ #t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t+ @l#@OR oodOk.&o=o= A@^o$@^o=Ok#7@=X7 ,.U 3 H+ #t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#toj+X@gXz.a.*+GX1 C@^ B B B VO:o=@_X9.z+h.q+h@`+_#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t .Xx.]Or 8Xm#7X4+VO-O=XW@a.S@d+>.D A.XQ+^+|owOF.1#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t.r+].T@0O[@%X4+C@^+,oPoK &.9XU+-@aO&X,Ok.{ d+h+|@HOE#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#tX(ozoMOYX`.j#9.*X>XWXY &oJoD.8OJ.9OP -.So: $OMXC+h@~+JO{#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t@v.POf 7@VO[#7X1.H@a@yOJ#-o9#+OtOtOGoJXU.*XTO,.=+o+D e@,#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#tXAO .<+Lo`@>#6+VO-@y ##-#o )@{ / /# .8 # u 'orO,OMo'OsoN#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t.1o2.QX# a@=.* A.S@t+(#o /@C@M./ fX}X.OU@).)OyOIO2OC@..>#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#toV@5@@=+y+[O#tXV+QXRoZO$XB#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t@2 r#4XE `#q.0Xu+<#t#t#t#t#t#t#t q#t#tXmX[Oh+n#>#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#tXv@| mo{X7 =oh p#t#t#t#t#t#tOwO0#t#t#t@wooOX#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#2@joE FOLXP+5#t#t#t#t#t#t@J#t#t#t#tO.+$#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tX=o#o;+[#e+I#t#t#t#t#t#t+K#t#t#toa@r#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t@-oq >#&O[@z 9#t#t#t#t#t#t#t#t#t+l j#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tobO|#&XV.,O~#t#t#t#tX<#t#t#t#t b+v#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t s.5.Y@SoyoxXboL#5On 6#t#t#t#3O7o1#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tOVOmX/XlOT.@OZ.EX8Xr+}+Z l E@soI#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t", "#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#t#tX2o0 Nog ~OdXkOoO; 0@T.C@Go c #999999", " , c #E06565", " < c #D73838", " 1 c #979797", " 2 c #DBC6C6", " 3 c #9F0101", " 4 c #D21C1C", " 5 c #DFD7D7", " 6 c #CA3535", " 7 c #940000", " 8 c #DA5F5F", " 9 c #D85D5D", " 0 c #8D8D8D", " q c #800000", " w c #B31B1B", " e c #D02727", " r c #D83C3C", " t c #CF0F0F", " y c #C02B2B", " u c #C84040", " i c #D43838", " p c #A50000", " a c #7F7F7F", " s c #910000", " d c #DE5C5C", " f c #D52F2F", " g c #CC0202", " h c #7D7D7D", " j c #D94040", " k c #D01313", " l c #DCB6B6", " z c #ECE0E0", " x c #CE1111", " c c #777777", " v c #690000", " b c #DFDDDD", " n c #A20000", " m c #DF6060", " M c #D63333", " N c #CD0606", " B c #B72525", " V c #B52323", " C c #D02D2D", " Z c #E16F6F", " A c #D75858", " S c #676767", " D c #BE2F2F", " F c #636363", " G c #E4C4C4", " H c #E06464", " J c #D73737", " K c #CE0A0A", " L c #A10202", " P c #D53535", " I c #9F0000", " U c #C53939", " Y c #AC1010", " T c #D13131", " R c #5B5B5B", " E c #A80C0C", " W c #E1B7B7", " Q c #C42E2E", " ! c #DB5555", " ~ c #A40808", " ^ c #CF0E0E", " / c #4F4F4F", " ( c #BC2626", " ) c #DB6262", " _ c #9C0000", " ` c #4B4B4B", " ' c #DE5B5B", " ] c #D52E2E", " [ c #CC0101", " { c #D78C8C", " } c #474747", " | c #B21C1C", ". c #434343", ".. c #D85555", ".X c #E06A6A", ".o c #D88383", ".O c #DF8080", ".+ c #E1DEDE", ".@ c #F0F0F0", ".# c #D56969", ".$ c #D45151", ".% c #DB4E4E", ".& c #AC1616", ".* c #EEEEEE", ".= c #D13737", ".- c #ECECEC", ".; c #990000", ".: c #CE1D1D", ".> c #DF5F5F", "., c #D63232", ".< c #CD0505", ".1 c #DAC0C0", ".2 c #EAEAEA", ".3 c #E8E8E8", ".4 c #AB0B0B", ".5 c #DED1D1", ".6 c #850000", ".7 c #E6E6E6", ".8 c #E16E6E", ".9 c #E4E4E4", ".0 c #E2E2E2", ".q c #D9B5B5", ".w c #E0E0E0", ".e c #BC2C2C", ".r c #AA0000", ".t c #DEDEDE", ".y c #D03939", ".u c #D84E4E", ".i c #CE0909", ".p c #A10101", ".a c #B01313", ".s c #DCDCDC", ".d c #EEE7E7", ".f c #D01818", ".g c #CE1616", ".h c #A80B0B", ".j c #DD5656", ".k c #D83A3A", ".l c #CD0B0B", ".z c #A00303", ".x c #E9D8D8", ".c c #DD6363", ".v c #D34C4C", ".b c #171717", ".n c #C12020", ".m c #0D0000", ".M c #C6C6C6", ".N c #D52D2D", ".B c #CC0000", ".V c #D24141", ".C c #DA5656", ".Z c #E06969", ".A c #D65252", ".S c #E1DDDD", ".D c #DB4D4D", ".F c #D22020", ".G c #D24E4E", ".H c #AA1313", ".J c #DF5E5E", ".K c #CD0404", ".L c #CE4A4A", ".P c #010101", ".I c #DC7272", ".U c #B31F1F", ".Y c #DC5151", ".T c #D32424", ".R c #AD1919", ".E c #DFC7C7", ".W c #D23A3A", ".Q c #BA2929", ".! c #D15050", ".~ c #E06262", ".^ c #D73535", "./ c #A10000", ".( c #CE1515", ".) c #DD5555", "._ c #D42828", ".` c #FF0000", ".' c #D45656", ".] c #989898", ".[ c #CD0A0A", ".{ c #A00202", ".} c #CD3838", ".| c #9E0000", "X c #D46363", "X. c #DB6060", "XX c #DA4848", "Xo c #D11B1B", "XO c #DDBEBE", "X+ c #D14949", "X@ c #A90E0E", "X# c #C73232", "X$ c #DE5959", "X% c #A70C0C", "X& c #8C8C8C", "X* c #DD9D9D", "X= c #DBC9C9", "X- c #DB4C4C", "X; c #D21F1F", "X: c #AA1212", "X> c #DA9090", "X, c #808080", "X< c #D04B4B", "X1 c #DF5D5D", "X2 c #D63030", "X3 c #CD0303", "X4 c #E16C6C", "X5 c #DF6A6A", "X6 c #CD1010", "X7 c #E2E0E0", "X8 c #DC5050", "X9 c #747474", "X0 c #D35151", "Xq c #BA2828", "Xw c #D96464", "Xe c #CC0505", "Xr c #6E6E6E", "Xt c #D33030", "Xy c #D35E5E", "Xu c #D94343", "Xi c #686868", "Xp c #D65757", "Xa c #DD5454", "Xs c #D42727", "Xd c #A60707", "Xf c #D33D3D", "Xg c #DB5252", "Xh c #A40505", "Xj c #B31717", "Xk c #A20303", "Xl c #A00101", "Xz c #D11A1A", "Xx c #5A5A5A", "Xc c #DE5858", "Xv c #D52B2B", "Xb c #CF2525", "Xn c #AE1515", "Xm c #DFABAB", "XM c #D44E4E", "XN c #DC6363", "XB c #FFFFFF", "XV c #DB4B4B", "XC c #D21E1E", "XZ c #CF3232", "XA c #B72121", "XS c #DABDBD", "XD c #BE1E1E", "XF c #D83E3E", "XG c #DCCCCC", "XH c #424242", "XJ c #D75454", "XK c #DF6969", "XL c #CD0F0F", "XP c #D78282", "XI c #D43A3A", "XU c #DC4F4F", "XY c #EFEFEF", "XT c #A30000", "XR c #EDEDED", "XE c #EBEBEB", "XW c #D53131", "XQ c #E9E9E9", "X! c #8F0000", "X~ c #090000", "X^ c #D67777", "X/ c #B42121", "X( c #E7E7E7", "X) c #D94242", "X_ c #D01515", "X` c #E5E5E5", "X' c #B71A1A", "X] c #E3E3E3", "X[ c #DD5353", "X{ c #E1E1E1", "X} c #DFDFDF", "X| c #A20202", "o c #DDDDDD", "o. c #A00000", "oX c #D54B4B", "oo c #C31F1F", "oO c #DA4646", "o+ c #D11919", "o@ c #D95C5C", "o# c #C03333", "o$ c #DAA2A2", "o% c #D3D3D3", "o& c #A50808", "o* c #E06666", "o= c #D99797", "o- c #181818", "o; c #9D0000", "o: c #DB4A4A", "o> c #C7C7C7", "o, c #DDD6D6", "o< c #CC4545", "o1 c #D25858", "o2 c #E16A6A", "o3 c #D83D3D", "o4 c #C02C2C", "o5 c #DD6666", "o6 c #D32121", "o7 c #AD1616", "o8 c #DEDADA", "o9 c #CF1D1D", "o0 c #CC0303", "oq c #D67676", "ow c None", /* pixels */ "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowow./././ nowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowow nX/ 8XNXq nowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowX% Z._X;X4X@owowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowXT.L o.B.B .B.Bo1o o o .t.#.B.Bo: (o.owowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowow.p ).F.B $ 2o o .t.t.5XL.B O.CX|owowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowow.eXc.B.BX o o .t.tX}X}oq.B.B j y./owowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowXko5Xz.B.lXGo .t.tX}X}X} 5.(.B ^ !Xhowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowo.o#.Y.B.B ;o .t.tX}X}X}.w.w.o.B.B < Q./owowowowowowowowowowowowowow", "owowowowowowowowowowowowowow :XK O.BX6 =.t.t 1 h h.].wX{.So9.B.iXgo&owowowowowowowowowowowowowow", "owowowowowowowowowowowowow./ Uo:.B.BX^.t.tX}XH . X{X{.0X>.B.B fX#./owowowowowowowowowowowowow", "owowowowowowowowowowowowow ~X5 t.B.go,.tX}X} / /X{.0.0X7 e.B N.%.howowowowowowowowowowowowow", "owowowowowowowowowowowow n uXu.B.BXP.tX}X}.wXx R.0.0.0X]X*.B.BXs 6./owowowowowowowowowowowow", "owowowowowowowowowowowow E.X K.B.:o8X}X}.w.w S Xi.0.0X].9.9 T.BX3XX Yowowowowowowowowowowowow", "owowowowowowowowowowow no< r.B.B {X}X}.w.w.wX9 X9X]X].9.9X`Xm.B.B.F.}./owowowowowowowowowowow", "owowowowowowowowowowowX:.Z $.BXb bX}.w.w.wX{ a X,X].9.9X`X`.7Xf.B [X).aowowowowowowowowowowow", "owowowowowowowowowow./X<.^.B.Bo=X}.w.w.wX{X{X& 0.9.9X`X`.7.7 W.B.Bo+.y./owowowowowowowowowow", "owowowowowowowowowow.&o*.K.B CX}.w.w.wX{X{.0.] >.9X`X`.7.7X(X(oX.B.B.kXjowowowowowowowowowow", "owowowowowowowowow./X0 ].B.Bo$.w.w.wX{X{.0.0 % %X`X`.7.7X(X(.3 Go0.B k.W.powowowowowowowowow", "owowowowowowowowow | # g.B.=.w.w.wX{X{.0.0X].M F Fo>X`.7.7X(X(.3XQXQ A.B.B MX'o.owowowowowowowow", "owowowowowowowow./XpXs.B.B @.w.wX{X{.0.0X]X].9.Mo>X`.7.7X(X(.3XQXQ.2 X N.B ^XI Lowowowowowowowow", "owowowowowowowow V d [.B.V.w.wX{X{.0.0X]X].9Xr .PX9.7X(.3.3XQXQ.2.2XEXw.B.BXv ../owowowowowowow", "owowowowowowow.po@o6.B [ l.wX{X{.0.0X]X].9.9.b o-X(.3.3XQXQ.2.2XEXE.x.[.B.i iXkowowowowowowow", "owowowowowowow.Q.).B.B.v.wX{X{.0.0X]X].9.9X` ` }.3.3XQXQ.2.2XEXE.-.-.I.B.B.TXD nowowowowowow", "owowowowowowX|X.Xo.Bo0XOX{X{.0.0X]X].9.9X`X`o% c co%.3XQXQ.2.2XEXE.-.-XR z x.B N P :owowowowowow", "owowowowow./ DXU.B.B.'X{X{.0.0X]X].9.9X`X`.7X(X(.3.3XQXQ.2.2XEXE.-XRXR.*.*.O.B.BXC.n./owowowowow", "owowowowowXk.cX_.B N.EX{.0.0X]X].9.9X`X`.7X(X(.3.3XQXQ.2.2XEXE.-XRXR.*.*XY.d.f.BX3XWXdowowowowow", "owowowow 7o4X-.B.B C.+.0.0X]X].9.9X`X`.7X(X(.3.3XQXQ.2.2XEXE.-XRXR.*.*XYXY.@.u.B.BXzooo.owowowow", "owowowow.| A 4.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.KXto.owowowow", "owowowow _.$ f.<.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B g t +o.owowowow", "owowowow qo7XJ.~ , # m.JX1 'X$Xc.j.)X[.YX8XU.DXVo:XXoO *XuX) jXFo3 r.k < J.^ M.,X2 +.4 sowowowow", "owowowowow.6o; I 3.z.z.z.z.z.z.z.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{XlXlXl 3 I IX!owowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow", "owowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowowow" }; // --------------------------------------------------------------------- // end of Tango icons // --------------------------------------------------------------------- fldigi-4.2.05/src/misc/util.cxx0000664000175000017500000003743014611711171013215 00000000000000// ---------------------------------------------------------------------------- // util.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // Copyright (C) 2009 // Dave Freese, W1HKJ // Copyright (C) 2013 // Remi Chateauneu, F4ECW // Copyright (C) 2015 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "util.h" #ifdef __MINGW32__ # include "compat.h" /// This includes Windows.h #include #endif /** ******************************************************************** * Return the smallest power of 2 not less than n ***********************************************************************/ uint32_t ceil2(uint32_t n) { --n; n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; return n + 1; } /** ******************************************************************** * Return the largest power of 2 not greater than n ***********************************************************************/ /// Return the largest power of 2 not greater than n uint32_t floor2(uint32_t n) { n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8; n |= n >> 16; return n - (n >> 1); } #include /** ******************************************************************** * Transforms the version, as a string, into an integer, so comparisons * are possible. ***********************************************************************/ unsigned long ver2int(const char* version) { unsigned long v = 0L; const char* p = version; while (*p) { if (isdigit(*p)) v = v*10 + *p - '0'; p++; } return v; } /** ******************************************************************** * from git 1.6.1.2 compat/strcasestr.c ***********************************************************************/ #if !HAVE_STRCASESTR # include char *strcasestr(const char *haystack, const char *needle) { int nlen = strlen(needle); int hlen = strlen(haystack) - nlen + 1; int i; for (i = 0; i < hlen; i++) { int j; for (j = 0; j < nlen; j++) { unsigned char c1 = haystack[i+j]; unsigned char c2 = needle[j]; if (toupper(c1) != toupper(c2)) goto next; } return (char *) haystack + i; next: ; } return NULL; } #endif // !HAVE_STRCASESTR /** ******************************************************************** * from git 1.6.1.2 compat/strcasestr.c ***********************************************************************/ #if !HAVE_STRLCPY size_t strlcpy(char *dest, const char *src, size_t size) { size_t ret = strlen(src); if (size) { size_t len = (ret >= size) ? size - 1 : ret; memcpy(dest, src, len); dest[len] = '\0'; } return ret; } #endif // !HAVE_STRLCPY /** ******************************************************************** * ***********************************************************************/ #if !HAVE_STRNLEN size_t strnlen(const char *s, size_t maxlen) { if((!s) || (maxlen < 1)) return 0; size_t count = 0; while(*s++ && (maxlen-- > 0)) count++; return count; } #endif // !HAVE_STRNLEN /** ******************************************************************** * ***********************************************************************/ #if !HAVE_STRNCPY char * strncpy(char *dst, const char *src, size_t maxlen) { if((!dst) || (!src) || (maxlen < 1)) return dst; char *_dst = dst; while(*src && *_dst && (--maxlen > 0)) *_dst++ = *src++; *_dst = 0; return dst; } #endif // !HAVE_STRNCPY /** ******************************************************************** * ***********************************************************************/ #if !HAVE_STRNCMP int strncmp(const char *s1, const char *s2, size_t maxlen) { if((!s1) || (!s2) || (maxlen < 1)) return 0; unsigned char *u1 = (unsigned char *)s1; unsigned char *u2 = (unsigned char *)s2; int dif = 0; while(*u1 && *u2 && (maxlen-- > 0)) { dif = *u1++ - *u2++; if(dif) break; } return dif; } #endif // !HAVE_STRNCMP /** ******************************************************************** * from git 1.6.3.1 compat/setenv.c ***********************************************************************/ #if !HAVE_SETENV int setenv(const char *name, const char *value, int replace) { int out; size_t namelen, valuelen; char *envstr; if (!name || !value) return -1; if (!replace) { char *oldval = NULL; oldval = getenv(name); if (oldval) return 0; } namelen = strlen(name); valuelen = strlen(value); envstr = (char*)malloc((namelen + valuelen + 2)); if (!envstr) return -1; memcpy(envstr, name, namelen); envstr[namelen] = '='; memcpy(envstr + namelen + 1, value, valuelen); envstr[namelen + valuelen + 1] = 0; out = putenv(envstr); /* putenv(3) makes the argument string part of the environment, * and changing that string modifies the environment --- which * means we do not own that storage anymore. Do not free * envstr. */ return out; } #endif /*********************************************************************** * from git 1.6.3.1 compat/setenv.c ***********************************************************************/ #if !HAVE_UNSETENV int unsetenv(const char *name) { extern char **environ; int src, dst; size_t nmln; nmln = strlen(name); for (src = dst = 0; environ[src]; ++src) { size_t enln; enln = strlen(environ[src]); if (enln > nmln) { /* might match, and can test for '=' safely */ if (0 == strncmp (environ[src], name, nmln) && '=' == environ[src][nmln]) /* matches, so skip */ continue; } environ[dst] = environ[src]; ++dst; } environ[dst] = NULL; return 0; } #endif /** ******************************************************************** * ***********************************************************************/ #ifdef __MINGW32__ int set_cloexec(int fd, unsigned char v) { return 0; } #else # include # include int set_cloexec(int fd, unsigned char v) { int f = fcntl(fd, F_GETFD); return f == -1 ? f : fcntl(fd, F_SETFD, (v ? f | FD_CLOEXEC : f & ~FD_CLOEXEC)); } #endif // __MINGW32__ /** ******************************************************************** * ***********************************************************************/ int set_nonblock(int fd, unsigned char v) { #ifndef __MINGW32__ int f = fcntl(fd, F_GETFL); return f == -1 ? f : fcntl(fd, F_SETFL, (v ? f | O_NONBLOCK : f & ~O_NONBLOCK)); #else // __MINGW32__ u_long v_ = (u_long)v; errno = 0; if (ioctlsocket(fd, FIONBIO, &v_) == SOCKET_ERROR) { errno = WSAGetLastError(); return -1; } else return 0; #endif // __MINGW32__ } #ifndef __MINGW32__ # include # include # include # include #endif /** ******************************************************************** * ***********************************************************************/ int set_nodelay(int fd, unsigned char v) { int val = v; return setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&val, sizeof(val)); } #ifdef __MINGW32__ # include #endif /** ******************************************************************** * ***********************************************************************/ int get_bufsize(int fd, int dir, int* len) { socklen_t optlen = sizeof(*len); return getsockopt(fd, SOL_SOCKET, (dir == 0 ? SO_RCVBUF : SO_SNDBUF), (char*)len, &optlen); } /** ******************************************************************** * ***********************************************************************/ int set_bufsize(int fd, int dir, int len) { return setsockopt(fd, SOL_SOCKET, (dir == 0 ? SO_RCVBUF : SO_SNDBUF), (const char*)&len, sizeof(len)); } #ifndef __MINGW32__ #include #include #ifndef NSIG # define NSIG 64 #endif static size_t nsig = 0; static struct sigaction* sigact = 0; static pthread_mutex_t sigmutex = PTHREAD_MUTEX_INITIALIZER; #endif /** ******************************************************************** * ***********************************************************************/ void save_signals(void) { #ifndef __MINGW32__ pthread_mutex_lock(&sigmutex); if (!sigact) sigact = new struct sigaction[NSIG]; for (nsig = 1; nsig <= NSIG; nsig++) if (sigaction(nsig, NULL, &sigact[nsig-1]) == -1) break; pthread_mutex_unlock(&sigmutex); #endif } /** ******************************************************************** * ***********************************************************************/ void restore_signals(void) { #ifndef __MINGW32__ pthread_mutex_lock(&sigmutex); for (size_t i = 1; i <= nsig; i++) sigaction(i, &sigact[i-1], NULL); delete [] sigact; sigact = 0; nsig = 0; pthread_mutex_unlock(&sigmutex); #endif } /** ******************************************************************** * ***********************************************************************/ uint32_t simple_hash_data(const unsigned char* buf, size_t len, uint32_t code) { for (size_t i = 0; i < len; i++) code = ((code << 4) | (code >> (32 - 4))) ^ (uint32_t)buf[i]; return code; } /** ******************************************************************** * ***********************************************************************/ uint32_t simple_hash_str(const unsigned char* str, uint32_t code) { while (*str) code = ((code << 4) | (code >> (32 - 4))) ^ (uint32_t)*str++; return code; } #include #include static const char hexsym[] = "0123456789ABCDEF"; static std::vector* hexbuf; /** ******************************************************************** * ***********************************************************************/ const char* str2hex(const unsigned char* str, size_t len) { if (unlikely(len == 0)) return ""; if (unlikely(!hexbuf)) { hexbuf = new std::vector; hexbuf->reserve(192); } if (unlikely(hexbuf->size() < len * 3)) hexbuf->resize(len * 3); char* p = &(*hexbuf)[0]; size_t i; for (i = 0; i < len; i++) { *p++ = hexsym[str[i] >> 4]; *p++ = hexsym[str[i] & 0xF]; *p++ = ' '; } *(p - 1) = '\0'; return &(*hexbuf)[0]; } /** ******************************************************************** * ***********************************************************************/ const char* str2hex(const char* str, size_t len) { return str2hex((const unsigned char*)str, len ? len : strlen(str)); } static std::vector* binbuf; /** ******************************************************************** * ***********************************************************************/ const char* uint2bin(unsigned u, size_t len) { if (unlikely(len == 0)) len = sizeof(u) * CHAR_BIT; if (unlikely(!binbuf)) { binbuf = new std::vector; binbuf->reserve(sizeof(u) * CHAR_BIT); } if (unlikely(binbuf->size() < len + 1)) binbuf->resize(len + 1); for (size_t i = 0; i < len; i++) { (*binbuf)[len - i - 1] = '0' + (u & 1); u >>= 1; } (*binbuf)[len] = '\0'; return &(*binbuf)[0]; } /** ******************************************************************** * ***********************************************************************/ #ifndef __MINGW32__ void MilliSleep(long msecs) { struct timespec tv[2] = { {msecs / 1000L, msecs % 1000L * 1000000L} }; nanosleep(&tv[0], &tv[1]); } #else void MilliSleep(long msecs) { struct timespec tv[2] = { {msecs / 1000L, msecs % 1000L * 1000000L} }; timeBeginPeriod(1); nanosleep(&tv[0], &tv[1]); timeEndPeriod(1); } #endif // return current tick time in seconds double fsk_now() { static struct timeval t1; gettimeofday(&t1, NULL); return t1.tv_sec + t1.tv_usec / 1e6; } // sub millisecond accurate sleep function // sleep_time in seconds // NOT THREAD SAFE !!! int accu_sleep (double sleep_time) { struct timespec tv; double end_at = fsk_now() + sleep_time; double delay = sleep_time - 0.1e-3; tv.tv_sec = (time_t) delay; tv.tv_nsec = (long) ((delay - tv.tv_sec) * 1e+9); int rval = 0; while (1) { rval = nanosleep (&tv, &tv); if (rval == 0) break; else if (errno == EINTR) continue; else return rval; } while (fsk_now() < end_at); return 0; } /** ******************************************************************** * Returns 0 if a process is running, 0 if not there and -1 if the * test cannot be made. ***********************************************************************/ int test_process(int pid) { #ifdef __MINGW32__ HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid); DWORD ret = WaitForSingleObject(process, 0); CloseHandle(process); return ret == WAIT_TIMEOUT; #elif defined(__linux__) /// This is dependent on procfs. char buf[32]; snprintf(buf, sizeof(buf), "/proc/%d/cmdline",pid); FILE * tmpF = fl_fopen( buf, "r" ); if( tmpF != NULL ) { fclose(tmpF); return 1 ; } return 0 ; #else // This would work on Linux also. int ret = kill(pid,0); if(ret == 0) return 1; if(errno == ESRCH) return 0; fprintf(stderr,"kill pid=%d failed r=%d e=%d %s\n", pid, ret, errno, strerror(errno) ); return -1 ; #endif } #ifdef __MINGW32__ /** ******************************************************************** * Retrieve the system error message for the last-error code ***********************************************************************/ static const char * WindowsError(DWORD dw) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); /// BEWARE, this is NOT reentrant ! static char buffer[2048]; strcpy( buffer, (const char *)lpMsgBuf ); LocalFree(lpMsgBuf); return buffer ; } #endif /** ******************************************************************** * Starts a process and returns its pid, and -1 if error. Returns 0 if * this cannot be made. ***********************************************************************/ int fork_process( const char * cmd ) { #ifdef __MINGW32__ char* cmd_local = strdup(cmd); STARTUPINFO si; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); PROCESS_INFORMATION pi; memset(&pi, 0, sizeof(pi)); if (!CreateProcess(NULL, cmd_local, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) fprintf(stderr,"CreateProcess failed: %s", WindowsError(GetLastError()) ); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd_local); return pi.dwProcessId ; #else pid_t newpid = fork(); switch(newpid) { case -1: return -1 ; case 0: execl("/bin/sh", "sh", "-c", cmd, NULL ); fprintf(stderr,"execl failed with %s", strerror(errno) ); /// Ideally we should warn the main process. exit(EXIT_FAILURE); } return newpid ; #endif } /** ******************************************************************** * Returns true if OK. Beware, the error case is not reentrant. ***********************************************************************/ const char * create_directory( const char * dir ) { if ( mkdir(dir, 0777) == -1 ) if( errno != EEXIST ) return strerror(errno); return NULL ; } fldigi-4.2.05/src/misc/misc.cxx0000664000175000017500000000731614611711171013173 00000000000000// ---------------------------------------------------------------------------- // misc.cxx -- Miscellaneous helper functions // // Copyright (C) 2006-2007 // Dave Freese, W1HKJ // // This file is part of fldigi. These filters were adapted from code contained // in the gmfsk source code distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "misc.h" #include // ---------------------------------------------------------------------------- /* * Hamming weight (number of bits that are ones). */ unsigned long hweight32(unsigned long w) { w = (w & 0x55555555) + ((w >> 1) & 0x55555555); w = (w & 0x33333333) + ((w >> 2) & 0x33333333); w = (w & 0x0F0F0F0F) + ((w >> 4) & 0x0F0F0F0F); w = (w & 0x00FF00FF) + ((w >> 8) & 0x00FF00FF); w = (w & 0x0000FFFF) + ((w >> 16) & 0x0000FFFF); return w; } unsigned short int hweight16(unsigned short int w) { w = (w & 0x5555) + ((w >> 1) & 0x5555); w = (w & 0x3333) + ((w >> 2) & 0x3333); w = (w & 0x0F0F) + ((w >> 4) & 0x0F0F); w = (w & 0x00FF) + ((w >> 8) & 0x00FF); return w; } unsigned char hweight8(unsigned char w) { w = (w & 0x55) + ((w >> 1) & 0x55); w = (w & 0x33) + ((w >> 2) & 0x33); w = (w & 0x0F) + ((w >> 4) & 0x0F); return w; } // ---------------------------------------------------------------------------- /* * Parity function. Return one if `w' has odd number of ones, zero otherwise. */ int parity(unsigned long w) { return hweight32(w) & 1; } // ---------------------------------------------------------------------------- /* * Reverse order of bits. */ unsigned long rbits32(unsigned long w) { w = ((w >> 1) & 0x55555555) | ((w << 1) & 0xAAAAAAAA); w = ((w >> 2) & 0x33333333) | ((w << 2) & 0xCCCCCCCC); w = ((w >> 4) & 0x0F0F0F0F) | ((w << 4) & 0xF0F0F0F0); w = ((w >> 8) & 0x00FF00FF) | ((w << 8) & 0xFF00FF00); w = ((w >> 16) & 0x0000FFFF) | ((w << 16) & 0xFFFF0000); return w; } unsigned short int rbits16(unsigned short int w) { w = ((w >> 1) & 0x5555) | ((w << 1) & 0xAAAA); w = ((w >> 2) & 0x3333) | ((w << 2) & 0xCCCC); w = ((w >> 4) & 0x0F0F) | ((w << 4) & 0xF0F0); w = ((w >> 8) & 0x00FF) | ((w << 8) & 0xFF00); return w; } unsigned char rbits8(unsigned char w) { w = ((w >> 1) & 0x55) | ((w << 1) & 0xFF); w = ((w >> 2) & 0x33) | ((w << 2) & 0xCC); w = ((w >> 4) & 0x0F) | ((w << 4) & 0xF0); return w; } // ---------------------------------------------------------------------------- // Integer base-2 logarithm unsigned int log2u(unsigned int x) { int y = 0; x >>= 1; while (x) { x >>= 1; y++; } return y; } // ---------------------------------------------------------------------------- // Gray encoding and decoding (8 bit) unsigned char grayencode(unsigned char data) //unsigned char graydecode(unsigned char data) { unsigned char bits = data; bits ^= data >> 1; bits ^= data >> 2; bits ^= data >> 3; bits ^= data >> 4; bits ^= data >> 5; bits ^= data >> 6; bits ^= data >> 7; return bits; } unsigned char graydecode(unsigned char data) //unsigned char grayencode(unsigned char data) { return data ^ (data >> 1); } fldigi-4.2.05/src/misc/strutil.cxx0000664000175000017500000001464314611711171013747 00000000000000// ---------------------------------------------------------------------------- // strutil.cxx // // Copyright (C) 2009-2012 // Stelios Bounanos, M0GLD // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include "re.h" #include "strutil.h" std::vector split(const char* re_str, const char* str, unsigned max_split) { std::vector v; size_t n = strlen(re_str); std::string s; s.reserve(n + 2); s.append(1, '(').append(re_str, n).append(1, ')'); fre_t re(s.c_str(), REG_EXTENDED); bool ignore_trailing_empty = false; if (max_split == 0) { max_split = UINT_MAX; ignore_trailing_empty = true; } s = str; const std::vector& sub = re.suboff(); while (re.match(s.c_str())) { if (unlikely(sub.empty() || ((max_split != UINT_MAX) && --max_split == 0))) break; else { s[sub[0].rm_so] = '\0'; v.push_back(s.c_str()); s.erase(0, sub[0].rm_eo); } } if (!(ignore_trailing_empty && s.empty())) v.push_back(s); return v; } /// Builds a string out of a printf-style formatted vararg list. std::string strformat( const char * fmt, ... ) { static const int sz_buf = 512 ; char buf_usual[sz_buf]; va_list ap; va_start(ap, fmt); int res = vsnprintf( buf_usual, sz_buf, fmt, ap); va_end(ap); if( res < 0 ) throw std::runtime_error(__FUNCTION__); if( res < sz_buf ) return buf_usual ; std::string str( res, ' ' ); va_start(ap, fmt); res = vsnprintf( &str[0], res + 1, fmt, ap); va_end(ap); if( res < 0 ) throw std::runtime_error(__FUNCTION__); return str ; } /// Removes leading spaces and tabs. static std::string & strtriml(std::string &str) { while (str[0] && std::isspace(str[0])) str.erase(0,1); return str; } /// Removes trailing spaces and tabs. static std::string & strtrimr(std::string &str) { while (str.length() && std::isspace(str[str.length() -1])) str.erase(str.length() - 1); return str; } /// Removes leading trailing spaces and tabs. void strtrim(std::string &str) { strtriml(strtrimr(str)); } void strcapitalize(std::string &str) { bool isStart = true ; for( size_t i = 0; i < str.size(); ++i ) { const char tmpC = str[i]; if( isalpha( tmpC ) ) { if( isStart ) { str[ i ] = toupper( tmpC ); isStart = false ; } else { str[ i ] = tolower( tmpC ); } } else { isStart = true ; } } } std::string strreplace( const std::string & inp, const std::string & from, const std::string & to ) { size_t from_sz=from.size(); std::string tmp ; for( size_t old_curr = 0 ; ; ) { size_t new_curr = inp.find( from, old_curr ); if( new_curr == std::string::npos ) { tmp.append( inp, old_curr, std::string::npos ); break ; } else { tmp.append( inp, old_curr, new_curr - old_curr ); tmp.append( to ); old_curr = new_curr + from_sz ; } } return tmp ; } /// Edit distance. Not the fastest implementation. size_t levenshtein(const std::string & source, const std::string & target) { const size_t n = source.size(); const size_t m = target.size(); if (n == 0) return m; if (m == 0) return n; typedef std::vector< std::vector > Tmatrix; Tmatrix matrix(n+1); for (size_t i = 0; i <= n; i++) { matrix[i].resize(m+1); } for (size_t i = 0; i <= n; i++) { matrix[i][0]=i; } for (size_t j = 0; j <= m; j++) { matrix[0][j]=j; } for (size_t i = 1; i <= n; i++) { char s_i = source[i-1]; for (size_t j = 1; j <= m; j++) { char t_j = target[j-1]; size_t cost = (s_i == t_j) ? 0 : 1 ; size_t above = matrix[i-1][j]; size_t left = matrix[i][j-1]; size_t diag = matrix[i-1][j-1]; size_t cell = std::min( above + 1, std::min(left + 1, diag + cost)); // Step 6A: Cover transposition, in addition to deletion, // insertion and substitution. This step is taken from: // Berghel, Hal ; Roach, David : "An Extension of Ukkonen's // Enhanced Dynamic Programming ASM Algorithm" // (http://www.acm.org/~hlb/publications/asm/asm.html) if (i>2 && j>2) { size_t trans=matrix[i-2][j-2]+1; if (source[i-2]!=t_j) trans++; if (s_i!=target[j-2]) trans++; if (cell>trans) cell=trans; } matrix[i][j]=cell; } } return matrix[n][m]; } /// Converts a string to ucasestr. std::string ucasestr( std::string str ) { std::string resu ; for( size_t i = 0 ; i < str.size(); ++i ) { resu += static_cast( toupper( str[i] ) ); } return resu ; } std::string ucasestr(const char *str) { std::string resu ; for( size_t i = 0 ; i < strlen(str); ++i ) { resu += static_cast( toupper( str[i] ) ); } return resu ; } size_t ufind(std::string s1, std::string s2, size_t idx) { std::string up1 = ucasestr(s1); std::string up2 = ucasestr(s2); return up1.find(up2, idx); } // ---------------------------------------------------------------------------- /// Just reads all chars until the delimiter. bool read_until_delim( char delim, std::istream & istrm ) { istrm.ignore ( std::numeric_limits::max(), delim ); if(istrm.eof()) return true ; return istrm.bad() ? false : true ; } /// Reads a char up to the given delimiter, or returns the default value if there is none. bool read_until_delim( char delim, std::istream & istrm, char & ref, const char dflt ) { if(istrm.eof()) { ref = dflt ; return true ; } ref = istrm.get(); if( istrm.bad() ) return false; if( ref == delim ) { ref = dflt ; return true ; } char tmpc = istrm.get(); if( istrm.eof() ) return true; if( tmpc == delim ) return true ; if( tmpc == '\n' ) return true ; if( tmpc == '\r' ) return true ; return false; } fldigi-4.2.05/src/misc/benchmark.cxx0000664000175000017500000001636214611711171014173 00000000000000// ---------------------------------------------------------------------------- // benchmark.cxx // // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #ifndef __MINGW32__ # include #else # include "compat.h" #endif # include #include "fl_digi.h" #include "modem.h" #include "trx.h" #include "timeops.h" #include "configuration.h" #include "status.h" #include "debug.h" #include "benchmark.h" struct benchmark_params benchmark = { MODE_PSK31, 1000, false, false, 0.0, 1.0, SRC_SINC_FASTEST }; int setup_benchmark(void) { ENSURE_THREAD(FLMAIN_TID); if (benchmark.input.empty()) { LOG_ERROR("Missing input"); return 1; } else { char* p; benchmark.samples = (size_t)strtol(benchmark.input.c_str(), &p, 10); if (*p != '\0') { // invalid char in input string // treat as filename benchmark.samples = 0; } } if (!benchmark.output.empty()) benchmark.buffer.reserve(BUFSIZ); progdefaults.rsid = false; progdefaults.StartAtSweetSpot = false; if (benchmark.modem != NUM_MODES) progStatus.lastmode = benchmark.modem; if (benchmark.freq) progStatus.carrier = benchmark.freq; progStatus.afconoff = benchmark.afc; progStatus.sqlonoff = benchmark.sql; progStatus.sldrSquelchValue = benchmark.sqlevel; debug::level = debug::INFO_LEVEL; TRX_WAIT(STATE_ENDED, trx_start(); init_modem(progStatus.lastmode)); if (!benchmark.output.empty()) { ofstream out(benchmark.output.c_str()); if (out) out << benchmark.buffer; } return 0; } SNDFILE* infile = 0; static size_t do_rx(struct rusage ru[2], struct timespec wall_time[2]); static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]); void do_benchmark(void) { ENSURE_THREAD(TRX_TID); std::stringstream info; if (benchmark.src_ratio != 1.0) info << "modem=" << active_modem->get_mode() << " (" << mode_info[active_modem->get_mode()].sname << ")" << " rate=" << active_modem->get_samplerate() << " ratio=" << benchmark.src_ratio << " converter=" << benchmark.src_type << " (" << src_get_name(benchmark.src_type) << ")"; else info << "modem=" << active_modem->get_mode() << " (" << mode_info[active_modem->get_mode()].sname << ")" << " rate=" << active_modem->get_samplerate(); LOG_INFO("%s", info.str().c_str()); if (!benchmark.samples) { SF_INFO info = { 0, 0, 0, 0, 0, 0 }; if ((infile = sf_open(benchmark.input.c_str(), SFM_READ, &info)) == NULL) { LOG_ERROR("Could not open input file \"%s\"", benchmark.input.c_str()); return; } } struct rusage ru[2]; struct timespec wall_time[2]; size_t nproc, nrx; if (benchmark.src_ratio == 1.0) nrx = nproc = do_rx(ru, wall_time); else { nproc = do_rx_src(ru, wall_time); nrx = (size_t)(nproc * benchmark.src_ratio); } ru[1].ru_utime -= ru[0].ru_utime; wall_time[1] -= wall_time[0]; if (infile) { sf_close(infile); infile = 0; } info << "processed: " << nproc << " samples (decoded " << nrx << ") in " << wall_time[1].tv_sec + wall_time[1].tv_nsec / 1e9 << " seconds"; LOG_INFO("%s", info.str().c_str()); double speed = nproc / (ru[1].ru_utime.tv_sec + ru[1].ru_utime.tv_usec / 1e6); char secs[20]; snprintf(secs, sizeof(secs), "%d.%06d", (int)(ru[1].ru_utime.tv_sec), (int)(ru[1].ru_utime.tv_usec / 1000) ); info << "cpu time : " << secs << "; speed=" << speed << "/s; factor=" << speed / active_modem->get_samplerate(); LOG_INFO("%s", info.str().c_str()); } // ---------------------------------------------------------------------------- static size_t do_rx(struct rusage ru[2], struct timespec wall_time[2]) { size_t nread; size_t inlen = 1 << 19; double* inbuf = new double[inlen]; if (infile) { nread = 0; clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); for (size_t n; (n = sf_readf_double(infile, inbuf, inlen)); nread += n) active_modem->rx_process(inbuf, n); } else { memset(inbuf, 0, sizeof(double) * inlen); clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); for (nread = benchmark.samples; nread > inlen; nread -= inlen) active_modem->rx_process(inbuf, inlen); if (nread) active_modem->rx_process(inbuf, nread); nread = benchmark.samples; } getrusage(RUSAGE_SELF, &ru[1]); clock_gettime(CLOCK_MONOTONIC, &wall_time[1]); delete [] inbuf; return nread; } size_t inlen = 1 << 19; static float* inbuf = 0; static long src_read(void* arg, float** data) { *data = inbuf; return inlen; } static long src_readf(void* arg, float** data) { long n = (long)sf_readf_float(infile, inbuf, inlen); *data = n ? inbuf : 0; return n; } static size_t do_rx_src(struct rusage ru[2], struct timespec wall_time[2]) { int err; SRC_STATE* src_state; if (infile) src_state = src_callback_new(src_readf, benchmark.src_type, 1, &err, NULL); else src_state = src_callback_new(src_read, benchmark.src_type, 1, &err, NULL); if (!src_state) { LOG_ERROR("src_callback_new error %d: %s", err, src_strerror(err)); return 0; } inbuf = new float[inlen]; size_t outlen = (size_t)floor(inlen * benchmark.src_ratio); float* outbuf = new float[outlen]; double* rxbuf = new double[outlen]; long n; size_t nread; if (infile) { // read until src returns 0 nread = 0; clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); while ((n = src_callback_read(src_state, benchmark.src_ratio, outlen, outbuf))) { for (long i = 0; i < n; i++) rxbuf[i] = outbuf[i]; active_modem->rx_process(rxbuf, n); nread += n; } nread = (size_t)round(nread * benchmark.src_ratio); } else { // read benchmark.samples * benchmark.src_ratio nread = (size_t)round(benchmark.samples * benchmark.src_ratio); clock_gettime(CLOCK_MONOTONIC, &wall_time[0]); getrusage(RUSAGE_SELF, &ru[0]); while (nread > outlen) { if ((n = src_callback_read(src_state, benchmark.src_ratio, outlen, outbuf)) == 0) break; for (long i = 0; i < n; i++) rxbuf[i] = outbuf[i]; active_modem->rx_process(rxbuf, n); nread -= (size_t)n; } if (nread) { if ((n = src_callback_read(src_state, benchmark.src_ratio, nread, outbuf))) { for (long i = 0; i < n; i++) rxbuf[i] = outbuf[i]; active_modem->rx_process(rxbuf, n); } } nread = benchmark.samples; } getrusage(RUSAGE_SELF, &ru[1]); clock_gettime(CLOCK_MONOTONIC, &wall_time[1]); delete [] inbuf; delete [] outbuf; delete [] rxbuf; return nread; } fldigi-4.2.05/src/misc/dxcc.cxx0000664000175000017500000003103214611711171013151 00000000000000// ---------------------------------------------------------------------------- // dxcc.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include "fileselect.h" #include "gettext.h" #include "dxcc.h" #include "debug.h" #include "configuration.h" #include "confdialog.h" #include "main.h" #if HAVE_STD_HASH # include using std::unordered_map; typedef std::unordered_map dxcc_map_t; typedef std::unordered_map qsl_map_t; #elif HAVE_STD_TR1_HASH # include using std::tr1::unordered_map; typedef std::tr1::unordered_map dxcc_map_t; typedef std::tr1::unordered_map qsl_map_t; #else # error "No std::hash or std::tr1::hash support" #endif dxcc::dxcc(const char* cn, int cq, int itu, const char* ct, float lat, float lon, float tz) : country(cn), cq_zone(cq), itu_zone(itu), latitude(lat), longitude(lon), gmt_offset(tz) { if (*ct) { continent[0] = ct[0]; continent[1] = ct[1]; } continent[2] = '\0'; } typedef std::vector dxcc_list_t; static dxcc_map_t* cmap = 0; static dxcc_list_t* clist = 0; static std::vector* cnames = 0; static std::list lnames; std::string cbolist; static void add_prefix(std::string& prefix, dxcc* entry); extern std::string s_ctydat; // comparison, not case sensitive. static bool compare_nocase (const std::string& first, const std::string& second) { unsigned int i=0; while ( (i tolower(second[i])) return false; ++i; } return ( first.length() < second.length() ); } bool dxcc_internal_data() { std::string tempfname = HomeDir; tempfname.append("/temp/ctydat.txt"); std::ofstream out(tempfname.c_str()); if (!out) { LOG_INFO("Could not write temp file %s", tempfname.c_str()); return false; } out << s_ctydat; out.close(); std::ifstream in(tempfname.c_str()); if (!in) { LOG_INFO("Could not read temp file %s", tempfname.c_str()); return false; } LOG_INFO("Using internal cty.dat data"); cmap = new dxcc_map_t; cnames = new std::vector; // this MUST be greater than the actual number of dcxx entities or // the Windows gcc string library will move all of the strings and // destroy the integrity of the cmap c_str() pointer to the country // string in cnames cnames->reserve(500); // approximate number of dxcc entities clist = new dxcc_list_t; clist->reserve(500); dxcc* entry; std::string record; unsigned nrec = 0; while (getline(in, record, ';')) { std::istringstream is(record); entry = new dxcc; nrec++; // read country name cnames->resize(cnames->size() + 1); clist->push_back(entry); getline(is, cnames->back(), ':'); entry->country = cnames->back().c_str(); lnames.push_back(entry->country); // cq zone (is >> entry->cq_zone).ignore(); // itu zone (is >> entry->itu_zone).ignore(); // continent (is >> std::ws).get(entry->continent, 3).ignore(); // latitude (is >> entry->latitude).ignore(); // longitude (is >> entry->longitude).ignore(); // gmt offset (is >> entry->gmt_offset).ignore(256, '\n'); // prefixes and exceptions int c; std::string prefix; while ((c = is.peek()) == ' ' || c == '\n') { is >> std::ws; while (getline(is, prefix, ',')) { add_prefix(prefix, entry); if ((c = is.peek()) == '\n') break; } } if (cnames->back() == "United States") { dxcc *usa_entry = new dxcc( "USA", entry->cq_zone, entry->itu_zone, entry->continent, entry->latitude, entry->longitude, entry->gmt_offset ); nrec++; cnames->resize(cnames->size() + 1); clist->push_back(usa_entry); lnames.push_back("USA"); } in >> std::ws; } lnames.sort(compare_nocase); cbolist.clear(); std::list::iterator p = lnames.begin(); while (p != lnames.end()) { cbolist.append(*p); p++; if (p != lnames.end()) cbolist.append("|"); } std::stringstream info; info << "\nLoaded " << cmap->size() << " prefixes for " << nrec << " countries from internal cty.dat\n" << "You should download the latest from http://www.country-files.com"; LOG_INFO("%s", info.str().c_str()); remove(tempfname.c_str()); return true; } bool dxcc_open(const char* filename) { if (cmap) { LOG_INFO("cty.dat already loaded"); return true; } std::ifstream in(filename); if (!in) { LOG_INFO("Could not read contest country file \"%s\"", filename); return dxcc_internal_data(); } cmap = new dxcc_map_t; cnames = new std::vector; // this MUST be greater than the actual number of dcxx entities or // the Windows gcc string library will move all of the strings and // destroy the integrity of the cmap c_str() pointer to the country // string in cnames cnames->reserve(500); // approximate number of dxcc entities clist = new dxcc_list_t; clist->reserve(500); dxcc* entry; std::string record; unsigned nrec = 0; while (getline(in, record, ';')) { std::istringstream is(record); entry = new dxcc; nrec++; // read country name cnames->resize(cnames->size() + 1); clist->push_back(entry); getline(is, cnames->back(), ':'); entry->country = cnames->back().c_str(); lnames.push_back(entry->country); // cq zone (is >> entry->cq_zone).ignore(); // itu zone (is >> entry->itu_zone).ignore(); // continent (is >> std::ws).get(entry->continent, 3).ignore(); // latitude (is >> entry->latitude).ignore(); // longitude (is >> entry->longitude).ignore(); // gmt offset (is >> entry->gmt_offset).ignore(256, '\n'); // prefixes and exceptions int c; std::string prefix; while ((c = is.peek()) == ' ' || c == '\r' || c == '\n') { is >> std::ws; while (getline(is, prefix, ',')) { add_prefix(prefix, entry); if ((c = is.peek()) == '\r' || c == '\n') break; } } if (cnames->back() == "United States") { dxcc *usa_entry = new dxcc( "USA", entry->cq_zone, entry->itu_zone, entry->continent, entry->latitude, entry->longitude, entry->gmt_offset ); nrec++; cnames->resize(cnames->size() + 1); clist->push_back(usa_entry); lnames.push_back("USA"); } in >> std::ws; } lnames.sort(compare_nocase); cbolist.clear(); std::list::iterator p = lnames.begin(); while (p != lnames.end()) { cbolist.append(*p); p++; if (p != lnames.end()) cbolist.append("|"); } std::stringstream info; info << "Loaded " << cmap->size() << " prefixes for " << nrec << " countries"; LOG_VERBOSE("%s", info.str().c_str()); return true; } bool dxcc_is_open(void) { return cmap; } void dxcc_close(void) { if (!cmap) return; delete cnames; cnames = 0; std::map rm; for (dxcc_map_t::iterator i = cmap->begin(); i != cmap->end(); ++i) if (rm.insert(std::make_pair(i->second, true)).second) delete i->second; delete cmap; cmap = 0; delete clist; clist = 0; } const std::vector* dxcc_entity_list(void) { return clist; } const dxcc* dxcc_lookup(const char* callsign) { if (!cmap || !callsign || !*callsign) return NULL; std::string sstr; sstr.resize(strlen(callsign) + 1); transform(callsign, callsign + sstr.length() - 1, sstr.begin() + 1, static_cast(toupper)); // first look for a full callsign (prefixed with '=') sstr[0] = '='; dxcc_map_t::const_iterator entry = cmap->find(sstr); if (entry != cmap->end()) { entry->second->print(); return entry->second; } // erase the '=' and do a longest prefix search sstr.erase(0, 1); size_t len = sstr.length(); // accomodate special case for KG4... calls // all two letter suffix KG4 calls are Guantanamo // all others are US non Guantanamo if (sstr.find("KG4") != std::string::npos) { if (len == 4 || len == 6) { sstr = "K"; len = 1; } } do { sstr.resize(len--); if ((entry = cmap->find(sstr)) != cmap->end()) { entry->second->print(); return entry->second; } } while (len); return NULL; } static void add_prefix(std::string& prefix, dxcc* entry) { std::string::size_type i = prefix.find_first_of("([<{"); if (likely(i == std::string::npos)) { (*cmap)[prefix] = entry; return; } std::string::size_type j = i, first = i; do { entry = new struct dxcc(*entry); switch (prefix[i++]) { // increment i past opening bracket case '(': if ((j = prefix.find(')', i)) == std::string::npos) { delete entry; return; } prefix[j] = '\0'; entry->cq_zone = atoi(prefix.data() + i); break; case '[': if ((j = prefix.find(']', i)) == std::string::npos) { delete entry; return; } prefix[j] = '\0'; entry->itu_zone = atoi(prefix.data() + i); break; case '<': if ((j = prefix.find('/', i)) == std::string::npos) { delete entry; return; } prefix[j] = '\0'; entry->latitude = atof(prefix.data() + i); if ((j = prefix.find('>', j)) == std::string::npos) { delete entry; return; } prefix[j] = '\0'; entry->longitude = atof(prefix.data() + i); break; case '{': if ((j = prefix.find('}', i)) == std::string::npos) { delete entry; return; } memcpy(entry->continent, prefix.data() + i, 2); break; } } while ((i = prefix.find_first_of("([<{", j)) != std::string::npos); prefix.erase(first); (*cmap)[prefix] = entry; } static qsl_map_t* qsl_calls; static unsigned char qsl_open_; const char* qsl_names[] = { "LoTW", "eQSL" }; bool qsl_open(const char* filename, qsl_t qsl_type) { std::ifstream in(filename); if (!in) return false; if (!qsl_calls) qsl_calls = new qsl_map_t; size_t n = qsl_calls->size(); std::string::size_type p; std::string s; s.reserve(32); while (getline(in, s)) { if ((p = s.rfind('\r')) != std::string::npos) s.erase(p); (*qsl_calls)[s] |= (1 << qsl_type); } std::stringstream info; info << "Added " << qsl_calls->size() - n << " " << qsl_names[qsl_type] << " callsigns from \"" << filename << "\""; LOG_VERBOSE("%s", info.str().c_str()); qsl_open_ |= (1 << qsl_type); return true; } unsigned char qsl_is_open(void) { return qsl_open_; } void qsl_close(void) { delete qsl_calls; qsl_calls = 0; qsl_open_ = 0; } unsigned char qsl_lookup(const char* callsign) { if (qsl_calls == 0) return 0; std::string str; str.resize(strlen(callsign)); transform(callsign, callsign + str.length(), str.begin(), static_cast(toupper)); qsl_map_t::const_iterator i = qsl_calls->find(str); return i == qsl_calls->end() ? 0 : i->second; } void reload_cty_dat() { dxcc_close(); dxcc_open(std::string(progdefaults.cty_dat_pathname).append("cty.dat").c_str()); qsl_close(); qsl_open(std::string(progdefaults.cty_dat_pathname).append("lotw1.txt").c_str(), QSL_LOTW); if (!qsl_open(std::string(progdefaults.cty_dat_pathname).append("eqsl.txt").c_str(), QSL_EQSL)) qsl_open(std::string(progdefaults.cty_dat_pathname).append("AGMemberList.txt").c_str(), QSL_EQSL); } void default_cty_dat_pathname() { progdefaults.cty_dat_pathname = HomeDir; txt_cty_dat_pathname->value(progdefaults.cty_dat_pathname.c_str()); } void select_cty_dat_pathname() { std::string deffilename = progdefaults.cty_dat_pathname; const char *p = FSEL::select(_("Locate cty.dat folder"), _("cty.dat\t*"), deffilename.c_str()); if (p) { std::string nupath = p; size_t ptr; //crappy win32 again ptr = nupath.find("\\"); while (ptr != std::string::npos) { nupath[ptr] = '/'; ptr = nupath.find("\\"); } size_t endslash = nupath.rfind("/"); if ((endslash != std::string::npos) && (endslash != (nupath.length()-1))) nupath.erase(endslash + 1); progdefaults.cty_dat_pathname = nupath; progdefaults.changed = true; txt_cty_dat_pathname->value(nupath.c_str()); } } fldigi-4.2.05/src/misc/record_loader.cxx0000664000175000017500000003344614611711171015047 00000000000000// ---------------------------------------------------------------------------- // record_loader.cxx // // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #ifdef __MINGW32__ # include "compat.h" #endif #include "record_loader.h" #include "record_browse.h" #include "debug.h" #include "main.h" #include "icons.h" #include "fl_digi.h" #include "strutil.h" #include "gettext.h" #include "network.h" #include #include #include #include #include "FL/Fl_Double_Window.H" #include "FL/Fl_Output.H" #include "FL/fl_ask.H" #include "FL/Fl_Check_Button.H" LOG_FILE_SOURCE(debug::LOG_DATASOURCES); Fl_Double_Window *dlgRecordLoader = (Fl_Double_Window *)0; /// Loads a file and stores it for later lookup. int RecordLoaderInterface::LoadAndRegister() { Clear(); std::string filnam = storage_filename().first; time_t cntTim = time(NULL); LOG_INFO("Opening:%s", filnam.c_str()); std::ifstream ifs( filnam.c_str() ); /// Reuse the same string for each new record. std::string input_str ; size_t nbRec = 0 ; while( ! ifs.eof() ) { if( ! std::getline( ifs, input_str ) ) break; /// Comments are legal with # as first character. if( input_str[0] == '#' ) continue; imemstream str_strm( input_str ); try { if( ReadRecord( str_strm ) ) { ++nbRec; } else { LOG_WARN( "Cannot process '%s'", input_str.c_str() ); } } catch(const std::exception & exc) { LOG_WARN( "%s: Caught <%s> when reading '%s'", base_filename().c_str(), exc.what(), input_str.c_str() ); return -1 ; } } ifs.close(); LOG_INFO( "Read:%s with %d records in %d seconds", filnam.c_str(), static_cast(nbRec), static_cast( time(NULL) - cntTim ) ); return nbRec ; } // ---------------------------------------------------------------------------- struct Row { Fl_Output * m_timestamp ; Fl_Check_Button * m_select ; Fl_Output * m_content_size ; Fl_Output * m_nb_rows ; Fl_Button * m_url ; RecordLoaderInterface * m_itf ; bool UpdateRow() { const std::string str = m_itf->Timestamp(); m_timestamp->value(str.c_str()); const std::string & strSz = m_itf->ContentSize(); m_content_size->value(strSz.c_str()); int nb_recs = m_itf->LoadAndRegister(); char nb_recs_str[64]; bool isGood = ( nb_recs >= 0 ); if( isGood ) snprintf( nb_recs_str, sizeof(nb_recs_str), "%6d", nb_recs ); else strcpy( nb_recs_str, " N/A" ); m_nb_rows->value(nb_recs_str); const char * strurl = m_itf->Url(); if( strurl != NULL ) { const std::string strnam = m_itf->base_filename(); m_url->tooltip( strurl ); } if (dlgRecordLoader) dlgRecordLoader->damage(); return isGood ; } }; /// Array all data loaders. It is setup at start time. static Row * all_recs = NULL ; /// Number of data loaders, it is a very small integer. static int dataloader_nb = 0 ; static const int nb_cols = 5 ; // ---------------------------------------------------------------------------- /// This is a virtual class, therefore it must have a default constructor. RecordLoaderInterface::RecordLoaderInterface() { ++dataloader_nb ; /// We prefer tp use realloc because it is ready before main() is called. all_recs = (Row *)realloc( all_recs, dataloader_nb * sizeof( Row ) ); all_recs[ dataloader_nb - 1 ].m_itf = this ; } /// This happens very rarely, so performance is not an issue. RecordLoaderInterface::~RecordLoaderInterface() { for( int i = 0; i < dataloader_nb; ++i ) { if( all_recs[i].m_itf == this ) { memmove( all_recs + i, all_recs + i + 1, sizeof( Row ) * ( dataloader_nb - i - 1 ) ); --dataloader_nb ; return ; } } LOG_ERROR("Inconsistent %d", dataloader_nb ); } /// This takes only the filename from the complete HTTP or FTP URL, or file path. std::string RecordLoaderInterface::base_filename() const { const char * pFil = strrchr( Url(), '/' ); if( pFil == NULL ) pFil = Url(); else ++pFil ; /// This might be an URL so we take only the beginning. const char * quest = strchr( pFil, '?' ); if( quest == NULL ) quest = pFil + strlen(pFil); return std::string( pFil, quest ); } std::pair< std::string, bool > RecordLoaderInterface::storage_filename(bool create_dir) const { /// We check if it is changed, it is not performance-critical. if( create_dir ) { if( ask_dir_creation( DATA_dir ) ) { const char * err = create_directory( DATA_dir.c_str() ); if( err ) { fl_alert("Error:%s",err); } } } std::string filnam_data = DATA_dir; filnam_data.append(base_filename()); if( create_dir ) { return std::make_pair( filnam_data, false ); } /// This is for a read access. std::ifstream ifs( filnam_data.c_str() ); if( ifs ) { ifs.close(); return std::make_pair( filnam_data, false ); } if( errno != ENOENT ) { LOG_WARN( "Cannot read '%s': %s", filnam_data.c_str(), strerror(errno) ); } // Second try with a file maybe installed by "make install". std::string filnam_inst = PKGDATADIR "/" + base_filename(); LOG_INFO("Errno=%s with %s. Trying %s", strerror(errno), filnam_data.c_str(), filnam_inst.c_str() ); ifs.open( filnam_inst.c_str() ); if( ifs ) { ifs.close(); return std::make_pair( filnam_inst, true ); } /// But the file is not there. return std::make_pair( filnam_data, false ); } std::string RecordLoaderInterface::Timestamp() const { std::string filnam = storage_filename().first; struct stat st; if (stat(filnam.c_str(), &st) == -1 ) return "N/A"; struct tm tmLastMod = *localtime( & st.st_mtime ); char buf[64]; snprintf(buf, sizeof(buf), "%d/%d/%d %02d:%02d", tmLastMod.tm_year + 1900, tmLastMod.tm_mon + 1, tmLastMod.tm_mday, tmLastMod.tm_hour, tmLastMod.tm_min ); return buf ; } std::string RecordLoaderInterface::ContentSize() const { /// It would be faster to cache this result in the object. std::string filnam = storage_filename().first; struct stat st; if (stat(filnam.c_str(), &st) == -1 ) return " N/A"; std::stringstream buf; buf.width(9); buf.fill(' '); buf << st.st_size; return buf.str(); } // ---------------------------------------------------------------------------- static void cb_record_url(Fl_Widget *w, void* ptr) { const RecordLoaderInterface * it = static_cast< const RecordLoaderInterface * >(ptr); cb_mnuVisitURL( NULL, const_cast< char * >( it->Url() ) ); } void DerivedRecordLst::AddRow( int row ) { Row * ptRow = all_recs + row ; int X,Y,W,H; int col=0; { col_width( col, 110 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_timestamp = new Fl_Output(X,Y,W,H); ptRow->m_timestamp->tooltip( _("Data file creation date") ); } ++col; { col_width( col, 16 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_select = new Fl_Check_Button(X,Y,W,H); ptRow->m_select->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); ptRow->m_select->value(1); } ++col; { col_width( col, 80 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_content_size = new Fl_Output(X,Y,W,H); ptRow->m_content_size->tooltip( _("Size in bytes") ); } ++col; { col_width( col, 50 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); ptRow->m_nb_rows = new Fl_Output(X,Y,W,H); ptRow->m_nb_rows->tooltip( _("Number of lines in data file") ); } ++col; { col_width( col, 166 ); find_cell(CONTEXT_TABLE, row, col, X, Y, W, H); const char * strurl = ptRow->m_itf->Url(); ptRow->m_url = NULL ; if( strurl != NULL ) { const std::string strnam = ptRow->m_itf->base_filename(); ptRow->m_url = new Fl_Button(X,Y,W,H, strdup(strnam.c_str()) ); ptRow->m_url->tooltip( strurl ); ptRow->m_url->callback(cb_record_url, ptRow->m_itf); } else { ptRow->m_url = new Fl_Button(X, Y, W, H, "N/A"); } } ptRow->UpdateRow(); } DerivedRecordLst::DerivedRecordLst(int x, int y, int w, int h, const char *title) : Fl_Table(x,y,w,h,title) { col_header(1); col_resize(1); col_header_height(25); row_header(1); row_resize(0); row_header_width(105); rows(dataloader_nb); cols(nb_cols); begin(); // start adding widgets to group { for( int row = 0; row < dataloader_nb; ++row ) { AddRow( row ); } } end(); } DerivedRecordLst::~DerivedRecordLst() { } // Handle drawing all cells in table void DerivedRecordLst::draw_cell(TableContext context, int R, int C, int X, int Y, int W, int H) { switch ( context ) { case CONTEXT_STARTPAGE: fl_font(FL_HELVETICA, 12); // font used by all headers break; case CONTEXT_RC_RESIZE: { int X, Y, W, H; int index = 0; for ( int r = 0; r= children() ) break; find_cell(CONTEXT_TABLE, r, c, X, Y, W, H); child(index++)->resize(X,Y,W,H); } } init_sizes(); // tell group children resized return; } case CONTEXT_ROW_HEADER: fl_push_clip(X, Y, W, H); { RecordLoaderInterface * it = ( (R >= 0) && ( R < dataloader_nb ) ) ? all_recs[ R ].m_itf : NULL; if( it == NULL ) { LOG_ERROR("R=%d",R); return; } const char * str = it ? it->Description() : "Unknown" ; fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, row_header_color()); fl_color(FL_BLACK); fl_draw(str, X, Y, W, H, FL_ALIGN_CENTER); } fl_pop_clip(); return; case CONTEXT_COL_HEADER: fl_push_clip(X, Y, W, H); { static const char * col_names[nb_cols] = { _("Timestamp"), _(" "), _("Size"), _("# recs"), _("WWW"), }; const char * title = ( ( C >= 0 ) && ( C < nb_cols ) ) ? col_names[C] : "?" ; fl_draw_box(FL_THIN_UP_BOX, X, Y, W, H, col_header_color()); fl_color(FL_BLACK); fl_draw(title, X, Y, W, H, FL_ALIGN_CENTER); } fl_pop_clip(); return; case CONTEXT_CELL: // fl_push_clip(X, Y, W, H); return; // fltk handles drawing the widgets default: return; } } void DerivedRecordLst::cbGuiUpdate() { std::string server = inpDataSources->value(); if( server.empty() ) { fl_alert(_("No server selected")); return ; } if( server[server.size()-1] != '/' ) server += '/' ; for( int row = 0; row < dataloader_nb; ++row ) { Row * ptrRow = all_recs + row; if( ! ptrRow->m_select->value() ) continue ; RecordLoaderInterface * it = ptrRow->m_itf; std::string url = server + it->base_filename(); std::string reply ; // double timeout=5.0; // Consider truncating the HTTP header. // int res = get_http_gui(url, reply, timeout ); int res = get_http(url, reply, 5.0); LOG_INFO("Loaded %s : %d chars. res=%d", url.c_str(), (int)reply.size(), res ); if (reply.empty()) { int ok = fl_choice2( _("Could not download %s"), _("Continue"), _("Stop"), NULL, url.c_str() ); if( ok == 1 ) break ; continue ; } static const char *notFound404 = "HTTP/1.1 404 Not Found"; if( 0 == strncmp( reply.c_str(), notFound404, strlen(notFound404) ) ) { int ok = fl_choice2( _("Non-existent URL: %s"), _("Continue"), _("Stop"), NULL, url.c_str() ); if( ok == 1 ) break ; continue ; } /// This creates the directory if necessary; std::string filnam = it->storage_filename(true).first; std::ofstream ofstrm( filnam.c_str() ); if( ofstrm ) ofstrm.write( &reply[0], reply.size() ); if( ! ofstrm ) { int ok = fl_choice2( _("Error saving %s to %s:%s"), _("Continue"), _("Stop"), NULL, url.c_str(), filnam.c_str(), strerror(errno) ); if( ok == 1 ) break ; continue ; } ofstrm.close(); bool isGood = all_recs[row].UpdateRow(); if( ! isGood ) { int ok = fl_choice2( _("Error loading %s to %s: %s."), _("Continue"), _("Stop"), NULL, url.c_str(), filnam.c_str(), strerror(errno) ); if( ok == 0 ) break ; continue ; } } btnDataSourceUpdate->value(0); } void DerivedRecordLst::cbGuiReset() { fprintf(stderr, "%s\n", __FUNCTION__ ); for( int row = 0; row < dataloader_nb; ++row ) { Row * ptrRow = all_recs + row; if( ! ptrRow->m_select->value() ) continue ; RecordLoaderInterface * it = ptrRow->m_itf; std::pair< std::string, bool > stofil_pair = it->storage_filename(true); it->Clear(); const char * stofil = stofil_pair.first.c_str() ; if( stofil_pair.second ) { fl_alert("Cannot erase installed data file %s", stofil ); continue ; } else { LOG_INFO("Erasing %s", stofil ); int res = ::remove( stofil ); if( ( res != 0 ) && ( res != ENOENT ) ) { fl_alert("Error erasing data file %s:%s", stofil, strerror(errno) ); continue ; } all_recs[row].UpdateRow(); } } } // ---------------------------------------------------------------------------- /// Necessary because in a Fl_Menu, a slash has a special meaning. static std::string fl_escape( const char * str ) { std::string res ; for( char ch ; ( ch = *str ) != '\0' ; ++str ) { if( ch == '/' ) res += '\\'; res += ch ; } return res ; } static void fl_input_add( const char * str ) { inpDataSources->add( fl_escape( str ).c_str() ); } void createRecordLoader() { if (dlgRecordLoader) return; dlgRecordLoader = make_record_loader_window(); fl_input_add("http://www.w1hkj.com/support_files/"); inpDataSources->value(0); } // ---------------------------------------------------------------------------- fldigi-4.2.05/src/misc/macros.cxx0000664000175000017500000041625114611711171013526 00000000000000// ---------------------------------------------------------------------------- // macros.cxx // // Copyright (C) 2007-2010 // Dave Freese, W1HKJ // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2009 // Chris Sylvain, KB3CS // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "macros.h" #include "gettext.h" #include "main.h" #include "misc.h" #include "fl_digi.h" #include "timeops.h" #include "configuration.h" #include "confdialog.h" #include "logger.h" #include "newinstall.h" #include "globals.h" #include "debug.h" #include "status.h" #include "trx.h" #include "modem.h" #include "qrunner.h" #include "waterfall.h" #include "rigsupport.h" #include "network.h" #include "logsupport.h" #include "icons.h" #include "weather.h" #include "utf8file_io.h" #include "xmlrpc.h" #include "rigio.h" #include "strutil.h" #include "threads.h" #include "squelch_status.h" #include #include #include "fileselect.h" #include #include #include #include #include #include #include #include #include #ifdef __WIN32__ #include "speak.h" #endif #include "audio_alert.h" #include #include "re.h" static pthread_mutex_t exec_mutex = PTHREAD_MUTEX_INITIALIZER; struct CMDS { std::string cmd; void (*fp)(std::string); }; static std::queue Tx_cmds; static std::queue Rx_cmds; bool txque_wait = false; static std::string buffered_macro; static bool buffered = false; static size_t buffered_pointer; /* static const char *ascii4[256] = { "", "", "", "", "", "", "", "", "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", "<160>", "<161>", "<162>", "<163>", "<164>", "<165>", "<166>", "<167>", "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", "<176>", "<177>", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>", "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "<247>", "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" }; static std::string hout(std::string s) { static std::string sout; sout.clear(); for (size_t n = 0; n < s.length(); n++) sout.append(ascii4[int(s[n])]); return sout; } */ static void substitute (std::string &s, size_t &start, size_t end, std::string sub) { if (start && s[start - 1] == '\n') { start--; } //std::cout << "--------------------------------------------------------" << std::endl; if (sub.empty()) { //std::cout << "ERASED:" << hout(s.substr(start, end - start + 1)) << std::endl; s.erase(start, end - start + 1); } else { //std::cout << "REPLACED: '" << hout(s.substr(start, end - start + 1)) << // "' WITH '" << hout(sub) << "'" << std::endl; s.replace(start, end - start + 1, sub); } //std::cout << "--------------------------------------------------------" << std::endl; //std::cout << hout(s) << std::endl; //std::cout << "=========================================================" << std::endl; } static void add_text(std::string text) { if (buffered) { buffered_macro.append(text); buffered_pointer = 0; } else { TransmitText->add_text(text); } } void clear_buffered_text() { buffered_macro.clear(); } char next_buffered_macro_char() { if (buffered_macro.empty()) return 0; char c = buffered_macro[buffered_pointer++]; if (buffered_pointer >= buffered_macro.length()) { buffered_macro.clear(); buffered_pointer = 0; } return c; } static void pBUFFERED(std::string &s, size_t &i, size_t endbracket) { substitute(s, i, endbracket, ""); buffered = true; buffered_macro.clear(); } static void setwpm(double d) { sldrCWxmtWPM->value(d); cntCW_WPM->value(d); progdefaults.CWusefarnsworth = false; btnCWusefarnsworth->value(0); que_ok = true; } static void setfwpm(double d) { sldrCWfarnsworth->value(d); progdefaults.CWusefarnsworth = true; btnCWusefarnsworth->value(1); que_ok = true; } // following used for debugging and development void push_txcmd(CMDS cmd) { LOG_INFO("%s, # = %d", cmd.cmd.c_str(), (int)Tx_cmds.size()); Tx_cmds.push(cmd); } void push_rxcmd(CMDS cmd) { LOG_INFO("%s, # = %d", cmd.cmd.c_str(), (int)Rx_cmds.size()); Rx_cmds.push(cmd); } // these variables are referenced outside of this file MACROTEXT macros; CONTESTCNTR contest_count; std::string qso_time = ""; std::string qso_exchange = ""; std::string exec_date = ""; std::string exec_time = ""; std::string exec_string = ""; std::string until_date = ""; std::string until_time = ""; std::string info1msg = ""; std::string info2msg = ""; std::string text2repeat = ""; size_t repeatchar = 0; bool macro_idle_on = false; bool macro_rx_wait = false; static float idleTime = 0; static bool TransmitON = false; static bool ToggleTXRX = false; static int mNbr; static std::string text2send = ""; static size_t xbeg = 0, xend = 0; static bool save_xchg; static bool expand; static bool GET = false; static bool timed_exec = false; static bool run_until = false; static bool within_exec = false; bool local_timed_exec = false; void rx_que_continue(void *); static void postQueue(std::string s) { s.append("\n"); if (!progdefaults.macro_post) return; if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->addstr(s, FTextBase::CTRL); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr(s, FTextBase::CTRL); else ReceiveText->addstr(s, FTextBase::CTRL); } static const char cutnumbers[] = "T12345678N"; static std::string cutstr; static std::string cut_string(const char *s) { cutstr = s; if (!progdefaults.cutnbrs || active_modem != cw_modem) return cutstr; for (size_t i = 0; i < cutstr.length(); i++) if (cutstr[i] >= '0' && cutstr[i] <= '9') cutstr[i] = cutnumbers[cutstr[i] - '0']; return cutstr; } static size_t mystrftime( char *s, size_t max, const char *fmt, const struct tm *tm) { return strftime(s, max, fmt, tm); } static std::string CPSstring = "\ =============================================\n\ ABCDEFGHIJKLMN OPQRSTUVWXYZ\n\ abcdefghijklmn opqrstuvwxyz\n\ 0123456789 9876543210\n\ !@#$%&*()_+-=[]{}\\|;:'\",.<>/?\n\ =============================================\n\ \n\ The Jaberwocky\n\ \n\ 'Twas brillig, and the slithy toves\n\ Did gyre and gimble in the wabe;\n\ All mimsy were the borogoves,\n\ And the mome raths outgrabe.\n\ \n\ \"Beware the Jabberwock, my son!\n\ The jaws that bite, the claws that catch!\n\ Beware the Jubjub bird, and shun\n\ The frumious Bandersnatch!\"\n\ \n\ He took his vorpal sword in hand:\n\ Long time the manxome foe he sought-\n\ So rested he by the Tumtum tree,\n\ And stood awhile in thought.\n\ \n\ And as in uffish thought he stood,\n\ The Jabberwock, with eyes of flame,\n\ Came whiffling through the tulgey wood,\n\ And burbled as it came!\n\ \n\ One, two! One, two! and through and through\n\ The vorpal blade went snicker-snack!\n\ He left it dead, and with its head\n\ He went galumphing back.\n\ \n\ \"And hast thou slain the Jabberwock?\n\ Come to my arms, my beamish boy!\n\ O frabjous day! Callooh! Callay!\"\n\ He chortled in his joy.\n\ \n\ 'Twas brillig, and the slithy toves\n\ Did gyre and gimble in the wabe;\n\ All mimsy were the borogoves,\n\ And the mome raths outgrabe.\n"; static std::string ccode = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; bool PERFORM_CPS_TEST = false; int num_cps_chars = 0; std::string testfilename; void CPS_report(int samples, int prepost) { char specs[1000]; memset(specs, 0, 1000); std::string results = "\nCPS test\ntext: "; if (testfilename[0] != '\n') results.append("\n"); results.append(testfilename).append("\n"); std::string strout; double xmttime = 1.0 * samples / active_modem->get_samplerate(); double overhead = 1.0 * prepost / active_modem->get_samplerate(); num_cps_chars--; snprintf(specs, sizeof(specs), "\ mode: %s\n\ # chars: %d\n\ overhead: %f sec\n\ xmt time: %f sec\n\ xmt samples: %d\n\ sample rate: %d\n\ chars/sec: %f", mode_info[active_modem->get_mode()].name, num_cps_chars, overhead, xmttime - overhead, samples, active_modem->get_samplerate(), num_cps_chars / (xmttime - overhead)); results.append(specs); LOG_INFO("%s", results.c_str()); results.append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(results.c_str(), FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr(results.c_str(), FTextBase::ALTR); else ReceiveText->add(results.c_str(), FTextBase::ALTR); PERFORM_CPS_TEST = false; } static void pCPS_TEST(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr("Mode not supported", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+10, endbracket - i - 10); s.clear(); int n; if (buffer.empty()) n = 10; sscanf(buffer.c_str(), "%d", &n); if (n <= 0) n = 10; if (n > 100) n = 100; // sample count with 'n' characters int s1[256]; for (int i = 0; i < 256; i++) s1[i] = 0; // converstion from sample count to milliseconds double k = 1000.0 / (active_modem->get_samplerate() * n); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; int s0 = number_of_samples(""); // sample count for characters ' ' through '~' for(int j = 0; j < 256; j++) { s1[j] = number_of_samples(std::string(n, j)) - s0; } PERFORM_CPS_TEST = false; // report generator char results[200]; std::string line_out; snprintf(results, sizeof(results), "\nCPS test\nMode : %s\n", mode_info[active_modem->get_mode()].name); line_out = results; snprintf(results, sizeof(results), "Based on %d character string\n", n); line_out.append(results); snprintf(results, sizeof(results), "Overhead = %.3f msec\n", 1000.0 * s0 / active_modem->get_samplerate()); line_out.append(results); for (int j = 0, ln = 0; j < 256; j++ ) { snprintf(results, sizeof(results), "%2x%8.2f", j, k * s1[j]); line_out.append(results); ln++; if (ln && (ln % 4 == 0)) line_out.append("\n"); else line_out.append(" | "); } if (!line_out.empty()) { LOG_INFO("%s", line_out.c_str()); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(line_out.c_str(), FTextBase::ALTR); if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(line_out.c_str(), FTextBase::ALTR); else ReceiveText->add(line_out.c_str(), FTextBase::ALTR); } return; } static void pCPS_FILE(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string fname = s.substr(i+10, endbracket - i - 10); if (fname.length() > 0 && !within_exec) { FILE *toadd = fl_fopen(fname.c_str(), "r"); if (toadd) { std::string buffer; char c = getc(toadd); while (c && !feof(toadd)) { if (c != '\r') buffer += c; // damn MSDOS txt files c = getc(toadd); } s.clear(); fclose(toadd); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); testfilename = fname; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; int s0 = number_of_samples(""); num_cps_chars = 0; CPS_report(number_of_samples(buffer), s0); PERFORM_CPS_TEST = false; } else { std::string resp = "Could not locate "; resp.append(fname).append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(resp.c_str(), FTextBase::ALTR); else ReceiveText->add(resp.c_str(), FTextBase::ALTR); LOG_WARN("%s not found", fname.c_str()); substitute(s, i, endbracket, ""); PERFORM_CPS_TEST = false; } } else { PERFORM_CPS_TEST = false; s.clear(); } } static void pCPS_STRING(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+12, endbracket - i - 12); std::string txtbuf = buffer; s.clear(); size_t p = buffer.find("\\n"); while (p != std::string::npos) { buffer.replace(p,2,"\n"); p = buffer.find("\\n"); } if (buffer.length()) { if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; int s0 = number_of_samples(""); num_cps_chars = 0; testfilename = txtbuf; CPS_report(number_of_samples(buffer), s0); PERFORM_CPS_TEST = false; } else { std::string resp = "Text not specified"; LOG_WARN("%s", resp.c_str()); resp.append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(resp.c_str(), FTextBase::ALTR); else ReceiveText->add(resp.c_str(), FTextBase::ALTR); PERFORM_CPS_TEST = false; } } static void pCPS_N(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+7, endbracket - i - 7); s.clear(); if (buffer.empty()) return; int numgroups, wc, cc, cl; cl = ccode.length(); sscanf(buffer.c_str(), "%d", &numgroups); if (numgroups <= 0 || numgroups > 100000) numgroups = 100; srand(time(0)); buffer.clear(); for (wc = 1; wc <= numgroups; wc++) { for (cc = 0; cc < 5; cc++) { buffer += ccode[ rand() % cl ]; } if (wc % 10 == 0) buffer += '\n'; else buffer += ' '; } if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; int s0 = number_of_samples(""); num_cps_chars = 0; testfilename = "Random group test"; CPS_report(number_of_samples(buffer), s0); PERFORM_CPS_TEST = false; return; } static void pWAV_TEST(std::string &s, size_t &i, size_t endbracket) { s.clear(); trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); return; } testfilename = "internal string"; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); number_of_samples(CPSstring); PERFORM_CPS_TEST = false; } static void pWAV_N(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+7, endbracket - i - 7); s.clear(); if (buffer.empty()) return; int numgroups, wc, cc, cl; cl = ccode.length(); sscanf(buffer.c_str(), "%d", &numgroups); if (numgroups <= 0 || numgroups > 100000) numgroups = 100; srand(time(0)); buffer.clear(); for (wc = 1; wc <= numgroups; wc++) { for (cc = 0; cc < 5; cc++) { buffer += ccode[ rand() % cl ]; } if (wc % 10 == 0) buffer += '\n'; else buffer += ' '; } if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); number_of_samples(buffer); PERFORM_CPS_TEST = false; return; } static void pWAV_FILE(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string fname = s.substr(i+10, endbracket - i - 10); if (fname.length() > 0 && !within_exec) { FILE *toadd = fl_fopen(fname.c_str(), "r"); if (toadd) { std::string buffer; char c = getc(toadd); while (c && !feof(toadd)) { if (c != '\r') buffer += c; // damn MSDOS txt files c = getc(toadd); } s.clear(); fclose(toadd); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); testfilename = fname; stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); number_of_samples(buffer); PERFORM_CPS_TEST = false; } else { std::string resp = "Could not locate "; resp.append(fname).append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(resp.c_str(), FTextBase::ALTR); else ReceiveText->add(resp.c_str(), FTextBase::ALTR); LOG_WARN("%s not found", fname.c_str()); substitute(s, i, endbracket, ""); PERFORM_CPS_TEST = false; } } else { PERFORM_CPS_TEST = false; s.clear(); } } static void pWAV_STRING(std::string &s, size_t &i, size_t endbracket) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add("Mode not supported\n", FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add("Mode not supported\n", FTextBase::ALTR); else ReceiveText->add("Mode not supported\n", FTextBase::ALTR); s.clear(); return; } std::string buffer = s.substr(i+12, endbracket - i - 12); std::string txtbuf = buffer; s.clear(); size_t p = buffer.find("\\n"); while (p != std::string::npos) { buffer.replace(p,2,"\n"); p = buffer.find("\\n"); } if (buffer.length()) { if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); stopMacroTimer(); active_modem->set_stopflag(false); PERFORM_CPS_TEST = true; trx_transmit(); testfilename = txtbuf; number_of_samples(buffer); PERFORM_CPS_TEST = false; } else { std::string resp = "Text not specified"; LOG_WARN("%s", resp.c_str()); resp.append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->add(resp.c_str(), FTextBase::ALTR); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->add(resp.c_str(), FTextBase::ALTR); else ReceiveText->add(resp.c_str(), FTextBase::ALTR); PERFORM_CPS_TEST = false; } } static void pCOMMENT(std::string &s, size_t &i, size_t endbracket) { substitute(s, i, endbracket, ""); if (s[i] == '\n') i++; } static void pFILE(std::string &s, size_t &i, size_t endbracket) { std::string fname = s.substr(i+6, endbracket - i - 6); if (fname.length() > 0 && !within_exec) { FILE *toadd = fl_fopen(fname.c_str(), "r"); if (toadd) { std::string buffer; char c = getc(toadd); while (c && !feof(toadd)) { if (c != '\r') buffer += c; // change CRLF to LF c = getc(toadd); } size_t blen = buffer.length(); if (blen > 0) { if (!(buffer[blen -1] == ' ' || buffer[blen-1] == '\n')) buffer += ' '; } substitute(s, i, endbracket, buffer); fclose(toadd); } else { LOG_WARN("%s not found", fname.c_str()); substitute(s, i, endbracket, "ERROR: CANNOT OPEN FILE"); } } else { substitute(s, i, endbracket, "OH SHIT"); } } static notify_dialog *macro_alert_dialog = 0; static void doTIMER(std::string s) { int number; std::string sTime = s.substr(7); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%d", &number); int mtime = stop_macro_time(); if (mtime >= number) { if (!macro_alert_dialog) macro_alert_dialog = new notify_dialog; std::ostringstream comment; comment << "Macro timer must be > macro duration of " << mtime << " secs"; macro_alert_dialog->notify(comment.str().c_str(), 5.0); REQ(show_notifier, macro_alert_dialog); progStatus.skip_sked_macro = false; } else { progStatus.timer = number - mtime; progStatus.timerMacro = mNbr; progStatus.skip_sked_macro = true; } } que_ok = true; } static void pTIMER(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTIMER }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void doAFTER(std::string s) { int number; std::string sTime = s.substr(7); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%d", &number); progStatus.timer = number; progStatus.timerMacro = mNbr; progStatus.skip_sked_macro = true; } que_ok = true; } static void pAFTER(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doAFTER }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pREPEAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } progStatus.repeatMacro = mNbr; substitute(s, i, endbracket, ""); text2repeat = s; repeatchar = 0; s.insert(i, "[REPEAT]"); } static void pWPM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } float number; std::string snumber = s.substr(i+5, endbracket - i - 5); if (snumber.length() > 0) { // first value = WPM sscanf(snumber.c_str(), "%f", &number); if (number < 5) number = 5; if (number > 200) number = 200; progdefaults.CWspeed = number; setwpm(number); // second value = Farnsworth WPM size_t pos; if ((pos = snumber.find(":")) != std::string::npos) { snumber.erase(0, pos+1); if (snumber.length()) sscanf(snumber.c_str(), "%f", &number); if (number < 5) number = 5; if (number > progdefaults.CWspeed) number = progdefaults.CWspeed; progdefaults.CWfarnsworth = number; if (number == progdefaults.CWspeed) setwpm(number); else setfwpm(number); } } substitute(s, i, endbracket, ""); } static void pRISETIME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } float number; std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWrisetime = number; cntCWrisetime->value(number); } substitute(s, i, endbracket, ""); } static void pPRE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } float number; std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWpre = number; cntPreTiming->value(number); } substitute(s, i, endbracket, ""); } static void pPOST(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } float number; std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < -20) number = -20; if (number > 20) number = 20; progdefaults.CWpost = number; cntPostTiming->value(number); } substitute(s, i, endbracket, ""); } static void doWPM(std::string s) { float number; std::string snumber = s.substr(6); if (snumber.length() > 0) { // first value = WPM sscanf(snumber.c_str(), "%f", &number); if (number < 5) number = 5; if (number > 200) number = 200; progdefaults.CWspeed = number; REQ(setwpm, number); // second value = Farnsworth WPM size_t pos; if ((pos = snumber.find(":")) != std::string::npos) { snumber.erase(0, pos+1); if (snumber.length()) sscanf(snumber.c_str(), "%f", &number); if (number < 5) number = 5; if (number > progdefaults.CWspeed) number = progdefaults.CWspeed; progdefaults.CWfarnsworth = number; if (number == progdefaults.CWspeed) REQ(setwpm, number); else REQ(setfwpm, number); } } } static void pTxQueWPM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doWPM }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } struct STRpush { std::string smode; int freq; STRpush() { smode = ""; freq = -1; } }; std::stack mf_stack; //static std::string mf_stack = ""; static void mMODEM(std::string s) { trx_mode m; s = ucasestr(s); for (m = 0; m < NUM_MODES; m++) if (s == ucasestr(mode_info[m].sname)) break; if (m == NUM_MODES) { return; } if (active_modem->get_mode() != mode_info[m].mode) init_modem_sync(mode_info[m].mode); } static void mFREQ(int f) { active_modem->set_freq(f); } static void doPOP(std::string s) { if (!mf_stack.empty()) { STRpush psh = mf_stack.top(); mf_stack.pop(); LOG_INFO("%s, %d", psh.smode.c_str(), psh.freq); if (psh.freq != -1) mFREQ(psh.freq); if (!psh.smode.empty()) mMODEM(psh.smode); } else LOG_INFO("%s", "stack empty"); que_ok = true; } static void pPOP(std::string &s, size_t &i, size_t endbracket) { if (!mf_stack.empty()) { STRpush psh = mf_stack.top(); mf_stack.pop(); LOG_INFO("%s, %d", psh.smode.c_str(), psh.freq); if (psh.freq != -1) mFREQ(psh.freq); if (!psh.smode.empty()) mMODEM(psh.smode); } else LOG_INFO("%s", "stack empty"); substitute(s, i, endbracket, ""); } static void pTxQuePOP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPOP }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQuePOP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPOP }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void doPUSHmode(std::string s) { STRpush psh; if (s[5] == '>') { psh.smode = mode_info[active_modem->get_mode()].sname; psh.freq = active_modem->get_freq(); } else { if (s[5] == ':') { if (s[6] == 'm' || s[7] == 'm') psh.smode = mode_info[active_modem->get_mode()].sname; if (s[6] == 'f' || s[7] == 'f') psh.freq = active_modem->get_freq(); } } LOG_INFO("%s, %d", psh.smode.c_str(), psh.freq); mf_stack.push(psh); que_ok = true; } static void pTxQuePUSH(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPUSHmode }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQuePUSH(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPUSHmode }; push_rxcmd(cmd); // substitute(s, i, endbracket, "^!"); substitute(s, i, endbracket, ""); } static void pPUSH(std::string &s, size_t &i, size_t endbracket) { STRpush psh; if (s[i+5] == '>') { psh.smode = mode_info[active_modem->get_mode()].sname; psh.freq = active_modem->get_freq(); } else { if (s[i+5] == ':') { if (s[i+6] == 'm' || s[i+7] == 'm') psh.smode = mode_info[active_modem->get_mode()].sname; if (s[i+6] == 'f' || s[i+7] == 'f') psh.freq = active_modem->get_freq(); } } LOG_INFO("%s, %d", psh.smode.c_str(), psh.freq); mf_stack.push(psh); substitute(s, i, endbracket, ""); return; } static void pDIGI(std::string &s, size_t &i, size_t endbracket) { s.replace(i, endbracket - i + 1, mode_info[active_modem->get_mode()].adif_name); } std::string macrochar = ""; static void doTxDIGI(std::string s) { macrochar = mode_info[active_modem->get_mode()].adif_name; que_ok = true; } static void pTxDIGI(std::string &s, size_t &i, size_t endbracket) { struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTxDIGI }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void doTxFREQ(std::string s) { macrochar = inpFreq->value(); que_ok = true; } static void pTxFREQ(std::string &s, size_t &i, size_t endbracket) { struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTxFREQ }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void setRISETIME(int d) { cntCWrisetime->value(d); que_ok = true; } static void doRISETIME(std::string s) { float number; std::string sVal = s.substr(7, s.length() - 8); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWrisetime = number; REQ(setRISETIME, number); } } static void pTxQueRISETIME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRISETIME }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void setPRE(int d) { cntPreTiming->value(d); que_ok = true; } static void doPRE(std::string s) { float number; std::string sVal = s.substr(6, s.length() - 7); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < 0) number = 0; if (number > 20) number = 20; progdefaults.CWpre = number; REQ(setPRE, number); } } static void pTxQuePRE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPRE }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void setPOST(int d) { cntPostTiming->value(d); que_ok = true; } static void doPOST(std::string s) { float number; std::string sVal = s.substr(7, s.length() - 8); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); if (number < -20) number = -20; if (number > 20) number = 20; progdefaults.CWpost = number; REQ(setPOST, number); } } static void pTxQuePOST(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doPOST }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void setTXATTEN(float v) { int d = (int)(v * 10); v = d / 10.0; v = clamp(v, -30.0, 0.0); progStatus.txlevel = v; cntTxLevel->value(progStatus.txlevel); modeband.set_mode_txlevel(progStatus.txlevel); que_ok = true; } static void pTXATTEN(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } float number; std::string sVal = s.substr(i+9, endbracket - i - 9); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); setTXATTEN(number); } substitute(s, i, endbracket, ""); } static void doTXATTEN(std::string s) { float number; std::string sVal = s.substr(10); if (sVal.length() > 0) { sscanf(sVal.c_str(), "%f", &number); REQ(setTXATTEN, number); } } static void pTxQueTXATTEN(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTXATTEN }; push_txcmd(cmd); substitute(s, i, endbracket, ""); } static void pIDLE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } float number; std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); macro_idle_on = true; idleTime = number; } substitute(s, i, endbracket, ""); } static int idle_time = 0; // in 0.1 second increments static int idle_count = 0; static void doneIDLE(void *) { idle_count++; if (idle_count == idle_time) { Qidle_time = 0; que_ok = true; idle_time = idle_count = 0; return; } Fl::repeat_timeout(0.1, doneIDLE); } static void doIDLE(std::string s) { std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { float ftime; if (sscanf(sTime.c_str(), "%f", &ftime) != 1) ftime = 1.0; idle_time = 10 * ftime; Qidle_time = 1; Fl::add_timeout(0.1, doneIDLE); } else { Qidle_time = 0; } } static void pTxQueIDLE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doIDLE }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } bool do_tune_on; static bool tune_on; static bool rx_tune_on; static float tune_timeout = 0; static void start_tune(void *) { trx_tune(); } static void end_tune(void *data = 0) { if (data == 0) trx_receive(); else trx_transmit(); tune_on = false; } static void end_do_tune(void *) { trx_transmit(); do_tune_on = false; } static void doTUNE(std::string s) { std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { if (sscanf(sTime.c_str(), "%f", &tune_timeout) != 1) tune_timeout = 1.0; do_tune_on = true; Fl::add_timeout(0, start_tune); Fl::add_timeout(tune_timeout, end_do_tune); } que_ok = true; } static void pTxQueTUNE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTUNE }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void end_rxtune(void *) { trx_receive(); rx_tune_on = false; } static void doRxTUNE(std::string s) { std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { if (sscanf(sTime.c_str(), "%f", &tune_timeout) != 1) tune_timeout = 1.0; rx_tune_on = true; Fl::add_timeout(0, start_tune); Fl::add_timeout(tune_timeout, end_rxtune); } } static void pRxQueTUNE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRxTUNE }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pTUNE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { if (sscanf(sTime.c_str(), "%f", &tune_timeout) != 1) tune_timeout = 1.0; tune_on = true; Fl::add_timeout(0, start_tune); } substitute(s, i, endbracket, ""); } static void pQSONBR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } char szqsonbr[10]; snprintf(szqsonbr, sizeof(szqsonbr), "%d", qsodb.nbrRecs()); s.replace(i, endbracket - i + 1, szqsonbr); } static void pNXTNBR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } char szqsonbr[20]; snprintf(szqsonbr, sizeof(szqsonbr), "%d", qsodb.nbrRecs() + 1); s.replace(i, endbracket - i + 1, szqsonbr); } static void pNRSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } int number = 0; std::string sNumber = s.substr(i+7, endbracket - i - 7); if (sNumber.length() > 0) { sscanf(sNumber.c_str(), "%d", &number); progStatus.n_rsids = number; } substitute(s, i, endbracket, ""); } static bool useWait = false; static float waitTime = 0; static void pWAIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } float number; std::string sTime = s.substr(i+6, endbracket - i - 6); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); useWait = true; waitTime = number; } substitute(s, i, endbracket, ""); } static void doneWAIT(void *) { Qwait_time = 0; start_tx(); que_ok = true; } static void doWAIT(std::string s) { float number; std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); Qwait_time = number; Fl::add_timeout (number, doneWAIT); } else Qwait_time = 0; } static void pTxQueWAIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doWAIT }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void doRxWAIT(std::string s) { float number = 0; std::string sTime = s.substr(7, s.length() - 8); if (sTime.length() > 0) { sscanf(sTime.c_str(), "%f", &number); macro_rx_wait = true; Fl::add_timeout(number, rx_que_continue); } } static void pRxQueWAIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRxWAIT }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pINFO1(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, info1msg ); } static void pINFO2(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, info2msg ); } static void pCLRRX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); trx_mode md = active_modem->get_mode(); if (md == MODE_IFKP) ifkp_rx_text->clear(); else if (md == MODE_FSQ) fsq_rx_text->clear(); else if ((md >= MODE_FELDHELL) && (md <= MODE_HELL80)) FHdisp->clear(); else ReceiveText->clear(); } static void pCLRTX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); queue_reset(); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); } static void pCLRQSO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); clearQSO(); } static void pFOCUS(std::string &s, size_t &i, size_t endbracket) { if (!within_exec) { if (qsoFreqDisp->is_reversed_colors()) { qsoFreqDisp->restore_colors(); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->take_focus(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->take_focus (); else TransmitText->take_focus(); } else { qsoFreqDisp->take_focus(); qsoFreqDisp->reverse_colors(); } } substitute(s, i, endbracket, ""); } static void pQSYPLUS(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } unsigned long long rf = 0; double rfd = 0; std::string sIncrFreq = s.substr(i+6, endbracket - i - 6); // no frequency(s) specified if (sIncrFreq.length() == 0) { substitute(s, i, endbracket, ""); return; } // rf first value sscanf(sIncrFreq.c_str(), "%lf", &rfd); if (rfd != 0) { rf = wf->rfcarrier() + (1000.0*rfd); qsy(rf, active_modem ? active_modem->get_freq() : 1500); } substitute(s, i, endbracket, ""); } static void pCALL(std::string &s, size_t &i, size_t endbracket) { std::string call = inpCall->value(); if (active_modem->get_mode() == MODE_IFKP && progdefaults.ifkp_lowercase_call) for (size_t n = 0; n < call.length(); n++) call[n] = tolower(call[n]); s.replace( i, 6, call ); } static void pGET(std::string &s, size_t &i, size_t endbracket) { s.erase( i, 9 ); GET = true; } static void pFREQ(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, inpFreq->value() ); } static void pBAND(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, band_name( band( wf->rfcarrier() ) ) ); } static void pTX_PWR(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 8, log_power() ); } static void pLOC(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 5, inpLoc->value() ); } static void pMODE(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, active_modem->get_mode_name()); } static void pNAME(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, inpName->value() ); } static void pQTH(std::string &s, size_t &i, size_t endbracket) { s.replace( i,5, inpQth->value() ); } static void pST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 4, inpState->value() ); } static void pPR(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 4, inpVEprov->value() ); } static void pQSOTIME(std::string &s, size_t &i, size_t endbracket) { qso_time = inpTimeOff->value(); s.replace( i, 9, qso_time.c_str() ); } static void pRST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 5, cut_string(inpRstOut->value())); } static void pMYCALL(std::string &s, size_t &i, size_t endbracket) { std::string call = inpMyCallsign->value(); if (active_modem->get_mode() == MODE_IFKP && progdefaults.ifkp_lowercase) for (size_t n = 0; n < call.length(); n++) call[n] = tolower(call[n]); s.replace( i, 8, call ); } static void pMYLOC(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, inpMyLocator->value() ); } static void pMYNAME(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 8, inpMyName->value() ); } static void pMYQTH(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, inpMyQth->value() ); } static void pMYRST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, inpRstIn->value() ); } static void pANTENNA(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, progdefaults.myAntenna.c_str() ); } static void pMYCLASS(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, progdefaults.my_FD_class.c_str() ); } static void pMYSECTION(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 11, progdefaults.my_FD_section.c_str() ); } static void pMYSTATE(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, listbox_states->value() ); } static void pMYST(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, inp_QP_state_short->value() ); } static void pMYCOUNTY(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 10, listbox_counties->value() ); } static void pMYCNTY(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 8, inp_QP_short_county->value() ); } static void pLDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%x %H:%M %Z"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 4) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pILDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%Y-%m-%d %H:%M%z"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 5) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pZDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%x %H:%MZ"; std::string timefmt = s.substr(i, endbracket - i); size_t p = timefmt.find(":"); if (p == 4) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pIZDT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%Y-%m-%d %H:%MZ"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 5) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pLT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%H%ML"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 3) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pZT(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%H%MZ"; std::string timefmt = s.substr(i, endbracket-i); size_t p = timefmt.find(":"); if (p == 3) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pLD(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%Y-%m-%d"; std::string timefmt = s.substr(i, endbracket - i); size_t p = timefmt.find(":"); if (p == 3) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); localtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void pZD(std::string &s, size_t &i, size_t endbracket) { char szDt[80]; std::string fmt = "%Y-%m-%d"; std::string timefmt = s.substr(i, endbracket - i); size_t p = timefmt.find(":"); if (p == 3) { fmt = timefmt.substr(p + 1, timefmt.length() - p - 1); if (fmt[0] == '"') fmt.erase(0,1); if (fmt[fmt.length()-1] == '"') fmt.erase(fmt.length()-1); } time_t tmptr; tm sTime; time (&tmptr); gmtime_r(&tmptr, &sTime); mystrftime(szDt, 79, fmt.c_str(), &sTime); s.replace(i, endbracket - i + 1, szDt); } static void p_ID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } progdefaults.macroid = true; substitute(s, i, endbracket, ""); } static void pTEXT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } progdefaults.macrotextid = true; substitute(s, i, endbracket, ""); } static void doCWID(std::string s) { progdefaults.macroCWid = true; que_ok = true; } static void pCWID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } CMDS cmd = {s.substr(i, endbracket - i + 1), doCWID}; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void doDTMF(std::string s) { progdefaults.DTMFstr = s.substr(6, s.length() - 8); que_ok = true; } static void pDTMF(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } CMDS cmd = {s.substr(i, endbracket - i + 1), doDTMF}; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pALERT(std::string &s, size_t &i, size_t endbracket) { if (trx_state != STATE_RX) { substitute(s, i, endbracket, ""); return; } if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string cmd = s.substr(i+7, endbracket - i - 7); if (audio_alert) try { audio_alert->alert(cmd); } catch (...) { } substitute(s, i, endbracket, ""); } static void doAUDIO(std::string s) { s.erase(0, 16); active_modem->Audio_filename(s); que_ok = true; } static void pAUDIO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string acmd = "Xmt audio file: "; acmd.append(s.substr(i + 7, endbracket - (i + 7))); CMDS cmd = {acmd, doAUDIO}; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pPAUSE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, "^p"); } static void pRX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, "^r"); } static void pTX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); if (rx_only) TransmitON = false; else { start_macro_time(); TransmitON = true; } } static void pTXRX(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); if (rx_only) ToggleTXRX = false; else ToggleTXRX = true; } /* static std::string hexstr(std::string &s) { static std::string hex; static char val[3]; hex.clear(); for (size_t i = 0; i < s.length(); i++) { snprintf(val, sizeof(val), "%02x", s[i] & 0xFF); hex.append("<").append(val).append(">"); } return hex; } */ static void doRIGCAT(std::string s) { size_t start = s.find(':'); std::string buff; LOG_INFO("!RIGCAT %s", s.substr(start + 1, s.length() - start + 1).c_str()); size_t val = 0; int retnbr = 0; char c, ch; bool asciisw = false; bool valsw = false; for (size_t j = start+1 ; j <= s.length() ; j++) { ch = s[j]; if (ch == '\"') { asciisw = !asciisw; continue; } // accumulate ascii string if (asciisw) { if (isprint(ch)) buff += ch; continue; } // following digits is expected size of CAT response from xcvr if (ch == ':' && s[j+1] != '>') { sscanf(&s[j+1], "%d", &retnbr); } // accumulate hex string values if ((ch == ' ' || ch == '>' || ch == ':') && valsw) { c = char(val); // LOG_INFO("c=%02x, val=%d", c, val); buff += c; val = 0; valsw = false; } else { val *= 16; ch = toupper(ch); if (isdigit(ch)) val += ch - '0'; else if (ch >= 'A' && ch <= 'F') val += ch - 'A' + 10; valsw = true; } if (ch == ':') break; } add_to_cmdque("RIGCAT macro", buff, retnbr, progdefaults.RigCatWait); que_ok = true; } static void pTxQueRIGCAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGCAT }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQueRIGCAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGCAT }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pRIGCAT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } LOG_INFO("cat cmd:retnbr %s", s.substr(i, endbracket - i + 1).c_str()); size_t start = s.find(':', i); std::basic_string buff; size_t val = 0; int retnbr = 0; char c, ch; bool asciisw = false; bool valsw = false; for (size_t j = start+1 ; j <= endbracket ; j++) { ch = s[j]; if (ch == '\"') { asciisw = !asciisw; continue; } // accumulate ascii string if (asciisw) { if (isprint(ch)) buff += ch; continue; } // following digits is expected size of CAT response from xcvr if (ch == ':' && s[j+1] != '>') { sscanf(&s[j+1], "%d", &retnbr); } // accumulate hex string values if ((ch == ' ' || ch == '>' || ch == ':') && valsw) { c = char(val); // LOG_INFO("c=%02x, val=%d", c, val); buff += c; val = 0; valsw = false; } else { val *= 16; ch = toupper(ch); if (isdigit(ch)) val += ch - '0'; else if (ch >= 'A' && ch <= 'F') val += ch - 'A' + 10; valsw = true; } if (ch == ':') break; } add_to_cmdque( "RIGCAT macro", buff, retnbr, progdefaults.RigCatWait); substitute(s, i, endbracket, ""); } static void doFLRIG(std::string s) { size_t start = s.find(':'); std::string cmd = s.substr(start + 1, s.length() - start + 1); LOG_INFO("!FLRIG %s", cmd.c_str()); xmlrpc_send_command(cmd); que_ok = true; } static void pTxQueFLRIG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFLRIG }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQueFLRIG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFLRIG }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pFLRIG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } LOG_INFO("flrig CAT cmd: %s", s.substr(i, endbracket - i + 1).c_str()); size_t start = s.find(':'); std::string cmd = s.substr(start + 1, s.length() - start - 2); xmlrpc_send_command(cmd); substitute(s, i, endbracket, ""); } static void doVIDEO(std::string s) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { return; } size_t start = s.find(':') + 1; size_t end = s.find('>'); active_modem->macro_video_text = s.substr(start, end - start); que_ok = true; } static void pVIDEO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doVIDEO }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pVER(std::string &s, size_t &i, size_t endbracket) { std::string progname; progname = "Fldigi "; progname.append(PACKAGE_VERSION); s.replace( i, 5, progname ); } static void pSERNO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int contestval; contestval = atoi(outSerNo->value()); if (contestval) { char serstr[10]; contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(serstr, sizeof(serstr), contest_count.fmt.c_str(), contestval); s.replace (i, 7, cut_string(serstr)); } else s.replace (i, 7, ""); } static void pLASTNO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int contestval; contestval = atoi(outSerNo->value()) - 1; if (contestval) { char serstr[10]; contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(serstr, sizeof(serstr), contest_count.fmt.c_str(), contestval); s.replace (i, 8, cut_string(serstr)); } else s.replace (i, 8, ""); } static void pCNTR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } int contestval; contestval = contest_count.count; if (contestval) { contest_count.Format(progdefaults.ContestDigits, progdefaults.UseLeadingZeros); snprintf(contest_count.szCount, sizeof(contest_count.szCount), contest_count.fmt.c_str(), contestval); s.replace (i, 6, cut_string(contest_count.szCount)); } else s.replace (i, 6, ""); } static void pDECR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } contest_count.count--; if (contest_count.count < 0) contest_count.count = 0; substitute(s, i, endbracket, ""); updateOutSerNo(); } static void pINCR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } contest_count.count++; substitute(s, i, endbracket, ""); updateOutSerNo(); } static void pXIN(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 5, inpXchgIn->value() ); } static void pXOUT(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 6, cut_string(progdefaults.myXchg.c_str())); } static void pXBEG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); xbeg = i; } static void pXEND(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); xend = i; } static void pSAVEXCHG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } save_xchg = true; substitute(s, i, endbracket, ""); } static void pFD_CLASS(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, inpClass->value() ); } static void pFD_SECTION(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 8, inpSection->value() ); } static void pCLASS(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 7, inpClass->value() ); } static void pSECTION(std::string &s, size_t &i, size_t endbracket) { s.replace( i, 9, inpSection->value() ); } static void pLOG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } size_t start = s.find(':', i); if (start != std::string::npos && start < endbracket) { std::string msg = inpNotes->value(); if (!msg.empty()) msg.append("\n"); msg.append(s.substr(start + 1, endbracket-start-1)); inpNotes->value(msg.c_str()); } substitute(s, i, endbracket, ""); qsoSave_cb(0, 0); } static void pLNW(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } size_t start = s.find(':', i); if (start != std::string::npos) { std::string msg = inpNotes->value(); if (!msg.empty()) msg.append("\n"); msg.append(s.substr(start + 1, endbracket-start-1)); inpNotes->value(msg.c_str()); } substitute(s, i, endbracket, "^L"); } static void pCLRLOG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, "^C"); } static void pMODEM_COMPSKED(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } size_t j, k, len = s.length(); std::string name; if ((j = s.find('>', i)) == std::string::npos) return; while (++j < len) if (!isspace(s[j])) break; k = j; while (++k < len) if (isspace(s[k]) || s[k] == '<') break; name = ucasestr(s.substr(j, k - j)); for (int m = 0; m < NUM_MODES; m++) { if (name == ucasestr(mode_info[m].sname)) { if (active_modem->get_mode() != mode_info[m].mode) init_modem(mode_info[m].mode); break; } } s.erase(i, k-i); } static void doIMAGE(std::string s) { if (s.length() > 0) { bool Greyscale = false; size_t p = std::string::npos; std::string fname = s.substr(7); p = fname.find(">"); fname.erase(p); p = fname.find("G,"); if (p == std::string::npos) p = fname.find("g,"); if (p != std::string::npos) { Greyscale = true; fname.erase(p,2); } while (fname[0] == ' ') fname.erase(0,1); trx_mode active_mode = active_modem->get_mode(); if ((active_mode == MODE_MFSK16 || active_mode == MODE_MFSK32 || active_mode == MODE_MFSK64 || active_mode == MODE_MFSK128) && active_modem->get_cap() & modem::CAP_IMG) { Greyscale ? active_modem->send_Grey_image(fname) : active_modem->send_color_image(fname); } else if (active_mode >= MODE_THOR_FIRST && active_mode <= MODE_THOR_LAST) { thor_load_scaled_image(fname, Greyscale); } else if (active_mode == MODE_IFKP) { ifkp_load_scaled_image(fname, Greyscale); } } que_ok = true; } static void pTxQueIMAGE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string Tx_cmdstr = s.substr(i, endbracket - i + 1); struct CMDS cmd = { Tx_cmdstr, doIMAGE }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void doINSERTIMAGE(std::string s) { if (s.length() > 0) { bool Greyscale = false; size_t p = std::string::npos; std::string fname = s.substr(7); p = fname.find(">"); fname.erase(p); p = fname.find("G,"); if (p == std::string::npos) p = fname.find("g,"); if (p != std::string::npos) { Greyscale = true; fname.erase(p,2); } while (fname[0] == ' ') fname.erase(0,1); if (s.empty()) return; trx_mode md = active_modem->get_mode(); if ((md == MODE_MFSK16 || md == MODE_MFSK32 || md == MODE_MFSK64 || md == MODE_MFSK128) && active_modem->get_cap() & modem::CAP_IMG) { Greyscale ? active_modem->send_Grey_image(fname) : active_modem->send_color_image(fname); } else if (md == MODE_IFKP) ifkp_load_scaled_image(fname, Greyscale); else if (md >= MODE_THOR_FIRST && md <= MODE_THOR_LAST) thor_load_scaled_image(fname, Greyscale); } que_ok = true; } void TxQueINSERTIMAGE(std::string s) { trx_mode active_mode = active_modem->get_mode(); if (! (active_mode == MODE_MFSK16 || active_mode == MODE_MFSK32 || active_mode == MODE_MFSK64 || active_mode == MODE_MFSK128 || active_mode == MODE_IFKP || (active_mode >= MODE_THOR_FIRST && active_mode <= MODE_THOR_LAST) ) && active_modem->get_cap() & modem::CAP_IMG) return; std::string scmd = ""; scmd.insert(7,s); struct CMDS cmd = { scmd, doINSERTIMAGE }; push_txcmd(cmd); std::string itext = s; size_t p = itext.rfind("\\"); if (p == std::string::npos) p = itext.rfind("/"); if (p != std::string::npos) itext.erase(0, p+1); p = itext.rfind("."); if (p != std::string::npos) itext.erase(p); itext.insert(0, "\nImage: "); itext.append(" ^!"); if (active_mode == MODE_IFKP) ifkp_tx_text->add_text(itext); else if (active_mode == MODE_FSQ) fsq_tx_text->add_text(itext); else add_text(itext); } static void doAVATAR(std::string s) { if (active_modem->get_mode() == MODE_IFKP) active_modem->m_ifkp_send_avatar(); que_ok = true; } static void pTxQueAVATAR(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doAVATAR }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void doMODEM(std::string s) { static fre_t re("", REG_EXTENDED); std::string tomatch = s; for (int i = 2; i < 7; i++) s[i] = toupper(s[i]); if (!re.match(tomatch.c_str())) { que_ok = true; return; } const std::vector& o = re.suboff(); std::string name = ucasestr(tomatch.substr(o[1].rm_so, o[1].rm_eo - o[1].rm_so)); trx_mode m; for (m = 0; m < NUM_MODES; m++) if (name == ucasestr(mode_info[m].sname)) break; // do we have arguments and a valid modem? if (o.size() == 2 || m == NUM_MODES) { que_ok = true; return; } // parse arguments std::vector args; args.reserve(8); char* end; double d; for (const char* p = s.c_str() + o[2].rm_so + 1; *p; p++) { errno = 0; d = strtod(p, &end); if (!errno && p != end) { args.push_back(d); p = end; } else // push an invalid value args.push_back(DBL_MIN); } try { switch (m) { case MODE_RTTY: // carrier shift, baud rate, bits per char if (args.at(0) != DBL_MIN) set_rtty_shift((int)args[0]); if (args.at(1) != DBL_MIN) set_rtty_baud((float)args[1]); if (args.at(2) != DBL_MIN) set_rtty_bits((int)args[2]); break; case MODE_CONTESTIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; set_contestia_bw(bw); set_contestia_tones(tones); switch (tones) { case 4 : if (bw == 125) m = MODE_CONTESTIA_4_125; else if (bw == 250) m = MODE_CONTESTIA_4_250; else if (bw == 500) m = MODE_CONTESTIA_4_500; else if (bw == 1000) m = MODE_CONTESTIA_4_1000; else if (bw == 2000) m = MODE_CONTESTIA_4_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; case 8 : if (bw == 125) m = MODE_CONTESTIA_8_125; else if (bw == 250) m = MODE_CONTESTIA_8_250; else if (bw == 500) m = MODE_CONTESTIA_8_500; else if (bw == 1000) m = MODE_CONTESTIA_8_1000; else if (bw == 2000) m = MODE_CONTESTIA_8_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; case 16 : if (bw == 250) m = MODE_CONTESTIA_16_250; else if (bw == 500) m = MODE_CONTESTIA_16_500; else if (bw == 1000) m = MODE_CONTESTIA_16_1000; else if (bw == 2000) m = MODE_CONTESTIA_16_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; case 32 : if (bw == 1000) m = MODE_CONTESTIA_32_1000; else if (bw == 2000) m = MODE_CONTESTIA_32_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; case 64 : if (bw == 500) m = MODE_CONTESTIA_64_500; else if (bw == 1000) m = MODE_CONTESTIA_64_1000; else if (bw == 2000) m = MODE_CONTESTIA_64_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; default : set_contestia_bw(bw); set_contestia_tones(tones); } } break; case MODE_OLIVIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; set_olivia_bw(bw); set_olivia_tones(tones); switch (tones) { case 4 : if (bw == 125) m = MODE_OLIVIA_4_125; else if (bw == 250) m = MODE_OLIVIA_4_250; else if (bw == 500) m = MODE_OLIVIA_4_500; else if (bw == 1000) m = MODE_OLIVIA_4_1000; else if (bw == 2000) m = MODE_OLIVIA_4_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; case 8 : if (bw == 125) m = MODE_OLIVIA_8_125; else if (bw == 250) m = MODE_OLIVIA_8_250; else if (bw == 500) m = MODE_OLIVIA_8_500; else if (bw == 1000) m = MODE_OLIVIA_8_1000; else if (bw == 2000) m = MODE_OLIVIA_8_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; case 16 : if (bw == 500) m = MODE_OLIVIA_16_500; else if (bw == 1000) m = MODE_OLIVIA_16_1000; else if (bw == 2000) m = MODE_OLIVIA_16_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; case 32 : if (bw == 1000) m = MODE_OLIVIA_32_1000; else if (bw == 2000) m = MODE_OLIVIA_32_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; case 64 : if (bw == 500) m = MODE_OLIVIA_64_500; else if (bw == 1000) m = MODE_OLIVIA_64_1000; else if (bw == 2000) m = MODE_OLIVIA_64_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; default : set_olivia_bw(bw); set_olivia_tones(tones); } } break; default: break; } } catch (const std::exception& e) { } if (active_modem->get_mode() != mode_info[m].mode) { init_modem_sync(mode_info[m].mode); } que_ok = true; } static void pTxQueMODEM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string Tx_cmdstr = s.substr(i, endbracket - i + 1); struct CMDS cmd = { Tx_cmdstr, doMODEM }; if (Tx_cmdstr.find("SSB") != std::string::npos || Tx_cmdstr.find("ANALYSIS") != std::string::npos) { LOG_ERROR("Disallowed: %s", Tx_cmdstr.c_str()); size_t nowbracket = s.find('<', endbracket); if (nowbracket != std::string::npos) s.erase(i, nowbracket - i - 1); else s.clear(); } else { push_txcmd(cmd); if (i && s[i-1] == '\n') i--; substitute(s, i, endbracket, "^!"); } } static void pRxQueMODEM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string rx_cmdstr = s.substr(i, endbracket - i + 1); struct CMDS cmd = { rx_cmdstr, doMODEM }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pMODEM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } static fre_t re("", REG_EXTENDED); std::string testmode = s.substr(i, endbracket - i + 1); for (int i = 2; i < 7; i++) testmode[i] = toupper(testmode[i]); std::string name = testmode; name.erase(0,7); name.erase(name.length() - 1); name = ucasestr(name); // test for exact match on mode name (ignore case) for (trx_mode m = 0; m < NUM_MODES; m++) { if (name == ucasestr(mode_info[m].sname)) { init_modem(mode_info[m].mode); s.erase(i, endbracket - i + 1); int count = 500; while ((active_modem->get_mode() != mode_info[m].mode) && --count) MilliSleep(10); return; } } if (!re.match(testmode.c_str())) { s.erase(i, endbracket - i + 1); return; } const std::vector& o = re.suboff(); name = ucasestr(testmode.substr(o[1].rm_so, o[1].rm_eo - o[1].rm_so)); trx_mode m; for (m = 0; m < NUM_MODES; m++) if (name == ucasestr(mode_info[m].sname)) break; // do we have arguments and a valid modem? if (o.size() == 2 || m == NUM_MODES) { if (m < NUM_MODES && active_modem->get_mode() != mode_info[m].mode) init_modem(mode_info[m].mode); s.erase(i, o[0].rm_eo - i); int count = 500; while ((active_modem->get_mode() != mode_info[m].mode) && --count) MilliSleep(10); return; } // parse arguments std::vector args; args.reserve(8); char* end; double d; for (const char* p = testmode.c_str() + o[2].rm_so + 1; *p; p++) { errno = 0; d = strtod(p, &end); if (!errno && p != end) { args.push_back(d); p = end; } else // push an invalid value args.push_back(DBL_MIN); } try { switch (m) { case MODE_RTTY: // carrier shift, baud rate, bits per char if (args.at(0) != DBL_MIN) set_rtty_shift((int)args[0]); if (args.at(1) != DBL_MIN) set_rtty_baud((float)args[1]); if (args.at(2) != DBL_MIN) set_rtty_bits((int)args[2]); break; case MODE_CONTESTIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; set_contestia_bw(bw); set_contestia_tones(tones); switch (tones) { case 4 : if (bw == 125) m = MODE_CONTESTIA_4_125; else if (bw == 250) m = MODE_CONTESTIA_4_250; else if (bw == 500) m = MODE_CONTESTIA_4_500; else if (bw == 1000) m = MODE_CONTESTIA_4_1000; else if (bw == 2000) m = MODE_CONTESTIA_4_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; case 8 : if (bw == 125) m = MODE_CONTESTIA_8_125; else if (bw == 250) m = MODE_CONTESTIA_8_250; else if (bw == 500) m = MODE_CONTESTIA_8_500; else if (bw == 1000) m = MODE_CONTESTIA_8_1000; else if (bw == 2000) m = MODE_CONTESTIA_8_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; case 16 : if (bw == 250) m = MODE_CONTESTIA_16_250; else if (bw == 500) m = MODE_CONTESTIA_16_500; else if (bw == 1000) m = MODE_CONTESTIA_16_1000; else if (bw == 2000) m = MODE_CONTESTIA_16_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; case 32 : if (bw == 1000) m = MODE_CONTESTIA_32_1000; else if (bw == 2000) m = MODE_CONTESTIA_32_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; case 64 : if (bw == 500) m = MODE_CONTESTIA_64_500; else if (bw == 1000) m = MODE_CONTESTIA_64_1000; else if (bw == 2000) m = MODE_CONTESTIA_64_2000; else { set_contestia_bw(bw); set_contestia_tones(tones); } break; default : set_contestia_bw(bw); set_contestia_tones(tones); } } break; case MODE_OLIVIA: // bandwidth, tones if (args.at(0) != DBL_MIN && args.at(1) != DBL_MIN) { int bw = (int)args[0]; int tones = (int)args[1]; set_olivia_bw(bw); set_olivia_tones(tones); switch (tones) { case 4 : if (bw == 125) m = MODE_OLIVIA_4_125; else if (bw == 250) m = MODE_OLIVIA_4_250; else if (bw == 500) m = MODE_OLIVIA_4_500; else if (bw == 1000) m = MODE_OLIVIA_4_1000; else if (bw == 2000) m = MODE_OLIVIA_4_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; case 8 : if (bw == 125) m = MODE_OLIVIA_8_125; else if (bw == 250) m = MODE_OLIVIA_8_250; else if (bw == 500) m = MODE_OLIVIA_8_500; else if (bw == 1000) m = MODE_OLIVIA_8_1000; else if (bw == 2000) m = MODE_OLIVIA_8_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; case 16 : if (bw == 500) m = MODE_OLIVIA_16_500; else if (bw == 1000) m = MODE_OLIVIA_16_1000; else if (bw == 2000) m = MODE_OLIVIA_16_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; case 32 : if (bw == 1000) m = MODE_OLIVIA_32_1000; else if (bw == 2000) m = MODE_OLIVIA_32_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; case 64 : if (bw == 500) m = MODE_OLIVIA_64_500; else if (bw == 1000) m = MODE_OLIVIA_64_1000; else if (bw == 2000) m = MODE_OLIVIA_64_2000; else { set_olivia_bw(bw); set_olivia_tones(tones); } break; default : set_olivia_bw(bw); set_olivia_tones(tones); } } break; default: break; } } catch (const std::exception& e) { } if (active_modem->get_mode() != mode_info[m].mode) { init_modem(mode_info[m].mode); int count = 500; while ((active_modem->get_mode() != mode_info[m].mode) && --count) MilliSleep(10); } substitute(s, i, endbracket, ""); } static void pAFC(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnAFC->value(1); else if (sVal.compare(0,3,"off") == 0) btnAFC->value(0); else if (sVal.compare(0,1,"t") == 0) btnAFC->value(!btnAFC->value()); btnAFC->do_callback(); } substitute(s, i, endbracket, ""); } static void pSQL(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnSQL->value(1); else if (sVal.compare(0,3,"off") == 0) btnSQL->value(0); else if (sVal.compare(0,1,"t") == 0) btnSQL->value(!btnSQL->value()); btnSQL->do_callback(); } substitute(s, i, endbracket, ""); } static void pSQLCH(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+7, endbracket - i - 7); if (sVal.length() > 0) { int val; sscanf(sVal.c_str(), "%d", &val); sldrSquelch->value(val); sldrSquelch->do_callback(); } substitute(s, i, endbracket, ""); } static void pREV(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) wf->btnRev->value(1); else if (sVal.compare(0,3,"off") == 0) wf->btnRev->value(0); else if (sVal.compare(0,1,"t") == 0) wf->btnRev->value(!wf->btnRev->value()); wf->btnRev->do_callback(); } substitute(s, i, endbracket, ""); } // static void pHS(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+4, endbracket - i - 4); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) bHighSpeed = 1; else if (sVal.compare(0,3,"off") == 0) bHighSpeed = 0; else if (sVal.compare(0,1,"t") == 0) bHighSpeed = !bHighSpeed; } substitute(s, i, endbracket, ""); } static void pLOCK(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) wf->xmtlock->value(1); else if (sVal.compare(0,3,"off") == 0) wf->xmtlock->value(0); else if (sVal.compare(0,1,"t") == 0) wf->xmtlock->value(!wf->xmtlock->value()); wf->xmtlock->damage(); wf->xmtlock->do_callback(); } substitute(s, i, endbracket, ""); } static void doLOCK( std::string s){ std::string sVal = s.substr(7, s.length() - 8); if (sVal.length() > 0) { // sVal = on|off|t[oggle] [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) wf->xmtlock->value(1); else if (sVal.compare(0,3,"off") == 0) wf->xmtlock->value(0); else if (sVal.compare(0,1,"t") == 0) wf->xmtlock->value(!wf->xmtlock->value()); wf->xmtlock->damage(); wf->xmtlock->do_callback(); } } static void pRxQueLOCK(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doLOCK }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pTX_RSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+8, endbracket - i - 8); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnTxRSID->value(1); else if (sVal.compare(0,3,"off") == 0) btnTxRSID->value(0); else if (sVal.compare(0,1,"t") == 0) btnTxRSID->value(!btnTxRSID->value()); btnTxRSID->do_callback(); } substitute(s, i, endbracket, ""); } static void doTXRSID(std::string s) { if (s.find("on") != std::string::npos) { btnTxRSID->value(1); btnTxRSID->do_callback(); } else if (s.find("off") != std::string::npos) { btnTxRSID->value(0); btnTxRSID->do_callback(); } else if (s.find("t") != std::string::npos) { btnTxRSID->value(!btnTxRSID->value()); btnTxRSID->do_callback(); } que_ok = true; } static void pRxQueTXRSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doTXRSID }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pRX_RSID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+8, endbracket - i - 8); if (sVal.length() > 0) { // sVal = on|off|t [ON, OFF or Toggle] if (sVal.compare(0,2,"on") == 0) btnRSID->value(1); else if (sVal.compare(0,3,"off") == 0) btnRSID->value(0); else if (sVal.compare(0,1,"t") == 0) btnRSID->value(!btnRSID->value()); btnRSID->do_callback(); } substitute(s, i, endbracket, ""); } static void pCSV(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+5, endbracket - i - 5); if (sVal.length() > 0) { // sVal = on|off [ON, OFF] if (sVal.compare(0,2,"on") == 0) set_CSV(1); else if (sVal.compare(0,3,"off") == 0) set_CSV(0); else if (sVal.compare(0,1,"t") == 0) set_CSV(2); } substitute(s, i, endbracket, ""); } #ifdef __WIN32__ static void pTALK(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i+6, endbracket - i - 6); if (sVal.length() > 0) { // sVal = on|off [ON, OFF] if (sVal.compare(0,2,"on") == 0) open_talker(); else if (sVal.compare(0,3,"off") == 0) close_talker(); else if (sVal.compare(0,1,"t") == 0) toggle_talker(); } substitute(s, i, endbracket, ""); } #endif static void pSRCHUP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); active_modem->searchUp(); if (progdefaults.WaterfallClickInsert) wf->insert_text(true); } static void pSRCHDN(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); active_modem->searchDown(); if (progdefaults.WaterfallClickInsert) wf->insert_text(true); } static void pGOHOME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); if (active_modem == cw_modem) active_modem->set_freq(progdefaults.CWsweetspot); else if (active_modem == rtty_modem) active_modem->set_freq(progdefaults.RTTYsweetspot); else active_modem->set_freq(progdefaults.PSKsweetspot); } static void doGOHOME(std::string s) { if (active_modem == cw_modem) active_modem->set_freq(progdefaults.CWsweetspot); else if (active_modem == rtty_modem) active_modem->set_freq(progdefaults.RTTYsweetspot); else active_modem->set_freq(progdefaults.PSKsweetspot); que_ok = true; } static void pTxQueGOHOME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOHOME }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQueGOHOME(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOHOME }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pGOFREQ(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } int number; std::string sGoFreq = s.substr(i+8, endbracket - i - 8); if (sGoFreq.length() > 0) { sscanf(sGoFreq.c_str(), "%d", &number); if (number < progdefaults.LowFreqCutoff) number = progdefaults.LowFreqCutoff; if (number > progdefaults.HighFreqCutoff) number = progdefaults.HighFreqCutoff; active_modem->set_freq(number); } substitute(s, i, endbracket, ""); } static void doGOFREQ(std::string s) { int number; std::string sGoFreq = s.substr(9, s.length() - 10); if (sGoFreq.length() > 0) { sscanf(sGoFreq.c_str(), "%d", &number); if (number < progdefaults.LowFreqCutoff) number = progdefaults.LowFreqCutoff; if (number > progdefaults.HighFreqCutoff) number = progdefaults.HighFreqCutoff; active_modem->set_freq(number); } que_ok = true; } static void pTxQueGOFREQ(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { s.replace(i, endbracket - i + 1, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOFREQ }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQueGOFREQ(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doGOFREQ }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pQRG(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string prefix = "\n"; prefix.append(s.substr(i+5, endbracket - i - 5)); if (prefix.length()) note_qrg ( false, prefix.c_str(), "\n" ); substitute(s, i, endbracket, ""); } static void pQSYTO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); do_qsy(true); } static void pQSYFM(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } substitute(s, i, endbracket, ""); do_qsy(false); } struct rfafmd { unsigned long long rf; int af; std::string mdname; rfafmd(unsigned long long a, int b, std::string nm) { rf = a; af = b; mdname = nm;} rfafmd(unsigned long long a, int b) {rf = a; af = b; mdname = active_modem->get_mode_name();} rfafmd(){rf = af = 0; mdname = active_modem->get_mode_name();} }; static std::queue fpairs; static void pQSY(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string mdname = active_modem->get_mode_name(); unsigned long long rf = 0; int af = 0; double rfd = 0; std::string sGoFreq = s.substr(i+5, endbracket - i - 5); // no frequency(s) specified if (sGoFreq.length() == 0) { substitute(s, i, endbracket, ""); return; } if (fpairs.empty()) { std::string triad; size_t pos; while (!sGoFreq.empty()) { pos = sGoFreq.find(";"); if (pos == std::string::npos) triad = sGoFreq; else triad = sGoFreq.substr(0, pos); sGoFreq.erase(0, triad.length()+1); sscanf(triad.c_str(), "%lf", &rfd); if (rfd > 0) rf = (unsigned long long)(1000*rfd); if ((pos = triad.find(":")) != std::string::npos) { triad.erase(0,pos+1); if (triad.length()) sscanf(triad.c_str(), "%d", &af); if (af < 0) af = 0; if (af < progdefaults.LowFreqCutoff) af = progdefaults.LowFreqCutoff; if (af > progdefaults.HighFreqCutoff) af = progdefaults.HighFreqCutoff; } else af = active_modem->get_freq(); if ((pos = triad.find(":")) != std::string::npos) { triad.erase(0, pos+1); strtrim(triad); fpairs.push(rfafmd(rf, af, triad)); } else fpairs.push(rfafmd(rf,af, mdname)); } } struct rfafmd fpair; fpair = fpairs.front(); rf = fpair.rf; af = fpair.af; if (fpair.mdname != mdname) { for (int m = 0; m < NUM_MODES; m++) { if (fpair.mdname == mode_info[m].sname) { init_modem_sync(mode_info[m].mode); break; } } } fpairs.pop(); if (rf && rf != wf->rfcarrier()) qsy(rf, af); else active_modem->set_freq(af); substitute(s, i, endbracket, ""); } static void doQSY(std::string s) { unsigned long long rf = 0; int audio = 0; double rfd = 0; std::string sGoFreq; sGoFreq = s.substr(6, s.length() - 7); // no frequency(s) specified if (sGoFreq.length() == 0) { que_ok = true; return; } // rf first value sscanf(sGoFreq.c_str(), "%lf", &rfd); if (rfd > 0) rf = (unsigned long long)(1000.0*rfd); size_t pos; if ((pos = sGoFreq.find(":")) != std::string::npos) { // af second value sGoFreq.erase(0, pos+1); if (sGoFreq.length()) sscanf(sGoFreq.c_str(), "%d", &audio); if (audio < 0) audio = 0; if (audio < progdefaults.LowFreqCutoff) audio = progdefaults.LowFreqCutoff; if (audio > progdefaults.HighFreqCutoff) audio = progdefaults.HighFreqCutoff; } if (rf && rf != wf->rfcarrier()) qsy(rf, audio); else active_modem->set_freq((double)audio); que_ok = true; } static void pTxQueQSY(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doQSY }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } float wait_after_mode_change = 0.0; static std::string sFILWID; static void delayedFILWID(void *) { qso_opBW->value(sFILWID.c_str()); cb_qso_opBW(); wait_after_mode_change = 0.0; } static void pFILWID(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sWidth = s.substr(i+8, endbracket - i - 8); sFILWID = sWidth; Fl::add_timeout(wait_after_mode_change, delayedFILWID); substitute(s, i, endbracket, ""); } static void doFILWID(std::string s) { std::string sWID = s.substr(9, s.length() - 10); qso_opBW->value(sWID.c_str()); cb_qso_opBW(); que_ok = true; } static void pTxQueFILWID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFILWID }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQueFILWID(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doFILWID }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pRIGMODE(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sMode = s.substr(i+9, endbracket - i - 9); qso_opMODE->value(sMode.c_str()); cb_qso_opMODE(); substitute(s, i, endbracket, ""); if ((s.find("FILWID") != std::string::npos) || (s.find("RIGLO") != std::string::npos) || (s.find("RIGHI") != std::string::npos) ) wait_after_mode_change = progdefaults.mbw; else wait_after_mode_change = 0; } static void doRIGMODE(std::string s) { std::string sMode = s.substr(10, s.length() - 11); qso_opMODE->value(sMode.c_str()); cb_qso_opMODE(); que_ok = true; } static void pTxQueRIGMODE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGMODE }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQueRIGMODE(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGMODE }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static std::string sRIGLO; static void delayedRIGLO(void *) { qso_opBW2->value(sRIGLO.c_str()); cb_qso_opBW2(); wait_after_mode_change = 0.0; } static void pRIGLO(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sLO = s.substr(i+7, endbracket - i - 7); sRIGLO = sLO; if (wait_after_mode_change) Fl::add_timeout(wait_after_mode_change, delayedRIGLO); else { qso_opBW2->value(sLO.c_str()); cb_qso_opBW2(); } substitute(s, i, endbracket, ""); } static void doRIGLO(std::string s) { std::string sLO = s.substr(8, s.length() - 9); qso_opBW2->value(sLO.c_str()); cb_qso_opBW2(); que_ok = true; } static void pTxQueRIGLO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGLO }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQueRIGLO(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGLO }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static std::string sRIGHI; static void delayedRIGHI(void *) { qso_opBW1->value(sRIGHI.c_str()); cb_qso_opBW1(); wait_after_mode_change = 0.0; } static void pRIGHI(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sHI = s.substr(i+7, endbracket - i - 7); sRIGHI = sHI; if (wait_after_mode_change) Fl::add_timeout(wait_after_mode_change, delayedRIGHI); else { qso_opBW1->value(sHI.c_str()); cb_qso_opBW1(); } substitute(s, i, endbracket, ""); } static void doRIGHI(std::string s) { std::string sHI = s.substr(8, s.length() - 9); qso_opBW1->value(sHI.c_str()); cb_qso_opBW1(); que_ok = true; } static void pTxQueRIGHI(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGHI }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pRxQueRIGHI(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i, endbracket - i + 1), doRIGHI }; push_rxcmd(cmd); substitute(s, i, endbracket, ""); } static void pWX(std::string &s, size_t &i, size_t endbracket) { std::string wx; getwx(wx); s.replace(i, 4, wx); } // static void pWX2(std::string &s, size_t &i, size_t endbracket) { std::string wx; getwx(wx, s.substr(i+4, endbracket - i - 4).c_str()); substitute(s, i, endbracket, wx); } void set_macro_env(void) { enum { #ifndef __WOE32__ pSKEDH, FLDIGI_RX_IPC_KEY, FLDIGI_TX_IPC_KEY, #endif FLDIGI_XMLRPC_ADDRESS, FLDIGI_XMLRPC_PORT, FLDIGI_ARQ_ADDRESS, FLDIGI_ARQ_PORT, FLDIGI_VERSION_ENVVAR, FLDIGI_PID, FLDIGI_CONFIG_DIR, FLDIGI_MY_CALL, FLDIGI_MY_NAME, FLDIGI_MY_LOCATOR, FLDIGI_MODEM, FLDIGI_MODEM_LONG_NAME, FLDIGI_MODEM_ADIF_NAME, FLDIGI_DIAL_FREQUENCY, FLDIGI_AUDIO_FREQUENCY, FLDIGI_FREQUENCY, FLDIGI_TX_PWR, FLDIGI_MACRO_FILE, FLDIGI_LOG_FILE, FLDIGI_LOG_FREQUENCY, FLDIGI_LOG_DATE, FLDIGI_LOG_DATE_OFF, FLDIGI_LOG_TIME_ON, FLDIGI_LOG_TIME_OFF, FLDIGI_LOG_CALL, FLDIGI_LOG_NAME, FLDIGI_LOG_RST_IN, FLDIGI_LOG_RST_OUT, FLDIGI_LOG_QTH, FLDIGI_LOG_LOCATOR, FLDIGI_LOG_NOTES, FLDIGI_LOG_STATE, FLDIGI_LOG_COUNTRY, FLDIGI_LOG_COUNTY, FLDIGI_LOG_SERNO_IN, FLDIGI_LOG_SERNO_OUT, FLDIGI_XCHG_IN, FLDIGI_XCGH_OUT, FLDIGI_CLASS_IN, FLDIGI_ARRL_SECTION_IN, FLDIGI_VE_PROV, FLDIGI_AZ, FLDIGI_LOGBOOK_CALL, FLDIGI_LOGBOOK_NAME, FLDIGI_LOGBOOK_DATE, FLDIGI_LOGBOOK_TIME_ON, FLDIGI_LOGBOOK_DATE_OFF, FLDIGI_LOGBOOK_TIME_OFF, FLDIGI_LOGBOOK_RST_IN, FLDIGI_LOGBOOK_RST_OUT, FLDIGI_LOGBOOK_FREQUENCY, FLDIGI_LOGBOOK_MODE, FLDIGI_LOGBOOK_STATE, FLDIGI_LOGBOOK_VE_PROV, FLDIGI_LOGBOOK_COUNTRY, FLDIGI_LOGBOOK_SERNO_IN, FLDIGI_LOGBOOK_SERNO_OUT, FLDIGI_LOGBOOK_XCHG_IN, FLDIGI_LOGBOOK_XCHG_OUT, FLDIGI_LOGBOOK_CLASS_IN, FLDIGI_LOGBOOK_SECTION_IN, FLDIGI_LOGBOOK_QTH, FLDIGI_LOGBOOK_LOCATOR, FLDIGI_LOGBOOK_QSL_R, FLDIGI_LOGBOOK_QSL_S, FLDIGI_LOGBOOK_NOTES, FLDIGI_LOGBOOK_TX_PWR, FLDIGI_LOGBOOK_COUNTY, FLDIGI_LOGBOOK_IOTA, FLDIGI_LOGBOOK_DXCC, FLDIGI_LOGBOOK_QSL_VIA, FLDIGI_LOGBOOK_CONTINENT, FLDIGI_LOGBOOK_CQZ, FLDIGI_LOGBOOK_ITUZ, FLDIGI_LOGBOOK_SS_SERNO, FLDIGI_LOGBOOK_SS_PREC, FLDIGI_LOGBOOK_SS_CHK, FLDIGI_LOGBOOK_SS_SEC, ENV_SIZE }; struct { const char* var; const char* val; } env[] = { #ifndef __WOE32__ { "pSKEDH", "" }, { "FLDIGI_RX_IPC_KEY", "" }, { "FLDIGI_TX_IPC_KEY", "" }, #endif { "FLDIGI_XMLRPC_ADDRESS", progdefaults.xmlrpc_address.c_str() }, { "FLDIGI_XMLRPC_PORT", progdefaults.xmlrpc_port.c_str() }, { "FLDIGI_ARQ_ADDRESS", progdefaults.arq_address.c_str() }, { "FLDIGI_ARQ_PORT", progdefaults.arq_port.c_str() }, { "FLDIGI_VERSION", PACKAGE_VERSION }, { "FLDIGI_PID", "" }, { "FLDIGI_CONFIG_DIR", HomeDir.c_str() }, { "FLDIGI_MY_CALL", progdefaults.myCall.c_str() }, { "FLDIGI_MY_NAME", progdefaults.myName.c_str() }, { "FLDIGI_MY_LOCATOR", progdefaults.myLocator.c_str() }, { "FLDIGI_MODEM", mode_info[active_modem->get_mode()].sname }, { "FLDIGI_MODEM_LONG_NAME", mode_info[active_modem->get_mode()].name }, { "FLDIGI_MODEM_ADIF_NAME", mode_info[active_modem->get_mode()].adif_name }, { "FLDIGI_DIAL_FREQUENCY", "" }, { "FLDIGI_AUDIO_FREQUENCY", "" }, { "FLDIGI_FREQUENCY", "" }, { "FLDIGI_TX_PWR", log_power() }, // logging frame { "FLDIGI_MACRO_FILE", progStatus.LastMacroFile.c_str() }, { "FLDIGI_LOG_FILE", progdefaults.logbookfilename.c_str() }, { "FLDIGI_LOG_FREQUENCY", inpFreq->value() }, { "FLDIGI_LOG_DATE", inpDate_log->value() }, { "FLDIGI_LOG_DATE_OFF", inpDateOff_log->value() }, { "FLDIGI_LOG_TIME_ON", inpTimeOn->value() }, { "FLDIGI_LOG_TIME_OFF", inpTimeOff->value() }, { "FLDIGI_LOG_CALL", inpCall->value() }, { "FLDIGI_LOG_NAME", inpName->value() }, { "FLDIGI_LOG_RST_IN", inpRstIn->value() }, { "FLDIGI_LOG_RST_OUT", inpRstOut->value() }, { "FLDIGI_LOG_QTH", inpQth->value() }, { "FLDIGI_LOG_LOCATOR", inpLoc->value() }, { "FLDIGI_LOG_NOTES", inpNotes->value() }, { "FLDIGI_LOG_STATE", inpState->value() }, { "FLDIGI_LOG_COUNTRY", cboCountry->value() }, { "FLDIGI_LOG_COUNTY", inpCounty->value() }, { "FLDIGI_LOG_SERNO_IN", inpSerNo->value() }, { "FLDIGI_LOG_SERNO_OUT", outSerNo->value() }, { "FLDIGI_XCHG_IN", inpXchgIn->value() }, { "FLDIGI_XCHG_OUT", inpSend1->value() }, { "FLDIGI_CLASS_IN", inpClass->value() }, { "FLDIGI_ARRL_SECTION_IN", inpSection->value() }, { "FLDIGI_VE_PROV", inpVEprov->value() }, { "FLDIGI_AZ", inpAZ->value() }, { "FLDIGI_LOGBOOK_CALL", inpCall_log->value() }, { "FLDIGI_LOGBOOK_NAME", inpName_log->value () }, { "FLDIGI_LOGBOOK_DATE", inpDate_log->value() }, { "FLDIGI_LOGBOOK_TIME_ON", inpTimeOn_log->value() }, { "FLDIGI_LOGBOOK_DATE_OFF", inpDateOff_log->value() }, { "FLDIGI_LOGBOOK_TIME_OFF", inpTimeOff_log->value() }, { "FLDIGI_LOGBOOK_RST_IN", inpRstR_log->value() }, { "FLDIGI_LOGBOOK_RST_OUT", inpRstS_log->value() }, { "FLDIGI_LOGBOOK_FREQUENCY", inpFreq_log->value() }, { "FLDIGI_LOGBOOK_BAND", inpBand_log->value() }, { "FLDIGI_LOGBOOK_MODE", inpMode_log->value() }, { "FLDIGI_LOGBOOK_STATE", inpState_log->value() }, { "FLDIGI_LOGBOOK_VE_PROV", inpVE_Prov_log->value() }, { "FLDIGI_LOGBOOK_COUNTRY", inpCountry_log->value() }, { "FLDIGI_LOGBOOK_SERNO_IN", inpSerNoIn_log->value() }, { "FLDIGI_LOGBOOK_SERNO_OUT", inpSerNoOut_log->value() }, { "FLDIGI_LOGBOOK_XCHG_IN", inpXchgIn_log->value() }, { "FLDIGI_LOGBOOK_XCHG_OUT", inpMyXchg_log->value() }, { "FLDIGI_LOGBOOK_CLASS_IN", inpClass_log->value() }, { "FLDIGI_LOGBOOK_ARRL_SECT_IN", inpSection_log->value() }, { "FLDIGI_LOGBOOK_QTH", inpQth_log->value() }, { "FLDIGI_LOGBOOK_LOCATOR", inpLoc_log->value() }, { "FLDIGI_LOGBOOK_QSL_R", inpQSLrcvddate_log->value() }, { "FLDIGI_LOGBOOK_QSL_S", inpQSLsentdate_log->value() }, { "FLDIGI_LOGBOOK_TX_PWR", log_power() }, { "FLDIGI_LOGBOOK_COUNTY", inpCNTY_log->value() }, { "FLDIGI_LOGBOOK_IOTA", inpIOTA_log->value() }, { "FLDIGI_LOGBOOK_DXCC", inpDXCC_log->value() }, { "FLDIGI_LOGBOOK_QSL_VIA", inpQSL_VIA_log->value() }, { "FLDIGI_LOGBOOK_CONTINENT", inpCONT_log->value() }, { "FLDIGI_LOGBOOK_CQZ", inpCQZ_log->value() }, { "FLDIGI_LOGBOOK_ITUZ", inpITUZ_log->value() }, { "FLDIGI_LOGBOOK_SS_SERNO", inp_log_cwss_serno->value() }, { "FLDIGI_LOGBOOK_SS_PREC", inp_log_cwss_prec->value() }, { "FLDIGI_LOGBOOK_SS_CHK", inp_log_cwss_chk->value() }, { "FLDIGI_LOGBOOK_SS_SEC", inp_log_cwss_sec->value() }, { "FLDIGI_LOGBOOK_NOTES", inpNotes_log->value() } }; #ifndef __WOE32__ // pSKEDH static std::string pSKEDh = ScriptsDir; pSKEDh.erase(pSKEDh.length()-1,1); const char* p; if ((p = getenv("pSKEDH"))) pSKEDh.append(":").append(p); env[pSKEDH].val = pSKEDh.c_str(); // IPC keys char key[2][8]; snprintf(key[0], sizeof(key[0]), "%d", progdefaults.rx_msgid); env[FLDIGI_RX_IPC_KEY].val = key[0]; snprintf(key[1], sizeof(key[1]), "%d", progdefaults.tx_msgid); env[FLDIGI_TX_IPC_KEY].val = key[1]; #endif // pid char pid[6]; snprintf(pid, sizeof(pid), "%d", getpid()); env[FLDIGI_PID].val = pid; // frequencies char dial_freq[20]; snprintf(dial_freq, sizeof(dial_freq), "%llu", wf->rfcarrier()); env[FLDIGI_DIAL_FREQUENCY].val = dial_freq; char audio_freq[6]; snprintf(audio_freq, sizeof(audio_freq), "%d", active_modem->get_freq()); env[FLDIGI_AUDIO_FREQUENCY].val = audio_freq; char freq[20]; snprintf(freq, sizeof(freq), "%llu", (wf->rfcarrier() + (wf->USB() ? active_modem->get_freq() : -active_modem->get_freq()))); env[FLDIGI_FREQUENCY].val = freq; // debugging vars #if !defined(NDEBUG) && !defined(__WOE32__) unsetenv("FLDIGI_NO_EXEC"); unsetenv("MALLOC_CHECK_"); unsetenv("MALLOC_PERTURB_"); #endif std::string temp; size_t pch; for (size_t j = 0; j < sizeof(env) / sizeof (*env); j++) { temp = env[j].val; while ((pch = temp.find("\n")) != std::string::npos) temp[pch] = ';'; setenv(env[j].var, temp.c_str(), 1); } std::string path = getenv("PATH"); std::string mypath = ScriptsDir; if (mypath[mypath.length()-1] == '/') mypath.erase(mypath.length()-1, 1); mypath.append(":"); path.insert(0,mypath); setenv("PATH", path.c_str(), 1); } // this is only for the case where the user tries to nest ... // as in // ... ... // which is not permitted static void pEND_EXEC(std::string &s, size_t &i, size_t endbracket) { substitute(s, i, endbracket, ""); return; } #ifndef __MINGW32__ static void pEXEC(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } size_t start = s.find(">", i); size_t end = s.find("", start); if (start == std::string::npos || end == std::string::npos) { i++; return; } std::string execstr = s.substr(start+1, end-start-1); within_exec = true; MACROTEXT m; execstr = m.expandMacro(execstr, true); // execstr.insert(0,ScriptsDir); within_exec = false; int pfd[2]; if (pipe(pfd) == -1) { LOG_PERROR("pipe"); return; } pid_t pid; switch (pid = fork()) { case -1: LOG_PERROR("fork"); return; case 0: // child close(pfd[0]); if (dup2(pfd[1], STDOUT_FILENO) != STDOUT_FILENO) { LOG_PERROR("dup2"); exit(EXIT_FAILURE); } close(pfd[1]); set_macro_env(); execl("/bin/sh", "sh", "-c", execstr.c_str(), (char *)NULL); perror("execl"); exit(EXIT_FAILURE); } // parent close(pfd[1]); // give child process time to complete MilliSleep(50); FILE* fp = fdopen(pfd[0], "r"); if (!fp) { LOG_PERROR("fdopen"); close(pfd[0]); return; } s.erase(i, end - i + strlen("")); char ln[BUFSIZ]; std::string lnbuff = ""; while (fgets(ln, sizeof(ln), fp)) { lnbuff.append(ln); } // remove all trailing end-of-lines while (lnbuff[lnbuff.length()-1] == '\n') lnbuff.erase(lnbuff.length()-1,1); if (!lnbuff.empty()) { lnbuff = m.expandMacro(lnbuff, false); s.insert(i, lnbuff); i += lnbuff.length(); } else i++; fclose(fp); close(pfd[0]); } #else // !__MINGW32__ HANDLE g_hChildStd_IN_Rd = NULL; HANDLE g_hChildStd_IN_Wr = NULL; HANDLE g_hChildStd_OUT_Rd = NULL; HANDLE g_hChildStd_OUT_Wr = NULL; HANDLE g_hInputFile = NULL; #define PIPESIZE 4096 void WriteToPipe(void) // Read from a file and write its contents to the pipe for the child's STDIN. // Stop when there is no more data. { DWORD dwRead, dwWritten; CHAR chBuf[PIPESIZE]; BOOL bSuccess = FALSE; for (;;) { bSuccess = ReadFile(g_hInputFile, chBuf, PIPESIZE, &dwRead, NULL); if ( ! bSuccess || dwRead == 0 ) break; bSuccess = WriteFile(g_hChildStd_IN_Wr, chBuf, dwRead, &dwWritten, NULL); if ( ! bSuccess ) break; } // Close the pipe handle so the child process stops reading. if ( ! CloseHandle(g_hChildStd_IN_Wr) ) LOG_ERROR("StdInWr CloseHandle"); } std::string ReadFromPipe(void) // Read output from the child process's pipe for STDOUT // and write to the parent process's pipe for STDOUT. // Stop when there is no more data. { DWORD dwRead; // DWORD dwWritten; CHAR chBuf[PIPESIZE]; BOOL bSuccess = FALSE; // HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE); std::string sbuffer; LOG_INFO("Child std::cout handle: %p", g_hChildStd_OUT_Rd); for (;;) { memset(chBuf, 0, PIPESIZE); LOG_INFO("Read pipe"); bSuccess = ReadFile( g_hChildStd_OUT_Rd, chBuf, PIPESIZE, &dwRead, NULL); LOG_INFO("bSuccess: %d, dwRead %ld", bSuccess, dwRead); if( ! bSuccess || dwRead == 0 ) break; sbuffer.append(chBuf); // bSuccess = WriteFile(hParentStdOut, chBuf, // dwRead, &dwWritten, NULL); // if (! bSuccess ) break; } return sbuffer; } static void pEXEC(std::string& s, size_t& i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } size_t start, end; if ((start = s.find('>', i)) == std::string::npos || (end = s.rfind("")) == std::string::npos) { i++; return; } start++; std::string execstr = s.substr(start, end-start); within_exec = true; MACROTEXT m; execstr = m.expandMacro(execstr, true); within_exec = false; SECURITY_ATTRIBUTES saAttr; LOG_INFO("Start of macro execution."); // Set the bInheritHandle flag so pipe handles are inherited. saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); saAttr.bInheritHandle = TRUE; saAttr.lpSecurityDescriptor = NULL; // Create a pipe for the child process's STDOUT. if ( ! CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0) ) { LOG_ERROR("StdoutRd CreatePipe failes"); return; } // Ensure the read handle to the pipe for STDOUT is not inherited. if ( ! SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0) ) { LOG_ERROR("Stdout SetHandleInformation failed"); return; } // Create a pipe for the child process's STDIN. if (! CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &saAttr, 0)) { LOG_ERROR("Stdin CreatePipe failed"); return; } // Ensure the write handle to the pipe for STDIN is not inherited. if ( ! SetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0) ) { LOG_ERROR("Stdin SetHandleInformation failed"); return; } STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); char* cmd = strdup(execstr.c_str()); LOG_INFO("CMD %s", cmd); if (!CreateProcess( NULL, cmd, NULL, NULL, TRUE, //FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) { LOG_ERROR("CreateProcess failed with error code %ld", GetLastError()); free(cmd); return; } unsigned int waitret = WaitForSingleObject( pi.hProcess, 1000); //INFINITE ); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); free(cmd); // Read from pipe that is the standard output for child process. if (waitret == WAIT_ABANDONED || waitret == WAIT_TIMEOUT || waitret == WAIT_FAILED ) { LOG_INFO("%s", "Process SIGNAL return failed."); substitute(s, i, endbracket, ""); } else { std::string read_from_pipe = ReadFromPipe(); LOG_INFO("%s", "End of MACRO execution."); LOG_INFO("Process returned %s", (read_from_pipe.empty() ? "" : read_from_pipe.c_str())); if (!read_from_pipe.empty()) substitute(s, i, endbracket, read_from_pipe); else substitute(s, i, endbracket, ""); } } #endif // !__MINGW32__ static void pEQSL(std::string& s, size_t& i, size_t endbracket) { if (within_exec || progdefaults.eqsl_when_logged) { substitute(s, i, endbracket, ""); return; } size_t start = s.find(':', i); std::string msg = ""; if (start != std::string::npos) msg = s.substr(start + 1, endbracket-start-1); makeEQSL(msg.c_str()); substitute(s, i, endbracket, ""); return; } static void MAPIT(int how) { float lat = 0, lon = 0; std::string sCALL = inpCall->value(); std::string sLOC = inpLoc->value(); std::string url = "http://maps.google.com/maps?q="; if (how > 1 && !lookup_country.empty()) { url.append(lookup_addr1).append(",").append(lookup_addr2).append(","); url.append(lookup_state).append(",").append(lookup_country); } else { if (how > 0 && (!lookup_latd.empty() && !lookup_lond.empty())) { size_t p = std::string::npos; if ((p = lookup_latd.find(',')) !=std::string::npos) lookup_latd[p] = '.'; if ((p = lookup_lond.find(',')) !=std::string::npos) lookup_lond[p] = '.'; url.append(lookup_latd).append(","); url.append(lookup_lond); } else { if (sLOC.empty()) return; if (sLOC.length() < 4) return; if (sLOC.length() < 6) sLOC.append("aa"); for (size_t i = 0; i < 6; i++) sLOC[i] = toupper(sLOC[i]); if (sLOC[0] -'A' > 17 || sLOC[4] - 'A' > 23 || sLOC[1] -'A' > 17 || sLOC[5] - 'A' > 23 || !isdigit(sLOC[2]) || !isdigit(sLOC[3])) return; lon = -180.0 + (sLOC[0] - 'A') * 20 + (sLOC[2] - '0') * 2 + (sLOC[4] - 'A' + 0.5) / 12; lat = -90.0 + (sLOC[1] - 'A') * 10 + (sLOC[3] - '0') + (sLOC[5] - 'A' + 0.5) / 24; char sdata[20]; size_t p = std::string::npos; snprintf(sdata, sizeof(sdata),"%10.6f", lat); std::string temp = sdata; if ((p = temp.find(',')) !=std::string::npos) temp[p] = '.'; url.append(temp).append(","); snprintf(sdata, sizeof(sdata),"%10.6f", lon); temp = sdata; if ((p = temp.find(',')) !=std::string::npos) temp[p] = '.'; url.append(temp); } } if (!sCALL.empty()) url.append("(").append(sCALL).append(")"); else url.append("(nocall)"); url.append("&t=p&z=10"); cb_mnuVisitURL(NULL, (void*)url.c_str()); // examples // URL: http://maps.google.com/maps?q=30 Paradisou str.,Marousi,,Greece(SV1GRB)&t=p&z=10 // URL: http://maps.google.com/maps?q=30 Paradisou str.,Marousi,,Greece(SV1GRB)&t=p&z=10 // URL: http://maps.google.com/maps?q=38.020000,23.790000(SV1GRB)&t=p&z=10 // URL: http://maps.google.com/maps?q= 38.020832, 23.791666(SV1GRB)&t=p&z=10 } static void pMAPIT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string sVal = s.substr(i + 7, endbracket - i - 7); if (sVal.length() > 0) { if (sVal.compare(0,3,"adr") == 0) REQ(MAPIT,2); else if (sVal.compare(0,6,"latlon") == 0) REQ(MAPIT,1); else if (sVal.compare(0,3,"loc") == 0) REQ(MAPIT,0); else REQ(MAPIT,2); } else REQ(MAPIT,2); s.erase(i, s.find('>', i) + 1 - i); expand = false; } static void pSTOP(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } s.erase(i, s.find('>', i) + 1 - i); expand = false; } static void pCONT(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } s.erase(i, s.find('>', i) + 1 - i); expand = true; } //---------------------------------------------------------------------- // macro scheduling //---------------------------------------------------------------------- static long sk_xdt, sk_xtm; static void pLOCAL(std::string &s, size_t &i, size_t endbracket) { local_timed_exec = true; substitute(s, i, endbracket, ""); } static void pSKED(std::string &s, size_t &i, size_t endbracket) { if (within_exec || progStatus.skip_sked_macro) { substitute(s, i, endbracket, ""); return; } std::string data = s.substr(i+6, endbracket - i - 6); size_t p = data.find(":"); if (p == std::string::npos) { exec_date = (local_timed_exec ? ldate() : zdate()); exec_time = data; if (exec_time.empty()) exec_time = (local_timed_exec ? ltime() : ztime()); } else { exec_time = data.substr(0, p); exec_date = data.substr(p+1); } if (exec_time.length() == 4) exec_time.append("00"); sk_xdt = atol(exec_date.c_str()); sk_xtm = atol(exec_time.c_str()); timed_exec = true; substitute(s, i, endbracket, ""); } int timed_ptt = -1; void do_timed_execute(void *) { long dt, tm; dt = atol( local_timed_exec ? ldate() : zdate() ); tm = atol( local_timed_exec ? ltime() : ztime() ); if (dt >= sk_xdt && tm >= sk_xtm) { show_clock(false); if (timed_ptt != 1) { push2talk->set(true); timed_ptt = 1; } Qwait_time = 0; start_tx(); que_ok = true; btnMacroTimer->label(0); btnMacroTimer->color(FL_BACKGROUND_COLOR); btnMacroTimer->set_output(); sk_xdt = sk_xtm = 0; } else { show_clock(true); if (timed_ptt != 0) { push2talk->set(false); timed_ptt = 0; } Fl::repeat_timeout(1.0, do_timed_execute); } } static void doSKED(std::string s) { size_t p = s.find(":"); if (p == std::string::npos) { exec_date = (local_timed_exec ? ldate() : zdate()); exec_time = s; if (exec_time.empty()) exec_time = (local_timed_exec ? ltime() : ztime()); } else { exec_time = s.substr(0, p); exec_date = s.substr(p+1); } if (exec_time.length() == 4) exec_time.append("00"); std::string txt; txt.assign("Next scheduled transmission at "). append(exec_time.substr(0,2)).append(":"). append(exec_time.substr(2,2)).append(":"). append(exec_time.substr(4,2)). append(", on "). append(exec_date.substr(0,4)).append("/"). append(exec_date.substr(4,2)).append("/"). append(exec_date.substr(6,2)).append("\n"); btnMacroTimer->label("SKED"); btnMacroTimer->color(fl_rgb_color(240, 240, 0)); btnMacroTimer->redraw_label(); ReceiveText->addstr(txt, FTextBase::CTRL); Qwait_time = 9999; sk_xdt = atol(exec_date.c_str()); sk_xtm = atol(exec_time.c_str()); Fl::add_timeout(0.0, do_timed_execute); } static void pTxQueSKED(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } struct CMDS cmd = { s.substr(i + 7, endbracket - i - 7), doSKED }; push_txcmd(cmd); substitute(s, i, endbracket, "^!"); } static void pUNTIL(std::string &s, size_t &i, size_t endbracket) { if (within_exec) { substitute(s, i, endbracket, ""); return; } std::string data = s.substr(i+7, endbracket - i - 7); size_t p = data.find(":"); if (p == std::string::npos) { until_date = (local_timed_exec ? ldate() : zdate()); until_time = data; } else { until_time = data.substr(0, p); until_date = data.substr(p+1); } if (until_time.empty()) { substitute(s, i, endbracket, ""); return; } if (until_time.length() == 4) until_time.append("00"); run_until = true; substitute(s, i, endbracket, ""); } void queue_reset() { if (!Tx_cmds.empty()) { Fl::remove_timeout(post_queue_execute); Fl::remove_timeout(queue_execute_after_rx); Fl::remove_timeout(doneIDLE); Fl::remove_timeout(doneWAIT); while (!Tx_cmds.empty()) Tx_cmds.pop(); } while (!Rx_cmds.empty()) Rx_cmds.pop(); while (!mf_stack.empty()) mf_stack.pop(); Qwait_time = 0; Qidle_time = 0; que_ok = true; run_until = false; tx_queue_done = true; progStatus.skip_sked_macro = false; } // execute an in-line macro tag // occurs during the Tx state void Tx_queue_execute() { if (Tx_cmds.empty()) { Qwait_time = 0; Qidle_time = 0; tx_queue_done = true; return; } CMDS cmd = Tx_cmds.front(); Tx_cmds.pop(); LOG_INFO("%s", cmd.cmd.c_str()); REQ(postQueue, cmd.cmd); cmd.fp(cmd.cmd); return; } bool queue_must_rx() { // return true if current command is not a member 'must_rx' static std::string must_rx = " macro tag int time_out = 400; void Rx_queue_execution(void *) { if (rx_tune_on) { Fl::repeat_timeout( .050, Rx_queue_execution ); return; } if (!Tx_cmds.empty()) { Fl::remove_timeout(post_queue_execute); Fl::remove_timeout(queue_execute_after_rx); Fl::remove_timeout(doneIDLE); Fl::remove_timeout(doneWAIT); while (!Tx_cmds.empty()) Tx_cmds.pop(); } if (trx_state != STATE_RX) { if (time_out-- == 0) { while (!Rx_cmds.empty()) Rx_cmds.pop(); LOG_ERROR("%s", "failed"); time_out = 200; return; } Fl::repeat_timeout( .050, Rx_queue_execution ); return; } LOG_INFO("action delayed by %4.2f seconds", (400 - time_out)*.050); time_out = 400; CMDS cmd; while (!Rx_cmds.empty()) { cmd = Rx_cmds.front(); Rx_cmds.pop(); LOG_INFO("%s", cmd.cmd.c_str()); REQ(postQueue, cmd.cmd); cmd.cmd.erase(0,2); cmd.cmd.insert(0,"", pCALL}, {"", pFREQ}, {"", pBAND}, {"", pTX_PWR}, {"", pLOC}, {"", pMODE}, {"", pNAME}, {"", pQTH}, {"", pRST}, {"", pST}, {"", pPR}, {"", pMYCALL}, {"", pMYLOC}, {"", pMYNAME}, {"", pMYQTH}, {"", pMYRST}, {"", pMYCLASS}, {"", pMYSECTION}, {"", pMYSTATE}, {"", pMYST}, {"", pMYCOUNTY}, {"", pMYCNTY}, {"", pANTENNA}, {"", pQSOTIME}, {"", pQSONBR}, {"", pNXTNBR}, {"", pINFO1}, {"", pINFO2}, {"", pLDT}, {"", pZDT}, {"", pLD}, {"", pZD}, {"", p_ID}, {"", pTEXT}, {"", pCWID}, {"", pVER}, {"", pCNTR}, {"", pDECR}, {"", pINCR}, {"", pXOUT}, {"", pXIN}, {"", pXOUT}, {"", pFD_CLASS}, {"", pFD_SECTION}, {"", pCLASS}, {"
", pSECTION}, {"", pXBEG}, {"", pXEND}, {"", pSAVEXCHG}, {"", pSERNO}, {"", pLASTNO}, {"", pCLRLOG}, {"", pMODEM_COMPSKED}, {"", pEXEC}, {"", pEND_EXEC}, {"", pSTOP}, {"", pCONT}, {"", pPAUSE}, {"", pGET}, {"", pCLRRX}, {"", pCLRTX}, {"", pCLRQSO}, {"", pFOCUS}, {"", pSRCHUP}, {"", pSRCHDN}, {"", pGOHOME}, {"", pQSYTO}, {"", pQSYFM}, {"", pMAPIT}, {"", pREPEAT}, {"", pLOCAL}, {"", pPOP}, {"", pDIGI}, {"", pBUFFERED}, #ifdef __WIN32__ {"", pWX}, {"", pTxQueAVATAR}, // Tx Delayed action {"", pTxQueGOHOME}, {"", pTxQuePOP}, {"", pTxDIGI}, {"", pTxFREQ}, {"", pRxQueGOHOME}, {"<@RIGMODE:", pRxQueRIGMODE}, {"<@FILWID:", pRxQueFILWID}, {"<@RIGHI:", pRxQueRIGHI}, {"<@RIGLO:", pRxQueRIGLO}, {"<@TXRSID:", pRxQueTXRSID}, {"<@LOCK:", pRxQueLOCK}, {"<@WAIT:", pRxQueWAIT}, {"<@TUNE:", pRxQueTUNE}, {"<@PUSH", pRxQuePUSH}, {"<@POP>", pRxQuePOP}, {"", pRX}, {"", pTX}, {"", pTXRX}, {0, 0} }; int MACROTEXT::loadMacros(const std::string& filename) { std::string mLine; std::string mName; std::string mDef; int mNumber = 0; size_t crlf, idx; char szLine[4096]; bool convert = false; std::ifstream mFile(filename.c_str()); if (!mFile) { create_new_macros(); } else { mFile.getline(szLine, 4095); mLine = szLine; if (mLine.find("//fldigi macro definition file") != 0) { mFile.close(); return -2; } if (mLine.find("extended") == std::string::npos) { convert = true; changed = true; } // clear all of the macros for (int i = 0; i < MAXMACROS; i++) { name[i] = ""; text[i] = ""; } while (!mFile.eof()) { mFile.getline(szLine,4095); mLine = szLine; if (!mLine.length()) continue; if (mLine.find("//") == 0) // skip over all comment lines continue; if (mLine.find("/$") == 0) { idx = mLine.find(" ", 3); if (idx != std::string::npos) { mNumber = atoi(&mLine[3]); if (mNumber < 0 || mNumber > (MAXMACROS - 1)) break; if (convert && mNumber > 9) mNumber += 2; name[mNumber] = mLine.substr(idx+1); } continue; } crlf = mLine.rfind("\\n"); if (crlf != std::string::npos) { mLine.erase(crlf); mLine.append("\n"); } text[mNumber] = text[mNumber] + mLine; } mFile.close(); } return 0; } void MACROTEXT::loadDefault() { int erc; std::string Filename = MacrosDir; Filename.append("macros.mdf"); LOG_INFO("macro file name: %s", progStatus.LastMacroFile.c_str()); if (progdefaults.UseLastMacro == true) { if (progStatus.LastMacroFile.find("/") != std::string::npos || progStatus.LastMacroFile.find("\\") != std::string::npos) Filename.assign(progStatus.LastMacroFile); else Filename.assign(MacrosDir).append(progStatus.LastMacroFile); } LOG_INFO("loading: %s", Filename.c_str()); progStatus.LastMacroFile = Filename; if ((erc = loadMacros(Filename)) != 0) #ifndef __WOE32__ LOG_ERROR("Error #%d loading %s\n", erc, Filename.c_str()); #else ; #endif showMacroSet(); if (progdefaults.DisplayMacroFilename) { LOG_INFO("%s", progStatus.LastMacroFile.c_str()); std::string Macroset; Macroset.assign("\ \n================================================\n\ Read macros from: ").append(progStatus.LastMacroFile).append("\ \n================================================\n"); #ifdef __WOE32__ size_t p = std::string::npos; while ( (p = Macroset.find("/")) != std::string::npos) Macroset[p] = '\\'; #endif if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->addstr(Macroset); else if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr(Macroset); else ReceiveText->addstr(Macroset); } } void MACROTEXT::openMacroFile() { std::string deffilename = MacrosDir; if (progStatus.LastMacroFile.find("/") != std::string::npos || progStatus.LastMacroFile.find("\\") != std::string::npos) deffilename.assign(progStatus.LastMacroFile); else deffilename.append(progStatus.LastMacroFile); const char *p = FSEL::select( _("Open macro file"), _("Fldigi macro definition file\t*.{mdf}"), deffilename.c_str()); if (p && *p) { loadMacros(p); progStatus.LastMacroFile = p; showMacroSet(); if (progdefaults.DisplayMacroFilename) { std::string Macroset; Macroset.assign("\nLoaded macros: ").append(progStatus.LastMacroFile).append("\n"); if (active_modem->get_mode() == MODE_IFKP) ifkp_rx_text->addstr(Macroset); if (active_modem->get_mode() == MODE_FSQ) fsq_rx_text->addstr(Macroset); else ReceiveText->addstr(Macroset); } } } void MACROTEXT::writeMacroFile() { std::string deffilename = MacrosDir; if (progStatus.LastMacroFile.find("/") != std::string::npos || progStatus.LastMacroFile.find("\\") != std::string::npos) deffilename.assign(progStatus.LastMacroFile); else deffilename.append(progStatus.LastMacroFile); saveMacros(deffilename.c_str()); } void MACROTEXT::saveMacroFile() { std::string deffilename = MacrosDir; if (progStatus.LastMacroFile.find("/") != std::string::npos || progStatus.LastMacroFile.find("\\") != std::string::npos) deffilename.assign(progStatus.LastMacroFile); else deffilename.append(progStatus.LastMacroFile); const char *p = FSEL::saveas( _("Save macro file"), _("Fldigi macro definition file\t*.{mdf}"), deffilename.c_str()); if (!p) return; if (!*p) return; std::string sp = p; if (sp.empty()) return; if (sp.rfind(".mdf") == std::string::npos) sp.append(".mdf"); saveMacros(sp.c_str()); progStatus.LastMacroFile = sp; } void MACROTEXT::savecurrentMACROS(std::string &s, size_t &i, size_t endbracket) { writeMacroFile(); substitute(s, i, endbracket, ""); } void MACROTEXT::loadnewMACROS(std::string &s, size_t &i, size_t endbracket) { std::string fname = s.substr(i+8, endbracket - i - 8); if (fname.length() > 0) { loadMacros(fname); progStatus.LastMacroFile = fl_filename_name(fname.c_str()); } substitute(s, i, endbracket, ""); showMacroSet(); } std::string MACROTEXT::expandMacro(std::string &s, bool recurse = false) { size_t idx = 0; expand = true; buffered = false; if (!recurse || rx_only) { TransmitON = false; ToggleTXRX = false; } expanded = s; const MTAGS *pMtags; xbeg = xend = -1; save_xchg = false; progStatus.repeatMacro = -1; text2repeat.clear(); idleTime = 0; waitTime = 0; // tuneTime = 0; while ((idx = expanded.find('<', idx)) != std::string::npos) { size_t endbracket = expanded.find('>',idx); if (ufind(expanded, "", idx) == idx) pCONT(expanded, idx, endbracket); if (!expand) { idx++; continue; } pMtags = mtags; while (pMtags->mTAG != 0) { if (ufind(expanded, pMtags->mTAG, idx) == idx) { pMtags->fp(expanded,idx, endbracket); break; } pMtags++; } if (pMtags->mTAG == 0) idx++; } if (GET) { size_t pos1 = ufind(expanded, "$NAME"); size_t pos2 = ufind(expanded, "$QTH"); size_t pos3 = ufind(expanded, "$LOC"); if (pos1 != std::string::npos && pos2 != std::string::npos) { pos1 += 5; inpName->value(expanded.substr(pos1, pos2 - pos1).c_str()); } if (pos2 != std::string::npos) { pos2 += 4; inpQth->value(expanded.substr(pos2, pos3 - pos2).c_str()); } if (pos3 != std::string::npos) { pos3 += 4; inpLoc->value(expanded.substr(pos3).c_str()); } GET = false; return ""; } if (xbeg != std::string::npos && xend != std::string::npos && xend > xbeg) { qso_exchange = expanded.substr(xbeg, xend - xbeg); } else if (save_xchg) { qso_exchange = expanded; save_xchg = false; } // force "^r" to be last tag in the expanded std::string if ((idx = expanded.find("^r")) != std::string::npos) { expanded.erase(idx, 2); expanded.append("^r"); } if (!TransmitON && !Rx_cmds.empty()) Fl::add_timeout(0, rx_que_continue); return expanded; } void idleTimer(void *) { macro_idle_on = false; } static void finishWait(void *) { if (rx_only) { TransmitON = false; return; } if ( TransmitON ) { active_modem->set_stopflag(false); if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); start_tx(); TransmitON = false; } } static void set_button(Fl_Button* button, bool value) { button->value(value); button->do_callback(); } void MACROTEXT::timed_execute() { queue_reset(); if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->clear(); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->clear(); else TransmitText->clear(); if (!rx_only) { text2send = expandMacro(exec_string); progStatus.skip_sked_macro = true; if (active_modem->get_mode() == MODE_IFKP) ifkp_tx_text->add_text(text2send); else if (active_modem->get_mode() == MODE_FSQ) fsq_tx_text->add_text( text2send ); else add_text(text2send); exec_string.clear(); active_modem->set_stopflag(false); start_tx(); } } void MACROTEXT::execute(int n) { guard_lock exec(&exec_mutex); std::string dd, dt; dd = (local_timed_exec ? ldate() : zdate()); dt = (local_timed_exec ? ltime() : ldate()); if (run_until && dd >= until_date && dt >= until_time) { stopMacroTimer(); queue_reset(); return; } mNbr = n; text2send = expandMacro(text[n]); if (timed_exec && !progStatus.skip_sked_macro) { progStatus.repeatMacro = -1; exec_string = text[n]; startTimedExecute(name[n]); timed_exec = false; return; } trx_mode mode = active_modem->get_mode(); if (!rx_only) { if (progStatus.repeatMacro == -1) { if (mode == MODE_IFKP) ifkp_tx_text->add_text( text2send ); else if (mode == MODE_FSQ) fsq_tx_text->add_text( text2send ); else add_text( text2send ); } else { size_t p = std::string::npos; text2send = text[n]; while ((p = text2send.find('<')) != std::string::npos) text2send[p] = '['; while ((p = text2send.find('>')) != std::string::npos) text2send[p] = ']'; if (mode == MODE_IFKP) ifkp_tx_text->add_text( text2send ); else if (mode == MODE_FSQ) fsq_tx_text->add_text( text2send ); else add_text( text2send ); } } bool keep_tx = !text2send.empty(); text2send.clear(); if (tune_on) { if (tune_timeout > 0) { Fl::add_timeout(tune_timeout, end_tune, (void *)keep_tx); tune_timeout = 0; } return; } if (ToggleTXRX) { text2send.clear(); if (!wf->xmtrcv->value()) { REQ(set_button, wf->xmtrcv, true); if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); } else REQ(set_button, wf->xmtrcv, false); return; } if (useWait && waitTime > 0) { Fl::add_timeout(waitTime, finishWait); useWait = false; return; } if ( TransmitON ) { if (macro_idle_on && idleTime > 0) Fl::add_timeout(idleTime, idleTimer); active_modem->set_stopflag(false); start_tx(); TransmitON = false; } } void MACROTEXT::repeat(int n) { expandMacro(text[n]); progStatus.skip_sked_macro = true; LOG_WARN("%s",text2repeat.c_str()); macro_idle_on = false; if (idleTime) progStatus.repeatIdleTime = idleTime; } MACROTEXT::MACROTEXT() { changed = false; char szname[5]; for (int i = 0; i < MAXMACROS; i++) { snprintf(szname, sizeof(szname), "F-%d", i+1); name[i] = szname;//""; text[i] = ""; } } static std::string mtext = "//fldigi macro definition file extended\n\ // This file defines the macro structure(s) for the digital modem program, fldigi\n\ // It also serves as a basis for any macros that are written by the user\n\ //\n\ // The top line of this file should always be the first line in every macro \n\ // definition file (.mdf) for the fldigi program to recognize it as such.\n\ //\n\ "; void MACROTEXT::saveMacros(const std::string& fname) { std::string work; std::string output; char temp[200]; output.assign(mtext); for (int i = 0; i < MAXMACROS; i++) { snprintf(temp, sizeof(temp), "\n//\n// Macro # %d\n/$ %d %s\n", i+1, i, macros.name[i].c_str()); output.append(temp); work = macros.text[i]; size_t pos; pos = work.find('\n'); while (pos != std::string::npos) { work.insert(pos, "\\n"); pos = work.find('\n', pos + 3); } output.append(work).append("\n"); } UTF8_writefile(fname.c_str(), output); changed = false; } fldigi-4.2.05/src/misc/log.cxx0000664000175000017500000000611714611711171013017 00000000000000// ---------------------------------------------------------------------------- // log.cxx -- Received text logging for fldigi // // Copyright (C) 2007-2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include #include #include #include #include #include #include "log.h" #include "trx.h" #include "fl_digi.h" #include "timeops.h" #include "ascii.h" static const char *lognames[] = { "RX", "TX", "", "" }; cLogfile::cLogfile(const std::string& fname) : retflag(true), logtype(LOG_RX) { if ((logfile = fl_fopen(fname.c_str(), "a"))) { setvbuf(logfile, (char*)NULL, _IOLBF, 0); set_cloexec(fileno(logfile), 1); } } cLogfile::~cLogfile() { if (logfile) fclose(logfile); } void cLogfile::log_to_file(log_t type, const std::string& s) { if (!logfile || ferror(logfile) || s.empty()) return; char timestr[64]; struct tm tm; time_t t; if (type == LOG_RX || type == LOG_TX) { if (retflag || type != logtype) { if (type != logtype) fprintf(logfile, "\n"); time(&t); gmtime_r(&t, &tm); strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%MZ", &tm); char freq[20]; snprintf(freq, sizeof(freq), "%llu", static_cast( wf->rfcarrier() + (wf->USB() ? active_modem->get_freq() : -active_modem->get_freq() ) ) ); const char *logmode = mode_info[active_modem->get_mode()].adif_name; fprintf(logfile, "%s %s : %s (%s): ", lognames[type], freq, logmode, timestr); } for (size_t i = 0; i < s.length(); i++) fprintf(logfile, "%s", ascii3[s[i] & 0xFF]); // if (s[i] == '\n' || (unsigned char)s[i] >= ' ') fprintf(logfile, "%c", s[i]); retflag = *s.rbegin() == '\n'; if (!retflag) fflush(logfile); } else { time(&t); gmtime_r(&t, &tm); // Was %e (space padded month) but it's not available in the MS C // runtime library, %d (zero-padded) is more portable. strftime(timestr, sizeof(timestr), "%a %b %d %H:%M:%S %Y UTC", &tm); fprintf(logfile, "\n--- Logging %s at %s ---\n", s.c_str(), timestr); } logtype = type; } void cLogfile::log_to_file_start() { log_to_file(LOG_START, "started"); } void cLogfile::log_to_file_stop() { log_to_file(LOG_STOP, "stopped"); } /* ---------------------------------------------------------------------- */ fldigi-4.2.05/src/misc/ax25_decode.cxx0000664000175000017500000006625314532252172014332 00000000000000// --------------------------------------------------------------------- // ax25_decode.cxx -- AX25 Packet disassembler. // // This file is a proposed part of fldigi. Adapted very liberally from // rtty.cxx, with many thanks to John Hansen, W2FS, who wrote // 'dcc.doc' and 'dcc2.doc', GNU Octave, GNU Radio Companion, and finally // Bartek Kania (bk.gnarf.org) whose 'aprs.c' expository coding style helped // shape this implementation. // // Copyright (C) 2010, 2014 // Dave Freese, W1HKJ // Chris Sylvain, KB3CS // Robert Stiles, KK5VD // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi; if not, write to the // // Free Software Foundation, Inc. // 51 Franklin Street, Fifth Floor // Boston, MA 02110-1301 USA. // // --------------------------------------------------------------------- #include "fl_digi.h" #include "modem.h" #include "misc.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "timeops.h" #include "debug.h" #include "qrunner.h" #include "threads.h" #include "ax25_decode.h" static PKT_MicE_field MicE_table[][12][5] = { { { Zero, Zero, South, P0, East }, { One, Zero, South, P0, East }, { Two, Zero, South, P0, East }, { Three, Zero, South, P0, East }, { Four, Zero, South, P0, East }, { Five, Zero, South, P0, East }, { Six, Zero, South, P0, East }, { Seven, Zero, South, P0, East }, { Eight, Zero, South, P0, East }, { Nine, Zero, South, P0, East }, { Invalid, Null, Null, Null, Null }, { Invalid, Null, Null, Null, Null } }, { // ['A'..'K'] + 'L' { Zero, One, Null, Null, Null }, // custom A/B/C msg codes { One, One, Null, Null, Null }, { Two, One, Null, Null, Null }, { Three, One, Null, Null, Null }, { Four, One, Null, Null, Null }, { Five, One, Null, Null, Null }, { Six, One, Null, Null, Null }, { Seven, One, Null, Null, Null }, { Eight, One, Null, Null, Null }, { Nine, One, Null, Null, Null }, { Space, One, Null, Null, Null }, { Space, Zero, South, P0, East } }, { // ['P'..'Z'] { Zero, One, North, P100, West }, // standard A/B/C msg codes { One, One, North, P100, West }, { Two, One, North, P100, West }, { Three, One, North, P100, West }, { Four, One, North, P100, West }, { Five, One, North, P100, West }, { Six, One, North, P100, West }, { Seven, One, North, P100, West }, { Eight, One, North, P100, West }, { Nine, One, North, P100, West }, { Space, One, North, P100, West }, { Invalid, Null, Null, Null, Null } } }; static PKT_PHG_table PHG_table[] = { { "Omni", 4 }, { "NE", 2 }, { "E", 1 }, { "SE", 2 }, { "S", 1 }, { "SW", 2 }, { "W", 1 }, { "NW", 2 }, { "N", 1 } }; static unsigned char rxbuf[MAXOCTETS+4]; int mode = FTextBase::RECV; #define put_rx_char put_rx_local_char inline void put_rx_local_char(char value) { put_rx_processed_char(value, mode); } inline void put_rx_hex(unsigned char c) { char v[3]; snprintf(&v[0], 3, "%02x", c); put_rx_char(v[0]); put_rx_char(v[1]); } inline void put_rx_const(const char s[]) { unsigned char *p = (unsigned char *) &s[0]; for( ; *p; p++) put_rx_char(*p); } static void expand_Cmp(unsigned char *cpI) { // APRS Spec 1.0.1 Chapter 9 - Compressed Position Report format unsigned char *cp, tc, cc; unsigned char Cmpbuf[96], *bp = &Cmpbuf[0]; unsigned char *tbp = bp; double Lat, Lon, td; bool sign; cp = cpI+1; // skip past Symbol Table ID char // Latitude as base91 number tc = *cp++ - 33; Lat = tc * 91 * 91 * 91; // fourth digit ==> x * 91^3 tc = *cp++ - 33; Lat += tc * 91 * 91; // third digit ==> x * 91^2 tc = *cp++ - 33; Lat += tc * 91; // second digit ==> x * 91^1 tc = *cp++ - 33; Lat += tc; // units digit ==> x * 91^0 Lat = 90.0 - Lat / 380926.0; // - ==> S, + ==> N // Longitude as base91 number tc = *cp++ - 33; Lon = tc * 91 * 91 * 91; // 4th digit tc = *cp++ - 33; Lon += tc * 91 * 91; // 3rd digit tc = *cp++ - 33; Lon += tc * 91; // 2nd digit tc = *cp++ - 33; Lon += tc; // units digit Lon = -180.0 + Lon / 190463.0; // - ==> W, + ==> E if (Lat < 0) { sign = 1; // has sign (is negative) Lat *= -1; } else sign = 0; td = Lat - floor(Lat); cc = snprintf((char *)bp, 3, "%2.f", (Lat - td)); // DD bp += cc; cc = snprintf((char *)bp, 6, "%05.2f", td*60); // MM.MM bp += cc; if (sign) *bp++ = 'S'; else *bp++ = 'N'; *bp++ = ' '; if (Lon < 0) { sign = 1; Lon *= -1; } else sign = 0; td = Lon - floor(Lon); cc = snprintf((char *)bp, 4, "%03.f", (Lon - td)); // DDD bp += cc; cc = snprintf((char *)bp, 6, "%5.2f", td*60); // MM.MM bp += cc; if (sign) *bp++ = 'W'; else *bp++ = 'E'; cp += 1; // skip past Symbol Code char if (*cp != ' ') { // still more if ((*(cp + 2) & 0x18) == 0x10) { // NMEA source = GGA sentence // compressed Altitude uses chars in the same range // as CSE/SPD but the Compression Type ID takes precedence // when it indicates the NMEA source is a GGA sentence. // so check on this one first and CSE/SPD last. double Altitude; tc = *cp++ - 33; // 2nd digit Altitude = tc * 91; tc = *cp++ - 33; Altitude += tc; // this compressed posit field is not very useful as spec'ed, // since it cannot produce a possible negative altitude! // the NMEA GGA sentence is perfectly capable of providing // a negative altitude value. Mic-E gets this right. // Since the example given in the APRS 1.0.1 Spec uses a value // in excess of 10000, this field should be re-spec'ed as a // value in meters relative to 10km below mean sea level (just // as done in Mic-E). Altitude = pow(1.002, Altitude); if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 11, " %-.1fm", Altitude*0.3048); else // units per Spec cc = snprintf((char *)bp, 12, " %-.1fft", Altitude); bp += cc; } else if (*cp == '{') { // pre-calculated radio range double Range; cp += 1; // skip past ID char tc = *cp++ - 33; // range Range = pow(1.08, (double)tc) * 2; if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 24, " Est. Range = %-.1fkm", Range*1.609); else // units per Spec cc = snprintf((char *)bp, 24, " Est. Range = %-.1fmi", Range); bp += cc; } else if (*cp >= '!' && *cp <= 'z') { // compressed CSE/SPD int Speed; tc = *cp++ - 33; // course cc = snprintf((char *)bp, 8, " %03ddeg", tc*4); bp += cc; tc = *cp++ - 33; // speed Speed = (int)floor(pow(1.08, (double)tc) - 1); // 1.08^tc - 1 kts if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 8, " %03dkph", (int)floor(Speed*1.852+0.5)); else if (progdefaults.PKT_unitsEnglish) cc = snprintf((char *)bp, 8, " %03dmph", (int)floor(Speed*1.151+0.5)); else // units per Spec cc = snprintf((char *)bp, 8, " %03dkts", Speed); bp += cc; } } if (progdefaults.PKT_RXTimestamp) put_rx_const(" "); put_rx_const(" [Cmp] "); for(; tbp < bp; tbp++) put_rx_char(*tbp); put_rx_char('\r'); if (debug::level >= debug::VERBOSE_LEVEL) { cp = cpI+12; // skip to Compression Type ID char if (*(cp - 2) != ' ') { // Cmp Type ID is valid tbp = bp = &Cmpbuf[0]; tc = *cp - 33; // T cc = snprintf((char *)bp, 4, "%02x:", tc); bp += cc; strcpy((char *)bp, " GPS Fix = "); bp += 11; if ((tc & 0x20) == 0x20) { strcpy((char *)bp, "old"); bp += 3; } else { strcpy((char *)bp, "current"); bp += 7; } strcpy((char *)bp, ", NMEA Source = "); bp += 16; switch (tc & 0x18) { case 0x00: strcpy((char *)bp, "other"); bp += 5; break; case 0x08: strcpy((char *)bp, "GLL"); bp += 3; break; case 0x10: strcpy((char *)bp, "GGA"); bp += 3; break; case 0x18: strcpy((char *)bp, "RMC"); bp += 3; break; default: strcpy((char *)bp, "\?\?"); bp += 2; break; } strcpy((char *)bp, ", Cmp Origin = "); bp += 15; switch (tc & 0x07) { case 0x00: strcpy((char *)bp, "Compressed"); bp += 10; break; case 0x01: strcpy((char *)bp, "TNC BText"); bp += 9; break; case 0x02: strcpy((char *)bp, "Software (DOS/Mac/Win/+SA)"); bp += 26; break; case 0x03: strcpy((char *)bp, "[tbd]"); bp += 5; break; case 0x04: strcpy((char *)bp, "KPC3"); bp += 4; break; case 0x05: strcpy((char *)bp, "Pico"); bp += 4; break; case 0x06: strcpy((char *)bp, "Other tracker [tbd]"); bp += 19; break; case 0x07: strcpy((char *)bp, "Digipeater conversion"); bp += 21; break; default: strcpy((char *)bp, "\?\?"); bp += 2; break; } if (progdefaults.PKT_RXTimestamp) put_rx_const(" "); put_rx_const(" [CmpType] "); for(; tbp < bp; tbp++) put_rx_char(*tbp); put_rx_char('\r'); } } } static void expand_PHG(unsigned char *cpI) { // APRS Spec 1.0.1 Chapter 6 - Time and Position format // APRS Spec 1.0.1 Chapter 7 - PHG Extension format bool hasPHG = false; unsigned char *cp, tc, cc; unsigned char PHGbuf[64], *bp = &PHGbuf[0]; unsigned char *tbp = bp; switch (*cpI) { case '!': case '=': // simplest posits cp = cpI+1; // skip past posit ID char if (*cp != '/') { // posit not compressed cp += 19; // skip past posit data } else { // posit is compressed cp += 1; // skip past compressed posit ID char cp += 12; // skip past compressed posit data } if (strncmp((const char *)cp, "PHG", 3) == 0) { // strings match unsigned char ndigits; int power, height; double gain, range; cp += 3; // skip past Data Extension ID chars // get span of chars in cp which are only digits ndigits = strspn((const char *)cp, "0123456789"); switch (ndigits) { //case 1: H might be larger than '9'. code below will work. // must also check that P.GD are all '0'-'9' //break; case 4: // APRS Spec 1.0.1 Chapter 7 page 28 case 5: // PHGR proposed for APRS Spec 1.2 hasPHG = true; tc = *cp++ - '0'; // P power = tc * tc; // tc^2 cc = snprintf((char *)bp, 5, "%dW,", power); bp += cc; tc = *cp++ - '0'; // H *bp++ = ' '; if (tc < 30) { // constrain Height to signed 32bit value height = 10 * (1 << tc); // 10 * 2^tc if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 11, "%dm", (int)floor(height*0.3048+0.5)); else // units per Spec cc = snprintf((char *)bp, 12, "%dft", height); bp += cc; } else { height = 0; strcpy((char *)bp, "-\?\?-"); bp += 4; } strcpy((char *)bp, " HAAT,"); bp += 6; tc = *cp++; // G gain = pow(10, ((double)(tc - '0') / 10)); cc = snprintf((char *)bp, 6, " %cdB,", tc); bp += cc; tc = *cp++ - '0'; // D *bp++ = ' '; if (tc < 9) { strcpy((char *)bp, PHG_table[tc].s); bp += PHG_table[tc].l; } else { strcpy((char *)bp, "-\?\?-"); bp += 4; } *bp++ = ','; range = sqrt(2 * height * sqrt(((double)power / 10) * (gain / 2))); if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 24, " Est. Range = %-.1fkm", range*1.609); else // units per Spec cc = snprintf((char *)bp, 24, " Est. Range = %-.1fmi", range); bp += cc; if (ndigits == 5 && *(cp + 1) == '/') { // PHGR: http://www.aprs.org/aprs12/probes.txt // '1'-'9' and 'A'-'Z' are actually permissible. // does anyone send 10 ('A') or more beacons per hour? strcpy((char *)bp, ", "); bp += 2; tc = *cp++; // R cc = snprintf((char *)bp, 14, "%c beacons/hr", tc); bp += cc; } break; default: // switch(ndigits) break; } } break; default: // switch(*cpI) break; } if (hasPHG) { if (progdefaults.PKT_RXTimestamp) put_rx_const(" "); put_rx_const(" [PHG] "); for(; tbp < bp; tbp++) put_rx_char(*tbp); put_rx_char('\r'); } } static void expand_MicE(unsigned char *cpI, unsigned char *cpE) { // APRS Spec 1.0.1 Chapter 10 - Mic-E Data format bool isMicE = true; bool msgstd = false, msgcustom = false; // decoding starts at first AX.25 dest addr unsigned char *cp = &rxbuf[1], tc, cc; unsigned char MicEbuf[64], *bp = &MicEbuf[0]; unsigned char *tbp = bp; unsigned int msgABC = 0; PKT_MicE_field Lat = North, LonOffset = Zero, Lon = West; for (int i = 0; i < 3; i++) { // remember: AX.25 dest addr chars are shifted left by one tc = *cp++ >> 1; switch (tc & 0xF0) { case 0x30: // MicE_table[0] cc = tc - '0'; if (cc < 10) { *bp++ = MicE_table[0][cc][0]; } else isMicE = false; break; case 0x40: // MicE_table[1] cc = tc - 'A'; if (cc < 12) { bool t = MicE_table[1][cc][1]-'0'; if (t) { msgABC |= t << (2-i); msgcustom = true; } else msgABC &= ~(1 << (2-i)); *bp++ = MicE_table[1][cc][0]; } else isMicE = false; break; case 0x50: // MicE_table[2] cc = tc - 'P'; if (cc < 11) { msgABC |= (MicE_table[2][cc][1]-'0') << (2-i); msgstd = true; *bp++ = MicE_table[2][cc][0]; } else isMicE = false; break; default: // Invalid isMicE = false; break; } } for (int i = 3; i < 6; i++) { // remember: AX.25 dest addr chars are shifted left by one tc = *cp++ >> 1; switch (i) { case 3: switch (tc & 0xF0) { case 0x30: // MicE_table[0] cc = tc - '0'; if (cc < 10) { Lat = MicE_table[0][cc][2]; *bp++ = MicE_table[0][cc][0]; } else isMicE = false; break; case 0x40: // MicE_table[1] cc = tc - 'A'; if (cc == 11) { Lat = MicE_table[1][cc][2]; *bp++ = MicE_table[1][cc][0]; } else isMicE = false; break; case 0x50: // MicE_table[2] cc = tc - 'P'; if (cc < 11) { Lat = MicE_table[2][cc][2]; *bp++ = MicE_table[2][cc][0]; } else isMicE = false; break; default: // Invalid isMicE = false; break; } break; case 4: switch (tc & 0xF0) { case 0x30: // MicE_table[0] cc = tc - '0'; if (cc < 10) { LonOffset = MicE_table[0][cc][3]; *bp++ = MicE_table[0][cc][0]; } else isMicE = false; break; case 0x40: // MicE_table[1] cc = tc - 'A'; if (cc == 11) { LonOffset = MicE_table[1][cc][3]; *bp++ = MicE_table[1][cc][0]; } else isMicE = false; break; case 0x50: // MicE_table[2] cc = tc - 'P'; if (cc < 11) { LonOffset = MicE_table[2][cc][3]; *bp++ = MicE_table[2][cc][0]; } else isMicE = false; break; default: // Invalid isMicE = false; break; } break; case 5: switch (tc & 0xF0) { case 0x30: // MicE_table[0] cc = tc - '0'; if (cc < 10) { Lon = MicE_table[0][cc][4]; *bp++ = MicE_table[0][cc][0]; } else isMicE = false; break; case 0x40: // MicE_table[1] cc = tc - 'A'; if (cc == 11) { Lon = MicE_table[1][cc][4]; *bp++ = MicE_table[1][cc][0]; } else isMicE = false; break; case 0x50: // MicE_table[2] cc = tc - 'P'; if (cc < 11) { Lon = MicE_table[2][cc][4]; *bp++ = MicE_table[2][cc][0]; } else isMicE = false; break; default: // Invalid isMicE = false; break; } break; default: // Invalid isMicE = false; break; } } if (isMicE) { int Speed = 0, Course = 0; if (progdefaults.PKT_RXTimestamp) put_rx_const(" "); put_rx_const(" [Mic-E] "); if (msgstd && msgcustom) put_rx_const("Unknown? "); else if (msgcustom) { put_rx_const("Custom-"); put_rx_char((7 - msgABC)+'0'); put_rx_const(". "); } else { switch (msgABC) { // APRS Spec 1.0.1 Chapter 10 page 45 case 0: put_rx_const("Emergency"); break; case 1: put_rx_const("Priority"); break; case 2: put_rx_const("Special"); break; case 3: put_rx_const("Committed"); break; case 4: put_rx_const("Returning"); break; case 5: put_rx_const("In Service"); break; case 6: put_rx_const("En Route"); break; case 7: put_rx_const("Off Duty"); break; default: put_rx_const("-\?\?-"); break; } if (msgABC) put_rx_char('.'); else put_rx_char('!'); // Emergency! put_rx_char(' '); } for (; tbp < bp; tbp++) { put_rx_char(*tbp); if (tbp == (bp - 3)) put_rx_char('.'); } if (Lat == North) put_rx_char('N'); else if (Lat == South) put_rx_char('S'); else put_rx_char('\?'); put_rx_char(' '); cp = cpI+1; // one past the Data Type ID char // decode Lon degrees - APRS Spec 1.0.1 Chapter 10 page 48 tc = *cp++ - 28; if (LonOffset == P100) tc += 100; if (tc > 179 && tc < 190) tc -= 80; else if (tc > 189 && tc < 200) tc -= 190; cc = snprintf((char *)bp, 4, "%03d", tc); bp += cc; // decode Lon minutes tc = *cp++ - 28; if (tc > 59) tc -= 60; cc = snprintf((char *)bp, 3, "%02d", tc); bp += cc; // decode Lon hundredths of a minute tc = *cp++ - 28; cc = snprintf((char *)bp, 3, "%02d", tc); bp += cc; for (; tbp < bp; tbp++) { put_rx_char(*tbp); if (tbp == (bp - 3)) put_rx_char('.'); } if (Lon == East) put_rx_char('E'); else if (Lon == West) put_rx_char('W'); else put_rx_char('\?'); // decode Speed and Course - APRS Spec 1.0.1 Chapter 10 page 52 tc = *cp++ - 28; // speed: hundreds and tens if (tc > 79) tc -= 80; Speed = tc * 10; tc = *cp++ - 28; // speed: units and course: hundreds Course = (tc % 10); // remainder from dividing by 10 tc -= Course; tc /= 10; // tc is now quotient from dividing by 10 Speed += tc; if (Course > 3) Course -= 4; Course *= 100; tc = *cp++ - 28; // course: tens and units Course += tc; if (progdefaults.PKT_unitsSI) cc = snprintf((char *)bp, 8, " %03dkph", (int)floor(Speed*1.852+0.5)); else if (progdefaults.PKT_unitsEnglish) cc = snprintf((char *)bp, 8, " %03dmph", (int)floor(Speed*1.151+0.5)); else // units per Spec cc = snprintf((char *)bp, 8, " %03dkts", Speed); bp += cc; cc = snprintf((char *)bp, 8, " %03ddeg", Course); bp += cc; for (; tbp < bp; tbp++) { put_rx_char(*tbp); } cp += 2; // skip past Symbol and Symbol Table ID chars if (cp <= cpE) { // still more if (*cp == '>') { cp += 1; put_rx_const(" TH-D7"); } else if (*cp == ']' && *cpE == '=') { cp += 1; cpE -= 1; put_rx_const(" TM-D710"); } else if (*cp == ']') { cp += 1; put_rx_const(" TM-D700"); } else if (*cp == '\'' && *(cpE - 1) == '|' && *cpE == '3') { cp += 1; cpE -= 2; put_rx_const(" TT3"); } else if (*cp == '\'' && *(cpE - 1) == '|' && *cpE == '4') { cp += 1; cpE -= 2; put_rx_const(" TT4"); } else if (*cp == '`' && *(cpE - 1) == '_' && *cpE == ' ') { cp += 1; cpE -= 2; put_rx_const(" VX-8"); } else if (*cp == '`' && *(cpE - 1) == '_' && *cpE == '#') { cp += 1; cpE -= 2; put_rx_const(" VX-8D/G"); // VX-8G for certain. guessing. } else if (*cp == '`' && *(cpE - 1) == '_' && *cpE == '\"') { cp += 1; cpE -= 2; put_rx_const(" FTM-350"); } else if ((*cp == '\'' || *cp == '`') && *(cp + 4) == '}') { cp += 1; // tracker? rig? ID codes are somewhat ad hoc. put_rx_const(" MFR\?"); } if (cp < cpE) { if (*(cp + 3) == '}') { // station altitude as base91 number int Altitude = 0; tc = *cp++ - 33; // third digit ==> x * 91^2 Altitude = tc * 91 * 91; tc = *cp++ - 33; // second digit ==> x * 91^1 ==> x * 91 Altitude += tc * 91; tc = *cp++ - 33; // unit digit ==> x * 91^0 ==> x * 1 Altitude += tc; Altitude -= 10000; // remove offset from datum *bp++ = ' '; if (Altitude >= 0) *bp++ = '+'; if (progdefaults.PKT_unitsEnglish) cc = snprintf((char *)bp, 12, "%dft", (int)floor(Altitude*3.281+0.5)); else // units per Spec cc = snprintf((char *)bp, 11, "%dm", Altitude); bp += cc; for (; tbp < bp; tbp++) { put_rx_char(*tbp); } cp += 1; // skip past '}' } } if (cp < cpE) put_rx_char(' '); for (; cp <= cpE; cp++) put_rx_char(*cp); } put_rx_char('\r'); } } static void do_put_rx_char(unsigned char *cp, size_t count) { int i, j; unsigned char c; bool isMicE = false; unsigned char *cpInfo; for (i = 8; i < 14; i++) { // src callsign is second in AX.25 frame c = rxbuf[i] >> 1; if (c != ' ') put_rx_char(c); // skip past padding (if any) } // bit 7 = command/response bit // bits 6,5 = 1 // bits 4-1 = src SSID // bit 0 = last callsign flag c = (rxbuf[14] & 0x7f) >> 1; if (c > 0x30) { put_rx_char('-'); if (c < 0x3a) put_rx_char(c); else { put_rx_char('1'); put_rx_char(c-0x0a); } } put_rx_char('>'); for (i = 1; i < 7; i++) { // dest callsign is first in AX.25 frame c = rxbuf[i] >> 1; if (c != ' ') put_rx_char(c); } c = (rxbuf[7] & 0x7f) >> 1; if (c > 0x30) { put_rx_char('-'); if (c < 0x3a) put_rx_char(c); else { put_rx_char('1'); put_rx_char(c-0x0a); } } j=8; if ((rxbuf[14] & 0x01) != 1) { // check last callsign flag do { put_rx_char(','); j += 7; for (i = j; i < (j+6); i++) { c = rxbuf[i] >> 1; if (c != ' ') put_rx_char(c); } c = (rxbuf[j+6] & 0x7f) >> 1; if (c > 0x30) { put_rx_char('-'); if (c < 0x3a) put_rx_char(c); else { put_rx_char('1'); put_rx_char(c-0x0a); } } } while ((rxbuf[j+6] & 0x01) != 1); if (rxbuf[j+6] & 0x80) // packet gets no more hops put_rx_char('*'); } if (debug::level < debug::VERBOSE_LEVEL) { // skip past CTRL and PID to INFO bytes when I_FRAME // puts buffer pointer in FCS when U_FRAME and S_FRAME // (save CTRL byte for possible MicE decoding) j += 7; c = rxbuf[j]; j += 2; } else { // show more frame info when .ge. VERBOSE debug level j += 7; put_rx_char(';'); c = rxbuf[j]; // CTRL present in all frames if ((c & 0x01) == 0) { // I_FRAME unsigned char p = rxbuf[j+1]; // PID present only in I_FRAME if (debug::level == debug::DEBUG_LEVEL) { put_rx_hex(c); put_rx_char(' '); put_rx_hex(p); put_rx_char(';'); } put_rx_const("I/"); put_rx_hex( (c & 0xE0) >> 5 ); // AX.25 v2.2 para 2.3.2.1 if (c & 0x10) put_rx_char('*'); // P/F bit else put_rx_char('.'); put_rx_hex( (c & 0x0E) >> 1 ); put_rx_char('/'); switch (p) { // AX.25 v2.2 para 2.2.4 case 0x01: put_rx_const("X.25PLP"); break; case 0x06: put_rx_const("C-TCPIP"); break; case 0x07: put_rx_const("U-TCPIP"); break; case 0x08: put_rx_const("FRAG"); break; case 0xC3: put_rx_const("TEXNET"); break; case 0xC4: put_rx_const("LQP"); break; case 0xCA: put_rx_const("ATALK"); break; case 0xCB: put_rx_const("ATALK-ARP"); break; case 0xCC: put_rx_const("ARPA-IP"); break; case 0xCD: put_rx_const("ARPA-AR"); break; case 0xCE: put_rx_const("FLEXNET"); break; case 0xCF: put_rx_const("NET/ROM"); break; case 0xF0: put_rx_const("NO-L3"); break; case 0xFF: put_rx_const("L3ESC="); put_rx_hex(rxbuf[++j]); break; default: if ((p & 0x30) == 0x10) put_rx_const("L3V1"); else if ((p & 0x30) == 0x20) put_rx_const("L3V2"); else put_rx_const("L3-RSVD"); put_rx_char('='); put_rx_hex(p); break; } } else if ((c & 0x03) == 0x01) { // S_FRAME if (debug::level == debug::DEBUG_LEVEL) { put_rx_hex(c); put_rx_char(';'); } put_rx_const("S/"); put_rx_hex( (c & 0xE0) >> 5 ); if (c & 0x10) put_rx_char('*'); else put_rx_char('.'); put_rx_char('/'); switch (c & 0x0C) { // AX.25 v2.2 para 2.3.4.2 case 0x00: put_rx_const("RR"); break; case 0x04: put_rx_const("RNR"); break; case 0x08: put_rx_const("REJ"); break; case 0x0C: default: put_rx_const("UNK"); break; } } else if ((c & 0x03) == 0x03) { // U_FRAME if (debug::level == debug::DEBUG_LEVEL) { put_rx_hex(c); put_rx_char(';'); } put_rx_char('U'); if (c & 0x10) put_rx_char('*'); else put_rx_char('.'); switch (c & 0xEC) { // AX.25 v2.2 para 2.3.4.3 case 0x00: put_rx_const("UI"); break; case 0x0E: put_rx_const("DM"); break; case 0x1E: put_rx_const("SABM"); break; case 0x20: put_rx_const("DISC"); break; case 0x30: put_rx_const("UA"); break; case 0x81: put_rx_const("FRMR"); break; default: put_rx_const("UNK"); break; } } j+=2; } put_rx_char(':'); // ptr to first info field char cpInfo = &rxbuf[j]; if ((c & 0x03) == 0x03 && (c & 0xEC) == 0x00 && (*cpInfo == '\'' || *cpInfo == '`' || *cpInfo == 0x1C || *cpInfo == 0x1D) && (cp - cpInfo) > 7) { /* Mic-E must have at least 8 info chars + Data Type ID char cp - (cpInfo - 1) > 8 ==> cp - cpInfo > 7 */ // this is very probably a Mic-E encoded packet isMicE = true; } // offset between last info char (not FCS) and bufhead //i = (cp - &rxbuf[0]); // (cp - &rxbuf[1]) + 1 ==> (cp - &rxbuf[0]) i = count; // (cp - &rxbuf[1]) + 1 ==> (cp - &rxbuf[0]) while (j < i) put_rx_char(rxbuf[j++]); if (*(cp-1) != '\r') put_rx_char('\r'); // only for packets not ending with // cp points to FCS, so (cp-X) is last info field char if ((progdefaults.PKT_expandMicE || debug::level >= debug::VERBOSE_LEVEL) && isMicE) expand_MicE(cpInfo, (*(cp-1) == '\r' ? cp-2 : cp-1)); // need to deal with posits having timestamps ('/' and '@' leading char) if (*cpInfo == '!' || *cpInfo == '=') { if ((progdefaults.PKT_expandCmp || debug::level >= debug::VERBOSE_LEVEL) && (*(cpInfo + 1) == '/' || *(cpInfo + 1) == '\\')) // compressed posit expand_Cmp(cpInfo+1); if (progdefaults.PKT_expandPHG || debug::level >= debug::VERBOSE_LEVEL) // look for PHG data expand_PHG(cpInfo); } if (*(cp-1) == '\r') put_rx_char('\r'); // for packets ending with : show it on-screen } extern bool PERFORM_CPS_TEST; static pthread_mutex_t decode_lock_mutex = PTHREAD_MUTEX_INITIALIZER; void ax25_decode(unsigned char *buffer, size_t count, bool pad, bool tx_flag) { guard_lock decode_lock(&decode_lock_mutex); if(!buffer && !count) return; if(count > MAXOCTETS) count = MAXOCTETS; memset(rxbuf, 0, sizeof(rxbuf)); if(pad) { rxbuf[0] = 0xfe; memcpy(&rxbuf[1], buffer, count); count++; } else { memcpy(rxbuf, buffer, count); } if(tx_flag) { mode = FTextBase::XMIT; } else { mode = FTextBase::RECV; } do_put_rx_char(&rxbuf[count], count); } fldigi-4.2.05/src/misc/locator.cxx0000664000175000017500000004200114532252172013674 00000000000000/** * \addtogroup utilities * @{ */ /** * \file src/locator.cxx * \brief locator and bearing conversion interface * \author Stephane Fillod and the Hamlib Group * \date 2000-2006 * * Hamlib Interface - locator, bearing, and conversion calls */ /* * Hamlib Interface - locator and bearing conversion calls * Copyright (c) 2001-2006 by Stephane Fillod * Copyright (c) 2003 by Nate Bargmann * Copyright (c) 2003 by Dave Hines * * $Id$ * * Code to determine bearing and range was taken from the Great Circle, * by S. R. Sampson, N5OWK. * Ref: "Air Navigation", Air Force Manual 51-40, 1 February 1987 * Ref: "ARRL Satellite Experimenters Handbook", August 1990 * * Code to calculate distance and azimuth between two Maidenhead locators, * taken from wwl, by IK0ZSN Mirko Caserta. * * New bearing code added by N0NB was found at: * http://williams.best.vwh.net/avform.htm#Crs * * * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA. * */ /*! \page hamlib Hamlib general purpose API * * Here are grouped some often used functions, like locator conversion * routines. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "configuration.h" #include "locator.h" namespace QRB { #define RADIAN (180.0 / M_PI) /* arc length for 1 degree, 60 Nautical Miles * 109.728 Kilometers * 68.182 statute miles * arc length for 1 radian, 6286.951 Km * 3437.746 Nm * 3906.41 Sm */ #define ARC_IN_KM 6372.5639 #define ARC_IN_NM 3484.5603 #define ARC_IN_SM 3959.7276 /* The following is contributed by Dave Hines M1CXW * * begin dph */ /* * These are the constants used when converting between Maidenhead grid * locators and longitude/latitude values. MAX_LOCATOR_PAIRS is the maximum * number of locator character pairs to convert. This number MUST NOT exceed * the number of pairs of values in loc_char_range[]. * Setting MAX_LOCATOR_PAIRS to 3 will convert the currently defined 6 * character locators. A value of 4 will convert the extended 8 character * locators described in section 3L of "The IARU region 1 VHF managers * handbook". Values of 5 and 6 will extent the format even more, to the * longest definition I have seen for locators, see * http://www.btinternet.com/~g8yoa/geog/non-ra.html * Beware that there seems to be no universally accepted standard for 10 & 12 * character locators. * * The ranges of characters which will be accepted by locator2longlat, and * generated by longlat2locator, are specified by the loc_char_range[] array. * This array may be changed without requiring any other code changes. * * For the fifth pair to range from aa to xx use: * const static int loc_char_range[] = { 18, 10, 24, 10, 24, 10 }; * * For the fifth pair to range from aa to yy use: * const static int loc_char_range[] = { 18, 10, 24, 10, 25, 10 }; * * MAX_LOCATOR_PAIRS now sets the limit locator2longlat() will convert and * sets the maximum length longlat2locator() will generate. Each function * properly handles any value from 1 to 6 so MAX_LOCATOR_PAIRS should be * left at 6. MIN_LOCATOR_PAIRS sets a floor on the shortest locator that * should be handled. -N0NB */ const static int loc_char_range[] = { 18, 10, 24, 10, 24, 10 }; #define MAX_LOCATOR_PAIRS 6 #define MIN_LOCATOR_PAIRS 1 /** * \brief Convert DMS to decimal degrees * \param degrees Degrees, whole degrees * \param minutes Minutes, whole minutes * \param seconds Seconds, decimal seconds * \param sw South or West * * Convert degree/minute/second angle to decimal degrees angle. * \a degrees >360, \a minutes > 60, and \a seconds > 60.0 are allowed, * but resulting angle won't be normalized. * * When the variable sw is passed a value of 1, the returned decimal * degrees value will be negative (south or west). When passed a * value of 0 the returned decimal degrees value will be positive * (north or east). * * \return The angle in decimal degrees. * * \sa dec2dms() */ double dms2dec(int degrees, int minutes, double seconds, int sw) { double st; if (degrees < 0) degrees = abs(degrees); if (minutes < 0) minutes = abs(minutes); if (seconds < 0) seconds = fabs(seconds); st = (double)degrees + (double)minutes / 60. + seconds / 3600.; if (sw == 1) return -st; else return st; } /** * \brief Convert D M.MMM notation to decimal degrees * \param degrees Degrees, whole degrees * \param minutes Minutes, decimal minutes * \param sw South or West * * Convert a degrees, decimal minutes notation common on * many GPS units to its decimal degrees value. * * \a degrees > 360, \a minutes > 60.0 are allowed, but * resulting angle won't be normalized. * * When the variable sw is passed a value of 1, the returned decimal * degrees value will be negative (south or west). When passed a * value of 0 the returned decimal degrees value will be positive * (north or east). * * \return The angle in decimal degrees. * * \sa dec2dmmm() */ double dmmm2dec(int degrees, double minutes, int sw) { double st; if (degrees < 0) degrees = abs(degrees); if (minutes < 0) minutes = fabs(minutes); st = (double)degrees + minutes / 60.; if (sw == 1) return -st; else return st; } /** * \brief Convert decimal degrees angle into DMS notation * \param dec Decimal degrees * \param degrees Pointer for the calculated whole Degrees * \param minutes Pointer for the calculated whole Minutes * \param seconds Pointer for the calculated decimal Seconds * \param sw Pointer for the calculated SW flag * * Convert decimal degrees angle into its degree/minute/second * notation. * * When \a dec < -180 or \a dec > 180, the angle will be normalized * within these limits and the sign set appropriately. * * Upon return dec2dms guarantees 0 >= \a degrees <= 180, * 0 >= \a minutes < 60, and 0.0 >= \a seconds < 60.0. * * When \a dec is < 0.0 \a sw will be set to 1. When \a dec is * >= 0.0 \a sw will be set to 0. This flag allows the application * to determine whether the DMS angle should be treated as negative * (south or west). * * \retval -QRB_EINVAL if any of the pointers are NULL. * \retval QRB_OK if conversion went OK. * * \sa dms2dec() */ int dec2dms(double dec, int *degrees, int *minutes, double *seconds, int *sw) { int deg, min; double st; /* bail if NULL pointers passed */ if (!degrees || !minutes || !seconds || !sw) return -QRB_EINVAL; /* reverse the sign if dec has a magnitude greater * than 180 and factor out multiples of 360. * e.g. when passed 270 st will be set to -90 * and when passed -270 st will be set to 90. If * passed 361 st will be set to 1, etc. If passed * a value > -180 || < 180, value will be unchanged. */ if (dec >= 0.0) st = fmod(dec + 180, 360) - 180; else st = fmod(dec - 180, 360) + 180; /* if after all of that st is negative, we want deg * to be negative as well except for 180 which we want * to be positive. */ if (st < 0.0 && st != -180) *sw = 1; else *sw = 0; /* work on st as a positive value to remove a * bug introduced by the effect of floor() when * passed a negative value. e.g. when passed * -96.8333 floor() returns -95! Also avoids * a rounding error introduced on negative values. */ st = fabs(st); deg = (int)floor(st); st = 60. * (st - (double)deg); min = (int)floor(st); st = 60. * (st - (double)min); *degrees = deg; *minutes = min; *seconds = st; return QRB_OK; } /** * \brief Convert a decimal angle into D M.MMM notation * \param dec Decimal degrees * \param degrees Pointer for the calculated whole Degrees * \param minutes Pointer for the calculated decimal Minutes * \param sw Pointer for the calculated SW flag * * Convert a decimal angle into its degree, decimal minute * notation common on many GPS units. * * When passed a value < -180 or > 180, the value will be normalized * within these limits and the sign set apropriately. * * Upon return dec2dmmm guarantees 0 >= \a degrees <= 180, * 0.0 >= \a minutes < 60.0. * * When \a dec is < 0.0 \a sw will be set to 1. When \a dec is * >= 0.0 \a sw will be set to 0. This flag allows the application * to determine whether the D M.MMM angle should be treated as negative * (south or west). * * \retval -QRB_EINVAL if any of the pointers are NULL. * \retval QRB_OK if conversion went OK. * * \sa dmmm2dec() */ int dec2dmmm(double dec, int *degrees, double *minutes, int *sw) { int r, min; double sec; /* bail if NULL pointers passed */ if (!degrees || !minutes || !sw) return -QRB_EINVAL; r = dec2dms(dec, degrees, &min, &sec, sw); if (r != QRB_OK) return r; *minutes = (double)min + sec / 60; return QRB_OK; } /** * \brief Convert Maidenhead grid locator to Longitude/Latitude * \param longitude Pointer for the calculated Longitude * \param latitude Pointer for the calculated Latitude * \param locator The Maidenhead grid locator--2 through 12 char + nul string * * Convert Maidenhead grid locator to Longitude/Latitude (decimal degrees). * The locator should be in 2 through 12 chars long format. * \a locator2longlat is case insensitive, however it checks for * locator validity. * * Decimal long/lat is computed to center of grid square, i.e. given * EM19 will return coordinates equivalent to the southwest corner * of EM19mm. * * \retval -QRB_EINVAL if locator exceeds RR99xx99xx99 or exceeds length * limit--currently 1 to 6 lon/lat pairs. * \retval QRB_OK if conversion went OK. * * \bug The fifth pair ranges from aa to xx, there is another convention * that ranges from aa to yy. At some point both conventions should be * supported. * * \sa longlat2locator() */ /* begin dph */ int locator2longlat(double *longitude, double *latitude, const char *locator) { int x_or_y, paircount; int locvalue, pair; int divisions; double xy[2], ordinate; /* bail if NULL pointers passed */ if (!longitude || !latitude) return -QRB_EINVAL; paircount = strlen(locator) / 2; /* verify paircount is within limits */ if (paircount > MAX_LOCATOR_PAIRS) paircount = MAX_LOCATOR_PAIRS; else if (paircount < MIN_LOCATOR_PAIRS) return -QRB_EINVAL; /* For x(=longitude) and y(=latitude) */ for (x_or_y = 0; x_or_y < 2; ++x_or_y) { ordinate = -90.0; divisions = 1; for (pair = 0; pair < paircount; ++pair) { locvalue = locator[pair*2 + x_or_y]; /* Value of digit or letter */ locvalue -= (loc_char_range[pair] == 10) ? '0' : (isupper(locvalue)) ? 'A' : 'a'; /* Check range for non-letter/digit or out of range */ if ((locvalue < 0) || (locvalue >= loc_char_range[pair])) return -QRB_EINVAL; divisions *= loc_char_range[pair]; ordinate += locvalue * 180.0 / divisions; } /* Center ordinate in the Maidenhead "square" or "subsquare" */ ordinate += 90.0 / divisions; xy[x_or_y] = ordinate; } *longitude = xy[0] * 2.0; *latitude = xy[1]; return QRB_OK; } /* end dph */ /** * \brief Convert longitude/latitude to Maidenhead grid locator * \param longitude Longitude, decimal degrees * \param latitude Latitude, decimal degrees * \param locator Pointer for the Maidenhead Locator * \param pair_count Precision expressed as lon/lat pairs in the locator * * Convert longitude/latitude (decimal degrees) to Maidenhead grid locator. * \a locator must point to an array at least \a pair_count * 2 char + '\\0'. * * \retval -QRB_EINVAL if \a locator is NULL or \a pair_count exceeds * length limit. Currently 1 to 6 lon/lat pairs. * \retval QRB_OK if conversion went OK. * * \bug \a locator is not tested for overflow. * \bug The fifth pair ranges from aa to yy, there is another convention * that ranges from aa to xx. At some point both conventions should be * supported. * * \sa locator2longlat() */ /* begin dph */ int longlat2locator(double longitude, double latitude, char *locator, int pair_count) { int x_or_y, pair, locvalue, divisions; double square_size, ordinate; if (!locator) return -QRB_EINVAL; if (pair_count < MIN_LOCATOR_PAIRS || pair_count > MAX_LOCATOR_PAIRS) return -QRB_EINVAL; for (x_or_y = 0; x_or_y < 2; ++x_or_y) { ordinate = (x_or_y == 0) ? longitude / 2.0 : latitude; divisions = 1; /* The 1e-6 here guards against floating point rounding errors */ ordinate = fmod(ordinate + 270.000001, 180.0); for (pair = 0; pair < pair_count; ++pair) { divisions *= loc_char_range[pair]; square_size = 180.0 / divisions; locvalue = (int) (ordinate / square_size); ordinate -= square_size * locvalue; locvalue += (loc_char_range[pair] == 10) ? '0':'A'; locator[pair * 2 + x_or_y] = locvalue; } } locator[pair_count * 2] = '\0'; return QRB_OK; } /* end dph */ /** * \brief Calculate the distance and bearing between two points. * \param lon1 The local Longitude, decimal degrees * \param lat1 The local Latitude, decimal degrees * \param lon2 The remote Longitude, decimal degrees * \param lat2 The remote Latitude, decimal degrees * \param distance Pointer for the distance, km * \param azimuth Pointer for the bearing, decimal degrees * * Calculate the QRB between \a lon1, \a lat1 and \a lon2, \a lat2. * * This version will calculate the QRB to a precision sufficient * for 12 character locators. Antipodal points, which are easily * calculated, are considered equidistant and the bearing is * simply resolved to be true north (0.0). * * \retval -QRB_EINVAL if NULL pointer passed or lat and lon values * exceed -90 to 90 or -180 to 180. * \retval QRB_OK if calculations are successful. * * \return The distance in kilometers and azimuth in decimal degrees * for the short path are stored in \a distance and \a azimuth. * * \sa distance_long_path(), azimuth_long_path() */ int qrb(double lon1, double lat1, double lon2, double lat2, double *distance, double *azimuth) { double delta_long, tmp, arc, az; /* bail if NULL pointers passed */ if (!distance || !azimuth) return -QRB_EINVAL; if ((lat1 > 90.0 || lat1 < -90.0) || (lat2 > 90.0 || lat2 < -90.0)) return -QRB_EINVAL; if ((lon1 > 180.0 || lon1 < -180.0) || (lon2 > 180.0 || lon2 < -180.0)) return -QRB_EINVAL; /* Prevent ACOS() Domain Error */ if (lat1 == 90.0) lat1 = 89.999999999; else if (lat1 == -90.0) lat1 = -89.999999999; if (lat2 == 90.0) lat2 = 89.999999999; else if (lat2 == -90.0) lat2 = -89.999999999; /* Convert variables to Radians */ lat1 /= RADIAN; lon1 /= RADIAN; lat2 /= RADIAN; lon2 /= RADIAN; delta_long = lon2 - lon1; tmp = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(delta_long); if (tmp > .999999999999999) { /* Station points coincide, use an Omni! */ *distance = 0.0; *azimuth = 0.0; return QRB_OK; } if (tmp < -.999999) { /* * points are antipodal, it's straight down. * Station is equal distance in all Azimuths. * So take 180 Degrees of arc times 60 nm, * and you get 10800 nm, or whatever units... */ *distance = M_PI * ARC_IN_KM; *azimuth = 0.0; return QRB_OK; } arc = acos(tmp); /* * One degree of arc is 60 Nautical miles * at the surface of the earth, 111.2 km, or 69.1 sm * This method is easier than the one in the handbook */ *distance = arc * ARC_IN_KM; /* Short Path */ /* Change to azimuth computation by Dave Freese, W1HKJ */ az = RADIAN * atan2(sin(lon2 - lon1) * cos(lat2), (cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1))); az = fmod(360.0 + az, 360.0); if (az < 0.0) az += 360.0; else if (az >= 360.0) az -= 360.0; *azimuth = floor(az + 0.5); return QRB_OK; } /** * \brief Calculate the long path distance between two points. * \param distance The shortpath distance * * Calculate the long path (respective of the short path) * of a given distance. * * \return the distance in kilometers for the opposite path. * * \sa qrb() */ double distance_long_path(double distance) { return (ARC_IN_KM * 2.0 * M_PI) - distance; } /** * \brief Calculate the long path bearing between two points. * \param azimuth The shortpath bearing * * Calculate the long path (respective of the short path) * of a given bearing. * * \return the azimuth in decimal degrees for the opposite path. * * \sa qrb() */ double azimuth_long_path(double azimuth) { return azimuth + (azimuth <= 180.0 ? 180.0 : -180.0); } } // namespace QRB /*! @} */ fldigi-4.2.05/src/misc/threads.cxx0000664000175000017500000000632714611711171013673 00000000000000// ---------------------------------------------------------------------------- // threads.cxx // // Copyright (C) 2007-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include "threads.h" THREAD_ID_TYPE thread_id_; #include "timeops.h" #ifndef __WIN32__ #if !HAVE_SEM_TIMEDWAIT # include # include # include # include int sem_timedwait(sem_t* sem, const struct timespec* abs_timeout) { int r; for (;;) { r = sem_trywait(sem); if (r == 0 || (r == -1 && errno != EAGAIN)) return r; if (abs_timeout->tv_nsec < 0 || abs_timeout->tv_nsec >= 1000000000L) { errno = EINVAL; return -1; } struct timespec now; clock_gettime(CLOCK_REALTIME, &now); if (now == *abs_timeout || now > *abs_timeout) { errno = ETIMEDOUT; return -1; } usleep(100); } } #endif // !HAVE_SEM_TIMEDWAIT #endif int sem_timedwait_rel(sem_t* sem, double rel_timeout) { struct timespec t; clock_gettime(CLOCK_REALTIME, &t); t = t + rel_timeout; return sem_timedwait(sem, &t); } int pthread_cond_timedwait_rel(pthread_cond_t* cond, pthread_mutex_t* mutex, double rel_timeout) { struct timespec t; clock_gettime(CLOCK_REALTIME, &t); t = t + rel_timeout; return pthread_cond_timedwait(cond, mutex, &t); } #ifndef NDEBUG bool thread_in_list(int id, const int* list) { while (*list != INVALID_TID) if (id == *list++) return true; return false; } #endif #ifdef __linux__ # ifndef _GNU_SOURCE # define _GNU_SOURCE # endif # include # include # include "debug.h" void linux_log_tid(void) { LOG_DEBUG(PACKAGE_TARNAME " thread %" PRIdPTR " is LWP %ld", GET_THREAD_ID(), syscall(SYS_gettid)); } #endif // Synchronization objects. guard_lock::guard_lock(pthread_mutex_t* m) : mutex(m) { pthread_mutex_lock(mutex); } guard_lock::~guard_lock(void) { pthread_mutex_unlock(mutex); } syncobj::syncobj() { pthread_mutex_init( & m_mutex, NULL ); pthread_cond_init( & m_cond, NULL ); } syncobj::~syncobj() { pthread_mutex_destroy( & m_mutex ); pthread_cond_destroy( & m_cond ); } void syncobj::signal() { int rc = pthread_cond_signal( &m_cond ); if( rc ) { throw std::runtime_error(strerror(rc)); } } bool syncobj::wait( double seconds ) { int rc = pthread_cond_timedwait_rel( &m_cond, &m_mutex, seconds ); switch( rc ) { case 0 : return true ; default : throw std::runtime_error(strerror(rc)); case ETIMEDOUT: return false ; } } fldigi-4.2.05/src/misc/kiss_io.cxx0000664000175000017500000032123414611711171013676 00000000000000// ---------------------------------------------------------------------------- // kiss_io.cxx // // support for KISS interface // // Copyright (c) 2014, 2016 // Robert Stiles, KK5VD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #if !defined(__MINGW32__) && !defined(__APPLE__) # include # include #endif #include #include "config.h" #ifdef __MINGW32__ # include "compat.h" #endif #include "main.h" #include "configuration.h" #include "fl_digi.h" #include "trx.h" #include "kiss_io.h" #include "globals.h" #include "threads.h" #include "socket.h" #include "debug.h" #include "qrunner.h" #include "data_io.h" #include "status.h" #include "psm/psm.h" #include #include #include #include "confdialog.h" #include "configuration.h" #include "status.h" LOG_FILE_SOURCE(debug::LOG_KISSCONTROL); //#define EXTENED_DEBUG_INFO //#undef EXTENED_DEBUG_INFO //====================================================================== // Socket KISS i/o used on all platforms //====================================================================== #define KISSLOOP_TIMING 100 // msec #define KISSLOOP_FRACTION 10 // msec static std::string errstring; // ===================================================================== static pthread_t kiss_thread; static pthread_t kiss_rx_socket_thread; static pthread_t kiss_watchdog_thread; static pthread_cond_t kiss_watchdog_cond = PTHREAD_COND_INITIALIZER; static pthread_mutex_t from_host_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t from_radio_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t kiss_bc_frame_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t kiss_frame_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t to_host_arq_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t to_host_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t to_radio_mutex = PTHREAD_MUTEX_INITIALIZER; //static pthread_mutex_t external_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t restart_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t kiss_encode_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t kiss_loop_exit_mutex = PTHREAD_MUTEX_INITIALIZER; bool kiss_enabled = false; bool kiss_exit = false; bool kiss_rx_exit = false; bool allow_kiss_socket_io = false; bool kiss_loop_running = false; bool kiss_rx_loop_running = false; bool kiss_watchdog_exit = false; bool kiss_watchdog_running = false; bool kiss_tcp_ip_connected = false; bool tcpip_reset_flag = false; static bool smack_crc_enabled = false; static int crc_mode = CRC16_CCITT; static std::string default_kiss_modem = "BPSK250"; static std::string kiss_modem = ""; static unsigned int transmit_buffer_flush_timeout = 0; unsigned int duplex = KISS_HALF_DUPLEX; // Default half duplex unsigned int kiss_port_no = 0; // Default is 0 /// Any access to shared variables must be protected. static std::string from_host = ""; static std::string from_radio = ""; static std::string from_radio_parsed = ""; static std::string kiss_bc_frame = ""; static std::string kiss_frame = ""; static std::string kiss_ip_address = ""; static std::string kiss_ip_io_port = ""; static std::string kiss_ip_out_port = ""; static std::string kiss_one_frame = ""; static std::string to_arq_host = ""; static std::string to_host = ""; static std::string to_radio = ""; static std::string translated_frame = ""; static int pText = 0; bool bcast_tx_buffer_empty_flag = false; bool kiss_bcast_rsid_reception = false; bool kiss_bcast_trx_toggle = false; bool kiss_text_available = false; static bool kiss_reset_flag = false; static int retry_count = KISS_CONNECT_RETRY_COUNT; #define HISTO_COUNT 256 #define HISTO_THRESH_HOLD 48 // In seconds #define HISTO_RESET_TX_TIME 3 static int histogram[HISTO_COUNT]; static bool init_hist_flag = true; // static double threshold = 5.0; // time_t inhibit_tx_seconds = 0; time_t temp_disable_tx_inhibit = 0; time_t temp_disable_tx_duration = DISABLE_TX_INHIBIT_DURATION; static int kpsql_pl = 0; static double kpsql_threshold = 0.0; extern int IMAGE_WIDTH; Socket *kiss_socket = 0; int data_io_enabled = DISABLED_IO; int data_io_type = DATA_IO_UDP; //program_start_time bool program_started_flag = 0; extern const struct mode_info_t mode_info[]; extern void abort_tx(); // Storage for modem list allowed for KISS use. static std::vector availabe_kiss_modems; static int kiss_raw_enabled = KISS_RAW_DISABLED; std::string host_name_string; inline std::string uppercase_string(std::string str); inline void set_tx_timeout(void); size_t hdlc_decode(char *src, size_t src_size, char **dst); size_t hdlc_encode(char *src, size_t src_size, char **dst); size_t kiss_decode(char *src, size_t src_size, char **dst); size_t kiss_encode(char *src, size_t src_size, char **dst); static bool kiss_queue_frame(KISS_QUEUE_FRAME * frame, std::string cmd); static int calc_ccitt_crc(char *buf, int n); static int calc_fcs_crc(char *buf, int n); static int calc_xor_crc(char *buf, int n); static KISS_QUEUE_FRAME * encap_kiss_frame(std::string data, int frame_type, int port); static KISS_QUEUE_FRAME *encap_kiss_frame(char *buffer, size_t buffer_size, int frame_type, int port); static size_t decap_hdlc_frame(char *buffer, size_t data_count); static size_t encap_hdlc_frame(char *buffer, size_t data_count); static void *kiss_loop(void *args); static void *ReadFromHostSocket(void *args); static void *tcpip_watchdog(void *args); static void exec_hardware_command(std::string cmd, std::string arg); static void host_name(char *arg); static void kiss_tcp_disconnect(char *arg); static void parse_hardware_frame(std::string frame); static void parse_kiss_frame(std::string frame_segment); static void ReadFromHostBuffered(void); static void reply_active_modem_bw(char * arg); static void reply_active_modem(char * arg); static void reply_busy_channel_duration(char * arg); static void reply_busy_channel_on_off(char * arg); static void reply_busy_state(char * arg); static void reply_crc_mode(char *arg); static void reply_csma_mode(char *arg); static void reply_fldigi_stat(char *arg); static void reply_kiss_raw_mode(char * arg); static void reply_kpsql_fraction_gain(char *arg); static void reply_kpsql_on_off(char * arg); static void reply_kpsql_pwr_level(char * arg); static void reply_kpsql_squelch_level(char * arg); static void reply_modem_list(char * arg); static void reply_psm_on_off(char * arg); static void reply_psm_pwr_level(char * arg); static void reply_psm_squelch_level(char * arg); static void reply_rsid_bc_mode(char * arg); static void reply_rsid_mode_state(char * arg); static void reply_rsid_rx_state(char * arg); static void reply_rsid_tx_state(char * arg); static void reply_sql_level(char * arg); static void reply_sql_on_off(char * arg); static void reply_sql_pwr_level(char * arg); static void reply_tnc_name(char * arg); static void reply_trx_state(char * arg); static void reply_trxs_bc_mode(char * arg); static void reply_tx_buffer_count(char * arg); static void reply_txbe_bc_mode(char * arg); static void reply_waterfall_bw(char * arg); static void reply_wf_freq_pos(char * arg); static void send_disconnect_msg(void); static void set_busy_channel_duration(char * arg); static void set_busy_channel_inhibit(char *arg); static void set_busy_channel_on_off(char * arg); static void set_button(Fl_Button * button, bool value); static void set_counter(Fl_Counter * counter, int value); static void set_crc_mode(char * arg); static void set_csma_mode(char * arg); static void set_default_kiss_modem(void); static void set_kiss_modem(char * arg); static void set_kiss_raw_mode(char * arg); static void set_kpsql_on_off(char * arg); static void set_kpsql_squelch_level(char * arg); static void set_psm_fraction_gain(char *arg); static void set_psm_on_off(char * arg); static void set_psm_squelch_level(char * arg); static void set_reply_tx_lock(char * arg); static void set_rsid_bc_mode(char * arg); static void set_rsid_mode(char *arg); static void set_rsid_rx(char *arg); static void set_rsid_tx(char * arg); static void set_sql_level(char * arg); static void set_sql_on_off(char * arg); static void set_trxs_bc_mode(char * arg); static void set_txbe_bc_mode(char * arg); static void set_wf_cursor_pos(char * arg); static void WriteToHostARQBuffered(void); static void WriteToHostBuffered(const char *data, size_t size); static void WriteToRadioBuffered(const char *data, size_t size); std::string kiss_decode(std::string frame); std::string kiss_encode(std::string frame); std::string unencap_kiss_frame(char *buffer, size_t buffer_size, int *frame_type, int *kiss_port_no); std::string unencap_kiss_frame(std::string package, int *frame_type, int *kiss_port_no); void kiss_main_thread_close(void *ptr); void kiss_main_thread_retry_open(void *ptr); void kiss_reset_buffers(void); void kiss_reset(void); void ReadFromRadioBuffered(void); void WriteKISS(const char *data, size_t size); void WriteKISS(const char *data); void WriteKISS(const char data); void WriteKISS(std::string data); void WriteToHostBCastFramesBuffered(void); void WriteToHostSocket(void); /********************************************************************************** * Not all modems are created equal. Translate! * There must be at least HDLC_CNT_OFFSET count offset (+/-, but still in range) * between real values and translated values. **********************************************************************************/ static int not_allowed[256] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 16 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 48 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 64 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 96 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // 128 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 240 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 // 256 }; /********************************************************************************** * KISS hardware frame commands strings and calling functions **********************************************************************************/ EXEC_HARDWARE_CMD_MATCH exec_match[] = { { (char *) "BCHN", set_busy_channel_on_off }, { (char *) "BCHNS", set_busy_channel_duration }, { (char *) "BUSY", reply_busy_state }, { (char *) "CSMA", set_csma_mode }, { (char *) "DISC", kiss_tcp_disconnect }, { (char *) "FLSTAT", reply_fldigi_stat }, { (char *) "HOST", host_name }, { (char *) "IBCHN", set_busy_channel_inhibit }, { (char *) "KISSCRCM", set_crc_mode }, { (char *) "KISSRAW", set_kiss_raw_mode }, { (char *) "KPSATT", set_psm_fraction_gain }, // Depreciated { (char *) "PSMATT", set_psm_fraction_gain }, { (char *) "PSM", set_psm_on_off }, { (char *) "PSMP", reply_psm_pwr_level }, { (char *) "PSMS", set_psm_squelch_level }, { (char *) "KPSQL", set_kpsql_on_off }, // Depreciated { (char *) "KPSQLP", reply_kpsql_pwr_level }, // Depreciated { (char *) "KPSQLS", set_kpsql_squelch_level }, // Depreciated { (char *) "MODEM", set_kiss_modem }, { (char *) "MODEMBW", reply_active_modem_bw }, { (char *) "MODEML", reply_modem_list }, { (char *) "RSIDBCAST", set_rsid_bc_mode }, { (char *) "RSIDM", set_rsid_mode }, { (char *) "RSIDRX", set_rsid_rx }, { (char *) "RSIDTX", set_rsid_tx }, { (char *) "SQL", set_sql_on_off }, { (char *) "SQLP", reply_sql_pwr_level }, { (char *) "SQLS", set_sql_level }, { (char *) "TNC", reply_tnc_name }, { (char *) "TRXS", reply_trx_state }, { (char *) "TRXSBCAST", set_trxs_bc_mode }, { (char *) "TXBEBCAST", set_txbe_bc_mode }, { (char *) "TXBUF", reply_tx_buffer_count }, { (char *) "TXLOCK", set_reply_tx_lock }, { (char *) "WFBW", reply_waterfall_bw }, { (char *) "WFF", set_wf_cursor_pos }, { (char *) 0, 0 } }; #ifdef USE_NOCTRL static std::string noctrl(std::string src); static const char *asc[128] = { "", "", "", "", "", "", "", "", "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "" }; /********************************************************************************** * **********************************************************************************/ static std::string noctrl(std::string src) { static std::string retstr; retstr.clear(); char hexstr[10]; int c; for (size_t i = 0; i < src.length(); i++) { c = src[i]; if ( c > 0 && c < 128) retstr.append(asc[c]); else { snprintf(hexstr, sizeof(hexstr), "<%0X>", c & 0xFF); retstr.append(hexstr); } } return retstr; } #endif // USE_NOCTRL /********************************************************************************** * For SMACK CRC validation **********************************************************************************/ static int calc_ccitt_crc(char *buf, int n) { static int crc_table[] = { 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0xcc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040 }; int crc; crc = 0; while (--n >= 0) crc = ((crc >> 8) & 0xff) ^ crc_table[(crc ^ *buf++) & 0xff]; return crc; } /********************************************************************************** * For SMACK CRC validation (BPQ XOR CRC implimentation). **********************************************************************************/ static int calc_xor_crc(char *buf, int n) { int crc; crc = 0; while (--n >= 0) crc ^= (*buf++ & 0xff); return crc; } /********************************************************************************** * For FCS CRC. **********************************************************************************/ static int calc_fcs_crc(char *buf, int n) { static int fcstab[256] = { 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 }; int crc; crc = 0xFFFF; while (--n >= 0) crc = ((crc >> 8) & 0xff) ^ fcstab[(crc ^ *buf++) & 0xff]; return crc; } /********************************************************************************** * **********************************************************************************/ static void set_button(Fl_Button * button, bool value) { button->value(value); button->do_callback(); } /********************************************************************************** * **********************************************************************************/ static void set_counter(Fl_Counter * counter, int value) { counter->value(value); counter->do_callback(); } /********************************************************************************** * **********************************************************************************/ static void set_slider2(Fl_Slider2 * sider, int value) { sider->value(value); sider->do_callback(); } /********************************************************************************** * **********************************************************************************/ bool valid_kiss_modem(std::string _modem) { if(_modem.empty()) return false; int index = 0; int count = availabe_kiss_modems.size(); std::string _tmp_str; if(count < 1) { for(index = 0; index < NUM_MODES; index++) { if(mode_info[index].iface_io & KISS_IO) { _tmp_str = uppercase_string(mode_info[index].sname); availabe_kiss_modems.push_back(_tmp_str); } } count = availabe_kiss_modems.size(); } std::string cmp_str = ""; index = 0; _modem = uppercase_string(_modem); while(index < count) { cmp_str = availabe_kiss_modems[index]; if(cmp_str.empty()) return false; if(_modem.compare(cmp_str) == 0) { return true; } index++; } return false; } /********************************************************************************** * **********************************************************************************/ void check_kiss_modem(void) { int mode = active_modem->get_mode(); std::string modem_name; modem_name.assign(mode_info[mode].sname); bool valid = valid_kiss_modem(modem_name); if(!valid) set_default_kiss_modem(); } /********************************************************************************** * **********************************************************************************/ static void set_default_kiss_modem(void) { set_kiss_modem((char *) default_kiss_modem.c_str()); } /********************************************************************************** * **********************************************************************************/ inline std::string uppercase_string(std::string str) { int index = 0; int count = str.size(); std::string ret_str = ""; if(!count) return ret_str; ret_str.reserve(count + 1); ret_str.clear(); for(index = 0; index < count; index++) ret_str += toupper(str[index]); return ret_str; } /********************************************************************************** * MODEM: **********************************************************************************/ static void set_kiss_modem(char * arg) { if(!arg) return; std::string _modem = ""; std::string _cmp_modem = ""; _modem.assign(arg); if(_modem.empty()) { return reply_active_modem(arg); } bool valid = valid_kiss_modem(_modem); _modem = uppercase_string(_modem); if(valid) { for (size_t i = 0; i < NUM_MODES; i++) { _cmp_modem = uppercase_string(mode_info[i].sname); if (_modem == _cmp_modem) { REQ_SYNC(init_modem_sync, i, 0); kiss_modem.assign(_modem); break; } } return; } if(!valid) LOG_INFO("Modem %s invalid for KISS use. Must support 8bit.", _modem.c_str()); return; } /********************************************************************************** * DISC: Disconnect TCP/IP connection. **********************************************************************************/ static void kiss_tcp_disconnect(char *arg) { if(kiss_socket && data_io_type == DATA_IO_TCP) { Fl::awake(kiss_main_thread_close, (void *) 0); } } /********************************************************************************** * Send a Disconnect message to the HOST called from the main thread only. **********************************************************************************/ static void send_disconnect_msg(void) { if(kiss_socket && data_io_type == DATA_IO_TCP) { std::string package = ""; std::string cmd = "DISC:"; package.assign(cmd); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } } /********************************************************************************** * FLSTAT:, **********************************************************************************/ static void reply_fldigi_stat(char *arg) { std::string package = ""; std::string cmd = "FLSTAT:"; unsigned int hours = 0; unsigned int mins = 0; unsigned int secs = 0; time_t current_time = time(0); time_t diff_time = 0; char buffer[64]; package.assign(cmd); if(program_started_flag) { package.append("OK"); } else { package.append("INIT"); program_started_flag = true; } if(program_start_time == 0) program_start_time = time(0); diff_time = current_time - program_start_time; hours = (unsigned int) (diff_time / 3600); diff_time -= (time_t) (hours * 3600); mins = (unsigned int)(diff_time / 60); diff_time -= (time_t) (mins * 60); secs = (unsigned int) diff_time; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, ",%02u:%02u:%02u", hours, mins, secs); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * CSMA: **********************************************************************************/ static void set_csma_mode(char * arg) { if(!arg) return; std::string rsid_tx_state = ""; rsid_tx_state.assign(arg); if(rsid_tx_state.empty()) return reply_csma_mode(arg); std::string state = uppercase_string(rsid_tx_state); if(state.find("ON") != std::string::npos) { REQ(set_button, btnEnable_csma, 1); return; } if(state.find("OFF") != std::string::npos) { REQ(set_button, btnEnable_csma, 0); return; } } /********************************************************************************** * CSMA: **********************************************************************************/ static void reply_csma_mode(char *arg) { std::string package = ""; std::string cmd = "CSMA:"; package.assign(cmd); if(progdefaults.csma_enabled) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * IBCHN:I // Inhibit busy channel temporarily. 'I' (character) * IBCHN: // Set Inhibit busy channel duration to N seconds * IBCHN:0 // Resets temporary duration to default setting (5). * IBCHN: // Returns IBCHN: **********************************************************************************/ static void set_busy_channel_inhibit(char *arg) { std::string argstr = ""; int temp = 0; if(arg) { argstr.assign(arg); if(!argstr.empty()) { if(argstr[0] == 'I' || argstr[0] == 'i') { if(progdefaults.enableBusyChannel && inhibit_tx_seconds) { temp_disable_tx_inhibit = time(0) + temp_disable_tx_duration; } } else if(isdigit(argstr[0])) { sscanf(arg, "%d", &temp); if(temp == 0) temp_disable_tx_duration = DISABLE_TX_INHIBIT_DURATION; else temp_disable_tx_duration = temp; } return; } } std::string cmd = "IBCHN:"; std::string package = ""; char buff[32]; package.assign(cmd); memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff)-1, "%lu", temp_disable_tx_duration); package.append(buff); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KPSATT: // Set the fractional ratio gain value (1/value) **********************************************************************************/ static void set_psm_fraction_gain(char *arg) { if(!arg) return; std::string args; args.assign(arg); if(args.empty()) return reply_kpsql_fraction_gain(arg); unsigned int value = 0; sscanf(args.c_str(), "%u", &value); update_kpsql_fractional_gain(value); REQ(set_counter, cntKPSQLAttenuation, progdefaults.kpsql_attenuation); } /********************************************************************************** * KPSQLG: // Return the fractional ratio gain value (1/value) **********************************************************************************/ static void reply_kpsql_fraction_gain(char *arg) { std::string package = ""; std::string cmd = "KPSATT:"; char buffer[128]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", progdefaults.kpsql_attenuation); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * WFF: Move TXRX cursor to Frequency. **********************************************************************************/ static void set_wf_cursor_pos(char * arg) { if(!arg) return; std::string wf_cursor_pos = ""; wf_cursor_pos.assign(arg); if(wf_cursor_pos.empty()) return reply_wf_freq_pos(arg); int cursor = 0; int mode_bw = active_modem->get_bandwidth(); sscanf(wf_cursor_pos.c_str(), "%d", &cursor); mode_bw >>= 1; if((cursor - mode_bw) < 0) cursor = mode_bw; if((cursor + mode_bw) >= IMAGE_WIDTH) cursor = IMAGE_WIDTH - mode_bw; active_modem->set_freq((double) cursor); } /********************************************************************************** * RSIDTX: **********************************************************************************/ static void set_rsid_tx(char * arg) { if(!arg) return; std::string rsid_tx_state = ""; rsid_tx_state.assign(arg); if(rsid_tx_state.empty()) return reply_rsid_tx_state(arg); std::string state = uppercase_string(rsid_tx_state); if(state.find("ON") != std::string::npos) { REQ(set_button, btnTxRSID, 1); return; } if(state.find("OFF") != std::string::npos) { REQ(set_button, btnTxRSID, 0); return; } } /********************************************************************************** * RSIDRX: **********************************************************************************/ static void set_rsid_rx(char *arg) { if(!arg) return; std::string rsid_rx_state = ""; rsid_rx_state.assign(arg); if(rsid_rx_state.empty()) return reply_rsid_rx_state(arg); std::string state = uppercase_string(rsid_rx_state); if(state.find("ON") != std::string::npos) { REQ(set_button, btnRSID, 1); return; } if(state.find("OFF") != std::string::npos) { REQ(set_button, btnRSID, 0); return; } } /********************************************************************************** * RSIDM: **********************************************************************************/ static void set_rsid_mode(char *arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_rsid_mode_state(arg); std::string state = uppercase_string(strarg); if(state.find("BANDPASS") != std::string::npos) { REQ(set_button, chkRSidWideSearch, 1); } if(state.find("MODEM") != std::string::npos) { REQ(set_button, chkRSidWideSearch, 0); } if(state.find("NOTIFY") != std::string::npos) { REQ(set_button, chkRSidNotifyOnly, 1); } if(state.find("ACTIVE") != std::string::npos) { REQ(set_button, chkRSidNotifyOnly, 0); } } /********************************************************************************** * RSIDBCAST: **********************************************************************************/ static void set_rsid_bc_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_rsid_bc_mode(arg); std::string state = uppercase_string(strarg); if(state.find("ON") != std::string::npos) { kiss_bcast_rsid_reception = true; return; } if(state.find("OFF") != std::string::npos) { kiss_bcast_rsid_reception = false; return; } } /********************************************************************************** * RSIDBCAST: **********************************************************************************/ static void reply_rsid_bc_mode(char * arg) { std::string package = ""; std::string cmd = "RSIDBCAST:"; package.assign(cmd); if(kiss_bcast_rsid_reception) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TRXSBCAST: **********************************************************************************/ static void set_trxs_bc_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_trxs_bc_mode(arg); std::string state = uppercase_string(strarg); if(state.find("ON") != std::string::npos) { kiss_bcast_trx_toggle = true; return; } if(state.find("OFF") != std::string::npos) { kiss_bcast_trx_toggle = false; return; } } /********************************************************************************** * TRXSBCAST: **********************************************************************************/ static void reply_trxs_bc_mode(char * arg) { std::string package = ""; std::string cmd = "TRXSBCAST:"; package.assign(cmd); if(kiss_bcast_trx_toggle) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * SET TXBEBCAST: **********************************************************************************/ static void set_txbe_bc_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_txbe_bc_mode(arg); std::string state = uppercase_string(strarg); if(state.find("ON") != std::string::npos) { bcast_tx_buffer_empty_flag = true; return; } if(state.find("OFF") != std::string::npos) { bcast_tx_buffer_empty_flag = false; return; } } /********************************************************************************** * REPLY TXBEBCAST: **********************************************************************************/ static void reply_txbe_bc_mode(char * arg) { std::string package = ""; std::string cmd = "TXBEBCAST:"; package.assign(cmd); if(bcast_tx_buffer_empty_flag) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TNC: FLDIGI returns TNC:FLDIGI **********************************************************************************/ static void reply_tnc_name(char * arg) { std::string package = ""; std::string cmd = "TNC:"; package.assign(cmd).append("FLDIGI ").append(PACKAGE_VERSION); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TRXS: FLDIGI returns TRXSQ: **********************************************************************************/ static void reply_trx_state(char * arg) { std::string package = ""; std::string cmd = "TRXS:"; package.assign(cmd); if((trx_state == STATE_TX) || (trx_state == STATE_TUNE)) package.append("TX"); else package.append("RX"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * RSIDRX: FLDIGI returns RSIDRXQ: **********************************************************************************/ static void reply_rsid_rx_state(char * arg) { std::string package = ""; std::string cmd = "RSIDRX:"; package.assign(cmd); if(progdefaults.rsid) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * RSIDTX: FLDIGI returns RSIDTXQ: **********************************************************************************/ static void reply_rsid_tx_state(char * arg) { std::string package = ""; std::string cmd = "RSIDTX:"; package.assign(cmd); if(progdefaults.TransmitRSid) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TXLOCK: FLDIGI TXLOCK: or without arg return lock state. **********************************************************************************/ static void set_reply_tx_lock(char * arg) { if(!arg) return; std::string strarg = ""; std::string package = ""; std::string cmd = "TXLOCK:"; strarg.assign(arg); if(strarg.empty()) { package.assign(cmd); if (!active_modem) package.append("INOP"); else if(active_modem->freqlocked()) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); return; } if (!active_modem) return; if(strarg.find("ON") != std::string::npos) { active_modem->set_freqlock(true); REQ(set_button, (Fl_Button *) wf->xmtlock, 1); return; } if(strarg.find("OFF") != std::string::npos) { active_modem->set_freqlock(false); REQ(set_button, (Fl_Button *) wf->xmtlock, 0); return; } } /********************************************************************************** * WFF: FLDIGI returns WFFQ: (0-4000) Current waterfall limit **********************************************************************************/ static void reply_wf_freq_pos(char * arg) { std::string package = ""; std::string cmd = "WFF:"; char buff[32]; package.assign(cmd); memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff) - 1, "%d", (int) active_modem->get_txfreq()); package.append(buff); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * RSIDM: FLDIGI returns RSIDMQ:, **********************************************************************************/ static void reply_rsid_mode_state(char * arg) { std::string package = ""; std::string cmd = "RSIDM:"; package.assign(cmd); if(progdefaults.rsidWideSearch) package.append("BANDPASS,"); else package.append("MODEM,"); if(progdefaults.rsid_notify_only) package.append("NOTIFY"); else package.append("ACTIVE"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * MODEM: FLDIGI returns MODEMQ: // Current Modem **********************************************************************************/ static void reply_active_modem(char * arg) { std::string package = ""; std::string cmd = "MODEM:"; int mode = active_modem->get_mode(); package.assign(cmd); package.append(mode_info[mode].sname); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * HOST: Sent from FLDIGI to instuct the HOST program to return it's name and * version number. **********************************************************************************/ static void host_name(char *arg) { if(arg) { if(*arg) { host_name_string.assign(arg); LOG_INFO("%s", host_name_string.c_str()); } } } /********************************************************************************** * MODEMBW: FLDIGI returns MODEMBWQ: // Current Modem Bandwidth **********************************************************************************/ static void reply_active_modem_bw(char * arg) { std::string package = ""; std::string cmd = "MODEMBW:"; char buff[32]; memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff) - 1, "%d", (int) active_modem->get_bandwidth()); package.assign(cmd).append(buff); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * WFBW: FLDIGI returns WFBWQ:, **********************************************************************************/ static void reply_waterfall_bw(char * arg) { std::string package = ""; std::string cmd = "WFBW:"; char buff[32]; memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff) - 1, "%d,%d", (int) progdefaults.LowFreqCutoff, progdefaults.HighFreqCutoff ); package.assign(cmd).append(buff); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * MODEML: FLDIGI returns MODEML:Modem1,Modem2,... * A List of comma delimited modem ID strings. **********************************************************************************/ static void reply_modem_list(char * arg) { int index = 0; int count = 0; std::string package = ""; std::string cmd = "MODEML:"; package.assign(cmd); count = availabe_kiss_modems.size(); for(index = 0; index < count - 1; index++) package.append(availabe_kiss_modems[index]).append(","); package.append(availabe_kiss_modems[index]); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * TXBUF: FLDIGI returns TXBUFQ: **********************************************************************************/ static void reply_tx_buffer_count(char * arg) { char *buffer = (char *)0; unsigned int buffer_size = 64; unsigned tx_buffer_count = 0; std::string package = ""; std::string cmd = "TXBUF:"; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("%s", "Buffer allocation Error"); return; } { guard_lock to_radio_lock(&to_radio_mutex); tx_buffer_count = to_radio.size(); } memset(buffer, 0, buffer_size); snprintf(buffer, buffer_size - 1, "%u", tx_buffer_count); package.assign(cmd).append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); if(buffer) delete [] buffer; } /********************************************************************************** * SQL: // SQL On/Off **********************************************************************************/ static void set_sql_on_off(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_sql_on_off(arg); if(strarg.find("ON") != std::string::npos) { REQ(set_button, btnSQL, 1); return; } if(strarg.find("OFF") != std::string::npos) { REQ(set_button, btnSQL, 0); return; } } /********************************************************************************** * SQL: FLDIGI returns SQLQ: **********************************************************************************/ static void reply_sql_on_off(char * arg) { std::string package = ""; std::string cmd = "SQL:"; package.assign(cmd); if(progStatus.sqlonoff) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * SQLP:<0-100> // Current Symbol Quality Level **********************************************************************************/ static void reply_sql_pwr_level(char * arg) { std::string package = ""; std::string cmd = "SQLP:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) progStatus.squelch_value); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * SQLS:<0-100> // Set SQL Level (percent) **********************************************************************************/ static void set_sql_level(char * arg) { if(!arg) return; int value = 0; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_sql_level(arg); sscanf(strarg.c_str(), "%d", &value); if(value < 1) value = 1; if(value > 100) value = 100; progStatus.sldrSquelchValue = value; if(!progStatus.kpsql_enabled) REQ(set_slider2, sldrSquelch, value); } /********************************************************************************** * SQLS: FLDIGI returns SQLSQ:<0-100> // Set SQL Level Query (percent) **********************************************************************************/ static void reply_sql_level(char * arg) { std::string package = ""; std::string cmd = "SQLS:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) progStatus.sldrSquelchValue); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * BCHN: // Busy Channel On/Off **********************************************************************************/ static void set_busy_channel_on_off(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_busy_channel_on_off(arg); if(strarg.find("ON") != std::string::npos) { REQ(set_button, btnEnableBusyChannel, 1); return; } if(strarg.find("OFF") != std::string::npos) { REQ(set_button, btnEnableBusyChannel, 0); return; } } /********************************************************************************** * BCHN: FLDIGI returns BCHNQ: // Busy Channel State On/Off Query **********************************************************************************/ static void reply_busy_channel_on_off(char * arg) { std::string package = ""; std::string cmd = "BCHN:"; package.assign(cmd); if(progdefaults.enableBusyChannel) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * BCHNS<0-999> // Busy Channel Wait Duration (seconds) **********************************************************************************/ static void set_busy_channel_duration(char * arg) { if(!arg) return; int value = 0; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_busy_channel_duration(arg); sscanf(strarg.c_str(), "%d", &value); if(value < 1) value = 1; REQ(set_counter, cntBusyChannelSeconds, value); } /********************************************************************************** * BCHNS: FLDIGI returns BCHNSQ:<0-999> // Busy Channel Wait Duration Query (seconds) **********************************************************************************/ static void reply_busy_channel_duration(char * arg) { std::string package = ""; std::string cmd = "BCHNS:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%d", progdefaults.busyChannelSeconds); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * BUSY: FLDIGI returns BUSY: // Modem band pass signal presents **********************************************************************************/ static void reply_busy_state(char * arg) { std::string package = ""; std::string cmd = "BUSY:"; package.assign(cmd); if((trx_state == STATE_TX) || \ (kpsql_pl > kpsql_threshold) || \ (inhibit_tx_seconds)) { package.append("T"); } else { package.append("F"); } kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KPSQL: Depreciated **********************************************************************************/ static void set_kpsql_on_off(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_kpsql_on_off(arg); if(strarg.find("ON") != std::string::npos) { REQ(set_button, btnPSQL, 1); return; } if(strarg.find("OFF") != std::string::npos) { REQ(set_button, btnPSQL, 0); return; } } /********************************************************************************** * PSM: **********************************************************************************/ static void set_psm_on_off(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_psm_on_off(arg); if(strarg.find("ON") != std::string::npos) { REQ(set_button, btnPSQL, 1); return; } if(strarg.find("OFF") != std::string::npos) { REQ(set_button, btnPSQL, 0); return; } } /********************************************************************************** * KPSQL: Depreciated **********************************************************************************/ static void reply_kpsql_on_off(char * arg) { std::string package = ""; std::string cmd = "KPSQL:"; package.assign(cmd); if(progStatus.kpsql_enabled) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * PSM: **********************************************************************************/ static void reply_psm_on_off(char * arg) { std::string package = ""; std::string cmd = "PSM:"; package.assign(cmd); if(progStatus.kpsql_enabled) package.append("ON"); else package.append("OFF"); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KPSQLP:<0-100> Depreciated **********************************************************************************/ static void reply_kpsql_pwr_level(char * arg) { std::string package = ""; std::string cmd = "KPSQLP:"; char buffer[64]; float plevel = 0; float scale = 100.0 / ((float) HISTO_COUNT); package.assign(cmd); if(kpsql_pl > (double) HISTO_COUNT) { plevel = HISTO_COUNT; } else { plevel = kpsql_pl; } plevel *= scale; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) plevel); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * PSMP:<0-100> **********************************************************************************/ static void reply_psm_pwr_level(char * arg) { std::string package = ""; std::string cmd = "PSMP:"; char buffer[64]; float plevel = 0; float scale = 100.0 / ((float) HISTO_COUNT); package.assign(cmd); if(kpsql_pl > (double) HISTO_COUNT) { plevel = HISTO_COUNT; } else { plevel = kpsql_pl; } plevel *= scale; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) plevel); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * PSMS:<0-100> **********************************************************************************/ static void set_psm_squelch_level(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_psm_squelch_level(arg); int value = 0; sscanf(strarg.c_str(), "%d", &value); if(value < 1) value = 1; if(value > 100) value = 100; progStatus.sldrPwrSquelchValue = value; if(progStatus.kpsql_enabled) REQ(set_slider2, sldrSquelch, value); } /********************************************************************************** * KPSQLS:<0-100> Depreciated **********************************************************************************/ static void set_kpsql_squelch_level(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_kpsql_squelch_level(arg); int value = 0; sscanf(strarg.c_str(), "%d", &value); if(value < 1) value = 1; if(value > 100) value = 100; progStatus.sldrPwrSquelchValue = value; if(progStatus.kpsql_enabled) REQ(set_slider2, sldrSquelch, value); } /********************************************************************************** * KPSQLS: Depreciated **********************************************************************************/ static void reply_kpsql_squelch_level(char * arg) { std::string package = ""; std::string cmd = "KPSQLS:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) progStatus.sldrPwrSquelchValue); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * PSMS: **********************************************************************************/ static void reply_psm_squelch_level(char * arg) { std::string package = ""; std::string cmd = "PSMS:"; char buffer[64]; package.assign(cmd); memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "%u", (unsigned int) progStatus.sldrPwrSquelchValue); package.append(buffer); kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KISSRAW: // Enable RAW unaltered data over KISS **********************************************************************************/ static void set_kiss_raw_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_kiss_raw_mode(arg); // Longer compares first if(strarg.find("ONLY") != std::string::npos) { kiss_raw_enabled = KISS_RAW_ONLY; return; } if(strarg.find("ON") != std::string::npos) { kiss_raw_enabled = KISS_RAW_ON; return; } if(strarg.find("OFF") != std::string::npos) { kiss_raw_enabled = KISS_RAW_DISABLED; return; } } /********************************************************************************** * KISSRAW: // Enable RAW unaltered data over KISS **********************************************************************************/ static void reply_kiss_raw_mode(char * arg) { std::string package = ""; std::string cmd = "KISSRAW:"; package.assign(cmd); switch(kiss_raw_enabled) { case KISS_RAW_ONLY: package.append("ONLY"); break; case KISS_RAW_ON: package.append("ON"); break; case KISS_RAW_DISABLED: package.append("OFF"); break; default: return; } kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * KISSCRCM: **********************************************************************************/ static void set_crc_mode(char * arg) { if(!arg) return; std::string strarg = ""; strarg.assign(arg); if(strarg.empty()) return reply_crc_mode(arg); if(strarg.find("SMACK") != std::string::npos) { smack_crc_enabled = true; crc_mode = CRC16_CCITT; return; } if(strarg.find("CCITT") != std::string::npos) { smack_crc_enabled = true; crc_mode = CRC16_CCITT; return; } if(strarg.find("FCS") != std::string::npos) { smack_crc_enabled = true; crc_mode = CRC16_FCS; return; } if(strarg.find("XOR") != std::string::npos) { smack_crc_enabled = true; crc_mode = CRC8_XOR; return; } if(strarg.find("NONE") != std::string::npos) { smack_crc_enabled = false; return; } } /********************************************************************************** * KISSCRCM:, **********************************************************************************/ static void reply_crc_mode(char *arg) { std::string package = ""; std::string cmd = "KISSCRCM:"; package.assign(cmd); if(smack_crc_enabled) package.append("SMACK,"); else package.append("NONE,"); switch(crc_mode) { case CRC16_NONE: package.append("NONE"); break; case CRC16_CCITT: package.append("CCITT"); break; case CRC16_FCS: package.append("FCS"); break; case CRC8_XOR: package.append("XOR"); break; default: package.append("UNDEFINED"); } kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } /********************************************************************************** * RSIDN:NEW_WF_OFFSET,NEW_MODEM,OLD_WF_OFFSET,OLD_MODEM, **********************************************************************************/ bool bcast_rsid_kiss_frame(int new_wf_pos, int new_mode, int old_wf_pos, int old_mode, int notify) { guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); char buffer[256]; char old_modem_name[64]; char new_modem_name[64]; char *notify_str = (char *) ""; KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; std::string package = ""; if(new_mode >= NUM_MODES || old_mode >= NUM_MODES) return false; if(new_mode < 0 || old_mode < 0) return false; if(!(mode_info[new_mode].iface_io & KISS_IO)) return false; if(old_mode != new_mode || new_wf_pos != old_wf_pos) { psm_reset_histogram(); } if(!kiss_bcast_rsid_reception) return true; if(new_wf_pos == 0) { new_wf_pos = old_wf_pos; notify = RSID_KISS_USER; } switch(notify) { case RSID_KISS_NOTIFY: notify_str = (char *) "NOTIFY"; break; case RSID_KISS_ACTIVE: notify_str = (char *) "ACTIVE"; break; case RSID_KISS_USER: notify_str = (char *) "USER"; break; default: LOG_DEBUG("%s", "Unknown KISS frame RSID BC Source"); return false; } // Send all modem names in capital letters memset(old_modem_name, 0, sizeof(old_modem_name)); strncpy(old_modem_name, mode_info[old_mode].sname, sizeof(old_modem_name) - 1); for(size_t i = 0; i < sizeof(old_modem_name); i++) { if(old_modem_name[i]) old_modem_name[i] = toupper(old_modem_name[i]); else break; } memset(new_modem_name, 0, sizeof(new_modem_name)); strncpy(new_modem_name, mode_info[new_mode].sname, sizeof(new_modem_name) - 1); for(size_t i = 0; i < sizeof(new_modem_name); i++) { if(new_modem_name[i]) new_modem_name[i] = toupper(new_modem_name[i]); else break; } memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer)-1, "RSIDN:%d,%s,%d,%s,%s", new_wf_pos, new_modem_name, \ old_wf_pos, old_modem_name, notify_str); package.assign(buffer); frame = encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no); if(!frame) { LOG_DEBUG("%s", "Broadcast Hardware Frame Assembly Failure"); return true; } kiss_bc_frame.append((const char *) frame->data, (size_t) frame->size); if(frame->data) delete [] frame->data; if(frame) delete frame; return true; } /********************************************************************************** * TRXS: // Transmit to HOST during a state change between RX/TX or TX/RX. **********************************************************************************/ void bcast_trxs_kiss_frame(int state) { guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; std::string package; package.assign("TRXS:"); switch(state) { case STATE_RX: package.append("RX") ; break; case STATE_TUNE: case STATE_TX: package.append("TX") ; break; default: LOG_DEBUG("%s", "Unknown Transmit State"); return; } frame = encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no); if(!frame) { LOG_DEBUG("%s", "Broadcast Hardware Frame Assembly Failure"); return; } kiss_bc_frame.append((const char *) frame->data, (size_t) frame->size); if(frame->data) delete [] frame->data; if(frame) delete frame; } /********************************************************************************** * TXBE: // Broadcast empty transmit buffer state **********************************************************************************/ void bcast_tx_buffer_empty_kiss_frame(void) { if(!bcast_tx_buffer_empty_flag) return; guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; std::string package; package.assign("TXBE:"); frame = encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no); if(!frame) { LOG_DEBUG("%s", "Broadcast Hardware Frame Assembly Failure"); return; } kiss_bc_frame.append((const char *) frame->data, (size_t) frame->size); if(frame->data) delete [] frame->data; if(frame) delete frame; } /********************************************************************************** * **********************************************************************************/ static void exec_hardware_command(std::string cmd, std::string arg) { if(cmd.empty()) return; if(kiss_reset_flag) return; int pos = 0; int a = 0; int b = 0; int comp_size = 0; int index = 0; int count = sizeof(exec_match) / sizeof(EXEC_HARDWARE_CMD_MATCH); std::string cmp = ""; for(index = 0; index < count; index++) { if(exec_match[index].cmd == (char *)0) return; cmp.assign(exec_match[index].cmd); if((pos = cmp.find(cmd)) != (int)(std::string::npos)) { a = cmp.size(); b = cmd.size(); if(a > b) comp_size = a; else comp_size = b; if(cmd.compare(pos, comp_size, cmp) == 0) { if(exec_match[index].cmd_func) (*exec_match[index].cmd_func)((char *) arg.c_str()); return; } } } } /********************************************************************************** * **********************************************************************************/ static bool kiss_queue_frame(KISS_QUEUE_FRAME * frame, std::string cmd) { if(!frame) { LOG_DEBUG("Null frame (%s)", cmd.c_str()); return false; } if(frame->size == 0 || frame->data == (char *)0) { LOG_DEBUG("Frame null content (%s)", cmd.c_str()); if(frame->data) delete[] frame->data; delete frame; return false; } WriteToHostBuffered((const char *) frame->data, (size_t) frame->size); delete[] frame->data; delete frame; return true; } /********************************************************************************** * **********************************************************************************/ size_t kiss_encode(char *src, size_t src_size, char **dst) { if(!src || !dst || src_size < 1) return 0; size_t index = 0; int count = 0; int buffer_size = 0; int byte = 0; char *buffer = (char *)0; buffer_size = (src_size * KISS_BUFFER_FACTOR) + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("Memory allocation error near line %d", __LINE__); *dst = (char *)0; return 0; } memset(buffer, 0, buffer_size); count = 0; buffer[count++] = KISS_FEND; for(index = 0; index < src_size; index++) { byte = (int) src[index] & 0xFF; switch(byte) { case KISS_FESC: buffer[count++] = KISS_FESC; buffer[count++] = KISS_TFESC; break; case KISS_FEND: buffer[count++] = KISS_FESC; buffer[count++] = KISS_TFEND; break; default: buffer[count++] = byte; } } buffer[count++] = KISS_FEND; *dst = (char *) buffer; return count; } /********************************************************************************** * **********************************************************************************/ size_t kiss_decode(char *src, size_t src_size, char **dst) { if(!src || !dst || src_size < 1) return 0; size_t index = 0; int count = 0; int buffer_size = 0; int byte = 0; int last_byte = 0; char *buffer = (char *)0; buffer_size = src_size + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("Memory allocation error near line %d", __LINE__); *dst = (char *)0; return 0; } memset(buffer, 0, buffer_size); count = 0; last_byte = KISS_INVALID; for(index = 0; index < src_size; index++) { byte = src[index] & 0xFF; switch(byte) { case KISS_FEND: continue; case KISS_FESC: break; case KISS_TFEND: if(last_byte == KISS_FESC) buffer[count++] = KISS_FEND; else buffer[count++] = byte; break; case KISS_TFESC: if(last_byte == KISS_FESC) buffer[count++] = KISS_FESC; else buffer[count++] = byte; break; default: buffer[count++] = byte; } last_byte = byte; } *dst = (char *) buffer; return count; } #if 0 /********************************************************************************** * **********************************************************************************/ std::string kiss_decode(std::string frame) { int count = 0; int frame_size = 0; char *dst = (char *)0; static std::string ret_str = ""; if(frame.empty()) return frame; frame_size = frame.size(); ret_str.clear(); ret_str.reserve(frame_size + BUFFER_PADDING); count = kiss_decode((char *) frame.c_str(), frame.size(), &dst); if(count && dst) { ret_str.assign(dst, count); dst[0] = 0; delete [] dst; } return ret_str; } #endif // 0 /********************************************************************************** * **********************************************************************************/ std::string kiss_encode(std::string frame) { int count = 0; int frame_size = 0; char *dst = (char *)0; static std::string ret_str = ""; if(frame.empty()) return frame; frame_size = frame.size(); ret_str.clear(); ret_str.reserve((frame_size * 2) + BUFFER_PADDING); count = kiss_encode((char *) frame.c_str(), frame.size(), &dst); if(count && dst) { ret_str.assign(dst, count); dst[0] = 0; delete [] dst; } return ret_str; } /********************************************************************************** * **********************************************************************************/ size_t hdlc_encode(char *src, size_t src_size, char **dst) { if(!src || !dst || src_size < 1) return 0; size_t index = 0; int count = 0; int buffer_size = 0; int byte = 0; char *buffer = (char *)0; buffer_size = (src_size * HDLC_BUFFER_FACTOR) + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("Memory allocation error near line %d", __LINE__); *dst = (char *)0; return 0; } memset(buffer, 0, buffer_size); count = 0; buffer[count++] = ' '; buffer[count++] = KISS_FEND; for(index = 0; index < src_size; index++) { byte = (int) src[index] & 0xFF; if(not_allowed[byte]) { buffer[count++] = HDLC_CNT; if((byte + HDLC_CNT_OFFSET) > 255) buffer[count++] = ((byte - HDLC_CNT_OFFSET) & 0xFF); else buffer[count++] = ((byte + HDLC_CNT_OFFSET) & 0xFF); continue; } switch(byte) { case KISS_FESC: buffer[count++] = KISS_FESC; buffer[count++] = KISS_TFESC; break; case KISS_FEND: buffer[count++] = KISS_FESC; buffer[count++] = KISS_TFEND; break; case HDLC_CNT: buffer[count++] = KISS_FESC; buffer[count++] = HDLC_TCNT; break; default: buffer[count++] = byte; } } buffer[count++] = KISS_FEND; buffer[count++] = ' '; *dst = (char *) buffer; return count; } /********************************************************************************** * **********************************************************************************/ size_t hdlc_decode(char *src, size_t src_size, char **dst) { if(!src || !dst || src_size < 1) return 0; size_t index = 0; int count = 0; int buffer_size = 0; int byte = 0; int last_byte = 0; int check_byte = 0; char *buffer = (char *)0; buffer_size = src_size + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("Memory allocation error near line %d", __LINE__); *dst = (char *)0; return 0; } memset(buffer, 0, buffer_size); count = 0; last_byte = KISS_INVALID; for(index = 0; index < src_size; index++) { byte = src[index] & 0xFF; if(last_byte == HDLC_CNT) { check_byte = byte - HDLC_CNT_OFFSET; if((check_byte > -1) && (check_byte < 256) && not_allowed[check_byte]) { buffer[count++] = check_byte; last_byte = byte; continue; } check_byte = byte + HDLC_CNT_OFFSET; if((check_byte > -1) && (check_byte < 256) && not_allowed[check_byte]) { buffer[count++] = check_byte; } last_byte = byte; continue; } switch(byte) { case KISS_FEND: continue; case KISS_FESC: case HDLC_CNT: last_byte = byte; continue; case KISS_TFEND: if(last_byte == KISS_FESC) byte = KISS_FEND; break; case KISS_TFESC: if(last_byte == KISS_FESC) byte = KISS_FESC; break; case HDLC_TCNT: if(last_byte == KISS_FESC) byte = HDLC_CNT; break; } last_byte = buffer[count++] = byte; } *dst = (char *) buffer; return count; } /********************************************************************************** * Buffer must be at least twice the size of the data provided + BUFFER_PADDING * data_count: Number of bytes in the buffer to be converted. * Return is the converted byte count. Buffer is overwritten with converted data. **********************************************************************************/ static size_t encap_hdlc_frame(char *buffer, size_t data_count) { if(!buffer || !data_count) { LOG_DEBUG("%s", "Parameter Data Error [NULL]"); return false; } size_t count = 0; unsigned int crc_value = 0; char *kiss_encap = (char *)0; if(progdefaults.ax25_decode_enabled) { ax25_decode((unsigned char *) buffer, data_count, true, true); } crc_value = calc_fcs_crc(buffer, (int) data_count); buffer[data_count++] = CRC_LOW(crc_value); buffer[data_count++] = CRC_HIGH(crc_value); count = hdlc_encode(buffer, data_count, &kiss_encap); if(kiss_encap && count) { memcpy(buffer, kiss_encap, count); #ifdef EXTENED_DEBUG_INFO LOG_HEX(buffer, count); #endif delete [] kiss_encap; } else { LOG_DEBUG("%s", "Kiss Encode Memory Allocation Error"); return 0; } return count; } /********************************************************************************* * Buffer is presently larger then what will be returned. * data_count: Number of bytes in the buffer to process. * Returns the converted byte count. Buffer is over written with converted data. *********************************************************************************/ static size_t decap_hdlc_frame(char *buffer, size_t data_count) { if(!buffer || !data_count) { LOG_DEBUG("%s", "Parameter Data Error/NULL"); return false; } size_t count = 0; // size_t index = 0; unsigned int crc_value = 0; unsigned int calc_crc_value = 0; char *kiss_decap = (char *)0; count = hdlc_decode(buffer, data_count, &kiss_decap); #ifdef EXTENED_DEBUG_INFO if(data_count && buffer) LOG_HEX(buffer, data_count); if(count && kiss_decap) LOG_HEX(kiss_decap, count); #endif do { if(count > data_count || !kiss_decap) { LOG_DEBUG("%s", "Kiss decode error"); count = 0; break; } if(count > 2) count -= 2; if(count) { calc_crc_value = calc_fcs_crc(kiss_decap, (int) count); } else { LOG_DEBUG("%s", "Kiss decode error"); count = 0; break; } crc_value = CRC_LOW_HIGH(kiss_decap[count], kiss_decap[count + 1]); if(crc_value != calc_crc_value) { count = 0; break; } temp_disable_tx_inhibit = time(0) + DISABLE_TX_INHIBIT_DURATION; // valid packet, disable busy channel inhitbit for x duration. kiss_decap[count] = kiss_decap[count + 1] = 0; memcpy(buffer, kiss_decap, count); if(progdefaults.ax25_decode_enabled) { ax25_decode((unsigned char *) buffer, count, true, false); } break; } while(1); if(kiss_decap) { kiss_decap[0] = 0; delete [] kiss_decap; } return count; } /********************************************************************************** * **********************************************************************************/ static KISS_QUEUE_FRAME *encap_kiss_frame(char *buffer, size_t buffer_size, int frame_type, int port) { guard_lock kfenc(&kiss_encode_mutex); if(!buffer || buffer_size < 1) { LOG_DEBUG("%s", "KISS encap argument 'data' contains no data"); return (KISS_QUEUE_FRAME *)0; } if(port > 0xF || port < 0) { LOG_DEBUG("Invalid KISS port number (%d)", port); return (KISS_QUEUE_FRAME *)0; } switch(frame_type) { case KISS_DATA: case KISS_RAW: case KISS_TXDELAY: case KISS_PERSIST: case KISS_SLOTTIME: case KISS_TXTAIL: case KISS_DUPLEX: case KISS_HARDWARE: break; default: LOG_DEBUG("Invalid KISS frame type (%d)", frame_type); return (KISS_QUEUE_FRAME *)0; } int size = 0; int index = 0; unsigned int crc_value = 0; KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; frame = new KISS_QUEUE_FRAME; if(!frame) { LOG_DEBUG("%s", "KISS struct frame memory allocation error"); return (KISS_QUEUE_FRAME *)0; } size = (buffer_size * KISS_BUFFER_FACTOR) + BUFFER_PADDING; // Resulting data space could be 2 fold higher. frame->data = (char *) new char[size]; if(!frame->data) { delete frame; LOG_DEBUG("%s", "KISS buffer frame memory allocation error"); return (KISS_QUEUE_FRAME *)0; } memset(frame->data, 0, size); size = buffer_size; frame->data[0] = SET_KISS_TYPE_PORT(frame_type, port); memcpy(&frame->data[1], buffer, size); size++; if((frame_type == KISS_DATA) || (frame_type == KISS_RAW)) { if(smack_crc_enabled) { frame->data[0] = SMACK_CRC_ASSIGN(frame->data[0]); switch(crc_mode) { case CRC16_CCITT: crc_value = calc_ccitt_crc((char *) frame->data, size); frame->data[size++] = CRC_LOW(crc_value); frame->data[size++] = CRC_HIGH(crc_value); break; case CRC16_FCS: crc_value = calc_fcs_crc((char *) frame->data, size); frame->data[size++] = CRC_LOW(crc_value); frame->data[size++] = CRC_HIGH(crc_value); break; case CRC8_XOR: crc_value = calc_xor_crc((char *) frame->data, size); frame->data[size++] = CRC_LOW(crc_value); break; default: break; } } } char *tmp = (char *)0; index = kiss_encode((char *) frame->data, size, &tmp); if(tmp) { #ifdef EXTENED_DEBUG_INFO LOG_HEX(tmp, index); #endif frame->data[0] = 0; delete [] frame->data; frame->data = (char *) tmp; frame->size = index; } else { LOG_DEBUG("KISS encode allocation error near line %d", __LINE__); delete [] frame->data; delete frame; frame = (KISS_QUEUE_FRAME *)0; } return frame; } /********************************************************************************** * **********************************************************************************/ static KISS_QUEUE_FRAME * encap_kiss_frame(std::string data, int frame_type, int port) { if(data.empty()) return (KISS_QUEUE_FRAME *)0; return encap_kiss_frame((char *) data.c_str(), (size_t) data.size(), frame_type, port); } /********************************************************************************** * **********************************************************************************/ std::string unencap_kiss_frame(char *buffer, size_t buffer_size, int *frame_type, int *kiss_port_no) { if(!buffer || buffer_size < 1 || !frame_type || !kiss_port_no) return std::string(""); char *decoded_buffer = (char *)0; size_t count = 0; unsigned int crc_extracted = 0; unsigned int crc_calc = 0; unsigned int port = 0; unsigned int ftype = 0; static std::string ret_str = ""; ret_str.clear(); #ifdef EXTENED_DEBUG_INFO LOG_HEX(buffer, buffer_size); #endif count = kiss_decode(buffer, buffer_size, &decoded_buffer); if(!count || !decoded_buffer) { LOG_DEBUG("Kiss decoder memory allocation error near line %d", __LINE__); return ret_str; } ftype = KISS_CMD(decoded_buffer[0]); port = KISS_PORT(decoded_buffer[0]); if((ftype == KISS_DATA) || (ftype == KISS_RAW)) { smack_crc_enabled = SMACK_CRC(port); port = SMACK_CRC_MASK(port); if(smack_crc_enabled) { switch(crc_mode) { case CRC16_CCITT: count -= 2; if(count > 2) { crc_calc = calc_ccitt_crc(decoded_buffer, count); crc_extracted = CRC_LOW_HIGH(decoded_buffer[count], decoded_buffer[count + 1]); } else { crc_calc = crc_extracted + 1; // Force a fail } break; case CRC16_FCS: count -= 2; if(count > 2) { crc_calc = calc_fcs_crc(decoded_buffer, count); crc_extracted = CRC_LOW_HIGH(decoded_buffer[count], decoded_buffer[count + 1]); } else { crc_calc = crc_extracted + 1; } break; case CRC8_XOR: count -= 1; if(count > 1) { crc_calc = CRC_LOW(calc_fcs_crc(decoded_buffer, count)); crc_extracted = CRC_LOW(decoded_buffer[count]); } else { crc_calc = crc_extracted + 1; } break; default: LOG_DEBUG("CRC type not found %d", crc_mode); } if(crc_calc != crc_extracted) { if(frame_type) *frame_type = ftype; if(kiss_port_no) *kiss_port_no = port; if(decoded_buffer) delete [] decoded_buffer; ret_str.clear(); return ret_str; } } } if(count > 0) count--; #ifdef EXTENED_DEBUG_INFO LOG_HEX(&decoded_buffer[1], count); #endif ret_str.assign(&decoded_buffer[1], count); if(frame_type) *frame_type = ftype; if(kiss_port_no) *kiss_port_no = port; if(decoded_buffer) delete [] decoded_buffer; return ret_str; } /********************************************************************************** * **********************************************************************************/ std::string unencap_kiss_frame(std::string package, int *frame_type, int *kiss_port_no) { if(package.empty() || !frame_type || !kiss_port_no) return std::string(""); return unencap_kiss_frame((char *) package.c_str(), (size_t) package.size(), frame_type, kiss_port_no); } /********************************************************************************** * **********************************************************************************/ static void parse_hardware_frame(std::string frame) { if(frame.empty()) return; std::string cmd = ""; std::string arg = ""; static char buffer[512]; std::string parse_frame = ""; char bofmsg[] = "Temp Buffer overflow"; size_t count = frame.size(); size_t index = 0; size_t pos = 0; size_t j = 0; parse_frame.assign(frame); #ifdef EXTENED_DEBUG_INFO LOG_HEX(frame.c_str(), frame.size()); #endif do { if(kiss_reset_flag) return; pos = parse_frame.find(":"); if(pos == std::string::npos) return; j = 0; memset(buffer, 0, sizeof(buffer)); for(index = 0; index < pos; index++) { if(parse_frame[index] <= ' ') continue; buffer[j++] = toupper(parse_frame[index]); if(j >= sizeof(buffer)) { LOG_DEBUG("%s", bofmsg); return; } } cmd.assign(buffer); j = 0; memset(buffer, 0, sizeof(buffer)); for(index = pos + 1; index < count; index++) { if(parse_frame[index] <= ' ') break; buffer[j++] = parse_frame[index]; if(j >= sizeof(buffer)) { LOG_DEBUG("%s", bofmsg); return; } } arg.assign(buffer); if(cmd.empty()) return; exec_hardware_command(cmd, arg); if(index > count) index = count; parse_frame.erase(0, index); count = parse_frame.size(); } while(count > 0); } /********************************************************************************** * **********************************************************************************/ static void parse_kiss_frame(std::string frame_segment) { guard_lock kiss_rx_lock(&kiss_frame_mutex); unsigned int cur_byte = KISS_INVALID; unsigned int frame_size = 0; unsigned int index = 0; unsigned int fend_count = 0; unsigned int cmsa_data = 0; int buffer_size = 0; int port_no = KISS_INVALID; int frame_type = KISS_INVALID; int data_count = 0; bool process_one_frame = false; char *buffer = (char *)0; kiss_frame.append(frame_segment); while(1) { if(kiss_frame.empty()) return; frame_size = kiss_frame.size(); process_one_frame = false; fend_count = 0; kiss_one_frame.clear(); for(index = 0; index < frame_size; index++) { cur_byte = kiss_frame[index] & 0xFF; if(cur_byte == KISS_FEND) { fend_count++; } if(fend_count) { kiss_one_frame += cur_byte; } if(fend_count == 2) { kiss_frame.erase(0, index); process_one_frame = true; break; } } if(!process_one_frame) return; frame_size = kiss_one_frame.size(); if(frame_size < 3) { continue; // Invalid Frame size } kiss_one_frame = unencap_kiss_frame(kiss_one_frame, &frame_type, &port_no); if(kiss_one_frame.empty()) continue; if(port_no != (int)kiss_port_no) { continue; } switch(frame_type) { case KISS_TXDELAY: case KISS_PERSIST: case KISS_SLOTTIME: case KISS_TXTAIL: case KISS_DUPLEX: cmsa_data = kiss_one_frame[0] & 0xFF; break; case KISS_DATA: if(kiss_raw_enabled == KISS_RAW_ONLY) continue; break; case KISS_RAW: if(kiss_raw_enabled == KISS_RAW_DISABLED) continue; break; case KISS_HARDWARE: break; default: continue; // Unreconized frame_type. } switch(frame_type) { case KISS_DATA: buffer_size = (frame_size * HDLC_BUFFER_FACTOR) + BUFFER_PADDING; buffer = new char[buffer_size]; if(!buffer) { LOG_DEBUG("%s", "Buffer Allocation Error"); return; } data_count = kiss_one_frame.size(); memset(buffer, 0, buffer_size); memcpy(buffer, kiss_one_frame.c_str(), data_count); data_count = encap_hdlc_frame(buffer, data_count); WriteToRadioBuffered((const char *) buffer, (size_t) data_count); buffer[0] = 0; delete [] buffer; buffer = 0; break; case KISS_RAW: WriteToRadioBuffered((const char *) kiss_one_frame.c_str(), (size_t) kiss_one_frame.size()); break; case KISS_TXDELAY: progStatus.csma_transmit_delay = cmsa_data; progdefaults.csma_transmit_delay = cmsa_data; REQ(update_csma_io_config, (int) CSMA_TX_DELAY); break; case KISS_PERSIST: progStatus.csma_persistance = cmsa_data; progdefaults.csma_persistance = cmsa_data; REQ(update_csma_io_config, (int) CSMA_PERSISTANCE); break; case KISS_SLOTTIME: progStatus.csma_slot_time = cmsa_data; progdefaults.csma_slot_time = cmsa_data; REQ(update_csma_io_config, (int) CSMA_SLOT_TIME); break; case KISS_TXTAIL: break; case KISS_DUPLEX: if(cmsa_data) duplex = KISS_FULL_DUPLEX; else duplex = KISS_HALF_DUPLEX; break; case KISS_HARDWARE: parse_hardware_frame(kiss_one_frame); break; } } // while(1) } /********************************************************************************** * **********************************************************************************/ static void WriteToHostBuffered(const char *data, size_t size) { guard_lock to_host_lock(&to_host_mutex); to_host.append(data, size); } /********************************************************************************** * **********************************************************************************/ static void WriteToRadioBuffered(const char *data, size_t size) { guard_lock to_radio_lock(&to_radio_mutex); if(!data || size < 1) return; set_tx_timeout(); to_radio.append(data, size); } /********************************************************************************** * Must be call in WriteToRadioBuffered() and no other. **********************************************************************************/ inline void set_tx_timeout(void) { if(to_radio.empty()) { transmit_buffer_flush_timeout = time(0) + TX_BUFFER_TIMEOUT; } } /********************************************************************************** * **********************************************************************************/ void flush_kiss_tx_buffer(void) { int data_count = 0; { guard_lock to_host_lock(&to_radio_mutex); kiss_text_available = false; pText = 0; data_count = to_radio.size(); if(data_count) to_radio.clear(); } if(data_count) bcast_tx_buffer_empty_kiss_frame(); } /********************************************************************************** * **********************************************************************************/ static void WriteToHostARQBuffered(void) { std::string arq_data = ""; { guard_lock to_host_arq_lock(&to_host_arq_mutex); int data_available = to_arq_host.size(); if(kiss_raw_enabled == KISS_RAW_DISABLED) { if(data_available) { to_arq_host.clear(); } return; } if(data_available < 1) return; #ifdef EXTENED_DEBUG_INFO LOG_HEX(to_arq_host.c_str(), to_arq_host.size()); #endif arq_data.assign(to_arq_host); to_arq_host.clear(); } kiss_queue_frame(encap_kiss_frame(arq_data, KISS_RAW, kiss_port_no), std::string("ARQ")); } /********************************************************************************** * **********************************************************************************/ static void *ReadFromHostSocket(void *args) { if(!kiss_socket) return (void *)0; static char buffer[2048]; std::string str_buffer; size_t count = 0; Socket *tmp_socket = (Socket *)0; memset(buffer, 0, sizeof(buffer)); str_buffer.reserve(sizeof(buffer)); if(progStatus.kiss_tcp_io && progStatus.kiss_tcp_listen) { tmp_socket = kiss_socket->accept2(); kiss_socket->shut_down(); kiss_socket->close(); if(tmp_socket) kiss_socket = tmp_socket; tmp_socket = 0; } LOG_INFO("%s", "Kiss RX loop started. "); kiss_rx_exit = false; kiss_rx_loop_running = true; while(!kiss_rx_exit) { memset(buffer, 0, sizeof(buffer)); try { if(progStatus.kiss_tcp_io) count = kiss_socket->recv((void *) buffer, sizeof(buffer) - 1); else count = kiss_socket->recvFrom((void *) buffer, sizeof(buffer) - 1); } catch (...) { if (errno) LOG_INFO("recv/recvFrom Socket Error %d", errno); count = 0; if(!tcpip_reset_flag) { kiss_tcp_disconnect((char *)""); } break; } if(count && (data_io_enabled == KISS_IO)) { #ifdef EXTENED_DEBUG_INFO LOG_HEX(buffer, count); #endif guard_lock from_host_lock(&from_host_mutex); from_host.append(buffer, count); } } LOG_INFO("%s", "Kiss RX loop exit. "); kiss_rx_loop_running = false; return (void *)0; } extern Fl_Slider2 *sldrSquelch; extern Progress *pgrsSquelch; /********************************************************************************** * **********************************************************************************/ static void *kiss_loop(void *args) { SET_THREAD_ID(KISS_TID); int old_trx_state = STATE_TX; LOG_INFO("%s", "Kiss loop started. "); kiss_loop_running = true; while(!kiss_exit){ MilliSleep(100); if(data_io_enabled != KISS_IO) { kiss_text_available = false; kiss_reset_buffers(); continue; } if(old_trx_state != trx_state) { if(kiss_bcast_trx_toggle) { switch(trx_state) { case STATE_TX: case STATE_RX: case STATE_TUNE: bcast_trxs_kiss_frame(trx_state); default : break; } } old_trx_state = trx_state; } ReadFromHostBuffered(); ReadFromRadioBuffered(); WriteToHostBCastFramesBuffered(); WriteToHostARQBuffered(); WriteToHostSocket(); if(!to_radio.empty()) { kiss_text_available = true; active_modem->set_stopflag(false); trx_transmit(); } } kiss_loop_running = false; // exit the kiss thread return NULL; } /********************************************************************************** * **********************************************************************************/ void WriteKISS(const char data) { if (active_modem->get_mode() == MODE_FSQ) return; if(kiss_reset_flag) return; { guard_lock from_radio_lock(&from_radio_mutex); from_radio += data; } if(kiss_raw_enabled != KISS_RAW_DISABLED) { guard_lock to_host_arq_lock(&to_host_arq_mutex); to_arq_host += data; } } /********************************************************************************** * **********************************************************************************/ void WriteKISS(const char *data) { if (active_modem->get_mode() == MODE_FSQ) return; if(kiss_reset_flag) return; { guard_lock from_radio_lock(&from_radio_mutex); if(data) from_radio.append(data); } { guard_lock to_host_arq_lock(&to_host_arq_mutex); if(data && (kiss_raw_enabled != KISS_RAW_DISABLED)) to_arq_host.append(data); } } /********************************************************************************** * **********************************************************************************/ void WriteKISS(const char *data, size_t size) { if (active_modem->get_mode() == MODE_FSQ) return; if(kiss_reset_flag) return; { guard_lock from_radio_lock(&from_radio_mutex); if(data && size) { from_radio.append(data, size); } } { guard_lock to_host_arq_lock(&to_host_arq_mutex); if(data && size && (kiss_raw_enabled != KISS_RAW_DISABLED)) { to_arq_host.append(data, size); } } } /********************************************************************************** * **********************************************************************************/ void WriteKISS(std::string data) { if (active_modem->get_mode() == MODE_FSQ) return; if(kiss_reset_flag) return; { guard_lock from_radio_lock(&from_radio_mutex); if(!data.empty()) { from_radio.append(data); } } { guard_lock to_host_arq_lock(&to_host_arq_mutex); if(!data.empty() && (kiss_raw_enabled != KISS_RAW_DISABLED)) { to_arq_host.append(data); } } } /********************************************************************************** * **********************************************************************************/ void WriteToHostSocket(void) { guard_lock to_host_lock(&to_host_mutex); size_t count = 0; if(to_host.empty()) return; if(kiss_socket && data_io_enabled == KISS_IO) { try { if(progStatus.kiss_tcp_io) count = kiss_socket->send(to_host.c_str(), to_host.size()); else count = kiss_socket->sendTo(to_host.c_str(), to_host.size()); #ifdef EXTENED_DEBUG_INFO LOG_HEX(to_host.c_str(), to_host.size()); #endif } catch (...) { if(kiss_reset_flag == false) { kiss_tcp_disconnect((char *)""); } LOG_INFO("Write error error to KISS socket: %d", static_cast(count)); } } to_host.clear(); } /********************************************************************************** * **********************************************************************************/ static void ReadFromHostBuffered(void) { if(!kiss_socket) return; guard_lock from_host_lock(&from_host_mutex); if(from_host.empty()) return; #ifdef EXTENED_DEBUG_INFO LOG_HEX(from_host.c_str(), from_host.size()); #endif parse_kiss_frame(from_host); from_host.clear(); } /********************************************************************************** * **********************************************************************************/ void ReadFromRadioBuffered(void) { if(kiss_reset_flag) return; guard_lock from_radio_lock(&from_radio_mutex); if(from_radio.empty()) return; int pos = 0; int pos2 = 0; // unsigned int crc = 0; KISS_QUEUE_FRAME *frame = (KISS_QUEUE_FRAME *)0; static char frame_marker[2] = { (char)(KISS_FEND), 0 }; std::string one_frame = ""; pos = from_radio.find(frame_marker); if(pos == (int)(std::string::npos)) { from_radio.clear(); return; } if(pos != 0) { from_radio.erase(0, pos); pos = 0; } pos2 = from_radio.find(frame_marker, pos + 1); if(pos2 != (int)(std::string::npos)) { one_frame.assign(from_radio, pos, pos2 - pos + 1); } else { if(from_radio.size() > MAX_TEMP_BUFFER_SIZE) from_radio.clear(); return; } char *buffer = (char *)0; size_t buffer_size = one_frame.size() + BUFFER_PADDING; buffer = new char [buffer_size]; if(!buffer) { LOG_DEBUG("Memory Allocation Error Near Line No. %d", __LINE__); goto EXIT; } memset(buffer, 0, buffer_size); buffer_size = one_frame.size(); memcpy(buffer, one_frame.c_str(), buffer_size); #ifdef EXTENED_DEBUG_INFO LOG_HEX(buffer, buffer_size); #endif buffer_size = decap_hdlc_frame(buffer, buffer_size); if(buffer_size) { from_radio.erase(pos, pos2 - pos + 1); if(kiss_raw_enabled != KISS_RAW_ONLY) { frame = encap_kiss_frame(buffer, buffer_size, KISS_DATA, kiss_port_no); if(!frame || !frame->data) { LOG_DEBUG("Frame Allocation Error Near Line %d", __LINE__); goto EXIT; } WriteToHostBuffered((const char *) frame->data, (size_t) frame->size); } } else { from_radio.erase(pos, pos + 1); } EXIT:; if(frame) { if(frame->data) { frame->data[0] = 0; delete [] frame->data; } delete frame; } if(buffer) { buffer[0] = 0; delete [] buffer; } } /********************************************************************************** * **********************************************************************************/ void WriteToHostBCastFramesBuffered(void) { guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); if(kiss_bc_frame.empty()) return; WriteToHostBuffered((const char *) kiss_bc_frame.c_str(), (size_t) kiss_bc_frame.size()); #ifdef EXTENED_DEBUG_INFO LOG_HEX(kiss_bc_frame.c_str(), (size_t) kiss_bc_frame.size()); #endif kiss_bc_frame.clear(); } /********************************************************************************** * **********************************************************************************/ bool tcp_init(bool connect_flag) { if(progdefaults.kiss_address.empty() || progdefaults.kiss_io_port.empty()) { LOG_DEBUG("%s", "KISS IP Address or Port null"); return false; } kiss_ip_address.assign(progdefaults.kiss_address); kiss_ip_io_port.assign(progdefaults.kiss_io_port); kiss_ip_out_port.assign(progdefaults.kiss_out_port); try { kiss_socket = new Socket(Address(kiss_ip_address.c_str(), kiss_ip_io_port.c_str(), "tcp")); kiss_socket->set_autoclose(true); kiss_socket->set_nonblocking(false); if(progdefaults.kiss_tcp_listen) kiss_socket->bind(); } catch (const SocketException& e) { LOG_ERROR("Could not resolve %s: %s", kiss_ip_address.c_str(), e.what()); if(kiss_socket) { kiss_socket->shut_down(); kiss_socket->close(); delete kiss_socket; kiss_socket = 0; kiss_enabled = 0; } return false; } if(connect_flag) { if(kiss_socket->connect1() == false) { LOG_INFO("Connection Failed: Host program present?"); kiss_socket->shut_down(); kiss_socket->close(); delete kiss_socket; kiss_socket = 0; kiss_enabled = 0; return false; } } return true; } /********************************************************************************** * **********************************************************************************/ bool udp_init(void) { if(progdefaults.kiss_address.empty() || progdefaults.kiss_io_port.empty()) { LOG_DEBUG("%s", "KISS IP Address or Port null"); return false; } kiss_ip_address.assign(progdefaults.kiss_address); kiss_ip_io_port.assign(progdefaults.kiss_io_port); kiss_ip_out_port.assign(progdefaults.kiss_out_port); try { kiss_socket = new Socket(Address(kiss_ip_address.c_str(), kiss_ip_io_port.c_str(), "udp")); kiss_socket->dual_port(&progdefaults.kiss_dual_port_enabled); kiss_socket->set_dual_port_number(kiss_ip_out_port); kiss_socket->set_autoclose(true); kiss_socket->set_nonblocking(false); if(progdefaults.kiss_tcp_listen) // Listen flag indcates server mode. kiss_socket->bindUDP(); } catch (const SocketException& e) { LOG_ERROR("Could not resolve %s: %s", kiss_ip_address.c_str(), e.what()); if(kiss_socket) { kiss_socket->shut_down(); kiss_socket->close(); delete kiss_socket; kiss_socket = 0; kiss_enabled = 0; } return false; } return true; } /********************************************************************************** * **********************************************************************************/ void kiss_reset_buffers(void) { { guard_lock to_host_lock(&to_host_mutex); if(!to_host.empty()) to_host.clear(); } { guard_lock to_host_lock(&from_radio_mutex); if(!from_radio.empty()) from_radio.clear(); } { guard_lock to_host_lock(&to_radio_mutex); pText = 0; kiss_text_available = false; if(!to_radio.empty()) to_radio.clear(); } { guard_lock kiss_bc_frame_lock(&kiss_bc_frame_mutex); if(!kiss_bc_frame.empty()) kiss_bc_frame.clear(); } } /********************************************************************************** * **********************************************************************************/ void kiss_reset(void) { kiss_reset_flag = true; kiss_text_available = false; duplex = KISS_HALF_DUPLEX; crc_mode = CRC16_NONE; smack_crc_enabled = false; pText = 0; if(data_io_enabled == KISS_IO) data_io_enabled = DISABLED_IO; MilliSleep(1000); kiss_reset_buffers(); if (trx_state == STATE_TX || trx_state == STATE_TUNE) { REQ(abort_tx); } kiss_reset_flag = false; if(data_io_enabled == DISABLED_IO) data_io_enabled = KISS_IO; } /********************************************************************************** * **********************************************************************************/ void kiss_init(bool connect_flag) { kiss_enabled = false; kiss_exit = false; tcpip_reset_flag = false; // progStatus.data_io_enabled (widget state), data_io_enabled (program state) if(progStatus.data_io_enabled == KISS_IO) { if(!(active_modem->iface_io() & KISS_IO)) { set_default_kiss_modem(); } } if(init_hist_flag) { memset(histogram, 0, sizeof(histogram)); init_hist_flag = false; } srand(time(0)); // For CSMA persistance update_kpsql_fractional_gain(progdefaults.kpsql_attenuation); data_io_type = DATA_IO_NA; if(progStatus.kiss_tcp_io) { if(retry_count > KISS_CONNECT_RETRY_COUNT) retry_count = KISS_CONNECT_RETRY_COUNT; if(progStatus.kiss_tcp_listen) connect_flag = false; do { if(tcp_init(connect_flag)) break; if(progStatus.kiss_tcp_listen) return; MilliSleep(KISS_RETRY_WAIT_TIME); if(retry_count-- > 0) continue; else return; } while(1); LOG_INFO("%s", "TCP Init - OK"); } else { if(!udp_init()) return; LOG_INFO("%s", "UDP Init - OK"); } Fl::awake(kiss_io_set_button_state, (void *) IO_START_STR); kiss_loop_running = false; if (pthread_create(&kiss_thread, NULL, kiss_loop, NULL) < 0) { LOG_ERROR("KISS kiss_thread: pthread_create failed"); return; } kiss_rx_loop_running = false; if (pthread_create(&kiss_rx_socket_thread, NULL, ReadFromHostSocket, NULL) < 0) { LOG_ERROR("KISS kiss_rx_socket_thread: pthread_create failed"); kiss_exit = true; pthread_join(kiss_thread, NULL); return; } if(progStatus.kiss_tcp_io) { data_io_type = DATA_IO_TCP; kiss_watchdog_running = false; if (pthread_create(&kiss_watchdog_thread, NULL, tcpip_watchdog, NULL) < 0) { LOG_ERROR("KISS kiss_watchdog_thread: pthread_create failed"); } } else { data_io_type = DATA_IO_UDP; } Fl::awake(kiss_io_set_button_state, (void *) IO_STOP_STR); if(progdefaults.data_io_enabled == KISS_IO) data_io_enabled = KISS_IO; kiss_enabled = true; allow_kiss_socket_io = true; } /********************************************************************************** * **********************************************************************************/ static void *tcpip_watchdog(void *args) { kiss_watchdog_running = true; kiss_watchdog_exit = false; struct timespec timeout; struct timeval tp; std::string package = ""; std::string cmd = "HOST:"; package.assign(cmd); memset(&timeout, 0, sizeof(timeout)); LOG_INFO("%s", "TCP/IP watch dog started"); kiss_watchdog_running = true; while(!kiss_watchdog_exit) { gettimeofday(&tp, NULL); timeout.tv_sec = tp.tv_sec + TEST_INTERVAL_SECONDS; timeout.tv_nsec = tp.tv_usec * 1000; pthread_mutex_lock(&kiss_loop_exit_mutex); pthread_cond_timedwait(&kiss_watchdog_cond, &kiss_loop_exit_mutex, &timeout); pthread_mutex_unlock(&kiss_loop_exit_mutex); // Send somthing every once in awhile to check if other side is still connected. // Data transfer fail handled by the data transfer routines. if(kiss_socket && !tcpip_reset_flag) if(kiss_socket->is_connected()) kiss_queue_frame(encap_kiss_frame(package, KISS_HARDWARE, kiss_port_no), cmd); } kiss_watchdog_running = false; LOG_INFO("%s", "TCP/IP watch dog stopped"); return (void *)0; } /********************************************************************************** * **********************************************************************************/ void kiss_main_thread_close(void *ptr) { kiss_close(true); } /********************************************************************************** * Only called from the main thread. **********************************************************************************/ void kiss_close(bool override_flag) { int max_loops = 100; int loop_delay_ms = 10; if(tcpip_reset_flag && !override_flag) return; if(kiss_socket) { if(kiss_socket->is_connected()) { kiss_reset_buffers(); send_disconnect_msg(); MilliSleep(500); // Wait a short period for outstanding // messages to be sent. } } else { return; } tcpip_reset_flag = true; kiss_text_available = false; allow_kiss_socket_io = false; if(data_io_type == DATA_IO_TCP && kiss_watchdog_running) { kiss_watchdog_exit = true; pthread_cond_signal(&kiss_watchdog_cond); for(int i = 0; i < max_loops; i++) { if(kiss_watchdog_running == false) break; MilliSleep(loop_delay_ms); } if(!kiss_watchdog_running) { pthread_join(kiss_watchdog_thread, NULL); LOG_INFO("%s", "kiss_watchdog_running - join"); } else { CANCEL_THREAD(kiss_watchdog_thread); LOG_INFO("%s", "kiss_watchdog_running - cancel"); } } if(data_io_enabled == KISS_IO) { data_io_enabled = DISABLED_IO; data_io_type = DATA_IO_NA; } kiss_rx_exit = true; if(kiss_socket) { kiss_socket->shut_down(); kiss_socket->close(); } for(int i = 0; i < max_loops; i++) { if(kiss_rx_loop_running == false) break; MilliSleep(loop_delay_ms); } if(!kiss_rx_loop_running) { pthread_join(kiss_rx_socket_thread, NULL); LOG_INFO("%s", "kiss_rx_loop_running - join"); } else { CANCEL_THREAD(kiss_rx_socket_thread); LOG_INFO("%s", "kiss_rx_loop_running - cancel"); } kiss_exit = 1; for(int i = 0; i < max_loops; i++) { if(kiss_loop_running == false) break; MilliSleep(loop_delay_ms); } if(!kiss_loop_running) { pthread_join(kiss_thread, NULL); LOG_INFO("%s", "kiss_loop_running - join"); } else { CANCEL_THREAD(kiss_thread); LOG_INFO("%s", "kiss_loop_running - cancel"); } LOG_INFO("%s", "Kiss loop terminated. "); kiss_socket = 0; kiss_enabled = false; kiss_loop_running = false; kiss_rx_loop_running = false; kiss_watchdog_running = false; Fl::awake(kiss_io_set_button_state, (void *) IO_START_STR); tcpip_reset_flag = false; if((retry_count > 0) && progStatus.kiss_tcp_io) Fl::awake(kiss_main_thread_retry_open, (void *) 0); } /********************************************************************************** * **********************************************************************************/ void kiss_main_thread_retry_open(void *ptr) { if(!progStatus.kiss_tcp_listen) MilliSleep(KISS_RETRY_WAIT_TIME); connect_to_kiss_io(false); } /********************************************************************************** * **********************************************************************************/ void connect_to_kiss_io(bool user_requested) { guard_lock external_lock(&restart_mutex); if(kiss_socket) { if(user_requested) retry_count = 0; kiss_close(true); if(user_requested) return; } if(user_requested || progStatus.kiss_tcp_listen) retry_count = KISS_CONNECT_RETRY_COUNT; if(retry_count > 0) { retry_count--; kiss_init(progdefaults.kiss_tcp_listen ? false : true); } } /********************************************************************************** * **********************************************************************************/ bool kiss_thread_running(void) { return (bool) kiss_enabled; } /********************************************************************************** * **********************************************************************************/ int kiss_get_char(void) { /// Mutex is unlocked when returning from function guard_lock to_radio_lock(&to_radio_mutex); int c = 0; static bool toggle_flag = 0; if (kiss_text_available) { if (pText != (int)to_radio.length()) { c = to_radio[pText++] & 0xFF; toggle_flag = true; } else { kiss_text_available = false; to_radio.clear(); pText = 0; c = GET_TX_CHAR_ETX; if(toggle_flag) { bcast_tx_buffer_empty_kiss_frame(); toggle_flag = 0; } } } return c; } fldigi-4.2.05/src/misc/charsetdistiller.cxx0000664000175000017500000001501214611711171015575 00000000000000// ---------------------------------------------------------------------------- // charsetdistiller.cxx -- input charset cleaning and conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "debug.h" #include "charsetdistiller.h" #include "tiniconv.h" /* CharsetDistiller This class implements a charset "distiller" that receives input data one byte at a time and converts this data stream from a particular character set into UTF-8. Invalid input data is treated as if it was encoded in CP1252. Character set conversion is performed as soon as possible, i.e., when enough input is received to constitute a valid character in the input character set, this character is immediatly converted into UTF-8 and made available at the output. */ /* The constructor. Look up tiniconv.h for the list of possible values of charset_in. */ CharsetDistiller::CharsetDistiller(const int charset_in) { bufptr = buf; nutf8 = 0; tiniconv_init(charset_in, TINICONV_CHARSET_UTF_8, 0, &ctx); tiniconv_init(TINICONV_CHARSET_CP1252, TINICONV_CHARSET_UTF_8, TINICONV_OPTION_IGNORE_IN_ILSEQ, &ctx1252); } /* Change the input encoding. Look up tiniconv.h for the list of possible values of charset_in. Returns 0 if successful or -1 in case of error. */ int CharsetDistiller::set_input_encoding(const int charset_in) { flush(); return tiniconv_init(charset_in, TINICONV_CHARSET_UTF_8, 0, &ctx); } /* Receive a single byte of input data and make an immediate conversion attempt. */ void CharsetDistiller::rx(const unsigned char c) { *bufptr++ = c; process_buffer(); } /* Receive a zero-terminated string of input data. This is a convenience method: it merely feeds the string into the distiller one byte at a time. */ void CharsetDistiller::rx(const unsigned char *c) { const unsigned char *ptr; for (ptr = c; *ptr != 0; ptr++) rx(*ptr); } /* Examine the input buffer and decide on the possible actions (construct an UTF-8 character, interpret the bytes as invalid input etc.) */ void CharsetDistiller::process_buffer(void) { bool again = true; while (again) { if (bufptr == buf) { // the buffer is empty return; } int convert_status; int consumed_in; int consumed_out; unsigned char outbuf[6]; convert_status = tiniconv_convert(&ctx, buf, (bufptr - buf), &consumed_in, outbuf, sizeof(outbuf), &consumed_out); if (consumed_out) { // Append the converted data to the output string. outdata.append(reinterpret_cast(outbuf), consumed_out); // Count the number of converted UTF-8 characters (by counting the // number of bytes that are not continuation bytes). for (unsigned char *iptr = outbuf; iptr < outbuf + consumed_out; iptr++) { if ((*iptr & 0xc0) != 0x80) nutf8++; } // If not all input was consumed, move the remaining data to the // beginning of the buffer if (bufptr - buf > consumed_in) { memmove(buf, buf + consumed_in, bufptr - buf - consumed_in); bufptr -= consumed_in; } else bufptr = buf; } again = false; if (convert_status == TINICONV_CONVERT_OK) { // Successful conversion, nothing else to do. return; } else if (convert_status == TINICONV_CONVERT_IN_TOO_SMALL) { // Partial data left in the input buffer. We can't proceed with the // conversion until we get more input. return; } else if (convert_status == TINICONV_CONVERT_IN_ILSEQ) { // Invalid sequence in input; spit out the offending byte and try again. shift_first_out(); again = true; } else if (convert_status == TINICONV_CONVERT_OUT_TOO_SMALL) { // More characters were available than could be converted in one // go. Have another round. again = true; } // The following two cases should never happen. else if (convert_status == TINICONV_CONVERT_OUT_ILSEQ) { LOG_ERROR("Character not representable in UTF-8? Is this possible?"); bufptr = buf; return; } else { LOG_ERROR("Unknown tiniconv return value %d.", convert_status); bufptr = buf; return; } } } /* Convert the first byte of the input buffer; treat it as if it was encoded in CP1252 */ void CharsetDistiller::shift_first_out(void) { int consumed_in; int consumed_out; unsigned char outbuf[6]; tiniconv_convert(&ctx1252, buf, 1, &consumed_in, outbuf, sizeof(outbuf), &consumed_out); outdata.append(reinterpret_cast(outbuf), consumed_out); nutf8++; memmove(buf, buf+1, (bufptr - buf - 1)); bufptr--; } /* Flush input. Recode the input data left in the buffer in whatever way necessary to make the buffer empty. */ void CharsetDistiller::flush(void) { while (bufptr > buf) shift_first_out(); } /* Reset input buffer. All data still waiting in the input buffer is lost. Data already converted and waiting at the output is not affected. */ void CharsetDistiller::reset(void) { bufptr = buf; } /* Clear the output buffer. */ void CharsetDistiller::clear(void) { outdata.clear(); nutf8 = 0; } /* Return the number of bytes available in the output buffer. */ int CharsetDistiller::data_length(void) { return outdata.length(); } /* Return the number of UTF-8 characters in the output buffer. */ int CharsetDistiller::num_chars(void) { return nutf8; } /* Return a reference to the output buffer. */ const std::string &CharsetDistiller::data(void) { return outdata; } fldigi-4.2.05/src/misc/macroedit.cxx0000664000175000017500000004120514611711171014202 00000000000000// ---------------------------------------------------------------------------- // macroedit.cxx // // Copyright (C) 2007-2009 // Dave Freese, W1HKJ // Copyright (C) 2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #ifndef __MINGW32__ # include #endif #include #include #include #include #include #include "macros.h" #include "macroedit.h" #include "globals.h" #include "status.h" #include "fileselect.h" #include "fl_digi.h" #include "main.h" #include "gettext.h" #include "pixmaps.h" #include "configuration.h" Fl_Double_Window *MacroEditDialog = (Fl_Double_Window *)0; Fl_Button *btnMacroEditApply = (Fl_Button *)0; Fl_Button *btnMacroEditClose = (Fl_Button *)0; Fl_Button *btnInsertMacro = (Fl_Button *)0; Fl_Input2 *macrotext = (Fl_Input2 *)0; Fl_Input2 *labeltext = (Fl_Input2 *)0; static int widths[] = {150, 0}; Fl_Hold_Browser *macroDefs=(Fl_Hold_Browser *)0; static int iMacro, iType; static Fl_Input* iInput; // fl_color(0) is always the foreground colour #define LINE_SEP "@B0" void loadBrowser(Fl_Widget *widget) { Fl_Browser *w = (Fl_Browser *)widget; /* Do not translate the tags lefthand-side */ w->add(_("\tmy frequency")); w->add(_("\tmode")); w->add(_("\tmy call")); w->add(_("\tmy locator")); w->add(_("\tmy name")); w->add(_("\tmy QTH (city)")); w->add(_("\tmy RST")); w->add(_("\tmy FD class")); w->add(_("\tmy FD section")); w->add(_("\tmy state")); w->add(_("\tmy ST")); w->add(_("\tmy county")); w->add(_("\tmy CNTY")); w->add(_("\tmy antenna")); w->add(_("\toperating band")); w->add(_("\ttransmit power")); w->add(_("\tFldigi version")); w->add(_("\tdigital mode (adif)")); w->add(LINE_SEP); w->add(_("\tother call")); w->add(_("\tother name")); w->add(_("\tother QTH")); w->add(_("\tother State")); w->add(_("\tother Province")); w->add(_("\tother locator")); w->add(_("\tother RST")); w->add(LINE_SEP); w->add(_("\tS/N etc.")); w->add(_("\tIMD etc.")); w->add(LINE_SEP); w->add(_("\t# QSO recs")); w->add(_("\tnext QSO rec #")); w->add(LINE_SEP); w->add(_("\tmap on google")); w->add(_("\tmap by value")); w->add(LINE_SEP); w->add(_("\tclear RX pane")); w->add(_("\tclear TX pane")); w->add(_("\tclear QSO fields")); w->add(LINE_SEP); w->add(_("\ttext to NAME/QTH")); #ifdef __WIN32__ w->add(LINE_SEP); w->add(_("\tDigitalk On, Off, Toggle")); #endif w->add(LINE_SEP); w->add(_("\tclear log fields")); w->add(_("\tsave QSO data")); w->add(_("\tsaveQSO data, append msg to notes")); w->add(_("\tlog at xmt time")); w->add(_("\tsaveQSO data, append msg to notes")); w->add(_("\tlog eQSL")); w->add(_("\tlog eQSL optional msg")); w->add(LINE_SEP); w->add(_("\tQSO time (HHMM))")); w->add(_("\tLDT default '%Y-%m-%d %H:%M%z'")); w->add(_("\tLocal datetime, default '%x %H:%M %Z'")); w->add(_("\tZDT default '%Y-%m-%d %H:%MZ'")); w->add(_("\tUTC datetime, default '%x %H:%MZ'")); w->add(_("\tlocal time, default %H%M")); w->add(_("\tzulu time default %H%MZ")); w->add(_("\tlocal date, default '%Y-%M-%D'")); w->add(_("\tzulu date, default '%Y-%M-%D Z'")); w->add(_("\tget weather data")); w->add(_("\tget weather data for station")); w->add(LINE_SEP); w->add(_("\tcontest counter")); w->add(_("\tdecrement counter")); w->add(_("\tincrement counter")); w->add(_("\texchange in")); w->add(_("\texchange out")); w->add(_("\texchange begin")); w->add(_("\texchange end")); w->add(_("\tsave contest out")); w->add(_("\tcurrent contest serno")); w->add(_("\tlast serno sent")); w->add(_("\tFD class")); w->add(_("\tFD section")); w->add(_("\tcontest class")); w->add(_("
\tARRL section")); w->add(LINE_SEP); w->add(_("\treceive")); w->add(_("\ttransmit")); w->add(_("\ttoggle T/R")); w->add(_("\tsearch UP for signal")); w->add(_("\tsearch DOWN for signal")); w->add(_("\treturn to sweet spot")); w->add(_("\tmove to freq NNNN Hz")); w->add(_("\tleft-clk QSY button")); w->add(_("\tright-clk QSY button")); w->add(_("\tqsy to kHz, Hz")); w->add(_("\tincr/decr xcvr freq")); w->add(_("\tvalid xcvr mode")); w->add(_("\tvalid xcvr filter width")); w->add(_("\tvalid xcvr low cutoff filter")); w->add(_("\tvalid xcvr hi cutoff filter")); w->add(_("\trig freq has kbd focus")); w->add(LINE_SEP); w->add(_("\tinsert QRG into Rx text")); w->add(LINE_SEP); w->add(_("\tinsert text file")); w->add(_("\tinsert image file")); w->add(_("\tsend avatar")); w->add(LINE_SEP); w->add(_("\tpause transmit")); w->add(_("\tidle signal for NN.nn sec")); w->add(_("\trepeat every NN sec")); w->add(_("\trepeat after waiting NN sec")); w->add(_("\ttune signal for NN sec")); w->add(_("\tdelay xmt for NN.n sec")); w->add(_("\trepeat macro continuously")); w->add(_("\tschedule execution for")); w->add(_("\tend execution at")); w->add(_("\tuse local date/time")); w->add(LINE_SEP); w->add(_("\t set xmt attenuator")); w->add(LINE_SEP); w->add(_("\tCW identifier")); w->add(_("\tsend mode ID; TX start only")); w->add(_("\ttext at start of TX")); w->add(_("\tvideo text in TX stream")); w->add(_("\tTx RSID on,off,toggle")); w->add(_("\tRx RSID on,off,toggle")); w->add(_("\tTransmit |NN| successive RsID bursts")); w->add(_("\t[Wait][Len](ms)")); w->add(LINE_SEP); w->add(_("\tXmt audio wav file")); w->add(LINE_SEP); w->add(_("")); w->add(_("\talert using external wav file")); w->add(LINE_SEP); w->add(_("\tCW QSK post-timing")); w->add(_("\tCW QSK pre-timing")); w->add(_("\tCW rise time")); w->add(_("\tChar WPM:Text WPM (15.0:5.0)")); w->add(LINE_SEP); w->add(_("\tsend CAT cmd")); w->add(_("\tsend CAT cmd")); w->add(LINE_SEP); w->add(_("\tAFC on,off,toggle")); w->add(_("\tLOCK on,off,toggle")); w->add(_("\tRev on,off,toggle")); w->add(_("\tDigital Squelch on, off,toggle")); w->add(_("\tDigital Squelch level, 0..100")); w->add(LINE_SEP); w->add(_("\tchange macro defs file")); w->add(_("\tsave current macro file")); w->add(_("\trun macro from buffered teext")); w->add(LINE_SEP); w->add(_("\tignore comment text")); w->add(_("<#comments>\t ignore comments")); w->add(LINE_SEP); w->add(_("\tmodem char/sec test on nn chars")); w->add(_("\tmodem timing test, 'n' random 5 char groups")); w->add(_("\tmodem timing test, spec' file")); w->add(_("\tmodem timing test, string 's'")); w->add(LINE_SEP); w->add(_("\tWAV file; internal string")); w->add(_("\tWAV file; 'n' random 5 char groups")); w->add(_("\tWAV file; spec' file")); w->add(_("\tWAV file; string 's'")); w->add(LINE_SEP); w->add(_("\tAnalysis CSV on,off,toggle")); w->add(LINE_SEP); w->add(_("\tpush current mode to stack")); w->add(_("\tpush current mode / audio freq to stack")); w->add(_("\tpop current mode/freq from stack")); w->add(LINE_SEP); assert(MODE_CONTESTIA < MODE_OLIVIA); char s[256]; for (trx_mode i = 0; i <= MODE_CONTESTIA; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } // add some Contestia macros const char* contestia[] = { "250:8", "250:16", "500:8", "500:16", "1000:8", "1000:16" }; for (size_t i = 0; i < sizeof(contestia)/sizeof(*contestia); i++) { snprintf(s, sizeof(s), "", mode_info[MODE_CONTESTIA].sname, contestia[i]); w->add(s); } for (trx_mode i = MODE_CONTESTIA + 1; i <= MODE_OLIVIA; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } assert(MODE_OLIVIA < MODE_RTTY); // add some Olivia macros const char* olivia[] = { "250:8", "250:16", "500:8", "500:16", "1000:8", "500:32", "1000:32" }; for (size_t i = 0; i < sizeof(olivia)/sizeof(*olivia); i++) { snprintf(s, sizeof(s), "", mode_info[MODE_OLIVIA].sname, olivia[i]); w->add(s); } for (trx_mode i = MODE_OLIVIA + 1; i <= MODE_RTTY; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } // add some RTTY macros const char* rtty[] = { "170:45.45:5", "170:50:5", "850:75:5" }; for (size_t i = 0; i < sizeof(rtty)/sizeof(*rtty); i++) { snprintf(s, sizeof(s), "", mode_info[MODE_RTTY].sname, rtty[i]); w->add(s); } for (trx_mode i = MODE_RTTY + 1; i < NUM_MODES; i++) { snprintf(s, sizeof(s), "", mode_info[i].sname); w->add(s); } #ifndef __MINGW32__ glob_t gbuf; glob(std::string(ScriptsDir).append("*").c_str(), 0, NULL, &gbuf); if (gbuf.gl_pathc == 0) { globfree(&gbuf); return; } w->add(LINE_SEP); struct stat st; # if defined(__OpenBSD__) for (int i = 0; i < gbuf.gl_pathc; i++) { # else for (size_t i = 0; i < gbuf.gl_pathc; i++) { # endif if (!(stat(gbuf.gl_pathv[i], &st) == 0 && S_ISREG(st.st_mode) && (st.st_mode & S_IXUSR))) continue; const char* p; if ((p = strrchr(gbuf.gl_pathv[i], '/'))) { snprintf(s, sizeof(s), "%s", p+1); w->add(s); } } globfree(&gbuf); #else w->add("\tlaunch a program"); #endif } void cbMacroEditOK(Fl_Widget *w, void *) { if (w == btnMacroEditClose) { MacroEditDialog->hide(); return; } if (iType == MACRO_EDIT_BUTTON) { update_macro_button(iMacro, macrotext->value(), labeltext->value()); } else if (iType == MACRO_EDIT_INPUT) iInput->value(macrotext->value()); } void update_macro_button(int iMacro, const char *text, const char *name) { macros.text[iMacro].assign(text); macros.name[iMacro].assign(name); if (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX) { if (iMacro < NUMMACKEYS) { btnMacro[iMacro]->label( macros.name[iMacro].c_str() ); btnMacro[iMacro]->redraw_label(); } else if ((iMacro / NUMMACKEYS) == altMacros) { btnMacro[(iMacro % NUMMACKEYS) + NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[(iMacro % NUMMACKEYS) + NUMMACKEYS]->redraw_label(); } } else { btnMacro[iMacro % NUMMACKEYS]->label( macros.name[iMacro].c_str() ); btnMacro[iMacro % NUMMACKEYS]->redraw_label(); } btnDockMacro[iMacro]->label(macros.name[iMacro].c_str()); btnDockMacro[iMacro]->redraw_label(); macros.changed = true; } void cbInsertMacro(Fl_Widget *, void *) { int nbr = macroDefs->value(); if (!nbr) return; std::string edittext = macrotext->value(); std::string text = macroDefs->text(nbr); size_t tab = text.find('\t'); if (tab != std::string::npos) text.erase(tab); if (text == LINE_SEP) return; if (text == "") { std::string filters = "Text\t*.txt"; const char* p = FSEL::select( _("Text file to insert"), filters.c_str(), HomeDir.c_str()); if (p && *p) { text.insert(6, p); } else text = ""; } else if ((text == "") || (text == "")) { std::string filters = "Text\t*.txt"; const char* p = FSEL::select( _("Test text file"), filters.c_str(), HomeDir.c_str()); if (p && *p) { text.insert(10, p); } else text = ""; } else if (text == "") { std::string filters = "*.{png,jpg,bmp}\t*.png"; const char *p = FSEL::select( _("MFSK image file"), filters.c_str(), PicsDir.c_str()); if (p && *p) { text.insert(7, p); } else text = ""; } else if (text == "") { std::string filters = "Macrost\t*.mdf"; const char* p = FSEL::select( _("Change to Macro file"), filters.c_str(), MacrosDir.c_str()); if (p && *p) { text.insert(8, p); } else text = ""; } else if (text == "") { std::string filters = "Audio file\t*.{mp3,wav}"; const char* p = FSEL::select( _("Select audio file"), filters.c_str(), HomeDir.c_str()); if (p && *p) { text.insert(7, p); } else text = ""; } else if (text == "") { std::string filters = "Audio file\t*.{mp3,wav}"; const char* p = FSEL::select( _("Select audio file"), filters.c_str(), HomeDir.c_str()); if (p && *p) { text.insert(7, p); } else text = ""; } #ifdef __MINGW32__ else if (text == "") { std::string filters = "Exe\t*.exe"; const char* p = FSEL::select( _("Executable file to insert"), filters.c_str(), HomeDir.c_str()); if (p && *p) { std::string exefile = p; exefile.append(""); text.insert(6, exefile); } else text = ""; } #endif macrotext->insert(text.c_str()); macrotext->take_focus(); } #include Fl_Double_Window* make_macroeditor(void) { Fl_Double_Window* w = new Fl_Double_Window(800, 190, ""); Fl_Group *grpA = new Fl_Group(0, 0, 800, 22); Fl_Group *grpB = new Fl_Group(450, 0, 350, 22); btnInsertMacro = new Fl_Button(450, 2, 40, 20); btnInsertMacro->image(new Fl_Pixmap(left_arrow_icon)); btnInsertMacro->callback(cbInsertMacro); grpB->end(); grpA->end(); Fl_Group *grpC = new Fl_Group(0, 22, 800, 140); Fl_Tile *tile = new Fl_Tile(0,22,800,140); macrotext = new Fl_Input2(0, 22, 450, 140, _("Macro Text")); macrotext->type(FL_MULTILINE_INPUT); macrotext->textfont(FL_HELVETICA); macrotext->align(FL_ALIGN_TOP); macroDefs = new Fl_Hold_Browser(450, 22, 350, 140, _("Select Tag")); macroDefs->column_widths(widths); macroDefs->align(FL_ALIGN_TOP); Fl_Box *minbox = new Fl_Box(200, 22, 400, 140); minbox->hide(); tile->end(); tile->resizable(minbox); grpC->end(); Fl_Group *grpD = new Fl_Group(0, 164, 452, 24); Fl_Box *box3a = new Fl_Box(0, 164, 327, 24, ""); labeltext = new Fl_Input2(337, 164, 115, 24, _("Macro Button Label")); labeltext->textfont(FL_HELVETICA); grpD->end(); grpD->resizable(box3a); Fl_Group *grpE = new Fl_Group(452, 164, 348, 24); Fl_Box *box4a = new Fl_Box(452, 164, 92, 24, ""); btnMacroEditApply = new Fl_Button(544, 164, 80, 24, _("Apply")); btnMacroEditApply->callback(cbMacroEditOK); btnMacroEditClose = new Fl_Button(626 , 164, 80, 24, _("Close")); btnMacroEditClose->callback(cbMacroEditOK); grpE->end(); grpE->resizable(box4a); w->end(); w->resizable(grpC); w->size_range( 600, 120); w->xclass(PACKAGE_NAME); loadBrowser(macroDefs); w->set_non_modal(); return w; } void editMacro(int n, int t, Fl_Input* in) { if (!MacroEditDialog) MacroEditDialog = make_macroeditor(); if (t == MACRO_EDIT_BUTTON) { std::string editor_label; editor_label.append(_("Macro editor - ")).append(progStatus.LastMacroFile); if (editor_label != MacroEditDialog->label()) MacroEditDialog->copy_label(editor_label.c_str()); macrotext->value(macros.text[n].c_str()); labeltext->value(macros.name[n].c_str()); labeltext->show(); } else if (t == MACRO_EDIT_INPUT) { MacroEditDialog->label(in->label()); macrotext->value(in->value()); labeltext->hide(); } macrotext->textfont(progdefaults.MacroEditFontnbr); macrotext->textsize(progdefaults.MacroEditFontsize); iMacro = n; iType = t; iInput = in; MacroEditDialog->show(); } void update_macroedit_font() { if (!MacroEditDialog) return; if (!MacroEditDialog->visible()) return; macrotext->textfont(progdefaults.MacroEditFontnbr); macrotext->textsize(progdefaults.MacroEditFontsize); MacroEditDialog->redraw(); } fldigi-4.2.05/src/misc/outputencoder.cxx0000664000175000017500000001010714611711171015130 00000000000000// ---------------------------------------------------------------------------- // outputencoder.cxx -- output charset conversion // // Copyright (C) 2012 // Andrej Lajovic, S57LN // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "config.h" #include "debug.h" /* OutputEncoder accepts UTF-8 strings at input, converts them to the selected encoding and outputs them one character at a time. */ /* Constructor. Look up tiniconv.h for the list of possible values of charset_in. */ OutputEncoder::OutputEncoder(const int charset_out, unsigned int buffer_size) { this->buffer_size = buffer_size; buffer = new unsigned char[buffer_size]; encoding_ptr = buffer; pop_ptr = buffer; set_output_encoding(charset_out); } /* Destructor. */ OutputEncoder::~OutputEncoder(void) { delete[] buffer; } /* Set output encoding. Look up tiniconv.h for the list of possible values of charset_in. */ void OutputEncoder::set_output_encoding(const int charset_out) { tiniconv_init(TINICONV_CHARSET_UTF_8, charset_out, TINICONV_OPTION_IGNORE_OUT_ILSEQ, &ctx); } /* Push input data into the encoder. */ void OutputEncoder::push(std::string s) { int available = buffer_size - (encoding_ptr - buffer); int consumed_in; int consumed_out; int status = tiniconv_convert(&ctx, (unsigned char*)s.data(), s.length(), &consumed_in, encoding_ptr, available, &consumed_out); if (status != TINICONV_CONVERT_OK) { LOG_ERROR("Error %s", status == TINICONV_CONVERT_IN_TOO_SMALL ? "input too small" : status == TINICONV_CONVERT_OUT_TOO_SMALL ? "output too small" : status == TINICONV_CONVERT_IN_ILSEQ ? "input illegal sequence" : status == TINICONV_CONVERT_OUT_ILSEQ ? "output illegal sequence" : "unknown error"); return; } encoding_ptr += consumed_out; if (consumed_in < (int)s.length()) { // All input data was not consumed, possibly because the // output buffer was too small. Try to vacuum the buffer, // i.e., remove the data that was already pop()ed. memmove(buffer, pop_ptr, buffer + buffer_size - pop_ptr); encoding_ptr -= (pop_ptr - buffer); pop_ptr = buffer; // Now try again; fingers crossed. We don't check for // success anymore, because there is nothing that we can do // if the buffer is still too small. int available = buffer_size - (encoding_ptr - buffer); tiniconv_convert(&ctx, (unsigned char*)s.data()+consumed_in, s.length()-consumed_in, &consumed_in, encoding_ptr, available, &consumed_out); encoding_ptr += consumed_out; } } /* Pop a single character of the encoded data. Returns -1 in case there is no data available. */ const unsigned int OutputEncoder::pop(void) { if (pop_ptr == encoding_ptr) return(-1); unsigned int c = *pop_ptr++; // Note that by only advancing pop_ptr, we leave stale data at the // beginning of the buffer, so sooner or later it will clutter up. // If there is no data left to send, both encoding_ptr and pop_ptr // can be safely reset to the beginning of the buffer; we handle // this trivial case here. More thorough vacuuming will be performed // in push() if the need arises. if (pop_ptr == encoding_ptr) pop_ptr = encoding_ptr = buffer; return(c); } // return next character to be pop'd, do not advance pointers; const unsigned int OutputEncoder::peek(void) { if (pop_ptr == encoding_ptr) return -1; return *pop_ptr; } fldigi-4.2.05/src/misc/estrings.cxx0000664000175000017500000004775614532252172014115 00000000000000#include "estrings.h" #ifdef __MINGW32__ static std::string unknown = "UNKNOWN ERROR"; ESTRINGS emap[] = { {NO_ERROR, "NO ERROR"}, {ERROR_INVALID_FUNCTION, "INVALID_FUNCTION"}, {ERROR_FILE_NOT_FOUND, "FILE_NOT_FOUND"}, {ERROR_PATH_NOT_FOUND, "PATH_NOT_FOUND"}, {ERROR_TOO_MANY_OPEN_FILES, "TOO_MANY_OPEN_FILES"}, {ERROR_ACCESS_DENIED, "ACCESS_DENIED"}, {ERROR_INVALID_HANDLE, "INVALID_HANDLE"}, {ERROR_ARENA_TRASHED, "ARENA_TRASHED"}, {ERROR_NOT_ENOUGH_MEMORY, "NOT_ENOUGH_MEMORY"}, {ERROR_INVALID_BLOCK, "INVALID_BLOCK"}, {ERROR_BAD_ENVIRONMENT, "BAD_ENVIRONMENT"}, {ERROR_BAD_FORMAT, "BAD_FORMAT"}, {ERROR_INVALID_ACCESS, "INVALID_ACCESS"}, {ERROR_INVALID_DATA, "INVALID_DATA"}, {ERROR_OUTOFMEMORY, "OUTOFMEMORY"}, {ERROR_INVALID_DRIVE, "INVALID_DRIVE"}, {ERROR_CURRENT_DIRECTORY, "CURRENT_DIRECTORY"}, {ERROR_NOT_SAME_DEVICE, "NOT_SAME_DEVICE"}, {ERROR_NO_MORE_FILES, "NO_MORE_FILES"}, {ERROR_WRITE_PROTECT, "WRITE_PROTECT"}, {ERROR_BAD_UNIT, "BAD_UNIT"}, {ERROR_NOT_READY, "NOT_READY"}, {ERROR_BAD_COMMAND, "BAD_COMMAND"}, {ERROR_CRC, "CRC"}, {ERROR_BAD_LENGTH, "BAD_LENGTH"}, {ERROR_SEEK, "SEEK"}, {ERROR_NOT_DOS_DISK, "NOT_DOS_DISK"}, {ERROR_SECTOR_NOT_FOUND, "SECTOR_NOT_FOUND"}, {ERROR_OUT_OF_PAPER, "OUT_OF_PAPER"}, {ERROR_WRITE_FAULT, "WRITE_FAULT"}, {ERROR_READ_FAULT, "READ_FAULT"}, {ERROR_GEN_FAILURE, "GEN_FAILURE"}, {ERROR_SHARING_VIOLATION, "SHARING_VIOLATION"}, {ERROR_LOCK_VIOLATION, "LOCK_VIOLATION"}, {ERROR_WRONG_DISK, "WRONG_DISK"}, {ERROR_SHARING_BUFFER_EXCEEDED, "SHARING_BUFFER_EXCEEDED"}, {ERROR_HANDLE_EOF, "HANDLE_EOF"}, {ERROR_HANDLE_DISK_FULL, "HANDLE_DISK_FULL"}, {ERROR_NOT_SUPPORTED, "NOT_SUPPORTED"}, {ERROR_REM_NOT_LIST, "REM_NOT_LIST"}, {ERROR_DUP_NAME, "DUP_NAME"}, {ERROR_BAD_NETPATH, "BAD_NETPATH"}, {ERROR_NETWORK_BUSY, "NETWORK_BUSY"}, {ERROR_DEV_NOT_EXIST, "DEV_NOT_EXIST"}, {ERROR_TOO_MANY_CMDS, "TOO_MANY_CMDS"}, {ERROR_ADAP_HDW_ERR, "ADAP_HDW_ERR"}, {ERROR_BAD_NET_RESP, "BAD_NET_RESP"}, {ERROR_UNEXP_NET_ERR, "UNEXP_NET_ERR"}, {ERROR_BAD_REM_ADAP, "BAD_REM_ADAP"}, {ERROR_PRINTQ_FULL, "PRINTQ_FULL"}, {ERROR_NO_SPOOL_SPACE, "NO_SPOOL_SPACE"}, {ERROR_PRINT_CANCELLED, "PRINT_CANCELLED"}, {ERROR_NETNAME_DELETED, "NETNAME_DELETED"}, {ERROR_NETWORK_ACCESS_DENIED, "NETWORK_ACCESS_DENIED"}, {ERROR_BAD_DEV_TYPE, "BAD_DEV_TYPE"}, {ERROR_BAD_NET_NAME, "BAD_NET_NAME"}, {ERROR_TOO_MANY_NAMES, "TOO_MANY_NAMES"}, {ERROR_TOO_MANY_SESS, "TOO_MANY_SESS"}, {ERROR_SHARING_PAUSED, "SHARING_PAUSED"}, {ERROR_REQ_NOT_ACCEP, "REQ_NOT_ACCEP"}, {ERROR_REDIR_PAUSED, "REDIR_PAUSED"}, {ERROR_FILE_EXISTS, "FILE_EXISTS"}, {ERROR_CANNOT_MAKE, "CANNOT_MAKE"}, {ERROR_FAIL_I24, "FAIL_I24"}, {ERROR_OUT_OF_STRUCTURES, "OUT_OF_STRUCTURES"}, {ERROR_ALREADY_ASSIGNED, "ALREADY_ASSIGNED"}, {ERROR_INVALID_PASSWORD, "INVALID_PASSWORD"}, {ERROR_INVALID_PARAMETER, "INVALID_PARAMETER"}, {ERROR_NET_WRITE_FAULT, "NET_WRITE_FAULT"}, {ERROR_NO_PROC_SLOTS, "NO_PROC_SLOTS"}, {ERROR_TOO_MANY_SEMAPHORES, "TOO_MANY_SEMAPHORES"}, {ERROR_EXCL_SEM_ALREADY_OWNED, "EXCL_SEM_ALREADY_OWNED"}, {ERROR_SEM_IS_SET, "SEM_IS_SET"}, {ERROR_TOO_MANY_SEM_REQUESTS, "TOO_MANY_SEM_REQUESTS"}, {ERROR_INVALID_AT_INTERRUPT_TIME, "INVALID_AT_INTERRUPT_TIME"}, {ERROR_SEM_OWNER_DIED, "SEM_OWNER_DIED"}, {ERROR_SEM_USER_LIMIT, "SEM_USER_LIMIT"}, {ERROR_DISK_CHANGE, "DISK_CHANGE"}, {ERROR_DRIVE_LOCKED, "DRIVE_LOCKED"}, {ERROR_BROKEN_PIPE, "BROKEN_PIPE"}, {ERROR_OPEN_FAILED, "OPEN_FAILED"}, {ERROR_BUFFER_OVERFLOW, "BUFFER_OVERFLOW"}, {ERROR_DISK_FULL, "DISK_FULL"}, {ERROR_NO_MORE_SEARCH_HANDLES, "NO_MORE_SEARCH_HANDLES"}, {ERROR_INVALID_TARGET_HANDLE, "INVALID_TARGET_HANDLE"}, {ERROR_INVALID_CATEGORY, "INVALID_CATEGORY"}, {ERROR_INVALID_VERIFY_SWITCH, "INVALID_VERIFY_SWITCH"}, {ERROR_BAD_DRIVER_LEVEL, "BAD_DRIVER_LEVEL"}, {ERROR_CALL_NOT_IMPLEMENTED, "CALL_NOT_IMPLEMENTED"}, {ERROR_SEM_TIMEOUT, "SEM_TIMEOUT"}, {ERROR_INSUFFICIENT_BUFFER, "INSUFFICIENT_BUFFER"}, {ERROR_INVALID_NAME, "INVALID_NAME"}, {ERROR_INVALID_LEVEL, "INVALID_LEVEL"}, }; /* ERROR_NO_VOLUME_LABEL 125L ERROR_MOD_NOT_FOUND 126L ERROR_PROC_NOT_FOUND 127L ERROR_WAIT_NO_CHILDREN 128L ERROR_CHILD_NOT_COMPLETE 129L ERROR_DIRECT_ACCESS_HANDLE 130L ERROR_NEGATIVE_SEEK 131L ERROR_SEEK_ON_DEVICE 132L ERROR_IS_JOIN_TARGET 133L ERROR_IS_JOINED 134L ERROR_IS_SUBSTED 135L ERROR_NOT_JOINED 136L ERROR_NOT_SUBSTED 137L ERROR_JOIN_TO_JOIN 138L ERROR_SUBST_TO_SUBST 139L ERROR_JOIN_TO_SUBST 140L ERROR_SUBST_TO_JOIN 141L ERROR_BUSY_DRIVE 142L ERROR_SAME_DRIVE 143L ERROR_DIR_NOT_ROOT 144L ERROR_DIR_NOT_EMPTY 145L ERROR_IS_SUBST_PATH 146L ERROR_IS_JOIN_PATH 147L ERROR_PATH_BUSY 148L ERROR_IS_SUBST_TARGET 149L ERROR_SYSTEM_TRACE 150L ERROR_INVALID_EVENT_COUNT 151L ERROR_TOO_MANY_MUXWAITERS 152L ERROR_INVALID_LIST_FORMAT 153L ERROR_LABEL_TOO_LONG 154L ERROR_TOO_MANY_TCBS 155L ERROR_SIGNAL_REFUSED 156L ERROR_DISCARDED 157L ERROR_NOT_LOCKED 158L ERROR_BAD_THREADID_ADDR 159L ERROR_BAD_ARGUMENTS 160L ERROR_BAD_PATHNAME 161L ERROR_SIGNAL_PENDING 162L ERROR_MAX_THRDS_REACHED 164L ERROR_LOCK_FAILED 167L ERROR_BUSY 170L ERROR_CANCEL_VIOLATION 173L ERROR_ATOMIC_LOCKS_NOT_SUPPORTED 174L ERROR_INVALID_SEGMENT_NUMBER 180L ERROR_INVALID_ORDINAL 182L ERROR_ALREADY_EXISTS 183L ERROR_INVALID_FLAG_NUMBER 186L ERROR_SEM_NOT_FOUND 187L ERROR_INVALID_STARTING_CODESEG 188L ERROR_INVALID_STACKSEG 189L ERROR_INVALID_MODULETYPE 190L ERROR_INVALID_EXE_SIGNATURE 191L ERROR_EXE_MARKED_INVALID 192L ERROR_BAD_EXE_FORMAT 193L ERROR_ITERATED_DATA_EXCEEDS_64k 194L ERROR_INVALID_MINALLOCSIZE 195L ERROR_DYNLINK_FROM_INVALID_RING 196L ERROR_IOPL_NOT_ENABLED 197L ERROR_INVALID_SEGDPL 198L ERROR_AUTODATASEG_EXCEEDS_64k 199L ERROR_RING2SEG_MUST_BE_MOVABLE 200L ERROR_RELOC_CHAIN_XEEDS_SEGLIM 201L ERROR_INFLOOP_IN_RELOC_CHAIN 202L ERROR_ENVVAR_NOT_FOUND 203L ERROR_NO_SIGNAL_SENT 205L ERROR_FILENAME_EXCED_RANGE 206L ERROR_RING2_STACK_IN_USE 207L ERROR_META_EXPANSION_TOO_LONG 208L ERROR_INVALID_SIGNAL_NUMBER 209L ERROR_THREAD_1_INACTIVE 210L ERROR_LOCKED 212L ERROR_TOO_MANY_MODULES 214L ERROR_NESTING_NOT_ALLOWED 215L ERROR_EXE_MACHINE_TYPE_MISMATCH 216L ERROR_EXE_CANNOT_MODIFY_SIGNED_BINARY 217L ERROR_EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY 218L ERROR_BAD_PIPE 230L ERROR_PIPE_BUSY 231L ERROR_NO_DATA 232L ERROR_PIPE_NOT_CONNECTED 233L ERROR_MORE_DATA 234L ERROR_VC_DISCONNECTED 240L ERROR_INVALID_EA_NAME 254L ERROR_EA_LIST_INCONSISTENT 255L WAIT_TIMEOUT 258L ERROR_NO_MORE_ITEMS 259L ERROR_CANNOT_COPY 266L ERROR_DIRECTORY 267L ERROR_EAS_DIDNT_FIT 275L ERROR_EA_FILE_CORRUPT 276L ERROR_EA_TABLE_FULL 277L ERROR_INVALID_EA_HANDLE 278L ERROR_EAS_NOT_SUPPORTED 282L ERROR_NOT_OWNER 288L ERROR_TOO_MANY_POSTS 298L ERROR_PARTIAL_COPY 299L ERROR_OPLOCK_NOT_GRANTED 300L ERROR_INVALID_OPLOCK_PROTOCOL 301L ERROR_DISK_TOO_FRAGMENTED 302L ERROR_DELETE_PENDING 303L ERROR_MR_MID_NOT_FOUND 317L ERROR_SCOPE_NOT_FOUND 318L ERROR_INVALID_ADDRESS 487L ERROR_ARITHMETIC_OVERFLOW 534L ERROR_PIPE_CONNECTED 535L ERROR_PIPE_LISTENING 536L ERROR_EA_ACCESS_DENIED 994L ERROR_OPERATION_ABORTED 995L ERROR_IO_INCOMPLETE 996L ERROR_IO_PENDING 997L ERROR_NOACCESS 998L ERROR_SWAPERROR 999L ERROR_STACK_OVERFLOW 1001L ERROR_INVALID_MESSAGE 1002L ERROR_CAN_NOT_COMPLETE 1003L ERROR_INVALID_FLAGS 1004L ERROR_UNRECOGNIZED_VOLUME 1005L ERROR_FILE_INVALID 1006L ERROR_FULLSCREEN_MODE 1007L ERROR_NO_TOKEN 1008L ERROR_BADDB 1009L ERROR_BADKEY 1010L ERROR_CANTOPEN 1011L ERROR_CANTREAD 1012L ERROR_CANTWRITE 1013L ERROR_REGISTRY_RECOVERED 1014L ERROR_REGISTRY_CORRUPT 1015L ERROR_REGISTRY_IO_FAILED 1016L ERROR_NOT_REGISTRY_FILE 1017L ERROR_KEY_DELETED 1018L ERROR_NO_LOG_SPACE 1019L ERROR_KEY_HAS_CHILDREN 1020L ERROR_CHILD_MUST_BE_VOLATILE 1021L ERROR_NOTIFY_ENUM_DIR 1022L ERROR_DEPENDENT_SERVICES_RUNNING 1051L ERROR_INVALID_SERVICE_CONTROL 1052L ERROR_SERVICE_REQUEST_TIMEOUT 1053L ERROR_SERVICE_NO_THREAD 1054L ERROR_SERVICE_DATABASE_LOCKED 1055L ERROR_SERVICE_ALREADY_RUNNING 1056L ERROR_INVALID_SERVICE_ACCOUNT 1057L ERROR_SERVICE_DISABLED 1058L ERROR_CIRCULAR_DEPENDENCY 1059L ERROR_SERVICE_DOES_NOT_EXIST 1060L ERROR_SERVICE_CANNOT_ACCEPT_CTRL 1061L ERROR_SERVICE_NOT_ACTIVE 1062L ERROR_FAILED_SERVICE_CONTROLLER_CONNECT 1063L ERROR_EXCEPTION_IN_SERVICE 1064L ERROR_DATABASE_DOES_NOT_EXIST 1065L ERROR_SERVICE_SPECIFIC_ERROR 1066L ERROR_PROCESS_ABORTED 1067L ERROR_SERVICE_DEPENDENCY_FAIL 1068L ERROR_SERVICE_LOGON_FAILED 1069L ERROR_SERVICE_START_HANG 1070L ERROR_INVALID_SERVICE_LOCK 1071L ERROR_SERVICE_MARKED_FOR_DELETE 1072L ERROR_SERVICE_EXISTS 1073L ERROR_ALREADY_RUNNING_LKG 1074L ERROR_SERVICE_DEPENDENCY_DELETED 1075L ERROR_BOOT_ALREADY_ACCEPTED 1076L ERROR_SERVICE_NEVER_STARTED 1077L ERROR_DUPLICATE_SERVICE_NAME 1078L ERROR_DIFFERENT_SERVICE_ACCOUNT 1079L ERROR_CANNOT_DETECT_DRIVER_FAILURE 1080L ERROR_CANNOT_DETECT_PROCESS_ABORT 1081L ERROR_NO_RECOVERY_PROGRAM 1082L ERROR_SERVICE_NOT_IN_EXE 1083L ERROR_NOT_SAFEBOOT_SERVICE 1084L ERROR_END_OF_MEDIA 1100L ERROR_FILEMARK_DETECTED 1101L ERROR_BEGINNING_OF_MEDIA 1102L ERROR_SETMARK_DETECTED 1103L ERROR_NO_DATA_DETECTED 1104L ERROR_PARTITION_FAILURE 1105L ERROR_INVALID_BLOCK_LENGTH 1106L ERROR_DEVICE_NOT_PARTITIONED 1107L ERROR_UNABLE_TO_LOCK_MEDIA 1108L ERROR_UNABLE_TO_UNLOAD_MEDIA 1109L ERROR_MEDIA_CHANGED 1110L ERROR_BUS_RESET 1111L ERROR_NO_MEDIA_IN_DRIVE 1112L ERROR_NO_UNICODE_TRANSLATION 1113L ERROR_DLL_INIT_FAILED 1114L ERROR_SHUTDOWN_IN_PROGRESS 1115L ERROR_NO_SHUTDOWN_IN_PROGRESS 1116L ERROR_IO_DEVICE 1117L ERROR_SERIAL_NO_DEVICE 1118L ERROR_IRQ_BUSY 1119L ERROR_MORE_WRITES 1120L ERROR_COUNTER_TIMEOUT 1121L ERROR_FLOPPY_ID_MARK_NOT_FOUND 1122L ERROR_FLOPPY_WRONG_CYLINDER 1123L ERROR_FLOPPY_UNKNOWN_ERROR 1124L ERROR_FLOPPY_BAD_REGISTERS 1125L ERROR_DISK_RECALIBRATE_FAILED 1126L ERROR_DISK_OPERATION_FAILED 1127L ERROR_DISK_RESET_FAILED 1128L ERROR_EOM_OVERFLOW 1129L ERROR_NOT_ENOUGH_SERVER_MEMORY 1130L ERROR_POSSIBLE_DEADLOCK 1131L ERROR_MAPPED_ALIGNMENT 1132L ERROR_SET_POWER_STATE_VETOED 1140L ERROR_SET_POWER_STATE_FAILED 1141L ERROR_TOO_MANY_LINKS 1142L ERROR_OLD_WIN_VERSION 1150L ERROR_APP_WRONG_OS 1151L ERROR_SINGLE_INSTANCE_APP 1152L ERROR_RMODE_APP 1153L ERROR_INVALID_DLL 1154L ERROR_NO_ASSOCIATION 1155L ERROR_DDE_FAIL 1156L ERROR_DLL_NOT_FOUND 1157L ERROR_NO_MORE_USER_HANDLES 1158L ERROR_MESSAGE_SYNC_ONLY 1159L ERROR_SOURCE_ELEMENT_EMPTY 1160L ERROR_DESTINATION_ELEMENT_FULL 1161L ERROR_ILLEGAL_ELEMENT_ADDRESS 1162L ERROR_MAGAZINE_NOT_PRESENT 1163L ERROR_DEVICE_REINITIALIZATION_NEEDED 1164L ERROR_DEVICE_REQUIRES_CLEANING 1165L ERROR_DEVICE_DOOR_OPEN 1166L ERROR_DEVICE_NOT_CONNECTED 1167L ERROR_NOT_FOUND 1168L ERROR_NO_MATCH 1169L ERROR_SET_NOT_FOUND 1170L ERROR_POINT_NOT_FOUND 1171L ERROR_NO_TRACKING_SERVICE 1172L ERROR_NO_VOLUME_ID 1173L ERROR_UNABLE_TO_REMOVE_REPLACED 1175L ERROR_UNABLE_TO_MOVE_REPLACEMENT 1176L ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 1177L ERROR_JOURNAL_DELETE_IN_PROGRESS 1178L ERROR_JOURNAL_NOT_ACTIVE 1179L ERROR_POTENTIAL_FILE_FOUND 1180L ERROR_JOURNAL_ENTRY_DELETED 1181L ERROR_BAD_DEVICE 1200L ERROR_CONNECTION_UNAVAIL 1201L ERROR_DEVICE_ALREADY_REMEMBERED 1202L ERROR_NO_NET_OR_BAD_PATH 1203L ERROR_BAD_PROVIDER 1204L ERROR_CANNOT_OPEN_PROFILE 1205L ERROR_BAD_PROFILE 1206L ERROR_NOT_CONTAINER 1207L ERROR_EXTENDED_ERROR 1208L ERROR_INVALID_GROUPNAME 1209L ERROR_INVALID_COMPUTERNAME 1210L ERROR_INVALID_EVENTNAME 1211L ERROR_INVALID_DOMAINNAME 1212L ERROR_INVALID_SERVICENAME 1213L ERROR_INVALID_NETNAME 1214L ERROR_INVALID_SHARENAME 1215L ERROR_INVALID_PASSWORDNAME 1216L ERROR_INVALID_MESSAGENAME 1217L ERROR_INVALID_MESSAGEDEST 1218L ERROR_SESSION_CREDENTIAL_CONFLICT 1219L ERROR_REMOTE_SESSION_LIMIT_EXCEEDED 1220L ERROR_DUP_DOMAINNAME 1221L ERROR_NO_NETWORK 1222L ERROR_CANCELLED 1223L ERROR_USER_MAPPED_FILE 1224L ERROR_CONNECTION_REFUSED 1225L ERROR_GRACEFUL_DISCONNECT 1226L ERROR_ADDRESS_ALREADY_ASSOCIATED 1227L ERROR_ADDRESS_NOT_ASSOCIATED 1228L ERROR_CONNECTION_INVALID 1229L ERROR_CONNECTION_ACTIVE 1230L ERROR_NETWORK_UNREACHABLE 1231L ERROR_HOST_UNREACHABLE 1232L ERROR_PROTOCOL_UNREACHABLE 1233L ERROR_PORT_UNREACHABLE 1234L ERROR_REQUEST_ABORTED 1235L ERROR_CONNECTION_ABORTED 1236L ERROR_RETRY 1237L ERROR_CONNECTION_COUNT_LIMIT 1238L ERROR_LOGIN_TIME_RESTRICTION 1239L ERROR_LOGIN_WKSTA_RESTRICTION 1240L ERROR_INCORRECT_ADDRESS 1241L ERROR_ALREADY_REGISTERED 1242L ERROR_SERVICE_NOT_FOUND 1243L ERROR_NOT_AUTHENTICATED 1244L ERROR_NOT_LOGGED_ON 1245L ERROR_CONTINUE 1246L ERROR_ALREADY_INITIALIZED 1247L ERROR_NO_MORE_DEVICES 1248L ERROR_NO_SUCH_SITE 1249L ERROR_DOMAIN_CONTROLLER_EXISTS 1250L ERROR_ONLY_IF_CONNECTED 1251L ERROR_OVERRIDE_NOCHANGES 1252L ERROR_BAD_USER_PROFILE 1253L ERROR_NOT_SUPPORTED_ON_SBS 1254L ERROR_SERVER_SHUTDOWN_IN_PROGRESS 1255L ERROR_HOST_DOWN 1256L ERROR_NON_ACCOUNT_SID 1257L ERROR_NON_DOMAIN_SID 1258L ERROR_APPHELP_BLOCK 1259L ERROR_ACCESS_DISABLED_BY_POLICY 1260L ERROR_REG_NAT_CONSUMPTION 1261L ERROR_CSCSHARE_OFFLINE 1262L ERROR_PKINIT_FAILURE 1263L ERROR_SMARTCARD_SUBSYSTEM_FAILURE 1264L ERROR_DOWNGRADE_DETECTED 1265L SEC_E_SMARTCARD_CERT_REVOKED 1266L SEC_E_ISSUING_CA_UNTRUSTED 1267L SEC_E_REVOCATION_OFFLINE_C 1268L SEC_E_PKINIT_CLIENT_FAILUR 1269L SEC_E_SMARTCARD_CERT_EXPIRED 1270L ERROR_MACHINE_LOCKED 1271L ERROR_CALLBACK_SUPPLIED_INVALID_DATA 1273L ERROR_SYNC_FOREGROUND_REFRESH_REQUIRED 1274L ERROR_DRIVER_BLOCKED 1275L ERROR_INVALID_IMPORT_OF_NON_DLL 1276L ERROR_ACCESS_DISABLED_WEBBLADE 1277L ERROR_ACCESS_DISABLED_WEBBLADE_TAMPER 1278L ERROR_RECOVERY_FAILURE 1279L ERROR_ALREADY_FIBER 1280L ERROR_ALREADY_THREAD 1281L ERROR_STACK_BUFFER_OVERRUN 1282L ERROR_PARAMETER_QUOTA_EXCEEDED 1283L ERROR_DEBUGGER_INACTIVE 1284L ERROR_NOT_ALL_ASSIGNED 1300L ERROR_SOME_NOT_MAPPED 1301L ERROR_NO_QUOTAS_FOR_ACCOUNT 1302L ERROR_LOCAL_USER_SESSION_KEY 1303L ERROR_NULL_LM_PASSWORD 1304L ERROR_UNKNOWN_REVISION 1305L ERROR_REVISION_MISMATCH 1306L ERROR_INVALID_OWNER 1307L ERROR_INVALID_PRIMARY_GROUP 1308L ERROR_NO_IMPERSONATION_TOKEN 1309L ERROR_CANT_DISABLE_MANDATORY 1310L ERROR_NO_LOGON_SERVERS 1311L ERROR_NO_SUCH_LOGON_SESSION 1312L ERROR_NO_SUCH_PRIVILEGE 1313L ERROR_PRIVILEGE_NOT_HELD 1314L ERROR_INVALID_ACCOUNT_NAME 1315L ERROR_USER_EXISTS 1316L ERROR_NO_SUCH_USER 1317L ERROR_GROUP_EXISTS 1318L ERROR_NO_SUCH_GROUP 1319L ERROR_MEMBER_IN_GROUP 1320L ERROR_MEMBER_NOT_IN_GROUP 1321L ERROR_LAST_ADMIN 1322L ERROR_WRONG_PASSWORD 1323L ERROR_ILL_FORMED_PASSWORD 1324L ERROR_PASSWORD_RESTRICTION 1325L ERROR_LOGON_FAILURE 1326L ERROR_ACCOUNT_RESTRICTION 1327L ERROR_INVALID_LOGON_HOURS 1328L ERROR_INVALID_WORKSTATION 1329L ERROR_PASSWORD_EXPIRED 1330L ERROR_ACCOUNT_DISABLED 1331L ERROR_NONE_MAPPED 1332L ERROR_TOO_MANY_LUIDS_REQUESTED 1333L ERROR_LUIDS_EXHAUSTED 1334L ERROR_INVALID_SUB_AUTHORITY 1335L ERROR_INVALID_ACL 1336L ERROR_INVALID_SID 1337L ERROR_INVALID_SECURITY_DESCR 1338L ERROR_BAD_INHERITANCE_ACL 1340L ERROR_SERVER_DISABLED 1341L ERROR_SERVER_NOT_DISABLED 1342L ERROR_INVALID_ID_AUTHORITY 1343L ERROR_ALLOTTED_SPACE_EXCEEDED 1344L ERROR_INVALID_GROUP_ATTRIBUTES 1345L ERROR_BAD_IMPERSONATION_LEVEL 1346L ERROR_CANT_OPEN_ANONYMOUS 1347L ERROR_BAD_VALIDATION_CLASS 1348L ERROR_BAD_TOKEN_TYPE 1349L ERROR_NO_SECURITY_ON_OBJECT 1350L ERROR_CANT_ACCESS_DOMAIN_INFO 1351L ERROR_INVALID_SERVER_STATE 1352L ERROR_INVALID_DOMAIN_STATE 1353L ERROR_INVALID_DOMAIN_ROLE 1354L ERROR_NO_SUCH_DOMAIN 1355L ERROR_DOMAIN_EXISTS 1356L ERROR_DOMAIN_LIMIT_EXCEEDED 1357L ERROR_INTERNAL_DB_CORRUPTION 1358L ERROR_INTERNAL_ERROR 1359L ERROR_GENERIC_NOT_MAPPED 1360L ERROR_BAD_DESCRIPTOR_FORMAT 1361L ERROR_NOT_LOGON_PROCESS 1362L ERROR_LOGON_SESSION_EXISTS 1363L ERROR_NO_SUCH_PACKAGE 1364L ERROR_BAD_LOGON_SESSION_STATE 1365L ERROR_LOGON_SESSION_COLLISION 1366L ERROR_INVALID_LOGON_TYPE 1367L ERROR_CANNOT_IMPERSONATE 1368L ERROR_RXACT_INVALID_STATE 1369L ERROR_RXACT_COMMIT_FAILURE 1370L ERROR_SPECIAL_ACCOUNT 1371L ERROR_SPECIAL_GROUP 1372L ERROR_SPECIAL_USER 1373L ERROR_MEMBERS_PRIMARY_GROUP 1374L ERROR_TOKEN_ALREADY_IN_USE 1375L ERROR_NO_SUCH_ALIAS 1376L ERROR_MEMBER_NOT_IN_ALIAS 1377L ERROR_MEMBER_IN_ALIAS 1378L ERROR_ALIAS_EXISTS 1379L ERROR_LOGON_NOT_GRANTED 1380L ERROR_TOO_MANY_SECRETS 1381L ERROR_SECRET_TOO_LONG 1382L ERROR_INTERNAL_DB_ERROR 1383L ERROR_TOO_MANY_CONTEXT_IDS 1384L ERROR_LOGON_TYPE_NOT_GRANTED 1385L ERROR_NT_CROSS_ENCRYPTION_REQUIRED 1386L ERROR_NO_SUCH_MEMBER 1387L ERROR_INVALID_MEMBER 1388L ERROR_TOO_MANY_SIDS 1389L ERROR_LM_CROSS_ENCRYPTION_REQUIRED 1390L ERROR_NO_INHERITANCE 1391L ERROR_FILE_CORRUPT 1392L ERROR_DISK_CORRUPT 1393L ERROR_NO_USER_SESSION_KEY 1394L ERROR_LICENSE_QUOTA_EXCEEDED 1395L ERROR_WRONG_TARGET_NAME 1396L ERROR_MUTUAL_AUTH_FAILED 1397L ERROR_TIME_SKEW 1398L ERROR_CURRENT_DOMAIN_NOT_ALLOWED 1399L ERROR_INVALID_WINDOW_HANDLE 1400L ERROR_INVALID_MENU_HANDLE 1401L ERROR_INVALID_CURSOR_HANDLE 1402L ERROR_INVALID_ACCEL_HANDLE 1403L ERROR_INVALID_HOOK_HANDLE 1404L ERROR_INVALID_DWP_HANDLE 1405L ERROR_TLW_WITH_WSCHILD 1406L ERROR_CANNOT_FIND_WND_CLASS 1407L ERROR_WINDOW_OF_OTHER_THREAD 1408L ERROR_HOTKEY_ALREADY_REGISTERED 1409L ERROR_CLASS_ALREADY_EXISTS 1410L ERROR_CLASS_DOES_NOT_EXIST 1411L ERROR_CLASS_HAS_WINDOWS 1412L ERROR_INVALID_INDEX 1413L ERROR_INVALID_ICON_HANDLE 1414L ERROR_PRIVATE_DIALOG_INDEX 1415L ERROR_LISTBOX_ID_NOT_FOUND 1416L ERROR_NO_WILDCARD_CHARACTERS 1417L ERROR_CLIPBOARD_NOT_OPEN 1418L ERROR_HOTKEY_NOT_REGISTERED 1419L ERROR_WINDOW_NOT_DIALOG 1420L ERROR_CONTROL_ID_NOT_FOUND 1421L ERROR_INVALID_COMBOBOX_MESSAGE 1422L ERROR_WINDOW_NOT_COMBOBOX 1423L ERROR_INVALID_EDIT_HEIGHT 1424L ERROR_DC_NOT_FOUND 1425L ERROR_INVALID_HOOK_FILTER 1426L ERROR_INVALID_FILTER_PROC 1427L ERROR_HOOK_NEEDS_HMOD 1428L ERROR_GLOBAL_ONLY_HOOK 1429L ERROR_JOURNAL_HOOK_SET 1430L ERROR_HOOK_NOT_INSTALLED 1431L ERROR_INVALID_LB_MESSAGE 1432L ERROR_SETCOUNT_ON_BAD_LB 1433L ERROR_LB_WITHOUT_TABSTOPS 1434L ERROR_DESTROY_OBJECT_OF_OTHER_THREAD 1435L ERROR_CHILD_WINDOW_MENU 1436L ERROR_NO_SYSTEM_MENU 1437L ERROR_INVALID_MSGBOX_STYLE 1438L ERROR_INVALID_SPI_VALUE 1439L ERROR_SCREEN_ALREADY_LOCKED 1440L ERROR_HWNDS_HAVE_DIFF_PARENT 1441L ERROR_NOT_CHILD_WINDOW 1442L ERROR_INVALID_GW_COMMAND 1443L ERROR_INVALID_THREAD_ID 1444L ERROR_NON_MDICHILD_WINDOW 1445L ERROR_POPUP_ALREADY_ACTIVE 1446L ERROR_NO_SCROLLBARS 1447L ERROR_INVALID_SCROLLBAR_RANGE 1448L ERROR_INVALID_SHOWWIN_COMMAND 1449L ERROR_NO_SYSTEM_RESOURCES 1450L ERROR_NONPAGED_SYSTEM_RESOURCES 1451L ERROR_PAGED_SYSTEM_RESOURCES 1452L ERROR_WORKING_SET_QUOTA 1453L ERROR_PAGEFILE_QUOTA 1454L ERROR_COMMITMENT_LIMIT 1455L ERROR_MENU_ITEM_NOT_FOUND 1456L ERROR_INVALID_KEYBOARD_HANDLE 1457L ERROR_HOOK_TYPE_NOT_ALLOWED 1458L ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION 1459L ERROR_TIMEOUT 1460L ERROR_INVALID_MONITOR_HANDLE 1461L ERROR_EVENTLOG_FILE_CORRUPT 1500L ERROR_EVENTLOG_CANT_START 1501L ERROR_LOG_FILE_FULL 1502L ERROR_EVENTLOG_FILE_CHANGED 1503L ERROR_INSTALL_SERVICE_FAILURE 1601L ERROR_INSTALL_USEREXIT 1602L ERROR_INSTALL_FAILURE 1603L ERROR_INSTALL_SUSPEND 1604L ERROR_UNKNOWN_PRODUCT 1605L ERROR_UNKNOWN_FEATURE 1606L ERROR_UNKNOWN_COMPONENT 1607L ERROR_UNKNOWN_PROPERTY 1608L ERROR_INVALID_HANDLE_STATE 1609L ERROR_BAD_CONFIGURATION 1610L ERROR_INDEX_ABSENT 1611L ERROR_INSTALL_SOURCE_ABSENT 1612L ERROR_INSTALL_PACKAGE_VERSION 1613L ERROR_PRODUCT_UNINSTALLED 1614L ERROR_BAD_QUERY_SYNTAX 1615L ERROR_INVALID_FIELD 1616L ERROR_DEVICE_REMOVED 1617L ERROR_INSTALL_ALREADY_RUNNING 1618L ERROR_INSTALL_PACKAGE_OPEN_FAILED 1619L ERROR_INSTALL_PACKAGE_INVALID 1620L ERROR_INSTALL_UI_FAILURE 1621L ERROR_INSTALL_LOG_FAILURE 1622L ERROR_INSTALL_LANGUAGE_UNSUPPORTED 1623L ERROR_INSTALL_TRANSFORM_FAILURE 1624L ERROR_INSTALL_PACKAGE_REJECTED 1625L ERROR_FUNCTION_NOT_CALLED 1626L ERROR_FUNCTION_FAILED 1627L ERROR_INVALID_TABLE 1628L ERROR_DATATYPE_MISMATCH 1629L ERROR_UNSUPPORTED_TYPE 1630L ERROR_CREATE_FAILED 1631L ERROR_INSTALL_TEMP_UNWRITABLE 1632L ERROR_INSTALL_PLATFORM_UNSUPPORTED 1633L ERROR_INSTALL_NOTUSED 1634L ERROR_PATCH_PACKAGE_OPEN_FAILED 1635L ERROR_PATCH_PACKAGE_INVALID 1636L ERROR_PATCH_PACKAGE_UNSUPPORTED 1637L ERROR_PRODUCT_VERSION 1638L ERROR_INVALID_COMMAND_LINE 1639L ERROR_INSTALL_REMOTE_DISALLOWED 1640L ERROR_SUCCESS_REBOOT_INITIATED 1641L ERROR_PATCH_TARGET_NOT_FOUND 1642L ERROR_PATCH_PACKAGE_REJECTED 1643L ERROR_INSTALL_TRANSFORM_REJECTED 1644L ERROR_INSTALL_REMOTE_PROHIBITED 1645L */ static int esize = static_cast(sizeof(emap) / sizeof(ESTRINGS)); std::string &win_error_string(long err) { int mark = -1; for (int i = 0; i < esize; i++) { if (emap[i].ecode == err) { mark = i; break; } } if (mark == -1) return unknown; return emap[mark].estring; } #endif fldigi-4.2.05/src/misc/nls.cxx0000664000175000017500000000720714611711171013033 00000000000000// ---------------------------------------------------------------------------- // nls.cxx // // Copyright (C) 2008 // Stéphane Fillod, F8CFE // // Copyright (C) 2011 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "nls.h" #include "gettext.h" #ifndef PATH_MAX # define PATH_MAX 4096 #endif #ifdef __WOE32__ # include # include // TODO: figure out the percentage automatically; hopefully not in a horribly kludgy way // English always first in list so it is the new installation default. struct lang_def_t ui_langs[] = { { "en", "en_US", "English"}, { "ca", "ca_CA", "Catalan"}, { "de", "de_DE", "Deutsch (German)"}, { "nl", "nl_NL", "Nederlands (Dutch)"}, { "es", "es_ES", "Espa\361ol (Spanish)"}, { "fr", "fr_FR", "Fran\347ais (French)"}, { "it", "it_IT", "Italiano (Italian)"}, { "pl", "pl_PL", "Język (Polish)"}, { "ru", "ru_RU", "Pусский (Russian)"}, { "el", "el_EL", "Ελληνικά (Greek)"}, { NULL, NULL, NULL } }; static std::string get_win32_lang_dir(const char* homedir = NULL) { std::string lang_fn; if (!homedir) { if (!(homedir = getenv("USERPROFILE"))) return lang_fn; lang_fn.assign(homedir).append("\\fldigi.files\\"); } return lang_fn.append("lang.txt"); } int get_ui_lang(const char* homedir) { std::string lang = get_win32_lang_dir(homedir); std::ifstream in(lang.c_str()); if (!in) return 0; std::string::size_type u = std::string::npos; while (in >> lang) { if ( (lang[0] != '\n') & (lang[0] != '#') && ( (u = lang.find('_')) != std::string::npos) ) break; } in.close(); if (u != std::string::npos) for (lang_def_t* p = ui_langs; p->lang; p++) if (lang == p->lang_region) return (int)(p - ui_langs); return 0; } void set_ui_lang(int lang, const char* homedir) { if ((size_t)lang >= sizeof(ui_langs)/sizeof(*ui_langs) - 1) return; std::string langfn = get_win32_lang_dir(homedir); std::ofstream f(langfn.c_str()); if (f) { f << "# Autogenerated file, do not edit\r\n" << ui_langs[lang].lang_region << "\r\n"; f.close(); } } #endif int setup_nls(void) { static int nls_set_up = 0; if (nls_set_up) return nls_set_up; setlocale (LC_MESSAGES, ""); setlocale (LC_CTYPE, "C"); setlocale (LC_TIME, ""); // setting LC_NUMERIC might break the config read/write routines const char* ldir; char buf[PATH_MAX]; if (!(ldir = getenv("FLDIGI_LOCALE_DIR"))) { if (getcwd(buf, sizeof(buf) - strlen("/locale") - 1)) { #ifdef __WOE32__ int lang = get_ui_lang(); setenv("LANGUAGE", ui_langs[lang].lang_region, 1); #endif strcpy(buf + strlen(buf), "/locale"); struct stat s; if (stat(buf, &s) != -1 && S_ISDIR(s.st_mode)) ldir = buf; else ldir = LOCALEDIR; } } bindtextdomain(PACKAGE, ldir); bind_textdomain_codeset(PACKAGE, "UTF-8"); textdomain(PACKAGE); return nls_set_up = 1; } fldigi-4.2.05/src/misc/utf8file_io.cxx0000664000175000017500000001002614532252172014450 00000000000000// ---------------------------------------------------------------------------- // utf8file_io.cxx // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include "utf8file_io.h" #include "icons.h" #define linelen 1024 //---------------------------------------------------------------------- // filter that produces, from an input stream fed by reading from fp, // a UTF-8-encoded output stream written in buffer. // Input can be UTF-8. If it is not, it is decoded with CP1252. // Output is UTF-8. // *input_was_changed is set to true if the input was not strict UTF-8 // so output differs from input. //---------------------------------------------------------------------- #include static int utf8_read_( char *buffer, int buflen, char *line, int sline, char *endline, FILE *fp, bool *input_was_changed ) { char *p, *q, multibyte[5]; int l, lp, lq, r; unsigned u; p = line; q = buffer; while (q < buffer + buflen) { if (p >= endline) { r = fread(line, 1, sline, fp); endline = line + r; if (r == 0) return q - buffer; p = line; } l = fl_utf8len1(*p); if (p + l > endline) { memmove(line, p, endline - p); endline -= (p - line); r = fread(endline, 1, sline - (endline - line), fp); endline += r; p = line; if (endline - line < l) break; } while ( l > 0) { u = fl_utf8decode(p, p+l, &lp); lq = fl_utf8encode(u, multibyte); if (lp != l || lq != l) *input_was_changed = true; if (q + lq > buffer + buflen) { memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } memcpy(q, multibyte, lq); q += lq; p += lp; l -= lp; } } memmove(line, p, endline - p); endline -= (p - line); return q - buffer; } static const char file_encoding_warning_message[] = "Input file was not UTF-8 encoded.\n" "Text has been converted to UTF-8."; //---------------------------------------------------------------------- // Read text from a file. // utf8_input_filter accepts UTF-8 or CP1252 as input encoding. // Output is always UTF-8 encoded std::string //---------------------------------------------------------------------- int UTF8_readfile(const char *file, std::string &output) { FILE *fp; if (!(fp = fl_fopen(file, "r"))) return 1; char buffer[2 * linelen + 1], line[linelen]; char *endline = line; int l; bool input_file_was_transcoded = false; while (true) { l = utf8_read_( buffer, linelen * 2 + 1, line, linelen, endline, fp, &input_file_was_transcoded); if (l == 0) break; buffer[l] = 0; output.append(buffer); } int e = ferror(fp) ? 2 : 0; fclose(fp); if ( (!e) && input_file_was_transcoded) fl_alert2("%s", file_encoding_warning_message); return e; } //---------------------------------------------------------------------- // Write text std::string to file. // Unicode safe. //---------------------------------------------------------------------- int UTF8_writefile( const char *file, std::string &text ) { FILE *fp; if (!(fp = fl_fopen(file, "w"))) return 1; int buflen = text.length(); int r = fwrite( text.c_str(), 1, buflen, fp ); int e = (r != buflen) ? 1 : ferror(fp) ? 2 : 0; fclose(fp); return e; } fldigi-4.2.05/src/misc/re.cxx0000664000175000017500000000707614611711171012651 00000000000000// ---------------------------------------------------------------------------- // re.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "re.h" re_t::re_t(const char* pattern_, int cflags_) : pattern(pattern_), cflags(cflags_), eflags(0), error(false) { compile(); } re_t::re_t(const re_t& re) : pattern(re.pattern), cflags(re.cflags), eflags(re.eflags), suboffsets(re.suboffsets), substrings(re.substrings) { compile(); } re_t::~re_t() { if (!error) regfree(&preg); } re_t& re_t::operator=(const re_t& rhs) { if (&rhs == this) return *this; pattern = rhs.pattern; cflags = rhs.cflags; eflags = rhs.eflags; suboffsets = rhs.suboffsets; substrings = rhs.substrings; if (!error) regfree(&preg); compile(); return *this; } void re_t::recompile(const char* pattern_) { pattern = pattern_; if (!error) regfree(&preg); compile(); } void re_t::compile(void) { error = regcomp(&preg, pattern.c_str(), cflags); if (!error && !(cflags & REG_NOSUB) && preg.re_nsub > 0) suboffsets.resize(preg.re_nsub + 1); } bool re_t::match(const char* str, int eflags_) { if (error) return false; eflags = eflags_; bool nosub = cflags & REG_NOSUB || preg.re_nsub == 0; bool found = !regexec(&preg, str, (nosub ? 0 : preg.re_nsub+1), (nosub ? NULL : &suboffsets[0]), eflags_); substrings.clear(); if (found && !nosub) { size_t n = suboffsets.size(); substrings.resize(n); for (size_t i = 0; i < n; i++) if (suboffsets[i].rm_so != -1) substrings[i].assign(str + suboffsets[i].rm_so, suboffsets[i].rm_eo - suboffsets[i].rm_so); } return found; } const std::string& re_t::submatch(size_t n) const { return substrings[n]; } void re_t::suboff(size_t n, int* start, int* end) const { if (n < nsub()) { if (start) *start = suboffsets[n].rm_so; if (end) *end = suboffsets[n].rm_eo; } else { if (start) *start = -1; if (end) *end = -1; } } #if HAVE_STD_HASH # include #elif HAVE_STD_TR1_HASH # include #else # error "No std::hash or std::tr1::hash support" #endif size_t re_t::hash(void) const { #if HAVE_STD_HASH size_t h = std::hash()(pattern); return h ^ (std::hash()(cflags) + 0x9e3779b9 + (h << 6) + (h >> 2)); #elif HAVE_STD_TR1_HASH size_t h = std::tr1::hash()(pattern); return h ^ (std::tr1::hash()(cflags) + 0x9e3779b9 + (h << 6) + (h >> 2)); #endif } // ------------------------------------------------------------------------ fre_t::fre_t(const char* pattern_, int cflags_) : re_t(pattern_, cflags_) { } bool fre_t::match(const char* str, int eflags_) { if (error) return false; bool nosub = cflags & REG_NOSUB || preg.re_nsub == 0; return !regexec(&preg, str, (nosub ? 0 : preg.re_nsub+1), (nosub ? NULL : &suboffsets[0]), eflags_); } fldigi-4.2.05/src/misc/ascii.cxx0000664000175000017500000001507414611711171013330 00000000000000// ---------------------------------------------------------------------------- // ascii.cxx -- ASCII table // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "ascii.h" const char *ascii[256] = { "", "", "", "", "", "", "", "\a", "\b", "\t", "\n", "", "", "\r", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" }; const char *ascii2[256] = { "", "", "", "", "", "", "", "", "\b", "\t", "\n", "", "", "\r", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-" }; const char *ascii3[256] = { "", "", "", "", "", "", "", "", "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<128>", "<129>", "<130>", "<131>", "<132>", "<133>", "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", "<140>", "<141>", "<142>", "<143>", "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", "<160>", "<161>", "<162>", "<163>", "<164>", "<165>", "<166>", "<167>", "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", "<176>", "<177>", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>", "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "<247>", "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>" }; fldigi-4.2.05/src/misc/icons.cxx0000664000175000017500000001457514611711171013360 00000000000000// ---------------------------------------------------------------------------- // icons.cxx // // Copyright (C) 2008 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "icons.h" #include #include #include #include #if USE_IMAGE_LABELS # include # include # include # include # include # include #endif namespace icons { #if USE_IMAGE_LABELS typedef std::map imap_t; static imap_t* imap = 0; #endif #define FL_EMPTY_LABEL FL_FREE_LABELTYPE static void draw_empty(const Fl_Label*, int, int, int, int, Fl_Align) { } static void measure_empty(const Fl_Label*, int& w, int& h) { w = h = 0; } // The following functions create image+text menu item labels. // You've had too much FLTK if you already know how to do that. // Return a multi_label pointer, cast to a string, for `text' and // `pixmap'. This goes into the label pointer of a widget or menu // item. The text label is copied if we are using multi labels. You must // call set_icon_label on the widget or menu item before its draw() // function is called for the first time. // // A NULL pixmap means that the caller wants an empty, transparent, icon. const char* make_icon_label(const char* text, const char** pixmap) { #if USE_IMAGE_LABELS static imap_t* imap_ = 0; if (unlikely(!imap_)) { imap = imap_ = new imap_t; Fl::set_labeltype(FL_EMPTY_LABEL, draw_empty, measure_empty); } // Create a multi label and associate it with an Fl_Image* array Fl_Multi_Label* mlabel = new Fl_Multi_Label; Fl_Image** images = new Fl_Image*[2]; images[0] = new Fl_Pixmap(pixmap ? pixmap : clear_row_icon); images[1] = 0; // we create this on demand // set_icon_label_ will set mlabel->labela later mlabel->typea = _FL_IMAGE_LABEL; if (!text) text = ""; size_t len = strlen(text); char* s = new char[len + 2]; s[0] = ' '; memcpy(s + 1, text, len + 1); mlabel->labelb = s; mlabel->typeb = FL_NORMAL_LABEL; (*imap)[mlabel] = images; return (const char*)mlabel; #else return text; #endif } #if USE_IMAGE_LABELS // Find the item's label, which should be something that was returned by // make_icon_label, and set the active or inactive image. template void set_icon_label_(T* item) { imap_t::iterator j = imap->find((Fl_Multi_Label*)(item->label())); if (j == imap->end()) return; Fl_Multi_Label* mlabel = j->first; Fl_Image** images = j->second; unsigned char i = !item->active(); if (!images[i]) { // create inactive version of other image images[i] = images[!i]->copy(); images[i]->inactive(); } if (mlabel->typea == _FL_IMAGE_LABEL) mlabel->labela = (const char*)images[i]; else mlabel->labelb = (const char*)images[i]; item->image(images[i]); mlabel->label(item); item->labeltype(_FL_MULTI_LABEL); } #endif void set_icon_label(Fl_Menu_Item* item) { #if USE_IMAGE_LABELS set_icon_label_(item); #else // this isn't needed but it simplifies fldigi's UI setup code if (item->labeltype() == _FL_MULTI_LABEL) item->labeltype(FL_NORMAL_LABEL); #endif } void set_icon_label(Fl_Widget* w) { #if USE_IMAGE_LABELS set_icon_label_(w); w->image(0); #else if (w->labeltype() == _FL_MULTI_LABEL) w->labeltype(FL_NORMAL_LABEL); #endif } void toggle_icon_labels(void) { #if USE_IMAGE_LABELS for (imap_t::iterator i = imap->begin(); i != imap->end(); ++i) { // swap sublabels const char* l = i->first->labela; i->first->labela = i->first->labelb; i->first->labelb = l; if (i->first->typea == _FL_IMAGE_LABEL) { i->first->typea = FL_NORMAL_LABEL; i->first->typeb = FL_EMPTY_LABEL; i->first->labela++; } else { i->first->typea = _FL_IMAGE_LABEL; i->first->typeb = FL_NORMAL_LABEL; i->first->labelb--; } } #endif } template const char* get_icon_label_text_(T* item) { #if USE_IMAGE_LABELS if (item->labeltype() == _FL_MULTI_LABEL) { imap_t::iterator i = imap->find((Fl_Multi_Label*)(item->label())); if (i == imap->end()) return 0; if (i->first->typeb == FL_NORMAL_LABEL) return i->first->labelb + 1; else // disabled icons return i->first->labela; } else #endif return item->label(); } const char* get_icon_label_text(Fl_Menu_Item* item) { return get_icon_label_text_(item); } const char* get_icon_label_text(Fl_Widget* w) { return get_icon_label_text_(w); } template void free_icon_label_(T* item) { #if USE_IMAGE_LABELS if (item->labeltype() == FL_NORMAL_LABEL) { delete [] item->label(); item->label(0); return; } imap_t::iterator i = imap->find((Fl_Multi_Label*)item->label()); if (i == imap->end()) return; item->label(0); // delete the images delete i->second[0]; delete i->second[1]; delete [] i->second; // delete the multi label delete [] ((i->first->typeb == FL_NORMAL_LABEL) ? i->first->labelb : i->first->labela-1); delete i->first; imap->erase(i); #endif } void free_icon_label(Fl_Menu_Item* item) { free_icon_label_(item); } void free_icon_label(Fl_Widget* w) { free_icon_label_(w); } template void set_active_(T* t, bool v) { if (v) t->activate(); else t->deactivate(); if (t->labeltype() == _FL_MULTI_LABEL) set_icon_label(t); } void set_active(Fl_Menu_Item* item, bool v) { set_active_(item, v); } void set_active(Fl_Widget* w, bool v) { set_active_(w, v); } static Fl_Image* msg_icon; void set_message_icon(const char** pixmap) { if (msg_icon && msg_icon->data() == pixmap) return; delete msg_icon; Fl_Widget* msg = fl_message_icon(); msg->label(""); msg->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE); msg->box(FL_NO_BOX); msg->image(msg_icon = new Fl_Pixmap(pixmap)); } } // icons fldigi-4.2.05/src/misc/coordinate.cxx0000664000175000017500000001564314611711171014371 00000000000000// ---------------------------------------------------------------------------- // coordinate.cxx -- Handling of longitude and latitude. // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include "config.h" #include "coordinate.h" #include "locator.h" void CoordinateT::Check(void) const { if( m_is_lon ) { if( ( m_angle >= -180.0 ) && ( m_angle <= 180.0 ) ) return ; } else { if( ( m_angle >= -90.0 ) && ( m_angle <= 90.0 ) ) return ; } std::stringstream strm ; strm << "Invalid m_angle=" << m_angle << " m_is_lon=" << m_is_lon ; throw std::runtime_error(strm.str()); } CoordinateT::CoordinateT( double degrees, bool is_lon ) : m_angle( fmod(degrees, 360.0 ) ), m_is_lon(is_lon) { if( m_angle > 180.0 ) m_angle -= 360.0 ; Check(); }; // Longitude East and Latitude North are positive. void CoordinateT::Init( char direction, double angle_degrees ) { m_angle = angle_degrees ; switch( direction ) { case 'W': case 'w': m_angle = -m_angle ; case 'E': case 'e': if( ( angle_degrees < -180 ) || ( angle_degrees > 180 ) ) throw std::runtime_error("Invalid longitude degree"); m_is_lon = true ; break ; case 'S': case 's': m_angle = -m_angle ; case 'N': case 'n': if( ( angle_degrees < -90 ) || ( angle_degrees > 90 ) ) throw std::runtime_error("Invalid latitude degree"); m_is_lon = false ; break ; default: throw std::runtime_error("Invalid direction"); } Check(); } CoordinateT::CoordinateT( char direction, double angle_degrees ) { Init( direction, angle_degrees ); } CoordinateT::CoordinateT( char direction, int degree, int minute, int second ) { // std::cout << "ctor d=" << direction << " " << degree << " " << minute << " " << second << "\n"; if( ( degree < 0 ) || ( degree > 180 ) ) throw std::runtime_error("Invalid degree"); if( ( minute < 0 ) || ( minute >= 60 ) ) throw std::runtime_error("Invalid minute"); if( ( second < 0 ) || ( second >= 60 ) ) throw std::runtime_error("Invalid second"); double angle_degrees = (double)degree + (double)minute / 60.0 + (double)second / 3600.0 ; Init( direction, angle_degrees ); } // Specific for reading from the file of navtex or wmo stations. // Navtex: "57 06 N" // Wmo : "69-36N", "013-27E", "009-25E" ou floating-point degrees: "12.34 E". // Station Latitude or Latitude :DD-MM-SSH where DD is degrees, MM is minutes, SS is seconds // and H is N for northern hemisphere or S for southern hemisphere or // E for eastern hemisphere or W for western hemisphere. // The seconds value is omitted for those stations where the seconds value is unknown. std::istream & operator>>( std::istream & istrm, CoordinateT & ref ) { if( ! istrm ) return istrm ; std::stringstream sstrm ; char direction ; while( true ) { // istrm >> direction ; direction = (char)istrm.get(); if( ! istrm ) return istrm ; switch( direction ) { case 'e': case 'E': case 'w': case 'W': case 's': case 'S': case 'n': case 'N': break; case '0' ... '9' : case '.' : case '-' : case '+' : case ' ' : case '\t' : sstrm << direction ; continue; default: istrm.setstate(std::ios::eofbit); return istrm ; } break; } // TODO: Check that the direction is what we expect. std::string tmpstr = sstrm.str(); // std::cout << "READ:" << tmpstr << ":" << direction << "\n"; const char * tmpPtr = tmpstr.c_str(); int i_degree, i_minute, i_second ; if( ( 3 == sscanf( tmpPtr, "%d-%d-%d", &i_degree, &i_minute, &i_second ) ) || ( 3 == sscanf( tmpPtr, "%d %d %d", &i_degree, &i_minute, &i_second ) ) ) { ref = CoordinateT( direction, i_degree, i_minute, i_second ); return istrm; } if( ( 2 == sscanf( tmpPtr, "%d-%d", &i_degree, &i_minute ) ) || ( 2 == sscanf( tmpPtr, "%d %d", &i_degree, &i_minute ) ) ) { ref = CoordinateT( direction, i_degree, i_minute, 0 ); return istrm; } double d_degree ; if( 1 == sscanf( tmpPtr, "%lf", &d_degree ) ) { ref = CoordinateT( direction, d_degree ); return istrm; } istrm.setstate(std::ios::eofbit); return istrm ; } std::ostream & operator<<( std::ostream & ostrm, const CoordinateT & ref ) { bool sign = ref.m_angle > 0 ; double ang = sign ? ref.m_angle : -ref.m_angle; ostrm << std::setfill('0') << std::setw( ref.m_is_lon ? 3 : 2 ) << (int)ang << " " << std::setfill('0') << std::setw(2) << ( (int)( 0.5 + ang * 60.0 ) % 60 ) << " " << std::setfill('0') << std::setw(2) << (int)fmod( ang * 3600.0, 60 ) << " " << " "; ostrm << ( ref.m_is_lon ? sign ? 'E' : 'W' : sign ? 'N' : 'S' ); return ostrm; } CoordinateT::Pair::Pair( const CoordinateT & coo1, const CoordinateT & coo2 ) : m_lon( coo1.is_lon() ? coo1 : coo2 ) , m_lat( coo2.is_lon() ? coo1 : coo2 ) { if( ! ( coo1.is_lon() ^ coo2.is_lon() ) ) { throw std::runtime_error("Internal inconsistency"); } } CoordinateT::Pair::Pair( double lon, double lat ) : m_lon( CoordinateT( lon, true ) ) , m_lat( CoordinateT( lat, false ) ) {} CoordinateT::Pair::Pair( const std::string & locator ) { double lon, lat ; int res = QRB::locator2longlat( &lon, &lat, locator.c_str() ); if( res != QRB::QRB_OK ) { throw std::runtime_error("Cannot decode Maidenhead locator:" + locator ); }; m_lon = CoordinateT( lon, true ); m_lat = CoordinateT( lat, false ); } double CoordinateT::Pair::distance( const Pair & a ) const { double dist, azimuth ; int res = QRB::qrb( longitude().angle(), latitude().angle(), a.longitude().angle(), a.latitude().angle(), &dist, &azimuth ); if( res != QRB::QRB_OK) { std::stringstream sstrm ; sstrm << "Bad qrb result:" << *this << " <-> " << a ; throw std::runtime_error(sstrm.str()); } return dist ; } std::string CoordinateT::Pair::locator(void) const { char buf[64]; int ret = QRB::longlat2locator( longitude().angle(), latitude().angle(), buf, 3 ); if( ret == QRB::QRB_OK ) { return buf ; } return std::string(); } std::ostream & operator<<( std::ostream & ostrm, const CoordinateT::Pair & ref ) { ostrm << ref.latitude() << "/" << ref.longitude(); return ostrm; } std::istream & operator>>( std::istream & istrm, CoordinateT::Pair & ref ) { istrm >> ref.latitude() >> ref.longitude(); return istrm; } fldigi-4.2.05/src/misc/charsetlist.cxx0000664000175000017500000000535014532252172014564 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include "config.h" #include "charsetlist.h" #include "tiniconv.h" const struct charset_info charset_list[] = { { "ASCII", TINICONV_CHARSET_ASCII }, { "CP1250", TINICONV_CHARSET_CP1250 }, { "CP1251", TINICONV_CHARSET_CP1251 }, { "CP1252", TINICONV_CHARSET_CP1252 }, { "CP1253", TINICONV_CHARSET_CP1253 }, { "CP1254", TINICONV_CHARSET_CP1254 }, { "CP1255", TINICONV_CHARSET_CP1255 }, { "CP1256", TINICONV_CHARSET_CP1256 }, { "CP1257", TINICONV_CHARSET_CP1257 }, { "CP1258", TINICONV_CHARSET_CP1258 }, { "CP936", TINICONV_CHARSET_CP936 }, { "GB2312", TINICONV_CHARSET_GB2312 }, { "GBK", TINICONV_CHARSET_GBK }, { "ISO-2022-JP", TINICONV_CHARSET_ISO_2022_JP }, { "ISO-8859-1", TINICONV_CHARSET_ISO_8859_1 }, { "ISO-8859-2", TINICONV_CHARSET_ISO_8859_2 }, { "ISO-8859-3", TINICONV_CHARSET_ISO_8859_3 }, { "ISO-8859-4", TINICONV_CHARSET_ISO_8859_4 }, { "ISO-8859-5", TINICONV_CHARSET_ISO_8859_5 }, { "ISO-8859-6", TINICONV_CHARSET_ISO_8859_6 }, { "ISO-8859-7", TINICONV_CHARSET_ISO_8859_7 }, { "ISO-8859-8", TINICONV_CHARSET_ISO_8859_8 }, { "ISO-8859-9", TINICONV_CHARSET_ISO_8859_9 }, { "ISO-8859-10", TINICONV_CHARSET_ISO_8859_10 }, { "ISO-8859-11", TINICONV_CHARSET_ISO_8859_11 }, { "ISO-8859-13", TINICONV_CHARSET_ISO_8859_13 }, { "ISO-8859-14", TINICONV_CHARSET_ISO_8859_14 }, { "ISO-8859-15", TINICONV_CHARSET_ISO_8859_15 }, { "ISO-8859-16", TINICONV_CHARSET_ISO_8859_16 }, { "CP866", TINICONV_CHARSET_CP866 }, { "KOI8-R", TINICONV_CHARSET_KOI8_R }, { "KOI8-RU", TINICONV_CHARSET_KOI8_RU }, { "KOI8-U", TINICONV_CHARSET_KOI8_U }, { "MACCYRILLIC", TINICONV_CHARSET_MACCYRILLIC }, { "UCS-2", TINICONV_CHARSET_UCS_2 }, { "UTF-7", TINICONV_CHARSET_UTF_7 }, { "UTF-8", TINICONV_CHARSET_UTF_8 }, { "CHINESE", TINICONV_CHARSET_CHINESE }, { "BIG5", TINICONV_CHARSET_BIG5 }, }; const unsigned int number_of_charsets = sizeof(charset_list)/sizeof(struct charset_info); fldigi-4.2.05/src/misc/newinstall.cxx0000664000175000017500000003204314611711171014413 00000000000000// ---------------------------------------------------------------------------- // // newinstall.cxx // // Copyright (C) 2007-2014 Dave Freese, W1HKJ // Copyright (C) 2010 Stelios Bounanos, M0GLD // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "macros.h" #include "main.h" #include "fl_digi.h" #include "configuration.h" #include "confdialog.h" #include "record_browse.h" #include "record_loader.h" #include "logger.h" #include "tabdefs.h" #include #include #include #include #include static std::string label[24]; static std::string text[24]; void newmacros() { label[0] = "RsID CQ"; text[0] = "\n\ CQ CQ CQ de \n\ CQ CQ CQ de pse k\n\ <@TXRSID:off>"; label[1] = "ANS @>|"; text[1] = "\ de kn\n\ "; label[2] ="QSO @>>"; text[2] = "\n\ de "; label[3] = "KN @||"; text[3] = " btu de k\n\ "; label[4] = "SK @||"; text[4] = "\n\ tnx fer QSO , 73, God bless.\n\ de sk\n\ "; label[5] = "Me/Qth"; text[5] = "\n\ op: \n\ qth: \n\ loc: \n"; label[6] = "Brag"; text[6] = "\n\ << , >>\n\ Age: \n\ Rig: \n\ Pwr: \n\ Ant: \n\ OS: \n\ Soft: \n\ Web: \n\ Email: "; label[7] = ""; text[7] = ""; label[8] = "T/R"; text[8] = ""; label[9] = "Tx @>>"; text[9] = ""; label[10] = "Rx @||"; text[10] = ""; label[11] = "TX @>|"; text[11] = "\n\ de k\n\ "; label[12] = "C Ans @>|"; text[12] = "de "; label[13] = "C rpt @>|"; text[13] = " QSL DE K\n\ "; label[14] = "C Rep @>|"; text[14] = "\n\ RR NBR TU DE K\n\ "; label[15] = "C Incr"; text[15] = ""; label[16] = "C Decr"; text[16] = ""; label[17] = "Log QSO"; text[17] = ""; label[18] = "CW-CQ @>|"; text[18] = "CQ CQ CQ DE CQ CQ CQ DE K"; label[19] = ""; text[19] = ""; label[20] = "CQ @-3+"; text[20] = "\n\ CQ CQ CQ de \n\ CQ CQ CQ de k"; label[21] = "CQ-ID @>|"; text[21] = "\n\ CQ CQ CQ de \n\ CQ CQ CQ de K\n\ "; label[22] = ""; text[22] = ""; label[23] = ""; text[23] = ""; for (int i = 0; i < 24; i++) { macros.text[i] = text[i]; macros.name[i] = label[i]; } for (int i = 24; i < MAXMACROS; i++) { macros.text[i] = ""; macros.name[i] = ""; } } struct paldata { const char *fname; const char *rgbstr0; const char *rgbstr1; const char *rgbstr2; const char *rgbstr3; const char *rgbstr4; const char *rgbstr5; const char *rgbstr6; const char *rgbstr7; const char *rgbstr8; }; paldata palfiles[] = { { "banana.pal", " 0; 0; 0", " 59; 59; 27","119;119; 59","179;179; 91","227;227;123", "235;235;151","239;239;183","247;247;219","255;255;255" }, { "blue1.pal"," 0; 0; 2", " 0; 0; 64"," 7; 11;128"," 39; 47;192"," 95;115;217", "151;179;231","187;203;239","219;227;247","255;255;255" }, { "blue2.pal"," 3; 3; 64", " 7; 11;128"," 39; 47;192"," 95;115;217","151;179;231", "187;203;239","219;227;247","255;255;255","255;253;108" }, { "blue3.pal"," 0; 0; 0", " 31; 31; 31"," 63; 63; 63"," 91; 91;167","119;119;191", "155;155;219","191;191;191","223;223;223","255;255;255" }, { "brown.pal"," 0; 0; 0", "107; 63; 11","175; 95; 31","199;119; 43","215;163; 63", "231;211; 87","243;247;111","247;251;179","255;255;255" }, { "cyan1.pal"," 0; 0; 0", " 5; 10; 10"," 22; 42; 42"," 52; 99; 99"," 94;175;175", "131;209;209","162;224;224","202;239;239","255;255;255" }, { "cyan2.pal"," 0; 0; 0", " 35; 51; 51"," 75;103;103","115;159;159","155;211;211", "183;231;231","203;239;239","227;247;247","255;255;255" }, { "cyan3.pal"," 0; 0; 0", " 94;114;114","138;162;162","171;201;201","199;232;232", "216;243;243","228;247;247","241;251;251","255;255;255" }, { "default.pal", " 0; 0; 0", " 0; 6;136"," 0; 19;198"," 0; 32;239","172;167;105", "194;198; 49","225;228;107","255;255; 0","255; 51; 0" }, { "digipan.pal"," 0; 0; 0", " 0; 0; 64"," 0; 0;128"," 0; 0;217","150;147; 92", "183;186; 46","225;228;107","255;255; 0","255; 51; 0" }, { "fldigi.pal"," 0; 0; 0", " 0; 0;177"," 3;110;227"," 0;204;204","223;223;223", " 0;234; 0","244;244; 0","250;126; 0","244; 0; 0" }, { "gmfsk.pal"," 0; 0;256", " 0; 62;194"," 0;126;130"," 0;190; 66"," 0;254; 2", " 62;194; 0","126;130; 0","190; 66; 0","254; 2; 0" }, { "gray1.pal"," 0; 0; 0", " 69; 69; 69"," 99; 99; 99","121;121;121","140;140;140", "157;157;157","172;172;172","186;186;186","199;199;199" }, { "gray2.pal"," 0; 0; 0", " 88; 88; 88","126;126;126","155;155;155","179;179;179", "200;200;200","220;220;220","237;237;237","254;254;254" }, { "green1.pal"," 0; 0; 0", " 0; 32; 0"," 0; 64; 0"," 0; 96; 0"," 0;128; 0", " 0;160; 0"," 0;192; 0"," 0;224; 0","255;255;255" }, { "green2.pal"," 0; 0; 0", " 0; 60; 0"," 0;102; 0"," 0;151; 0"," 0;242; 0", "255;255; 89","240;120; 0","255;148; 40","255; 0; 0" }, { "jungle.pal"," 0; 0; 0", "107; 67; 0","223;143; 0","255;123; 27","255; 91; 71", "255;195; 95","195;255;111","151;255;151","255;255;255" }, { "negative.pal","255;255;255", "223;223;223","191;191;191","159;159;159","127;127;127", " 95; 95; 95"," 63; 63; 63"," 31; 31; 31"," 0; 0; 0" }, { "orange.pal"," 0; 0; 0", " 63; 27; 0","131; 63; 0","199; 95; 0","251;127; 11", "251;155; 71","251;187;131","251;219;191","255;255;255" }, { "pink.pal"," 0; 0; 0", " 63; 35; 35","135; 75; 75","203;111;111","255;147;147", "255;175;175","255;199;199","255;227;227","255;255;255" }, { "rainbow.pal"," 0; 0;163", " 0; 87;191"," 0;207;219"," 0;247;139"," 0;255; 23", " 95;255; 0","219;255; 0","255;171;155","255;255;255" }, { "scope.pal"," 0; 0; 0", " 0; 0;167"," 0; 79;255"," 0;239;255"," 0;255; 75", " 95;255; 0","255;255; 0","255;127; 0","255; 0; 0" }, { "sunburst.pal"," 0; 0; 0", " 0; 0; 59"," 0; 0;123","131; 0;179","235; 0; 75", "255; 43; 43","255;215;111","255;255;183","255;255;255" }, { "vk4bdj.pal"," 0; 0; 0", " 0; 32; 0"," 0;154; 0"," 0;161; 0"," 0;177; 0", "156;209;144","192;185;183","214;222;224","255;255;255" }, { "yellow1.pal", " 0; 0; 0", " 31; 31; 0"," 63; 63; 0"," 95; 95; 0","127;127; 0", "159;159; 0","191;191; 0","223;223; 0","255;255; 0" }, { "yellow2.pal", " 0; 0; 0", " 39; 39; 0"," 75; 75; 0","111;111; 0","147;147; 0", "183;183; 0","219;219; 0","255;255; 0","255;255;255" }, { "yl2kf.pal"," 0; 0; 0", " 0; 0;119"," 7; 11;195"," 39; 47;159"," 95;115;203", "151;179;255","187;203;255","219;227;255","255;255; 5" }, { 0,0, 0,0,0,0, 0,0,0,0 } }; void create_new_palettes() { paldata *pd = palfiles; std::string Filename; while (pd->fname) { Filename = PalettesDir; Filename.append(pd->fname); std::ofstream pfile(Filename.c_str()); pfile << pd->rgbstr0 << std::endl; pfile << pd->rgbstr1 << std::endl; pfile << pd->rgbstr2 << std::endl; pfile << pd->rgbstr3 << std::endl; pfile << pd->rgbstr4 << std::endl; pfile << pd->rgbstr5 << std::endl; pfile << pd->rgbstr6 << std::endl; pfile << pd->rgbstr7 << std::endl; pfile << pd->rgbstr8 << std::endl; pfile.close(); pd++; } } void create_new_macros() { std::string Filename = MacrosDir; Filename.append("macros.mdf"); newmacros(); macros.saveMacros(Filename); } // ============================================================================= #include #include #include #include #include #include #include #include "configuration.h" #include "confdialog.h" #include "icons.h" #include "gettext.h" class Wizard : public Fl_Window { public: struct wizard_tab { Fl_Group* tab; Fl_Group* parent; int position; int x, y, w, h; }; Wizard(int w, int h, const char* l = 0) : Fl_Window(w, h, l) { create_wizard(); } ~Wizard() { destroy_wizard(); } private: void create_wizard(void); Fl_Group* make_intro(void); void destroy_wizard(void); static void wizard_cb(Fl_Widget* w, void* arg); Fl_Wizard *wizard; Fl_Button *prev, *next, *done; typedef std::vector tab_t; tab_t tabs; }; static int btn_h = 22; static int pad = 4; void Wizard::create_wizard(void) { createRecordLoader(); callback(wizard_cb, this); xclass(PACKAGE_TARNAME); wizard = new Fl_Wizard(0, 0, w(), h()); wizard->end(); // create the buttons fl_font(FL_HELVETICA, FL_NORMAL_SIZE); struct { Fl_Button** button; const char* label; } buttons[] = { { &done, _("Finish") }, { &next, _("Next") }, { &prev, _("Back") }, }; int x = w() - 10; int bw = 0; for (size_t i = 0; i < sizeof(buttons)/sizeof(*buttons); i++) { bw = fl_width(buttons[i].label) + 10; Fl_Button* b = *buttons[i].button = new Fl_Button( (x = x - bw - 10), wizard->y() + grpOperator->h() + pad, bw, btn_h, buttons[i].label); b->callback(wizard_cb, this); } done->activate(); prev->deactivate(); next->activate(); end(); position(MAX(0, fl_digi_main->x() + (fl_digi_main->w() - w()) / 2), MAX(0, fl_digi_main->y() + (fl_digi_main->h() - h()) / 2)); // populate the Fl_Wizard group struct wizard_tab tabs_[] = { { NULL }, { grpOperator }, { grpSoundDevices }, { grpRigFlrig }, { grpRigCat }, { grpRigHamlib }, { tabDataFiles } }; tabs.resize(sizeof(tabs_)/sizeof(*tabs_)); memcpy(&tabs[0], tabs_, sizeof(tabs_)); for (tab_t::iterator i = tabs.begin() + 1; i != tabs.end(); ++i) { i->parent = i->tab->parent(); i->position = i->parent->find(i->tab); i->x = i->tab->x(); i->y = i->tab->y(); i->w = i->tab->w(); i->h = i->tab->h(); } tabs[0].tab = make_intro(); tabs[0].w = grpOperator->w(); tabs[0].h = grpOperator->h(); for (tab_t::iterator i = tabs.begin(); i != tabs.end(); ++i) { i->tab->resize(0, 0, grpOperator->w(), grpOperator->h()); wizard->add(i->tab); } wizard->value(tabs[0].tab); } void Wizard::destroy_wizard(void) { // re-parent tabs for (tab_t::const_iterator i = tabs.begin() + 1; i != tabs.end(); ++i) { i->parent->insert(*i->tab, i->position); if (i < tabs.end() - 1) i->tab->hide(); i->tab->resize(i->x, i->y, i->w, i->h); i->parent->init_sizes(); } Fl_Button* b[] = { prev, next, done }; for (size_t i = 0; i < sizeof(b)/sizeof(*b); i++) delete b[i]; } void Wizard::wizard_cb(Fl_Widget* w, void* arg) { Wizard* wiz = static_cast(arg); if (w == wiz || w == wiz->done) { delete wiz; return; } if (w == wiz->prev) wiz->wizard->prev(); else if (w == wiz->next) wiz->wizard->next(); Fl_Group* cur = static_cast(wiz->wizard->value()); // modify buttons if (cur == wiz->tabs[0].tab) { wiz->prev->deactivate(); wiz->next->activate(); wiz->done->activate(); } else if (cur == wiz->tabs.back().tab) { wiz->prev->activate(); wiz->next->deactivate(); wiz->done->activate(); } else { wiz->prev->activate(); wiz->next->activate(); wiz->done->activate(); } wiz->prev->show(); wiz->next->show(); wiz->done->show(); wiz->prev->redraw(); wiz->next->redraw(); wiz->done->redraw(); } Fl_Group* Wizard::make_intro(void) { Fl_Group* intro = new Fl_Group( 0, 0, grpOperator->w(), grpOperator->h(), ""); std::ostringstream help_; help_ << "\n" << _("The wizard will guide you through the basic fldigi settings:") << "\n\n\t- " << _("Operator") << "\n\t- " << _("Sound Card Interface") << "\n\t- " << _("Transceiver control, flrig/rigcat/hamlib") << "\n\n" << _("Feel free to skip any pages or exit the wizard at any time") << ". " << _("All settings shown here can be changed later via the Configure menu") << '.'; Fl_Box* help = new Fl_Box(20, intro->y() + intro->h() / 4, intro->w() - 40, 3 * intro->h()/ 4); help->align(FL_ALIGN_TOP_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_WRAP); help->copy_label(help_.str().c_str()); intro->end(); return intro; } void show_wizard(int argc, char** argv) { Wizard* w = new Wizard(grpOperator->w(), grpOperator->h() + (btn_h + 2 * pad), _("Fldigi configuration wizard")); if (argc && argv) w->show(argc, argv); else { w->show(); w->set_modal(); } first_use = true; } fldigi-4.2.05/src/misc/pixmaps.cxx0000664000175000017500000015275314532252172013732 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include // This file contains custom icons, icons from gtk, and possibly other sources. /* XPM */ const char *waterfall_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 5 1", " c None", ". c #124188", "+ c #788D9B", "@ c #ABCBE2", "# c #204A87", " ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " ..+..@@@@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " ..+..@@@@..+.. ", " ..+..@##@..+.. ", " "}; // audio-card from gnome icon theme /* XPM */ const char *audio_card_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 102 2", " c #3A3E00", ". c #3A3F00", "X c #3B3F00", "o c #2F3536", "O c #303634", "+ c #303735", "@ c #303637", "# c #363D32", "$ c #323835", "% c #313836", "& c #333936", "* c #323937", "= c #343936", "- c #383E31", "; c #3B4000", ": c #3D4104", "> c #3E4206", ", c #657000", "< c #677300", "1 c #687400", "2 c #687502", "3 c #687505", "4 c #6B7704", "5 c #6B7901", "6 c #6C7900", "7 c #6C7801", "8 c #6D7A00", "9 c #6C7A02", "0 c #6F7D01", "q c #707E02", "w c #707E07", "e c #404630", "r c #3D5B50", "t c #38595E", "y c #38595F", "u c #395A5F", "i c #365761", "p c #405C4F", "a c #545650", "s c #545652", "d c #555753", "f c #565852", "g c #565853", "h c #565854", "j c #575955", "k c #585A56", "l c #5A5C58", "z c #5D5E5B", "x c #5E5F5C", "c c #426050", "v c #426251", "b c #646662", "n c #656663", "m c #666864", "M c #676965", "N c #696A67", "B c #696B67", "V c #6E6F6D", "C c #6E706C", "Z c #6F716D", "A c #758201", "S c #748202", "D c #798708", "F c #7F8839", "G c #A3B31A", "H c #A4B31A", "J c #A4B419", "K c #AABA1A", "L c #858E39", "P c #848D3B", "I c #878F3D", "U c #87903B", "Y c #8A9539", "T c #8C9638", "R c #919C38", "E c #949E39", "W c #959F3A", "Q c #959F3B", "! c #929D3C", "~ c #939E3C", "^ c #959F3D", "/ c #95A03C", "( c #96A03C", ") c #97A03C", "_ c #97A13C", "` c #97A23D", "' c #D8EB31", "] c #DBEF33", "[ c #DFF234", "{ c #E0F338", "} c #E4F839", "| c #E8FB38", " . c #EBFF39", ".. c #EFFF65", "X. c #B7B9B5", "o. c #C4C6C2", "O. c #C6C8C4", "+. c #C7C9C5", "@. c #C8CAC6", "#. c #D0D2CE", "$. c #D4D6D2", "%. c None", /* pixels */ "%.%.%.%.%.%.%.%.%.%.%.%.j k j %.", "%.%.%.%.%.%.%.%.%.%.%.d O.#.X.d ", "X a $.d d %.", " E W W W Q Q ( ( ( ^ f $.d %.%.", " ` e * * % % + # c v f $.d l x ", " ` + V Z Z Z C & y u f $.d o.d ", " ` + Z d d d N = 3 8 f $.d h g ", " _ + B M m n b $ p t f $.d %.%.", " ) - @ o o o o O r i f $.d k z ", " / A q 0 9 5 2 1 < , f $.d @.d ", " ~ K S J 6 H 7 G U I f $.d d h ", " ! { D ' 4 ] w [ P : a $.d %.%.", " T ..R } L | Y .F > s $.d %.%.", "; X X X X X X . . . . s +.d %.%.", "%.%.%.%.%.%.%.%.%.%.%.d d d %.%.", "%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%." }; // help-about from gnome /* XPM */ const char *help_about_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 76 1", " c #C4A001", ". c #C5A101", "X c #C5A102", "o c #C6A202", "O c #C6A203", "+ c #C7A403", "@ c #C7A404", "# c #C7A405", "$ c #C7A406", "% c #C7A407", "& c #C7A507", "* c #C8A508", "= c #C9A70B", "- c #C9A80D", "; c #CAA80C", ": c #C9A810", "> c #CCAC12", ", c #CCAC14", "< c #CDAE1B", "1 c #CFB11C", "2 c #D0B11F", "3 c #CFB021", "4 c #D2B522", "5 c #D3B62C", "6 c #D2B62F", "7 c #F6E132", "8 c #F6E235", "9 c #F5E038", "0 c #F7E23A", "q c #F8E33C", "w c #F8E43E", "e c #D9C04A", "r c #E4CE4C", "t c #E4CE4F", "y c #E7D041", "u c #E7D247", "i c #EBD755", "p c #EBD756", "a c #ECD85A", "s c #F8E441", "d c #F9E644", "f c #F6E349", "g c #FBE74A", "h c #F9E74D", "j c #F7E75F", "k c #F8E75A", "l c #FBE95C", "z c #E9D668", "x c #EAD86C", "c c #F6E664", "v c #F6E667", "b c #F8E864", "n c #F8E865", "m c #F9E96B", "M c #FAEB71", "N c #F9EB73", "B c #F8EA7B", "V c #FAEC7C", "C c #F9EC7F", "Z c #EEDF83", "A c #EEDF85", "S c #F7E981", "D c #F8EC88", "F c #F9ED89", "G c #FAED8B", "H c #F8EB8F", "J c #F9EE9B", "K c #FBF097", "L c #FCF2A6", "P c #FCF3AA", "I c #FDF6BC", "U c #FCF7CF", "Y c #FDF8D1", "T c #FDF9DF", "R c #FEFCEE", "E c None", /* pixels */ "EEEEEEE.EEEEEEEE", "EEEEEE@e@EEEEEEE", "EEEEEE3TEEEEEEE", "EEEEEE&4&EEEEEEE", "EEEEEEE EEEEEEEE", "EEEEEEEEEEEEEEEE" }; // insert link icon from gnome /* XPM */ const char *insert_link_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 97 2", " c #2E3436", ". c #2F3536", "X c #363C3D", "o c #373D3E", "O c #464A48", "+ c #464B4C", "@ c #4F524F", "# c #545652", "$ c #555753", "% c #575955", "& c #585A56", "* c #595B57", "= c #5A5B57", "- c #5A5C58", "; c #5B5D58", ": c #5C5D59", "> c #62645F", ", c #656763", "< c #6B6D69", "1 c #6E6F6B", "2 c #6F716D", "3 c #71726F", "4 c #767773", "5 c #777875", "6 c #7C7E79", "7 c #7C7F79", "8 c #CF5F04", "9 c #D06106", "0 c #D86605", "q c #D86706", "w c #F47A03", "e c #F47A04", "r c #F47D0B", "t c #E97910", "y c #E97911", "u c #7E807D", "i c #EA9D4C", "p c #F4B15E", "a c #F5B364", "s c #FDC97D", "d c #838580", "f c #8A8C87", "g c #979B96", "h c #989B95", "j c #9FA19D", "k c #B3B4B0", "l c #B4B7B0", "z c #B7B7B1", "x c #B5B7B2", "c c #B5B8B2", "v c #BABDB6", "b c #BBBEB7", "n c #BBBEB8", "m c #BDBEBB", "M c #C0C0BC", "N c #C2C3BF", "B c #FBD7AA", "V c #FBD9AE", "C c #C4C6C0", "Z c #C5C7C1", "A c #CBCEC8", "S c #CCCEC9", "D c #D0D1CE", "F c #D1D3CE", "G c #D4D4D0", "H c #D6D7D6", "J c #D9DAD8", "K c #DBDCDB", "L c #DEDEDA", "P c #DFDFDD", "I c #FDE6C4", "U c #FEE9CA", "Y c #FEEACC", "T c #E0E0DC", "R c #E0E0DD", "E c #E2E3E2", "W c #E4E4E1", "Q c #E6E6E4", "! c #E7E8E6", "~ c #E9E9E6", "^ c #E8E9E8", "/ c #EDEDEB", "( c #EDEDEC", ") c #EDEEED", "_ c #EEEEEC", "` c #EFF0EE", "' c #F1F1F0", "] c #F3F3F1", "[ c #F3F3F2", "{ c #F4F5F4", "} c #F5F5F4", "| c #F6F6F5", " . c #F6F6F6", ".. c #F8F8F7", "X. c #F9F9F9", "o. c #FDFDFD", "O. c None", /* pixels */ "O.# # # # ; O.O.O.O.O.O.O.O.; # ", "O. .{ [ ` J u - O.O.O.O.- H ) o.", "O.v v v b C F < # $ $ # 5 / A n ", "O.# * $ * 7 b h 1 m m 1 x Z 6 % ", "O.O.& R Q 2 $ $ $ $ $ $ $ $ 3 K ", "O.O.: z L ] } ...X.| ' ( ^ ! E ", "O.O @ 4 M G T W ~ _ P D N k j f ", "O.S c d , = $ $ $ $ $ $ $ $ & > ", "O.v v v l g + X O.O.O.O.X + g l ", "O. . o O.O.O.O.O.O.O.O.o . ", "O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", "O.O.O.O.O.w e r r r r r e w O.O.", "O.O.O.O.O.O.y V Y I U B t O.O.O.", "O.O.O.O.O.O.O.q a s p 0 O.O.O.O.", "O.O.O.O.O.O.O.O.9 i 9 O.O.O.O.O.", "O.O.O.O.O.O.O.O.O.8 O.O.O.O.O.O." }; // close icon from default gtk theme /* XPM */ const char *close_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 74 1", " c #5A5C58", ". c #5C5E5B", "X c #5C5F5B", "o c #5D5F5B", "O c #5E5F5B", "+ c #5E5F5C", "@ c #5D605A", "# c #5D605B", "$ c #5C615B", "% c #5F605A", "& c #5E615B", "* c #5E605C", "= c #5F605C", "- c #5E615C", "; c #5F615C", ": c #5E605D", "> c #5E615D", ", c #5F625C", "< c #5F625D", "1 c #5F615E", "2 c #5F625E", "3 c #60615B", "4 c #60625D", "5 c #60615E", "6 c #60625E", "7 c #61625E", "8 c #61645F", "9 c #7D807A", "0 c #7E817B", "q c #80827B", "w c #80837E", "e c #82847D", "r c #82857E", "t c #838680", "y c #848681", "u c #848781", "i c #868983", "p c #878983", "a c #868984", "s c #888A85", "d c #898C86", "f c #898D86", "g c #8A8C86", "h c #8A8D88", "j c #8D9089", "k c #8E908A", "l c #8E918B", "z c #8F928C", "x c #8F928D", "c c #91938E", "v c #92948F", "b c #949590", "n c #949691", "m c #959892", "M c #959992", "N c #969994", "B c #979B95", "V c #B1B4AC", "C c #B4B7AF", "Z c #B8BBB3", "A c #B9BCB4", "S c #BABDB5", "D c #BDC0B8", "F c #BDC1B9", "G c #BFC3BB", "H c #C1C4BC", "J c #C3C6BE", "K c #C3C7BF", "L c #C4C8C0", "P c #C5C9C1", "I c #CACEC6", "U c #CBCEC6", "Y c #CDD1C9", "T c None", /* pixels */ "TTTTTTTTTTTTTTTT", "TTTTTTTTTTTTTTTT", "TT681TTTTTT ,5TT", "TT5Ll2TTTT=wZ:TT", "TT4fUx7TT4aDu;TT", "TTT3jYz<;dHs+TTT", "TTTT>kINmJh=TTTT", "TTTTT>BPKM*TTTTT", "TTTTT-vHGc+TTTTT", "TTTT-uFnbSr.TTTT", "TTT=eAg%#iCq$TTT", "TT:9Cp@TTXyV0;TT", "TT;Vp@TTTTOtVoTT", "TT44&TTTTTT&O4TT", "TTTTTTTTTTTTTTTT", "TTTTTTTTTTTTTTTT" }; // gtk apply icon /* XPM */ const char *apply_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 88 1", " c #498D07", ". c #498A0D", "X c #519412", "o c #529612", "O c #559815", "+ c #579B16", "@ c #589B17", "# c #579818", "$ c #599C1B", "% c #5A9D1B", "& c #59991C", "* c #5B9C1D", "= c #5C9D1E", "- c #5D9E1F", "; c #5D9C21", ": c #5E9D22", "> c #60A023", ", c #60A222", "< c #66A52C", "1 c #6AA92F", "2 c #6AA730", "3 c #6BA931", "4 c #6FAB36", "5 c #71AC38", "6 c #74AF3A", "7 c #74AE3D", "8 c #75B13D", "9 c #76B13E", "0 c #7DB648", "q c #7FB749", "w c #8EE03E", "e c #81B84D", "r c #83B950", "t c #88BF53", "y c #89BE57", "u c #95DF4D", "i c #8CC259", "p c #8FC55B", "a c #91E145", "s c #98E152", "d c #99E054", "f c #9BE355", "g c #9DE25A", "h c #9EE459", "j c #A1E55E", "k c #92C660", "l c #93C661", "z c #95C863", "x c #96C965", "c c #97C867", "v c #9FD16F", "b c #A1D073", "n c #A1D372", "m c #A4D475", "M c #A6D777", "N c #A7DC75", "B c #A8DA77", "V c #A6D678", "C c #ABDB7C", "Z c #ABDA7E", "A c #ACDC7C", "S c #A0E360", "D c #A4E366", "F c #A5E566", "G c #A7E66A", "H c #A7E26E", "J c #A8E56C", "K c #A7E868", "L c #A9E470", "P c #ABE672", "I c #AFE877", "U c #ADE279", "Y c #ADE07A", "T c #AEE47A", "R c #B0E77B", "E c #B3EB7D", "W c #B4EB7C", "Q c #ACD980", "! c #ADDC80", "~ c #AEDC81", "^ c #B3E583", "/ c #B3E187", "( c #B4E684", ") c #B8EB87", "_ c #BBE98E", "` c #BCE990", "' c #C2F094", "] c None", /* pixels */ "]]]]]]]]]]]->]]]", "]]]]]]]]]]%bBq@]", "]]]]]]]]]]yTGZ>]", "]]]]]]]]]3AgHi]]", "]]]]]]]]ocPdm#]]", "]]]]]]]]7(uU5]]]", "]] ]]]]&ZSFl]]]]", "]5b0o]]iRsN<]]]]", "%V'`z:4/fPe]]]]]", "+p_W)Z~Ggv-]]]]]", "]+e/EKjaU7]]]]]]", "]]]2MIwFz]]]]]]]", "]]]]*l^~:]]]]]]]", "]]]]].81]]]]]]]]", "]]]]]]]]]]]]]]]]", "]]]]]]]]]]]]]]]]" }; // enter key icon from KDE's crystal theme /* XPM */ const char *enter_key_icon[] = { /* columns rows colors chars-per-pixel */ "16 16 91 1", " c #5C5C5C", ". c #626262", "X c #666666", "o c #696969", "O c #6B6B6B", "+ c #6C6C6C", "@ c #6E6E6E", "# c #6F6F6F", "$ c #717171", "% c #737373", "& c #747474", "* c #838383", "= c #8D8D8D", "- c #92928F", "; c #939393", ": c #A3A3A2", "> c #A7A7A5", ", c #A7A7A6", "< c #A7A7A7", "1 c #A9A9A8", "2 c #A9A9A9", "3 c #AEAEAD", "4 c #B0B0AE", "5 c #B1B1AF", "6 c #B2B2B0", "7 c #B4B4B2", "8 c #B5B5B3", "9 c #B7B7B6", "0 c #B7B7B7", "q c #B9B9B7", "w c #BABAB9", "e c #BBBBBB", "r c #BCBCBB", "t c #BEBEBC", "y c #C2C2C1", "u c #C4C4C0", "i c #C4C4C4", "p c #C5C5C5", "a c #C6C6C4", "s c #C7C7C7", "d c #C9C9C6", "f c #CBCBC8", "g c #CACACA", "h c #CFCFCD", "j c #D0D0CE", "k c #D1D1CF", "l c #D0D0D0", "z c #D1D1D1", "x c #D2D2D0", "c c #D3D3D1", "v c #D2D2D2", "b c #D3D3D2", "n c #D3D3D3", "m c #D4D4D3", "M c #D4D4D4", "N c #D5D5D5", "B c #D7D7D6", "V c #D7D7D7", "C c #D8D8D8", "Z c #D9D9D8", "A c #D9D9D9", "S c #DADAD9", "D c #DADADA", "F c #DCDCDC", "G c #DDDDDD", "H c #DEDEDE", "J c #DFDFDF", "K c #E0E0E0", "L c #E2E2E2", "P c #E3E3E3", "I c #E4E4E4", "U c #E5E5E5", "Y c #E7E7E7", "T c #E8E8E8", "R c #E9E9E9", "E c #EBEBEB", "W c #ECECEC", "Q c #EDEDED", "! c #EFEFEF", "~ c #F0F0F0", "^ c #F3F3F3", "/ c #F4F4F4", "( c #F5F5F5", ") c #F6F6F6", "_ c #F7F7F7", "` c #F8F8F8", "' c #F9F9F9", "] c #FAFAFA", "[ c #FCFCFC", "{ c #FDFDFD", "} c None", /* pixels */ "}}}}}}}}}}}}}}}}", "}}}}}}fSFFFFFSd}", "}}}}}}c{[[[[['a}", "}}}}}}x]_`'`_`t}", "}}}}}}x)^(p`^/r}", "}}}}}}k^!!%'!!w}", "}}}}}}j~WQ#`EWq}", "}}}}}}yWTR@(TR9}", "}Z)))_/YIU+~PI8}", "}BLHKH,,,,,,,,,:-}", "}}}}}}}}}}}}}}}}" }; // question icon from default gtk theme /* XPM */ const char *dialog_question_48_icon[] = { "48 48 215 2", " c None", ". c #3768A6", "+ c #3968A7", "@ c #3A6AA7", "# c #386BA6", "$ c #3968A5", "% c #A7BEDA", "& c #F4F7FB", "* c #F4F8FB", "= c #A5BDD9", "- c #3769A6", "; c #3869A6", "> c #BBCEE4", ", c #FFFFFF", "' c #FEFEFF", ") c #BBCDE3", "! c #F9FBFD", "~ c #98B9DC", "{ c #99B9DC", "] c #729FCF", "^ c #97B8DB", "/ c #BACDE3", "( c #719ECE", "_ c #709DCD", ": c #709DCE", "< c #6F9CCD", "[ c #6F9CCC", "} c #95B6DA", "| c #B9CDE3", "1 c #6E9CCC", "2 c #6E9BCC", "3 c #6D9BCC", "4 c #6D9ACB", "5 c #94B5D9", "6 c #B9CCE3", "7 c #78A2D0", "8 c #709CCC", "9 c #6C9ACB", "0 c #6C99CA", "a c #6B99CA", "b c #93B4D8", "c c #B9CCE2", "d c #739FCE", "e c #A1BEDE", "f c #C9DAEC", "g c #EBF1F8", "h c #FAFCFD", "i c #E7EEF6", "j c #B7CDE6", "k c #759FCE", "l c #6B98CA", "m c #6A98C9", "n c #6A97C9", "o c #92B3D8", "p c #B9CBE2", "q c #80A8D3", "r c #E8EFF7", "s c #6997C9", "t c #6996C8", "u c #6896C8", "v c #91B2D7", "w c #B8CBE2", "x c #7FA7D2", "y c #FDFDFE", "z c #E9F0F7", "A c #EFF4F9", "B c #BBD0E7", "C c #6895C8", "D c #6795C7", "E c #6794C7", "F c #8FB1D6", "G c #B8CBE1", "H c #7EA6D1", "I c #F2F6FA", "J c #ADC6E1", "K c #749FCD", "L c #6A98CA", "M c #AFC7E2", "N c #E1EAF4", "O c #6694C7", "P c #6694C6", "Q c #6593C6", "R c #8EAFD5", "S c #B7CBE1", "T c #96B7DA", "U c #6C99CB", "V c #709CCB", "W c #719DCC", "X c #7FA5D0", "Y c #6693C6", "Z c #6592C6", "` c #6492C5", " . c #6391C5", ".. c #8DAFD4", "+. c #B0C7E2", "@. c #CBDBEC", "#. c #6391C4", "$. c #6290C4", "%. c #8CADD3", "&. c #B7CAE1", "*. c #3768A5", "=. c #396AA7", "-. c #A4BCD8", ";. c #96B6D8", ">. c #FDFEFE", ",. c #85A9D2", "'. c #6290C3", "). c #618FC3", "!. c #608EC3", "~. c #8BADD3", "{. c #A0B8D6", "]. c #3768A7", "^. c #FEFFFF", "/. c #99B8DA", "(. c #A4BFDD", "_. c #608EC2", ":. c #5F8DC2", "<. c #5F8DC1", "[. c #8AABD2", "}. c #3868A6", "|. c #396AA6", "1. c #87AAD2", "2. c #FBFCFE", "3. c #A1BDDC", "4. c #5F8EC2", "5. c #5E8DC1", "6. c #5E8CC1", "7. c #89AAD1", "8. c #3767A6", "9. c #3969A6", "0. c #92B4D8", "a. c #D0DEEE", "b. c #B1C8E2", "c. c #5D8CC1", "d. c #5D8BC0", "e. c #87AAD1", "f. c #F9FAFD", "g. c #79A0CC", "h. c #5C8BC0", "i. c #87A9D0", "j. c #F9FAFC", "k. c #B6C9E0", "l. c #3767A5", "m. c #90B2D6", "n. c #6B97C7", "o. c #6C97C8", "p. c #6C97C7", "q. c #6C96C7", "r. c #5C8AC0", "s. c #5B8ABF", "t. c #87A8D0", "u. c #3668A4", "v. c #8FB0D6", "w. c #5C8ABF", "x. c #5B89BF", "y. c #86A8D0", "z. c #B6CAE1", "A. c #8DAFD5", "B. c #ECF1F8", "C. c #5A89BF", "D. c #5A89BE", "E. c #85A7CF", "F. c #F8FAFC", "G. c #B6CAE0", "H. c #BACDE2", "I. c #8BADD4", "J. c #F6F8FB", "K. c #5A88BE", "L. c #5988BE", "M. c #5987BD", "N. c #84A7CE", "O. c #89ABD3", "P. c #EBF1F7", "Q. c #5887BD", "R. c #84A6CE", "S. c #88ABD1", "T. c #5886BD", "U. c #5786BC", "V. c #83A6CE", "W. c #82A5CE", "X. c #3667A4", "Y. c #85A8D0", "Z. c #5785BC", "`. c #5685BC", " + c #82A4CD", ".+ c #B6C8E0", "++ c #3767A3", "@+ c #85A8CF", "#+ c #5685BB", "$+ c #5584BB", "%+ c #3667A3", "&+ c #B8CAE1", "*+ c #5684BB", "=+ c #81A4CC", "-+ c #B5C8E0", ";+ c #3566A2", ">+ c #82A5CD", ",+ c #5483BA", "'+ c #B7C9E0", ")+ c #81A4CD", "!+ c #5382BA", "~+ c #80A3CB", "{+ c #B5C8DF", "]+ c #80A3CC", "^+ c #5382B9", "/+ c #7FA2CB", "(+ c #B4C8DF", "_+ c #9DB5D3", ":+ c #F1F5F9", "<+ c #F0F4F9", "[+ c #9CB4D3", "}+ c #3565A1", "|+ c #305D95", "1+ c #3666A3", "2+ c #305D96", " ", " ", " . + @ # ", " $ % & * = - ", " ; > , ' ' , ) ; ", " ; > , ! ~ { ! , ) ; ", " ; > , ! ~ ] ] ~ ! , ) ; ", " ; > , ! ~ ] ] ] ] ~ ! , ) ; ", " ; > , ! ~ ] ] ] ] ] ] ~ ! , ) ; ", " ; > , ! ~ ] ] ] ] ] ] ] ] ~ ! , ) - ", " ; > , ! ~ ] ] ] ] ] ] ] ] ] ] ^ ! , / - ", " ; > , ! ~ ] ] ] ] ] ] ] ] ] ( ( _ ^ ! , / - ", " ; > , ! ~ ] ] ] ] ] ] ] ( ( : _ < < [ } ! , | - ", " ; > , ! ~ ] ] ] ] ] ] ( ( _ _ < < 1 2 3 4 5 ! , 6 - ", " ; > , ! ~ ] ] ] ] ( ( : _ < 7 8 2 2 4 4 9 0 a b ! , c - ", " ; > , ! ~ ] ] ] ( ( d e f g h , ' i j k a a l m n o ! , p - ", " ; > , ! ~ ] ( ( : _ < q , , , , , , , , r k n n s t u v ! , w - ", " ; > , ! ~ ( ( _ _ < < 1 x , , y z A , , , , B t u u C D E F ! , G - ", " ; > , ! ^ : _ < < [ 2 2 4 H I J K l L M , , , N C D D O P Q Q R ! , S - ", " ; > , ! T _ < < 1 2 3 4 9 U V W l m n s X , , , i E O Y Q Z ` ` ...! , S - ", " $ > , ! } < [ 2 2 4 4 9 0 a l L n n s t u +., , , @.Q Q Z ` ` .#.$.$.%.! , &.*. ", " =.-., ! } 1 2 3 4 9 U 0 a l m n s t u u C ;.>., , >.,.` ` .#.$.$.'.).).!.~.! , {.]. ", " . & ^.} 2 4 4 9 0 a l L n n s t u C D D /.y , , ^.(.` .#.$.$.).).)._._.:.<.[.' I }. ", " |.& ^.5 9 U 0 a l m n s t u u C D E O 1.2., , ^.3.#.$.$.'.).).!._.4.:.5.6.6.7.' I 8. ", " 9.-., ! 0.l L n n s t u C D D O P Q Q a., , , b.$.$.).).)._._.:.<.6.6.c.d.e.f., {.8. ", " *./ , ! v s t u u C D E O Y Q Q ` ` r , , , g.).).!._.4.:.5.6.6.d.d.h.i.j., k.l. ", " - ) , ! m.C D D O P Q Q Z ` ` .#.n.o.p.q.'._._.:.<.6.6.c.d.h.r.s.t.j., k.u. ", " - ) , ! v.O Y Q Q ` ` .#.$.$.'.).).!._.4.:.5.6.6.d.d.h.w.s.x.y.j., z.u. ", " - / , ! A.Z ` ` .#.$.$.'.).).B.& & & 6.6.c.d.h.r.s.x.C.D.E.F., G.u. ", " - H., ! I.#.$.$.'.).).!._.4.J., , , d.d.h.w.s.x.C.D.K.E.F., k.u. ", " - c , ! ~.'.).)._._.:.<.6.J., , , r.s.x.x.D.K.L.M.N.F., k.u. ", " - c , ! O._.4.:.5.6.6.d.P.& & & x.C.D.K.L.M.Q.R.F., k.u. ", " - p , ! S.5.6.c.d.h.r.s.x.x.D.K.L.M.Q.T.U.V.F., k.u. ", " l.w , f.i.d.h.w.s.x.C.D.K.L.M.Q.T.U.U.W.F., k.X. ", " l.G , f.Y.x.x.D.K.L.M.Q.T.U.U.Z.`. +F., .+X. ", " ++G , j.@+K.L.M.Q.T.U.U.`.#+$+ +F., .+%+ ", " %+&+, F.V.T.U.U.Z.`.*+$+$+=+F., -+%+ ", " ;+&., F.>+`.#+$+$+,+,+=+F., -+;+ ", " ;+'+, F.)+$+,+,+!+~+F., {+;+ ", " ;+k., F.]+!+^+/+F., {+;+ ", " ;+k., F./+~+F., (+;+ ", " %+k., ^.^., (+%+ ", " ;+_+:+<+[+}+ ", " |+}+1+2+ ", " ", " ", " ", " " }; /* XPM */ const char *clear_sq_icon[] = { "16 16 1 1", " c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " }; const char *clear_row_icon[] = { "16 1 1 1", " c None", " " }; // The lightning bolt icons are based on gmfsk's rx.xpm and tx.xpm /* XPM */ const char *rx1_icon[] = { "16 16 4 1", " c None", ". c #0F1F01", "+ c #4E9A06", "@ c #888A85", " ", " ......... ", " .++++++.@ ", " .++++++.@ ", " .+++++.@ ", " .+++++.@ ", " .++++..... ", " .++++++++.@ ", " .....+++.@ ", " @@.+++.@ ", " .++.@ ", " .++.@ ", " .+.@ ", " .+.@ ", " ..@ ", " " }; /* XPM */ const char *tx1_icon[] = { "16 16 4 1", " c None", ". c #210000", "+ c #A40000", "@ c #888A85", " ", " ......... ", " .++++++.@ ", " .++++++.@ ", " .+++++.@ ", " .+++++.@ ", " .++++..... ", " .++++++++.@ ", " .....+++.@ ", " @@.+++.@ ", " .++.@ ", " .++.@ ", " .+.@ ", " .+.@ ", " ..@ ", " " }; /* XPM */ const char *rx2_icon[] = { "16 16 3 1", " c None", ". c #0F1F01", "+ c #4E9A06", " ", " ......... ", " .++++++. ", " .++++++. ", " .+++++. ", " .+++++. ", " .++++..... ", " .++++++++. ", " .....+++. ", " .+++. ", " .++. ", " .++. ", " .+. ", " .+. ", " .. ", " " }; /* XPM */ const char *tx2_icon[] = { "16 16 3 1", " c None", ". c #210000", "+ c #A40000", " ", " ......... ", " .++++++. ", " .++++++. ", " .+++++. ", " .+++++. ", " .++++..... ", " .++++++++. ", " .....+++. ", " .+++. ", " .++. ", " .++. ", " .+. ", " .+. ", " .. ", " " }; /* XPM */ const char *rx_icon[] = { "16 16 38 1", " c None", ". c #0F1F01", "+ c #64B517", "@ c #62B315", "# c #61B014", "$ c #5EAE12", "% c #5CAC11", "& c #5AA90F", "* c #68BA1B", "= c #66B719", "- c #65B517", "; c #63B315", "> c #60B014", ", c #5EAD13", "' c #6ABD1C", ") c #69BA1A", "! c #66B718", "~ c #64B418", "{ c #6FC11F", "] c #6CBF1E", "^ c #6ABC1C", "/ c #70C421", "( c #6CBE1E", "_ c #6BBC1C", ": c #75C824", "< c #72C622", "[ c #6EC11F", "} c #6CBE1D", "| c #67B819", "1 c #6DBF1E", "2 c #73C622", "3 c #70C321", "4 c #74C924", "5 c #72C522", "6 c #79CD27", "7 c #76CA26", "8 c #7ACF28", "9 c #7FD42B", " ", " ......... ", " .+@#$%&. ", " .*=-;>,. ", " .')!~@. ", " .{]^)=. ", " ./{(_..... ", " .: c #B90C0B", ", c #C81313", "' c #C10F10", ") c #CC1617", "! c #CA1515", "~ c #C71313", "{ c #CF1818", "] c #CC1616", "^ c #D41A1A", "/ c #D11819", "( c #CF1718", "_ c #C71414", ": c #CA1514", "< c #C81413", "[ c #D21919", "} c #CF1817", "| c #CD1616", "1 c #D11818", "2 c #D81D1D", "3 c #D61B1B", "4 c #DB1E1E", "5 c #E02121", " ", " ......... ", " .+@#$%&. ", " .*=-@;>. ", " .,*='@. ", " .)!~*=. ", " .{]!,..... ", " .^/(]!_*=. ", " .....]:<. ", " .[}|. ", " .^1. ", " .23. ", " .4. ", " .5. ", " .. ", " "}; // pskreporter.info "favicon" /* XPM */ const char *pskr_icon[] = { "16 16 3 1", " c None", ". c #FF0000", "+ c #FFFF00", " .. ", " ... ", " ..... ", " .....+.. ", ". ...++++... ", ".. ..+++++. .. ", "....++++++..+. ", "..+++++++++++.. ", "..+++++++.++++. ", "....+++++..++.. ", ".. ..+++++.... ", ". ..+++++.. ", " ...+... ", " .... ", " .. ", " . "}; /* XPM */ const char *fldigi_icon[] = { "48 48 215 2", " c None", ". c #000000", "+ c #BFBFBF", "@ c #050505", "# c #1A1A1A", "$ c #1F1F1F", "% c #C5C5C5", "& c #FEC1C1", "* c #FDC5C5", "= c #FEC2C2", "- c #FFBFBF", "; c #D5C4C4", "> c #0C0C0C", ", c #FE0303", "' c #FB0C0C", ") c #FD0606", "! c #FE0000", "~ c #4F0909", "{ c #D1BFBF", "] c #2F2F2F", "^ c #303030", "/ c #3C3C3C", "( c #838383", "_ c #C7C7C7", ": c #D9D9D9", "< c #D7D7D7", "[ c #C2C2C2", "} c #C4C4C4", "| c #C9C9C9", "1 c #9F9F9F", "2 c #DDDDDD", "3 c #DBDBDB", "4 c #CDCDCD", "5 c #8F8F8F", "6 c #414141", "7 c #343434", "8 c #313131", "9 c #010101", "0 c #292929", "a c #8A8A8A", "b c #A8A8A8", "c c #B6B6B6", "d c #CFCFCF", "e c #DEDEDE", "f c #DFDFDF", "g c #E5E5E5", "h c #E2E2E2", "i c #A0A0A0", "j c #7D7D7D", "k c #1D1D1D", "l c #767676", "m c #888888", "n c #9B9B9B", "o c #D3D3D3", "p c #C6C6C6", "q c #EBEBEB", "r c #DADADA", "s c #AAAAAA", "t c #858585", "u c #747474", "v c #232323", "w c #171717", "x c #818181", "y c #979797", "z c #AEAEAE", "A c #E4E4E4", "B c #D4D4D4", "C c #B5B5B5", "D c #E1E1E1", "E c #BABABA", "F c #9A9A9A", "G c #989898", "H c #030303", "I c #070707", "J c #242424", "K c #C1C1C1", "L c #E0E0E0", "M c #B2B2B2", "N c #363636", "O c #060606", "P c #020202", "Q c #929292", "R c #959595", "S c #C8C8C8", "T c #CECECE", "U c #B0B0B0", "V c #999999", "W c #040404", "X c #151515", "Y c #606060", "Z c #A2A2A2", "` c #CBCBCB", " . c #919191", ".. c #A4A4A4", "+. c #AFAFAF", "@. c #737373", "#. c #181818", "$. c #131313", "%. c #393939", "&. c #C3C3C3", "*. c #454545", "=. c #3A3A3A", "-. c #222222", ";. c #333333", ">. c #484848", ",. c #A1A1A1", "'. c #616161", "). c #0F0F0F", "!. c #C0C0C0", "~. c #808080", "{. c #404040", "]. c #121212", "^. c #191919", "/. c #BDBDBD", "(. c #7E7E7E", "_. c #3F3F3F", ":. c #161616", "<. c #090909", "[. c #212121", "}. c #777777", "|. c #BBBBBB", "1. c #3B3B3B", "2. c #5D5D5D", "3. c #A5A5A5", "4. c #727272", "5. c #272727", "6. c #101010", "7. c #9C9C9C", "8. c #B7B7B7", "9. c #B3B3B3", "0. c #080808", "a. c #262626", "b. c #ADADAD", "c. c #CCCCCC", "d. c #E9E9E9", "e. c #E8E8E8", "f. c #ACACAC", "g. c #2A2A2A", "h. c #323232", "i. c #DCDCDC", "j. c #D1D1D1", "k. c #E7E7E7", "l. c #D2D2D2", "m. c #0E0E0E", "n. c #0D0D0D", "o. c #4A4A4A", "p. c #8C8C8C", "q. c #B9B9B9", "r. c #7A7A7A", "s. c #525252", "t. c #373737", "u. c #7B7B7B", "v. c #E6E6E6", "w. c #A9A9A9", "x. c #6B6B6B", "y. c #141414", "z. c #757575", "A. c #D6D6D6", "B. c #E3E3E3", "C. c #6E6E6E", "D. c #0B0B0B", "E. c #1E1E1E", "F. c #EAEAEA", "G. c #B4B4B4", "H. c #D8D8D8", "I. c #9E9E9E", "J. c #444444", "K. c #ABABAB", "L. c #A6A6A6", "M. c #505050", "N. c #B1B1B1", "O. c #3E3E3E", "P. c #0A0A0A", "Q. c #878787", "R. c #EFEFEF", "S. c #8B8B8B", "T. c #4B4B4B", "U. c #4F4F4F", "V. c #CACACA", "W. c #EEEEEE", "X. c #434343", "Y. c #D5D5D5", "Z. c #7F7F7F", "`. c #5B5B5B", " + c #515151", ".+ c #868686", "++ c #8E8E8E", "@+ c #575757", "#+ c #707070", "$+ c #636363", "%+ c #B8B8B8", "&+ c #909090", "*+ c #252525", "=+ c #8D8D8D", "-+ c #969696", ";+ c #282828", ">+ c #A3A3A3", ",+ c #BCBCBC", "'+ c #A7A7A7", ")+ c #3D3D3D", "!+ c #2E2E2E", "~+ c #353535", "{+ c #D0D0D0", "]+ c #595959", "^+ c #BEBEBE", "/+ c #111111", "(+ c #5E5E5E", "_+ c #383838", ":+ c #939393", "<+ c #464646", "[+ c #2C2C2C", "}+ c #717171", "|+ c #898989", "1+ c #494949", "2+ c #555555", ". . . . . . . . + @ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + # . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", ". . . . . . . . + $ . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . ", "% % % % % % % % % % % % % % % % % % % % % & * * * = - - - ; % % % % % % % % % % % % % % % % % % ", "> > > > > > > > > > > > > > > > > > > > > , ' ' ' ) ! ! ! ~ > > > > > > > > > > > > > > > > > > ", "+ + + + + + + + + + + + + + + + + + + + + - - - - - - - - { + + + + + + + + + + + + + + + + + + ", "] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ ] ] ] / ( _ : < [ } | 1 2 3 4 5 6 ^ ] ] ] 7 8 ] ] ] ] ] ] ] ] ] ] ", ". . . . . . . . . . . . . . 9 . . . 0 a b c d e f g 2 h } i j 0 9 . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . k l m n o p 3 q h r s t u v . . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . 9 w x y z : _ A B C D E F G 0 . . H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . I 9 . J t z % D K L d d r | M ( N 9 . O H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P > 9 . ] Q R S f D L T 4 e } U V 7 9 . H 9 . . . . . . . . . . . . ", ". . . . . P P . . . . . . 9 P W . . X Y Z e ` + .( ..d 3 +.@.#.. . . . O H . . . . . . . . . . ", ". . . . . @ @ . . . . . . W P . . . P $.%.&.*.=.-.k ;.>.,.'.X @ . . . . ).O . . . . . . . . . . ", ". . . . . @ @ . . . . . . P 9 . . . . 9 . !.P . . . . . ~.{.. . . . . . ].I . . . . . . . . . . ", ". . . . . O O . . . . . . . . . . . P O ^./.$.H H H H W (._.P . . . . . :.<.. . . . . . . . . . ", ". . . . . H H . . . . . . . . . . . O [.}.|.Y 1.6 6 1.2.3.4.5.P . . . . 6.I . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 9 . . ).u } A 4 7.8.9.7.: D d ~.W . . . 9 H 9 . . . . . . . . . . ", ". . . . . . . . . . . . . . H 0.. . a.b.&.c.d.o D L L e._ + f.g.9 . 0.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 0.9 . h.F c ` i.j.A e.k.2 l.C Q / 9 9 m.@ . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . n.P . o.p.f.% q.A g e.q e e Z r.s.@ @ m.P . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . 9 . . t.u.+ v.B i.Z w.: L d.|.x.7 O 9 P . I 9 . . . . . . . . . . ", ". . . . . . . . . . . . . H O @ . . y.z.c.v.A.+ b b ,.B.e.[ C.D.9 . . 9 <.9 . . . . . . . . . . ", ". . . . . . . . . . . . . H D.n.. . E.,.o B.e.A.!.z ..F.L 3 Z [.9 . W H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . P n.9 . 1.c G.H.g F.k.g e.A ` 9.I.J.W . O W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . W m.. W t.K.1 L.i.2 h i.v.D ..1 +.^ O 9 0.D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H O P > M.5 t p.< g g D d.i.1 Q N.O.O @ ).D.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . 9 P.H W o.Q.C p l.v.q R.i.i.d 1 S.T.I 9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O H . U.t +.l.V.V.e.W.k.r } S }.X.<.P W . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . 9 . 1.x U g 2 Y.g g g D 3 l.Z.v H . 9 . D.H . . . . . . . . . . ", ". . . . . 9 9 . . . . . . 9 9 . . . O -.> 4 @.C.`. +C.}.!..+W 0.. . . . w <.. . . . . . . . . . ", ". . . . . W W . . . . . . P 9 . . . . P 9 % y.<.<.0.I m.++@+@ . . . . . :.<.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . H 9 . . . O t.S.f ,.#+j u.$+n c.z +I 9 . . . > @ . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . X ( | H.v.%+D 4 &+v.` d n *+W . 9 9 9 . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . y.=+G.G.h [ F.d.j.A b +.-+;+P . 9 . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . H . . ] >+C U L B.k.e.h k.s b i *.O . 9 W . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.P . %.M -+,+o d.i.A q 2 /.3.s +0.W n.0.. . . . . . . . . . . . ", ". . . . . . . . . . . . . . H @ 9 . ] '+c V.L e.A 2 D B.S C i )+O 9 H 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . O O . . !+f._ l.e.d.g 2 D e.S &.K.s.P.. . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . P . 9 ~+f.E {+h d.e.g g L % !.R ]+D.9 P . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . O 9 O h.7.9.l.v.k.L B T 2 T ^+3.J.0.. 9 9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . /+I D.X.Q L.e g q v.B.v.D B &.i (+P.W P.9 . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . D.I O _+b /.A.2 d.v.F.d.A : %+L.T.0.O /+H . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . m.P . ;.Q + 3 f A h F.q d : } :+<+W H m.W . . . . . . . . . . . . ", ". . . . . . . . . . . . . H 9 I 9 . [+a p v.g k.o % e i.B.j.p.J.O . H 9 W P . . . . . . . . . . ", ". . . . . . . . . . . . . I H . . . O 5.}+o |+t 1+X.C..+,+p.8 ).9 . . . y.0.. . . . . . . . . . ", ". . . . . 9 9 . . . . . . P 9 . . . . . . p X D.9 P O <.~.2+. . . . . . :.<.. . . . . . . . . . ", ". . . . . @ @ . . . . . . . . . . . . . . &.I . . . . . ~.T.. . . . . . #.P.. . . . . . . . . . "}; /* XPM */ const char *flarq_icon[] = { /* columns rows colors chars-per-pixel */ "48 35 924 2", " c None", ". c #5B1E0E", "+ c #7F381B", "@ c #A7624B", "# c #A8624E", "$ c #652012", "% c #90555F", "& c #AA7A86", "* c #D4B5BE", "= c #5E231C", "- c #540900", "; c #AC5D55", "> c #B4644F", ", c #CF7F58", "' c #FCAD85", ") c #FBB18F", "! c #BA7057", "~ c #965140", "{ c #4F1509", "] c #3B1314", "^ c #45151B", "/ c #895156", "( c #AB8687", "_ c #D7C6C1", ": c #FFFFFD", "< c #FFFFFE", "[ c #A58088", "} c #945D68", "| c #642D34", "1 c #AC6352", "2 c #A45C49", "3 c #A35B46", "4 c #CC8C74", "5 c #F4B8A0", "6 c #FAC5A8", "7 c #FFD4B3", "8 c #FFD8B8", "9 c #FFDCBD", "0 c #FFCFAC", "a c #E7A380", "b c #A2563C", "c c #984D37", "d c #A2787A", "e c #997474", "f c #AA8B91", "g c #D1C0C6", "h c #CAB3BD", "i c #FBE6F1", "j c #F9FFFF", "k c #F8FAFA", "l c #FEFFFF", "m c #F3F2EF", "n c #E9D7D9", "o c #AC9092", "p c #AC8C8D", "q c #926A6E", "r c #9A737B", "s c #9B747C", "t c #9E573C", "u c #98543D", "v c #9A5F47", "w c #BF8469", "x c #E9AE90", "y c #FFCAA8", "z c #FFD9B6", "A c #FFDFBA", "B c #FDE1BA", "C c #FDDEB8", "D c #FEDBBB", "E c #FBDBC3", "F c #F8DBC5", "G c #FFDCC3", "H c #FFD1AF", "I c #FBB891", "J c #E79B74", "K c #9A4E30", "L c #9B5644", "M c #7D4F54", "N c #D0BCBE", "O c #F5EDE7", "P c #FCF4EE", "Q c #FFFAFC", "R c #FFFFFF", "S c #C7BDC6", "T c #C4B0BD", "U c #F4F3F8", "V c #FDFCFF", "W c #FFFDFF", "X c #F7FFFF", "Y c #DEDCDC", "Z c #E6E1E1", "` c #FFFAF9", " . c #FFF3F5", ".. c #FFF4F7", "+. c #E2D9DA", "@. c #C1AEB5", "#. c #C5A3AF", "$. c #7B5057", "%. c #7D2F24", "&. c #C87559", "*. c #EA9464", "=. c #FFA873", "-. c #FFB886", ";. c #FFC193", ">. c #FBBD92", ",. c #FBBE92", "'. c #F9B98A", "). c #FAB784", "!. c #F8AE77", "~. c #F9AC76", "{. c #F3A97B", "]. c #F3BB97", "^. c #FDD7BD", "/. c #FEDCC3", "(. c #FFDBB4", "_. c #FED2A6", ":. c #FEBF94", "<. c #E89574", "[. c #D07355", "}. c #C06F4F", "|. c #C09581", "1. c #F0F1E9", "2. c #E8FBF4", "3. c #EEF9F3", "4. c #FDFDFE", "5. c #FDF8FE", "6. c #EFE7ED", "7. c #A6969F", "8. c #F2E9EF", "9. c #F7F9F9", "0. c #FEFDFF", "a. c #B2A3AC", "b. c #CBBFC7", "c. c #FCFBFE", "d. c #F9F6F8", "e. c #F5F8F7", "f. c #F6FFFF", "g. c #69302D", "h. c #5D0100", "i. c #A0402C", "j. c #CC7D59", "k. c #BF6F4E", "l. c #C16645", "m. c #F6996A", "n. c #FCA264", "o. c #F8995F", "p. c #F3925E", "q. c #F29968", "r. c #F29F71", "s. c #E79469", "t. c #C26640", "u. c #CF6A43", "v. c #FD9366", "w. c #FF9B68", "x. c #F99B63", "y. c #F19F6E", "z. c #EEAB80", "A. c #F8C59B", "B. c #FBD3AB", "C. c #FCD2AA", "D. c #FCD9B1", "E. c #F8D1AA", "F. c #F9C596", "G. c #FFB371", "H. c #FEAC6B", "I. c #D69B78", "J. c #EAD5D1", "K. c #ECF6FA", "L. c #F1FAFB", "M. c #FFFBFF", "N. c #FDF4FB", "O. c #FDFAFB", "P. c #D3CACE", "Q. c #D8C7CE", "R. c #F6FAF8", "S. c #FEFCFF", "T. c #C4B4C0", "U. c #D3C8D3", "V. c #FAFBFF", "W. c #FBFBFF", "X. c #FBFDFF", "Y. c #F7FEFF", "Z. c #F8DEDA", "`. c #B76C57", " + c #D76E4E", ".+ c #F89463", "++ c #F9A36A", "@+ c #FFB783", "#+ c #F5A27A", "$+ c #D0744E", "%+ c #EB9060", "&+ c #E68655", "*+ c #EA8855", "=+ c #F1935B", "-+ c #F0975D", ";+ c #D27B43", ">+ c #E18450", ",+ c #E98B5A", "'+ c #DD7C50", ")+ c #D07242", "!+ c #F9A06A", "~+ c #FFA771", "{+ c #F6A26B", "]+ c #EE9D67", "^+ c #EEA26D", "/+ c #F2AA77", "(+ c #ECA776", "_+ c #EDAC7B", ":+ c #EEB17D", "<+ c #F1A55D", "[+ c #FFA45C", "}+ c #DC855E", "|+ c #D9A3A2", "1+ c #F5F0FC", "2+ c #E9F7FA", "3+ c #F6FDFE", "4+ c #FDFBFE", "5+ c #F8F9F9", "6+ c #D1CFD0", "7+ c #CCB9C0", "8+ c #F9FAF9", "9+ c #FBFAFC", "0+ c #F7F0F5", "a+ c #D7C6D1", "b+ c #E7E0EB", "c+ c #EAF4FB", "d+ c #F1F9FD", "e+ c #F9FEFF", "f+ c #F2FCFB", "g+ c #F6F5F5", "h+ c #CA9E8E", "i+ c #F4A27A", "j+ c #FAA77A", "k+ c #F6B280", "l+ c #F5C896", "m+ c #FED8AD", "n+ c #FFCFAB", "o+ c #FFCCA8", "p+ c #F8C39B", "q+ c #F5BC9C", "r+ c #F2B48F", "s+ c #ECA878", "t+ c #F3A86C", "u+ c #FCAA68", "v+ c #FAA664", "w+ c #F9A76A", "x+ c #EC9B65", "y+ c #D38048", "z+ c #E69056", "A+ c #E0874E", "B+ c #FAA26B", "C+ c #FAA470", "D+ c #F5A06F", "E+ c #F59E6A", "F+ c #FA9C62", "G+ c #F99A5D", "H+ c #F49E6C", "I+ c #F89E63", "J+ c #FF9D5E", "K+ c #ED8F64", "L+ c #B67466", "M+ c #F5EBF0", "N+ c #E4F6F9", "O+ c #EAFCFA", "P+ c #FDFFFF", "Q+ c #F5F8F8", "R+ c #E6E6E7", "S+ c #BEAAB2", "T+ c #E9E2E6", "U+ c #FCF9FB", "V+ c #DFCFD2", "W+ c #C4AEB7", "X+ c #FAF0F9", "Y+ c #EAF0F6", "Z+ c #F3F8FC", "`+ c #FBFEFF", " @ c #F8F9F8", ".@ c #EADFDD", "+@ c #B47A60", "@@ c #E99560", "#@ c #F3BB8E", "$@ c #FDD8B6", "%@ c #FFDDC1", "&@ c #FDCFB2", "*@ c #FECEAD", "=@ c #FBD0A7", "-@ c #F7D3A7", ";@ c #FAD1AA", ">@ c #F9CAA1", ",@ c #F8C392", "'@ c #FAB179", ")@ c #F9A468", "!@ c #F9A166", "~@ c #F69F67", "{@ c #F9A470", "]@ c #FDA56E", "^@ c #F69A5A", "/@ c #D37536", "(@ c #D1753D", "_@ c #EF9868", ":@ c #F8A67A", "<@ c #F39F71", "[@ c #FB9E68", "}@ c #FF9D60", "|@ c #FA9C65", "1@ c #FAA06B", "2@ c #FA9C63", "3@ c #FDA26C", "4@ c #D5926E", "5@ c #F2DFDA", "6@ c #F0F3FD", "7@ c #EDF3F8", "8@ c #FEFCFC", "9@ c #F9FAFA", "0@ c #F3F4F6", "a@ c #A2929B", "b@ c #C0B1BA", "c@ c #C4B0B0", "d@ c #AC9398", "e@ c #FEF1F8", "f@ c #EEF2F7", "g@ c #F2F3F8", "h@ c #FEF9FB", "i@ c #FBF2F0", "j@ c #EFD9D8", "k@ c #E09D81", "l@ c #F0A268", "m@ c #F9CCA1", "n@ c #FDD3B7", "o@ c #F2B094", "p@ c #F3A377", "q@ c #F5A66E", "r@ c #F4A873", "s@ c #F3A476", "t@ c #F4A66D", "u@ c #F6A367", "v@ c #F9A269", "w@ c #FBA169", "x@ c #FD9F69", "y@ c #FC9F69", "z@ c #FC9F68", "A@ c #F99F65", "B@ c #F4A471", "C@ c #F9B385", "D@ c #F6A36E", "E@ c #F19359", "F@ c #D1743D", "G@ c #E3905E", "H@ c #F5A370", "I@ c #F59F69", "J@ c #FAA062", "K@ c #FBA05E", "L@ c #F8A26B", "M@ c #F9A46F", "N@ c #FAA160", "O@ c #EA9C62", "P@ c #C3998A", "Q@ c #F7EBFA", "R@ c #EEEAF8", "S@ c #F6F4F6", "T@ c #FCFEFF", "U@ c #F4F4F7", "V@ c #E4DCE3", "W@ c #D4C1CD", "X@ c #F2F5FA", "Y@ c #AEA19F", "Z@ c #C2B0B5", "`@ c #F9F8FC", " # c #E5F2F8", ".# c #EAF5FB", "+# c #F0F5F5", "@# c #F9F7F7", "## c #D3B3A9", "$# c #DF916B", "%# c #FAA76E", "&# c #F3B787", "*# c #F0AE84", "=# c #EE9D6B", "-# c #F6A15D", ";# c #F7A559", "># c #F9A160", ",# c #FE9B68", "'# c #FD9D67", ")# c #FC9F67", "!# c #FA9F69", "~# c #F9A06C", "{# c #F69F6A", "]# c #F5A067", "^# c #F9A464", "/# c #F5A35C", "(# c #E9A779", "_# c #F8D5C1", ":# c #FFCEAA", "<# c #FAB079", "[# c #E1884B", "}# c #CD713A", "|# c #F39961", "1# c #FAA56C", "2# c #F8A668", "3# c #FFA864", "4# c #EF9965", "5# c #E59462", "6# c #FBA360", "7# c #F49958", "8# c #BE8469", "9# c #E7DAE0", "0# c #EFF2FB", "a# c #EBF0F3", "b# c #FBFEFE", "c# c #F6F6FA", "d# c #FAF3FA", "e# c #B7A0AF", "f# c #C4C0C8", "g# c #D4CECD", "h# c #DED5DD", "i# c #EEF5FC", "j# c #E4F0FD", "k# c #E6F2FC", "l# c #EBF5FB", "m# c #EAE0E9", "n# c #B67A69", "o# c #ED8F5B", "p# c #FCA368", "q# c #F59E66", "r# c #F9A067", "s# c #F9A165", "t# c #F99F66", "u# c #FAA069", "v# c #FAA169", "w# c #FAA166", "x# c #F8A264", "y# c #F7A262", "z# c #F9A162", "A# c #F59E5E", "B# c #FCA464", "C# c #F0A172", "D# c #F8C7AA", "E# c #FFDFBE", "F# c #F7D7AF", "G# c #F7C497", "H# c #F19C6B", "I# c #DC7947", "J# c #E48552", "K# c #DD8553", "L# c #BF6033", "M# c #E28B60", "N# c #E99B6D", "O# c #F2A367", "P# c #FA9F60", "Q# c #E89874", "R# c #E2CBBF", "S# c #E9F6F7", "T# c #EAF1FA", "U# c #F6F6FB", "V# c #FAF9FC", "W# c #F9F1FA", "X# c #BBABB5", "Y# c #BDAEB7", "Z# c #DDCBCC", "`# c #FBF1F9", " $ c #EFEAF7", ".$ c #E9EFFC", "+$ c #EAF0FC", "@$ c #F1F6FE", "#$ c #E2CDCB", "$$ c #D28869", "%$ c #FFA26B", "&$ c #F99F64", "*$ c #FAA065", "=$ c #FAA167", "-$ c #FAA168", ";$ c #F9A066", ">$ c #F7A168", ",$ c #F7A167", "'$ c #F7A165", ")$ c #F9A163", "!$ c #FB9F63", "~$ c #FA9E65", "{$ c #F89D64", "]$ c #FEA667", "^$ c #F4B072", "/$ c #FBD2AB", "($ c #FBDFCB", "_$ c #F9DECA", ":$ c #FBCBAA", "<$ c #EFA579", "[$ c #D3764B", "}$ c #AE4621", "|$ c #EA865A", "1$ c #F8A674", "2$ c #F8A16F", "3$ c #FAA66A", "4$ c #E38A65", "5$ c #D5AFA0", "6$ c #F1FDFF", "7$ c #E9EFFF", "8$ c #EEEDFC", "9$ c #F5F4FD", "0$ c #F0EDF6", "a$ c #F5E9EF", "b$ c #C6AFB4", "c$ c #A28385", "d$ c #FFF7FE", "e$ c #F1E8F9", "f$ c #EBEFF9", "g$ c #EBEFFA", "h$ c #F0EFF8", "i$ c #D5B09E", "j$ c #ED9B6E", "k$ c #FDA168", "l$ c #F89F66", "m$ c #F89F65", "n$ c #F6A066", "o$ c #F5A166", "p$ c #F6A065", "q$ c #F8A065", "r$ c #F9A167", "s$ c #FCA06A", "t$ c #F99B68", "u$ c #DA7F51", "v$ c #E88B52", "w$ c #F9A15D", "x$ c #F1AF7D", "y$ c #F8D0B1", "z$ c #FBDCC7", "A$ c #FDDEC9", "B$ c #FED4B9", "C$ c #FBBC9A", "D$ c #E58C65", "E$ c #DB794C", "F$ c #F69F61", "G$ c #FF9F61", "H$ c #FD9D60", "I$ c #FAA163", "J$ c #F79C6E", "K$ c #DCA289", "L$ c #EAE3E3", "M$ c #ECF2FF", "N$ c #E7F0FB", "O$ c #E7F3FA", "P$ c #E7EFF2", "Q$ c #FEF7F9", "R$ c #B49DA0", "S$ c #C0A5A8", "T$ c #F7F6FB", "U$ c #E9EAFB", "V$ c #E9F0F8", "W$ c #E9F0FA", "X$ c #F5F1FA", "Y$ c #DBAD8E", "Z$ c #EF975E", "`$ c #FBA16A", " % c #F7A065", ".% c #F6A165", "+% c #F6A067", "@% c #F6A570", "#% c #F4A673", "$% c #EC9A6C", "%% c #D1794A", "&% c #E68752", "*% c #FDA26F", "=% c #F2A374", "-% c #F9C29B", ";% c #FFE0C1", ">% c #FDDDBC", ",% c #F4C29D", "'% c #E09266", ")% c #D67F46", "!% c #FB9E5C", "~% c #FF9D63", "{% c #FBA972", "]% c #CE805C", "^% c #C8A39D", "/% c #F2F5FD", "(% c #EAF1F4", "_% c #E6F2F3", ":% c #E6F5F4", "<% c #E7F1F1", "[% c #EAEDED", "}% c #E6E0E3", "|% c #E7F3F7", "1% c #DEF1FD", "2% c #E7F2FB", "3% c #EBF3FB", "4% c #E7D7DC", "5% c #D5916A", "6% c #FCA265", "7% c #F89E68", "8% c #F8A066", "9% c #F29F67", "0% c #EFA56E", "a% c #FBC490", "b% c #F6BC8A", "c% c #E9A26E", "d% c #D8834F", "e% c #E58456", "f% c #FF9B6E", "g% c #FAA16D", "h% c #EDB075", "i% c #F3C790", "j% c #FCD7AD", "k% c #FED4B6", "l% c #F6BB94", "m% c #CE8350", "n% c #D6854A", "o% c #FBA16F", "p% c #F39F6D", "q% c #F1A86D", "r% c #E89568", "s% c #D79F8D", "t% c #F4EDEE", "u% c #F0EEF8", "v% c #ECEEF6", "w% c #ECEFF9", "x% c #ECEDF7", "y% c #F1F0FC", "z% c #F0F4FA", "A% c #E6F2F5", "B% c #DCF5FD", "C% c #E3EBF7", "D% c #F9FBFF", "E% c #C19A96", "F% c #D57E55", "G% c #FDA366", "H% c #F99F67", "I% c #F99F63", "J% c #FA9F63", "K% c #F99E64", "L% c #F8A86F", "M% c #F1A66F", "N% c #F8B985", "O% c #FDD4A2", "P% c #F2BD89", "Q% c #F5A971", "R% c #E28955", "S% c #D97847", "T% c #F69962", "U% c #F4A66A", "V% c #E9A46A", "W% c #F2AA79", "X% c #F9AE84", "Y% c #F6AB7C", "Z% c #EA9B63", "`% c #E49159", " & c #FFA572", ".& c #FBA36B", "+& c #F8A363", "@& c #FFA66F", "#& c #CE7F5A", "$& c #E9CAC3", "%& c #F2F3FF", "&& c #EBEDFD", "*& c #F1EFFF", "=& c #F8F1FF", "-& c #FAEFFE", ";& c #FDF8FF", ">& c #FCF4F9", ",& c #F4F9FA", "'& c #F9F7FF", ")& c #FDE9EB", "!& c #D99781", "~& c #F59668", "{& c #F8A165", "]& c #F8A164", "^& c #F7A063", "/& c #F9A164", "(& c #FBA069", "_& c #D98350", ":& c #DA8954", "<& c #E79A68", "[& c #FAB887", "}& c #F6B181", "|& c #F5A46D", "1& c #F4A15F", "2& c #E6914E", "3& c #D37D41", "4& c #EA9569", "5& c #F8A078", "6& c #FC9E6C", "7& c #FE9D5C", "8& c #FF9F5B", "9& c #FFA46B", "0& c #E58B5F", "a& c #F09769", "b& c #F39562", "c& c #F09762", "d& c #EF9A6A", "e& c #D67F58", "f& c #BB8678", "g& c #F6F6FF", "h& c #F7F4FF", "i& c #EADFE9", "j& c #D8C4CE", "k& c #DABEC8", "l& c #E3C8DB", "m& c #E9CAD1", "n& c #ECD7D4", "o& c #EEDFE4", "p& c #B98787", "q& c #D9805B", "r& c #F9A266", "s& c #F6A360", "t& c #F79E64", "u& c #F6A466", "v& c #F6A465", "w& c #F9A065", "x& c #FD9E67", "y& c #DC7E4D", "z& c #C7693C", "A& c #ED9167", "B& c #F4976B", "C& c #FBA160", "D& c #FFAC67", "E& c #F49B60", "F& c #D6784A", "G& c #E5895F", "H& c #F09662", "I& c #FFA866", "J& c #FFAD6E", "K& c #E07F5D", "L& c #7B2B1B", "M& c #853D24", "N& c #963E27", "O& c #8D472B", "P& c #824730", "Q& c #843A2A", "R& c #712A23", "S& c #BA9092", "T& c #DABABA", "U& c #8B6E6B", "V& c #4D3232", "W& c #5D2D3D", "X& c #68353A", "Y& c #734744", "Z& c #6A4A4C", "`& c #663235", " * c #934833", ".* c #DF8766", "+* c #F99766", "@* c #FB9E61", "#* c #FFA66E", "$* c #FCA16D", "%* c #F99E69", "&* c #F7A169", "** c #F3A266", "=* c #F4A365", "-* c #FB9F68", ";* c #F6A16A", ">* c #F6A16B", ",* c #FCA06C", "'* c #FC9D69", ")* c #FF9D6B", "!* c #FF9E6C", "~* c #F69563", "{* c #D67949", "]* c #D47348", "^* c #F79567", "/* c #FA9F68", "(* c #F9A265", "_* c #FFA166", ":* c #FC9B65", "<* c #E98D5B", "[* c #C4683A", "}* c #BE6339", "|* c #B06D4E", "1* c #732F25", "2* c #64201E", "3* c #8B463B", "4* c #B6573A", "5* c #D06B39", "6* c #D37A42", "7* c #F4986B", "8* c #FC9C73", "9* c #F99F6C", "0* c #F4A766", "a* c #F1A561", "b* c #F49E63", "c* c #FB9E6B", "d* c #F7A069", "e* c #F9A16A", "f* c #FCA16C", "g* c #FE9F6C", "h* c #FFA06C", "i* c #FBA468", "j* c #F49D5F", "k* c #ED925B", "l* c #C86A3A", "m* c #DF8653", "n* c #FBA26F", "o* c #F9A369", "p* c #FFA673", "q* c #F6936D", "r* c #7C1705", "s* c #7C3625", "t* c #C76E51", "u* c #DE7B53", "v* c #CA693D", "w* c #BF633B", "x* c #E88C57", "y* c #E98E54", "z* c #F9A267", "A* c #FEA86F", "B* c #F4A167", "C* c #F6A362", "D* c #F19C5B", "E* c #DD8848", "F* c #E89255", "G* c #E68F53", "H* c #F49D63", "I* c #FEA76D", "J* c #FCA36A", "K* c #FAA466", "L* c #F29B5B", "M* c #EC8E5C", "N* c #DB8154", "O* c #D6874F", "P* c #E79659", "Q* c #FFA778", "R* c #D07B64", "S* c #6E1913", "T* c #6C1F18", "U* c #963729", "V* c #EC9366", "W* c #FFB374", "X* c #E98F56", "Y* c #B24C23", "Z* c #ED8661", "`* c #E78B58", " = c #FAA561", ".= c #F8A262", "+= c #F6A164", "@= c #F7A466", "#= c #E49459", "$= c #C16E36", "%= c #E08C58", "&= c #E1895C", "*= c #EF9265", "== c #FFA372", "-= c #FEA36A", ";= c #F5A268", ">= c #F6AA6A", ",= c #DC8545", "'= c #D47440", ")= c #C87153", "!= c #69241A", "~= c #AB5E46", "{= c #E88666", "]= c #E37B53", "^= c #D26E43", "/= c #F4996C", "(= c #CC6C39", "_= c #E5834A", ":= c #F39462", "<= c #FA9F6F", "[= c #F6A16D", "}= c #F49F6B", "|= c #F69E6D", "1= c #DD7F55", "2= c #C7653C", "3= c #E7825E", "4= c #E4895D", "5= c #F1A364", "6= c #FFAC66", "7= c #FEA067", "8= c #CD7151", "9= c #6E2215", "0= c #7F2427", "a= c #902F20", "b= c #E5895A", "c= c #FFB175", "d= c #F2915D", "e= c #B7522B", "f= c #C05D34", "g= c #D67649", "h= c #F69E68", "i= c #FDA46B", "j= c #FCA069", "k= c #FFA46E", "l= c #F49460", "m= c #EB8E5D", "n= c #D06F41", "o= c #C9683C", "p= c #D67D55", "q= c #A55135", "r= c #682616", "s= c #8F4C2E", "t= c #DE8C68", "u= c #CA6E51", "v= c #C4654C", "w= c #FFA579", "x= c #F09360", "y= c #CC7345", "z= c #DA844C", "A= c #EE9556", "B= c #F59D5E", "C= c #FFB174", "D= c #FFB075", "E= c #FFB073", "F= c #FFA472", "G= c #B85D49", "H= c #6C1515", "I= c #8B5446", "J= c #73251B", "K= c #95402C", "L= c #E48F68", "M= c #FFAA79", "N= c #F59D70", "O= c #EB9061", "P= c #E48A59", "Q= c #C57046", "R= c #B26340", "S= c #B16947", "T= c #B36943", "U= c #A65D40", "V= c #7B3629", "W= c #6A230D", "X= c #BA6848", "Y= c #D57C5E", "Z= c #D1745E", "`= c #CE7260", " - c #923C2D", ".- c #84382F", "+- c #813F39", "@- c #7B423B", " ", " ", " ", " ", " . + @ # $ % & * ", " = - ; > , ' ) ! ~ { ] ^ / ( _ : < ", "[ } | 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l ", "m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W ", "X Y Z ` ...+.@.#.$. %.&.*.=.-.;.>.,.'.).!.~.{.].^./.9 (._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.", "R a.b.c.d.e.f.R W g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.", "R T.U.V.W.X.Y.V Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+7+8+9+", "0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+", "V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@R ", "c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@", "Y@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#:#<#[#}#|#1#2#3#4#5#6#7#8#9#0#a#b#c#d#e#f#", "g#h#i#j#k#l#m#n#o#p#~@q#r#s#s#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#", "Z#`# $.$+$@$#$$$%$&$&$*$=$-$r#r#;$>$,$'$)$)$!$~${$]$^$/$($_$:$<$[$}$|$1$2$~@3$4$5$6$7$8$9$0$a$b$", "c$d$e$f$g$h$i$j$k$A@;$=$;$;$l$m$m$n$o$p$q$r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$", "S$T$U$V$W$X$Y$Z$`$;$=$;$=$=$;$;$;$ % %.% %+%@%#%$%%%&%*%=%-%D ;%>%,%'%)%!%~%t#{%]%^%/%(%_%:%<%[%", "}%|%1%2%3%4%5%6%7%r#=$m$;$;$=$;$8%&$&$q$+%9%0%a%b%c%d%e%f%g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%v%w%x%y%", "z%A%B%C%D%E%F%G%H%=$=$;$;$;$=$;$m$I%J%K%v@L%M%N%O%P%Q%R%S%T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&-&", ";&>&,&'&)&!&~&{&]&;$;$;$;$;$;$;$;$^&/&K%(&_&:&<&[&}&|&1&2&3&4&5&6&7&8&9&0&a&b&c&d&e&f&g&h&i&j&k&", "l&m&n&o&p&q&=.r&s&t&t&r$;$;$m$;$r$u&v&w&x&t$y&z&A&B&x@C&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V& ", "W&X&Y&Z&`& *.*+*@*#*$*%*&***=*A@-*;*>*,*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*1* 2* ", " 3*4*5*6*7*8*9*0*a*b*c*d*e*f*g*h*z@i*j*k*l*m*n*8%o*p*q*r* ", " s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S* ", " T*U*V*W*X*Y*Z*`* =.=+=@=#=$=%=&=*===-=;=>=,='=)=!= ", " ~={=]=^=/=(=_=:=<=n*[=}=|=1=2=3=4=5=6=7=8=9= ", " 0=a=b=c=d=e=f=g=o%h=i=j=k=l=m=n=o=p=q=r= ", " s=t=u=v=w=x=y=z=A=B=C=D=E=F=G=H= ", " I=J=K=L=M=N=O=P=Q=R=S=T=U=V= ", " W=X=Y=Z=`= -.-+-@- ", " ", " ", " "}; /* actions/view-refresh.png */ /* XPM */ const char *tango_view_refresh[] = { /* width height ncolors chars_per_pixel */ "16 16 100 2", /* colors */ " c #9DBDDC", " . c #6990C0", " X c #3767A6", " o c #3667A5", " O c #3565A4", " + c #DDE8F3", " @ c #8AACD3", " # c #99B9DB", " $ c #B4CBE5", " % c #D8E4F1", " & c #5783BB", " * c #537FB7", " = c #4B77AF", " - c #A0BEDE", " ; c #3868A6", " : c #3768A5", " > c #4C79B3", " , c #769DCF", " < c #5580B5", " 1 c #97B6D8", " 2 c #8FACD0", " 3 c #E4ECF5", " 4 c #4E7AB1", " 5 c #C8D8EA", " 6 c #4C78AF", " 7 c #8FB0D3", " 8 c #6D94C2", " 9 c #6891C7", " 0 c #3C6BA9", " q c #3A69A7", " w c #3969A6", " e c #C6D8EB", " r c #4774AD", " t c #C1D2E6", " y c #6890C0", " u c #CDDBEB", " i c #3465A4", " p c #6188B9", " a c #DBE6F2", " s c #BFD2E7", " d c #84A6CE", " f c #E5EDF5", " g c #C9D9EA", " h c #8FADD2", " j c #A1BEDD", " k c #3A6AA6", " l c #E2EBF5", " z c #88A7CE", " x c #3768A6", " c c #95B2D4", " v c #3566A4", " b c #C4D7EB", " n c #4371AB", " m c #A1BBD9", " M c #E7EEF6", " N c #BFD3E9", " B c #5F87B9", " V c #7298C5", " C c #5D85B7", " Z c #6C95C9", " A c #82A5CE", " S c #9CB7D7", " D c #C9DAEC", " F c #E3ECF5", " G c #4C78B0", " H c #8EAED3", " J c #4F7CB6", " K c #3969A7", " L c #3869A6", " P c #3767A5", " I c #A8C2DF", " U c #93B1D4", " Y c #4170AB", " T c #CCDDEE", " R c #B0C9E3", " E c #E5EDF6", " W c #E4EDF5", " Q c #FFFFFF", " ! c #4D79B0", " ~ c #C7D7E9", " ^ c #4C77AF", " / c #5B84B7", " ( c #D5E2F0", " ) c #3C6CA9", " _ c #3A6AA7", " ` c #E0E9F4", " ' c #A8C1DE", " ] c #8CADD3", " [ c #B4CAE3", " { c #3566A5", " } c #7299CD", " | c #88ABD2", ". c #CCDCED", ".. c #E6EEF6", ".X c #BCD1E7", ".o c #7EA4D5", ".O c #3D6DA9", ".+ c #3C6BA8", ".@ c #3B6BA7", ".# c None", /* pixels */ ".#.#.#.# q _ o K _.#.#.#.#.#.#.#", ".#.#.# ; y 7 I ' U B P.#.#.# i.#", ".#.# w ] j $ N T ( s = o n v.#", ".# K . V.+ v _ C m % a + z 5 _.#", ".# ; Y ) _.#.#.# L p u l.... _.#", ".# O _ 9 P.#.#.#.#.# v ~ e F k.#", ".# i.#.#.#.#.#.#.# ; 2 M a.. k.#", ".#.#.#.#.#.#.#.# i i r ^ ^ 6 i.#", ".# i i i i i i i.#.#.#.#.#.#.#.#", ".# i f E 3 S x.#.#.#.#.#.#.# i.#", ".# v.. b g i.#.#.#.#.# { Z * i.#", ".# P.. F W t ! L.#.#.# 0 J _ :.#", ".# ; % c ` +. h G { w w.O G _.#", ".# P / o 4 [ D.X R - | A H ;.#.#", ".# i o.#.# X < d 1 # @ 8 ;.#.#.#", ".# i.#.#.#.#.# _ L v _.@.#.#.#.#" }; fldigi-4.2.05/src/fileselector/0000775000175000017500000000000014611714005013311 500000000000000fldigi-4.2.05/src/fileselector/flnfc_common.cxx0000664000175000017500000000407614532252172016430 00000000000000// // flnfc_common.cxx -- common string subs for Fl_Native_File_Chooser // // Copyright 2004 by Greg Ercolano. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include // COPY A STRING WITH 'new' // Value can be NULL // static char *strnew(const char *val) { if ( val == NULL ) return(NULL); char *s = new char[strlen(val)+1]; strcpy(s, val); return(s); } // FREE STRING CREATED WITH strnew(), NULLS OUT STRING // Value can be NULL // static char *strfree(char *val) { if ( val ) delete [] val; return(NULL); } #ifndef __WOE32__ // 'DYNAMICALLY' APPEND ONE STRING TO ANOTHER // Returns newly allocated string, or NULL // if s && val == NULL. // 's' can be NULL; returns a strnew(val). // 'val' can be NULL; s is returned unmodified. // // Usage: // char *s = strnew("foo"); // s = "foo" // s = strapp(s, "bar"); // s = "foobar" // static char *strapp(char *s, const char *val) { if ( ! val ) { return(s); // Nothing to append? return s } if ( ! s ) { return(strnew(val)); // New string? return copy of val } char *news = new char[strlen(s)+strlen(val)+1]; strcpy(news, s); strcat(news, val); delete [] s; // delete old string return(news); // return new copy } #endif // APPEND A CHARACTER TO A STRING // This does NOT allocate space for the new character. // static void chrcat(char *s, char c) { char tmp[2] = { c, '\0' }; strcat(s, tmp); } fldigi-4.2.05/src/fileselector/fileselect.cxx0000664000175000017500000002244514611711171016104 00000000000000// ---------------------------------------------------------------------------- // // fileselect.cxx -- file selector front end // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // Dave Freese, 2015 // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "config.h" #include "fileselect.h" #include "debug.h" #include "qrunner.h" /** \class Fl_Native_File_Chooser This class lets an FLTK application easily and consistently access the operating system's native file chooser. Some operating systems have very complex and specific file choosers that many users want access to specifically, instead of FLTK's default file chooser(s). In cases where there is no native file browser, FLTK's own file browser is used instead. To use this widget correctly, use the following include in your code: \code #include \endcode Do not include the other Fl_Native_File_Choser_XXX.H files in your code; those are platform specific files that will be included automatically depending on your build platform. The following example shows how to pick a single file: \code // Create and post the local native file chooser #include [..] Fl_Native_File_Chooser fnfc; fnfc.title("Pick a file"); fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE); fnfc.filter("Text\t*.txt\n" "C Files\t*.{cxx,h,c}"); fnfc.directory("/var/tmp"); // default directory to use // Show native chooser switch ( fnfc.show() ) { case -1: printf("ERROR: %s\n", fnfc.errmsg()); break; // ERROR case 1: printf("CANCEL\n"); break; // CANCEL default: printf("PICKED: %s\n", fnfc.filename()); break; // FILE CHOSEN } \endcode Platform Specific Caveats - Under X windows, it's best if you call Fl_File_Icon::load_system_icons() at the start of main(), to enable the nicer looking file browser widgets. Use the static public attributes of class Fl_File_Chooser to localize the browser. - Some operating systems support certain OS specific options; see Fl_Native_File_Chooser::options() for a list. \image html Fl_Native_File_Chooser.png "The Fl_Native_File_Chooser on different platforms." \image latex Fl_Native_File_Chooser.png "The Fl_Native_File_Chooser on different platforms" width=14cm enum Type { BROWSE_FILE = 0, ///< browse files (lets user choose one file) BROWSE_DIRECTORY, ///< browse directories (lets user choose one directory) BROWSE_MULTI_FILE, ///< browse files (lets user choose multiple files) BROWSE_MULTI_DIRECTORY, ///< browse directories (lets user choose multiple directories) BROWSE_SAVE_FILE, ///< browse to save a file BROWSE_SAVE_DIRECTORY ///< browse to save a directory }; enum Option { NO_OPTIONS = 0x0000, ///< no options enabled SAVEAS_CONFIRM = 0x0001, ///< Show native 'Save As' overwrite confirm dialog (if supported) NEW_FOLDER = 0x0002, ///< Show 'New Folder' icon (if supported) PREVIEW = 0x0004 ///< enable preview mode }; IMPORTANT NOTICE: The filter type must be terminated with a '\n' on OS X or the application crashes with a Bus timeout */ bool trx_inhibit = false; namespace FSEL { void create(void) {}; void destroy(void) {}; std::string filename, stitle, sfilter, sdef, sdirectory; char dirbuf[FL_PATH_MAX + 1] = ""; char msg[400]; // use this function for testing on garbage OS, aka Windows /* void pfile (const char *dir, const char *fname, const char *filt) { char fn[FL_PATH_MAX+1]; #ifdef __WIN32__ fl_filename_expand(fn, sizeof(fn) -1, "$USERPROFILE/"); #else fl_filename_expand(fn, sizeof(fn) -1, "$HOME/"); #endif strcat(fn, "pfile.txt"); FILE *f = fl_fopen(fn, "a"); fprintf(f,"\ dir: %s\n\ file: %s\n\ filter: %s\n", dir, fname, filt); fclose(f); } */ void dosfname(std::string &s) { for (size_t i = 0; i < s.length(); i++) if (s[i] == '/') s[i] = '\\'; } const char* select(const char* title, const char* filter, const char* def, int* fsel) { if (strlen(dirbuf) == 0) { #ifdef __WIN32__ fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$USERPROFILE/"); #else fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$HOME/"); #endif } size_t p = 0; Fl_Native_File_Chooser native; stitle.clear(); sfilter.clear(); sdef.clear(); sdirectory.clear(); if (title) stitle.assign(title); if (filter) sfilter.assign(filter); if (def) { sdef.assign(def); if (!sdef.empty()) { p = sdef.length() - 1; if ((sdef[p] == '/') || (sdef[p] == '\\')) sdef.append("fname"); } sdirectory.assign(sdef); p = sdirectory.rfind(fl_filename_name(sdef.c_str())); sdirectory.erase(p); } if (sdirectory.empty()) { sdirectory.assign(dirbuf); } if (sdef.empty()) { sdef.assign(sdirectory); sdef.append("temp"); } if (!sfilter.empty()) { if (sfilter[sfilter.length()-1] != '\n') sfilter += '\n'; native.filter(sfilter.c_str()); } native.title(stitle.c_str()); #if __WIN32__ dosfname(sdef); dosfname(sdirectory); #endif if (!sdef.empty()) native.preset_file(sdef.c_str()); if (!sdirectory.empty()) native.directory(sdirectory.c_str()); native.type(Fl_Native_File_Chooser::BROWSE_FILE); native.options(Fl_Native_File_Chooser::PREVIEW); // pfile(sdirectory.c_str(), sdef.c_str(), sfilter.c_str()); filename.clear(); trx_inhibit = true; switch ( native.show() ) { case -1: // ERROR LOG_ERROR("ERROR: %s\n", native.errmsg()); // Error fall through case 1: // CANCEL filename = ""; break; default: if ( native.filename() ) { filename = native.filename(); } else { filename = ""; } break; } trx_inhibit = false; if (fsel) *fsel = native.filter_value(); return filename.c_str(); } const char* saveas(const char* title, const char* filter, const char* def, int* fsel) { if (strlen(dirbuf) == 0) { #ifdef __WIN32__ fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$USERPROFILE/"); #else fl_filename_expand(dirbuf, sizeof(dirbuf) -1, "$HOME/"); #endif } size_t p = 0; Fl_Native_File_Chooser native; stitle.clear(); sfilter.clear(); sdef.clear(); sdirectory.clear(); if (title) stitle.assign(title); if (filter) sfilter.assign(filter); if (def) { sdef.assign(def); if (!sdef.empty()) { p = sdef.length() - 1; if ((sdef[p] == '/') || (sdef[p] == '\\')) sdef.append("fname"); } sdirectory.assign(sdef); p = sdirectory.rfind(fl_filename_name(sdef.c_str())); sdirectory.erase(p); } if (sdirectory.empty()) { sdirectory.assign(dirbuf); } if (sdef.empty()) { sdef.assign(sdirectory); sdef.append("temp"); } if (!sfilter.empty()) { if (sfilter[sfilter.length()-1] != '\n') sfilter += '\n'; native.filter(sfilter.c_str()); } native.title(stitle.c_str()); #if __WIN32__ dosfname(sdef); dosfname(sdirectory); #endif if (!sdef.empty()) native.preset_file(sdef.c_str()); if (!sdirectory.empty()) native.directory(sdirectory.c_str()); native.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE); native.options(Fl_Native_File_Chooser::NEW_FOLDER | Fl_Native_File_Chooser::SAVEAS_CONFIRM); // pfile(sdirectory.c_str(), sdef.c_str(), sfilter.c_str()); filename.clear(); trx_inhibit = true; switch ( native.show() ) { case -1: // ERROR LOG_ERROR("ERROR: %s\n", native.errmsg()); break; case 1: // CANCEL filename = ""; break; default: if ( native.filename() ) { filename = native.filename(); } else { filename = ""; } break; } trx_inhibit = false; if (fsel) *fsel = native.filter_value(); return filename.c_str(); } const char* dir_select(const char* title, const char* filter, const char* def) { Fl_Native_File_Chooser native; stitle.clear(); sfilter.clear(); sdef.clear(); if (title) stitle.assign(title); if (filter) sfilter.assign(filter); if (def) sdef.assign(def); if (!sfilter.empty() && sfilter[sfilter.length()-1] != '\n') sfilter += '\n'; if (!stitle.empty()) native.title(stitle.c_str()); native.type(Fl_Native_File_Chooser::BROWSE_DIRECTORY); if (!sfilter.empty()) native.filter(sfilter.c_str()); native.options(Fl_Native_File_Chooser::NO_OPTIONS); #if __WIN32__ dosfname(sdef); #endif if (!sdef.empty()) { native.directory(sdef.c_str()); sdirectory = sdef; } else sdirectory.clear(); filename.clear(); trx_inhibit = true; switch ( native.show() ) { case -1: // ERROR LOG_ERROR("ERROR: %s\n", native.errmsg()); break; case 1: // CANCEL filename = ""; break; default: if ( native.filename() ) { filename = native.filename(); } else { filename = ""; } break; } trx_inhibit = false; return filename.c_str(); } } // FSEL fldigi-4.2.05/src/kml/0000775000175000017500000000000014611714005011414 500000000000000fldigi-4.2.05/src/kml/kmlserver.cxx0000664000175000017500000016517614611711171014113 00000000000000// ---------------------------------------------------------------------------- // kmlserver.cxx -- KML Server // // Copyright (C) 2012 // Remi Chateauneu, F4ECW // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "kmlserver.h" #include "gettext.h" #include "debug.h" #include "threads.h" #include "strutil.h" #include "configuration.h" #include "fl_digi.h" #include "irrXML.h" #include "timeops.h" LOG_FILE_SOURCE(debug::LOG_KML); /** Some platforms have problems with condition variables apparently. * When cancelling a thread which waits in pthread_cond_timedwait, * the thread is stuck. * We replace it by an unconditional wait, and a test on a boolean * which indicates if data was saved in the internal buffers. * The consequence is that data are not immediately saved in KML files, * and the user has to wait until the end of the delay. */ #if !defined(__APPLE__) # define FLDIGI_KML_CONDITION_VARIABLE 1 #endif // ---------------------------------------------------------------------------- static const char * KmlSrvUnique = "Permanent"; /// This must follow a specific ISO format so it can be serialized in KML files. static void KmlTimestamp( std::ostream &ostrm, time_t tim ) { if(tim == KmlServer::UniqueEvent) { ostrm << KmlSrvUnique; return; } tm objTm = *gmtime(&tim); char bufTm[40]; // See http://www.w3.org/TR/xmlschema-2/#isoformats snprintf( bufTm, sizeof(bufTm), "%4d-%02d-%02dT%02d:%02dZ", objTm.tm_year + 1900, objTm.tm_mon + 1, objTm.tm_mday, objTm.tm_hour, objTm.tm_min ); ostrm << bufTm ; } /// For debugging purpose. static std::string KmlTimestamp( time_t tim ) { std::stringstream strm ; KmlTimestamp( strm, tim ); return strm.str(); } /// Deserialize a timestamp, inverse of KmlTimestamp. static time_t KmlFromTimestamp( const char * ts ) { if(ts == NULL ) throw std::runtime_error("Null timestamp"); if( 0 == strcmp( ts, KmlSrvUnique ) ) return KmlServer::UniqueEvent ; /// So all fields are initialised with correct default values. time_t timNow = time(NULL); tm objTm = *gmtime( &timNow ); int r = sscanf( ts, "%4d-%02d-%02dT%02d:%02dZ", &objTm.tm_year, &objTm.tm_mon, &objTm.tm_mday, &objTm.tm_hour, &objTm.tm_min ); if( r != 5 ) throw std::runtime_error("Cannot read timestamp from " + std::string(ts) ); objTm.tm_year -= 1900; objTm.tm_mon -= 1; objTm.tm_sec = 0; time_t res = mktime( &objTm ); if( res < 0 ) throw std::runtime_error("Cannot make timestamp from " + std::string(ts) ); return res; } // ---------------------------------------------------------------------------- /// Some chars are forbidden in HTML documents. This replaces them by HTML entities. // We do not need to create a temporary copy of the transformed string. // See Html entities here: http://www.w3schools.com/tags/ref_entities.asp static void StripHtmlTags( std::ostream & ostrm, const char * beg, bool newLines = false ) { const char * ptr = NULL; // TODO: Consider   ¢ £ ¥ € § © ® ™ for( const char * it = beg ; ; ++it ) { /** Other characters are filtered: * U+0009, U+000A, U+000D: these are the only C0 controls accepted in XML 1.0; * U+0020–U+D7FF, U+E000–U+FFFD: */ char ch = *it ; switch( ch ) { case 0x01 ... 0x08 : // case 0x09 : // case 0x0A : case 0x0B ... 0x0C : // case 0x0D : case 0x0E ... 0x0F : ptr = " "; break; case '"' : ptr = """; break; case '\'' : ptr = "'"; break; case '&' : ptr = "&" ; break; case '<' : ptr = "<" ; break; case '>' : ptr = ">" ; break; case '\0' : break ; case '\n' : if(newLines) // Should we replace new lines by "
" ? { ptr = "
" ; break; } // Otherwise we print the newline char like the other chars. default : continue ; } if( it != beg ) { ostrm.write( beg, it - beg ); } if( ch == '\0' ) break ; assert(ptr); ostrm << ptr ; beg = it + 1 ; } } /// Some values such as Navtex messages may contain newline chars. static void StripHtmlTagsNl( std::ostream & ostrm, const std::string & beg ) { StripHtmlTags( ostrm, beg.c_str(), true ); } static void StripHtmlTags( std::ostream & ostrm, const std::string & beg ) { StripHtmlTags( ostrm, beg.c_str() ); } // ---------------------------------------------------------------------------- /// Also used when reloading a KML file. void KmlServer::CustomDataT::Push( const char * k, const std::string & v ) { push_back( value_type( k, v ) ); } // ---------------------------------------------------------------------------- /// Different sorts of KML datas. This list is hardcoded but they are processed identically. static const char * categories[] = { "User", "Synop", "Navtex" }; static const size_t nb_categories = sizeof(categories) / sizeof(*categories); /// Written at the beginning of each KML document. static void KmlHeader( std::ostream & ostrm, const std::string & title ) { ostrm << "\n" "\n" "\n" "" << title << "\n" ; } /// Appended at the end of each KML document. static const char KmlFooter[] = "\n" "\n" ; /// Contains for example GIF images, and all the styles. Can be customised by the user. static const std::string namStyles = "styles.kml"; /** Used to code the data for reloading. The description tag is too complicated * to parse and its serialization might not be reversible. * We use preprocessor constants instead of char arrays so they can be concatenated at compile-time. * The tags must be as short as possible but the values easy to deserialize. * */ #define FLDIGI_TAG_ITM "fldigi:itm" #define FLDIGI_TAG_EVT "fldigi:evt" #define FLDIGI_TAG_KEY "k" #define FLDIGI_TAG_VAL "v" #define FLDIGI_TIMESTAMP "ts" /// Global singleton of all KML-related things. class KmlSrvImpl : public KmlServer { volatile bool m_loaded ; /// Set when ready for operation. std::string m_kml_dir; /// Where kml files are saved. std::string m_command; /// Started each time KML files are saved. int m_pid_command; /// Process id of the running commend for KML files. double m_merge_dist; /// Below this, placemark with same name are merged. int m_retention_delay; /// Purge old data. int m_refresh_interval; /// In seconds, written in KML files. int m_balloon_style; /// Display style in KML balloons: Lines, matrices, plain text. pthread_t m_writer_thread ; /// Periodically woken up to write things to the KML file. /// Models a KML placemark. It contains events indexed my a timestamp. /// We need an ordered container in order to remove old data in one erase. class PlacemarkT : public std::multimap< time_t, CustomDataT > { CoordinateT::Pair m_coord; double m_altitude; std::string m_styleNam; // The icon. std::string m_kmlId ; // Unique KML id for the placemark. std::string m_descrTxt ;// KML snippet. /// Serialize the internal data to XML so they can be easily read. void SerializeForReading( std::ostream & ostrm ) const { /// Custom data elements for reading the content when restarting. ostrm << "\n"; /// Print from the most recent event, which is at the end. for( const_iterator itEvt = begin(), enEvt = end(); itEvt != enEvt; ++itEvt ) { ostrm << "<" FLDIGI_TAG_EVT " " FLDIGI_TIMESTAMP "=\""; KmlTimestamp(ostrm,itEvt->first); ostrm << "\">\n" ; const CustomDataT & refCust = itEvt->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { ostrm << "<" FLDIGI_TAG_ITM " " FLDIGI_TAG_KEY "=\"" << it->first << "\" " FLDIGI_TAG_VAL "=\""; StripHtmlTags(ostrm,it->second); ostrm << "\" />"; } ostrm << "\n" ; } /// Dumps all events in natural order ostrm << "\n"; } public: /// Constructor called by "Broadcast", not from reading a KML file. PlacemarkT( const CoordinateT::Pair & refCoo, double altitude, const std::string & styleNam, const std::string & kmlNam ) : m_coord( refCoo ) , m_altitude( altitude ) , m_styleNam( styleNam ) { /// The unique key is indeed the name and the time, /// because an object such as a ship might move and come back to the same place. /// We add a counter because during tests, the timestamps are too close. static int dummyCnt = 0 ; std::stringstream strm ; /// No need to store the kml name because it is the multimap key. StripHtmlTags(strm,kmlNam); strm << ':' << Tm2Time() << ':' << ++dummyCnt ; m_kmlId = strm.str(); } /// Constructor for deserialization. Strings comes from the KML file. PlacemarkT() : m_altitude(0.0) {} void Clear() { m_styleNam.clear(); m_kmlId.clear(); m_descrTxt.clear(); clear(); } /// Used when reading a KML file. Read coordinates and altitude from a string when reloading a KML file. void SetCoordinates( const char * str ) { double lon, lat ; if( str == NULL ) { throw std::runtime_error("Null coordinates text"); } int r = sscanf( str, "%lf,%lf,%lf", &lon, &lat, &m_altitude ); if( r != 3 ) { static const std::string msg("Cannot read coordinates and altitude:"); throw std::runtime_error(msg+str); } m_coord = CoordinateT::Pair( lon, lat ); } /// Used when reading a KML file. HTML entities are already removed. "+1" is for the "#". void SetStyle( const char * str ) { if(str == NULL ) throw std::runtime_error("Null input style"); size_t sz = namStyles.size(); // If the strings are equal, then strlen(str) >= sz, and str[sz] == '\0' if equality. if( ( 0 == strncmp( str, namStyles.c_str(), sz ) ) && ( str[sz] == '#' ) ) { m_styleNam = str + sz + 1; } else { LOG_INFO("Inconsistent URL style:%s",str ); m_styleNam = str ; } } /// Used when reading a KML file. void SetKmlId( const char * str ) { std::stringstream strm ; // The KML deserializer irrXML transforms the HTML entities // into normal chars. We must do the reverse transformation. StripHtmlTags(strm,str); m_kmlId = strm.str(); } /// Just add the events without suppressing duplicate information. void AppendEvent( time_t evtTim, const std::string & descrTxt, const CustomDataT & custDat ) { if( m_descrTxt.empty() ) m_descrTxt = descrTxt ; else if( ! descrTxt.empty() ) { // We want to ensure that it is not a miscommunication. if( NULL == strstr( m_descrTxt.c_str(), descrTxt.c_str() ) ) { m_descrTxt += "," + descrTxt ; } } /// Default time is now. evtTim might have another special value. if(evtTim == 0) { evtTim = time(NULL); } insert( value_type( evtTim, custDat ) ); } const CoordinateT::Pair & coordinates() const { return m_coord;} double altitude(void) const { return m_altitude;} const std::string & style(void) const { return m_styleNam; } const std::string & KmlId(void) const { return m_kmlId; } /// When writing the style to the KML file. void styleToKml(std::ostream & ostrm) const { ostrm << namStyles << '#'; StripHtmlTags(ostrm,m_styleNam); } /// Used when several PlacemarkT with the same kmlNam but different styles. Keep the first only. void style(const std::string & styl) { m_styleNam = styl; } /// This is NOT the Euclidian distance but tries to reflect a position change on a 3D map. double distance_to( const PlacemarkT & refOther ) const { double delta_altitude_km = fabs( m_altitude - refOther.m_altitude ) * 0.001 ; // Big coefficient for the altitude, to show on the map what happens. double horiz_dist = m_coord.distance( refOther.m_coord ); return horiz_dist + 10 * delta_altitude_km ; } /// Adds the events of another placemark. Manages events enforced to be unique. void concatenate( const PlacemarkT & refOther ) { if( refOther.empty() ) return ; time_t firstTm = refOther.begin()->first ; if( firstTm == KmlServer::UniqueEvent ) { clear(); /// We keep this special time_t value to enforce unicity of CustomDataT. insert( *refOther.begin() ); } else { insert( refOther.begin(), refOther.end() ); } } // PlacemarkT::concatenate /// This transforms our coordinates into KML ones. void WriteCooSub( std::ostream & ostrm ) const { ostrm << m_coord.longitude().angle() << ',' << m_coord.latitude().angle() << ',' << m_altitude ; } /// Writes the placemark to a KML stream. void Serialize( std::ostream & ostrm, const std::string & kmlNam, int balloon_style ) const { // Range of events which occured at this place. const_reverse_iterator beEvt = rbegin(), enEvt = rend(); // There should be at least one event. if( beEvt == enEvt ) { LOG_WARN("Inconsistency: No event kmlId=%s",m_kmlId.c_str() ); return ; } // The unique key is indeed the name and the time, // because an object such as a ship might move and come back to the same place. // We add a counter because during tests, the timestamps are too close. ostrm << "\n"; // Beware of the sign of longitude. ostrm << "" ; WriteCooSub( ostrm ); ostrm << "\n"; if( kmlNam.empty() ) ostrm << "No name\n"; else { // Looks like there is a bug in KML when displaying a placemark ID containing an hyphen. ostrm << ""; StripHtmlTags(ostrm,kmlNam); ostrm << "\n"; } ostrm << ""; styleToKml(ostrm); ostrm << "\n"; // More information here: http://freegeographytools.com/2007/putting-time-data-into-a-kml-file // 1944-06-06T06:00:00 See http://www.w3.org/TR/xmlschema-2/#isoformats // We do not add the timestamps because it is not very ergonomic. Should be added to the linestrings too. static const bool withTimestamp = false ; if( withTimestamp ) { // Last update time is last argument. ostrm << ""; KmlTimestamp(ostrm,enEvt->first); ostrm << "\n"; } /// Whats is displayed on the margin. Must be short. ostrm << ""; StripHtmlTags(ostrm,m_descrTxt); ostrm << "\n"; /** * Unfortunately it is not possible to use CSS in Google-maps, due to "content scrubbing": * http://stackoverflow.com/questions/8421260/styling-kml-with-css-in-google-maps-v3 * Scrubbing the contents is a security measure to prevent malicious code from executing. * It removes JavaScript, CSS, iframe, embed and object tags. */ static const char * colorTime = "#0099CC"; static const char * colorKey = "#FF9933"; ostrm << ""; /// Data can be displayed into one big matrix, or several tables, one per event. switch( balloon_style ) { case 0: /// Plain text, for example for GPX conversion. for( const_reverse_iterator itEvt = beEvt; itEvt != enEvt; ++itEvt ) { ostrm << "Timestamp:" << Tm2Time(itEvt->first) << "\n" ; const CustomDataT & refCust = itEvt->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { StripHtmlTags(ostrm,it->first); ostrm << ":"; /// Do not insert
tags. StripHtmlTags(ostrm,it->second); ostrm << "\n" ; } ostrm << "\n" ; } break; case 1: // One distinct HTML table per event. ostrm << ""; // Print from the most recent event, which is at the end. for( const_reverse_iterator itEvt = beEvt; itEvt != enEvt; ++itEvt ) { ostrm << ""; ostrm << "" << Tm2Time(itEvt->first) << "" "" ; const CustomDataT & refCust = itEvt->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { ostrm << "" ""; StripHtmlTags(ostrm,it->first); ostrm << "" ""; StripHtmlTagsNl(ostrm,it->second); ostrm << "" "" ; } } ostrm << "]]>\n"; break; case 2 : { /// Transposition of the html matrix. typedef std::vector TitleT ; TitleT titles ; typedef std::vector< std::string > RowT ; const_iterator beCol = begin(), enCol = end(); for( const_iterator itCol = beCol; itCol != enCol; ++itCol ) { titles.push_back( itCol->first ); } size_t nbCols = titles.size(); typedef std::map< std::string, RowT > MtxT; MtxT mtx ; size_t iCols = 0; for( const_iterator itCol = beCol; itCol != enCol; ++itCol, ++iCols ) { const CustomDataT & refCust = itCol->second; for( CustomDataT::const_iterator it = refCust.begin(), en = refCust.end(); it != en; ++it ) { MtxT::iterator itMtx = mtx.find( it->first ); if( itMtx == mtx.end() ) { itMtx = mtx.insert( mtx.end(), MtxT::value_type( it->first, RowT() ) ); itMtx->second.resize(nbCols); } itMtx->second[iCols] = it->second ; } } ostrm << ""; ostrm << ""; for( size_t iCols = 0; iCols < nbCols; ++iCols ) { ostrm << "" << Tm2Time(titles[iCols]) << ""; } ostrm << "" ; for( MtxT::const_iterator itMtx = mtx.begin(), enMtx = mtx.end(); itMtx != enMtx; ++itMtx ) { ostrm << ""; ostrm << ""; StripHtmlTags(ostrm,itMtx->first); ostrm << ""; // TODO: Do not write twice the same value if it is not numeric (Starting with a digit) // or longer than N characters. for( RowT::const_iterator itRow = itMtx->second.begin(), enRow = itMtx->second.end(); itRow != enRow; ++itRow ) { ostrm << ""; StripHtmlTags(ostrm,*itRow); ostrm << ""; } ostrm << "" ; } ostrm << "]]>\n"; break; } } ostrm << "
\n"; // TODO: Other dsplay style: All elements on a one single table. Removal of duplicate text values etc... SerializeForReading( ostrm ); ostrm << "
\n"; } // PlacemarkT::Serialize }; // PlacemarkT /** The placemark name is unique wrt to the application. It might map to several PlaceMark, each having distinct coordinates. It is not really possible to sort the different locations by coordinates, because it is a list created by the object trajectory. class PlacesMapT : public std::multimap< std::string, PlacemarkT > */ class PlacesMapT : public std::multimap< std::string, PlacemarkT > { /// Written to by the main thread with lock protection, read (and emptied) /// by the sub thread which is later in charge of writing things to disk. typedef std::list< value_type > PlacemarkListT ; /// A separate queue helps for performance because the insertion in the main container /// might take time and the main thread may lose data. PlacemarkListT m_queue_to_insert ; /// This is not set when inserting at load time, but when emptying /// the queue, and when data are ready for writing to disk. mutable bool m_must_save ; public: PlacesMapT() : m_must_save(false) {} /// Finds an object with the same name and close enough. /// If an object with the same name exists but is distant, creates a new one, /// plus a path between the two. /// Called by the main thread at startup when loading the previous KML files. Then later /// called by the subthread in charge of flushing PlacemarkT to the KML file. void DirectInsert( const value_type & refVL, double merge_dist ) { /// Not needed to use equal_range because we need the last placemark matching /// this key, and this iterator is forward_iterator only. iterator it = find( refVL.first ), en = end() ; if( it == en ) { LOG_INFO("Cannot find '%s'", refVL.first.c_str() ); it = insert( end(), refVL ); return; } /// Searches for the last element with the same key. iterator last = it, next = it ; ++next ; while( next != en && next->first == refVL.first ) { last = next; ++next ; } double dist = last->second.distance_to( refVL.second ); /// We can reuse the last element because it is not too far from our coordinates. if( 1000 * dist < merge_dist ) { /// LOG_INFO("Reusing '%s' merge_dist=%lf", refVL.first.c_str(), dist ); /** There will be one event only if adding a new received event, otherwise several if reloading from a file. The new events will be inserted based on their timestamp. */ // last->second.insert( refVL.second.begin(), refVL.second.end() ); last->second.concatenate( refVL.second ); return ; } LOG_INFO("Inserted '%s' merge_dist=%lf", refVL.first.c_str(), dist ); /// The object is inserted at the end of all elements with the same key. iterator ret = insert( next, refVL ); /// Runtime check of an assumption. { iterator tst = last ; ++tst ; if( tst != ret ) { LOG_WARN("Iterators assumption is wrong (1): %s", refVL.first.c_str() ); } ++tst ; if( tst != next ) { LOG_WARN("Iterators assumption is wrong (2): %s", refVL.first.c_str() ); } } /// They must have the same style otherwise they will be in different folders. if( refVL.second.style() != last->second.style() ) { LOG_WARN("Correcting style discrepancy %s: %s != %s", refVL.first.c_str(), refVL.second.style().c_str(), last->second.style().c_str() ); ret->second.style( last->second.style() ); } } // DirectInsert /// Enqueues a new placemark for insertion by the subthread. Called by the main thread /// each time a Broadcast of a new PlacemarkT is done. void Enqueue( const std::string & kmlNam, const PlacemarkT & refPM ) { /// So we will save to a file, because something changed. m_queue_to_insert.push_back( value_type( kmlNam, refPM ) ); } /// Called by the subthread. It can merge data of placemarks with the same name /// and different positions due to a move. This has to be very fast because under lock protection. void FlushQueue(double merge_dist) { LOG_INFO("FlushQueue nbelts %d sz=%d", static_cast(m_queue_to_insert.size()), static_cast(size()) ); if( m_queue_to_insert.empty() ) return ; for( PlacemarkListT::iterator itPL = m_queue_to_insert.begin(), enPL = m_queue_to_insert.end(); itPL != enPL; ++ itPL ) { DirectInsert( *itPL, merge_dist ); } LOG_INFO("Flushed into sz=%d", static_cast(size()) ); // TODO: If lock contention problems, we might swap this list with another one owned by this // objet. This would later be merged into the container before saving data to disk. m_queue_to_insert.clear(); m_must_save = true ; } /// Removes obsolete data for one category only. void PruneKmlFile( int retention_delay ) { /// By convention, it means keeping all data. if( retention_delay <= 0 ) return ; /// Called only once per hour, instead of at every call. Saves CPU. static time_t prev_call_tm = 0 ; time_t now = time(NULL); static const int seconds_per_hour = 60 * 60 ; /// First call of this function, always do the processing. if( prev_call_tm != 0 ) { /// If this was called for less than one hour, then return. if( prev_call_tm > now - seconds_per_hour ) return ; } prev_call_tm = now ; /// Cleanup all data older than this. time_t limit_time = now - retention_delay * seconds_per_hour ; LOG_INFO("sz=%d retention=%d hours now=%s limit=%s", (int)size(), retention_delay, KmlTimestamp(now).c_str(), KmlTimestamp(limit_time).c_str() ); size_t nbFullErased = 0 ; size_t nbPartErased = 0 ; for( iterator itMap = begin(), nxtMap = itMap, enMap = end() ; itMap != enMap; itMap = nxtMap ) { PlacemarkT & refP = itMap->second ; ++nxtMap ; /// Erases all elements older than the limit, or the whole element. PlacemarkT::iterator itP = refP.upper_bound( limit_time ); if( itP == refP.end() ) { erase( itMap ); ++nbFullErased ; } else if( itP != refP.begin() ) { refP.erase( refP.begin(), itP ); ++nbPartErased ; } } // Maybe the container only lost data because of data expiration, so it must be saved. bool must_save_now = m_must_save || ( nbFullErased > 0 ) || ( nbPartErased > 0 ) ; LOG_INFO("Sz=%d FullyErased=%d PartialErased=%d m_must_save=%d must_save_now=%d", (int)size(), (int)nbFullErased, (int)nbPartErased, m_must_save, must_save_now ); m_must_save = must_save_now ; } /// This is not efficient because we reopen the file at each access, but it ensures /// that the file is consistent and accessible at any moment. bool RewriteKmlFileOneCategory( const std::string & category, const std::string & kmlFilNam, int balloon_style ) const { // Normally, it is stable when we insert an element with a duplicate key. typedef std::multiset< PlacesMapT::const_iterator, PlacesMapIterSortT > PlacesMapItrSetT ; PlacesMapItrSetT plcMapIterSet ; /// If there is nothing to save, not needed to create a file. if( false == m_must_save ) return false ; /// For safety purpose, we do not empty the file. It might be an error. if( empty() ) { LOG_INFO("Should empty KML file %s. Grace period.", kmlFilNam.c_str() ); return false ; } m_must_save = false ; for( const_iterator itPlcMap = begin(), en = end(); itPlcMap != en ; ++itPlcMap ) { plcMapIterSet.insert( itPlcMap ); } int nbPlacemarks = plcMapIterSet.size(); // This file must be atomic because it is periodically read. // TODO: Checks if another process has locked the ".tmp" file. // If so , we should reread the KML file and merge our data with it. // This would allow to have several fldigi sessions simultaneously running // on the same KML files. On the other hand, it should already work if these // processes are updating different categories, which is more probable. AtomicRenamer ar( kmlFilNam ); KmlHeader(ar, category) ; // This will easily allow hierarchical folders. std::string lastStyle ; for( PlacesMapItrSetT::const_iterator itStyl = plcMapIterSet.begin(), enStyl = plcMapIterSet.end(); itStyl != enStyl; ) { ar << ""; // Hyphen: No idea why, but the string "10-meter discus buoy:W GULF 207 NM " just displays as "10-" ar << ""; StripHtmlTags( ar,(*itStyl)->second.style() ); ar << ""; // Several placemarks with the same name: A single object has moved. PlacesMapItrSetT::const_iterator itStylNext = itStyl ; for(;;) { // TODO: Objects with the same name and different coordinates must be signaled so. (*itStylNext)->second.Serialize( ar, (*itStylNext)->first, balloon_style); ++itStylNext ; if( itStylNext == enStyl ) break ; if( (*itStyl)->second.style() != (*itStylNext)->second.style() ) break ; } // Now, in the same loop, we draw the polylines between placemarks with the same name. for( PlacesMapItrSetT::const_iterator itNamBeg = itStyl, itNamLast = itNamBeg; itNamLast != itStylNext ; ) { PlacesMapItrSetT::const_iterator itNamNxt = itNamLast; ++itNamNxt ; if( ( itNamNxt == itStylNext ) || ( (*itNamNxt)->first != (*itNamLast)->first ) ) { // No point tracing a line with one point only. if( *itNamBeg != *itNamLast ) { DrawPolyline( ar, category, *itNamBeg, *itNamLast ); } itNamBeg = itNamNxt ; } itNamLast = itNamNxt ; } itStyl = itStylNext ; ar << ""; } ar << KmlFooter ; LOG_INFO("Saved %s: %d placemarks to %s", category.c_str(), nbPlacemarks, kmlFilNam.c_str() ); return true ; } // KmlSrvImpl::PlacesMapT::RewriteKmlFileOneCategory }; // KmlSrvImpl::PlacesMapT /// There is a very small number of categories: Synop, Navtex etc... struct PlacemarksCacheT : public std::map< std::string, PlacesMapT > { const PlacesMapT * FindCategory( const std::string & category ) const { const_iterator it = find( category ); if( it == end() ) return NULL ; return &it->second; } PlacesMapT * FindCategory( const std::string & category ) { iterator it = find( category ); if( it == end() ) it = insert( end(), value_type( category, PlacesMapT() ) ); return &it->second ; } }; /// At startup, should be reloaded from the various KML files. PlacemarksCacheT m_placemarks ; /// Used for signaling errors. void close_throw( FILE * ofil, const std::string & msg ) const { if( ofil ) fclose( ofil ); throw std::runtime_error( strformat( "%s:%s", msg.c_str(), strerror(errno) ) ); } /// This points to the specific KML file of the category. void CategoryNetworkLink( std::ostream & strm, const std::string & category ) const { strm << "\n" " " << category << "\n" " \n" " " << category << ".kml\n" " onInterval\n" " " << m_refresh_interval << "\n" " \n" "\n"; } // KmlSrvImpl::CategoryNetworkLink /// This file copy does not need to be atomic because it happens once only. void CopyStyleFileIfNotExists(void) { /// Where the installed file is stored and never moved from. Used as default. std::string namSrc = PKGDATADIR "/kml/" + namStyles ; /// The use might customize its styles file: It will not be altered. std::string namDst = m_kml_dir + namStyles ; /// Used to copy the master file to the user copy if needed. FILE * filSrc = NULL; FILE * filDst = fl_fopen( namDst.c_str(), "r" ); /// If the file is there, leave as it is because it is maybe customize. if( filDst ) { LOG_INFO("Style file %s not altered", namDst.c_str() ); goto close_and_quit ; } filDst = fl_fopen( namDst.c_str(), "w" ); if( filDst == NULL ) { LOG_INFO("Cannot open destination style file %s", namDst.c_str() ); goto close_and_quit ; } filSrc = fl_fopen( namSrc.c_str(), "r" ); if( filSrc == NULL ) { LOG_INFO("Cannot open source style file %s", namSrc.c_str() ); goto close_and_quit ; } /// Transient buffer to copy the file. char buffer[BUFSIZ]; size_t n; while ((n = fread(buffer, sizeof(char), sizeof(buffer), filSrc)) > 0) { if (fwrite(buffer, sizeof(char), n, filDst) != n) { LOG_WARN("Error %s copying style file %s to %s", strerror(errno), namSrc.c_str(), namDst.c_str() ); goto close_and_quit ; } } LOG_INFO("Style file %s copied to %s", namSrc.c_str(), namDst.c_str() ); close_and_quit: if( filDst ) fclose(filDst); if( filSrc ) fclose(filSrc); } /// This creates a KML file with links to the categories such as Synop and Navtex. void CreateMainKmlFile(void) { // This is the file, that the user must click on. std::string baseFil = m_kml_dir + "fldigi.kml" ; LOG_INFO("Creating baseFil=%s", baseFil.c_str() ); /// We do not need to make this file atomic because it is read once only. AtomicRenamer ar( baseFil ); KmlHeader( ar, "Fldigi"); for( size_t i = 0; i < nb_categories; ++i ) CategoryNetworkLink( ar, categories[i] ); ar << KmlFooter ; } // TODO: Consider hierarchical categories: "Synop/buoy/Inmarsat" /// A specific name is chosen so we can later update this line. static void DrawPolyline( std::ostream & ostrm, const std::string & category, PlacesMapT::const_iterator beg, PlacesMapT::const_iterator last ) { /// The polyline gets an id based on the beginning of the path, which will never change. ostrm << "second.KmlId() << ":Path\">" "" << beg->second.KmlId() << "" "" "clampToGround1\n" "\n"; double dist = 0.0 ; int nbStops = 0 ; // "135.2, 35.4, 0. for(;;) { beg->second.WriteCooSub( ostrm ); ostrm << "\n"; if( beg == last ) break ; PlacesMapT::const_iterator next = beg ; ++next ; ++nbStops; dist += beg->second.coordinates().distance( next->second.coordinates() ); beg = next ; }; ostrm << "" "" "" << dist << " " << _("kilometers") << " in " << nbStops << " " << _("stops") << "" "" "\n"; } // DrawPolyline /// Similar to a std::ofstream but atomically updated by renaming a temp file. struct AtomicRenamer : public std::ofstream { /// Target file name. std::string m_filnam ; /// Temporary file name. Renamed to the target when closed. std::string m_filtmp ; public: /// This opens a temporary file when all the writing is done. AtomicRenamer( const std::string & filnam ) : m_filnam( filnam ) , m_filtmp( filnam + ".tmp" ) { LOG_INFO("AtomicRenamer opening tmp %s", filnam.c_str() ); open( m_filtmp.c_str() ); if( bad() ) { LOG_WARN("Cannot open %s", m_filtmp.c_str() ); } } /// Atomic because rename is an atomic too, and very fast if in same directory. ~AtomicRenamer() { close(); /// This is needed on Windows. int ret_rm = remove( m_filnam.c_str() ); if( ( ret_rm != 0 ) && ( errno != ENOENT ) ) { LOG_WARN("Cannot remove %s: %s", m_filnam.c_str(), strerror(errno) ); } int ret_mv = rename( m_filtmp.c_str(), m_filnam.c_str() ); if( ret_mv ) { LOG_WARN("Cannot rename %s to %s:%s", m_filtmp.c_str(), m_filnam.c_str(), strerror(errno) ); } } }; /// The KML filename associated to a category. std::string CategFile( const std::string & category ) const { return m_kml_dir + category + ".kml"; } /// Resets the files. Called from the test program and the GUI. void CreateNewKmlFile( const std::string & category ) const { // This file must be atomic because it is periodically read. AtomicRenamer ar( CategFile( category ) ); KmlHeader( ar, category); ar << KmlFooter ; } /// Template parameters should not be local types. struct PlacesMapIterSortT { // This sort iterators on placemarks, based on the style name then the placemark name. bool operator()( const PlacesMapT::const_iterator & it1, const PlacesMapT::const_iterator & it2 ) const { int res = it1->second.style().compare( it2->second.style() ); if( res == 0 ) res = it1->first.compare( it2->first ); return res < 0 ; } }; /// Various states of the KML reader. #define KMLRD_NONE 1 #define KMLRD_FOLDER 2 #define KMLRD_FOLDER_NAME 3 #define KMLRD_FOLDER_PLACEMARK 4 #define KMLRD_FOLDER_PLACEMARK_NAME 5 #define KMLRD_FOLDER_PLACEMARK_POINT 6 #define KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES 7 #define KMLRD_FOLDER_PLACEMARK_STYLEURL 8 #define KMLRD_FOLDER_PLACEMARK_SNIPPET 9 #define KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA 10 #define KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT 11 #define KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT_FLDIGIITEM 12 #define KMLRD_FOLDER_PLACEMARK_UNDEFINED 13 #define KMLRD_FOLDER_UNDEFINED 14 /// Debugging purpose only. static const char * KmlRdToStr( int kmlRd ) { #define KMLRD_CASE(k) case k : return #k ; switch(kmlRd) { KMLRD_CASE(KMLRD_NONE) KMLRD_CASE(KMLRD_FOLDER) KMLRD_CASE(KMLRD_FOLDER_NAME) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_NAME) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_POINT) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_STYLEURL) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_SNIPPET) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT) KMLRD_CASE(KMLRD_FOLDER_PLACEMARK_UNDEFINED) KMLRD_CASE(KMLRD_FOLDER_UNDEFINED) default : return "Unknown KMLRD code"; } #undef KMLRD_CASE } /// Loads a file of a previous session. The mutex should be locked at this moment. void ReloadSingleKmlFile( const std::string & category ) { std::string kmlFilNam = CategFile( category ); LOG_INFO("kmlFilNam=%s m_merge_dist=%lf", kmlFilNam.c_str(), m_merge_dist ); PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); FILE * filKml = fl_fopen( kmlFilNam.c_str(), "r" ); if( filKml == NULL ) { LOG_ERROR("Could not open %s. Creating one.", kmlFilNam.c_str() ); CreateNewKmlFile( category ); return ; } /// The destructor ensures the file will be closed if an exception is thrown. struct FilCloserT { FILE * m_file ; ~FilCloserT() { fclose(m_file); } } Closer = { filKml }; irr::io::IrrXMLReader * xml = irr::io::createIrrXMLReader( Closer.m_file ); if( xml == NULL ) { LOG_ERROR("Could not parse %s", kmlFilNam.c_str() ); return ; } using namespace irr::io ; int currState = KMLRD_NONE ; std::string currFolderName ; std::string currPlcmrkName ; time_t currTimestamp = 0; std::string currPlacemarkDescr ; CustomDataT currCustData ; PlacemarkT currPM; bool currIsPoint = false ; std::string avoidNode ; /// Stores the unique nodes which are misplaced. typedef std::set< std::string > UnexpectedNodesT ; UnexpectedNodesT unexpectedNodes ; // ship // 146.8,-19.2,0 // Ship:AUP06 // styles.kml#ship // 2012-09-24 12:00read()) { switch(xml->getNodeType()) { case EXN_TEXT: { if( ! avoidNode.empty() ) break ; const char * msgTxt = xml->getNodeData(); LOG_DEBUG( "getNodeData=%s currState=%s", msgTxt, KmlRdToStr(currState) ); switch(currState) { case KMLRD_FOLDER_NAME : currFolderName = msgTxt ? msgTxt : "NullFolder"; break; case KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES : currPM.SetCoordinates(msgTxt); break; case KMLRD_FOLDER_PLACEMARK_NAME : currPlcmrkName = msgTxt ? msgTxt : "NullPlacemarkName"; break; case KMLRD_FOLDER_PLACEMARK_SNIPPET : currPlacemarkDescr = msgTxt ? msgTxt : "NullSnippet"; break; case KMLRD_FOLDER_PLACEMARK_STYLEURL : currPM.SetStyle(msgTxt); break; default: break; } break; } case EXN_ELEMENT: { if( ! avoidNode.empty() ) break ; const char *nodeName = xml->getNodeName(); LOG_INFO( "getNodeName=%s currState=%s", nodeName, KmlRdToStr(currState) ); // TODO: Have a hashmap for each case. switch(currState) { case KMLRD_NONE : if (!strcmp("Folder", nodeName)) { currState = KMLRD_FOLDER ; } else { /// These tags are not meaningful for us. if( strcmp( "kml", nodeName ) && strcmp( "Document", nodeName ) && strcmp( "name", nodeName ) ) LOG_INFO("Unexpected %s in document %s. currState=%s", nodeName, category.c_str(), KmlRdToStr(currState) ); } break; case KMLRD_FOLDER : if (!strcmp("name", nodeName)) { currState = KMLRD_FOLDER_NAME ; } else if (!strcmp("Placemark", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK ; currPM.Clear(); const char * strId = xml->getAttributeValue("id"); currPM.SetKmlId( strId ); } else { avoidNode = nodeName ; currState = KMLRD_FOLDER_UNDEFINED ; LOG_INFO("Unexpected %s in folder %s. currState=%s", nodeName, currFolderName.c_str(), KmlRdToStr(currState) ); } break; case KMLRD_FOLDER_PLACEMARK : // There are different sorts of Placemark such as Point or LineString. if (!strcmp("Point", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_POINT ; currIsPoint = true ; } else if (!strcmp("name", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_NAME ; } else if (!strcmp("Snippet", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_SNIPPET ; } else if (!strcmp("styleUrl", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_STYLEURL ; } else if (!strcmp("ExtendedData", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA ; } else if (!strcmp("description", nodeName)) { // We do not care about this tag, but it is always here. currState = KMLRD_FOLDER_PLACEMARK_UNDEFINED ; } else { avoidNode = nodeName ; currState = KMLRD_FOLDER_PLACEMARK_UNDEFINED ; /// At the same time, it is detected and inserted. std::pair< UnexpectedNodesT::iterator, bool > pr = unexpectedNodes.insert( nodeName ); // Other occurences of the same nodes will not be signaled. if( pr.second ) { LOG_INFO("Unexpected %s in placemark id=%s name=%s. currState=%s", nodeName, currPM.KmlId().c_str(), currPlcmrkName.c_str(), KmlRdToStr(currState) ); } } break; case KMLRD_FOLDER_PLACEMARK_POINT : if (!strcmp("coordinates", nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES ; } else { LOG_INFO("Unexpected %s in coordinates. currState=%s", nodeName, KmlRdToStr(currState) ); } break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA: if (!strcmp(FLDIGI_TAG_EVT, nodeName)) { currState = KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT ; currTimestamp = KmlFromTimestamp( xml->getAttributeValue(FLDIGI_TIMESTAMP) ); currCustData.clear(); } else LOG_INFO("Unexpected %s in extended data. currState=%s", nodeName, KmlRdToStr(currState) ); break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT: // http://irrlicht.sourceforge.net/forum/viewtopic.php?t=10532 // The Parser irrXml will not call "EXN_ELEMENT_END" because the tag // has a trailing slash. Therefore we stay in the same state. // We could call irr::io::IIrrXMLReader<...>::isEmptyElement() to check that. if (!strcmp(FLDIGI_TAG_ITM, nodeName)) { assert( xml->isEmptyElement() ); const char * strKey = xml->getAttributeValue(FLDIGI_TAG_KEY); if(strKey == NULL ) { LOG_INFO("Null item key"); break ; } const char * strVal = xml->getAttributeValue(FLDIGI_TAG_VAL); if(strVal == NULL ) { LOG_INFO("Null item value"); break ; } currCustData.Push( strKey, strVal ); } else LOG_INFO("Unexpected %s in event. currState=%s", nodeName, KmlRdToStr(currState) ); break; default: break; } break; } case EXN_ELEMENT_END: { if( ! avoidNode.empty() ) { const char * msgTxt = xml->getNodeData(); if( avoidNode == msgTxt ) { LOG_INFO("Leaving forbidden element %s. currState=%s", avoidNode.c_str(), KmlRdToStr(currState) ); // We can leave the quarantine. avoidNode.clear(); } else { LOG_INFO("Still in forbidden element %s, leaving %s. currState=%s", avoidNode.c_str(), msgTxt, KmlRdToStr(currState) ); break ; } } // We should check that this string matches wuth the state expects, but this is much // faster to use only integers. LOG_INFO("End of %s currState=%s", xml->getNodeData(), KmlRdToStr(currState) ); switch(currState) { case KMLRD_FOLDER : currState = KMLRD_NONE ; break; case KMLRD_FOLDER_PLACEMARK : // Loads only "Point" placemarks. Do not load "Linestring". if( ( ! currPlcmrkName.empty() ) && currIsPoint ) { ptrMap->DirectInsert( PlacesMapT::value_type( currPlcmrkName, currPM ), m_merge_dist ); } currTimestamp = -1 ; currPlacemarkDescr.clear(); currPlcmrkName.clear(); currIsPoint = false ; currState = KMLRD_FOLDER ; break; case KMLRD_FOLDER_NAME : case KMLRD_FOLDER_UNDEFINED : currState = KMLRD_FOLDER ; break; case KMLRD_FOLDER_PLACEMARK_NAME : case KMLRD_FOLDER_PLACEMARK_POINT : case KMLRD_FOLDER_PLACEMARK_STYLEURL : case KMLRD_FOLDER_PLACEMARK_SNIPPET : case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA : case KMLRD_FOLDER_PLACEMARK_UNDEFINED : currState = KMLRD_FOLDER_PLACEMARK ; break; case KMLRD_FOLDER_PLACEMARK_POINT_COORDINATES : currState = KMLRD_FOLDER_PLACEMARK_POINT ; break; case KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA_FLDIGIEVENT : currState = KMLRD_FOLDER_PLACEMARK_EXTENDEDDATA ; // TODO: As soon as possible, use std::move for performance. currPM.AppendEvent( currTimestamp, currPlacemarkDescr, currCustData ); currCustData.clear(); break; case KMLRD_NONE: break; default: LOG_ERROR("Should not happen %s", KmlRdToStr(currState)); break; } LOG_INFO("currState=%s", KmlRdToStr(currState) ); break; } case EXN_NONE: case EXN_COMMENT: case EXN_CDATA: case EXN_UNKNOWN: break; default: // LOG_INFO( "Default NodeType=%d", xml->getNodeType()); break; } } // And of course delete it delete xml; LOG_INFO("kmlFilNam=%s loaded sz=%d", kmlFilNam.c_str(), (int)ptrMap->size() ); } // KmlSrvImpl::ReloadSingleKmlFile /// Rewrites only the categories which have changed. bool RewriteKmlFileFull(void) { bool wasSaved = false ; LOG_INFO("nb_categories=%d", static_cast(nb_categories) ); for( size_t i = 0; i < nb_categories; ++i ) { const char * category = categories[i]; PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); if( ptrMap == NULL ) { LOG_INFO("Category %s undefined", category ); continue; } ptrMap->PruneKmlFile( m_retention_delay ); wasSaved |= ptrMap->RewriteKmlFileOneCategory( category, CategFile( category ), m_balloon_style ); } return wasSaved ; } // KmlSrvImpl::RewriteKmlFileFull #ifdef FLDIGI_KML_CONDITION_VARIABLE /// This is signaled when geographic data is broadcasted. pthread_cond_t m_cond_queue ; #else /// This is set to true when geographic data is broadcasted. bool m_bool_queue ; /// This tells that the subthread must leave at the first opportunity. bool m_kml_must_leave; #endif pthread_mutex_t m_mutex_write ; typedef std::list< PlacemarkT > PlacemarkListT ; PlacemarkListT m_queues[ nb_categories ]; /// Called in a subthread. Woken up by a timed condition to save content to a KML file. void * ThreadFunc(void) { MilliSleep(2000); // Give time enough to load data. int r ; // This is normally the default behaviour. r = pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, NULL ); if( r != 0 ) { LOG_ERROR("pthread_setcancelstate %s", strerror(errno) ); return NULL; } r = pthread_setcanceltype( PTHREAD_CANCEL_DEFERRED, NULL ); if( r != 0 ) { LOG_ERROR("pthread_setcanceltype %s", strerror(errno) ); return NULL; } int refresh_delay = m_refresh_interval ; // Endless loop until end of program, which cancels this subthread. for(;;) { #ifdef FLDIGI_KML_CONDITION_VARIABLE struct timespec tmp_tim; { guard_lock myGuard( &m_mutex_write ); // It does not need to be very accurate. tmp_tim.tv_sec = time(NULL) + refresh_delay; tmp_tim.tv_nsec = 0 ; //LOG_INFO("About to wait %d seconds", refresh ); r = pthread_cond_timedwait( &m_cond_queue, &m_mutex_write, &tmp_tim ); if( ( r != ETIMEDOUT ) && ( r != 0 ) ) { LOG_ERROR("pthread_cond_timedwait %s d=%d", strerror(errno), m_refresh_interval ); return (void *)"Error in pthread_cond_timed_wait"; } #else /// On the platforms where pthread_cond_timedwait has problems, everything behaves // as if there was a timeout when data is saved. refresh_delay is never changed. for( int i = 0; i < refresh_delay; ++i ) { MilliSleep( 1000 ); if( m_kml_must_leave ) { LOG_INFO("Exit flag detected. Leaving"); return (void *)"Exit flag detected"; } } { guard_lock myGuard( &m_mutex_write ); r = m_bool_queue ? ETIMEDOUT : 0 ; m_bool_queue = false; #endif // Except if extremely slow init, the object should be ready now: Files loaded etc... if( ! m_loaded ) { static int nb_retries = 3 ; if( nb_retries == 0 ) { static const char * error_message = "KML server could not start. Leaving"; LOG_ERROR("%s", error_message ); return (void *)error_message ; } --nb_retries ; LOG_INFO("KML server not ready yet. Cnt=%d. Restarting.",nb_retries); MilliSleep(1000); // Give time to load data. continue ; } // We might have missed the condition signal so a quick check will not do any harm. for( size_t i = 0; i < nb_categories; ++i ) { PlacesMapT *ptrMap = m_placemarks.FindCategory( categories[i] ); if( ptrMap == NULL ) { LOG_INFO("Category %s undefined", categories[i] ); continue; } // TODO: If there are contention problems, internally swap the queue // with a fresh empty one. ptrMap->FlushQueue( m_merge_dist ); } LOG_INFO("Releasing lock" ); } if( r == ETIMEDOUT ) { //LOG_INFO("Saving after wait=%d", refresh ); bool wasSaved = RewriteKmlFileFull(); // Maybe a user process must be created to process these KML files. if(wasSaved) { SpawnCommand(); } // Reset the interval to the initial value. refresh_delay = m_refresh_interval ; #ifdef FLDIGI_KML_CONDITION_VARIABLE } else { refresh_delay = tmp_tim.tv_sec - time(NULL); if( refresh_delay <= 0 ) refresh_delay = 1 ; //LOG_INFO("Interrupted when waiting. Restart with wait=%d", refresh ); #endif } } // Endless loop. return NULL ; } // ThreadFunc /// The C-style function called by pthread. static void * ThreadFunc( void * ptr ) { return static_cast< KmlSrvImpl *>(ptr)->ThreadFunc(); }; public: /// When setting or changing core parameters. void InitParams( const std::string & kml_command, const std::string & kml_dir, double kml_merge_distance, int kml_retention_delay, int kml_refresh_interval, int kml_balloon_style) try { /// The thread should NOT access anything at this moment. guard_lock myGuard( &m_mutex_write ); /// If the string is empty, no command is executed. m_command = kml_command; strtrim( m_command ); m_merge_dist = kml_merge_distance ; m_retention_delay = kml_retention_delay ; static const int min_refresh = 10 ; if( kml_refresh_interval < min_refresh ) { LOG_WARN("Refresh interval too small %d minimum is %d", kml_refresh_interval, min_refresh ); kml_refresh_interval = min_refresh ; } m_refresh_interval = kml_refresh_interval ; m_balloon_style = kml_balloon_style ; LOG_INFO("dir=%s merge_distance=%lf retention_delay=%d refresh_interval=%d balloon_style=%d", kml_dir.c_str(), kml_merge_distance, kml_retention_delay, kml_refresh_interval, kml_balloon_style ); m_kml_dir = kml_dir ; /// This enforces that the directory name always ends with a slash. if( m_kml_dir[ m_kml_dir.size() - 1 ] != '/' ) m_kml_dir += '/' ; const char * resdir = create_directory( m_kml_dir.c_str() ); if ( resdir ) { throw std::runtime_error( strformat( "Cannot create %s:%s", m_kml_dir.c_str(), resdir ) ); } CreateMainKmlFile(); CopyStyleFileIfNotExists(); } catch (const std::exception & exc) { // We assume that the calling program has no try/catch handler. LOG_ERROR("Caught exception:%s", exc.what() ); } catch (...) { LOG_ERROR("Caught unknown exception"); } virtual void ReloadKmlFiles() { /// The thread should NOT access anything at this moment. guard_lock myGuard( &m_mutex_write ); // This loads placemarks without the subthread, because it is simpler. for( size_t i = 0; i < nb_categories; ++i ) { try { ReloadSingleKmlFile( categories[i] ); } catch( const std::exception & exc ) { LOG_ERROR("Category %s. Caught %s", categories[i], exc.what() ); } } // Now the object is usable. Theoretically should be protected by a mutex. LOG_DEBUG("Object ready"); /// Even if an exception was thrown when loading the previous file, it does not /// prevent to overwrite the old files with new and clean ones. m_loaded = true ; } /// Invalid values everywhere, intentionnaly. KmlSrvImpl() : m_loaded(false) , m_pid_command(-1) , m_merge_dist(-1.0) , m_retention_delay(-1) , m_refresh_interval(-1) , m_balloon_style(0) { LOG_DEBUG("Creation"); #ifdef FLDIGI_KML_CONDITION_VARIABLE pthread_cond_init( &m_cond_queue, NULL ); #else m_bool_queue = false; m_kml_must_leave = false; #endif pthread_mutex_init( &m_mutex_write, NULL ); /// TODO: Add this thread to the other fldigi threads stored in cbq[]. if( pthread_create( &m_writer_thread, NULL, ThreadFunc, this ) ) { /// It is not urgent because this does not interact with the main thread. LOG_ERROR("pthread_create %s", strerror(errno) ); } } /** We cannot use KML updates with a local file: * "I want to know if it exists any solution to put relative paths in a * targetHref to load upload files in a directory in my computer simply * without any server running." * "Unfortunately, no, the security restrictions around prevent * this explicitly." */ /// iconNam: wmo automated fixed other dart buoy oilrig tao void Broadcast( const std::string & category, time_t evtTim, const CoordinateT::Pair & refCoo, double altitude, const std::string & kmlNam, const std::string & styleNam, const std::string & descrTxt, const CustomDataT & custDat ) { /// Hyphen: No idea why, but the string "10-meter discus buoy:W GULF 207 NM " just displays as "10-" std::string tmpKmlNam = strreplace( kmlNam, "-", " "); PlacemarkT currPM( refCoo, altitude, styleNam, tmpKmlNam ); currPM.AppendEvent( evtTim, descrTxt, custDat ); guard_lock myGuard( &m_mutex_write ); ++KmlServer::m_nb_broadcasts; PlacesMapT *ptrMap = m_placemarks.FindCategory( category ); if(ptrMap == NULL ) { LOG_ERROR("Category %s undefined", category.c_str()); } ptrMap->Enqueue( tmpKmlNam, currPM ); #ifdef FLDIGI_KML_CONDITION_VARIABLE pthread_cond_signal( &m_cond_queue ); #else m_bool_queue = true; #endif LOG_INFO("'%s' sz=%d time=%s nb_broad=%d m_merge_dist=%lf", descrTxt.c_str(), (int)ptrMap->size(), KmlTimestamp(evtTim).c_str(), KmlServer::m_nb_broadcasts,m_merge_dist ); } /// It flushes the content to disk. ~KmlSrvImpl() { { /// This will not be killed in the middle of the writing. LOG_INFO("Cancelling writer thread"); guard_lock myGuard( &m_mutex_write ); #ifdef FLDIGI_KML_CONDITION_VARIABLE LOG_INFO("Cancelling subthread"); int r = pthread_cancel( m_writer_thread ); if( r ) { LOG_ERROR("pthread_cancel %s", strerror(errno) ); return ; } #else LOG_INFO("Setting exit flag."); m_kml_must_leave = true ; #endif } LOG_INFO("Joining subthread"); void * retPtr; int r = pthread_join( m_writer_thread, &retPtr ); if( r ) { LOG_ERROR("pthread_join %s", strerror(errno) ); return ; } const char * msg = (retPtr == NULL) ? "Null" : (retPtr == PTHREAD_CANCELED) ? "Canceled thread" : static_cast(retPtr); LOG_INFO("Thread stopped. Message:%s", msg ); /// Here we are sure that the subthread is stopped. The subprocess is not called. RewriteKmlFileFull(); #ifdef FLDIGI_KML_CONDITION_VARIABLE pthread_cond_destroy( &m_cond_queue ); #endif pthread_mutex_destroy( &m_mutex_write ); } /// Empties the generated files. void Reset(void) { for( size_t i = 0; i < nb_categories; ++i ) { std::cout << "reset: " << categories[i] << std::endl; CreateNewKmlFile(categories[i]); } ResetCounter(); } /// This is called when KML files are saved, or on demand from the configuration tab. void SpawnCommand() { if( m_command.empty() ) return ; /** This stores the process id so the command is not restarted if still running. This allows to start for example Google Earth only once. But this allows also to run GPS_Babel for each new set of files, as soon as they are created. */ int is_proc_still_running = test_process( m_pid_command ); if( is_proc_still_running == -1 ) return ; if( ( m_pid_command <= 0 ) || ( is_proc_still_running == 0 ) ) { m_pid_command = fork_process( m_command.c_str() ); LOG_INFO("%s: Pid=%d Command=%s", __FUNCTION__, m_pid_command, m_command.c_str() ); } } }; // KmlSrvImpl /// Singleton. It must be destroyed at the end. static KmlServer * g_inst = NULL; static KmlSrvImpl * Pointer() { if( NULL == g_inst ) { g_inst = new KmlSrvImpl(); } KmlSrvImpl * p = dynamic_cast< KmlSrvImpl * >( g_inst ); if( p == NULL ) { LOG_ERROR("Null pointer"); throw std::runtime_error("KmlServer not initialised"); } return p ; } std::string KmlServer::Tm2Time( time_t tim ) { char bufTm[40]; tm tmpTm; gmtime_r( &tim, & tmpTm ); snprintf( bufTm, sizeof(bufTm), "%4d-%02d-%02d %02d:%02d", tmpTm.tm_year + 1900, tmpTm.tm_mon + 1, tmpTm.tm_mday, tmpTm.tm_hour, tmpTm.tm_min ); return bufTm; } /// Returns current time. std::string KmlServer::Tm2Time( ) { return Tm2Time( time(NULL) ); } /// One singleton for everyone. KmlServer * KmlServer::GetInstance(void) { return Pointer(); } /// This creates a process running the user command. void KmlServer::SpawnProcess() { Pointer()->SpawnCommand(); } /// Called by thr main program, clean exit. void KmlServer::Exit(void) { // We assume that the calling program has no try/catch handler. LOG_INFO("Exiting"); try { KmlServer * pKml = Pointer(); if( pKml ) { delete pKml; } } catch (const std::exception & exc) { LOG_ERROR("Caught exception:%s",exc.what() ); } catch (...) { LOG_ERROR("Caught unknown exception"); } } fldigi-4.2.05/src/compat/0000775000175000017500000000000014611714004012113 500000000000000fldigi-4.2.05/src/compat/mingw.c0000664000175000017500000001471514611711171013332 00000000000000// ---------------------------------------------------------------------------- // mingw.c // // The following routines were copied from git-1.6.1.2/compat/mingw.c: // sleep mingw_getcwd mingw_getenv mingw_rename // // The uname routine was adapted from libgw32c 0.4. // // The rest: // Copyright (C) 2009 // Stelios Bounanos, M0GLD // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "compat.h" /* default mode for stdin, stdout and stderr */ unsigned int _CRT_fmode = _O_BINARY; /* unsigned sleep(unsigned seconds) { Sleep(seconds*1000); return 0; } */ #undef getcwd char *mingw_getcwd(char *pointer, int len) { int i; char *ret = getcwd(pointer, len); if (!ret) return ret; for (i = 0; pointer[i]; i++) if (pointer[i] == '\\') pointer[i] = '/'; return ret; } #undef getenv char *mingw_getenv(const char *name) { char *result = getenv(name); if (!result && !strcmp(name, "TMPDIR")) { /* on Windows it is TMP and TEMP */ result = getenv("TMP"); if (!result) result = getenv("TEMP"); } return result; } #undef rename int mingw_rename(const char *pold, const char *pnew) { DWORD attrs; /* * Try native rename() first to get errno right. * It is based on MoveFile(), which cannot overwrite existing files. */ if (!rename(pold, pnew)) return 0; if (errno != EEXIST) return -1; if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) return 0; /* TODO: translate more errors */ if (GetLastError() == ERROR_ACCESS_DENIED && (attrs = GetFileAttributes(pnew)) != INVALID_FILE_ATTRIBUTES) { if (attrs & FILE_ATTRIBUTE_DIRECTORY) { errno = EISDIR; return -1; } if ((attrs & FILE_ATTRIBUTE_READONLY) && SetFileAttributes(pnew, attrs & ~FILE_ATTRIBUTE_READONLY)) { if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) return 0; /* revert file attributes on failure */ SetFileAttributes(pnew, attrs); } } errno = EACCES; return -1; } /******************************************************************************/ __attribute__((constructor)) static void wsa_init(void) { static WSADATA wsaData; static int wsa_init_ = 0; if (wsa_init_) return; wsa_init_ = 1; if (WSAStartup(MAKEWORD(WSA_MAJOR, WSA_MINOR), &wsaData)) { fprintf(stderr, "unable to initialize winsock: error %d", WSAGetLastError()); exit(EXIT_FAILURE); } atexit((void(*)(void)) WSACleanup); } int socketpair(int family, int type, int protocol, SOCKET *sv) { struct sockaddr_in addr; SOCKET sfd; int err, len = sizeof(addr); if (sv == NULL || family != AF_INET || type != SOCK_STREAM || protocol) { WSASetLastError(WSAEINVAL); return SOCKET_ERROR; } sv[0] = sv[1] = INVALID_SOCKET; if ((sfd = socket(family, type, 0)) == INVALID_SOCKET) return SOCKET_ERROR; memset(&addr, 0, sizeof(addr)); addr.sin_family = family; addr.sin_addr.s_addr = inet_addr("127.0.0.1"); addr.sin_port = 0; /* any port */ if ((err = bind(sfd, (const struct sockaddr*)&addr, sizeof(addr))) == SOCKET_ERROR) { err = WSAGetLastError(); closesocket(sfd); WSASetLastError(err); return SOCKET_ERROR; } if ((err = getsockname(sfd, (struct sockaddr*)&addr, &len)) == SOCKET_ERROR) { err = WSAGetLastError(); closesocket(sfd); WSASetLastError(err); return SOCKET_ERROR; } do { if (listen(sfd, 1) == SOCKET_ERROR) break; if ((sv[0] = WSASocket(family, type, 0, NULL, 0, 0)) == INVALID_SOCKET) break; if (connect(sv[0], (const struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) break; if ((sv[1] = accept(sfd, NULL, NULL)) == INVALID_SOCKET) break; closesocket(sfd); return 0; } while (0); /* error */ err = WSAGetLastError(); closesocket(sfd); closesocket(sv[0]); closesocket(sv[1]); WSASetLastError(err); return SOCKET_ERROR; } /******************************************************************************/ int nanosleep(const struct timespec *req, struct timespec *rem) { if (unlikely(req->tv_nsec < 0 || req->tv_nsec < 0L || req->tv_nsec > 999999999L)) { errno = EINVAL; return -1; } Sleep(req->tv_sec * 1000 + req->tv_nsec / 1000000L); if (unlikely(rem)) { rem->tv_sec = 0; rem->tv_nsec = 0L; } return 0; } BOOL GetOsInfo(LPSTR OsName, LPSTR Release, LPSTR Version); BOOL GetMachInfo(LPSTR MachineName, LPSTR ProcessorName); int uname(struct utsname *name) { char processor[1024]; if (name == NULL) { errno = EINVAL; return -1; } if (gethostname(name->nodename, sizeof(name->nodename)) < 0) { name->nodename[0] = '\0'; errno = ENOSYS; return -1; } if (!GetOsInfo(name->sysname, name->release, name->version)) { strncpy (name->sysname, "win32", sizeof (name->sysname)); strncpy (name->release, "unknown", sizeof (name->release)); strncpy (name->version, "unknown", sizeof (name->version)); } /* "windows32" is as yet the only universal windows description allowed by config.guess and config.sub */ strncpy(name->sysname, "windows32", sizeof (name->sysname)); if (!GetMachInfo(name->machine, processor)) strncpy(name->machine, "i386", sizeof (name->machine)); return 0; } int getrusage(int who, struct rusage *usage) { FILETIME ct, et, kt, ut; ULARGE_INTEGER uli; if (who != RUSAGE_SELF) { errno = EINVAL; return -1; } if (!usage) { errno = EFAULT; return -1; } if (!GetProcessTimes(GetCurrentProcess(), &ct, &et, &kt, &ut)) { errno = ENOENT; return -1; } // FILETIMEs use 100-ns units memcpy(&uli, &kt, sizeof(FILETIME)); usage->ru_stime.tv_sec = uli.QuadPart / 10000000L; usage->ru_stime.tv_usec = uli.QuadPart % 10000000L; memcpy(&uli, &ut, sizeof(FILETIME)); usage->ru_utime.tv_sec = uli.QuadPart / 10000000L; usage->ru_utime.tv_usec = uli.QuadPart % 10000000L; return 0; } fldigi-4.2.05/src/compat/mingw.h0000664000175000017500000000574414611711171013341 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef MINGW_H_ #define MINGW_H_ #include "config.h" #include #include #undef _WINSOCKAPI_ #include #undef EADDRINUSE #define EADDRINUSE WSAEADDRINUSE #undef EISCONN #define EISCONN WSAEISCONN #undef EWOULDBLOCK #define EWOULDBLOCK WSAEWOULDBLOCK #undef EINPROGRESS #define EINPROGRESS WSAEINPROGRESS #undef EALREADY #define EALREADY WSAEALREADY //====================================================================== #ifdef __cplusplus extern "C" { #endif typedef long suseconds_t; #define hstrerror strerror #ifndef SIGUSR2 # define SIGUSR2 100 #endif extern void was_init(void); extern int was_init_state(void); extern WSADATA * was_data(void); /* * simple adaptors */ static inline int mingw_mkdir(const char *path, int mode) { return mkdir(path); } #define mkdir mingw_mkdir static inline int mingw_unlink(const char *pathname) { /* read-only files cannot be removed */ chmod(pathname, 0666); return unlink(pathname); } #define unlink mingw_unlink /* * implementations of missing functions */ unsigned int sleep (unsigned int seconds); char *mingw_getcwd(char *pointer, int len); #define getcwd mingw_getcwd char *mingw_getenv(const char *name); #define getenv mingw_getenv int mingw_rename(const char*, const char*); #define rename mingw_rename #ifndef SHUT_WR # define SHUT_WR SD_SEND #endif #ifndef SHUT_RD # define SHUT_RD SD_RECEIVE #endif #ifndef SHUT_RDWR # define SHUT_RDWR SD_BOTH #endif int nanosleep (const struct timespec *req, struct timespec *rem); int socketpair(int family, int type, int protocol, SOCKET *sv); /* uname */ #define UTSNAME_MAX_ 257 struct utsname { char sysname[UTSNAME_MAX_]; char nodename[UTSNAME_MAX_]; char release[UTSNAME_MAX_]; char version[UTSNAME_MAX_]; char machine[UTSNAME_MAX_]; }; int uname(struct utsname *name); /* getrusage */ #define RUSAGE_SELF 0 #define RUSAGE_CHILDREN (-1) struct rusage { struct timeval ru_utime; struct timeval ru_stime; }; int getrusage(int who, struct rusage *usage); /* fsync, fdatasync */ #include #define fsync _commit #define fdatasync fsync #ifdef __cplusplus } #endif #endif fldigi-4.2.05/src/compat/getsysinfo.c0000664000175000017500000002630314532252172014402 00000000000000/* Adapted from libgw32c-0.4 */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #define BUFSIZE 80 #define VIDSIZE 13 static const char * vid_cyrix = "CyrixInstead"; static const char * vid_centaur = "CentaurHauls"; static const char * vid_rise = "RiseRiseRise"; static const char * vid_intel = "GenuineIntel"; static const char * vid_amd = "AuthenticAMD"; static const char * vid_tmx86 = "GenuineTMx86"; static const char * vid_geode = "Geode by NSC"; static const char * vid_umc = "UMC UMC UMC "; static const char * vid_amd2 = "AMD ISBETTER"; static const char * vid_amd3 = "DEI "; static const char * vid_amd4 = "NexGenerationAMD"; static const char * vid_nexgen = "NexGenDriven"; #define cpuid(op,a,b,c,d)\ __asm__("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (op)); static void GetVendorID (char *vid) { unsigned long MaxEax, ebx, ecx, edx, zerobyte; cpuid (0, MaxEax, ebx, ecx, edx); memcpy (vid, &ebx, 4); memcpy (vid+4, &edx, 4); memcpy (vid+8, &ecx, 4); zerobyte = 0; memcpy (vid+12, &zerobyte, 1); } BOOL GetMachInfo(LPSTR MachineName, LPSTR ProcessorName) { SYSTEM_INFO sysinf; int family; char VendorId [VIDSIZE+2]; ZeroMemory(&sysinf, sizeof(SYSTEM_INFO)); GetSystemInfo(&sysinf); family = sysinf.wProcessorLevel; switch (sysinf.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_UNKNOWN: strcpy(MachineName, "unknown"); break; case PROCESSOR_ARCHITECTURE_INTEL: strcpy(MachineName, "ix86"); break; case PROCESSOR_ARCHITECTURE_MIPS: strcpy(MachineName, "mips"); break; case PROCESSOR_ARCHITECTURE_ALPHA: strcpy(MachineName, "alpha"); break; case PROCESSOR_ARCHITECTURE_PPC: strcpy(MachineName, "ppc"); break; case PROCESSOR_ARCHITECTURE_IA64: strcpy(MachineName, "IA64"); break; case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64: strcpy(MachineName, "IA32 on Win64"); break; case PROCESSOR_ARCHITECTURE_AMD64: strcpy(MachineName, "amd64"); break; case PROCESSOR_ARCHITECTURE_SHX: strcpy(MachineName, "sh"); break; case PROCESSOR_ARCHITECTURE_ARM: strcpy(MachineName, "arm"); break; case PROCESSOR_ARCHITECTURE_ALPHA64: strcpy(MachineName, "alpha64"); break; case PROCESSOR_ARCHITECTURE_MSIL: strcpy(MachineName, "msil"); break; default: strcpy(MachineName, "unknown"); break; } if (sysinf.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) switch(family) { case 3: strcpy(MachineName, "i386"); break; case 4: strcpy(MachineName, "i486"); break; case 5: strcpy(MachineName, "i586"); break; case 6: strcpy(MachineName, "i686"); break; case 7: strcpy(MachineName, "i786"); break; case 15: strcpy(MachineName, "i786"); break; default: strcpy(MachineName, "ix86"); } GetVendorID(VendorId); if (!strcmp(VendorId, vid_cyrix)) strcpy(ProcessorName, "Cyrix"); else if (!strcmp(VendorId, vid_centaur)) strcpy(ProcessorName, "Centaur"); else if (!strcmp(VendorId, vid_rise)) strcpy(ProcessorName, "Rise"); else if (!strcmp(VendorId, vid_intel)) strcpy(ProcessorName, "Intel"); else if (!strcmp(VendorId, vid_amd)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_tmx86)) strcpy(ProcessorName, "Transmeta"); else if (!strcmp(VendorId, vid_geode)) strcpy(ProcessorName, "Geode"); else if (!strcmp(VendorId, vid_umc)) strcpy(ProcessorName, "UMC"); else if (!strcmp(VendorId, vid_amd2)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_amd3)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_amd4)) strcpy(ProcessorName, "AMD"); else if (!strcmp(VendorId, vid_nexgen)) strcpy(ProcessorName, "NexGen"); else strcpy(ProcessorName, "Unknown"); return TRUE; } /* Platform SDK: Windows System Information Adapted from: http://msdn.microsoft.com/library/en-us/sysinfo/base/getting_the_system_version.asp http://www.codeproject.com/system/winvertable.asp Getting the System Version The following example uses the GetVersionEx function to display the version of the currently running operating system. Relying on version information is not the best way to test for a feature. Instead, refer to the documentation for the feature of interest. For more information on common techniques for feature detection, see Operating System Version. If you must require a particular operating system, be sure to use it as a minimum supported version, rather than design the test for the one operating system. This way, your detection code will continue to work on future versions of Windows. */ #undef BUFSIZE #define BUFSIZE 255 BOOL GetOsInfo(LPSTR OsName, LPSTR Release, LPSTR Version) { OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; DWORD BuildNumber; // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((LPOSVERSIONINFO) &osvi)) ) { // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (! GetVersionEx ( (LPOSVERSIONINFO) &osvi) ) return FALSE; } BuildNumber = osvi.dwBuildNumber & 0xFFFF; switch (osvi.dwPlatformId) { // Tests for Windows NT product family. case VER_PLATFORM_WIN32_NT: // Test for the product. if ( osvi.dwMajorVersion == 3 && osvi.dwMinorVersion == 51 ) strcpy(OsName, "Microsoft Windows NT 3.51"); else if ( osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0 ) strcpy(OsName, "Microsoft Windows NT 4.0"); else if ( osvi.dwMajorVersion <= 4 && osvi.dwMinorVersion == 0 ) strcpy(OsName, "Microsoft Windows NT"); else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) strcpy(OsName, "Microsoft Windows Server 2003 family, "); else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) strcpy(OsName, "Microsoft Windows XP"); else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) strcpy(OsName, "Microsoft Windows 2000"); if( bOsVersionInfoEx ) { // Use information from GetVersionEx. // Test for the workstation type. if ( osvi.wProductType == VER_NT_WORKSTATION ) { if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) strcat(OsName, " Home Edition" ); else strcat(OsName, " Professional" ); } // Test for the server type. else if ( osvi.wProductType == VER_NT_SERVER) { if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) strcat(OsName, " Datacenter Edition" ); else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) if( osvi.dwMajorVersion == 4 ) strcat(OsName, " Advanced Server" ); else strcat(OsName, " Enterprise Edition" ); else if ( osvi.wSuiteMask == VER_SUITE_BLADE ) strcat(OsName, " Web Edition" ); else strcat(OsName, " Standard Edition" ); } else if( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) { if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) strcat(OsName, " Datacenter Server" ); else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) strcat(OsName, " Advanced Server" ); else strcat(OsName, " Server" ); } else // Windows NT 4.0 { if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) strcat(OsName, "Server 4.0, Enterprise Edition "); else strcat(OsName, "Server 4.0 " ); } } else { // Use the registry on early versions of Windows NT. HKEY hKey; char szProductType[BUFSIZE]; DWORD dwBufLen=BUFSIZE; LONG lRet; lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey ); if( lRet != ERROR_SUCCESS ) return FALSE; lRet = RegQueryValueEx( hKey, "ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen); if( (lRet != ERROR_SUCCESS) || (dwBufLen > BUFSIZE) ) return FALSE; RegCloseKey( hKey ); if ( lstrcmpi( "WINNT", szProductType) == 0 ) strcat(OsName, " Professional" ); if ( lstrcmpi( "LANMANNT", szProductType) == 0 ) strcat(OsName, " Server" ); if ( lstrcmpi( "SERVERNT", szProductType) == 0 ) strcat(OsName, " Advanced Server" ); } // Display version, service pack (if any), and build number. strcat (OsName, " "); strcat (OsName, osvi.szCSDVersion); break; // Test for the Windows 95 product family. case VER_PLATFORM_WIN32_WINDOWS: if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { strcpy(OsName, "Microsoft Windows 95"); if (BuildNumber > 950 && BuildNumber <= 1080) strcat(OsName, " SP1"); else if (BuildNumber > 1080) strcat(OsName, " OSR2"); /* if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' ) strcat(OsName, "OSR2 " ); */ } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) { strcpy(OsName, "Microsoft Windows 98"); if (BuildNumber > 1998 && BuildNumber < 2183) strcat(OsName, " SP1"); else if (BuildNumber >= 2183) strcat(OsName, " SE"); /* if ( osvi.szCSDVersion[1] == 'A' ) strcat(OsName, "SE " ); */ } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) { strcpy(OsName, "Microsoft Windows Millennium Edition "); } break; } sprintf(Release, "%lu.%lu.%lu", osvi.dwPlatformId, osvi.dwMajorVersion, osvi.dwMinorVersion); sprintf(Version, "%lu", osvi.dwBuildNumber & 0xFFFF); return TRUE; } fldigi-4.2.05/src/compat/regex.c0000664000175000017500000042753014611711171013326 00000000000000/* Extended regular expression matching and search library, version 0.12. (Implements POSIX draft P10003.2/D11.2, except for internationalization features.) Copyright (C) 1993 Free Software Foundation, Inc. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- /* AIX requires this to be the first thing in the file. */ #if defined (_AIX) && !defined (REGEX_MALLOC) #pragma alloca #endif #define _GNU_SOURCE /* We need this for `regex.h', and perhaps for the Emacs include files. */ #include /* We used to test for `BSTRING' here, but only GCC and Emacs define `BSTRING', as far as I know, and neither of them use this code. */ #include #ifndef bcmp #define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) #endif #ifndef bcopy #define bcopy(s, d, n) memcpy ((d), (s), (n)) #endif #ifndef bzero #define bzero(s, n) memset ((s), 0, (n)) #endif #include /* Define the syntax stuff for \<, \>, etc. */ /* This must be nonzero for the wordchar and notwordchar pattern commands in re_match_2. */ #ifndef Sword #define Sword 1 #endif #ifdef SYNTAX_TABLE extern char *re_syntax_table; #else /* not SYNTAX_TABLE */ /* How many characters in the character set. */ #define CHAR_SET_SIZE 256 static char re_syntax_table[CHAR_SET_SIZE]; static void init_syntax_once () { register int c; static int done = 0; if (done) return; bzero (re_syntax_table, sizeof re_syntax_table); for (c = 'a'; c <= 'z'; c++) re_syntax_table[c] = Sword; for (c = 'A'; c <= 'Z'; c++) re_syntax_table[c] = Sword; for (c = '0'; c <= '9'; c++) re_syntax_table[c] = Sword; re_syntax_table['_'] = Sword; done = 1; } #endif /* not SYNTAX_TABLE */ #define SYNTAX(c) re_syntax_table[c] /* Get the interface, including the syntax bits. */ #include "regex.h" /* isalpha etc. are used for the character classes. */ #include #ifndef isascii #define isascii(c) 1 #endif #ifdef isblank #define ISBLANK(c) (isascii (c) && isblank (c)) #else #define ISBLANK(c) ((c) == ' ' || (c) == '\t') #endif #ifdef isgraph #define ISGRAPH(c) (isascii (c) && isgraph (c)) #else #define ISGRAPH(c) (isascii (c) && isprint (c) && !isspace (c)) #endif #define ISPRINT(c) (isascii (c) && isprint (c)) #define ISDIGIT(c) (isascii (c) && isdigit (c)) #define ISALNUM(c) (isascii (c) && isalnum (c)) #define ISALPHA(c) (isascii (c) && isalpha (c)) #define ISCNTRL(c) (isascii (c) && iscntrl (c)) #define ISLOWER(c) (isascii (c) && islower (c)) #define ISPUNCT(c) (isascii (c) && ispunct (c)) #define ISSPACE(c) (isascii (c) && isspace (c)) #define ISUPPER(c) (isascii (c) && isupper (c)) #define ISXDIGIT(c) (isascii (c) && isxdigit (c)) #ifndef NULL #define NULL 0 #endif /* We remove any previous definition of `SIGN_EXTEND_CHAR', since ours (we hope) works properly with all combinations of machines, compilers, `char' and `unsigned char' argument types. (Per Bothner suggested the basic approach.) */ #undef SIGN_EXTEND_CHAR #if __STDC__ #define SIGN_EXTEND_CHAR(c) ((signed char) (c)) #else /* not __STDC__ */ /* As in Harbison and Steele. */ #define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) #endif /* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we use `alloca' instead of `malloc'. This is because using malloc in re_search* or re_match* could cause memory leaks when C-g is used in Emacs; also, malloc is slower and causes storage fragmentation. On the other hand, malloc is more portable, and easier to debug. Because we sometimes use alloca, some routines have to be macros, not functions -- `alloca'-allocated space disappears at the end of the function it is called in. */ #ifdef REGEX_MALLOC #define REGEX_ALLOCATE malloc #define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) #else /* not REGEX_MALLOC */ /* Emacs already defines alloca, sometimes. */ #ifndef alloca /* Make alloca work the best possible way. */ #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not __GNUC__ */ #if HAVE_ALLOCA_H #include #else /* not __GNUC__ or HAVE_ALLOCA_H */ #ifndef _AIX /* Already did AIX, up at the top. */ char *alloca (); #endif /* not _AIX */ #endif /* not HAVE_ALLOCA_H */ #endif /* not __GNUC__ */ #endif /* not alloca */ #define REGEX_ALLOCATE alloca /* Assumes a `char *destination' variable. */ #define REGEX_REALLOCATE(source, osize, nsize) \ (destination = (char *) alloca (nsize), \ bcopy (source, destination, osize), \ destination) #endif /* not REGEX_MALLOC */ /* True if `size1' is non-NULL and PTR is pointing anywhere inside `string1' or just past its end. This works if PTR is NULL, which is a good thing. */ #define FIRST_STRING_P(ptr) \ (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) /* (Re)Allocate N items of type T using malloc, or fail. */ #define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) #define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) #define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) #define BYTEWIDTH 8 /* In bits. */ #define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) typedef char boolean; #define false 0 #define true 1 /* These are the command codes that appear in compiled regular expressions. Some opcodes are followed by argument bytes. A command code can specify any interpretation whatsoever for its arguments. Zero bytes may appear in the compiled regular expression. The value of `exactn' is needed in search.c (search_buffer) in Emacs. So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of `exactn' we use here must also be 1. */ typedef enum { no_op = 0, /* Followed by one byte giving n, then by n literal bytes. */ exactn = 1, /* Matches any (more or less) character. */ anychar, /* Matches any one char belonging to specified set. First following byte is number of bitmap bytes. Then come bytes for a bitmap saying which chars are in. Bits in each byte are ordered low-bit-first. A character is in the set if its bit is 1. A character too large to have a bit in the map is automatically not in the set. */ charset, /* Same parameters as charset, but match any character that is not one of those specified. */ charset_not, /* Start remembering the text that is matched, for storing in a register. Followed by one byte with the register number, in the range 0 to one less than the pattern buffer's re_nsub field. Then followed by one byte with the number of groups inner to this one. (This last has to be part of the start_memory only because we need it in the on_failure_jump of re_match_2.) */ start_memory, /* Stop remembering the text that is matched and store it in a memory register. Followed by one byte with the register number, in the range 0 to one less than `re_nsub' in the pattern buffer, and one byte with the number of inner groups, just like `start_memory'. (We need the number of inner groups here because we don't have any easy way of finding the corresponding start_memory when we're at a stop_memory.) */ stop_memory, /* Match a duplicate of something remembered. Followed by one byte containing the register number. */ duplicate, /* Fail unless at beginning of line. */ begline, /* Fail unless at end of line. */ endline, /* Succeeds if at beginning of buffer (if emacs) or at beginning of string to be matched (if not). */ begbuf, /* Analogously, for end of buffer/string. */ endbuf, /* Followed by two byte relative address to which to jump. */ jump, /* Same as jump, but marks the end of an alternative. */ jump_past_alt, /* Followed by two-byte relative address of place to resume at in case of failure. */ on_failure_jump, /* Like on_failure_jump, but pushes a placeholder instead of the current string position when executed. */ on_failure_keep_string_jump, /* Throw away latest failure point and then jump to following two-byte relative address. */ pop_failure_jump, /* Change to pop_failure_jump if know won't have to backtrack to match; otherwise change to jump. This is used to jump back to the beginning of a repeat. If what follows this jump clearly won't match what the repeat does, such that we can be sure that there is no use backtracking out of repetitions already matched, then we change it to a pop_failure_jump. Followed by two-byte address. */ maybe_pop_jump, /* Jump to following two-byte address, and push a dummy failure point. This failure point will be thrown away if an attempt is made to use it for a failure. A `+' construct makes this before the first repeat. Also used as an intermediary kind of jump when compiling an alternative. */ dummy_failure_jump, /* Push a dummy failure point and continue. Used at the end of alternatives. */ push_dummy_failure, /* Followed by two-byte relative address and two-byte number n. After matching N times, jump to the address upon failure. */ succeed_n, /* Followed by two-byte relative address, and two-byte number n. Jump to the address N times, then fail. */ jump_n, /* Set the following two-byte relative address to the subsequent two-byte number. The address *includes* the two bytes of number. */ set_number_at, wordchar, /* Matches any word-constituent character. */ notwordchar, /* Matches any char that is not a word-constituent. */ wordbeg, /* Succeeds if at word beginning. */ wordend, /* Succeeds if at word end. */ wordbound, /* Succeeds if at a word boundary. */ notwordbound /* Succeeds if not at a word boundary. */ #ifdef emacs ,before_dot, /* Succeeds if before point. */ at_dot, /* Succeeds if at point. */ after_dot, /* Succeeds if after point. */ /* Matches any character whose syntax is specified. Followed by a byte which contains a syntax code, e.g., Sword. */ syntaxspec, /* Matches any character whose syntax is not that specified. */ notsyntaxspec #endif /* emacs */ } re_opcode_t; /* Common operations on the compiled pattern. */ /* Store NUMBER in two contiguous bytes starting at DESTINATION. */ #define STORE_NUMBER(destination, number) \ do { \ (destination)[0] = (number) & 0377; \ (destination)[1] = (number) >> 8; \ } while (0) /* Same as STORE_NUMBER, except increment DESTINATION to the byte after where the number is stored. Therefore, DESTINATION must be an lvalue. */ #define STORE_NUMBER_AND_INCR(destination, number) \ do { \ STORE_NUMBER (destination, number); \ (destination) += 2; \ } while (0) /* Put into DESTINATION a number stored in two contiguous bytes starting at SOURCE. */ #define EXTRACT_NUMBER(destination, source) \ do { \ (destination) = *(source) & 0377; \ (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ } while (0) #ifdef DEBUG static void extract_number (dest, source) int *dest; unsigned char *source; { int temp = SIGN_EXTEND_CHAR (*(source + 1)); *dest = *source & 0377; *dest += temp << 8; } #ifndef EXTRACT_MACROS /* To debug the macros. */ #undef EXTRACT_NUMBER #define EXTRACT_NUMBER(dest, src) extract_number (&dest, src) #endif /* not EXTRACT_MACROS */ #endif /* DEBUG */ /* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. SOURCE must be an lvalue. */ #define EXTRACT_NUMBER_AND_INCR(destination, source) \ do { \ EXTRACT_NUMBER (destination, source); \ (source) += 2; \ } while (0) #ifdef DEBUG static void extract_number_and_incr (destination, source) int *destination; unsigned char **source; { extract_number (destination, *source); *source += 2; } #ifndef EXTRACT_MACROS #undef EXTRACT_NUMBER_AND_INCR #define EXTRACT_NUMBER_AND_INCR(dest, src) \ extract_number_and_incr (&dest, &src) #endif /* not EXTRACT_MACROS */ #endif /* DEBUG */ /* If DEBUG is defined, Regex prints many voluminous messages about what it is doing (if the variable `debug' is nonzero). If linked with the main program in `iregex.c', you can enter patterns and strings interactively. And if linked with the main program in `main.c' and the other test files, you can run the already-written tests. */ #ifdef DEBUG /* We use standard I/O for debugging. */ #include /* It is useful to test things that ``must'' be true when debugging. */ #include static int debug = 0; #define DEBUG_STATEMENT(e) e #define DEBUG_PRINT1(x) if (debug) printf (x) #define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) #define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) #define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ if (debug) print_partial_compiled_pattern (s, e) #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ if (debug) print_double_string (w, s1, sz1, s2, sz2) extern void printchar (); /* Print the fastmap in human-readable form. */ void print_fastmap (fastmap) char *fastmap; { unsigned was_a_range = 0; unsigned i = 0; while (i < (1 << BYTEWIDTH)) { if (fastmap[i++]) { was_a_range = 0; printchar (i - 1); while (i < (1 << BYTEWIDTH) && fastmap[i]) { was_a_range = 1; i++; } if (was_a_range) { printf ("-"); printchar (i - 1); } } } putchar ('\n'); } /* Print a compiled pattern string in human-readable form, starting at the START pointer into it and ending just before the pointer END. */ void print_partial_compiled_pattern (start, end) unsigned char *start; unsigned char *end; { int mcnt, mcnt2; unsigned char *p = start; unsigned char *pend = end; if (start == NULL) { printf ("(null)\n"); return; } /* Loop over pattern commands. */ while (p < pend) { switch ((re_opcode_t) *p++) { case no_op: printf ("/no_op"); break; case exactn: mcnt = *p++; printf ("/exactn/%d", mcnt); do { putchar ('/'); printchar (*p++); } while (--mcnt); break; case start_memory: mcnt = *p++; printf ("/start_memory/%d/%d", mcnt, *p++); break; case stop_memory: mcnt = *p++; printf ("/stop_memory/%d/%d", mcnt, *p++); break; case duplicate: printf ("/duplicate/%d", *p++); break; case anychar: printf ("/anychar"); break; case charset: case charset_not: { register int c; printf ("/charset%s", (re_opcode_t) *(p - 1) == charset_not ? "_not" : ""); assert (p + *p < pend); for (c = 0; c < *p; c++) { unsigned bit; unsigned char map_byte = p[1 + c]; putchar ('/'); for (bit = 0; bit < BYTEWIDTH; bit++) if (map_byte & (1 << bit)) printchar (c * BYTEWIDTH + bit); } p += 1 + *p; break; } case begline: printf ("/begline"); break; case endline: printf ("/endline"); break; case on_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/on_failure_jump/0/%d", mcnt); break; case on_failure_keep_string_jump: extract_number_and_incr (&mcnt, &p); printf ("/on_failure_keep_string_jump/0/%d", mcnt); break; case dummy_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/dummy_failure_jump/0/%d", mcnt); break; case push_dummy_failure: printf ("/push_dummy_failure"); break; case maybe_pop_jump: extract_number_and_incr (&mcnt, &p); printf ("/maybe_pop_jump/0/%d", mcnt); break; case pop_failure_jump: extract_number_and_incr (&mcnt, &p); printf ("/pop_failure_jump/0/%d", mcnt); break; case jump_past_alt: extract_number_and_incr (&mcnt, &p); printf ("/jump_past_alt/0/%d", mcnt); break; case jump: extract_number_and_incr (&mcnt, &p); printf ("/jump/0/%d", mcnt); break; case succeed_n: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/succeed_n/0/%d/0/%d", mcnt, mcnt2); break; case jump_n: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/jump_n/0/%d/0/%d", mcnt, mcnt2); break; case set_number_at: extract_number_and_incr (&mcnt, &p); extract_number_and_incr (&mcnt2, &p); printf ("/set_number_at/0/%d/0/%d", mcnt, mcnt2); break; case wordbound: printf ("/wordbound"); break; case notwordbound: printf ("/notwordbound"); break; case wordbeg: printf ("/wordbeg"); break; case wordend: printf ("/wordend"); #ifdef emacs case before_dot: printf ("/before_dot"); break; case at_dot: printf ("/at_dot"); break; case after_dot: printf ("/after_dot"); break; case syntaxspec: printf ("/syntaxspec"); mcnt = *p++; printf ("/%d", mcnt); break; case notsyntaxspec: printf ("/notsyntaxspec"); mcnt = *p++; printf ("/%d", mcnt); break; #endif /* emacs */ case wordchar: printf ("/wordchar"); break; case notwordchar: printf ("/notwordchar"); break; case begbuf: printf ("/begbuf"); break; case endbuf: printf ("/endbuf"); break; default: printf ("?%d", *(p-1)); } } printf ("/\n"); } void print_compiled_pattern (bufp) struct re_pattern_buffer *bufp; { unsigned char *buffer = bufp->buffer; print_partial_compiled_pattern (buffer, buffer + bufp->used); printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated); if (bufp->fastmap_accurate && bufp->fastmap) { printf ("fastmap: "); print_fastmap (bufp->fastmap); } printf ("re_nsub: %d\t", bufp->re_nsub); printf ("regs_alloc: %d\t", bufp->regs_allocated); printf ("can_be_null: %d\t", bufp->can_be_null); printf ("newline_anchor: %d\n", bufp->newline_anchor); printf ("no_sub: %d\t", bufp->no_sub); printf ("not_bol: %d\t", bufp->not_bol); printf ("not_eol: %d\t", bufp->not_eol); printf ("syntax: %d\n", bufp->syntax); /* Perhaps we should print the translate table? */ } void print_double_string (where, string1, size1, string2, size2) const char *where; const char *string1; const char *string2; int size1; int size2; { unsigned this_char; if (where == NULL) printf ("(null)"); else { if (FIRST_STRING_P (where)) { for (this_char = where - string1; this_char < size1; this_char++) printchar (string1[this_char]); where = string2; } for (this_char = where - string2; this_char < size2; this_char++) printchar (string2[this_char]); } } #else /* not DEBUG */ #undef assert #define assert(e) #define DEBUG_STATEMENT(e) #define DEBUG_PRINT1(x) #define DEBUG_PRINT2(x1, x2) #define DEBUG_PRINT3(x1, x2, x3) #define DEBUG_PRINT4(x1, x2, x3, x4) #define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) #define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) #endif /* not DEBUG */ /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can also be assigned to arbitrarily: each pattern buffer stores its own syntax, so it can be changed between regex compilations. */ reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS; /* Specify the precise syntax of regexps for compilation. This provides for compatibility for various utilities which historically have different, incompatible syntaxes. The argument SYNTAX is a bit mask comprised of the various bits defined in regex.h. We return the old syntax. */ reg_syntax_t re_set_syntax (syntax) reg_syntax_t syntax; { reg_syntax_t ret = re_syntax_options; re_syntax_options = syntax; return ret; } /* This table gives an error message for each of the error codes listed in regex.h. Obviously the order here has to be same as there. */ static const char *re_error_msg[] = { NULL, /* REG_NOERROR */ "No match", /* REG_NOMATCH */ "Invalid regular expression", /* REG_BADPAT */ "Invalid collation character", /* REG_ECOLLATE */ "Invalid character class name", /* REG_ECTYPE */ "Trailing backslash", /* REG_EESCAPE */ "Invalid back reference", /* REG_ESUBREG */ "Unmatched [ or [^", /* REG_EBRACK */ "Unmatched ( or \\(", /* REG_EPAREN */ "Unmatched \\{", /* REG_EBRACE */ "Invalid content of \\{\\}", /* REG_BADBR */ "Invalid range end", /* REG_ERANGE */ "Memory exhausted", /* REG_ESPACE */ "Invalid preceding regular expression", /* REG_BADRPT */ "Premature end of regular expression", /* REG_EEND */ "Regular expression too big", /* REG_ESIZE */ "Unmatched ) or \\)", /* REG_ERPAREN */ }; /* Subroutine declarations and macros for regex_compile. */ static void store_op1 (), store_op2 (); static void insert_op1 (), insert_op2 (); static boolean at_begline_loc_p (), at_endline_loc_p (); static boolean group_in_compile_stack (); static reg_errcode_t compile_range (); /* Fetch the next character in the uncompiled pattern---translating it if necessary. Also cast from a signed character in the constant string passed to us by the user to an unsigned char that we can use as an array index (in, e.g., `translate'). */ #define PATFETCH(c) \ do {if (p == pend) return REG_EEND; \ c = (unsigned char) *p++; \ if (translate) c = translate[c]; \ } while (0) /* Fetch the next character in the uncompiled pattern, with no translation. */ #define PATFETCH_RAW(c) \ do {if (p == pend) return REG_EEND; \ c = (unsigned char) *p++; \ } while (0) /* Go backwards one character in the pattern. */ #define PATUNFETCH p-- /* If `translate' is non-null, return translate[D], else just D. We cast the subscript to translate because some data is declared as `char *', to avoid warnings when a string constant is passed. But when we use a character as a subscript we must make it unsigned. */ #define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d)) /* Macros for outputting the compiled pattern into `buffer'. */ /* If the buffer isn't allocated when it comes in, use this. */ #define INIT_BUF_SIZE 32 /* Make sure we have at least N more bytes of space in buffer. */ #define GET_BUFFER_SPACE(n) \ while (b - bufp->buffer + (n) > bufp->allocated) \ EXTEND_BUFFER () /* Make sure we have one more byte of buffer space and then add C to it. */ #define BUF_PUSH(c) \ do { \ GET_BUFFER_SPACE (1); \ *b++ = (unsigned char) (c); \ } while (0) /* Ensure we have two more bytes of buffer space and then append C1 and C2. */ #define BUF_PUSH_2(c1, c2) \ do { \ GET_BUFFER_SPACE (2); \ *b++ = (unsigned char) (c1); \ *b++ = (unsigned char) (c2); \ } while (0) /* As with BUF_PUSH_2, except for three bytes. */ #define BUF_PUSH_3(c1, c2, c3) \ do { \ GET_BUFFER_SPACE (3); \ *b++ = (unsigned char) (c1); \ *b++ = (unsigned char) (c2); \ *b++ = (unsigned char) (c3); \ } while (0) /* Store a jump with opcode OP at LOC to location TO. We store a relative address offset by the three bytes the jump itself occupies. */ #define STORE_JUMP(op, loc, to) \ store_op1 (op, loc, (to) - (loc) - 3) /* Likewise, for a two-argument jump. */ #define STORE_JUMP2(op, loc, to, arg) \ store_op2 (op, loc, (to) - (loc) - 3, arg) /* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ #define INSERT_JUMP(op, loc, to) \ insert_op1 (op, loc, (to) - (loc) - 3, b) /* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ #define INSERT_JUMP2(op, loc, to, arg) \ insert_op2 (op, loc, (to) - (loc) - 3, arg, b) /* This is not an arbitrary limit: the arguments which represent offsets into the pattern are two bytes long. So if 2^16 bytes turns out to be too small, many things would have to change. */ #define MAX_BUF_SIZE (1L << 16) /* Extend the buffer by twice its current size via realloc and reset the pointers that pointed into the old block to point to the correct places in the new one. If extending the buffer results in it being larger than MAX_BUF_SIZE, then flag memory exhausted. */ #define EXTEND_BUFFER() \ do { \ unsigned char *old_buffer = bufp->buffer; \ if (bufp->allocated == MAX_BUF_SIZE) \ return REG_ESIZE; \ bufp->allocated <<= 1; \ if (bufp->allocated > MAX_BUF_SIZE) \ bufp->allocated = MAX_BUF_SIZE; \ bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\ if (bufp->buffer == NULL) \ return REG_ESPACE; \ /* If the buffer moved, move all the pointers into it. */ \ if (old_buffer != bufp->buffer) \ { \ b = (b - old_buffer) + bufp->buffer; \ begalt = (begalt - old_buffer) + bufp->buffer; \ if (fixup_alt_jump) \ fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\ if (laststart) \ laststart = (laststart - old_buffer) + bufp->buffer; \ if (pending_exact) \ pending_exact = (pending_exact - old_buffer) + bufp->buffer; \ } \ } while (0) /* Since we have one byte reserved for the register number argument to {start,stop}_memory, the maximum number of groups we can report things about is what fits in that byte. */ #define MAX_REGNUM 255 /* But patterns can have more than `MAX_REGNUM' registers. We just ignore the excess. */ typedef unsigned regnum_t; /* Macros for the compile stack. */ /* Since offsets can go either forwards or backwards, this type needs to be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ typedef int pattern_offset_t; typedef struct { pattern_offset_t begalt_offset; pattern_offset_t fixup_alt_jump; pattern_offset_t inner_group_offset; pattern_offset_t laststart_offset; regnum_t regnum; } compile_stack_elt_t; typedef struct { compile_stack_elt_t *stack; unsigned size; unsigned avail; /* Offset of next open position. */ } compile_stack_type; #define INIT_COMPILE_STACK_SIZE 32 #define COMPILE_STACK_EMPTY (compile_stack.avail == 0) #define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) /* The next available element. */ #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) /* Set the bit for character C in a list. */ #define SET_LIST_BIT(c) \ (b[((unsigned char) (c)) / BYTEWIDTH] \ |= 1 << (((unsigned char) c) % BYTEWIDTH)) /* Get the next unsigned number in the uncompiled pattern. */ #define GET_UNSIGNED_NUMBER(num) \ { if (p != pend) \ { \ PATFETCH (c); \ while (ISDIGIT (c)) \ { \ if (num < 0) \ num = 0; \ num = num * 10 + c - '0'; \ if (p == pend) \ break; \ PATFETCH (c); \ } \ } \ } #define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ #define IS_CHAR_CLASS(string) \ (STREQ (string, "alpha") || STREQ (string, "upper") \ || STREQ (string, "lower") || STREQ (string, "digit") \ || STREQ (string, "alnum") || STREQ (string, "xdigit") \ || STREQ (string, "space") || STREQ (string, "print") \ || STREQ (string, "punct") || STREQ (string, "graph") \ || STREQ (string, "cntrl") || STREQ (string, "blank")) /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. Returns one of error codes defined in `regex.h', or zero for success. Assumes the `allocated' (and perhaps `buffer') and `translate' fields are set in BUFP on entry. If it succeeds, results are put in BUFP (if it returns an error, the contents of BUFP are undefined): `buffer' is the compiled pattern; `syntax' is set to SYNTAX; `used' is set to the length of the compiled pattern; `fastmap_accurate' is zero; `re_nsub' is the number of subexpressions in PATTERN; `not_bol' and `not_eol' are zero; The `fastmap' and `newline_anchor' fields are neither examined nor set. */ static reg_errcode_t regex_compile (pattern, size, syntax, bufp) const char *pattern; int size; reg_syntax_t syntax; struct re_pattern_buffer *bufp; { /* We fetch characters from PATTERN here. Even though PATTERN is `char *' (i.e., signed), we declare these variables as unsigned, so they can be reliably used as array indices. */ register unsigned char c, c1; /* A random tempory spot in PATTERN. */ const char *p1; /* Points to the end of the buffer, where we should append. */ register unsigned char *b; /* Keeps track of unclosed groups. */ compile_stack_type compile_stack; /* Points to the current (ending) position in the pattern. */ const char *p = pattern; const char *pend = pattern + size; /* How to translate the characters in the pattern. */ char *translate = bufp->translate; /* Address of the count-byte of the most recently inserted `exactn' command. This makes it possible to tell if a new exact-match character can be added to that command or if the character requires a new `exactn' command. */ unsigned char *pending_exact = 0; /* Address of start of the most recently finished expression. This tells, e.g., postfix * where to find the start of its operand. Reset at the beginning of groups and alternatives. */ unsigned char *laststart = 0; /* Address of beginning of regexp, or inside of last group. */ unsigned char *begalt; /* Place in the uncompiled pattern (i.e., the {) to which to go back if the interval is invalid. */ const char *beg_interval; /* Address of the place where a forward jump should go to the end of the containing expression. Each alternative of an `or' -- except the last -- ends with a forward jump of this sort. */ unsigned char *fixup_alt_jump = 0; /* Counts open-groups as they are encountered. Remembered for the matching close-group on the compile stack, so the same register number is put in the stop_memory as the start_memory. */ regnum_t regnum = 0; #ifdef DEBUG DEBUG_PRINT1 ("\nCompiling pattern: "); if (debug) { unsigned debug_count; for (debug_count = 0; debug_count < size; debug_count++) printchar (pattern[debug_count]); putchar ('\n'); } #endif /* DEBUG */ /* Initialize the compile stack. */ compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); if (compile_stack.stack == NULL) return REG_ESPACE; compile_stack.size = INIT_COMPILE_STACK_SIZE; compile_stack.avail = 0; /* Initialize the pattern buffer. */ bufp->syntax = syntax; bufp->fastmap_accurate = 0; bufp->not_bol = bufp->not_eol = 0; /* Set `used' to zero, so that if we return an error, the pattern printer (for debugging) will think there's no pattern. We reset it at the end. */ bufp->used = 0; /* Always count groups, whether or not bufp->no_sub is set. */ bufp->re_nsub = 0; #if !defined (emacs) && !defined (SYNTAX_TABLE) /* Initialize the syntax table. */ init_syntax_once (); #endif if (bufp->allocated == 0) { if (bufp->buffer) { /* If zero allocated, but buffer is non-null, try to realloc enough space. This loses if buffer's address is bogus, but that is the user's responsibility. */ RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char); } else { /* Caller did not allocate a buffer. Do it for them. */ bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char); } if (!bufp->buffer) { free(compile_stack.stack); return REG_ESPACE; } bufp->allocated = INIT_BUF_SIZE; } begalt = b = bufp->buffer; /* Loop through the uncompiled pattern until we're at the end. */ while (p != pend) { PATFETCH (c); switch (c) { case '^': { if ( /* If at start of pattern, it's an operator. */ p == pattern + 1 /* If context independent, it's an operator. */ || syntax & RE_CONTEXT_INDEP_ANCHORS /* Otherwise, depends on what's come before. */ || at_begline_loc_p (pattern, p, syntax)) BUF_PUSH (begline); else goto normal_char; } break; case '$': { if ( /* If at end of pattern, it's an operator. */ p == pend /* If context independent, it's an operator. */ || syntax & RE_CONTEXT_INDEP_ANCHORS /* Otherwise, depends on what's next. */ || at_endline_loc_p (p, pend, syntax)) BUF_PUSH (endline); else goto normal_char; } break; case '+': case '?': if ((syntax & RE_BK_PLUS_QM) || (syntax & RE_LIMITED_OPS)) goto normal_char; handle_plus: case '*': /* If there is no previous pattern... */ if (!laststart) { if (syntax & RE_CONTEXT_INVALID_OPS) return REG_BADRPT; else if (!(syntax & RE_CONTEXT_INDEP_OPS)) goto normal_char; } { /* Are we optimizing this jump? */ boolean keep_string_p = false; /* 1 means zero (many) matches is allowed. */ char zero_times_ok = 0, many_times_ok = 0; /* If there is a sequence of repetition chars, collapse it down to just one (the right one). We can't combine interval operators with these because of, e.g., `a{2}*', which should only match an even number of `a's. */ for (;;) { zero_times_ok |= c != '+'; many_times_ok |= c != '?'; if (p == pend) break; PATFETCH (c); if (c == '*' || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) ; else if (syntax & RE_BK_PLUS_QM && c == '\\') { if (p == pend) return REG_EESCAPE; PATFETCH (c1); if (!(c1 == '+' || c1 == '?')) { PATUNFETCH; PATUNFETCH; break; } c = c1; } else { PATUNFETCH; break; } /* If we get here, we found another repeat character. */ } /* Star, etc. applied to an empty pattern is equivalent to an empty pattern. */ if (!laststart) break; /* Now we know whether or not zero matches is allowed and also whether or not two or more matches is allowed. */ if (many_times_ok) { /* More than one repetition is allowed, so put in at the end a backward relative jump from `b' to before the next jump we're going to put in below (which jumps from laststart to after this jump). But if we are at the `*' in the exact sequence `.*\n', insert an unconditional jump backwards to the ., instead of the beginning of the loop. This way we only push a failure point once, instead of every time through the loop. */ assert (p - 1 > pattern); /* Allocate the space for the jump. */ GET_BUFFER_SPACE (3); /* We know we are not at the first character of the pattern, because laststart was nonzero. And we've already incremented `p', by the way, to be the character after the `*'. Do we have to do something analogous here for null bytes, because of RE_DOT_NOT_NULL? */ if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') && zero_times_ok && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') && !(syntax & RE_DOT_NEWLINE)) { /* We have .*\n. */ STORE_JUMP (jump, b, laststart); keep_string_p = true; } else /* Anything else. */ STORE_JUMP (maybe_pop_jump, b, laststart - 3); /* We've added more stuff to the buffer. */ b += 3; } /* On failure, jump from laststart to b + 3, which will be the end of the buffer after this jump is inserted. */ GET_BUFFER_SPACE (3); INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump : on_failure_jump, laststart, b + 3); pending_exact = 0; b += 3; if (!zero_times_ok) { /* At least one repetition is required, so insert a `dummy_failure_jump' before the initial `on_failure_jump' instruction of the loop. This effects a skip over that instruction the first time we hit that loop. */ GET_BUFFER_SPACE (3); INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6); b += 3; } } break; case '.': laststart = b; BUF_PUSH (anychar); break; case '[': { boolean had_char_class = false; if (p == pend) return REG_EBRACK; /* Ensure that we have enough space to push a charset: the opcode, the length count, and the bitset; 34 bytes in all. */ GET_BUFFER_SPACE (34); laststart = b; /* We test `*p == '^' twice, instead of using an if statement, so we only need one BUF_PUSH. */ BUF_PUSH (*p == '^' ? charset_not : charset); if (*p == '^') p++; /* Remember the first position in the bracket expression. */ p1 = p; /* Push the number of bytes in the bitmap. */ BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); /* Clear the whole map. */ bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); /* charset_not matches newline according to a syntax bit. */ if ((re_opcode_t) b[-2] == charset_not && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) SET_LIST_BIT ('\n'); /* Read in characters and ranges, setting map bits. */ for (;;) { if (p == pend) return REG_EBRACK; PATFETCH (c); /* \ might escape characters inside [...] and [^...]. */ if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') { if (p == pend) return REG_EESCAPE; PATFETCH (c1); SET_LIST_BIT (c1); continue; } /* Could be the end of the bracket expression. If it's not (i.e., when the bracket expression is `[]' so far), the ']' character bit gets set way below. */ if (c == ']' && p != p1 + 1) break; /* Look ahead to see if it's a range when the last thing was a character class. */ if (had_char_class && c == '-' && *p != ']') return REG_ERANGE; /* Look ahead to see if it's a range when the last thing was a character: if this is a hyphen not at the beginning or the end of a list, then it's the range operator. */ if (c == '-' && !(p - 2 >= pattern && p[-2] == '[') && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') && *p != ']') { reg_errcode_t ret = compile_range (&p, pend, translate, syntax, b); if (ret != REG_NOERROR) return ret; } else if (p[0] == '-' && p[1] != ']') { /* This handles ranges made up of characters only. */ reg_errcode_t ret; /* Move past the `-'. */ PATFETCH (c1); ret = compile_range (&p, pend, translate, syntax, b); if (ret != REG_NOERROR) return ret; } /* See if we're at the beginning of a possible character class. */ else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') { /* Leave room for the null. */ char str[CHAR_CLASS_MAX_LENGTH + 1]; PATFETCH (c); c1 = 0; /* If pattern is `[[:'. */ if (p == pend) return REG_EBRACK; for (;;) { PATFETCH (c); if (c == ':' || c == ']' || p == pend || c1 == CHAR_CLASS_MAX_LENGTH) break; str[c1++] = c; } str[c1] = '\0'; /* If isn't a word bracketed by `[:' and:`]': undo the ending character, the letters, and leave the leading `:' and `[' (but set bits for them). */ if (c == ':' && *p == ']') { int ch; boolean is_alnum = STREQ (str, "alnum"); boolean is_alpha = STREQ (str, "alpha"); boolean is_blank = STREQ (str, "blank"); boolean is_cntrl = STREQ (str, "cntrl"); boolean is_digit = STREQ (str, "digit"); boolean is_graph = STREQ (str, "graph"); boolean is_lower = STREQ (str, "lower"); boolean is_print = STREQ (str, "print"); boolean is_punct = STREQ (str, "punct"); boolean is_space = STREQ (str, "space"); boolean is_upper = STREQ (str, "upper"); boolean is_xdigit = STREQ (str, "xdigit"); if (!IS_CHAR_CLASS (str)) return REG_ECTYPE; /* Throw away the ] at the end of the character class. */ PATFETCH (c); if (p == pend) return REG_EBRACK; for (ch = 0; ch < 1 << BYTEWIDTH; ch++) { if ( (is_alnum && ISALNUM (ch)) || (is_alpha && ISALPHA (ch)) || (is_blank && ISBLANK (ch)) || (is_cntrl && ISCNTRL (ch)) || (is_digit && ISDIGIT (ch)) || (is_graph && ISGRAPH (ch)) || (is_lower && ISLOWER (ch)) || (is_print && ISPRINT (ch)) || (is_punct && ISPUNCT (ch)) || (is_space && ISSPACE (ch)) || (is_upper && ISUPPER (ch)) || (is_xdigit && ISXDIGIT (ch))) SET_LIST_BIT (ch); } had_char_class = true; } else { c1++; while (c1--) PATUNFETCH; SET_LIST_BIT ('['); SET_LIST_BIT (':'); had_char_class = false; } } else { had_char_class = false; SET_LIST_BIT (c); } } /* Discard any (non)matching list bytes that are all 0 at the end of the map. Decrease the map-length byte too. */ while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) b[-1]--; b += b[-1]; } break; case '(': if (syntax & RE_NO_BK_PARENS) goto handle_open; else goto normal_char; case ')': if (syntax & RE_NO_BK_PARENS) goto handle_close; else goto normal_char; case '\n': if (syntax & RE_NEWLINE_ALT) goto handle_alt; else goto normal_char; case '|': if (syntax & RE_NO_BK_VBAR) goto handle_alt; else goto normal_char; case '{': if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) goto handle_interval; else goto normal_char; case '\\': if (p == pend) return REG_EESCAPE; /* Do not translate the character after the \, so that we can distinguish, e.g., \B from \b, even if we normally would translate, e.g., B to b. */ PATFETCH_RAW (c); switch (c) { case '(': if (syntax & RE_NO_BK_PARENS) goto normal_backslash; handle_open: bufp->re_nsub++; regnum++; if (COMPILE_STACK_FULL) { RETALLOC (compile_stack.stack, compile_stack.size << 1, compile_stack_elt_t); if (compile_stack.stack == NULL) return REG_ESPACE; compile_stack.size <<= 1; } /* These are the values to restore when we hit end of this group. They are all relative offsets, so that if the whole pattern moves because of realloc, they will still be valid. */ COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer; COMPILE_STACK_TOP.fixup_alt_jump = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0; COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer; COMPILE_STACK_TOP.regnum = regnum; /* We will eventually replace the 0 with the number of groups inner to this one. But do not push a start_memory for groups beyond the last one we can represent in the compiled pattern. */ if (regnum <= MAX_REGNUM) { COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2; BUF_PUSH_3 (start_memory, regnum, 0); } compile_stack.avail++; fixup_alt_jump = 0; laststart = 0; begalt = b; /* If we've reached MAX_REGNUM groups, then this open won't actually generate any code, so we'll have to clear pending_exact explicitly. */ pending_exact = 0; break; case ')': if (syntax & RE_NO_BK_PARENS) goto normal_backslash; if (COMPILE_STACK_EMPTY) { if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) goto normal_backslash; else return REG_ERPAREN; } handle_close: if (fixup_alt_jump) { /* Push a dummy failure point at the end of the alternative for a possible future `pop_failure_jump' to pop. See comments at `push_dummy_failure' in `re_match_2'. */ BUF_PUSH (push_dummy_failure); /* We allocated space for this jump when we assigned to `fixup_alt_jump', in the `handle_alt' case below. */ STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); } /* See similar code for backslashed left paren above. */ if (COMPILE_STACK_EMPTY) { if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) goto normal_char; else return REG_ERPAREN; } /* Since we just checked for an empty stack above, this ``can't happen''. */ assert (compile_stack.avail != 0); { /* We don't just want to restore into `regnum', because later groups should continue to be numbered higher, as in `(ab)c(de)' -- the second group is #2. */ regnum_t this_group_regnum; compile_stack.avail--; begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset; fixup_alt_jump = COMPILE_STACK_TOP.fixup_alt_jump ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 : 0; laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset; this_group_regnum = COMPILE_STACK_TOP.regnum; /* If we've reached MAX_REGNUM groups, then this open won't actually generate any code, so we'll have to clear pending_exact explicitly. */ pending_exact = 0; /* We're at the end of the group, so now we know how many groups were inside this one. */ if (this_group_regnum <= MAX_REGNUM) { unsigned char *inner_group_loc = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset; *inner_group_loc = regnum - this_group_regnum; BUF_PUSH_3 (stop_memory, this_group_regnum, regnum - this_group_regnum); } } break; case '|': /* `\|'. */ if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) goto normal_backslash; handle_alt: if (syntax & RE_LIMITED_OPS) goto normal_char; /* Insert before the previous alternative a jump which jumps to this alternative if the former fails. */ GET_BUFFER_SPACE (3); INSERT_JUMP (on_failure_jump, begalt, b + 6); pending_exact = 0; b += 3; /* The alternative before this one has a jump after it which gets executed if it gets matched. Adjust that jump so it will jump to this alternative's analogous jump (put in below, which in turn will jump to the next (if any) alternative's such jump, etc.). The last such jump jumps to the correct final destination. A picture: _____ _____ | | | | | v | v a | b | c If we are at `b', then fixup_alt_jump right now points to a three-byte space after `a'. We'll put in the jump, set fixup_alt_jump to right after `b', and leave behind three bytes which we'll fill in when we get to after `c'. */ if (fixup_alt_jump) STORE_JUMP (jump_past_alt, fixup_alt_jump, b); /* Mark and leave space for a jump after this alternative, to be filled in later either by next alternative or when know we're at the end of a series of alternatives. */ fixup_alt_jump = b; GET_BUFFER_SPACE (3); b += 3; laststart = 0; begalt = b; break; case '{': /* If \{ is a literal. */ if (!(syntax & RE_INTERVALS) /* If we're at `\{' and it's not the open-interval operator. */ || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) || (p - 2 == pattern && p == pend)) goto normal_backslash; handle_interval: { /* If got here, then the syntax allows intervals. */ /* At least (most) this many matches must be made. */ int lower_bound = -1, upper_bound = -1; beg_interval = p - 1; if (p == pend) { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else return REG_EBRACE; } GET_UNSIGNED_NUMBER (lower_bound); if (c == ',') { GET_UNSIGNED_NUMBER (upper_bound); if (upper_bound < 0) upper_bound = RE_DUP_MAX; } else /* Interval such as `{1}' => match exactly once. */ upper_bound = lower_bound; if (lower_bound < 0 || upper_bound > RE_DUP_MAX || lower_bound > upper_bound) { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else return REG_BADBR; } if (!(syntax & RE_NO_BK_BRACES)) { if (c != '\\') return REG_EBRACE; PATFETCH (c); } if (c != '}') { if (syntax & RE_NO_BK_BRACES) goto unfetch_interval; else return REG_BADBR; } /* We just parsed a valid interval. */ /* If it's invalid to have no preceding re. */ if (!laststart) { if (syntax & RE_CONTEXT_INVALID_OPS) return REG_BADRPT; else if (syntax & RE_CONTEXT_INDEP_OPS) laststart = b; else goto unfetch_interval; } /* If the upper bound is zero, don't want to succeed at all; jump from `laststart' to `b + 3', which will be the end of the buffer after we insert the jump. */ if (upper_bound == 0) { GET_BUFFER_SPACE (3); INSERT_JUMP (jump, laststart, b + 3); b += 3; } /* Otherwise, we have a nontrivial interval. When we're all done, the pattern will look like: set_number_at set_number_at succeed_n jump_n (The upper bound and `jump_n' are omitted if `upper_bound' is 1, though.) */ else { /* If the upper bound is > 1, we need to insert more at the end of the loop. */ unsigned nbytes = 10 + (upper_bound > 1) * 10; GET_BUFFER_SPACE (nbytes); /* Initialize lower bound of the `succeed_n', even though it will be set during matching by its attendant `set_number_at' (inserted next), because `re_compile_fastmap' needs to know. Jump to the `jump_n' we might insert below. */ INSERT_JUMP2 (succeed_n, laststart, b + 5 + (upper_bound > 1) * 5, lower_bound); b += 5; /* Code to initialize the lower bound. Insert before the `succeed_n'. The `5' is the last two bytes of this `set_number_at', plus 3 bytes of the following `succeed_n'. */ insert_op2 (set_number_at, laststart, 5, lower_bound, b); b += 5; if (upper_bound > 1) { /* More than one repetition is allowed, so append a backward jump to the `succeed_n' that starts this interval. When we've reached this during matching, we'll have matched the interval once, so jump back only `upper_bound - 1' times. */ STORE_JUMP2 (jump_n, b, laststart + 5, upper_bound - 1); b += 5; /* The location we want to set is the second parameter of the `jump_n'; that is `b-2' as an absolute address. `laststart' will be the `set_number_at' we're about to insert; `laststart+3' the number to set, the source for the relative address. But we are inserting into the middle of the pattern -- so everything is getting moved up by 5. Conclusion: (b - 2) - (laststart + 3) + 5, i.e., b - laststart. We insert this at the beginning of the loop so that if we fail during matching, we'll reinitialize the bounds. */ insert_op2 (set_number_at, laststart, b - laststart, upper_bound - 1, b); b += 5; } } pending_exact = 0; beg_interval = NULL; } break; unfetch_interval: /* If an invalid interval, match the characters as literals. */ assert (beg_interval); p = beg_interval; beg_interval = NULL; /* normal_char and normal_backslash need `c'. */ PATFETCH (c); if (!(syntax & RE_NO_BK_BRACES)) { if (p > pattern && p[-1] == '\\') goto normal_backslash; } goto normal_char; #ifdef emacs /* There is no way to specify the before_dot and after_dot operators. rms says this is ok. --karl */ case '=': BUF_PUSH (at_dot); break; case 's': laststart = b; PATFETCH (c); BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); break; case 'S': laststart = b; PATFETCH (c); BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); break; #endif /* emacs */ case 'w': laststart = b; BUF_PUSH (wordchar); break; case 'W': laststart = b; BUF_PUSH (notwordchar); break; case '<': BUF_PUSH (wordbeg); break; case '>': BUF_PUSH (wordend); break; case 'b': BUF_PUSH (wordbound); break; case 'B': BUF_PUSH (notwordbound); break; case '`': BUF_PUSH (begbuf); break; case '\'': BUF_PUSH (endbuf); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (syntax & RE_NO_BK_REFS) goto normal_char; c1 = c - '0'; if (c1 > regnum) return REG_ESUBREG; /* Can't back reference to a subexpression if inside of it. */ if (group_in_compile_stack (compile_stack, c1)) goto normal_char; laststart = b; BUF_PUSH_2 (duplicate, c1); break; case '+': case '?': if (syntax & RE_BK_PLUS_QM) goto handle_plus; else goto normal_backslash; default: normal_backslash: /* You might think it would be useful for \ to mean not to translate; but if we don't translate it it will never match anything. */ c = TRANSLATE (c); goto normal_char; } break; default: /* Expects the character in `c'. */ normal_char: /* If no exactn currently being built. */ if (!pending_exact /* If last exactn not at current position. */ || pending_exact + *pending_exact + 1 != b /* We have only one byte following the exactn for the count. */ || *pending_exact == (1 << BYTEWIDTH) - 1 /* If followed by a repetition operator. */ || *p == '*' || *p == '^' || ((syntax & RE_BK_PLUS_QM) ? *p == '\\' && (p[1] == '+' || p[1] == '?') : (*p == '+' || *p == '?')) || ((syntax & RE_INTERVALS) && ((syntax & RE_NO_BK_BRACES) ? *p == '{' : (p[0] == '\\' && p[1] == '{')))) { /* Start building a new exactn. */ laststart = b; BUF_PUSH_2 (exactn, 0); pending_exact = b - 1; } BUF_PUSH (c); (*pending_exact)++; break; } /* switch (c) */ } /* while p != pend */ /* Through the pattern now. */ if (fixup_alt_jump) STORE_JUMP (jump_past_alt, fixup_alt_jump, b); if (!COMPILE_STACK_EMPTY) return REG_EPAREN; free (compile_stack.stack); /* We have succeeded; set the length of the buffer. */ bufp->used = b - bufp->buffer; #ifdef DEBUG if (debug) { DEBUG_PRINT1 ("\nCompiled pattern: "); print_compiled_pattern (bufp); } #endif /* DEBUG */ return REG_NOERROR; } /* regex_compile */ /* Subroutines for `regex_compile'. */ /* Store OP at LOC followed by two-byte integer parameter ARG. */ static void store_op1 (op, loc, arg) re_opcode_t op; unsigned char *loc; int arg; { *loc = (unsigned char) op; STORE_NUMBER (loc + 1, arg); } /* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ static void store_op2 (op, loc, arg1, arg2) re_opcode_t op; unsigned char *loc; int arg1, arg2; { *loc = (unsigned char) op; STORE_NUMBER (loc + 1, arg1); STORE_NUMBER (loc + 3, arg2); } /* Copy the bytes from LOC to END to open up three bytes of space at LOC for OP followed by two-byte integer parameter ARG. */ static void insert_op1 (op, loc, arg, end) re_opcode_t op; unsigned char *loc; int arg; unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 3; while (pfrom != loc) *--pto = *--pfrom; store_op1 (op, loc, arg); } /* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ static void insert_op2 (op, loc, arg1, arg2, end) re_opcode_t op; unsigned char *loc; int arg1, arg2; unsigned char *end; { register unsigned char *pfrom = end; register unsigned char *pto = end + 5; while (pfrom != loc) *--pto = *--pfrom; store_op2 (op, loc, arg1, arg2); } /* P points to just after a ^ in PATTERN. Return true if that ^ comes after an alternative or a begin-subexpression. We assume there is at least one character before the ^. */ static boolean at_begline_loc_p (pattern, p, syntax) const char *pattern, *p; reg_syntax_t syntax; { const char *prev = p - 2; boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; return /* After a subexpression? */ (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) /* After an alternative? */ || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); } /* The dual of at_begline_loc_p. This one is for $. We assume there is at least one character after the $, i.e., `P < PEND'. */ static boolean at_endline_loc_p (p, pend, syntax) const char *p, *pend; int syntax; { const char *next = p; boolean next_backslash = *next == '\\'; const char *next_next = p + 1 < pend ? p + 1 : NULL; return /* Before a subexpression? */ (syntax & RE_NO_BK_PARENS ? *next == ')' : next_backslash && next_next && *next_next == ')') /* Before an alternative? */ || (syntax & RE_NO_BK_VBAR ? *next == '|' : next_backslash && next_next && *next_next == '|'); } /* Returns true if REGNUM is in one of COMPILE_STACK's elements and false if it's not. */ static boolean group_in_compile_stack (compile_stack, regnum) compile_stack_type compile_stack; regnum_t regnum; { int this_element; for (this_element = compile_stack.avail - 1; this_element >= 0; this_element--) if (compile_stack.stack[this_element].regnum == regnum) return true; return false; } /* Read the ending character of a range (in a bracket expression) from the uncompiled pattern *P_PTR (which ends at PEND). We assume the starting character is in `P[-2]'. (`P[-1]' is the character `-'.) Then we set the translation of all bits between the starting and ending characters (inclusive) in the compiled pattern B. Return an error code. We use these short variable names so we can use the same macros as `regex_compile' itself. */ static reg_errcode_t compile_range (p_ptr, pend, translate, syntax, b) const char **p_ptr, *pend; char *translate; reg_syntax_t syntax; unsigned char *b; { unsigned this_char; const char *p = *p_ptr; int range_start, range_end; if (p == pend) return REG_ERANGE; /* Even though the pattern is a signed `char *', we need to fetch with unsigned char *'s; if the high bit of the pattern character is set, the range endpoints will be negative if we fetch using a signed char *. We also want to fetch the endpoints without translating them; the appropriate translation is done in the bit-setting loop below. */ range_start = ((unsigned char *) p)[-2]; range_end = ((unsigned char *) p)[0]; /* Have to increment the pointer into the pattern string, so the caller isn't still at the ending character. */ (*p_ptr)++; /* If the start is after the end, the range is empty. */ if (range_start > range_end) return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; /* Here we see why `this_char' has to be larger than an `unsigned char' -- the range is inclusive, so if `range_end' == 0xff (assuming 8-bit characters), we would otherwise go into an infinite loop, since all characters <= 0xff. */ for (this_char = range_start; this_char <= range_end; this_char++) { SET_LIST_BIT (TRANSLATE (this_char)); } return REG_NOERROR; } /* Failure stack declarations and macros; both re_compile_fastmap and re_match_2 use a failure stack. These have to be macros because of REGEX_ALLOCATE. */ /* Number of failure points for which to initially allocate space when matching. If this number is exceeded, we allocate more space, so it is not a hard limit. */ #ifndef INIT_FAILURE_ALLOC #define INIT_FAILURE_ALLOC 5 #endif /* Roughly the maximum number of failure points on the stack. Would be exactly that if always used MAX_FAILURE_SPACE each time we failed. This is a variable only so users of regex can assign to it; we never change it ourselves. */ int re_max_failures = 2000; typedef const unsigned char *fail_stack_elt_t; typedef struct { fail_stack_elt_t *stack; unsigned size; unsigned avail; /* Offset of next open position. */ } fail_stack_type; #define FAIL_STACK_EMPTY() (fail_stack.avail == 0) #define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) #define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) #define FAIL_STACK_TOP() (fail_stack.stack[fail_stack.avail]) /* Initialize `fail_stack'. Do `return -2' if the alloc fails. */ #define INIT_FAIL_STACK() \ do { \ fail_stack.stack = (fail_stack_elt_t *) \ REGEX_ALLOCATE (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \ \ if (fail_stack.stack == NULL) \ return -2; \ \ fail_stack.size = INIT_FAILURE_ALLOC; \ fail_stack.avail = 0; \ } while (0) /* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. Return 1 if succeeds, and 0 if either ran out of memory allocating space for it or it was already too large. REGEX_REALLOCATE requires `destination' be declared. */ #define DOUBLE_FAIL_STACK(fail_stack) \ ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS \ ? 0 \ : ((fail_stack).stack = (fail_stack_elt_t *) \ REGEX_REALLOCATE ((fail_stack).stack, \ (fail_stack).size * sizeof (fail_stack_elt_t), \ ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \ \ (fail_stack).stack == NULL \ ? 0 \ : ((fail_stack).size <<= 1, \ 1))) /* Push PATTERN_OP on FAIL_STACK. Return 1 if was able to do so and 0 if ran out of memory allocating space to do so. */ #define PUSH_PATTERN_OP(pattern_op, fail_stack) \ ((FAIL_STACK_FULL () \ && !DOUBLE_FAIL_STACK (fail_stack)) \ ? 0 \ : ((fail_stack).stack[(fail_stack).avail++] = pattern_op, \ 1)) /* This pushes an item onto the failure stack. Must be a four-byte value. Assumes the variable `fail_stack'. Probably should only be called from within `PUSH_FAILURE_POINT'. */ #define PUSH_FAILURE_ITEM(item) \ fail_stack.stack[fail_stack.avail++] = (fail_stack_elt_t) item /* The complement operation. Assumes `fail_stack' is nonempty. */ #define POP_FAILURE_ITEM() fail_stack.stack[--fail_stack.avail] /* Used to omit pushing failure point id's when we're not debugging. */ #ifdef DEBUG #define DEBUG_PUSH PUSH_FAILURE_ITEM #define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_ITEM () #else #define DEBUG_PUSH(item) #define DEBUG_POP(item_addr) #endif /* Push the information about the state we will need if we ever fail back to it. Requires variables fail_stack, regstart, regend, reg_info, and num_regs be declared. DOUBLE_FAIL_STACK requires `destination' be declared. Does `return FAILURE_CODE' if runs out of memory. */ #define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ do { \ char *destination; \ /* Must be int, so when we don't save any registers, the arithmetic \ of 0 + -1 isn't done as unsigned. */ \ int this_reg; \ \ DEBUG_STATEMENT (failure_id++); \ DEBUG_STATEMENT (nfailure_points_pushed++); \ DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ \ DEBUG_PRINT2 (" slots needed: %d\n", NUM_FAILURE_ITEMS); \ DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ \ /* Ensure we have enough space allocated for what we will push. */ \ while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ { \ if (!DOUBLE_FAIL_STACK (fail_stack)) \ return failure_code; \ \ DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ (fail_stack).size); \ DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ } \ \ /* Push the info, starting with the registers. */ \ DEBUG_PRINT1 ("\n"); \ \ for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ this_reg++) \ { \ DEBUG_PRINT2 (" Pushing reg: %d\n", this_reg); \ DEBUG_STATEMENT (num_regs_pushed++); \ \ DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \ PUSH_FAILURE_ITEM (regstart[this_reg]); \ \ DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \ PUSH_FAILURE_ITEM (regend[this_reg]); \ \ DEBUG_PRINT2 (" info: 0x%x\n ", reg_info[this_reg]); \ DEBUG_PRINT2 (" match_null=%d", \ REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ DEBUG_PRINT2 (" matched_something=%d", \ MATCHED_SOMETHING (reg_info[this_reg])); \ DEBUG_PRINT2 (" ever_matched=%d", \ EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ DEBUG_PRINT1 ("\n"); \ PUSH_FAILURE_ITEM (reg_info[this_reg].word); \ } \ \ DEBUG_PRINT2 (" Pushing low active reg: %d\n", lowest_active_reg);\ PUSH_FAILURE_ITEM (lowest_active_reg); \ \ DEBUG_PRINT2 (" Pushing high active reg: %d\n", highest_active_reg);\ PUSH_FAILURE_ITEM (highest_active_reg); \ \ DEBUG_PRINT2 (" Pushing pattern 0x%x: ", pattern_place); \ DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ PUSH_FAILURE_ITEM (pattern_place); \ \ DEBUG_PRINT2 (" Pushing string 0x%x: `", string_place); \ DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ size2); \ DEBUG_PRINT1 ("'\n"); \ PUSH_FAILURE_ITEM (string_place); \ \ DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ DEBUG_PUSH (failure_id); \ } while (0) /* This is the number of items that are pushed and popped on the stack for each register. */ #define NUM_REG_ITEMS 3 /* Individual items aside from the registers. */ #ifdef DEBUG #define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ #else #define NUM_NONREG_ITEMS 4 #endif /* We push at most this many items on the stack. */ #define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS) /* We actually push this many items. */ #define NUM_FAILURE_ITEMS \ ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS \ + NUM_NONREG_ITEMS) /* How many items can still be added to the stack without overflowing it. */ #define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) /* Pops what PUSH_FAIL_STACK pushes. We restore into the parameters, all of which should be lvalues: STR -- the saved data position. PAT -- the saved pattern position. LOW_REG, HIGH_REG -- the highest and lowest active registers. REGSTART, REGEND -- arrays of string positions. REG_INFO -- array of information about each subexpression. Also assumes the variables `fail_stack' and (if debugging), `bufp', `pend', `string1', `size1', `string2', and `size2'. */ #define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ { \ DEBUG_STATEMENT (fail_stack_elt_t failure_id;) \ int this_reg; \ const unsigned char *string_temp; \ \ assert (!FAIL_STACK_EMPTY ()); \ \ /* Remove failure points and point to how many regs pushed. */ \ DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ \ assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ \ DEBUG_POP (&failure_id); \ DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ \ /* If the saved string location is NULL, it came from an \ on_failure_keep_string_jump opcode, and we want to throw away the \ saved NULL, thus retaining our current position in the string. */ \ string_temp = POP_FAILURE_ITEM (); \ if (string_temp != NULL) \ str = (const char *) string_temp; \ \ DEBUG_PRINT2 (" Popping string 0x%x: `", str); \ DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ DEBUG_PRINT1 ("'\n"); \ \ pat = (unsigned char *) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" Popping pattern 0x%x: ", pat); \ DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ \ /* Restore register info. */ \ high_reg = (unsigned) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" Popping high active reg: %d\n", high_reg); \ \ low_reg = (unsigned) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" Popping low active reg: %d\n", low_reg); \ \ for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ { \ DEBUG_PRINT2 (" Popping reg: %d\n", this_reg); \ \ reg_info[this_reg].word = POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" info: 0x%x\n", reg_info[this_reg]); \ \ regend[this_reg] = (const char *) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \ \ regstart[this_reg] = (const char *) POP_FAILURE_ITEM (); \ DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \ } \ \ DEBUG_STATEMENT (nfailure_points_popped++); \ } /* POP_FAILURE_POINT */ /* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible characters can start a string that matches the pattern. This fastmap is used by re_search to skip quickly over impossible starting points. The caller must supply the address of a (1 << BYTEWIDTH)-byte data area as BUFP->fastmap. We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in the pattern buffer. Returns 0 if we succeed, -2 if an internal error. */ int re_compile_fastmap (bufp) struct re_pattern_buffer *bufp; { int j, k; fail_stack_type fail_stack; #ifndef REGEX_MALLOC char *destination; #endif /* We don't push any register information onto the failure stack. */ unsigned num_regs = 0; register char *fastmap = bufp->fastmap; unsigned char *pattern = bufp->buffer; unsigned long size = bufp->used; const unsigned char *p = pattern; register unsigned char *pend = pattern + size; /* Assume that each path through the pattern can be null until proven otherwise. We set this false at the bottom of switch statement, to which we get only if a particular path doesn't match the empty string. */ boolean path_can_be_null = true; /* We aren't doing a `succeed_n' to begin with. */ boolean succeed_n_p = false; assert (fastmap != NULL && p != NULL); INIT_FAIL_STACK (); bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ bufp->fastmap_accurate = 1; /* It will be when we're done. */ bufp->can_be_null = 0; while (p != pend || !FAIL_STACK_EMPTY ()) { if (p == pend) { bufp->can_be_null |= path_can_be_null; /* Reset for next path. */ path_can_be_null = true; p = fail_stack.stack[--fail_stack.avail]; } /* We should never be about to go beyond the end of the pattern. */ assert (p < pend); #ifdef SWITCH_ENUM_BUG switch ((int) ((re_opcode_t) *p++)) #else switch ((re_opcode_t) *p++) #endif { /* I guess the idea here is to simply not bother with a fastmap if a backreference is used, since it's too hard to figure out the fastmap for the corresponding group. Setting `can_be_null' stops `re_search_2' from using the fastmap, so that is all we do. */ case duplicate: bufp->can_be_null = 1; return 0; /* Following are the cases which match a character. These end with `break'. */ case exactn: fastmap[p[1]] = 1; break; case charset: for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) fastmap[j] = 1; break; case charset_not: /* Chars beyond end of map must be allowed. */ for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) fastmap[j] = 1; for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) fastmap[j] = 1; break; case wordchar: for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) == Sword) fastmap[j] = 1; break; case notwordchar: for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) != Sword) fastmap[j] = 1; break; case anychar: /* `.' matches anything ... */ for (j = 0; j < (1 << BYTEWIDTH); j++) fastmap[j] = 1; /* ... except perhaps newline. */ if (!(bufp->syntax & RE_DOT_NEWLINE)) fastmap['\n'] = 0; /* Return if we have already set `can_be_null'; if we have, then the fastmap is irrelevant. Something's wrong here. */ else if (bufp->can_be_null) return 0; /* Otherwise, have to check alternative paths. */ break; #ifdef emacs case syntaxspec: k = *p++; for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) == (enum syntaxcode) k) fastmap[j] = 1; break; case notsyntaxspec: k = *p++; for (j = 0; j < (1 << BYTEWIDTH); j++) if (SYNTAX (j) != (enum syntaxcode) k) fastmap[j] = 1; break; /* All cases after this match the empty string. These end with `continue'. */ case before_dot: case at_dot: case after_dot: continue; #endif /* not emacs */ case no_op: case begline: case endline: case begbuf: case endbuf: case wordbound: case notwordbound: case wordbeg: case wordend: case push_dummy_failure: continue; case jump_n: case pop_failure_jump: case maybe_pop_jump: case jump: case jump_past_alt: case dummy_failure_jump: EXTRACT_NUMBER_AND_INCR (j, p); p += j; if (j > 0) continue; /* Jump backward implies we just went through the body of a loop and matched nothing. Opcode jumped to should be `on_failure_jump' or `succeed_n'. Just treat it like an ordinary jump. For a * loop, it has pushed its failure point already; if so, discard that as redundant. */ if ((re_opcode_t) *p != on_failure_jump && (re_opcode_t) *p != succeed_n) continue; p++; EXTRACT_NUMBER_AND_INCR (j, p); p += j; /* If what's on the stack is where we are now, pop it. */ if (!FAIL_STACK_EMPTY () && fail_stack.stack[fail_stack.avail - 1] == p) fail_stack.avail--; continue; case on_failure_jump: case on_failure_keep_string_jump: handle_on_failure_jump: EXTRACT_NUMBER_AND_INCR (j, p); /* For some patterns, e.g., `(a?)?', `p+j' here points to the end of the pattern. We don't want to push such a point, since when we restore it above, entering the switch will increment `p' past the end of the pattern. We don't need to push such a point since we obviously won't find any more fastmap entries beyond `pend'. Such a pattern can match the null string, though. */ if (p + j < pend) { if (!PUSH_PATTERN_OP (p + j, fail_stack)) return -2; } else bufp->can_be_null = 1; if (succeed_n_p) { EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ succeed_n_p = false; } continue; case succeed_n: /* Get to the number of times to succeed. */ p += 2; /* Increment p past the n for when k != 0. */ EXTRACT_NUMBER_AND_INCR (k, p); if (k == 0) { p -= 4; succeed_n_p = true; /* Spaghetti code alert. */ goto handle_on_failure_jump; } continue; case set_number_at: p += 4; continue; case start_memory: case stop_memory: p += 2; continue; default: abort (); /* We have listed all the cases. */ } /* switch *p++ */ /* Getting here means we have found the possible starting characters for one path of the pattern -- and that the empty string does not match. We need not follow this path further. Instead, look at the next alternative (remembered on the stack), or quit if no more. The test at the top of the loop does these things. */ path_can_be_null = false; p = pend; } /* while p */ /* Set `can_be_null' for the last path (also the first path, if the pattern is empty). */ bufp->can_be_null |= path_can_be_null; return 0; } /* re_compile_fastmap */ /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated using the malloc library routine, and must each be at least NUM_REGS * sizeof (regoff_t) bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using PATTERN_BUFFER will allocate its own register data, without freeing the old data. */ void re_set_registers (bufp, regs, num_regs, starts, ends) struct re_pattern_buffer *bufp; struct re_registers *regs; unsigned num_regs; regoff_t *starts, *ends; { if (num_regs) { bufp->regs_allocated = REGS_REALLOCATE; regs->num_regs = num_regs; regs->start = starts; regs->end = ends; } else { bufp->regs_allocated = REGS_UNALLOCATED; regs->num_regs = 0; regs->start = regs->end = (regoff_t *) 0; } } /* Searching routines. */ /* Like re_search_2, below, but only one string is specified, and doesn't let you say where to stop matching. */ int re_search (bufp, string, size, startpos, range, regs) struct re_pattern_buffer *bufp; const char *string; int size, startpos, range; struct re_registers *regs; { return re_search_2 (bufp, NULL, 0, string, size, startpos, range, regs, size); } /* Using the compiled pattern in BUFP->buffer, first tries to match the virtual concatenation of STRING1 and STRING2, starting first at index STARTPOS, then at STARTPOS + 1, and so on. STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. RANGE is how far to scan while trying to match. RANGE = 0 means try only at STARTPOS; in general, the last start tried is STARTPOS + RANGE. In REGS, return the indices of the virtual concatenation of STRING1 and STRING2 that matched the entire BUFP->buffer and its contained subexpressions. Do not consider matching one past the index STOP in the virtual concatenation of STRING1 and STRING2. We return either the position in the strings at which the match was found, -1 if no match, or -2 if error (such as failure stack overflow). */ int re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop) struct re_pattern_buffer *bufp; const char *string1, *string2; int size1, size2; int startpos; int range; struct re_registers *regs; int stop; { int val; register char *fastmap = bufp->fastmap; register char *translate = bufp->translate; int total_size = size1 + size2; int endpos = startpos + range; /* Check for out-of-range STARTPOS. */ if (startpos < 0 || startpos > total_size) return -1; /* Fix up RANGE if it might eventually take us outside the virtual concatenation of STRING1 and STRING2. */ if (endpos < -1) range = -1 - startpos; else if (endpos > total_size) range = total_size - startpos; /* If the search isn't to be a backwards one, don't waste time in a search for a pattern that must be anchored. */ if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0) { if (startpos > 0) return -1; else range = 1; } /* Update the fastmap now if not correct already. */ if (fastmap && !bufp->fastmap_accurate) if (re_compile_fastmap (bufp) == -2) return -2; /* Loop through the string, looking for a place to start matching. */ for (;;) { /* If a fastmap is supplied, skip quickly over characters that cannot be the start of a match. If the pattern can match the null string, however, we don't need to skip characters; we want the first null string. */ if (fastmap && startpos < total_size && !bufp->can_be_null) { if (range > 0) /* Searching forwards. */ { register const char *d; register int lim = 0; int irange = range; if (startpos < size1 && startpos + range >= size1) lim = range - (size1 - startpos); d = (startpos >= size1 ? string2 - size1 : string1) + startpos; /* Written out as an if-else to avoid testing `translate' inside the loop. */ if (translate) while (range > lim && !fastmap[(unsigned char) translate[(unsigned char) *d++]]) range--; else while (range > lim && !fastmap[(unsigned char) *d++]) range--; startpos += irange - range; } else /* Searching backwards. */ { register char c = (size1 == 0 || startpos >= size1 ? string2[startpos - size1] : string1[startpos]); if (!fastmap[(unsigned char) TRANSLATE (c)]) goto advance; } } /* If can't match the null string, and that's all we have left, fail. */ if (range >= 0 && startpos == total_size && fastmap && !bufp->can_be_null) return -1; val = re_match_2 (bufp, string1, size1, string2, size2, startpos, regs, stop); if (val >= 0) return startpos; if (val == -2) return -2; advance: if (!range) break; else if (range > 0) { range--; startpos++; } else { range++; startpos--; } } return -1; } /* re_search_2 */ /* Declarations and macros for re_match_2. */ static int bcmp_translate (); static boolean alt_match_null_string_p (), common_op_match_null_string_p (), group_match_null_string_p (); /* Structure for per-register (a.k.a. per-group) information. This must not be longer than one word, because we push this value onto the failure stack. Other register information, such as the starting and ending positions (which are addresses), and the list of inner groups (which is a bits list) are maintained in separate variables. We are making a (strictly speaking) nonportable assumption here: that the compiler will pack our bit fields into something that fits into the type of `word', i.e., is something that fits into one item on the failure stack. */ typedef union { fail_stack_elt_t word; struct { /* This field is one if this group can match the empty string, zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ #define MATCH_NULL_UNSET_VALUE 3 unsigned match_null_string_p : 2; unsigned is_active : 1; unsigned matched_something : 1; unsigned ever_matched_something : 1; } bits; } register_info_type; #define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) #define IS_ACTIVE(R) ((R).bits.is_active) #define MATCHED_SOMETHING(R) ((R).bits.matched_something) #define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) /* Call this when have matched a real character; it sets `matched' flags for the subexpressions which we are currently inside. Also records that those subexprs have matched. */ #define SET_REGS_MATCHED() \ do \ { \ unsigned r; \ for (r = lowest_active_reg; r <= highest_active_reg; r++) \ { \ MATCHED_SOMETHING (reg_info[r]) \ = EVER_MATCHED_SOMETHING (reg_info[r]) \ = 1; \ } \ } \ while (0) /* This converts PTR, a pointer into one of the search strings `string1' and `string2' into an offset from the beginning of that string. */ #define POINTER_TO_OFFSET(ptr) \ (FIRST_STRING_P (ptr) ? (ptr) - string1 : (ptr) - string2 + size1) /* Registers are set to a sentinel when they haven't yet matched. */ #define REG_UNSET_VALUE ((char *) -1) #define REG_UNSET(e) ((e) == REG_UNSET_VALUE) /* Macros for dealing with the split strings in re_match_2. */ #define MATCHING_IN_FIRST_STRING (dend == end_match_1) /* Call before fetching a character with *d. This switches over to string2 if necessary. */ #define PREFETCH() \ while (d == dend) \ { \ /* End of string2 => fail. */ \ if (dend == end_match_2) \ goto fail; \ /* End of string1 => advance to string2. */ \ d = string2; \ dend = end_match_2; \ } /* Test if at very beginning or at very end of the virtual concatenation of `string1' and `string2'. If only one string, it's `string2'. */ #define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) #define AT_STRINGS_END(d) ((d) == end2) /* Test if D points to a character which is word-constituent. We have two special cases to check for: if past the end of string1, look at the first character in string2; and if before the beginning of string2, look at the last character in string1. */ #define WORDCHAR_P(d) \ (SYNTAX ((d) == end1 ? *string2 \ : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ == Sword) /* Test if the character before D and the one at D differ with respect to being word-constituent. */ #define AT_WORD_BOUNDARY(d) \ (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) /* Free everything we malloc. */ #ifdef REGEX_MALLOC #define FREE_VAR(var) if (var) free (var); var = NULL #define FREE_VARIABLES() \ do { \ FREE_VAR (fail_stack.stack); \ FREE_VAR (regstart); \ FREE_VAR (regend); \ FREE_VAR (old_regstart); \ FREE_VAR (old_regend); \ FREE_VAR (best_regstart); \ FREE_VAR (best_regend); \ FREE_VAR (reg_info); \ FREE_VAR (reg_dummy); \ FREE_VAR (reg_info_dummy); \ } while (0) #else /* not REGEX_MALLOC */ /* Some MIPS systems (at least) want this to free alloca'd storage. */ #define FREE_VARIABLES() alloca (0) #endif /* not REGEX_MALLOC */ /* These values must meet several constraints. They must not be valid register values; since we have a limit of 255 registers (because we use only one byte in the pattern for the register number), we can use numbers larger than 255. They must differ by 1, because of NUM_FAILURE_ITEMS above. And the value for the lowest register must be larger than the value for the highest register, so we do not try to actually save any registers when none are active. */ #define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) #define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) /* Matching routines. */ #ifndef emacs /* Emacs never uses this. */ /* re_match is like re_match_2 except it takes only a single string. */ int re_match (bufp, string, size, pos, regs) struct re_pattern_buffer *bufp; const char *string; int size, pos; struct re_registers *regs; { return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size); } #endif /* not emacs */ /* re_match_2 matches the compiled pattern in BUFP against the the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 and SIZE2, respectively). We start matching at POS, and stop matching at STOP. If REGS is non-null and the `no_sub' field of BUFP is nonzero, we store offsets for the substring each group matched in REGS. See the documentation for exactly how many groups we fill. We return -1 if no match, -2 if an internal error (such as the failure stack overflowing). Otherwise, we return the length of the matched substring. */ int re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) struct re_pattern_buffer *bufp; const char *string1, *string2; int size1, size2; int pos; struct re_registers *regs; int stop; { /* General temporaries. */ int mcnt; unsigned char *p1; /* Just past the end of the corresponding string. */ const char *end1, *end2; /* Pointers into string1 and string2, just past the last characters in each to consider matching. */ const char *end_match_1, *end_match_2; /* Where we are in the data, and the end of the current string. */ const char *d, *dend; /* Where we are in the pattern, and the end of the pattern. */ unsigned char *p = bufp->buffer; register unsigned char *pend = p + bufp->used; /* We use this to map every character in the string. */ char *translate = bufp->translate; /* Failure point stack. Each place that can handle a failure further down the line pushes a failure point on this stack. It consists of restart, regend, and reg_info for all registers corresponding to the subexpressions we're currently inside, plus the number of such registers, and, finally, two char *'s. The first char * is where to resume scanning the pattern; the second one is where to resume scanning the strings. If the latter is zero, the failure point is a ``dummy''; if a failure happens and the failure point is a dummy, it gets discarded and the next next one is tried. */ fail_stack_type fail_stack; #ifdef DEBUG static unsigned failure_id = 0; unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; #endif /* We fill all the registers internally, independent of what we return, for use in backreferences. The number here includes an element for register zero. */ unsigned num_regs = bufp->re_nsub + 1; /* The currently active registers. */ unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG; unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG; /* Information on the contents of registers. These are pointers into the input strings; they record just what was matched (on this attempt) by a subexpression part of the pattern, that is, the regnum-th regstart pointer points to where in the pattern we began matching and the regnum-th regend points to right after where we stopped matching the regnum-th subexpression. (The zeroth register keeps track of what the whole pattern matches.) */ const char **regstart = NULL, **regend = NULL; /* If a group that's operated upon by a repetition operator fails to match anything, then the register for its start will need to be restored because it will have been set to wherever in the string we are when we last see its open-group operator. Similarly for a register's end. */ const char **old_regstart = NULL, **old_regend = NULL; /* The is_active field of reg_info helps us keep track of which (possibly nested) subexpressions we are currently in. The matched_something field of reg_info[reg_num] helps us tell whether or not we have matched any of the pattern so far this time through the reg_num-th subexpression. These two fields get reset each time through any loop their register is in. */ register_info_type *reg_info = NULL; /* The following record the register info as found in the above variables when we find a match better than any we've seen before. This happens as we backtrack through the failure points, which in turn happens only if we have not yet matched the entire string. */ unsigned best_regs_set = false; const char **best_regstart = NULL, **best_regend = NULL; /* Logically, this is `best_regend[0]'. But we don't want to have to allocate space for that if we're not allocating space for anything else (see below). Also, we never need info about register 0 for any of the other register vectors, and it seems rather a kludge to treat `best_regend' differently than the rest. So we keep track of the end of the best match so far in a separate variable. We initialize this to NULL so that when we backtrack the first time and need to test it, it's not garbage. */ const char *match_end = NULL; /* Used when we pop values we don't care about. */ const char **reg_dummy = NULL; register_info_type *reg_info_dummy = NULL; #ifdef DEBUG /* Counts the total number of registers pushed. */ unsigned num_regs_pushed = 0; #endif DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); INIT_FAIL_STACK (); /* Do not bother to initialize all the register variables if there are no groups in the pattern, as it takes a fair amount of time. If there are groups, we include space for register 0 (the whole pattern), even though we never use it, since it simplifies the array indexing. We should fix this. */ if (bufp->re_nsub) { regstart = REGEX_TALLOC (num_regs, const char *); regend = REGEX_TALLOC (num_regs, const char *); old_regstart = REGEX_TALLOC (num_regs, const char *); old_regend = REGEX_TALLOC (num_regs, const char *); best_regstart = REGEX_TALLOC (num_regs, const char *); best_regend = REGEX_TALLOC (num_regs, const char *); reg_info = REGEX_TALLOC (num_regs, register_info_type); reg_dummy = REGEX_TALLOC (num_regs, const char *); reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type); if (!(regstart && regend && old_regstart && old_regend && reg_info && best_regstart && best_regend && reg_dummy && reg_info_dummy)) { FREE_VARIABLES (); return -2; } } #ifdef REGEX_MALLOC else { /* We must initialize all our variables to NULL, so that `FREE_VARIABLES' doesn't try to free them. */ regstart = regend = old_regstart = old_regend = best_regstart = best_regend = reg_dummy = NULL; reg_info = reg_info_dummy = (register_info_type *) NULL; } #endif /* REGEX_MALLOC */ /* The starting position is bogus. */ if (pos < 0 || pos > size1 + size2) { FREE_VARIABLES (); return -1; } /* Initialize subexpression text positions to -1 to mark ones that no start_memory/stop_memory has been seen for. Also initialize the register information struct. */ for (mcnt = 1; mcnt < num_regs; mcnt++) { regstart[mcnt] = regend[mcnt] = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; IS_ACTIVE (reg_info[mcnt]) = 0; MATCHED_SOMETHING (reg_info[mcnt]) = 0; EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; } /* We move `string1' into `string2' if the latter's empty -- but not if `string1' is null. */ if (size2 == 0 && string1 != NULL) { string2 = string1; size2 = size1; string1 = 0; size1 = 0; } end1 = string1 + size1; end2 = string2 + size2; /* Compute where to stop matching, within the two strings. */ if (stop <= size1) { end_match_1 = string1 + stop; end_match_2 = string2; } else { end_match_1 = end1; end_match_2 = string2 + stop - size1; } /* `p' scans through the pattern as `d' scans through the data. `dend' is the end of the input string that `d' points within. `d' is advanced into the following input string whenever necessary, but this happens before fetching; therefore, at the beginning of the loop, `d' can be pointing at the end of a string, but it cannot equal `string2'. */ if (size1 > 0 && pos <= size1) { d = string1 + pos; dend = end_match_1; } else { d = string2 + pos - size1; dend = end_match_2; } DEBUG_PRINT1 ("The compiled pattern is: "); DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); DEBUG_PRINT1 ("The string to match is: `"); DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); DEBUG_PRINT1 ("'\n"); /* This loops over pattern commands. It exits by returning from the function if the match is complete, or it drops through if the match fails at this starting point in the input data. */ for (;;) { DEBUG_PRINT2 ("\n0x%x: ", p); if (p == pend) { /* End of pattern means we might have succeeded. */ DEBUG_PRINT1 ("end of pattern ... "); /* If we haven't matched the entire string, and we want the longest match, try backtracking. */ if (d != end_match_2) { DEBUG_PRINT1 ("backtracking.\n"); if (!FAIL_STACK_EMPTY ()) { /* More failure points to try. */ boolean same_str_p = (FIRST_STRING_P (match_end) == MATCHING_IN_FIRST_STRING); /* If exceeds best match so far, save it. */ if (!best_regs_set || (same_str_p && d > match_end) || (!same_str_p && !MATCHING_IN_FIRST_STRING)) { best_regs_set = true; match_end = d; DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); for (mcnt = 1; mcnt < num_regs; mcnt++) { best_regstart[mcnt] = regstart[mcnt]; best_regend[mcnt] = regend[mcnt]; } } goto fail; } /* If no failure points, don't restore garbage. */ else if (best_regs_set) { restore_best_regs: /* Restore best match. It may happen that `dend == end_match_1' while the restored d is in string2. For example, the pattern `x.*y.*z' against the strings `x-' and `y-z-', if the two strings are not consecutive in memory. */ DEBUG_PRINT1 ("Restoring best registers.\n"); d = match_end; dend = ((d >= string1 && d <= end1) ? end_match_1 : end_match_2); for (mcnt = 1; mcnt < num_regs; mcnt++) { regstart[mcnt] = best_regstart[mcnt]; regend[mcnt] = best_regend[mcnt]; } } } /* d != end_match_2 */ DEBUG_PRINT1 ("Accepting match.\n"); /* If caller wants register contents data back, do it. */ if (regs && !bufp->no_sub) { /* Have the register data arrays been allocated? */ if (bufp->regs_allocated == REGS_UNALLOCATED) { /* No. So allocate them with malloc. We need one extra element beyond `num_regs' for the `-1' marker GNU code uses. */ regs->num_regs = MAX (RE_NREGS, num_regs + 1); regs->start = TALLOC (regs->num_regs, regoff_t); regs->end = TALLOC (regs->num_regs, regoff_t); if (regs->start == NULL || regs->end == NULL) return -2; bufp->regs_allocated = REGS_REALLOCATE; } else if (bufp->regs_allocated == REGS_REALLOCATE) { /* Yes. If we need more elements than were already allocated, reallocate them. If we need fewer, just leave it alone. */ if (regs->num_regs < num_regs + 1) { regs->num_regs = num_regs + 1; RETALLOC (regs->start, regs->num_regs, regoff_t); RETALLOC (regs->end, regs->num_regs, regoff_t); if (regs->start == NULL || regs->end == NULL) return -2; } } else assert (bufp->regs_allocated == REGS_FIXED); /* Convert the pointer data in `regstart' and `regend' to indices. Register zero has to be set differently, since we haven't kept track of any info for it. */ if (regs->num_regs > 0) { regs->start[0] = pos; regs->end[0] = (MATCHING_IN_FIRST_STRING ? d - string1 : d - string2 + size1); } /* Go through the first `min (num_regs, regs->num_regs)' registers, since that is all we initialized. */ for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++) { if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) regs->start[mcnt] = regs->end[mcnt] = -1; else { regs->start[mcnt] = POINTER_TO_OFFSET (regstart[mcnt]); regs->end[mcnt] = POINTER_TO_OFFSET (regend[mcnt]); } } /* If the regs structure we return has more elements than were in the pattern, set the extra elements to -1. If we (re)allocated the registers, this is the case, because we always allocate enough to have at least one -1 at the end. */ for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++) regs->start[mcnt] = regs->end[mcnt] = -1; } /* regs && !bufp->no_sub */ FREE_VARIABLES (); DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", nfailure_points_pushed, nfailure_points_popped, nfailure_points_pushed - nfailure_points_popped); DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); mcnt = d - pos - (MATCHING_IN_FIRST_STRING ? string1 : string2 - size1); DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); return mcnt; } /* Otherwise match next pattern command. */ #ifdef SWITCH_ENUM_BUG switch ((int) ((re_opcode_t) *p++)) #else switch ((re_opcode_t) *p++) #endif { /* Ignore these. Used to ignore the n of succeed_n's which currently have n == 0. */ case no_op: DEBUG_PRINT1 ("EXECUTING no_op.\n"); break; /* Match the next n pattern characters exactly. The following byte in the pattern defines n, and the n bytes after that are the characters to match. */ case exactn: mcnt = *p++; DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); /* This is written out as an if-else so we don't waste time testing `translate' inside the loop. */ if (translate) { do { PREFETCH (); if (translate[(unsigned char) *d++] != (char) *p++) goto fail; } while (--mcnt); } else { do { PREFETCH (); if (*d++ != (char) *p++) goto fail; } while (--mcnt); } SET_REGS_MATCHED (); break; /* Match any character except possibly a newline or a null. */ case anychar: DEBUG_PRINT1 ("EXECUTING anychar.\n"); PREFETCH (); if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) goto fail; SET_REGS_MATCHED (); DEBUG_PRINT2 (" Matched `%d'.\n", *d); d++; break; case charset: case charset_not: { register unsigned char c; boolean not = (re_opcode_t) *(p - 1) == charset_not; DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : ""); PREFETCH (); c = TRANSLATE (*d); /* The character to match. */ /* Cast to `unsigned' instead of `unsigned char' in case the bit list is a full 32 bytes long. */ if (c < (unsigned) (*p * BYTEWIDTH) && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) not = !not; p += 1 + *p; if (!not) goto fail; SET_REGS_MATCHED (); d++; break; } /* The beginning of a group is represented by start_memory. The arguments are the register number in the next byte, and the number of groups inner to this one in the next. The text matched within the group is recorded (in the internal registers data structure) under the register number. */ case start_memory: DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]); /* Find out if this group can match the empty string. */ p1 = p; /* To send to group_match_null_string_p. */ if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) REG_MATCH_NULL_STRING_P (reg_info[*p]) = group_match_null_string_p (&p1, pend, reg_info); /* Save the position in the string where we were the last time we were at this open-group operator in case the group is operated upon by a repetition operator, e.g., with `(a*)*b' against `ab'; then we want to ignore where we are now in the string in case this attempt to match fails. */ old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) ? REG_UNSET (regstart[*p]) ? d : regstart[*p] : regstart[*p]; DEBUG_PRINT2 (" old_regstart: %d\n", POINTER_TO_OFFSET (old_regstart[*p])); regstart[*p] = d; DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); IS_ACTIVE (reg_info[*p]) = 1; MATCHED_SOMETHING (reg_info[*p]) = 0; /* This is the new highest active register. */ highest_active_reg = *p; /* If nothing was active before, this is the new lowest active register. */ if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) lowest_active_reg = *p; /* Move past the register number and inner group count. */ p += 2; break; /* The stop_memory opcode represents the end of a group. Its arguments are the same as start_memory's: the register number, and the number of inner groups. */ case stop_memory: DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]); /* We need to save the string position the last time we were at this close-group operator in case the group is operated upon by a repetition operator, e.g., with `((a*)*(b*)*)*' against `aba'; then we want to ignore where we are now in the string in case this attempt to match fails. */ old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) ? REG_UNSET (regend[*p]) ? d : regend[*p] : regend[*p]; DEBUG_PRINT2 (" old_regend: %d\n", POINTER_TO_OFFSET (old_regend[*p])); regend[*p] = d; DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); /* This register isn't active anymore. */ IS_ACTIVE (reg_info[*p]) = 0; /* If this was the only register active, nothing is active anymore. */ if (lowest_active_reg == highest_active_reg) { lowest_active_reg = NO_LOWEST_ACTIVE_REG; highest_active_reg = NO_HIGHEST_ACTIVE_REG; } else { /* We must scan for the new highest active register, since it isn't necessarily one less than now: consider (a(b)c(d(e)f)g). When group 3 ends, after the f), the new highest active register is 1. */ unsigned char r = *p - 1; while (r > 0 && !IS_ACTIVE (reg_info[r])) r--; /* If we end up at register zero, that means that we saved the registers as the result of an `on_failure_jump', not a `start_memory', and we jumped to past the innermost `stop_memory'. For example, in ((.)*) we save registers 1 and 2 as a result of the *, but when we pop back to the second ), we are at the stop_memory 1. Thus, nothing is active. */ if (r == 0) { lowest_active_reg = NO_LOWEST_ACTIVE_REG; highest_active_reg = NO_HIGHEST_ACTIVE_REG; } else highest_active_reg = r; } /* If just failed to match something this time around with a group that's operated on by a repetition operator, try to force exit from the ``loop'', and restore the register information for this group that we had before trying this last match. */ if ((!MATCHED_SOMETHING (reg_info[*p]) || (re_opcode_t) p[-3] == start_memory) && (p + 2) < pend) { boolean is_a_jump_n = false; p1 = p + 2; mcnt = 0; switch ((re_opcode_t) *p1++) { case jump_n: is_a_jump_n = true; case pop_failure_jump: case maybe_pop_jump: case jump: case dummy_failure_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (is_a_jump_n) p1 += 2; break; default: /* do nothing */ ; } p1 += mcnt; /* If the next operation is a jump backwards in the pattern to an on_failure_jump right before the start_memory corresponding to this stop_memory, exit from the loop by forcing a failure after pushing on the stack the on_failure_jump's jump in the pattern, and d. */ if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump && (re_opcode_t) p1[3] == start_memory && p1[4] == *p) { /* If this group ever matched anything, then restore what its registers were before trying this last failed match, e.g., with `(a*)*b' against `ab' for regstart[1], and, e.g., with `((a*)*(b*)*)*' against `aba' for regend[3]. Also restore the registers for inner groups for, e.g., `((a*)(b*))*' against `aba' (register 3 would otherwise get trashed). */ if (EVER_MATCHED_SOMETHING (reg_info[*p])) { unsigned r; EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; /* Restore this and inner groups' (if any) registers. */ for (r = *p; r < *p + *(p + 1); r++) { regstart[r] = old_regstart[r]; /* xx why this test? */ if ((intptr_t) old_regend[r] >= (intptr_t) regstart[r]) regend[r] = old_regend[r]; } } p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); PUSH_FAILURE_POINT (p1 + mcnt, d, -2); goto fail; } } /* Move past the register number and the inner group count. */ p += 2; break; /* \ has been turned into a `duplicate' command which is followed by the numeric value of as the register number. */ case duplicate: { register const char *d2, *dend2; int regno = *p++; /* Get which register to match against. */ DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); /* Can't back reference a group which we've never matched. */ if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) goto fail; /* Where in input to try to start matching. */ d2 = regstart[regno]; /* Where to stop matching; if both the place to start and the place to stop matching are in the same string, then set to the place to stop, otherwise, for now have to use the end of the first string. */ dend2 = ((FIRST_STRING_P (regstart[regno]) == FIRST_STRING_P (regend[regno])) ? regend[regno] : end_match_1); for (;;) { /* If necessary, advance to next segment in register contents. */ while (d2 == dend2) { if (dend2 == end_match_2) break; if (dend2 == regend[regno]) break; /* End of string1 => advance to string2. */ d2 = string2; dend2 = regend[regno]; } /* At end of register contents => success */ if (d2 == dend2) break; /* If necessary, advance to next segment in data. */ PREFETCH (); /* How many characters left in this segment to match. */ mcnt = dend - d; /* Want how many consecutive characters we can match in one shot, so, if necessary, adjust the count. */ if (mcnt > dend2 - d2) mcnt = dend2 - d2; /* Compare that many; failure if mismatch, else move past them. */ if (translate ? bcmp_translate (d, d2, mcnt, translate) : bcmp (d, d2, mcnt)) goto fail; d += mcnt, d2 += mcnt; } } break; /* begline matches the empty string at the beginning of the string (unless `not_bol' is set in `bufp'), and, if `newline_anchor' is set, after newlines. */ case begline: DEBUG_PRINT1 ("EXECUTING begline.\n"); if (AT_STRINGS_BEG (d)) { if (!bufp->not_bol) break; } else if (d[-1] == '\n' && bufp->newline_anchor) { break; } /* In all other cases, we fail. */ goto fail; /* endline is the dual of begline. */ case endline: DEBUG_PRINT1 ("EXECUTING endline.\n"); if (AT_STRINGS_END (d)) { if (!bufp->not_eol) break; } /* We have to ``prefetch'' the next character. */ else if ((d == end1 ? *string2 : *d) == '\n' && bufp->newline_anchor) { break; } goto fail; /* Match at the very beginning of the data. */ case begbuf: DEBUG_PRINT1 ("EXECUTING begbuf.\n"); if (AT_STRINGS_BEG (d)) break; goto fail; /* Match at the very end of the data. */ case endbuf: DEBUG_PRINT1 ("EXECUTING endbuf.\n"); if (AT_STRINGS_END (d)) break; goto fail; /* on_failure_keep_string_jump is used to optimize `.*\n'. It pushes NULL as the value for the string on the stack. Then `pop_failure_point' will keep the current value for the string, instead of restoring it. To see why, consider matching `foo\nbar' against `.*\n'. The .* matches the foo; then the . fails against the \n. But the next thing we want to do is match the \n against the \n; if we restored the string value, we would be back at the foo. Because this is used only in specific cases, we don't need to check all the things that `on_failure_jump' does, to make sure the right things get saved on the stack. Hence we don't share its code. The only reason to push anything on the stack at all is that otherwise we would have to change `anychar's code to do something besides goto fail in this case; that seems worse than this. */ case on_failure_keep_string_jump: DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); PUSH_FAILURE_POINT (p + mcnt, NULL, -2); break; /* Uses of on_failure_jump: Each alternative starts with an on_failure_jump that points to the beginning of the next alternative. Each alternative except the last ends with a jump that in effect jumps past the rest of the alternatives. (They really jump to the ending jump of the following alternative, because tensioning these jumps is a hassle.) Repeats start with an on_failure_jump that points past both the repetition text and either the following jump or pop_failure_jump back to this on_failure_jump. */ case on_failure_jump: on_failure: DEBUG_PRINT1 ("EXECUTING on_failure_jump"); EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); /* If this on_failure_jump comes right before a group (i.e., the original * applied to a group), save the information for that group and all inner ones, so that if we fail back to this point, the group's information will be correct. For example, in \(a*\)*\1, we need the preceding group, and in \(\(a*\)b*\)\2, we need the inner group. */ /* We can't use `p' to check ahead because we push a failure point to `p + mcnt' after we do this. */ p1 = p; /* We need to skip no_op's before we look for the start_memory in case this on_failure_jump is happening as the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 against aba. */ while (p1 < pend && (re_opcode_t) *p1 == no_op) p1++; if (p1 < pend && (re_opcode_t) *p1 == start_memory) { /* We have a new highest active register now. This will get reset at the start_memory we are about to get to, but we will have saved all the registers relevant to this repetition op, as described above. */ highest_active_reg = *(p1 + 1) + *(p1 + 2); if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) lowest_active_reg = *(p1 + 1); } DEBUG_PRINT1 (":\n"); PUSH_FAILURE_POINT (p + mcnt, d, -2); break; /* A smart repeat ends with `maybe_pop_jump'. We change it to either `pop_failure_jump' or `jump'. */ case maybe_pop_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); { register unsigned char *p2 = p; /* Compare the beginning of the repeat with what in the pattern follows its end. If we can establish that there is nothing that they would both match, i.e., that we would have to backtrack because of (as in, e.g., `a*a') then we can change to pop_failure_jump, because we'll never have to backtrack. This is not true in the case of alternatives: in `(a|ab)*' we do need to backtrack to the `ab' alternative (e.g., if the string was `ab'). But instead of trying to detect that here, the alternative has put on a dummy failure point which is what we will end up popping. */ /* Skip over open/close-group commands. */ while (p2 + 2 < pend && ((re_opcode_t) *p2 == stop_memory || (re_opcode_t) *p2 == start_memory)) p2 += 3; /* Skip over args, too. */ /* If we're at the end of the pattern, we can change. */ if (p2 == pend) { /* Consider what happens when matching ":\(.*\)" against ":/". I don't really understand this code yet. */ p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" End of pattern: change to `pop_failure_jump'.\n"); } else if ((re_opcode_t) *p2 == exactn || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) { register unsigned char c = *p2 == (unsigned char) endline ? '\n' : p2[2]; p1 = p + mcnt; /* p1[0] ... p1[2] are the `on_failure_jump' corresponding to the `maybe_finalize_jump' of this case. Examine what follows. */ if ((re_opcode_t) p1[3] == exactn && p1[5] != c) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", c, p1[5]); } else if ((re_opcode_t) p1[3] == charset || (re_opcode_t) p1[3] == charset_not) { int not = (re_opcode_t) p1[3] == charset_not; if (c < (unsigned char) (p1[4] * BYTEWIDTH) && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) not = !not; /* `not' is equal to 1 if c would match, which means that we can't change to pop_failure_jump. */ if (!not) { p[-3] = (unsigned char) pop_failure_jump; DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); } } } } p -= 2; /* Point at relative address again. */ if ((re_opcode_t) p[-1] != pop_failure_jump) { p[-1] = (unsigned char) jump; DEBUG_PRINT1 (" Match => jump.\n"); goto unconditional_jump; } /* Note fall through. */ /* The end of a simple repeat has a pop_failure_jump back to its matching on_failure_jump, where the latter will push a failure point. The pop_failure_jump takes off failure points put on by this pop_failure_jump's matching on_failure_jump; we got through the pattern to here from the matching on_failure_jump, so didn't fail. */ case pop_failure_jump: { /* We need to pass separate storage for the lowest and highest registers, even though we don't care about the actual values. Otherwise, we will restore only one register from the stack, since lowest will == highest in `pop_failure_point'. */ unsigned dummy_low_reg, dummy_high_reg; unsigned char *pdummy; const char *sdummy; DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); POP_FAILURE_POINT (sdummy, pdummy, dummy_low_reg, dummy_high_reg, reg_dummy, reg_dummy, reg_info_dummy); if (pdummy == 0) DEBUG_PRINT2("pdummy surely is! %p", pdummy); if (sdummy == 0) DEBUG_PRINT2("sdummy surely is! %p", sdummy); } /* Note fall through. */ /* Unconditionally jump (without popping any failure points). */ case jump: unconditional_jump: EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); p += mcnt; /* Do the jump. */ DEBUG_PRINT2 ("(to 0x%x).\n", p); break; /* We need this opcode so we can detect where alternatives end in `group_match_null_string_p' et al. */ case jump_past_alt: DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); goto unconditional_jump; /* Normally, the on_failure_jump pushes a failure point, which then gets popped at pop_failure_jump. We will end up at pop_failure_jump, also, and with a pattern of, say, `a+', we are skipping over the on_failure_jump, so we have to push something meaningless for pop_failure_jump to pop. */ case dummy_failure_jump: DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); /* It doesn't matter what we push for the string here. What the code at `fail' tests is the value for the pattern. */ PUSH_FAILURE_POINT (0, 0, -2); goto unconditional_jump; /* At the end of an alternative, we need to push a dummy failure point in case we are followed by a `pop_failure_jump', because we don't want the failure point for the alternative to be popped. For example, matching `(a|ab)*' against `aab' requires that we match the `ab' alternative. */ case push_dummy_failure: DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); /* See comments just above at `dummy_failure_jump' about the two zeroes. */ PUSH_FAILURE_POINT (0, 0, -2); break; /* Have to succeed matching what follows at least n times. After that, handle like `on_failure_jump'. */ case succeed_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); assert (mcnt >= 0); /* Originally, this is how many times we HAVE to succeed. */ if (mcnt > 0) { mcnt--; p += 2; STORE_NUMBER_AND_INCR (p, mcnt); DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p, mcnt); } else if (mcnt == 0) { DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", p+2); p[2] = (unsigned char) no_op; p[3] = (unsigned char) no_op; goto on_failure; } break; case jump_n: EXTRACT_NUMBER (mcnt, p + 2); DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); /* Originally, this is how many times we CAN jump. */ if (mcnt) { mcnt--; STORE_NUMBER (p + 2, mcnt); goto unconditional_jump; } /* If don't have to jump any more, skip over the rest of command. */ else p += 4; break; case set_number_at: { DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); EXTRACT_NUMBER_AND_INCR (mcnt, p); p1 = p + mcnt; EXTRACT_NUMBER_AND_INCR (mcnt, p); DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); STORE_NUMBER (p1, mcnt); break; } case wordbound: DEBUG_PRINT1 ("EXECUTING wordbound.\n"); if (AT_WORD_BOUNDARY (d)) break; goto fail; case notwordbound: DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); if (AT_WORD_BOUNDARY (d)) goto fail; break; case wordbeg: DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) break; goto fail; case wordend: DEBUG_PRINT1 ("EXECUTING wordend.\n"); if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) && (!WORDCHAR_P (d) || AT_STRINGS_END (d))) break; goto fail; #ifdef emacs #ifdef emacs19 case before_dot: DEBUG_PRINT1 ("EXECUTING before_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) >= point) goto fail; break; case at_dot: DEBUG_PRINT1 ("EXECUTING at_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) != point) goto fail; break; case after_dot: DEBUG_PRINT1 ("EXECUTING after_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) <= point) goto fail; break; #else /* not emacs19 */ case at_dot: DEBUG_PRINT1 ("EXECUTING at_dot.\n"); if (PTR_CHAR_POS ((unsigned char *) d) + 1 != point) goto fail; break; #endif /* not emacs19 */ case syntaxspec: DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); mcnt = *p++; goto matchsyntax; case wordchar: DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); mcnt = (int) Sword; matchsyntax: PREFETCH (); if (SYNTAX (*d++) != (enum syntaxcode) mcnt) goto fail; SET_REGS_MATCHED (); break; case notsyntaxspec: DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); mcnt = *p++; goto matchnotsyntax; case notwordchar: DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); mcnt = (int) Sword; matchnotsyntax: PREFETCH (); if (SYNTAX (*d++) == (enum syntaxcode) mcnt) goto fail; SET_REGS_MATCHED (); break; #else /* not emacs */ case wordchar: DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); PREFETCH (); if (!WORDCHAR_P (d)) goto fail; SET_REGS_MATCHED (); d++; break; case notwordchar: DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); PREFETCH (); if (WORDCHAR_P (d)) goto fail; SET_REGS_MATCHED (); d++; break; #endif /* not emacs */ default: abort (); } continue; /* Successfully executed one pattern command; keep going. */ /* We goto here if a matching operation fails. */ fail: if (!FAIL_STACK_EMPTY ()) { /* A restart point is known. Restore to that state. */ DEBUG_PRINT1 ("\nFAIL:\n"); POP_FAILURE_POINT (d, p, lowest_active_reg, highest_active_reg, regstart, regend, reg_info); /* If this failure point is a dummy, try the next one. */ if (!p) goto fail; /* If we failed to the end of the pattern, don't examine *p. */ assert (p <= pend); if (p < pend) { boolean is_a_jump_n = false; /* If failed to a backwards jump that's part of a repetition loop, need to pop this failure point and use the next one. */ switch ((re_opcode_t) *p) { case jump_n: is_a_jump_n = true; case maybe_pop_jump: case pop_failure_jump: case jump: p1 = p + 1; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) || (!is_a_jump_n && (re_opcode_t) *p1 == on_failure_jump)) goto fail; break; default: /* do nothing */ ; } } if (d >= string1 && d <= end1) dend = end_match_1; } else break; /* Matching at this starting point really fails. */ } /* for (;;) */ if (best_regs_set) goto restore_best_regs; FREE_VARIABLES (); return -1; /* Failure to match. */ } /* re_match_2 */ /* Subroutine definitions for re_match_2. */ /* We are passed P pointing to a register number after a start_memory. Return true if the pattern up to the corresponding stop_memory can match the empty string, and false otherwise. If we find the matching stop_memory, sets P to point to one past its number. Otherwise, sets P to an undefined byte less than or equal to END. We don't handle duplicates properly (yet). */ static boolean group_match_null_string_p (p, end, reg_info) unsigned char **p, *end; register_info_type *reg_info; { int mcnt; /* Point to after the args to the start_memory. */ unsigned char *p1 = *p + 2; while (p1 < end) { /* Skip over opcodes that can match nothing, and return true or false, as appropriate, when we get to one that can't, or to the matching stop_memory. */ switch ((re_opcode_t) *p1) { /* Could be either a loop or a series of alternatives. */ case on_failure_jump: p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); /* If the next operation is not a jump backwards in the pattern. */ if (mcnt >= 0) { /* Go through the on_failure_jumps of the alternatives, seeing if any of the alternatives cannot match nothing. The last alternative starts with only a jump, whereas the rest start with on_failure_jump and end with a jump, e.g., here is the pattern for `a|b|c': /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 /exactn/1/c So, we have to first go through the first (n-1) alternatives and then deal with the last one separately. */ /* Deal with the first (n-1) alternatives, which start with an on_failure_jump (see above) that jumps to right past a jump_past_alt. */ while ((re_opcode_t) p1[mcnt-3] == jump_past_alt) { /* `mcnt' holds how many bytes long the alternative is, including the ending `jump_past_alt' and its number. */ if (!alt_match_null_string_p (p1, p1 + mcnt - 3, reg_info)) return false; /* Move to right after this alternative, including the jump_past_alt. */ p1 += mcnt; /* Break if it's the beginning of an n-th alternative that doesn't begin with an on_failure_jump. */ if ((re_opcode_t) *p1 != on_failure_jump) break; /* Still have to check that it's not an n-th alternative that starts with an on_failure_jump. */ p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); if ((re_opcode_t) p1[mcnt-3] != jump_past_alt) { /* Get to the beginning of the n-th alternative. */ p1 -= 3; break; } } /* Deal with the last alternative: go back and get number of the `jump_past_alt' just before it. `mcnt' contains the length of the alternative. */ EXTRACT_NUMBER (mcnt, p1 - 2); if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info)) return false; p1 += mcnt; /* Get past the n-th alternative. */ } /* if mcnt > 0 */ break; case stop_memory: assert (p1[1] == **p); *p = p1 + 2; return true; default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } } /* while p1 < end */ return false; } /* group_match_null_string_p */ /* Similar to group_match_null_string_p, but doesn't deal with alternatives: It expects P to be the first byte of a single alternative and END one byte past the last. The alternative can contain groups. */ static boolean alt_match_null_string_p (p, end, reg_info) unsigned char *p, *end; register_info_type *reg_info; { int mcnt; unsigned char *p1 = p; while (p1 < end) { /* Skip over opcodes that can match nothing, and break when we get to one that can't. */ switch ((re_opcode_t) *p1) { /* It's a loop. */ case on_failure_jump: p1++; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; break; default: if (!common_op_match_null_string_p (&p1, end, reg_info)) return false; } } /* while p1 < end */ return true; } /* alt_match_null_string_p */ /* Deals with the ops common to group_match_null_string_p and alt_match_null_string_p. Sets P to one after the op and its arguments, if any. */ static boolean common_op_match_null_string_p (p, end, reg_info) unsigned char **p, *end; register_info_type *reg_info; { int mcnt; boolean ret; int reg_no; unsigned char *p1 = *p; switch ((re_opcode_t) *p1++) { case no_op: case begline: case endline: case begbuf: case endbuf: case wordbeg: case wordend: case wordbound: case notwordbound: #ifdef emacs case before_dot: case at_dot: case after_dot: #endif break; case start_memory: reg_no = *p1; assert (reg_no > 0 && reg_no <= MAX_REGNUM); ret = group_match_null_string_p (&p1, end, reg_info); /* Have to set this here in case we're checking a group which contains a group and a back reference to it. */ if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; if (!ret) return false; break; /* If this is an optimized succeed_n for zero times, make the jump. */ case jump: EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (mcnt >= 0) p1 += mcnt; else return false; break; case succeed_n: /* Get to the number of times to succeed. */ p1 += 2; EXTRACT_NUMBER_AND_INCR (mcnt, p1); if (mcnt == 0) { p1 -= 4; EXTRACT_NUMBER_AND_INCR (mcnt, p1); p1 += mcnt; } else return false; break; case duplicate: if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) return false; break; case set_number_at: p1 += 4; default: /* All other opcodes mean we cannot match the empty string. */ return false; } *p = p1; return true; } /* common_op_match_null_string_p */ /* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN bytes; nonzero otherwise. */ static int bcmp_translate( unsigned char *s1, unsigned char *s2, int len, char *translate ) { register unsigned char *p1 = s1, *p2 = s2; while (len) { if (translate[*p1++] != translate[*p2++]) return 1; len--; } return 0; } /* Entry points for GNU code. */ /* re_compile_pattern is the GNU regular expression compiler: it compiles PATTERN (of length SIZE) and puts the result in BUFP. Returns 0 if the pattern was valid, otherwise an error string. Assumes the `allocated' (and perhaps `buffer') and `translate' fields are set in BUFP on entry. We call regex_compile to do the actual compilation. */ const char * re_compile_pattern (pattern, length, bufp) const char *pattern; int length; struct re_pattern_buffer *bufp; { reg_errcode_t ret; /* GNU code is written to assume at least RE_NREGS registers will be set (and at least one extra will be -1). */ bufp->regs_allocated = REGS_UNALLOCATED; /* And GNU code determines whether or not to get register information by passing null for the REGS argument to re_match, etc., not by setting no_sub. */ bufp->no_sub = 0; /* Match anchors at newline. */ bufp->newline_anchor = 1; ret = regex_compile (pattern, length, re_syntax_options, bufp); return re_error_msg[(int) ret]; } /* Entry points compatible with 4.2 BSD regex library. We don't define them if this is an Emacs or POSIX compilation. */ #if !defined (emacs) && !defined (_POSIX_SOURCE) /* BSD has one and only one pattern buffer. */ static struct re_pattern_buffer re_comp_buf; char * re_comp (s) const char *s; { reg_errcode_t ret; if (!s) { if (!re_comp_buf.buffer) return "No previous regular expression"; return 0; } if (!re_comp_buf.buffer) { re_comp_buf.buffer = (unsigned char *) malloc (200); if (re_comp_buf.buffer == NULL) return "Memory exhausted"; re_comp_buf.allocated = 200; re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); if (re_comp_buf.fastmap == NULL) return "Memory exhausted"; } /* Since `re_exec' always passes NULL for the `regs' argument, we don't need to initialize the pattern buffer fields which affect it. */ /* Match anchors at newlines. */ re_comp_buf.newline_anchor = 1; ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); /* Yes, we're discarding `const' here. */ return (char *) re_error_msg[(int) ret]; } int re_exec (s) const char *s; { const int len = strlen (s); return 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); } #endif /* not emacs and not _POSIX_SOURCE */ /* POSIX.2 functions. Don't define these for Emacs. */ #ifndef emacs /* regcomp takes a regular expression as a string and compiles it. PREG is a regex_t *. We do not expect any fields to be initialized, since POSIX says we shouldn't. Thus, we set `buffer' to the compiled pattern; `used' to the length of the compiled pattern; `syntax' to RE_SYNTAX_POSIX_EXTENDED if the REG_EXTENDED bit in CFLAGS is set; otherwise, to RE_SYNTAX_POSIX_BASIC; `newline_anchor' to REG_NEWLINE being set in CFLAGS; `fastmap' and `fastmap_accurate' to zero; `re_nsub' to the number of subexpressions in PATTERN. PATTERN is the address of the pattern string. CFLAGS is a series of bits which affect compilation. If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we use POSIX basic syntax. If REG_NEWLINE is set, then . and [^...] don't match newline. Also, regexec will try a match beginning after every newline. If REG_ICASE is set, then we considers upper- and lowercase versions of letters to be equivalent when matching. If REG_NOSUB is set, then when PREG is passed to regexec, that routine will report only success or failure, and nothing about the registers. It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for the return codes and their meanings.) */ int regcomp (preg, pattern, cflags) regex_t *preg; const char *pattern; int cflags; { reg_errcode_t ret; unsigned syntax = (cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; /* regex_compile will allocate the space for the compiled pattern. */ preg->buffer = 0; preg->allocated = 0; /* Don't bother to use a fastmap when searching. This simplifies the REG_NEWLINE case: if we used a fastmap, we'd have to put all the characters after newlines into the fastmap. This way, we just try every character. */ preg->fastmap = 0; if (cflags & REG_ICASE) { unsigned i; preg->translate = (char *) malloc (CHAR_SET_SIZE); if (preg->translate == NULL) return (int) REG_ESPACE; /* Map uppercase characters to corresponding lowercase ones. */ for (i = 0; i < CHAR_SET_SIZE; i++) preg->translate[i] = ISUPPER (i) ? tolower (i) : i; } else preg->translate = NULL; /* If REG_NEWLINE is set, newlines are treated differently. */ if (cflags & REG_NEWLINE) { /* REG_NEWLINE implies neither . nor [^...] match newline. */ syntax &= ~RE_DOT_NEWLINE; syntax |= RE_HAT_LISTS_NOT_NEWLINE; /* It also changes the matching behavior. */ preg->newline_anchor = 1; } else preg->newline_anchor = 0; preg->no_sub = !!(cflags & REG_NOSUB); /* POSIX says a null character in the pattern terminates it, so we can use strlen here in compiling the pattern. */ ret = regex_compile (pattern, strlen (pattern), syntax, preg); /* POSIX doesn't distinguish between an unmatched open-group and an unmatched close-group: both are REG_EPAREN. */ if (ret == REG_ERPAREN) ret = REG_EPAREN; return (int) ret; } /* regexec searches for a given pattern, specified by PREG, in the string STRING. If NMATCH is zero or REG_NOSUB was set in the cflags argument to `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at least NMATCH elements, and we set them to the offsets of the corresponding matched substrings. EFLAGS specifies `execution flags' which affect matching: if REG_NOTBOL is set, then ^ does not match at the beginning of the string; if REG_NOTEOL is set, then $ does not match at the end. We return 0 if we find a match and REG_NOMATCH if not. */ int regexec (preg, string, nmatch, pmatch, eflags) const regex_t *preg; const char *string; size_t nmatch; regmatch_t pmatch[]; int eflags; { int ret; struct re_registers regs; regex_t private_preg; int len = strlen (string); boolean want_reg_info = !preg->no_sub && nmatch > 0; private_preg = *preg; private_preg.not_bol = !!(eflags & REG_NOTBOL); private_preg.not_eol = !!(eflags & REG_NOTEOL); /* The user has told us exactly how many registers to return information about, via `nmatch'. We have to pass that on to the matching routines. */ private_preg.regs_allocated = REGS_FIXED; if (want_reg_info) { regs.num_regs = nmatch; regs.start = TALLOC (nmatch, regoff_t); regs.end = TALLOC (nmatch, regoff_t); if (regs.start == NULL || regs.end == NULL) { free (regs.start); free (regs.end); return (int) REG_NOMATCH; } } /* Perform the searching operation. */ ret = re_search (&private_preg, string, len, /* start: */ 0, /* range: */ len, want_reg_info ? ®s : (struct re_registers *) 0); /* Copy the register information to the POSIX structure. */ if (want_reg_info) { if (ret >= 0) { unsigned r; for (r = 0; r < nmatch; r++) { pmatch[r].rm_so = regs.start[r]; pmatch[r].rm_eo = regs.end[r]; } } /* If we needed the temporary register info, free the space now. */ free (regs.start); free (regs.end); } /* We want zero return to mean success, unlike `re_search'. */ return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; } /* Returns a message corresponding to an error code, ERRCODE, returned from either regcomp or regexec. We don't use PREG here. */ size_t regerror (errcode, preg, errbuf, errbuf_size) int errcode; const regex_t *preg; char *errbuf; size_t errbuf_size; { const char *msg; size_t msg_size; if (errcode < 0 || errcode >= (sizeof (re_error_msg) / sizeof (re_error_msg[0]))) /* Only error codes returned by the rest of the code should be passed to this routine. If we are given anything else, or if other regex code generates an invalid error code, then the program has a bug. Dump core so we can fix it. */ abort (); msg = re_error_msg[errcode]; /* POSIX doesn't require that we do anything in this case, but why not be nice. */ if (! msg) msg = "Success"; msg_size = strlen (msg) + 1; /* Includes the null. */ if (errbuf_size != 0) { if (msg_size > errbuf_size) { strncpy (errbuf, msg, errbuf_size - 1); errbuf[errbuf_size - 1] = 0; } else strcpy (errbuf, msg); } return msg_size; } /* Free dynamically allocated space used by PREG. */ void regfree (preg) regex_t *preg; { if (preg->buffer != NULL) free (preg->buffer); preg->buffer = NULL; preg->allocated = 0; preg->used = 0; if (preg->fastmap != NULL) free (preg->fastmap); preg->fastmap = NULL; preg->fastmap_accurate = 0; if (preg->translate != NULL) free (preg->translate); preg->translate = NULL; } #endif /* not emacs */ /* Local variables: make-backup-files: t version-control: t trim-versions-without-asking: nil End: */ fldigi-4.2.05/src/compat/regex.h0000664000175000017500000004437314532252172013336 00000000000000/* Definitions for data structures and routines for the regular expression library, version 0.12. Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. */ // ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef __REGEXP_LIBRARY_H__ #define __REGEXP_LIBRARY_H__ #ifdef __cplusplus extern "C" { #endif /* POSIX says that must be included (by the caller) before . */ #ifdef VMS /* VMS doesn't have `size_t' in , even though POSIX says it should be there. */ #include #endif /* The following bits are used to determine the regexp syntax we recognize. The set/not-set meanings are chosen so that Emacs syntax remains the value 0. The bits are given in alphabetical order, and the definitions shifted by one from the previous bit; thus, when we add or remove a bit, only one other definition need change. */ typedef unsigned reg_syntax_t; /* If this bit is not set, then \ inside a bracket expression is literal. If set, then such a \ quotes the following character. */ #define RE_BACKSLASH_ESCAPE_IN_LISTS (1) /* If this bit is not set, then + and ? are operators, and \+ and \? are literals. If set, then \+ and \? are operators and + and ? are literals. */ #define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) /* If this bit is set, then character classes are supported. They are: [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. If not set, then character classes are not supported. */ #define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) /* If this bit is set, then ^ and $ are always anchors (outside bracket expressions, of course). If this bit is not set, then it depends: ^ is an anchor if it is at the beginning of a regular expression or after an open-group or an alternation operator; $ is an anchor if it is at the end of a regular expression, or before a close-group or an alternation operator. This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because POSIX draft 11.2 says that * etc. in leading positions is undefined. We already implemented a previous draft which made those constructs invalid, though, so we haven't changed the code back. */ #define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) /* If this bit is set, then special characters are always special regardless of where they are in the pattern. If this bit is not set, then special characters are special only in some contexts; otherwise they are ordinary. Specifically, * + ? and intervals are only special when not after the beginning, open-group, or alternation operator. */ #define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) /* If this bit is set, then *, +, ?, and { cannot be first in an re or immediately after an alternation or begin-group operator. */ #define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) /* If this bit is set, then . matches newline. If not set, then it doesn't. */ #define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) /* If this bit is set, then . doesn't match NUL. If not set, then it does. */ #define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) /* If this bit is set, nonmatching lists [^...] do not match newline. If not set, they do. */ #define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) /* If this bit is set, either \{...\} or {...} defines an interval, depending on RE_NO_BK_BRACES. If not set, \{, \}, {, and } are literals. */ #define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) /* If this bit is set, +, ? and | aren't recognized as operators. If not set, they are. */ #define RE_LIMITED_OPS (RE_INTERVALS << 1) /* If this bit is set, newline is an alternation operator. If not set, newline is literal. */ #define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) /* If this bit is set, then `{...}' defines an interval, and \{ and \} are literals. If not set, then `\{...\}' defines an interval. */ #define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) /* If this bit is set, (...) defines a group, and \( and \) are literals. If not set, \(...\) defines a group, and ( and ) are literals. */ #define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) /* If this bit is set, then \ matches . If not set, then \ is a back-reference. */ #define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) /* If this bit is set, then | is an alternation operator, and \| is literal. If not set, then \| is an alternation operator, and | is literal. */ #define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) /* If this bit is set, then an ending range point collating higher than the starting range point, as in [z-a], is invalid. If not set, then when ending range point collates higher than the starting range point, the range is ignored. */ #define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) /* If this bit is set, then an unmatched ) is ordinary. If not set, then an unmatched ) is invalid. */ #define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) /* This global variable defines the particular regexp syntax to use (for some interfaces). When a regexp is compiled, the syntax used is stored in the pattern buffer, so changing this does not affect already-compiled regexps. */ extern reg_syntax_t re_syntax_options; /* Define combinations of the above bits for the standard possibilities. (The [[[ comments delimit what gets put into the Texinfo file, so don't delete them!) */ /* [[[begin syntaxes]]] */ #define RE_SYNTAX_EMACS 0 #define RE_SYNTAX_AWK \ (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ | RE_UNMATCHED_RIGHT_PAREN_ORD) #define RE_SYNTAX_POSIX_AWK \ (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS) #define RE_SYNTAX_GREP \ (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ | RE_NEWLINE_ALT) #define RE_SYNTAX_EGREP \ (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ | RE_NO_BK_VBAR) #define RE_SYNTAX_POSIX_EGREP \ (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ #define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC #define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC /* Syntax bits common to both basic and extended POSIX regex syntax. */ #define _RE_SYNTAX_POSIX_COMMON \ (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ | RE_INTERVALS | RE_NO_EMPTY_RANGES) #define RE_SYNTAX_POSIX_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) /* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this isn't minimal, since other operators, such as \`, aren't disabled. */ #define RE_SYNTAX_POSIX_MINIMAL_BASIC \ (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) #define RE_SYNTAX_POSIX_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ | RE_UNMATCHED_RIGHT_PAREN_ORD) /* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */ #define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ | RE_NO_BK_PARENS | RE_NO_BK_REFS \ | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) /* [[[end syntaxes]]] */ /* Maximum number of duplicates an interval can allow. Some systems (erroneously) define this in other header files, but we want our value, so remove any previous define. */ #ifdef RE_DUP_MAX #undef RE_DUP_MAX #endif #define RE_DUP_MAX ((1 << 15) - 1) /* POSIX `cflags' bits (i.e., information for `regcomp'). */ /* If this bit is set, then use extended regular expression syntax. If not set, then use basic regular expression syntax. */ #define REG_EXTENDED 1 /* If this bit is set, then ignore case when matching. If not set, then case is significant. */ #define REG_ICASE (REG_EXTENDED << 1) /* If this bit is set, then anchors do not match at newline characters in the string. If not set, then anchors do match at newlines. */ #define REG_NEWLINE (REG_ICASE << 1) /* If this bit is set, then report only success or fail in regexec. If not set, then returns differ between not matching and errors. */ #define REG_NOSUB (REG_NEWLINE << 1) /* POSIX `eflags' bits (i.e., information for regexec). */ /* If this bit is set, then the beginning-of-line operator doesn't match the beginning of the string (presumably because it's not the beginning of a line). If not set, then the beginning-of-line operator does match the beginning of the string. */ #define REG_NOTBOL 1 /* Like REG_NOTBOL, except for the end-of-line. */ #define REG_NOTEOL (1 << 1) /* If any error codes are removed, changed, or added, update the `re_error_msg' table in regex.c. */ typedef enum { REG_NOERROR = 0, /* Success. */ REG_NOMATCH, /* Didn't find a match (for regexec). */ /* POSIX regcomp return error codes. (In the order listed in the standard.) */ REG_BADPAT, /* Invalid pattern. */ REG_ECOLLATE, /* Not implemented. */ REG_ECTYPE, /* Invalid character class name. */ REG_EESCAPE, /* Trailing backslash. */ REG_ESUBREG, /* Invalid back reference. */ REG_EBRACK, /* Unmatched left bracket. */ REG_EPAREN, /* Parenthesis imbalance. */ REG_EBRACE, /* Unmatched \{. */ REG_BADBR, /* Invalid contents of \{\}. */ REG_ERANGE, /* Invalid range end. */ REG_ESPACE, /* Ran out of memory. */ REG_BADRPT, /* No preceding re for repetition op. */ /* Error codes we've added. */ REG_EEND, /* Premature end. */ REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ } reg_errcode_t; /* This data structure represents a compiled pattern. Before calling the pattern compiler, the fields `buffer', `allocated', `fastmap', `translate', and `no_sub' can be set. After the pattern has been compiled, the `re_nsub' field is available. All other fields are private to the regex routines. */ struct re_pattern_buffer { /* [[[begin pattern_buffer]]] */ /* Space that holds the compiled pattern. It is declared as `unsigned char *' because its elements are sometimes used as array indexes. */ unsigned char *buffer; /* Number of bytes to which `buffer' points. */ unsigned long allocated; /* Number of bytes actually used in `buffer'. */ unsigned long used; /* Syntax setting with which the pattern was compiled. */ reg_syntax_t syntax; /* Pointer to a fastmap, if any, otherwise zero. re_search uses the fastmap, if there is one, to skip over impossible starting points for matches. */ char *fastmap; /* Either a translate table to apply to all characters before comparing them, or zero for no translation. The translation is applied to a pattern when it is compiled and to a string when it is matched. */ char *translate; /* Number of subexpressions found by the compiler. */ size_t re_nsub; /* Zero if this pattern cannot match the empty string, one else. Well, in truth it's used only in `re_search_2', to see whether or not we should use the fastmap, so we don't set this absolutely perfectly; see `re_compile_fastmap' (the `duplicate' case). */ unsigned can_be_null : 1; /* If REGS_UNALLOCATED, allocate space in the `regs' structure for `max (RE_NREGS, re_nsub + 1)' groups. If REGS_REALLOCATE, reallocate space if necessary. If REGS_FIXED, use what's there. */ #define REGS_UNALLOCATED 0 #define REGS_REALLOCATE 1 #define REGS_FIXED 2 unsigned regs_allocated : 2; /* Set to zero when `regex_compile' compiles a pattern; set to one by `re_compile_fastmap' if it updates the fastmap. */ unsigned fastmap_accurate : 1; /* If set, `re_match_2' does not return information about subexpressions. */ unsigned no_sub : 1; /* If set, a beginning-of-line anchor doesn't match at the beginning of the string. */ unsigned not_bol : 1; /* Similarly for an end-of-line anchor. */ unsigned not_eol : 1; /* If true, an anchor at a newline matches. */ unsigned newline_anchor : 1; /* [[[end pattern_buffer]]] */ }; typedef struct re_pattern_buffer regex_t; /* search.c (search_buffer) in Emacs needs this one opcode value. It is defined both in `regex.c' and here. */ #define RE_EXACTN_VALUE 1 /* Type for byte offsets within the string. POSIX mandates this. */ typedef int regoff_t; /* This is the structure we store register match data in. See regex.texinfo for a full description of what registers match. */ struct re_registers { unsigned num_regs; regoff_t *start; regoff_t *end; }; /* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, `re_match_2' returns information about at least this many registers the first time a `regs' structure is passed. */ #ifndef RE_NREGS #define RE_NREGS 30 #endif /* POSIX specification for registers. Aside from the different names than `re_registers', POSIX uses an array of structures, instead of a structure of arrays. */ typedef struct { regoff_t rm_so; /* Byte offset from string's start to substring's start. */ regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ } regmatch_t; /* Declarations for routines. */ /* To avoid duplicating every routine declaration -- once with a prototype (if we are ANSI), and once without (if we aren't) -- we use the following macro to declare argument types. This unfortunately clutters up the declarations a bit, but I think it's worth it. */ #if __STDC__ #define _RE_ARGS(args) args #else /* not __STDC__ */ #define _RE_ARGS(args) () #endif /* not __STDC__ */ /* Sets the current default syntax to SYNTAX, and return the old syntax. You can also simply assign to the `re_syntax_options' variable. */ extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); /* Compile the regular expression PATTERN, with length LENGTH and syntax given by the global `re_syntax_options', into the buffer BUFFER. Return NULL if successful, and an error string if not. */ extern const char *re_compile_pattern _RE_ARGS ((const char *pattern, int length, struct re_pattern_buffer *buffer)); /* Compile a fastmap for the compiled pattern in BUFFER; used to accelerate searches. Return 0 if successful and -2 if was an internal error. */ extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); /* Search in the string STRING (with length LENGTH) for the pattern compiled into BUFFER. Start searching at position START, for RANGE characters. Return the starting position of the match, -1 for no match, or -2 for an internal error. Also return register information in REGS (if REGS and BUFFER->no_sub are nonzero). */ extern int re_search _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string_, int length, int start, int range, struct re_registers *regs)); /* Like `re_search', but search in the concatenation of STRING1 and STRING2. Also, stop searching at index START + STOP. */ extern int re_search_2 _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, int length1, const char *string2, int length2, int start, int range, struct re_registers *regs, int stop)); /* Like `re_search', but return how many characters in STRING the regexp in BUFFER matched, starting at position START. */ extern int re_match _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string_, int length, int start, struct re_registers *regs)); /* Relates to `re_match' as `re_search_2' relates to `re_search'. */ extern int re_match_2 _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, int length1, const char *string2, int length2, int start, struct re_registers *regs, int stop)); /* Set REGS to hold NUM_REGS registers, storing them in STARTS and ENDS. Subsequent matches using BUFFER and REGS will use this memory for recording register information. STARTS and ENDS must be allocated with malloc, and must each be at least `NUM_REGS * sizeof (regoff_t)' bytes long. If NUM_REGS == 0, then subsequent matches should allocate their own register data. Unless this function is called, the first search or match using PATTERN_BUFFER will allocate its own register data, without freeing the old data. */ extern void re_set_registers _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, unsigned num_regs, regoff_t *starts, regoff_t *ends)); /* 4.2 bsd compatibility. */ extern char *re_comp _RE_ARGS ((const char *)); extern int re_exec _RE_ARGS ((const char *)); /* POSIX compatibility. */ extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags)); extern int regexec _RE_ARGS ((const regex_t *preg, const char *string_, size_t nmatch, regmatch_t pmatch[], int eflags)); extern size_t regerror _RE_ARGS ((int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)); extern void regfree _RE_ARGS ((regex_t *preg)); #ifdef __cplusplus } #endif #endif /* not __REGEXP_LIBRARY_H__ */ /* Local variables: make-backup-files: t version-control: t trim-versions-without-asking: nil End: */ fldigi-4.2.05/src/psk/0000775000175000017500000000000014611714005011426 500000000000000fldigi-4.2.05/src/psk/pskeval.cxx0000664000175000017500000000715714611711171013552 00000000000000// ---------------------------------------------------------------------------- // pskeval.cxx -- psk signal evaluator // // Copyright (C) 2008-2009 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "fl_digi.h" #include "pskeval.h" #include "configuration.h" #include "misc.h" //============================================================================= //========================== psk signal evaluation ============================ //============================================================================= pskeval::pskeval() { bw = 31.25; clear(); } pskeval::~pskeval() { } int countdown = 8; int rows = 0; void pskeval::sigdensity() { int ihbw = (int)(0.6*bw); int ibw = 2 * ihbw; double *vals = new double[ibw]; double sig = 0.0; double val = 0.0; int low = progdefaults.LowFreqCutoff; if (low < ihbw) low = ihbw; int high = progdefaults.HighFreqCutoff; if (high > WF_FFTLEN - ihbw) high = WF_FFTLEN - ihbw; int nbr = high - low; sigmin = 1e6; for (int i = 0; i < ibw; i++) { val = vals[i] = wf->Pwr(i + low - ihbw); sig += val; } for (int i = 0, j = 0; i < nbr; i++) { sigpwr[i + low] = decayavg(sigpwr[i + low], sig, 32); sig -= vals[j]; val = vals[j] = wf->Pwr(i + ihbw + low); sig += val; if (++j == ibw) j = 0; if (sig < sigmin) sigmin = sig; } if (sigmin < 1e-8) sigmin = 1e-8; delete [] vals; } double pskeval::sigpeak(int &f, int f1, int f2) { double peak = 0; f1 -= bw; if (f1 <= progdefaults.LowFreqCutoff) f1 = progdefaults.LowFreqCutoff; f2 += bw; if (f2 >= progdefaults.HighFreqCutoff) f2 = progdefaults.HighFreqCutoff; int fa = f2, fb = f1; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak) peak = sigpwr[i]; if (!peak) return 0; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak*0.75) fb = i; for (int i = f2; i > f1; i--) if (sigpwr[i] > peak*0.75) fa = i; if (fa > fb) return 0; f = (fa + fb) / 2; return peak / sigmin / bw; } double pskeval::peak(int &f0, int f1, int f2, double db) { double peak = 0; int fa = f2, fb = f1; double level = pow(10, (10 + db) / 10.0); //step 1 for (int i = f1; i < f2; i++) if (sigpwr[i] > peak) peak = sigpwr[i]; if (((peak-sigmin) / sigmin ) < level) { return 0; } for (int i = f1; i < f2; i++) if (sigpwr[i] > peak*0.75) fb = i; for (int i = f2; i > f1; i--) if (sigpwr[i] > peak*0.75) fa = i; if (fa > fb) { return 0; } f0 = (fa + fb) / 2; //step 2 f1 = f0 - 1.5*bw; if (f1 < bw) f1 = bw; f2 = f0 + 1.5*bw; fb = f1; fa = f2; peak = 0; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak) peak = sigpwr[i]; for (int i = f1; i < f2; i++) if (sigpwr[i] > peak*0.75) fb = i; for (int i = f2; i > f1; i--) if (sigpwr[i] > peak*0.75) fa = i; if (fa > fb) { return 0; } f0 = (fa + fb) / 2; return (peak - sigmin) / sigmin ; } void pskeval::clear() { for (int i = 0; i < WF_FFTLEN; i++) sigpwr[i] = 0.0; } fldigi-4.2.05/src/psk/viewpsk.cxx0000664000175000017500000004264014611711171013571 00000000000000// ---------------------------------------------------------------------------- // viewpsk.cxx // // Copyright (C) 2008 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- // viewpsk is a multi channel psk decoder which allows the parallel processing // of the complete audio spectrum from 200 to 3500 Hz in equal 100 Hz // channels. Each channel is separately decoded and the decoded characters // passed to the user interface routines for presentation. The number of // channels can be up to and including 30. #include #include #include #include "fl_digi.h" #include "viewpsk.h" #include "pskeval.h" #include "pskcoeff.h" #include "pskvaricode.h" #include "misc.h" #include "configuration.h" #include "Viewer.h" #include "qrunner.h" #include "status.h" #include "trx.h" extern waterfall *wf; //===================================================================== // Change the following for DCD low pass filter adjustment #define SQLCOEFF 0.01 //#define SQLDECAY 50 #define SQLDECAY 20 #define K 5 #define POLY1 0x17 #define POLY2 0x19 #define PSKR_K 7 #define PSKR_POLY1 0x6d #define PSKR_POLY2 0x4f //===================================================================== viewpsk::viewpsk(pskeval* eval, trx_mode pskmode) { for (int i = 0; i < MAXCHANNELS; i++) { channel[i].fir1 = (C_FIR_filter *)0; channel[i].fir2 = (C_FIR_filter *)0; channel[i].dec = (viterbi *)0; channel[i].dec2 = (viterbi *)0; channel[i].Rxinlv = (interleave *)0; channel[i].Rxinlv2 = (interleave *)0; } evalpsk = eval; viewmode = MODE_PREV; restart(pskmode); } viewpsk::~viewpsk() { for (int i = 0; i < MAXCHANNELS; i++) { if (channel[i].fir1) delete channel[i].fir1; if (channel[i].fir2) delete channel[i].fir2; if (channel[i].dec) delete channel[i].dec; if (channel[i].dec2) delete channel[i].dec2; if (channel[i].Rxinlv) delete channel[i].Rxinlv; if (channel[i].Rxinlv2) delete channel[i].Rxinlv2; } } void viewpsk::init() { nchannels = progdefaults.VIEWERchannels; lowfreq = progdefaults.LowFreqCutoff; for (int i = 0; i < MAXCHANNELS; i++) { channel[i].phaseacc = 0; channel[i].prevsymbol = cmplx (1.0, 0.0); channel[i].quality = cmplx (0.0, 0.0); if (_pskr) { // MFSK varicode instead of psk channel[i].shreg = 1; channel[i].shreg2 = 1; } else { channel[i].shreg = 0; channel[i].shreg2 = 0; } channel[i].dcdshreg = 0; channel[i].dcdshreg2 = 0; channel[i].dcd = false; channel[i].bitclk = 0; channel[i].freqerr = 0.0; channel[i].timeout = 0; channel[i].frequency = NULLFREQ; channel[i].reset = false; channel[i].acquire = 0; for (int j = 0; j < 16; j++) channel[i].syncbuf[j] = 0.0; } for (int i = 0; i < nchannels; i++) REQ(&viewclearchannel, i); evalpsk->clear(); reset_all = false; } void viewpsk::restart(trx_mode pskmode) { if (viewmode == pskmode) return; viewmode = pskmode; double fir1c[FIRLEN+1]; double fir2c[FIRLEN+1]; int idepth = 2; int isize = 2; _pskr = false; _qpsk = false; symbits = 1; switch (viewmode) { case MODE_PSK31: symbollen = 256; dcdbits = 32; break; case MODE_PSK63F: _pskr = true; case MODE_PSK63: symbollen = 128; dcdbits = 64; break; case MODE_PSK125R: _pskr = true; idepth = 40; // 2x2x40 interleaver case MODE_PSK125: symbollen = 64; dcdbits = 128; break; case MODE_PSK250R: _pskr = true; idepth = 80; // 2x2x80 interleaver case MODE_PSK250: symbollen = 32; dcdbits = 256; break; case MODE_PSK500R: _pskr = true; idepth = 160; // 2x2x160 interleaver case MODE_PSK500: symbollen = 16; dcdbits = 512; break; case MODE_QPSK31: symbollen = 256; _qpsk = true; symbits = 2; dcdbits = 32; break; case MODE_QPSK63: symbollen = 128; symbits = 2; _qpsk = true; dcdbits = 64; break; case MODE_QPSK125: symbollen = 64; symbits = 2; _qpsk = true; dcdbits = 128; break; case MODE_QPSK250: symbollen = 32; symbits = 2; _qpsk = true; dcdbits = 256; break; case MODE_QPSK500: symbollen = 16; symbits = 2; _qpsk = true; dcdbits = 512; break; default: // punt! mode not one of the above. symbollen = 512; dcdbits = 32; break; } raisedcosfilt(fir1c, FIRLEN); for (int i = 0; i <= FIRLEN; i++) fir2c[i] = pskcore_filter[i]; for (int i = 0; i < MAXCHANNELS; i++) { if (channel[i].fir1) delete channel[i].fir1; channel[i].fir1 = new C_FIR_filter(); channel[i].fir1->init(FIRLEN+1, symbollen / 16, fir1c, fir1c); if (channel[i].fir2) delete channel[i].fir2; channel[i].fir2 = new C_FIR_filter(); channel[i].fir2->init(FIRLEN+1, 1, fir2c, fir2c); if (_qpsk) { if (channel[i].dec) delete channel[i].dec; channel[i].dec = new viterbi(K, POLY1, POLY2); if (channel[i].dec2) delete channel[i].dec; channel[i].dec2 = 0; } else { if (channel[i].dec) delete channel[i].dec; channel[i].dec = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); channel[i].dec->setchunksize(4); if (channel[i].dec2) delete channel[i].dec; channel[i].dec2 = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); channel[i].dec2->setchunksize(4); } // 2x2x(20,40,80,160) channel[i].Rxinlv = new interleave (isize, idepth, INTERLEAVE_REV); // 2x2x(20,40,80,160) channel[i].Rxinlv2 = new interleave (isize, idepth, INTERLEAVE_REV); } bandwidth = VPSKSAMPLERATE / symbollen; init(); } //============================================================================= //========================= viewpsk receive routines ========================== //============================================================================= bool viewpsk::is_valid_char(int &c) { if (c == '\n' || c == '\r') { c = ' '; return true; } if (c <= 0) return false; if (c > 0x7F) return false; if (iscntrl(c & 0xFF)) return false; return true; } void viewpsk::rx_bit(int ch, int bit) { int c; channel[ch].shreg = (channel[ch].shreg << 1) | !!bit; if (_pskr) { // MFSK varicode instead of PSK Varicode if ((channel[ch].shreg & 7) == 1) { c = varidec(channel[ch].shreg >> 1); channel[ch].shreg = 1; // Voting at the character level if (channel[ch].fecmet >= channel[ch].fecmet2) { if (is_valid_char(c)) REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, viewmode); } } } else { if ((channel[ch].shreg & 3) == 0) { c = psk_varicode_decode(channel[ch].shreg >> 2); channel[ch].shreg = 0; if (is_valid_char(c)) REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, viewmode); } } } void viewpsk::rx_bit2(int ch, int bit) { int c; channel[ch].shreg2 = (channel[ch].shreg2 << 1) | !!bit; // MFSK varicode instead of PSK Varicode if ((channel[ch].shreg2 & 7) == 1) { c = varidec(channel[ch].shreg2 >> 1); // Voting at the character level if (channel[ch].fecmet < channel[ch].fecmet2) { if (is_valid_char(c)) REQ(&viewaddchr, ch, (int)channel[ch].frequency, c, viewmode); } channel[ch].shreg2 = 1; } } void viewpsk::rx_pskr(int ch, unsigned char symbol) { int met; unsigned char twosym[2]; unsigned char tempc; int c; // Accumulate the soft bits for the interleaver THEN submit to Viterbi // decoder in alternance so that each one is processed one bit later. // Only two possibilities for sync: current bit or previous one since // we encode with R = 1/2 and send encoded bits one after the other // through the interleaver. channel[ch].symbolpair[1] = channel[ch].symbolpair[0]; channel[ch].symbolpair[0] = symbol; if (channel[ch].rxbitstate == 0) { // process bit 1 // copy to avoid scrambling symbolpair for the next bit channel[ch].rxbitstate = 1; twosym[0] = channel[ch].symbolpair[0]; twosym[1] = channel[ch].symbolpair[1]; // De-interleave for Robust modes only if (viewmode != MODE_PSK63F) channel[ch].Rxinlv2->symbols(twosym); // pass de-interleaved bits pair to the decoder, reversed tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = channel[ch].dec2->decode(twosym, &met); if (c != -1) { // FEC only take metric measurement after backtrace // Will be used for voting between the two decoded streams channel[ch].fecmet2 = decayavg(channel[ch].fecmet2, met, 20); rx_bit2(ch, c & 0x08); rx_bit2(ch, c & 0x04); rx_bit2(ch, c & 0x02); rx_bit2(ch, c & 0x01); } } else { // process bit 0 // copy to avoid scrambling symbolpair for the next bit channel[ch].rxbitstate = 0; twosym[0] = channel[ch].symbolpair[0]; twosym[1] = channel[ch].symbolpair[1]; // De-interleave if (viewmode != MODE_PSK63F) channel[ch].Rxinlv->symbols(twosym); tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = channel[ch].dec->decode(twosym, &met); if (c != -1) { channel[ch].fecmet = decayavg(channel[ch].fecmet, met, 20); rx_bit(ch, c & 0x08); rx_bit(ch, c & 0x04); rx_bit(ch, c & 0x02); rx_bit(ch, c & 0x01); } } } void viewpsk::rx_qpsk(int ch, int bits) { unsigned char sym[2]; int c; if (!active_modem->get_reverse()) bits = (4 - bits) & 3; sym[0] = (bits & 1) ? 255 : 0; sym[1] = (bits & 2) ? 0 : 255; // top bit is flipped c = channel[ch].dec->decode(sym, NULL); if (c != -1) { rx_bit(ch, c & 0x80); rx_bit(ch, c & 0x40); rx_bit(ch, c & 0x20); rx_bit(ch, c & 0x10); rx_bit(ch, c & 0x08); rx_bit(ch, c & 0x04); rx_bit(ch, c & 0x02); rx_bit(ch, c & 0x01); } } void viewpsk::afc(int ch) { if (channel[ch].dcd == true || channel[ch].acquire) { double error; double lower_bound = (lowfreq + ch * 100) - bandwidth; if (lower_bound < bandwidth) lower_bound = bandwidth; double upper_bound = lowfreq + (ch+1)*100 + bandwidth; error = (channel[ch].phase - channel[ch].bits * M_PI / 2); if (error < M_PI / 2.0) error += 2 * M_PI; if (error > M_PI / 2.0) error -= 2 * M_PI; error *= (VPSKSAMPLERATE / (symbollen * 2 * M_PI))/16.0; channel[ch].frequency -= error; channel[ch].frequency = CLAMP(channel[ch].frequency, lower_bound, upper_bound); } if (channel[ch].acquire) channel[ch].acquire--; } void viewpsk::clearch(int n) { channel[n].reset = true; evalpsk->clear(); } void viewpsk::clear() { for (int i = 0; i < nchannels; i++) channel[i].reset = true; evalpsk->clear(); } inline void viewpsk::timeout_check() { for (int ch = 0; ch < nchannels; ch++) { if (channel[ch].timeout) channel[ch].timeout--; if (channel[ch].frequency == NULLFREQ) continue; if (channel[ch].reset || (!channel[ch].timeout && !channel[ch].acquire) || (ch && (fabs(channel[ch-1].frequency - channel[ch].frequency) < bandwidth))) { channel[ch].reset = false; channel[ch].dcd = 0; channel[ch].frequency = NULLFREQ; channel[ch].acquire = 0; REQ(&viewclearchannel, ch); REQ(&viewaddchr, ch, NULLFREQ, 0, viewmode); } } } void viewpsk::findsignals() { if (!evalpsk) return; double level = progStatus.VIEWER_psksquelch; int nomfreq = 0; int lfreq = 0; int hfreq = 0; int ftest; int f1, f2; timeout_check(); for (int i = 0; i < nchannels; i++) { nomfreq = lowfreq + 100 * i; lfreq = nomfreq - 20; hfreq = nomfreq + 120; // suppress detection outside of this range if (!channel[i].dcd && !channel[i].timeout) { if (!channel[i].acquire) { channel[i].frequency = NULLFREQ; f1 = nomfreq - 0.5 * bandwidth; if (f1 < 2 * bandwidth) f1 = 2 * bandwidth; f2 = f1 + 100; ftest = (f1 + f2) / 2; } else { if (channel[i].frequency < lfreq || channel[i].frequency >= hfreq) channel[i].frequency = nomfreq + 50; ftest = channel[i].frequency; f1 = ftest - bandwidth; f2 = ftest + bandwidth; if (f1 < 2 * bandwidth) { f1 = 2 * bandwidth; f2 = f1 + bandwidth; } } if (evalpsk->peak(ftest, f1, f2, level)) { if (ftest < lfreq || ftest >= hfreq) goto nexti; f1 = ftest - bandwidth; f2 = ftest + bandwidth; if (evalpsk->peak(ftest, f1, f2, level)) { if (ftest < lfreq || ftest >= hfreq) goto nexti; if (i && (channel[i-1].dcd || channel[i-1].acquire) && fabs(channel[i-1].frequency - ftest) < bandwidth) goto nexti; if ((i < nchannels - 1) && (channel[i+1].dcd || channel[i+1].acquire) && fabs(channel[i+1].frequency - ftest) < bandwidth) goto nexti; channel[i].frequency = ftest; channel[i].freqerr = 0.0; channel[i].metric = 0.0; if (!channel[i].acquire) channel[i].acquire = 2 * 8000 / 512; } } } nexti: ; } } void viewpsk::rx_symbol(int ch, cmplx symbol) { int n = 2; // psk unsigned char softbit = 128; double softangle; double softamp; double sigamp = norm(symbol); channel[ch].phase = arg ( conj(channel[ch].prevsymbol) * symbol ); channel[ch].prevsymbol = symbol; if (channel[ch].phase < 0) channel[ch].phase += 2 * M_PI; if (_qpsk) { n = 4; channel[ch].bits = ((int) (channel[ch].phase / M_PI_2 + 0.5)) & (n-1); } else { channel[ch].bits = (((int) (channel[ch].phase / M_PI + 0.5)) & (n-1)) << 1; // hard decode if needed // softbit = (bits & 2) ? 0 : 255; // reversed as we normally pass "!bits" when hard decoding // Soft decode section below channel[ch].averageamp = decayavg(channel[ch].averageamp, sigamp, SQLDECAY); if (sigamp > 0 && channel[ch].averageamp > 0) { softamp = clamp( channel[ch].averageamp / sigamp, 1.0, 1e6); } else { softamp = 1; // arbritary number (50% impact) } // Compute values between -128 and +127 for phase value only if (channel[ch].phase > M_PI) { softangle = (127 - (((2 * M_PI - channel[ch].phase) / M_PI) * (double) 255)); } else { softangle = (127 - ((channel[ch].phase / M_PI) * (double) 255)); } // Then apply impact of amplitude. Finally, re-centre on 127-128 // as the decoder needs values between 0-255 softbit = (unsigned char) ((softangle / (1 + softamp)) - 127); } channel[ch].dcdshreg <<= (symbits + 1); channel[ch].dcdshreg |= channel[ch].bits; switch (channel[ch].dcdshreg) { // bpsk DCD on case 0xAAAAAAAA: /* DCD on by preamble */ if (_pskr) break; if (!channel[ch].dcd) REQ(&viewaddchr, ch, (int)channel[ch].frequency, 0, viewmode); channel[ch].dcd = 1; channel[ch].quality = cmplx (1.0, 0.0); channel[ch].metric = 100; channel[ch].timeout = progdefaults.VIEWERtimeout * VPSKSAMPLERATE / WF_BLOCKSIZE; channel[ch].acquire = 0; break; // pskr DCD on case 0x0A0A0A0A: if (!_pskr) break; if (!channel[ch].dcd) REQ(&viewaddchr, ch, (int)channel[ch].frequency, 0, viewmode); channel[ch].dcd = 1; channel[ch].quality = cmplx (1.0, 0.0); channel[ch].metric = 100; channel[ch].timeout = progdefaults.VIEWERtimeout * VPSKSAMPLERATE / WF_BLOCKSIZE; channel[ch].acquire = 0; break; case 0: /* DCD off by postamble */ channel[ch].dcd = false; channel[ch].quality = cmplx (0.0, 0.0); channel[ch].metric = 0; channel[ch].acquire = 0; break; default: channel[ch].quality = cmplx ( decayavg(channel[ch].quality.real(), cos(n*channel[ch].phase), SQLDECAY), decayavg(channel[ch].quality.imag(), sin(n*channel[ch].phase), SQLDECAY)); channel[ch].metric = norm(channel[ch].quality); if (channel[ch].metric > (progStatus.VIEWER_psksquelch + 6.0)/26.0) { channel[ch].dcd = true; } else { channel[ch].dcd = false; } } if (channel[ch].dcd == true) { channel[ch].timeout = progdefaults.VIEWERtimeout * VPSKSAMPLERATE / WF_BLOCKSIZE; if (_qpsk) rx_qpsk(ch, channel[ch].bits); else if (_pskr) rx_pskr(ch, softbit); else rx_bit(ch, !channel[ch].bits); channel[ch].acquire = 0; } } int viewpsk::rx_process(const double *buf, int len) { double sum; double ampsum; int idx; cmplx z, z2; if (nchannels != progdefaults.VIEWERchannels || lowfreq != progdefaults.LowFreqCutoff) init(); // process all channels for (int ch = 0; ch < nchannels; ch++) { if (channel[ch].frequency == NULLFREQ) continue; for (int ptr = 0; ptr < len; ptr++) { // Mix with the internal NCO for each channel z = cmplx ( buf[ptr] * cos(channel[ch].phaseacc), buf[ptr] * sin(channel[ch].phaseacc) ); channel[ch].phaseacc += 2.0 * M_PI * channel[ch].frequency / VPSKSAMPLERATE; // filter & decimate if (channel[ch].fir1->run( z, z )) { channel[ch].fir2->run( z, z2 ); idx = (int) channel[ch].bitclk; sum = 0.0; ampsum = 0.0; channel[ch].syncbuf[idx] = 0.8 * channel[ch].syncbuf[idx] + 0.2 * abs(z2); double bitsteps = (symbollen >= 16 ? 16 : symbollen); int symsteps = (int) (bitsteps / 2); for (int i = 0; i < symsteps; i++) { sum += (channel[ch].syncbuf[i] - channel[ch].syncbuf[i+8]); ampsum += (channel[ch].syncbuf[i] + channel[ch].syncbuf[i+8]); } sum = (ampsum == 0 ? 0 : sum / ampsum); channel[ch].bitclk -= sum / 5.0; channel[ch].bitclk += 1; if (channel[ch].bitclk < 0) channel[ch].bitclk += bitsteps; if (channel[ch].bitclk >= bitsteps) { channel[ch].bitclk -= bitsteps; rx_symbol(ch, z2); afc(ch); } } } } findsignals(); return 0; } int viewpsk::get_freq(int n) { if (channel[n].dcd) return (int)channel[n].frequency; return NULLFREQ; } fldigi-4.2.05/src/psk/pskcoeff.cxx0000664000175000017500000001405114611711171013674 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2014 // David Freese, W1HKJ // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "pskcoeff.h" // Linux PSK31 modem driver for soundcard -- Filter coefficients // // these FIR coefs are those used by G0TJZ in his TMC320C50 code // // Hansi Reiser, DL9RDZ, 20 April 1998 // #include // 65-tap raised-cosine FIR // implements // u[n] = (1.0 - cos(2PI * n / 64))/128.0 // used in gmfsk, twpsk etc. double gmfir1c[FIRLEN+1] = { 0.000000, //0 0.000038, //1 0.000150, //2 0.000336, //3 0.000595, //4 0.000922, //5 0.001317, //6 0.001773, //7 0.002288, //8 0.002856, //9 0.003472, //10 0.004130, //11 0.004823, //12 0.005545, //13 0.006288, //14 0.007047, //15 0.007812, //16 0.008578, //17 0.009337, //18 0.010080, //19 0.010802, //20 0.011495, //21 0.012153, //22 0.012769, //23 0.013337, //24 0.013852, //25 0.014308, //26 0.014703, //27 0.015030, //28 0.015289, //29 0.015475, //30 0.015587, //31 0.015625, //32 0.015587, //33 0.015475, //34 0.015289, //35 0.015030, //36 0.014703, //37 0.014308, //38 0.013852, //39 0.013337, //40 0.012769, //41 0.012153, //42 0.011495, //43 0.010802, //44 0.010080, //45 0.009337, //46 0.008578, //47 0.007813, //48 0.007047, //49 0.006288, //50 0.005545, //51 0.004823, //52 0.004130, //53 0.003472, //54 0.002856, //55 0.002288, //56 0.001773, //57 0.001317, //58 0.000922, //59 0.000595, //60 0.000336, //61 0.000150, //62 0.000038, //63 0.000000 //64 }; // 4-bit receive filter for 31.25 baud BPSK // Designed by G3PLX // double gmfir2c[FIRLEN+1] = { 0.000625000, 0.000820912, 0.001374651, 0.002188141, 0.003110600, 0.003956273, 0.004526787, 0.004635947, 0.004134515, 0.002932456, 0.001016352, -0.001539947, -0.004572751, -0.007834665, -0.011009254, -0.013733305, -0.015625000, -0.016315775, -0.015483216, -0.012882186, -0.008371423, -0.001933193, 0.006315933, 0.016124399, 0.027115485, 0.038807198, 0.050640928, 0.062016866, 0.072333574, 0.081028710, 0.087617820, 0.091728168, 0.093125000, 0.091728168, 0.087617820, 0.081028710, 0.072333574, 0.062016866, 0.050640928, 0.038807198, 0.027115485, 0.016124399, 0.006315933, -0.001933193, -0.008371423, -0.012882186, -0.015483216, -0.016315775, -0.015625000, -0.013733305, -0.011009254, -0.007834665, -0.004572751, -0.001539947, 0.001016352, 0.002932456, 0.004134515, 0.004635947, 0.004526787, 0.003956273, 0.003110600, 0.002188141, 0.001374651, 0.000820912, 0.000625000 }; // sync filter // weighting for sync samples // sum of all weights = 1.0 double syncfilt[16] = { -0.097545161, -0.093796555, -0.086443400, -0.075768274, -0.062181416, -0.046204960, -0.028452874, -0.009607360, 0.009607360, 0.028452874, 0.046204960, 0.062181416, 0.075768274, 0.086443400, 0.093796555, 0.097545161 }; double pskcore_filter[FIRLEN+1] = { 4.3453566e-005, //0 -0.00049122414, //1 -0.00078771292, //2 -0.0013507826, //3 -0.0021287814, //4 -0.003133466, //5 -0.004366817, //6 -0.0058112187, //7 -0.0074249976, //8 -0.0091398882, //9 -0.010860157, //10 -0.012464086, //11 -0.013807772, //12 -0.014731191, //13 -0.015067057, //14 -0.014650894, //15 -0.013333425, //16 -0.01099166, //17 -0.0075431246, //18 -0.0029527849, //19 0.0027546292, //20 0.0094932775, //21 0.017113308, //22 0.025403511, //23 0.034099681, //24 0.042895839, //25 0.051458575, //26 0.059444853, //27 0.066521003, //28 0.072381617, //29 0.076767694, //30 0.079481619, //31 0.080420311, //32 0.079481619, //33 0.076767694, //34 0.072381617, //35 0.066521003, //36 0.059444853, //37 0.051458575, //38 0.042895839, //39 0.034099681, //40 0.025403511, //41 0.017113308, //42 0.0094932775, //43 0.0027546292, //44 -0.0029527849, //45 -0.0075431246, //46 -0.01099166, //47 -0.013333425, //48 -0.014650894, //49 -0.015067057, //50 -0.014731191, //51 -0.013807772, //52 -0.012464086, //53 -0.010860157, //54 -0.0091398882, //55 -0.0074249976, //56 -0.0058112187, //57 -0.004366817, //58 -0.003133466, //59 -0.0021287814, //60 -0.0013507826, //61 -0.00078771292, //62 -0.00049122414, //63 4.3453566e-005 //64 }; // experimental filters (higher precision) // identical to the G0TJZ filter but with double precision // *firc should be double of len+1 void raisedcosfilt(double *firc, int len) { double k1 = M_PI * 2.0 / len; double k2 = 2.0 * len; for (int i = 0; i <= len; i++) firc[i] = ( 1.0 - cos( k1 * i ) ) / k2; } // *firc should be double of FIRLEN+1 // 33, 65, 129 ... void wsincfilt(double *firc, double fc, int len, bool blackman) { double normalize = 0; double k1 = 2.0 * M_PI / len; double k2 = 2.0 * M_PI * fc; double l2 = len / 2.0; // sin(x-tau)/(x-tau) for (int i = 0; i <= len; i++) if (i == l2) firc[i] = 1.0; else firc[i] = sin(k2 * (i - l2)) / (k2 * (i - l2)); // blackman window if (blackman) for (int i = 0; i <= len; i++) firc[i] = firc[i] * (0.42 - 0.5 * cos(k1 * i) + 0.08 * cos(2.0 * k1 * i)); // hamming window else for (int i = 0; i <= len; i++) firc[i] = firc[i] * (0.54 - 0.46 * cos(k1 * i)); // normalization factor for (int i = 0; i <= len; i++) normalize += firc[i]; // normalize the filter for (int i = 0; i <= len; i++) firc[i] /= normalize; } fldigi-4.2.05/src/psk/psk.cxx0000664000175000017500000021651714611711171012704 00000000000000// ---------------------------------------------------------------------------- // psk.cxx -- psk modem // // Copyright (C) 2006-2021 // Dave Freese, W1HKJ // Copyright (C) 2009-2010 // John Douyere, VK2ETA // Copyright (C) 2014-2021 // John Phelps, KL4YFD // Modified by Joe Counsil, K0OG - Flushlengths on 8PSKxF Modes // // PSK-FEC and PSK-R modes contributed by VK2ETA // // This file is part of fldigi. Adapted from code contained in gmfsk // source code distribution. // gmfsk Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include "psk.h" #include "main.h" #include "fl_digi.h" #include "trx.h" #include "misc.h" #include "waterfall.h" #include "configuration.h" #include "status.h" #include "viewpsk.h" #include "pskeval.h" #include "modem.h" #include "Viewer.h" #include "macros.h" #include "confdialog.h" #include "test_signal.h" extern waterfall *wf; // Change the following for DCD low pass filter adjustment #define SQLCOEFF 0.01 #define SQLDECAY 50 //===================================================================== #define K 5 #define POLY1 0x17 #define POLY2 0x19 // PSK + FEC + INTERLEAVE // df=10 : correct up to 4 bits #define PSKR_K 7 #define PSKR_POLY1 0x6d #define PSKR_POLY2 0x4f // df=14 : correct up to 6 bits #define K11 11 #define K11_POLY1 03073 // 1595 #define K11_POLY2 02365 // 1269 // df=16 : correct up to 7 bits // Code has good ac(df) and bc(df) parameters for puncturing #define K13 13 #define K13_POLY1 016461 // 7473 #define K13_POLY2 012767 // 5623 #define THOR_K15 15 #define K15_POLY1 044735 #define K15_POLY2 063057 // df=19 : correct up to 9 bits #define K16 16 #define K16_POLY1 0152711 // 54729 #define K16_POLY2 0126723 // 44499 // For Gray-mapped 8PSK: // Even when the received phase is distorted by +- 1 phase-position: // - One of the bits is still known with 100% certianty. // - Only up to 1 bit can be in error static cmplx graymapped_8psk_pos[] = { // Degrees Bits In Mapped Soft-Symbol cmplx (1.0, 0.0), // 0 | 0b000 | 025,000,025 cmplx (0.7071, 0.7071), // 45 | 0b001 | 000,025,230 cmplx (-0.7071, 0.7071), // 135 | 0b010 | 025,255,025 cmplx (0.0, 1.0), // 90 | 0b011 | 000,230,230 cmplx (0.7071, -0.7071), // 315 | 0b100 | 230,000,025 cmplx (0.0, -1.0), // 270 | 0b101 | 255,025,230 cmplx (-1.0, 0.0), // 180 | 0b110 | 230,255,025 cmplx (-0.7071, -0.7071) // 225 | 0b111 | 255,230,230 }; // Associated soft-symbols to be used with graymapped_8psk_pos[] constellation // These softbits have precalculated (a-priori) probabilities applied // Use of this table automatically Gray-decodes incoming symbols. static unsigned char graymapped_8psk_softbits[8][3] = { { 25, 0, 25}, // 0 { 0, 25, 230}, // 1 { 0, 230, 230}, // 3 { 25, 255, 25}, // 2 {230, 255, 25}, // 6 {255, 230, 230}, // 7 {255, 25, 230}, // 5 {230, 0, 25} // 4 }; // For Gray-mapped xPSK: // Even when the received phase is distorted by +- 1 phase-position: // - Only up to 1 bit can be in error static cmplx graymapped_xpsk_pos[] = { // Degrees Bits In cmplx (0.7071, 0.7071), // 45 | 0b00 cmplx (-0.7071, 0.7071), // 135 | 0b01 cmplx (0.7071, -0.7071), // 315 | 0b10 cmplx (-0.7071, -0.7071) // 225 | 0b11 }; // Associated soft-symbols to be used with graymapped_xpsk_pos[] constellation // Gray-coding of xPSK simply makes all probabilites equal. // Use of this table automatically Gray-decodes incoming symbols. static unsigned char graymapped_xpsk_softbits[4][2] = { {0,0}, // 0 {0,255}, // 1 {255,255}, // 3 {255,0}, // 2 }; // For Gray-mapped 16PSK: // Even when the received phase is distorted by +- 1 phase-position: // - Two of the bits are still known with 100% certianty. // - Only up to 1 bit can be in error static cmplx graymapped_16psk_pos[] = { cmplx (1.0, 0.0), // 0 degrees 0b0000 | 025,000,000,025 cmplx (0.9238, 0.3826), // 22.5 degrees 0b0001 | 000,000,025,230 cmplx (0.3826, 0.9238), // 67.5 degrees 0b0010 | 000,025,255,025 cmplx (0.7071, 0.7071), // 45 degrees 0b0011 | 000,000,230,230 cmplx (-0.9238, 0.3826), // 157.5 degrees 0b0100 | 025,255,000,025 cmplx (-0.7071, 0.7071), // 135 degrees 0b0101 | 000,255,025,230 cmplx (0.0, 1.0), // 90 degrees 0b0110 | 000,230,255,025 cmplx (-0.3826, 0.9238), // 112.5 degrees 0b0111 | 000,255,230,230 cmplx (0.9238, -0.3826), // 337.5 degrees 0b1000 | 230,000,000,025 cmplx (0.7071, -0.7071), // 315 degrees 0b1001 | 255,000,025,230 cmplx (0.0, -1.0), // 270 degrees 0b1010 | 255,025,255,025 cmplx (0.3826, -0.9238), // 292.5 degrees 0b1011 | 255,000,230,230 cmplx (-1.0, 0.0), // 180 degrees 0b1100 | 230,255,000,025 cmplx (-0.9238, -0.3826), // 202.5 degrees 0b1101 | 255,255,025,230 cmplx (-0.3826, -0.9238), // 247.5 degrees 0b1110 | 255,230,255,000 cmplx (-0.7071, -0.7071) // 225 degrees 0b1111 | 255,255,025,025 }; // Associated soft-symbols to be used with graymapped_16psk_pos[] constellation // These softbits have precalculated (a-priori) probabilities applied // Use of this table automatically Gray-decodes incoming symbols. static unsigned char graymapped_16psk_softbits[16][4] = { {025,000,000,025}, // 0 {000,000,025,230}, // 1 {000,000,230,230}, // 3 {000,025,255,025}, // 2 {000,230,255,025}, // 6 {000,255,230,230}, // 7 {000,255,025,230}, // 5 {025,255,000,025}, // 4 {230,255,000,025}, // 12 {255,255,025,230}, // 13 {255,255,025,025}, // 15 {255,230,255,000}, // 14 {255,025,255,025}, // 10 {255,000,230,230}, // 11 {255,000,025,230}, // 9 {230,000,000,025} // 8 }; char pskmsg[80]; void psk::tx_init() { for (int car = 0; car < numcarriers; car++) { phaseacc[car] = 0; prevsymbol[car] = cmplx (1.0, 0.0); } preamble = dcdbits; if (_pskr || _xpsk || _8psk || _16psk) { // MFSK based varicode instead of psk shreg = 1; shreg2 = 1; } else { shreg = 0; shreg2 = 0; } videoText(); // interleaver bitshreg = 0; symbols = 0; acc_symbols = 0; ovhd_symbols = 0; accumulated_bits = 0; if(_8psk && _puncturing) { enc->init(); Txinlv->flush(); } vphase = 0; maxamp = 0; if (mode == MODE_OFDM_500F || mode == MODE_OFDM_750F) { // || mode == MODE_OFDM_2000F) { enc->init(); Txinlv->flush(); } } void psk::rx_init() { for (int car = 0; car < numcarriers; car++) { phaseacc[car] = 0; prevsymbol[car] = cmplx (1.0, 0.0); } quality = cmplx (0.0, 0.0); if (_pskr || _xpsk || _8psk || _16psk) { // MFSK varicode instead of psk shreg = 1; shreg2 = 1; } else { shreg = 0; shreg2 = 0; } dcdshreg = 0; dcdshreg2 = 0; dcd = 0; bitclk = 0; freqerr = 0.0; if (mailserver && progdefaults.PSKmailSweetSpot) sigsearch = SIGSEARCH; else sigsearch = 0; put_MODEstatus(mode); resetSN_IMD(); afcmetric = 0.0; // interleaver, split incoming bit stream into two, one late by one bit rxbitstate = 0; fecmet = fecmet2 = 0; if (Rxinlv) Rxinlv->flush(); if (Rxinlv2) Rxinlv2->flush(); for (int i = 0; i < NUM_FILTERS; i++) { re_Gbin[i]->reset(); im_Gbin[i]->reset(); } } bool psk::viewer_mode() { if (mode == MODE_PSK31 || mode == MODE_PSK63 || mode == MODE_PSK63F || mode == MODE_PSK125 || mode == MODE_PSK250 || mode == MODE_PSK500 || mode == MODE_PSK125R || mode == MODE_PSK250R || mode == MODE_PSK500R || mode == MODE_QPSK31 || mode == MODE_QPSK63 || mode == MODE_QPSK125 || mode == MODE_QPSK250 || mode == MODE_QPSK500 ) return true; return false; } void psk::restart() { if (viewer_mode()) pskviewer->restart(mode); evalpsk->setbw(sc_bw); } void psk::init() { restart(); modem::init(); set_scope_mode(Digiscope::PHASE); initSN_IMD(); snratio = 1.0; imdratio = 0.001; rx_init(); set_freqlock(false); // re-lock modems after setting center-frequency. // if (mode == MODE_OFDM_2000F || mode == MODE_OFDM_2000) // set_freq(1325); // else if (mode == MODE_OFDM_3500) set_freq(2250); else if (mode == MODE_OFDM_500F || mode == MODE_OFDM_750F) set_freq(1500); else if (progdefaults.StartAtSweetSpot) set_freq(progdefaults.PSKsweetspot); else if (progStatus.carrier != 0) { set_freq(progStatus.carrier); #if !BENCHMARK_MODE progStatus.carrier = 0; #endif } else set_freq(wf->Carrier()); // if (mode == MODE_OFDM_2000 || mode == MODE_OFDM_2000F || mode == MODE_OFDM_3500) if (mode == MODE_OFDM_3500) set_freqlock(true); } psk::~psk() { if (tx_shape) delete [] tx_shape; if (imd_shape) delete [] imd_shape; if (enc) delete enc; if (dec) delete dec; // FEC 2nd Viterbi decoder if (dec2) delete dec2; for (int i = 0; i < MAX_CARRIERS; i++) { if (fir1[i]) delete fir1[i]; if (fir2[i]) delete fir2[i]; } if (e0_filt) delete e0_filt; if (e1_filt) delete e1_filt; if (e2_filt) delete e2_filt; if (e3_filt) delete e3_filt; for (int i = 0; i < NUM_FILTERS; i++) { delete re_Gbin[i]; delete im_Gbin[i]; } if (pskviewer) delete pskviewer; if (evalpsk) delete evalpsk; // Interleaver if (Rxinlv) delete Rxinlv; if (Rxinlv2) delete Rxinlv2; if (Txinlv) delete Txinlv; if (vestigial_sfft) delete vestigial_sfft; set_freqlock(false); } psk::psk(trx_mode pskmode) : modem() { enum FIR_TYPE {PSK_CORE, GMFSK, SINC}; FIR_TYPE fir_type = PSK_CORE; cap |= CAP_AFC | CAP_AFC_SR; mode = pskmode; // Set the defaults that are common to most modes samplerate = 8000; numcarriers = 1; separation = 1.4; _16psk = _8psk = _xpsk = _pskr = _qpsk = _disablefec = _puncturing = false; symbits = 1; flushlength = 0; int isize = 2; idepth = 2; PSKviterbi = false; vestigial = false; switch (mode) { case MODE_PSK31: symbollen = 256; dcdbits = 32; fir_type = PSK_CORE; break; case MODE_PSK63: symbollen = 128; dcdbits = 64; fir_type = PSK_CORE; break; case MODE_PSK125: symbollen = 64; dcdbits = 128; fir_type = SINC; break; case MODE_PSK250: symbollen = 32; dcdbits = 256; fir_type = SINC; break; case MODE_PSK500: symbollen = 16; dcdbits = 512; fir_type = SINC; break; case MODE_PSK1000: symbollen = 8; dcdbits = 128; fir_type = SINC; break; case MODE_QPSK31: symbollen = 256; _qpsk = true; dcdbits = 32; cap |= CAP_REV; fir_type = PSK_CORE; break; case MODE_QPSK63: symbollen = 128; _qpsk = true; dcdbits = 64; cap |= CAP_REV; fir_type = PSK_CORE; break; case MODE_QPSK125: symbollen = 64; _qpsk = true; dcdbits = 128; cap |= CAP_REV; fir_type = SINC; break; case MODE_QPSK250: symbollen = 32; _qpsk = true; dcdbits = 256; cap |= CAP_REV; fir_type = SINC; break; case MODE_QPSK500: symbollen = 16; _qpsk = true; dcdbits = 512; cap |= CAP_REV; fir_type = SINC; break; case MODE_PSK63F: // As per Multipsk (BPSK63 + FEC + MFSK Varicode) symbollen = 128; _pskr = true; dcdbits = 64; fir_type = PSK_CORE; break; // OFDM modes case MODE_OFDM_500F: // 62.5 baud xPSK | 4 carriers | 250 bits/sec @ 1/2 FEC symbollen = 256; samplerate = 16000; _xpsk = true; _disablefec = false; _puncturing = false; numcarriers = 4; separation = 2.0f; idepth = 2000; // 4000 milliseconds flushlength = 200; dcdbits = 192; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_OFDM_750F: // 125 baud 8PSK | 3 carriers | 562 bits/sec @ 1/2 FEC symbollen = 128; samplerate = 16000; _8psk = true; _disablefec = false; _puncturing = false; numcarriers = 3; separation = 2.0f; idepth = 3600; // 3200 milliseconds flushlength = 360; dcdbits = 384; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; // case MODE_OFDM_2000F: // 125 baud 8PSK | 8 carriers | 2000 bits/sec @ 2/3 FEC // symbollen = 128; // samplerate = 16000; // _8psk = true; // _disablefec = false; // _puncturing = true; // numcarriers = 8; // separation = 2.0f; // idepth = 4800; // 1600 milliseconds // flushlength = 480; // dcdbits = 1536; // vestigial = true; // cap |= CAP_REV; // fir_type = SINC; // break; // case MODE_OFDM_2000: // 250 baud 8PSK | 4 carriers | 3000 bits/sec NO FEC // symbollen = 64; // samplerate = 16000; // _8psk = true; // _disablefec = true; // numcarriers = 4; // separation = 2.0f; // dcdbits = 1536; // vestigial = true; // cap |= CAP_REV; // fir_type = SINC; // break; case MODE_OFDM_3500: // 250 baud 8PSK | 7 carriers | 5250 bits/sec NO FEC symbollen = 64; samplerate = 16000; _8psk = true; _disablefec = true; numcarriers = 7; separation = 2.0f; dcdbits = 1536; vestigial = false; cap |= CAP_REV; fir_type = SINC; break; // End OFDM modes // 8psk modes without FEC case MODE_8PSK125: // 125 baud | 375 bits/sec No FEC symbollen = 128; samplerate = 16000; _8psk = true; _disablefec = true; dcdbits = 128; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK250: // 250 baud | 750 bits/sec No FEC symbollen = 64; samplerate = 16000; _8psk = true; _disablefec = true; dcdbits = 256; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK500: // 500 baud | 1500 bits/sec No FEC symbollen = 32; samplerate = 16000; _8psk = true; _disablefec = true; dcdbits = 512; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK1000: // 1000 baud | 3000 bits/sec No FEC symbollen = 16; samplerate = 16000; _8psk = true; _disablefec = true; dcdbits = 1024; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; // 8psk modes with FEC case MODE_8PSK125FL: // 125 baud | 187 bits/sec @ 1/2 Rate K=13 FEC symbollen = 128; idepth = 384; // 2048 milliseconds flushlength = 55; samplerate = 16000; _8psk = true; dcdbits = 128; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK250FL: // 250 baud | 375 bits/sec @ 1/2 Rate K=13 FEC symbollen = 64; idepth = 512; // 1365 milliseconds flushlength = 65; samplerate = 16000; _8psk = true; dcdbits = 256; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK125F: // 125 baud | 187 bits/sec @ 1/2 Rate K=16 FEC symbollen = 128; idepth = 384; // 2048 milliseconds flushlength = 55; samplerate = 16000; _8psk = true; dcdbits = 128; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK250F: // 250 baud | 375 bits/sec @ 1/2 Rate K=16 FEC symbollen = 64; idepth = 512; // 1365 milliseconds flushlength = 65; samplerate = 16000; _8psk = true; dcdbits = 256; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK500F: // 500 baud | 1000 bits/sec @ 2/3 rate K=13 FEC symbollen = 32; idepth = 640; // 426 milliseconds flushlength = 80; samplerate = 16000; _8psk = true; _puncturing = true; dcdbits = 512; vestigial = true; cap |= CAP_REV; fir_type = SINC; break; case MODE_8PSK1000F: // 1000 baud | 2000 bits/sec @ 2/3 rate K=7 FEC symbollen = 16; idepth = 512; // 170 milliseconds flushlength = 120; samplerate = 16000; _8psk = true; dcdbits = 1024; cap |= CAP_REV; _puncturing = true; vestigial = true; PSKviterbi = true; fir_type = SINC; break; case MODE_8PSK1200F: // 1200 baud | 2400 bits/sec @ 2/3 rate K=7 FEC symbollen = 13; idepth = 512; // 142 milliseconds flushlength = 175; samplerate = 16000; _8psk = true; _puncturing = true; dcdbits = 2048; cap |= CAP_REV; vestigial = true; PSKviterbi = true; fir_type = SINC; break; // end 8psk modes case MODE_PSK125R: symbollen = 64; _pskr = true; dcdbits = 128; idepth = 40; // 2x2x40 interleaver fir_type = SINC; break; case MODE_PSK250R: symbollen = 32; _pskr = true; dcdbits = 256; idepth = 80; // 2x2x80 interleaver fir_type = SINC; break; case MODE_PSK500R: symbollen = 16; _pskr = true; dcdbits = 512; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_PSK1000R: symbollen = 8; _pskr = true; dcdbits = 512; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; // multi-carrier modems case MODE_4X_PSK63R: symbollen = 128;//PSK63 dcdbits = 128; _pskr = true;//PSKR numcarriers = 4; idepth = 80; // 2x2x80 interleaver fir_type = SINC; break; case MODE_5X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _pskr = true; //PSKR numcarriers = 5; idepth = 260; // 2x2x160 interleaver fir_type = SINC; break; case MODE_10X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _pskr = true; //PSKR numcarriers = 10; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_20X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _pskr = true; //PSKR numcarriers = 20; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_32X_PSK63R: symbollen = 128; //PSK63 dcdbits = 512; _pskr = true; //PSKR numcarriers = 32; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_4X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 4; idepth = 80; // 2x2x80 interleaver fir_type = SINC; break; case MODE_5X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 5; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_10X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 10; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_12X_PSK125: symbollen = 64;//PSK125 dcdbits = 128;//512; numcarriers = 12; fir_type = SINC; break; case MODE_12X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 12; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_16X_PSK125R: symbollen = 64;//PSK125 dcdbits = 512; _pskr = true;//PSKR numcarriers = 16; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_2X_PSK250R: symbollen = 32;//PSK250 dcdbits = 512; _pskr = true;//PSKR numcarriers = 2; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_3X_PSK250R: symbollen = 32;//PSK250 dcdbits = 512; _pskr = true;//PSKR numcarriers = 3; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_5X_PSK250R: symbollen = 32;//PSK250 _pskr = true;//PSKR dcdbits = 1024; numcarriers = 5; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_6X_PSK250: symbollen = 32;//PSK250 dcdbits = 512; numcarriers = 6; fir_type = SINC; break; case MODE_6X_PSK250R: symbollen = 32;//PSK250 _pskr = true;//PSKR dcdbits = 1024; numcarriers = 6; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_7X_PSK250R: symbollen = 32;//PSK250 _pskr = true;//PSKR dcdbits = 1024; numcarriers = 7; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_2X_PSK500: symbollen = 16; dcdbits = 512; numcarriers = 2; fir_type = SINC; break; case MODE_4X_PSK500: symbollen = 16; dcdbits = 512; numcarriers = 4; fir_type = SINC; break; case MODE_2X_PSK500R: symbollen = 16; _pskr = true; dcdbits = 1024; idepth = 160; // 2x2x160 interleaver numcarriers = 2; fir_type = SINC; break; case MODE_3X_PSK500R: symbollen = 16; _pskr = true; dcdbits = 1024; idepth = 160; // 2x2x160 interleaver numcarriers = 3; fir_type = SINC; break; case MODE_4X_PSK500R: symbollen = 16; _pskr = true; dcdbits = 1024; idepth = 160; // 2x2x160 interleaver numcarriers = 4; fir_type = SINC; break; case MODE_2X_PSK800: symbollen = 10; _pskr = false; dcdbits = 512; numcarriers = 2; fir_type = SINC; break; case MODE_2X_PSK800R: symbollen = 10; _pskr = true; dcdbits = 1024; idepth = 160; // 2x2x160 interleaver numcarriers = 2; fir_type = SINC; break; case MODE_2X_PSK1000: symbollen = 8;//PSK1000 dcdbits = 1024; numcarriers = 2; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; case MODE_2X_PSK1000R: symbollen = 8;//PSK1000 _pskr = true;//PSKR dcdbits = 1024; numcarriers = 2; idepth = 160; // 2x2x160 interleaver fir_type = SINC; break; default: mode = MODE_PSK31; symbollen = 256; dcdbits = 32; numcarriers = 1; fir_type = PSK_CORE; } // Set the number of bits-per-symbol based on the chosen constellation if (_qpsk || _xpsk) symbits = 2; else if (_8psk) symbits = 3; else if (_16psk) symbits = 4; else symbits = 1; // else BPSK / PSKR //printf("%s: symlen %d, dcdbits %d, _qpsk %d, _pskr %d, numc %f\n", //mode_info[mode].sname, //symbollen, dcdbits, _qpsk, _pskr, numcarriers); enc = (encoder *)0; dec = (viterbi *)0; // BPSK+FEC - 2nd Viterbi decoder and de-interleaver dec2 = (viterbi *)0; Txinlv = (interleave *)0; Rxinlv = (interleave *)0; Rxinlv2 = (interleave *)0; vestigial_sfft = (sfft *)0; // create impulse response for experimental FIR filters double fir1c[FIRLEN+1]; double fir2c[FIRLEN+1]; for (int i = 0; i < MAX_CARRIERS; i++) { if (i < numcarriers) { fir1[i] = new C_FIR_filter(); fir2[i] = new C_FIR_filter(); } else { fir1[i] = (C_FIR_filter *)0; fir2[i] = (C_FIR_filter *)0; } } switch (fir_type) { case PSK_CORE: // PSKcore filter raisedcosfilt(fir1c, FIRLEN); for (int i = 0; i <= FIRLEN; i++) fir2c[i] = pskcore_filter[i]; for (int i = 0; i < numcarriers; i++) { fir1[i]->init(FIRLEN+1, symbollen > 15 ? symbollen / 16 : 1, fir1c, fir1c); fir2[i]->init(FIRLEN+1, 1, fir2c, fir2c); } break; default: case SINC: // fir1c & fir2c matched sin(x)/x filter w blackman wsincfilt(fir1c, 1.0 / symbollen, FIRLEN); wsincfilt(fir2c, 1.0 / 16.0, FIRLEN); for (int i = 0; i < numcarriers; i++) { fir1[i]->init(FIRLEN, symbollen > 15 ? symbollen / 16 : 1, fir1c, fir1c); fir2[i]->init(FIRLEN, 1, fir2c, fir2c); } break; } e0_filt = new Cmovavg(dcdbits / 2); e1_filt = new Cmovavg(dcdbits / 2); e2_filt = new Cmovavg(dcdbits / 2); e3_filt = new Cmovavg(dcdbits / 2); re_Gbin[0] = new goertzel(160, 0, 500.0); // base re_Gbin[1] = new goertzel(160, 15.625, 500.0); // fundamental re_Gbin[2] = new goertzel(160, 62.5, 500.0); // 4th harmonic (noise) re_Gbin[3] = new goertzel(160, 46.875, 500.0); // 3rd harmonic (imd) im_Gbin[0] = new goertzel(160, 0, 500.0); // base im_Gbin[1] = new goertzel(160, 15.625, 500.0); // fundamental im_Gbin[2] = new goertzel(160, 62.5, 500.0); // 4th harmonic (noise) im_Gbin[3] = new goertzel(160, 46.875, 500.0); // 3rd harmonic (imd) // If no FEC used, these just stay NULL enc = NULL; dec = dec2 = NULL; if (_qpsk) { enc = new encoder(K, POLY1, POLY2); dec = new viterbi(K, POLY1, POLY2); } else if (_pskr || PSKviterbi) { // FEC for BPSK. Use a 2nd Viterbi decoder for comparison. // Set decode size to 4 since some characters can be as small // as 3 bits long. This minimises intercharacters decoding // interactions. enc = new encoder(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec->setchunksize(4); dec2 = new viterbi(PSKR_K, PSKR_POLY1, PSKR_POLY2); dec2->setchunksize(4); } else if (mode == MODE_8PSK125F || mode == MODE_8PSK250F) { enc = new encoder(K16, K16_POLY1, K16_POLY2); dec = new viterbi(K16, K16_POLY1, K16_POLY2); dec->setchunksize(4); dec2 = new viterbi(K16, K16_POLY1, K16_POLY2); dec2->setchunksize(4); } else if (mode == MODE_OFDM_500F) { enc = new encoder(THOR_K15, K15_POLY1, K15_POLY2); dec = new viterbi(THOR_K15, K15_POLY1, K15_POLY2); dec->setchunksize(4); dec->settraceback(THOR_K15 * 10); // } else if (mode == MODE_OFDM_2000F) { // enc = new encoder(K11, K11_POLY1, K11_POLY2); // dec = new viterbi(K11, K11_POLY1, K11_POLY2); // dec->setchunksize(4); // dec->settraceback(K11 * 14); // OFDM-2000F is a punctured code } else if (_xpsk || _8psk || _16psk) { enc = new encoder(K13, K13_POLY1, K13_POLY2); dec = new viterbi(K13, K13_POLY1, K13_POLY2); dec->setchunksize(4); // Second viterbi decoder is only needed when modem has an odd number of bits/symbol. if ( _8psk && !_puncturing ) { // (punctured 8psk has 3-real bits + 1-punctured bit per transmitted symbol) dec2 = new viterbi(K13, K13_POLY1, K13_POLY2); dec2->setchunksize(4); } if (_puncturing) { // punctured codes benefit from a longer traceback dec->settraceback(K13 * 16); if (dec2) dec2->settraceback(K13 * 16); } else { dec->settraceback(K13 * 10); if (dec2) dec2->settraceback(K13 * 10); } } // Interleaver. For PSKR to maintain constant time delay between bits, // we double the number of concatenated square iterleavers for // each doubling of speed: 2x2x20 for BSK63+FEC, 2x2x40 for // BPSK125+FEC, etc.. Txinlv = new interleave (isize, idepth, INTERLEAVE_FWD); Rxinlv = new interleave (isize, idepth, INTERLEAVE_REV); if (dec2) Rxinlv2 = new interleave (isize, idepth, INTERLEAVE_REV); bitshreg = 0; rxbitstate = 0; tx_shape = new double[symbollen]; imd_shape = new double[symbollen]; // raised cosine shape for the transmitter double sym_ph = 0; for ( int i = 0; i < symbollen; i++) { sym_ph = i * M_PI / symbollen; tx_shape[i] = 0.5 * cos(sym_ph) + 0.5; imd_shape[i] = 0.5 * ( cos(3.0 * sym_ph) + (3.0/5.0) * cos(5.0 * sym_ph) + (3.0/7.0) * cos(7.0 * sym_ph) + (3.0/9.0) * cos(9.0 * sym_ph) ); } fragmentsize = symbollen; sc_bw = samplerate / symbollen; //JD added for multiple carriers inter_carrier = separation * sc_bw; bandwidth = sc_bw * ( 1 + separation * (numcarriers - 1)); snratio = s2n = imdratio = imd = 0; if (mailserver && progdefaults.PSKmailSweetSpot) sigsearch = SIGSEARCH; else sigsearch = 0; for (int i = 0; i < 16; i++) syncbuf[i] = 0.0; // E1 = E2 = E3 = 0.0; acquire = 0; evalpsk = new pskeval; if (viewer_mode()) pskviewer = new viewpsk(evalpsk, mode); else pskviewer = 0; if (vestigial) { if (samplerate == 16000) sfft_size = 16384; else sfft_size = 8192; int bin = sc_bw * sfft_size / samplerate; vestigial_sfft = new sfft(sfft_size, bin - 5, bin + 6); // 11 bins for (int i = 0; i < 11; i++) sfft_bins[i] = cmplx(0,0); } // if (mode == MODE_OFDM_2000 || mode == MODE_OFDM_2000F) { // set_freqlock(false); // set_freq(1325); // set_freqlock(true); // } else if (mode == MODE_OFDM_3500) { set_freqlock(false); set_freq(2250); set_freqlock(true); } } //============================================================================= //=========================== psk31 receive routines ========================== //============================================================================= void psk::s2nreport(void) { modem::s2nreport(); s2n_sum = s2n_sum2 = s2n_ncount = 0.0; } void psk::rx_bit(int bit) { int c; bool do_s2nreport = false; shreg = (shreg << 1) | !!bit; if (_pskr || _xpsk || _8psk || _16psk) { // MFSK varicode instead of PSK Varicode if ((shreg & 7) == 1) { c = varidec(shreg >> 1); // Voting at the character level if (fecmet >= fecmet2 || _disablefec) { if ((c != -1) && (c != 0) && (dcd == true)) { put_rx_char(c); do_s2nreport = true; } } shreg = 1; } } else { // PSK varicode if ((shreg & 3) == 0) { c = psk_varicode_decode(shreg >> 2); if ((c != -1) && (dcd == true)) { put_rx_char(c); do_s2nreport = true; } shreg = 0; } } if (do_s2nreport) { if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount ++; if (c == EOT) s2nreport(); } } } void psk::rx_bit2(int bit) { int c; bool do_s2nreport = false; shreg2 = (shreg2 << 1) | !!bit; // MFSK varicode instead of PSK Varicode if ((shreg2 & 7) == 1) { c = varidec(shreg2 >> 1); // Voting at the character level for only PSKR modes if (fecmet < fecmet2 || _disablefec) { if ((c != -1) && (c != 0) && (dcd == true)) { put_rx_char(c); do_s2nreport = true; } } shreg2 = 1; } if (do_s2nreport) { if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { s2n_sum += s2n_metric; s2n_sum2 += (s2n_metric * s2n_metric); s2n_ncount ++; if (c == EOT) s2nreport(); } } } void psk::rx_qpsk(int bits) { unsigned char sym[2]; int c; if (_qpsk && !reverse) bits = (4 - bits) & 3; sym[0] = (bits & 1) ? 255 : 0; sym[1] = (bits & 2) ? 0 : 255; // top bit is flipped //JD added de-interleaver // Rxinlv->symbols(sym); c = dec->decode(sym, NULL); if (c != -1) { rx_bit(c & 0x80); rx_bit(c & 0x40); rx_bit(c & 0x20); rx_bit(c & 0x10); rx_bit(c & 0x08); rx_bit(c & 0x04); rx_bit(c & 0x02); rx_bit(c & 0x01); } } void psk::rx_pskr(unsigned char symbol) { int met; unsigned char twosym[2]; unsigned char tempc; int c; //In the case of multiple carriers, if even number of carriers then we // know the bit-order and don't need voting otherwise // we accumulate the soft bits for the interleaver THEN submit to Viterbi // decoder in alternance so that each one is processed one bit later. // Only two possibilities for sync: current bit or previous one since // we encode with R = 1/2 and send encoded bits one after the other // through the interleaver. symbolpair[1] = symbolpair[0]; symbolpair[0] = symbol; if (rxbitstate == 0) { rxbitstate++; //Only use one decoder is using even carriers (we know the bits order) // if (((int)numcarriers) % 2 == 0) { // fecmet2 = -9999.0; // return; // } // XPSK and 16PSK have even number of bits/symbol // Punctured 8PSK has even number of bits/symbol (3 real + 1 punctured) // so bit order known: can use only one decoder to reduce CPU usage if ( _xpsk || _16psk || (_8psk && _puncturing) ) { fecmet2 = -9999.0; return; } // copy to avoid scrambling symbolpair for the next bit twosym[0] = symbolpair[0]; twosym[1] = symbolpair[1]; // De-interleave if (mode != MODE_PSK63F) Rxinlv2->symbols(twosym); // pass de-interleaved bits pair to the decoder, reversed tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = dec2->decode(twosym, &met); if (c != -1) { // FEC only take metric measurement after backtrace // Will be used for voting between the two decoded streams fecmet2 = decayavg(fecmet2, met, 20); rx_bit2(c & 0x08); rx_bit2(c & 0x04); rx_bit2(c & 0x02); rx_bit2(c & 0x01); } } else { // Again for the same stream shifted by one bit rxbitstate = 0; twosym[0] = symbolpair[0]; twosym[1] = symbolpair[1]; // De-interleave if (mode != MODE_PSK63F) Rxinlv->symbols(twosym); tempc = twosym[1]; twosym[1] = twosym[0]; twosym[0] = tempc; // Then viterbi decoder c = dec->decode(twosym, &met); if (c != -1) { fecmet = decayavg(fecmet, met, 20); rx_bit(c & 0x08); rx_bit(c & 0x04); rx_bit(c & 0x02); rx_bit(c & 0x01); } } } void psk::searchDown() { double srchfreq = frequency - sc_bw * 2; double minfreq = sc_bw * 2; double spwr, npwr; while (srchfreq > minfreq) { spwr = wf->powerDensity(srchfreq, sc_bw); npwr = wf->powerDensity(srchfreq + sc_bw, sc_bw/2) + 1e-10; if (spwr / npwr > pow(10, progdefaults.ServerACQsn / 10)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq -= sc_bw; } } void psk::searchUp() { double srchfreq = frequency + sc_bw * 2; double maxfreq = IMAGE_WIDTH - sc_bw * 2; double spwr, npwr; while (srchfreq < maxfreq) { spwr = wf->powerDensity(srchfreq, sc_bw/2); npwr = wf->powerDensity(srchfreq - sc_bw, sc_bw/2) + 1e-10; if (spwr / npwr > pow(10, progdefaults.ServerACQsn / 10)) { frequency = srchfreq; set_freq(frequency); sigsearch = SIGSEARCH; break; } srchfreq += sc_bw; } } int waitcount = 0; void psk::findsignal() { put_Status1(""); put_Status2(""); put_status(""); int ftest, f1, f2; if (sigsearch > 0) { sigsearch--; if (mailserver) { // mail server search algorithm if (progdefaults.PSKmailSweetSpot) { f1 = (int)(progdefaults.ServerCarrier - progdefaults.ServerOffset); f2 = (int)(progdefaults.ServerCarrier + progdefaults.ServerOffset); } else { f1 = (int)(frequency - progdefaults.ServerOffset); f2 = (int)(frequency + progdefaults.ServerOffset); } if (evalpsk->sigpeak(ftest, f1, f2) > pow(10, progdefaults.ServerACQsn / 10) ) { if (progdefaults.PSKmailSweetSpot) { if (abs(ftest - progdefaults.ServerCarrier) < progdefaults.ServerOffset) { frequency = ftest; set_freq(frequency); freqerr = 0.0; } else { frequency = progdefaults.ServerCarrier; set_freq(frequency); freqerr = 0.0; } } else { frequency = ftest; set_freq(frequency); freqerr = 0.0; } } else { // less than the detection threshold if (progdefaults.PSKmailSweetSpot) { frequency = progdefaults.ServerCarrier; set_freq(frequency); sigsearch = SIGSEARCH; } } } else { // normal signal search algorithm f1 = (int)(frequency - progdefaults.SearchRange/2); f2 = (int)(frequency + progdefaults.SearchRange/2); resetSN_IMD(); if (evalpsk->sigpeak(ftest, f1, f2) > pow(10, progdefaults.ACQsn / 10.0) ) { frequency = ftest; set_freq(frequency); freqerr = 0.0; sigsearch = 0; acquire = dcdbits; } } } } //DHF: AFC based on vestigial carrier located at f0 - bandwidth void psk::vestigial_afc() { if (!vestigial) return; if (!vestigial_sfft->is_stable()) return; double avg = 0; double max = 0; int i = -1; static int previous1 = -1; static int previous2 = -2; for (i = 0; i < 11; i++) avg += abs(sfft_bins[i]); avg /= 11.0; // No real signal present: ignore AFC, reset, and return if (avg == 0.0f) { vestigial_sfft->reset(); return; } std::setprecision(2); std::setw(5); for (int k = 0; k < 11; k++) { if (abs(sfft_bins[k]) > max) { max = abs(sfft_bins[k]); i = k; } } // Validity-check the AFC: must see same tone twice in a row, // and previous tones must be within 1Hz of each other. // Operates with 1hz/sec drift-rates if ( i != previous1 || abs(previous1-previous2) > 1 ) { previous2 = previous1; previous1 = i; vestigial_sfft->reset(); return; } if (i < 11 && i > -1) { if (i != 5) { frequency -= 1.0*(i-5)*samplerate/sfft_size; set_freq (frequency); } } previous2 = previous1; previous1 = i; vestigial_sfft->reset(); } //JD: disable for multiple carriers as we are running as modem and // therefore use other strategies for frequency alignment like RSID void psk::phaseafc() { double error; // Skip AFC for modes it does not work with if (vestigial) return vestigial_afc(); if (afcmetric < 0.05 || mode == MODE_PSK500 || mode == MODE_QPSK500 || numcarriers > 1) return; error = (phase - bits * M_PI / 2.0); if (error < -M_PI / 2.0 || error > M_PI / 2.0) return; error *= samplerate / (TWOPI * symbollen); if (fabs(error) < sc_bw ) { freqerr = error / dcdbits; frequency -= freqerr; if (mailserver) { if (frequency < progdefaults.ServerCarrier - progdefaults.ServerAFCrange) frequency = progdefaults.ServerCarrier - progdefaults.ServerAFCrange; if (frequency > progdefaults.ServerCarrier + progdefaults.ServerAFCrange) frequency = progdefaults.ServerCarrier + progdefaults.ServerAFCrange; } set_freq (frequency); } if (acquire) acquire--; } void psk::afc() { if (mode >= MODE_OFDM_500F && mode <= MODE_OFDM_3500) // MODE_OFDM_2000) return vestigial_afc(); else if (!progStatus.afconoff) return; else if (dcd == true || acquire) phaseafc(); } void psk::rx_symbol(cmplx symbol, int car) { int n; unsigned char softbit = 0; double softangle; double softamp; double sigamp = norm(symbol); static double averageamp; phase = arg ( conj(prevsymbol[car]) * symbol ); prevsymbol[car] = symbol; /// align the RX constellation to the TX constellation, for Non-FEC modes if (_disablefec && (_16psk || _8psk || _xpsk )) phase -= M_PI; if (phase < 0) phase += TWOPI; if (_qpsk) { n = 4; bits = ((int) (phase / M_PI_2 + 0.5)) & (n-1); } else if (_xpsk) { n = 4; bits = ((int) (phase / M_PI_2)) & (n-1); } else if (_8psk) { n = 8; bits = ((int) (phase / (M_PI/4.0) + 0.5)) & (n-1); } else if (_16psk) { n = 16; bits = ((int) (phase / (M_PI/8.0) + 0.5)) & (n-1); } else { // bpsk and pskr n = 2; bits = (((int) (phase / M_PI + 0.5)) & (n-1) ) << 1; // hard decode if needed // softbit = (bits & 2) ? 0 : 255; // reversed as we normally pass "!bits" when hard decoding averageamp = decayavg(averageamp, sigamp, SQLDECAY); if (sigamp > 0 && averageamp > 0) { if (sigamp > averageamp) { softamp = clamp( sqrt(sigamp / averageamp), 1.0, 1e6); } else { softamp = clamp( sqrt(averageamp / sigamp), 1.0, 1e6); } } else { softamp = 2; // arbritary number (50% impact) } // Compute values between -128 and +127 for phase value only double alpha = phase / M_PI; if (alpha > 1.0) alpha = 2.0 - alpha; softangle = 127.0 - 255.0 * alpha; softbit = (unsigned char) ((softangle / ( 1.0 + softamp / 2.0)) + 128); } // Only update phase_quality once every dcdbits/4 function-calls static int counter=0; if (counter++ > dcdbits/4) { counter = 0; // Calculate how far the phase/constellation is off from perfect, on a scale of 0-100 double PhaseOffset = (phase * 180.0 / M_PI) / (360.0/n); PhaseOffset -= (int)PhaseOffset; // cutoff integer, leave just the decimal part if (_xpsk) PhaseOffset += 0.5; // xPSK constellation is offset by 45degrees. adjust calculations to compensate if (PhaseOffset > 0.5) // fix the wraparound issue PhaseOffset = 1.0 - PhaseOffset; int phase_quality= (int)(100 - PhaseOffset * 200); // Save the phase_quality to a global for later display // Adjust the phase-error for non 8psk modes if (n == 2) // bpsk, pskr phase_quality *= 1.25; if (phase_quality > 100) phase_quality = 100; else if (phase_quality < 0) phase_quality = 0; update_quality(phase_quality); } // simple low pass filter for quality of signal double decay = SQLDECAY; double attack = SQLDECAY; double cval = cos(n*phase); double sval = sin(n*phase); if (_8psk) { attack *= 2; decay *= 4; } if (_pskr) { decay *= 10; quality = cmplx( decayavg(quality.real(), cval, decay), decayavg(quality.imag(), sval, decay)); } else quality = cmplx( decayavg(quality.real(), cval, cval > quality.real() ? attack : decay), decayavg(quality.imag(), sval, sval > quality.real() ? attack : decay)); metric = 100.0 * norm(quality); if (_pskr && (averageamp < 3e-5)) metric = 0; if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) { //s2n reporting: rescale depending on mode, clip after scaling if (_pskr) s2n_metric = metric * 1.5 + 8; else s2n_metric = metric; s2n_metric = CLAMP(s2n_metric, 0.0, 100.0); } // FEC: adjust squelch for extra sensitivity. // Otherwise we miss good characters // *********************************************************** // **** DHF still needed with attack/decay filtering? // *********************************************************** // if (_pskr) { // metric = metric * 4; // } // else if ( (_xpsk || _8psk || _16psk) && !_disablefec) { // metric *= 2 * symbits; /// @TODO scale the metric with the psk constellation density // } if (metric > 100) metric = 100; afcmetric = decayavg(afcmetric, norm(quality), 50); dcdshreg = ( dcdshreg << (symbits+1) ) | bits; int set_dcd = -1; // 1 sets DCD on ; 0 sets DCD off ; -1 does neither (no-op) static int dcdOFFcounter=0; // to prevent a data loss bug... only set DCD-off when correct shreg bitpattern seen multiple times. switch (dcdshreg) { // bpsk DCD ON case 0xAAAAAAAA: if (_xpsk || _8psk || _16psk) break; if (_pskr) break; set_dcd = 1; break; // pskr DCD ON // the pskr FEC pipeline is flushed with an alternating 1/0 pattern, giving 4 possible DCD-ON sequences. case 0x0A0A0A0A: case 0x28282828: case 0xA0A0A0A0: case 0x82828282: if (!_pskr) break; set_dcd = 1; break; // xpsk DCD OFF case 0x92492492: if (_qpsk) break; // the QPSK preamble and postamble are identical... Since cant differentiate, QPSK modes do not use DCD if (!_xpsk) break; if (!_disablefec) break; // xPSK with FEC-enabled does not use DCD-OFF set_dcd = 0; break; // 8psk DCD OFF case 0x44444444: if (!_8psk) break; if (!_disablefec) break; // 8psk with FEC-enabled does not use DCD-OFF set_dcd = 0; break; // 16psk DCD OFF case 0x10842108: if (!_16psk) break; if (!_disablefec) break; // 16psk with FEC-enabled does not use DCD-OFF set_dcd = 0; break; // bpsk DCD OFF // 8psk & xpsk DCD ON case 0x00000000: if (_pskr) break; // pskr does not use DCD-OFF if (_16psk) break; // TODO: 16psk dcd on/off unimplemented if (_8psk || _xpsk) { set_dcd = 1; break; } set_dcd = 0; break; default: if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) { dcd = true; // FIXME BUG OFDM FEC modes have NO DCD OFF yet. TODO KL4YFD MAR2021 } else if (mode != MODE_OFDM_500F && mode != MODE_OFDM_750F) { // && mode != MODE_OFDM_2000F) { dcd = false; } dcdOFFcounter -= 1; // If no DCD-off sequence seen in bitshreg, then subtract 1 from counter (to prevent a accumulative-triggering bug) if (dcdOFFcounter < 0) dcdOFFcounter = 0; // prevent wraparound to negative break; } //printf("\n%08x", dcdshreg); // Set DCD to ON if ( 1 == set_dcd ) { dcdOFFcounter = 0; dcd = true; acquire = 0; quality = cmplx (1.0, 0.0); if (progdefaults.Pskmails2nreport && (mailserver || mailclient)) s2n_sum = s2n_sum2 = s2n_ncount = 0.0; //printf("\t DCD ON!!"); // Set DCD to OFF only if seen 6 bit-shifts in a row. (prevent false-triggers and data loss mid-stream) } else if ( 0 == set_dcd ) { if (++dcdOFFcounter > 5) { dcdOFFcounter = 0; dcd = false; acquire = 0; quality = cmplx (0.0, 0.0); //printf("\t DCD OFF!!!!!!!!!"); } } if (_pskr) { rx_pskr(softbit); set_phase(phase, norm(quality), dcd); } else if (dcd == true) { set_phase(phase, norm(quality), dcd); if (!_disablefec && (_16psk || _8psk || _xpsk) ) { int bitmask = 1; unsigned char xsoftsymbols[symbits]; if (_puncturing && _16psk) // 16psk: recover 3/4-rate punctured low-bit rx_pskr(128); // Soft-decode of Gray-mapped 8psk if (_8psk) { bool softpuncture = false; static double lastphasequality=0; double phasequality = fabs(cos( n/2 * phase)); phasequality = (phasequality + lastphasequality) / 2; // Differential modem: average probabilities between current and previous symbols lastphasequality = phasequality; int soft_qualityerror = static_cast(128 - (128 * phasequality)) ; if (soft_qualityerror > 255-25) // Prevent soft-bit wrap-around (crossing of value 128) softpuncture = true; else if (soft_qualityerror < 128/3) // First 1/3 of phase delta is considered a perfect signal soft_qualityerror = 0; else if (soft_qualityerror > 128 - (128/8) ) // Last 1/8 of phase delta triggers a puncture softpuncture = true; else soft_qualityerror /= 2; // Scale the FEC error to prevent premature cutoff if (softpuncture) { for(int i=0; i(bits); for(int i=symbits-1; i>=0; i--) { // Use predefined Gray-mapped softbits for soft-decoding if (graymapped_8psk_softbits[bitindex][i] > 128) // Soft-One rx_pskr( (graymapped_8psk_softbits[bitindex][i]) - soft_qualityerror ); else // Soft-Zero rx_pskr( (graymapped_8psk_softbits[bitindex][i]) + soft_qualityerror ); } } } else if (_xpsk) { bool softpuncture = false; static double lastphasequality=0; double phasequality = fabs(cos( n/2 * phase)); phasequality = (phasequality + lastphasequality) / 2; // Differential modem: average probabilities between current and previous symbols lastphasequality = phasequality; int soft_qualityerror = static_cast(128 * phasequality); if (soft_qualityerror > 255-12) // Prevent soft-bit wrap-around (crossing of value 128) softpuncture = true; else if (soft_qualityerror < 128/3) // First 1/3 of phase delta is considered a perfect signal soft_qualityerror = 0; else if (soft_qualityerror > 128 - (128/8) ) // Last 1/8 of phase delta triggers a puncture softpuncture = true; else soft_qualityerror /= 2; // Scale the FEC error to prevent premature cutoff if (softpuncture) { for(int i=0; i(bits); for(int i=symbits-1; i>=0; i--) { // Use predefined Gray-mapped softbits for soft-decoding if (graymapped_xpsk_softbits[bitindex][i] > 128) // soft-one rx_pskr(graymapped_xpsk_softbits[bitindex][i] - soft_qualityerror); // Feed to the PSKR FEC decoder, one bit at a time. else // soft-zero rx_pskr(graymapped_xpsk_softbits[bitindex][i] + soft_qualityerror); // Feed to the PSKR FEC decoder, one bit at a time. } } } else if (_16psk) { bool softpuncture = false; static double lastphasequality=0; double phasequality = fabs(cos( n/2 * phase)); phasequality = (phasequality + lastphasequality) / 2; // Differential modem: average probabilities between current and previous symbols lastphasequality = phasequality; int soft_qualityerror = static_cast(128 * phasequality); if (soft_qualityerror > 255-25) // Prevent soft-bit wrap-around (crossing of value 128) softpuncture = true; else if (soft_qualityerror < 128/3) // First 1/3 of phase delta is considered a perfect signal soft_qualityerror = 0; else if (soft_qualityerror > 128 - (128/14) ) // Last 1/14 of phase delta triggers a puncture softpuncture = true; else soft_qualityerror /= 2; // Scale the FEC error to prevent premature cutoff if (softpuncture) { for(int i=0; i(bits); for(int i=symbits-1; i>=0; i--) { // Use predefined Gray-mapped softbits for soft-decoding if (graymapped_16psk_softbits[bitindex][i] > 128) // soft-one rx_pskr(graymapped_16psk_softbits[bitindex][i] - soft_qualityerror); // Feed to the PSKR FEC decoder, one bit at a time. else // soft-zero rx_pskr(graymapped_16psk_softbits[bitindex][i] + soft_qualityerror); // Feed to the PSKR FEC decoder, one bit at a time. } } } else { //Hard Decode Section for(int i=0; imag(); double r1 = re_Gbin[1]->mag(); double r2 = re_Gbin[2]->mag(); double r3 = re_Gbin[3]->mag(); double i0 = im_Gbin[0]->mag(); double i1 = im_Gbin[1]->mag(); double i2 = im_Gbin[2]->mag(); double i3 = im_Gbin[3]->mag(); r0 = sqrtf(r0*r0 + i0*i0); r1 = sqrtf(r1*r1 + i1*i1); r2 = sqrtf(r2*r2 + i2*i2); r3 = sqrtf(r3*r3 + i3*i3); e0 = e0_filt->run(r0); e1 = e1_filt->run(r1); e2 = e2_filt->run(r2); e3 = e3_filt->run(r3); if (e1 > e0) { if ((e1 > 2 * e2) && (e2 > 0)) { snratio = e1 / e2; if (snratio < 1.0) snratio = 1.0; } else snratio = 1.0; } else { if ((e0 > 2 * e2) && (e2 > 0)) { snratio = e0 / e2; if (snratio < 1.0) snratio = 1.0; } else snratio = 1.0; } if ( (e1 > 2 * e3) && (e3 > 2 * e2) ) { imdratio = e3 / e1; if (imdratio < (1.0 /snratio)) imdratio = 1.0 / snratio; } else imdratio = 1.0 / snratio ; displaysn = false; if (snratio > 4) displaysn = true; if (r0 > r1) { if ((r0 / r2 < 0.1 * snratio ) || (r0 / r2 < 2.0)) { displaysn = false; } } else { if ((r1 / r2 < 0.1 * snratio ) || (r1 / r2 < 2.0)) { displaysn = false; } } } void psk::update_syncscope() { static char msg1[16]; static char msg2[16]; display_metric(metric); if (displaysn && mode == MODE_PSK31) { memset(msg1, 0, sizeof(msg1)); memset(msg2, 0, sizeof(msg2)); s2n = 10.0*log10( snratio ); if (s2n < 6) strcpy(msg1, "S/N ---"); else snprintf(msg1, sizeof(msg1), "S/N %2.0f dB", s2n); put_Status1( msg1, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); imd = 10.0*log10( imdratio ); if (imd > -10) strcpy(msg2, "IMD ---"); else snprintf(msg2, sizeof(msg2), "IMD %2.0f dB", imd); put_Status2( msg2, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); } else if (_xpsk || _8psk || _16psk) { // Only update the GUI once every dcdbits/4 function calls // to prevent high CPU load from high-baudrate modes static int counter=0; if (counter++ < dcdbits/4) return; else counter = 0; memset(msg1, 0, sizeof(msg1)); memset(msg2, 0, sizeof(msg2)); s2n = 10.0*log10( snratio ); if (s2n < 0) strcpy(msg1, "S/N ---"); else snprintf(msg1, sizeof(msg1), "S/N %2.0f dB", s2n); put_Status1( msg1, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); // Display the phase-error of the snprintf(msg2, sizeof(msg2), "Phase: %d%%", get_quality() ); put_Status2( msg2, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); } else if (displaysn) { // Only update the GUI once every dcdbits/4 function calls // to prevent high CPU load from high-baudrate modes static int counter=0; if (counter++ < dcdbits/4) return; else counter = 0; memset(msg1, 0, sizeof(msg1)); memset(msg2, 0, sizeof(msg2)); s2n = 10.0*log10( snratio ); if (s2n < 0) strcpy(msg1, "S/N ---"); else snprintf(msg1, sizeof(msg1), "S/N %2.0f dB", s2n); put_Status1( msg1, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); // Display the phase-error of the snprintf(msg2, sizeof(msg2), "Phase: %d%%", get_quality() ); put_Status2( msg2, progdefaults.StatusTimeout, progdefaults.StatusDim ? STATUS_DIM : STATUS_CLEAR); } } char bitstatus[100]; int psk::rx_process(const double *buf, int len) { double delta[MAX_CARRIERS], frequencies[MAX_CARRIERS]; cmplx z, z2[MAX_CARRIERS]; bool can_rx_symbol = false; if (viewer_mode()) { if (!progdefaults.report_when_visible || dlgViewer->visible() || progStatus.show_channels ) if (pskviewer && !bHistory) pskviewer->rx_process(buf, len); if (evalpsk) evalpsk->sigdensity(); } frequencies[0] = frequency + ((-1 * numcarriers) + 1) * inter_carrier / 2; delta[0] = TWOPI * frequencies[0] / samplerate; for (int car = 1; car < numcarriers; car++) { frequencies[car] = frequencies[car - 1] + inter_carrier; delta[car] = TWOPI * frequencies[car] / samplerate; } while (len-- > 0) { for (int car = 0; car < numcarriers; car++) { // Mix with the internal NCO z = cmplx ( *buf * cos(phaseacc[car]), *buf * sin(phaseacc[car]) ); if (numcarriers == 1 && vestigial && progdefaults.pskpilot) { vestigial_sfft->run(z, sfft_bins, 1); } else if (numcarriers > 1 && vestigial && car == 0) { vestigial_sfft->run(z, sfft_bins, 1); } phaseacc[car] += delta[car]; if (phaseacc[car] > TWOPI) phaseacc[car] -= TWOPI; // Filter and downsample // by 16 (psk31, qpsk31) // by 8 (psk63, qpsk63) // by 4 (psk125, qpsk125) // by 2 (psk250, qpsk250) // by 1 (psk500, qpsk500) = no down sampling // first filter if (fir1[car]->run( z, z )) { // fir1 returns true every Nth sample // final filter fir2[car]->run( z, z2[car] ); // fir2 returns value on every sample //On last carrier processing if (car == numcarriers - 1) { calcSN_IMD(z); //JD OR all carriers together check logic??? /** * This is the symbol timing recovery mechanism. After the demodulated * signal is processed by the matched filters, the signal lobes are * expected to have been modified to a fairly symmetric shape. The * magnitude of the samples are taken, thus rectifying the signal to * positive values. "bitclk" is a counter that is very close in rate to * (samples / symbol). Its purpose is to repeatedly "draw" one symbol * waveform in the syncbuf array, according to its amplitude (not phase). */ int idx = (int) bitclk; double sum = 0.0; double ampsum = 0.0; for (int ii = 0; ii < numcarriers; ii++) { sum += abs(z2[ii])/numcarriers; } // syncbuf[idx] = 0.8 * syncbuf[idx] + 0.2 * z2[car].mag(); syncbuf[idx] = 0.8 * syncbuf[idx] + 0.2 * sum; sum = 0.0; double bitsteps = (symbollen >= 16 ? 16 : symbollen); int symsteps = (int) (bitsteps / 2); /** * Here we sum up the difference between each sample's magnitude in the * lower half of the array with its counterpart on the upper half of the * array, or the other side of the waveform. Each pair's difference is * divided by their sum, scaling it so that the signal amplitude does not * affect the result. When the differences are summed, it gives an * indication of which side is larger than the other. */ for (int i = 0; i < symsteps; i++) { sum += (syncbuf[i] - syncbuf[i+symsteps]); ampsum += (syncbuf[i] + syncbuf[i+symsteps]); } // added correction as per PocketDigi sum = (ampsum == 0 ? 0 : sum / ampsum); /** * If the lower side is larger (meaning that the waveform is shifted in that * direction), then the sum is negative, and bitclk needs to be adjusted to * be a little faster, so that the next drawing of the waveform in syncbuf * will be shifted right. Conversely, if the sum is positive, then it needs * to slow down bitclk so that the waveform is shifted left. Thus the * error is subtracted from bitclk, rather than added. The goal is to * get the error as close to zero as possible, so that the receiver is * exactly synced with the transmitter and the waveform is exactly in * the middle of syncbuf. */ // bitclk -= sum / 5.0; bitclk -= sum / (5.0 * 16 / bitsteps); bitclk += 1; /** * When bitclock reaches the end of the buffer, then a complete waveform * has been received. It is time to output the current sample and wrap * around to the next cycle. * * There is a complete symbol waveform in syncbuf, so that each * sample[0..N/2-1] is very close in amplitude with the corresponding * sample in [N/2..N-1]. * * | ******** ******** | * | **** **** **** **** | * | *** *** *** *** | * | ** ** ** ** | * | * * * * | * | * * * * | * |* * *| * |_______________________________________________________________| * 0 N/2 N-1 * * === or some variation of it .... === * * |**** ******** *****| * | **** **** **** **** | * | *** *** *** *** | * | ** ** ** ** | * | * * * * | * | * * * * | * | * * | * |_______________________________________________________________| * 0 N/2 N-1 * * A t the end of this cycle, bitclk is pointing at a sample which will * have the maximum phase difference, if any, from the previous symbol's * phase. * */ if (bitclk < 0) bitclk += bitsteps; if (bitclk >= bitsteps) { bitclk -= bitsteps; can_rx_symbol = true; update_syncscope(); afc(); } } } } if (can_rx_symbol) { for (int car = 0; car < numcarriers; car++) { rx_symbol(z2[car], car); } can_rx_symbol = false; } buf++; } if (sigsearch) findsignal(); else if (mailserver) { if (waitcount > 0) { --waitcount; if (waitcount == 0) { if (progdefaults.PSKmailSweetSpot) { frequency = progdefaults.PSKsweetspot; set_freq(frequency); } sigsearch = SIGSEARCH; } } else if ( snratio <= 1.0) { waitcount = 8; sigsearch = 0; } } return 0; } //===================================================================== // transmit processes //===================================================================== void psk::transmit(double *buf, int len) { ModulateXmtr(buf, len); } #define SVP_MASK 0xF #define SVP_COUNT (SVP_MASK + 1) static cmplx sym_vec_pos[SVP_COUNT] = { cmplx (-1.0, 0.0), // 180 degrees cmplx (-0.9238, -0.3826), // 202.5 degrees cmplx (-0.7071, -0.7071), // 225 degrees cmplx (-0.3826, -0.9238), // 247.5 degrees cmplx (0.0, -1.0), // 270 degrees cmplx (0.3826, -0.9238), // 292.5 degrees cmplx (0.7071, -0.7071), // 315 degrees cmplx (0.9238, -0.3826), // 337.5 degrees cmplx (1.0, 0.0), // 0 degrees cmplx (0.9238, 0.3826), // 22.5 degrees cmplx (0.7071, 0.7071), // 45 degrees cmplx (0.3826, 0.9238), // 67.5 degrees cmplx (0.0, 1.0), // 90 degrees cmplx (-0.3826, 0.9238), // 112.5 degrees cmplx (-0.7071, 0.7071), // 135 degrees cmplx (-0.9238, 0.3826) // 157.5 degrees }; void psk::tx_carriers() { double delta[MAX_CARRIERS]; double ival, qval, shapeA, shapeB; cmplx symbol; double frequencies[MAX_CARRIERS]; //Process all carrier's symbols, then submit to sound card accumulated_bits = 0; //reset frequencies[0] = get_txfreq_woffset() + ((-1 * numcarriers) + 1) * inter_carrier / 2; delta[0] = TWOPI * frequencies[0] / samplerate; for (int car = 1; car < symbols; car++) { frequencies[car] = frequencies[car - 1] + inter_carrier; delta[car] = TWOPI * frequencies[car] / samplerate; } int sym; for (int car = 0; car < symbols; car++) { sym = txsymbols[car]; if (_xpsk && !_disablefec) { // Use Gray-mapped xpsk constellation symbol = prevsymbol[car] * graymapped_xpsk_pos[(sym & 3)]; // complex multiplication } else if (_8psk && !_disablefec) { // Use Gray-mapped 8psk constellation symbol = prevsymbol[car] * graymapped_8psk_pos[(sym & 7)]; // complex multiplication } else if (_16psk && !_disablefec) { // Use Gray-mapped 16psk constellation symbol = prevsymbol[car] * graymapped_16psk_pos[(sym & 15)]; // complex multiplication } else { // Map the incoming symbols to the underlying 16psk constellation. if (_xpsk) { sym = sym * 4 + 2; // Give it the "X" constellation shape } else if (_8psk) { sym *= 2; // Map 8psk to 16psk } else { // BPSK and QPSK if (_qpsk && !reverse) { sym = (4 - sym) & 3; } sym *= 4; // For BPSK and QPSK } symbol = prevsymbol[car] * sym_vec_pos[(sym & SVP_MASK)]; // complex multiplication } for (int i = 0; i < symbollen; i++) { shapeA = tx_shape[i]; if (test_signal_window && test_signal_window->visible() && btn_imd_on->value()) { double imd = pow(10, xmtimd->value()/20.0); shapeA -= (imd * imd_shape[i]); } shapeB = (1.0 - shapeA); ival = shapeA * prevsymbol[car].real() + shapeB * symbol.real(); qval = shapeA * prevsymbol[car].imag() + shapeB * symbol.imag(); if (car != 0) { outbuf[i] += (ival * cos(phaseacc[car]) + qval * sin(phaseacc[car])) / numcarriers; } else { outbuf[i] = (ival * cos(phaseacc[car]) + qval * sin(phaseacc[car])) / numcarriers; } phaseacc[car] += delta[car]; if (phaseacc[car] > TWOPI) phaseacc[car] -= TWOPI; } prevsymbol[car] = symbol; } double amp=0; bool tx_vestigial = false; if (vestigial && progdefaults.pskpilot) { tx_vestigial = true; amp = pow(10, progdefaults.pilot_power / 20.0) * maxamp; } if (tx_vestigial) { double dvp = TWOPI * (frequencies[0] - sc_bw) / samplerate; for (int i = 0; i < symbollen; i++) { outbuf[i] += amp * cos(vphase); outbuf[i] /= (1 + amp); vphase += dvp; if (vphase > TWOPI) vphase -= TWOPI; } } maxamp = 0; for (int i = 0; i < symbollen; i++) if (maxamp < fabs(outbuf[i])) maxamp = fabs(outbuf[i]); if (maxamp) { for (int i = 0; i < symbollen; i++) outbuf[i] /= maxamp; } transmit(outbuf, symbollen); } void psk::tx_symbol(int sym) { acc_symbols++; txsymbols[symbols] = sym; if (++symbols < numcarriers) { return; } tx_carriers(); symbols = 0; //reset } void psk::tx_bit(int bit) { unsigned int sym; static int bitcount=0; static int xpsk_sym=0; // qpsk transmission if (_qpsk) { sym = enc->encode(bit); sym = sym & 3;//JD just to make sure tx_symbol(sym); // pskr (fec + interleaver) transmission } else if (_pskr) { // Encode into two bits bitshreg = enc->encode(bit); // pass through interleaver if (mode != MODE_PSK63F) Txinlv->bits(&bitshreg); // Send low bit first. tx_symbol expects 0 or 2 for BPSK sym = (bitshreg & 1) << 1; tx_symbol(sym); sym = bitshreg & 2; tx_symbol(sym); } else if (_16psk || _8psk || _xpsk) { if (_disablefec) { //Accumulate tx bits until the correct number for symbol-size is reached xpsk_sym |= bit << bitcount++ ; if (bitcount == symbits) { tx_symbol(xpsk_sym); xpsk_sym = bitcount = 0; } } else tx_xpsk(bit); // else normal bpsk transmission } else { sym = bit << 1; tx_symbol(sym); } } void psk::tx_xpsk(int bit) { static int bitcount = 0; static unsigned int xpsk_sym = 0; int fecbits = 0; // If invalid value of bitcount, reset to 0 if ( (_8psk && _puncturing) || _xpsk || _16psk) if ( (bitcount & 0x1) ) bitcount = 0; // Pass one bit and return two bits bitshreg = enc->encode(bit); // Interleave Txinlv->bits(&bitshreg); // Bit-interleave fecbits = bitshreg; if (_xpsk) { // 2 bits-per-symbol. Transmit every call xpsk_sym = static_cast(fecbits); tx_symbol(xpsk_sym); return; } else if (_8psk && _puncturing) { // @ 2/3 rate if ( 0 == bitcount) { xpsk_sym = static_cast(fecbits); bitcount = 2; return; } else if ( 2 == bitcount ) { xpsk_sym |= (static_cast(fecbits) & 1) << 2 ; /// Punctured anyways, so skip -> //xpsk_sym |= (static_cast(fecbits) & 2) << 2 ; tx_symbol(xpsk_sym & 7); /// Drop/puncture the high-bit on Tx xpsk_sym = bitcount = 0; return; } } else if (_8psk) { // 3 bits-per-symbol. Accumulate then tx. if ( 0 == bitcount ) { // Empty xpsk_sym buffer: add 2 bits and return xpsk_sym = static_cast(fecbits); bitcount = 2; return ; } else if ( 1 == bitcount ) { // xpsk_sym buffer with one bit: add 2 bits then tx and clear xpsk_sym |= (static_cast(fecbits) & 1) << 1 ; xpsk_sym |= (static_cast(fecbits) & 2) << 1 ; tx_symbol(xpsk_sym); xpsk_sym = bitcount = 0; return; } else if ( 2 == bitcount ) { // xpsk_sym buffer with 2 bits: add 1 then tx and save next bit xpsk_sym |= (static_cast(fecbits) & 1) << 2 ; tx_symbol(xpsk_sym); xpsk_sym = bitcount = 0; xpsk_sym |= (static_cast(fecbits) & 2) >> 1 ; bitcount = 1; return; } } else if (_puncturing && _16psk) { // @ 3/4 Rate if ( 0 == bitcount) { xpsk_sym = static_cast(fecbits); bitcount = 2; return; } else if ( 2 == bitcount ) { xpsk_sym |= (static_cast(fecbits) & 1) << 2 ; xpsk_sym |= (static_cast(fecbits) & 2) << 2 ; bitcount = 4; return; } else if ( 4 == bitcount ) { xpsk_sym |= (static_cast(fecbits) & 1) << 4 ; xpsk_sym |= (static_cast(fecbits) & 2) << 4 ; xpsk_sym >>= 1; // Shift right to drop the lowest bit xpsk_sym &= 15; // Drop the highest bit tx_symbol(xpsk_sym); xpsk_sym = bitcount = 0; return; } } else if (_16psk) { // 4 bits-per-symbol. Transmit every-other run. if ( 0 == bitcount) { xpsk_sym = static_cast(fecbits); bitcount = 2; return; } else if ( 2 == bitcount ) { xpsk_sym |= (static_cast(fecbits) & 1) << 2 ; xpsk_sym |= (static_cast(fecbits) & 2) << 2 ; //Txinlv->bits(&xpsk_sym); tx_symbol(xpsk_sym & 7); xpsk_sym = bitcount = 0; return; } } } unsigned char ch; void psk::tx_char(unsigned char c) { ch = c; const char *code; char_symbols = acc_symbols; if (_pskr || _xpsk || _8psk || _16psk) { // acc_symbols = 0; // ARQ varicode instead of MFSK for PSK63FEC code = varienc(c); } else { code = psk_varicode_encode(c); } while (*code) { tx_bit((*code - '0')); code++; } // Insert PSK varicode character-delimiting bits if (! _pskr && !_xpsk && !_8psk && !_16psk) { tx_bit(0); tx_bit(0); } char_symbols = acc_symbols - char_symbols; } void psk::tx_flush() { sig_start = false; if (_pskr) { ovhd_symbols = ((numcarriers - symbols) % numcarriers); //VK2ETA replace with a more effective flushing sequence (avoids cutting the last characters in low s/n) for (int i = 0; i < ovhd_symbols/2; i++) tx_bit(0); for (int i = 0; i < dcdbits / 2; i++) { tx_bit(1); if (i == dcdbits/2 - 1) sig_stop = true; tx_bit(1); } // QPSK - flush the encoder } else if (_qpsk) { for (int i = 0; i < dcdbits; i++) { if (i == dcdbits - 1) sig_stop = true; tx_bit(0); } // FEC enabled: Sens the NULL character in MFSk varicode as the flush / post-amble sequence } else if (!_disablefec && (_xpsk || _8psk || _16psk) ) { for (int i=0; i to clear bit accumulators on both Tx and Rx ends. } // FEC disabled: use unmodulated carrier (bpsk-like single tone) } else if (_disablefec && ( _xpsk || _8psk || _16psk) ) { for (int i=0; i to clear bit accumulators on both Tx and Rx ends. } int symbol; if (_16psk) symbol = 8; else if (_8psk) symbol = 4; else symbol = 2; // xpsk for (int i = 0; i <= 96; i++) { // DCD window is only 32-bits wide. Send 3-times if (i == 95) sig_stop = true; tx_symbol(symbol); } // Standard BPSK postamble } else { for (int i = 0; i < dcdbits; i++) { if (i == dcdbits - 1) sig_stop = true; tx_symbol(2); // 0 degrees } } for (int i = 0; i < 2048; i++) outbuf[i] = 0; transmit(outbuf, 2048); } // Necessary to clear the interleaver before we start sending void psk::clearbits() { bitshreg = 0; enc->init(); Txinlv->flush(); } int psk::tx_process() { modem::tx_process(); if (preamble) { if (_pskr) { if (mode != MODE_PSK63F) clearbits(); // FEC prep the encoder with one/zero sequences of bits sig_start = true; sig_stop = false; for (int i = 0; i < preamble/2; i++) { tx_bit(1); tx_bit(0); } // FEC: Mark start of first character with a double zero // to ensure sync at end of preamble while (acc_symbols % numcarriers) tx_bit(0); tx_char(0); // preamble = 0; return 0; } else if (mode == MODE_OFDM_500F || mode == MODE_OFDM_750F ) { //|| mode == MODE_OFDM_2000F) { // RSID is used for frequency-setting and AFC: no preamble needed or used. Just send a header. clearbits(); sig_start = true; sig_stop = false; for (int i=0; i<5; i++) tx_char(0); // Send 4 characters as both sacrificial-header and pad-to-ramp-up-the-FEC. tx_char(10); // newline as first character preamble = 0; return 0; } else if (_8psk) { if (!_disablefec) clearbits(); if(progStatus.psk8DCDShortFlag) if (preamble > 96) preamble = 96; if (_disablefec) { // Send continuous symbol 0: Usual PSK 2-tone preamble sig_start = true; sig_stop = false; for (int i = 0; i < preamble; i++ ) tx_symbol(0); tx_char(0); preamble = 0; return 0; } else { _disablefec = true; for (int i = 0; i < preamble/2; i++) tx_symbol(0); _disablefec = false; // FEC prep the encoder with encoded sequence of double-zeros // sends a single centered preamble tone for FEC modes sig_start = true; sig_stop = false; for (int i = 0; i < preamble; i += 2) { tx_bit(0); tx_bit(0); } tx_char(0); preamble = 0; return 0; } } else { // Standard BPSK/QPSK/xPSK preamble sig_start = true; sig_stop = false; for (int i = 0; i < preamble; i++) { tx_symbol(0); // send phase reversals } preamble = 0; return 0; } } int c = get_tx_char(); if (c == GET_TX_CHAR_ETX || stopflag) { tx_flush(); stopflag = false; char_samples = char_symbols * symbollen / numcarriers; xmt_samples = acc_symbols * symbollen / numcarriers; ovhd_samples = (acc_symbols - char_symbols - ovhd_symbols) * symbollen / numcarriers; return -1; // we're done } if (c == GET_TX_CHAR_NODATA) { if (_pskr || _xpsk || _8psk || _16psk) { // MFSK varicode instead of psk tx_char(0); // tx_bit(1); // extended zero bit stream for (int i = 0; i < 32; i++) tx_bit(0); } else { tx_bit(0); } } else { tx_char(c); put_echo_char(c); } return 0; } //============================================================================ // psk signal evaluation // using Goertzel IIR filter // derived from pskcore by Moe Wheatley, AE4JY //============================================================================ static bool reset_filters; void psk::initSN_IMD() { reset_filters = true; } void psk::resetSN_IMD() { reset_filters = true; } //============================================================================ // This routine calculates the energy in the frequency bands of // carrier = base (0), fundamental = F1(15.625), noise = F2(31.25), and // 3rd order product = F3(46.875) // It is called with cmplx data samples at 500 Hz. //============================================================================ void psk::calcSN_IMD(cmplx z) { if (!re_Gbin[0]) return; if (reset_filters) { e0_filt->reset(); e1_filt->reset(); e2_filt->reset(); e3_filt->reset(); for(int i = 0; i < NUM_FILTERS; i++) { re_Gbin[i]->reset(); im_Gbin[i]->reset(); } reset_filters = false; } bool isvalid = true; for (int i = 0; i < NUM_FILTERS; i++) { isvalid &= re_Gbin[i]->run(real(z)); isvalid &= im_Gbin[i]->run(imag(z)); } if (isvalid) { signalquality(); for (int i = 0; i < NUM_FILTERS; i++) { re_Gbin[i]->reset(); im_Gbin[i]->reset(); } } return; } fldigi-4.2.05/src/psk/pskvaricode.cxx0000664000175000017500000002532614532252172014420 00000000000000// ---------------------------------------------------------------------------- // varicode.cxx -- PSK31 Varicode // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gmfsk source code // distribution. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include "pskvaricode.h" // PSK31 Varicode for encoding static const char *varicodetab1[] = { "1010101011", /* 0 - */ "1011011011", /* 1 - */ "1011101101", /* 2 - */ "1101110111", /* 3 - */ "1011101011", /* 4 - */ "1101011111", /* 5 - */ "1011101111", /* 6 - */ "1011111101", /* 7 - */ "1011111111", /* 8 - */ "11101111", /* 9 - */ "11101", /* 10 - */ "1101101111", /* 11 - */ "1011011101", /* 12 - */ "11111", /* 13 - */ "1101110101", /* 14 - */ "1110101011", /* 15 - */ "1011110111", /* 16 - */ "1011110101", /* 17 - */ "1110101101", /* 18 - */ "1110101111", /* 19 - */ "1101011011", /* 20 - */ "1101101011", /* 21 - */ "1101101101", /* 22 - */ "1101010111", /* 23 - */ "1101111011", /* 24 - */ "1101111101", /* 25 - */ "1110110111", /* 26 - */ "1101010101", /* 27 - */ "1101011101", /* 28 - */ "1110111011", /* 29 - */ "1011111011", /* 30 - */ "1101111111", /* 31 - */ "1", /* 32 - */ "111111111", /* 33 - ! */ "101011111", /* 34 - '"' */ "111110101", /* 35 - # */ "111011011", /* 36 - $ */ "1011010101", /* 37 - % */ "1010111011", /* 38 - & */ "101111111", /* 39 - ' */ "11111011", /* 40 - ( */ "11110111", /* 41 - ) */ "101101111", /* 42 - * */ "111011111", /* 43 - + */ "1110101", /* 44 - , */ "110101", /* 45 - - */ "1010111", /* 46 - . */ "110101111", /* 47 - / */ "10110111", /* 48 - 0 */ "10111101", /* 49 - 1 */ "11101101", /* 50 - 2 */ "11111111", /* 51 - 3 */ "101110111", /* 52 - 4 */ "101011011", /* 53 - 5 */ "101101011", /* 54 - 6 */ "110101101", /* 55 - 7 */ "110101011", /* 56 - 8 */ "110110111", /* 57 - 9 */ "11110101", /* 58 - : */ "110111101", /* 59 - ; */ "111101101", /* 60 - < */ "1010101", /* 61 - = */ "111010111", /* 62 - > */ "1010101111", /* 63 - ? */ "1010111101", /* 64 - @ */ "1111101", /* 65 - A */ "11101011", /* 66 - B */ "10101101", /* 67 - C */ "10110101", /* 68 - D */ "1110111", /* 69 - E */ "11011011", /* 70 - F */ "11111101", /* 71 - G */ "101010101", /* 72 - H */ "1111111", /* 73 - I */ "111111101", /* 74 - J */ "101111101", /* 75 - K */ "11010111", /* 76 - L */ "10111011", /* 77 - M */ "11011101", /* 78 - N */ "10101011", /* 79 - O */ "11010101", /* 80 - P */ "111011101", /* 81 - Q */ "10101111", /* 82 - R */ "1101111", /* 83 - S */ "1101101", /* 84 - T */ "101010111", /* 85 - U */ "110110101", /* 86 - V */ "101011101", /* 87 - W */ "101110101", /* 88 - X */ "101111011", /* 89 - Y */ "1010101101", /* 90 - Z */ "111110111", /* 91 - [ */ "111101111", /* 92 - \ */ "111111011", /* 93 - ] */ "1010111111", /* 94 - ^ */ "101101101", /* 95 - _ */ "1011011111", /* 96 - ` */ "1011", /* 97 - a */ "1011111", /* 98 - b */ "101111", /* 99 - c */ "101101", /* 100 - d */ "11", /* 101 - e */ "111101", /* 102 - f */ "1011011", /* 103 - g */ "101011", /* 104 - h */ "1101", /* 105 - i */ "111101011", /* 106 - j */ "10111111", /* 107 - k */ "11011", /* 108 - l */ "111011", /* 109 - m */ "1111", /* 110 - n */ "111", /* 111 - o */ "111111", /* 112 - p */ "110111111", /* 113 - q */ "10101", /* 114 - r */ "10111", /* 115 - s */ "101", /* 116 - t */ "110111", /* 117 - u */ "1111011", /* 118 - v */ "1101011", /* 119 - w */ "11011111", /* 120 - x */ "1011101", /* 121 - y */ "111010101", /* 122 - z */ "1010110111", /* 123 - { */ "110111011", /* 124 - | */ "1010110101", /* 125 - } */ "1011010111", /* 126 - ~ */ "1110110101", /* 127 - */ "1110111101", /* 128 - */ "1110111111", /* 129 - */ "1111010101", /* 130 - */ "1111010111", /* 131 - */ "1111011011", /* 132 - */ "1111011101", /* 133 - */ "1111011111", /* 134 - */ "1111101011", /* 135 - */ "1111101101", /* 136 - */ "1111101111", /* 137 - */ "1111110101", /* 138 - */ "1111110111", /* 139 - */ "1111111011", /* 140 - */ "1111111101", /* 141 - */ "1111111111", /* 142 - */ "10101010101", /* 143 - */ "10101010111", /* 144 - */ "10101011011", /* 145 - */ "10101011101", /* 146 - */ "10101011111", /* 147 - */ "10101101011", /* 148 - */ "10101101101", /* 149 - */ "10101101111", /* 150 - */ "10101110101", /* 151 - */ "10101110111", /* 152 - */ "10101111011", /* 153 - */ "10101111101", /* 154 - */ "10101111111", /* 155 - */ "10110101011", /* 156 - */ "10110101101", /* 157 - */ "10110101111", /* 158 - */ "10110110101", /* 159 - */ "10110110111", /* 160 - */ "10110111011", /* 161 - */ "10110111101", /* 162 - */ "10110111111", /* 163 - */ "10111010101", /* 164 - */ "10111010111", /* 165 - */ "10111011011", /* 166 - */ "10111011101", /* 167 - */ "10111011111", /* 168 - */ "10111101011", /* 169 - */ "10111101101", /* 170 - */ "10111101111", /* 171 - */ "10111110101", /* 172 - */ "10111110111", /* 173 - */ "10111111011", /* 174 - */ "10111111101", /* 175 - */ "10111111111", /* 176 - */ "11010101011", /* 177 - */ "11010101101", /* 178 - */ "11010101111", /* 179 - */ "11010110101", /* 180 - */ "11010110111", /* 181 - */ "11010111011", /* 182 - */ "11010111101", /* 183 - */ "11010111111", /* 184 - */ "11011010101", /* 185 - */ "11011010111", /* 186 - */ "11011011011", /* 187 - */ "11011011101", /* 188 - */ "11011011111", /* 189 - */ "11011101011", /* 190 - */ "11011101101", /* 191 - */ "11011101111", /* 192 - */ "11011110101", /* 193 - */ "11011110111", /* 194 - */ "11011111011", /* 195 - */ "11011111101", /* 196 - */ "11011111111", /* 197 - */ "11101010101", /* 198 - */ "11101010111", /* 199 - */ "11101011011", /* 200 - */ "11101011101", /* 201 - */ "11101011111", /* 202 - */ "11101101011", /* 203 - */ "11101101101", /* 204 - */ "11101101111", /* 205 - */ "11101110101", /* 206 - */ "11101110111", /* 207 - */ "11101111011", /* 208 - */ "11101111101", /* 209 - */ "11101111111", /* 210 - */ "11110101011", /* 211 - */ "11110101101", /* 212 - */ "11110101111", /* 213 - */ "11110110101", /* 214 - */ "11110110111", /* 215 - */ "11110111011", /* 216 - */ "11110111101", /* 217 - */ "11110111111", /* 218 - */ "11111010101", /* 219 - */ "11111010111", /* 220 - */ "11111011011", /* 221 - */ "11111011101", /* 222 - */ "11111011111", /* 223 - */ "11111101011", /* 224 - */ "11111101101", /* 225 - */ "11111101111", /* 226 - */ "11111110101", /* 227 - */ "11111110111", /* 228 - */ "11111111011", /* 229 - */ "11111111101", /* 230 - */ "11111111111", /* 231 - */ "101010101011", /* 232 - */ "101010101101", /* 233 - */ "101010101111", /* 234 - */ "101010110101", /* 235 - */ "101010110111", /* 236 - */ "101010111011", /* 237 - */ "101010111101", /* 238 - */ "101010111111", /* 239 - */ "101011010101", /* 240 - */ "101011010111", /* 241 - */ "101011011011", /* 242 - */ "101011011101", /* 243 - */ "101011011111", /* 244 - */ "101011101011", /* 245 - */ "101011101101", /* 246 - */ "101011101111", /* 247 - */ "101011110101", /* 248 - */ "101011110111", /* 249 - */ "101011111011", /* 250 - */ "101011111101", /* 251 - */ "101011111111", /* 252 - */ "101101010101", /* 253 - */ "101101010111", /* 254 - */ "101101011011" /* 255 - */ }; // The same in a format more suitable for decoding. static unsigned int varicodetab2[] = { 0x2AB, 0x2DB, 0x2ED, 0x377, 0x2EB, 0x35F, 0x2EF, 0x2FD, 0x2FF, 0x0EF, 0x01D, 0x36F, 0x2DD, 0x01F, 0x375, 0x3AB, 0x2F7, 0x2F5, 0x3AD, 0x3AF, 0x35B, 0x36B, 0x36D, 0x357, 0x37B, 0x37D, 0x3B7, 0x355, 0x35D, 0x3BB, 0x2FB, 0x37F, 0x001, 0x1FF, 0x15F, 0x1F5, 0x1DB, 0x2D5, 0x2BB, 0x17F, 0x0FB, 0x0F7, 0x16F, 0x1DF, 0x075, 0x035, 0x057, 0x1AF, 0x0B7, 0x0BD, 0x0ED, 0x0FF, 0x177, 0x15B, 0x16B, 0x1AD, 0x1AB, 0x1B7, 0x0F5, 0x1BD, 0x1ED, 0x055, 0x1D7, 0x2AF, 0x2BD, 0x07D, 0x0EB, 0x0AD, 0x0B5, 0x077, 0x0DB, 0x0FD, 0x155, 0x07F, 0x1FD, 0x17D, 0x0D7, 0x0BB, 0x0DD, 0x0AB, 0x0D5, 0x1DD, 0x0AF, 0x06F, 0x06D, 0x157, 0x1B5, 0x15D, 0x175, 0x17B, 0x2AD, 0x1F7, 0x1EF, 0x1FB, 0x2BF, 0x16D, 0x2DF, 0x00B, 0x05F, 0x02F, 0x02D, 0x003, 0x03D, 0x05B, 0x02B, 0x00D, 0x1EB, 0x0BF, 0x01B, 0x03B, 0x00F, 0x007, 0x03F, 0x1BF, 0x015, 0x017, 0x005, 0x037, 0x07B, 0x06B, 0x0DF, 0x05D, 0x1D5, 0x2B7, 0x1BB, 0x2B5, 0x2D7, 0x3B5, 0x3BD, 0x3BF, 0x3D5, 0x3D7, 0x3DB, 0x3DD, 0x3DF, 0x3EB, 0x3ED, 0x3EF, 0x3F5, 0x3F7, 0x3FB, 0x3FD, 0x3FF, 0x555, 0x557, 0x55B, 0x55D, 0x55F, 0x56B, 0x56D, 0x56F, 0x575, 0x577, 0x57B, 0x57D, 0x57F, 0x5AB, 0x5AD, 0x5AF, 0x5B5, 0x5B7, 0x5BB, 0x5BD, 0x5BF, 0x5D5, 0x5D7, 0x5DB, 0x5DD, 0x5DF, 0x5EB, 0x5ED, 0x5EF, 0x5F5, 0x5F7, 0x5FB, 0x5FD, 0x5FF, 0x6AB, 0x6AD, 0x6AF, 0x6B5, 0x6B7, 0x6BB, 0x6BD, 0x6BF, 0x6D5, 0x6D7, 0x6DB, 0x6DD, 0x6DF, 0x6EB, 0x6ED, 0x6EF, 0x6F5, 0x6F7, 0x6FB, 0x6FD, 0x6FF, 0x755, 0x757, 0x75B, 0x75D, 0x75F, 0x76B, 0x76D, 0x76F, 0x775, 0x777, 0x77B, 0x77D, 0x77F, 0x7AB, 0x7AD, 0x7AF, 0x7B5, 0x7B7, 0x7BB, 0x7BD, 0x7BF, 0x7D5, 0x7D7, 0x7DB, 0x7DD, 0x7DF, 0x7EB, 0x7ED, 0x7EF, 0x7F5, 0x7F7, 0x7FB, 0x7FD, 0x7FF, 0xAAB, 0xAAD, 0xAAF, 0xAB5, 0xAB7, 0xABB, 0xABD, 0xABF, 0xAD5, 0xAD7, 0xADB, 0xADD, 0xADF, 0xAEB, 0xAED, 0xAEF, 0xAF5, 0xAF7, 0xAFB, 0xAFD, 0xAFF, 0xB55, 0xB57, 0xB5B }; const char *psk_varicode_encode(unsigned char c) { return varicodetab1[c]; } int psk_varicode_decode(unsigned int symbol) { for (int i = 0; i < 256; i++) if (symbol == varicodetab2[i]) return i; return -1; } fldigi-4.2.05/src/cmedia/0000775000175000017500000000000014611714005012053 500000000000000fldigi-4.2.05/src/cmedia/hid_win.cxx0000664000175000017500000005267214611711171014155 00000000000000/******************************************************* HIDAPI - Multi-Platform library for communication with HID devices. Alan Ott Signal 11 Software 8/22/2009 Copyright 2009, All Rights Reserved. At the discretion of the user of this library, this software may be licensed under the terms of the GNU General Public License v3, a BSD-Style license, or the original HIDAPI license as outlined in the LICENSE.txt, LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt files located at the root of the source distribution. These files may also be found in the public source code repository located at: https://github.com/libusb/hidapi . ********************************************************/ #include "debug.h" #include "hid_win.h" #undef MIN #define MIN(x,y) ((x) < (y)? (x): (y)) #ifdef _MSC_VER /* Thanks Microsoft, but I know how to use strncpy(). */ #pragma warning(disable:4996) #endif void errtext(std::string s) { FILE *erf = fopen("erf.txt", "a"); fprintf(erf, "%s\n", s.c_str()); fclose(erf); } std::string wchar2str( const char *where, wchar_t *WC ) { size_t count = wcstombs(NULL, WC, 1024); char MB[count + 1]; memset(MB, 0, count + 1); int ret = wcstombs(MB, WC, count); if (ret == -1) { LOG_DEBUG("Cannot convert %s: %ls", where, WC); return ""; } return MB; } hid_api_version api_version = { HID_API_VERSION_MAJOR, HID_API_VERSION_MINOR, HID_API_VERSION_PATCH }; void hid_device::register_error(const char *op) { WCHAR *ptr, *msg; (void)op; // unreferenced param FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&msg, 0/*sz*/, NULL); /* Get rid of the CR and LF that FormatMessage() sticks at the end of the message. Thanks Microsoft! */ ptr = msg; while (*ptr) { if (*ptr == '\r') { *ptr = 0x0000; break; } ptr++; } /* Store the message off in the Device entry so that the hid_error() function can pick it up. */ LocalFree(last_error_str); last_error_str = msg; } HANDLE open_device(const char *path, BOOL open_rw) { HANDLE handle; DWORD desired_access = (open_rw)? (GENERIC_WRITE | GENERIC_READ): GENERIC_READ; DWORD share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE; handle = CreateFileA(path, desired_access, share_mode, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, //FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/ NULL); return handle; } const struct hid_api_version* hid_version() { return &api_version; } const char* hid_version_str() { return HID_API_VERSION_STR; } int hid_init(void) { /* #ifndef HIDAPI_USE_DDK if (!initialized) { if (lookup_functions() < 0) { hid_exit(); return -1; } initialized = TRUE; } #endif */ // initialized = TRUE; return 0; } int hid_exit(void) { //#ifndef HIDAPI_USE_DDK // if (lib_handle) // FreeLibrary(lib_handle); // lib_handle = NULL; // initialized = FALSE; //#endif return 0; } hid_device_info * hid_enumerate(unsigned short vendor_id, unsigned short product_id) { BOOL res; hid_device_info *root = NULL; /* return object */ hid_device_info *cur_dev = NULL; /* Hard-coded GUID retreived by HidD_GetHidGuid */ GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} }; /* Windows objects for interacting with the driver. */ SP_DEVINFO_DATA devinfo_data; SP_DEVICE_INTERFACE_DATA device_interface_data; SP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL; HDEVINFO device_info_set = INVALID_HANDLE_VALUE; char driver_name[256]; int device_index = 0; if (hid_init() < 0) return NULL; /* Initialize the Windows objects. */ memset(&devinfo_data, 0x0, sizeof(devinfo_data)); devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); /* Get information for all the devices belonging to the HID class. */ device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); /* Iterate over each device in the HID class, looking for the right one. */ for (;;) { HANDLE query_handle = INVALID_HANDLE_VALUE; DWORD required_size = 0; HIDD_ATTRIBUTES attrib; res = SetupDiEnumDeviceInterfaces(device_info_set, NULL, &InterfaceClassGuid, device_index, &device_interface_data); if (!res) { /* A return of FALSE from this function means that there are no more devices. */ break; } /* Call with 0-sized detail size, and let the function tell us how long the detail struct needs to be. The size is put in &required_size. */ res = SetupDiGetDeviceInterfaceDetailA(device_info_set, &device_interface_data, NULL, 0, &required_size, NULL); /* Allocate a long enough structure for device_interface_detail_data. */ device_interface_detail_data = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc(required_size); device_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); /* Get the detailed data for this device. The detail data gives us the device path for this device, which is then passed into CreateFile() to get a handle to the device. */ res = SetupDiGetDeviceInterfaceDetailA(device_info_set, &device_interface_data, device_interface_detail_data, required_size, NULL, NULL); if (!res) { /* register_error("Unable to call SetupDiGetDeviceInterfaceDetail"); Continue to the next device. */ goto cont; } /* Populate devinfo_data. This function will return failure when the device with such index doesn't exist. We've already checked it does. */ res = SetupDiEnumDeviceInfo(device_info_set, device_index, &devinfo_data); if (!res) goto cont; /* Make sure this device has a driver bound to it. */ res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, SPDRP_DRIVER, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); if (!res) goto cont; //wprintf(L"HandleName: %s\n", device_interface_detail_data->DevicePath); /* Open a handle to the device */ query_handle = open_device(device_interface_detail_data->DevicePath, FALSE); /* Check validity of query_handle. */ if (query_handle == INVALID_HANDLE_VALUE) { /* Unable to open the device. */ //register_error("CreateFile"); goto cont_close; } /* Get the Vendor ID and Product ID for this device. */ attrib.Size = sizeof(HIDD_ATTRIBUTES); HidD_GetAttributes(query_handle, &attrib); //wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID); /* Check the VID/PID to see if we should add this device to the enumeration list. */ if ((vendor_id == 0x0 || attrib.VendorID == vendor_id) && (product_id == 0x0 || attrib.ProductID == product_id)) { #define WSTR_LEN 512 const char *str; hid_device_info *tmp; PHIDP_PREPARSED_DATA pp_data = NULL; HIDP_CAPS caps; NTSTATUS nt_res; /* VID/PID match. Create the record. */ tmp = new hid_device_info; if (cur_dev) { cur_dev->next = tmp; } else { root = tmp; } cur_dev = tmp; /* Get the Usage Page and Usage for this device. */ res = HidD_GetPreparsedData(query_handle, &pp_data); if (res) { nt_res = HidP_GetCaps(pp_data, &caps); if (nt_res == HIDP_STATUS_SUCCESS) { cur_dev->usage_page = caps.UsagePage; cur_dev->usage = caps.Usage; } HidD_FreePreparsedData(pp_data); } /* Fill out the record */ cur_dev->next = NULL; str = device_interface_detail_data->DevicePath; if (str) { cur_dev->path = str; } else cur_dev->path.clear(); /* Serial Number */ static wchar_t WC[1024]; memset(WC, 0, sizeof(wchar_t) * 1024); cur_dev->str_serial_number.clear(); res = HidD_GetSerialNumberString(query_handle, WC, 1024); if (res) cur_dev->str_serial_number = wchar2str("HidD_GetSerialNumberString", WC);; /* Manufacturer String */ memset(WC, 0, sizeof(wchar_t) * 1024); cur_dev->str_manufacturer_string.clear(); res = HidD_GetManufacturerString(query_handle, WC, 1024); if (res) cur_dev->str_manufacturer_string = wchar2str("HidD_GetManufacturerString", WC);; /* Product String */ memset(WC, 0, sizeof(wchar_t) * 1024); cur_dev->str_product_string.clear(); res = HidD_GetProductString(query_handle, WC, 1024); if (res) cur_dev->str_product_string = wchar2str("HidD_GetProductString", WC);; /* VID/PID */ cur_dev->vendor_id = attrib.VendorID; cur_dev->product_id = attrib.ProductID; /* Release Number */ cur_dev->release_number = attrib.VersionNumber; /* Interface Number. It can sometimes be parsed out of the path on Windows if a device has multiple interfaces. See http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or search for "Hardware IDs for HID Devices" at MSDN. If it's not in the path, it's set to -1. */ cur_dev->interface_number = -1; // if (!cur_dev->path.empty()) { // char *interface_component = strstr(cur_dev->path, "&mi_"); // if (interface_component) { // char *hex_str = interface_component + 4; // char *endptr = NULL; // cur_dev->interface_number = strtol(hex_str, &endptr, 16); // if (endptr == hex_str) { // /* The parsing failed. Set interface_number to -1. */ // cur_dev->interface_number = -1; // } // } // } } cont_close: CloseHandle(query_handle); cont: /* We no longer need the detail data. It can be freed */ free(device_interface_detail_data); device_index++; } /* Close the device information handle. */ SetupDiDestroyDeviceInfoList(device_info_set); return root; } void hid_free_enumeration(hid_device_info *devs) { /* TODO: Merge this with the Linux version. This function is platform-independent. */ hid_device_info *d = devs; while (d) { hid_device_info *next = d->next; // free(d->path); // free(d->serial_number); // free(d->manufacturer_string); // free(d->product_string); delete d; d = next; } } hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, std::string serial_number) { /* TODO: Merge this functions with the Linux version. This function should be platform independent. */ hid_device_info *devs, *cur_dev; std::string path_to_open; hid_device *handle = NULL; path_to_open.clear(); devs = hid_enumerate(vendor_id, product_id); cur_dev = devs; while (cur_dev) { if (cur_dev->vendor_id == vendor_id && cur_dev->product_id == product_id) { if (!cur_dev->str_serial_number.empty()) { if (cur_dev->str_serial_number == serial_number) { path_to_open = cur_dev->path; break; } } else { path_to_open = cur_dev->path; break; } } cur_dev = cur_dev->next; } if (!path_to_open.empty()) { /* Open the device */ handle = hid_open_path(path_to_open); } hid_free_enumeration(devs); return handle; } hid_device * hid_open_path(std::string path) { hid_device *dev; HIDP_CAPS caps; PHIDP_PREPARSED_DATA pp_data = NULL; BOOLEAN res; NTSTATUS nt_res; if (hid_init() < 0) { return NULL; } dev = new hid_device; /* Open a handle to the device */ dev->device_handle = open_device(path.c_str(), TRUE); /* Check validity of write_handle. */ if (dev->device_handle == INVALID_HANDLE_VALUE) { /* System devices, such as keyboards and mice, cannot be opened in read-write mode, because the system takes exclusive control over them. This is to prevent keyloggers. However, feature reports can still be sent and received. Retry opening the device, but without read/write access. */ dev->device_handle = open_device(path.c_str(), FALSE); /* Check the validity of the limited device_handle. */ if (dev->device_handle == INVALID_HANDLE_VALUE) { /* Unable to open the device, even without read-write mode. */ dev->register_error("CreateFile"); errtext("CreateFile for ro failed: INVALID_HANDLE"); goto err; } else errtext("CreateFile for ro OK"); } else errtext("CreateFile for r/w OK"); /* Set the Input Report buffer size to 64 reports. */ res = HidD_SetNumInputBuffers(dev->device_handle, 64); if (!res) { dev->register_error("HidD_SetNumInputBuffers"); goto err; } /* Get the Input Report length for the device. */ res = HidD_GetPreparsedData(dev->device_handle, &pp_data); if (!res) { dev->register_error("HidD_GetPreparsedData"); goto err; } nt_res = HidP_GetCaps(pp_data, &caps); if (nt_res != HIDP_STATUS_SUCCESS) { dev->register_error("HidP_GetCaps"); goto err_pp_data; } dev->output_report_length = caps.OutputReportByteLength; dev->input_report_length = caps.InputReportByteLength; dev->feature_report_length = caps.FeatureReportByteLength; HidD_FreePreparsedData(pp_data); dev->read_buf = (char*) malloc(dev->input_report_length); return dev; err_pp_data: HidD_FreePreparsedData(pp_data); err: return NULL; } int hid_device::hid_write(const unsigned char *data, size_t length) { DWORD bytes_written = 0; int function_result = -1; BOOL res; BOOL overlapped = FALSE; unsigned char *buf; /* Make sure the right number of bytes are passed to WriteFile. Windows expects the number of bytes which are in the _longest_ report (plus one for the report number) bytes even if the data is a report which is shorter than that. Windows gives us this value in caps.OutputReportByteLength. If a user passes in fewer bytes than this, use cached temporary buffer which is the proper size. */ if (length >= output_report_length) { /* The user passed the right number of bytes. Use the buffer as-is. */ buf = (unsigned char *) data; } else { if (write_buf == NULL) write_buf = (unsigned char *) malloc(output_report_length); buf = write_buf; memcpy(buf, data, length); memset(buf + length, 0, output_report_length - length); length = output_report_length; } res = WriteFile(device_handle, buf, (DWORD) length, NULL, &write_ol); if (!res) { if (GetLastError() != ERROR_IO_PENDING) { /* WriteFile() failed. Return error. */ register_error("WriteFile"); goto end_of_function; } overlapped = TRUE; } if (overlapped) { /* Wait for the transaction to complete. This makes hid_write() synchronous. */ res = WaitForSingleObject(write_ol.hEvent, 1000); if (res != WAIT_OBJECT_0) { /* There was a Timeout. */ register_error("WriteFile/WaitForSingleObject Timeout"); goto end_of_function; } /* Get the result. */ res = GetOverlappedResult(device_handle, &write_ol, &bytes_written, FALSE/*wait*/); if (res) { function_result = bytes_written; } else { /* The Write operation failed. */ register_error("WriteFile"); goto end_of_function; } } end_of_function: return function_result; } int hid_device::hid_read_timeout(unsigned char *data, size_t length, int milliseconds) { DWORD bytes_read = 0; size_t copy_len = 0; BOOL res = FALSE; BOOL overlapped = FALSE; /* Copy the handle for convenience. */ HANDLE ev = ol.hEvent; if (!read_pending) { /* Start an Overlapped I/O read. */ read_pending = TRUE; memset(read_buf, 0, input_report_length); ResetEvent(ev); res = ReadFile(device_handle, read_buf, (DWORD) input_report_length, &bytes_read, &ol); if (!res) { if (GetLastError() != ERROR_IO_PENDING) { /* ReadFile() has failed. Clean up and return error. */ CancelIo(device_handle); read_pending = FALSE; goto end_of_function; } overlapped = TRUE; } } else { overlapped = TRUE; } if (overlapped) { if (milliseconds >= 0) { /* See if there is any data yet. */ res = WaitForSingleObject(ev, milliseconds); if (res != WAIT_OBJECT_0) { /* There was no data this time. Return zero bytes available, but leave the Overlapped I/O running. */ return 0; } } /* Either WaitForSingleObject() told us that ReadFile has completed, or we are in non-blocking mode. Get the number of bytes read. The actual data has been copied to the data[] array which was passed to ReadFile(). */ res = GetOverlappedResult(device_handle, &ol, &bytes_read, TRUE/*wait*/); } /* Set pending back to false, even if GetOverlappedResult() returned error. */ read_pending = FALSE; if (res && bytes_read > 0) { if (read_buf[0] == 0x0) { /* If report numbers aren't being used, but Windows sticks a report number (0x0) on the beginning of the report anyway. To make this work like the other platforms, and to make it work more like the HID spec, we'll skip over this byte. */ bytes_read--; copy_len = length > bytes_read ? bytes_read : length; memcpy(data, read_buf+1, copy_len); } else { /* Copy the whole buffer, report number and all. */ copy_len = length > bytes_read ? bytes_read : length; memcpy(data, read_buf, copy_len); } } end_of_function: if (!res) { register_error("GetOverlappedResult"); return -1; } return (int) copy_len; } int hid_device::hid_read(unsigned char *data, size_t length) { return hid_read_timeout(data, length, (blocking)? -1: 0); } int hid_device::hid_set_nonblocking(int nonblock) { blocking = !nonblock; return 0; /* Success */ } int hid_device::hid_send_feature_report(const unsigned char *data, size_t length) { BOOL res = FALSE; unsigned char *buf; size_t length_to_send; /* Windows expects at least caps.FeatureReportByteLength bytes passed to HidD_SetFeature(), even if the report is shorter. Any less sent and the function fails with error ERROR_INVALID_PARAMETER set. Any more and HidD_SetFeature() silently truncates the data sent in the report to caps.FeatureReportByteLength. */ if (length >= feature_report_length) { buf = (unsigned char *) data; length_to_send = length; } else { if (feature_buf == NULL) feature_buf = (unsigned char *) malloc(feature_report_length); buf = feature_buf; memcpy(buf, data, length); memset(buf + length, 0, feature_report_length - length); length_to_send = feature_report_length; } res = HidD_SetFeature(device_handle, (PVOID)buf, (DWORD) length_to_send); if (!res) { register_error("HidD_SetFeature"); return -1; } return (int) length; } int hid_device::hid_get_feature_report(unsigned char *data, size_t length) { BOOL res; #if 0 res = HidD_GetFeature(device_handle, data, length); if (!res) { register_error("HidD_GetFeature"); return -1; } return 0; /* HidD_GetFeature() doesn't give us an actual length, unfortunately */ #else DWORD bytes_returned; OVERLAPPED ol; memset(&ol, 0, sizeof(ol)); res = DeviceIoControl(device_handle, IOCTL_HID_GET_FEATURE, data, (DWORD) length, data, (DWORD) length, &bytes_returned, &ol); if (!res) { if (GetLastError() != ERROR_IO_PENDING) { /* DeviceIoControl() failed. Return error. */ register_error("Send Feature Report DeviceIoControl"); return -1; } } /* Wait here until the write is done. This makes hid_get_feature_report() synchronous. */ res = GetOverlappedResult(device_handle, &ol, &bytes_returned, TRUE/*wait*/); if (!res) { /* The operation failed. */ register_error("Send Feature Report GetOverLappedResult"); return -1; } /* bytes_returned does not include the first byte which contains the report ID. The data buffer actually contains one more byte than bytes_returned. */ bytes_returned++; return bytes_returned; #endif } int hid_device::hid_get_input_report(unsigned char *data, size_t length) { BOOL res; #if 0 res = HidD_GetInputReport(device_handle, data, length); if (!res) { register_error("HidD_GetInputReport"); return -1; } return length; #else DWORD bytes_returned; OVERLAPPED ol; memset(&ol, 0, sizeof(ol)); res = DeviceIoControl(device_handle, IOCTL_HID_GET_INPUT_REPORT, data, (DWORD) length, data, (DWORD) length, &bytes_returned, &ol); if (!res) { if (GetLastError() != ERROR_IO_PENDING) { /* DeviceIoControl() failed. Return error. */ register_error("Send Input Report DeviceIoControl"); return -1; } } /* Wait here until the write is done. This makes hid_get_feature_report() synchronous. */ res = GetOverlappedResult(device_handle, &ol, &bytes_returned, TRUE/*wait*/); if (!res) { /* The operation failed. */ register_error("Send Input Report GetOverLappedResult"); return -1; } /* bytes_returned does not include the first byte which contains the report ID. The data buffer actually contains one more byte than bytes_returned. */ bytes_returned++; return bytes_returned; #endif } void hid_device::hid_close() { CancelIo(device_handle); } std::string hid_device::hid_get_manufacturer_string() { BOOL res; wchar_t WC[256]; res = HidD_GetManufacturerString(device_handle, WC, 256); if (!res) { register_error("HidD_GetManufacturerString"); return ""; } return wchar2str("HidD_GetManufacturerString", WC); } std::string hid_device::hid_get_product_string() { BOOL res; wchar_t WC[256]; res = HidD_GetProductString(device_handle, WC, 256); if (!res) { register_error("HidD_GetProductString"); return ""; } return wchar2str("HidD_GetProductString", WC); } std::string hid_device::hid_get_serial_number_string() { BOOL res; wchar_t WC[256]; res = HidD_GetSerialNumberString(device_handle, WC, 256); if (!res) { register_error("HidD_GetSerialNumberString"); return ""; } return wchar2str("HidD_GetSerialNumberString", WC); } int hid_device::hid_get_indexed_string(int string_index, std::string string, size_t maxlen) { BOOL res; wchar_t WC[maxlen+1]; res = HidD_GetIndexedString(device_handle, string_index, WC, maxlen); if (!res) { register_error("HidD_GetIndexedString"); string = ""; return -1; } string = wchar2str("HidD_Get_IndexedString", WC); return 0; } const char * hid_device::hid_error() { return "hid_error for global errors is not implemented yet"; } fldigi-4.2.05/src/cmedia/cmedia.cxx0000664000175000017500000001234014611711171013742 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2021 // David Freese, W1HKJ // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // This interface is based on the CM108 HID support code found in hamlib // // CM108 Audio chips found on many USB audio interfaces have controllable // General Purpose Input/Output pins. // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #ifndef __WIN32__ #include #include #endif #include "config.h" #include "threads.h" #include "debug.h" #include "util.h" #include "confdialog.h" #include "hidapi.h" #include "cmedia.h" static int ptt_state_cmedia = 0; static std::map paths; static hid_device *ptt_dev = (hid_device *)0; void test_hid_ptt() { hid_device *test_dev = (hid_device *)0; if (ptt_dev) test_dev = ptt_dev; else if (progdefaults.cmedia_device == "NONE") return; else test_dev = hid_open_path(paths[progdefaults.cmedia_device]); if (test_dev == (hid_device *)0) { LOG_ERROR("Could not open %s", progdefaults.cmedia_device.c_str()); return; } if (test_dev == ptt_dev) LOG_INFO("Testing using ptt device: %s", progdefaults.cmedia_device.c_str()); else LOG_INFO("Testing using test_dev: %s", progdefaults.cmedia_device.c_str()); int bitnbr = 2; // GPIO-3 unsigned char out_rep[5]; for (int i = 0; i < 5; out_rep[i++] = 0x00); out_rep[3] = 0x01 << bitnbr; for (int j = 0; j < 20; j++) { out_rep[2] = 0x01 << bitnbr; test_dev->hid_write(out_rep, 5); MilliSleep(50); out_rep[2] = 0x00; test_dev->hid_write(out_rep, 5); MilliSleep(50); } if (test_dev != ptt_dev) delete test_dev; return; } int open_cmedia(std::string str_device) { if (str_device == "NONE") return -1; std::string dev_path = paths[str_device]; if (ptt_dev) close_cmedia(); LOG_DEBUG("Device path: %s", dev_path.c_str()); ptt_dev = hid_open_path(dev_path); if (!ptt_dev) { LOG_ERROR( "unable to open device"); return -1; } LOG_INFO("C-Media device %s opened for GPIO i/o", str_device.c_str()); return 0; } void close_cmedia() { delete ptt_dev; ptt_dev = (hid_device *)0; } // // Set or unset the Push To Talk bit on a CM108 GPIO. // // param ptt 1 - Set PTT, 0 - unset PTT. // // return true on success, false otherwise // For a CM108 USB audio device PTT is wired up to one of the GPIO // pins. Usually this is GPIO3 (bit 2 of the GPIO register) because it // is on the corner of the chip package (pin 13) so it's easily accessible. // Some CM108 chips are epoxy-blobbed onto the PCB, so no GPIO // pins are accessible. The SSS1623 chips have a different pinout, so // we make the GPIO bit number configurable. bool set_cmedia(int bitnbr, int ptt) { if (!ptt_dev) return false; // Build a packet for CM108 HID to turn GPIO bit on or off. // Packet is 4 bytes, preceded by a 'report number' byte // 0x00 report number // Write data packet (from CM108 documentation) // byte 0: 00xx xxxx Write GPIO // byte 1: xxxx dcba GPIO3-0 output values (1=high) // byte 2: xxxx dcba GPIO3-0 data-direction register (1=output) // byte 3: xxxx xxxx SPDIF unsigned char out_rep[5]; out_rep[0] = 0x00; out_rep[1] = 0x00; out_rep[2] = ptt ? (0x01 << bitnbr) : 0x00; out_rep[3] = 0x01 << bitnbr; out_rep[4] = 0x00; LOG_DEBUG("bit %d : %d; %s", bitnbr, ptt ? 1 : 0, str2hex(out_rep, 5)); // Send the HID packet int nw = ptt_dev->hid_write(out_rep, 5); if (nw < 0) return false; ptt_state_cmedia = ptt; return true; } // Get the state of Push To Talk from a CM108 GPIO. // return 1 if ON, 0 if OFF int get_cmedia() { return ptt_state_cmedia; } void init_hids() { std::string hidstr = "NONE"; hid_device_info *devs = 0; inp_cmedia_dev->clear(); paths.clear(); if (hid_init()) { inp_cmedia_dev->add(hidstr.c_str()); return; } devs = hid_enumerate(0x0d8c, 0x0); // find all C-Media devices std::string dev_name = "C-Media-A"; while (devs) { LOG_INFO("\n\ HID : %s\n\ vendor id : %04hx\n\ product id : %04hx\n\ Manufacturer : %s\n\ Product : %s\n\ Release : %hx", dev_name.c_str(), devs->vendor_id, devs->product_id, devs->str_manufacturer_string.c_str(), devs->str_product_string.c_str(), devs->release_number); hidstr.append("|").append(dev_name); paths[dev_name] = devs->path; ++dev_name[8]; // increment A->B->C... devs = devs->next; } inp_cmedia_dev->add(hidstr.c_str()); } fldigi-4.2.05/src/cmedia/hid.cxx0000664000175000017500000000104514611711171013264 00000000000000/*********************************************************************** HIDAPI - Multi-Platform library for communication with HID devices. Alan Ott Signal 11 Software 8/22/2009 Linux Version - 6/2/2009 Copyright 2009, All Rights Reserved. This software is licensed under the terms of the GNU General Public License v3. ***********************************************************************/ #ifdef __WIN32__ # include "hid_win.cxx" #else # ifdef __APPLE__ # include "hid_mac.cxx" # else # include "hid_lin.cxx" # endif #endif fldigi-4.2.05/src/cmedia/hid_mac.cxx0000664000175000017500000005613114611711171014112 00000000000000/*********************************************************************** HIDAPI - Multi-Platform library for communication with HID devices. hid_mac.cxx Alan Ott Signal 11 Software Copyright 2009, All Rights Reserved. C++ implementation * Copyright 2021 * David Freese, W1HKJ * for use in fldigi This software is licensed under the terms of the GNU General Public License v3. ***********************************************************************/ /* See Apple Technical Note TN2187 for details on IOHidManager. */ /*********************************************************************** Tested on both Intel and M1 architecture ***********************************************************************/ #include #include "hidapi.h" #define UTF8 134217984 std::string wchar2str( char *WC ) { // size_t count = sizeof(WC); // char MB[count + 1]; // memset(MB, 0, count + 1); // size_t ret = wcstombs(MB, WC, count); static std::string retstr; // if (ret) retstr = MB; return retstr; } int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) { if(count == 0) { errno = EINVAL; return -1; } if(pthread_mutex_init(&barrier->mutex, 0) < 0) { return -1; } if(pthread_cond_init(&barrier->cond, 0) < 0) { pthread_mutex_destroy(&barrier->mutex); return -1; } barrier->trip_count = count; barrier->count = 0; return 0; } int pthread_barrier_destroy(pthread_barrier_t *barrier) { pthread_cond_destroy(&barrier->cond); pthread_mutex_destroy(&barrier->mutex); return 0; } int pthread_barrier_wait(pthread_barrier_t *barrier) { pthread_mutex_lock(&barrier->mutex); ++(barrier->count); if(barrier->count >= barrier->trip_count) { barrier->count = 0; pthread_cond_broadcast(&barrier->cond); pthread_mutex_unlock(&barrier->mutex); return 1; } else { pthread_cond_wait(&barrier->cond, &(barrier->mutex)); pthread_mutex_unlock(&barrier->mutex); return 0; } } static IOHIDManagerRef hid_mgr = 0x0; void hid_device::register_error(const char *op) { } static int32_t get_int_property(IOHIDDeviceRef device, CFStringRef key) { CFTypeRef ref; int32_t value; ref = IOHIDDeviceGetProperty(device, key); if (ref) { if (CFGetTypeID(ref) == CFNumberGetTypeID()) { CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, &value); return value; } } return 0; } static unsigned short get_vendor_id(IOHIDDeviceRef device) { return get_int_property(device, CFSTR(kIOHIDVendorIDKey)); } static unsigned short get_product_id(IOHIDDeviceRef device) { return get_int_property(device, CFSTR(kIOHIDProductIDKey)); } static int32_t get_max_report_length(IOHIDDeviceRef device) { return get_int_property(device, CFSTR(kIOHIDMaxInputReportSizeKey)); } static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, char *buf, size_t len) { if (!len) return 0; CFStringRef str = reinterpret_cast(IOHIDDeviceGetProperty(device, prop)); UniChar ubuf[len]; memset(buf, 0, len); if (str) { CFIndex str_len = CFStringGetLength(str); CFRange range; range.location = 0; range.length = ((size_t)str_len > len)? len: (size_t)str_len; CFStringGetCharacters( str, range, ubuf); for (int i = 0; i < range.length; i++) buf[i] = ubuf[i]; return 0; } else return -1; } static int get_serial_number(IOHIDDeviceRef device, char *buf, size_t len) { return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len); } static int get_manufacturer_string(IOHIDDeviceRef device, char *buf, size_t len) { return get_string_property(device, CFSTR(kIOHIDManufacturerKey), buf, len); } static int get_product_string(IOHIDDeviceRef device, char *buf, size_t len) { return get_string_property(device, CFSTR(kIOHIDProductKey), buf, len); } /* hidapi_IOHIDDeviceGetService() * * Return the io_service_t corresponding to a given IOHIDDeviceRef, either by: * - on OS X 10.6 and above, calling IOHIDDeviceGetService() * - on OS X 10.5, extract it from the IOHIDDevice struct */ static io_service_t hidapi_IOHIDDeviceGetService(IOHIDDeviceRef device) { static void *iokit_framework = NULL; static io_service_t (*dynamic_IOHIDDeviceGetService)(IOHIDDeviceRef device) = NULL; /* Use dlopen()/dlsym() to get a pointer to IOHIDDeviceGetService() if it exists. * If any of these steps fail, dynamic_IOHIDDeviceGetService will be left NULL * and the fallback method will be used. */ if (iokit_framework == NULL) { iokit_framework = dlopen("/System/Library/IOKit.framework/IOKit", RTLD_LAZY); if (iokit_framework != NULL) dynamic_IOHIDDeviceGetService = reinterpret_cast(dlsym(iokit_framework, "IOHIDDeviceGetService")); } if (dynamic_IOHIDDeviceGetService != NULL) { /* Running on OS X 10.6 and above: IOHIDDeviceGetService() exists */ return dynamic_IOHIDDeviceGetService(device); } else { /* Running on OS X 10.5: IOHIDDeviceGetService() doesn't exist. * * Be naughty and pull the service out of the IOHIDDevice. * IOHIDDevice is an opaque struct not exposed to applications, but its * layout is stable through all available versions of OS X. * Tested and working on OS X 10.5.8 i386, x86_64, and ppc. */ struct IOHIDDevice_internal { /* The first field of the IOHIDDevice struct is a * CFRuntimeBase (which is a private CF struct). * * a, b, and c are the 3 fields that make up a CFRuntimeBase. * See http://opensource.apple.com/source/CF/CF-476.18/CFRuntime.h * * The second field of the IOHIDDevice is the io_service_t we're looking for. */ uintptr_t a; uint8_t b[4]; #if __LP64__ uint32_t c; #endif io_service_t service; }; struct IOHIDDevice_internal *tmp = (struct IOHIDDevice_internal *)device; return tmp->service; } } /* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */ static int init_hid_manager(void) { /* Initialize all the HID Manager Objects */ hid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); if (hid_mgr) { IOHIDManagerSetDeviceMatching(hid_mgr, NULL); IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); return 0; } return -1; } /* Initialize the IOHIDManager if necessary. This is the public function, and it is safe to call this function repeatedly. Return 0 for success and -1 for failure. */ int hid_init(void) { if (!hid_mgr) { return init_hid_manager(); } /* Already initialized. */ return 0; } int hid_exit(void) { if (hid_mgr) { /* Close the HID manager. */ IOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone); CFRelease(hid_mgr); hid_mgr = NULL; } return 0; } static void process_pending_events(void) { SInt32 res; do { res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE); } while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut); } hid_device_info *hid_enumerate(unsigned short vendor_id, unsigned short product_id) { hid_device_info *root = NULL; /* return object */ hid_device_info *cur_dev = NULL; CFIndex num_devices; int i; /* Set up the HID Manager if it hasn't been done */ if (hid_init() < 0) return NULL; /* give the IOHIDManager a chance to update itself */ process_pending_events(); /* Get a list of the Devices */ IOHIDManagerSetDeviceMatching(hid_mgr, NULL); CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); /* Convert the list into a C array so we can iterate easily. */ num_devices = CFSetGetCount(device_set); IOHIDDeviceRef *device_array = reinterpret_cast(calloc(num_devices, sizeof(IOHIDDeviceRef))); CFSetGetValues(device_set, (const void **) device_array); /* Iterate over each device, making an entry for it. */ for (i = 0; i < num_devices; i++) { unsigned short dev_vid; unsigned short dev_pid; #define BUF_LEN 256 char buf[BUF_LEN]; IOHIDDeviceRef dev = device_array[i]; if (!dev) { continue; } dev_vid = get_vendor_id(dev); dev_pid = get_product_id(dev); /* Check the VID/PID against the arguments */ if ((vendor_id == 0x0 || vendor_id == dev_vid) && (product_id == 0x0 || product_id == dev_pid)) { hid_device_info *tmp; io_object_t iokit_dev; kern_return_t res; io_string_t path; /* VID/PID match. Create the record. */ tmp = new hid_device_info; if (cur_dev) { cur_dev->next = tmp; } else { root = tmp; } cur_dev = tmp; /* Get the Usage Page and Usage for this device. */ cur_dev->usage_page = get_int_property(dev, CFSTR(kIOHIDPrimaryUsagePageKey)); cur_dev->usage = get_int_property(dev, CFSTR(kIOHIDPrimaryUsageKey)); /* Fill out the record */ cur_dev->next = NULL; /* Fill in the path (IOService plane) */ iokit_dev = hidapi_IOHIDDeviceGetService(dev); res = IORegistryEntryGetPath(iokit_dev, kIOServicePlane, path); if (res == KERN_SUCCESS) cur_dev->path = strdup(path); else cur_dev->path = strdup(""); /* Serial Number */ get_serial_number(dev, buf, BUF_LEN); cur_dev->str_serial_number = buf; /* Manufacturer and Product strings */ get_manufacturer_string(dev, buf, BUF_LEN); cur_dev->str_manufacturer_string = buf; get_product_string(dev, buf, BUF_LEN); std::cout << buf << std::endl; cur_dev->str_product_string = buf; /* VID/PID */ cur_dev->vendor_id = dev_vid; cur_dev->product_id = dev_pid; /* Release Number */ cur_dev->release_number = get_int_property(dev, CFSTR(kIOHIDVersionNumberKey)); /* Interface Number (Unsupported on Mac)*/ cur_dev->interface_number = -1; } } free(device_array); CFRelease(device_set); return root; } void hid_free_enumeration(hid_device_info *devs) { hid_device_info *d = devs; while (d) { hid_device_info *next = d->next; delete d; d = next; } } hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, std::string serial_number) { /* This function is identical to the Linux version. Platform independent. */ hid_device_info *devs, *cur_dev; std::string path_to_open; hid_device * handle = NULL; path_to_open.clear(); devs = hid_enumerate(vendor_id, product_id); cur_dev = devs; while (cur_dev) { if (cur_dev->vendor_id == vendor_id && cur_dev->product_id == product_id) { if (!serial_number.empty() && (cur_dev->str_serial_number == serial_number) ) { path_to_open = cur_dev->path; break; } else { path_to_open = cur_dev->path; break; } } cur_dev = cur_dev->next; } if (!path_to_open.empty()) { /* Open the device */ handle = hid_open_path(path_to_open); } hid_free_enumeration(devs); return handle; } static void hid_device_removal_callback(void *context, IOReturn result, void *sender) { /* Stop the Run Loop for this device. */ hid_device *d = reinterpret_cast(context); d->disconnected = 1; CFRunLoopStop(d->run_loop); } /* The Run Loop calls this function for each input report received. This function puts the data into a linked list to be picked up by hid_read(). */ static void hid_report_callback(void *context, IOReturn result, void *sender, IOHIDReportType report_type, uint32_t report_id, uint8_t *report, CFIndex report_length) { input_report *rpt; hid_device *dev = reinterpret_cast(context); /* Make a new Input Report object */ rpt = reinterpret_cast(calloc(1, sizeof(input_report))); rpt->data = reinterpret_cast(calloc(1, report_length)); memcpy(rpt->data, report, report_length); rpt->len = report_length; rpt->next = NULL; /* Lock this section */ pthread_mutex_lock(&dev->mutex); /* Attach the new report object to the end of the list. */ if (dev->input_reports == NULL) { /* The list is empty. Put it at the root. */ dev->input_reports = rpt; } else { /* Find the end of the list and attach. */ input_report *cur = dev->input_reports; int num_queued = 0; while (cur->next != NULL) { cur = cur->next; num_queued++; } cur->next = rpt; /* Pop one off if we've reached 30 in the queue. This way we don't grow forever if the user never reads anything from the device. */ if (num_queued > 30) { dev->return_data(NULL, 0); } } /* Signal a waiting thread that there is data. */ pthread_cond_signal(&dev->condition); /* Unlock */ pthread_mutex_unlock(&dev->mutex); } /* This gets called when the read_thread's run loop gets signaled by hid_close(), and serves to stop the read_thread's run loop. */ static void perform_signal_callback(void *context) { hid_device *dev = reinterpret_cast(context); CFRunLoopStop(dev->run_loop); /*TODO: CFRunLoopGetCurrent()*/ } static void *read_thread(void *param) { hid_device *dev = reinterpret_cast(param); SInt32 code; /* Move the device's run loop to this thread. */ IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode); /* Create the RunLoopSource which is used to signal the event loop to stop when hid_close() is called. */ CFRunLoopSourceContext ctx; memset(&ctx, 0, sizeof(ctx)); ctx.version = 0; ctx.info = dev; ctx.perform = &perform_signal_callback; dev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx); CFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode); /* Store off the Run Loop so it can be stopped from hid_close() and on device disconnection. */ dev->run_loop = CFRunLoopGetCurrent(); /* Notify the main thread that the read thread is up and running. */ pthread_barrier_wait(&dev->barrier); /* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input reports into the hid_report_callback(). */ while (!dev->shutdown_thread && !dev->disconnected) { code = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE); /* Return if the device has been disconnected */ if (code == kCFRunLoopRunFinished) { dev->disconnected = 1; break; } /* Break if The Run Loop returns Finished or Stopped. */ if (code != kCFRunLoopRunTimedOut && code != kCFRunLoopRunHandledSource) { /* There was some kind of error. Setting shutdown seems to make sense, but there may be something else more appropriate */ dev->shutdown_thread = 1; break; } } /* Now that the read thread is stopping, Wake any threads which are waiting on data (in hid_read_timeout()). Do this under a mutex to make sure that a thread which is about to go to sleep waiting on the condition actually will go to sleep before the condition is signaled. */ pthread_mutex_lock(&dev->mutex); pthread_cond_broadcast(&dev->condition); pthread_mutex_unlock(&dev->mutex); /* Wait here until hid_close() is called and makes it past the call to CFRunLoopWakeUp(). This thread still needs to be valid when that function is called on the other thread. */ pthread_barrier_wait(&dev->shutdown_barrier); return NULL; } /* hid_open_path() * * path must be a valid path to an IOHIDDevice in the IOService plane * Example: "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/PLAYSTATION(R)3 Controller@fd120000/IOUSBInterface@0/IOUSBHIDDriver" */ hid_device * hid_open_path(std::string path) { hid_device *dev = NULL; io_registry_entry_t entry = MACH_PORT_NULL; IOReturn ret; dev = new hid_device; /* Set up the HID Manager if it hasn't been done */ if (hid_init() < 0) return NULL; /* Get the IORegistry entry for the given path */ entry = IORegistryEntryFromPath(kIOMasterPortDefault, path.c_str()); if (entry == MACH_PORT_NULL) { /* Path wasn't valid (maybe device was removed?) */ goto return_error; } /* Create an IOHIDDevice for the entry */ dev->device_handle = IOHIDDeviceCreate(kCFAllocatorDefault, entry); if (dev->device_handle == NULL) { /* Error creating the HID device */ goto return_error; } /* Open the IOHIDDevice */ ret = IOHIDDeviceOpen(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); if (ret == kIOReturnSuccess) { char str[32]; /* Create the buffers for receiving data */ dev->max_input_report_len = (CFIndex) get_max_report_length(dev->device_handle); dev->input_report_buf = reinterpret_cast(calloc(dev->max_input_report_len, sizeof(uint8_t))); /* Create the Run Loop Mode for this device. printing the reference seems to work. */ sprintf(str, "HIDAPI_%p", dev->device_handle); dev->run_loop_mode = CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); /* Attach the device to a Run Loop */ IOHIDDeviceRegisterInputReportCallback( dev->device_handle, dev->input_report_buf, dev->max_input_report_len, &hid_report_callback, dev); IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev); /* Start the read thread */ pthread_create(&dev->thread, NULL, read_thread, dev); /* Wait here for the read thread to be initialized. */ pthread_barrier_wait(&dev->barrier); IOObjectRelease(entry); return dev; } else { goto return_error; } return_error: if (dev->device_handle != NULL) CFRelease(dev->device_handle); if (entry != MACH_PORT_NULL) IOObjectRelease(entry); delete dev; return NULL; } int hid_device::set_report(IOHIDReportType type, const unsigned char *data, size_t length) { const unsigned char *data_to_send; size_t length_to_send; IOReturn res; /* Return if the device has been disconnected. */ if (disconnected) return -1; if (data[0] == 0x0) { /* Not using numbered Reports. Don't send the report number. */ data_to_send = data+1; length_to_send = length-1; } else { /* Using numbered Reports. Send the Report Number */ data_to_send = data; length_to_send = length; } if (!disconnected) { res = IOHIDDeviceSetReport(device_handle, type, data[0], /* Report ID*/ data_to_send, length_to_send); if (res == kIOReturnSuccess) { return length; } else return -1; } return -1; } int hid_device::hid_write(const unsigned char *data, size_t length) { return set_report(kIOHIDReportTypeOutput, data, length); } /* Helper function, so that this isn't duplicated in hid_read(). */ int hid_device::return_data(unsigned char *data, size_t length) { /* Copy the data out of the linked list item (rpt) into the return buffer (data), and delete the liked list item. */ input_report *rpt = input_reports; size_t len = (length < rpt->len)? length: rpt->len; memcpy(data, rpt->data, len); input_reports = rpt->next; free(rpt->data); free(rpt); return len; } int hid_device::cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) { while (!input_reports) { int res = pthread_cond_wait(cond, mutex); if (res != 0) return res; /* A res of 0 means we may have been signaled or it may be a spurious wakeup. Check to see that there's acutally data in the queue before returning, and if not, go back to sleep. See the pthread_cond_timedwait() man page for details. */ if (shutdown_thread || disconnected) return -1; } return 0; } int hid_device::cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) { while (!input_reports) { int res = pthread_cond_timedwait(cond, mutex, abstime); if (res != 0) return res; /* A res of 0 means we may have been signaled or it may be a spurious wakeup. Check to see that there's acutally data in the queue before returning, and if not, go back to sleep. See the pthread_cond_timedwait() man page for details. */ if (shutdown_thread || disconnected) return -1; } return 0; } int hid_device::hid_read_timeout(unsigned char *data, size_t length, int milliseconds) { int bytes_read = -1; /* Lock the access to the report list. */ pthread_mutex_lock(&mutex); /* There's an input report queued up. Return it. */ if (input_reports) { /* Return the first one */ bytes_read = return_data(data, length); goto ret; } /* Return if the device has been disconnected. */ if (disconnected) { bytes_read = -1; goto ret; } if (shutdown_thread) { /* This means the device has been closed (or there has been an error. An error code of -1 should be returned. */ bytes_read = -1; goto ret; } /* There is no data. Go to sleep and wait for data. */ if (milliseconds == -1) { /* Blocking */ int res; res = cond_wait(&condition, &mutex); if (res == 0) bytes_read = return_data(data, length); else { /* There was an error, or a device disconnection. */ bytes_read = -1; } } else if (milliseconds > 0) { /* Non-blocking, but called with timeout. */ int res; struct timespec ts; struct timeval tv; gettimeofday(&tv, NULL); TIMEVAL_TO_TIMESPEC(&tv, &ts); ts.tv_sec += milliseconds / 1000; ts.tv_nsec += (milliseconds % 1000) * 1000000; if (ts.tv_nsec >= 1000000000L) { ts.tv_sec++; ts.tv_nsec -= 1000000000L; } res = cond_timedwait(&condition, &mutex, &ts); if (res == 0) bytes_read = return_data(data, length); else if (res == ETIMEDOUT) bytes_read = 0; else bytes_read = -1; } else { /* Purely non-blocking */ bytes_read = 0; } ret: /* Unlock */ pthread_mutex_unlock(&mutex); return bytes_read; } int hid_device::hid_read(unsigned char *data, size_t length) { return hid_read_timeout(data, length, (blocking)? -1: 0); } int hid_device::hid_set_nonblocking(int nonblock) { /* All Nonblocking operation is handled by the library. */ blocking = !nonblock; return 0; } int hid_device::hid_send_feature_report(const unsigned char *data, size_t length) { return set_report(kIOHIDReportTypeFeature, data, length); } int hid_device::hid_get_feature_report(unsigned char *data, size_t length) { CFIndex len = length; IOReturn res; /* Return if the device has been unplugged. */ if (disconnected) return -1; res = IOHIDDeviceGetReport(device_handle, kIOHIDReportTypeFeature, data[0], /* Report ID */ data, &len); if (res == kIOReturnSuccess) return len; else return -1; } void hid_device::hid_close() { /* Disconnect the report callback before close. */ if (!disconnected) { IOHIDDeviceRegisterInputReportCallback( device_handle, input_report_buf, max_input_report_len, NULL, this); IOHIDDeviceRegisterRemovalCallback(device_handle, NULL, this); IOHIDDeviceUnscheduleFromRunLoop(device_handle, run_loop, run_loop_mode); IOHIDDeviceScheduleWithRunLoop(device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode); } /* Cause read_thread() to stop. */ shutdown_thread = 1; /* Wake up the run thread's event loop so that the thread can exit. */ CFRunLoopSourceSignal(source); CFRunLoopWakeUp(run_loop); /* Notify the read thread that it can shut down now. */ pthread_barrier_wait(&shutdown_barrier); /* Wait for read_thread() to end. */ pthread_join(thread, NULL); /* Close the OS handle to the device, but only if it's not been unplugged. If it's been unplugged, then calling IOHIDDeviceClose() will crash. */ if (!disconnected) { IOHIDDeviceClose(device_handle, kIOHIDOptionsTypeSeizeDevice); } /* Clear out the queue of received reports. */ pthread_mutex_lock(&mutex); while (input_reports) { return_data(NULL, 0); } pthread_mutex_unlock(&mutex); CFRelease(device_handle); // delete dev; } const char * hid_device::hid_error() { return "HID error string not implemented"; } fldigi-4.2.05/src/cmedia/hid_lin.cxx0000664000175000017500000003256314611711171014137 00000000000000/*********************************************************************** HIDAPI - Multi-Platform library for communication with HID devices. hid_lin.cxx Alan Ott Signal 11 Software Copyright 2009, All Rights Reserved. C++ implementation * Copyright 2021 * David Freese, W1HKJ * for use in fldigi This software is licensed under the terms of the GNU General Public License v3. ***********************************************************************/ #include /* C */ #include #include #include #include #include /* Unix */ #include #include #include #include #include #include #include /* Linux */ #include #include #include #include #include "hidapi.h" /* Definitions from linux/hidraw.h. Since these are new, some distros may not have header files which contain them. */ #ifndef HIDIOCSFEATURE #define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) #endif #ifndef HIDIOCGFEATURE #define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) #endif /* uses_numbered_reports() returns 1 if report_descriptor describes a device which contains numbered reports. */ static int uses_numbered_reports(__u8 *report_descriptor, __u32 size) { unsigned int i = 0; int size_code; int data_len, key_size; while (i < size) { int key = report_descriptor[i]; /* Check for the Report ID key */ if (key == 0x85/*Report ID*/) { /* This device has a Report ID, which means it uses numbered reports. */ return 1; } //printf("key: %02hhx\n", key); if ((key & 0xf0) == 0xf0) { /* This is a Long Item. The next byte contains the length of the data section (value) for this key. See the HID specification, version 1.11, section 6.2.2.3, titled "Long Items." */ if (i+1 < size) data_len = report_descriptor[i+1]; else data_len = 0; /* malformed report */ key_size = 3; } else { /* This is a Short Item. The bottom two bits of the key contain the size code for the data section (value) for this key. Refer to the HID specification, version 1.11, section 6.2.2.2, titled "Short Items." */ size_code = key & 0x3; switch (size_code) { case 0: case 1: case 2: data_len = size_code; break; case 3: data_len = 4; break; default: /* Can't ever happen since size_code is & 0x3 */ data_len = 0; break; }; key_size = 1; } /* Skip over this key and it's associated data */ i += data_len + key_size; } /* Didn't find a Report ID key. Device doesn't use numbered reports. */ return 0; } /* * The caller is responsible for free()ing the (newly-allocated) character * strings pointed to by serial_number_utf8 and product_name_utf8 after use. */ static int parse_uevent_info(const char *uevent, int *bus_type, unsigned short *vendor_id, unsigned short *product_id, char **serial_number_utf8, char **product_name_utf8) { char *tmp = strdup(uevent); char *saveptr = NULL; char *line; char *key; char *value; int found_id = 0; int found_serial = 0; int found_name = 0; line = strtok_r(tmp, "\n", &saveptr); while (line != NULL) { /* line: "KEY=value" */ key = line; value = strchr(line, '='); if (!value) { goto next_line; } *value = '\0'; value++; if (strcmp(key, "HID_ID") == 0) { /** * type vendor product * HID_ID=0003:000005AC:00008242 **/ int ret = sscanf(value, "%x:%hx:%hx", bus_type, vendor_id, product_id); if (ret == 3) { found_id = 1; } } else if (strcmp(key, "HID_NAME") == 0) { /* The caller has to free the product name */ *product_name_utf8 = strdup(value); found_name = 1; } else if (strcmp(key, "HID_UNIQ") == 0) { /* The caller has to free the serial number */ *serial_number_utf8 = strdup(value); found_serial = 1; } next_line: line = strtok_r(NULL, "\n", &saveptr); } free(tmp); return (found_id && found_name && found_serial); } int hid_init(void) { const char *locale; /* Set the locale if it's not set. */ locale = setlocale(LC_CTYPE, NULL); if (!locale) setlocale(LC_CTYPE, ""); return 0; } int hid_exit(void) { /* Nothing to do for this in the Linux/hidraw implementation. */ return 0; } hid_device_info *hid_enumerate(unsigned short vendor_id, unsigned short product_id) { struct udev *udev; struct udev_enumerate *enumerate; struct udev_list_entry *devices, *dev_list_entry; hid_device_info *root = NULL; /* return object */ hid_device_info *cur_dev = NULL; hid_device_info *prev_dev = NULL; /* previous device */ hid_init(); /* Create the udev object */ udev = udev_new(); if (!udev) { printf("Can't create udev\n"); return NULL; } /* Create a list of the devices in the 'hidraw' subsystem. */ enumerate = udev_enumerate_new(udev); udev_enumerate_add_match_subsystem(enumerate, "hidraw"); udev_enumerate_scan_devices(enumerate); devices = udev_enumerate_get_list_entry(enumerate); /* For each item, see if it matches the vid/pid, and if so create a udev_device record for it */ udev_list_entry_foreach(dev_list_entry, devices) { const char *sysfs_path; const char *dev_path; const char *str; struct udev_device *raw_dev; /* The device's hidraw udev node. */ struct udev_device *hid_dev; /* The device's HID udev node. */ struct udev_device *usb_dev; /* The device's USB udev node. */ struct udev_device *intf_dev; /* The device's interface (in the USB sense). */ unsigned short dev_vid; unsigned short dev_pid; char *serial_number_utf8 = NULL; char *product_name_utf8 = NULL; int bus_type; int result; /* Get the filename of the /sys entry for the device and create a udev_device object (dev) representing it */ sysfs_path = udev_list_entry_get_name(dev_list_entry); raw_dev = udev_device_new_from_syspath(udev, sysfs_path); dev_path = udev_device_get_devnode(raw_dev); hid_dev = udev_device_get_parent_with_subsystem_devtype( raw_dev, "hid", NULL); if (!hid_dev) { /* Unable to find parent hid device. */ goto next; } result = parse_uevent_info( udev_device_get_sysattr_value(hid_dev, "uevent"), &bus_type, &dev_vid, &dev_pid, &serial_number_utf8, &product_name_utf8); if (!result) { /* parse_uevent_info() failed for at least one field. */ goto next; } if (bus_type != BUS_USB && bus_type != BUS_BLUETOOTH) { /* We only know how to handle USB and BT devices. */ goto next; } /* Check the VID/PID against the arguments */ if ((vendor_id == 0x0 || vendor_id == dev_vid) && (product_id == 0x0 || product_id == dev_pid)) { hid_device_info *tmp = new hid_device_info; if (cur_dev) { cur_dev->next = tmp; } else { root = tmp; } prev_dev = cur_dev; cur_dev = tmp; /* Fill out the record */ cur_dev->next = NULL; cur_dev->path.assign(dev_path ? dev_path : ""); /* VID/PID */ cur_dev->vendor_id = dev_vid; cur_dev->product_id = dev_pid; /* Serial Number */ cur_dev->str_serial_number.assign(serial_number_utf8); /* Release Number */ cur_dev->release_number = 0x0; /* Interface Number */ cur_dev->interface_number = -1; switch (bus_type) { case BUS_USB: /* The device pointed to by raw_dev contains information about the hidraw device. In order to get information about the USB device, get the parent device with the subsystem/devtype pair of "usb"/"usb_device". This will be several levels up the tree, but the function will find it. */ usb_dev = udev_device_get_parent_with_subsystem_devtype( raw_dev, "usb", "usb_device"); if (!usb_dev) { delete cur_dev; /* Take it off the device list. */ if (prev_dev) { prev_dev->next = NULL; cur_dev = prev_dev; } else { cur_dev = root = NULL; } goto next; } /* Manufacturer and Product strings */ str = udev_device_get_sysattr_value(usb_dev, "manufacturer"); if (str) cur_dev->str_manufacturer_string.assign(str); str = udev_device_get_sysattr_value(usb_dev, "product"); if (str) cur_dev->str_product_string.assign(str); /* Release Number */ str = udev_device_get_sysattr_value(usb_dev, "bcdDevice"); if (str) cur_dev->release_number = strtol(str, NULL, 16); else cur_dev = 0x0; /* Get a handle to the interface's udev node. */ intf_dev = udev_device_get_parent_with_subsystem_devtype( raw_dev, "usb", "usb_interface"); if (intf_dev) { str = udev_device_get_sysattr_value(intf_dev, "bInterfaceNumber"); cur_dev->interface_number = (str)? strtol(str, NULL, 16): -1; } break; case BUS_BLUETOOTH: /* Manufacturer and Product strings */ cur_dev->str_product_string.assign(product_name_utf8); break; default: /* Unknown device type - this should never happen, as we * check for USB and Bluetooth devices above */ break; } } next: free(serial_number_utf8); free(product_name_utf8); udev_device_unref(raw_dev); /* hid_dev, usb_dev and intf_dev don't need to be (and can't be) unref()d. It will cause a double-free() error. I'm not sure why. */ } /* Free the enumerator and udev objects. */ udev_enumerate_unref(enumerate); udev_unref(udev); return root; } void hid_free_enumeration(hid_device_info *devs) { hid_device_info *d = devs; while (d) { hid_device_info *next = d->next; delete d; d = next; } } hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, std::string serial_number) { hid_device_info *devs, *cur_dev; hid_device *device = NULL; std::string path_to_open; devs = hid_enumerate(vendor_id, product_id); cur_dev = devs; while (cur_dev) { if (cur_dev->vendor_id == vendor_id && cur_dev->product_id == product_id) { if (!serial_number.empty() && (cur_dev->str_serial_number == serial_number) ) { path_to_open = cur_dev->path; break; } else { path_to_open = cur_dev->path; break; } } cur_dev = cur_dev->next; } if (!path_to_open.empty()) { /* Open the device */ device = hid_open_path(path_to_open); } hid_free_enumeration(devs); return device; } hid_device * hid_open_path(std::string path) { hid_device *dev = new hid_device; hid_init(); /* OPEN HERE */ dev->device_handle = open(path.c_str(), O_RDWR); /* If we have a good handle, return it. */ if (dev->device_handle > 0) { /* Get the report descriptor */ int res, desc_size = 0; struct hidraw_report_descriptor rpt_desc; memset(&rpt_desc, 0x0, sizeof(rpt_desc)); /* Get Report Descriptor Size */ res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size); if (res < 0) perror("HIDIOCGRDESCSIZE"); /* Get Report Descriptor */ rpt_desc.size = desc_size; res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc); if (res < 0) { perror("HIDIOCGRDESC"); } else { /* Determine if this device uses numbered reports. */ dev->uses_numbered_reports = uses_numbered_reports(rpt_desc.value, rpt_desc.size); } return dev; } else { /* Unable to open any devices. */ delete dev; return (hid_device *)0; } } int hid_device::hid_write(const unsigned char *data, size_t length) { int bytes_written; bytes_written = write(device_handle, data, length); return bytes_written; } int hid_device::hid_read_timeout(unsigned char *data, size_t length, int milliseconds) { int bytes_read; if (milliseconds >= 0) { /* Milliseconds is either 0 (non-blocking) or > 0 (contains a valid timeout). In both cases we want to call poll() and wait for data to arrive. Don't rely on non-blocking operation (O_NONBLOCK) since some kernels don't seem to properly report device disconnection through read() when in non-blocking mode. */ int ret; struct pollfd fds; fds.fd = device_handle; fds.events = POLLIN; fds.revents = 0; ret = poll(&fds, 1, milliseconds); if (ret == -1 || ret == 0) { /* Error or timeout */ return ret; } else { /* Check for errors on the file descriptor. This will indicate a device disconnection. */ if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) return -1; } } bytes_read = read(device_handle, data, length); if (bytes_read < 0 && (errno == EAGAIN || errno == EINPROGRESS)) bytes_read = 0; return bytes_read; } int hid_device::hid_read(unsigned char *data, size_t length) { return hid_read_timeout(data, length, (blocking)? -1: 0); } int hid_device::hid_set_nonblocking(int nonblock) { /* Do all non-blocking in userspace using poll(), since it looks like there's a bug in the kernel in some versions where read() will not return -1 on disconnection of the USB device */ blocking = !nonblock; return 0; /* Success */ } int hid_device::hid_send_feature_report(const unsigned char *data, size_t length) { int res; res = ioctl(device_handle, HIDIOCSFEATURE(length), data); if (res < 0) perror("ioctl (SFEATURE)"); return res; } int hid_device::hid_get_feature_report(unsigned char *data, size_t length) { int res; res = ioctl(device_handle, HIDIOCGFEATURE(length), data); if (res < 0) perror("ioctl (GFEATURE)"); return res; } void hid_device::hid_close() { close(device_handle); } const char *hid_device::hid_error() { return "HID error string not implemented"; } fldigi-4.2.05/src/config_script/0000775000175000017500000000000014611714005013462 500000000000000fldigi-4.2.05/src/config_script/script_parsing.h0000664000175000017500000005005214611712162016606 00000000000000//====================================================================== // script_parsing.h (FLDIGI) // // Author(s): // // Robert Stiles, KK5VD, Copyright (C) 2014 // // This is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ===================================================================== #ifndef __script_parsing__ #define __script_parsing__ #include #include #ifdef __WIN32__ #define PATH_SEPERATOR "\\" #define PATH_CHAR_SEPERATOR '\\' #include #define get_current_dir _getcwd #else #define PATH_SEPERATOR "/" #define PATH_CHAR_SEPERATOR '/' #include #define get_current_dir getcwd #endif #define MAX_CMD_PARAMETERS 5 #define MAX_COMMAND_LENGTH 128 #define MAX_PARAMETER_LENGTH FILENAME_MAX #define MAX_READLINE_LENGTH (FILENAME_MAX+FILENAME_MAX) #define MAX_SUB_SCRIPTS 5 #define SCRIPT_FILE_TAG ((char *)"FLDIGI_CONFIG") #define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) #define RESET_ALL 0x01 #define RESET_PARTIAL 0X02 #undef __LOCALIZED_SCRIPT_COMMANDS #ifdef __LOCALIZED_SCRIPT_COMMANDS #pragma message ( \ "\n" \ "************************************************************************\n" \ "* Defining __LOCALIZED_SCRIPT_COMMANDS breaks script compatibility. In *\n" \ "* doing so, FLDIGI development team does not assume responsibility for *\n" \ "* maintaining the code sections that are altered/effected as a result. *\n" \ "************************************************************************\n" ) #define F_LOC(a) _(a) #else #define F_LOC(a) a #endif #define CMD_OPERATOR F_LOC("OPERATOR") #define CMD_CALLSIGN F_LOC("CALLSIGN") #define CMD_NAME F_LOC("NAME") #define CMD_QTH F_LOC("QTH") #define CMD_LOCATOR F_LOC("LOC") #define CMD_ANTENNA F_LOC("ANT") #define CMD_AUDIO_DEVICE F_LOC("AUDIO DEVICE") #define CMD_OSS_AUDIO F_LOC("OSS") #define CMD_OSS_AUDIO_DEV_PATH F_LOC("OSS DEV") #define CMD_PORT_AUDIO F_LOC("PA") #define CMD_PORTA_CAP F_LOC("PA CAPTURE") #define CMD_PORTA_PLAY F_LOC("PA PLAYBACK") #define CMD_PULSEA F_LOC("PUA") #define CMD_PULSEA_SERVER F_LOC("PUA SERVER") #define CMD_AUDIO_SETTINGS F_LOC("AUDIO SETTINGS") #define CMD_CAPTURE_SAMPLE_RATE F_LOC("CAPTURE") #define CMD_PLAYBACK_SAMPLE_RATE F_LOC("PLAYBACK") #define CMD_AUDIO_CONVERTER F_LOC("CONVERTER") #define CMD_RX_PPM F_LOC("RX PPM") #define CMD_TX_PPM F_LOC("TX PPM") #define CMD_TX_OFFSET F_LOC("TX OFFSET") #define CMD_AUDIO_RT_CHANNEL F_LOC("AUDIO RT CHANNEL") #define CMD_MONO_AUDIO F_LOC("MONO AUDIO") #define CMD_AUDIO_L_R F_LOC("MODEM LR") #define CMD_AUDIO_REV_L_R F_LOC("REV LR") #define CMD_PTT_RIGHT_CHAN F_LOC("PTT RT CHAN") #define CMD_CW_QSK_RT_CHAN F_LOC("QSK RT CHAN") #define CMD_PSEUDO_FSK_RT_CHAN F_LOC("FSK RT CHAN") #define CMD_AUDIO_WAVE F_LOC("AUDIO WAVE") #define CMD_WAVE_SR F_LOC("SRATE") #define CMD_HRDWR_PTT F_LOC("RIG HRDWR PTT") #define CMD_HPPT_PTT_RT F_LOC("PTT RT CHAN") #define CMD_HPTT_SP2 F_LOC("SERIAL PORT") #define CMD_HPTT_SP2_PATH F_LOC("DEVICE") #define CMD_HPTT_SP2_RTS F_LOC("RTS") #define CMD_HPTT_SP2_DTR F_LOC("DTR") #define CMD_HPTT_SP2_RTS_V F_LOC("RTSV") #define CMD_HPTT_SP2_DTR_V F_LOC("DTRV") #define CMD_HPTT_SP2_START_DELAY F_LOC("START PTT DELAY") #define CMD_HPTT_SP2_END_DELAY F_LOC("END PTT DELAY") #define CMD_HPTT_UHROUTER F_LOC("UHROUTER") #define CMD_HPTT_PARALLEL F_LOC("PARALLEL") #define CMD_HPTT_SP2_INITIALIZE F_LOC("INIT") #define CMD_CMEDIA_PTT F_LOC("CMEDIA PTT") #define CMD_USE_CMEDIA_PTT F_LOC("CMEDIA_PTT") #define CMD_CMEDIA_DEV F_LOC("CMEDIA_DEVICE") #define CMD_CMEDIA_GPIO_LINE F_LOC("CMEDIA_GPIO_LINE") #define CMD_RIGCAT F_LOC("RIGCAT") #define CMD_RIGCAT_STATE F_LOC("STATE") #define CMD_RIGCAT_DESC_FILE F_LOC("DESC FILE") #define CMD_RIGCAT_DEV_PATH F_LOC("DEV PATH") #define CMD_RIGCAT_RETRIES F_LOC("RETRIES") #define CMD_RIGCAT_RETRY_INTERVAL F_LOC("RETRY INT") #define CMD_RIGCAT_WRITE_DELAY F_LOC("WDELAY") #define CMD_RIGCAT_INTIAL_DELAY F_LOC("IDELAY") #define CMD_RIGCAT_BAUD_RATE F_LOC("BRATE") #define CMD_RIGCAT_STOP_BITS F_LOC("SBITS") #define CMD_RIGCAT_ECHO F_LOC("ECHO") #define CMD_RIGCAT_TOGGLE_RTS_PTT F_LOC("TOGGLE RTS PTT") #define CMD_RIGCAT_TOGGLE_DTR_PTT F_LOC("TOGGLE DTR PTT") #define CMD_RIGCAT_RESTORE F_LOC("RESTORE") #define CMD_RIGCAT_PTT_COMMAND F_LOC("PTT COMMAND") #define CMD_RIGCAT_RTS_12V F_LOC("RTS 12V") #define CMD_RIGCAT_DTR_12V F_LOC("DTR 12V") #define CMD_RIGCAT_HRDWR_FLOW F_LOC("HRDWR FC") #define CMD_RIGCAT_VSP F_LOC("VSP") #define CMD_RIGCAT_INITIALIZE F_LOC("INIT") #define CMD_HAMLIB F_LOC("HAMLIB") #define CMD_HAMLIB_STATE F_LOC("STATE") #define CMD_HAMLIB_RIG F_LOC("RIG") #define CMD_HAMLIB_DEV_PATH F_LOC("DEV PATH") #define CMD_HAMLIB_RETRIES F_LOC("RETRIES") #define CMD_HAMLIB_RETRY_INTERVAL F_LOC("RETRY INT") #define CMD_HAMLIB_WRITE_DELAY F_LOC("WDELAY") #define CMD_HAMLIB_POST_WRITE_DELAY F_LOC("PWDELAY") #define CMD_HAMLIB_BAUD_RATE F_LOC("BRATE") #define CMD_HAMLIB_STOP_BITS F_LOC("SBITS") #define CMD_HAMLIB_POLL_RATE F_LOC("POLL_RATE") #define CMD_HAMLIB_SIDE_BAND F_LOC("SBAND") #define CMD_HAMLIB_PTT_COMMAND F_LOC("PTT COMMAND") #define CMD_HAMLIB_DTR_12V F_LOC("DTR 12V") #define CMD_HAMLIB_RTS_12V F_LOC("RTS 12V") #define CMD_HAMLIB_HRDWR_FLOW F_LOC("HRDWR FC") #define CMD_HAMLIB_SFTWR_FLOW F_LOC("SFTWR FC") #define CMD_HAMLIB_ADV_CONFIG F_LOC("ADV CONF") #define CMD_HAMLIB_INITIALIZE F_LOC("INIT") #define CMD_RC_XMLRPC F_LOC("XMLRPC RC") #define CMD_RC_XMLRPC_STATE F_LOC("STATE") #define CMD_RC_XMLRPC_BW_DELAY F_LOC("BWDELAY") #define CMD_RC_XMLRPC_INITIALIZE F_LOC("INIT") #define CMD_FLDIGI F_LOC("FLDIGI") #define CMD_FLDIGI_FREQ F_LOC("FREQ") #define CMD_FLDIGI_MODE F_LOC("MODE") #define CMD_FLDIGI_WFHZ F_LOC("WFHZ") #define CMD_FLDIGI_RXID F_LOC("RXID") #define CMD_FLDIGI_TXID F_LOC("TXID") #define CMD_FLDIGI_SPOT F_LOC("SPOT") #define CMD_FLDIGI_REV F_LOC("REV") #define CMD_FLDIGI_LOCK F_LOC("LOCK") #define CMD_FLDIGI_AFC F_LOC("AFC") #define CMD_FLDIGI_SQL F_LOC("SQL") #define CMD_FLDIGI_KPSQL F_LOC("KPSQL") #define CMD_FLDIGI_KPSM F_LOC("KPSM") #define CMD_FLDIGI_MODEM F_LOC("MODEM") #define CMD_IO F_LOC("IO") #define CMD_IO_LOCK F_LOC("LOCK") #define CMD_IO_ACT_PORT F_LOC("PORT") #define CMD_IO_AX25_DECODE F_LOC("AX25D") #define CMD_IO_CSMA F_LOC("CSMA") #define CMD_IO_KISS F_LOC("KISS") #define CMD_IO_KISS_IPA F_LOC("IPA") #define CMD_IO_KISS_IOPN F_LOC("IOPN") #define CMD_IO_KISS_OPN F_LOC("OPN") #define CMD_IO_KISS_DP F_LOC("DP") #define CMD_IO_KISS_BUSY F_LOC("BUSY") #define CMD_IO_KISS_CONT F_LOC("CONT") #define CMD_IO_KISS_ATTEN F_LOC("ATTEN") #define CMD_IO_ARQ F_LOC("ARQ") #define CMD_IO_ARQ_IPA F_LOC("IPA") #define CMD_IO_ARQ_IOPN F_LOC("IOPN") #define CMD_IO_XMLRPC F_LOC("XMLRPC") #define CMD_IO_XMLRPC_IPA F_LOC("IPA") #define CMD_IO_XMLRPC_IOPN F_LOC("IOPN") #define CMD_NBEMS F_LOC("MISC NBEMS") #define CMD_NBEMS_STATE F_LOC("STATE") #define CMD_NBEMS_MSG F_LOC("OPEN MSG") #define CMD_NBEMS_FLMSG F_LOC("OPEN FLMSG") #define CMD_NBEMS_FLMSG_PATH F_LOC("PATH") #define CMD_NBEMS_BRWSR F_LOC("OPEN BRWSR") #define CMD_NBEMS_TIMEOUT F_LOC("TIMEOUT") #define CMD_ID F_LOC("ID") #define CMD_ID_RSID F_LOC("RSID") #define CMD_ID_RSID_NOTIFY F_LOC("NOTIFY") #define CMD_ID_RSID_SRCH_BP F_LOC("SRCH BP") #define CMD_ID_RSID_MARK_PREV F_LOC("MARK PREV") #define CMD_ID_RSID_DETECTOR F_LOC("DETECTOR") #define CMD_ID_RSID_ALRT_DIALOG F_LOC("ALRT DIALOG") #define CMD_ID_RSID_TX_FREQ_LOCK F_LOC("TX FREQ LOCK") #define CMD_ID_RSID_FREQ_CHANGE F_LOC("FREQ CHANGE") #define CMD_ID_RSID_ALLOW_ERRORS F_LOC("ALLOW ERRORS") #define CMD_ID_RSID_SQL_OPEN F_LOC("SQL OPEN") #define CMD_ID_RSID_PRETONE F_LOC("PRETONE") #define CMD_ID_RSID_END_XMT_ID F_LOC("END XMT ID") #define CMD_ID_RSID_MIN_BW F_LOC("MIN_BW") #define CMD_ID_VIDEO F_LOC("VIDEO") #define CMD_ID_VIDEO_TX_ID_MODE F_LOC("ID MODE") #define CMD_ID_VIDEO_TX_VIDEO_TXT F_LOC("VIDEO TXT") #define CMD_ID_VIDEO_TX_TXT_INP F_LOC("TEXT INPUT") #define CMD_ID_VIDEO_SMALL_FONT F_LOC("SMALL FONT") #define CMD_ID_VIDEO_500_HZ F_LOC("500HZ") #define CMD_ID_VIDEO_WIDTH_LIMIT F_LOC("WIDTH LIMIT") #define CMD_ID_VIDEO_CHAR_ROW F_LOC("CHAR ROW") #define CMD_ID_CW F_LOC("CW") #define CMD_ID_CW_TX_CALLSIGN F_LOC("TX CALL") #define CMD_ID_CW_SPEED F_LOC("SPEED") #define CMD_LOAD_MACRO F_LOC("MACRO") #define CMD_END_CMD F_LOC("END") // Parameters localized - no restrictions. #define PARM_ENABLE _("ENABLE") #define PARM_YES _("YES") #define PARM_DISABLE _("DISABLE") #define PARM_NO _("NO") #define PARM_KISS _("KISS") #define PARM_ARQ _("ARQ") #define SCRIPT_COMMAND 0x0001 #define SCRIPT_DOT_NOTATION_ONLY 0x0002 #define SCRIPT_STRUCTURED_ONLY 0x0004 #define RECURSIVE_LIMIT 3 #define MAX_DELETE_LIST_COUNT 100 //! @enum script_codes //! Error codes. //! @typedef SCRIPT_CODES //! @see script_codes typedef enum script_codes { script_recursive_limit_reached = -100, //!< Reached command recursive limit. script_command_not_found = -100, //!< Script command not found. script_unexpected_eof, //!< Unexspected end of file reached. script_file_read_error, //!< File read error script_errors_reported, //!< Script Errors found during parsing of file. script_file_not_found, //!< Script file not found. script_path_not_found, //!< Script directory path not found. script_device_path_not_found, //!< Script device path not found. script_non_script_file, //!< Opened file not a Script file. script_max_sub_script_reached, //!< Maximum open subscripts reached. script_subscript_exec_fail, //!< Subscript execution fail (internal). script_incorrectly_assigned_value, //!< Incorrect parameter type. script_invalid_parameter, //!< Parameter is not valid. script_parameter_error, //!< Script parameter invalid. script_function_parameter_error, //!< Function parameter error (internal, non script error). script_mismatched_quotes, //!< Opening or closing quotes missing prior to reaching end if line. script_command_seperator_missing, //!< Command missing ':' script_args_eol, //!< Reached end of args list sooner then expected script_param_check_eol, //!< Reached end of parameter check list sooner then expected script_paramter_exceeds_length, //!< Data length exceeds expectations script_memory_allocation_error, //!< Memory Allocation Error (Non-Script internal Error). script_general_error = -1, //!< General purpose error (undefined erros). script_no_errors, //!< No Errors script_char_match_not_found, //!< Search char not found (Warning) script_end_of_line_reached, //!< End of line reached (Warning) script_end_of_list_reached, //!< End of list reached (Info) script_list, //!< List command (Info) script_command_handled, //!< Command was procedded and handled (Info) } SCRIPT_CODES; //! @enum paramter_types //! Parameter type flags. Used to validate the informarion. //! @typedef PARAM_TYPES //! @see paramter_types typedef enum paramter_types { p_null = 0, p_void, p_bool, p_char, p_int, p_unsigned_int, p_long, p_unsigned_long, p_float, p_double, p_string, p_path, p_filename, p_dev_path, p_dev_name, p_list, p_list_end } PARAM_TYPES; class ScriptParsing; //! @struct script_cmds //! Vector table of script command string and executing function member. //! @typedef SCRIPT_COMMANDS //! @see script_cmds typedef struct script_cmds { char command[MAX_COMMAND_LENGTH]; //!< Command matching string. int flags; //!< General purpose flags size_t command_length; //!< Number of chacters in the command string. int argc; //!< Number of required prarmeters for the command char *args[MAX_CMD_PARAMETERS+1]; //!< String vector table of parameters enum paramter_types param_check[MAX_CMD_PARAMETERS+1]; //!< Flags to determine type of parameter. const char **valid_values; //!< A list of valid paramters. int valid_value_count; //!< The number of valid paramters. SCRIPT_CODES (ScriptParsing::*func)(struct script_cmds *); //!< The function (member) to execute on positive match int (*cb)(ScriptParsing *sp, struct script_cmds *sd); //!< Call back function for script command struct script_cmds * sub_commands; //!< List of sub commands size_t sub_command_count; //!< Number of table entires in the sub table. } SCRIPT_COMMANDS; //! @class script_parsing_class class ScriptParsing { public: private: pthread_mutex_t ac; //. // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include #ifdef __WOE32__ # ifdef __CYGWIN__ # include # else # include # endif #endif #include #include #include #include #include #include #ifndef __WOE32__ #include #endif #include "gettext.h" #include "fl_digi.h" #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include "waterfall.h" #include "raster.h" #include "progress.h" #include "Panel.h" #include "main.h" #include "threads.h" #include "trx.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "timeops.h" #include "rigio.h" #include "nullmodem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "mt63.h" #include "view_rtty.h" #include "olivia.h" #include "contestia.h" #include "thor.h" #include "dominoex.h" #include "feld.h" #include "throb.h" //#include "pkt.h" #include "wwv.h" #include "analysis.h" #include "ssb.h" #include "smeter.h" #include "pwrmeter.h" #include "ascii.h" #include "globals.h" #include "misc.h" #include "FTextRXTX.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "macros.h" #include "macroedit.h" #include "logger.h" #include "lookupcall.h" #include "font_browser.h" #include "icons.h" #include "pixmaps.h" #include "rigsupport.h" #include "qrunner.h" #include "Viewer.h" #include "soundconf.h" #include "htmlstrings.h" # include "xmlrpc.h" #if BENCHMARK_MODE # include "benchmark.h" #endif #include "debug.h" #include "re.h" #include "network.h" #include "spot.h" #include "dxcc.h" #include "locator.h" #include "notify.h" #include "logbook.h" #include "rx_extract.h" #include "speak.h" #include "flmisc.h" #include "arq_io.h" #include "data_io.h" #include "kmlserver.h" #include "notifydialog.h" #include "macroedit.h" #include "rx_extract.h" #include "wefax-pic.h" #include "charsetdistiller.h" #include "charsetlist.h" #include "outputencoder.h" #include "record_loader.h" #include "record_browse.h" #include "fileselect.h" #include "waterfall.h" #include "util.h" #include "script_parsing.h" #include "run_script.h" void cb_create_default_script(void); static int create_default_script(char *file_name); static int add_command(FILE *fd, char *cmd, int param, int indent_level); static int add_command(FILE *fd, char *cmd, char * param, int indent_level); static int add_command(FILE *fd, char *cmd, int indent_level); static int add_command(FILE *fd, char *cmd, bool param, int indent_level); static int add_command(FILE *fd, char *cmd, double param, int indent_level); static int add_string(FILE *fd, char *cmd, int indent_level); static void write_macro_list(FILE *fd); extern pthread_mutex_t mutex_script_io; /** ******************************************************** * \brief Menu callback. Create default script based on the * current settings. * \param none * \return void ***********************************************************/ void cb_create_default_script(void) { pthread_mutex_lock(&mutex_script_io); static bool first_time = true; static char script_filename[FL_PATH_MAX + 1]; std::string new_path = ""; if(first_time) { memset(script_filename, 0, sizeof(script_filename)); strncpy(script_filename, ScriptsDir.c_str(), FL_PATH_MAX); int len = strnlen(script_filename, FL_PATH_MAX); if(len > 0) { len--; if(script_filename[len] == PATH_CHAR_SEPERATOR); else strncat(script_filename, PATH_SEPERATOR, FL_PATH_MAX); } else { return; } strncat(script_filename, "default_script.txt", FL_PATH_MAX); first_time = false; } const char *p = FSEL::saveas((char *)_("Script Files"), (char *)_("*.txt"), \ script_filename); if(p) { memset(script_filename, 0, sizeof(script_filename)); strncpy(script_filename, p, FL_PATH_MAX); Fl::lock(); create_default_script(script_filename); Fl::unlock(); } pthread_mutex_unlock(&mutex_script_io); } /** ******************************************************** * \brief Create default script based on current settings. * \param file_name Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int create_default_script(char *file_name) { FILE *fd = (FILE *)0; static char buffer[FL_PATH_MAX]; std::string temp = ""; if(!file_name) { LOG_INFO(_("Invalid File Name Pointer (NULL) in function %s:%d"), __FILE__, __LINE__); return -1; } fd = fl_fopen(file_name, "w"); if(!fd) { LOG_INFO(_("Unable to create file %s (Error No=%d) func %s:%d"), file_name, errno, __FILE__, __LINE__); return -1; } memset(buffer, 0, sizeof(buffer)); // Tag the text file as a FLDIGI script file fprintf(fd, _("%s\n# Fldigi Generated Config Script\n"), SCRIPT_FILE_TAG); time_t thetime = time(0); fprintf(fd, _("# Created: %s\n"), ctime(&thetime)); // FLDIGI Main Window if(add_command(fd, (char *)CMD_FLDIGI, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_FREQ, (double) qsoFreqDisp->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_MODE, (char *) qso_opMODE->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_WFHZ, (int) wf->Carrier(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_RXID, (bool) btnRSID->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_TXID, (bool) btnTxRSID->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_SPOT, (bool) btnAutoSpot->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_REV, (bool) wf->btnRev->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_AFC, (bool) btnAFC->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_LOCK, (bool) wf->xmtlock->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_SQL, (bool) btnSQL->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_KPSQL, (bool) btnPSQL->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_FLDIGI_MODEM, (char *) active_modem->get_mode_name(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // OPERATOR if(add_command(fd, (char *)CMD_OPERATOR, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_CALLSIGN, (char *) inpMyCallsign->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_QTH, (char *) inpMyName->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NAME, (char *) inpMyQth->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_LOCATOR, (char *) inpMyLocator->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ANTENNA, (char *) inpMyAntenna->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // AUDIO DEVICE if(add_command(fd, (char *)CMD_AUDIO_DEVICE, 0)) return fclose(fd); #if USE_OSS // OSS if(add_command(fd, (char *)CMD_OSS_AUDIO, (bool) btnAudioIO[0]->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_OSS_AUDIO_DEV_PATH, (char *) menuOSSDev->value(), 1)) return fclose(fd); #endif // USE_OSS #if USE_PORTAUDIO // PORT AUDIO if(add_command(fd, (char *)CMD_PORT_AUDIO, (bool) btnAudioIO[1]->value(), 1)) return fclose(fd); if(menuPortInDev->value() > -1) { memset(buffer, 0, sizeof(buffer)); // Invalid warning issued (clang-600.0.56 [3.5] MacOSX) if index is replaced with reinterpret_cast(x) in snprintf() routine. int index = reinterpret_cast(menuPortInDev->mvalue()->user_data()); snprintf(buffer, sizeof(buffer)-1, "%s:%d,\"%s\"", CMD_PORTA_CAP, index, menuPortInDev->text()); if(add_string(fd, (char *)buffer, 1)) return fclose(fd); } if(menuPortOutDev->value() > -1) { memset(buffer, 0, sizeof(buffer)); // Invalid warning issued (clang-600.0.56 [3.5] MacOSX) if index is replaced with reinterpret_cast(x) in snprintf() routine. int index = reinterpret_cast(menuPortOutDev->mvalue()->user_data()); snprintf(buffer, sizeof(buffer)-1, "%s:%d,\"%s\"", CMD_PORTA_PLAY, index, menuPortOutDev->text()); if(add_string(fd, (char *)buffer, 1)) return fclose(fd); } #endif // USE_PORTAUDIO #if USE_PULSEAUDIO // PULSE AUDIO if(add_command(fd, (char *)CMD_PULSEA, (bool) btnAudioIO[2]->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_PULSEA_SERVER, (char *) inpPulseServer->value(), 1)) return fclose(fd); #endif // USE_PULSEAUDIO if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // AUDIO SETTINGS if(add_command(fd, (char *)CMD_AUDIO_SETTINGS, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_CAPTURE_SAMPLE_RATE, (char *) menuInSampleRate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_PLAYBACK_SAMPLE_RATE, (char *) menuOutSampleRate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_AUDIO_CONVERTER, (char *) menuSampleConverter->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RX_PPM, (int) cntRxRateCorr->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_TX_PPM, (int) cntTxRateCorr->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_TX_OFFSET, (int) cntTxOffset->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // AUDIO RIGHT CHANNEL if(add_command(fd, (char *)CMD_AUDIO_RT_CHANNEL, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_AUDIO_L_R, (bool) chkAudioStereoOut->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_AUDIO_REV_L_R, (bool) chkReverseAudio->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_PTT_RIGHT_CHAN, (bool) btnPTTrightchannel2->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_CW_QSK_RT_CHAN, (bool) btnQSK2->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_PSEUDO_FSK_RT_CHAN, (bool) chkPseudoFSK2->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // AUDIO WAVE if(add_command(fd, (char *)CMD_AUDIO_WAVE, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_WAVE_SR, (char *) listbox_wav_samplerate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // RIG HRDWR PTT if(add_command(fd, (char *) "# " CMD_HRDWR_PTT, 0)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPPT_PTT_RT, (bool) btnPTTrightchannel->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPTT_SP2, (bool) btnTTYptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPTT_SP2_PATH, (char *) inpTTYdev->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPTT_SP2_RTS, (bool) btnRTSptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPTT_SP2_RTS_V, (bool) btnRTSplusV->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPTT_SP2_DTR, (bool) btnDTRptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPTT_SP2_DTR_V, (bool) btnDTRplusV->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPTT_PARALLEL, (bool) btnUsePPortPTT->value(), 1)) return fclose(fd); #if HAVE_UHROUTER if(add_command(fd, (char *) "# " CMD_HPTT_UHROUTER, (bool) btnUseUHrouterPTT->value(), 1)) return fclose(fd); #endif if(add_command(fd, (char *) "# " CMD_HPTT_SP2_START_DELAY, (int) cntPTT_on_delay->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPTT_SP2_END_DELAY, (int) cntPTT_off_delay->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_HPTT_SP2_INITIALIZE, 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_END_CMD, 0)) return fclose(fd); // Cmedia PTT if(add_command(fd, (char *) "# " CMD_CMEDIA_PTT, 0)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_USE_CMEDIA_PTT, (bool) btn_use_cmedia_PTT->value(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_CMEDIA_DEV, (char *) progdefaults.cmedia_device.c_str(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_CMEDIA_GPIO_LINE, (char *) progdefaults.cmedia_gpio_line.c_str(), 1)) return fclose(fd); if(add_command(fd, (char *) "# " CMD_END_CMD, 0)) return fclose(fd); // RIG CAT if(add_command(fd, (char *)CMD_RIGCAT, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_STATE, (bool) chkUSERIGCAT->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_DEV_PATH, (char *) inpXmlRigDevice->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_DESC_FILE, (char *) progdefaults.XmlRigFilename.c_str(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_RETRIES, (int) cntRigCatRetries->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_RETRY_INTERVAL, (int) cntRigCatTimeout->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_WRITE_DELAY, (int) cntRigCatWait->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_INTIAL_DELAY, (int) cntRigCatInitDelay->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_BAUD_RATE, (char *) listbox_xml_rig_baudrate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_STOP_BITS, (int) valRigCatStopbits->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_ECHO, (bool) btnRigCatEcho->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_TOGGLE_RTS_PTT, (bool) btnRigCatRTSptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_RESTORE, (bool) chk_restore_tio->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_PTT_COMMAND, (bool) btnRigCatCMDptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_TOGGLE_DTR_PTT, (bool) btnRigCatDTRptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_TOGGLE_RTS_PTT, (bool) btnRigCatRTSptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_RTS_12V, (bool) btnRigCatRTSplus->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_DTR_12V, (bool) btnRigCatDTRplus->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_HRDWR_FLOW, (bool) chkRigCatRTSCTSflow->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_VSP, (bool) chkRigCatVSP->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_RIGCAT_INITIALIZE, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); #if USE_HAMLIB // HAMLIB if(add_command(fd, (char *)CMD_HAMLIB, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_STATE, (bool) chkUSEHAMLIB->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_RIG, (char *) cboHamlibRig->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_DEV_PATH, (char *) inpRIGdev->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_RETRIES, (int) cntHamlibRetries->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_RETRY_INTERVAL, (int) cntHamlibTimeout->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_WRITE_DELAY, (int) cntHamlibWriteDelay->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_POST_WRITE_DELAY, (int) cntHamlibWait->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_BAUD_RATE, (char *) listbox_baudrate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_STOP_BITS, (int) valHamRigStopbits->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_POLL_RATE, (int) valHamRigPollrate->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_SIDE_BAND, (char *) listbox_sideband->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_PTT_COMMAND, (bool) btnHamlibCMDptt->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_DTR_12V, (bool) btnHamlibDTRplus->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_RTS_12V, (bool) btnHamlibDTRplus->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_HRDWR_FLOW, (bool) chkHamlibRTSCTSflow->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_SFTWR_FLOW, (bool) chkHamlibXONXOFFflow->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_ADV_CONFIG, (char *) inpHamlibConfig->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_HAMLIB_INITIALIZE, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); #endif //#if USE_HAMLIB // IO Config Panel if(add_command(fd, (char *)CMD_IO, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_LOCK, (bool) btnDisable_p2p_io_widgets->value(), 1)) return fclose(fd); if(btnEnable_arq->value()) { if(add_command(fd, (char *)CMD_IO_ACT_PORT, (char *) PARM_ARQ, 1)) return fclose(fd); } else if(btnEnable_kiss->value()) { if(add_command(fd, (char *)CMD_IO_ACT_PORT, (char *) PARM_KISS, 1)) return fclose(fd); } if(add_command(fd, (char *)CMD_IO_AX25_DECODE, (bool) btnEnable_ax25_decode->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_CSMA, (bool) btnEnable_csma->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_IPA, (char *) txtKiss_ip_address->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_IOPN, (char *) txtKiss_ip_io_port_no->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_OPN, (char *) txtKiss_ip_out_port_no->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_DP, (bool) btnEnable_dual_port->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_BUSY, (bool) btnEnableBusyChannel->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_CONT, (int) cntBusyChannelSeconds->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_KISS_ATTEN, (int) cntKPSQLAttenuation->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_ARQ, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_ARQ_IPA, (char *) txtArq_ip_address->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_ARQ_IOPN, (char *) txtArq_ip_port_no->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_XMLRPC, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_XMLRPC_IPA, (char *) txtXmlrpc_ip_address->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_IO_XMLRPC_IOPN, (char *) txtXmlrpc_ip_port_no->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // NBEMS if(add_command(fd, (char *)CMD_NBEMS, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_STATE, (bool) chkAutoExtract->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_MSG, (bool) chk_open_wrap_folder->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_FLMSG, (bool) chk_open_flmsg->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_FLMSG_PATH, (char *) txt_flmsg_pathname->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_BRWSR, (bool) chk_open_flmsg_print->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_NBEMS_TIMEOUT, (double) sldr_extract_timeout->value(), 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // ID/RSID/VIDEO/CW if(add_command(fd, (char *)CMD_ID, 0)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_NOTIFY, (bool) chkRSidNotifyOnly->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_SRCH_BP, (bool) chkRSidWideSearch->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_MARK_PREV, (bool) chkRSidMark->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_DETECTOR, (bool) chkRSidAutoDisable->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_ALRT_DIALOG, (bool) chkRSidShowAlert->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_TX_FREQ_LOCK, (bool) chkRetainFreqLock->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_FREQ_CHANGE, (bool) chkDisableFreqChange->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_ALLOW_ERRORS, (char *) listbox_rsid_errors->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_SQL_OPEN, (int) val_RSIDsquelch->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_PRETONE, (double) val_pretone->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_END_XMT_ID, (bool) btn_post_rsid->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_RSID_MIN_BW, (int) val_rsid_min_bw->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_TX_ID_MODE, (bool) btnsendid->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_TX_VIDEO_TXT, (bool) btnsendvideotext->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_TX_TXT_INP, (char *) valVideotext->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_SMALL_FONT, (bool) chkID_SMALL->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_500_HZ, (bool) btn_vidlimit->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_WIDTH_LIMIT, (bool) btn_vidmodelimit->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_VIDEO_CHAR_ROW, (int) sldrVideowidth->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_CW, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_CW_TX_CALLSIGN, (bool) btnCWID->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_ID_CW_SPEED, (int) sldrCWIDwpm->value(), 2)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 1)) return fclose(fd); if(add_command(fd, (char *)CMD_END_CMD, 0)) return fclose(fd); // MACROS write_macro_list(fd); return fclose(fd); } /** ******************************************************** * \brief Write the current macro list in script format * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static void write_macro_list(FILE *fd) { if(!fd) return; int index = 0; int row = 0; int col = 0; bool save_flag = false; int count = 0; char * cPtr = (char *)0; for(index = 0; index < MAXMACROS; index++) { // Do not save empty macros count = macros.text[index].size(); if(count < 1) continue; cPtr = (char *) macros.text[index].c_str(); while(count-- > 0) { if(*cPtr++ > ' ') { save_flag = true; break; } } if(save_flag) { col = (index / NUMMACKEYS) + 1; row = (index % NUMMACKEYS) + 1; fprintf(fd, "\n%s:%d,%d,\"%s\"\n", (char *) CMD_LOAD_MACRO, col, row, macros.name[index].c_str()); fprintf(fd, "%s\n", macros.text[index].c_str()); fprintf(fd, "%s:\n",(char *) CMD_END_CMD); save_flag = false; } } } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, double param, int indent_level) { if(!fd || !cmd) return -1; char buffer[32]; memset(buffer, 0, sizeof(buffer)); if((param > -1000.0) && (param < 1000.0)) snprintf(buffer, sizeof(buffer) - 1, "%1.3f", param); else snprintf(buffer, sizeof(buffer) - 1, "%1.9e", param); return add_command(fd, cmd, buffer, indent_level); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, bool param, int indent_level) { if(!fd || !cmd) return -1; char buffer[32]; memset(buffer, 0, sizeof(buffer)); if(param) strncpy(buffer, PARM_ENABLE, sizeof(buffer)-1); else strncpy(buffer, PARM_DISABLE, sizeof(buffer)-1); return add_command(fd, cmd, buffer, indent_level); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, int param, int indent_level) { if(!fd || !cmd) return -1; char buffer[32]; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer) - 1, "%d", param); return add_command(fd, cmd, buffer, indent_level); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, char *param, int indent_level) { if(!fd || !cmd || !param) return -1; bool q_flag = false; int size = strnlen(param, FILENAME_MAX); if(size < 1) return 0; for(int i = 0; i < size; i++) { if(param[i] == 0) break; if((param[i] == ',') || (param[i] <= ' ')) { q_flag = true; } } std::string indent = ""; for(int i = 0; i < indent_level; i++) indent.append(" "); if(q_flag) fprintf(fd, "%s%s:\"%s\"\n", indent.c_str(), cmd, param); else fprintf(fd, "%s%s:%s\n", indent.c_str(), cmd, param); return ferror(fd); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_command(FILE *fd, char *cmd, int indent_level) { if(!fd || !cmd) return -1; std::string indent = ""; for(int i = 0; i < indent_level; i++) indent.append(" "); fprintf(fd, "%s%s:\n", indent.c_str(), cmd); return ferror(fd); } /** ******************************************************** * \brief Add command and paramter to script file * \param fd File descriptor * \param cmd Pointer to the file name and path. * \return 0 OK, other Error ***********************************************************/ static int add_string(FILE *fd, char *cmd, int indent_level) { if(!fd || !cmd) return -1; std::string indent = ""; for(int i = 0; i < indent_level; i++) indent.append(" "); fprintf(fd, "%s%s\n", indent.c_str(), cmd); return ferror(fd); } fldigi-4.2.05/src/config_script/run_scripts.cxx0000664000175000017500000024733214611712162016516 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2015 // Robert Stiles // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include #ifdef __WOE32__ # ifdef __CYGWIN__ # include # else # include # endif #endif #include #include #include #include #include #include #ifndef __WOE32__ #include #endif #include "gettext.h" #include "fl_digi.h" #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include "waterfall.h" #include "raster.h" #include "progress.h" #include "Panel.h" #include "main.h" #include "threads.h" #include "trx.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "timeops.h" #include "rigio.h" #include "nullmodem.h" #include "psk.h" #include "cw.h" #include "mfsk.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "mt63.h" #include "view_rtty.h" #include "olivia.h" #include "contestia.h" #include "thor.h" #include "dominoex.h" #include "feld.h" #include "throb.h" //#include "pkt.h" #include "wwv.h" #include "analysis.h" #include "ssb.h" #include "smeter.h" #include "pwrmeter.h" #include "ascii.h" #include "globals.h" #include "misc.h" #include "FTextRXTX.h" #include "confdialog.h" #include "configuration.h" #include "status.h" #include "macros.h" #include "macroedit.h" #include "logger.h" #include "lookupcall.h" #include "font_browser.h" #include "icons.h" #include "pixmaps.h" #include "rigsupport.h" #include "qrunner.h" #include "Viewer.h" #include "soundconf.h" #include "htmlstrings.h" # include "xmlrpc.h" #if BENCHMARK_MODE # include "benchmark.h" #endif #include "debug.h" #include "re.h" #include "network.h" #include "spot.h" #include "dxcc.h" #include "locator.h" #include "notify.h" #include "logbook.h" #include "rx_extract.h" #include "speak.h" #include "flmisc.h" #include "arq_io.h" #include "data_io.h" #include "kmlserver.h" #include "notifydialog.h" #include "macroedit.h" #include "rx_extract.h" #include "wefax-pic.h" #include "charsetdistiller.h" #include "charsetlist.h" #include "outputencoder.h" #include "record_loader.h" #include "record_browse.h" #include "fileselect.h" #include "script_parsing.h" #include "run_script.h" pthread_mutex_t mutex_script_io = PTHREAD_MUTEX_INITIALIZER; extern std::string ScriptsDir; void script_execute(void *); static void script_execute(const char *filename, bool queue_flag); /** ******************************************************** * \brief Template for assigning bool values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_bool(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, bool &data) { if(!sp || !sc) return script_function_parameter_error; bool value = 0; int error = sp->check_bool(sc->args[0], value); if(error != script_no_errors) return error; if(!widget) return script_no_errors; widget->value(value); widget->do_callback(); data = value; return script_no_errors; } /** ******************************************************** * \brief Template for assigning bool values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_bool(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool data = false; return assign_bool(widget, sp, sc, data); } /** ******************************************************** * \brief Template for assigning integer values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_integer(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, int &data) { if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; int value = 0; int cnt = sscanf(str_data.c_str(), "%d", &value); if(cnt < 1) return script_invalid_parameter; if(!widget) return script_no_errors; int min = (int) widget->minimum(); int max = (int) widget->maximum(); int step = (int) widget->step(); if((value < min) || (value > max)) return script_invalid_parameter; if(step > 1 && value > 0) value = (value / step) * step; widget->value(value); widget->do_callback(); data = value; return script_no_errors; } /** ******************************************************** * \brief Template for assigning integer values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_integer(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int data = 0; return assign_integer(widget, sp, sc, data); } /** ******************************************************** * \brief Template for assigning double values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_double(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, double &data) { if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; double value = 0; int cnt = sscanf(str_data.c_str(), "%lf", &value); if(cnt < 1) return script_invalid_parameter; if(!widget) return script_no_errors; double min = (double) widget->minimum(); double max = (double) widget->maximum(); if((value < min) || (value > max)) return script_invalid_parameter; widget->value(value); widget->do_callback(); data = value; return script_no_errors; } /** ******************************************************** * \brief Template for assigning double values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_double(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { double data = 0.0; return assign_double(widget, sp, sc, data); } /** ******************************************************** * \brief Template for assigning string values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_string(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, std::string &data) { if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!widget) return script_no_errors; widget->value(str_data.c_str()); widget->do_callback(); data.assign(str_data); return script_no_errors; } /** ******************************************************** * \brief Template for assigning string values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_string(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { std::string data = ""; return assign_string(widget, sp, sc, data); } /** ******************************************************** * \brief Template for assigning index values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_index(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc, int &data) { if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!widget) return script_no_errors; int index = widget->find_index(str_data.c_str()); if(index < 0) return script_invalid_parameter; widget->index(index); widget->do_callback(); data = index; return script_no_errors; } /** ******************************************************** * \brief Template for assigning index values to various widget types. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ template static int assign_index(widget_type * widget, ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int data = 0; return assign_index(widget, sp, sc, data); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_notify(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidNotifyOnly, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_search_bp(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidWideSearch, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_mark_prev(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidMark, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_detector(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidAutoDisable, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_alert_dialog(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRSidShowAlert, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_tx_freq_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkRetainFreqLock, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_freq_change(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkDisableFreqChange, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_allow_errors(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_index(listbox_rsid_errors, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_sql_open(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(val_RSIDsquelch, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_pretone(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_double(val_pretone, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_char_per_row(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(sldrVideowidth, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_end_xmt_id(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btn_post_rsid, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_tx_id_mode(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnsendid, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_tx_vid_txt(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnsendvideotext, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_txt_input(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(valVideotext, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_small_font(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkID_SMALL, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_500hz(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btn_vidlimit, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_video_width_limit(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btn_vidmodelimit, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_cw_callsign(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnCWID, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_cw_speed(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(sldrCWIDwpm, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_state(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkAutoExtract, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_open_flmsg(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chk_open_flmsg, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_open_msg(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chk_open_wrap_folder, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_open_brwsr(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chk_open_flmsg_print, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_flmsg_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(txt_flmsg_pathname, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_misc_nbems_timeout(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(sldr_extract_timeout, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rig_freq(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!qsoFreqDisp) return script_no_errors; double value = 0; double max = (double) qsoFreqDisp->maximum(); int cnt = sscanf(str_data.c_str(), "%lf", &value); if(cnt < 1 || value < 0.0 || value > max) return script_invalid_parameter; qsy((long int) value, active_modem ? active_modem->get_freq() : 1500); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rig_mode(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_index(qso_opMODE, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_wf_hz_offset(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!cntrWfwidth) return script_no_errors; int value = 0; int cnt = sscanf(str_data.c_str(), "%d", &value); int min = 0; int max = cntrWfwidth->maximum(); if(cnt < 1 || value < min || value > max) return script_invalid_parameter; active_modem->set_freq(value); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rsid_min_bw(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(val_rsid_min_bw, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rx_rsid(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnRSID, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_tx_rsid(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnTxRSID, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_spot(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnAutoSpot, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rev(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { if(!wf) return script_no_errors; return assign_bool(wf->btnRev, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_afc(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnAFC, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { if(!wf) return script_no_errors; return assign_bool(wf->xmtlock, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_sql(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnSQL, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_kpsql(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnPSQL, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) **********************************************************/ int process_modem(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; bool modem_found = false; int index = 0; std::string value; value.assign(sc->args[0]); if(value.empty()) return script_parameter_error; sp->to_uppercase(value); for(index = 0; index < NUM_MODES; index++) { if(strncmp(value.c_str(), mode_info[index].sname, 32) == 0) { modem_found = true; break; } } if(modem_found == false) return script_invalid_parameter; if((data_io_enabled == KISS_IO) && (!(mode_info[index].iface_io & KISS_IO))) { LOG_INFO(_("Invalid Modem for KISS IO")); return script_invalid_parameter; } REQ_SYNC(init_modem_sync, index, 0); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtKiss_ip_address) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtKiss_ip_address->value(), 32) != 0) { txtKiss_ip_address->value(str_data.c_str()); txtKiss_ip_address->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtKiss_ip_io_port_no) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtKiss_ip_io_port_no->value(), 32) != 0) { txtKiss_ip_io_port_no->value(str_data.c_str()); txtKiss_ip_io_port_no->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_o_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtKiss_ip_out_port_no) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtKiss_ip_out_port_no->value(), 32) != 0) { txtKiss_ip_out_port_no->value(str_data.c_str()); txtKiss_ip_out_port_no->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_dual_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnEnable_dual_port, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_busy_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnEnableBusyChannel, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_continue_after(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntBusyChannelSeconds, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_kiss_kpsql_atten(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntKPSQLAttenuation, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_arq_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtArq_ip_address) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtArq_ip_address->value(), 32) != 0) { txtArq_ip_address->value(str_data.c_str()); txtArq_ip_address->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_arq_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtArq_ip_address) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtArq_ip_port_no->value(), 32) != 0) { txtArq_ip_port_no->value(str_data.c_str()); txtArq_ip_port_no->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_xmlrpc_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtXmlrpc_ip_address) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtXmlrpc_ip_address->value(), 32) != 0) { txtXmlrpc_ip_address->value(str_data.c_str()); txtXmlrpc_ip_address->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_xmlrpc_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!txtXmlrpc_ip_port_no) return script_no_errors; if(strncmp((const char *)str_data.c_str(), (const char *)txtXmlrpc_ip_port_no->value(), 32) != 0) { txtXmlrpc_ip_port_no->value(str_data.c_str()); txtXmlrpc_ip_port_no->do_callback(); sp->restart_flag(true); } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnDisable_p2p_io_widgets, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_active_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string value; value.assign(sc->args[0]); if(value.empty()) return script_parameter_error; sp->to_uppercase(value); if(!btnEnable_kiss || !btnEnable_arq) return script_no_errors; if(value.find(PARM_KISS) != std::string::npos) { enable_kiss(); } else if(value.find(PARM_ARQ) != std::string::npos) { enable_arq(); } else { return script_invalid_parameter; } return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_ax25_decode(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnEnable_ax25_decode, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_io_csma(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnEnable_csma, sp, sc); } /** ******************************************************** * \brief Assign Call Sign. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) * \par Note: * This string storage can be assigned to anything. User * should follow the limitations imposed by the rules * of the host country. ***********************************************************/ int process_callsign_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyCallsign, sp, sc); } /** ******************************************************** * \brief Operator Name * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_name_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyName, sp, sc); } /** ******************************************************** * \brief QTH Location of Operator * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_qth_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyQth, sp, sc); } /** ******************************************************** * \brief Assign Locator * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_locator_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyLocator, sp, sc); } /** ******************************************************** * \brief Assign Antenna information * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_antenna_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_string(inpMyAntenna, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_oss_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_OSS return assign_bool(btnAudioIO[0], sp, sc); #else return script_no_errors; #endif // USE_OSS } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_oss_audio_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx #if USE_OSS if(!sp || !sc) return script_function_parameter_error; std::string str_data; std::string valid_data; str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!menuOSSDev) return script_no_errors; if(sp->check_dev_path(str_data.c_str())) return script_device_path_not_found; int index = 0; bool found = false; int count = menuOSSDev->menubutton()->size(); for (index = 0; index < count; index++ ) { const Fl_Menu_Item &item = menuOSSDev->menubutton()->menu()[index]; valid_data.assign(item.label()); if(!valid_data.empty()) { if(strncmp(valid_data.c_str(), str_data.c_str(), FL_PATH_MAX) == 0) { found = true; break; } } } if(!found) return script_invalid_parameter; menuOSSDev->value(index); menuOSSDev->do_callback(); return script_no_errors; #else return script_no_errors; #endif // USE_OSS } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_port_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_PORTAUDIO return assign_bool(btnAudioIO[1], sp, sc); #else return script_no_errors; #endif // USE_PORTAUDIO } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_capture_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx #if USE_PORTAUDIO if(!sp || !sc) return script_function_parameter_error; int value = 0; std::string str_data = ""; if(sc->argc < 2) return script_invalid_parameter; int cnt = sscanf(sc->args[0], "%d", &value); if(cnt < 1 || value < 0) return script_invalid_parameter; str_data.assign(sc->args[1]); if(str_data.empty()) return script_invalid_parameter; if(!menuPortInDev) return script_no_errors; cnt = pa_set_dev(menuPortInDev, str_data, value); if(cnt == PA_DEV_NOT_FOUND) return script_invalid_parameter; #endif // USE_PORTAUDIO return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_playback_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx #if USE_PORTAUDIO if(!sp || !sc) return script_function_parameter_error; int value = 0; std::string str_data = ""; if(sc->argc < 2) return script_invalid_parameter; int cnt = sscanf(sc->args[0], "%d", &value); if(cnt < 1 || value < 0) return script_invalid_parameter; str_data.assign(sc->args[1]); if(str_data.empty()) return script_invalid_parameter; if(!menuPortOutDev) return script_no_errors; cnt = pa_set_dev(menuPortOutDev, str_data, value); if(cnt == PA_DEV_NOT_FOUND) return script_invalid_parameter; #endif return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_pulse_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_PULSEAUDIO return assign_bool(btnAudioIO[2], sp, sc); #else return script_no_errors; #endif // USE_PULSEAUDIO } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_pulse_audio_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_PULSEAUDIO return assign_string(inpPulseServer, sp, sc); #else return script_no_errors; #endif // USE_PULSEAUDIO } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_audio_device_sample_rate_capture(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!menuInSampleRate) return script_no_errors; int index = menuInSampleRate->find_index(str_data.c_str()); if(index < 0) { str_data.append(" (native)"); index = menuInSampleRate->find_index(str_data.c_str()); } if(index < 0) return script_invalid_parameter; menuInSampleRate->index(index); menuInSampleRate->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_audio_device_sample_rate_playback(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!menuOutSampleRate) return script_no_errors; int index = menuOutSampleRate->find_index(str_data.c_str()); if(index < 0) { str_data.append(" (native)"); index = menuOutSampleRate->find_index(str_data.c_str()); } if(index < 0) return script_invalid_parameter; menuOutSampleRate->index(index); menuOutSampleRate->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_audio_device_converter(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data; std::string append_string; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; append_string.assign(" Sinc Interpolator"); if(str_data.find(append_string) != std::string::npos) append_string.clear(); if(append_string.empty()) { append_string.assign(" Interpolator"); if(str_data.find(append_string) != std::string::npos) { append_string.clear(); } } str_data.append(append_string); if(!menuSampleConverter) return script_no_errors; int index = menuSampleConverter->find_index(str_data.c_str()); if(index < 0) return script_invalid_parameter; menuSampleConverter->index(index); menuSampleConverter->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rx_ppm(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntRxRateCorr, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_tx_ppm(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntTxRateCorr, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_tx_offset(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntTxOffset, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_modem_signal_left_right(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkAudioStereoOut, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_reverse_left_right(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkReverseAudio, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_ptt_tone_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnPTTrightchannel2, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_cw_qsk_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnQSK2, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_pseudo_fsk_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkPseudoFSK2, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_wave_file_sample_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; char buffer[32]; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; int value = 0; int cnt = sscanf(str_data.c_str(), "%d", &value); if(cnt < 1) return script_invalid_parameter; if((value < 8000) || (value > 48000)) return script_invalid_parameter; memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer) - 1, "%d", value); if(!listbox_wav_samplerate) return script_no_errors; int index = listbox_wav_samplerate->find_index(buffer); if(index < 0) return script_invalid_parameter; listbox_wav_samplerate->index(index); listbox_wav_samplerate->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_right_audio_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnPTTrightchannel, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnTTYptt, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) * \par NOTE: * Fl_ComboBox (custom widget) * find_index() located in combo.cxx and used here returns -1 * on non-matching. ***********************************************************/ int process_hrdw_ptt_sep_serial_port_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_index(inpTTYdev, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port_rts(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnRTSptt, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port_dtr(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnDTRptt, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port_rts_v(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnRTSplusV, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_sep_serial_port_dtr_v(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnDTRplusV, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_start_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntPTT_on_delay, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_end_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_integer(cntPTT_off_delay, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_uhrouter(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if HAVE_UHROUTER return assign_bool(btnUseUHrouterPTT, sp, sc); #else return script_no_errors; #endif // HAVE_UHROUTER } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_parallel(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnUsePPortPTT, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hrdw_ptt_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { if(!btnInitHWPTT) return script_no_errors; btnInitHWPTT->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_cmedia_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { if (!btn_use_cmedia_PTT) return script_no_errors; btn_use_cmedia_PTT->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_cmedia_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; progdefaults.cmedia_device.assign(str_data); inp_cmedia_dev->value(progdefaults.cmedia_device.c_str()); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_cmedia_gpio_line(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; progdefaults.cmedia_gpio_line.assign(str_data); inp_cmedia_GPIO_line->value(progdefaults.cmedia_gpio_line.c_str()); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_rigcat(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(chkUSERIGCAT, sp, sc); } extern void loadRigXmlFile(void); /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_desc_file(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(str_data.find(DEFAULT_RIGXML_FILENAME) != std::string::npos) return script_no_errors; if(sp->check_filename((char *) str_data.c_str())) return script_file_not_found; if(!txtXmlRigFilename) return script_no_errors; progdefaults.XmlRigFilename.assign(str_data); txtXmlRigFilename->value(fl_filename_name(progdefaults.XmlRigFilename.c_str())); loadRigXmlFile(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_index(inpXmlRigDevice, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_retries(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(cntRigCatRetries, sp, sc, value); if(!error && cntRigCatRetries) { progdefaults.RigCatRetries = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_retry_interval(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(cntRigCatTimeout, sp, sc, value); if(!error && cntRigCatTimeout) { progdefaults.RigCatTimeout = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(cntRigCatWait, sp, sc, value); if(!error && cntRigCatWait) { progdefaults.RigCatTimeout = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_init_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(cntRigCatInitDelay, sp, sc, value); if(!error && cntRigCatInitDelay) { progdefaults.RigCatInitDelay = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_baud_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int index = 0; int error = assign_index(listbox_xml_rig_baudrate, sp, sc, index); if(!error && listbox_xml_rig_baudrate) { progdefaults.XmlRigBaudrate = index; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_cat_command_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return assign_bool(btnRigCatCMDptt, sp, sc); } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_stop_bits(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { int value = 0; int error = assign_integer(valRigCatStopbits, sp, sc, value); if(!error && valRigCatStopbits) { progdefaults.RigCatStopbits = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_commands_echoed(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(btnRigCatEcho, sp, sc, value); if(!error && btnRigCatEcho) { progdefaults.RigCatECHO = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_toggle_rts_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(btnRigCatRTSptt, sp, sc, value); if(!error && btnRigCatRTSptt) { progdefaults.RigCatRTSptt = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_restore_on_close(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(chk_restore_tio, sp, sc, value); if(!error && chk_restore_tio) { progdefaults.RigCatRestoreTIO = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_rts_12v(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(btnRigCatRTSplus, sp, sc, value); if(!error && btnRigCatRTSplus) { progdefaults.RigCatRTSplus = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_dtr_12v(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(btnRigCatDTRplus, sp, sc, value); if(!error && btnRigCatDTRplus) { progdefaults.RigCatDTRplus = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_hrdwr_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(chkRigCatRTSCTSflow, sp, sc, value); if(!error && chkRigCatRTSCTSflow) { progdefaults.RigCatRTSCTSflow = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_vsp_enable(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { bool value = 0; int error = assign_bool(chkRigCatVSP, sp, sc, value); if(!error && chkRigCatVSP) { progdefaults.RigCatVSP = value; progdefaults.changed = true; } return error; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_rigcat_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { if(!btnInitRIGCAT) return script_no_errors; btnInitRIGCAT->do_callback(); return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_use_hamlib(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB return assign_bool(chkUSEHAMLIB, sp, sc); #endif // USE_HAMLIB return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_rig(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB return assign_index(cboHamlibRig, sp, sc); #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_retries(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(cntHamlibRetries, sp, sc, value); if(!error && cntHamlibRetries) { progdefaults.HamlibRetries = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_retry_interval(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(cntHamlibTimeout, sp, sc, value); if(!error && cntHamlibTimeout) { progdefaults.HamlibTimeout = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(cntHamlibWriteDelay, sp, sc, value); if(!error && cntHamlibWriteDelay) { progdefaults.HamlibWriteDelay = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_post_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(cntHamlibWait, sp, sc, value); if(!error && cntHamlibWait) { progdefaults.HamlibWait = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) * \par Note: * This string storage can be assigned to anything. User * should follow the limitations imposed by the rules * of the host country. ***********************************************************/ int process_hamlib_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string str_data = ""; if(sc->argc > 0) str_data.assign(sc->args[0]); if(str_data.empty()) return script_invalid_parameter; if(!inpRIGdev) return script_no_errors; int index = inpRIGdev->find_index(str_data.c_str()); if(index < 0) return script_invalid_parameter; progdefaults.HamRigDevice.assign(str_data); progdefaults.changed = true; inpRIGdev->value(str_data.c_str()); inpRIGdev->do_callback(); #endif // USE_HAMLIB return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_baud_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int index = 0; int error = assign_index(listbox_baudrate, sp, sc, index); if(!error && listbox_baudrate) { progdefaults.HamRigBaudrate = index; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_stop_bits(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(valHamRigStopbits, sp, sc, value); if(!error && valHamRigStopbits) { progdefaults.HamRigStopbits = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_poll_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int value = 0; int error = assign_integer(valHamRigPollrate, sp, sc, value); if(!error && valHamRigPollrate) { progdefaults.HamRigPollrate = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_sideband(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB int index = 0; int error = assign_index(listbox_sideband, sp, sc, index); if(!error && listbox_sideband) { progdefaults.HamlibSideband = index; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_ptt_hl_command(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB bool value = 0; int error = assign_bool(btnHamlibCMDptt, sp, sc, value); if(!error && btnHamlibCMDptt) { progdefaults.HamlibCMDptt = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_dtr_12(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB bool value = 0; int error = assign_bool(btnHamlibDTRplus, sp, sc, value); if(!error && btnHamlibDTRplus) { progdefaults.HamlibDTRplus = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_rts_12(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; bool value = 0; int error = sp->check_bool(sc->args[0], value); if(error != script_no_errors) return error; if(!chkHamlibRTSCTSflow || !chkHamlibRTSplus) return script_no_errors; if(chkHamlibRTSCTSflow->value()) value = false; progdefaults.HamlibRTSplus = value; progdefaults.changed = true; chkHamlibRTSplus->value(value); chkHamlibRTSplus->do_callback(); #endif // USE_HAMLIB return script_no_errors; } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_rts_cts_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB bool value = 0; int error = assign_bool(chkHamlibRTSCTSflow, sp, sc, value); if(!error && chkHamlibRTSCTSflow) { progdefaults.HamlibRTSCTSflow = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_xon_xoff_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB bool value = 0; int error = assign_bool(chkHamlibXONXOFFflow, sp, sc, value); if(!error && chkHamlibXONXOFFflow) { progdefaults.HamlibXONXOFFflow = value; progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_advanced_config(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB std::string value = ""; int error = assign_string(inpHamlibConfig, sp, sc, value); if(!error && inpHamlibConfig) { progdefaults.HamConfig.assign(value); progdefaults.changed = true; } return error; #else return script_no_errors; #endif // USE_HAMLIB } /** ******************************************************** * \brief Initialize HAMLIB Parameters * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_hamlib_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { #if USE_HAMLIB if(!btnInitHAMLIB) return script_no_errors; btnInitHAMLIB->do_callback(); #endif // USE_HAMLIB return script_no_errors; } /** ******************************************************** * \brief Assign Macro information to there respective * macro button. * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_load_macro(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { // Not suitable for assign_xxxx if(!sp || !sc) return script_function_parameter_error; std::string macro_data = sp->macro_command(); std::string macro_label = ""; int col = 0; int row = 0; int index = 0; if(sc->argc < 3) return script_invalid_parameter; if((!sc->args[0]) || (!sc->args[1]) || (!sc->args[2])) return script_invalid_parameter; index = sscanf(sc->args[0], "%d", &col); if(index < 1) return script_invalid_parameter; index = sscanf(sc->args[1], "%d", &row); if(index < 1) return script_invalid_parameter; macro_label.assign(sc->args[2]); if(macro_label.empty()) return script_invalid_parameter; if(col > 0) col--; if(row > 0) row--; index = (col * NUMMACKEYS) + row; if((index < 0) || (index > MAXMACROS)) return script_invalid_parameter; if((col == 0) || ((col == altMacros) && (progdefaults.mbar_scheme > MACRO_SINGLE_BAR_MAX))) { update_macro_button(index, macro_data.c_str(), macro_label.c_str()); } else { macros.text[index].assign(macro_data); macros.name[index].assign(macro_label); } return script_no_errors; } /** ******************************************************** * \brief Reset Configuration panel attributes * \param sp Access to ScritpParsing members. * \param sc Access to SCRIPT_COMMANDS structure variables. * \return 0 (no error) Other (error) ***********************************************************/ int process_reset(ScriptParsing *sp, SCRIPT_COMMANDS *sc) { return script_no_errors; } /** ******************************************************** * \brief Pass script file name to script passing class * for execution. * Called from the File->Execute Config Script menu item. * \param void ***********************************************************/ static void script_execute(const char *filename, bool queue_flag) { ScriptParsing *sp = 0; static std::string script_filename = ""; if(!filename) { LOG_INFO(_("Script file name (path) null pointer")); return; } script_filename.assign(filename); if(script_filename.empty()) { LOG_INFO(_("Script file name (path) invalid")); return; } sp = new ScriptParsing; if(!sp) { LOG_INFO(_("Script Parsing Class Allocation Fail (%s)"), script_filename.c_str()); return; } LOG_INFO(_("Executing script file: %s"), script_filename.c_str()); sp->parse_commands((char *) script_filename.c_str()); if(sp->script_errors()) { LOG_INFO(_("Issues reported in processing script file: %s"), script_filename.c_str()); fl_alert("%s", _("Script file contains potential issues\nSee documentation and/or Log file for details.")); } if(sp->restart_flag()) { fl_alert("%s", _("Some changes made by the script requires program\nrestart before they become active.")); } if(sp) delete sp; } /** ******************************************************** * \brief Call back function when executing a configuration script. * Called from the File->Execute Config Script menu item. * \param void ***********************************************************/ void cb_scripts(bool reset_path = false) { pthread_mutex_lock(&mutex_script_io); static bool first_time = true; static char script_filename[FL_PATH_MAX + 1]; std::string new_path = ""; if(reset_path || first_time) { memset(script_filename, 0, sizeof(script_filename)); strncpy(script_filename, ScriptsDir.c_str(), FL_PATH_MAX); int len = strnlen(script_filename, FL_PATH_MAX); if(len > 0) { len--; if(script_filename[len] == PATH_CHAR_SEPERATOR); else strncat(script_filename, PATH_SEPERATOR, FL_PATH_MAX); } else { return; } first_time = false; } const char *p = FSEL::select((char *)_("Script Files"), (char *)_("*.txt"), \ script_filename); if(p) { memset(script_filename, 0, sizeof(script_filename)); strncpy(script_filename, p, FL_PATH_MAX); Fl::lock(); script_execute(script_filename, false); Fl::unlock(); } pthread_mutex_unlock(&mutex_script_io); } fldigi-4.2.05/src/config_script/run_script.h0000664000175000017500000002515414611712162015754 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2015 // Robert Stiles // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #ifndef _run_script_h #define _run_script_h extern int process_callsign_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_name_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_qth_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_locator_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_antenna_info(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_oss_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_oss_audio_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_port_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_capture_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_playback_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_pulse_audio_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_pulse_audio_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_audio_device_sample_rate_capture(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_audio_device_sample_rate_playback(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_audio_device_converter(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rx_ppm(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_tx_ppm(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_tx_offset(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_modem_signal_left_right(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_reverse_left_right(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_ptt_tone_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_cw_qsk_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_pseudo_fsk_right_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_wave_file_sample_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_right_audio_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_rts(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_dtr(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_rts_v(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_sep_serial_port_dtr_v(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_start_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_end_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_uhrouter(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hrdw_ptt_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_cmedia_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_cmedia_device(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_cmedia_gpio_line(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_rigcat(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_desc_file(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_retries(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_retry_interval(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_init_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_baud_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_stop_bits(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_commands_echoed(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_toggle_rts_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_restore_on_close(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_cat_command_ptt(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_dtr_12v(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_rts_12v(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_hrdwr_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_vsp_enable(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rigcat_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_use_hamlib(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_rig(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_device_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_retries(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_retry_interval(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_post_write_delay(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_baud_rate(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_stop_bits(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_sideband(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_ptt_hl_command(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_dtr_12(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_rts_12(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_rts_cts_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_xon_xoff_flow(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_advanced_config(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_hamlib_initialize(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_o_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_dual_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_busy_channel(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_continue_after(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_kiss_kpsql_atten(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_arq_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_arq_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_xmlrpc_ip_address(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_xmlrpc_io_port_no(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_active_port(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_ax25_decode(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_io_csma(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_state(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_open_flmsg(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_open_msg(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_open_brwsr(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_flmsg_path(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_misc_nbems_timeout(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_notify(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_search_bp(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_mark_prev(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_detector(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_alert_dialog(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_tx_freq_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_freq_change(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_allow_errors(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_sql_open(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_pretone(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_end_xmt_id(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_min_bw(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_tx_id_mode(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_tx_vid_txt(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_txt_input(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_small_font(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_500hz(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_video_width_limit(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rsid_char_per_row(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_cw_callsign(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_cw_speed(ScriptParsing *sp, SCRIPT_COMMANDS *sc); // FLDIGI main windows widgets extern int process_rig_freq(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rig_mode(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_wf_hz_offset(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rx_rsid(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_tx_rsid(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_spot(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_rev(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_afc(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_lock(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_sql(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_kpsql(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_modem(ScriptParsing *sp, SCRIPT_COMMANDS *sc); extern int process_load_macro(ScriptParsing *sp, SCRIPT_COMMANDS *sc); #endif fldigi-4.2.05/src/config_script/script_parsing.cxx0000664000175000017500000022020414611712162017157 00000000000000// ---------------------------------------------------------------------------- // Copyright (C) 2015 // Robert Stiles // // This file is part of fldigi // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "config.h" #include "util.h" #include #include #include #include #include #include #include #include #include "debug.h" #include "gettext.h" #include "script_parsing.h" #include "run_script.h" // Do not use directly. It's copied for each instance static const SCRIPT_COMMANDS default_operator_command_table[] = { { CMD_CALLSIGN, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_callsign_info, 0, 0}, { CMD_NAME, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_name_info, 0, 0}, { CMD_QTH, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_qth_info, 0, 0}, { CMD_LOCATOR, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_locator_info, 0, 0}, { CMD_ANTENNA, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_antenna_info, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_audio_device_command_table[] = { { CMD_OSS_AUDIO, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_oss_audio_device, 0, 0}, { CMD_OSS_AUDIO_DEV_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_oss_audio_device_path, 0, 0}, { CMD_PORT_AUDIO, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_port_audio_device, 0, 0}, { CMD_PORTA_CAP, SCRIPT_COMMAND, 0, 2, {0}, { p_int, p_dev_name }, 0, 0, 0, process_capture_path, 0, 0}, { CMD_PORTA_PLAY, SCRIPT_COMMAND, 0, 2, {0}, { p_int, p_dev_name }, 0, 0, 0, process_playback_path, 0, 0}, { CMD_PULSEA, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_pulse_audio_device, 0, 0}, { CMD_PULSEA_SERVER, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_path }, 0, 0, 0, process_pulse_audio_device_path, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_audio_settings_command_table[] = { { CMD_CAPTURE_SAMPLE_RATE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_audio_device_sample_rate_capture, 0, 0}, { CMD_PLAYBACK_SAMPLE_RATE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_audio_device_sample_rate_playback, 0, 0}, { CMD_AUDIO_CONVERTER, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_audio_device_converter, 0, 0}, { CMD_RX_PPM, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rx_ppm, 0, 0}, { CMD_TX_PPM, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_tx_ppm, 0, 0}, { CMD_TX_OFFSET, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_tx_offset, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_audio_rt_channel_command_table[] = { { CMD_AUDIO_L_R, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_modem_signal_left_right, 0, 0}, { CMD_AUDIO_REV_L_R, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_reverse_left_right, 0, 0}, { CMD_PTT_RIGHT_CHAN, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_ptt_tone_right_channel, 0, 0}, { CMD_CW_QSK_RT_CHAN, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_cw_qsk_right_channel, 0, 0}, { CMD_PSEUDO_FSK_RT_CHAN, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_pseudo_fsk_right_channel, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_audio_wave_command_table[] = { { CMD_WAVE_SR, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_wave_file_sample_rate, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_rig_hrdwr_ptt_command_table[] = { { CMD_HPPT_PTT_RT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_right_audio_channel, 0, 0}, { CMD_HPTT_SP2, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port, 0, 0}, { CMD_HPTT_SP2_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_path }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_path, 0, 0}, { CMD_HPTT_SP2_RTS, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_rts, 0, 0}, { CMD_HPTT_SP2_DTR, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_dtr, 0, 0}, { CMD_HPTT_SP2_RTS_V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_rts_v, 0, 0}, { CMD_HPTT_SP2_DTR_V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_sep_serial_port_dtr_v, 0, 0}, { CMD_HPTT_SP2_START_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hrdw_ptt_start_delay, 0, 0}, { CMD_HPTT_SP2_END_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hrdw_ptt_end_delay, 0, 0}, { CMD_HPTT_UHROUTER, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hrdw_ptt_uhrouter, 0, 0}, { CMD_HPTT_SP2_INITIALIZE, SCRIPT_COMMAND, 0, 0, {0}, { p_void }, 0, 0, 0, process_hrdw_ptt_initialize, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_cmedia_ptt_command_table[] = { { CMD_USE_CMEDIA_PTT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_cmedia_ptt, 0, 0}, { CMD_CMEDIA_DEV, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_cmedia_device, 0, 0}, { CMD_CMEDIA_GPIO_LINE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_cmedia_gpio_line, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_rigcat_command_table[] = { { CMD_RIGCAT_STATE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_rigcat, 0, 0}, { CMD_RIGCAT_DESC_FILE, SCRIPT_COMMAND, 0, 1, {0}, { p_filename }, 0, 0, 0, process_rigcat_desc_file, 0, 0}, { CMD_RIGCAT_DEV_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_path }, 0, 0, 0, process_rigcat_device_path, 0, 0}, { CMD_RIGCAT_RETRIES, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rigcat_retries, 0, 0}, { CMD_RIGCAT_RETRY_INTERVAL, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rigcat_retry_interval, 0, 0}, { CMD_RIGCAT_WRITE_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rigcat_write_delay, 0, 0}, { CMD_RIGCAT_INTIAL_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_rigcat_init_delay, 0, 0}, { CMD_RIGCAT_BAUD_RATE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_rigcat_baud_rate, 0, 0}, { CMD_RIGCAT_STOP_BITS, SCRIPT_COMMAND, 0, 1, {0}, { p_float }, 0, 0, 0, process_rigcat_stop_bits, 0, 0}, { CMD_RIGCAT_ECHO, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_commands_echoed, 0, 0}, { CMD_RIGCAT_TOGGLE_RTS_PTT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_toggle_rts_ptt, 0, 0}, { CMD_RIGCAT_RESTORE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_restore_on_close, 0, 0}, { CMD_RIGCAT_PTT_COMMAND, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_cat_command_ptt, 0, 0}, { CMD_RIGCAT_RTS_12V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_rts_12v, 0, 0}, { CMD_RIGCAT_DTR_12V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_dtr_12v, 0, 0}, { CMD_RIGCAT_HRDWR_FLOW, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_hrdwr_flow, 0, 0}, { CMD_RIGCAT_VSP, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rigcat_vsp_enable, 0, 0}, { CMD_RIGCAT_INITIALIZE, SCRIPT_COMMAND, 0, 0, {0}, { p_void }, 0, 0, 0, process_rigcat_initialize, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_hamlib_command_table[] = { { CMD_HAMLIB_STATE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_use_hamlib, 0, 0}, { CMD_HAMLIB_RIG, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_name }, 0, 0, 0, process_hamlib_rig, 0, 0}, { CMD_HAMLIB_DEV_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_dev_path }, 0, 0, 0, process_hamlib_device_path, 0, 0}, { CMD_HAMLIB_RETRIES, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hamlib_retries, 0, 0}, { CMD_HAMLIB_RETRY_INTERVAL, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hamlib_retry_interval, 0, 0}, { CMD_HAMLIB_WRITE_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hamlib_write_delay, 0, 0}, { CMD_HAMLIB_POST_WRITE_DELAY, SCRIPT_COMMAND, 0, 1, {0}, { p_unsigned_int }, 0, 0, 0, process_hamlib_post_write_delay, 0, 0}, { CMD_HAMLIB_BAUD_RATE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_hamlib_baud_rate, 0, 0}, { CMD_HAMLIB_STOP_BITS, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_hamlib_stop_bits, 0, 0}, { CMD_HAMLIB_SIDE_BAND, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_hamlib_sideband, 0, 0}, { CMD_HAMLIB_PTT_COMMAND, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_ptt_hl_command, 0, 0}, { CMD_HAMLIB_DTR_12V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_dtr_12, 0, 0}, { CMD_HAMLIB_RTS_12V, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_rts_12, 0, 0}, { CMD_HAMLIB_HRDWR_FLOW, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_rts_cts_flow, 0, 0}, { CMD_HAMLIB_SFTWR_FLOW, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_hamlib_xon_xoff_flow, 0, 0}, { CMD_HAMLIB_ADV_CONFIG, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_hamlib_advanced_config, 0, 0}, { CMD_HAMLIB_INITIALIZE, SCRIPT_COMMAND, 0, 0, {0}, { p_void }, 0, 0, 0, process_hamlib_initialize, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_kiss_command_table[] = { { CMD_IO_KISS_IPA, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_io_kiss_ip_address, 0, 0}, { CMD_IO_KISS_IOPN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_kiss_io_port_no, 0, 0}, { CMD_IO_KISS_OPN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_kiss_o_port_no, 0, 0}, { CMD_IO_KISS_DP, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_kiss_dual_port, 0, 0}, { CMD_IO_KISS_BUSY, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_kiss_busy_channel, 0, 0}, { CMD_IO_KISS_CONT, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_kiss_continue_after, 0, 0}, { CMD_IO_KISS_ATTEN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_kiss_kpsql_atten, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_arq_command_table[] = { { CMD_IO_ARQ_IPA, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_io_arq_ip_address, 0, 0}, { CMD_IO_ARQ_IOPN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_arq_io_port_no, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_xmlrpc_command_table[] = { { CMD_IO_XMLRPC_IPA, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_io_xmlrpc_ip_address, 0, 0}, { CMD_IO_XMLRPC_IOPN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_io_xmlrpc_io_port_no, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_io_command_table[] = { { CMD_IO_LOCK, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_lock, 0, 0}, { CMD_IO_ACT_PORT, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_io_active_port, 0, 0}, { CMD_IO_AX25_DECODE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_ax25_decode, 0, 0}, { CMD_IO_CSMA, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_io_csma, 0, 0}, { CMD_IO_KISS, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_kiss_command_table, sizeof(default_kiss_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_IO_ARQ, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_arq_command_table, sizeof(default_arq_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_IO_XMLRPC, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_xmlrpc_command_table, sizeof(default_xmlrpc_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_fldigi_command_table[] = { { CMD_FLDIGI_FREQ, SCRIPT_COMMAND, 0, 1, {0}, { p_double }, 0, 0, 0, process_rig_freq, 0, 0}, { CMD_FLDIGI_MODE, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_rig_mode, 0, 0}, { CMD_FLDIGI_WFHZ, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_wf_hz_offset, 0, 0}, { CMD_FLDIGI_RXID, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rx_rsid, 0, 0}, { CMD_FLDIGI_TXID, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_tx_rsid, 0, 0}, { CMD_FLDIGI_SPOT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_spot, 0, 0}, { CMD_FLDIGI_REV, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rev, 0, 0}, { CMD_FLDIGI_AFC, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_afc, 0, 0}, { CMD_FLDIGI_LOCK, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_lock, 0, 0}, { CMD_FLDIGI_SQL, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_sql, 0, 0}, { CMD_FLDIGI_KPSQL, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_kpsql, 0, 0}, { CMD_FLDIGI_KPSM, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_kpsql, 0, 0}, { CMD_FLDIGI_MODEM, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_modem, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_nbems_command_table[] = { { CMD_NBEMS_FLMSG_PATH, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_misc_nbems_flmsg_path, 0, 0}, { CMD_NBEMS_TIMEOUT, SCRIPT_COMMAND, 0, 1, {0}, { p_double }, 0, 0, 0, process_misc_nbems_timeout, 0, 0}, { CMD_NBEMS_STATE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_misc_nbems_state, 0, 0}, { CMD_NBEMS_MSG, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_misc_nbems_open_msg, 0, 0}, { CMD_NBEMS_FLMSG, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_misc_nbems_open_flmsg, 0, 0}, { CMD_NBEMS_BRWSR, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_misc_nbems_open_brwsr, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_id_rsid_command_table[] = { { CMD_ID_RSID_NOTIFY, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_notify, 0, 0}, { CMD_ID_RSID_SRCH_BP, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_search_bp, 0, 0}, { CMD_ID_RSID_MARK_PREV, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_mark_prev, 0, 0}, { CMD_ID_RSID_DETECTOR, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_detector, 0, 0}, { CMD_ID_RSID_ALRT_DIALOG, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_alert_dialog, 0, 0}, { CMD_ID_RSID_TX_FREQ_LOCK, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_tx_freq_lock, 0, 0}, { CMD_ID_RSID_FREQ_CHANGE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_freq_change, 0, 0}, { CMD_ID_RSID_ALLOW_ERRORS, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_rsid_allow_errors, 0, 0}, { CMD_ID_RSID_SQL_OPEN, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_rsid_sql_open, 0, 0}, { CMD_ID_RSID_PRETONE, SCRIPT_COMMAND, 0, 1, {0}, { p_double }, 0, 0, 0, process_rsid_pretone, 0, 0}, { CMD_ID_RSID_END_XMT_ID, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_rsid_end_xmt_id, 0, 0}, { CMD_ID_RSID_MIN_BW, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_rsid_min_bw, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_id_video_command_table[] = { { CMD_ID_VIDEO_TX_ID_MODE, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_tx_id_mode, 0, 0}, { CMD_ID_VIDEO_TX_VIDEO_TXT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_tx_vid_txt, 0, 0}, { CMD_ID_VIDEO_TX_TXT_INP, SCRIPT_COMMAND, 0, 1, {0}, { p_string }, 0, 0, 0, process_video_txt_input, 0, 0}, { CMD_ID_VIDEO_SMALL_FONT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_small_font, 0, 0}, { CMD_ID_VIDEO_500_HZ, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_500hz, 0, 0}, { CMD_ID_VIDEO_WIDTH_LIMIT, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_video_width_limit, 0, 0}, { CMD_ID_VIDEO_CHAR_ROW, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_rsid_char_per_row, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_id_cw_command_table[] = { { CMD_ID_CW_TX_CALLSIGN, SCRIPT_COMMAND, 0, 1, {0}, { p_bool }, 0, 0, 0, process_cw_callsign, 0, 0}, { CMD_ID_CW_SPEED, SCRIPT_COMMAND, 0, 1, {0}, { p_int }, 0, 0, 0, process_cw_speed, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_id_command_table[] = { { CMD_ID_RSID, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_id_rsid_command_table, sizeof(default_id_rsid_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_ID_VIDEO, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_id_video_command_table, sizeof(default_id_video_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_ID_CW, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_id_cw_command_table, sizeof(default_id_cw_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; static const SCRIPT_COMMANDS default_top_level_command_table[] = { { CMD_FLDIGI, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_fldigi_command_table, sizeof(default_fldigi_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_OPERATOR, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_operator_command_table, sizeof(default_operator_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_AUDIO_DEVICE, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_audio_device_command_table, sizeof(default_audio_device_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_AUDIO_SETTINGS, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_audio_settings_command_table, sizeof(default_audio_settings_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_AUDIO_RT_CHANNEL, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_audio_rt_channel_command_table, sizeof(default_audio_rt_channel_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_AUDIO_WAVE, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_audio_wave_command_table, sizeof(default_audio_wave_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_HRDWR_PTT, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_rig_hrdwr_ptt_command_table, sizeof(default_rig_hrdwr_ptt_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_CMEDIA_PTT, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_cmedia_ptt_command_table, sizeof(default_cmedia_ptt_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_RIGCAT, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_rigcat_command_table, sizeof(default_rigcat_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_HAMLIB, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_hamlib_command_table, sizeof(default_hamlib_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_IO, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_io_command_table, sizeof(default_io_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_NBEMS, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_nbems_command_table, sizeof(default_nbems_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_ID, SCRIPT_COMMAND, 0, 0, {0}, { p_list }, 0, 0, 0, 0, (struct script_cmds *) &default_id_command_table, sizeof(default_id_command_table)/sizeof(SCRIPT_COMMANDS)}, { CMD_LOAD_MACRO, SCRIPT_COMMAND | SCRIPT_STRUCTURED_ONLY, 0, 3, {0}, { p_int, p_int, p_string }, 0, 0, 0, process_load_macro, 0, 0}, { CMD_END_CMD, SCRIPT_COMMAND, 0, 0, {0}, { p_list_end }, 0, 0, 0, 0, 0, 0}, { {0} } }; /** ************************************************************** * \brief Macro command requires special procesing. * \param cmd Pointer to matching struct script_cmds script * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::sc_macros(struct script_cmds *cmd) { bool not_done = false; std::string temp; SCRIPT_CODES error = script_no_errors; int line_number_start = line_number; char *local_buffer = (char *)0; _macro_command.clear(); temp.clear(); std::string search_cmd; search_cmd.assign(CMD_END_CMD).append(":"); local_buffer = new char[MAX_READLINE_LENGTH]; if(!local_buffer) return script_memory_allocation_error; while(!not_done) { if(ferror(fd)) { error = script_file_read_error; break; } if(feof(fd)) { error = script_unexpected_eof; break; } memset(local_buffer, 0, MAX_READLINE_LENGTH); if (fgets(local_buffer, MAX_READLINE_LENGTH, fd)) line_number++; temp.assign(local_buffer); trim(temp); if(temp.find(search_cmd) == std::string::npos) _macro_command.append(local_buffer); else break; } int pos = _macro_command.length() - 1; bool lf_removed = false; // Remove the last new line in the macro command (script syntax requirement) if(pos > 1) { // Windows way if(_macro_command[pos-1] == '\r' && _macro_command[pos] == '\n') { _macro_command.erase(pos - 1, 2); lf_removed = true; } } if((lf_removed == false) && (pos > 0)) { // Unix/Linux/MacOSX way if(_macro_command[pos] == '\n') _macro_command.erase(pos, 1); } if(error == script_unexpected_eof) { LOG_INFO(_("Missing command %s after line %d"), search_cmd.c_str(), line_number_start); } delete [] local_buffer; return error; } /** ************************************************************** * \brief Used for initialization of the function vector table. * \param cmd Pointer to matching struct script_cmds script * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::sc_dummy(struct script_cmds *cmd) { return script_no_errors; } /** ************************************************************** * \brief Convert error numbers into human readable form. * \param error_no Error number to convert. * \param ln The offending line number in the script file. * \param cmd The script command is question. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ char * ScriptParsing::script_error_string(SCRIPT_CODES error_no, int ln, char *cmd) { char *es = (char *) ""; memset(error_buffer, 0, sizeof(error_buffer)); memset(error_cmd_buffer, 0, sizeof(error_cmd_buffer)); memset(error_string, 0, sizeof(error_string)); if(cmd) { strncpy(error_cmd_buffer, cmd, sizeof(error_cmd_buffer)-1); } if(error_no < 0) { _script_error_detected = true; } switch(error_no) { case script_command_not_found: es = (char *) _("Command Not Found"); break; case script_non_script_file: es = (char *) _("Not a script file/tag not found"); break; case script_parameter_error: es = (char *) _("Invalid parameter"); break; case script_function_parameter_error: es = (char *) _("Invalid function parameter (internal non-script error)"); break; case script_mismatched_quotes: es = (char *) _("Missing paired quotes (\")"); break; case script_general_error: es = (char *) _("General Error"); break; case script_no_errors: es = (char *) _("No Errors"); break; case script_char_match_not_found: es = (char *) _("Character searched not found"); break; case script_end_of_line_reached: es = (char *) _("End of line reached"); break; case script_file_not_found: es = (char *) _("File not found"); break; case script_path_not_found: es = (char *) _("Directory path not found"); break; case script_args_eol: es = (char *) _("Unexpected end of parameter (args[]) list found"); break; case script_param_check_eol: es = (char *) _("Unexpected end of parameter check list found"); break; case script_paramter_exceeds_length: es = (char *) _("Character count in args[] parameter exceeds expectations"); break; case script_memory_allocation_error: es = (char *) _("Memory Allocation Error (internal non-script error)"); break; case script_incorrectly_assigned_value: es = (char *) _("Passed parameter is not of the expected type."); break; case script_invalid_parameter: es = (char *) _("Parameter is not valid."); break; case script_command_seperator_missing: es = (char *) _("Command missing ':'."); break; case script_max_sub_script_reached: es = (char *) _("Maximum open subscripts reached."); break; case script_subscript_exec_fail: es = (char *) _("Subscript execution fail (internal)."); break; case script_device_path_not_found: es = (char *) _("Script device path not found."); break; case script_unexpected_eof: es = (char *) _("Unexpected end of file reached."); break; case script_file_read_error: es = (char *) _("File read error"); break; default: es = (char *) _("Undefined error"); } snprintf(error_buffer, sizeof(error_buffer)-1, _("Line: %d Error:%d %s (%s)"), ln, error_no, es, error_cmd_buffer); return error_buffer; } /** ************************************************************** * \brief Search for first occurrence of a non white space * \param data Data pointer to search. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_white_spaces(char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr > ' ') { error = script_no_errors; return cPtr; } } error = script_end_of_line_reached; return (char *)0; // End of line reached. } /** ************************************************************** * \brief Search for the first occurrence on a non number. * \param data Data pointer to search. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_numbers(char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; int q_flag = 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '"') // Check for encapsulated strings ("") q_flag++; if((q_flag & 0x1)) // Continue if string is encapsulated continue; if(!isdigit(*cPtr)) { error = script_no_errors; return cPtr; } } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return (char *)0; // End of line reached. } /** ************************************************************** * \brief Skip characters until either a number or white space is * found. * \param data Data pointer to search. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_characters(char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; int q_flag = 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '"') // Check for encapsulated strings ("") q_flag++; if((q_flag & 0x1)) // Continue if string is encapsulated continue; if(isdigit(*cPtr) || *cPtr <= ' ') { error = script_no_errors; return cPtr; } } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return (char *)0; // End of line reached. } /** ************************************************************** * \brief Search for the first occurrence of a white space. * \param data Data pointer to search. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_alpha_numbers(char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; int q_flag = 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '"') // Check for encapsulated strings ("") q_flag++; if((q_flag & 0x1)) // Continue if string is encapsulated continue; if(*cPtr <= ' ') { error = script_no_errors; return cPtr; } } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return (char *)0; // End of line reached. } /** ************************************************************** * \brief Search for first occurrence of 'character' * \param c Character to search for * \param data Pointer to Data to search for character in. * \param limit Number of bytes in the data buffer. * \param error returned error code. * \return Pointer to character if found. Otherwise, return null * \par Note:
* The searched condition is ignored if the expected content is * encapsulated in quotes \(\"\"\). *****************************************************************/ char * ScriptParsing::skip_to_character(char c, char * data, char * limit, SCRIPT_CODES &error) { char *cPtr = (char *) 0; int q_flag = 0; if(!data || !limit) { error = script_function_parameter_error; return (char *)0; } for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '"') // Check for encapsulated strings ("") q_flag++; if((q_flag & 0x1)) // Continue if string is encapsulated continue; if(*cPtr == c) { // Match found. Return pointer to it's location error = script_no_errors; return cPtr; } } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return (char *)0; // End of line reached. } /** ************************************************************** * \brief Replace CR, LF, and '#' with '0' (by value) * \param data Search data pointer * \param limit data buffer size * \return void (none) * \par Note:
* The searched condition is ignored if the remark character \(#\) * is encapsulated in quotes \(\"\"\). *****************************************************************/ SCRIPT_CODES ScriptParsing::remove_crlf_comments(char *data, char *limit, size_t &count) { char *cPtr = (char *) 0; int q_flag = 0; SCRIPT_CODES error = script_no_errors; if(!data || !limit) return script_function_parameter_error; count = 0; for(cPtr = data; cPtr < limit; cPtr++) { if(*cPtr == '\r' || *cPtr == '\n') { *cPtr = 0; return script_no_errors; } if(*cPtr == '"') q_flag++; if((q_flag & 0x1)) continue; if(*cPtr == '#') { *cPtr = 0; break; } if(*cPtr > ' ') count++; } // Remove trailing white spaces. while(cPtr >= data) { if(*cPtr <= ' ') *cPtr = 0; else break; cPtr--; } if(q_flag & 0x1) { error = script_mismatched_quotes; } else { error = script_end_of_line_reached; } return error; } /** ************************************************************** * \brief Copy memory from address to address. * \param buffer Destination buffer * \param sPtr Start of the copy Address * \param ePtr End of the copy Address * \param limit Destination buffer size * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::copy_string_uppercase(char *buffer, char *sPtr, char *ePtr, size_t limit) { if(!buffer || !sPtr || !ePtr || limit < 1) { return script_function_parameter_error; } char *dPtr = buffer; size_t index = 0; for(index = 0; index < limit; index++) { *dPtr++ = toupper(*sPtr++); if(sPtr >= ePtr) break; } return script_no_errors; } /** ************************************************************** * \brief Parse the parameters and seperate into individual components. * \param s char pointer to the start of the string. * \param e char pointer to the end of the string. * \param matching_command pointer to the data strucure of the matching * command. See \ref SCRIPT_COMMANDS * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::parse_parameters(char *s, char *e, SCRIPT_COMMANDS *matching_command) { char *c = s; char *d = (char *)0; int index = 0; int parameter_count = matching_command->argc; int count = 0; long tmp = 0; SCRIPT_CODES error = script_no_errors; // Clear the old pointers. for(index = 0; index < MAX_CMD_PARAMETERS; index++) { matching_command->args[index] = (char *)0; } if(parameter_count > 0) { count = parameter_count - 1; for(index = 0; index < count; index++) { c = skip_white_spaces(c, e, error); if(error != script_no_errors) return script_parameter_error; d = skip_to_character(',', c, e, error); if(error != script_no_errors) return script_parameter_error; *d = 0; tmp = (long) (d - c); if(tmp > 0) trim(c, (size_t)(tmp)); matching_command->args[index] = c; c = d + 1; } c = skip_white_spaces(c, e, error); if(error) return error; d = skip_alpha_numbers(c, e, error); if(error) return error; *d = 0; tmp = (long) (d - c); if(tmp > 0) trim(c, (size_t)(tmp)); matching_command->args[index] = c; } #ifdef TESTING for(int i = 0; i < parameter_count; i++) if(matching_command->args[i]) printf("parameters %d (%s)\n", i, matching_command->args[i]); #endif error = check_parameters(matching_command); if(error != script_no_errors) return error; // If assigned then special processing is required. if(matching_command->func) error = (this->*matching_command->func)(matching_command); if(error) return error; return script_no_errors; } /** ************************************************************** * \brief Execute callback function. * \param cb_data Pointer for making a copy of the data to prevent * exterior alteration of source information. * \return 0 = No error
\< 0 = Error
*****************************************************************/ int ScriptParsing::call_callback(SCRIPT_COMMANDS *cb_data) { int argc = 0; int error = 0; int index = 0; SCRIPT_COMMANDS *tmp = (SCRIPT_COMMANDS *)0; size_t count = 0; if(!cb_data || !cb_data->cb) return -1; argc = cb_data->argc; tmp = new SCRIPT_COMMANDS; if(!tmp) return -1; memset(tmp, 0, sizeof(SCRIPT_COMMANDS)); for(index = 0; index < argc; index++) { if(cb_data->args[index]) { count = strnlen(cb_data->args[index], MAX_PARAMETER_LENGTH-1); tmp->args[index] = new char[count+1]; if(tmp->args[index]) { memset(tmp->args[index], 0, count+1); strncpy(tmp->args[index], cb_data->args[index], count); } else { error = -1; break; } } else break; } if(error > -1) { // Fill SCRIPT_COMMANDS (tmp) struct with useful data. tmp->flags = cb_data->flags; tmp->command_length = cb_data->command_length; tmp->argc = cb_data->argc; strncpy(tmp->command, cb_data->command, MAX_COMMAND_LENGTH); // Initialize with do nothing functions tmp->func = &ScriptParsing::sc_dummy; tmp->cb = callback_dummy; error = (*cb_data->cb)(this, tmp); } if(tmp) { for(index = 0; index < argc; index++) { if(tmp->args[index]) { delete [] tmp->args[index]; } } delete tmp; } return error; } /** ************************************************************** * \brief Parse a single line of data from the script file being read. * \param data Pointer the the script scring in question * \param buffer_size buffer size of the data pointer. * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::parse_hierarchy_command(char *data, size_t buffer_size) { char *buffer = (char *)0; char *cPtr = (char *)0; char *endPtr = (char *)0; char *ePtr = (char *)0; int allocated_buffer_size = MAX_COMMAND_LENGTH; SCRIPT_CODES error = script_no_errors; SCRIPT_COMMANDS *local_list = _script_commands; size_t local_limit = _script_command_count; cPtr = data; endPtr = &data[buffer_size]; cPtr = skip_white_spaces(cPtr, endPtr, error); if(error != script_no_errors) return error; ePtr = skip_to_character(':', cPtr, endPtr, error); if(error != script_no_errors) return script_command_seperator_missing; buffer = new char [allocated_buffer_size]; if(!buffer) { LOG_INFO(_("Buffer allocation Error near File: %s Line %d"), __FILE__, __LINE__); return script_memory_allocation_error; } memset(buffer, 0, allocated_buffer_size); error = copy_string_uppercase(buffer, cPtr, ePtr, allocated_buffer_size-1); if(error != script_no_errors) { buffer[0] = 0; delete [] buffer; return error; } int str_count = str_cnt(buffer, allocated_buffer_size); trim(buffer, (size_t) str_count); char sub_command[MAX_COMMAND_LENGTH]; bool not_found = true; char *endCmd = ePtr; char *endCmdPtr = endPtr; cPtr = buffer; endPtr = &buffer[str_count]; while(not_found) { memset(sub_command, 0, sizeof(sub_command)); ePtr = skip_to_character('.', cPtr, endPtr, error); if(error == script_end_of_line_reached) { ePtr = endPtr; error = script_no_errors; } if(error == script_no_errors) { copy_string_uppercase(sub_command, cPtr, ePtr, MAX_COMMAND_LENGTH-1); cPtr = ePtr + 1; } else break; for(size_t i = 0; i < local_limit; i++) { if(local_list[i].command[0] == 0) { not_found = false; error = script_command_not_found; break; } if(strncmp(sub_command, local_list[i].command, MAX_COMMAND_LENGTH) == 0) { if((local_list[i].param_check[0] == p_list) && local_list[i].sub_commands) { local_limit = local_list[i].sub_command_count; local_list = local_list[i].sub_commands; break; } if((file_type() & local_list[i].flags) && !(SCRIPT_STRUCTURED_ONLY & local_list[i].flags)) { error = parse_parameters(++endCmd, endCmdPtr, &local_list[i]); if(error) { buffer[0] = 0; delete [] buffer; return error; } if(local_list[i].cb) { error = (SCRIPT_CODES) call_callback(&local_list[i]); if(error < script_no_errors) LOG_INFO(_("Call back for script command %s reported an Error"), local_list[local_limit].command); not_found = false; error = script_command_handled; break; } } else { LOG_INFO(_("Command %s ignored, dot notation not supported"), buffer); not_found = false; error = script_general_error; break; } } } } buffer[0] = 0; delete [] buffer; return error; } /** ************************************************************** * \brief Parse a single line of data from the script file being read. * \param data Pointer the the script scring in question * \param buffer_size buffer size of the data pointer. * command. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::parse_single_command(FILE *fd, SCRIPT_COMMANDS *cur_list, size_t limit, char *data, size_t buffer_size) { char *buffer = (char *)0; char *cPtr = (char *)0; char *endPtr = (char *)0; char *ePtr = (char *)0; int allocated_buffer_size = MAX_COMMAND_LENGTH; size_t cmd_size = 0; size_t cmp_results = 0; size_t index = 0; size_t size = 0; bool dot_notation = false; SCRIPT_CODES error = script_no_errors; SCRIPT_COMMANDS *local_list = cur_list; size_t local_limit = limit; cPtr = data; endPtr = &data[buffer_size]; cPtr = skip_white_spaces(cPtr, endPtr, error); if(error != script_no_errors) return error; ePtr = skip_to_character(':', cPtr, endPtr, error); if(error != script_no_errors) return script_command_seperator_missing; buffer = new char [allocated_buffer_size]; if(!buffer) { LOG_INFO(_("Buffer allocation Error near File: %s Line %d"), __FILE__, __LINE__); return script_memory_allocation_error; } memset(buffer, 0, allocated_buffer_size); error = copy_string_uppercase(buffer, cPtr, ePtr, allocated_buffer_size-1); if(error != script_no_errors) { buffer[0] = 0; delete [] buffer; return error; } int str_count = (int) strnlen(buffer, allocated_buffer_size); trim(buffer, (size_t) str_count); for(int i = 0; i < str_count; i++) { if(buffer[i] == '.') { error = parse_hierarchy_command(data, buffer_size); if(error == script_no_errors) dot_notation = true; break; } } if(dot_notation == false && error == script_no_errors) { for(index = 0; index < local_limit; index++) { size = strnlen(local_list[index].command, MAX_COMMAND_LENGTH); cmd_size = strnlen(buffer, MAX_COMMAND_LENGTH); cmp_results = memcmp(buffer, local_list[index].command, size); if(cmp_results == 0 && (cmd_size == size)) { if(local_list[index].param_check[0] == p_list_end) { return script_end_of_list_reached; } if(local_list[index].sub_commands && local_list[index].param_check[0] == p_list) { if(recursive_count <= RECURSIVE_LIMIT) { read_file(fd, local_list[index].sub_commands, local_list[index].sub_command_count); } else { error = script_recursive_limit_reached; } break; } if((file_type() & local_list[index].flags) && !(SCRIPT_DOT_NOTATION_ONLY & local_list[index].flags)) { if(local_list[index].argc > 0) { error = parse_parameters(++ePtr, endPtr, &local_list[index]); if(error) { buffer[0] = 0; delete [] buffer; return error; } } if(local_list[index].cb) { error = (SCRIPT_CODES) call_callback(&local_list[index]); if(error < script_no_errors) LOG_INFO(_("Call back for script command %s reported an Error"), local_list[index].command); } } else { LOG_INFO(_("Command %s ignored, structured command not supported"), buffer); error = script_general_error; } break; } } } buffer[0] = 0; delete [] buffer; return error; } /** ************************************************************** * \brief Script entry point for parsing the script file. * \param file_name_path path and file name for the script to parse. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::read_file(FILE *fd, SCRIPT_COMMANDS *cur_list, size_t limit) { SCRIPT_CODES return_code = script_no_errors; SCRIPT_COMMANDS *local_list = cur_list; size_t count = 0; bool errors_reported = false; recursive_count++; if(recursive_count > RECURSIVE_LIMIT) return script_recursive_limit_reached; while(1) { if(ferror(fd) || feof(fd)) break; memset(line_buffer, 0, sizeof(line_buffer)); if (fgets(line_buffer, sizeof(line_buffer) - 1, fd)) line_number++; #ifdef TESTING printf("Reading: %s", line_buffer); #endif return_code = remove_crlf_comments(line_buffer, &line_buffer[sizeof(line_buffer)], count); if(count < 1) { continue; } if(return_code >= script_no_errors) { return_code = parse_single_command(fd, local_list, limit, line_buffer, sizeof(line_buffer) - 1); } if(return_code == script_end_of_list_reached) break; if(return_code < script_no_errors) { LOG_INFO("%s", script_error_string(return_code, line_number, line_buffer)); errors_reported = true; } } recursive_count--; if(errors_reported) return script_errors_reported; return script_no_errors; } /** ************************************************************** * \brief Script entry point for parsing the script file. * \param file_name_path path and file name for the script to parse. * \return SCRIPT_CODES error see \ref script_codes *****************************************************************/ SCRIPT_CODES ScriptParsing::parse_commands(char *file_name_path) { char *cPtr = (char *)0; SCRIPT_CODES error_code = script_no_errors; size_t tmp = 0; SCRIPT_COMMANDS *local_script_commands = _script_commands; size_t local_script_command_count = _script_command_count; if(!file_name_path) { LOG_INFO(_("Invalid function parameter 'char *file_name_path' (null)")); return script_function_parameter_error; } fd = fl_fopen(file_name_path, "r"); line_number = 0; if(!fd) { LOG_INFO(_("Unable to open file %s"), file_name_path); return script_file_not_found; } memset(line_buffer, 0, sizeof(line_buffer)); char *retval = fgets(line_buffer, sizeof(line_buffer) - 1, fd); line_number++; tmp = strlen(SCRIPT_FILE_TAG); line_buffer[tmp] = 0; tmp = strncmp(SCRIPT_FILE_TAG, line_buffer, tmp); if(!retval || tmp) { cPtr = script_error_string(script_non_script_file, line_number, line_buffer); LOG_INFO("%s", cPtr); fclose(fd); return script_non_script_file; } error_code = read_file(fd, local_script_commands, local_script_command_count); fclose(fd); return error_code; } /** ************************************************************** * \brief Assign a list of valid parameters for verification checks. * \param array An Array of pointers to each element. * \param array_count Number of entries in the array. * \return the array count or '0' if error. * \par Note: * This array is limited to the first parameter of the command * used in it's comparison. *****************************************************************/ int ScriptParsing::assign_valid_parameters(const char *command, const char **array, const int array_count) { if(!array || array_count < 1 || !command) return 0; int index = 0; int count = 0; SCRIPT_COMMANDS * cmd_sc = search_command(_script_commands, 0, command); if(!cmd_sc) { return 0; } for(index = 0; index < array_count; index++) { if(*array[index]) count++; } if(count != array_count) return 0; cmd_sc->valid_values = array; cmd_sc->valid_value_count = array_count; return array_count; } /** ************************************************************** * \brief Return true state if string is matched. * \param state Referenced value to assign results to. * \param string Pointer to the data string. * \param true_state Pointer to the data to match with. * \return SCRIPT_CODES error code. *****************************************************************/ inline SCRIPT_CODES ScriptParsing::test_on_off_state(bool &state, char *string, char *true_state=(char *)"ON") { if(!string || !true_state) { return script_function_parameter_error; } bool flag = false; if(strncmp(string, true_state, MAX_PARAMETER_LENGTH) == 0) flag = true; state = flag; return script_no_errors; } /** ************************************************************** * \brief Validate if file is located in the specified location. * \param filename Pointer to a series of charcters * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_filename(char *filename) { SCRIPT_CODES error = script_no_errors; if(!filename) { return script_function_parameter_error; } FILE *fd = (FILE *)0; fd = fl_fopen(filename, "r"); if(!fd) { error = script_file_not_found; } else { fclose(fd); } return error; } /** ************************************************************** * \brief Validate if path is present. * \param path The path to verify. * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_path(const char *path) { if(!path) { return script_function_parameter_error; } struct stat st; memset(&st, 0, sizeof(struct stat)); if(stat(path, &st) == 0) { if(st.st_mode & S_IFDIR) return script_no_errors; } return script_path_not_found; } /** ************************************************************** * \brief Validate if device path is present. * \param path The path to verify. * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_dev_path(const char *path) { if(!path) { return script_function_parameter_error; } struct stat st; memset(&st, 0, sizeof(struct stat)); #ifdef __WIN32__ std::string alt_path; int value = 0; int cnt = 0; alt_path.assign(path); if(!alt_path.empty()) { if(alt_path.find("COM") != std::string::npos) { cnt = sscanf(alt_path.c_str(), "COM%d", &value); if(cnt && (value > 0)) return script_no_errors; } } #endif if(stat(path, &st) == 0) { if(st.st_mode & S_IFCHR) return script_no_errors; } return script_device_path_not_found; } /** ************************************************************** * \brief Validate bool representation. * \param value String data or * \param flag Depending on string content a value of true or false assigned * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_bool(const char *value, bool &flag) { if(!value) { return script_function_parameter_error; } flag = false; std::string uc_value; uc_value.assign(value); to_uppercase(uc_value); static char *bool_true_flags[] = { (char *)PARM_ENABLE, (char *)PARM_YES, (char *)_("1"), (char *)0 }; static char *bool_false_flags[] = { (char *) PARM_DISABLE, (char *)PARM_NO, (char *)_("0"), (char *)0 }; for(size_t i = 0; i < sizeof(bool_true_flags)/sizeof(char *); i++) { if(bool_true_flags[i] == (char *)0) break; if(strncmp(uc_value.c_str(), bool_true_flags[i], 7) == 0) { flag = true; return script_no_errors; } } for(size_t i = 0; i < sizeof(bool_false_flags)/sizeof(char *); i++) { if(bool_false_flags[i] == (char *)0) break; if(strncmp(uc_value.c_str(), bool_false_flags[i], 7) == 0) { flag = false; return script_no_errors; } } flag = false; return script_invalid_parameter; } /** ************************************************************** * \brief Validate if the parameter is a value. * \param value The string in question. * \param p format verification. * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_numbers(char *value, paramter_types p) { SCRIPT_CODES error = script_no_errors; size_t length = 0; size_t index = 0; int data_count = 0; int signed_value = 0; int decimal_point = 0; if(!value) return script_function_parameter_error; length = strnlen(value, MAX_PARAMETER_LENGTH); if(length < 1) return script_parameter_error; // Skip any leading white spaces. for(index = 0; index < length; index++) { if(value[index] > ' ') break; } if((index >= length)) return script_parameter_error; switch(p) { case p_int: case p_long: if(value[0] == '-' || value[0] == '+') { index++; signed_value++; } case p_unsigned_int: case p_unsigned_long: for(; index< length; index++) { if(isdigit(value[index])) data_count++; else break; } break; if(data_count) return script_no_errors; case p_float: case p_double: if(value[0] == '-' || value[0] == '+') { index++; signed_value++; } for(; index< length; index++) { if(isdigit(value[index])) data_count++; if(value[index] == '.') decimal_point++; if(decimal_point > 1) return script_parameter_error; } if(data_count) return script_no_errors; break; default:; } return error; } /** ************************************************************** * \brief Validate the script parameter(s) are of the expected format. * \param cmd Matching command data structure. * \param p A table of expected parameters types (null terminated). * \param p_count the number of 'p[]' items in the table (includes null termination). * \return SCRIPT_CODES error code. *****************************************************************/ SCRIPT_CODES ScriptParsing::check_parameters(struct script_cmds *cmd) { SCRIPT_CODES error = script_no_errors; int count = 0; int index = 0; size_t size = 0; bool flag = false; if(!cmd) return script_function_parameter_error; count = cmd->argc; if(count < 1) return script_no_errors; for(index = 0; index < count; index++) { if(!cmd->args[index]) { return script_args_eol; } if(cmd->param_check[index] == p_null) { size = 0; } else { size = strnlen(cmd->args[index], MAX_COMMAND_LENGTH); } switch(cmd->param_check[index]) { case p_null: error = script_param_check_eol; break; case p_char: if(size > 1) error = script_paramter_exceeds_length; break; case p_bool: error = check_bool(cmd->args[index], flag); break; case p_int: case p_long: case p_unsigned_int: case p_unsigned_long: case p_float: case p_double: error = check_numbers(cmd->args[index], cmd->param_check[index]); break; case p_dev_path: error = check_dev_path(cmd->args[index]); break; case p_dev_name: case p_string: if(size < 1) error = script_parameter_error; break; case p_path: error = check_path(cmd->args[index]); break; case p_filename: error = check_filename(cmd->args[index]); break; case p_list: case p_list_end: case p_void: break; } if(error != script_no_errors) break; } return error; } /** ************************************************************** * \brief Search the content of SCRIPT_COMMANDS structure table * for the specified command. * \param command The command to search for. * \return Pointer to the matching SCRIPT_COMMANDS entry. Null if * not found. *****************************************************************/ SCRIPT_COMMANDS * ScriptParsing::search_command(SCRIPT_COMMANDS * table, size_t limit, const char *command) { char *cmd_buffer = (char *)0; int diff = 0; SCRIPT_COMMANDS * found = (SCRIPT_COMMANDS *) 0; size_t count = limit; size_t index = 0; if(!command) return found; cmd_buffer = new char [MAX_COMMAND_LENGTH]; if(!cmd_buffer) { LOG_INFO(_("cmd_buffer allocation error near line %d"), __LINE__); return found; } memset(cmd_buffer, 0, MAX_COMMAND_LENGTH); strncpy(cmd_buffer, command, MAX_COMMAND_LENGTH-1); to_uppercase(cmd_buffer, (int) MAX_COMMAND_LENGTH); trim(cmd_buffer, (size_t) MAX_COMMAND_LENGTH); for(index = 0; index < count; index++) { diff = strncmp(cmd_buffer, table[index].command, MAX_COMMAND_LENGTH); if(diff == 0) { found = &table[index]; break; } } cmd_buffer[0] = 0; delete [] cmd_buffer; return found; } /** ************************************************************** * \brief Convert string to uppercase characters.
* \par str Pointer to data. * \par limit data buffer size * \return void *****************************************************************/ void ScriptParsing::to_uppercase(char *str, int limit) { if(!str || limit < 1) return; int character = 0; int count = 0; int index = 0; count = (int) strnlen(str, limit); for(index = 0; index < count; index++) { character = str[index]; if(character == 0) break; character = (char) toupper(character); str[index] = character; } } /** ************************************************************** * \brief Convert string to uppercase characters.
* \par str String storage passed by reference. * \return void *****************************************************************/ void ScriptParsing::to_uppercase(std::string &str) { int character = 0; int count = 0; int index = 0; count = (int) str.length(); for(index = 0; index < count; index++) { character = str[index]; if(character == 0) break; character = (char) toupper(character); str[index] = character; } } #if 0 /** ************************************************************** * \brief Assign Call back function to a given script command.
* \param scriptCommand Script command string
* \param cb Pointer to call back function. int (*cb)(ScriptParsing *sp, SCRIPT_COMMANDS *sc) *****************************************************************/ int ScriptParsing::assign_callback(const char *scriptCommand, int (*cb)(ScriptParsing *sp, SCRIPT_COMMANDS *sc)) { char *cmd_buffer = (char *)0; int diff = 0; size_t count = _script_command_count; size_t index = 0; if(!scriptCommand || !cb) return 0; cmd_buffer = new char[MAX_COMMAND_LENGTH]; if(!cmd_buffer) { LOG_INFO(_("cmd_buffer allocation error near line %d"), __LINE__); return 0; } memset(cmd_buffer, 0, MAX_COMMAND_LENGTH); strncpy(cmd_buffer, scriptCommand, MAX_COMMAND_LENGTH-1); to_uppercase(cmd_buffer, (int) MAX_COMMAND_LENGTH); trim(cmd_buffer, (size_t) MAX_COMMAND_LENGTH); for(index = 0; index < count; index++) { diff = strncmp(cmd_buffer, _script_commands[index].command, MAX_COMMAND_LENGTH); if(diff == 0) { if(_script_commands[index].cb) LOG_INFO(_("Over writing call back funcion for \"%s\""), cmd_buffer); _script_commands[index].cb = cb; break; } } cmd_buffer[0] = 0; delete [] cmd_buffer; return 0; } #endif // #if 0 /** ************************************************************** * \brief Assign member calling function to a command * \param top_command Top Command * \param sub_command Sub command * \param func Assigned calling function member * \return void (nothing) *****************************************************************/ SCRIPT_CODES ScriptParsing::assign_member_func(char *cmd, SCRIPT_CODES (ScriptParsing::*func)(struct script_cmds *)) { char *buffer = (char *)0; char *cPtr = (char *)0; char *endPtr = (char *)0; char *ePtr = (char *)0; int allocated_buffer_size = MAX_COMMAND_LENGTH; size_t size = 0; SCRIPT_CODES error = script_no_errors; SCRIPT_COMMANDS *local_list = _script_commands; size_t local_limit = _script_command_count; if(!cmd || !func) return script_invalid_parameter; size = strnlen(cmd, MAX_COMMAND_LENGTH); cPtr = cmd; endPtr = &cmd[size]; size = 0; cPtr = skip_white_spaces(cPtr, endPtr, error); if(error != script_no_errors) return error; ePtr = skip_to_character(':', cPtr, endPtr, error); if(error != script_no_errors) return script_command_seperator_missing; buffer = new char [allocated_buffer_size]; if(!buffer) { LOG_INFO(_("Buffer allocation Error near File: %s Line %d"), __FILE__, __LINE__); return script_memory_allocation_error; } memset(buffer, 0, allocated_buffer_size); error = copy_string_uppercase(buffer, cPtr, ePtr, allocated_buffer_size-1); if(error != script_no_errors) { buffer[0] = 0; delete [] buffer; return error; } int str_count = str_cnt(buffer, allocated_buffer_size); trim(buffer, (size_t) str_count); char sub_command[MAX_COMMAND_LENGTH]; bool not_found = true; cPtr = buffer; endPtr = &buffer[str_count]; while(not_found) { memset(sub_command, 0, sizeof(sub_command)); ePtr = skip_to_character('.', cPtr, endPtr, error); if(error == script_end_of_line_reached) { ePtr = endPtr; error = script_no_errors; } if(error == script_no_errors) { copy_string_uppercase(sub_command, cPtr, ePtr, MAX_COMMAND_LENGTH-1); cPtr = ePtr + 1; } else break; for(size_t i = 0; i < local_limit; i++) { if(local_list[i].command[0] == 0) { not_found = false; error = script_command_not_found; break; } if(strncmp(sub_command, local_list[i].command, MAX_COMMAND_LENGTH) == 0) { if((local_list[i].param_check[0] == p_list) && local_list[i].sub_commands) { local_limit = local_list[i].sub_command_count; local_list = local_list[i].sub_commands; break; } local_list[i].func = func; local_list[i].command_length = strnlen(local_list[i].command, MAX_COMMAND_LENGTH); not_found = false; error = script_no_errors; break; } } } buffer[0] = 0; delete [] buffer; return error; } #if 0 /** ************************************************************** * \brief Assign member calling function to a command * \param top_command Top Command * \param sub_command Sub command * \param func Assigned calling function member * \return void (nothing) *****************************************************************/ void ScriptParsing::assign_member_func(char *cmd, SCRIPT_CODES (ScriptParsing::*func)(struct script_cmds *)) { if(!top_command || !func) return; SCRIPT_COMMANDS *top_table = (SCRIPT_COMMANDS *)0; SCRIPT_COMMANDS *modify_table = (SCRIPT_COMMANDS *)0; if(top_cache) { if(strncmp(top_cache->command, top_command, MAX_COMMAND_LENGTH) == 0) { top_table = top_cache; } } if(!top_table) { for(int i = 0; i < _script_command_count; i++) { if(strncmp(_script_commands[i].command, top_command, MAX_COMMAND_LENGTH) == 0) { top_cache = &_script_commands[i]; top_table = top_cache; break; } } } if(!top_table) return; if(!sub_command) modify_table = top_table; if(modify_table == (SCRIPT_COMMANDS *)0) { if(top_table->sub_commands) { for(int i = 0; i < top_table->sub_command_count; i++) { if(strncmp(sub_command, top_table->sub_commands[i].command, MAX_COMMAND_LENGTH) == 0) { modify_table = &top_table->sub_commands[i]; break; } } } } if(modify_table != (SCRIPT_COMMANDS *)0) { modify_table->func = func; modify_table->command_length = strnlen(modify_table->command, MAX_COMMAND_LENGTH); } } #endif // #if 0 /** ************************************************************** * \brief Initialize variables * \return void (nothing) *****************************************************************/ void ScriptParsing::clear_script_parameters(bool all) { _path.clear(); _file_type = SCRIPT_COMMAND; _macro_command.clear(); } /** ************************************************************** * \brief Initialize callable members. * \return void (nothing) *****************************************************************/ void ScriptParsing::initialize_function_members(void) { std::string cmd; cmd.assign(CMD_LOAD_MACRO).append(":"); // For localization assign_member_func((char *) cmd.c_str(), &ScriptParsing::sc_macros); } /** ************************************************************** * \brief Copy environment to the sub ScriptParsing class * \param src Source Class pointer to copy from. *****************************************************************/ int ScriptParsing::CopyScriptParsingEnv(ScriptParsing *src) { if(!src || (src == this)) return -1; parent(src); script_commands(src->script_commands()); script_command_count(src->script_command_count()); initialize_function_members(); return 0; } /** ************************************************************** * \brief Constructor: Copy and initialize.
*****************************************************************/ int ScriptParsing::copy_tables(struct script_cmds * subcmds, size_t count) { size_t index = 0; size_t table_count = 0; SCRIPT_COMMANDS * dst_table = 0; SCRIPT_COMMANDS * src_table = 0; recursive_count++; if(recursive_count > RECURSIVE_LIMIT) return 0; for(index = 0; index < count; index++) { src_table = subcmds[index].sub_commands; table_count = subcmds[index].sub_command_count; if(src_table && table_count) { dst_table = new SCRIPT_COMMANDS[table_count]; if(dst_table) { add_to_delete_list(dst_table); memcpy(dst_table, src_table, sizeof(SCRIPT_COMMANDS) * table_count); subcmds[index].sub_commands = dst_table; subcmds[index].sub_command_count = table_count; copy_tables(dst_table, table_count); } } } recursive_count--; return 0; } /** ************************************************************** * \brief Constructor: Copy and initialize function arrays.
*****************************************************************/ ScriptParsing::ScriptParsing() { size_t count = 0; clear_script_parameters(true); memset(line_buffer, 0, sizeof(line_buffer)); memset(error_cmd_buffer, 0, sizeof(error_cmd_buffer)); memset(error_string, 0, sizeof(error_string)); memset(error_buffer, 0, sizeof(error_buffer)); memset(memory_delete_list, 0, sizeof(memory_delete_list)); delete_list_count = 0; top_cache = 0; recursive_count = 0; _script_error_detected = false; _restart_flag = false; fd = 0; count = sizeof(default_top_level_command_table)/sizeof(SCRIPT_COMMANDS); _script_commands = new SCRIPT_COMMANDS[count]; if(_script_commands) { add_to_delete_list(_script_commands); _script_command_count = count; memcpy(_script_commands, default_top_level_command_table, sizeof(SCRIPT_COMMANDS) * _script_command_count); copy_tables(_script_commands, _script_command_count); } recursive_count = 0; initialize_function_members(); } /** ************************************************************** * \brief Destructor *****************************************************************/ ScriptParsing::~ScriptParsing() { int index = 0; for(index = 0; index < MAX_DELETE_LIST_COUNT; index++) { if(memory_delete_list[index]) { delete [] memory_delete_list[index]; } } } /** ************************************************************** * \brief Keep track of memory allocation for easy deallocation. *****************************************************************/ void ScriptParsing::add_to_delete_list(SCRIPT_COMMANDS *ptr) { if(!ptr) return; if(delete_list_count < MAX_DELETE_LIST_COUNT) { memory_delete_list[delete_list_count] = ptr; delete_list_count++; } } /** ************************************************************** * \brief Dummy callback function for initialization of * function pointers. * \param sp The calling ScriptParsing Class * \param sc Command data structure pointer to the matching script * command. * \return 0 = No error
\< 0 = Error
*****************************************************************/ int callback_dummy(ScriptParsing *sp, struct script_cmds *sc) { return 0; } /** ******************************************************** * \brief Determine the length of the string with a count * limitation. * \return signed integer. The number of characters in the * array not to excede count limit. ***********************************************************/ int ScriptParsing::str_cnt(char * str, int count_limit) { if(!str || (count_limit < 1)) return 0; int value = 0; for(int index = 0; index < count_limit; index++) { if(str[index] == 0) break; value++; } return value; } /** ******************************************************** * \brief Trim leading and trailing spaces from string. * \param s String to modify * \return s modified string. ***********************************************************/ std::string &ScriptParsing::trim(std::string &s) { char *buffer = (char *)0; char *dst = (char *)0; char *end = (char *)0; char *src = (char *)0; long count = s.size(); buffer = new char[count + 1]; if(!buffer) return s; memcpy(buffer, s.c_str(), count); buffer[count] = 0; dst = src = buffer; end = &buffer[count]; while(src < end) { if(*src > ' ') break; src++; } if(src > dst) { while((dst < end) && (src < end)) *dst++ = *src++; *dst = 0; } while(end >= buffer) { if(*end > ' ') break; *end-- = 0; } s.assign(buffer); delete [] buffer; return s; } /** ************************************************************** * \brief Remove leading/trailing white spaces and quotes. * \param buffer Destination buffer * \param limit passed buffer size * \return void *****************************************************************/ void ScriptParsing::trim(char *buffer, size_t limit) { char *s = (char *)0; char *e = (char *)0; char *dst = (char *)0; size_t count = 0; if(!buffer || limit < 1) { return; } for(count = 0; count < limit; count++) if(buffer[count] == 0) break; if(count < 1) return; s = buffer; e = &buffer[count-1]; for(size_t i = 0; i < count; i++) { if((*s <= ' ') || (*s == '"')) s++; else break; } while(e > s) { if(*e == '"') { *e-- = 0; break; } if(*e > ' ') break; if(*e <= ' ') *e = 0; e--; } dst = buffer; while(s <= e) { *dst++ = *s++; } *dst = 0; } fldigi-4.2.05/src/network/0000775000175000017500000000000014611714005012322 500000000000000fldigi-4.2.05/src/network/ca_cert.cxx0000664000175000017500000023563214611711171014402 00000000000000#include #include char ca_crt_rsa[] = {//70369] = { "-----BEGIN CERTIFICATE-----\r\n" "MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD\r\n" "VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv\r\n" "bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv\r\n" "b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV\r\n" "UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\r\n" "cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\r\n" "b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH\r\n" "iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS\r\n" "r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4\r\n" "04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r\r\n" "GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9\r\n" "3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P\r\n" "lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV\r\n" "UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy\r\n" "dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1\r\n" "MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx\r\n" "dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B\r\n" "AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f\r\n" "BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A\r\n" "cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC\r\n" "AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ\r\n" "MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm\r\n" "aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw\r\n" "ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj\r\n" "IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF\r\n" "MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA\r\n" "A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y\r\n" "7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh\r\n" "1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ\r\n" "BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh\r\n" "c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy\r\n" "MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp\r\n" "emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X\r\n" "DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw\r\n" "FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg\r\n" "UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo\r\n" "YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5\r\n" "MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB\r\n" "AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4\r\n" "pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0\r\n" "13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID\r\n" "AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk\r\n" "U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i\r\n" "F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY\r\n" "oJ2daZH9\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\r\n" "A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\r\n" "b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\r\n" "MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\r\n" "YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\r\n" "aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\r\n" "jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\r\n" "xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\r\n" "1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\r\n" "snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\r\n" "U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\r\n" "9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\r\n" "BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\r\n" "AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\r\n" "yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\r\n" "38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\r\n" "AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\r\n" "DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\r\n" "HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G\r\n" "A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp\r\n" "Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1\r\n" "MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG\r\n" "A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\r\n" "hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL\r\n" "v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8\r\n" "eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq\r\n" "tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd\r\n" "C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa\r\n" "zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB\r\n" "mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH\r\n" "V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n\r\n" "bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG\r\n" "3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs\r\n" "J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO\r\n" "291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS\r\n" "ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd\r\n" "AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\r\n" "TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\r\n" "A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\r\n" "Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\r\n" "MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\r\n" "A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\r\n" "hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\r\n" "RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\r\n" "gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\r\n" "KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\r\n" "QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\r\n" "XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\r\n" "DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\r\n" "LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\r\n" "RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\r\n" "jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\r\n" "6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\r\n" "mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\r\n" "Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\r\n" "WD9f\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx\r\n" "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD\r\n" "VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv\r\n" "biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy\r\n" "dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t\r\n" "MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB\r\n" "MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG\r\n" "A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp\r\n" "b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl\r\n" "cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv\r\n" "bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE\r\n" "VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ\r\n" "ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR\r\n" "uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG\r\n" "9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI\r\n" "hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM\r\n" "pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx\r\n" "FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD\r\n" "VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv\r\n" "biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm\r\n" "MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx\r\n" "MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT\r\n" "DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3\r\n" "dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl\r\n" "cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3\r\n" "DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD\r\n" "gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91\r\n" "yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX\r\n" "L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj\r\n" "EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG\r\n" "7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e\r\n" "QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ\r\n" "qdq5snUb9kLy78fyGPmJvKP/iiMucEc=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\r\n" "yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\r\n" "ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\r\n" "U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\r\n" "ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\r\n" "aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL\r\n" "MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\r\n" "ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln\r\n" "biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\r\n" "U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\r\n" "aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1\r\n" "nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex\r\n" "t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz\r\n" "SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG\r\n" "BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+\r\n" "rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/\r\n" "NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E\r\n" "BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH\r\n" "BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\r\n" "aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv\r\n" "MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE\r\n" "p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y\r\n" "5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK\r\n" "WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ\r\n" "4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N\r\n" "hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw\r\n" "CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl\r\n" "cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu\r\n" "LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT\r\n" "aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\r\n" "dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD\r\n" "VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT\r\n" "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ\r\n" "bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu\r\n" "IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\r\n" "LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b\r\n" "N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t\r\n" "KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu\r\n" "kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm\r\n" "CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ\r\n" "Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu\r\n" "imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te\r\n" "2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe\r\n" "DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\r\n" "/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p\r\n" "F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt\r\n" "TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL\r\n" "MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\r\n" "ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln\r\n" "biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\r\n" "U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\r\n" "aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG\r\n" "A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp\r\n" "U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg\r\n" "SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln\r\n" "biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\r\n" "IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm\r\n" "GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve\r\n" "fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw\r\n" "AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ\r\n" "aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj\r\n" "aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW\r\n" "kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC\r\n" "4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga\r\n" "FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB\r\n" "vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\r\n" "ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp\r\n" "U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W\r\n" "ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe\r\n" "Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX\r\n" "MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0\r\n" "IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y\r\n" "IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh\r\n" "bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\r\n" "AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF\r\n" "9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH\r\n" "H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H\r\n" "LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN\r\n" "/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT\r\n" "rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud\r\n" "EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw\r\n" "WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs\r\n" "exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\r\n" "DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4\r\n" "sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+\r\n" "seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz\r\n" "4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+\r\n" "BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR\r\n" "lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3\r\n" "7M2CYfE45k+XmCpajQ==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw\r\n" "CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl\r\n" "cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu\r\n" "LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT\r\n" "aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\r\n" "dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD\r\n" "VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT\r\n" "aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ\r\n" "bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu\r\n" "IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\r\n" "LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1\r\n" "GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ\r\n" "+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd\r\n" "U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm\r\n" "NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY\r\n" "ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/\r\n" "ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1\r\n" "CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq\r\n" "g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm\r\n" "fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c\r\n" "2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/\r\n" "bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW\r\n" "MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg\r\n" "Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh\r\n" "dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9\r\n" "MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi\r\n" "U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh\r\n" "cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA\r\n" "A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk\r\n" "pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf\r\n" "OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C\r\n" "Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT\r\n" "Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi\r\n" "HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM\r\n" "Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w\r\n" "+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+\r\n" "Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3\r\n" "Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B\r\n" "26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID\r\n" "AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE\r\n" "FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j\r\n" "ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js\r\n" "LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM\r\n" "BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0\r\n" "Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy\r\n" "dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh\r\n" "cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh\r\n" "YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg\r\n" "dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp\r\n" "bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ\r\n" "YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT\r\n" "TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ\r\n" "9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8\r\n" "jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW\r\n" "FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz\r\n" "ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1\r\n" "ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L\r\n" "EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu\r\n" "L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq\r\n" "yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC\r\n" "O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V\r\n" "um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh\r\n" "NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0\r\n" "IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz\r\n" "BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y\r\n" "aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG\r\n" "9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy\r\n" "NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y\r\n" "azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\r\n" "YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw\r\n" "Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl\r\n" "cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY\r\n" "dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9\r\n" "WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS\r\n" "v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v\r\n" "UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu\r\n" "IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC\r\n" "W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\r\n" "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\r\n" "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\r\n" "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\r\n" "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1\r\n" "MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE\r\n" "ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j\r\n" "b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\r\n" "bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg\r\n" "U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA\r\n" "A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/\r\n" "I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3\r\n" "wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC\r\n" "AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb\r\n" "oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5\r\n" "BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p\r\n" "dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk\r\n" "MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp\r\n" "b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\r\n" "dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0\r\n" "MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi\r\n" "E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa\r\n" "MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI\r\n" "hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN\r\n" "95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd\r\n" "2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\r\n" "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" "d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\r\n" "ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\r\n" "MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\r\n" "LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\r\n" "RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\r\n" "+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\r\n" "PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\r\n" "xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\r\n" "Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\r\n" "hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\r\n" "EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\r\n" "MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\r\n" "FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\r\n" "nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\r\n" "eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\r\n" "hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\r\n" "Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\r\n" "vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\r\n" "+OkuE6N36B9K\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl\r\n" "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" "d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv\r\n" "b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG\r\n" "EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl\r\n" "cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi\r\n" "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c\r\n" "JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP\r\n" "mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+\r\n" "wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4\r\n" "VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/\r\n" "AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB\r\n" "AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\r\n" "BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun\r\n" "pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC\r\n" "dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf\r\n" "fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm\r\n" "NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx\r\n" "H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\r\n" "+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\r\n" "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\r\n" "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\r\n" "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\r\n" "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\r\n" "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\r\n" "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\r\n" "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\r\n" "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\r\n" "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\r\n" "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\r\n" "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\r\n" "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\r\n" "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\r\n" "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\r\n" "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\r\n" "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\r\n" "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\r\n" "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc\r\n" "MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT\r\n" "ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw\r\n" "MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj\r\n" "dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l\r\n" "c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC\r\n" "UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc\r\n" "58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/\r\n" "o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH\r\n" "MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr\r\n" "aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA\r\n" "A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA\r\n" "Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv\r\n" "8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc\r\n" "MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT\r\n" "ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw\r\n" "MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j\r\n" "LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ\r\n" "KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo\r\n" "RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu\r\n" "WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw\r\n" "Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD\r\n" "AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK\r\n" "eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM\r\n" "zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+\r\n" "WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN\r\n" "/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\r\n" "MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\r\n" "YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG\r\n" "EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg\r\n" "R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9\r\n" "9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq\r\n" "fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv\r\n" "iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU\r\n" "1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+\r\n" "bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW\r\n" "MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA\r\n" "ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l\r\n" "uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn\r\n" "Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS\r\n" "tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF\r\n" "PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un\r\n" "hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV\r\n" "5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW\r\n" "MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs\r\n" "IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG\r\n" "EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg\r\n" "R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A\r\n" "PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8\r\n" "Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL\r\n" "TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL\r\n" "5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7\r\n" "S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe\r\n" "2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\r\n" "FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap\r\n" "EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td\r\n" "EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv\r\n" "/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN\r\n" "A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0\r\n" "abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF\r\n" "I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz\r\n" "4iIprn2DQKi6bA==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY\r\n" "MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo\r\n" "R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx\r\n" "MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\r\n" "Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp\r\n" "ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\r\n" "AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9\r\n" "AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA\r\n" "ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0\r\n" "7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W\r\n" "kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI\r\n" "mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\r\n" "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ\r\n" "KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1\r\n" "6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl\r\n" "4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K\r\n" "oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj\r\n" "UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU\r\n" "AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB\r\n" "mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT\r\n" "MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s\r\n" "eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv\r\n" "cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ\r\n" "BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\r\n" "MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0\r\n" "BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\r\n" "LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz\r\n" "+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm\r\n" "hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn\r\n" "5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W\r\n" "JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL\r\n" "DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC\r\n" "huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw\r\n" "HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB\r\n" "AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB\r\n" "zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN\r\n" "kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\r\n" "AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH\r\n" "SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G\r\n" "spki4cErx5z481+oghLrGREt\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW\r\n" "MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy\r\n" "c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE\r\n" "BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0\r\n" "IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV\r\n" "VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8\r\n" "cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT\r\n" "QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh\r\n" "F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v\r\n" "c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w\r\n" "mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd\r\n" "VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX\r\n" "teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ\r\n" "f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe\r\n" "Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+\r\n" "nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB\r\n" "/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY\r\n" "MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG\r\n" "9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\r\n" "aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX\r\n" "IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn\r\n" "ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z\r\n" "uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN\r\n" "Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja\r\n" "QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW\r\n" "koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9\r\n" "ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt\r\n" "DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm\r\n" "bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW\r\n" "MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy\r\n" "c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD\r\n" "VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1\r\n" "c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\r\n" "AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81\r\n" "WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG\r\n" "FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq\r\n" "XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL\r\n" "se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb\r\n" "KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd\r\n" "IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73\r\n" "y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt\r\n" "hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc\r\n" "QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4\r\n" "Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV\r\n" "HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV\r\n" "HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ\r\n" "KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\r\n" "dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ\r\n" "L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr\r\n" "Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo\r\n" "ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY\r\n" "T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz\r\n" "GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m\r\n" "1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV\r\n" "OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH\r\n" "6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX\r\n" "QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh\r\n" "MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE\r\n" "YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3\r\n" "MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo\r\n" "ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg\r\n" "MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\r\n" "ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA\r\n" "PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w\r\n" "wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi\r\n" "EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY\r\n" "avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+\r\n" "YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE\r\n" "sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h\r\n" "/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5\r\n" "IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj\r\n" "YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD\r\n" "ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy\r\n" "OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P\r\n" "TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\r\n" "HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER\r\n" "dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf\r\n" "ReYNnyicsbkqWletNw+vHX/bvZ8=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx\r\n" "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT\r\n" "EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp\r\n" "ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz\r\n" "NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH\r\n" "EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE\r\n" "AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw\r\n" "DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD\r\n" "E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH\r\n" "/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy\r\n" "DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh\r\n" "GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR\r\n" "tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA\r\n" "AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\r\n" "FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX\r\n" "WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu\r\n" "9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr\r\n" "gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo\r\n" "2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\r\n" "LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI\r\n" "4uJEvlz36hz1\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl\r\n" "MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\r\n" "U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\r\n" "NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE\r\n" "ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\r\n" "ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3\r\n" "DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\r\n" "8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN\r\n" "+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\r\n" "X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa\r\n" "K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\r\n" "1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G\r\n" "A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR\r\n" "zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0\r\n" "YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\r\n" "bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\r\n" "DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\r\n" "L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\r\n" "eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\r\n" "xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\r\n" "VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY\r\n" "WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx\r\n" "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\r\n" "HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs\r\n" "ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw\r\n" "MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\r\n" "b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj\r\n" "aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp\r\n" "Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\r\n" "ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg\r\n" "nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1\r\n" "HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N\r\n" "Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN\r\n" "dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0\r\n" "HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO\r\n" "BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G\r\n" "CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU\r\n" "sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3\r\n" "4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg\r\n" "8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\r\n" "pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1\r\n" "mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\r\n" "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\r\n" "HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\r\n" "ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\r\n" "MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\r\n" "VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\r\n" "ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\r\n" "dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\r\n" "hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\r\n" "OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\r\n" "8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\r\n" "Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\r\n" "hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\r\n" "6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\r\n" "DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\r\n" "AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\r\n" "bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\r\n" "ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\r\n" "qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\r\n" "iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\r\n" "0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\r\n" "sSi6\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW\r\n" "MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm\r\n" "aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1\r\n" "OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG\r\n" "A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G\r\n" "CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ\r\n" "JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD\r\n" "vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo\r\n" "D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/\r\n" "Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW\r\n" "RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK\r\n" "HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN\r\n" "nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM\r\n" "0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i\r\n" "UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9\r\n" "Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg\r\n" "TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE\r\n" "AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL\r\n" "BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K\r\n" "2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX\r\n" "UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl\r\n" "6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK\r\n" "9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ\r\n" "HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI\r\n" "wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY\r\n" "XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l\r\n" "IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo\r\n" "hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr\r\n" "so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB\r\n" "qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf\r\n" "Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw\r\n" "MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV\r\n" "BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw\r\n" "NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j\r\n" "LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG\r\n" "A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\r\n" "IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG\r\n" "SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs\r\n" "W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta\r\n" "3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk\r\n" "6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6\r\n" "Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J\r\n" "NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA\r\n" "MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP\r\n" "r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU\r\n" "DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz\r\n" "YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\r\n" "xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2\r\n" "/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/\r\n" "LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7\r\n" "jVaMaA==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL\r\n" "MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp\r\n" "IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi\r\n" "BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw\r\n" "MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\r\n" "d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig\r\n" "YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v\r\n" "dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/\r\n" "BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6\r\n" "papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E\r\n" "BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K\r\n" "DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3\r\n" "KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox\r\n" "XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB\r\n" "rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf\r\n" "Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw\r\n" "MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV\r\n" "BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa\r\n" "Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl\r\n" "LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u\r\n" "MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl\r\n" "ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz\r\n" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm\r\n" "gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8\r\n" "YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf\r\n" "b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9\r\n" "9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S\r\n" "zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk\r\n" "OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\r\n" "HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA\r\n" "2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW\r\n" "oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\r\n" "t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c\r\n" "KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM\r\n" "m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu\r\n" "MdRAGmI0Nj81Aa6sY6A=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU\r\n" "MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs\r\n" "IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290\r\n" "MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux\r\n" "FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h\r\n" "bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v\r\n" "dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt\r\n" "H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9\r\n" "uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX\r\n" "mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX\r\n" "a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN\r\n" "E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0\r\n" "WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD\r\n" "VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0\r\n" "Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU\r\n" "cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx\r\n" "IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN\r\n" "AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH\r\n" "YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\r\n" "6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC\r\n" "Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX\r\n" "c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a\r\n" "mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb\r\n" "MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow\r\n" "GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj\r\n" "YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL\r\n" "MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE\r\n" "BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM\r\n" "GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\r\n" "ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua\r\n" "BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe\r\n" "3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4\r\n" "YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR\r\n" "rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm\r\n" "ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU\r\n" "oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\r\n" "MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v\r\n" "QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t\r\n" "b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF\r\n" "AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q\r\n" "GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\r\n" "Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2\r\n" "G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi\r\n" "l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3\r\n" "smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB\r\n" "lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug\r\n" "Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho\r\n" "dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt\r\n" "SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG\r\n" "A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe\r\n" "MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v\r\n" "d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh\r\n" "cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn\r\n" "0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ\r\n" "M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a\r\n" "MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd\r\n" "oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI\r\n" "DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy\r\n" "oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD\r\n" "VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0\r\n" "dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy\r\n" "bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF\r\n" "BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM\r\n" "//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli\r\n" "CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE\r\n" "CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t\r\n" "3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS\r\n" "KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\r\n" "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\r\n" "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\r\n" "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\r\n" "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\r\n" "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\r\n" "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\r\n" "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\r\n" "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\r\n" "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\r\n" "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\r\n" "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\r\n" "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\r\n" "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\r\n" "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\r\n" "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\r\n" "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\r\n" "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\r\n" "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc\r\n" "MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj\r\n" "IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB\r\n" "IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE\r\n" "RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl\r\n" "U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290\r\n" "IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU\r\n" "ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC\r\n" "QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr\r\n" "rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S\r\n" "NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc\r\n" "QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH\r\n" "txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP\r\n" "BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC\r\n" "AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp\r\n" "tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa\r\n" "IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl\r\n" "6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+\r\n" "xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\r\n" "Cm26OWMohpLzGITY+9HPBVZkVw==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx\r\n" "KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd\r\n" "BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl\r\n" "YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1\r\n" "OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy\r\n" "aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50\r\n" "ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G\r\n" "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd\r\n" "AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC\r\n" "FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi\r\n" "1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq\r\n" "jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ\r\n" "wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj\r\n" "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/\r\n" "WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy\r\n" "NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC\r\n" "uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw\r\n" "IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6\r\n" "g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN\r\n" "9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP\r\n" "BSeOE6Fuwg==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx\r\n" "KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd\r\n" "BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl\r\n" "YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1\r\n" "OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy\r\n" "aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50\r\n" "ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G\r\n" "CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN\r\n" "8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/\r\n" "RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4\r\n" "hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5\r\n" "ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM\r\n" "EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj\r\n" "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1\r\n" "A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy\r\n" "WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ\r\n" "1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30\r\n" "6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT\r\n" "91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\r\n" "e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p\r\n" "TpPDpFQUWw==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV\r\n" "BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln\r\n" "biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF\r\n" "MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT\r\n" "d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\r\n" "CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8\r\n" "76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+\r\n" "bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c\r\n" "6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE\r\n" "emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd\r\n" "MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt\r\n" "MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y\r\n" "MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y\r\n" "FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi\r\n" "aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM\r\n" "gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB\r\n" "qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7\r\n" "lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn\r\n" "8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\r\n" "L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6\r\n" "45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO\r\n" "UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5\r\n" "O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC\r\n" "bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv\r\n" "GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a\r\n" "77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC\r\n" "hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3\r\n" "92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp\r\n" "Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w\r\n" "ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt\r\n" "Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE\r\n" "BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu\r\n" "IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw\r\n" "WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD\r\n" "ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" "ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y\r\n" "IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn\r\n" "IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+\r\n" "6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob\r\n" "jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw\r\n" "izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl\r\n" "+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY\r\n" "zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP\r\n" "pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF\r\n" "KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW\r\n" "ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB\r\n" "AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O\r\n" "BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0\r\n" "ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW\r\n" "IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA\r\n" "A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0\r\n" "uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+\r\n" "FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7\r\n" "jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/\r\n" "u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D\r\n" "YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1\r\n" "puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa\r\n" "icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG\r\n" "DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x\r\n" "kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z\r\n" "Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE\r\n" "BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu\r\n" "IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow\r\n" "RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY\r\n" "U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\r\n" "MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv\r\n" "Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br\r\n" "YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF\r\n" "nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH\r\n" "6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt\r\n" "eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/\r\n" "c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ\r\n" "MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH\r\n" "HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf\r\n" "jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6\r\n" "5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB\r\n" "rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\r\n" "F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c\r\n" "wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\r\n" "cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB\r\n" "AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp\r\n" "WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9\r\n" "xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ\r\n" "2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ\r\n" "IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8\r\n" "aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X\r\n" "em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR\r\n" "dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/\r\n" "OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+\r\n" "hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy\r\n" "tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/\r\n" "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\r\n" "DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow\r\n" "PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD\r\n" "Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\r\n" "AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O\r\n" "rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq\r\n" "OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b\r\n" "xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw\r\n" "7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD\r\n" "aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\r\n" "HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG\r\n" "SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69\r\n" "ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr\r\n" "AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz\r\n" "R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5\r\n" "JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo\r\n" "Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\r\n" "-----END CERTIFICATE-----\r\n" "-----BEGIN CERTIFICATE-----\r\n" "MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG\r\n" "EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3\r\n" "MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl\r\n" "cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR\r\n" "dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB\r\n" "pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM\r\n" "b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm\r\n" "aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz\r\n" "IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\r\n" "MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT\r\n" "lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz\r\n" "AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5\r\n" "VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG\r\n" "ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2\r\n" "BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG\r\n" "AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M\r\n" "U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh\r\n" "bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C\r\n" "+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\r\n" "bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F\r\n" "uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2\r\n" "XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\r\n" "-----END CERTIFICATE-----\r\n" " " }; size_t ca_crt_rsa_size = sizeof(ca_crt_rsa); //#define ca_crt_rsa_size 70369 fldigi-4.2.05/src/network/xmlrpc.cxx0000664000175000017500000034006314611711171014302 00000000000000// ---------------------------------------------------------------------------- // xmlrpc.cxx // // Copyright (C) 2008-2010 // Stelios Bounanos, M0GLD // Copyright (C) 2008-2010 // Dave Freese, W1HKJ // Copyright (C) 2013 // Remi Chateauneu, F4ECW // // See EOF for a list of method names. Run "fldigi --xmlrpc-list" // to see a list of method names, signatures and descriptions. // // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include "xmlrpc.h" #include #include #include #include #include #include #include #include #include #include "threads.h" struct XmlRpcImpl; #include "globals.h" #include "configuration.h" #ifdef HAVE_VALUES_H # include #endif #include "modem.h" #include "trx.h" #include "fl_digi.h" #include "configuration.h" #include "main.h" #include "waterfall.h" #include "macros.h" #include "qrunner.h" #include "wefax.h" #include "wefax-pic.h" #include "navtex.h" #include "ascii.h" #if USE_HAMLIB #include "hamlib.h" #endif #include "rigio.h" #include "debug.h" #include "re.h" #include "pskrep.h" // required for flrig support #include "fl_digi.h" #include "rigsupport.h" #include "confdialog.h" #include "arq_io.h" #include "status.h" LOG_FILE_SOURCE(debug::LOG_RPC_SERVER); using namespace XmlRpc; /// Not defined the usual way on Mingw #ifndef DBL_MAX #define DBL_MAX 1.7976931348623157e+308 #endif namespace xmlrpc_c { struct method { const char * _signature ; const char * _help ; virtual std::string help(void) const { return _help;} const char * signature() const { return _signature; } virtual ~method() {} }; typedef method * methodPtr ; typedef XmlRpcValue value ; typedef XmlRpcValue value_string ; typedef XmlRpcValue value_bytestring ; typedef XmlRpcValue value_struct ; typedef XmlRpcValue value_nil ; typedef XmlRpcValue value_array ; typedef XmlRpcValue value_double ; typedef XmlRpcValue value_int ; typedef XmlRpcValue value_boolean ; struct fault : public std::runtime_error { typedef enum { CODE_INTERNAL } Codes; fault( const char * msg, Codes cd = CODE_INTERNAL ) : std::runtime_error(msg) {} }; struct paramList { const XmlRpcValue & _params ; paramList( const XmlRpcValue & prm ) : _params(prm) {} int getInt(int i, int mini = INT_MIN, int maxi = INT_MAX ) const { int tmp = _params[i]; if( tmp < mini ) tmp = mini ; else if(tmp > maxi) tmp = maxi ; return tmp ; } std::string getString(int i) const { return _params[i]; } std::vector getBytestring(int i) const { return _params[i]; } double getDouble(int i, double mini = -DBL_MAX, double maxi = DBL_MAX) const { double tmp = _params[i]; if( tmp < mini ) tmp = mini ; else if(tmp > maxi) tmp = maxi ; return tmp ; } bool getBoolean(int i) const { return _params[i]; } const std::vector & getArray(int i) const { return _params[i]; } void verifyEnd(size_t sz) const { const std::vector & tmpRef = _params ; if( sz != tmpRef.size() ) throw std::runtime_error("Bad size"); } }; } template< class RPC_METHOD > struct Method : public RPC_METHOD, public XmlRpcServerMethod { Method( const char * n ) : XmlRpcServerMethod( n ) {} void execute (XmlRpcValue ¶ms, XmlRpcValue &result) { xmlrpc_c::paramList params2(params) ; RPC_METHOD::execute( params2, &result ); } }; typedef XmlRpcServerMethod * (*RpcFactory)( const char * ); template struct RpcBuilder { static XmlRpcServerMethod * factory( const char * name ) { return new Method< RPC_METHOD >( name ); } }; struct XmlRpcImpl : public XmlRpcServer { void fl_open(const char * port) { bindAndListen( atoi( port ) ); enableIntrospection(true); } void run() { double milli_secs = -1.0 ; // Tell our server to wait indefinately for messages work(milli_secs); } /// BEWARE IT IS CALLED FROM ANOTHER THREAD. void close() { exit(); shutdown(); } }; struct rpc_method { RpcFactory m_fact ; ~rpc_method() { delete method ; } xmlrpc_c::method * method ; const char* name; }; typedef std::list methods_t; static methods_t* methods = 0; pthread_t* server_thread; pthread_mutex_t* server_mutex; XML_RPC_Server* XML_RPC_Server::inst = 0; XML_RPC_Server::XML_RPC_Server() { server_impl = new XmlRpcImpl; add_methods(); for( methods_t::iterator it = methods->begin(), en = methods->end(); it != en; ++it ) { XmlRpcServerMethod * mth = dynamic_cast< XmlRpcServerMethod * >( it->method ); server_impl->addMethod( mth ); } server_thread = new pthread_t; server_mutex = new pthread_mutex_t; pthread_mutex_init(server_mutex, NULL); // run = true; } XML_RPC_Server::~XML_RPC_Server() { // run = false; // the xmlrpc server is closed and deleted when // XML_RPC_Server::stop(); // is called from main // delete methods; } void XML_RPC_Server::start(const char* node, const char* service) { if (inst) return; inst = new XML_RPC_Server; try { inst->server_impl->fl_open(service); if (pthread_create(server_thread, NULL, thread_func, NULL) != 0) throw std::runtime_error(strerror(errno)); } catch (const std::exception& e) { LOG_ERROR("Could not start XML-RPC server (%s)", e.what()); delete server_thread; server_thread = 0; delete inst; inst = 0; return; } } /// BEWARE IT IS CALLED FROM ANOTHER THREAD. void XML_RPC_Server::stop(void) { // FIXME: uncomment when we have an xmlrpc server that can be interrupted // if (!inst) // return; inst->server_impl->close(); delete inst; inst = 0; } void* XML_RPC_Server::thread_func(void*) { SET_THREAD_ID(XMLRPC_TID); save_signals(); inst->server_impl->run(); restore_signals(); SET_THREAD_CANCEL(); return NULL; } std::ostream& XML_RPC_Server::list_methods(std::ostream& out) { add_methods(); std::ios_base::fmtflags f = out.flags(std::ios::left); for (methods_t::const_iterator i = methods->begin(); i != methods->end(); ++i) out << std::setw(32) << i->name << std::setw(8) << i->method->signature() << i->method->help() << '\n'; return out << std::setiosflags(f); } // ============================================================================= // Methods that change the server state must call XMLRPC_LOCK // guard_lock (include/threads.h) ensures that mutex are always unlocked. #define XMLRPC_LOCK SET_THREAD_ID(XMLRPC_TID); guard_lock autolock_(server_mutex) // ============================================================================= // generic helper functions static void set_button(Fl_Button* button, bool value) { button->value(value); button->do_callback(); } static void set_valuator(Fl_Valuator* valuator, double value) { valuator->value(value); valuator->do_callback(); } static void set_text(Fl_Input* textw, std::string& value) { textw->value(value.c_str()); textw->do_callback(); } static void set_text2(Fl_Input2* textw, std::string& value) { textw->value(value.c_str()); textw->do_callback(); } static void set_combo_contents(Fl_ComboBox* box, const std::vector* items) { box->clear(); if (items->empty()) { box->add(""); box->index(0); box->deactivate(); return; } for (std::vector::const_iterator i = items->begin(); i != items->end(); ++i) { box->add(i->c_str()); } box->index(0); box->activate(); } static void set_combo_value(Fl_ComboBox* box, const std::string& s) { box->value(s.c_str()); box->do_callback(); } static void get_combo_contents(Fl_ComboBox* box, std::vector* items) { int n = box->lsize(), p = box->index(); items->reserve(n); for (int i = 0; i < n; i++) { box->index(i); items->push_back(xmlrpc_c::value_string(box->value())); } box->index(p); } // ============================================================================= // XML-RPC interface definition // ============================================================================= class Fldigi_list : public xmlrpc_c::method { public: Fldigi_list() { _signature = "A:n"; _help = "Returns the list of methods."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::vector help; for (methods_t::const_iterator i = methods->begin(); i != methods->end(); ++i) { std::map item; item["name"] = xmlrpc_c::value_string(i->name); item["signature"] = xmlrpc_c::value_string(i->method->signature()); item["help"] = xmlrpc_c::value_string(i->method->help()); help.push_back(xmlrpc_c::value_struct(item)); } *retval = xmlrpc_c::value_array(help); } }; class Fldigi_name : public xmlrpc_c::method { public: Fldigi_name() { _signature = "s:n"; _help = "Returns the program name."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { *retval = xmlrpc_c::value_string(PACKAGE_TARNAME); } }; class Fldigi_version_struct : public xmlrpc_c::method { public: Fldigi_version_struct() { _signature = "S:n"; _help = "Returns the program version as a struct."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::map vstruct; vstruct["major"] = xmlrpc_c::value_int(FLDIGI_VERSION_MAJOR); vstruct["minor"] = xmlrpc_c::value_int(FLDIGI_VERSION_MINOR); vstruct["patch"] = xmlrpc_c::value_string(FLDIGI_VERSION_PATCH); *retval = xmlrpc_c::value_struct(vstruct); } }; class Fldigi_version_string : public xmlrpc_c::method { public: Fldigi_version_string() { _signature = "s:n"; _help = "Returns the program version as a string."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] fldigi.version_string: %s", XmlRpc::client_id.c_str(), PACKAGE_VERSION); *retval = xmlrpc_c::value_string(PACKAGE_VERSION); } }; class Fldigi_name_version : public xmlrpc_c::method { public: Fldigi_name_version() { _signature = "s:n"; _help = "Returns the program name and version."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] fldigi.name_version: %s", XmlRpc::client_id.c_str(), PACKAGE_STRING); *retval = xmlrpc_c::value_string(PACKAGE_STRING); } }; class Fldigi_config_dir : public xmlrpc_c::method { public: Fldigi_config_dir() { _signature = "s:n"; _help = "Returns the name of the configuration directory."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] fldigi.config_dir %s", XmlRpc::client_id.c_str(), HomeDir.c_str()); *retval = xmlrpc_c::value_string(HomeDir); } }; class Fldigi_terminate : public xmlrpc_c::method { public: Fldigi_terminate() { _signature = "n:i"; _help = "Terminates fldigi. ``i'' is bitmask specifying data to save: 0=options; 1=log; 2=macros."; } enum { TERM_SAVE_OPTIONS = 1 << 0, TERM_SAVE_LOG = 1 << 1, TERM_SAVE_MACROS = 1 << 2 }; static void terminate(int how) { if (how & TERM_SAVE_OPTIONS) progdefaults.saveDefaults(); progdefaults.changed = false; progdefaults.confirmExit = false; extern bool oktoclear; if (how & TERM_SAVE_LOG && !oktoclear) qsoSave->do_callback(); oktoclear = true; progdefaults.NagMe = false; if (how & TERM_SAVE_MACROS && macros.changed) macros.saveMacroFile(); macros.changed = false; fl_digi_main->do_callback(); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] fldigi.terminate: %d", XmlRpc::client_id.c_str(), int(params.getInt(0))); REQ(terminate, params.getInt(0)); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class Modem_get_name : public xmlrpc_c::method { public: Modem_get_name() { _signature = "s:n"; _help = "Returns the name of the current modem."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { const char* cur = mode_info[active_modem->get_mode()].sname; LOG_INFO("[%s] modem.get_name: %s", XmlRpc::client_id.c_str(), cur); *retval = xmlrpc_c::value_string(cur); } }; class Modem_get_mode : public xmlrpc_c::method { public: Modem_get_mode() { _signature = "s:n"; _help = "Returns the ADIF mode for the current modem."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::string adif_mode = mode_info[active_modem->get_mode()].export_mode; std::string adif_submode = mode_info[active_modem->get_mode()].export_submode; LOG_INFO("[%s] modem.get_mode: %s", XmlRpc::client_id.c_str(), adif_mode.c_str()); *retval = xmlrpc_c::value_string(adif_mode); } }; class Modem_get_submode : public xmlrpc_c::method { public: Modem_get_submode() { _signature = "s:n"; _help = "Returns the ADIF submode for the current modem."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::string adif_submode = mode_info[active_modem->get_mode()].export_submode; LOG_INFO("[%s] modem.get_mode: %s", XmlRpc::client_id.c_str(), adif_submode.c_str()); *retval = xmlrpc_c::value_string(adif_submode); } }; class Modem_get_io_names : public xmlrpc_c::method { public: Modem_get_io_names() { _signature = "A:n"; _help = "Returns all usable KISS, ARQ I/O modem names."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::vector names; names.reserve(NUM_MODES); std::string snames; for (size_t i = 0; i < NUM_MODES; i++) { if(mode_info[i].iface_io != DISABLED_IO) { names.push_back(xmlrpc_c::value_string(mode_info[i].sname)); snames.append("\n").append(mode_info[i].sname); } } LOG_INFO("[%s] modem.get_io_names: %s", XmlRpc::client_id.c_str(), snames.c_str()); *retval = xmlrpc_c::value_array(names); } }; class Modem_get_names : public xmlrpc_c::method { public: Modem_get_names() { _signature = "A:n"; _help = "Returns all modem names."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::vector names; names.reserve(NUM_MODES); std::string snames; for (size_t i = 0; i < NUM_MODES; i++) { names.push_back(xmlrpc_c::value_string(mode_info[i].sname)); snames.append("\n").append(mode_info[i].sname); } LOG_INFO("[%s] modem.get_names: %s", XmlRpc::client_id.c_str(), snames.c_str()); *retval = xmlrpc_c::value_array(names); } }; class Modem_get_id : public xmlrpc_c::method { public: Modem_get_id() { _signature = "i:n"; _help = "Returns the ID of the current modem."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int md = active_modem->get_mode(); LOG_INFO("[%s] modem.get_id %d", XmlRpc::client_id.c_str(), md); *retval = xmlrpc_c::value_int(md); } }; class Modem_get_max_id : public xmlrpc_c::method { public: Modem_get_max_id() { _signature = "i:n"; _help = "Returns the maximum modem ID number."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] modem.get_max_id: %d", XmlRpc::client_id.c_str(), NUM_MODES -1); *retval = xmlrpc_c::value_int(NUM_MODES - 1); } }; class Modem_set_by_name : public xmlrpc_c::method { public: Modem_set_by_name() { _signature = "s:s"; _help = "Sets the current modem. Returns old name."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; const char* cur = mode_info[active_modem->get_mode()].sname; std::string s = params.getString(0); LOG_INFO("[%s] modem.set_by_name: %s", XmlRpc::client_id.c_str(), s.c_str()); for (size_t i = 0; i < NUM_MODES; i++) { if (s == mode_info[i].sname) { REQ_SYNC(init_modem_sync, i, 0); *retval = xmlrpc_c::value_string(cur); return; } } *retval = "No such modem"; return; } }; class Modem_set_by_id : public xmlrpc_c::method { public: Modem_set_by_id() { _signature = "i:i"; _help = "Sets the current modem. Returns old ID."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int cur = active_modem->get_mode(); int i = params.getInt(0, 0, NUM_MODES-1); REQ_SYNC(init_modem_sync, i, 0); *retval = xmlrpc_c::value_int(cur); } }; // ============================================================================= class Modem_set_carrier : public xmlrpc_c::method { public: Modem_set_carrier() { _signature = "i:i"; _help = "Sets modem carrier. Returns old carrier."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int cur = active_modem->get_freq(); LOG_INFO("[%s] modem.set_carrier: %d", XmlRpc::client_id.c_str(), int(params.getInt(0,1))); active_modem->set_freq(params.getInt(0, 1)); *retval = xmlrpc_c::value_int(cur); } }; class Modem_inc_carrier : public xmlrpc_c::method { public: Modem_inc_carrier() { _signature = "i:i"; _help = "Increments the modem carrier frequency. Returns the new carrier."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int cur = active_modem->get_freq(); LOG_INFO("[%s] modem.inc_carrier: %d", XmlRpc::client_id.c_str(), int(params.getInt(0))); active_modem->set_freq(cur + params.getInt(0)); *retval = xmlrpc_c::value_int(active_modem->get_freq()); } }; class Modem_get_carrier : public xmlrpc_c::method { public: Modem_get_carrier() { _signature = "i:n"; _help = "Returns the modem carrier frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] modem.get_carrier: %d", XmlRpc::client_id.c_str(), int(active_modem->get_freq())); *retval = xmlrpc_c::value_int(active_modem->get_freq()); } }; // ============================================================================= class Modem_get_afc_sr : public xmlrpc_c::method { public: Modem_get_afc_sr() { _signature = "i:n"; _help = "Returns the modem AFC search range."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { if (!(active_modem->get_cap() & modem::CAP_AFC_SR)) { LOG_ERROR("[%s] modem.get_afc_sr: %s", XmlRpc::client_id.c_str(), "Operation not supported by modem"); *retval = "Operation not supported by modem"; } else { LOG_INFO("[%s] modem.get_afc_sr: %d", XmlRpc::client_id.c_str(), int(cntSearchRange->value())); *retval = xmlrpc_c::value_int((int)cntSearchRange->value()); } } }; class Modem_set_afc_sr : public xmlrpc_c::method { public: Modem_set_afc_sr() { _signature = "i:i"; _help = "Sets the modem AFC search range. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!(active_modem->get_cap() & modem::CAP_AFC_SR)) { LOG_DEBUG("[%s] modem.set_afc_sr %s", XmlRpc::client_id.c_str(), "Operation not supported by modem"); *retval = "Operation not supported by modem"; return; } int v = (int)(cntSearchRange->value()); LOG_INFO("[%s] modem.set_afc_sr: %d", XmlRpc::client_id.c_str(), v); REQ(set_valuator, cntSearchRange, params.getInt(0, (int)cntSearchRange->minimum(), (int)cntSearchRange->maximum())); *retval = xmlrpc_c::value_int(v); } }; class Modem_inc_afc_sr : public xmlrpc_c::method { public: Modem_inc_afc_sr() { _signature = "i:i"; _help = "Increments the modem AFC search range. Returns the new value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!(active_modem->get_cap() & modem::CAP_AFC_SR)) { LOG_DEBUG("[%s] modem.inc_afc_sr: %s", XmlRpc::client_id.c_str(), "Operation not supported by modem"); *retval = "Operation not supported by modem"; return; } int v = (int)(cntSearchRange->value() + params.getInt(0)); LOG_INFO("[%s] modem.inc_afc_sr: %d", XmlRpc::client_id.c_str(), v); REQ(set_valuator, cntSearchRange, v); *retval = xmlrpc_c::value_int(v); } }; // ============================================================================= static Fl_Valuator* get_bw_val(void) { if (!(active_modem->get_cap() & modem::CAP_BW)) return 0; trx_mode m = active_modem->get_mode(); if (m >= MODE_HELL_FIRST && m <= MODE_HELL_LAST) return sldrHellBW; else if (m == MODE_CW) return sldrCWbandwidth; return 0; } class Modem_get_bw : public xmlrpc_c::method { public: Modem_get_bw() { _signature = "i:n"; _help = "Returns the modem bandwidth."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { Fl_Valuator* val = get_bw_val(); LOG_INFO("[%s] modem.get_bw: %d", XmlRpc::client_id.c_str(), int(get_bw_val()->value())); if (val) *retval = xmlrpc_c::value_int((int)get_bw_val()->value()); else *retval = xmlrpc_c::value_int(0); } }; class Modem_set_bw : public xmlrpc_c::method { public: Modem_set_bw() { _signature = "i:i"; _help = "Sets the modem bandwidth. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; Fl_Valuator* val = get_bw_val(); if (val) { int v = (int)(val->value()); LOG_INFO("[%s] modem.set_bw: %d", XmlRpc::client_id.c_str(), v); REQ(set_valuator, val, params.getInt(0, (int)val->minimum(), (int)val->maximum())); *retval = xmlrpc_c::value_int(v); } else *retval = xmlrpc_c::value_int(0); } }; class Modem_inc_bw : public xmlrpc_c::method { public: Modem_inc_bw() { _signature = "i:i"; _help = "Increments the modem bandwidth. Returns the new value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; Fl_Valuator* val = get_bw_val(); if (val) { int v = (int)(val->value() + params.getInt(0)); LOG_INFO("[%s] modem.inc_bw: %d", XmlRpc::client_id.c_str(), v); REQ(set_valuator, val, v); *retval = xmlrpc_c::value_int(v); } else *retval = xmlrpc_c::value_int(0); } }; // ============================================================================= class Modem_get_quality : public xmlrpc_c::method { public: Modem_get_quality() { _signature = "d:n"; _help = "Returns the modem signal quality in the range [0:100]."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] modem.get_quality: %f", XmlRpc::client_id.c_str(), pgrsSquelch->value()); *retval = xmlrpc_c::value_double(pgrsSquelch->value()); } }; class Modem_search_up : public xmlrpc_c::method { public: Modem_search_up() { _signature = "n:n"; _help = "Searches upward in frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "modem.search_up"); REQ(&modem::searchUp, active_modem); *retval = xmlrpc_c::value_nil(); } }; class Modem_search_down : public xmlrpc_c::method { public: Modem_search_down() { _signature = "n:n"; _help = "Searches downward in frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "modem.search_down"); REQ(&modem::searchDown, active_modem); *retval = xmlrpc_c::value_nil(); } }; class Modem_olivia_set_bandwidth : public xmlrpc_c::method { public: Modem_olivia_set_bandwidth() { _signature = "n:i"; _help = "Sets the Olivia bandwidth."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int bw; switch (bw = params.getInt(0)) { case 125: case 250: case 500: case 1000: case 2000: { XMLRPC_LOCK; LOG_INFO("[%s] modem.olivia_set_bandwidth: %d", XmlRpc::client_id.c_str(), bw); REQ_SYNC(set_olivia_bw, bw); *retval = xmlrpc_c::value_nil(); } break; default: LOG_INFO("[%s] modem.olivia_set_bandiwidth: %s", XmlRpc::client_id.c_str(), "Invalid bandwidth"); *retval = "Invalid Olivia bandwidth"; } } }; class Modem_olivia_get_bandwidth : public xmlrpc_c::method { public: Modem_olivia_get_bandwidth() { _signature = "i:n"; _help = "Returns the Olivia bandwidth."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int bw, v = i_listbox_olivia_bandwidth->index() + 1; if (v == 0) bw = 125; else if (v == 1) bw = 250; else if (v == 2) bw = 500; else if (v == 3) bw = 1000; else bw = 2000; LOG_INFO("[%s] modem.olivia_get_bandwidth: %d", XmlRpc::client_id.c_str(), bw); *retval = xmlrpc_c::value_int(bw); } }; class Modem_olivia_set_tones : public xmlrpc_c::method { public: Modem_olivia_set_tones() { _signature = "n:i"; _help = "Sets the Olivia tones."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int tones = params.getInt(0, 2, 256); if (powerof2(tones)) { XMLRPC_LOCK; LOG_INFO("[%s] modem.olivia_set_tones: %d", XmlRpc::client_id.c_str(), tones); REQ_SYNC(set_olivia_tones, tones); *retval = xmlrpc_c::value_nil(); } else { LOG_INFO("[%s] modem.olivia_set_tones: %s", XmlRpc::client_id.c_str(), "Invalid olivia tones"); *retval = "Invalid Olivia tones"; } } }; class Modem_olivia_get_tones : public xmlrpc_c::method { public: Modem_olivia_get_tones() { _signature = "i:n"; _help = "Returns the Olivia tones."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] modem.olivia_get_tones: %d", XmlRpc::client_id.c_str(), int(1 << (i_listbox_olivia_tones->index() + 1))); *retval = xmlrpc_c::value_int(1 << (i_listbox_olivia_tones->index() + 1)); } }; // ============================================================================= class Main_get_status1 : public xmlrpc_c::method { public: Main_get_status1() { _signature = "s:n"; _help = "Returns the contents of the first status field (typically s/n)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_status1: %s", XmlRpc::client_id.c_str(), Status1->label()); *retval = xmlrpc_c::value_string(Status1->label()); } }; class Main_get_status2 : public xmlrpc_c::method { public: Main_get_status2() { _signature = "s:n"; _help = "Returns the contents of the second status field."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_status2: %s", XmlRpc::client_id.c_str(), Status2->label()); *retval = xmlrpc_c::value_string(Status2->label()); } }; class Main_get_sb : public xmlrpc_c::method { public: Main_get_sb() { _signature = "s:n"; _help = "[DEPRECATED; use main.get_wf_sideband and/or rig.get_mode]"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_sb (DEPRECATED): %s", XmlRpc::client_id.c_str(), wf->USB() ? "USB" : "LSB"); *retval = xmlrpc_c::value_string(wf->USB() ? "USB" : "LSB"); } }; class Main_set_sb : public xmlrpc_c::method { public: Main_set_sb() { _signature = "n:s"; _help = "[DEPRECATED; use main.set_wf_sideband and/or rig.set_mode]"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::string s = params.getString(0); if (s != "LSB" && s != "USB") { *retval = "Invalid argument"; return; } LOG_INFO("[%s] main.set_sb (DEPRECATED): %s", XmlRpc::client_id.c_str(), s.c_str()); REQ(static_cast(&waterfall::USB), wf, s == "USB"); *retval = xmlrpc_c::value_nil(); } }; class Main_get_wf_sideband : public xmlrpc_c::method { public: Main_get_wf_sideband() { _signature = "s:n"; _help = "Returns the current waterfall sideband."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_wf_sideband: %s", XmlRpc::client_id.c_str(), wf->USB() ? "USB" : "LSB"); *retval = xmlrpc_c::value_string(wf->USB() ? "USB" : "LSB"); } }; class Main_set_wf_sideband : public xmlrpc_c::method { public: Main_set_wf_sideband() { _signature = "n:s"; _help = "Sets the waterfall sideband to USB or LSB."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::string s = params.getString(0); if (s != "USB" && s != "LSB") *retval = "Invalid argument"; else REQ(static_cast(&waterfall::USB), wf, s == "USB"); LOG_INFO("[%s] main.set_wf_sideband %s", XmlRpc::client_id.c_str(), s.c_str()); *retval = xmlrpc_c::value_nil(); } }; void xmlrpc_set_qsy(unsigned long long rfc) { unsigned long long freq = rfc; wf->rfcarrier(freq); wf->movetocenter(); show_frequency(freq); } class Main_set_freq : public xmlrpc_c::method { public: Main_set_freq() { _signature = "d:d"; _help = "Sets the RF carrier frequency. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double rfc = (double) wf->rfcarrier(); LOG_INFO("[%s] main.set_freq: %lf", XmlRpc::client_id.c_str(), rfc); qsy((unsigned long long)params.getDouble(0, 0.0)); *retval = xmlrpc_c::value_double(rfc); } }; class Main_inc_freq : public xmlrpc_c::method { public: Main_inc_freq() { _signature = "d:d"; _help = "Increments the RF carrier frequency. Returns the new value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double rfc = (double) wf->rfcarrier() + params.getDouble(0); qsy((unsigned long long)rfc); LOG_INFO("[%s] main.inc_freq: %lf", XmlRpc::client_id.c_str(), rfc); *retval = xmlrpc_c::value_double(rfc); } }; // ============================================================================= class Main_get_afc : public xmlrpc_c::method { public: Main_get_afc() { _signature = "b:n"; _help = "Returns the AFC state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_afc: %s", XmlRpc::client_id.c_str(), (btnAFC->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnAFC->value()); } }; class Main_set_afc : public xmlrpc_c::method { public: Main_set_afc() { _signature = "b:b"; _help = "Sets the AFC state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnAFC->value(); LOG_INFO("[%s] main.set_afc: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, btnAFC, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_afc : public xmlrpc_c::method { public: Main_toggle_afc() { _signature = "b:n"; _help = "Toggles the AFC state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnAFC->value(); LOG_INFO("[%s] main.toggle_afc: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, btnAFC, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_sql : public xmlrpc_c::method { public: Main_get_sql() { _signature = "b:n"; _help = "Returns the squelch state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_sql: %s", XmlRpc::client_id.c_str(), (btnSQL->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnSQL->value()); } }; class Main_set_sql : public xmlrpc_c::method { public: Main_set_sql() { _signature = "b:b"; _help = "Sets the squelch state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnSQL->value(); LOG_INFO("[%s] main.set_sql: %s", XmlRpc::client_id.c_str(), (btnSQL->value() ? "ON" : "OFF")); REQ(set_button, btnSQL, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_sql : public xmlrpc_c::method { public: Main_toggle_sql() { _signature = "b:n"; _help = "Toggles the squelch state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnSQL->value(); LOG_INFO("[%s] main.toggle_sql: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, btnSQL, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_sql_level : public xmlrpc_c::method { public: Main_get_sql_level() { _signature = "d:n"; _help = "Returns the squelch level."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_sql_level: %f", XmlRpc::client_id.c_str(), sldrSquelch->value()); *retval = xmlrpc_c::value_double(sldrSquelch->value()); } }; class Main_set_sql_level : public xmlrpc_c::method { public: Main_set_sql_level() { _signature = "d:d"; _help = "Sets the squelch level. Returns the old level."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double v = sldrSquelch->value(); LOG_INFO("[%s] main.set_sql_level: %f", XmlRpc::client_id.c_str(), v); REQ(set_valuator, sldrSquelch, params.getDouble(0, sldrSquelch->maximum(), sldrSquelch->minimum())); *retval = xmlrpc_c::value_double(v); } }; class Main_inc_sql_level : public xmlrpc_c::method { public: Main_inc_sql_level() { _signature = "d:d"; _help = "Increments the squelch level. Returns the new level."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double v = sldrSquelch->value(); LOG_INFO("[%s] main.inc_sql_level: %f", XmlRpc::client_id.c_str(), v); REQ(set_valuator, sldrSquelch, v + params.getDouble(0)); // FIXME: check range *retval = xmlrpc_c::value_double(sldrSquelch->value()); } }; // ============================================================================= class Main_get_rev : public xmlrpc_c::method { public: Main_get_rev() { _signature = "b:n"; _help = "Returns the Reverse Sideband state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_rev: %s", XmlRpc::client_id.c_str(), (wf->btnRev->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(wf->btnRev->value()); } }; class Main_set_rev : public xmlrpc_c::method { public: Main_set_rev() { _signature = "b:b"; _help = "Sets the Reverse Sideband state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = wf->btnRev->value(); LOG_INFO("[%s] main.set_rev: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, wf->btnRev, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_rev : public xmlrpc_c::method { public: Main_toggle_rev() { _signature = "b:n"; _help = "Toggles the Reverse Sideband state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !wf->btnRev->value(); LOG_INFO("[%s] main.toggle_rev: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, wf->btnRev, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_lock : public xmlrpc_c::method { public: Main_get_lock() { _signature = "b:n"; _help = "Returns the Transmit Lock state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_lock: %s", XmlRpc::client_id.c_str(), (wf->xmtlock->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(wf->xmtlock->value()); } }; class Main_set_lock : public xmlrpc_c::method { public: Main_set_lock() { _signature = "b:b"; _help = "Sets the Transmit Lock state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = wf->xmtlock->value(); LOG_INFO("[%s] main.set_lock: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, wf->xmtlock, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_lock : public xmlrpc_c::method { public: Main_toggle_lock() { _signature = "b:n"; _help = "Toggles the Transmit Lock state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !wf->xmtlock->value(); LOG_INFO("[%s] main.toggle_lock: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, wf->xmtlock, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_txid : public xmlrpc_c::method { public: Main_get_txid() { _signature = "b:n"; _help = "Returns the TXID state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_txid: %s", XmlRpc::client_id.c_str(), (btnTxRSID->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnTxRSID->value()); } }; class Main_set_txid : public xmlrpc_c::method { public: Main_set_txid() { _signature = "b:b"; _help = "Sets the TXID state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnTxRSID->value(); LOG_INFO("[%s] main.set_txid: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, btnTxRSID, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_txid : public xmlrpc_c::method { public: Main_toggle_txid() { _signature = "b:n"; _help = "Toggles the TXID state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnTxRSID->value(); LOG_INFO("[%s] main.toggle_txid: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, btnTxRSID, v); *retval = xmlrpc_c::value_boolean(v); } }; class Main_get_rsid : public xmlrpc_c::method { public: Main_get_rsid() { _signature = "b:n"; _help = "Returns the RSID state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_rsid: %s", XmlRpc::client_id.c_str(), (btnRSID->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnRSID->value()); } }; class Main_set_rsid : public xmlrpc_c::method { public: Main_set_rsid() { _signature = "b:b"; _help = "Sets the RSID state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnRSID->value(); LOG_INFO("[%s] main.set_rsid: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, btnRSID, params.getBoolean(0)); *retval = xmlrpc_c::value_boolean(v); } }; class Main_toggle_rsid : public xmlrpc_c::method { public: Main_toggle_rsid() { _signature = "b:n"; _help = "Toggles the RSID state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnRSID->value(); LOG_INFO("[%s] main.toggle_rsid: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, btnRSID, v); *retval = xmlrpc_c::value_boolean(v); } }; // ============================================================================= class Main_get_trx_status : public xmlrpc_c::method { public: Main_get_trx_status() { _signature = "s:n"; _help = "Returns transmit/tune/receive status."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::string st; if (btnTune->value()) st = "tune"; else if (wf->xmtrcv->value()) st = "tx"; else st = "rx"; LOG_INFO("[%s] main.get_trx_status: %s", XmlRpc::client_id.c_str(), st.c_str()); *retval = xmlrpc_c::value_string(st.c_str()); } }; class Main_tx : public xmlrpc_c::method { public: Main_tx() { _signature = "n:n"; _help = "Transmits."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!wf->xmtrcv->value()) { LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "main.tx"); REQ(set_button, wf->xmtrcv, true); } *retval = xmlrpc_c::value_nil(); } }; class Main_tune : public xmlrpc_c::method { public: Main_tune() { _signature = "n:n"; _help = "Tunes."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!btnTune->value()) { LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "main.tune"); REQ(set_button, btnTune, !btnTune->value()); } *retval = xmlrpc_c::value_nil(); } }; class Main_rx : public xmlrpc_c::method { public: Main_rx() { _signature = "n:n"; _help = "Receives."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (wf->xmtrcv->value()) { LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "main.rx"); REQ(set_button, wf->xmtrcv, false); } *retval = xmlrpc_c::value_nil(); } }; class Main_abort : public xmlrpc_c::method { public: Main_abort() { _signature = "n:n"; _help = "Aborts a transmit or tune."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (trx_state == STATE_TX || trx_state == STATE_TUNE) { REQ(abort_tx); REQ(AbortARQ); } LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "main.abort"); *retval = xmlrpc_c::value_nil(); } }; class Main_rx_tx : public xmlrpc_c::method { public: Main_rx_tx() { _signature = "n:n"; _help = "Sets normal Rx/Tx switching."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (trx_state == STATE_TX || trx_state == STATE_TUNE) { REQ(abort_tx); REQ(AbortARQ); } LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "main.rx_tx"); REQ(set_rx_tx); *retval = xmlrpc_c::value_nil(); } }; class Main_rx_only : public xmlrpc_c::method { public: Main_rx_only() { _signature = "n:n"; _help = "Disables Tx."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (trx_state == STATE_TX || trx_state == STATE_TUNE) { REQ(abort_tx); REQ(AbortARQ); } LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "main.rx_only"); REQ(set_rx_only); *retval = xmlrpc_c::value_nil(); } }; //---------------------------------------------------------------------- // flmsg i/o //---------------------------------------------------------------------- bool flmsg_is_online = false; void flmsg_defeat(void *) { flmsg_is_online = false; } static void reset_flmsg() { flmsg_is_online = true; Fl::remove_timeout(flmsg_defeat); Fl::add_timeout(5.0, flmsg_defeat); } class flmsg_online : public xmlrpc_c::method { public: flmsg_online() { _signature = "n:n"; _help = "flmsg online indication"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; reset_flmsg(); LOG_INFO("[%s] main.flmsg_online: %s", XmlRpc::client_id.c_str(), "true"); } }; class flmsg_get_data : public xmlrpc_c::method { public: flmsg_get_data() { _signature = "6:n"; _help = "Returns all RX data received since last query."; } static void get_rx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_rx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_rx, &text, &size); std::vector bytes; if (size) { bytes.resize(size, 0); memcpy(&bytes[0], text, size); } reset_flmsg(); LOG_INFO("[%s] flmsg_get_data: %s", XmlRpc::client_id.c_str(), text); *retval = xmlrpc_c::value_bytestring(bytes); } }; std::string flmsg_data; class flmsg_available : public xmlrpc_c::method { public: flmsg_available() { _signature = "n:n"; _help = "flmsg data available"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int data_ready = (int)flmsg_data.size(); reset_flmsg(); LOG_INFO("[%s] main.flmsg_available: %d", XmlRpc::client_id.c_str(), data_ready); *retval = xmlrpc_c::value_int(data_ready); } }; class flmsg_transfer : public xmlrpc_c::method { public: flmsg_transfer() { _signature = "n:n"; _help = "data transfer to flmsg"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::string tempstr = flmsg_data; reset_flmsg(); LOG_INFO("[%s] main.flmsg_transfer:\n%s", XmlRpc::client_id.c_str(), tempstr.c_str()); *retval = xmlrpc_c::value_string(tempstr); flmsg_data.clear(); } }; class flmsg_squelch : public xmlrpc_c::method { public: flmsg_squelch() { _signature = "b:n"; _help = "Returns the squelch state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { reset_flmsg(); LOG_INFO("[%s] main.flmsg_squelch: %s", XmlRpc::client_id.c_str(), (active_modem->get_metric() > progStatus.sldrSquelchValue ? "ACTIVE" : "NOT ACTIVE")); *retval = xmlrpc_c::value_boolean(active_modem->get_metric() > progStatus.sldrSquelchValue); } }; //---------------------------------------------------------------------- // BACKWARD COMPATABILITY //---------------------------------------------------------------------- class Main_flmsg_online : public xmlrpc_c::method { public: Main_flmsg_online() { _signature = "n:n"; _help = "flmsg online indication"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; reset_flmsg(); LOG_INFO("[%s] main.flmsg_online: %s", XmlRpc::client_id.c_str(), "true"); } }; class Main_flmsg_available : public xmlrpc_c::method { public: Main_flmsg_available() { _signature = "n:n"; _help = "flmsg data available"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int data_ready = (int)flmsg_data.size(); reset_flmsg(); LOG_INFO("[%s] main.flmsg_available: %d", XmlRpc::client_id.c_str(), data_ready); *retval = xmlrpc_c::value_int(data_ready); } }; class Main_flmsg_transfer : public xmlrpc_c::method { public: Main_flmsg_transfer() { _signature = "n:n"; _help = "data transfer to flmsg"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::string tempstr = flmsg_data; reset_flmsg(); LOG_INFO("[%s] main.flmsg_transfer:\n%s", XmlRpc::client_id.c_str(), tempstr.c_str()); *retval = xmlrpc_c::value_string(tempstr); flmsg_data.clear(); } }; class Main_flmsg_squelch : public xmlrpc_c::method { public: Main_flmsg_squelch() { _signature = "b:n"; _help = "Returns the squelch state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { reset_flmsg(); LOG_INFO("[%s] main.flmsg_squelch: %s", XmlRpc::client_id.c_str(), (active_modem->get_metric() > progStatus.sldrSquelchValue ? "ACTIVE" : "NOT ACTIVE")); *retval = xmlrpc_c::value_boolean(active_modem->get_metric() > progStatus.sldrSquelchValue); } }; //---------------------------------------------------------------------- class Main_run_macro : public xmlrpc_c::method { public: Main_run_macro() { _signature = "n:i"; _help = "Runs a macro."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] main.run_macro: %d", XmlRpc::client_id.c_str(), int(params.getInt(0,0,MAXMACROS-1))); REQ(&Main_run_macro::run_macro, params.getInt(0, 0, MAXMACROS-1)); *retval = xmlrpc_c::value_nil(); } static void run_macro(int i) { macros.execute(i); } }; class Main_get_max_macro_id : public xmlrpc_c::method { public: Main_get_max_macro_id() { _signature = "i:n"; _help = "Returns the maximum macro ID number."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] main.get_max_macro_id: %d", XmlRpc::client_id.c_str(), MAXMACROS - 1); *retval = xmlrpc_c::value_int(MAXMACROS - 1); } }; class Main_rsid : public xmlrpc_c::method { public: Main_rsid() { _signature = "n:n"; _help = "[DEPRECATED; use main.{get,set,toggle}_rsid]"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; if (!(wf->xmtrcv->value() || btnTune->value() || btnRSID->value())) { LOG_INFO("[%s] main.rsid: %s", XmlRpc::client_id.c_str(), "ENABLE"); REQ(set_button, btnRSID, true); } *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= // classes added to support flrig // // dhf 6/23/09 class Main_get_trx_state : public xmlrpc_c::method { public: Main_get_trx_state() { _signature = "s:n"; _help = "Returns T/R state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::string st; if (trx_state == STATE_TX || trx_state == STATE_TUNE) st = "TX"; else if (trx_state == STATE_RX) st = "RX"; else st = "OTHER"; LOG_INFO("[%s] main.get_trx_state: %s", XmlRpc::client_id.c_str(), st.c_str()); *retval = xmlrpc_c::value_string(st.c_str()); } }; pthread_mutex_t tx_queue_mutex = PTHREAD_MUTEX_INITIALIZER; static std::string xmlchars; bool xmltest_char_available; static size_t pxmlchar = 0; static char xml_status_msg[50]; int xmltest_char() { guard_lock xmlchr_lock(&tx_queue_mutex); if (xmlchars.empty() || !xmltest_char_available) return -3; if (pxmlchar >= xmlchars.length() ) { xmlchars.clear(); pxmlchar = 0; xmltest_char_available = false; return -3; } snprintf(xml_status_msg, sizeof(xml_status_msg), "%d%% sent", static_cast(100*pxmlchar/xmlchars.length())); put_status(xml_status_msg, 1.0); return xmlchars[pxmlchar++] & 0xFF; } void reset_xmlchars() { xmlchars.clear(); pxmlchar = 0; xmltest_char_available = false; } int number_of_samples( std::string s) { active_modem->XMLRPC_CPS_TEST = true; xmlchars = s; pxmlchar = 0; xmltest_char_available = true; active_modem->set_stopflag(false); trx_transmit(); MilliSleep(10); while(trx_state != STATE_RX) { MilliSleep(10); Fl::awake(); } xmltest_char_available = false; active_modem->XMLRPC_CPS_TEST = false; return active_modem->tx_sample_count; } class Main_get_char_rates : public xmlrpc_c::method { public: Main_get_char_rates() { _signature = "s:n"; _help = "Returns table of char rates."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ) { *retval = xmlrpc_c::value_string("0:1:0"); return; } XMLRPC_LOCK; REQ(stopMacroTimer); int s0 = 0;//number_of_samples(""); int s1 = 0; std::string xmlbuf; static char result[100]; static std::string line; int chsamples = 0; int i = 0; for (int m = 0; m < 32; m++) { line.clear(); for (int n = 0; n < 8; n++) { i = m*8+n; if ( (id >= MODE_PSK31 && id <= MODE_PSK1000R) || (id >= MODE_4X_PSK63R && id <= MODE_2X_PSK1000R) || id == MODE_CW || id == MODE_RTTY ) { s1 = number_of_samples(std::string(1,i)); chsamples = active_modem->char_samples; } else { s0 = number_of_samples(std::string(1, i)); int j; for(j = 2; j < 32; j++) { s1 = number_of_samples(std::string(j, i)); if(s1 > s0) break; } chsamples = (s1 - s0) / (j-1); } snprintf(result, sizeof(result), n == 7 ? " %.8f\n" : n == 0 ? "%.8f," : " %.8f,", 1.0 * chsamples / active_modem->get_samplerate()); line.append(result); } xmlbuf.append(line); } LOG_INFO("[%s] main.get_char_rates:\n%s", XmlRpc::client_id.c_str(), xmlbuf.c_str()); *retval = xmlrpc_c::value_string(xmlbuf); } }; class Main_get_char_timing : public xmlrpc_c::method { public: Main_get_char_timing() { _signature = "n:i"; _help = "Input: value of character. Returns transmit duration for specified character (samples:sample rate)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 ) { *retval = xmlrpc_c::value_string("0:1:0"); return; } XMLRPC_LOCK; REQ(stopMacroTimer); std::vector bytes = params.getBytestring(0); bytes.push_back(0); std::string totest = (const char*)&bytes[0]; if (totest.empty() || !active_modem) { *retval = xmlrpc_c::value_string("0:1:0"); return; } static std::string xmlbuf; char result[64]; int character = 0; int count = sscanf(totest.c_str(), "%d", &character); if(count != 1) { *retval = xmlrpc_c::value_string("0:1:0"); return; } unsigned int s0 = 0, chsamples = 0, over_head = 0; int factor = 4; unsigned int min_char = 2; bool psk_8_flag = false; bool fast_flag = false; if((id >= MODE_8PSK_FIRST) && (id <= MODE_8PSK_LAST)) psk_8_flag = true; if (((id >= MODE_4X_PSK63R) && (id <= MODE_2X_PSK1000R)) || ((id >= MODE_PSK31) && (id <= MODE_PSK1000R)) || (id == MODE_CW) || (id == MODE_RTTY)) { if(psk_8_flag) fast_flag = false; else fast_flag = true; } if(((id >= MODE_THOR_FIRST) && (id <= MODE_THOR_LAST)) || ((id >= MODE_OLIVIA_FIRST) && (id <= MODE_OLIVIA_LAST))) { fast_flag = false; psk_8_flag = false; } if(fast_flag) { s0 = number_of_samples(std::string(1,character)); chsamples = active_modem->char_samples; over_head = active_modem->ovhd_samples; } else if(psk_8_flag) { // This doens't seem to work with the MFSK modes int n = 16; over_head = number_of_samples(""); chsamples = number_of_samples(std::string(n, character)) - over_head; chsamples /= n; } else { // This works for all of the remaining modes. unsigned int s1 = 0, s2 = 0; unsigned int temp = 0, no_of_chars = 1, k = 0; s0 = s1 = s2 = number_of_samples(std::string(no_of_chars, character)); for(int i = no_of_chars + 1; i < 32; i++) { s2 = number_of_samples(std::string(i, character)); if(s2 > s1 && temp++ > min_char) { break; } s0 = s2; no_of_chars++; } k = no_of_chars * factor; s1 = number_of_samples(std::string(k, character)); chsamples = (s1 - s0) / (k - no_of_chars); over_head = s1 - (chsamples * k); } snprintf(result, sizeof(result), "%5u:%6u:%6u", chsamples, active_modem->get_samplerate(), over_head); xmlbuf.assign(result); LOG_INFO("[%s] main.get_char_timing:\n%s", XmlRpc::client_id.c_str(), xmlbuf.c_str()); *retval = xmlrpc_c::value_string(xmlbuf); } }; class Main_get_tx_timing : public xmlrpc_c::method { public: Main_get_tx_timing() { _signature = "n:s"; _help = "Returns transmit duration for test string (samples:sample rate:secs)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { trx_mode id = active_modem->get_mode(); if ( id == MODE_SSB || id == MODE_WWV || id == MODE_ANALYSIS || id == MODE_WEFAX_576 || id == MODE_WEFAX_288 || id == MODE_SITORB || id == MODE_NAVTEX ) { *retval = xmlrpc_c::value_string("0:1:0.0"); return; } XMLRPC_LOCK; std::vector bytes = params.getBytestring(0); bytes.push_back(0); std::string totest = (const char*)&bytes[0]; if (totest.empty() || !active_modem) { *retval = xmlrpc_c::value_string("0:1:0.0"); return; } int chsamples = number_of_samples(totest);// - start_stop_samples; std::string xmlbuf; char buf[64]; memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf) - 1, "%u : %u : %.9f", \ chsamples, active_modem->tx_sample_rate, 1.0 * chsamples / active_modem->tx_sample_rate); xmlbuf.assign(buf); LOG_INFO("[%s] main.get_tx_timing:\n%s", XmlRpc::client_id.c_str(), xmlbuf.c_str()); *retval = xmlrpc_c::value_string(xmlbuf); } }; class Rig_set_name : public xmlrpc_c::method { public: Rig_set_name() { _signature = "n:s"; _help = "Sets the rig name for xmlrpc rig"; } static void set_rig_name(const std::string& name) { windowTitle = name; if (main_window_title.find(windowTitle) == std::string::npos) setTitle(); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] main.set_name: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_rig_name, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_get_name : public xmlrpc_c::method { public: Rig_get_name() { _signature = "s:n"; _help = "Returns the rig name previously set via rig.set_name"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] rig.get_name: %s", XmlRpc::client_id.c_str(), windowTitle.c_str()); *retval = xmlrpc_c::value_string(windowTitle); } }; class Rig_set_frequency : public xmlrpc_c::method { public: Rig_set_frequency() { _signature = "d:d"; _help = "Sets the RF carrier frequency. Returns the old value."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; double rfc = (double) wf->rfcarrier(); unsigned long long f = (unsigned long long)(params.getDouble(0,0.0)); char dummy[200]; snprintf(dummy, sizeof(dummy), "[%s] rig.set_frequency %llu", XmlRpc::client_id.c_str(), f); LOG_INFO("%s", dummy); qsy(f); *retval = xmlrpc_c::value_double(rfc); } }; class Rig_get_freq : public xmlrpc_c::method { public: Rig_get_freq() { _signature = "d:n"; _help = "Returns the RF carrier frequency."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { double rfc = (double) wf->rfcarrier(); LOG_INFO("[%s] rig.get_frequency %lf", XmlRpc::client_id.c_str(), rfc); *retval = xmlrpc_c::value_double(rfc); } }; class Rig_set_smeter : public xmlrpc_c::method { public: Rig_set_smeter() { _signature = "n:i"; _help = "Sets the smeter returns null."; } static void set_smeter(int rfc) { if (smeter && pwrmeter && progStatus.meters) { smeter->value(rfc); pwrmeter->hide(); smeter->show(); } } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] rig.set_smeter: %d", XmlRpc::client_id.c_str(), int(params.getInt(0))); REQ(set_smeter, params.getInt(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_pwrmeter : public xmlrpc_c::method { public: Rig_set_pwrmeter() { _signature = "n:i"; _help = "Sets the power meter returns null."; } static void set_pwrmeter(int val) { if (pwrmeter) { pwrmeter->value(val); if (pwrlevel_grp->visible()) return; if (progStatus.meters) { if (!pwrmeter->visible()) { if (smeter) smeter->hide(); pwrmeter->show(); } pwrmeter->redraw(); } } } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] rig.set_pwrmeter: %d", XmlRpc::client_id.c_str(), int(params.getInt(0))); REQ(set_pwrmeter, params.getInt(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_modes : public xmlrpc_c::method { public: Rig_set_modes() { _signature = "n:A"; _help = "Sets the list of available rig modes"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::vector v = params.getArray(0); std::vector modes; std::string smodes; modes.reserve(v.size()); // copy for (std::vector::const_iterator i = v.begin(); i != v.end(); ++i) { modes.push_back(static_cast(xmlrpc_c::value_string(*i))); smodes.append("\n").append(static_cast(xmlrpc_c::value_string(*i))); } LOG_INFO("[%s] rig.set_modes:%s", XmlRpc::client_id.c_str(), smodes.c_str()); REQ_SYNC(set_combo_contents, qso_opMODE, &modes); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_mode : public xmlrpc_c::method { public: Rig_set_mode() { _signature = "n:s"; _help = "Selects a mode previously added by rig.set_modes"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] rig_set_mode: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_combo_value, qso_opMODE, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_get_modes : public xmlrpc_c::method { public: Rig_get_modes() { _signature = "A:n"; _help = "Returns the list of available rig modes"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::vector modes; REQ_SYNC(get_combo_contents, qso_opMODE, &modes); std::string smodes; for (size_t n = 0; n < modes.size(); n++) smodes.append("\n").append(std::string(modes[n])); LOG_INFO("[%s] rig.get_modes:%s", XmlRpc::client_id.c_str(), smodes.c_str()); *retval = xmlrpc_c::value_array(modes); } }; class Rig_get_mode : public xmlrpc_c::method { public: Rig_get_mode() { _signature = "s:n"; _help = "Returns the name of the current transceiver mode"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] rig.get_mode: %s", XmlRpc::client_id.c_str(), qso_opMODE->value()); *retval = xmlrpc_c::value_string(qso_opMODE->value()); } }; class Rig_set_bandwidths : public xmlrpc_c::method { public: Rig_set_bandwidths() { _signature = "n:A"; _help = "Sets the list of available rig bandwidths"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::vector v = params.getArray(0); std::vector bws; std::string s_bws; bws.reserve(v.size()); for (std::vector::const_iterator i = v.begin(); i != v.end(); ++i) { bws.push_back(static_cast(xmlrpc_c::value_string(*i))); s_bws.append("\n").append(static_cast(xmlrpc_c::value_string(*i))); } LOG_INFO("[%s] rig.set_bandwidths:%s", XmlRpc::client_id.c_str(), s_bws.c_str()); REQ_SYNC(set_combo_contents, qso_opBW, &bws); *retval = xmlrpc_c::value_nil(); } }; class Rig_set_bandwidth : public xmlrpc_c::method { public: Rig_set_bandwidth() { _signature = "n:s"; _help = "Selects a bandwidth previously added by rig.set_bandwidths"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] rig.set_bandwidth: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_combo_value, qso_opBW, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Rig_get_bandwidths : public xmlrpc_c::method { public: Rig_get_bandwidths() { _signature = "A:n"; _help = "Returns the list of available rig bandwidths"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::vector bws; REQ_SYNC(get_combo_contents, qso_opBW, &bws); std::string sbws; for (size_t n = 0; n < bws.size(); n++) sbws.append("\n").append(std::string(bws[n])); LOG_INFO("[%s] rig.get_bandwidths:%s", XmlRpc::client_id.c_str(), sbws.c_str()); *retval = xmlrpc_c::value_array(bws); } }; class Rig_get_bandwidth : public xmlrpc_c::method { public: Rig_get_bandwidth() { _signature = "s:n"; _help = "Returns the name of the current transceiver bandwidth"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] rig.get_bandwidth: %s", XmlRpc::client_id.c_str(), std::string(qso_opBW->value()).c_str()); *retval = xmlrpc_c::value_string(qso_opBW->value()); } }; class Rig_get_notch : public xmlrpc_c::method { public: Rig_get_notch() { _signature = "s:n"; _help = "Reports a notch filter frequency based on WF action"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] rig.get_notch: %d", XmlRpc::client_id.c_str(), notch_frequency); *retval = xmlrpc_c::value_int(notch_frequency); } }; class Rig_set_notch : public xmlrpc_c::method { public: Rig_set_notch() { _signature = "n:i"; _help = "Sets the notch filter position on WF"; } static void set_notch(int freq) { notch_frequency = freq; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; int notch = notch_frequency; REQ(set_notch, params.getInt(0)); LOG_INFO("[%s] rig.set_notch: %d", XmlRpc::client_id.c_str(), notch); *retval = xmlrpc_c::value_int(notch); } }; class Rig_enable_qsy : public xmlrpc_c::method { public: Rig_enable_qsy() { _signature = "n:i"; _help = "Enable/disable (1/0) QSY for xmlrpc transceiver control"; } static void enable_qsy(int on) { if (!wf) return; wf->setQSY(on); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(enable_qsy, params.getInt(0)); *retval = xmlrpc_c::value_int(params.getInt(0)); } }; // ============================================================================= class Main_set_rig_name : public Rig_set_name { public: Main_set_rig_name() { _help = "[DEPRECATED; use rig.set_name]"; } }; class Main_set_rig_frequency : public Rig_set_frequency { public: Main_set_rig_frequency() { _help = "[DEPRECATED; use rig.set_frequency]"; } }; class Main_set_rig_modes : public Rig_set_modes { public: Main_set_rig_modes() { _help = "[DEPRECATED; use rig.set_modes"; } }; class Main_set_rig_mode : public Rig_set_mode { public: Main_set_rig_mode() { _help = "[DEPRECATED; use rig.set_mode"; } }; class Main_get_freq : public Rig_get_freq { public: Main_get_freq() {_help = "[DEPRECATED; use rig.get_frequency"; } }; class Main_get_rig_modes : public Rig_get_modes { public: Main_get_rig_modes() { _help = "[DEPRECATED; use rig.get_modes]"; } }; class Main_get_rig_mode : public Rig_get_mode { public: Main_get_rig_mode() { _help = "[DEPRECATED; use rig.get_mode]"; } }; class Main_set_rig_bandwidths : public Rig_set_bandwidths { public: Main_set_rig_bandwidths() { _help = "[DEPRECATED; use rig.set_bandwidths]"; } }; class Main_set_rig_bandwidth : public Rig_set_bandwidth { public: Main_set_rig_bandwidth() { _help = "[DEPRECATED; use rig.set_bandwidth]"; } }; class Main_get_rig_bandwidths : public Rig_set_bandwidths { public: Main_get_rig_bandwidths() { _help = "[DEPRECATED; use rig.get_bandwidths]"; } }; class Main_get_rig_bandwidth : public Rig_get_bandwidth { public: Main_get_rig_bandwidth() { _help = "[DEPRECATED; use rig.get_bandwidth]"; } }; // ============================================================================= class Log_get_freq : public xmlrpc_c::method { public: Log_get_freq() { _signature = "s:n"; _help = "Returns the Frequency field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_freq: %s", XmlRpc::client_id.c_str(), inpFreq->value()); *retval = xmlrpc_c::value_string(inpFreq->value()); } }; class Log_get_time_on : public xmlrpc_c::method { public: Log_get_time_on() { _signature = "s:n"; _help = "Returns the Time-On field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_time_on: %s", XmlRpc::client_id.c_str(), inpTimeOn->value()); *retval = xmlrpc_c::value_string(inpTimeOn->value()); } }; class Log_get_date_on : public xmlrpc_c::method { public: Log_get_date_on() { _signature = "s:n"; _help = "Returns the date associated with time_on field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_date_on: %s", XmlRpc::client_id.c_str(), sDate_on.c_str()); *retval = xmlrpc_c::value_string(sDate_on); } }; class Log_get_time_off : public xmlrpc_c::method { public: Log_get_time_off() { _signature = "s:n"; _help = "Returns the Time-Off field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_time_off: %s", XmlRpc::client_id.c_str(), inpTimeOff->value()); *retval = xmlrpc_c::value_string(inpTimeOff->value()); } }; class Log_get_date_off : public xmlrpc_c::method { public: Log_get_date_off() { _signature = "s:n"; _help = "Returns the date associated with time_off field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_date_on: %s", XmlRpc::client_id.c_str(), sDate_off.c_str()); *retval = xmlrpc_c::value_string(sDate_off); } }; class Log_get_call : public xmlrpc_c::method { public: Log_get_call() { _signature = "s:n"; _help = "Returns the Call field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_call: %s", XmlRpc::client_id.c_str(), inpCall->value()); *retval = xmlrpc_c::value_string(inpCall->value()); } }; class Log_set_call : public xmlrpc_c::method { public: Log_set_call() { _signature = "n:s"; _help = "Sets the Call field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] log.set_call: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_text, inpCall, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_name : public xmlrpc_c::method { public: Log_get_name() { _signature = "s:n"; _help = "Returns the Name field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_Name: %s", XmlRpc::client_id.c_str(), inpName->value()); *retval = xmlrpc_c::value_string(inpName->value()); } }; class Log_set_name : public xmlrpc_c::method { public: Log_set_name() { _signature = "n:s"; _help = "Sets the Name field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] log.set_name: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_text, inpName, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_set_qth : public xmlrpc_c::method { public: Log_set_qth() { _signature = "n:s"; _help = "Sets the QTH field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] log.set_qth: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_text, inpQth, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_set_locator : public xmlrpc_c::method { public: Log_set_locator() { _signature = "n:s"; _help = "Sets the Locator field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] log.set_locator: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_text, inpLoc, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_rst_in : public xmlrpc_c::method { public: Log_get_rst_in() { _signature = "s:n"; _help = "Returns the RST(r) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_rst_in: %s", XmlRpc::client_id.c_str(), inpRstIn->value()); *retval = xmlrpc_c::value_string(inpRstIn->value()); } }; class Log_set_rst_in : public xmlrpc_c::method { public: Log_set_rst_in() { _signature = "n:s"; _help = "Sets the RST(r) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] log.set_rst_in: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_text2, inpRstIn, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_rst_out : public xmlrpc_c::method { public: Log_get_rst_out() { _signature = "s:n"; _help = "Returns the RST(s) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_rst_out: %s", XmlRpc::client_id.c_str(), inpRstOut->value()); *retval = xmlrpc_c::value_string(inpRstOut->value()); } }; class Log_set_rst_out : public xmlrpc_c::method { public: Log_set_rst_out() { _signature = "n:s"; _help = "Sets the RST(s) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] log.set_rst_out: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_text2, inpRstOut, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_serial_number : public xmlrpc_c::method { public: Log_get_serial_number() { _signature = "s:n"; _help = "Returns the serial number field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_serial_number: %s", XmlRpc::client_id.c_str(), inpSerNo->value()); *retval = xmlrpc_c::value_string(inpSerNo->value()); } }; class Log_set_serial_number : public xmlrpc_c::method { public: Log_set_serial_number() { _signature = "n:s"; _help = "Sets the serial number field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] log.set_serial_number: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_text, inpSerNo, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_serial_number_sent : public xmlrpc_c::method { public: Log_get_serial_number_sent() { _signature = "s:n"; _help = "Returns the serial number (sent) field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_serial_number_sent: %s", XmlRpc::client_id.c_str(), outSerNo->value()); *retval = xmlrpc_c::value_string(outSerNo->value()); } }; extern Fl_Value_Input2 *nbrContestStart; int contest_start_number = 0; static void set_contest_counter() { nbrContestStart->value(contest_start_number); progdefaults.ContestStart = contest_start_number; cb_ResetSerNbr(); progdefaults.changed = true; } class Log_set_contest_counter : public xmlrpc_c::method { public: Log_set_contest_counter() { _signature = "n:s"; _help = "Sets the starting contest number field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::string snbr = std::string(params.getString(0)); LOG_INFO("[%s] log.set_counter_counter: %s", XmlRpc::client_id.c_str(), snbr.c_str()); contest_start_number = atol( snbr.c_str() ); REQ(set_contest_counter); *retval = xmlrpc_c::value_nil(); } }; class Log_get_exchange : public xmlrpc_c::method { public: Log_get_exchange() { _signature = "s:n"; _help = "Returns the contest exchange field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_exchange: %s", XmlRpc::client_id.c_str(), inpXchgIn->value()); *retval = xmlrpc_c::value_string(inpXchgIn->value()); } }; class Log_set_exchange : public xmlrpc_c::method { public: Log_set_exchange() { _signature = "n:s"; _help = "Sets the contest exchange field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] log.set_exchange: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ(set_text, inpXchgIn, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Log_get_state : public xmlrpc_c::method { public: Log_get_state() { _signature = "s:n"; _help = "Returns the State field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_state: %s", XmlRpc::client_id.c_str(), inpState->value()); *retval = xmlrpc_c::value_string(inpState->value()); } }; class Log_get_province : public xmlrpc_c::method { public: Log_get_province() { _signature = "s:n"; _help = "Returns the Province field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_province: %s", XmlRpc::client_id.c_str(), inpVEprov->value()); *retval = xmlrpc_c::value_string(inpVEprov->value()); } }; class Log_get_country : public xmlrpc_c::method { public: Log_get_country() { _signature = "s:n"; _help = "Returns the Country field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_country: %s", XmlRpc::client_id.c_str(), cboCountry->value()); *retval = xmlrpc_c::value_string(cboCountry->value()); } }; class Log_get_qth : public xmlrpc_c::method { public: Log_get_qth() { _signature = "s:n"; _help = "Returns the QTH field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_qth: %s", XmlRpc::client_id.c_str(), inpQTH->value()); *retval = xmlrpc_c::value_string(inpQth->value()); } }; class Log_get_band : public xmlrpc_c::method { public: Log_get_band() { _signature = "s:n"; _help = "Returns the current band name."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_band: %s", XmlRpc::client_id.c_str(), band_name(band(wf->rfcarrier()))); *retval = xmlrpc_c::value_string(band_name(band(wf->rfcarrier()))); } }; class Log_get_sb : public Main_get_wf_sideband { public: Log_get_sb() { _help = "[DEPRECATED; use main.get_wf_sideband]"; } }; class Log_get_notes : public xmlrpc_c::method { public: Log_get_notes() { _signature = "s:n"; _help = "Returns the Notes field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_notes: %s", XmlRpc::client_id.c_str(), inpNotes->value()); *retval = xmlrpc_c::value_string(inpNotes->value()); } }; class Log_get_locator : public xmlrpc_c::method { public: Log_get_locator() { _signature = "s:n"; _help = "Returns the Locator field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_locator: %s", XmlRpc::client_id.c_str(), inpLoc->value()); *retval = xmlrpc_c::value_string(inpLoc->value()); } }; class Log_get_az : public xmlrpc_c::method { public: Log_get_az() { _signature = "s:n"; _help = "Returns the AZ field contents."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] log.get_az: %s", XmlRpc::client_id.c_str(), inpAZ->value()); *retval = xmlrpc_c::value_string(inpAZ->value()); } }; class Logbook_last_record: public xmlrpc_c::method{ public: Logbook_last_record() { _signature = "s:n"; _help = "Returns the ADIF record of the last logbook record."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::string adif_str = last_adif_record(); LOG_INFO("[%s] logbook.last_record: %s", XmlRpc::client_id.c_str(), last_adif_record().c_str()); *retval = xmlrpc_c::value_string(adif_str); } }; class Logbook_all_records: public xmlrpc_c::method{ public: Logbook_all_records() { _signature = "s:n"; _help = "Returns the entire ADIF logbook currently opened."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::string adif_str = all_adif_records(); #ifdef __WIN32__ LOG_INFO("[%s] logbook.all_adif_records export size %u", #else LOG_INFO("[%s] logbook.all_adif_records export size %lu", #endif XmlRpc::client_id.c_str(), adif_str.length()); *retval = xmlrpc_c::value_string(adif_str); } }; class Log_clear : public xmlrpc_c::method { public: Log_clear() { _signature = "n:n"; _help = "Clears the contents of the log fields."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "log.clear"); REQ(clearQSO); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class Io_in_use : public xmlrpc_c::method { public: Io_in_use() { _signature = "s:n"; _help = "Returns the IO port in use (ARQ/KISS)."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { std::string s; if(data_io_enabled == KISS_IO) s = "KISS"; else if(data_io_enabled == ARQ_IO) s = "ARQ"; else s = ""; LOG_INFO("[%s] Io.in_use: %s", XmlRpc::client_id.c_str(), s.c_str()); *retval = xmlrpc_c::value_string(s.c_str()); } }; class Io_enable_kiss : public xmlrpc_c::method { public: Io_enable_kiss() { _signature = "n:n"; _help = "Switch to KISS I/O"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "Io.enable_kiss"); REQ(enable_kiss); *retval = xmlrpc_c::value_nil(); } }; class Io_enable_arq : public xmlrpc_c::method { public: Io_enable_arq() { _signature = "n:n"; _help = "Switch to ARQ I/O"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "Io.enable_arq"); REQ(enable_arq); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class Text_get_rx_length : public xmlrpc_c::method { public: Text_get_rx_length() { _signature = "i:n"; _help = "Returns the number of characters in the RX widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] Text.get_rx_length: %d", XmlRpc::client_id.c_str(), (int)(ReceiveText->buffer()->length())); *retval = xmlrpc_c::value_int(ReceiveText->buffer()->length()); } }; class Text_get_rx : public xmlrpc_c::method { public: Text_get_rx() { _signature = "6:ii"; _help = "Returns a range of characters (start, length) from the RX text widget."; } static void get_rx_text_range(const xmlrpc_c::paramList* params, xmlrpc_c::fault** err, char** text, int* size) { // the get* methods may throw but this function is not allowed to do so try { params->verifyEnd(2); Fl_Text_Buffer_mod* tbuf = ReceiveText->buffer(); int len = tbuf->length(); int start = params->getInt(0, 0, len - 1); int n = params->getInt(1, -1, len - start); if (n == -1) n = len; // we can request more text than is available *text = tbuf->text_range(start, start + n); *size = n; } catch (const xmlrpc_c::fault& f) { *err = new xmlrpc_c::fault(f); } catch (const std::exception& e) { *err = new xmlrpc_c::fault(e.what(), xmlrpc_c::fault::CODE_INTERNAL); } } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; xmlrpc_c::fault* err = NULL; char* text; int size; REQ_SYNC(get_rx_text_range, ¶ms, &err, &text, &size); if (unlikely(err)) { xmlrpc_c::fault f(*err); delete err; throw f; } std::vector bytes; if (size) { bytes.resize(size, 0); memcpy(&bytes[0], text, size); } *retval = xmlrpc_c::value_bytestring(bytes); LOG_INFO("[%s] Text.get_rx: %s", XmlRpc::client_id.c_str(), text); free(text); } }; class Text_clear_rx : public xmlrpc_c::method { public: Text_clear_rx() { _signature = "n:n"; _help = "Clears the RX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(&FTextBase::clear, ReceiveText); LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "Text.clear_rx"); *retval = xmlrpc_c::value_nil(); } }; class Text_add_tx_queu : public xmlrpc_c::method { public: Text_add_tx_queu() { _signature = "n:s"; _help = "Adds a string to the TX transmit queu."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; guard_lock xmlchr_lock(&tx_queue_mutex); std::string txt2send = params.getString(0); if (xmlchars.empty()) { xmlchars = txt2send; xmltest_char_available = true; pxmlchar = 0; } else { xmlchars.append(txt2send); } LOG_INFO("[%s] Text.add_tx_queue: %s", XmlRpc::client_id.c_str(), txt2send.c_str()); *retval = xmlrpc_c::value_nil(); } }; class Text_add_tx : public xmlrpc_c::method { public: Text_add_tx() { _signature = "n:s"; _help = "Adds a string to the TX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; LOG_INFO("[%s] Text.add_tx: %s", XmlRpc::client_id.c_str(), std::string(params.getString(0)).c_str()); REQ_SYNC(&FTextTX::add_text, TransmitText, params.getString(0)); *retval = xmlrpc_c::value_nil(); } }; class Text_add_tx_bytes : public xmlrpc_c::method { public: Text_add_tx_bytes() { _signature = "n:6"; _help = "Adds a byte string to the TX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; std::vector bytes = params.getBytestring(0); bytes.push_back(0); LOG_INFO("[%s] Text.add_tx_bytes: %s", XmlRpc::client_id.c_str(), std::string((const char*)&bytes[0]).c_str()); REQ_SYNC(&FTextTX::add_text, TransmitText, std::string((const char*)&bytes[0])); *retval = xmlrpc_c::value_nil(); } }; class Text_clear_tx : public xmlrpc_c::method { public: Text_clear_tx() { _signature = "n:n"; _help = "Clears the TX text widget."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; REQ(&FTextBase::clear, TransmitText); LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "Text.clear_tx"); *retval = xmlrpc_c::value_nil(); } }; // ============================================================================= class RXTX_get_data : public xmlrpc_c::method { public: RXTX_get_data() { _signature = "6:n"; _help = "Returns all RXTX combined data since last query."; } static void get_rxtx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_rxtx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_rxtx, &text, &size); std::vector bytes; if (size) { bytes.resize(size, 0); memcpy(&bytes[0], text, size); } LOG_INFO("[%s] RXTX.get_data: %s", XmlRpc::client_id.c_str(), text); *retval = xmlrpc_c::value_bytestring(bytes); } }; // ============================================================================= class RX_get_data : public xmlrpc_c::method { public: RX_get_data() { _signature = "6:n"; _help = "Returns all RX data received since last query."; } static void get_rx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_rx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_rx, &text, &size); std::vector bytes; if (size) { bytes.resize(size, 0); memcpy(&bytes[0], text, size); } LOG_INFO("[%s] RX.get_data: %s", XmlRpc::client_id.c_str(), text); *retval = xmlrpc_c::value_bytestring(bytes); } }; // ============================================================================= class TX_get_data : public xmlrpc_c::method { public: TX_get_data() { _signature = "6:n"; _help = "Returns all TX data transmitted since last query."; } static void get_tx(char **text, int *size) { // the get* methods may throw but this function is not allowed to do so *text = get_tx_data(); *size = strlen(*text); } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; char *text; int size; REQ_SYNC(get_tx, &text, &size); std::vector bytes; if (size) { bytes.resize(size, 0); memcpy(&bytes[0], text, size); } LOG_INFO("[%s] TX.get_data: %s", XmlRpc::client_id.c_str(), text); *retval = xmlrpc_c::value_bytestring(bytes); } }; // ============================================================================= class Spot_get_auto : public xmlrpc_c::method { public: Spot_get_auto() { _signature = "b:n"; _help = "Returns the autospotter state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { LOG_INFO("[%s] Spot.get_auto: %s", XmlRpc::client_id.c_str(), (btnAutoSpot->value() ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(btnAutoSpot->value()); } }; class Spot_set_auto : public xmlrpc_c::method { public: Spot_set_auto() { _signature = "b:b"; _help = "Sets the autospotter state. Returns the old state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = btnAutoSpot->value(); REQ(set_button, (Fl_Button *) btnAutoSpot, params.getBoolean(0)); LOG_INFO("[%s] Spot.set_auto: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); *retval = xmlrpc_c::value_boolean(v); } }; class Spot_toggle_auto : public xmlrpc_c::method { public: Spot_toggle_auto() { _signature = "b:n"; _help = "Toggles the autospotter state. Returns the new state."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { XMLRPC_LOCK; bool v = !btnAutoSpot->value(); LOG_INFO("[%s] Spot.toggle_auto: %s", XmlRpc::client_id.c_str(), (v ? "ON" : "OFF")); REQ(set_button, (Fl_Button *) btnAutoSpot, v); *retval = xmlrpc_c::value_boolean(v); } }; class Spot_pskrep_get_count : public xmlrpc_c::method { public: Spot_pskrep_get_count() { _signature = "i:n"; _help = "Returns the number of callsigns spotted in the current session."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) { int cnt = static_cast(pskrep_count()); LOG_INFO("[%s] Spot.pskrep_get_count: %d", XmlRpc::client_id.c_str(), cnt); *retval = xmlrpc_c::value_int(cnt); } }; // ============================================================================= // Returns the current wefax modem pointer. static wefax * get_wefax(void) { if( ( active_modem->get_mode() >= MODE_WEFAX_FIRST ) && ( active_modem->get_mode() <= MODE_WEFAX_LAST ) ) { wefax * ptr = dynamic_cast( active_modem ); if( ptr == NULL ) throw std::runtime_error("Inconsistent wefax object"); return ptr ; } throw std::runtime_error("Not in wefax mode"); return (wefax *)0; } struct Wefax_state_string : public xmlrpc_c::method { Wefax_state_string() { _signature = "s:n"; _help = "Returns Wefax engine state (tx and rx) for information."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string wfs = get_wefax()->state_string(); LOG_INFO("[%s] wefax.state_string: %s", XmlRpc::client_id.c_str(), wfs.c_str()); *retval = xmlrpc_c::value_string( wfs.c_str() ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.state_string: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what()); } }; struct Wefax_skip_apt : public xmlrpc_c::method { Wefax_skip_apt() { _signature = "s:n"; _help = "Skip APT during Wefax reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->skip_apt(); LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "wefax.skip_apt"); *retval = xmlrpc_c::value_string( "" ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.skip_apt: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; /// TODO: Refresh the screen with the new value. struct Wefax_skip_phasing : public xmlrpc_c::method { Wefax_skip_phasing() { _signature = "s:n"; _help = "Skip phasing during Wefax reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->skip_phasing(true); LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "wefax.skip_phasing"); *retval = xmlrpc_c::value_string( "" ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.skip_phasing: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; // TODO: The image should be reloaded just like cancelling from the GUI. struct Wefax_set_tx_abort_flag : public xmlrpc_c::method { Wefax_set_tx_abort_flag() { _signature = "s:n"; _help = "Cancels Wefax image transmission"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->set_tx_abort_flag(); LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "wefax.set_tx_abort_flag"); *retval = xmlrpc_c::value_string( "" ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.set_tx_abort_flag: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_end_reception : public xmlrpc_c::method { Wefax_end_reception() { _signature = "s:n"; _help = "End Wefax image reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->end_reception(); LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "wefax.end_reception"); *retval = xmlrpc_c::value_string( "" ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.end_reception: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_start_manual_reception : public xmlrpc_c::method { Wefax_start_manual_reception() { _signature = "s:n"; _help = "Starts fax image reception in manual mode"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { get_wefax()->set_rx_manual_mode(true); get_wefax()->skip_apt(); get_wefax()->skip_phasing(true); LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "wefax.start_manual_reception"); *retval = xmlrpc_c::value_string( "" ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.start_manual_reception: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_set_adif_log : public xmlrpc_c::method { Wefax_set_adif_log() { _signature = "s:b"; _help = "Set/reset logging to received/transmit images to ADIF log file"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { progdefaults.WEFAX_AdifLog = params.getBoolean(0); LOG_INFO("[%s] %s", XmlRpc::client_id.c_str(), "wefax.set_adif_log"); *retval = xmlrpc_c::value_string( "" ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.set_adif_log: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_set_max_lines : public xmlrpc_c::method { Wefax_set_max_lines() { _signature = "s:i"; _help = "Set maximum lines for fax image reception"; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { progdefaults.WEFAX_MaxRows = params.getInt(0); /// This updates the GUI. LOG_INFO("[%s] wefax.set_max_lines: %d", XmlRpc::client_id.c_str(), progdefaults.WEFAX_MaxRows); *retval = xmlrpc_c::value_string( "" ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.set_max_lines: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_get_received_file : public xmlrpc_c::method { Wefax_get_received_file() { _signature = "s:i"; _help = "Waits for next received fax file, returns its name with a delay. Empty string if timeout."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string filename = get_wefax()->get_received_file( params.getInt(0)); LOG_INFO("[%s] wefax.get_received_file: %s", XmlRpc::client_id.c_str(), filename.c_str()); *retval = xmlrpc_c::value_string( filename ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.get_received_file: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; struct Wefax_send_file : public xmlrpc_c::method { Wefax_send_file() { _signature = "s:si"; _help = "Send file. returns an empty string if OK otherwise an error message."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string status = get_wefax()->send_file( params.getString(0), params.getInt(1) ); LOG_INFO("[%s] wefax.send_file: %s", XmlRpc::client_id.c_str(), status.c_str()); *retval = xmlrpc_c::value_string( status ); } catch( const std::exception & e ) { LOG_ERROR("[%s] wefax.send_file: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; // ============================================================================= // Returns the current navtex modem pointer. static navtex * get_navtex(void) { if( ( active_modem->get_mode() != MODE_NAVTEX ) && ( active_modem->get_mode() != MODE_SITORB ) ) { navtex * ptr = dynamic_cast( active_modem ); if( ptr == NULL ) throw std::runtime_error("Inconsistent navtex object"); return ptr ; } throw std::runtime_error("Not in navtex or sitorB mode"); return (navtex *)0; } struct Navtex_get_message : public xmlrpc_c::method { Navtex_get_message() { _signature = "s:i"; _help = "Returns next Navtex/SitorB message with a max delay in seconds.. Empty string if timeout."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { LOG_INFO("[%s] navtex.get_message: %s", XmlRpc::client_id.c_str(), std::string( get_navtex()->get_message( params.getInt(0))).c_str()); *retval = xmlrpc_c::value_string( get_navtex()->get_message( params.getInt(0)) ); } catch( const std::exception & e ) { LOG_ERROR("[%s] navtex.get_message: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what()); } }; struct Navtex_send_message : public xmlrpc_c::method { Navtex_send_message() { _signature = "s:s"; _help = "Send a Navtex/SitorB message. Returns an empty string if OK otherwise an error message."; } void execute(const xmlrpc_c::paramList& params, xmlrpc_c::value* retval) try { std::string status = get_navtex()->send_message( params.getString(0) ); LOG_INFO("[%s] navtex.send_message: %s", XmlRpc::client_id.c_str(), status.c_str()); *retval = xmlrpc_c::value_string( status ); } catch( const std::exception & e ) { LOG_ERROR("[%s] navtex.send_message: %s", XmlRpc::client_id.c_str(), e.what()); *retval = xmlrpc_c::value_string( e.what() ); } }; // ============================================================================= // End XML-RPC interface // method list: ELEM_(class_name, "method_name") #undef ELEM_ #define METHOD_LIST \ ELEM_(Fldigi_list, "fldigi.list") \ ELEM_(Fldigi_name, "fldigi.name") \ ELEM_(Fldigi_version_struct, "fldigi.version_struct") \ ELEM_(Fldigi_version_string, "fldigi.version") \ ELEM_(Fldigi_name_version, "fldigi.name_version") \ ELEM_(Fldigi_config_dir, "fldigi.config_dir") \ ELEM_(Fldigi_terminate, "fldigi.terminate") \ \ ELEM_(Modem_get_mode, "modem.get_mode") \ ELEM_(Modem_get_submode, "modem.get_submode") \ ELEM_(Modem_get_name, "modem.get_name") \ ELEM_(Modem_get_io_names, "modem.get_io_names") \ ELEM_(Modem_get_names, "modem.get_names") \ ELEM_(Modem_get_id, "modem.get_id") \ ELEM_(Modem_get_max_id, "modem.get_max_id") \ ELEM_(Modem_set_by_name, "modem.set_by_name") \ ELEM_(Modem_set_by_id, "modem.set_by_id") \ \ ELEM_(Modem_set_carrier, "modem.set_carrier") \ ELEM_(Modem_inc_carrier, "modem.inc_carrier") \ ELEM_(Modem_get_carrier, "modem.get_carrier") \ \ ELEM_(Modem_get_afc_sr, "modem.get_afc_search_range") \ ELEM_(Modem_set_afc_sr, "modem.set_afc_search_range") \ ELEM_(Modem_inc_afc_sr, "modem.inc_afc_search_range") \ \ ELEM_(Modem_get_bw, "modem.get_bandwidth") \ ELEM_(Modem_set_bw, "modem.set_bandwidth") \ ELEM_(Modem_inc_bw, "modem.inc_bandwidth") \ \ ELEM_(Modem_get_quality, "modem.get_quality") \ ELEM_(Modem_search_up, "modem.search_up") \ ELEM_(Modem_search_down, "modem.search_down") \ \ ELEM_(Modem_olivia_set_bandwidth, "modem.olivia.set_bandwidth") \ ELEM_(Modem_olivia_get_bandwidth, "modem.olivia.get_bandwidth") \ ELEM_(Modem_olivia_set_tones, "modem.olivia.set_tones") \ ELEM_(Modem_olivia_get_tones, "modem.olivia.get_tones") \ \ ELEM_(Main_get_status1, "main.get_status1") \ ELEM_(Main_get_status2, "main.get_status2") \ \ ELEM_(Main_get_sb, "main.get_sideband") \ ELEM_(Main_set_sb, "main.set_sideband") \ ELEM_(Main_get_wf_sideband, "main.get_wf_sideband") \ ELEM_(Main_set_wf_sideband, "main.set_wf_sideband") \ ELEM_(Main_get_freq, "main.get_frequency") \ ELEM_(Main_set_freq, "main.set_frequency") \ ELEM_(Main_inc_freq, "main.inc_frequency") \ \ ELEM_(Main_get_afc, "main.get_afc") \ ELEM_(Main_set_afc, "main.set_afc") \ ELEM_(Main_toggle_afc, "main.toggle_afc") \ \ ELEM_(Main_get_sql, "main.get_squelch") \ ELEM_(Main_set_sql, "main.set_squelch") \ ELEM_(Main_toggle_sql, "main.toggle_squelch") \ \ ELEM_(Main_get_sql_level, "main.get_squelch_level") \ ELEM_(Main_set_sql_level, "main.set_squelch_level") \ ELEM_(Main_inc_sql_level, "main.inc_squelch_level") \ \ ELEM_(Main_get_rev, "main.get_reverse") \ ELEM_(Main_set_rev, "main.set_reverse") \ ELEM_(Main_toggle_rev, "main.toggle_reverse") \ \ ELEM_(Main_get_lock, "main.get_lock") \ ELEM_(Main_set_lock, "main.set_lock") \ ELEM_(Main_toggle_lock, "main.toggle_lock") \ \ ELEM_(Main_get_txid, "main.get_txid") \ ELEM_(Main_set_txid, "main.set_txid") \ ELEM_(Main_toggle_txid, "main.toggle_txid") \ \ ELEM_(Main_get_rsid, "main.get_rsid") \ ELEM_(Main_set_rsid, "main.set_rsid") \ ELEM_(Main_toggle_rsid, "main.toggle_rsid") \ \ ELEM_(Main_get_trx_status, "main.get_trx_status") \ ELEM_(Main_tx, "main.tx") \ ELEM_(Main_tune, "main.tune") \ ELEM_(Main_rsid, "main.rsid") \ ELEM_(Main_rx, "main.rx") \ ELEM_(Main_rx_tx, "main.rx_tx") \ ELEM_(Main_rx_only, "main.rx_only") \ ELEM_(Main_abort, "main.abort") \ \ ELEM_(Main_get_trx_state, "main.get_trx_state") \ ELEM_(Main_get_tx_timing, "main.get_tx_timing") \ ELEM_(Main_get_char_rates, "main.get_char_rates") \ ELEM_(Main_get_char_timing, "main.get_char_timing") \ ELEM_(Main_set_rig_name, "main.set_rig_name") \ ELEM_(Main_set_rig_frequency, "main.set_rig_frequency") \ ELEM_(Main_set_rig_modes, "main.set_rig_modes") \ ELEM_(Main_set_rig_mode, "main.set_rig_mode") \ ELEM_(Main_get_rig_modes, "main.get_rig_modes") \ ELEM_(Main_get_rig_mode, "main.get_rig_mode") \ ELEM_(Main_set_rig_bandwidths, "main.set_rig_bandwidths") \ ELEM_(Main_set_rig_bandwidth, "main.set_rig_bandwidth") \ ELEM_(Main_get_rig_bandwidth, "main.get_rig_bandwidth") \ ELEM_(Main_get_rig_bandwidths, "main.get_rig_bandwidths") \ \ ELEM_(Main_run_macro, "main.run_macro") \ ELEM_(Main_get_max_macro_id, "main.get_max_macro_id") \ \ ELEM_(Rig_set_name, "rig.set_name") \ ELEM_(Rig_get_name, "rig.get_name") \ ELEM_(Rig_set_frequency, "rig.set_frequency") \ ELEM_(Rig_set_smeter, "rig.set_smeter") \ ELEM_(Rig_set_pwrmeter, "rig.set_pwrmeter") \ ELEM_(Rig_set_modes, "rig.set_modes") \ ELEM_(Rig_set_mode, "rig.set_mode") \ ELEM_(Rig_get_modes, "rig.get_modes") \ ELEM_(Rig_get_mode, "rig.get_mode") \ ELEM_(Rig_set_bandwidths, "rig.set_bandwidths") \ ELEM_(Rig_set_bandwidth, "rig.set_bandwidth") \ ELEM_(Rig_get_freq, "rig.get_frequency") \ ELEM_(Rig_get_bandwidth, "rig.get_bandwidth") \ ELEM_(Rig_get_bandwidths, "rig.get_bandwidths") \ ELEM_(Rig_get_notch, "rig.get_notch") \ ELEM_(Rig_set_notch, "rig.set_notch") \ ELEM_(Rig_enable_qsy, "rig.enable_qsy") \ \ ELEM_(Log_get_freq, "log.get_frequency") \ ELEM_(Log_get_time_on, "log.get_time_on") \ ELEM_(Log_get_time_off, "log.get_time_off") \ ELEM_(Log_get_date_on, "log.get_date_on") \ ELEM_(Log_get_date_off, "log.get_date_off") \ ELEM_(Log_get_call, "log.get_call") \ ELEM_(Log_get_name, "log.get_name") \ ELEM_(Log_get_rst_in, "log.get_rst_in") \ ELEM_(Log_get_rst_out, "log.get_rst_out") \ ELEM_(Log_set_rst_in, "log.set_rst_in") \ ELEM_(Log_set_rst_out, "log.set_rst_out") \ ELEM_(Log_get_serial_number, "log.get_serial_number") \ ELEM_(Log_get_serial_number_sent, "log.get_serial_number_sent") \ ELEM_(Log_get_exchange, "log.get_exchange") \ ELEM_(Log_set_exchange, "log.set_exchange") \ ELEM_(Log_get_state, "log.get_state") \ ELEM_(Log_get_province, "log.get_province") \ ELEM_(Log_get_country, "log.get_country") \ ELEM_(Log_get_qth, "log.get_qth") \ ELEM_(Log_get_band, "log.get_band") \ ELEM_(Log_get_sb, "log.get_sideband") \ ELEM_(Log_get_notes, "log.get_notes") \ ELEM_(Log_get_locator, "log.get_locator") \ ELEM_(Log_get_az, "log.get_az") \ \ ELEM_(Log_clear, "log.clear") \ ELEM_(Log_set_call, "log.set_call") \ ELEM_(Log_set_name, "log.set_name") \ ELEM_(Log_set_qth, "log.set_qth") \ ELEM_(Log_set_locator, "log.set_locator") \ ELEM_(Log_set_rst_in, "log.set_rst_in") \ ELEM_(Log_set_rst_out, "log.set_rst_out") \ ELEM_(Log_set_serial_number, "log.set_serial_number") \ ELEM_(Log_set_contest_counter, "log.set_contest_counter") \ \ ELEM_(Logbook_last_record, "logbook.last_record") \ ELEM_(Logbook_all_records, "logbook.all_records") \ \ ELEM_(Main_flmsg_online, "main.flmsg_online") \ ELEM_(Main_flmsg_available, "main.flmsg_available") \ ELEM_(Main_flmsg_transfer, "main.flmsg_transfer") \ ELEM_(Main_flmsg_squelch, "main.flmsg_squelch") \ \ ELEM_(flmsg_online, "flmsg.online") \ ELEM_(flmsg_available, "flmsg.available") \ ELEM_(flmsg_transfer, "flmsg.transfer") \ ELEM_(flmsg_squelch, "flmsg.squelch") \ ELEM_(flmsg_get_data, "flmsg.get_data") \ \ ELEM_(Io_in_use, "io.in_use") \ ELEM_(Io_enable_kiss, "io.enable_kiss") \ ELEM_(Io_enable_arq, "io.enable_arq") \ \ ELEM_(Text_get_rx_length, "text.get_rx_length") \ ELEM_(Text_get_rx, "text.get_rx") \ ELEM_(Text_clear_rx, "text.clear_rx") \ ELEM_(Text_add_tx, "text.add_tx") \ ELEM_(Text_add_tx_queu, "text.add_tx_queu") \ ELEM_(Text_add_tx_bytes, "text.add_tx_bytes") \ ELEM_(Text_clear_tx, "text.clear_tx") \ \ ELEM_(RXTX_get_data, "rxtx.get_data") \ ELEM_(RX_get_data, "rx.get_data") \ ELEM_(TX_get_data, "tx.get_data") \ \ ELEM_(Spot_get_auto, "spot.get_auto") \ ELEM_(Spot_set_auto, "spot.set_auto") \ ELEM_(Spot_toggle_auto, "spot.toggle_auto") \ ELEM_(Spot_pskrep_get_count, "spot.pskrep.get_count") \ \ ELEM_(Wefax_state_string, "wefax.state_string") \ ELEM_(Wefax_skip_apt, "wefax.skip_apt") \ ELEM_(Wefax_skip_phasing, "wefax.skip_phasing") \ ELEM_(Wefax_set_tx_abort_flag, "wefax.set_tx_abort_flag") \ ELEM_(Wefax_end_reception, "wefax.end_reception") \ ELEM_(Wefax_start_manual_reception, "wefax.start_manual_reception") \ ELEM_(Wefax_set_adif_log, "wefax.set_adif_log") \ ELEM_(Wefax_set_max_lines, "wefax.set_max_lines") \ ELEM_(Wefax_get_received_file, "wefax.get_received_file") \ ELEM_(Wefax_send_file, "wefax.send_file") \ \ ELEM_(Navtex_get_message, "navtex.get_message") \ ELEM_(Navtex_send_message, "navtex.send_message") \ struct rm_pred { re_t filter; bool allow; rm_pred(const char* re, bool allow_) : filter(re, REG_EXTENDED | REG_NOSUB), allow(allow_) { } bool operator()(const methods_t::value_type& v) { return filter.match(v.name) ^ allow && !strstr(v.name, "fldigi."); } }; void XML_RPC_Server::add_methods(void) { if (methods) return; #undef ELEM_ #define ELEM_(class_, name_) { RpcBuilder::factory, NULL, name_ }, rpc_method m[] = { METHOD_LIST }; methods = new methods_t(m, m + sizeof(m)/sizeof(*m)); if (!progdefaults.xmlrpc_deny.empty()) methods->remove_if(rm_pred(progdefaults.xmlrpc_deny.c_str(), false)); else if (!progdefaults.xmlrpc_allow.empty()) methods->remove_if(rm_pred(progdefaults.xmlrpc_allow.c_str(), true)); methods_t::iterator it = methods->begin(); methods_t::iterator en = methods->end(); for( ; it != en; ++it ) { XmlRpcServerMethod * mth = it->m_fact( it->name ); it->method = dynamic_cast< xmlrpc_c::method * >( mth ); } } fldigi-4.2.05/src/network/network.cxx0000664000175000017500000007254614611711171014476 00000000000000// ---------------------------------------------------------------------------- // network.cxx // // Copyright (C) 2008...2019 // David Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "socket.h" #include "timeops.h" #include "gettext.h" #include "debug.h" #include "main.h" #include "network.h" #include "socket.h" #include "fl_digi.h" //---------------------------------------------------------------------- // //---------------------------------------------------------------------- static void my_debug( void *ctx, int level, const char *file, int line, const char *str ) { ((void) level); fprintf( (FILE *) ctx, "%s:%04d: %s", file, line, str ); fflush( (FILE *) ctx ); } std::string stripped(std::string s) { while (s[0] == ' ') s.erase(0,1); while (s[s.length()-1] == ' ') s.erase(s.length() - 1); return s; } void Url::parse(std::string url) { _https = false; _host.clear(); _port.clear(); _request.clear(); _url = url; if (_url.find("https://") == 0) { _https = true; _url.erase(0,8); _port = "443"; } else if (url.find("http://") == 0) { _url.erase(0,7); _port = "80"; } size_t p = _url.find(":"); if (p != std::string::npos) { _port = _url.substr(p+1); _url.erase(p); } p = _url.find("/"); if (p != std::string::npos) { _host = _url.substr(0, p); _request = _url.substr(p); } else { _host = _url; } _host = stripped(_host); _url = stripped(url); _request = stripped(_request); if (debug_file) { debug_file << "parser:" << std::endl; debug_file << "url: " << url << std::endl; debug_file << "host: " << _host << std::endl; debug_file << "port: " << _port << std::endl; debug_file << "req: " << _request << std::endl; } } int Url::http_get(std::string &response) { std::ostringstream REQUEST; size_t len = 0, rcvd = 0; bool ret = true; const char service[] = "http"; REQUEST << "GET " << _request << " HTTP/1.1\r\n" << "User-Agent: fldigi " << FLDIGI_VERSION << "\r\n\ Host: " << _host << "\r\n\ Connection: close\r\n\r\n"; len = REQUEST.str().length(); if (debug_file) { debug_file << "Url::http_get(...)" << std::endl; debug_file << "Host: " << _host << std::endl; debug_file << "Service: " << service << std::endl; debug_file << "Request: " << REQUEST.str() << std::endl; } try { Address addr(_host.c_str(), service); Socket s(addr); // Socket s(Address(_host.c_str(), service)); s.connect(); s.set_nonblocking(); s.set_timeout(_timeout); if (s.send(REQUEST.str()) != len) { if (debug_file) debug_file << "send timed out: " << REQUEST.str() << std::endl; response = "Send timed out"; ret = false; goto recv_exit; } if (debug_file) debug_file << "sent: " << len << " bytes." << std::endl; int wait = 1; // allow up to 5 seconds to receive response while ((rcvd = s.recv(response)) == 0) { wait++; if (wait > 5) { if (debug_file) debug_file << "s.recv(...) failed after " << wait << " attempts" << std::endl; return false; } MilliSleep(100); } if (debug_file) debug_file << "s.recv(...) response required " << wait << " request" << (wait > 1 ? "s" : "") << std::endl; } catch (const SocketException& e) { response = e.what(); if (response.empty()) response = "UNKNOWN ERROR"; if (debug_file) { debug_file << "Caught socket exception: " << errno << ": " << response << std::endl; } ret = false; } if (debug_file) { debug_file << "s.recv(...) " << rcvd << " bytes." << std::endl; debug_file << "Response: " << response << std::endl; } recv_exit: return ret; } int Url::http_test(std::string apiKey) { std::ostringstream REQUEST; std::string response = ""; size_t len, rcvd; int ret = 2; const char service[] = "http"; REQUEST << "GET " << _request << "/index.php/api/auth/" << apiKey << " HTTP/1.1\r\n" << "User-Agent: fldigi " << FLDIGI_VERSION << "\r\n\ Host: " << _host << "\r\n\ Connection: close\r\n\r\n"; len = REQUEST.str().length(); try { Address addr(_host.c_str(), service); Socket s(addr); s.connect(); s.set_nonblocking(); s.set_timeout(_timeout); if (s.send(REQUEST.str()) != len) { if (debug_file) debug_file << "send timed out: " << REQUEST.str() << std::endl; ret = 3; goto recv_exit; } if (debug_file) debug_file << "sent: " << len << " bytes." << std::endl; int wait = 1; // allow up to 5 seconds to receive response while ((rcvd = s.recv(response)) == 0) { wait++; if (wait > 5) { if (debug_file) debug_file << "s.recv(...) failed after " << wait << " attempts" << std::endl; return 4; } MilliSleep(100); } if (debug_file) debug_file << "s.recv(...) response required " << wait << " request" << (wait > 1 ? "s" : "") << std::endl; } catch (const SocketException& e) { response = e.what(); if (response.empty()) response = "UNKNOWN ERROR"; if (debug_file) { debug_file << "Caught socket exception: " << errno << ": " << response << std::endl; } ret = 5; } // Response for an API key test request // Validrw if (response.find("") == std::string::npos) { ret = 2; } else { if (response.find("Valid") == std::string::npos) { ret = 2; } if (response.find("r") != std::string::npos) { ret = 1; } if (response.find("rw") != std::string::npos) { ret = 0; } } recv_exit: return ret; } int Url::https_test(std::string apiKey) { int ret = 2, len; _err = MBEDTLS_EXIT_SUCCESS; std::ostringstream REQUEST; std::string response = ""; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; #if defined(MBEDTLS_DEBUG_C) mbedtls_debug_set_threshold( 1 ); #endif /* * 0. Initialize the RNG and the session data */ mbedtls_net_init( &server_fd ); mbedtls_ssl_init( &ssl ); mbedtls_ssl_config_init( &conf ); mbedtls_x509_crt_init( &cacert ); mbedtls_ctr_drbg_init( &ctr_drbg ); if (debug_file) { debug_file << "\n . Seeding the random number generator..."; debug_file.flush(); } mbedtls_entropy_init( &entropy ); if ( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *)_pers.c_str(), _pers.length() ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 0. Initialize certificates */ if (debug_file) { debug_file << " . Loading the CA root certificate ..."; debug_file.flush(); } ca_crt_rsa[ca_crt_rsa_size - 1] = 0; ret = mbedtls_x509_crt_parse(&cacert, (uint8_t *)ca_crt_rsa, ca_crt_rsa_size); if( ret < 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_x509_crt_parse returned -0x%x\n\n", -ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok (" << ret << " skipped)\n"; } /* * 1. Start the connection */ if (debug_file) { debug_file << " . Connecting to tcp/" << _host << ":" << _port << "..."; debug_file.flush(); } if( ( ret = mbedtls_net_connect( &server_fd, _host.c_str(), _port.c_str(), MBEDTLS_NET_PROTO_TCP ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_net_connect returned %d\n\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 2. Setup stuff */ if (debug_file) { debug_file << " . Setting up the SSL/TLS structure..."; debug_file.flush(); } if( ( ret = mbedtls_ssl_config_defaults( &conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_config_defaults returned %d\n\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 3. More stuff */ /* OPTIONAL is not optimal for security, * but makes interop easier in this simplified example */ mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL ); mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL ); mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg ); mbedtls_ssl_conf_dbg( &conf, my_debug, stdout ); if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_setup returned %d\n\n", ret ); _err = ret; goto exit; } if( ( ret = mbedtls_ssl_set_hostname( &ssl, _host.c_str() ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_set_hostname returned %d\n\n", ret ); _err = ret; goto exit; } mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL ); /* * 4. Handshake */ if (debug_file) { debug_file << " . Performing the SSL/TLS handshake..."; debug_file.flush(); } while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 ) { if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_handshake returned -0x%x\n\n", -ret ); _err = ret; goto exit; } } if (debug_file) { debug_file << " ok\n"; } /* * 5. Verify the server certificate */ if (debug_file) { debug_file << " . Verifying peer X.509 certificate..."; } /* In real life, we probably want to bail out when ret != 0 */ if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 ) { char vrfy_buf[512]; if (debug_file) { debug_file << " failed\n"; } mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), " ! ", flags ); if (debug_file) { debug_file << vrfy_buf << std::endl; } } else if (debug_file) { debug_file << " ok\n"; } /* * 6. Write the GET request */ if (debug_file) { debug_file << " > Write to server:"; debug_file.flush(); } REQUEST << "GET " << _request << "/index.php/api/auth/" << apiKey << " HTTP/1.1\r\n"; REQUEST << "User-Agent: fldigi-" << FLDIGI_VERSION << "\r\n" << "Host: " << _host << ":" << _port << "\r\n" << "Content-Type: application/json; charset=utf-8\r\n" << "Connection: Keep-Alive\r\n\r\n"; len = REQUEST.str().length(); while( ( ret = mbedtls_ssl_write( &ssl, (const unsigned char *)REQUEST.str().c_str(), len ) ) <= 0 ) { if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_write returned %d\n\n", ret ); _err = ret; goto exit; } } len = ret; if (debug_file) { debug_file << len << " bytes written\n\"" << REQUEST.str() << "\""; debug_file.flush(); } /* * 7. Read the HTTP response */ if (debug_file) { debug_file << "\n < Read from server:"; debug_file.flush(); } do { len = sizeof( buf ) - 1; memset( buf, 0, sizeof( buf ) ); ret = mbedtls_ssl_read( &ssl, (unsigned char *)buf, len ); if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE ) { continue; } if( ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY ) { break; } if( ret < 0 ) { if (debug_file) { debug_file << "failed\n ! mbedtls_ssl_read returned " << ret << std::endl; } break; } if( ret == 0 ) { if (debug_file) { debug_file << "\n\nEOF\n\n"; } break; } len = ret; if (debug_file) { debug_file << len << " bytes read\n\n" << (char *) buf << std::endl; } _data.append(buf); break; } while( 1 ); mbedtls_ssl_close_notify( &ssl ); response = _data; // Response for an API key test request // Validrw if (response.find("") == std::string::npos) { ret = 2; } else { if (response.find("Valid") == std::string::npos) { ret = 2; } if (response.find("r") != std::string::npos) { ret = 1; } if (response.find("rw") != std::string::npos) { ret = 0; } } _err = MBEDTLS_EXIT_SUCCESS; exit: #ifdef MBEDTLS_ERROR_C if( _err != MBEDTLS_EXIT_SUCCESS ) { char error_buf[100]; mbedtls_strerror( _err, error_buf, 100 ); snprintf(err_string, sizeof(err_string), "Last error was: %d - %s\n\n", _err, error_buf ); } #endif mbedtls_net_free( &server_fd ); mbedtls_x509_crt_free( &cacert ); mbedtls_ssl_free( &ssl ); mbedtls_ssl_config_free( &conf ); mbedtls_ctr_drbg_free( &ctr_drbg ); mbedtls_entropy_free( &entropy ); if( _err != MBEDTLS_EXIT_SUCCESS ) { return( _err ); } else { return ret; } } int Url::http_post(std::string apikey, int profile_id, std::string adifdata, std::string &response) { std::ostringstream REQUEST; std::ostringstream PAYLOAD; bool ret = true; size_t len; const char service[] = "http"; PAYLOAD << "{" << "\"key\":\"" << apikey << "\"," << "\"station_profile_id\":\"" << profile_id << "\"," << "\"type\":\"adif\"," << "\"string\":\"" << adifdata << "\"" << "}"; len = PAYLOAD.str().length(); REQUEST << "POST " << _request << " HTTP/1.1\r\n" << "Content-Type: application/json; charset=utf-8\r\n" << "User-Agent: fldigi " << FLDIGI_VERSION << "\r\n" << "Host: " << _host << "\r\n" << "Content-Length: " << len << "\r\n" << "Connection: Keep-Alive\r\n\r\n" << PAYLOAD.str(); len = REQUEST.str().length(); try { Address addr(_host.c_str(), service); Socket s(addr); s.connect(); s.set_nonblocking(); s.set_timeout(_timeout); if (s.send(REQUEST.str()) != len) { response = "Send timed out"; ret = false; goto recv_exit; } } catch (const SocketException& e) { response = e.what(); printf("error occured: %s\n", response.c_str()); if (response.empty()) response = "UNKNOWN ERROR"; ret = false; } recv_exit: return ret; } int Url::https_get(std::string &response) { int ret = 1, len; _err = MBEDTLS_EXIT_SUCCESS; std::ostringstream REQUEST; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; #if defined(MBEDTLS_DEBUG_C) mbedtls_debug_set_threshold( 1 ); #endif /* * 0. Initialize the RNG and the session data */ mbedtls_net_init( &server_fd ); mbedtls_ssl_init( &ssl ); mbedtls_ssl_config_init( &conf ); mbedtls_x509_crt_init( &cacert ); mbedtls_ctr_drbg_init( &ctr_drbg ); if (debug_file) { debug_file << "\n . Seeding the random number generator..."; debug_file.flush(); } mbedtls_entropy_init( &entropy ); if ( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *)_pers.c_str(), _pers.length() ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 0. Initialize certificates */ if (debug_file) { debug_file << " . Loading the CA root certificate ..."; debug_file.flush(); } ca_crt_rsa[ca_crt_rsa_size - 1] = 0; ret = mbedtls_x509_crt_parse(&cacert, (uint8_t *)ca_crt_rsa, ca_crt_rsa_size); if( ret < 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_x509_crt_parse returned -0x%x\n\n", -ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok (" << ret << " skipped)\n"; } /* * 1. Start the connection */ if (debug_file) { debug_file << " . Connecting to tcp/" << _host << ":" << _port << "..."; debug_file.flush(); } if( ( ret = mbedtls_net_connect( &server_fd, _host.c_str(), _port.c_str(), MBEDTLS_NET_PROTO_TCP ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_net_connect returned %d\n\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 2. Setup stuff */ if (debug_file) { debug_file << " . Setting up the SSL/TLS structure..."; debug_file.flush(); } if( ( ret = mbedtls_ssl_config_defaults( &conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_config_defaults returned %d\n\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 3. More stuff */ /* OPTIONAL is not optimal for security, * but makes interop easier in this simplified example */ mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL ); mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL ); mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg ); mbedtls_ssl_conf_dbg( &conf, my_debug, stdout ); if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_setup returned %d\n\n", ret ); _err = ret; goto exit; } if( ( ret = mbedtls_ssl_set_hostname( &ssl, _host.c_str() ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_set_hostname returned %d\n\n", ret ); _err = ret; goto exit; } mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL ); /* * 4. Handshake */ if (debug_file) { debug_file << " . Performing the SSL/TLS handshake..."; debug_file.flush(); } while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 ) { if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_handshake returned -0x%x\n\n", -ret ); _err = ret; goto exit; } } if (debug_file) { debug_file << " ok\n"; } /* * 5. Verify the server certificate */ if (debug_file) { debug_file << " . Verifying peer X.509 certificate..."; } /* In real life, we probably want to bail out when ret != 0 */ if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 ) { char vrfy_buf[512]; if (debug_file) { debug_file << " failed\n"; } mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), " ! ", flags ); if (debug_file) { debug_file << vrfy_buf << std::endl; } } else if (debug_file) { debug_file << " ok\n"; } /* * 6. Write the GET request */ if (debug_file) { debug_file << " > Write to server:"; debug_file.flush(); } REQUEST << "GET " << _request << " HTTP/1.1\r\n"; REQUEST << "User-Agent: fldigi-" << FLDIGI_VERSION << "\r\n" << "Host: " << _host << ":" << _port << "\r\n" << "Content-Type: application/json; charset=utf-8\r\n" << "Connection: Keep-Alive\r\n\r\n"; len = REQUEST.str().length(); while( ( ret = mbedtls_ssl_write( &ssl, (const unsigned char *)REQUEST.str().c_str(), len ) ) <= 0 ) { if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_write returned %d\n\n", ret ); _err = ret; goto exit; } } len = ret; if (debug_file) { debug_file << len << " bytes written\n\"" << REQUEST.str() << "\""; debug_file.flush(); } /* * 7. Read the HTTP response */ if (debug_file) { debug_file << "\n < Read from server:"; debug_file.flush(); } do { len = sizeof( buf ) - 1; memset( buf, 0, sizeof( buf ) ); ret = mbedtls_ssl_read( &ssl, (unsigned char *)buf, len ); if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE ) { continue; } if( ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY ) { break; } if( ret < 0 ) { if (debug_file) { debug_file << "failed\n ! mbedtls_ssl_read returned " << ret << std::endl; } break; } if( ret == 0 ) { if (debug_file) { debug_file << "\n\nEOF\n\n"; } break; } len = ret; if (debug_file) { debug_file << len << " bytes read\n\n" << (char *) buf << std::endl; } _data.append(buf); break; } while( 1 ); mbedtls_ssl_close_notify( &ssl ); response = _data; _err = MBEDTLS_EXIT_SUCCESS; exit: #ifdef MBEDTLS_ERROR_C if( _err != MBEDTLS_EXIT_SUCCESS ) { char error_buf[100]; mbedtls_strerror( _err, error_buf, 100 ); snprintf(err_string, sizeof(err_string), "Last error was: %d - %s\n\n", _err, error_buf ); } #endif mbedtls_net_free( &server_fd ); mbedtls_x509_crt_free( &cacert ); mbedtls_ssl_free( &ssl ); mbedtls_ssl_config_free( &conf ); mbedtls_ctr_drbg_free( &ctr_drbg ); mbedtls_entropy_free( &entropy ); return( _err ); } int Url::https_post(std::string apikey, int profile_id, std::string adifdata, std::string &response) { int ret = 1, len; _err = MBEDTLS_EXIT_SUCCESS; std::ostringstream REQUEST; std::ostringstream PAYLOAD; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; #if defined(MBEDTLS_DEBUG_C) mbedtls_debug_set_threshold( 1 ); #endif /* * 0. Initialize the RNG and the session data */ mbedtls_net_init( &server_fd ); mbedtls_ssl_init( &ssl ); mbedtls_ssl_config_init( &conf ); mbedtls_x509_crt_init( &cacert ); mbedtls_ctr_drbg_init( &ctr_drbg ); if (debug_file) { debug_file << "\n . Seeding the random number generator..."; debug_file.flush(); } mbedtls_entropy_init( &entropy ); if ( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *)_pers.c_str(), _pers.length() ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 0. Initialize certificates */ if (debug_file) { debug_file << " . Loading the CA root certificate ..."; debug_file.flush(); } ca_crt_rsa[ca_crt_rsa_size - 1] = 0; ret = mbedtls_x509_crt_parse(&cacert, (uint8_t *)ca_crt_rsa, ca_crt_rsa_size); if( ret < 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_x509_crt_parse returned -0x%x\n\n", -ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok (" << ret << " skipped)\n"; } /* * 1. Start the connection */ if (debug_file) { debug_file << " . Connecting to tcp/" << _host << ":" << _port << "..."; debug_file.flush(); } if( ( ret = mbedtls_net_connect( &server_fd, _host.c_str(), _port.c_str(), MBEDTLS_NET_PROTO_TCP ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_net_connect returned %d\n\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 2. Setup stuff */ if (debug_file) { debug_file << " . Setting up the SSL/TLS structure..."; debug_file.flush(); } if( ( ret = mbedtls_ssl_config_defaults( &conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_config_defaults returned %d\n\n", ret ); _err = ret; goto exit; } if (debug_file) { debug_file << " ok\n"; } /* * 3. More stuff */ /* OPTIONAL is not optimal for security, * but makes interop easier in this simplified example */ mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL ); mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL ); mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg ); mbedtls_ssl_conf_dbg( &conf, my_debug, stdout ); if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_setup returned %d\n\n", ret ); _err = ret; goto exit; } if( ( ret = mbedtls_ssl_set_hostname( &ssl, _host.c_str() ) ) != 0 ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_set_hostname returned %d\n\n", ret ); _err = ret; goto exit; } mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL ); /* * 4. Handshake */ if (debug_file) { debug_file << " . Performing the SSL/TLS handshake..."; debug_file.flush(); } while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 ) { if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_handshake returned -0x%x\n\n", -ret ); _err = ret; goto exit; } } if (debug_file) { debug_file << " ok\n"; } /* * 5. Verify the server certificate */ if (debug_file) { debug_file << " . Verifying peer X.509 certificate..."; } /* In real life, we probably want to bail out when ret != 0 */ if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 ) { char vrfy_buf[512]; if (debug_file) { debug_file << " failed\n"; } mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), " ! ", flags ); if (debug_file) { debug_file << vrfy_buf << std::endl; } } else if (debug_file) { debug_file << " ok\n"; } /* * 6. Write the GET request */ if (debug_file) { debug_file << " > Write to server:"; debug_file.flush(); } PAYLOAD << "{" << "\"key\":\"" << apikey << "\"," << "\"station_profile_id\":\"" << profile_id << "\"," << "\"type\":\"adif\"," << "\"string\":\"" << adifdata << "\"" << "}"; len = PAYLOAD.str().length(); REQUEST << "POST " << _request << " HTTP/1.1\r\n" << "Content-Type: application/json; charset=utf-8\r\n" << "User-Agent: fldigi " << FLDIGI_VERSION << "\r\n" << "Host: " << _host << "\r\n" << "Content-Length: " << len << "\r\n" << "Connection: Keep-Alive\r\n\r\n" << PAYLOAD.str(); len = REQUEST.str().length(); while( ( ret = mbedtls_ssl_write( &ssl, (const unsigned char *)REQUEST.str().c_str(), len ) ) <= 0 ) { if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE ) { snprintf(err_string, sizeof(err_string), " failed\n ! mbedtls_ssl_write returned %d\n\n", ret ); _err = ret; goto exit; } } len = ret; if (debug_file) { debug_file << len << " bytes written\n\"" << REQUEST.str() << "\""; debug_file.flush(); } /* * 7. Read the HTTP response */ if (debug_file) { debug_file << "\n < Read from server:"; debug_file.flush(); } do { len = sizeof( buf ) - 1; memset( buf, 0, sizeof( buf ) ); ret = mbedtls_ssl_read( &ssl, (unsigned char *)buf, len ); if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE ) { continue; } if( ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY ) { break; } if( ret < 0 ) { if (debug_file) { debug_file << "failed\n ! mbedtls_ssl_read returned " << ret << std::endl; } break; } if( ret == 0 ) { if (debug_file) { debug_file << "\n\nEOF\n\n"; } break; } len = ret; if (debug_file) { debug_file << len << " bytes read\n\n" << (char *) buf << std::endl; } _data.append(buf); break; } while( 1 ); mbedtls_ssl_close_notify( &ssl ); response = _data; _err = MBEDTLS_EXIT_SUCCESS; exit: #ifdef MBEDTLS_ERROR_C if( _err != MBEDTLS_EXIT_SUCCESS ) { char error_buf[100]; mbedtls_strerror( _err, error_buf, 100 ); snprintf(err_string, sizeof(err_string), "Last error was: %d - %s\n\n", _err, error_buf ); } #endif mbedtls_net_free( &server_fd ); mbedtls_x509_crt_free( &cacert ); mbedtls_ssl_free( &ssl ); mbedtls_ssl_config_free( &conf ); mbedtls_ctr_drbg_free( &ctr_drbg ); mbedtls_entropy_free( &entropy ); return( _err ); } int Url::get(std::string url, std::string &response) { if (url.empty()) return -1; parse(url); int ret = 0; if (_https) ret = https_get(response); else ret = http_get(response); return ret; } int Url::post(std::string url, std::string apikey, int profile_id, std::string adifdata, std::string &response) { if (url.empty()) return -1; parse(url); int ret = 0; if (_https) ret = https_post(apikey, profile_id, adifdata, response); else ret = http_post(apikey, profile_id, adifdata, response); return ret; } int Url::test(std::string url, std::string apiKey) { parse(url); int ret = 2; if (_https == true) { ret = https_test(apiKey); } else { ret = http_test(apiKey); } return ret; } int Url::_rotate_log = 0; void Url::debug() { std::string fname = DebugDir; fname.append("network_debug.txt"); if (!_rotate_log) { rotate_log(fname); _rotate_log = 1; } debug_file.open(fname.c_str(), std::ios::app); } bool get_http(const std::string& url, std::string& reply, double timeout) { Url target_url; target_url.timeout(timeout); return target_url.get(url, reply); } bool post_http(const std::string& url, const std::string& apikey, int profile_id, std::string adifdata, std::string& reply, double timeout) { Url target_url; target_url.timeout(timeout); return target_url.post(url, apikey, profile_id, adifdata, reply); } int test_api_key(std::string url, const std::string& apiKey, double timeout) { if (url[url.length()-1] == '/') { url = url.substr(0, url.length()-1); } if (url.find("/index.php/api/qso") != std::string::npos) { url.erase(url.find("/index.php/api/qso"), 18); } Url target_url; target_url.timeout(timeout); return target_url.test(url, apiKey); } fldigi-4.2.05/src/network/socket.cxx0000664000175000017500000010151314611711171014260 00000000000000// ---------------------------------------------------------------------------- // socket.cxx // // Copyright (C) 2008-2009 // Stelios Bounanos, M0GLD // // This file is part of fldigi. // // fldigi is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ---------------------------------------------------------------------------- #include #include #include #ifndef __MINGW32__ # include # include # if defined(__OpenBSD__) && defined(nitems) # undef nitems # endif # include # include # include # include #else # include "compat.h" # include #endif #define DEFAULT_BUFFER_SIZE 1024 #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" #ifdef BUILD_FLARQ # include "flarq.h" #else # include "main.h" #endif #include "socket.h" #include "estrings.h" #if HAVE_GETADDRINFO && !defined(AI_NUMERICSERV) # define AI_NUMERICSERV 0 #endif static int dummy_value = 0; // // utility functions // #if HAVE_GETADDRINFO static void copy_addrinfo(struct addrinfo** info, const struct addrinfo* src) { struct addrinfo* p = *info; for (const struct addrinfo* rp = src; rp; rp = rp->ai_next) { if (p) { p->ai_next = new struct addrinfo; p = p->ai_next; } else { p = new struct addrinfo; if (!*info) *info = p; } p->ai_flags = rp->ai_flags; p->ai_family = rp->ai_family; p->ai_socktype = rp->ai_socktype; p->ai_protocol = rp->ai_protocol; p->ai_addrlen = rp->ai_addrlen; if (rp->ai_addr) { p->ai_addr = reinterpret_cast(new struct sockaddr_storage); memcpy(p->ai_addr, rp->ai_addr, rp->ai_addrlen); } else p->ai_addr = NULL; if (rp->ai_canonname) p->ai_canonname = strdup(rp->ai_canonname); else p->ai_canonname = NULL; p->ai_next = NULL; } } static void free_addrinfo(struct addrinfo* ai) { for (struct addrinfo *next, *p = ai; p; p = next) { next = p->ai_next; delete reinterpret_cast(p->ai_addr); free(p->ai_canonname); delete p; } } #else static void copy_charpp(char*** dst, const char* const* src) { if (src == NULL) { *dst = NULL; return; } size_t n = 0; for (const char* const* s = src; *s; s++) n++; *dst = new char*[n+1]; for (size_t i = 0; i < n; i++) (*dst)[i] = strdup(src[i]); (*dst)[n] = NULL; } static void copy_hostent(struct hostent* dst, const struct hostent* src) { if (src->h_name) dst->h_name = strdup(src->h_name); else dst->h_name = NULL; copy_charpp(&dst->h_aliases, src->h_aliases); dst->h_length = src->h_length; if (src->h_addr_list) { size_t n = 0; for (const char* const* p = src->h_addr_list; *p; p++) n++; dst->h_addr_list = new char*[n+1]; for (size_t i = 0; i < n; i++) { dst->h_addr_list[i] = new char[src->h_length]; memcpy(dst->h_addr_list[i], src->h_addr_list[i], src->h_length); } dst->h_addr_list[n] = NULL; } else dst->h_addr_list = NULL; } static void copy_servent(struct servent* dst, const struct servent* src) { if (src->s_name) dst->s_name = strdup(src->s_name); else dst->s_name = NULL; copy_charpp(&dst->s_aliases, src->s_aliases); dst->s_port = src->s_port; if (src->s_proto) dst->s_proto = strdup(src->s_proto); else dst->s_proto = NULL; } static void free_charpp(char** pp) { if (!pp) return; for (char** p = pp; *p; p++) free(*p); delete [] pp; } static void free_hostent(struct hostent* hp) { free(const_cast(hp->h_name)); free_charpp(hp->h_aliases); if (hp->h_addr_list) { for (char** p = hp->h_addr_list; *p; p++) delete [] *p; delete [] hp->h_addr_list; } } static void free_servent(struct servent* sp) { free(const_cast(sp->s_name)); free_charpp(sp->s_aliases); free(sp->s_proto); } #endif // HAVE_GETADDRINFO // // Address class // Address::Address(const char* host, int port, const char* proto_name) : node(host), copied(false) { #if HAVE_GETADDRINFO info = NULL; #else memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); #endif if (node.empty() && (port == 0)) return; std::ostringstream s; s << port; service = s.str(); try { lookup(proto_name); } catch (...) { throw; } } Address::Address(const char* host, const char* port_name, const char* proto_name) : node(host), service(port_name), copied(false) { #if HAVE_GETADDRINFO info = NULL; #else memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); #endif try { lookup(proto_name); } catch (...) { throw; } } Address::Address(const Address &addr) { #if HAVE_GETADDRINFO info = NULL; #else memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); #endif *this = addr; } Address::~Address() { #if HAVE_GETADDRINFO if (info) { if (!copied) freeaddrinfo(info); else free_addrinfo(info); } #else free_hostent(&host_entry); free_servent(&service_entry); #endif } Address& Address::operator=(const Address& rhs) { if (this == &rhs) return *this; node = rhs.node; service = rhs.service; #if HAVE_GETADDRINFO if (info) { if (!copied) freeaddrinfo(info); else free_addrinfo(info); } copy_addrinfo(&info, rhs.info); #else free_hostent(&host_entry); free_servent(&service_entry); copy_hostent(&host_entry, &rhs.host_entry); copy_servent(&service_entry, &rhs.service_entry); addr.ai_protocol = rhs.addr.ai_protocol; addr.ai_socktype = rhs.addr.ai_socktype; #endif copied = true; return *this; } void Address::lookup(const char* proto_name) { int proto; if (!strcasecmp(proto_name, "tcp")) proto = IPPROTO_TCP; else if (!strcasecmp(proto_name, "udp")) proto = IPPROTO_UDP; else throw SocketException("Bad protocol name"); #if HAVE_GETADDRINFO struct addrinfo hints; memset(&hints, 0, sizeof(hints)); # ifdef AI_ADDRCONFIG hints.ai_flags = AI_ADDRCONFIG; # endif hints.ai_family = AF_UNSPEC; hints.ai_socktype = (proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM); if (service.find_first_not_of("0123456789") == std::string::npos) hints.ai_flags |= AI_NUMERICSERV; int r = getaddrinfo(node.empty() ? NULL : node.c_str(), service.c_str(), &hints, &info); if (r != 0) { throw SocketException(gai_strerror(r)); } #else // use gethostbyname etc. memset(&host_entry, 0, sizeof(host_entry)); memset(&service_entry, 0, sizeof(service_entry)); if (node.empty()) node = "0.0.0.0"; struct hostent* hp; if ((hp = gethostbyname(node.c_str())) == NULL) throw SocketException(hstrerror(HOST_NOT_FOUND)); copy_hostent(&host_entry, hp); int port; struct servent* sp; if ((sp = getservbyname(service.c_str(), NULL)) == NULL) { // if a service name string could not be looked up by name, it must be numeric if (service.find_first_not_of("0123456789") != std::string::npos) throw SocketException("Unknown service name"); port = htons(atoi(service.c_str())); sp = getservbyport(port, NULL); } if (!sp) service_entry.s_port = port; else copy_servent(&service_entry, sp); memset(&addr, 0, sizeof(addr)); addr.ai_protocol = proto; addr.ai_socktype = (proto == IPPROTO_TCP ? SOCK_STREAM : SOCK_DGRAM); #endif } /// /// Returns the number of addresses available for /// the node and service /// size_t Address::size(void) const { size_t n = 0; #if HAVE_GETADDRINFO if (!info) return 0; for (struct addrinfo* p = info; p; p = p->ai_next) n++; #else if (!host_entry.h_addr_list) return 0; for (char** p = host_entry.h_addr_list; *p; p++) n++; #endif return n; } /// /// Returns an address from the list of those available /// for the node and service /// const addr_info_t* Address::get(size_t n) const { #if HAVE_GETADDRINFO if (!info) return NULL; struct addrinfo* p = info; for (size_t i = 0; i < n; i++) p = p->ai_next; LOG_VERBOSE("Found address %s", get_str(p).c_str()); return p; #else if (!host_entry.h_addr_list) return NULL; memset(&saddr, 0, sizeof(saddr)); #ifdef __WIN32__ saddr.sin_family = AF_INET; saddr.sin_addr = *(struct in_addr*)host_entry.h_addr_list[n]; saddr.sin_port = service_entry.s_port; addr.ai_family = saddr.sin_family; #else saddr.sin6_family = AF_INET6; saddr.sin6_addr = *(struct in6_addr*)host_entry.h_addr_list[n]; saddr.sin6_port = service_entry.s_port; addr.ai_family = saddr.sin6_family; #endif addr.ai_addrlen = sizeof(saddr); addr.ai_addr = (struct sockaddr*)&saddr; LOG_VERBOSE("Found address %s", get_str(&addr).c_str()); return &addr; #endif } /// /// Returns the string representation of an address /// std::string Address::get_str(const addr_info_t* addr) { if (!addr) return ""; #if HAVE_GETADDRINFO char host[NI_MAXHOST], port[NI_MAXSERV]; memset(host, 0, sizeof(host)); if (getnameinfo(addr->ai_addr, sizeof(struct sockaddr_storage), host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV) == 0) return std::string("[").append(host).append("]:").append(port); else return ""; #else char* host, port[8]; #ifdef __WIN32__ host = inet_ntoa(((struct sockaddr_in*)addr->ai_addr)->sin_addr); snprintf(port, sizeof(port), "%u", htons(((struct sockaddr_in*)addr->ai_addr)->sin_port)); #else host = inet_ntoa(((struct sockaddr_in6*)addr->ai_addr)->sin6_addr); snprintf(port, sizeof(port), "%u", htons(((struct sockaddr_in6*)addr->ai_addr)->sin6_port)); #endif return std::string("[").append(host).append("]:").append(port); #endif } // // Socket class // #ifdef __MINGW32__ void windows_init(void) { static WSADATA wsaData; static int wsa_init_ = 0; if (wsa_init_) return; wsa_init_ = 1; if (WSAStartup(MAKEWORD(WSA_MAJOR, WSA_MINOR), &wsaData)) { fprintf(stderr, "unable to initialize winsock: error %d", WSAGetLastError()); exit(EXIT_FAILURE); } atexit((void(*)(void)) WSACleanup); } #endif /// Constructs a Socket object and associates the address addr with it. /// This address will be used by subsequent calls to the bind() or connect() /// methods /// /// @param addr An Address object /// Socket::Socket(const Address &addr) { #ifdef __MINGW32__ windows_init(); #endif buffer = new char[S_BUFSIZ]; memset(&timeout, 0, sizeof(timeout)); anum = 0; nonblocking = false; autoclose = true; saddr_size = sizeof(saddr); use_kiss_dual_port = &dummy_value; open(addr); } /// Constructs a Socket object from a file descriptor /// /// @param fd A file descriptor /// Socket::Socket(int fd) : sockfd(fd) { #ifdef __MINGW32__ windows_init(); #endif buffer = new char[S_BUFSIZ]; anum = 0; memset(&timeout, 0, sizeof(timeout)); if (sockfd == -1) return; #ifndef __MINGW32__ int r = fcntl(sockfd, F_GETFL); if (r == -1) throw SocketException(errno, "fcntl"); nonblocking = r & O_NONBLOCK; #else // no way to retrieve nonblocking status on woe32(?!) set_nonblocking(false); #endif autoclose = true; } /// /// Constructs a Socket object by copying another instance /// Socket::Socket(const Socket& s) : sockfd(s.sockfd), address(s.address), anum(s.anum), nonblocking(s.nonblocking), autoclose(true) { #ifdef __MINGW32__ windows_init(); #endif buffer = new char[S_BUFSIZ]; ainfo = address.get(anum); memcpy(&timeout, &s.timeout, sizeof(timeout)); s.set_autoclose(false); } Socket::~Socket() { if(buffer) delete [] buffer; if (autoclose) close(); } Socket& Socket::operator=(const Socket& rhs) { if (this == &rhs) return *this; sockfd = rhs.sockfd; address = rhs.address; anum = rhs.anum; ainfo = address.get(anum); memcpy(&timeout, &rhs.timeout, sizeof(timeout)); nonblocking = rhs.nonblocking; autoclose = rhs.autoclose; rhs.set_autoclose(false); return *this; } void Socket::dual_port(int * dual_port) { if(dual_port) use_kiss_dual_port = dual_port; else use_kiss_dual_port = &dummy_value; } void Socket::set_dual_port_number(unsigned int port) { dual_port_number = port; } void Socket::set_dual_port_number(std::string port) { if(!port.empty()) { dual_port_number = (unsigned int) atoi(port.c_str()); } else { use_kiss_dual_port = &dummy_value; } } /// /// Associates the Socket with an address /// /// This address will be used by subsequent calls to the bind() or connect /// methods. /// /// @params addr An address object /// void Socket::open(const Address& addr) { address = addr; size_t n = address.size(); const addr_info_t* info = (addr_info_t *)0; ainfo = info; for (anum = 0; anum < n; anum++) { info = address.get(anum); LOG_VERBOSE("\n\ Address %s\n\ Family %s\n\ Sock type %s\n\ Protocol %s", address.get_str(info).c_str(), (info->ai_family == AF_INET6 ? "AF_INET6" :\ (info->ai_family == AF_INET ? "AF_INET" : "unknown")), (info->ai_socktype == SOCK_STREAM ? "stream" : "dgram"), (info->ai_protocol == IPPROTO_TCP ? "tcp" : (info->ai_protocol == IPPROTO_UDP ? "udp" : "unknown protocol"))); if (info->ai_family == AF_INET) ainfo = info; } if (ainfo == (addr_info_t *)0) { LOG_ERROR("Cannot find IPv4 address"); sockfd = -1; throw SocketException("Cannot find IPv4 address"); } LOG_VERBOSE("Trying %s", address.get_str(ainfo).c_str()); if ((sockfd = socket(ainfo->ai_family, ainfo->ai_socktype, ainfo->ai_protocol)) == -1) { throw SocketException(errno, "Open socket"); } LOG_VERBOSE("Socket address: %d", sockfd); set_close_on_exec(true); } /// /// Shuts down the socket /// void Socket::close(void) { LOG_VERBOSE("sockfd %d", sockfd); #ifdef __MINGW32__ ::closesocket(sockfd); #else ::close(sockfd); #endif connected_flag = false; } /// /// Waits for the socket file descriptor to become ready for I/O /// /// @params dir Specifies the I/O direction. 0 is input, 1 is output. /// /// @return True if the file descriptor became ready within the timeout /// period, false otherwise. @see Socket::set_timeout bool Socket::wait(int dir) { fd_set fdset; FD_ZERO(&fdset); FD_SET((unsigned)sockfd, &fdset); struct timeval t = { timeout.tv_sec, timeout.tv_usec }; int r; if (dir == 0) r = select(sockfd + 1, &fdset, NULL, NULL, &t); else if (dir == 1) r = select(sockfd + 1, NULL, &fdset, NULL, &t); else throw SocketException(EINVAL, "Socket::wait"); if (r == -1) throw SocketException(errno, "select"); return r; } /// /// Binds the socket to the address associated with the object /// @see Socket::open /// void Socket::bind(void) { int r = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&r, sizeof(r)) == -1) #ifndef NDEBUG perror("setsockopt SO_REUSEADDR"); #else ; #endif if (::bind(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) { if(errno != EADDRINUSE) // EADDRINUSE == 48 throw SocketException(errno, "bind"); } } /// /// Binds the socket to the address associated with the object /// @see Socket::open /// void Socket::bindUDP(void) { #ifdef HAVE_GETADDRINFO struct addrinfo hints; struct addrinfo *res = NULL; struct addrinfo *ai_p = NULL; #ifdef __WIN32__ struct sockaddr_in *addr_in = NULL; struct sockaddr addr; #else struct sockaddr_in6 *addr_in = NULL; struct sockaddr_in6 addr; #endif int r = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&r, sizeof(r)) == -1) throw SocketException(r, "setsockopt SO_REUSEADDR"); memset(&hints, 0, sizeof(hints)); # ifdef AI_ADDRCONFIG hints.ai_flags = AI_ADDRCONFIG; # endif #ifdef __WIN32__ hints.ai_family = AF_INET; #else hints.ai_family = AF_INET6; #endif hints.ai_socktype = SOCK_DGRAM; //hints.ai_protocol = ainfo->ai_protocol; hints.ai_flags |= AI_NUMERICSERV; std::string port_io = address.get_service(); std::string addrStr = address.get_node(); if ((r = getaddrinfo(NULL, port_io.c_str(), &hints, &res)) < 0) throw SocketException(r, "getaddrinfo"); memset(&addr, 0, sizeof(addr)); #ifdef __WIN32__ addr_in = (sockaddr_in *) &addr; #else addr_in = (sockaddr_in6 *) &addr; #endif for(ai_p = res; ai_p != NULL; ai_p = ai_p->ai_next) { #ifdef __WIN32__ if (ai_p->ai_family == AF_INET) { #else if (ai_p->ai_family == AF_INET6) { #endif memcpy(addr_in, ai_p->ai_addr, sizeof(addr)); break; } } #ifdef __WIN32__ addr_in->sin_addr.s_addr = INADDR_ANY; #else addr_in->sin6_addr = in6addr_any; #endif if (::bind(sockfd, (const struct sockaddr *)&addr, sizeof(struct sockaddr)) == -1) { freeaddrinfo(res); throw SocketException(errno, "bind"); } freeaddrinfo(res); #else int r = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&r, sizeof(r)) == -1) #ifndef NDEBUG perror("setsockopt SO_REUSEADDR"); #else ; #endif #ifdef __WIN32__ struct sockaddr_in *addr; #else struct sockaddr_in6 *addr; #endif struct sockaddr_storage store_addr; memset(&store_addr, 0, sizeof(store_addr)); #ifdef __WIN32__ memcpy(&store_addr, ainfo->ai_addr, sizeof(struct sockaddr_in)); addr = (struct sockaddr_in *) &store_addr; addr->sin_addr.s_addr = INADDR_ANY; #else memcpy(&store_addr, ainfo->ai_addr, sizeof(struct sockaddr_in6)); addr = (struct sockaddr_in6 *) &store_addr; addr->sin6_addr.s6_addr = in6addr_any; #endif if (::bind(sockfd, (const struct sockaddr *)addr, sizeof(struct sockaddr)) == -1) throw SocketException(errno, "bind"); #endif } /// /// Calls listen(2) on the socket file desriptor /// /// The socket must already have been bound to an address via a call to the bind /// method. /// /// @params backlog The maximum number of pending connections (default SOMAXCONN) /// void Socket::listen(int backlog) { if (::listen(sockfd, backlog) == -1) throw SocketException(errno, "listen"); } /// /// Accepts a connection /// /// The socket must already have been bound to an address via a call to the bind /// method. /// /// @return A Socket instance for the accepted connection /// Socket Socket::accept(void) { connected_flag = false; Socket s; listen(); // wait for fd to become readable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(0)) throw SocketException(ETIMEDOUT, "select"); int r; if ((r = ::accept(sockfd, NULL, 0)) == -1) throw SocketException(errno, "accept"); set_close_on_exec(true, r); connected_flag = true; s = Socket(r); s.connected_flag = true; return s; } /// /// Accepts a single connection and then closes the listening socket /// @see Socket::accept /// /// @return A Socket instance for the accepted connection /// Socket Socket::accept1(void) { bind(); Socket s = accept(); close(); s.set_close_on_exec(true); return s; } /// /// Accepts a connection /// /// The socket must already have been bound to an address via a call to the bind /// method. /// /// @return A Socket instance pointer for the accepted connection /// Socket * Socket::accept2(void) { connected_flag = false; Socket * s = 0; listen(); // wait for fd to become readable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(0)) throw SocketException(ETIMEDOUT, "select"); int r; if ((r = ::accept(sockfd, NULL, 0)) == -1) return (Socket *)0; set_close_on_exec(true, r); connected_flag = true; s = new Socket(r); if(s) s->connected_flag = true; return s; } /// /// Connects the socket to the address that is associated with the object /// int Socket::connect(void) { connected_flag = false; int res = ::connect(sockfd, ainfo->ai_addr, ainfo->ai_addrlen); if (res == -1) { if (errno == 0 || errno == EISCONN) { LOG_VERBOSE("Connected to sockfd %d: %s : %s", sockfd, address.get_str(ainfo).c_str(), strerror(errno) ); connected_flag = true; return errno; } if (errno == EWOULDBLOCK || errno == EINPROGRESS || errno == EALREADY) { LOG_VERBOSE("Connect attempt to %s : %d, %s", address.get_str(ainfo).c_str(), errno, strerror(errno)); return errno; } LOG_ERROR("Connect to %s failed: %d, %s", address.get_str(ainfo).c_str(), errno, strerror(errno)); throw SocketException(errno, "connect"); } LOG_VERBOSE(" Connected to sockfd %d: %s", sockfd, address.get_str(ainfo).c_str()); connected_flag = true; return EISCONN; } /// /// Connects the socket to the address that is associated with the object /// Return connect state (T/F) /// bool Socket::connect1(void) { connected_flag = false; LOG_VERBOSE("Connecting to %s", address.get_str(ainfo).c_str()); if (::connect(sockfd, ainfo->ai_addr, ainfo->ai_addrlen) == -1) { return false; } connected_flag = true; return true; } /// /// Return T/F connected state. /// bool Socket::is_connected(void) { return connected_flag; } /// Set socket to allow for broadcasting. /// void Socket::broadcast(bool flag) { int option = 0; if(flag) option = 1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,(char *) &option, sizeof(option)); } /// /// Connects the socket to an address /// /// @param addr The address to connect to /// int Socket::connect(const Address& addr) { close(); open(addr); return connect(); } /// /// Sends a buffer /// /// @param buf /// @param len /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::send(const void* buf, size_t len) { // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(1)) { LOG_ERROR("Select failed on %d", sockfd); return 0; } size_t nToWrite = len; int r = 0; const char *sp = (const char *)buf; while ( nToWrite > 0) { #if defined(__WIN32__) r = ::send(sockfd, sp, nToWrite, 0); if (r > 0) { sp += r; nToWrite -= r; } else { if (r == 0) { shutdown(sockfd, SHUT_WR); throw SocketException(errno, "send"); } else if (r < 0) { switch(errno) { case EAGAIN: break; case ENOTCONN: case EBADF: default: throw SocketException(errno, "send"); } r = 0; } } #else r = ::write(sockfd, sp, nToWrite); if (r > 0) { sp += r; nToWrite -= r; } else { if (r == 0) { shutdown(sockfd, SHUT_WR); throw SocketException(errno, "send"); } else if (r == -1) { switch(errno) { case EAGAIN: case ENOTCONN: case EBADF: break; default: throw SocketException(errno, "send"); } r = 0; } } #endif } return r; } /// /// Sends a string /// /// @param buf /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::send(const std::string& buf) { size_t ret; try { ret = send(buf.data(), buf.length()); } catch (...) { throw; } return ret; } /// /// Receives data into a buffer /// /// @arg buf /// @arg len The maximum number of bytes to write to buf. /// /// @return The amount of data that was received. This may be less than len /// if the socket is non-blocking. size_t Socket::recv(void* buf, size_t len) { // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(0)) { return 0; } ssize_t r = 0; try { r = ::recv(sockfd, (char*)buf, len, 0); } catch (SocketException &e) { throw e; } if (r < 0) r = 0; return r; } /// /// Receives all available data and appends it to a string. /// /// @arg buf /// /// @return The amount of data that was received. /// size_t Socket::recv(std::string& buf) { ssize_t r = 0; // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) { if (!wait(0)) { buf.clear(); return 0; } } int tout = 2; try { buf.clear(); while (tout > 0) { memset(buffer, 0, S_BUFSIZ); r = ::recv(sockfd, buffer, S_BUFSIZ, 0); if (r > 0) buf.append(buffer); MilliSleep(50); tout--; } } catch (SocketException &e) { throw e; } return buf.length(); } /// /// Sends a buffer (UDP) /// /// @param buf /// @param len /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::sendTo(const void* buf, size_t len) { struct sockaddr * useAddr = (struct sockaddr *)0; size_t addr_size = 0; if(use_kiss_dual_port && *use_kiss_dual_port) { memset(&saddr_dp, 0, sizeof(saddr_dp)); memcpy(&saddr_dp, ainfo->ai_addr, ainfo->ai_addrlen); set_port((struct sockaddr *) &saddr_dp, dual_port_number); useAddr = (struct sockaddr * ) &saddr_dp; addr_size = ainfo->ai_addrlen; } else { useAddr = (struct sockaddr *) ainfo->ai_addr; addr_size = ainfo->ai_addrlen; } #ifndef NDEBUG { unsigned long host_addr = get_address4((struct sockaddr *)useAddr); unsigned int host_port = get_port((struct sockaddr *) useAddr); LOG_VERBOSE("HAP:%lX:%d count=%d buf=%s", host_addr, host_port, (int)len, (char*)buf); } #endif // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && ((timeout.tv_sec > 0) || (timeout.tv_usec > 0))) if (!wait(1)) return 0; size_t nToWrite = len; int r = 0; const char *sp = (const char *)buf; while ( nToWrite > 0) { try { r = ::sendto(sockfd, sp, nToWrite, 0, useAddr, addr_size); } catch (...) { throw; } if (r > 0) { sp += r; nToWrite -= r; } else { if (r == 0) { shutdown(sockfd, SHUT_WR); throw SocketException(errno, "send"); } else if (r == -1) { if (errno != EAGAIN && errno != 0) { LOG_VERBOSE("errno = %d (%s) r %d buff %s", errno, strerror(errno), r, sp); } r = 0; } } } return r; } /// /// Sends a string /// /// @param buf /// /// @return The amount of data that was sent. This may be less than len /// if the socket is non-blocking. /// size_t Socket::sendTo(const std::string& buf) { try { return sendTo(buf.data(), buf.length()); } catch (...) { throw; } } // // Get the port number from a sockaddr pointer // void Socket::set_port(struct sockaddr *sa, unsigned int port) { #ifdef __WIN32__ if (sa->sa_family == AF_INET) { struct sockaddr_in *saddr_in = (sockaddr_in *) sa; saddr_in->sin_port = htons(port); } #else if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *saddr_in = (sockaddr_in6 *) sa; saddr_in->sin6_port = htons(port); } #endif } // // Get the port number from a sockaddr pointer // unsigned int Socket::get_port(struct sockaddr *sa) { unsigned short int port_number = 0; #ifdef __WIN32__ if (sa->sa_family == AF_INET) { struct sockaddr_in *saddr_in = (sockaddr_in *) sa; port_number = (unsigned short int) saddr_in->sin_port; } #else if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *saddr_in = (sockaddr_in6 *) sa; port_number = (unsigned short int) saddr_in->sin6_port; } #endif return (unsigned int) ntohs(port_number); } // // Get the IP Address number from a sockaddr pointer // unsigned long Socket::get_address4(struct sockaddr *sa) { #ifdef __WIN32__ unsigned long IPAddr = 0; if (sa->sa_family == AF_INET) { struct sockaddr_in *saddr_in = (sockaddr_in *) sa; IPAddr = saddr_in->sin_addr.s_addr; } return (unsigned long) ntohl(IPAddr); #else return 0L; #endif } unsigned long Socket::get_to_address(void) { return (unsigned long) ntohl(inet_addr(address.get_node().c_str())); }; /// /// Receives data into a buffer (UDP) /// /// @arg buf /// @arg len The maximum number of bytes to write to buf. /// /// @return The amount of data that was received. This may be less than len /// if the socket is non-blocking. size_t Socket::recvFrom(void* buf, size_t len) { // if we have a nonblocking socket and a nonzero timeout, // wait for fd to become writeable if (nonblocking && (timeout.tv_sec > 0 || timeout.tv_usec > 0)) if (!wait(0)) return 0; struct sockaddr_storage temp_saddr; unsigned int temp_saddr_size; temp_saddr_size = sizeof(temp_saddr); memset(&temp_saddr, 0, temp_saddr_size); int r = 0; try { r = ::recvfrom(sockfd, (char *)buf, len, 0, (struct sockaddr *)&temp_saddr, (socklen_t *)&temp_saddr_size); if (r == 0) shutdown(sockfd, SHUT_RD); else if (r < 0) { if((errno == EAGAIN) || (errno == 0)) { if (errno) LOG_VERBOSE("ErrorNo: %d (%s)", errno, strerror(errno)); memset(buf, 0, len); return 0; } else { LOG_VERBOSE("ErrorNo: %d (%s)", errno, strerror(errno)); throw SocketException(errno, "recv"); } } } catch (...) { throw; } if(r > 0) { // To prevent loop back and except only from address x unsigned long srvr_addr = 0x7F000001L; unsigned long srvr_to_addr = get_to_address(); unsigned int srvr_dp_port = get_dual_port_number(); unsigned int srvr_port = get_local_port(); unsigned int local_port = get_local_port(); unsigned long host_addr = get_address4((struct sockaddr *)&temp_saddr); unsigned int host_port = get_port((struct sockaddr *)&temp_saddr); if(use_dual_port()) { srvr_port = srvr_dp_port; } if((srvr_port == host_port) && (srvr_to_addr == host_addr)) { if((srvr_addr == host_addr) && (local_port == host_port)) { LOG_VERBOSE("Loopback Warning: %X:%u", (unsigned int)host_addr, host_port); memset(buf, 0, len); return 0; } } } return r; } #ifdef USE_ME_ONCE_I_WORK /// /// Return the local Ip Address /// /// #ifdef __WIN32__ sockaddr_in * Socket::localIPAddress(void) #else sockaddr_in6 * Socket::localIPAddress(void) #endif { char buf[512]; #ifdef __WIN32__ static struct sockaddr_in localaddr; #else static struct sockaddr_in6 localaddr; #endif struct msghdr hmsg; struct cmsghdr *cmsg; struct in_pktinfo *pkt = 0; unsigned char *cdat = 0; memset(&hmsg, 0, sizeof(hmsg)); memset(&cmsg, 0, sizeof(cmsg)); hmsg.msg_name = &localaddr; hmsg.msg_namelen = sizeof(localaddr); hmsg.msg_control = buf; hmsg.msg_controllen = sizeof(buf); size_t st = ::recvmsg(sockfd, &hmsg, 0); if(CMSG_FIRSTHDR(&hmsg)) { cmsg = CMSG_FIRSTHDR(&hmsg); for (; cmsg != NULL; cmsg = CMSG_NXTHDR(&hmsg, cmsg)) { if (cmsg->cmsg_level != IPPROTO_IP || cmsg->cmsg_type != IP_PKTINFO) { continue; } cdat = CMSG_DATA(cmsg); pkt = (struct in_pktinfo *) cdat; } } } #endif /// /// Receives all available data and appends it to a string. /// /// @arg buf /// /// @return The amount of data that was received. /// size_t Socket::recvFrom(std::string& buf) { size_t n = 0; ssize_t r; try { while ((r = recvFrom(buffer, S_BUFSIZ)) > 0) { buf.reserve(buf.length() + r); buf.append(buffer, r); n += r; } } catch (...) { throw; } return n; } /// /// Signal to unblock sockets /// /// void Socket::shut_down(void) { ::shutdown(sockfd, SHUT_RDWR); } /// /// Retrieves the socket's receive or send buffer size /// /// @param dir Specifies the I/O direction. 0 is input, 1 is output. /// int Socket::get_bufsize(int dir) { int len; if (::get_bufsize(sockfd, dir, &len) == -1) throw SocketException(errno, "get_bufsize"); return len; } /// /// Sets the socket's receive or send buffer size /// /// @param dir Specifies the I/O direction. 0 is input, 1 is output. /// @param len Specifies the new buffer size /// void Socket::set_bufsize(int dir, int len) { if (::set_bufsize(sockfd, dir, len) == -1) throw SocketException(errno, "set_bufsize"); } /// /// Sets the socket's blocking mode /// /// @param v If true, the socket is set to non-blocking /// void Socket::set_nonblocking(bool v) { if (set_nonblock(sockfd, v) == -1) throw SocketException(errno, "set_nonblock"); nonblocking = v; } /// /// Enables the use of Nagle's algorithm for the socket /// /// @param v If true, Nagle's algorithm is disabled. /// void Socket::set_nodelay(bool v) { if (::set_nodelay(sockfd, v) == -1) throw SocketException(errno, "set_nodelay"); } /// /// Sets the timeout associated with non-blocking operations /// /// @param t /// void Socket::set_timeout(const struct timeval& t) { timeout.tv_sec = t.tv_sec; timeout.tv_usec = t.tv_usec; } void Socket::set_timeout(double t) { timeout.tv_sec = (time_t)floor(t); timeout.tv_usec = (suseconds_t)((t - timeout.tv_sec) * 1e6); } /// /// Sets the socket's autoclose mode. /// /// If autoclose is disabled, the socket file descriptor will not be closed when /// the Socket object is destructed. /// /// @param v If true, the socket will be closed by the destructor /// void Socket::set_autoclose(bool v) const { autoclose = v; } /// /// Sets the socket's close-on-exec flag /// void Socket::set_close_on_exec(bool v, int fd) { if (fd == -1) fd = sockfd; if (set_cloexec(fd, v) == -1) throw SocketException(errno, "set_cloexec"); } /// /// Returns the Socket's file descriptor. /// /// The descriptor should only be used for reading and writing. /// /// @return the socket file descriptor /// int Socket::fd(void) { return sockfd; } fldigi-4.2.05/src/network/weather.cxx0000664000175000017500000000423014611711171014425 00000000000000// ---------------------------------------------------------------------------- // weather.cxx -- a part of fldigi // // Copyright (C) 2012 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #ifdef __MINGW32__ # include "compat.h" #endif #include #include "signal.h" #include #include #include #include #include #include "threads.h" #include "misc.h" #include "configuration.h" #include "main.h" #include "confdialog.h" #include "fl_digi.h" #include "trx.h" #include "xmlreader.h" #include "qrunner.h" #include "debug.h" #include "network.h" #include "weather.h" #include "metar.h" void getwx(std::string& wx, std::string wxsta) { std::string metar; if (wxsta.empty()) metar = progdefaults.wx_sta; else metar = wxsta; for (size_t n = 0; n < metar.length(); n++) metar[n] = toupper(metar[n]); Metar local_wx; local_wx.params( progdefaults.wx_inches, progdefaults.wx_mbars, progdefaults.wx_fahrenheit, progdefaults.wx_celsius, progdefaults.wx_mph, progdefaults.wx_kph, progdefaults.wx_condx, progdefaults.wx_station_name, progdefaults.wx_raw); local_wx.debug(true); if (local_wx.get(metar) == 0) { if (progdefaults.wx_full) { wx = local_wx.full(); return; } wx = local_wx.parsed(); } else wx.clear(); return; } void get_METAR_station() { cb_mnuVisitURL(0, (void*)std::string("http://www.rap.ucar.edu/weather/surface/stations.txt").c_str()); } fldigi-4.2.05/src/network/metar.cxx0000664000175000017500000002524714611711171014111 00000000000000// ---------------------------------------------------------------------------- // metar.cxx // // Copyright (C) 2019 // David Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include "metar.h" #include "debug.h" /*====================================================================== * * WEATHER The weather group * iiddppooxx * ii is intensity group * ii Description * - light * moderate * + heavy * VC in the vicinity * * dd is the descriptor group * dd Description * MI shallow * PR partial * BC patches * DR low drifting * BL blowing * SH shower * TS thunderstorm * FZ freezing * * pp is the precipitation group * pp Description * DZ drizzle * RA rain * SN snow * SG snow grains * IC ice crystals * PE ice pellets * GR hail * GS small hail/snow pellets * UP unknown * * oo is the obscuration group * oo Description * BR mist * FG fog * FU smoke * VA volcanic ash * DU dust * SA sand * HZ haze * PY spray * * xx is the misc group * xx Description * PO dust whirls * SQ squalls * FC funnel cloud/tornado/waterspout * SS duststorm * * CLOUDS * The cloud levels * ccchhhtt * ccc is the coverage * CLR or SKC = clear * FEW = 1/8 coverage * SCT = 2,3,4/8 coverage * BKN = 5,6,7/8 coverage * OVC = overcast * VV = vertical visibility for obscuration * hhh is the height of base in 30m or 100ft increments. ie 30 = 3000 feet * tt is an optional type * CU = cumulus * CB = cumulonumbus * TCU = towering cumulus * CI = cirrus */ struct wxpairs {const char *grp; const char *name;}; static wxpairs precip[] = { {"DZ", "drizzle"}, {"RA", "rain"}, {"SN", "snow"}, {"SG", "snow grains"}, {"IC", "ice crystals"}, {"PE", "ice pellets"}, {"GR", "hail"}, {"GS", "small hail / show pellets"}, {"UP", "unknown"}, {NULL, NULL} }; static wxpairs intensity[] = { {"-", "light"}, {"+", "heavy"}, {"VC", "in the vicinity"}, {NULL, NULL} }; static wxpairs descriptor[] = { {"MI", "shallow "}, {"PR", "partial"}, {"BC", "patches"}, {"DR", "low drifting"}, {"BL", "blowing"}, {"SH", "shower"}, {"TS", "thunderstorm"}, {"FZ", "freezing"}, {NULL, NULL} }; static wxpairs obscure[] = { {"BR", "mist"}, {"FG", "fog"}, {"FU", "smoke"}, {"VA", "volcanic ash"}, {"DU", "dust"}, {"SA", "sand"}, {"HZ", "haze"}, {"PY", "spray"}, {NULL, NULL} }; static wxpairs misc[] = { {"PO", "dust whirls"}, {"SQ", "squalls"}, {"FC", "funnel cloud/tornado/waterspout"}, {"SS", "duststorm"}, {NULL, NULL} }; static wxpairs clouds[] = { {"CLR", "clear skies"}, {"SKC", "clear skies"}, {"FEW", "few clouds"}, {"SCT", "scattered clouds"}, {"BKN", "broken cloud cover"}, {"OVC", "overcast"}, {NULL, NULL} }; static wxpairs cloud_type[] = { {"CU", "cumulus"}, {"CB", "cumulonumbus"}, {"TCU", "towering cumulus"}, {"CI", "cirrus"}, {NULL, NULL} }; #define METAR_DEBUG 1 void Metar::parse() { size_t p, p1, p2, p3; if (METAR_DEBUG) LOG_DEBUG("%s", _metar_text.c_str()); p = _metar_text.find(_metar_station); if (p == std::string::npos) { _wx_text_full.assign(_metar_station).append(" not found in url response!"); _wx_text_full.append("\n").append(_metar_text).append("\n"); return; } const char *cl = "Content-Length:"; int content_length; p1 = _metar_text.find(cl); if (p1 != std::string::npos) { content_length = atol(&_metar_text[p1 + strlen(cl)]); _metar_text.erase(0, _metar_text.length() - content_length); } else { p2 = _metar_text.find("("); if (p2 != std::string::npos) { p3 = _metar_text.rfind("\n", p2); if (p3 != std::string::npos) _metar_text.erase(0,p3 + 1); } else while ( (p2 = _metar_text.find("\r\n")) != std::string::npos) _metar_text.erase(0, p2 + 2); } p1 = _metar_text.find("\n"); _station_name = _metar_text.substr(0, p1); if ((p2 = _station_name.find("(")) != std::string::npos) _station_name.erase(p2 - 1); p3 = _metar_text.find("ob:"); if (p3 == std::string::npos) { _wx_text_full.assign(_metar_station).append(" observations not available"); _wx_text_parsed.assign(_wx_text_full); return; } _wx_text_full.assign(_metar_text);//.substr(0, p3)); // METAR report is now _metar_text std::string metar_report = _metar_text.substr(p3); p = metar_report.find(_metar_station); if (p != std::string::npos) metar_report.erase(0, p); p = metar_report.find("\n"); if (p != std::string::npos) metar_report.erase(p); if (METAR_DEBUG) LOG_INFO("%s", metar_report.c_str()); p = _metar_text.find(_metar_station, p3 + 1); _metar_text.erase(0, p + 1 + _metar_station.length()); p = _metar_text.find("\n"); if (p != std::string::npos) _metar_text.erase(p); // parse field contents bool parsed = false; _conditions.clear(); while(_metar_text.length()) { // each ob: field is separated by a space or end of file parsed = false; p = _metar_text.find(" "); if (p != std::string::npos) { _field = _metar_text.substr(0, p); _metar_text.erase(0, p+1); } else { _field = _metar_text; _metar_text.clear(); } if (_field == "RMK") break; // parse for general weather // iiddppooxx if (_field == "AUTO") ; else if ((p = _field.rfind("KT")) != std::string::npos) { if (p == _field.length() - 2) { // wind dir / speed int knots; _winds.clear(); if (sscanf(_field.substr(3,2).c_str(), "%d", &knots) == 1) { _winds.append(_field.substr(0,3)).append(" at "); char ctemp[10]; if (_mph) { snprintf(ctemp, sizeof(ctemp), "%d mph ", (int)ceil(knots * 600.0 / 528.0 )); _winds.append(ctemp); } if (_kph) { snprintf(ctemp, sizeof(ctemp), "%d km/h ", (int)ceil(knots * 600.0 * 1.6094 / 528.0)); _winds.append(ctemp); } } } } else if ((p = _field.rfind("MPS")) != std::string::npos) { if (p == _field.length() - 3) { // wind dir / speed in meters / second int mps; _winds.clear(); if (sscanf(_field.substr(3,2).c_str(), "%d", &mps) == 1) { _winds.append(_field.substr(0,3)).append(" at "); char ctemp[10]; if (_mph) { snprintf(ctemp, sizeof(ctemp), "%d mph ", (int)ceil(mps * 2.2369)); _winds.append(ctemp); } if (_kph) { snprintf(ctemp, sizeof(ctemp), "%d km/h ", (int)ceil(mps * 3.6)); _winds.append(ctemp); } } } } else if ((p = _field.find("/") ) != std::string::npos) { // temperature / dewpoint std::string cent = _field.substr(0, p); if (cent[0] == 'M') cent[0] = '-'; int tempC, tempF; _temp.clear(); if (sscanf(cent.c_str(), "%d", &tempC) == 1) { tempF = (int)(tempC * 1.8 + 32); char ctemp[10]; if (_fahrenheit) { snprintf(ctemp, sizeof(ctemp), "%d F ", tempF); _temp.append(ctemp); } if (_celsius) { snprintf(ctemp, sizeof(ctemp), "%d C", tempC); _temp.append(ctemp); } } } else if ((_field[0] == 'A' && _field.length() == 5) || _field[0] == 'Q') { float inches; _baro.clear(); if (sscanf(_field.substr(1).c_str(), "%f", &inches) == 1) { if (_field[0] == 'A') inches /= 100.0; else inches /= 33.87; char ctemp[20]; if (_inches) { snprintf(ctemp, sizeof(ctemp), "%.2f in. Hg ", inches); _baro.append(ctemp); } if (_mbars) { snprintf(ctemp, sizeof(ctemp), "%.0f mbar", floor(inches * 33.87)); _baro.append(ctemp); } } } if (!parsed) { for (wxpairs *pp = precip; pp->grp != NULL; pp++) { if (_field.find(pp->grp) != std::string::npos) { // found a precip group wxpairs *ii, *dd, *oo, *xx; for (ii = intensity; ii->grp != NULL; ii++) if (_field.find(ii->grp) != std::string::npos) break; for (dd = descriptor; dd->grp != NULL; dd++) if (_field.find(dd->grp) != std::string::npos) break; for (oo = obscure; oo->grp != NULL; oo++) if (_field.find(oo->grp) != std::string::npos) break; for (xx = misc; xx->grp != NULL; xx++) if (_field.find(xx->grp) != std::string::npos) break; if (ii->grp != NULL) _conditions.append(ii->name).append(" "); if (dd->grp != NULL) _conditions.append(dd->name).append(" "); _conditions.append(pp->name); if (oo->grp != NULL) _conditions.append(", ").append(oo->name); if (xx->grp != NULL) _conditions.append(", ").append(xx->name); parsed = true; } } } if (!parsed) { wxpairs *oo; for (oo = obscure; oo->grp != NULL; oo++) if (_field.find(oo->grp) != std::string::npos) break; if (oo->grp != NULL) { _conditions.append(" ").append(oo->name); parsed = true; } } if (!parsed) { // parse for cloud cover // use only the first occurance of sky cover report; it is lowest altitude // cloud cover is reported multiple times for sounding stations for (wxpairs *cc = clouds; cc->grp != NULL; cc++) { if (_field.find(cc->grp) != std::string::npos) { if (_conditions.find(cc->name) != std::string::npos) break; if (_conditions.empty()) _conditions.append(cc->name); else _conditions.append(", ").append(cc->name); wxpairs *ct; for (ct = cloud_type; ct->grp != NULL; ct++) { if (_field.find(ct->grp) != std::string::npos) { if (ct->grp != NULL) _conditions.append(" ").append(ct->name); break; } } parsed = true; break; } } } } _wx_text_parsed.clear(); if (_name && !_station_name.empty()) { _wx_text_parsed.append("Loc: ").append(_station_name).append("\n"); } if (_condx && !_conditions.empty()) { _wx_text_parsed.append("Cond: ").append(_conditions).append("\n"); } if ((_mph || _kph) && !_winds.empty()){ _wx_text_parsed.append("Wind: ").append(_winds).append("\n"); } if ((_fahrenheit || _celsius) && !_temp.empty() ) { _wx_text_parsed.append("Temp: ").append(_temp).append("\n"); } if ((_inches || _mbars) && !_baro.empty()) { _wx_text_parsed.append("Baro: ").append(_baro).append("\n"); } if ((_wx_raw) && !metar_report.empty()) { _wx_text_parsed.append(metar_report); if (METAR_DEBUG) LOG_INFO("%s", _wx_text_parsed.c_str()); } return; } int Metar::get() { std::string metar_url = "https://tgftp.nws.noaa.gov/data/observations/metar/decoded/"; metar_url.append(_metar_station).append(".TXT"); int ret = url.get(metar_url, _metar_text); if (ret == 0) parse(); return ret; } fldigi-4.2.05/src/blank/0000775000175000017500000000000014611714005011720 500000000000000fldigi-4.2.05/src/blank/blank.h0000664000175000017500000000357014532252172013111 00000000000000// ---------------------------------------------------------------------------- // BLANK.h -- BASIS FOR ALL MODEMS // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #ifndef _BLANK_H #define _BLANK_H #include "trx.h" #include "modem.h" #include "fft.h" #include "filters.h" #include "complex.h" #define BLANKSampleRate 8000 #define SYMLEN 512 #define BLANK_BW 100 #define BUFFLEN 4096 #define SCOPE_DATA_LEN 1024 // lp filter //#define DEC_1 8 //#define FIRLEN_1 256 //#define BW_1 10 // NASA coefficients for viterbi encode/decode algorithms //#define K 7 //#define POLY1 0x6d //#define POLY2 0x4f class BLANK : public modem { protected: double phaseacc; double phaseincr; C_FIR_filter *bandpass; C_FIR_filter *lowpass; C_FIR_filter *hilbert; Cmovavg *moving_avg; sfft *slidingfft; int symlen; // receive double *scope_data; double *inbuf; // transmit int txstate; double *outbuf; unsigned int buffptr; public: BLANK(); ~BLANK(); void init(); void rx_init(); void tx_init(SoundBase *sc); void restart(); int rx_process(const double *buf, int len); int tx_process(); void update_syncscope(); }; #endif fldigi-4.2.05/src/blank/blank.cxx0000664000175000017500000001113314611711171013453 00000000000000// ---------------------------------------------------------------------------- // blank.cxx -- BLANK modem // // Copyright (C) 2006 // Dave Freese, W1HKJ // // This file is part of fldigi. Adapted from code contained in gMFSK source code // distribution. // gMFSK Copyright (C) 2001, 2002, 2003 // Tomi Manninen (oh2bns@sral.fi) // // Fldigi is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Fldigi is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with fldigi. If not, see . // ---------------------------------------------------------------------------- #include #include #include #include "BLANK.h" #include "ascii.h" char BLANKmsg[80]; void BLANK::tx_init() { } void BLANK::rx_init() { put_MODEstatus(mode); } void BLANK::init() { modem::init(); rx_init(); digiscope->mode(Digiscope::SCOPE); } BLANK::~BLANK() { delete bandpass; delete hilbert; delete lowpass; delete sliding; delete [] scope_data; delete [] out_buf; delete [] in_buf; } BLANK::BLANK(trx_mode BLANK_mode) : modem() { double cf, flo, fhi; mode = BLANK_mode; symlen = SYMLEN; bandwidth = BLANK_BW; samplerate = BLANKSampleRate; flo = LP_F1 / corrRxSampleRate(); lowpass = new C_FIR_filter(); lowpass->init_lowpass (LP_FIRLEN, LP_DEC, flo ); flo = BP_F1 / corrRxSampleRate(); fhi = BP_F2 / corrRxSampleRate(); bandpass = new C_FIR_filter(); bandpass->init_bandpass (BP_FIRLEN, BP_DEC, flo, fhi ); hilbert = new C_FIR_filter(); hilbert->init_hilbert(37, 1); sliding = new sfft (SL_LEN, SL_F1, SL_F2); // all integer values scope_data = new double [SCOPE_DATA_LEN]; out_buf = new double [SYMLEN]; in_buf = new double [BUFLEN]; // init(); } //===================================================================== // receive processing //===================================================================== void BLANK::recvchar(int c) { if (c == -1) return; put_rx_char(c); } void BLANK::decodesymbol(unsigned char symbol) { } complex BLANK::mixer(complex in, double f) { complex z; // f may have to be modified z = in * complex( cos(phaseacc), sin(phaseacc) ); phaseacc -= TWOPI * f / corrRxSampleRate(); if (phaseacc < 0) phaseacc += TWOPI; return z; } void BLANK::update_syncscope() { int j; memset(scopedata, 0, 2 * SCOPE_DATA_LEN); if (!squelchon || metric >= squelch) for (int i = 0; i < 2 * symlen; i++) { // j = (i + pipeptr) % (2 * symlen); // scopedata[i] = (pipe[j].vector[prev1symbol]).mag(); } set_scope(scope_data, SCOPE_DATA_LEN); } void BLANK::afc() { complex z; double x; if (metric < squelch) return; // adjust "frequency" iaw with afc processing } int BLANK::rx_process(const double *buf, int len) { complex z; int i; while (len-- > 0) { // create analytic signal... z.re = z.im = *buf++; hbfilt->run ( z, z ); // shift in frequency to the base freq of 1000 hz z = mixer(z, frequency); // bandpass filter around the shifted center frequency // with required bandwidth bandpass->run ( z, z ); // binsfft->run(z) copies frequencies of interest complex dummy ; sliding->run (z, &dummy, 0 ); // etc decodesymbol(); update_syncscope(); afc(); } return 0; } //===================================================================== // transmit processing //===================================================================== void BLANK::sendchar(unsigned char c) { // need to generate the outbuf ModulateXmtr(outbuf, symlen); put_echo_char(c); } void sendidle() { } int BLANK::tx_process() { int xmtbyte; switch (txstate) { case TX_STATE_PREAMBLE: for (int i = 0; i < 32; i++) sendbit(0); txstate = TX_STATE_START; break; case TX_STATE_START: sendchar('\r'); sendchar(2); // STX sendchar('\r'); txstate = TX_STATE_DATA; break; case TX_STATE_DATA: xmtbyte = get_tx_char(); if (xmtbyte == GET_TX_CHAR_NODATA) sendidle(); else if ( xmtbyte == GET_TX_CHAR_ETX || stopflag) txstate = TX_STATE_FLUSH; else sendchar(xmtbyte); break; case TX_STATE_FLUSH: sendchar('\r'); sendchar(4); // EOT sendchar('\r'); flushtx(); stopflag = false; // tell trx process that xmt is done return -1; default: break; } return 0; } fldigi-4.2.05/Makefile.am0000664000175000017500000000066014532252172012024 00000000000000ACLOCAL_AMFLAGS = -I m4 -I m4/intl # AC_CONFIG_MACRO_DIR([m4]) SUBDIRS = po doc src if HAVE_FLUID flgen: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif if DARWIN appbundle: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif if HAVE_NSIS nsisinst: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif if WANT_FLDIGI if ENABLE_HAMLIB hamlib-static: @(cd src && $(MAKE) $(AM_MAKEFLAGS) $@) endif endif EXTRA_DIST = build-aux/config.rpath fldigi-4.2.05/build-aux/0000775000175000017500000000000014611714004011733 500000000000000fldigi-4.2.05/build-aux/config.sub0000755000175000017500000010511614463050426013646 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x$basic_os != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read kernel os <&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os in linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ | linux-musl* | linux-relibc* | linux-uclibc* ) ;; uclinux-uclibc* ) ;; -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 exit 1 ;; kfreebsd*-gnu* | kopensolaris*-gnu*) ;; vxworks-simlinux | vxworks-simwindows | vxworks-spe) ;; nto-qnx*) ;; os2-emx) ;; *-eabi* | *-gnueabi*) ;; -*) # Blank kernel with real OS is always fine. ;; *-*) echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fldigi-4.2.05/build-aux/missing0000755000175000017500000001533614463050426013266 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2021 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fldigi-4.2.05/build-aux/install-sh0000755000175000017500000003577614463050426013705 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Email bug reports to bug-automake@gnu.org. Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fldigi-4.2.05/build-aux/depcomp0000755000175000017500000005602014463050426013237 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fldigi-4.2.05/build-aux/compile0000755000175000017500000001635014463050426013242 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fldigi-4.2.05/build-aux/config.guess0000755000175000017500000014051214463050426014202 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-09' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2022 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # Just in case it came from the environment. GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case $UNAME_VERSION in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; sun4*:SunOS:*:*) case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case `/bin/arch` in sun3) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if test -x /usr/bin/lslpp ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if test "$HP_ARCH" = hppa2.0w then set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_X32 >/dev/null then LIBCABI=${LIBC}x32 fi fi GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. GUESS=i386-sequent-sysv4 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; x86_64:Haiku:*:*) GUESS=x86_64-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "${cputype-}" = 386; then UNAME_MACHINE=i386 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) #include #if defined (BSD) #if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); #else #if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); #else printf ("vax-dec-bsd\n"); exit (0); #endif #endif #else printf ("vax-dec-bsd\n"); exit (0); #endif #else #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fldigi-4.2.05/build-aux/config.rpath0000775000175000017500000004421614611711171014174 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2020 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's _LT_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; mingw* | cygwin* | pw32* | os2* | cegcc*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in ecc*) wl='-Wl,' ;; icc* | ifort*) wl='-Wl,' ;; lf95*) wl='-Wl,' ;; nagfor*) wl='-Wl,-Wl,,' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; xl* | bgxl* | bgf* | mpixl*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) wl= ;; *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; newsos6) ;; *nto* | *qnx*) ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) wl='-Qoption ld ' ;; *) wl='-Wl,' ;; esac ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's _LT_LINKER_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; haiku*) ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then : else ld_shlibs=no fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd2.[01]*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) case "$host_cpu" in powerpc*) library_names_spec='$libname$shrext' ;; m68k) library_names_spec='$libname.a' ;; esac ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32* | cegcc*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd[23].*) library_names_spec='$libname$shrext$versuffix' ;; freebsd* | dragonfly*) library_names_spec='$libname$shrext' ;; gnu*) library_names_spec='$libname$shrext' ;; haiku*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; *nto* | *qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; tpf*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <"$log_file" "$@" >>"$log_file" 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>"$log_file" # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: fldigi-4.2.05/po/0000775000175000017500000000000014611714004010457 500000000000000fldigi-4.2.05/po/es.po0000664000175000017500000105743614611714003011365 00000000000000# Spanish translations for fldigi package # Traducción al español para el paquete fldigi # # Copyright (C) 2008 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # # Spanish translators: # Pavel Milanes Costa, CO7WT, 2008..2014 # Christian W. Correa, HK4QWC, 2014 # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.02\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2024-04-23 06:14-0500\n" "PO-Revision-Date: 2014-11-18 22:43-0500\n" "Last-Translator: Pavel Milanes Costa \n" "Language-Team: Spanish (Pavel Milanes Costa) \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.5.4\n" #: src/main.cxx:1052 #, c-format msgid "%s log started on %s" msgstr "%s log iniciado a %s" #: src/main.cxx:1779 msgid "Bad modem id" msgstr "Identificador incorrecto de módem" #: src/main.cxx:1786 msgid "Bad frequency" msgstr "Frecuencia errónea" #: src/main.cxx:1909 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licencia GPLv3+: GNU GPL versión 3 o posterior \n" "Este software es de uso libre: usted es libre de modificarlo y " "redistribuirlo. \n" "No hay NINGUNA GARANTÍA, excepto la permitida por la ley.\n" #: src/main.cxx:2136 src/main.cxx:2178 src/main.cxx:2202 src/main.cxx:2216 msgid "Could not make directory " msgstr "No se pudo crear el directorio" #: src/debug/debug.cxx:88 msgid "Quiet" msgstr "Calmado" #: src/debug/debug.cxx:88 msgid "Error" msgstr "Error" #: src/debug/debug.cxx:88 msgid "Warning" msgstr "Advertencia" #: src/debug/debug.cxx:88 msgid "Info" msgstr "Info" #: src/debug/debug.cxx:88 msgid "Verbose" msgstr "Más explícito" #: src/debug/debug.cxx:88 src/dialogs/confdialog.cxx:15244 msgid "Debug" msgstr "Debug" #: src/dialogs/fl_digi.cxx:202 msgid "Log all RX/TX text" msgstr "Guardar todo el texto de TX/RX" #: src/dialogs/fl_digi.cxx:204 src/dialogs/fl_digi.cxx:7622 msgid "Op &Mode" msgstr "&Modos" #: src/dialogs/fl_digi.cxx:205 msgid "Show fewer modes" msgstr "Mostrar menos modos" #: src/dialogs/fl_digi.cxx:206 msgid "Show all modes" msgstr "Mostrar todos los modos" #: src/dialogs/fl_digi.cxx:210 msgid "&View" msgstr "&Vista" #: src/dialogs/fl_digi.cxx:211 #, fuzzy msgid "MFSK Image" msgstr "Imagen &MFSK" #: src/dialogs/fl_digi.cxx:212 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:213 #, fuzzy msgid "IFKP Raw Image" msgstr "Imagen &MFSK" #: src/dialogs/fl_digi.cxx:214 #, fuzzy msgid "Weather Fax Image TX" msgstr "&TX Imagen de Fax meteorológico" #: src/dialogs/fl_digi.cxx:215 src/dialogs/confdialog.cxx:10746 #: src/logbook/lgbook.cxx:1293 msgid "Contest" msgstr "Concurso" #: src/dialogs/fl_digi.cxx:216 msgid "C&ountries" msgstr "&Países" #: src/dialogs/fl_digi.cxx:217 msgid "&UI" msgstr "I&U" #: src/dialogs/fl_digi.cxx:218 msgid "Full" msgstr "Completo" #: src/dialogs/fl_digi.cxx:219 msgid "Partial" msgstr "" #: src/dialogs/fl_digi.cxx:220 src/waterfall/waterfall.cxx:2595 #: src/dialogs/confdialog.cxx:9908 src/dialogs/confdialog.cxx:9997 #: src/dialogs/confdialog.cxx:19028 msgid "None" msgstr "Ninguno" #: src/dialogs/fl_digi.cxx:221 msgid "Docked scope" msgstr "Osciloscopio empotrado" #: src/dialogs/fl_digi.cxx:222 msgid "Minimal controls" msgstr "Controles mínimos" #: src/dialogs/fl_digi.cxx:223 msgid "Show channels" msgstr "Mostrar canales" #: src/dialogs/fl_digi.cxx:225 msgid "Connect to server" msgstr "Conectar con el servidor" #: src/dialogs/fl_digi.cxx:1050 src/dialogs/fl_digi.cxx:1079 #: src/dialogs/fl_digi.cxx:1089 src/dialogs/fl_digi.cxx:5976 #: src/dialogs/fl_digi.cxx:6069 src/dialogs/fl_digi.cxx:6146 #: src/dialogs/fl_digi.cxx:7650 src/dialogs/fl_digi.cxx:7719 #: src/dialogs/fl_digi.cxx:7796 msgid "Custom..." msgstr "Personalizar..." #: src/dialogs/fl_digi.cxx:1147 src/dialogs/confdialog.cxx:369 #: src/dialogs/confdialog.cxx:10673 src/dialogs/confdialog.cxx:10739 #, fuzzy msgid "Colors-Fonts" msgstr "Colores y tipografía" #: src/dialogs/fl_digi.cxx:1148 src/dialogs/confdialog.cxx:370 #: src/dialogs/confdialog.cxx:11067 #, fuzzy msgid "Contests" msgstr "Concurso" #: src/dialogs/fl_digi.cxx:1149 src/dialogs/confdialog.cxx:371 #: src/dialogs/confdialog.cxx:11338 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:1150 src/dialogs/confdialog.cxx:372 #: src/dialogs/confdialog.cxx:11810 src/dialogs/confdialog.cxx:11896 #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14240 msgid "Logging" msgstr "Registro de QSO" #: src/dialogs/fl_digi.cxx:1151 #, fuzzy msgid "Modem/CW" msgstr "Módem" #: src/dialogs/fl_digi.cxx:1152 #, fuzzy msgid "Modem/TTY" msgstr "Módem" #: src/dialogs/fl_digi.cxx:1153 src/waterfall/waterfall.cxx:2597 #: src/dialogs/confdialog.cxx:373 msgid "Modem" msgstr "Módem" #: src/dialogs/fl_digi.cxx:1154 src/dialogs/confdialog.cxx:374 #: src/dialogs/confdialog.cxx:17169 msgid "Misc" msgstr "Misc." #: src/dialogs/fl_digi.cxx:1155 src/dialogs/confdialog.cxx:375 #: src/dialogs/confdialog.cxx:18303 src/dialogs/confdialog.cxx:18366 #, fuzzy msgid "Rig Control" msgstr "Control del radio" #: src/dialogs/fl_digi.cxx:1156 src/dialogs/confdialog.cxx:376 #: src/dialogs/confdialog.cxx:18974 #, fuzzy msgid "Soundcard" msgstr "Dispositivo de sonido" #: src/dialogs/fl_digi.cxx:1157 src/dialogs/confdialog.cxx:377 #: src/dialogs/confdialog.cxx:19497 msgid "UI" msgstr "IU" #: src/dialogs/fl_digi.cxx:1158 src/dialogs/fl_digi.cxx:6238 #: src/dialogs/confdialog.cxx:378 src/dialogs/confdialog.cxx:13939 #: src/dialogs/confdialog.cxx:20045 msgid "Waterfall" msgstr "Cascada" # Considero que debemos dejar este texto como "Web" ya que esta pestaña refiere a la consulta de servicios via web (@HK4QWC) #: src/dialogs/fl_digi.cxx:1159 src/dialogs/confdialog.cxx:379 #: src/dialogs/confdialog.cxx:20245 msgid "Web" msgstr "Web" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4547 msgid "Save changed macros?" msgstr "¿Guardar macros modificadas?" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4134 #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 #: src/logbook/logsupport.cxx:1205 src/misc/configuration.cxx:726 #: src/dialogs/font_browser.cxx:173 src/logbook/lgbook.cxx:837 #: src/logbook/lgbook.cxx:1647 msgid "Cancel" msgstr "Cancelar" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:6250 #: src/logbook/logsupport.cxx:330 src/logbook/logsupport.cxx:1204 #: src/dialogs/confdialog.cxx:13194 src/dialogs/confdialog.cxx:15191 #: src/dialogs/confdialog.cxx:20248 msgid "Save" msgstr "Guardar" #: src/dialogs/fl_digi.cxx:1622 msgid "Don't save" msgstr "No guardar" #: src/dialogs/fl_digi.cxx:1771 msgid "Switch to ARQ I/O" msgstr "" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "No" msgstr "No" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "Yes" msgstr "Si" #: src/dialogs/fl_digi.cxx:2630 msgid "Playback continuous loop?" msgstr "¿Reproducir en un lazo continuo?" #: src/dialogs/fl_digi.cxx:2635 #, fuzzy msgid "Unsupported audio format" msgstr "Formato no soportado" #: src/dialogs/fl_digi.cxx:2642 msgid "Spotting disabled" msgstr "Spotting deshabilitado" #: src/dialogs/fl_digi.cxx:2694 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "No se pudo ejecutar un navegador web:\n" "%s\n" "\n" "Abra esta URL manualmente:\n" "%s" #: src/dialogs/fl_digi.cxx:2707 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "No se pudo abrir la URL:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2790 msgid "Checking for updates..." msgstr "Comprobando si hay actualizaciones..." #: src/dialogs/fl_digi.cxx:2794 msgid "Update site not available" msgstr "" #: src/dialogs/fl_digi.cxx:2806 msgid "You are running the latest version" msgstr "Está utilizando la versión más reciente" #: src/dialogs/fl_digi.cxx:2810 #, fuzzy msgid "You are probably running an alpha version " msgstr "Está utilizando la versión más reciente" #: src/dialogs/fl_digi.cxx:2811 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2816 #, fuzzy, c-format msgid "Version %s is available at Source Forge" msgstr "" "La versión %s está disponible en\n" "\n" "%s\n" "\n" "¿Qué desea hacer?" #: src/dialogs/fl_digi.cxx:2885 msgid "Sunspot creation underway!" msgstr "¡Creación de un sunspot en proceso!" #: src/dialogs/fl_digi.cxx:2892 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "La información del dispositivo de audio está solo disponible cuando se usa " "PortAudio como método de comunicación con el dispositivo" #: src/dialogs/fl_digi.cxx:2901 msgid "Capture device" msgstr "Dispositivo de captura" #: src/dialogs/fl_digi.cxx:2902 msgid "Playback device" msgstr "Dispositivo de reproducción" #: src/dialogs/fl_digi.cxx:2906 msgid "Capture and playback devices" msgstr "Dispositivo de captura y reproducción" #: src/dialogs/fl_digi.cxx:2952 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: No existe, ¿crear?" #: src/dialogs/fl_digi.cxx:4134 msgid "Clear log fields?" msgstr "¿Limpiar los campos del registro?" #: src/dialogs/fl_digi.cxx:4134 src/misc/configuration.cxx:726 #: src/logbook/lgbook.cxx:834 src/logbook/lgbook.cxx:1644 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 msgid "Confirm" msgstr "Confirmar" #: src/dialogs/fl_digi.cxx:4539 msgid "Save changed configuration?" msgstr "¿Guardar los cambios en la configuración?" #: src/dialogs/fl_digi.cxx:4555 src/dialogs/fl_digi.cxx:4580 msgid "Save log entry?" msgstr "¿Guardar los datos del contacto actual en el registro?" #: src/dialogs/fl_digi.cxx:4571 msgid "Confirm Quit" msgstr "Confirmar Salir" #: src/dialogs/fl_digi.cxx:4593 msgid "Confirm quit?" msgstr "¿Confirmar salir?" #: src/dialogs/fl_digi.cxx:5915 src/dialogs/fl_digi.cxx:7618 msgid "&File" msgstr "&Archivo" #: src/dialogs/fl_digi.cxx:5917 msgid "Folders" msgstr "Carpetas" #: src/dialogs/fl_digi.cxx:5918 msgid "Fldigi config..." msgstr "Configuración de Fldigi..." #: src/dialogs/fl_digi.cxx:5919 msgid "FLMSG files..." msgstr "Archivos FLMSG..." #: src/dialogs/fl_digi.cxx:5920 msgid "NBEMS files..." msgstr "Archivos NBEMS..." #: src/dialogs/fl_digi.cxx:5921 #, fuzzy msgid "WEFAX images..." msgstr "Enviar imagen..." #: src/dialogs/fl_digi.cxx:5922 msgid "Data files..." msgstr "Archivos de datos..." #: src/dialogs/fl_digi.cxx:5925 msgid "Macros" msgstr "Macros" #: src/dialogs/fl_digi.cxx:5926 msgid "Open ..." msgstr "Abrir..." #: src/dialogs/fl_digi.cxx:5927 msgid "Save ..." msgstr "Guardar..." #: src/dialogs/fl_digi.cxx:5930 #, fuzzy msgid "Config Scripts" msgstr "Confirmar Salir" #: src/dialogs/fl_digi.cxx:5931 msgid "Execute" msgstr "" #: src/dialogs/fl_digi.cxx:5932 #, fuzzy msgid "Generate" msgstr "General" #: src/dialogs/fl_digi.cxx:5935 msgid "Text Capture" msgstr "Captura de Texto" #: src/dialogs/fl_digi.cxx:5939 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5940 msgid "RX capture" msgstr "Capturar RX" #: src/dialogs/fl_digi.cxx:5941 msgid "TX generate" msgstr "Generar TX" #: src/dialogs/fl_digi.cxx:5942 src/dialogs/confdialog.cxx:18737 msgid "Playback" msgstr "Reproducir" #: src/dialogs/fl_digi.cxx:5945 src/dialogs/fl_digi.cxx:7619 msgid "Exit" msgstr "Salir" #: src/dialogs/fl_digi.cxx:6203 src/dialogs/fl_digi.cxx:7832 msgid "&Configure" msgstr "&Configuración" #: src/dialogs/fl_digi.cxx:6205 src/dialogs/fl_digi.cxx:7833 #, fuzzy msgid "Config Dialog" msgstr "Diálogo del libro de guardia" #: src/dialogs/fl_digi.cxx:6206 src/dialogs/fl_digi.cxx:7836 msgid "Save Config" msgstr "Guardar configuración" #: src/dialogs/fl_digi.cxx:6207 src/dialogs/fl_digi.cxx:7835 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notificaciones" #: src/dialogs/fl_digi.cxx:6208 src/dialogs/fl_digi.cxx:7834 #, fuzzy msgid "Test Signals" msgstr "Señal transmitida" #: src/dialogs/fl_digi.cxx:6213 src/dialogs/fl_digi.cxx:7840 #, fuzzy msgid "Rx Audio Dialog" msgstr "Audio" #: src/dialogs/fl_digi.cxx:6215 msgid "View/Hide Channels" msgstr "Ver/Ocultar Canales" #: src/dialogs/fl_digi.cxx:6216 msgid "Signal browser" msgstr "Navegador de señal" #: src/dialogs/fl_digi.cxx:6218 #, fuzzy msgid "View/Hide 48 macros" msgstr "Ver/Ocultar Canales" #: src/dialogs/fl_digi.cxx:6220 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/fl_digi.cxx:7843 msgid "Floating scope" msgstr "Osciloscopio flotante" #: src/dialogs/fl_digi.cxx:6223 src/dialogs/fl_digi.cxx:7842 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6232 #, fuzzy msgid "Rig/Log Controls" msgstr "Control del radio" #: src/dialogs/fl_digi.cxx:6245 msgid "&Logbook" msgstr "&Libro de guardia" #: src/dialogs/fl_digi.cxx:6246 msgid "View" msgstr "Vista" #: src/dialogs/fl_digi.cxx:6248 #, fuzzy msgid "Files" msgstr "&Archivo" #: src/dialogs/fl_digi.cxx:6249 src/dialogs/confdialog.cxx:17449 msgid "Open..." msgstr "Abrir..." #: src/dialogs/fl_digi.cxx:6251 src/logbook/logsupport.cxx:1213 #: src/logbook/lgbook.cxx:1567 msgid "New" msgstr "Nuevo" #: src/dialogs/fl_digi.cxx:6254 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6255 msgid "Merge..." msgstr "Mezclar ADIF..." #: src/dialogs/fl_digi.cxx:6256 msgid "Export..." msgstr "Exportar..." #: src/dialogs/fl_digi.cxx:6259 src/logbook/lgbook.cxx:831 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6261 msgid "Reports" msgstr "Reportes" #: src/dialogs/fl_digi.cxx:6262 msgid "Text..." msgstr "Texto..." #: src/dialogs/fl_digi.cxx:6263 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6264 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6269 #, fuzzy msgid "Field Day Logging" msgstr "Acción de la rueda del ratón en la cascada" #: src/dialogs/fl_digi.cxx:6274 src/dialogs/fl_digi.cxx:7852 msgid "&Help" msgstr "A&yuda" #: src/dialogs/fl_digi.cxx:6277 msgid "Create sunspots" msgstr "Crear un sunspot" #: src/dialogs/fl_digi.cxx:6279 msgid "Beginners' Guide" msgstr "Guía del principiante" #: src/dialogs/fl_digi.cxx:6280 src/dialogs/fl_digi.cxx:7853 msgid "Online documentation..." msgstr "Documentación en internet..." #: src/dialogs/fl_digi.cxx:6281 msgid "Fldigi web site..." msgstr "Sitio web de Fldigi..." #: src/dialogs/fl_digi.cxx:6282 msgid "Reception reports..." msgstr "Reportes de recepción..." #: src/dialogs/fl_digi.cxx:6283 msgid "Command line options" msgstr "Opciones de línea de comandos" #: src/dialogs/fl_digi.cxx:6284 msgid "Audio device info" msgstr "Información de los dispositivos de audio" #: src/dialogs/fl_digi.cxx:6285 msgid "Build info" msgstr "Información de compilación" #: src/dialogs/fl_digi.cxx:6286 src/dialogs/fl_digi.cxx:7854 msgid "Event log" msgstr "Registro de eventos" #: src/dialogs/fl_digi.cxx:6287 src/dialogs/fl_digi.cxx:7855 msgid "Check for updates..." msgstr "Comprobar si existen actualizaciones" #: src/dialogs/fl_digi.cxx:6288 src/dialogs/fl_digi.cxx:7856 msgid "&About" msgstr "&Acerca de" #: src/dialogs/fl_digi.cxx:6539 msgid "waterfall-only mode" msgstr "Modo de solo cascada" #: src/dialogs/fl_digi.cxx:6541 msgid "NO CALLSIGN SET" msgstr "NO SE HA DEFINIDO UN INDICATIVO" #: src/dialogs/fl_digi.cxx:6566 msgid "Close List" msgstr "Cerrar lista" #: src/dialogs/fl_digi.cxx:6574 msgid "Open List" msgstr "Lista abierta" #: src/dialogs/fl_digi.cxx:6615 msgid "Clear list?" msgstr "¿Limpiar la lista?" #: src/dialogs/fl_digi.cxx:6699 msgid "report" msgstr "reporte" #: src/dialogs/fl_digi.cxx:6699 msgid "reports" msgstr "reportes" #: src/dialogs/fl_digi.cxx:6704 #, fuzzy msgid "Recent activity for grid " msgstr "Actividad reciente para el localizador" #: src/dialogs/fl_digi.cxx:7841 src/dialogs/Viewer.cxx:283 msgid "Signal Browser" msgstr "Navegador de señal" #: src/dialogs/fl_digi.cxx:8143 msgid "Scope" msgstr "Osciloscopio" #: src/dialogs/fl_digi.cxx:8234 msgid "Detected signal level" msgstr "Nivel de señal detectado" #: src/dialogs/fl_digi.cxx:8246 src/waterfall/waterfall.cxx:2596 msgid "Squelch level" msgstr "Nivel de silencio (SQL)" #: src/dialogs/fl_digi.cxx:8262 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Clic izquierdo: cambiar modo\n" "Clic derecho: configurar" #: src/dialogs/fl_digi.cxx:8271 msgid "CW transmit WPM" msgstr "WPM en TX de CW" #: src/dialogs/fl_digi.cxx:8280 msgid "Default WPM" msgstr "WPM predeterminado" #: src/dialogs/fl_digi.cxx:8310 #, fuzzy msgid "Left click to toggle VuMeter" msgstr "Clic izquierdo para seleccionar el color de duplicados" #: src/dialogs/fl_digi.cxx:8316 #, fuzzy msgid "Left click to toggle Status Bar" msgstr "Clic izquierdo para seleccionar el color de duplicados" #: src/dialogs/fl_digi.cxx:8328 msgid "Tx level attenuator (dB)" msgstr "atenuación de nivel de TX (dB)" #: src/dialogs/fl_digi.cxx:8356 msgid "Automatic Frequency Control" msgstr "Control Automático de Frecuencia" #: src/dialogs/fl_digi.cxx:8361 msgid "Squelch" msgstr "Silenciado (SQL)" #: src/dialogs/fl_digi.cxx:8366 #, fuzzy msgid "Power Signal Monitor" msgstr "Tono pre-señal" #: src/dialogs/fl_digi.cxx:10682 #, fuzzy msgid "Delete entry?" msgstr "¿Guardar los datos del contacto actual en el registro?" #: src/dialogs/fl_digi.cxx:10682 src/spot/notify.cxx:222 #: src/spot/notify.cxx:228 msgid "All" msgstr "Todo" #: src/dialogs/Viewer.cxx:287 msgid "Find: " msgstr "Buscar:" #: src/dialogs/Viewer.cxx:308 src/logbook/logsupport.cxx:324 #: src/logbook/logsupport.cxx:1063 src/misc/macroedit.cxx:504 #: src/mfsk/mfsk-pic.cxx:338 src/spot/notify.cxx:535 src/spot/notify.cxx:539 #: src/dialogs/confdialog.cxx:20251 msgid "Close" msgstr "Cerrar" #: src/dialogs/Viewer.cxx:316 src/logbook/logsupport.cxx:327 #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:13484 #: src/dialogs/confdialog.cxx:14633 msgid "Clear" msgstr "Limpiar" #: src/dialogs/Viewer.cxx:320 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Clic izquierdo para limpiar el texto\n" "Clic derecho para restablecer frecuencias" #: src/dialogs/Viewer.cxx:326 msgid "Set Viewer Squelch" msgstr "Establecer el nivel de silenciado (SQL) del visor" #: src/logbook/logsupport.cxx:160 msgid "Export to CSV file" msgstr "Exportar a un archivo CSV" #: src/logbook/logsupport.cxx:187 msgid "Export to fixed field text file" msgstr "Exportar a un archivo de texto con campos fijos" #: src/logbook/logsupport.cxx:215 msgid "Export to ADIF file" msgstr "Exportar a archivo ADIF" #: src/logbook/logsupport.cxx:317 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:359 msgid "Save changed Logbook?" msgstr "¿Guardar el libro de guardia modificado?" #: src/logbook/logsupport.cxx:380 #, fuzzy msgid "Create new logbook file" msgstr "Crear un nuevo libro de log?" #: src/logbook/logsupport.cxx:403 #, fuzzy, c-format msgid "%s exists, overwrite?" msgstr "%s: No existe, ¿crear?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Abrir un archivo de libro de guardia" #: src/logbook/logsupport.cxx:472 msgid "Save logbook file" msgstr "Guardar el archivo del libro de guardia" #: src/logbook/logsupport.cxx:933 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:939 msgid "Merge ADIF file" msgstr "Mezclar archivo ADIF" #: src/logbook/logsupport.cxx:977 msgid "No records in lotw download file" msgstr "" #: src/logbook/logsupport.cxx:1057 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1092 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1214 src/spot/notify.cxx:206 #: src/spot/notify.cxx:533 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1574 msgid "Update" msgstr "Actualizar" #: src/logbook/logsupport.cxx:1816 #, c-format msgid "Really delete record for \"%s\"?" msgstr "¿Está seguro de borrar el registro para \"%s\"?" #: src/logbook/logsupport.cxx:2330 msgid "Create cabrillo report" msgstr "Crear un reporte Cabrillo" #: src/logbook/logsupport.cxx:2570 msgid "LoTW download file" msgstr "" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Detectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para\n" "guardar el texto contenido entre ellas a un archivo con la fecha al estilo:\n" "\n" " NBEMS.files\\WRAP\\recv\\extract-20110205-201712.wrap" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Detectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para\n" "guardar el texto contenido entre ellas a un archivo con la fecha al estilo:\n" "\n" " ~/.nbems/WRAP/recv/extraxt-20110205-201712.wrap" #: src/logger/rx_extract.cxx:286 src/logger/rx_extract.cxx:316 msgid "Could not start flmsg" msgstr "No se puede iniciar flmsg" #: src/logger/rx_extract.cxx:414 src/logger/rx_extract.cxx:418 #: src/dialogs/confdialog.cxx:16379 msgid "Locate flmsg executable" msgstr "Buscar..." #: src/logger/rx_extract.cxx:414 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:418 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:492 msgid "Locate executable" msgstr "Buscar ejecutable" #: src/logger/rx_extract.cxx:492 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:495 msgid "Locate binary" msgstr "Buscar binario" #: src/logger/rx_extract.cxx:495 msgid "*" msgstr "*" #: src/logger/speak.cxx:40 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Guardar todo el texto recibido, un carácter cada vez al siguiente archivo:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:539 msgid "Rig mode" msgstr "Modo del Radio" #: src/misc/configuration.cxx:540 msgid "Always LSB" msgstr "Siempre LSB" #: src/misc/configuration.cxx:541 msgid "Always USB" msgstr "Siempre USB" #: src/misc/configuration.cxx:549 src/dialogs/confdialog.cxx:17915 #: src/dialogs/confdialog.cxx:18183 src/dialogs/confdialog.cxx:18185 #, fuzzy msgid "Rig Control/Hamlib" msgstr "Control del radio" #: src/misc/configuration.cxx:723 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "¿Restablecer todas las opciones a su valores\n" "predefinidos?\n" "Los efectos de esta acción no se observarán\n" "hasta el próximo inicio del programa\n" "Se eliminaran los siguientes archivos:\n" "fldigi_def.xml and fldigi.prefs\n" #: src/misc/configuration.cxx:728 msgid "Confirm RESET" msgstr "Confirmar RESTABLECIMIENTO" #: src/misc/macroedit.cxx:68 msgid "\tmy frequency" msgstr "\tmi frecuencia" #: src/misc/macroedit.cxx:69 msgid "\tmode" msgstr "\tmodo" #: src/misc/macroedit.cxx:70 msgid "\tmy call" msgstr "\tmi indicativo" #: src/misc/macroedit.cxx:71 msgid "\tmy locator" msgstr "\tmi localizador" #: src/misc/macroedit.cxx:72 msgid "\tmy name" msgstr "\tmi nombre" #: src/misc/macroedit.cxx:73 #, fuzzy #| msgid "\tmy QTH" msgid "\tmy QTH (city)" msgstr "\tmi QTH" #: src/misc/macroedit.cxx:74 msgid "\tmy RST" msgstr "\tmi RST" #: src/misc/macroedit.cxx:75 #, fuzzy msgid "\tmy FD class" msgstr "\tmi indicativo" #: src/misc/macroedit.cxx:76 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:77 #, fuzzy msgid "\tmy state" msgstr "\tmi nombre" #: src/misc/macroedit.cxx:78 #, fuzzy msgid "\tmy ST" msgstr "\tmi RST" #: src/misc/macroedit.cxx:79 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy CNTY" msgstr "\tmi QTH" #: src/misc/macroedit.cxx:81 msgid "\tmy antenna" msgstr "\tmi antena" #: src/misc/macroedit.cxx:82 msgid "\toperating band" msgstr "\tbanda de operación" #: src/misc/macroedit.cxx:83 #, fuzzy #| msgid "\ttransmit" msgid "\ttransmit power" msgstr "\ttransmitir" #: src/misc/macroedit.cxx:84 msgid "\tFldigi version" msgstr "\tversion de Fldigi" #: src/misc/macroedit.cxx:85 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:88 msgid "\tother call" msgstr "\tindicativo del otro" #: src/misc/macroedit.cxx:89 msgid "\tother name" msgstr "\tnombre del otro" #: src/misc/macroedit.cxx:90 msgid "\tother QTH" msgstr "\tQTH del otro" #: src/misc/macroedit.cxx:91 #, fuzzy msgid "\tother State" msgstr "\tRST del otro" #: src/misc/macroedit.cxx:92 #, fuzzy msgid "\tother Province" msgstr "\tnombre del otro" #: src/misc/macroedit.cxx:93 msgid "\tother locator" msgstr "\tlocalizador del otro" #: src/misc/macroedit.cxx:94 msgid "\tother RST" msgstr "\tRST del otro" #: src/misc/macroedit.cxx:97 msgid "\tS/N etc." msgstr "\tS/N etc." #: src/misc/macroedit.cxx:98 msgid "\tIMD etc." msgstr "\tIMD etc." #: src/misc/macroedit.cxx:101 msgid "\t# QSO recs" msgstr "\t# QSO guardados" #: src/misc/macroedit.cxx:102 msgid "\tnext QSO rec #" msgstr "\tpróximo QSO a guardar #" #: src/misc/macroedit.cxx:105 msgid "\tmap on google" msgstr "\tmapearlo en google" #: src/misc/macroedit.cxx:106 msgid "\tmap by value" msgstr "\tmapearlo por su valor" #: src/misc/macroedit.cxx:109 msgid "\tclear RX pane" msgstr "\tlimpiar el panel de RX" #: src/misc/macroedit.cxx:110 msgid "\tclear TX pane" msgstr "\tlimpiar el panel de TX" #: src/misc/macroedit.cxx:111 #, fuzzy msgid "\tclear QSO fields" msgstr "\tlimpiar los campos del log" #: src/misc/macroedit.cxx:114 msgid "\ttext to NAME/QTH" msgstr "\ttexto a NOMBRE/QTH" #: src/misc/macroedit.cxx:118 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk Encendido, apagado, alternado" #: src/misc/macroedit.cxx:122 msgid "\tclear log fields" msgstr "\tlimpiar los campos del log" #: src/misc/macroedit.cxx:123 msgid "\tsave QSO data" msgstr "\tguardar datos del QSO" #: src/misc/macroedit.cxx:124 msgid "\tsaveQSO data, append msg to notes" msgstr "" "\tguardar los datos del QSO, añadiendo msg a las notas del log" #: src/misc/macroedit.cxx:125 msgid "\tlog at xmt time" msgstr "\tguardar al tiempo que transmite" #: src/misc/macroedit.cxx:126 msgid "\tsaveQSO data, append msg to notes" msgstr "" "\tGuardar los datos del QSO, añadiendo msg a las notas del log, " "cuando se muestra en el buffer de TX" #: src/misc/macroedit.cxx:127 msgid "\tlog eQSL" msgstr "\tSalvar directo en eQSL.cc" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL optional msg" msgstr "\tlogear un mensaje opcional en eQSL.cc" #: src/misc/macroedit.cxx:131 msgid "\tQSO time (HHMM))" msgstr "\tHora del QSO (HHMM)" #: src/misc/macroedit.cxx:132 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:133 #, fuzzy msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "\thora local (HHMM)" #: src/misc/macroedit.cxx:134 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 #, fuzzy msgid "\tlocal time, default %H%M" msgstr "\thora local (HHMM)" #: src/misc/macroedit.cxx:137 #, fuzzy msgid "\tzulu time default %H%MZ" msgstr "\thora zulu HHMMZ" #: src/misc/macroedit.cxx:138 #, fuzzy msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tfecha local AAAA-MM-DD" #: src/misc/macroedit.cxx:139 #, fuzzy msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tfecha zulu AAAA-MM-DD Z" #: src/misc/macroedit.cxx:140 msgid "\tget weather data" msgstr "\tobtener datos de clima" #: src/misc/macroedit.cxx:141 msgid "\tget weather data for station" msgstr "\tobtener datos de clima para una estación específica" #: src/misc/macroedit.cxx:144 msgid "\tcontest counter" msgstr "\tcontador de concurso" #: src/misc/macroedit.cxx:145 msgid "\tdecrement counter" msgstr "\tdecrementar el contador" #: src/misc/macroedit.cxx:146 msgid "\tincrement counter" msgstr "\tincrementar el contador" #: src/misc/macroedit.cxx:147 msgid "\texchange in" msgstr "\tintercambio entrante" #: src/misc/macroedit.cxx:148 msgid "\texchange out" msgstr "\tintercambio enviado" #: src/misc/macroedit.cxx:149 msgid "\texchange begin" msgstr "\tcomienzo del intercambio" #: src/misc/macroedit.cxx:150 msgid "\texchange end" msgstr "\tfin del intercambio" #: src/misc/macroedit.cxx:151 msgid "\tsave contest out" msgstr "\tguardar intercambio de concurso" #: src/misc/macroedit.cxx:152 #, fuzzy msgid "\tcurrent contest serno" msgstr "\tdecrementar el contador" #: src/misc/macroedit.cxx:153 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:154 #, fuzzy msgid "\tFD class" msgstr "\tmi indicativo" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD section" msgstr "Número de serie recibido" #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tcontest class" msgstr "\tmi indicativo" #: src/misc/macroedit.cxx:157 #, fuzzy msgid "
\tARRL section" msgstr "Número de serie recibido" #: src/misc/macroedit.cxx:160 msgid "\treceive" msgstr "\trecibir" #: src/misc/macroedit.cxx:161 msgid "\ttransmit" msgstr "\ttransmitir" #: src/misc/macroedit.cxx:162 msgid "\ttoggle T/R" msgstr "\talternar Tx/Rx" #: src/misc/macroedit.cxx:163 msgid "\tsearch UP for signal" msgstr "\tbuscar ARRIBA en la cascada por una señal" #: src/misc/macroedit.cxx:164 msgid "\tsearch DOWN for signal" msgstr "\tbuscar ABAJO en la cascada por una señal" #: src/misc/macroedit.cxx:165 msgid "\treturn to sweet spot" msgstr "\tretornar a la frecuencia inicial en la cascada" #: src/misc/macroedit.cxx:166 msgid "\tmove to freq NNNN Hz" msgstr "\tmoverte a la frecuencia NNNN" #: src/misc/macroedit.cxx:167 msgid "\tleft-clk QSY button" msgstr "\tclic-izquierdo QSY a la frecuencia preferida de este modo" #: src/misc/macroedit.cxx:168 msgid "\tright-clk QSY button" msgstr "\tclic-derecho QSY a la frecuencia anterior" #: src/misc/macroedit.cxx:169 msgid "\tqsy to kHz, Hz" msgstr "\tqsy a kHz, Hz" #: src/misc/macroedit.cxx:170 msgid "\tincr/decr xcvr freq" msgstr "\tincr/decr frece xcvr" #: src/misc/macroedit.cxx:171 msgid "\tvalid xcvr mode" msgstr "\tmodo válido para el trx" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr filter width" msgstr "\tancho del filtro válido para el trx" #: src/misc/macroedit.cxx:173 #, fuzzy msgid "\tvalid xcvr low cutoff filter" msgstr "\tancho del filtro válido para el trx" #: src/misc/macroedit.cxx:174 #, fuzzy msgid "\tvalid xcvr hi cutoff filter" msgstr "\tancho del filtro válido para el trx" #: src/misc/macroedit.cxx:175 msgid "\trig freq has kbd focus" msgstr "\tfrec radio tiene el teclado en foco" #: src/misc/macroedit.cxx:178 msgid "\tinsert QRG into Rx text" msgstr "\tInsertar QRG en el panel de RX" #: src/misc/macroedit.cxx:181 msgid "\tinsert text file" msgstr "\tinsertar archivo de texto" #: src/misc/macroedit.cxx:182 #, fuzzy msgid "\tinsert image file" msgstr "\tinsertar imagen de MFSK" #: src/misc/macroedit.cxx:183 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:186 msgid "\tpause transmit" msgstr "\tpausar la transmisión (Pasar a RX sin limpiar el panel de TX)" #: src/misc/macroedit.cxx:187 msgid "\tidle signal for NN.nn sec" msgstr "\tesperar NN.nn segundos por la señal" #: src/misc/macroedit.cxx:188 msgid "\trepeat every NN sec" msgstr "\trepetir cada NN segundos" #: src/misc/macroedit.cxx:189 #, fuzzy msgid "\trepeat after waiting NN sec" msgstr "\trepetir cada NN segundos" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tsintonizar la señal por NN segundos" #: src/misc/macroedit.cxx:191 #, fuzzy msgid "\tdelay xmt for NN.n sec" msgstr "\tretrasar la transmisión por NN segundos" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\trepetir la macro continuamente" #: src/misc/macroedit.cxx:193 #, fuzzy msgid "\tschedule execution for" msgstr "\tejecución programada" #: src/misc/macroedit.cxx:194 #, fuzzy msgid "\tend execution at" msgstr "\tejecución programada" #: src/misc/macroedit.cxx:195 #, fuzzy msgid "\tuse local date/time" msgstr "\tfecha y hora en tiempo local" #: src/misc/macroedit.cxx:198 msgid "\t set xmt attenuator" msgstr "\tponer el atenuador de TX del equipo a este valor" #: src/misc/macroedit.cxx:201 msgid "\tCW identifier" msgstr "\tidentificador de CW" #: src/misc/macroedit.cxx:202 #, fuzzy msgid "\tsend mode ID; TX start only" msgstr "\tenviar el ID del modo como video texto" #: src/misc/macroedit.cxx:203 msgid "\ttext at start of TX" msgstr "" #: src/misc/macroedit.cxx:204 msgid "\tvideo text in TX stream" msgstr "" #: src/misc/macroedit.cxx:205 msgid "\tTx RSID on,off,toggle" msgstr "\tTx RSID encendido, apagado, alternado" #: src/misc/macroedit.cxx:206 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID encendido, apagado, alternado" #: src/misc/macroedit.cxx:207 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tTransmitir |NN| ráfagas de RsID" #: src/misc/macroedit.cxx:208 msgid "\t[Wait][Len](ms)" msgstr "\t[Wait][Len](ms)" #: src/misc/macroedit.cxx:211 msgid "\tXmt audio wav file" msgstr "" #: src/misc/macroedit.cxx:214 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:215 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:218 msgid "\tCW QSK post-timing" msgstr "\tCW QSK al final" #: src/misc/macroedit.cxx:219 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK al inicio" #: src/misc/macroedit.cxx:220 msgid "\tCW rise time" msgstr "\ttiempo de subida de CW" #: src/misc/macroedit.cxx:221 #, fuzzy msgid "\tChar WPM:Text WPM (15.0:5.0)" msgstr "\tCW PPM:Farnsworth" #: src/misc/macroedit.cxx:224 msgid "\tsend CAT cmd" msgstr "\tenviar comando CAT" #: src/misc/macroedit.cxx:225 #, fuzzy msgid "\tsend CAT cmd" msgstr "\tenviar comando CAT" #: src/misc/macroedit.cxx:228 msgid "\tAFC on,off,toggle" msgstr "\tAFC encendido, apagado, alternado" #: src/misc/macroedit.cxx:229 msgid "\tLOCK on,off,toggle" msgstr "\tbloqueo (LOCK) encendido, apagado, alternado" #: src/misc/macroedit.cxx:230 msgid "\tRev on,off,toggle" msgstr "\tReverso activado, desactivado, alternado" #: src/misc/macroedit.cxx:231 #, fuzzy #| msgid "\tDigitalk On, Off, Toggle" msgid "\tDigital Squelch on, off,toggle" msgstr "\tDigitalk Encendido, apagado, alternado" #: src/misc/macroedit.cxx:232 msgid "\tDigital Squelch level, 0..100" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tchange macro defs file" msgstr "\tcambiar el archivo de definición de macros" #: src/misc/macroedit.cxx:236 msgid "\tsave current macro file" msgstr "\tguardar el archivo de macro actual" #: src/misc/macroedit.cxx:237 msgid "\trun macro from buffered teext" msgstr "" #: src/misc/macroedit.cxx:240 #, fuzzy msgid "\tignore comment text" msgstr "\tignore todos los textos de comentario" #: src/misc/macroedit.cxx:241 #, fuzzy msgid "<#comments>\t ignore comments" msgstr "\tignore todos los textos de comentario" #: src/misc/macroedit.cxx:244 msgid "\tmodem char/sec test on nn chars" msgstr "\tprueba módem car/sec en nn caracteres" #: src/misc/macroedit.cxx:245 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" "\tprueba sincronización de módem , 'n' grupos de 5 caracteres al " "azar" #: src/misc/macroedit.cxx:246 msgid "\tmodem timing test, spec' file" msgstr "" "\tarchivo de especificación de la prueba de sincronización del " "módem" #: src/misc/macroedit.cxx:247 msgid "\tmodem timing test, string 's'" msgstr "" "\tprueba de sincronización de módem, cadena de caracteres 's'" #: src/misc/macroedit.cxx:250 msgid "\tWAV file; internal string" msgstr "\tarchivo WAV; cadena de texto interna" #: src/misc/macroedit.cxx:251 msgid "\tWAV file; 'n' random 5 char groups" msgstr "\tarchivo WAV; 'n' grupos de 5 caracteres al azar" #: src/misc/macroedit.cxx:252 msgid "\tWAV file; spec' file" msgstr "\tarchivo WAV; archivo de especificación" #: src/misc/macroedit.cxx:253 msgid "\tWAV file; string 's'" msgstr "\tarchivo WAV; cadena de texto 's'" #: src/misc/macroedit.cxx:256 msgid "\tAnalysis CSV on,off,toggle" msgstr "\tAnálisis CSV encendido,apagado, alternado" #: src/misc/macroedit.cxx:259 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:260 msgid "\tpush current mode / audio freq to stack" msgstr "" #: src/misc/macroedit.cxx:261 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:383 msgid "Text file to insert" msgstr "Archivo de texto a insertar" #: src/misc/macroedit.cxx:393 msgid "Test text file" msgstr "Archivo de texto de prueba" #: src/misc/macroedit.cxx:403 msgid "MFSK image file" msgstr "Archivo de imagen MFSK" #: src/misc/macroedit.cxx:413 msgid "Change to Macro file" msgstr "Cambiar a archivo de macro" #: src/misc/macroedit.cxx:423 src/misc/macroedit.cxx:433 #, fuzzy msgid "Select audio file" msgstr "Seleccionar dispositivo" #: src/misc/macroedit.cxx:445 msgid "Executable file to insert" msgstr "Archivo ejecutable a insertar" #: src/misc/macroedit.cxx:476 msgid "Macro Text" msgstr "Texto del macro" #: src/misc/macroedit.cxx:481 msgid "Select Tag" msgstr "Selecciona la etiqueta" #: src/misc/macroedit.cxx:493 msgid "Macro Button Label" msgstr "Etiqueta del botón de macro" #: src/misc/macroedit.cxx:501 msgid "Apply" msgstr "Aplicar" #: src/misc/macroedit.cxx:530 msgid "Macro editor - " msgstr "Editor de macros - " #: src/misc/macros.cxx:5166 msgid "Open macro file" msgstr "Abrir archivo de macro" #: src/misc/macros.cxx:5167 src/misc/macros.cxx:5210 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Archivo de definición de macro para Fldigi\t*.mdf" #: src/misc/macros.cxx:5209 msgid "Save macro file" msgstr "Guardar el archivo de macros" #: src/misc/newinstall.cxx:385 msgid "Finish" msgstr "Terminar" #: src/misc/newinstall.cxx:386 msgid "Next" msgstr "Siguiente" #: src/misc/newinstall.cxx:387 msgid "Back" msgstr "Atrás" #: src/misc/newinstall.cxx:505 #, fuzzy msgid "The wizard will guide you through the basic fldigi settings:" msgstr "Este diálogo te guiará en las configuraciones básicas" #: src/misc/newinstall.cxx:506 src/logbook/lgbook.cxx:731 msgid "Operator" msgstr "Operador" #: src/misc/newinstall.cxx:507 #, fuzzy msgid "Sound Card Interface" msgstr "Dispositivo de sonido" #: src/misc/newinstall.cxx:508 msgid "Transceiver control, flrig/rigcat/hamlib" msgstr "" #: src/misc/newinstall.cxx:509 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" "Puedes saltar o salir de cualquiera de estas configuraciones en cualquier " "momento" #: src/misc/newinstall.cxx:510 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Todos los ajustes mostrados aquí pueden ser modificados luego en el menú " "Configurar" #: src/misc/newinstall.cxx:525 msgid "Fldigi configuration wizard" msgstr "Asistente de configuración de fldigi" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:302 src/mfsk/mfsk-pic.cxx:305 msgid "Time needed: " msgstr "Tiempo necesario:" #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Cargar archivo de imagen" #: src/mfsk/mfsk-pic.cxx:312 msgid "Send image" msgstr "Enviar imagen" #: src/mfsk/mfsk-pic.cxx:319 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Cargar o descargar una imagen\n" "desde archivo (PNG, JPEG, BMP)" #: src/mfsk/mfsk-pic.cxx:323 msgid "Transfer speed, X1-normal" msgstr "Velocidad de transferencia, X1-normal" #: src/mfsk/mfsk-pic.cxx:335 msgid "Load" msgstr "Cargar" #: src/waterfall/waterfall.cxx:2031 msgid "Waterfall / FFT / Scope" msgstr "Cascada / FFT / Osciloscopio" #: src/waterfall/waterfall.cxx:2040 msgid "Upper signal level (dB)" msgstr "Nivel superior de la señal (dB)" #: src/waterfall/waterfall.cxx:2051 msgid "Signal range (dB)" msgstr "Rango de señal (dB)" #: src/waterfall/waterfall.cxx:2057 msgid "Change waterfall scale" msgstr "Cambiar escala de la cascada" #: src/waterfall/waterfall.cxx:2062 msgid "Slew display lower in frequency" msgstr "Correr la cascada hacia frecuencias más bajas" #: src/waterfall/waterfall.cxx:2067 msgid "Center display on signal" msgstr "Centrar la señal" #: src/waterfall/waterfall.cxx:2072 msgid "Slew display higher in frequency" msgstr "Correr la cascada hacia frecuencias más altas" #: src/waterfall/waterfall.cxx:2077 msgid "Waterfall drop speed" msgstr "Velocidad de caída de la cascada" #: src/waterfall/waterfall.cxx:2087 msgid "Adjust cursor frequency" msgstr "Ajustar la frecuencia del cursor" #: src/waterfall/waterfall.cxx:2092 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centrar en el pasabanda\n" "Clic derecho para deshacer" #: src/waterfall/waterfall.cxx:2098 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Almacenar modo y frecuencia\n" "Clic derecho para listar" #: src/waterfall/waterfall.cxx:2108 msgid "Lock transmit frequency" msgstr "Bloquear la frecuencia de transmisión" #: src/waterfall/waterfall.cxx:2117 src/dialogs/confdialog.cxx:19508 msgid "Reverse" msgstr "Invertir" #: src/waterfall/waterfall.cxx:2124 msgid "Transmit/Receive" msgstr "Transmitir/Recibir" #: src/waterfall/waterfall.cxx:2595 msgid "AFC range or BW" msgstr "Rango AFC o Ancho de banda" #: src/waterfall/waterfall.cxx:2596 msgid "Signal search" msgstr "Búsqueda de señal" #: src/waterfall/waterfall.cxx:2597 msgid "Modem carrier" msgstr "Portadora del modo" #: src/waterfall/waterfall.cxx:2597 msgid "Scroll" msgstr "Desplazamiento" #: src/rigcontrol/rigxml.cxx:1121 msgid "Open rig xml file" msgstr "Abrir archivo xml de radio" #: src/rigcontrol/rigxml.cxx:1121 msgid "Fldigi rig xml definition file\t*.xml" msgstr "archivo de definición de radio xml\t*.xml" #: src/soundcard/sound.cxx:115 src/soundcard/sound.cxx:117 msgid "Audio file" msgstr "Archivo de audio" #: src/spot/notify.cxx:193 msgid "My callsign de CALL" msgstr "Mi indicativo de INDICATIVO" #: src/spot/notify.cxx:194 msgid "Station heard twice" msgstr "Estación escuchada dos veces" #: src/spot/notify.cxx:195 msgid "Custom text search" msgstr "Busqueda de texto personalizada" #: src/spot/notify.cxx:196 msgid "RSID reception" msgstr "Recepción con RSID" #: src/spot/notify.cxx:197 msgid "RSID EOT" msgstr "" #: src/spot/notify.cxx:205 msgid "Toggle" msgstr "Alternar" #: src/spot/notify.cxx:207 src/spot/notify.cxx:532 msgid "Remove" msgstr "Eliminar" #: src/spot/notify.cxx:218 src/dialogs/confdialog.cxx:14150 #: src/dialogs/confdialog.cxx:14161 src/dialogs/confdialog.cxx:14251 #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14835 #: src/dialogs/confdialog.cxx:18355 src/dialogs/confdialog.cxx:18382 #: src/dialogs/confdialog.cxx:18411 src/dialogs/confdialog.cxx:18440 #: src/dialogs/confdialog.cxx:18469 src/dialogs/confdialog.cxx:18493 #: src/dialogs/confdialog.cxx:19096 msgid "Select" msgstr "Selecciona" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 src/spot/notify.cxx:586 #: src/logbook/lgbook.cxx:782 src/logbook/lgbook.cxx:1187 msgid "Continent" msgstr "Continente" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/logbook/lgbook.cxx:1199 msgid "ITU zone" msgstr "Zona ITU" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1175 msgid "CQ zone" msgstr "Zona CQ" #: src/spot/notify.cxx:224 msgid "Deselect" msgstr "Deseleccionar" #: src/spot/notify.cxx:531 msgid "Add" msgstr "Añadir" #: src/spot/notify.cxx:534 msgid "Test..." msgstr "Probar..." #: src/spot/notify.cxx:537 src/widgets/FTextView.cxx:484 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Todos" #: src/spot/notify.cxx:538 src/logbook/lgbook.cxx:621 #: src/logbook/lgbook.cxx:822 src/logbook/lgbook.cxx:1636 #: src/logbook/lgbook.cxx:1718 msgid "Clear All" msgstr "Limpiar todo" #: src/spot/notify.cxx:585 src/widgets/FTextRXTX.cxx:154 #: src/logbook/lgbook.cxx:737 src/logbook/lgbook.cxx:1039 msgid "Country" msgstr "País" #: src/spot/notify.cxx:1144 msgid "The regular expression field must not be empty." msgstr "El campo de expresión regular no debe estar vacío." #: src/spot/notify.cxx:1150 msgid "The regular expression must be valid." msgstr "La expresión regular debe ser válida." #: src/spot/notify.cxx:1157 msgid "Please set your callsign first." msgstr "Por favor especifica tu indicativo primero." #: src/spot/notify.cxx:1294 msgid "Run program" msgstr "Ejecutar programa" #: src/spot/notify.cxx:1329 msgid "" "Default test string is:\n" " \"" msgstr "" "La cadena de prueba por omisión es:\n" "\"" #: src/spot/notify.cxx:1330 msgid "Enter test string or leave blank for default:" msgstr "" "Entre la cadena de prueba, o déjela en blanco para usar la predefinida:" #: src/spot/notify.cxx:1341 msgid "This event's regular expression is invalid." msgstr "La expresión regular de este evento es inválida." #: src/spot/notify.cxx:1348 msgid "The test string did not match this event's search pattern." msgstr "La cadena de prueba no concuerda con el patrón para este evento." #: src/spot/notify.cxx:1366 msgid "Available substrings" msgstr "Sub cadenas de texto disponibles" #: src/spot/notify.cxx:1453 src/logbook/lgbook.cxx:1617 msgid "Frequency" msgstr "Frecuencia" #: src/spot/notify.cxx:1455 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1614 msgid "Callsign" msgstr "Indicativo" #: src/waterfall/colorbox.cxx:87 msgid "Open palette" msgstr "Abrir paleta" #: src/waterfall/colorbox.cxx:87 src/waterfall/colorbox.cxx:125 msgid "Fldigi palette\t*.pal" msgstr "Paleta Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:111 src/waterfall/colorbox.cxx:136 msgid "Palette: " msgstr "Paleta:" #: src/waterfall/colorbox.cxx:125 msgid "Save palette" msgstr "Guardar paleta" #: src/widgets/FTextRXTX.cxx:147 msgid "Look up call" msgstr "Buscar indicativo" #: src/widgets/FTextRXTX.cxx:148 src/dialogs/confdialog.cxx:10138 #: src/logbook/lgbook.cxx:665 src/logbook/lgbook.cxx:870 #: src/logbook/lgbook.cxx:1666 msgid "Call" msgstr "Ind." #: src/widgets/FTextRXTX.cxx:149 src/logbook/lgbook.cxx:669 #: src/logbook/lgbook.cxx:882 src/logbook/lgbook.cxx:1616 msgid "Name" msgstr "Nombre" #: src/widgets/FTextRXTX.cxx:150 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:151 src/dialogs/confdialog.cxx:10842 #: src/logbook/lgbook.cxx:716 src/logbook/lgbook.cxx:1710 msgid "State" msgstr "Estado" #: src/widgets/FTextRXTX.cxx:152 src/logbook/lgbook.cxx:779 #: src/logbook/lgbook.cxx:1150 src/logbook/lgbook.cxx:1151 #: src/logbook/lgbook.cxx:1714 msgid "County" msgstr "Provincia" #: src/widgets/FTextRXTX.cxx:153 src/logbook/lgbook.cxx:734 msgid "Province" msgstr "Provincia" #: src/widgets/FTextRXTX.cxx:155 msgid "Locator" msgstr "Cuadrícula" #: src/widgets/FTextRXTX.cxx:156 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:157 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:158 src/dialogs/confdialog.cxx:10836 #: src/logbook/lgbook.cxx:773 src/logbook/lgbook.cxx:1702 msgid "Exchange In" msgstr "Intercambio RX" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "Rx Serial #" msgstr "Serie recibida" #: src/widgets/FTextRXTX.cxx:160 src/logbook/lgbook.cxx:1343 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:161 src/logbook/lgbook.cxx:1432 #, fuzzy msgid "Section" msgstr "Acción" #: src/widgets/FTextRXTX.cxx:163 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:164 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:165 #, fuzzy msgid "SS check" msgstr "Marcar todo" #: src/widgets/FTextRXTX.cxx:166 src/logbook/lgbook.cxx:1433 #, fuzzy msgid "SS section" msgstr "Acción" #: src/widgets/FTextRXTX.cxx:169 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:171 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:176 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:181 #, fuzzy msgid "QSOp state" msgstr "Hora de inicio del QSO" #: src/widgets/FTextRXTX.cxx:182 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:184 #, fuzzy msgid "QSOp name" msgstr "Nombre del operador" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:186 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "Insert marker" msgstr "Insertar marcador" #: src/widgets/FTextRXTX.cxx:196 #, fuzzy msgid "All entries" msgstr "Reintentos" #: src/widgets/FTextRXTX.cxx:198 msgid "Scroll hints" msgstr "Sugerencias de desplazamiento" #: src/widgets/FTextRXTX.cxx:1808 msgid " in " msgstr " en " #: src/widgets/FTextRXTX.cxx:1811 msgid "Last QSO" msgstr "Último QSO" #: src/widgets/FTextRXTX.cxx:1859 src/dialogs/confdialog.cxx:12043 msgid "Transmit" msgstr "Transmitir" #: src/widgets/FTextRXTX.cxx:1860 src/dialogs/confdialog.cxx:11903 #: src/dialogs/confdialog.cxx:14718 msgid "Receive" msgstr "Recibir" #: src/widgets/FTextRXTX.cxx:1861 msgid "Abort" msgstr "Abortar" #: src/widgets/FTextRXTX.cxx:1862 msgid "Send image..." msgstr "Enviar imagen..." #: src/widgets/FTextRXTX.cxx:1871 src/widgets/flinput2.cxx:50 #, fuzzy msgid "Spec Char" msgstr "Juego de caracteres" #: src/widgets/FTextRXTX.cxx:1879 src/widgets/flinput2.cxx:58 #, fuzzy msgid "A" msgstr "Az" #: src/widgets/FTextRXTX.cxx:1895 src/widgets/flinput2.cxx:74 #, fuzzy msgid "E" msgstr "Ex" # Texto de la pestaña IO en la ventana de configuración Fldigi (@HK4QWC) #: src/widgets/FTextRXTX.cxx:1905 src/widgets/flinput2.cxx:84 #, fuzzy msgid "I" msgstr "E/S" #: src/widgets/FTextRXTX.cxx:1915 src/widgets/flinput2.cxx:94 #, fuzzy msgid "N" msgstr "No" #: src/widgets/FTextRXTX.cxx:1919 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16915 msgid "O" msgstr "S" #: src/widgets/FTextRXTX.cxx:1933 src/widgets/flinput2.cxx:112 #, fuzzy msgid "U" msgstr "IU" #: src/widgets/FTextRXTX.cxx:1943 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextRXTX.cxx:1948 src/widgets/flinput2.cxx:127 #: src/logbook/lgbook.cxx:1148 msgid "Other" msgstr "Otro" #: src/widgets/FTextView.cxx:294 msgid "Insert text" msgstr "Insertar texto" #: src/widgets/FTextView.cxx:347 msgid "Save text as" msgstr "Guardar texto como" #: src/widgets/FTextView.cxx:482 src/widgets/FTextView.cxx:648 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Copiar" #: src/widgets/FTextView.cxx:485 msgid "Save as..." msgstr "Guardar como..." #: src/widgets/FTextView.cxx:486 src/widgets/FTextView.cxx:652 msgid "Word wrap" msgstr "Ajuste de línea" #: src/widgets/FTextView.cxx:647 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Cortar" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Pegar" #: src/widgets/FTextView.cxx:651 msgid "Insert file..." msgstr "Insertar archivo..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Deshacer" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1581 msgid "Delete" msgstr "Borrar" #: src/config_script/run_scripts.cxx:950 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2850 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2857 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2864 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2868 #, fuzzy, c-format msgid "Executing script file: %s" msgstr "Seleccionar archivo de descripción del radio" #: src/config_script/run_scripts.cxx:2873 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2874 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2878 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:359 #, c-format msgid "Missing command %s after line %d" msgstr "" #: src/config_script/script_parsing.cxx:403 #, fuzzy msgid "Command Not Found" msgstr "Opciones de línea de comandos" #: src/config_script/script_parsing.cxx:407 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:411 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:415 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:419 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:423 #, fuzzy msgid "General Error" msgstr "General" #: src/config_script/script_parsing.cxx:427 #, fuzzy msgid "No Errors" msgstr "Errores" #: src/config_script/script_parsing.cxx:431 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:435 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:439 msgid "File not found" msgstr "" #: src/config_script/script_parsing.cxx:443 msgid "Directory path not found" msgstr "" #: src/config_script/script_parsing.cxx:447 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:451 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:455 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:459 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:463 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:467 msgid "Parameter is not valid." msgstr "" #: src/config_script/script_parsing.cxx:471 msgid "Command missing ':'." msgstr "" #: src/config_script/script_parsing.cxx:475 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:479 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:483 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:487 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:491 msgid "File read error" msgstr "" #: src/config_script/script_parsing.cxx:495 msgid "Undefined error" msgstr "" #: src/config_script/script_parsing.cxx:498 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "" #: src/config_script/script_parsing.cxx:966 #: src/config_script/script_parsing.cxx:1093 #: src/config_script/script_parsing.cxx:1806 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1036 #: src/config_script/script_parsing.cxx:1152 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1042 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1156 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1239 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1247 #, c-format msgid "Unable to open file %s" msgstr "" #: src/config_script/script_parsing.cxx:1435 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1439 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1656 #: src/config_script/script_parsing.cxx:1743 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1757 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 #: src/dialogs/confdialog.cxx:10080 src/dialogs/confdialog.cxx:11537 #: src/dialogs/confdialog.cxx:11721 msgid "Show" msgstr "Mostrar" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 msgid "Hide" msgstr "Esconder" #: src/dialogs/confdialog.cxx:6816 #, fuzzy msgid "no" msgstr "Info" #: src/dialogs/confdialog.cxx:6816 #, fuzzy msgid "yes" msgstr "Si" #: src/dialogs/confdialog.cxx:9873 msgid "Fldigi configuration" msgstr "Configuración" #: src/dialogs/confdialog.cxx:9883 #, fuzzy msgid "Configure" msgstr "&Configuración" #: src/dialogs/confdialog.cxx:9893 msgid "Collapse Tree" msgstr "" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:10100 #: src/dialogs/confdialog.cxx:10102 #, fuzzy msgid "Call/Lookup" msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:9905 msgid "Web Browser lookup" msgstr "Búsqueda con navegador web" #: src/dialogs/confdialog.cxx:9909 msgid "Do not use callsign lookup via web browser" msgstr "No busque indicativos vía navegador web" #: src/dialogs/confdialog.cxx:9915 #, fuzzy msgid "QRZ on line" msgstr "RTS es la línea de PTT" #: src/dialogs/confdialog.cxx:9916 msgid "Visit QRZ web site" msgstr "Visita el sitio web de QRZ" #: src/dialogs/confdialog.cxx:9921 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:9922 msgid "Visit Hamcall web site" msgstr "Visita el sitio web de HamCall" #: src/dialogs/confdialog.cxx:9927 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:9928 src/dialogs/confdialog.cxx:9934 msgid "Visit hamQTH web site" msgstr "Visita el sitio web hamQTH" #: src/dialogs/confdialog.cxx:9933 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:9939 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:9952 #, fuzzy msgid "Hamcall" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:9965 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:9978 #, fuzzy msgid "Callook" msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:9979 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:9994 msgid "Data base lookup" msgstr "Búsqueda en base de datos" #: src/dialogs/confdialog.cxx:9998 msgid "Do not use callsign database" msgstr "No usar base de datos de indicativos" #: src/dialogs/confdialog.cxx:10004 msgid "QRZ cdrom" msgstr "QRZ CD" #: src/dialogs/confdialog.cxx:10005 msgid "Use CD or hard drive CD image" msgstr "Usar el CD o una imagen del CD en el disco duro" #: src/dialogs/confdialog.cxx:10010 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:10011 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Se requiere de una subscripción\n" "pagada para acceder a QRZ" #: src/dialogs/confdialog.cxx:10016 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:10017 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Se requiere de una subscripción\n" "pagada para acceder a Hamcall" #: src/dialogs/confdialog.cxx:10022 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:10023 msgid "Free service courtesy of OK" msgstr "Servicio gratuito cortesía de OK" #: src/dialogs/confdialog.cxx:10028 #, fuzzy msgid "Callook.info" msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:10029 msgid "Callook.info lookup (free service US callsigns only)" msgstr "" "Búsqueda en Callbook.info (servicio gratuito solo indicativos de EE.UU.)" #: src/dialogs/confdialog.cxx:10035 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "ejemplo: /home/co7wt/CALLBK o C:/CALLBK\n" "Dejar en blanco para buscar la base de datos" #: src/dialogs/confdialog.cxx:10049 msgid "User name" msgstr "Nombre de usuario" #: src/dialogs/confdialog.cxx:10050 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:10064 src/dialogs/confdialog.cxx:11521 #: src/dialogs/confdialog.cxx:11637 msgid "Password" msgstr "Contraseña" #: src/dialogs/confdialog.cxx:10065 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:10081 src/dialogs/confdialog.cxx:11538 #: src/dialogs/confdialog.cxx:11722 msgid "Show password in plain text" msgstr "Mostrar clave en texto plano" #: src/dialogs/confdialog.cxx:10086 msgid "Add address to notes field" msgstr "Agregar dirección al campo notas" #: src/dialogs/confdialog.cxx:10091 msgid "clear old data" msgstr "" #: src/dialogs/confdialog.cxx:10105 #, fuzzy #| msgid "Reload cty.dat" msgid "Call/cty.dat" msgstr "Recargar cty.dat" #: src/dialogs/confdialog.cxx:10109 msgid "cty.dat folder" msgstr "archivo cty.dat" #: src/dialogs/confdialog.cxx:10110 msgid "Enter full path-name for cty.dat folder" msgstr "Entre la ruta completa del archivo cty.dat" #: src/dialogs/confdialog.cxx:10123 msgid "Browse" msgstr "Buscar" #: src/dialogs/confdialog.cxx:10124 msgid "Locate cty.dat file" msgstr "Buscar el archivo cty.dat" #: src/dialogs/confdialog.cxx:10127 src/dialogs/confdialog.cxx:10390 #: src/dialogs/confdialog.cxx:10410 src/dialogs/confdialog.cxx:10427 #: src/dialogs/confdialog.cxx:10457 src/dialogs/confdialog.cxx:10661 #: src/dialogs/confdialog.cxx:10717 src/dialogs/confdialog.cxx:11249 #: src/dialogs/confdialog.cxx:11445 src/dialogs/confdialog.cxx:12067 #: src/dialogs/confdialog.cxx:16947 src/dialogs/confdialog.cxx:17032 #: src/dialogs/confdialog.cxx:17046 src/dialogs/confdialog.cxx:17093 #: src/dialogs/confdialog.cxx:17159 src/dialogs/confdialog.cxx:17348 #: src/dialogs/confdialog.cxx:18931 src/dialogs/confdialog.cxx:20169 msgid "Default" msgstr "Omisión" #: src/dialogs/confdialog.cxx:10128 msgid "Restore cty.dat default folder" msgstr "Restablecer carpeta de cty.dat predeterminada" #: src/dialogs/confdialog.cxx:10131 msgid "Reload" msgstr "Recargar" #: src/dialogs/confdialog.cxx:10132 msgid "Reload cty.dat" msgstr "Recargar cty.dat" #: src/dialogs/confdialog.cxx:10135 src/dialogs/confdialog.cxx:10137 msgid "Call/Cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10141 src/dialogs/confdialog.cxx:10249 #: src/dialogs/confdialog.cxx:10251 #, fuzzy msgid "Colors-Fonts/Buttons-Menus" msgstr "Colores y tipografía" #: src/dialogs/confdialog.cxx:10145 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:10148 msgid "Rev" msgstr "Inv." #: src/dialogs/confdialog.cxx:10151 msgid "Tune" msgstr "Sint." #: src/dialogs/confdialog.cxx:10154 #, fuzzy msgid "RxID nar" msgstr "RxID" #: src/dialogs/confdialog.cxx:10157 msgid "Lk" msgstr "Lk" #: src/dialogs/confdialog.cxx:10160 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:10163 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:10166 #, fuzzy msgid "RxID wide" msgstr "RxID" #: src/dialogs/confdialog.cxx:10169 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:10172 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:10175 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:10225 msgid "Lighted Btns" msgstr "" #: src/dialogs/confdialog.cxx:10232 #, fuzzy msgid "Check Btns" msgstr "Marcar todo" #: src/dialogs/confdialog.cxx:10239 msgid "Round Btns" msgstr "" #: src/dialogs/confdialog.cxx:10246 #, fuzzy #| msgid "Rx font" msgid "Menu font" msgstr "Texto Rx" #: src/dialogs/confdialog.cxx:10254 src/dialogs/confdialog.cxx:10328 #: src/dialogs/confdialog.cxx:10330 #, fuzzy msgid "Colors-Fonts/FreqDisp - Meters" msgstr "Vis. Frec / medidores" #: src/dialogs/confdialog.cxx:10260 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:10269 src/dialogs/confdialog.cxx:10387 #: src/dialogs/confdialog.cxx:10407 src/dialogs/confdialog.cxx:10424 #: src/dialogs/confdialog.cxx:10449 msgid "Font" msgstr "Tipos" #: src/dialogs/confdialog.cxx:10272 src/dialogs/confdialog.cxx:10286 #: src/dialogs/confdialog.cxx:10300 src/dialogs/confdialog.cxx:10384 #: src/dialogs/confdialog.cxx:10404 msgid "Bg Color" msgstr "Fondo" #: src/dialogs/confdialog.cxx:10275 msgid "Digit Color" msgstr "Dígitos" #: src/dialogs/confdialog.cxx:10278 msgid "Sys Colors" msgstr "Sistema" #: src/dialogs/confdialog.cxx:10283 msgid "S-meter" msgstr "Medidor de señal" #: src/dialogs/confdialog.cxx:10289 src/dialogs/confdialog.cxx:10303 msgid "Scale Color" msgstr "Escala" #: src/dialogs/confdialog.cxx:10292 src/dialogs/confdialog.cxx:10306 msgid "Meter Color" msgstr "Medidor" #: src/dialogs/confdialog.cxx:10297 msgid "PWR-meter" msgstr "Medidor de potencia" #: src/dialogs/confdialog.cxx:10309 msgid "Power scale" msgstr "Escala de potencia" #: src/dialogs/confdialog.cxx:10310 src/dialogs/confdialog.cxx:19838 msgid "Select the type of FFT prefilter" msgstr "Seleccionar el tipo de prefiltro de FFT" #: src/dialogs/confdialog.cxx:10321 msgid "25 W" msgstr "25 W" #: src/dialogs/confdialog.cxx:10333 src/dialogs/confdialog.cxx:10366 #: src/dialogs/confdialog.cxx:10368 msgid "Colors-Fonts/Function keys" msgstr "" #: src/dialogs/confdialog.cxx:10337 msgid "Use colored buttons" msgstr "Usa botones coloreados" #: src/dialogs/confdialog.cxx:10342 msgid "Group 1" msgstr "Grupo 1" #: src/dialogs/confdialog.cxx:10343 msgid "Background color for Function key group 1" msgstr "Color de fondo para el grupo de teclas de función 1" #: src/dialogs/confdialog.cxx:10348 msgid "Group 2" msgstr "Grupo 2" #: src/dialogs/confdialog.cxx:10349 msgid "Background color for Function key group 2" msgstr "Color de fondo para el grupo de teclas de función 2" #: src/dialogs/confdialog.cxx:10354 msgid "Group 3" msgstr "Grupo 3" #: src/dialogs/confdialog.cxx:10355 msgid "Background color for Function key group 3" msgstr "Color de fondo para el grupo de teclas de función 3" #: src/dialogs/confdialog.cxx:10360 src/dialogs/confdialog.cxx:10555 #: src/dialogs/confdialog.cxx:12036 src/dialogs/confdialog.cxx:14187 #: src/dialogs/confdialog.cxx:18180 src/logbook/lgbook.cxx:828 msgid "Defaults" msgstr "Reiniciar" #: src/dialogs/confdialog.cxx:10363 msgid "Font/Color" msgstr "Tipografía" #: src/dialogs/confdialog.cxx:10371 src/dialogs/confdialog.cxx:10462 #: src/dialogs/confdialog.cxx:10464 msgid "Colors-Fonts/Logging controls" msgstr "" #: src/dialogs/confdialog.cxx:10375 msgid "Logging Panel Controls" msgstr "Paneles de control de registro" #: src/dialogs/confdialog.cxx:10395 msgid "Logbook Dialog" msgstr "Diálogo del libro de guardia" #: src/dialogs/confdialog.cxx:10415 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:10418 #, fuzzy msgid "Report Browser" msgstr "Navegador" #: src/dialogs/confdialog.cxx:10430 #, fuzzy msgid "Even Lines" msgstr "Lineas pares" #: src/dialogs/confdialog.cxx:10435 #, fuzzy msgid "Odd Lines" msgstr "Líneas impares" #: src/dialogs/confdialog.cxx:10440 #, fuzzy msgid "Stream Text" msgstr "Texto secundario" #: src/dialogs/confdialog.cxx:10446 #, fuzzy msgid "Bg color" msgstr "Fondo" #: src/dialogs/confdialog.cxx:10452 #, fuzzy msgid "Alt Color" msgstr "Color" #: src/dialogs/confdialog.cxx:10453 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:10467 src/dialogs/confdialog.cxx:10565 #: src/dialogs/confdialog.cxx:10567 #, fuzzy msgid "Colors-Fonts/Rx-Tx" msgstr "Colores y tipografía" #: src/dialogs/confdialog.cxx:10471 msgid "Rx/Tx Character set" msgstr "Seleccionar el conjunto de caracteres Rx/Tx" #: src/dialogs/confdialog.cxx:10472 msgid "Select Rx/Tx Character Set" msgstr "Seleccionar la tipografía de Rx/Tx" #: src/dialogs/confdialog.cxx:10492 msgid "Rx bkgnd" msgstr "Rx fondo" #: src/dialogs/confdialog.cxx:10495 msgid "Tx bkgnd" msgstr "Tx fondo" #: src/dialogs/confdialog.cxx:10504 msgid "Rx font" msgstr "Texto Rx" #: src/dialogs/confdialog.cxx:10507 msgid "Tx font" msgstr "Texto Tx" #: src/dialogs/confdialog.cxx:10516 #, fuzzy msgid "Macro Edit Font" msgstr "Editor de macros - " #: src/dialogs/confdialog.cxx:10519 msgid "Text Highlighting" msgstr "Texto Resaltado" #: src/dialogs/confdialog.cxx:10522 src/dialogs/confdialog.cxx:14169 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:10523 msgid "Sent chars in Rx/Tx pane" msgstr "Caracteres enviados en el panel de Rx/Tx" #: src/dialogs/confdialog.cxx:10528 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:10529 msgid "Control chars in Rx/Tx pane" msgstr "Caracteres de control en el panel de Rx/Tx" #: src/dialogs/confdialog.cxx:10534 msgid "SKIP" msgstr "SKIP" #: src/dialogs/confdialog.cxx:10535 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Caracteres ignorados en el panel de TX\n" "(Tx enc./apag. en CW)" #: src/dialogs/confdialog.cxx:10540 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:10541 msgid "Alternate character color in Rx panelr" msgstr "Color alternativo de los caracteres en el panel de Rxr" #: src/dialogs/confdialog.cxx:10546 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:10547 msgid "Selection background color in Rx Tx panels" msgstr "Fondo de color de la selección en los paneles de Rx/Tx" #: src/dialogs/confdialog.cxx:10552 src/dialogs/confdialog.cxx:10577 msgid "System" msgstr "Sistema" #: src/dialogs/confdialog.cxx:10560 msgid "display Rx control chars as ascii string" msgstr "" #: src/dialogs/confdialog.cxx:10570 src/dialogs/confdialog.cxx:10580 #: src/dialogs/confdialog.cxx:10582 #, fuzzy msgid "Colors-Fonts/Tabs" msgstr "Colores y tipografía" #: src/dialogs/confdialog.cxx:10574 msgid "Tab Color" msgstr "Color" #: src/dialogs/confdialog.cxx:10585 src/dialogs/confdialog.cxx:10670 #: src/dialogs/confdialog.cxx:10672 msgid "Colors-Fonts/Signal Level" msgstr "" #: src/dialogs/confdialog.cxx:10589 #, fuzzy msgid "Signal Level Indicator" msgstr "Colores de detección de nivel" #: src/dialogs/confdialog.cxx:10596 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18866 msgid "Low" msgstr "Bajo" #: src/dialogs/confdialog.cxx:10604 src/dialogs/confdialog.cxx:18874 msgid "" "Transition\n" "Level (dB)" msgstr "" #: src/dialogs/confdialog.cxx:10612 src/dialogs/confdialog.cxx:18882 msgid "Normal" msgstr "Normal" #: src/dialogs/confdialog.cxx:10627 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18897 msgid "High" msgstr "Alto" #: src/dialogs/confdialog.cxx:10642 src/dialogs/confdialog.cxx:18912 msgid "Over" msgstr "Mucho" #: src/dialogs/confdialog.cxx:10645 src/dialogs/confdialog.cxx:10648 #: src/dialogs/confdialog.cxx:10714 src/dialogs/confdialog.cxx:18915 #: src/dialogs/confdialog.cxx:18918 msgid "label" msgstr "" #: src/dialogs/confdialog.cxx:10659 src/dialogs/confdialog.cxx:18929 #, fuzzy msgid "Input signal level" msgstr "Nivel de señal" #: src/dialogs/confdialog.cxx:10664 src/dialogs/confdialog.cxx:18934 msgid "Use wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10665 src/dialogs/confdialog.cxx:18935 msgid "" "default scale is audo \"Vu Meter\"\n" "enable to emulate wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10676 src/dialogs/confdialog.cxx:10736 #: src/dialogs/confdialog.cxx:10738 #, fuzzy msgid "Colors-Fonts/Digiscope" msgstr "Colores y tipografía" #: src/dialogs/confdialog.cxx:10680 #, fuzzy #| msgid "Digit Color" msgid "Digital Scope Colors" msgstr "Dígitos" #: src/dialogs/confdialog.cxx:10687 #, fuzzy #| msgid "Backgnd" msgid "Background" msgstr "Fondo" #: src/dialogs/confdialog.cxx:10695 src/dialogs/confdialog.cxx:13791 msgid "Axis" msgstr "" #: src/dialogs/confdialog.cxx:10703 #, fuzzy #| msgid "Color" msgid "Color 1" msgstr "Color" #: src/dialogs/confdialog.cxx:10711 #, fuzzy #| msgid "Color" msgid "Color 2" msgstr "Color" #: src/dialogs/confdialog.cxx:10725 #, fuzzy #| msgid "Color" msgid "Color 3" msgstr "Color" #: src/dialogs/confdialog.cxx:10733 #, fuzzy #| msgid "Color" msgid "Color 4" msgstr "Color" #: src/dialogs/confdialog.cxx:10742 src/dialogs/confdialog.cxx:10946 #: src/dialogs/confdialog.cxx:10948 #, fuzzy msgid "Contests/General" msgstr "Concurso" #: src/dialogs/confdialog.cxx:10747 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:10762 #, fuzzy msgid "State QSO Party" msgstr "Fecha de inicio del QSO" #: src/dialogs/confdialog.cxx:10778 #, fuzzy msgid "Text capture order" msgstr "Captura de Texto" #: src/dialogs/confdialog.cxx:10779 #, fuzzy msgid "Context Notes" msgstr "Concurso" #: src/dialogs/confdialog.cxx:10791 msgid "Duplicate check, CALL plus" msgstr "Chequear duplicados, Indicativo más..." #: src/dialogs/confdialog.cxx:10794 msgid "On/Off" msgstr "On/Off" #: src/dialogs/confdialog.cxx:10795 msgid "Check for duplicates" msgstr "Comprobar si hay duplicados" #: src/dialogs/confdialog.cxx:10800 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:677 src/logbook/lgbook.cxx:1391 msgid "Band" msgstr "Banda" #: src/dialogs/confdialog.cxx:10801 msgid "Bands must match" msgstr "Concordar en bandas" #: src/dialogs/confdialog.cxx:10806 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:680 src/logbook/lgbook.cxx:955 #: src/logbook/lgbook.cxx:1619 src/logbook/lgbook.cxx:1674 msgid "Mode" msgstr "Modo" #: src/dialogs/confdialog.cxx:10807 msgid "Mode must match" msgstr "Concordar en modo" #: src/dialogs/confdialog.cxx:10812 msgid "Time span over" msgstr "Rango de tiempo" #: src/dialogs/confdialog.cxx:10813 msgid "QSO must not occur within a time period of" msgstr "El QSO no debe ocurrir dentro del período especificado a continuación." #: src/dialogs/confdialog.cxx:10818 msgid "Dup Color" msgstr "Color Dup." #: src/dialogs/confdialog.cxx:10819 msgid "Left click to select dup color" msgstr "Clic izquierdo para seleccionar el color de duplicados" #: src/dialogs/confdialog.cxx:10827 #, fuzzy msgid "? Dup Color" msgstr "Color Dup." #: src/dialogs/confdialog.cxx:10828 #, fuzzy msgid "Left click to select possible dup color" msgstr "Clic izquierdo para seleccionar el color de duplicados" #: src/dialogs/confdialog.cxx:10837 msgid "free form 1 must match" msgstr "Concordar en el número de intercambio" #: src/dialogs/confdialog.cxx:10843 msgid "State must match" msgstr "Concordar en estado (EE.UU.)" #: src/dialogs/confdialog.cxx:10848 msgid "minutes" msgstr "minutos" #: src/dialogs/confdialog.cxx:10849 msgid "Enter time span in minutes" msgstr "Entre rango de tiempo en minutos" #: src/dialogs/confdialog.cxx:10867 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Intercambio de concurso recibido" #: src/dialogs/confdialog.cxx:10870 src/dialogs/confdialog.cxx:11704 #, fuzzy msgid "Send" msgstr "Enviado:" #: src/dialogs/confdialog.cxx:10871 msgid "free form exchange" msgstr "Intercambio predefinido" #: src/dialogs/confdialog.cxx:10885 #, fuzzy msgid "RST always 599/59" msgstr "RST siempre 599" #: src/dialogs/confdialog.cxx:10886 #, fuzzy msgid "Force RST in/out to 599/59" msgstr "Forzar el RST recibido/enviado a 599" #: src/dialogs/confdialog.cxx:10891 #, fuzzy msgid "Send CW cut #'s" msgstr "Enviar números CW (5NN)" #: src/dialogs/confdialog.cxx:10892 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:10899 #, fuzzy msgid "Start Nbr" msgstr "Inicio" #: src/dialogs/confdialog.cxx:10900 msgid "Starting number" msgstr "Número de inicio" #: src/dialogs/confdialog.cxx:10915 msgid "Digits" msgstr "Dígitos" #: src/dialogs/confdialog.cxx:10916 msgid "Number of digits in serial number" msgstr "Número de dígitos en el número de serie" #: src/dialogs/confdialog.cxx:10932 msgid "Use leading zeros" msgstr "Usar ceros a la izquierda" #: src/dialogs/confdialog.cxx:10933 msgid "Insert leading zeros into Xmtd serial number" msgstr "Insertar ceros a la izquierda en el número de serie enviado" #: src/dialogs/confdialog.cxx:10938 src/dialogs/confdialog.cxx:15083 #: src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Reiniciar" #: src/dialogs/confdialog.cxx:10939 msgid "Initialize the QSO logging fields" msgstr "Inicializar la cuenta del número serie" #: src/dialogs/confdialog.cxx:10951 src/dialogs/confdialog.cxx:11000 #: src/dialogs/confdialog.cxx:11002 #, fuzzy msgid "Contests/Field Day" msgstr "Concurso" #: src/dialogs/confdialog.cxx:10955 src/logbook/lgbook.cxx:1255 #, fuzzy msgid "Operator Call" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:10956 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:10970 #, fuzzy msgid "My Section" msgstr "Acción" #: src/dialogs/confdialog.cxx:10971 #, fuzzy msgid "Field Day Section" msgstr "Acción de la rueda del ratón en la cascada" #: src/dialogs/confdialog.cxx:10985 src/dialogs/confdialog.cxx:11012 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:10986 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:11005 src/dialogs/confdialog.cxx:11064 #: src/dialogs/confdialog.cxx:11066 msgid "Contests/JOTA School" msgstr "" #: src/dialogs/confdialog.cxx:11009 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:11013 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:11029 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:11032 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:11033 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:11047 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:11048 #, fuzzy msgid "Scout Operator Name" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:11070 src/dialogs/confdialog.cxx:11109 #: src/dialogs/confdialog.cxx:11111 msgid "IDs/CW" msgstr "" #: src/dialogs/confdialog.cxx:11074 msgid "CW Postamble ID" msgstr "Post-ámbulo de ID de CW" #: src/dialogs/confdialog.cxx:11077 msgid "Transmit callsign" msgstr "Transmitir indicativo" #: src/dialogs/confdialog.cxx:11078 msgid "Send Callsign in CW at end of every transmission" msgstr "Enviar tu indicativo en CW al finalizar cada Tx" #: src/dialogs/confdialog.cxx:11083 msgid "Speed (WPM):" msgstr "Velocidad (WPM):" #: src/dialogs/confdialog.cxx:11084 msgid "Send at this WPM" msgstr "Enviar a este WPM" #: src/dialogs/confdialog.cxx:11104 msgid "CW ID modes" msgstr "Modos con CW ID" #: src/dialogs/confdialog.cxx:11114 src/dialogs/confdialog.cxx:11254 #: src/dialogs/confdialog.cxx:11256 #, fuzzy msgid "IDs/RsID" msgstr "RsID" #: src/dialogs/confdialog.cxx:11118 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:11121 msgid "Notify only" msgstr "Notificar solamente" #: src/dialogs/confdialog.cxx:11122 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Marque aquí para ser notificado cuando un RSID es recibido\n" "sin cambiar el módem y la frecuencia" #: src/dialogs/confdialog.cxx:11128 #, fuzzy #| msgid "Rig mode" msgid "Rx modes" msgstr "Modo del Radio" #: src/dialogs/confdialog.cxx:11131 msgid "Mark prev freq/mode" msgstr "Marcar frec./modo previo" #: src/dialogs/confdialog.cxx:11132 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Insertar el marcador de texto en el panel de Rx\n" "antes de cambiar la frecuencia y el módem" #: src/dialogs/confdialog.cxx:11137 msgid "Allow errors" msgstr "Permitir errores" #: src/dialogs/confdialog.cxx:11138 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Low = cero errores\n" "Medium = 1 error\n" "High = 2 errores" #: src/dialogs/confdialog.cxx:11149 msgid "Medium" msgstr "Medio" #: src/dialogs/confdialog.cxx:11154 msgid "Disable alert dialog" msgstr "Desactivar alerta" #: src/dialogs/confdialog.cxx:11155 msgid "Do not show RsID alert dialog box" msgstr "No mostrar alerta de RsID" #: src/dialogs/confdialog.cxx:11160 msgid "Disables detector" msgstr "Deshabilitar detector" #: src/dialogs/confdialog.cxx:11161 msgid "Disable further detection when RSID is received" msgstr "Desactivar la detección futura cuando un RSID es recibido" #: src/dialogs/confdialog.cxx:11168 msgid "Retain tx freq lock" msgstr "Mantenerse en frecuencia" #: src/dialogs/confdialog.cxx:11169 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "Mantener Tx en la frecuencia al cambiar a RX para RsID." #: src/dialogs/confdialog.cxx:11174 msgid "Disable freq change" msgstr "Desactivar cambio de frecuencia" #: src/dialogs/confdialog.cxx:11175 src/dialogs/confdialog.cxx:11181 msgid "Do not automatically change to RX RsID frequency" msgstr "No cambiar automáticamente a la frecuencia del RsID" #: src/dialogs/confdialog.cxx:11180 msgid "Rx/Tx RsID EOT" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "Squelch open (sec)" msgstr "Silenciado abierto (s)" #: src/dialogs/confdialog.cxx:11187 src/dialogs/confdialog.cxx:11208 msgid "Use for triggering amplifier carrier detect" msgstr "Usado para disparar amplificadores que detectan carrier" #: src/dialogs/confdialog.cxx:11196 #, fuzzy #| msgid "" #| "The RsID notification message contents and\n" #| "display characteristics are configured on the\n" #| "\"Notifications\" configure dialog." msgid "" "The RsID notification message contents and display\n" "characteristics are configured on the \"Notifications\" tab." msgstr "" "El contenido del mensaje de notificación de RsID \n" "y sus características de visualización se configuran\n" "en \"Notificaciones\" en la ventana de configuración." #: src/dialogs/confdialog.cxx:11204 msgid "Pre-Signal Tone" msgstr "Tono pre-señal" #: src/dialogs/confdialog.cxx:11207 msgid "Seconds" msgstr "Segundos" #: src/dialogs/confdialog.cxx:11216 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:11219 msgid "Transmit modes" msgstr "Modos de TX" #: src/dialogs/confdialog.cxx:11222 msgid "End of xmt ID" msgstr " ID al finalizar cada Tx" #: src/dialogs/confdialog.cxx:11223 msgid "Add RsID signal to end of transmission" msgstr "Enviar RsID al finalizar cada Tx" #: src/dialogs/confdialog.cxx:11230 #, fuzzy msgid "Min BW Detection" msgstr "Acción" #: src/dialogs/confdialog.cxx:11233 msgid "Hertz" msgstr "" #: src/dialogs/confdialog.cxx:11234 #, fuzzy #| msgid "Filter bandwidth" msgid "Minimum bandwidth" msgstr "Ancho de banda del filtro" #: src/dialogs/confdialog.cxx:11243 #, fuzzy #| msgid "Password" msgid "Passband" msgstr "Contraseña" #: src/dialogs/confdialog.cxx:11244 #, fuzzy #| msgid "" #| "ON - search over entire waterfall\n" #| "OFF - limit search to +/- 200 Hz" msgid "" "ON - search over entire waterfall\n" "OFF - limit search to BW selector" msgstr "" "ON - Buscar en toda cascada\n" "OFF - Limitar la búsqueda a +/- 200 Hz" #: src/dialogs/confdialog.cxx:11259 src/dialogs/confdialog.cxx:11335 #: src/dialogs/confdialog.cxx:11337 #, fuzzy msgid "IDs/Video" msgstr "Video" #: src/dialogs/confdialog.cxx:11263 msgid "Video Preamble ID" msgstr "Preámbulo de Video ID" #: src/dialogs/confdialog.cxx:11266 msgid "Transmit mode ID" msgstr "Transmitir el ID del modo" #: src/dialogs/confdialog.cxx:11267 msgid "Waterfall video ID" msgstr "Video ID en la cascada" #: src/dialogs/confdialog.cxx:11271 msgid "Transmit video text" msgstr "Transmitir el vídeo texto" #: src/dialogs/confdialog.cxx:11272 msgid "Waterfall video text" msgstr "Video texto en la cascada" #: src/dialogs/confdialog.cxx:11277 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:11278 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Limitar a unos pocos caracteres\n" "Como en CQEM o IOTA etc." #: src/dialogs/confdialog.cxx:11292 msgid "Use small font" msgstr "Usar tipografía pequeña" #: src/dialogs/confdialog.cxx:11293 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "On - Tipografía pequeña\n" "OFF - Tipografía grande" #: src/dialogs/confdialog.cxx:11299 msgid "Chars/Row:" msgstr "Carac/Fila:" #: src/dialogs/confdialog.cxx:11300 msgid "Set the number of characters per row" msgstr "Establecer el número de caracteres por fila" #: src/dialogs/confdialog.cxx:11320 msgid "500 Hz limit" msgstr "Límite de 500 Hz" #: src/dialogs/confdialog.cxx:11325 msgid "Mode width limit" msgstr "Límite del Modo" #: src/dialogs/confdialog.cxx:11330 msgid "Video ID modes" msgstr "Modos de Video ID" #: src/dialogs/confdialog.cxx:11341 src/dialogs/confdialog.cxx:11398 #: src/dialogs/confdialog.cxx:11400 msgid "Logging/MacLogger" msgstr "" #: src/dialogs/confdialog.cxx:11345 #, fuzzy msgid "Connect to MacLogger" msgstr "Conectar con el servidor" #: src/dialogs/confdialog.cxx:11350 #, fuzzy msgid "Capture Radio Report" msgstr "Crear un reporte Cabrillo" #: src/dialogs/confdialog.cxx:11356 #, fuzzy msgid "Capture Log Report" msgstr "Crear un reporte Cabrillo" #: src/dialogs/confdialog.cxx:11361 #, fuzzy msgid "Capture Lookup " msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:11366 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:11371 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:11376 #, fuzzy msgid "Enable UDP log file" msgstr "Activar todos" #: src/dialogs/confdialog.cxx:11381 #, fuzzy msgid "UDP data stream" msgstr "Fuente datos" #: src/dialogs/confdialog.cxx:11389 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:11392 msgid "Tune to Rx Spot" msgstr "" #: src/dialogs/confdialog.cxx:11393 #, fuzzy msgid "" "ON - use Rx spot freq\n" "OFF - use Tx spot freq" msgstr "" "Activado - Usar el último conjunto de macros\n" "Desactivado - Usar el conjunto pre-establecido" #: src/dialogs/confdialog.cxx:11403 src/dialogs/confdialog.cxx:11482 #: src/dialogs/confdialog.cxx:11484 msgid "Logging/N3FJP logs" msgstr "" #: src/dialogs/confdialog.cxx:11407 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:11412 #, fuzzy msgid "Clear text" msgstr "Limpiar lista" #: src/dialogs/confdialog.cxx:11415 #, fuzzy msgid "Address" msgstr "Servidor:" #: src/dialogs/confdialog.cxx:11416 #, fuzzy msgid "N3FJP Server IP Address" msgstr "Dirección IP" #: src/dialogs/confdialog.cxx:11430 src/dialogs/confdialog.cxx:15264 #: src/dialogs/confdialog.cxx:15288 src/dialogs/confdialog.cxx:15528 #: src/dialogs/confdialog.cxx:17016 src/dialogs/confdialog.cxx:17068 #: src/dialogs/confdialog.cxx:17115 src/dialogs/confdialog.cxx:17148 #: src/dialogs/confdialog.cxx:17368 msgid "Port" msgstr "Puerto" #: src/dialogs/confdialog.cxx:11431 msgid "N3FJP Server IP Port" msgstr "" #: src/dialogs/confdialog.cxx:11446 src/dialogs/confdialog.cxx:16948 #: src/dialogs/confdialog.cxx:17033 src/dialogs/confdialog.cxx:17047 #: src/dialogs/confdialog.cxx:17094 src/dialogs/confdialog.cxx:17160 #: src/dialogs/confdialog.cxx:17349 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" "Establece la dirección IP y el número\n" "del puerto al valor por omisión." #: src/dialogs/confdialog.cxx:11449 #, fuzzy msgid "Enable Data Stream" msgstr "Activar el registro del texto de recepción." #: src/dialogs/confdialog.cxx:11454 src/dialogs/confdialog.cxx:12842 #: src/dialogs/confdialog.cxx:13091 src/dialogs/confdialog.cxx:13390 #: src/dialogs/confdialog.cxx:15159 src/dialogs/confdialog.cxx:15543 #, fuzzy msgid "Connect" msgstr "Reconectar" #: src/dialogs/confdialog.cxx:11459 src/dialogs/confdialog.cxx:16450 #, fuzzy msgid "Connected" msgstr "Reconectar" #: src/dialogs/confdialog.cxx:11465 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:11466 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:11471 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:11472 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:11487 src/dialogs/confdialog.cxx:11614 #: src/dialogs/confdialog.cxx:11616 #, fuzzy msgid "Logging/eQSL" msgstr "Registro de QSO" #: src/dialogs/confdialog.cxx:11491 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:11492 src/dialogs/confdialog.cxx:11507 #: src/dialogs/confdialog.cxx:11542 msgid "Your login name" msgstr "Su nombre de usuario" #: src/dialogs/confdialog.cxx:11506 msgid "User ID" msgstr "Nombre de usuario" #: src/dialogs/confdialog.cxx:11522 msgid "Your login password" msgstr "Su contraseña" #: src/dialogs/confdialog.cxx:11541 msgid "QTH Nickname" msgstr "Apodo del QTH" #: src/dialogs/confdialog.cxx:11556 msgid "Verify" msgstr "" #: src/dialogs/confdialog.cxx:11557 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:11560 msgid "Options" msgstr "Opciones" #: src/dialogs/confdialog.cxx:11563 msgid "send when logged (log button, , )" msgstr "Enviar QSO al guardar un contacto (botón de guardar, , )" #: src/dialogs/confdialog.cxx:11564 msgid "automatic data upload" msgstr "Envío automático de datos a internet" #: src/dialogs/confdialog.cxx:11569 msgid "Use date/time off for log entry" msgstr "Guardar la fecha/hora de fin del QSO en el log" #: src/dialogs/confdialog.cxx:11570 msgid "default uses date/time on" msgstr "Predeterminado usa fecha/hora activado" #: src/dialogs/confdialog.cxx:11575 src/dialogs/confdialog.cxx:11690 #, fuzzy msgid "Show delivery message" msgstr "Mostrar menos modos" #: src/dialogs/confdialog.cxx:11576 src/dialogs/confdialog.cxx:11691 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:11581 msgid "Default message" msgstr "Mensaje predeterminado" #: src/dialogs/confdialog.cxx:11582 msgid "default text to send with etc" msgstr "texto predeterminado para enviar con una entrada de " #: src/dialogs/confdialog.cxx:11596 msgid "Text Tags (tags use {} delimiters)" msgstr "Etiquetas de texto (use el delimitador {})" #: src/dialogs/confdialog.cxx:11599 msgid " {CALL} other ops call sign" msgstr " {CALL} indicativo del otro operador" #: src/dialogs/confdialog.cxx:11602 msgid " {MODE} full mode / submode" msgstr " {MODE} modo completo / submodo" #: src/dialogs/confdialog.cxx:11605 msgid "{NAME} other ops name" msgstr "{NAME}\tnombre del otro operador" #: src/dialogs/confdialog.cxx:11608 msgid "These tags can also be used in " msgstr "Etiquetas para usar en el macro " #: src/dialogs/confdialog.cxx:11619 src/dialogs/confdialog.cxx:11751 #: src/dialogs/confdialog.cxx:11753 #, fuzzy msgid "Logging/LoTW" msgstr "Registro de QSO" #: src/dialogs/confdialog.cxx:11623 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:11624 #, fuzzy msgid "Enter full path-filename for tqsl executable" msgstr "Entre la ruta completa del ejecutable flnet" #: src/dialogs/confdialog.cxx:11638 #, fuzzy msgid "Your tqsl login password" msgstr "Su contraseña" #: src/dialogs/confdialog.cxx:11653 #, fuzzy msgid "Password required" msgstr "Contraseña" #: src/dialogs/confdialog.cxx:11654 msgid "Submit password with each upload" msgstr "" #: src/dialogs/confdialog.cxx:11659 #, fuzzy msgid "Location" msgstr "Cuadrícula" #: src/dialogs/confdialog.cxx:11660 #, fuzzy msgid "tqsl station location" msgstr "Localización de la estación METAR" #: src/dialogs/confdialog.cxx:11674 src/dialogs/confdialog.cxx:16002 #: src/dialogs/confdialog.cxx:16020 src/dialogs/confdialog.cxx:16038 #: src/dialogs/confdialog.cxx:16056 src/dialogs/confdialog.cxx:16074 #: src/dialogs/confdialog.cxx:16092 src/dialogs/confdialog.cxx:16110 msgid "Locate" msgstr "Buscar" #: src/dialogs/confdialog.cxx:11675 #, fuzzy msgid "Locate tqsl executable" msgstr "Buscar ejecutable" #: src/dialogs/confdialog.cxx:11678 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "" #: src/dialogs/confdialog.cxx:11679 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Send QSO data to LoTW when logged" msgstr "" #: src/dialogs/confdialog.cxx:11685 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:11696 #, fuzzy msgid "Export" msgstr "Exportar..." #: src/dialogs/confdialog.cxx:11697 msgid "Export records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:11700 src/logbook/lgbook.cxx:770 #: src/logbook/lgbook.cxx:1403 src/logbook/lgbook.cxx:1456 #, fuzzy msgid "Check" msgstr "Marcar todo" #: src/dialogs/confdialog.cxx:11701 msgid "Review lotw.adif file before sending with tqsl" msgstr "" #: src/dialogs/confdialog.cxx:11705 msgid "Send lotw.adif via tqsl" msgstr "" #: src/dialogs/confdialog.cxx:11708 msgid "Export logbook records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:11711 msgid "Review / edit the exported LoTW upload adif file" msgstr "" #: src/dialogs/confdialog.cxx:11714 msgid "Submit the upload adif file to LoTW" msgstr "" #: src/dialogs/confdialog.cxx:11717 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" #: src/dialogs/confdialog.cxx:11725 #, fuzzy msgid "Use this tqsl station location" msgstr "Localización de la estación METAR" #: src/dialogs/confdialog.cxx:11728 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:11729 src/dialogs/confdialog.cxx:11736 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:11732 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:11735 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:11740 #, fuzzy msgid "Timeout" msgstr "Se ha demorado demasiado" #: src/dialogs/confdialog.cxx:11741 #, fuzzy msgid "Wait NN seconds for LoTW response" msgstr "Intervalo de espera (ms) antes de leer la espuesta" #: src/dialogs/confdialog.cxx:11756 src/dialogs/confdialog.cxx:11807 #: src/dialogs/confdialog.cxx:11809 #, fuzzy msgid "Logging/Cloudlog" msgstr "Búsqueda de indicativo" #: src/dialogs/confdialog.cxx:11760 msgid "This allows for logging of QSOs to a Cloudlog instance." msgstr "" #: src/dialogs/confdialog.cxx:11764 msgid "Enable Cloudlog API logging" msgstr "" #: src/dialogs/confdialog.cxx:11765 msgid "This enables logging of QSOs to Cloudlog via API" msgstr "" #: src/dialogs/confdialog.cxx:11770 msgid "API URL:" msgstr "" #: src/dialogs/confdialog.cxx:11771 msgid "Enter the URL of your Cloudlog API" msgstr "" #: src/dialogs/confdialog.cxx:11784 msgid "API Key:" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "Enter the API key for your Cloudlog instance" msgstr "" #: src/dialogs/confdialog.cxx:11798 #, fuzzy msgid "Station ID:" msgstr "Estación" #: src/dialogs/confdialog.cxx:11803 src/dialogs/confdialog.cxx:16485 #: src/dialogs/confdialog.cxx:17555 src/dialogs/confdialog.cxx:17650 #: src/dialogs/confdialog.cxx:18174 src/dialogs/confdialog.cxx:18269 msgid "Initialize" msgstr "Inicializar" #: src/dialogs/confdialog.cxx:11804 msgid "Test API Key" msgstr "" #: src/dialogs/confdialog.cxx:11813 src/dialogs/confdialog.cxx:11893 #: src/dialogs/confdialog.cxx:11895 #, fuzzy msgid "Logging/QSO logging" msgstr "Registro de los QSO" #: src/dialogs/confdialog.cxx:11817 msgid "Prompt to save log on exit" msgstr "Confirmar si graba el log al salir" #: src/dialogs/confdialog.cxx:11818 src/dialogs/confdialog.cxx:11887 #: src/dialogs/confdialog.cxx:19222 msgid "Bug me about saving log entries" msgstr "Pregunta acerca de grabar los registros del log" #: src/dialogs/confdialog.cxx:11823 msgid "Clear on save" msgstr "Limpiar al grabar" #: src/dialogs/confdialog.cxx:11824 msgid "Clear log entries after saving or using macro " msgstr "" "Limpiar la entradas del log después\n" "de guardar o usar la macro " #: src/dialogs/confdialog.cxx:11829 msgid "Convert callsign to upper case" msgstr "Convertir el indicativo a mayúsculas" #: src/dialogs/confdialog.cxx:11830 msgid "Force callsign field to UPPERCASE" msgstr "Forzar el campo indicativo a MAYUSCULAS" #: src/dialogs/confdialog.cxx:11835 msgid "Auto-fill Country and Azimuth" msgstr "Autocompletar el país y azimut" #: src/dialogs/confdialog.cxx:11836 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "" "Autocompletar la información del país y del azimut usando el archivo cty.dat " "(Lo tienes instalado, ¿cierto?)" #: src/dialogs/confdialog.cxx:11841 msgid "Sort by Date/Time OFF" msgstr "Ordenar por fecha/hora de fin" #: src/dialogs/confdialog.cxx:11842 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Ordenar por fecha y hora de terminación del QSO\n" "Afecta a todos los libros de guardia con formato Cabrillo/ADIF" #: src/dialogs/confdialog.cxx:11847 msgid "Date time ON == OFF" msgstr "Fecha y hora de inicio = fin" #: src/dialogs/confdialog.cxx:11848 msgid "Force date/time ON == date/time OFF" msgstr "Forzar fecha/hora de inicio = fecha/hora de final del QSO" #: src/dialogs/confdialog.cxx:11853 #, fuzzy msgid "Default RST in to 599/59" msgstr "RST recibido a 599 por omisión" #: src/dialogs/confdialog.cxx:11854 #, fuzzy msgid "Clear log controls sets RST in to 599/59" msgstr "" "Al limpiar los datos del contacto\n" "pone el RST recibido a 599 por omisión" #: src/dialogs/confdialog.cxx:11859 #, fuzzy msgid "Default RST out to 599/59" msgstr "Poner siempre RST enviado a 599" #: src/dialogs/confdialog.cxx:11860 #, fuzzy msgid "Clear log controls sets RST out to 599/59" msgstr "" "Al limpiar los datos del contacto\n" "pone el RST enviado a 599 por omisión" #: src/dialogs/confdialog.cxx:11865 msgid "Transmit Power" msgstr "Potencia TX" #: src/dialogs/confdialog.cxx:11866 msgid "Tx power used for logbook entries" msgstr "Potencia de TX a poner en el log" #: src/dialogs/confdialog.cxx:11880 #, fuzzy msgid "Display logbook read datum at start" msgstr "Mostrar el nombre del archivo de macros al iniciar" #: src/dialogs/confdialog.cxx:11881 src/dialogs/confdialog.cxx:19372 msgid "The filename is written to the RX text area" msgstr "El nombre de archivo es escrito en el panel de Rx" #: src/dialogs/confdialog.cxx:11886 msgid "Log power meter " msgstr "" #: src/dialogs/confdialog.cxx:11899 src/dialogs/confdialog.cxx:12167 #: src/dialogs/confdialog.cxx:12169 #, fuzzy msgid "Modem/CW/General" msgstr "General" #: src/dialogs/confdialog.cxx:11906 msgid "SOM decoding" msgstr "Descodificación MAO" #: src/dialogs/confdialog.cxx:11907 msgid "Self Organizing Mapping" msgstr "" "Mapas Auto Organizados (Self Organizing Mapping)\n" "Es un algoritmo de inteligencia artificial que mejora la descodificación." #: src/dialogs/confdialog.cxx:11913 #, fuzzy #| msgid "Tracking" msgid "WPM Tracking" msgstr "Seguimiento" #: src/dialogs/confdialog.cxx:11914 msgid "Automatic Rx speed tracking" msgstr "Seguimiento automático de la velocidad de Rx" #: src/dialogs/confdialog.cxx:11920 msgid "Filter bandwidth" msgstr "Ancho de banda del filtro" #: src/dialogs/confdialog.cxx:11921 msgid "CW dsp filter bandwidth" msgstr "Ancho de banda del filtro DSP de CW" #: src/dialogs/confdialog.cxx:11941 #, fuzzy msgid "Matched Filt'" msgstr "Filtro" #: src/dialogs/confdialog.cxx:11942 msgid "Matched Filter bandwidth" msgstr "Ancho de banda del filtro" #: src/dialogs/confdialog.cxx:11948 msgid "Rx WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:11954 msgid "Tracked CW speed in WPM" msgstr "Velocidad de seguimiento en CW (WPM)" #: src/dialogs/confdialog.cxx:11959 msgid "Lower" msgstr "Inferior" #: src/dialogs/confdialog.cxx:11960 msgid "Detector low threshold" msgstr "Umbral bajo del detector" #: src/dialogs/confdialog.cxx:11980 msgid "Upper" msgstr "Superior" #: src/dialogs/confdialog.cxx:11981 msgid "Detector high threshold" msgstr "Umbral alto del detector" #: src/dialogs/confdialog.cxx:12001 #, fuzzy msgid "Range" msgstr "Rango de señal (dB)" #: src/dialogs/confdialog.cxx:12002 msgid "Range +/- wpm" msgstr "Rango +/- wpm" #: src/dialogs/confdialog.cxx:12021 #, fuzzy #| msgid "Signal tracks" msgid "Signal tracking" msgstr "Marcas de línea" #: src/dialogs/confdialog.cxx:12024 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:12030 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:12046 #, fuzzy msgid "char WPM" msgstr "caract." #: src/dialogs/confdialog.cxx:12047 src/dialogs/confdialog.cxx:12112 #: src/dialogs/confdialog.cxx:12139 msgid "My transmit CW WPM" msgstr "Mi velocidad CW (WPM)" #: src/dialogs/confdialog.cxx:12068 msgid "The default CW speed" msgstr "La velocidad predefinida en CW" #: src/dialogs/confdialog.cxx:12087 src/dialogs/confdialog.cxx:19811 msgid "Lower limit" msgstr "límite inferior" #: src/dialogs/confdialog.cxx:12088 msgid "No slower than this" msgstr "No más lento que" #: src/dialogs/confdialog.cxx:12099 src/dialogs/confdialog.cxx:19856 msgid "Upper limit" msgstr "Límite superior" #: src/dialogs/confdialog.cxx:12100 msgid "No faster than this" msgstr "No más rápido que" #: src/dialogs/confdialog.cxx:12111 #, fuzzy msgid "text WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:12132 msgid "Use Farnsworth timing" msgstr "Usar tiempos Farnsworth" #: src/dialogs/confdialog.cxx:12133 src/dialogs/confdialog.cxx:12160 msgid "text WPM <= char WPM" msgstr "" #: src/dialogs/confdialog.cxx:12138 #, fuzzy msgid "Spacing WPM" msgstr "Rango (WPM)" #: src/dialogs/confdialog.cxx:12159 #, fuzzy #| msgid "Use Farnsworth timing" msgid "Use Wordsworth timing" msgstr "Usar tiempos Farnsworth" #: src/dialogs/confdialog.cxx:12172 src/dialogs/confdialog.cxx:12370 #: src/dialogs/confdialog.cxx:12372 #, fuzzy msgid "Modem/CW/Timing and QSK" msgstr "Tiempos y QSK" #: src/dialogs/confdialog.cxx:12176 msgid "Timing" msgstr "Temporización" #: src/dialogs/confdialog.cxx:12179 src/dialogs/confdialog.cxx:13130 msgid "Dash/Dot" msgstr "" #: src/dialogs/confdialog.cxx:12180 src/dialogs/confdialog.cxx:13131 msgid "Dash to dot ratio" msgstr "Relación punto a raya" #: src/dialogs/confdialog.cxx:12198 src/dialogs/confdialog.cxx:12321 msgid "Edge timing" msgstr "Tiempos de borde" #: src/dialogs/confdialog.cxx:12199 src/dialogs/confdialog.cxx:12322 msgid "Leading and Trailing edge risetimes (msec)" msgstr "Tiempos de subida y bajada del pulso (ms)" #: src/dialogs/confdialog.cxx:12217 msgid "Edge shape" msgstr "Forma del borde" #: src/dialogs/confdialog.cxx:12218 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:12236 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12239 msgid "QSK on right audio channel" msgstr "QSK en el canal derecho de audio" #: src/dialogs/confdialog.cxx:12240 msgid "Generate square wave signal on right channel" msgstr "Generar una onda cuadrada en el canal derecho" #: src/dialogs/confdialog.cxx:12245 #, fuzzy msgid "QSK frequency" msgstr "Frecuencia errónea" #: src/dialogs/confdialog.cxx:12246 msgid "Fundamental frequency of QSK square wave signal" msgstr "" #: src/dialogs/confdialog.cxx:12265 msgid "Pre-keydown timing (ms)" msgstr "Tiempos anteriores al PTT (ms)" #: src/dialogs/confdialog.cxx:12266 msgid "Msec pre-keydown" msgstr "" #: src/dialogs/confdialog.cxx:12283 msgid "Post-keydown timing (ms)" msgstr "Tiempos posteriores al PTT (ms)" #: src/dialogs/confdialog.cxx:12284 msgid "Msec post-keydown" msgstr "" #: src/dialogs/confdialog.cxx:12301 #, fuzzy msgid "QSK amplitude" msgstr "Tasa de muestreo" #: src/dialogs/confdialog.cxx:12302 msgid "Amplitude of right channel QSK signal" msgstr "" #: src/dialogs/confdialog.cxx:12342 #, fuzzy msgid "Send Test character" msgstr "Bits por caracter" #: src/dialogs/confdialog.cxx:12345 msgid "Test char" msgstr "Letra de prueba" #: src/dialogs/confdialog.cxx:12346 msgid "Test character for QSK adjustment" msgstr "Probar el carácter para ajuste de QSK" #: src/dialogs/confdialog.cxx:12362 msgid "Send continuously" msgstr "Enviar continuamente" #: src/dialogs/confdialog.cxx:12363 msgid "Send a continuous stream of test characters" msgstr "Enviar flujo de los caracteres de prueba" #: src/dialogs/confdialog.cxx:12375 src/dialogs/confdialog.cxx:12580 #: src/dialogs/confdialog.cxx:12582 #, fuzzy msgid "Modem/CW/Prosigns" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:12379 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:12382 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:12383 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:12385 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:12386 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:12388 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:12389 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:12391 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:12392 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:12394 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:12395 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:12397 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:12398 src/dialogs/confdialog.cxx:12401 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:12400 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:12403 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:12404 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:12406 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:12407 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:12409 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:12410 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:12412 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:12413 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:12417 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12434 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12451 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12468 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12484 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12501 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12535 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12552 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12569 msgid "Use '(' paren not KN" msgstr "Usar '(' en vez de KN" #: src/dialogs/confdialog.cxx:12574 #, fuzzy msgid "Display decoded as assigned key" msgstr "Mostrar datos decodificados en unidades del SIU (m, Km)" #: src/dialogs/confdialog.cxx:12575 msgid "Display the decoded prosign in the RX text using the short cut key" msgstr "" #: src/dialogs/confdialog.cxx:12585 src/dialogs/confdialog.cxx:12683 #: src/dialogs/confdialog.cxx:12685 msgid "Modem/CW/Extended Chars." msgstr "" #: src/dialogs/confdialog.cxx:12589 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:12594 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:12595 src/dialogs/confdialog.cxx:12601 #: src/dialogs/confdialog.cxx:12609 src/dialogs/confdialog.cxx:12617 #: src/dialogs/confdialog.cxx:12623 src/dialogs/confdialog.cxx:12629 #: src/dialogs/confdialog.cxx:12637 src/dialogs/confdialog.cxx:12643 #: src/dialogs/confdialog.cxx:12649 src/dialogs/confdialog.cxx:12655 #: src/dialogs/confdialog.cxx:12663 src/dialogs/confdialog.cxx:12669 #: src/dialogs/confdialog.cxx:12933 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:12600 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12608 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:12616 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:12622 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:12628 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12636 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:12642 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:12648 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:12654 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:12662 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12668 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:12676 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:12688 msgid "Punctuation/Noise Processing" msgstr "" #: src/dialogs/confdialog.cxx:12692 msgid "Check to enable character encode/decode" msgstr "" #: src/dialogs/confdialog.cxx:12695 msgid " backslash \\ \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12696 src/dialogs/confdialog.cxx:12704 #: src/dialogs/confdialog.cxx:12712 src/dialogs/confdialog.cxx:12720 #: src/dialogs/confdialog.cxx:12728 src/dialogs/confdialog.cxx:12736 #: src/dialogs/confdialog.cxx:12744 src/dialogs/confdialog.cxx:12752 #: src/dialogs/confdialog.cxx:12760 src/dialogs/confdialog.cxx:12768 #: src/dialogs/confdialog.cxx:12776 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable for no printed character" msgstr "Activar esto para caracteres acentuados" #: src/dialogs/confdialog.cxx:12703 msgid " apostrophe ' \".----.\"" msgstr "" #: src/dialogs/confdialog.cxx:12711 msgid " quote \" \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12719 msgid " dollar sign $ \"...-..-\"" msgstr "" #: src/dialogs/confdialog.cxx:12727 msgid " open_paren ( \"-.--.\"" msgstr "" #: src/dialogs/confdialog.cxx:12735 msgid " close paren ) \"-.--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12743 msgid " colon : \"---...\"" msgstr "" #: src/dialogs/confdialog.cxx:12751 msgid " semi colon ; \"-.-.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12759 msgid " underscore _ \"..--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12767 msgid " at symbol @@ \".--.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12775 msgid " exclamation ! \"-.-.--\"" msgstr "" #: src/dialogs/confdialog.cxx:12785 msgid "Unknown character decode (noise)" msgstr "" #: src/dialogs/confdialog.cxx:12788 msgid " Do not display unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12789 src/dialogs/confdialog.cxx:12796 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable '*'or no printed character" msgstr "Activar esto para caracteres acentuados" #: src/dialogs/confdialog.cxx:12795 msgid " Display '*' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12802 msgid " Display '_' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12803 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable '_' for no printed character" msgstr "Activar esto para caracteres acentuados" #: src/dialogs/confdialog.cxx:12809 msgid " Display ' ' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12810 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable ' ' for no printed character" msgstr "Activar esto para caracteres acentuados" #: src/dialogs/confdialog.cxx:12818 src/dialogs/confdialog.cxx:12820 #, fuzzy msgid "Modem/CW/Punctuation-Noise" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:12823 src/dialogs/confdialog.cxx:13067 #: src/dialogs/confdialog.cxx:13069 msgid "Modem/CW/WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:12827 src/dialogs/confdialog.cxx:13076 #: src/dialogs/confdialog.cxx:15144 #, fuzzy msgid "Ser. Port" msgstr "Puerto" #: src/dialogs/confdialog.cxx:12828 src/dialogs/confdialog.cxx:15529 #, fuzzy msgid "Xcvr serial port" msgstr "Puerto serie" #: src/dialogs/confdialog.cxx:12843 src/dialogs/confdialog.cxx:15544 #, fuzzy msgid "Connect / Disconnect from WinKeyer" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:12847 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:12851 #, fuzzy msgid "Bk" msgstr "Atrás" #: src/dialogs/confdialog.cxx:12855 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:12859 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:12863 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:12867 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:12880 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:12893 src/dialogs/confdialog.cxx:15617 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:12906 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:12919 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:12920 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:12927 #, fuzzy msgid "WPM setting" msgstr "Configuraciones" #: src/dialogs/confdialog.cxx:12929 src/dialogs/confdialog.cxx:12958 #, fuzzy msgid "ModeReg" msgstr "Modo" #: src/dialogs/confdialog.cxx:12932 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:12937 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:12938 #, fuzzy msgid "Enable paddle auto spacing of characters" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:12942 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:12943 #, fuzzy msgid "Enable contest character spacing" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:12947 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:12951 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:12952 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:12961 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:12962 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:12966 #, fuzzy msgid "Serial echo" msgstr "Dispositivo serie" #: src/dialogs/confdialog.cxx:12971 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:12972 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:12976 #, fuzzy msgid "Tone ON" msgstr "Hora com." #: src/dialogs/confdialog.cxx:12977 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:12981 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:12982 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:12988 #, fuzzy msgid "WPM Settings" msgstr "Configuraciones" #: src/dialogs/confdialog.cxx:12991 src/dialogs/confdialog.cxx:13211 #, fuzzy msgid "Min WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:12992 src/dialogs/confdialog.cxx:13212 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:13000 src/dialogs/confdialog.cxx:13221 #, fuzzy msgid "Rng WPM" msgstr "Rango (WPM)" #: src/dialogs/confdialog.cxx:13001 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:13005 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:13006 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13010 #, fuzzy msgid "Cmd WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:13011 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:13017 #, fuzzy msgid "Timing/Settings" msgstr "Configuraciones" #: src/dialogs/confdialog.cxx:13020 #, fuzzy msgid "Ratio" msgstr "Cuadrícula" #: src/dialogs/confdialog.cxx:13021 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:13025 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:13026 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13030 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:13031 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13035 #, fuzzy msgid "Sample" msgstr "Tasa de muestreo" #: src/dialogs/confdialog.cxx:13036 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:13040 #, fuzzy msgid "Weight" msgstr "Peso (en %)" #: src/dialogs/confdialog.cxx:13041 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13050 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:13051 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13059 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:13060 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:13072 src/dialogs/confdialog.cxx:13277 #: src/dialogs/confdialog.cxx:13279 msgid "Modem/CW/nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13077 src/dialogs/confdialog.cxx:13376 #: src/dialogs/confdialog.cxx:15145 #, fuzzy msgid "nanoIO serial port" msgstr "Puerto serie" #: src/dialogs/confdialog.cxx:13092 src/dialogs/confdialog.cxx:13391 #: src/dialogs/confdialog.cxx:15160 #, fuzzy msgid "Connect / Disconnect from nanoIO" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:13095 #, fuzzy msgid "Paddle" msgstr "Rango (WPM)" #: src/dialogs/confdialog.cxx:13096 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:13119 src/dialogs/confdialog.cxx:13239 #: src/dialogs/confdialog.cxx:13261 #, fuzzy msgid "Comp'" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:13120 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:13149 #, fuzzy msgid "Baud" msgstr "Tasa de baudios" #: src/dialogs/confdialog.cxx:13164 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:13179 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:13195 src/dialogs/confdialog.cxx:15192 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:13198 src/dialogs/confdialog.cxx:15195 #, fuzzy msgid "Status" msgstr "Estado" #: src/dialogs/confdialog.cxx:13199 src/dialogs/confdialog.cxx:15196 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13204 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:13205 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:13222 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:13233 #, fuzzy msgid "PTT off" msgstr "Dif. en Tx" #: src/dialogs/confdialog.cxx:13234 #, fuzzy msgid "Disable PTT" msgstr "Desactivar" #: src/dialogs/confdialog.cxx:13242 #, fuzzy msgid "WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:13252 #, fuzzy msgid "Test =>" msgstr "Probar" #: src/dialogs/confdialog.cxx:13253 #, fuzzy msgid "Send \"paris \" WPM times" msgstr "Enviar a este WPM" #: src/dialogs/confdialog.cxx:13256 msgid "secs' =>" msgstr "" #: src/dialogs/confdialog.cxx:13257 #, fuzzy msgid "Test duration (60 seconds)" msgstr "Duración del tono (s)" #: src/dialogs/confdialog.cxx:13262 msgid "Compensationin microseconds" msgstr "" #: src/dialogs/confdialog.cxx:13266 msgid "Adjust" msgstr "" #: src/dialogs/confdialog.cxx:13267 msgid "send compensation to nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13272 msgid "CW i/o" msgstr "" #: src/dialogs/confdialog.cxx:13273 msgid "Enable CW operation" msgstr "" #: src/dialogs/confdialog.cxx:13282 src/dialogs/confdialog.cxx:13404 #: src/dialogs/confdialog.cxx:13406 msgid "Modem/CW/DTR-RTS keying" msgstr "" #: src/dialogs/confdialog.cxx:13288 msgid "" "DTR/RTS keying may be assigned to flrig, share the RigCat serial port,\n" "share the Separate PTT serial port, or be assigned to separate serial port.\n" "\n" "No settings for baud, stops bits, etc are needed." msgstr "" #: src/dialogs/confdialog.cxx:13297 msgid "Use flrig DTR/RTS keying" msgstr "" #: src/dialogs/confdialog.cxx:13303 #, fuzzy msgid "Disable flrig CW PTT" msgstr "Desactivar" #: src/dialogs/confdialog.cxx:13304 src/dialogs/confdialog.cxx:13451 msgid "" "Required for some transceivers\n" "e.g. TS-480" msgstr "" #: src/dialogs/confdialog.cxx:13313 #, fuzzy msgid "Share RIGCAT port" msgstr "Puerto serie" #: src/dialogs/confdialog.cxx:13319 msgid "Share Separate PTT port" msgstr "" #: src/dialogs/confdialog.cxx:13325 msgid "CW Keyline" msgstr "" #: src/dialogs/confdialog.cxx:13340 msgid "Keying compensation (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13341 msgid "Dot / Space timing increment" msgstr "" #: src/dialogs/confdialog.cxx:13359 msgid "PTT keyline" msgstr "" #: src/dialogs/confdialog.cxx:13375 #, fuzzy msgid "Use Separate Keying Serial Port" msgstr "PTT por puerto serie separado" #: src/dialogs/confdialog.cxx:13395 msgid "Speed test" msgstr "" #: src/dialogs/confdialog.cxx:13396 msgid "1 minute 'PARIS '" msgstr "" #: src/dialogs/confdialog.cxx:13400 msgid "Result" msgstr "" #: src/dialogs/confdialog.cxx:13409 #, fuzzy msgid "Modem/CW/CAT Keying" msgstr "General" #: src/dialogs/confdialog.cxx:13413 msgid "" "CW keying using CAT command strings. Available for supported transceivers.\n" "Use with RigCAT or flrig transceiver control. A separate serial port is NOT " "needed.\n" "\n" "Disable CAT PTT if transceiver interprets that as a keydown command (e.g. " "TS480).\n" "Recommend setting transceiver to either semi or full break-in.\n" "\n" "Enter correct CIV address for Icom transceivers." msgstr "" #: src/dialogs/confdialog.cxx:13424 msgid "Icom" msgstr "" #: src/dialogs/confdialog.cxx:13429 msgid "Hex CIV addr" msgstr "" #: src/dialogs/confdialog.cxx:13430 msgid "Enter transceiver HEX CIV address" msgstr "" #: src/dialogs/confdialog.cxx:13435 msgid "Elecraft" msgstr "" #: src/dialogs/confdialog.cxx:13440 msgid "Kenwood" msgstr "" #: src/dialogs/confdialog.cxx:13445 msgid "Yaesu" msgstr "" #: src/dialogs/confdialog.cxx:13450 #, fuzzy msgid "Disable CAT PTT" msgstr "Desactivar" #: src/dialogs/confdialog.cxx:13456 src/dialogs/confdialog.cxx:13458 #, fuzzy msgid "Modem/CW/CAT keying" msgstr "General" #: src/dialogs/confdialog.cxx:13461 msgid "CW CAT & WinKeyer Compensation" msgstr "" #: src/dialogs/confdialog.cxx:13465 msgid "" "Compute timing compensation for CAT CW and WinKeyer CW. Computation at " "current\n" "WPM . Set WPM to nominal (suggest 20 WPM).\n" "\n" "Compensation will be good over a +/- 10 WPM range. Calibration/Test is 1 " "minute of\n" "'PARIS '." msgstr "" #: src/dialogs/confdialog.cxx:13473 #, fuzzy msgid "Calibrate" msgstr "Tasa de muestreo" #: src/dialogs/confdialog.cxx:13474 src/dialogs/confdialog.cxx:13489 msgid "Send WPM 'PARIS ' words" msgstr "" #: src/dialogs/confdialog.cxx:13477 #, fuzzy msgid "Compensate (secs)" msgstr "Lento (4 ms)" #: src/dialogs/confdialog.cxx:13485 #, fuzzy #| msgid "Clear on save" msgid "Clear compensation" msgstr "Limpiar al grabar" #: src/dialogs/confdialog.cxx:13488 src/dialogs/confdialog.cxx:14847 #: src/dialogs/confdialog.cxx:16157 src/dialogs/confdialog.cxx:16161 #: src/dialogs/confdialog.cxx:16165 src/dialogs/confdialog.cxx:16169 #: src/dialogs/confdialog.cxx:16173 src/dialogs/confdialog.cxx:16177 #: src/dialogs/confdialog.cxx:16181 src/dialogs/confdialog.cxx:18399 #: src/dialogs/confdialog.cxx:18428 src/dialogs/confdialog.cxx:18457 #: src/dialogs/confdialog.cxx:18486 src/dialogs/confdialog.cxx:18505 msgid "Test" msgstr "Probar" #: src/dialogs/confdialog.cxx:13492 msgid "secs" msgstr "" #: src/dialogs/confdialog.cxx:13498 src/dialogs/confdialog.cxx:13500 #, fuzzy msgid "Modem/CW/CAT comp'" msgstr "Módem" #: src/dialogs/confdialog.cxx:13503 src/dialogs/confdialog.cxx:13591 #: src/dialogs/confdialog.cxx:13593 msgid "Modem/DominoEX" msgstr "" #: src/dialogs/confdialog.cxx:13507 src/dialogs/confdialog.cxx:15724 msgid "Secondary Text" msgstr "Texto secundario" #: src/dialogs/confdialog.cxx:13508 src/dialogs/confdialog.cxx:15725 msgid "Text to send during keyboard idle times" msgstr "" "Texto a enviar durante los períodos de no actividad\n" "del teclado (canal secundario)" #: src/dialogs/confdialog.cxx:13522 src/dialogs/confdialog.cxx:15739 msgid "Filtering" msgstr "Filtraje" #: src/dialogs/confdialog.cxx:13523 msgid "Use DSP filter before decoder" msgstr "Usar el filtro DSP antes del decodificador" #: src/dialogs/confdialog.cxx:13529 src/dialogs/confdialog.cxx:15746 msgid "Filter bandwidth factor" msgstr "Factor de ancho de banda del filtro" #: src/dialogs/confdialog.cxx:13530 src/dialogs/confdialog.cxx:15747 msgid "Filter bandwidth relative to signal width" msgstr "Ancho de banda del filtro relativo al ancho de la señal" #: src/dialogs/confdialog.cxx:13548 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:13549 msgid "Enable MultiPSK-compatible FEC" msgstr "Activar el FEC compatible con MultiPSK" #: src/dialogs/confdialog.cxx:13554 src/dialogs/confdialog.cxx:15765 msgid "CWI threshold" msgstr "Umbral de CWI" #: src/dialogs/confdialog.cxx:13555 src/dialogs/confdialog.cxx:15766 msgid "CWI detection and suppression" msgstr "Detección y supresión de CWI" #: src/dialogs/confdialog.cxx:13571 src/dialogs/confdialog.cxx:15801 msgid "Paths (hidden)" msgstr "Rutas (Oculto)" #: src/dialogs/confdialog.cxx:13596 src/dialogs/confdialog.cxx:13736 #: src/dialogs/confdialog.cxx:13738 msgid "Modem/Feld Hell" msgstr "" #: src/dialogs/confdialog.cxx:13600 #, fuzzy msgid "Hell Transmit Parameters" msgstr "Potencia TX" #: src/dialogs/confdialog.cxx:13603 msgid "Transmit font" msgstr "Tipografía de Tx" #: src/dialogs/confdialog.cxx:13604 msgid "Select TX raster font" msgstr "Seleccionar la tipografía de Tx" #: src/dialogs/confdialog.cxx:13620 msgid "Pulse shape" msgstr "Forma del pulso" #: src/dialogs/confdialog.cxx:13621 msgid "Raised cosine pulse shape factor" msgstr "Factor de forma pulsada al coseno elevado " #: src/dialogs/confdialog.cxx:13632 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:13637 msgid "Transmit periods (.) when idle" msgstr "Transmitir puntos (...) cuando holgazanee" #: src/dialogs/confdialog.cxx:13638 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" "Transmitir puntos continuos (.......)\n" "cuando no halla que transmitir" #: src/dialogs/confdialog.cxx:13644 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:13645 #, fuzzy msgid "Range 1...3" msgstr "Cambiar carpeta" #: src/dialogs/confdialog.cxx:13659 #, fuzzy msgid "Hell Receive Parameters" msgstr "Seleccionar los parámetros de configuración" #: src/dialogs/confdialog.cxx:13662 msgid "Reverse video" msgstr "Video inverso" #: src/dialogs/confdialog.cxx:13663 msgid "Display RX in reverse video" msgstr "Mostrar Rx en video inverso" #: src/dialogs/confdialog.cxx:13668 #, fuzzy msgid "Marquee text" msgstr "Limpiar lista" #: src/dialogs/confdialog.cxx:13669 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:13674 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:13675 #, fuzzy msgid "Range 1...4" msgstr "Cambiar carpeta" #: src/dialogs/confdialog.cxx:13687 #, fuzzy msgid "Rx Height in pixels" msgstr "Altura de la cascada" #: src/dialogs/confdialog.cxx:13688 msgid "May require resizing the Rx/Tx panel" msgstr "" #: src/dialogs/confdialog.cxx:13700 msgid "Receive filter bandwidth" msgstr "Ancho de banda del filtro de Rx" #: src/dialogs/confdialog.cxx:13701 msgid "Adjust the DSP bandwidth" msgstr "Ajustar el ancho de banda del DSP" #: src/dialogs/confdialog.cxx:13721 msgid "Rx AGC" msgstr "" #: src/dialogs/confdialog.cxx:13722 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "" #: src/dialogs/confdialog.cxx:13741 src/dialogs/confdialog.cxx:13976 #: src/dialogs/confdialog.cxx:13978 #, fuzzy msgid "Modem/FMT" msgstr "Módem" #: src/dialogs/confdialog.cxx:13745 msgid "Audio Stream Procesing" msgstr "" #: src/dialogs/confdialog.cxx:13748 src/dialogs/confdialog.cxx:18717 msgid "Sample rate" msgstr "Tasa de muestreo" #: src/dialogs/confdialog.cxx:13749 #, fuzzy msgid "FMT sample rate" msgstr "Tasa de muestreo" #: src/dialogs/confdialog.cxx:13764 msgid "Rx Codec PPM" msgstr "" #: src/dialogs/confdialog.cxx:13765 #, fuzzy msgid "Audio Codec ppm correction" msgstr "Corrección de RX en el dispositivo de audio" #: src/dialogs/confdialog.cxx:13776 msgid "Tracking" msgstr "Seguimiento" #: src/dialogs/confdialog.cxx:13779 msgid "Bgnd" msgstr "" #: src/dialogs/confdialog.cxx:13780 #, fuzzy msgid "Change plot background color" msgstr "Cambiar a archivo de macro" #: src/dialogs/confdialog.cxx:13783 msgid "Unkn" msgstr "" #: src/dialogs/confdialog.cxx:13784 msgid "Change plot unknown track color" msgstr "" #: src/dialogs/confdialog.cxx:13787 #, fuzzy msgid "Ref" msgstr "Inv." #: src/dialogs/confdialog.cxx:13788 msgid "Change plot reference track color" msgstr "" #: src/dialogs/confdialog.cxx:13792 #, fuzzy msgid "Change Axis' color" msgstr "Cambiar color" #: src/dialogs/confdialog.cxx:13795 msgid "Lgnd" msgstr "" #: src/dialogs/confdialog.cxx:13796 #, fuzzy msgid "Change legend color" msgstr "Cambiar color" #: src/dialogs/confdialog.cxx:13799 msgid "Line/Axis" msgstr "" #: src/dialogs/confdialog.cxx:13800 #, fuzzy msgid "Enable to always plot data over axis" msgstr "Activar para seleccionar rango de fechas" #: src/dialogs/confdialog.cxx:13805 #, fuzzy msgid "Thick lines" msgstr "Líneas impares" #: src/dialogs/confdialog.cxx:13806 msgid "Enable to plot track lines 3 pixels wide" msgstr "" #: src/dialogs/confdialog.cxx:13811 #, fuzzy msgid "Freq Correction" msgstr "Correcciones" #: src/dialogs/confdialog.cxx:13812 msgid "Offset plot lines on vertical scale" msgstr "" #: src/dialogs/confdialog.cxx:13821 src/dialogs/confdialog.cxx:18829 msgid "@|<" msgstr "" #: src/dialogs/confdialog.cxx:13825 src/dialogs/confdialog.cxx:18843 msgid "@>|" msgstr "" #: src/dialogs/confdialog.cxx:13829 #, fuzzy #| msgid "Error" msgid "Max Error" msgstr "Error" #: src/dialogs/confdialog.cxx:13830 msgid "Limit freq estimate error to this value" msgstr "" #: src/dialogs/confdialog.cxx:13841 msgid "DFT Estimator" msgstr "" #: src/dialogs/confdialog.cxx:13844 #, fuzzy msgid "Data Filter" msgstr "Filtro" #: src/dialogs/confdialog.cxx:13845 msgid "Moving average - average over NN seconds^0 - no averaging" msgstr "" #: src/dialogs/confdialog.cxx:13854 #, fuzzy msgid "DFT rate" msgstr "Generar TX" #: src/dialogs/confdialog.cxx:13855 #, fuzzy msgid "# DFT computations / second" msgstr "Duración del tono (s)" #: src/dialogs/confdialog.cxx:13872 #, fuzzy msgid "FIR Filter" msgstr "Filtro" #: src/dialogs/confdialog.cxx:13875 msgid "Width" msgstr "" #: src/dialogs/confdialog.cxx:13876 msgid "Band pass filter / unknown / reference" msgstr "" #: src/dialogs/confdialog.cxx:13886 msgid "bpf Unk'" msgstr "" #: src/dialogs/confdialog.cxx:13887 msgid "ON - band pass filter unknown signal" msgstr "" #: src/dialogs/confdialog.cxx:13892 msgid "bpf Ref'" msgstr "" #: src/dialogs/confdialog.cxx:13893 msgid "ON - band pass filter reference signal" msgstr "" #: src/dialogs/confdialog.cxx:13900 #, fuzzy msgid "CSV Data Recording" msgstr "Descodificación MAO" #: src/dialogs/confdialog.cxx:13903 msgid "Auto record" msgstr "" #: src/dialogs/confdialog.cxx:13904 msgid "Automatically start csv data file recording with wav playback" msgstr "" #: src/dialogs/confdialog.cxx:13908 msgid "Record data for NN minutes after auto start" msgstr "" #: src/dialogs/confdialog.cxx:13918 msgid "Wav file recording" msgstr "" #: src/dialogs/confdialog.cxx:13921 #, fuzzy msgid "Record Audio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:13922 msgid "Wav file recording - START IMMEDIATELY" msgstr "" #: src/dialogs/confdialog.cxx:13927 msgid "Sync to data record" msgstr "" #: src/dialogs/confdialog.cxx:13928 msgid "Wav file recording - SYNCHRONIZE with data recording" msgstr "" #: src/dialogs/confdialog.cxx:13933 #, fuzzy msgid "File pathname:" msgstr "Camino a cty.dat" #: src/dialogs/confdialog.cxx:13934 msgid "Computer generated file name" msgstr "" #: src/dialogs/confdialog.cxx:13942 msgid "" "Shft-click: select unknown\n" "Ctrl-click: select reference" msgstr "" #: src/dialogs/confdialog.cxx:13946 msgid "Center on Unknown" msgstr "" #: src/dialogs/confdialog.cxx:13947 msgid "Waterfall Centered on unknown signal" msgstr "" #: src/dialogs/confdialog.cxx:13952 #, fuzzy msgid "Center on Reference" msgstr "Línea central" #: src/dialogs/confdialog.cxx:13953 msgid "Waterfall centered on reference signal" msgstr "" #: src/dialogs/confdialog.cxx:13958 #, fuzzy msgid "Center on median" msgstr "Línea central" #: src/dialogs/confdialog.cxx:13959 msgid "Waterfall centered 1/2 way between unknown & reference" msgstr "" #: src/dialogs/confdialog.cxx:13968 #, fuzzy msgid "Use TAB delimiters" msgstr "Delimitadores" #: src/dialogs/confdialog.cxx:13969 msgid "Use tab delimiters between columns on csv export file." msgstr "" #: src/dialogs/confdialog.cxx:13981 src/dialogs/confdialog.cxx:14192 #: src/dialogs/confdialog.cxx:14194 #, fuzzy msgid "Modem/FSQ" msgstr "Módem" #: src/dialogs/confdialog.cxx:13985 msgid "Rx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:13988 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:13989 #, fuzzy msgid "Minimum # hits in tone detector" msgstr "Detector multicanal" #: src/dialogs/confdialog.cxx:14000 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:14001 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:14007 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:14008 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:14020 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:14021 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:14029 src/dialogs/confdialog.cxx:14201 msgid "Tx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:14032 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:14037 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:14042 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:14047 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:14052 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:14057 src/dialogs/confdialog.cxx:15873 #, fuzzy msgid "Center freq" msgstr "Línea central" #: src/dialogs/confdialog.cxx:14063 #, fuzzy msgid "Sounder" msgstr "Dispositivo de sonido" #: src/dialogs/confdialog.cxx:14064 msgid "Send beacon every ..." msgstr "" #: src/dialogs/confdialog.cxx:14070 #, fuzzy msgid "Time out" msgstr "Se ha demorado demasiado" #: src/dialogs/confdialog.cxx:14071 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:14081 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:14082 #, fuzzy msgid "Enter QTC text" msgstr "Insertar texto" #: src/dialogs/confdialog.cxx:14086 msgid "MYCALL lower case" msgstr "" #: src/dialogs/confdialog.cxx:14087 src/dialogs/confdialog.cxx:14221 #, fuzzy msgid "convert operator callsign to lower case" msgstr "Convertir el indicativo a mayúsculas" #: src/dialogs/confdialog.cxx:14092 msgid "QTH:" msgstr "QTH:" #: src/dialogs/confdialog.cxx:14093 src/dialogs/confdialog.cxx:17235 msgid "Operators QTH" msgstr "QTH del operador" #: src/dialogs/confdialog.cxx:14109 #, fuzzy msgid "Message Logging" msgstr "Registro de QSO" #: src/dialogs/confdialog.cxx:14112 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:14113 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:14119 msgid "always append to file(s)" msgstr "" #: src/dialogs/confdialog.cxx:14120 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:14126 #, fuzzy msgid "Notify time out" msgstr "Tiempo de inactividad" #: src/dialogs/confdialog.cxx:14127 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:14142 src/dialogs/confdialog.cxx:14243 #, fuzzy msgid "Audit log" msgstr "Audio" #: src/dialogs/confdialog.cxx:14145 src/dialogs/confdialog.cxx:14156 #: src/dialogs/confdialog.cxx:14246 src/dialogs/confdialog.cxx:14257 #: src/dialogs/confdialog.cxx:16335 src/dialogs/confdialog.cxx:18394 #: src/dialogs/confdialog.cxx:18423 src/dialogs/confdialog.cxx:18452 #: src/dialogs/confdialog.cxx:18481 src/dialogs/confdialog.cxx:18508 #: src/dialogs/confdialog.cxx:18634 msgid "Enable" msgstr "Activar" #: src/dialogs/confdialog.cxx:14153 src/dialogs/confdialog.cxx:14254 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:14166 #, fuzzy msgid "Text Colors" msgstr "Medidor" #: src/dialogs/confdialog.cxx:14170 #, fuzzy msgid "Transmit text" msgstr "Transmitir el vídeo texto" #: src/dialogs/confdialog.cxx:14175 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:14176 #, fuzzy msgid "Directed received text" msgstr "Decodificar tonos DTMF recibidos" #: src/dialogs/confdialog.cxx:14181 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:14182 #, fuzzy msgid "Undirected received text" msgstr "Decodificar tonos DTMF recibidos" #: src/dialogs/confdialog.cxx:14197 src/dialogs/confdialog.cxx:14279 #: src/dialogs/confdialog.cxx:14281 #, fuzzy msgid "Modem/IFKP" msgstr "Módem" #: src/dialogs/confdialog.cxx:14204 #, fuzzy msgid "1/2 speed" msgstr "Vel. del AFC" #: src/dialogs/confdialog.cxx:14209 #, fuzzy msgid "1x speed" msgstr "Vel. del AFC" #: src/dialogs/confdialog.cxx:14210 #, fuzzy msgid "default" msgstr "Omisión" #: src/dialogs/confdialog.cxx:14215 #, fuzzy msgid "2x speed" msgstr "Vel. del AFC" #: src/dialogs/confdialog.cxx:14220 msgid "MYCALL always lower case" msgstr "" #: src/dialogs/confdialog.cxx:14226 msgid "CALLSIGN always lower case" msgstr "" #: src/dialogs/confdialog.cxx:14227 #, fuzzy msgid "convert other callsign to lower case" msgstr "Convertir el indicativo a mayúsculas" #: src/dialogs/confdialog.cxx:14232 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:14233 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:14267 #, fuzzy msgid "" "\n" "Operator avatar" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:14284 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14355 #, fuzzy msgid "Modem/MT-63" msgstr "Módem" #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14550 msgid "8-bit extended characters (UTF-8)" msgstr "Caracteres extendidos de 8bits (UTF-8)" #: src/dialogs/confdialog.cxx:14292 msgid "Enable this for UTF-8 characters" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:14298 msgid "Long receive integration" msgstr "Larga integración en Rx" #: src/dialogs/confdialog.cxx:14299 msgid "Enable for very weak signals" msgstr "Activar para señales muy debiles" #: src/dialogs/confdialog.cxx:14309 msgid "Transmit lower start tone" msgstr "Transmitir tono de inicio bajo" #: src/dialogs/confdialog.cxx:14314 msgid "Transmit upper start tone" msgstr "Transmitir tono de inicio alto" #: src/dialogs/confdialog.cxx:14320 msgid "Tone Duration (secs)" msgstr "Duración del tono (s)" #: src/dialogs/confdialog.cxx:14336 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:14341 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:14346 #, fuzzy msgid "Manual tuning" msgstr "Permitir sintonía manual" #: src/dialogs/confdialog.cxx:14358 src/dialogs/confdialog.cxx:14454 #: src/dialogs/confdialog.cxx:14456 #, fuzzy msgid "Modem/Contestia" msgstr "Concurso" #: src/dialogs/confdialog.cxx:14364 src/dialogs/confdialog.cxx:14465 msgid "Bandwidth" msgstr "Ancho de banda" #: src/dialogs/confdialog.cxx:14365 src/dialogs/confdialog.cxx:14466 msgid "Select bandwidth" msgstr "Selecciona el ancho de banda" #: src/dialogs/confdialog.cxx:14381 src/dialogs/confdialog.cxx:14482 msgid "Tones" msgstr "Tonos" #: src/dialogs/confdialog.cxx:14382 src/dialogs/confdialog.cxx:14483 msgid "Select number of tones" msgstr "Seleccionar número de tonos" #: src/dialogs/confdialog.cxx:14398 src/dialogs/confdialog.cxx:14499 msgid "Receive synchronizer" msgstr "Sincronizador de Rx" #: src/dialogs/confdialog.cxx:14401 src/dialogs/confdialog.cxx:14502 msgid "Tune margin (tone frequency spacing)" msgstr "Margen de sintonía (espaciado de los tonos)" #: src/dialogs/confdialog.cxx:14402 src/dialogs/confdialog.cxx:14421 #: src/dialogs/confdialog.cxx:14503 src/dialogs/confdialog.cxx:14523 msgid "Change ONLY to experiment" msgstr "Cambiar SOLAMENTE para experimentar" #: src/dialogs/confdialog.cxx:14420 src/dialogs/confdialog.cxx:14522 msgid "Integration period (FEC blocks)" msgstr "Periodo de integración (bloques FEC)" #: src/dialogs/confdialog.cxx:14441 msgid "8-bit extended characters" msgstr "Caracteres extendidos de 8bits" #: src/dialogs/confdialog.cxx:14442 msgid "Enable this for Latin-1 accented characters" msgstr "Activar esto para caracteres acentuados" #: src/dialogs/confdialog.cxx:14446 src/dialogs/confdialog.cxx:14556 msgid "xmt start/stop tones" msgstr "" # Revisar estilo (@HK4QWC) # @CO7WT De esta forma es más sencillo y al estar en contexto en la interfaz se intuye el significado #: src/dialogs/confdialog.cxx:14447 src/dialogs/confdialog.cxx:14557 #, fuzzy msgid "Enable this to send start/stop tones" msgstr "Activar al iniciar fldigi" #: src/dialogs/confdialog.cxx:14459 src/dialogs/confdialog.cxx:14564 #: src/dialogs/confdialog.cxx:14566 msgid "Modem/Olivia" msgstr "" #: src/dialogs/confdialog.cxx:14542 msgid "Reset FEC blocks when changing BW or Tones" msgstr "Reiniciar FEC al cambiar ancho de banda o tonos" #: src/dialogs/confdialog.cxx:14543 src/dialogs/confdialog.cxx:14551 msgid "Enable this for UTF-8 character transmission" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:14569 src/dialogs/confdialog.cxx:14709 #: src/dialogs/confdialog.cxx:14711 #, fuzzy msgid "Modem/Psk" msgstr "Módems" #: src/dialogs/confdialog.cxx:14573 msgid "AFC behavior" msgstr "Comportamiento AFC" #: src/dialogs/confdialog.cxx:14576 msgid "Acquisition search range (Hz)" msgstr "Rango de búsqueda y adquisición (Hz)" #: src/dialogs/confdialog.cxx:14577 msgid "Capture signals within this frequency range" msgstr "Capturar señales dentro de este rango de frecuencias" #: src/dialogs/confdialog.cxx:14596 src/dialogs/confdialog.cxx:20095 msgid "Acquisition S/N (dB)" msgstr "S/N (dB) de adquisición" #: src/dialogs/confdialog.cxx:14597 src/dialogs/confdialog.cxx:20096 msgid "Capture signals over this threshold" msgstr "Capturar señales por encima de este nivel" #: src/dialogs/confdialog.cxx:14618 msgid "S/N and IMD behavior" msgstr "Comportamiento del S/N y IMD" #: src/dialogs/confdialog.cxx:14621 msgid "after" msgstr "después" #: src/dialogs/confdialog.cxx:14622 msgid "Behavior of s/n imd" msgstr "Comportamiento del S/N y IMD" #: src/dialogs/confdialog.cxx:14633 msgid "Dim" msgstr "Atenuar" #: src/dialogs/confdialog.cxx:14638 msgid "seconds" msgstr "segundos" #: src/dialogs/confdialog.cxx:14639 msgid "Will occur after this time in seconds" msgstr "Ocurrirá después de este tiempo (s)" #: src/dialogs/confdialog.cxx:14659 msgid "Multi-Channel Signal Processing" msgstr "Procesamiento de la señal multi-canal" #: src/dialogs/confdialog.cxx:14662 msgid "Multi-channel detector" msgstr "Detector multicanal" #: src/dialogs/confdialog.cxx:14667 #, fuzzy #| msgid "Disable on very slow CPUs of if signal browser is not used" msgid "Disable on very slow CPUs or if signal browser is not used" msgstr "" "Procesamiento multicanal de la señal desactivado en PCs con CPUs\n" "muy lenta y no se usa el navegador de señal" #: src/dialogs/confdialog.cxx:14672 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:14675 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:14676 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:14681 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:14682 #, fuzzy msgid "Pilot tone power relative to signal" msgstr "Ancho de banda del filtro relativo al ancho de la señal" #: src/dialogs/confdialog.cxx:14701 #, fuzzy msgid "Short Preamble" msgstr "Preámbulo de Video ID" #: src/dialogs/confdialog.cxx:14702 #, fuzzy msgid "Enable short preamble for 8PSK transmission" msgstr "Activar esto para caracteres acentuados (UTF-8)" #: src/dialogs/confdialog.cxx:14714 src/dialogs/confdialog.cxx:14852 #: src/dialogs/confdialog.cxx:14854 msgid "Modem/TTY/Rx" msgstr "" #: src/dialogs/confdialog.cxx:14721 msgid "AFC speed" msgstr "Vel. del AFC" #: src/dialogs/confdialog.cxx:14722 msgid "AFC tracking speed" msgstr "Velocidad de rastreo del AFC" #: src/dialogs/confdialog.cxx:14738 msgid "RX - unshift on space" msgstr "No saltar en el espacio RX" #: src/dialogs/confdialog.cxx:14739 msgid "Revert to unshifted char's on a space" msgstr "Revertir el salto en espacio de los caracteres" #: src/dialogs/confdialog.cxx:14744 msgid "Filter Shape Factor" msgstr "Factor de ancho de banda del filtro" #: src/dialogs/confdialog.cxx:14745 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "Coeficiente tiempo de rcos:\n" "1.0 ... 2.0\n" "W1HKJ recomienda 1.275\n" "DO2SMF recomienda 1.5" #: src/dialogs/confdialog.cxx:14755 msgid "Decode (CWI suppression)" msgstr "Detección y supresión de CWI" #: src/dialogs/confdialog.cxx:14758 msgid "Mark-Space" msgstr "Marca-Espacio" #: src/dialogs/confdialog.cxx:14763 msgid "Mark only" msgstr "Marca sola" #: src/dialogs/confdialog.cxx:14768 msgid "Space only" msgstr "Espacio solo" #: src/dialogs/confdialog.cxx:14775 msgid "RTTY Scope Display" msgstr "Configuración de Osciloscopio en RTTY" #: src/dialogs/confdialog.cxx:14778 msgid "Use cross hair scope" msgstr "Usar osc. de hilos cruzados" #: src/dialogs/confdialog.cxx:14779 msgid "Default to cross hair digiscope" msgstr "Osciloscopio de hilos cruzados predeterminado" #: src/dialogs/confdialog.cxx:14784 msgid "XY - classic scope" msgstr "XY - Osc. clásico" #: src/dialogs/confdialog.cxx:14785 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" "Activado - usar filtros de salida Marca/Espacio\n" "Desactivado - usar seudo-señales" #: src/dialogs/confdialog.cxx:14792 msgid "Log RTTY frequency" msgstr "Registrar frecuencia RTTY" #: src/dialogs/confdialog.cxx:14795 msgid "Use MARK freq'" msgstr "Usar frec. MARCA" #: src/dialogs/confdialog.cxx:14796 src/dialogs/confdialog.cxx:14816 #: src/dialogs/confdialog.cxx:14824 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" "Activado - Guarda QSO usando la frecuencia de la Marca\n" "Desactivado - Guarda QSO usando frecuencia central" #: src/dialogs/confdialog.cxx:14803 msgid "track color" msgstr "Color" #: src/dialogs/confdialog.cxx:14804 msgid "Color of Mark Track" msgstr "Color de cursor en la Marca" #: src/dialogs/confdialog.cxx:14812 #, fuzzy msgid "RTTY Bell" msgstr "RTTY" #: src/dialogs/confdialog.cxx:14815 msgid "Audible BELL" msgstr "" #: src/dialogs/confdialog.cxx:14823 #, fuzzy msgid "Visible BELL" msgstr "Modos visibles" #: src/dialogs/confdialog.cxx:14831 msgid "RTTY Bell audio wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 src/dialogs/confdialog.cxx:18385 #: src/dialogs/confdialog.cxx:18414 src/dialogs/confdialog.cxx:18443 #: src/dialogs/confdialog.cxx:18472 src/dialogs/confdialog.cxx:18496 #, fuzzy msgid "Sound:" msgstr "Dispositivo de sonido" #: src/dialogs/confdialog.cxx:14857 src/dialogs/confdialog.cxx:15028 #: src/dialogs/confdialog.cxx:15030 msgid "Modem/TTY/Tx" msgstr "" #: src/dialogs/confdialog.cxx:14861 #, fuzzy msgid "Sound Card FSK" msgstr "Dispositivo de sonido" #: src/dialogs/confdialog.cxx:14864 src/dialogs/confdialog.cxx:15099 msgid "Carrier shift" msgstr "Salto de la portadora" #: src/dialogs/confdialog.cxx:14865 msgid "Select carrier shift" msgstr "Seleccionar el salto de la portadora" #: src/dialogs/confdialog.cxx:14880 msgid "Custom shift" msgstr "Salto ajustado" #: src/dialogs/confdialog.cxx:14881 msgid "Input carrier shift" msgstr "Salto de la portadora" #: src/dialogs/confdialog.cxx:14899 src/dialogs/confdialog.cxx:15399 #: src/dialogs/confdialog.cxx:15553 msgid "Baud rate" msgstr "Tasa de baudios" #: src/dialogs/confdialog.cxx:14900 msgid "Select carrier baudrate" msgstr "Seleccionar la tasa de baudios de la portadora" #: src/dialogs/confdialog.cxx:14916 msgid "Bits per character" msgstr "Bits por caracter" #: src/dialogs/confdialog.cxx:14917 msgid "Select # bits / char" msgstr "Selecciona el # bits / caracter" #: src/dialogs/confdialog.cxx:14932 msgid "Parity" msgstr "Paridad" #: src/dialogs/confdialog.cxx:14933 msgid "Select parity" msgstr "Seleccionar paridad" #: src/dialogs/confdialog.cxx:14948 src/dialogs/confdialog.cxx:15415 #: src/dialogs/confdialog.cxx:15569 msgid "Stop bits" msgstr "Bits de parda" #: src/dialogs/confdialog.cxx:14949 msgid "Select # stop bits" msgstr "Seleccionar # de bits de parada" #: src/dialogs/confdialog.cxx:14964 msgid "AutoCRLF" msgstr "Auto CRLF" #: src/dialogs/confdialog.cxx:14965 msgid "Add CRLF after page width characters" msgstr "Añadir CRLF después del ancho de caracteres de la página" #: src/dialogs/confdialog.cxx:14970 msgid "chars" msgstr "caract." #: src/dialogs/confdialog.cxx:14971 msgid "Auto CRLF line length" msgstr "Ajuste automático de línea con CRLF" #: src/dialogs/confdialog.cxx:14989 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:14990 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Usar \"cr cr lf\" para \"cr lf\"" #: src/dialogs/confdialog.cxx:14996 msgid "TX - unshift on space" msgstr "TX - no saltar en el espacio" #: src/dialogs/confdialog.cxx:14997 msgid "Revert to Unsifted char's on a space" msgstr "Revertir el salto en espacio de los caracteres" #: src/dialogs/confdialog.cxx:15002 msgid "Shaped Tx" msgstr "Dar forma al Tx" #: src/dialogs/confdialog.cxx:15003 msgid "Use wave shaping on Tx signal" msgstr "Usar técnica de formación de onda en la señal de Tx" #: src/dialogs/confdialog.cxx:15009 msgid "Pseudo-FSK - right channel" msgstr "AFSK en canal derecho" #: src/dialogs/confdialog.cxx:15010 msgid "Create keyed square wave on right audio channel" msgstr "Crear una onda cuadrada en el canal derecho de audio" #: src/dialogs/confdialog.cxx:15015 #, fuzzy msgid "LTRS at start" msgstr "Inicio" #: src/dialogs/confdialog.cxx:15016 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:15033 src/dialogs/confdialog.cxx:15135 #: src/dialogs/confdialog.cxx:15137 #, fuzzy msgid "Modem/TTY/FSK" msgstr "Módem" #: src/dialogs/confdialog.cxx:15037 #, fuzzy #| msgid "DTR is PTT signal line" msgid "DTR/RTS signal line FSK" msgstr "DTR es PTT" #: src/dialogs/confdialog.cxx:15040 src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Activado" #: src/dialogs/confdialog.cxx:15041 #, fuzzy msgid "Enable FSK on serial port" msgstr "Puerto serie" #: src/dialogs/confdialog.cxx:15047 msgid "Shares RIGIO serial port, or uses" msgstr "" #: src/dialogs/confdialog.cxx:15048 #, fuzzy msgid "Share the RIGIO port" msgstr "Puerto serie" #: src/dialogs/confdialog.cxx:15054 #, fuzzy msgid "Serial Port" msgstr "Puerto" #: src/dialogs/confdialog.cxx:15055 #, fuzzy msgid "FSK independent serial port" msgstr "PTT por puerto serie separado" #: src/dialogs/confdialog.cxx:15069 msgid "MARK/SPACE reversed" msgstr "" #: src/dialogs/confdialog.cxx:15070 #, fuzzy #| msgid "Mark-Space" msgid "Reverse Mark/Space" msgstr "Marca-Espacio" #: src/dialogs/confdialog.cxx:15076 src/dialogs/confdialog.cxx:18252 msgid "Use DTR" msgstr "Use DTR" #: src/dialogs/confdialog.cxx:15077 msgid "Enable DTR signal line, default is RTS" msgstr "" #: src/dialogs/confdialog.cxx:15084 msgid "" "Restart the FSK interface\n" "Necessary if changes made to configuration" msgstr "" #: src/dialogs/confdialog.cxx:15088 #, fuzzy msgid "Mark" msgstr "Marca sola" #: src/dialogs/confdialog.cxx:15089 #, fuzzy msgid "Mark frequency in Hertz" msgstr "Frecuencia en MHz" #: src/dialogs/confdialog.cxx:15100 #, fuzzy msgid "Carrier shift in Hertz" msgstr "Salto de la portadora" #: src/dialogs/confdialog.cxx:15115 #, fuzzy #| msgid "Stop bits" msgid "1.5 stop bits" msgstr "Bits de parda" #: src/dialogs/confdialog.cxx:15116 msgid "" "Enabled - 1.5 stop bits\n" "Disabled - 2 stop bits" msgstr "" #: src/dialogs/confdialog.cxx:15126 msgid "Use flrig FSK keying" msgstr "" #: src/dialogs/confdialog.cxx:15127 msgid "Enable to use flrig FSK keyer" msgstr "" #: src/dialogs/confdialog.cxx:15140 src/dialogs/confdialog.cxx:15252 #: src/dialogs/confdialog.cxx:15254 msgid "Modem/TTY/nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:15163 #, fuzzy msgid "Serial Baud" msgstr "Serie enviada" #: src/dialogs/confdialog.cxx:15178 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:15199 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:15200 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:15205 #, fuzzy msgid "TTY Baud" msgstr "Tasa de baudios" #: src/dialogs/confdialog.cxx:15206 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:15222 msgid "Debug Output" msgstr "" #: src/dialogs/confdialog.cxx:15232 #, fuzzy msgid "Clear Sent" msgstr "Limpiar lista" #: src/dialogs/confdialog.cxx:15235 #, fuzzy msgid "Clear Both" msgstr "Limpiar lista" #: src/dialogs/confdialog.cxx:15238 #, fuzzy msgid "Clear Rcvd" msgstr "Limpiar" #: src/dialogs/confdialog.cxx:15247 #, fuzzy msgid "TTY i/o" msgstr "E/S de Texto" #: src/dialogs/confdialog.cxx:15248 msgid "Enable TTY operation" msgstr "" #: src/dialogs/confdialog.cxx:15257 src/dialogs/confdialog.cxx:15485 #: src/dialogs/confdialog.cxx:15487 msgid "Modem/TTY/Navigator" msgstr "" #: src/dialogs/confdialog.cxx:15261 #, fuzzy msgid "FSK Interface" msgstr "Interfaz de usuario" #: src/dialogs/confdialog.cxx:15265 #, fuzzy msgid "Navigator serial port" msgstr "Puerto serie" #: src/dialogs/confdialog.cxx:15279 #, fuzzy msgid "FSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:15280 #, fuzzy msgid "Connect / Disconnect from Nav FSK port" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:15285 src/dialogs/confdialog.cxx:15550 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:15289 #, fuzzy msgid "Navigator configuration port" msgstr "Configuración" #: src/dialogs/confdialog.cxx:15303 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Número del canal" #: src/dialogs/confdialog.cxx:15304 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15319 #, fuzzy msgid "Channel 2 attenuator" msgstr "Número del canal" #: src/dialogs/confdialog.cxx:15320 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15335 #, fuzzy msgid "RF attenuator" msgstr "Atenuación KPSQL" #: src/dialogs/confdialog.cxx:15336 #, fuzzy msgid "NavRF Attenuator" msgstr "Atenuación KPSQL" #: src/dialogs/confdialog.cxx:15351 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:15352 src/dialogs/confdialog.cxx:15586 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:15367 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:15368 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:15383 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:15384 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:15400 src/dialogs/confdialog.cxx:15554 #, fuzzy msgid "Nav FSK baud rate" msgstr "Tasa de baudios del puerto serie" #: src/dialogs/confdialog.cxx:15416 src/dialogs/confdialog.cxx:15570 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Bits de parda" #: src/dialogs/confdialog.cxx:15431 src/dialogs/confdialog.cxx:15601 #, fuzzy msgid "Mark Polarity" msgstr "Marca sola" #: src/dialogs/confdialog.cxx:15432 src/dialogs/confdialog.cxx:15602 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:15447 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:15448 src/dialogs/confdialog.cxx:15618 #: src/dialogs/confdialog.cxx:15634 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:15463 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:15464 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:15479 #, fuzzy msgid "Config" msgstr "Confirmar" #: src/dialogs/confdialog.cxx:15480 #, fuzzy msgid "Connect / Disconnect from Nav Config port" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:15490 src/dialogs/confdialog.cxx:15516 #: src/dialogs/confdialog.cxx:15518 msgid "Modem/TTY/Synop" msgstr "" #: src/dialogs/confdialog.cxx:15494 msgid "SYNOP to ADIF" msgstr "SYNOP a ADIF" #: src/dialogs/confdialog.cxx:15495 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" "Decodificar mensajes SYNOP al log ADIF (ejemplo Servicio Meteorológico " "Alemán)" #: src/dialogs/confdialog.cxx:15501 msgid "SYNOP to KML" msgstr "SYNOP a KML" #: src/dialogs/confdialog.cxx:15502 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Decodificar mensajes SYNOP al documentos KML (ejemplo Servicio Meteorológico " "Alemán)" #: src/dialogs/confdialog.cxx:15509 msgid "Interleave SYNOP and text" msgstr "Intercalar SYNOP y texto" #: src/dialogs/confdialog.cxx:15510 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "Intercalar texto con mensajes SYNOP descodificados, o reemplazos" #: src/dialogs/confdialog.cxx:15521 src/dialogs/confdialog.cxx:15715 #: src/dialogs/confdialog.cxx:15717 msgid "Modem/TTY/Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:15525 #, fuzzy msgid "Serial Interface" msgstr "Interfaz de usuario" #: src/dialogs/confdialog.cxx:15585 #, fuzzy msgid "FSK port" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:15633 #, fuzzy msgid "Auto CRLF" msgstr "Auto CRLF" #: src/dialogs/confdialog.cxx:15649 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:15650 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:15665 #, fuzzy msgid "Diddle char" msgstr "Letra de prueba" #: src/dialogs/confdialog.cxx:15666 #, fuzzy msgid "Diddle character" msgstr "Bits por caracter" #: src/dialogs/confdialog.cxx:15681 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:15682 src/dialogs/confdialog.cxx:15698 #, fuzzy msgid "Unshift on space" msgstr "No saltar en el espacio RX" #: src/dialogs/confdialog.cxx:15697 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:15720 src/dialogs/confdialog.cxx:15833 #: src/dialogs/confdialog.cxx:15835 #, fuzzy msgid "Modem/Thor" msgstr "Módem" #: src/dialogs/confdialog.cxx:15740 msgid "Enable DSP prior to decoder" msgstr "Activar el DSP antes del decodificador" #: src/dialogs/confdialog.cxx:15782 msgid "Preamble Detection" msgstr "Detección de preámbulo" #: src/dialogs/confdialog.cxx:15783 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" "Detectar el preámbulo de THOR \n" "Limpiando el buffer de recepción de dato" #: src/dialogs/confdialog.cxx:15788 msgid "Soft-symbol decoding" msgstr "Descodificación suave de símbolos" #: src/dialogs/confdialog.cxx:15789 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" "Usar descodificación blanda de símbolos para la detección\n" "también asiste en la descodificación de cada bit." #: src/dialogs/confdialog.cxx:15794 msgid "Soft-bit decoding" msgstr "Usar decodificación suave de bits" #: src/dialogs/confdialog.cxx:15795 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "Usar descodificación blanda de bit viterbi para mejorar la corrección FEC.\n" "Funciona mejor si está activada la opción \"Descodificación blanda de " "símbolos\"" #: src/dialogs/confdialog.cxx:15821 #, fuzzy msgid "" "\n" "Operator Avatar" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:15838 src/dialogs/confdialog.cxx:15853 #: src/dialogs/confdialog.cxx:15855 #, fuzzy msgid "Modem/Navtex" msgstr "Navtex" #: src/dialogs/confdialog.cxx:15842 msgid "Log Navtex messages to Adif file" msgstr "Registrar mensajes de Navtex a archivo ADIF" #: src/dialogs/confdialog.cxx:15847 msgid "Log Navtex messages to KML" msgstr "Registrar mensajes de Navtex a KML" #: src/dialogs/confdialog.cxx:15848 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "Guardar mensajes a archivos KML (Google Earth, Marble, Gaia, etc...)" #: src/dialogs/confdialog.cxx:15858 src/dialogs/confdialog.cxx:15979 #: src/dialogs/confdialog.cxx:15981 #, fuzzy msgid "Modem/Wefax" msgstr "Espera Modo/BW" #: src/dialogs/confdialog.cxx:15862 #, fuzzy msgid "Frequency shift" msgstr "Salto de frecuencia (800Hz)" #: src/dialogs/confdialog.cxx:15863 #, fuzzy msgid "" "Frequency shift of WEFAX signal\n" "Nominal 800 Hz" msgstr "Salto de frecuencia (800Hz)" #: src/dialogs/confdialog.cxx:15874 msgid "" "Center of WEFAX signal\n" "Nominal 1900 Hz" msgstr "" #: src/dialogs/confdialog.cxx:15884 msgid "Max Image Rows" msgstr "" #: src/dialogs/confdialog.cxx:15885 msgid "Force save split image" msgstr "" #: src/dialogs/confdialog.cxx:15895 msgid "Fax images destination directory" msgstr "Destino de las imágenes de fax" #: src/dialogs/confdialog.cxx:15896 #, fuzzy msgid "Store images in this directory" msgstr "Destino de las imágenes de fax" #: src/dialogs/confdialog.cxx:15901 msgid "Directory..." msgstr "Directorio..." #: src/dialogs/confdialog.cxx:15902 #, fuzzy msgid "Select destination directory" msgstr "Destino de las imágenes de fax" #: src/dialogs/confdialog.cxx:15905 msgid "Log Wefax messages to Adif file" msgstr "Registrar mensajes Wefax a archivo ADIF" #: src/dialogs/confdialog.cxx:15906 msgid "Sent and received faxes are logged to Adif file." msgstr "Registrar los fax enviados y recibidos" #: src/dialogs/confdialog.cxx:15911 src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtro" #: src/dialogs/confdialog.cxx:15917 #, fuzzy msgid "Enable Auto-align after" msgstr "Activar / desactivar sugerencias" #: src/dialogs/confdialog.cxx:15927 msgid "Stop Auto-align after" msgstr "" #: src/dialogs/confdialog.cxx:15937 msgid "Auto-align every" msgstr "" #: src/dialogs/confdialog.cxx:15947 src/dialogs/confdialog.cxx:15950 #: src/dialogs/confdialog.cxx:15953 #, fuzzy msgid "rows" msgstr "Buscar" #: src/dialogs/confdialog.cxx:15956 #, fuzzy msgid "Correlation" msgstr "Correcciones" #: src/dialogs/confdialog.cxx:15957 msgid "" "Row-to-row correlation\n" "Used to detect presence of WEFAX signal\n" "Lower: more false detections" msgstr "" #: src/dialogs/confdialog.cxx:15968 #, fuzzy msgid "# Correlation rows" msgstr "Correcciones" #: src/dialogs/confdialog.cxx:15969 msgid "Compute correlation factor over this # rows" msgstr "" #: src/dialogs/confdialog.cxx:15984 src/dialogs/confdialog.cxx:16185 #: src/dialogs/confdialog.cxx:16187 #, fuzzy msgid "Misc/Autostart" msgstr "Autoinicio" #: src/dialogs/confdialog.cxx:15988 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:15989 msgid "Enter full path-filename for flrig" msgstr "Entre la ruta completa del ejecutable flrig" #: src/dialogs/confdialog.cxx:16003 msgid "Locate flrig executable" msgstr "Buscar el ejecutable flrig" #: src/dialogs/confdialog.cxx:16006 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16007 msgid "Enter full path-filename for flamp" msgstr "Entre la ruta completa del ejecutable flmsg" #: src/dialogs/confdialog.cxx:16021 msgid "Locate flamp executable" msgstr "Buscar el ejecutable flamp" #: src/dialogs/confdialog.cxx:16024 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16025 msgid "Enter full path-filename for flnet" msgstr "Entre la ruta completa del ejecutable flnet" #: src/dialogs/confdialog.cxx:16039 msgid "Locate flnet executable" msgstr "Buscar el ejecutable flnet" #: src/dialogs/confdialog.cxx:16042 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16043 msgid "Enter full path-filename for fllog" msgstr "Entre la ruta completa del ejecutable fllog" #: src/dialogs/confdialog.cxx:16057 msgid "Locate fllog executable" msgstr "Buscar el ejecutable fllog" #: src/dialogs/confdialog.cxx:16060 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:16061 src/dialogs/confdialog.cxx:16079 #: src/dialogs/confdialog.cxx:16097 msgid "Enter full path-filename for external program" msgstr "Entre la ruta completa del ejecutable del programa externo" #: src/dialogs/confdialog.cxx:16075 msgid "Locate program #1 executable" msgstr "Buscar el ejecutable programa #1" #: src/dialogs/confdialog.cxx:16078 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:16093 msgid "Locate program #2 executable" msgstr "Buscar el ejecutable programa #2" #: src/dialogs/confdialog.cxx:16096 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:16111 msgid "Locate program #3 executable" msgstr "Buscar el ejecutable programa #3" #: src/dialogs/confdialog.cxx:16114 msgid "" "Enable\n" "-" msgstr "" "Activar\n" "-" # Revisar estilo (@HK4QWC) # @CO7WT De esta forma es más sencillo y al estar en contexto en la interfaz se intuye el significado #: src/dialogs/confdialog.cxx:16115 src/dialogs/confdialog.cxx:16122 #: src/dialogs/confdialog.cxx:16128 src/dialogs/confdialog.cxx:16134 #: src/dialogs/confdialog.cxx:16140 src/dialogs/confdialog.cxx:16146 #: src/dialogs/confdialog.cxx:16152 msgid "Enable this entry when fldigi first starts" msgstr "Activar al iniciar fldigi" #: src/dialogs/confdialog.cxx:16158 msgid "Start flrig" msgstr "Iniciar flrig" #: src/dialogs/confdialog.cxx:16162 msgid "Start flamp" msgstr "Iniciar flamp" #: src/dialogs/confdialog.cxx:16166 msgid "Start flnet" msgstr "Iniciar flnet" #: src/dialogs/confdialog.cxx:16170 msgid "Start fllog" msgstr "Iniciar fllog" #: src/dialogs/confdialog.cxx:16174 msgid "Start prog1" msgstr "Iniciar prog 1" #: src/dialogs/confdialog.cxx:16178 msgid "Start prog2" msgstr "Iniciar prog 2" #: src/dialogs/confdialog.cxx:16182 msgid "Start prog3" msgstr "Iniciar prog 3" #: src/dialogs/confdialog.cxx:16190 src/dialogs/confdialog.cxx:16200 #: src/dialogs/confdialog.cxx:16202 #, fuzzy msgid "Misc/CPU" msgstr "Misc." #: src/dialogs/confdialog.cxx:16194 msgid "Slow CPU (less than 700MHz)" msgstr "CPU lenta (Menos de 700Mhz)" #: src/dialogs/confdialog.cxx:16195 msgid "Enable if you're computer does not decode properly" msgstr "Activar si tu computadora no decodifica correctamente" #: src/dialogs/confdialog.cxx:16205 src/dialogs/confdialog.cxx:16215 #: src/dialogs/confdialog.cxx:16217 #, fuzzy msgid "Misc/DTMF" msgstr "DTMF" #: src/dialogs/confdialog.cxx:16209 msgid "Decode DTMF tones" msgstr "Decodificar tonos DTMF" #: src/dialogs/confdialog.cxx:16210 msgid "Decode received DTMF tones" msgstr "Decodificar tonos DTMF recibidos" #: src/dialogs/confdialog.cxx:16220 src/dialogs/confdialog.cxx:16323 #: src/dialogs/confdialog.cxx:16325 #, fuzzy msgid "Misc/KML" msgstr "Misc." #: src/dialogs/confdialog.cxx:16224 msgid "KML files directory" msgstr "Directorio de archivos KML" #: src/dialogs/confdialog.cxx:16225 msgid "Where generated KML documents are stored." msgstr "Donde se almacenan los documentos KML generados" #: src/dialogs/confdialog.cxx:16230 msgid "KML root file" msgstr "Raíz del archivo KML" #: src/dialogs/confdialog.cxx:16234 msgid "Minimum distance for splitting aliases (Meters)" msgstr "Distancia mínima para alias segmentados (metros)" #: src/dialogs/confdialog.cxx:16235 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "Distancia mínima para nodos alias segmentados (metros)" #: src/dialogs/confdialog.cxx:16245 msgid "Data retention time, in hours (0 for no limit)" msgstr "Horas de retención de datos (0 sin límite)" #: src/dialogs/confdialog.cxx:16246 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "Horas de conservación para cada nodo, Cero significa conservar todo." #: src/dialogs/confdialog.cxx:16255 msgid "KML refresh interval (seconds)" msgstr "Intervalo de refresco KML (seg)" #: src/dialogs/confdialog.cxx:16256 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Intervalo de refresco de escritura para KML (seg)" #: src/dialogs/confdialog.cxx:16272 msgid "KML balloon display style" msgstr "Estilo del globo de KML" #: src/dialogs/confdialog.cxx:16273 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "KML globo en texto plano, o HTML, en tablas simples o matrices." #: src/dialogs/confdialog.cxx:16288 msgid "Command run on KML creation" msgstr "Comando a ejecutar al crear un archivo KML" #: src/dialogs/confdialog.cxx:16289 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "Comando que se ejecuta cuando se genera un archivo KML. Subprocesos se " "reinician si es requerido." #: src/dialogs/confdialog.cxx:16295 msgid "Test command" msgstr "Comando de prueba" #: src/dialogs/confdialog.cxx:16296 msgid "Execute command on KML files." msgstr "Ejecutar un comando sobre los archivos KML" #: src/dialogs/confdialog.cxx:16299 msgid "Change dir..." msgstr "Cambiar carpeta" #: src/dialogs/confdialog.cxx:16300 msgid "Choose directory to store KML documents" msgstr "Seleccione directorio de archivos KML" #: src/dialogs/confdialog.cxx:16303 msgid "Cleanup KML data now !" msgstr "¡Limpiar datos KML ahora!" #: src/dialogs/confdialog.cxx:16304 msgid "Cleanups KML documents, empties Google Earth display." msgstr "Liampiar datos KML, limpia la pantalla de Google Hearth" #: src/dialogs/confdialog.cxx:16307 msgid "Cleanup on startup" msgstr "Limpiar al iniciar" #: src/dialogs/confdialog.cxx:16308 msgid "Empties KML documents when starting program." msgstr "Limpiar los documentos KML al inicio del programa." #: src/dialogs/confdialog.cxx:16315 msgid "KML server enabled (On / Off)" msgstr "" #: src/dialogs/confdialog.cxx:16316 msgid "Uncheck if KML is never used" msgstr "" #: src/dialogs/confdialog.cxx:16328 src/dialogs/confdialog.cxx:16410 #: src/dialogs/confdialog.cxx:16412 #, fuzzy msgid "Misc/NBEMS interface" msgstr "Interface de datos NBEMS" #: src/dialogs/confdialog.cxx:16332 msgid "NBEMS data file interface" msgstr "Interface de datos NBEMS" #: src/dialogs/confdialog.cxx:16336 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Extraer archivos para usar con programas externos (wrap/flmsg)" #: src/dialogs/confdialog.cxx:16341 msgid "Open message folder" msgstr "Abrir carpeta de mensajes" #: src/dialogs/confdialog.cxx:16342 msgid "Opens NBEMS file folder upon successful capture" msgstr "Abrir la carpeta de NBEMS cuando capture ok" #: src/dialogs/confdialog.cxx:16349 msgid "Reception of flmsg files" msgstr "Recepción de archivo en flmsg" #: src/dialogs/confdialog.cxx:16352 msgid "Open with flmsg" msgstr "Abrir con flmsg" #: src/dialogs/confdialog.cxx:16353 msgid "Open message with flmsg" msgstr "Abrir mensaje con flmsg" #: src/dialogs/confdialog.cxx:16358 msgid "Open in browser" msgstr "Abrir en el navegador" #: src/dialogs/confdialog.cxx:16359 msgid "Open file with default browser" msgstr "Abrir archivo en el navegador predeterminado" #: src/dialogs/confdialog.cxx:16364 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:16365 msgid "Enter full path-filename for flmsg" msgstr "Entre la ruta completa del ejecutable de flmsg" #: src/dialogs/confdialog.cxx:16378 msgid "Locate flmsg" msgstr "Buscar flmsg" #: src/dialogs/confdialog.cxx:16382 msgid "Timeout (secs)" msgstr "Timeout (seg)" #: src/dialogs/confdialog.cxx:16383 msgid "Extract times out after NN seconds of inactivity." msgstr "" "Limpiar el texto del canal\n" "después de N segundos\n" "de inactividad" #: src/dialogs/confdialog.cxx:16396 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:16400 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16401 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16415 src/dialogs/confdialog.cxx:16493 #: src/dialogs/confdialog.cxx:16495 #, fuzzy msgid "Misc/PSK reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:16419 msgid "Automatically spot callsigns in decoded text" msgstr "" "Hacer \"spot\" automáticamente con los\n" "indicativos descodificados en el texto recibido" #: src/dialogs/confdialog.cxx:16420 msgid "Parse all incoming text" msgstr "Procesar todo el texto entrante" #: src/dialogs/confdialog.cxx:16425 msgid "Send reception report when logging a QSO" msgstr "Enviar reporte cuando se llenan los datos del QSO" #: src/dialogs/confdialog.cxx:16426 msgid "Send report only when QSO is logged" msgstr "Enviar reporte solo cuando se guardan los datos del QSO" #: src/dialogs/confdialog.cxx:16431 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" "Reportar la frecuencia del radio (activar solo si tienes control del radio)" #: src/dialogs/confdialog.cxx:16432 msgid "Include the transmit frequency" msgstr "Incluir la frecuencia de Tx" #: src/dialogs/confdialog.cxx:16437 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Activar spotting solo cuando el navegador de señal está visible" #: src/dialogs/confdialog.cxx:16438 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Marcar para reducir la carga al CPU en PSK y RTTY." #: src/dialogs/confdialog.cxx:16444 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:16445 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:16455 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:16456 msgid "To whom the connection is made" msgstr "A quien se hace la conexión" #: src/dialogs/confdialog.cxx:16470 msgid "Port:" msgstr "Puerto:" #: src/dialogs/confdialog.cxx:16471 msgid "Using UDP port #" msgstr "Usando puerto UDP #" #: src/dialogs/confdialog.cxx:16486 msgid "Initialize the socket client" msgstr "Inicializar el socket cliente" #: src/dialogs/confdialog.cxx:16489 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:16498 src/dialogs/confdialog.cxx:16668 #: src/dialogs/confdialog.cxx:16670 #, fuzzy msgid "Misc/PSM" msgstr "Misc." #: src/dialogs/confdialog.cxx:16505 msgid "Allow TX After Signal Detection (Secs)" msgstr "" #: src/dialogs/confdialog.cxx:16506 #, fuzzy msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" "Limpiar el texto del canal\n" "después de N segundos\n" "de inactividad" #: src/dialogs/confdialog.cxx:16516 msgid "Enable Busy Channel" msgstr "Activar det. canal ocupado" #: src/dialogs/confdialog.cxx:16517 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16523 msgid "TX Buffer Flush Timer (Mins, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16524 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16535 #, fuzzy msgid "Modem Bandwidth Margins " msgstr "Ancho de banda" #: src/dialogs/confdialog.cxx:16536 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16546 msgid "Valid Signal Sample Period (msecs)" msgstr "" #: src/dialogs/confdialog.cxx:16547 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16562 msgid "Enable CSMA" msgstr "Activar CSMA" #: src/dialogs/confdialog.cxx:16563 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16568 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16569 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16579 #, fuzzy msgid "Slot Time" msgstr "Hora" #: src/dialogs/confdialog.cxx:16580 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16590 #, fuzzy msgid "Transmit Data Delay" msgstr "Señal transmitida" #: src/dialogs/confdialog.cxx:16591 #, fuzzy msgid "Idle transmit before data sent" msgstr "Incluir la frecuencia de Tx" #: src/dialogs/confdialog.cxx:16601 src/dialogs/confdialog.cxx:16605 #, fuzzy msgid "MilliSeconds" msgstr "Segundos" #: src/dialogs/confdialog.cxx:16602 src/dialogs/confdialog.cxx:16610 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16606 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16609 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16618 #, fuzzy msgid "Enable Histogram" msgstr "Activar el registro del texto de recepción." #: src/dialogs/confdialog.cxx:16619 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16624 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16625 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16640 #, fuzzy msgid "PSM Attenuate" msgstr "Atenuación KPSQL" #: src/dialogs/confdialog.cxx:16641 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16657 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16658 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16665 #, fuzzy msgid "Default Settings" msgstr "" "La cadena de prueba por omisión es:\n" "\"" #: src/dialogs/confdialog.cxx:16673 src/dialogs/confdialog.cxx:16705 #: src/dialogs/confdialog.cxx:16707 #, fuzzy msgid "Misc/Rx text capture" msgstr "Captura de Texto" #: src/dialogs/confdialog.cxx:16677 msgid "Talker Socket (MS only)" msgstr "Talker Socket (Solo MS)" #: src/dialogs/confdialog.cxx:16680 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:16684 msgid "Connect/disconnect to Talker socket server" msgstr "Conectar/desconectar el socket del servidor Talker" #: src/dialogs/confdialog.cxx:16687 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Auto conectar cuando fldigi se ejecute (el servidor debe estar encendido)" #: src/dialogs/confdialog.cxx:16694 msgid "Capture rx text to external file" msgstr "Capturar el texto de Rx a un archivo externo" #: src/dialogs/confdialog.cxx:16697 msgid "Enable rx text stream" msgstr "Activar el registro del texto de recepción." #: src/dialogs/confdialog.cxx:16698 msgid "Send rx text to file: textout.txt" msgstr "Enviar texto rx al archivo: textout.txt" #: src/dialogs/confdialog.cxx:16710 src/dialogs/confdialog.cxx:16748 #: src/dialogs/confdialog.cxx:16750 #, fuzzy msgid "Misc/Save Parameters" msgstr "Seleccionar los parámetros de configuración" #: src/dialogs/confdialog.cxx:16714 #, fuzzy #| msgid "Transmit font" msgid "Transmit level control" msgstr "Tipografía de Tx" #: src/dialogs/confdialog.cxx:16715 msgid "Save transmit level control by mode" msgstr "" #: src/dialogs/confdialog.cxx:16721 msgid "Squelch level/activated control(s)" msgstr "" #: src/dialogs/confdialog.cxx:16722 msgid "Save Squelch level and state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16728 msgid "Enable specific parameter to Save & Restore on a per mode/band basis." msgstr "" #: src/dialogs/confdialog.cxx:16734 #, fuzzy #| msgid "ARQ control" msgid "AFC control" msgstr "Control ARQ" #: src/dialogs/confdialog.cxx:16735 msgid "Save AFC state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16741 #, fuzzy #| msgid "Reverse video" msgid "Reverse (Rv) control" msgstr "Video inverso" #: src/dialogs/confdialog.cxx:16742 msgid "Save Reverse state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16753 src/dialogs/confdialog.cxx:16837 #: src/dialogs/confdialog.cxx:16839 #, fuzzy msgid "Misc/Sweet Spot" msgstr "Frecuencia Inicial" #: src/dialogs/confdialog.cxx:16760 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:16761 msgid "Default CW tracking point" msgstr "Punto predefinido de rastreo de CW" #: src/dialogs/confdialog.cxx:16779 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:16780 msgid "Default RTTY tracking point" msgstr "Punto predefinido de rastreo de RTTY" #: src/dialogs/confdialog.cxx:16798 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:16799 msgid "Default for all other modems" msgstr "Punto predefinido de rastreo para los otros módems" #: src/dialogs/confdialog.cxx:16817 msgid "Always start new modems at these frequencies" msgstr "Siempre iniciar los módems nuevos en estas frecuencias" #: src/dialogs/confdialog.cxx:16818 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - Iniciar en la predeterminada\n" "OFF - Mantener la posición actual en la cascada" #: src/dialogs/confdialog.cxx:16826 msgid "K3 A1A configuation" msgstr "Configuración de A1A para el Elecraft K3" #: src/dialogs/confdialog.cxx:16829 msgid "CW is LSB" msgstr "CW es LSB" #: src/dialogs/confdialog.cxx:16830 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Solo para el Elecraft K3\n" "Otros radios no lo necesitan." #: src/dialogs/confdialog.cxx:16842 src/dialogs/confdialog.cxx:17166 #: src/dialogs/confdialog.cxx:17168 msgid "Misc/TCP-IP sessions" msgstr "" #: src/dialogs/confdialog.cxx:16850 msgid "Lock" msgstr "Bloquear" #: src/dialogs/confdialog.cxx:16851 msgid "Allow/Disallow Changes" msgstr "Permitir/Impedir cambios" #: src/dialogs/confdialog.cxx:16856 msgid "Enable ARQ" msgstr "Activar ARQ" #: src/dialogs/confdialog.cxx:16857 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "Usado para PSKMail y el conjunto de programas FLDIGI" #: src/dialogs/confdialog.cxx:16864 msgid "Enable KISS" msgstr "Activar KISS" #: src/dialogs/confdialog.cxx:16865 msgid "Used for BPQ32" msgstr "Usado para BPQ32" #: src/dialogs/confdialog.cxx:16872 #, fuzzy msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" "Habilitar ARQ para programas que soportan TCP y el protocolo FLDIGI ARQ.\n" "Habilitar KISS para programas que soportan UDP y el protocolo KISS TNC-2.\n" "Solamente una interfaz (ARQ/KISS) puede estar activa a la vez.\n" "Los cambios de dirección IP y del número del puerto requieren el reinicio de " "FLDIGI." #: src/dialogs/confdialog.cxx:16879 msgid "KISS" msgstr "KISS" #: src/dialogs/confdialog.cxx:16882 src/dialogs/confdialog.cxx:16999 #: src/dialogs/confdialog.cxx:17051 src/dialogs/confdialog.cxx:17098 #: src/dialogs/confdialog.cxx:17140 src/dialogs/confdialog.cxx:17352 #, fuzzy msgid "Addr" msgstr "Servidor:" #: src/dialogs/confdialog.cxx:16883 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16899 msgid "I/O" msgstr "E/S" # Aunque el texto en inglés aparece como "IP Address Port Number" considero que la traducción debe ser "Número del puerto" ya que se refiere a la opción del puerto UDP al que se establece la conexión (@HK4QWC) #: src/dialogs/confdialog.cxx:16900 src/dialogs/confdialog.cxx:17017 #: src/dialogs/confdialog.cxx:17069 src/dialogs/confdialog.cxx:17116 #: src/dialogs/confdialog.cxx:17149 src/dialogs/confdialog.cxx:17369 msgid "IP Address Port Number" msgstr "Número del puerto" #: src/dialogs/confdialog.cxx:16916 msgid "Output port number when same IP address used" msgstr "Puerto de salida cuando se usa la misma dirección IP" #: src/dialogs/confdialog.cxx:16931 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16932 msgid "Enable when both programs are using the same IP address" msgstr "Habilitar cuando ambos programas están usando la misma dirección IP" #: src/dialogs/confdialog.cxx:16938 src/dialogs/confdialog.cxx:17037 #: src/dialogs/confdialog.cxx:17084 #, fuzzy msgid "Restart" msgstr "Inicio" #: src/dialogs/confdialog.cxx:16942 msgid "Start" msgstr "Inicio" #: src/dialogs/confdialog.cxx:16943 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16952 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16953 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16959 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16960 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16966 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16967 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16973 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16974 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16980 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16981 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16987 msgid "AX25 Decode" msgstr "Decod. AX25" #: src/dialogs/confdialog.cxx:16988 msgid "Decode AX25 Packets into human readable form" msgstr "Descodifica paquetes AX25 en forma legible" #: src/dialogs/confdialog.cxx:16996 msgid "ARQ" msgstr "ARQ" #: src/dialogs/confdialog.cxx:17000 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17043 #, fuzzy msgid "XML" msgstr "KML" #: src/dialogs/confdialog.cxx:17052 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17090 #, fuzzy msgid "flrig" msgstr "flrig:" #: src/dialogs/confdialog.cxx:17099 src/dialogs/confdialog.cxx:17353 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17131 src/dialogs/confdialog.cxx:17155 #: src/dialogs/confdialog.cxx:17383 msgid "Reconnect" msgstr "Reconectar" #: src/dialogs/confdialog.cxx:17137 #, fuzzy msgid "fllog" msgstr "fllog:" #: src/dialogs/confdialog.cxx:17141 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17172 src/dialogs/confdialog.cxx:17323 #: src/dialogs/confdialog.cxx:17325 #, fuzzy msgid "Operator-Station" msgstr "Información del operador" #: src/dialogs/confdialog.cxx:17177 #, fuzzy msgid "Station Callsign:" msgstr "Indicativo del operador" #: src/dialogs/confdialog.cxx:17178 #, fuzzy msgid "Station callsign" msgstr "Indicativo del operador" #: src/dialogs/confdialog.cxx:17191 #, fuzzy msgid "Operator Callsign:" msgstr "Indicativo del operador" #: src/dialogs/confdialog.cxx:17192 msgid "Operator callsign (if different than station callsign)" msgstr "" #: src/dialogs/confdialog.cxx:17206 #, fuzzy msgid "Operator Name:" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:17207 msgid "Operators name" msgstr "Nombre del operador" #: src/dialogs/confdialog.cxx:17220 msgid "Antenna:" msgstr "Antena:" #: src/dialogs/confdialog.cxx:17221 msgid "Short description of antenna" msgstr "Descripción corta de la antena" #: src/dialogs/confdialog.cxx:17234 #, fuzzy msgid "Station City:" msgstr "Estación" #: src/dialogs/confdialog.cxx:17249 #, fuzzy msgid "Station Locator:" msgstr "Cuadrícula:" #: src/dialogs/confdialog.cxx:17250 msgid "Maidenhead locator as in EM64qv" msgstr "Cuadrícula Maindenhead como en FL11aj" #: src/dialogs/confdialog.cxx:17263 #, fuzzy msgid "State/Prov./Country" msgstr "Provincia Can." #: src/dialogs/confdialog.cxx:17264 msgid "US States / Canadian Provinces" msgstr "" #: src/dialogs/confdialog.cxx:17281 msgid "Abbreviation for State/Province" msgstr "" #: src/dialogs/confdialog.cxx:17293 msgid "Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17294 msgid "US/Canadian Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17311 msgid "Abbreviation for County/Region" msgstr "" #: src/dialogs/confdialog.cxx:17328 src/dialogs/confdialog.cxx:17426 #: src/dialogs/confdialog.cxx:17428 #, fuzzy msgid "Rig Control/flrig" msgstr "Control del radio" #: src/dialogs/confdialog.cxx:17332 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:17336 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:17337 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:17344 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:17384 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:17389 msgid "flrig is the preferred method of tranceiver control" msgstr "" #: src/dialogs/confdialog.cxx:17392 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:17393 src/dialogs/confdialog.cxx:17399 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:17398 #, fuzzy msgid "Shutdown flrig with fldigi" msgstr "Iniciar programas automáticamente con fldigi" #: src/dialogs/confdialog.cxx:17404 #, fuzzy msgid "Poll Interval (msec)" msgstr "Intervalo entre reintento (ms)" #: src/dialogs/confdialog.cxx:17405 msgid "Request updates every 'poll interval' milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:17431 src/dialogs/confdialog.cxx:17634 #: src/dialogs/confdialog.cxx:17636 msgid "Rig Control/CAT (rigcat)" msgstr "" #: src/dialogs/confdialog.cxx:17435 msgid "Use RigCAT" msgstr "Use RigCAT" #: src/dialogs/confdialog.cxx:17436 msgid "RigCAT used for rig control" msgstr "Usar RigCAT para el control del radio" #: src/dialogs/confdialog.cxx:17443 msgid "Rig description file:" msgstr "Archivo de descripción del radio:" #: src/dialogs/confdialog.cxx:17444 msgid "Use Open to select descriptor file" msgstr "Use Abrir para seleccionar un descriptor de archivo" #: src/dialogs/confdialog.cxx:17450 msgid "Select rig descriptor file" msgstr "Seleccionar archivo de descripción del radio" # Config > Control del radio > Hamlib: # Dispositivo queda apretado, propongo traducir por # P. Serie: # Que quedará mejor y se entiende @ CO7WT # También se usa para el dispositivo de audio OSS… entonces mejor usar "Puerto:" @HK4QWC #: src/dialogs/confdialog.cxx:17454 src/dialogs/confdialog.cxx:17940 #: src/dialogs/confdialog.cxx:18210 src/dialogs/confdialog.cxx:18551 msgid "Device:" msgstr "Puerto:" #: src/dialogs/confdialog.cxx:17469 src/dialogs/confdialog.cxx:17955 msgid "Retries" msgstr "Reintentos" #: src/dialogs/confdialog.cxx:17470 msgid "# retries before giving up" msgstr "# de reintentos antes de rendirnos" #: src/dialogs/confdialog.cxx:17486 msgid "Retry interval (ms)" msgstr "Intervalo entre reintento (ms)" #: src/dialogs/confdialog.cxx:17487 msgid "Time between retires in msec" msgstr "Tiempo entre reintentos (ms)" #: src/dialogs/confdialog.cxx:17503 msgid "Write delay (ms)" msgstr "Ret. escritura (ms)" #: src/dialogs/confdialog.cxx:17504 msgid "Wait for response to subsequent command" msgstr "Tiempo de espera para la respuesta del comando subsiguiente" #: src/dialogs/confdialog.cxx:17520 src/dialogs/confdialog.cxx:18023 msgid "Baud rate:" msgstr "Tasa de baudios:" #: src/dialogs/confdialog.cxx:17536 src/dialogs/confdialog.cxx:18039 msgid "Stopbits" msgstr "Bits de parada" #: src/dialogs/confdialog.cxx:17556 msgid "Initialize RigCAT interface" msgstr "Inicializar la interfaz RigCAT" #: src/dialogs/confdialog.cxx:17560 msgid "Commands are echoed" msgstr "Los comandos tienen eco" #: src/dialogs/confdialog.cxx:17561 msgid "Rig or interface echos serial data" msgstr "El radio o la interfaz repite los datos enviados" #: src/dialogs/confdialog.cxx:17566 msgid "CAT command for PTT" msgstr "Comandos CAT para el PTT" #: src/dialogs/confdialog.cxx:17567 msgid "PTT is a CAT command (not hardware)" msgstr "El PTT es un comando CAT" #: src/dialogs/confdialog.cxx:17573 msgid "Toggle RTS for PTT" msgstr "Activar RTS para PTT" #: src/dialogs/confdialog.cxx:17574 msgid "RTS is ptt line" msgstr "RTS es la línea de PTT" #: src/dialogs/confdialog.cxx:17579 msgid "Toggle DTR for PTT" msgstr "Activar DTR para PTT" #: src/dialogs/confdialog.cxx:17580 msgid "DTR is ptt line" msgstr "DTR es la línea de PTT" #: src/dialogs/confdialog.cxx:17585 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:17586 src/dialogs/confdialog.cxx:18096 msgid "Initial state of RTS" msgstr "Estado inicial de RTS" #: src/dialogs/confdialog.cxx:17591 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:17592 src/dialogs/confdialog.cxx:18090 msgid "Initial state of DTR" msgstr "Estado inicial de DTR" #: src/dialogs/confdialog.cxx:17597 src/dialogs/confdialog.cxx:18101 msgid "RTS/CTS flow control" msgstr "Control de flujo RTS/CTS" #: src/dialogs/confdialog.cxx:17598 msgid "Rig uses RTS/CTS handshake" msgstr "El radio usa RTS/CTS para comunicarse" #: src/dialogs/confdialog.cxx:17603 #, fuzzy msgid "Restore UART Settings on Close" msgstr "Restablecer configuraciones al cerrar" #: src/dialogs/confdialog.cxx:17604 msgid "Restore the serial (COM) port settings" msgstr "Restablecer la configuración del puerto serial (COM)" #: src/dialogs/confdialog.cxx:17609 msgid "VSP Enable" msgstr "VSP Activado" #: src/dialogs/confdialog.cxx:17610 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Emulador serie virtual - Suprimir ADVERTENCIAS" #: src/dialogs/confdialog.cxx:17615 msgid "Init delay (ms)" msgstr "Retardo inicialización (ms)" #: src/dialogs/confdialog.cxx:17616 msgid "Wait for response to first CAT command" msgstr "Tiempo de espera para la respuesta al primer comando CAT" #: src/dialogs/confdialog.cxx:17639 src/dialogs/confdialog.cxx:17910 #: src/dialogs/confdialog.cxx:17912 #, fuzzy msgid "Rig Control/GPIO" msgstr "Control del radio" #: src/dialogs/confdialog.cxx:17643 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:17644 src/dialogs/confdialog.cxx:17778 #: src/dialogs/confdialog.cxx:17785 src/dialogs/confdialog.cxx:17792 #: src/dialogs/confdialog.cxx:17799 src/dialogs/confdialog.cxx:17806 #: src/dialogs/confdialog.cxx:17813 src/dialogs/confdialog.cxx:17820 #: src/dialogs/confdialog.cxx:17827 src/dialogs/confdialog.cxx:17834 #: src/dialogs/confdialog.cxx:17841 src/dialogs/confdialog.cxx:17848 #: src/dialogs/confdialog.cxx:17855 src/dialogs/confdialog.cxx:17862 #: src/dialogs/confdialog.cxx:17869 src/dialogs/confdialog.cxx:17876 #: src/dialogs/confdialog.cxx:17883 src/dialogs/confdialog.cxx:17890 #: src/dialogs/confdialog.cxx:18263 #, fuzzy msgid "Select PTT on state" msgstr "Seleccionar línea" #: src/dialogs/confdialog.cxx:17651 src/dialogs/confdialog.cxx:18270 msgid "Initialize the H/W PTT interface" msgstr "Inicializar la interfaz de HW para PTT" #: src/dialogs/confdialog.cxx:17654 src/dialogs/confdialog.cxx:17896 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:17658 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:17659 src/dialogs/confdialog.cxx:17666 #: src/dialogs/confdialog.cxx:17673 src/dialogs/confdialog.cxx:17680 #: src/dialogs/confdialog.cxx:17687 src/dialogs/confdialog.cxx:17694 #: src/dialogs/confdialog.cxx:17701 src/dialogs/confdialog.cxx:17708 #: src/dialogs/confdialog.cxx:17715 src/dialogs/confdialog.cxx:17722 #: src/dialogs/confdialog.cxx:17729 src/dialogs/confdialog.cxx:17736 #: src/dialogs/confdialog.cxx:17743 src/dialogs/confdialog.cxx:17750 #: src/dialogs/confdialog.cxx:17757 src/dialogs/confdialog.cxx:17764 #: src/dialogs/confdialog.cxx:17771 #, fuzzy msgid "Select pin number" msgstr "Seleccionar línea" #: src/dialogs/confdialog.cxx:17665 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:17672 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:17679 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:17686 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:17693 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:17700 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:17707 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:17714 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:17721 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:17728 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:17735 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:17742 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:17749 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:17756 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:17763 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:17770 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:17777 src/dialogs/confdialog.cxx:17784 #: src/dialogs/confdialog.cxx:17791 src/dialogs/confdialog.cxx:17798 #: src/dialogs/confdialog.cxx:17805 src/dialogs/confdialog.cxx:17812 #: src/dialogs/confdialog.cxx:17819 src/dialogs/confdialog.cxx:17826 #: src/dialogs/confdialog.cxx:17833 src/dialogs/confdialog.cxx:17840 #: src/dialogs/confdialog.cxx:17847 src/dialogs/confdialog.cxx:17854 #: src/dialogs/confdialog.cxx:17861 src/dialogs/confdialog.cxx:17868 #: src/dialogs/confdialog.cxx:17875 src/dialogs/confdialog.cxx:17882 #: src/dialogs/confdialog.cxx:17889 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:17900 msgid "Pulse width (msec)" msgstr "" #: src/dialogs/confdialog.cxx:17901 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:17919 msgid "Use Hamlib" msgstr "Usar Hamlib" #: src/dialogs/confdialog.cxx:17920 msgid "Hamlib used for rig control" msgstr "Utilice Hamlib para controlar el radio" # Config > Control del radio > Hamlib: # No cabe Radio, porque está diseñado para Rig, desborda el marco. Incluso al redibujar la interfaz se pierde la palabra… # Se propone # Rad.: # @CO7WT #: src/dialogs/confdialog.cxx:17926 msgid "Rig:" msgstr "Rad.:" #: src/dialogs/confdialog.cxx:17956 msgid "# times to resend command before giving up" msgstr "# de veces para reenvío de comandos antes de rendirnos" #: src/dialogs/confdialog.cxx:17972 #, fuzzy msgid "Timeout (msec)" msgstr "Timeout (seg)" #: src/dialogs/confdialog.cxx:17973 msgid "Hamlib read timeout" msgstr "" #: src/dialogs/confdialog.cxx:17989 #, fuzzy msgid "Write delay (msec)" msgstr "Ret. escritura (ms)" #: src/dialogs/confdialog.cxx:17990 msgid "Msec's between sequential commands" msgstr "Milisegundos entre comandos secuenciales" #: src/dialogs/confdialog.cxx:18006 #, fuzzy msgid "Post write delay (msec)" msgstr "Ret. post-envío (ms)" #: src/dialogs/confdialog.cxx:18007 msgid "Wait interval (msecs) before reading response" msgstr "Intervalo de espera (ms) antes de leer la espuesta" #: src/dialogs/confdialog.cxx:18058 #, fuzzy msgid "Polling Interval (msec)" msgstr "Intervalo entre reintento (ms)" #: src/dialogs/confdialog.cxx:18077 msgid "PTT via Hamlib command" msgstr "PTT como comando de Hamlib" #: src/dialogs/confdialog.cxx:18078 #, fuzzy msgid "PTT using hamlib command" msgstr "PTT es un comando de Hamlib" #: src/dialogs/confdialog.cxx:18083 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:18084 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:18089 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:18095 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:18102 msgid "Rig requires RTS/CTS flow control" msgstr "El radio requiere control de flujo RTS/CTS" #: src/dialogs/confdialog.cxx:18108 msgid "XON/XOFF flow control" msgstr "Control de flujo Xon/Xoff" #: src/dialogs/confdialog.cxx:18109 msgid "Rig requires Xon/Xoff flow control" msgstr "El radio requiere control de flujo Xon/Xoff" #: src/dialogs/confdialog.cxx:18114 #, fuzzy msgid "CW is LSB mode" msgstr "CW es LSB" #: src/dialogs/confdialog.cxx:18115 msgid "Check if xcvr uses LSB for CW" msgstr "" #: src/dialogs/confdialog.cxx:18120 msgid "RTTY is USB mode" msgstr "" #: src/dialogs/confdialog.cxx:18121 msgid "Check if xcvr uses USB for RTTY" msgstr "" #: src/dialogs/confdialog.cxx:18126 #, fuzzy msgid "Mode delay (msec)" msgstr "Espera Modo/BW" #: src/dialogs/confdialog.cxx:18127 #, fuzzy msgid "Delay NN msec after executing mode change" msgstr "Retrasar NN ms antes de soltar el PTT" #: src/dialogs/confdialog.cxx:18146 msgid "Sideband:" msgstr "Banda lateral:" #: src/dialogs/confdialog.cxx:18159 msgid "Advanced configuration:" msgstr "Configuración avanzada:" #: src/dialogs/confdialog.cxx:18160 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configuración opcional\n" "en el formato: parámetro=valor..." #: src/dialogs/confdialog.cxx:18175 msgid "Initialize hamlib interface" msgstr "Inicializar la interfaz Hamlib" #: src/dialogs/confdialog.cxx:18188 src/dialogs/confdialog.cxx:18300 #: src/dialogs/confdialog.cxx:18302 #, fuzzy msgid "Rig Control/Hardware PTT" msgstr "PTT real" #: src/dialogs/confdialog.cxx:18194 src/dialogs/confdialog.cxx:18674 msgid "PTT tone on right audio channel " msgstr "Tono para PTT en el canal derecho de audio" #: src/dialogs/confdialog.cxx:18195 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Puede ser usado en vez de o en adición de otros tipos de PTT" #: src/dialogs/confdialog.cxx:18202 msgid "h/w ptt device-pin" msgstr "Pin del dispositivo PTT" #: src/dialogs/confdialog.cxx:18205 msgid "Use separate serial port PTT" msgstr "PTT por puerto serie separado" #: src/dialogs/confdialog.cxx:18225 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:18226 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:18232 msgid "Use parallel port PTT" msgstr "Utilice un PTT por puerto paralelo" #: src/dialogs/confdialog.cxx:18237 msgid "Use uHRouter PTT" msgstr "Utilice PTT uHRouter" #: src/dialogs/confdialog.cxx:18242 msgid "Use RTS" msgstr "Use RTS" #: src/dialogs/confdialog.cxx:18243 msgid "RTS is PTT signal line" msgstr "RTS es PTT" #: src/dialogs/confdialog.cxx:18247 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:18248 msgid "Initial voltage on RTS" msgstr "Voltaje inicial en RTS" #: src/dialogs/confdialog.cxx:18253 msgid "DTR is PTT signal line" msgstr "DTR es PTT" #: src/dialogs/confdialog.cxx:18257 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:18258 msgid "Initial voltage on DTR" msgstr "Voltaje inicial en DTR" #: src/dialogs/confdialog.cxx:18262 msgid "GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:18275 msgid "PTT delays valid for all CAT/PTT types" msgstr "Retrasos de PTT válidos para todos los tipos de PTT y CAT" #: src/dialogs/confdialog.cxx:18278 msgid "Start of transmit PTT delay" msgstr "Retraso de PTT en el inicio de transmisión" #: src/dialogs/confdialog.cxx:18279 msgid "Delay NN msec before starting audio" msgstr "Retrasar la salida del audio en NN ms" #: src/dialogs/confdialog.cxx:18288 msgid "PTT end of transmit delay" msgstr "Retraso de fin de PTT" #: src/dialogs/confdialog.cxx:18289 msgid "Delay NN msec before releasing PTT" msgstr "Retrasar NN ms antes de soltar el PTT" #: src/dialogs/confdialog.cxx:18306 src/dialogs/confdialog.cxx:18363 msgid "C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18310 msgid "" "C-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. " "GPIO signal line 3 (pin 13) is used for PTT control.\n" "\n" "Fldigi accesses the GPIO lines as a Human Interface Device (HID). " "Discovered C-Media devices are enumerated in the 'C-Media device' list box.\n" "\n" "On Linux: add a file named cmedia.rules to /etc/udev/rules.d/\n" "The file should contain a single line\n" "\n" "KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"" msgstr "" #: src/dialogs/confdialog.cxx:18319 msgid "Use C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18324 #, fuzzy #| msgid "Capture device" msgid "C-Media device" msgstr "Dispositivo de captura" #: src/dialogs/confdialog.cxx:18339 #, fuzzy #| msgid "Odd lines" msgid "GPIO line" msgstr "Líneas impares" #: src/dialogs/confdialog.cxx:18356 #, fuzzy #| msgid "Initialize the H/W PTT interface" msgid "Select device & Initialize the H/W PTT interface" msgstr "Inicializar la interfaz de HW para PTT" #: src/dialogs/confdialog.cxx:18359 msgid "TEST" msgstr "" #: src/dialogs/confdialog.cxx:18360 msgid "Toggles PTT line 20x; check DRA-30 ptt LED" msgstr "" #: src/dialogs/confdialog.cxx:18365 #, fuzzy msgid "Rig Control/C-Media PTT" msgstr "PTT real" #: src/dialogs/confdialog.cxx:18369 src/dialogs/confdialog.cxx:18534 #: src/dialogs/confdialog.cxx:18536 #, fuzzy msgid "Soundcard/Alerts" msgstr "Dispositivo de sonido" #: src/dialogs/confdialog.cxx:18378 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:18407 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:18436 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:18465 #, fuzzy msgid "flmsg received wav" msgstr "RST recibido" #: src/dialogs/confdialog.cxx:18489 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:18515 msgid "Alert volume" msgstr "" #: src/dialogs/confdialog.cxx:18539 src/dialogs/confdialog.cxx:18646 #: src/dialogs/confdialog.cxx:18648 #, fuzzy msgid "Soundcard/Devices" msgstr "Dispositivo de audio" #: src/dialogs/confdialog.cxx:18545 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:18546 msgid "Use OSS audio server" msgstr "Usar servidor de audio OSS" #: src/dialogs/confdialog.cxx:18552 msgid "Select device" msgstr "Seleccionar dispositivo" #: src/dialogs/confdialog.cxx:18560 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:18561 msgid "Use Port Audio server" msgstr "Usar servidor PortAudio" #: src/dialogs/confdialog.cxx:18566 msgid "Capture:" msgstr "Captura:" #: src/dialogs/confdialog.cxx:18567 msgid "Audio input device" msgstr "Dispositivo de entrada de audio" #: src/dialogs/confdialog.cxx:18571 msgid "Playback:" msgstr "Reproducción:" #: src/dialogs/confdialog.cxx:18572 src/dialogs/confdialog.cxx:18629 msgid "Audio output device" msgstr "Dispositivo de salida de audio" #: src/dialogs/confdialog.cxx:18580 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:18581 msgid "Use Pulse Audio server" msgstr "Usar servidor PulseAudio" #: src/dialogs/confdialog.cxx:18586 msgid "Server string:" msgstr "Servidor:" #: src/dialogs/confdialog.cxx:18587 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Deje esto en blanco en Ubuntu con una sola tarjeta de red\n" "referirse a http://www.pulseaudio.org/wiki/ServerStrings\n" "para más detalles" #: src/dialogs/confdialog.cxx:18605 msgid "File I/O only" msgstr "Solo E/S desde archivo" #: src/dialogs/confdialog.cxx:18606 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "" "Seleccionar cuando no haya dispositivo de audio disponible o para realizar " "pruebas" #: src/dialogs/confdialog.cxx:18615 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:18616 msgid "Capture/Playback supports full duplex operation" msgstr "" #: src/dialogs/confdialog.cxx:18628 msgid "Audio device shared by Audio Alerts and Rx Monitor" msgstr "" #: src/dialogs/confdialog.cxx:18635 #, fuzzy msgid "First select audio alert playback device" msgstr "Dispositivo de captura y reproducción" #: src/dialogs/confdialog.cxx:18641 msgid "Note: must be selected and enabled for Rx Audio monitoring!" msgstr "" #: src/dialogs/confdialog.cxx:18651 src/dialogs/confdialog.cxx:18708 #: src/dialogs/confdialog.cxx:18710 #, fuzzy msgid "Soundcard/Right channel" msgstr "Canal derecho" #: src/dialogs/confdialog.cxx:18655 #, fuzzy msgid "Transmit Usage" msgstr "Señal transmitida" #: src/dialogs/confdialog.cxx:18658 msgid "Modem signal on left and right channels" msgstr "Audio del módem en ambos canales de audio" #: src/dialogs/confdialog.cxx:18659 msgid "Left and right channels both contain modem audio" msgstr "Ambos canales de audio contienen información" #: src/dialogs/confdialog.cxx:18664 src/dialogs/confdialog.cxx:18700 msgid "Reverse Left/Right channels" msgstr "Invertir canales de audio derecho e izquierdo" #: src/dialogs/confdialog.cxx:18665 src/dialogs/confdialog.cxx:18701 msgid "Software reversal of left-right audio channels" msgstr "Invertir por software los canales de audio (derecho e izquierdo)" #: src/dialogs/confdialog.cxx:18670 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Estos controles están en otras pestañas.\n" "Solo se duplican aquí por conveniencia.\n" "Puedes cambiar su estado en cualquier lugar.\n" "..." #: src/dialogs/confdialog.cxx:18675 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "Tono de audio de 1Khz cuando hay PTT activo\n" "Para ser usado en otras formas de PTT" #: src/dialogs/confdialog.cxx:18681 msgid "CW QSK signal on right channel" msgstr "CW QSK en el canal derecho de audio" #: src/dialogs/confdialog.cxx:18682 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Generar una onda cuadrada en el canal derecho (1Khz)" #: src/dialogs/confdialog.cxx:18687 msgid "Pseudo-FSK on right audio channel" msgstr "Seudo-FSK en el canal derecho de audio" #: src/dialogs/confdialog.cxx:18688 msgid "Create 1000 Hz square wave on right channel" msgstr "Crear una onda cuadrada en el canal derecho de audio (1Khz)" #: src/dialogs/confdialog.cxx:18697 #, fuzzy msgid "Receive Usage" msgstr "Recibir" #: src/dialogs/confdialog.cxx:18713 src/dialogs/confdialog.cxx:18850 #: src/dialogs/confdialog.cxx:18852 #, fuzzy msgid "Soundcard/Settings" msgstr "Configuraciones" #: src/dialogs/confdialog.cxx:18720 msgid "Capture" msgstr "Captura" #: src/dialogs/confdialog.cxx:18721 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Forzar una taza de muestreo específica. Seleccionar \"Nativo\" si \"Auto\"\n" "no trabaja bien con tu dispositivo de audio." #: src/dialogs/confdialog.cxx:18753 msgid "Converter" msgstr "Convertidor" #: src/dialogs/confdialog.cxx:18754 msgid "Set the type of resampler used of offset correction" msgstr "Establecer el tipo de re-muestreo usado para correcciones" #: src/dialogs/confdialog.cxx:18770 msgid "Corrections" msgstr "Correcciones" #: src/dialogs/confdialog.cxx:18773 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:18774 msgid "RX sound card correction" msgstr "Corrección de RX en el dispositivo de audio" #: src/dialogs/confdialog.cxx:18790 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:18791 msgid "TX sound card correction" msgstr "Corrección de TX en el dispositivo de audio" #: src/dialogs/confdialog.cxx:18807 msgid "TX offset" msgstr "Dif. en Tx" #: src/dialogs/confdialog.cxx:18808 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Diferencias entre frecuencias de Rx y Tx (en el radio)" #: src/dialogs/confdialog.cxx:18826 msgid "Frequency Analysis / FMT Rx Correction" msgstr "" #: src/dialogs/confdialog.cxx:18834 #, fuzzy msgid "Frequency Correction" msgstr "Frecuencia en MHz" #: src/dialogs/confdialog.cxx:18835 msgid "Used ONLY for frequency analysis mode" msgstr "" #: src/dialogs/confdialog.cxx:18855 #, fuzzy msgid "Signal Level" msgstr "Nivel de señal" #: src/dialogs/confdialog.cxx:18859 #, fuzzy msgid "Signal Levels" msgstr "Nivel de señal" #: src/dialogs/confdialog.cxx:18940 src/dialogs/confdialog.cxx:18942 #, fuzzy msgid "Soundcard/Signal Level" msgstr "Dispositivo de audio" #: src/dialogs/confdialog.cxx:18945 src/dialogs/confdialog.cxx:18971 #: src/dialogs/confdialog.cxx:18973 msgid "Soundcard/Wav file recording" msgstr "" #: src/dialogs/confdialog.cxx:18949 msgid "Wav write sample rate" msgstr "Tasa de muestreo de wav" #: src/dialogs/confdialog.cxx:18950 msgid "Pick baud rate from list" msgstr "Seleccionar la tasa de baudios de la lista" #: src/dialogs/confdialog.cxx:18966 #, fuzzy msgid "Record both channels" msgstr "Invertir canales de audio derecho e izquierdo" #: src/dialogs/confdialog.cxx:18977 src/dialogs/confdialog.cxx:19063 #: src/dialogs/confdialog.cxx:19065 msgid "UI/Browser/Channels" msgstr "" #: src/dialogs/confdialog.cxx:18981 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Canales, el primer canal comienza en el límite inferior de la cascada" #: src/dialogs/confdialog.cxx:18982 msgid "Change # of psk viewer channels" msgstr "Cambiar el número de canales del navegador" #: src/dialogs/confdialog.cxx:18999 msgid "Inactivity timeout" msgstr "Tiempo de inactividad" #: src/dialogs/confdialog.cxx:19000 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Limpiar el texto del canal\n" "después de N segundos\n" "de inactividad" #: src/dialogs/confdialog.cxx:19016 msgid "Channel label" msgstr "Etiqueta del canal" #: src/dialogs/confdialog.cxx:19017 msgid "Appearance of label on each channel" msgstr "Apariencia de la etiqueta de cada canal" #: src/dialogs/confdialog.cxx:19028 msgid "Audio frequency" msgstr "Frecuencia de audio" #: src/dialogs/confdialog.cxx:19029 msgid "Radio frequency" msgstr "Frecuencia RF" #: src/dialogs/confdialog.cxx:19029 msgid "Channel number" msgstr "Número del canal" #: src/dialogs/confdialog.cxx:19034 src/dialogs/confdialog.cxx:19772 msgid "Font..." msgstr "Tipografía" #: src/dialogs/confdialog.cxx:19035 msgid "select browser font" msgstr "Selecciona la letra del navegador" #: src/dialogs/confdialog.cxx:19038 msgid "Fixed Intervals" msgstr "Intervalos Fijados" #: src/dialogs/confdialog.cxx:19039 msgid "Force channel spacing to even 100 Hz increments" msgstr "Forzar el espaciado de los canales a incrementos de 100Hz" #: src/dialogs/confdialog.cxx:19045 msgid "Continuous scrolling" msgstr "Movimiento contínuo" #: src/dialogs/confdialog.cxx:19046 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "Activado - Estilo marquesina\n" "Desactivado - Limpiar y re-comenzar" #: src/dialogs/confdialog.cxx:19051 msgid "Lowest freq on bottom of viewer" msgstr "Frecuencia más baja en la parte inferior del visor" #: src/dialogs/confdialog.cxx:19052 msgid "Change positions of low to high channels" msgstr "Cambiar la posición de los canales de abajo a arriba" #: src/dialogs/confdialog.cxx:19057 msgid "Play back history when active channel selected" msgstr "Reproducir el historial cuando se selecciona un canal" #: src/dialogs/confdialog.cxx:19058 msgid "Audio stream history decoded on selected signal" msgstr "Historial de audio descodificado al seleccionar" #: src/dialogs/confdialog.cxx:19068 src/dialogs/confdialog.cxx:19102 #: src/dialogs/confdialog.cxx:19104 #, fuzzy msgid "UI/Browser/Colors" msgstr "Colores de Resaltado" #: src/dialogs/confdialog.cxx:19072 msgid "HiLite 1" msgstr "HiLite 1" #: src/dialogs/confdialog.cxx:19073 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "Color 1 para el resaltado de HiLite en el visor de PSK/RTTY" #: src/dialogs/confdialog.cxx:19078 msgid "HiLite 2" msgstr "HiLite 2" #: src/dialogs/confdialog.cxx:19079 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "Color 2 para el resaltado de HiLite en el visor de PSK/RTTY" #: src/dialogs/confdialog.cxx:19084 msgid "Even" msgstr "Par" #: src/dialogs/confdialog.cxx:19085 msgid "Even lines" msgstr "Lineas pares" #: src/dialogs/confdialog.cxx:19090 msgid "Odd" msgstr "Impar" #: src/dialogs/confdialog.cxx:19091 msgid "Odd lines" msgstr "Líneas impares" #: src/dialogs/confdialog.cxx:19097 msgid "Select line" msgstr "Seleccionar línea" #: src/dialogs/confdialog.cxx:19107 src/dialogs/confdialog.cxx:19123 #: src/dialogs/confdialog.cxx:19125 #, fuzzy msgid "UI/Browser/Detection Level" msgstr "Detección de nivel" #: src/dialogs/confdialog.cxx:19111 msgid "Backgnd" msgstr "Fondo" #: src/dialogs/confdialog.cxx:19112 msgid "Background color of signal viewer squelch control" msgstr "" "Color de fondo de control deslizante del\n" "silenciador del navegador" #: src/dialogs/confdialog.cxx:19117 msgid "Button" msgstr "Botón" #: src/dialogs/confdialog.cxx:19118 msgid "Slider hilite color of signal viewer squelch control" msgstr "" "Color resaltado del deslizante del control\n" "del silenciador del navegador" #: src/dialogs/confdialog.cxx:19128 src/dialogs/confdialog.cxx:19262 #: src/dialogs/confdialog.cxx:19264 #, fuzzy msgid "UI/General" msgstr "General" #: src/dialogs/confdialog.cxx:19134 msgid "Show tooltips" msgstr "Mostrar sugerencias" #: src/dialogs/confdialog.cxx:19135 msgid "Enable / disable tooltips" msgstr "Activar / desactivar sugerencias" #: src/dialogs/confdialog.cxx:19141 msgid "Show menu icons" msgstr "Mostrar íconos del menú" #: src/dialogs/confdialog.cxx:19142 msgid "Enable / disable icons on menus" msgstr "Activar / desactivar los iconos en el menú" #: src/dialogs/confdialog.cxx:19147 msgid "UI scheme" msgstr "Esquema de la Interfaz" #: src/dialogs/confdialog.cxx:19148 msgid "Change application look and feel" msgstr "Cambiar la apariencia de la aplicación" #: src/dialogs/confdialog.cxx:19166 msgid "Visible modes" msgstr "Modos visibles" #: src/dialogs/confdialog.cxx:19167 msgid "Select modes for menu access" msgstr "Seleccionar los modos para acceso desde el menú" #: src/dialogs/confdialog.cxx:19170 msgid "UI language" msgstr "Idioma de la IU" #: src/dialogs/confdialog.cxx:19171 src/dialogs/confdialog.cxx:19915 msgid "Changes take effect on next program startup" msgstr "Los cambios serán efectivos en el próximo inicio del programa" #: src/dialogs/confdialog.cxx:19190 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "" "Imprimir CW / RTTY / THROB / CONTESTIA en minúsculas\n" "(Estos modos solo reconocen las mayúsculas)" #: src/dialogs/confdialog.cxx:19200 #, fuzzy msgid "Transmit lower case text" msgstr "Transmitir tono de inicio bajo" #: src/dialogs/confdialog.cxx:19207 msgid "Exit prompts" msgstr "Avisos de salida" #: src/dialogs/confdialog.cxx:19210 msgid "Prompt to save Configuration" msgstr "Confirmar para grabar configuración" #: src/dialogs/confdialog.cxx:19215 src/dialogs/confdialog.cxx:19377 msgid "Prompt to save macro file" msgstr "Confirmar para grabar macro" #: src/dialogs/confdialog.cxx:19216 src/dialogs/confdialog.cxx:19378 msgid "Write current macro set on program exit" msgstr "Graba el conjunto de macros actuales al cerrar el programa" #: src/dialogs/confdialog.cxx:19221 msgid "Prompt to save log" msgstr "Confirmar para grabar log" #: src/dialogs/confdialog.cxx:19227 msgid "Confirm exit" msgstr "Confirmar la salida" #: src/dialogs/confdialog.cxx:19234 msgid "Check for updates" msgstr "Comprobar si existen actualizaciones" #: src/dialogs/confdialog.cxx:19237 msgid "Check for updates when starting program" msgstr "Comprobar si hay actualizaciones al iniciar el programa" #: src/dialogs/confdialog.cxx:19247 #, fuzzy msgid "Show TX timer" msgstr "Mostrar las entidades DXCC" #: src/dialogs/confdialog.cxx:19252 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:19267 src/dialogs/confdialog.cxx:19405 #: src/dialogs/confdialog.cxx:19407 #, fuzzy msgid "UI/Macro buttons" msgstr "Etiqueta del botón de macro" #: src/dialogs/confdialog.cxx:19273 msgid "Mouse wheel active on macro buttons" msgstr "Rueda del ratón activa en los botones de macro" #: src/dialogs/confdialog.cxx:19274 msgid "enable mouse wheel control of macro bar" msgstr "Activar la rueda del ratón como control de la barra de macros" #: src/dialogs/confdialog.cxx:19281 msgid "Number and position of macro bars" msgstr "Cantidad y posición de las barras de macro" #: src/dialogs/confdialog.cxx:19284 msgid "Button Height" msgstr "Altura del botón" #: src/dialogs/confdialog.cxx:19285 msgid "Height of macro bar" msgstr "Altura de la barra de macro" #: src/dialogs/confdialog.cxx:19295 msgid "One above Rx/Tx" msgstr "Una sobre Rx/Tx" #: src/dialogs/confdialog.cxx:19296 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" "Una barra de macros debajo del panel de registro\n" "altura variable" #: src/dialogs/confdialog.cxx:19301 msgid "One above waterfall" msgstr "Una sobre la cascada" #: src/dialogs/confdialog.cxx:19306 msgid "One below waterfall" msgstr "Una bajo la cascada" #: src/dialogs/confdialog.cxx:19311 msgid "Two scheme 1" msgstr "Dos (Esquema 1)" #: src/dialogs/confdialog.cxx:19316 msgid "Two scheme 2" msgstr "Dos (Esquema 2)" #: src/dialogs/confdialog.cxx:19321 msgid "Two scheme 3" msgstr "Dos (Esquema 3)" #: src/dialogs/confdialog.cxx:19326 msgid "Two scheme 4" msgstr "Dos (Esquema 4)" #: src/dialogs/confdialog.cxx:19331 msgid "Two scheme 5" msgstr "Dos (Esquema 5)" #: src/dialogs/confdialog.cxx:19336 msgid "Two scheme 6" msgstr "Dos (Esquema 6)" #: src/dialogs/confdialog.cxx:19341 msgid "Two scheme 7" msgstr "Dos (Esquema 1)" #: src/dialogs/confdialog.cxx:19346 msgid "Two scheme 8" msgstr "Dos (Esquema 8)" #: src/dialogs/confdialog.cxx:19351 msgid "Two scheme 9" msgstr "Dos (Esquema 9)" #: src/dialogs/confdialog.cxx:19356 msgid "Two scheme 10" msgstr "Dos (Esquema 10)" #: src/dialogs/confdialog.cxx:19365 #, fuzzy msgid "Load last used macro file at start" msgstr "Cargar el último archivo de macro usado en el inicio" #: src/dialogs/confdialog.cxx:19366 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "Activado - Usar el último conjunto de macros\n" "Desactivado - Usar el conjunto pre-establecido" #: src/dialogs/confdialog.cxx:19371 #, fuzzy msgid "Display macro filename at start" msgstr "Mostrar el nombre del archivo de macros al iniciar" #: src/dialogs/confdialog.cxx:19387 #, fuzzy msgid "Show macro control codes" msgstr "Mostrar el editor de macros" #: src/dialogs/confdialog.cxx:19388 msgid "print ^! execution codes in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:19397 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:19398 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:19410 src/dialogs/confdialog.cxx:19454 #: src/dialogs/confdialog.cxx:19456 #, fuzzy msgid "UI/Rx Text" msgstr "Captura de Texto de RX" #: src/dialogs/confdialog.cxx:19414 msgid "Single-click to capture" msgstr "Clic sencillo para capturar" #: src/dialogs/confdialog.cxx:19415 src/dialogs/confdialog.cxx:19444 msgid "Enable for single click capure of text in Rx panel" msgstr "Habilitar para capturar el texto del panel Rx con un solo clic" #: src/dialogs/confdialog.cxx:19420 msgid "callsign tooltips in received text" msgstr "Mostrar información de los indicativos" #: src/dialogs/confdialog.cxx:19421 msgid "Popup info after a 2 second hover on a callsign" msgstr "" "Mostrar información de un indicativo después\n" "de estar dos segundos con el ratón sobre este" #: src/dialogs/confdialog.cxx:19426 msgid "Word delimiters" msgstr "Delimitadores" #: src/dialogs/confdialog.cxx:19427 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "Las entradas de texto de Rx están delimitadas por los\n" "caracteres definidos aquí, el tabulador, el espacio y la\n" "nueva línea están ya incluidos" #: src/dialogs/confdialog.cxx:19443 msgid "US units of distance (QRB)" msgstr "" #: src/dialogs/confdialog.cxx:19449 #, fuzzy msgid "Clear log fields - new CALL" msgstr "¿Limpiar los campos del registro?" #: src/dialogs/confdialog.cxx:19459 src/dialogs/confdialog.cxx:19494 #: src/dialogs/confdialog.cxx:19496 #, fuzzy msgid "UI/Touch" msgstr "Tacto" #: src/dialogs/confdialog.cxx:19463 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Nota:\n" "Estos elementos de configuración son útiles para usar fldigi en un\n" "dispositivo con pantalla táctil, como una tableta." #: src/dialogs/confdialog.cxx:19467 msgid "Arrow Key Control of Frequency Entry" msgstr "Entrada de frecuencia controlada por flecha" #: src/dialogs/confdialog.cxx:19470 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" "Der/Izq = 1 x DMS\n" "Arriba/Abajo= 10 x DMS\n" "Mayús - Der/Izq = 100 x DMS\n" "Mayús - Arriba/Abajo = 1000 x LSD" #: src/dialogs/confdialog.cxx:19474 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" "Der/Izq\n" "Seleccione Dígito Menos Significativo" #: src/dialogs/confdialog.cxx:19483 msgid "Rx / Tx Panels" msgstr "Panel Rx / Tx" #: src/dialogs/confdialog.cxx:19486 msgid "Tx above Rx" msgstr "Intercambia paneles Tx/Rx" #: src/dialogs/confdialog.cxx:19487 msgid "Enable to put Tx panel above Rx panel" msgstr "Activar para poner el panel Tx sobre el panel Rx" #: src/dialogs/confdialog.cxx:19500 src/dialogs/confdialog.cxx:19580 #: src/dialogs/confdialog.cxx:19582 #, fuzzy msgid "Waterfall/Buttons & Controls" msgstr "Controles de la cascada" # Propuesto por @HK4QWC # Habilite la casilla para mostrar el control de operador correspondiente # Propuesto por @CO7WT # Marcar para activar cada opción #: src/dialogs/confdialog.cxx:19504 msgid "Enable check box to show each respective operator control" msgstr "Marcar para activar cada opción" #: src/dialogs/confdialog.cxx:19514 msgid "WF Magnification" msgstr "Ampliado de la cascada" #: src/dialogs/confdialog.cxx:19520 msgid "WF carrier" msgstr "Portadora de la cascada" #: src/dialogs/confdialog.cxx:19526 msgid "WF Shift Controls" msgstr "Controles superiores de cascada" #: src/dialogs/confdialog.cxx:19532 msgid "WF ref level" msgstr "Nivel de referencia de la cascada" #: src/dialogs/confdialog.cxx:19538 msgid "WF drop rate" msgstr "Vel. de caída de la cascada" #: src/dialogs/confdialog.cxx:19544 msgid "WF amp span" msgstr "Amplitud de la cascada" #: src/dialogs/confdialog.cxx:19550 msgid "WF Store" msgstr "Almacenar frecuencia" #: src/dialogs/confdialog.cxx:19556 msgid "WF mode" msgstr "Modo de la cascada" #: src/dialogs/confdialog.cxx:19562 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:19568 msgid "XMT lock" msgstr "Bloqueo en Tx" #: src/dialogs/confdialog.cxx:19574 msgid "Enable all" msgstr "Activar todos" #: src/dialogs/confdialog.cxx:19577 msgid "Disable all" msgstr "Desactivar" #: src/dialogs/confdialog.cxx:19585 src/dialogs/confdialog.cxx:19800 #: src/dialogs/confdialog.cxx:19802 #, fuzzy msgid "Waterfall/Display" msgstr "Cascada" #: src/dialogs/confdialog.cxx:19589 msgid "Colors and cursors" msgstr "Colores y cursores" #: src/dialogs/confdialog.cxx:19592 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:19607 src/dialogs/confdialog.cxx:19611 #: src/dialogs/confdialog.cxx:19615 src/dialogs/confdialog.cxx:19619 #: src/dialogs/confdialog.cxx:19623 src/dialogs/confdialog.cxx:19627 #: src/dialogs/confdialog.cxx:19631 src/dialogs/confdialog.cxx:19635 #: src/dialogs/confdialog.cxx:19639 src/dialogs/confdialog.cxx:19660 #: src/dialogs/confdialog.cxx:19683 src/dialogs/confdialog.cxx:19706 #: src/dialogs/confdialog.cxx:19723 src/dialogs/confdialog.cxx:19735 #: src/dialogs/confdialog.cxx:19748 msgid "Change color" msgstr "Cambiar color" #: src/dialogs/confdialog.cxx:19642 msgid "Load..." msgstr "Cargar..." #: src/dialogs/confdialog.cxx:19643 msgid "Load a new palette" msgstr "Cargar una nueva paleta" #: src/dialogs/confdialog.cxx:19646 msgid "Save..." msgstr "Guardar..." #: src/dialogs/confdialog.cxx:19647 msgid "Save this palette" msgstr "Guardar esta paleta" #: src/dialogs/confdialog.cxx:19650 #, fuzzy #| msgid "Signal Browser" msgid "Signal BW" msgstr "Navegador de señal" #: src/dialogs/confdialog.cxx:19653 src/dialogs/confdialog.cxx:19676 #: src/dialogs/confdialog.cxx:19699 msgid "ON" msgstr "Activo" #: src/dialogs/confdialog.cxx:19654 msgid "Show cursor with bandwidth lines" msgstr "Mostar el cursos con las líneas de ancho de banda" #: src/dialogs/confdialog.cxx:19659 src/dialogs/confdialog.cxx:19682 #: src/dialogs/confdialog.cxx:19705 src/dialogs/confdialog.cxx:19722 #: src/dialogs/confdialog.cxx:19734 src/dialogs/confdialog.cxx:19747 #: src/dialogs/font_browser.cxx:177 msgid "Color" msgstr "Color" #: src/dialogs/confdialog.cxx:19666 src/dialogs/confdialog.cxx:19689 #: src/dialogs/confdialog.cxx:19712 src/dialogs/confdialog.cxx:19754 msgid "Wide" msgstr "Ancho" #: src/dialogs/confdialog.cxx:19673 msgid "Center line" msgstr "Línea central" #: src/dialogs/confdialog.cxx:19677 msgid "Show cursor with center line" msgstr "Mostrar el cursor con la línea central" #: src/dialogs/confdialog.cxx:19696 #, fuzzy #| msgid "Signal tracks" msgid "Signal trks" msgstr "Marcas de línea" #: src/dialogs/confdialog.cxx:19700 msgid "Show bandwidth tracks on waterfall" msgstr "Mostrar las pistas de ancho de banda en la cascada" #: src/dialogs/confdialog.cxx:19719 msgid "Notch" msgstr "Muesca" #: src/dialogs/confdialog.cxx:19731 #, fuzzy msgid "RsID Zone" msgstr "Recepción con RSID" #: src/dialogs/confdialog.cxx:19743 msgid "Monitor" msgstr "" #: src/dialogs/confdialog.cxx:19744 #, fuzzy #| msgid "Audio file" msgid "Audio monitor" msgstr "Archivo de audio" #: src/dialogs/confdialog.cxx:19763 msgid "Frequency scale" msgstr "Escala de frecuencia" #: src/dialogs/confdialog.cxx:19766 msgid "Always show audio frequencies" msgstr "Siempre mostrar las frecuencias de audio" #: src/dialogs/confdialog.cxx:19767 msgid "Audio or RF frequencies on waterfall scale" msgstr "Frecuencias de audio o RF en la escala de la cascada" #: src/dialogs/confdialog.cxx:19773 msgid "Select waterfall scale font" msgstr "Selecciona la escala de la tipografía de la cascada" #: src/dialogs/confdialog.cxx:19778 msgid "Transmit signal" msgstr "Señal transmitida" #: src/dialogs/confdialog.cxx:19781 msgid "Monitor transmitted signal" msgstr "Monitorear la señal transmitida" #: src/dialogs/confdialog.cxx:19782 msgid "Show transmit signal on waterfall" msgstr "Mostrar la señal transmitida en la cascada" #: src/dialogs/confdialog.cxx:19787 #, fuzzy msgid "Signal Level (dB)" msgstr "Nivel de señal" #: src/dialogs/confdialog.cxx:19788 msgid "Set level for good viewing" msgstr "Establecer el nivel para una visualización aceptable" #: src/dialogs/confdialog.cxx:19805 src/dialogs/confdialog.cxx:19941 #: src/dialogs/confdialog.cxx:19943 #, fuzzy msgid "Waterfall/FFT Processing" msgstr "Procesamiento FFT" #: src/dialogs/confdialog.cxx:19812 msgid "Low frequency limit in Hz" msgstr "Límite inferior de frecuencia en Hz" #: src/dialogs/confdialog.cxx:19831 msgid "FFT averaging" msgstr "Promedio de FFT" #: src/dialogs/confdialog.cxx:19832 msgid "Use averaging to decrease waterfall noise" msgstr "Usar promedio para disminuir el ruido en la cascada" #: src/dialogs/confdialog.cxx:19837 msgid "FFT prefilter window function" msgstr "Función de ventana de prefiltro FFT" #: src/dialogs/confdialog.cxx:19849 msgid "Rectangular" msgstr "Rectangular" #: src/dialogs/confdialog.cxx:19851 msgid "Triangular" msgstr "Triangular" #: src/dialogs/confdialog.cxx:19857 msgid "High frequency limit in Hz" msgstr "Límite superior de frecuencia en Hz" #: src/dialogs/confdialog.cxx:19876 msgid "Latency" msgstr "Latencia" #: src/dialogs/confdialog.cxx:19877 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" "Señal promedio en el tiempo\n" "0 - mínima\n" "4 - máxima" #: src/dialogs/confdialog.cxx:19899 src/dialogs/confdialog.cxx:19916 msgid "Show me more or less waterfall" msgstr "Mostrar más o menos cascada" #: src/dialogs/confdialog.cxx:19902 msgid "Slow drop rate" msgstr "Tasa de caída lenta" #: src/dialogs/confdialog.cxx:19903 msgid "Normal drop speed / value" msgstr "Tasa de caída normal / valor" #: src/dialogs/confdialog.cxx:19919 msgid "Waterfall height in pixels" msgstr "Altura de la cascada" #: src/dialogs/confdialog.cxx:19920 msgid "CPU usage increases with waterfall height" msgstr "El uso del CPU aumenta con el alto de la cascada" #: src/dialogs/confdialog.cxx:19946 src/dialogs/confdialog.cxx:20000 #: src/dialogs/confdialog.cxx:20002 #, fuzzy msgid "Waterfall/Mouse usage" msgstr "Velocidad de caída de la cascada" #: src/dialogs/confdialog.cxx:19952 msgid "Left or right click always replays audio history" msgstr "Clic derecho o izquierdo siempre reproduce la historia del audio" #: src/dialogs/confdialog.cxx:19953 msgid "Replay trackline audio" msgstr "Reproducir el audio del buffer ante un clic en la cascada" #: src/dialogs/confdialog.cxx:19958 msgid "Dragging on the waterfall scale changes frequency" msgstr "Agarrar y arrastar en la cascada cambia la frecuencia" #: src/dialogs/confdialog.cxx:19959 msgid "Enable drag cursor on waterfall scale" msgstr "Activar el arrastrado del cursor en la cascada" #: src/dialogs/confdialog.cxx:19964 msgid "Insert text on single left click" msgstr "Insertar texto en un solo clic izquierdo" #: src/dialogs/confdialog.cxx:19965 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Insertar un texto especial en el panel de Rx\n" "cuando se da clic en la cascada" #: src/dialogs/confdialog.cxx:19971 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "La cadena es remplazada con\n" "el modo actual y la frecuencia" #: src/dialogs/confdialog.cxx:19983 msgid "Wheel action" msgstr "Acción de la rueda del ratón en la cascada" #: src/dialogs/confdialog.cxx:19984 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Selecciona como la rueda del ratón se\n" "comporta dentro de la cascada" #: src/dialogs/confdialog.cxx:20005 src/dialogs/confdialog.cxx:20042 #: src/dialogs/confdialog.cxx:20044 #, fuzzy msgid "Waterfall/Spectrum" msgstr "Cascada" #: src/dialogs/confdialog.cxx:20009 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:20012 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:20013 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:20018 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:20019 #, fuzzy msgid "values left/below waterfall" msgstr "Una bajo la cascada" #: src/dialogs/confdialog.cxx:20024 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:20034 #, fuzzy msgid "use" msgstr "Ratón" #: src/dialogs/confdialog.cxx:20035 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:20048 src/dialogs/confdialog.cxx:20154 #: src/dialogs/confdialog.cxx:20156 #, fuzzy msgid "Web/Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:20052 msgid "Mail Server Attributes" msgstr "Atributos del servidor de correo (PSKMAIL)" #: src/dialogs/confdialog.cxx:20055 msgid "Carrier frequency (Hz)" msgstr "Frecuencia portadora (Hz)" #: src/dialogs/confdialog.cxx:20056 msgid "Default listen / transmit frequency" msgstr "Frecuencia de RX/TX predeterminada" #: src/dialogs/confdialog.cxx:20075 msgid "Search range (Hz)" msgstr "Rango de búsqueda (Hz)" #: src/dialogs/confdialog.cxx:20076 msgid "Listen for signals within this range" msgstr "Escuchar señales dentro de este rango" #: src/dialogs/confdialog.cxx:20115 msgid "AFC range (Hz)" msgstr "Rango AFC (Hz)" #: src/dialogs/confdialog.cxx:20116 msgid "Limit AFC movement to this range" msgstr "Limitar el movimiento del AFC a este rango" #: src/dialogs/confdialog.cxx:20135 msgid "Reset to Carrier" msgstr "Ajustar a la portadora" #: src/dialogs/confdialog.cxx:20136 msgid "When no signal present" msgstr "Cuando no halla señal presente" #: src/dialogs/confdialog.cxx:20144 msgid "General" msgstr "General" #: src/dialogs/confdialog.cxx:20147 msgid "Report ARQ frames average S/N" msgstr "Reportar el promedio de S/N de tramas ARQ" #: src/dialogs/confdialog.cxx:20159 src/dialogs/confdialog.cxx:20242 #: src/dialogs/confdialog.cxx:20244 msgid "Web/WX" msgstr "" #: src/dialogs/confdialog.cxx:20163 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:20164 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:20170 #, fuzzy msgid "Default URL" msgstr "Omisión" #: src/dialogs/confdialog.cxx:20173 msgid "METAR station ID code" msgstr "Código de la estación METAR" #: src/dialogs/confdialog.cxx:20174 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" "Por ejemplo KMDQ para el\n" "Huntsville-Madison Executive Airport, de AL" #: src/dialogs/confdialog.cxx:20179 msgid "Search on web" msgstr "Buscar en la web" #: src/dialogs/confdialog.cxx:20182 msgid "Full report" msgstr "Reporte Completo" #: src/dialogs/confdialog.cxx:20183 src/dialogs/confdialog.cxx:20237 msgid "Insert full METAR report" msgstr "Insertar reporte METAR completo" #: src/dialogs/confdialog.cxx:20188 msgid "METAR station location" msgstr "Localización de la estación METAR" #: src/dialogs/confdialog.cxx:20189 msgid "Add geopolitical name of METAR station" msgstr "Poner nombre geopolítico a la estación METAR" #: src/dialogs/confdialog.cxx:20194 msgid "Conditions" msgstr "Condiciones" #: src/dialogs/confdialog.cxx:20195 msgid "current wx conditions" msgstr "Condiciones actuales del clima" #: src/dialogs/confdialog.cxx:20200 msgid "Fahrenheit" msgstr "Grados Fahrenheit" #: src/dialogs/confdialog.cxx:20201 msgid "report Fahrenheit" msgstr "reportar en grados Fahrenheit" #: src/dialogs/confdialog.cxx:20206 msgid "Celsius" msgstr "Grados Celcius" #: src/dialogs/confdialog.cxx:20207 msgid "report Celsius" msgstr "reportar en grados Celsius" #: src/dialogs/confdialog.cxx:20212 msgid "Miles / Hour" msgstr "Millas / Hora" #: src/dialogs/confdialog.cxx:20213 msgid "report miles per hour" msgstr "reportar en millas por hora" #: src/dialogs/confdialog.cxx:20218 msgid "kilometers / hour" msgstr "kilómetros / hora" #: src/dialogs/confdialog.cxx:20219 msgid "report kilometers per hour" msgstr "reportar en kilómetros por hora" #: src/dialogs/confdialog.cxx:20224 #, fuzzy msgid "Inches Hg." msgstr "Pulgadas de Mg" #: src/dialogs/confdialog.cxx:20225 msgid "report inches mercury" msgstr "reportar en pulgadas de mercurio" #: src/dialogs/confdialog.cxx:20230 msgid "mbars" msgstr "milibares" #: src/dialogs/confdialog.cxx:20231 msgid "report millibars" msgstr "Reportar en milibares" #: src/dialogs/confdialog.cxx:20236 msgid "Unprocessed METAR data" msgstr "" #: src/dialogs/confdialog.cxx:20254 msgid "Restore defaults" msgstr "Predeterminados" #: src/dialogs/confdialog.cxx:20255 msgid "WARNING - this will over write ALL settings" msgstr "" #: src/dialogs/font_browser.cxx:77 msgid "Font color" msgstr "Color de letra" #: src/dialogs/font_browser.cxx:150 msgid "Font:" msgstr "Tipografía:" #: src/dialogs/font_browser.cxx:155 msgid "Size:" msgstr "Tamaño:" #: src/dialogs/font_browser.cxx:165 msgid "Fixed" msgstr "" #: src/dialogs/font_browser.cxx:169 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:184 msgid "" "abcdefghijklmnopqrstuvwxyz\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" "0123456789" msgstr "" # Este es el nombre de la ventana que se abre en el menú Archivo > Carpetas > Archivo de datos… # Lo dejo "Archivo de datos" para que sea consistente con el menú # @HK4QWC #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Archivos de datos" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Actualización de datos locales" # No encuentro un menú específico que use este texto @HK4QWC #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Fuente de datos" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Fuente datos" # No encuentro un menú específico que use este texto @HK4QWC #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Ubicación de la fuente de datos" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "Actualizar los datos locales con el contenido online" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Eliminar datos locales si se selecciona" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Evento" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entidad DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Mostrar las entidades DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "No trabajado previamente" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Usuario de LotW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "Usuario de eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplicados" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignorar duplicados" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "en:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Tiempo (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Acción" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Tiempo límite (s):" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Tiempo mínimo entre eventos" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Mostrar ventana de alerta:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Insertar texto predeterminado" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Esconder después de (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Añadir al texto de RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Añadir al texto de TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Mostrar el editor de macros" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Ejecutar programa:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entidades DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Buscar país:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Presione enter para continuar la búsqueda" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Buscar prefijo:" #: src/logbook/lgbook.cxx:615 msgid "Export Setup" msgstr "Configuración de la exportación" #: src/logbook/lgbook.cxx:616 src/logbook/lgbook.cxx:1631 msgid "Select Records to Export" msgstr "Seleccione las entradas a exportar" #: src/logbook/lgbook.cxx:624 src/logbook/lgbook.cxx:825 #: src/logbook/lgbook.cxx:1639 src/logbook/lgbook.cxx:1721 msgid "Check All" msgstr "Marcar todo" #: src/logbook/lgbook.cxx:627 msgid "Start Date" msgstr "Fecha inicio" #: src/logbook/lgbook.cxx:628 msgid "Start date for export" msgstr "Fecha de inicio para exportación" #: src/logbook/lgbook.cxx:641 msgid "Stop Date" msgstr "Fecha de fin" #: src/logbook/lgbook.cxx:642 msgid "Inclusive stop date for export" msgstr "Fecha de fin de la exportación (inclusiva)" #: src/logbook/lgbook.cxx:655 msgid "select by date" msgstr "Selecc. por fecha" #: src/logbook/lgbook.cxx:656 #, fuzzy msgid "Enable to select date range" msgstr "Activar para seleccionar rango de fechas" #: src/logbook/lgbook.cxx:662 msgid "Select Fields to Export" msgstr "Seleccione los campos a exportar" #: src/logbook/lgbook.cxx:673 src/logbook/lgbook.cxx:1670 msgid "Freq" msgstr "Frec" #: src/logbook/lgbook.cxx:684 msgid "QSO Date On" msgstr "Fecha de inicio" #: src/logbook/lgbook.cxx:688 msgid "QSO Date Off" msgstr "Fecha de fin" #: src/logbook/lgbook.cxx:692 msgid "Time ON" msgstr "Hora com." #: src/logbook/lgbook.cxx:696 src/logbook/lgbook.cxx:1682 msgid "Time OFF" msgstr "Hora fin." #: src/logbook/lgbook.cxx:699 msgid "TX Power" msgstr "Potencia" #: src/logbook/lgbook.cxx:702 src/logbook/lgbook.cxx:1686 msgid "RST sent" msgstr "RST env." #: src/logbook/lgbook.cxx:706 src/logbook/lgbook.cxx:1690 msgid "RST rcvd" msgstr "RST recib." #: src/logbook/lgbook.cxx:710 src/logbook/lgbook.cxx:1003 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:713 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:719 src/logbook/lgbook.cxx:1367 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:722 src/logbook/lgbook.cxx:1243 #, fuzzy msgid "Station Call" msgstr "Estación" #: src/logbook/lgbook.cxx:725 src/logbook/lgbook.cxx:1267 #, fuzzy msgid "Station QTH" msgstr "Estación" #: src/logbook/lgbook.cxx:728 #, fuzzy msgid "Station LOC" msgstr "Estación" #: src/logbook/lgbook.cxx:740 src/logbook/lgbook.cxx:1224 msgid "Notes" msgstr "Notas" #: src/logbook/lgbook.cxx:743 msgid "QSL rcvd date" msgstr "Fecha de RX QSL" #: src/logbook/lgbook.cxx:746 msgid "QSL sent date" msgstr "Fecha de TX QSL" #: src/logbook/lgbook.cxx:749 #, fuzzy msgid "eQSL rcvd date" msgstr "Fecha de RX QSL" #: src/logbook/lgbook.cxx:752 #, fuzzy msgid "eQSL sent date" msgstr "Fecha de TX QSL" #: src/logbook/lgbook.cxx:755 #, fuzzy msgid "LoTW rcvd date" msgstr "Fecha de RX QSL" #: src/logbook/lgbook.cxx:758 #, fuzzy msgid "LoTW sent date" msgstr "Fecha de TX QSL" #: src/logbook/lgbook.cxx:761 src/logbook/lgbook.cxx:1132 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:764 src/logbook/lgbook.cxx:1694 msgid "Serial # in" msgstr "Serie recibida" #: src/logbook/lgbook.cxx:767 src/logbook/lgbook.cxx:1698 msgid "Serial # out" msgstr "Serie enviada" #: src/logbook/lgbook.cxx:776 src/logbook/lgbook.cxx:1706 msgid "Exchange Out" msgstr "Intercambio TX" #: src/logbook/lgbook.cxx:785 src/logbook/lgbook.cxx:1174 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:788 src/logbook/lgbook.cxx:1210 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:791 src/logbook/lgbook.cxx:1162 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:794 src/logbook/lgbook.cxx:1198 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:797 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:800 #, fuzzy msgid "FD section" msgstr "Recepción con RSID" #: src/logbook/lgbook.cxx:803 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:804 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:807 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:808 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:811 #, fuzzy msgid "CW SS Check" msgstr "Marcar todo" #: src/logbook/lgbook.cxx:814 #, fuzzy msgid "CW SS Section" msgstr "Acción" #: src/logbook/lgbook.cxx:815 src/logbook/lgbook.cxx:819 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:818 src/logbook/lgbook.cxx:1379 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:844 msgid "Logbook" msgstr "Libro de guardia" #: src/logbook/lgbook.cxx:845 msgid "Date On" msgstr "Fecha de inicio" #: src/logbook/lgbook.cxx:846 msgid "Date QSO started" msgstr "Fecha de inicio del QSO" #: src/logbook/lgbook.cxx:858 msgid "Time On" msgstr "Hora inicio" #: src/logbook/lgbook.cxx:859 msgid "Time QSO started" msgstr "Hora de inicio del QSO" #: src/logbook/lgbook.cxx:871 msgid "Call sign worked" msgstr "Indicativo trabajado" #: src/logbook/lgbook.cxx:883 msgid "Operator worked" msgstr "Operador trabajado" #: src/logbook/lgbook.cxx:894 msgid "In" msgstr "Rec" #: src/logbook/lgbook.cxx:895 msgid "Rst received" msgstr "RST recibido" #: src/logbook/lgbook.cxx:906 msgid "Recs" msgstr "Ent." #: src/logbook/lgbook.cxx:907 msgid "# Records in logbook" msgstr "Número de entradas en el libro de guardia" #: src/logbook/lgbook.cxx:918 msgid "Date Off" msgstr "Fecha de fin" #: src/logbook/lgbook.cxx:919 msgid "Date QSO Ended" msgstr "Fecha de fin del QSO" #: src/logbook/lgbook.cxx:931 msgid "Time Off" msgstr "Hora fin" #: src/logbook/lgbook.cxx:932 msgid "Time QSO ended" msgstr "Hora de fin del QSO" #: src/logbook/lgbook.cxx:943 msgid "Freq." msgstr "Frec." #: src/logbook/lgbook.cxx:944 msgid "Frequency in MHz" msgstr "Frecuencia en MHz" #: src/logbook/lgbook.cxx:956 msgid "Mode in use" msgstr "Modo en uso" #: src/logbook/lgbook.cxx:967 msgid "Pwr" msgstr "Pot" #: src/logbook/lgbook.cxx:968 msgid "Transmit power used" msgstr "Potencia de transmisión usada" #: src/logbook/lgbook.cxx:979 msgid "Loc" msgstr "Loc" #: src/logbook/lgbook.cxx:980 msgid "Stations grid square" msgstr "Cuadrícula de la estación" #: src/logbook/lgbook.cxx:991 msgid "Out" msgstr "Env" #: src/logbook/lgbook.cxx:992 msgid "Rst sent" msgstr "RST env." #: src/logbook/lgbook.cxx:1004 msgid "City of station worked" msgstr "Ciudad de la estación trabajada" #: src/logbook/lgbook.cxx:1015 msgid "St" msgstr "Es" #: src/logbook/lgbook.cxx:1016 msgid "US state of station worked" msgstr "Estado de EE.UU. de la estación trabajada" #: src/logbook/lgbook.cxx:1027 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:1028 msgid "Province of station worked" msgstr "Provincia de la estación trabajada" #: src/logbook/lgbook.cxx:1040 msgid "Country of station worked" msgstr "País de la estación trabajada" #: src/logbook/lgbook.cxx:1053 #, fuzzy msgid "QSL" msgstr "Usuario de eQSL" #: src/logbook/lgbook.cxx:1054 msgid "QSL-rcvd" msgstr "QSL-recibida" #: src/logbook/lgbook.cxx:1055 src/logbook/lgbook.cxx:1068 #: src/logbook/lgbook.cxx:1081 msgid "QSL received on this date" msgstr "QSL recibidas en esta fecha" #: src/logbook/lgbook.cxx:1067 #, fuzzy msgid "EQSL-rcvd" msgstr "QSL-recibida" #: src/logbook/lgbook.cxx:1080 #, fuzzy msgid "LOTW-rcvd" msgstr "QSL-recibida" #: src/logbook/lgbook.cxx:1093 msgid "QSL-sent" msgstr "QSL-enviada" #: src/logbook/lgbook.cxx:1094 src/logbook/lgbook.cxx:1107 #: src/logbook/lgbook.cxx:1120 msgid "QSL sent on this date" msgstr "QSL enviadas en esta fecha" #: src/logbook/lgbook.cxx:1106 #, fuzzy msgid "EQSL-sent" msgstr "QSL-enviada" #: src/logbook/lgbook.cxx:1119 #, fuzzy msgid "LOTW-sent" msgstr "QSL-enviada" #: src/logbook/lgbook.cxx:1133 msgid "QSL route of contacted station" msgstr "QSL route de la estación" #: src/logbook/lgbook.cxx:1163 msgid "Islands on the air" msgstr "Islas en el aire (IOTA)" #: src/logbook/lgbook.cxx:1186 msgid "Cont'" msgstr "Contestia" #: src/logbook/lgbook.cxx:1211 msgid "DXCC designator" msgstr "Identificador DXCC" #: src/logbook/lgbook.cxx:1227 src/logbook/lgbook.cxx:1244 #: src/logbook/lgbook.cxx:1256 src/logbook/lgbook.cxx:1268 #: src/logbook/lgbook.cxx:1280 msgid "Interesting notes" msgstr "Notas interesantes (80 caract. máx.)" #: src/logbook/lgbook.cxx:1241 #, fuzzy msgid "My Station" msgstr "Estación" #: src/logbook/lgbook.cxx:1279 #, fuzzy msgid "Station Locator" msgstr "Estación escuchada dos veces" #: src/logbook/lgbook.cxx:1295 msgid "Ser out" msgstr "Ser env" #: src/logbook/lgbook.cxx:1296 src/logbook/lgbook.cxx:1421 #, fuzzy msgid "Contest seral # sent" msgstr "#Serie enviado en concurso" #: src/logbook/lgbook.cxx:1307 #, fuzzy msgid "Exch Out" msgstr "Intercambio TX" #: src/logbook/lgbook.cxx:1308 src/logbook/lgbook.cxx:1445 msgid "Contest exchange sent" msgstr "Intercambio enviado en Concurso" #: src/logbook/lgbook.cxx:1319 msgid "Ser in" msgstr "Ser rec" #: src/logbook/lgbook.cxx:1320 msgid "Contest serial # received" msgstr "# Recibido como intercambio en concursos" #: src/logbook/lgbook.cxx:1331 #, fuzzy msgid "Exch In" msgstr "Intercambio RX" #: src/logbook/lgbook.cxx:1332 src/logbook/lgbook.cxx:1457 msgid "Contest exchange received" msgstr "Recibido el intercambio en concursos" #: src/logbook/lgbook.cxx:1344 #, fuzzy msgid "Field Day class received" msgstr "Acción de la rueda del ratón en la cascada" #: src/logbook/lgbook.cxx:1355 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1356 #, fuzzy msgid "Field Section received" msgstr "Acción de la rueda del ratón en la cascada" #: src/logbook/lgbook.cxx:1368 #, fuzzy msgid "Operators age received" msgstr "Nombre del operador" #: src/logbook/lgbook.cxx:1380 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1392 #, fuzzy msgid "Operating band" msgstr "Operador" #: src/logbook/lgbook.cxx:1404 #, fuzzy msgid "Check value received" msgstr "Recibido el intercambio en concursos" #: src/logbook/lgbook.cxx:1417 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1418 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1420 #, fuzzy msgid "Ser NoR" msgstr "Ser env" #: src/logbook/lgbook.cxx:1444 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1470 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1471 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1473 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1474 #, fuzzy msgid "Sent troop number" msgstr "Seleccionar línea" #: src/logbook/lgbook.cxx:1485 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1486 #, fuzzy msgid "Received troop number" msgstr "Número de serie recibido" #: src/logbook/lgbook.cxx:1497 #, fuzzy msgid "Name-S" msgstr "Nombre" #: src/logbook/lgbook.cxx:1498 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1509 #, fuzzy msgid "Name-R" msgstr "Nombre" #: src/logbook/lgbook.cxx:1510 #, fuzzy msgid "Received scout name" msgstr "Recibir" #: src/logbook/lgbook.cxx:1526 msgid "Call Search" msgstr "Buscar Indicativo" #: src/logbook/lgbook.cxx:1527 msgid "Search for this callsign" msgstr "Buscar este indicativo" #: src/logbook/lgbook.cxx:1539 msgid "Find previous" msgstr "Buscar el anterior" #: src/logbook/lgbook.cxx:1547 msgid "Find next" msgstr "Buscar el siguiente" #: src/logbook/lgbook.cxx:1554 #, fuzzy msgid "Retrieve" msgstr "Reintentos" #: src/logbook/lgbook.cxx:1555 msgid "Retrieve for active modem use" msgstr "Sintonizar el módem actual a estos datos (Frecuencia y Modo)" #: src/logbook/lgbook.cxx:1568 msgid "New record / Save record" msgstr "Registro nuevo / Actualizar" #: src/logbook/lgbook.cxx:1575 msgid "Update the current record" msgstr "Actualizar el registro actual" #: src/logbook/lgbook.cxx:1582 msgid "Delete the current record" msgstr "Eliminar el registro actual" #: src/logbook/lgbook.cxx:1588 #, fuzzy msgid "File:" msgstr "&Archivo" #: src/logbook/lgbook.cxx:1611 msgid "Date" msgstr "Fecha" #: src/logbook/lgbook.cxx:1613 msgid "Time" msgstr "Hora" #: src/logbook/lgbook.cxx:1630 msgid "Cabrillo Setup" msgstr "Configuraciones para Cabrillo" #: src/logbook/lgbook.cxx:1650 msgid "Select Cabrillo Contest & Fields" msgstr "Selecciona los campos de concurso para el registro Cabrillo" #: src/logbook/lgbook.cxx:1653 msgid "Contest:" msgstr "Concurso:" #: src/logbook/lgbook.cxx:1678 msgid "QSO Date" msgstr "Fecha QSO" #~ msgid "Searches passband" #~ msgstr "Buscar en el pasabanda" #~ msgid "Lighted button enabled colors" #~ msgstr "Colores de los botones iluminados" #, fuzzy #~ msgid "All Others" #~ msgstr "Otro" #~ msgid "Receive modes" #~ msgstr "Modos de RX" #, fuzzy #~ msgid "Transceiver FSK" #~ msgstr "Control del transceptor" #, fuzzy #~ msgid "NBEMS interface" #~ msgstr "Interface de datos NBEMS" #~ msgid "Signal level" #~ msgstr "Nivel de señal" #, fuzzy #~ msgid "Filter Settings" #~ msgstr "Filtraje" #, fuzzy #~ msgid "Filter center frequ ency" #~ msgstr "Añadir la frecuencia actual" #, fuzzy #~ msgid "Filter low cutoff frequency" #~ msgstr "Ajustar la frecuencia del cursor" #, fuzzy #~ msgid "Filter high cutoff frequency" #~ msgstr "Correr la cascada hacia frecuencias más altas" #, fuzzy #~ msgid "track WF cursor" #~ msgstr "Color" #, fuzzy #~ msgid "Rx audio volume" #~ msgstr "Audio" #, fuzzy #~ msgid "Filtered audio" #~ msgstr "Ancho de banda del filtro" #, fuzzy #~ msgid "Enable DSP filtering of rx audio stream" #~ msgstr "Activar el registro del texto de recepción." #, fuzzy #~ msgid "Weather Fax Image RX" #~ msgstr "&RX Imagen de Fax meteorológico" #~ msgid "No file name given" #~ msgstr "No se ha proporcionado un nombre de archivo" #~ msgid "channels != 1" #~ msgstr "canales <> 1" #~ msgid "unknown wave file error" #~ msgstr "Error desconocido con el archivo de audio wav" #~ msgid "Rig control" #~ msgstr "Control del radio" #~ msgid "RPC" #~ msgstr "RPC" #~ msgid "Spotter" #~ msgstr "Spotter" #~ msgid "KISS control" #~ msgstr "control KISS" #~ msgid "Log sources" #~ msgstr "Orígenes de logs" #~ msgid "Change log level" #~ msgstr "Cambiar el nivel de log" #, fuzzy #~ msgid "Waveform Audio Format]\t*.{mp3,wav}\n" #~ msgstr "" #~ "Forma de onda del audio\t*.wav\n" #~ "AU\t*.{au.snd}\n" #, fuzzy #~ msgid "Waveform Audio Format\t*.wav\n" #~ msgstr "" #~ "Forma de onda del audio\t*.wav\n" #~ "AU\t*.{au.snd}\n" #~ msgid "Free Lossless Audio Codec\t*.flac" #~ msgstr "Codec de audio libre sin pérdida\t*.flac" #~ msgid "Embedded Wefax Gui" #~ msgstr "Interfaz embebida para WXFAX" #~ msgid "" #~ "Display tx and rx in main fldigi window.\n" #~ "Change requires restart of fldigi" #~ msgstr "" #~ "Mostrar TX y RX en la ventana principal de fldigi.\n" #~ "Este cambio requiere reiniciar fldigi." #~ msgid "Hide Transmission window" #~ msgstr "Ocultar la ventana de TX" #~ msgid "Hide transmission window by default." #~ msgstr "Ocultar la ventana de TX de forma predeterminada" #, fuzzy #~ msgid "Center freq (1500 Hz)" #~ msgstr "Línea central" #~ msgid "Save image as monochrome file" #~ msgstr "Guardar como imagen monocromática" #~ msgid "Save the fax image as a gray-level PNG file." #~ msgstr "Guardar la imagen de fax como PNG en grises" #, fuzzy #~ msgid "Misc/IO" #~ msgstr "Misc." #, fuzzy #~ msgid "Misc/NBEMS" #~ msgstr "NBEMS" #, fuzzy #~ msgid "Retry Interval (msec)" #~ msgstr "Intervalo entre reintento (ms)" #~ msgid "Msec's between retries" #~ msgstr "Milisegundos entre reintentos" # ¿Qué tal si usamos un pangrama en español como este? (@HK4QWC) #~ msgid "" #~ "That crazy fox jumped over the dog again!\n" #~ "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" #~ "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #~ msgstr "" #~ "Jovencillo emponzoñado de whisky: ¡qué figurota exhibe!\n" #~ "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" #~ "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #~ msgid "Reading fonts..." #~ msgstr "leyendo tipografías..." #~ msgid "User Interface" #~ msgstr "Interfaz de usuario" #, fuzzy #~ msgid "Operating" #~ msgstr "Operador" #, fuzzy #~ msgid "Active Modem" #~ msgstr "Modos de RX" #, fuzzy #~ msgid "CPU speed" #~ msgstr "Vel. del AFC" #, fuzzy #~ msgid "PSKmail" #~ msgstr "Pskmail" #, fuzzy #~ msgid "Sweet spot" #~ msgstr "Frecuencia Inicial" #, fuzzy #~ msgid "Text IO" #~ msgstr "E/S de Texto" #~ msgid "WX" #~ msgstr "WX" #~ msgid "KML" #~ msgstr "KML" # Texto de la pestaña IO en la ventana de configuración Fldigi (@HK4QWC) #~ msgid "IO" #~ msgstr "E/S" #, fuzzy #~ msgid "PSM" #~ msgstr "PSK" #, fuzzy #~ msgid "Contest/Logging" #~ msgstr "Contestia" #~ msgid "QRZ/eQSL" #~ msgstr "QRZ/eQSL" #, fuzzy #~ msgid "Station / Operator" #~ msgstr "Estación escuchada dos veces" #~ msgid "Browser" #~ msgstr "Navegador" #~ msgid "Log" #~ msgstr "Log" #, fuzzy #~ msgid "QSO" #~ msgstr "QSY" #~ msgid "WF Ctrls" #~ msgstr "Controles de la cascada" #~ msgid "Clrs/Fnts" #~ msgstr "Colores/Tipos" #~ msgid "Rx/Tx" #~ msgstr "Rx/Tx" #~ msgid "F_keys" #~ msgstr "Teclas de función" #~ msgid "Tabs" #~ msgstr "Pestañas" #~ msgid "Buttons" #~ msgstr "Botones" #~ msgid "SigLvl" #~ msgstr "Nivel de señal" #~ msgid "Display" #~ msgstr "Mostrar" #~ msgid "Mouse" #~ msgstr "Ratón" #~ msgid "TX WPM" #~ msgstr "TX WPM" #~ msgid "Weight (%)" #~ msgstr "Peso (en %)" #~ msgid "Dot to dot-space ratio" #~ msgstr "Relación punto a punto-raya" #, fuzzy #~ msgid "Edge decrease" #~ msgstr "Los bordes de subida y bajada disminuyen el ancho del pulso" #~ msgid "Weight decreases with increasing edge timing" #~ msgstr "" #~ "El peso disminuye con el incremento de los tiempos de borde de los pulsos" #, fuzzy #~ msgid "BPF transmit audio" #~ msgstr "WPM en TX de CW" #~ msgid "Msec pre-keydown (+ is earlier in time)" #~ msgstr "PTT es enviado N milisegundos antes del pulso real" #~ msgid "Msec post-keydown (+ is earlier in time)" #~ msgstr "PTT es soltado N milisegundos después del pulso real" #~ msgid "Dom" #~ msgstr "DomEX" #~ msgid "Feld" #~ msgstr "Feld-Hell" #~ msgid "MT-63" #~ msgstr "MT-63" #, fuzzy #~ msgid "Oliv" #~ msgstr "Olivia" #, fuzzy #~ msgid "Cont" #~ msgstr "Contestia" #~ msgid "PSK" #~ msgstr "PSK" #, fuzzy #~ msgid "TTY" #~ msgstr "RTTY" #~ msgid "Rx" #~ msgstr "Rx" #~ msgid "Tx" #~ msgstr "Tx" #~ msgid "Synop" #~ msgstr "Synop" #~ msgid "Thor" #~ msgstr "Thor" #, fuzzy #~ msgid "Nav" #~ msgstr "Wav" #~ msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" #~ msgstr "Predefinido 800 Hz. Servicio Meteorológico Alemán 850Hz" #~ msgid "Received fax maximum rows number (5000)" #~ msgstr "Número máximo de filas para un fax (5000)" #~ msgid "Maximum row number for a received fax image." #~ msgstr "Número máximo de filas para una imagen de fax recibida" #~ msgid "Rig" #~ msgstr "Radio" #~ msgid "RigCAT" #~ msgstr "RigCAT" #~ msgid "Hamlib" #~ msgstr "Hamlib" #~ msgid "Devices" #~ msgstr "Dispositivos" #~ msgid "Wav" #~ msgstr "Wav" #, fuzzy #~ msgid "Regex Match in Browser" #~ msgstr "Navegador" #, fuzzy #~ msgid "flmsg interface" #~ msgstr "Interfaz de usuario" #~ msgid "ID" #~ msgstr "ID" #~ msgid "Open squelch for nn sec if RSID detected" #~ msgstr "Abrir el silenciador por nn segundos si se detecta RSID" #~ msgid "CPU" #~ msgstr "CPU" #~ msgid "Spotting" #~ msgstr "Spotting" #~ msgid "PSK Reporter" #~ msgstr "PSK Reporter" #~ msgid "Weather query specification" #~ msgstr "Consulta específica de clima" #~ msgid "Temperature" #~ msgstr "Temperatura" #~ msgid "Wind speed/dir" #~ msgstr "Vel/Dir del viento" #~ msgid "Barometric pressure" #~ msgstr "Presión Barométrica" #~ msgid "eQSL" #~ msgstr "Usuario de eQSL" #, fuzzy #~ msgid "Use password for tqsl access" #~ msgstr "Contraseña" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Control del radio por un\n" #~ "programa externo\n" #~ "usando XML-RPC" #~ msgid "Use XML-RPC program" #~ msgstr "Usar un programa XML-RPC" #~ msgid "Experimental" #~ msgstr "Experimental" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Inicializar el control por XML-RPC" #~ msgid "" #~ "Delay in seconds between \tLDT in iso-8601 format" #~ msgstr "\tLDT en formato iso-8601" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT en formato iso-8601" #~ msgid "\tUTC datetime" #~ msgstr "\tfecha y hora UTC" #~ msgid "User Interface - Browser" #~ msgstr "Interfaz de usuario - Navegador" #~ msgid "User Interface - General" #~ msgstr "Interfaz de usuario - General" #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Interfaz de usuario - Colores / Tipos de letra" #~ msgid "User Interface - Contest" #~ msgstr "Interfaz de usuario - Concurso" #~ msgid "User Interface - Macros" #~ msgstr "Interfaz de usuario - Macros" #~ msgid "User Interface - Waterfall controls" #~ msgstr "Interfaz de usuario - Controles de la cascada" #~ msgid "Rig Control using xml spec file" #~ msgstr "Control del radio usando un archivo xml" #~ msgid "Callsign database" #~ msgstr "Base de datos de indicativos" #~ msgid "Program to Program Communications" #~ msgstr "Comunicación entre aplicaciones" #, fuzzy #~ msgid "Power Signal Monior" #~ msgstr "Tono pre-señal" #~ msgid "Callsign:" #~ msgstr "Indicativo:" #~ msgid "Name:" #~ msgstr "Nombre:" #~ msgid "Transmit width" #~ msgstr "Ancho de la transmisión" #~ msgid "# of multiple scans / character line" #~ msgstr "# de múltiples exploraciones / lineas de caracteres" #~ msgid "Halve receive width" #~ msgstr "Ancho de Rx a la mitad" #~ msgid "Compress Rx in time" #~ msgstr "Comprimir Rx en el tiempo" #~ msgid "2x Xmt Width (hidden)" #~ msgstr "2x Tx ancho (oculto)" #~ msgid "Revert" #~ msgstr "Revertir" #~ msgid "Reset rigCAT interface" #~ msgstr "Restablecer la interfaz rigCAT" #~ msgid "Reset hamlib interface" #~ msgstr "Restablecer la interfaz Hamlib" #, fuzzy #~ msgid "Use GPIO PTT" #~ msgstr "Usar PTT Memmap" #, fuzzy #~ msgid "Select GPIO port" #~ msgstr "Seleccione el puerto serie" #, fuzzy #~ msgid "QSL-2" #~ msgstr "QSL-VIA" #~ msgid "Rig control and logging" #~ msgstr "Controles del radio y log" #~ msgid "Rig control and contest" #~ msgstr "Controles del radio y concursos" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "No se pudo comprobar si hay actualizaciones:\n" #~ "%s" #~ msgid "Visit URL" #~ msgstr "Visitar la URL" #~ msgid "Copy URL" #~ msgstr "Copiar la URL" #~ msgid "Controls" #~ msgstr "Controles" #~ msgid "# S" #~ msgstr "# S" #~ msgid "# R" #~ msgstr "# R" #~ msgid "Monitor KISS Pwr Squelch" #~ msgstr "Monitor KPSQL" #~ msgid "Empty ADIF logbook file %s" #~ msgstr "Archivo de libro de guardia vacío (ADIF) %s" #~ msgid "Error reading %s" #~ msgstr "Error leyendo %s" #~ msgid "Quick entry" #~ msgstr "Entrada rápida" #~ msgid "Exchanges" #~ msgstr "Intercambio" #~ msgid "Transmit all text in lower case" #~ msgstr "TX todo en minúsculas" #~ msgid "User Interface - Logging" #~ msgstr "Interfaz de usuario - Registro" #~ msgid "Client/Server Logbook" #~ msgstr "Logs remotos cliente/servidor" #~ msgid "Enter URL address of server" #~ msgstr "Entre la dirección URL del servidor" #~ msgid "Enter Port # assigned to server" #~ msgstr "Número de puerto asignado al servidor" #~ msgid "Prompt to save macro file when closing" #~ msgstr "Confirmar si graba archivo de macros al cerrar" #~ msgid "Wefax" #~ msgstr "Wefax" #~ msgid "Mono audio output" #~ msgstr "Salida de audio monofónico" #~ msgid "Force output audio to single channel" #~ msgstr "Forzar la salida de audio por un solo canal" #~ msgid "End of header string:" #~ msgstr "Fin de la cabecera:" #~ msgid "" #~ "Text defining end of METAR header\n" #~ "Typically 'Connection: close'\n" #~ "Used to search for station name" #~ msgstr "" #~ "Texto que define el fin de cabecera METAR\n" #~ "Usualmente 'Connection: close'\n" #~ "Usado para detectar nombre de estación." #~ msgid "QRZ online via default Internet Browser" #~ msgstr "QRZ online vía navegador web" #~ msgid "HamCall online via default Internet Browser" #~ msgstr "HamCall en línea vía navegador web" #~ msgid "HamQTH via default Internet Browser" #~ msgstr "Sitio HamQTH vía navegador web" #~ msgid "IP Address format: nnn.nnn.nnn.nnn" #~ msgstr "Formato de dirección IP: nnn.nnn.nnn.nnn" #~ msgid "XMLRPC" #~ msgstr "XMLRPC" #~ msgid "IP Address for KISS interface" #~ msgstr "Dirección IP para la interfaz KISS" #~ msgid "Continue After (sec)" #~ msgstr "Cont. después de (seg)" #~ msgid "Dual Port" #~ msgstr "Puerto dual" #~ msgid "CONT" #~ msgstr "CONT" #~ msgid "Dial" #~ msgstr "Sintonizar" #~ msgid "\tvideo text" #~ msgstr "\tvideo texto" #~ msgid "Raised cosine = Hanning" #~ msgstr "Coseno elevado = Hanning" #~ msgid "Really want to quit?" #~ msgstr "Realmente quieres terminar?" #~ msgid "No rig specified" #~ msgstr "No se ha especificado un radio" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Entre frecuencia o cambie con\n" #~ "Izq./Der../Arriba/Abajo/Pág_Arriba/Pág_Abajo" #~ msgid "Enter Xcvr Freq" #~ msgstr "Frec. del TRCV" #~ msgid "Memory Mapped Rig" #~ msgstr "Radio mapeado en memoria" #~ msgid "" #~ "Exit prompts active only when File/Exit menu item selected.\n" #~ "Not active if window decoration close button pressed." #~ msgstr "" #~ "Están activas solo cuando cierras usando el menú Archivo/Salir.\n" #~ "No se activan cuando das click en el botón de cerrar en la ventana." #~ msgid "Enable if you cannot use the middle mouse button" #~ msgstr "Activalo si no puedes usar el botón del centro del ratón" #~ msgid "Char set" #~ msgstr "Juego de Caracteres" #~ msgid "Frq Disp" #~ msgstr "Frecuencia" #~ msgid "Label text" #~ msgstr "Texto" #~ msgid "FFT latency (scan merging)" #~ msgstr "Latencia de FFT (mezcla de escaneo)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "La latencia incrementa la resolución de frecuencia,\n" #~ "disminuir a 1 para no mezclar" #, fuzzy #~ msgid "Pkt" #~ msgstr "Packet" #~ msgid "Packet" #~ msgstr "Packet" #~ msgid "Select packet baudrate" #~ msgstr "Seleccionar velocidad de packet" #~ msgid "RX Low Freq Gain" #~ msgstr "Gan. Rx en frec. bajas" #~ msgid "Processing gain to apply to lower tone (in dB)" #~ msgstr "Ganancia a aplicar a los tonos bajos (en dB)" #~ msgid "RX High Freq Gain" #~ msgstr "Gan. Rx en frec. altas" #~ msgid "Processing gain to apply to higher tone (in dB)" #~ msgstr "Ganancia a aplicar a los tonos altos (en dB)" #~ msgid "TX Low Freq Gain" #~ msgstr "Gan. Tx en frec. bajas" #~ msgid "TX High Freq Gain" #~ msgstr "Gan. Tx en frec. altas" #~ msgid "add RX timestamps" #~ msgstr "añadir marcas de tiempo en RX" #~ msgid "decode Compressed data" #~ msgstr "decodificar datos comprimidos" #~ msgid "Decode received Compressed Position data" #~ msgstr "Decodificar datos comprimidos de posición" #~ msgid "decode Mic-E data" #~ msgstr "decodificar datos Mic-E" #~ msgid "Decode received Mic-E data" #~ msgstr "Decodificar datos recibidos Mic-E" #~ msgid "decode PHG data" #~ msgstr "decodificar datos PHG" #~ msgid "Decode received PHG data" #~ msgstr "Decodificar datos PHG recibidos" #~ msgid "use SI units" #~ msgstr "usar unidades del SIU" #~ msgid "use English units" #~ msgstr "usar unidades Inglesas" #~ msgid "Display decoded data in English units" #~ msgstr "Mostrar datos decodificados en unidades Inglesas (pies, millas)" #~ msgid "Use cross-hair scope" #~ msgstr "Usar osciloscopio de hilos cruzados" #~ msgid "Defaults to syncscope instead of phase (cross-hair) scope" #~ msgstr "" #~ "Por defecto muestra la sincronía en vez de los hilos cruzados en el " #~ "osciloscopio" #~ msgid "boost Audio input" #~ msgstr "Amplificar entrada de audio" #~ msgid "add additional gain to audio input for low-output interfaces" #~ msgstr "Añadir ganancia adicional a la entrada de audio" #~ msgid "Select the rig by name" #~ msgstr "Seleccione el radio por su nombre" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Forzar el lateral del radio. Entra en efecto\n" #~ "cuando el radio cambia de modo." #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Control vía software mapeado\n" #~ "en memoria con variables\n" #~ "compartidas: Kachina" #~ msgid "Use Memmap" #~ msgstr "Usar Memmap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Radio mapeado via memoria (Kachina)" #~ msgid "Initialize Memmap interface" #~ msgstr "Inicializar interface Memmap" #~ msgid "Mixer" #~ msgstr "Mezclador" #~ msgid "OSS Mixer" #~ msgstr "Mezclador OSS" #~ msgid "Manage mixer" #~ msgstr "Manejar el mezclador" #~ msgid "Add mixer controls to main dialog" #~ msgstr "Añadir controles del mezclador a la interface principal" #~ msgid "Select Mixer device" #~ msgstr "Seleccionar dispositivo de mezcla" #~ msgid "Mic In" #~ msgstr "Mic In" #~ msgid "Use microphone input" #~ msgstr "Usar entrada de micrófono" #~ msgid "Line In" #~ msgstr "Line In" #~ msgid "Use Line-In device" #~ msgstr "Usar dispositivo Line-in" #~ msgid "PCM" #~ msgstr "PCM" #~ msgid "Set the sound card PCM level" #~ msgstr "Establecer el volumen PCM de la tarjeta" #~ msgid "Rx fax max rows" #~ msgstr "Rx fax max. cols." #~ msgid "" #~ "Enter full path-filename for external program\n" #~ "Or simple name of program" #~ msgstr "" #~ "Entre camino y nombre hasta el ejecutable\n" #~ "o simplemente el nombre del ejecutable" #~ msgid "Enable to reduce CPU load" #~ msgstr "Activar para reducir carga al CPU" #~ msgid "Number of errors allowed in RsID comparison" #~ msgstr "Cantidad de errores permitidos en identificación de RSID" #~ msgid "Save image as:" #~ msgstr "Guardar imagen como..." #~ msgid "Sensitivity" #~ msgstr "Sensibilidad" #~ msgid "" #~ "2 = normal sensitivity / decreased false detection\n" #~ "5 = high sensitivity / increased false detection" #~ msgstr "" #~ "2 = normal sensibilidad / disminuye la detección de falsos\n" #~ "5 = alta sensibilidad / incrementa la detección de falsos" #~ msgid "Navtex stations file:" #~ msgstr "Fichero de log de Navtex:" #~ msgid "Colors and Fonts" #~ msgstr "Colores y tipografía" #~ msgid "Disp" #~ msgstr "Radio" #~ msgid "64-bit (long) interleave" #~ msgstr "Intervalo largo de 64Bits" #~ msgid "Transmit /Receive" #~ msgstr "Transmitir/Recibir" #~ msgid "Filter Quality" #~ msgstr "Calidad del Filtro" #~ msgid "" #~ "Low -> High\n" #~ "DSP filter length\n" #~ "Low reduces load on CPU\n" #~ "High gives best performance" #~ msgstr "" #~ "Low -> High\n" #~ "Longitud del filtro DSP\n" #~ "Low (Bajo) reduce la carga de CPU\n" #~ "High (alto) obtiene mejor desempeño" #~ msgid "Optimum" #~ msgstr "Optimo" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Ancho de banda del filtro de Rx" #~ msgid "Demodulator" #~ msgstr "Demodulador" #~ msgid "" #~ "Select demodulator type\n" #~ "Kahn power detector\n" #~ "Automatic Threshold Correcting" #~ msgstr "" #~ "Selecciona el tipo de demodulador\n" #~ "Detector de potencia de Kahn\n" #~ "Corrección automática de umbral" #~ msgid "" #~ "Enabled - use Kahn power demodulator\n" #~ "Disabled - use ATC demodulator" #~ msgstr "" #~ "Activado - usar demodulador Kahn\n" #~ "Desactivado - usar demodulador ATC" #~ msgid "Set page width" #~ msgstr "Establecer el ancho de la página" #~ msgid "after:" #~ msgstr "después:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (oculto)" #~ msgid "Use UTF-8" #~ msgstr "Usar UTF-8" #~ msgid "Notifications only" #~ msgstr "Solo notificaciones" #~ msgid "Displays" #~ msgstr "Interfaz" #~ msgid "Tx Power" #~ msgstr "Potencia" #~ msgid "Ser# in" #~ msgstr "Ser rec." #~ msgid "QSO Freq" #~ msgstr "Frec QSO" #~ msgid "Cnty" #~ msgstr "País" #~ msgid "#Out" #~ msgstr "#Env." #~ msgid "#In" #~ msgstr "#Recv." #~ msgid "Xchg" #~ msgstr "Xchg" #~ msgid "File exists. Are you sure you want to overwrite?" #~ msgstr "El fichero existe. Estas seguro que lo quieres sobre escribir?" #, fuzzy #~ msgid "2" #~ msgstr "2" #~ msgid "Cntst'" #~ msgstr "Contestia" #, fuzzy #~ msgid "Matched Filter in use" #~ msgstr "Modo en uso" #~ msgid "MT63" #~ msgstr "MT63" #~ msgid "Display true frequency in the waterfall" #~ msgstr "Mostrar la frecuencia real en la cascada" #~ msgid "" #~ "Enable to show the true transmit frequency on the waterfall when the " #~ "radio is in CW (A1A) mode" #~ msgstr "" #~ "Habilitar para mostrar la frecuencia real de transmisión en la cascada " #~ "cuando el radio está en CW (A1A)" #~ msgid "On Date" #~ msgstr "Fecha inicio" #~ msgid "Off Date" #~ msgstr "Fecha Fin" #~ msgid "Save log before exiting?" #~ msgstr "Salvar libro de contactos antes de salir?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Salvar macros modificadas antes de salir?" #~ msgid "View log" #~ msgstr "Ver log" #~ msgid "A message was logged" #~ msgstr "Un mensaje se añadió al log" #~ msgid "Cursor color" #~ msgstr "Color del cursor" #~ msgid "Cursor center line" #~ msgstr "Linea central del cursor" #~ msgid "Bandwidth tracks" #~ msgstr "Pistas de ancho" #~ msgid "Tracks color" #~ msgstr "Color de las pistas" #~ msgid "Wide tracks" #~ msgstr "Pistas anchas" #~ msgid "Wide center line" #~ msgstr "Linea central ancha" #~ msgid "Wide cursor" #~ msgstr "Cursor ancho" #~ msgid "FH" #~ msgstr "FH" #~ msgid "DomEX" #~ msgstr "DomEX" #~ msgid "eQSL upload when record logged" #~ msgstr "Subir a eQSL cuando se graba el contacto" #~ msgid "Default message sent with eQSL" #~ msgstr "Mensaje por defecto para eQSL" fldigi-4.2.05/po/it.gmo0000664000175000017500000033762514611714004011537 00000000000000 |0`01 N [ hu }  Ɂ сہjTcx*$ $(,27<ACIOTY_flsz "/1PY_ g t DŽ ΄ ۄ   ! .;B[ dqx~!&a lӆ*)E5o,-҇.%I"o&& (<"Sv&+'*-X]+v"̊+ / Pq ̋݋/H&`!ƌ!"(<#W!{֍"+ 5Tm }'Ύ1ӎ%(Cl Ǐ ڏ"' ,3`e,z#$ː&-CW-k ÑБߑ    + 1<Qov$ ڒ.&>CKR,jȓ ̓ٓCݓ&! HU&l ,ǔ*%E#Nr$Õ ʕוݕD 4?Ob*z/ 2 <Zc,2ȗ')/)Y)1 ߘ  !2FO-b  Ǚҙ)+4<@IPY^ a mx  ך/?Wq   1ɛ 18:szŜ Ԝ#+/Eu~  ʝ&+Hh (ٞ+ 1?7N8 ܟ '.CWc$LG'_5 0 A3M  Ƣ +Fd.~4e r Ȥ *)*; fpx¥˥  :D IU';?{ʧ ڧ  $.7N ^i{ Ũ֨.7<K\pv,|C֩Vqy #ت8)A"k#$ޫ.0ج}­ޭ , (4;?V o |/!ӮB1)t&+ů0!"D a n1y% Ѱ۰  $ /,;ho&Ʋ,9To 9%г)/ 2P2Ӵ*+$@)e%7PEF "̶-8> D N Zg &Ʒ  3 S']3: - 5(@ i t:-й +3;ov) ۺ &6G\$qPͻ& +6>bD!/ɼ#9> DN_o/t,ٽ   ,H:M ̾Ѿ W0XZY<Y  0;Z`;e 3 O!p290D,S 6 <,2i86&8-Ky ~ @G [i  *"IM09.!0P Q2r $ 1:A|  "B%U{%M 5 B2L  ,@PWw - $"3)]m v 3/">C Rs  &5 E R_ s 0#+OWi"z *F^ s}&!+M_p  +'SX_xF ]!k!J( &;G1  7GYi} /&#, <J/Y ,'  , KYq&x"# != T^ e p2| -&#/SY h t . /0`} B  3)>#h0! .: MX \fnr     (*4 _ m y  ( *3<C KU^u vh x  %: OY ^j3 0;Q*Te&@72K8~ $0.Cr"!"-2(N^w    '6 =K_hpx      08/Hx ~ )T2$Rw ~a>EZ m x * ?7M  <@*\U0!&+Ht, ( #4!X0z (,FY$t38 -2EX1g" +JZ v! 1 %43h* 4'CUSj9 +&6] ly~  .8-Ao #$-<A` r}'  2<QV]u ! "'?G+\/%B:!<\/+  &5F c"q 4(="f 4HXr0 $ .:C!Kmry |  12O_x}/,8Q kw $3"Hk  )#+ConI2!|-') Q[ l"w*''$3EJY0l +$ - 9 DQ Y!f3&- (@Up ) %  / :  J 'T | '       " Q 5g 1      % ; Q (`  #  ! (  ( '2 Z a h p    3 V - =4 r    G ).8X$GBI[q0+H]s yX%$ J W dq y   t Zh'>1 5 CNT[dhpv{[bj ly!{          ( 5 B O \i n {)"!.Das*$/!T)v,)>,S;%-6d"t&5+#Gk'+ *&Q!V?x5!#?4t' +CXk5&!$Fc!"6 0 Q !q  & ; !!5!N! k!(w!!!!5!$!""")E"*o""'""")#(-#5V###5###$$/&$V$q$$$-$$$$$$% %% !%/% J%X%v%{% %% % %%)%%%&8%&#^&&3&.& & ' '!'14'"f''' ''a'1(N(^(({( ( ( (.(* )*5)`)(i))))<)**'*-*OM* ****.*+=9+w++K++ ,!,.8,Eg,8,,--2-2Q-2-=---.. 2. <.G.(^. ..1.+.//!/*/-3/a/8////// /// / /0 0 &0 20@0W0 s0}000"0011 <1G1 ]1i1n191111 19172?2G2 ]2%j22)2%2;2923l3u33333%3=4T42p444 4/4565<T555?5F5?6]6m6}6.66)6b7-g77b7#8*;8f888=8889:9N9Aa99999 9::%:?:,P:}:: :3:7;I;d;uy;; <!<2<P<k<t<<1<<0<===2=#K=o=x= ==)=)= > > >>?J9???????@0@9@ @@K@S@V@ ^@h@q@@ @ @@@ @ @@ @AA=,AjAAAAAAA=AB&BMDB`B BB*CJC-fC/CC0C D9D)WD(DD-DD D/ E9EFFFF'G ;GGG NG=\GGGGG#G GH>H$SH!xH+H0HPH5HI#~I.I3I3J#9J]J tJ8J0JJ!J K'K,KJK`K/pKK&K!K4K'&M)NM=xM$MMMN 0NE>N>N8N;NA8O"zO7O$O.O+)P&UP/|P;PFP /Qp9QMQQR#1R&UR@|R$RRR RR SS7S>SYS^SnS+S$SSS) T 4T,?T1lT?T TT T$TU #U+.U ZU+eUGU8UV#V4VEVE`VVVV(VAW BWMW]WnWWWWWWWW!WX/X DXZNXX XX X X}X&gY>Y,Y/Y*Z/Z 5Z?ZPZcZ5iZZ7ZZZZZ [ [ [ *[(6[_[Td[[ [[[[[\#\=\C\G\K\R\ [\e\j\]\^\]A]_]_]_^h^m^ ~^^^ ^$^^ ^Q^7_O_e_{__ _ _ _&_""`$E`&j`5`J`a.a2@asaGaa-a# b.bDHb:bb?b<%cbcxc?cc c c ccd!d?d(DdCmdd dddd de#e-Z"(OԆ$*+V-E4\O$ #47R2ʼn ͉7873p# 2-#.Q#5ʋh iv  ʌی   !)AE KX^dl u ύ {ÎՎ #63jp y1'r&S/z ʐ e ($ܑ$%0V6v-͒'#I<&ɓ0ޓ"N2- qДB<Z,.ĕ&<:w83,<K$Ǘؗ/&*Q0o'DȘD RbBљ8 MD[$Ś֚*=)Q {-$!>1p 39̜:CAyȝBcb&ƞ % ,=BX`p&Ɵ̟  '35i 2Ġ%-K*S~ơ2ۡ  5 ?I-P~Ȣ-% .<9Q5ۣ.52I)|GIN8:7¥    $1APl/ ͦ 3>C c$p-&ç  % 5Vl#èը ; Xd{+  ̩ ة "&-4H Q![}7ɪ+%>&F3mAJ Ws""ʬ*2: Wbu3ڭ   2([q'A %+QngI֯ +Am"'̰-ܰ  )05;f22  (IOg:~ Dz85F _ j v): *()S} ƴ5 <@WZy.õ%ɵ  -J1\ ζ)]GoC(+04K4/+2?^' ƹNҹ!(/7O_f9m`,!<^.x*Mһ $E4Tzϼ.GEɽKS[*d 3*#N guT:<u7cA(l'v/579EW35noN)y&xlK( \$r[vj_n)1/+>i~@A>>edp<my>%WJ%XhnUhH<pw jy`t6-w[ X3};ViA*KQz@G  P=4I< "7 89Xp ^f&$WOHk//hXeHs uMb\C9C(2qw[f0yqUeYU$L\IWjwUI-D&5N"im'5^j@/et:# (8~XeqJ.:ZpX%C}Za> * qB?{hJi^g".{nS4GykqSH\oD/{`Vu?~!G_ .y,Z00n70`: N_@-Y,z"kP6OEY2% Oi[A Y-"B,}1i)C E'M p!N}O7<~g8Ia n3tFVLm;-A*R=16#S&z_KjE `kLl2Y_E IoNLr.z  B F!)S=GH]P[b;1~<Yv# +t{o 2J], #Ts6vf,gvJOs8vJR9E+dc|W;R4'Tc}*SgxP!w NrB~Z654 6mch!lub\QbBFhd^2&'`.D@'mMuHR?szj]c}ar 3RK]lM e4 .xFo#&x9]b0,4 K)+Ls%xoc *!a TswK_udV?MCla?:d?Qz|^RCQx$5fM8$S9P|W;{rb G` Zt|B"2+=$3F^gmQpP)|D (V ak*gI+V3q]7:U8kA#T= t(OQ-U1D[%=0>FdGfr;ZTL{f\D@|1 {MODE} full mode / submode 4 07 7 5 21 29 6 22 31 A ring A umlaut C cedilla E acute E grave N tilde O acute O slash O umlaut U circ U umlaut in " "" RR"Disable PTT keys modem if multiple instances of fldigi (client) are connected to a single flrig (server).# Created: %s # Records in logbook# retries before giving up# times to resend command before giving up$ SX%s # Fldigi Generated Config Script %s log started on %s&About&Configure&File&Help&Logbook&OK&UI&View' WG( KN) KK**.exe*.txt+ AR- DU-.--.-.--.--...--....-.----..--.-..-.-..-..-.... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ......-.-...-..-00 = T; 9 = N11 - Slow, 2 - Medium, 3 - Fast1.5 baud10-101010 Nr12 26 3213 23 3314070.15016 27 3617 00 1118 01 1219 24 351st Ext2 baud20 28 3821 29 4022 03 1523 04 1624 05 1825 06 2225 W26 25 3727 02 133 baud4 bar macro set below Tx4.5 baud500 Hz limit6 baud8 psk8-bit extended characters:< AR<#comments> ignore comments AFC on,off,toggle alert using external wav file my antenna Xmt audio wav file send avatar other call clear log fields clear RX pane contest counter ignore comment text modem timing test, spec' file modem timing test, 'n' random 5 char groups modem timing test, string 's' modem char/sec test on nn chars CW identifier decrement counter digital mode (adif) [Wait][Len](ms) log eQSL optional msg log eQSL insert text file valid xcvr filter width send CAT cmd rig freq has kbd focus my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot idle signal for NN.nn sec LDT default '%Y-%m-%d %H:%M%z' increment counter S/N etc. IMD etc. ZDT default '%Y-%m-%d %H:%MZ' last serno sent saveQSO data, append msg to notes log at xmt time other locator LOCK on,off,toggle saveQSO data, append msg to notes save QSO data change macro defs file map by value map on google mode my call my county my locator my name my RST my FD section other name Transmit |NN| successive RsID bursts next QSO rec # pop current mode/freq from stack CW QSK post-timing CW QSK pre-timing push current mode to stack insert QRG into Rx text # QSO recs QSO time (HHMM)) incr/decr xcvr freq qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously send CAT cmd valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save contest out schedule execution for search DOWN for signal search UP for signal Digitalk On, Off, Toggle text at start of TX repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle end execution at Fldigi version WAV file; 'n' random 5 char groups WAV file; string 's' WAV file; internal string get weather data for station get weather data exchange begin exchange end exchange out UTC datetime, default '%x %H:%MZ'= 1 (on)= BT> SK@@ ACA aeligADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQARRL SectAX25 DecodeAbortAccess URLAcquisition S/N (dB)Acquisition search range (Hz)ActionActivate for Mortty K3NG sketchAddAdd CRLF after page width charactersAdd address to notes fieldAdd date/timeAdd date/time stamp to each # received messageAdd geopolitical name of METAR stationAddrAddressAdjustAdjust cursor frequencyAdjust sensitivity by 1/N fractional values.Adjust the DSP bandwidthAdvanced configuration:AgeAlert volumeAllAll settings shown here can be changed later via the Configure menuAllow TX After Signal Detection (Secs)Allow errorsAllow/Disallow ChangesAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAlways transmit at 1500 Hertz center freq.Amplitude of right channel QSK signalAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAttackAudible BELLAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio on Auxiliary PortAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto Connect / RetryAuto SpaceAuto connect when fldigi opens (server must be up)Auto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutomatically start psk reporter socket connectionAvailable substringsBCM GPIO pin ValueBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBad modem idBandBands must matchBandwidthBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBuffer allocation Error near File: %s Line %dBug me about saving log entriesBuild infoBusyButtonC&ountriesCALLSIGN always lower caseCAT command for PTTCPU usage increases with waterfall heightCQ STATECQ zoneCQZCR-CR-LFCSV...CT spaceCTRLCWCW ID modesCW KeylineCW Postamble IDCW SSCW SS Prec'CW SS SerNo RCW Sweepstakes ContestCW dsp filter bandwidthCW is LSBCW sweepstakes precedenceCW sweepstakes rcvd ser. no.CW sweepstakes sectionCW transmit WPMCW wpm keyboard stringsCW wpm using paddle keyerCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall SearchCall back for script command %s reported an ErrorCall sign workedCallook onlineCallook.info web siteCallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture Spot ReportCapture Spot TuneCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture/Playback supports full duplex operationCapture:Carrier Sense Mulitiple AccessCarrier frequency (Hz)Carrier shiftCelsiusCenter DXspot freq at sweet spotCenter display on signalCenter in passband Right click to undoCentered at 1500 Hz (SHARES)Change # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitCharacter count in args[] parameter exceeds expectationsCharacter searched not foundChars/Row:Check AllCheck for duplicatesCheck for updates when starting programCheck for updates...Check if xcvr uses USB for RTTYCheck this to be notified when an RSID is received without changing modem and frequencyCheck to enable TCP/IP IO ConnectionCheck to enable UDP/IP IOCheck to enable character encode/decode Select one character from each groupChecking for updates...Choose directory to store KML documentsCity of station workedClassCleanup KML data now !Cleanups KML documents, empties Google Earth display.ClearClear AllClear UDP textClear channel text after # seconds of inactivityClear list?Clear log entries after saving or using macro Clear log fields?Clear on saveCloseClose ListCollapse TreeColorColor for outgoing telnet textColor of Mark TrackColors and cursorsColors-Fonts/FreqDisp - MetersColors-Fonts/Function keysColors-Fonts/Logging controlsColors-Fonts/Signal LevelCommand %s ignored, dot notation not supportedCommand %s ignored, structured command not supportedCommand line optionsCommand missing ':'.Command started when KML files are generated. Subprocesses are started once, and restarted if needed.Commands are echoedCompCompensation in msec default = 0Compensationin microsecondsConfiguration InterfaceConfirmConfirm RESETConnectConnect to host program on FLDIGI start upConnect to serverConnect/disconnect to Talker socket serverConnectedContestContest exchange receivedContest exchange sentContest serial # receivedContest:Contests/JOTA SchoolContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not find LoTW report file. Download from ARRL's LoTW page after logging in at: https://lotw.arrl.org/lotwuser/default Store the report file to the fldigi LOTW folder, naming the file 'lotwreport.adi'Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCreate cabrillo reportCreate sunspotsCustom shiftCustom text searchCustom...CutCut 0/9DIRECTEDDPDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDX ClusterDX Cluster DialogDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioDash/DotData base lookupData files repositoryData retention time, in hours (0 for no limit)Database merger in progressDateDate QSO EndedDate QSO startedDate time ON == OFFDebugDecayDecode AX25 Packets into human readable formDecode DTMF tonesDecode received DTMF tonesDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log fileDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DefaultDefault CW tracking pointDefault RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec after executing mode changeDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete local data files if selected.Delete the current recordDeselectDetect the THOR preamble Clear the Rx pipelineDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDetector high thresholdDetector low thresholdDevice supports full duplexDevice:DiddleDiddle On/OFFDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirected received textDirectory path not foundDirectory...Disable allDisable further detection when RSID is receivedDisable if flrig not used.Display RX as a scrolling marqueeDisplay RX in reverse videoDisplay decoded as assigned keyDisplay the decoded prosign in the RX text using the short cut keyDisplay timed delivery message if enabledDisplays the Slot Time in MillisecondsDisplays the Transmit Delay in MillisecondsDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDocked scopeDon't saveDragging on the waterfall scale changes frequencyDriver requires stop bits to be ZERO!Dup ColorDuplicate check, CALL plusDuplicatesEchoEcho paddle chars to Rx PanelEdge shapeEdge timingEmpties KML documents when starting program.EnableEnable / disable icons on menusEnable / disable tooltipsEnable ARQ for programs that support TCP and FLDIGI ARQ protocol. Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol. Only one interface (ARQ/KISS) can be active at any given time. KISS/ARQ/XML Addr/Port changes require program restart.Enable DSP prior to decoderEnable GPIO PTT (Pi specific controls)Enable Histogram threshold signal monitoringEnable MultiPSK-compatible FECEnable Winkeyer PTT outputEnable Winkeyer audio toneEnable Winkeyer tone keyingEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable encode/decode vestigial pilot toneEnable flrig xcvr control with fldigi as clientEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable rx text streamEnable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this to send start/stop tonesEnable to inhibit TX on signal DetectionsEnable to put Tx panel above Rx panelEnable when both programs are using the same IP addressEnabledEnabled - log QSO using Mark frequency Disabled - log QSO using center frequencyEnabled - use Mark/Space filter outputs Disabled - use pseudo signalsEnd of line reachedEnd of xmt IDEnter METAR data internet URLEnter full path-filename for flmsgEnter test string or leave blank for default:Enter time span in minutesErrorEventEvent logExchange InExchange OutExecutable file to insertExecuteExecute command on KML files.ExitExit promptsExport SetupExport logbook records for LoTW uploadExport records for LoTW uploadExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extend last dit/dot in msec default = 0Extra duration to first dit/dot in msec default = 0Extract files for use with external "wrap / flmsg" programFD classFECFFT averagingFFT prefilter window functionFSK PTTFahrenheitFarnsworth keying (0 = none) default = 0FarsnworthFax images destination directoryFeel free to skip any pages or exit the wizard at any timeField Day Callsign May be same as OP callsignField Day ClassFile I/O onlyFile not foundFile read errorFill in Country / Azimuth using cty.dat informationFilterFilter FFT outputFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFlrig PTT keys modemFlushes the TX buffer after x period when Busy Channel remains on (TX inhibited)FoldersFontFont colorFont...Font:Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree service courtesy of OKFreqFreq.FrequencyFrequency in MHzFrequency scaleFullFundamental frequency of QSK square wave signalGeneralGenerate square wave signal on right channelGroup 1Group 2Group 3HamCall onlineHamQTHHamQTH onlineHamQTH.comHamcall.netHamlib used for rig controlHangHanning/Blackman - use edge timing BPF - use BPF bandwidthHeard agingHeard logHiLite 1HiLite 2HideHide window after (s):HighHigh frequency limit in HzHost:I/OIDsIDs/CWIDs/RsIDIDs/VideoIOTAIP Address Port NumberIP Address for ARQ interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for KISS interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for XMLRPC interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for fllog interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for flrig interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostITU zoneITUZIgnore duplicatesImage LPFInInactivity timeoutInches Hg.Include the transmit frequencyIncr'InfoInhibit 7 bit modem change notice on user or RSID receptionInhibit 7bit ModemInitial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert NN LTRS bytes at start of each transmissionInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Interleave SYNOP and textInterleave text with decoded SYNOP messages, or replacement.Invalid File Name Pointer (NULL) in function %s:%dInvalid Modem for KISS IOInvalid function parameter 'char *file_name_path' (null)Invalid function parameter (internal non-script error)Invalid parameterIslands on the airIssues reported in processing script file: %sJOTAJOTA scoutJOTA troopJamboree OTAJamboree On The AirK3 A1A configuationK3NG Arduino sketch emulationKISSKML balloon display styleKML balloon in plain text, or HTML, in plain tables or matrices.KML files directoryKML root fileKML server enabled (On / Off)KeyKeyerKeyer ModeKeying ratio default = 3.0Keying weight default = 50Kid's AgeLED brightnessLOCLast QSOLatencyLeadinLeadin in msec default = 0Leading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Limit AFC movement to this rangeLimit to a few characters, as in CQEM or IOTA etc.Line: %d Error:%d %s (%s)Listen / BindListen for signals within this rangeLkLoTWLoTW ReviewLoTW download fileLoadLoad a new paletteLoad image fileLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocate cty.dat fileLocate flmsgLocate flmsg executableLocatorLockLock transmit frequencyLog Navtex messages to Adif fileLog Navtex messages to KMLLog Wefax messages to Adif fileLog all RX/TX textLog on to pskrep when starting fldigiLogbookLogging/MacLoggerLogging/N3FJP logsLogin name for QRZ / Hamcall / HamQTHLogs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)Long receive integrationLook up callLotW userLow = zero errors Medium = 1 error High = 2 errorsLow frequency limit in HzLow tone at 500 HzLower limitLowest freq on bottom of viewerMARK polarityMETAR station ID codeMETAR station locationMYCALL always lower caseMYCALL detected wavMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesMarkMark onlyMark-SpaceMatchMatch logbook records with LoTW download fileMaximum open subscripts reached.May require resizing the Rx/Tx panelMediumMemory Allocation Error (internal non-script error)Merge ADIF fileMerge...Miles / HourMin HitsMinimal controlsMinimum WPM setting default = 10Minimum distance for splitting alias nodes (Meters)Minimum distance for splitting aliases (Meters)Minimum time between eventsMiscMisc/AutostartMissing command %s after line %dMissing paired quotes (")ModeMode in useMode must matchMode width limitModemModem carrierModem/CW/DTR-RTS keyingModem/CW/Extended Chars.Modem/CW/WinKeyerModem/CW/nanoIOModem/DominoEXModem/Feld HellModem/NavtexModem/OliviaModem/TTY/NavigatorModem/TTY/RxModem/TTY/SynopModem/TTY/TxModem/TTY/Winkeyer 3Modem/TTY/nanoIOMonitor for TCP connection.Monitor signals in modem bandwitdh plus margins.Monitor transmitted signalMouse wheel active on macro buttonsMovAvg:Msec post-keydownMsec pre-keydownMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy ClassMy JOTA TroopMy TroopMy callsign de CALLMy transmit CW WPMN3FJP DX spots centered on mode sweet spotN3FJP Server IP AddressN3FJP Server IP PortNAQP xchgNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameNarrow LPF if image noisyNav Channel 1 attenuatorNav FSK MARK PolarityNav FSK PTT - should always be onNav FSK side toneNavCAT state LEDNavChannel 2 AttenuatorNavLED brightnessNavRF AttenuatorNavWinkey PTTNewNew record / Save recordNextNoNo faster than thisNo records in lotw download fileNo slower than thisNon transmit window after a transmit periodNoneNormalNot a script file/tag not foundNot worked beforeNotchNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.NotesNotification dialog closes after XX seconds;^j0 == dialog remains openNotificationsNumber and position of macro barsNumber of digits in serial numberNumber of hours data is kept for each node. Zero means keeping everything.OKON - Marquee style OFF - Clear & restartON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOdd LinesOdd linesOn/OffOne above Rx/TxOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperate tqsl in batch mode (no dialog)OperatorOperator workedOperators QTHOperators nameOptional configuration in format: param=val ...OtherOutOutput PInsOutput port number when same IP address usedOverOver writing call back funcion for "%s"POWER(r)PSK et al.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PSM AttenuatePSM Histogram ThresholdPTT ONPTT delays valid for all CAT/PTT typesPTT enables auxiliary audio sourcePTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT via and PTT via Hamlib commandPWR-meterPaddlePaddle DogPaddle echoPaddle sampling (see Winkeyer manual) default = 50Palette: Parameter is not valid.ParityParse all incoming textPartialPassed parameter is not of the expected type.PasswordPassword for QRZ / Hamcall / HamQTHPastePaths (hidden)Percent (%)PersistancePick baud rate from listPilot tonePlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPort is second SCU-17 devicePort:PortAudioPosition the 4 bar macro set below Tx panel Default above Rx panelPost-keydown timing (ms)Power scalePrPre-Signal TonePre-keydown timing (ms)Preamble DetectionPrecedencePress only if you change the address/portPress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save logProvinceProvince of station workedPseudo-FSK on right audio channelPulse shapePulse width (msec)PulseAudioQRZQRZ cdromQRZ.comQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL route of contacted stationQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO must not occur within a time period ofQSOp categoryQSOp countyQSOp sernoQSOp xchgQSYQTC:QTHQTH NicknameQTH:QthQuery state of nanoIOQuietQuiet mode [-q], do not open tqsl dialogRE:REGEX detected wavRF attenuatorRSID receptionRST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY Bell audio wavRTTY Scope DisplayRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine pulse shape factorRange +/- wpmRange WPM setting default = 20Range WPM setting default = 25Really delete record for "%s"?ReceiveReceive filter bandwidthReceive synchronizerReception reports...ReconnectRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Refresh time interval written in KML file (Seconds)ReloadReload cty.datRemoveRemove call after ...Replay trackline audioReport ARQ frames average S/NReport actual modem RF frequencyReport rig frequency (enable only if you have rig control!)ResetReset FEC blocks when changing BW or TonesReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestore UART Settings on CloseRestore defaultsRestore the serial (COM) port settingsRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetain tx freq lockRetriesRetrieve for active modem useRetry interval (ms)Return KISS TCP IO connection to a Listening stateReturns IP Address and port number to the default value.RevReverseReverse Left/Right channelsReverse videoRevert to Unsifted char's on a spaceReview / edit the exported LoTW upload adif fileReview lotw.adif file before sending with tqslRig Control/CAT (rigcat)Rig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCAT used for rig controlRight/Left Select Least Signficant DigitRight/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSDRound Up ChkRsID audio alert wavRst receivedRst sentRun programRun program:Rx / Tx PanelsRx AGCRx ParametersRx Width MultiplierRx bkgndRx fontS-meterS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2SS precSS ser #SYNOP to ADIFSYNOP to KMLSample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed macros?Save logbook fileSave macro fileSave paletteSave text asSave this paletteSave...School Round UpSchool Round Up - allowable I, H, O - see rulesScopeScout Op'Script FilesScript Parsing Class Allocation Fail (%s)Script device path not found.Script file contains potential issues See documentation and/or Log file for details.Script file name (path) invalidScript file name (path) null pointerScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Secondary TextSecondsSee https://en.wikipedia.org/wiki/Morse_code for information regarding extended Morse characters.SelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Logging as QSO or ContestSelect Records to ExportSelect TX raster fontSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect modes for menu accessSelect number of tonesSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSelection of transfer direct takes precedence over all other flmsg reception settingsSelf Organizing MappingSend Callsign in CW at end of every transmissionSend QSO data to LoTW when loggedSend a continuous stream of test charactersSend at this WPMSend beacon every ...Send continuouslySend data stream directly to executing flmsgSend imageSend image...Send lotw.adif via tqslSend reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSent scout nameSer inSerial # inSerial # outServer string:Set - mark logical HIGH Read from nanoIOSet >0 if pulsed PTT usedSet Viewer SquelchSet level for good viewingSet the number of characters per rowSet the type of resampler used of offset correctionSets the theshold level to x value above the noise levelShaped TxShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow and enable Power Signal Monitor button (PSM)Show bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSide toneSideband:SidetoneSignal BrowserSignal averaging over time 0 - least 4 - greatestSignal browserSignal range (dB)Signal searchSingle macro bar below logging panel variable heightSingle-click to captureSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow CPU (less than 700MHz)Soft-bit decodingSoft-symbol decodingSome changes made by the script requires program restart before they become active.Sort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSoundcard/Wav file recordingSpace onlySpectrum Scope / Waterfall interactionSpectrum scopeSpeed (WPM):SpotSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStart of transmit PTT delayStarting numberStateState must matchStation heard twiceStations grid squareStop bitsStopbitsStore mode and frequency Right click for listSubmit each QSO as loggedSubmit password with each uploadSubmit the upload adif file to LoTWSubscript execution fail (internal).Sunspot creation underway!Suppressed carrier +/- AF injection frequencySwapSwap left/right keyer contactsSwitch to ARQ I/OSys ColorsSystemT/RTCP/IPTCP/IP Data StreamTHOR Raw ImageTX Buffer Flush Timer (Mins, 0=Disable)TX PowerTX deadmen timeout (mins)TX generateTX offsetTX ppmTX sound card correctionTab ColorTabular data sourcesTailTalkerTalker Socket (MS only)Ten Ten number receivedTest charTest character for QSK adjustmentTest...Text CaptureText HighlightingText Tags (tags use {} delimiters)Text file to insertText to send during keyboard idle timesText...The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settings:These tags can also be used in This event's regular expression is invalid.TimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time out xmt attempt in XX secondsTime span overTimingTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)Tone KeyerTonesTracked CW speed in WPMTrackingTransceiver control, flrig/rigcat/hamlibTransfer direct to executing flmsgTransfer speed, X1-normalTransmitTransmit PowerTransmit callsignTransmit fontTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit upper start toneTransmit video textTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):Troop-RTroop-STuneTune margin (tone frequency spacing)Tx ParametersTx above RxTx bkgndTx fontTx power used for logbook entriesTxIDUDP/IPUIUI languageUI schemeUI/Browser/ChannelsUI/TouchUNDIRECTEDUS state of station workedUSB serial I/OUSOSUnable to create file %s (Error No=%d) func %s:%dUnable to open file %sUncheck if KML is never usedUndefined errorUndirected received textUndoUnexpected end of file reached.Unexpected end of parameter (args[]) list foundUnexpected end of parameter check list foundUnmatched LoTW RecordsUpdateUpdate selected local data files with repository contentUpdate the current recordUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse PotUse Pulse Audio serverUse RTSUse RigCATUse T/N for 0/9Use WPM pot'Use averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse for triggering amplifier carrier detectUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse soft-decision decoding for symbol detection Assists soft-bit decodingUse these for WinKeyer and nanoCWUse this tqsl station locationUse uHRouter PTTUse wave shaping on Tx signalUsed For PSKMail and FLDIGI Suite of ProgramsUsed for BPQ32Used to adjust the aggressiveness of TXUser nameUsing UDP port #VSP EnableValid Signal Sample Period (msecs)Valid signal sample period in MillisecondsVerboseVerifyVerify database with LoTW download fileVerify database with eQSL download fileVideo ID modesVideo Preamble IDViewView UnmatchedView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteWARNING - this will over write ALL settingsWF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWPM pot update to nanoIO requiredWPM speed for Winkeyer Command strings default = 18WaitWait for response to first CAT commandWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWebWeb Browser lookupWeb/WXWheel actionWhen no signal presentWhere generated KML documents are stored.WideWill occur after this time in secondsWinKey PTTWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)Write state of nanoIO to Arduino EEPROMXMITXMT lockXON/XOFF flow controlXY - classic scopeYYesYou are running the latest versionYou must have tqsl installed and it's location recorded for LoTW updates to work!You need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordaaafteralways append to file(s)append # directive msgs to named fileautomatic data uploadclear old datacmd_buffer allocation error near line %dcurrent wx conditionsdefault text to send with etcdefault uses date/time ondisplay PSM button on main dialogdisplay Rx control chars as ascii stringeQSL userenable mouse wheel control of macro barflamp:fllog:flmsg *flmsg timed out wavflmsg.exe *.exeflmsg:flnet:flrig is the preferred method of tranceiver controlflrig xmlrpc server parameters these controls are mirrored on the IO configuration tabflrig:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form 1 must matchfree form exchangefreq scale = N * modem bandwidthh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourleft click on WF recenters spectrum scopeleft click transfers frequency to scope center frequencylock WF at 1500 HzmbarsminutesnanoIO - TTY baudpilot power (dB)print ^! execution codes in Rx panelrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreportsscale spectrum display linked to modem bandwidthsecondssecs' =>select browser fontsend compensation to nanoIOsend when logged (log button, , )text WPM <= char WPMtqsl station locationtqsl:use waterfall range/limit valueswaterfall-only modewww urlxmt start/stop tonesProject-Id-Version: fldigi 3.22.01 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2011-12-03 13:04+0100 Last-Translator: Emanuele Repetto Language-Team: Italian Language: it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); {MODE} modo completo / sottomodello 4 07 7 5 21 29 6 22 31 A ring A umlaut C cedilla E acute E grave N tilde O acute O slash O umlaut U circ U umlaut in " "" RR"Disabilita il modem delle chiavi PTT se più istanze di fldigi (client) sono collegati a un singolo flrig (server).# Creato: %s Numero di record nel lognumero di tentativi prima di rinunciarenumero di volte che il comando è ripetuto prima di rinunciare$ SX%s # Script di configurazione generato da Fldigi %s log iniziato il %sInform&azioni&Configura&File&Aiuto&Logbook&OKAspetto&Vedi' WG( KN) KK**.exe*.txt+ AR- DU-.--.-.--.--...--....-.----..--.-..-.-..-..-.... Questi controlli si strovano su altre schede. sono replicati qui per comodità. Puoi cambiare lo stato da entrambe le posizioni. ......-.-...-..-00 = T; 9 = N11 - Lento, 2 - Medium, 3 - Veloce1.5 baud10-101010 Nr12 26 3213 23 3314070.15016 27 3617 00 1118 01 1219 24 351st Ext2 baud20 28 3821 29 4022 03 1523 04 1624 05 1825 06 2225 W26 25 3727 02 133 baudSet di 4 barre macro sotto al pannello Tx4.5 baudLimite a 500 Hz6 baud8 pskCaratteri estesi a 8 bit:< AR<#comments> ignora commenti AFC on,off,scambia alert utilizzando un file wav esterno la mia antenna Xmt audio wav file invia avatar nominativo del corrispondente cancella i campi del log cancella la finestra di ricezione contatore per contest ignora testo commento modem timing test, spec' file modem timing test, 'n' gruppi di 5 caratteri casuali modem timing test, string 's' modem prova caratteri/secondo su nn caratteri identificatore CW decrementa il contatore modo digitale (adif) [Wait][Len](ms) log eQSL con messaggio opzionale log eQSL inserisci un file di testo imposta ampiezza filtro invia comando cat via FLRig rig freq has kbd focus la mia frequenza dal testo al NOME/QTH vai alla freq NNNN Hz ritorna allo spot segnale idle per NN.nn sec LDT default '%Y-%m-%d %H:%M%z' incrementa il contatore S/N ecc. IMD ecc. ZDT default '%Y-%m-%d %H:%MZ' ultimo seriale trasmesso salva i dati del QSO, aggiungi il messaggio alle note metti a log quando questa macro viene trasmessa locatore del corrispondente LOCK on,off,scambia salva i dati del QSO, aggiungi il messaggio alle note salva i dati del QSO cambia file macro mappa con parametri mappa su Google modo il mio nominativo la mia contea il mio locatore il mio nome il mio RST la mia sezione FD nome del corrispondente Trasmetti |NN| di raffiche RsID successive prossimo record QSO # pop current mode/freq from stack CW QSK post-timing CW QSK pre-timing push current mode to stack insert QRG into Rx text # QSO records ora del QSO (HHMM) incrementa/decrementa la frequenza rtx qsy a kHz, Hz clicca a destra per QSY clicca a sinistra per QSY QTH del corrispondente ripeti la macro continuamente invia comando cat via RigCAT imposta modo radio CW rise time RST del corrispondente ricevi Rx RSID on,off,scambia salva rapporto contest programma l'esecuzione per cerca un segnale a scendere cerca un segnale a salire Digitalk On, Off, Commuta testo all'inizio della trasmissione ripeti ogni NN sec segnale di accordo per NN sec commuta T/R trasmetti imposta attenuatore in TX Tx RSID on,off,scambia termina l'esecuzione alle Versione Fldigi WAV file; 'n' gruppi di 5 caratteri casuali WAV file; string 's' WAV file; stringa interna acquisisci dati meteo per la stazione acquisisci dati meteo inizio rapporto fine rapporto rapporto trasmesso UTC datetime, default '%x %H:%MZ'= 1 (on)= BT> SK@@ ACA aeligADIFAFCComportamento AFCArea AFC (Hz)Range AFC o banda passanteVelocità AFCVelocità di tracciamento AFCALTRARQARRL Sez.AX25 DecodificaAbbandonaAccesso URLS/N (dB) per l'acquisizioneRaggio di ricerca per l'acquisizione (Hz)AzioneAttivato per Mortty K3NG sketchAggiungiAggiungi CRLF quando raggiungi la larghezza della paginaAggiungi l'indirizzo nel campo noteAggiungi data/oraAggiungi etichetta data/ora ogni # messagi ricevutiAggiungi nome geopolitico della stazione METARIndirizzoIndirizzoRegolaAggiusta la frequenza del cursoreRegola la sensibilità di 1 / N valori frazionariAggiusta la larghezza di banda DSPConfigurazione avanzata:EtàAlert volumeTuttoTutte le impostazioni mostrate qui possono essere modificate in seguito tramite il menu ConfiguraConsenti TX dopo il rilevamento del segnale (sec)Permetti erroriAbilita/Disabilita ModificheAlterna colori carattere nel pannello RxSempre LSBSempre USBMostra sempre le frequenze audioAvvia sempre i nuovi modem su queste frequenzeTrasmetti sempre a 1550Hz centro frequenzaAmpiezza del segnale QSK del canale destroAntenna:Aspetto dell'etichetta di ciascun canaleAggiungi al testo ricevuto:Aggiungi al testo trasmesso:ApplicaControllo dei tasti freccia per l'immissione della frequenzaAttackCAMPANA UdibileAudioInformazioni sulla scheda audioLe informazioni sul device audio sono disponibili solo per il backend PortAudioFile audioFrequenza audioDispositivo audio d'ingressoAudio su porta ausiliariaFrequenze audio o RF sulla scala del waterfallDispositivo audio d'uscitaIl buffer audio viene decodificato per il segnale selezionatoAuto Connessione / RiprovaSpazio automaticoConnetti automaticamente all'avvio di fldigi (il server deve essere attivo)Country e Azimuth automaticiAutoCRLFControllo Automatico di FrequenzaInseguimento automatico velocita' in ricezioneInvia automaticamente lo spot per i nominativi nel testo decodificatoAvvia automaticamente la connessione socket reporter pskSottostringhe disponibiliBCM GPIO pin ValueSfondoColore di sfondo per i tasti funzione del gruppo 1Colore di sfondo per i tasti funzione del gruppo 2Colore di sfondo per i tasti funzione del gruppo 3Colore di sfondo del controllo squelch del navigatore segnaliModem idBandaLe bande devono coincidereLarghezza di bandaBaud rateBaud rate:Guida per principiantiComportamento degli indicatori s/n e imdColore SfondoBit per carattereErrore allocazione buffer vicino file: %s Riga %dAnnoiami con la richiesta di salvare il logInformazioni buildOccupatoPulsante&CountryNOMINATIVO corrispondente sempre in minuscoloUsa CAT per controllare il PTTL'utilizzo della CPU aumenta con l'altezza del waterfallCQ StatoZona CQCQZCR-CR-LFCSV...Spazio CTCTRLCWModi ID CWCW KeylineID CW a fine trasmissioneCW SSCW SS Prec'CW SS SerNo RCW Sweepstakes ContestLarghezza del filtro dsp CWCW è LSBCW sweepstakes precedenzaCW sweepstakes rcvd ser. no.CW sweepstakes sezioneVelocitá di trasmissione CW (WPM)CW wpm keyboard stringsCW wpm usando il keyerRilevazione e soppressione CWISoglia CWIImpostazione CabrilloCabrillo...CallCerca NominativoRichiamare il comando di script %s ha segnalato un erroreNominativo lavoratoCallook onlineSito web Callook.infoNominativoPuó essere usato al posto o insieme ad altri tipi di PTTAnnullaCatturaCattura Rapporto SpotCattura SpotPeriferiche di cattura e riproduzionePeriferica di catturaCattura il testo ricevuto su file esternoCattura i segnali oltre questa sogliaCattura i segnali all'interno di questo raggio di frequenzaCattura/Riproduci supportano le operazioni in full duplexCattura:Portante Sense Accesso MultiploFrequenza portante (Hz)Scostamento della portanteCelsiusCentra la frequenza dello spotCentra la visualizzazione sul segnaleCentra nella banda passante Tasto destro per tornare indietroCentrato a 1500 Hz (SHARES)Cambia il numero di canali nel visualizzatore psk.Cambiare SOLO per sperimentareCambia l'aspetto del programmaCambia coloreCambia l'ordinamento da alto a basso dei canaliModifica al file macroCambia la scala del waterfallLe modifiche avranno effetto al prossimo avvio del programmaEtichetta del canaleNumero del canaleCanali, il primo canale parte al limite inferiore del waterfallIl conteggio dei caratteri nel parametro args [] supera le aspettativeCarattere cercato non trovatoCaratteri/Riga:Seleziona tuttoControlla duplicatiVerifica aggiornamenti all'avvio del programmaVerifica aggiornamenti...Controlla se la raido usa la USB per RTTYScegli questo per essere notificato quando un RSID viene ricevuto senza cambiare modem o frequenzaSpunta per abilitare la connessione TCP/IP IOSpunta per abilitare UDP/IP IOSeleziona per abilitare la codifica/decodifica dei caratteri Seleziona un carattere da ogni gruppoControllo aggiornamenti in corso...Scegli cartela per salvare i documenti KMLCittá della stazione lavorataClasseRipulisci i dati KML adesso !Ripulisci i documenti KML, svuota il display di Google Earth.CancellaCancella tuttoCancella testo UDPCancella il testo del canale dopo # secondi di inattivitàCancella la lista?Cancella i campi del log dopo aver salvato o usato la macro Cancella i campi del log?Cancella i campi quando salviChiudiChiudi la listaRitrai elencoColoreColore testo telnet in uscitaColore della traccia MarkColori e cursoriColori-Caratteri/Display Frequenza-StrumentiColori-Caratteri/Tasti funzioneColori-Caratteri/Controlli logColori-Caratteri/Livello SegnaleComando %s ignorato, notazione punto non supportataComando %s ignorato, comando strutturato non supportatoOpzioni da riga di comandoComado mancante ':'.Comando avviato quando vengono generati file KML. I sottoprocessi vengono avviati una voltae riavviato se necessario.I comandi sono visualizzatiCompCompensazione in msec default = 0Compensazione in microsecondiConfigurazione InterfacciaConfermaConfermare il RESETConnettiConnettersi al programma host all'avvio di FLDIGIConnetti al serverConnetti/disconnetti il socket del server TalkerConnessoContestRapporto contest ricevutoRapporto contest inviatoNumero seriale del contest ricevutoContest:Contest/JOTA SchoolContinenteScorrimento continuoCaratteri di controllo nel pannello Rx/TxConverti il campo nominativo in maiuscoloConversioneCopiaCorrezioneImpossibile trovare file di report di LoTW Scarica dalla pagina LoTW di ARRL dopo aver effettuato l'accesso a: https://lotw.arrl.org/lotwuser/default Memorizzare il file di report nella cartella LOTW di fldigi, assegna al file il nome 'lotwreport.adi'Non posso aprire l'url: %s Non ho potuto lanciare un browser web: %s Apri questo URL manualmente: %sImpossibile avviare flmsgCountryCountry della stazione lavoratoCrea log in formato cabrilloCrea macchie solariScostamento personalizzatoRicerca testo personalizzatoAltro...TagliaTaglia 0/9DIRETTODPDTR +12DTR +12 vDTR = +VDTR controlla il PTTDTR controlla il PTTDX CLusterDX ClusterDXCCDesignatore DXCCEntità DXCCEntità DXCCRapporto linea/puntoLinea/PuntoData base lookupRepository dei file datiTempo di conservazione dei dati, in ore (0 per nessun limite)Unione dei database in corsoDataData di fine QSOData di inizio QSOData di inizio == fineDebugDecayDecodifica gli AX25 Packets in un formato leggibile dall'uomoDecodifica toni DTMFDecodifica toni DTMF ricevutiDecodifica messagi SYNOP (Es: Servizio meteorologico tedesco) in formato ADIFDecodifica messaggi SYNOP (Es: Servizio meteorologico tedesco) in formato KML (Es: Google Earth)PredefinitoFrequenza traccia CW di defaultFrequenza preferita per la decodifica RTTYVelocitá predefinita (WPM)Frequenza preferita per tutti gli altri modemFrequenza predefinita di ascolto / trasmissioneDefault test string is: "Imposta l'oscilloscopio a croce come predefinitoPredefinitiRitarda NN msec dopo aver eseguito il cambio di modalitàRitardare NN msec prima di rilasciare PTTRitarda NN msec prima di avviare l'audioCancellaElimina i file di dati locali se selezionato.Cancella il record correnteDeselezionaRileva preambolo THOR Cancella la conduttura RxRileva la presenza di [WRAP:beg] e [WRAP:end]. Salve le etichette e tutto il testo da esse racchiuso in un file marcato con data e ora, per es.: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapRileva la presenza di [WRAP:beg] e [WRAP:end]. Salve le etichette e tutto il testo da esse racchiuso in un file marcato con data e ora, per es.: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapLivello del segnale ricevutoRilevatore soglia altaRilevatore soglia bassaI dispositivi supportano il full duplexPeriferica:DiddleDiddle On/OFFDifferenza tra la frequenza Rx e Tx (scostamento della radio)Colore delle cifreCifreScurisciDiretta testo ricevutoPercorso della cartella non trovatoCartella...Disabilita tuttoDisabilita ulteriori decodifiche quando viene ricevuto un RSIDDisabilita se flrig non è utiizzatoDisplay RX as a scrolling marqueeMostra il testo ricevuto a colori invertitiMostra quanto decodificato come chiave assegnataVisualizza il prosign decodificato nel testo RX usando il tasto di scelta rapidaMostra tempo di consegna se il messaggio è abilitatoMostra lo Slot Time in MillisecondiMostra il Ritardo Trasmissione in MillisecondiNon cambiare automaticamente alla frequenza RX RsIDNon mostrare la finestra di dialogo dell'alert RsIDNon usare un database di nominativiOscilloscopio ancoratoNon salvareTrascinare sulla scala del waterfall cambia la frequenzaIl driver richiede che i bit di stop siano ZERO!Colore duplicatiControllo duplicati, NOMINATIVO +DuplicatiEchoEcho paddle chars to Rx PanelForma d'onda al bordoTempo di salitaSvuota i documenti KML all'avvio del programma.AbilitaAbilita / disabilita le icone dei menuAbilita / disabilita suggerimentiAbilita ARQ per i programmi che supportano il protocollo TCP e FLDIGI ARQ. Abilita KISS per i programmi che supportano il protocollo KISS TCP / UDP e TNC-2. Solo una interfaccia (ARQ / KISS) può essere attiva in un dato momento. Le modifiche KISS / ARQ / XML Addr / Port richiedono il riavvio del programma.Abilita il DSP prima del decodificatoreAbilita GPIO PTT (Controlli specifici Pi)Abilita il monitoraggio del segnale di soglia dell'istogrammaAbilita FEC compatibile con MultiPSKAbilita Winkeyer PTT outputAbilita Winkeyer audio toneAbilita Winkeyer tone keyingAbilita tuttoAbilita le selezioni per mostrare i rispettivi controlli di operatoreAbilita il trascinamento del cursore sulla scala del waterfallAbilita codifica / decodifica del tono pilota vestigialeAbilita flrig a controllare la radio con fldigi come clientAbilita per catturare con click singolo dal testo nel riquadro RxAbilitare per segnali molto deboliAbilita se il tuo computer non decodifica correttamenteAbilita il flusso del testo ricevutoAbilitare questa voce al primo avvio di fldigiAbilitare per i caratteri accentati Latin-1Abilita per inviare tono di start/stopAbilitare per inibire TX su Rilevazioni segnaleAbilita per posizionare il pannello Tx sopra il pannello RxAbilita quando due programmi stanno utilizzando lo stesso indirizzo IPAbilitatoAbilitato - metti a log utilizzando la frequenza del Mark Disabled - metti a log utilizzando il centro frequenzaAbilitato - usa filtri Mark/Space in uscita Disabilitato - usa pseudo segnaliFine della linea raggiuntoFine dell' ID di trasmissioneInserire dati METAR da internet URLInserisci il percorso completo a flmsgImposta la frase di prova o lascia in bianco per il predefinito:Inserisci l'arco temporale in minutiErroriEventoLog eventiRapporto ricevutoRapporto datoFile eseguibile da inserireEseguiEsegui comando su file KMLEsciEsci dal promptConfigurazione per l'exportEsporta i record del log per l'pload a LoTWEsporta i record per l'upload a LoTWEsporta in formato ADIFEsporta in formato CSVEsporta in formato di testo a campi fissiEsporta...Estendi l'ultimo dit/dot in msec default = 0Durata extra al primo dit/dot in msec default = 0Estrai i file per l'uso con il programma esterno "wrap / flmsg"Classe FDFECMedia FFTFunzione di prefiltro a finestra FFTFSK PTTFahrenheitFarnsworth keying (0 = nessuno) default = 0FarsnworthCartella di destinazione delle immagini faxSentiti libero di abbandonare la procedura guidata in qualsiasi momentoNominatio Field Day Può coincidere con il nominativo OPClasse Field DaySolo I/O su fileFile non trovatoErrore di lettura del fileRiempi i campi Country / Azimuth con le informazioni dal file cty.datFiltroFiltro FFt in uscitaLarghezza del filtroFattore di larghezza di banda del filtroLarghezza di banda del filtro relativa alla larghezza del segnaleFiltraggioTrova il paese:Trova successivoTrova il prefisso:Trova precedenteTrova: FineIntervalli fissiConfigurazione di Fldigi...Configurazione di FldigiPalette Fldigi *.palFile di definizione rig xml *.xmlSito web Fldigi...Oscilloscopio liberoFlrig PTTSvuota il buffer TX dopo il periodo x quando il canale occupato rimane attivo (TX inibito)CartelleCaratteriColori dei caratteriCaratteri...Caratteri:Forza una velocitá di campionamento specifica. Scegli "Nativo" se "Auto" non funziona correttamente con la tua scheda audio.Forza il campo nominativo in MAIUSCOLOForza la spaziatura dei canali a incrementi regolari di 100 HzForza data e ora di inizio e fine QSO ugualiServizio gratuito per gentile concessione di OKFreqFreq.FrequenzaFrequenza in MHzScala di frequenzaTuttoFrequenza fondamentale del segnale ad onda quadra QSKGeneraleGenera un segnale a onda quadra sul canale audio destroGruppo 1Gruppo 2Gruppo 3HamCall onlineHamQTHHamQTH onlineHamQTH.comHamcall.netHamlib è usata per controllare la radioHangHanning/Blackman - usa la sincronizzazione al bordo BPF - usa larghezza di banda BPFInvecchiamneto sentitoHeard logHiLite 1HiLite 2NascondiNascondi la finestra dopo (s):AltoLimite superiore di frequenza in HzHost:I/OIDsIDs/CWIDs/RsIDIDs/VideoIOTAIndirizzo IP Numero PortaIndirizzo IP per interfaccia ARQ Indirizzo IP formato: nnn.nnn.nnn.nnn o nome: i.e. localhostIndirizzo IP per interfaccia KISS Indirizzo IP formato: nnn.nnn.nnn.nnn o nome: i.e. localhostIndirizzo IP per interfaccia ARQ Indirizzo IP formato: nnn.nnn.nnn.nnn o nome: i.e. localhostIndirizzo IP per interfaccia flrig Indirizzo IP formato: nnn.nnn.nnn.nnn o nome: i.e. localhostIndirizzo IP per interfaccia flrig Indirizzo IP formato: nnn.nnn.nnn.nnn o nome: i.e. localhostZona ITUITUZIgnora duplicatiImmagine LPFInTempo di inattivitàPollici HgIncludi la frequenza di trasmissioneIncrInformazioniInibire l'avviso di modifica del modem a 7 bit sulla ricezione dell'utente o RSIDinibisci i modem a 7bitStato iniziale di DTRStato iniziale di RTSTensione iniziale su DTRTensione iniziale su RTSInizializzaInizializza l'interfaccia RigCATInizializza l'interfaccia hamlibInizializza l'interfaccia PTT hardwareInizializza i campi di log del QSOInizializza la connessione al serverScostamento della portante in ingressoInserire NN byte LTRS all'inizio di ogni trasmissioneInserisci un marker nel testo ricevuto prima di cambiare frequenza e modemInserisci testo predefinitoInserisci file...Metti gli zeri davanti al numero seriale trasmessoInserisci markerInserisci testo speciale nel pannello Rx quando fai click sul waterfallInserisci testoInserisci testo con un singolo click sinistroPeriodo d'integrazione (FEC blocks)Interlaccia SYNOP e testoInterlaccia il testo con messaggi SYNOP decodificati o sostituzione.Puntatore nome file (NULL) non valido nella funzione %s:%dModem per KISS IO non validoParametro funzione non valido 'char *percorso_nome_file' (null)PArametri di funzione non validi (errore interno non-script)Paramentri non validiIslands on the airProblemi riscontrati durante l'elaborazione del file scritp: %sJOTAJOTA scoutJOTA troopJamboree OTAJamboree On The AirConfigurazione A1A per K3K3NG Arduino sketch emulationKISSStile di visualizzazione del fumetto KMLFumetto KML in testo normale o HTML, in tabelle o matrici semplici.Cartella file KMLKML root fileServer KML abilitato (On / Off)TastoKeyerModo KeyerKeying ratio default = 3.0Keying peso default = 50Età dei bambiniLuminosità LEDLocUltimo QSOLatenzaLeadinLeadin in msec default = 0Tempo in ms di salita/discesa dell'impulsoLascia in bianco o vedi http://www.pulseaudio.org/wiki/ServerStringsI canali sinistro e destro contengono entrambi audio modemTasto sinistro per cancellare il testo Tasto destro per resettare le frequenzeTasto sinistro per cambiare il colore dei duplicatiTasto sinistro: cambia modo Tasto destro: configuraClick destro o sinistro riascolta la memoria audioLicenza GPLv3+: GNU GPL versione 3 o successiva Questo e` un programma libero: siete liberi di modificarlo e ridistribuirlo. Questo programma non e` coperto da alcuna garanzia, salvo gli obblighi di legge. Limita i movimenti AFC a questa areaLimita a pochi caratteri, come CQEM o IOTA ecc.Linea: %d Errore:%d %s (%s)Ascolta / VincolaCerca segnali all'interno di questa areaLockLoTWLoTW RivediFile scaricati da LoTWCaricaCarica una nuova paletteCarica file immagineCarica o trascina un file immagine Formati supportati: PNG, JPEG, BMPCarica...LocLocalizza il file cty.datTrova flmsgTrova l'eseguibile di flmsgLocatoreBloccaBlocca la frequenza di trasmissioneLog messaggi Navtex in un file ADIFLog messaggi Navtex in formato KMLLog messaggi Wefax in formato AdifSalva tutto il testo RX/TXAccedere a pskrep all'avvio di fldigiLogLogging/MacLoggerLogging/N3FJP logsLogin per QRZ / Hamcall / HamQTHLogs messaggi in formato Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)Integrazione di ricezione lungaCerca nominativoUtente LoTWBasso = zero errori Medio = 1 errore Alto = 2 erroriLimite inferiore di frequenza in HzTono basso a 550 HzLimite inferioreFrequenza piú bassa in basso nel navigatorePolarità MARKCodice ID stazione METARPosizione stazione METARIl mio nominativo sempre in minuscoloIL MIO NOMINATIVO rilevato wavEditor delle macro - MacroLocatore Maidenhead come in EM64qvAttributi del mail serverMarkMark onlyMark-SpaceConfrontaConfronta il log con il file scaricato da LoTWNumero massimo di sottoscrizioni aperte raggiunto.Può richiedere il ridimensionamento del pannello Rx/TxMEdioErrore di allocazione della memoria (errore interno non-script)Unisci file ADIFUnisci...Miglia / OraSuggerimenti minimaliControlli minimaliImpstazione minima WPM default = 10Distanza minima per la divisione dei nodi alias (metri)Distanza minima per alias di divisione (metri)Tempo minimo tra eventiMiscAutostartComando mancante %s dopo la riga %dVirgolette mancanti (")ModoModo in usoIl modo deve coincidereLimite secondo la larghezza del modoModemPortante del modoDTR-RTS keyingCaratteri estesiWinKeyernanoIODominoEXFeld HellNavtexOliviaNavigatoreRxSynopTxWinkeyer 3nanoIOMonitor per le connssioni TCP.Monitora i segnali nella larghezza di banda del modem più i margini.Monitora il segnale trasmessoRotella del mouse attiva sui pulsanti macroMovAvg:msec dopo l'impulsomsec prima dell'impulsoTempo in ms tra comandi successiviElaborazione di segnale multicanaleDecodificatore MulticanaleLa Mia ClasseIl Mio Gruppo JOTAIl Mio GruppoIl mio nominativo de nominativo corrispondenteLa mia velocitá di trasmissione in WPMN3FJP DX Spot centrati in modalità swwet spotIndirizzo Server IP N3FJPPorta Server IP N3FJPNAQP xchgInterfaccia per file di dati NBEMSFile NBEMS...NESSUN DISPOSITIVO AUDIO DISPONIBILE (o test)NOMINATIVO NON IMPOSTATONomeLPF stretto sel l'immagine è disturbataNav Canale 1 AttenuatoreNav FSK MARK PolarityNav FSK PTT - dovrebbe essere sempre accesoNav FSK side toneNavCAT stato LEDNav Canale 2 AttenuatoreNavLuminosità LEDNAv Attenuatore RFNavWinKey PTTNuovoNuovo record / Salva recordProssimoNoNon piú veloce di questoNessun record nel file scaricato da LoTWNon piú piano di questoFinestra di non trasmissione dopo un periodo di trasmissioneNessunoNormaleNon è stato trovato un file/tag di scriptNon lavorato in precedenzaNotchNota: Questi elementi di configurazione sono utili ma non univoci per l'uso di fldigi su un dispositivo touch screen come un tablet.NoteLa finestra di dialogo di notifica si chiude dopo XX secondi; la finestra di dialogo ^j0 == rimane apertaNotificheNumero e posizione delle barre delle macroNumero di cifre nel numero progressivoNumero di ore di conservazione dei dati per ciascun nodo. Zero significa mantenere tutto.OKON - Scorrimento continuo OFF - Cancella e ripartiON - caratteri piccoli OFF - caratteri grandiON - avvia alla frequenza predefinita OFF - mantieni la posizione attuale del cursore sul waterfallON - usa l'ultimo file delle macro OFF - usa il file predefinitoOSSLinee DispariLinee dispariOn/OffUna sopra Rx/TxDocumentazione on-line...&Modo OpApri...Apri la listaApri il file con il browser di sistemaApri col browserApri file di logApri file macroApri file dei messaggiApri il messaggio con flmsgApri paletteApri file rig xmlApri con flmsgApri...Apri la cartella dei file NBEMS dopo una cattura riuscitaUtilizza tqsl in batch mode (nessuna finestra di dialogo)OperatoreOperatore lavoratoQTH operatoriNomi operatoriConfigurazione opzionale in formato: param=val ...AltroOutPin di outputNumero della porta in uscita quando usato lo stesso indirizzo IPSopraSovrascrivere la funzione di callback per "%s"Potenza (r)PSK et al.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PSM AttenuatoSoglia PSM dell'istogrammaPTT ONRitardi PTT validi per tutti i tipi CAT / PTTPTT abilitato su porta audio ausiliariaFine PTT del ritardo di trasmissionePTT è un comando CAT (non hardware)PTT genera un tono sul canale audio destro PTT via e PTT via comando HamlibPWR-meterPaddlePaddle DogPaddle echoCampionamento paddle (vedi il manuale di Winkeyer) default = 50Palette: Parametro non validoParitàAnalizza tutto il testo ricevutoParzialeIl parametro passato non è del tipo previsto.PasswordPassword per QRZ / Hamcall / HamQTHIncollaPaths (hidden)Percentuale (%)PersistenzaSeleziona una velocitá della porta dalla listaTono pilotaRiproduci il buffer audio quando viene selezionato il canale attivoRiproduzioneRiproduzione continua in loopPeriferica di riproduzioneRiproduzione:Imposta prima il tuo nominativo.Tenendo il mouse per piú di due secondi su un nominativo appare popup con informazioniLa porta è il secondo dispositivo SCU-17Porta:PortAudioPosizionare il set di macro a 4 barre sotto il pannello Tx Default sopra al pannello RxTempo dopo l'impulso (ms)Scala della potenzaPrTono prima del segnaleTempo prima dell'impulso (ms)Rilevamento preamboloPrecedenzaPremi solo se cambi l'indirizzo/portaPremi invio per continuare la ricercaStampa CW / RTTY / THROB / CONTESTIA in minuscoloProg 1:Prog 2:Prog 3:Chiedi di salvare il logProvinciaProvincia della stazione lavorataPseudo-FSK sul canale audio destroForma dell'impulsoDurata dell'impulso (msec)PulseAudioQRZQRZ cdromQRZ.comQSKQSK sul canale audio destroQSL ricevuta ilQSL ricevuta ilPercorso QSL della stazione contattataQSL inviata ilQSL inviata ilQSL-VIAQSL-ricQSL-invData QSOData fine QSOData inizio QSOIl QSO non si deve ripetere in un arco di tempo diQSOp categoriaQSOp conteaQSOp serialeQSOp xchgQSYQTC:QTHQTH NicknameQTH:QTHInterrogazione stato del nanoIOSilenziosoModalità silenziosa [-q], non apre la finestra di dialogo di tqslRE:REGEX rilevato wavAttenuatore RFRicezione RSIDRST ric.RST inv.RST(r)RTS +12RTS +12 vRTS = +VRTS controlla il PTTRTS controlla il PTTControllo di flusso RTS/CTSRTTYRTTY Campana audio wavRTTY Scope DisplayCattura RXRX ppmCorrezione della scheda audio in ricezioneL'inserimento dei dati del QSO dal testo ricevuto è delimitato dai caratteri definiti qui. Tab e a capo sono sempre inclusi.Frequenza radioFattore di forma dell'impulso di tipo raised cosineL'inseguimento avviene tra il valore corrente +/- il valore impostato in questo campoImpostazione intervallo WPM default = 20Impostazione intervallo WPM default = 25Vuoi veramente cancellare il record per "%s"?RiceviLarghezza di banda del filtro di ricezioneSincronizzatore di ricezioneRapporti d'ascolto...RiconnettiRec.RettangolareReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Aggiorna intervallo di tempo scritto nel file KML (s)RicaricaRicarica cty.datRimuoviRimuovi nominativi dopo ...Rianalizza i dati audio degli ultimi 2 minutiRiporta il S/N medio dei frame ARQRiporta l'attuale frequenza RF del modemComunica la frequenza della radio (abilita solo se hai il controllo automatico)AzzeraResetta blocchi FEC quando cambi BW o ToniResetta tutte le opzioni ai loro valori predefiniti? Il reset delle opzioni avrà effetto al prossimo riavvio I file fldigi_def.xml e fldigi.prefs saranno cancellati! Reimposta alla portanteRipristina le impostazioni UART alla chiusuraRipristina predefinitiRipristina le impostazioni della porta seriale (COM)Mantieni la frequenza di TX bloccata (Lk) quando cambi dalla frequenza RX RsID Mantinei la frequenza di tx bloccataTentativiRecupera per l'uso del modem attivoIntervallo tra tentativi (ms)Rilascia la connessione KISS TCP IO in stato di ascoltoReimposta indirizzo e porta ai valori predefiniti.InvertiInvertiInverti i canali Sinistro/DestroInverti il videoRitorna a caratteri normali (unshifted) dopo uno spazioRivedi / modifica il file adif per il caricamento a LoTWRivedi il file lotw.adif prima di inviarlo con tqslControllo Radio/CAT (rigcat)File con la descrizione della radioModo RadioLa radio o l'interfaccia fa l'eco dei dati serialiLa radio richiede controllo di flusso RTS/CTSLa radio richiede controllo di flusso Xon/XoffLa radio usa handshake RTS/CTSRadio:Usa RigCAT per controllare la radioSinistra/Destra Seleziona la cifra meno significativaDestra/Sinistra = 1 x LSD Up/Dn= 10 x LSD Shift - Destra/Sinistra = 100 x LSD Shift - Up/Dn = 1000 x LSDRound Up ChkRsID audio alert wavRST ricevutoRST inviatoLancia il programmaEsegui programma:Pannello Rx / TxRx AGCParametri RxMoltiplicatore ampiezza RxSfondo RxCarattere RxS-meterComportamento S/N e IMDSELSaltaSOM decodingSQL-1SQL-2SS precSS ser #SYNOP to ADIFSYNOP to KMLVelocitá di campionamentoSalvaSalva...Salva ConfigurazioneSalva tutto il testo ricevuto, un carattere alla volta, su questo file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Salva come...Salvare le modifiche al log?Salvare le macro modificate?Salva file di logSalva file macroSalva paletteSalva testo comeSalva questa paletteSalva...School Round UpSchool Round Up - ammissibile I, H, O - vedi le regoleScopeScout OpFiles ScriptAllocazione Classe di Analisi Script Fallita (%s)Percorso dispositivo script non trovatoIKl file di script contiene potenziali problemi Consultare la documentazione o il file di registro per i dettagli.Nome file script (percorso) non validoNome file script (percorso) destinazione errataScorrimentoScorri suggerimentiCerca questo nominativoCerca sul webArea di ricerca (Hz)Testo secondarioSecondiVisita https://en.wikipedia.org/wiki/Morse_code per informazioni riguardantii caratteri Morse estesi.SelezionaSeleziona il numero di bit per carattereSeleziona il numero di bit d'arrestoSeleziona tuttoScegli il Contest e i campi CabrilloSeleziona i campi da esportareSeleziona log come QSO o come ContestSeleziona i record da esportareSeleziona il carattere a scansione per la trasmissioneSeleziona la larghezza di bandaSeleziona la velocitá in baud della portanteSeleziona lo scostamento della portanteSeleziona il dispositivoScegli il comportamento della rotella del mouse all'interno del waterfallSeleziona i modi accessibili dal menúSeleziona il numero di toniSeleziona la paritàSeleziona il file con la descrizione della radioSeleziona il tipo di prefiltro FFTAttiva la selezione per Elecraft K3 Altre radio non dovrebbero averne bisogno.Scegli il carattere della scala del waterfallColore sfondo del pannello Rx/TxSelezione del trasferiemnto diretto mantenendo la precedenza su tutte le altre impostazioni di ricezione di flmsgSelf Organizing MappingTrasmetti il nominativo in CW alla fine di ogni trasmissioneInvia dati del QSO a LoTW quando messo a logInvia un flusso continuo di caratteri di provaInvia a questa velocità WPMInvia beacon ogni ...Invia continuamenteInvia il flusso di dati direttamente all'esecuzione di flmsgInvia immagineInvia immagine...invia lotw.adif via tqslInvia il rapporto di ricezione quando metti un QSO a logInvia il rapporto solo quando il QSO è messo a logInvia il testo ricevuto al file: textout.txtI fax inviati e ricevuti vengono messi a log in un file AdifCaratteri inviati nel pannello Rx/TxNome scout inviatoSer inSeriale ricevutoSeriale trasmessoNome del serverImposta - mark come logica ALTA Leggi da nanoIOImpostare> 0 se utilizzato PTT pulsatoImposta Squelch per il ViewerImposta il livello per una buona visualizzazioneImposta il numero di caratteri per rigaScegli il tipo di ricampionatore usato per la correzione dell'offsetImposta il livello di soglia sul valore x sopra il livello di rumoreForma d'onda TxBreve descrizione dell'antennaMostraMostra le entità DXCCMostra la finestra di avviso:Mostra tutti i modiMostra e abilita il pulsante Monitoraggio segnale di potenza (PSM)Mostra indicatori della larghezza di banda sul waterfallMostra canaliMostra linee che indicano la larghezza di banda del modo sul cursoreMostra il cursore con linea centraleMostra meno modiMostra l'editor delle macroMostrami piú o meno waterfallMostra le icone del menuMostra la passwordMostra suggerimentiMostra il segnale trasmesso sul waterfallSide toneBanda laterale:Banda lateraleNavigatore dei segnaliMedia del segnale nel tempo 0 - meno 4 - piùNavigatore segnaliCampo di variazione del segnale (dB)Ricerca segnaliSingola barra macro sotto il pannello di log altezza variabileClick singolo per catturareDimensione:Caratteri saltati nel pannello Tx (Tx on/off in CW)Scorri la porzione visualizzata verso frequenze piú alteScorri la porzione visualizzata verso frequenze piú basseColore evidenziato del cursore nel controllo squelch del navigatoreCPU lente (meno di 700 MHz)Soft-bit decodingSoft-symbol decodingAlcune modifiche apportate dallo script richiedono il programma è necessario riavviare il programma per renderle attive.Ordina per data/ora di fine QSOOrdina il log in base all'ora/data di fine QSO Influisce su tutti i file esportati in ADIF/CabrilloRegistrazione di Schede audio/File wavSpace onlyInterazione Spettroscopio / WaterfallSpettroscopioVelocità (WPM):SpotSpotting disabilitatoSquelchLivello squelchApri squelch (sec)StPartiInizio del ritardo di trasmissione PTTNumero di partenzaStatoLo stato deve coincidereStazione sentita due volteGrid Square della stazioneBit arrestoBit d'arrestoRegistra modo e frequenza Tasto destro per la listaInvia ogni QSO come messo a logInvia la password ad ogni uploadInvia il file adif a LoTWEsecuzione dell'iscrizione non riuscita (interna).Creazione di macchie solari in corso!Portante soppressa +/- AF iniezione frequenzaScambiaScambia contatti del keyer sinistra/destraPassa a ARQ I/OColori di sistemaSistemaT/RTCP/IPTCP/IP Flusso DatiTHOR Immagine GrezzaTimer di drenaggio buffer TX (Min, 0 = Disabilita)Potenza TXTX timeout uomo morto (min)Genera TXTX offsetTX ppmCorrezione della scheda audio in trasmissioneColore dei TabFonti di dati tabulariCodaTalkerTalker Socket (MS only)Dieci Dieci numero ricevutoCarattere di provaCarattere di prova per la regolazione del QSKProva...Cattura testoEvidenziazione TestoEtichette Testuali (le etichette usano i delimitatori {})File di testo da inserireTesto da inviare durante i tempi morti della tastieraTesto...La velocitá predefinita di trasmissione in CWIl nome del file viene scritto nell'area del testo RxIl campo regular expression non puó essere vuoto.La regular expression deve essere valida.La stringa viene sostituita con il modem e la frequenza correntiLa frase di test non corrisponde allo schema di ricerca di questo evento.La procedura guidata ti guiderà attraverso le impostazioni di base di fldigi:Questi tags possono essere usati anche in Questa regular expression per gli eventi non è valida.OraTempo (s):Ora OFFOra ONOra di fineOra d'inizioOra di fine QSOOra inizio QSOTempo in ms tra i tentativiTempo necessario: Timeout tentativo di trasmissione in XX secondiArco di tempoTemporizzazioneVerso chi fare la connessioneScambiaUsa DTR per il PTTUsa RTS per il PTTDurata del tono (secondi)Tono KeyerToniVelocita' inseguita in CW (WPM)InseguimentoControllo radio, flrig/rigcat/hamlibTrasferiemnto diretto all'esecuzione di flmsgVelocità di trasferimento, X1-normaleTransmettiPotenza di trasmissioneTrasmetti il nominativoCarattere in TXTrasmetti il tono di avvio bassoTrasmetti ID del modoModi di trasmissioneTrasmetti punti (.) nei tempi mortiPotenza di trasmissione usataSegnale trasmessoTrasmetti il tono di avvio altoTrasmetti testo videoTrasmetti/RiceviTrasmetti un punto quando non c'è attivitá sulla tastieraTriangolareLimite attivazione (s)Troop-RTroop-SAccordoMargine di sintonia (spaziatura tra i toni)Parametri TxTx sopra RxSfondo TxCarattere TxPotenza Tx usata nei campi del logTxIDUDP/IPAspettoLinguaSchemaUI/Browser/ChannelsUI/TouchINDIRETTOStato USA della stazione lavoratoUSB serial I/OUSOSImpossibile creare il file %s (Errore No=%d) func %s:%dImpossibile aprire il file %sDeseleziona se KML non viene mai utilizzatoErrore indefinitoIndiretta testo ricevutoAnnullaRaggiunta la fine imprevista del file.Trovata fine non prevista dell'elenco dei parametriTrovata la fine imprevista dell'elenco di controllo dei parametriLoTW records non corrispondentiAggiornaAggiorna i file di dati locali selezionati con il contenuto del repositoryAggiorna il record correnteLimite superioreLivello superiore del segnale (dB)Usa "cr cr lf" al posto di "cr lf"Usa '(' come parentesi, non KNUsa un CD o un'immagine su HDUsa il filtro DSP prima del decodificatoreUsa DTRUsa la spaziatura FarnsworthUsa HamlibUsa frequenza MARKUsa un server audio OSSUsa Apri per selezionare il file con la descrizioneUsa un server Port AudioUsa PotUsa server Pulse AudioUsa RTSUsa RigCATUsa T/N per 0/9Usa WPM potUsa la media per diminuire il rumore del waterfallUsa pulsanti coloratiUsa oscilloscopio a croceUsa data/ora di fine per la messa a logUsalo per permettere a un amplificatore di accorgersi del segnaleMetti gli zeri davantiIl PTT usa una porta parallelaIl PTT usa una porta seriale separataUsa caratteri piccoliUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse soft-decision decoding for symbol detection Assists soft-bit decodingUsa questa per WinKeyer e nanoCWUsa la posizione di questa stazione in tqslIl PTT usa uHRouterusa la forma d'onda sul segnale TxUsato per PSKMail e per la suite FLDIGIUsato per BPQ32Utilizzato per regolare l'aggressività di TXNome utenteUsa la porta UDP #Abilita VSPPeriodo di campionamento del segnale valido (ms)Periodo di campionamento del segnale valido in MillisecondiProfondoVerificaVerifica il database con il file di LoTW scaricatoVerifica il database con il file scaricato da eQSLModi ID videoPreambolo identificativo visuale&VediVedi non-corrispondentiMostra/Nascondi CanaliEmulatore Virtuale di Porte Seriali - sopprimi gli allarmiModi visibiliVisita il sito web HamcallVisita il sito web di QRZATTENZIONE - questo sovrascriverà TUTTE le impostazioniIngrandimento WFControlli scorrimento WFMemorie WFWF amp spanPortante WFVelocita' verticale WFModo WFLivello di riferimento WFaggiornamento WPM pot su nanoIO richiestoVelocità WPM per stringa di comando WinKeyer default = 18AttendiAttendere la risposta al primo comando CATAttenti # ms prima di leggere la rispostaAvvisiWaterfallWaterfall / FFT / OscilloscopioVelocità del waterfallAltezza del waterfall in pixelIdentificazione video del modo mostrata sul waterfallTesto visualizzato sul waterfallWebLookup via Web browserWXAzione della rotella del mouseQuando non ci sono segnaliDove sono archiviati i documenti KML generati.LargaAvverrà dopo questo tempo in secondiWinKey PTTDelimitatori di parolaVai a capoScrivi il set corrente delle macro all'uscitaRitardo scritturaScrivi lo stato della nanoIO sulla EEPROM ArduinoTRASMESSOBlocca freq trasmissioneControllo di flusso XON/XOFFXY - classic scopeYSíStai già usando la versione più recenteDevi avere tqsl installato e la sua posizione impostata perchè l'upload verso LoTW funzioni!È necessario un abbonamento a pagamento per l'accesso online a HamcallÈ necessario un abbonamento a pagamento per l'accesso online a QRZIl tuo nome utenteLa tua password d'accessoaadopoaggiungi sempre al file(s)aggiungi # messaggi di direttiva nel file denominatocarica i dati automaticamentecancella vecchi datierrore di allocazione cmd_buffer vicino alla riga %dcondizioni meteo correntiil testo di default viene inviato con eccdi default vengono usati data/ora di iniziovisualizza il pulsante PSM nella finestra di dialogo principaleMostra controlli Rx come stringhe asciiutente eQSLAbilita l'uso della rotella del mouse per il controllo della barra delle macroflamp:fllog:flmsg *flmsg wav tempo scduto flmsg.exe *.exeflmsg:flnet:flrig è il metodo preferito per il controllo della radioparametri server flrig xmlrpc questi controlli sono specchiati nella scheda di configurazione IOflrig:per esempio LIMJ per Aeroporto Genova Sestriil campo libero 1 deve coincidererapporto a formato liberoScala frequenza = N * larghezza di banda modemPorta e segnale usato per il PTT hardwarees: /home/dave/CALLBK/ or C:/CALLBK/ Lascia in bianco per cercare un databasein:kilometri / orafare clic con il tasto sinistro sul WFper ricentrare lo spettroscopioil clic sinistro trasferisce la frequenza alla frequenza centrale dell'oscilloscopioBlocca WF a 1500 HzmbarsminutinanoIO - TTY baudPotenza pilota (dB)stampa ^! codici di esecuzione nel pannello Rxrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500rapportoriportare Fahrenheitriportare pollici di mercurioriportare kilometri all'orariportare miglia per orarapportiscala del display dello spettro collegata alla larghezza di banda del modemsecondisecs' =>Seleziona i caratteri usati nel navigatoreinvia la compensazione al nanoIOInvia quando messo a log (log button, , )testo WPM <= caratteri WPMPosizione della stazione tqsltqsl:usa valori intervallo/limite nel waterfallmodalitá solo waterfallIndirizzo urlTono di trasmissione start/stopfldigi-4.2.05/po/el.po0000664000175000017500000101445014611714003011343 00000000000000# Greek translation file for Fldigi. # Copyright (C) 2017 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Haris Andrianos , 2017. # msgid "" msgstr "" "Project-Id-Version: fldigi 4.2.00\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2024-04-23 06:14-0500\n" "PO-Revision-Date: 2023-09-02 19:30+0300\n" "Last-Translator: Haris Andrianos \n" "Language-Team: Greek (Haris Andrianos) \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: iso-8859-7\n" "X-Generator: Poedit 3.3.2\n" #: src/main.cxx:1052 #, c-format msgid "%s log started on %s" msgstr "" #: src/main.cxx:1779 msgid "Bad modem id" msgstr "" #: src/main.cxx:1786 msgid "Bad frequency" msgstr "" #: src/main.cxx:1909 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" #: src/main.cxx:2136 src/main.cxx:2178 src/main.cxx:2202 src/main.cxx:2216 msgid "Could not make directory " msgstr "Αδυναμία δημιουργίας φακέλου " #: src/debug/debug.cxx:88 msgid "Quiet" msgstr "" #: src/debug/debug.cxx:88 msgid "Error" msgstr "" #: src/debug/debug.cxx:88 msgid "Warning" msgstr "" #: src/debug/debug.cxx:88 msgid "Info" msgstr "" #: src/debug/debug.cxx:88 msgid "Verbose" msgstr "" #: src/debug/debug.cxx:88 src/dialogs/confdialog.cxx:15244 msgid "Debug" msgstr "" #: src/dialogs/fl_digi.cxx:202 msgid "Log all RX/TX text" msgstr "Καταγραφή όλου του κειμένου Λήψης/Εκπομπής" #: src/dialogs/fl_digi.cxx:204 src/dialogs/fl_digi.cxx:7622 msgid "Op &Mode" msgstr "&Mode λειτουργίας" #: src/dialogs/fl_digi.cxx:205 msgid "Show fewer modes" msgstr "Εμφ.λιγότερων mode" #: src/dialogs/fl_digi.cxx:206 msgid "Show all modes" msgstr "Εμφ.όλων των mode" #: src/dialogs/fl_digi.cxx:210 msgid "&View" msgstr "Προβολή" #: src/dialogs/fl_digi.cxx:211 msgid "MFSK Image" msgstr "Εικόνα MFSK" #: src/dialogs/fl_digi.cxx:212 msgid "THOR Raw Image" msgstr "THOR εικόνα Raw" #: src/dialogs/fl_digi.cxx:213 msgid "IFKP Raw Image" msgstr "IFKP εικόνα Raw" #: src/dialogs/fl_digi.cxx:214 msgid "Weather Fax Image TX" msgstr "Αποστολή εικόνας Weather Fax" #: src/dialogs/fl_digi.cxx:215 src/dialogs/confdialog.cxx:10746 #: src/logbook/lgbook.cxx:1293 msgid "Contest" msgstr "" #: src/dialogs/fl_digi.cxx:216 msgid "C&ountries" msgstr "Χώρες" #: src/dialogs/fl_digi.cxx:217 msgid "&UI" msgstr "" #: src/dialogs/fl_digi.cxx:218 msgid "Full" msgstr "Πλήρες" #: src/dialogs/fl_digi.cxx:219 msgid "Partial" msgstr "Μερικό" #: src/dialogs/fl_digi.cxx:220 src/waterfall/waterfall.cxx:2595 #: src/dialogs/confdialog.cxx:9908 src/dialogs/confdialog.cxx:9997 #: src/dialogs/confdialog.cxx:19028 msgid "None" msgstr "Κανένα" #: src/dialogs/fl_digi.cxx:221 msgid "Docked scope" msgstr "Σταθερό παλμογράφημα" #: src/dialogs/fl_digi.cxx:222 msgid "Minimal controls" msgstr "Λιγότερα ρυθμιστικά" #: src/dialogs/fl_digi.cxx:223 msgid "Show channels" msgstr "Εμφ.καναλιών" #: src/dialogs/fl_digi.cxx:225 msgid "Connect to server" msgstr "Σύνδεση με server" #: src/dialogs/fl_digi.cxx:1050 src/dialogs/fl_digi.cxx:1079 #: src/dialogs/fl_digi.cxx:1089 src/dialogs/fl_digi.cxx:5976 #: src/dialogs/fl_digi.cxx:6069 src/dialogs/fl_digi.cxx:6146 #: src/dialogs/fl_digi.cxx:7650 src/dialogs/fl_digi.cxx:7719 #: src/dialogs/fl_digi.cxx:7796 msgid "Custom..." msgstr "Προσαρμοσμένο..." #: src/dialogs/fl_digi.cxx:1147 src/dialogs/confdialog.cxx:369 #: src/dialogs/confdialog.cxx:10673 src/dialogs/confdialog.cxx:10739 msgid "Colors-Fonts" msgstr "Χρώματα-Γραμματοσειρές" #: src/dialogs/fl_digi.cxx:1148 src/dialogs/confdialog.cxx:370 #: src/dialogs/confdialog.cxx:11067 msgid "Contests" msgstr "" #: src/dialogs/fl_digi.cxx:1149 src/dialogs/confdialog.cxx:371 #: src/dialogs/confdialog.cxx:11338 msgid "IDs" msgstr "" #: src/dialogs/fl_digi.cxx:1150 src/dialogs/confdialog.cxx:372 #: src/dialogs/confdialog.cxx:11810 src/dialogs/confdialog.cxx:11896 #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14240 msgid "Logging" msgstr "" #: src/dialogs/fl_digi.cxx:1151 msgid "Modem/CW" msgstr "" #: src/dialogs/fl_digi.cxx:1152 msgid "Modem/TTY" msgstr "" #: src/dialogs/fl_digi.cxx:1153 src/waterfall/waterfall.cxx:2597 #: src/dialogs/confdialog.cxx:373 msgid "Modem" msgstr "" #: src/dialogs/fl_digi.cxx:1154 src/dialogs/confdialog.cxx:374 #: src/dialogs/confdialog.cxx:17169 msgid "Misc" msgstr "Διάφορα" #: src/dialogs/fl_digi.cxx:1155 src/dialogs/confdialog.cxx:375 #: src/dialogs/confdialog.cxx:18303 src/dialogs/confdialog.cxx:18366 msgid "Rig Control" msgstr "Έλεγχος Π/Δ" #: src/dialogs/fl_digi.cxx:1156 src/dialogs/confdialog.cxx:376 #: src/dialogs/confdialog.cxx:18974 msgid "Soundcard" msgstr "Κάρτα Ήχου" #: src/dialogs/fl_digi.cxx:1157 src/dialogs/confdialog.cxx:377 #: src/dialogs/confdialog.cxx:19497 msgid "UI" msgstr "" #: src/dialogs/fl_digi.cxx:1158 src/dialogs/fl_digi.cxx:6238 #: src/dialogs/confdialog.cxx:378 src/dialogs/confdialog.cxx:13939 #: src/dialogs/confdialog.cxx:20045 msgid "Waterfall" msgstr "Καταρράκτης" #: src/dialogs/fl_digi.cxx:1159 src/dialogs/confdialog.cxx:379 #: src/dialogs/confdialog.cxx:20245 msgid "Web" msgstr "" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4547 msgid "Save changed macros?" msgstr "Αποθήκευση αλλαγών macros;" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4134 #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 #: src/logbook/logsupport.cxx:1205 src/misc/configuration.cxx:726 #: src/dialogs/font_browser.cxx:173 src/logbook/lgbook.cxx:837 #: src/logbook/lgbook.cxx:1647 msgid "Cancel" msgstr "Ακύρωση" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:6250 #: src/logbook/logsupport.cxx:330 src/logbook/logsupport.cxx:1204 #: src/dialogs/confdialog.cxx:13194 src/dialogs/confdialog.cxx:15191 #: src/dialogs/confdialog.cxx:20248 msgid "Save" msgstr "Αποθήκευση" #: src/dialogs/fl_digi.cxx:1622 msgid "Don't save" msgstr "Χωρίς αποθήκευση" #: src/dialogs/fl_digi.cxx:1771 msgid "Switch to ARQ I/O" msgstr "Μετάβαση σε ARQ I/O" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "No" msgstr "Όχι" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "Yes" msgstr "Ναι" #: src/dialogs/fl_digi.cxx:2630 msgid "Playback continuous loop?" msgstr "Συνεχής βρόχος αναπαραγωγής;" #: src/dialogs/fl_digi.cxx:2635 msgid "Unsupported audio format" msgstr "Μη υποστηριζόμενη μορφή ήχου" #: src/dialogs/fl_digi.cxx:2642 msgid "Spotting disabled" msgstr "Απενεργ.Spotting" #: src/dialogs/fl_digi.cxx:2694 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Δεν ήταν δυνατή η εκτέλεση ενός προγράμματος περιήγησης Web:\n" "%s \n" "\n" "Άνοιγμα αυτής της URL με μη αυτόματο τρόπο:\n" "%s" #: src/dialogs/fl_digi.cxx:2707 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Δεν ήταν δυνατό το άνοιγμα της διεύθυνσης URL:\n" "\n" "%s\n" #: src/dialogs/fl_digi.cxx:2790 msgid "Checking for updates..." msgstr "Έλεγχος για ενημερώσεις..." #: src/dialogs/fl_digi.cxx:2794 msgid "Update site not available" msgstr "Δεν υπάρχει διαθέσιμο site ενημερώσεων" #: src/dialogs/fl_digi.cxx:2806 msgid "You are running the latest version" msgstr "Τρέχετε την τελευταία έκδοση" #: src/dialogs/fl_digi.cxx:2810 msgid "You are probably running an alpha version " msgstr "Πιθανότατα τρέχετε μια έκδοση alpha " #: src/dialogs/fl_digi.cxx:2811 msgid "" "\n" "Posted version: " msgstr "" "\n" "Δημοσιευμένη έκδοση: " #: src/dialogs/fl_digi.cxx:2816 #, c-format msgid "Version %s is available at Source Forge" msgstr "Η έκδοση %s είναι διαθέσιμη στο Source Forge" #: src/dialogs/fl_digi.cxx:2885 msgid "Sunspot creation underway!" msgstr "Η δημιουργία ηλιακών κηλίδων βρίσκεται σε εξέλιξη!" #: src/dialogs/fl_digi.cxx:2892 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "Πληροφορίες της συσκευής ήχου είναι διαθέσιμες μόνο για το backend του " "PortAudio" #: src/dialogs/fl_digi.cxx:2901 msgid "Capture device" msgstr "Συσκευή εγγραφής" #: src/dialogs/fl_digi.cxx:2902 msgid "Playback device" msgstr "Συσκευή αναπαραγωγής" #: src/dialogs/fl_digi.cxx:2906 msgid "Capture and playback devices" msgstr "Συσκευές εγγραφής και αναπαραγωγής" #: src/dialogs/fl_digi.cxx:2952 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: Δεν υπάρχει, δημιουργία;" #: src/dialogs/fl_digi.cxx:4134 msgid "Clear log fields?" msgstr "Καθαρισμός πεδίων log;" #: src/dialogs/fl_digi.cxx:4134 src/misc/configuration.cxx:726 #: src/logbook/lgbook.cxx:834 src/logbook/lgbook.cxx:1644 msgid "OK" msgstr "" #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 msgid "Confirm" msgstr "Επιβεβ." #: src/dialogs/fl_digi.cxx:4539 msgid "Save changed configuration?" msgstr "Αποθήκευση αλλαγών ρυθμίσεων;" #: src/dialogs/fl_digi.cxx:4555 src/dialogs/fl_digi.cxx:4580 msgid "Save log entry?" msgstr "Αποθήκευση καταχώρησης log;" #: src/dialogs/fl_digi.cxx:4571 msgid "Confirm Quit" msgstr "Επιβεβαίωση εξόδου" #: src/dialogs/fl_digi.cxx:4593 msgid "Confirm quit?" msgstr "Επιβεβαίωση εξόδου;" #: src/dialogs/fl_digi.cxx:5915 src/dialogs/fl_digi.cxx:7618 msgid "&File" msgstr "Αρχείο" #: src/dialogs/fl_digi.cxx:5917 msgid "Folders" msgstr "Φάκελοι" #: src/dialogs/fl_digi.cxx:5918 msgid "Fldigi config..." msgstr "Φάκελος ρυθμ.Fldigi..." #: src/dialogs/fl_digi.cxx:5919 msgid "FLMSG files..." msgstr "Αρχεία FLMSG..." #: src/dialogs/fl_digi.cxx:5920 msgid "NBEMS files..." msgstr "Αρχεία NBEMS..." #: src/dialogs/fl_digi.cxx:5921 msgid "WEFAX images..." msgstr "Εικόνες WEFAX..." #: src/dialogs/fl_digi.cxx:5922 msgid "Data files..." msgstr "Αρχεία δεδομένων..." #: src/dialogs/fl_digi.cxx:5925 msgid "Macros" msgstr "" #: src/dialogs/fl_digi.cxx:5926 msgid "Open ..." msgstr "Άνοιγμα ..." #: src/dialogs/fl_digi.cxx:5927 msgid "Save ..." msgstr "Αποθήκευση ..." #: src/dialogs/fl_digi.cxx:5930 msgid "Config Scripts" msgstr "Script ρυθμίσεων" #: src/dialogs/fl_digi.cxx:5931 msgid "Execute" msgstr "Εκτέλεση" #: src/dialogs/fl_digi.cxx:5932 msgid "Generate" msgstr "Δημιουργία" #: src/dialogs/fl_digi.cxx:5935 msgid "Text Capture" msgstr "Καταγραφή κειμένου" #: src/dialogs/fl_digi.cxx:5939 msgid "Audio" msgstr "Ήχος" #: src/dialogs/fl_digi.cxx:5940 msgid "RX capture" msgstr "Καταγραφή σημάτων Λήψης" #: src/dialogs/fl_digi.cxx:5941 msgid "TX generate" msgstr "Δημιουργία σημάτων Εκπομπής" #: src/dialogs/fl_digi.cxx:5942 src/dialogs/confdialog.cxx:18737 msgid "Playback" msgstr "Αναπαραγωγή" #: src/dialogs/fl_digi.cxx:5945 src/dialogs/fl_digi.cxx:7619 msgid "Exit" msgstr "Έξοδος" #: src/dialogs/fl_digi.cxx:6203 src/dialogs/fl_digi.cxx:7832 msgid "&Configure" msgstr "Ρύθμιση" #: src/dialogs/fl_digi.cxx:6205 src/dialogs/fl_digi.cxx:7833 msgid "Config Dialog" msgstr "Ρυθμίσεις" #: src/dialogs/fl_digi.cxx:6206 src/dialogs/fl_digi.cxx:7836 msgid "Save Config" msgstr "Αποθήκευση ρυθμίσεων" #: src/dialogs/fl_digi.cxx:6207 src/dialogs/fl_digi.cxx:7835 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Ειδοποιήσεις" #: src/dialogs/fl_digi.cxx:6208 src/dialogs/fl_digi.cxx:7834 msgid "Test Signals" msgstr "Σήματα δοκιμών" #: src/dialogs/fl_digi.cxx:6213 src/dialogs/fl_digi.cxx:7840 msgid "Rx Audio Dialog" msgstr "Διάλογος ήχου RX" #: src/dialogs/fl_digi.cxx:6215 msgid "View/Hide Channels" msgstr "Εμφ./Απόκρ.καναλιών" #: src/dialogs/fl_digi.cxx:6216 msgid "Signal browser" msgstr "Περιηγητής σημάτων" #: src/dialogs/fl_digi.cxx:6218 msgid "View/Hide 48 macros" msgstr "Εμφ./Απόκρ.48 macros" #: src/dialogs/fl_digi.cxx:6220 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/fl_digi.cxx:7843 msgid "Floating scope" msgstr "Ελεύθερο παλμογράφημα" #: src/dialogs/fl_digi.cxx:6223 src/dialogs/fl_digi.cxx:7842 msgid "Spectrum scope" msgstr "Αναλυτής φάσματος" #: src/dialogs/fl_digi.cxx:6232 msgid "Rig/Log Controls" msgstr "" #: src/dialogs/fl_digi.cxx:6245 msgid "&Logbook" msgstr "" #: src/dialogs/fl_digi.cxx:6246 msgid "View" msgstr "Εμφάνιση" #: src/dialogs/fl_digi.cxx:6248 msgid "Files" msgstr "Αρχεία" #: src/dialogs/fl_digi.cxx:6249 src/dialogs/confdialog.cxx:17449 msgid "Open..." msgstr "Άνοιγμα..." #: src/dialogs/fl_digi.cxx:6251 src/logbook/logsupport.cxx:1213 #: src/logbook/lgbook.cxx:1567 msgid "New" msgstr "Νέο" #: src/dialogs/fl_digi.cxx:6254 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:6255 msgid "Merge..." msgstr "Ένωση..." #: src/dialogs/fl_digi.cxx:6256 msgid "Export..." msgstr "Εξαγωγή..." #: src/dialogs/fl_digi.cxx:6259 src/logbook/lgbook.cxx:831 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6261 msgid "Reports" msgstr "Αναφορές" #: src/dialogs/fl_digi.cxx:6262 msgid "Text..." msgstr "" #: src/dialogs/fl_digi.cxx:6263 msgid "CSV..." msgstr "" #: src/dialogs/fl_digi.cxx:6264 msgid "Cabrillo..." msgstr "" #: src/dialogs/fl_digi.cxx:6269 msgid "Field Day Logging" msgstr "" #: src/dialogs/fl_digi.cxx:6274 src/dialogs/fl_digi.cxx:7852 msgid "&Help" msgstr "Βοήθεια" #: src/dialogs/fl_digi.cxx:6277 msgid "Create sunspots" msgstr "Δημιουργία sunspots" #: src/dialogs/fl_digi.cxx:6279 msgid "Beginners' Guide" msgstr "Οδηγός για αρχάριους" #: src/dialogs/fl_digi.cxx:6280 src/dialogs/fl_digi.cxx:7853 msgid "Online documentation..." msgstr "" #: src/dialogs/fl_digi.cxx:6281 msgid "Fldigi web site..." msgstr "Ιστότοπος Fldigi..." #: src/dialogs/fl_digi.cxx:6282 msgid "Reception reports..." msgstr "Αναφορές λήψης..." #: src/dialogs/fl_digi.cxx:6283 msgid "Command line options" msgstr "Επιλογές γραμμής εντολών" #: src/dialogs/fl_digi.cxx:6284 msgid "Audio device info" msgstr "Πληροφ.συσκευής ήχου" #: src/dialogs/fl_digi.cxx:6285 msgid "Build info" msgstr "Πληροφορίες έκδοσης" #: src/dialogs/fl_digi.cxx:6286 src/dialogs/fl_digi.cxx:7854 msgid "Event log" msgstr "Ημερολόγιο συμβάντων" #: src/dialogs/fl_digi.cxx:6287 src/dialogs/fl_digi.cxx:7855 msgid "Check for updates..." msgstr "Έλεγχος για ενημερώσεις..." #: src/dialogs/fl_digi.cxx:6288 src/dialogs/fl_digi.cxx:7856 msgid "&About" msgstr "Σχετικά" #: src/dialogs/fl_digi.cxx:6539 msgid "waterfall-only mode" msgstr "" #: src/dialogs/fl_digi.cxx:6541 msgid "NO CALLSIGN SET" msgstr "ΔΕΝ ΕΧΕΙ ΟΡΙΣΤΕΙ CALLSIGN" #: src/dialogs/fl_digi.cxx:6566 msgid "Close List" msgstr "Κλείσιμο λίστας" #: src/dialogs/fl_digi.cxx:6574 msgid "Open List" msgstr "Άνοιγμα λίστας" #: src/dialogs/fl_digi.cxx:6615 msgid "Clear list?" msgstr "Καθαρισμός λίστας;" #: src/dialogs/fl_digi.cxx:6699 msgid "report" msgstr "αναφορά" #: src/dialogs/fl_digi.cxx:6699 msgid "reports" msgstr "αναφορές" #: src/dialogs/fl_digi.cxx:6704 msgid "Recent activity for grid " msgstr "Πρόσφατη δραστηριότητα για το grid" #: src/dialogs/fl_digi.cxx:7841 src/dialogs/Viewer.cxx:283 msgid "Signal Browser" msgstr "Περιηγητής σημάτων" #: src/dialogs/fl_digi.cxx:8143 msgid "Scope" msgstr "Παλμογράφημα" #: src/dialogs/fl_digi.cxx:8234 msgid "Detected signal level" msgstr "Επίπεδο ανίχν.σήματος" #: src/dialogs/fl_digi.cxx:8246 src/waterfall/waterfall.cxx:2596 msgid "Squelch level" msgstr "Επίπεδο Squelch" #: src/dialogs/fl_digi.cxx:8262 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Αριστερό κλικ: αλλαγή mode\n" "Δεξί κλικ: ρύθμιση" #: src/dialogs/fl_digi.cxx:8271 msgid "CW transmit WPM" msgstr "" #: src/dialogs/fl_digi.cxx:8280 msgid "Default WPM" msgstr "" #: src/dialogs/fl_digi.cxx:8310 msgid "Left click to toggle VuMeter" msgstr "Αριστερό κλικ για εναλλαγή του VuMeter" #: src/dialogs/fl_digi.cxx:8316 msgid "Left click to toggle Status Bar" msgstr "Αριστερό κλικ για εναλλαγή γραμμής κατάστασης" #: src/dialogs/fl_digi.cxx:8328 msgid "Tx level attenuator (dB)" msgstr "Εξασθενητής επιπέδου Εκπομπής (dB)" #: src/dialogs/fl_digi.cxx:8356 msgid "Automatic Frequency Control" msgstr "Αυτόματος έλεγχος συχνότητας" #: src/dialogs/fl_digi.cxx:8361 msgid "Squelch" msgstr "" #: src/dialogs/fl_digi.cxx:8366 msgid "Power Signal Monitor" msgstr "" #: src/dialogs/fl_digi.cxx:10682 msgid "Delete entry?" msgstr "Διαγραφή καταχώρησης;" #: src/dialogs/fl_digi.cxx:10682 src/spot/notify.cxx:222 #: src/spot/notify.cxx:228 msgid "All" msgstr "Όλα" #: src/dialogs/Viewer.cxx:287 msgid "Find: " msgstr "Εύρεση: " #: src/dialogs/Viewer.cxx:308 src/logbook/logsupport.cxx:324 #: src/logbook/logsupport.cxx:1063 src/misc/macroedit.cxx:504 #: src/mfsk/mfsk-pic.cxx:338 src/spot/notify.cxx:535 src/spot/notify.cxx:539 #: src/dialogs/confdialog.cxx:20251 msgid "Close" msgstr "Κλείσιμο" #: src/dialogs/Viewer.cxx:316 src/logbook/logsupport.cxx:327 #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:13484 #: src/dialogs/confdialog.cxx:14633 msgid "Clear" msgstr "Καθαρισμ." #: src/dialogs/Viewer.cxx:320 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Αριστερό κλικ για καθαρισμό κειμένου\n" "Δεξί κλικ για επαναφορά συχνοτήτων" #: src/dialogs/Viewer.cxx:326 msgid "Set Viewer Squelch" msgstr "" #: src/logbook/logsupport.cxx:160 msgid "Export to CSV file" msgstr "Εξαγωγή σε αρχείο CSV" #: src/logbook/logsupport.cxx:187 msgid "Export to fixed field text file" msgstr "Εξαγωγή σε αρχείο σταθερών πεδίων" #: src/logbook/logsupport.cxx:215 msgid "Export to ADIF file" msgstr "Εξαγωγή σε αρχείο ADIF" #: src/logbook/logsupport.cxx:317 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:359 msgid "Save changed Logbook?" msgstr "Αποθήκευση αλλαγών Logbook;" #: src/logbook/logsupport.cxx:380 msgid "Create new logbook file" msgstr "Δημιουργία νέου αρχείου logbook" #: src/logbook/logsupport.cxx:403 #, c-format msgid "%s exists, overwrite?" msgstr "%s υπάρχει, αντικατάσταση;" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Άνοιγμα αρχείου logbook" #: src/logbook/logsupport.cxx:472 msgid "Save logbook file" msgstr "Αποθήκευση αρχείου logbook" #: src/logbook/logsupport.cxx:933 msgid "Database merger in progress" msgstr "Συγχώνευση βάσης δεδομένων σε εξέλιξη" #: src/logbook/logsupport.cxx:939 msgid "Merge ADIF file" msgstr "Ένωση αρχείων ADIF" #: src/logbook/logsupport.cxx:977 msgid "No records in lotw download file" msgstr "Δεν υπάρχουν εγγραφές στο αρχείο λήψης lotw" #: src/logbook/logsupport.cxx:1057 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1092 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" "Δεν ήταν δυνατή η εύρεση του αρχείου report LoTW.\n" "\n" "Λήψη από τη σελίδα LoTW ARRL μετά τη σύνδεση στο: \n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Αποθηκεύστε το αρχείο αναφοράς στο φάκελο fldigi LOTW,\n" "\n" "ονομάζοντας το αρχείο ' lotwreport. adi '" #: src/logbook/logsupport.cxx:1214 src/spot/notify.cxx:206 #: src/spot/notify.cxx:533 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1574 msgid "Update" msgstr "Ενημέρ." #: src/logbook/logsupport.cxx:1816 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Διαγραφή καταχώρησης για \"%s\";" #: src/logbook/logsupport.cxx:2330 msgid "Create cabrillo report" msgstr "Δημιουργία αναφοράς cabrillo" #: src/logbook/logsupport.cxx:2570 msgid "LoTW download file" msgstr "Λήψη αρχείου LoTW" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:286 src/logger/rx_extract.cxx:316 msgid "Could not start flmsg" msgstr "Αδυναμία έναρξης flmsg" #: src/logger/rx_extract.cxx:414 src/logger/rx_extract.cxx:418 #: src/dialogs/confdialog.cxx:16379 msgid "Locate flmsg executable" msgstr "Εντοπισμός εκτελέσιμου flmsg" #: src/logger/rx_extract.cxx:414 msgid "flmsg.exe\t*.exe" msgstr "" #: src/logger/rx_extract.cxx:418 msgid "flmsg\t*" msgstr "" #: src/logger/rx_extract.cxx:492 msgid "Locate executable" msgstr "Εντοπισμός εκτελέσιμου" #: src/logger/rx_extract.cxx:492 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:495 msgid "Locate binary" msgstr "Εντοπισμός binary" #: src/logger/rx_extract.cxx:495 msgid "*" msgstr "" #: src/logger/speak.cxx:40 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Αποθηκεύει όλο το κείμενο που λάβατε, έναν-έναν χαρακτήρα στο ακόλουθο " "αρχείο:\n" "\n" "fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:539 msgid "Rig mode" msgstr "Mode Π/Δ" #: src/misc/configuration.cxx:540 msgid "Always LSB" msgstr "Πάντα LSB" #: src/misc/configuration.cxx:541 msgid "Always USB" msgstr "Πάντα USB" #: src/misc/configuration.cxx:549 src/dialogs/confdialog.cxx:17915 #: src/dialogs/confdialog.cxx:18183 src/dialogs/confdialog.cxx:18185 msgid "Rig Control/Hamlib" msgstr "Έλεγχος ΠΔ/Hamlib" #: src/misc/configuration.cxx:723 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Επαναφορά όλων των επιλογών στις αρχικές τιμές;\n" "\n" "Η επαναφορά θα πραγματοποιηθεί στην επόμενη εκτέλεση\n" "Τα αρχεία: fldigi_def.xml και fldigi.prefs θα διαγραφούν!\n" #: src/misc/configuration.cxx:728 msgid "Confirm RESET" msgstr "Επιβεβαίωση ΕΠΑΝΑΦΟΡΑΣ" #: src/misc/macroedit.cxx:68 msgid "\tmy frequency" msgstr "\tη συχνότητα μου" #: src/misc/macroedit.cxx:69 msgid "\tmode" msgstr "" #: src/misc/macroedit.cxx:70 msgid "\tmy call" msgstr "\tτο callsign μου" #: src/misc/macroedit.cxx:71 msgid "\tmy locator" msgstr "\tτο locator μου" #: src/misc/macroedit.cxx:72 msgid "\tmy name" msgstr "\tτο όνομα μου" #: src/misc/macroedit.cxx:73 #, fuzzy #| msgid "\tmy QTH" msgid "\tmy QTH (city)" msgstr "\tτο QTH μου" #: src/misc/macroedit.cxx:74 msgid "\tmy RST" msgstr "\tτο RST μου" #: src/misc/macroedit.cxx:75 msgid "\tmy FD class" msgstr "" #: src/misc/macroedit.cxx:76 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:77 msgid "\tmy state" msgstr "" #: src/misc/macroedit.cxx:78 msgid "\tmy ST" msgstr "" #: src/misc/macroedit.cxx:79 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:80 msgid "\tmy CNTY" msgstr "" #: src/misc/macroedit.cxx:81 msgid "\tmy antenna" msgstr "\tη κεραία μου" #: src/misc/macroedit.cxx:82 msgid "\toperating band" msgstr "\tμπάντα λειτουργίας" #: src/misc/macroedit.cxx:83 #, fuzzy #| msgid "\ttransmit" msgid "\ttransmit power" msgstr "\tεκπομπή" #: src/misc/macroedit.cxx:84 msgid "\tFldigi version" msgstr "\tέκδοση Fldigi" #: src/misc/macroedit.cxx:85 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:88 msgid "\tother call" msgstr "" #: src/misc/macroedit.cxx:89 msgid "\tother name" msgstr "" #: src/misc/macroedit.cxx:90 msgid "\tother QTH" msgstr "" #: src/misc/macroedit.cxx:91 msgid "\tother State" msgstr "" #: src/misc/macroedit.cxx:92 msgid "\tother Province" msgstr "" #: src/misc/macroedit.cxx:93 msgid "\tother locator" msgstr "" #: src/misc/macroedit.cxx:94 msgid "\tother RST" msgstr "" #: src/misc/macroedit.cxx:97 msgid "\tS/N etc." msgstr "\tS/N κλπ." #: src/misc/macroedit.cxx:98 msgid "\tIMD etc." msgstr "\tIMD κλπ." #: src/misc/macroedit.cxx:101 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:102 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:105 msgid "\tmap on google" msgstr "\tχάρτης στο google" #: src/misc/macroedit.cxx:106 msgid "\tmap by value" msgstr "" #: src/misc/macroedit.cxx:109 msgid "\tclear RX pane" msgstr "\tκαθαρισμός πίνακα Λήψης" #: src/misc/macroedit.cxx:110 msgid "\tclear TX pane" msgstr "\tκαθαρισμός πίνακα Εκπομπής" #: src/misc/macroedit.cxx:111 msgid "\tclear QSO fields" msgstr "\tκαθαρισμός των πεδίων του QSO" #: src/misc/macroedit.cxx:114 msgid "\ttext to NAME/QTH" msgstr "\tκείμενο σε NAME/QTH" #: src/misc/macroedit.cxx:118 msgid "\tDigitalk On, Off, Toggle" msgstr "" #: src/misc/macroedit.cxx:122 msgid "\tclear log fields" msgstr "\tκαθαρισμός των πεδίων του log" #: src/misc/macroedit.cxx:123 msgid "\tsave QSO data" msgstr "\tαποθήκευση στοιχείων QSO" #: src/misc/macroedit.cxx:124 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:125 msgid "\tlog at xmt time" msgstr "" #: src/misc/macroedit.cxx:126 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:127 msgid "\tlog eQSL" msgstr "" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL optional msg" msgstr "" #: src/misc/macroedit.cxx:131 msgid "\tQSO time (HHMM))" msgstr "" #: src/misc/macroedit.cxx:132 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:133 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\tlocal time, default %H%M" msgstr "" #: src/misc/macroedit.cxx:137 msgid "\tzulu time default %H%MZ" msgstr "" #: src/misc/macroedit.cxx:138 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "" #: src/misc/macroedit.cxx:139 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "" #: src/misc/macroedit.cxx:140 msgid "\tget weather data" msgstr "\tλήψη δεδομένων καιρού" #: src/misc/macroedit.cxx:141 msgid "\tget weather data for station" msgstr "\tλήψη δεδομένων καιρού για το σταθμό" #: src/misc/macroedit.cxx:144 msgid "\tcontest counter" msgstr "\tμετρητής contest" #: src/misc/macroedit.cxx:145 msgid "\tdecrement counter" msgstr "\tμείωση μετρητή" #: src/misc/macroedit.cxx:146 msgid "\tincrement counter" msgstr "\tiαύξηση μετρητή" #: src/misc/macroedit.cxx:147 msgid "\texchange in" msgstr "" #: src/misc/macroedit.cxx:148 msgid "\texchange out" msgstr "" #: src/misc/macroedit.cxx:149 msgid "\texchange begin" msgstr "" #: src/misc/macroedit.cxx:150 msgid "\texchange end" msgstr "" #: src/misc/macroedit.cxx:151 msgid "\tsave contest out" msgstr "" #: src/misc/macroedit.cxx:152 msgid "\tcurrent contest serno" msgstr "" #: src/misc/macroedit.cxx:153 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:154 msgid "\tFD class" msgstr "" #: src/misc/macroedit.cxx:155 msgid "\tFD section" msgstr "" #: src/misc/macroedit.cxx:156 msgid "\tcontest class" msgstr "" #: src/misc/macroedit.cxx:157 msgid "
\tARRL section" msgstr "" #: src/misc/macroedit.cxx:160 msgid "\treceive" msgstr "\tλήψη" #: src/misc/macroedit.cxx:161 msgid "\ttransmit" msgstr "\tεκπομπή" #: src/misc/macroedit.cxx:162 msgid "\ttoggle T/R" msgstr "\tεναλλαγή Εκπομπής/Λήψης" #: src/misc/macroedit.cxx:163 msgid "\tsearch UP for signal" msgstr "\tΑναζήτηση ΕΠΑΝΩ για σήμα" #: src/misc/macroedit.cxx:164 msgid "\tsearch DOWN for signal" msgstr "\tΑναζήτηση ΚΑΤΩ για σήμα" #: src/misc/macroedit.cxx:165 msgid "\treturn to sweet spot" msgstr "\tεπιστροφή στο sweet spot" #: src/misc/macroedit.cxx:166 msgid "\tmove to freq NNNN Hz" msgstr "\tμετακίνηση στην συχν. NNNN Hz" #: src/misc/macroedit.cxx:167 msgid "\tleft-clk QSY button" msgstr "\tΑριστ.κλικ κουμπίου QSY" #: src/misc/macroedit.cxx:168 msgid "\tright-clk QSY button" msgstr "\tΔεξί κλικ κουμπίου QSY" #: src/misc/macroedit.cxx:169 msgid "\tqsy to kHz, Hz" msgstr "" #: src/misc/macroedit.cxx:170 msgid "\tincr/decr xcvr freq" msgstr "" #: src/misc/macroedit.cxx:171 msgid "\tvalid xcvr mode" msgstr "" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr filter width" msgstr "" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr low cutoff filter" msgstr "" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr hi cutoff filter" msgstr "" #: src/misc/macroedit.cxx:175 msgid "\trig freq has kbd focus" msgstr "" #: src/misc/macroedit.cxx:178 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:181 msgid "\tinsert text file" msgstr "\tεισαγωγή αρχείου κειμένου" #: src/misc/macroedit.cxx:182 msgid "\tinsert image file" msgstr "\tεισαγωγή αρχείου εικόνας" #: src/misc/macroedit.cxx:183 msgid "\tsend avatar" msgstr "\tαποστολή avatar" #: src/misc/macroedit.cxx:186 msgid "\tpause transmit" msgstr "\tπαύση εκπομπής" #: src/misc/macroedit.cxx:187 msgid "\tidle signal for NN.nn sec" msgstr "" #: src/misc/macroedit.cxx:188 msgid "\trepeat every NN sec" msgstr "\tεπανάληψη κάθε NN δευτ." #: src/misc/macroedit.cxx:189 msgid "\trepeat after waiting NN sec" msgstr "επανάληψη μετά από αναμονή NN δευτ." #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tσήμα συντονισμού για NN δευτ." #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "\tκαθυστέρηση εκπομπής για NN.n δευτ." #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\tσυνεχής επανάληψη macro" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution for" msgstr "" #: src/misc/macroedit.cxx:194 msgid "\tend execution at" msgstr "" #: src/misc/macroedit.cxx:195 msgid "\tuse local date/time" msgstr "\tχρήση τοπικής ημερομηνίας/ώρας" #: src/misc/macroedit.cxx:198 msgid "\t set xmt attenuator" msgstr "\t ρύθμιση εξασθενητή εκπομπής" #: src/misc/macroedit.cxx:201 msgid "\tCW identifier" msgstr "" #: src/misc/macroedit.cxx:202 msgid "\tsend mode ID; TX start only" msgstr "" #: src/misc/macroedit.cxx:203 msgid "\ttext at start of TX" msgstr "\tκείμενο στην αρχή της εκπομπής" #: src/misc/macroedit.cxx:204 msgid "\tvideo text in TX stream" msgstr "" #: src/misc/macroedit.cxx:205 msgid "\tTx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\tRx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:207 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:208 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:211 msgid "\tXmt audio wav file" msgstr "\tεκπομπή αρχείου ήχου wav" #: src/misc/macroedit.cxx:214 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:215 msgid "\talert using external wav file" msgstr "\tειδοποίηση με χρήση εξωτερικού αρχείου wav" #: src/misc/macroedit.cxx:218 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:219 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:220 msgid "\tCW rise time" msgstr "" #: src/misc/macroedit.cxx:221 msgid "\tChar WPM:Text WPM (15.0:5.0)" msgstr "" #: src/misc/macroedit.cxx:224 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:225 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:228 msgid "\tAFC on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:229 msgid "\tLOCK on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:230 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:231 msgid "\tDigital Squelch on, off,toggle" msgstr "" #: src/misc/macroedit.cxx:232 msgid "\tDigital Squelch level, 0..100" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tchange macro defs file" msgstr "" #: src/misc/macroedit.cxx:236 msgid "\tsave current macro file" msgstr "\tΑποθήκευση του τρέχοντος αρχείου macro" #: src/misc/macroedit.cxx:237 msgid "\trun macro from buffered teext" msgstr "" #: src/misc/macroedit.cxx:240 msgid "\tignore comment text" msgstr "" #: src/misc/macroedit.cxx:241 msgid "<#comments>\t ignore comments" msgstr "" #: src/misc/macroedit.cxx:244 msgid "\tmodem char/sec test on nn chars" msgstr "" #: src/misc/macroedit.cxx:245 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:246 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:247 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:250 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:252 msgid "\tWAV file; spec' file" msgstr "" #: src/misc/macroedit.cxx:253 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:256 msgid "\tAnalysis CSV on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:259 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:260 msgid "\tpush current mode / audio freq to stack" msgstr "" #: src/misc/macroedit.cxx:261 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:383 msgid "Text file to insert" msgstr "Αρχείο κειμένου για εισαγωγή" #: src/misc/macroedit.cxx:393 msgid "Test text file" msgstr "Δοκιμαστικό αρχείο κειμένου" #: src/misc/macroedit.cxx:403 msgid "MFSK image file" msgstr "Αρχείο εικόνας MFSK" #: src/misc/macroedit.cxx:413 msgid "Change to Macro file" msgstr "Αλλαγή στο αρχείο Macro" #: src/misc/macroedit.cxx:423 src/misc/macroedit.cxx:433 msgid "Select audio file" msgstr "Επιλογή αρχείου ήχου" #: src/misc/macroedit.cxx:445 msgid "Executable file to insert" msgstr "Εκτελέσιμο αρχείο για εισαγωγή" #: src/misc/macroedit.cxx:476 msgid "Macro Text" msgstr "Κείμενο Macro" #: src/misc/macroedit.cxx:481 msgid "Select Tag" msgstr "Επιλογή ετικέτας" #: src/misc/macroedit.cxx:493 msgid "Macro Button Label" msgstr "Ετικέτα κουμπιού macro" #: src/misc/macroedit.cxx:501 msgid "Apply" msgstr "Εφαρμογή" #: src/misc/macroedit.cxx:530 msgid "Macro editor - " msgstr "Επεξεργαστής macro - " #: src/misc/macros.cxx:5166 msgid "Open macro file" msgstr "Άνοιγμα αρχείου macro" #: src/misc/macros.cxx:5167 src/misc/macros.cxx:5210 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Αρχείο μακροεντολών Fldigi\t *.{mdf}" #: src/misc/macros.cxx:5209 msgid "Save macro file" msgstr "Αποθήκευση αρχείου macro" #: src/misc/newinstall.cxx:385 msgid "Finish" msgstr "Τέλος" #: src/misc/newinstall.cxx:386 msgid "Next" msgstr "Επόμενο" #: src/misc/newinstall.cxx:387 msgid "Back" msgstr "Πίσω" #: src/misc/newinstall.cxx:505 msgid "The wizard will guide you through the basic fldigi settings:" msgstr "Ο βοηθός θα σας οδηγήσει για τις βασικές ρυθμίσεις του fldigi:" #: src/misc/newinstall.cxx:506 src/logbook/lgbook.cxx:731 msgid "Operator" msgstr "Χειριστής" #: src/misc/newinstall.cxx:507 msgid "Sound Card Interface" msgstr "Διασύνδεση κάρτας ήχου" #: src/misc/newinstall.cxx:508 msgid "Transceiver control, flrig/rigcat/hamlib" msgstr "Έλεγχος πομποδέκτη, flrig/rigcat/hamlib" #: src/misc/newinstall.cxx:509 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "Μπορείτε να παραλείψετε οποιοδήποτε βήμα του βοηθού" #: src/misc/newinstall.cxx:510 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Όλες οι ρυθμίσεις που εμφανίζονται μπορούν να αλλάξουν αργότερα από το μενού " "Ρυθμίσεων" #: src/misc/newinstall.cxx:525 msgid "Fldigi configuration wizard" msgstr "Βοηθός ρύθμισης Fldigi" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:302 src/mfsk/mfsk-pic.cxx:305 msgid "Time needed: " msgstr "Χρόνος που απαιτείται: " #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Φόρτωση αρχείου εικόνας" #: src/mfsk/mfsk-pic.cxx:312 msgid "Send image" msgstr "Αποστολή εικόνας" #: src/mfsk/mfsk-pic.cxx:319 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Φορτώστε ή σύρετε ένα αρχείο εικόνας\n" "Υποστηριζόμενοι τύποι: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:323 msgid "Transfer speed, X1-normal" msgstr "Ταχύτητα μεταφοράς X1-κανονική" #: src/mfsk/mfsk-pic.cxx:335 msgid "Load" msgstr "Φόρτωση" #: src/waterfall/waterfall.cxx:2031 msgid "Waterfall / FFT / Scope" msgstr "Καταρράκτης / FFT / Παλμογράφημα" #: src/waterfall/waterfall.cxx:2040 msgid "Upper signal level (dB)" msgstr "Ανώτατη στάθμη σήματος (dB)" #: src/waterfall/waterfall.cxx:2051 msgid "Signal range (dB)" msgstr "Εύρος σήματος (dB)" #: src/waterfall/waterfall.cxx:2057 msgid "Change waterfall scale" msgstr "Αλλαγή κλίμακας καταρράκτη" #: src/waterfall/waterfall.cxx:2062 msgid "Slew display lower in frequency" msgstr "" #: src/waterfall/waterfall.cxx:2067 msgid "Center display on signal" msgstr "Επικέντρωση προβολής στο σήμα" #: src/waterfall/waterfall.cxx:2072 msgid "Slew display higher in frequency" msgstr "" #: src/waterfall/waterfall.cxx:2077 msgid "Waterfall drop speed" msgstr "Ταχύτητα κύλισης καταρράκτη" #: src/waterfall/waterfall.cxx:2087 msgid "Adjust cursor frequency" msgstr "Ρύθμιση συχνότητας κέρσορα" #: src/waterfall/waterfall.cxx:2092 msgid "" "Center in passband\n" "Right click to undo" msgstr "" #: src/waterfall/waterfall.cxx:2098 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Αποθήκευση mode και συχνότητας\n" "Δεξί κλικ για λίστα" #: src/waterfall/waterfall.cxx:2108 msgid "Lock transmit frequency" msgstr "Κλείδωμα συχνότητας εκπομπής" #: src/waterfall/waterfall.cxx:2117 src/dialogs/confdialog.cxx:19508 msgid "Reverse" msgstr "Αναστροφή" #: src/waterfall/waterfall.cxx:2124 msgid "Transmit/Receive" msgstr "Εκπομπή/Λήψη" #: src/waterfall/waterfall.cxx:2595 msgid "AFC range or BW" msgstr "" #: src/waterfall/waterfall.cxx:2596 msgid "Signal search" msgstr "Αναζήτ.σήματος" #: src/waterfall/waterfall.cxx:2597 msgid "Modem carrier" msgstr "" #: src/waterfall/waterfall.cxx:2597 msgid "Scroll" msgstr "Κύλιση" #: src/rigcontrol/rigxml.cxx:1121 msgid "Open rig xml file" msgstr "Άνοιγμα αρχείου Π/Δ xml" #: src/rigcontrol/rigxml.cxx:1121 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Αρχείο xml ορισμού Π/Δ Fldigi *.xml" #: src/soundcard/sound.cxx:115 src/soundcard/sound.cxx:117 msgid "Audio file" msgstr "Αρχείο ήχου" #: src/spot/notify.cxx:193 msgid "My callsign de CALL" msgstr "" #: src/spot/notify.cxx:194 msgid "Station heard twice" msgstr "" #: src/spot/notify.cxx:195 msgid "Custom text search" msgstr "" #: src/spot/notify.cxx:196 msgid "RSID reception" msgstr "Λήψη RSID" #: src/spot/notify.cxx:197 msgid "RSID EOT" msgstr "" #: src/spot/notify.cxx:205 msgid "Toggle" msgstr "Εναλλαγή" #: src/spot/notify.cxx:207 src/spot/notify.cxx:532 msgid "Remove" msgstr "Αφαίρεση" #: src/spot/notify.cxx:218 src/dialogs/confdialog.cxx:14150 #: src/dialogs/confdialog.cxx:14161 src/dialogs/confdialog.cxx:14251 #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14835 #: src/dialogs/confdialog.cxx:18355 src/dialogs/confdialog.cxx:18382 #: src/dialogs/confdialog.cxx:18411 src/dialogs/confdialog.cxx:18440 #: src/dialogs/confdialog.cxx:18469 src/dialogs/confdialog.cxx:18493 #: src/dialogs/confdialog.cxx:19096 msgid "Select" msgstr "Επιλογή" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 src/spot/notify.cxx:586 #: src/logbook/lgbook.cxx:782 src/logbook/lgbook.cxx:1187 msgid "Continent" msgstr "Ήπειρος" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/logbook/lgbook.cxx:1199 msgid "ITU zone" msgstr "Ζώνη ITU" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1175 msgid "CQ zone" msgstr "Ζώνη CQ" #: src/spot/notify.cxx:224 msgid "Deselect" msgstr "Αποεπιλογή" #: src/spot/notify.cxx:531 msgid "Add" msgstr "Προσθήκη" #: src/spot/notify.cxx:534 msgid "Test..." msgstr "Δοκιμή..." #: src/spot/notify.cxx:537 src/widgets/FTextView.cxx:484 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Επιλ.όλων" #: src/spot/notify.cxx:538 src/logbook/lgbook.cxx:621 #: src/logbook/lgbook.cxx:822 src/logbook/lgbook.cxx:1636 #: src/logbook/lgbook.cxx:1718 msgid "Clear All" msgstr "Καθαρ.όλων" #: src/spot/notify.cxx:585 src/widgets/FTextRXTX.cxx:154 #: src/logbook/lgbook.cxx:737 src/logbook/lgbook.cxx:1039 msgid "Country" msgstr "Χώρα" #: src/spot/notify.cxx:1144 msgid "The regular expression field must not be empty." msgstr "" #: src/spot/notify.cxx:1150 msgid "The regular expression must be valid." msgstr "" #: src/spot/notify.cxx:1157 msgid "Please set your callsign first." msgstr "Πρώτα ορίστε το callsign σας." #: src/spot/notify.cxx:1294 msgid "Run program" msgstr "Εκτέλεση προγράμματος" #: src/spot/notify.cxx:1329 msgid "" "Default test string is:\n" " \"" msgstr "" #: src/spot/notify.cxx:1330 msgid "Enter test string or leave blank for default:" msgstr "" #: src/spot/notify.cxx:1341 msgid "This event's regular expression is invalid." msgstr "" #: src/spot/notify.cxx:1348 msgid "The test string did not match this event's search pattern." msgstr "" #: src/spot/notify.cxx:1366 msgid "Available substrings" msgstr "" #: src/spot/notify.cxx:1453 src/logbook/lgbook.cxx:1617 msgid "Frequency" msgstr "Συχνότητα" #: src/spot/notify.cxx:1455 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1614 msgid "Callsign" msgstr "" #: src/waterfall/colorbox.cxx:87 msgid "Open palette" msgstr "" #: src/waterfall/colorbox.cxx:87 src/waterfall/colorbox.cxx:125 msgid "Fldigi palette\t*.pal" msgstr "" #: src/waterfall/colorbox.cxx:111 src/waterfall/colorbox.cxx:136 msgid "Palette: " msgstr "" #: src/waterfall/colorbox.cxx:125 msgid "Save palette" msgstr "" #: src/widgets/FTextRXTX.cxx:147 msgid "Look up call" msgstr "" #: src/widgets/FTextRXTX.cxx:148 src/dialogs/confdialog.cxx:10138 #: src/logbook/lgbook.cxx:665 src/logbook/lgbook.cxx:870 #: src/logbook/lgbook.cxx:1666 msgid "Call" msgstr "" #: src/widgets/FTextRXTX.cxx:149 src/logbook/lgbook.cxx:669 #: src/logbook/lgbook.cxx:882 src/logbook/lgbook.cxx:1616 msgid "Name" msgstr "" #: src/widgets/FTextRXTX.cxx:150 msgid "QTH" msgstr "" #: src/widgets/FTextRXTX.cxx:151 src/dialogs/confdialog.cxx:10842 #: src/logbook/lgbook.cxx:716 src/logbook/lgbook.cxx:1710 msgid "State" msgstr "" #: src/widgets/FTextRXTX.cxx:152 src/logbook/lgbook.cxx:779 #: src/logbook/lgbook.cxx:1150 src/logbook/lgbook.cxx:1151 #: src/logbook/lgbook.cxx:1714 msgid "County" msgstr "" #: src/widgets/FTextRXTX.cxx:153 src/logbook/lgbook.cxx:734 msgid "Province" msgstr "" #: src/widgets/FTextRXTX.cxx:155 msgid "Locator" msgstr "" #: src/widgets/FTextRXTX.cxx:156 msgid "RST(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:157 msgid "RST(s)" msgstr "" #: src/widgets/FTextRXTX.cxx:158 src/dialogs/confdialog.cxx:10836 #: src/logbook/lgbook.cxx:773 src/logbook/lgbook.cxx:1702 msgid "Exchange In" msgstr "" #: src/widgets/FTextRXTX.cxx:159 msgid "Rx Serial #" msgstr "" #: src/widgets/FTextRXTX.cxx:160 src/logbook/lgbook.cxx:1343 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:161 src/logbook/lgbook.cxx:1432 msgid "Section" msgstr "" #: src/widgets/FTextRXTX.cxx:163 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:164 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:165 msgid "SS check" msgstr "" #: src/widgets/FTextRXTX.cxx:166 src/logbook/lgbook.cxx:1433 msgid "SS section" msgstr "" #: src/widgets/FTextRXTX.cxx:169 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:171 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:176 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:181 msgid "QSOp state" msgstr "" #: src/widgets/FTextRXTX.cxx:182 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp name" msgstr "" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:186 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "Insert marker" msgstr "Εισαγωγή σημαδιού" #: src/widgets/FTextRXTX.cxx:196 msgid "All entries" msgstr "Όλες οι καταχωρήσεις" #: src/widgets/FTextRXTX.cxx:198 msgid "Scroll hints" msgstr "" #: src/widgets/FTextRXTX.cxx:1808 msgid " in " msgstr "" #: src/widgets/FTextRXTX.cxx:1811 msgid "Last QSO" msgstr "" #: src/widgets/FTextRXTX.cxx:1859 src/dialogs/confdialog.cxx:12043 msgid "Transmit" msgstr "Εκπομπή" #: src/widgets/FTextRXTX.cxx:1860 src/dialogs/confdialog.cxx:11903 #: src/dialogs/confdialog.cxx:14718 msgid "Receive" msgstr "Λήψη" #: src/widgets/FTextRXTX.cxx:1861 msgid "Abort" msgstr "Απόρριψη" #: src/widgets/FTextRXTX.cxx:1862 msgid "Send image..." msgstr "Αποστολή εικόνας..." #: src/widgets/FTextRXTX.cxx:1871 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "Ειδ.χαρακτ." #: src/widgets/FTextRXTX.cxx:1879 src/widgets/flinput2.cxx:58 msgid "A" msgstr "" #: src/widgets/FTextRXTX.cxx:1895 src/widgets/flinput2.cxx:74 msgid "E" msgstr "" #: src/widgets/FTextRXTX.cxx:1905 src/widgets/flinput2.cxx:84 msgid "I" msgstr "" #: src/widgets/FTextRXTX.cxx:1915 src/widgets/flinput2.cxx:94 msgid "N" msgstr "" #: src/widgets/FTextRXTX.cxx:1919 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16915 msgid "O" msgstr "" #: src/widgets/FTextRXTX.cxx:1933 src/widgets/flinput2.cxx:112 msgid "U" msgstr "" #: src/widgets/FTextRXTX.cxx:1943 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextRXTX.cxx:1948 src/widgets/flinput2.cxx:127 #: src/logbook/lgbook.cxx:1148 msgid "Other" msgstr "Άλλα" #: src/widgets/FTextView.cxx:294 msgid "Insert text" msgstr "Εισαγωγή κειμένου" #: src/widgets/FTextView.cxx:347 msgid "Save text as" msgstr "Αποθήκευση κειμένου ως" #: src/widgets/FTextView.cxx:482 src/widgets/FTextView.cxx:648 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Αντιγραφή" #: src/widgets/FTextView.cxx:485 msgid "Save as..." msgstr "Αποθήκευση ως..." #: src/widgets/FTextView.cxx:486 src/widgets/FTextView.cxx:652 msgid "Word wrap" msgstr "Αναδίπλωση λέξεων" #: src/widgets/FTextView.cxx:647 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Αποκοπή" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Επικόλληση" #: src/widgets/FTextView.cxx:651 msgid "Insert file..." msgstr "Εισαγωγή αρχείου..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Αναίρεση" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1581 msgid "Delete" msgstr "Διαγραφή" #: src/config_script/run_scripts.cxx:950 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2850 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2857 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2864 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2868 #, c-format msgid "Executing script file: %s" msgstr "Εκτέλεση του αρχείου script: %s" #: src/config_script/run_scripts.cxx:2873 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2874 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2878 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" "Ορισμένες αλλαγές που έγιναν από στο script απαιτούν\n" "επανεκκίνηση του προγράμματος πριν να γίνουν ενεργές." #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:359 #, c-format msgid "Missing command %s after line %d" msgstr "Λείπει η εντολή %s μετά τη γραμμή%d" #: src/config_script/script_parsing.cxx:403 msgid "Command Not Found" msgstr "Η εντολή δεν βρέθηκε" #: src/config_script/script_parsing.cxx:407 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:411 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:415 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:419 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:423 msgid "General Error" msgstr "" #: src/config_script/script_parsing.cxx:427 msgid "No Errors" msgstr "" #: src/config_script/script_parsing.cxx:431 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:435 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:439 msgid "File not found" msgstr "Δεν βρέθηκε αρχείο" #: src/config_script/script_parsing.cxx:443 msgid "Directory path not found" msgstr "Διαδρομή φακέλου δεν βρέθηκε" #: src/config_script/script_parsing.cxx:447 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:451 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:455 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:459 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:463 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:467 msgid "Parameter is not valid." msgstr "Η παράμετρος δεν είναι έγκυρη." #: src/config_script/script_parsing.cxx:471 msgid "Command missing ':'." msgstr "Λείπει ':' από την εντολή." #: src/config_script/script_parsing.cxx:475 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:479 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:483 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:487 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:491 msgid "File read error" msgstr "Σφάλμα ανάγνωσης αρχείου" #: src/config_script/script_parsing.cxx:495 msgid "Undefined error" msgstr "Απροσδιόριστο σφάλμα" #: src/config_script/script_parsing.cxx:498 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "Γραμμή: %d Σφάλμα:%d %s (%s)" #: src/config_script/script_parsing.cxx:966 #: src/config_script/script_parsing.cxx:1093 #: src/config_script/script_parsing.cxx:1806 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1036 #: src/config_script/script_parsing.cxx:1152 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1042 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1156 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1239 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1247 #, c-format msgid "Unable to open file %s" msgstr "Αδυναμία ανοίγματος αρχείου %s" #: src/config_script/script_parsing.cxx:1435 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1439 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1656 #: src/config_script/script_parsing.cxx:1743 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1757 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 #: src/dialogs/confdialog.cxx:10080 src/dialogs/confdialog.cxx:11537 #: src/dialogs/confdialog.cxx:11721 msgid "Show" msgstr "Εμφάνιση" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 msgid "Hide" msgstr "Απόκρυψη" #: src/dialogs/confdialog.cxx:6816 msgid "no" msgstr "Όχι" #: src/dialogs/confdialog.cxx:6816 msgid "yes" msgstr "Ναι" #: src/dialogs/confdialog.cxx:9873 msgid "Fldigi configuration" msgstr "Ρύθμιση Fldigi" #: src/dialogs/confdialog.cxx:9883 msgid "Configure" msgstr "Ρύθμιση" #: src/dialogs/confdialog.cxx:9893 msgid "Collapse Tree" msgstr "Συρρίκνωση Μενού" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:10100 #: src/dialogs/confdialog.cxx:10102 msgid "Call/Lookup" msgstr "" #: src/dialogs/confdialog.cxx:9905 msgid "Web Browser lookup" msgstr "Αναζήτηση με Web Browser" #: src/dialogs/confdialog.cxx:9909 msgid "Do not use callsign lookup via web browser" msgstr "" #: src/dialogs/confdialog.cxx:9915 msgid "QRZ on line" msgstr "" #: src/dialogs/confdialog.cxx:9916 msgid "Visit QRZ web site" msgstr "Επίσκεψη της σελίδας του QRZ" #: src/dialogs/confdialog.cxx:9921 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:9922 msgid "Visit Hamcall web site" msgstr "Επίσκεψη της σελίδας του Hamcall" #: src/dialogs/confdialog.cxx:9927 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:9928 src/dialogs/confdialog.cxx:9934 msgid "Visit hamQTH web site" msgstr "Επίσκεψη της σελίδας του hamQTH" #: src/dialogs/confdialog.cxx:9933 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:9939 msgid "QRZ" msgstr "" #: src/dialogs/confdialog.cxx:9952 msgid "Hamcall" msgstr "" #: src/dialogs/confdialog.cxx:9965 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:9978 msgid "Callook" msgstr "" #: src/dialogs/confdialog.cxx:9979 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:9994 msgid "Data base lookup" msgstr "" #: src/dialogs/confdialog.cxx:9998 msgid "Do not use callsign database" msgstr "Μη χρήση βάσης δεδομένων διακριτικών κλήσεων" #: src/dialogs/confdialog.cxx:10004 msgid "QRZ cdrom" msgstr "" #: src/dialogs/confdialog.cxx:10005 msgid "Use CD or hard drive CD image" msgstr "" #: src/dialogs/confdialog.cxx:10010 msgid "QRZ.com" msgstr "" #: src/dialogs/confdialog.cxx:10011 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Απαιτείται μια πληρωμένη συνδρομή QRZ \n" "online για να έχετε πρόσβαση" #: src/dialogs/confdialog.cxx:10016 msgid "Hamcall.net" msgstr "" #: src/dialogs/confdialog.cxx:10017 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Απαιτείται μια πληρωμένη συνδρομή Hamcall \n" "online για να έχετε πρόσβαση" #: src/dialogs/confdialog.cxx:10022 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:10023 msgid "Free service courtesy of OK" msgstr "" #: src/dialogs/confdialog.cxx:10028 msgid "Callook.info" msgstr "" #: src/dialogs/confdialog.cxx:10029 msgid "Callook.info lookup (free service US callsigns only)" msgstr "" #: src/dialogs/confdialog.cxx:10035 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" #: src/dialogs/confdialog.cxx:10049 msgid "User name" msgstr "Όνομα χρήστη" #: src/dialogs/confdialog.cxx:10050 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "Όνομα χρήστη για τα QRZ / Hamcall / HamQTH" #: src/dialogs/confdialog.cxx:10064 src/dialogs/confdialog.cxx:11521 #: src/dialogs/confdialog.cxx:11637 msgid "Password" msgstr "Κωδικός" #: src/dialogs/confdialog.cxx:10065 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "Ο κωδικός για τα QRZ / Hamcall / HamQTH" #: src/dialogs/confdialog.cxx:10081 src/dialogs/confdialog.cxx:11538 #: src/dialogs/confdialog.cxx:11722 msgid "Show password in plain text" msgstr "Εμφάνιση κωδικού ως απλό κείμενο" #: src/dialogs/confdialog.cxx:10086 msgid "Add address to notes field" msgstr "Προσθ. διεύθυνσης στο πεδίο σημειώσεων" #: src/dialogs/confdialog.cxx:10091 msgid "clear old data" msgstr "εκκαθ.παλιών δεδομ." #: src/dialogs/confdialog.cxx:10105 msgid "Call/cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10109 msgid "cty.dat folder" msgstr "Φάκελος cty.dat" #: src/dialogs/confdialog.cxx:10110 msgid "Enter full path-name for cty.dat folder" msgstr "Εισάγετε πλήρη διαδρομή αρχείου για το cty.dat" #: src/dialogs/confdialog.cxx:10123 msgid "Browse" msgstr "Εντοπισ." #: src/dialogs/confdialog.cxx:10124 msgid "Locate cty.dat file" msgstr "Εντοπισμός αρχείου cty.dat" #: src/dialogs/confdialog.cxx:10127 src/dialogs/confdialog.cxx:10390 #: src/dialogs/confdialog.cxx:10410 src/dialogs/confdialog.cxx:10427 #: src/dialogs/confdialog.cxx:10457 src/dialogs/confdialog.cxx:10661 #: src/dialogs/confdialog.cxx:10717 src/dialogs/confdialog.cxx:11249 #: src/dialogs/confdialog.cxx:11445 src/dialogs/confdialog.cxx:12067 #: src/dialogs/confdialog.cxx:16947 src/dialogs/confdialog.cxx:17032 #: src/dialogs/confdialog.cxx:17046 src/dialogs/confdialog.cxx:17093 #: src/dialogs/confdialog.cxx:17159 src/dialogs/confdialog.cxx:17348 #: src/dialogs/confdialog.cxx:18931 src/dialogs/confdialog.cxx:20169 msgid "Default" msgstr "Επαναφ." #: src/dialogs/confdialog.cxx:10128 msgid "Restore cty.dat default folder" msgstr "Επαναφέρει τον αρχικό φάκελο του cty.dat" #: src/dialogs/confdialog.cxx:10131 msgid "Reload" msgstr "Επαναφορτ." #: src/dialogs/confdialog.cxx:10132 msgid "Reload cty.dat" msgstr "Ξαναφορτώνει το αρχείο cty.dat" #: src/dialogs/confdialog.cxx:10135 src/dialogs/confdialog.cxx:10137 msgid "Call/Cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10141 src/dialogs/confdialog.cxx:10249 #: src/dialogs/confdialog.cxx:10251 #, fuzzy #| msgid "Colors-Fonts/Buttons" msgid "Colors-Fonts/Buttons-Menus" msgstr "Χρώματα-Γραμματοσειρές/Κουμπιά" #: src/dialogs/confdialog.cxx:10145 msgid "Spot" msgstr "" #: src/dialogs/confdialog.cxx:10148 msgid "Rev" msgstr "" #: src/dialogs/confdialog.cxx:10151 msgid "Tune" msgstr "" #: src/dialogs/confdialog.cxx:10154 msgid "RxID nar" msgstr "" #: src/dialogs/confdialog.cxx:10157 msgid "Lk" msgstr "" #: src/dialogs/confdialog.cxx:10160 msgid "SQL-1" msgstr "" #: src/dialogs/confdialog.cxx:10163 msgid "T/R" msgstr "" #: src/dialogs/confdialog.cxx:10166 msgid "RxID wide" msgstr "" #: src/dialogs/confdialog.cxx:10169 msgid "AFC" msgstr "" #: src/dialogs/confdialog.cxx:10172 msgid "SQL-2" msgstr "" #: src/dialogs/confdialog.cxx:10175 msgid "TxID" msgstr "" #: src/dialogs/confdialog.cxx:10225 msgid "Lighted Btns" msgstr "" #: src/dialogs/confdialog.cxx:10232 #, fuzzy #| msgid "Check" msgid "Check Btns" msgstr "Έλεγχος" #: src/dialogs/confdialog.cxx:10239 msgid "Round Btns" msgstr "" #: src/dialogs/confdialog.cxx:10246 msgid "Menu font" msgstr "" #: src/dialogs/confdialog.cxx:10254 src/dialogs/confdialog.cxx:10328 #: src/dialogs/confdialog.cxx:10330 msgid "Colors-Fonts/FreqDisp - Meters" msgstr "Χρώματα-Γραμματοσειρές/FreqDisp - Meters" #: src/dialogs/confdialog.cxx:10260 msgid "14070.150" msgstr "" #: src/dialogs/confdialog.cxx:10269 src/dialogs/confdialog.cxx:10387 #: src/dialogs/confdialog.cxx:10407 src/dialogs/confdialog.cxx:10424 #: src/dialogs/confdialog.cxx:10449 msgid "Font" msgstr "Γραμματ." #: src/dialogs/confdialog.cxx:10272 src/dialogs/confdialog.cxx:10286 #: src/dialogs/confdialog.cxx:10300 src/dialogs/confdialog.cxx:10384 #: src/dialogs/confdialog.cxx:10404 msgid "Bg Color" msgstr "Χρώμα φοντ." #: src/dialogs/confdialog.cxx:10275 msgid "Digit Color" msgstr "Χρώμα ψηφίου" #: src/dialogs/confdialog.cxx:10278 msgid "Sys Colors" msgstr "Χρώμ.συστήμ." #: src/dialogs/confdialog.cxx:10283 msgid "S-meter" msgstr "" #: src/dialogs/confdialog.cxx:10289 src/dialogs/confdialog.cxx:10303 msgid "Scale Color" msgstr "Χρώμα κλίμ." #: src/dialogs/confdialog.cxx:10292 src/dialogs/confdialog.cxx:10306 msgid "Meter Color" msgstr "Χρώμα μετρ." #: src/dialogs/confdialog.cxx:10297 msgid "PWR-meter" msgstr "Μετρητής ισχύος" #: src/dialogs/confdialog.cxx:10309 msgid "Power scale" msgstr "Κλίμακα ισχύος" #: src/dialogs/confdialog.cxx:10310 src/dialogs/confdialog.cxx:19838 msgid "Select the type of FFT prefilter" msgstr "" #: src/dialogs/confdialog.cxx:10321 msgid "25 W" msgstr "" #: src/dialogs/confdialog.cxx:10333 src/dialogs/confdialog.cxx:10366 #: src/dialogs/confdialog.cxx:10368 msgid "Colors-Fonts/Function keys" msgstr "Χρώματα-Γραμματοσειρές/Function keys" #: src/dialogs/confdialog.cxx:10337 msgid "Use colored buttons" msgstr "Χρήση έγχρ.κουμπιών" #: src/dialogs/confdialog.cxx:10342 msgid "Group 1" msgstr "Ομάδα 1" #: src/dialogs/confdialog.cxx:10343 msgid "Background color for Function key group 1" msgstr "Χρώμα φόντου για την Ομάδα 1 των πλήκτρων F" #: src/dialogs/confdialog.cxx:10348 msgid "Group 2" msgstr "Ομάδα 2" #: src/dialogs/confdialog.cxx:10349 msgid "Background color for Function key group 2" msgstr "Χρώμα φόντου για την Ομάδα 2 των πλήκτρων F" #: src/dialogs/confdialog.cxx:10354 msgid "Group 3" msgstr "Ομάδα 3" #: src/dialogs/confdialog.cxx:10355 msgid "Background color for Function key group 3" msgstr "Χρώμα φόντου για την Ομάδα 3 των πλήκτρων F" #: src/dialogs/confdialog.cxx:10360 src/dialogs/confdialog.cxx:10555 #: src/dialogs/confdialog.cxx:12036 src/dialogs/confdialog.cxx:14187 #: src/dialogs/confdialog.cxx:18180 src/logbook/lgbook.cxx:828 msgid "Defaults" msgstr "Αρχικές ρυθμ." #: src/dialogs/confdialog.cxx:10363 msgid "Font/Color" msgstr "Χρώμ./Γραμμ." #: src/dialogs/confdialog.cxx:10371 src/dialogs/confdialog.cxx:10462 #: src/dialogs/confdialog.cxx:10464 msgid "Colors-Fonts/Logging controls" msgstr "Χρώματα-Γραμματοσειρές/Logging controls" #: src/dialogs/confdialog.cxx:10375 msgid "Logging Panel Controls" msgstr "" #: src/dialogs/confdialog.cxx:10395 msgid "Logbook Dialog" msgstr "" #: src/dialogs/confdialog.cxx:10415 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:10418 msgid "Report Browser" msgstr "" #: src/dialogs/confdialog.cxx:10430 msgid "Even Lines" msgstr "Ζυγές γραμ." #: src/dialogs/confdialog.cxx:10435 msgid "Odd Lines" msgstr "Μονές γραμ." #: src/dialogs/confdialog.cxx:10440 msgid "Stream Text" msgstr "" #: src/dialogs/confdialog.cxx:10446 msgid "Bg color" msgstr "" #: src/dialogs/confdialog.cxx:10452 msgid "Alt Color" msgstr "" #: src/dialogs/confdialog.cxx:10453 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:10467 src/dialogs/confdialog.cxx:10565 #: src/dialogs/confdialog.cxx:10567 msgid "Colors-Fonts/Rx-Tx" msgstr "Χρώματα-Γραμματοσειρές/Rx-Tx" #: src/dialogs/confdialog.cxx:10471 msgid "Rx/Tx Character set" msgstr "Κωδικοποίηση χαρακτήρων Rx/Tx" #: src/dialogs/confdialog.cxx:10472 msgid "Select Rx/Tx Character Set" msgstr "" "Επιλογή της κωδικοποίησης χαρακτήρων του Λαμβανόμενου και Εκπεμπόμενου " "κειμένου" #: src/dialogs/confdialog.cxx:10492 msgid "Rx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:10495 msgid "Tx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:10504 msgid "Rx font" msgstr "" #: src/dialogs/confdialog.cxx:10507 msgid "Tx font" msgstr "" #: src/dialogs/confdialog.cxx:10516 msgid "Macro Edit Font" msgstr "" #: src/dialogs/confdialog.cxx:10519 msgid "Text Highlighting" msgstr "Επισήμανση κειμένου" #: src/dialogs/confdialog.cxx:10522 src/dialogs/confdialog.cxx:14169 msgid "XMIT" msgstr "" #: src/dialogs/confdialog.cxx:10523 msgid "Sent chars in Rx/Tx pane" msgstr "Απεσταλμένοι χαρακτήρες στους πίνακες Εκπομπής/Λήψης" #: src/dialogs/confdialog.cxx:10528 msgid "CTRL" msgstr "" #: src/dialogs/confdialog.cxx:10529 msgid "Control chars in Rx/Tx pane" msgstr "Χαρακτήρες ελέγχου στους πίνακες Λήψης/Εκπομπής" #: src/dialogs/confdialog.cxx:10534 msgid "SKIP" msgstr "" #: src/dialogs/confdialog.cxx:10535 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Χαρακτήρες που παραλείφθηκαν στον πίνακα Εκπομπής\n" "(Tx on/off στο CW)" #: src/dialogs/confdialog.cxx:10540 msgid "ALTR" msgstr "" #: src/dialogs/confdialog.cxx:10541 msgid "Alternate character color in Rx panelr" msgstr "Εναλλακτικό χρώμα χαρακτήρων στον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:10546 msgid "SEL" msgstr "" #: src/dialogs/confdialog.cxx:10547 msgid "Selection background color in Rx Tx panels" msgstr "" #: src/dialogs/confdialog.cxx:10552 src/dialogs/confdialog.cxx:10577 msgid "System" msgstr "Σύστημα" #: src/dialogs/confdialog.cxx:10560 msgid "display Rx control chars as ascii string" msgstr "Εμφάνιση των λαμβανομένων χαρακτ.ελέγχου ως ascii string" #: src/dialogs/confdialog.cxx:10570 src/dialogs/confdialog.cxx:10580 #: src/dialogs/confdialog.cxx:10582 msgid "Colors-Fonts/Tabs" msgstr "Χρώματα-Γραμματοσειρές/Καρτέλες" #: src/dialogs/confdialog.cxx:10574 msgid "Tab Color" msgstr "" #: src/dialogs/confdialog.cxx:10585 src/dialogs/confdialog.cxx:10670 #: src/dialogs/confdialog.cxx:10672 msgid "Colors-Fonts/Signal Level" msgstr "Χρώματα-Γραμματοσειρές/Επίπεδα σήματος" #: src/dialogs/confdialog.cxx:10589 msgid "Signal Level Indicator" msgstr "Ένδειξη στάθμης σήματος" #: src/dialogs/confdialog.cxx:10596 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18866 msgid "Low" msgstr "" #: src/dialogs/confdialog.cxx:10604 src/dialogs/confdialog.cxx:18874 msgid "" "Transition\n" "Level (dB)" msgstr "" #: src/dialogs/confdialog.cxx:10612 src/dialogs/confdialog.cxx:18882 msgid "Normal" msgstr "" #: src/dialogs/confdialog.cxx:10627 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18897 msgid "High" msgstr "" #: src/dialogs/confdialog.cxx:10642 src/dialogs/confdialog.cxx:18912 msgid "Over" msgstr "" #: src/dialogs/confdialog.cxx:10645 src/dialogs/confdialog.cxx:10648 #: src/dialogs/confdialog.cxx:10714 src/dialogs/confdialog.cxx:18915 #: src/dialogs/confdialog.cxx:18918 msgid "label" msgstr "" #: src/dialogs/confdialog.cxx:10659 src/dialogs/confdialog.cxx:18929 msgid "Input signal level" msgstr "Επίπεδο σήματος εισόδου" #: src/dialogs/confdialog.cxx:10664 src/dialogs/confdialog.cxx:18934 msgid "Use wsjtx scale" msgstr "Χρήση κλίμακας του wsjtx" #: src/dialogs/confdialog.cxx:10665 src/dialogs/confdialog.cxx:18935 msgid "" "default scale is audo \"Vu Meter\"\n" "enable to emulate wsjtx scale" msgstr "" "Η προεπιλεγμένη κλίμακα είναι audo \"Vu Meter\"\n" "ενεργοποιήστε για εξομοίωση της κλίμακας του wsjtx" #: src/dialogs/confdialog.cxx:10676 src/dialogs/confdialog.cxx:10736 #: src/dialogs/confdialog.cxx:10738 #, fuzzy #| msgid "Colors-Fonts/Tabs" msgid "Colors-Fonts/Digiscope" msgstr "Χρώματα-Γραμματοσειρές/Καρτέλες" #: src/dialogs/confdialog.cxx:10680 #, fuzzy #| msgid "Digit Color" msgid "Digital Scope Colors" msgstr "Χρώμα ψηφίου" #: src/dialogs/confdialog.cxx:10687 msgid "Background" msgstr "" #: src/dialogs/confdialog.cxx:10695 src/dialogs/confdialog.cxx:13791 msgid "Axis" msgstr "" #: src/dialogs/confdialog.cxx:10703 #, fuzzy #| msgid "Color" msgid "Color 1" msgstr "Χρώμα" #: src/dialogs/confdialog.cxx:10711 #, fuzzy #| msgid "Color" msgid "Color 2" msgstr "Χρώμα" #: src/dialogs/confdialog.cxx:10725 #, fuzzy #| msgid "Color" msgid "Color 3" msgstr "Χρώμα" #: src/dialogs/confdialog.cxx:10733 #, fuzzy #| msgid "Color" msgid "Color 4" msgstr "Χρώμα" #: src/dialogs/confdialog.cxx:10742 src/dialogs/confdialog.cxx:10946 #: src/dialogs/confdialog.cxx:10948 msgid "Contests/General" msgstr "Contests/Γενικά" #: src/dialogs/confdialog.cxx:10747 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:10762 msgid "State QSO Party" msgstr "" #: src/dialogs/confdialog.cxx:10778 msgid "Text capture order" msgstr "Σειρά καταγρ. κειμένου" #: src/dialogs/confdialog.cxx:10779 msgid "Context Notes" msgstr "" #: src/dialogs/confdialog.cxx:10791 msgid "Duplicate check, CALL plus" msgstr "Έλεγχος διπλότυπου CALL συν" #: src/dialogs/confdialog.cxx:10794 msgid "On/Off" msgstr "" #: src/dialogs/confdialog.cxx:10795 msgid "Check for duplicates" msgstr "Έλεγχος για διπλότυπα" #: src/dialogs/confdialog.cxx:10800 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:677 src/logbook/lgbook.cxx:1391 msgid "Band" msgstr "Μπάντα" #: src/dialogs/confdialog.cxx:10801 msgid "Bands must match" msgstr "Η μπάντα πρέπει να είναι ίδια" #: src/dialogs/confdialog.cxx:10806 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:680 src/logbook/lgbook.cxx:955 #: src/logbook/lgbook.cxx:1619 src/logbook/lgbook.cxx:1674 msgid "Mode" msgstr "" #: src/dialogs/confdialog.cxx:10807 msgid "Mode must match" msgstr "Το Mode πρέπει να είναι ίδιο" #: src/dialogs/confdialog.cxx:10812 msgid "Time span over" msgstr "Διαφορά ώρας πάνω από" #: src/dialogs/confdialog.cxx:10813 msgid "QSO must not occur within a time period of" msgstr "Δεν πρέπει να γίνει QSO μέσα σε αυτό το χρονικά διάστημα" #: src/dialogs/confdialog.cxx:10818 msgid "Dup Color" msgstr "Χρώμα Dup" #: src/dialogs/confdialog.cxx:10819 msgid "Left click to select dup color" msgstr "Αριστερό κλικ για επιλογή χρώματος διπλότυπων" #: src/dialogs/confdialog.cxx:10827 msgid "? Dup Color" msgstr "Χρώμ.πιθανού Dup" #: src/dialogs/confdialog.cxx:10828 msgid "Left click to select possible dup color" msgstr "Αριστερό κλικ για επιλογή χρώματος πιθανών διπλότυπων" #: src/dialogs/confdialog.cxx:10837 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:10843 msgid "State must match" msgstr "Η πολιτεία πρέπει να είναι ίδια" #: src/dialogs/confdialog.cxx:10848 msgid "minutes" msgstr "λεπτά" #: src/dialogs/confdialog.cxx:10849 msgid "Enter time span in minutes" msgstr "Εισαγωγή χρονικού διαστήματος σε λεπτά" #: src/dialogs/confdialog.cxx:10867 msgid "Contest Exchange / Serial #" msgstr "Ανταλλαγές Contest / σειριακός αριθμ." #: src/dialogs/confdialog.cxx:10870 src/dialogs/confdialog.cxx:11704 msgid "Send" msgstr "Αποστολή" #: src/dialogs/confdialog.cxx:10871 msgid "free form exchange" msgstr "" #: src/dialogs/confdialog.cxx:10885 msgid "RST always 599/59" msgstr "RST πάντα 599/59" #: src/dialogs/confdialog.cxx:10886 msgid "Force RST in/out to 599/59" msgstr "RST out 599/59 από προεπιλογή" #: src/dialogs/confdialog.cxx:10891 msgid "Send CW cut #'s" msgstr "" #: src/dialogs/confdialog.cxx:10892 msgid "0 = T; 9 = N" msgstr "" #: src/dialogs/confdialog.cxx:10899 msgid "Start Nbr" msgstr "Αρχικός αριθ." #: src/dialogs/confdialog.cxx:10900 msgid "Starting number" msgstr "Αρχικός αριθμός" #: src/dialogs/confdialog.cxx:10915 msgid "Digits" msgstr "Ψηφία" #: src/dialogs/confdialog.cxx:10916 msgid "Number of digits in serial number" msgstr "Αριθμός ψηφίων στον σειριακό αριθμό" #: src/dialogs/confdialog.cxx:10932 msgid "Use leading zeros" msgstr "Χρήση αρχικών μηδενικών" #: src/dialogs/confdialog.cxx:10933 msgid "Insert leading zeros into Xmtd serial number" msgstr "Προσθήκη αρχικών μηδενικών στον εκπεμπόμενο σειριακό αριθμό" #: src/dialogs/confdialog.cxx:10938 src/dialogs/confdialog.cxx:15083 #: src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Επαναφ." #: src/dialogs/confdialog.cxx:10939 msgid "Initialize the QSO logging fields" msgstr "Αρχικοποίηση των QSO logging πεδίων" #: src/dialogs/confdialog.cxx:10951 src/dialogs/confdialog.cxx:11000 #: src/dialogs/confdialog.cxx:11002 msgid "Contests/Field Day" msgstr "" #: src/dialogs/confdialog.cxx:10955 src/logbook/lgbook.cxx:1255 msgid "Operator Call" msgstr "Χαρακτηριστ. Χειριστή" #: src/dialogs/confdialog.cxx:10956 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:10970 msgid "My Section" msgstr "" #: src/dialogs/confdialog.cxx:10971 msgid "Field Day Section" msgstr "" #: src/dialogs/confdialog.cxx:10985 src/dialogs/confdialog.cxx:11012 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:10986 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:11005 src/dialogs/confdialog.cxx:11064 #: src/dialogs/confdialog.cxx:11066 msgid "Contests/JOTA School" msgstr "" #: src/dialogs/confdialog.cxx:11009 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:11013 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:11029 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:11032 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:11033 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:11047 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:11048 msgid "Scout Operator Name" msgstr "" #: src/dialogs/confdialog.cxx:11070 src/dialogs/confdialog.cxx:11109 #: src/dialogs/confdialog.cxx:11111 msgid "IDs/CW" msgstr "" #: src/dialogs/confdialog.cxx:11074 msgid "CW Postamble ID" msgstr "" #: src/dialogs/confdialog.cxx:11077 msgid "Transmit callsign" msgstr "Εκπομπή callsign" #: src/dialogs/confdialog.cxx:11078 msgid "Send Callsign in CW at end of every transmission" msgstr "Αποστολή του callsign σε CW στο τέλος κάθε εκπομπής" #: src/dialogs/confdialog.cxx:11083 msgid "Speed (WPM):" msgstr "Ταχύτητα (WPM):" #: src/dialogs/confdialog.cxx:11084 msgid "Send at this WPM" msgstr "" #: src/dialogs/confdialog.cxx:11104 msgid "CW ID modes" msgstr "" #: src/dialogs/confdialog.cxx:11114 src/dialogs/confdialog.cxx:11254 #: src/dialogs/confdialog.cxx:11256 msgid "IDs/RsID" msgstr "" #: src/dialogs/confdialog.cxx:11118 msgid "Reed-Solomon ID (Rx)" msgstr "" #: src/dialogs/confdialog.cxx:11121 msgid "Notify only" msgstr "Μόνο ενημέρωση" #: src/dialogs/confdialog.cxx:11122 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Επιλέξτε το ώστε να ειδοποιείστε όταν ένα σήμα RSID ληφθεί\n" "χωρίς να αλλάξει η συχνότητα και το modem" #: src/dialogs/confdialog.cxx:11128 msgid "Rx modes" msgstr "" #: src/dialogs/confdialog.cxx:11131 msgid "Mark prev freq/mode" msgstr "Σημαδ.προηγ.συχν./mode" #: src/dialogs/confdialog.cxx:11132 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Εισαγωγή σημαδιού στο κείμενο Λήψης πρίν\n" "την αλλαγή συχνότητας και modem" #: src/dialogs/confdialog.cxx:11137 msgid "Allow errors" msgstr "Να επιτρέπονται λάθη" #: src/dialogs/confdialog.cxx:11138 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:11149 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:11154 msgid "Disable alert dialog" msgstr "Απενεργοποίηση διαλόγου ειδοποίησης" #: src/dialogs/confdialog.cxx:11155 msgid "Do not show RsID alert dialog box" msgstr "Να μην εμφανίζεται το παράθυρο διαλόγου προειδοποίησης RsID" #: src/dialogs/confdialog.cxx:11160 msgid "Disables detector" msgstr "Απενεργοποίηση ανίχνευσης" #: src/dialogs/confdialog.cxx:11161 msgid "Disable further detection when RSID is received" msgstr "Απενεργοπoiεί περαιτέρω ανίχνευση όταν γίνει λήψη ενός RSID" #: src/dialogs/confdialog.cxx:11168 msgid "Retain tx freq lock" msgstr "Διατήρηση κλειδώματος συχνότητας TX" #: src/dialogs/confdialog.cxx:11169 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" "Διατήρηση της συχνότητας κλειδώματος TX (Lk) όταν μεταβαίνει στην συχνότητα " "του RX RsID" #: src/dialogs/confdialog.cxx:11174 msgid "Disable freq change" msgstr "Απενεργ.αλλαγή συχν." #: src/dialogs/confdialog.cxx:11175 src/dialogs/confdialog.cxx:11181 msgid "Do not automatically change to RX RsID frequency" msgstr "Χωρίς αυτόματη μετάβαση στην συχνότητα λήψης RsID" #: src/dialogs/confdialog.cxx:11180 msgid "Rx/Tx RsID EOT" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "Squelch open (sec)" msgstr "" #: src/dialogs/confdialog.cxx:11187 src/dialogs/confdialog.cxx:11208 msgid "Use for triggering amplifier carrier detect" msgstr "" #: src/dialogs/confdialog.cxx:11196 msgid "" "The RsID notification message contents and display\n" "characteristics are configured on the \"Notifications\" tab." msgstr "" "Τα περιεχόμενα του μηνύματος ειδοποίησης RsID και τα χαρακτηριστικά\n" "εμφάνισης, ρυθμίζονται στο μενού \"Ρύθμιση/Ειδοποιήσεις\"." #: src/dialogs/confdialog.cxx:11204 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Seconds" msgstr "Δευτερόλεπτα" #: src/dialogs/confdialog.cxx:11216 msgid "Reed-Solomon ID (Tx)" msgstr "" #: src/dialogs/confdialog.cxx:11219 msgid "Transmit modes" msgstr "" #: src/dialogs/confdialog.cxx:11222 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:11223 msgid "Add RsID signal to end of transmission" msgstr "" #: src/dialogs/confdialog.cxx:11230 #, fuzzy #| msgid "RsID detection" msgid "Min BW Detection" msgstr "Ανίχνευση RsID" #: src/dialogs/confdialog.cxx:11233 msgid "Hertz" msgstr "" #: src/dialogs/confdialog.cxx:11234 #, fuzzy #| msgid "Filter bandwidth" msgid "Minimum bandwidth" msgstr "Εύρος ζώνης φίλτρου" #: src/dialogs/confdialog.cxx:11243 #, fuzzy #| msgid "Password" msgid "Passband" msgstr "Κωδικός" #: src/dialogs/confdialog.cxx:11244 #, fuzzy #| msgid "" #| "ON - search over entire waterfall\n" #| "OFF - limit search to +/- 200 Hz" msgid "" "ON - search over entire waterfall\n" "OFF - limit search to BW selector" msgstr "" "ON - αναζήτηση σε όλο τον καταρράκτη\n" "OFF - περιορισμός αναζήτησης σε +/- 200 Hz" #: src/dialogs/confdialog.cxx:11259 src/dialogs/confdialog.cxx:11335 #: src/dialogs/confdialog.cxx:11337 msgid "IDs/Video" msgstr "" #: src/dialogs/confdialog.cxx:11263 msgid "Video Preamble ID" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Transmit mode ID" msgstr "" #: src/dialogs/confdialog.cxx:11267 msgid "Waterfall video ID" msgstr "" #: src/dialogs/confdialog.cxx:11271 msgid "Transmit video text" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Waterfall video text" msgstr "" #: src/dialogs/confdialog.cxx:11277 msgid ":" msgstr "" #: src/dialogs/confdialog.cxx:11278 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" #: src/dialogs/confdialog.cxx:11292 msgid "Use small font" msgstr "Μικρή γραμματ." #: src/dialogs/confdialog.cxx:11293 msgid "" "ON - small font\n" "OFF - large font" msgstr "" #: src/dialogs/confdialog.cxx:11299 msgid "Chars/Row:" msgstr "Χαρακτ./γραμμή:" #: src/dialogs/confdialog.cxx:11300 msgid "Set the number of characters per row" msgstr "Ορισμός του αριθμού χαρακτήρων ανά σειρά" #: src/dialogs/confdialog.cxx:11320 msgid "500 Hz limit" msgstr "" #: src/dialogs/confdialog.cxx:11325 msgid "Mode width limit" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid "Video ID modes" msgstr "" #: src/dialogs/confdialog.cxx:11341 src/dialogs/confdialog.cxx:11398 #: src/dialogs/confdialog.cxx:11400 msgid "Logging/MacLogger" msgstr "" #: src/dialogs/confdialog.cxx:11345 msgid "Connect to MacLogger" msgstr "" #: src/dialogs/confdialog.cxx:11350 msgid "Capture Radio Report" msgstr "" #: src/dialogs/confdialog.cxx:11356 msgid "Capture Log Report" msgstr "" #: src/dialogs/confdialog.cxx:11361 msgid "Capture Lookup " msgstr "" #: src/dialogs/confdialog.cxx:11366 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:11371 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid "Enable UDP log file" msgstr "" #: src/dialogs/confdialog.cxx:11381 msgid "UDP data stream" msgstr "" #: src/dialogs/confdialog.cxx:11389 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:11392 msgid "Tune to Rx Spot" msgstr "" #: src/dialogs/confdialog.cxx:11393 msgid "" "ON - use Rx spot freq\n" "OFF - use Tx spot freq" msgstr "" #: src/dialogs/confdialog.cxx:11403 src/dialogs/confdialog.cxx:11482 #: src/dialogs/confdialog.cxx:11484 msgid "Logging/N3FJP logs" msgstr "" #: src/dialogs/confdialog.cxx:11407 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:11412 msgid "Clear text" msgstr "Καθαρ.κειμένου" #: src/dialogs/confdialog.cxx:11415 msgid "Address" msgstr "Διεύθυνση" #: src/dialogs/confdialog.cxx:11416 msgid "N3FJP Server IP Address" msgstr "Διεύθυνση IP του N3FJP Server" #: src/dialogs/confdialog.cxx:11430 src/dialogs/confdialog.cxx:15264 #: src/dialogs/confdialog.cxx:15288 src/dialogs/confdialog.cxx:15528 #: src/dialogs/confdialog.cxx:17016 src/dialogs/confdialog.cxx:17068 #: src/dialogs/confdialog.cxx:17115 src/dialogs/confdialog.cxx:17148 #: src/dialogs/confdialog.cxx:17368 msgid "Port" msgstr "Θύρα" #: src/dialogs/confdialog.cxx:11431 msgid "N3FJP Server IP Port" msgstr "Θύρα του N3FJP Server" #: src/dialogs/confdialog.cxx:11446 src/dialogs/confdialog.cxx:16948 #: src/dialogs/confdialog.cxx:17033 src/dialogs/confdialog.cxx:17047 #: src/dialogs/confdialog.cxx:17094 src/dialogs/confdialog.cxx:17160 #: src/dialogs/confdialog.cxx:17349 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" "Επιστροφή της διεύθυνση IP και του αριθμού\n" "θύρας στην προεπιλεγμένη τιμή." #: src/dialogs/confdialog.cxx:11449 msgid "Enable Data Stream" msgstr "Ενεργοποίηση ροής δεδομένων" #: src/dialogs/confdialog.cxx:11454 src/dialogs/confdialog.cxx:12842 #: src/dialogs/confdialog.cxx:13091 src/dialogs/confdialog.cxx:13390 #: src/dialogs/confdialog.cxx:15159 src/dialogs/confdialog.cxx:15543 msgid "Connect" msgstr "Σύνδεση" #: src/dialogs/confdialog.cxx:11459 src/dialogs/confdialog.cxx:16450 msgid "Connected" msgstr "Συνδεδεμένο" #: src/dialogs/confdialog.cxx:11465 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:11466 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:11471 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:11472 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:11487 src/dialogs/confdialog.cxx:11614 #: src/dialogs/confdialog.cxx:11616 msgid "Logging/eQSL" msgstr "" #: src/dialogs/confdialog.cxx:11491 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:11492 src/dialogs/confdialog.cxx:11507 #: src/dialogs/confdialog.cxx:11542 msgid "Your login name" msgstr "" #: src/dialogs/confdialog.cxx:11506 msgid "User ID" msgstr "" #: src/dialogs/confdialog.cxx:11522 msgid "Your login password" msgstr "" #: src/dialogs/confdialog.cxx:11541 msgid "QTH Nickname" msgstr "" #: src/dialogs/confdialog.cxx:11556 msgid "Verify" msgstr "Επιβεβ." #: src/dialogs/confdialog.cxx:11557 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:11560 msgid "Options" msgstr "Επιλογές" #: src/dialogs/confdialog.cxx:11563 msgid "send when logged (log button, , )" msgstr "Αποστολή όταν γίνει logged (Κουμπί log, , )" #: src/dialogs/confdialog.cxx:11564 msgid "automatic data upload" msgstr "αυτόματο ανέβασμα δεδομένων" #: src/dialogs/confdialog.cxx:11569 msgid "Use date/time off for log entry" msgstr "Χρήση της ημερ./ώρας off για το log" #: src/dialogs/confdialog.cxx:11570 msgid "default uses date/time on" msgstr "Χρήση της ημερ./ώρας on από προεπιλογή" #: src/dialogs/confdialog.cxx:11575 src/dialogs/confdialog.cxx:11690 msgid "Show delivery message" msgstr "Εμφάνιση μηνύματος παράδοσης" #: src/dialogs/confdialog.cxx:11576 src/dialogs/confdialog.cxx:11691 msgid "Display timed delivery message if enabled" msgstr "Εμφάνιση μηνύματος παράδοσης εάν ενεργοποιηθεί" #: src/dialogs/confdialog.cxx:11581 msgid "Default message" msgstr "Προεπιλεγμένο μήνυμα" #: src/dialogs/confdialog.cxx:11582 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:11596 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:11599 msgid " {CALL} other ops call sign" msgstr "" #: src/dialogs/confdialog.cxx:11602 msgid " {MODE} full mode / submode" msgstr "" #: src/dialogs/confdialog.cxx:11605 msgid "{NAME} other ops name" msgstr "" #: src/dialogs/confdialog.cxx:11608 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:11619 src/dialogs/confdialog.cxx:11751 #: src/dialogs/confdialog.cxx:11753 msgid "Logging/LoTW" msgstr "" #: src/dialogs/confdialog.cxx:11623 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:11624 msgid "Enter full path-filename for tqsl executable" msgstr "Εισάγετε πλήρη διαδρομή και αρχείο του tqsl" #: src/dialogs/confdialog.cxx:11638 msgid "Your tqsl login password" msgstr "Ο κωδικός πρόσβασης του tqsl" #: src/dialogs/confdialog.cxx:11653 msgid "Password required" msgstr "Απαιτείται κωδικός" #: src/dialogs/confdialog.cxx:11654 msgid "Submit password with each upload" msgstr "Εισαγωγή κωδικού πρόσβασης σε κάθε μεταφόρτωση" #: src/dialogs/confdialog.cxx:11659 msgid "Location" msgstr "Τοποθεσία" #: src/dialogs/confdialog.cxx:11660 msgid "tqsl station location" msgstr "Τοποθεσία σταθμού tqsl" #: src/dialogs/confdialog.cxx:11674 src/dialogs/confdialog.cxx:16002 #: src/dialogs/confdialog.cxx:16020 src/dialogs/confdialog.cxx:16038 #: src/dialogs/confdialog.cxx:16056 src/dialogs/confdialog.cxx:16074 #: src/dialogs/confdialog.cxx:16092 src/dialogs/confdialog.cxx:16110 msgid "Locate" msgstr "Εντοπισμός" #: src/dialogs/confdialog.cxx:11675 msgid "Locate tqsl executable" msgstr "Εντοπισμός εκτελέσιμου tqsl" #: src/dialogs/confdialog.cxx:11678 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "Ήσυχη λειτουργία [-q], χωρίς άνοιγμα διαλόγου tqsl" #: src/dialogs/confdialog.cxx:11679 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Send QSO data to LoTW when logged" msgstr "Αποστολή του QSO στο LoTW όταν γίνει logged" #: src/dialogs/confdialog.cxx:11685 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:11696 msgid "Export" msgstr "Εξαγωγή" #: src/dialogs/confdialog.cxx:11697 msgid "Export records for LoTW upload" msgstr "Εξαγωγή εγγραφών για ανέβασμα στο LoTW" #: src/dialogs/confdialog.cxx:11700 src/logbook/lgbook.cxx:770 #: src/logbook/lgbook.cxx:1403 src/logbook/lgbook.cxx:1456 msgid "Check" msgstr "Έλεγχος" #: src/dialogs/confdialog.cxx:11701 msgid "Review lotw.adif file before sending with tqsl" msgstr "Έλεγχος του αρχείου lotw.adif πριν την αποστολή με το tqsl" #: src/dialogs/confdialog.cxx:11705 msgid "Send lotw.adif via tqsl" msgstr "Αποστολή του lotw.adif με το tqsl" #: src/dialogs/confdialog.cxx:11708 msgid "Export logbook records for LoTW upload" msgstr "Εξαγωγή εγγραφών του logbook για ανέβασμα στο LoTW" #: src/dialogs/confdialog.cxx:11711 msgid "Review / edit the exported LoTW upload adif file" msgstr "Έλεγχος/επεξερ. του αρχείου adif προς αποστολή στο LoTW" #: src/dialogs/confdialog.cxx:11714 msgid "Submit the upload adif file to LoTW" msgstr "Υποβολή του αρχείου adif στο LoTW" #: src/dialogs/confdialog.cxx:11717 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" "Θα πρέπει να έχετε το tqsl εγκατεστημένο και την τοποθεσία του καταχωρημένη " "για να ενημερώνεται το LoTW!" #: src/dialogs/confdialog.cxx:11725 msgid "Use this tqsl station location" msgstr "Χρήση αυτής της τοποθεσίας σταθμού tqsl" #: src/dialogs/confdialog.cxx:11728 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:11729 src/dialogs/confdialog.cxx:11736 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:11732 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:11735 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:11740 msgid "Timeout" msgstr "" #: src/dialogs/confdialog.cxx:11741 msgid "Wait NN seconds for LoTW response" msgstr "Αναμονή NN δευτερόλεπτα για απόκριση LoTW" #: src/dialogs/confdialog.cxx:11756 src/dialogs/confdialog.cxx:11807 #: src/dialogs/confdialog.cxx:11809 msgid "Logging/Cloudlog" msgstr "" #: src/dialogs/confdialog.cxx:11760 msgid "This allows for logging of QSOs to a Cloudlog instance." msgstr "" #: src/dialogs/confdialog.cxx:11764 msgid "Enable Cloudlog API logging" msgstr "" #: src/dialogs/confdialog.cxx:11765 msgid "This enables logging of QSOs to Cloudlog via API" msgstr "" #: src/dialogs/confdialog.cxx:11770 msgid "API URL:" msgstr "" #: src/dialogs/confdialog.cxx:11771 msgid "Enter the URL of your Cloudlog API" msgstr "Εισάγετε τη διεύθυνση URL του Cloudlog API σας" #: src/dialogs/confdialog.cxx:11784 msgid "API Key:" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "Enter the API key for your Cloudlog instance" msgstr "Εισαγάγετε το κλειδί API για την συνεδρία σας στο Cloudlog" #: src/dialogs/confdialog.cxx:11798 msgid "Station ID:" msgstr "" #: src/dialogs/confdialog.cxx:11803 src/dialogs/confdialog.cxx:16485 #: src/dialogs/confdialog.cxx:17555 src/dialogs/confdialog.cxx:17650 #: src/dialogs/confdialog.cxx:18174 src/dialogs/confdialog.cxx:18269 msgid "Initialize" msgstr "" #: src/dialogs/confdialog.cxx:11804 msgid "Test API Key" msgstr "Έλεγχος API Key" #: src/dialogs/confdialog.cxx:11813 src/dialogs/confdialog.cxx:11893 #: src/dialogs/confdialog.cxx:11895 msgid "Logging/QSO logging" msgstr "" #: src/dialogs/confdialog.cxx:11817 msgid "Prompt to save log on exit" msgstr "Ερώτ.για αποθήκ.log κατά την έξοδο" #: src/dialogs/confdialog.cxx:11818 src/dialogs/confdialog.cxx:11887 #: src/dialogs/confdialog.cxx:19222 msgid "Bug me about saving log entries" msgstr "Ερώτηση για αποθήκευση καταχώρησης log" #: src/dialogs/confdialog.cxx:11823 msgid "Clear on save" msgstr "Καθαρισμός κατά την αποθήκευση" #: src/dialogs/confdialog.cxx:11824 msgid "Clear log entries after saving or using macro " msgstr "Καθαρισμός των πεδίων στο log μετά την αποθήκευση της επαφής" #: src/dialogs/confdialog.cxx:11829 msgid "Convert callsign to upper case" msgstr "Μετατροπή callsign σε ΚΕΦΑΛΑΙΑ" #: src/dialogs/confdialog.cxx:11830 msgid "Force callsign field to UPPERCASE" msgstr "Μετατροπή του πεδίου callsign σε ΚΕΦΑΛΑΙΑ" #: src/dialogs/confdialog.cxx:11835 msgid "Auto-fill Country and Azimuth" msgstr "Αυτόμ.συμπλήρ.Χώρας και Αζιμουθίου" #: src/dialogs/confdialog.cxx:11836 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "" "Συμπλήρωση Χώρας / Αζιμουθίου χρησιμοποιώντας πληροφορίες από το αρχείο cty." "dat" #: src/dialogs/confdialog.cxx:11841 msgid "Sort by Date/Time OFF" msgstr "Ταξινόμηση κατά Ημερ/Ώρα OFF" #: src/dialogs/confdialog.cxx:11842 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Η ταξινόμηση κατά Ημερ/Ώρα OFF - επηρεάζει όλες τις αναφορές ADIF/Cabrillo" #: src/dialogs/confdialog.cxx:11847 msgid "Date time ON == OFF" msgstr "Ημερ./Ώρα ON == OFF" #: src/dialogs/confdialog.cxx:11848 msgid "Force date/time ON == date/time OFF" msgstr "Ορισμός υποχρεωτικά Ημερ./Ώρα ON == Ημερ./Ώρα OFF" #: src/dialogs/confdialog.cxx:11853 msgid "Default RST in to 599/59" msgstr "RST in 599/59 από προεπιλογή" #: src/dialogs/confdialog.cxx:11854 msgid "Clear log controls sets RST in to 599/59" msgstr "Αυτόματη συμπλήρωση του πεδίου RST in με 599/59 κατά την εκκαθάριση" #: src/dialogs/confdialog.cxx:11859 msgid "Default RST out to 599/59" msgstr "RST out 599/59 από προεπιλογή" #: src/dialogs/confdialog.cxx:11860 msgid "Clear log controls sets RST out to 599/59" msgstr "Αυτόματη συμπλήρωση του πεδίου RST out με 599/59 κατά την εκκαθάριση" #: src/dialogs/confdialog.cxx:11865 msgid "Transmit Power" msgstr "Ισχύς εκπομπής" #: src/dialogs/confdialog.cxx:11866 msgid "Tx power used for logbook entries" msgstr "Ισχύς εξόδου που χρησιμοποιείται για καταχωρήσεις στο log" #: src/dialogs/confdialog.cxx:11880 msgid "Display logbook read datum at start" msgstr "Εμφάνιση ονόματος αρχείου logbook κατά την εκκίνηση" #: src/dialogs/confdialog.cxx:11881 src/dialogs/confdialog.cxx:19372 msgid "The filename is written to the RX text area" msgstr "Το όνομα αρχείου εμφανίζεται στον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:11886 msgid "Log power meter " msgstr "" #: src/dialogs/confdialog.cxx:11899 src/dialogs/confdialog.cxx:12167 #: src/dialogs/confdialog.cxx:12169 msgid "Modem/CW/General" msgstr "Modem/CW/Γενικά" #: src/dialogs/confdialog.cxx:11906 msgid "SOM decoding" msgstr "Αποκωδικοπ. SOM" #: src/dialogs/confdialog.cxx:11907 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:11913 msgid "WPM Tracking" msgstr "" #: src/dialogs/confdialog.cxx:11914 msgid "Automatic Rx speed tracking" msgstr "Αυτόματη παρακολ.ταχύτητας λήψης" #: src/dialogs/confdialog.cxx:11920 msgid "Filter bandwidth" msgstr "Εύρος ζώνης φίλτρου" #: src/dialogs/confdialog.cxx:11921 msgid "CW dsp filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11941 msgid "Matched Filt'" msgstr "" #: src/dialogs/confdialog.cxx:11942 msgid "Matched Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11948 msgid "Rx WPM" msgstr "" #: src/dialogs/confdialog.cxx:11954 msgid "Tracked CW speed in WPM" msgstr "" #: src/dialogs/confdialog.cxx:11959 msgid "Lower" msgstr "Κατώτατο" #: src/dialogs/confdialog.cxx:11960 msgid "Detector low threshold" msgstr "Κατώτατο κατώφλι ανιχνευτή" #: src/dialogs/confdialog.cxx:11980 msgid "Upper" msgstr "Ανώτατο" #: src/dialogs/confdialog.cxx:11981 msgid "Detector high threshold" msgstr "Ανώτατο κατώφλι ανιχνευτή" #: src/dialogs/confdialog.cxx:12001 msgid "Range" msgstr "Εύρος" #: src/dialogs/confdialog.cxx:12002 msgid "Range +/- wpm" msgstr "Εύρος +/- wpm" #: src/dialogs/confdialog.cxx:12021 msgid "Signal tracking" msgstr "Παρακολουθηση σήματος" #: src/dialogs/confdialog.cxx:12024 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:12030 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:12046 msgid "char WPM" msgstr "χαρακτ. WPM" #: src/dialogs/confdialog.cxx:12047 src/dialogs/confdialog.cxx:12112 #: src/dialogs/confdialog.cxx:12139 msgid "My transmit CW WPM" msgstr "" #: src/dialogs/confdialog.cxx:12068 msgid "The default CW speed" msgstr "" #: src/dialogs/confdialog.cxx:12087 src/dialogs/confdialog.cxx:19811 msgid "Lower limit" msgstr "Κατώτατο όριο" #: src/dialogs/confdialog.cxx:12088 msgid "No slower than this" msgstr "Όχι πιο αργό από αυτό" #: src/dialogs/confdialog.cxx:12099 src/dialogs/confdialog.cxx:19856 msgid "Upper limit" msgstr "Ανώτατο όριο" #: src/dialogs/confdialog.cxx:12100 msgid "No faster than this" msgstr "Όχι γρηγορότερο από αυτό" #: src/dialogs/confdialog.cxx:12111 msgid "text WPM" msgstr "" #: src/dialogs/confdialog.cxx:12132 msgid "Use Farnsworth timing" msgstr "Χρήση χρονισμού Farnsworth" #: src/dialogs/confdialog.cxx:12133 src/dialogs/confdialog.cxx:12160 msgid "text WPM <= char WPM" msgstr "" #: src/dialogs/confdialog.cxx:12138 msgid "Spacing WPM" msgstr "" #: src/dialogs/confdialog.cxx:12159 #, fuzzy #| msgid "Use Farnsworth timing" msgid "Use Wordsworth timing" msgstr "Χρήση χρονισμού Farnsworth" #: src/dialogs/confdialog.cxx:12172 src/dialogs/confdialog.cxx:12370 #: src/dialogs/confdialog.cxx:12372 msgid "Modem/CW/Timing and QSK" msgstr "Modem/CW/Χρονισμός και QSK" #: src/dialogs/confdialog.cxx:12176 msgid "Timing" msgstr "Χρονισμός" #: src/dialogs/confdialog.cxx:12179 src/dialogs/confdialog.cxx:13130 msgid "Dash/Dot" msgstr "Παύλα/Τελεία" #: src/dialogs/confdialog.cxx:12180 src/dialogs/confdialog.cxx:13131 msgid "Dash to dot ratio" msgstr "Λόγος παύλας και τελείας" #: src/dialogs/confdialog.cxx:12198 src/dialogs/confdialog.cxx:12321 msgid "Edge timing" msgstr "" #: src/dialogs/confdialog.cxx:12199 src/dialogs/confdialog.cxx:12322 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:12217 msgid "Edge shape" msgstr "" #: src/dialogs/confdialog.cxx:12218 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:12236 msgid "QSK" msgstr "" #: src/dialogs/confdialog.cxx:12239 msgid "QSK on right audio channel" msgstr "QSK στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:12240 msgid "Generate square wave signal on right channel" msgstr "Δημιουργία σήμα τετραγωνικού κύματος στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:12245 msgid "QSK frequency" msgstr "Συχνότητα QSK" #: src/dialogs/confdialog.cxx:12246 msgid "Fundamental frequency of QSK square wave signal" msgstr "" #: src/dialogs/confdialog.cxx:12265 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:12266 msgid "Msec pre-keydown" msgstr "" #: src/dialogs/confdialog.cxx:12283 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:12284 msgid "Msec post-keydown" msgstr "" #: src/dialogs/confdialog.cxx:12301 msgid "QSK amplitude" msgstr "Πλάτος σήμ. QSK" #: src/dialogs/confdialog.cxx:12302 msgid "Amplitude of right channel QSK signal" msgstr "Πλάτος σήματος QSK στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:12342 msgid "Send Test character" msgstr "Αποστολή χαρακτήρα δοκιμής" #: src/dialogs/confdialog.cxx:12345 msgid "Test char" msgstr "Χαρακτ.δοκιμής" #: src/dialogs/confdialog.cxx:12346 msgid "Test character for QSK adjustment" msgstr "Χαρακτήρας δοκιμής για ρύθμιση QSK" #: src/dialogs/confdialog.cxx:12362 msgid "Send continuously" msgstr "Συνεχής αποστολή" #: src/dialogs/confdialog.cxx:12363 msgid "Send a continuous stream of test characters" msgstr "Αποστολή συνεχούς ροής χαρακτήρων δοκιμής" #: src/dialogs/confdialog.cxx:12375 src/dialogs/confdialog.cxx:12580 #: src/dialogs/confdialog.cxx:12582 msgid "Modem/CW/Prosigns" msgstr "" #: src/dialogs/confdialog.cxx:12379 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" "Να χρησιμοποιούνται αυτά\n" "για τα WinKeyer και nanoCW" #: src/dialogs/confdialog.cxx:12382 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:12383 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:12385 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:12386 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:12388 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:12389 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:12391 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:12392 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:12394 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:12395 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:12397 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:12398 src/dialogs/confdialog.cxx:12401 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:12400 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:12403 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:12404 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:12406 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:12407 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:12409 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:12410 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:12412 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:12413 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:12417 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12434 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12451 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12468 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12484 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12501 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12535 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12552 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12569 msgid "Use '(' paren not KN" msgstr "" #: src/dialogs/confdialog.cxx:12574 msgid "Display decoded as assigned key" msgstr "" #: src/dialogs/confdialog.cxx:12575 msgid "Display the decoded prosign in the RX text using the short cut key" msgstr "" #: src/dialogs/confdialog.cxx:12585 src/dialogs/confdialog.cxx:12683 #: src/dialogs/confdialog.cxx:12685 msgid "Modem/CW/Extended Chars." msgstr "" #: src/dialogs/confdialog.cxx:12589 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:12594 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:12595 src/dialogs/confdialog.cxx:12601 #: src/dialogs/confdialog.cxx:12609 src/dialogs/confdialog.cxx:12617 #: src/dialogs/confdialog.cxx:12623 src/dialogs/confdialog.cxx:12629 #: src/dialogs/confdialog.cxx:12637 src/dialogs/confdialog.cxx:12643 #: src/dialogs/confdialog.cxx:12649 src/dialogs/confdialog.cxx:12655 #: src/dialogs/confdialog.cxx:12663 src/dialogs/confdialog.cxx:12669 #: src/dialogs/confdialog.cxx:12933 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:12600 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12608 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:12616 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:12622 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:12628 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12636 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:12642 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:12648 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:12654 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:12662 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12668 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:12676 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:12688 msgid "Punctuation/Noise Processing" msgstr "" #: src/dialogs/confdialog.cxx:12692 msgid "Check to enable character encode/decode" msgstr "" #: src/dialogs/confdialog.cxx:12695 msgid " backslash \\ \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12696 src/dialogs/confdialog.cxx:12704 #: src/dialogs/confdialog.cxx:12712 src/dialogs/confdialog.cxx:12720 #: src/dialogs/confdialog.cxx:12728 src/dialogs/confdialog.cxx:12736 #: src/dialogs/confdialog.cxx:12744 src/dialogs/confdialog.cxx:12752 #: src/dialogs/confdialog.cxx:12760 src/dialogs/confdialog.cxx:12768 #: src/dialogs/confdialog.cxx:12776 msgid "disable for no printed character" msgstr "" #: src/dialogs/confdialog.cxx:12703 msgid " apostrophe ' \".----.\"" msgstr "" #: src/dialogs/confdialog.cxx:12711 msgid " quote \" \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12719 msgid " dollar sign $ \"...-..-\"" msgstr "" #: src/dialogs/confdialog.cxx:12727 msgid " open_paren ( \"-.--.\"" msgstr "" #: src/dialogs/confdialog.cxx:12735 msgid " close paren ) \"-.--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12743 msgid " colon : \"---...\"" msgstr "" #: src/dialogs/confdialog.cxx:12751 msgid " semi colon ; \"-.-.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12759 msgid " underscore _ \"..--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12767 msgid " at symbol @@ \".--.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12775 msgid " exclamation ! \"-.-.--\"" msgstr "" #: src/dialogs/confdialog.cxx:12785 msgid "Unknown character decode (noise)" msgstr "" #: src/dialogs/confdialog.cxx:12788 msgid " Do not display unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12789 src/dialogs/confdialog.cxx:12796 msgid "disable '*'or no printed character" msgstr "" #: src/dialogs/confdialog.cxx:12795 msgid " Display '*' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12802 msgid " Display '_' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "disable '_' for no printed character" msgstr "" #: src/dialogs/confdialog.cxx:12809 msgid " Display ' ' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12810 msgid "disable ' ' for no printed character" msgstr "" #: src/dialogs/confdialog.cxx:12818 src/dialogs/confdialog.cxx:12820 msgid "Modem/CW/Punctuation-Noise" msgstr "" #: src/dialogs/confdialog.cxx:12823 src/dialogs/confdialog.cxx:13067 #: src/dialogs/confdialog.cxx:13069 msgid "Modem/CW/WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:12827 src/dialogs/confdialog.cxx:13076 #: src/dialogs/confdialog.cxx:15144 msgid "Ser. Port" msgstr "Σειριακή θύρα" #: src/dialogs/confdialog.cxx:12828 src/dialogs/confdialog.cxx:15529 msgid "Xcvr serial port" msgstr "Σειριακή θύρα Π/Δ" #: src/dialogs/confdialog.cxx:12843 src/dialogs/confdialog.cxx:15544 msgid "Connect / Disconnect from WinKeyer" msgstr "Σύνδεση / Αποσύνδεση από το WinKeyer" #: src/dialogs/confdialog.cxx:12847 msgid "Wait" msgstr "Αναμονή" #: src/dialogs/confdialog.cxx:12851 msgid "Bk" msgstr "" #: src/dialogs/confdialog.cxx:12855 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:12859 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:12863 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:12867 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:12880 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:12893 src/dialogs/confdialog.cxx:15617 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:12906 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:12919 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:12920 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:12927 msgid "WPM setting" msgstr "" #: src/dialogs/confdialog.cxx:12929 src/dialogs/confdialog.cxx:12958 msgid "ModeReg" msgstr "" #: src/dialogs/confdialog.cxx:12932 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:12937 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:12938 msgid "Enable paddle auto spacing of characters" msgstr "" #: src/dialogs/confdialog.cxx:12942 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:12943 msgid "Enable contest character spacing" msgstr "" #: src/dialogs/confdialog.cxx:12947 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:12951 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:12952 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:12961 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:12962 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:12966 msgid "Serial echo" msgstr "" #: src/dialogs/confdialog.cxx:12971 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:12972 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:12976 msgid "Tone ON" msgstr "" #: src/dialogs/confdialog.cxx:12977 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:12981 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:12982 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:12988 msgid "WPM Settings" msgstr "" #: src/dialogs/confdialog.cxx:12991 src/dialogs/confdialog.cxx:13211 msgid "Min WPM" msgstr "" #: src/dialogs/confdialog.cxx:12992 src/dialogs/confdialog.cxx:13212 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:13000 src/dialogs/confdialog.cxx:13221 msgid "Rng WPM" msgstr "" #: src/dialogs/confdialog.cxx:13001 msgid "" "Range WPM setting\n" "default = 25" msgstr "" "Ρύθμιση εύρους WPM\n" "Προκαθορισμένο = 25" #: src/dialogs/confdialog.cxx:13005 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:13006 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13010 msgid "Cmd WPM" msgstr "" #: src/dialogs/confdialog.cxx:13011 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:13017 msgid "Timing/Settings" msgstr "Χρονισμός/Ρυθμίσεις" #: src/dialogs/confdialog.cxx:13020 msgid "Ratio" msgstr "Λόγος" #: src/dialogs/confdialog.cxx:13021 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:13025 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:13026 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13030 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:13031 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13035 msgid "Sample" msgstr "" #: src/dialogs/confdialog.cxx:13036 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:13040 msgid "Weight" msgstr "" #: src/dialogs/confdialog.cxx:13041 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13050 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:13051 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13059 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:13060 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:13072 src/dialogs/confdialog.cxx:13277 #: src/dialogs/confdialog.cxx:13279 msgid "Modem/CW/nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13077 src/dialogs/confdialog.cxx:13376 #: src/dialogs/confdialog.cxx:15145 msgid "nanoIO serial port" msgstr "" #: src/dialogs/confdialog.cxx:13092 src/dialogs/confdialog.cxx:13391 #: src/dialogs/confdialog.cxx:15160 msgid "Connect / Disconnect from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13095 msgid "Paddle" msgstr "" #: src/dialogs/confdialog.cxx:13096 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:13119 src/dialogs/confdialog.cxx:13239 #: src/dialogs/confdialog.cxx:13261 msgid "Comp'" msgstr "" #: src/dialogs/confdialog.cxx:13120 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:13149 msgid "Baud" msgstr "" #: src/dialogs/confdialog.cxx:13164 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:13179 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:13195 src/dialogs/confdialog.cxx:15192 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:13198 src/dialogs/confdialog.cxx:15195 msgid "Status" msgstr "Κατάσταση" #: src/dialogs/confdialog.cxx:13199 src/dialogs/confdialog.cxx:15196 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13204 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:13205 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:13222 msgid "" "Range WPM setting\n" "default = 20" msgstr "" "Ρύθμιση εύρους WPM\n" "Προκαθορισμένο = 20" #: src/dialogs/confdialog.cxx:13233 msgid "PTT off" msgstr "" #: src/dialogs/confdialog.cxx:13234 msgid "Disable PTT" msgstr "Απενεργ. PTT" #: src/dialogs/confdialog.cxx:13242 msgid "WPM" msgstr "" #: src/dialogs/confdialog.cxx:13252 msgid "Test =>" msgstr "Δοκιμή =>" #: src/dialogs/confdialog.cxx:13253 msgid "Send \"paris \" WPM times" msgstr "" #: src/dialogs/confdialog.cxx:13256 msgid "secs' =>" msgstr "δευτερ. =>" #: src/dialogs/confdialog.cxx:13257 msgid "Test duration (60 seconds)" msgstr "Διάρκεια δοκιμής (60 δευτ.)" #: src/dialogs/confdialog.cxx:13262 msgid "Compensationin microseconds" msgstr "" #: src/dialogs/confdialog.cxx:13266 msgid "Adjust" msgstr "Ρύθμιση" #: src/dialogs/confdialog.cxx:13267 msgid "send compensation to nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13272 msgid "CW i/o" msgstr "" #: src/dialogs/confdialog.cxx:13273 msgid "Enable CW operation" msgstr "Ενεργοποίηση λειτουργίας CW" #: src/dialogs/confdialog.cxx:13282 src/dialogs/confdialog.cxx:13404 #: src/dialogs/confdialog.cxx:13406 msgid "Modem/CW/DTR-RTS keying" msgstr "Modem/CW/Χειρισμός μέσω DTR-RTS" #: src/dialogs/confdialog.cxx:13288 msgid "" "DTR/RTS keying may be assigned to flrig, share the RigCat serial port,\n" "share the Separate PTT serial port, or be assigned to separate serial port.\n" "\n" "No settings for baud, stops bits, etc are needed." msgstr "" "Ο χειρισμός μέσω DTR/RTS μπορεί να αντιστοιχιστεί στο flrig,\n" "να μοιράζεται την σειριακή θύρα του RigCat, να μοιράζεται\n" "την ξεχωριστή θύρα PTT ή να αντιστοιχιστεί σε διαφορετική \n" "σειριακή θύρα.\n" "Δεν απαιτούνται ρυθμίσεις ταχύτητας, stop bits κ.λπ." #: src/dialogs/confdialog.cxx:13297 msgid "Use flrig DTR/RTS keying" msgstr "Χρήση DTR/RTS χειρισμού μέσω του flrig" #: src/dialogs/confdialog.cxx:13303 msgid "Disable flrig CW PTT" msgstr "Απενεργ. flrig CW PTT" #: src/dialogs/confdialog.cxx:13304 src/dialogs/confdialog.cxx:13451 msgid "" "Required for some transceivers\n" "e.g. TS-480" msgstr "" "Απαιτείται για ορισμένους πομποδέκτες\n" "π.χ. TS-480" #: src/dialogs/confdialog.cxx:13313 msgid "Share RIGCAT port" msgstr "Κοινή χρήση θύρας RIGCAT" #: src/dialogs/confdialog.cxx:13319 msgid "Share Separate PTT port" msgstr "Κοινή χρήση ξεχωριστής θύρας PTT" #: src/dialogs/confdialog.cxx:13325 msgid "CW Keyline" msgstr "" #: src/dialogs/confdialog.cxx:13340 msgid "Keying compensation (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13341 msgid "Dot / Space timing increment" msgstr "" #: src/dialogs/confdialog.cxx:13359 msgid "PTT keyline" msgstr "" #: src/dialogs/confdialog.cxx:13375 msgid "Use Separate Keying Serial Port" msgstr "Χρήση ξεχωριστής θύρας για χειρισμό" #: src/dialogs/confdialog.cxx:13395 msgid "Speed test" msgstr "Δοκιμή ταχύτητας" #: src/dialogs/confdialog.cxx:13396 msgid "1 minute 'PARIS '" msgstr "1 λεπτό 'PARIS'" #: src/dialogs/confdialog.cxx:13400 msgid "Result" msgstr "Αποτέλεσμα" #: src/dialogs/confdialog.cxx:13409 msgid "Modem/CW/CAT Keying" msgstr "Modem/CW/Χειρισμός μέσω CAT" #: src/dialogs/confdialog.cxx:13413 msgid "" "CW keying using CAT command strings. Available for supported transceivers.\n" "Use with RigCAT or flrig transceiver control. A separate serial port is NOT " "needed.\n" "\n" "Disable CAT PTT if transceiver interprets that as a keydown command (e.g. " "TS480).\n" "Recommend setting transceiver to either semi or full break-in.\n" "\n" "Enter correct CIV address for Icom transceivers." msgstr "" "Χειρισμός CW μέσω εντολών CAT. Διατίθεται για πομποδέκτες που υποστηρίζουν " "την λειτουργία αυτή.\n" "Για χρήση ελέγχου χειρισμού CW μέσω RigCAT ή flrig δεν απαιτείται ξεχωριστή " "σειριακή θύρα.\n" "\n" "Απενεργοποιήστε το CAT PTT εάν ο πομποδέκτης το εκλαμβάνει ως εντολή keydown " "(π.χ. TS480).\n" "Προτείνεται να ρυθμίσετε τον πομποδέκτη σε semi ή full break-in.\n" "\n" "Εισάγετε τη σωστή διεύθυνση CIV για τους πομποδέκτες Icom." #: src/dialogs/confdialog.cxx:13424 msgid "Icom" msgstr "" #: src/dialogs/confdialog.cxx:13429 msgid "Hex CIV addr" msgstr "HEX διεύθ. CIV" #: src/dialogs/confdialog.cxx:13430 msgid "Enter transceiver HEX CIV address" msgstr "Εισάγετε τη HEX διεύθυνση CIV του πομποδέκτη" #: src/dialogs/confdialog.cxx:13435 msgid "Elecraft" msgstr "" #: src/dialogs/confdialog.cxx:13440 msgid "Kenwood" msgstr "" #: src/dialogs/confdialog.cxx:13445 msgid "Yaesu" msgstr "" #: src/dialogs/confdialog.cxx:13450 msgid "Disable CAT PTT" msgstr "Απενεργ. PTT μέσω CAT" #: src/dialogs/confdialog.cxx:13456 src/dialogs/confdialog.cxx:13458 msgid "Modem/CW/CAT keying" msgstr "Modem/CW/Χειρισμός μέσω CAT" #: src/dialogs/confdialog.cxx:13461 msgid "CW CAT & WinKeyer Compensation" msgstr "" #: src/dialogs/confdialog.cxx:13465 msgid "" "Compute timing compensation for CAT CW and WinKeyer CW. Computation at " "current\n" "WPM . Set WPM to nominal (suggest 20 WPM).\n" "\n" "Compensation will be good over a +/- 10 WPM range. Calibration/Test is 1 " "minute of\n" "'PARIS '." msgstr "" #: src/dialogs/confdialog.cxx:13473 msgid "Calibrate" msgstr "Βαθμονόμηση" #: src/dialogs/confdialog.cxx:13474 src/dialogs/confdialog.cxx:13489 msgid "Send WPM 'PARIS ' words" msgstr "" #: src/dialogs/confdialog.cxx:13477 msgid "Compensate (secs)" msgstr "" #: src/dialogs/confdialog.cxx:13485 msgid "Clear compensation" msgstr "" #: src/dialogs/confdialog.cxx:13488 src/dialogs/confdialog.cxx:14847 #: src/dialogs/confdialog.cxx:16157 src/dialogs/confdialog.cxx:16161 #: src/dialogs/confdialog.cxx:16165 src/dialogs/confdialog.cxx:16169 #: src/dialogs/confdialog.cxx:16173 src/dialogs/confdialog.cxx:16177 #: src/dialogs/confdialog.cxx:16181 src/dialogs/confdialog.cxx:18399 #: src/dialogs/confdialog.cxx:18428 src/dialogs/confdialog.cxx:18457 #: src/dialogs/confdialog.cxx:18486 src/dialogs/confdialog.cxx:18505 msgid "Test" msgstr "Δοκιμή" #: src/dialogs/confdialog.cxx:13492 msgid "secs" msgstr "δευτερ." #: src/dialogs/confdialog.cxx:13498 src/dialogs/confdialog.cxx:13500 msgid "Modem/CW/CAT comp'" msgstr "" #: src/dialogs/confdialog.cxx:13503 src/dialogs/confdialog.cxx:13591 #: src/dialogs/confdialog.cxx:13593 msgid "Modem/DominoEX" msgstr "" #: src/dialogs/confdialog.cxx:13507 src/dialogs/confdialog.cxx:15724 msgid "Secondary Text" msgstr "Δευτερεύον κείμενο" #: src/dialogs/confdialog.cxx:13508 src/dialogs/confdialog.cxx:15725 msgid "Text to send during keyboard idle times" msgstr "Κείμενο για αποστολή κατά τη διάρκεια ηρεμίας στην πληκτρολόγηση" #: src/dialogs/confdialog.cxx:13522 src/dialogs/confdialog.cxx:15739 msgid "Filtering" msgstr "Φιλτράρισμα" #: src/dialogs/confdialog.cxx:13523 msgid "Use DSP filter before decoder" msgstr "Χρήση φίλτρου DSP πριν τον αποκωδικοποιητή" #: src/dialogs/confdialog.cxx:13529 src/dialogs/confdialog.cxx:15746 msgid "Filter bandwidth factor" msgstr "" #: src/dialogs/confdialog.cxx:13530 src/dialogs/confdialog.cxx:15747 msgid "Filter bandwidth relative to signal width" msgstr "" #: src/dialogs/confdialog.cxx:13548 msgid "FEC" msgstr "" #: src/dialogs/confdialog.cxx:13549 msgid "Enable MultiPSK-compatible FEC" msgstr "Ενεργοποίηση FEC συμβατό με MultiPSK" #: src/dialogs/confdialog.cxx:13554 src/dialogs/confdialog.cxx:15765 msgid "CWI threshold" msgstr "Κατώφλι CWI" #: src/dialogs/confdialog.cxx:13555 src/dialogs/confdialog.cxx:15766 msgid "CWI detection and suppression" msgstr "" #: src/dialogs/confdialog.cxx:13571 src/dialogs/confdialog.cxx:15801 msgid "Paths (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:13596 src/dialogs/confdialog.cxx:13736 #: src/dialogs/confdialog.cxx:13738 msgid "Modem/Feld Hell" msgstr "" #: src/dialogs/confdialog.cxx:13600 msgid "Hell Transmit Parameters" msgstr "Παράμετροι εκπομπής Hell" #: src/dialogs/confdialog.cxx:13603 msgid "Transmit font" msgstr "Γραμματοσειρά εκπομπής" #: src/dialogs/confdialog.cxx:13604 msgid "Select TX raster font" msgstr "" #: src/dialogs/confdialog.cxx:13620 msgid "Pulse shape" msgstr "Σχήμα παλμού" #: src/dialogs/confdialog.cxx:13621 msgid "Raised cosine pulse shape factor" msgstr "" #: src/dialogs/confdialog.cxx:13632 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:13637 msgid "Transmit periods (.) when idle" msgstr "Αποστολή τελείων (.) σε ηρεμία" #: src/dialogs/confdialog.cxx:13638 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Στέλνει τελείες όταν δεν υπάρχει δραστηριότητα πληκτρολογίου" #: src/dialogs/confdialog.cxx:13644 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:13645 msgid "Range 1...3" msgstr "Εύρος 1...3" #: src/dialogs/confdialog.cxx:13659 msgid "Hell Receive Parameters" msgstr "Παράμετροι λήψης Hell" #: src/dialogs/confdialog.cxx:13662 msgid "Reverse video" msgstr "Αναστροφή εικόνας" #: src/dialogs/confdialog.cxx:13663 msgid "Display RX in reverse video" msgstr "Προβολή Λήψης σε ανεστραμμένη εικόνα" #: src/dialogs/confdialog.cxx:13668 msgid "Marquee text" msgstr "Κυλιόμενο κείμενο" #: src/dialogs/confdialog.cxx:13669 msgid "Display RX as a scrolling marquee" msgstr "Προβολή Λήψης ως κυλιόμενο κείμενο" #: src/dialogs/confdialog.cxx:13674 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:13675 msgid "Range 1...4" msgstr "Εύρος 1...4" #: src/dialogs/confdialog.cxx:13687 msgid "Rx Height in pixels" msgstr "Ύψος Λήψης σε pixels" #: src/dialogs/confdialog.cxx:13688 msgid "May require resizing the Rx/Tx panel" msgstr "Ίσως απαιτεί αλλαγή μεγέθους των πινάκων Λήψης/Εκπομπής" #: src/dialogs/confdialog.cxx:13700 msgid "Receive filter bandwidth" msgstr "Εύρος φίλτρου Λήψης" #: src/dialogs/confdialog.cxx:13701 msgid "Adjust the DSP bandwidth" msgstr "Ρύθμιση του εύρους ζώνης του DSP" #: src/dialogs/confdialog.cxx:13721 msgid "Rx AGC" msgstr "AGC λήψης" #: src/dialogs/confdialog.cxx:13722 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "1 - Αργό, 2 - Μεσαίο, 3 - Γρήγορο" #: src/dialogs/confdialog.cxx:13741 src/dialogs/confdialog.cxx:13976 #: src/dialogs/confdialog.cxx:13978 msgid "Modem/FMT" msgstr "" #: src/dialogs/confdialog.cxx:13745 msgid "Audio Stream Procesing" msgstr "" #: src/dialogs/confdialog.cxx:13748 src/dialogs/confdialog.cxx:18717 msgid "Sample rate" msgstr "Ρυθμός δειγματοληψίας" #: src/dialogs/confdialog.cxx:13749 msgid "FMT sample rate" msgstr "Ρυθμός δειγματοληψίας FMT" #: src/dialogs/confdialog.cxx:13764 msgid "Rx Codec PPM" msgstr "" #: src/dialogs/confdialog.cxx:13765 msgid "Audio Codec ppm correction" msgstr "" #: src/dialogs/confdialog.cxx:13776 msgid "Tracking" msgstr "" #: src/dialogs/confdialog.cxx:13779 msgid "Bgnd" msgstr "" #: src/dialogs/confdialog.cxx:13780 msgid "Change plot background color" msgstr "" #: src/dialogs/confdialog.cxx:13783 msgid "Unkn" msgstr "" #: src/dialogs/confdialog.cxx:13784 msgid "Change plot unknown track color" msgstr "" #: src/dialogs/confdialog.cxx:13787 msgid "Ref" msgstr "" #: src/dialogs/confdialog.cxx:13788 msgid "Change plot reference track color" msgstr "" #: src/dialogs/confdialog.cxx:13792 msgid "Change Axis' color" msgstr "" #: src/dialogs/confdialog.cxx:13795 msgid "Lgnd" msgstr "" #: src/dialogs/confdialog.cxx:13796 msgid "Change legend color" msgstr "" #: src/dialogs/confdialog.cxx:13799 msgid "Line/Axis" msgstr "" #: src/dialogs/confdialog.cxx:13800 msgid "Enable to always plot data over axis" msgstr "" #: src/dialogs/confdialog.cxx:13805 msgid "Thick lines" msgstr "" #: src/dialogs/confdialog.cxx:13806 msgid "Enable to plot track lines 3 pixels wide" msgstr "" #: src/dialogs/confdialog.cxx:13811 msgid "Freq Correction" msgstr "" #: src/dialogs/confdialog.cxx:13812 msgid "Offset plot lines on vertical scale" msgstr "" #: src/dialogs/confdialog.cxx:13821 src/dialogs/confdialog.cxx:18829 msgid "@|<" msgstr "" #: src/dialogs/confdialog.cxx:13825 src/dialogs/confdialog.cxx:18843 msgid "@>|" msgstr "" #: src/dialogs/confdialog.cxx:13829 msgid "Max Error" msgstr "" #: src/dialogs/confdialog.cxx:13830 msgid "Limit freq estimate error to this value" msgstr "" #: src/dialogs/confdialog.cxx:13841 msgid "DFT Estimator" msgstr "" #: src/dialogs/confdialog.cxx:13844 msgid "Data Filter" msgstr "" #: src/dialogs/confdialog.cxx:13845 msgid "Moving average - average over NN seconds^0 - no averaging" msgstr "" #: src/dialogs/confdialog.cxx:13854 msgid "DFT rate" msgstr "" #: src/dialogs/confdialog.cxx:13855 msgid "# DFT computations / second" msgstr "" #: src/dialogs/confdialog.cxx:13872 msgid "FIR Filter" msgstr "" #: src/dialogs/confdialog.cxx:13875 msgid "Width" msgstr "" #: src/dialogs/confdialog.cxx:13876 msgid "Band pass filter / unknown / reference" msgstr "" #: src/dialogs/confdialog.cxx:13886 msgid "bpf Unk'" msgstr "" #: src/dialogs/confdialog.cxx:13887 msgid "ON - band pass filter unknown signal" msgstr "" #: src/dialogs/confdialog.cxx:13892 msgid "bpf Ref'" msgstr "" #: src/dialogs/confdialog.cxx:13893 msgid "ON - band pass filter reference signal" msgstr "" #: src/dialogs/confdialog.cxx:13900 msgid "CSV Data Recording" msgstr "" #: src/dialogs/confdialog.cxx:13903 msgid "Auto record" msgstr "Αυτόματη εγγραφή" #: src/dialogs/confdialog.cxx:13904 msgid "Automatically start csv data file recording with wav playback" msgstr "Αυτόματη έναρξη εγγραφής αρχείου δεδομένων csv με την αναπαραγωγή wav" #: src/dialogs/confdialog.cxx:13908 msgid "Record data for NN minutes after auto start" msgstr "Καταγραφή δεδομένων για NN λεπτά μετά την αυτόματη εκκίνηση" #: src/dialogs/confdialog.cxx:13918 msgid "Wav file recording" msgstr "Εγγραφή αρχείου wav" #: src/dialogs/confdialog.cxx:13921 msgid "Record Audio" msgstr "Εγγραφή ήχου" #: src/dialogs/confdialog.cxx:13922 msgid "Wav file recording - START IMMEDIATELY" msgstr "Η εγγραφή αρχείου Wav - ΞΕΚΙΝΑΕΙ ΑΜΕΣΑ" #: src/dialogs/confdialog.cxx:13927 msgid "Sync to data record" msgstr "Συγχρ. με εγγραφή δεδομένων" #: src/dialogs/confdialog.cxx:13928 msgid "Wav file recording - SYNCHRONIZE with data recording" msgstr "Εγγραφή αρχείων Wav - ΣΥΓΧΡΟΝΙΣΜΟΣ με την εγγραφή δεδομένων" #: src/dialogs/confdialog.cxx:13933 msgid "File pathname:" msgstr "Όνομα διαδρομής αρχείου:" #: src/dialogs/confdialog.cxx:13934 msgid "Computer generated file name" msgstr "Δημιουργία ονόματος αρχείου από υπολογιστή" #: src/dialogs/confdialog.cxx:13942 msgid "" "Shft-click: select unknown\n" "Ctrl-click: select reference" msgstr "" #: src/dialogs/confdialog.cxx:13946 msgid "Center on Unknown" msgstr "Επικέντ. στο Άγνωστο σήμα" #: src/dialogs/confdialog.cxx:13947 msgid "Waterfall Centered on unknown signal" msgstr "Επικέντρωση καταρράκτη στο άγνωστο σήμα" #: src/dialogs/confdialog.cxx:13952 msgid "Center on Reference" msgstr "Επικέντ. στο σήμα αναφοράς" #: src/dialogs/confdialog.cxx:13953 msgid "Waterfall centered on reference signal" msgstr "Επικέντρωση καταρράκτη στο σήμα αναφοράς" #: src/dialogs/confdialog.cxx:13958 msgid "Center on median" msgstr "" #: src/dialogs/confdialog.cxx:13959 msgid "Waterfall centered 1/2 way between unknown & reference" msgstr "" #: src/dialogs/confdialog.cxx:13968 msgid "Use TAB delimiters" msgstr "" #: src/dialogs/confdialog.cxx:13969 msgid "Use tab delimiters between columns on csv export file." msgstr "" #: src/dialogs/confdialog.cxx:13981 src/dialogs/confdialog.cxx:14192 #: src/dialogs/confdialog.cxx:14194 msgid "Modem/FSQ" msgstr "" #: src/dialogs/confdialog.cxx:13985 msgid "Rx Parameters" msgstr "Παράμετροι λήψης" #: src/dialogs/confdialog.cxx:13988 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:13989 msgid "Minimum # hits in tone detector" msgstr "" #: src/dialogs/confdialog.cxx:14000 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:14001 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:14007 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:14008 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:14020 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:14021 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:14029 src/dialogs/confdialog.cxx:14201 msgid "Tx Parameters" msgstr "Παράμετροι εκπομπής" #: src/dialogs/confdialog.cxx:14032 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:14037 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:14042 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:14047 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:14052 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:14057 src/dialogs/confdialog.cxx:15873 msgid "Center freq" msgstr "Κεντρική συχν." #: src/dialogs/confdialog.cxx:14063 msgid "Sounder" msgstr "" #: src/dialogs/confdialog.cxx:14064 msgid "Send beacon every ..." msgstr "Αποστολή beacon κάθε..." #: src/dialogs/confdialog.cxx:14070 msgid "Time out" msgstr "" #: src/dialogs/confdialog.cxx:14071 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:14081 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:14082 msgid "Enter QTC text" msgstr "" #: src/dialogs/confdialog.cxx:14086 msgid "MYCALL lower case" msgstr "MYCALL σε πεζά" #: src/dialogs/confdialog.cxx:14087 src/dialogs/confdialog.cxx:14221 msgid "convert operator callsign to lower case" msgstr "" #: src/dialogs/confdialog.cxx:14092 msgid "QTH:" msgstr "" #: src/dialogs/confdialog.cxx:14093 src/dialogs/confdialog.cxx:17235 msgid "Operators QTH" msgstr "QTH σταθμού" #: src/dialogs/confdialog.cxx:14109 msgid "Message Logging" msgstr "" #: src/dialogs/confdialog.cxx:14112 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:14113 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:14119 msgid "always append to file(s)" msgstr "πάντα προσάρτηση σε αρχείο(α)" #: src/dialogs/confdialog.cxx:14120 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:14126 msgid "Notify time out" msgstr "" #: src/dialogs/confdialog.cxx:14127 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:14142 src/dialogs/confdialog.cxx:14243 msgid "Audit log" msgstr "" #: src/dialogs/confdialog.cxx:14145 src/dialogs/confdialog.cxx:14156 #: src/dialogs/confdialog.cxx:14246 src/dialogs/confdialog.cxx:14257 #: src/dialogs/confdialog.cxx:16335 src/dialogs/confdialog.cxx:18394 #: src/dialogs/confdialog.cxx:18423 src/dialogs/confdialog.cxx:18452 #: src/dialogs/confdialog.cxx:18481 src/dialogs/confdialog.cxx:18508 #: src/dialogs/confdialog.cxx:18634 msgid "Enable" msgstr "Ενεργοπ." #: src/dialogs/confdialog.cxx:14153 src/dialogs/confdialog.cxx:14254 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:14166 msgid "Text Colors" msgstr "Χρώματα κειμένου" #: src/dialogs/confdialog.cxx:14170 msgid "Transmit text" msgstr "Εκπομπή κειμένου" #: src/dialogs/confdialog.cxx:14175 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:14176 msgid "Directed received text" msgstr "" #: src/dialogs/confdialog.cxx:14181 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:14182 msgid "Undirected received text" msgstr "" #: src/dialogs/confdialog.cxx:14197 src/dialogs/confdialog.cxx:14279 #: src/dialogs/confdialog.cxx:14281 msgid "Modem/IFKP" msgstr "" #: src/dialogs/confdialog.cxx:14204 msgid "1/2 speed" msgstr "ταχύτητα 1/2" #: src/dialogs/confdialog.cxx:14209 msgid "1x speed" msgstr "ταχύτητα 1x" #: src/dialogs/confdialog.cxx:14210 msgid "default" msgstr "" #: src/dialogs/confdialog.cxx:14215 msgid "2x speed" msgstr "ταχύτητα 2x" #: src/dialogs/confdialog.cxx:14220 msgid "MYCALL always lower case" msgstr "MYCALL πάντα σε πεζά" #: src/dialogs/confdialog.cxx:14226 msgid "CALLSIGN always lower case" msgstr "CALLSIGN πάντα σε πεζά" #: src/dialogs/confdialog.cxx:14227 msgid "convert other callsign to lower case" msgstr "" #: src/dialogs/confdialog.cxx:14232 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:14233 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:14267 msgid "" "\n" "Operator avatar" msgstr "" "\n" "Εικόνα Χειριστή" #: src/dialogs/confdialog.cxx:14284 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14355 msgid "Modem/MT-63" msgstr "" #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14550 msgid "8-bit extended characters (UTF-8)" msgstr "8-bit εκτεταμένοι χαρακτήρες (UTF-8)" #: src/dialogs/confdialog.cxx:14292 msgid "Enable this for UTF-8 characters" msgstr "Ενεργοποιήστε για χαρακτήρες UTF-8" #: src/dialogs/confdialog.cxx:14298 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:14299 msgid "Enable for very weak signals" msgstr "Ενεργοποιήστε για πολύ ασθενή σήματα" #: src/dialogs/confdialog.cxx:14309 msgid "Transmit lower start tone" msgstr "" #: src/dialogs/confdialog.cxx:14314 msgid "Transmit upper start tone" msgstr "" #: src/dialogs/confdialog.cxx:14320 msgid "Tone Duration (secs)" msgstr "Διάρκεια τόνου (δευτ.)" #: src/dialogs/confdialog.cxx:14336 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:14341 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:14346 msgid "Manual tuning" msgstr "Χειροκίνητος συντονισμός" #: src/dialogs/confdialog.cxx:14358 src/dialogs/confdialog.cxx:14454 #: src/dialogs/confdialog.cxx:14456 msgid "Modem/Contestia" msgstr "" #: src/dialogs/confdialog.cxx:14364 src/dialogs/confdialog.cxx:14465 msgid "Bandwidth" msgstr "Εύρος ζώνης" #: src/dialogs/confdialog.cxx:14365 src/dialogs/confdialog.cxx:14466 msgid "Select bandwidth" msgstr "Επιλογή εύρους ζώνης" #: src/dialogs/confdialog.cxx:14381 src/dialogs/confdialog.cxx:14482 msgid "Tones" msgstr "Τόνοι" #: src/dialogs/confdialog.cxx:14382 src/dialogs/confdialog.cxx:14483 msgid "Select number of tones" msgstr "Επιλογή αριθμού τόνων" #: src/dialogs/confdialog.cxx:14398 src/dialogs/confdialog.cxx:14499 msgid "Receive synchronizer" msgstr "Συγχρονιστής λήψης" #: src/dialogs/confdialog.cxx:14401 src/dialogs/confdialog.cxx:14502 msgid "Tune margin (tone frequency spacing)" msgstr "Περιθώριο συντονισμού (απόσταση συχνοτήτων τόνου)" #: src/dialogs/confdialog.cxx:14402 src/dialogs/confdialog.cxx:14421 #: src/dialogs/confdialog.cxx:14503 src/dialogs/confdialog.cxx:14523 msgid "Change ONLY to experiment" msgstr "Αλλάξτε ΜΟΝΟ για πειραματισμό" #: src/dialogs/confdialog.cxx:14420 src/dialogs/confdialog.cxx:14522 msgid "Integration period (FEC blocks)" msgstr "" #: src/dialogs/confdialog.cxx:14441 msgid "8-bit extended characters" msgstr "8-bit εκτεταμένοι χαρακτήρες" #: src/dialogs/confdialog.cxx:14442 msgid "Enable this for Latin-1 accented characters" msgstr "Ενεργοποιήστε για τονισμένους χαρακτήρες Latin-1" #: src/dialogs/confdialog.cxx:14446 src/dialogs/confdialog.cxx:14556 msgid "xmt start/stop tones" msgstr "εκπομπή τόνων έναρξης/τέλους" #: src/dialogs/confdialog.cxx:14447 src/dialogs/confdialog.cxx:14557 msgid "Enable this to send start/stop tones" msgstr "Ενεργοπ.για αποστολή τόνων έναρξης/τέλους" #: src/dialogs/confdialog.cxx:14459 src/dialogs/confdialog.cxx:14564 #: src/dialogs/confdialog.cxx:14566 msgid "Modem/Olivia" msgstr "" #: src/dialogs/confdialog.cxx:14542 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:14543 src/dialogs/confdialog.cxx:14551 msgid "Enable this for UTF-8 character transmission" msgstr "Ενεργοποιήστε για εκπομπή χαρακτήρων UTF-8" #: src/dialogs/confdialog.cxx:14569 src/dialogs/confdialog.cxx:14709 #: src/dialogs/confdialog.cxx:14711 msgid "Modem/Psk" msgstr "" #: src/dialogs/confdialog.cxx:14573 msgid "AFC behavior" msgstr "Συμπεριφορά AFC" #: src/dialogs/confdialog.cxx:14576 msgid "Acquisition search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:14577 msgid "Capture signals within this frequency range" msgstr "Καταγραφή σημάτων σε αυτό το εύρος συχνοτήτων" #: src/dialogs/confdialog.cxx:14596 src/dialogs/confdialog.cxx:20095 msgid "Acquisition S/N (dB)" msgstr "" #: src/dialogs/confdialog.cxx:14597 src/dialogs/confdialog.cxx:20096 msgid "Capture signals over this threshold" msgstr "Καταγραφή σημάτων πάνω από αυτό το όριο" #: src/dialogs/confdialog.cxx:14618 msgid "S/N and IMD behavior" msgstr "Συμπεριφορά S/N και IMD" #: src/dialogs/confdialog.cxx:14621 msgid "after" msgstr "μετά από" #: src/dialogs/confdialog.cxx:14622 msgid "Behavior of s/n imd" msgstr "Συμπεριφορά του s/n imd" #: src/dialogs/confdialog.cxx:14633 msgid "Dim" msgstr "" #: src/dialogs/confdialog.cxx:14638 msgid "seconds" msgstr "δευτερόλεπτα" #: src/dialogs/confdialog.cxx:14639 msgid "Will occur after this time in seconds" msgstr "Θα συμβεί μετά από τόσα δευτερόλεπτα" #: src/dialogs/confdialog.cxx:14659 msgid "Multi-Channel Signal Processing" msgstr "Πολυκάναλη επεξεργασία σημάτων" #: src/dialogs/confdialog.cxx:14662 msgid "Multi-channel detector" msgstr "Πολυκάναλος ανιχνευτής" #: src/dialogs/confdialog.cxx:14667 msgid "Disable on very slow CPUs or if signal browser is not used" msgstr "Απενεργοποιήστε σε αργές CPU ή όταν ο περιηγητής σημάτων δεν χρησιμ." #: src/dialogs/confdialog.cxx:14672 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:14675 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:14676 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:14681 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:14682 msgid "Pilot tone power relative to signal" msgstr "" #: src/dialogs/confdialog.cxx:14701 msgid "Short Preamble" msgstr "" #: src/dialogs/confdialog.cxx:14702 msgid "Enable short preamble for 8PSK transmission" msgstr "" #: src/dialogs/confdialog.cxx:14714 src/dialogs/confdialog.cxx:14852 #: src/dialogs/confdialog.cxx:14854 msgid "Modem/TTY/Rx" msgstr "" #: src/dialogs/confdialog.cxx:14721 msgid "AFC speed" msgstr "Ταχύτητα AFC" #: src/dialogs/confdialog.cxx:14722 msgid "AFC tracking speed" msgstr "Ταχύτητα εντοπισμού AFC" #: src/dialogs/confdialog.cxx:14738 msgid "RX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:14739 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:14744 msgid "Filter Shape Factor" msgstr "" #: src/dialogs/confdialog.cxx:14745 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:14755 msgid "Decode (CWI suppression)" msgstr "" #: src/dialogs/confdialog.cxx:14758 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:14763 msgid "Mark only" msgstr "Μόνο Mark" #: src/dialogs/confdialog.cxx:14768 msgid "Space only" msgstr "Μόνο Space" #: src/dialogs/confdialog.cxx:14775 msgid "RTTY Scope Display" msgstr "Εμφάνιση παλμογρ. RTTY" #: src/dialogs/confdialog.cxx:14778 msgid "Use cross hair scope" msgstr "" #: src/dialogs/confdialog.cxx:14779 msgid "Default to cross hair digiscope" msgstr "" #: src/dialogs/confdialog.cxx:14784 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:14785 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:14792 msgid "Log RTTY frequency" msgstr "" #: src/dialogs/confdialog.cxx:14795 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:14796 src/dialogs/confdialog.cxx:14816 #: src/dialogs/confdialog.cxx:14824 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:14803 msgid "track color" msgstr "" #: src/dialogs/confdialog.cxx:14804 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:14812 msgid "RTTY Bell" msgstr "" #: src/dialogs/confdialog.cxx:14815 msgid "Audible BELL" msgstr "" #: src/dialogs/confdialog.cxx:14823 msgid "Visible BELL" msgstr "" #: src/dialogs/confdialog.cxx:14831 msgid "RTTY Bell audio wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 src/dialogs/confdialog.cxx:18385 #: src/dialogs/confdialog.cxx:18414 src/dialogs/confdialog.cxx:18443 #: src/dialogs/confdialog.cxx:18472 src/dialogs/confdialog.cxx:18496 msgid "Sound:" msgstr "Ήχος:" #: src/dialogs/confdialog.cxx:14857 src/dialogs/confdialog.cxx:15028 #: src/dialogs/confdialog.cxx:15030 msgid "Modem/TTY/Tx" msgstr "" #: src/dialogs/confdialog.cxx:14861 msgid "Sound Card FSK" msgstr "" #: src/dialogs/confdialog.cxx:14864 src/dialogs/confdialog.cxx:15099 msgid "Carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:14865 msgid "Select carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:14880 msgid "Custom shift" msgstr "" #: src/dialogs/confdialog.cxx:14881 msgid "Input carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:14899 src/dialogs/confdialog.cxx:15399 #: src/dialogs/confdialog.cxx:15553 msgid "Baud rate" msgstr "" #: src/dialogs/confdialog.cxx:14900 msgid "Select carrier baudrate" msgstr "" #: src/dialogs/confdialog.cxx:14916 msgid "Bits per character" msgstr "" #: src/dialogs/confdialog.cxx:14917 msgid "Select # bits / char" msgstr "" #: src/dialogs/confdialog.cxx:14932 msgid "Parity" msgstr "" #: src/dialogs/confdialog.cxx:14933 msgid "Select parity" msgstr "" #: src/dialogs/confdialog.cxx:14948 src/dialogs/confdialog.cxx:15415 #: src/dialogs/confdialog.cxx:15569 msgid "Stop bits" msgstr "" #: src/dialogs/confdialog.cxx:14949 msgid "Select # stop bits" msgstr "" #: src/dialogs/confdialog.cxx:14964 msgid "AutoCRLF" msgstr "" #: src/dialogs/confdialog.cxx:14965 msgid "Add CRLF after page width characters" msgstr "" #: src/dialogs/confdialog.cxx:14970 msgid "chars" msgstr "" #: src/dialogs/confdialog.cxx:14971 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:14989 msgid "CR-CR-LF" msgstr "" #: src/dialogs/confdialog.cxx:14990 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "" #: src/dialogs/confdialog.cxx:14996 msgid "TX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:14997 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:15002 msgid "Shaped Tx" msgstr "" #: src/dialogs/confdialog.cxx:15003 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:15009 msgid "Pseudo-FSK - right channel" msgstr "Ψευδο-FSK σήμα στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:15010 msgid "Create keyed square wave on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:15015 msgid "LTRS at start" msgstr "" #: src/dialogs/confdialog.cxx:15016 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:15033 src/dialogs/confdialog.cxx:15135 #: src/dialogs/confdialog.cxx:15137 msgid "Modem/TTY/FSK" msgstr "" #: src/dialogs/confdialog.cxx:15037 msgid "DTR/RTS signal line FSK" msgstr "Γραμμή Σημάτων DTR/RTS FSK" #: src/dialogs/confdialog.cxx:15040 src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Ενεργοποιημ." #: src/dialogs/confdialog.cxx:15041 msgid "Enable FSK on serial port" msgstr "Ενεργοποίηση FSK σε σειριακή θύρα" #: src/dialogs/confdialog.cxx:15047 msgid "Shares RIGIO serial port, or uses" msgstr "Μοιράζεται τη σειριακή θύρα RIGIO ή χρησιμοποιεί" #: src/dialogs/confdialog.cxx:15048 msgid "Share the RIGIO port" msgstr "Κοινή χρήση θύρας RIGIO" #: src/dialogs/confdialog.cxx:15054 msgid "Serial Port" msgstr "Σειριακή θύρα" #: src/dialogs/confdialog.cxx:15055 msgid "FSK independent serial port" msgstr "Ανεξάρτητη σειριακή θύρα FSK" #: src/dialogs/confdialog.cxx:15069 msgid "MARK/SPACE reversed" msgstr "ανεστραμμένα MARK/SPACE" #: src/dialogs/confdialog.cxx:15070 msgid "Reverse Mark/Space" msgstr "Αναστροφή των MARK/SPACE" #: src/dialogs/confdialog.cxx:15076 src/dialogs/confdialog.cxx:18252 msgid "Use DTR" msgstr "Χρήση DTR" #: src/dialogs/confdialog.cxx:15077 msgid "Enable DTR signal line, default is RTS" msgstr "Ενεργοποίηση σήματος γραμμής DTR, η προεπιλογή είναι RTS" #: src/dialogs/confdialog.cxx:15084 msgid "" "Restart the FSK interface\n" "Necessary if changes made to configuration" msgstr "" #: src/dialogs/confdialog.cxx:15088 msgid "Mark" msgstr "" #: src/dialogs/confdialog.cxx:15089 msgid "Mark frequency in Hertz" msgstr "" #: src/dialogs/confdialog.cxx:15100 msgid "Carrier shift in Hertz" msgstr "" #: src/dialogs/confdialog.cxx:15115 msgid "1.5 stop bits" msgstr "" #: src/dialogs/confdialog.cxx:15116 msgid "" "Enabled - 1.5 stop bits\n" "Disabled - 2 stop bits" msgstr "" #: src/dialogs/confdialog.cxx:15126 msgid "Use flrig FSK keying" msgstr "" #: src/dialogs/confdialog.cxx:15127 msgid "Enable to use flrig FSK keyer" msgstr "" #: src/dialogs/confdialog.cxx:15140 src/dialogs/confdialog.cxx:15252 #: src/dialogs/confdialog.cxx:15254 msgid "Modem/TTY/nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:15163 msgid "Serial Baud" msgstr "" #: src/dialogs/confdialog.cxx:15178 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:15199 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:15200 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:15205 msgid "TTY Baud" msgstr "" #: src/dialogs/confdialog.cxx:15206 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:15222 msgid "Debug Output" msgstr "" #: src/dialogs/confdialog.cxx:15232 msgid "Clear Sent" msgstr "" #: src/dialogs/confdialog.cxx:15235 msgid "Clear Both" msgstr "" #: src/dialogs/confdialog.cxx:15238 msgid "Clear Rcvd" msgstr "" #: src/dialogs/confdialog.cxx:15247 msgid "TTY i/o" msgstr "" #: src/dialogs/confdialog.cxx:15248 msgid "Enable TTY operation" msgstr "" #: src/dialogs/confdialog.cxx:15257 src/dialogs/confdialog.cxx:15485 #: src/dialogs/confdialog.cxx:15487 msgid "Modem/TTY/Navigator" msgstr "" #: src/dialogs/confdialog.cxx:15261 msgid "FSK Interface" msgstr "" #: src/dialogs/confdialog.cxx:15265 msgid "Navigator serial port" msgstr "" #: src/dialogs/confdialog.cxx:15279 msgid "FSK" msgstr "" #: src/dialogs/confdialog.cxx:15280 msgid "Connect / Disconnect from Nav FSK port" msgstr "" #: src/dialogs/confdialog.cxx:15285 src/dialogs/confdialog.cxx:15550 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:15289 msgid "Navigator configuration port" msgstr "" #: src/dialogs/confdialog.cxx:15303 msgid "Channel 1 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15304 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15319 msgid "Channel 2 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15320 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15335 msgid "RF attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15336 msgid "NavRF Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15351 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:15352 src/dialogs/confdialog.cxx:15586 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:15367 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:15368 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:15383 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:15384 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:15400 src/dialogs/confdialog.cxx:15554 msgid "Nav FSK baud rate" msgstr "" #: src/dialogs/confdialog.cxx:15416 src/dialogs/confdialog.cxx:15570 msgid "Nav FSK Stop bits" msgstr "" #: src/dialogs/confdialog.cxx:15431 src/dialogs/confdialog.cxx:15601 msgid "Mark Polarity" msgstr "" #: src/dialogs/confdialog.cxx:15432 src/dialogs/confdialog.cxx:15602 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:15447 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:15448 src/dialogs/confdialog.cxx:15618 #: src/dialogs/confdialog.cxx:15634 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:15463 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:15464 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:15479 msgid "Config" msgstr "" #: src/dialogs/confdialog.cxx:15480 msgid "Connect / Disconnect from Nav Config port" msgstr "" #: src/dialogs/confdialog.cxx:15490 src/dialogs/confdialog.cxx:15516 #: src/dialogs/confdialog.cxx:15518 msgid "Modem/TTY/Synop" msgstr "" #: src/dialogs/confdialog.cxx:15494 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:15495 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:15501 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:15502 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:15509 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:15510 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:15521 src/dialogs/confdialog.cxx:15715 #: src/dialogs/confdialog.cxx:15717 msgid "Modem/TTY/Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:15525 msgid "Serial Interface" msgstr "" #: src/dialogs/confdialog.cxx:15585 msgid "FSK port" msgstr "" #: src/dialogs/confdialog.cxx:15633 msgid "Auto CRLF" msgstr "" #: src/dialogs/confdialog.cxx:15649 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:15650 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:15665 msgid "Diddle char" msgstr "" #: src/dialogs/confdialog.cxx:15666 msgid "Diddle character" msgstr "" #: src/dialogs/confdialog.cxx:15681 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:15682 src/dialogs/confdialog.cxx:15698 msgid "Unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:15697 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:15720 src/dialogs/confdialog.cxx:15833 #: src/dialogs/confdialog.cxx:15835 msgid "Modem/Thor" msgstr "" #: src/dialogs/confdialog.cxx:15740 msgid "Enable DSP prior to decoder" msgstr "Χρήση φίλτρου DSP πριν τον αποκωδικοποιητή" #: src/dialogs/confdialog.cxx:15782 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:15783 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:15788 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:15789 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:15794 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:15795 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:15821 msgid "" "\n" "Operator Avatar" msgstr "" "\n" "Εικόνα Χειριστή" #: src/dialogs/confdialog.cxx:15838 src/dialogs/confdialog.cxx:15853 #: src/dialogs/confdialog.cxx:15855 msgid "Modem/Navtex" msgstr "" #: src/dialogs/confdialog.cxx:15842 msgid "Log Navtex messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:15847 msgid "Log Navtex messages to KML" msgstr "" #: src/dialogs/confdialog.cxx:15848 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:15858 src/dialogs/confdialog.cxx:15979 #: src/dialogs/confdialog.cxx:15981 msgid "Modem/Wefax" msgstr "" #: src/dialogs/confdialog.cxx:15862 msgid "Frequency shift" msgstr "" #: src/dialogs/confdialog.cxx:15863 msgid "" "Frequency shift of WEFAX signal\n" "Nominal 800 Hz" msgstr "" #: src/dialogs/confdialog.cxx:15874 msgid "" "Center of WEFAX signal\n" "Nominal 1900 Hz" msgstr "" #: src/dialogs/confdialog.cxx:15884 msgid "Max Image Rows" msgstr "" #: src/dialogs/confdialog.cxx:15885 msgid "Force save split image" msgstr "" #: src/dialogs/confdialog.cxx:15895 msgid "Fax images destination directory" msgstr "Φάκελος προορισμού εικόνων Fax" #: src/dialogs/confdialog.cxx:15896 msgid "Store images in this directory" msgstr "Αποθηκεύση των εικόνων σε αυτόν τον φάκελο" #: src/dialogs/confdialog.cxx:15901 msgid "Directory..." msgstr "Φάκελος..." #: src/dialogs/confdialog.cxx:15902 msgid "Select destination directory" msgstr "Επιλογή φακέλου προορισμού" #: src/dialogs/confdialog.cxx:15905 msgid "Log Wefax messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:15906 msgid "Sent and received faxes are logged to Adif file." msgstr "" #: src/dialogs/confdialog.cxx:15911 src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Φίλτρο" #: src/dialogs/confdialog.cxx:15917 msgid "Enable Auto-align after" msgstr "" #: src/dialogs/confdialog.cxx:15927 msgid "Stop Auto-align after" msgstr "" #: src/dialogs/confdialog.cxx:15937 msgid "Auto-align every" msgstr "" #: src/dialogs/confdialog.cxx:15947 src/dialogs/confdialog.cxx:15950 #: src/dialogs/confdialog.cxx:15953 msgid "rows" msgstr "" #: src/dialogs/confdialog.cxx:15956 msgid "Correlation" msgstr "" #: src/dialogs/confdialog.cxx:15957 msgid "" "Row-to-row correlation\n" "Used to detect presence of WEFAX signal\n" "Lower: more false detections" msgstr "" #: src/dialogs/confdialog.cxx:15968 msgid "# Correlation rows" msgstr "" #: src/dialogs/confdialog.cxx:15969 msgid "Compute correlation factor over this # rows" msgstr "" #: src/dialogs/confdialog.cxx:15984 src/dialogs/confdialog.cxx:16185 #: src/dialogs/confdialog.cxx:16187 msgid "Misc/Autostart" msgstr "Διάφορα/Αυτόματη Εκκίνηση" #: src/dialogs/confdialog.cxx:15988 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:15989 msgid "Enter full path-filename for flrig" msgstr "Εισάγετε πλήρη διαδρομή και αρχείο του flrig" #: src/dialogs/confdialog.cxx:16003 msgid "Locate flrig executable" msgstr "Εντοπισμός εκτελέσιμου flrig" #: src/dialogs/confdialog.cxx:16006 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:16007 msgid "Enter full path-filename for flamp" msgstr "Εισάγετε πλήρη διαδρομή και αρχείο του flamp" #: src/dialogs/confdialog.cxx:16021 msgid "Locate flamp executable" msgstr "Εντοπισμός εκτελέσιμου flamp" #: src/dialogs/confdialog.cxx:16024 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:16025 msgid "Enter full path-filename for flnet" msgstr "Εισάγετε πλήρη διαδρομή και αρχείο του flnet" #: src/dialogs/confdialog.cxx:16039 msgid "Locate flnet executable" msgstr "Εντοπισμός εκτελέσιμου flnet" #: src/dialogs/confdialog.cxx:16042 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:16043 msgid "Enter full path-filename for fllog" msgstr "Εισάγετε πλήρη διαδρομή και αρχείο του fllog" #: src/dialogs/confdialog.cxx:16057 msgid "Locate fllog executable" msgstr "Εντοπισμός εκτελέσιμου fllog" #: src/dialogs/confdialog.cxx:16060 msgid "Prog 1:" msgstr "Προγ.1:" #: src/dialogs/confdialog.cxx:16061 src/dialogs/confdialog.cxx:16079 #: src/dialogs/confdialog.cxx:16097 msgid "Enter full path-filename for external program" msgstr "Εισάγετε πλήρη διαδρομή και αρχείο του εξωτερικού προγράμματος" #: src/dialogs/confdialog.cxx:16075 msgid "Locate program #1 executable" msgstr "Εντοπισμός εκτελέσιμου program #1" #: src/dialogs/confdialog.cxx:16078 msgid "Prog 2:" msgstr "Προγ.2:" #: src/dialogs/confdialog.cxx:16093 msgid "Locate program #2 executable" msgstr "Εντοπισμός εκτελέσιμου program #2" #: src/dialogs/confdialog.cxx:16096 msgid "Prog 3:" msgstr "Προγ.3:" #: src/dialogs/confdialog.cxx:16111 msgid "Locate program #3 executable" msgstr "Εντοπισμός εκτελέσιμου program #3" #: src/dialogs/confdialog.cxx:16114 msgid "" "Enable\n" "-" msgstr "" "Ενεργοποίηση\n" "-" #: src/dialogs/confdialog.cxx:16115 src/dialogs/confdialog.cxx:16122 #: src/dialogs/confdialog.cxx:16128 src/dialogs/confdialog.cxx:16134 #: src/dialogs/confdialog.cxx:16140 src/dialogs/confdialog.cxx:16146 #: src/dialogs/confdialog.cxx:16152 msgid "Enable this entry when fldigi first starts" msgstr "Ενεργοποίηση αυτής της καταχώρησης κατά την εκκίνηση του fldigi" #: src/dialogs/confdialog.cxx:16158 msgid "Start flrig" msgstr "Έναρξη flrig" #: src/dialogs/confdialog.cxx:16162 msgid "Start flamp" msgstr "Έναρξη flamp" #: src/dialogs/confdialog.cxx:16166 msgid "Start flnet" msgstr "Έναρξη flnet" #: src/dialogs/confdialog.cxx:16170 msgid "Start fllog" msgstr "Έναρξη fllog" #: src/dialogs/confdialog.cxx:16174 msgid "Start prog1" msgstr "Εκκίνηση prog1" #: src/dialogs/confdialog.cxx:16178 msgid "Start prog2" msgstr "Εκκίνηση prog2" #: src/dialogs/confdialog.cxx:16182 msgid "Start prog3" msgstr "Εκκίνηση prog3" #: src/dialogs/confdialog.cxx:16190 src/dialogs/confdialog.cxx:16200 #: src/dialogs/confdialog.cxx:16202 msgid "Misc/CPU" msgstr "Διάφορα/CPU" #: src/dialogs/confdialog.cxx:16194 msgid "Slow CPU (less than 700MHz)" msgstr "Αργός επεξεργαστής (μικρότερος από 700MHz)" #: src/dialogs/confdialog.cxx:16195 msgid "Enable if you're computer does not decode properly" msgstr "Ενεργοποιήστε εάν ο υπολογιστής σας δεν αποκωδικοποιεί σωστά" #: src/dialogs/confdialog.cxx:16205 src/dialogs/confdialog.cxx:16215 #: src/dialogs/confdialog.cxx:16217 msgid "Misc/DTMF" msgstr "Διάφορα/DTMF" #: src/dialogs/confdialog.cxx:16209 msgid "Decode DTMF tones" msgstr "Αποκωδ. τόνων DTMF" #: src/dialogs/confdialog.cxx:16210 msgid "Decode received DTMF tones" msgstr "Αποκωδικοποίηση ληφθέντων τόνων DTMF" #: src/dialogs/confdialog.cxx:16220 src/dialogs/confdialog.cxx:16323 #: src/dialogs/confdialog.cxx:16325 msgid "Misc/KML" msgstr "Διάφορα/KML" #: src/dialogs/confdialog.cxx:16224 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:16225 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:16230 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:16234 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:16235 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:16245 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:16246 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:16255 msgid "KML refresh interval (seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16256 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16272 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:16273 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:16288 msgid "Command run on KML creation" msgstr "" #: src/dialogs/confdialog.cxx:16289 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:16295 msgid "Test command" msgstr "Εντολή δοκιμής" #: src/dialogs/confdialog.cxx:16296 msgid "Execute command on KML files." msgstr "Εκτέλεση εντολών σε αρχεία KML" #: src/dialogs/confdialog.cxx:16299 msgid "Change dir..." msgstr "Αλλ.φακέλου.." #: src/dialogs/confdialog.cxx:16300 msgid "Choose directory to store KML documents" msgstr "Επιλέξτε φάκελο αποθήκευσης των αρχείων KML" #: src/dialogs/confdialog.cxx:16303 msgid "Cleanup KML data now !" msgstr "Καθαρισμός των δεδομ.KML τώρα!" #: src/dialogs/confdialog.cxx:16304 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:16307 msgid "Cleanup on startup" msgstr "Καθαρισμός κατά την εκκίνηση" #: src/dialogs/confdialog.cxx:16308 msgid "Empties KML documents when starting program." msgstr "" #: src/dialogs/confdialog.cxx:16315 msgid "KML server enabled (On / Off)" msgstr "Ενεργοποίηση KML server (On / Off)" #: src/dialogs/confdialog.cxx:16316 msgid "Uncheck if KML is never used" msgstr "Απενεργοποιήστε εάν δεν χρησιμοποιείτε ποτέ KML" #: src/dialogs/confdialog.cxx:16328 src/dialogs/confdialog.cxx:16410 #: src/dialogs/confdialog.cxx:16412 msgid "Misc/NBEMS interface" msgstr "Διάφορα/NBEMS interface" #: src/dialogs/confdialog.cxx:16332 msgid "NBEMS data file interface" msgstr "" #: src/dialogs/confdialog.cxx:16336 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" #: src/dialogs/confdialog.cxx:16341 msgid "Open message folder" msgstr "Άνοιγμα φακέλου μηνυμάτων" #: src/dialogs/confdialog.cxx:16342 msgid "Opens NBEMS file folder upon successful capture" msgstr "Ανοίγει φάκελο αρχείου NBEMS μετά την επιτυχή καταγραφή" #: src/dialogs/confdialog.cxx:16349 msgid "Reception of flmsg files" msgstr "Λήψη αρχείων flmsg" #: src/dialogs/confdialog.cxx:16352 msgid "Open with flmsg" msgstr "Άνοιγμα με flmsg" #: src/dialogs/confdialog.cxx:16353 msgid "Open message with flmsg" msgstr "Άνοιγμα μηνύματος με flmsg" #: src/dialogs/confdialog.cxx:16358 msgid "Open in browser" msgstr "" #: src/dialogs/confdialog.cxx:16359 msgid "Open file with default browser" msgstr "" #: src/dialogs/confdialog.cxx:16364 msgid "flmsg:" msgstr "" #: src/dialogs/confdialog.cxx:16365 msgid "Enter full path-filename for flmsg" msgstr "Εισάγετε πλήρη διαδρομή και αρχείο του flmsg" #: src/dialogs/confdialog.cxx:16378 msgid "Locate flmsg" msgstr "Εντοπ.flmsg" #: src/dialogs/confdialog.cxx:16382 msgid "Timeout (secs)" msgstr "" #: src/dialogs/confdialog.cxx:16383 msgid "Extract times out after NN seconds of inactivity." msgstr "" #: src/dialogs/confdialog.cxx:16396 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:16400 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16401 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16415 src/dialogs/confdialog.cxx:16493 #: src/dialogs/confdialog.cxx:16495 msgid "Misc/PSK reporter" msgstr "Διάφορα/PSK reporter" #: src/dialogs/confdialog.cxx:16419 msgid "Automatically spot callsigns in decoded text" msgstr "Αυτόματο spot χαρακρηριστικού από το κείμενο Λήψης" #: src/dialogs/confdialog.cxx:16420 msgid "Parse all incoming text" msgstr "Ανάλυση όλου του κειμένου Λήψης" #: src/dialogs/confdialog.cxx:16425 msgid "Send reception report when logging a QSO" msgstr "Αποστολή αναφοράς λήψης όταν γίνεται log ένα QSO" #: src/dialogs/confdialog.cxx:16426 msgid "Send report only when QSO is logged" msgstr "Αποστολή αναφοράς λήψης μόνο όταν γίνεται log το QSO" #: src/dialogs/confdialog.cxx:16431 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "Αναφορά συχν.Π/Δ (ενεργ.μόνο εάν έχετε έλεγχο Π/Δ)" #: src/dialogs/confdialog.cxx:16432 msgid "Include the transmit frequency" msgstr "Να συμπεριλαμβάνεται η συχνότητα εκπομπής" #: src/dialogs/confdialog.cxx:16437 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Απενεργοποίηση του spotting όταν δεν είναι ορατός ο περιηγητής σημάτων" #: src/dialogs/confdialog.cxx:16438 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Επιλέξτε για μείωση του φόρτου της CPU σε PSK και RTTY." #: src/dialogs/confdialog.cxx:16444 msgid "Log on to pskrep when starting fldigi" msgstr "Σύνδεση στο pskrep όταν ανοίγει το fldigi" #: src/dialogs/confdialog.cxx:16445 msgid "Automatically start psk reporter socket connection" msgstr "Ξεκινάει αυτόματα η σύνδεση με το psk reporter" #: src/dialogs/confdialog.cxx:16455 msgid "Host:" msgstr "" #: src/dialogs/confdialog.cxx:16456 msgid "To whom the connection is made" msgstr "Σε ποιόν έχει γίνει σύνδεση" #: src/dialogs/confdialog.cxx:16470 msgid "Port:" msgstr "Θύρα:" #: src/dialogs/confdialog.cxx:16471 msgid "Using UDP port #" msgstr "" #: src/dialogs/confdialog.cxx:16486 msgid "Initialize the socket client" msgstr "" #: src/dialogs/confdialog.cxx:16489 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:16498 src/dialogs/confdialog.cxx:16668 #: src/dialogs/confdialog.cxx:16670 msgid "Misc/PSM" msgstr "Διάφορα/PSM" #: src/dialogs/confdialog.cxx:16505 msgid "Allow TX After Signal Detection (Secs)" msgstr "" #: src/dialogs/confdialog.cxx:16506 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" #: src/dialogs/confdialog.cxx:16516 msgid "Enable Busy Channel" msgstr "" #: src/dialogs/confdialog.cxx:16517 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16523 msgid "TX Buffer Flush Timer (Mins, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16524 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16535 msgid "Modem Bandwidth Margins " msgstr "" #: src/dialogs/confdialog.cxx:16536 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16546 msgid "Valid Signal Sample Period (msecs)" msgstr "" #: src/dialogs/confdialog.cxx:16547 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16562 msgid "Enable CSMA" msgstr "" #: src/dialogs/confdialog.cxx:16563 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16568 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16569 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16579 msgid "Slot Time" msgstr "" #: src/dialogs/confdialog.cxx:16580 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16590 msgid "Transmit Data Delay" msgstr "" #: src/dialogs/confdialog.cxx:16591 msgid "Idle transmit before data sent" msgstr "" #: src/dialogs/confdialog.cxx:16601 src/dialogs/confdialog.cxx:16605 msgid "MilliSeconds" msgstr "" #: src/dialogs/confdialog.cxx:16602 src/dialogs/confdialog.cxx:16610 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16606 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16609 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16618 msgid "Enable Histogram" msgstr "" #: src/dialogs/confdialog.cxx:16619 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16624 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16625 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16640 msgid "PSM Attenuate" msgstr "" #: src/dialogs/confdialog.cxx:16641 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16657 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16658 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16665 msgid "Default Settings" msgstr "Προεπ.ρυθμίσεις" #: src/dialogs/confdialog.cxx:16673 src/dialogs/confdialog.cxx:16705 #: src/dialogs/confdialog.cxx:16707 msgid "Misc/Rx text capture" msgstr "Διάφορα/Καταγραφή κειμένου" #: src/dialogs/confdialog.cxx:16677 msgid "Talker Socket (MS only)" msgstr "" #: src/dialogs/confdialog.cxx:16680 msgid "Talker" msgstr "" #: src/dialogs/confdialog.cxx:16684 msgid "Connect/disconnect to Talker socket server" msgstr "" #: src/dialogs/confdialog.cxx:16687 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" #: src/dialogs/confdialog.cxx:16694 msgid "Capture rx text to external file" msgstr "Καταγραφή κειμένου rx σε εξωτερικό αρχείο" #: src/dialogs/confdialog.cxx:16697 msgid "Enable rx text stream" msgstr "" #: src/dialogs/confdialog.cxx:16698 msgid "Send rx text to file: textout.txt" msgstr "" #: src/dialogs/confdialog.cxx:16710 src/dialogs/confdialog.cxx:16748 #: src/dialogs/confdialog.cxx:16750 msgid "Misc/Save Parameters" msgstr "Διάφορα/Αποθήκευση Παραμέτρων" #: src/dialogs/confdialog.cxx:16714 msgid "Transmit level control" msgstr "Ρύθμιση στάθμης εκπομπής" #: src/dialogs/confdialog.cxx:16715 msgid "Save transmit level control by mode" msgstr "Αποθήκευση στάθμης εκπομπής ανά mode" #: src/dialogs/confdialog.cxx:16721 msgid "Squelch level/activated control(s)" msgstr "Ρύθμιση επιπέδου/ενεργοποίησης Squelch" #: src/dialogs/confdialog.cxx:16722 msgid "Save Squelch level and state by mode" msgstr "Αποθήκευση στάθμης Squelch ανά mode" #: src/dialogs/confdialog.cxx:16728 msgid "Enable specific parameter to Save & Restore on a per mode/band basis." msgstr "" "Ενεργοποιήστε τις επιθυμητές επιλογές για διατήρηση ρυθμίσεων ανά mode." #: src/dialogs/confdialog.cxx:16734 msgid "AFC control" msgstr "Ρύθμιση AFC" #: src/dialogs/confdialog.cxx:16735 msgid "Save AFC state by mode" msgstr "Αποθήκευση κατάστασης AFC ανά mode" #: src/dialogs/confdialog.cxx:16741 msgid "Reverse (Rv) control" msgstr "Ρύθμιση αναστροφής (Rv)" #: src/dialogs/confdialog.cxx:16742 msgid "Save Reverse state by mode" msgstr "Αποθήκευση της κατάστασης αναστροφής ανά mode" #: src/dialogs/confdialog.cxx:16753 src/dialogs/confdialog.cxx:16837 #: src/dialogs/confdialog.cxx:16839 msgid "Misc/Sweet Spot" msgstr "Διάφορα/Sweet Spot" #: src/dialogs/confdialog.cxx:16760 msgid "CW" msgstr "" #: src/dialogs/confdialog.cxx:16761 msgid "Default CW tracking point" msgstr "" #: src/dialogs/confdialog.cxx:16779 msgid "RTTY" msgstr "" #: src/dialogs/confdialog.cxx:16780 msgid "Default RTTY tracking point" msgstr "" #: src/dialogs/confdialog.cxx:16798 msgid "PSK et al." msgstr "PSK κλπ." #: src/dialogs/confdialog.cxx:16799 msgid "Default for all other modems" msgstr "" #: src/dialogs/confdialog.cxx:16817 msgid "Always start new modems at these frequencies" msgstr "Να εκκινούν πάντα τα νέα modems σε αυτές τις συχνότητες" #: src/dialogs/confdialog.cxx:16818 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - εκκίνηση στην προκαθορισμένηt\n" "OFF - διατήρηση της τρέχουσας θέσης στον καταρράκτη" #: src/dialogs/confdialog.cxx:16826 msgid "K3 A1A configuation" msgstr "" #: src/dialogs/confdialog.cxx:16829 msgid "CW is LSB" msgstr "" #: src/dialogs/confdialog.cxx:16830 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" #: src/dialogs/confdialog.cxx:16842 src/dialogs/confdialog.cxx:17166 #: src/dialogs/confdialog.cxx:17168 msgid "Misc/TCP-IP sessions" msgstr "Διάφορα/TCP-IP sessions" #: src/dialogs/confdialog.cxx:16850 msgid "Lock" msgstr "Κλείδωμα" #: src/dialogs/confdialog.cxx:16851 msgid "Allow/Disallow Changes" msgstr "Επιτρ./απαγόρ.αλλαγών" #: src/dialogs/confdialog.cxx:16856 msgid "Enable ARQ" msgstr "Ενεργοποίηση ARQ" #: src/dialogs/confdialog.cxx:16857 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "" #: src/dialogs/confdialog.cxx:16864 msgid "Enable KISS" msgstr "Ενεργοποίηση KISS" #: src/dialogs/confdialog.cxx:16865 msgid "Used for BPQ32" msgstr "" #: src/dialogs/confdialog.cxx:16872 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" #: src/dialogs/confdialog.cxx:16879 msgid "KISS" msgstr "" #: src/dialogs/confdialog.cxx:16882 src/dialogs/confdialog.cxx:16999 #: src/dialogs/confdialog.cxx:17051 src/dialogs/confdialog.cxx:17098 #: src/dialogs/confdialog.cxx:17140 src/dialogs/confdialog.cxx:17352 msgid "Addr" msgstr "" #: src/dialogs/confdialog.cxx:16883 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16899 msgid "I/O" msgstr "" #: src/dialogs/confdialog.cxx:16900 src/dialogs/confdialog.cxx:17017 #: src/dialogs/confdialog.cxx:17069 src/dialogs/confdialog.cxx:17116 #: src/dialogs/confdialog.cxx:17149 src/dialogs/confdialog.cxx:17369 msgid "IP Address Port Number" msgstr "" #: src/dialogs/confdialog.cxx:16916 msgid "Output port number when same IP address used" msgstr "" #: src/dialogs/confdialog.cxx:16931 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16932 msgid "Enable when both programs are using the same IP address" msgstr "" #: src/dialogs/confdialog.cxx:16938 src/dialogs/confdialog.cxx:17037 #: src/dialogs/confdialog.cxx:17084 msgid "Restart" msgstr "" #: src/dialogs/confdialog.cxx:16942 msgid "Start" msgstr "Έναρξη" #: src/dialogs/confdialog.cxx:16943 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16952 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16953 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16959 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16960 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16966 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16967 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16973 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16974 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16980 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16981 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16987 msgid "AX25 Decode" msgstr "" #: src/dialogs/confdialog.cxx:16988 msgid "Decode AX25 Packets into human readable form" msgstr "" #: src/dialogs/confdialog.cxx:16996 msgid "ARQ" msgstr "" #: src/dialogs/confdialog.cxx:17000 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17043 msgid "XML" msgstr "" #: src/dialogs/confdialog.cxx:17052 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17090 msgid "flrig" msgstr "" #: src/dialogs/confdialog.cxx:17099 src/dialogs/confdialog.cxx:17353 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17131 src/dialogs/confdialog.cxx:17155 #: src/dialogs/confdialog.cxx:17383 msgid "Reconnect" msgstr "" #: src/dialogs/confdialog.cxx:17137 msgid "fllog" msgstr "" #: src/dialogs/confdialog.cxx:17141 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17172 src/dialogs/confdialog.cxx:17323 #: src/dialogs/confdialog.cxx:17325 msgid "Operator-Station" msgstr "Χειριστής-Σταθμός " #: src/dialogs/confdialog.cxx:17177 msgid "Station Callsign:" msgstr "Callsign σταθμού:" #: src/dialogs/confdialog.cxx:17178 msgid "Station callsign" msgstr "Callsign σταθμού" #: src/dialogs/confdialog.cxx:17191 msgid "Operator Callsign:" msgstr "Callsign χειριστή:" #: src/dialogs/confdialog.cxx:17192 msgid "Operator callsign (if different than station callsign)" msgstr "Callsign χειριστή (εάν είναι διαφορετικό από το callsign σταθμού)" #: src/dialogs/confdialog.cxx:17206 msgid "Operator Name:" msgstr "Όνομα χειριστή:" #: src/dialogs/confdialog.cxx:17207 msgid "Operators name" msgstr "Όνομα χειριστή" #: src/dialogs/confdialog.cxx:17220 msgid "Antenna:" msgstr "Κεραία:" #: src/dialogs/confdialog.cxx:17221 msgid "Short description of antenna" msgstr "Σύντομη περιγραφή κεραίας" #: src/dialogs/confdialog.cxx:17234 #, fuzzy #| msgid "Station LOC" msgid "Station City:" msgstr "LOC σταθμού" #: src/dialogs/confdialog.cxx:17249 msgid "Station Locator:" msgstr "Locator σταθμού:" #: src/dialogs/confdialog.cxx:17250 msgid "Maidenhead locator as in EM64qv" msgstr "" #: src/dialogs/confdialog.cxx:17263 msgid "State/Prov./Country" msgstr "" #: src/dialogs/confdialog.cxx:17264 msgid "US States / Canadian Provinces" msgstr "" #: src/dialogs/confdialog.cxx:17281 msgid "Abbreviation for State/Province" msgstr "" #: src/dialogs/confdialog.cxx:17293 msgid "Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17294 msgid "US/Canadian Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17311 msgid "Abbreviation for County/Region" msgstr "" #: src/dialogs/confdialog.cxx:17328 src/dialogs/confdialog.cxx:17426 #: src/dialogs/confdialog.cxx:17428 msgid "Rig Control/flrig" msgstr "Έλεγχος ΠΔ/flrig" #: src/dialogs/confdialog.cxx:17332 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:17336 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:17337 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:17344 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:17384 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:17389 msgid "flrig is the preferred method of tranceiver control" msgstr "Το flrig είναι η προτιμώμενη μέθοδος ελέγχου πομποδέκτη" #: src/dialogs/confdialog.cxx:17392 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:17393 src/dialogs/confdialog.cxx:17399 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:17398 msgid "Shutdown flrig with fldigi" msgstr "Τερματισμός του flrig με το fldigi" #: src/dialogs/confdialog.cxx:17404 msgid "Poll Interval (msec)" msgstr "" #: src/dialogs/confdialog.cxx:17405 msgid "Request updates every 'poll interval' milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:17431 src/dialogs/confdialog.cxx:17634 #: src/dialogs/confdialog.cxx:17636 msgid "Rig Control/CAT (rigcat)" msgstr "Έλεγχος ΠΔ/CAT (rigcat)" #: src/dialogs/confdialog.cxx:17435 msgid "Use RigCAT" msgstr "Χρήση RigCAT" #: src/dialogs/confdialog.cxx:17436 msgid "RigCAT used for rig control" msgstr "Το RigCAT χρησιμοποιείται για τον έλεγχο του Π/Δ" #: src/dialogs/confdialog.cxx:17443 msgid "Rig description file:" msgstr "" #: src/dialogs/confdialog.cxx:17444 msgid "Use Open to select descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:17450 msgid "Select rig descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:17454 src/dialogs/confdialog.cxx:17940 #: src/dialogs/confdialog.cxx:18210 src/dialogs/confdialog.cxx:18551 msgid "Device:" msgstr "Συσκευή:" #: src/dialogs/confdialog.cxx:17469 src/dialogs/confdialog.cxx:17955 msgid "Retries" msgstr "" #: src/dialogs/confdialog.cxx:17470 msgid "# retries before giving up" msgstr "" #: src/dialogs/confdialog.cxx:17486 msgid "Retry interval (ms)" msgstr "" #: src/dialogs/confdialog.cxx:17487 msgid "Time between retires in msec" msgstr "" #: src/dialogs/confdialog.cxx:17503 msgid "Write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:17504 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:17520 src/dialogs/confdialog.cxx:18023 msgid "Baud rate:" msgstr "" #: src/dialogs/confdialog.cxx:17536 src/dialogs/confdialog.cxx:18039 msgid "Stopbits" msgstr "" #: src/dialogs/confdialog.cxx:17556 msgid "Initialize RigCAT interface" msgstr "" #: src/dialogs/confdialog.cxx:17560 msgid "Commands are echoed" msgstr "" #: src/dialogs/confdialog.cxx:17561 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:17566 msgid "CAT command for PTT" msgstr "Εντολή CAT για PTT" #: src/dialogs/confdialog.cxx:17567 msgid "PTT is a CAT command (not hardware)" msgstr "Η εντολή CAT είναι το PTT" #: src/dialogs/confdialog.cxx:17573 msgid "Toggle RTS for PTT" msgstr "Εναλλαγή RTS για PTT" #: src/dialogs/confdialog.cxx:17574 msgid "RTS is ptt line" msgstr "Το RTS είναι η εντολή PTT" #: src/dialogs/confdialog.cxx:17579 msgid "Toggle DTR for PTT" msgstr "Εναλλαγή DTR για PTT" #: src/dialogs/confdialog.cxx:17580 msgid "DTR is ptt line" msgstr "Το DTR είναι η εντολή PTT" #: src/dialogs/confdialog.cxx:17585 msgid "RTS +12 v" msgstr "" #: src/dialogs/confdialog.cxx:17586 src/dialogs/confdialog.cxx:18096 msgid "Initial state of RTS" msgstr "Αρχική κατάσταση του RTS" #: src/dialogs/confdialog.cxx:17591 msgid "DTR +12 v" msgstr "" #: src/dialogs/confdialog.cxx:17592 src/dialogs/confdialog.cxx:18090 msgid "Initial state of DTR" msgstr "Αρχική κατάσταση του DTR" #: src/dialogs/confdialog.cxx:17597 src/dialogs/confdialog.cxx:18101 msgid "RTS/CTS flow control" msgstr "Έλεγχος ροής RTS/CTS" #: src/dialogs/confdialog.cxx:17598 msgid "Rig uses RTS/CTS handshake" msgstr "Ο Π/Δ χρησιμοποιεί έλεγχο ροής RTC/CTS" #: src/dialogs/confdialog.cxx:17603 msgid "Restore UART Settings on Close" msgstr "Επαναφορά ρυθμίσεων UART στο Κλείσιμο" #: src/dialogs/confdialog.cxx:17604 msgid "Restore the serial (COM) port settings" msgstr "Επαναφέρει τις ρυθμίσεις της σειριακής (COM) θύρας" #: src/dialogs/confdialog.cxx:17609 msgid "VSP Enable" msgstr "" #: src/dialogs/confdialog.cxx:17610 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "" #: src/dialogs/confdialog.cxx:17615 msgid "Init delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:17616 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:17639 src/dialogs/confdialog.cxx:17910 #: src/dialogs/confdialog.cxx:17912 msgid "Rig Control/GPIO" msgstr "Έλεγχος ΠΔ/GPIO" #: src/dialogs/confdialog.cxx:17643 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:17644 src/dialogs/confdialog.cxx:17778 #: src/dialogs/confdialog.cxx:17785 src/dialogs/confdialog.cxx:17792 #: src/dialogs/confdialog.cxx:17799 src/dialogs/confdialog.cxx:17806 #: src/dialogs/confdialog.cxx:17813 src/dialogs/confdialog.cxx:17820 #: src/dialogs/confdialog.cxx:17827 src/dialogs/confdialog.cxx:17834 #: src/dialogs/confdialog.cxx:17841 src/dialogs/confdialog.cxx:17848 #: src/dialogs/confdialog.cxx:17855 src/dialogs/confdialog.cxx:17862 #: src/dialogs/confdialog.cxx:17869 src/dialogs/confdialog.cxx:17876 #: src/dialogs/confdialog.cxx:17883 src/dialogs/confdialog.cxx:17890 #: src/dialogs/confdialog.cxx:18263 msgid "Select PTT on state" msgstr "" #: src/dialogs/confdialog.cxx:17651 src/dialogs/confdialog.cxx:18270 msgid "Initialize the H/W PTT interface" msgstr "" #: src/dialogs/confdialog.cxx:17654 src/dialogs/confdialog.cxx:17896 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:17658 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:17659 src/dialogs/confdialog.cxx:17666 #: src/dialogs/confdialog.cxx:17673 src/dialogs/confdialog.cxx:17680 #: src/dialogs/confdialog.cxx:17687 src/dialogs/confdialog.cxx:17694 #: src/dialogs/confdialog.cxx:17701 src/dialogs/confdialog.cxx:17708 #: src/dialogs/confdialog.cxx:17715 src/dialogs/confdialog.cxx:17722 #: src/dialogs/confdialog.cxx:17729 src/dialogs/confdialog.cxx:17736 #: src/dialogs/confdialog.cxx:17743 src/dialogs/confdialog.cxx:17750 #: src/dialogs/confdialog.cxx:17757 src/dialogs/confdialog.cxx:17764 #: src/dialogs/confdialog.cxx:17771 msgid "Select pin number" msgstr "Επιλογή αριθμού pin" #: src/dialogs/confdialog.cxx:17665 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:17672 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:17679 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:17686 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:17693 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:17700 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:17707 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:17714 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:17721 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:17728 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:17735 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:17742 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:17749 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:17756 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:17763 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:17770 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:17777 src/dialogs/confdialog.cxx:17784 #: src/dialogs/confdialog.cxx:17791 src/dialogs/confdialog.cxx:17798 #: src/dialogs/confdialog.cxx:17805 src/dialogs/confdialog.cxx:17812 #: src/dialogs/confdialog.cxx:17819 src/dialogs/confdialog.cxx:17826 #: src/dialogs/confdialog.cxx:17833 src/dialogs/confdialog.cxx:17840 #: src/dialogs/confdialog.cxx:17847 src/dialogs/confdialog.cxx:17854 #: src/dialogs/confdialog.cxx:17861 src/dialogs/confdialog.cxx:17868 #: src/dialogs/confdialog.cxx:17875 src/dialogs/confdialog.cxx:17882 #: src/dialogs/confdialog.cxx:17889 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:17900 msgid "Pulse width (msec)" msgstr "Πλάτος παλμού (msec)" #: src/dialogs/confdialog.cxx:17901 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:17919 msgid "Use Hamlib" msgstr "Χρήση Hamlib" #: src/dialogs/confdialog.cxx:17920 msgid "Hamlib used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:17926 msgid "Rig:" msgstr "Π/Δ:" #: src/dialogs/confdialog.cxx:17956 msgid "# times to resend command before giving up" msgstr "# φορές για επαναποστολή εντολής πριν παραιτηθεί" #: src/dialogs/confdialog.cxx:17972 msgid "Timeout (msec)" msgstr "Τέλος χρόνου (msec)" #: src/dialogs/confdialog.cxx:17973 msgid "Hamlib read timeout" msgstr "Χρονικό όριο ανάγνωσης Hamlib" #: src/dialogs/confdialog.cxx:17989 msgid "Write delay (msec)" msgstr "Καθυστέρηση εγγραφής (msec)" #: src/dialogs/confdialog.cxx:17990 msgid "Msec's between sequential commands" msgstr "Msec's μεταξύ διαδοχικών εντολών" #: src/dialogs/confdialog.cxx:18006 msgid "Post write delay (msec)" msgstr "Καθυστέρηση μετά την εντολή εγγραφής (msec)" #: src/dialogs/confdialog.cxx:18007 msgid "Wait interval (msecs) before reading response" msgstr "Διάστημα αναμονής (msec) πριν από την ανάγνωση της απάντησης" #: src/dialogs/confdialog.cxx:18058 msgid "Polling Interval (msec)" msgstr "" #: src/dialogs/confdialog.cxx:18077 msgid "PTT via Hamlib command" msgstr "PTT μεσώ εντολής hamlib" #: src/dialogs/confdialog.cxx:18078 msgid "PTT using hamlib command" msgstr "PTT με χρήση εντολής hamlib" #: src/dialogs/confdialog.cxx:18083 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:18084 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:18089 msgid "DTR +12" msgstr "" #: src/dialogs/confdialog.cxx:18095 msgid "RTS +12" msgstr "" #: src/dialogs/confdialog.cxx:18102 msgid "Rig requires RTS/CTS flow control" msgstr "Ο πομποδέκτης απαιτεί έλεγχο ροής RTS/CTS" #: src/dialogs/confdialog.cxx:18108 msgid "XON/XOFF flow control" msgstr "Έλεγχος ροής XON/XOFF" #: src/dialogs/confdialog.cxx:18109 msgid "Rig requires Xon/Xoff flow control" msgstr "Ο πομποδέκτης απαιτεί έλεγχο ροής Xon/Xoff" #: src/dialogs/confdialog.cxx:18114 msgid "CW is LSB mode" msgstr "Το CW είναι διαμ. LSB" #: src/dialogs/confdialog.cxx:18115 msgid "Check if xcvr uses LSB for CW" msgstr "Επιλέξτε εάν ο Π/Δ χρησιμοποιεί LSB για CW" #: src/dialogs/confdialog.cxx:18120 msgid "RTTY is USB mode" msgstr "Το RTTY είναι διαμ. USB" #: src/dialogs/confdialog.cxx:18121 msgid "Check if xcvr uses USB for RTTY" msgstr "Επιλέξτε εάν ο Π/Δ χρησιμοποιεί USB για RTTY" #: src/dialogs/confdialog.cxx:18126 msgid "Mode delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:18127 msgid "Delay NN msec after executing mode change" msgstr "Καθυστέρηση ΝΝ msec μετά από εκτέλεση αλλαγής mode" #: src/dialogs/confdialog.cxx:18146 msgid "Sideband:" msgstr "" #: src/dialogs/confdialog.cxx:18159 msgid "Advanced configuration:" msgstr "" #: src/dialogs/confdialog.cxx:18160 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" #: src/dialogs/confdialog.cxx:18175 msgid "Initialize hamlib interface" msgstr "" #: src/dialogs/confdialog.cxx:18188 src/dialogs/confdialog.cxx:18300 #: src/dialogs/confdialog.cxx:18302 msgid "Rig Control/Hardware PTT" msgstr "Έλεγχος ΠΔ/Hardware PTT" #: src/dialogs/confdialog.cxx:18194 src/dialogs/confdialog.cxx:18674 msgid "PTT tone on right audio channel " msgstr "Τόνος PTT στο δεξί κανάλι ήχου" #: src/dialogs/confdialog.cxx:18195 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Μπορεί να χρησιμοποιηθεί αντί για ή σε συνδιασμό με άλλους τρόπους PTT" #: src/dialogs/confdialog.cxx:18202 msgid "h/w ptt device-pin" msgstr "" #: src/dialogs/confdialog.cxx:18205 msgid "Use separate serial port PTT" msgstr "Χρήση ξεχωριστής θύρας για PTT" #: src/dialogs/confdialog.cxx:18225 msgid "Port is second SCU-17 device" msgstr "Η θύρα είναι η δεύτερη συσκευή του SCU-17" #: src/dialogs/confdialog.cxx:18226 msgid "Driver requires stop bits to be ZERO!" msgstr "Ο οδηγός απαιτεί τα stop bits να είναι ΜΗΔΕΝ!" #: src/dialogs/confdialog.cxx:18232 msgid "Use parallel port PTT" msgstr "Χρήση της παράλληλης θύρας για PTT" #: src/dialogs/confdialog.cxx:18237 msgid "Use uHRouter PTT" msgstr "" #: src/dialogs/confdialog.cxx:18242 msgid "Use RTS" msgstr "Χρήση RTS" #: src/dialogs/confdialog.cxx:18243 msgid "RTS is PTT signal line" msgstr "Το RTS είναι η γραμμή σήματος PTT" #: src/dialogs/confdialog.cxx:18247 msgid "RTS = +V" msgstr "" #: src/dialogs/confdialog.cxx:18248 msgid "Initial voltage on RTS" msgstr "Αρχική τάση στο RTS" #: src/dialogs/confdialog.cxx:18253 msgid "DTR is PTT signal line" msgstr "Το DTR είναι η γραμμή σήματος PTT" #: src/dialogs/confdialog.cxx:18257 msgid "DTR = +V" msgstr "" #: src/dialogs/confdialog.cxx:18258 msgid "Initial voltage on DTR" msgstr "Αρχική τάση στο DTR" #: src/dialogs/confdialog.cxx:18262 msgid "GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:18275 msgid "PTT delays valid for all CAT/PTT types" msgstr "Οι καθυστερήσεις PTT ισχύουν για όλους τους τρόπους CAT/PTT" #: src/dialogs/confdialog.cxx:18278 msgid "Start of transmit PTT delay" msgstr "Καθυστέρηση PTT έναρξης εκμπομπής" #: src/dialogs/confdialog.cxx:18279 msgid "Delay NN msec before starting audio" msgstr "Καθυστέρηση ΝΝ msec πριν από την έναρξη του ήχου" #: src/dialogs/confdialog.cxx:18288 msgid "PTT end of transmit delay" msgstr "Καθυστέρηση PTT λήξης εκμπομπής" #: src/dialogs/confdialog.cxx:18289 msgid "Delay NN msec before releasing PTT" msgstr "Καθυστέρηση ΝΝ msec πριν από την αποδέσμευση του PTT" #: src/dialogs/confdialog.cxx:18306 src/dialogs/confdialog.cxx:18363 msgid "C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18310 msgid "" "C-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. " "GPIO signal line 3 (pin 13) is used for PTT control.\n" "\n" "Fldigi accesses the GPIO lines as a Human Interface Device (HID). " "Discovered C-Media devices are enumerated in the 'C-Media device' list box.\n" "\n" "On Linux: add a file named cmedia.rules to /etc/udev/rules.d/\n" "The file should contain a single line\n" "\n" "KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"" msgstr "" #: src/dialogs/confdialog.cxx:18319 msgid "Use C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18324 msgid "C-Media device" msgstr "" #: src/dialogs/confdialog.cxx:18339 msgid "GPIO line" msgstr "" #: src/dialogs/confdialog.cxx:18356 msgid "Select device & Initialize the H/W PTT interface" msgstr "" #: src/dialogs/confdialog.cxx:18359 msgid "TEST" msgstr "" #: src/dialogs/confdialog.cxx:18360 msgid "Toggles PTT line 20x; check DRA-30 ptt LED" msgstr "" #: src/dialogs/confdialog.cxx:18365 msgid "Rig Control/C-Media PTT" msgstr "Έλεγχος ΠΔ/C-Media PTT" #: src/dialogs/confdialog.cxx:18369 src/dialogs/confdialog.cxx:18534 #: src/dialogs/confdialog.cxx:18536 msgid "Soundcard/Alerts" msgstr "Κάρτα Ήχου/Ειδοποιήσεις" #: src/dialogs/confdialog.cxx:18378 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:18407 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:18436 msgid "RsID audio alert wav" msgstr "Ήχος ειδοπ. RsID (wav)" #: src/dialogs/confdialog.cxx:18465 msgid "flmsg received wav" msgstr "Ήχος ειδοπ. flmsg (wav)" #: src/dialogs/confdialog.cxx:18489 msgid "flmsg timed out wav" msgstr "Ήχος ειδοπ. λήξης χρόνου flmsg (wav)" #: src/dialogs/confdialog.cxx:18515 msgid "Alert volume" msgstr "Ένταση ειδοποίησης" #: src/dialogs/confdialog.cxx:18539 src/dialogs/confdialog.cxx:18646 #: src/dialogs/confdialog.cxx:18648 msgid "Soundcard/Devices" msgstr "Κάρτα Ήχου/Συσκευές" #: src/dialogs/confdialog.cxx:18545 msgid "OSS" msgstr "" #: src/dialogs/confdialog.cxx:18546 msgid "Use OSS audio server" msgstr "" #: src/dialogs/confdialog.cxx:18552 msgid "Select device" msgstr "Επιλογή συσκευής" #: src/dialogs/confdialog.cxx:18560 msgid "PortAudio" msgstr "" #: src/dialogs/confdialog.cxx:18561 msgid "Use Port Audio server" msgstr "" #: src/dialogs/confdialog.cxx:18566 msgid "Capture:" msgstr "Εγγραφή:" #: src/dialogs/confdialog.cxx:18567 msgid "Audio input device" msgstr "Συσκευή εισόδου ήχου" #: src/dialogs/confdialog.cxx:18571 msgid "Playback:" msgstr "Αναπαραγωγή:" #: src/dialogs/confdialog.cxx:18572 src/dialogs/confdialog.cxx:18629 msgid "Audio output device" msgstr "Συσκευή εξόδου ήχου" #: src/dialogs/confdialog.cxx:18580 msgid "PulseAudio" msgstr "" #: src/dialogs/confdialog.cxx:18581 msgid "Use Pulse Audio server" msgstr "Χρήση διακομιστή Pulse Audio" #: src/dialogs/confdialog.cxx:18586 msgid "Server string:" msgstr "" #: src/dialogs/confdialog.cxx:18587 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Αφήστε το κενό ή ανατρέξτε στο\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:18605 msgid "File I/O only" msgstr "Είσ/Έξ μόνο σε αρχείο" #: src/dialogs/confdialog.cxx:18606 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "ΕΑΝ ΔΕΝ ΥΠΑΡΧΕΙ ΔΙΑΘΕΣΙΜΗ ΣΥΣΚΕΥΗ ΗΧΟΥ (ή για δοκιμές)" #: src/dialogs/confdialog.cxx:18615 msgid "Device supports full duplex" msgstr "Η συσκευή υποστηρίζει αμφίδρομη λειτουργία" #: src/dialogs/confdialog.cxx:18616 msgid "Capture/Playback supports full duplex operation" msgstr "Η συσκευή Εγγραφής/Αναπαραγωγής υποστηρίζει αμφίδρομη λειτουργία" #: src/dialogs/confdialog.cxx:18628 msgid "Audio device shared by Audio Alerts and Rx Monitor" msgstr "" "Συσκευή ήχου που μοιράζεται από τις ειδοποιήσεις ήχου και την παρκολούθηση " "λήψης" #: src/dialogs/confdialog.cxx:18635 msgid "First select audio alert playback device" msgstr "Πρώτα επιλέξτε συσκευή για τις ηχητικές ειδοποιήσεις" #: src/dialogs/confdialog.cxx:18641 msgid "Note: must be selected and enabled for Rx Audio monitoring!" msgstr "" #: src/dialogs/confdialog.cxx:18651 src/dialogs/confdialog.cxx:18708 #: src/dialogs/confdialog.cxx:18710 msgid "Soundcard/Right channel" msgstr "Κάρτα Ήχου/Δεξί κανάλι" #: src/dialogs/confdialog.cxx:18655 msgid "Transmit Usage" msgstr "Χρήση κατά την Εκπομπή" #: src/dialogs/confdialog.cxx:18658 msgid "Modem signal on left and right channels" msgstr "Σήμα του modem σε αριστερό και δεξί κανάλι" #: src/dialogs/confdialog.cxx:18659 msgid "Left and right channels both contain modem audio" msgstr "Θα περιέχουν ήχο του modem και τα δύο κανάλια" #: src/dialogs/confdialog.cxx:18664 src/dialogs/confdialog.cxx:18700 msgid "Reverse Left/Right channels" msgstr "Αναστροφή Αριστερού/Δεξιού καναλιού" #: src/dialogs/confdialog.cxx:18665 src/dialogs/confdialog.cxx:18701 msgid "Software reversal of left-right audio channels" msgstr "Αναστροφή αριστερού-δεξιού καναλιού" #: src/dialogs/confdialog.cxx:18670 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Αυτές οι ρυθμίσεις βρίσκονται και σε άλλες καρτέλες.\n" "Βρίσκονται ως αντίγραφα εδώ για ευκολία.\n" "Μπορείτε να αλλάξετε μια ρύθμιση από οποιαδήποτε θέση.\n" "..." #: src/dialogs/confdialog.cxx:18675 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "Τόνος 1000 Hz όταν ενεργοποιείται το PTT\n" "Μπορεί να χρησιμοποιηθεί αντί για ή σε συνδιασμό με άλλους τρόπους PTT" #: src/dialogs/confdialog.cxx:18681 msgid "CW QSK signal on right channel" msgstr "Σήμα CW QSK στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:18682 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Δημιουργεί ένα τετραγωνικό σήμα 1000 Hz στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:18687 msgid "Pseudo-FSK on right audio channel" msgstr "Ψευδο-FSK σήμα στο δεξί κανάλι ήχου" #: src/dialogs/confdialog.cxx:18688 msgid "Create 1000 Hz square wave on right channel" msgstr "Δημιουργεί ένα τετραγωνικό σήμα 1000 Hz στο δεξί κανάλι" #: src/dialogs/confdialog.cxx:18697 msgid "Receive Usage" msgstr "Χρήση κατά την Λήψη" #: src/dialogs/confdialog.cxx:18713 src/dialogs/confdialog.cxx:18850 #: src/dialogs/confdialog.cxx:18852 msgid "Soundcard/Settings" msgstr "Κάρτα Ήχου/Ρυθμίσεις" #: src/dialogs/confdialog.cxx:18720 msgid "Capture" msgstr "Εγγραφή" #: src/dialogs/confdialog.cxx:18721 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" #: src/dialogs/confdialog.cxx:18753 msgid "Converter" msgstr "Μετατροπέας" #: src/dialogs/confdialog.cxx:18754 msgid "Set the type of resampler used of offset correction" msgstr "" #: src/dialogs/confdialog.cxx:18770 msgid "Corrections" msgstr "Διορθώσεις" #: src/dialogs/confdialog.cxx:18773 msgid "RX ppm" msgstr "" #: src/dialogs/confdialog.cxx:18774 msgid "RX sound card correction" msgstr "Διόρθωση κάρτας ήχου (RX)" #: src/dialogs/confdialog.cxx:18790 msgid "TX ppm" msgstr "" #: src/dialogs/confdialog.cxx:18791 msgid "TX sound card correction" msgstr "Διόρθωση κάρτας ήχου (TX)" #: src/dialogs/confdialog.cxx:18807 msgid "TX offset" msgstr "Αντισταθμ. συχνότητας TX" #: src/dialogs/confdialog.cxx:18808 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Διαφορά μεταξύ συχνότητας Rx & Tx (rig offset)" #: src/dialogs/confdialog.cxx:18826 msgid "Frequency Analysis / FMT Rx Correction" msgstr "" #: src/dialogs/confdialog.cxx:18834 msgid "Frequency Correction" msgstr "Διόρθωση συχνότητας" #: src/dialogs/confdialog.cxx:18835 msgid "Used ONLY for frequency analysis mode" msgstr "Χρησιμοποιείται ΜΟΝΟ για τη λειτουργία ανάλυσης συχνότητας" #: src/dialogs/confdialog.cxx:18855 msgid "Signal Level" msgstr "Επίπεδο σήματος" #: src/dialogs/confdialog.cxx:18859 msgid "Signal Levels" msgstr "Επίπεδα σήματος" #: src/dialogs/confdialog.cxx:18940 src/dialogs/confdialog.cxx:18942 msgid "Soundcard/Signal Level" msgstr "Κάρτα Ήχου/Επίπεδο σήματος" #: src/dialogs/confdialog.cxx:18945 src/dialogs/confdialog.cxx:18971 #: src/dialogs/confdialog.cxx:18973 msgid "Soundcard/Wav file recording" msgstr "Κάρτα Ήχου/Εγγραφή αρχείου Wav" #: src/dialogs/confdialog.cxx:18949 msgid "Wav write sample rate" msgstr "Ρυθμός δείγματοληψιας εγγραφής wav" #: src/dialogs/confdialog.cxx:18950 msgid "Pick baud rate from list" msgstr "Επιλογή τιμής baud από τη λίστα" #: src/dialogs/confdialog.cxx:18966 msgid "Record both channels" msgstr "Εγγραφή και των δύο καναλιών" #: src/dialogs/confdialog.cxx:18977 src/dialogs/confdialog.cxx:19063 #: src/dialogs/confdialog.cxx:19065 msgid "UI/Browser/Channels" msgstr "Περιβάλλον Χρήστη/Περιηγητής/Κανάλια" #: src/dialogs/confdialog.cxx:18981 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Κανάλια, το πρώτο κανάλι ξεκινάει από το κατώτερο όριο του καταρράκτη" #: src/dialogs/confdialog.cxx:18982 msgid "Change # of psk viewer channels" msgstr "Αλλαγή αριθμού καναλιών στον περιηγητή σημάτων" #: src/dialogs/confdialog.cxx:18999 msgid "Inactivity timeout" msgstr "Χρόνος αδράνειας" #: src/dialogs/confdialog.cxx:19000 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Καθαρισμός του κειμένου καναλιού\n" "μετά από # δευτερόλεπτα αδράνεια" #: src/dialogs/confdialog.cxx:19016 msgid "Channel label" msgstr "Ετικέτα καναλιού" #: src/dialogs/confdialog.cxx:19017 msgid "Appearance of label on each channel" msgstr "Εμφάνιση ετικέτας του κάθε καναλιού" #: src/dialogs/confdialog.cxx:19028 msgid "Audio frequency" msgstr "Συχνότητα ήχου" #: src/dialogs/confdialog.cxx:19029 msgid "Radio frequency" msgstr "Συχνότητα Π/Δ" #: src/dialogs/confdialog.cxx:19029 msgid "Channel number" msgstr "Αριθ.καναλιού" #: src/dialogs/confdialog.cxx:19034 src/dialogs/confdialog.cxx:19772 msgid "Font..." msgstr "Γραμμ..." #: src/dialogs/confdialog.cxx:19035 msgid "select browser font" msgstr "επιλογή γραμματοσειράς περιηγητή" #: src/dialogs/confdialog.cxx:19038 msgid "Fixed Intervals" msgstr "Σταθερά διαστήματα" #: src/dialogs/confdialog.cxx:19039 msgid "Force channel spacing to even 100 Hz increments" msgstr "Ορισμός της απόστασης καναλιών σε βήματα των 100 Hz" #: src/dialogs/confdialog.cxx:19045 msgid "Continuous scrolling" msgstr "Συνεχόμενη κύλιση" #: src/dialogs/confdialog.cxx:19046 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "ON - Συνεχή κύλιση κειμένου\n" "OFF - Καθαρισμός & επανεκκίνηση κειμένου" #: src/dialogs/confdialog.cxx:19051 msgid "Lowest freq on bottom of viewer" msgstr "Χαμηλότερη συχνότητα στο κάτω μέρος" #: src/dialogs/confdialog.cxx:19052 msgid "Change positions of low to high channels" msgstr "Αλλαγή θέσεων των χαμηλών προς υψηλών καναλιών" #: src/dialogs/confdialog.cxx:19057 msgid "Play back history when active channel selected" msgstr "Αναπαραγωγή ιστορικού όταν επιλέγεται ενεργό κανάλι" #: src/dialogs/confdialog.cxx:19058 msgid "Audio stream history decoded on selected signal" msgstr "Το ιστορικό ροής ήχου αποκωδικοποιείται στο επιλεγμένο σήμα" #: src/dialogs/confdialog.cxx:19068 src/dialogs/confdialog.cxx:19102 #: src/dialogs/confdialog.cxx:19104 msgid "UI/Browser/Colors" msgstr "Περιβάλλον Χρήστη/Περιηγητής/Χρώματα" #: src/dialogs/confdialog.cxx:19072 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:19073 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:19078 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:19079 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:19084 msgid "Even" msgstr "Ζυγές" #: src/dialogs/confdialog.cxx:19085 msgid "Even lines" msgstr "Ζυγές γραμμές" #: src/dialogs/confdialog.cxx:19090 msgid "Odd" msgstr "Μονές" #: src/dialogs/confdialog.cxx:19091 msgid "Odd lines" msgstr "Μονές γραμμές" #: src/dialogs/confdialog.cxx:19097 msgid "Select line" msgstr "Επιλογή γραμμής" #: src/dialogs/confdialog.cxx:19107 src/dialogs/confdialog.cxx:19123 #: src/dialogs/confdialog.cxx:19125 msgid "UI/Browser/Detection Level" msgstr "Περιβάλλον Χρήστη/Περιηγητής/Επίπεδο εντοπισμού" #: src/dialogs/confdialog.cxx:19111 msgid "Backgnd" msgstr "" #: src/dialogs/confdialog.cxx:19112 msgid "Background color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:19117 msgid "Button" msgstr "Κουμπί" #: src/dialogs/confdialog.cxx:19118 msgid "Slider hilite color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:19128 src/dialogs/confdialog.cxx:19262 #: src/dialogs/confdialog.cxx:19264 msgid "UI/General" msgstr "Περιβάλλον Χρήστη/Γενικά" #: src/dialogs/confdialog.cxx:19134 msgid "Show tooltips" msgstr "Εμφ.βοηθ.κειμένου" #: src/dialogs/confdialog.cxx:19135 msgid "Enable / disable tooltips" msgstr "Ενεργοποίηση / Απενεργοποίηση βοηθητικού κειμένου" #: src/dialogs/confdialog.cxx:19141 msgid "Show menu icons" msgstr "Εμφάνιση εικονιδίων μενού" #: src/dialogs/confdialog.cxx:19142 msgid "Enable / disable icons on menus" msgstr "Ενεργοποίηση Απενεργοποίηση εικονιδίων στα μενού" #: src/dialogs/confdialog.cxx:19147 msgid "UI scheme" msgstr "Σχέδιο UI" #: src/dialogs/confdialog.cxx:19148 msgid "Change application look and feel" msgstr "Αλλαγή όψης και αίσθησης του προγράμματος" #: src/dialogs/confdialog.cxx:19166 msgid "Visible modes" msgstr "Ορατά modes" #: src/dialogs/confdialog.cxx:19167 msgid "Select modes for menu access" msgstr "Επιλογή modes για πρόσβαση στο μενού" #: src/dialogs/confdialog.cxx:19170 msgid "UI language" msgstr "Γλώσσα περιβ.χρήστη (UI)" #: src/dialogs/confdialog.cxx:19171 src/dialogs/confdialog.cxx:19915 msgid "Changes take effect on next program startup" msgstr "Οι αλλαγές θα εφαρμοστούν στην επόμενη εκτέλεση του προγράμματος" #: src/dialogs/confdialog.cxx:19190 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Αποτύπωση CW / RTTY / THROB / CONTESTIA με πεζά" #: src/dialogs/confdialog.cxx:19200 msgid "Transmit lower case text" msgstr "Εκπομπή κειμένου σε πεζά" #: src/dialogs/confdialog.cxx:19207 msgid "Exit prompts" msgstr "Υπενθυμίσεις εξόδου" #: src/dialogs/confdialog.cxx:19210 msgid "Prompt to save Configuration" msgstr "Ερώτ.για αποθήκευση ρυθμίσεων" #: src/dialogs/confdialog.cxx:19215 src/dialogs/confdialog.cxx:19377 msgid "Prompt to save macro file" msgstr "Ερώτ.για αποθήκ.αρχείου macro" #: src/dialogs/confdialog.cxx:19216 src/dialogs/confdialog.cxx:19378 msgid "Write current macro set on program exit" msgstr "Αποθήκευση του τρέχοντος macro set κατά την έξοδο" #: src/dialogs/confdialog.cxx:19221 msgid "Prompt to save log" msgstr "Ερώτ.για αποθήκευση log" #: src/dialogs/confdialog.cxx:19227 msgid "Confirm exit" msgstr "Επιβεβαίωση εξόδου" #: src/dialogs/confdialog.cxx:19234 msgid "Check for updates" msgstr "Έλεγχος για ενημερώσεις" #: src/dialogs/confdialog.cxx:19237 msgid "Check for updates when starting program" msgstr "Έλεγχος για ενημερώσεις κατά την εκκίνηση του προγράμματος" #: src/dialogs/confdialog.cxx:19247 msgid "Show TX timer" msgstr "Εμφάνιση χρονομέτρου Εκπομπής" #: src/dialogs/confdialog.cxx:19252 msgid "TX deadmen timeout (mins)" msgstr "Όριο χρόνου Εκπομπής (λεπτά)" #: src/dialogs/confdialog.cxx:19267 src/dialogs/confdialog.cxx:19405 #: src/dialogs/confdialog.cxx:19407 msgid "UI/Macro buttons" msgstr "Περιβάλλον Χρήστη/Κουμπιά Macro" #: src/dialogs/confdialog.cxx:19273 msgid "Mouse wheel active on macro buttons" msgstr "Ενεργή ροδέλα ποντικιού στα κουμπιά macro" #: src/dialogs/confdialog.cxx:19274 msgid "enable mouse wheel control of macro bar" msgstr "Ενεργοποίηση της ροδέλας ποντικιού στα κουμπιά macro" #: src/dialogs/confdialog.cxx:19281 msgid "Number and position of macro bars" msgstr "Πλήθος και θέση των μπαρών macro" #: src/dialogs/confdialog.cxx:19284 msgid "Button Height" msgstr "Ύψος κουμπιού" #: src/dialogs/confdialog.cxx:19285 msgid "Height of macro bar" msgstr "Ύψος της μπάρας macro" #: src/dialogs/confdialog.cxx:19295 msgid "One above Rx/Tx" msgstr "Μία επάνω από Rx/Tx" #: src/dialogs/confdialog.cxx:19296 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" "Μονή μπάρα macro κάτω από τον logging πίνακα\n" "μεταβλητό ύψος" #: src/dialogs/confdialog.cxx:19301 msgid "One above waterfall" msgstr "Μία επάνω από καταρρ." #: src/dialogs/confdialog.cxx:19306 msgid "One below waterfall" msgstr "Μία κάτω από καταρρ." #: src/dialogs/confdialog.cxx:19311 msgid "Two scheme 1" msgstr "Σχέδιο των δύο 1" #: src/dialogs/confdialog.cxx:19316 msgid "Two scheme 2" msgstr "Σχέδιο των δύο 2" #: src/dialogs/confdialog.cxx:19321 msgid "Two scheme 3" msgstr "Σχέδιο των δύο 3" #: src/dialogs/confdialog.cxx:19326 msgid "Two scheme 4" msgstr "Σχέδιο των δύο 4" #: src/dialogs/confdialog.cxx:19331 msgid "Two scheme 5" msgstr "Σχέδιο των δύο 5" #: src/dialogs/confdialog.cxx:19336 msgid "Two scheme 6" msgstr "Σχέδιο των δύο 6" #: src/dialogs/confdialog.cxx:19341 msgid "Two scheme 7" msgstr "Σχέδιο των δύο 7" #: src/dialogs/confdialog.cxx:19346 msgid "Two scheme 8" msgstr "Σχέδιο των δύο 8" #: src/dialogs/confdialog.cxx:19351 msgid "Two scheme 9" msgstr "Σχέδιο των δύο 9" #: src/dialogs/confdialog.cxx:19356 msgid "Two scheme 10" msgstr "Σχέδιο των δύο 10" #: src/dialogs/confdialog.cxx:19365 msgid "Load last used macro file at start" msgstr "Φόρτ.τελευτ.αρχείου macro κατά την εκκίν." #: src/dialogs/confdialog.cxx:19366 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON - χρήση του τελευταίου σετ macros\n" "OFF - χρήση του προκαθορισμένου σετ" #: src/dialogs/confdialog.cxx:19371 msgid "Display macro filename at start" msgstr "Προβολή αρχείου macro κατά την εκκίνηση" #: src/dialogs/confdialog.cxx:19387 msgid "Show macro control codes" msgstr "Εμφ.χαρακτήρων ελέγχου macro" #: src/dialogs/confdialog.cxx:19388 msgid "print ^! execution codes in Rx panel" msgstr "εμφάνιση των ^! συμβόλων εκτέλεσης στον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:19397 msgid "4 bar macro set below Tx" msgstr "4 bar macro κάτω από πίνακα εκπομπ." #: src/dialogs/confdialog.cxx:19398 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" "Τοποθετεί τις 4 μπάρες macro κάτω από τον πίνακα Εκπομπής\n" "Η προεπιλεγμένη ρύθμιση είναι επάνω από τον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:19410 src/dialogs/confdialog.cxx:19454 #: src/dialogs/confdialog.cxx:19456 msgid "UI/Rx Text" msgstr "Περιβάλλον Χρήστη/Κείμενο Λήψης" #: src/dialogs/confdialog.cxx:19414 msgid "Single-click to capture" msgstr "Συλλογή κειμένου με μονό κλικ" #: src/dialogs/confdialog.cxx:19415 src/dialogs/confdialog.cxx:19444 msgid "Enable for single click capure of text in Rx panel" msgstr "" "Ενεργοποιήστε για αυτόματη συμπλήρωση πεδίου log με μονό κλικ στον πίνακα " "Λήψης" #: src/dialogs/confdialog.cxx:19420 msgid "callsign tooltips in received text" msgstr "βοηθ.κείμενο του callsign στο λαμβαν.κείμενο" #: src/dialogs/confdialog.cxx:19421 msgid "Popup info after a 2 second hover on a callsign" msgstr "" "Αναδυόμενες πληροφορίες μετά από ένα πέρασμα 2 δευτερολέπτων στο callsign" #: src/dialogs/confdialog.cxx:19426 msgid "Word delimiters" msgstr "Διαχωριστικά λέξεων" #: src/dialogs/confdialog.cxx:19427 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:19443 msgid "US units of distance (QRB)" msgstr "Μονάδες απόστασης ΗΠΑ (QRB)" #: src/dialogs/confdialog.cxx:19449 msgid "Clear log fields - new CALL" msgstr "Καθαρισμός πεδίων log- νέο CALL" #: src/dialogs/confdialog.cxx:19459 src/dialogs/confdialog.cxx:19494 #: src/dialogs/confdialog.cxx:19496 msgid "UI/Touch" msgstr "Περιβάλλον Χρήστη/Touch" #: src/dialogs/confdialog.cxx:19463 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Σημείωση:\n" "Αυτές οι ρυθμίσεις είναι χρήσιμες αλλά όχι μοναδικές για τη χρήση του fldigi " "σε μια\n" "συσκευή με οθόνη αφής, όπως ένα tablet." #: src/dialogs/confdialog.cxx:19467 msgid "Arrow Key Control of Frequency Entry" msgstr "Τα πλήκτρα με τα βέλη ελέγχουν την εισαγωγή συχνότητας" #: src/dialogs/confdialog.cxx:19470 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" #: src/dialogs/confdialog.cxx:19474 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" #: src/dialogs/confdialog.cxx:19483 msgid "Rx / Tx Panels" msgstr "Πίνακες Λήψης/Εκπομπής" #: src/dialogs/confdialog.cxx:19486 msgid "Tx above Rx" msgstr "Εκπομπή πάνω από Λήψη" #: src/dialogs/confdialog.cxx:19487 msgid "Enable to put Tx panel above Rx panel" msgstr "" "Ενεργοποιήστε για τα έχετε τον πίνακα Εκπομπής επάνω από τον πίνακα Λήψης" #: src/dialogs/confdialog.cxx:19500 src/dialogs/confdialog.cxx:19580 #: src/dialogs/confdialog.cxx:19582 msgid "Waterfall/Buttons & Controls" msgstr "Καταρράκτης/Κουμπιά & Ρυθμιστικά" #: src/dialogs/confdialog.cxx:19504 msgid "Enable check box to show each respective operator control" msgstr "Ενεργ.επιλογής για την εμφάνιση του αντίστοιχου στοιχείου ελέγχου" #: src/dialogs/confdialog.cxx:19514 msgid "WF Magnification" msgstr "" #: src/dialogs/confdialog.cxx:19520 msgid "WF carrier" msgstr "" #: src/dialogs/confdialog.cxx:19526 msgid "WF Shift Controls" msgstr "" #: src/dialogs/confdialog.cxx:19532 msgid "WF ref level" msgstr "" #: src/dialogs/confdialog.cxx:19538 msgid "WF drop rate" msgstr "" #: src/dialogs/confdialog.cxx:19544 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:19550 msgid "WF Store" msgstr "" #: src/dialogs/confdialog.cxx:19556 msgid "WF mode" msgstr "" #: src/dialogs/confdialog.cxx:19562 msgid "QSY" msgstr "" #: src/dialogs/confdialog.cxx:19568 msgid "XMT lock" msgstr "" #: src/dialogs/confdialog.cxx:19574 msgid "Enable all" msgstr "Ενεργ.όλων" #: src/dialogs/confdialog.cxx:19577 msgid "Disable all" msgstr "Απενεργ.όλων" #: src/dialogs/confdialog.cxx:19585 src/dialogs/confdialog.cxx:19800 #: src/dialogs/confdialog.cxx:19802 msgid "Waterfall/Display" msgstr "Καταρράκτης/Εμφάνιση" #: src/dialogs/confdialog.cxx:19589 msgid "Colors and cursors" msgstr "Χρώματα και κέρσορες" #: src/dialogs/confdialog.cxx:19592 msgid "aa" msgstr "" #: src/dialogs/confdialog.cxx:19607 src/dialogs/confdialog.cxx:19611 #: src/dialogs/confdialog.cxx:19615 src/dialogs/confdialog.cxx:19619 #: src/dialogs/confdialog.cxx:19623 src/dialogs/confdialog.cxx:19627 #: src/dialogs/confdialog.cxx:19631 src/dialogs/confdialog.cxx:19635 #: src/dialogs/confdialog.cxx:19639 src/dialogs/confdialog.cxx:19660 #: src/dialogs/confdialog.cxx:19683 src/dialogs/confdialog.cxx:19706 #: src/dialogs/confdialog.cxx:19723 src/dialogs/confdialog.cxx:19735 #: src/dialogs/confdialog.cxx:19748 msgid "Change color" msgstr "Αλλαγή χρώματος" #: src/dialogs/confdialog.cxx:19642 msgid "Load..." msgstr "Φόρτ..." #: src/dialogs/confdialog.cxx:19643 msgid "Load a new palette" msgstr "Φόρτωση καινούριας παλέτας" #: src/dialogs/confdialog.cxx:19646 msgid "Save..." msgstr "Αποθήκ..." #: src/dialogs/confdialog.cxx:19647 msgid "Save this palette" msgstr "Αποθήκευση αυτής της παλέτας" #: src/dialogs/confdialog.cxx:19650 #, fuzzy #| msgid "Signal Browser" msgid "Signal BW" msgstr "Περιηγητής σημάτων" #: src/dialogs/confdialog.cxx:19653 src/dialogs/confdialog.cxx:19676 #: src/dialogs/confdialog.cxx:19699 msgid "ON" msgstr "" #: src/dialogs/confdialog.cxx:19654 msgid "Show cursor with bandwidth lines" msgstr "Εμφάνιση κέρσορα με γραμμές εύρους ζώνης" #: src/dialogs/confdialog.cxx:19659 src/dialogs/confdialog.cxx:19682 #: src/dialogs/confdialog.cxx:19705 src/dialogs/confdialog.cxx:19722 #: src/dialogs/confdialog.cxx:19734 src/dialogs/confdialog.cxx:19747 #: src/dialogs/font_browser.cxx:177 msgid "Color" msgstr "Χρώμα" #: src/dialogs/confdialog.cxx:19666 src/dialogs/confdialog.cxx:19689 #: src/dialogs/confdialog.cxx:19712 src/dialogs/confdialog.cxx:19754 msgid "Wide" msgstr "Φαρδύ" #: src/dialogs/confdialog.cxx:19673 msgid "Center line" msgstr "Κεντρ.Γραμμή" #: src/dialogs/confdialog.cxx:19677 msgid "Show cursor with center line" msgstr "Εμφάνιση κέρσορα με κεντρική γραμμή" #: src/dialogs/confdialog.cxx:19696 #, fuzzy #| msgid "Signal tracks" msgid "Signal trks" msgstr "Ίχνη σήματος" #: src/dialogs/confdialog.cxx:19700 msgid "Show bandwidth tracks on waterfall" msgstr "Εμφάνιση ίχνους εύρους ζώνης στον καταρράκτη" #: src/dialogs/confdialog.cxx:19719 msgid "Notch" msgstr "Αποκοπή" #: src/dialogs/confdialog.cxx:19731 #, fuzzy #| msgid "RsID detection" msgid "RsID Zone" msgstr "Ανίχνευση RsID" #: src/dialogs/confdialog.cxx:19743 msgid "Monitor" msgstr "" #: src/dialogs/confdialog.cxx:19744 msgid "Audio monitor" msgstr "" #: src/dialogs/confdialog.cxx:19763 msgid "Frequency scale" msgstr "Κλίμακα συχνοτήτων" #: src/dialogs/confdialog.cxx:19766 msgid "Always show audio frequencies" msgstr "Εμφάνιση συχνοτήτων ήχου πάντα" #: src/dialogs/confdialog.cxx:19767 msgid "Audio or RF frequencies on waterfall scale" msgstr "Συχνότητες ήχου ή RF στην κλίμακα του καταρράκτη" #: src/dialogs/confdialog.cxx:19773 msgid "Select waterfall scale font" msgstr "Επιλογή γραμματοσειρά κλίμακας καταρράκτη" #: src/dialogs/confdialog.cxx:19778 msgid "Transmit signal" msgstr "Σήμα εκπομπής" #: src/dialogs/confdialog.cxx:19781 msgid "Monitor transmitted signal" msgstr "Παρακολούθηση σήματος εκπομπής" #: src/dialogs/confdialog.cxx:19782 msgid "Show transmit signal on waterfall" msgstr "Να φαίνεται το εκπεμπόμενο σήμα στον καταρράκτη" #: src/dialogs/confdialog.cxx:19787 msgid "Signal Level (dB)" msgstr "Επίπεδο σήματος (dB)" #: src/dialogs/confdialog.cxx:19788 msgid "Set level for good viewing" msgstr "Ορισμός επιπέδου για καλή προβολή" #: src/dialogs/confdialog.cxx:19805 src/dialogs/confdialog.cxx:19941 #: src/dialogs/confdialog.cxx:19943 msgid "Waterfall/FFT Processing" msgstr "Καταρράκτης/Επεξεργασία FFT" #: src/dialogs/confdialog.cxx:19812 msgid "Low frequency limit in Hz" msgstr "Κατώτατο όριο συχνότητας σε Hz" #: src/dialogs/confdialog.cxx:19831 msgid "FFT averaging" msgstr "" #: src/dialogs/confdialog.cxx:19832 msgid "Use averaging to decrease waterfall noise" msgstr "" #: src/dialogs/confdialog.cxx:19837 msgid "FFT prefilter window function" msgstr "" #: src/dialogs/confdialog.cxx:19849 msgid "Rectangular" msgstr "" #: src/dialogs/confdialog.cxx:19851 msgid "Triangular" msgstr "" #: src/dialogs/confdialog.cxx:19857 msgid "High frequency limit in Hz" msgstr "Ανώτατο όριο συχνότητας σε Hz" #: src/dialogs/confdialog.cxx:19876 msgid "Latency" msgstr "Καθυστέρηση μεταφ." #: src/dialogs/confdialog.cxx:19877 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:19899 src/dialogs/confdialog.cxx:19916 msgid "Show me more or less waterfall" msgstr "Εμφάνιση μεγαλύτερου ή μικρότερου καταρράκτη" #: src/dialogs/confdialog.cxx:19902 msgid "Slow drop rate" msgstr "" #: src/dialogs/confdialog.cxx:19903 msgid "Normal drop speed / value" msgstr "" #: src/dialogs/confdialog.cxx:19919 msgid "Waterfall height in pixels" msgstr "Ύψος καταρράκτη σε pixels" #: src/dialogs/confdialog.cxx:19920 msgid "CPU usage increases with waterfall height" msgstr "Η χρήση της CPU αυξάνεται με αύξηση του ύψους του καταρράκτη" #: src/dialogs/confdialog.cxx:19946 src/dialogs/confdialog.cxx:20000 #: src/dialogs/confdialog.cxx:20002 msgid "Waterfall/Mouse usage" msgstr "Καταρράκτης/Χρήση Ποντικιού" #: src/dialogs/confdialog.cxx:19952 msgid "Left or right click always replays audio history" msgstr "Αριστερό ή δεξί κλικ αναπαράγει πάντα το ιστορικό ήχου" #: src/dialogs/confdialog.cxx:19953 msgid "Replay trackline audio" msgstr "" #: src/dialogs/confdialog.cxx:19958 msgid "Dragging on the waterfall scale changes frequency" msgstr "Σέρνοντας την κλίμακα καταρράκτη αλλάζει η συχνότητα" #: src/dialogs/confdialog.cxx:19959 msgid "Enable drag cursor on waterfall scale" msgstr "Ενεργοποίηση συρσίματος της κλίμακας καταρράκτη με τον κέρσορα" #: src/dialogs/confdialog.cxx:19964 msgid "Insert text on single left click" msgstr "Εισαγωγή κειμένου με μονό αριστερό κλικ" #: src/dialogs/confdialog.cxx:19965 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Εισαγωγή ειδικού κειμένου στον πίνακα Λήψης\n" "όταν γίνεται κλικ στον καταρράκτη" #: src/dialogs/confdialog.cxx:19971 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:19983 msgid "Wheel action" msgstr "Ενέργεια ροδέλας" #: src/dialogs/confdialog.cxx:19984 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Επιλέξτε πως θα συμπεριφέρεται η ροδέλα\n" "του ποντικιού στον καταρράκτη" #: src/dialogs/confdialog.cxx:20005 src/dialogs/confdialog.cxx:20042 #: src/dialogs/confdialog.cxx:20044 msgid "Waterfall/Spectrum" msgstr "Καταρράκτης/Φάσμα" #: src/dialogs/confdialog.cxx:20009 msgid "Spectrum Scope / Waterfall interaction" msgstr "Αναλυτής φάσματος / Αλληλεπίδραση καταρράκτη" #: src/dialogs/confdialog.cxx:20012 msgid "left click transfers frequency to scope center frequency" msgstr "το αριστερό κλικ μεταφέρει την συχν. στην κεντρική συχν. του αναλυτή" #: src/dialogs/confdialog.cxx:20013 msgid "left click on WF recenters spectrum scope" msgstr "το αριστερό κλικ στον καταρράκτη επανακεντράρει τον αναλυτή φάσματος" #: src/dialogs/confdialog.cxx:20018 msgid "use waterfall range/limit values" msgstr "χρήση τιμών του εύρους/ορίου καταρράκτη" #: src/dialogs/confdialog.cxx:20019 msgid "values left/below waterfall" msgstr "τιμές αριστερά/κάτω από καταρράκτη" #: src/dialogs/confdialog.cxx:20024 msgid "freq scale = N * modem bandwidth" msgstr "Κλίμακα συχνότ. = Ν * το εύρος του mode" #: src/dialogs/confdialog.cxx:20034 msgid "use" msgstr "χρήση" #: src/dialogs/confdialog.cxx:20035 msgid "scale spectrum display linked to modem bandwidth" msgstr "Κλίμακα αναλυτή φάσματος συνδεδεμένη με το εύρος του modem" #: src/dialogs/confdialog.cxx:20048 src/dialogs/confdialog.cxx:20154 #: src/dialogs/confdialog.cxx:20156 msgid "Web/Pskmail" msgstr "" #: src/dialogs/confdialog.cxx:20052 msgid "Mail Server Attributes" msgstr "" #: src/dialogs/confdialog.cxx:20055 msgid "Carrier frequency (Hz)" msgstr "Συχνότητα φέρουσας (Hz)" #: src/dialogs/confdialog.cxx:20056 msgid "Default listen / transmit frequency" msgstr "Προεπιλεγμένη συχνότητα ακρόασης / εκπομπής" #: src/dialogs/confdialog.cxx:20075 msgid "Search range (Hz)" msgstr "Εύρος αναζήτησης (Hz)" #: src/dialogs/confdialog.cxx:20076 msgid "Listen for signals within this range" msgstr "Αναζήτηση για σήματα μέσα στο εύρος αυτό" #: src/dialogs/confdialog.cxx:20115 msgid "AFC range (Hz)" msgstr "Εύρος AFC (Hz)" #: src/dialogs/confdialog.cxx:20116 msgid "Limit AFC movement to this range" msgstr "Περιορισμός κίνησης AFC στο εύρος αυτό" #: src/dialogs/confdialog.cxx:20135 msgid "Reset to Carrier" msgstr "" #: src/dialogs/confdialog.cxx:20136 msgid "When no signal present" msgstr "Όταν δεν υπάρχει σήμα" #: src/dialogs/confdialog.cxx:20144 msgid "General" msgstr "Γενικά" #: src/dialogs/confdialog.cxx:20147 msgid "Report ARQ frames average S/N" msgstr "" #: src/dialogs/confdialog.cxx:20159 src/dialogs/confdialog.cxx:20242 #: src/dialogs/confdialog.cxx:20244 msgid "Web/WX" msgstr "" #: src/dialogs/confdialog.cxx:20163 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:20164 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:20170 msgid "Default URL" msgstr "" #: src/dialogs/confdialog.cxx:20173 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:20174 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:20179 msgid "Search on web" msgstr "" #: src/dialogs/confdialog.cxx:20182 msgid "Full report" msgstr "Πλήρης αναφορά" #: src/dialogs/confdialog.cxx:20183 src/dialogs/confdialog.cxx:20237 msgid "Insert full METAR report" msgstr "" #: src/dialogs/confdialog.cxx:20188 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:20189 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:20194 msgid "Conditions" msgstr "Συνθήκες" #: src/dialogs/confdialog.cxx:20195 msgid "current wx conditions" msgstr "τρέχουσες καιρικές συνθήκες" #: src/dialogs/confdialog.cxx:20200 msgid "Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:20201 msgid "report Fahrenheit" msgstr "να αναφέρονται βαθμοί Fahrenheit" #: src/dialogs/confdialog.cxx:20206 msgid "Celsius" msgstr "Κελσίου" #: src/dialogs/confdialog.cxx:20207 msgid "report Celsius" msgstr "να αναφέρονται βαθμοί Κελσίου" #: src/dialogs/confdialog.cxx:20212 msgid "Miles / Hour" msgstr "Μίλια / Ώρα" #: src/dialogs/confdialog.cxx:20213 msgid "report miles per hour" msgstr "να αναφέρονται Μίλια ανά ώρα" #: src/dialogs/confdialog.cxx:20218 msgid "kilometers / hour" msgstr "Χιλιόμετρα / Ώρα" #: src/dialogs/confdialog.cxx:20219 msgid "report kilometers per hour" msgstr "να αναφέρονται Χιλιόμετρα ανά ώρα" #: src/dialogs/confdialog.cxx:20224 msgid "Inches Hg." msgstr "Ίντσες υδραρ.Hg." #: src/dialogs/confdialog.cxx:20225 msgid "report inches mercury" msgstr "να αναφέρονται ίντσες υδραργύρου (Hg)" #: src/dialogs/confdialog.cxx:20230 msgid "mbars" msgstr "" #: src/dialogs/confdialog.cxx:20231 msgid "report millibars" msgstr "να αναφέρονται millibars" #: src/dialogs/confdialog.cxx:20236 msgid "Unprocessed METAR data" msgstr "" #: src/dialogs/confdialog.cxx:20254 msgid "Restore defaults" msgstr "Επαν.προεπιλογών" #: src/dialogs/confdialog.cxx:20255 msgid "WARNING - this will over write ALL settings" msgstr "ΠΡΟΣΟΧΗ - αυτή η ενέργ.θα αντικαταστήσει ΟΛΕΣ τις ρυθμίσεις" #: src/dialogs/font_browser.cxx:77 msgid "Font color" msgstr "Χρώμα γραμματοσειράς" #: src/dialogs/font_browser.cxx:150 msgid "Font:" msgstr "Γραμματοσειρά:" #: src/dialogs/font_browser.cxx:155 msgid "Size:" msgstr "Μέγεθος:" #: src/dialogs/font_browser.cxx:165 msgid "Fixed" msgstr "Σταθερό" #: src/dialogs/font_browser.cxx:169 msgid "&OK" msgstr "" #: src/dialogs/font_browser.cxx:184 msgid "" "abcdefghijklmnopqrstuvwxyz\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" "0123456789" msgstr "" #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Πηγές αρχείων δεδομένων" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Ενημέρωση αρχείων δεδομένων" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Πηγές δεδομένων σε πίνακα" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Πηγή δεδομένων" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Αποθετήριο αρχείων δεδομένων" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" "Ενημέρωση των επιλεγμένων αρχεία τοπικών δεδομένων από περιεχόμενο " "αποθετηρίου" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Θα διαγραφούν τα τοπικά αρχεία δεδομένων εάν επιλεγεί." #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Χρήστης LoTW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "Χρήστης eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Διπλότυπα" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Αγνόηση διπλότυπων" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Χρόνος (δλ):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Ενέργεια" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Ελάχιστος χρόνος μεταξύ γεγονότων" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Προβολή παραθύρου ειδοποίησης:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Εισαγωγή προκαθορ.κειμένου" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Απόκρυψη παραθύρου μετά από (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Προσάρτηση στο κείμενο RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Προσάρτηση στο κείμενο TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Προβολή επεξεργασίας macro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Εκτέλεση προγράμματος:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Εύρεση χώρας:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Πιέστε ENTER για να συνεχίσει η αναζήτηση" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Εύρεση prefix:" #: src/logbook/lgbook.cxx:615 msgid "Export Setup" msgstr "Ρυθμίσεις εξαγωγής" #: src/logbook/lgbook.cxx:616 src/logbook/lgbook.cxx:1631 msgid "Select Records to Export" msgstr "Επιλογή Εγγραφών για Εξαγωγή" #: src/logbook/lgbook.cxx:624 src/logbook/lgbook.cxx:825 #: src/logbook/lgbook.cxx:1639 src/logbook/lgbook.cxx:1721 msgid "Check All" msgstr "Επιλογή Όλων" #: src/logbook/lgbook.cxx:627 msgid "Start Date" msgstr "Ημερομ.Αρχής" #: src/logbook/lgbook.cxx:628 msgid "Start date for export" msgstr "Ημερομηνία αρχής της εξαγωγής" #: src/logbook/lgbook.cxx:641 msgid "Stop Date" msgstr "Ημερομ.τέλους" #: src/logbook/lgbook.cxx:642 msgid "Inclusive stop date for export" msgstr "Ημερομηνία τέλους της εξαγωγής" #: src/logbook/lgbook.cxx:655 msgid "select by date" msgstr "επιλογή ανά ημ/νία" #: src/logbook/lgbook.cxx:656 msgid "Enable to select date range" msgstr "Ενεργοποιήστε για επιλογή εύρους ημερομηνίας" #: src/logbook/lgbook.cxx:662 msgid "Select Fields to Export" msgstr "Επιλέξτε Πεδία για Εξαγωγή" #: src/logbook/lgbook.cxx:673 src/logbook/lgbook.cxx:1670 msgid "Freq" msgstr "" #: src/logbook/lgbook.cxx:684 msgid "QSO Date On" msgstr "" #: src/logbook/lgbook.cxx:688 msgid "QSO Date Off" msgstr "" #: src/logbook/lgbook.cxx:692 msgid "Time ON" msgstr "" #: src/logbook/lgbook.cxx:696 src/logbook/lgbook.cxx:1682 msgid "Time OFF" msgstr "" #: src/logbook/lgbook.cxx:699 msgid "TX Power" msgstr "Ισχύς εκμπομπής" #: src/logbook/lgbook.cxx:702 src/logbook/lgbook.cxx:1686 msgid "RST sent" msgstr "" #: src/logbook/lgbook.cxx:706 src/logbook/lgbook.cxx:1690 msgid "RST rcvd" msgstr "" #: src/logbook/lgbook.cxx:710 src/logbook/lgbook.cxx:1003 msgid "Qth" msgstr "" #: src/logbook/lgbook.cxx:713 msgid "LOC" msgstr "" #: src/logbook/lgbook.cxx:719 src/logbook/lgbook.cxx:1367 msgid "Age" msgstr "Ηλικία" #: src/logbook/lgbook.cxx:722 src/logbook/lgbook.cxx:1243 msgid "Station Call" msgstr "Call σταθμού" #: src/logbook/lgbook.cxx:725 src/logbook/lgbook.cxx:1267 msgid "Station QTH" msgstr "QTH σταθμού" #: src/logbook/lgbook.cxx:728 msgid "Station LOC" msgstr "LOC σταθμού" #: src/logbook/lgbook.cxx:740 src/logbook/lgbook.cxx:1224 msgid "Notes" msgstr "Σημειώσεις" #: src/logbook/lgbook.cxx:743 msgid "QSL rcvd date" msgstr "" #: src/logbook/lgbook.cxx:746 msgid "QSL sent date" msgstr "" #: src/logbook/lgbook.cxx:749 msgid "eQSL rcvd date" msgstr "" #: src/logbook/lgbook.cxx:752 msgid "eQSL sent date" msgstr "" #: src/logbook/lgbook.cxx:755 msgid "LoTW rcvd date" msgstr "" #: src/logbook/lgbook.cxx:758 msgid "LoTW sent date" msgstr "" #: src/logbook/lgbook.cxx:761 src/logbook/lgbook.cxx:1132 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:764 src/logbook/lgbook.cxx:1694 msgid "Serial # in" msgstr "" #: src/logbook/lgbook.cxx:767 src/logbook/lgbook.cxx:1698 msgid "Serial # out" msgstr "" #: src/logbook/lgbook.cxx:776 src/logbook/lgbook.cxx:1706 msgid "Exchange Out" msgstr "" #: src/logbook/lgbook.cxx:785 src/logbook/lgbook.cxx:1174 msgid "CQZ" msgstr "" #: src/logbook/lgbook.cxx:788 src/logbook/lgbook.cxx:1210 msgid "DXCC" msgstr "" #: src/logbook/lgbook.cxx:791 src/logbook/lgbook.cxx:1162 msgid "IOTA" msgstr "" #: src/logbook/lgbook.cxx:794 src/logbook/lgbook.cxx:1198 msgid "ITUZ" msgstr "" #: src/logbook/lgbook.cxx:797 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:800 msgid "FD section" msgstr "" #: src/logbook/lgbook.cxx:803 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:804 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:807 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:808 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:811 msgid "CW SS Check" msgstr "" #: src/logbook/lgbook.cxx:814 msgid "CW SS Section" msgstr "" #: src/logbook/lgbook.cxx:815 src/logbook/lgbook.cxx:819 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:818 src/logbook/lgbook.cxx:1379 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:844 msgid "Logbook" msgstr "" #: src/logbook/lgbook.cxx:845 msgid "Date On" msgstr "" #: src/logbook/lgbook.cxx:846 msgid "Date QSO started" msgstr "Ημερομηνία έναρξης QSO" #: src/logbook/lgbook.cxx:858 msgid "Time On" msgstr "" #: src/logbook/lgbook.cxx:859 msgid "Time QSO started" msgstr "Ώρα έναρξης QSO" #: src/logbook/lgbook.cxx:871 msgid "Call sign worked" msgstr "" #: src/logbook/lgbook.cxx:883 msgid "Operator worked" msgstr "" #: src/logbook/lgbook.cxx:894 msgid "In" msgstr "" #: src/logbook/lgbook.cxx:895 msgid "Rst received" msgstr "" #: src/logbook/lgbook.cxx:906 msgid "Recs" msgstr "" #: src/logbook/lgbook.cxx:907 msgid "# Records in logbook" msgstr "# εγγραφές στο logbook" #: src/logbook/lgbook.cxx:918 msgid "Date Off" msgstr "" #: src/logbook/lgbook.cxx:919 msgid "Date QSO Ended" msgstr "Ημερομηνία λήξης QSO" #: src/logbook/lgbook.cxx:931 msgid "Time Off" msgstr "" #: src/logbook/lgbook.cxx:932 msgid "Time QSO ended" msgstr "Ώρα λήξης QSO" #: src/logbook/lgbook.cxx:943 msgid "Freq." msgstr "" #: src/logbook/lgbook.cxx:944 msgid "Frequency in MHz" msgstr "Συχνότητα σε MHz" #: src/logbook/lgbook.cxx:956 msgid "Mode in use" msgstr "" #: src/logbook/lgbook.cxx:967 msgid "Pwr" msgstr "" #: src/logbook/lgbook.cxx:968 msgid "Transmit power used" msgstr "Ισχύς εκπομπής που χρησιμοποιήθηκε" #: src/logbook/lgbook.cxx:979 msgid "Loc" msgstr "" #: src/logbook/lgbook.cxx:980 msgid "Stations grid square" msgstr "Grid square σταθμού" #: src/logbook/lgbook.cxx:991 msgid "Out" msgstr "" #: src/logbook/lgbook.cxx:992 msgid "Rst sent" msgstr "" #: src/logbook/lgbook.cxx:1004 msgid "City of station worked" msgstr "Πόλη δουλεμένου σταθμού" #: src/logbook/lgbook.cxx:1015 msgid "St" msgstr "" #: src/logbook/lgbook.cxx:1016 msgid "US state of station worked" msgstr "Πολιτεία ΗΠΑ δουλεμένου σταθμού" #: src/logbook/lgbook.cxx:1027 msgid "Pr" msgstr "" #: src/logbook/lgbook.cxx:1028 msgid "Province of station worked" msgstr "Επαρχία δουλεμένου σταθμού" #: src/logbook/lgbook.cxx:1040 msgid "Country of station worked" msgstr "Χώρα δουλεμένου σταθμού" #: src/logbook/lgbook.cxx:1053 msgid "QSL" msgstr "" #: src/logbook/lgbook.cxx:1054 msgid "QSL-rcvd" msgstr "" #: src/logbook/lgbook.cxx:1055 src/logbook/lgbook.cxx:1068 #: src/logbook/lgbook.cxx:1081 msgid "QSL received on this date" msgstr "QSL ελήφθη την ημερομηνία αυτή" #: src/logbook/lgbook.cxx:1067 msgid "EQSL-rcvd" msgstr "" #: src/logbook/lgbook.cxx:1080 msgid "LOTW-rcvd" msgstr "" #: src/logbook/lgbook.cxx:1093 msgid "QSL-sent" msgstr "" #: src/logbook/lgbook.cxx:1094 src/logbook/lgbook.cxx:1107 #: src/logbook/lgbook.cxx:1120 msgid "QSL sent on this date" msgstr "QSL απεστάλη την ημερομηνία αυτή" #: src/logbook/lgbook.cxx:1106 msgid "EQSL-sent" msgstr "" #: src/logbook/lgbook.cxx:1119 msgid "LOTW-sent" msgstr "" #: src/logbook/lgbook.cxx:1133 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:1163 msgid "Islands on the air" msgstr "" #: src/logbook/lgbook.cxx:1186 msgid "Cont'" msgstr "" #: src/logbook/lgbook.cxx:1211 msgid "DXCC designator" msgstr "" #: src/logbook/lgbook.cxx:1227 src/logbook/lgbook.cxx:1244 #: src/logbook/lgbook.cxx:1256 src/logbook/lgbook.cxx:1268 #: src/logbook/lgbook.cxx:1280 msgid "Interesting notes" msgstr "Ενδιαφέρουσες σημειώσεις" #: src/logbook/lgbook.cxx:1241 msgid "My Station" msgstr "Ο σταθμός μου" #: src/logbook/lgbook.cxx:1279 msgid "Station Locator" msgstr "Locator σταθμού" #: src/logbook/lgbook.cxx:1295 msgid "Ser out" msgstr "" #: src/logbook/lgbook.cxx:1296 src/logbook/lgbook.cxx:1421 msgid "Contest seral # sent" msgstr "" #: src/logbook/lgbook.cxx:1307 msgid "Exch Out" msgstr "" #: src/logbook/lgbook.cxx:1308 src/logbook/lgbook.cxx:1445 msgid "Contest exchange sent" msgstr "" #: src/logbook/lgbook.cxx:1319 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:1320 msgid "Contest serial # received" msgstr "" #: src/logbook/lgbook.cxx:1331 msgid "Exch In" msgstr "" #: src/logbook/lgbook.cxx:1332 src/logbook/lgbook.cxx:1457 msgid "Contest exchange received" msgstr "" #: src/logbook/lgbook.cxx:1344 msgid "Field Day class received" msgstr "" #: src/logbook/lgbook.cxx:1355 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1356 msgid "Field Section received" msgstr "" #: src/logbook/lgbook.cxx:1368 msgid "Operators age received" msgstr "" #: src/logbook/lgbook.cxx:1380 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1392 msgid "Operating band" msgstr "Μπάντα λειτουργίας" #: src/logbook/lgbook.cxx:1404 msgid "Check value received" msgstr "" #: src/logbook/lgbook.cxx:1417 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1418 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1420 msgid "Ser NoR" msgstr "" #: src/logbook/lgbook.cxx:1444 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1470 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1471 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1473 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1474 msgid "Sent troop number" msgstr "" #: src/logbook/lgbook.cxx:1485 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1486 msgid "Received troop number" msgstr "" #: src/logbook/lgbook.cxx:1497 msgid "Name-S" msgstr "" #: src/logbook/lgbook.cxx:1498 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1509 msgid "Name-R" msgstr "" #: src/logbook/lgbook.cxx:1510 msgid "Received scout name" msgstr "" #: src/logbook/lgbook.cxx:1526 msgid "Call Search" msgstr "Αναζήτηση Call" #: src/logbook/lgbook.cxx:1527 msgid "Search for this callsign" msgstr "Αναζήτηση για αυτό το callsign" #: src/logbook/lgbook.cxx:1539 msgid "Find previous" msgstr "Εύρεση προγούμενου" #: src/logbook/lgbook.cxx:1547 msgid "Find next" msgstr "Εύρεση επόμενου" #: src/logbook/lgbook.cxx:1554 msgid "Retrieve" msgstr "Ανάκτηση" #: src/logbook/lgbook.cxx:1555 msgid "Retrieve for active modem use" msgstr "Ανάκτηση για χρήση ενεργού modem" #: src/logbook/lgbook.cxx:1568 msgid "New record / Save record" msgstr "Νέα εγγραφή / Αποθήκευση εγγραφής" #: src/logbook/lgbook.cxx:1575 msgid "Update the current record" msgstr "Ενημέρωση τρέχουσας εγγραφής" #: src/logbook/lgbook.cxx:1582 msgid "Delete the current record" msgstr "Διαγραφή τρέχουσας εγγραφής" #: src/logbook/lgbook.cxx:1588 msgid "File:" msgstr "Αρχείο:" #: src/logbook/lgbook.cxx:1611 msgid "Date" msgstr "Ημερομηνία" #: src/logbook/lgbook.cxx:1613 msgid "Time" msgstr "Ώρα" #: src/logbook/lgbook.cxx:1630 msgid "Cabrillo Setup" msgstr "Ρυθμίσεις Cabrillo" #: src/logbook/lgbook.cxx:1650 msgid "Select Cabrillo Contest & Fields" msgstr "" #: src/logbook/lgbook.cxx:1653 msgid "Contest:" msgstr "Διαγωνισμός:" #: src/logbook/lgbook.cxx:1678 msgid "QSO Date" msgstr "Ημερομηνία QSO" #~ msgid "Searches passband" #~ msgstr "Αναζήτηση σε όλο το εύρος" #~ msgid "Lighted button enabled colors" #~ msgstr "Χρώματα ενεργοποιημένων φωτιζόμενων κουμπιών" #~ msgid "All Others" #~ msgstr "Όλα τα άλλα" #~ msgid "Station QTH:" #~ msgstr "QTH σταθμού:" #~ msgid "Signal level" #~ msgstr "Επίπεδο σήματος" #~ msgid "Filter Settings" #~ msgstr "Ρυθμίσεις φίλτρου" #~ msgid "Rx audio volume" #~ msgstr "Ένταση ήχου RX" #~ msgid "Weather Fax Image RX" #~ msgstr "Λήψη εικόνας Weather Fax" #~ msgid "No file name given" #~ msgstr "Δεν δόθηκε όνομα αρχείου" #~ msgid "channels != 1" #~ msgstr "κανάλια != 1" #~ msgid "unknown wave file error" #~ msgstr "Άγνωστο σφάλμα αρχείου wave" #~ msgid "Rig control" #~ msgstr "Έλεγχος Π/Δ" #~ msgid "KISS control" #~ msgstr "Έλεγχος KISS" #, fuzzy #~ msgid "Change log level" #~ msgstr "Ετικέτα καναλιού" #, fuzzy #~ msgid "Signal Level Colors" #~ msgstr "Επίπεδα σήματος" #~ msgid "Center freq (1500 Hz)" #~ msgstr "Κεντρική συχν. (1500 Hz)" #, fuzzy #~ msgid "Save image as monochrome file" #~ msgstr "Αποθήκευση αρχείου macro" #~ msgid "Misc/IO" #~ msgstr "Διάφορα/IO" #~ msgid "Alerts / Rx Audio" #~ msgstr "Ειδοποιήσεις / Ήχος Λήψης" #~ msgid "Reading fonts..." #~ msgstr "Ανάγνωση γραμματοσειρών..." #~ msgid "Rig Control/CAT (rigcat" #~ msgstr "Έλεγχος ΠΔ/CAT (rigcat" #~ msgid "Colors-Fonts/FreqDisplay - Meters" #~ msgstr "Χρώματα-Γραμματοσειρές/FreqDisp - Meters" #~ msgid "Station" #~ msgstr "Σταθμός" #~ msgid "Active Modem" #~ msgstr "Ενεργό Modem" #~ msgid "Miscellaneous" #~ msgstr "Διάφορα" #~ msgid "CPU speed" #~ msgstr "Ταχύτητα CPU" #~ msgid "Station / Operator" #~ msgstr "Σταθμός / Χειριστής" #~ msgid "Browser" #~ msgstr "Περιηγητής" #~ msgid "Buttons" #~ msgstr "Κουμπιά" #~ msgid "Display" #~ msgstr "Προβολή" #~ msgid "Mouse" #~ msgstr "Ποντίκι" #~ msgid "Spectrum" #~ msgstr "Αναλυτής φάσματος" #~ msgid "Rig" #~ msgstr "Π/Δ" #~ msgid "Devices" #~ msgstr "Συσκευές" #~ msgid "Alerts" #~ msgstr "Ειδοποιήσεις" #~ msgid "Temperature" #~ msgstr "Θερμοκρασία" #~ msgid "Wind speed/dir" #~ msgstr "Ταχύτητα/κατευθ.ανέμου" #~ msgid "Barometric pressure" #~ msgstr "Βαρομετρική πίεση" #~ msgid "Experimental" #~ msgstr "Πειραματικό" #~ msgid "Enter a CALL !" #~ msgstr "Εισάγετε ένα CALL!" #~ msgid "Click to set power level" #~ msgstr "Πατήστε για ρύθμιση ισχύος" #~ msgid "Adjust Power Level" #~ msgstr "Ρύθμιση ισχύος" #~ msgid "Return to Smeter / Pmeter" #~ msgstr "Επιστροφή σε Smeter / Pmeter" #~ msgid "Toggle smeter / combo controls" #~ msgstr "Εναλλαγή smeter / combo controls" #~ msgid "Clear list" #~ msgstr "Καθαρισμός λίστας" #~ msgid "Delete from list" #~ msgstr "Αφαίρεση από τη λίστα" #~ msgid "frequency kHz" #~ msgstr "Συχνότητα kHz" #~ msgid "Press to update QSO start time" #~ msgstr "Πατήστε για ενημέρωση της ώρας έναρξης του QSO" #~ msgid "QSO end time" #~ msgstr "Ώρα λήξης QSO" #~ msgid "Azimuth" #~ msgstr "Αζιμούθιο" #~ msgid "QTH City" #~ msgstr "Πόλη QTH" #~ msgid "US State" #~ msgstr "Πολιτεία ΗΠΑ" #~ msgid "" #~ "Left click - save avatar\n" #~ "Right click - send my avatar" #~ msgstr "" #~ "Αριστερό κλικ - αποθήκευση avatar\n" #~ "Δεξί κλικ - αποστολή του avatar μου" #~ msgid "Press to update" #~ msgstr "Πατήστε για ενημέρωση" #~ msgid "" #~ "Left Click - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Αριστερό κλικ - εκτέλεση\n" #~ "Δεξί κλικ - επεξεργασία" #~ msgid "" #~ "Left Click - execute\n" #~ "Shift-Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Αριστερό κλικ - εκτέλεση\n" #~ "Shift-Fkey - εκτέλεση\n" #~ "Δεξί κλικ - επεξεργασία" #~ msgid "" #~ "Left click - select\n" #~ "Right click - clear line" #~ msgstr "" #~ "Αριστερό κλικ - επιλογή\n" #~ "Δεξί κλικ - καθαρισμός γραμμής" #~ msgid "Stations Heard" #~ msgstr "Σταθμοί που ακούστηκαν" #~ msgid "" #~ "Left Click - execute\n" #~ "Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Αριστερό κλικ - εκτέλεση\n" #~ "Fkey - εκτέλεση\n" #~ "Δεξί κλικ - επεξεργασία" #~ msgid "Single-click to capture Rx word" #~ msgstr "Συλλ.κειμένου με μονό κλικ σε λαμβ.λέξη" #~ msgid "Clear fields with CALL capture" #~ msgstr "Καθαρισμός πεδίων στη συλλογή CALL" #~ msgid "Fast (2 msec)" #~ msgstr "Γρήγορο (2 msec)" #~ msgid "Initial spectrum range is NN times the modem bw" #~ msgstr "Το αρχικό εύρος του αναλυτή είναι ΝΝ φορές το εύρος του mode" fldigi-4.2.05/po/fr.gmo0000664000175000017500000006111614611714004011517 00000000000000 p!q!!! !!!!!!!!! ""(";"L"["m"}" " " """""""#C # M# X#c##l###D# ## $$=$Y$ n${$$$ $$ $ $$$$$8$ %'%/%L%[%d%{%&%% % % &+ & L&7Z&&'&&&& '0 ' ='I'[' a'l'r''' '''' '''((;.(j(r(( (((((( ( (((( ) )))2)9)B))*** * * ***+-+F+L+ R+ \+h+m+++:+ +3+1, 8, F,S,Z,a,q,,,$,,,, ,--!-/6-f-k- q-{----- ----------..-. D.O.k. .. . ....9.8/.W//V0[0n0~000000 0011'171H1M1R1b1 h1#v1111111111 1!1!2;21>2 p2z222222 222 33'3/3 83F3/U33 33 333333 34&4 ,4 640B4s4 |44 44 4 4444*4455 55!5*535:5B5K5b5 w5555555a6r6 z66!6"66 6666 6 7 77777 8 8&8.848;8M8 T8_8 |8 8 888888 9909 @9 N9X9j9 p9}99 9999999 99-9*:E: L:X: `:+m:/:%:::+*;V;[;d;l;u; };;;;;;; ; ;;;;< <'< /<:<P<m< ~<< <<< <<'< =="#=F='L=t======_=?1? K?V?e?n?t?}????? ???@@(@>@S@ h@u@@@@@@@@@`@ RA _AlA)uAAALA BB1B,GB#tBBBBBB BC CC%C-C 1C ;C@ECCCCCCCC6D09D#jDDD7DDKEPE7gEEEE E6E)F;FQFXFhFpFF FFFFF FF#G&G-GJJGGGGGGGGGH H #H0H5HNGNLNaNfN~N NNN&NOO %O#3OWO [OCgO1O.O PQ Q(Q =QGQ_Q~Q(QQQQQQR&R8R?RDR^RdR9sRRRRRRRRRS S(S,@SmSHpSSSS S T:T CTNT^TxTTT T TTT2T%U'+USU kUuU }UUUUU.UU UU5V:V CVNV RV\VdV tV VVV9VVVVVV VWWWW&WEW _W4jW WWWWWXXX X(X)XYY%Y .Y:YJY\YZ 'Z"HZkZZZZ ZZZZ [[,+['X[ [[![[[[\\/\J\_\r\\\\\\\\ \\\]] 4] >]<H]]]]]]=]8^*J^Iu^:^^ _ _ __&_:_C_ H_U_h_y_!_"__ __ `` (`5`E`#e````` ` ` aa<#a`a{a"aaBa%abb!b)b2b65J*'>1/+d[wB^&"?fd:z+Slv6~<%MG($o2ECb8 nvei!^a R k3{@7zHtuT UF>#*1RcOO-Qxne|0PFg=Pgl=K }`(pfWDq K%9,E Zs~Vy)m#J".<H $9xp84Xjq 0_}U4I &Zsjk7/Sh[|h5;2,'I`u{rwC\r:bX]A -yaVDm\B3!N) iGLY?]@;tNoWQAcLY_.MT%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&OK&View other call my frequency other locator mode my call my locator my name my RST other name other QTH other RST receive transmitAFC behaviorAFC range (Hz)AbortActionAddAdjust cursor frequencyAdvanced configuration:AllAll settings shown here can be changed later via the Configure menuAlways LSBAlways USBAntenna:Appearance of label on each channelAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio input deviceAudio output deviceAuto-fill Country and AzimuthAutomatic Frequency ControlAvailable substringsBad modem idBandBands must matchBeginners' GuideBuild infoButtonButton HeightC&ountriesCQ zoneCQZCallCallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture and playback devicesCapture deviceCapture:Carrier frequency (Hz)Center display on signalCenter in passband Right click to undoChange # of psk viewer channelsChange application look and feelChange colorChange waterfall scaleChanges take effect on next program startupChannel labelChannels, first channel starts at waterfall lower limitCheck for duplicatesCheck for updates when starting programCheck for updates...Checking for updates...ClearClear AllClear channel text after # seconds of inactivityClear list?Clear log fields?CloseClose ListColorColors and cursorsCommand line optionsConfirmConfirm RESETConnect to serverContestContest:ContinentContinuous scrollingConvert callsign to upper caseCopyCould not open url: %s Could not run a web browser: %s Open this URL manually: %sCountryCreate cabrillo reportCreate sunspotsCustom...CutDTR +12DTR = +VDTR is PTT signal lineDXCCDXCC entitiesDXCC entityDateDebugDefaultDefault WPMDefault test string is: "DefaultsDeleteDeselectDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDevice:DigitsDocked scopeDon't saveDup ColorEnable / disable icons on menusEnable / disable tooltipsEnabledEnter test string or leave blank for default:ErrorEventEvent logExchange InExitExport to ADIF fileExport to CSV fileExport to fixed field text fileFeel free to skip any pages or exit the wizard at any timeFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFind country:Find prefix:Find: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFont colorFont...Font:Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsFreqFreq.FrequencyFullGeneralGroup 1Group 2Group 3Hamcall.netHamlib used for rig controlHeight of macro barHideHost:IDsIOTAITU zoneITUZInactivity timeoutInfoInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInsert file...Insert markerInsert textIntegration period (FEC blocks)LOCLast QSOLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. LoadLoad a new paletteLoad image fileLoad...Locate executableLocate flmsg executableLocatorLock transmit frequencyLog all RX/TX textLook up callMacro editor - MacrosMaidenhead locator as in EM64qvMerge ADIF fileMinimal controlsMiscModeMode must matchModemModem carrierMouse wheel active on macro buttonsMy callsign de CALLNBEMS files...NO CALLSIGN SETNameNewNextNoNoneNotesNotificationsNumber and position of macro barsNumber of digits in serial numberOKON - use last set of macros OFF - use default setOdd linesOne above Rx/TxOne above waterfallOne below waterfallOnline documentation...Op &ModeOpen ...Open ListOpen logbook fileOpen macro fileOpen paletteOpen rig xml fileOpen...OperatorOperators QTHOperators nameOptional configuration in format: param=val ...OtherPTT tone on right audio channel PTT via Hamlib commandPalette: ParityPasswordPastePlaybackPlayback devicePlayback:Please set your callsign first.Port:PortAudioPower scalePrint CW / RTTY / THROB / CONTESTIA in lowercaseProvincePulseAudioQRZQRZ cdromQRZ.comQSL rcvd dateQSL sent dateQSL-rcvdQSL-sentQSO DateQSO must not occur within a time period ofQTHQTH:QthQuietRSID receptionRST rcvdRST sentRST(r)RTS +12RTS = +VRTS is PTT signal lineRTS/CTS flow controlRX captureReally delete record for "%s"?ReceiveReception reports...RemoveResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Restore defaultsReverseReverse videoRig modeRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig:Run programS-meterSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed macros?Save logbook fileSave macro fileSave paletteSave text asSave...ScopeScrollSearch range (Hz)SelectSelect AllSelect modes for menu accessSelect the type of FFT prefilterSend imageSend image...Set Viewer SquelchShort description of antennaShowShow DXCC entitiesShow all modesShow fewer modesShow macro editorShow menu iconsShow tooltipsSideband:Signal range (dB)Size:Speed (WPM):Spotting disabledSquelchSquelch levelStStartStarting numberStateState must matchStation heard twiceStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!SystemTX generateTest...Text CaptureThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The test string did not match this event's search pattern.This event's regular expression is invalid.TimeTime OFFTime ONTime OffTime OnTime needed: ToggleTonesTransmitTransmit modesTransmit/ReceiveTx level attenuator (dB)UI languageUI schemeUndoUpdateUpper signal level (dB)Use DTRUse HamlibUse RTSUse RigCATUse parallel port PTTUse separate serial port PTTUse uHRouter PTTUser nameView/Hide ChannelsVisible modesWF MagnificationWarningWaterfallWaterfall drop speedWrite current macro set on program exitXON/XOFF flow controlYesYou are running the latest versionafterenable mouse wheel control of macro barh/w ptt device-pinminutesreportreportssecondswaterfall-only modeProject-Id-Version: fldigi 3.22.01 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2010-03-06 13:04+0200 Last-Translator: Bernard Seront, F4GAR Language-Team: French Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); %s log démarré le %s%s: N'existe pas, créer?À &propos&Configuration&Fichier&Aide&Journal&OK&Vue indicatif de l'autre ma fréquence locator de l'autre mode mon indicatif mon locator mon nom mon RST nom de l'autre QTH de l'autre RST de l'autre reçois transmetsComportement AFCPlage AFC (Hz)AnnulerActionAjouteAjuste fréquence curseurConfiguration avancée:TousTous les réglages présents ici peuvent être changés ultérieuremet par le menu configurationToujours LSBToujours USBAntenne:Apparence de l'étiquette de chaque canalAudioInfo périphérique audioInformation sur le périphérique audio disponible uniquement pour PortAudioFichier audioPériph. audio entréePériph. audio sortieRemplir automatiquement le pays et l'azimuthContrôle Automatique de FréquenceSous-phrases disponiblesMauvais id modemBandeLes bandes doivent correspondreGuide DébutantsInfo BuildBoutonHauteur des boutonsPa&ysZone CQCQZIndicatifIndicatifPeut être utilisé à la place ou en plus d'autres types de PTTAnnulerCapturePériph de capture et sortiePériph. captureCapture:Fréquence porteuse (Hz)Centre affichage sur signalCentrer dans la bande passante Clic droit pour annulerChanger le nombre de canaux du visualisateur pskChanger l'apparence del'applicationChange couleurChange échelle chute d'eauChangements prenent effet lors du prochain redémarrageEtiquette du canalCanaux, le prmeier canal démarre à la limite inférieure dela chute d'eauVérifier les doublonsRechercher des mises à jour au démarrage du programmeRechercher des mises à jour...Recherche des mises à jour...EffacerEfface ToutEffacer le canal texte après # secondes d'inactivitéEffacer la liste?Effacer champ de log?FermerFermer la ListeCouleurCouleurs et curseursOptions de ligne de commandeConfirmerConfirmer RESETConnecter au serveurConcoursContest:ContinentDéfillement continuConvertir l'indicatif en majusculesCopierEchec d'ouverture d'url: %s Ehec de lancement du navigateur web: %s Ouvrez cette url manuellement: %sPaysCréer un rapport CabrilloCréation sunspotsPersonnalisé...CouperDTR +12DTR = +VDTR est la ligne de signal PTTDXCCEntités DXCCEntité DXCCDateDébugDéfautWPM par défautLa phrase test par défaut est: "DéfautsSupprimerDésélectionneDetecter les occurances de [WRAP:beg] et [WRAP:end] Sauvegarder les tags et tout le texte inclus vers un fichier taggé date-heure, ie: NBEMS.files \WRAP\recv\extract-20090127-092515.wrapDetecter les occurances de [WRAP:beg] et [WRAP:end] Sauvegarder les tags et tout le texte inclus vers un fichier taggé date-heure, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapNiveau de signal détectéPériphérique:ChiffresScope permanentNe pas sauvegarderCouleur des DupAfficher / masquer les icônes de menusAfficher / masquer les astucesActivéEntrer la phrase test ou laisser vide par défautErreurÉvénementHistorique événementsEchangeQuitterExport vers fichier ADIFExporter vers un fichier CSVExporter vers un fichier à champs fixesVous pouvez sauter une page ou quiter l'assistant à tout momentE/S fichier seulementRemplir le pays et l'azimuth en utilisant l'informaton de cty.datFiltreTrouve le pays:Trouve le préfix:Cherche: FiniIntervalles fixesConfig Fldigi...Configuration FldigiPalette Fldigi *.palFichier de définition rig xml *.xmlSite web Fldigi...Scope flottantDossiersCouleur policePolice...Police:Forcer le champ indicatif en majusculesForcer l'espacement des canaux à des incréments uniformes de 100 HzFréqFréq.FréquenceTousGénéralGroupe 1Groupe 2Groupe 3Hamcall.netHamlib utilisé pour contrôle radioHauteur de la bare de macrosCacherHôte:IDsIOTAZone ITUTIUZDélai d'inactivitéInfoVoltage initial sur DTRVoltage initial sur RTSInitialiseInitialise interface RigCATInitialise interface hamlibInitialise l'interface PTT matérielleInsèrer fichier...Insère marqueurInsère textePériode d'intégration (FEC blocs)LOCDernier QSOClic gauche pour effacer le texte Clic droit pour reset fréquencesClic gauche pour sélectionner la couleur des DupClic Gauche: change mode Clic Droit: configureLicence GPLv3+: GNU GPL version 3 ou ultérieure Ceci est un logiciel libre : vous êtes libre de le modifier et de le redistribuer. Ce logiciel n'offre pas d'autre garantie que celle imposée par la loi. ChargeCharge une nouvelle paletteCharge fichier imageCharge...Rechercherl'exécutableRechercher l'exécutable flmsgLocatorVérouille la fréquence de transmissionLoguer tout le texte RX/TXRecherche indicatifÉditeur de macro - MacrosLocalisation MaidenheadFusion fichier ADIFContrôle minimalDiversModeLe mode doit correspondreModemPorteuse modemLa molette de souris est active sur les boutons de macrosMon indicatif de CALLFichiers NBEMS...PAS D'INDICATIFNomNouveauSuivantNonAucunNotesNotificationsNombre et positions des barres de macrosNombre de chiffres dans le numéro de sérieOKON : utiliser le dernier jeu de macros OFF : utiliser le jeu par défautLignes impairesUne au dessus de RX/TXUneau dessus de la chute d'eauUne en dessous de la chute d'eauDocumentation en ligne...&Mode OpOuvrir ...Ouvrir la ListeOuvrir le fichier journalOuvrir fichier macrosOuvrir paletteOuvrir fichier rig xmlOuvrir...OpérateurQTH des opérateursNoms des opérateursConfiguration optionnelle au format: param=val ...AutreTonalité PTT sur le canal audio droit PTT par commande HamlibPalette: ParitéMot de passeCollerSortiePériph. sortieSortie:Merci de configurer votre indicatif en premierPort:PortAudioEchelle de puissanceImprimmer CW / RTTY / THROB / CONTESTIA en minusculesProvincePulseAudioQRZQRZ cdromQRZ.comDate QSL reçueDate QSL env.QSL-reçuQSL-env.Date QSOUn QSO ne doit pas avoir lieu sur une p&riode de temps deQTHQTH:QthCalmeRéception RSIDRST reçuRST env.RST(r)RTS +12RTS = +VRTS est la ligne de signal PTTContrôle de flux RTS/CTSCapture RXConfirmer la suppression d'enregistrement pour "%s"?RéceptionRapport d'écoute...EnleverRemise à zéroRéinitialiser toutes les options? La réinitialisation des options sera effective au prochain démarrage Les fichiers: fldigi_def.xml et fldigi.prefs seront effacés! Restaure défautsInverseInverse vidéoMode RadioRadio requiert contrôle de flux RTS/CTSRadio requiert contrôle de flux Xon/XoffRadio:Exécuter le prgrammeS-mètreSauvegarderSauvegarder ...Sauvegarde ConfigSauvegarder tout le texte reçu, un charactère àla fois dans le fichier suivant: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Enregistrer sous...Sauvegarder le journal modifié?Sauvegarder les macros modifiées?Sauvegarde le fichier journalEnregistrer fichier macrosEnregistrement paletteSauvegarder le texte sousSauvegarde...ScopeDéfilerPlage du recherche (Hz)SélectionnerTout SélectionnerSélectionner les modes accessibles par menuSélectionner le type depré-filtre FFTEnvoyer imageEnvoyer image...Positionne le Squelch VisualiseurCourte description de l'antenneMontrerMontre les entités DXCCMontrer moins demodesMontrer moins de modesMontre l'éditeur de macroMontrer icônes menuMontrer infobullesBande latérale:Plage du signal (dB)Taille:Vitesse (WPM):Repérage désactivéSquelchNiveau squelchStDémarrerNuméro de dépardÉtatL'état doit correspondreStation enrendue 2 foisStop bitsBits stopEnregistre le mode et la fréquence Clic droit pour la listeCréation sunspot en cours!SystèmeGénération TXTest...Capture le texteLe nom de fichier est écrit dans la zone texte de réceptionLe champ d'expression régulière ne doit pas être videL'expression régulière doit être valideLa phrase test ne correspond pas au motif de recherche de cet évennementL'expression régulière pour cet évennement est invalideHeureHeure OFFHeure ONHeure OFFHeure ONTemps nécessaire: BasculerTonsTransmissionModes transmissionTransmet/ReçoitNiveau d'atténuation Tx (dB)Langue de l'interface utilisateurSchéma de l'interface utilisateurAnnulerMise à jourNiveau haut de signal (dB)Utiliser DTRUtilise HamlibUtiliser RTSUtiliser RigCATUtiliser un port parallèle PTTUtiliser un port série PTT à partUtiliser PTT uHRouterNom utilisateurMontrer/Cacher canauxModes visiblesAgrandissement de la chute d'eauAvertissementChute d'eauVitesse chute d'eauSauvegarder le jeu de macro actuel à la sortie du programmeContrôle de flux XON/XOFFOuiVous utilisez la dernière versionaprèsActiver le controle de la barre de macros par la molette de sourisBrochage périphérique PTT matérielminutesreportreportssecondesMode chute d'eau-uniquementfldigi-4.2.05/po/ru.po0000664000175000017500000110147714611714004011400 00000000000000# Russian translation file for Fldigi. # Copyright (C) YEAR Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the PACKAGE package. # Alexandr Kalugin rx9cdr@gmail.com, 2017. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.23.21.6\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2024-04-23 06:14-0500\n" "PO-Revision-Date: 2017-03-14 14:10+0500\n" "Last-Translator: RX9CDR \n" "Language-Team: RX9CDR Russia, tnx for help UV7QAE Ukraina \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.12\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Poedit-SourceCharset: UTF-8\n" #: src/main.cxx:1052 #, c-format msgid "%s log started on %s" msgstr "%sлог стартует на %s" #: src/main.cxx:1779 msgid "Bad modem id" msgstr "" #: src/main.cxx:1786 msgid "Bad frequency" msgstr "Плохая частота" #: src/main.cxx:1909 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" #: src/main.cxx:2136 src/main.cxx:2178 src/main.cxx:2202 src/main.cxx:2216 msgid "Could not make directory " msgstr "Не удалось создать каталог" #: src/debug/debug.cxx:88 msgid "Quiet" msgstr "Тихо" #: src/debug/debug.cxx:88 msgid "Error" msgstr "Ошибка" #: src/debug/debug.cxx:88 msgid "Warning" msgstr "Внимание" #: src/debug/debug.cxx:88 msgid "Info" msgstr "Инфо" #: src/debug/debug.cxx:88 msgid "Verbose" msgstr "Подробно" #: src/debug/debug.cxx:88 src/dialogs/confdialog.cxx:15244 msgid "Debug" msgstr "Отладка" #: src/dialogs/fl_digi.cxx:202 msgid "Log all RX/TX text" msgstr "Загрузить все RX/TX тексты" #: src/dialogs/fl_digi.cxx:204 src/dialogs/fl_digi.cxx:7622 msgid "Op &Mode" msgstr "Модуляция" #: src/dialogs/fl_digi.cxx:205 msgid "Show fewer modes" msgstr "Показать меньше режимов" #: src/dialogs/fl_digi.cxx:206 msgid "Show all modes" msgstr "Показать все моды" #: src/dialogs/fl_digi.cxx:210 msgid "&View" msgstr "Вид" #: src/dialogs/fl_digi.cxx:211 msgid "MFSK Image" msgstr "MFSK Изображение" #: src/dialogs/fl_digi.cxx:212 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:213 msgid "IFKP Raw Image" msgstr "IFKP Raw Image" #: src/dialogs/fl_digi.cxx:214 msgid "Weather Fax Image TX" msgstr "" #: src/dialogs/fl_digi.cxx:215 src/dialogs/confdialog.cxx:10746 #: src/logbook/lgbook.cxx:1293 msgid "Contest" msgstr "Контесты" #: src/dialogs/fl_digi.cxx:216 msgid "C&ountries" msgstr "Страны" #: src/dialogs/fl_digi.cxx:217 msgid "&UI" msgstr "Интерфейс" #: src/dialogs/fl_digi.cxx:218 msgid "Full" msgstr "Полный" #: src/dialogs/fl_digi.cxx:219 msgid "Partial" msgstr "Частичный" #: src/dialogs/fl_digi.cxx:220 src/waterfall/waterfall.cxx:2595 #: src/dialogs/confdialog.cxx:9908 src/dialogs/confdialog.cxx:9997 #: src/dialogs/confdialog.cxx:19028 msgid "None" msgstr "Нет" #: src/dialogs/fl_digi.cxx:221 msgid "Docked scope" msgstr "Docked scope" #: src/dialogs/fl_digi.cxx:222 msgid "Minimal controls" msgstr "Минимальный контроль" #: src/dialogs/fl_digi.cxx:223 msgid "Show channels" msgstr "Показать каналы" #: src/dialogs/fl_digi.cxx:225 msgid "Connect to server" msgstr "Соединиться с сервером" #: src/dialogs/fl_digi.cxx:1050 src/dialogs/fl_digi.cxx:1079 #: src/dialogs/fl_digi.cxx:1089 src/dialogs/fl_digi.cxx:5976 #: src/dialogs/fl_digi.cxx:6069 src/dialogs/fl_digi.cxx:6146 #: src/dialogs/fl_digi.cxx:7650 src/dialogs/fl_digi.cxx:7719 #: src/dialogs/fl_digi.cxx:7796 msgid "Custom..." msgstr "Custom..." #: src/dialogs/fl_digi.cxx:1147 src/dialogs/confdialog.cxx:369 #: src/dialogs/confdialog.cxx:10673 src/dialogs/confdialog.cxx:10739 #, fuzzy msgid "Colors-Fonts" msgstr "Цвета && Шрифты" #: src/dialogs/fl_digi.cxx:1148 src/dialogs/confdialog.cxx:370 #: src/dialogs/confdialog.cxx:11067 #, fuzzy msgid "Contests" msgstr "Контесты" #: src/dialogs/fl_digi.cxx:1149 src/dialogs/confdialog.cxx:371 #: src/dialogs/confdialog.cxx:11338 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:1150 src/dialogs/confdialog.cxx:372 #: src/dialogs/confdialog.cxx:11810 src/dialogs/confdialog.cxx:11896 #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14240 msgid "Logging" msgstr "Регистроция" #: src/dialogs/fl_digi.cxx:1151 #, fuzzy msgid "Modem/CW" msgstr "Modem" #: src/dialogs/fl_digi.cxx:1152 #, fuzzy msgid "Modem/TTY" msgstr "Modem" #: src/dialogs/fl_digi.cxx:1153 src/waterfall/waterfall.cxx:2597 #: src/dialogs/confdialog.cxx:373 msgid "Modem" msgstr "Modem" #: src/dialogs/fl_digi.cxx:1154 src/dialogs/confdialog.cxx:374 #: src/dialogs/confdialog.cxx:17169 msgid "Misc" msgstr "Разное" #: src/dialogs/fl_digi.cxx:1155 src/dialogs/confdialog.cxx:375 #: src/dialogs/confdialog.cxx:18303 src/dialogs/confdialog.cxx:18366 #, fuzzy msgid "Rig Control" msgstr "RIG контроль" #: src/dialogs/fl_digi.cxx:1156 src/dialogs/confdialog.cxx:376 #: src/dialogs/confdialog.cxx:18974 #, fuzzy msgid "Soundcard" msgstr "Звуковая карта" #: src/dialogs/fl_digi.cxx:1157 src/dialogs/confdialog.cxx:377 #: src/dialogs/confdialog.cxx:19497 msgid "UI" msgstr "Интерфейс" #: src/dialogs/fl_digi.cxx:1158 src/dialogs/fl_digi.cxx:6238 #: src/dialogs/confdialog.cxx:378 src/dialogs/confdialog.cxx:13939 #: src/dialogs/confdialog.cxx:20045 msgid "Waterfall" msgstr "Водопад" #: src/dialogs/fl_digi.cxx:1159 src/dialogs/confdialog.cxx:379 #: src/dialogs/confdialog.cxx:20245 msgid "Web" msgstr "Web" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4547 msgid "Save changed macros?" msgstr "Сохранить измененные макросы?" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4134 #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 #: src/logbook/logsupport.cxx:1205 src/misc/configuration.cxx:726 #: src/dialogs/font_browser.cxx:173 src/logbook/lgbook.cxx:837 #: src/logbook/lgbook.cxx:1647 msgid "Cancel" msgstr "Выйти" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:6250 #: src/logbook/logsupport.cxx:330 src/logbook/logsupport.cxx:1204 #: src/dialogs/confdialog.cxx:13194 src/dialogs/confdialog.cxx:15191 #: src/dialogs/confdialog.cxx:20248 msgid "Save" msgstr "Сохранить" #: src/dialogs/fl_digi.cxx:1622 msgid "Don't save" msgstr "Не сохранять" #: src/dialogs/fl_digi.cxx:1771 msgid "Switch to ARQ I/O" msgstr "Переключиться на ARQ I/O" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "No" msgstr "Нет" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "Yes" msgstr "Да" #: src/dialogs/fl_digi.cxx:2630 msgid "Playback continuous loop?" msgstr "Воспроизводить непрерывно?" #: src/dialogs/fl_digi.cxx:2635 #, fuzzy msgid "Unsupported audio format" msgstr "Не используемый формат" #: src/dialogs/fl_digi.cxx:2642 msgid "Spotting disabled" msgstr "Споттинг отключен" #: src/dialogs/fl_digi.cxx:2694 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Браузер не запустился:\n" "%s\n" "\n" "откройте URL вручную:\n" "%s" #: src/dialogs/fl_digi.cxx:2707 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Не открывается url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2790 msgid "Checking for updates..." msgstr "Проверить обновление" #: src/dialogs/fl_digi.cxx:2794 msgid "Update site not available" msgstr "Сайт обновлений не доступен" #: src/dialogs/fl_digi.cxx:2806 msgid "You are running the latest version" msgstr "Вы используете последнюю версию" #: src/dialogs/fl_digi.cxx:2810 #, fuzzy msgid "You are probably running an alpha version " msgstr "Вы используете последнюю версию" #: src/dialogs/fl_digi.cxx:2811 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2816 #, c-format msgid "Version %s is available at Source Forge" msgstr "Версия %s доступна на Source Forge" #: src/dialogs/fl_digi.cxx:2885 msgid "Sunspot creation underway!" msgstr "Создание солнечных пятен!" #: src/dialogs/fl_digi.cxx:2892 msgid "Audio device information is only available for the PortAudio backend" msgstr "Информация об аудио устройстве доступна только для PortAudio" #: src/dialogs/fl_digi.cxx:2901 msgid "Capture device" msgstr "Устройство захвата" #: src/dialogs/fl_digi.cxx:2902 msgid "Playback device" msgstr "Устройство воспроизведения" #: src/dialogs/fl_digi.cxx:2906 msgid "Capture and playback devices" msgstr "Захват и воспроизводящие устройства" #: src/dialogs/fl_digi.cxx:2952 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: Не существует, создать?" #: src/dialogs/fl_digi.cxx:4134 msgid "Clear log fields?" msgstr "Очистить поля лога?" #: src/dialogs/fl_digi.cxx:4134 src/misc/configuration.cxx:726 #: src/logbook/lgbook.cxx:834 src/logbook/lgbook.cxx:1644 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 msgid "Confirm" msgstr "Подтвердить" #: src/dialogs/fl_digi.cxx:4539 msgid "Save changed configuration?" msgstr "Сохранить конфигурацию?" #: src/dialogs/fl_digi.cxx:4555 src/dialogs/fl_digi.cxx:4580 msgid "Save log entry?" msgstr "Сохранить журнал?" #: src/dialogs/fl_digi.cxx:4571 msgid "Confirm Quit" msgstr "Подтвердить выход" #: src/dialogs/fl_digi.cxx:4593 msgid "Confirm quit?" msgstr "Подтвердить выход?" #: src/dialogs/fl_digi.cxx:5915 src/dialogs/fl_digi.cxx:7618 msgid "&File" msgstr "Файл" #: src/dialogs/fl_digi.cxx:5917 msgid "Folders" msgstr "Папки" #: src/dialogs/fl_digi.cxx:5918 msgid "Fldigi config..." msgstr "Fldigi config..." #: src/dialogs/fl_digi.cxx:5919 msgid "FLMSG files..." msgstr "FLMSG files..." #: src/dialogs/fl_digi.cxx:5920 msgid "NBEMS files..." msgstr "NBEMS files..." #: src/dialogs/fl_digi.cxx:5921 #, fuzzy msgid "WEFAX images..." msgstr "Отправить изображение..." #: src/dialogs/fl_digi.cxx:5922 msgid "Data files..." msgstr "Data files..." #: src/dialogs/fl_digi.cxx:5925 msgid "Macros" msgstr "Макрос" #: src/dialogs/fl_digi.cxx:5926 msgid "Open ..." msgstr "Откр..." #: src/dialogs/fl_digi.cxx:5927 msgid "Save ..." msgstr "Сохр..." #: src/dialogs/fl_digi.cxx:5930 msgid "Config Scripts" msgstr "Конфиг скриптов" #: src/dialogs/fl_digi.cxx:5931 msgid "Execute" msgstr "Выполнить" #: src/dialogs/fl_digi.cxx:5932 msgid "Generate" msgstr "Создать" #: src/dialogs/fl_digi.cxx:5935 msgid "Text Capture" msgstr "Захват текста" #: src/dialogs/fl_digi.cxx:5939 msgid "Audio" msgstr "Аудио" #: src/dialogs/fl_digi.cxx:5940 msgid "RX capture" msgstr "Rx захват текста" #: src/dialogs/fl_digi.cxx:5941 msgid "TX generate" msgstr "TX генерация" #: src/dialogs/fl_digi.cxx:5942 src/dialogs/confdialog.cxx:18737 msgid "Playback" msgstr "Воспроизведение" #: src/dialogs/fl_digi.cxx:5945 src/dialogs/fl_digi.cxx:7619 msgid "Exit" msgstr "Выход" #: src/dialogs/fl_digi.cxx:6203 src/dialogs/fl_digi.cxx:7832 msgid "&Configure" msgstr "Конфигурация" #: src/dialogs/fl_digi.cxx:6205 src/dialogs/fl_digi.cxx:7833 #, fuzzy msgid "Config Dialog" msgstr "Подтвердить" #: src/dialogs/fl_digi.cxx:6206 src/dialogs/fl_digi.cxx:7836 msgid "Save Config" msgstr "Сохранить конфиг" #: src/dialogs/fl_digi.cxx:6207 src/dialogs/fl_digi.cxx:7835 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Уведомления" #: src/dialogs/fl_digi.cxx:6208 src/dialogs/fl_digi.cxx:7834 #, fuzzy msgid "Test Signals" msgstr "Передаваемый сигнал" #: src/dialogs/fl_digi.cxx:6213 src/dialogs/fl_digi.cxx:7840 #, fuzzy msgid "Rx Audio Dialog" msgstr "Аудит лога" #: src/dialogs/fl_digi.cxx:6215 msgid "View/Hide Channels" msgstr "Показ/Скрыть Каналы" #: src/dialogs/fl_digi.cxx:6216 msgid "Signal browser" msgstr "Браузер сигналов" #: src/dialogs/fl_digi.cxx:6218 msgid "View/Hide 48 macros" msgstr "Показ/Скрыть 48 макросов" #: src/dialogs/fl_digi.cxx:6220 msgid "DX Cluster" msgstr "DX Cluster" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/fl_digi.cxx:7843 msgid "Floating scope" msgstr "Floating scope" #: src/dialogs/fl_digi.cxx:6223 src/dialogs/fl_digi.cxx:7842 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6232 msgid "Rig/Log Controls" msgstr "Rig/Log Контроль" #: src/dialogs/fl_digi.cxx:6245 msgid "&Logbook" msgstr "Журнал" #: src/dialogs/fl_digi.cxx:6246 msgid "View" msgstr "Вид" #: src/dialogs/fl_digi.cxx:6248 msgid "Files" msgstr "Файл" #: src/dialogs/fl_digi.cxx:6249 src/dialogs/confdialog.cxx:17449 msgid "Open..." msgstr "Открыть" #: src/dialogs/fl_digi.cxx:6251 src/logbook/logsupport.cxx:1213 #: src/logbook/lgbook.cxx:1567 msgid "New" msgstr "Новый" #: src/dialogs/fl_digi.cxx:6254 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6255 msgid "Merge..." msgstr "Слияние..." #: src/dialogs/fl_digi.cxx:6256 msgid "Export..." msgstr "Экспорт..." #: src/dialogs/fl_digi.cxx:6259 src/logbook/lgbook.cxx:831 msgid "LoTW" msgstr "LoTW" #: src/dialogs/fl_digi.cxx:6261 msgid "Reports" msgstr "pskreporter" #: src/dialogs/fl_digi.cxx:6262 msgid "Text..." msgstr "Текст..." #: src/dialogs/fl_digi.cxx:6263 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6264 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6269 msgid "Field Day Logging" msgstr "Полевой день" #: src/dialogs/fl_digi.cxx:6274 src/dialogs/fl_digi.cxx:7852 msgid "&Help" msgstr "Помощь" #: src/dialogs/fl_digi.cxx:6277 msgid "Create sunspots" msgstr "" #: src/dialogs/fl_digi.cxx:6279 msgid "Beginners' Guide" msgstr "Руководство" #: src/dialogs/fl_digi.cxx:6280 src/dialogs/fl_digi.cxx:7853 msgid "Online documentation..." msgstr "Онлайн помощь" #: src/dialogs/fl_digi.cxx:6281 msgid "Fldigi web site..." msgstr "Сайт Fldigi" #: src/dialogs/fl_digi.cxx:6282 msgid "Reception reports..." msgstr "pskreporter.info" #: src/dialogs/fl_digi.cxx:6283 msgid "Command line options" msgstr "Парам командной строки" #: src/dialogs/fl_digi.cxx:6284 msgid "Audio device info" msgstr "Инфо о звуковом устройстве" #: src/dialogs/fl_digi.cxx:6285 msgid "Build info" msgstr "Инфо о сборке" #: src/dialogs/fl_digi.cxx:6286 src/dialogs/fl_digi.cxx:7854 msgid "Event log" msgstr "Журнал событий" #: src/dialogs/fl_digi.cxx:6287 src/dialogs/fl_digi.cxx:7855 msgid "Check for updates..." msgstr "Проверить обновление..." #: src/dialogs/fl_digi.cxx:6288 src/dialogs/fl_digi.cxx:7856 msgid "&About" msgstr "&О программе" #: src/dialogs/fl_digi.cxx:6539 msgid "waterfall-only mode" msgstr "Только водопад" #: src/dialogs/fl_digi.cxx:6541 msgid "NO CALLSIGN SET" msgstr "НЕ НАБРАН ПОЗЫВНОЙ" #: src/dialogs/fl_digi.cxx:6566 msgid "Close List" msgstr "Закрыть Список" #: src/dialogs/fl_digi.cxx:6574 msgid "Open List" msgstr "Открыть список" #: src/dialogs/fl_digi.cxx:6615 msgid "Clear list?" msgstr "Очистить список?" #: src/dialogs/fl_digi.cxx:6699 msgid "report" msgstr "отчет" #: src/dialogs/fl_digi.cxx:6699 msgid "reports" msgstr "отчеты" #: src/dialogs/fl_digi.cxx:6704 #, fuzzy msgid "Recent activity for grid " msgstr "Последние действия в сетке" #: src/dialogs/fl_digi.cxx:7841 src/dialogs/Viewer.cxx:283 msgid "Signal Browser" msgstr "Браузер сигнала" #: src/dialogs/fl_digi.cxx:8143 msgid "Scope" msgstr "" #: src/dialogs/fl_digi.cxx:8234 msgid "Detected signal level" msgstr "Определен уровень сигнала" #: src/dialogs/fl_digi.cxx:8246 src/waterfall/waterfall.cxx:2596 msgid "Squelch level" msgstr "Уровень шумодава" #: src/dialogs/fl_digi.cxx:8262 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Left click: изменить режим\n" "Right click: конфигурация" #: src/dialogs/fl_digi.cxx:8271 msgid "CW transmit WPM" msgstr "Скорость CW" #: src/dialogs/fl_digi.cxx:8280 msgid "Default WPM" msgstr "Default WPM" #: src/dialogs/fl_digi.cxx:8310 #, fuzzy msgid "Left click to toggle VuMeter" msgstr "Левой клик, чтобы выбрать цвет" #: src/dialogs/fl_digi.cxx:8316 #, fuzzy msgid "Left click to toggle Status Bar" msgstr "Левой клик, чтобы выбрать цвет" #: src/dialogs/fl_digi.cxx:8328 msgid "Tx level attenuator (dB)" msgstr "Уровень аттенюатора Tx (dB)" #: src/dialogs/fl_digi.cxx:8356 msgid "Automatic Frequency Control" msgstr "Автоматический контроль частоты" #: src/dialogs/fl_digi.cxx:8361 msgid "Squelch" msgstr "Подавление" #: src/dialogs/fl_digi.cxx:8366 msgid "Power Signal Monitor" msgstr "Контроль мощности сигнала" #: src/dialogs/fl_digi.cxx:10682 msgid "Delete entry?" msgstr "Удалить запись?" #: src/dialogs/fl_digi.cxx:10682 src/spot/notify.cxx:222 #: src/spot/notify.cxx:228 msgid "All" msgstr "Все" #: src/dialogs/Viewer.cxx:287 msgid "Find: " msgstr "Найти:" #: src/dialogs/Viewer.cxx:308 src/logbook/logsupport.cxx:324 #: src/logbook/logsupport.cxx:1063 src/misc/macroedit.cxx:504 #: src/mfsk/mfsk-pic.cxx:338 src/spot/notify.cxx:535 src/spot/notify.cxx:539 #: src/dialogs/confdialog.cxx:20251 msgid "Close" msgstr "Закрыть" #: src/dialogs/Viewer.cxx:316 src/logbook/logsupport.cxx:327 #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:13484 #: src/dialogs/confdialog.cxx:14633 msgid "Clear" msgstr "Очистить" #: src/dialogs/Viewer.cxx:320 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "левый клик очистить текст\n" "правый клик сбросить частоту" #: src/dialogs/Viewer.cxx:326 msgid "Set Viewer Squelch" msgstr "Установки шумодава" #: src/logbook/logsupport.cxx:160 msgid "Export to CSV file" msgstr "Экспортировать в CSV" #: src/logbook/logsupport.cxx:187 msgid "Export to fixed field text file" msgstr "Экспортировать в fixed field text" #: src/logbook/logsupport.cxx:215 msgid "Export to ADIF file" msgstr "Экспортировать в ADIF" #: src/logbook/logsupport.cxx:317 msgid "LoTW Review" msgstr "Комментарий LoTW" #: src/logbook/logsupport.cxx:359 msgid "Save changed Logbook?" msgstr "Сохранить изменения?" #: src/logbook/logsupport.cxx:380 msgid "Create new logbook file" msgstr "Создать новый журнал" #: src/logbook/logsupport.cxx:403 #, c-format msgid "%s exists, overwrite?" msgstr "%s exists, overwrite?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Открыть журнал" #: src/logbook/logsupport.cxx:472 msgid "Save logbook file" msgstr "Сохранить журнал" #: src/logbook/logsupport.cxx:933 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:939 msgid "Merge ADIF file" msgstr "Объединить ADIF файлы" #: src/logbook/logsupport.cxx:977 #, fuzzy msgid "No records in lotw download file" msgstr "Выбрать записи журнала для файла загрузки LoTW" #: src/logbook/logsupport.cxx:1057 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1092 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1214 src/spot/notify.cxx:206 #: src/spot/notify.cxx:533 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1574 msgid "Update" msgstr "Обновить" #: src/logbook/logsupport.cxx:1816 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Удалить запись для \"%s\"?" #: src/logbook/logsupport.cxx:2330 msgid "Create cabrillo report" msgstr "Создать cabrillo отчет" #: src/logbook/logsupport.cxx:2570 msgid "LoTW download file" msgstr "Удалить LoTW файл" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" #: src/logger/rx_extract.cxx:286 src/logger/rx_extract.cxx:316 msgid "Could not start flmsg" msgstr "Не удается запустить flmsg" #: src/logger/rx_extract.cxx:414 src/logger/rx_extract.cxx:418 #: src/dialogs/confdialog.cxx:16379 msgid "Locate flmsg executable" msgstr "Locate flmsg executable" #: src/logger/rx_extract.cxx:414 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:418 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:492 msgid "Locate executable" msgstr "Найти исполняемый файл" #: src/logger/rx_extract.cxx:492 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:495 msgid "Locate binary" msgstr "Locate binary" #: src/logger/rx_extract.cxx:495 msgid "*" msgstr "*" #: src/logger/speak.cxx:40 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" #: src/misc/configuration.cxx:539 msgid "Rig mode" msgstr "Rig установки" #: src/misc/configuration.cxx:540 msgid "Always LSB" msgstr "Всегда LSB" #: src/misc/configuration.cxx:541 msgid "Always USB" msgstr "Всегда USB" #: src/misc/configuration.cxx:549 src/dialogs/confdialog.cxx:17915 #: src/dialogs/confdialog.cxx:18183 src/dialogs/confdialog.cxx:18185 #, fuzzy msgid "Rig Control/Hamlib" msgstr "RIG контроль" #: src/misc/configuration.cxx:723 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Сбросить все параметры на значения по умолчанию?\n" "\n" "Параметры вступят в силу при следующем запуске\n" "Файлы: fldigi _def.xml и fldigi.prefs будут удалены!\n" #: src/misc/configuration.cxx:728 msgid "Confirm RESET" msgstr "Подтвердить сброс" #: src/misc/macroedit.cxx:68 msgid "\tmy frequency" msgstr "\tмоя частота" #: src/misc/macroedit.cxx:69 msgid "\tmode" msgstr "\tмодуляция" #: src/misc/macroedit.cxx:70 msgid "\tmy call" msgstr "\tмой позывной" #: src/misc/macroedit.cxx:71 msgid "\tmy locator" msgstr "\tмой локатор" #: src/misc/macroedit.cxx:72 msgid "\tmy name" msgstr "\tмоё имя" #: src/misc/macroedit.cxx:73 #, fuzzy #| msgid "\tmy QTH" msgid "\tmy QTH (city)" msgstr "\tмой QTH" #: src/misc/macroedit.cxx:74 msgid "\tmy RST" msgstr "\tмой передаваемый RST" #: src/misc/macroedit.cxx:75 msgid "\tmy FD class" msgstr "\tмой класс полевого дня" #: src/misc/macroedit.cxx:76 msgid "\tmy FD section" msgstr "\tмоя секция полевого дня" #: src/misc/macroedit.cxx:77 #, fuzzy msgid "\tmy state" msgstr "\tмоё имя" #: src/misc/macroedit.cxx:78 #, fuzzy msgid "\tmy ST" msgstr "\tмой передаваемый RST" #: src/misc/macroedit.cxx:79 #, fuzzy msgid "\tmy county" msgstr "\tмоя секция полевого дня" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy CNTY" msgstr "\tмой QTH" #: src/misc/macroedit.cxx:81 msgid "\tmy antenna" msgstr "\tмоя антенна" #: src/misc/macroedit.cxx:82 msgid "\toperating band" msgstr "\tрабочий диапазон" #: src/misc/macroedit.cxx:83 #, fuzzy #| msgid "\ttransmit" msgid "\ttransmit power" msgstr "\tвстать на передачу" #: src/misc/macroedit.cxx:84 msgid "\tFldigi version" msgstr "\tверсия Fldigi" #: src/misc/macroedit.cxx:85 msgid "\tdigital mode (adif)" msgstr "\tцифровая модуляция (для adif)" #: src/misc/macroedit.cxx:88 msgid "\tother call" msgstr "\tпозывной корреспондента" #: src/misc/macroedit.cxx:89 msgid "\tother name" msgstr "\tимя корреспондента" #: src/misc/macroedit.cxx:90 msgid "\tother QTH" msgstr "\tQTH корреспондента" #: src/misc/macroedit.cxx:91 #, fuzzy msgid "\tother State" msgstr "\tRST корреспондента" #: src/misc/macroedit.cxx:92 #, fuzzy msgid "\tother Province" msgstr "\tимя корреспондента" #: src/misc/macroedit.cxx:93 msgid "\tother locator" msgstr "\tлокатор корреспондента" #: src/misc/macroedit.cxx:94 msgid "\tother RST" msgstr "\tRST корреспондента" #: src/misc/macroedit.cxx:97 msgid "\tS/N etc." msgstr "" "\t любая важная для вас информация. например соотношение сигнала к " "шуму " #: src/misc/macroedit.cxx:98 msgid "\tIMD etc." msgstr "\tлюбая важная для вас информация. IMD и так далее" #: src/misc/macroedit.cxx:101 msgid "\t# QSO recs" msgstr "\t# номер QSO" #: src/misc/macroedit.cxx:102 msgid "\tnext QSO rec #" msgstr "\tследующий номер QSO" #: src/misc/macroedit.cxx:105 msgid "\tmap on google" msgstr "\tкарта в google" #: src/misc/macroedit.cxx:106 msgid "\tmap by value" msgstr "\tкоординаты на карте" #: src/misc/macroedit.cxx:109 msgid "\tclear RX pane" msgstr "\tочистить RX окно" #: src/misc/macroedit.cxx:110 msgid "\tclear TX pane" msgstr "\tочистить TX окно" #: src/misc/macroedit.cxx:111 #, fuzzy msgid "\tclear QSO fields" msgstr "\tочистить поля лога" #: src/misc/macroedit.cxx:114 msgid "\ttext to NAME/QTH" msgstr "" #: src/misc/macroedit.cxx:118 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk вкл, выкл, переключить" #: src/misc/macroedit.cxx:122 msgid "\tclear log fields" msgstr "\tочистить поля лога" #: src/misc/macroedit.cxx:123 msgid "\tsave QSO data" msgstr "\tзаписать QSO в лог" #: src/misc/macroedit.cxx:124 msgid "\tsaveQSO data, append msg to notes" msgstr "\tСохранить QSO и добавить примечания" #: src/misc/macroedit.cxx:125 msgid "\tlog at xmt time" msgstr "" #: src/misc/macroedit.cxx:126 msgid "\tsaveQSO data, append msg to notes" msgstr "\tсохранить QSO и добавить примечания" #: src/misc/macroedit.cxx:127 msgid "\tlog eQSL" msgstr "\tсохранить в логе eQSL" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL optional msg" msgstr "\tсохранить QSO в eQSL и добавить примечания" #: src/misc/macroedit.cxx:131 msgid "\tQSO time (HHMM))" msgstr "\tвремя QSO в формате (HHMM))" #: src/misc/macroedit.cxx:132 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "\tЛокальная дата и время в формате '%Y-%m-%d %H:%M%z'" #: src/misc/macroedit.cxx:133 #, fuzzy #| msgid "\tLocal datetime, default '%x %H:%M %Z'" msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "\tЛокальная дата и время в формате '%x %H:%M %Z'" #: src/misc/macroedit.cxx:134 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "\tЗулусская дата и время в формате '%Y-%m-%d %H:%MZ'" #: src/misc/macroedit.cxx:135 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "\tUTC дата и время по умолчанию '%x %H:%MZ'" #: src/misc/macroedit.cxx:136 msgid "\tlocal time, default %H%M" msgstr "\tлокальное время %H%M" #: src/misc/macroedit.cxx:137 msgid "\tzulu time default %H%MZ" msgstr "\tзулусское время %H%MZ" #: src/misc/macroedit.cxx:138 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tлокальная дата в формате '%Y-%M-%D'" #: src/misc/macroedit.cxx:139 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tдата в зулусском формате '%Y-%M-%D Z'" #: src/misc/macroedit.cxx:140 msgid "\tget weather data" msgstr "\tполучить данные о погоде" #: src/misc/macroedit.cxx:141 msgid "\tget weather data for station" msgstr "\tполучить данные о погоде для станции" #: src/misc/macroedit.cxx:144 msgid "\tcontest counter" msgstr "\tконтрольный номер" #: src/misc/macroedit.cxx:145 msgid "\tdecrement counter" msgstr "\tуменьшить контрольный номер на единицу" #: src/misc/macroedit.cxx:146 msgid "\tincrement counter" msgstr "\tувеличить контрольный номер на единицу" #: src/misc/macroedit.cxx:147 msgid "\texchange in" msgstr "\tпринимаемый контест рапорт (не номер связи)" #: src/misc/macroedit.cxx:148 msgid "\texchange out" msgstr "\tпередаваемый контест рапорт (не номер связи)" #: src/misc/macroedit.cxx:149 msgid "\texchange begin" msgstr "\tначало контест рапорта для лога" #: src/misc/macroedit.cxx:150 msgid "\texchange end" msgstr "\tконец контест рапорта для лога" #: src/misc/macroedit.cxx:151 msgid "\tsave contest out" msgstr "\tсохранить рапорт в лог" #: src/misc/macroedit.cxx:152 msgid "\tcurrent contest serno" msgstr "\tтекущий серийный номер связи" #: src/misc/macroedit.cxx:153 msgid "\tlast serno sent" msgstr "\tпредыдущий серийный номер связи" #: src/misc/macroedit.cxx:154 #, fuzzy msgid "\tFD class" msgstr "\tмой класс полевого дня" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD section" msgstr "\tмоя секция полевого дня" #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tcontest class" msgstr "\tмой класс полевого дня" #: src/misc/macroedit.cxx:157 #, fuzzy msgid "
\tARRL section" msgstr "\tмоя секция полевого дня" #: src/misc/macroedit.cxx:160 msgid "\treceive" msgstr "\tперейти на прием" #: src/misc/macroedit.cxx:161 msgid "\ttransmit" msgstr "\tвстать на передачу" #: src/misc/macroedit.cxx:162 msgid "\ttoggle T/R" msgstr "\tпереключиться между приемом и передачей" #: src/misc/macroedit.cxx:163 msgid "\tsearch UP for signal" msgstr "\tпоиск сигнала выше по частоте" #: src/misc/macroedit.cxx:164 msgid "\tsearch DOWN for signal" msgstr "\tпоиск сигнала ниже по частоте" #: src/misc/macroedit.cxx:165 msgid "\treturn to sweet spot" msgstr "\tвернуться на свою частоту" #: src/misc/macroedit.cxx:166 msgid "\tmove to freq NNNN Hz" msgstr "\tперейти на частоту NNNN Hz" #: src/misc/macroedit.cxx:167 msgid "\tleft-clk QSY button" msgstr "\tлевый клик QSY" #: src/misc/macroedit.cxx:168 msgid "\tright-clk QSY button" msgstr "\tправый клик QSY" #: src/misc/macroedit.cxx:169 msgid "\tqsy to kHz, Hz" msgstr "\tqsy на kHz, Hz" #: src/misc/macroedit.cxx:170 msgid "\tincr/decr xcvr freq" msgstr "\tУвеличить/уменьшить рабочую частоту трансивера" #: src/misc/macroedit.cxx:171 msgid "\tvalid xcvr mode" msgstr "\tВключить нужный режим трансивера" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr filter width" msgstr "\tВключить нужный фильтр в трансивере" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr low cutoff filter" msgstr "\tВкл. Действующий фильтр НЧ трансивера" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr hi cutoff filter" msgstr "\tВкл. Действующий ВЧ фильтр трансивера" #: src/misc/macroedit.cxx:175 msgid "\trig freq has kbd focus" msgstr "" #: src/misc/macroedit.cxx:178 msgid "\tinsert QRG into Rx text" msgstr "\tВставить расстояние между станциями в текст" #: src/misc/macroedit.cxx:181 msgid "\tinsert text file" msgstr "\tвставить текстовый файл" #: src/misc/macroedit.cxx:182 msgid "\tinsert image file" msgstr "\tВставить изображение" #: src/misc/macroedit.cxx:183 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:186 msgid "\tpause transmit" msgstr "\tпауза передачи" #: src/misc/macroedit.cxx:187 msgid "\tidle signal for NN.nn sec" msgstr "\tзадердать передачу на NN.nn sec" #: src/misc/macroedit.cxx:188 msgid "\trepeat every NN sec" msgstr "\tповторить после NN sec" #: src/misc/macroedit.cxx:189 #, fuzzy msgid "\trepeat after waiting NN sec" msgstr "\tповторить после NN sec" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tсигнал настройкиr NN sec" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "\tзадержать передачу на NN.n sec" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\tповторить макрос непрерывно" #: src/misc/macroedit.cxx:193 #, fuzzy msgid "\tschedule execution for" msgstr "\tЗапланировать скед" #: src/misc/macroedit.cxx:194 #, fuzzy msgid "\tend execution at" msgstr "\tЗапланировать скед" #: src/misc/macroedit.cxx:195 #, fuzzy msgid "\tuse local date/time" msgstr "\tЛокальная дата и время" #: src/misc/macroedit.cxx:198 msgid "\t set xmt attenuator" msgstr "\t Вкл ТХ аттенюатор" #: src/misc/macroedit.cxx:201 msgid "\tCW identifier" msgstr "\tCW идентификатор" #: src/misc/macroedit.cxx:202 msgid "\tsend mode ID; TX start only" msgstr "\tПередать идентификатор при старте передачи" #: src/misc/macroedit.cxx:203 msgid "\ttext at start of TX" msgstr "\tТекст для передачи" #: src/misc/macroedit.cxx:204 msgid "\tvideo text in TX stream" msgstr "" #: src/misc/macroedit.cxx:205 msgid "\tTx RSID on,off,toggle" msgstr "\tПередавать RSID вкл, выкл, переключить" #: src/misc/macroedit.cxx:206 msgid "\tRx RSID on,off,toggle" msgstr "\tПринимать RSID вкл, выкл, переключить" #: src/misc/macroedit.cxx:207 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:208 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:211 msgid "\tXmt audio wav file" msgstr "" #: src/misc/macroedit.cxx:214 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:215 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:218 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:219 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:220 msgid "\tCW rise time" msgstr "" #: src/misc/macroedit.cxx:221 msgid "\tChar WPM:Text WPM (15.0:5.0)" msgstr "" #: src/misc/macroedit.cxx:224 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:225 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:228 msgid "\tAFC on,off,toggle" msgstr "\tАвто подстройка частоты, вкл, выкл, переключить" #: src/misc/macroedit.cxx:229 msgid "\tLOCK on,off,toggle" msgstr "\tФикс. частоту ТХ вкл, выкл, переключить" #: src/misc/macroedit.cxx:230 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:231 #, fuzzy #| msgid "\tDigitalk On, Off, Toggle" msgid "\tDigital Squelch on, off,toggle" msgstr "\tDigitalk вкл, выкл, переключить" #: src/misc/macroedit.cxx:232 msgid "\tDigital Squelch level, 0..100" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tchange macro defs file" msgstr "" #: src/misc/macroedit.cxx:236 msgid "\tsave current macro file" msgstr "\tСохранить текущий файл макросов" #: src/misc/macroedit.cxx:237 msgid "\trun macro from buffered teext" msgstr "" #: src/misc/macroedit.cxx:240 #, fuzzy msgid "\tignore comment text" msgstr "\tИгнорировать все комментарии" #: src/misc/macroedit.cxx:241 #, fuzzy msgid "<#comments>\t ignore comments" msgstr "\tИгнорировать все комментарии" #: src/misc/macroedit.cxx:244 msgid "\tmodem char/sec test on nn chars" msgstr "" #: src/misc/macroedit.cxx:245 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:246 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:247 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:250 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:252 msgid "\tWAV file; spec' file" msgstr "" #: src/misc/macroedit.cxx:253 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:256 msgid "\tAnalysis CSV on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:259 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:260 msgid "\tpush current mode / audio freq to stack" msgstr "" #: src/misc/macroedit.cxx:261 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:383 msgid "Text file to insert" msgstr "Текстовый файл для вставки" #: src/misc/macroedit.cxx:393 msgid "Test text file" msgstr "Тест текстового файла" #: src/misc/macroedit.cxx:403 msgid "MFSK image file" msgstr "MFSK image file" #: src/misc/macroedit.cxx:413 msgid "Change to Macro file" msgstr "Изменение файла макросов" #: src/misc/macroedit.cxx:423 src/misc/macroedit.cxx:433 #, fuzzy msgid "Select audio file" msgstr "Выберите устройство" #: src/misc/macroedit.cxx:445 msgid "Executable file to insert" msgstr "Исполняемый файл для вставки" #: src/misc/macroedit.cxx:476 msgid "Macro Text" msgstr "Макро текст" #: src/misc/macroedit.cxx:481 msgid "Select Tag" msgstr "Выбрать тэг" #: src/misc/macroedit.cxx:493 msgid "Macro Button Label" msgstr "Надпись на кнопке макроса" #: src/misc/macroedit.cxx:501 msgid "Apply" msgstr "Применить" #: src/misc/macroedit.cxx:530 msgid "Macro editor - " msgstr "Редактор макросов - " #: src/misc/macros.cxx:5166 msgid "Open macro file" msgstr "Открыть файл макросов" #: src/misc/macros.cxx:5167 src/misc/macros.cxx:5210 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fldigi файл определения макроса\t*.{mdf}" #: src/misc/macros.cxx:5209 msgid "Save macro file" msgstr "Записать файл макроса" #: src/misc/newinstall.cxx:385 msgid "Finish" msgstr "Конец" #: src/misc/newinstall.cxx:386 msgid "Next" msgstr "Следующий" #: src/misc/newinstall.cxx:387 msgid "Back" msgstr "Назад" #: src/misc/newinstall.cxx:505 #, fuzzy msgid "The wizard will guide you through the basic fldigi settings:" msgstr "Мастер проведет вас через основные настройки fldigi" #: src/misc/newinstall.cxx:506 src/logbook/lgbook.cxx:731 msgid "Operator" msgstr "Оператор" #: src/misc/newinstall.cxx:507 #, fuzzy msgid "Sound Card Interface" msgstr "Звуковая карта" #: src/misc/newinstall.cxx:508 msgid "Transceiver control, flrig/rigcat/hamlib" msgstr "" #: src/misc/newinstall.cxx:509 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "Можно пропустить все страницы или выйти из мастера в любое время" #: src/misc/newinstall.cxx:510 msgid "All settings shown here can be changed later via the Configure menu" msgstr "Все настройки могут быть изменены через меню настройки" #: src/misc/newinstall.cxx:525 msgid "Fldigi configuration wizard" msgstr "Мастер настройки Fldigi" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:302 src/mfsk/mfsk-pic.cxx:305 msgid "Time needed: " msgstr "Нужное время" #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Загрузите файл изображения" #: src/mfsk/mfsk-pic.cxx:312 msgid "Send image" msgstr "Передать изображение" #: src/mfsk/mfsk-pic.cxx:319 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Загрузите или пропустите файл изображения\n" "Поддерживаемые форматы: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:323 msgid "Transfer speed, X1-normal" msgstr "Скорость передачи, X1-нормально" #: src/mfsk/mfsk-pic.cxx:335 msgid "Load" msgstr "Загрузить" #: src/waterfall/waterfall.cxx:2031 msgid "Waterfall / FFT / Scope" msgstr "Водопад / FFT / Scope" #: src/waterfall/waterfall.cxx:2040 msgid "Upper signal level (dB)" msgstr "Верхний уровень сигнала" #: src/waterfall/waterfall.cxx:2051 msgid "Signal range (dB)" msgstr "Диапазон сигнала (dB)" #: src/waterfall/waterfall.cxx:2057 msgid "Change waterfall scale" msgstr "Изменение масштаба водопада" #: src/waterfall/waterfall.cxx:2062 msgid "Slew display lower in frequency" msgstr "Повернуть дисплей ниже по частоте" #: src/waterfall/waterfall.cxx:2067 msgid "Center display on signal" msgstr "Сигнал в центре дисплея" #: src/waterfall/waterfall.cxx:2072 msgid "Slew display higher in frequency" msgstr "Повернуть дисплей выше по частоте" #: src/waterfall/waterfall.cxx:2077 msgid "Waterfall drop speed" msgstr "Скорость падения водопада" #: src/waterfall/waterfall.cxx:2087 msgid "Adjust cursor frequency" msgstr "Отрегулируйте частоту курсора" #: src/waterfall/waterfall.cxx:2092 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "В центре полосы пропускания\n" "Правым кликом вернуться" #: src/waterfall/waterfall.cxx:2098 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Запомнить моду и частоту\n" "Правый клик для просмотра" #: src/waterfall/waterfall.cxx:2108 msgid "Lock transmit frequency" msgstr "Блокировка частоты передачи" #: src/waterfall/waterfall.cxx:2117 src/dialogs/confdialog.cxx:19508 msgid "Reverse" msgstr "Реверс" #: src/waterfall/waterfall.cxx:2124 msgid "Transmit/Receive" msgstr "Передача/Прием" #: src/waterfall/waterfall.cxx:2595 msgid "AFC range or BW" msgstr "Спектр АЧХ или Ч/Б" #: src/waterfall/waterfall.cxx:2596 msgid "Signal search" msgstr "Поиск сигнала" #: src/waterfall/waterfall.cxx:2597 msgid "Modem carrier" msgstr "Модем носителя" #: src/waterfall/waterfall.cxx:2597 msgid "Scroll" msgstr "Прокрутка" #: src/rigcontrol/rigxml.cxx:1121 msgid "Open rig xml file" msgstr "Открыть файл rig xml" #: src/rigcontrol/rigxml.cxx:1121 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Установочный XML-файл\t*.xml" #: src/soundcard/sound.cxx:115 src/soundcard/sound.cxx:117 msgid "Audio file" msgstr "Аудио файл" #: src/spot/notify.cxx:193 msgid "My callsign de CALL" msgstr "My callsign de CALL" #: src/spot/notify.cxx:194 msgid "Station heard twice" msgstr "Station heard twice" #: src/spot/notify.cxx:195 msgid "Custom text search" msgstr "Поиск текста" #: src/spot/notify.cxx:196 msgid "RSID reception" msgstr "RSID reception" #: src/spot/notify.cxx:197 msgid "RSID EOT" msgstr "" #: src/spot/notify.cxx:205 msgid "Toggle" msgstr "Переключение" #: src/spot/notify.cxx:207 src/spot/notify.cxx:532 msgid "Remove" msgstr "Удалить" #: src/spot/notify.cxx:218 src/dialogs/confdialog.cxx:14150 #: src/dialogs/confdialog.cxx:14161 src/dialogs/confdialog.cxx:14251 #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14835 #: src/dialogs/confdialog.cxx:18355 src/dialogs/confdialog.cxx:18382 #: src/dialogs/confdialog.cxx:18411 src/dialogs/confdialog.cxx:18440 #: src/dialogs/confdialog.cxx:18469 src/dialogs/confdialog.cxx:18493 #: src/dialogs/confdialog.cxx:19096 msgid "Select" msgstr "Выбрать" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 src/spot/notify.cxx:586 #: src/logbook/lgbook.cxx:782 src/logbook/lgbook.cxx:1187 msgid "Continent" msgstr "Континент" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/logbook/lgbook.cxx:1199 msgid "ITU zone" msgstr "ITU zone" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1175 msgid "CQ zone" msgstr "CQ zone" #: src/spot/notify.cxx:224 msgid "Deselect" msgstr "Снять" #: src/spot/notify.cxx:531 msgid "Add" msgstr "Добавить" #: src/spot/notify.cxx:534 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:537 src/widgets/FTextView.cxx:484 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Выбрать всё" #: src/spot/notify.cxx:538 src/logbook/lgbook.cxx:621 #: src/logbook/lgbook.cxx:822 src/logbook/lgbook.cxx:1636 #: src/logbook/lgbook.cxx:1718 msgid "Clear All" msgstr "Очистить всё" #: src/spot/notify.cxx:585 src/widgets/FTextRXTX.cxx:154 #: src/logbook/lgbook.cxx:737 src/logbook/lgbook.cxx:1039 msgid "Country" msgstr "Страна" #: src/spot/notify.cxx:1144 msgid "The regular expression field must not be empty." msgstr "Поле не должно быть пустым." #: src/spot/notify.cxx:1150 msgid "The regular expression must be valid." msgstr "Регулярное выражение должно быть допустимым." #: src/spot/notify.cxx:1157 msgid "Please set your callsign first." msgstr "Установите Ваш позывной." #: src/spot/notify.cxx:1294 msgid "Run program" msgstr "Выполнить программу" #: src/spot/notify.cxx:1329 msgid "" "Default test string is:\n" " \"" msgstr "" "По умолчанию тестовая строка:\n" " \"" #: src/spot/notify.cxx:1330 msgid "Enter test string or leave blank for default:" msgstr "Введите тестовую строку или оставьте пустым по умолчанию:" #: src/spot/notify.cxx:1341 msgid "This event's regular expression is invalid." msgstr "Выражение этого события является недействительным." #: src/spot/notify.cxx:1348 msgid "The test string did not match this event's search pattern." msgstr "Тестовая строка не соответствует этому событию в шаблоне поиска." #: src/spot/notify.cxx:1366 msgid "Available substrings" msgstr "Доступные подстроки" #: src/spot/notify.cxx:1453 src/logbook/lgbook.cxx:1617 msgid "Frequency" msgstr "Частота" #: src/spot/notify.cxx:1455 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1614 msgid "Callsign" msgstr "Позывной" #: src/waterfall/colorbox.cxx:87 msgid "Open palette" msgstr "Открыть палитру" #: src/waterfall/colorbox.cxx:87 src/waterfall/colorbox.cxx:125 msgid "Fldigi palette\t*.pal" msgstr "Fldigi палитра\t*.pal" #: src/waterfall/colorbox.cxx:111 src/waterfall/colorbox.cxx:136 msgid "Palette: " msgstr "Палитра: " #: src/waterfall/colorbox.cxx:125 msgid "Save palette" msgstr "Сохранить палитру" #: src/widgets/FTextRXTX.cxx:147 msgid "Look up call" msgstr "Смотреть позывной" #: src/widgets/FTextRXTX.cxx:148 src/dialogs/confdialog.cxx:10138 #: src/logbook/lgbook.cxx:665 src/logbook/lgbook.cxx:870 #: src/logbook/lgbook.cxx:1666 msgid "Call" msgstr "Call" #: src/widgets/FTextRXTX.cxx:149 src/logbook/lgbook.cxx:669 #: src/logbook/lgbook.cxx:882 src/logbook/lgbook.cxx:1616 msgid "Name" msgstr "Имя" #: src/widgets/FTextRXTX.cxx:150 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:151 src/dialogs/confdialog.cxx:10842 #: src/logbook/lgbook.cxx:716 src/logbook/lgbook.cxx:1710 msgid "State" msgstr "Штат" #: src/widgets/FTextRXTX.cxx:152 src/logbook/lgbook.cxx:779 #: src/logbook/lgbook.cxx:1150 src/logbook/lgbook.cxx:1151 #: src/logbook/lgbook.cxx:1714 msgid "County" msgstr "Округ" #: src/widgets/FTextRXTX.cxx:153 src/logbook/lgbook.cxx:734 msgid "Province" msgstr "Провинция" #: src/widgets/FTextRXTX.cxx:155 msgid "Locator" msgstr "Локатор" #: src/widgets/FTextRXTX.cxx:156 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:157 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:158 src/dialogs/confdialog.cxx:10836 #: src/logbook/lgbook.cxx:773 src/logbook/lgbook.cxx:1702 msgid "Exchange In" msgstr "Exchange In" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "Rx Serial #" msgstr "Принятый сер. номер" #: src/widgets/FTextRXTX.cxx:160 src/logbook/lgbook.cxx:1343 msgid "Class" msgstr "Class" #: src/widgets/FTextRXTX.cxx:161 src/logbook/lgbook.cxx:1432 msgid "Section" msgstr "Раздел" #: src/widgets/FTextRXTX.cxx:163 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:164 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:165 msgid "SS check" msgstr "" #: src/widgets/FTextRXTX.cxx:166 src/logbook/lgbook.cxx:1433 #, fuzzy msgid "SS section" msgstr "Раздел" #: src/widgets/FTextRXTX.cxx:169 msgid "CQ STATE" msgstr "CQ STATE" #: src/widgets/FTextRXTX.cxx:171 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:176 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:181 #, fuzzy msgid "QSOp state" msgstr "время начала QSO" #: src/widgets/FTextRXTX.cxx:182 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:184 #, fuzzy msgid "QSOp name" msgstr "Имя оператора" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:186 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "Insert marker" msgstr "Вставить маркер" #: src/widgets/FTextRXTX.cxx:196 msgid "All entries" msgstr "Все записи" #: src/widgets/FTextRXTX.cxx:198 msgid "Scroll hints" msgstr "Выпадающие подсказки" #: src/widgets/FTextRXTX.cxx:1808 msgid " in " msgstr " in " #: src/widgets/FTextRXTX.cxx:1811 msgid "Last QSO" msgstr "Последнее QSO" #: src/widgets/FTextRXTX.cxx:1859 src/dialogs/confdialog.cxx:12043 msgid "Transmit" msgstr "Передать" #: src/widgets/FTextRXTX.cxx:1860 src/dialogs/confdialog.cxx:11903 #: src/dialogs/confdialog.cxx:14718 msgid "Receive" msgstr "Принять" #: src/widgets/FTextRXTX.cxx:1861 msgid "Abort" msgstr "Прервать" #: src/widgets/FTextRXTX.cxx:1862 msgid "Send image..." msgstr "Отправить изображение..." #: src/widgets/FTextRXTX.cxx:1871 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "Спец. символы" #: src/widgets/FTextRXTX.cxx:1879 src/widgets/flinput2.cxx:58 msgid "A" msgstr "A" #: src/widgets/FTextRXTX.cxx:1895 src/widgets/flinput2.cxx:74 msgid "E" msgstr "E" #: src/widgets/FTextRXTX.cxx:1905 src/widgets/flinput2.cxx:84 msgid "I" msgstr "I" #: src/widgets/FTextRXTX.cxx:1915 src/widgets/flinput2.cxx:94 msgid "N" msgstr "N" #: src/widgets/FTextRXTX.cxx:1919 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16915 msgid "O" msgstr "O" #: src/widgets/FTextRXTX.cxx:1933 src/widgets/flinput2.cxx:112 msgid "U" msgstr "U" #: src/widgets/FTextRXTX.cxx:1943 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "Y" #: src/widgets/FTextRXTX.cxx:1948 src/widgets/flinput2.cxx:127 #: src/logbook/lgbook.cxx:1148 msgid "Other" msgstr "Прочее" #: src/widgets/FTextView.cxx:294 msgid "Insert text" msgstr "Вставить текст" #: src/widgets/FTextView.cxx:347 msgid "Save text as" msgstr "Сохранить текст как" #: src/widgets/FTextView.cxx:482 src/widgets/FTextView.cxx:648 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Копировать" #: src/widgets/FTextView.cxx:485 msgid "Save as..." msgstr "Сохранить как.." #: src/widgets/FTextView.cxx:486 src/widgets/FTextView.cxx:652 msgid "Word wrap" msgstr "Перенос слова" #: src/widgets/FTextView.cxx:647 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Вырезать" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Вставить" #: src/widgets/FTextView.cxx:651 msgid "Insert file..." msgstr "Вставить файл" #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Назад" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1581 msgid "Delete" msgstr "Удалить" #: src/config_script/run_scripts.cxx:950 msgid "Invalid Modem for KISS IO" msgstr "Неверный режим для KISS IO" #: src/config_script/run_scripts.cxx:2850 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2857 msgid "Script file name (path) invalid" msgstr "Имя файла (путь) недействительно" #: src/config_script/run_scripts.cxx:2864 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2868 #, c-format msgid "Executing script file: %s" msgstr "Выполнение сценария:% s" #: src/config_script/run_scripts.cxx:2873 #, c-format msgid "Issues reported in processing script file: %s" msgstr "Проблемы в обработке сценария:%s" #: src/config_script/run_scripts.cxx:2874 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" "Файл сценария содержит потенциальные проблемы\n" "Обратитесь к документации" #: src/config_script/run_scripts.cxx:2878 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" "Изменения, сделанные с помощью сценария требуют программу\n" "Изменения будут активны после перезагрузки" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "Файл скрипта" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "*.txt" #: src/config_script/script_parsing.cxx:359 #, c-format msgid "Missing command %s after line %d" msgstr "Нет команды%s после линии%d" #: src/config_script/script_parsing.cxx:403 msgid "Command Not Found" msgstr "Команда не найдена" #: src/config_script/script_parsing.cxx:407 msgid "Not a script file/tag not found" msgstr "Нет сценария/тег не найден" #: src/config_script/script_parsing.cxx:411 msgid "Invalid parameter" msgstr "Неверный параметр" #: src/config_script/script_parsing.cxx:415 msgid "Invalid function parameter (internal non-script error)" msgstr "Недопустимый параметр функции (внутренняя ошибка скрипта)" #: src/config_script/script_parsing.cxx:419 msgid "Missing paired quotes (\")" msgstr "Отсутствует парные кавычки (\")" #: src/config_script/script_parsing.cxx:423 msgid "General Error" msgstr "Общая ошибка" #: src/config_script/script_parsing.cxx:427 msgid "No Errors" msgstr "Нет ошибок" #: src/config_script/script_parsing.cxx:431 msgid "Character searched not found" msgstr "Символы не найдены" #: src/config_script/script_parsing.cxx:435 msgid "End of line reached" msgstr "Достигнут конец строки" #: src/config_script/script_parsing.cxx:439 msgid "File not found" msgstr "Файл не найден" #: src/config_script/script_parsing.cxx:443 msgid "Directory path not found" msgstr "Путь каталога не найден" #: src/config_script/script_parsing.cxx:447 msgid "Unexpected end of parameter (args[]) list found" msgstr "Конец параметра (аргумент []) список найден" #: src/config_script/script_parsing.cxx:451 msgid "Unexpected end of parameter check list found" msgstr "Неожиданный конец параметра контрольного списка найден" #: src/config_script/script_parsing.cxx:455 msgid "Character count in args[] parameter exceeds expectations" msgstr "Кол-во символов [] Параметр превосходит ожидания" #: src/config_script/script_parsing.cxx:459 msgid "Memory Allocation Error (internal non-script error)" msgstr "Распределение памяти Error (внутренняя ошибка скрипта)" #: src/config_script/script_parsing.cxx:463 msgid "Passed parameter is not of the expected type." msgstr "Передаваемый параметр не соответствует ожидаемому типу." #: src/config_script/script_parsing.cxx:467 msgid "Parameter is not valid." msgstr "Параметр не действителен." #: src/config_script/script_parsing.cxx:471 msgid "Command missing ':'." msgstr "Команда отсутствует ':'." #: src/config_script/script_parsing.cxx:475 msgid "Maximum open subscripts reached." msgstr "Макс кол-во открытых индексов достигнуто." #: src/config_script/script_parsing.cxx:479 msgid "Subscript execution fail (internal)." msgstr "Субскрипт выполнен неудачно" #: src/config_script/script_parsing.cxx:483 msgid "Script device path not found." msgstr "Путь к устройству скрипта не найден." #: src/config_script/script_parsing.cxx:487 msgid "Unexpected end of file reached." msgstr "Неожиданный конец файла достигнут." #: src/config_script/script_parsing.cxx:491 msgid "File read error" msgstr "Ошибка чтения файла" #: src/config_script/script_parsing.cxx:495 msgid "Undefined error" msgstr "Неизвестная ошибка" #: src/config_script/script_parsing.cxx:498 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "Линия: %d Ошибка:%d %s (%s)" #: src/config_script/script_parsing.cxx:966 #: src/config_script/script_parsing.cxx:1093 #: src/config_script/script_parsing.cxx:1806 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "Ошибка выделения буфера под файл: %s строка %d" #: src/config_script/script_parsing.cxx:1036 #: src/config_script/script_parsing.cxx:1152 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1042 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "Команда %s игнорируется, точечная запись не поддерживается" #: src/config_script/script_parsing.cxx:1156 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "Команда %s игнорируется, структура команд не поддерживается" #: src/config_script/script_parsing.cxx:1239 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "Неверный параметр функцииr 'char *file_name_path' (null)" #: src/config_script/script_parsing.cxx:1247 #, c-format msgid "Unable to open file %s" msgstr "не открылся файл %s" #: src/config_script/script_parsing.cxx:1435 msgid "1" msgstr "1" #: src/config_script/script_parsing.cxx:1439 msgid "0" msgstr "0" #: src/config_script/script_parsing.cxx:1656 #: src/config_script/script_parsing.cxx:1743 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1757 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "Недопустимое имя файла (NULL) в функции %s:%d" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "Не удается создать файл %s (Ошибка No=%d) func %s:%d" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 #: src/dialogs/confdialog.cxx:10080 src/dialogs/confdialog.cxx:11537 #: src/dialogs/confdialog.cxx:11721 msgid "Show" msgstr "Показать" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 msgid "Hide" msgstr "Спрятать" #: src/dialogs/confdialog.cxx:6816 #, fuzzy msgid "no" msgstr "Инфо" #: src/dialogs/confdialog.cxx:6816 #, fuzzy msgid "yes" msgstr "Да" #: src/dialogs/confdialog.cxx:9873 msgid "Fldigi configuration" msgstr "Конфигурация Fldigi" #: src/dialogs/confdialog.cxx:9883 #, fuzzy msgid "Configure" msgstr "Конфигурация" #: src/dialogs/confdialog.cxx:9893 msgid "Collapse Tree" msgstr "" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:10100 #: src/dialogs/confdialog.cxx:10102 #, fuzzy msgid "Call/Lookup" msgstr "Искать позывной" #: src/dialogs/confdialog.cxx:9905 msgid "Web Browser lookup" msgstr "Поиск в Web" #: src/dialogs/confdialog.cxx:9909 msgid "Do not use callsign lookup via web browser" msgstr "Не искать позывной через веб-браузер" #: src/dialogs/confdialog.cxx:9915 #, fuzzy msgid "QRZ on line" msgstr "RTS это РТТ линия" #: src/dialogs/confdialog.cxx:9916 msgid "Visit QRZ web site" msgstr "Посетить QRZ.com" #: src/dialogs/confdialog.cxx:9921 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:9922 msgid "Visit Hamcall web site" msgstr "Посетить веб-сайт Hamcall" #: src/dialogs/confdialog.cxx:9927 msgid "HamQTH online" msgstr "" #: src/dialogs/confdialog.cxx:9928 src/dialogs/confdialog.cxx:9934 msgid "Visit hamQTH web site" msgstr "Посетить веб-сайт hamQTH" #: src/dialogs/confdialog.cxx:9933 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:9939 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:9952 #, fuzzy msgid "Hamcall" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:9965 #, fuzzy msgid "HamQTH" msgstr "HamQTH....." #: src/dialogs/confdialog.cxx:9978 #, fuzzy msgid "Callook" msgstr "Искать позывной" #: src/dialogs/confdialog.cxx:9979 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:9994 msgid "Data base lookup" msgstr "Поиск базы данных" #: src/dialogs/confdialog.cxx:9998 msgid "Do not use callsign database" msgstr "Не использовать базы данных позывных" #: src/dialogs/confdialog.cxx:10004 msgid "QRZ cdrom" msgstr "QRZ cdrom" #: src/dialogs/confdialog.cxx:10005 msgid "Use CD or hard drive CD image" msgstr "Использовать CD жесткий дикс" #: src/dialogs/confdialog.cxx:10010 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:10011 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Вам нужно оплатить услуги\n" "доступа к сервису QRZ" #: src/dialogs/confdialog.cxx:10016 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:10017 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Вам нужно оплатить услуги\n" "доступа к сервису Hamcall" #: src/dialogs/confdialog.cxx:10022 #, fuzzy msgid "HamQTH.com" msgstr "HamQTH....." #: src/dialogs/confdialog.cxx:10023 msgid "Free service courtesy of OK" msgstr "Free service courtesy of OK" #: src/dialogs/confdialog.cxx:10028 #, fuzzy msgid "Callook.info" msgstr "Искать позывной" #: src/dialogs/confdialog.cxx:10029 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Callook.info lookup (бесплатный сервис для США)" #: src/dialogs/confdialog.cxx:10035 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Не заполняйте, чтобы искать базу данных" #: src/dialogs/confdialog.cxx:10049 msgid "User name" msgstr "Имя" #: src/dialogs/confdialog.cxx:10050 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:10064 src/dialogs/confdialog.cxx:11521 #: src/dialogs/confdialog.cxx:11637 msgid "Password" msgstr "Пароль" #: src/dialogs/confdialog.cxx:10065 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:10081 src/dialogs/confdialog.cxx:11538 #: src/dialogs/confdialog.cxx:11722 msgid "Show password in plain text" msgstr "Показать пароль в виде простого текста" #: src/dialogs/confdialog.cxx:10086 msgid "Add address to notes field" msgstr "Добавить адрес в поле примечаний" #: src/dialogs/confdialog.cxx:10091 msgid "clear old data" msgstr "очищать данные" #: src/dialogs/confdialog.cxx:10105 #, fuzzy #| msgid "Reload cty.dat" msgid "Call/cty.dat" msgstr "Перезагрузить cty.dat" #: src/dialogs/confdialog.cxx:10109 msgid "cty.dat folder" msgstr "Папка с данными" #: src/dialogs/confdialog.cxx:10110 msgid "Enter full path-name for cty.dat folder" msgstr "Введите полный путь папки cty.dat" #: src/dialogs/confdialog.cxx:10123 msgid "Browse" msgstr "" #: src/dialogs/confdialog.cxx:10124 msgid "Locate cty.dat file" msgstr "Место cty.dat file" #: src/dialogs/confdialog.cxx:10127 src/dialogs/confdialog.cxx:10390 #: src/dialogs/confdialog.cxx:10410 src/dialogs/confdialog.cxx:10427 #: src/dialogs/confdialog.cxx:10457 src/dialogs/confdialog.cxx:10661 #: src/dialogs/confdialog.cxx:10717 src/dialogs/confdialog.cxx:11249 #: src/dialogs/confdialog.cxx:11445 src/dialogs/confdialog.cxx:12067 #: src/dialogs/confdialog.cxx:16947 src/dialogs/confdialog.cxx:17032 #: src/dialogs/confdialog.cxx:17046 src/dialogs/confdialog.cxx:17093 #: src/dialogs/confdialog.cxx:17159 src/dialogs/confdialog.cxx:17348 #: src/dialogs/confdialog.cxx:18931 src/dialogs/confdialog.cxx:20169 msgid "Default" msgstr "По умолчан" #: src/dialogs/confdialog.cxx:10128 msgid "Restore cty.dat default folder" msgstr "" #: src/dialogs/confdialog.cxx:10131 msgid "Reload" msgstr "Перезагруз" #: src/dialogs/confdialog.cxx:10132 msgid "Reload cty.dat" msgstr "Перезагрузить cty.dat" #: src/dialogs/confdialog.cxx:10135 src/dialogs/confdialog.cxx:10137 msgid "Call/Cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10141 src/dialogs/confdialog.cxx:10249 #: src/dialogs/confdialog.cxx:10251 #, fuzzy msgid "Colors-Fonts/Buttons-Menus" msgstr "Цвета && Шрифты" #: src/dialogs/confdialog.cxx:10145 msgid "Spot" msgstr "" #: src/dialogs/confdialog.cxx:10148 msgid "Rev" msgstr "" #: src/dialogs/confdialog.cxx:10151 msgid "Tune" msgstr "" #: src/dialogs/confdialog.cxx:10154 msgid "RxID nar" msgstr "" #: src/dialogs/confdialog.cxx:10157 msgid "Lk" msgstr "" #: src/dialogs/confdialog.cxx:10160 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:10163 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:10166 msgid "RxID wide" msgstr "" #: src/dialogs/confdialog.cxx:10169 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:10172 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:10175 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:10225 msgid "Lighted Btns" msgstr "" #: src/dialogs/confdialog.cxx:10232 #, fuzzy #| msgid "Check All" msgid "Check Btns" msgstr "Отметить всё" #: src/dialogs/confdialog.cxx:10239 msgid "Round Btns" msgstr "" #: src/dialogs/confdialog.cxx:10246 #, fuzzy #| msgid "Rx font" msgid "Menu font" msgstr "Rx шрифт" #: src/dialogs/confdialog.cxx:10254 src/dialogs/confdialog.cxx:10328 #: src/dialogs/confdialog.cxx:10330 #, fuzzy msgid "Colors-Fonts/FreqDisp - Meters" msgstr "Шкала/Показометры" #: src/dialogs/confdialog.cxx:10260 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:10269 src/dialogs/confdialog.cxx:10387 #: src/dialogs/confdialog.cxx:10407 src/dialogs/confdialog.cxx:10424 #: src/dialogs/confdialog.cxx:10449 msgid "Font" msgstr "Шрифт" #: src/dialogs/confdialog.cxx:10272 src/dialogs/confdialog.cxx:10286 #: src/dialogs/confdialog.cxx:10300 src/dialogs/confdialog.cxx:10384 #: src/dialogs/confdialog.cxx:10404 msgid "Bg Color" msgstr "Фон" #: src/dialogs/confdialog.cxx:10275 msgid "Digit Color" msgstr "Цвет цифр" #: src/dialogs/confdialog.cxx:10278 msgid "Sys Colors" msgstr "Системный цвет" #: src/dialogs/confdialog.cxx:10283 msgid "S-meter" msgstr "S-meter" #: src/dialogs/confdialog.cxx:10289 src/dialogs/confdialog.cxx:10303 msgid "Scale Color" msgstr "Цвет шкалы" #: src/dialogs/confdialog.cxx:10292 src/dialogs/confdialog.cxx:10306 msgid "Meter Color" msgstr "Измритель" #: src/dialogs/confdialog.cxx:10297 msgid "PWR-meter" msgstr "PWR-meter" #: src/dialogs/confdialog.cxx:10309 msgid "Power scale" msgstr "Шкала мощности" #: src/dialogs/confdialog.cxx:10310 src/dialogs/confdialog.cxx:19838 msgid "Select the type of FFT prefilter" msgstr "Выберите тип FFT фильтра" #: src/dialogs/confdialog.cxx:10321 msgid "25 W" msgstr "25 W" #: src/dialogs/confdialog.cxx:10333 src/dialogs/confdialog.cxx:10366 #: src/dialogs/confdialog.cxx:10368 msgid "Colors-Fonts/Function keys" msgstr "" #: src/dialogs/confdialog.cxx:10337 msgid "Use colored buttons" msgstr "Вкл. цветные кнопки" #: src/dialogs/confdialog.cxx:10342 msgid "Group 1" msgstr "Группа 1" #: src/dialogs/confdialog.cxx:10343 msgid "Background color for Function key group 1" msgstr "Цвет фона для кнопок группы 1" #: src/dialogs/confdialog.cxx:10348 msgid "Group 2" msgstr "Группа 2" #: src/dialogs/confdialog.cxx:10349 msgid "Background color for Function key group 2" msgstr "Цвет фона для кнопок группы 2" #: src/dialogs/confdialog.cxx:10354 msgid "Group 3" msgstr "Группа 3" #: src/dialogs/confdialog.cxx:10355 msgid "Background color for Function key group 3" msgstr "Цвет фона для кнопок группы 3" #: src/dialogs/confdialog.cxx:10360 src/dialogs/confdialog.cxx:10555 #: src/dialogs/confdialog.cxx:12036 src/dialogs/confdialog.cxx:14187 #: src/dialogs/confdialog.cxx:18180 src/logbook/lgbook.cxx:828 msgid "Defaults" msgstr "Умолчание" #: src/dialogs/confdialog.cxx:10363 msgid "Font/Color" msgstr "Шрифт/цвет" #: src/dialogs/confdialog.cxx:10371 src/dialogs/confdialog.cxx:10462 #: src/dialogs/confdialog.cxx:10464 msgid "Colors-Fonts/Logging controls" msgstr "" #: src/dialogs/confdialog.cxx:10375 msgid "Logging Panel Controls" msgstr "Панель управления логом" #: src/dialogs/confdialog.cxx:10395 msgid "Logbook Dialog" msgstr "" #: src/dialogs/confdialog.cxx:10415 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:10418 msgid "Report Browser" msgstr "" #: src/dialogs/confdialog.cxx:10430 msgid "Even Lines" msgstr "Четные линии" #: src/dialogs/confdialog.cxx:10435 msgid "Odd Lines" msgstr "Нечетные линии" #: src/dialogs/confdialog.cxx:10440 msgid "Stream Text" msgstr "" #: src/dialogs/confdialog.cxx:10446 msgid "Bg color" msgstr "Цвет фона" #: src/dialogs/confdialog.cxx:10452 msgid "Alt Color" msgstr "" #: src/dialogs/confdialog.cxx:10453 msgid "Color for outgoing telnet text" msgstr "Цвет текста для исходящего telnet" #: src/dialogs/confdialog.cxx:10467 src/dialogs/confdialog.cxx:10565 #: src/dialogs/confdialog.cxx:10567 #, fuzzy msgid "Colors-Fonts/Rx-Tx" msgstr "Цвета && Шрифты" #: src/dialogs/confdialog.cxx:10471 msgid "Rx/Tx Character set" msgstr "Набор символов (Для Кириллицы 1251)" #: src/dialogs/confdialog.cxx:10472 msgid "Select Rx/Tx Character Set" msgstr "Выбрать Rx/Tx набор символов" #: src/dialogs/confdialog.cxx:10492 msgid "Rx bkgnd" msgstr "Rx фон" #: src/dialogs/confdialog.cxx:10495 msgid "Tx bkgnd" msgstr "Tx фон" #: src/dialogs/confdialog.cxx:10504 msgid "Rx font" msgstr "Rx шрифт" #: src/dialogs/confdialog.cxx:10507 msgid "Tx font" msgstr "Tx шрифт" #: src/dialogs/confdialog.cxx:10516 msgid "Macro Edit Font" msgstr "Шрифт ред. макросов" #: src/dialogs/confdialog.cxx:10519 msgid "Text Highlighting" msgstr "Текст Подсвечивания" #: src/dialogs/confdialog.cxx:10522 src/dialogs/confdialog.cxx:14169 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:10523 msgid "Sent chars in Rx/Tx pane" msgstr "Символы в области Rx / Tx" #: src/dialogs/confdialog.cxx:10528 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:10529 msgid "Control chars in Rx/Tx pane" msgstr "Символы управления в области Rx / Tx" #: src/dialogs/confdialog.cxx:10534 msgid "SKIP" msgstr "SKIP" #: src/dialogs/confdialog.cxx:10535 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Пропущенные символы в панели Tx\n" "(Tx on/off для CW)" #: src/dialogs/confdialog.cxx:10540 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:10541 msgid "Alternate character color in Rx panelr" msgstr "Альтернативный цвет символов в Rx окне" #: src/dialogs/confdialog.cxx:10546 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:10547 msgid "Selection background color in Rx Tx panels" msgstr "Выбор цвета фона Rx Tx панелей" #: src/dialogs/confdialog.cxx:10552 src/dialogs/confdialog.cxx:10577 msgid "System" msgstr "Системный" #: src/dialogs/confdialog.cxx:10560 msgid "display Rx control chars as ascii string" msgstr "Показывать в Rx окне ASCII символы" #: src/dialogs/confdialog.cxx:10570 src/dialogs/confdialog.cxx:10580 #: src/dialogs/confdialog.cxx:10582 #, fuzzy msgid "Colors-Fonts/Tabs" msgstr "Цвета && Шрифты" #: src/dialogs/confdialog.cxx:10574 msgid "Tab Color" msgstr "Цвет" #: src/dialogs/confdialog.cxx:10585 src/dialogs/confdialog.cxx:10670 #: src/dialogs/confdialog.cxx:10672 msgid "Colors-Fonts/Signal Level" msgstr "" #: src/dialogs/confdialog.cxx:10589 #, fuzzy msgid "Signal Level Indicator" msgstr "Цвет уровня сигнала" #: src/dialogs/confdialog.cxx:10596 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18866 msgid "Low" msgstr "Низкий" #: src/dialogs/confdialog.cxx:10604 src/dialogs/confdialog.cxx:18874 msgid "" "Transition\n" "Level (dB)" msgstr "" #: src/dialogs/confdialog.cxx:10612 src/dialogs/confdialog.cxx:18882 msgid "Normal" msgstr "Норма" #: src/dialogs/confdialog.cxx:10627 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18897 msgid "High" msgstr "Высокий" #: src/dialogs/confdialog.cxx:10642 src/dialogs/confdialog.cxx:18912 msgid "Over" msgstr "Перегруз" #: src/dialogs/confdialog.cxx:10645 src/dialogs/confdialog.cxx:10648 #: src/dialogs/confdialog.cxx:10714 src/dialogs/confdialog.cxx:18915 #: src/dialogs/confdialog.cxx:18918 msgid "label" msgstr "" #: src/dialogs/confdialog.cxx:10659 src/dialogs/confdialog.cxx:18929 #, fuzzy msgid "Input signal level" msgstr "Уровень сигнала" #: src/dialogs/confdialog.cxx:10664 src/dialogs/confdialog.cxx:18934 msgid "Use wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10665 src/dialogs/confdialog.cxx:18935 msgid "" "default scale is audo \"Vu Meter\"\n" "enable to emulate wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10676 src/dialogs/confdialog.cxx:10736 #: src/dialogs/confdialog.cxx:10738 #, fuzzy msgid "Colors-Fonts/Digiscope" msgstr "Цвета && Шрифты" #: src/dialogs/confdialog.cxx:10680 #, fuzzy #| msgid "Digit Color" msgid "Digital Scope Colors" msgstr "Цвет цифр" #: src/dialogs/confdialog.cxx:10687 #, fuzzy #| msgid "Backgnd" msgid "Background" msgstr "Фон" #: src/dialogs/confdialog.cxx:10695 src/dialogs/confdialog.cxx:13791 msgid "Axis" msgstr "" #: src/dialogs/confdialog.cxx:10703 #, fuzzy #| msgid "Color" msgid "Color 1" msgstr "Цвет" #: src/dialogs/confdialog.cxx:10711 #, fuzzy #| msgid "Color" msgid "Color 2" msgstr "Цвет" #: src/dialogs/confdialog.cxx:10725 #, fuzzy #| msgid "Color" msgid "Color 3" msgstr "Цвет" #: src/dialogs/confdialog.cxx:10733 #, fuzzy #| msgid "Color" msgid "Color 4" msgstr "Цвет" #: src/dialogs/confdialog.cxx:10742 src/dialogs/confdialog.cxx:10946 #: src/dialogs/confdialog.cxx:10948 #, fuzzy msgid "Contests/General" msgstr "Контесты" #: src/dialogs/confdialog.cxx:10747 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:10762 #, fuzzy msgid "State QSO Party" msgstr "Дата начала QSO" #: src/dialogs/confdialog.cxx:10778 #, fuzzy msgid "Text capture order" msgstr "Захват текста" #: src/dialogs/confdialog.cxx:10779 #, fuzzy msgid "Context Notes" msgstr "Контесты" #: src/dialogs/confdialog.cxx:10791 msgid "Duplicate check, CALL plus" msgstr "Проверка на дубли" #: src/dialogs/confdialog.cxx:10794 msgid "On/Off" msgstr "вкл/выкл" #: src/dialogs/confdialog.cxx:10795 msgid "Check for duplicates" msgstr "Проверить дубли" #: src/dialogs/confdialog.cxx:10800 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:677 src/logbook/lgbook.cxx:1391 msgid "Band" msgstr "Диапазон" #: src/dialogs/confdialog.cxx:10801 msgid "Bands must match" msgstr "Диапазоны должны совпадать" #: src/dialogs/confdialog.cxx:10806 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:680 src/logbook/lgbook.cxx:955 #: src/logbook/lgbook.cxx:1619 src/logbook/lgbook.cxx:1674 msgid "Mode" msgstr "Режим" #: src/dialogs/confdialog.cxx:10807 msgid "Mode must match" msgstr "Режимы должны совпадать" #: src/dialogs/confdialog.cxx:10812 msgid "Time span over" msgstr "Время контроля дублей" #: src/dialogs/confdialog.cxx:10813 msgid "QSO must not occur within a time period of" msgstr "" #: src/dialogs/confdialog.cxx:10818 msgid "Dup Color" msgstr "Цвет дубля" #: src/dialogs/confdialog.cxx:10819 msgid "Left click to select dup color" msgstr "Левой клик, чтобы выбрать цвет" #: src/dialogs/confdialog.cxx:10827 #, fuzzy msgid "? Dup Color" msgstr "Цвет дубля" #: src/dialogs/confdialog.cxx:10828 #, fuzzy msgid "Left click to select possible dup color" msgstr "Левой клик, чтобы выбрать цвет" #: src/dialogs/confdialog.cxx:10837 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:10843 msgid "State must match" msgstr "Штат должен совпадать" #: src/dialogs/confdialog.cxx:10848 msgid "minutes" msgstr "минуты" #: src/dialogs/confdialog.cxx:10849 msgid "Enter time span in minutes" msgstr "Введите время в минутах" #: src/dialogs/confdialog.cxx:10867 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Contest exchange in" #: src/dialogs/confdialog.cxx:10870 src/dialogs/confdialog.cxx:11704 msgid "Send" msgstr "Отправить" #: src/dialogs/confdialog.cxx:10871 msgid "free form exchange" msgstr "Свободная форма обмена" #: src/dialogs/confdialog.cxx:10885 msgid "RST always 599/59" msgstr "RST всегда 599/59" #: src/dialogs/confdialog.cxx:10886 msgid "Force RST in/out to 599/59" msgstr "Установить RST in/out 599/59" #: src/dialogs/confdialog.cxx:10891 msgid "Send CW cut #'s" msgstr "CW короткие 0 и 9" #: src/dialogs/confdialog.cxx:10892 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:10899 #, fuzzy msgid "Start Nbr" msgstr "Старт" #: src/dialogs/confdialog.cxx:10900 msgid "Starting number" msgstr "Стартовый номер" #: src/dialogs/confdialog.cxx:10915 msgid "Digits" msgstr "Цифры" #: src/dialogs/confdialog.cxx:10916 msgid "Number of digits in serial number" msgstr "Количество цифр в серийном номере" #: src/dialogs/confdialog.cxx:10932 msgid "Use leading zeros" msgstr "Начать с нулей" #: src/dialogs/confdialog.cxx:10933 msgid "Insert leading zeros into Xmtd serial number" msgstr "Вставить нули в Xmtd серийный номер" #: src/dialogs/confdialog.cxx:10938 src/dialogs/confdialog.cxx:15083 #: src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Сброс" #: src/dialogs/confdialog.cxx:10939 msgid "Initialize the QSO logging fields" msgstr "Инициализировать поля QSO" #: src/dialogs/confdialog.cxx:10951 src/dialogs/confdialog.cxx:11000 #: src/dialogs/confdialog.cxx:11002 #, fuzzy msgid "Contests/Field Day" msgstr "Полевой день" #: src/dialogs/confdialog.cxx:10955 src/logbook/lgbook.cxx:1255 msgid "Operator Call" msgstr "Позывной оператора" #: src/dialogs/confdialog.cxx:10956 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" "Позывной в полевом дне\n" "может быть личным позывным оператора" #: src/dialogs/confdialog.cxx:10970 #, fuzzy msgid "My Section" msgstr "Раздел" #: src/dialogs/confdialog.cxx:10971 msgid "Field Day Section" msgstr "Раздел полевого дня" #: src/dialogs/confdialog.cxx:10985 src/dialogs/confdialog.cxx:11012 #, fuzzy msgid "My Class" msgstr "Class" #: src/dialogs/confdialog.cxx:10986 msgid "Field Day Class" msgstr "Field Day Class" #: src/dialogs/confdialog.cxx:11005 src/dialogs/confdialog.cxx:11064 #: src/dialogs/confdialog.cxx:11066 msgid "Contests/JOTA School" msgstr "" #: src/dialogs/confdialog.cxx:11009 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:11013 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:11029 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:11032 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:11033 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:11047 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:11048 #, fuzzy msgid "Scout Operator Name" msgstr "Имя оператора" #: src/dialogs/confdialog.cxx:11070 src/dialogs/confdialog.cxx:11109 #: src/dialogs/confdialog.cxx:11111 msgid "IDs/CW" msgstr "" #: src/dialogs/confdialog.cxx:11074 msgid "CW Postamble ID" msgstr "" #: src/dialogs/confdialog.cxx:11077 msgid "Transmit callsign" msgstr "Позывной" #: src/dialogs/confdialog.cxx:11078 msgid "Send Callsign in CW at end of every transmission" msgstr "Отправить Позывной в CW в конце каждой передачи" #: src/dialogs/confdialog.cxx:11083 msgid "Speed (WPM):" msgstr "Скорость (WPM):" #: src/dialogs/confdialog.cxx:11084 msgid "Send at this WPM" msgstr "Отправить в этом WPM" #: src/dialogs/confdialog.cxx:11104 msgid "CW ID modes" msgstr "CW ID режимы" #: src/dialogs/confdialog.cxx:11114 src/dialogs/confdialog.cxx:11254 #: src/dialogs/confdialog.cxx:11256 #, fuzzy msgid "IDs/RsID" msgstr "RsID" #: src/dialogs/confdialog.cxx:11118 msgid "Reed-Solomon ID (Rx)" msgstr "" #: src/dialogs/confdialog.cxx:11121 msgid "Notify only" msgstr "Только уведомлять" #: src/dialogs/confdialog.cxx:11122 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Установите галку, чтобы получать уведомления,\n" "когда приняли RSID не меняя модем и частоты" #: src/dialogs/confdialog.cxx:11128 #, fuzzy #| msgid "Rig mode" msgid "Rx modes" msgstr "Rig установки" #: src/dialogs/confdialog.cxx:11131 msgid "Mark prev freq/mode" msgstr "" #: src/dialogs/confdialog.cxx:11132 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" #: src/dialogs/confdialog.cxx:11137 msgid "Allow errors" msgstr "Разрешить ошибки" #: src/dialogs/confdialog.cxx:11138 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Low = без ошибок\n" "Medium = 1 ошибка\n" "High = 2 ошибки" #: src/dialogs/confdialog.cxx:11149 msgid "Medium" msgstr "Средне" #: src/dialogs/confdialog.cxx:11154 msgid "Disable alert dialog" msgstr "Отключить диалог предупреждения" #: src/dialogs/confdialog.cxx:11155 msgid "Do not show RsID alert dialog box" msgstr "Не показывать диалоговое окно RSID предупреждения" #: src/dialogs/confdialog.cxx:11160 msgid "Disables detector" msgstr "Выключить детектор" #: src/dialogs/confdialog.cxx:11161 msgid "Disable further detection when RSID is received" msgstr "Отключение дальнейшего обнаружения при получении RSID" #: src/dialogs/confdialog.cxx:11168 msgid "Retain tx freq lock" msgstr "" #: src/dialogs/confdialog.cxx:11169 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" "Сохранить частоту блокировки TX (LK) при переключении RSID на частоте RX" #: src/dialogs/confdialog.cxx:11174 msgid "Disable freq change" msgstr "Отключить изменение частоты" #: src/dialogs/confdialog.cxx:11175 src/dialogs/confdialog.cxx:11181 msgid "Do not automatically change to RX RsID frequency" msgstr "Не менять автоматически частоту RX RSID" #: src/dialogs/confdialog.cxx:11180 msgid "Rx/Tx RsID EOT" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "Squelch open (sec)" msgstr "Открыть шумодав (сек)" #: src/dialogs/confdialog.cxx:11187 src/dialogs/confdialog.cxx:11208 msgid "Use for triggering amplifier carrier detect" msgstr "" #: src/dialogs/confdialog.cxx:11196 #, fuzzy #| msgid "" #| "The RsID notification message contents and\n" #| "display characteristics are configured on the\n" #| "\"Notifications\" configure dialog." msgid "" "The RsID notification message contents and display\n" "characteristics are configured on the \"Notifications\" tab." msgstr "" "Содержание сообщений и уведомлений RsID и\n" "характеристики дисплея настраиваются в\n" "настройках диалогового окна \"Уведомления\" ." #: src/dialogs/confdialog.cxx:11204 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:11207 msgid "Seconds" msgstr "секунды" #: src/dialogs/confdialog.cxx:11216 msgid "Reed-Solomon ID (Tx)" msgstr "" #: src/dialogs/confdialog.cxx:11219 msgid "Transmit modes" msgstr "Режимы передачи" #: src/dialogs/confdialog.cxx:11222 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:11223 msgid "Add RsID signal to end of transmission" msgstr "Добавить сигнал RSID к концу передачи" #: src/dialogs/confdialog.cxx:11230 #, fuzzy msgid "Min BW Detection" msgstr "Раздел" #: src/dialogs/confdialog.cxx:11233 msgid "Hertz" msgstr "" #: src/dialogs/confdialog.cxx:11234 #, fuzzy #| msgid "Filter bandwidth" msgid "Minimum bandwidth" msgstr "Полосовой фильтр" #: src/dialogs/confdialog.cxx:11243 #, fuzzy #| msgid "Password" msgid "Passband" msgstr "Пароль" #: src/dialogs/confdialog.cxx:11244 #, fuzzy #| msgid "" #| "ON - search over entire waterfall\n" #| "OFF - limit search to +/- 200 Hz" msgid "" "ON - search over entire waterfall\n" "OFF - limit search to BW selector" msgstr "" "ON - поиск по всему водопаду\n" "OFF - Лимит поиска +/- 200 Гц" #: src/dialogs/confdialog.cxx:11259 src/dialogs/confdialog.cxx:11335 #: src/dialogs/confdialog.cxx:11337 #, fuzzy msgid "IDs/Video" msgstr "Видео" #: src/dialogs/confdialog.cxx:11263 msgid "Video Preamble ID" msgstr "Видео вступление ID" #: src/dialogs/confdialog.cxx:11266 msgid "Transmit mode ID" msgstr "Передаваемый режим ID" #: src/dialogs/confdialog.cxx:11267 msgid "Waterfall video ID" msgstr "" #: src/dialogs/confdialog.cxx:11271 msgid "Transmit video text" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Waterfall video text" msgstr "" #: src/dialogs/confdialog.cxx:11277 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:11278 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" #: src/dialogs/confdialog.cxx:11292 msgid "Use small font" msgstr "Использовать маленький шрифт" #: src/dialogs/confdialog.cxx:11293 msgid "" "ON - small font\n" "OFF - large font" msgstr "" #: src/dialogs/confdialog.cxx:11299 msgid "Chars/Row:" msgstr "" #: src/dialogs/confdialog.cxx:11300 msgid "Set the number of characters per row" msgstr "Установите количество символов в строке" #: src/dialogs/confdialog.cxx:11320 msgid "500 Hz limit" msgstr "500 Гц предел" #: src/dialogs/confdialog.cxx:11325 msgid "Mode width limit" msgstr "Режим ограничения по ширине" #: src/dialogs/confdialog.cxx:11330 msgid "Video ID modes" msgstr "" #: src/dialogs/confdialog.cxx:11341 src/dialogs/confdialog.cxx:11398 #: src/dialogs/confdialog.cxx:11400 #, fuzzy msgid "Logging/MacLogger" msgstr "MacLogger" #: src/dialogs/confdialog.cxx:11345 msgid "Connect to MacLogger" msgstr "подключиться к MacLogger" #: src/dialogs/confdialog.cxx:11350 msgid "Capture Radio Report" msgstr "Перехват рапорта" #: src/dialogs/confdialog.cxx:11356 msgid "Capture Log Report" msgstr "" #: src/dialogs/confdialog.cxx:11361 msgid "Capture Lookup " msgstr "" #: src/dialogs/confdialog.cxx:11366 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:11371 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:11376 msgid "Enable UDP log file" msgstr "" #: src/dialogs/confdialog.cxx:11381 msgid "UDP data stream" msgstr "" #: src/dialogs/confdialog.cxx:11389 msgid "Clear UDP text" msgstr "Очистить текст UDP" #: src/dialogs/confdialog.cxx:11392 msgid "Tune to Rx Spot" msgstr "" #: src/dialogs/confdialog.cxx:11393 #, fuzzy msgid "" "ON - use Rx spot freq\n" "OFF - use Tx spot freq" msgstr "" "ON - Использовать последний набор макросов\n" "OFF - Использовать установки по умолчанию" #: src/dialogs/confdialog.cxx:11403 src/dialogs/confdialog.cxx:11482 #: src/dialogs/confdialog.cxx:11484 #, fuzzy msgid "Logging/N3FJP logs" msgstr "N3FJP logs" #: src/dialogs/confdialog.cxx:11407 msgid "TCP/IP Data Stream" msgstr "TCP/IP Поток данных" #: src/dialogs/confdialog.cxx:11412 msgid "Clear text" msgstr "Очистить текст" #: src/dialogs/confdialog.cxx:11415 msgid "Address" msgstr "Адрес" #: src/dialogs/confdialog.cxx:11416 msgid "N3FJP Server IP Address" msgstr "N3FJP Server IP Address" #: src/dialogs/confdialog.cxx:11430 src/dialogs/confdialog.cxx:15264 #: src/dialogs/confdialog.cxx:15288 src/dialogs/confdialog.cxx:15528 #: src/dialogs/confdialog.cxx:17016 src/dialogs/confdialog.cxx:17068 #: src/dialogs/confdialog.cxx:17115 src/dialogs/confdialog.cxx:17148 #: src/dialogs/confdialog.cxx:17368 msgid "Port" msgstr "Порт" #: src/dialogs/confdialog.cxx:11431 msgid "N3FJP Server IP Port" msgstr "N3FJP Server IP Port" #: src/dialogs/confdialog.cxx:11446 src/dialogs/confdialog.cxx:16948 #: src/dialogs/confdialog.cxx:17033 src/dialogs/confdialog.cxx:17047 #: src/dialogs/confdialog.cxx:17094 src/dialogs/confdialog.cxx:17160 #: src/dialogs/confdialog.cxx:17349 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" #: src/dialogs/confdialog.cxx:11449 msgid "Enable Data Stream" msgstr "Включить поток данных" #: src/dialogs/confdialog.cxx:11454 src/dialogs/confdialog.cxx:12842 #: src/dialogs/confdialog.cxx:13091 src/dialogs/confdialog.cxx:13390 #: src/dialogs/confdialog.cxx:15159 src/dialogs/confdialog.cxx:15543 msgid "Connect" msgstr "Соединиться" #: src/dialogs/confdialog.cxx:11459 src/dialogs/confdialog.cxx:16450 #, fuzzy msgid "Connected" msgstr "Соединиться" #: src/dialogs/confdialog.cxx:11465 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:11466 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:11471 msgid "Report actual modem RF frequency" msgstr "В рапорт фактическая частота передачи" #: src/dialogs/confdialog.cxx:11472 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:11487 src/dialogs/confdialog.cxx:11614 #: src/dialogs/confdialog.cxx:11616 #, fuzzy msgid "Logging/eQSL" msgstr "Регистроция" #: src/dialogs/confdialog.cxx:11491 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:11492 src/dialogs/confdialog.cxx:11507 #: src/dialogs/confdialog.cxx:11542 msgid "Your login name" msgstr "Введите ваш логин" #: src/dialogs/confdialog.cxx:11506 msgid "User ID" msgstr "User ID" #: src/dialogs/confdialog.cxx:11522 msgid "Your login password" msgstr "Ваш логин пароль" #: src/dialogs/confdialog.cxx:11541 msgid "QTH Nickname" msgstr "QTH Nickname" #: src/dialogs/confdialog.cxx:11556 msgid "Verify" msgstr "Сравнить" #: src/dialogs/confdialog.cxx:11557 msgid "Verify database with eQSL download file" msgstr "Сравнить базу данных с файлом загрузки eQSL" #: src/dialogs/confdialog.cxx:11560 msgid "Options" msgstr "Опции" #: src/dialogs/confdialog.cxx:11563 msgid "send when logged (log button, , )" msgstr "Отправить в лог (макросы , )" #: src/dialogs/confdialog.cxx:11564 msgid "automatic data upload" msgstr "Автоматическая закачка данных" #: src/dialogs/confdialog.cxx:11569 msgid "Use date/time off for log entry" msgstr "Записывать в лог date/time off" #: src/dialogs/confdialog.cxx:11570 msgid "default uses date/time on" msgstr "По умолчанию date/time on" #: src/dialogs/confdialog.cxx:11575 src/dialogs/confdialog.cxx:11690 #, fuzzy msgid "Show delivery message" msgstr "Показать меньше режимов" #: src/dialogs/confdialog.cxx:11576 src/dialogs/confdialog.cxx:11691 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:11581 msgid "Default message" msgstr "" #: src/dialogs/confdialog.cxx:11582 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:11596 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:11599 msgid " {CALL} other ops call sign" msgstr " {CALL} позывной корреспондента" #: src/dialogs/confdialog.cxx:11602 msgid " {MODE} full mode / submode" msgstr " {MODE} полный режим/подрежим" #: src/dialogs/confdialog.cxx:11605 msgid "{NAME} other ops name" msgstr "{NAME} имя корреспондента" #: src/dialogs/confdialog.cxx:11608 msgid "These tags can also be used in " msgstr "Эти теги могут также использоваться в " #: src/dialogs/confdialog.cxx:11619 src/dialogs/confdialog.cxx:11751 #: src/dialogs/confdialog.cxx:11753 #, fuzzy msgid "Logging/LoTW" msgstr "Регистроция" #: src/dialogs/confdialog.cxx:11623 msgid "tqsl:" msgstr "tqsl:" #: src/dialogs/confdialog.cxx:11624 msgid "Enter full path-filename for tqsl executable" msgstr "Ввести имя файла и путь для исполняемого файла tqsl" #: src/dialogs/confdialog.cxx:11638 msgid "Your tqsl login password" msgstr "Ваш пароль/логин tqsl" #: src/dialogs/confdialog.cxx:11653 #, fuzzy msgid "Password required" msgstr "Пароль" #: src/dialogs/confdialog.cxx:11654 msgid "Submit password with each upload" msgstr "Укажите пароль для каждой закачки" #: src/dialogs/confdialog.cxx:11659 msgid "Location" msgstr "" #: src/dialogs/confdialog.cxx:11660 msgid "tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:11674 src/dialogs/confdialog.cxx:16002 #: src/dialogs/confdialog.cxx:16020 src/dialogs/confdialog.cxx:16038 #: src/dialogs/confdialog.cxx:16056 src/dialogs/confdialog.cxx:16074 #: src/dialogs/confdialog.cxx:16092 src/dialogs/confdialog.cxx:16110 msgid "Locate" msgstr "Путь" #: src/dialogs/confdialog.cxx:11675 msgid "Locate tqsl executable" msgstr "Место tqsl исполняемого файла" #: src/dialogs/confdialog.cxx:11678 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "Тихий режим [-q], не открывать tqsl диалог" #: src/dialogs/confdialog.cxx:11679 msgid "Operate tqsl in batch mode (no dialog)" msgstr "Управлять tqsl в пакетном режиме" #: src/dialogs/confdialog.cxx:11684 msgid "Send QSO data to LoTW when logged" msgstr "Отправить зарегистрированые QSO в LoTW" #: src/dialogs/confdialog.cxx:11685 msgid "Submit each QSO as logged" msgstr "Представить каждое QSO, как зарегистрированое" #: src/dialogs/confdialog.cxx:11696 msgid "Export" msgstr "Экспорт" #: src/dialogs/confdialog.cxx:11697 msgid "Export records for LoTW upload" msgstr "Экспортировать отчеты для закачки LoTW" #: src/dialogs/confdialog.cxx:11700 src/logbook/lgbook.cxx:770 #: src/logbook/lgbook.cxx:1403 src/logbook/lgbook.cxx:1456 msgid "Check" msgstr "" #: src/dialogs/confdialog.cxx:11701 msgid "Review lotw.adif file before sending with tqsl" msgstr "Проверить lotw.adif файл прежде, чем послать с tqsl" #: src/dialogs/confdialog.cxx:11705 msgid "Send lotw.adif via tqsl" msgstr "Послать lotw.adif через tqsl" #: src/dialogs/confdialog.cxx:11708 #, fuzzy msgid "Export logbook records for LoTW upload" msgstr "Экспортировать отчеты для закачки LoTW" #: src/dialogs/confdialog.cxx:11711 msgid "Review / edit the exported LoTW upload adif file" msgstr "Редактировать экспортируемый LoTW adif файл" #: src/dialogs/confdialog.cxx:11714 msgid "Submit the upload adif file to LoTW" msgstr "Представить закачку adif файла в LoTW" #: src/dialogs/confdialog.cxx:11717 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" "У вас должен быть установлена и настроена программа tqsl (http://www.arrl." "org/tqsl-download)" #: src/dialogs/confdialog.cxx:11725 msgid "Use this tqsl station location" msgstr "Использовать это расположение tqsl станции" #: src/dialogs/confdialog.cxx:11728 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:11729 src/dialogs/confdialog.cxx:11736 msgid "Verify database with LoTW download file" msgstr "Сравнить базу данных с файлом загрузки LoTW" #: src/dialogs/confdialog.cxx:11732 msgid "Match logbook records with LoTW download file" msgstr "Выбрать записи журнала для файла загрузки LoTW" #: src/dialogs/confdialog.cxx:11735 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:11740 #, fuzzy msgid "Timeout" msgstr "Тайм-аут" #: src/dialogs/confdialog.cxx:11741 #, fuzzy msgid "Wait NN seconds for LoTW response" msgstr "Интервал ожидания (мс) перед чтением ответа" #: src/dialogs/confdialog.cxx:11756 src/dialogs/confdialog.cxx:11807 #: src/dialogs/confdialog.cxx:11809 #, fuzzy msgid "Logging/Cloudlog" msgstr "Искать позывной" #: src/dialogs/confdialog.cxx:11760 msgid "This allows for logging of QSOs to a Cloudlog instance." msgstr "" #: src/dialogs/confdialog.cxx:11764 msgid "Enable Cloudlog API logging" msgstr "" #: src/dialogs/confdialog.cxx:11765 msgid "This enables logging of QSOs to Cloudlog via API" msgstr "" #: src/dialogs/confdialog.cxx:11770 msgid "API URL:" msgstr "" #: src/dialogs/confdialog.cxx:11771 msgid "Enter the URL of your Cloudlog API" msgstr "" #: src/dialogs/confdialog.cxx:11784 msgid "API Key:" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "Enter the API key for your Cloudlog instance" msgstr "" #: src/dialogs/confdialog.cxx:11798 #, fuzzy #| msgid "Station QTH:" msgid "Station ID:" msgstr "QTH станции:" #: src/dialogs/confdialog.cxx:11803 src/dialogs/confdialog.cxx:16485 #: src/dialogs/confdialog.cxx:17555 src/dialogs/confdialog.cxx:17650 #: src/dialogs/confdialog.cxx:18174 src/dialogs/confdialog.cxx:18269 msgid "Initialize" msgstr "Активация" #: src/dialogs/confdialog.cxx:11804 msgid "Test API Key" msgstr "" #: src/dialogs/confdialog.cxx:11813 src/dialogs/confdialog.cxx:11893 #: src/dialogs/confdialog.cxx:11895 #, fuzzy msgid "Logging/QSO logging" msgstr "Ведение журнала" #: src/dialogs/confdialog.cxx:11817 msgid "Prompt to save log on exit" msgstr "Запрос на сохранение лога при выходе" #: src/dialogs/confdialog.cxx:11818 src/dialogs/confdialog.cxx:11887 #: src/dialogs/confdialog.cxx:19222 msgid "Bug me about saving log entries" msgstr "Сообщить мне о сохранении записей журнала" #: src/dialogs/confdialog.cxx:11823 msgid "Clear on save" msgstr "Очищать поля после сохранения" #: src/dialogs/confdialog.cxx:11824 msgid "Clear log entries after saving or using macro " msgstr "Очистить поля журнала после сохранения или макросом " #: src/dialogs/confdialog.cxx:11829 msgid "Convert callsign to upper case" msgstr "Позывной заглавными буквами" #: src/dialogs/confdialog.cxx:11830 msgid "Force callsign field to UPPERCASE" msgstr "Позывной преобразовать ЗАГЛАВНЫМИ" #: src/dialogs/confdialog.cxx:11835 msgid "Auto-fill Country and Azimuth" msgstr "Автозаполнение Страны и Азимута" #: src/dialogs/confdialog.cxx:11836 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Заполнить Страна/азимут с помощью cty.dat" #: src/dialogs/confdialog.cxx:11841 msgid "Sort by Date/Time OFF" msgstr "Сортировать по Date/Time OFF" #: src/dialogs/confdialog.cxx:11842 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" #: src/dialogs/confdialog.cxx:11847 msgid "Date time ON == OFF" msgstr "Date time ON == OFF" #: src/dialogs/confdialog.cxx:11848 msgid "Force date/time ON == date/time OFF" msgstr "Установить date/time ON == date/time OFF" #: src/dialogs/confdialog.cxx:11853 msgid "Default RST in to 599/59" msgstr "По умолчанию RX RST 599/59" #: src/dialogs/confdialog.cxx:11854 msgid "Clear log controls sets RST in to 599/59" msgstr "Очистить лог и установить RST 599/59" #: src/dialogs/confdialog.cxx:11859 msgid "Default RST out to 599/59" msgstr "По умолчанию TX RST 599/59" #: src/dialogs/confdialog.cxx:11860 msgid "Clear log controls sets RST out to 599/59" msgstr "Очистить элементы управления лога установить TX RST 599/59" #: src/dialogs/confdialog.cxx:11865 msgid "Transmit Power" msgstr "Выходная мощность" #: src/dialogs/confdialog.cxx:11866 msgid "Tx power used for logbook entries" msgstr "" #: src/dialogs/confdialog.cxx:11880 #, fuzzy msgid "Display logbook read datum at start" msgstr "Показать имя файла макросов при старте" #: src/dialogs/confdialog.cxx:11881 src/dialogs/confdialog.cxx:19372 msgid "The filename is written to the RX text area" msgstr "Имя файла записывается в текстовой области RX" #: src/dialogs/confdialog.cxx:11886 msgid "Log power meter " msgstr "" #: src/dialogs/confdialog.cxx:11899 src/dialogs/confdialog.cxx:12167 #: src/dialogs/confdialog.cxx:12169 #, fuzzy msgid "Modem/CW/General" msgstr "Главная" #: src/dialogs/confdialog.cxx:11906 msgid "SOM decoding" msgstr "SOM декодирование" #: src/dialogs/confdialog.cxx:11907 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:11913 #, fuzzy #| msgid "Tracking" msgid "WPM Tracking" msgstr "Отслеживание" #: src/dialogs/confdialog.cxx:11914 msgid "Automatic Rx speed tracking" msgstr "Автоматическое отслеживание скорости Rx" #: src/dialogs/confdialog.cxx:11920 msgid "Filter bandwidth" msgstr "Полосовой фильтр" #: src/dialogs/confdialog.cxx:11921 msgid "CW dsp filter bandwidth" msgstr "Полосовой dsp фильтр CW" #: src/dialogs/confdialog.cxx:11941 #, fuzzy msgid "Matched Filt'" msgstr "Настроенный фильтор" #: src/dialogs/confdialog.cxx:11942 msgid "Matched Filter bandwidth" msgstr "Настроенный полосовой" #: src/dialogs/confdialog.cxx:11948 msgid "Rx WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11954 msgid "Tracked CW speed in WPM" msgstr "Отслеживать скорость CW в WPM" #: src/dialogs/confdialog.cxx:11959 msgid "Lower" msgstr "Ниже" #: src/dialogs/confdialog.cxx:11960 msgid "Detector low threshold" msgstr "Детектор нижнего порога" #: src/dialogs/confdialog.cxx:11980 msgid "Upper" msgstr "Выше" #: src/dialogs/confdialog.cxx:11981 msgid "Detector high threshold" msgstr "Детектор верхнего порого" #: src/dialogs/confdialog.cxx:12001 #, fuzzy msgid "Range" msgstr "dB Диапазон" #: src/dialogs/confdialog.cxx:12002 msgid "Range +/- wpm" msgstr "Диапазон +/- wpm" #: src/dialogs/confdialog.cxx:12021 #, fuzzy #| msgid "Signal tracks" msgid "Signal tracking" msgstr "Дорожка сигнала" #: src/dialogs/confdialog.cxx:12024 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:12030 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:12046 #, fuzzy msgid "char WPM" msgstr "символы" #: src/dialogs/confdialog.cxx:12047 src/dialogs/confdialog.cxx:12112 #: src/dialogs/confdialog.cxx:12139 msgid "My transmit CW WPM" msgstr "Моя скорость CW WPM" #: src/dialogs/confdialog.cxx:12068 msgid "The default CW speed" msgstr "Скорость CW по умолчанию" #: src/dialogs/confdialog.cxx:12087 src/dialogs/confdialog.cxx:19811 msgid "Lower limit" msgstr "Нижний предел" #: src/dialogs/confdialog.cxx:12088 msgid "No slower than this" msgstr "Не медленнее чем" #: src/dialogs/confdialog.cxx:12099 src/dialogs/confdialog.cxx:19856 msgid "Upper limit" msgstr "Верхний предел" #: src/dialogs/confdialog.cxx:12100 msgid "No faster than this" msgstr "Не быстрее чем" #: src/dialogs/confdialog.cxx:12111 #, fuzzy msgid "text WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:12132 msgid "Use Farnsworth timing" msgstr "Синхронизация Farnsworth" #: src/dialogs/confdialog.cxx:12133 src/dialogs/confdialog.cxx:12160 msgid "text WPM <= char WPM" msgstr "" #: src/dialogs/confdialog.cxx:12138 #, fuzzy msgid "Spacing WPM" msgstr "Диапазон, WPM" #: src/dialogs/confdialog.cxx:12159 #, fuzzy #| msgid "Use Farnsworth timing" msgid "Use Wordsworth timing" msgstr "Синхронизация Farnsworth" #: src/dialogs/confdialog.cxx:12172 src/dialogs/confdialog.cxx:12370 #: src/dialogs/confdialog.cxx:12372 #, fuzzy msgid "Modem/CW/Timing and QSK" msgstr "Синхронизация и QSK" #: src/dialogs/confdialog.cxx:12176 msgid "Timing" msgstr "Синхронизировать" #: src/dialogs/confdialog.cxx:12179 src/dialogs/confdialog.cxx:13130 msgid "Dash/Dot" msgstr "Тире/точек" #: src/dialogs/confdialog.cxx:12180 src/dialogs/confdialog.cxx:13131 msgid "Dash to dot ratio" msgstr "" #: src/dialogs/confdialog.cxx:12198 src/dialogs/confdialog.cxx:12321 msgid "Edge timing" msgstr "" #: src/dialogs/confdialog.cxx:12199 src/dialogs/confdialog.cxx:12322 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:12217 msgid "Edge shape" msgstr "" #: src/dialogs/confdialog.cxx:12218 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:12236 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12239 msgid "QSK on right audio channel" msgstr "QSK на правом канале" #: src/dialogs/confdialog.cxx:12240 msgid "Generate square wave signal on right channel" msgstr "Сформировать прямоугольный сигнал на правом канале" #: src/dialogs/confdialog.cxx:12245 #, fuzzy msgid "QSK frequency" msgstr "Плохая частота" #: src/dialogs/confdialog.cxx:12246 msgid "Fundamental frequency of QSK square wave signal" msgstr "" #: src/dialogs/confdialog.cxx:12265 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:12266 msgid "Msec pre-keydown" msgstr "" #: src/dialogs/confdialog.cxx:12283 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:12284 msgid "Msec post-keydown" msgstr "" #: src/dialogs/confdialog.cxx:12301 #, fuzzy msgid "QSK amplitude" msgstr "Частота дискретизации" #: src/dialogs/confdialog.cxx:12302 msgid "Amplitude of right channel QSK signal" msgstr "" #: src/dialogs/confdialog.cxx:12342 #, fuzzy msgid "Send Test character" msgstr "Биты на символ" #: src/dialogs/confdialog.cxx:12345 msgid "Test char" msgstr "Тестовый символ" #: src/dialogs/confdialog.cxx:12346 msgid "Test character for QSK adjustment" msgstr "Тестовые символы для регулировки QSK" #: src/dialogs/confdialog.cxx:12362 msgid "Send continuously" msgstr "Отправлять непрерывно" #: src/dialogs/confdialog.cxx:12363 msgid "Send a continuous stream of test characters" msgstr "Отправлять непрерывный поток тестовых символов" #: src/dialogs/confdialog.cxx:12375 src/dialogs/confdialog.cxx:12580 #: src/dialogs/confdialog.cxx:12582 #, fuzzy msgid "Modem/CW/Prosigns" msgstr "Пометки" #: src/dialogs/confdialog.cxx:12379 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:12382 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:12383 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:12385 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:12386 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:12388 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:12389 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:12391 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:12392 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:12394 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:12395 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:12397 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:12398 src/dialogs/confdialog.cxx:12401 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:12400 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:12403 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:12404 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:12406 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:12407 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:12409 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:12410 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:12412 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:12413 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:12417 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12434 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12451 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12468 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12484 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12501 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12535 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12552 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12569 msgid "Use '(' paren not KN" msgstr "" #: src/dialogs/confdialog.cxx:12574 msgid "Display decoded as assigned key" msgstr "" #: src/dialogs/confdialog.cxx:12575 msgid "Display the decoded prosign in the RX text using the short cut key" msgstr "" #: src/dialogs/confdialog.cxx:12585 src/dialogs/confdialog.cxx:12683 #: src/dialogs/confdialog.cxx:12685 msgid "Modem/CW/Extended Chars." msgstr "" #: src/dialogs/confdialog.cxx:12589 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:12594 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:12595 src/dialogs/confdialog.cxx:12601 #: src/dialogs/confdialog.cxx:12609 src/dialogs/confdialog.cxx:12617 #: src/dialogs/confdialog.cxx:12623 src/dialogs/confdialog.cxx:12629 #: src/dialogs/confdialog.cxx:12637 src/dialogs/confdialog.cxx:12643 #: src/dialogs/confdialog.cxx:12649 src/dialogs/confdialog.cxx:12655 #: src/dialogs/confdialog.cxx:12663 src/dialogs/confdialog.cxx:12669 #: src/dialogs/confdialog.cxx:12933 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:12600 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12608 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:12616 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:12622 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:12628 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12636 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:12642 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:12648 #, fuzzy msgid " E acute" msgstr "Выполнить" #: src/dialogs/confdialog.cxx:12654 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:12662 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12668 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:12676 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:12688 msgid "Punctuation/Noise Processing" msgstr "" #: src/dialogs/confdialog.cxx:12692 msgid "Check to enable character encode/decode" msgstr "" #: src/dialogs/confdialog.cxx:12695 msgid " backslash \\ \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12696 src/dialogs/confdialog.cxx:12704 #: src/dialogs/confdialog.cxx:12712 src/dialogs/confdialog.cxx:12720 #: src/dialogs/confdialog.cxx:12728 src/dialogs/confdialog.cxx:12736 #: src/dialogs/confdialog.cxx:12744 src/dialogs/confdialog.cxx:12752 #: src/dialogs/confdialog.cxx:12760 src/dialogs/confdialog.cxx:12768 #: src/dialogs/confdialog.cxx:12776 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable for no printed character" msgstr "Включите эту опцию для латинских 1-подчеркнутых символов" #: src/dialogs/confdialog.cxx:12703 msgid " apostrophe ' \".----.\"" msgstr "" #: src/dialogs/confdialog.cxx:12711 msgid " quote \" \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12719 msgid " dollar sign $ \"...-..-\"" msgstr "" #: src/dialogs/confdialog.cxx:12727 msgid " open_paren ( \"-.--.\"" msgstr "" #: src/dialogs/confdialog.cxx:12735 msgid " close paren ) \"-.--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12743 msgid " colon : \"---...\"" msgstr "" #: src/dialogs/confdialog.cxx:12751 msgid " semi colon ; \"-.-.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12759 msgid " underscore _ \"..--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12767 msgid " at symbol @@ \".--.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12775 msgid " exclamation ! \"-.-.--\"" msgstr "" #: src/dialogs/confdialog.cxx:12785 msgid "Unknown character decode (noise)" msgstr "" #: src/dialogs/confdialog.cxx:12788 msgid " Do not display unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12789 src/dialogs/confdialog.cxx:12796 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable '*'or no printed character" msgstr "Включите эту опцию для латинских 1-подчеркнутых символов" #: src/dialogs/confdialog.cxx:12795 msgid " Display '*' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12802 msgid " Display '_' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12803 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable '_' for no printed character" msgstr "Включите эту опцию для латинских 1-подчеркнутых символов" #: src/dialogs/confdialog.cxx:12809 msgid " Display ' ' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12810 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable ' ' for no printed character" msgstr "Включите эту опцию для латинских 1-подчеркнутых символов" #: src/dialogs/confdialog.cxx:12818 src/dialogs/confdialog.cxx:12820 #, fuzzy msgid "Modem/CW/Punctuation-Noise" msgstr "Пометки" #: src/dialogs/confdialog.cxx:12823 src/dialogs/confdialog.cxx:13067 #: src/dialogs/confdialog.cxx:13069 msgid "Modem/CW/WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:12827 src/dialogs/confdialog.cxx:13076 #: src/dialogs/confdialog.cxx:15144 #, fuzzy msgid "Ser. Port" msgstr "Порт" #: src/dialogs/confdialog.cxx:12828 src/dialogs/confdialog.cxx:15529 msgid "Xcvr serial port" msgstr "" #: src/dialogs/confdialog.cxx:12843 src/dialogs/confdialog.cxx:15544 msgid "Connect / Disconnect from WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:12847 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:12851 #, fuzzy msgid "Bk" msgstr "Назад" #: src/dialogs/confdialog.cxx:12855 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:12859 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:12863 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:12867 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:12880 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:12893 src/dialogs/confdialog.cxx:15617 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:12906 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:12919 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:12920 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:12927 #, fuzzy msgid "WPM setting" msgstr "Установки" #: src/dialogs/confdialog.cxx:12929 src/dialogs/confdialog.cxx:12958 #, fuzzy msgid "ModeReg" msgstr "Режим" #: src/dialogs/confdialog.cxx:12932 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:12937 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:12938 #, fuzzy msgid "Enable paddle auto spacing of characters" msgstr "Включите это для UTF-8 символов" #: src/dialogs/confdialog.cxx:12942 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:12943 #, fuzzy msgid "Enable contest character spacing" msgstr "Включите это для UTF-8 символов" #: src/dialogs/confdialog.cxx:12947 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:12951 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:12952 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:12961 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:12962 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:12966 #, fuzzy msgid "Serial echo" msgstr "Переданный сер. номер" #: src/dialogs/confdialog.cxx:12971 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:12972 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:12976 #, fuzzy msgid "Tone ON" msgstr "Time ON" #: src/dialogs/confdialog.cxx:12977 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:12981 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:12982 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:12988 #, fuzzy msgid "WPM Settings" msgstr "Установки" #: src/dialogs/confdialog.cxx:12991 src/dialogs/confdialog.cxx:13211 #, fuzzy msgid "Min WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:12992 src/dialogs/confdialog.cxx:13212 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:13000 src/dialogs/confdialog.cxx:13221 #, fuzzy msgid "Rng WPM" msgstr "Диапазон, WPM" #: src/dialogs/confdialog.cxx:13001 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:13005 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:13006 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13010 #, fuzzy msgid "Cmd WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:13011 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:13017 #, fuzzy msgid "Timing/Settings" msgstr "Установки" #: src/dialogs/confdialog.cxx:13020 msgid "Ratio" msgstr "" #: src/dialogs/confdialog.cxx:13021 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:13025 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:13026 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13030 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:13031 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13035 #, fuzzy msgid "Sample" msgstr "Частота дискретизации" #: src/dialogs/confdialog.cxx:13036 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:13040 #, fuzzy msgid "Weight" msgstr "Вес (%)" #: src/dialogs/confdialog.cxx:13041 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13050 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:13051 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13059 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:13060 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:13072 src/dialogs/confdialog.cxx:13277 #: src/dialogs/confdialog.cxx:13279 msgid "Modem/CW/nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13077 src/dialogs/confdialog.cxx:13376 #: src/dialogs/confdialog.cxx:15145 msgid "nanoIO serial port" msgstr "" #: src/dialogs/confdialog.cxx:13092 src/dialogs/confdialog.cxx:13391 #: src/dialogs/confdialog.cxx:15160 msgid "Connect / Disconnect from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13095 #, fuzzy msgid "Paddle" msgstr "Диапазон, WPM" #: src/dialogs/confdialog.cxx:13096 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:13119 src/dialogs/confdialog.cxx:13239 #: src/dialogs/confdialog.cxx:13261 #, fuzzy msgid "Comp'" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:13120 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:13149 #, fuzzy msgid "Baud" msgstr "Скорость передачи данных" #: src/dialogs/confdialog.cxx:13164 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:13179 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:13195 src/dialogs/confdialog.cxx:15192 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:13198 src/dialogs/confdialog.cxx:15195 #, fuzzy msgid "Status" msgstr "Штат" #: src/dialogs/confdialog.cxx:13199 src/dialogs/confdialog.cxx:15196 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13204 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:13205 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:13222 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:13233 #, fuzzy msgid "PTT off" msgstr "TX смещение" #: src/dialogs/confdialog.cxx:13234 #, fuzzy msgid "Disable PTT" msgstr "Выключить всё" #: src/dialogs/confdialog.cxx:13242 #, fuzzy msgid "WPM" msgstr "F-WPM" #: src/dialogs/confdialog.cxx:13252 #, fuzzy msgid "Test =>" msgstr "Тест" #: src/dialogs/confdialog.cxx:13253 #, fuzzy msgid "Send \"paris \" WPM times" msgstr "Отправить в этом WPM" #: src/dialogs/confdialog.cxx:13256 msgid "secs' =>" msgstr "" #: src/dialogs/confdialog.cxx:13257 #, fuzzy msgid "Test duration (60 seconds)" msgstr "Продолжительность тона (secs)" #: src/dialogs/confdialog.cxx:13262 msgid "Compensationin microseconds" msgstr "" #: src/dialogs/confdialog.cxx:13266 msgid "Adjust" msgstr "" #: src/dialogs/confdialog.cxx:13267 msgid "send compensation to nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13272 msgid "CW i/o" msgstr "" #: src/dialogs/confdialog.cxx:13273 msgid "Enable CW operation" msgstr "" #: src/dialogs/confdialog.cxx:13282 src/dialogs/confdialog.cxx:13404 #: src/dialogs/confdialog.cxx:13406 msgid "Modem/CW/DTR-RTS keying" msgstr "" #: src/dialogs/confdialog.cxx:13288 msgid "" "DTR/RTS keying may be assigned to flrig, share the RigCat serial port,\n" "share the Separate PTT serial port, or be assigned to separate serial port.\n" "\n" "No settings for baud, stops bits, etc are needed." msgstr "" #: src/dialogs/confdialog.cxx:13297 msgid "Use flrig DTR/RTS keying" msgstr "" #: src/dialogs/confdialog.cxx:13303 #, fuzzy msgid "Disable flrig CW PTT" msgstr "Выключить всё" #: src/dialogs/confdialog.cxx:13304 src/dialogs/confdialog.cxx:13451 msgid "" "Required for some transceivers\n" "e.g. TS-480" msgstr "" #: src/dialogs/confdialog.cxx:13313 #, fuzzy msgid "Share RIGCAT port" msgstr "Использовать отдельный порт PTT" #: src/dialogs/confdialog.cxx:13319 msgid "Share Separate PTT port" msgstr "" #: src/dialogs/confdialog.cxx:13325 msgid "CW Keyline" msgstr "" #: src/dialogs/confdialog.cxx:13340 msgid "Keying compensation (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13341 msgid "Dot / Space timing increment" msgstr "" #: src/dialogs/confdialog.cxx:13359 msgid "PTT keyline" msgstr "" #: src/dialogs/confdialog.cxx:13375 #, fuzzy msgid "Use Separate Keying Serial Port" msgstr "Использовать отдельный порт PTT" #: src/dialogs/confdialog.cxx:13395 msgid "Speed test" msgstr "" #: src/dialogs/confdialog.cxx:13396 msgid "1 minute 'PARIS '" msgstr "" #: src/dialogs/confdialog.cxx:13400 msgid "Result" msgstr "" #: src/dialogs/confdialog.cxx:13409 #, fuzzy msgid "Modem/CW/CAT Keying" msgstr "Главная" #: src/dialogs/confdialog.cxx:13413 msgid "" "CW keying using CAT command strings. Available for supported transceivers.\n" "Use with RigCAT or flrig transceiver control. A separate serial port is NOT " "needed.\n" "\n" "Disable CAT PTT if transceiver interprets that as a keydown command (e.g. " "TS480).\n" "Recommend setting transceiver to either semi or full break-in.\n" "\n" "Enter correct CIV address for Icom transceivers." msgstr "" #: src/dialogs/confdialog.cxx:13424 msgid "Icom" msgstr "" #: src/dialogs/confdialog.cxx:13429 msgid "Hex CIV addr" msgstr "" #: src/dialogs/confdialog.cxx:13430 msgid "Enter transceiver HEX CIV address" msgstr "" #: src/dialogs/confdialog.cxx:13435 msgid "Elecraft" msgstr "" #: src/dialogs/confdialog.cxx:13440 msgid "Kenwood" msgstr "" #: src/dialogs/confdialog.cxx:13445 msgid "Yaesu" msgstr "" #: src/dialogs/confdialog.cxx:13450 #, fuzzy msgid "Disable CAT PTT" msgstr "Выключить всё" #: src/dialogs/confdialog.cxx:13456 src/dialogs/confdialog.cxx:13458 #, fuzzy msgid "Modem/CW/CAT keying" msgstr "Главная" #: src/dialogs/confdialog.cxx:13461 msgid "CW CAT & WinKeyer Compensation" msgstr "" #: src/dialogs/confdialog.cxx:13465 msgid "" "Compute timing compensation for CAT CW and WinKeyer CW. Computation at " "current\n" "WPM . Set WPM to nominal (suggest 20 WPM).\n" "\n" "Compensation will be good over a +/- 10 WPM range. Calibration/Test is 1 " "minute of\n" "'PARIS '." msgstr "" #: src/dialogs/confdialog.cxx:13473 #, fuzzy msgid "Calibrate" msgstr "Частота дискретизации" #: src/dialogs/confdialog.cxx:13474 src/dialogs/confdialog.cxx:13489 msgid "Send WPM 'PARIS ' words" msgstr "" #: src/dialogs/confdialog.cxx:13477 #, fuzzy msgid "Compensate (secs)" msgstr "Медленно (4 msec)" #: src/dialogs/confdialog.cxx:13485 #, fuzzy #| msgid "Clear on save" msgid "Clear compensation" msgstr "Очищать поля после сохранения" #: src/dialogs/confdialog.cxx:13488 src/dialogs/confdialog.cxx:14847 #: src/dialogs/confdialog.cxx:16157 src/dialogs/confdialog.cxx:16161 #: src/dialogs/confdialog.cxx:16165 src/dialogs/confdialog.cxx:16169 #: src/dialogs/confdialog.cxx:16173 src/dialogs/confdialog.cxx:16177 #: src/dialogs/confdialog.cxx:16181 src/dialogs/confdialog.cxx:18399 #: src/dialogs/confdialog.cxx:18428 src/dialogs/confdialog.cxx:18457 #: src/dialogs/confdialog.cxx:18486 src/dialogs/confdialog.cxx:18505 msgid "Test" msgstr "Тест" #: src/dialogs/confdialog.cxx:13492 msgid "secs" msgstr "" #: src/dialogs/confdialog.cxx:13498 src/dialogs/confdialog.cxx:13500 #, fuzzy msgid "Modem/CW/CAT comp'" msgstr "Modem" #: src/dialogs/confdialog.cxx:13503 src/dialogs/confdialog.cxx:13591 #: src/dialogs/confdialog.cxx:13593 msgid "Modem/DominoEX" msgstr "" #: src/dialogs/confdialog.cxx:13507 src/dialogs/confdialog.cxx:15724 msgid "Secondary Text" msgstr "Дополнительный текст" #: src/dialogs/confdialog.cxx:13508 src/dialogs/confdialog.cxx:15725 msgid "Text to send during keyboard idle times" msgstr "Текст для отправки во время простоя клавиатуры" #: src/dialogs/confdialog.cxx:13522 src/dialogs/confdialog.cxx:15739 msgid "Filtering" msgstr "Фильтрация" #: src/dialogs/confdialog.cxx:13523 msgid "Use DSP filter before decoder" msgstr "Использовать DSP фильтр до декодера" #: src/dialogs/confdialog.cxx:13529 src/dialogs/confdialog.cxx:15746 msgid "Filter bandwidth factor" msgstr "Коэффициент полосы пропускания фильтра" #: src/dialogs/confdialog.cxx:13530 src/dialogs/confdialog.cxx:15747 msgid "Filter bandwidth relative to signal width" msgstr "Ширина полосы пропускания фильтра по отношению к ширине сигнала" #: src/dialogs/confdialog.cxx:13548 msgid "FEC" msgstr "FEC (прямое исправление ошибок)" #: src/dialogs/confdialog.cxx:13549 msgid "Enable MultiPSK-compatible FEC" msgstr "Включить Multipsk" #: src/dialogs/confdialog.cxx:13554 src/dialogs/confdialog.cxx:15765 msgid "CWI threshold" msgstr "CWI порог" #: src/dialogs/confdialog.cxx:13555 src/dialogs/confdialog.cxx:15766 msgid "CWI detection and suppression" msgstr "CWI детектирование и подавление" #: src/dialogs/confdialog.cxx:13571 src/dialogs/confdialog.cxx:15801 msgid "Paths (hidden)" msgstr "Пути (скрытые)" #: src/dialogs/confdialog.cxx:13596 src/dialogs/confdialog.cxx:13736 #: src/dialogs/confdialog.cxx:13738 msgid "Modem/Feld Hell" msgstr "" #: src/dialogs/confdialog.cxx:13600 msgid "Hell Transmit Parameters" msgstr "Hell Параметры передачи" #: src/dialogs/confdialog.cxx:13603 msgid "Transmit font" msgstr "Передаваемый шрифт" #: src/dialogs/confdialog.cxx:13604 msgid "Select TX raster font" msgstr "Выберите растровый шрифт ТХ" #: src/dialogs/confdialog.cxx:13620 msgid "Pulse shape" msgstr "Форма импульса" #: src/dialogs/confdialog.cxx:13621 msgid "Raised cosine pulse shape factor" msgstr "Приподнятый косинус фактор формы импульса" #: src/dialogs/confdialog.cxx:13632 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:13637 msgid "Transmit periods (.) when idle" msgstr "Переодическая передача (.) в режиме ожидания" #: src/dialogs/confdialog.cxx:13638 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" #: src/dialogs/confdialog.cxx:13644 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:13645 msgid "Range 1...3" msgstr "Диапазон 1 ...3" #: src/dialogs/confdialog.cxx:13659 msgid "Hell Receive Parameters" msgstr "Hell Параметры передачи" #: src/dialogs/confdialog.cxx:13662 msgid "Reverse video" msgstr "Реверс видео" #: src/dialogs/confdialog.cxx:13663 msgid "Display RX in reverse video" msgstr "Дисплей RX в реверс видео" #: src/dialogs/confdialog.cxx:13668 msgid "Marquee text" msgstr "Пунктирный текст" #: src/dialogs/confdialog.cxx:13669 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:13674 msgid "Rx Width Multiplier" msgstr "Множитель ширины Rx" #: src/dialogs/confdialog.cxx:13675 msgid "Range 1...4" msgstr "Диапазон 1 ...4" #: src/dialogs/confdialog.cxx:13687 msgid "Rx Height in pixels" msgstr "Rx Высота в пикселях" #: src/dialogs/confdialog.cxx:13688 msgid "May require resizing the Rx/Tx panel" msgstr "Может потребоваться изменение размера панели Rx / Tx" #: src/dialogs/confdialog.cxx:13700 msgid "Receive filter bandwidth" msgstr "Ширина приемного фильтра" #: src/dialogs/confdialog.cxx:13701 msgid "Adjust the DSP bandwidth" msgstr "Регулировать ширину полосы DSP" #: src/dialogs/confdialog.cxx:13721 msgid "Rx AGC" msgstr "Rx AGC" #: src/dialogs/confdialog.cxx:13722 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "1 - Медленно, 2 - Средне, 3 - Быстро" #: src/dialogs/confdialog.cxx:13741 src/dialogs/confdialog.cxx:13976 #: src/dialogs/confdialog.cxx:13978 #, fuzzy msgid "Modem/FMT" msgstr "Modem" #: src/dialogs/confdialog.cxx:13745 msgid "Audio Stream Procesing" msgstr "" #: src/dialogs/confdialog.cxx:13748 src/dialogs/confdialog.cxx:18717 msgid "Sample rate" msgstr "Частота дискретизации" #: src/dialogs/confdialog.cxx:13749 #, fuzzy msgid "FMT sample rate" msgstr "Частота дискретизации" #: src/dialogs/confdialog.cxx:13764 msgid "Rx Codec PPM" msgstr "" #: src/dialogs/confdialog.cxx:13765 #, fuzzy msgid "Audio Codec ppm correction" msgstr "RX коррекция звуковой карты" #: src/dialogs/confdialog.cxx:13776 msgid "Tracking" msgstr "Отслеживание" #: src/dialogs/confdialog.cxx:13779 msgid "Bgnd" msgstr "" #: src/dialogs/confdialog.cxx:13780 #, fuzzy msgid "Change plot background color" msgstr "Изменение файла макросов" #: src/dialogs/confdialog.cxx:13783 msgid "Unkn" msgstr "" #: src/dialogs/confdialog.cxx:13784 msgid "Change plot unknown track color" msgstr "" #: src/dialogs/confdialog.cxx:13787 msgid "Ref" msgstr "" #: src/dialogs/confdialog.cxx:13788 msgid "Change plot reference track color" msgstr "" #: src/dialogs/confdialog.cxx:13792 #, fuzzy msgid "Change Axis' color" msgstr "Изменить цвет" #: src/dialogs/confdialog.cxx:13795 msgid "Lgnd" msgstr "" #: src/dialogs/confdialog.cxx:13796 #, fuzzy msgid "Change legend color" msgstr "Изменить цвет" #: src/dialogs/confdialog.cxx:13799 msgid "Line/Axis" msgstr "" #: src/dialogs/confdialog.cxx:13800 #, fuzzy msgid "Enable to always plot data over axis" msgstr "Включить, чтобы выбрать диапазон дат" #: src/dialogs/confdialog.cxx:13805 #, fuzzy msgid "Thick lines" msgstr "Нечетные линии" #: src/dialogs/confdialog.cxx:13806 msgid "Enable to plot track lines 3 pixels wide" msgstr "" #: src/dialogs/confdialog.cxx:13811 #, fuzzy msgid "Freq Correction" msgstr "Коррекция" #: src/dialogs/confdialog.cxx:13812 msgid "Offset plot lines on vertical scale" msgstr "" #: src/dialogs/confdialog.cxx:13821 src/dialogs/confdialog.cxx:18829 msgid "@|<" msgstr "" #: src/dialogs/confdialog.cxx:13825 src/dialogs/confdialog.cxx:18843 msgid "@>|" msgstr "" #: src/dialogs/confdialog.cxx:13829 #, fuzzy #| msgid "Error" msgid "Max Error" msgstr "Ошибка" #: src/dialogs/confdialog.cxx:13830 msgid "Limit freq estimate error to this value" msgstr "" #: src/dialogs/confdialog.cxx:13841 msgid "DFT Estimator" msgstr "" #: src/dialogs/confdialog.cxx:13844 #, fuzzy msgid "Data Filter" msgstr "Фильтр" #: src/dialogs/confdialog.cxx:13845 msgid "Moving average - average over NN seconds^0 - no averaging" msgstr "" #: src/dialogs/confdialog.cxx:13854 #, fuzzy msgid "DFT rate" msgstr "TX генерация" #: src/dialogs/confdialog.cxx:13855 #, fuzzy msgid "# DFT computations / second" msgstr "Продолжительность тона (secs)" #: src/dialogs/confdialog.cxx:13872 #, fuzzy msgid "FIR Filter" msgstr "Фильтр" #: src/dialogs/confdialog.cxx:13875 msgid "Width" msgstr "" #: src/dialogs/confdialog.cxx:13876 msgid "Band pass filter / unknown / reference" msgstr "" #: src/dialogs/confdialog.cxx:13886 msgid "bpf Unk'" msgstr "" #: src/dialogs/confdialog.cxx:13887 msgid "ON - band pass filter unknown signal" msgstr "" #: src/dialogs/confdialog.cxx:13892 msgid "bpf Ref'" msgstr "" #: src/dialogs/confdialog.cxx:13893 msgid "ON - band pass filter reference signal" msgstr "" #: src/dialogs/confdialog.cxx:13900 #, fuzzy msgid "CSV Data Recording" msgstr "SOM декодирование" #: src/dialogs/confdialog.cxx:13903 msgid "Auto record" msgstr "" #: src/dialogs/confdialog.cxx:13904 msgid "Automatically start csv data file recording with wav playback" msgstr "" #: src/dialogs/confdialog.cxx:13908 msgid "Record data for NN minutes after auto start" msgstr "" #: src/dialogs/confdialog.cxx:13918 msgid "Wav file recording" msgstr "" #: src/dialogs/confdialog.cxx:13921 #, fuzzy msgid "Record Audio" msgstr "Аудиопорт" #: src/dialogs/confdialog.cxx:13922 msgid "Wav file recording - START IMMEDIATELY" msgstr "" #: src/dialogs/confdialog.cxx:13927 msgid "Sync to data record" msgstr "" #: src/dialogs/confdialog.cxx:13928 msgid "Wav file recording - SYNCHRONIZE with data recording" msgstr "" #: src/dialogs/confdialog.cxx:13933 msgid "File pathname:" msgstr "" #: src/dialogs/confdialog.cxx:13934 msgid "Computer generated file name" msgstr "" #: src/dialogs/confdialog.cxx:13942 msgid "" "Shft-click: select unknown\n" "Ctrl-click: select reference" msgstr "" #: src/dialogs/confdialog.cxx:13946 msgid "Center on Unknown" msgstr "" #: src/dialogs/confdialog.cxx:13947 msgid "Waterfall Centered on unknown signal" msgstr "" #: src/dialogs/confdialog.cxx:13952 #, fuzzy msgid "Center on Reference" msgstr "Центр частота" #: src/dialogs/confdialog.cxx:13953 msgid "Waterfall centered on reference signal" msgstr "" #: src/dialogs/confdialog.cxx:13958 #, fuzzy msgid "Center on median" msgstr "Центральная линия" #: src/dialogs/confdialog.cxx:13959 msgid "Waterfall centered 1/2 way between unknown & reference" msgstr "" #: src/dialogs/confdialog.cxx:13968 #, fuzzy msgid "Use TAB delimiters" msgstr "Разделители слов" #: src/dialogs/confdialog.cxx:13969 msgid "Use tab delimiters between columns on csv export file." msgstr "" #: src/dialogs/confdialog.cxx:13981 src/dialogs/confdialog.cxx:14192 #: src/dialogs/confdialog.cxx:14194 #, fuzzy msgid "Modem/FSQ" msgstr "Modem" #: src/dialogs/confdialog.cxx:13985 msgid "Rx Parameters" msgstr "Rx Параметры" #: src/dialogs/confdialog.cxx:13988 msgid "Min Hits" msgstr "" #: src/dialogs/confdialog.cxx:13989 msgid "Minimum # hits in tone detector" msgstr "" #: src/dialogs/confdialog.cxx:14000 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:14001 msgid "Narrow LPF if image noisy" msgstr "Узкий ФНЧ если изображение шумное" #: src/dialogs/confdialog.cxx:14007 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:14008 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:14020 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:14021 msgid "Remove call after ..." msgstr "Удалить позывной после..." #: src/dialogs/confdialog.cxx:14029 src/dialogs/confdialog.cxx:14201 msgid "Tx Parameters" msgstr "Tx Параметры" #: src/dialogs/confdialog.cxx:14032 #, fuzzy msgid "1.5 baud" msgstr "4.5 baud" #: src/dialogs/confdialog.cxx:14037 msgid "2 baud" msgstr "2 baud" #: src/dialogs/confdialog.cxx:14042 msgid "3 baud" msgstr "3 baud" #: src/dialogs/confdialog.cxx:14047 msgid "4.5 baud" msgstr "4.5 baud" #: src/dialogs/confdialog.cxx:14052 msgid "6 baud" msgstr "6 baud" #: src/dialogs/confdialog.cxx:14057 src/dialogs/confdialog.cxx:15873 msgid "Center freq" msgstr "Центр частота" #: src/dialogs/confdialog.cxx:14063 msgid "Sounder" msgstr "Звуковой" #: src/dialogs/confdialog.cxx:14064 msgid "Send beacon every ..." msgstr "Отправлять маяк каждый ..." #: src/dialogs/confdialog.cxx:14070 msgid "Time out" msgstr "Тайм-аут" #: src/dialogs/confdialog.cxx:14071 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:14081 msgid "QTC:" msgstr "QTC:" #: src/dialogs/confdialog.cxx:14082 msgid "Enter QTC text" msgstr "Ввести QTC текст" #: src/dialogs/confdialog.cxx:14086 #, fuzzy #| msgid "MYCALL always lower case" msgid "MYCALL lower case" msgstr "MYCALL всегда строчными" #: src/dialogs/confdialog.cxx:14087 src/dialogs/confdialog.cxx:14221 msgid "convert operator callsign to lower case" msgstr "Конвертировать позывной в строчные" #: src/dialogs/confdialog.cxx:14092 msgid "QTH:" msgstr "" #: src/dialogs/confdialog.cxx:14093 src/dialogs/confdialog.cxx:17235 msgid "Operators QTH" msgstr "QTH оператора" #: src/dialogs/confdialog.cxx:14109 msgid "Message Logging" msgstr "Регистрация сообщений" #: src/dialogs/confdialog.cxx:14112 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:14113 msgid "Add date/time stamp to each # received message" msgstr "Добавить отметку даты/времени для каждого # полученного сообщения" #: src/dialogs/confdialog.cxx:14119 msgid "always append to file(s)" msgstr "Всегда добавлять в файл(ы)" #: src/dialogs/confdialog.cxx:14120 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:14126 #, fuzzy msgid "Notify time out" msgstr "Пассивное время" #: src/dialogs/confdialog.cxx:14127 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:14142 src/dialogs/confdialog.cxx:14243 msgid "Audit log" msgstr "Аудит лога" #: src/dialogs/confdialog.cxx:14145 src/dialogs/confdialog.cxx:14156 #: src/dialogs/confdialog.cxx:14246 src/dialogs/confdialog.cxx:14257 #: src/dialogs/confdialog.cxx:16335 src/dialogs/confdialog.cxx:18394 #: src/dialogs/confdialog.cxx:18423 src/dialogs/confdialog.cxx:18452 #: src/dialogs/confdialog.cxx:18481 src/dialogs/confdialog.cxx:18508 #: src/dialogs/confdialog.cxx:18634 msgid "Enable" msgstr "Включить" #: src/dialogs/confdialog.cxx:14153 src/dialogs/confdialog.cxx:14254 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:14166 msgid "Text Colors" msgstr "Цвет текста" #: src/dialogs/confdialog.cxx:14170 msgid "Transmit text" msgstr "Передаваемый текст" #: src/dialogs/confdialog.cxx:14175 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:14176 msgid "Directed received text" msgstr "" #: src/dialogs/confdialog.cxx:14181 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:14182 msgid "Undirected received text" msgstr "" #: src/dialogs/confdialog.cxx:14197 src/dialogs/confdialog.cxx:14279 #: src/dialogs/confdialog.cxx:14281 #, fuzzy msgid "Modem/IFKP" msgstr "Modem" #: src/dialogs/confdialog.cxx:14204 msgid "1/2 speed" msgstr "1/2 скорости" #: src/dialogs/confdialog.cxx:14209 msgid "1x speed" msgstr "1x скорость" #: src/dialogs/confdialog.cxx:14210 msgid "default" msgstr "Умолчание" #: src/dialogs/confdialog.cxx:14215 msgid "2x speed" msgstr "2x скрость" #: src/dialogs/confdialog.cxx:14220 msgid "MYCALL always lower case" msgstr "MYCALL всегда строчными" #: src/dialogs/confdialog.cxx:14226 msgid "CALLSIGN always lower case" msgstr "Позывной всегда строчными" #: src/dialogs/confdialog.cxx:14227 msgid "convert other callsign to lower case" msgstr "Конвертировать позывные в строчный" #: src/dialogs/confdialog.cxx:14232 msgid "lock WF at 1500 Hz" msgstr "Фикс. водопад на 1500 Гц" #: src/dialogs/confdialog.cxx:14233 msgid "Always transmit at 1500 Hertz center freq." msgstr "Всегда передавать в центре 1500 Герц" #: src/dialogs/confdialog.cxx:14267 #, fuzzy #| msgid "Operator Call" msgid "" "\n" "Operator avatar" msgstr "Позывной оператора" #: src/dialogs/confdialog.cxx:14284 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14355 #, fuzzy msgid "Modem/MT-63" msgstr "Modem" #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14550 msgid "8-bit extended characters (UTF-8)" msgstr "8-разрядные символы (UTF-8)" #: src/dialogs/confdialog.cxx:14292 msgid "Enable this for UTF-8 characters" msgstr "Включите это для UTF-8 символов" #: src/dialogs/confdialog.cxx:14298 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:14299 msgid "Enable for very weak signals" msgstr "Включить для очень слабых сигналов" #: src/dialogs/confdialog.cxx:14309 msgid "Transmit lower start tone" msgstr "Передать нижний начальный тон" #: src/dialogs/confdialog.cxx:14314 msgid "Transmit upper start tone" msgstr "Передать верхний начальный тон" #: src/dialogs/confdialog.cxx:14320 msgid "Tone Duration (secs)" msgstr "Продолжительность тона (secs)" #: src/dialogs/confdialog.cxx:14336 #, fuzzy msgid "Low tone at 500 Hz" msgstr "Фикс. водопад на 1500 Гц" #: src/dialogs/confdialog.cxx:14341 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:14346 #, fuzzy msgid "Manual tuning" msgstr "Разрешить ручную настройку" #: src/dialogs/confdialog.cxx:14358 src/dialogs/confdialog.cxx:14454 #: src/dialogs/confdialog.cxx:14456 #, fuzzy msgid "Modem/Contestia" msgstr "Контесты" #: src/dialogs/confdialog.cxx:14364 src/dialogs/confdialog.cxx:14465 msgid "Bandwidth" msgstr "Полоса пропускания" #: src/dialogs/confdialog.cxx:14365 src/dialogs/confdialog.cxx:14466 msgid "Select bandwidth" msgstr "Выбрать фильтр" #: src/dialogs/confdialog.cxx:14381 src/dialogs/confdialog.cxx:14482 msgid "Tones" msgstr "Тоны" #: src/dialogs/confdialog.cxx:14382 src/dialogs/confdialog.cxx:14483 msgid "Select number of tones" msgstr "Выбрать номер тона" #: src/dialogs/confdialog.cxx:14398 src/dialogs/confdialog.cxx:14499 msgid "Receive synchronizer" msgstr "Принимать синхронизатор" #: src/dialogs/confdialog.cxx:14401 src/dialogs/confdialog.cxx:14502 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:14402 src/dialogs/confdialog.cxx:14421 #: src/dialogs/confdialog.cxx:14503 src/dialogs/confdialog.cxx:14523 msgid "Change ONLY to experiment" msgstr "Изменять ТОЛЬКО для экспериментов" #: src/dialogs/confdialog.cxx:14420 src/dialogs/confdialog.cxx:14522 msgid "Integration period (FEC blocks)" msgstr "" #: src/dialogs/confdialog.cxx:14441 msgid "8-bit extended characters" msgstr "8-разрядное расширенние символов" #: src/dialogs/confdialog.cxx:14442 msgid "Enable this for Latin-1 accented characters" msgstr "Включите эту опцию для латинских 1-подчеркнутых символов" #: src/dialogs/confdialog.cxx:14446 src/dialogs/confdialog.cxx:14556 msgid "xmt start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:14447 src/dialogs/confdialog.cxx:14557 msgid "Enable this to send start/stop tones" msgstr "Включите эту опцию для отправки старт/стоп тона" #: src/dialogs/confdialog.cxx:14459 src/dialogs/confdialog.cxx:14564 #: src/dialogs/confdialog.cxx:14566 msgid "Modem/Olivia" msgstr "" #: src/dialogs/confdialog.cxx:14542 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:14543 src/dialogs/confdialog.cxx:14551 msgid "Enable this for UTF-8 character transmission" msgstr "Включить эту опцию для передачи UTF-8 символов" #: src/dialogs/confdialog.cxx:14569 src/dialogs/confdialog.cxx:14709 #: src/dialogs/confdialog.cxx:14711 #, fuzzy msgid "Modem/Psk" msgstr "Модуляции" #: src/dialogs/confdialog.cxx:14573 msgid "AFC behavior" msgstr "AFC режим" #: src/dialogs/confdialog.cxx:14576 msgid "Acquisition search range (Hz)" msgstr "Диапазон автоподстройки (Hz)" #: src/dialogs/confdialog.cxx:14577 msgid "Capture signals within this frequency range" msgstr "Захват сигнала в этом диапазоне частот" #: src/dialogs/confdialog.cxx:14596 src/dialogs/confdialog.cxx:20095 msgid "Acquisition S/N (dB)" msgstr "Соотношение S/N (dB)" #: src/dialogs/confdialog.cxx:14597 src/dialogs/confdialog.cxx:20096 msgid "Capture signals over this threshold" msgstr "Захват сигнала по этому порогу" #: src/dialogs/confdialog.cxx:14618 msgid "S/N and IMD behavior" msgstr "S/N and IMD behavior" #: src/dialogs/confdialog.cxx:14621 msgid "after" msgstr "после" #: src/dialogs/confdialog.cxx:14622 msgid "Behavior of s/n imd" msgstr "Behavior of s/n imd" #: src/dialogs/confdialog.cxx:14633 msgid "Dim" msgstr "Dim" #: src/dialogs/confdialog.cxx:14638 msgid "seconds" msgstr "секунд" #: src/dialogs/confdialog.cxx:14639 msgid "Will occur after this time in seconds" msgstr "" #: src/dialogs/confdialog.cxx:14659 msgid "Multi-Channel Signal Processing" msgstr "Многоканальная обработка сигналов" #: src/dialogs/confdialog.cxx:14662 msgid "Multi-channel detector" msgstr "Многоканальный детектор" #: src/dialogs/confdialog.cxx:14667 #, fuzzy #| msgid "Disable on very slow CPUs of if signal browser is not used" msgid "Disable on very slow CPUs or if signal browser is not used" msgstr "" "Отключить на медленных процессорах если браузер сигналов не используется" #: src/dialogs/confdialog.cxx:14672 msgid "8 psk" msgstr "8 psk" #: src/dialogs/confdialog.cxx:14675 msgid "Pilot tone" msgstr "Пилот тон" #: src/dialogs/confdialog.cxx:14676 msgid "Enable encode/decode vestigial pilot tone" msgstr "Включить кодирование/декодирование подавленния пилот-тонов сигнала" #: src/dialogs/confdialog.cxx:14681 msgid "pilot power (dB)" msgstr "Сила пилот-тона (dB)" #: src/dialogs/confdialog.cxx:14682 msgid "Pilot tone power relative to signal" msgstr "Соотношение пилот тона к сигналу" #: src/dialogs/confdialog.cxx:14701 msgid "Short Preamble" msgstr "Короткое вступление" #: src/dialogs/confdialog.cxx:14702 #, fuzzy msgid "Enable short preamble for 8PSK transmission" msgstr "Включить эту опцию для передачи UTF-8 символов" #: src/dialogs/confdialog.cxx:14714 src/dialogs/confdialog.cxx:14852 #: src/dialogs/confdialog.cxx:14854 msgid "Modem/TTY/Rx" msgstr "" #: src/dialogs/confdialog.cxx:14721 msgid "AFC speed" msgstr "AFC скорость" #: src/dialogs/confdialog.cxx:14722 msgid "AFC tracking speed" msgstr "" #: src/dialogs/confdialog.cxx:14738 msgid "RX - unshift on space" msgstr "RX - расстройка" #: src/dialogs/confdialog.cxx:14739 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:14744 msgid "Filter Shape Factor" msgstr "" #: src/dialogs/confdialog.cxx:14745 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ советует 1.275\n" "Ставьте 1.5 и морочте голову." #: src/dialogs/confdialog.cxx:14755 msgid "Decode (CWI suppression)" msgstr "Декодировать (CWI подавляется)" #: src/dialogs/confdialog.cxx:14758 msgid "Mark-Space" msgstr "Маркер" #: src/dialogs/confdialog.cxx:14763 msgid "Mark only" msgstr "Только маркер" #: src/dialogs/confdialog.cxx:14768 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:14775 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:14778 msgid "Use cross hair scope" msgstr "" #: src/dialogs/confdialog.cxx:14779 msgid "Default to cross hair digiscope" msgstr "" #: src/dialogs/confdialog.cxx:14784 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:14785 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:14792 msgid "Log RTTY frequency" msgstr "Регистрировать частоту RTTY" #: src/dialogs/confdialog.cxx:14795 msgid "Use MARK freq'" msgstr "Использовать маркер частоты" #: src/dialogs/confdialog.cxx:14796 src/dialogs/confdialog.cxx:14816 #: src/dialogs/confdialog.cxx:14824 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:14803 msgid "track color" msgstr "Частота трека" #: src/dialogs/confdialog.cxx:14804 msgid "Color of Mark Track" msgstr "Цвет маркера трека" #: src/dialogs/confdialog.cxx:14812 #, fuzzy msgid "RTTY Bell" msgstr "RTTY" #: src/dialogs/confdialog.cxx:14815 msgid "Audible BELL" msgstr "" #: src/dialogs/confdialog.cxx:14823 #, fuzzy msgid "Visible BELL" msgstr "Видимые режимы" #: src/dialogs/confdialog.cxx:14831 msgid "RTTY Bell audio wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 src/dialogs/confdialog.cxx:18385 #: src/dialogs/confdialog.cxx:18414 src/dialogs/confdialog.cxx:18443 #: src/dialogs/confdialog.cxx:18472 src/dialogs/confdialog.cxx:18496 #, fuzzy msgid "Sound:" msgstr "Звуковой" #: src/dialogs/confdialog.cxx:14857 src/dialogs/confdialog.cxx:15028 #: src/dialogs/confdialog.cxx:15030 msgid "Modem/TTY/Tx" msgstr "" #: src/dialogs/confdialog.cxx:14861 #, fuzzy msgid "Sound Card FSK" msgstr "Звуковая карта" #: src/dialogs/confdialog.cxx:14864 src/dialogs/confdialog.cxx:15099 msgid "Carrier shift" msgstr "Сдвиг несущей" #: src/dialogs/confdialog.cxx:14865 msgid "Select carrier shift" msgstr "Выбрать сдвиг несущей" #: src/dialogs/confdialog.cxx:14880 msgid "Custom shift" msgstr "Пользовательский сдвиг" #: src/dialogs/confdialog.cxx:14881 msgid "Input carrier shift" msgstr "Ввести сдвиг несущей" #: src/dialogs/confdialog.cxx:14899 src/dialogs/confdialog.cxx:15399 #: src/dialogs/confdialog.cxx:15553 msgid "Baud rate" msgstr "Скорость передачи данных" #: src/dialogs/confdialog.cxx:14900 msgid "Select carrier baudrate" msgstr "Выбрать скорость передачи данных" #: src/dialogs/confdialog.cxx:14916 msgid "Bits per character" msgstr "Биты на символ" #: src/dialogs/confdialog.cxx:14917 msgid "Select # bits / char" msgstr "" #: src/dialogs/confdialog.cxx:14932 msgid "Parity" msgstr "Паритет" #: src/dialogs/confdialog.cxx:14933 msgid "Select parity" msgstr "Выбрать паритет" #: src/dialogs/confdialog.cxx:14948 src/dialogs/confdialog.cxx:15415 #: src/dialogs/confdialog.cxx:15569 msgid "Stop bits" msgstr "Стоп биты" #: src/dialogs/confdialog.cxx:14949 msgid "Select # stop bits" msgstr "Выбрать # стоп биты" #: src/dialogs/confdialog.cxx:14964 msgid "AutoCRLF" msgstr "" #: src/dialogs/confdialog.cxx:14965 msgid "Add CRLF after page width characters" msgstr "" #: src/dialogs/confdialog.cxx:14970 msgid "chars" msgstr "символы" #: src/dialogs/confdialog.cxx:14971 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:14989 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:14990 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Использовать \"cr cr lf\" для \"cr lf\"" #: src/dialogs/confdialog.cxx:14996 msgid "TX - unshift on space" msgstr "TX - расстройка" #: src/dialogs/confdialog.cxx:14997 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:15002 msgid "Shaped Tx" msgstr "Формы Tx" #: src/dialogs/confdialog.cxx:15003 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:15009 msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK - правый канал" #: src/dialogs/confdialog.cxx:15010 msgid "Create keyed square wave on right audio channel" msgstr "Создать ключевой меандр на правом аудиоканале" #: src/dialogs/confdialog.cxx:15015 #, fuzzy msgid "LTRS at start" msgstr "Сброс" #: src/dialogs/confdialog.cxx:15016 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:15033 src/dialogs/confdialog.cxx:15135 #: src/dialogs/confdialog.cxx:15137 #, fuzzy msgid "Modem/TTY/FSK" msgstr "Modem" #: src/dialogs/confdialog.cxx:15037 #, fuzzy #| msgid "DTR is PTT signal line" msgid "DTR/RTS signal line FSK" msgstr "DTR это PTT сигнальная линия" #: src/dialogs/confdialog.cxx:15040 src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Включено" #: src/dialogs/confdialog.cxx:15041 #, fuzzy msgid "Enable FSK on serial port" msgstr "Использовать отдельный порт PTT" #: src/dialogs/confdialog.cxx:15047 msgid "Shares RIGIO serial port, or uses" msgstr "" #: src/dialogs/confdialog.cxx:15048 #, fuzzy msgid "Share the RIGIO port" msgstr "Использовать отдельный порт PTT" #: src/dialogs/confdialog.cxx:15054 #, fuzzy msgid "Serial Port" msgstr "Порт" #: src/dialogs/confdialog.cxx:15055 #, fuzzy msgid "FSK independent serial port" msgstr "Использовать отдельный порт PTT" #: src/dialogs/confdialog.cxx:15069 msgid "MARK/SPACE reversed" msgstr "" #: src/dialogs/confdialog.cxx:15070 #, fuzzy #| msgid "Mark-Space" msgid "Reverse Mark/Space" msgstr "Маркер" #: src/dialogs/confdialog.cxx:15076 src/dialogs/confdialog.cxx:18252 msgid "Use DTR" msgstr "Вкл. DTR" #: src/dialogs/confdialog.cxx:15077 msgid "Enable DTR signal line, default is RTS" msgstr "" #: src/dialogs/confdialog.cxx:15084 msgid "" "Restart the FSK interface\n" "Necessary if changes made to configuration" msgstr "" #: src/dialogs/confdialog.cxx:15088 #, fuzzy msgid "Mark" msgstr "Только маркер" #: src/dialogs/confdialog.cxx:15089 #, fuzzy msgid "Mark frequency in Hertz" msgstr "Частота в MHz" #: src/dialogs/confdialog.cxx:15100 #, fuzzy msgid "Carrier shift in Hertz" msgstr "Сдвиг несущей" #: src/dialogs/confdialog.cxx:15115 #, fuzzy #| msgid "Stop bits" msgid "1.5 stop bits" msgstr "Стоп биты" #: src/dialogs/confdialog.cxx:15116 msgid "" "Enabled - 1.5 stop bits\n" "Disabled - 2 stop bits" msgstr "" #: src/dialogs/confdialog.cxx:15126 msgid "Use flrig FSK keying" msgstr "" #: src/dialogs/confdialog.cxx:15127 msgid "Enable to use flrig FSK keyer" msgstr "" #: src/dialogs/confdialog.cxx:15140 src/dialogs/confdialog.cxx:15252 #: src/dialogs/confdialog.cxx:15254 msgid "Modem/TTY/nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:15163 #, fuzzy msgid "Serial Baud" msgstr "Переданный сер. номер" #: src/dialogs/confdialog.cxx:15178 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:15199 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:15200 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:15205 #, fuzzy msgid "TTY Baud" msgstr "Скорость передачи данных" #: src/dialogs/confdialog.cxx:15206 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:15222 msgid "Debug Output" msgstr "" #: src/dialogs/confdialog.cxx:15232 #, fuzzy msgid "Clear Sent" msgstr "Очистить текст" #: src/dialogs/confdialog.cxx:15235 #, fuzzy msgid "Clear Both" msgstr "Очистить текст" #: src/dialogs/confdialog.cxx:15238 #, fuzzy msgid "Clear Rcvd" msgstr "Очистить" #: src/dialogs/confdialog.cxx:15247 msgid "TTY i/o" msgstr "" #: src/dialogs/confdialog.cxx:15248 msgid "Enable TTY operation" msgstr "" #: src/dialogs/confdialog.cxx:15257 src/dialogs/confdialog.cxx:15485 #: src/dialogs/confdialog.cxx:15487 msgid "Modem/TTY/Navigator" msgstr "" #: src/dialogs/confdialog.cxx:15261 #, fuzzy msgid "FSK Interface" msgstr "Интерфейс" #: src/dialogs/confdialog.cxx:15265 #, fuzzy msgid "Navigator serial port" msgstr "Использовать отдельный порт PTT" #: src/dialogs/confdialog.cxx:15279 #, fuzzy msgid "FSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:15280 msgid "Connect / Disconnect from Nav FSK port" msgstr "" #: src/dialogs/confdialog.cxx:15285 src/dialogs/confdialog.cxx:15550 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:15289 #, fuzzy msgid "Navigator configuration port" msgstr "Конфигурация Fldigi" #: src/dialogs/confdialog.cxx:15303 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Номер канала" #: src/dialogs/confdialog.cxx:15304 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15319 #, fuzzy msgid "Channel 2 attenuator" msgstr "Номер канала" #: src/dialogs/confdialog.cxx:15320 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15335 #, fuzzy msgid "RF attenuator" msgstr "PSM Аттенюатор" #: src/dialogs/confdialog.cxx:15336 #, fuzzy msgid "NavRF Attenuator" msgstr "PSM Аттенюатор" #: src/dialogs/confdialog.cxx:15351 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:15352 src/dialogs/confdialog.cxx:15586 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:15367 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:15368 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:15383 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:15384 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:15400 src/dialogs/confdialog.cxx:15554 #, fuzzy msgid "Nav FSK baud rate" msgstr "Скорость передачи данных" #: src/dialogs/confdialog.cxx:15416 src/dialogs/confdialog.cxx:15570 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Стоп биты" #: src/dialogs/confdialog.cxx:15431 src/dialogs/confdialog.cxx:15601 #, fuzzy msgid "Mark Polarity" msgstr "Только маркер" #: src/dialogs/confdialog.cxx:15432 src/dialogs/confdialog.cxx:15602 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:15447 #, fuzzy msgid "Side tone" msgstr "Пилот тон" #: src/dialogs/confdialog.cxx:15448 src/dialogs/confdialog.cxx:15618 #: src/dialogs/confdialog.cxx:15634 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:15463 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:15464 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:15479 #, fuzzy msgid "Config" msgstr "Подтвердить" #: src/dialogs/confdialog.cxx:15480 msgid "Connect / Disconnect from Nav Config port" msgstr "" #: src/dialogs/confdialog.cxx:15490 src/dialogs/confdialog.cxx:15516 #: src/dialogs/confdialog.cxx:15518 msgid "Modem/TTY/Synop" msgstr "" #: src/dialogs/confdialog.cxx:15494 msgid "SYNOP to ADIF" msgstr "SYNOP в ADIF" #: src/dialogs/confdialog.cxx:15495 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "Декодировать SYNOP (Ex: Deutsche Wetterdienst) в ADIF лог файл" #: src/dialogs/confdialog.cxx:15501 msgid "SYNOP to KML" msgstr "SYNOP в KML" #: src/dialogs/confdialog.cxx:15502 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Декодировать SYNOP (Ex: Deutsche Wetterdienst) в KML (Ex: Google Earth)" #: src/dialogs/confdialog.cxx:15509 msgid "Interleave SYNOP and text" msgstr "Чередование SYNOP и текст" #: src/dialogs/confdialog.cxx:15510 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:15521 src/dialogs/confdialog.cxx:15715 #: src/dialogs/confdialog.cxx:15717 msgid "Modem/TTY/Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:15525 #, fuzzy msgid "Serial Interface" msgstr "Интерфейс" #: src/dialogs/confdialog.cxx:15585 #, fuzzy msgid "FSK port" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:15633 msgid "Auto CRLF" msgstr "" #: src/dialogs/confdialog.cxx:15649 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:15650 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:15665 #, fuzzy msgid "Diddle char" msgstr "Тестовый символ" #: src/dialogs/confdialog.cxx:15666 #, fuzzy msgid "Diddle character" msgstr "Биты на символ" #: src/dialogs/confdialog.cxx:15681 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:15682 src/dialogs/confdialog.cxx:15698 #, fuzzy msgid "Unshift on space" msgstr "RX - расстройка" #: src/dialogs/confdialog.cxx:15697 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:15720 src/dialogs/confdialog.cxx:15833 #: src/dialogs/confdialog.cxx:15835 #, fuzzy msgid "Modem/Thor" msgstr "Modem" #: src/dialogs/confdialog.cxx:15740 msgid "Enable DSP prior to decoder" msgstr "Включение DSP перед декодером" #: src/dialogs/confdialog.cxx:15782 msgid "Preamble Detection" msgstr "Детектировать вступление" #: src/dialogs/confdialog.cxx:15783 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:15788 msgid "Soft-symbol decoding" msgstr "Декодировать програмные символы" #: src/dialogs/confdialog.cxx:15789 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:15794 msgid "Soft-bit decoding" msgstr "Декодировать програмные биты" #: src/dialogs/confdialog.cxx:15795 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "Использовать алгоритм Витерби для лучшей коррекции ошибок\n" "Лучше всего работает с декодированием поддерживаемых символов." #: src/dialogs/confdialog.cxx:15821 #, fuzzy #| msgid "Operator Call" msgid "" "\n" "Operator Avatar" msgstr "Позывной оператора" #: src/dialogs/confdialog.cxx:15838 src/dialogs/confdialog.cxx:15853 #: src/dialogs/confdialog.cxx:15855 msgid "Modem/Navtex" msgstr "" #: src/dialogs/confdialog.cxx:15842 msgid "Log Navtex messages to Adif file" msgstr "Регистрировать Navtex в Adif файл" #: src/dialogs/confdialog.cxx:15847 msgid "Log Navtex messages to KML" msgstr "Регистрировать Navtex в KML" #: src/dialogs/confdialog.cxx:15848 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:15858 src/dialogs/confdialog.cxx:15979 #: src/dialogs/confdialog.cxx:15981 #, fuzzy msgid "Modem/Wefax" msgstr "Modem" #: src/dialogs/confdialog.cxx:15862 #, fuzzy msgid "Frequency shift" msgstr "Сдвиг частоты (800 Hz)" #: src/dialogs/confdialog.cxx:15863 #, fuzzy msgid "" "Frequency shift of WEFAX signal\n" "Nominal 800 Hz" msgstr "Сдвиг частоты (800 Hz)" #: src/dialogs/confdialog.cxx:15874 msgid "" "Center of WEFAX signal\n" "Nominal 1900 Hz" msgstr "" #: src/dialogs/confdialog.cxx:15884 msgid "Max Image Rows" msgstr "" #: src/dialogs/confdialog.cxx:15885 msgid "Force save split image" msgstr "" #: src/dialogs/confdialog.cxx:15895 msgid "Fax images destination directory" msgstr "Папка назначения изображений факса" #: src/dialogs/confdialog.cxx:15896 #, fuzzy msgid "Store images in this directory" msgstr "Папка назначения изображений факса" #: src/dialogs/confdialog.cxx:15901 msgid "Directory..." msgstr "Папка..." #: src/dialogs/confdialog.cxx:15902 #, fuzzy msgid "Select destination directory" msgstr "Папка назначения изображений факса" #: src/dialogs/confdialog.cxx:15905 msgid "Log Wefax messages to Adif file" msgstr "Регистрировать Wefax в Adif файл" #: src/dialogs/confdialog.cxx:15906 msgid "Sent and received faxes are logged to Adif file." msgstr "Отправленные и полученные факсы записатья в ADIF." #: src/dialogs/confdialog.cxx:15911 src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Фильтр" #: src/dialogs/confdialog.cxx:15917 #, fuzzy msgid "Enable Auto-align after" msgstr "Вкл/выкл подсказки" #: src/dialogs/confdialog.cxx:15927 msgid "Stop Auto-align after" msgstr "" #: src/dialogs/confdialog.cxx:15937 msgid "Auto-align every" msgstr "" #: src/dialogs/confdialog.cxx:15947 src/dialogs/confdialog.cxx:15950 #: src/dialogs/confdialog.cxx:15953 #, fuzzy msgid "rows" msgstr "Браузер" #: src/dialogs/confdialog.cxx:15956 #, fuzzy msgid "Correlation" msgstr "Коррекция" #: src/dialogs/confdialog.cxx:15957 msgid "" "Row-to-row correlation\n" "Used to detect presence of WEFAX signal\n" "Lower: more false detections" msgstr "" #: src/dialogs/confdialog.cxx:15968 #, fuzzy msgid "# Correlation rows" msgstr "Коррекция" #: src/dialogs/confdialog.cxx:15969 msgid "Compute correlation factor over this # rows" msgstr "" #: src/dialogs/confdialog.cxx:15984 src/dialogs/confdialog.cxx:16185 #: src/dialogs/confdialog.cxx:16187 #, fuzzy msgid "Misc/Autostart" msgstr "Автостарт" #: src/dialogs/confdialog.cxx:15988 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:15989 msgid "Enter full path-filename for flrig" msgstr "Ввести полный путь для файла flrig" #: src/dialogs/confdialog.cxx:16003 msgid "Locate flrig executable" msgstr "Путь к flrig" #: src/dialogs/confdialog.cxx:16006 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16007 msgid "Enter full path-filename for flamp" msgstr "Ввести полный путь для файла flamp" #: src/dialogs/confdialog.cxx:16021 msgid "Locate flamp executable" msgstr "Путь к flamp" #: src/dialogs/confdialog.cxx:16024 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16025 msgid "Enter full path-filename for flnet" msgstr "Ввести полный путь для файла flnet" #: src/dialogs/confdialog.cxx:16039 msgid "Locate flnet executable" msgstr "Путь к flnet" #: src/dialogs/confdialog.cxx:16042 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16043 msgid "Enter full path-filename for fllog" msgstr "Ввести полный путь для файла fllog" #: src/dialogs/confdialog.cxx:16057 msgid "Locate fllog executable" msgstr "Путь к fllog" #: src/dialogs/confdialog.cxx:16060 msgid "Prog 1:" msgstr "Прог 1:" #: src/dialogs/confdialog.cxx:16061 src/dialogs/confdialog.cxx:16079 #: src/dialogs/confdialog.cxx:16097 msgid "Enter full path-filename for external program" msgstr "Ввести полный путь для файла других программ" #: src/dialogs/confdialog.cxx:16075 msgid "Locate program #1 executable" msgstr "Путь к программе #1" #: src/dialogs/confdialog.cxx:16078 msgid "Prog 2:" msgstr "Прог 2:" #: src/dialogs/confdialog.cxx:16093 msgid "Locate program #2 executable" msgstr "Путь к программе #2" #: src/dialogs/confdialog.cxx:16096 msgid "Prog 3:" msgstr "Прог 3:" #: src/dialogs/confdialog.cxx:16111 msgid "Locate program #3 executable" msgstr "Путь к программе #3" #: src/dialogs/confdialog.cxx:16114 msgid "" "Enable\n" "-" msgstr "" "Включить\n" "-" #: src/dialogs/confdialog.cxx:16115 src/dialogs/confdialog.cxx:16122 #: src/dialogs/confdialog.cxx:16128 src/dialogs/confdialog.cxx:16134 #: src/dialogs/confdialog.cxx:16140 src/dialogs/confdialog.cxx:16146 #: src/dialogs/confdialog.cxx:16152 msgid "Enable this entry when fldigi first starts" msgstr "Включите это при первом запуске fldigi" #: src/dialogs/confdialog.cxx:16158 msgid "Start flrig" msgstr "Старт flrig" #: src/dialogs/confdialog.cxx:16162 msgid "Start flamp" msgstr "Старт flamp" #: src/dialogs/confdialog.cxx:16166 msgid "Start flnet" msgstr "Старт flnet" #: src/dialogs/confdialog.cxx:16170 msgid "Start fllog" msgstr "Старт fllog" #: src/dialogs/confdialog.cxx:16174 msgid "Start prog1" msgstr "Старт prog1" #: src/dialogs/confdialog.cxx:16178 msgid "Start prog2" msgstr "Старт prog2" #: src/dialogs/confdialog.cxx:16182 msgid "Start prog3" msgstr "Старт prog3" #: src/dialogs/confdialog.cxx:16190 src/dialogs/confdialog.cxx:16200 #: src/dialogs/confdialog.cxx:16202 #, fuzzy msgid "Misc/CPU" msgstr "Разное" #: src/dialogs/confdialog.cxx:16194 msgid "Slow CPU (less than 700MHz)" msgstr "Медленный процессор (менее 700 МГц)" #: src/dialogs/confdialog.cxx:16195 msgid "Enable if you're computer does not decode properly" msgstr "Включить, если ваш компьютер не правильно декодирует" #: src/dialogs/confdialog.cxx:16205 src/dialogs/confdialog.cxx:16215 #: src/dialogs/confdialog.cxx:16217 #, fuzzy msgid "Misc/DTMF" msgstr "DTMF" #: src/dialogs/confdialog.cxx:16209 msgid "Decode DTMF tones" msgstr "Декодировать DTMF тоны" #: src/dialogs/confdialog.cxx:16210 msgid "Decode received DTMF tones" msgstr "Декодировать принятые DTMF тоны" #: src/dialogs/confdialog.cxx:16220 src/dialogs/confdialog.cxx:16323 #: src/dialogs/confdialog.cxx:16325 #, fuzzy msgid "Misc/KML" msgstr "Разное" #: src/dialogs/confdialog.cxx:16224 msgid "KML files directory" msgstr "Каталог файлов KML" #: src/dialogs/confdialog.cxx:16225 msgid "Where generated KML documents are stored." msgstr "Где сохраняются документы, сформированные в формате KML." #: src/dialogs/confdialog.cxx:16230 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:16234 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:16235 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:16245 msgid "Data retention time, in hours (0 for no limit)" msgstr "Сохранение времени в часах (0 без ограничения)" #: src/dialogs/confdialog.cxx:16246 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" "Количество часов данных хранится на каждом узле. Ноль означает, что хранится " "все." #: src/dialogs/confdialog.cxx:16255 msgid "KML refresh interval (seconds)" msgstr "Интервал обновления KML (в секундах)" #: src/dialogs/confdialog.cxx:16256 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Обновить время записи в KML-файл (в секундах)" #: src/dialogs/confdialog.cxx:16272 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:16273 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:16288 msgid "Command run on KML creation" msgstr "" #: src/dialogs/confdialog.cxx:16289 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "Команды стартуют при генерации kml файлов. Подпроцессы запустить один раз, и " "перезапустить в случае необходимости." #: src/dialogs/confdialog.cxx:16295 msgid "Test command" msgstr "" #: src/dialogs/confdialog.cxx:16296 msgid "Execute command on KML files." msgstr "Выполнить команду KML файлов." #: src/dialogs/confdialog.cxx:16299 msgid "Change dir..." msgstr "Изменить папку" #: src/dialogs/confdialog.cxx:16300 msgid "Choose directory to store KML documents" msgstr "Выбрать папку, и сохранить документы KML" #: src/dialogs/confdialog.cxx:16303 msgid "Cleanup KML data now !" msgstr "Очистить данные KML сейчас!" #: src/dialogs/confdialog.cxx:16304 msgid "Cleanups KML documents, empties Google Earth display." msgstr "Очичтить KML док. Выгрузить Google Earth дисплей." #: src/dialogs/confdialog.cxx:16307 msgid "Cleanup on startup" msgstr "Очистка при запуске" #: src/dialogs/confdialog.cxx:16308 msgid "Empties KML documents when starting program." msgstr "Выгрузить KML документы при запуске." #: src/dialogs/confdialog.cxx:16315 msgid "KML server enabled (On / Off)" msgstr "Сервер KML включен (вкл/выкл)" #: src/dialogs/confdialog.cxx:16316 msgid "Uncheck if KML is never used" msgstr "Откл если KML не используется" #: src/dialogs/confdialog.cxx:16328 src/dialogs/confdialog.cxx:16410 #: src/dialogs/confdialog.cxx:16412 #, fuzzy msgid "Misc/NBEMS interface" msgstr "NBEMS" #: src/dialogs/confdialog.cxx:16332 msgid "NBEMS data file interface" msgstr "" #: src/dialogs/confdialog.cxx:16336 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Извлечь файл для работы с внешней программой \"wrap / flmsg\"" #: src/dialogs/confdialog.cxx:16341 msgid "Open message folder" msgstr "Открыть папку сообщений" #: src/dialogs/confdialog.cxx:16342 msgid "Opens NBEMS file folder upon successful capture" msgstr "После успешного захвата открыть папку NBEMS" #: src/dialogs/confdialog.cxx:16349 msgid "Reception of flmsg files" msgstr "Прием flmsg файлов" #: src/dialogs/confdialog.cxx:16352 msgid "Open with flmsg" msgstr "Открыть с помощью flmsg" #: src/dialogs/confdialog.cxx:16353 msgid "Open message with flmsg" msgstr "Открыть сообщение с помощью flmsg" #: src/dialogs/confdialog.cxx:16358 msgid "Open in browser" msgstr "Открыть в браузере" #: src/dialogs/confdialog.cxx:16359 msgid "Open file with default browser" msgstr "Открыть файл в браузере по умолчанию" #: src/dialogs/confdialog.cxx:16364 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:16365 msgid "Enter full path-filename for flmsg" msgstr "Введите полный путь-имя файла для flmsg" #: src/dialogs/confdialog.cxx:16378 msgid "Locate flmsg" msgstr "Путь к flmsg" #: src/dialogs/confdialog.cxx:16382 msgid "Timeout (secs)" msgstr "" #: src/dialogs/confdialog.cxx:16383 msgid "Extract times out after NN seconds of inactivity." msgstr "Извлечь через NN секунд неактивности." #: src/dialogs/confdialog.cxx:16396 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:16400 msgid "Transfer direct to executing flmsg" msgstr "Перевод прямо на flmsg" #: src/dialogs/confdialog.cxx:16401 msgid "Send data stream directly to executing flmsg" msgstr "Отправить поток данных непосредственно на выполнение flmsg" #: src/dialogs/confdialog.cxx:16415 src/dialogs/confdialog.cxx:16493 #: src/dialogs/confdialog.cxx:16495 #, fuzzy msgid "Misc/PSK reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:16419 msgid "Automatically spot callsigns in decoded text" msgstr "Автоматический спотинг при декодировании позывных" #: src/dialogs/confdialog.cxx:16420 msgid "Parse all incoming text" msgstr "Анализировать весь входящий текст" #: src/dialogs/confdialog.cxx:16425 msgid "Send reception report when logging a QSO" msgstr "Отправить отчет о приеме при регистрации QSO" #: src/dialogs/confdialog.cxx:16426 msgid "Send report only when QSO is logged" msgstr "Отправить отчет только тогда, когда QSO регистрируется" #: src/dialogs/confdialog.cxx:16431 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "Частота в рапорт (только при настроенном RIG контроле)" #: src/dialogs/confdialog.cxx:16432 msgid "Include the transmit frequency" msgstr "Включить частоту передачи" #: src/dialogs/confdialog.cxx:16437 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Откл спотинг, когда сигнал(ы) в браузере не видны." #: src/dialogs/confdialog.cxx:16438 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" "Проверьте, чтобы уменьшить нагрузку на центральный процессор в режимах PSK и " "RTTY." #: src/dialogs/confdialog.cxx:16444 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:16445 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:16455 msgid "Host:" msgstr "Хостинг:" #: src/dialogs/confdialog.cxx:16456 msgid "To whom the connection is made" msgstr "К кому подключаемся" #: src/dialogs/confdialog.cxx:16470 msgid "Port:" msgstr "Порт:" #: src/dialogs/confdialog.cxx:16471 msgid "Using UDP port #" msgstr "Вкл UDP порт" #: src/dialogs/confdialog.cxx:16486 msgid "Initialize the socket client" msgstr "" #: src/dialogs/confdialog.cxx:16489 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:16498 src/dialogs/confdialog.cxx:16668 #: src/dialogs/confdialog.cxx:16670 #, fuzzy msgid "Misc/PSM" msgstr "Разное" #: src/dialogs/confdialog.cxx:16505 #, fuzzy msgid "Allow TX After Signal Detection (Secs)" msgstr "Разрешить ТХ после обнаружения сигнала (секунд)" #: src/dialogs/confdialog.cxx:16506 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "Разрешить ТХ после N секунд после обнаружения сигнала" #: src/dialogs/confdialog.cxx:16516 msgid "Enable Busy Channel" msgstr "Вкл канал Занято" #: src/dialogs/confdialog.cxx:16517 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16523 #, fuzzy msgid "TX Buffer Flush Timer (Mins, 0=Disable)" msgstr "таймер сброса буфера TX (Минут, 0=Выкл)" #: src/dialogs/confdialog.cxx:16524 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" "Сбрасывает буфер TX после периода x, когда канал Занято остается включенным" #: src/dialogs/confdialog.cxx:16535 msgid "Modem Bandwidth Margins " msgstr "отступы от полосы пропускания модема " #: src/dialogs/confdialog.cxx:16536 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "Мониторить сигналы в полосе пропускания плюс отступы" #: src/dialogs/confdialog.cxx:16546 #, fuzzy msgid "Valid Signal Sample Period (msecs)" msgstr "Период выборки сигнала в миллисекундах" #: src/dialogs/confdialog.cxx:16547 msgid "Valid signal sample period in Milliseconds" msgstr "Период выборки сигнала в миллисекундах" #: src/dialogs/confdialog.cxx:16562 msgid "Enable CSMA" msgstr "Включить CSMA" #: src/dialogs/confdialog.cxx:16563 msgid "Carrier Sense Mulitiple Access" msgstr "Многократный доступ" #: src/dialogs/confdialog.cxx:16568 msgid "Persistance" msgstr "Настойчивость" #: src/dialogs/confdialog.cxx:16569 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16579 msgid "Slot Time" msgstr "" #: src/dialogs/confdialog.cxx:16580 msgid "Non transmit window after a transmit period" msgstr "Окно запрета повторной передачи" #: src/dialogs/confdialog.cxx:16590 msgid "Transmit Data Delay" msgstr "Задержка передачи данных" #: src/dialogs/confdialog.cxx:16591 msgid "Idle transmit before data sent" msgstr "Задержка передачи данных перед отправкой" #: src/dialogs/confdialog.cxx:16601 src/dialogs/confdialog.cxx:16605 msgid "MilliSeconds" msgstr "миллисекунды" #: src/dialogs/confdialog.cxx:16602 src/dialogs/confdialog.cxx:16610 msgid "Displays the Slot Time in Milliseconds" msgstr "Отображение времени в миллисекундах" #: src/dialogs/confdialog.cxx:16606 msgid "Displays the Transmit Delay in Milliseconds" msgstr "Отображать задержку передачи в миллисекундах" #: src/dialogs/confdialog.cxx:16609 msgid "Percent (%)" msgstr "Процент (%)" #: src/dialogs/confdialog.cxx:16618 msgid "Enable Histogram" msgstr "Включить гистограмму" #: src/dialogs/confdialog.cxx:16619 msgid "Enable Histogram threshold signal monitoring" msgstr "Включить мониторинг сигнала порога Гистограмма" #: src/dialogs/confdialog.cxx:16624 msgid "PSM Histogram Threshold" msgstr "Порог Гистограммы PSM" #: src/dialogs/confdialog.cxx:16625 msgid "Sets the theshold level to x value above the noise level" msgstr "Устанавить пороговый уровень для значения х выше уровня шума" #: src/dialogs/confdialog.cxx:16640 msgid "PSM Attenuate" msgstr "PSM Аттенюатор" #: src/dialogs/confdialog.cxx:16641 msgid "Adjust sensitivity by 1/N fractional values." msgstr "дробные значения 1 / N регулировки чувствительности" #: src/dialogs/confdialog.cxx:16657 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "Показать и включить кнопку питания монитора (PSM)" #: src/dialogs/confdialog.cxx:16658 msgid "display PSM button on main dialog" msgstr "Отображать PSM в главном диалоге" #: src/dialogs/confdialog.cxx:16665 msgid "Default Settings" msgstr "По умолчанию" #: src/dialogs/confdialog.cxx:16673 src/dialogs/confdialog.cxx:16705 #: src/dialogs/confdialog.cxx:16707 #, fuzzy msgid "Misc/Rx text capture" msgstr "Захват текста" #: src/dialogs/confdialog.cxx:16677 msgid "Talker Socket (MS only)" msgstr "" #: src/dialogs/confdialog.cxx:16680 msgid "Talker" msgstr "" #: src/dialogs/confdialog.cxx:16684 msgid "Connect/disconnect to Talker socket server" msgstr "" #: src/dialogs/confdialog.cxx:16687 msgid "Auto connect when fldigi opens (server must be up)" msgstr "Авто соединение, при отрытии fldigi" #: src/dialogs/confdialog.cxx:16694 msgid "Capture rx text to external file" msgstr "Захват RX текста во внешний файл" #: src/dialogs/confdialog.cxx:16697 msgid "Enable rx text stream" msgstr "Вкл текстовый поток rx" #: src/dialogs/confdialog.cxx:16698 msgid "Send rx text to file: textout.txt" msgstr "Передать rx текст в файл: textout.txt" #: src/dialogs/confdialog.cxx:16710 src/dialogs/confdialog.cxx:16748 #: src/dialogs/confdialog.cxx:16750 #, fuzzy #| msgid "Rx Parameters" msgid "Misc/Save Parameters" msgstr "Rx Параметры" #: src/dialogs/confdialog.cxx:16714 #, fuzzy #| msgid "Transmit font" msgid "Transmit level control" msgstr "Передаваемый шрифт" #: src/dialogs/confdialog.cxx:16715 msgid "Save transmit level control by mode" msgstr "" #: src/dialogs/confdialog.cxx:16721 msgid "Squelch level/activated control(s)" msgstr "" #: src/dialogs/confdialog.cxx:16722 msgid "Save Squelch level and state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16728 msgid "Enable specific parameter to Save & Restore on a per mode/band basis." msgstr "" #: src/dialogs/confdialog.cxx:16734 #, fuzzy #| msgid "ARQ control" msgid "AFC control" msgstr "ARQ control" #: src/dialogs/confdialog.cxx:16735 msgid "Save AFC state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16741 #, fuzzy #| msgid "Reverse video" msgid "Reverse (Rv) control" msgstr "Реверс видео" #: src/dialogs/confdialog.cxx:16742 msgid "Save Reverse state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16753 src/dialogs/confdialog.cxx:16837 #: src/dialogs/confdialog.cxx:16839 msgid "Misc/Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:16760 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:16761 msgid "Default CW tracking point" msgstr "" #: src/dialogs/confdialog.cxx:16779 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:16780 msgid "Default RTTY tracking point" msgstr "" #: src/dialogs/confdialog.cxx:16798 msgid "PSK et al." msgstr "" #: src/dialogs/confdialog.cxx:16799 msgid "Default for all other modems" msgstr "По умолчанию для всех остальных модемов" #: src/dialogs/confdialog.cxx:16817 msgid "Always start new modems at these frequencies" msgstr "Всегда включать новые режимы на этих аудио частотах" #: src/dialogs/confdialog.cxx:16818 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - старт по умолчанию\n" "OFF - keep current wf cursor position" #: src/dialogs/confdialog.cxx:16826 msgid "K3 A1A configuation" msgstr "K3 A1A конфигурация" #: src/dialogs/confdialog.cxx:16829 msgid "CW is LSB" msgstr "CW в LSB" #: src/dialogs/confdialog.cxx:16830 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Выберите для Elecraft К3\n" "Другие радиостанции в этом не нуждаются." #: src/dialogs/confdialog.cxx:16842 src/dialogs/confdialog.cxx:17166 #: src/dialogs/confdialog.cxx:17168 msgid "Misc/TCP-IP sessions" msgstr "" #: src/dialogs/confdialog.cxx:16850 msgid "Lock" msgstr "Блок" #: src/dialogs/confdialog.cxx:16851 msgid "Allow/Disallow Changes" msgstr "Разрешить/Запретить изменения" #: src/dialogs/confdialog.cxx:16856 msgid "Enable ARQ" msgstr "Включить ARQ" #: src/dialogs/confdialog.cxx:16857 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "Использовать для PSKmail и набора программ FLDIGI" #: src/dialogs/confdialog.cxx:16864 msgid "Enable KISS" msgstr "Включить KISS" #: src/dialogs/confdialog.cxx:16865 msgid "Used for BPQ32" msgstr "Использовать для BPQ32" #: src/dialogs/confdialog.cxx:16872 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" "Включить ARQ для программ, поддерживающих TCP и FLDIGI протокол ARQ .\n" "Включить KISS для программ, поддерживающих TCP/UDP и TNC-2 KISS протоколы.\n" "Может быть активным в любой момент времени только один интерфейс передачи " "данных.\n" "Изменения в настройках KISS/ARQ/XML требуют перезапуска программы." #: src/dialogs/confdialog.cxx:16879 msgid "KISS" msgstr "KISS" #: src/dialogs/confdialog.cxx:16882 src/dialogs/confdialog.cxx:16999 #: src/dialogs/confdialog.cxx:17051 src/dialogs/confdialog.cxx:17098 #: src/dialogs/confdialog.cxx:17140 src/dialogs/confdialog.cxx:17352 msgid "Addr" msgstr "Addr" #: src/dialogs/confdialog.cxx:16883 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP адрес для KISS интерфейса\n" "IP адрес в формате: nnn.nnn.nnn.nnn\n" "или имя: i.e. localhost" #: src/dialogs/confdialog.cxx:16899 msgid "I/O" msgstr "I/O" #: src/dialogs/confdialog.cxx:16900 src/dialogs/confdialog.cxx:17017 #: src/dialogs/confdialog.cxx:17069 src/dialogs/confdialog.cxx:17116 #: src/dialogs/confdialog.cxx:17149 src/dialogs/confdialog.cxx:17369 msgid "IP Address Port Number" msgstr "IP номер порта" #: src/dialogs/confdialog.cxx:16916 msgid "Output port number when same IP address used" msgstr "Исходящий порт, когда IP адрес использован" #: src/dialogs/confdialog.cxx:16931 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16932 msgid "Enable when both programs are using the same IP address" msgstr "Включить, когда обе программы используют один и тот же IP-адрес" #: src/dialogs/confdialog.cxx:16938 src/dialogs/confdialog.cxx:17037 #: src/dialogs/confdialog.cxx:17084 msgid "Restart" msgstr "Сброс" #: src/dialogs/confdialog.cxx:16942 msgid "Start" msgstr "Старт" #: src/dialogs/confdialog.cxx:16943 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16952 msgid "TCP/IP" msgstr "TCP/IP" #: src/dialogs/confdialog.cxx:16953 msgid "Check to enable TCP/IP IO Connection" msgstr "Галка, чтобы включить TCP / IP IO соединение" #: src/dialogs/confdialog.cxx:16959 msgid "UDP/IP" msgstr "UDP/IP" #: src/dialogs/confdialog.cxx:16960 msgid "Check to enable UDP/IP IO" msgstr "Галка что бы включить UDP/IP IO" #: src/dialogs/confdialog.cxx:16966 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16967 msgid "Monitor for TCP connection." msgstr "Монитор подключения TCP." #: src/dialogs/confdialog.cxx:16973 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16974 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16980 msgid "Auto Connect / Retry" msgstr "Авто соединить/повтор" #: src/dialogs/confdialog.cxx:16981 msgid "Connect to host program on FLDIGI start up" msgstr "Connect to host program on FLDIGI start up" #: src/dialogs/confdialog.cxx:16987 msgid "AX25 Decode" msgstr "AX25 Декодировать" #: src/dialogs/confdialog.cxx:16988 msgid "Decode AX25 Packets into human readable form" msgstr "Декодировать пакеты АХ25 в читабельной форме" #: src/dialogs/confdialog.cxx:16996 msgid "ARQ" msgstr "ARQ" #: src/dialogs/confdialog.cxx:17000 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP адрес для ARQ интерфейса\n" "IP адрес в формате: nnn.nnn.nnn.nnn\n" "или имя: i.e. localhost" #: src/dialogs/confdialog.cxx:17043 msgid "XML" msgstr "XML" #: src/dialogs/confdialog.cxx:17052 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP адрес для XMLRPC интерфейса\n" "IP адрес в формате: nnn.nnn.nnn.nnn\n" "или имя: i.e. localhost" #: src/dialogs/confdialog.cxx:17090 msgid "flrig" msgstr "flrig" #: src/dialogs/confdialog.cxx:17099 src/dialogs/confdialog.cxx:17353 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP адрес для flrig интерфейса\n" "IP адрес в формате: nnn.nnn.nnn.nnn\n" "или имя: i.e. localhost" #: src/dialogs/confdialog.cxx:17131 src/dialogs/confdialog.cxx:17155 #: src/dialogs/confdialog.cxx:17383 msgid "Reconnect" msgstr "" #: src/dialogs/confdialog.cxx:17137 msgid "fllog" msgstr "fllog" #: src/dialogs/confdialog.cxx:17141 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP адрес для fllog интерфейса\n" "IP адрес в формате: nnn.nnn.nnn.nnn\n" "или имя: i.e. localhost" #: src/dialogs/confdialog.cxx:17172 src/dialogs/confdialog.cxx:17323 #: src/dialogs/confdialog.cxx:17325 #, fuzzy msgid "Operator-Station" msgstr "Инфо об операторе" #: src/dialogs/confdialog.cxx:17177 msgid "Station Callsign:" msgstr "Позывной станции:" #: src/dialogs/confdialog.cxx:17178 msgid "Station callsign" msgstr "Позывной" #: src/dialogs/confdialog.cxx:17191 msgid "Operator Callsign:" msgstr "Позывной оператора" #: src/dialogs/confdialog.cxx:17192 msgid "Operator callsign (if different than station callsign)" msgstr "Позывной оператора (если отличается от позывного станции)" #: src/dialogs/confdialog.cxx:17206 msgid "Operator Name:" msgstr "Имя оператора" #: src/dialogs/confdialog.cxx:17207 msgid "Operators name" msgstr "Имена операторов" #: src/dialogs/confdialog.cxx:17220 msgid "Antenna:" msgstr "Антенна станции" #: src/dialogs/confdialog.cxx:17221 msgid "Short description of antenna" msgstr "Краткое описание антенны" #: src/dialogs/confdialog.cxx:17234 #, fuzzy #| msgid "Station LOC" msgid "Station City:" msgstr "Локатор корреспондента" #: src/dialogs/confdialog.cxx:17249 msgid "Station Locator:" msgstr "Локатор станции" #: src/dialogs/confdialog.cxx:17250 msgid "Maidenhead locator as in EM64qv" msgstr "Локатор в формате EM64qv (6 символов)" #: src/dialogs/confdialog.cxx:17263 #, fuzzy msgid "State/Prov./Country" msgstr "Канадская провинция" #: src/dialogs/confdialog.cxx:17264 msgid "US States / Canadian Provinces" msgstr "" #: src/dialogs/confdialog.cxx:17281 msgid "Abbreviation for State/Province" msgstr "" #: src/dialogs/confdialog.cxx:17293 msgid "Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17294 msgid "US/Canadian Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17311 msgid "Abbreviation for County/Region" msgstr "" #: src/dialogs/confdialog.cxx:17328 src/dialogs/confdialog.cxx:17426 #: src/dialogs/confdialog.cxx:17428 #, fuzzy msgid "Rig Control/flrig" msgstr "RIG контроль" #: src/dialogs/confdialog.cxx:17332 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" "\"Отключить РТТ, если несколько экземпляров fldigi (клиент)\n" "подключены к единому flrig (сервер)." #: src/dialogs/confdialog.cxx:17336 msgid "Flrig PTT keys modem" msgstr "РТТ от Flrig" #: src/dialogs/confdialog.cxx:17337 msgid "\" \"" msgstr "\" \"" #: src/dialogs/confdialog.cxx:17344 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" "Параметры flrig xmlrpc сервера\n" "Эти параметры отобразятся во вкладке конфигурации" #: src/dialogs/confdialog.cxx:17384 msgid "Press only if you change the address/port" msgstr "Нажмите если надо изменить адрес/порт" #: src/dialogs/confdialog.cxx:17389 msgid "flrig is the preferred method of tranceiver control" msgstr "flrig является предпочтительным методом управления трансивером" #: src/dialogs/confdialog.cxx:17392 msgid "Enable flrig xcvr control with fldigi as client" msgstr "Включить flrig xcvr в качестве клиента" #: src/dialogs/confdialog.cxx:17393 src/dialogs/confdialog.cxx:17399 msgid "Disable if flrig not used." msgstr "Отключить, если flrig не используется." #: src/dialogs/confdialog.cxx:17398 #, fuzzy msgid "Shutdown flrig with fldigi" msgstr "Автостарт совместно с fldigi" #: src/dialogs/confdialog.cxx:17404 #, fuzzy #| msgid "Polling Interval (msec)" msgid "Poll Interval (msec)" msgstr "Интервал повтора (msec)" #: src/dialogs/confdialog.cxx:17405 msgid "Request updates every 'poll interval' milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:17431 src/dialogs/confdialog.cxx:17634 #: src/dialogs/confdialog.cxx:17636 msgid "Rig Control/CAT (rigcat)" msgstr "" #: src/dialogs/confdialog.cxx:17435 msgid "Use RigCAT" msgstr "Использовать RigCAT" #: src/dialogs/confdialog.cxx:17436 msgid "RigCAT used for rig control" msgstr "RigCAT использовать для управления трансивером" #: src/dialogs/confdialog.cxx:17443 msgid "Rig description file:" msgstr "Файл управления трансивером:" #: src/dialogs/confdialog.cxx:17444 msgid "Use Open to select descriptor file" msgstr "Открыть для выбора файла" #: src/dialogs/confdialog.cxx:17450 msgid "Select rig descriptor file" msgstr "Выберите файл" #: src/dialogs/confdialog.cxx:17454 src/dialogs/confdialog.cxx:17940 #: src/dialogs/confdialog.cxx:18210 src/dialogs/confdialog.cxx:18551 msgid "Device:" msgstr "Порт:" #: src/dialogs/confdialog.cxx:17469 src/dialogs/confdialog.cxx:17955 msgid "Retries" msgstr "Повторы" #: src/dialogs/confdialog.cxx:17470 msgid "# retries before giving up" msgstr "# повторных попыток" #: src/dialogs/confdialog.cxx:17486 msgid "Retry interval (ms)" msgstr "Интервал повтора (мс)" #: src/dialogs/confdialog.cxx:17487 msgid "Time between retires in msec" msgstr "Время между повторами в мс" #: src/dialogs/confdialog.cxx:17503 msgid "Write delay (ms)" msgstr "Задержка записи (ms)" #: src/dialogs/confdialog.cxx:17504 msgid "Wait for response to subsequent command" msgstr "Дождитесь ответа на последующие команды" #: src/dialogs/confdialog.cxx:17520 src/dialogs/confdialog.cxx:18023 msgid "Baud rate:" msgstr "Скорость порта" #: src/dialogs/confdialog.cxx:17536 src/dialogs/confdialog.cxx:18039 msgid "Stopbits" msgstr "Стопбиты" #: src/dialogs/confdialog.cxx:17556 msgid "Initialize RigCAT interface" msgstr "Инициализировать RigCAT интерфейс" #: src/dialogs/confdialog.cxx:17560 msgid "Commands are echoed" msgstr "" #: src/dialogs/confdialog.cxx:17561 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:17566 msgid "CAT command for PTT" msgstr "CAT команды для PTT" #: src/dialogs/confdialog.cxx:17567 msgid "PTT is a CAT command (not hardware)" msgstr "PTT является командой CAT (не аппаратное обеспечение)" #: src/dialogs/confdialog.cxx:17573 msgid "Toggle RTS for PTT" msgstr "Переключение RTS для PTT" #: src/dialogs/confdialog.cxx:17574 msgid "RTS is ptt line" msgstr "RTS это РТТ линия" #: src/dialogs/confdialog.cxx:17579 msgid "Toggle DTR for PTT" msgstr "Переключение DTR для PTT" #: src/dialogs/confdialog.cxx:17580 msgid "DTR is ptt line" msgstr "DTR это РТТ линия" #: src/dialogs/confdialog.cxx:17585 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:17586 src/dialogs/confdialog.cxx:18096 msgid "Initial state of RTS" msgstr "Исходное состояние RTS" #: src/dialogs/confdialog.cxx:17591 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:17592 src/dialogs/confdialog.cxx:18090 msgid "Initial state of DTR" msgstr "Исходное состояние DTR" #: src/dialogs/confdialog.cxx:17597 src/dialogs/confdialog.cxx:18101 msgid "RTS/CTS flow control" msgstr "Управление потоком RTS / CTS" #: src/dialogs/confdialog.cxx:17598 msgid "Rig uses RTS/CTS handshake" msgstr "Rig использует связку RTS/CTS" #: src/dialogs/confdialog.cxx:17603 #, fuzzy msgid "Restore UART Settings on Close" msgstr "Восстановление настроек при Закрытии" #: src/dialogs/confdialog.cxx:17604 msgid "Restore the serial (COM) port settings" msgstr "Восстановление настройки последовательного (COM) порта" #: src/dialogs/confdialog.cxx:17609 msgid "VSP Enable" msgstr "VSP Включить" #: src/dialogs/confdialog.cxx:17610 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "" "Виртуальный Эмулятор Последовательного порта - отключает ПРЕДУПРЕЖДЕНИЯ" #: src/dialogs/confdialog.cxx:17615 msgid "Init delay (ms)" msgstr "Задержка начала (мс)" #: src/dialogs/confdialog.cxx:17616 msgid "Wait for response to first CAT command" msgstr "Дождитесь ответа на первую команду CAT" #: src/dialogs/confdialog.cxx:17639 src/dialogs/confdialog.cxx:17910 #: src/dialogs/confdialog.cxx:17912 #, fuzzy msgid "Rig Control/GPIO" msgstr "RIG контроль" #: src/dialogs/confdialog.cxx:17643 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" "Вкл GPIO PTT Интерфейс ввода/вывода общего назначения (для Raspberry Pi)" #: src/dialogs/confdialog.cxx:17644 src/dialogs/confdialog.cxx:17778 #: src/dialogs/confdialog.cxx:17785 src/dialogs/confdialog.cxx:17792 #: src/dialogs/confdialog.cxx:17799 src/dialogs/confdialog.cxx:17806 #: src/dialogs/confdialog.cxx:17813 src/dialogs/confdialog.cxx:17820 #: src/dialogs/confdialog.cxx:17827 src/dialogs/confdialog.cxx:17834 #: src/dialogs/confdialog.cxx:17841 src/dialogs/confdialog.cxx:17848 #: src/dialogs/confdialog.cxx:17855 src/dialogs/confdialog.cxx:17862 #: src/dialogs/confdialog.cxx:17869 src/dialogs/confdialog.cxx:17876 #: src/dialogs/confdialog.cxx:17883 src/dialogs/confdialog.cxx:17890 #: src/dialogs/confdialog.cxx:18263 msgid "Select PTT on state" msgstr "Выберите состояние PTT" #: src/dialogs/confdialog.cxx:17651 src/dialogs/confdialog.cxx:18270 msgid "Initialize the H/W PTT interface" msgstr "Инициализировать H/W PTT интерфейс " #: src/dialogs/confdialog.cxx:17654 src/dialogs/confdialog.cxx:17896 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:17658 msgid "17 00 11" msgstr "17 00 11" #: src/dialogs/confdialog.cxx:17659 src/dialogs/confdialog.cxx:17666 #: src/dialogs/confdialog.cxx:17673 src/dialogs/confdialog.cxx:17680 #: src/dialogs/confdialog.cxx:17687 src/dialogs/confdialog.cxx:17694 #: src/dialogs/confdialog.cxx:17701 src/dialogs/confdialog.cxx:17708 #: src/dialogs/confdialog.cxx:17715 src/dialogs/confdialog.cxx:17722 #: src/dialogs/confdialog.cxx:17729 src/dialogs/confdialog.cxx:17736 #: src/dialogs/confdialog.cxx:17743 src/dialogs/confdialog.cxx:17750 #: src/dialogs/confdialog.cxx:17757 src/dialogs/confdialog.cxx:17764 #: src/dialogs/confdialog.cxx:17771 msgid "Select pin number" msgstr "Выберите номера контактов" #: src/dialogs/confdialog.cxx:17665 msgid "18 01 12" msgstr "18 01 12" #: src/dialogs/confdialog.cxx:17672 msgid "27 02 13" msgstr "27 02 13" #: src/dialogs/confdialog.cxx:17679 msgid "22 03 15" msgstr "22 03 15" #: src/dialogs/confdialog.cxx:17686 msgid "23 04 16" msgstr "23 04 16" #: src/dialogs/confdialog.cxx:17693 msgid "24 05 18" msgstr "24 05 18" #: src/dialogs/confdialog.cxx:17700 msgid "25 06 22" msgstr "25 06 22" #: src/dialogs/confdialog.cxx:17707 msgid " 4 07 7" msgstr " 4 07 7" #: src/dialogs/confdialog.cxx:17714 msgid " 5 21 29" msgstr " 5 21 29" #: src/dialogs/confdialog.cxx:17721 msgid " 6 22 31" msgstr " 6 22 31" #: src/dialogs/confdialog.cxx:17728 msgid "13 23 33" msgstr "13 23 33" #: src/dialogs/confdialog.cxx:17735 msgid "19 24 35" msgstr "19 24 35" #: src/dialogs/confdialog.cxx:17742 msgid "26 25 37" msgstr "26 25 37" #: src/dialogs/confdialog.cxx:17749 msgid "12 26 32" msgstr "12 26 32" #: src/dialogs/confdialog.cxx:17756 msgid "16 27 36" msgstr "16 27 36" #: src/dialogs/confdialog.cxx:17763 msgid "20 28 38" msgstr "20 28 38" #: src/dialogs/confdialog.cxx:17770 msgid "21 29 40" msgstr "21 29 40" #: src/dialogs/confdialog.cxx:17777 src/dialogs/confdialog.cxx:17784 #: src/dialogs/confdialog.cxx:17791 src/dialogs/confdialog.cxx:17798 #: src/dialogs/confdialog.cxx:17805 src/dialogs/confdialog.cxx:17812 #: src/dialogs/confdialog.cxx:17819 src/dialogs/confdialog.cxx:17826 #: src/dialogs/confdialog.cxx:17833 src/dialogs/confdialog.cxx:17840 #: src/dialogs/confdialog.cxx:17847 src/dialogs/confdialog.cxx:17854 #: src/dialogs/confdialog.cxx:17861 src/dialogs/confdialog.cxx:17868 #: src/dialogs/confdialog.cxx:17875 src/dialogs/confdialog.cxx:17882 #: src/dialogs/confdialog.cxx:17889 msgid "= 1 (on)" msgstr "= 1 (on)" #: src/dialogs/confdialog.cxx:17900 msgid "Pulse width (msec)" msgstr "Длительность импульса (мс)" #: src/dialogs/confdialog.cxx:17901 msgid "Set >0 if pulsed PTT used" msgstr "Set>0, если используется импульсный PTT" #: src/dialogs/confdialog.cxx:17919 msgid "Use Hamlib" msgstr "Использовать Hamlib" #: src/dialogs/confdialog.cxx:17920 msgid "Hamlib used for rig control" msgstr "Hamlib используется для управления трансивером" #: src/dialogs/confdialog.cxx:17926 msgid "Rig:" msgstr "Rig:" #: src/dialogs/confdialog.cxx:17956 msgid "# times to resend command before giving up" msgstr "" #: src/dialogs/confdialog.cxx:17972 #, fuzzy msgid "Timeout (msec)" msgstr "Время (сек)" #: src/dialogs/confdialog.cxx:17973 msgid "Hamlib read timeout" msgstr "" #: src/dialogs/confdialog.cxx:17989 msgid "Write delay (msec)" msgstr "Задержка начала (msec)" #: src/dialogs/confdialog.cxx:17990 msgid "Msec's between sequential commands" msgstr "Милисекунд между последовательными командами" #: src/dialogs/confdialog.cxx:18006 msgid "Post write delay (msec)" msgstr "Задержка после записи (msec)" #: src/dialogs/confdialog.cxx:18007 msgid "Wait interval (msecs) before reading response" msgstr "Интервал ожидания (мс) перед чтением ответа" #: src/dialogs/confdialog.cxx:18058 msgid "Polling Interval (msec)" msgstr "Интервал повтора (msec)" #: src/dialogs/confdialog.cxx:18077 msgid "PTT via Hamlib command" msgstr "PTT через Hamlib команды" #: src/dialogs/confdialog.cxx:18078 msgid "PTT using hamlib command" msgstr "PTT использует hamlib команды" #: src/dialogs/confdialog.cxx:18083 msgid "Audio on Auxiliary Port" msgstr "Аудио на вспомогательный порт" #: src/dialogs/confdialog.cxx:18084 msgid "PTT enables auxiliary audio source" msgstr "PTT включается дополнительным источником звука" #: src/dialogs/confdialog.cxx:18089 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:18095 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:18102 msgid "Rig requires RTS/CTS flow control" msgstr "Rig требует управления потоками RTS/CTS" #: src/dialogs/confdialog.cxx:18108 msgid "XON/XOFF flow control" msgstr "управление потоком XON/XOFF" #: src/dialogs/confdialog.cxx:18109 msgid "Rig requires Xon/Xoff flow control" msgstr "Rig требует управления потоками Xon/Xoff" #: src/dialogs/confdialog.cxx:18114 msgid "CW is LSB mode" msgstr "CW в LSB режиме" #: src/dialogs/confdialog.cxx:18115 msgid "Check if xcvr uses LSB for CW" msgstr "Нажать если LSB для CW" #: src/dialogs/confdialog.cxx:18120 msgid "RTTY is USB mode" msgstr "RTTY в USB режиме" #: src/dialogs/confdialog.cxx:18121 msgid "Check if xcvr uses USB for RTTY" msgstr "Нажать если USB для RTTY" #: src/dialogs/confdialog.cxx:18126 msgid "Mode delay (msec)" msgstr "Режим задержки (msec)" #: src/dialogs/confdialog.cxx:18127 msgid "Delay NN msec after executing mode change" msgstr "Задержка NN мсек после изменения режима" #: src/dialogs/confdialog.cxx:18146 msgid "Sideband:" msgstr "Боковая полоса:" #: src/dialogs/confdialog.cxx:18159 msgid "Advanced configuration:" msgstr "Расширенная конфигурация:" #: src/dialogs/confdialog.cxx:18160 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Опциональная конфигурация\n" "в формате: param=val ..." #: src/dialogs/confdialog.cxx:18175 msgid "Initialize hamlib interface" msgstr "Инициализировать hamlib интерфейс" #: src/dialogs/confdialog.cxx:18188 src/dialogs/confdialog.cxx:18300 #: src/dialogs/confdialog.cxx:18302 #, fuzzy msgid "Rig Control/Hardware PTT" msgstr "Hardware PTT" #: src/dialogs/confdialog.cxx:18194 src/dialogs/confdialog.cxx:18674 msgid "PTT tone on right audio channel " msgstr "PTT тон на правом аудио канале" #: src/dialogs/confdialog.cxx:18195 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Может использоваться вместо или в дополнение к другим типам PTT" #: src/dialogs/confdialog.cxx:18202 msgid "h/w ptt device-pin" msgstr "" #: src/dialogs/confdialog.cxx:18205 msgid "Use separate serial port PTT" msgstr "Использовать отдельный порт PTT" #: src/dialogs/confdialog.cxx:18225 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:18226 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:18232 msgid "Use parallel port PTT" msgstr "Использовать параллельный порт PTT" #: src/dialogs/confdialog.cxx:18237 msgid "Use uHRouter PTT" msgstr "Использовать uHRouter PTT" #: src/dialogs/confdialog.cxx:18242 msgid "Use RTS" msgstr "Вкл. RTS" #: src/dialogs/confdialog.cxx:18243 msgid "RTS is PTT signal line" msgstr "RTS это PTT сигнальная линия" #: src/dialogs/confdialog.cxx:18247 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:18248 msgid "Initial voltage on RTS" msgstr "Начальное напряжение на RTS" #: src/dialogs/confdialog.cxx:18253 msgid "DTR is PTT signal line" msgstr "DTR это PTT сигнальная линия" #: src/dialogs/confdialog.cxx:18257 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:18258 msgid "Initial voltage on DTR" msgstr "Начальное напряжение на DTR" #: src/dialogs/confdialog.cxx:18262 #, fuzzy #| msgid "Enable GPIO PTT (Pi specific controls)" msgid "GPIO PTT (Pi specific controls)" msgstr "" "Вкл GPIO PTT Интерфейс ввода/вывода общего назначения (для Raspberry Pi)" #: src/dialogs/confdialog.cxx:18275 msgid "PTT delays valid for all CAT/PTT types" msgstr "PTT задержки действительны для всех типов CAT/PTT" #: src/dialogs/confdialog.cxx:18278 msgid "Start of transmit PTT delay" msgstr "Задержка PTT перед началом передачи (мсек)" #: src/dialogs/confdialog.cxx:18279 msgid "Delay NN msec before starting audio" msgstr "Задержка (мсек) перед началом аудио" #: src/dialogs/confdialog.cxx:18288 msgid "PTT end of transmit delay" msgstr "Задержка PTT после окончания передачи (мсек)" #: src/dialogs/confdialog.cxx:18289 msgid "Delay NN msec before releasing PTT" msgstr "Задержка NN мсек перед тем как отпустить PTT" #: src/dialogs/confdialog.cxx:18306 src/dialogs/confdialog.cxx:18363 msgid "C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18310 msgid "" "C-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. " "GPIO signal line 3 (pin 13) is used for PTT control.\n" "\n" "Fldigi accesses the GPIO lines as a Human Interface Device (HID). " "Discovered C-Media devices are enumerated in the 'C-Media device' list box.\n" "\n" "On Linux: add a file named cmedia.rules to /etc/udev/rules.d/\n" "The file should contain a single line\n" "\n" "KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"" msgstr "" #: src/dialogs/confdialog.cxx:18319 msgid "Use C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18324 #, fuzzy #| msgid "Capture device" msgid "C-Media device" msgstr "Устройство захвата" #: src/dialogs/confdialog.cxx:18339 #, fuzzy #| msgid "Odd lines" msgid "GPIO line" msgstr "Нечетные линии" #: src/dialogs/confdialog.cxx:18356 #, fuzzy #| msgid "Initialize the H/W PTT interface" msgid "Select device & Initialize the H/W PTT interface" msgstr "Инициализировать H/W PTT интерфейс " #: src/dialogs/confdialog.cxx:18359 msgid "TEST" msgstr "" #: src/dialogs/confdialog.cxx:18360 msgid "Toggles PTT line 20x; check DRA-30 ptt LED" msgstr "" #: src/dialogs/confdialog.cxx:18365 #, fuzzy msgid "Rig Control/C-Media PTT" msgstr "Hardware PTT" #: src/dialogs/confdialog.cxx:18369 src/dialogs/confdialog.cxx:18534 #: src/dialogs/confdialog.cxx:18536 #, fuzzy msgid "Soundcard/Alerts" msgstr "Звуковая карта" #: src/dialogs/confdialog.cxx:18378 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:18407 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:18436 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:18465 #, fuzzy msgid "flmsg received wav" msgstr "Принятый RST" #: src/dialogs/confdialog.cxx:18489 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:18515 msgid "Alert volume" msgstr "" #: src/dialogs/confdialog.cxx:18539 src/dialogs/confdialog.cxx:18646 #: src/dialogs/confdialog.cxx:18648 #, fuzzy msgid "Soundcard/Devices" msgstr "Аудио устройство" #: src/dialogs/confdialog.cxx:18545 msgid "OSS" msgstr "" #: src/dialogs/confdialog.cxx:18546 msgid "Use OSS audio server" msgstr "Использовать OSS audio server" #: src/dialogs/confdialog.cxx:18552 msgid "Select device" msgstr "Выберите устройство" #: src/dialogs/confdialog.cxx:18560 msgid "PortAudio" msgstr "Аудиопорт" #: src/dialogs/confdialog.cxx:18561 msgid "Use Port Audio server" msgstr "Использовать порт Audio server" #: src/dialogs/confdialog.cxx:18566 msgid "Capture:" msgstr "Передача:" #: src/dialogs/confdialog.cxx:18567 msgid "Audio input device" msgstr "Устройство аудиовхода" #: src/dialogs/confdialog.cxx:18571 msgid "Playback:" msgstr "Воспроизведение:" #: src/dialogs/confdialog.cxx:18572 src/dialogs/confdialog.cxx:18629 msgid "Audio output device" msgstr "Устройство аудиовыхода" #: src/dialogs/confdialog.cxx:18580 msgid "PulseAudio" msgstr "" #: src/dialogs/confdialog.cxx:18581 msgid "Use Pulse Audio server" msgstr "Использовать Pulse Audio server" #: src/dialogs/confdialog.cxx:18586 msgid "Server string:" msgstr "" #: src/dialogs/confdialog.cxx:18587 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Оставьте это поле пустым или обратитесь к\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:18605 msgid "File I/O only" msgstr "" #: src/dialogs/confdialog.cxx:18606 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "" #: src/dialogs/confdialog.cxx:18615 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:18616 msgid "Capture/Playback supports full duplex operation" msgstr "" #: src/dialogs/confdialog.cxx:18628 msgid "Audio device shared by Audio Alerts and Rx Monitor" msgstr "" #: src/dialogs/confdialog.cxx:18635 #, fuzzy msgid "First select audio alert playback device" msgstr "Захват и воспроизводящие устройства" #: src/dialogs/confdialog.cxx:18641 msgid "Note: must be selected and enabled for Rx Audio monitoring!" msgstr "" #: src/dialogs/confdialog.cxx:18651 src/dialogs/confdialog.cxx:18708 #: src/dialogs/confdialog.cxx:18710 #, fuzzy msgid "Soundcard/Right channel" msgstr "Правый канал" #: src/dialogs/confdialog.cxx:18655 msgid "Transmit Usage" msgstr "Использование передачи" #: src/dialogs/confdialog.cxx:18658 msgid "Modem signal on left and right channels" msgstr "Сигнал модема на левый и правый каналы" #: src/dialogs/confdialog.cxx:18659 msgid "Left and right channels both contain modem audio" msgstr "Левый и правый каналы оба содержат аудио сигнал" #: src/dialogs/confdialog.cxx:18664 src/dialogs/confdialog.cxx:18700 msgid "Reverse Left/Right channels" msgstr "Реверсировать правый/левый каналы" #: src/dialogs/confdialog.cxx:18665 src/dialogs/confdialog.cxx:18701 msgid "Software reversal of left-right audio channels" msgstr "Программно реверсировать правый/левый каналы" #: src/dialogs/confdialog.cxx:18670 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Эти средства управления находятся на других вкладках.\n" "Они копируются здесь для удобства.\n" "..." #: src/dialogs/confdialog.cxx:18675 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "Тон 1000 Гц при включенном РТТ\n" "Может быть использован вместо или в дополнение к другим видам РТТ" #: src/dialogs/confdialog.cxx:18681 msgid "CW QSK signal on right channel" msgstr "CW QSK сигнал на правый канал" #: src/dialogs/confdialog.cxx:18682 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Сформировать 1000 Гц меандр на правом канале" #: src/dialogs/confdialog.cxx:18687 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK на правом канале" #: src/dialogs/confdialog.cxx:18688 msgid "Create 1000 Hz square wave on right channel" msgstr "Создать 1000 Гц меандр на правом канале" #: src/dialogs/confdialog.cxx:18697 msgid "Receive Usage" msgstr "Использование приема" #: src/dialogs/confdialog.cxx:18713 src/dialogs/confdialog.cxx:18850 #: src/dialogs/confdialog.cxx:18852 #, fuzzy msgid "Soundcard/Settings" msgstr "Установки" #: src/dialogs/confdialog.cxx:18720 msgid "Capture" msgstr "Захват" #: src/dialogs/confdialog.cxx:18721 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Скорость дискретизации выберите \"Native\", если \"Auto\"\n" "не очень хорошо работает на вашем аудио устройстве." #: src/dialogs/confdialog.cxx:18753 msgid "Converter" msgstr "Конвертер" #: src/dialogs/confdialog.cxx:18754 msgid "Set the type of resampler used of offset correction" msgstr "Установите тип дискретизатора для коррекции смещения" #: src/dialogs/confdialog.cxx:18770 msgid "Corrections" msgstr "Коррекция" #: src/dialogs/confdialog.cxx:18773 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:18774 msgid "RX sound card correction" msgstr "RX коррекция звуковой карты" #: src/dialogs/confdialog.cxx:18790 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:18791 msgid "TX sound card correction" msgstr "TX коррекция звуковой карты" #: src/dialogs/confdialog.cxx:18807 msgid "TX offset" msgstr "TX смещение" #: src/dialogs/confdialog.cxx:18808 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Разница между Rx и Tx частотами" #: src/dialogs/confdialog.cxx:18826 msgid "Frequency Analysis / FMT Rx Correction" msgstr "" #: src/dialogs/confdialog.cxx:18834 #, fuzzy msgid "Frequency Correction" msgstr "Частота в MHz" #: src/dialogs/confdialog.cxx:18835 msgid "Used ONLY for frequency analysis mode" msgstr "" #: src/dialogs/confdialog.cxx:18855 #, fuzzy msgid "Signal Level" msgstr "Уровень сигнала" #: src/dialogs/confdialog.cxx:18859 #, fuzzy msgid "Signal Levels" msgstr "Уровень сигнала" #: src/dialogs/confdialog.cxx:18940 src/dialogs/confdialog.cxx:18942 #, fuzzy msgid "Soundcard/Signal Level" msgstr "Аудио устройство" #: src/dialogs/confdialog.cxx:18945 src/dialogs/confdialog.cxx:18971 #: src/dialogs/confdialog.cxx:18973 msgid "Soundcard/Wav file recording" msgstr "" #: src/dialogs/confdialog.cxx:18949 msgid "Wav write sample rate" msgstr "Частота дискретизации записи" #: src/dialogs/confdialog.cxx:18950 msgid "Pick baud rate from list" msgstr "Выберите скорость передачи данных из списка" #: src/dialogs/confdialog.cxx:18966 msgid "Record both channels" msgstr "Запись обоих каналов" #: src/dialogs/confdialog.cxx:18977 src/dialogs/confdialog.cxx:19063 #: src/dialogs/confdialog.cxx:19065 msgid "UI/Browser/Channels" msgstr "" #: src/dialogs/confdialog.cxx:18981 msgid "Channels, first channel starts at waterfall lower limit" msgstr "количество декодируемых каналов" #: src/dialogs/confdialog.cxx:18982 msgid "Change # of psk viewer channels" msgstr "" #: src/dialogs/confdialog.cxx:18999 msgid "Inactivity timeout" msgstr "Пассивное время" #: src/dialogs/confdialog.cxx:19000 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Очистить строки от текста после\n" "# секунд отсутствия активности" #: src/dialogs/confdialog.cxx:19016 msgid "Channel label" msgstr "Метка канала" #: src/dialogs/confdialog.cxx:19017 msgid "Appearance of label on each channel" msgstr "Вид меток каждого канала" #: src/dialogs/confdialog.cxx:19028 msgid "Audio frequency" msgstr "Аудио частота" #: src/dialogs/confdialog.cxx:19029 msgid "Radio frequency" msgstr "Радио частота" #: src/dialogs/confdialog.cxx:19029 msgid "Channel number" msgstr "Номер канала" #: src/dialogs/confdialog.cxx:19034 src/dialogs/confdialog.cxx:19772 msgid "Font..." msgstr "Шрифт" #: src/dialogs/confdialog.cxx:19035 msgid "select browser font" msgstr "шрифт браузера" #: src/dialogs/confdialog.cxx:19038 msgid "Fixed Intervals" msgstr "Фикс. интервалы" #: src/dialogs/confdialog.cxx:19039 msgid "Force channel spacing to even 100 Hz increments" msgstr "Расстояние между каналами 100 Гц" #: src/dialogs/confdialog.cxx:19045 msgid "Continuous scrolling" msgstr "Непрерывная прокрутка" #: src/dialogs/confdialog.cxx:19046 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" #: src/dialogs/confdialog.cxx:19051 msgid "Lowest freq on bottom of viewer" msgstr "Нижняя частота внизу списка" #: src/dialogs/confdialog.cxx:19052 msgid "Change positions of low to high channels" msgstr "Позиции от нижнего до высшего канала" #: src/dialogs/confdialog.cxx:19057 msgid "Play back history when active channel selected" msgstr "Воспроизводить историю при выборе канала" #: src/dialogs/confdialog.cxx:19058 msgid "Audio stream history decoded on selected signal" msgstr "Декодировать аудио историю выбранного сигнала" #: src/dialogs/confdialog.cxx:19068 src/dialogs/confdialog.cxx:19102 #: src/dialogs/confdialog.cxx:19104 #, fuzzy msgid "UI/Browser/Colors" msgstr "Браузер цвета" #: src/dialogs/confdialog.cxx:19072 msgid "HiLite 1" msgstr "HiLite 1" #: src/dialogs/confdialog.cxx:19073 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "PSK/RTTY Viewer HiLite Color 1" #: src/dialogs/confdialog.cxx:19078 msgid "HiLite 2" msgstr "HiLite 2" #: src/dialogs/confdialog.cxx:19079 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:19084 msgid "Even" msgstr "Четный" #: src/dialogs/confdialog.cxx:19085 msgid "Even lines" msgstr "Четные линии" #: src/dialogs/confdialog.cxx:19090 msgid "Odd" msgstr "Нечетный" #: src/dialogs/confdialog.cxx:19091 msgid "Odd lines" msgstr "Нечетные линии" #: src/dialogs/confdialog.cxx:19097 msgid "Select line" msgstr "Выбрать линию" #: src/dialogs/confdialog.cxx:19107 src/dialogs/confdialog.cxx:19123 #: src/dialogs/confdialog.cxx:19125 #, fuzzy msgid "UI/Browser/Detection Level" msgstr "Уровень детектирования" #: src/dialogs/confdialog.cxx:19111 msgid "Backgnd" msgstr "Фон" #: src/dialogs/confdialog.cxx:19112 msgid "Background color of signal viewer squelch control" msgstr "Цвет фона шумоподавителя сигнала" #: src/dialogs/confdialog.cxx:19117 msgid "Button" msgstr "" #: src/dialogs/confdialog.cxx:19118 msgid "Slider hilite color of signal viewer squelch control" msgstr "Регулятор цвета фона шумоподавителя сигнала" #: src/dialogs/confdialog.cxx:19128 src/dialogs/confdialog.cxx:19262 #: src/dialogs/confdialog.cxx:19264 #, fuzzy msgid "UI/General" msgstr "Главная" #: src/dialogs/confdialog.cxx:19134 msgid "Show tooltips" msgstr "Показать подсказки" #: src/dialogs/confdialog.cxx:19135 msgid "Enable / disable tooltips" msgstr "Вкл/выкл подсказки" #: src/dialogs/confdialog.cxx:19141 msgid "Show menu icons" msgstr "Показать иконки в меню" #: src/dialogs/confdialog.cxx:19142 msgid "Enable / disable icons on menus" msgstr "Вкл/выкл меню иконок" #: src/dialogs/confdialog.cxx:19147 msgid "UI scheme" msgstr "Вид интерфейса" #: src/dialogs/confdialog.cxx:19148 msgid "Change application look and feel" msgstr "Изменить внешний вид приложения" #: src/dialogs/confdialog.cxx:19166 msgid "Visible modes" msgstr "Видимые режимы" #: src/dialogs/confdialog.cxx:19167 msgid "Select modes for menu access" msgstr "Выбор режима для доступа к меню" #: src/dialogs/confdialog.cxx:19170 msgid "UI language" msgstr "Язык интерфейса" #: src/dialogs/confdialog.cxx:19171 src/dialogs/confdialog.cxx:19915 msgid "Changes take effect on next program startup" msgstr "Изменения вступят в силу при следующем запуске программы" #: src/dialogs/confdialog.cxx:19190 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Печать CW / RTTY / THROB / CONTESTIA строчными" #: src/dialogs/confdialog.cxx:19200 msgid "Transmit lower case text" msgstr "Передавать строчные " #: src/dialogs/confdialog.cxx:19207 msgid "Exit prompts" msgstr "Запросы при выходе" #: src/dialogs/confdialog.cxx:19210 msgid "Prompt to save Configuration" msgstr "Сохранить измененную конфигурацию" #: src/dialogs/confdialog.cxx:19215 src/dialogs/confdialog.cxx:19377 msgid "Prompt to save macro file" msgstr "Записать измененные макросы" #: src/dialogs/confdialog.cxx:19216 src/dialogs/confdialog.cxx:19378 msgid "Write current macro set on program exit" msgstr "Записать текущий набор макросов при выходе из программы" #: src/dialogs/confdialog.cxx:19221 msgid "Prompt to save log" msgstr "Сохранить журнал" #: src/dialogs/confdialog.cxx:19227 msgid "Confirm exit" msgstr "Подтвердить выход" #: src/dialogs/confdialog.cxx:19234 msgid "Check for updates" msgstr "Проверить наличие обновлений" #: src/dialogs/confdialog.cxx:19237 msgid "Check for updates when starting program" msgstr "Проверить наличие обновлений при запуске программы" #: src/dialogs/confdialog.cxx:19247 msgid "Show TX timer" msgstr "Показать таймер TX" #: src/dialogs/confdialog.cxx:19252 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:19267 src/dialogs/confdialog.cxx:19405 #: src/dialogs/confdialog.cxx:19407 #, fuzzy msgid "UI/Macro buttons" msgstr "Надпись на кнопке макроса" #: src/dialogs/confdialog.cxx:19273 msgid "Mouse wheel active on macro buttons" msgstr "Управлять макрокнопками мышью" #: src/dialogs/confdialog.cxx:19274 msgid "enable mouse wheel control of macro bar" msgstr "Управления макросами мышью" #: src/dialogs/confdialog.cxx:19281 msgid "Number and position of macro bars" msgstr "Кол-во и расположение кнопок" #: src/dialogs/confdialog.cxx:19284 msgid "Button Height" msgstr "Высота кнопок" #: src/dialogs/confdialog.cxx:19285 msgid "Height of macro bar" msgstr "Высота полосы макросов" #: src/dialogs/confdialog.cxx:19295 msgid "One above Rx/Tx" msgstr "1 строка над Rx/Tx" #: src/dialogs/confdialog.cxx:19296 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" #: src/dialogs/confdialog.cxx:19301 msgid "One above waterfall" msgstr "1 строка над водопадом" #: src/dialogs/confdialog.cxx:19306 msgid "One below waterfall" msgstr "1 строка под водопадом" #: src/dialogs/confdialog.cxx:19311 msgid "Two scheme 1" msgstr "Две строки схема 1" #: src/dialogs/confdialog.cxx:19316 msgid "Two scheme 2" msgstr "Две строки схема 2" #: src/dialogs/confdialog.cxx:19321 msgid "Two scheme 3" msgstr "Две строки схема 3" #: src/dialogs/confdialog.cxx:19326 msgid "Two scheme 4" msgstr "Две строки схема 4" #: src/dialogs/confdialog.cxx:19331 msgid "Two scheme 5" msgstr "Две строки схема 5" #: src/dialogs/confdialog.cxx:19336 msgid "Two scheme 6" msgstr "Две строки схема 6" #: src/dialogs/confdialog.cxx:19341 msgid "Two scheme 7" msgstr "Две строки схема 7" #: src/dialogs/confdialog.cxx:19346 msgid "Two scheme 8" msgstr "Две строки схема 8" #: src/dialogs/confdialog.cxx:19351 msgid "Two scheme 9" msgstr "Две строки схема 9" #: src/dialogs/confdialog.cxx:19356 msgid "Two scheme 10" msgstr "Две строки схема 10" #: src/dialogs/confdialog.cxx:19365 msgid "Load last used macro file at start" msgstr "Загрузить последний используемый макрофайл" #: src/dialogs/confdialog.cxx:19366 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON - Использовать последний набор макросов\n" "OFF - Использовать установки по умолчанию" #: src/dialogs/confdialog.cxx:19371 msgid "Display macro filename at start" msgstr "Показать имя файла макросов при старте" #: src/dialogs/confdialog.cxx:19387 msgid "Show macro control codes" msgstr "Показывать коды управления макросами" #: src/dialogs/confdialog.cxx:19388 msgid "print ^! execution codes in Rx panel" msgstr "Показывать ^! исполняемые коды в Rx панели" #: src/dialogs/confdialog.cxx:19397 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:19398 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:19410 src/dialogs/confdialog.cxx:19454 #: src/dialogs/confdialog.cxx:19456 #, fuzzy msgid "UI/Rx Text" msgstr "Rx Text" #: src/dialogs/confdialog.cxx:19414 msgid "Single-click to capture" msgstr "" #: src/dialogs/confdialog.cxx:19415 src/dialogs/confdialog.cxx:19444 msgid "Enable for single click capure of text in Rx panel" msgstr "Включить для захвата текста в панели Rx одним кликом" #: src/dialogs/confdialog.cxx:19420 msgid "callsign tooltips in received text" msgstr "В принятом тексте инфо о позывном" #: src/dialogs/confdialog.cxx:19421 msgid "Popup info after a 2 second hover on a callsign" msgstr "Информация после 2 секунды курсора на позываном" #: src/dialogs/confdialog.cxx:19426 msgid "Word delimiters" msgstr "Разделители слов" #: src/dialogs/confdialog.cxx:19427 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:19443 msgid "US units of distance (QRB)" msgstr "Американские единицы расстояния (QRB)" #: src/dialogs/confdialog.cxx:19449 #, fuzzy msgid "Clear log fields - new CALL" msgstr "Очистить поля лога?" #: src/dialogs/confdialog.cxx:19459 src/dialogs/confdialog.cxx:19494 #: src/dialogs/confdialog.cxx:19496 msgid "UI/Touch" msgstr "" #: src/dialogs/confdialog.cxx:19463 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Примечание:\n" "Эти пункты конфигурации полезны для использования fldigi\n" "на устройствах с сенсорным экраном, например планшетах" #: src/dialogs/confdialog.cxx:19467 msgid "Arrow Key Control of Frequency Entry" msgstr "Кнопки со стрелками - Контроль частоты" #: src/dialogs/confdialog.cxx:19470 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" "Право/лево = 1 x LSD\n" "Вверх/вниз= 10 x LSD\n" "Shift - Право/лево = 100 x LSD\n" "Shift - Верх/низ = 1000 x LSD" #: src/dialogs/confdialog.cxx:19474 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" "Вправо/Влево\n" "Выбрать наименьшее используемое число" #: src/dialogs/confdialog.cxx:19483 msgid "Rx / Tx Panels" msgstr "Rx / Tx Панели" #: src/dialogs/confdialog.cxx:19486 msgid "Tx above Rx" msgstr "Tx выше Rx" #: src/dialogs/confdialog.cxx:19487 msgid "Enable to put Tx panel above Rx panel" msgstr "Поставить Tx панель выше панели Rx" #: src/dialogs/confdialog.cxx:19500 src/dialogs/confdialog.cxx:19580 #: src/dialogs/confdialog.cxx:19582 #, fuzzy msgid "Waterfall/Buttons & Controls" msgstr "Настройка водопада" #: src/dialogs/confdialog.cxx:19504 msgid "Enable check box to show each respective operator control" msgstr "Поставить галку, чтобы включить соответствующий контроль" #: src/dialogs/confdialog.cxx:19514 msgid "WF Magnification" msgstr "Увеличение водопада" #: src/dialogs/confdialog.cxx:19520 msgid "WF carrier" msgstr "Несущая" #: src/dialogs/confdialog.cxx:19526 msgid "WF Shift Controls" msgstr "Управление переключателями" #: src/dialogs/confdialog.cxx:19532 msgid "WF ref level" msgstr "Уровень передачи" #: src/dialogs/confdialog.cxx:19538 msgid "WF drop rate" msgstr "Скорость падения" #: src/dialogs/confdialog.cxx:19544 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:19550 msgid "WF Store" msgstr "История" #: src/dialogs/confdialog.cxx:19556 msgid "WF mode" msgstr "Модуляция" #: src/dialogs/confdialog.cxx:19562 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:19568 msgid "XMT lock" msgstr "Фиксация частоты" #: src/dialogs/confdialog.cxx:19574 msgid "Enable all" msgstr "Включить всё" #: src/dialogs/confdialog.cxx:19577 msgid "Disable all" msgstr "Выключить всё" #: src/dialogs/confdialog.cxx:19585 src/dialogs/confdialog.cxx:19800 #: src/dialogs/confdialog.cxx:19802 #, fuzzy msgid "Waterfall/Display" msgstr "Водопад" #: src/dialogs/confdialog.cxx:19589 msgid "Colors and cursors" msgstr "Цвет и курсор" #: src/dialogs/confdialog.cxx:19592 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:19607 src/dialogs/confdialog.cxx:19611 #: src/dialogs/confdialog.cxx:19615 src/dialogs/confdialog.cxx:19619 #: src/dialogs/confdialog.cxx:19623 src/dialogs/confdialog.cxx:19627 #: src/dialogs/confdialog.cxx:19631 src/dialogs/confdialog.cxx:19635 #: src/dialogs/confdialog.cxx:19639 src/dialogs/confdialog.cxx:19660 #: src/dialogs/confdialog.cxx:19683 src/dialogs/confdialog.cxx:19706 #: src/dialogs/confdialog.cxx:19723 src/dialogs/confdialog.cxx:19735 #: src/dialogs/confdialog.cxx:19748 msgid "Change color" msgstr "Изменить цвет" #: src/dialogs/confdialog.cxx:19642 msgid "Load..." msgstr "Загрузить" #: src/dialogs/confdialog.cxx:19643 msgid "Load a new palette" msgstr "Загрузить палитру" #: src/dialogs/confdialog.cxx:19646 msgid "Save..." msgstr "Сохранить" #: src/dialogs/confdialog.cxx:19647 msgid "Save this palette" msgstr "Сохранить палитру" #: src/dialogs/confdialog.cxx:19650 #, fuzzy #| msgid "Signal Browser" msgid "Signal BW" msgstr "Браузер сигнала" #: src/dialogs/confdialog.cxx:19653 src/dialogs/confdialog.cxx:19676 #: src/dialogs/confdialog.cxx:19699 msgid "ON" msgstr "ON" #: src/dialogs/confdialog.cxx:19654 msgid "Show cursor with bandwidth lines" msgstr "" #: src/dialogs/confdialog.cxx:19659 src/dialogs/confdialog.cxx:19682 #: src/dialogs/confdialog.cxx:19705 src/dialogs/confdialog.cxx:19722 #: src/dialogs/confdialog.cxx:19734 src/dialogs/confdialog.cxx:19747 #: src/dialogs/font_browser.cxx:177 msgid "Color" msgstr "Цвет" #: src/dialogs/confdialog.cxx:19666 src/dialogs/confdialog.cxx:19689 #: src/dialogs/confdialog.cxx:19712 src/dialogs/confdialog.cxx:19754 msgid "Wide" msgstr "Шире" #: src/dialogs/confdialog.cxx:19673 msgid "Center line" msgstr "Центральная линия" #: src/dialogs/confdialog.cxx:19677 msgid "Show cursor with center line" msgstr "Курсор в центре линии" #: src/dialogs/confdialog.cxx:19696 #, fuzzy #| msgid "Signal tracks" msgid "Signal trks" msgstr "Дорожка сигнала" #: src/dialogs/confdialog.cxx:19700 msgid "Show bandwidth tracks on waterfall" msgstr "Показать полосу на водопаде" #: src/dialogs/confdialog.cxx:19719 msgid "Notch" msgstr "" #: src/dialogs/confdialog.cxx:19731 #, fuzzy msgid "RsID Zone" msgstr "RSID reception" #: src/dialogs/confdialog.cxx:19743 msgid "Monitor" msgstr "" #: src/dialogs/confdialog.cxx:19744 #, fuzzy #| msgid "Audio on Auxiliary Port" msgid "Audio monitor" msgstr "Аудио на вспомогательный порт" #: src/dialogs/confdialog.cxx:19763 msgid "Frequency scale" msgstr "Шкала частоты" #: src/dialogs/confdialog.cxx:19766 msgid "Always show audio frequencies" msgstr "Всегда показывать аудио частоту" #: src/dialogs/confdialog.cxx:19767 msgid "Audio or RF frequencies on waterfall scale" msgstr "Аудио или радио частоты по шкале водопада" #: src/dialogs/confdialog.cxx:19773 msgid "Select waterfall scale font" msgstr "Выбрать шрифт водопада" #: src/dialogs/confdialog.cxx:19778 msgid "Transmit signal" msgstr "Передаваемый сигнал" #: src/dialogs/confdialog.cxx:19781 msgid "Monitor transmitted signal" msgstr "Монитор передаваемого сигнала" #: src/dialogs/confdialog.cxx:19782 msgid "Show transmit signal on waterfall" msgstr "Показать передаваемый сигнал на водопаде" #: src/dialogs/confdialog.cxx:19787 #, fuzzy msgid "Signal Level (dB)" msgstr "Уровень сигнала" #: src/dialogs/confdialog.cxx:19788 msgid "Set level for good viewing" msgstr "Установить уровень для лучшего просмотра" #: src/dialogs/confdialog.cxx:19805 src/dialogs/confdialog.cxx:19941 #: src/dialogs/confdialog.cxx:19943 #, fuzzy msgid "Waterfall/FFT Processing" msgstr "FFT обработка" #: src/dialogs/confdialog.cxx:19812 msgid "Low frequency limit in Hz" msgstr "Нижний предел частоты в Гц" #: src/dialogs/confdialog.cxx:19831 msgid "FFT averaging" msgstr "FFT усреднение" #: src/dialogs/confdialog.cxx:19832 msgid "Use averaging to decrease waterfall noise" msgstr "Использовать усреднения для уменьшения шума водопада" #: src/dialogs/confdialog.cxx:19837 msgid "FFT prefilter window function" msgstr "Окно функций предварительного FFT" #: src/dialogs/confdialog.cxx:19849 msgid "Rectangular" msgstr "Прямоугольность" #: src/dialogs/confdialog.cxx:19851 msgid "Triangular" msgstr "Треугольность" #: src/dialogs/confdialog.cxx:19857 msgid "High frequency limit in Hz" msgstr "Верхний предел частоты в Гц" #: src/dialogs/confdialog.cxx:19876 msgid "Latency" msgstr "Задержка" #: src/dialogs/confdialog.cxx:19877 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:19899 src/dialogs/confdialog.cxx:19916 msgid "Show me more or less waterfall" msgstr "Показать больше или меньше водопада" #: src/dialogs/confdialog.cxx:19902 msgid "Slow drop rate" msgstr "Медленная скорость падения" #: src/dialogs/confdialog.cxx:19903 msgid "Normal drop speed / value" msgstr "Нормальная скорость падения" #: src/dialogs/confdialog.cxx:19919 msgid "Waterfall height in pixels" msgstr "Высота водопада в пикселях" #: src/dialogs/confdialog.cxx:19920 msgid "CPU usage increases with waterfall height" msgstr "Загрузка процессора увеличивается с высотой водопада" #: src/dialogs/confdialog.cxx:19946 src/dialogs/confdialog.cxx:20000 #: src/dialogs/confdialog.cxx:20002 #, fuzzy msgid "Waterfall/Mouse usage" msgstr "Скорость падения водопада" #: src/dialogs/confdialog.cxx:19952 msgid "Left or right click always replays audio history" msgstr "Левый или правый клик всегда воспроизводит аудио историю" #: src/dialogs/confdialog.cxx:19953 msgid "Replay trackline audio" msgstr "Воспроизведение аудиотрека" #: src/dialogs/confdialog.cxx:19958 msgid "Dragging on the waterfall scale changes frequency" msgstr "Перетаскивать мышкой частоту водопада" #: src/dialogs/confdialog.cxx:19959 msgid "Enable drag cursor on waterfall scale" msgstr "Включить перетаскивание курсором шкалы водопада" #: src/dialogs/confdialog.cxx:19964 msgid "Insert text on single left click" msgstr "Вставлять текст одним левым кликом" #: src/dialogs/confdialog.cxx:19965 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" #: src/dialogs/confdialog.cxx:19971 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:19983 msgid "Wheel action" msgstr "Действие колеса" #: src/dialogs/confdialog.cxx:19984 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Определите как колесо мыши\n" "ведет себя внутри водопада" #: src/dialogs/confdialog.cxx:20005 src/dialogs/confdialog.cxx:20042 #: src/dialogs/confdialog.cxx:20044 #, fuzzy msgid "Waterfall/Spectrum" msgstr "Водопад" #: src/dialogs/confdialog.cxx:20009 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:20012 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:20013 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:20018 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:20019 #, fuzzy msgid "values left/below waterfall" msgstr "1 строка под водопадом" #: src/dialogs/confdialog.cxx:20024 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:20034 #, fuzzy msgid "use" msgstr "Мышь" #: src/dialogs/confdialog.cxx:20035 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:20048 src/dialogs/confdialog.cxx:20154 #: src/dialogs/confdialog.cxx:20156 #, fuzzy msgid "Web/Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:20052 msgid "Mail Server Attributes" msgstr "Атрибуты почтового сервера" #: src/dialogs/confdialog.cxx:20055 msgid "Carrier frequency (Hz)" msgstr "Несущая частота (Гц)" #: src/dialogs/confdialog.cxx:20056 msgid "Default listen / transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:20075 msgid "Search range (Hz)" msgstr "Диапазон поиска (Гц)" #: src/dialogs/confdialog.cxx:20076 msgid "Listen for signals within this range" msgstr "Слушать сигналы в пределах этого диапазона" #: src/dialogs/confdialog.cxx:20115 msgid "AFC range (Hz)" msgstr "Диапазон АПЧ (Гц)" #: src/dialogs/confdialog.cxx:20116 msgid "Limit AFC movement to this range" msgstr "Ограничить движение АПЧ в этом диапазоне" #: src/dialogs/confdialog.cxx:20135 msgid "Reset to Carrier" msgstr "" #: src/dialogs/confdialog.cxx:20136 msgid "When no signal present" msgstr "" #: src/dialogs/confdialog.cxx:20144 msgid "General" msgstr "Главная" #: src/dialogs/confdialog.cxx:20147 msgid "Report ARQ frames average S/N" msgstr "В рапорт ARQ среднее значение S/N" #: src/dialogs/confdialog.cxx:20159 src/dialogs/confdialog.cxx:20242 #: src/dialogs/confdialog.cxx:20244 msgid "Web/WX" msgstr "" #: src/dialogs/confdialog.cxx:20163 msgid "Access URL" msgstr "Доступ URL" #: src/dialogs/confdialog.cxx:20164 msgid "Enter METAR data internet URL" msgstr "Ввести МЕТАР данные, URL-адрес" #: src/dialogs/confdialog.cxx:20170 msgid "Default URL" msgstr "URL по умолчанию" #: src/dialogs/confdialog.cxx:20173 msgid "METAR station ID code" msgstr "ID коды METAR станций" #: src/dialogs/confdialog.cxx:20174 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" "Например 1) UUEE 2) 161500Z 3) 07008MPS 4) 9999 5) \n" "DRSN 6) SKC 7) M17/M23 8) Q1028 9) NOSIG 10) RMK 11)" #: src/dialogs/confdialog.cxx:20179 msgid "Search on web" msgstr "Поиск по сети" #: src/dialogs/confdialog.cxx:20182 msgid "Full report" msgstr "Полный рапорт" #: src/dialogs/confdialog.cxx:20183 src/dialogs/confdialog.cxx:20237 msgid "Insert full METAR report" msgstr "Вставить полныйl METAR рапорт" #: src/dialogs/confdialog.cxx:20188 msgid "METAR station location" msgstr "расположение METAR станции" #: src/dialogs/confdialog.cxx:20189 msgid "Add geopolitical name of METAR station" msgstr "Добавить название станции METAR " #: src/dialogs/confdialog.cxx:20194 msgid "Conditions" msgstr "Условия" #: src/dialogs/confdialog.cxx:20195 msgid "current wx conditions" msgstr "текущие условия WX" #: src/dialogs/confdialog.cxx:20200 msgid "Fahrenheit" msgstr "Фаренгейт" #: src/dialogs/confdialog.cxx:20201 msgid "report Fahrenheit" msgstr "отчет по Фаренгейту" #: src/dialogs/confdialog.cxx:20206 msgid "Celsius" msgstr "Цельсия" #: src/dialogs/confdialog.cxx:20207 msgid "report Celsius" msgstr "отчет по Цельсию" #: src/dialogs/confdialog.cxx:20212 msgid "Miles / Hour" msgstr "Миль / час" #: src/dialogs/confdialog.cxx:20213 msgid "report miles per hour" msgstr "отчет миль в час" #: src/dialogs/confdialog.cxx:20218 msgid "kilometers / hour" msgstr "км / час" #: src/dialogs/confdialog.cxx:20219 msgid "report kilometers per hour" msgstr "Отчет километров в час" #: src/dialogs/confdialog.cxx:20224 msgid "Inches Hg." msgstr "Дюймы ртут столба." #: src/dialogs/confdialog.cxx:20225 msgid "report inches mercury" msgstr "дюймов отчет о ртутном столбе" #: src/dialogs/confdialog.cxx:20230 msgid "mbars" msgstr "мбар" #: src/dialogs/confdialog.cxx:20231 msgid "report millibars" msgstr "отчет миллибар " #: src/dialogs/confdialog.cxx:20236 msgid "Unprocessed METAR data" msgstr "" #: src/dialogs/confdialog.cxx:20254 msgid "Restore defaults" msgstr "По умолчанию" #: src/dialogs/confdialog.cxx:20255 msgid "WARNING - this will over write ALL settings" msgstr "ВНИМАНИЕ - будут перезаписаны все настройки" #: src/dialogs/font_browser.cxx:77 msgid "Font color" msgstr "Цвет шрифта" #: src/dialogs/font_browser.cxx:150 msgid "Font:" msgstr "Шрифт:" #: src/dialogs/font_browser.cxx:155 msgid "Size:" msgstr "Размер:" #: src/dialogs/font_browser.cxx:165 msgid "Fixed" msgstr "" #: src/dialogs/font_browser.cxx:169 msgid "&OK" msgstr "" #: src/dialogs/font_browser.cxx:184 msgid "" "abcdefghijklmnopqrstuvwxyz\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" "0123456789" msgstr "" #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Источники файлов данных" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Обновление файлов данных" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Источники данных" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Источник данных" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Хранилище баз данных" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "Обновить выбранные локальные файлы данных из репозитория" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Удалить локальные файлы данных, если выбран." #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Событие" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "DXCC объекты" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Показать объекты DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Не работал раньше" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "LotW пользователь" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "eQSL пользователь" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Дубль" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Игнорировать дубли" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "в:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Время (сек)" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Действие" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Минимальное время между событиями" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Показать окно предупреждения" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Вставить текст по умолчанию" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Скрыть окно после (сек):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Добавить к тексту RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Добавить к тексту TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Показать макро редактор" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Запустить программу:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "DXCC клубы" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Найти страну" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Вернуться для продолжения поиска" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Найти префикс" #: src/logbook/lgbook.cxx:615 msgid "Export Setup" msgstr "Установки экспорта" #: src/logbook/lgbook.cxx:616 src/logbook/lgbook.cxx:1631 msgid "Select Records to Export" msgstr "Выбрать запись для экпорта" #: src/logbook/lgbook.cxx:624 src/logbook/lgbook.cxx:825 #: src/logbook/lgbook.cxx:1639 src/logbook/lgbook.cxx:1721 msgid "Check All" msgstr "Отметить всё" #: src/logbook/lgbook.cxx:627 msgid "Start Date" msgstr "Дата начала" #: src/logbook/lgbook.cxx:628 msgid "Start date for export" msgstr "Дата начала экспорта" #: src/logbook/lgbook.cxx:641 msgid "Stop Date" msgstr "Стоп Дата" #: src/logbook/lgbook.cxx:642 msgid "Inclusive stop date for export" msgstr "Стоп-дата включительно" #: src/logbook/lgbook.cxx:655 msgid "select by date" msgstr "выбрать по дате" #: src/logbook/lgbook.cxx:656 #, fuzzy msgid "Enable to select date range" msgstr "Включить, чтобы выбрать диапазон дат" #: src/logbook/lgbook.cxx:662 msgid "Select Fields to Export" msgstr "Выбор полей для экспорта" #: src/logbook/lgbook.cxx:673 src/logbook/lgbook.cxx:1670 msgid "Freq" msgstr "Частота" #: src/logbook/lgbook.cxx:684 msgid "QSO Date On" msgstr "QSO Date On" #: src/logbook/lgbook.cxx:688 msgid "QSO Date Off" msgstr "QSO Date Off" #: src/logbook/lgbook.cxx:692 msgid "Time ON" msgstr "Time ON" #: src/logbook/lgbook.cxx:696 src/logbook/lgbook.cxx:1682 msgid "Time OFF" msgstr "Time OFF" #: src/logbook/lgbook.cxx:699 msgid "TX Power" msgstr "Выходная мощность" #: src/logbook/lgbook.cxx:702 src/logbook/lgbook.cxx:1686 msgid "RST sent" msgstr "RST переданный" #: src/logbook/lgbook.cxx:706 src/logbook/lgbook.cxx:1690 msgid "RST rcvd" msgstr "RST полученный" #: src/logbook/lgbook.cxx:710 src/logbook/lgbook.cxx:1003 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:713 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:719 src/logbook/lgbook.cxx:1367 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:722 src/logbook/lgbook.cxx:1243 msgid "Station Call" msgstr "Позывной корреспондента" #: src/logbook/lgbook.cxx:725 src/logbook/lgbook.cxx:1267 msgid "Station QTH" msgstr "QTH корреспондента" #: src/logbook/lgbook.cxx:728 msgid "Station LOC" msgstr "Локатор корреспондента" #: src/logbook/lgbook.cxx:740 src/logbook/lgbook.cxx:1224 msgid "Notes" msgstr "Примечание" #: src/logbook/lgbook.cxx:743 msgid "QSL rcvd date" msgstr "Дата получения QSL" #: src/logbook/lgbook.cxx:746 msgid "QSL sent date" msgstr "Дата отправки QSL" #: src/logbook/lgbook.cxx:749 #, fuzzy msgid "eQSL rcvd date" msgstr "Дата получения QSL" #: src/logbook/lgbook.cxx:752 #, fuzzy msgid "eQSL sent date" msgstr "Дата отправки QSL" #: src/logbook/lgbook.cxx:755 #, fuzzy msgid "LoTW rcvd date" msgstr "Дата получения QSL" #: src/logbook/lgbook.cxx:758 #, fuzzy msgid "LoTW sent date" msgstr "Дата отправки QSL" #: src/logbook/lgbook.cxx:761 src/logbook/lgbook.cxx:1132 msgid "QSL-VIA" msgstr "QSL через.." #: src/logbook/lgbook.cxx:764 src/logbook/lgbook.cxx:1694 msgid "Serial # in" msgstr "Принятый сер. номер" #: src/logbook/lgbook.cxx:767 src/logbook/lgbook.cxx:1698 msgid "Serial # out" msgstr "Переданный сер. номер" #: src/logbook/lgbook.cxx:776 src/logbook/lgbook.cxx:1706 msgid "Exchange Out" msgstr "Переданный рапорт" #: src/logbook/lgbook.cxx:785 src/logbook/lgbook.cxx:1174 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:788 src/logbook/lgbook.cxx:1210 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:791 src/logbook/lgbook.cxx:1162 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:794 src/logbook/lgbook.cxx:1198 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:797 msgid "FD class" msgstr "FD class" #: src/logbook/lgbook.cxx:800 msgid "FD section" msgstr "FD section" #: src/logbook/lgbook.cxx:803 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:804 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:807 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:808 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:811 msgid "CW SS Check" msgstr "" #: src/logbook/lgbook.cxx:814 #, fuzzy msgid "CW SS Section" msgstr "Раздел" #: src/logbook/lgbook.cxx:815 src/logbook/lgbook.cxx:819 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:818 src/logbook/lgbook.cxx:1379 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:844 msgid "Logbook" msgstr "Журнал" #: src/logbook/lgbook.cxx:845 msgid "Date On" msgstr "Date On" #: src/logbook/lgbook.cxx:846 msgid "Date QSO started" msgstr "Дата начала QSO" #: src/logbook/lgbook.cxx:858 msgid "Time On" msgstr "Время начала" #: src/logbook/lgbook.cxx:859 msgid "Time QSO started" msgstr "Время начала QSO" #: src/logbook/lgbook.cxx:871 msgid "Call sign worked" msgstr "Позывной корреспондента" #: src/logbook/lgbook.cxx:883 msgid "Operator worked" msgstr "Корреспондент" #: src/logbook/lgbook.cxx:894 msgid "In" msgstr "In" #: src/logbook/lgbook.cxx:895 msgid "Rst received" msgstr "Принятый RST" #: src/logbook/lgbook.cxx:906 msgid "Recs" msgstr "Записи" #: src/logbook/lgbook.cxx:907 msgid "# Records in logbook" msgstr "# Записать в журнал" #: src/logbook/lgbook.cxx:918 msgid "Date Off" msgstr "Date Off" #: src/logbook/lgbook.cxx:919 msgid "Date QSO Ended" msgstr "Дата окончания QSO" #: src/logbook/lgbook.cxx:931 msgid "Time Off" msgstr "Время конца" #: src/logbook/lgbook.cxx:932 msgid "Time QSO ended" msgstr "Время окончания QSO" #: src/logbook/lgbook.cxx:943 msgid "Freq." msgstr "" #: src/logbook/lgbook.cxx:944 msgid "Frequency in MHz" msgstr "Частота в MHz" #: src/logbook/lgbook.cxx:956 msgid "Mode in use" msgstr "Используемый режим" #: src/logbook/lgbook.cxx:967 msgid "Pwr" msgstr "Pwr" #: src/logbook/lgbook.cxx:968 msgid "Transmit power used" msgstr "Использовать усилитель" #: src/logbook/lgbook.cxx:979 msgid "Loc" msgstr "" #: src/logbook/lgbook.cxx:980 msgid "Stations grid square" msgstr "Сетка станций" #: src/logbook/lgbook.cxx:991 msgid "Out" msgstr "Out" #: src/logbook/lgbook.cxx:992 msgid "Rst sent" msgstr "Переданный RST" #: src/logbook/lgbook.cxx:1004 msgid "City of station worked" msgstr "Сработанные города" #: src/logbook/lgbook.cxx:1015 msgid "St" msgstr "" #: src/logbook/lgbook.cxx:1016 msgid "US state of station worked" msgstr "Сработанные штаты" #: src/logbook/lgbook.cxx:1027 msgid "Pr" msgstr "" #: src/logbook/lgbook.cxx:1028 msgid "Province of station worked" msgstr "Сработанные провинции" #: src/logbook/lgbook.cxx:1040 msgid "Country of station worked" msgstr "Страна работающей станции" #: src/logbook/lgbook.cxx:1053 msgid "QSL" msgstr "QSL" #: src/logbook/lgbook.cxx:1054 msgid "QSL-rcvd" msgstr "QSL-получено" #: src/logbook/lgbook.cxx:1055 src/logbook/lgbook.cxx:1068 #: src/logbook/lgbook.cxx:1081 msgid "QSL received on this date" msgstr "Полученные QSL в эту дату" #: src/logbook/lgbook.cxx:1067 msgid "EQSL-rcvd" msgstr "EQSL получено" #: src/logbook/lgbook.cxx:1080 msgid "LOTW-rcvd" msgstr "LOTW получено" #: src/logbook/lgbook.cxx:1093 msgid "QSL-sent" msgstr "QSL-отправлено" #: src/logbook/lgbook.cxx:1094 src/logbook/lgbook.cxx:1107 #: src/logbook/lgbook.cxx:1120 msgid "QSL sent on this date" msgstr "Отправленные QSL в эту дату" #: src/logbook/lgbook.cxx:1106 msgid "EQSL-sent" msgstr "EQSL Отправлено" #: src/logbook/lgbook.cxx:1119 msgid "LOTW-sent" msgstr "Отправлено LOTW" #: src/logbook/lgbook.cxx:1133 msgid "QSL route of contacted station" msgstr "Адрес QSL бюро" #: src/logbook/lgbook.cxx:1163 msgid "Islands on the air" msgstr "Острова в эфире" #: src/logbook/lgbook.cxx:1186 msgid "Cont'" msgstr "Континент" #: src/logbook/lgbook.cxx:1211 msgid "DXCC designator" msgstr "Обозначение DXCC" #: src/logbook/lgbook.cxx:1227 src/logbook/lgbook.cxx:1244 #: src/logbook/lgbook.cxx:1256 src/logbook/lgbook.cxx:1268 #: src/logbook/lgbook.cxx:1280 msgid "Interesting notes" msgstr "Интересные заметки" #: src/logbook/lgbook.cxx:1241 msgid "My Station" msgstr "Моя станция" #: src/logbook/lgbook.cxx:1279 msgid "Station Locator" msgstr "Локатор станции" #: src/logbook/lgbook.cxx:1295 msgid "Ser out" msgstr "Переданный номер" #: src/logbook/lgbook.cxx:1296 src/logbook/lgbook.cxx:1421 msgid "Contest seral # sent" msgstr "Переданный номер" #: src/logbook/lgbook.cxx:1307 msgid "Exch Out" msgstr "Переданный номер" #: src/logbook/lgbook.cxx:1308 src/logbook/lgbook.cxx:1445 msgid "Contest exchange sent" msgstr "Принятый номер" #: src/logbook/lgbook.cxx:1319 msgid "Ser in" msgstr "Принятый номер" #: src/logbook/lgbook.cxx:1320 msgid "Contest serial # received" msgstr "Принятый номер" #: src/logbook/lgbook.cxx:1331 msgid "Exch In" msgstr "Принятый номер" #: src/logbook/lgbook.cxx:1332 src/logbook/lgbook.cxx:1457 msgid "Contest exchange received" msgstr "Принятый номер" #: src/logbook/lgbook.cxx:1344 #, fuzzy msgid "Field Day class received" msgstr "Field Day Class" #: src/logbook/lgbook.cxx:1355 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1356 #, fuzzy msgid "Field Section received" msgstr "Раздел полевого дня" #: src/logbook/lgbook.cxx:1368 #, fuzzy msgid "Operators age received" msgstr "Имена операторов" #: src/logbook/lgbook.cxx:1380 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1392 #, fuzzy msgid "Operating band" msgstr "Оператор" #: src/logbook/lgbook.cxx:1404 #, fuzzy msgid "Check value received" msgstr "Принятый номер" #: src/logbook/lgbook.cxx:1417 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1418 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1420 #, fuzzy msgid "Ser NoR" msgstr "Переданный номер" #: src/logbook/lgbook.cxx:1444 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1470 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1471 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1473 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1474 #, fuzzy msgid "Sent troop number" msgstr "Выберите номера контактов" #: src/logbook/lgbook.cxx:1485 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1486 #, fuzzy msgid "Received troop number" msgstr "Принятый сер. номер" #: src/logbook/lgbook.cxx:1497 #, fuzzy msgid "Name-S" msgstr "Имя" #: src/logbook/lgbook.cxx:1498 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1509 #, fuzzy msgid "Name-R" msgstr "Имя" #: src/logbook/lgbook.cxx:1510 #, fuzzy msgid "Received scout name" msgstr "Использование приема" #: src/logbook/lgbook.cxx:1526 msgid "Call Search" msgstr "Искать позывной" #: src/logbook/lgbook.cxx:1527 msgid "Search for this callsign" msgstr "Искать этот позывной" #: src/logbook/lgbook.cxx:1539 msgid "Find previous" msgstr "Найти предыдущее" #: src/logbook/lgbook.cxx:1547 msgid "Find next" msgstr "Найти далее" #: src/logbook/lgbook.cxx:1554 msgid "Retrieve" msgstr "Извлечь" #: src/logbook/lgbook.cxx:1555 msgid "Retrieve for active modem use" msgstr "Извлечь для использования модема" #: src/logbook/lgbook.cxx:1568 msgid "New record / Save record" msgstr "Новая запись / Сохранить запись" #: src/logbook/lgbook.cxx:1575 msgid "Update the current record" msgstr "Обновить текущую запись" #: src/logbook/lgbook.cxx:1582 msgid "Delete the current record" msgstr "Удалить текущую запись" #: src/logbook/lgbook.cxx:1588 msgid "File:" msgstr "Файл:" #: src/logbook/lgbook.cxx:1611 msgid "Date" msgstr "Дата" #: src/logbook/lgbook.cxx:1613 msgid "Time" msgstr "Время" #: src/logbook/lgbook.cxx:1630 msgid "Cabrillo Setup" msgstr "Установки Cabrillo" #: src/logbook/lgbook.cxx:1650 msgid "Select Cabrillo Contest & Fields" msgstr "Выберите Контест и поля Cabrillo" #: src/logbook/lgbook.cxx:1653 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1678 msgid "QSO Date" msgstr "QSO Дата" #~ msgid "Searches passband" #~ msgstr "Полоса поиска" #~ msgid "Lighted button enabled colors" #~ msgstr "Цвет индикаторов на кнопках" #, fuzzy #~ msgid "All Others" #~ msgstr "Прочее" #~ msgid "Receive modes" #~ msgstr "Режимы приема" #, fuzzy #~ msgid "Transceiver FSK" #~ msgstr "Управление трансивером" #, fuzzy #~ msgid "NBEMS interface" #~ msgstr "Интерфейс" #~ msgid "Signal level" #~ msgstr "Уровень сигнала" #, fuzzy #~ msgid "Filter Settings" #~ msgstr "Фильтрация" #, fuzzy #~ msgid "Filter center frequ ency" #~ msgstr "Добавить текущую частоту" #, fuzzy #~ msgid "Filter low cutoff frequency" #~ msgstr "Отрегулируйте частоту курсора" #, fuzzy #~ msgid "Filter high cutoff frequency" #~ msgstr "Повернуть дисплей выше по частоте" #, fuzzy #~ msgid "track WF cursor" #~ msgstr "Частота трека" #, fuzzy #~ msgid "Rx audio volume" #~ msgstr "Аудит лога" #, fuzzy #~ msgid "Filtered audio" #~ msgstr "Полосовой фильтр" #, fuzzy #~ msgid "Enable DSP filtering of rx audio stream" #~ msgstr "Вкл текстовый поток rx" #~ msgid "Weather Fax Image RX" #~ msgstr "RX Погодных факсов" #~ msgid "No file name given" #~ msgstr "Не указано Имя файла" #~ msgid "channels != 1" #~ msgstr "channels != 1" #~ msgid "unknown wave file error" #~ msgstr "неизвестный Wave файл" #~ msgid "Rig control" #~ msgstr "RIG контроль" #~ msgid "Flrig I/O" #~ msgstr "Flrig I/O" #~ msgid "RPC" #~ msgstr "RPC" #~ msgid "Spotter" #~ msgstr "Spotter" #~ msgid "KISS control" #~ msgstr "KISS control" #~ msgid "Mac Logger" #~ msgstr "Mac Logger" #~ msgid "Log sources" #~ msgstr "Источники лога" #~ msgid "Change log level" #~ msgstr "Уровень изменений лога" #, fuzzy #~ msgid "Waveform Audio Format]\t*.{mp3,wav}\n" #~ msgstr "" #~ "Формат аудио звука\t*.wav\n" #~ "AU\t*.{au,snd}\n" #, fuzzy #~ msgid "Waveform Audio Format\t*.wav\n" #~ msgstr "" #~ "Формат аудио звука\t*.wav\n" #~ "AU\t*.{au,snd}\n" #~ msgid "Free Lossless Audio Codec\t*.flac" #~ msgstr "Lossless Аудио кодек\t*.flac" #~ msgid "Embedded Wefax Gui" #~ msgstr "Встроенный интерфейс Wefax" #~ msgid "" #~ "Display tx and rx in main fldigi window.\n" #~ "Change requires restart of fldigi" #~ msgstr "" #~ "Дисплей TX и RX в главном окне программы fldigi.\n" #~ "Изменение требует перезагрузки fldigi" #~ msgid "Hide Transmission window" #~ msgstr "Скрыть окно передачи" #~ msgid "Hide transmission window by default." #~ msgstr "Скрыть окно передачи по умолчанию." #, fuzzy #~ msgid "Center freq (1500 Hz)" #~ msgstr "Центр частота" #~ msgid "Save image as monochrome file" #~ msgstr "Записать изображение как монохромное" #~ msgid "Save the fax image as a gray-level PNG file." #~ msgstr "Сохранить изображение в виде файла PNG" #, fuzzy #~ msgid "Misc/IO" #~ msgstr "Разное" #~ msgid "Retry Interval (msec)" #~ msgstr "Интервал повтора (msec)" #~ msgid "Msec's between retries" #~ msgstr "Милисекунд между повторами" #~ msgid "Reading fonts..." #~ msgstr "Чтение шрифтов ..." #~ msgid "User Interface" #~ msgstr "Интерфейс" #, fuzzy #~ msgid "Operating" #~ msgstr "Оператор" #, fuzzy #~ msgid "Active Modem" #~ msgstr "Режимы приема" #, fuzzy #~ msgid "CPU speed" #~ msgstr "AFC скорость" #, fuzzy #~ msgid "PSKmail" #~ msgstr "Pskmail" #~ msgid "WX" #~ msgstr "WX" #~ msgid "KML" #~ msgstr "KML" #~ msgid "IO" #~ msgstr "IO" #~ msgid "PSM" #~ msgstr "PSM" #, fuzzy #~ msgid "Contest/Logging" #~ msgstr "Журнал соревнований" #~ msgid "QRZ/eQSL" #~ msgstr "QRZ/eQSL" #~ msgid "Station / Operator" #~ msgstr "Станция / Оператор" #~ msgid "Log" #~ msgstr "Лог" #~ msgid "QSO" #~ msgstr "QSO" #~ msgid "WF Ctrls" #~ msgstr "Водопад" #~ msgid "Clrs/Fnts" #~ msgstr "Цвет/Шрифт" #~ msgid "Rx/Tx" #~ msgstr "Rx/Tx" #~ msgid "Tabs" #~ msgstr "Закладки" #~ msgid "Buttons" #~ msgstr "Кнопки" #~ msgid "SigLvl" #~ msgstr "Уровни сигнала" #~ msgid "Display" #~ msgstr "Дисплей" #~ msgid "Mouse" #~ msgstr "Мышь" #~ msgid "TX WPM" #~ msgstr "TX WPM" #~ msgid "Weight (%)" #~ msgstr "Вес (%)" #~ msgid "Dot to dot-space ratio" #~ msgstr "Соотношение точек" #~ msgid "Low filter cutoff" #~ msgstr "Частота среза ФНЧ" #~ msgid "Dom" #~ msgstr "Dom" #~ msgid "FSQ" #~ msgstr "FSQ" #~ msgid "IFKP" #~ msgstr "IFKP" #~ msgid "MT-63" #~ msgstr "MT-63" #~ msgid "Oliv" #~ msgstr "Oliv" #~ msgid "Cont" #~ msgstr "Cont" #~ msgid "PSK" #~ msgstr "PSK" #~ msgid "TTY" #~ msgstr "TTY" #~ msgid "Rx" #~ msgstr "Rx" #~ msgid "Tx" #~ msgstr "Tx" #~ msgid "Synop" #~ msgstr "Synop" #~ msgid "Thor" #~ msgstr "Thor" #~ msgid "Nav" #~ msgstr "Nav" #~ msgid "WFx" #~ msgstr "WFx" #~ msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" #~ msgstr "По умолчанию 800 Hz. Deutsche Wetterdienst 850Hz" #~ msgid "Received fax maximum rows number (5000)" #~ msgstr "Максимальное число принимаемых строк (5000)" #~ msgid "Maximum row number for a received fax image." #~ msgstr "Максимальное количество строк для изображения полученного факса." #~ msgid "Rig" #~ msgstr "Rig" #~ msgid "RigCAT" #~ msgstr "RigCAT" #~ msgid "GPIO" #~ msgstr "GPIO" #~ msgid "Devices" #~ msgstr "Устройства" #~ msgid "Wav" #~ msgstr "Wav" #, fuzzy #~ msgid "flmsg interface" #~ msgstr "Интерфейс" #~ msgid "ID" #~ msgstr "ID" #~ msgid "Open squelch for nn sec if RSID detected" #~ msgstr "Открыть шумодав через nn сек, если RSID обнаружен" #~ msgid "CPU" #~ msgstr "CPU" #~ msgid "PSK Reporter" #~ msgstr "PSK Reporter" #~ msgid "Weather query specification" #~ msgstr "Спецификация запросов погоды" #~ msgid "Temperature" #~ msgstr "температура" #~ msgid "Wind speed/dir" #~ msgstr "Скорость ветра" #~ msgid "Barometric pressure" #~ msgstr "Барометрическое давление" #~ msgid "eQSL" #~ msgstr "eQSL" #~ msgid "Use password for tqsl access" #~ msgstr "Использовать пароль для доступа к tqsl" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Настройка управления\n" #~ "через внешнюю программу\n" #~ "используя xmlrpc" #~ msgid "Use XML-RPC program" #~ msgstr "Использовать XML-RPC программу" #~ msgid "Experimental" #~ msgstr "Экспериментальный" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Инициализировать XML-RPC управление" #~ msgid "" #~ "Delay in seconds between \tLDT in iso-8601 format" #~ msgstr "\tLDT in iso-8601 format" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT в формате iso-8601" #~ msgid "\tUTC datetime" #~ msgstr "\tвремя в формате UTC" #~ msgid "User Interface - Browser" #~ msgstr "Интерфейс браузера" #~ msgid "User Interface - General" #~ msgstr "Интерфейс - главное" #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Интерфейс - цвет/Шрифт" #~ msgid "User Interface - Contest" #~ msgstr "Интерфейс - Контест" #~ msgid "User Interface - Macros" #~ msgstr "Интерфейс - Макросы" #~ msgid "User Interface - Waterfall controls" #~ msgstr "Интерфейс водопада" #~ msgid "Rig Control using xml spec file" #~ msgstr "Управление Rig с помощью файла специального xml файла" #~ msgid "Callsign database" #~ msgstr "База позывных" #~ msgid "Program to Program Communications" #~ msgstr "Программа для коммуникационной программы" #~ msgid "Power Signal Monior" #~ msgstr "Монитор мощности сигнала" #~ msgid "Revert" #~ msgstr "Вернуться" #~ msgid "Reset rigCAT interface" #~ msgstr "Сбросить интерфейс rigCAT" #~ msgid "Reset hamlib interface" #~ msgstr "Сбросить hamlib интерфейс" fldigi-4.2.05/po/fr.po0000664000175000017500000072444514611714003011365 00000000000000# French translations for fldigi package # Traductions françaises du paquet fldigi. # Copyright (C) 2008 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Stephane Fillod , 2009-2010. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.01\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2024-04-23 06:14-0500\n" "PO-Revision-Date: 2010-03-06 13:04+0200\n" "Last-Translator: Bernard Seront, F4GAR \n" "Language-Team: French\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: src/main.cxx:1052 #, c-format msgid "%s log started on %s" msgstr "%s log démarré le %s" #: src/main.cxx:1779 msgid "Bad modem id" msgstr "Mauvais id modem" #: src/main.cxx:1786 #, fuzzy msgid "Bad frequency" msgstr "Mauvaise Fréquence" #: src/main.cxx:1909 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licence GPLv3+: GNU GPL version 3 ou ultérieure \n" "Ceci est un logiciel libre : vous êtes libre de le modifier et de le " "redistribuer.\n" "Ce logiciel n'offre pas d'autre garantie que celle imposée par la loi.\n" #: src/main.cxx:2136 src/main.cxx:2178 src/main.cxx:2202 src/main.cxx:2216 #, fuzzy msgid "Could not make directory " msgstr "Ne peut pas créer le répertoire" #: src/debug/debug.cxx:88 msgid "Quiet" msgstr "Calme" #: src/debug/debug.cxx:88 msgid "Error" msgstr "Erreur" #: src/debug/debug.cxx:88 msgid "Warning" msgstr "Avertissement" #: src/debug/debug.cxx:88 msgid "Info" msgstr "Info" #: src/debug/debug.cxx:88 msgid "Verbose" msgstr "" #: src/debug/debug.cxx:88 src/dialogs/confdialog.cxx:15244 msgid "Debug" msgstr "Débug" #: src/dialogs/fl_digi.cxx:202 msgid "Log all RX/TX text" msgstr "Loguer tout le texte RX/TX" #: src/dialogs/fl_digi.cxx:204 src/dialogs/fl_digi.cxx:7622 msgid "Op &Mode" msgstr "&Mode Op" #: src/dialogs/fl_digi.cxx:205 msgid "Show fewer modes" msgstr "Montrer moins de modes" #: src/dialogs/fl_digi.cxx:206 msgid "Show all modes" msgstr "Montrer moins demodes" #: src/dialogs/fl_digi.cxx:210 msgid "&View" msgstr "&Vue" #: src/dialogs/fl_digi.cxx:211 #, fuzzy msgid "MFSK Image" msgstr "Image &MFSK" #: src/dialogs/fl_digi.cxx:212 msgid "THOR Raw Image" msgstr "" #: src/dialogs/fl_digi.cxx:213 #, fuzzy msgid "IFKP Raw Image" msgstr "Image &MFSK" #: src/dialogs/fl_digi.cxx:214 #, fuzzy msgid "Weather Fax Image TX" msgstr "Image Fax Météo TX" #: src/dialogs/fl_digi.cxx:215 src/dialogs/confdialog.cxx:10746 #: src/logbook/lgbook.cxx:1293 msgid "Contest" msgstr "Concours" #: src/dialogs/fl_digi.cxx:216 msgid "C&ountries" msgstr "Pa&ys" #: src/dialogs/fl_digi.cxx:217 msgid "&UI" msgstr "" #: src/dialogs/fl_digi.cxx:218 msgid "Full" msgstr "Tous" #: src/dialogs/fl_digi.cxx:219 msgid "Partial" msgstr "" #: src/dialogs/fl_digi.cxx:220 src/waterfall/waterfall.cxx:2595 #: src/dialogs/confdialog.cxx:9908 src/dialogs/confdialog.cxx:9997 #: src/dialogs/confdialog.cxx:19028 msgid "None" msgstr "Aucun" #: src/dialogs/fl_digi.cxx:221 msgid "Docked scope" msgstr "Scope permanent" #: src/dialogs/fl_digi.cxx:222 msgid "Minimal controls" msgstr "Contrôle minimal" #: src/dialogs/fl_digi.cxx:223 #, fuzzy msgid "Show channels" msgstr "Montrer Canaux" #: src/dialogs/fl_digi.cxx:225 msgid "Connect to server" msgstr "Connecter au serveur" #: src/dialogs/fl_digi.cxx:1050 src/dialogs/fl_digi.cxx:1079 #: src/dialogs/fl_digi.cxx:1089 src/dialogs/fl_digi.cxx:5976 #: src/dialogs/fl_digi.cxx:6069 src/dialogs/fl_digi.cxx:6146 #: src/dialogs/fl_digi.cxx:7650 src/dialogs/fl_digi.cxx:7719 #: src/dialogs/fl_digi.cxx:7796 msgid "Custom..." msgstr "Personnalisé..." #: src/dialogs/fl_digi.cxx:1147 src/dialogs/confdialog.cxx:369 #: src/dialogs/confdialog.cxx:10673 src/dialogs/confdialog.cxx:10739 #, fuzzy msgid "Colors-Fonts" msgstr "Couleurs && Polices" #: src/dialogs/fl_digi.cxx:1148 src/dialogs/confdialog.cxx:370 #: src/dialogs/confdialog.cxx:11067 #, fuzzy msgid "Contests" msgstr "Concours" #: src/dialogs/fl_digi.cxx:1149 src/dialogs/confdialog.cxx:371 #: src/dialogs/confdialog.cxx:11338 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:1150 src/dialogs/confdialog.cxx:372 #: src/dialogs/confdialog.cxx:11810 src/dialogs/confdialog.cxx:11896 #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14240 msgid "Logging" msgstr "" #: src/dialogs/fl_digi.cxx:1151 #, fuzzy msgid "Modem/CW" msgstr "Modem" #: src/dialogs/fl_digi.cxx:1152 #, fuzzy msgid "Modem/TTY" msgstr "Modem" #: src/dialogs/fl_digi.cxx:1153 src/waterfall/waterfall.cxx:2597 #: src/dialogs/confdialog.cxx:373 msgid "Modem" msgstr "Modem" #: src/dialogs/fl_digi.cxx:1154 src/dialogs/confdialog.cxx:374 #: src/dialogs/confdialog.cxx:17169 msgid "Misc" msgstr "Divers" #: src/dialogs/fl_digi.cxx:1155 src/dialogs/confdialog.cxx:375 #: src/dialogs/confdialog.cxx:18303 src/dialogs/confdialog.cxx:18366 #, fuzzy msgid "Rig Control" msgstr "Contrôle radio" #: src/dialogs/fl_digi.cxx:1156 src/dialogs/confdialog.cxx:376 #: src/dialogs/confdialog.cxx:18974 #, fuzzy msgid "Soundcard" msgstr "Carte Son" #: src/dialogs/fl_digi.cxx:1157 src/dialogs/confdialog.cxx:377 #: src/dialogs/confdialog.cxx:19497 msgid "UI" msgstr "" #: src/dialogs/fl_digi.cxx:1158 src/dialogs/fl_digi.cxx:6238 #: src/dialogs/confdialog.cxx:378 src/dialogs/confdialog.cxx:13939 #: src/dialogs/confdialog.cxx:20045 msgid "Waterfall" msgstr "Chute d'eau" #: src/dialogs/fl_digi.cxx:1159 src/dialogs/confdialog.cxx:379 #: src/dialogs/confdialog.cxx:20245 msgid "Web" msgstr "" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4547 msgid "Save changed macros?" msgstr "Sauvegarder les macros modifiées?" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4134 #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 #: src/logbook/logsupport.cxx:1205 src/misc/configuration.cxx:726 #: src/dialogs/font_browser.cxx:173 src/logbook/lgbook.cxx:837 #: src/logbook/lgbook.cxx:1647 msgid "Cancel" msgstr "Annuler" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:6250 #: src/logbook/logsupport.cxx:330 src/logbook/logsupport.cxx:1204 #: src/dialogs/confdialog.cxx:13194 src/dialogs/confdialog.cxx:15191 #: src/dialogs/confdialog.cxx:20248 msgid "Save" msgstr "Sauvegarder" #: src/dialogs/fl_digi.cxx:1622 msgid "Don't save" msgstr "Ne pas sauvegarder" #: src/dialogs/fl_digi.cxx:1771 msgid "Switch to ARQ I/O" msgstr "" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "No" msgstr "Non" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "Yes" msgstr "Oui" #: src/dialogs/fl_digi.cxx:2630 msgid "Playback continuous loop?" msgstr "" #: src/dialogs/fl_digi.cxx:2635 #, fuzzy msgid "Unsupported audio format" msgstr "Format non supporté" #: src/dialogs/fl_digi.cxx:2642 msgid "Spotting disabled" msgstr "Repérage désactivé" #: src/dialogs/fl_digi.cxx:2694 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Ehec de lancement du navigateur web:\n" "%s\n" "\n" "Ouvrez cette url manuellement:\n" "%s" #: src/dialogs/fl_digi.cxx:2707 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Echec d'ouverture d'url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2790 msgid "Checking for updates..." msgstr "Recherche des mises à jour..." #: src/dialogs/fl_digi.cxx:2794 #, fuzzy msgid "Update site not available" msgstr "Pas disponible" #: src/dialogs/fl_digi.cxx:2806 msgid "You are running the latest version" msgstr "Vous utilisez la dernière version" #: src/dialogs/fl_digi.cxx:2810 #, fuzzy msgid "You are probably running an alpha version " msgstr "Vous utilisez la dernière version" #: src/dialogs/fl_digi.cxx:2811 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2816 #, fuzzy, c-format msgid "Version %s is available at Source Forge" msgstr "" "La version %s est disponible chez\n" "\n" "%s\n" "\n" "Que voulez vous faire?" #: src/dialogs/fl_digi.cxx:2885 msgid "Sunspot creation underway!" msgstr "Création sunspot en cours!" #: src/dialogs/fl_digi.cxx:2892 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "Information sur le périphérique audio disponible uniquement pour PortAudio" #: src/dialogs/fl_digi.cxx:2901 msgid "Capture device" msgstr "Périph. capture" #: src/dialogs/fl_digi.cxx:2902 msgid "Playback device" msgstr "Périph. sortie" #: src/dialogs/fl_digi.cxx:2906 msgid "Capture and playback devices" msgstr "Périph de capture et sortie" #: src/dialogs/fl_digi.cxx:2952 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: N'existe pas, créer?" #: src/dialogs/fl_digi.cxx:4134 msgid "Clear log fields?" msgstr "Effacer champ de log?" #: src/dialogs/fl_digi.cxx:4134 src/misc/configuration.cxx:726 #: src/logbook/lgbook.cxx:834 src/logbook/lgbook.cxx:1644 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 msgid "Confirm" msgstr "Confirmer" #: src/dialogs/fl_digi.cxx:4539 #, fuzzy msgid "Save changed configuration?" msgstr "Sauvegarder la nouvelle configuration?" #: src/dialogs/fl_digi.cxx:4555 src/dialogs/fl_digi.cxx:4580 #, fuzzy msgid "Save log entry?" msgstr "Sauvegarder le fichier journal" #: src/dialogs/fl_digi.cxx:4571 #, fuzzy msgid "Confirm Quit" msgstr "Confirme la sortie" #: src/dialogs/fl_digi.cxx:4593 #, fuzzy msgid "Confirm quit?" msgstr "Confirmer la sortie?" #: src/dialogs/fl_digi.cxx:5915 src/dialogs/fl_digi.cxx:7618 msgid "&File" msgstr "&Fichier" #: src/dialogs/fl_digi.cxx:5917 msgid "Folders" msgstr "Dossiers" #: src/dialogs/fl_digi.cxx:5918 msgid "Fldigi config..." msgstr "Config Fldigi..." #: src/dialogs/fl_digi.cxx:5919 #, fuzzy msgid "FLMSG files..." msgstr "Fichiers FLMSG..." #: src/dialogs/fl_digi.cxx:5920 msgid "NBEMS files..." msgstr "Fichiers NBEMS..." #: src/dialogs/fl_digi.cxx:5921 #, fuzzy msgid "WEFAX images..." msgstr "Envoyer image..." #: src/dialogs/fl_digi.cxx:5922 #, fuzzy msgid "Data files..." msgstr "Fichiers de données..." #: src/dialogs/fl_digi.cxx:5925 msgid "Macros" msgstr "Macros" #: src/dialogs/fl_digi.cxx:5926 msgid "Open ..." msgstr "Ouvrir ..." #: src/dialogs/fl_digi.cxx:5927 msgid "Save ..." msgstr "Sauvegarder ..." #: src/dialogs/fl_digi.cxx:5930 #, fuzzy msgid "Config Scripts" msgstr "Control radio" #: src/dialogs/fl_digi.cxx:5931 msgid "Execute" msgstr "" #: src/dialogs/fl_digi.cxx:5932 #, fuzzy msgid "Generate" msgstr "Général" #: src/dialogs/fl_digi.cxx:5935 msgid "Text Capture" msgstr "Capture le texte" #: src/dialogs/fl_digi.cxx:5939 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5940 msgid "RX capture" msgstr "Capture RX" #: src/dialogs/fl_digi.cxx:5941 msgid "TX generate" msgstr "Génération TX" #: src/dialogs/fl_digi.cxx:5942 src/dialogs/confdialog.cxx:18737 msgid "Playback" msgstr "Sortie" #: src/dialogs/fl_digi.cxx:5945 src/dialogs/fl_digi.cxx:7619 msgid "Exit" msgstr "Quitter" #: src/dialogs/fl_digi.cxx:6203 src/dialogs/fl_digi.cxx:7832 msgid "&Configure" msgstr "&Configuration" #: src/dialogs/fl_digi.cxx:6205 src/dialogs/fl_digi.cxx:7833 #, fuzzy msgid "Config Dialog" msgstr "Confirmer" #: src/dialogs/fl_digi.cxx:6206 src/dialogs/fl_digi.cxx:7836 msgid "Save Config" msgstr "Sauvegarde Config" #: src/dialogs/fl_digi.cxx:6207 src/dialogs/fl_digi.cxx:7835 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notifications" #: src/dialogs/fl_digi.cxx:6208 src/dialogs/fl_digi.cxx:7834 msgid "Test Signals" msgstr "" #: src/dialogs/fl_digi.cxx:6213 src/dialogs/fl_digi.cxx:7840 #, fuzzy msgid "Rx Audio Dialog" msgstr "Audio" #: src/dialogs/fl_digi.cxx:6215 msgid "View/Hide Channels" msgstr "Montrer/Cacher canaux" #: src/dialogs/fl_digi.cxx:6216 #, fuzzy msgid "Signal browser" msgstr "Navigateur signal" #: src/dialogs/fl_digi.cxx:6218 #, fuzzy msgid "View/Hide 48 macros" msgstr "Montrer/Cacher canaux" #: src/dialogs/fl_digi.cxx:6220 msgid "DX Cluster" msgstr "" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/fl_digi.cxx:7843 msgid "Floating scope" msgstr "Scope flottant" #: src/dialogs/fl_digi.cxx:6223 src/dialogs/fl_digi.cxx:7842 msgid "Spectrum scope" msgstr "" #: src/dialogs/fl_digi.cxx:6232 #, fuzzy msgid "Rig/Log Controls" msgstr "Contrôle radio" #: src/dialogs/fl_digi.cxx:6245 msgid "&Logbook" msgstr "&Journal" #: src/dialogs/fl_digi.cxx:6246 #, fuzzy msgid "View" msgstr "&Vue" #: src/dialogs/fl_digi.cxx:6248 #, fuzzy msgid "Files" msgstr "&Fichier" #: src/dialogs/fl_digi.cxx:6249 src/dialogs/confdialog.cxx:17449 msgid "Open..." msgstr "Ouvrir..." #: src/dialogs/fl_digi.cxx:6251 src/logbook/logsupport.cxx:1213 #: src/logbook/lgbook.cxx:1567 msgid "New" msgstr "Nouveau" #: src/dialogs/fl_digi.cxx:6254 msgid "ADIF" msgstr "" #: src/dialogs/fl_digi.cxx:6255 #, fuzzy msgid "Merge..." msgstr "Fusion ..." #: src/dialogs/fl_digi.cxx:6256 msgid "Export..." msgstr "" #: src/dialogs/fl_digi.cxx:6259 src/logbook/lgbook.cxx:831 msgid "LoTW" msgstr "" #: src/dialogs/fl_digi.cxx:6261 msgid "Reports" msgstr "" #: src/dialogs/fl_digi.cxx:6262 #, fuzzy msgid "Text..." msgstr "Texte..." #: src/dialogs/fl_digi.cxx:6263 msgid "CSV..." msgstr "" #: src/dialogs/fl_digi.cxx:6264 msgid "Cabrillo..." msgstr "" #: src/dialogs/fl_digi.cxx:6269 msgid "Field Day Logging" msgstr "" #: src/dialogs/fl_digi.cxx:6274 src/dialogs/fl_digi.cxx:7852 msgid "&Help" msgstr "&Aide" #: src/dialogs/fl_digi.cxx:6277 msgid "Create sunspots" msgstr "Création sunspots" #: src/dialogs/fl_digi.cxx:6279 msgid "Beginners' Guide" msgstr "Guide Débutants" #: src/dialogs/fl_digi.cxx:6280 src/dialogs/fl_digi.cxx:7853 msgid "Online documentation..." msgstr "Documentation en ligne..." #: src/dialogs/fl_digi.cxx:6281 msgid "Fldigi web site..." msgstr "Site web Fldigi..." #: src/dialogs/fl_digi.cxx:6282 msgid "Reception reports..." msgstr "Rapport d'écoute..." #: src/dialogs/fl_digi.cxx:6283 msgid "Command line options" msgstr "Options de ligne de commande" #: src/dialogs/fl_digi.cxx:6284 msgid "Audio device info" msgstr "Info périphérique audio" #: src/dialogs/fl_digi.cxx:6285 msgid "Build info" msgstr "Info Build" #: src/dialogs/fl_digi.cxx:6286 src/dialogs/fl_digi.cxx:7854 msgid "Event log" msgstr "Historique événements" #: src/dialogs/fl_digi.cxx:6287 src/dialogs/fl_digi.cxx:7855 msgid "Check for updates..." msgstr "Rechercher des mises à jour..." #: src/dialogs/fl_digi.cxx:6288 src/dialogs/fl_digi.cxx:7856 msgid "&About" msgstr "À &propos" #: src/dialogs/fl_digi.cxx:6539 msgid "waterfall-only mode" msgstr "Mode chute d'eau-uniquement" #: src/dialogs/fl_digi.cxx:6541 msgid "NO CALLSIGN SET" msgstr "PAS D'INDICATIF" #: src/dialogs/fl_digi.cxx:6566 msgid "Close List" msgstr "Fermer la Liste" #: src/dialogs/fl_digi.cxx:6574 msgid "Open List" msgstr "Ouvrir la Liste" #: src/dialogs/fl_digi.cxx:6615 msgid "Clear list?" msgstr "Effacer la liste?" #: src/dialogs/fl_digi.cxx:6699 msgid "report" msgstr "report" #: src/dialogs/fl_digi.cxx:6699 msgid "reports" msgstr "reports" #: src/dialogs/fl_digi.cxx:6704 #, fuzzy msgid "Recent activity for grid " msgstr "Activité récente pour le carré" #: src/dialogs/fl_digi.cxx:7841 src/dialogs/Viewer.cxx:283 #, fuzzy msgid "Signal Browser" msgstr "Navigateur Signal" #: src/dialogs/fl_digi.cxx:8143 msgid "Scope" msgstr "Scope" #: src/dialogs/fl_digi.cxx:8234 msgid "Detected signal level" msgstr "Niveau de signal détecté" #: src/dialogs/fl_digi.cxx:8246 src/waterfall/waterfall.cxx:2596 msgid "Squelch level" msgstr "Niveau squelch" #: src/dialogs/fl_digi.cxx:8262 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Clic Gauche: change mode\n" "Clic Droit: configure" #: src/dialogs/fl_digi.cxx:8271 #, fuzzy msgid "CW transmit WPM" msgstr "WPM Transmission CW" #: src/dialogs/fl_digi.cxx:8280 msgid "Default WPM" msgstr "WPM par défaut" #: src/dialogs/fl_digi.cxx:8310 #, fuzzy msgid "Left click to toggle VuMeter" msgstr "Clic gauche pour sélectionner la couleur des Dup" #: src/dialogs/fl_digi.cxx:8316 #, fuzzy msgid "Left click to toggle Status Bar" msgstr "Clic gauche pour sélectionner la couleur des Dup" #: src/dialogs/fl_digi.cxx:8328 msgid "Tx level attenuator (dB)" msgstr "Niveau d'atténuation Tx (dB)" #: src/dialogs/fl_digi.cxx:8356 msgid "Automatic Frequency Control" msgstr "Contrôle Automatique de Fréquence" #: src/dialogs/fl_digi.cxx:8361 msgid "Squelch" msgstr "Squelch" #: src/dialogs/fl_digi.cxx:8366 msgid "Power Signal Monitor" msgstr "" #: src/dialogs/fl_digi.cxx:10682 #, fuzzy msgid "Delete entry?" msgstr "Sauvegarder le fichier journal" #: src/dialogs/fl_digi.cxx:10682 src/spot/notify.cxx:222 #: src/spot/notify.cxx:228 msgid "All" msgstr "Tous" #: src/dialogs/Viewer.cxx:287 msgid "Find: " msgstr "Cherche: " #: src/dialogs/Viewer.cxx:308 src/logbook/logsupport.cxx:324 #: src/logbook/logsupport.cxx:1063 src/misc/macroedit.cxx:504 #: src/mfsk/mfsk-pic.cxx:338 src/spot/notify.cxx:535 src/spot/notify.cxx:539 #: src/dialogs/confdialog.cxx:20251 msgid "Close" msgstr "Fermer" #: src/dialogs/Viewer.cxx:316 src/logbook/logsupport.cxx:327 #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:13484 #: src/dialogs/confdialog.cxx:14633 msgid "Clear" msgstr "Effacer" #: src/dialogs/Viewer.cxx:320 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Clic gauche pour effacer le texte\n" "Clic droit pour reset fréquences" #: src/dialogs/Viewer.cxx:326 msgid "Set Viewer Squelch" msgstr "Positionne le Squelch Visualiseur" #: src/logbook/logsupport.cxx:160 msgid "Export to CSV file" msgstr "Exporter vers un fichier CSV" #: src/logbook/logsupport.cxx:187 msgid "Export to fixed field text file" msgstr "Exporter vers un fichier à champs fixes" #: src/logbook/logsupport.cxx:215 msgid "Export to ADIF file" msgstr "Export vers fichier ADIF" #: src/logbook/logsupport.cxx:317 msgid "LoTW Review" msgstr "" #: src/logbook/logsupport.cxx:359 msgid "Save changed Logbook?" msgstr "Sauvegarder le journal modifié?" #: src/logbook/logsupport.cxx:380 #, fuzzy msgid "Create new logbook file" msgstr "Nouveau journal" #: src/logbook/logsupport.cxx:403 #, fuzzy, c-format msgid "%s exists, overwrite?" msgstr "%s: N'existe pas, créer?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Ouvrir le fichier journal" #: src/logbook/logsupport.cxx:472 msgid "Save logbook file" msgstr "Sauvegarde le fichier journal" #: src/logbook/logsupport.cxx:933 msgid "Database merger in progress" msgstr "" #: src/logbook/logsupport.cxx:939 msgid "Merge ADIF file" msgstr "Fusion fichier ADIF" #: src/logbook/logsupport.cxx:977 msgid "No records in lotw download file" msgstr "" #: src/logbook/logsupport.cxx:1057 msgid "Unmatched LoTW Records" msgstr "" #: src/logbook/logsupport.cxx:1092 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" #: src/logbook/logsupport.cxx:1214 src/spot/notify.cxx:206 #: src/spot/notify.cxx:533 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1574 msgid "Update" msgstr "Mise à jour" #: src/logbook/logsupport.cxx:1816 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Confirmer la suppression d'enregistrement pour \"%s\"?" #: src/logbook/logsupport.cxx:2330 msgid "Create cabrillo report" msgstr "Créer un rapport Cabrillo" #: src/logbook/logsupport.cxx:2570 msgid "LoTW download file" msgstr "" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Detecter les occurances de [WRAP:beg] et [WRAP:end]\n" "Sauvegarder les tags et tout le texte inclus vers un fichier taggé date-" "heure, ie:\n" " NBEMS.files \\WRAP\\recv\\extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Detecter les occurances de [WRAP:beg] et [WRAP:end]\n" "Sauvegarder les tags et tout le texte inclus vers un fichier taggé date-" "heure, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:286 src/logger/rx_extract.cxx:316 #, fuzzy msgid "Could not start flmsg" msgstr "Ne peut pas lancer flmsg" #: src/logger/rx_extract.cxx:414 src/logger/rx_extract.cxx:418 #: src/dialogs/confdialog.cxx:16379 msgid "Locate flmsg executable" msgstr "Rechercher l'exécutable flmsg" #: src/logger/rx_extract.cxx:414 msgid "flmsg.exe\t*.exe" msgstr "" #: src/logger/rx_extract.cxx:418 msgid "flmsg\t*" msgstr "" #: src/logger/rx_extract.cxx:492 msgid "Locate executable" msgstr "Rechercherl'exécutable" #: src/logger/rx_extract.cxx:492 msgid "*.exe" msgstr "" #: src/logger/rx_extract.cxx:495 #, fuzzy msgid "Locate binary" msgstr "Rechercher le binaire" #: src/logger/rx_extract.cxx:495 msgid "*" msgstr "" #: src/logger/speak.cxx:40 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Sauvegarder tout le texte reçu, un charactère àla fois dans le fichier " "suivant:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:539 msgid "Rig mode" msgstr "Mode Radio" #: src/misc/configuration.cxx:540 msgid "Always LSB" msgstr "Toujours LSB" #: src/misc/configuration.cxx:541 msgid "Always USB" msgstr "Toujours USB" #: src/misc/configuration.cxx:549 src/dialogs/confdialog.cxx:17915 #: src/dialogs/confdialog.cxx:18183 src/dialogs/confdialog.cxx:18185 #, fuzzy msgid "Rig Control/Hamlib" msgstr "Contrôle radio" #: src/misc/configuration.cxx:723 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Réinitialiser toutes les options?\n" "\n" "La réinitialisation des options sera effective au prochain démarrage\n" "Les fichiers: fldigi_def.xml et fldigi.prefs seront effacés!\n" #: src/misc/configuration.cxx:728 msgid "Confirm RESET" msgstr "Confirmer RESET" #: src/misc/macroedit.cxx:68 msgid "\tmy frequency" msgstr "\tma fréquence" #: src/misc/macroedit.cxx:69 msgid "\tmode" msgstr "\tmode" #: src/misc/macroedit.cxx:70 msgid "\tmy call" msgstr "\tmon indicatif" #: src/misc/macroedit.cxx:71 msgid "\tmy locator" msgstr "\tmon locator" #: src/misc/macroedit.cxx:72 msgid "\tmy name" msgstr "\tmon nom" #: src/misc/macroedit.cxx:73 #, fuzzy #| msgid "\tmy QTH" msgid "\tmy QTH (city)" msgstr "\tmon QTH" #: src/misc/macroedit.cxx:74 msgid "\tmy RST" msgstr "\tmon RST" #: src/misc/macroedit.cxx:75 #, fuzzy msgid "\tmy FD class" msgstr "\tmon indicatif" #: src/misc/macroedit.cxx:76 msgid "\tmy FD section" msgstr "" #: src/misc/macroedit.cxx:77 #, fuzzy msgid "\tmy state" msgstr "\tmon nom" #: src/misc/macroedit.cxx:78 #, fuzzy msgid "\tmy ST" msgstr "\tmon RST" #: src/misc/macroedit.cxx:79 msgid "\tmy county" msgstr "" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy CNTY" msgstr "\tmon QTH" #: src/misc/macroedit.cxx:81 msgid "\tmy antenna" msgstr "" #: src/misc/macroedit.cxx:82 msgid "\toperating band" msgstr "" #: src/misc/macroedit.cxx:83 #, fuzzy #| msgid "\ttransmit" msgid "\ttransmit power" msgstr "\ttransmets" #: src/misc/macroedit.cxx:84 msgid "\tFldigi version" msgstr "" #: src/misc/macroedit.cxx:85 msgid "\tdigital mode (adif)" msgstr "" #: src/misc/macroedit.cxx:88 msgid "\tother call" msgstr "\tindicatif de l'autre" #: src/misc/macroedit.cxx:89 msgid "\tother name" msgstr "\tnom de l'autre" #: src/misc/macroedit.cxx:90 msgid "\tother QTH" msgstr "\tQTH de l'autre" #: src/misc/macroedit.cxx:91 #, fuzzy msgid "\tother State" msgstr "\tRST de l'autre" #: src/misc/macroedit.cxx:92 #, fuzzy msgid "\tother Province" msgstr "\tnom de l'autre" #: src/misc/macroedit.cxx:93 msgid "\tother locator" msgstr "\tlocator de l'autre" #: src/misc/macroedit.cxx:94 msgid "\tother RST" msgstr "\tRST de l'autre" #: src/misc/macroedit.cxx:97 msgid "\tS/N etc." msgstr "" #: src/misc/macroedit.cxx:98 msgid "\tIMD etc." msgstr "" #: src/misc/macroedit.cxx:101 msgid "\t# QSO recs" msgstr "" #: src/misc/macroedit.cxx:102 msgid "\tnext QSO rec #" msgstr "" #: src/misc/macroedit.cxx:105 msgid "\tmap on google" msgstr "" #: src/misc/macroedit.cxx:106 msgid "\tmap by value" msgstr "" #: src/misc/macroedit.cxx:109 msgid "\tclear RX pane" msgstr "" #: src/misc/macroedit.cxx:110 #, fuzzy msgid "\tclear TX pane" msgstr "Efface champ de log?" #: src/misc/macroedit.cxx:111 #, fuzzy msgid "\tclear QSO fields" msgstr "Efface champ de log?" #: src/misc/macroedit.cxx:114 msgid "\ttext to NAME/QTH" msgstr "" #: src/misc/macroedit.cxx:118 msgid "\tDigitalk On, Off, Toggle" msgstr "" #: src/misc/macroedit.cxx:122 #, fuzzy msgid "\tclear log fields" msgstr "Efface champ de log?" #: src/misc/macroedit.cxx:123 msgid "\tsave QSO data" msgstr "" #: src/misc/macroedit.cxx:124 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:125 msgid "\tlog at xmt time" msgstr "" #: src/misc/macroedit.cxx:126 msgid "\tsaveQSO data, append msg to notes" msgstr "" #: src/misc/macroedit.cxx:127 msgid "\tlog eQSL" msgstr "" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL optional msg" msgstr "" #: src/misc/macroedit.cxx:131 msgid "\tQSO time (HHMM))" msgstr "" #: src/misc/macroedit.cxx:132 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "" #: src/misc/macroedit.cxx:133 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "" #: src/misc/macroedit.cxx:134 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:135 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "" #: src/misc/macroedit.cxx:136 msgid "\tlocal time, default %H%M" msgstr "" #: src/misc/macroedit.cxx:137 msgid "\tzulu time default %H%MZ" msgstr "" #: src/misc/macroedit.cxx:138 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "" #: src/misc/macroedit.cxx:139 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "" #: src/misc/macroedit.cxx:140 msgid "\tget weather data" msgstr "" #: src/misc/macroedit.cxx:141 msgid "\tget weather data for station" msgstr "" #: src/misc/macroedit.cxx:144 msgid "\tcontest counter" msgstr "" #: src/misc/macroedit.cxx:145 msgid "\tdecrement counter" msgstr "" #: src/misc/macroedit.cxx:146 msgid "\tincrement counter" msgstr "" #: src/misc/macroedit.cxx:147 msgid "\texchange in" msgstr "" #: src/misc/macroedit.cxx:148 msgid "\texchange out" msgstr "" #: src/misc/macroedit.cxx:149 msgid "\texchange begin" msgstr "" #: src/misc/macroedit.cxx:150 msgid "\texchange end" msgstr "" #: src/misc/macroedit.cxx:151 msgid "\tsave contest out" msgstr "" #: src/misc/macroedit.cxx:152 msgid "\tcurrent contest serno" msgstr "" #: src/misc/macroedit.cxx:153 msgid "\tlast serno sent" msgstr "" #: src/misc/macroedit.cxx:154 #, fuzzy msgid "\tFD class" msgstr "\tmon indicatif" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD section" msgstr "Numéro de série reçu." #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tcontest class" msgstr "\tmon indicatif" #: src/misc/macroedit.cxx:157 #, fuzzy msgid "
\tARRL section" msgstr "Numéro de série reçu." #: src/misc/macroedit.cxx:160 msgid "\treceive" msgstr "\treçois" #: src/misc/macroedit.cxx:161 msgid "\ttransmit" msgstr "\ttransmets" #: src/misc/macroedit.cxx:162 msgid "\ttoggle T/R" msgstr "" #: src/misc/macroedit.cxx:163 msgid "\tsearch UP for signal" msgstr "" #: src/misc/macroedit.cxx:164 msgid "\tsearch DOWN for signal" msgstr "" #: src/misc/macroedit.cxx:165 msgid "\treturn to sweet spot" msgstr "" #: src/misc/macroedit.cxx:166 msgid "\tmove to freq NNNN Hz" msgstr "" #: src/misc/macroedit.cxx:167 msgid "\tleft-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:168 msgid "\tright-clk QSY button" msgstr "" #: src/misc/macroedit.cxx:169 msgid "\tqsy to kHz, Hz" msgstr "" #: src/misc/macroedit.cxx:170 msgid "\tincr/decr xcvr freq" msgstr "" #: src/misc/macroedit.cxx:171 msgid "\tvalid xcvr mode" msgstr "" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr filter width" msgstr "" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr low cutoff filter" msgstr "" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr hi cutoff filter" msgstr "" #: src/misc/macroedit.cxx:175 msgid "\trig freq has kbd focus" msgstr "" #: src/misc/macroedit.cxx:178 msgid "\tinsert QRG into Rx text" msgstr "" #: src/misc/macroedit.cxx:181 msgid "\tinsert text file" msgstr "" #: src/misc/macroedit.cxx:182 #, fuzzy msgid "\tinsert image file" msgstr "Enregistrer fichier macros" #: src/misc/macroedit.cxx:183 msgid "\tsend avatar" msgstr "" #: src/misc/macroedit.cxx:186 #, fuzzy msgid "\tpause transmit" msgstr "\ttransmets" #: src/misc/macroedit.cxx:187 msgid "\tidle signal for NN.nn sec" msgstr "" #: src/misc/macroedit.cxx:188 msgid "\trepeat every NN sec" msgstr "" #: src/misc/macroedit.cxx:189 msgid "\trepeat after waiting NN sec" msgstr "" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution for" msgstr "" #: src/misc/macroedit.cxx:194 msgid "\tend execution at" msgstr "" #: src/misc/macroedit.cxx:195 msgid "\tuse local date/time" msgstr "" #: src/misc/macroedit.cxx:198 msgid "\t set xmt attenuator" msgstr "" #: src/misc/macroedit.cxx:201 msgid "\tCW identifier" msgstr "" #: src/misc/macroedit.cxx:202 msgid "\tsend mode ID; TX start only" msgstr "" #: src/misc/macroedit.cxx:203 msgid "\ttext at start of TX" msgstr "" #: src/misc/macroedit.cxx:204 msgid "\tvideo text in TX stream" msgstr "" #: src/misc/macroedit.cxx:205 msgid "\tTx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:206 msgid "\tRx RSID on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:207 msgid "\tTransmit |NN| successive RsID bursts" msgstr "" #: src/misc/macroedit.cxx:208 msgid "\t[Wait][Len](ms)" msgstr "" #: src/misc/macroedit.cxx:211 msgid "\tXmt audio wav file" msgstr "" #: src/misc/macroedit.cxx:214 msgid "" "" msgstr "" #: src/misc/macroedit.cxx:215 msgid "\talert using external wav file" msgstr "" #: src/misc/macroedit.cxx:218 msgid "\tCW QSK post-timing" msgstr "" #: src/misc/macroedit.cxx:219 msgid "\tCW QSK pre-timing" msgstr "" #: src/misc/macroedit.cxx:220 msgid "\tCW rise time" msgstr "" #: src/misc/macroedit.cxx:221 msgid "\tChar WPM:Text WPM (15.0:5.0)" msgstr "" #: src/misc/macroedit.cxx:224 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:225 msgid "\tsend CAT cmd" msgstr "" #: src/misc/macroedit.cxx:228 msgid "\tAFC on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:229 msgid "\tLOCK on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:230 msgid "\tRev on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:231 msgid "\tDigital Squelch on, off,toggle" msgstr "" #: src/misc/macroedit.cxx:232 msgid "\tDigital Squelch level, 0..100" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tchange macro defs file" msgstr "" #: src/misc/macroedit.cxx:236 #, fuzzy msgid "\tsave current macro file" msgstr "Enregistrer fichier macros" #: src/misc/macroedit.cxx:237 msgid "\trun macro from buffered teext" msgstr "" #: src/misc/macroedit.cxx:240 msgid "\tignore comment text" msgstr "" #: src/misc/macroedit.cxx:241 msgid "<#comments>\t ignore comments" msgstr "" #: src/misc/macroedit.cxx:244 msgid "\tmodem char/sec test on nn chars" msgstr "" #: src/misc/macroedit.cxx:245 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:246 msgid "\tmodem timing test, spec' file" msgstr "" #: src/misc/macroedit.cxx:247 msgid "\tmodem timing test, string 's'" msgstr "" #: src/misc/macroedit.cxx:250 msgid "\tWAV file; internal string" msgstr "" #: src/misc/macroedit.cxx:251 msgid "\tWAV file; 'n' random 5 char groups" msgstr "" #: src/misc/macroedit.cxx:252 msgid "\tWAV file; spec' file" msgstr "" #: src/misc/macroedit.cxx:253 msgid "\tWAV file; string 's'" msgstr "" #: src/misc/macroedit.cxx:256 msgid "\tAnalysis CSV on,off,toggle" msgstr "" #: src/misc/macroedit.cxx:259 msgid "\tpush current mode to stack" msgstr "" #: src/misc/macroedit.cxx:260 msgid "\tpush current mode / audio freq to stack" msgstr "" #: src/misc/macroedit.cxx:261 msgid "\tpop current mode/freq from stack" msgstr "" #: src/misc/macroedit.cxx:383 msgid "Text file to insert" msgstr "" #: src/misc/macroedit.cxx:393 msgid "Test text file" msgstr "" #: src/misc/macroedit.cxx:403 #, fuzzy msgid "MFSK image file" msgstr "fichier image MFSK" #: src/misc/macroedit.cxx:413 msgid "Change to Macro file" msgstr "" #: src/misc/macroedit.cxx:423 src/misc/macroedit.cxx:433 #, fuzzy msgid "Select audio file" msgstr "Sélectionner la ligne" #: src/misc/macroedit.cxx:445 msgid "Executable file to insert" msgstr "" #: src/misc/macroedit.cxx:476 #, fuzzy msgid "Macro Text" msgstr "Éditeur de macro - " #: src/misc/macroedit.cxx:481 #, fuzzy msgid "Select Tag" msgstr "Sélectionne" #: src/misc/macroedit.cxx:493 msgid "Macro Button Label" msgstr "" #: src/misc/macroedit.cxx:501 msgid "Apply" msgstr "" #: src/misc/macroedit.cxx:530 msgid "Macro editor - " msgstr "Éditeur de macro - " #: src/misc/macros.cxx:5166 msgid "Open macro file" msgstr "Ouvrir fichier macros" #: src/misc/macros.cxx:5167 src/misc/macros.cxx:5210 #, fuzzy msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fichier de définition macro Fldigi\t*.mdf" #: src/misc/macros.cxx:5209 msgid "Save macro file" msgstr "Enregistrer fichier macros" #: src/misc/newinstall.cxx:385 msgid "Finish" msgstr "Fini" #: src/misc/newinstall.cxx:386 msgid "Next" msgstr "Suivant" #: src/misc/newinstall.cxx:387 #, fuzzy msgid "Back" msgstr "Arrière plan" #: src/misc/newinstall.cxx:505 #, fuzzy msgid "The wizard will guide you through the basic fldigi settings:" msgstr "L'assistant vous guidera pour les réglages de base de fldigi" #: src/misc/newinstall.cxx:506 src/logbook/lgbook.cxx:731 msgid "Operator" msgstr "Opérateur" #: src/misc/newinstall.cxx:507 #, fuzzy msgid "Sound Card Interface" msgstr "Carte Son" #: src/misc/newinstall.cxx:508 msgid "Transceiver control, flrig/rigcat/hamlib" msgstr "" #: src/misc/newinstall.cxx:509 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "Vous pouvez sauter une page ou quiter l'assistant à tout moment" #: src/misc/newinstall.cxx:510 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Tous les réglages présents ici peuvent être changés ultérieuremet par le " "menu configuration" #: src/misc/newinstall.cxx:525 #, fuzzy msgid "Fldigi configuration wizard" msgstr "Assistant de Configuration Fldigi" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:302 src/mfsk/mfsk-pic.cxx:305 msgid "Time needed: " msgstr "Temps nécessaire: " #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Charge fichier image" #: src/mfsk/mfsk-pic.cxx:312 msgid "Send image" msgstr "Envoyer image" #: src/mfsk/mfsk-pic.cxx:319 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" #: src/mfsk/mfsk-pic.cxx:323 msgid "Transfer speed, X1-normal" msgstr "" #: src/mfsk/mfsk-pic.cxx:335 msgid "Load" msgstr "Charge" #: src/waterfall/waterfall.cxx:2031 msgid "Waterfall / FFT / Scope" msgstr "" #: src/waterfall/waterfall.cxx:2040 msgid "Upper signal level (dB)" msgstr "Niveau haut de signal (dB)" #: src/waterfall/waterfall.cxx:2051 msgid "Signal range (dB)" msgstr "Plage du signal (dB)" #: src/waterfall/waterfall.cxx:2057 msgid "Change waterfall scale" msgstr "Change échelle chute d'eau" #: src/waterfall/waterfall.cxx:2062 msgid "Slew display lower in frequency" msgstr "" #: src/waterfall/waterfall.cxx:2067 msgid "Center display on signal" msgstr "Centre affichage sur signal" #: src/waterfall/waterfall.cxx:2072 msgid "Slew display higher in frequency" msgstr "" #: src/waterfall/waterfall.cxx:2077 msgid "Waterfall drop speed" msgstr "Vitesse chute d'eau" #: src/waterfall/waterfall.cxx:2087 msgid "Adjust cursor frequency" msgstr "Ajuste fréquence curseur" #: src/waterfall/waterfall.cxx:2092 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centrer dans la bande passante\n" "Clic droit pour annuler" #: src/waterfall/waterfall.cxx:2098 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Enregistre le mode et la fréquence\n" "Clic droit pour la liste" #: src/waterfall/waterfall.cxx:2108 msgid "Lock transmit frequency" msgstr "Vérouille la fréquence de transmission" #: src/waterfall/waterfall.cxx:2117 src/dialogs/confdialog.cxx:19508 msgid "Reverse" msgstr "Inverse" #: src/waterfall/waterfall.cxx:2124 msgid "Transmit/Receive" msgstr "Transmet/Reçoit" #: src/waterfall/waterfall.cxx:2595 #, fuzzy msgid "AFC range or BW" msgstr "Plage AFC " #: src/waterfall/waterfall.cxx:2596 #, fuzzy msgid "Signal search" msgstr "Recherche du signal" #: src/waterfall/waterfall.cxx:2597 msgid "Modem carrier" msgstr "Porteuse modem" #: src/waterfall/waterfall.cxx:2597 msgid "Scroll" msgstr "Défiler" #: src/rigcontrol/rigxml.cxx:1121 msgid "Open rig xml file" msgstr "Ouvrir fichier rig xml" #: src/rigcontrol/rigxml.cxx:1121 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fichier de définition rig xml\t*.xml" #: src/soundcard/sound.cxx:115 src/soundcard/sound.cxx:117 msgid "Audio file" msgstr "Fichier audio" #: src/spot/notify.cxx:193 msgid "My callsign de CALL" msgstr "Mon indicatif de CALL" #: src/spot/notify.cxx:194 msgid "Station heard twice" msgstr "Station enrendue 2 fois" #: src/spot/notify.cxx:195 msgid "Custom text search" msgstr "" #: src/spot/notify.cxx:196 msgid "RSID reception" msgstr "Réception RSID" #: src/spot/notify.cxx:197 msgid "RSID EOT" msgstr "" #: src/spot/notify.cxx:205 msgid "Toggle" msgstr "Basculer" #: src/spot/notify.cxx:207 src/spot/notify.cxx:532 msgid "Remove" msgstr "Enlever" #: src/spot/notify.cxx:218 src/dialogs/confdialog.cxx:14150 #: src/dialogs/confdialog.cxx:14161 src/dialogs/confdialog.cxx:14251 #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14835 #: src/dialogs/confdialog.cxx:18355 src/dialogs/confdialog.cxx:18382 #: src/dialogs/confdialog.cxx:18411 src/dialogs/confdialog.cxx:18440 #: src/dialogs/confdialog.cxx:18469 src/dialogs/confdialog.cxx:18493 #: src/dialogs/confdialog.cxx:19096 msgid "Select" msgstr "Sélectionner" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 src/spot/notify.cxx:586 #: src/logbook/lgbook.cxx:782 src/logbook/lgbook.cxx:1187 msgid "Continent" msgstr "Continent" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/logbook/lgbook.cxx:1199 msgid "ITU zone" msgstr "Zone ITU" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1175 msgid "CQ zone" msgstr "Zone CQ" #: src/spot/notify.cxx:224 msgid "Deselect" msgstr "Désélectionne" #: src/spot/notify.cxx:531 msgid "Add" msgstr "Ajoute" #: src/spot/notify.cxx:534 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:537 src/widgets/FTextView.cxx:484 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Tout Sélectionner" #: src/spot/notify.cxx:538 src/logbook/lgbook.cxx:621 #: src/logbook/lgbook.cxx:822 src/logbook/lgbook.cxx:1636 #: src/logbook/lgbook.cxx:1718 msgid "Clear All" msgstr "Efface Tout" #: src/spot/notify.cxx:585 src/widgets/FTextRXTX.cxx:154 #: src/logbook/lgbook.cxx:737 src/logbook/lgbook.cxx:1039 msgid "Country" msgstr "Pays" #: src/spot/notify.cxx:1144 msgid "The regular expression field must not be empty." msgstr "Le champ d'expression régulière ne doit pas être vide" #: src/spot/notify.cxx:1150 msgid "The regular expression must be valid." msgstr "L'expression régulière doit être valide" #: src/spot/notify.cxx:1157 msgid "Please set your callsign first." msgstr "Merci de configurer votre indicatif en premier" #: src/spot/notify.cxx:1294 msgid "Run program" msgstr "Exécuter le prgramme" #: src/spot/notify.cxx:1329 msgid "" "Default test string is:\n" " \"" msgstr "" "La phrase test par défaut est:\n" " \"" #: src/spot/notify.cxx:1330 msgid "Enter test string or leave blank for default:" msgstr "Entrer la phrase test ou laisser vide par défaut" #: src/spot/notify.cxx:1341 msgid "This event's regular expression is invalid." msgstr "L'expression régulière pour cet évennement est invalide" #: src/spot/notify.cxx:1348 msgid "The test string did not match this event's search pattern." msgstr "" "La phrase test ne correspond pas au motif de recherche de cet évennement" #: src/spot/notify.cxx:1366 msgid "Available substrings" msgstr "Sous-phrases disponibles" #: src/spot/notify.cxx:1453 src/logbook/lgbook.cxx:1617 msgid "Frequency" msgstr "Fréquence" #: src/spot/notify.cxx:1455 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1614 msgid "Callsign" msgstr "Indicatif" #: src/waterfall/colorbox.cxx:87 msgid "Open palette" msgstr "Ouvrir palette" #: src/waterfall/colorbox.cxx:87 src/waterfall/colorbox.cxx:125 msgid "Fldigi palette\t*.pal" msgstr "Palette Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:111 src/waterfall/colorbox.cxx:136 msgid "Palette: " msgstr "Palette: " #: src/waterfall/colorbox.cxx:125 msgid "Save palette" msgstr "Enregistrement palette" #: src/widgets/FTextRXTX.cxx:147 msgid "Look up call" msgstr "Recherche indicatif" #: src/widgets/FTextRXTX.cxx:148 src/dialogs/confdialog.cxx:10138 #: src/logbook/lgbook.cxx:665 src/logbook/lgbook.cxx:870 #: src/logbook/lgbook.cxx:1666 msgid "Call" msgstr "Indicatif" #: src/widgets/FTextRXTX.cxx:149 src/logbook/lgbook.cxx:669 #: src/logbook/lgbook.cxx:882 src/logbook/lgbook.cxx:1616 msgid "Name" msgstr "Nom" #: src/widgets/FTextRXTX.cxx:150 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:151 src/dialogs/confdialog.cxx:10842 #: src/logbook/lgbook.cxx:716 src/logbook/lgbook.cxx:1710 msgid "State" msgstr "État" #: src/widgets/FTextRXTX.cxx:152 src/logbook/lgbook.cxx:779 #: src/logbook/lgbook.cxx:1150 src/logbook/lgbook.cxx:1151 #: src/logbook/lgbook.cxx:1714 #, fuzzy msgid "County" msgstr "Pays" #: src/widgets/FTextRXTX.cxx:153 src/logbook/lgbook.cxx:734 msgid "Province" msgstr "Province" #: src/widgets/FTextRXTX.cxx:155 msgid "Locator" msgstr "Locator" #: src/widgets/FTextRXTX.cxx:156 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:157 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:158 src/dialogs/confdialog.cxx:10836 #: src/logbook/lgbook.cxx:773 src/logbook/lgbook.cxx:1702 msgid "Exchange In" msgstr "Echange" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "Rx Serial #" msgstr "Périphérique série" #: src/widgets/FTextRXTX.cxx:160 src/logbook/lgbook.cxx:1343 msgid "Class" msgstr "" #: src/widgets/FTextRXTX.cxx:161 src/logbook/lgbook.cxx:1432 #, fuzzy msgid "Section" msgstr "Action" #: src/widgets/FTextRXTX.cxx:163 msgid "SS ser #" msgstr "" #: src/widgets/FTextRXTX.cxx:164 msgid "SS prec" msgstr "" #: src/widgets/FTextRXTX.cxx:165 msgid "SS check" msgstr "" #: src/widgets/FTextRXTX.cxx:166 src/logbook/lgbook.cxx:1433 #, fuzzy msgid "SS section" msgstr "Action" #: src/widgets/FTextRXTX.cxx:169 msgid "CQ STATE" msgstr "" #: src/widgets/FTextRXTX.cxx:171 msgid "1010 Nr" msgstr "" #: src/widgets/FTextRXTX.cxx:173 msgid "Kid's Age" msgstr "" #: src/widgets/FTextRXTX.cxx:175 msgid "Round Up Chk" msgstr "" #: src/widgets/FTextRXTX.cxx:176 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "JOTA scout" msgstr "" #: src/widgets/FTextRXTX.cxx:178 msgid "JOTA troop" msgstr "" #: src/widgets/FTextRXTX.cxx:179 msgid "POWER(r)" msgstr "" #: src/widgets/FTextRXTX.cxx:181 #, fuzzy msgid "QSOp state" msgstr "Heure de départ du QSO" #: src/widgets/FTextRXTX.cxx:182 msgid "QSOp county" msgstr "" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:184 #, fuzzy msgid "QSOp name" msgstr "Nom opérateur" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:186 msgid "QSOp category" msgstr "" #: src/widgets/FTextRXTX.cxx:188 msgid "Insert marker" msgstr "Insère marqueur" #: src/widgets/FTextRXTX.cxx:196 msgid "All entries" msgstr "" #: src/widgets/FTextRXTX.cxx:198 msgid "Scroll hints" msgstr "" #: src/widgets/FTextRXTX.cxx:1808 msgid " in " msgstr "" #: src/widgets/FTextRXTX.cxx:1811 msgid "Last QSO" msgstr "Dernier QSO" #: src/widgets/FTextRXTX.cxx:1859 src/dialogs/confdialog.cxx:12043 msgid "Transmit" msgstr "Transmission" #: src/widgets/FTextRXTX.cxx:1860 src/dialogs/confdialog.cxx:11903 #: src/dialogs/confdialog.cxx:14718 msgid "Receive" msgstr "Réception" #: src/widgets/FTextRXTX.cxx:1861 msgid "Abort" msgstr "Annuler" #: src/widgets/FTextRXTX.cxx:1862 msgid "Send image..." msgstr "Envoyer image..." #: src/widgets/FTextRXTX.cxx:1871 src/widgets/flinput2.cxx:50 #, fuzzy msgid "Spec Char" msgstr "Sélectionne" #: src/widgets/FTextRXTX.cxx:1879 src/widgets/flinput2.cxx:58 msgid "A" msgstr "" #: src/widgets/FTextRXTX.cxx:1895 src/widgets/flinput2.cxx:74 msgid "E" msgstr "" #: src/widgets/FTextRXTX.cxx:1905 src/widgets/flinput2.cxx:84 #, fuzzy msgid "I" msgstr "IO" #: src/widgets/FTextRXTX.cxx:1915 src/widgets/flinput2.cxx:94 #, fuzzy msgid "N" msgstr "Non" #: src/widgets/FTextRXTX.cxx:1919 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16915 #, fuzzy msgid "O" msgstr "OK" #: src/widgets/FTextRXTX.cxx:1933 src/widgets/flinput2.cxx:112 msgid "U" msgstr "" #: src/widgets/FTextRXTX.cxx:1943 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "" #: src/widgets/FTextRXTX.cxx:1948 src/widgets/flinput2.cxx:127 #: src/logbook/lgbook.cxx:1148 msgid "Other" msgstr "Autre" #: src/widgets/FTextView.cxx:294 msgid "Insert text" msgstr "Insère texte" #: src/widgets/FTextView.cxx:347 msgid "Save text as" msgstr "Sauvegarder le texte sous" #: src/widgets/FTextView.cxx:482 src/widgets/FTextView.cxx:648 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Copier" #: src/widgets/FTextView.cxx:485 msgid "Save as..." msgstr "Enregistrer sous..." #: src/widgets/FTextView.cxx:486 src/widgets/FTextView.cxx:652 msgid "Word wrap" msgstr "" #: src/widgets/FTextView.cxx:647 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Couper" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Coller" #: src/widgets/FTextView.cxx:651 msgid "Insert file..." msgstr "Insèrer fichier..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Annuler" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1581 msgid "Delete" msgstr "Supprimer" #: src/config_script/run_scripts.cxx:950 msgid "Invalid Modem for KISS IO" msgstr "" #: src/config_script/run_scripts.cxx:2850 msgid "Script file name (path) null pointer" msgstr "" #: src/config_script/run_scripts.cxx:2857 msgid "Script file name (path) invalid" msgstr "" #: src/config_script/run_scripts.cxx:2864 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "" #: src/config_script/run_scripts.cxx:2868 #, c-format msgid "Executing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2873 #, c-format msgid "Issues reported in processing script file: %s" msgstr "" #: src/config_script/run_scripts.cxx:2874 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" #: src/config_script/run_scripts.cxx:2878 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "" #: src/config_script/script_parsing.cxx:359 #, c-format msgid "Missing command %s after line %d" msgstr "" #: src/config_script/script_parsing.cxx:403 #, fuzzy msgid "Command Not Found" msgstr "Options de ligne de commande" #: src/config_script/script_parsing.cxx:407 msgid "Not a script file/tag not found" msgstr "" #: src/config_script/script_parsing.cxx:411 msgid "Invalid parameter" msgstr "" #: src/config_script/script_parsing.cxx:415 msgid "Invalid function parameter (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:419 msgid "Missing paired quotes (\")" msgstr "" #: src/config_script/script_parsing.cxx:423 #, fuzzy msgid "General Error" msgstr "Général" #: src/config_script/script_parsing.cxx:427 #, fuzzy msgid "No Errors" msgstr "Erreur" #: src/config_script/script_parsing.cxx:431 msgid "Character searched not found" msgstr "" #: src/config_script/script_parsing.cxx:435 msgid "End of line reached" msgstr "" #: src/config_script/script_parsing.cxx:439 msgid "File not found" msgstr "" #: src/config_script/script_parsing.cxx:443 msgid "Directory path not found" msgstr "" #: src/config_script/script_parsing.cxx:447 msgid "Unexpected end of parameter (args[]) list found" msgstr "" #: src/config_script/script_parsing.cxx:451 msgid "Unexpected end of parameter check list found" msgstr "" #: src/config_script/script_parsing.cxx:455 msgid "Character count in args[] parameter exceeds expectations" msgstr "" #: src/config_script/script_parsing.cxx:459 msgid "Memory Allocation Error (internal non-script error)" msgstr "" #: src/config_script/script_parsing.cxx:463 msgid "Passed parameter is not of the expected type." msgstr "" #: src/config_script/script_parsing.cxx:467 msgid "Parameter is not valid." msgstr "" #: src/config_script/script_parsing.cxx:471 msgid "Command missing ':'." msgstr "" #: src/config_script/script_parsing.cxx:475 msgid "Maximum open subscripts reached." msgstr "" #: src/config_script/script_parsing.cxx:479 msgid "Subscript execution fail (internal)." msgstr "" #: src/config_script/script_parsing.cxx:483 msgid "Script device path not found." msgstr "" #: src/config_script/script_parsing.cxx:487 msgid "Unexpected end of file reached." msgstr "" #: src/config_script/script_parsing.cxx:491 msgid "File read error" msgstr "" #: src/config_script/script_parsing.cxx:495 msgid "Undefined error" msgstr "" #: src/config_script/script_parsing.cxx:498 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "" #: src/config_script/script_parsing.cxx:966 #: src/config_script/script_parsing.cxx:1093 #: src/config_script/script_parsing.cxx:1806 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" #: src/config_script/script_parsing.cxx:1036 #: src/config_script/script_parsing.cxx:1152 #, c-format msgid "Call back for script command %s reported an Error" msgstr "" #: src/config_script/script_parsing.cxx:1042 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "" #: src/config_script/script_parsing.cxx:1156 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "" #: src/config_script/script_parsing.cxx:1239 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "" #: src/config_script/script_parsing.cxx:1247 #, c-format msgid "Unable to open file %s" msgstr "" #: src/config_script/script_parsing.cxx:1435 msgid "1" msgstr "" #: src/config_script/script_parsing.cxx:1439 msgid "0" msgstr "" #: src/config_script/script_parsing.cxx:1656 #: src/config_script/script_parsing.cxx:1743 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "" #: src/config_script/script_parsing.cxx:1757 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 #: src/dialogs/confdialog.cxx:10080 src/dialogs/confdialog.cxx:11537 #: src/dialogs/confdialog.cxx:11721 msgid "Show" msgstr "Montrer" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 msgid "Hide" msgstr "Cacher" #: src/dialogs/confdialog.cxx:6816 #, fuzzy msgid "no" msgstr "Info" #: src/dialogs/confdialog.cxx:6816 #, fuzzy msgid "yes" msgstr "Oui" #: src/dialogs/confdialog.cxx:9873 msgid "Fldigi configuration" msgstr "Configuration Fldigi" #: src/dialogs/confdialog.cxx:9883 #, fuzzy msgid "Configure" msgstr "&Configuration" #: src/dialogs/confdialog.cxx:9893 msgid "Collapse Tree" msgstr "" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:10100 #: src/dialogs/confdialog.cxx:10102 #, fuzzy msgid "Call/Lookup" msgstr "Indicatif" #: src/dialogs/confdialog.cxx:9905 msgid "Web Browser lookup" msgstr "" #: src/dialogs/confdialog.cxx:9909 msgid "Do not use callsign lookup via web browser" msgstr "" #: src/dialogs/confdialog.cxx:9915 #, fuzzy msgid "QRZ on line" msgstr "QRZ en ligne" #: src/dialogs/confdialog.cxx:9916 msgid "Visit QRZ web site" msgstr "" #: src/dialogs/confdialog.cxx:9921 msgid "HamCall online" msgstr "" #: src/dialogs/confdialog.cxx:9922 msgid "Visit Hamcall web site" msgstr "" #: src/dialogs/confdialog.cxx:9927 #, fuzzy msgid "HamQTH online" msgstr "QRZ en ligne" #: src/dialogs/confdialog.cxx:9928 src/dialogs/confdialog.cxx:9934 msgid "Visit hamQTH web site" msgstr "" #: src/dialogs/confdialog.cxx:9933 msgid "Callook online" msgstr "" #: src/dialogs/confdialog.cxx:9939 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:9952 #, fuzzy msgid "Hamcall" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:9965 msgid "HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:9978 #, fuzzy msgid "Callook" msgstr "Indicatif" #: src/dialogs/confdialog.cxx:9979 msgid "Callook.info web site" msgstr "" #: src/dialogs/confdialog.cxx:9994 msgid "Data base lookup" msgstr "" #: src/dialogs/confdialog.cxx:9998 msgid "Do not use callsign database" msgstr "" #: src/dialogs/confdialog.cxx:10004 msgid "QRZ cdrom" msgstr "QRZ cdrom" #: src/dialogs/confdialog.cxx:10005 msgid "Use CD or hard drive CD image" msgstr "" #: src/dialogs/confdialog.cxx:10010 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:10011 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:10016 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:10017 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" #: src/dialogs/confdialog.cxx:10022 msgid "HamQTH.com" msgstr "" #: src/dialogs/confdialog.cxx:10023 msgid "Free service courtesy of OK" msgstr "" #: src/dialogs/confdialog.cxx:10028 #, fuzzy msgid "Callook.info" msgstr "Indicatif" #: src/dialogs/confdialog.cxx:10029 msgid "Callook.info lookup (free service US callsigns only)" msgstr "" #: src/dialogs/confdialog.cxx:10035 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" #: src/dialogs/confdialog.cxx:10049 msgid "User name" msgstr "Nom utilisateur" #: src/dialogs/confdialog.cxx:10050 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:10064 src/dialogs/confdialog.cxx:11521 #: src/dialogs/confdialog.cxx:11637 msgid "Password" msgstr "Mot de passe" #: src/dialogs/confdialog.cxx:10065 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "" #: src/dialogs/confdialog.cxx:10081 src/dialogs/confdialog.cxx:11538 #: src/dialogs/confdialog.cxx:11722 msgid "Show password in plain text" msgstr "" #: src/dialogs/confdialog.cxx:10086 msgid "Add address to notes field" msgstr "" #: src/dialogs/confdialog.cxx:10091 msgid "clear old data" msgstr "" #: src/dialogs/confdialog.cxx:10105 msgid "Call/cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10109 msgid "cty.dat folder" msgstr "" #: src/dialogs/confdialog.cxx:10110 msgid "Enter full path-name for cty.dat folder" msgstr "" #: src/dialogs/confdialog.cxx:10123 msgid "Browse" msgstr "" #: src/dialogs/confdialog.cxx:10124 msgid "Locate cty.dat file" msgstr "" #: src/dialogs/confdialog.cxx:10127 src/dialogs/confdialog.cxx:10390 #: src/dialogs/confdialog.cxx:10410 src/dialogs/confdialog.cxx:10427 #: src/dialogs/confdialog.cxx:10457 src/dialogs/confdialog.cxx:10661 #: src/dialogs/confdialog.cxx:10717 src/dialogs/confdialog.cxx:11249 #: src/dialogs/confdialog.cxx:11445 src/dialogs/confdialog.cxx:12067 #: src/dialogs/confdialog.cxx:16947 src/dialogs/confdialog.cxx:17032 #: src/dialogs/confdialog.cxx:17046 src/dialogs/confdialog.cxx:17093 #: src/dialogs/confdialog.cxx:17159 src/dialogs/confdialog.cxx:17348 #: src/dialogs/confdialog.cxx:18931 src/dialogs/confdialog.cxx:20169 msgid "Default" msgstr "Défaut" #: src/dialogs/confdialog.cxx:10128 msgid "Restore cty.dat default folder" msgstr "" #: src/dialogs/confdialog.cxx:10131 msgid "Reload" msgstr "" #: src/dialogs/confdialog.cxx:10132 msgid "Reload cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10135 src/dialogs/confdialog.cxx:10137 msgid "Call/Cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10141 src/dialogs/confdialog.cxx:10249 #: src/dialogs/confdialog.cxx:10251 #, fuzzy msgid "Colors-Fonts/Buttons-Menus" msgstr "Couleurs && Polices" #: src/dialogs/confdialog.cxx:10145 msgid "Spot" msgstr "" #: src/dialogs/confdialog.cxx:10148 msgid "Rev" msgstr "" #: src/dialogs/confdialog.cxx:10151 msgid "Tune" msgstr "" #: src/dialogs/confdialog.cxx:10154 msgid "RxID nar" msgstr "" #: src/dialogs/confdialog.cxx:10157 msgid "Lk" msgstr "" #: src/dialogs/confdialog.cxx:10160 msgid "SQL-1" msgstr "" #: src/dialogs/confdialog.cxx:10163 msgid "T/R" msgstr "" #: src/dialogs/confdialog.cxx:10166 msgid "RxID wide" msgstr "" #: src/dialogs/confdialog.cxx:10169 msgid "AFC" msgstr "" #: src/dialogs/confdialog.cxx:10172 msgid "SQL-2" msgstr "" #: src/dialogs/confdialog.cxx:10175 msgid "TxID" msgstr "" #: src/dialogs/confdialog.cxx:10225 msgid "Lighted Btns" msgstr "" #: src/dialogs/confdialog.cxx:10232 msgid "Check Btns" msgstr "" #: src/dialogs/confdialog.cxx:10239 msgid "Round Btns" msgstr "" #: src/dialogs/confdialog.cxx:10246 msgid "Menu font" msgstr "" #: src/dialogs/confdialog.cxx:10254 src/dialogs/confdialog.cxx:10328 #: src/dialogs/confdialog.cxx:10330 msgid "Colors-Fonts/FreqDisp - Meters" msgstr "" #: src/dialogs/confdialog.cxx:10260 msgid "14070.150" msgstr "" #: src/dialogs/confdialog.cxx:10269 src/dialogs/confdialog.cxx:10387 #: src/dialogs/confdialog.cxx:10407 src/dialogs/confdialog.cxx:10424 #: src/dialogs/confdialog.cxx:10449 #, fuzzy msgid "Font" msgstr "Police:" #: src/dialogs/confdialog.cxx:10272 src/dialogs/confdialog.cxx:10286 #: src/dialogs/confdialog.cxx:10300 src/dialogs/confdialog.cxx:10384 #: src/dialogs/confdialog.cxx:10404 #, fuzzy msgid "Bg Color" msgstr "Couleur du fond" #: src/dialogs/confdialog.cxx:10275 #, fuzzy msgid "Digit Color" msgstr "Couleur des chiffres" #: src/dialogs/confdialog.cxx:10278 #, fuzzy msgid "Sys Colors" msgstr "Couleur système" #: src/dialogs/confdialog.cxx:10283 msgid "S-meter" msgstr "S-mètre" #: src/dialogs/confdialog.cxx:10289 src/dialogs/confdialog.cxx:10303 #, fuzzy msgid "Scale Color" msgstr "Couleur de l'échelle" #: src/dialogs/confdialog.cxx:10292 src/dialogs/confdialog.cxx:10306 #, fuzzy msgid "Meter Color" msgstr "Couleur de l'afficheur" #: src/dialogs/confdialog.cxx:10297 msgid "PWR-meter" msgstr "" #: src/dialogs/confdialog.cxx:10309 msgid "Power scale" msgstr "Echelle de puissance" #: src/dialogs/confdialog.cxx:10310 src/dialogs/confdialog.cxx:19838 msgid "Select the type of FFT prefilter" msgstr "Sélectionner le type depré-filtre FFT" #: src/dialogs/confdialog.cxx:10321 msgid "25 W" msgstr "" #: src/dialogs/confdialog.cxx:10333 src/dialogs/confdialog.cxx:10366 #: src/dialogs/confdialog.cxx:10368 msgid "Colors-Fonts/Function keys" msgstr "" #: src/dialogs/confdialog.cxx:10337 msgid "Use colored buttons" msgstr "" #: src/dialogs/confdialog.cxx:10342 msgid "Group 1" msgstr "Groupe 1" #: src/dialogs/confdialog.cxx:10343 msgid "Background color for Function key group 1" msgstr "" #: src/dialogs/confdialog.cxx:10348 msgid "Group 2" msgstr "Groupe 2" #: src/dialogs/confdialog.cxx:10349 msgid "Background color for Function key group 2" msgstr "" #: src/dialogs/confdialog.cxx:10354 msgid "Group 3" msgstr "Groupe 3" #: src/dialogs/confdialog.cxx:10355 msgid "Background color for Function key group 3" msgstr "" #: src/dialogs/confdialog.cxx:10360 src/dialogs/confdialog.cxx:10555 #: src/dialogs/confdialog.cxx:12036 src/dialogs/confdialog.cxx:14187 #: src/dialogs/confdialog.cxx:18180 src/logbook/lgbook.cxx:828 msgid "Defaults" msgstr "Défauts" #: src/dialogs/confdialog.cxx:10363 #, fuzzy msgid "Font/Color" msgstr "Police/Couleur" #: src/dialogs/confdialog.cxx:10371 src/dialogs/confdialog.cxx:10462 #: src/dialogs/confdialog.cxx:10464 msgid "Colors-Fonts/Logging controls" msgstr "" #: src/dialogs/confdialog.cxx:10375 msgid "Logging Panel Controls" msgstr "" #: src/dialogs/confdialog.cxx:10395 msgid "Logbook Dialog" msgstr "" #: src/dialogs/confdialog.cxx:10415 msgid "DX Cluster Dialog" msgstr "" #: src/dialogs/confdialog.cxx:10418 #, fuzzy msgid "Report Browser" msgstr "Navigateur" #: src/dialogs/confdialog.cxx:10430 #, fuzzy msgid "Even Lines" msgstr "Historique événements" #: src/dialogs/confdialog.cxx:10435 #, fuzzy msgid "Odd Lines" msgstr "Lignes impaires" #: src/dialogs/confdialog.cxx:10440 msgid "Stream Text" msgstr "" #: src/dialogs/confdialog.cxx:10446 #, fuzzy msgid "Bg color" msgstr "Couleur du fond" #: src/dialogs/confdialog.cxx:10452 #, fuzzy msgid "Alt Color" msgstr "Couleur" #: src/dialogs/confdialog.cxx:10453 msgid "Color for outgoing telnet text" msgstr "" #: src/dialogs/confdialog.cxx:10467 src/dialogs/confdialog.cxx:10565 #: src/dialogs/confdialog.cxx:10567 #, fuzzy msgid "Colors-Fonts/Rx-Tx" msgstr "Couleurs && Polices" #: src/dialogs/confdialog.cxx:10471 msgid "Rx/Tx Character set" msgstr "" #: src/dialogs/confdialog.cxx:10472 msgid "Select Rx/Tx Character Set" msgstr "" #: src/dialogs/confdialog.cxx:10492 msgid "Rx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:10495 msgid "Tx bkgnd" msgstr "" #: src/dialogs/confdialog.cxx:10504 msgid "Rx font" msgstr "" #: src/dialogs/confdialog.cxx:10507 msgid "Tx font" msgstr "" #: src/dialogs/confdialog.cxx:10516 #, fuzzy msgid "Macro Edit Font" msgstr "Éditeur de macro - " #: src/dialogs/confdialog.cxx:10519 msgid "Text Highlighting" msgstr "" #: src/dialogs/confdialog.cxx:10522 src/dialogs/confdialog.cxx:14169 msgid "XMIT" msgstr "" #: src/dialogs/confdialog.cxx:10523 msgid "Sent chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:10528 msgid "CTRL" msgstr "" #: src/dialogs/confdialog.cxx:10529 msgid "Control chars in Rx/Tx pane" msgstr "" #: src/dialogs/confdialog.cxx:10534 msgid "SKIP" msgstr "" #: src/dialogs/confdialog.cxx:10535 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" #: src/dialogs/confdialog.cxx:10540 msgid "ALTR" msgstr "" #: src/dialogs/confdialog.cxx:10541 msgid "Alternate character color in Rx panelr" msgstr "" #: src/dialogs/confdialog.cxx:10546 msgid "SEL" msgstr "" #: src/dialogs/confdialog.cxx:10547 msgid "Selection background color in Rx Tx panels" msgstr "" #: src/dialogs/confdialog.cxx:10552 src/dialogs/confdialog.cxx:10577 msgid "System" msgstr "Système" #: src/dialogs/confdialog.cxx:10560 msgid "display Rx control chars as ascii string" msgstr "" #: src/dialogs/confdialog.cxx:10570 src/dialogs/confdialog.cxx:10580 #: src/dialogs/confdialog.cxx:10582 #, fuzzy msgid "Colors-Fonts/Tabs" msgstr "Couleurs && Polices" #: src/dialogs/confdialog.cxx:10574 msgid "Tab Color" msgstr "" #: src/dialogs/confdialog.cxx:10585 src/dialogs/confdialog.cxx:10670 #: src/dialogs/confdialog.cxx:10672 msgid "Colors-Fonts/Signal Level" msgstr "" #: src/dialogs/confdialog.cxx:10589 #, fuzzy msgid "Signal Level Indicator" msgstr "Niveau signal" #: src/dialogs/confdialog.cxx:10596 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18866 msgid "Low" msgstr "" #: src/dialogs/confdialog.cxx:10604 src/dialogs/confdialog.cxx:18874 msgid "" "Transition\n" "Level (dB)" msgstr "" #: src/dialogs/confdialog.cxx:10612 src/dialogs/confdialog.cxx:18882 msgid "Normal" msgstr "" #: src/dialogs/confdialog.cxx:10627 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18897 msgid "High" msgstr "" #: src/dialogs/confdialog.cxx:10642 src/dialogs/confdialog.cxx:18912 msgid "Over" msgstr "" #: src/dialogs/confdialog.cxx:10645 src/dialogs/confdialog.cxx:10648 #: src/dialogs/confdialog.cxx:10714 src/dialogs/confdialog.cxx:18915 #: src/dialogs/confdialog.cxx:18918 #, fuzzy msgid "label" msgstr "Libellé:" #: src/dialogs/confdialog.cxx:10659 src/dialogs/confdialog.cxx:18929 #, fuzzy msgid "Input signal level" msgstr "Niveau signal" #: src/dialogs/confdialog.cxx:10664 src/dialogs/confdialog.cxx:18934 msgid "Use wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10665 src/dialogs/confdialog.cxx:18935 msgid "" "default scale is audo \"Vu Meter\"\n" "enable to emulate wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10676 src/dialogs/confdialog.cxx:10736 #: src/dialogs/confdialog.cxx:10738 #, fuzzy msgid "Colors-Fonts/Digiscope" msgstr "Couleurs && Polices" #: src/dialogs/confdialog.cxx:10680 #, fuzzy msgid "Digital Scope Colors" msgstr "Couleur des chiffres" #: src/dialogs/confdialog.cxx:10687 #, fuzzy msgid "Background" msgstr "Arrière plan" #: src/dialogs/confdialog.cxx:10695 src/dialogs/confdialog.cxx:13791 msgid "Axis" msgstr "" #: src/dialogs/confdialog.cxx:10703 #, fuzzy #| msgid "Color" msgid "Color 1" msgstr "Couleur" #: src/dialogs/confdialog.cxx:10711 #, fuzzy #| msgid "Color" msgid "Color 2" msgstr "Couleur" #: src/dialogs/confdialog.cxx:10725 #, fuzzy #| msgid "Color" msgid "Color 3" msgstr "Couleur" #: src/dialogs/confdialog.cxx:10733 #, fuzzy #| msgid "Color" msgid "Color 4" msgstr "Couleur" #: src/dialogs/confdialog.cxx:10742 src/dialogs/confdialog.cxx:10946 #: src/dialogs/confdialog.cxx:10948 #, fuzzy msgid "Contests/General" msgstr "Concours" #: src/dialogs/confdialog.cxx:10747 msgid "Select Logging as QSO or Contest" msgstr "" #: src/dialogs/confdialog.cxx:10762 msgid "State QSO Party" msgstr "" #: src/dialogs/confdialog.cxx:10778 #, fuzzy msgid "Text capture order" msgstr "Capture le texte" #: src/dialogs/confdialog.cxx:10779 #, fuzzy msgid "Context Notes" msgstr "Concours" #: src/dialogs/confdialog.cxx:10791 msgid "Duplicate check, CALL plus" msgstr "" #: src/dialogs/confdialog.cxx:10794 msgid "On/Off" msgstr "" #: src/dialogs/confdialog.cxx:10795 msgid "Check for duplicates" msgstr "Vérifier les doublons" #: src/dialogs/confdialog.cxx:10800 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:677 src/logbook/lgbook.cxx:1391 msgid "Band" msgstr "Bande" #: src/dialogs/confdialog.cxx:10801 msgid "Bands must match" msgstr "Les bandes doivent correspondre" #: src/dialogs/confdialog.cxx:10806 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:680 src/logbook/lgbook.cxx:955 #: src/logbook/lgbook.cxx:1619 src/logbook/lgbook.cxx:1674 msgid "Mode" msgstr "Mode" #: src/dialogs/confdialog.cxx:10807 msgid "Mode must match" msgstr "Le mode doit correspondre" #: src/dialogs/confdialog.cxx:10812 msgid "Time span over" msgstr "" #: src/dialogs/confdialog.cxx:10813 msgid "QSO must not occur within a time period of" msgstr "Un QSO ne doit pas avoir lieu sur une p&riode de temps de" #: src/dialogs/confdialog.cxx:10818 msgid "Dup Color" msgstr "Couleur des Dup" #: src/dialogs/confdialog.cxx:10819 msgid "Left click to select dup color" msgstr "Clic gauche pour sélectionner la couleur des Dup" #: src/dialogs/confdialog.cxx:10827 #, fuzzy msgid "? Dup Color" msgstr "Couleur des Dup" #: src/dialogs/confdialog.cxx:10828 #, fuzzy msgid "Left click to select possible dup color" msgstr "Clic gauche pour sélectionner la couleur des Dup" #: src/dialogs/confdialog.cxx:10837 msgid "free form 1 must match" msgstr "" #: src/dialogs/confdialog.cxx:10843 msgid "State must match" msgstr "L'état doit correspondre" #: src/dialogs/confdialog.cxx:10848 msgid "minutes" msgstr "minutes" #: src/dialogs/confdialog.cxx:10849 msgid "Enter time span in minutes" msgstr "" #: src/dialogs/confdialog.cxx:10867 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Echanges" #: src/dialogs/confdialog.cxx:10870 src/dialogs/confdialog.cxx:11704 #, fuzzy msgid "Send" msgstr "Envoyer:" #: src/dialogs/confdialog.cxx:10871 msgid "free form exchange" msgstr "" #: src/dialogs/confdialog.cxx:10885 #, fuzzy msgid "RST always 599/59" msgstr "RST touours à 599" #: src/dialogs/confdialog.cxx:10886 #, fuzzy msgid "Force RST in/out to 599/59" msgstr "Forcer le RST entrée/sortie à 599" #: src/dialogs/confdialog.cxx:10891 msgid "Send CW cut #'s" msgstr "" #: src/dialogs/confdialog.cxx:10892 msgid "0 = T; 9 = N" msgstr "" #: src/dialogs/confdialog.cxx:10899 #, fuzzy msgid "Start Nbr" msgstr "Démarrer" #: src/dialogs/confdialog.cxx:10900 msgid "Starting number" msgstr "Numéro de dépard" #: src/dialogs/confdialog.cxx:10915 msgid "Digits" msgstr "Chiffres" #: src/dialogs/confdialog.cxx:10916 msgid "Number of digits in serial number" msgstr "Nombre de chiffres dans le numéro de série" #: src/dialogs/confdialog.cxx:10932 msgid "Use leading zeros" msgstr "" #: src/dialogs/confdialog.cxx:10933 msgid "Insert leading zeros into Xmtd serial number" msgstr "" #: src/dialogs/confdialog.cxx:10938 src/dialogs/confdialog.cxx:15083 #: src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Remise à zéro" #: src/dialogs/confdialog.cxx:10939 msgid "Initialize the QSO logging fields" msgstr "" #: src/dialogs/confdialog.cxx:10951 src/dialogs/confdialog.cxx:11000 #: src/dialogs/confdialog.cxx:11002 #, fuzzy msgid "Contests/Field Day" msgstr "Concours" #: src/dialogs/confdialog.cxx:10955 src/logbook/lgbook.cxx:1255 #, fuzzy msgid "Operator Call" msgstr "Nom opérateur" #: src/dialogs/confdialog.cxx:10956 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" #: src/dialogs/confdialog.cxx:10970 #, fuzzy msgid "My Section" msgstr "Action" #: src/dialogs/confdialog.cxx:10971 msgid "Field Day Section" msgstr "" #: src/dialogs/confdialog.cxx:10985 src/dialogs/confdialog.cxx:11012 msgid "My Class" msgstr "" #: src/dialogs/confdialog.cxx:10986 msgid "Field Day Class" msgstr "" #: src/dialogs/confdialog.cxx:11005 src/dialogs/confdialog.cxx:11064 #: src/dialogs/confdialog.cxx:11066 msgid "Contests/JOTA School" msgstr "" #: src/dialogs/confdialog.cxx:11009 msgid "School Round Up" msgstr "" #: src/dialogs/confdialog.cxx:11013 msgid "School Round Up - allowable I, H, O - see rules" msgstr "" #: src/dialogs/confdialog.cxx:11029 msgid "Jamboree OTA" msgstr "" #: src/dialogs/confdialog.cxx:11032 msgid "My Troop" msgstr "" #: src/dialogs/confdialog.cxx:11033 msgid "My JOTA Troop" msgstr "" #: src/dialogs/confdialog.cxx:11047 msgid "Scout Op'" msgstr "" #: src/dialogs/confdialog.cxx:11048 #, fuzzy msgid "Scout Operator Name" msgstr "Nom opérateur" #: src/dialogs/confdialog.cxx:11070 src/dialogs/confdialog.cxx:11109 #: src/dialogs/confdialog.cxx:11111 msgid "IDs/CW" msgstr "" #: src/dialogs/confdialog.cxx:11074 msgid "CW Postamble ID" msgstr "" #: src/dialogs/confdialog.cxx:11077 msgid "Transmit callsign" msgstr "" #: src/dialogs/confdialog.cxx:11078 msgid "Send Callsign in CW at end of every transmission" msgstr "" #: src/dialogs/confdialog.cxx:11083 msgid "Speed (WPM):" msgstr "Vitesse (WPM):" #: src/dialogs/confdialog.cxx:11084 msgid "Send at this WPM" msgstr "" #: src/dialogs/confdialog.cxx:11104 msgid "CW ID modes" msgstr "" #: src/dialogs/confdialog.cxx:11114 src/dialogs/confdialog.cxx:11254 #: src/dialogs/confdialog.cxx:11256 msgid "IDs/RsID" msgstr "" #: src/dialogs/confdialog.cxx:11118 msgid "Reed-Solomon ID (Rx)" msgstr "" #: src/dialogs/confdialog.cxx:11121 msgid "Notify only" msgstr "" #: src/dialogs/confdialog.cxx:11122 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:11128 #, fuzzy #| msgid "Rig mode" msgid "Rx modes" msgstr "Mode Radio" #: src/dialogs/confdialog.cxx:11131 msgid "Mark prev freq/mode" msgstr "" #: src/dialogs/confdialog.cxx:11132 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" #: src/dialogs/confdialog.cxx:11137 msgid "Allow errors" msgstr "" #: src/dialogs/confdialog.cxx:11138 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" #: src/dialogs/confdialog.cxx:11149 msgid "Medium" msgstr "" #: src/dialogs/confdialog.cxx:11154 msgid "Disable alert dialog" msgstr "" #: src/dialogs/confdialog.cxx:11155 msgid "Do not show RsID alert dialog box" msgstr "" #: src/dialogs/confdialog.cxx:11160 msgid "Disables detector" msgstr "" #: src/dialogs/confdialog.cxx:11161 msgid "Disable further detection when RSID is received" msgstr "" #: src/dialogs/confdialog.cxx:11168 #, fuzzy msgid "Retain tx freq lock" msgstr "Fréquence émission verrouillée" #: src/dialogs/confdialog.cxx:11169 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:11174 msgid "Disable freq change" msgstr "" #: src/dialogs/confdialog.cxx:11175 src/dialogs/confdialog.cxx:11181 msgid "Do not automatically change to RX RsID frequency" msgstr "" #: src/dialogs/confdialog.cxx:11180 msgid "Rx/Tx RsID EOT" msgstr "" #: src/dialogs/confdialog.cxx:11186 #, fuzzy msgid "Squelch open (sec)" msgstr "Niveau squelch" #: src/dialogs/confdialog.cxx:11187 src/dialogs/confdialog.cxx:11208 msgid "Use for triggering amplifier carrier detect" msgstr "" #: src/dialogs/confdialog.cxx:11196 msgid "" "The RsID notification message contents and display\n" "characteristics are configured on the \"Notifications\" tab." msgstr "" #: src/dialogs/confdialog.cxx:11204 msgid "Pre-Signal Tone" msgstr "" #: src/dialogs/confdialog.cxx:11207 #, fuzzy msgid "Seconds" msgstr "secondes" #: src/dialogs/confdialog.cxx:11216 msgid "Reed-Solomon ID (Tx)" msgstr "" #: src/dialogs/confdialog.cxx:11219 msgid "Transmit modes" msgstr "Modes transmission" #: src/dialogs/confdialog.cxx:11222 msgid "End of xmt ID" msgstr "" #: src/dialogs/confdialog.cxx:11223 msgid "Add RsID signal to end of transmission" msgstr "" #: src/dialogs/confdialog.cxx:11230 #, fuzzy msgid "Min BW Detection" msgstr "Action" #: src/dialogs/confdialog.cxx:11233 msgid "Hertz" msgstr "" #: src/dialogs/confdialog.cxx:11234 msgid "Minimum bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11243 #, fuzzy #| msgid "Password" msgid "Passband" msgstr "Mot de passe" #: src/dialogs/confdialog.cxx:11244 msgid "" "ON - search over entire waterfall\n" "OFF - limit search to BW selector" msgstr "" #: src/dialogs/confdialog.cxx:11259 src/dialogs/confdialog.cxx:11335 #: src/dialogs/confdialog.cxx:11337 msgid "IDs/Video" msgstr "" #: src/dialogs/confdialog.cxx:11263 msgid "Video Preamble ID" msgstr "" #: src/dialogs/confdialog.cxx:11266 msgid "Transmit mode ID" msgstr "" #: src/dialogs/confdialog.cxx:11267 msgid "Waterfall video ID" msgstr "" #: src/dialogs/confdialog.cxx:11271 msgid "Transmit video text" msgstr "" #: src/dialogs/confdialog.cxx:11272 msgid "Waterfall video text" msgstr "" #: src/dialogs/confdialog.cxx:11277 msgid ":" msgstr "" #: src/dialogs/confdialog.cxx:11278 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" #: src/dialogs/confdialog.cxx:11292 msgid "Use small font" msgstr "" #: src/dialogs/confdialog.cxx:11293 msgid "" "ON - small font\n" "OFF - large font" msgstr "" #: src/dialogs/confdialog.cxx:11299 msgid "Chars/Row:" msgstr "" #: src/dialogs/confdialog.cxx:11300 msgid "Set the number of characters per row" msgstr "" #: src/dialogs/confdialog.cxx:11320 msgid "500 Hz limit" msgstr "" #: src/dialogs/confdialog.cxx:11325 msgid "Mode width limit" msgstr "" #: src/dialogs/confdialog.cxx:11330 msgid "Video ID modes" msgstr "" #: src/dialogs/confdialog.cxx:11341 src/dialogs/confdialog.cxx:11398 #: src/dialogs/confdialog.cxx:11400 msgid "Logging/MacLogger" msgstr "" #: src/dialogs/confdialog.cxx:11345 #, fuzzy msgid "Connect to MacLogger" msgstr "Connecter au serveur" #: src/dialogs/confdialog.cxx:11350 #, fuzzy msgid "Capture Radio Report" msgstr "Créer un rapport Cabrillo" #: src/dialogs/confdialog.cxx:11356 #, fuzzy msgid "Capture Log Report" msgstr "Créer un rapport Cabrillo" #: src/dialogs/confdialog.cxx:11361 #, fuzzy msgid "Capture Lookup " msgstr "Capture" #: src/dialogs/confdialog.cxx:11366 msgid "Capture Spot Tune" msgstr "" #: src/dialogs/confdialog.cxx:11371 msgid "Capture Spot Report" msgstr "" #: src/dialogs/confdialog.cxx:11376 #, fuzzy msgid "Enable UDP log file" msgstr "Sauvegarde le fichier journal" #: src/dialogs/confdialog.cxx:11381 msgid "UDP data stream" msgstr "" #: src/dialogs/confdialog.cxx:11389 msgid "Clear UDP text" msgstr "" #: src/dialogs/confdialog.cxx:11392 msgid "Tune to Rx Spot" msgstr "" #: src/dialogs/confdialog.cxx:11393 #, fuzzy msgid "" "ON - use Rx spot freq\n" "OFF - use Tx spot freq" msgstr "" "ON : utiliser le dernier jeu de macros\n" "OFF : utiliser le jeu par défaut" #: src/dialogs/confdialog.cxx:11403 src/dialogs/confdialog.cxx:11482 #: src/dialogs/confdialog.cxx:11484 msgid "Logging/N3FJP logs" msgstr "" #: src/dialogs/confdialog.cxx:11407 msgid "TCP/IP Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:11412 #, fuzzy msgid "Clear text" msgstr "Effacer Liste" #: src/dialogs/confdialog.cxx:11415 #, fuzzy msgid "Address" msgstr "Adresse:" #: src/dialogs/confdialog.cxx:11416 msgid "N3FJP Server IP Address" msgstr "" #: src/dialogs/confdialog.cxx:11430 src/dialogs/confdialog.cxx:15264 #: src/dialogs/confdialog.cxx:15288 src/dialogs/confdialog.cxx:15528 #: src/dialogs/confdialog.cxx:17016 src/dialogs/confdialog.cxx:17068 #: src/dialogs/confdialog.cxx:17115 src/dialogs/confdialog.cxx:17148 #: src/dialogs/confdialog.cxx:17368 #, fuzzy msgid "Port" msgstr "Port:" #: src/dialogs/confdialog.cxx:11431 msgid "N3FJP Server IP Port" msgstr "" #: src/dialogs/confdialog.cxx:11446 src/dialogs/confdialog.cxx:16948 #: src/dialogs/confdialog.cxx:17033 src/dialogs/confdialog.cxx:17047 #: src/dialogs/confdialog.cxx:17094 src/dialogs/confdialog.cxx:17160 #: src/dialogs/confdialog.cxx:17349 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" #: src/dialogs/confdialog.cxx:11449 msgid "Enable Data Stream" msgstr "" #: src/dialogs/confdialog.cxx:11454 src/dialogs/confdialog.cxx:12842 #: src/dialogs/confdialog.cxx:13091 src/dialogs/confdialog.cxx:13390 #: src/dialogs/confdialog.cxx:15159 src/dialogs/confdialog.cxx:15543 #, fuzzy msgid "Connect" msgstr "ReConnecter" #: src/dialogs/confdialog.cxx:11459 src/dialogs/confdialog.cxx:16450 #, fuzzy msgid "Connected" msgstr "ReConnecter" #: src/dialogs/confdialog.cxx:11465 msgid "Center DXspot freq at sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:11466 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "" #: src/dialogs/confdialog.cxx:11471 msgid "Report actual modem RF frequency" msgstr "" #: src/dialogs/confdialog.cxx:11472 msgid "Suppressed carrier +/- AF injection frequency" msgstr "" #: src/dialogs/confdialog.cxx:11477 msgid "PTT via and " msgstr "" #: src/dialogs/confdialog.cxx:11487 src/dialogs/confdialog.cxx:11614 #: src/dialogs/confdialog.cxx:11616 msgid "Logging/eQSL" msgstr "" #: src/dialogs/confdialog.cxx:11491 msgid "www url" msgstr "" #: src/dialogs/confdialog.cxx:11492 src/dialogs/confdialog.cxx:11507 #: src/dialogs/confdialog.cxx:11542 msgid "Your login name" msgstr "" #: src/dialogs/confdialog.cxx:11506 #, fuzzy msgid "User ID" msgstr "Nom utilisateur" #: src/dialogs/confdialog.cxx:11522 msgid "Your login password" msgstr "" #: src/dialogs/confdialog.cxx:11541 msgid "QTH Nickname" msgstr "" #: src/dialogs/confdialog.cxx:11556 msgid "Verify" msgstr "" #: src/dialogs/confdialog.cxx:11557 msgid "Verify database with eQSL download file" msgstr "" #: src/dialogs/confdialog.cxx:11560 #, fuzzy msgid "Options" msgstr "Action" #: src/dialogs/confdialog.cxx:11563 msgid "send when logged (log button, , )" msgstr "" #: src/dialogs/confdialog.cxx:11564 msgid "automatic data upload" msgstr "" #: src/dialogs/confdialog.cxx:11569 msgid "Use date/time off for log entry" msgstr "" #: src/dialogs/confdialog.cxx:11570 msgid "default uses date/time on" msgstr "" #: src/dialogs/confdialog.cxx:11575 src/dialogs/confdialog.cxx:11690 #, fuzzy msgid "Show delivery message" msgstr "Montrer moins de modes" #: src/dialogs/confdialog.cxx:11576 src/dialogs/confdialog.cxx:11691 msgid "Display timed delivery message if enabled" msgstr "" #: src/dialogs/confdialog.cxx:11581 #, fuzzy msgid "Default message" msgstr "Défauts" #: src/dialogs/confdialog.cxx:11582 msgid "default text to send with etc" msgstr "" #: src/dialogs/confdialog.cxx:11596 msgid "Text Tags (tags use {} delimiters)" msgstr "" #: src/dialogs/confdialog.cxx:11599 #, fuzzy msgid " {CALL} other ops call sign" msgstr "\tindicatif de l'autre" #: src/dialogs/confdialog.cxx:11602 msgid " {MODE} full mode / submode" msgstr "" #: src/dialogs/confdialog.cxx:11605 #, fuzzy msgid "{NAME} other ops name" msgstr "\tnom de l'autre" #: src/dialogs/confdialog.cxx:11608 msgid "These tags can also be used in " msgstr "" #: src/dialogs/confdialog.cxx:11619 src/dialogs/confdialog.cxx:11751 #: src/dialogs/confdialog.cxx:11753 msgid "Logging/LoTW" msgstr "" #: src/dialogs/confdialog.cxx:11623 msgid "tqsl:" msgstr "" #: src/dialogs/confdialog.cxx:11624 msgid "Enter full path-filename for tqsl executable" msgstr "" #: src/dialogs/confdialog.cxx:11638 msgid "Your tqsl login password" msgstr "" #: src/dialogs/confdialog.cxx:11653 #, fuzzy msgid "Password required" msgstr "Mot de passe" #: src/dialogs/confdialog.cxx:11654 msgid "Submit password with each upload" msgstr "" #: src/dialogs/confdialog.cxx:11659 #, fuzzy msgid "Location" msgstr "Locator" #: src/dialogs/confdialog.cxx:11660 msgid "tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:11674 src/dialogs/confdialog.cxx:16002 #: src/dialogs/confdialog.cxx:16020 src/dialogs/confdialog.cxx:16038 #: src/dialogs/confdialog.cxx:16056 src/dialogs/confdialog.cxx:16074 #: src/dialogs/confdialog.cxx:16092 src/dialogs/confdialog.cxx:16110 #, fuzzy msgid "Locate" msgstr "Locator" #: src/dialogs/confdialog.cxx:11675 #, fuzzy msgid "Locate tqsl executable" msgstr "Rechercherl'exécutable" #: src/dialogs/confdialog.cxx:11678 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "" #: src/dialogs/confdialog.cxx:11679 msgid "Operate tqsl in batch mode (no dialog)" msgstr "" #: src/dialogs/confdialog.cxx:11684 msgid "Send QSO data to LoTW when logged" msgstr "" #: src/dialogs/confdialog.cxx:11685 msgid "Submit each QSO as logged" msgstr "" #: src/dialogs/confdialog.cxx:11696 #, fuzzy msgid "Export" msgstr "report" #: src/dialogs/confdialog.cxx:11697 msgid "Export records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:11700 src/logbook/lgbook.cxx:770 #: src/logbook/lgbook.cxx:1403 src/logbook/lgbook.cxx:1456 msgid "Check" msgstr "" #: src/dialogs/confdialog.cxx:11701 msgid "Review lotw.adif file before sending with tqsl" msgstr "" #: src/dialogs/confdialog.cxx:11705 msgid "Send lotw.adif via tqsl" msgstr "" #: src/dialogs/confdialog.cxx:11708 msgid "Export logbook records for LoTW upload" msgstr "" #: src/dialogs/confdialog.cxx:11711 msgid "Review / edit the exported LoTW upload adif file" msgstr "" #: src/dialogs/confdialog.cxx:11714 msgid "Submit the upload adif file to LoTW" msgstr "" #: src/dialogs/confdialog.cxx:11717 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" #: src/dialogs/confdialog.cxx:11725 msgid "Use this tqsl station location" msgstr "" #: src/dialogs/confdialog.cxx:11728 msgid "Match" msgstr "" #: src/dialogs/confdialog.cxx:11729 src/dialogs/confdialog.cxx:11736 msgid "Verify database with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:11732 msgid "Match logbook records with LoTW download file" msgstr "" #: src/dialogs/confdialog.cxx:11735 msgid "View Unmatched" msgstr "" #: src/dialogs/confdialog.cxx:11740 #, fuzzy msgid "Timeout" msgstr "Heure ON" #: src/dialogs/confdialog.cxx:11741 msgid "Wait NN seconds for LoTW response" msgstr "" #: src/dialogs/confdialog.cxx:11756 src/dialogs/confdialog.cxx:11807 #: src/dialogs/confdialog.cxx:11809 msgid "Logging/Cloudlog" msgstr "" #: src/dialogs/confdialog.cxx:11760 msgid "This allows for logging of QSOs to a Cloudlog instance." msgstr "" #: src/dialogs/confdialog.cxx:11764 msgid "Enable Cloudlog API logging" msgstr "" #: src/dialogs/confdialog.cxx:11765 msgid "This enables logging of QSOs to Cloudlog via API" msgstr "" #: src/dialogs/confdialog.cxx:11770 msgid "API URL:" msgstr "" #: src/dialogs/confdialog.cxx:11771 msgid "Enter the URL of your Cloudlog API" msgstr "" #: src/dialogs/confdialog.cxx:11784 msgid "API Key:" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "Enter the API key for your Cloudlog instance" msgstr "" #: src/dialogs/confdialog.cxx:11798 #, fuzzy msgid "Station ID:" msgstr "Station" #: src/dialogs/confdialog.cxx:11803 src/dialogs/confdialog.cxx:16485 #: src/dialogs/confdialog.cxx:17555 src/dialogs/confdialog.cxx:17650 #: src/dialogs/confdialog.cxx:18174 src/dialogs/confdialog.cxx:18269 msgid "Initialize" msgstr "Initialise" #: src/dialogs/confdialog.cxx:11804 msgid "Test API Key" msgstr "" #: src/dialogs/confdialog.cxx:11813 src/dialogs/confdialog.cxx:11893 #: src/dialogs/confdialog.cxx:11895 msgid "Logging/QSO logging" msgstr "" #: src/dialogs/confdialog.cxx:11817 msgid "Prompt to save log on exit" msgstr "" #: src/dialogs/confdialog.cxx:11818 src/dialogs/confdialog.cxx:11887 #: src/dialogs/confdialog.cxx:19222 msgid "Bug me about saving log entries" msgstr "" #: src/dialogs/confdialog.cxx:11823 msgid "Clear on save" msgstr "" #: src/dialogs/confdialog.cxx:11824 msgid "Clear log entries after saving or using macro " msgstr "" #: src/dialogs/confdialog.cxx:11829 msgid "Convert callsign to upper case" msgstr "Convertir l'indicatif en majuscules" #: src/dialogs/confdialog.cxx:11830 msgid "Force callsign field to UPPERCASE" msgstr "Forcer le champ indicatif en majuscules" #: src/dialogs/confdialog.cxx:11835 msgid "Auto-fill Country and Azimuth" msgstr "Remplir automatiquement le pays et l'azimuth" #: src/dialogs/confdialog.cxx:11836 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Remplir le pays et l'azimuth en utilisant l'informaton de cty.dat" #: src/dialogs/confdialog.cxx:11841 msgid "Sort by Date/Time OFF" msgstr "" #: src/dialogs/confdialog.cxx:11842 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" #: src/dialogs/confdialog.cxx:11847 msgid "Date time ON == OFF" msgstr "" #: src/dialogs/confdialog.cxx:11848 msgid "Force date/time ON == date/time OFF" msgstr "" #: src/dialogs/confdialog.cxx:11853 #, fuzzy msgid "Default RST in to 599/59" msgstr "Forcer le RST entrée/sortie à 599" #: src/dialogs/confdialog.cxx:11854 msgid "Clear log controls sets RST in to 599/59" msgstr "" #: src/dialogs/confdialog.cxx:11859 #, fuzzy msgid "Default RST out to 599/59" msgstr "Forcer le RST entrée/sortie à 599" #: src/dialogs/confdialog.cxx:11860 msgid "Clear log controls sets RST out to 599/59" msgstr "" #: src/dialogs/confdialog.cxx:11865 msgid "Transmit Power" msgstr "" #: src/dialogs/confdialog.cxx:11866 msgid "Tx power used for logbook entries" msgstr "" #: src/dialogs/confdialog.cxx:11880 #, fuzzy msgid "Display logbook read datum at start" msgstr "Afficher le nom du fichier de macros au démarrage" #: src/dialogs/confdialog.cxx:11881 src/dialogs/confdialog.cxx:19372 msgid "The filename is written to the RX text area" msgstr "Le nom de fichier est écrit dans la zone texte de réception" #: src/dialogs/confdialog.cxx:11886 msgid "Log power meter " msgstr "" #: src/dialogs/confdialog.cxx:11899 src/dialogs/confdialog.cxx:12167 #: src/dialogs/confdialog.cxx:12169 #, fuzzy msgid "Modem/CW/General" msgstr "Général" #: src/dialogs/confdialog.cxx:11906 msgid "SOM decoding" msgstr "" #: src/dialogs/confdialog.cxx:11907 msgid "Self Organizing Mapping" msgstr "" #: src/dialogs/confdialog.cxx:11913 msgid "WPM Tracking" msgstr "" #: src/dialogs/confdialog.cxx:11914 msgid "Automatic Rx speed tracking" msgstr "" #: src/dialogs/confdialog.cxx:11920 msgid "Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11921 msgid "CW dsp filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11941 #, fuzzy msgid "Matched Filt'" msgstr "Filtre" #: src/dialogs/confdialog.cxx:11942 msgid "Matched Filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:11948 msgid "Rx WPM" msgstr "" #: src/dialogs/confdialog.cxx:11954 msgid "Tracked CW speed in WPM" msgstr "" #: src/dialogs/confdialog.cxx:11959 msgid "Lower" msgstr "" #: src/dialogs/confdialog.cxx:11960 msgid "Detector low threshold" msgstr "" #: src/dialogs/confdialog.cxx:11980 msgid "Upper" msgstr "" #: src/dialogs/confdialog.cxx:11981 msgid "Detector high threshold" msgstr "" #: src/dialogs/confdialog.cxx:12001 #, fuzzy msgid "Range" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:12002 msgid "Range +/- wpm" msgstr "" #: src/dialogs/confdialog.cxx:12021 #, fuzzy #| msgid "Signal range (dB)" msgid "Signal tracking" msgstr "Plage du signal (dB)" #: src/dialogs/confdialog.cxx:12024 msgid "Attack" msgstr "" #: src/dialogs/confdialog.cxx:12030 msgid "Decay" msgstr "" #: src/dialogs/confdialog.cxx:12046 msgid "char WPM" msgstr "" #: src/dialogs/confdialog.cxx:12047 src/dialogs/confdialog.cxx:12112 #: src/dialogs/confdialog.cxx:12139 msgid "My transmit CW WPM" msgstr "" #: src/dialogs/confdialog.cxx:12068 msgid "The default CW speed" msgstr "" #: src/dialogs/confdialog.cxx:12087 src/dialogs/confdialog.cxx:19811 msgid "Lower limit" msgstr "" #: src/dialogs/confdialog.cxx:12088 msgid "No slower than this" msgstr "" #: src/dialogs/confdialog.cxx:12099 src/dialogs/confdialog.cxx:19856 msgid "Upper limit" msgstr "" #: src/dialogs/confdialog.cxx:12100 msgid "No faster than this" msgstr "" #: src/dialogs/confdialog.cxx:12111 #, fuzzy msgid "text WPM" msgstr "WPM par défaut" #: src/dialogs/confdialog.cxx:12132 msgid "Use Farnsworth timing" msgstr "" #: src/dialogs/confdialog.cxx:12133 src/dialogs/confdialog.cxx:12160 msgid "text WPM <= char WPM" msgstr "" #: src/dialogs/confdialog.cxx:12138 msgid "Spacing WPM" msgstr "" #: src/dialogs/confdialog.cxx:12159 msgid "Use Wordsworth timing" msgstr "" #: src/dialogs/confdialog.cxx:12172 src/dialogs/confdialog.cxx:12370 #: src/dialogs/confdialog.cxx:12372 msgid "Modem/CW/Timing and QSK" msgstr "" #: src/dialogs/confdialog.cxx:12176 msgid "Timing" msgstr "" #: src/dialogs/confdialog.cxx:12179 src/dialogs/confdialog.cxx:13130 msgid "Dash/Dot" msgstr "" #: src/dialogs/confdialog.cxx:12180 src/dialogs/confdialog.cxx:13131 msgid "Dash to dot ratio" msgstr "" #: src/dialogs/confdialog.cxx:12198 src/dialogs/confdialog.cxx:12321 msgid "Edge timing" msgstr "" #: src/dialogs/confdialog.cxx:12199 src/dialogs/confdialog.cxx:12322 msgid "Leading and Trailing edge risetimes (msec)" msgstr "" #: src/dialogs/confdialog.cxx:12217 msgid "Edge shape" msgstr "" #: src/dialogs/confdialog.cxx:12218 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:12236 msgid "QSK" msgstr "" #: src/dialogs/confdialog.cxx:12239 msgid "QSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:12240 msgid "Generate square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:12245 #, fuzzy msgid "QSK frequency" msgstr "Mauvaise Fréquence" #: src/dialogs/confdialog.cxx:12246 msgid "Fundamental frequency of QSK square wave signal" msgstr "" #: src/dialogs/confdialog.cxx:12265 msgid "Pre-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:12266 msgid "Msec pre-keydown" msgstr "" #: src/dialogs/confdialog.cxx:12283 msgid "Post-keydown timing (ms)" msgstr "" #: src/dialogs/confdialog.cxx:12284 msgid "Msec post-keydown" msgstr "" #: src/dialogs/confdialog.cxx:12301 msgid "QSK amplitude" msgstr "" #: src/dialogs/confdialog.cxx:12302 msgid "Amplitude of right channel QSK signal" msgstr "" #: src/dialogs/confdialog.cxx:12342 msgid "Send Test character" msgstr "" #: src/dialogs/confdialog.cxx:12345 msgid "Test char" msgstr "" #: src/dialogs/confdialog.cxx:12346 msgid "Test character for QSK adjustment" msgstr "" #: src/dialogs/confdialog.cxx:12362 msgid "Send continuously" msgstr "" #: src/dialogs/confdialog.cxx:12363 msgid "Send a continuous stream of test characters" msgstr "" #: src/dialogs/confdialog.cxx:12375 src/dialogs/confdialog.cxx:12580 #: src/dialogs/confdialog.cxx:12582 msgid "Modem/CW/Prosigns" msgstr "" #: src/dialogs/confdialog.cxx:12379 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" #: src/dialogs/confdialog.cxx:12382 msgid "\" RR" msgstr "" #: src/dialogs/confdialog.cxx:12383 msgid ".-..-." msgstr "" #: src/dialogs/confdialog.cxx:12385 msgid "$ SX" msgstr "" #: src/dialogs/confdialog.cxx:12386 msgid "...-..-" msgstr "" #: src/dialogs/confdialog.cxx:12388 msgid "' WG" msgstr "" #: src/dialogs/confdialog.cxx:12389 msgid ".----." msgstr "" #: src/dialogs/confdialog.cxx:12391 msgid "( KN" msgstr "" #: src/dialogs/confdialog.cxx:12392 msgid "-.--." msgstr "" #: src/dialogs/confdialog.cxx:12394 msgid ") KK" msgstr "" #: src/dialogs/confdialog.cxx:12395 msgid "-.--.-" msgstr "" #: src/dialogs/confdialog.cxx:12397 msgid "+ AR" msgstr "" #: src/dialogs/confdialog.cxx:12398 src/dialogs/confdialog.cxx:12401 msgid ".-.-." msgstr "" #: src/dialogs/confdialog.cxx:12400 msgid "< AR" msgstr "" #: src/dialogs/confdialog.cxx:12403 msgid "> SK" msgstr "" #: src/dialogs/confdialog.cxx:12404 msgid "...-.-" msgstr "" #: src/dialogs/confdialog.cxx:12406 msgid "= BT" msgstr "" #: src/dialogs/confdialog.cxx:12407 msgid "-...-" msgstr "" #: src/dialogs/confdialog.cxx:12409 msgid "- DU" msgstr "" #: src/dialogs/confdialog.cxx:12410 msgid "-....-" msgstr "" #: src/dialogs/confdialog.cxx:12412 msgid "@@ AC" msgstr "" #: src/dialogs/confdialog.cxx:12413 msgid ".--.-." msgstr "" #: src/dialogs/confdialog.cxx:12417 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12434 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12451 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12468 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12484 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12501 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12535 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12552 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12569 msgid "Use '(' paren not KN" msgstr "" #: src/dialogs/confdialog.cxx:12574 msgid "Display decoded as assigned key" msgstr "" #: src/dialogs/confdialog.cxx:12575 msgid "Display the decoded prosign in the RX text using the short cut key" msgstr "" #: src/dialogs/confdialog.cxx:12585 src/dialogs/confdialog.cxx:12683 #: src/dialogs/confdialog.cxx:12685 msgid "Modem/CW/Extended Chars." msgstr "" #: src/dialogs/confdialog.cxx:12589 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" #: src/dialogs/confdialog.cxx:12594 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:12595 src/dialogs/confdialog.cxx:12601 #: src/dialogs/confdialog.cxx:12609 src/dialogs/confdialog.cxx:12617 #: src/dialogs/confdialog.cxx:12623 src/dialogs/confdialog.cxx:12629 #: src/dialogs/confdialog.cxx:12637 src/dialogs/confdialog.cxx:12643 #: src/dialogs/confdialog.cxx:12649 src/dialogs/confdialog.cxx:12655 #: src/dialogs/confdialog.cxx:12663 src/dialogs/confdialog.cxx:12669 #: src/dialogs/confdialog.cxx:12933 msgid "Swap left/right keyer contacts" msgstr "" #: src/dialogs/confdialog.cxx:12600 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12608 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:12616 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:12622 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:12628 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12636 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:12642 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:12648 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:12654 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:12662 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12668 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:12676 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" #: src/dialogs/confdialog.cxx:12688 msgid "Punctuation/Noise Processing" msgstr "" #: src/dialogs/confdialog.cxx:12692 msgid "Check to enable character encode/decode" msgstr "" #: src/dialogs/confdialog.cxx:12695 msgid " backslash \\ \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12696 src/dialogs/confdialog.cxx:12704 #: src/dialogs/confdialog.cxx:12712 src/dialogs/confdialog.cxx:12720 #: src/dialogs/confdialog.cxx:12728 src/dialogs/confdialog.cxx:12736 #: src/dialogs/confdialog.cxx:12744 src/dialogs/confdialog.cxx:12752 #: src/dialogs/confdialog.cxx:12760 src/dialogs/confdialog.cxx:12768 #: src/dialogs/confdialog.cxx:12776 msgid "disable for no printed character" msgstr "" #: src/dialogs/confdialog.cxx:12703 msgid " apostrophe ' \".----.\"" msgstr "" #: src/dialogs/confdialog.cxx:12711 msgid " quote \" \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12719 msgid " dollar sign $ \"...-..-\"" msgstr "" #: src/dialogs/confdialog.cxx:12727 msgid " open_paren ( \"-.--.\"" msgstr "" #: src/dialogs/confdialog.cxx:12735 msgid " close paren ) \"-.--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12743 msgid " colon : \"---...\"" msgstr "" #: src/dialogs/confdialog.cxx:12751 msgid " semi colon ; \"-.-.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12759 msgid " underscore _ \"..--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12767 msgid " at symbol @@ \".--.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12775 msgid " exclamation ! \"-.-.--\"" msgstr "" #: src/dialogs/confdialog.cxx:12785 msgid "Unknown character decode (noise)" msgstr "" #: src/dialogs/confdialog.cxx:12788 msgid " Do not display unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12789 src/dialogs/confdialog.cxx:12796 msgid "disable '*'or no printed character" msgstr "" #: src/dialogs/confdialog.cxx:12795 msgid " Display '*' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12802 msgid " Display '_' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12803 msgid "disable '_' for no printed character" msgstr "" #: src/dialogs/confdialog.cxx:12809 msgid " Display ' ' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12810 msgid "disable ' ' for no printed character" msgstr "" #: src/dialogs/confdialog.cxx:12818 src/dialogs/confdialog.cxx:12820 msgid "Modem/CW/Punctuation-Noise" msgstr "" #: src/dialogs/confdialog.cxx:12823 src/dialogs/confdialog.cxx:13067 #: src/dialogs/confdialog.cxx:13069 msgid "Modem/CW/WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:12827 src/dialogs/confdialog.cxx:13076 #: src/dialogs/confdialog.cxx:15144 #, fuzzy msgid "Ser. Port" msgstr "Port:" #: src/dialogs/confdialog.cxx:12828 src/dialogs/confdialog.cxx:15529 #, fuzzy msgid "Xcvr serial port" msgstr "Port série" #: src/dialogs/confdialog.cxx:12843 src/dialogs/confdialog.cxx:15544 msgid "Connect / Disconnect from WinKeyer" msgstr "" #: src/dialogs/confdialog.cxx:12847 msgid "Wait" msgstr "" #: src/dialogs/confdialog.cxx:12851 #, fuzzy msgid "Bk" msgstr "Arrière plan" #: src/dialogs/confdialog.cxx:12855 msgid "Busy" msgstr "" #: src/dialogs/confdialog.cxx:12859 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:12863 msgid "Key" msgstr "" #: src/dialogs/confdialog.cxx:12867 msgid "Keyer Mode" msgstr "" #: src/dialogs/confdialog.cxx:12880 msgid "Hang" msgstr "" #: src/dialogs/confdialog.cxx:12893 src/dialogs/confdialog.cxx:15617 msgid "Sidetone" msgstr "" #: src/dialogs/confdialog.cxx:12906 msgid "Output PIns" msgstr "" #: src/dialogs/confdialog.cxx:12919 msgid "Use Pot" msgstr "" #: src/dialogs/confdialog.cxx:12920 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:12927 msgid "WPM setting" msgstr "" #: src/dialogs/confdialog.cxx:12929 src/dialogs/confdialog.cxx:12958 #, fuzzy msgid "ModeReg" msgstr "Mode" #: src/dialogs/confdialog.cxx:12932 msgid "Swap" msgstr "" #: src/dialogs/confdialog.cxx:12937 msgid "Auto Space" msgstr "" #: src/dialogs/confdialog.cxx:12938 msgid "Enable paddle auto spacing of characters" msgstr "" #: src/dialogs/confdialog.cxx:12942 msgid "CT space" msgstr "" #: src/dialogs/confdialog.cxx:12943 msgid "Enable contest character spacing" msgstr "" #: src/dialogs/confdialog.cxx:12947 msgid "Paddle Dog" msgstr "" #: src/dialogs/confdialog.cxx:12951 msgid "Cut 0/9" msgstr "" #: src/dialogs/confdialog.cxx:12952 msgid "Use T/N for 0/9" msgstr "" #: src/dialogs/confdialog.cxx:12961 msgid "Paddle echo" msgstr "" #: src/dialogs/confdialog.cxx:12962 msgid "Echo paddle chars to Rx Panel" msgstr "" #: src/dialogs/confdialog.cxx:12966 #, fuzzy msgid "Serial echo" msgstr "Périphérique série" #: src/dialogs/confdialog.cxx:12971 msgid "Tone Keyer" msgstr "" #: src/dialogs/confdialog.cxx:12972 msgid "Enable Winkeyer tone keying" msgstr "" #: src/dialogs/confdialog.cxx:12976 #, fuzzy msgid "Tone ON" msgstr "Heure ON" #: src/dialogs/confdialog.cxx:12977 msgid "Enable Winkeyer audio tone" msgstr "" #: src/dialogs/confdialog.cxx:12981 msgid "PTT ON" msgstr "" #: src/dialogs/confdialog.cxx:12982 msgid "Enable Winkeyer PTT output" msgstr "" #: src/dialogs/confdialog.cxx:12988 #, fuzzy msgid "WPM Settings" msgstr "" "La phrase test par défaut est:\n" " \"" #: src/dialogs/confdialog.cxx:12991 src/dialogs/confdialog.cxx:13211 msgid "Min WPM" msgstr "" #: src/dialogs/confdialog.cxx:12992 src/dialogs/confdialog.cxx:13212 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" #: src/dialogs/confdialog.cxx:13000 src/dialogs/confdialog.cxx:13221 msgid "Rng WPM" msgstr "" #: src/dialogs/confdialog.cxx:13001 msgid "" "Range WPM setting\n" "default = 25" msgstr "" #: src/dialogs/confdialog.cxx:13005 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:13006 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13010 msgid "Cmd WPM" msgstr "" #: src/dialogs/confdialog.cxx:13011 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" #: src/dialogs/confdialog.cxx:13017 msgid "Timing/Settings" msgstr "" #: src/dialogs/confdialog.cxx:13020 #, fuzzy msgid "Ratio" msgstr "Locator" #: src/dialogs/confdialog.cxx:13021 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" #: src/dialogs/confdialog.cxx:13025 msgid "Comp" msgstr "" #: src/dialogs/confdialog.cxx:13026 msgid "" "Compensation in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13030 msgid "1st Ext" msgstr "" #: src/dialogs/confdialog.cxx:13031 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13035 msgid "Sample" msgstr "" #: src/dialogs/confdialog.cxx:13036 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:13040 msgid "Weight" msgstr "" #: src/dialogs/confdialog.cxx:13041 msgid "" "Keying weight\n" "default = 50" msgstr "" #: src/dialogs/confdialog.cxx:13045 msgid "Leadin" msgstr "" #: src/dialogs/confdialog.cxx:13046 msgid "" "Leadin in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13050 msgid "Tail" msgstr "" #: src/dialogs/confdialog.cxx:13051 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" #: src/dialogs/confdialog.cxx:13059 msgid "K3NG Arduino sketch emulation" msgstr "" #: src/dialogs/confdialog.cxx:13060 msgid "Activate for Mortty K3NG sketch" msgstr "" #: src/dialogs/confdialog.cxx:13072 src/dialogs/confdialog.cxx:13277 #: src/dialogs/confdialog.cxx:13279 msgid "Modem/CW/nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13077 src/dialogs/confdialog.cxx:13376 #: src/dialogs/confdialog.cxx:15145 #, fuzzy msgid "nanoIO serial port" msgstr "Port série" #: src/dialogs/confdialog.cxx:13092 src/dialogs/confdialog.cxx:13391 #: src/dialogs/confdialog.cxx:15160 msgid "Connect / Disconnect from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13095 msgid "Paddle" msgstr "" #: src/dialogs/confdialog.cxx:13096 msgid "CW wpm using paddle keyer" msgstr "" #: src/dialogs/confdialog.cxx:13119 src/dialogs/confdialog.cxx:13239 #: src/dialogs/confdialog.cxx:13261 msgid "Comp'" msgstr "" #: src/dialogs/confdialog.cxx:13120 msgid "CW wpm keyboard strings" msgstr "" #: src/dialogs/confdialog.cxx:13149 msgid "Baud" msgstr "" #: src/dialogs/confdialog.cxx:13164 msgid "Keyer" msgstr "" #: src/dialogs/confdialog.cxx:13179 msgid "Incr'" msgstr "" #: src/dialogs/confdialog.cxx:13195 src/dialogs/confdialog.cxx:15192 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "" #: src/dialogs/confdialog.cxx:13198 src/dialogs/confdialog.cxx:15195 #, fuzzy msgid "Status" msgstr "État" #: src/dialogs/confdialog.cxx:13199 src/dialogs/confdialog.cxx:15196 msgid "Query state of nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13204 msgid "Use WPM pot'" msgstr "" #: src/dialogs/confdialog.cxx:13205 msgid "WPM pot update to nanoIO required" msgstr "" #: src/dialogs/confdialog.cxx:13222 msgid "" "Range WPM setting\n" "default = 20" msgstr "" #: src/dialogs/confdialog.cxx:13233 msgid "PTT off" msgstr "" #: src/dialogs/confdialog.cxx:13234 #, fuzzy msgid "Disable PTT" msgstr "PTT matériel" #: src/dialogs/confdialog.cxx:13242 #, fuzzy msgid "WPM" msgstr "PSK" #: src/dialogs/confdialog.cxx:13252 #, fuzzy msgid "Test =>" msgstr "Test..." #: src/dialogs/confdialog.cxx:13253 msgid "Send \"paris \" WPM times" msgstr "" #: src/dialogs/confdialog.cxx:13256 msgid "secs' =>" msgstr "" #: src/dialogs/confdialog.cxx:13257 msgid "Test duration (60 seconds)" msgstr "" #: src/dialogs/confdialog.cxx:13262 msgid "Compensationin microseconds" msgstr "" #: src/dialogs/confdialog.cxx:13266 msgid "Adjust" msgstr "" #: src/dialogs/confdialog.cxx:13267 msgid "send compensation to nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:13272 msgid "CW i/o" msgstr "" #: src/dialogs/confdialog.cxx:13273 msgid "Enable CW operation" msgstr "" #: src/dialogs/confdialog.cxx:13282 src/dialogs/confdialog.cxx:13404 #: src/dialogs/confdialog.cxx:13406 msgid "Modem/CW/DTR-RTS keying" msgstr "" #: src/dialogs/confdialog.cxx:13288 msgid "" "DTR/RTS keying may be assigned to flrig, share the RigCat serial port,\n" "share the Separate PTT serial port, or be assigned to separate serial port.\n" "\n" "No settings for baud, stops bits, etc are needed." msgstr "" #: src/dialogs/confdialog.cxx:13297 msgid "Use flrig DTR/RTS keying" msgstr "" #: src/dialogs/confdialog.cxx:13303 #, fuzzy msgid "Disable flrig CW PTT" msgstr "PTT matériel" #: src/dialogs/confdialog.cxx:13304 src/dialogs/confdialog.cxx:13451 msgid "" "Required for some transceivers\n" "e.g. TS-480" msgstr "" #: src/dialogs/confdialog.cxx:13313 #, fuzzy msgid "Share RIGCAT port" msgstr "Port série" #: src/dialogs/confdialog.cxx:13319 msgid "Share Separate PTT port" msgstr "" #: src/dialogs/confdialog.cxx:13325 msgid "CW Keyline" msgstr "" #: src/dialogs/confdialog.cxx:13340 msgid "Keying compensation (msec)" msgstr "" #: src/dialogs/confdialog.cxx:13341 msgid "Dot / Space timing increment" msgstr "" #: src/dialogs/confdialog.cxx:13359 msgid "PTT keyline" msgstr "" #: src/dialogs/confdialog.cxx:13375 #, fuzzy msgid "Use Separate Keying Serial Port" msgstr "Utiliser un port série PTT à part" #: src/dialogs/confdialog.cxx:13395 msgid "Speed test" msgstr "" #: src/dialogs/confdialog.cxx:13396 msgid "1 minute 'PARIS '" msgstr "" #: src/dialogs/confdialog.cxx:13400 msgid "Result" msgstr "" #: src/dialogs/confdialog.cxx:13409 #, fuzzy msgid "Modem/CW/CAT Keying" msgstr "Général" #: src/dialogs/confdialog.cxx:13413 msgid "" "CW keying using CAT command strings. Available for supported transceivers.\n" "Use with RigCAT or flrig transceiver control. A separate serial port is NOT " "needed.\n" "\n" "Disable CAT PTT if transceiver interprets that as a keydown command (e.g. " "TS480).\n" "Recommend setting transceiver to either semi or full break-in.\n" "\n" "Enter correct CIV address for Icom transceivers." msgstr "" #: src/dialogs/confdialog.cxx:13424 msgid "Icom" msgstr "" #: src/dialogs/confdialog.cxx:13429 msgid "Hex CIV addr" msgstr "" #: src/dialogs/confdialog.cxx:13430 msgid "Enter transceiver HEX CIV address" msgstr "" #: src/dialogs/confdialog.cxx:13435 msgid "Elecraft" msgstr "" #: src/dialogs/confdialog.cxx:13440 msgid "Kenwood" msgstr "" #: src/dialogs/confdialog.cxx:13445 msgid "Yaesu" msgstr "" #: src/dialogs/confdialog.cxx:13450 #, fuzzy msgid "Disable CAT PTT" msgstr "PTT matériel" #: src/dialogs/confdialog.cxx:13456 src/dialogs/confdialog.cxx:13458 #, fuzzy msgid "Modem/CW/CAT keying" msgstr "Général" #: src/dialogs/confdialog.cxx:13461 msgid "CW CAT & WinKeyer Compensation" msgstr "" #: src/dialogs/confdialog.cxx:13465 msgid "" "Compute timing compensation for CAT CW and WinKeyer CW. Computation at " "current\n" "WPM . Set WPM to nominal (suggest 20 WPM).\n" "\n" "Compensation will be good over a +/- 10 WPM range. Calibration/Test is 1 " "minute of\n" "'PARIS '." msgstr "" #: src/dialogs/confdialog.cxx:13473 msgid "Calibrate" msgstr "" #: src/dialogs/confdialog.cxx:13474 src/dialogs/confdialog.cxx:13489 msgid "Send WPM 'PARIS ' words" msgstr "" #: src/dialogs/confdialog.cxx:13477 msgid "Compensate (secs)" msgstr "" #: src/dialogs/confdialog.cxx:13485 #, fuzzy msgid "Clear compensation" msgstr "Effacer Liste" #: src/dialogs/confdialog.cxx:13488 src/dialogs/confdialog.cxx:14847 #: src/dialogs/confdialog.cxx:16157 src/dialogs/confdialog.cxx:16161 #: src/dialogs/confdialog.cxx:16165 src/dialogs/confdialog.cxx:16169 #: src/dialogs/confdialog.cxx:16173 src/dialogs/confdialog.cxx:16177 #: src/dialogs/confdialog.cxx:16181 src/dialogs/confdialog.cxx:18399 #: src/dialogs/confdialog.cxx:18428 src/dialogs/confdialog.cxx:18457 #: src/dialogs/confdialog.cxx:18486 src/dialogs/confdialog.cxx:18505 #, fuzzy msgid "Test" msgstr "Test..." #: src/dialogs/confdialog.cxx:13492 msgid "secs" msgstr "" #: src/dialogs/confdialog.cxx:13498 src/dialogs/confdialog.cxx:13500 #, fuzzy msgid "Modem/CW/CAT comp'" msgstr "Modem" #: src/dialogs/confdialog.cxx:13503 src/dialogs/confdialog.cxx:13591 #: src/dialogs/confdialog.cxx:13593 msgid "Modem/DominoEX" msgstr "" #: src/dialogs/confdialog.cxx:13507 src/dialogs/confdialog.cxx:15724 msgid "Secondary Text" msgstr "" #: src/dialogs/confdialog.cxx:13508 src/dialogs/confdialog.cxx:15725 msgid "Text to send during keyboard idle times" msgstr "" #: src/dialogs/confdialog.cxx:13522 src/dialogs/confdialog.cxx:15739 msgid "Filtering" msgstr "" #: src/dialogs/confdialog.cxx:13523 msgid "Use DSP filter before decoder" msgstr "" #: src/dialogs/confdialog.cxx:13529 src/dialogs/confdialog.cxx:15746 msgid "Filter bandwidth factor" msgstr "" #: src/dialogs/confdialog.cxx:13530 src/dialogs/confdialog.cxx:15747 msgid "Filter bandwidth relative to signal width" msgstr "" #: src/dialogs/confdialog.cxx:13548 msgid "FEC" msgstr "" #: src/dialogs/confdialog.cxx:13549 msgid "Enable MultiPSK-compatible FEC" msgstr "" #: src/dialogs/confdialog.cxx:13554 src/dialogs/confdialog.cxx:15765 msgid "CWI threshold" msgstr "" #: src/dialogs/confdialog.cxx:13555 src/dialogs/confdialog.cxx:15766 msgid "CWI detection and suppression" msgstr "" #: src/dialogs/confdialog.cxx:13571 src/dialogs/confdialog.cxx:15801 msgid "Paths (hidden)" msgstr "" #: src/dialogs/confdialog.cxx:13596 src/dialogs/confdialog.cxx:13736 #: src/dialogs/confdialog.cxx:13738 msgid "Modem/Feld Hell" msgstr "" #: src/dialogs/confdialog.cxx:13600 #, fuzzy msgid "Hell Transmit Parameters" msgstr "Modes transmission" #: src/dialogs/confdialog.cxx:13603 msgid "Transmit font" msgstr "" #: src/dialogs/confdialog.cxx:13604 msgid "Select TX raster font" msgstr "" #: src/dialogs/confdialog.cxx:13620 msgid "Pulse shape" msgstr "" #: src/dialogs/confdialog.cxx:13621 msgid "Raised cosine pulse shape factor" msgstr "" #: src/dialogs/confdialog.cxx:13632 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:13637 msgid "Transmit periods (.) when idle" msgstr "" #: src/dialogs/confdialog.cxx:13638 msgid "Transmits a diddle dot when no keyboard activity" msgstr "" #: src/dialogs/confdialog.cxx:13644 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:13645 #, fuzzy msgid "Range 1...3" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:13659 #, fuzzy msgid "Hell Receive Parameters" msgstr "Sélectionner paramètres opératoires" #: src/dialogs/confdialog.cxx:13662 msgid "Reverse video" msgstr "Inverse vidéo" #: src/dialogs/confdialog.cxx:13663 msgid "Display RX in reverse video" msgstr "" #: src/dialogs/confdialog.cxx:13668 #, fuzzy msgid "Marquee text" msgstr "Effacer Liste" #: src/dialogs/confdialog.cxx:13669 msgid "Display RX as a scrolling marquee" msgstr "" #: src/dialogs/confdialog.cxx:13674 msgid "Rx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:13675 #, fuzzy msgid "Range 1...4" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:13687 msgid "Rx Height in pixels" msgstr "" #: src/dialogs/confdialog.cxx:13688 msgid "May require resizing the Rx/Tx panel" msgstr "" #: src/dialogs/confdialog.cxx:13700 msgid "Receive filter bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:13701 msgid "Adjust the DSP bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:13721 msgid "Rx AGC" msgstr "" #: src/dialogs/confdialog.cxx:13722 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "" #: src/dialogs/confdialog.cxx:13741 src/dialogs/confdialog.cxx:13976 #: src/dialogs/confdialog.cxx:13978 #, fuzzy msgid "Modem/FMT" msgstr "Modem" #: src/dialogs/confdialog.cxx:13745 msgid "Audio Stream Procesing" msgstr "" #: src/dialogs/confdialog.cxx:13748 src/dialogs/confdialog.cxx:18717 msgid "Sample rate" msgstr "" #: src/dialogs/confdialog.cxx:13749 msgid "FMT sample rate" msgstr "" #: src/dialogs/confdialog.cxx:13764 msgid "Rx Codec PPM" msgstr "" #: src/dialogs/confdialog.cxx:13765 msgid "Audio Codec ppm correction" msgstr "" #: src/dialogs/confdialog.cxx:13776 msgid "Tracking" msgstr "" #: src/dialogs/confdialog.cxx:13779 msgid "Bgnd" msgstr "" #: src/dialogs/confdialog.cxx:13780 #, fuzzy msgid "Change plot background color" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:13783 msgid "Unkn" msgstr "" #: src/dialogs/confdialog.cxx:13784 msgid "Change plot unknown track color" msgstr "" #: src/dialogs/confdialog.cxx:13787 msgid "Ref" msgstr "" #: src/dialogs/confdialog.cxx:13788 msgid "Change plot reference track color" msgstr "" #: src/dialogs/confdialog.cxx:13792 #, fuzzy msgid "Change Axis' color" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:13795 msgid "Lgnd" msgstr "" #: src/dialogs/confdialog.cxx:13796 #, fuzzy msgid "Change legend color" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:13799 msgid "Line/Axis" msgstr "" #: src/dialogs/confdialog.cxx:13800 #, fuzzy msgid "Enable to always plot data over axis" msgstr "Clic gauche pour sélectionner la couleur des Dup" #: src/dialogs/confdialog.cxx:13805 #, fuzzy msgid "Thick lines" msgstr "Lignes impaires" #: src/dialogs/confdialog.cxx:13806 msgid "Enable to plot track lines 3 pixels wide" msgstr "" #: src/dialogs/confdialog.cxx:13811 #, fuzzy msgid "Freq Correction" msgstr "Réception RSID" #: src/dialogs/confdialog.cxx:13812 msgid "Offset plot lines on vertical scale" msgstr "" #: src/dialogs/confdialog.cxx:13821 src/dialogs/confdialog.cxx:18829 msgid "@|<" msgstr "" #: src/dialogs/confdialog.cxx:13825 src/dialogs/confdialog.cxx:18843 msgid "@>|" msgstr "" #: src/dialogs/confdialog.cxx:13829 #, fuzzy #| msgid "Error" msgid "Max Error" msgstr "Erreur" #: src/dialogs/confdialog.cxx:13830 msgid "Limit freq estimate error to this value" msgstr "" #: src/dialogs/confdialog.cxx:13841 msgid "DFT Estimator" msgstr "" #: src/dialogs/confdialog.cxx:13844 #, fuzzy msgid "Data Filter" msgstr "Filtre" #: src/dialogs/confdialog.cxx:13845 msgid "Moving average - average over NN seconds^0 - no averaging" msgstr "" #: src/dialogs/confdialog.cxx:13854 #, fuzzy msgid "DFT rate" msgstr "Génération TX" #: src/dialogs/confdialog.cxx:13855 msgid "# DFT computations / second" msgstr "" #: src/dialogs/confdialog.cxx:13872 #, fuzzy msgid "FIR Filter" msgstr "Filtre" #: src/dialogs/confdialog.cxx:13875 msgid "Width" msgstr "" #: src/dialogs/confdialog.cxx:13876 msgid "Band pass filter / unknown / reference" msgstr "" #: src/dialogs/confdialog.cxx:13886 msgid "bpf Unk'" msgstr "" #: src/dialogs/confdialog.cxx:13887 msgid "ON - band pass filter unknown signal" msgstr "" #: src/dialogs/confdialog.cxx:13892 msgid "bpf Ref'" msgstr "" #: src/dialogs/confdialog.cxx:13893 msgid "ON - band pass filter reference signal" msgstr "" #: src/dialogs/confdialog.cxx:13900 msgid "CSV Data Recording" msgstr "" #: src/dialogs/confdialog.cxx:13903 msgid "Auto record" msgstr "" #: src/dialogs/confdialog.cxx:13904 msgid "Automatically start csv data file recording with wav playback" msgstr "" #: src/dialogs/confdialog.cxx:13908 msgid "Record data for NN minutes after auto start" msgstr "" #: src/dialogs/confdialog.cxx:13918 msgid "Wav file recording" msgstr "" #: src/dialogs/confdialog.cxx:13921 #, fuzzy msgid "Record Audio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:13922 msgid "Wav file recording - START IMMEDIATELY" msgstr "" #: src/dialogs/confdialog.cxx:13927 msgid "Sync to data record" msgstr "" #: src/dialogs/confdialog.cxx:13928 msgid "Wav file recording - SYNCHRONIZE with data recording" msgstr "" #: src/dialogs/confdialog.cxx:13933 msgid "File pathname:" msgstr "" #: src/dialogs/confdialog.cxx:13934 msgid "Computer generated file name" msgstr "" #: src/dialogs/confdialog.cxx:13942 msgid "" "Shft-click: select unknown\n" "Ctrl-click: select reference" msgstr "" #: src/dialogs/confdialog.cxx:13946 msgid "Center on Unknown" msgstr "" #: src/dialogs/confdialog.cxx:13947 msgid "Waterfall Centered on unknown signal" msgstr "" #: src/dialogs/confdialog.cxx:13952 msgid "Center on Reference" msgstr "" #: src/dialogs/confdialog.cxx:13953 msgid "Waterfall centered on reference signal" msgstr "" #: src/dialogs/confdialog.cxx:13958 #, fuzzy msgid "Center on median" msgstr "Centre affichage sur signal" #: src/dialogs/confdialog.cxx:13959 msgid "Waterfall centered 1/2 way between unknown & reference" msgstr "" #: src/dialogs/confdialog.cxx:13968 msgid "Use TAB delimiters" msgstr "" #: src/dialogs/confdialog.cxx:13969 msgid "Use tab delimiters between columns on csv export file." msgstr "" #: src/dialogs/confdialog.cxx:13981 src/dialogs/confdialog.cxx:14192 #: src/dialogs/confdialog.cxx:14194 #, fuzzy msgid "Modem/FSQ" msgstr "Modem" #: src/dialogs/confdialog.cxx:13985 msgid "Rx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:13988 #, fuzzy msgid "Min Hits" msgstr "Control Radio" #: src/dialogs/confdialog.cxx:13989 msgid "Minimum # hits in tone detector" msgstr "" #: src/dialogs/confdialog.cxx:14000 msgid "Image LPF" msgstr "" #: src/dialogs/confdialog.cxx:14001 msgid "Narrow LPF if image noisy" msgstr "" #: src/dialogs/confdialog.cxx:14007 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:14008 msgid "Filter FFT output" msgstr "" #: src/dialogs/confdialog.cxx:14020 msgid "Heard aging" msgstr "" #: src/dialogs/confdialog.cxx:14021 msgid "Remove call after ..." msgstr "" #: src/dialogs/confdialog.cxx:14029 src/dialogs/confdialog.cxx:14201 msgid "Tx Parameters" msgstr "" #: src/dialogs/confdialog.cxx:14032 msgid "1.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:14037 msgid "2 baud" msgstr "" #: src/dialogs/confdialog.cxx:14042 msgid "3 baud" msgstr "" #: src/dialogs/confdialog.cxx:14047 msgid "4.5 baud" msgstr "" #: src/dialogs/confdialog.cxx:14052 msgid "6 baud" msgstr "" #: src/dialogs/confdialog.cxx:14057 src/dialogs/confdialog.cxx:15873 msgid "Center freq" msgstr "" #: src/dialogs/confdialog.cxx:14063 #, fuzzy msgid "Sounder" msgstr "Carte Son" #: src/dialogs/confdialog.cxx:14064 msgid "Send beacon every ..." msgstr "" #: src/dialogs/confdialog.cxx:14070 #, fuzzy msgid "Time out" msgstr "Heure ON" #: src/dialogs/confdialog.cxx:14071 msgid "Time out xmt attempt in XX seconds" msgstr "" #: src/dialogs/confdialog.cxx:14081 msgid "QTC:" msgstr "" #: src/dialogs/confdialog.cxx:14082 #, fuzzy msgid "Enter QTC text" msgstr "Insère texte" #: src/dialogs/confdialog.cxx:14086 msgid "MYCALL lower case" msgstr "" #: src/dialogs/confdialog.cxx:14087 src/dialogs/confdialog.cxx:14221 #, fuzzy msgid "convert operator callsign to lower case" msgstr "Convertir l'indicatif en majuscules" #: src/dialogs/confdialog.cxx:14092 msgid "QTH:" msgstr "QTH:" #: src/dialogs/confdialog.cxx:14093 src/dialogs/confdialog.cxx:17235 msgid "Operators QTH" msgstr "QTH des opérateurs" #: src/dialogs/confdialog.cxx:14109 msgid "Message Logging" msgstr "" #: src/dialogs/confdialog.cxx:14112 msgid "Add date/time" msgstr "" #: src/dialogs/confdialog.cxx:14113 msgid "Add date/time stamp to each # received message" msgstr "" #: src/dialogs/confdialog.cxx:14119 msgid "always append to file(s)" msgstr "" #: src/dialogs/confdialog.cxx:14120 msgid "append # directive msgs to named file" msgstr "" #: src/dialogs/confdialog.cxx:14126 #, fuzzy msgid "Notify time out" msgstr "Délai d'inactivité" #: src/dialogs/confdialog.cxx:14127 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" #: src/dialogs/confdialog.cxx:14142 src/dialogs/confdialog.cxx:14243 #, fuzzy msgid "Audit log" msgstr "Audio" #: src/dialogs/confdialog.cxx:14145 src/dialogs/confdialog.cxx:14156 #: src/dialogs/confdialog.cxx:14246 src/dialogs/confdialog.cxx:14257 #: src/dialogs/confdialog.cxx:16335 src/dialogs/confdialog.cxx:18394 #: src/dialogs/confdialog.cxx:18423 src/dialogs/confdialog.cxx:18452 #: src/dialogs/confdialog.cxx:18481 src/dialogs/confdialog.cxx:18508 #: src/dialogs/confdialog.cxx:18634 #, fuzzy msgid "Enable" msgstr "Activé" #: src/dialogs/confdialog.cxx:14153 src/dialogs/confdialog.cxx:14254 msgid "Heard log" msgstr "" #: src/dialogs/confdialog.cxx:14166 #, fuzzy msgid "Text Colors" msgstr "Couleur de l'afficheur" #: src/dialogs/confdialog.cxx:14170 #, fuzzy msgid "Transmit text" msgstr "Transmission" #: src/dialogs/confdialog.cxx:14175 msgid "DIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:14176 msgid "Directed received text" msgstr "" #: src/dialogs/confdialog.cxx:14181 msgid "UNDIRECTED" msgstr "" #: src/dialogs/confdialog.cxx:14182 msgid "Undirected received text" msgstr "" #: src/dialogs/confdialog.cxx:14197 src/dialogs/confdialog.cxx:14279 #: src/dialogs/confdialog.cxx:14281 #, fuzzy msgid "Modem/IFKP" msgstr "Modem" #: src/dialogs/confdialog.cxx:14204 msgid "1/2 speed" msgstr "" #: src/dialogs/confdialog.cxx:14209 msgid "1x speed" msgstr "" #: src/dialogs/confdialog.cxx:14210 #, fuzzy msgid "default" msgstr "Défaut" #: src/dialogs/confdialog.cxx:14215 msgid "2x speed" msgstr "" #: src/dialogs/confdialog.cxx:14220 msgid "MYCALL always lower case" msgstr "" #: src/dialogs/confdialog.cxx:14226 msgid "CALLSIGN always lower case" msgstr "" #: src/dialogs/confdialog.cxx:14227 #, fuzzy msgid "convert other callsign to lower case" msgstr "Convertir l'indicatif en majuscules" #: src/dialogs/confdialog.cxx:14232 msgid "lock WF at 1500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:14233 msgid "Always transmit at 1500 Hertz center freq." msgstr "" #: src/dialogs/confdialog.cxx:14267 #, fuzzy msgid "" "\n" "Operator avatar" msgstr "Nom opérateur" #: src/dialogs/confdialog.cxx:14284 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14355 #, fuzzy msgid "Modem/MT-63" msgstr "Modem" #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14550 msgid "8-bit extended characters (UTF-8)" msgstr "" #: src/dialogs/confdialog.cxx:14292 msgid "Enable this for UTF-8 characters" msgstr "" #: src/dialogs/confdialog.cxx:14298 msgid "Long receive integration" msgstr "" #: src/dialogs/confdialog.cxx:14299 msgid "Enable for very weak signals" msgstr "" #: src/dialogs/confdialog.cxx:14309 msgid "Transmit lower start tone" msgstr "" #: src/dialogs/confdialog.cxx:14314 msgid "Transmit upper start tone" msgstr "" #: src/dialogs/confdialog.cxx:14320 msgid "Tone Duration (secs)" msgstr "" #: src/dialogs/confdialog.cxx:14336 msgid "Low tone at 500 Hz" msgstr "" #: src/dialogs/confdialog.cxx:14341 msgid "Centered at 1500 Hz (SHARES)" msgstr "" #: src/dialogs/confdialog.cxx:14346 msgid "Manual tuning" msgstr "" #: src/dialogs/confdialog.cxx:14358 src/dialogs/confdialog.cxx:14454 #: src/dialogs/confdialog.cxx:14456 #, fuzzy msgid "Modem/Contestia" msgstr "Concours" #: src/dialogs/confdialog.cxx:14364 src/dialogs/confdialog.cxx:14465 msgid "Bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:14365 src/dialogs/confdialog.cxx:14466 msgid "Select bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:14381 src/dialogs/confdialog.cxx:14482 msgid "Tones" msgstr "Tons" #: src/dialogs/confdialog.cxx:14382 src/dialogs/confdialog.cxx:14483 msgid "Select number of tones" msgstr "" #: src/dialogs/confdialog.cxx:14398 src/dialogs/confdialog.cxx:14499 msgid "Receive synchronizer" msgstr "" #: src/dialogs/confdialog.cxx:14401 src/dialogs/confdialog.cxx:14502 msgid "Tune margin (tone frequency spacing)" msgstr "" #: src/dialogs/confdialog.cxx:14402 src/dialogs/confdialog.cxx:14421 #: src/dialogs/confdialog.cxx:14503 src/dialogs/confdialog.cxx:14523 msgid "Change ONLY to experiment" msgstr "" #: src/dialogs/confdialog.cxx:14420 src/dialogs/confdialog.cxx:14522 msgid "Integration period (FEC blocks)" msgstr "Période d'intégration (FEC blocs)" #: src/dialogs/confdialog.cxx:14441 msgid "8-bit extended characters" msgstr "" #: src/dialogs/confdialog.cxx:14442 msgid "Enable this for Latin-1 accented characters" msgstr "" #: src/dialogs/confdialog.cxx:14446 src/dialogs/confdialog.cxx:14556 msgid "xmt start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:14447 src/dialogs/confdialog.cxx:14557 msgid "Enable this to send start/stop tones" msgstr "" #: src/dialogs/confdialog.cxx:14459 src/dialogs/confdialog.cxx:14564 #: src/dialogs/confdialog.cxx:14566 msgid "Modem/Olivia" msgstr "" #: src/dialogs/confdialog.cxx:14542 msgid "Reset FEC blocks when changing BW or Tones" msgstr "" #: src/dialogs/confdialog.cxx:14543 src/dialogs/confdialog.cxx:14551 msgid "Enable this for UTF-8 character transmission" msgstr "" #: src/dialogs/confdialog.cxx:14569 src/dialogs/confdialog.cxx:14709 #: src/dialogs/confdialog.cxx:14711 #, fuzzy msgid "Modem/Psk" msgstr "Modems" #: src/dialogs/confdialog.cxx:14573 msgid "AFC behavior" msgstr "Comportement AFC" #: src/dialogs/confdialog.cxx:14576 msgid "Acquisition search range (Hz)" msgstr "" #: src/dialogs/confdialog.cxx:14577 msgid "Capture signals within this frequency range" msgstr "" #: src/dialogs/confdialog.cxx:14596 src/dialogs/confdialog.cxx:20095 msgid "Acquisition S/N (dB)" msgstr "" #: src/dialogs/confdialog.cxx:14597 src/dialogs/confdialog.cxx:20096 msgid "Capture signals over this threshold" msgstr "" #: src/dialogs/confdialog.cxx:14618 msgid "S/N and IMD behavior" msgstr "" #: src/dialogs/confdialog.cxx:14621 msgid "after" msgstr "après" #: src/dialogs/confdialog.cxx:14622 msgid "Behavior of s/n imd" msgstr "" #: src/dialogs/confdialog.cxx:14633 msgid "Dim" msgstr "" #: src/dialogs/confdialog.cxx:14638 msgid "seconds" msgstr "secondes" #: src/dialogs/confdialog.cxx:14639 msgid "Will occur after this time in seconds" msgstr "" #: src/dialogs/confdialog.cxx:14659 msgid "Multi-Channel Signal Processing" msgstr "" #: src/dialogs/confdialog.cxx:14662 msgid "Multi-channel detector" msgstr "" #: src/dialogs/confdialog.cxx:14667 msgid "Disable on very slow CPUs or if signal browser is not used" msgstr "" #: src/dialogs/confdialog.cxx:14672 msgid "8 psk" msgstr "" #: src/dialogs/confdialog.cxx:14675 msgid "Pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:14676 msgid "Enable encode/decode vestigial pilot tone" msgstr "" #: src/dialogs/confdialog.cxx:14681 msgid "pilot power (dB)" msgstr "" #: src/dialogs/confdialog.cxx:14682 msgid "Pilot tone power relative to signal" msgstr "" #: src/dialogs/confdialog.cxx:14701 msgid "Short Preamble" msgstr "" #: src/dialogs/confdialog.cxx:14702 msgid "Enable short preamble for 8PSK transmission" msgstr "" #: src/dialogs/confdialog.cxx:14714 src/dialogs/confdialog.cxx:14852 #: src/dialogs/confdialog.cxx:14854 msgid "Modem/TTY/Rx" msgstr "" #: src/dialogs/confdialog.cxx:14721 msgid "AFC speed" msgstr "" #: src/dialogs/confdialog.cxx:14722 msgid "AFC tracking speed" msgstr "" #: src/dialogs/confdialog.cxx:14738 msgid "RX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:14739 msgid "Revert to unshifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:14744 msgid "Filter Shape Factor" msgstr "" #: src/dialogs/confdialog.cxx:14745 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" #: src/dialogs/confdialog.cxx:14755 msgid "Decode (CWI suppression)" msgstr "" #: src/dialogs/confdialog.cxx:14758 msgid "Mark-Space" msgstr "" #: src/dialogs/confdialog.cxx:14763 msgid "Mark only" msgstr "" #: src/dialogs/confdialog.cxx:14768 msgid "Space only" msgstr "" #: src/dialogs/confdialog.cxx:14775 msgid "RTTY Scope Display" msgstr "" #: src/dialogs/confdialog.cxx:14778 msgid "Use cross hair scope" msgstr "" #: src/dialogs/confdialog.cxx:14779 msgid "Default to cross hair digiscope" msgstr "" #: src/dialogs/confdialog.cxx:14784 msgid "XY - classic scope" msgstr "" #: src/dialogs/confdialog.cxx:14785 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" #: src/dialogs/confdialog.cxx:14792 #, fuzzy msgid "Log RTTY frequency" msgstr "Ajuste fréquence curseur" #: src/dialogs/confdialog.cxx:14795 msgid "Use MARK freq'" msgstr "" #: src/dialogs/confdialog.cxx:14796 src/dialogs/confdialog.cxx:14816 #: src/dialogs/confdialog.cxx:14824 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" #: src/dialogs/confdialog.cxx:14803 #, fuzzy msgid "track color" msgstr "Couleur police" #: src/dialogs/confdialog.cxx:14804 msgid "Color of Mark Track" msgstr "" #: src/dialogs/confdialog.cxx:14812 msgid "RTTY Bell" msgstr "" #: src/dialogs/confdialog.cxx:14815 msgid "Audible BELL" msgstr "" #: src/dialogs/confdialog.cxx:14823 #, fuzzy msgid "Visible BELL" msgstr "Modes visibles" #: src/dialogs/confdialog.cxx:14831 msgid "RTTY Bell audio wav" msgstr "" #: src/dialogs/confdialog.cxx:14838 src/dialogs/confdialog.cxx:18385 #: src/dialogs/confdialog.cxx:18414 src/dialogs/confdialog.cxx:18443 #: src/dialogs/confdialog.cxx:18472 src/dialogs/confdialog.cxx:18496 #, fuzzy msgid "Sound:" msgstr "Carte Son" #: src/dialogs/confdialog.cxx:14857 src/dialogs/confdialog.cxx:15028 #: src/dialogs/confdialog.cxx:15030 msgid "Modem/TTY/Tx" msgstr "" #: src/dialogs/confdialog.cxx:14861 #, fuzzy msgid "Sound Card FSK" msgstr "Carte Son" #: src/dialogs/confdialog.cxx:14864 src/dialogs/confdialog.cxx:15099 msgid "Carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:14865 msgid "Select carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:14880 msgid "Custom shift" msgstr "" #: src/dialogs/confdialog.cxx:14881 msgid "Input carrier shift" msgstr "" #: src/dialogs/confdialog.cxx:14899 src/dialogs/confdialog.cxx:15399 #: src/dialogs/confdialog.cxx:15553 msgid "Baud rate" msgstr "" #: src/dialogs/confdialog.cxx:14900 msgid "Select carrier baudrate" msgstr "" #: src/dialogs/confdialog.cxx:14916 msgid "Bits per character" msgstr "" #: src/dialogs/confdialog.cxx:14917 msgid "Select # bits / char" msgstr "" #: src/dialogs/confdialog.cxx:14932 msgid "Parity" msgstr "Parité" #: src/dialogs/confdialog.cxx:14933 msgid "Select parity" msgstr "" #: src/dialogs/confdialog.cxx:14948 src/dialogs/confdialog.cxx:15415 #: src/dialogs/confdialog.cxx:15569 msgid "Stop bits" msgstr "Stop bits" #: src/dialogs/confdialog.cxx:14949 msgid "Select # stop bits" msgstr "" #: src/dialogs/confdialog.cxx:14964 msgid "AutoCRLF" msgstr "" #: src/dialogs/confdialog.cxx:14965 msgid "Add CRLF after page width characters" msgstr "" #: src/dialogs/confdialog.cxx:14970 msgid "chars" msgstr "" #: src/dialogs/confdialog.cxx:14971 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:14989 msgid "CR-CR-LF" msgstr "" #: src/dialogs/confdialog.cxx:14990 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "" #: src/dialogs/confdialog.cxx:14996 msgid "TX - unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:14997 msgid "Revert to Unsifted char's on a space" msgstr "" #: src/dialogs/confdialog.cxx:15002 msgid "Shaped Tx" msgstr "" #: src/dialogs/confdialog.cxx:15003 msgid "Use wave shaping on Tx signal" msgstr "" #: src/dialogs/confdialog.cxx:15009 #, fuzzy msgid "Pseudo-FSK - right channel" msgstr "Canaux" #: src/dialogs/confdialog.cxx:15010 #, fuzzy msgid "Create keyed square wave on right audio channel" msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:15015 #, fuzzy msgid "LTRS at start" msgstr "Démarrer" #: src/dialogs/confdialog.cxx:15016 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "" #: src/dialogs/confdialog.cxx:15033 src/dialogs/confdialog.cxx:15135 #: src/dialogs/confdialog.cxx:15137 #, fuzzy msgid "Modem/TTY/FSK" msgstr "Modem" #: src/dialogs/confdialog.cxx:15037 #, fuzzy #| msgid "DTR is PTT signal line" msgid "DTR/RTS signal line FSK" msgstr "DTR est la ligne de signal PTT" #: src/dialogs/confdialog.cxx:15040 src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Activé" #: src/dialogs/confdialog.cxx:15041 #, fuzzy msgid "Enable FSK on serial port" msgstr "Port série" #: src/dialogs/confdialog.cxx:15047 msgid "Shares RIGIO serial port, or uses" msgstr "" #: src/dialogs/confdialog.cxx:15048 #, fuzzy msgid "Share the RIGIO port" msgstr "Port série" #: src/dialogs/confdialog.cxx:15054 #, fuzzy msgid "Serial Port" msgstr "Port:" #: src/dialogs/confdialog.cxx:15055 #, fuzzy msgid "FSK independent serial port" msgstr "Utiliser un port série PTT à part" #: src/dialogs/confdialog.cxx:15069 msgid "MARK/SPACE reversed" msgstr "" #: src/dialogs/confdialog.cxx:15070 msgid "Reverse Mark/Space" msgstr "" #: src/dialogs/confdialog.cxx:15076 src/dialogs/confdialog.cxx:18252 msgid "Use DTR" msgstr "Utiliser DTR" #: src/dialogs/confdialog.cxx:15077 msgid "Enable DTR signal line, default is RTS" msgstr "" #: src/dialogs/confdialog.cxx:15084 msgid "" "Restart the FSK interface\n" "Necessary if changes made to configuration" msgstr "" #: src/dialogs/confdialog.cxx:15088 msgid "Mark" msgstr "" #: src/dialogs/confdialog.cxx:15089 #, fuzzy msgid "Mark frequency in Hertz" msgstr "Fréquence porteuse (Hz)" #: src/dialogs/confdialog.cxx:15100 #, fuzzy msgid "Carrier shift in Hertz" msgstr "Largeur Chute d'eau en Hz" #: src/dialogs/confdialog.cxx:15115 #, fuzzy #| msgid "Stop bits" msgid "1.5 stop bits" msgstr "Stop bits" #: src/dialogs/confdialog.cxx:15116 msgid "" "Enabled - 1.5 stop bits\n" "Disabled - 2 stop bits" msgstr "" #: src/dialogs/confdialog.cxx:15126 msgid "Use flrig FSK keying" msgstr "" #: src/dialogs/confdialog.cxx:15127 msgid "Enable to use flrig FSK keyer" msgstr "" #: src/dialogs/confdialog.cxx:15140 src/dialogs/confdialog.cxx:15252 #: src/dialogs/confdialog.cxx:15254 msgid "Modem/TTY/nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:15163 #, fuzzy msgid "Serial Baud" msgstr "Numéro progressif" #: src/dialogs/confdialog.cxx:15178 msgid "USB serial I/O" msgstr "" #: src/dialogs/confdialog.cxx:15199 msgid "MARK polarity" msgstr "" #: src/dialogs/confdialog.cxx:15200 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" #: src/dialogs/confdialog.cxx:15205 msgid "TTY Baud" msgstr "" #: src/dialogs/confdialog.cxx:15206 msgid "nanoIO - TTY baud" msgstr "" #: src/dialogs/confdialog.cxx:15222 msgid "Debug Output" msgstr "" #: src/dialogs/confdialog.cxx:15232 #, fuzzy msgid "Clear Sent" msgstr "Effacer Liste" #: src/dialogs/confdialog.cxx:15235 #, fuzzy msgid "Clear Both" msgstr "Effacer Liste" #: src/dialogs/confdialog.cxx:15238 #, fuzzy msgid "Clear Rcvd" msgstr "Effacer" #: src/dialogs/confdialog.cxx:15247 #, fuzzy msgid "TTY i/o" msgstr "Texte:" #: src/dialogs/confdialog.cxx:15248 msgid "Enable TTY operation" msgstr "" #: src/dialogs/confdialog.cxx:15257 src/dialogs/confdialog.cxx:15485 #: src/dialogs/confdialog.cxx:15487 msgid "Modem/TTY/Navigator" msgstr "" #: src/dialogs/confdialog.cxx:15261 #, fuzzy msgid "FSK Interface" msgstr "Interface Utilisateur" #: src/dialogs/confdialog.cxx:15265 #, fuzzy msgid "Navigator serial port" msgstr "Port série" #: src/dialogs/confdialog.cxx:15279 #, fuzzy msgid "FSK" msgstr "PSK" #: src/dialogs/confdialog.cxx:15280 msgid "Connect / Disconnect from Nav FSK port" msgstr "" #: src/dialogs/confdialog.cxx:15285 src/dialogs/confdialog.cxx:15550 msgid "Configuration Interface" msgstr "" #: src/dialogs/confdialog.cxx:15289 #, fuzzy msgid "Navigator configuration port" msgstr "Configuration Fldigi" #: src/dialogs/confdialog.cxx:15303 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Numéro du canal" #: src/dialogs/confdialog.cxx:15304 msgid "Nav Channel 1 attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15319 #, fuzzy msgid "Channel 2 attenuator" msgstr "Numéro du canal" #: src/dialogs/confdialog.cxx:15320 msgid "NavChannel 2 Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15335 msgid "RF attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15336 msgid "NavRF Attenuator" msgstr "" #: src/dialogs/confdialog.cxx:15351 msgid "WinKey PTT" msgstr "" #: src/dialogs/confdialog.cxx:15352 src/dialogs/confdialog.cxx:15586 msgid "NavWinkey PTT" msgstr "" #: src/dialogs/confdialog.cxx:15367 msgid "LED brightness" msgstr "" #: src/dialogs/confdialog.cxx:15368 msgid "NavLED brightness" msgstr "" #: src/dialogs/confdialog.cxx:15383 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:15384 msgid "NavCAT state LED" msgstr "" #: src/dialogs/confdialog.cxx:15400 src/dialogs/confdialog.cxx:15554 msgid "Nav FSK baud rate" msgstr "" #: src/dialogs/confdialog.cxx:15416 src/dialogs/confdialog.cxx:15570 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Stop bits" #: src/dialogs/confdialog.cxx:15431 src/dialogs/confdialog.cxx:15601 #, fuzzy msgid "Mark Polarity" msgstr "Parité" #: src/dialogs/confdialog.cxx:15432 src/dialogs/confdialog.cxx:15602 msgid "Nav FSK MARK Polarity" msgstr "" #: src/dialogs/confdialog.cxx:15447 msgid "Side tone" msgstr "" #: src/dialogs/confdialog.cxx:15448 src/dialogs/confdialog.cxx:15618 #: src/dialogs/confdialog.cxx:15634 msgid "Nav FSK side tone" msgstr "" #: src/dialogs/confdialog.cxx:15463 msgid "FSK PTT" msgstr "" #: src/dialogs/confdialog.cxx:15464 msgid "Nav FSK PTT - should always be on" msgstr "" #: src/dialogs/confdialog.cxx:15479 #, fuzzy msgid "Config" msgstr "Confirmer" #: src/dialogs/confdialog.cxx:15480 msgid "Connect / Disconnect from Nav Config port" msgstr "" #: src/dialogs/confdialog.cxx:15490 src/dialogs/confdialog.cxx:15516 #: src/dialogs/confdialog.cxx:15518 msgid "Modem/TTY/Synop" msgstr "" #: src/dialogs/confdialog.cxx:15494 msgid "SYNOP to ADIF" msgstr "" #: src/dialogs/confdialog.cxx:15495 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" #: src/dialogs/confdialog.cxx:15501 msgid "SYNOP to KML" msgstr "" #: src/dialogs/confdialog.cxx:15502 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" #: src/dialogs/confdialog.cxx:15509 msgid "Interleave SYNOP and text" msgstr "" #: src/dialogs/confdialog.cxx:15510 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "" #: src/dialogs/confdialog.cxx:15521 src/dialogs/confdialog.cxx:15715 #: src/dialogs/confdialog.cxx:15717 msgid "Modem/TTY/Winkeyer 3" msgstr "" #: src/dialogs/confdialog.cxx:15525 #, fuzzy msgid "Serial Interface" msgstr "Interface Utilisateur" #: src/dialogs/confdialog.cxx:15585 #, fuzzy msgid "FSK port" msgstr "report" #: src/dialogs/confdialog.cxx:15633 msgid "Auto CRLF" msgstr "" #: src/dialogs/confdialog.cxx:15649 msgid "Diddle" msgstr "" #: src/dialogs/confdialog.cxx:15650 msgid "Diddle On/OFF" msgstr "" #: src/dialogs/confdialog.cxx:15665 msgid "Diddle char" msgstr "" #: src/dialogs/confdialog.cxx:15666 msgid "Diddle character" msgstr "" #: src/dialogs/confdialog.cxx:15681 msgid "USOS" msgstr "" #: src/dialogs/confdialog.cxx:15682 src/dialogs/confdialog.cxx:15698 msgid "Unshift on space" msgstr "" #: src/dialogs/confdialog.cxx:15697 msgid "Echo" msgstr "" #: src/dialogs/confdialog.cxx:15720 src/dialogs/confdialog.cxx:15833 #: src/dialogs/confdialog.cxx:15835 #, fuzzy msgid "Modem/Thor" msgstr "Modem" #: src/dialogs/confdialog.cxx:15740 msgid "Enable DSP prior to decoder" msgstr "" #: src/dialogs/confdialog.cxx:15782 msgid "Preamble Detection" msgstr "" #: src/dialogs/confdialog.cxx:15783 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" #: src/dialogs/confdialog.cxx:15788 msgid "Soft-symbol decoding" msgstr "" #: src/dialogs/confdialog.cxx:15789 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:15794 msgid "Soft-bit decoding" msgstr "" #: src/dialogs/confdialog.cxx:15795 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" #: src/dialogs/confdialog.cxx:15821 #, fuzzy msgid "" "\n" "Operator Avatar" msgstr "Nom opérateur" #: src/dialogs/confdialog.cxx:15838 src/dialogs/confdialog.cxx:15853 #: src/dialogs/confdialog.cxx:15855 msgid "Modem/Navtex" msgstr "" #: src/dialogs/confdialog.cxx:15842 msgid "Log Navtex messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:15847 msgid "Log Navtex messages to KML" msgstr "" #: src/dialogs/confdialog.cxx:15848 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" #: src/dialogs/confdialog.cxx:15858 src/dialogs/confdialog.cxx:15979 #: src/dialogs/confdialog.cxx:15981 #, fuzzy msgid "Modem/Wefax" msgstr "Modem" #: src/dialogs/confdialog.cxx:15862 #, fuzzy msgid "Frequency shift" msgstr "Fréquence" #: src/dialogs/confdialog.cxx:15863 msgid "" "Frequency shift of WEFAX signal\n" "Nominal 800 Hz" msgstr "" #: src/dialogs/confdialog.cxx:15874 msgid "" "Center of WEFAX signal\n" "Nominal 1900 Hz" msgstr "" #: src/dialogs/confdialog.cxx:15884 msgid "Max Image Rows" msgstr "" #: src/dialogs/confdialog.cxx:15885 msgid "Force save split image" msgstr "" #: src/dialogs/confdialog.cxx:15895 msgid "Fax images destination directory" msgstr "" #: src/dialogs/confdialog.cxx:15896 msgid "Store images in this directory" msgstr "" #: src/dialogs/confdialog.cxx:15901 msgid "Directory..." msgstr "" #: src/dialogs/confdialog.cxx:15902 #, fuzzy msgid "Select destination directory" msgstr "Sélectionner paramètres opératoires" #: src/dialogs/confdialog.cxx:15905 msgid "Log Wefax messages to Adif file" msgstr "" #: src/dialogs/confdialog.cxx:15906 msgid "Sent and received faxes are logged to Adif file." msgstr "" #: src/dialogs/confdialog.cxx:15911 src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtre" #: src/dialogs/confdialog.cxx:15917 #, fuzzy msgid "Enable Auto-align after" msgstr "Afficher / masquer les astuces" #: src/dialogs/confdialog.cxx:15927 msgid "Stop Auto-align after" msgstr "" #: src/dialogs/confdialog.cxx:15937 msgid "Auto-align every" msgstr "" #: src/dialogs/confdialog.cxx:15947 src/dialogs/confdialog.cxx:15950 #: src/dialogs/confdialog.cxx:15953 #, fuzzy msgid "rows" msgstr "Navigateur" #: src/dialogs/confdialog.cxx:15956 #, fuzzy msgid "Correlation" msgstr "Locator" #: src/dialogs/confdialog.cxx:15957 msgid "" "Row-to-row correlation\n" "Used to detect presence of WEFAX signal\n" "Lower: more false detections" msgstr "" #: src/dialogs/confdialog.cxx:15968 msgid "# Correlation rows" msgstr "" #: src/dialogs/confdialog.cxx:15969 msgid "Compute correlation factor over this # rows" msgstr "" #: src/dialogs/confdialog.cxx:15984 src/dialogs/confdialog.cxx:16185 #: src/dialogs/confdialog.cxx:16187 #, fuzzy msgid "Misc/Autostart" msgstr "Lancement automatique" #: src/dialogs/confdialog.cxx:15988 msgid "flrig:" msgstr "" #: src/dialogs/confdialog.cxx:15989 msgid "Enter full path-filename for flrig" msgstr "" #: src/dialogs/confdialog.cxx:16003 msgid "Locate flrig executable" msgstr "" #: src/dialogs/confdialog.cxx:16006 msgid "flamp:" msgstr "" #: src/dialogs/confdialog.cxx:16007 msgid "Enter full path-filename for flamp" msgstr "" #: src/dialogs/confdialog.cxx:16021 msgid "Locate flamp executable" msgstr "" #: src/dialogs/confdialog.cxx:16024 msgid "flnet:" msgstr "" #: src/dialogs/confdialog.cxx:16025 msgid "Enter full path-filename for flnet" msgstr "" #: src/dialogs/confdialog.cxx:16039 msgid "Locate flnet executable" msgstr "" #: src/dialogs/confdialog.cxx:16042 msgid "fllog:" msgstr "" #: src/dialogs/confdialog.cxx:16043 msgid "Enter full path-filename for fllog" msgstr "" #: src/dialogs/confdialog.cxx:16057 msgid "Locate fllog executable" msgstr "" #: src/dialogs/confdialog.cxx:16060 msgid "Prog 1:" msgstr "" #: src/dialogs/confdialog.cxx:16061 src/dialogs/confdialog.cxx:16079 #: src/dialogs/confdialog.cxx:16097 msgid "Enter full path-filename for external program" msgstr "" #: src/dialogs/confdialog.cxx:16075 msgid "Locate program #1 executable" msgstr "" #: src/dialogs/confdialog.cxx:16078 msgid "Prog 2:" msgstr "" #: src/dialogs/confdialog.cxx:16093 msgid "Locate program #2 executable" msgstr "" #: src/dialogs/confdialog.cxx:16096 msgid "Prog 3:" msgstr "" #: src/dialogs/confdialog.cxx:16111 msgid "Locate program #3 executable" msgstr "" #: src/dialogs/confdialog.cxx:16114 #, fuzzy msgid "" "Enable\n" "-" msgstr "Activé" #: src/dialogs/confdialog.cxx:16115 src/dialogs/confdialog.cxx:16122 #: src/dialogs/confdialog.cxx:16128 src/dialogs/confdialog.cxx:16134 #: src/dialogs/confdialog.cxx:16140 src/dialogs/confdialog.cxx:16146 #: src/dialogs/confdialog.cxx:16152 msgid "Enable this entry when fldigi first starts" msgstr "" #: src/dialogs/confdialog.cxx:16158 msgid "Start flrig" msgstr "" #: src/dialogs/confdialog.cxx:16162 #, fuzzy msgid "Start flamp" msgstr "Date QSO" #: src/dialogs/confdialog.cxx:16166 #, fuzzy msgid "Start flnet" msgstr "Date QSO" #: src/dialogs/confdialog.cxx:16170 msgid "Start fllog" msgstr "" #: src/dialogs/confdialog.cxx:16174 msgid "Start prog1" msgstr "" #: src/dialogs/confdialog.cxx:16178 msgid "Start prog2" msgstr "" #: src/dialogs/confdialog.cxx:16182 msgid "Start prog3" msgstr "" #: src/dialogs/confdialog.cxx:16190 src/dialogs/confdialog.cxx:16200 #: src/dialogs/confdialog.cxx:16202 #, fuzzy msgid "Misc/CPU" msgstr "Divers" #: src/dialogs/confdialog.cxx:16194 msgid "Slow CPU (less than 700MHz)" msgstr "" #: src/dialogs/confdialog.cxx:16195 msgid "Enable if you're computer does not decode properly" msgstr "" #: src/dialogs/confdialog.cxx:16205 src/dialogs/confdialog.cxx:16215 #: src/dialogs/confdialog.cxx:16217 #, fuzzy msgid "Misc/DTMF" msgstr "Divers" #: src/dialogs/confdialog.cxx:16209 msgid "Decode DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:16210 msgid "Decode received DTMF tones" msgstr "" #: src/dialogs/confdialog.cxx:16220 src/dialogs/confdialog.cxx:16323 #: src/dialogs/confdialog.cxx:16325 #, fuzzy msgid "Misc/KML" msgstr "Divers" #: src/dialogs/confdialog.cxx:16224 msgid "KML files directory" msgstr "" #: src/dialogs/confdialog.cxx:16225 msgid "Where generated KML documents are stored." msgstr "" #: src/dialogs/confdialog.cxx:16230 msgid "KML root file" msgstr "" #: src/dialogs/confdialog.cxx:16234 msgid "Minimum distance for splitting aliases (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:16235 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "" #: src/dialogs/confdialog.cxx:16245 msgid "Data retention time, in hours (0 for no limit)" msgstr "" #: src/dialogs/confdialog.cxx:16246 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" #: src/dialogs/confdialog.cxx:16255 msgid "KML refresh interval (seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16256 msgid "Refresh time interval written in KML file (Seconds)" msgstr "" #: src/dialogs/confdialog.cxx:16272 msgid "KML balloon display style" msgstr "" #: src/dialogs/confdialog.cxx:16273 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" #: src/dialogs/confdialog.cxx:16288 #, fuzzy msgid "Command run on KML creation" msgstr "Options ligne de commande" #: src/dialogs/confdialog.cxx:16289 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" #: src/dialogs/confdialog.cxx:16295 msgid "Test command" msgstr "" #: src/dialogs/confdialog.cxx:16296 msgid "Execute command on KML files." msgstr "" #: src/dialogs/confdialog.cxx:16299 #, fuzzy msgid "Change dir..." msgstr "Change couleur" #: src/dialogs/confdialog.cxx:16300 msgid "Choose directory to store KML documents" msgstr "" #: src/dialogs/confdialog.cxx:16303 msgid "Cleanup KML data now !" msgstr "" #: src/dialogs/confdialog.cxx:16304 msgid "Cleanups KML documents, empties Google Earth display." msgstr "" #: src/dialogs/confdialog.cxx:16307 msgid "Cleanup on startup" msgstr "" #: src/dialogs/confdialog.cxx:16308 msgid "Empties KML documents when starting program." msgstr "" #: src/dialogs/confdialog.cxx:16315 msgid "KML server enabled (On / Off)" msgstr "" #: src/dialogs/confdialog.cxx:16316 msgid "Uncheck if KML is never used" msgstr "" #: src/dialogs/confdialog.cxx:16328 src/dialogs/confdialog.cxx:16410 #: src/dialogs/confdialog.cxx:16412 #, fuzzy msgid "Misc/NBEMS interface" msgstr "Interface Utilisateur" #: src/dialogs/confdialog.cxx:16332 msgid "NBEMS data file interface" msgstr "" #: src/dialogs/confdialog.cxx:16336 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" #: src/dialogs/confdialog.cxx:16341 #, fuzzy msgid "Open message folder" msgstr "Ouvrir fichier macros" #: src/dialogs/confdialog.cxx:16342 msgid "Opens NBEMS file folder upon successful capture" msgstr "" #: src/dialogs/confdialog.cxx:16349 msgid "Reception of flmsg files" msgstr "" #: src/dialogs/confdialog.cxx:16352 msgid "Open with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16353 msgid "Open message with flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16358 #, fuzzy msgid "Open in browser" msgstr "Navigateur PSK" #: src/dialogs/confdialog.cxx:16359 msgid "Open file with default browser" msgstr "" #: src/dialogs/confdialog.cxx:16364 msgid "flmsg:" msgstr "" #: src/dialogs/confdialog.cxx:16365 msgid "Enter full path-filename for flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16378 msgid "Locate flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16382 msgid "Timeout (secs)" msgstr "" #: src/dialogs/confdialog.cxx:16383 msgid "Extract times out after NN seconds of inactivity." msgstr "" #: src/dialogs/confdialog.cxx:16396 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" #: src/dialogs/confdialog.cxx:16400 msgid "Transfer direct to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16401 msgid "Send data stream directly to executing flmsg" msgstr "" #: src/dialogs/confdialog.cxx:16415 src/dialogs/confdialog.cxx:16493 #: src/dialogs/confdialog.cxx:16495 #, fuzzy msgid "Misc/PSK reporter" msgstr "report" #: src/dialogs/confdialog.cxx:16419 msgid "Automatically spot callsigns in decoded text" msgstr "" #: src/dialogs/confdialog.cxx:16420 msgid "Parse all incoming text" msgstr "" #: src/dialogs/confdialog.cxx:16425 msgid "Send reception report when logging a QSO" msgstr "" #: src/dialogs/confdialog.cxx:16426 msgid "Send report only when QSO is logged" msgstr "" #: src/dialogs/confdialog.cxx:16431 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" #: src/dialogs/confdialog.cxx:16432 msgid "Include the transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:16437 msgid "Disable spotting when signal browser(s) are not visible." msgstr "" #: src/dialogs/confdialog.cxx:16438 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" #: src/dialogs/confdialog.cxx:16444 msgid "Log on to pskrep when starting fldigi" msgstr "" #: src/dialogs/confdialog.cxx:16445 msgid "Automatically start psk reporter socket connection" msgstr "" #: src/dialogs/confdialog.cxx:16455 msgid "Host:" msgstr "Hôte:" #: src/dialogs/confdialog.cxx:16456 msgid "To whom the connection is made" msgstr "" #: src/dialogs/confdialog.cxx:16470 msgid "Port:" msgstr "Port:" #: src/dialogs/confdialog.cxx:16471 msgid "Using UDP port #" msgstr "" #: src/dialogs/confdialog.cxx:16486 msgid "Initialize the socket client" msgstr "" #: src/dialogs/confdialog.cxx:16489 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:16498 src/dialogs/confdialog.cxx:16668 #: src/dialogs/confdialog.cxx:16670 #, fuzzy msgid "Misc/PSM" msgstr "Divers" #: src/dialogs/confdialog.cxx:16505 msgid "Allow TX After Signal Detection (Secs)" msgstr "" #: src/dialogs/confdialog.cxx:16506 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" #: src/dialogs/confdialog.cxx:16516 #, fuzzy msgid "Enable Busy Channel" msgstr "Active le canal audio droit" #: src/dialogs/confdialog.cxx:16517 msgid "Enable to inhibit TX on signal Detections" msgstr "" #: src/dialogs/confdialog.cxx:16523 msgid "TX Buffer Flush Timer (Mins, 0=Disable)" msgstr "" #: src/dialogs/confdialog.cxx:16524 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" #: src/dialogs/confdialog.cxx:16535 msgid "Modem Bandwidth Margins " msgstr "" #: src/dialogs/confdialog.cxx:16536 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "" #: src/dialogs/confdialog.cxx:16546 msgid "Valid Signal Sample Period (msecs)" msgstr "" #: src/dialogs/confdialog.cxx:16547 msgid "Valid signal sample period in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16562 #, fuzzy msgid "Enable CSMA" msgstr "Activé" #: src/dialogs/confdialog.cxx:16563 msgid "Carrier Sense Mulitiple Access" msgstr "" #: src/dialogs/confdialog.cxx:16568 msgid "Persistance" msgstr "" #: src/dialogs/confdialog.cxx:16569 msgid "Used to adjust the aggressiveness of TX" msgstr "" #: src/dialogs/confdialog.cxx:16579 #, fuzzy msgid "Slot Time" msgstr "Heure" #: src/dialogs/confdialog.cxx:16580 msgid "Non transmit window after a transmit period" msgstr "" #: src/dialogs/confdialog.cxx:16590 #, fuzzy msgid "Transmit Data Delay" msgstr "Modes transmission" #: src/dialogs/confdialog.cxx:16591 msgid "Idle transmit before data sent" msgstr "" #: src/dialogs/confdialog.cxx:16601 src/dialogs/confdialog.cxx:16605 #, fuzzy msgid "MilliSeconds" msgstr "secondes" #: src/dialogs/confdialog.cxx:16602 src/dialogs/confdialog.cxx:16610 msgid "Displays the Slot Time in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16606 msgid "Displays the Transmit Delay in Milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:16609 msgid "Percent (%)" msgstr "" #: src/dialogs/confdialog.cxx:16618 msgid "Enable Histogram" msgstr "" #: src/dialogs/confdialog.cxx:16619 msgid "Enable Histogram threshold signal monitoring" msgstr "" #: src/dialogs/confdialog.cxx:16624 msgid "PSM Histogram Threshold" msgstr "" #: src/dialogs/confdialog.cxx:16625 msgid "Sets the theshold level to x value above the noise level" msgstr "" #: src/dialogs/confdialog.cxx:16640 msgid "PSM Attenuate" msgstr "" #: src/dialogs/confdialog.cxx:16641 msgid "Adjust sensitivity by 1/N fractional values." msgstr "" #: src/dialogs/confdialog.cxx:16657 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "" #: src/dialogs/confdialog.cxx:16658 msgid "display PSM button on main dialog" msgstr "" #: src/dialogs/confdialog.cxx:16665 #, fuzzy msgid "Default Settings" msgstr "" "La phrase test par défaut est:\n" " \"" #: src/dialogs/confdialog.cxx:16673 src/dialogs/confdialog.cxx:16705 #: src/dialogs/confdialog.cxx:16707 #, fuzzy msgid "Misc/Rx text capture" msgstr "Capture le texte" #: src/dialogs/confdialog.cxx:16677 msgid "Talker Socket (MS only)" msgstr "" #: src/dialogs/confdialog.cxx:16680 msgid "Talker" msgstr "" #: src/dialogs/confdialog.cxx:16684 msgid "Connect/disconnect to Talker socket server" msgstr "" #: src/dialogs/confdialog.cxx:16687 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" #: src/dialogs/confdialog.cxx:16694 msgid "Capture rx text to external file" msgstr "" #: src/dialogs/confdialog.cxx:16697 msgid "Enable rx text stream" msgstr "" #: src/dialogs/confdialog.cxx:16698 msgid "Send rx text to file: textout.txt" msgstr "" #: src/dialogs/confdialog.cxx:16710 src/dialogs/confdialog.cxx:16748 #: src/dialogs/confdialog.cxx:16750 #, fuzzy msgid "Misc/Save Parameters" msgstr "Sélectionner paramètres opératoires" #: src/dialogs/confdialog.cxx:16714 #, fuzzy msgid "Transmit level control" msgstr "Transmission" #: src/dialogs/confdialog.cxx:16715 msgid "Save transmit level control by mode" msgstr "" #: src/dialogs/confdialog.cxx:16721 msgid "Squelch level/activated control(s)" msgstr "" #: src/dialogs/confdialog.cxx:16722 msgid "Save Squelch level and state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16728 msgid "Enable specific parameter to Save & Restore on a per mode/band basis." msgstr "" #: src/dialogs/confdialog.cxx:16734 #, fuzzy #| msgid "ARQ control" msgid "AFC control" msgstr "Contrôle ARQ" #: src/dialogs/confdialog.cxx:16735 msgid "Save AFC state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16741 #, fuzzy #| msgid "Reverse video" msgid "Reverse (Rv) control" msgstr "Inverse vidéo" #: src/dialogs/confdialog.cxx:16742 msgid "Save Reverse state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16753 src/dialogs/confdialog.cxx:16837 #: src/dialogs/confdialog.cxx:16839 msgid "Misc/Sweet Spot" msgstr "" #: src/dialogs/confdialog.cxx:16760 msgid "CW" msgstr "" #: src/dialogs/confdialog.cxx:16761 msgid "Default CW tracking point" msgstr "" #: src/dialogs/confdialog.cxx:16779 msgid "RTTY" msgstr "" #: src/dialogs/confdialog.cxx:16780 msgid "Default RTTY tracking point" msgstr "" #: src/dialogs/confdialog.cxx:16798 msgid "PSK et al." msgstr "" #: src/dialogs/confdialog.cxx:16799 msgid "Default for all other modems" msgstr "" #: src/dialogs/confdialog.cxx:16817 msgid "Always start new modems at these frequencies" msgstr "" #: src/dialogs/confdialog.cxx:16818 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" #: src/dialogs/confdialog.cxx:16826 #, fuzzy msgid "K3 A1A configuation" msgstr "Configuration avancée:" #: src/dialogs/confdialog.cxx:16829 msgid "CW is LSB" msgstr "" #: src/dialogs/confdialog.cxx:16830 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" #: src/dialogs/confdialog.cxx:16842 src/dialogs/confdialog.cxx:17166 #: src/dialogs/confdialog.cxx:17168 msgid "Misc/TCP-IP sessions" msgstr "" #: src/dialogs/confdialog.cxx:16850 msgid "Lock" msgstr "" #: src/dialogs/confdialog.cxx:16851 msgid "Allow/Disallow Changes" msgstr "" #: src/dialogs/confdialog.cxx:16856 #, fuzzy msgid "Enable ARQ" msgstr "Activé" #: src/dialogs/confdialog.cxx:16857 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "" #: src/dialogs/confdialog.cxx:16864 #, fuzzy msgid "Enable KISS" msgstr "Activé" #: src/dialogs/confdialog.cxx:16865 msgid "Used for BPQ32" msgstr "" #: src/dialogs/confdialog.cxx:16872 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" #: src/dialogs/confdialog.cxx:16879 msgid "KISS" msgstr "" #: src/dialogs/confdialog.cxx:16882 src/dialogs/confdialog.cxx:16999 #: src/dialogs/confdialog.cxx:17051 src/dialogs/confdialog.cxx:17098 #: src/dialogs/confdialog.cxx:17140 src/dialogs/confdialog.cxx:17352 #, fuzzy msgid "Addr" msgstr "Adresse:" #: src/dialogs/confdialog.cxx:16883 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:16899 msgid "I/O" msgstr "" #: src/dialogs/confdialog.cxx:16900 src/dialogs/confdialog.cxx:17017 #: src/dialogs/confdialog.cxx:17069 src/dialogs/confdialog.cxx:17116 #: src/dialogs/confdialog.cxx:17149 src/dialogs/confdialog.cxx:17369 msgid "IP Address Port Number" msgstr "" #: src/dialogs/confdialog.cxx:16916 msgid "Output port number when same IP address used" msgstr "" #: src/dialogs/confdialog.cxx:16931 msgid "DP" msgstr "" #: src/dialogs/confdialog.cxx:16932 msgid "Enable when both programs are using the same IP address" msgstr "" #: src/dialogs/confdialog.cxx:16938 src/dialogs/confdialog.cxx:17037 #: src/dialogs/confdialog.cxx:17084 #, fuzzy msgid "Restart" msgstr "Démarrer" #: src/dialogs/confdialog.cxx:16942 msgid "Start" msgstr "Démarrer" #: src/dialogs/confdialog.cxx:16943 msgid "Return KISS TCP IO connection to a Listening state" msgstr "" #: src/dialogs/confdialog.cxx:16952 msgid "TCP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16953 msgid "Check to enable TCP/IP IO Connection" msgstr "" #: src/dialogs/confdialog.cxx:16959 msgid "UDP/IP" msgstr "" #: src/dialogs/confdialog.cxx:16960 msgid "Check to enable UDP/IP IO" msgstr "" #: src/dialogs/confdialog.cxx:16966 msgid "Listen / Bind" msgstr "" #: src/dialogs/confdialog.cxx:16967 msgid "Monitor for TCP connection." msgstr "" #: src/dialogs/confdialog.cxx:16973 msgid "Inhibit 7bit Modem" msgstr "" #: src/dialogs/confdialog.cxx:16974 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" #: src/dialogs/confdialog.cxx:16980 msgid "Auto Connect / Retry" msgstr "" #: src/dialogs/confdialog.cxx:16981 msgid "Connect to host program on FLDIGI start up" msgstr "" #: src/dialogs/confdialog.cxx:16987 msgid "AX25 Decode" msgstr "" #: src/dialogs/confdialog.cxx:16988 msgid "Decode AX25 Packets into human readable form" msgstr "" #: src/dialogs/confdialog.cxx:16996 msgid "ARQ" msgstr "" #: src/dialogs/confdialog.cxx:17000 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17043 msgid "XML" msgstr "" #: src/dialogs/confdialog.cxx:17052 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17090 msgid "flrig" msgstr "" #: src/dialogs/confdialog.cxx:17099 src/dialogs/confdialog.cxx:17353 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17131 src/dialogs/confdialog.cxx:17155 #: src/dialogs/confdialog.cxx:17383 #, fuzzy msgid "Reconnect" msgstr "ReConnecter" #: src/dialogs/confdialog.cxx:17137 msgid "fllog" msgstr "" #: src/dialogs/confdialog.cxx:17141 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" #: src/dialogs/confdialog.cxx:17172 src/dialogs/confdialog.cxx:17323 #: src/dialogs/confdialog.cxx:17325 #, fuzzy msgid "Operator-Station" msgstr "Information opérateur" #: src/dialogs/confdialog.cxx:17177 #, fuzzy msgid "Station Callsign:" msgstr "Indiatifs des opérateurs" #: src/dialogs/confdialog.cxx:17178 #, fuzzy msgid "Station callsign" msgstr "Indiatifs des opérateurs" #: src/dialogs/confdialog.cxx:17191 #, fuzzy msgid "Operator Callsign:" msgstr "Indiatifs des opérateurs" #: src/dialogs/confdialog.cxx:17192 msgid "Operator callsign (if different than station callsign)" msgstr "" #: src/dialogs/confdialog.cxx:17206 #, fuzzy msgid "Operator Name:" msgstr "Nom opérateur" #: src/dialogs/confdialog.cxx:17207 msgid "Operators name" msgstr "Noms des opérateurs" #: src/dialogs/confdialog.cxx:17220 msgid "Antenna:" msgstr "Antenne:" #: src/dialogs/confdialog.cxx:17221 msgid "Short description of antenna" msgstr "Courte description de l'antenne" #: src/dialogs/confdialog.cxx:17234 #, fuzzy msgid "Station City:" msgstr "Station" #: src/dialogs/confdialog.cxx:17249 #, fuzzy msgid "Station Locator:" msgstr "Locator:" #: src/dialogs/confdialog.cxx:17250 msgid "Maidenhead locator as in EM64qv" msgstr "Localisation Maidenhead" #: src/dialogs/confdialog.cxx:17263 #, fuzzy msgid "State/Prov./Country" msgstr "Province Can." #: src/dialogs/confdialog.cxx:17264 msgid "US States / Canadian Provinces" msgstr "" #: src/dialogs/confdialog.cxx:17281 msgid "Abbreviation for State/Province" msgstr "" #: src/dialogs/confdialog.cxx:17293 msgid "Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17294 msgid "US/Canadian Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17311 msgid "Abbreviation for County/Region" msgstr "" #: src/dialogs/confdialog.cxx:17328 src/dialogs/confdialog.cxx:17426 #: src/dialogs/confdialog.cxx:17428 #, fuzzy msgid "Rig Control/flrig" msgstr "Contrôle radio" #: src/dialogs/confdialog.cxx:17332 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" #: src/dialogs/confdialog.cxx:17336 msgid "Flrig PTT keys modem" msgstr "" #: src/dialogs/confdialog.cxx:17337 msgid "\" \"" msgstr "" #: src/dialogs/confdialog.cxx:17344 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" #: src/dialogs/confdialog.cxx:17384 msgid "Press only if you change the address/port" msgstr "" #: src/dialogs/confdialog.cxx:17389 msgid "flrig is the preferred method of tranceiver control" msgstr "" #: src/dialogs/confdialog.cxx:17392 msgid "Enable flrig xcvr control with fldigi as client" msgstr "" #: src/dialogs/confdialog.cxx:17393 src/dialogs/confdialog.cxx:17399 msgid "Disable if flrig not used." msgstr "" #: src/dialogs/confdialog.cxx:17398 msgid "Shutdown flrig with fldigi" msgstr "" #: src/dialogs/confdialog.cxx:17404 #, fuzzy msgid "Poll Interval (msec)" msgstr "Intervalles fixes" #: src/dialogs/confdialog.cxx:17405 msgid "Request updates every 'poll interval' milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:17431 src/dialogs/confdialog.cxx:17634 #: src/dialogs/confdialog.cxx:17636 msgid "Rig Control/CAT (rigcat)" msgstr "" #: src/dialogs/confdialog.cxx:17435 msgid "Use RigCAT" msgstr "Utiliser RigCAT" #: src/dialogs/confdialog.cxx:17436 msgid "RigCAT used for rig control" msgstr "" #: src/dialogs/confdialog.cxx:17443 msgid "Rig description file:" msgstr "" #: src/dialogs/confdialog.cxx:17444 msgid "Use Open to select descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:17450 msgid "Select rig descriptor file" msgstr "" #: src/dialogs/confdialog.cxx:17454 src/dialogs/confdialog.cxx:17940 #: src/dialogs/confdialog.cxx:18210 src/dialogs/confdialog.cxx:18551 msgid "Device:" msgstr "Périphérique:" #: src/dialogs/confdialog.cxx:17469 src/dialogs/confdialog.cxx:17955 msgid "Retries" msgstr "" #: src/dialogs/confdialog.cxx:17470 msgid "# retries before giving up" msgstr "" #: src/dialogs/confdialog.cxx:17486 msgid "Retry interval (ms)" msgstr "" #: src/dialogs/confdialog.cxx:17487 msgid "Time between retires in msec" msgstr "" #: src/dialogs/confdialog.cxx:17503 msgid "Write delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:17504 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:17520 src/dialogs/confdialog.cxx:18023 msgid "Baud rate:" msgstr "" #: src/dialogs/confdialog.cxx:17536 src/dialogs/confdialog.cxx:18039 msgid "Stopbits" msgstr "Bits stop" #: src/dialogs/confdialog.cxx:17556 msgid "Initialize RigCAT interface" msgstr "Initialise interface RigCAT" #: src/dialogs/confdialog.cxx:17560 msgid "Commands are echoed" msgstr "" #: src/dialogs/confdialog.cxx:17561 msgid "Rig or interface echos serial data" msgstr "" #: src/dialogs/confdialog.cxx:17566 msgid "CAT command for PTT" msgstr "" #: src/dialogs/confdialog.cxx:17567 msgid "PTT is a CAT command (not hardware)" msgstr "" #: src/dialogs/confdialog.cxx:17573 msgid "Toggle RTS for PTT" msgstr "" #: src/dialogs/confdialog.cxx:17574 msgid "RTS is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:17579 msgid "Toggle DTR for PTT" msgstr "" #: src/dialogs/confdialog.cxx:17580 msgid "DTR is ptt line" msgstr "" #: src/dialogs/confdialog.cxx:17585 msgid "RTS +12 v" msgstr "" #: src/dialogs/confdialog.cxx:17586 src/dialogs/confdialog.cxx:18096 msgid "Initial state of RTS" msgstr "" #: src/dialogs/confdialog.cxx:17591 msgid "DTR +12 v" msgstr "" #: src/dialogs/confdialog.cxx:17592 src/dialogs/confdialog.cxx:18090 msgid "Initial state of DTR" msgstr "" #: src/dialogs/confdialog.cxx:17597 src/dialogs/confdialog.cxx:18101 msgid "RTS/CTS flow control" msgstr "Contrôle de flux RTS/CTS" #: src/dialogs/confdialog.cxx:17598 msgid "Rig uses RTS/CTS handshake" msgstr "" #: src/dialogs/confdialog.cxx:17603 msgid "Restore UART Settings on Close" msgstr "" #: src/dialogs/confdialog.cxx:17604 msgid "Restore the serial (COM) port settings" msgstr "" #: src/dialogs/confdialog.cxx:17609 #, fuzzy msgid "VSP Enable" msgstr "Activé" #: src/dialogs/confdialog.cxx:17610 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "" #: src/dialogs/confdialog.cxx:17615 msgid "Init delay (ms)" msgstr "" #: src/dialogs/confdialog.cxx:17616 msgid "Wait for response to first CAT command" msgstr "" #: src/dialogs/confdialog.cxx:17639 src/dialogs/confdialog.cxx:17910 #: src/dialogs/confdialog.cxx:17912 #, fuzzy msgid "Rig Control/GPIO" msgstr "Contrôle radio" #: src/dialogs/confdialog.cxx:17643 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:17644 src/dialogs/confdialog.cxx:17778 #: src/dialogs/confdialog.cxx:17785 src/dialogs/confdialog.cxx:17792 #: src/dialogs/confdialog.cxx:17799 src/dialogs/confdialog.cxx:17806 #: src/dialogs/confdialog.cxx:17813 src/dialogs/confdialog.cxx:17820 #: src/dialogs/confdialog.cxx:17827 src/dialogs/confdialog.cxx:17834 #: src/dialogs/confdialog.cxx:17841 src/dialogs/confdialog.cxx:17848 #: src/dialogs/confdialog.cxx:17855 src/dialogs/confdialog.cxx:17862 #: src/dialogs/confdialog.cxx:17869 src/dialogs/confdialog.cxx:17876 #: src/dialogs/confdialog.cxx:17883 src/dialogs/confdialog.cxx:17890 #: src/dialogs/confdialog.cxx:18263 #, fuzzy msgid "Select PTT on state" msgstr "Sélectionner la ligne" #: src/dialogs/confdialog.cxx:17651 src/dialogs/confdialog.cxx:18270 msgid "Initialize the H/W PTT interface" msgstr "Initialise l'interface PTT matérielle" #: src/dialogs/confdialog.cxx:17654 src/dialogs/confdialog.cxx:17896 msgid "BCM GPIO pin Value" msgstr "" #: src/dialogs/confdialog.cxx:17658 msgid "17 00 11" msgstr "" #: src/dialogs/confdialog.cxx:17659 src/dialogs/confdialog.cxx:17666 #: src/dialogs/confdialog.cxx:17673 src/dialogs/confdialog.cxx:17680 #: src/dialogs/confdialog.cxx:17687 src/dialogs/confdialog.cxx:17694 #: src/dialogs/confdialog.cxx:17701 src/dialogs/confdialog.cxx:17708 #: src/dialogs/confdialog.cxx:17715 src/dialogs/confdialog.cxx:17722 #: src/dialogs/confdialog.cxx:17729 src/dialogs/confdialog.cxx:17736 #: src/dialogs/confdialog.cxx:17743 src/dialogs/confdialog.cxx:17750 #: src/dialogs/confdialog.cxx:17757 src/dialogs/confdialog.cxx:17764 #: src/dialogs/confdialog.cxx:17771 #, fuzzy msgid "Select pin number" msgstr "Sélectionner la ligne" #: src/dialogs/confdialog.cxx:17665 msgid "18 01 12" msgstr "" #: src/dialogs/confdialog.cxx:17672 msgid "27 02 13" msgstr "" #: src/dialogs/confdialog.cxx:17679 msgid "22 03 15" msgstr "" #: src/dialogs/confdialog.cxx:17686 msgid "23 04 16" msgstr "" #: src/dialogs/confdialog.cxx:17693 msgid "24 05 18" msgstr "" #: src/dialogs/confdialog.cxx:17700 msgid "25 06 22" msgstr "" #: src/dialogs/confdialog.cxx:17707 msgid " 4 07 7" msgstr "" #: src/dialogs/confdialog.cxx:17714 msgid " 5 21 29" msgstr "" #: src/dialogs/confdialog.cxx:17721 msgid " 6 22 31" msgstr "" #: src/dialogs/confdialog.cxx:17728 msgid "13 23 33" msgstr "" #: src/dialogs/confdialog.cxx:17735 msgid "19 24 35" msgstr "" #: src/dialogs/confdialog.cxx:17742 msgid "26 25 37" msgstr "" #: src/dialogs/confdialog.cxx:17749 msgid "12 26 32" msgstr "" #: src/dialogs/confdialog.cxx:17756 msgid "16 27 36" msgstr "" #: src/dialogs/confdialog.cxx:17763 msgid "20 28 38" msgstr "" #: src/dialogs/confdialog.cxx:17770 msgid "21 29 40" msgstr "" #: src/dialogs/confdialog.cxx:17777 src/dialogs/confdialog.cxx:17784 #: src/dialogs/confdialog.cxx:17791 src/dialogs/confdialog.cxx:17798 #: src/dialogs/confdialog.cxx:17805 src/dialogs/confdialog.cxx:17812 #: src/dialogs/confdialog.cxx:17819 src/dialogs/confdialog.cxx:17826 #: src/dialogs/confdialog.cxx:17833 src/dialogs/confdialog.cxx:17840 #: src/dialogs/confdialog.cxx:17847 src/dialogs/confdialog.cxx:17854 #: src/dialogs/confdialog.cxx:17861 src/dialogs/confdialog.cxx:17868 #: src/dialogs/confdialog.cxx:17875 src/dialogs/confdialog.cxx:17882 #: src/dialogs/confdialog.cxx:17889 msgid "= 1 (on)" msgstr "" #: src/dialogs/confdialog.cxx:17900 msgid "Pulse width (msec)" msgstr "" #: src/dialogs/confdialog.cxx:17901 msgid "Set >0 if pulsed PTT used" msgstr "" #: src/dialogs/confdialog.cxx:17919 msgid "Use Hamlib" msgstr "Utilise Hamlib" #: src/dialogs/confdialog.cxx:17920 msgid "Hamlib used for rig control" msgstr "Hamlib utilisé pour contrôle radio" #: src/dialogs/confdialog.cxx:17926 msgid "Rig:" msgstr "Radio:" #: src/dialogs/confdialog.cxx:17956 msgid "# times to resend command before giving up" msgstr "" #: src/dialogs/confdialog.cxx:17972 #, fuzzy msgid "Timeout (msec)" msgstr "Heure ON" #: src/dialogs/confdialog.cxx:17973 msgid "Hamlib read timeout" msgstr "" #: src/dialogs/confdialog.cxx:17989 msgid "Write delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:17990 msgid "Msec's between sequential commands" msgstr "" #: src/dialogs/confdialog.cxx:18006 msgid "Post write delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:18007 msgid "Wait interval (msecs) before reading response" msgstr "" #: src/dialogs/confdialog.cxx:18058 msgid "Polling Interval (msec)" msgstr "" #: src/dialogs/confdialog.cxx:18077 msgid "PTT via Hamlib command" msgstr "PTT par commande Hamlib" #: src/dialogs/confdialog.cxx:18078 #, fuzzy msgid "PTT using hamlib command" msgstr "PTT est un commande hamlib" #: src/dialogs/confdialog.cxx:18083 msgid "Audio on Auxiliary Port" msgstr "" #: src/dialogs/confdialog.cxx:18084 msgid "PTT enables auxiliary audio source" msgstr "" #: src/dialogs/confdialog.cxx:18089 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:18095 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:18102 msgid "Rig requires RTS/CTS flow control" msgstr "Radio requiert contrôle de flux RTS/CTS" #: src/dialogs/confdialog.cxx:18108 msgid "XON/XOFF flow control" msgstr "Contrôle de flux XON/XOFF" #: src/dialogs/confdialog.cxx:18109 msgid "Rig requires Xon/Xoff flow control" msgstr "Radio requiert contrôle de flux Xon/Xoff" #: src/dialogs/confdialog.cxx:18114 msgid "CW is LSB mode" msgstr "" #: src/dialogs/confdialog.cxx:18115 msgid "Check if xcvr uses LSB for CW" msgstr "" #: src/dialogs/confdialog.cxx:18120 msgid "RTTY is USB mode" msgstr "" #: src/dialogs/confdialog.cxx:18121 msgid "Check if xcvr uses USB for RTTY" msgstr "" #: src/dialogs/confdialog.cxx:18126 msgid "Mode delay (msec)" msgstr "" #: src/dialogs/confdialog.cxx:18127 msgid "Delay NN msec after executing mode change" msgstr "" #: src/dialogs/confdialog.cxx:18146 msgid "Sideband:" msgstr "Bande latérale:" #: src/dialogs/confdialog.cxx:18159 msgid "Advanced configuration:" msgstr "Configuration avancée:" #: src/dialogs/confdialog.cxx:18160 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configuration optionnelle\n" "au format: param=val ..." #: src/dialogs/confdialog.cxx:18175 msgid "Initialize hamlib interface" msgstr "Initialise interface hamlib" #: src/dialogs/confdialog.cxx:18188 src/dialogs/confdialog.cxx:18300 #: src/dialogs/confdialog.cxx:18302 #, fuzzy msgid "Rig Control/Hardware PTT" msgstr "PTT matériel" #: src/dialogs/confdialog.cxx:18194 src/dialogs/confdialog.cxx:18674 msgid "PTT tone on right audio channel " msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:18195 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Peut être utilisé à la place ou en plus d'autres types de PTT" #: src/dialogs/confdialog.cxx:18202 msgid "h/w ptt device-pin" msgstr "Brochage périphérique PTT matériel" #: src/dialogs/confdialog.cxx:18205 msgid "Use separate serial port PTT" msgstr "Utiliser un port série PTT à part" #: src/dialogs/confdialog.cxx:18225 msgid "Port is second SCU-17 device" msgstr "" #: src/dialogs/confdialog.cxx:18226 msgid "Driver requires stop bits to be ZERO!" msgstr "" #: src/dialogs/confdialog.cxx:18232 msgid "Use parallel port PTT" msgstr "Utiliser un port parallèle PTT" #: src/dialogs/confdialog.cxx:18237 msgid "Use uHRouter PTT" msgstr "Utiliser PTT uHRouter" #: src/dialogs/confdialog.cxx:18242 msgid "Use RTS" msgstr "Utiliser RTS" #: src/dialogs/confdialog.cxx:18243 msgid "RTS is PTT signal line" msgstr "RTS est la ligne de signal PTT" #: src/dialogs/confdialog.cxx:18247 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:18248 msgid "Initial voltage on RTS" msgstr "Voltage initial sur RTS" #: src/dialogs/confdialog.cxx:18253 msgid "DTR is PTT signal line" msgstr "DTR est la ligne de signal PTT" #: src/dialogs/confdialog.cxx:18257 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:18258 msgid "Initial voltage on DTR" msgstr "Voltage initial sur DTR" #: src/dialogs/confdialog.cxx:18262 msgid "GPIO PTT (Pi specific controls)" msgstr "" #: src/dialogs/confdialog.cxx:18275 msgid "PTT delays valid for all CAT/PTT types" msgstr "" #: src/dialogs/confdialog.cxx:18278 msgid "Start of transmit PTT delay" msgstr "" #: src/dialogs/confdialog.cxx:18279 msgid "Delay NN msec before starting audio" msgstr "" #: src/dialogs/confdialog.cxx:18288 msgid "PTT end of transmit delay" msgstr "" #: src/dialogs/confdialog.cxx:18289 msgid "Delay NN msec before releasing PTT" msgstr "" #: src/dialogs/confdialog.cxx:18306 src/dialogs/confdialog.cxx:18363 msgid "C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18310 msgid "" "C-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. " "GPIO signal line 3 (pin 13) is used for PTT control.\n" "\n" "Fldigi accesses the GPIO lines as a Human Interface Device (HID). " "Discovered C-Media devices are enumerated in the 'C-Media device' list box.\n" "\n" "On Linux: add a file named cmedia.rules to /etc/udev/rules.d/\n" "The file should contain a single line\n" "\n" "KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"" msgstr "" #: src/dialogs/confdialog.cxx:18319 msgid "Use C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18324 #, fuzzy #| msgid "Capture device" msgid "C-Media device" msgstr "Périph. capture" #: src/dialogs/confdialog.cxx:18339 #, fuzzy #| msgid "Odd lines" msgid "GPIO line" msgstr "Lignes impaires" #: src/dialogs/confdialog.cxx:18356 #, fuzzy #| msgid "Initialize the H/W PTT interface" msgid "Select device & Initialize the H/W PTT interface" msgstr "Initialise l'interface PTT matérielle" #: src/dialogs/confdialog.cxx:18359 msgid "TEST" msgstr "" #: src/dialogs/confdialog.cxx:18360 msgid "Toggles PTT line 20x; check DRA-30 ptt LED" msgstr "" #: src/dialogs/confdialog.cxx:18365 #, fuzzy msgid "Rig Control/C-Media PTT" msgstr "PTT matériel" #: src/dialogs/confdialog.cxx:18369 src/dialogs/confdialog.cxx:18534 #: src/dialogs/confdialog.cxx:18536 #, fuzzy msgid "Soundcard/Alerts" msgstr "Carte Son" #: src/dialogs/confdialog.cxx:18378 msgid "REGEX detected wav" msgstr "" #: src/dialogs/confdialog.cxx:18407 msgid "MYCALL detected wav" msgstr "" #: src/dialogs/confdialog.cxx:18436 msgid "RsID audio alert wav" msgstr "" #: src/dialogs/confdialog.cxx:18465 msgid "flmsg received wav" msgstr "" #: src/dialogs/confdialog.cxx:18489 msgid "flmsg timed out wav" msgstr "" #: src/dialogs/confdialog.cxx:18515 msgid "Alert volume" msgstr "" #: src/dialogs/confdialog.cxx:18539 src/dialogs/confdialog.cxx:18646 #: src/dialogs/confdialog.cxx:18648 #, fuzzy msgid "Soundcard/Devices" msgstr "Périphériques audio" #: src/dialogs/confdialog.cxx:18545 msgid "OSS" msgstr "" #: src/dialogs/confdialog.cxx:18546 msgid "Use OSS audio server" msgstr "" #: src/dialogs/confdialog.cxx:18552 msgid "Select device" msgstr "" #: src/dialogs/confdialog.cxx:18560 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:18561 msgid "Use Port Audio server" msgstr "" #: src/dialogs/confdialog.cxx:18566 msgid "Capture:" msgstr "Capture:" #: src/dialogs/confdialog.cxx:18567 msgid "Audio input device" msgstr "Périph. audio entrée" #: src/dialogs/confdialog.cxx:18571 msgid "Playback:" msgstr "Sortie:" #: src/dialogs/confdialog.cxx:18572 src/dialogs/confdialog.cxx:18629 msgid "Audio output device" msgstr "Périph. audio sortie" #: src/dialogs/confdialog.cxx:18580 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:18581 msgid "Use Pulse Audio server" msgstr "" #: src/dialogs/confdialog.cxx:18586 msgid "Server string:" msgstr "" #: src/dialogs/confdialog.cxx:18587 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" #: src/dialogs/confdialog.cxx:18605 msgid "File I/O only" msgstr "E/S fichier seulement" #: src/dialogs/confdialog.cxx:18606 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "" #: src/dialogs/confdialog.cxx:18615 msgid "Device supports full duplex" msgstr "" #: src/dialogs/confdialog.cxx:18616 msgid "Capture/Playback supports full duplex operation" msgstr "" #: src/dialogs/confdialog.cxx:18628 msgid "Audio device shared by Audio Alerts and Rx Monitor" msgstr "" #: src/dialogs/confdialog.cxx:18635 #, fuzzy msgid "First select audio alert playback device" msgstr "Périph de capture et sortie" #: src/dialogs/confdialog.cxx:18641 msgid "Note: must be selected and enabled for Rx Audio monitoring!" msgstr "" #: src/dialogs/confdialog.cxx:18651 src/dialogs/confdialog.cxx:18708 #: src/dialogs/confdialog.cxx:18710 #, fuzzy msgid "Soundcard/Right channel" msgstr "Canaux" #: src/dialogs/confdialog.cxx:18655 #, fuzzy msgid "Transmit Usage" msgstr "Transmission" #: src/dialogs/confdialog.cxx:18658 msgid "Modem signal on left and right channels" msgstr "" #: src/dialogs/confdialog.cxx:18659 msgid "Left and right channels both contain modem audio" msgstr "" #: src/dialogs/confdialog.cxx:18664 src/dialogs/confdialog.cxx:18700 msgid "Reverse Left/Right channels" msgstr "" #: src/dialogs/confdialog.cxx:18665 src/dialogs/confdialog.cxx:18701 #, fuzzy msgid "Software reversal of left-right audio channels" msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:18670 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" #: src/dialogs/confdialog.cxx:18675 #, fuzzy msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "Peut être utilisé à la place ou en plus d'autres types de PTT" #: src/dialogs/confdialog.cxx:18681 #, fuzzy msgid "CW QSK signal on right channel" msgstr "Tonalité PTT sur le canal audio droit " #: src/dialogs/confdialog.cxx:18682 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "" #: src/dialogs/confdialog.cxx:18687 msgid "Pseudo-FSK on right audio channel" msgstr "" #: src/dialogs/confdialog.cxx:18688 msgid "Create 1000 Hz square wave on right channel" msgstr "" #: src/dialogs/confdialog.cxx:18697 #, fuzzy msgid "Receive Usage" msgstr "Réception" #: src/dialogs/confdialog.cxx:18713 src/dialogs/confdialog.cxx:18850 #: src/dialogs/confdialog.cxx:18852 msgid "Soundcard/Settings" msgstr "" #: src/dialogs/confdialog.cxx:18720 msgid "Capture" msgstr "Capture" #: src/dialogs/confdialog.cxx:18721 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" #: src/dialogs/confdialog.cxx:18753 msgid "Converter" msgstr "" #: src/dialogs/confdialog.cxx:18754 msgid "Set the type of resampler used of offset correction" msgstr "" #: src/dialogs/confdialog.cxx:18770 msgid "Corrections" msgstr "" #: src/dialogs/confdialog.cxx:18773 msgid "RX ppm" msgstr "" #: src/dialogs/confdialog.cxx:18774 msgid "RX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:18790 msgid "TX ppm" msgstr "" #: src/dialogs/confdialog.cxx:18791 msgid "TX sound card correction" msgstr "" #: src/dialogs/confdialog.cxx:18807 msgid "TX offset" msgstr "" #: src/dialogs/confdialog.cxx:18808 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "" #: src/dialogs/confdialog.cxx:18826 msgid "Frequency Analysis / FMT Rx Correction" msgstr "" #: src/dialogs/confdialog.cxx:18834 #, fuzzy msgid "Frequency Correction" msgstr "Fréquence" #: src/dialogs/confdialog.cxx:18835 msgid "Used ONLY for frequency analysis mode" msgstr "" #: src/dialogs/confdialog.cxx:18855 #, fuzzy msgid "Signal Level" msgstr "Niveau signal" #: src/dialogs/confdialog.cxx:18859 #, fuzzy msgid "Signal Levels" msgstr "Niveau signal" #: src/dialogs/confdialog.cxx:18940 src/dialogs/confdialog.cxx:18942 #, fuzzy msgid "Soundcard/Signal Level" msgstr "Périphériques audio" #: src/dialogs/confdialog.cxx:18945 src/dialogs/confdialog.cxx:18971 #: src/dialogs/confdialog.cxx:18973 msgid "Soundcard/Wav file recording" msgstr "" #: src/dialogs/confdialog.cxx:18949 msgid "Wav write sample rate" msgstr "" #: src/dialogs/confdialog.cxx:18950 msgid "Pick baud rate from list" msgstr "" #: src/dialogs/confdialog.cxx:18966 #, fuzzy msgid "Record both channels" msgstr "Montrer Canaux" #: src/dialogs/confdialog.cxx:18977 src/dialogs/confdialog.cxx:19063 #: src/dialogs/confdialog.cxx:19065 msgid "UI/Browser/Channels" msgstr "" #: src/dialogs/confdialog.cxx:18981 msgid "Channels, first channel starts at waterfall lower limit" msgstr "" "Canaux, le prmeier canal démarre à la limite inférieure dela chute d'eau" #: src/dialogs/confdialog.cxx:18982 msgid "Change # of psk viewer channels" msgstr "Changer le nombre de canaux du visualisateur psk" #: src/dialogs/confdialog.cxx:18999 msgid "Inactivity timeout" msgstr "Délai d'inactivité" #: src/dialogs/confdialog.cxx:19000 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Effacer le canal texte après\n" "# secondes d'inactivité" #: src/dialogs/confdialog.cxx:19016 msgid "Channel label" msgstr "Etiquette du canal" #: src/dialogs/confdialog.cxx:19017 msgid "Appearance of label on each channel" msgstr "Apparence de l'étiquette de chaque canal" #: src/dialogs/confdialog.cxx:19028 #, fuzzy msgid "Audio frequency" msgstr "Fréquence audio" #: src/dialogs/confdialog.cxx:19029 #, fuzzy msgid "Radio frequency" msgstr "Fréquence Radio" #: src/dialogs/confdialog.cxx:19029 #, fuzzy msgid "Channel number" msgstr "Numéro du canal" #: src/dialogs/confdialog.cxx:19034 src/dialogs/confdialog.cxx:19772 msgid "Font..." msgstr "Police..." #: src/dialogs/confdialog.cxx:19035 #, fuzzy msgid "select browser font" msgstr "Sélectionner la police du navigateur" #: src/dialogs/confdialog.cxx:19038 msgid "Fixed Intervals" msgstr "Intervalles fixes" #: src/dialogs/confdialog.cxx:19039 msgid "Force channel spacing to even 100 Hz increments" msgstr "Forcer l'espacement des canaux à des incréments uniformes de 100 Hz" #: src/dialogs/confdialog.cxx:19045 msgid "Continuous scrolling" msgstr "Défillement continu" #: src/dialogs/confdialog.cxx:19046 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" #: src/dialogs/confdialog.cxx:19051 msgid "Lowest freq on bottom of viewer" msgstr "" #: src/dialogs/confdialog.cxx:19052 msgid "Change positions of low to high channels" msgstr "" #: src/dialogs/confdialog.cxx:19057 msgid "Play back history when active channel selected" msgstr "" #: src/dialogs/confdialog.cxx:19058 msgid "Audio stream history decoded on selected signal" msgstr "" #: src/dialogs/confdialog.cxx:19068 src/dialogs/confdialog.cxx:19102 #: src/dialogs/confdialog.cxx:19104 #, fuzzy msgid "UI/Browser/Colors" msgstr "Détecte le niveau de signal" #: src/dialogs/confdialog.cxx:19072 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:19073 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "" #: src/dialogs/confdialog.cxx:19078 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:19079 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "" #: src/dialogs/confdialog.cxx:19084 #, fuzzy msgid "Even" msgstr "Événement" #: src/dialogs/confdialog.cxx:19085 #, fuzzy msgid "Even lines" msgstr "Historique événements" #: src/dialogs/confdialog.cxx:19090 #, fuzzy msgid "Odd" msgstr "Ajoute" #: src/dialogs/confdialog.cxx:19091 msgid "Odd lines" msgstr "Lignes impaires" #: src/dialogs/confdialog.cxx:19097 #, fuzzy msgid "Select line" msgstr "Sélectionner la ligne" #: src/dialogs/confdialog.cxx:19107 src/dialogs/confdialog.cxx:19123 #: src/dialogs/confdialog.cxx:19125 #, fuzzy msgid "UI/Browser/Detection Level" msgstr "Détecte le niveau de signal" #: src/dialogs/confdialog.cxx:19111 #, fuzzy msgid "Backgnd" msgstr "Arrière plan" #: src/dialogs/confdialog.cxx:19112 msgid "Background color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:19117 msgid "Button" msgstr "Bouton" #: src/dialogs/confdialog.cxx:19118 msgid "Slider hilite color of signal viewer squelch control" msgstr "" #: src/dialogs/confdialog.cxx:19128 src/dialogs/confdialog.cxx:19262 #: src/dialogs/confdialog.cxx:19264 #, fuzzy msgid "UI/General" msgstr "Général" #: src/dialogs/confdialog.cxx:19134 msgid "Show tooltips" msgstr "Montrer infobulles" #: src/dialogs/confdialog.cxx:19135 msgid "Enable / disable tooltips" msgstr "Afficher / masquer les astuces" #: src/dialogs/confdialog.cxx:19141 msgid "Show menu icons" msgstr "Montrer icônes menu" #: src/dialogs/confdialog.cxx:19142 msgid "Enable / disable icons on menus" msgstr "Afficher / masquer les icônes de menus" #: src/dialogs/confdialog.cxx:19147 msgid "UI scheme" msgstr "Schéma de l'interface utilisateur" #: src/dialogs/confdialog.cxx:19148 msgid "Change application look and feel" msgstr "Changer l'apparence del'application" #: src/dialogs/confdialog.cxx:19166 msgid "Visible modes" msgstr "Modes visibles" #: src/dialogs/confdialog.cxx:19167 msgid "Select modes for menu access" msgstr "Sélectionner les modes accessibles par menu" #: src/dialogs/confdialog.cxx:19170 msgid "UI language" msgstr "Langue de l'interface utilisateur" #: src/dialogs/confdialog.cxx:19171 src/dialogs/confdialog.cxx:19915 msgid "Changes take effect on next program startup" msgstr "Changements prenent effet lors du prochain redémarrage" #: src/dialogs/confdialog.cxx:19190 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Imprimmer CW / RTTY / THROB / CONTESTIA en minuscules" #: src/dialogs/confdialog.cxx:19200 #, fuzzy msgid "Transmit lower case text" msgstr "Transmettre tout le texte en minuscules" #: src/dialogs/confdialog.cxx:19207 msgid "Exit prompts" msgstr "" #: src/dialogs/confdialog.cxx:19210 msgid "Prompt to save Configuration" msgstr "" #: src/dialogs/confdialog.cxx:19215 src/dialogs/confdialog.cxx:19377 msgid "Prompt to save macro file" msgstr "" #: src/dialogs/confdialog.cxx:19216 src/dialogs/confdialog.cxx:19378 msgid "Write current macro set on program exit" msgstr "Sauvegarder le jeu de macro actuel à la sortie du programme" #: src/dialogs/confdialog.cxx:19221 msgid "Prompt to save log" msgstr "" #: src/dialogs/confdialog.cxx:19227 #, fuzzy msgid "Confirm exit" msgstr "Confirmer la sortie" #: src/dialogs/confdialog.cxx:19234 #, fuzzy msgid "Check for updates" msgstr "Rechercher des mises à jour..." #: src/dialogs/confdialog.cxx:19237 msgid "Check for updates when starting program" msgstr "Rechercher des mises à jour au démarrage du programme" #: src/dialogs/confdialog.cxx:19247 #, fuzzy msgid "Show TX timer" msgstr "Montre les entités DXCC" #: src/dialogs/confdialog.cxx:19252 msgid "TX deadmen timeout (mins)" msgstr "" #: src/dialogs/confdialog.cxx:19267 src/dialogs/confdialog.cxx:19405 #: src/dialogs/confdialog.cxx:19407 msgid "UI/Macro buttons" msgstr "" #: src/dialogs/confdialog.cxx:19273 msgid "Mouse wheel active on macro buttons" msgstr "La molette de souris est active sur les boutons de macros" #: src/dialogs/confdialog.cxx:19274 msgid "enable mouse wheel control of macro bar" msgstr "Activer le controle de la barre de macros par la molette de souris" #: src/dialogs/confdialog.cxx:19281 msgid "Number and position of macro bars" msgstr "Nombre et positions des barres de macros" #: src/dialogs/confdialog.cxx:19284 msgid "Button Height" msgstr "Hauteur des boutons" #: src/dialogs/confdialog.cxx:19285 msgid "Height of macro bar" msgstr "Hauteur de la bare de macros" #: src/dialogs/confdialog.cxx:19295 msgid "One above Rx/Tx" msgstr "Une au dessus de RX/TX" #: src/dialogs/confdialog.cxx:19296 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" #: src/dialogs/confdialog.cxx:19301 msgid "One above waterfall" msgstr "Uneau dessus de la chute d'eau" #: src/dialogs/confdialog.cxx:19306 msgid "One below waterfall" msgstr "Une en dessous de la chute d'eau" #: src/dialogs/confdialog.cxx:19311 msgid "Two scheme 1" msgstr "" #: src/dialogs/confdialog.cxx:19316 msgid "Two scheme 2" msgstr "" #: src/dialogs/confdialog.cxx:19321 msgid "Two scheme 3" msgstr "" #: src/dialogs/confdialog.cxx:19326 msgid "Two scheme 4" msgstr "" #: src/dialogs/confdialog.cxx:19331 msgid "Two scheme 5" msgstr "" #: src/dialogs/confdialog.cxx:19336 msgid "Two scheme 6" msgstr "" #: src/dialogs/confdialog.cxx:19341 msgid "Two scheme 7" msgstr "" #: src/dialogs/confdialog.cxx:19346 msgid "Two scheme 8" msgstr "" #: src/dialogs/confdialog.cxx:19351 msgid "Two scheme 9" msgstr "" #: src/dialogs/confdialog.cxx:19356 msgid "Two scheme 10" msgstr "" #: src/dialogs/confdialog.cxx:19365 #, fuzzy msgid "Load last used macro file at start" msgstr "Charger le dernier fichier de macros utilisé au démarrage" #: src/dialogs/confdialog.cxx:19366 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON : utiliser le dernier jeu de macros\n" "OFF : utiliser le jeu par défaut" #: src/dialogs/confdialog.cxx:19371 #, fuzzy msgid "Display macro filename at start" msgstr "Afficher le nom du fichier de macros au démarrage" #: src/dialogs/confdialog.cxx:19387 #, fuzzy msgid "Show macro control codes" msgstr "Montre l'éditeur de macro" #: src/dialogs/confdialog.cxx:19388 msgid "print ^! execution codes in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:19397 msgid "4 bar macro set below Tx" msgstr "" #: src/dialogs/confdialog.cxx:19398 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:19410 src/dialogs/confdialog.cxx:19454 #: src/dialogs/confdialog.cxx:19456 #, fuzzy msgid "UI/Rx Text" msgstr "Texte:" #: src/dialogs/confdialog.cxx:19414 msgid "Single-click to capture" msgstr "" #: src/dialogs/confdialog.cxx:19415 src/dialogs/confdialog.cxx:19444 msgid "Enable for single click capure of text in Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:19420 msgid "callsign tooltips in received text" msgstr "" #: src/dialogs/confdialog.cxx:19421 msgid "Popup info after a 2 second hover on a callsign" msgstr "" #: src/dialogs/confdialog.cxx:19426 msgid "Word delimiters" msgstr "" #: src/dialogs/confdialog.cxx:19427 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" #: src/dialogs/confdialog.cxx:19443 msgid "US units of distance (QRB)" msgstr "" #: src/dialogs/confdialog.cxx:19449 #, fuzzy msgid "Clear log fields - new CALL" msgstr "Effacer champ de log?" #: src/dialogs/confdialog.cxx:19459 src/dialogs/confdialog.cxx:19494 #: src/dialogs/confdialog.cxx:19496 msgid "UI/Touch" msgstr "" #: src/dialogs/confdialog.cxx:19463 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" #: src/dialogs/confdialog.cxx:19467 msgid "Arrow Key Control of Frequency Entry" msgstr "" #: src/dialogs/confdialog.cxx:19470 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" #: src/dialogs/confdialog.cxx:19474 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" #: src/dialogs/confdialog.cxx:19483 msgid "Rx / Tx Panels" msgstr "" #: src/dialogs/confdialog.cxx:19486 msgid "Tx above Rx" msgstr "" #: src/dialogs/confdialog.cxx:19487 msgid "Enable to put Tx panel above Rx panel" msgstr "" #: src/dialogs/confdialog.cxx:19500 src/dialogs/confdialog.cxx:19580 #: src/dialogs/confdialog.cxx:19582 #, fuzzy msgid "Waterfall/Buttons & Controls" msgstr "Contrôles chute d'eau" #: src/dialogs/confdialog.cxx:19504 msgid "Enable check box to show each respective operator control" msgstr "" #: src/dialogs/confdialog.cxx:19514 msgid "WF Magnification" msgstr "Agrandissement de la chute d'eau" #: src/dialogs/confdialog.cxx:19520 msgid "WF carrier" msgstr "" #: src/dialogs/confdialog.cxx:19526 msgid "WF Shift Controls" msgstr "" #: src/dialogs/confdialog.cxx:19532 msgid "WF ref level" msgstr "" #: src/dialogs/confdialog.cxx:19538 msgid "WF drop rate" msgstr "" #: src/dialogs/confdialog.cxx:19544 msgid "WF amp span" msgstr "" #: src/dialogs/confdialog.cxx:19550 msgid "WF Store" msgstr "" #: src/dialogs/confdialog.cxx:19556 msgid "WF mode" msgstr "" #: src/dialogs/confdialog.cxx:19562 msgid "QSY" msgstr "" #: src/dialogs/confdialog.cxx:19568 msgid "XMT lock" msgstr "" #: src/dialogs/confdialog.cxx:19574 msgid "Enable all" msgstr "" #: src/dialogs/confdialog.cxx:19577 msgid "Disable all" msgstr "" #: src/dialogs/confdialog.cxx:19585 src/dialogs/confdialog.cxx:19800 #: src/dialogs/confdialog.cxx:19802 #, fuzzy msgid "Waterfall/Display" msgstr "Chute d'eau" #: src/dialogs/confdialog.cxx:19589 msgid "Colors and cursors" msgstr "Couleurs et curseurs" #: src/dialogs/confdialog.cxx:19592 msgid "aa" msgstr "" #: src/dialogs/confdialog.cxx:19607 src/dialogs/confdialog.cxx:19611 #: src/dialogs/confdialog.cxx:19615 src/dialogs/confdialog.cxx:19619 #: src/dialogs/confdialog.cxx:19623 src/dialogs/confdialog.cxx:19627 #: src/dialogs/confdialog.cxx:19631 src/dialogs/confdialog.cxx:19635 #: src/dialogs/confdialog.cxx:19639 src/dialogs/confdialog.cxx:19660 #: src/dialogs/confdialog.cxx:19683 src/dialogs/confdialog.cxx:19706 #: src/dialogs/confdialog.cxx:19723 src/dialogs/confdialog.cxx:19735 #: src/dialogs/confdialog.cxx:19748 msgid "Change color" msgstr "Change couleur" #: src/dialogs/confdialog.cxx:19642 msgid "Load..." msgstr "Charge..." #: src/dialogs/confdialog.cxx:19643 msgid "Load a new palette" msgstr "Charge une nouvelle palette" #: src/dialogs/confdialog.cxx:19646 msgid "Save..." msgstr "Sauvegarde..." #: src/dialogs/confdialog.cxx:19647 msgid "Save this palette" msgstr "" #: src/dialogs/confdialog.cxx:19650 #, fuzzy msgid "Signal BW" msgstr "Navigateur Signal" #: src/dialogs/confdialog.cxx:19653 src/dialogs/confdialog.cxx:19676 #: src/dialogs/confdialog.cxx:19699 msgid "ON" msgstr "" #: src/dialogs/confdialog.cxx:19654 msgid "Show cursor with bandwidth lines" msgstr "" #: src/dialogs/confdialog.cxx:19659 src/dialogs/confdialog.cxx:19682 #: src/dialogs/confdialog.cxx:19705 src/dialogs/confdialog.cxx:19722 #: src/dialogs/confdialog.cxx:19734 src/dialogs/confdialog.cxx:19747 #: src/dialogs/font_browser.cxx:177 msgid "Color" msgstr "Couleur" #: src/dialogs/confdialog.cxx:19666 src/dialogs/confdialog.cxx:19689 #: src/dialogs/confdialog.cxx:19712 src/dialogs/confdialog.cxx:19754 msgid "Wide" msgstr "" #: src/dialogs/confdialog.cxx:19673 msgid "Center line" msgstr "" #: src/dialogs/confdialog.cxx:19677 msgid "Show cursor with center line" msgstr "" #: src/dialogs/confdialog.cxx:19696 #, fuzzy #| msgid "Signal range (dB)" msgid "Signal trks" msgstr "Plage du signal (dB)" #: src/dialogs/confdialog.cxx:19700 msgid "Show bandwidth tracks on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:19719 msgid "Notch" msgstr "" #: src/dialogs/confdialog.cxx:19731 #, fuzzy msgid "RsID Zone" msgstr "Réception RSID" #: src/dialogs/confdialog.cxx:19743 msgid "Monitor" msgstr "" #: src/dialogs/confdialog.cxx:19744 #, fuzzy #| msgid "Audio file" msgid "Audio monitor" msgstr "Fichier audio" #: src/dialogs/confdialog.cxx:19763 msgid "Frequency scale" msgstr "" #: src/dialogs/confdialog.cxx:19766 msgid "Always show audio frequencies" msgstr "" #: src/dialogs/confdialog.cxx:19767 msgid "Audio or RF frequencies on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:19773 msgid "Select waterfall scale font" msgstr "" #: src/dialogs/confdialog.cxx:19778 msgid "Transmit signal" msgstr "" #: src/dialogs/confdialog.cxx:19781 msgid "Monitor transmitted signal" msgstr "" #: src/dialogs/confdialog.cxx:19782 msgid "Show transmit signal on waterfall" msgstr "" #: src/dialogs/confdialog.cxx:19787 #, fuzzy msgid "Signal Level (dB)" msgstr "Niveau signal" #: src/dialogs/confdialog.cxx:19788 msgid "Set level for good viewing" msgstr "" #: src/dialogs/confdialog.cxx:19805 src/dialogs/confdialog.cxx:19941 #: src/dialogs/confdialog.cxx:19943 #, fuzzy msgid "Waterfall/FFT Processing" msgstr "Contrôles chute d'eau" #: src/dialogs/confdialog.cxx:19812 msgid "Low frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:19831 msgid "FFT averaging" msgstr "" #: src/dialogs/confdialog.cxx:19832 msgid "Use averaging to decrease waterfall noise" msgstr "" #: src/dialogs/confdialog.cxx:19837 msgid "FFT prefilter window function" msgstr "" #: src/dialogs/confdialog.cxx:19849 msgid "Rectangular" msgstr "" #: src/dialogs/confdialog.cxx:19851 msgid "Triangular" msgstr "" #: src/dialogs/confdialog.cxx:19857 msgid "High frequency limit in Hz" msgstr "" #: src/dialogs/confdialog.cxx:19876 msgid "Latency" msgstr "" #: src/dialogs/confdialog.cxx:19877 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" #: src/dialogs/confdialog.cxx:19899 src/dialogs/confdialog.cxx:19916 msgid "Show me more or less waterfall" msgstr "" #: src/dialogs/confdialog.cxx:19902 msgid "Slow drop rate" msgstr "" #: src/dialogs/confdialog.cxx:19903 #, fuzzy msgid "Normal drop speed / value" msgstr "Visitesse chute d'eau" #: src/dialogs/confdialog.cxx:19919 msgid "Waterfall height in pixels" msgstr "" #: src/dialogs/confdialog.cxx:19920 msgid "CPU usage increases with waterfall height" msgstr "" #: src/dialogs/confdialog.cxx:19946 src/dialogs/confdialog.cxx:20000 #: src/dialogs/confdialog.cxx:20002 #, fuzzy msgid "Waterfall/Mouse usage" msgstr "Vitesse chute d'eau" #: src/dialogs/confdialog.cxx:19952 msgid "Left or right click always replays audio history" msgstr "" #: src/dialogs/confdialog.cxx:19953 msgid "Replay trackline audio" msgstr "" #: src/dialogs/confdialog.cxx:19958 msgid "Dragging on the waterfall scale changes frequency" msgstr "" #: src/dialogs/confdialog.cxx:19959 msgid "Enable drag cursor on waterfall scale" msgstr "" #: src/dialogs/confdialog.cxx:19964 msgid "Insert text on single left click" msgstr "" #: src/dialogs/confdialog.cxx:19965 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" #: src/dialogs/confdialog.cxx:19971 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" #: src/dialogs/confdialog.cxx:19983 msgid "Wheel action" msgstr "" #: src/dialogs/confdialog.cxx:19984 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" #: src/dialogs/confdialog.cxx:20005 src/dialogs/confdialog.cxx:20042 #: src/dialogs/confdialog.cxx:20044 #, fuzzy msgid "Waterfall/Spectrum" msgstr "Chute d'eau" #: src/dialogs/confdialog.cxx:20009 msgid "Spectrum Scope / Waterfall interaction" msgstr "" #: src/dialogs/confdialog.cxx:20012 msgid "left click transfers frequency to scope center frequency" msgstr "" #: src/dialogs/confdialog.cxx:20013 msgid "left click on WF recenters spectrum scope" msgstr "" #: src/dialogs/confdialog.cxx:20018 msgid "use waterfall range/limit values" msgstr "" #: src/dialogs/confdialog.cxx:20019 #, fuzzy msgid "values left/below waterfall" msgstr "Une en dessous de la chute d'eau" #: src/dialogs/confdialog.cxx:20024 msgid "freq scale = N * modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:20034 #, fuzzy msgid "use" msgstr "Souris" #: src/dialogs/confdialog.cxx:20035 msgid "scale spectrum display linked to modem bandwidth" msgstr "" #: src/dialogs/confdialog.cxx:20048 src/dialogs/confdialog.cxx:20154 #: src/dialogs/confdialog.cxx:20156 #, fuzzy msgid "Web/Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:20052 msgid "Mail Server Attributes" msgstr "" #: src/dialogs/confdialog.cxx:20055 msgid "Carrier frequency (Hz)" msgstr "Fréquence porteuse (Hz)" #: src/dialogs/confdialog.cxx:20056 msgid "Default listen / transmit frequency" msgstr "" #: src/dialogs/confdialog.cxx:20075 msgid "Search range (Hz)" msgstr "Plage du recherche (Hz)" #: src/dialogs/confdialog.cxx:20076 msgid "Listen for signals within this range" msgstr "" #: src/dialogs/confdialog.cxx:20115 msgid "AFC range (Hz)" msgstr "Plage AFC (Hz)" #: src/dialogs/confdialog.cxx:20116 msgid "Limit AFC movement to this range" msgstr "" #: src/dialogs/confdialog.cxx:20135 msgid "Reset to Carrier" msgstr "" #: src/dialogs/confdialog.cxx:20136 msgid "When no signal present" msgstr "" #: src/dialogs/confdialog.cxx:20144 msgid "General" msgstr "Général" #: src/dialogs/confdialog.cxx:20147 msgid "Report ARQ frames average S/N" msgstr "" #: src/dialogs/confdialog.cxx:20159 src/dialogs/confdialog.cxx:20242 #: src/dialogs/confdialog.cxx:20244 msgid "Web/WX" msgstr "" #: src/dialogs/confdialog.cxx:20163 msgid "Access URL" msgstr "" #: src/dialogs/confdialog.cxx:20164 msgid "Enter METAR data internet URL" msgstr "" #: src/dialogs/confdialog.cxx:20170 #, fuzzy msgid "Default URL" msgstr "Défaut" #: src/dialogs/confdialog.cxx:20173 msgid "METAR station ID code" msgstr "" #: src/dialogs/confdialog.cxx:20174 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" #: src/dialogs/confdialog.cxx:20179 msgid "Search on web" msgstr "" #: src/dialogs/confdialog.cxx:20182 msgid "Full report" msgstr "" #: src/dialogs/confdialog.cxx:20183 src/dialogs/confdialog.cxx:20237 msgid "Insert full METAR report" msgstr "" #: src/dialogs/confdialog.cxx:20188 msgid "METAR station location" msgstr "" #: src/dialogs/confdialog.cxx:20189 msgid "Add geopolitical name of METAR station" msgstr "" #: src/dialogs/confdialog.cxx:20194 #, fuzzy msgid "Conditions" msgstr "Options ligne de commande" #: src/dialogs/confdialog.cxx:20195 msgid "current wx conditions" msgstr "" #: src/dialogs/confdialog.cxx:20200 msgid "Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:20201 msgid "report Fahrenheit" msgstr "" #: src/dialogs/confdialog.cxx:20206 msgid "Celsius" msgstr "" #: src/dialogs/confdialog.cxx:20207 msgid "report Celsius" msgstr "" #: src/dialogs/confdialog.cxx:20212 msgid "Miles / Hour" msgstr "" #: src/dialogs/confdialog.cxx:20213 msgid "report miles per hour" msgstr "" #: src/dialogs/confdialog.cxx:20218 msgid "kilometers / hour" msgstr "" #: src/dialogs/confdialog.cxx:20219 msgid "report kilometers per hour" msgstr "" #: src/dialogs/confdialog.cxx:20224 msgid "Inches Hg." msgstr "" #: src/dialogs/confdialog.cxx:20225 msgid "report inches mercury" msgstr "" #: src/dialogs/confdialog.cxx:20230 msgid "mbars" msgstr "" #: src/dialogs/confdialog.cxx:20231 msgid "report millibars" msgstr "" #: src/dialogs/confdialog.cxx:20236 msgid "Unprocessed METAR data" msgstr "" #: src/dialogs/confdialog.cxx:20254 msgid "Restore defaults" msgstr "Restaure défauts" #: src/dialogs/confdialog.cxx:20255 msgid "WARNING - this will over write ALL settings" msgstr "" #: src/dialogs/font_browser.cxx:77 msgid "Font color" msgstr "Couleur police" #: src/dialogs/font_browser.cxx:150 msgid "Font:" msgstr "Police:" #: src/dialogs/font_browser.cxx:155 msgid "Size:" msgstr "Taille:" #: src/dialogs/font_browser.cxx:165 msgid "Fixed" msgstr "" #: src/dialogs/font_browser.cxx:169 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:184 msgid "" "abcdefghijklmnopqrstuvwxyz\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" "0123456789" msgstr "" #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 #, fuzzy msgid "Data files sources" msgstr "Fichiers NBEMS..." #: src/dialogs/record_browse.cxx:27 #, fuzzy msgid "Data files update" msgstr "Fichiers NBEMS..." #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "" #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Événement" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entité DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Montre les entités DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Action" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Montre l'éditeur de macro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entités DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Trouve le pays:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Trouve le préfix:" #: src/logbook/lgbook.cxx:615 msgid "Export Setup" msgstr "" #: src/logbook/lgbook.cxx:616 src/logbook/lgbook.cxx:1631 msgid "Select Records to Export" msgstr "" #: src/logbook/lgbook.cxx:624 src/logbook/lgbook.cxx:825 #: src/logbook/lgbook.cxx:1639 src/logbook/lgbook.cxx:1721 msgid "Check All" msgstr "" #: src/logbook/lgbook.cxx:627 #, fuzzy msgid "Start Date" msgstr "Date QSO" #: src/logbook/lgbook.cxx:628 msgid "Start date for export" msgstr "" #: src/logbook/lgbook.cxx:641 #, fuzzy msgid "Stop Date" msgstr "Date QSO" #: src/logbook/lgbook.cxx:642 msgid "Inclusive stop date for export" msgstr "" #: src/logbook/lgbook.cxx:655 #, fuzzy msgid "select by date" msgstr "Sélection de la radio par le nom" #: src/logbook/lgbook.cxx:656 #, fuzzy msgid "Enable to select date range" msgstr "Clic gauche pour sélectionner la couleur des Dup" #: src/logbook/lgbook.cxx:662 msgid "Select Fields to Export" msgstr "" #: src/logbook/lgbook.cxx:673 src/logbook/lgbook.cxx:1670 msgid "Freq" msgstr "Fréq" #: src/logbook/lgbook.cxx:684 #, fuzzy msgid "QSO Date On" msgstr "Date QSO" #: src/logbook/lgbook.cxx:688 #, fuzzy msgid "QSO Date Off" msgstr "Date QSO" #: src/logbook/lgbook.cxx:692 msgid "Time ON" msgstr "Heure ON" #: src/logbook/lgbook.cxx:696 src/logbook/lgbook.cxx:1682 msgid "Time OFF" msgstr "Heure OFF" #: src/logbook/lgbook.cxx:699 msgid "TX Power" msgstr "" #: src/logbook/lgbook.cxx:702 src/logbook/lgbook.cxx:1686 msgid "RST sent" msgstr "RST env." #: src/logbook/lgbook.cxx:706 src/logbook/lgbook.cxx:1690 msgid "RST rcvd" msgstr "RST reçu" #: src/logbook/lgbook.cxx:710 src/logbook/lgbook.cxx:1003 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:713 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:719 src/logbook/lgbook.cxx:1367 msgid "Age" msgstr "" #: src/logbook/lgbook.cxx:722 src/logbook/lgbook.cxx:1243 #, fuzzy msgid "Station Call" msgstr "Station" #: src/logbook/lgbook.cxx:725 src/logbook/lgbook.cxx:1267 #, fuzzy msgid "Station QTH" msgstr "Station" #: src/logbook/lgbook.cxx:728 #, fuzzy msgid "Station LOC" msgstr "Station" #: src/logbook/lgbook.cxx:740 src/logbook/lgbook.cxx:1224 msgid "Notes" msgstr "Notes" #: src/logbook/lgbook.cxx:743 msgid "QSL rcvd date" msgstr "Date QSL reçue" #: src/logbook/lgbook.cxx:746 msgid "QSL sent date" msgstr "Date QSL env." #: src/logbook/lgbook.cxx:749 #, fuzzy msgid "eQSL rcvd date" msgstr "Date QSL reçue" #: src/logbook/lgbook.cxx:752 #, fuzzy msgid "eQSL sent date" msgstr "Date QSL env." #: src/logbook/lgbook.cxx:755 #, fuzzy msgid "LoTW rcvd date" msgstr "Date QSL reçue" #: src/logbook/lgbook.cxx:758 #, fuzzy msgid "LoTW sent date" msgstr "Date QSL env." #: src/logbook/lgbook.cxx:761 src/logbook/lgbook.cxx:1132 msgid "QSL-VIA" msgstr "" #: src/logbook/lgbook.cxx:764 src/logbook/lgbook.cxx:1694 msgid "Serial # in" msgstr "" #: src/logbook/lgbook.cxx:767 src/logbook/lgbook.cxx:1698 msgid "Serial # out" msgstr "" #: src/logbook/lgbook.cxx:776 src/logbook/lgbook.cxx:1706 msgid "Exchange Out" msgstr "" #: src/logbook/lgbook.cxx:785 src/logbook/lgbook.cxx:1174 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:788 src/logbook/lgbook.cxx:1210 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:791 src/logbook/lgbook.cxx:1162 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:794 src/logbook/lgbook.cxx:1198 msgid "ITUZ" msgstr "TIUZ" #: src/logbook/lgbook.cxx:797 msgid "FD class" msgstr "" #: src/logbook/lgbook.cxx:800 #, fuzzy msgid "FD section" msgstr "Réception RSID" #: src/logbook/lgbook.cxx:803 msgid "CW SS SerNo R" msgstr "" #: src/logbook/lgbook.cxx:804 msgid "CW sweepstakes rcvd ser. no." msgstr "" #: src/logbook/lgbook.cxx:807 msgid "CW SS Prec'" msgstr "" #: src/logbook/lgbook.cxx:808 msgid "CW sweepstakes precedence" msgstr "" #: src/logbook/lgbook.cxx:811 msgid "CW SS Check" msgstr "" #: src/logbook/lgbook.cxx:814 #, fuzzy msgid "CW SS Section" msgstr "Action" #: src/logbook/lgbook.cxx:815 src/logbook/lgbook.cxx:819 msgid "CW sweepstakes section" msgstr "" #: src/logbook/lgbook.cxx:818 src/logbook/lgbook.cxx:1379 msgid "10-10" msgstr "" #: src/logbook/lgbook.cxx:844 msgid "Logbook" msgstr "" #: src/logbook/lgbook.cxx:845 #, fuzzy msgid "Date On" msgstr "Date QSO" #: src/logbook/lgbook.cxx:846 msgid "Date QSO started" msgstr "" #: src/logbook/lgbook.cxx:858 msgid "Time On" msgstr "Heure ON" #: src/logbook/lgbook.cxx:859 msgid "Time QSO started" msgstr "" #: src/logbook/lgbook.cxx:871 msgid "Call sign worked" msgstr "" #: src/logbook/lgbook.cxx:883 msgid "Operator worked" msgstr "" #: src/logbook/lgbook.cxx:894 msgid "In" msgstr "" #: src/logbook/lgbook.cxx:895 msgid "Rst received" msgstr "" #: src/logbook/lgbook.cxx:906 msgid "Recs" msgstr "" #: src/logbook/lgbook.cxx:907 msgid "# Records in logbook" msgstr "" #: src/logbook/lgbook.cxx:918 #, fuzzy msgid "Date Off" msgstr "Date QSO" #: src/logbook/lgbook.cxx:919 #, fuzzy msgid "Date QSO Ended" msgstr "Date du QSO" #: src/logbook/lgbook.cxx:931 msgid "Time Off" msgstr "Heure OFF" #: src/logbook/lgbook.cxx:932 msgid "Time QSO ended" msgstr "" #: src/logbook/lgbook.cxx:943 msgid "Freq." msgstr "Fréq." #: src/logbook/lgbook.cxx:944 msgid "Frequency in MHz" msgstr "" #: src/logbook/lgbook.cxx:956 msgid "Mode in use" msgstr "" #: src/logbook/lgbook.cxx:967 msgid "Pwr" msgstr "" #: src/logbook/lgbook.cxx:968 msgid "Transmit power used" msgstr "" #: src/logbook/lgbook.cxx:979 msgid "Loc" msgstr "" #: src/logbook/lgbook.cxx:980 msgid "Stations grid square" msgstr "" #: src/logbook/lgbook.cxx:991 msgid "Out" msgstr "" #: src/logbook/lgbook.cxx:992 msgid "Rst sent" msgstr "" #: src/logbook/lgbook.cxx:1004 msgid "City of station worked" msgstr "" #: src/logbook/lgbook.cxx:1015 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:1016 msgid "US state of station worked" msgstr "" #: src/logbook/lgbook.cxx:1027 msgid "Pr" msgstr "" #: src/logbook/lgbook.cxx:1028 msgid "Province of station worked" msgstr "" #: src/logbook/lgbook.cxx:1040 msgid "Country of station worked" msgstr "" #: src/logbook/lgbook.cxx:1053 msgid "QSL" msgstr "" #: src/logbook/lgbook.cxx:1054 msgid "QSL-rcvd" msgstr "QSL-reçu" #: src/logbook/lgbook.cxx:1055 src/logbook/lgbook.cxx:1068 #: src/logbook/lgbook.cxx:1081 msgid "QSL received on this date" msgstr "" #: src/logbook/lgbook.cxx:1067 #, fuzzy msgid "EQSL-rcvd" msgstr "QSL-reçu" #: src/logbook/lgbook.cxx:1080 #, fuzzy msgid "LOTW-rcvd" msgstr "QSL-reçu" #: src/logbook/lgbook.cxx:1093 msgid "QSL-sent" msgstr "QSL-env." #: src/logbook/lgbook.cxx:1094 src/logbook/lgbook.cxx:1107 #: src/logbook/lgbook.cxx:1120 msgid "QSL sent on this date" msgstr "" #: src/logbook/lgbook.cxx:1106 #, fuzzy msgid "EQSL-sent" msgstr "QSL-env." #: src/logbook/lgbook.cxx:1119 #, fuzzy msgid "LOTW-sent" msgstr "QSL-env." #: src/logbook/lgbook.cxx:1133 msgid "QSL route of contacted station" msgstr "" #: src/logbook/lgbook.cxx:1163 msgid "Islands on the air" msgstr "" #: src/logbook/lgbook.cxx:1186 #, fuzzy msgid "Cont'" msgstr "Contest" #: src/logbook/lgbook.cxx:1211 msgid "DXCC designator" msgstr "" #: src/logbook/lgbook.cxx:1227 src/logbook/lgbook.cxx:1244 #: src/logbook/lgbook.cxx:1256 src/logbook/lgbook.cxx:1268 #: src/logbook/lgbook.cxx:1280 msgid "Interesting notes" msgstr "" #: src/logbook/lgbook.cxx:1241 #, fuzzy msgid "My Station" msgstr "Station" #: src/logbook/lgbook.cxx:1279 #, fuzzy msgid "Station Locator" msgstr "Station enrendue 2 fois" #: src/logbook/lgbook.cxx:1295 msgid "Ser out" msgstr "" #: src/logbook/lgbook.cxx:1296 src/logbook/lgbook.cxx:1421 #, fuzzy msgid "Contest seral # sent" msgstr "Champs &Contest" #: src/logbook/lgbook.cxx:1307 msgid "Exch Out" msgstr "" #: src/logbook/lgbook.cxx:1308 src/logbook/lgbook.cxx:1445 msgid "Contest exchange sent" msgstr "" #: src/logbook/lgbook.cxx:1319 msgid "Ser in" msgstr "" #: src/logbook/lgbook.cxx:1320 msgid "Contest serial # received" msgstr "" #: src/logbook/lgbook.cxx:1331 #, fuzzy msgid "Exch In" msgstr "Echange" #: src/logbook/lgbook.cxx:1332 src/logbook/lgbook.cxx:1457 msgid "Contest exchange received" msgstr "" #: src/logbook/lgbook.cxx:1344 msgid "Field Day class received" msgstr "" #: src/logbook/lgbook.cxx:1355 msgid "ARRL Sect" msgstr "" #: src/logbook/lgbook.cxx:1356 msgid "Field Section received" msgstr "" #: src/logbook/lgbook.cxx:1368 #, fuzzy msgid "Operators age received" msgstr "Noms des opérateurs" #: src/logbook/lgbook.cxx:1380 msgid "Ten Ten number received" msgstr "" #: src/logbook/lgbook.cxx:1392 #, fuzzy msgid "Operating band" msgstr "Opérateur" #: src/logbook/lgbook.cxx:1404 msgid "Check value received" msgstr "" #: src/logbook/lgbook.cxx:1417 msgid "CW SS" msgstr "" #: src/logbook/lgbook.cxx:1418 msgid "CW Sweepstakes Contest" msgstr "" #: src/logbook/lgbook.cxx:1420 msgid "Ser NoR" msgstr "" #: src/logbook/lgbook.cxx:1444 msgid "Precedence" msgstr "" #: src/logbook/lgbook.cxx:1470 msgid "JOTA" msgstr "" #: src/logbook/lgbook.cxx:1471 msgid "Jamboree On The Air" msgstr "" #: src/logbook/lgbook.cxx:1473 msgid "Troop-S" msgstr "" #: src/logbook/lgbook.cxx:1474 #, fuzzy msgid "Sent troop number" msgstr "Sélectionner la ligne" #: src/logbook/lgbook.cxx:1485 msgid "Troop-R" msgstr "" #: src/logbook/lgbook.cxx:1486 #, fuzzy msgid "Received troop number" msgstr "Numéro de série reçu." #: src/logbook/lgbook.cxx:1497 #, fuzzy msgid "Name-S" msgstr "Nom" #: src/logbook/lgbook.cxx:1498 msgid "Sent scout name" msgstr "" #: src/logbook/lgbook.cxx:1509 #, fuzzy msgid "Name-R" msgstr "Nom" #: src/logbook/lgbook.cxx:1510 #, fuzzy msgid "Received scout name" msgstr "Réception" #: src/logbook/lgbook.cxx:1526 msgid "Call Search" msgstr "" #: src/logbook/lgbook.cxx:1527 msgid "Search for this callsign" msgstr "" #: src/logbook/lgbook.cxx:1539 msgid "Find previous" msgstr "" #: src/logbook/lgbook.cxx:1547 msgid "Find next" msgstr "" #: src/logbook/lgbook.cxx:1554 msgid "Retrieve" msgstr "" #: src/logbook/lgbook.cxx:1555 msgid "Retrieve for active modem use" msgstr "" #: src/logbook/lgbook.cxx:1568 msgid "New record / Save record" msgstr "" #: src/logbook/lgbook.cxx:1575 msgid "Update the current record" msgstr "" #: src/logbook/lgbook.cxx:1582 msgid "Delete the current record" msgstr "" #: src/logbook/lgbook.cxx:1588 #, fuzzy msgid "File:" msgstr "&Fichier" #: src/logbook/lgbook.cxx:1611 msgid "Date" msgstr "Date" #: src/logbook/lgbook.cxx:1613 msgid "Time" msgstr "Heure" #: src/logbook/lgbook.cxx:1630 msgid "Cabrillo Setup" msgstr "" #: src/logbook/lgbook.cxx:1650 msgid "Select Cabrillo Contest & Fields" msgstr "" #: src/logbook/lgbook.cxx:1653 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1678 msgid "QSO Date" msgstr "Date QSO" #, fuzzy #~ msgid "All Others" #~ msgstr "Autre" #~ msgid "Receive modes" #~ msgstr "Modes réception" #, fuzzy #~ msgid "Transceiver FSK" #~ msgstr "Contrôle transceiver" #, fuzzy #~ msgid "NBEMS interface" #~ msgstr "Interface Utilisateur" #~ msgid "Signal level" #~ msgstr "Niveau signal" #, fuzzy #~ msgid "Filter Settings" #~ msgstr "" #~ "La phrase test par défaut est:\n" #~ " \"" #, fuzzy #~ msgid "Filter center frequ ency" #~ msgstr "Ajouter la fréquence courante" #, fuzzy #~ msgid "Filter low cutoff frequency" #~ msgstr "Ajuste fréquence curseur" #, fuzzy #~ msgid "track WF cursor" #~ msgstr "Couleur police" #, fuzzy #~ msgid "Rx audio volume" #~ msgstr "Audio" #, fuzzy #~ msgid "Filtered audio" #~ msgstr "Filtre" #, fuzzy #~ msgid "Weather Fax Image RX" #~ msgstr "Image Fax Météo RX" #~ msgid "No file name given" #~ msgstr "Nom de fichier manquant" #, fuzzy #~ msgid "channels != 1" #~ msgstr "Canaux" #~ msgid "unknown wave file error" #~ msgstr "Erreur inconue de fichier wave" #~ msgid "Rig control" #~ msgstr "Contrôle radio" #~ msgid "RPC" #~ msgstr "RPC" #, fuzzy #~ msgid "KISS control" #~ msgstr "Contrôle KISS" #~ msgid "Change log level" #~ msgstr "Change niveau de log" #~ msgid "Free Lossless Audio Codec\t*.flac" #~ msgstr "Codec Audio sans perte libre\t*.flac" #, fuzzy #~ msgid "Center freq (1500 Hz)" #~ msgstr "Fréquence porteuse (Hz)" #, fuzzy #~ msgid "Save image as monochrome file" #~ msgstr "Enregistrer fichier macros" #, fuzzy #~ msgid "Misc/IO" #~ msgstr "Divers" #, fuzzy #~ msgid "Reading fonts..." #~ msgstr "Rechercher des mises à jour..." #~ msgid "User Interface" #~ msgstr "Interface Utilisateur" #, fuzzy #~ msgid "Operating" #~ msgstr "Opérateur" #, fuzzy #~ msgid "Active Modem" #~ msgstr "Modes réception" #, fuzzy #~ msgid "PSKmail" #~ msgstr "Pskmail" #, fuzzy #~ msgid "Text IO" #~ msgstr "Texte:" #, fuzzy #~ msgid "IO" #~ msgstr "IO" #, fuzzy #~ msgid "Contest/Logging" #~ msgstr "Contest" #, fuzzy #~ msgid "Station / Operator" #~ msgstr "Station enrendue 2 fois" #, fuzzy #~ msgid "WF Ctrls" #~ msgstr "Contrôles de la chute d'eau" #, fuzzy #~ msgid "Clrs/Fnts" #~ msgstr "Couleurs && Polices" #~ msgid "Display" #~ msgstr "Affichage" #~ msgid "Mouse" #~ msgstr "Souris" #, fuzzy #~ msgid "BPF transmit audio" #~ msgstr "WPM Transmission CW" #, fuzzy #~ msgid "Cont" #~ msgstr "Contest" #~ msgid "PSK" #~ msgstr "PSK" #~ msgid "Rx" #~ msgstr "Rx" #~ msgid "Tx" #~ msgstr "Tx" #, fuzzy #~ msgid "Synop" #~ msgstr "Scope" #~ msgid "Thor" #~ msgstr "Thor" #~ msgid "RigCAT" #~ msgstr "RigCAT" #~ msgid "Hamlib" #~ msgstr "Hamlib" #~ msgid "Devices" #~ msgstr "Périphériques" #, fuzzy #~ msgid "Regex Match in Browser" #~ msgstr "Navigateur" #~ msgid "ID" #~ msgstr "ID" #, fuzzy #~ msgid "Temperature" #~ msgstr "Génération TX" #, fuzzy #~ msgid "Use password for tqsl access" #~ msgstr "Mot de passe" #~ msgid "Experimental" #~ msgstr "Expérimental" #~ msgid "Enter a CALL !" #~ msgstr "Entrez un indicatif !" #~ msgid "Toggle smeter / combo controls" #~ msgstr "Basculer les contrôles smètre/combiné" #~ msgid "Clear list" #~ msgstr "Effacer Liste" #~ msgid "Delete from list" #~ msgstr "Supprimer de la Liste" #, fuzzy #~ msgid "Frq" #~ msgstr "Fréq" #, fuzzy #~ msgid "frequency kHz" #~ msgstr "Fréquence kHz" #~ msgid "On" #~ msgstr "Début" #~ msgid "Press to update QSO start time" #~ msgstr "Cliquer pour mettre à jour l'heure de départdu QSO" #~ msgid "Off" #~ msgstr "Fin" #, fuzzy #~ msgid "QSO end time" #~ msgstr "Heure de fin du QSO" #, fuzzy #~ msgid "call sign" #~ msgstr "Indicatif" #~ msgid "Op" #~ msgstr "Op" #~ msgid "Azimuth" #~ msgstr "Azimuth" #, fuzzy #~ msgid "QTH City" #~ msgstr "Ville" #~ msgid "US State" #~ msgstr "État USA" #~ msgid "Maidenhead Locator" #~ msgstr "Locator Maindehead" #~ msgid "Sent serial number (read only)" #~ msgstr "Numéro de série envoyé (lecture seule)" #, fuzzy #~ msgid "Received FD class" #~ msgstr "RST reçu" #, fuzzy #~ msgid "Received FD section" #~ msgstr "Numéro de série reçu." #, fuzzy #~ msgid "Received CQ zone" #~ msgstr "Modes réception" #, fuzzy #~ msgid "Received State/Prov" #~ msgstr "RST reçu" #, fuzzy #~ msgid "Received serno" #~ msgstr "Réception" #, fuzzy #~ msgid "" #~ "Left click - save avatar\n" #~ "Right click - send my avatar" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Clic Droit - efface ligne" #~ msgid "Press to update" #~ msgstr "Cliquer pour mettre à jour" #~ msgid "Other call" #~ msgstr "Autre Indicatif" #~ msgid "Received RST" #~ msgstr "RST reçu" #~ msgid "Sent RST" #~ msgstr "RST envoyé" #~ msgid "Nm" #~ msgstr "Nm" #~ msgid "Other name" #~ msgstr "Autre nom" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Fn - exécute\n" #~ "Clic Droit - édite" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Shift-Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Maj-Fn - exécute\n" #~ "Clic Droit - édite" #, fuzzy #~ msgid "Shift-key macro set" #~ msgstr "Maj-Change le jeux de macro" #, fuzzy #~ msgid "" #~ "Left click - select\n" #~ "Right click - clear line" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Clic Droit - efface ligne" #~ msgid "seek - regular expression" #~ msgstr "rechercher - expression régulière" #, fuzzy #~ msgid "Select FSQ station" #~ msgstr "Sélectionner la ligne" #, fuzzy #~ msgid "Stations Heard" #~ msgstr "Station enrendue 2 fois" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Clic Gauche - exécute\n" #~ "Fn - exécute\n" #~ "Clic Droit - édite" #, fuzzy #~ msgid "Primary macro set" #~ msgstr "Jeux de macro principal" #~ msgid "Aborted" #~ msgstr "Annulé" #, fuzzy #~ msgid "Send Xchg" #~ msgstr "Envoyer image" #, fuzzy #~ msgid "Contest Logging" #~ msgstr "Contest" #, fuzzy #~ msgid "Generic" #~ msgstr "Général" #, fuzzy #~ msgid "Use generic contest fields" #~ msgstr "Champs &Contest" #, fuzzy #~ msgid "Use Field Day Contest Fields" #~ msgstr "Champs &Contest" #~ msgid "at:" #~ msgstr "à:" #~ msgid "Test Signal - Do NOT use with transmitter" #~ msgstr "Signal de test, NE PAS utiliser en transmission" #, fuzzy #~ msgid "ALC on" #~ msgstr "AFC marche/arrêt" #, fuzzy #~ msgid "FFT filter" #~ msgstr "Filtre" #, fuzzy #~ msgid "User Interface - Browser" #~ msgstr "Interface Utilisateur - Navigateur" #, fuzzy #~ msgid "User Interface - General" #~ msgstr "Interface Utilisateur" #, fuzzy #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Interface Utilisateur" #, fuzzy #~ msgid "User Interface - Contest" #~ msgstr "Interface Utilisateur - Contest" #, fuzzy #~ msgid "User Interface - Macros" #~ msgstr "Interface Utilisateur - Macros" #, fuzzy #~ msgid "User Interface - Waterfall controls" #~ msgstr "Interface utilisateur - Contrôles chute d'eau" #~ msgid "Rig Control using xml spec file" #~ msgstr "Contrôle Rig grâce à un fichier de spec xml" #~ msgid "Callsign database" #~ msgstr "Base de données indicatifs" #~ msgid "Callsign:" #~ msgstr "Indicatif:" #~ msgid "Name:" #~ msgstr "Nom:" #~ msgid "Revert" #~ msgstr "Inverse" #, fuzzy #~ msgid "Reset rigCAT interface" #~ msgstr "Initialise interface RigCAT" #, fuzzy #~ msgid "Reset hamlib interface" #~ msgstr "Initialise interface hamlib" #, fuzzy #~ msgid "Use GPIO PTT" #~ msgstr "Utiliser PTT uHRouter" #, fuzzy #~ msgid "Select GPIO port" #~ msgstr "Sélection port série" #, fuzzy #~ msgid "QSL-2" #~ msgstr "QSL-reçu" #~ msgid "Rig control and logging" #~ msgstr "Contrôle radio et journal" #~ msgid "Rig control and contest" #~ msgstr "Contrôle radio et concours" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "Echec de recherche de mises à jour:\n" #~ "%s" #~ msgid "Visit URL" #~ msgstr "Visiter l'URL" #~ msgid "Copy URL" #~ msgstr "Copier l'URL" #~ msgid "Controls" #~ msgstr "Contrôles" #, fuzzy #~ msgid "Empty ADIF logbook file %s" #~ msgstr "Vider le fichier journal ADIF" #~ msgid "Error reading %s" #~ msgstr "Erreur lecture %s" #~ msgid "Quick entry" #~ msgstr "Entrée rapide" #, fuzzy #~ msgid "User Interface - Logging" #~ msgstr "Interface Utilisateur - logging" #, fuzzy #~ msgid "Client/Server Logbook" #~ msgstr "Logbook client/serveur" #~ msgid "Enter URL address of server" #~ msgstr "Entrer l'adresse URL du serveur" #~ msgid "Enter Port # assigned to server" #~ msgstr "Entrer le n° de port assigné au serveur" #, fuzzy #~ msgid "Mono audio output" #~ msgstr "Périph. audio sortie" #~ msgid "CONT" #~ msgstr "CONT" #~ msgid "No rig specified" #~ msgstr "Aucune radio spécifiée" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Entrer fréquence ou changer avec\n" #~ "Gauche/Droite/Haut/Bas/Pg_Haut/Pg_Bas" #, fuzzy #~ msgid "Char set" #~ msgstr "Efface Liste" #, fuzzy #~ msgid "Frq Disp" #~ msgstr "Affichage Freq" #, fuzzy #~ msgid "Select packet baudrate" #~ msgstr "Sélectionne paramètres opératoires" #, fuzzy #~ msgid "boost Audio input" #~ msgstr "Périph. audio sortie" #~ msgid "Select the rig by name" #~ msgstr "Sélection de la radio par le nom" #, fuzzy #~ msgid "Initialize Memmap interface" #~ msgstr "Initialise interface hamlib" #~ msgid "Mixer" #~ msgstr "Mixeur" #, fuzzy #~ msgid "OSS Mixer" #~ msgstr "Mixeur OSS" #~ msgid "Manage mixer" #~ msgstr "Gère le mixeur" #~ msgid "Save image as:" #~ msgstr "Sauvegarde image sous:" #~ msgid "Colors and Fonts" #~ msgstr "Couleurs et Polices" #, fuzzy #~ msgid "Disp" #~ msgstr "Affichage" #, fuzzy #~ msgid "Navtex stations file:" #~ msgstr "Enregistrer fichier macros" #~ msgid "after:" #~ msgstr "après:" #, fuzzy #~ msgid "Displays" #~ msgstr "Affichage" #~ msgid "Save log before exiting?" #~ msgstr "Sauvegarder le log avant de quitter?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Sauvegarder les macros avant de quitter?" #~ msgid "QSO Freq" #~ msgstr "Freq QSO" #~ msgid "Cnty" #~ msgstr "Pays" #~ msgid "View log" #~ msgstr "Voir log" #~ msgid "Text:" #~ msgstr "Texte:" #~ msgid "Callsign DB" #~ msgstr "BdD Indicatifs" #~ msgid "CDROM" #~ msgstr "CDROM" #, fuzzy #~ msgid "On Date" #~ msgstr "Date QSO" #, fuzzy #~ msgid "Off Date" #~ msgstr "Date QSO" #~ msgid "Open logbook..." #~ msgstr "Ouvrir journal..." #~ msgid "Could not write to %s" #~ msgstr "Echec écriture vers %s" #~ msgid "Rig Not Specified" #~ msgstr "Aucune radio spécifiée" #~ msgid "8" #~ msgstr "8" #~ msgid "Foreground" #~ msgstr "Avant plan" #~ msgid "Oper' Controls" #~ msgstr "Contrôles Oper'" #~ msgid "Viewer" #~ msgstr "Visualiseur" #, fuzzy #~ msgid "No Rig-Log" #~ msgstr "Control Radio" #, fuzzy #~ msgid "Min Rig-Log" #~ msgstr "Control Radio" #~ msgid "Show config" #~ msgstr "Montrer config" #~ msgid "*** DUP ***" #~ msgstr "*** DUP ***" #~ msgid "&Digiscope" #~ msgstr "&Digiscope" #~ msgid "&PSK Browser" #~ msgstr "Navigateur &PSK" #~ msgid "&Call" #~ msgstr "&Indicatif" #~ msgid "&Name" #~ msgstr "&Nom" #~ msgid "QT&H" #~ msgstr "QT&H" #~ msgid "&State" #~ msgstr "&Etat" #~ msgid "&Province" #~ msgstr "&Province" #~ msgid "Countr&y" #~ msgstr "Pa&ys" #~ msgid "&Transmit" #~ msgstr "&Transmet" #~ msgid "&Receive" #~ msgstr "&Reçoit" #~ msgid "&Abort" #~ msgstr "&Annuler" #~ msgid "&Copy" #~ msgstr "&Copier" #~ msgid "C&lear" #~ msgstr "E&ffacer" #~ msgid "Cu&t" #~ msgstr "Cou&per" #~ msgid "&Paste" #~ msgstr "Co&ller" #~ msgid "Non CAT mode" #~ msgstr "Mode hors CAT" #~ msgid "9" #~ msgstr "9" #~ msgid "" #~ "\n" #~ "System: " #~ msgstr "" #~ "\n" #~ "Système: " #~ msgid "Psk Viewer" #~ msgstr "Visualiseur Psk" #~ msgid "No PTT available" #~ msgstr "Aucun PTT dispo" #~ msgid "SQL on/off" #~ msgstr "SQL marche/arrêt" #~ msgid "Waterfall/FFT - Shift click for signal scope" #~ msgstr "Chute d'eau/FFT - Shift clic pour scope signal" #~ msgid "Log File" #~ msgstr "Fichier de Log" #~ msgid "Paths" #~ msgstr "Chemins" #~ msgid "Slow" #~ msgstr "Lent" #~ msgid "Fast" #~ msgstr "Rapide" #~ msgid "X-scope" #~ msgstr "X-ccope" #~ msgid "Qrz" #~ msgstr "Qrz" #~ msgid "H/W ptt" #~ msgstr "H/W ptt" #~ msgid "Xml File" #~ msgstr "Fichier Xml" #~ msgid "SndCrd" #~ msgstr "SndCrd" #~ msgid "Wfall" #~ msgstr "Wfall" fldigi-4.2.05/po/el.gmo0000664000175000017500000031277014611714004011515 00000000000000B,"\v { &À )3BR n: ʁ؁ 3FM ^ h v (҂؂$*$Ot  ǃ!/#4 Xbw 4,$,4H\t х 8Wl!ц92,A n6| I0b9͈'4.Q0 ҉$$)<"L:o NJۊ *BZrɋ%%? eo  όڌ (3 C Q[ o$| ƍӍ '0EW`u Ў'0HYq#"ӏ -B&Qx xz !!(ޑ;1Cu y ŒΒ ג/AQ/Y “6ѓ '6> D&Ov# Ք '?G#Pt.ԕݕ /1afB̖ #0EMU]z—ݗ! & 9 GUp*(Ԙ 5EZm ~ ƙ ҙޙ"A IWp ͚ښ+"1;8t*|Cb&@8<u} 0ϝ. /;Sl}!Ğ" $)E Z fs ϟ  ".$In $:Vk{ # ,;C JUm Ϣ 7 2>[r0!֣+ 8N ` ky(#ޤ  $(M_w!˥ Хޥ" # 1Ro !<W fs  ˧٧46*<g.S9Vk r|ʩ &: I Va s"  ժ  ! - 9EU fs  ϫ - B#c ȬӬڬ ";PU ] j w! ˭ڭ   '4m\+ʮ<3 8BQ bpį˯ޯ( 5OXgv ư 0($Y ~ ͱ ڱ  !4 V bl  ɲԲݲ*GW\u8|ϳ 19 OZq yش6!Eg% Ƶ'͵ !/FY+o!-Ҷ  $"&Gnͷ&"4I~ ɸ% '%M`v*"Qٹ5+1a˺" +>A( û'ͻ3 Pq)8$,>To0Ͻ׽ܽ+4J No.M(l!Y.0@q 2061P9HU [3| *<<94v:"8)#b"=-7#MqA1" 0Nj#.00& WJe46?3\=4D\IvK- :Vq)G Re2t8 #&?&'W/9_<? |B..+d<&W&WF$o3@S6=Z {dJ+L4LL 5(^&t%E%, R_ y!k .,: g.A]t~ A)kKHT zu()78p0.W7[MV&n2xAa{&(>,gm/G2IzYs/N,L4y5y "qrl2&,9S &+*=V9<1 I=<%.,PF #+#B$f:=E]s!Y10GZdo7V c%$J,S`.4Ec6''-6,84e"F #5'YA ) *4_Q}'UYfT(&dO4(0'2XPE2 J5U D/%Lirz{W1@DFYDX*XkSH'bIG/\]k2Lbf4;:9Xzu!D(qmpa U K( <t M  T  u Mj M M MT M L O=`GH6L '9.h5y1 %##RGC%$>)hz-26`(&"-. 0 >K $ ";Y#n b#!Bd$z52)%O^'n *EYGQ%,#H ly `b {  1"$*G[8l4 #!AN]9** < ]8~,2f"p!-O!I /L .| " d M3!!U"d]"U"@#NY#d#D $(R$J{$$$2$,%%FR%}% &#&8&+T&+&1&1&'1!'1S'1'6'6'6%(0\(((6(O(@8):y))6))*B**#m** ***%*+!4+/V+ +$+!+g+C, b,p,,%,?,,0-?-R-f-y---2-8-3.M.<l./.H.("/(K/,t//&/:/H07b0:0+01)1D1a1bw1'12= 2G2V2-]2L2&2 2 3344/46K4B4v4<5w5 M6X6m66&6$667"7%>7#d707,7'78(8b:8#88(889h59"9999: :d:8{:':4:);";;^;7|;:; ;;4 <#@<d<5y<a<=5(='^==-==M>EV> >>Ks??G?>#@ b@ n@ z@7@(@;@1#A2UA4A=AA B4BMB dB5B9BBcCUrC CC6C'#DKD%kD"D,D+D E &E1EDEUEAfEAE E4E*F#3F$WF#|F<FFFG42GlgGG2GHX,HHUH H HBJDKJJYJ KKAKK7 LALL(LCM$GM!lM]M^MKN`N NNN NN OFOGbO?OORODP)dP*P*PPPQ0Q3PQ%QQ)QQR9R'VRQ~R7RSS,T7BT+zT0T+T)U*-U5XU@UUUU V0V$KV#pVVVV1V5W6WW&W&X2;XnXXY>.Y(mY!YOYZTZBnZ2ZNZ#3[W[w["[0[S[Z?\c\\]>2]Kq]']9]&^UF^0^^8^9_Q_Sm__K_B%`6h``0`-`Ta0ra<a aXb4Zb#bb"b,b!c#?cccc)cac6*dadsqdHdC.ere12fxdf*f gg,&g$Sg)xg&g1g5g1h@hSUh!hhhiiB2i uiii7iiij$j<7jtjjjj9jk%k>kQkhkkkkkkNkYBlWl5l]*mm2mmmmn33n4gn+n+n/n $o1oAoXoto=oo.o4pNp#^pp%p)p5px(qqVrkrGsNscsys*s'sst%t2>tqttt't t8t7.ufuuu)uu+u.u-.v5\vAvvvwr&w\wwx1xNxkxxxxxx%y'?y=gyhy)z8zEHzEzZz./{6^{;{'{;{.5|7d|V|'|}5,} b}p}D~6J~~~/~L~%(4]+oB$8$;],<ƀ59QTE(n D#A5R14l\tGj˄67MJLЅ4)R<|'14!H!jBjχ>:+y#Ɉ' C%`!S. +Ll>s5ws05͌4J8#4ЍC^J]^ 8ݏb?yא|X Ց_G7V3B’>4D%yg 1?>P!L& %I0@z5lN:I(Wc/a65!k!(+([-&O l A7TX2U6u @X5 2{ ^_,P3R;>Ym}n/ @\<T)  tamO;ooCD'n P/ugRq+ IM#Kh-'o4KBwG!0. |O|tZ(0uQF]nM[$Z9%':#w VL;Df-@= _x9_:6HW}HR= t4=a4   X.l-'*V&]C^?kCh$vc)&?6@ujndq.<|g2I@f,A9r1G4%v1za|%{CBMo-ejvQgb   0hh"e [Jb)~T+O!p>*Fe  "<8xZkrz?,=#Es%Qm7<vWA8(Ud$~N~~kyM{1*}Y#myz{ :9Ui\E,FT"`</dEK/ cBR[_S\w3EPH4Hs2p+Vr}7S0D]Y&qLdNWibA2>8sj1)L$Vf%S#9jxJ?`D!"JtP`bKUy^'SX3;BGi6s">f3,:?*355i7Z ]>8rN )qB^*LQ.5 p`g807I+$F.;l1c\ywA&zJx G=pY e Operator Avatar Operator avatar Posted version: # Records in logbook# times to resend command before giving up%s exists, overwrite?%s: Do not exist, create?&About&Configure&File&Help&View... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...1 - Slow, 2 - Medium, 3 - Fast1 minute 'PARIS '1/2 speed1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types1x speed2x speed4 bar macro set below Tx8-bit extended characters8-bit extended characters (UTF-8) repeat after waiting NN sec alert using external wav file my antenna Xmt audio wav file send avatar operating band clear log fields clear QSO fields clear RX pane clear TX pane contest counter decrement counter insert text file my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot insert image file increment counter S/N etc. IMD etc. use local date/time save QSO data map on google my call my locator my name my RST pause transmit right-clk QSY button left-clk QSY button repeat macro continuously receive save current macro file search DOWN for signal search UP for signal text at start of TX repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Fldigi version delay xmt for NN.n sec get weather data for station get weather data? Dup ColorAFC behaviorAFC controlAFC range (Hz)AFC speedAFC tracking speedAbortActionAddAdd address to notes fieldAddressAdjustAdjust cursor frequencyAdjust the DSP bandwidthAgeAlert volumeAllAll entriesAll settings shown here can be changed later via the Configure menuAllow errorsAllow/Disallow ChangesAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAmplitude of right channel QSK signalAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAudioAudio device infoAudio device information is only available for the PortAudio backendAudio device shared by Audio Alerts and Rx MonitorAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto recordAuto-fill Country and AzimuthAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutomatically start csv data file recording with wav playbackAutomatically start psk reporter socket connectionBackBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3BandBands must matchBandwidthBeginners' GuideBehavior of s/n imdBg ColorBrowseBug me about saving log entriesBuild infoButtonButton HeightC&ountriesCALLSIGN always lower caseCAT command for PTTCPU usage increases with waterfall heightCQ zoneCW QSK signal on right channelCW is LSB modeCW keying using CAT command strings. Available for supported transceivers. Use with RigCAT or flrig transceiver control. A separate serial port is NOT needed. Disable CAT PTT if transceiver interprets that as a keydown command (e.g. TS480). Recommend setting transceiver to either semi or full break-in. Enter correct CIV address for Icom transceivers.CWI thresholdCabrillo SetupCalibrateCall SearchCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture/Playback supports full duplex operationCapture:Carrier frequency (Hz)CelsiusCenter display on signalCenter freqCenter lineCenter on ReferenceCenter on UnknownChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange dir...Change positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:CheckCheck AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check if xcvr uses LSB for CWCheck if xcvr uses USB for RTTYCheck this to be notified when an RSID is received without changing modem and frequencyCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCity of station workedCleanup KML data now !Cleanup on startupClearClear AllClear channel text after # seconds of inactivityClear list?Clear log controls sets RST in to 599/59Clear log controls sets RST out to 599/59Clear log entries after saving or using macro Clear log fields - new CALLClear log fields?Clear on saveClear textCloseClose ListCollapse TreeColorColors and cursorsColors-FontsColors-Fonts/FreqDisp - MetersColors-Fonts/Function keysColors-Fonts/Logging controlsColors-Fonts/Rx-TxColors-Fonts/Signal LevelColors-Fonts/TabsCommand Not FoundCommand line optionsCommand missing ':'.Computer generated file nameConditionsConfig DialogConfig ScriptsConfigureConfirmConfirm QuitConfirm RESETConfirm exitConfirm quit?ConnectConnect / Disconnect from WinKeyerConnect to serverConnectedContest Exchange / Serial #Contest:Contests/GeneralContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not find LoTW report file. Download from ARRL's LoTW page after logging in at: https://lotw.arrl.org/lotwuser/default Store the report file to the fldigi LOTW folder, naming the file 'lotwreport.adi'Could not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate new logbook fileCreate sunspotsCustom...CutDTR is PTT signal lineDTR is ptt lineDTR/RTS keying may be assigned to flrig, share the RigCat serial port, share the Separate PTT serial port, or be assigned to separate serial port. No settings for baud, stops bits, etc are needed.DTR/RTS signal line FSKDash to dot ratioDash/DotData files repositoryData files sourcesData files updateData files...Data sourceDatabase merger in progressDateDate QSO EndedDate QSO startedDate time ON == OFFDecode DTMF tonesDecode received DTMF tonesDefaultDefault RST in to 599/59Default RST out to 599/59Default SettingsDefault listen / transmit frequencyDefault messageDefaultsDelay NN msec after executing mode changeDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete entry?Delete local data files if selected.Delete the current recordDeselectDetected signal levelDetector high thresholdDetector low thresholdDevice supports full duplexDevice:Difference between Rx & Tx freq (rig offset)Digit ColorDigitsDirectory path not foundDirectory...Disable CAT PTTDisable PTTDisable alert dialogDisable allDisable flrig CW PTTDisable freq changeDisable further detection when RSID is receivedDisable on very slow CPUs or if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplay RX as a scrolling marqueeDisplay RX in reverse videoDisplay logbook read datum at startDisplay macro filename at startDisplay timed delivery message if enabledDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDocked scopeDon't saveDragging on the waterfall scale changes frequencyDriver requires stop bits to be ZERO!Dup ColorDuplicate check, CALL plusDuplicatesEnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable ARQEnable CW operationEnable DSP prior to decoderEnable DTR signal line, default is RTSEnable Data StreamEnable FSK on serial portEnable KISSEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable specific parameter to Save & Restore on a per mode/band basis.Enable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable this to send start/stop tonesEnable to put Tx panel above Rx panelEnable to select date rangeEnabledEnter full path-filename for external programEnter full path-filename for flampEnter full path-filename for fllogEnter full path-filename for flmsgEnter full path-filename for flnetEnter full path-filename for flrigEnter full path-filename for tqsl executableEnter full path-name for cty.dat folderEnter the API key for your Cloudlog instanceEnter the URL of your Cloudlog APIEnter time span in minutesEnter transceiver HEX CIV addressEvenEven LinesEven linesEvent logExecutable file to insertExecuteExecute command on KML files.Executing script file: %sExitExit promptsExportExport SetupExport logbook records for LoTW uploadExport records for LoTW uploadExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...FLMSG files...FMT sample rateFSK independent serial portFax images destination directoryFeel free to skip any pages or exit the wizard at any timeFile I/O onlyFile not foundFile pathname:File read errorFile:FilesFill in Country / Azimuth using cty.dat informationFilterFilter bandwidthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFirst select audio alert playback deviceFixedFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font/ColorFont:Force RST in/out to 599/59Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFrequencyFrequency CorrectionFrequency in MHzFrequency scaleFullFull reportGeneralGenerateGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Hamlib read timeoutHeight of macro barHell Receive ParametersHell Transmit ParametersHex CIV addrHideHide window after (s):High frequency limit in HzIFKP Raw ImageITU zoneIgnore duplicatesInactivity timeoutInches Hg.Include the transmit frequencyInclusive stop date for exportInitial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitialize the QSO logging fieldsInput signal levelInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickInteresting notesKML server enabled (On / Off)LatencyLeave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click to select possible dup colorLeft click to toggle Status BarLeft click to toggle VuMeterLeft click: change mode Right click: configureLeft or right click always replays audio historyLimit AFC movement to this rangeLine: %d Error:%d %s (%s)Listen for signals within this rangeLoTW download fileLoadLoad a new paletteLoad image fileLoad last used macro file at startLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocate tqsl executableLocationLockLock transmit frequencyLog all RX/TX textLog on to pskrep when starting fldigiLogin name for QRZ / Hamcall / HamQTHLotW userLow frequency limit in HzLowerLower limitLowest freq on bottom of viewerMARK/SPACE reversedMFSK ImageMFSK image fileMYCALL always lower caseMYCALL lower caseMacro Button LabelMacro TextMacro editor - Manual tuningMark onlyMark prev freq/modeMarquee textMay require resizing the Rx/Tx panelMerge ADIF fileMerge...Meter ColorMiles / HourMinimal controlsMinimum time between eventsMiscMisc/AutostartMisc/CPUMisc/DTMFMisc/KMLMisc/NBEMS interfaceMisc/PSK reporterMisc/PSMMisc/Rx text captureMisc/Save ParametersMisc/Sweet SpotMisc/TCP-IP sessionsMissing command %s after line %dMode must matchModem signal on left and right channelsModem/CW/CAT KeyingModem/CW/CAT keyingModem/CW/DTR-RTS keyingModem/CW/GeneralModem/CW/Timing and QSKMonitor transmitted signalMouse wheel active on macro buttonsMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy StationN3FJP Server IP AddressN3FJP Server IP PortNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNewNew record / Save recordNextNoNo faster than thisNo records in lotw download fileNo slower than thisNoneNotchNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.NotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberON - Marquee style OFF - Clear & restartON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOddOdd LinesOdd linesOne above Rx/TxOne above waterfallOne below waterfallOp &ModeOpen ...Open ListOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen rig xml fileOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperating bandOperatorOperator CallOperator Callsign:Operator Name:Operator callsign (if different than station callsign)Operator-StationOperators QTHOperators nameOptionsOtherPSK et al.PTT delays valid for all CAT/PTT typesPTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT using hamlib commandPTT via Hamlib commandPWR-meterParameter is not valid.Parse all incoming textPartialPasswordPassword for QRZ / Hamcall / HamQTHPassword requiredPastePick baud rate from listPlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPortPort is second SCU-17 devicePort:Position the 4 bar macro set below Tx panel Default above Rx panelPost write delay (msec)Power scalePress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro fileProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPulse shapePulse width (msec)QSK amplitudeQSK frequencyQSK on right audio channelQSL received on this dateQSL sent on this dateQSO DateQSO must not occur within a time period ofQuiet mode [-q], do not open tqsl dialogRSID receptionRST always 599/59RTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTY Scope DisplayRTTY is USB modeRX captureRX sound card correctionRadio frequencyRangeRange +/- wpmRange 1...3Range 1...4Range WPM setting default = 20Range WPM setting default = 25RatioReally delete record for "%s"?ReceiveReceive UsageReceive filter bandwidthReceive synchronizerRecent activity for grid Reception of flmsg filesReception reports...Record AudioRecord both channelsRecord data for NN minutes after auto startReloadReload cty.datRemoveReport rig frequency (enable only if you have rig control!)ReportsRequired for some transceivers e.g. TS-480ResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Restore UART Settings on CloseRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsResultRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetain tx freq lockRetrieveRetrieve for active modem useReturns IP Address and port number to the default value.ReverseReverse (Rv) controlReverse Left/Right channelsReverse Mark/SpaceReverse videoReview / edit the exported LoTW upload adif fileReview lotw.adif file before sending with tqslRig ControlRig Control/C-Media PTTRig Control/CAT (rigcat)Rig Control/GPIORig Control/HamlibRig Control/Hardware PTTRig Control/flrigRig modeRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCAT used for rig controlRsID audio alert wavRun programRun program:Rx / Tx PanelsRx AGCRx Audio DialogRx Height in pixelsRx ParametersRx/Tx Character setS/N and IMD behaviorSOM decodingSample rateSaveSave ...Save AFC state by modeSave ConfigSave Reverse state by modeSave Squelch level and state by modeSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save log entry?Save logbook fileSave macro fileSave text asSave this paletteSave transmit level control by modeSave...Scale ColorScopeScrollSearch for this callsignSearch range (Hz)Secondary TextSecondsSelectSelect AllSelect Fields to ExportSelect Records to ExportSelect Rx/Tx Character SetSelect TagSelect audio fileSelect bandwidthSelect destination directorySelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect pin numberSelect waterfall scale fontSendSend Callsign in CW at end of every transmissionSend QSO data to LoTW when loggedSend Test characterSend a continuous stream of test charactersSend beacon every ...Send continuouslySend imageSend image...Send lotw.adif via tqslSend reception report when logging a QSOSend report only when QSO is loggedSent chars in Rx/Tx paneSer. PortSerial PortSet level for good viewingSet the number of characters per rowShare RIGCAT portShare Separate PTT portShare the RIGIO portShares RIGIO serial port, or usesShort description of antennaShowShow TX timerShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow delivery messageShow fewer modesShow macro control codesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallShutdown flrig with fldigiSignal BrowserSignal LevelSignal Level (dB)Signal Level IndicatorSignal LevelsSignal browserSignal range (dB)Signal searchSignal trackingSingle macro bar below logging panel variable heightSingle-click to captureSize:Skipped chars in Tx pane (Tx on/off in CW)Slow CPU (less than 700MHz)Software reversal of left-right audio channelsSome changes made by the script requires program restart before they become active.Sort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound Card InterfaceSound:SoundcardSoundcard/AlertsSoundcard/DevicesSoundcard/Right channelSoundcard/SettingsSoundcard/Signal LevelSoundcard/Wav file recordingSpace onlySpec CharSpectrum Scope / Waterfall interactionSpectrum scopeSpeed (WPM):Speed testSpotting disabledSquelch levelSquelch level/activated control(s)StartStart DateStart NbrStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberState must matchStation CallStation Callsign:Station LOCStation LocatorStation Locator:Station QTHStation callsignStations grid squareStatusStop DateStore images in this directoryStore mode and frequency Right click for listSubmit password with each uploadSubmit the upload adif file to LoTWSunspot creation underway!Switch to ARQ I/OSync to data recordSys ColorsSystemTHOR Raw ImageTX PowerTX deadmen timeout (mins)TX generateTX offsetTX sound card correctionTabular data sourcesTestTest =>Test API KeyTest SignalsTest charTest character for QSK adjustmentTest commandTest duration (60 seconds)Test text fileTest...Text CaptureText ColorsText HighlightingText capture orderText file to insertText to send during keyboard idle timesThe RsID notification message contents and display characteristics are configured on the "Notifications" tab.The filename is written to the RX text areaThe wizard will guide you through the basic fldigi settings:TimeTime (s):Time QSO endedTime QSO startedTime needed: Time span overTimeout (msec)TimingTiming/SettingsTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTransceiver control, flrig/rigcat/hamlibTransfer speed, X1-normalTransmitTransmit PowerTransmit UsageTransmit callsignTransmit fontTransmit level controlTransmit lower case textTransmit periods (.) when idleTransmit power usedTransmit signalTransmit textTransmit/ReceiveTransmits a diddle dot when no keyboard activityTune margin (tone frequency spacing)Two scheme 1Two scheme 10Two scheme 2Two scheme 3Two scheme 4Two scheme 5Two scheme 6Two scheme 7Two scheme 8Two scheme 9Tx ParametersTx above RxTx level attenuator (dB)Tx power used for logbook entriesUI languageUI schemeUI/Browser/ChannelsUI/Browser/ColorsUI/Browser/Detection LevelUI/GeneralUI/Macro buttonsUI/Rx TextUI/TouchUS state of station workedUS units of distance (QRB)Unable to open file %sUncheck if KML is never usedUndefined errorUndoUnsupported audio formatUpdateUpdate selected local data files with repository contentUpdate site not availableUpdate the current recordUpperUpper limitUpper signal level (dB)Use DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse Pulse Audio serverUse RTSUse RigCATUse Separate Keying Serial PortUse colored buttonsUse date/time off for log entryUse flrig DTR/RTS keyingUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUse these for WinKeyer and nanoCWUse this tqsl station locationUse wsjtx scaleUsed ONLY for frequency analysis modeUser nameVerifyVersion %s is available at Source ForgeViewView/Hide 48 macrosView/Hide ChannelsVisible modesVisit Hamcall web siteVisit QRZ web siteVisit hamQTH web siteWARNING - this will over write ALL settingsWEFAX images...WaitWait NN seconds for LoTW responseWait interval (msecs) before reading responseWaterfallWaterfall / FFT / ScopeWaterfall Centered on unknown signalWaterfall centered on reference signalWaterfall drop speedWaterfall height in pixelsWaterfall/Buttons & ControlsWaterfall/DisplayWaterfall/FFT ProcessingWaterfall/Mouse usageWaterfall/SpectrumWav file recordingWav file recording - START IMMEDIATELYWav file recording - SYNCHRONIZE with data recordingWav write sample rateWeather Fax Image TXWeb Browser lookupWheel actionWhen no signal presentWideWill occur after this time in secondsWord delimitersWord wrapWrite current macro set on program exitWrite delay (msec)XON/XOFF flow controlXcvr serial portYesYou are probably running an alpha version You are running the latest versionYou must have tqsl installed and it's location recorded for LoTW updates to work!You need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour tqsl login passwordafteralways append to file(s)automatic data uploadcallsign tooltips in received textchar WPMclear old datacty.dat foldercurrent wx conditionsdefault scale is audo "Vu Meter" enable to emulate wsjtx scaledefault uses date/time ondisplay Rx control chars as ascii stringeQSL userenable mouse wheel control of macro barflmsg received wavflmsg timed out wavflrig is the preferred method of tranceiver controlfreq scale = N * modem bandwidthkilometers / hourleft click on WF recenters spectrum scopeleft click transfers frequency to scope center frequencyminutesnoprint ^! execution codes in Rx panelreportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportsscale spectrum display linked to modem bandwidthsecondssecssecs' =>select browser fontselect by datesend when logged (log button, , )tqsl station locationuseuse waterfall range/limit valuesvalues left/below waterfallxmt start/stop tonesyesProject-Id-Version: fldigi 4.2.00 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2023-09-02 19:30+0300 Last-Translator: Haris Andrianos Language-Team: Greek (Haris Andrianos) Language: el MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: iso-8859-7 X-Generator: Poedit 3.3.2 Εικόνα Χειριστή Εικόνα Χειριστή Δημοσιευμένη έκδοση: # εγγραφές στο logbook# φορές για επαναποστολή εντολής πριν παραιτηθεί%s υπάρχει, αντικατάσταση;%s: Δεν υπάρχει, δημιουργία;ΣχετικάΡύθμισηΑρχείοΒοήθειαΠροβολή... Αυτές οι ρυθμίσεις βρίσκονται και σε άλλες καρτέλες. Βρίσκονται ως αντίγραφα εδώ για ευκολία. Μπορείτε να αλλάξετε μια ρύθμιση από οποιαδήποτε θέση. ...1 - Αργό, 2 - Μεσαίο, 3 - Γρήγορο1 λεπτό 'PARIS'ταχύτητα 1/2Τόνος 1000 Hz όταν ενεργοποιείται το PTT Μπορεί να χρησιμοποιηθεί αντί για ή σε συνδιασμό με άλλους τρόπους PTTταχύτητα 1xταχύτητα 2x4 bar macro κάτω από πίνακα εκπομπ.8-bit εκτεταμένοι χαρακτήρες8-bit εκτεταμένοι χαρακτήρες (UTF-8)επανάληψη μετά από αναμονή NN δευτ. ειδοποίηση με χρήση εξωτερικού αρχείου wav η κεραία μου εκπομπή αρχείου ήχου wav αποστολή avatar μπάντα λειτουργίας καθαρισμός των πεδίων του log καθαρισμός των πεδίων του QSO καθαρισμός πίνακα Λήψης καθαρισμός πίνακα Εκπομπής μετρητής contest μείωση μετρητή εισαγωγή αρχείου κειμένου η συχνότητα μου κείμενο σε NAME/QTH μετακίνηση στην συχν. NNNN Hz επιστροφή στο sweet spot εισαγωγή αρχείου εικόνας iαύξηση μετρητή S/N κλπ. IMD κλπ. χρήση τοπικής ημερομηνίας/ώρας αποθήκευση στοιχείων QSO χάρτης στο google το callsign μου το locator μου το όνομα μου το RST μου παύση εκπομπής Δεξί κλικ κουμπίου QSY Αριστ.κλικ κουμπίου QSY συνεχής επανάληψη macro λήψη Αποθήκευση του τρέχοντος αρχείου macro Αναζήτηση ΚΑΤΩ για σήμα Αναζήτηση ΕΠΑΝΩ για σήμα κείμενο στην αρχή της εκπομπής επανάληψη κάθε NN δευτ. σήμα συντονισμού για NN δευτ. εναλλαγή Εκπομπής/Λήψης εκπομπή ρύθμιση εξασθενητή εκπομπής έκδοση Fldigi καθυστέρηση εκπομπής για NN.n δευτ. λήψη δεδομένων καιρού για το σταθμό λήψη δεδομένων καιρούΧρώμ.πιθανού DupΣυμπεριφορά AFCΡύθμιση AFCΕύρος AFC (Hz)Ταχύτητα AFCΤαχύτητα εντοπισμού AFCΑπόρριψηΕνέργειαΠροσθήκηΠροσθ. διεύθυνσης στο πεδίο σημειώσεωνΔιεύθυνσηΡύθμισηΡύθμιση συχνότητας κέρσοραΡύθμιση του εύρους ζώνης του DSPΗλικίαΈνταση ειδοποίησηςΌλαΌλες οι καταχωρήσειςΌλες οι ρυθμίσεις που εμφανίζονται μπορούν να αλλάξουν αργότερα από το μενού ΡυθμίσεωνΝα επιτρέπονται λάθηΕπιτρ./απαγόρ.αλλαγώνΕναλλακτικό χρώμα χαρακτήρων στον πίνακα ΛήψηςΠάντα LSBΠάντα USBΕμφάνιση συχνοτήτων ήχου πάνταΝα εκκινούν πάντα τα νέα modems σε αυτές τις συχνότητεςΠλάτος σήματος QSK στο δεξί κανάλιΚεραία:Εμφάνιση ετικέτας του κάθε καναλιούΠροσάρτηση στο κείμενο RX:Προσάρτηση στο κείμενο TX:ΕφαρμογήΤα πλήκτρα με τα βέλη ελέγχουν την εισαγωγή συχνότηταςΉχοςΠληροφ.συσκευής ήχουΠληροφορίες της συσκευής ήχου είναι διαθέσιμες μόνο για το backend του PortAudioΣυσκευή ήχου που μοιράζεται από τις ειδοποιήσεις ήχου και την παρκολούθηση λήψηςΑρχείο ήχουΣυχνότητα ήχουΣυσκευή εισόδου ήχουΣυχνότητες ήχου ή RF στην κλίμακα του καταρράκτηΣυσκευή εξόδου ήχουΤο ιστορικό ροής ήχου αποκωδικοποιείται στο επιλεγμένο σήμαΑυτόματη εγγραφήΑυτόμ.συμπλήρ.Χώρας και ΑζιμουθίουΑυτόματος έλεγχος συχνότηταςΑυτόματη παρακολ.ταχύτητας λήψηςΑυτόματο spot χαρακρηριστικού από το κείμενο ΛήψηςΑυτόματη έναρξη εγγραφής αρχείου δεδομένων csv με την αναπαραγωγή wavΞεκινάει αυτόματα η σύνδεση με το psk reporterΠίσωΧρώμα φόντου για την Ομάδα 1 των πλήκτρων FΧρώμα φόντου για την Ομάδα 2 των πλήκτρων FΧρώμα φόντου για την Ομάδα 3 των πλήκτρων FΜπάνταΗ μπάντα πρέπει να είναι ίδιαΕύρος ζώνηςΟδηγός για αρχάριουςΣυμπεριφορά του s/n imdΧρώμα φοντ.Εντοπισ.Ερώτηση για αποθήκευση καταχώρησης logΠληροφορίες έκδοσηςΚουμπίΎψος κουμπιούΧώρεςCALLSIGN πάντα σε πεζάΕντολή CAT για PTTΗ χρήση της CPU αυξάνεται με αύξηση του ύψους του καταρράκτηΖώνη CQΣήμα CW QSK στο δεξί κανάλιΤο CW είναι διαμ. LSBΧειρισμός CW μέσω εντολών CAT. Διατίθεται για πομποδέκτες που υποστηρίζουν την λειτουργία αυτή. Για χρήση ελέγχου χειρισμού CW μέσω RigCAT ή flrig δεν απαιτείται ξεχωριστή σειριακή θύρα. Απενεργοποιήστε το CAT PTT εάν ο πομποδέκτης το εκλαμβάνει ως εντολή keydown (π.χ. TS480). Προτείνεται να ρυθμίσετε τον πομποδέκτη σε semi ή full break-in. Εισάγετε τη σωστή διεύθυνση CIV για τους πομποδέκτες Icom.Κατώφλι CWIΡυθμίσεις CabrilloΒαθμονόμησηΑναζήτηση CallΜπορεί να χρησιμοποιηθεί αντί για ή σε συνδιασμό με άλλους τρόπους PTTΑκύρωσηΕγγραφήΣυσκευές εγγραφής και αναπαραγωγήςΣυσκευή εγγραφήςΚαταγραφή κειμένου rx σε εξωτερικό αρχείοΚαταγραφή σημάτων πάνω από αυτό το όριοΚαταγραφή σημάτων σε αυτό το εύρος συχνοτήτωνΗ συσκευή Εγγραφής/Αναπαραγωγής υποστηρίζει αμφίδρομη λειτουργίαΕγγραφή:Συχνότητα φέρουσας (Hz)ΚελσίουΕπικέντρωση προβολής στο σήμαΚεντρική συχν.Κεντρ.ΓραμμήΕπικέντ. στο σήμα αναφοράςΕπικέντ. στο Άγνωστο σήμαΑλλαγή αριθμού καναλιών στον περιηγητή σημάτωνΑλλάξτε ΜΟΝΟ για πειραματισμόΑλλαγή όψης και αίσθησης του προγράμματοςΑλλαγή χρώματοςΑλλ.φακέλου..Αλλαγή θέσεων των χαμηλών προς υψηλών καναλιώνΑλλαγή στο αρχείο MacroΑλλαγή κλίμακας καταρράκτηΟι αλλαγές θα εφαρμοστούν στην επόμενη εκτέλεση του προγράμματοςΕτικέτα καναλιούΑριθ.καναλιούΚανάλια, το πρώτο κανάλι ξεκινάει από το κατώτερο όριο του καταρράκτηΧαρακτ./γραμμή:ΈλεγχοςΕπιλογή ΌλωνΈλεγχος για διπλότυπαΈλεγχος για ενημερώσειςΈλεγχος για ενημερώσεις κατά την εκκίνηση του προγράμματοςΈλεγχος για ενημερώσεις...Επιλέξτε εάν ο Π/Δ χρησιμοποιεί LSB για CWΕπιλέξτε εάν ο Π/Δ χρησιμοποιεί USB για RTTYΕπιλέξτε το ώστε να ειδοποιείστε όταν ένα σήμα RSID ληφθεί χωρίς να αλλάξει η συχνότητα και το modemΕπιλέξτε για μείωση του φόρτου της CPU σε PSK και RTTY.Έλεγχος για ενημερώσεις...Επιλέξτε φάκελο αποθήκευσης των αρχείων KMLΠόλη δουλεμένου σταθμούΚαθαρισμός των δεδομ.KML τώρα!Καθαρισμός κατά την εκκίνησηΚαθαρισμ.Καθαρ.όλωνΚαθαρισμός του κειμένου καναλιού μετά από # δευτερόλεπτα αδράνειαΚαθαρισμός λίστας;Αυτόματη συμπλήρωση του πεδίου RST in με 599/59 κατά την εκκαθάρισηΑυτόματη συμπλήρωση του πεδίου RST out με 599/59 κατά την εκκαθάρισηΚαθαρισμός των πεδίων στο log μετά την αποθήκευση της επαφήςΚαθαρισμός πεδίων log- νέο CALLΚαθαρισμός πεδίων log;Καθαρισμός κατά την αποθήκευσηΚαθαρ.κειμένουΚλείσιμοΚλείσιμο λίσταςΣυρρίκνωση ΜενούΧρώμαΧρώματα και κέρσορεςΧρώματα-ΓραμματοσειρέςΧρώματα-Γραμματοσειρές/FreqDisp - MetersΧρώματα-Γραμματοσειρές/Function keysΧρώματα-Γραμματοσειρές/Logging controlsΧρώματα-Γραμματοσειρές/Rx-TxΧρώματα-Γραμματοσειρές/Επίπεδα σήματοςΧρώματα-Γραμματοσειρές/ΚαρτέλεςΗ εντολή δεν βρέθηκεΕπιλογές γραμμής εντολώνΛείπει ':' από την εντολή.Δημιουργία ονόματος αρχείου από υπολογιστήΣυνθήκεςΡυθμίσειςScript ρυθμίσεωνΡύθμισηΕπιβεβ.Επιβεβαίωση εξόδουΕπιβεβαίωση ΕΠΑΝΑΦΟΡΑΣΕπιβεβαίωση εξόδουΕπιβεβαίωση εξόδου;ΣύνδεσηΣύνδεση / Αποσύνδεση από το WinKeyerΣύνδεση με serverΣυνδεδεμένοΑνταλλαγές Contest / σειριακός αριθμ.Διαγωνισμός:Contests/ΓενικάΉπειροςΣυνεχόμενη κύλισηΧαρακτήρες ελέγχου στους πίνακες Λήψης/ΕκπομπήςΜετατροπή callsign σε ΚΕΦΑΛΑΙΑΜετατροπέαςΑντιγραφήΔιορθώσειςΔεν ήταν δυνατή η εύρεση του αρχείου report LoTW. Λήψη από τη σελίδα LoTW ARRL μετά τη σύνδεση στο: https://lotw.arrl.org/lotwuser/default Αποθηκεύστε το αρχείο αναφοράς στο φάκελο fldigi LOTW, ονομάζοντας το αρχείο ' lotwreport. adi 'Αδυναμία δημιουργίας φακέλου Δεν ήταν δυνατό το άνοιγμα της διεύθυνσης URL: %s Δεν ήταν δυνατή η εκτέλεση ενός προγράμματος περιήγησης Web: %s Άνοιγμα αυτής της URL με μη αυτόματο τρόπο: %sΑδυναμία έναρξης flmsgΧώραΧώρα δουλεμένου σταθμούΔημιουργεί ένα τετραγωνικό σήμα 1000 Hz στο δεξί κανάλιΔημιουργία αναφοράς cabrilloΔημιουργία νέου αρχείου logbookΔημιουργία sunspotsΠροσαρμοσμένο...ΑποκοπήΤο DTR είναι η γραμμή σήματος PTTΤο DTR είναι η εντολή PTTΟ χειρισμός μέσω DTR/RTS μπορεί να αντιστοιχιστεί στο flrig, να μοιράζεται την σειριακή θύρα του RigCat, να μοιράζεται την ξεχωριστή θύρα PTT ή να αντιστοιχιστεί σε διαφορετική σειριακή θύρα. Δεν απαιτούνται ρυθμίσεις ταχύτητας, stop bits κ.λπ.Γραμμή Σημάτων DTR/RTS FSKΛόγος παύλας και τελείαςΠαύλα/ΤελείαΑποθετήριο αρχείων δεδομένωνΠηγές αρχείων δεδομένωνΕνημέρωση αρχείων δεδομένωνΑρχεία δεδομένων...Πηγή δεδομένωνΣυγχώνευση βάσης δεδομένων σε εξέλιξηΗμερομηνίαΗμερομηνία λήξης QSOΗμερομηνία έναρξης QSOΗμερ./Ώρα ON == OFFΑποκωδ. τόνων DTMFΑποκωδικοποίηση ληφθέντων τόνων DTMFΕπαναφ.RST in 599/59 από προεπιλογήRST out 599/59 από προεπιλογήΠροεπ.ρυθμίσειςΠροεπιλεγμένη συχνότητα ακρόασης / εκπομπήςΠροεπιλεγμένο μήνυμαΑρχικές ρυθμ.Καθυστέρηση ΝΝ msec μετά από εκτέλεση αλλαγής modeΚαθυστέρηση ΝΝ msec πριν από την αποδέσμευση του PTTΚαθυστέρηση ΝΝ msec πριν από την έναρξη του ήχουΔιαγραφήΔιαγραφή καταχώρησης;Θα διαγραφούν τα τοπικά αρχεία δεδομένων εάν επιλεγεί.Διαγραφή τρέχουσας εγγραφήςΑποεπιλογήΕπίπεδο ανίχν.σήματοςΑνώτατο κατώφλι ανιχνευτήΚατώτατο κατώφλι ανιχνευτήΗ συσκευή υποστηρίζει αμφίδρομη λειτουργίαΣυσκευή:Διαφορά μεταξύ συχνότητας Rx & Tx (rig offset)Χρώμα ψηφίουΨηφίαΔιαδρομή φακέλου δεν βρέθηκεΦάκελος...Απενεργ. PTT μέσω CATΑπενεργ. PTTΑπενεργοποίηση διαλόγου ειδοποίησηςΑπενεργ.όλωνΑπενεργ. flrig CW PTTΑπενεργ.αλλαγή συχν.Απενεργοπoiεί περαιτέρω ανίχνευση όταν γίνει λήψη ενός RSIDΑπενεργοποιήστε σε αργές CPU ή όταν ο περιηγητής σημάτων δεν χρησιμ.Απενεργοποίηση του spotting όταν δεν είναι ορατός ο περιηγητής σημάτωνΑπενεργοποίηση ανίχνευσηςΠροβολή Λήψης ως κυλιόμενο κείμενοΠροβολή Λήψης σε ανεστραμμένη εικόναΕμφάνιση ονόματος αρχείου logbook κατά την εκκίνησηΠροβολή αρχείου macro κατά την εκκίνησηΕμφάνιση μηνύματος παράδοσης εάν ενεργοποιηθείΧωρίς αυτόματη μετάβαση στην συχνότητα λήψης RsIDΝα μην εμφανίζεται το παράθυρο διαλόγου προειδοποίησης RsIDΜη χρήση βάσης δεδομένων διακριτικών κλήσεωνΣταθερό παλμογράφημαΧωρίς αποθήκευσηΣέρνοντας την κλίμακα καταρράκτη αλλάζει η συχνότηταΟ οδηγός απαιτεί τα stop bits να είναι ΜΗΔΕΝ!Χρώμα DupΈλεγχος διπλότυπου CALL συνΔιπλότυπαΕνεργοπ.Ενεργοποίηση -Ενεργοποίηση Απενεργοποίηση εικονιδίων στα μενούΕνεργοποίηση / Απενεργοποίηση βοηθητικού κειμένουΕνεργοποίηση ARQΕνεργοποίηση λειτουργίας CWΧρήση φίλτρου DSP πριν τον αποκωδικοποιητήΕνεργοποίηση σήματος γραμμής DTR, η προεπιλογή είναι RTSΕνεργοποίηση ροής δεδομένωνΕνεργοποίηση FSK σε σειριακή θύραΕνεργοποίηση KISSΕνεργοποίηση FEC συμβατό με MultiPSKΕνεργ.όλωνΕνεργ.επιλογής για την εμφάνιση του αντίστοιχου στοιχείου ελέγχουΕνεργοποίηση συρσίματος της κλίμακας καταρράκτη με τον κέρσοραΕνεργοποιήστε για αυτόματη συμπλήρωση πεδίου log με μονό κλικ στον πίνακα ΛήψηςΕνεργοποιήστε για πολύ ασθενή σήματαΕνεργοποιήστε εάν ο υπολογιστής σας δεν αποκωδικοποιεί σωστάΕνεργοποιήστε τις επιθυμητές επιλογές για διατήρηση ρυθμίσεων ανά mode.Ενεργοποίηση αυτής της καταχώρησης κατά την εκκίνηση του fldigiΕνεργοποιήστε για τονισμένους χαρακτήρες Latin-1Ενεργοποιήστε για εκπομπή χαρακτήρων UTF-8Ενεργοποιήστε για χαρακτήρες UTF-8Ενεργοπ.για αποστολή τόνων έναρξης/τέλουςΕνεργοποιήστε για τα έχετε τον πίνακα Εκπομπής επάνω από τον πίνακα ΛήψηςΕνεργοποιήστε για επιλογή εύρους ημερομηνίαςΕνεργοποιημ.Εισάγετε πλήρη διαδρομή και αρχείο του εξωτερικού προγράμματοςΕισάγετε πλήρη διαδρομή και αρχείο του flampΕισάγετε πλήρη διαδρομή και αρχείο του fllogΕισάγετε πλήρη διαδρομή και αρχείο του flmsgΕισάγετε πλήρη διαδρομή και αρχείο του flnetΕισάγετε πλήρη διαδρομή και αρχείο του flrigΕισάγετε πλήρη διαδρομή και αρχείο του tqslΕισάγετε πλήρη διαδρομή αρχείου για το cty.datΕισαγάγετε το κλειδί API για την συνεδρία σας στο CloudlogΕισάγετε τη διεύθυνση URL του Cloudlog API σαςΕισαγωγή χρονικού διαστήματος σε λεπτάΕισάγετε τη HEX διεύθυνση CIV του πομποδέκτηΖυγέςΖυγές γραμ.Ζυγές γραμμέςΗμερολόγιο συμβάντωνΕκτελέσιμο αρχείο για εισαγωγήΕκτέλεσηΕκτέλεση εντολών σε αρχεία KMLΕκτέλεση του αρχείου script: %sΈξοδοςΥπενθυμίσεις εξόδουΕξαγωγήΡυθμίσεις εξαγωγήςΕξαγωγή εγγραφών του logbook για ανέβασμα στο LoTWΕξαγωγή εγγραφών για ανέβασμα στο LoTWΕξαγωγή σε αρχείο ADIFΕξαγωγή σε αρχείο CSVΕξαγωγή σε αρχείο σταθερών πεδίωνΕξαγωγή...Αρχεία FLMSG...Ρυθμός δειγματοληψίας FMTΑνεξάρτητη σειριακή θύρα FSKΦάκελος προορισμού εικόνων FaxΜπορείτε να παραλείψετε οποιοδήποτε βήμα του βοηθούΕίσ/Έξ μόνο σε αρχείοΔεν βρέθηκε αρχείοΌνομα διαδρομής αρχείου:Σφάλμα ανάγνωσης αρχείουΑρχείο:ΑρχείαΣυμπλήρωση Χώρας / Αζιμουθίου χρησιμοποιώντας πληροφορίες από το αρχείο cty.datΦίλτροΕύρος ζώνης φίλτρουΦιλτράρισμαΕύρεση χώρας:Εύρεση επόμενουΕύρεση prefix:Εύρεση προγούμενουΕύρεση: ΤέλοςΠρώτα επιλέξτε συσκευή για τις ηχητικές ειδοποιήσειςΣταθερόΣταθερά διαστήματαΦάκελος ρυθμ.Fldigi...Ρύθμιση FldigiΒοηθός ρύθμισης FldigiΑρχείο μακροεντολών Fldigi *.{mdf}Αρχείο xml ορισμού Π/Δ Fldigi *.xmlΙστότοπος Fldigi...Ελεύθερο παλμογράφημαΦάκελοιΓραμματ.Χρώμα γραμματοσειράςΓραμμ...Χρώμ./Γραμμ.Γραμματοσειρά:RST out 599/59 από προεπιλογήΜετατροπή του πεδίου callsign σε ΚΕΦΑΛΑΙΑΟρισμός της απόστασης καναλιών σε βήματα των 100 HzΟρισμός υποχρεωτικά Ημερ./Ώρα ON == Ημερ./Ώρα OFFΣυχνότηταΔιόρθωση συχνότηταςΣυχνότητα σε MHzΚλίμακα συχνοτήτωνΠλήρεςΠλήρης αναφοράΓενικάΔημιουργίαΔημιουργεί ένα τετραγωνικό σήμα 1000 Hz στο δεξί κανάλιΔημιουργία σήμα τετραγωνικού κύματος στο δεξί κανάλιΟμάδα 1Ομάδα 2Ομάδα 3Χρονικό όριο ανάγνωσης HamlibΎψος της μπάρας macroΠαράμετροι λήψης HellΠαράμετροι εκπομπής HellHEX διεύθ. CIVΑπόκρυψηΑπόκρυψη παραθύρου μετά από (s):Ανώτατο όριο συχνότητας σε HzIFKP εικόνα RawΖώνη ITUΑγνόηση διπλότυπωνΧρόνος αδράνειαςΊντσες υδραρ.Hg.Να συμπεριλαμβάνεται η συχνότητα εκπομπήςΗμερομηνία τέλους της εξαγωγήςΑρχική κατάσταση του DTRΑρχική κατάσταση του RTSΑρχική τάση στο DTRΑρχική τάση στο RTSΑρχικοποίηση των QSO logging πεδίωνΕπίπεδο σήματος εισόδουΕισαγωγή σημαδιού στο κείμενο Λήψης πρίν την αλλαγή συχνότητας και modemΕισαγωγή προκαθορ.κειμένουΕισαγωγή αρχείου...Προσθήκη αρχικών μηδενικών στον εκπεμπόμενο σειριακό αριθμόΕισαγωγή σημαδιούΕισαγωγή ειδικού κειμένου στον πίνακα Λήψης όταν γίνεται κλικ στον καταρράκτηΕισαγωγή κειμένουΕισαγωγή κειμένου με μονό αριστερό κλικΕνδιαφέρουσες σημειώσειςΕνεργοποίηση KML server (On / Off)Καθυστέρηση μεταφ.Αφήστε το κενό ή ανατρέξτε στο http://www.pulseaudio.org/wiki/ServerStringsΘα περιέχουν ήχο του modem και τα δύο κανάλιαΑριστερό κλικ για καθαρισμό κειμένου Δεξί κλικ για επαναφορά συχνοτήτωνΑριστερό κλικ για επιλογή χρώματος διπλότυπωνΑριστερό κλικ για επιλογή χρώματος πιθανών διπλότυπωνΑριστερό κλικ για εναλλαγή γραμμής κατάστασηςΑριστερό κλικ για εναλλαγή του VuMeterΑριστερό κλικ: αλλαγή mode Δεξί κλικ: ρύθμισηΑριστερό ή δεξί κλικ αναπαράγει πάντα το ιστορικό ήχουΠεριορισμός κίνησης AFC στο εύρος αυτόΓραμμή: %d Σφάλμα:%d %s (%s)Αναζήτηση για σήματα μέσα στο εύρος αυτόΛήψη αρχείου LoTWΦόρτωσηΦόρτωση καινούριας παλέταςΦόρτωση αρχείου εικόναςΦόρτ.τελευτ.αρχείου macro κατά την εκκίν.Φορτώστε ή σύρετε ένα αρχείο εικόνας Υποστηριζόμενοι τύποι: PNG, JPEG, BMPΦόρτ...ΕντοπισμόςΕντοπισμός binaryΕντοπισμός αρχείου cty.datΕντοπισμός εκτελέσιμουΕντοπισμός εκτελέσιμου flampΕντοπισμός εκτελέσιμου fllogΕντοπ.flmsgΕντοπισμός εκτελέσιμου flmsgΕντοπισμός εκτελέσιμου flnetΕντοπισμός εκτελέσιμου flrigΕντοπισμός εκτελέσιμου program #1Εντοπισμός εκτελέσιμου program #2Εντοπισμός εκτελέσιμου program #3Εντοπισμός εκτελέσιμου tqslΤοποθεσίαΚλείδωμαΚλείδωμα συχνότητας εκπομπήςΚαταγραφή όλου του κειμένου Λήψης/ΕκπομπήςΣύνδεση στο pskrep όταν ανοίγει το fldigiΌνομα χρήστη για τα QRZ / Hamcall / HamQTHΧρήστης LoTWΚατώτατο όριο συχνότητας σε HzΚατώτατοΚατώτατο όριοΧαμηλότερη συχνότητα στο κάτω μέροςανεστραμμένα MARK/SPACEΕικόνα MFSKΑρχείο εικόνας MFSKMYCALL πάντα σε πεζάMYCALL σε πεζάΕτικέτα κουμπιού macroΚείμενο MacroΕπεξεργαστής macro - Χειροκίνητος συντονισμόςΜόνο MarkΣημαδ.προηγ.συχν./modeΚυλιόμενο κείμενοΊσως απαιτεί αλλαγή μεγέθους των πινάκων Λήψης/ΕκπομπήςΈνωση αρχείων ADIFΈνωση...Χρώμα μετρ.Μίλια / ΏραΛιγότερα ρυθμιστικάΕλάχιστος χρόνος μεταξύ γεγονότωνΔιάφοραΔιάφορα/Αυτόματη ΕκκίνησηΔιάφορα/CPUΔιάφορα/DTMFΔιάφορα/KMLΔιάφορα/NBEMS interfaceΔιάφορα/PSK reporterΔιάφορα/PSMΔιάφορα/Καταγραφή κειμένουΔιάφορα/Αποθήκευση ΠαραμέτρωνΔιάφορα/Sweet SpotΔιάφορα/TCP-IP sessionsΛείπει η εντολή %s μετά τη γραμμή%dΤο Mode πρέπει να είναι ίδιοΣήμα του modem σε αριστερό και δεξί κανάλιModem/CW/Χειρισμός μέσω CATModem/CW/Χειρισμός μέσω CATModem/CW/Χειρισμός μέσω DTR-RTSModem/CW/ΓενικάModem/CW/Χρονισμός και QSKΠαρακολούθηση σήματος εκπομπήςΕνεργή ροδέλα ποντικιού στα κουμπιά macroMsec's μεταξύ διαδοχικών εντολώνΠολυκάναλη επεξεργασία σημάτωνΠολυκάναλος ανιχνευτήςΟ σταθμός μουΔιεύθυνση IP του N3FJP ServerΘύρα του N3FJP ServerΑρχεία NBEMS...ΕΑΝ ΔΕΝ ΥΠΑΡΧΕΙ ΔΙΑΘΕΣΙΜΗ ΣΥΣΚΕΥΗ ΗΧΟΥ (ή για δοκιμές)ΔΕΝ ΕΧΕΙ ΟΡΙΣΤΕΙ CALLSIGNΝέοΝέα εγγραφή / Αποθήκευση εγγραφήςΕπόμενοΌχιΌχι γρηγορότερο από αυτόΔεν υπάρχουν εγγραφές στο αρχείο λήψης lotwΌχι πιο αργό από αυτόΚανέναΑποκοπήΣημείωση: Αυτές οι ρυθμίσεις είναι χρήσιμες αλλά όχι μοναδικές για τη χρήση του fldigi σε μια συσκευή με οθόνη αφής, όπως ένα tablet.ΣημειώσειςΕιδοποιήσειςΜόνο ενημέρωσηΠλήθος και θέση των μπαρών macroΑριθμός ψηφίων στον σειριακό αριθμόON - Συνεχή κύλιση κειμένου OFF - Καθαρισμός & επανεκκίνηση κειμένουON - εκκίνηση στην προκαθορισμένηt OFF - διατήρηση της τρέχουσας θέσης στον καταρράκτηON - χρήση του τελευταίου σετ macros OFF - χρήση του προκαθορισμένου σετΜονέςΜονές γραμ.Μονές γραμμέςΜία επάνω από Rx/TxΜία επάνω από καταρρ.Μία κάτω από καταρρ.&Mode λειτουργίαςΆνοιγμα ...Άνοιγμα λίσταςΆνοιγμα αρχείου logbookΆνοιγμα αρχείου macroΆνοιγμα φακέλου μηνυμάτωνΆνοιγμα μηνύματος με flmsgΆνοιγμα αρχείου Π/Δ xmlΆνοιγμα με flmsgΆνοιγμα...Ανοίγει φάκελο αρχείου NBEMS μετά την επιτυχή καταγραφήΜπάντα λειτουργίαςΧειριστήςΧαρακτηριστ. ΧειριστήCallsign χειριστή:Όνομα χειριστή:Callsign χειριστή (εάν είναι διαφορετικό από το callsign σταθμού)Χειριστής-Σταθμός QTH σταθμούΌνομα χειριστήΕπιλογέςΆλλαPSK κλπ.Οι καθυστερήσεις PTT ισχύουν για όλους τους τρόπους CAT/PTTΚαθυστέρηση PTT λήξης εκμπομπήςΗ εντολή CAT είναι το PTTΤόνος PTT στο δεξί κανάλι ήχουPTT με χρήση εντολής hamlibPTT μεσώ εντολής hamlibΜετρητής ισχύοςΗ παράμετρος δεν είναι έγκυρη.Ανάλυση όλου του κειμένου ΛήψηςΜερικόΚωδικόςΟ κωδικός για τα QRZ / Hamcall / HamQTHΑπαιτείται κωδικόςΕπικόλλησηΕπιλογή τιμής baud από τη λίσταΑναπαραγωγή ιστορικού όταν επιλέγεται ενεργό κανάλιΑναπαραγωγήΣυνεχής βρόχος αναπαραγωγής;Συσκευή αναπαραγωγήςΑναπαραγωγή:Πρώτα ορίστε το callsign σας.Αναδυόμενες πληροφορίες μετά από ένα πέρασμα 2 δευτερολέπτων στο callsignΘύραΗ θύρα είναι η δεύτερη συσκευή του SCU-17Θύρα:Τοποθετεί τις 4 μπάρες macro κάτω από τον πίνακα Εκπομπής Η προεπιλεγμένη ρύθμιση είναι επάνω από τον πίνακα ΛήψηςΚαθυστέρηση μετά την εντολή εγγραφής (msec)Κλίμακα ισχύοςΠιέστε ENTER για να συνεχίσει η αναζήτησηΑποτύπωση CW / RTTY / THROB / CONTESTIA με πεζάΠρογ.1:Προγ.2:Προγ.3:Ερώτ.για αποθήκευση ρυθμίσεωνΕρώτ.για αποθήκευση logΕρώτ.για αποθήκ.log κατά την έξοδοΕρώτ.για αποθήκ.αρχείου macroΕπαρχία δουλεμένου σταθμούΨευδο-FSK σήμα στο δεξί κανάλιΨευδο-FSK σήμα στο δεξί κανάλι ήχουΣχήμα παλμούΠλάτος παλμού (msec)Πλάτος σήμ. QSKΣυχνότητα QSKQSK στο δεξί κανάλιQSL ελήφθη την ημερομηνία αυτήQSL απεστάλη την ημερομηνία αυτήΗμερομηνία QSOΔεν πρέπει να γίνει QSO μέσα σε αυτό το χρονικά διάστημαΉσυχη λειτουργία [-q], χωρίς άνοιγμα διαλόγου tqslΛήψη RSIDRST πάντα 599/59Το RTS είναι η γραμμή σήματος PTTΤο RTS είναι η εντολή PTTΈλεγχος ροής RTS/CTSΕμφάνιση παλμογρ. RTTYΤο RTTY είναι διαμ. USBΚαταγραφή σημάτων ΛήψηςΔιόρθωση κάρτας ήχου (RX)Συχνότητα Π/ΔΕύροςΕύρος +/- wpmΕύρος 1...3Εύρος 1...4Ρύθμιση εύρους WPM Προκαθορισμένο = 20Ρύθμιση εύρους WPM Προκαθορισμένο = 25ΛόγοςΔιαγραφή καταχώρησης για "%s";ΛήψηΧρήση κατά την ΛήψηΕύρος φίλτρου ΛήψηςΣυγχρονιστής λήψηςΠρόσφατη δραστηριότητα για το gridΛήψη αρχείων flmsgΑναφορές λήψης...Εγγραφή ήχουΕγγραφή και των δύο καναλιώνΚαταγραφή δεδομένων για NN λεπτά μετά την αυτόματη εκκίνησηΕπαναφορτ.Ξαναφορτώνει το αρχείο cty.datΑφαίρεσηΑναφορά συχν.Π/Δ (ενεργ.μόνο εάν έχετε έλεγχο Π/Δ)ΑναφορέςΑπαιτείται για ορισμένους πομποδέκτες π.χ. TS-480Επαναφ.Επαναφορά όλων των επιλογών στις αρχικές τιμές; Η επαναφορά θα πραγματοποιηθεί στην επόμενη εκτέλεση Τα αρχεία: fldigi_def.xml και fldigi.prefs θα διαγραφούν! Επαναφορά ρυθμίσεων UART στο ΚλείσιμοΕπαναφέρει τον αρχικό φάκελο του cty.datΕπαν.προεπιλογώνΕπαναφέρει τις ρυθμίσεις της σειριακής (COM) θύραςΑποτέλεσμαΔιατήρηση της συχνότητας κλειδώματος TX (Lk) όταν μεταβαίνει στην συχνότητα του RX RsIDΔιατήρηση κλειδώματος συχνότητας TXΑνάκτησηΑνάκτηση για χρήση ενεργού modemΕπιστροφή της διεύθυνση IP και του αριθμού θύρας στην προεπιλεγμένη τιμή.ΑναστροφήΡύθμιση αναστροφής (Rv)Αναστροφή Αριστερού/Δεξιού καναλιούΑναστροφή των MARK/SPACEΑναστροφή εικόναςΈλεγχος/επεξερ. του αρχείου adif προς αποστολή στο LoTWΈλεγχος του αρχείου lotw.adif πριν την αποστολή με το tqslΈλεγχος Π/ΔΈλεγχος ΠΔ/C-Media PTTΈλεγχος ΠΔ/CAT (rigcat)Έλεγχος ΠΔ/GPIOΈλεγχος ΠΔ/HamlibΈλεγχος ΠΔ/Hardware PTTΈλεγχος ΠΔ/flrigMode Π/ΔΟ πομποδέκτης απαιτεί έλεγχο ροής RTS/CTSΟ πομποδέκτης απαιτεί έλεγχο ροής Xon/XoffΟ Π/Δ χρησιμοποιεί έλεγχο ροής RTC/CTSΠ/Δ:Το RigCAT χρησιμοποιείται για τον έλεγχο του Π/ΔΉχος ειδοπ. RsID (wav)Εκτέλεση προγράμματοςΕκτέλεση προγράμματος:Πίνακες Λήψης/ΕκπομπήςAGC λήψηςΔιάλογος ήχου RXΎψος Λήψης σε pixelsΠαράμετροι λήψηςΚωδικοποίηση χαρακτήρων Rx/TxΣυμπεριφορά S/N και IMDΑποκωδικοπ. SOMΡυθμός δειγματοληψίαςΑποθήκευσηΑποθήκευση ...Αποθήκευση κατάστασης AFC ανά modeΑποθήκευση ρυθμίσεωνΑποθήκευση της κατάστασης αναστροφής ανά modeΑποθήκευση στάθμης Squelch ανά modeΑποθηκεύει όλο το κείμενο που λάβατε, έναν-έναν χαρακτήρα στο ακόλουθο αρχείο: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Αποθήκευση ως...Αποθήκευση αλλαγών Logbook;Αποθήκευση αλλαγών ρυθμίσεων;Αποθήκευση αλλαγών macros;Αποθήκευση καταχώρησης log;Αποθήκευση αρχείου logbookΑποθήκευση αρχείου macroΑποθήκευση κειμένου ωςΑποθήκευση αυτής της παλέταςΑποθήκευση στάθμης εκπομπής ανά modeΑποθήκ...Χρώμα κλίμ.ΠαλμογράφημαΚύλισηΑναζήτηση για αυτό το callsignΕύρος αναζήτησης (Hz)Δευτερεύον κείμενοΔευτερόλεπταΕπιλογήΕπιλ.όλωνΕπιλέξτε Πεδία για ΕξαγωγήΕπιλογή Εγγραφών για ΕξαγωγήΕπιλογή της κωδικοποίησης χαρακτήρων του Λαμβανόμενου και Εκπεμπόμενου κειμένουΕπιλογή ετικέταςΕπιλογή αρχείου ήχουΕπιλογή εύρους ζώνηςΕπιλογή φακέλου προορισμούΕπιλογή συσκευήςΕπιλέξτε πως θα συμπεριφέρεται η ροδέλα του ποντικιού στον καταρράκτηΕπιλογή γραμμήςΕπιλογή modes για πρόσβαση στο μενούΕπιλογή αριθμού τόνωνΕπιλογή αριθμού pinΕπιλογή γραμματοσειρά κλίμακας καταρράκτηΑποστολήΑποστολή του callsign σε CW στο τέλος κάθε εκπομπήςΑποστολή του QSO στο LoTW όταν γίνει loggedΑποστολή χαρακτήρα δοκιμήςΑποστολή συνεχούς ροής χαρακτήρων δοκιμήςΑποστολή beacon κάθε...Συνεχής αποστολήΑποστολή εικόναςΑποστολή εικόνας...Αποστολή του lotw.adif με το tqslΑποστολή αναφοράς λήψης όταν γίνεται log ένα QSOΑποστολή αναφοράς λήψης μόνο όταν γίνεται log το QSOΑπεσταλμένοι χαρακτήρες στους πίνακες Εκπομπής/ΛήψηςΣειριακή θύραΣειριακή θύραΟρισμός επιπέδου για καλή προβολήΟρισμός του αριθμού χαρακτήρων ανά σειράΚοινή χρήση θύρας RIGCATΚοινή χρήση ξεχωριστής θύρας PTTΚοινή χρήση θύρας RIGIOΜοιράζεται τη σειριακή θύρα RIGIO ή χρησιμοποιείΣύντομη περιγραφή κεραίαςΕμφάνισηΕμφάνιση χρονομέτρου ΕκπομπήςΠροβολή παραθύρου ειδοποίησης:Εμφ.όλων των modeΕμφάνιση ίχνους εύρους ζώνης στον καταρράκτηΕμφ.καναλιώνΕμφάνιση κέρσορα με γραμμές εύρους ζώνηςΕμφάνιση κέρσορα με κεντρική γραμμήΕμφάνιση μηνύματος παράδοσηςΕμφ.λιγότερων modeΕμφ.χαρακτήρων ελέγχου macroΠροβολή επεξεργασίας macroΕμφάνιση μεγαλύτερου ή μικρότερου καταρράκτηΕμφάνιση εικονιδίων μενούΕμφάνιση κωδικού ως απλό κείμενοΕμφ.βοηθ.κειμένουΝα φαίνεται το εκπεμπόμενο σήμα στον καταρράκτηΤερματισμός του flrig με το fldigiΠεριηγητής σημάτωνΕπίπεδο σήματοςΕπίπεδο σήματος (dB)Ένδειξη στάθμης σήματοςΕπίπεδα σήματοςΠεριηγητής σημάτωνΕύρος σήματος (dB)Αναζήτ.σήματοςΠαρακολουθηση σήματοςΜονή μπάρα macro κάτω από τον logging πίνακα μεταβλητό ύψοςΣυλλογή κειμένου με μονό κλικΜέγεθος:Χαρακτήρες που παραλείφθηκαν στον πίνακα Εκπομπής (Tx on/off στο CW)Αργός επεξεργαστής (μικρότερος από 700MHz)Αναστροφή αριστερού-δεξιού καναλιούΟρισμένες αλλαγές που έγιναν από στο script απαιτούν επανεκκίνηση του προγράμματος πριν να γίνουν ενεργές.Ταξινόμηση κατά Ημερ/Ώρα OFFΗ ταξινόμηση κατά Ημερ/Ώρα OFF - επηρεάζει όλες τις αναφορές ADIF/CabrilloΔιασύνδεση κάρτας ήχουΉχος:Κάρτα ΉχουΚάρτα Ήχου/ΕιδοποιήσειςΚάρτα Ήχου/ΣυσκευέςΚάρτα Ήχου/Δεξί κανάλιΚάρτα Ήχου/ΡυθμίσειςΚάρτα Ήχου/Επίπεδο σήματοςΚάρτα Ήχου/Εγγραφή αρχείου WavΜόνο SpaceΕιδ.χαρακτ.Αναλυτής φάσματος / Αλληλεπίδραση καταρράκτηΑναλυτής φάσματοςΤαχύτητα (WPM):Δοκιμή ταχύτηταςΑπενεργ.SpottingΕπίπεδο SquelchΡύθμιση επιπέδου/ενεργοποίησης SquelchΈναρξηΗμερομ.ΑρχήςΑρχικός αριθ.Ημερομηνία αρχής της εξαγωγήςΈναρξη flampΈναρξη fllogΈναρξη flnetΈναρξη flrigΚαθυστέρηση PTT έναρξης εκμπομπήςΕκκίνηση prog1Εκκίνηση prog2Εκκίνηση prog3Αρχικός αριθμόςΗ πολιτεία πρέπει να είναι ίδιαCall σταθμούCallsign σταθμού:LOC σταθμούLocator σταθμούLocator σταθμού:QTH σταθμούCallsign σταθμούGrid square σταθμούΚατάστασηΗμερομ.τέλουςΑποθηκεύση των εικόνων σε αυτόν τον φάκελοΑποθήκευση mode και συχνότητας Δεξί κλικ για λίσταΕισαγωγή κωδικού πρόσβασης σε κάθε μεταφόρτωσηΥποβολή του αρχείου adif στο LoTWΗ δημιουργία ηλιακών κηλίδων βρίσκεται σε εξέλιξη!Μετάβαση σε ARQ I/OΣυγχρ. με εγγραφή δεδομένωνΧρώμ.συστήμ.ΣύστημαTHOR εικόνα RawΙσχύς εκμπομπήςΌριο χρόνου Εκπομπής (λεπτά)Δημιουργία σημάτων ΕκπομπήςΑντισταθμ. συχνότητας TXΔιόρθωση κάρτας ήχου (TX)Πηγές δεδομένων σε πίνακαΔοκιμήΔοκιμή =>Έλεγχος API KeyΣήματα δοκιμώνΧαρακτ.δοκιμήςΧαρακτήρας δοκιμής για ρύθμιση QSKΕντολή δοκιμήςΔιάρκεια δοκιμής (60 δευτ.)Δοκιμαστικό αρχείο κειμένουΔοκιμή...Καταγραφή κειμένουΧρώματα κειμένουΕπισήμανση κειμένουΣειρά καταγρ. κειμένουΑρχείο κειμένου για εισαγωγήΚείμενο για αποστολή κατά τη διάρκεια ηρεμίας στην πληκτρολόγησηΤα περιεχόμενα του μηνύματος ειδοποίησης RsID και τα χαρακτηριστικά εμφάνισης, ρυθμίζονται στο μενού "Ρύθμιση/Ειδοποιήσεις".Το όνομα αρχείου εμφανίζεται στον πίνακα ΛήψηςΟ βοηθός θα σας οδηγήσει για τις βασικές ρυθμίσεις του fldigi:ΏραΧρόνος (δλ):Ώρα λήξης QSOΏρα έναρξης QSOΧρόνος που απαιτείται: Διαφορά ώρας πάνω απόΤέλος χρόνου (msec)ΧρονισμόςΧρονισμός/ΡυθμίσειςΣε ποιόν έχει γίνει σύνδεσηΕναλλαγήΕναλλαγή DTR για PTTΕναλλαγή RTS για PTTΔιάρκεια τόνου (δευτ.)ΤόνοιΈλεγχος πομποδέκτη, flrig/rigcat/hamlibΤαχύτητα μεταφοράς X1-κανονικήΕκπομπήΙσχύς εκπομπήςΧρήση κατά την ΕκπομπήΕκπομπή callsignΓραμματοσειρά εκπομπήςΡύθμιση στάθμης εκπομπήςΕκπομπή κειμένου σε πεζάΑποστολή τελείων (.) σε ηρεμίαΙσχύς εκπομπής που χρησιμοποιήθηκεΣήμα εκπομπήςΕκπομπή κειμένουΕκπομπή/ΛήψηΣτέλνει τελείες όταν δεν υπάρχει δραστηριότητα πληκτρολογίουΠεριθώριο συντονισμού (απόσταση συχνοτήτων τόνου)Σχέδιο των δύο 1Σχέδιο των δύο 10Σχέδιο των δύο 2Σχέδιο των δύο 3Σχέδιο των δύο 4Σχέδιο των δύο 5Σχέδιο των δύο 6Σχέδιο των δύο 7Σχέδιο των δύο 8Σχέδιο των δύο 9Παράμετροι εκπομπήςΕκπομπή πάνω από ΛήψηΕξασθενητής επιπέδου Εκπομπής (dB)Ισχύς εξόδου που χρησιμοποιείται για καταχωρήσεις στο logΓλώσσα περιβ.χρήστη (UI)Σχέδιο UIΠεριβάλλον Χρήστη/Περιηγητής/ΚανάλιαΠεριβάλλον Χρήστη/Περιηγητής/ΧρώματαΠεριβάλλον Χρήστη/Περιηγητής/Επίπεδο εντοπισμούΠεριβάλλον Χρήστη/ΓενικάΠεριβάλλον Χρήστη/Κουμπιά MacroΠεριβάλλον Χρήστη/Κείμενο ΛήψηςΠεριβάλλον Χρήστη/TouchΠολιτεία ΗΠΑ δουλεμένου σταθμούΜονάδες απόστασης ΗΠΑ (QRB)Αδυναμία ανοίγματος αρχείου %sΑπενεργοποιήστε εάν δεν χρησιμοποιείτε ποτέ KMLΑπροσδιόριστο σφάλμαΑναίρεσηΜη υποστηριζόμενη μορφή ήχουΕνημέρ.Ενημέρωση των επιλεγμένων αρχεία τοπικών δεδομένων από περιεχόμενο αποθετηρίουΔεν υπάρχει διαθέσιμο site ενημερώσεωνΕνημέρωση τρέχουσας εγγραφήςΑνώτατοΑνώτατο όριοΑνώτατη στάθμη σήματος (dB)Χρήση φίλτρου DSP πριν τον αποκωδικοποιητήΧρήση DTRΧρήση χρονισμού FarnsworthΧρήση HamlibΧρήση διακομιστή Pulse AudioΧρήση RTSΧρήση RigCATΧρήση ξεχωριστής θύρας για χειρισμόΧρήση έγχρ.κουμπιώνΧρήση της ημερ./ώρας off για το logΧρήση DTR/RTS χειρισμού μέσω του flrigΧρήση αρχικών μηδενικώνΧρήση της παράλληλης θύρας για PTTΧρήση ξεχωριστής θύρας για PTTΜικρή γραμματ.Να χρησιμοποιούνται αυτά για τα WinKeyer και nanoCWΧρήση αυτής της τοποθεσίας σταθμού tqslΧρήση κλίμακας του wsjtxΧρησιμοποιείται ΜΟΝΟ για τη λειτουργία ανάλυσης συχνότηταςΌνομα χρήστηΕπιβεβ.Η έκδοση %s είναι διαθέσιμη στο Source ForgeΕμφάνισηΕμφ./Απόκρ.48 macrosΕμφ./Απόκρ.καναλιώνΟρατά modesΕπίσκεψη της σελίδας του HamcallΕπίσκεψη της σελίδας του QRZΕπίσκεψη της σελίδας του hamQTHΠΡΟΣΟΧΗ - αυτή η ενέργ.θα αντικαταστήσει ΟΛΕΣ τις ρυθμίσειςΕικόνες WEFAX...ΑναμονήΑναμονή NN δευτερόλεπτα για απόκριση LoTWΔιάστημα αναμονής (msec) πριν από την ανάγνωση της απάντησηςΚαταρράκτηςΚαταρράκτης / FFT / ΠαλμογράφημαΕπικέντρωση καταρράκτη στο άγνωστο σήμαΕπικέντρωση καταρράκτη στο σήμα αναφοράςΤαχύτητα κύλισης καταρράκτηΎψος καταρράκτη σε pixelsΚαταρράκτης/Κουμπιά & ΡυθμιστικάΚαταρράκτης/ΕμφάνισηΚαταρράκτης/Επεξεργασία FFTΚαταρράκτης/Χρήση ΠοντικιούΚαταρράκτης/ΦάσμαΕγγραφή αρχείου wavΗ εγγραφή αρχείου Wav - ΞΕΚΙΝΑΕΙ ΑΜΕΣΑΕγγραφή αρχείων Wav - ΣΥΓΧΡΟΝΙΣΜΟΣ με την εγγραφή δεδομένωνΡυθμός δείγματοληψιας εγγραφής wavΑποστολή εικόνας Weather FaxΑναζήτηση με Web BrowserΕνέργεια ροδέλαςΌταν δεν υπάρχει σήμαΦαρδύΘα συμβεί μετά από τόσα δευτερόλεπταΔιαχωριστικά λέξεωνΑναδίπλωση λέξεωνΑποθήκευση του τρέχοντος macro set κατά την έξοδοΚαθυστέρηση εγγραφής (msec)Έλεγχος ροής XON/XOFFΣειριακή θύρα Π/ΔΝαιΠιθανότατα τρέχετε μια έκδοση alpha Τρέχετε την τελευταία έκδοσηΘα πρέπει να έχετε το tqsl εγκατεστημένο και την τοποθεσία του καταχωρημένη για να ενημερώνεται το LoTW!Απαιτείται μια πληρωμένη συνδρομή Hamcall online για να έχετε πρόσβασηΑπαιτείται μια πληρωμένη συνδρομή QRZ online για να έχετε πρόσβασηΟ κωδικός πρόσβασης του tqslμετά απόπάντα προσάρτηση σε αρχείο(α)αυτόματο ανέβασμα δεδομένωνβοηθ.κείμενο του callsign στο λαμβαν.κείμενοχαρακτ. WPMεκκαθ.παλιών δεδομ.Φάκελος cty.datτρέχουσες καιρικές συνθήκεςΗ προεπιλεγμένη κλίμακα είναι audo "Vu Meter" ενεργοποιήστε για εξομοίωση της κλίμακας του wsjtxΧρήση της ημερ./ώρας on από προεπιλογήΕμφάνιση των λαμβανομένων χαρακτ.ελέγχου ως ascii stringΧρήστης eQSLΕνεργοποίηση της ροδέλας ποντικιού στα κουμπιά macroΉχος ειδοπ. flmsg (wav)Ήχος ειδοπ. λήξης χρόνου flmsg (wav)Το flrig είναι η προτιμώμενη μέθοδος ελέγχου πομποδέκτηΚλίμακα συχνότ. = Ν * το εύρος του modeΧιλιόμετρα / Ώρατο αριστερό κλικ στον καταρράκτη επανακεντράρει τον αναλυτή φάσματοςτο αριστερό κλικ μεταφέρει την συχν. στην κεντρική συχν. του αναλυτήλεπτάΌχιεμφάνιση των ^! συμβόλων εκτέλεσης στον πίνακα Λήψηςαναφοράνα αναφέρονται βαθμοί Κελσίουνα αναφέρονται βαθμοί Fahrenheitνα αναφέρονται ίντσες υδραργύρου (Hg)να αναφέρονται Χιλιόμετρα ανά ώρανα αναφέρονται Μίλια ανά ώρανα αναφέρονται millibarsαναφορέςΚλίμακα αναλυτή φάσματος συνδεδεμένη με το εύρος του modemδευτερόλεπταδευτερ.δευτερ. =>επιλογή γραμματοσειράς περιηγητήεπιλογή ανά ημ/νίαΑποστολή όταν γίνει logged (Κουμπί log, , )Τοποθεσία σταθμού tqslχρήσηχρήση τιμών του εύρους/ορίου καταρράκτητιμές αριστερά/κάτω από καταρράκτηεκπομπή τόνων έναρξης/τέλουςΝαιfldigi-4.2.05/po/it.po0000664000175000017500000107501314611714003011361 00000000000000# Italian translations for fldigi package. # Copyright (C) 2011 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Emanuele Repetto , 2020. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.01\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2024-04-23 06:14-0500\n" "PO-Revision-Date: 2011-12-03 13:04+0100\n" "Last-Translator: Emanuele Repetto \n" "Language-Team: Italian\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/main.cxx:1052 #, c-format msgid "%s log started on %s" msgstr "%s log iniziato il %s" #: src/main.cxx:1779 msgid "Bad modem id" msgstr "Modem id" #: src/main.cxx:1786 #, fuzzy msgid "Bad frequency" msgstr "Frequenza radio" #: src/main.cxx:1909 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licenza GPLv3+: GNU GPL versione 3 o successiva \n" "Questo e` un programma libero: siete liberi di modificarlo e " "ridistribuirlo.\n" "Questo programma non e` coperto da alcuna garanzia, salvo gli obblighi di " "legge.\n" #: src/main.cxx:2136 src/main.cxx:2178 src/main.cxx:2202 src/main.cxx:2216 #, fuzzy msgid "Could not make directory " msgstr "Impossibile creare la directory" #: src/debug/debug.cxx:88 msgid "Quiet" msgstr "Silenzioso" #: src/debug/debug.cxx:88 msgid "Error" msgstr "Errori" #: src/debug/debug.cxx:88 msgid "Warning" msgstr "Avvisi" #: src/debug/debug.cxx:88 msgid "Info" msgstr "Informazioni" #: src/debug/debug.cxx:88 msgid "Verbose" msgstr "Profondo" #: src/debug/debug.cxx:88 src/dialogs/confdialog.cxx:15244 msgid "Debug" msgstr "Debug" #: src/dialogs/fl_digi.cxx:202 msgid "Log all RX/TX text" msgstr "Salva tutto il testo RX/TX" #: src/dialogs/fl_digi.cxx:204 src/dialogs/fl_digi.cxx:7622 msgid "Op &Mode" msgstr "&Modo Op" #: src/dialogs/fl_digi.cxx:205 msgid "Show fewer modes" msgstr "Mostra meno modi" #: src/dialogs/fl_digi.cxx:206 msgid "Show all modes" msgstr "Mostra tutti i modi" #: src/dialogs/fl_digi.cxx:210 msgid "&View" msgstr "&Vedi" #: src/dialogs/fl_digi.cxx:211 #, fuzzy msgid "MFSK Image" msgstr "Immagine &MFSK" #: src/dialogs/fl_digi.cxx:212 msgid "THOR Raw Image" msgstr "THOR Immagine Grezza" #: src/dialogs/fl_digi.cxx:213 #, fuzzy msgid "IFKP Raw Image" msgstr "Immagine Grezza IFKP" #: src/dialogs/fl_digi.cxx:214 #, fuzzy msgid "Weather Fax Image TX" msgstr "Immagine Meteo Fax TX" #: src/dialogs/fl_digi.cxx:215 src/dialogs/confdialog.cxx:10746 #: src/logbook/lgbook.cxx:1293 msgid "Contest" msgstr "Contest" #: src/dialogs/fl_digi.cxx:216 msgid "C&ountries" msgstr "&Country" #: src/dialogs/fl_digi.cxx:217 msgid "&UI" msgstr "Aspetto" #: src/dialogs/fl_digi.cxx:218 msgid "Full" msgstr "Tutto" #: src/dialogs/fl_digi.cxx:219 msgid "Partial" msgstr "Parziale" #: src/dialogs/fl_digi.cxx:220 src/waterfall/waterfall.cxx:2595 #: src/dialogs/confdialog.cxx:9908 src/dialogs/confdialog.cxx:9997 #: src/dialogs/confdialog.cxx:19028 msgid "None" msgstr "Nessuno" #: src/dialogs/fl_digi.cxx:221 msgid "Docked scope" msgstr "Oscilloscopio ancorato" #: src/dialogs/fl_digi.cxx:222 msgid "Minimal controls" msgstr "Controlli minimali" #: src/dialogs/fl_digi.cxx:223 msgid "Show channels" msgstr "Mostra canali" #: src/dialogs/fl_digi.cxx:225 msgid "Connect to server" msgstr "Connetti al server" #: src/dialogs/fl_digi.cxx:1050 src/dialogs/fl_digi.cxx:1079 #: src/dialogs/fl_digi.cxx:1089 src/dialogs/fl_digi.cxx:5976 #: src/dialogs/fl_digi.cxx:6069 src/dialogs/fl_digi.cxx:6146 #: src/dialogs/fl_digi.cxx:7650 src/dialogs/fl_digi.cxx:7719 #: src/dialogs/fl_digi.cxx:7796 msgid "Custom..." msgstr "Altro..." #: src/dialogs/fl_digi.cxx:1147 src/dialogs/confdialog.cxx:369 #: src/dialogs/confdialog.cxx:10673 src/dialogs/confdialog.cxx:10739 #, fuzzy msgid "Colors-Fonts" msgstr "Colori-Caratteri" #: src/dialogs/fl_digi.cxx:1148 src/dialogs/confdialog.cxx:370 #: src/dialogs/confdialog.cxx:11067 #, fuzzy msgid "Contests" msgstr "Contest" #: src/dialogs/fl_digi.cxx:1149 src/dialogs/confdialog.cxx:371 #: src/dialogs/confdialog.cxx:11338 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:1150 src/dialogs/confdialog.cxx:372 #: src/dialogs/confdialog.cxx:11810 src/dialogs/confdialog.cxx:11896 #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14240 #, fuzzy msgid "Logging" msgstr "Log dei QSO" #: src/dialogs/fl_digi.cxx:1151 #, fuzzy msgid "Modem/CW" msgstr "Modem/CW" #: src/dialogs/fl_digi.cxx:1152 #, fuzzy msgid "Modem/TTY" msgstr "Modem/TTY" #: src/dialogs/fl_digi.cxx:1153 src/waterfall/waterfall.cxx:2597 #: src/dialogs/confdialog.cxx:373 msgid "Modem" msgstr "Modem" #: src/dialogs/fl_digi.cxx:1154 src/dialogs/confdialog.cxx:374 #: src/dialogs/confdialog.cxx:17169 msgid "Misc" msgstr "Misc" #: src/dialogs/fl_digi.cxx:1155 src/dialogs/confdialog.cxx:375 #: src/dialogs/confdialog.cxx:18303 src/dialogs/confdialog.cxx:18366 #, fuzzy msgid "Rig Control" msgstr "Controllo radio" #: src/dialogs/fl_digi.cxx:1156 src/dialogs/confdialog.cxx:376 #: src/dialogs/confdialog.cxx:18974 #, fuzzy msgid "Soundcard" msgstr "Scheda Audio" #: src/dialogs/fl_digi.cxx:1157 src/dialogs/confdialog.cxx:377 #: src/dialogs/confdialog.cxx:19497 msgid "UI" msgstr "Aspetto" #: src/dialogs/fl_digi.cxx:1158 src/dialogs/fl_digi.cxx:6238 #: src/dialogs/confdialog.cxx:378 src/dialogs/confdialog.cxx:13939 #: src/dialogs/confdialog.cxx:20045 msgid "Waterfall" msgstr "Waterfall" #: src/dialogs/fl_digi.cxx:1159 src/dialogs/confdialog.cxx:379 #: src/dialogs/confdialog.cxx:20245 msgid "Web" msgstr "Web" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4547 msgid "Save changed macros?" msgstr "Salvare le macro modificate?" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4134 #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 #: src/logbook/logsupport.cxx:1205 src/misc/configuration.cxx:726 #: src/dialogs/font_browser.cxx:173 src/logbook/lgbook.cxx:837 #: src/logbook/lgbook.cxx:1647 msgid "Cancel" msgstr "Annulla" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:6250 #: src/logbook/logsupport.cxx:330 src/logbook/logsupport.cxx:1204 #: src/dialogs/confdialog.cxx:13194 src/dialogs/confdialog.cxx:15191 #: src/dialogs/confdialog.cxx:20248 msgid "Save" msgstr "Salva" #: src/dialogs/fl_digi.cxx:1622 msgid "Don't save" msgstr "Non salvare" #: src/dialogs/fl_digi.cxx:1771 msgid "Switch to ARQ I/O" msgstr "Passa a ARQ I/O" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "No" msgstr "No" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "Yes" msgstr "Sí" #: src/dialogs/fl_digi.cxx:2630 msgid "Playback continuous loop?" msgstr "Riproduzione continua in loop" #: src/dialogs/fl_digi.cxx:2635 #, fuzzy msgid "Unsupported audio format" msgstr "Formato non supportato" #: src/dialogs/fl_digi.cxx:2642 msgid "Spotting disabled" msgstr "Spotting disabilitato" #: src/dialogs/fl_digi.cxx:2694 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Non ho potuto lanciare un browser web:\n" "%s\n" "\n" "Apri questo URL manualmente:\n" "%s" #: src/dialogs/fl_digi.cxx:2707 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Non posso aprire l'url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2790 msgid "Checking for updates..." msgstr "Controllo aggiornamenti in corso..." #: src/dialogs/fl_digi.cxx:2794 #, fuzzy msgid "Update site not available" msgstr "Sito di aggiornamento non disponibile" #: src/dialogs/fl_digi.cxx:2806 msgid "You are running the latest version" msgstr "Stai già usando la versione più recente" #: src/dialogs/fl_digi.cxx:2810 #, fuzzy msgid "You are probably running an alpha version " msgstr "Probabilmente stai utilizzando una versione alpha" #: src/dialogs/fl_digi.cxx:2811 msgid "" "\n" "Posted version: " msgstr "" #: src/dialogs/fl_digi.cxx:2816 #, fuzzy, c-format msgid "Version %s is available at Source Forge" msgstr "" "La versione %s è disponible su\n" "\n" "%s\n" "\n" "Cosa vuoi fare?" #: src/dialogs/fl_digi.cxx:2885 msgid "Sunspot creation underway!" msgstr "Creazione di macchie solari in corso!" #: src/dialogs/fl_digi.cxx:2892 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "Le informazioni sul device audio sono disponibili solo per il backend " "PortAudio" #: src/dialogs/fl_digi.cxx:2901 msgid "Capture device" msgstr "Periferica di cattura" #: src/dialogs/fl_digi.cxx:2902 msgid "Playback device" msgstr "Periferica di riproduzione" #: src/dialogs/fl_digi.cxx:2906 msgid "Capture and playback devices" msgstr "Periferiche di cattura e riproduzione" #: src/dialogs/fl_digi.cxx:2952 #, fuzzy, c-format msgid "%s: Do not exist, create?" msgstr "Non esiste, creare?" #: src/dialogs/fl_digi.cxx:4134 msgid "Clear log fields?" msgstr "Cancella i campi del log?" #: src/dialogs/fl_digi.cxx:4134 src/misc/configuration.cxx:726 #: src/logbook/lgbook.cxx:834 src/logbook/lgbook.cxx:1644 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 msgid "Confirm" msgstr "Conferma" #: src/dialogs/fl_digi.cxx:4539 #, fuzzy msgid "Save changed configuration?" msgstr "Salvare le modifiche alla configurazione prima di uscire?" #: src/dialogs/fl_digi.cxx:4555 src/dialogs/fl_digi.cxx:4580 #, fuzzy msgid "Save log entry?" msgstr "Salva il file di log" #: src/dialogs/fl_digi.cxx:4571 #, fuzzy msgid "Confirm Quit" msgstr "Conferma" #: src/dialogs/fl_digi.cxx:4593 #, fuzzy msgid "Confirm quit?" msgstr "Conferma" #: src/dialogs/fl_digi.cxx:5915 src/dialogs/fl_digi.cxx:7618 msgid "&File" msgstr "&File" #: src/dialogs/fl_digi.cxx:5917 msgid "Folders" msgstr "Cartelle" #: src/dialogs/fl_digi.cxx:5918 msgid "Fldigi config..." msgstr "Configurazione di Fldigi..." #: src/dialogs/fl_digi.cxx:5919 #, fuzzy msgid "FLMSG files..." msgstr "File NBEMS..." #: src/dialogs/fl_digi.cxx:5920 msgid "NBEMS files..." msgstr "File NBEMS..." #: src/dialogs/fl_digi.cxx:5921 #, fuzzy msgid "WEFAX images..." msgstr "Invia immagine..." #: src/dialogs/fl_digi.cxx:5922 #, fuzzy msgid "Data files..." msgstr "File data..." #: src/dialogs/fl_digi.cxx:5925 msgid "Macros" msgstr "Macro" #: src/dialogs/fl_digi.cxx:5926 msgid "Open ..." msgstr "Apri..." #: src/dialogs/fl_digi.cxx:5927 msgid "Save ..." msgstr "Salva..." #: src/dialogs/fl_digi.cxx:5930 #, fuzzy msgid "Config Scripts" msgstr "Conferma" #: src/dialogs/fl_digi.cxx:5931 msgid "Execute" msgstr "Esegui" #: src/dialogs/fl_digi.cxx:5932 #, fuzzy msgid "Generate" msgstr "Genera" #: src/dialogs/fl_digi.cxx:5935 msgid "Text Capture" msgstr "Cattura testo" #: src/dialogs/fl_digi.cxx:5939 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5940 msgid "RX capture" msgstr "Cattura RX" #: src/dialogs/fl_digi.cxx:5941 msgid "TX generate" msgstr "Genera TX" #: src/dialogs/fl_digi.cxx:5942 src/dialogs/confdialog.cxx:18737 msgid "Playback" msgstr "Riproduzione" #: src/dialogs/fl_digi.cxx:5945 src/dialogs/fl_digi.cxx:7619 msgid "Exit" msgstr "Esci" #: src/dialogs/fl_digi.cxx:6203 src/dialogs/fl_digi.cxx:7832 msgid "&Configure" msgstr "&Configura" #: src/dialogs/fl_digi.cxx:6205 src/dialogs/fl_digi.cxx:7833 #, fuzzy msgid "Config Dialog" msgstr "Configurazione" #: src/dialogs/fl_digi.cxx:6206 src/dialogs/fl_digi.cxx:7836 msgid "Save Config" msgstr "Salva Configurazione" #: src/dialogs/fl_digi.cxx:6207 src/dialogs/fl_digi.cxx:7835 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notifiche" #: src/dialogs/fl_digi.cxx:6208 src/dialogs/fl_digi.cxx:7834 #, fuzzy msgid "Test Signals" msgstr "Segnale Test" #: src/dialogs/fl_digi.cxx:6213 src/dialogs/fl_digi.cxx:7840 #, fuzzy msgid "Rx Audio Dialog" msgstr "Audio RX" #: src/dialogs/fl_digi.cxx:6215 msgid "View/Hide Channels" msgstr "Mostra/Nascondi Canali" #: src/dialogs/fl_digi.cxx:6216 msgid "Signal browser" msgstr "Navigatore segnali" #: src/dialogs/fl_digi.cxx:6218 #, fuzzy msgid "View/Hide 48 macros" msgstr "Mostra/Nascondi 48 Macro" #: src/dialogs/fl_digi.cxx:6220 msgid "DX Cluster" msgstr "DX CLuster" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/fl_digi.cxx:7843 msgid "Floating scope" msgstr "Oscilloscopio libero" #: src/dialogs/fl_digi.cxx:6223 src/dialogs/fl_digi.cxx:7842 msgid "Spectrum scope" msgstr "Spettroscopio" #: src/dialogs/fl_digi.cxx:6232 #, fuzzy msgid "Rig/Log Controls" msgstr "Controllo Radio/Log" #: src/dialogs/fl_digi.cxx:6245 msgid "&Logbook" msgstr "&Logbook" #: src/dialogs/fl_digi.cxx:6246 msgid "View" msgstr "&Vedi" #: src/dialogs/fl_digi.cxx:6248 #, fuzzy msgid "Files" msgstr "&File" #: src/dialogs/fl_digi.cxx:6249 src/dialogs/confdialog.cxx:17449 msgid "Open..." msgstr "Apri..." #: src/dialogs/fl_digi.cxx:6251 src/logbook/logsupport.cxx:1213 #: src/logbook/lgbook.cxx:1567 msgid "New" msgstr "Nuovo" #: src/dialogs/fl_digi.cxx:6254 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6255 msgid "Merge..." msgstr "Unisci..." #: src/dialogs/fl_digi.cxx:6256 msgid "Export..." msgstr "Esporta..." #: src/dialogs/fl_digi.cxx:6259 src/logbook/lgbook.cxx:831 msgid "LoTW" msgstr "LoTW" #: src/dialogs/fl_digi.cxx:6261 #, fuzzy msgid "Reports" msgstr "Rapporti" #: src/dialogs/fl_digi.cxx:6262 msgid "Text..." msgstr "Testo..." #: src/dialogs/fl_digi.cxx:6263 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6264 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6269 #, fuzzy msgid "Field Day Logging" msgstr "Field Day Log" #: src/dialogs/fl_digi.cxx:6274 src/dialogs/fl_digi.cxx:7852 msgid "&Help" msgstr "&Aiuto" #: src/dialogs/fl_digi.cxx:6277 msgid "Create sunspots" msgstr "Crea macchie solari" #: src/dialogs/fl_digi.cxx:6279 msgid "Beginners' Guide" msgstr "Guida per principianti" #: src/dialogs/fl_digi.cxx:6280 src/dialogs/fl_digi.cxx:7853 msgid "Online documentation..." msgstr "Documentazione on-line..." #: src/dialogs/fl_digi.cxx:6281 msgid "Fldigi web site..." msgstr "Sito web Fldigi..." #: src/dialogs/fl_digi.cxx:6282 msgid "Reception reports..." msgstr "Rapporti d'ascolto..." #: src/dialogs/fl_digi.cxx:6283 msgid "Command line options" msgstr "Opzioni da riga di comando" #: src/dialogs/fl_digi.cxx:6284 msgid "Audio device info" msgstr "Informazioni sulla scheda audio" #: src/dialogs/fl_digi.cxx:6285 msgid "Build info" msgstr "Informazioni build" #: src/dialogs/fl_digi.cxx:6286 src/dialogs/fl_digi.cxx:7854 msgid "Event log" msgstr "Log eventi" #: src/dialogs/fl_digi.cxx:6287 src/dialogs/fl_digi.cxx:7855 msgid "Check for updates..." msgstr "Verifica aggiornamenti..." #: src/dialogs/fl_digi.cxx:6288 src/dialogs/fl_digi.cxx:7856 msgid "&About" msgstr "Inform&azioni" #: src/dialogs/fl_digi.cxx:6539 msgid "waterfall-only mode" msgstr "modalitá solo waterfall" #: src/dialogs/fl_digi.cxx:6541 msgid "NO CALLSIGN SET" msgstr "NOMINATIVO NON IMPOSTATO" #: src/dialogs/fl_digi.cxx:6566 msgid "Close List" msgstr "Chiudi la lista" #: src/dialogs/fl_digi.cxx:6574 msgid "Open List" msgstr "Apri la lista" #: src/dialogs/fl_digi.cxx:6615 msgid "Clear list?" msgstr "Cancella la lista?" #: src/dialogs/fl_digi.cxx:6699 msgid "report" msgstr "rapporto" #: src/dialogs/fl_digi.cxx:6699 msgid "reports" msgstr "rapporti" #: src/dialogs/fl_digi.cxx:6704 #, fuzzy msgid "Recent activity for grid " msgstr "Attivitá recenti per il grid" #: src/dialogs/fl_digi.cxx:7841 src/dialogs/Viewer.cxx:283 msgid "Signal Browser" msgstr "Navigatore dei segnali" #: src/dialogs/fl_digi.cxx:8143 msgid "Scope" msgstr "Scope" #: src/dialogs/fl_digi.cxx:8234 msgid "Detected signal level" msgstr "Livello del segnale ricevuto" #: src/dialogs/fl_digi.cxx:8246 src/waterfall/waterfall.cxx:2596 msgid "Squelch level" msgstr "Livello squelch" #: src/dialogs/fl_digi.cxx:8262 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Tasto sinistro: cambia modo\n" "Tasto destro: configura" #: src/dialogs/fl_digi.cxx:8271 msgid "CW transmit WPM" msgstr "Velocitá di trasmissione CW (WPM)" #: src/dialogs/fl_digi.cxx:8280 msgid "Default WPM" msgstr "Velocitá predefinita (WPM)" #: src/dialogs/fl_digi.cxx:8310 #, fuzzy msgid "Left click to toggle VuMeter" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/dialogs/fl_digi.cxx:8316 #, fuzzy msgid "Left click to toggle Status Bar" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/dialogs/fl_digi.cxx:8328 #, fuzzy msgid "Tx level attenuator (dB)" msgstr "Attenuatore Tx (dB)" #: src/dialogs/fl_digi.cxx:8356 msgid "Automatic Frequency Control" msgstr "Controllo Automatico di Frequenza" #: src/dialogs/fl_digi.cxx:8361 msgid "Squelch" msgstr "Squelch" #: src/dialogs/fl_digi.cxx:8366 #, fuzzy msgid "Power Signal Monitor" msgstr "Tono prima del segnale" #: src/dialogs/fl_digi.cxx:10682 #, fuzzy msgid "Delete entry?" msgstr "Cancella voce" #: src/dialogs/fl_digi.cxx:10682 src/spot/notify.cxx:222 #: src/spot/notify.cxx:228 msgid "All" msgstr "Tutto" #: src/dialogs/Viewer.cxx:287 msgid "Find: " msgstr "Trova: " #: src/dialogs/Viewer.cxx:308 src/logbook/logsupport.cxx:324 #: src/logbook/logsupport.cxx:1063 src/misc/macroedit.cxx:504 #: src/mfsk/mfsk-pic.cxx:338 src/spot/notify.cxx:535 src/spot/notify.cxx:539 #: src/dialogs/confdialog.cxx:20251 msgid "Close" msgstr "Chiudi" #: src/dialogs/Viewer.cxx:316 src/logbook/logsupport.cxx:327 #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:13484 #: src/dialogs/confdialog.cxx:14633 msgid "Clear" msgstr "Cancella" #: src/dialogs/Viewer.cxx:320 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Tasto sinistro per cancellare il testo\n" "Tasto destro per resettare le frequenze" #: src/dialogs/Viewer.cxx:326 msgid "Set Viewer Squelch" msgstr "Imposta Squelch per il Viewer" #: src/logbook/logsupport.cxx:160 msgid "Export to CSV file" msgstr "Esporta in formato CSV" #: src/logbook/logsupport.cxx:187 msgid "Export to fixed field text file" msgstr "Esporta in formato di testo a campi fissi" #: src/logbook/logsupport.cxx:215 msgid "Export to ADIF file" msgstr "Esporta in formato ADIF" #: src/logbook/logsupport.cxx:317 msgid "LoTW Review" msgstr "LoTW Rivedi" #: src/logbook/logsupport.cxx:359 msgid "Save changed Logbook?" msgstr "Salvare le modifiche al log?" #: src/logbook/logsupport.cxx:380 #, fuzzy msgid "Create new logbook file" msgstr "Creare nuovo file di log?" #: src/logbook/logsupport.cxx:403 #, fuzzy, c-format msgid "%s exists, overwrite?" msgstr "%s esistente, sovrascrivere?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Apri file di log" #: src/logbook/logsupport.cxx:472 msgid "Save logbook file" msgstr "Salva file di log" #: src/logbook/logsupport.cxx:933 msgid "Database merger in progress" msgstr "Unione dei database in corso" #: src/logbook/logsupport.cxx:939 msgid "Merge ADIF file" msgstr "Unisci file ADIF" #: src/logbook/logsupport.cxx:977 msgid "No records in lotw download file" msgstr "Nessun record nel file scaricato da LoTW" #: src/logbook/logsupport.cxx:1057 msgid "Unmatched LoTW Records" msgstr "LoTW records non corrispondenti" #: src/logbook/logsupport.cxx:1092 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" "Impossibile trovare file di report di LoTW\n" "\n" "Scarica dalla pagina LoTW di ARRL dopo aver effettuato l'accesso a:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Memorizzare il file di report nella cartella LOTW di fldigi,\n" "\n" "assegna al file il nome 'lotwreport.adi'" #: src/logbook/logsupport.cxx:1214 src/spot/notify.cxx:206 #: src/spot/notify.cxx:533 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1574 msgid "Update" msgstr "Aggiorna" #: src/logbook/logsupport.cxx:1816 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Vuoi veramente cancellare il record per \"%s\"?" #: src/logbook/logsupport.cxx:2330 msgid "Create cabrillo report" msgstr "Crea log in formato cabrillo" #: src/logbook/logsupport.cxx:2570 msgid "LoTW download file" msgstr "File scaricati da LoTW" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Rileva la presenza di [WRAP:beg] e [WRAP:end].\n" "Salve le etichette e tutto il testo da esse racchiuso in un file\n" "marcato con data e ora, per es.:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Rileva la presenza di [WRAP:beg] e [WRAP:end].\n" "Salve le etichette e tutto il testo da esse racchiuso in un file\n" "marcato con data e ora, per es.:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:286 src/logger/rx_extract.cxx:316 msgid "Could not start flmsg" msgstr "Impossibile avviare flmsg" #: src/logger/rx_extract.cxx:414 src/logger/rx_extract.cxx:418 #: src/dialogs/confdialog.cxx:16379 msgid "Locate flmsg executable" msgstr "Trova l'eseguibile di flmsg" #: src/logger/rx_extract.cxx:414 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:418 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:492 #, fuzzy msgid "Locate executable" msgstr "Trova l'eseguibile" #: src/logger/rx_extract.cxx:492 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:495 #, fuzzy msgid "Locate binary" msgstr "Trova sorgente" #: src/logger/rx_extract.cxx:495 msgid "*" msgstr "*" #: src/logger/speak.cxx:40 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Salva tutto il testo ricevuto, un carattere alla volta, su questo file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:539 msgid "Rig mode" msgstr "Modo Radio" #: src/misc/configuration.cxx:540 msgid "Always LSB" msgstr "Sempre LSB" #: src/misc/configuration.cxx:541 msgid "Always USB" msgstr "Sempre USB" #: src/misc/configuration.cxx:549 src/dialogs/confdialog.cxx:17915 #: src/dialogs/confdialog.cxx:18183 src/dialogs/confdialog.cxx:18185 #, fuzzy msgid "Rig Control/Hamlib" msgstr "Controllo della radio/Hamlib" #: src/misc/configuration.cxx:723 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Resetta tutte le opzioni ai loro valori predefiniti?\n" "\n" "Il reset delle opzioni avrà effetto al prossimo riavvio\n" "I file fldigi_def.xml e fldigi.prefs saranno cancellati!\n" #: src/misc/configuration.cxx:728 msgid "Confirm RESET" msgstr "Confermare il RESET" #: src/misc/macroedit.cxx:68 msgid "\tmy frequency" msgstr "\tla mia frequenza" #: src/misc/macroedit.cxx:69 msgid "\tmode" msgstr "\tmodo" #: src/misc/macroedit.cxx:70 msgid "\tmy call" msgstr "\til mio nominativo" #: src/misc/macroedit.cxx:71 msgid "\tmy locator" msgstr "\til mio locatore" #: src/misc/macroedit.cxx:72 msgid "\tmy name" msgstr "\til mio nome" #: src/misc/macroedit.cxx:73 #, fuzzy #| msgid "\tmy QTH" msgid "\tmy QTH (city)" msgstr "\til mio QTH" #: src/misc/macroedit.cxx:74 msgid "\tmy RST" msgstr "\til mio RST" #: src/misc/macroedit.cxx:75 #, fuzzy msgid "\tmy FD class" msgstr "\tla mia classe FD" #: src/misc/macroedit.cxx:76 msgid "\tmy FD section" msgstr "\tla mia sezione FD" #: src/misc/macroedit.cxx:77 #, fuzzy msgid "\tmy state" msgstr "\til mio stato" #: src/misc/macroedit.cxx:78 #, fuzzy msgid "\tmy ST" msgstr "\til mio ST" #: src/misc/macroedit.cxx:79 msgid "\tmy county" msgstr "\tla mia contea" #: src/misc/macroedit.cxx:80 #, fuzzy msgid "\tmy CNTY" msgstr "\til mio CNTY" #: src/misc/macroedit.cxx:81 msgid "\tmy antenna" msgstr "\tla mia antenna" #: src/misc/macroedit.cxx:82 #, fuzzy msgid "\toperating band" msgstr "\tbanda operativa" #: src/misc/macroedit.cxx:83 #, fuzzy #| msgid "\ttransmit" msgid "\ttransmit power" msgstr "\ttrasmetti" #: src/misc/macroedit.cxx:84 msgid "\tFldigi version" msgstr "\tVersione Fldigi" #: src/misc/macroedit.cxx:85 msgid "\tdigital mode (adif)" msgstr "\tmodo digitale (adif)" #: src/misc/macroedit.cxx:88 msgid "\tother call" msgstr "\tnominativo del corrispondente" #: src/misc/macroedit.cxx:89 msgid "\tother name" msgstr "\tnome del corrispondente" #: src/misc/macroedit.cxx:90 msgid "\tother QTH" msgstr "\tQTH del corrispondente" #: src/misc/macroedit.cxx:91 #, fuzzy msgid "\tother State" msgstr "\tStato del corrispondente" #: src/misc/macroedit.cxx:92 #, fuzzy msgid "\tother Province" msgstr "\tprovincia del corrispondente" #: src/misc/macroedit.cxx:93 msgid "\tother locator" msgstr "\tlocatore del corrispondente" #: src/misc/macroedit.cxx:94 msgid "\tother RST" msgstr "\tRST del corrispondente" #: src/misc/macroedit.cxx:97 msgid "\tS/N etc." msgstr "\tS/N ecc." #: src/misc/macroedit.cxx:98 msgid "\tIMD etc." msgstr "\tIMD ecc." #: src/misc/macroedit.cxx:101 msgid "\t# QSO recs" msgstr "\t# QSO records" #: src/misc/macroedit.cxx:102 msgid "\tnext QSO rec #" msgstr "\tprossimo record QSO #" #: src/misc/macroedit.cxx:105 msgid "\tmap on google" msgstr "\tmappa su Google" #: src/misc/macroedit.cxx:106 msgid "\tmap by value" msgstr "\tmappa con parametri" #: src/misc/macroedit.cxx:109 msgid "\tclear RX pane" msgstr "\tcancella la finestra di ricezione" #: src/misc/macroedit.cxx:110 #, fuzzy msgid "\tclear TX pane" msgstr "\tcancella la finestra di ricezione" #: src/misc/macroedit.cxx:111 #, fuzzy msgid "\tclear QSO fields" msgstr "\tcancella i campi del log" #: src/misc/macroedit.cxx:114 msgid "\ttext to NAME/QTH" msgstr "\tdal testo al NOME/QTH" #: src/misc/macroedit.cxx:118 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk On, Off, Commuta" #: src/misc/macroedit.cxx:122 msgid "\tclear log fields" msgstr "\tcancella i campi del log" #: src/misc/macroedit.cxx:123 msgid "\tsave QSO data" msgstr "\tsalva i dati del QSO" #: src/misc/macroedit.cxx:124 msgid "\tsaveQSO data, append msg to notes" msgstr "\tsalva i dati del QSO, aggiungi il messaggio alle note" #: src/misc/macroedit.cxx:125 msgid "\tlog at xmt time" msgstr "\tmetti a log quando questa macro viene trasmessa" #: src/misc/macroedit.cxx:126 msgid "\tsaveQSO data, append msg to notes" msgstr "\tsalva i dati del QSO, aggiungi il messaggio alle note" #: src/misc/macroedit.cxx:127 msgid "\tlog eQSL" msgstr "\tlog eQSL" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL optional msg" msgstr "\tlog eQSL con messaggio opzionale" #: src/misc/macroedit.cxx:131 msgid "\tQSO time (HHMM))" msgstr "\tora del QSO (HHMM)" #: src/misc/macroedit.cxx:132 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "\tLDT default '%Y-%m-%d %H:%M%z'" #: src/misc/macroedit.cxx:133 #, fuzzy #| msgid "\tLocal datetime, default '%x %H:%M %Z'" msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "\tData/Ora locali, default '%x %H:%M %Z'" #: src/misc/macroedit.cxx:134 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "\tZDT default '%Y-%m-%d %H:%MZ'" #: src/misc/macroedit.cxx:135 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "\tUTC datetime, default '%x %H:%MZ'" #: src/misc/macroedit.cxx:136 #, fuzzy msgid "\tlocal time, default %H%M" msgstr "\tora locale, default HHMM" #: src/misc/macroedit.cxx:137 #, fuzzy msgid "\tzulu time default %H%MZ" msgstr "\tora zulu (UTC) HHMMZ" #: src/misc/macroedit.cxx:138 #, fuzzy msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tdata locale YYYY-MM-DD" #: src/misc/macroedit.cxx:139 #, fuzzy msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tdata zulu (UTC) YYYY-MM-DD Z" #: src/misc/macroedit.cxx:140 msgid "\tget weather data" msgstr "\tacquisisci dati meteo" #: src/misc/macroedit.cxx:141 msgid "\tget weather data for station" msgstr "\tacquisisci dati meteo per la stazione" #: src/misc/macroedit.cxx:144 msgid "\tcontest counter" msgstr "\tcontatore per contest" #: src/misc/macroedit.cxx:145 msgid "\tdecrement counter" msgstr "\tdecrementa il contatore" #: src/misc/macroedit.cxx:146 msgid "\tincrement counter" msgstr "\tincrementa il contatore" #: src/misc/macroedit.cxx:147 #, fuzzy msgid "\texchange in" msgstr "\trapporto ricevuto" #: src/misc/macroedit.cxx:148 msgid "\texchange out" msgstr "\trapporto trasmesso" #: src/misc/macroedit.cxx:149 msgid "\texchange begin" msgstr "\tinizio rapporto" #: src/misc/macroedit.cxx:150 msgid "\texchange end" msgstr "\tfine rapporto" #: src/misc/macroedit.cxx:151 msgid "\tsave contest out" msgstr "\tsalva rapporto contest" #: src/misc/macroedit.cxx:152 #, fuzzy msgid "\tcurrent contest serno" msgstr "\tcontatore corrente del contest" #: src/misc/macroedit.cxx:153 msgid "\tlast serno sent" msgstr "\tultimo seriale trasmesso" #: src/misc/macroedit.cxx:154 #, fuzzy msgid "\tFD class" msgstr "\tclasse FD" #: src/misc/macroedit.cxx:155 #, fuzzy msgid "\tFD section" msgstr "\tsezione FD" #: src/misc/macroedit.cxx:156 #, fuzzy msgid "\tcontest class" msgstr "\tclasse del contest" #: src/misc/macroedit.cxx:157 #, fuzzy msgid "
\tARRL section" msgstr "
\tsezione ARRL" #: src/misc/macroedit.cxx:160 msgid "\treceive" msgstr "\tricevi" #: src/misc/macroedit.cxx:161 msgid "\ttransmit" msgstr "\ttrasmetti" #: src/misc/macroedit.cxx:162 msgid "\ttoggle T/R" msgstr "\tcommuta T/R" #: src/misc/macroedit.cxx:163 msgid "\tsearch UP for signal" msgstr "\tcerca un segnale a salire" #: src/misc/macroedit.cxx:164 msgid "\tsearch DOWN for signal" msgstr "\tcerca un segnale a scendere" #: src/misc/macroedit.cxx:165 msgid "\treturn to sweet spot" msgstr "\tritorna allo spot" #: src/misc/macroedit.cxx:166 msgid "\tmove to freq NNNN Hz" msgstr "\tvai alla freq NNNN Hz" #: src/misc/macroedit.cxx:167 msgid "\tleft-clk QSY button" msgstr "\tclicca a sinistra per QSY" #: src/misc/macroedit.cxx:168 msgid "\tright-clk QSY button" msgstr "\tclicca a destra per QSY" #: src/misc/macroedit.cxx:169 msgid "\tqsy to kHz, Hz" msgstr "\tqsy a kHz, Hz" #: src/misc/macroedit.cxx:170 msgid "\tincr/decr xcvr freq" msgstr "\tincrementa/decrementa la frequenza rtx" #: src/misc/macroedit.cxx:171 msgid "\tvalid xcvr mode" msgstr "\timposta modo radio" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr filter width" msgstr "\timposta ampiezza filtro" #: src/misc/macroedit.cxx:173 #, fuzzy msgid "\tvalid xcvr low cutoff filter" msgstr "\timposta filtro passa-basso" #: src/misc/macroedit.cxx:174 #, fuzzy msgid "\tvalid xcvr hi cutoff filter" msgstr "\timposta filtro passa-alto" #: src/misc/macroedit.cxx:175 msgid "\trig freq has kbd focus" msgstr "\trig freq has kbd focus" #: src/misc/macroedit.cxx:178 msgid "\tinsert QRG into Rx text" msgstr "\tinsert QRG into Rx text" #: src/misc/macroedit.cxx:181 msgid "\tinsert text file" msgstr "\tinserisci un file di testo" #: src/misc/macroedit.cxx:182 #, fuzzy msgid "\tinsert image file" msgstr "\tinserisci un file immagine" #: src/misc/macroedit.cxx:183 msgid "\tsend avatar" msgstr "\tinvia avatar" #: src/misc/macroedit.cxx:186 #, fuzzy msgid "\tpause transmit" msgstr "\tmetti in pausa la trasmissione" #: src/misc/macroedit.cxx:187 msgid "\tidle signal for NN.nn sec" msgstr "\tsegnale idle per NN.nn sec" #: src/misc/macroedit.cxx:188 msgid "\trepeat every NN sec" msgstr "\tripeti ogni NN sec" #: src/misc/macroedit.cxx:189 #, fuzzy msgid "\trepeat after waiting NN sec" msgstr "\tripeti ogni NN sec" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tsegnale di accordo per NN sec" #: src/misc/macroedit.cxx:191 #, fuzzy msgid "\tdelay xmt for NN.n sec" msgstr "\tritarda la trasmissione per NN sec" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\tripeti la macro continuamente" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution for" msgstr "\tprogramma l'esecuzione per" #: src/misc/macroedit.cxx:194 msgid "\tend execution at" msgstr "\ttermina l'esecuzione alle" #: src/misc/macroedit.cxx:195 #, fuzzy msgid "\tuse local date/time" msgstr "\tData e ora locale" #: src/misc/macroedit.cxx:198 msgid "\t set xmt attenuator" msgstr "\t imposta attenuatore in TX" #: src/misc/macroedit.cxx:201 msgid "\tCW identifier" msgstr "\tidentificatore CW" #: src/misc/macroedit.cxx:202 #, fuzzy msgid "\tsend mode ID; TX start only" msgstr "\ttrasmetti ID; iniza solo TX" #: src/misc/macroedit.cxx:203 msgid "\ttext at start of TX" msgstr "\ttesto all'inizio della trasmissione" #: src/misc/macroedit.cxx:204 #, fuzzy #| msgid "\tvideo text in TX stream" msgstr "\tTx RSID on,off,toggle" msgstr "\tTx RSID on,off,scambia" #: src/misc/macroedit.cxx:206 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID on,off,scambia" #: src/misc/macroedit.cxx:207 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tTrasmetti |NN| di raffiche RsID successive" #: src/misc/macroedit.cxx:208 msgid "\t[Wait][Len](ms)" msgstr "\t[Wait][Len](ms)" #: src/misc/macroedit.cxx:211 msgid "\tXmt audio wav file" msgstr "\tXmt audio wav file" #: src/misc/macroedit.cxx:214 msgid "" "" msgstr "" "" #: src/misc/macroedit.cxx:215 msgid "\talert using external wav file" msgstr "\talert utilizzando un file wav esterno" #: src/misc/macroedit.cxx:218 msgid "\tCW QSK post-timing" msgstr "\tCW QSK post-timing" #: src/misc/macroedit.cxx:219 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK pre-timing" #: src/misc/macroedit.cxx:220 msgid "\tCW rise time" msgstr "\tCW rise time" #: src/misc/macroedit.cxx:221 #, fuzzy msgid "\tChar WPM:Text WPM (15.0:5.0)" msgstr "\tCW WPM" #: src/misc/macroedit.cxx:224 msgid "\tsend CAT cmd" msgstr "\tinvia comando cat via RigCAT" #: src/misc/macroedit.cxx:225 msgid "\tsend CAT cmd" msgstr "\tinvia comando cat via FLRig" #: src/misc/macroedit.cxx:228 msgid "\tAFC on,off,toggle" msgstr "\tAFC on,off,scambia" #: src/misc/macroedit.cxx:229 msgid "\tLOCK on,off,toggle" msgstr "\tLOCK on,off,scambia" #: src/misc/macroedit.cxx:230 #, fuzzy msgid "\tRev on,off,toggle" msgstr "\tRev on,off,scambia" #: src/misc/macroedit.cxx:231 #, fuzzy #| msgid "\tDigitalk On, Off, Toggle" msgid "\tDigital Squelch on, off,toggle" msgstr "\tDigitalk On, Off, Commuta" #: src/misc/macroedit.cxx:232 msgid "\tDigital Squelch level, 0..100" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tchange macro defs file" msgstr "\tcambia file macro" #: src/misc/macroedit.cxx:236 #, fuzzy msgid "\tsave current macro file" msgstr "\tsalva file macro" #: src/misc/macroedit.cxx:237 msgid "\trun macro from buffered teext" msgstr "" #: src/misc/macroedit.cxx:240 msgid "\tignore comment text" msgstr "\tignora testo commento" #: src/misc/macroedit.cxx:241 msgid "<#comments>\t ignore comments" msgstr "<#comments>\t ignora commenti" #: src/misc/macroedit.cxx:244 msgid "\tmodem char/sec test on nn chars" msgstr "\tmodem prova caratteri/secondo su nn caratteri" #: src/misc/macroedit.cxx:245 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "\tmodem timing test, 'n' gruppi di 5 caratteri casuali" #: src/misc/macroedit.cxx:246 msgid "\tmodem timing test, spec' file" msgstr "\tmodem timing test, spec' file" #: src/misc/macroedit.cxx:247 msgid "\tmodem timing test, string 's'" msgstr "\tmodem timing test, string 's'" #: src/misc/macroedit.cxx:250 msgid "\tWAV file; internal string" msgstr "\tWAV file; stringa interna" #: src/misc/macroedit.cxx:251 msgid "\tWAV file; 'n' random 5 char groups" msgstr "\tWAV file; 'n' gruppi di 5 caratteri casuali" #: src/misc/macroedit.cxx:252 #, fuzzy msgid "\tWAV file; spec' file" msgstr "\tWAV file; spec' file" #: src/misc/macroedit.cxx:253 msgid "\tWAV file; string 's'" msgstr "\tWAV file; string 's'" #: src/misc/macroedit.cxx:256 #, fuzzy msgid "\tAnalysis CSV on,off,toggle" msgstr "\tAnalisi CSV on,off,scambia" #: src/misc/macroedit.cxx:259 msgid "\tpush current mode to stack" msgstr "\tpush current mode to stack" #: src/misc/macroedit.cxx:260 #, fuzzy #| msgid "\tpush current mode / audio freq to stack" msgstr "\tpop current mode/freq from stack" msgstr "\tpop current mode/freq from stack" #: src/misc/macroedit.cxx:383 msgid "Text file to insert" msgstr "File di testo da inserire" #: src/misc/macroedit.cxx:393 #, fuzzy msgid "Test text file" msgstr "Prova file di testo" #: src/misc/macroedit.cxx:403 #, fuzzy msgid "MFSK image file" msgstr "File immaginae MFSK" #: src/misc/macroedit.cxx:413 msgid "Change to Macro file" msgstr "Modifica al file macro" #: src/misc/macroedit.cxx:423 src/misc/macroedit.cxx:433 #, fuzzy msgid "Select audio file" msgstr "Seleziona file audio" #: src/misc/macroedit.cxx:445 msgid "Executable file to insert" msgstr "File eseguibile da inserire" #: src/misc/macroedit.cxx:476 #, fuzzy msgid "Macro Text" msgstr "Testo della Macro" #: src/misc/macroedit.cxx:481 #, fuzzy msgid "Select Tag" msgstr "Seleziona Tag:" #: src/misc/macroedit.cxx:493 #, fuzzy msgid "Macro Button Label" msgstr "Etichetta sul Pulsante Macro:" #: src/misc/macroedit.cxx:501 msgid "Apply" msgstr "Applica" #: src/misc/macroedit.cxx:530 msgid "Macro editor - " msgstr "Editor delle macro - " #: src/misc/macros.cxx:5166 msgid "Open macro file" msgstr "Apri file macro" #: src/misc/macros.cxx:5167 src/misc/macros.cxx:5210 #, fuzzy msgid "Fldigi macro definition file\t*.{mdf}" msgstr "File di definizione delle macro per Fldigi\t*.mdf" #: src/misc/macros.cxx:5209 msgid "Save macro file" msgstr "Salva file macro" #: src/misc/newinstall.cxx:385 msgid "Finish" msgstr "Fine" #: src/misc/newinstall.cxx:386 msgid "Next" msgstr "Prossimo" #: src/misc/newinstall.cxx:387 #, fuzzy msgid "Back" msgstr "Precedente" #: src/misc/newinstall.cxx:505 msgid "The wizard will guide you through the basic fldigi settings:" msgstr "" "La procedura guidata ti guiderà attraverso le impostazioni di base di fldigi:" #: src/misc/newinstall.cxx:506 src/logbook/lgbook.cxx:731 msgid "Operator" msgstr "Operatore" #: src/misc/newinstall.cxx:507 #, fuzzy msgid "Sound Card Interface" msgstr "Scheda Audio" #: src/misc/newinstall.cxx:508 msgid "Transceiver control, flrig/rigcat/hamlib" msgstr "Controllo radio, flrig/rigcat/hamlib" #: src/misc/newinstall.cxx:509 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" "Sentiti libero di abbandonare la procedura guidata in qualsiasi momento" #: src/misc/newinstall.cxx:510 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Tutte le impostazioni mostrate qui possono essere modificate in seguito " "tramite il menu Configura" #: src/misc/newinstall.cxx:525 #, fuzzy msgid "Fldigi configuration wizard" msgstr "Configurazione guidata di Fldigi" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:302 src/mfsk/mfsk-pic.cxx:305 msgid "Time needed: " msgstr "Tempo necessario: " #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Carica file immagine" #: src/mfsk/mfsk-pic.cxx:312 msgid "Send image" msgstr "Invia immagine" #: src/mfsk/mfsk-pic.cxx:319 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Carica o trascina un file immagine\n" "Formati supportati: PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:323 msgid "Transfer speed, X1-normal" msgstr "Velocità di trasferimento, X1-normale" #: src/mfsk/mfsk-pic.cxx:335 msgid "Load" msgstr "Carica" #: src/waterfall/waterfall.cxx:2031 msgid "Waterfall / FFT / Scope" msgstr "Waterfall / FFT / Oscilloscopio" #: src/waterfall/waterfall.cxx:2040 msgid "Upper signal level (dB)" msgstr "Livello superiore del segnale (dB)" #: src/waterfall/waterfall.cxx:2051 msgid "Signal range (dB)" msgstr "Campo di variazione del segnale (dB)" #: src/waterfall/waterfall.cxx:2057 msgid "Change waterfall scale" msgstr "Cambia la scala del waterfall" #: src/waterfall/waterfall.cxx:2062 msgid "Slew display lower in frequency" msgstr "Scorri la porzione visualizzata verso frequenze piú basse" #: src/waterfall/waterfall.cxx:2067 msgid "Center display on signal" msgstr "Centra la visualizzazione sul segnale" #: src/waterfall/waterfall.cxx:2072 msgid "Slew display higher in frequency" msgstr "Scorri la porzione visualizzata verso frequenze piú alte" #: src/waterfall/waterfall.cxx:2077 msgid "Waterfall drop speed" msgstr "Velocità del waterfall" #: src/waterfall/waterfall.cxx:2087 msgid "Adjust cursor frequency" msgstr "Aggiusta la frequenza del cursore" #: src/waterfall/waterfall.cxx:2092 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centra nella banda passante\n" "Tasto destro per tornare indietro" #: src/waterfall/waterfall.cxx:2098 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Registra modo e frequenza\n" "Tasto destro per la lista" #: src/waterfall/waterfall.cxx:2108 msgid "Lock transmit frequency" msgstr "Blocca la frequenza di trasmissione" #: src/waterfall/waterfall.cxx:2117 src/dialogs/confdialog.cxx:19508 msgid "Reverse" msgstr "Inverti" #: src/waterfall/waterfall.cxx:2124 msgid "Transmit/Receive" msgstr "Trasmetti/Ricevi" #: src/waterfall/waterfall.cxx:2595 msgid "AFC range or BW" msgstr "Range AFC o banda passante" #: src/waterfall/waterfall.cxx:2596 msgid "Signal search" msgstr "Ricerca segnali" #: src/waterfall/waterfall.cxx:2597 msgid "Modem carrier" msgstr "Portante del modo" #: src/waterfall/waterfall.cxx:2597 msgid "Scroll" msgstr "Scorrimento" #: src/rigcontrol/rigxml.cxx:1121 msgid "Open rig xml file" msgstr "Apri file rig xml" #: src/rigcontrol/rigxml.cxx:1121 msgid "Fldigi rig xml definition file\t*.xml" msgstr "File di definizione rig xml\t*.xml" #: src/soundcard/sound.cxx:115 src/soundcard/sound.cxx:117 msgid "Audio file" msgstr "File audio" #: src/spot/notify.cxx:193 msgid "My callsign de CALL" msgstr "Il mio nominativo de nominativo corrispondente" #: src/spot/notify.cxx:194 msgid "Station heard twice" msgstr "Stazione sentita due volte" #: src/spot/notify.cxx:195 msgid "Custom text search" msgstr "Ricerca testo personalizzato" #: src/spot/notify.cxx:196 msgid "RSID reception" msgstr "Ricezione RSID" #: src/spot/notify.cxx:197 msgid "RSID EOT" msgstr "" #: src/spot/notify.cxx:205 msgid "Toggle" msgstr "Scambia" #: src/spot/notify.cxx:207 src/spot/notify.cxx:532 msgid "Remove" msgstr "Rimuovi" #: src/spot/notify.cxx:218 src/dialogs/confdialog.cxx:14150 #: src/dialogs/confdialog.cxx:14161 src/dialogs/confdialog.cxx:14251 #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14835 #: src/dialogs/confdialog.cxx:18355 src/dialogs/confdialog.cxx:18382 #: src/dialogs/confdialog.cxx:18411 src/dialogs/confdialog.cxx:18440 #: src/dialogs/confdialog.cxx:18469 src/dialogs/confdialog.cxx:18493 #: src/dialogs/confdialog.cxx:19096 msgid "Select" msgstr "Seleziona" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 src/spot/notify.cxx:586 #: src/logbook/lgbook.cxx:782 src/logbook/lgbook.cxx:1187 msgid "Continent" msgstr "Continente" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/logbook/lgbook.cxx:1199 msgid "ITU zone" msgstr "Zona ITU" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1175 msgid "CQ zone" msgstr "Zona CQ" #: src/spot/notify.cxx:224 msgid "Deselect" msgstr "Deseleziona" #: src/spot/notify.cxx:531 msgid "Add" msgstr "Aggiungi" #: src/spot/notify.cxx:534 msgid "Test..." msgstr "Prova..." #: src/spot/notify.cxx:537 src/widgets/FTextView.cxx:484 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Seleziona tutto" #: src/spot/notify.cxx:538 src/logbook/lgbook.cxx:621 #: src/logbook/lgbook.cxx:822 src/logbook/lgbook.cxx:1636 #: src/logbook/lgbook.cxx:1718 msgid "Clear All" msgstr "Cancella tutto" #: src/spot/notify.cxx:585 src/widgets/FTextRXTX.cxx:154 #: src/logbook/lgbook.cxx:737 src/logbook/lgbook.cxx:1039 msgid "Country" msgstr "Country" #: src/spot/notify.cxx:1144 msgid "The regular expression field must not be empty." msgstr "Il campo regular expression non puó essere vuoto." #: src/spot/notify.cxx:1150 msgid "The regular expression must be valid." msgstr "La regular expression deve essere valida." #: src/spot/notify.cxx:1157 msgid "Please set your callsign first." msgstr "Imposta prima il tuo nominativo." #: src/spot/notify.cxx:1294 msgid "Run program" msgstr "Lancia il programma" #: src/spot/notify.cxx:1329 msgid "" "Default test string is:\n" " \"" msgstr "" "Default test string is:\n" " \"" #: src/spot/notify.cxx:1330 msgid "Enter test string or leave blank for default:" msgstr "Imposta la frase di prova o lascia in bianco per il predefinito:" #: src/spot/notify.cxx:1341 msgid "This event's regular expression is invalid." msgstr "Questa regular expression per gli eventi non è valida." #: src/spot/notify.cxx:1348 msgid "The test string did not match this event's search pattern." msgstr "" "La frase di test non corrisponde allo schema di ricerca di questo evento." #: src/spot/notify.cxx:1366 msgid "Available substrings" msgstr "Sottostringhe disponibili" #: src/spot/notify.cxx:1453 src/logbook/lgbook.cxx:1617 msgid "Frequency" msgstr "Frequenza" #: src/spot/notify.cxx:1455 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1614 msgid "Callsign" msgstr "Nominativo" #: src/waterfall/colorbox.cxx:87 msgid "Open palette" msgstr "Apri palette" #: src/waterfall/colorbox.cxx:87 src/waterfall/colorbox.cxx:125 msgid "Fldigi palette\t*.pal" msgstr "Palette Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:111 src/waterfall/colorbox.cxx:136 msgid "Palette: " msgstr "Palette: " #: src/waterfall/colorbox.cxx:125 msgid "Save palette" msgstr "Salva palette" #: src/widgets/FTextRXTX.cxx:147 msgid "Look up call" msgstr "Cerca nominativo" #: src/widgets/FTextRXTX.cxx:148 src/dialogs/confdialog.cxx:10138 #: src/logbook/lgbook.cxx:665 src/logbook/lgbook.cxx:870 #: src/logbook/lgbook.cxx:1666 msgid "Call" msgstr "Call" #: src/widgets/FTextRXTX.cxx:149 src/logbook/lgbook.cxx:669 #: src/logbook/lgbook.cxx:882 src/logbook/lgbook.cxx:1616 msgid "Name" msgstr "Nome" #: src/widgets/FTextRXTX.cxx:150 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:151 src/dialogs/confdialog.cxx:10842 #: src/logbook/lgbook.cxx:716 src/logbook/lgbook.cxx:1710 msgid "State" msgstr "Stato" #: src/widgets/FTextRXTX.cxx:152 src/logbook/lgbook.cxx:779 #: src/logbook/lgbook.cxx:1150 src/logbook/lgbook.cxx:1151 #: src/logbook/lgbook.cxx:1714 #, fuzzy msgid "County" msgstr "Contea" #: src/widgets/FTextRXTX.cxx:153 src/logbook/lgbook.cxx:734 msgid "Province" msgstr "Provincia" #: src/widgets/FTextRXTX.cxx:155 msgid "Locator" msgstr "Locatore" #: src/widgets/FTextRXTX.cxx:156 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:157 #, fuzzy msgid "RST(s)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:158 src/dialogs/confdialog.cxx:10836 #: src/logbook/lgbook.cxx:773 src/logbook/lgbook.cxx:1702 msgid "Exchange In" msgstr "Rapporto ricevuto" #: src/widgets/FTextRXTX.cxx:159 #, fuzzy msgid "Rx Serial #" msgstr "Seriale ricevuto" #: src/widgets/FTextRXTX.cxx:160 src/logbook/lgbook.cxx:1343 msgid "Class" msgstr "Classe" #: src/widgets/FTextRXTX.cxx:161 src/logbook/lgbook.cxx:1432 #, fuzzy msgid "Section" msgstr "Sezione" #: src/widgets/FTextRXTX.cxx:163 msgid "SS ser #" msgstr "SS ser #" #: src/widgets/FTextRXTX.cxx:164 msgid "SS prec" msgstr "SS prec" #: src/widgets/FTextRXTX.cxx:165 #, fuzzy msgid "SS check" msgstr "SS check" #: src/widgets/FTextRXTX.cxx:166 src/logbook/lgbook.cxx:1433 #, fuzzy msgid "SS section" msgstr "SS section" #: src/widgets/FTextRXTX.cxx:169 msgid "CQ STATE" msgstr "CQ Stato" #: src/widgets/FTextRXTX.cxx:171 msgid "1010 Nr" msgstr "1010 Nr" #: src/widgets/FTextRXTX.cxx:173 msgid "Kid's Age" msgstr "Età dei bambini" #: src/widgets/FTextRXTX.cxx:175 msgid "Round Up Chk" msgstr "Round Up Chk" #: src/widgets/FTextRXTX.cxx:176 msgid "NAQP xchg" msgstr "NAQP xchg" #: src/widgets/FTextRXTX.cxx:177 msgid "JOTA scout" msgstr "JOTA scout" #: src/widgets/FTextRXTX.cxx:178 msgid "JOTA troop" msgstr "JOTA troop" #: src/widgets/FTextRXTX.cxx:179 msgid "POWER(r)" msgstr "Potenza (r)" #: src/widgets/FTextRXTX.cxx:181 #, fuzzy msgid "QSOp state" msgstr "QSOp stato" #: src/widgets/FTextRXTX.cxx:182 msgid "QSOp county" msgstr "QSOp contea" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp serno" msgstr "QSOp seriale" #: src/widgets/FTextRXTX.cxx:184 #, fuzzy msgid "QSOp name" msgstr "QSOp nome" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp xchg" msgstr "QSOp xchg" #: src/widgets/FTextRXTX.cxx:186 msgid "QSOp category" msgstr "QSOp categoria" #: src/widgets/FTextRXTX.cxx:188 msgid "Insert marker" msgstr "Inserisci marker" #: src/widgets/FTextRXTX.cxx:196 #, fuzzy msgid "All entries" msgstr "Tentativi" #: src/widgets/FTextRXTX.cxx:198 msgid "Scroll hints" msgstr "Scorri suggerimenti" #: src/widgets/FTextRXTX.cxx:1808 msgid " in " msgstr " in " #: src/widgets/FTextRXTX.cxx:1811 msgid "Last QSO" msgstr "Ultimo QSO" #: src/widgets/FTextRXTX.cxx:1859 src/dialogs/confdialog.cxx:12043 msgid "Transmit" msgstr "Transmetti" #: src/widgets/FTextRXTX.cxx:1860 src/dialogs/confdialog.cxx:11903 #: src/dialogs/confdialog.cxx:14718 msgid "Receive" msgstr "Ricevi" #: src/widgets/FTextRXTX.cxx:1861 msgid "Abort" msgstr "Abbandona" #: src/widgets/FTextRXTX.cxx:1862 msgid "Send image..." msgstr "Invia immagine..." #: src/widgets/FTextRXTX.cxx:1871 src/widgets/flinput2.cxx:50 #, fuzzy msgid "Spec Char" msgstr "Spec Char" #: src/widgets/FTextRXTX.cxx:1879 src/widgets/flinput2.cxx:58 #, fuzzy msgid "A" msgstr "Az" #: src/widgets/FTextRXTX.cxx:1895 src/widgets/flinput2.cxx:74 #, fuzzy msgid "E" msgstr "Ex" #: src/widgets/FTextRXTX.cxx:1905 src/widgets/flinput2.cxx:84 #, fuzzy msgid "I" msgstr "IOTA" #: src/widgets/FTextRXTX.cxx:1915 src/widgets/flinput2.cxx:94 #, fuzzy msgid "N" msgstr "No" #: src/widgets/FTextRXTX.cxx:1919 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16915 #, fuzzy msgid "O" msgstr "OK" #: src/widgets/FTextRXTX.cxx:1933 src/widgets/flinput2.cxx:112 #, fuzzy msgid "U" msgstr "Aspetto" #: src/widgets/FTextRXTX.cxx:1943 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "Y" #: src/widgets/FTextRXTX.cxx:1948 src/widgets/flinput2.cxx:127 #: src/logbook/lgbook.cxx:1148 msgid "Other" msgstr "Altro" #: src/widgets/FTextView.cxx:294 msgid "Insert text" msgstr "Inserisci testo" #: src/widgets/FTextView.cxx:347 msgid "Save text as" msgstr "Salva testo come" #: src/widgets/FTextView.cxx:482 src/widgets/FTextView.cxx:648 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Copia" #: src/widgets/FTextView.cxx:485 msgid "Save as..." msgstr "Salva come..." #: src/widgets/FTextView.cxx:486 src/widgets/FTextView.cxx:652 msgid "Word wrap" msgstr "Vai a capo" #: src/widgets/FTextView.cxx:647 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Taglia" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Incolla" #: src/widgets/FTextView.cxx:651 msgid "Insert file..." msgstr "Inserisci file..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Annulla" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1581 msgid "Delete" msgstr "Cancella" #: src/config_script/run_scripts.cxx:950 msgid "Invalid Modem for KISS IO" msgstr "Modem per KISS IO non valido" #: src/config_script/run_scripts.cxx:2850 msgid "Script file name (path) null pointer" msgstr "Nome file script (percorso) destinazione errata" #: src/config_script/run_scripts.cxx:2857 msgid "Script file name (path) invalid" msgstr "Nome file script (percorso) non valido" #: src/config_script/run_scripts.cxx:2864 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "Allocazione Classe di Analisi Script Fallita (%s)" #: src/config_script/run_scripts.cxx:2868 #, fuzzy, c-format msgid "Executing script file: %s" msgstr "Esegui file script: %s" #: src/config_script/run_scripts.cxx:2873 #, c-format msgid "Issues reported in processing script file: %s" msgstr "Problemi riscontrati durante l'elaborazione del file scritp: %s" #: src/config_script/run_scripts.cxx:2874 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" "IKl file di script contiene potenziali problemi\n" "Consultare la documentazione o il file di registro per i dettagli." #: src/config_script/run_scripts.cxx:2878 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" "Alcune modifiche apportate dallo script richiedono il programma\n" "è necessario riavviare il programma per renderle attive." #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "Files Script" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "*.txt" #: src/config_script/script_parsing.cxx:359 #, c-format msgid "Missing command %s after line %d" msgstr "Comando mancante %s dopo la riga %d" #: src/config_script/script_parsing.cxx:403 #, fuzzy msgid "Command Not Found" msgstr "Comando non trovato" #: src/config_script/script_parsing.cxx:407 msgid "Not a script file/tag not found" msgstr "Non è stato trovato un file/tag di script" #: src/config_script/script_parsing.cxx:411 msgid "Invalid parameter" msgstr "Paramentri non validi" #: src/config_script/script_parsing.cxx:415 msgid "Invalid function parameter (internal non-script error)" msgstr "PArametri di funzione non validi (errore interno non-script)" #: src/config_script/script_parsing.cxx:419 msgid "Missing paired quotes (\")" msgstr "Virgolette mancanti (\")" #: src/config_script/script_parsing.cxx:423 #, fuzzy msgid "General Error" msgstr "Errore Generale" #: src/config_script/script_parsing.cxx:427 #, fuzzy msgid "No Errors" msgstr "Nessun Errore" #: src/config_script/script_parsing.cxx:431 msgid "Character searched not found" msgstr "Carattere cercato non trovato" #: src/config_script/script_parsing.cxx:435 msgid "End of line reached" msgstr "Fine della linea raggiunto" #: src/config_script/script_parsing.cxx:439 msgid "File not found" msgstr "File non trovato" #: src/config_script/script_parsing.cxx:443 msgid "Directory path not found" msgstr "Percorso della cartella non trovato" #: src/config_script/script_parsing.cxx:447 msgid "Unexpected end of parameter (args[]) list found" msgstr "Trovata fine non prevista dell'elenco dei parametri" #: src/config_script/script_parsing.cxx:451 msgid "Unexpected end of parameter check list found" msgstr "Trovata la fine imprevista dell'elenco di controllo dei parametri" #: src/config_script/script_parsing.cxx:455 msgid "Character count in args[] parameter exceeds expectations" msgstr "Il conteggio dei caratteri nel parametro args [] supera le aspettative" #: src/config_script/script_parsing.cxx:459 msgid "Memory Allocation Error (internal non-script error)" msgstr "Errore di allocazione della memoria (errore interno non-script)" #: src/config_script/script_parsing.cxx:463 msgid "Passed parameter is not of the expected type." msgstr "Il parametro passato non è del tipo previsto." #: src/config_script/script_parsing.cxx:467 msgid "Parameter is not valid." msgstr "Parametro non valido" #: src/config_script/script_parsing.cxx:471 msgid "Command missing ':'." msgstr "Comado mancante ':'." #: src/config_script/script_parsing.cxx:475 msgid "Maximum open subscripts reached." msgstr "Numero massimo di sottoscrizioni aperte raggiunto." #: src/config_script/script_parsing.cxx:479 msgid "Subscript execution fail (internal)." msgstr "Esecuzione dell'iscrizione non riuscita (interna)." #: src/config_script/script_parsing.cxx:483 msgid "Script device path not found." msgstr "Percorso dispositivo script non trovato" #: src/config_script/script_parsing.cxx:487 msgid "Unexpected end of file reached." msgstr "Raggiunta la fine imprevista del file." #: src/config_script/script_parsing.cxx:491 msgid "File read error" msgstr "Errore di lettura del file" #: src/config_script/script_parsing.cxx:495 msgid "Undefined error" msgstr "Errore indefinito" #: src/config_script/script_parsing.cxx:498 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "Linea: %d Errore:%d %s (%s)" #: src/config_script/script_parsing.cxx:966 #: src/config_script/script_parsing.cxx:1093 #: src/config_script/script_parsing.cxx:1806 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "Errore allocazione buffer vicino file: %s Riga %d" #: src/config_script/script_parsing.cxx:1036 #: src/config_script/script_parsing.cxx:1152 #, c-format msgid "Call back for script command %s reported an Error" msgstr "Richiamare il comando di script %s ha segnalato un errore" #: src/config_script/script_parsing.cxx:1042 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "Comando %s ignorato, notazione punto non supportata" #: src/config_script/script_parsing.cxx:1156 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "Comando %s ignorato, comando strutturato non supportato" #: src/config_script/script_parsing.cxx:1239 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "Parametro funzione non valido 'char *percorso_nome_file' (null)" #: src/config_script/script_parsing.cxx:1247 #, c-format msgid "Unable to open file %s" msgstr "Impossibile aprire il file %s" #: src/config_script/script_parsing.cxx:1435 msgid "1" msgstr "1" #: src/config_script/script_parsing.cxx:1439 msgid "0" msgstr "0" #: src/config_script/script_parsing.cxx:1656 #: src/config_script/script_parsing.cxx:1743 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "errore di allocazione cmd_buffer vicino alla riga %d" #: src/config_script/script_parsing.cxx:1757 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "Sovrascrivere la funzione di callback per \"%s\"" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "Puntatore nome file (NULL) non valido nella funzione %s:%d" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "Impossibile creare il file %s (Errore No=%d) func %s:%d" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" "%s\n" "# Script di configurazione generato da Fldigi\n" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "# Creato: %s\n" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 #: src/dialogs/confdialog.cxx:10080 src/dialogs/confdialog.cxx:11537 #: src/dialogs/confdialog.cxx:11721 msgid "Show" msgstr "Mostra" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 msgid "Hide" msgstr "Nascondi" #: src/dialogs/confdialog.cxx:6816 #, fuzzy msgid "no" msgstr "no" #: src/dialogs/confdialog.cxx:6816 #, fuzzy msgid "yes" msgstr "sí" #: src/dialogs/confdialog.cxx:9873 msgid "Fldigi configuration" msgstr "Configurazione di Fldigi" #: src/dialogs/confdialog.cxx:9883 #, fuzzy msgid "Configure" msgstr "&Configura" #: src/dialogs/confdialog.cxx:9893 msgid "Collapse Tree" msgstr "Ritrai elenco" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:10100 #: src/dialogs/confdialog.cxx:10102 #, fuzzy msgid "Call/Lookup" msgstr "Callook" #: src/dialogs/confdialog.cxx:9905 msgid "Web Browser lookup" msgstr "Lookup via Web browser" #: src/dialogs/confdialog.cxx:9909 #, fuzzy msgid "Do not use callsign lookup via web browser" msgstr "Non usare lookup nominativi via web browser" #: src/dialogs/confdialog.cxx:9915 #, fuzzy msgid "QRZ on line" msgstr "QRZ on line" #: src/dialogs/confdialog.cxx:9916 msgid "Visit QRZ web site" msgstr "Visita il sito web di QRZ" #: src/dialogs/confdialog.cxx:9921 msgid "HamCall online" msgstr "HamCall online" #: src/dialogs/confdialog.cxx:9922 msgid "Visit Hamcall web site" msgstr "Visita il sito web Hamcall" #: src/dialogs/confdialog.cxx:9927 msgid "HamQTH online" msgstr "HamQTH online" #: src/dialogs/confdialog.cxx:9928 src/dialogs/confdialog.cxx:9934 #, fuzzy msgid "Visit hamQTH web site" msgstr "Visita il sito web di hamQTH" #: src/dialogs/confdialog.cxx:9933 msgid "Callook online" msgstr "Callook online" #: src/dialogs/confdialog.cxx:9939 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:9952 #, fuzzy msgid "Hamcall" msgstr "Hamcall" #: src/dialogs/confdialog.cxx:9965 msgid "HamQTH" msgstr "HamQTH" #: src/dialogs/confdialog.cxx:9978 #, fuzzy msgid "Callook" msgstr "Callook" #: src/dialogs/confdialog.cxx:9979 msgid "Callook.info web site" msgstr "Sito web Callook.info" #: src/dialogs/confdialog.cxx:9994 msgid "Data base lookup" msgstr "Data base lookup" #: src/dialogs/confdialog.cxx:9998 msgid "Do not use callsign database" msgstr "Non usare un database di nominativi" #: src/dialogs/confdialog.cxx:10004 msgid "QRZ cdrom" msgstr "QRZ cdrom" #: src/dialogs/confdialog.cxx:10005 msgid "Use CD or hard drive CD image" msgstr "Usa un CD o un'immagine su HD" #: src/dialogs/confdialog.cxx:10010 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:10011 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "È necessario un abbonamento a pagamento\n" "per l'accesso online a QRZ" #: src/dialogs/confdialog.cxx:10016 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:10017 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "È necessario un abbonamento a pagamento\n" "per l'accesso online a Hamcall" #: src/dialogs/confdialog.cxx:10022 msgid "HamQTH.com" msgstr "HamQTH.com" #: src/dialogs/confdialog.cxx:10023 msgid "Free service courtesy of OK" msgstr "Servizio gratuito per gentile concessione di OK" #: src/dialogs/confdialog.cxx:10028 #, fuzzy msgid "Callook.info" msgstr "Callook.info" #: src/dialogs/confdialog.cxx:10029 #, fuzzy msgid "Callook.info lookup (free service US callsigns only)" msgstr "Consulta Callbook.info (servizio gratuito solo per nominativi USA)" #: src/dialogs/confdialog.cxx:10035 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "es: /home/dave/CALLBK/ or C:/CALLBK/\n" "Lascia in bianco per cercare un database" #: src/dialogs/confdialog.cxx:10049 msgid "User name" msgstr "Nome utente" #: src/dialogs/confdialog.cxx:10050 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "Login per QRZ / Hamcall / HamQTH" #: src/dialogs/confdialog.cxx:10064 src/dialogs/confdialog.cxx:11521 #: src/dialogs/confdialog.cxx:11637 msgid "Password" msgstr "Password" #: src/dialogs/confdialog.cxx:10065 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "Password per QRZ / Hamcall / HamQTH" #: src/dialogs/confdialog.cxx:10081 src/dialogs/confdialog.cxx:11538 #: src/dialogs/confdialog.cxx:11722 msgid "Show password in plain text" msgstr "Mostra la password" #: src/dialogs/confdialog.cxx:10086 msgid "Add address to notes field" msgstr "Aggiungi l'indirizzo nel campo note" #: src/dialogs/confdialog.cxx:10091 msgid "clear old data" msgstr "cancella vecchi dati" #: src/dialogs/confdialog.cxx:10105 #, fuzzy #| msgid "Reload cty.dat" msgid "Call/cty.dat" msgstr "Ricarica cty.dat" #: src/dialogs/confdialog.cxx:10109 #, fuzzy msgid "cty.dat folder" msgstr "Cartella cty.dat" #: src/dialogs/confdialog.cxx:10110 #, fuzzy msgid "Enter full path-name for cty.dat folder" msgstr "Inserisci il percorso completo per la cartela contenente cty.dat" #: src/dialogs/confdialog.cxx:10123 #, fuzzy msgid "Browse" msgstr "Trova" #: src/dialogs/confdialog.cxx:10124 msgid "Locate cty.dat file" msgstr "Localizza il file cty.dat" #: src/dialogs/confdialog.cxx:10127 src/dialogs/confdialog.cxx:10390 #: src/dialogs/confdialog.cxx:10410 src/dialogs/confdialog.cxx:10427 #: src/dialogs/confdialog.cxx:10457 src/dialogs/confdialog.cxx:10661 #: src/dialogs/confdialog.cxx:10717 src/dialogs/confdialog.cxx:11249 #: src/dialogs/confdialog.cxx:11445 src/dialogs/confdialog.cxx:12067 #: src/dialogs/confdialog.cxx:16947 src/dialogs/confdialog.cxx:17032 #: src/dialogs/confdialog.cxx:17046 src/dialogs/confdialog.cxx:17093 #: src/dialogs/confdialog.cxx:17159 src/dialogs/confdialog.cxx:17348 #: src/dialogs/confdialog.cxx:18931 src/dialogs/confdialog.cxx:20169 msgid "Default" msgstr "Predefinito" #: src/dialogs/confdialog.cxx:10128 #, fuzzy msgid "Restore cty.dat default folder" msgstr "Ripristina cartella di default per cty.dat" #: src/dialogs/confdialog.cxx:10131 msgid "Reload" msgstr "Ricarica" #: src/dialogs/confdialog.cxx:10132 msgid "Reload cty.dat" msgstr "Ricarica cty.dat" #: src/dialogs/confdialog.cxx:10135 src/dialogs/confdialog.cxx:10137 msgid "Call/Cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10141 src/dialogs/confdialog.cxx:10249 #: src/dialogs/confdialog.cxx:10251 #, fuzzy msgid "Colors-Fonts/Buttons-Menus" msgstr "Colori-Caratteri/Tasti" #: src/dialogs/confdialog.cxx:10145 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:10148 msgid "Rev" msgstr "Inverti" #: src/dialogs/confdialog.cxx:10151 msgid "Tune" msgstr "Accordo" #: src/dialogs/confdialog.cxx:10154 #, fuzzy msgid "RxID nar" msgstr "RxID" #: src/dialogs/confdialog.cxx:10157 msgid "Lk" msgstr "Lock" #: src/dialogs/confdialog.cxx:10160 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:10163 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:10166 #, fuzzy msgid "RxID wide" msgstr "RxID" #: src/dialogs/confdialog.cxx:10169 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:10172 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:10175 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:10225 msgid "Lighted Btns" msgstr "" #: src/dialogs/confdialog.cxx:10232 #, fuzzy msgid "Check Btns" msgstr "Seleziona" #: src/dialogs/confdialog.cxx:10239 msgid "Round Btns" msgstr "" #: src/dialogs/confdialog.cxx:10246 #, fuzzy #| msgid "Rx font" msgid "Menu font" msgstr "Carattere Rx" #: src/dialogs/confdialog.cxx:10254 src/dialogs/confdialog.cxx:10328 #: src/dialogs/confdialog.cxx:10330 msgid "Colors-Fonts/FreqDisp - Meters" msgstr "Colori-Caratteri/Display Frequenza-Strumenti" #: src/dialogs/confdialog.cxx:10260 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:10269 src/dialogs/confdialog.cxx:10387 #: src/dialogs/confdialog.cxx:10407 src/dialogs/confdialog.cxx:10424 #: src/dialogs/confdialog.cxx:10449 msgid "Font" msgstr "Caratteri" #: src/dialogs/confdialog.cxx:10272 src/dialogs/confdialog.cxx:10286 #: src/dialogs/confdialog.cxx:10300 src/dialogs/confdialog.cxx:10384 #: src/dialogs/confdialog.cxx:10404 msgid "Bg Color" msgstr "Colore Sfondo" #: src/dialogs/confdialog.cxx:10275 msgid "Digit Color" msgstr "Colore delle cifre" #: src/dialogs/confdialog.cxx:10278 msgid "Sys Colors" msgstr "Colori di sistema" #: src/dialogs/confdialog.cxx:10283 msgid "S-meter" msgstr "S-meter" #: src/dialogs/confdialog.cxx:10289 src/dialogs/confdialog.cxx:10303 #, fuzzy msgid "Scale Color" msgstr "Colore scala" #: src/dialogs/confdialog.cxx:10292 src/dialogs/confdialog.cxx:10306 #, fuzzy msgid "Meter Color" msgstr "Colore strumento" #: src/dialogs/confdialog.cxx:10297 msgid "PWR-meter" msgstr "PWR-meter" #: src/dialogs/confdialog.cxx:10309 msgid "Power scale" msgstr "Scala della potenza" #: src/dialogs/confdialog.cxx:10310 src/dialogs/confdialog.cxx:19838 msgid "Select the type of FFT prefilter" msgstr "Seleziona il tipo di prefiltro FFT" #: src/dialogs/confdialog.cxx:10321 msgid "25 W" msgstr "25 W" #: src/dialogs/confdialog.cxx:10333 src/dialogs/confdialog.cxx:10366 #: src/dialogs/confdialog.cxx:10368 msgid "Colors-Fonts/Function keys" msgstr "Colori-Caratteri/Tasti funzione" #: src/dialogs/confdialog.cxx:10337 msgid "Use colored buttons" msgstr "Usa pulsanti colorati" #: src/dialogs/confdialog.cxx:10342 msgid "Group 1" msgstr "Gruppo 1" #: src/dialogs/confdialog.cxx:10343 msgid "Background color for Function key group 1" msgstr "Colore di sfondo per i tasti funzione del gruppo 1" #: src/dialogs/confdialog.cxx:10348 msgid "Group 2" msgstr "Gruppo 2" #: src/dialogs/confdialog.cxx:10349 msgid "Background color for Function key group 2" msgstr "Colore di sfondo per i tasti funzione del gruppo 2" #: src/dialogs/confdialog.cxx:10354 msgid "Group 3" msgstr "Gruppo 3" #: src/dialogs/confdialog.cxx:10355 msgid "Background color for Function key group 3" msgstr "Colore di sfondo per i tasti funzione del gruppo 3" #: src/dialogs/confdialog.cxx:10360 src/dialogs/confdialog.cxx:10555 #: src/dialogs/confdialog.cxx:12036 src/dialogs/confdialog.cxx:14187 #: src/dialogs/confdialog.cxx:18180 src/logbook/lgbook.cxx:828 msgid "Defaults" msgstr "Predefiniti" #: src/dialogs/confdialog.cxx:10363 #, fuzzy msgid "Font/Color" msgstr "Carattere/Colore" #: src/dialogs/confdialog.cxx:10371 src/dialogs/confdialog.cxx:10462 #: src/dialogs/confdialog.cxx:10464 msgid "Colors-Fonts/Logging controls" msgstr "Colori-Caratteri/Controlli log" #: src/dialogs/confdialog.cxx:10375 #, fuzzy msgid "Logging Panel Controls" msgstr "Controlli Pannello Log" #: src/dialogs/confdialog.cxx:10395 #, fuzzy msgid "Logbook Dialog" msgstr "Log" #: src/dialogs/confdialog.cxx:10415 msgid "DX Cluster Dialog" msgstr "DX Cluster" #: src/dialogs/confdialog.cxx:10418 #, fuzzy msgid "Report Browser" msgstr "Navigatore" #: src/dialogs/confdialog.cxx:10430 #, fuzzy msgid "Even Lines" msgstr "Linee Pari" #: src/dialogs/confdialog.cxx:10435 msgid "Odd Lines" msgstr "Linee Dispari" #: src/dialogs/confdialog.cxx:10440 #, fuzzy msgid "Stream Text" msgstr "Flusso di testo" #: src/dialogs/confdialog.cxx:10446 #, fuzzy msgid "Bg color" msgstr "Colore Sfondo" #: src/dialogs/confdialog.cxx:10452 #, fuzzy msgid "Alt Color" msgstr "Colore Alt" #: src/dialogs/confdialog.cxx:10453 msgid "Color for outgoing telnet text" msgstr "Colore testo telnet in uscita" #: src/dialogs/confdialog.cxx:10467 src/dialogs/confdialog.cxx:10565 #: src/dialogs/confdialog.cxx:10567 #, fuzzy msgid "Colors-Fonts/Rx-Tx" msgstr "Colori-Caratteri/Rx-Tx" #: src/dialogs/confdialog.cxx:10471 #, fuzzy msgid "Rx/Tx Character set" msgstr "Carattere Rx/Tx" #: src/dialogs/confdialog.cxx:10472 #, fuzzy msgid "Select Rx/Tx Character Set" msgstr "Seleziona il carattere Rx/Tx" #: src/dialogs/confdialog.cxx:10492 msgid "Rx bkgnd" msgstr "Sfondo Rx" #: src/dialogs/confdialog.cxx:10495 msgid "Tx bkgnd" msgstr "Sfondo Tx" #: src/dialogs/confdialog.cxx:10504 msgid "Rx font" msgstr "Carattere Rx" #: src/dialogs/confdialog.cxx:10507 msgid "Tx font" msgstr "Carattere Tx" #: src/dialogs/confdialog.cxx:10516 #, fuzzy msgid "Macro Edit Font" msgstr "Editor delle macro" #: src/dialogs/confdialog.cxx:10519 msgid "Text Highlighting" msgstr "Evidenziazione Testo" #: src/dialogs/confdialog.cxx:10522 src/dialogs/confdialog.cxx:14169 msgid "XMIT" msgstr "TRASMESSO" #: src/dialogs/confdialog.cxx:10523 msgid "Sent chars in Rx/Tx pane" msgstr "Caratteri inviati nel pannello Rx/Tx" #: src/dialogs/confdialog.cxx:10528 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:10529 msgid "Control chars in Rx/Tx pane" msgstr "Caratteri di controllo nel pannello Rx/Tx" #: src/dialogs/confdialog.cxx:10534 msgid "SKIP" msgstr "Salta" #: src/dialogs/confdialog.cxx:10535 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Caratteri saltati nel pannello Tx\n" "(Tx on/off in CW)" #: src/dialogs/confdialog.cxx:10540 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:10541 msgid "Alternate character color in Rx panelr" msgstr "Alterna colori carattere nel pannello Rx" #: src/dialogs/confdialog.cxx:10546 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:10547 msgid "Selection background color in Rx Tx panels" msgstr "Colore sfondo del pannello Rx/Tx" #: src/dialogs/confdialog.cxx:10552 src/dialogs/confdialog.cxx:10577 msgid "System" msgstr "Sistema" #: src/dialogs/confdialog.cxx:10560 msgid "display Rx control chars as ascii string" msgstr "Mostra controlli Rx come stringhe ascii" #: src/dialogs/confdialog.cxx:10570 src/dialogs/confdialog.cxx:10580 #: src/dialogs/confdialog.cxx:10582 #, fuzzy msgid "Colors-Fonts/Tabs" msgstr "Colori-Caratteri/Tabs" #: src/dialogs/confdialog.cxx:10574 msgid "Tab Color" msgstr "Colore dei Tab" #: src/dialogs/confdialog.cxx:10585 src/dialogs/confdialog.cxx:10670 #: src/dialogs/confdialog.cxx:10672 msgid "Colors-Fonts/Signal Level" msgstr "Colori-Caratteri/Livello Segnale" #: src/dialogs/confdialog.cxx:10589 #, fuzzy msgid "Signal Level Indicator" msgstr "Colori livello segnali" #: src/dialogs/confdialog.cxx:10596 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18866 #, fuzzy msgid "Low" msgstr "Masso" #: src/dialogs/confdialog.cxx:10604 src/dialogs/confdialog.cxx:18874 msgid "" "Transition\n" "Level (dB)" msgstr "" #: src/dialogs/confdialog.cxx:10612 src/dialogs/confdialog.cxx:18882 msgid "Normal" msgstr "Normale" #: src/dialogs/confdialog.cxx:10627 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18897 msgid "High" msgstr "Alto" #: src/dialogs/confdialog.cxx:10642 src/dialogs/confdialog.cxx:18912 msgid "Over" msgstr "Sopra" #: src/dialogs/confdialog.cxx:10645 src/dialogs/confdialog.cxx:10648 #: src/dialogs/confdialog.cxx:10714 src/dialogs/confdialog.cxx:18915 #: src/dialogs/confdialog.cxx:18918 msgid "label" msgstr "" #: src/dialogs/confdialog.cxx:10659 src/dialogs/confdialog.cxx:18929 #, fuzzy msgid "Input signal level" msgstr "Livello del segnale" #: src/dialogs/confdialog.cxx:10664 src/dialogs/confdialog.cxx:18934 msgid "Use wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10665 src/dialogs/confdialog.cxx:18935 msgid "" "default scale is audo \"Vu Meter\"\n" "enable to emulate wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10676 src/dialogs/confdialog.cxx:10736 #: src/dialogs/confdialog.cxx:10738 #, fuzzy msgid "Colors-Fonts/Digiscope" msgstr "Colori-Caratteri/Tabs" #: src/dialogs/confdialog.cxx:10680 #, fuzzy #| msgid "Digit Color" msgid "Digital Scope Colors" msgstr "Colore delle cifre" #: src/dialogs/confdialog.cxx:10687 #, fuzzy #| msgid "Backgnd" msgid "Background" msgstr "Sfondo" #: src/dialogs/confdialog.cxx:10695 src/dialogs/confdialog.cxx:13791 msgid "Axis" msgstr "" #: src/dialogs/confdialog.cxx:10703 #, fuzzy #| msgid "Color" msgid "Color 1" msgstr "Colore" #: src/dialogs/confdialog.cxx:10711 #, fuzzy #| msgid "Color" msgid "Color 2" msgstr "Colore" #: src/dialogs/confdialog.cxx:10725 #, fuzzy #| msgid "Color" msgid "Color 3" msgstr "Colore" #: src/dialogs/confdialog.cxx:10733 #, fuzzy #| msgid "Color" msgid "Color 4" msgstr "Colore" #: src/dialogs/confdialog.cxx:10742 src/dialogs/confdialog.cxx:10946 #: src/dialogs/confdialog.cxx:10948 #, fuzzy msgid "Contests/General" msgstr "Contest/Generali" #: src/dialogs/confdialog.cxx:10747 msgid "Select Logging as QSO or Contest" msgstr "Seleziona log come QSO o come Contest" #: src/dialogs/confdialog.cxx:10762 #, fuzzy msgid "State QSO Party" msgstr "Stato QSO Party" #: src/dialogs/confdialog.cxx:10778 #, fuzzy msgid "Text capture order" msgstr "Ordine cattura testo" #: src/dialogs/confdialog.cxx:10779 #, fuzzy msgid "Context Notes" msgstr "Note contestuali" #: src/dialogs/confdialog.cxx:10791 msgid "Duplicate check, CALL plus" msgstr "Controllo duplicati, NOMINATIVO +" #: src/dialogs/confdialog.cxx:10794 msgid "On/Off" msgstr "On/Off" #: src/dialogs/confdialog.cxx:10795 msgid "Check for duplicates" msgstr "Controlla duplicati" #: src/dialogs/confdialog.cxx:10800 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:677 src/logbook/lgbook.cxx:1391 msgid "Band" msgstr "Banda" #: src/dialogs/confdialog.cxx:10801 msgid "Bands must match" msgstr "Le bande devono coincidere" #: src/dialogs/confdialog.cxx:10806 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:680 src/logbook/lgbook.cxx:955 #: src/logbook/lgbook.cxx:1619 src/logbook/lgbook.cxx:1674 msgid "Mode" msgstr "Modo" #: src/dialogs/confdialog.cxx:10807 msgid "Mode must match" msgstr "Il modo deve coincidere" #: src/dialogs/confdialog.cxx:10812 msgid "Time span over" msgstr "Arco di tempo" #: src/dialogs/confdialog.cxx:10813 msgid "QSO must not occur within a time period of" msgstr "Il QSO non si deve ripetere in un arco di tempo di" #: src/dialogs/confdialog.cxx:10818 msgid "Dup Color" msgstr "Colore duplicati" #: src/dialogs/confdialog.cxx:10819 msgid "Left click to select dup color" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/dialogs/confdialog.cxx:10827 #, fuzzy msgid "? Dup Color" msgstr "Duplicati ?" #: src/dialogs/confdialog.cxx:10828 #, fuzzy msgid "Left click to select possible dup color" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/dialogs/confdialog.cxx:10837 msgid "free form 1 must match" msgstr "il campo libero 1 deve coincidere" #: src/dialogs/confdialog.cxx:10843 msgid "State must match" msgstr "Lo stato deve coincidere" #: src/dialogs/confdialog.cxx:10848 msgid "minutes" msgstr "minuti" #: src/dialogs/confdialog.cxx:10849 msgid "Enter time span in minutes" msgstr "Inserisci l'arco temporale in minuti" #: src/dialogs/confdialog.cxx:10867 #, fuzzy msgid "Contest Exchange / Serial #" msgstr "Rapporto contest / Numero Seriale" #: src/dialogs/confdialog.cxx:10870 src/dialogs/confdialog.cxx:11704 #, fuzzy msgid "Send" msgstr "Invia" #: src/dialogs/confdialog.cxx:10871 msgid "free form exchange" msgstr "rapporto a formato libero" #: src/dialogs/confdialog.cxx:10885 #, fuzzy msgid "RST always 599/59" msgstr "RST sempre 599/59" #: src/dialogs/confdialog.cxx:10886 #, fuzzy msgid "Force RST in/out to 599/59" msgstr "Forza RST tx/rx a 599/59" #: src/dialogs/confdialog.cxx:10891 #, fuzzy msgid "Send CW cut #'s" msgstr "Invia numeri abbreviati in CW" #: src/dialogs/confdialog.cxx:10892 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:10899 #, fuzzy msgid "Start Nbr" msgstr "Parti da" #: src/dialogs/confdialog.cxx:10900 msgid "Starting number" msgstr "Numero di partenza" #: src/dialogs/confdialog.cxx:10915 msgid "Digits" msgstr "Cifre" #: src/dialogs/confdialog.cxx:10916 msgid "Number of digits in serial number" msgstr "Numero di cifre nel numero progressivo" #: src/dialogs/confdialog.cxx:10932 msgid "Use leading zeros" msgstr "Metti gli zeri davanti" #: src/dialogs/confdialog.cxx:10933 msgid "Insert leading zeros into Xmtd serial number" msgstr "Metti gli zeri davanti al numero seriale trasmesso" #: src/dialogs/confdialog.cxx:10938 src/dialogs/confdialog.cxx:15083 #: src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Azzera" #: src/dialogs/confdialog.cxx:10939 msgid "Initialize the QSO logging fields" msgstr "Inizializza i campi di log del QSO" #: src/dialogs/confdialog.cxx:10951 src/dialogs/confdialog.cxx:11000 #: src/dialogs/confdialog.cxx:11002 #, fuzzy msgid "Contests/Field Day" msgstr "Contest/Field Day" #: src/dialogs/confdialog.cxx:10955 src/logbook/lgbook.cxx:1255 #, fuzzy msgid "Operator Call" msgstr "Nome operatore" #: src/dialogs/confdialog.cxx:10956 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" "Nominatio Field Day\n" "Può coincidere con il nominativo OP" #: src/dialogs/confdialog.cxx:10970 #, fuzzy msgid "My Section" msgstr "La Mia Sezione" #: src/dialogs/confdialog.cxx:10971 #, fuzzy msgid "Field Day Section" msgstr "Sezione Field Day" #: src/dialogs/confdialog.cxx:10985 src/dialogs/confdialog.cxx:11012 msgid "My Class" msgstr "La Mia Classe" #: src/dialogs/confdialog.cxx:10986 msgid "Field Day Class" msgstr "Classe Field Day" #: src/dialogs/confdialog.cxx:11005 src/dialogs/confdialog.cxx:11064 #: src/dialogs/confdialog.cxx:11066 msgid "Contests/JOTA School" msgstr "Contest/JOTA School" #: src/dialogs/confdialog.cxx:11009 msgid "School Round Up" msgstr "School Round Up" #: src/dialogs/confdialog.cxx:11013 msgid "School Round Up - allowable I, H, O - see rules" msgstr "School Round Up - ammissibile I, H, O - vedi le regole" #: src/dialogs/confdialog.cxx:11029 msgid "Jamboree OTA" msgstr "Jamboree OTA" #: src/dialogs/confdialog.cxx:11032 msgid "My Troop" msgstr "Il Mio Gruppo" #: src/dialogs/confdialog.cxx:11033 msgid "My JOTA Troop" msgstr "Il Mio Gruppo JOTA" #: src/dialogs/confdialog.cxx:11047 msgid "Scout Op'" msgstr "Scout Op" #: src/dialogs/confdialog.cxx:11048 #, fuzzy msgid "Scout Operator Name" msgstr "Nomi degli operatori Scout" #: src/dialogs/confdialog.cxx:11070 src/dialogs/confdialog.cxx:11109 #: src/dialogs/confdialog.cxx:11111 msgid "IDs/CW" msgstr "IDs/CW" #: src/dialogs/confdialog.cxx:11074 msgid "CW Postamble ID" msgstr "ID CW a fine trasmissione" #: src/dialogs/confdialog.cxx:11077 msgid "Transmit callsign" msgstr "Trasmetti il nominativo" #: src/dialogs/confdialog.cxx:11078 msgid "Send Callsign in CW at end of every transmission" msgstr "Trasmetti il nominativo in CW alla fine di ogni trasmissione" #: src/dialogs/confdialog.cxx:11083 msgid "Speed (WPM):" msgstr "Velocità (WPM):" #: src/dialogs/confdialog.cxx:11084 msgid "Send at this WPM" msgstr "Invia a questa velocità WPM" #: src/dialogs/confdialog.cxx:11104 msgid "CW ID modes" msgstr "Modi ID CW" #: src/dialogs/confdialog.cxx:11114 src/dialogs/confdialog.cxx:11254 #: src/dialogs/confdialog.cxx:11256 msgid "IDs/RsID" msgstr "IDs/RsID" #: src/dialogs/confdialog.cxx:11118 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:11121 #, fuzzy msgid "Notify only" msgstr "Solo notifiche" #: src/dialogs/confdialog.cxx:11122 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Scegli questo per essere notificato quando un RSID viene ricevuto\n" "senza cambiare modem o frequenza" #: src/dialogs/confdialog.cxx:11128 #, fuzzy #| msgid "Rig mode" msgid "Rx modes" msgstr "Modo Radio" #: src/dialogs/confdialog.cxx:11131 #, fuzzy msgid "Mark prev freq/mode" msgstr "Marca frequenza e modo precedente" #: src/dialogs/confdialog.cxx:11132 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Inserisci un marker nel testo ricevuto\n" "prima di cambiare frequenza e modem" #: src/dialogs/confdialog.cxx:11137 msgid "Allow errors" msgstr "Permetti errori" #: src/dialogs/confdialog.cxx:11138 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Basso = zero errori\n" "Medio = 1 errore\n" "Alto = 2 errori" #: src/dialogs/confdialog.cxx:11149 msgid "Medium" msgstr "MEdio" #: src/dialogs/confdialog.cxx:11154 #, fuzzy msgid "Disable alert dialog" msgstr "Disabilita alert" #: src/dialogs/confdialog.cxx:11155 msgid "Do not show RsID alert dialog box" msgstr "Non mostrare la finestra di dialogo dell'alert RsID" #: src/dialogs/confdialog.cxx:11160 #, fuzzy msgid "Disables detector" msgstr "Disabilita decodificatore" #: src/dialogs/confdialog.cxx:11161 msgid "Disable further detection when RSID is received" msgstr "Disabilita ulteriori decodifiche quando viene ricevuto un RSID" #: src/dialogs/confdialog.cxx:11168 msgid "Retain tx freq lock" msgstr "Mantinei la frequenza di tx bloccata" #: src/dialogs/confdialog.cxx:11169 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" "Mantieni la frequenza di TX bloccata (Lk) quando cambi dalla frequenza RX " "RsID " #: src/dialogs/confdialog.cxx:11174 #, fuzzy msgid "Disable freq change" msgstr "Disabilita il cambio frequenza" #: src/dialogs/confdialog.cxx:11175 src/dialogs/confdialog.cxx:11181 msgid "Do not automatically change to RX RsID frequency" msgstr "Non cambiare automaticamente alla frequenza RX RsID" #: src/dialogs/confdialog.cxx:11180 msgid "Rx/Tx RsID EOT" msgstr "" #: src/dialogs/confdialog.cxx:11186 msgid "Squelch open (sec)" msgstr "Apri squelch (sec)" #: src/dialogs/confdialog.cxx:11187 src/dialogs/confdialog.cxx:11208 msgid "Use for triggering amplifier carrier detect" msgstr "Usalo per permettere a un amplificatore di accorgersi del segnale" #: src/dialogs/confdialog.cxx:11196 #, fuzzy #| msgid "" #| "The RsID notification message contents and\n" #| "display characteristics are configured on the\n" #| "\"Notifications\" configure dialog." msgid "" "The RsID notification message contents and display\n" "characteristics are configured on the \"Notifications\" tab." msgstr "" "Il contenuto del messaggio di notifica RsID e\n" "le caratteristche di visualizzazione sono configurate nel pannello\n" "di configurazione \"Notifiche\"." #: src/dialogs/confdialog.cxx:11204 msgid "Pre-Signal Tone" msgstr "Tono prima del segnale" #: src/dialogs/confdialog.cxx:11207 msgid "Seconds" msgstr "Secondi" #: src/dialogs/confdialog.cxx:11216 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:11219 msgid "Transmit modes" msgstr "Modi di trasmissione" #: src/dialogs/confdialog.cxx:11222 msgid "End of xmt ID" msgstr "Fine dell' ID di trasmissione" #: src/dialogs/confdialog.cxx:11223 #, fuzzy msgid "Add RsID signal to end of transmission" msgstr "Aggiungi il segnale RsID alla fine della trasmissione" #: src/dialogs/confdialog.cxx:11230 #, fuzzy msgid "Min BW Detection" msgstr "La Mia Sezione" #: src/dialogs/confdialog.cxx:11233 msgid "Hertz" msgstr "" #: src/dialogs/confdialog.cxx:11234 #, fuzzy #| msgid "Filter bandwidth" msgid "Minimum bandwidth" msgstr "Larghezza del filtro" #: src/dialogs/confdialog.cxx:11243 #, fuzzy #| msgid "Password" msgid "Passband" msgstr "Password" #: src/dialogs/confdialog.cxx:11244 #, fuzzy #| msgid "" #| "ON - search over entire waterfall\n" #| "OFF - limit search to +/- 200 Hz" msgid "" "ON - search over entire waterfall\n" "OFF - limit search to BW selector" msgstr "" "ON - cerca su tutto il waterfall\n" "OFF - limita la ricerca a +/- 200 Hz" #: src/dialogs/confdialog.cxx:11259 src/dialogs/confdialog.cxx:11335 #: src/dialogs/confdialog.cxx:11337 msgid "IDs/Video" msgstr "IDs/Video" #: src/dialogs/confdialog.cxx:11263 msgid "Video Preamble ID" msgstr "Preambolo identificativo visuale" #: src/dialogs/confdialog.cxx:11266 msgid "Transmit mode ID" msgstr "Trasmetti ID del modo" #: src/dialogs/confdialog.cxx:11267 msgid "Waterfall video ID" msgstr "Identificazione video del modo mostrata sul waterfall" #: src/dialogs/confdialog.cxx:11271 msgid "Transmit video text" msgstr "Trasmetti testo video" #: src/dialogs/confdialog.cxx:11272 msgid "Waterfall video text" msgstr "Testo visualizzato sul waterfall" #: src/dialogs/confdialog.cxx:11277 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:11278 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Limita a pochi caratteri,\n" "come CQEM o IOTA ecc." #: src/dialogs/confdialog.cxx:11292 msgid "Use small font" msgstr "Usa caratteri piccoli" #: src/dialogs/confdialog.cxx:11293 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "ON - caratteri piccoli\n" "OFF - caratteri grandi" #: src/dialogs/confdialog.cxx:11299 msgid "Chars/Row:" msgstr "Caratteri/Riga:" #: src/dialogs/confdialog.cxx:11300 msgid "Set the number of characters per row" msgstr "Imposta il numero di caratteri per riga" #: src/dialogs/confdialog.cxx:11320 msgid "500 Hz limit" msgstr "Limite a 500 Hz" #: src/dialogs/confdialog.cxx:11325 msgid "Mode width limit" msgstr "" "Limite secondo la \n" "larghezza del modo" #: src/dialogs/confdialog.cxx:11330 msgid "Video ID modes" msgstr "Modi ID video" #: src/dialogs/confdialog.cxx:11341 src/dialogs/confdialog.cxx:11398 #: src/dialogs/confdialog.cxx:11400 msgid "Logging/MacLogger" msgstr "Logging/MacLogger" #: src/dialogs/confdialog.cxx:11345 #, fuzzy msgid "Connect to MacLogger" msgstr "Connetti a MacLogger" #: src/dialogs/confdialog.cxx:11350 #, fuzzy msgid "Capture Radio Report" msgstr "Cattura il rapporto radio" #: src/dialogs/confdialog.cxx:11356 #, fuzzy msgid "Capture Log Report" msgstr "Cattura log" #: src/dialogs/confdialog.cxx:11361 #, fuzzy msgid "Capture Lookup " msgstr "Cattura lookup" #: src/dialogs/confdialog.cxx:11366 msgid "Capture Spot Tune" msgstr "Cattura Spot" #: src/dialogs/confdialog.cxx:11371 msgid "Capture Spot Report" msgstr "Cattura Rapporto Spot" #: src/dialogs/confdialog.cxx:11376 #, fuzzy msgid "Enable UDP log file" msgstr "Abilita file di log UDP" #: src/dialogs/confdialog.cxx:11381 #, fuzzy msgid "UDP data stream" msgstr "Flusso dati UDP" #: src/dialogs/confdialog.cxx:11389 msgid "Clear UDP text" msgstr "Cancella testo UDP" #: src/dialogs/confdialog.cxx:11392 msgid "Tune to Rx Spot" msgstr "" #: src/dialogs/confdialog.cxx:11393 #, fuzzy msgid "" "ON - use Rx spot freq\n" "OFF - use Tx spot freq" msgstr "" "ON - usa l'ultimo file delle macro\n" "OFF - usa il file predefinito" #: src/dialogs/confdialog.cxx:11403 src/dialogs/confdialog.cxx:11482 #: src/dialogs/confdialog.cxx:11484 msgid "Logging/N3FJP logs" msgstr "Logging/N3FJP logs" #: src/dialogs/confdialog.cxx:11407 msgid "TCP/IP Data Stream" msgstr "TCP/IP Flusso Dati" #: src/dialogs/confdialog.cxx:11412 #, fuzzy msgid "Clear text" msgstr "Cancella il testo" #: src/dialogs/confdialog.cxx:11415 msgid "Address" msgstr "Indirizzo" #: src/dialogs/confdialog.cxx:11416 msgid "N3FJP Server IP Address" msgstr "Indirizzo Server IP N3FJP" #: src/dialogs/confdialog.cxx:11430 src/dialogs/confdialog.cxx:15264 #: src/dialogs/confdialog.cxx:15288 src/dialogs/confdialog.cxx:15528 #: src/dialogs/confdialog.cxx:17016 src/dialogs/confdialog.cxx:17068 #: src/dialogs/confdialog.cxx:17115 src/dialogs/confdialog.cxx:17148 #: src/dialogs/confdialog.cxx:17368 #, fuzzy msgid "Port" msgstr "Porta" #: src/dialogs/confdialog.cxx:11431 msgid "N3FJP Server IP Port" msgstr "Porta Server IP N3FJP" #: src/dialogs/confdialog.cxx:11446 src/dialogs/confdialog.cxx:16948 #: src/dialogs/confdialog.cxx:17033 src/dialogs/confdialog.cxx:17047 #: src/dialogs/confdialog.cxx:17094 src/dialogs/confdialog.cxx:17160 #: src/dialogs/confdialog.cxx:17349 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" "Reimposta indirizzo e porta\n" "ai valori predefiniti." #: src/dialogs/confdialog.cxx:11449 #, fuzzy msgid "Enable Data Stream" msgstr "Abilita il flusso dati" #: src/dialogs/confdialog.cxx:11454 src/dialogs/confdialog.cxx:12842 #: src/dialogs/confdialog.cxx:13091 src/dialogs/confdialog.cxx:13390 #: src/dialogs/confdialog.cxx:15159 src/dialogs/confdialog.cxx:15543 msgid "Connect" msgstr "Connetti" #: src/dialogs/confdialog.cxx:11459 src/dialogs/confdialog.cxx:16450 msgid "Connected" msgstr "Connesso" #: src/dialogs/confdialog.cxx:11465 msgid "Center DXspot freq at sweet spot" msgstr "Centra la frequenza dello spot" #: src/dialogs/confdialog.cxx:11466 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "N3FJP DX Spot centrati in modalità swwet spot" #: src/dialogs/confdialog.cxx:11471 msgid "Report actual modem RF frequency" msgstr "Riporta l'attuale frequenza RF del modem" #: src/dialogs/confdialog.cxx:11472 msgid "Suppressed carrier +/- AF injection frequency" msgstr "Portante soppressa +/- AF iniezione frequenza" #: src/dialogs/confdialog.cxx:11477 msgid "PTT via and " msgstr "PTT via e " #: src/dialogs/confdialog.cxx:11487 src/dialogs/confdialog.cxx:11614 #: src/dialogs/confdialog.cxx:11616 #, fuzzy msgid "Logging/eQSL" msgstr "Logging/eQSL" #: src/dialogs/confdialog.cxx:11491 msgid "www url" msgstr "Indirizzo url" #: src/dialogs/confdialog.cxx:11492 src/dialogs/confdialog.cxx:11507 #: src/dialogs/confdialog.cxx:11542 msgid "Your login name" msgstr "Il tuo nome utente" #: src/dialogs/confdialog.cxx:11506 #, fuzzy msgid "User ID" msgstr "ID Utente" #: src/dialogs/confdialog.cxx:11522 msgid "Your login password" msgstr "La tua password d'accesso" #: src/dialogs/confdialog.cxx:11541 msgid "QTH Nickname" msgstr "QTH Nickname" #: src/dialogs/confdialog.cxx:11556 msgid "Verify" msgstr "Verifica" #: src/dialogs/confdialog.cxx:11557 msgid "Verify database with eQSL download file" msgstr "Verifica il database con il file scaricato da eQSL" #: src/dialogs/confdialog.cxx:11560 #, fuzzy msgid "Options" msgstr "Opzioni" #: src/dialogs/confdialog.cxx:11563 msgid "send when logged (log button, , )" msgstr "Invia quando messo a log (log button, , )" #: src/dialogs/confdialog.cxx:11564 msgid "automatic data upload" msgstr "carica i dati automaticamente" #: src/dialogs/confdialog.cxx:11569 msgid "Use date/time off for log entry" msgstr "Usa data/ora di fine per la messa a log" #: src/dialogs/confdialog.cxx:11570 msgid "default uses date/time on" msgstr "di default vengono usati data/ora di inizio" #: src/dialogs/confdialog.cxx:11575 src/dialogs/confdialog.cxx:11690 #, fuzzy msgid "Show delivery message" msgstr "Mostra messaggio di consegna" #: src/dialogs/confdialog.cxx:11576 src/dialogs/confdialog.cxx:11691 msgid "Display timed delivery message if enabled" msgstr "Mostra tempo di consegna se il messaggio è abilitato" #: src/dialogs/confdialog.cxx:11581 #, fuzzy msgid "Default message" msgstr "Messaggio predefiniti" #: src/dialogs/confdialog.cxx:11582 msgid "default text to send with etc" msgstr "il testo di default viene inviato con ecc" #: src/dialogs/confdialog.cxx:11596 msgid "Text Tags (tags use {} delimiters)" msgstr "Etichette Testuali (le etichette usano i delimitatori {})" #: src/dialogs/confdialog.cxx:11599 #, fuzzy msgid " {CALL} other ops call sign" msgstr "\tnominativo del corrispondente" #: src/dialogs/confdialog.cxx:11602 msgid " {MODE} full mode / submode" msgstr " {MODE} modo completo / sottomodello" #: src/dialogs/confdialog.cxx:11605 #, fuzzy msgid "{NAME} other ops name" msgstr "\tnome del corrispondente" #: src/dialogs/confdialog.cxx:11608 msgid "These tags can also be used in " msgstr "Questi tags possono essere usati anche in " #: src/dialogs/confdialog.cxx:11619 src/dialogs/confdialog.cxx:11751 #: src/dialogs/confdialog.cxx:11753 #, fuzzy msgid "Logging/LoTW" msgstr "Logging/LoTW" #: src/dialogs/confdialog.cxx:11623 msgid "tqsl:" msgstr "tqsl:" #: src/dialogs/confdialog.cxx:11624 #, fuzzy msgid "Enter full path-filename for tqsl executable" msgstr "Inserisci il percorso completo per l'eseguibile di tqsl" #: src/dialogs/confdialog.cxx:11638 #, fuzzy msgid "Your tqsl login password" msgstr "Login tqsl" #: src/dialogs/confdialog.cxx:11653 #, fuzzy msgid "Password required" msgstr "Password richiesta" #: src/dialogs/confdialog.cxx:11654 msgid "Submit password with each upload" msgstr "Invia la password ad ogni upload" #: src/dialogs/confdialog.cxx:11659 #, fuzzy msgid "Location" msgstr "Posizione" #: src/dialogs/confdialog.cxx:11660 msgid "tqsl station location" msgstr "Posizione della stazione tqsl" #: src/dialogs/confdialog.cxx:11674 src/dialogs/confdialog.cxx:16002 #: src/dialogs/confdialog.cxx:16020 src/dialogs/confdialog.cxx:16038 #: src/dialogs/confdialog.cxx:16056 src/dialogs/confdialog.cxx:16074 #: src/dialogs/confdialog.cxx:16092 src/dialogs/confdialog.cxx:16110 #, fuzzy msgid "Locate" msgstr "Trova" #: src/dialogs/confdialog.cxx:11675 #, fuzzy msgid "Locate tqsl executable" msgstr "Trova l'eseguibile di tqsl" #: src/dialogs/confdialog.cxx:11678 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "Modalità silenziosa [-q], non apre la finestra di dialogo di tqsl" #: src/dialogs/confdialog.cxx:11679 msgid "Operate tqsl in batch mode (no dialog)" msgstr "Utilizza tqsl in batch mode (nessuna finestra di dialogo)" #: src/dialogs/confdialog.cxx:11684 msgid "Send QSO data to LoTW when logged" msgstr "Invia dati del QSO a LoTW quando messo a log" #: src/dialogs/confdialog.cxx:11685 msgid "Submit each QSO as logged" msgstr "Invia ogni QSO come messo a log" #: src/dialogs/confdialog.cxx:11696 #, fuzzy msgid "Export" msgstr "Esporta" #: src/dialogs/confdialog.cxx:11697 msgid "Export records for LoTW upload" msgstr "Esporta i record per l'upload a LoTW" #: src/dialogs/confdialog.cxx:11700 src/logbook/lgbook.cxx:770 #: src/logbook/lgbook.cxx:1403 src/logbook/lgbook.cxx:1456 #, fuzzy msgid "Check" msgstr "Seleziona" #: src/dialogs/confdialog.cxx:11701 msgid "Review lotw.adif file before sending with tqsl" msgstr "Rivedi il file lotw.adif prima di inviarlo con tqsl" #: src/dialogs/confdialog.cxx:11705 msgid "Send lotw.adif via tqsl" msgstr "invia lotw.adif via tqsl" #: src/dialogs/confdialog.cxx:11708 msgid "Export logbook records for LoTW upload" msgstr "Esporta i record del log per l'pload a LoTW" #: src/dialogs/confdialog.cxx:11711 msgid "Review / edit the exported LoTW upload adif file" msgstr "Rivedi / modifica il file adif per il caricamento a LoTW" #: src/dialogs/confdialog.cxx:11714 msgid "Submit the upload adif file to LoTW" msgstr "Invia il file adif a LoTW" #: src/dialogs/confdialog.cxx:11717 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" "Devi avere tqsl installato e la sua posizione impostata perchè l'upload " "verso LoTW funzioni!" #: src/dialogs/confdialog.cxx:11725 msgid "Use this tqsl station location" msgstr "Usa la posizione di questa stazione in tqsl" #: src/dialogs/confdialog.cxx:11728 msgid "Match" msgstr "Confronta" #: src/dialogs/confdialog.cxx:11729 src/dialogs/confdialog.cxx:11736 msgid "Verify database with LoTW download file" msgstr "Verifica il database con il file di LoTW scaricato" #: src/dialogs/confdialog.cxx:11732 msgid "Match logbook records with LoTW download file" msgstr "Confronta il log con il file scaricato da LoTW" #: src/dialogs/confdialog.cxx:11735 msgid "View Unmatched" msgstr "Vedi non-corrispondenti" #: src/dialogs/confdialog.cxx:11740 #, fuzzy msgid "Timeout" msgstr "Tempo scaduto" #: src/dialogs/confdialog.cxx:11741 #, fuzzy msgid "Wait NN seconds for LoTW response" msgstr "Attenti NN secondi per la risposta da LoTW" #: src/dialogs/confdialog.cxx:11756 src/dialogs/confdialog.cxx:11807 #: src/dialogs/confdialog.cxx:11809 #, fuzzy #| msgid "Logging/Call Lookup" msgid "Logging/Cloudlog" msgstr "Logging/Nominativo Lookup" #: src/dialogs/confdialog.cxx:11760 msgid "This allows for logging of QSOs to a Cloudlog instance." msgstr "" #: src/dialogs/confdialog.cxx:11764 msgid "Enable Cloudlog API logging" msgstr "" #: src/dialogs/confdialog.cxx:11765 msgid "This enables logging of QSOs to Cloudlog via API" msgstr "" #: src/dialogs/confdialog.cxx:11770 msgid "API URL:" msgstr "" #: src/dialogs/confdialog.cxx:11771 msgid "Enter the URL of your Cloudlog API" msgstr "" #: src/dialogs/confdialog.cxx:11784 msgid "API Key:" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "Enter the API key for your Cloudlog instance" msgstr "" #: src/dialogs/confdialog.cxx:11798 #, fuzzy msgid "Station ID:" msgstr "Stazione QTH:" #: src/dialogs/confdialog.cxx:11803 src/dialogs/confdialog.cxx:16485 #: src/dialogs/confdialog.cxx:17555 src/dialogs/confdialog.cxx:17650 #: src/dialogs/confdialog.cxx:18174 src/dialogs/confdialog.cxx:18269 msgid "Initialize" msgstr "Inizializza" #: src/dialogs/confdialog.cxx:11804 msgid "Test API Key" msgstr "" #: src/dialogs/confdialog.cxx:11813 src/dialogs/confdialog.cxx:11893 #: src/dialogs/confdialog.cxx:11895 #, fuzzy msgid "Logging/QSO logging" msgstr "Log dei QSO" #: src/dialogs/confdialog.cxx:11817 #, fuzzy msgid "Prompt to save log on exit" msgstr "Chiedi di salvare il log all'uscita" #: src/dialogs/confdialog.cxx:11818 src/dialogs/confdialog.cxx:11887 #: src/dialogs/confdialog.cxx:19222 msgid "Bug me about saving log entries" msgstr "Annoiami con la richiesta di salvare il log" #: src/dialogs/confdialog.cxx:11823 msgid "Clear on save" msgstr "Cancella i campi quando salvi" #: src/dialogs/confdialog.cxx:11824 msgid "Clear log entries after saving or using macro " msgstr "Cancella i campi del log dopo aver salvato o usato la macro " #: src/dialogs/confdialog.cxx:11829 msgid "Convert callsign to upper case" msgstr "Converti il campo nominativo in maiuscolo" #: src/dialogs/confdialog.cxx:11830 msgid "Force callsign field to UPPERCASE" msgstr "Forza il campo nominativo in MAIUSCOLO" #: src/dialogs/confdialog.cxx:11835 msgid "Auto-fill Country and Azimuth" msgstr "Country e Azimuth automatici" #: src/dialogs/confdialog.cxx:11836 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Riempi i campi Country / Azimuth con le informazioni dal file cty.dat" #: src/dialogs/confdialog.cxx:11841 msgid "Sort by Date/Time OFF" msgstr "Ordina per data/ora di fine QSO" #: src/dialogs/confdialog.cxx:11842 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "" "Ordina il log in base all'ora/data di fine QSO\n" "Influisce su tutti i file esportati in ADIF/Cabrillo" #: src/dialogs/confdialog.cxx:11847 msgid "Date time ON == OFF" msgstr "Data di inizio == fine" #: src/dialogs/confdialog.cxx:11848 msgid "Force date/time ON == date/time OFF" msgstr "Forza data e ora di inizio e fine QSO uguali" #: src/dialogs/confdialog.cxx:11853 #, fuzzy msgid "Default RST in to 599/59" msgstr "RST ricevuto sempre 599/59" #: src/dialogs/confdialog.cxx:11854 #, fuzzy msgid "Clear log controls sets RST in to 599/59" msgstr "Premendo cancella log imposta RST a 599/59" #: src/dialogs/confdialog.cxx:11859 #, fuzzy msgid "Default RST out to 599/59" msgstr "RST inviato sempre 599/59" #: src/dialogs/confdialog.cxx:11860 #, fuzzy msgid "Clear log controls sets RST out to 599/59" msgstr "Premendo cancella log imposta RST dato automaticamente a 599" #: src/dialogs/confdialog.cxx:11865 msgid "Transmit Power" msgstr "Potenza di trasmissione" #: src/dialogs/confdialog.cxx:11866 msgid "Tx power used for logbook entries" msgstr "Potenza Tx usata nei campi del log" #: src/dialogs/confdialog.cxx:11880 #, fuzzy msgid "Display logbook read datum at start" msgstr "Mostra il nome del file di log all'avvio" #: src/dialogs/confdialog.cxx:11881 src/dialogs/confdialog.cxx:19372 msgid "The filename is written to the RX text area" msgstr "Il nome del file viene scritto nell'area del testo Rx" #: src/dialogs/confdialog.cxx:11886 msgid "Log power meter " msgstr "" #: src/dialogs/confdialog.cxx:11899 src/dialogs/confdialog.cxx:12167 #: src/dialogs/confdialog.cxx:12169 #, fuzzy msgid "Modem/CW/General" msgstr "Generale" #: src/dialogs/confdialog.cxx:11906 msgid "SOM decoding" msgstr "SOM decoding" #: src/dialogs/confdialog.cxx:11907 msgid "Self Organizing Mapping" msgstr "Self Organizing Mapping" #: src/dialogs/confdialog.cxx:11913 #, fuzzy #| msgid "Tracking" msgid "WPM Tracking" msgstr "Inseguimento" #: src/dialogs/confdialog.cxx:11914 msgid "Automatic Rx speed tracking" msgstr "Inseguimento automatico velocita' in ricezione" #: src/dialogs/confdialog.cxx:11920 msgid "Filter bandwidth" msgstr "Larghezza del filtro" #: src/dialogs/confdialog.cxx:11921 msgid "CW dsp filter bandwidth" msgstr "Larghezza del filtro dsp CW" #: src/dialogs/confdialog.cxx:11941 #, fuzzy msgid "Matched Filt'" msgstr "Filtro" #: src/dialogs/confdialog.cxx:11942 #, fuzzy msgid "Matched Filter bandwidth" msgstr "Larghezza del filtro" #: src/dialogs/confdialog.cxx:11948 #, fuzzy msgid "Rx WPM" msgstr "RX WPM" #: src/dialogs/confdialog.cxx:11954 msgid "Tracked CW speed in WPM" msgstr "Velocita' inseguita in CW (WPM)" #: src/dialogs/confdialog.cxx:11959 #, fuzzy msgid "Lower" msgstr "Limite inferiore" #: src/dialogs/confdialog.cxx:11960 msgid "Detector low threshold" msgstr "Rilevatore soglia bassa" #: src/dialogs/confdialog.cxx:11980 #, fuzzy msgid "Upper" msgstr "Limite superiore" #: src/dialogs/confdialog.cxx:11981 msgid "Detector high threshold" msgstr "Rilevatore soglia alta" #: src/dialogs/confdialog.cxx:12001 #, fuzzy msgid "Range" msgstr "Intervallo" #: src/dialogs/confdialog.cxx:12002 msgid "Range +/- wpm" msgstr "" "L'inseguimento avviene tra il valore corrente +/-\n" "il valore impostato in questo campo" #: src/dialogs/confdialog.cxx:12021 #, fuzzy msgid "Signal tracking" msgstr "Ricerca segnali" #: src/dialogs/confdialog.cxx:12024 msgid "Attack" msgstr "Attack" #: src/dialogs/confdialog.cxx:12030 msgid "Decay" msgstr "Decay" #: src/dialogs/confdialog.cxx:12046 #, fuzzy msgid "char WPM" msgstr "caratteri WPM" #: src/dialogs/confdialog.cxx:12047 src/dialogs/confdialog.cxx:12112 #: src/dialogs/confdialog.cxx:12139 msgid "My transmit CW WPM" msgstr "La mia velocitá di trasmissione in WPM" #: src/dialogs/confdialog.cxx:12068 msgid "The default CW speed" msgstr "La velocitá predefinita di trasmissione in CW" #: src/dialogs/confdialog.cxx:12087 src/dialogs/confdialog.cxx:19811 msgid "Lower limit" msgstr "Limite inferiore" #: src/dialogs/confdialog.cxx:12088 msgid "No slower than this" msgstr "Non piú piano di questo" #: src/dialogs/confdialog.cxx:12099 src/dialogs/confdialog.cxx:19856 msgid "Upper limit" msgstr "Limite superiore" #: src/dialogs/confdialog.cxx:12100 msgid "No faster than this" msgstr "Non piú veloce di questo" #: src/dialogs/confdialog.cxx:12111 #, fuzzy msgid "text WPM" msgstr "testo WPM" #: src/dialogs/confdialog.cxx:12132 msgid "Use Farnsworth timing" msgstr "Usa la spaziatura Farnsworth" #: src/dialogs/confdialog.cxx:12133 src/dialogs/confdialog.cxx:12160 msgid "text WPM <= char WPM" msgstr "testo WPM <= caratteri WPM" #: src/dialogs/confdialog.cxx:12138 #, fuzzy msgid "Spacing WPM" msgstr "Rng WPM" #: src/dialogs/confdialog.cxx:12159 #, fuzzy #| msgid "Use Farnsworth timing" msgid "Use Wordsworth timing" msgstr "Usa la spaziatura Farnsworth" #: src/dialogs/confdialog.cxx:12172 src/dialogs/confdialog.cxx:12370 #: src/dialogs/confdialog.cxx:12372 #, fuzzy msgid "Modem/CW/Timing and QSK" msgstr "Temporizzazione e QSK" #: src/dialogs/confdialog.cxx:12176 msgid "Timing" msgstr "Temporizzazione" #: src/dialogs/confdialog.cxx:12179 src/dialogs/confdialog.cxx:13130 msgid "Dash/Dot" msgstr "Linea/Punto" #: src/dialogs/confdialog.cxx:12180 src/dialogs/confdialog.cxx:13131 msgid "Dash to dot ratio" msgstr "Rapporto linea/punto" #: src/dialogs/confdialog.cxx:12198 src/dialogs/confdialog.cxx:12321 msgid "Edge timing" msgstr "Tempo di salita" #: src/dialogs/confdialog.cxx:12199 src/dialogs/confdialog.cxx:12322 msgid "Leading and Trailing edge risetimes (msec)" msgstr "Tempo in ms di salita/discesa dell'impulso" #: src/dialogs/confdialog.cxx:12217 msgid "Edge shape" msgstr "" "Forma d'onda\n" "al bordo" #: src/dialogs/confdialog.cxx:12218 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" "Hanning/Blackman - usa la sincronizzazione al bordo\n" "BPF - usa larghezza di banda BPF" #: src/dialogs/confdialog.cxx:12236 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12239 msgid "QSK on right audio channel" msgstr "QSK sul canale audio destro" #: src/dialogs/confdialog.cxx:12240 msgid "Generate square wave signal on right channel" msgstr "Genera un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:12245 #, fuzzy msgid "QSK frequency" msgstr "Frequenza radio" #: src/dialogs/confdialog.cxx:12246 msgid "Fundamental frequency of QSK square wave signal" msgstr "Frequenza fondamentale del segnale ad onda quadra QSK" #: src/dialogs/confdialog.cxx:12265 msgid "Pre-keydown timing (ms)" msgstr "Tempo prima dell'impulso (ms)" #: src/dialogs/confdialog.cxx:12266 msgid "Msec pre-keydown" msgstr "msec prima dell'impulso" #: src/dialogs/confdialog.cxx:12283 msgid "Post-keydown timing (ms)" msgstr "Tempo dopo l'impulso (ms)" #: src/dialogs/confdialog.cxx:12284 msgid "Msec post-keydown" msgstr "msec dopo l'impulso" #: src/dialogs/confdialog.cxx:12301 #, fuzzy msgid "QSK amplitude" msgstr "Ampiezza QSK" #: src/dialogs/confdialog.cxx:12302 msgid "Amplitude of right channel QSK signal" msgstr "Ampiezza del segnale QSK del canale destro" #: src/dialogs/confdialog.cxx:12342 #, fuzzy msgid "Send Test character" msgstr "invia carattere di prova" #: src/dialogs/confdialog.cxx:12345 msgid "Test char" msgstr "Carattere di prova" #: src/dialogs/confdialog.cxx:12346 msgid "Test character for QSK adjustment" msgstr "Carattere di prova per la regolazione del QSK" #: src/dialogs/confdialog.cxx:12362 msgid "Send continuously" msgstr "Invia continuamente" #: src/dialogs/confdialog.cxx:12363 msgid "Send a continuous stream of test characters" msgstr "Invia un flusso continuo di caratteri di prova" #: src/dialogs/confdialog.cxx:12375 src/dialogs/confdialog.cxx:12580 #: src/dialogs/confdialog.cxx:12582 #, fuzzy msgid "Modem/CW/Prosigns" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:12379 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" "Usa questa per WinKeyer\n" "e nanoCW" #: src/dialogs/confdialog.cxx:12382 msgid "\" RR" msgstr "\" RR" #: src/dialogs/confdialog.cxx:12383 msgid ".-..-." msgstr ".-..-." #: src/dialogs/confdialog.cxx:12385 msgid "$ SX" msgstr "$ SX" #: src/dialogs/confdialog.cxx:12386 msgid "...-..-" msgstr "...-..-" #: src/dialogs/confdialog.cxx:12388 msgid "' WG" msgstr "' WG" #: src/dialogs/confdialog.cxx:12389 msgid ".----." msgstr ".----." #: src/dialogs/confdialog.cxx:12391 msgid "( KN" msgstr "( KN" #: src/dialogs/confdialog.cxx:12392 msgid "-.--." msgstr "-.--." #: src/dialogs/confdialog.cxx:12394 msgid ") KK" msgstr ") KK" #: src/dialogs/confdialog.cxx:12395 msgid "-.--.-" msgstr "-.--.-" #: src/dialogs/confdialog.cxx:12397 msgid "+ AR" msgstr "+ AR" #: src/dialogs/confdialog.cxx:12398 src/dialogs/confdialog.cxx:12401 msgid ".-.-." msgstr ".-.-." #: src/dialogs/confdialog.cxx:12400 msgid "< AR" msgstr "< AR" #: src/dialogs/confdialog.cxx:12403 msgid "> SK" msgstr "> SK" #: src/dialogs/confdialog.cxx:12404 msgid "...-.-" msgstr "...-.-" #: src/dialogs/confdialog.cxx:12406 msgid "= BT" msgstr "= BT" #: src/dialogs/confdialog.cxx:12407 msgid "-...-" msgstr "-...-" #: src/dialogs/confdialog.cxx:12409 msgid "- DU" msgstr "- DU" #: src/dialogs/confdialog.cxx:12410 msgid "-....-" msgstr "-....-" #: src/dialogs/confdialog.cxx:12412 msgid "@@ AC" msgstr "@@ AC" #: src/dialogs/confdialog.cxx:12413 msgid ".--.-." msgstr ".--.-." #: src/dialogs/confdialog.cxx:12417 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12434 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12451 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12468 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12484 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12501 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12535 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12552 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12569 msgid "Use '(' paren not KN" msgstr "Usa '(' come parentesi, non KN" #: src/dialogs/confdialog.cxx:12574 msgid "Display decoded as assigned key" msgstr "Mostra quanto decodificato come chiave assegnata" #: src/dialogs/confdialog.cxx:12575 msgid "Display the decoded prosign in the RX text using the short cut key" msgstr "" "Visualizza il prosign decodificato nel testo RX usando il tasto di scelta " "rapida" #: src/dialogs/confdialog.cxx:12585 src/dialogs/confdialog.cxx:12683 #: src/dialogs/confdialog.cxx:12685 msgid "Modem/CW/Extended Chars." msgstr "Caratteri estesi" #: src/dialogs/confdialog.cxx:12589 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" "Seleziona per abilitare la codifica/decodifica dei caratteri\n" "Seleziona un carattere da ogni gruppo" #: src/dialogs/confdialog.cxx:12594 msgid "A aelig" msgstr "A aelig" #: src/dialogs/confdialog.cxx:12595 src/dialogs/confdialog.cxx:12601 #: src/dialogs/confdialog.cxx:12609 src/dialogs/confdialog.cxx:12617 #: src/dialogs/confdialog.cxx:12623 src/dialogs/confdialog.cxx:12629 #: src/dialogs/confdialog.cxx:12637 src/dialogs/confdialog.cxx:12643 #: src/dialogs/confdialog.cxx:12649 src/dialogs/confdialog.cxx:12655 #: src/dialogs/confdialog.cxx:12663 src/dialogs/confdialog.cxx:12669 #: src/dialogs/confdialog.cxx:12933 msgid "Swap left/right keyer contacts" msgstr "Scambia contatti del keyer sinistra/destra" #: src/dialogs/confdialog.cxx:12600 msgid " A umlaut" msgstr " A umlaut" #: src/dialogs/confdialog.cxx:12608 msgid " A ring" msgstr " A ring" #: src/dialogs/confdialog.cxx:12616 msgid " O acute" msgstr " O acute" #: src/dialogs/confdialog.cxx:12622 msgid " O slash" msgstr " O slash" #: src/dialogs/confdialog.cxx:12628 msgid " O umlaut" msgstr " O umlaut" #: src/dialogs/confdialog.cxx:12636 msgid " C cedilla" msgstr " C cedilla" #: src/dialogs/confdialog.cxx:12642 msgid " E grave" msgstr " E grave" #: src/dialogs/confdialog.cxx:12648 msgid " E acute" msgstr " E acute" #: src/dialogs/confdialog.cxx:12654 msgid " N tilde" msgstr " N tilde" #: src/dialogs/confdialog.cxx:12662 msgid " U umlaut" msgstr " U umlaut" #: src/dialogs/confdialog.cxx:12668 msgid " U circ" msgstr " U circ" #: src/dialogs/confdialog.cxx:12676 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" "Visita https://en.wikipedia.org/wiki/Morse_code\n" "per informazioni riguardantii caratteri Morse estesi." #: src/dialogs/confdialog.cxx:12688 msgid "Punctuation/Noise Processing" msgstr "" #: src/dialogs/confdialog.cxx:12692 #, fuzzy #| msgid "" #| "Check to enable character encode/decode\n" #| "Select one character from each group" msgid "Check to enable character encode/decode" msgstr "" "Seleziona per abilitare la codifica/decodifica dei caratteri\n" "Seleziona un carattere da ogni gruppo" #: src/dialogs/confdialog.cxx:12695 msgid " backslash \\ \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12696 src/dialogs/confdialog.cxx:12704 #: src/dialogs/confdialog.cxx:12712 src/dialogs/confdialog.cxx:12720 #: src/dialogs/confdialog.cxx:12728 src/dialogs/confdialog.cxx:12736 #: src/dialogs/confdialog.cxx:12744 src/dialogs/confdialog.cxx:12752 #: src/dialogs/confdialog.cxx:12760 src/dialogs/confdialog.cxx:12768 #: src/dialogs/confdialog.cxx:12776 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable for no printed character" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12703 msgid " apostrophe ' \".----.\"" msgstr "" #: src/dialogs/confdialog.cxx:12711 msgid " quote \" \".-..-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12719 msgid " dollar sign $ \"...-..-\"" msgstr "" #: src/dialogs/confdialog.cxx:12727 msgid " open_paren ( \"-.--.\"" msgstr "" #: src/dialogs/confdialog.cxx:12735 msgid " close paren ) \"-.--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12743 msgid " colon : \"---...\"" msgstr "" #: src/dialogs/confdialog.cxx:12751 msgid " semi colon ; \"-.-.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12759 msgid " underscore _ \"..--.-\"" msgstr "" #: src/dialogs/confdialog.cxx:12767 msgid " at symbol @@ \".--.-.\"" msgstr "" #: src/dialogs/confdialog.cxx:12775 msgid " exclamation ! \"-.-.--\"" msgstr "" #: src/dialogs/confdialog.cxx:12785 msgid "Unknown character decode (noise)" msgstr "" #: src/dialogs/confdialog.cxx:12788 msgid " Do not display unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12789 src/dialogs/confdialog.cxx:12796 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable '*'or no printed character" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12795 msgid " Display '*' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12802 msgid " Display '_' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12803 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable '_' for no printed character" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12809 msgid " Display ' ' character for unknown MORSE symbol" msgstr "" #: src/dialogs/confdialog.cxx:12810 #, fuzzy #| msgid "Enable this for Latin-1 accented characters" msgid "disable ' ' for no printed character" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12818 src/dialogs/confdialog.cxx:12820 #, fuzzy #| msgid "Modem/CW/nanoIO" msgid "Modem/CW/Punctuation-Noise" msgstr "nanoIO" #: src/dialogs/confdialog.cxx:12823 src/dialogs/confdialog.cxx:13067 #: src/dialogs/confdialog.cxx:13069 msgid "Modem/CW/WinKeyer" msgstr "WinKeyer" #: src/dialogs/confdialog.cxx:12827 src/dialogs/confdialog.cxx:13076 #: src/dialogs/confdialog.cxx:15144 #, fuzzy msgid "Ser. Port" msgstr "Porta seriale" #: src/dialogs/confdialog.cxx:12828 src/dialogs/confdialog.cxx:15529 #, fuzzy msgid "Xcvr serial port" msgstr "Porta seriale trasmettitore" #: src/dialogs/confdialog.cxx:12843 src/dialogs/confdialog.cxx:15544 #, fuzzy msgid "Connect / Disconnect from WinKeyer" msgstr "Connetti/disconnetti da WinKeyer" #: src/dialogs/confdialog.cxx:12847 msgid "Wait" msgstr "Attendi" #: src/dialogs/confdialog.cxx:12851 #, fuzzy msgid "Bk" msgstr "Sfondo" #: src/dialogs/confdialog.cxx:12855 msgid "Busy" msgstr "Occupato" #: src/dialogs/confdialog.cxx:12859 msgid "Bfr" msgstr "" #: src/dialogs/confdialog.cxx:12863 msgid "Key" msgstr "Tasto" #: src/dialogs/confdialog.cxx:12867 msgid "Keyer Mode" msgstr "Modo Keyer" #: src/dialogs/confdialog.cxx:12880 msgid "Hang" msgstr "Hang" #: src/dialogs/confdialog.cxx:12893 src/dialogs/confdialog.cxx:15617 msgid "Sidetone" msgstr "Banda laterale" #: src/dialogs/confdialog.cxx:12906 msgid "Output PIns" msgstr "Pin di output" #: src/dialogs/confdialog.cxx:12919 msgid "Use Pot" msgstr "Usa Pot" #: src/dialogs/confdialog.cxx:12920 msgid "Winkeyer pot controls WPM" msgstr "" #: src/dialogs/confdialog.cxx:12927 #, fuzzy msgid "WPM setting" msgstr "Impostazioni" #: src/dialogs/confdialog.cxx:12929 src/dialogs/confdialog.cxx:12958 #, fuzzy msgid "ModeReg" msgstr "Modo" #: src/dialogs/confdialog.cxx:12932 msgid "Swap" msgstr "Scambia" #: src/dialogs/confdialog.cxx:12937 msgid "Auto Space" msgstr "Spazio automatico" #: src/dialogs/confdialog.cxx:12938 #, fuzzy msgid "Enable paddle auto spacing of characters" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12942 msgid "CT space" msgstr "Spazio CT" #: src/dialogs/confdialog.cxx:12943 #, fuzzy msgid "Enable contest character spacing" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:12947 msgid "Paddle Dog" msgstr "Paddle Dog" #: src/dialogs/confdialog.cxx:12951 msgid "Cut 0/9" msgstr "Taglia 0/9" #: src/dialogs/confdialog.cxx:12952 msgid "Use T/N for 0/9" msgstr "Usa T/N per 0/9" #: src/dialogs/confdialog.cxx:12961 msgid "Paddle echo" msgstr "Paddle echo" #: src/dialogs/confdialog.cxx:12962 msgid "Echo paddle chars to Rx Panel" msgstr "Echo paddle chars to Rx Panel" #: src/dialogs/confdialog.cxx:12966 #, fuzzy msgid "Serial echo" msgstr "Echo seriale" #: src/dialogs/confdialog.cxx:12971 msgid "Tone Keyer" msgstr "Tono Keyer" #: src/dialogs/confdialog.cxx:12972 msgid "Enable Winkeyer tone keying" msgstr "Abilita Winkeyer tone keying" #: src/dialogs/confdialog.cxx:12976 #, fuzzy msgid "Tone ON" msgstr "Tono ON" #: src/dialogs/confdialog.cxx:12977 msgid "Enable Winkeyer audio tone" msgstr "Abilita Winkeyer audio tone" #: src/dialogs/confdialog.cxx:12981 msgid "PTT ON" msgstr "PTT ON" #: src/dialogs/confdialog.cxx:12982 msgid "Enable Winkeyer PTT output" msgstr "Abilita Winkeyer PTT output" #: src/dialogs/confdialog.cxx:12988 #, fuzzy msgid "WPM Settings" msgstr "Impostazioni WPM" #: src/dialogs/confdialog.cxx:12991 src/dialogs/confdialog.cxx:13211 #, fuzzy msgid "Min WPM" msgstr "Min WPM" #: src/dialogs/confdialog.cxx:12992 src/dialogs/confdialog.cxx:13212 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" "Impstazione minima WPM\n" "default = 10" #: src/dialogs/confdialog.cxx:13000 src/dialogs/confdialog.cxx:13221 #, fuzzy msgid "Rng WPM" msgstr "Rng WPM" #: src/dialogs/confdialog.cxx:13001 msgid "" "Range WPM setting\n" "default = 25" msgstr "" "Impostazione intervallo WPM\n" "default = 25" #: src/dialogs/confdialog.cxx:13005 msgid "Farsnworth" msgstr "Farsnworth" #: src/dialogs/confdialog.cxx:13006 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" "Farnsworth keying (0 = nessuno)\n" "default = 0" #: src/dialogs/confdialog.cxx:13010 #, fuzzy msgid "Cmd WPM" msgstr "Cmd WPM" #: src/dialogs/confdialog.cxx:13011 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" "Velocità WPM per stringa di comando WinKeyer\n" "default = 18" #: src/dialogs/confdialog.cxx:13017 #, fuzzy msgid "Timing/Settings" msgstr "Impostazioni" #: src/dialogs/confdialog.cxx:13020 #, fuzzy msgid "Ratio" msgstr "Proporzione" #: src/dialogs/confdialog.cxx:13021 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" "Keying ratio\n" "default = 3.0" #: src/dialogs/confdialog.cxx:13025 msgid "Comp" msgstr "Comp" #: src/dialogs/confdialog.cxx:13026 msgid "" "Compensation in msec\n" "default = 0" msgstr "" "Compensazione in msec\n" "default = 0" #: src/dialogs/confdialog.cxx:13030 msgid "1st Ext" msgstr "1st Ext" #: src/dialogs/confdialog.cxx:13031 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" "Durata extra al primo dit/dot in msec\n" "default = 0" #: src/dialogs/confdialog.cxx:13035 #, fuzzy msgid "Sample" msgstr "Campionamento" #: src/dialogs/confdialog.cxx:13036 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" "Campionamento paddle (vedi il manuale di Winkeyer)\n" "default = 50" #: src/dialogs/confdialog.cxx:13040 #, fuzzy msgid "Weight" msgstr "Peso" #: src/dialogs/confdialog.cxx:13041 msgid "" "Keying weight\n" "default = 50" msgstr "" "Keying peso\n" "default = 50" #: src/dialogs/confdialog.cxx:13045 msgid "Leadin" msgstr "Leadin" #: src/dialogs/confdialog.cxx:13046 msgid "" "Leadin in msec\n" "default = 0" msgstr "" "Leadin in msec\n" "default = 0" #: src/dialogs/confdialog.cxx:13050 msgid "Tail" msgstr "Coda" #: src/dialogs/confdialog.cxx:13051 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" "Estendi l'ultimo dit/dot in msec\n" "default = 0" #: src/dialogs/confdialog.cxx:13059 msgid "K3NG Arduino sketch emulation" msgstr "K3NG Arduino sketch emulation" #: src/dialogs/confdialog.cxx:13060 msgid "Activate for Mortty K3NG sketch" msgstr "Attivato per Mortty K3NG sketch" #: src/dialogs/confdialog.cxx:13072 src/dialogs/confdialog.cxx:13277 #: src/dialogs/confdialog.cxx:13279 msgid "Modem/CW/nanoIO" msgstr "nanoIO" #: src/dialogs/confdialog.cxx:13077 src/dialogs/confdialog.cxx:13376 #: src/dialogs/confdialog.cxx:15145 #, fuzzy msgid "nanoIO serial port" msgstr "Porta seriale nanoIO" #: src/dialogs/confdialog.cxx:13092 src/dialogs/confdialog.cxx:13391 #: src/dialogs/confdialog.cxx:15160 #, fuzzy msgid "Connect / Disconnect from nanoIO" msgstr "Connetti/disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:13095 msgid "Paddle" msgstr "Paddle" #: src/dialogs/confdialog.cxx:13096 msgid "CW wpm using paddle keyer" msgstr "CW wpm usando il keyer" #: src/dialogs/confdialog.cxx:13119 src/dialogs/confdialog.cxx:13239 #: src/dialogs/confdialog.cxx:13261 #, fuzzy msgid "Comp'" msgstr "Comp'" #: src/dialogs/confdialog.cxx:13120 msgid "CW wpm keyboard strings" msgstr "CW wpm keyboard strings" #: src/dialogs/confdialog.cxx:13149 #, fuzzy msgid "Baud" msgstr "Baud rate" #: src/dialogs/confdialog.cxx:13164 msgid "Keyer" msgstr "Keyer" #: src/dialogs/confdialog.cxx:13179 msgid "Incr'" msgstr "Incr" #: src/dialogs/confdialog.cxx:13195 src/dialogs/confdialog.cxx:15192 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "Scrivi lo stato della nanoIO sulla EEPROM Arduino" #: src/dialogs/confdialog.cxx:13198 src/dialogs/confdialog.cxx:15195 #, fuzzy msgid "Status" msgstr "Stato" #: src/dialogs/confdialog.cxx:13199 src/dialogs/confdialog.cxx:15196 msgid "Query state of nanoIO" msgstr "Interrogazione stato del nanoIO" #: src/dialogs/confdialog.cxx:13204 msgid "Use WPM pot'" msgstr "Usa WPM pot" #: src/dialogs/confdialog.cxx:13205 msgid "WPM pot update to nanoIO required" msgstr "aggiornamento WPM pot su nanoIO richiesto" #: src/dialogs/confdialog.cxx:13222 msgid "" "Range WPM setting\n" "default = 20" msgstr "" "Impostazione intervallo WPM\n" "default = 20" #: src/dialogs/confdialog.cxx:13233 #, fuzzy msgid "PTT off" msgstr "PTT off" #: src/dialogs/confdialog.cxx:13234 #, fuzzy msgid "Disable PTT" msgstr "Disabilita PTT" #: src/dialogs/confdialog.cxx:13242 #, fuzzy msgid "WPM" msgstr "WPM" #: src/dialogs/confdialog.cxx:13252 #, fuzzy msgid "Test =>" msgstr "Test =>" #: src/dialogs/confdialog.cxx:13253 #, fuzzy msgid "Send \"paris \" WPM times" msgstr "Invia a questa velocità WPM" #: src/dialogs/confdialog.cxx:13256 msgid "secs' =>" msgstr "secs' =>" #: src/dialogs/confdialog.cxx:13257 #, fuzzy msgid "Test duration (60 seconds)" msgstr "Durata del tono (secondi)" #: src/dialogs/confdialog.cxx:13262 msgid "Compensationin microseconds" msgstr "Compensazione in microsecondi" #: src/dialogs/confdialog.cxx:13266 msgid "Adjust" msgstr "Regola" #: src/dialogs/confdialog.cxx:13267 msgid "send compensation to nanoIO" msgstr "invia la compensazione al nanoIO" #: src/dialogs/confdialog.cxx:13272 msgid "CW i/o" msgstr "" #: src/dialogs/confdialog.cxx:13273 #, fuzzy msgid "Enable CW operation" msgstr "Abilita Winkeyer audio tone" #: src/dialogs/confdialog.cxx:13282 src/dialogs/confdialog.cxx:13404 #: src/dialogs/confdialog.cxx:13406 msgid "Modem/CW/DTR-RTS keying" msgstr "DTR-RTS keying" #: src/dialogs/confdialog.cxx:13288 #, fuzzy msgid "" "DTR/RTS keying may be assigned to flrig, share the RigCat serial port,\n" "share the Separate PTT serial port, or be assigned to separate serial port.\n" "\n" "No settings for baud, stops bits, etc are needed." msgstr "" "La codifica DTR / RTS può condividere la porta seriale RigCat o essere " "assegnata\n" "ad una porta seriale separata (tipica del ricetrasmettitore Yaesu FT-991A).\n" "Se separato, il controllo CAT può essere tramite flrig, RigCat o Hamlib.\n" "Nessuna impostazione per baud, stop bit, ecc. è necessaria." #: src/dialogs/confdialog.cxx:13297 msgid "Use flrig DTR/RTS keying" msgstr "" #: src/dialogs/confdialog.cxx:13303 #, fuzzy msgid "Disable flrig CW PTT" msgstr "Disabilita PTT" #: src/dialogs/confdialog.cxx:13304 src/dialogs/confdialog.cxx:13451 msgid "" "Required for some transceivers\n" "e.g. TS-480" msgstr "" #: src/dialogs/confdialog.cxx:13313 #, fuzzy msgid "Share RIGCAT port" msgstr "Usa porta seriale RIGCAT" #: src/dialogs/confdialog.cxx:13319 msgid "Share Separate PTT port" msgstr "" #: src/dialogs/confdialog.cxx:13325 msgid "CW Keyline" msgstr "CW Keyline" #: src/dialogs/confdialog.cxx:13340 #, fuzzy msgid "Keying compensation (msec)" msgstr "invia la compensazione al nanoIO" #: src/dialogs/confdialog.cxx:13341 msgid "Dot / Space timing increment" msgstr "" #: src/dialogs/confdialog.cxx:13359 #, fuzzy msgid "PTT keyline" msgstr "CW Keyline" #: src/dialogs/confdialog.cxx:13375 #, fuzzy msgid "Use Separate Keying Serial Port" msgstr "Il PTT usa una porta seriale separata" #: src/dialogs/confdialog.cxx:13395 msgid "Speed test" msgstr "" #: src/dialogs/confdialog.cxx:13396 msgid "1 minute 'PARIS '" msgstr "" #: src/dialogs/confdialog.cxx:13400 msgid "Result" msgstr "" #: src/dialogs/confdialog.cxx:13409 #, fuzzy #| msgid "Modem/CW/DTR-RTS keying" msgid "Modem/CW/CAT Keying" msgstr "DTR-RTS keying" #: src/dialogs/confdialog.cxx:13413 msgid "" "CW keying using CAT command strings. Available for supported transceivers.\n" "Use with RigCAT or flrig transceiver control. A separate serial port is NOT " "needed.\n" "\n" "Disable CAT PTT if transceiver interprets that as a keydown command (e.g. " "TS480).\n" "Recommend setting transceiver to either semi or full break-in.\n" "\n" "Enter correct CIV address for Icom transceivers." msgstr "" #: src/dialogs/confdialog.cxx:13424 msgid "Icom" msgstr "" #: src/dialogs/confdialog.cxx:13429 msgid "Hex CIV addr" msgstr "" #: src/dialogs/confdialog.cxx:13430 msgid "Enter transceiver HEX CIV address" msgstr "" #: src/dialogs/confdialog.cxx:13435 msgid "Elecraft" msgstr "" #: src/dialogs/confdialog.cxx:13440 msgid "Kenwood" msgstr "" #: src/dialogs/confdialog.cxx:13445 msgid "Yaesu" msgstr "" #: src/dialogs/confdialog.cxx:13450 #, fuzzy msgid "Disable CAT PTT" msgstr "Disabilita PTT" #: src/dialogs/confdialog.cxx:13456 src/dialogs/confdialog.cxx:13458 #, fuzzy #| msgid "Modem/CW/DTR-RTS keying" msgid "Modem/CW/CAT keying" msgstr "DTR-RTS keying" #: src/dialogs/confdialog.cxx:13461 #, fuzzy msgid "CW CAT & WinKeyer Compensation" msgstr "invia la compensazione al nanoIO" #: src/dialogs/confdialog.cxx:13465 msgid "" "Compute timing compensation for CAT CW and WinKeyer CW. Computation at " "current\n" "WPM . Set WPM to nominal (suggest 20 WPM).\n" "\n" "Compensation will be good over a +/- 10 WPM range. Calibration/Test is 1 " "minute of\n" "'PARIS '." msgstr "" #: src/dialogs/confdialog.cxx:13473 #, fuzzy msgid "Calibrate" msgstr "Velocitá di campionamento" #: src/dialogs/confdialog.cxx:13474 src/dialogs/confdialog.cxx:13489 msgid "Send WPM 'PARIS ' words" msgstr "" #: src/dialogs/confdialog.cxx:13477 #, fuzzy msgid "Compensate (secs)" msgstr "Lento (4 ms)" #: src/dialogs/confdialog.cxx:13485 #, fuzzy msgid "Clear compensation" msgstr "invia la compensazione al nanoIO" #: src/dialogs/confdialog.cxx:13488 src/dialogs/confdialog.cxx:14847 #: src/dialogs/confdialog.cxx:16157 src/dialogs/confdialog.cxx:16161 #: src/dialogs/confdialog.cxx:16165 src/dialogs/confdialog.cxx:16169 #: src/dialogs/confdialog.cxx:16173 src/dialogs/confdialog.cxx:16177 #: src/dialogs/confdialog.cxx:16181 src/dialogs/confdialog.cxx:18399 #: src/dialogs/confdialog.cxx:18428 src/dialogs/confdialog.cxx:18457 #: src/dialogs/confdialog.cxx:18486 src/dialogs/confdialog.cxx:18505 #, fuzzy msgid "Test" msgstr "Test" #: src/dialogs/confdialog.cxx:13492 #, fuzzy #| msgid "secs' =>" msgid "secs" msgstr "secs' =>" #: src/dialogs/confdialog.cxx:13498 src/dialogs/confdialog.cxx:13500 #, fuzzy msgid "Modem/CW/CAT comp'" msgstr "Modem/CW" #: src/dialogs/confdialog.cxx:13503 src/dialogs/confdialog.cxx:13591 #: src/dialogs/confdialog.cxx:13593 msgid "Modem/DominoEX" msgstr "DominoEX" #: src/dialogs/confdialog.cxx:13507 src/dialogs/confdialog.cxx:15724 msgid "Secondary Text" msgstr "Testo secondario" #: src/dialogs/confdialog.cxx:13508 src/dialogs/confdialog.cxx:15725 msgid "Text to send during keyboard idle times" msgstr "Testo da inviare durante i tempi morti della tastiera" #: src/dialogs/confdialog.cxx:13522 src/dialogs/confdialog.cxx:15739 msgid "Filtering" msgstr "Filtraggio" #: src/dialogs/confdialog.cxx:13523 msgid "Use DSP filter before decoder" msgstr "Usa il filtro DSP prima del decodificatore" #: src/dialogs/confdialog.cxx:13529 src/dialogs/confdialog.cxx:15746 msgid "Filter bandwidth factor" msgstr "Fattore di larghezza di banda del filtro" #: src/dialogs/confdialog.cxx:13530 src/dialogs/confdialog.cxx:15747 msgid "Filter bandwidth relative to signal width" msgstr "Larghezza di banda del filtro relativa alla larghezza del segnale" #: src/dialogs/confdialog.cxx:13548 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:13549 msgid "Enable MultiPSK-compatible FEC" msgstr "Abilita FEC compatibile con MultiPSK" #: src/dialogs/confdialog.cxx:13554 src/dialogs/confdialog.cxx:15765 msgid "CWI threshold" msgstr "Soglia CWI" #: src/dialogs/confdialog.cxx:13555 src/dialogs/confdialog.cxx:15766 msgid "CWI detection and suppression" msgstr "Rilevazione e soppressione CWI" #: src/dialogs/confdialog.cxx:13571 src/dialogs/confdialog.cxx:15801 msgid "Paths (hidden)" msgstr "Paths (hidden)" #: src/dialogs/confdialog.cxx:13596 src/dialogs/confdialog.cxx:13736 #: src/dialogs/confdialog.cxx:13738 msgid "Modem/Feld Hell" msgstr "Feld Hell" #: src/dialogs/confdialog.cxx:13600 #, fuzzy msgid "Hell Transmit Parameters" msgstr "Parametri di trasmissione Hell" #: src/dialogs/confdialog.cxx:13603 msgid "Transmit font" msgstr "Carattere in TX" #: src/dialogs/confdialog.cxx:13604 msgid "Select TX raster font" msgstr "Seleziona il carattere a scansione per la trasmissione" #: src/dialogs/confdialog.cxx:13620 msgid "Pulse shape" msgstr "Forma dell'impulso" #: src/dialogs/confdialog.cxx:13621 msgid "Raised cosine pulse shape factor" msgstr "Fattore di forma dell'impulso di tipo raised cosine" #: src/dialogs/confdialog.cxx:13632 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "" #: src/dialogs/confdialog.cxx:13637 msgid "Transmit periods (.) when idle" msgstr "Trasmetti punti (.) nei tempi morti" #: src/dialogs/confdialog.cxx:13638 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Trasmetti un punto quando non c'è attivitá sulla tastiera" #: src/dialogs/confdialog.cxx:13644 msgid "Tx Width Multiplier" msgstr "" #: src/dialogs/confdialog.cxx:13645 #, fuzzy msgid "Range 1...3" msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:13659 #, fuzzy msgid "Hell Receive Parameters" msgstr "Parametri di ricezione Hell" #: src/dialogs/confdialog.cxx:13662 msgid "Reverse video" msgstr "Inverti il video" #: src/dialogs/confdialog.cxx:13663 msgid "Display RX in reverse video" msgstr "Mostra il testo ricevuto a colori invertiti" #: src/dialogs/confdialog.cxx:13668 #, fuzzy msgid "Marquee text" msgstr "Testo scorrevole" #: src/dialogs/confdialog.cxx:13669 msgid "Display RX as a scrolling marquee" msgstr "Display RX as a scrolling marquee" #: src/dialogs/confdialog.cxx:13674 msgid "Rx Width Multiplier" msgstr "Moltiplicatore ampiezza Rx" #: src/dialogs/confdialog.cxx:13675 #, fuzzy msgid "Range 1...4" msgstr "Intervallo 1...4" #: src/dialogs/confdialog.cxx:13687 #, fuzzy msgid "Rx Height in pixels" msgstr "Altezza del waterfall in pixel" #: src/dialogs/confdialog.cxx:13688 msgid "May require resizing the Rx/Tx panel" msgstr "Può richiedere il ridimensionamento del pannello Rx/Tx" #: src/dialogs/confdialog.cxx:13700 msgid "Receive filter bandwidth" msgstr "Larghezza di banda del filtro di ricezione" #: src/dialogs/confdialog.cxx:13701 msgid "Adjust the DSP bandwidth" msgstr "Aggiusta la larghezza di banda DSP" #: src/dialogs/confdialog.cxx:13721 msgid "Rx AGC" msgstr "Rx AGC" #: src/dialogs/confdialog.cxx:13722 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "1 - Lento, 2 - Medium, 3 - Veloce" #: src/dialogs/confdialog.cxx:13741 src/dialogs/confdialog.cxx:13976 #: src/dialogs/confdialog.cxx:13978 #, fuzzy msgid "Modem/FMT" msgstr "MT-63" #: src/dialogs/confdialog.cxx:13745 msgid "Audio Stream Procesing" msgstr "" #: src/dialogs/confdialog.cxx:13748 src/dialogs/confdialog.cxx:18717 msgid "Sample rate" msgstr "Velocitá di campionamento" #: src/dialogs/confdialog.cxx:13749 #, fuzzy msgid "FMT sample rate" msgstr "Velocitá di campionamento" #: src/dialogs/confdialog.cxx:13764 msgid "Rx Codec PPM" msgstr "" #: src/dialogs/confdialog.cxx:13765 #, fuzzy msgid "Audio Codec ppm correction" msgstr "Correzione della scheda audio in ricezione" #: src/dialogs/confdialog.cxx:13776 msgid "Tracking" msgstr "Inseguimento" #: src/dialogs/confdialog.cxx:13779 msgid "Bgnd" msgstr "" #: src/dialogs/confdialog.cxx:13780 #, fuzzy msgid "Change plot background color" msgstr "Modifica al file macro" #: src/dialogs/confdialog.cxx:13783 msgid "Unkn" msgstr "" #: src/dialogs/confdialog.cxx:13784 msgid "Change plot unknown track color" msgstr "" #: src/dialogs/confdialog.cxx:13787 #, fuzzy msgid "Ref" msgstr "Inverti" #: src/dialogs/confdialog.cxx:13788 msgid "Change plot reference track color" msgstr "" #: src/dialogs/confdialog.cxx:13792 #, fuzzy msgid "Change Axis' color" msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:13795 msgid "Lgnd" msgstr "" #: src/dialogs/confdialog.cxx:13796 #, fuzzy msgid "Change legend color" msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:13799 msgid "Line/Axis" msgstr "" #: src/dialogs/confdialog.cxx:13800 #, fuzzy msgid "Enable to always plot data over axis" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/dialogs/confdialog.cxx:13805 #, fuzzy msgid "Thick lines" msgstr "Linee dispari" #: src/dialogs/confdialog.cxx:13806 msgid "Enable to plot track lines 3 pixels wide" msgstr "" #: src/dialogs/confdialog.cxx:13811 #, fuzzy msgid "Freq Correction" msgstr "Correzione" #: src/dialogs/confdialog.cxx:13812 msgid "Offset plot lines on vertical scale" msgstr "" #: src/dialogs/confdialog.cxx:13821 src/dialogs/confdialog.cxx:18829 msgid "@|<" msgstr "" #: src/dialogs/confdialog.cxx:13825 src/dialogs/confdialog.cxx:18843 msgid "@>|" msgstr "" #: src/dialogs/confdialog.cxx:13829 #, fuzzy #| msgid "Error" msgid "Max Error" msgstr "Errori" #: src/dialogs/confdialog.cxx:13830 msgid "Limit freq estimate error to this value" msgstr "" #: src/dialogs/confdialog.cxx:13841 msgid "DFT Estimator" msgstr "" #: src/dialogs/confdialog.cxx:13844 #, fuzzy msgid "Data Filter" msgstr "Filtro" #: src/dialogs/confdialog.cxx:13845 msgid "Moving average - average over NN seconds^0 - no averaging" msgstr "" #: src/dialogs/confdialog.cxx:13854 #, fuzzy msgid "DFT rate" msgstr "Genera TX" #: src/dialogs/confdialog.cxx:13855 #, fuzzy msgid "# DFT computations / second" msgstr "Durata del tono (secondi)" #: src/dialogs/confdialog.cxx:13872 #, fuzzy msgid "FIR Filter" msgstr "Filtro" #: src/dialogs/confdialog.cxx:13875 msgid "Width" msgstr "" #: src/dialogs/confdialog.cxx:13876 msgid "Band pass filter / unknown / reference" msgstr "" #: src/dialogs/confdialog.cxx:13886 msgid "bpf Unk'" msgstr "" #: src/dialogs/confdialog.cxx:13887 msgid "ON - band pass filter unknown signal" msgstr "" #: src/dialogs/confdialog.cxx:13892 msgid "bpf Ref'" msgstr "" #: src/dialogs/confdialog.cxx:13893 msgid "ON - band pass filter reference signal" msgstr "" #: src/dialogs/confdialog.cxx:13900 #, fuzzy msgid "CSV Data Recording" msgstr "SOM decoding" #: src/dialogs/confdialog.cxx:13903 msgid "Auto record" msgstr "" #: src/dialogs/confdialog.cxx:13904 msgid "Automatically start csv data file recording with wav playback" msgstr "" #: src/dialogs/confdialog.cxx:13908 msgid "Record data for NN minutes after auto start" msgstr "" #: src/dialogs/confdialog.cxx:13918 #, fuzzy msgid "Wav file recording" msgstr "Registrazione di Schede audio/File wav" #: src/dialogs/confdialog.cxx:13921 #, fuzzy msgid "Record Audio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:13922 msgid "Wav file recording - START IMMEDIATELY" msgstr "" #: src/dialogs/confdialog.cxx:13927 msgid "Sync to data record" msgstr "" #: src/dialogs/confdialog.cxx:13928 msgid "Wav file recording - SYNCHRONIZE with data recording" msgstr "" #: src/dialogs/confdialog.cxx:13933 msgid "File pathname:" msgstr "" #: src/dialogs/confdialog.cxx:13934 msgid "Computer generated file name" msgstr "" #: src/dialogs/confdialog.cxx:13942 msgid "" "Shft-click: select unknown\n" "Ctrl-click: select reference" msgstr "" #: src/dialogs/confdialog.cxx:13946 msgid "Center on Unknown" msgstr "" #: src/dialogs/confdialog.cxx:13947 msgid "Waterfall Centered on unknown signal" msgstr "" #: src/dialogs/confdialog.cxx:13952 #, fuzzy msgid "Center on Reference" msgstr "Centro Freq" #: src/dialogs/confdialog.cxx:13953 msgid "Waterfall centered on reference signal" msgstr "" #: src/dialogs/confdialog.cxx:13958 #, fuzzy msgid "Center on median" msgstr "Colore linea centrale" #: src/dialogs/confdialog.cxx:13959 msgid "Waterfall centered 1/2 way between unknown & reference" msgstr "" #: src/dialogs/confdialog.cxx:13968 #, fuzzy msgid "Use TAB delimiters" msgstr "Delimitatori di parola" #: src/dialogs/confdialog.cxx:13969 msgid "Use tab delimiters between columns on csv export file." msgstr "" #: src/dialogs/confdialog.cxx:13981 src/dialogs/confdialog.cxx:14192 #: src/dialogs/confdialog.cxx:14194 #, fuzzy msgid "Modem/FSQ" msgstr "FSQ" #: src/dialogs/confdialog.cxx:13985 msgid "Rx Parameters" msgstr "Parametri Rx" #: src/dialogs/confdialog.cxx:13988 msgid "Min Hits" msgstr "Suggerimenti minimali" #: src/dialogs/confdialog.cxx:13989 #, fuzzy msgid "Minimum # hits in tone detector" msgstr "Numero minimo di impulsi nel rilevatore di toni" #: src/dialogs/confdialog.cxx:14000 msgid "Image LPF" msgstr "Immagine LPF" #: src/dialogs/confdialog.cxx:14001 msgid "Narrow LPF if image noisy" msgstr "LPF stretto sel l'immagine è disturbata" #: src/dialogs/confdialog.cxx:14007 msgid "MovAvg:" msgstr "MovAvg:" #: src/dialogs/confdialog.cxx:14008 msgid "Filter FFT output" msgstr "Filtro FFt in uscita" #: src/dialogs/confdialog.cxx:14020 msgid "Heard aging" msgstr "Invecchiamneto sentito" #: src/dialogs/confdialog.cxx:14021 msgid "Remove call after ..." msgstr "Rimuovi nominativi dopo ..." #: src/dialogs/confdialog.cxx:14029 src/dialogs/confdialog.cxx:14201 msgid "Tx Parameters" msgstr "Parametri Tx" #: src/dialogs/confdialog.cxx:14032 msgid "1.5 baud" msgstr "1.5 baud" #: src/dialogs/confdialog.cxx:14037 msgid "2 baud" msgstr "2 baud" #: src/dialogs/confdialog.cxx:14042 msgid "3 baud" msgstr "3 baud" #: src/dialogs/confdialog.cxx:14047 msgid "4.5 baud" msgstr "4.5 baud" #: src/dialogs/confdialog.cxx:14052 msgid "6 baud" msgstr "6 baud" #: src/dialogs/confdialog.cxx:14057 src/dialogs/confdialog.cxx:15873 #, fuzzy msgid "Center freq" msgstr "Centro Freq" #: src/dialogs/confdialog.cxx:14063 #, fuzzy msgid "Sounder" msgstr "Scheda Audio" #: src/dialogs/confdialog.cxx:14064 msgid "Send beacon every ..." msgstr "Invia beacon ogni ..." #: src/dialogs/confdialog.cxx:14070 #, fuzzy msgid "Time out" msgstr "Tempo scaduto" #: src/dialogs/confdialog.cxx:14071 msgid "Time out xmt attempt in XX seconds" msgstr "Timeout tentativo di trasmissione in XX secondi" #: src/dialogs/confdialog.cxx:14081 msgid "QTC:" msgstr "QTC:" #: src/dialogs/confdialog.cxx:14082 #, fuzzy msgid "Enter QTC text" msgstr "Inserisci testo QTC" #: src/dialogs/confdialog.cxx:14086 #, fuzzy #| msgid "MYCALL always lower case" msgid "MYCALL lower case" msgstr "Il mio nominativo sempre in minuscolo" #: src/dialogs/confdialog.cxx:14087 src/dialogs/confdialog.cxx:14221 #, fuzzy msgid "convert operator callsign to lower case" msgstr "converti il campo nominativo operatore in minuscolo" #: src/dialogs/confdialog.cxx:14092 msgid "QTH:" msgstr "QTH:" #: src/dialogs/confdialog.cxx:14093 src/dialogs/confdialog.cxx:17235 msgid "Operators QTH" msgstr "QTH operatori" #: src/dialogs/confdialog.cxx:14109 #, fuzzy msgid "Message Logging" msgstr "Log Messaggi" #: src/dialogs/confdialog.cxx:14112 msgid "Add date/time" msgstr "Aggiungi data/ora" #: src/dialogs/confdialog.cxx:14113 msgid "Add date/time stamp to each # received message" msgstr "Aggiungi etichetta data/ora ogni # messagi ricevuti" #: src/dialogs/confdialog.cxx:14119 msgid "always append to file(s)" msgstr "aggiungi sempre al file(s)" #: src/dialogs/confdialog.cxx:14120 msgid "append # directive msgs to named file" msgstr "aggiungi # messaggi di direttiva nel file denominato" #: src/dialogs/confdialog.cxx:14126 #, fuzzy msgid "Notify time out" msgstr "Notifica il timeout" #: src/dialogs/confdialog.cxx:14127 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" "La finestra di dialogo di notifica si chiude dopo XX secondi; la finestra di " "dialogo ^j0 == rimane aperta" #: src/dialogs/confdialog.cxx:14142 src/dialogs/confdialog.cxx:14243 #, fuzzy msgid "Audit log" msgstr "Audit log" #: src/dialogs/confdialog.cxx:14145 src/dialogs/confdialog.cxx:14156 #: src/dialogs/confdialog.cxx:14246 src/dialogs/confdialog.cxx:14257 #: src/dialogs/confdialog.cxx:16335 src/dialogs/confdialog.cxx:18394 #: src/dialogs/confdialog.cxx:18423 src/dialogs/confdialog.cxx:18452 #: src/dialogs/confdialog.cxx:18481 src/dialogs/confdialog.cxx:18508 #: src/dialogs/confdialog.cxx:18634 msgid "Enable" msgstr "Abilita" #: src/dialogs/confdialog.cxx:14153 src/dialogs/confdialog.cxx:14254 msgid "Heard log" msgstr "Heard log" #: src/dialogs/confdialog.cxx:14166 #, fuzzy msgid "Text Colors" msgstr "Colore del testo" #: src/dialogs/confdialog.cxx:14170 #, fuzzy msgid "Transmit text" msgstr "Trasmetti testo" #: src/dialogs/confdialog.cxx:14175 msgid "DIRECTED" msgstr "DIRETTO" #: src/dialogs/confdialog.cxx:14176 msgid "Directed received text" msgstr "Diretta testo ricevuto" #: src/dialogs/confdialog.cxx:14181 msgid "UNDIRECTED" msgstr "INDIRETTO" #: src/dialogs/confdialog.cxx:14182 msgid "Undirected received text" msgstr "Indiretta testo ricevuto" #: src/dialogs/confdialog.cxx:14197 src/dialogs/confdialog.cxx:14279 #: src/dialogs/confdialog.cxx:14281 #, fuzzy msgid "Modem/IFKP" msgstr "IFKP" #: src/dialogs/confdialog.cxx:14204 #, fuzzy msgid "1/2 speed" msgstr "Velocità 1/2" #: src/dialogs/confdialog.cxx:14209 #, fuzzy msgid "1x speed" msgstr "Velocità 1x" #: src/dialogs/confdialog.cxx:14210 #, fuzzy msgid "default" msgstr "predefinito" #: src/dialogs/confdialog.cxx:14215 #, fuzzy msgid "2x speed" msgstr "Velocità 2x" #: src/dialogs/confdialog.cxx:14220 msgid "MYCALL always lower case" msgstr "Il mio nominativo sempre in minuscolo" #: src/dialogs/confdialog.cxx:14226 msgid "CALLSIGN always lower case" msgstr "NOMINATIVO corrispondente sempre in minuscolo" #: src/dialogs/confdialog.cxx:14227 #, fuzzy msgid "convert other callsign to lower case" msgstr "Converti il campo nominativo corrispondente in minuscolo" #: src/dialogs/confdialog.cxx:14232 msgid "lock WF at 1500 Hz" msgstr "Blocca WF a 1500 Hz" #: src/dialogs/confdialog.cxx:14233 msgid "Always transmit at 1500 Hertz center freq." msgstr "Trasmetti sempre a 1550Hz centro frequenza" #: src/dialogs/confdialog.cxx:14267 #, fuzzy msgid "" "\n" "Operator avatar" msgstr "Nome operatore" #: src/dialogs/confdialog.cxx:14284 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14355 #, fuzzy msgid "Modem/MT-63" msgstr "MT-63" #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14550 #, fuzzy msgid "8-bit extended characters (UTF-8)" msgstr "Caratteri estesi a 8 bit" #: src/dialogs/confdialog.cxx:14292 #, fuzzy msgid "Enable this for UTF-8 characters" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:14298 msgid "Long receive integration" msgstr "Integrazione di ricezione lunga" #: src/dialogs/confdialog.cxx:14299 msgid "Enable for very weak signals" msgstr "Abilitare per segnali molto deboli" #: src/dialogs/confdialog.cxx:14309 msgid "Transmit lower start tone" msgstr "Trasmetti il tono di avvio basso" #: src/dialogs/confdialog.cxx:14314 msgid "Transmit upper start tone" msgstr "Trasmetti il tono di avvio alto" #: src/dialogs/confdialog.cxx:14320 msgid "Tone Duration (secs)" msgstr "Durata del tono (secondi)" #: src/dialogs/confdialog.cxx:14336 msgid "Low tone at 500 Hz" msgstr "Tono basso a 550 Hz" #: src/dialogs/confdialog.cxx:14341 msgid "Centered at 1500 Hz (SHARES)" msgstr "Centrato a 1500 Hz (SHARES)" #: src/dialogs/confdialog.cxx:14346 #, fuzzy msgid "Manual tuning" msgstr "Sintonia manuale" #: src/dialogs/confdialog.cxx:14358 src/dialogs/confdialog.cxx:14454 #: src/dialogs/confdialog.cxx:14456 #, fuzzy msgid "Modem/Contestia" msgstr "Contestia" #: src/dialogs/confdialog.cxx:14364 src/dialogs/confdialog.cxx:14465 msgid "Bandwidth" msgstr "Larghezza di banda" #: src/dialogs/confdialog.cxx:14365 src/dialogs/confdialog.cxx:14466 msgid "Select bandwidth" msgstr "Seleziona la larghezza di banda" #: src/dialogs/confdialog.cxx:14381 src/dialogs/confdialog.cxx:14482 msgid "Tones" msgstr "Toni" #: src/dialogs/confdialog.cxx:14382 src/dialogs/confdialog.cxx:14483 msgid "Select number of tones" msgstr "Seleziona il numero di toni" #: src/dialogs/confdialog.cxx:14398 src/dialogs/confdialog.cxx:14499 msgid "Receive synchronizer" msgstr "Sincronizzatore di ricezione" #: src/dialogs/confdialog.cxx:14401 src/dialogs/confdialog.cxx:14502 msgid "Tune margin (tone frequency spacing)" msgstr "Margine di sintonia (spaziatura tra i toni)" #: src/dialogs/confdialog.cxx:14402 src/dialogs/confdialog.cxx:14421 #: src/dialogs/confdialog.cxx:14503 src/dialogs/confdialog.cxx:14523 msgid "Change ONLY to experiment" msgstr "Cambiare SOLO per sperimentare" #: src/dialogs/confdialog.cxx:14420 src/dialogs/confdialog.cxx:14522 msgid "Integration period (FEC blocks)" msgstr "Periodo d'integrazione (FEC blocks)" #: src/dialogs/confdialog.cxx:14441 msgid "8-bit extended characters" msgstr "Caratteri estesi a 8 bit" #: src/dialogs/confdialog.cxx:14442 msgid "Enable this for Latin-1 accented characters" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:14446 src/dialogs/confdialog.cxx:14556 msgid "xmt start/stop tones" msgstr "Tono di trasmissione start/stop" #: src/dialogs/confdialog.cxx:14447 src/dialogs/confdialog.cxx:14557 msgid "Enable this to send start/stop tones" msgstr "Abilita per inviare tono di start/stop" #: src/dialogs/confdialog.cxx:14459 src/dialogs/confdialog.cxx:14564 #: src/dialogs/confdialog.cxx:14566 msgid "Modem/Olivia" msgstr "Olivia" #: src/dialogs/confdialog.cxx:14542 msgid "Reset FEC blocks when changing BW or Tones" msgstr "Resetta blocchi FEC quando cambi BW o Toni" #: src/dialogs/confdialog.cxx:14543 src/dialogs/confdialog.cxx:14551 #, fuzzy msgid "Enable this for UTF-8 character transmission" msgstr "Abilitare per la trasmissione dei caratteri UTF-8" #: src/dialogs/confdialog.cxx:14569 src/dialogs/confdialog.cxx:14709 #: src/dialogs/confdialog.cxx:14711 #, fuzzy msgid "Modem/Psk" msgstr "Psk" #: src/dialogs/confdialog.cxx:14573 msgid "AFC behavior" msgstr "Comportamento AFC" #: src/dialogs/confdialog.cxx:14576 msgid "Acquisition search range (Hz)" msgstr "Raggio di ricerca per l'acquisizione (Hz)" #: src/dialogs/confdialog.cxx:14577 msgid "Capture signals within this frequency range" msgstr "Cattura i segnali all'interno di questo raggio di frequenza" #: src/dialogs/confdialog.cxx:14596 src/dialogs/confdialog.cxx:20095 msgid "Acquisition S/N (dB)" msgstr "S/N (dB) per l'acquisizione" #: src/dialogs/confdialog.cxx:14597 src/dialogs/confdialog.cxx:20096 msgid "Capture signals over this threshold" msgstr "Cattura i segnali oltre questa soglia" #: src/dialogs/confdialog.cxx:14618 msgid "S/N and IMD behavior" msgstr "Comportamento S/N e IMD" #: src/dialogs/confdialog.cxx:14621 msgid "after" msgstr "dopo" #: src/dialogs/confdialog.cxx:14622 msgid "Behavior of s/n imd" msgstr "Comportamento degli indicatori s/n e imd" #: src/dialogs/confdialog.cxx:14633 msgid "Dim" msgstr "Scurisci" #: src/dialogs/confdialog.cxx:14638 msgid "seconds" msgstr "secondi" #: src/dialogs/confdialog.cxx:14639 msgid "Will occur after this time in seconds" msgstr "Avverrà dopo questo tempo in secondi" #: src/dialogs/confdialog.cxx:14659 msgid "Multi-Channel Signal Processing" msgstr "Elaborazione di segnale multicanale" #: src/dialogs/confdialog.cxx:14662 msgid "Multi-channel detector" msgstr "Decodificatore Multicanale" #: src/dialogs/confdialog.cxx:14667 #, fuzzy #| msgid "Disable on very slow CPUs of if signal browser is not used" msgid "Disable on very slow CPUs or if signal browser is not used" msgstr "Disabilita su CPU molto lente o se il navigatore non è usato" #: src/dialogs/confdialog.cxx:14672 msgid "8 psk" msgstr "8 psk" #: src/dialogs/confdialog.cxx:14675 msgid "Pilot tone" msgstr "Tono pilota" #: src/dialogs/confdialog.cxx:14676 msgid "Enable encode/decode vestigial pilot tone" msgstr "Abilita codifica / decodifica del tono pilota vestigiale" #: src/dialogs/confdialog.cxx:14681 msgid "pilot power (dB)" msgstr "Potenza pilota (dB)" #: src/dialogs/confdialog.cxx:14682 #, fuzzy msgid "Pilot tone power relative to signal" msgstr "Larghezza di banda del filtro relativa alla larghezza del segnale" #: src/dialogs/confdialog.cxx:14701 #, fuzzy msgid "Short Preamble" msgstr "Preambolo corto" #: src/dialogs/confdialog.cxx:14702 #, fuzzy msgid "Enable short preamble for 8PSK transmission" msgstr "Abilitare per i caratteri accentati Latin-1" #: src/dialogs/confdialog.cxx:14714 src/dialogs/confdialog.cxx:14852 #: src/dialogs/confdialog.cxx:14854 msgid "Modem/TTY/Rx" msgstr "Rx" #: src/dialogs/confdialog.cxx:14721 msgid "AFC speed" msgstr "Velocità AFC" #: src/dialogs/confdialog.cxx:14722 msgid "AFC tracking speed" msgstr "Velocità di tracciamento AFC" #: src/dialogs/confdialog.cxx:14738 #, fuzzy msgid "RX - unshift on space" msgstr "Togli shift dopo spazio" #: src/dialogs/confdialog.cxx:14739 #, fuzzy msgid "Revert to unshifted char's on a space" msgstr "Ritorna a caratteri normali (unshifted) dopo uno spazio" #: src/dialogs/confdialog.cxx:14744 #, fuzzy msgid "Filter Shape Factor" msgstr "Fattore di larghezza di banda del filtro" #: src/dialogs/confdialog.cxx:14745 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" #: src/dialogs/confdialog.cxx:14755 #, fuzzy msgid "Decode (CWI suppression)" msgstr "Rilevazione e soppressione CWI" #: src/dialogs/confdialog.cxx:14758 msgid "Mark-Space" msgstr "Mark-Space" #: src/dialogs/confdialog.cxx:14763 msgid "Mark only" msgstr "Mark only" #: src/dialogs/confdialog.cxx:14768 msgid "Space only" msgstr "Space only" #: src/dialogs/confdialog.cxx:14775 msgid "RTTY Scope Display" msgstr "RTTY Scope Display" #: src/dialogs/confdialog.cxx:14778 msgid "Use cross hair scope" msgstr "Usa oscilloscopio a croce" #: src/dialogs/confdialog.cxx:14779 msgid "Default to cross hair digiscope" msgstr "Imposta l'oscilloscopio a croce come predefinito" #: src/dialogs/confdialog.cxx:14784 msgid "XY - classic scope" msgstr "XY - classic scope" #: src/dialogs/confdialog.cxx:14785 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" "Abilitato - usa filtri Mark/Space in uscita\n" "Disabilitato - usa pseudo segnali" #: src/dialogs/confdialog.cxx:14792 #, fuzzy msgid "Log RTTY frequency" msgstr "Log frequenza RTTY" #: src/dialogs/confdialog.cxx:14795 msgid "Use MARK freq'" msgstr "Usa frequenza MARK" #: src/dialogs/confdialog.cxx:14796 src/dialogs/confdialog.cxx:14816 #: src/dialogs/confdialog.cxx:14824 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" "Abilitato - metti a log utilizzando la frequenza del Mark\n" "Disabled - metti a log utilizzando il centro frequenza" #: src/dialogs/confdialog.cxx:14803 #, fuzzy msgid "track color" msgstr "colore traccia" #: src/dialogs/confdialog.cxx:14804 msgid "Color of Mark Track" msgstr "Colore della traccia Mark" #: src/dialogs/confdialog.cxx:14812 #, fuzzy msgid "RTTY Bell" msgstr "Campana RTTY" #: src/dialogs/confdialog.cxx:14815 msgid "Audible BELL" msgstr "CAMPANA Udibile" #: src/dialogs/confdialog.cxx:14823 #, fuzzy msgid "Visible BELL" msgstr "CAMPANA Visibile" #: src/dialogs/confdialog.cxx:14831 msgid "RTTY Bell audio wav" msgstr "RTTY Campana audio wav" #: src/dialogs/confdialog.cxx:14838 src/dialogs/confdialog.cxx:18385 #: src/dialogs/confdialog.cxx:18414 src/dialogs/confdialog.cxx:18443 #: src/dialogs/confdialog.cxx:18472 src/dialogs/confdialog.cxx:18496 #, fuzzy msgid "Sound:" msgstr "Suono:" #: src/dialogs/confdialog.cxx:14857 src/dialogs/confdialog.cxx:15028 #: src/dialogs/confdialog.cxx:15030 msgid "Modem/TTY/Tx" msgstr "Tx" #: src/dialogs/confdialog.cxx:14861 #, fuzzy msgid "Sound Card FSK" msgstr "Scheda Audio FSK" #: src/dialogs/confdialog.cxx:14864 src/dialogs/confdialog.cxx:15099 msgid "Carrier shift" msgstr "" "Scostamento \n" "della portante" #: src/dialogs/confdialog.cxx:14865 msgid "Select carrier shift" msgstr "Seleziona lo scostamento della portante" #: src/dialogs/confdialog.cxx:14880 msgid "Custom shift" msgstr "" "Scostamento \n" "personalizzato" #: src/dialogs/confdialog.cxx:14881 msgid "Input carrier shift" msgstr "Scostamento della portante in ingresso" #: src/dialogs/confdialog.cxx:14899 src/dialogs/confdialog.cxx:15399 #: src/dialogs/confdialog.cxx:15553 msgid "Baud rate" msgstr "Baud rate" #: src/dialogs/confdialog.cxx:14900 msgid "Select carrier baudrate" msgstr "Seleziona la velocitá in baud della portante" #: src/dialogs/confdialog.cxx:14916 msgid "Bits per character" msgstr "Bit per carattere" #: src/dialogs/confdialog.cxx:14917 msgid "Select # bits / char" msgstr "Seleziona il numero di bit per carattere" #: src/dialogs/confdialog.cxx:14932 msgid "Parity" msgstr "Parità" #: src/dialogs/confdialog.cxx:14933 msgid "Select parity" msgstr "Seleziona la parità" #: src/dialogs/confdialog.cxx:14948 src/dialogs/confdialog.cxx:15415 #: src/dialogs/confdialog.cxx:15569 msgid "Stop bits" msgstr "Bit arresto" #: src/dialogs/confdialog.cxx:14949 msgid "Select # stop bits" msgstr "Seleziona il numero di bit d'arresto" #: src/dialogs/confdialog.cxx:14964 msgid "AutoCRLF" msgstr "AutoCRLF" #: src/dialogs/confdialog.cxx:14965 msgid "Add CRLF after page width characters" msgstr "Aggiungi CRLF quando raggiungi la larghezza della pagina" #: src/dialogs/confdialog.cxx:14970 #, fuzzy msgid "chars" msgstr "caratteri" #: src/dialogs/confdialog.cxx:14971 msgid "Auto CRLF line length" msgstr "" #: src/dialogs/confdialog.cxx:14989 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:14990 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Usa \"cr cr lf\" al posto di \"cr lf\"" #: src/dialogs/confdialog.cxx:14996 #, fuzzy msgid "TX - unshift on space" msgstr "Togli shift dopo spazio" #: src/dialogs/confdialog.cxx:14997 msgid "Revert to Unsifted char's on a space" msgstr "Ritorna a caratteri normali (unshifted) dopo uno spazio" #: src/dialogs/confdialog.cxx:15002 msgid "Shaped Tx" msgstr "Forma d'onda Tx" #: src/dialogs/confdialog.cxx:15003 msgid "Use wave shaping on Tx signal" msgstr "usa la forma d'onda sul segnale Tx" #: src/dialogs/confdialog.cxx:15009 #, fuzzy msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK sul canale audio destro" #: src/dialogs/confdialog.cxx:15010 #, fuzzy msgid "Create keyed square wave on right audio channel" msgstr "Crea un segnale a onda quadra sul canale audio destro" #: src/dialogs/confdialog.cxx:15015 #, fuzzy msgid "LTRS at start" msgstr "Parti da" #: src/dialogs/confdialog.cxx:15016 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "Inserire NN byte LTRS all'inizio di ogni trasmissione" #: src/dialogs/confdialog.cxx:15033 src/dialogs/confdialog.cxx:15135 #: src/dialogs/confdialog.cxx:15137 #, fuzzy msgid "Modem/TTY/FSK" msgstr "Modem/TTY" #: src/dialogs/confdialog.cxx:15037 #, fuzzy #| msgid "DTR is PTT signal line" msgid "DTR/RTS signal line FSK" msgstr "DTR controlla il PTT" #: src/dialogs/confdialog.cxx:15040 src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Abilitato" #: src/dialogs/confdialog.cxx:15041 #, fuzzy msgid "Enable FSK on serial port" msgstr "Porta seriale nanoIO" #: src/dialogs/confdialog.cxx:15047 msgid "Shares RIGIO serial port, or uses" msgstr "" #: src/dialogs/confdialog.cxx:15048 #, fuzzy msgid "Share the RIGIO port" msgstr "Usa porta seriale RIGCAT" #: src/dialogs/confdialog.cxx:15054 #, fuzzy msgid "Serial Port" msgstr "Porta seriale" #: src/dialogs/confdialog.cxx:15055 #, fuzzy msgid "FSK independent serial port" msgstr "Keyline su porta seriale separata" #: src/dialogs/confdialog.cxx:15069 msgid "MARK/SPACE reversed" msgstr "" #: src/dialogs/confdialog.cxx:15070 #, fuzzy #| msgid "Mark-Space" msgid "Reverse Mark/Space" msgstr "Mark-Space" #: src/dialogs/confdialog.cxx:15076 src/dialogs/confdialog.cxx:18252 msgid "Use DTR" msgstr "Usa DTR" #: src/dialogs/confdialog.cxx:15077 msgid "Enable DTR signal line, default is RTS" msgstr "" #: src/dialogs/confdialog.cxx:15084 msgid "" "Restart the FSK interface\n" "Necessary if changes made to configuration" msgstr "" #: src/dialogs/confdialog.cxx:15088 msgid "Mark" msgstr "Mark" #: src/dialogs/confdialog.cxx:15089 #, fuzzy msgid "Mark frequency in Hertz" msgstr "Frequenza Mark in MHz" #: src/dialogs/confdialog.cxx:15100 #, fuzzy msgid "Carrier shift in Hertz" msgstr "" "Scostamento \n" "della portante" #: src/dialogs/confdialog.cxx:15115 #, fuzzy #| msgid "Stop bits" msgid "1.5 stop bits" msgstr "Bit arresto" #: src/dialogs/confdialog.cxx:15116 msgid "" "Enabled - 1.5 stop bits\n" "Disabled - 2 stop bits" msgstr "" #: src/dialogs/confdialog.cxx:15126 msgid "Use flrig FSK keying" msgstr "" #: src/dialogs/confdialog.cxx:15127 msgid "Enable to use flrig FSK keyer" msgstr "" #: src/dialogs/confdialog.cxx:15140 src/dialogs/confdialog.cxx:15252 #: src/dialogs/confdialog.cxx:15254 msgid "Modem/TTY/nanoIO" msgstr "nanoIO" #: src/dialogs/confdialog.cxx:15163 #, fuzzy msgid "Serial Baud" msgstr "Seriale trasmesso" #: src/dialogs/confdialog.cxx:15178 msgid "USB serial I/O" msgstr "USB serial I/O" #: src/dialogs/confdialog.cxx:15199 msgid "MARK polarity" msgstr "Polarità MARK" #: src/dialogs/confdialog.cxx:15200 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" "Imposta - mark come logica ALTA\n" "Leggi da nanoIO" #: src/dialogs/confdialog.cxx:15205 #, fuzzy msgid "TTY Baud" msgstr "Baud rate" #: src/dialogs/confdialog.cxx:15206 msgid "nanoIO - TTY baud" msgstr "nanoIO - TTY baud" #: src/dialogs/confdialog.cxx:15222 msgid "Debug Output" msgstr "" #: src/dialogs/confdialog.cxx:15232 #, fuzzy msgid "Clear Sent" msgstr "Cancella il testo" #: src/dialogs/confdialog.cxx:15235 #, fuzzy msgid "Clear Both" msgstr "Cancella il testo" #: src/dialogs/confdialog.cxx:15238 #, fuzzy msgid "Clear Rcvd" msgstr "Cancella" #: src/dialogs/confdialog.cxx:15247 #, fuzzy msgid "TTY i/o" msgstr "Testo i/o" #: src/dialogs/confdialog.cxx:15248 #, fuzzy msgid "Enable TTY operation" msgstr "Abilita decodifica ed estrazione" #: src/dialogs/confdialog.cxx:15257 src/dialogs/confdialog.cxx:15485 #: src/dialogs/confdialog.cxx:15487 msgid "Modem/TTY/Navigator" msgstr "Navigatore" #: src/dialogs/confdialog.cxx:15261 #, fuzzy msgid "FSK Interface" msgstr "Interfaccia FSK" #: src/dialogs/confdialog.cxx:15265 #, fuzzy msgid "Navigator serial port" msgstr "Navigatore Porta seriale" #: src/dialogs/confdialog.cxx:15279 #, fuzzy msgid "FSK" msgstr "FSK" #: src/dialogs/confdialog.cxx:15280 #, fuzzy msgid "Connect / Disconnect from Nav FSK port" msgstr "Connetti / Disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:15285 src/dialogs/confdialog.cxx:15550 msgid "Configuration Interface" msgstr "Configurazione Interfaccia" #: src/dialogs/confdialog.cxx:15289 #, fuzzy msgid "Navigator configuration port" msgstr "Configurazione di Fldigi" #: src/dialogs/confdialog.cxx:15303 #, fuzzy msgid "Channel 1 Attenuator" msgstr "Canale 1 Attenuatore" #: src/dialogs/confdialog.cxx:15304 msgid "Nav Channel 1 attenuator" msgstr "Nav Canale 1 Attenuatore" #: src/dialogs/confdialog.cxx:15319 #, fuzzy msgid "Channel 2 attenuator" msgstr "Canale 2 Attenuatore" #: src/dialogs/confdialog.cxx:15320 msgid "NavChannel 2 Attenuator" msgstr "Nav Canale 2 Attenuatore" #: src/dialogs/confdialog.cxx:15335 msgid "RF attenuator" msgstr "Attenuatore RF" #: src/dialogs/confdialog.cxx:15336 msgid "NavRF Attenuator" msgstr "NAv Attenuatore RF" #: src/dialogs/confdialog.cxx:15351 msgid "WinKey PTT" msgstr "WinKey PTT" #: src/dialogs/confdialog.cxx:15352 src/dialogs/confdialog.cxx:15586 msgid "NavWinkey PTT" msgstr "NavWinKey PTT" #: src/dialogs/confdialog.cxx:15367 msgid "LED brightness" msgstr "Luminosità LED" #: src/dialogs/confdialog.cxx:15368 msgid "NavLED brightness" msgstr "NavLuminosità LED" #: src/dialogs/confdialog.cxx:15383 msgid "CAT LED state" msgstr "" #: src/dialogs/confdialog.cxx:15384 msgid "NavCAT state LED" msgstr "NavCAT stato LED" #: src/dialogs/confdialog.cxx:15400 src/dialogs/confdialog.cxx:15554 #, fuzzy msgid "Nav FSK baud rate" msgstr "Baud rate della porta seriale" #: src/dialogs/confdialog.cxx:15416 src/dialogs/confdialog.cxx:15570 #, fuzzy msgid "Nav FSK Stop bits" msgstr "Bit arresto" #: src/dialogs/confdialog.cxx:15431 src/dialogs/confdialog.cxx:15601 #, fuzzy msgid "Mark Polarity" msgstr "Parità" #: src/dialogs/confdialog.cxx:15432 src/dialogs/confdialog.cxx:15602 msgid "Nav FSK MARK Polarity" msgstr "Nav FSK MARK Polarity" #: src/dialogs/confdialog.cxx:15447 msgid "Side tone" msgstr "Side tone" #: src/dialogs/confdialog.cxx:15448 src/dialogs/confdialog.cxx:15618 #: src/dialogs/confdialog.cxx:15634 msgid "Nav FSK side tone" msgstr "Nav FSK side tone" #: src/dialogs/confdialog.cxx:15463 msgid "FSK PTT" msgstr "FSK PTT" #: src/dialogs/confdialog.cxx:15464 msgid "Nav FSK PTT - should always be on" msgstr "Nav FSK PTT - dovrebbe essere sempre acceso" #: src/dialogs/confdialog.cxx:15479 #, fuzzy msgid "Config" msgstr "Configura" #: src/dialogs/confdialog.cxx:15480 #, fuzzy msgid "Connect / Disconnect from Nav Config port" msgstr "Connetti/disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:15490 src/dialogs/confdialog.cxx:15516 #: src/dialogs/confdialog.cxx:15518 msgid "Modem/TTY/Synop" msgstr "Synop" #: src/dialogs/confdialog.cxx:15494 msgid "SYNOP to ADIF" msgstr "SYNOP to ADIF" #: src/dialogs/confdialog.cxx:15495 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" "Decodifica messagi SYNOP (Es: Servizio meteorologico tedesco) in formato ADIF" #: src/dialogs/confdialog.cxx:15501 msgid "SYNOP to KML" msgstr "SYNOP to KML" #: src/dialogs/confdialog.cxx:15502 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Decodifica messaggi SYNOP (Es: Servizio meteorologico tedesco) in formato " "KML (Es: Google Earth)" #: src/dialogs/confdialog.cxx:15509 msgid "Interleave SYNOP and text" msgstr "Interlaccia SYNOP e testo" #: src/dialogs/confdialog.cxx:15510 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "Interlaccia il testo con messaggi SYNOP decodificati o sostituzione." #: src/dialogs/confdialog.cxx:15521 src/dialogs/confdialog.cxx:15715 #: src/dialogs/confdialog.cxx:15717 msgid "Modem/TTY/Winkeyer 3" msgstr "Winkeyer 3" #: src/dialogs/confdialog.cxx:15525 #, fuzzy msgid "Serial Interface" msgstr "Interfaccia Seriale" #: src/dialogs/confdialog.cxx:15585 #, fuzzy msgid "FSK port" msgstr "Porta FSK" #: src/dialogs/confdialog.cxx:15633 #, fuzzy msgid "Auto CRLF" msgstr "Auto CRLF" #: src/dialogs/confdialog.cxx:15649 msgid "Diddle" msgstr "Diddle" #: src/dialogs/confdialog.cxx:15650 msgid "Diddle On/OFF" msgstr "Diddle On/OFF" #: src/dialogs/confdialog.cxx:15665 #, fuzzy msgid "Diddle char" msgstr "Carattere di prova" #: src/dialogs/confdialog.cxx:15666 #, fuzzy msgid "Diddle character" msgstr "Bit per carattere" #: src/dialogs/confdialog.cxx:15681 msgid "USOS" msgstr "USOS" #: src/dialogs/confdialog.cxx:15682 src/dialogs/confdialog.cxx:15698 #, fuzzy msgid "Unshift on space" msgstr "Togli shift dopo spazio" #: src/dialogs/confdialog.cxx:15697 msgid "Echo" msgstr "Echo" #: src/dialogs/confdialog.cxx:15720 src/dialogs/confdialog.cxx:15833 #: src/dialogs/confdialog.cxx:15835 #, fuzzy msgid "Modem/Thor" msgstr "Thor" #: src/dialogs/confdialog.cxx:15740 msgid "Enable DSP prior to decoder" msgstr "Abilita il DSP prima del decodificatore" #: src/dialogs/confdialog.cxx:15782 msgid "Preamble Detection" msgstr "Rilevamento preambolo" #: src/dialogs/confdialog.cxx:15783 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" "Rileva preambolo THOR\n" "Cancella la conduttura Rx" #: src/dialogs/confdialog.cxx:15788 msgid "Soft-symbol decoding" msgstr "Soft-symbol decoding" #: src/dialogs/confdialog.cxx:15789 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" #: src/dialogs/confdialog.cxx:15794 msgid "Soft-bit decoding" msgstr "Soft-bit decoding" #: src/dialogs/confdialog.cxx:15795 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" #: src/dialogs/confdialog.cxx:15821 #, fuzzy msgid "" "\n" "Operator Avatar" msgstr "Nome operatore" #: src/dialogs/confdialog.cxx:15838 src/dialogs/confdialog.cxx:15853 #: src/dialogs/confdialog.cxx:15855 msgid "Modem/Navtex" msgstr "Navtex" #: src/dialogs/confdialog.cxx:15842 msgid "Log Navtex messages to Adif file" msgstr "Log messaggi Navtex in un file ADIF" #: src/dialogs/confdialog.cxx:15847 msgid "Log Navtex messages to KML" msgstr "Log messaggi Navtex in formato KML" #: src/dialogs/confdialog.cxx:15848 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" "Logs messaggi in formato Keyhole Markup Language (Google Earth, Marble, " "Gaia, etc...)" #: src/dialogs/confdialog.cxx:15858 src/dialogs/confdialog.cxx:15979 #: src/dialogs/confdialog.cxx:15981 #, fuzzy msgid "Modem/Wefax" msgstr "Wefax" #: src/dialogs/confdialog.cxx:15862 #, fuzzy msgid "Frequency shift" msgstr "Shift frequenza (800 Hz)" #: src/dialogs/confdialog.cxx:15863 #, fuzzy msgid "" "Frequency shift of WEFAX signal\n" "Nominal 800 Hz" msgstr "Shift frequenza (800 Hz)" #: src/dialogs/confdialog.cxx:15874 msgid "" "Center of WEFAX signal\n" "Nominal 1900 Hz" msgstr "" #: src/dialogs/confdialog.cxx:15884 msgid "Max Image Rows" msgstr "" #: src/dialogs/confdialog.cxx:15885 #, fuzzy msgid "Force save split image" msgstr "numero di righe prima che l'autosave divida l'immagine" #: src/dialogs/confdialog.cxx:15895 msgid "Fax images destination directory" msgstr "Cartella di destinazione delle immagini fax" #: src/dialogs/confdialog.cxx:15896 #, fuzzy msgid "Store images in this directory" msgstr "Cartella di destinazione delle immagini fax" #: src/dialogs/confdialog.cxx:15901 msgid "Directory..." msgstr "Cartella..." #: src/dialogs/confdialog.cxx:15902 #, fuzzy msgid "Select destination directory" msgstr "Cartella di destinazione delle immagini fax" #: src/dialogs/confdialog.cxx:15905 msgid "Log Wefax messages to Adif file" msgstr "Log messaggi Wefax in formato Adif" #: src/dialogs/confdialog.cxx:15906 msgid "Sent and received faxes are logged to Adif file." msgstr "I fax inviati e ricevuti vengono messi a log in un file Adif" #: src/dialogs/confdialog.cxx:15911 src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtro" #: src/dialogs/confdialog.cxx:15917 #, fuzzy msgid "Enable Auto-align after" msgstr "Abilita / disabilita gli alert audio" #: src/dialogs/confdialog.cxx:15927 msgid "Stop Auto-align after" msgstr "" #: src/dialogs/confdialog.cxx:15937 msgid "Auto-align every" msgstr "" #: src/dialogs/confdialog.cxx:15947 src/dialogs/confdialog.cxx:15950 #: src/dialogs/confdialog.cxx:15953 #, fuzzy msgid "rows" msgstr "Trova" #: src/dialogs/confdialog.cxx:15956 #, fuzzy msgid "Correlation" msgstr "Correzione" #: src/dialogs/confdialog.cxx:15957 msgid "" "Row-to-row correlation\n" "Used to detect presence of WEFAX signal\n" "Lower: more false detections" msgstr "" #: src/dialogs/confdialog.cxx:15968 #, fuzzy msgid "# Correlation rows" msgstr "Correzione" #: src/dialogs/confdialog.cxx:15969 msgid "Compute correlation factor over this # rows" msgstr "" #: src/dialogs/confdialog.cxx:15984 src/dialogs/confdialog.cxx:16185 #: src/dialogs/confdialog.cxx:16187 msgid "Misc/Autostart" msgstr "Autostart" #: src/dialogs/confdialog.cxx:15988 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:15989 #, fuzzy msgid "Enter full path-filename for flrig" msgstr "Inserisci il percorso completo per flrig" #: src/dialogs/confdialog.cxx:16003 #, fuzzy msgid "Locate flrig executable" msgstr "Trova l'eseguibile di flrig" #: src/dialogs/confdialog.cxx:16006 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16007 #, fuzzy msgid "Enter full path-filename for flamp" msgstr "Inserisci il percorso completo per flamp" #: src/dialogs/confdialog.cxx:16021 #, fuzzy msgid "Locate flamp executable" msgstr "Trova l'eseguibile di flamp" #: src/dialogs/confdialog.cxx:16024 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16025 #, fuzzy msgid "Enter full path-filename for flnet" msgstr "Inserisci il percorso completo per flnet" #: src/dialogs/confdialog.cxx:16039 #, fuzzy msgid "Locate flnet executable" msgstr "Trova l'eseguibile di flnet" #: src/dialogs/confdialog.cxx:16042 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16043 #, fuzzy msgid "Enter full path-filename for fllog" msgstr "Inserisci il percorso completo per fllog" #: src/dialogs/confdialog.cxx:16057 #, fuzzy msgid "Locate fllog executable" msgstr "Trova l'eseguibile di fllog" #: src/dialogs/confdialog.cxx:16060 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:16061 src/dialogs/confdialog.cxx:16079 #: src/dialogs/confdialog.cxx:16097 #, fuzzy msgid "Enter full path-filename for external program" msgstr "Inserisci il percorso completo per il programma esterno" #: src/dialogs/confdialog.cxx:16075 #, fuzzy msgid "Locate program #1 executable" msgstr "Trova l'eseguibile del programma esterno #1" #: src/dialogs/confdialog.cxx:16078 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:16093 #, fuzzy msgid "Locate program #2 executable" msgstr "Trova l'eseguibile del programma esterno #2" #: src/dialogs/confdialog.cxx:16096 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:16111 #, fuzzy msgid "Locate program #3 executable" msgstr "Trova l'eseguibile del programma esterno #3" #: src/dialogs/confdialog.cxx:16114 #, fuzzy msgid "" "Enable\n" "-" msgstr "" "Abilita\n" "-" #: src/dialogs/confdialog.cxx:16115 src/dialogs/confdialog.cxx:16122 #: src/dialogs/confdialog.cxx:16128 src/dialogs/confdialog.cxx:16134 #: src/dialogs/confdialog.cxx:16140 src/dialogs/confdialog.cxx:16146 #: src/dialogs/confdialog.cxx:16152 msgid "Enable this entry when fldigi first starts" msgstr "Abilitare questa voce al primo avvio di fldigi" #: src/dialogs/confdialog.cxx:16158 #, fuzzy msgid "Start flrig" msgstr "Avvia flrig" #: src/dialogs/confdialog.cxx:16162 #, fuzzy msgid "Start flamp" msgstr "Avvia flamp" #: src/dialogs/confdialog.cxx:16166 #, fuzzy msgid "Start flnet" msgstr "Avvia flnet" #: src/dialogs/confdialog.cxx:16170 #, fuzzy msgid "Start fllog" msgstr "Avvia fllog" #: src/dialogs/confdialog.cxx:16174 #, fuzzy msgid "Start prog1" msgstr "Avvia prog1" #: src/dialogs/confdialog.cxx:16178 #, fuzzy msgid "Start prog2" msgstr "Avvia prog2" #: src/dialogs/confdialog.cxx:16182 #, fuzzy msgid "Start prog3" msgstr "Avvia prog3" #: src/dialogs/confdialog.cxx:16190 src/dialogs/confdialog.cxx:16200 #: src/dialogs/confdialog.cxx:16202 #, fuzzy msgid "Misc/CPU" msgstr "CPU" #: src/dialogs/confdialog.cxx:16194 msgid "Slow CPU (less than 700MHz)" msgstr "CPU lente (meno di 700 MHz)" #: src/dialogs/confdialog.cxx:16195 msgid "Enable if you're computer does not decode properly" msgstr "Abilita se il tuo computer non decodifica correttamente" #: src/dialogs/confdialog.cxx:16205 src/dialogs/confdialog.cxx:16215 #: src/dialogs/confdialog.cxx:16217 #, fuzzy msgid "Misc/DTMF" msgstr "Misc" #: src/dialogs/confdialog.cxx:16209 msgid "Decode DTMF tones" msgstr "Decodifica toni DTMF" #: src/dialogs/confdialog.cxx:16210 msgid "Decode received DTMF tones" msgstr "Decodifica toni DTMF ricevuti" #: src/dialogs/confdialog.cxx:16220 src/dialogs/confdialog.cxx:16323 #: src/dialogs/confdialog.cxx:16325 #, fuzzy msgid "Misc/KML" msgstr "KML" #: src/dialogs/confdialog.cxx:16224 msgid "KML files directory" msgstr "Cartella file KML" #: src/dialogs/confdialog.cxx:16225 msgid "Where generated KML documents are stored." msgstr "Dove sono archiviati i documenti KML generati." #: src/dialogs/confdialog.cxx:16230 msgid "KML root file" msgstr "KML root file" #: src/dialogs/confdialog.cxx:16234 msgid "Minimum distance for splitting aliases (Meters)" msgstr "Distanza minima per alias di divisione (metri)" #: src/dialogs/confdialog.cxx:16235 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "Distanza minima per la divisione dei nodi alias (metri)" #: src/dialogs/confdialog.cxx:16245 msgid "Data retention time, in hours (0 for no limit)" msgstr "Tempo di conservazione dei dati, in ore (0 per nessun limite)" #: src/dialogs/confdialog.cxx:16246 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" "Numero di ore di conservazione dei dati per ciascun nodo. Zero significa " "mantenere tutto." #: src/dialogs/confdialog.cxx:16255 #, fuzzy msgid "KML refresh interval (seconds)" msgstr "Intervallo refresh KML (s)" #: src/dialogs/confdialog.cxx:16256 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Aggiorna intervallo di tempo scritto nel file KML (s)" #: src/dialogs/confdialog.cxx:16272 msgid "KML balloon display style" msgstr "Stile di visualizzazione del fumetto KML" #: src/dialogs/confdialog.cxx:16273 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "Fumetto KML in testo normale o HTML, in tabelle o matrici semplici." #: src/dialogs/confdialog.cxx:16288 #, fuzzy msgid "Command run on KML creation" msgstr "Comando eseguito sulla creazione di KML" #: src/dialogs/confdialog.cxx:16289 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "Comando avviato quando vengono generati file KML. I sottoprocessi vengono " "avviati una voltae riavviato se necessario." #: src/dialogs/confdialog.cxx:16295 #, fuzzy msgid "Test command" msgstr "Comando di prova" #: src/dialogs/confdialog.cxx:16296 msgid "Execute command on KML files." msgstr "Esegui comando su file KML" #: src/dialogs/confdialog.cxx:16299 #, fuzzy msgid "Change dir..." msgstr "Cambia cartella..." #: src/dialogs/confdialog.cxx:16300 msgid "Choose directory to store KML documents" msgstr "Scegli cartela per salvare i documenti KML" #: src/dialogs/confdialog.cxx:16303 msgid "Cleanup KML data now !" msgstr "Ripulisci i dati KML adesso !" #: src/dialogs/confdialog.cxx:16304 msgid "Cleanups KML documents, empties Google Earth display." msgstr "Ripulisci i documenti KML, svuota il display di Google Earth." #: src/dialogs/confdialog.cxx:16307 #, fuzzy msgid "Cleanup on startup" msgstr "Ripulisci all'avvio" #: src/dialogs/confdialog.cxx:16308 msgid "Empties KML documents when starting program." msgstr "Svuota i documenti KML all'avvio del programma." #: src/dialogs/confdialog.cxx:16315 msgid "KML server enabled (On / Off)" msgstr "Server KML abilitato (On / Off)" #: src/dialogs/confdialog.cxx:16316 msgid "Uncheck if KML is never used" msgstr "Deseleziona se KML non viene mai utilizzato" #: src/dialogs/confdialog.cxx:16328 src/dialogs/confdialog.cxx:16410 #: src/dialogs/confdialog.cxx:16412 #, fuzzy msgid "Misc/NBEMS interface" msgstr "Interfaccia per file di dati NBEMS" #: src/dialogs/confdialog.cxx:16332 msgid "NBEMS data file interface" msgstr "Interfaccia per file di dati NBEMS" #: src/dialogs/confdialog.cxx:16336 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Estrai i file per l'uso con il programma esterno \"wrap / flmsg\"" #: src/dialogs/confdialog.cxx:16341 msgid "Open message folder" msgstr "Apri file dei messaggi" #: src/dialogs/confdialog.cxx:16342 msgid "Opens NBEMS file folder upon successful capture" msgstr "Apri la cartella dei file NBEMS dopo una cattura riuscita" #: src/dialogs/confdialog.cxx:16349 #, fuzzy msgid "Reception of flmsg files" msgstr "Ricezione file flmsg" #: src/dialogs/confdialog.cxx:16352 msgid "Open with flmsg" msgstr "Apri con flmsg" #: src/dialogs/confdialog.cxx:16353 msgid "Open message with flmsg" msgstr "Apri il messaggio con flmsg" #: src/dialogs/confdialog.cxx:16358 msgid "Open in browser" msgstr "Apri col browser" #: src/dialogs/confdialog.cxx:16359 msgid "Open file with default browser" msgstr "Apri il file con il browser di sistema" #: src/dialogs/confdialog.cxx:16364 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:16365 msgid "Enter full path-filename for flmsg" msgstr "Inserisci il percorso completo a flmsg" #: src/dialogs/confdialog.cxx:16378 msgid "Locate flmsg" msgstr "Trova flmsg" #: src/dialogs/confdialog.cxx:16382 #, fuzzy msgid "Timeout (secs)" msgstr "Timeout (s):" #: src/dialogs/confdialog.cxx:16383 #, fuzzy msgid "Extract times out after NN seconds of inactivity." msgstr "" "Cancella il testo del canale dopo\n" "# secondi di inattività" #: src/dialogs/confdialog.cxx:16396 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" "Selezione del trasferiemnto diretto mantenendo la precedenza\n" "su tutte le altre impostazioni di ricezione di flmsg" #: src/dialogs/confdialog.cxx:16400 msgid "Transfer direct to executing flmsg" msgstr "Trasferiemnto diretto all'esecuzione di flmsg" #: src/dialogs/confdialog.cxx:16401 msgid "Send data stream directly to executing flmsg" msgstr "Invia il flusso di dati direttamente all'esecuzione di flmsg" #: src/dialogs/confdialog.cxx:16415 src/dialogs/confdialog.cxx:16493 #: src/dialogs/confdialog.cxx:16495 #, fuzzy msgid "Misc/PSK reporter" msgstr "PSK Reporter" #: src/dialogs/confdialog.cxx:16419 msgid "Automatically spot callsigns in decoded text" msgstr "Invia automaticamente lo spot per i nominativi nel testo decodificato" #: src/dialogs/confdialog.cxx:16420 msgid "Parse all incoming text" msgstr "Analizza tutto il testo ricevuto" #: src/dialogs/confdialog.cxx:16425 msgid "Send reception report when logging a QSO" msgstr "Invia il rapporto di ricezione quando metti un QSO a log" #: src/dialogs/confdialog.cxx:16426 msgid "Send report only when QSO is logged" msgstr "Invia il rapporto solo quando il QSO è messo a log" #: src/dialogs/confdialog.cxx:16431 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" "Comunica la frequenza della radio (abilita solo se hai il controllo " "automatico)" #: src/dialogs/confdialog.cxx:16432 msgid "Include the transmit frequency" msgstr "Includi la frequenza di trasmissione" #: src/dialogs/confdialog.cxx:16437 #, fuzzy msgid "Disable spotting when signal browser(s) are not visible." msgstr "Disabilita lo spotting quando i segnali non sono visibili." #: src/dialogs/confdialog.cxx:16438 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "" #: src/dialogs/confdialog.cxx:16444 msgid "Log on to pskrep when starting fldigi" msgstr "Accedere a pskrep all'avvio di fldigi" #: src/dialogs/confdialog.cxx:16445 msgid "Automatically start psk reporter socket connection" msgstr "Avvia automaticamente la connessione socket reporter psk" #: src/dialogs/confdialog.cxx:16455 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:16456 msgid "To whom the connection is made" msgstr "Verso chi fare la connessione" #: src/dialogs/confdialog.cxx:16470 msgid "Port:" msgstr "Porta:" #: src/dialogs/confdialog.cxx:16471 msgid "Using UDP port #" msgstr "Usa la porta UDP #" #: src/dialogs/confdialog.cxx:16486 msgid "Initialize the socket client" msgstr "Inizializza la connessione al server" #: src/dialogs/confdialog.cxx:16489 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:16498 src/dialogs/confdialog.cxx:16668 #: src/dialogs/confdialog.cxx:16670 #, fuzzy msgid "Misc/PSM" msgstr "PSM" #: src/dialogs/confdialog.cxx:16505 msgid "Allow TX After Signal Detection (Secs)" msgstr "Consenti TX dopo il rilevamento del segnale (sec)" #: src/dialogs/confdialog.cxx:16506 #, fuzzy msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" "Consenti la trasmissione dopo 'N' secondi di un rilevamento del segnale" #: src/dialogs/confdialog.cxx:16516 #, fuzzy msgid "Enable Busy Channel" msgstr "Abilita canale occupato" #: src/dialogs/confdialog.cxx:16517 msgid "Enable to inhibit TX on signal Detections" msgstr "Abilitare per inibire TX su Rilevazioni segnale" #: src/dialogs/confdialog.cxx:16523 msgid "TX Buffer Flush Timer (Mins, 0=Disable)" msgstr "Timer di drenaggio buffer TX (Min, 0 = Disabilita)" #: src/dialogs/confdialog.cxx:16524 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" "Svuota il buffer TX dopo il periodo x quando il canale occupato rimane " "attivo (TX inibito)" #: src/dialogs/confdialog.cxx:16535 #, fuzzy msgid "Modem Bandwidth Margins " msgstr "Margini larghezza di banda" #: src/dialogs/confdialog.cxx:16536 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "Monitora i segnali nella larghezza di banda del modem più i margini." #: src/dialogs/confdialog.cxx:16546 msgid "Valid Signal Sample Period (msecs)" msgstr "Periodo di campionamento del segnale valido (ms)" #: src/dialogs/confdialog.cxx:16547 msgid "Valid signal sample period in Milliseconds" msgstr "Periodo di campionamento del segnale valido in Millisecondi" #: src/dialogs/confdialog.cxx:16562 #, fuzzy msgid "Enable CSMA" msgstr "Abilita CSMA" #: src/dialogs/confdialog.cxx:16563 msgid "Carrier Sense Mulitiple Access" msgstr "Portante Sense Accesso Multiplo" #: src/dialogs/confdialog.cxx:16568 msgid "Persistance" msgstr "Persistenza" #: src/dialogs/confdialog.cxx:16569 msgid "Used to adjust the aggressiveness of TX" msgstr "Utilizzato per regolare l'aggressività di TX" #: src/dialogs/confdialog.cxx:16579 #, fuzzy msgid "Slot Time" msgstr "Slot Time" #: src/dialogs/confdialog.cxx:16580 msgid "Non transmit window after a transmit period" msgstr "Finestra di non trasmissione dopo un periodo di trasmissione" #: src/dialogs/confdialog.cxx:16590 #, fuzzy msgid "Transmit Data Delay" msgstr "Ritardo trasmissione dati" #: src/dialogs/confdialog.cxx:16591 #, fuzzy msgid "Idle transmit before data sent" msgstr "Trasmissione inattiva prima dell'invio dei dati" #: src/dialogs/confdialog.cxx:16601 src/dialogs/confdialog.cxx:16605 #, fuzzy msgid "MilliSeconds" msgstr "Millisecondi" #: src/dialogs/confdialog.cxx:16602 src/dialogs/confdialog.cxx:16610 msgid "Displays the Slot Time in Milliseconds" msgstr "Mostra lo Slot Time in Millisecondi" #: src/dialogs/confdialog.cxx:16606 msgid "Displays the Transmit Delay in Milliseconds" msgstr "Mostra il Ritardo Trasmissione in Millisecondi" #: src/dialogs/confdialog.cxx:16609 msgid "Percent (%)" msgstr "Percentuale (%)" #: src/dialogs/confdialog.cxx:16618 #, fuzzy msgid "Enable Histogram" msgstr "Abilita Istogramma" #: src/dialogs/confdialog.cxx:16619 msgid "Enable Histogram threshold signal monitoring" msgstr "Abilita il monitoraggio del segnale di soglia dell'istogramma" #: src/dialogs/confdialog.cxx:16624 msgid "PSM Histogram Threshold" msgstr "Soglia PSM dell'istogramma" #: src/dialogs/confdialog.cxx:16625 msgid "Sets the theshold level to x value above the noise level" msgstr "Imposta il livello di soglia sul valore x sopra il livello di rumore" #: src/dialogs/confdialog.cxx:16640 msgid "PSM Attenuate" msgstr "PSM Attenuato" #: src/dialogs/confdialog.cxx:16641 msgid "Adjust sensitivity by 1/N fractional values." msgstr "Regola la sensibilità di 1 / N valori frazionari" #: src/dialogs/confdialog.cxx:16657 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "Mostra e abilita il pulsante Monitoraggio segnale di potenza (PSM)" #: src/dialogs/confdialog.cxx:16658 msgid "display PSM button on main dialog" msgstr "visualizza il pulsante PSM nella finestra di dialogo principale" #: src/dialogs/confdialog.cxx:16665 #, fuzzy msgid "Default Settings" msgstr "" "Default test string is:\n" " \"" #: src/dialogs/confdialog.cxx:16673 src/dialogs/confdialog.cxx:16705 #: src/dialogs/confdialog.cxx:16707 #, fuzzy msgid "Misc/Rx text capture" msgstr "Cattura testo" #: src/dialogs/confdialog.cxx:16677 msgid "Talker Socket (MS only)" msgstr "Talker Socket (MS only)" #: src/dialogs/confdialog.cxx:16680 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:16684 msgid "Connect/disconnect to Talker socket server" msgstr "Connetti/disconnetti il socket del server Talker" #: src/dialogs/confdialog.cxx:16687 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Connetti automaticamente all'avvio di fldigi (il server deve essere attivo)" #: src/dialogs/confdialog.cxx:16694 msgid "Capture rx text to external file" msgstr "Cattura il testo ricevuto su file esterno" #: src/dialogs/confdialog.cxx:16697 msgid "Enable rx text stream" msgstr "Abilita il flusso del testo ricevuto" #: src/dialogs/confdialog.cxx:16698 msgid "Send rx text to file: textout.txt" msgstr "Invia il testo ricevuto al file: textout.txt" #: src/dialogs/confdialog.cxx:16710 src/dialogs/confdialog.cxx:16748 #: src/dialogs/confdialog.cxx:16750 #, fuzzy #| msgid "Rx Parameters" msgid "Misc/Save Parameters" msgstr "Parametri Rx" #: src/dialogs/confdialog.cxx:16714 #, fuzzy #| msgid "Transmit font" msgid "Transmit level control" msgstr "Carattere in TX" #: src/dialogs/confdialog.cxx:16715 msgid "Save transmit level control by mode" msgstr "" #: src/dialogs/confdialog.cxx:16721 msgid "Squelch level/activated control(s)" msgstr "" #: src/dialogs/confdialog.cxx:16722 msgid "Save Squelch level and state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16728 msgid "Enable specific parameter to Save & Restore on a per mode/band basis." msgstr "" #: src/dialogs/confdialog.cxx:16734 #, fuzzy #| msgid "ARQ control" msgid "AFC control" msgstr "Controllo ARQ" #: src/dialogs/confdialog.cxx:16735 msgid "Save AFC state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16741 #, fuzzy #| msgid "Reverse video" msgid "Reverse (Rv) control" msgstr "Inverti il video" #: src/dialogs/confdialog.cxx:16742 msgid "Save Reverse state by mode" msgstr "" #: src/dialogs/confdialog.cxx:16753 src/dialogs/confdialog.cxx:16837 #: src/dialogs/confdialog.cxx:16839 #, fuzzy msgid "Misc/Sweet Spot" msgstr "Sweet Spot" #: src/dialogs/confdialog.cxx:16760 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:16761 msgid "Default CW tracking point" msgstr "Frequenza traccia CW di default" #: src/dialogs/confdialog.cxx:16779 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:16780 msgid "Default RTTY tracking point" msgstr "Frequenza preferita per la decodifica RTTY" #: src/dialogs/confdialog.cxx:16798 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:16799 msgid "Default for all other modems" msgstr "Frequenza preferita per tutti gli altri modem" #: src/dialogs/confdialog.cxx:16817 msgid "Always start new modems at these frequencies" msgstr "Avvia sempre i nuovi modem su queste frequenze" #: src/dialogs/confdialog.cxx:16818 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "ON - avvia alla frequenza predefinita\n" "OFF - mantieni la posizione attuale del cursore sul waterfall" #: src/dialogs/confdialog.cxx:16826 msgid "K3 A1A configuation" msgstr "Configurazione A1A per K3" #: src/dialogs/confdialog.cxx:16829 msgid "CW is LSB" msgstr "CW è LSB" #: src/dialogs/confdialog.cxx:16830 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Attiva la selezione per Elecraft K3\n" "Altre radio non dovrebbero averne bisogno." #: src/dialogs/confdialog.cxx:16842 src/dialogs/confdialog.cxx:17166 #: src/dialogs/confdialog.cxx:17168 msgid "Misc/TCP-IP sessions" msgstr "" #: src/dialogs/confdialog.cxx:16850 msgid "Lock" msgstr "Blocca" #: src/dialogs/confdialog.cxx:16851 msgid "Allow/Disallow Changes" msgstr "Abilita/Disabilita Modifiche" #: src/dialogs/confdialog.cxx:16856 #, fuzzy msgid "Enable ARQ" msgstr "Abilita ARQ" #: src/dialogs/confdialog.cxx:16857 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "Usato per PSKMail e per la suite FLDIGI" #: src/dialogs/confdialog.cxx:16864 #, fuzzy msgid "Enable KISS" msgstr "Abilita KISS" #: src/dialogs/confdialog.cxx:16865 msgid "Used for BPQ32" msgstr "Usato per BPQ32" #: src/dialogs/confdialog.cxx:16872 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" "Abilita ARQ per i programmi che supportano il protocollo TCP e FLDIGI ARQ.\n" "Abilita KISS per i programmi che supportano il protocollo KISS TCP / UDP e " "TNC-2.\n" "Solo una interfaccia (ARQ / KISS) può essere attiva in un dato momento.\n" "Le modifiche KISS / ARQ / XML Addr / Port richiedono il riavvio del " "programma." #: src/dialogs/confdialog.cxx:16879 msgid "KISS" msgstr "KISS" #: src/dialogs/confdialog.cxx:16882 src/dialogs/confdialog.cxx:16999 #: src/dialogs/confdialog.cxx:17051 src/dialogs/confdialog.cxx:17098 #: src/dialogs/confdialog.cxx:17140 src/dialogs/confdialog.cxx:17352 msgid "Addr" msgstr "Indirizzo" #: src/dialogs/confdialog.cxx:16883 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Indirizzo IP per interfaccia KISS\n" "Indirizzo IP formato: nnn.nnn.nnn.nnn\n" "o nome: i.e. localhost" #: src/dialogs/confdialog.cxx:16899 msgid "I/O" msgstr "I/O" #: src/dialogs/confdialog.cxx:16900 src/dialogs/confdialog.cxx:17017 #: src/dialogs/confdialog.cxx:17069 src/dialogs/confdialog.cxx:17116 #: src/dialogs/confdialog.cxx:17149 src/dialogs/confdialog.cxx:17369 msgid "IP Address Port Number" msgstr "Indirizzo IP Numero Porta" #: src/dialogs/confdialog.cxx:16916 msgid "Output port number when same IP address used" msgstr "Numero della porta in uscita quando usato lo stesso indirizzo IP" #: src/dialogs/confdialog.cxx:16931 msgid "DP" msgstr "DP" #: src/dialogs/confdialog.cxx:16932 msgid "Enable when both programs are using the same IP address" msgstr "Abilita quando due programmi stanno utilizzando lo stesso indirizzo IP" #: src/dialogs/confdialog.cxx:16938 src/dialogs/confdialog.cxx:17037 #: src/dialogs/confdialog.cxx:17084 #, fuzzy msgid "Restart" msgstr "Riparti" #: src/dialogs/confdialog.cxx:16942 msgid "Start" msgstr "Parti" #: src/dialogs/confdialog.cxx:16943 msgid "Return KISS TCP IO connection to a Listening state" msgstr "Rilascia la connessione KISS TCP IO in stato di ascolto" #: src/dialogs/confdialog.cxx:16952 msgid "TCP/IP" msgstr "TCP/IP" #: src/dialogs/confdialog.cxx:16953 msgid "Check to enable TCP/IP IO Connection" msgstr "Spunta per abilitare la connessione TCP/IP IO" #: src/dialogs/confdialog.cxx:16959 msgid "UDP/IP" msgstr "UDP/IP" #: src/dialogs/confdialog.cxx:16960 msgid "Check to enable UDP/IP IO" msgstr "Spunta per abilitare UDP/IP IO" #: src/dialogs/confdialog.cxx:16966 msgid "Listen / Bind" msgstr "Ascolta / Vincola" #: src/dialogs/confdialog.cxx:16967 msgid "Monitor for TCP connection." msgstr "Monitor per le connssioni TCP." #: src/dialogs/confdialog.cxx:16973 msgid "Inhibit 7bit Modem" msgstr "inibisci i modem a 7bit" #: src/dialogs/confdialog.cxx:16974 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" "Inibire l'avviso di modifica del modem a 7 bit sulla ricezione dell'utente o " "RSID" #: src/dialogs/confdialog.cxx:16980 msgid "Auto Connect / Retry" msgstr "Auto Connessione / Riprova" #: src/dialogs/confdialog.cxx:16981 msgid "Connect to host program on FLDIGI start up" msgstr "Connettersi al programma host all'avvio di FLDIGI" #: src/dialogs/confdialog.cxx:16987 msgid "AX25 Decode" msgstr "AX25 Decodifica" #: src/dialogs/confdialog.cxx:16988 msgid "Decode AX25 Packets into human readable form" msgstr "Decodifica gli AX25 Packets in un formato leggibile dall'uomo" #: src/dialogs/confdialog.cxx:16996 msgid "ARQ" msgstr "ARQ" #: src/dialogs/confdialog.cxx:17000 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Indirizzo IP per interfaccia ARQ\n" "Indirizzo IP formato: nnn.nnn.nnn.nnn\n" "o nome: i.e. localhost" #: src/dialogs/confdialog.cxx:17043 #, fuzzy msgid "XML" msgstr "XML" #: src/dialogs/confdialog.cxx:17052 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Indirizzo IP per interfaccia ARQ\n" "Indirizzo IP formato: nnn.nnn.nnn.nnn\n" "o nome: i.e. localhost" #: src/dialogs/confdialog.cxx:17090 #, fuzzy msgid "flrig" msgstr "flrig" #: src/dialogs/confdialog.cxx:17099 src/dialogs/confdialog.cxx:17353 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Indirizzo IP per interfaccia flrig\n" "Indirizzo IP formato: nnn.nnn.nnn.nnn\n" "o nome: i.e. localhost" #: src/dialogs/confdialog.cxx:17131 src/dialogs/confdialog.cxx:17155 #: src/dialogs/confdialog.cxx:17383 msgid "Reconnect" msgstr "Riconnetti" #: src/dialogs/confdialog.cxx:17137 #, fuzzy msgid "fllog" msgstr "fllog" #: src/dialogs/confdialog.cxx:17141 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Indirizzo IP per interfaccia flrig\n" "Indirizzo IP formato: nnn.nnn.nnn.nnn\n" "o nome: i.e. localhost" #: src/dialogs/confdialog.cxx:17172 src/dialogs/confdialog.cxx:17323 #: src/dialogs/confdialog.cxx:17325 #, fuzzy msgid "Operator-Station" msgstr "Informazioni sull'operatore" #: src/dialogs/confdialog.cxx:17177 #, fuzzy msgid "Station Callsign:" msgstr "Nominativo di Stazione" #: src/dialogs/confdialog.cxx:17178 #, fuzzy msgid "Station callsign" msgstr "Nominativo di Stazione" #: src/dialogs/confdialog.cxx:17191 #, fuzzy msgid "Operator Callsign:" msgstr "Nominativo Operatore" #: src/dialogs/confdialog.cxx:17192 #, fuzzy msgid "Operator callsign (if different than station callsign)" msgstr "Nominativo Operatore (se diverso dal Nominativo di Stazione)" #: src/dialogs/confdialog.cxx:17206 #, fuzzy msgid "Operator Name:" msgstr "Nome Operatore" #: src/dialogs/confdialog.cxx:17207 msgid "Operators name" msgstr "Nomi operatori" #: src/dialogs/confdialog.cxx:17220 msgid "Antenna:" msgstr "Antenna:" #: src/dialogs/confdialog.cxx:17221 msgid "Short description of antenna" msgstr "Breve descrizione dell'antenna" #: src/dialogs/confdialog.cxx:17234 #, fuzzy msgid "Station City:" msgstr "Stazione LOC" #: src/dialogs/confdialog.cxx:17249 #, fuzzy msgid "Station Locator:" msgstr "Locatore Stazione:" #: src/dialogs/confdialog.cxx:17250 msgid "Maidenhead locator as in EM64qv" msgstr "Locatore Maidenhead come in EM64qv" #: src/dialogs/confdialog.cxx:17263 #, fuzzy msgid "State/Prov./Country" msgstr "Prov. Canadese" #: src/dialogs/confdialog.cxx:17264 msgid "US States / Canadian Provinces" msgstr "" #: src/dialogs/confdialog.cxx:17281 #, fuzzy msgid "Abbreviation for State/Province" msgstr "Abbreviazione per lo stato" #: src/dialogs/confdialog.cxx:17293 msgid "Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17294 msgid "US/Canadian Counties / Regions" msgstr "" #: src/dialogs/confdialog.cxx:17311 #, fuzzy msgid "Abbreviation for County/Region" msgstr "Abbreviazione per la contea" #: src/dialogs/confdialog.cxx:17328 src/dialogs/confdialog.cxx:17426 #: src/dialogs/confdialog.cxx:17428 #, fuzzy msgid "Rig Control/flrig" msgstr "Controllo della radio/flrig" #: src/dialogs/confdialog.cxx:17332 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" "\"Disabilita il modem delle chiavi PTT se più istanze di fldigi (client)\n" "sono collegati a un singolo flrig (server)." #: src/dialogs/confdialog.cxx:17336 msgid "Flrig PTT keys modem" msgstr "Flrig PTT" #: src/dialogs/confdialog.cxx:17337 msgid "\" \"" msgstr "\" \"" #: src/dialogs/confdialog.cxx:17344 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" "parametri server flrig xmlrpc\n" "questi controlli sono specchiati nella scheda di configurazione IO" #: src/dialogs/confdialog.cxx:17384 msgid "Press only if you change the address/port" msgstr "Premi solo se cambi l'indirizzo/porta" #: src/dialogs/confdialog.cxx:17389 msgid "flrig is the preferred method of tranceiver control" msgstr "flrig è il metodo preferito per il controllo della radio" #: src/dialogs/confdialog.cxx:17392 msgid "Enable flrig xcvr control with fldigi as client" msgstr "Abilita flrig a controllare la radio con fldigi come client" #: src/dialogs/confdialog.cxx:17393 src/dialogs/confdialog.cxx:17399 msgid "Disable if flrig not used." msgstr "Disabilita se flrig non è utiizzato" #: src/dialogs/confdialog.cxx:17398 msgid "Shutdown flrig with fldigi" msgstr "" #: src/dialogs/confdialog.cxx:17404 #, fuzzy msgid "Poll Interval (msec)" msgstr "Tempo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:17405 msgid "Request updates every 'poll interval' milliseconds" msgstr "" #: src/dialogs/confdialog.cxx:17431 src/dialogs/confdialog.cxx:17634 #: src/dialogs/confdialog.cxx:17636 msgid "Rig Control/CAT (rigcat)" msgstr "Controllo Radio/CAT (rigcat)" #: src/dialogs/confdialog.cxx:17435 msgid "Use RigCAT" msgstr "Usa RigCAT" #: src/dialogs/confdialog.cxx:17436 msgid "RigCAT used for rig control" msgstr "Usa RigCAT per controllare la radio" #: src/dialogs/confdialog.cxx:17443 msgid "Rig description file:" msgstr "File con la descrizione della radio" #: src/dialogs/confdialog.cxx:17444 msgid "Use Open to select descriptor file" msgstr "Usa Apri per selezionare il file con la descrizione" #: src/dialogs/confdialog.cxx:17450 msgid "Select rig descriptor file" msgstr "Seleziona il file con la descrizione della radio" #: src/dialogs/confdialog.cxx:17454 src/dialogs/confdialog.cxx:17940 #: src/dialogs/confdialog.cxx:18210 src/dialogs/confdialog.cxx:18551 msgid "Device:" msgstr "Periferica:" #: src/dialogs/confdialog.cxx:17469 src/dialogs/confdialog.cxx:17955 msgid "Retries" msgstr "Tentativi" #: src/dialogs/confdialog.cxx:17470 msgid "# retries before giving up" msgstr "numero di tentativi prima di rinunciare" #: src/dialogs/confdialog.cxx:17486 msgid "Retry interval (ms)" msgstr "Intervallo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:17487 msgid "Time between retires in msec" msgstr "Tempo in ms tra i tentativi" #: src/dialogs/confdialog.cxx:17503 msgid "Write delay (ms)" msgstr "Ritardo scrittura" #: src/dialogs/confdialog.cxx:17504 msgid "Wait for response to subsequent command" msgstr "" #: src/dialogs/confdialog.cxx:17520 src/dialogs/confdialog.cxx:18023 msgid "Baud rate:" msgstr "Baud rate:" #: src/dialogs/confdialog.cxx:17536 src/dialogs/confdialog.cxx:18039 msgid "Stopbits" msgstr "Bit d'arresto" #: src/dialogs/confdialog.cxx:17556 msgid "Initialize RigCAT interface" msgstr "Inizializza l'interfaccia RigCAT" #: src/dialogs/confdialog.cxx:17560 msgid "Commands are echoed" msgstr "I comandi sono visualizzati" #: src/dialogs/confdialog.cxx:17561 msgid "Rig or interface echos serial data" msgstr "La radio o l'interfaccia fa l'eco dei dati seriali" #: src/dialogs/confdialog.cxx:17566 msgid "CAT command for PTT" msgstr "Usa CAT per controllare il PTT" #: src/dialogs/confdialog.cxx:17567 msgid "PTT is a CAT command (not hardware)" msgstr "PTT è un comando CAT (non hardware)" #: src/dialogs/confdialog.cxx:17573 msgid "Toggle RTS for PTT" msgstr "Usa RTS per il PTT" #: src/dialogs/confdialog.cxx:17574 msgid "RTS is ptt line" msgstr "RTS controlla il PTT" #: src/dialogs/confdialog.cxx:17579 msgid "Toggle DTR for PTT" msgstr "Usa DTR per il PTT" #: src/dialogs/confdialog.cxx:17580 msgid "DTR is ptt line" msgstr "DTR controlla il PTT" #: src/dialogs/confdialog.cxx:17585 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:17586 src/dialogs/confdialog.cxx:18096 msgid "Initial state of RTS" msgstr "Stato iniziale di RTS" #: src/dialogs/confdialog.cxx:17591 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:17592 src/dialogs/confdialog.cxx:18090 msgid "Initial state of DTR" msgstr "Stato iniziale di DTR" #: src/dialogs/confdialog.cxx:17597 src/dialogs/confdialog.cxx:18101 msgid "RTS/CTS flow control" msgstr "Controllo di flusso RTS/CTS" #: src/dialogs/confdialog.cxx:17598 msgid "Rig uses RTS/CTS handshake" msgstr "La radio usa handshake RTS/CTS" #: src/dialogs/confdialog.cxx:17603 msgid "Restore UART Settings on Close" msgstr "Ripristina le impostazioni UART alla chiusura" #: src/dialogs/confdialog.cxx:17604 msgid "Restore the serial (COM) port settings" msgstr "Ripristina le impostazioni della porta seriale (COM)" #: src/dialogs/confdialog.cxx:17609 msgid "VSP Enable" msgstr "Abilita VSP" #: src/dialogs/confdialog.cxx:17610 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Emulatore Virtuale di Porte Seriali - sopprimi gli allarmi" #: src/dialogs/confdialog.cxx:17615 #, fuzzy msgid "Init delay (ms)" msgstr "Ritardo scrittura" #: src/dialogs/confdialog.cxx:17616 msgid "Wait for response to first CAT command" msgstr "Attendere la risposta al primo comando CAT" #: src/dialogs/confdialog.cxx:17639 src/dialogs/confdialog.cxx:17910 #: src/dialogs/confdialog.cxx:17912 #, fuzzy msgid "Rig Control/GPIO" msgstr "Controllo della radio" #: src/dialogs/confdialog.cxx:17643 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "Abilita GPIO PTT (Controlli specifici Pi)" #: src/dialogs/confdialog.cxx:17644 src/dialogs/confdialog.cxx:17778 #: src/dialogs/confdialog.cxx:17785 src/dialogs/confdialog.cxx:17792 #: src/dialogs/confdialog.cxx:17799 src/dialogs/confdialog.cxx:17806 #: src/dialogs/confdialog.cxx:17813 src/dialogs/confdialog.cxx:17820 #: src/dialogs/confdialog.cxx:17827 src/dialogs/confdialog.cxx:17834 #: src/dialogs/confdialog.cxx:17841 src/dialogs/confdialog.cxx:17848 #: src/dialogs/confdialog.cxx:17855 src/dialogs/confdialog.cxx:17862 #: src/dialogs/confdialog.cxx:17869 src/dialogs/confdialog.cxx:17876 #: src/dialogs/confdialog.cxx:17883 src/dialogs/confdialog.cxx:17890 #: src/dialogs/confdialog.cxx:18263 #, fuzzy msgid "Select PTT on state" msgstr "Seleziona PTT sullo stato" #: src/dialogs/confdialog.cxx:17651 src/dialogs/confdialog.cxx:18270 msgid "Initialize the H/W PTT interface" msgstr "Inizializza l'interfaccia PTT hardware" #: src/dialogs/confdialog.cxx:17654 src/dialogs/confdialog.cxx:17896 msgid "BCM GPIO pin Value" msgstr "BCM GPIO pin Value" #: src/dialogs/confdialog.cxx:17658 msgid "17 00 11" msgstr "17 00 11" #: src/dialogs/confdialog.cxx:17659 src/dialogs/confdialog.cxx:17666 #: src/dialogs/confdialog.cxx:17673 src/dialogs/confdialog.cxx:17680 #: src/dialogs/confdialog.cxx:17687 src/dialogs/confdialog.cxx:17694 #: src/dialogs/confdialog.cxx:17701 src/dialogs/confdialog.cxx:17708 #: src/dialogs/confdialog.cxx:17715 src/dialogs/confdialog.cxx:17722 #: src/dialogs/confdialog.cxx:17729 src/dialogs/confdialog.cxx:17736 #: src/dialogs/confdialog.cxx:17743 src/dialogs/confdialog.cxx:17750 #: src/dialogs/confdialog.cxx:17757 src/dialogs/confdialog.cxx:17764 #: src/dialogs/confdialog.cxx:17771 #, fuzzy msgid "Select pin number" msgstr "Seleziona pin numero" #: src/dialogs/confdialog.cxx:17665 msgid "18 01 12" msgstr "18 01 12" #: src/dialogs/confdialog.cxx:17672 msgid "27 02 13" msgstr "27 02 13" #: src/dialogs/confdialog.cxx:17679 msgid "22 03 15" msgstr "22 03 15" #: src/dialogs/confdialog.cxx:17686 msgid "23 04 16" msgstr "23 04 16" #: src/dialogs/confdialog.cxx:17693 msgid "24 05 18" msgstr "24 05 18" #: src/dialogs/confdialog.cxx:17700 msgid "25 06 22" msgstr "25 06 22" #: src/dialogs/confdialog.cxx:17707 msgid " 4 07 7" msgstr " 4 07 7" #: src/dialogs/confdialog.cxx:17714 msgid " 5 21 29" msgstr " 5 21 29" #: src/dialogs/confdialog.cxx:17721 msgid " 6 22 31" msgstr " 6 22 31" #: src/dialogs/confdialog.cxx:17728 msgid "13 23 33" msgstr "13 23 33" #: src/dialogs/confdialog.cxx:17735 msgid "19 24 35" msgstr "19 24 35" #: src/dialogs/confdialog.cxx:17742 msgid "26 25 37" msgstr "26 25 37" #: src/dialogs/confdialog.cxx:17749 msgid "12 26 32" msgstr "12 26 32" #: src/dialogs/confdialog.cxx:17756 msgid "16 27 36" msgstr "16 27 36" #: src/dialogs/confdialog.cxx:17763 msgid "20 28 38" msgstr "20 28 38" #: src/dialogs/confdialog.cxx:17770 msgid "21 29 40" msgstr "21 29 40" #: src/dialogs/confdialog.cxx:17777 src/dialogs/confdialog.cxx:17784 #: src/dialogs/confdialog.cxx:17791 src/dialogs/confdialog.cxx:17798 #: src/dialogs/confdialog.cxx:17805 src/dialogs/confdialog.cxx:17812 #: src/dialogs/confdialog.cxx:17819 src/dialogs/confdialog.cxx:17826 #: src/dialogs/confdialog.cxx:17833 src/dialogs/confdialog.cxx:17840 #: src/dialogs/confdialog.cxx:17847 src/dialogs/confdialog.cxx:17854 #: src/dialogs/confdialog.cxx:17861 src/dialogs/confdialog.cxx:17868 #: src/dialogs/confdialog.cxx:17875 src/dialogs/confdialog.cxx:17882 #: src/dialogs/confdialog.cxx:17889 msgid "= 1 (on)" msgstr "= 1 (on)" #: src/dialogs/confdialog.cxx:17900 msgid "Pulse width (msec)" msgstr "Durata dell'impulso (msec)" #: src/dialogs/confdialog.cxx:17901 msgid "Set >0 if pulsed PTT used" msgstr "Impostare> 0 se utilizzato PTT pulsato" #: src/dialogs/confdialog.cxx:17919 msgid "Use Hamlib" msgstr "Usa Hamlib" #: src/dialogs/confdialog.cxx:17920 msgid "Hamlib used for rig control" msgstr "Hamlib è usata per controllare la radio" #: src/dialogs/confdialog.cxx:17926 msgid "Rig:" msgstr "Radio:" #: src/dialogs/confdialog.cxx:17956 msgid "# times to resend command before giving up" msgstr "numero di volte che il comando è ripetuto prima di rinunciare" #: src/dialogs/confdialog.cxx:17972 #, fuzzy msgid "Timeout (msec)" msgstr "Timeout (s):" #: src/dialogs/confdialog.cxx:17973 msgid "Hamlib read timeout" msgstr "" #: src/dialogs/confdialog.cxx:17989 #, fuzzy msgid "Write delay (msec)" msgstr "Ritardo scrittura" #: src/dialogs/confdialog.cxx:17990 msgid "Msec's between sequential commands" msgstr "Tempo in ms tra comandi successivi" #: src/dialogs/confdialog.cxx:18006 #, fuzzy msgid "Post write delay (msec)" msgstr "Ritardo dopo un comando" #: src/dialogs/confdialog.cxx:18007 msgid "Wait interval (msecs) before reading response" msgstr "Attenti # ms prima di leggere la risposta" #: src/dialogs/confdialog.cxx:18058 #, fuzzy msgid "Polling Interval (msec)" msgstr "Tempo tra tentativi (ms)" #: src/dialogs/confdialog.cxx:18077 msgid "PTT via Hamlib command" msgstr "PTT via comando Hamlib" #: src/dialogs/confdialog.cxx:18078 #, fuzzy msgid "PTT using hamlib command" msgstr "PTT è un comando Hamlib" #: src/dialogs/confdialog.cxx:18083 msgid "Audio on Auxiliary Port" msgstr "Audio su porta ausiliaria" #: src/dialogs/confdialog.cxx:18084 msgid "PTT enables auxiliary audio source" msgstr "PTT abilitato su porta audio ausiliaria" #: src/dialogs/confdialog.cxx:18089 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:18095 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:18102 msgid "Rig requires RTS/CTS flow control" msgstr "La radio richiede controllo di flusso RTS/CTS" #: src/dialogs/confdialog.cxx:18108 msgid "XON/XOFF flow control" msgstr "Controllo di flusso XON/XOFF" #: src/dialogs/confdialog.cxx:18109 msgid "Rig requires Xon/Xoff flow control" msgstr "La radio richiede controllo di flusso Xon/Xoff" #: src/dialogs/confdialog.cxx:18114 #, fuzzy msgid "CW is LSB mode" msgstr "CW è LSB" #: src/dialogs/confdialog.cxx:18115 msgid "Check if xcvr uses LSB for CW" msgstr "" #: src/dialogs/confdialog.cxx:18120 msgid "RTTY is USB mode" msgstr "" #: src/dialogs/confdialog.cxx:18121 msgid "Check if xcvr uses USB for RTTY" msgstr "Controlla se la raido usa la USB per RTTY" #: src/dialogs/confdialog.cxx:18126 #, fuzzy msgid "Mode delay (msec)" msgstr "Ritardo scrittura (msec)" #: src/dialogs/confdialog.cxx:18127 msgid "Delay NN msec after executing mode change" msgstr "Ritarda NN msec dopo aver eseguito il cambio di modalità" #: src/dialogs/confdialog.cxx:18146 msgid "Sideband:" msgstr "Banda laterale:" #: src/dialogs/confdialog.cxx:18159 msgid "Advanced configuration:" msgstr "Configurazione avanzata:" #: src/dialogs/confdialog.cxx:18160 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configurazione opzionale\n" "in formato: param=val ..." #: src/dialogs/confdialog.cxx:18175 msgid "Initialize hamlib interface" msgstr "Inizializza l'interfaccia hamlib" #: src/dialogs/confdialog.cxx:18188 src/dialogs/confdialog.cxx:18300 #: src/dialogs/confdialog.cxx:18302 #, fuzzy msgid "Rig Control/Hardware PTT" msgstr "PTT Hardware" #: src/dialogs/confdialog.cxx:18194 src/dialogs/confdialog.cxx:18674 msgid "PTT tone on right audio channel " msgstr "PTT genera un tono sul canale audio destro " #: src/dialogs/confdialog.cxx:18195 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Puó essere usato al posto o insieme ad altri tipi di PTT" #: src/dialogs/confdialog.cxx:18202 msgid "h/w ptt device-pin" msgstr "" "Porta e segnale usato \n" "per il PTT hardware" #: src/dialogs/confdialog.cxx:18205 msgid "Use separate serial port PTT" msgstr "Il PTT usa una porta seriale separata" #: src/dialogs/confdialog.cxx:18225 msgid "Port is second SCU-17 device" msgstr "La porta è il secondo dispositivo SCU-17" #: src/dialogs/confdialog.cxx:18226 msgid "Driver requires stop bits to be ZERO!" msgstr "Il driver richiede che i bit di stop siano ZERO!" #: src/dialogs/confdialog.cxx:18232 msgid "Use parallel port PTT" msgstr "Il PTT usa una porta parallela" #: src/dialogs/confdialog.cxx:18237 msgid "Use uHRouter PTT" msgstr "Il PTT usa uHRouter" #: src/dialogs/confdialog.cxx:18242 msgid "Use RTS" msgstr "Usa RTS" #: src/dialogs/confdialog.cxx:18243 msgid "RTS is PTT signal line" msgstr "RTS controlla il PTT" #: src/dialogs/confdialog.cxx:18247 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:18248 msgid "Initial voltage on RTS" msgstr "Tensione iniziale su RTS" #: src/dialogs/confdialog.cxx:18253 msgid "DTR is PTT signal line" msgstr "DTR controlla il PTT" #: src/dialogs/confdialog.cxx:18257 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:18258 msgid "Initial voltage on DTR" msgstr "Tensione iniziale su DTR" #: src/dialogs/confdialog.cxx:18262 #, fuzzy #| msgid "Enable GPIO PTT (Pi specific controls)" msgid "GPIO PTT (Pi specific controls)" msgstr "Abilita GPIO PTT (Controlli specifici Pi)" #: src/dialogs/confdialog.cxx:18275 msgid "PTT delays valid for all CAT/PTT types" msgstr "Ritardi PTT validi per tutti i tipi CAT / PTT" #: src/dialogs/confdialog.cxx:18278 msgid "Start of transmit PTT delay" msgstr "Inizio del ritardo di trasmissione PTT" #: src/dialogs/confdialog.cxx:18279 msgid "Delay NN msec before starting audio" msgstr "Ritarda NN msec prima di avviare l'audio" #: src/dialogs/confdialog.cxx:18288 msgid "PTT end of transmit delay" msgstr "Fine PTT del ritardo di trasmissione" #: src/dialogs/confdialog.cxx:18289 msgid "Delay NN msec before releasing PTT" msgstr "Ritardare NN msec prima di rilasciare PTT" #: src/dialogs/confdialog.cxx:18306 src/dialogs/confdialog.cxx:18363 msgid "C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18310 msgid "" "C-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. " "GPIO signal line 3 (pin 13) is used for PTT control.\n" "\n" "Fldigi accesses the GPIO lines as a Human Interface Device (HID). " "Discovered C-Media devices are enumerated in the 'C-Media device' list box.\n" "\n" "On Linux: add a file named cmedia.rules to /etc/udev/rules.d/\n" "The file should contain a single line\n" "\n" "KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"" msgstr "" #: src/dialogs/confdialog.cxx:18319 msgid "Use C-Media PTT" msgstr "" #: src/dialogs/confdialog.cxx:18324 #, fuzzy #| msgid "Capture device" msgid "C-Media device" msgstr "Periferica di cattura" #: src/dialogs/confdialog.cxx:18339 #, fuzzy #| msgid "Odd lines" msgid "GPIO line" msgstr "Linee dispari" #: src/dialogs/confdialog.cxx:18356 #, fuzzy #| msgid "Initialize the H/W PTT interface" msgid "Select device & Initialize the H/W PTT interface" msgstr "Inizializza l'interfaccia PTT hardware" #: src/dialogs/confdialog.cxx:18359 msgid "TEST" msgstr "" #: src/dialogs/confdialog.cxx:18360 msgid "Toggles PTT line 20x; check DRA-30 ptt LED" msgstr "" #: src/dialogs/confdialog.cxx:18365 #, fuzzy msgid "Rig Control/C-Media PTT" msgstr "PTT Hardware" #: src/dialogs/confdialog.cxx:18369 src/dialogs/confdialog.cxx:18534 #: src/dialogs/confdialog.cxx:18536 #, fuzzy msgid "Soundcard/Alerts" msgstr "Scheda Audio/Alerts" #: src/dialogs/confdialog.cxx:18378 msgid "REGEX detected wav" msgstr "REGEX rilevato wav" #: src/dialogs/confdialog.cxx:18407 msgid "MYCALL detected wav" msgstr "IL MIO NOMINATIVO rilevato wav" #: src/dialogs/confdialog.cxx:18436 msgid "RsID audio alert wav" msgstr "RsID audio alert wav" #: src/dialogs/confdialog.cxx:18465 #, fuzzy msgid "flmsg received wav" msgstr "flmsg wav ricevuto" #: src/dialogs/confdialog.cxx:18489 msgid "flmsg timed out wav" msgstr "flmsg wav tempo scduto " #: src/dialogs/confdialog.cxx:18515 msgid "Alert volume" msgstr "Alert volume" #: src/dialogs/confdialog.cxx:18539 src/dialogs/confdialog.cxx:18646 #: src/dialogs/confdialog.cxx:18648 #, fuzzy msgid "Soundcard/Devices" msgstr "Dispositivi audio" #: src/dialogs/confdialog.cxx:18545 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:18546 msgid "Use OSS audio server" msgstr "Usa un server audio OSS" #: src/dialogs/confdialog.cxx:18552 msgid "Select device" msgstr "Seleziona il dispositivo" #: src/dialogs/confdialog.cxx:18560 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:18561 msgid "Use Port Audio server" msgstr "Usa un server Port Audio" #: src/dialogs/confdialog.cxx:18566 msgid "Capture:" msgstr "Cattura:" #: src/dialogs/confdialog.cxx:18567 msgid "Audio input device" msgstr "Dispositivo audio d'ingresso" #: src/dialogs/confdialog.cxx:18571 msgid "Playback:" msgstr "Riproduzione:" #: src/dialogs/confdialog.cxx:18572 src/dialogs/confdialog.cxx:18629 msgid "Audio output device" msgstr "Dispositivo audio d'uscita" #: src/dialogs/confdialog.cxx:18580 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:18581 msgid "Use Pulse Audio server" msgstr "Usa server Pulse Audio" #: src/dialogs/confdialog.cxx:18586 msgid "Server string:" msgstr "Nome del server" #: src/dialogs/confdialog.cxx:18587 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Lascia in bianco o vedi\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:18605 msgid "File I/O only" msgstr "Solo I/O su file" #: src/dialogs/confdialog.cxx:18606 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "NESSUN DISPOSITIVO AUDIO DISPONIBILE (o test)" #: src/dialogs/confdialog.cxx:18615 msgid "Device supports full duplex" msgstr "I dispositivi supportano il full duplex" #: src/dialogs/confdialog.cxx:18616 msgid "Capture/Playback supports full duplex operation" msgstr "Cattura/Riproduci supportano le operazioni in full duplex" #: src/dialogs/confdialog.cxx:18628 msgid "Audio device shared by Audio Alerts and Rx Monitor" msgstr "" #: src/dialogs/confdialog.cxx:18635 #, fuzzy msgid "First select audio alert playback device" msgstr "Seleziona prima il dispositivo di riproduzione degli avvisi audio" #: src/dialogs/confdialog.cxx:18641 msgid "Note: must be selected and enabled for Rx Audio monitoring!" msgstr "" #: src/dialogs/confdialog.cxx:18651 src/dialogs/confdialog.cxx:18708 #: src/dialogs/confdialog.cxx:18710 #, fuzzy msgid "Soundcard/Right channel" msgstr "Scheda audio/Canale destro" #: src/dialogs/confdialog.cxx:18655 #, fuzzy msgid "Transmit Usage" msgstr "Segnale trasmesso" #: src/dialogs/confdialog.cxx:18658 #, fuzzy msgid "Modem signal on left and right channels" msgstr "Segnale audio sui canali sinistro e destro" #: src/dialogs/confdialog.cxx:18659 msgid "Left and right channels both contain modem audio" msgstr "I canali sinistro e destro contengono entrambi audio modem" #: src/dialogs/confdialog.cxx:18664 src/dialogs/confdialog.cxx:18700 msgid "Reverse Left/Right channels" msgstr "Inverti i canali Sinistro/Destro" #: src/dialogs/confdialog.cxx:18665 src/dialogs/confdialog.cxx:18701 #, fuzzy msgid "Software reversal of left-right audio channels" msgstr "Inversione software dei canali audio sinistro-destro" #: src/dialogs/confdialog.cxx:18670 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Questi controlli si strovano su altre schede.\n" "sono replicati qui per comodità.\n" "Puoi cambiare lo stato da entrambe le posizioni.\n" "..." #: src/dialogs/confdialog.cxx:18675 #, fuzzy msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "Tono 1000 Hz quando PTT abilitato\n" "Puó essere usato al posto o insieme ad altri tipi di PTT" #: src/dialogs/confdialog.cxx:18681 #, fuzzy msgid "CW QSK signal on right channel" msgstr "CW QSK sul canale audio destro" #: src/dialogs/confdialog.cxx:18682 #, fuzzy msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Genera segnale a onda quadra a 1000 Hz sul canale destro" #: src/dialogs/confdialog.cxx:18687 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK sul canale audio destro" #: src/dialogs/confdialog.cxx:18688 #, fuzzy msgid "Create 1000 Hz square wave on right channel" msgstr "Crea un'onda quadra a 1000 Hz sul canale destro" #: src/dialogs/confdialog.cxx:18697 #, fuzzy msgid "Receive Usage" msgstr "Ricevi" #: src/dialogs/confdialog.cxx:18713 src/dialogs/confdialog.cxx:18850 #: src/dialogs/confdialog.cxx:18852 #, fuzzy msgid "Soundcard/Settings" msgstr "Scheda audio/Impostazioni" #: src/dialogs/confdialog.cxx:18720 msgid "Capture" msgstr "Cattura" #: src/dialogs/confdialog.cxx:18721 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Forza una velocitá di campionamento specifica. Scegli \"Nativo\"\n" "se \"Auto\" non funziona correttamente con la tua scheda audio." #: src/dialogs/confdialog.cxx:18753 msgid "Converter" msgstr "Conversione" #: src/dialogs/confdialog.cxx:18754 msgid "Set the type of resampler used of offset correction" msgstr "Scegli il tipo di ricampionatore usato per la correzione dell'offset" #: src/dialogs/confdialog.cxx:18770 msgid "Corrections" msgstr "Correzione" #: src/dialogs/confdialog.cxx:18773 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:18774 msgid "RX sound card correction" msgstr "Correzione della scheda audio in ricezione" #: src/dialogs/confdialog.cxx:18790 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:18791 msgid "TX sound card correction" msgstr "Correzione della scheda audio in trasmissione" #: src/dialogs/confdialog.cxx:18807 msgid "TX offset" msgstr "TX offset" #: src/dialogs/confdialog.cxx:18808 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Differenza tra la frequenza Rx e Tx (scostamento della radio)" #: src/dialogs/confdialog.cxx:18826 msgid "Frequency Analysis / FMT Rx Correction" msgstr "" #: src/dialogs/confdialog.cxx:18834 #, fuzzy msgid "Frequency Correction" msgstr "Frequenza in MHz" #: src/dialogs/confdialog.cxx:18835 msgid "Used ONLY for frequency analysis mode" msgstr "" #: src/dialogs/confdialog.cxx:18855 #, fuzzy msgid "Signal Level" msgstr "Livello del segnale" #: src/dialogs/confdialog.cxx:18859 #, fuzzy msgid "Signal Levels" msgstr "Livello del segnale" #: src/dialogs/confdialog.cxx:18940 src/dialogs/confdialog.cxx:18942 #, fuzzy msgid "Soundcard/Signal Level" msgstr "Dispositivi audio" #: src/dialogs/confdialog.cxx:18945 src/dialogs/confdialog.cxx:18971 #: src/dialogs/confdialog.cxx:18973 msgid "Soundcard/Wav file recording" msgstr "Registrazione di Schede audio/File wav" #: src/dialogs/confdialog.cxx:18949 #, fuzzy msgid "Wav write sample rate" msgstr "Velocitá di campionamento" #: src/dialogs/confdialog.cxx:18950 msgid "Pick baud rate from list" msgstr "Seleziona una velocitá della porta dalla lista" #: src/dialogs/confdialog.cxx:18966 #, fuzzy msgid "Record both channels" msgstr "Registra entrambi i canali" #: src/dialogs/confdialog.cxx:18977 src/dialogs/confdialog.cxx:19063 #: src/dialogs/confdialog.cxx:19065 msgid "UI/Browser/Channels" msgstr "UI/Browser/Channels" #: src/dialogs/confdialog.cxx:18981 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Canali, il primo canale parte al limite inferiore del waterfall" #: src/dialogs/confdialog.cxx:18982 msgid "Change # of psk viewer channels" msgstr "Cambia il numero di canali nel visualizzatore psk." #: src/dialogs/confdialog.cxx:18999 msgid "Inactivity timeout" msgstr "Tempo di inattività" #: src/dialogs/confdialog.cxx:19000 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Cancella il testo del canale dopo\n" "# secondi di inattività" #: src/dialogs/confdialog.cxx:19016 msgid "Channel label" msgstr "Etichetta del canale" #: src/dialogs/confdialog.cxx:19017 msgid "Appearance of label on each channel" msgstr "Aspetto dell'etichetta di ciascun canale" #: src/dialogs/confdialog.cxx:19028 msgid "Audio frequency" msgstr "Frequenza audio" #: src/dialogs/confdialog.cxx:19029 msgid "Radio frequency" msgstr "Frequenza radio" #: src/dialogs/confdialog.cxx:19029 msgid "Channel number" msgstr "Numero del canale" #: src/dialogs/confdialog.cxx:19034 src/dialogs/confdialog.cxx:19772 msgid "Font..." msgstr "Caratteri..." #: src/dialogs/confdialog.cxx:19035 msgid "select browser font" msgstr "Seleziona i caratteri usati nel navigatore" #: src/dialogs/confdialog.cxx:19038 msgid "Fixed Intervals" msgstr "Intervalli fissi" #: src/dialogs/confdialog.cxx:19039 msgid "Force channel spacing to even 100 Hz increments" msgstr "Forza la spaziatura dei canali a incrementi regolari di 100 Hz" #: src/dialogs/confdialog.cxx:19045 msgid "Continuous scrolling" msgstr "Scorrimento continuo" #: src/dialogs/confdialog.cxx:19046 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "ON - Scorrimento continuo\n" "OFF - Cancella e riparti" #: src/dialogs/confdialog.cxx:19051 msgid "Lowest freq on bottom of viewer" msgstr "Frequenza piú bassa in basso nel navigatore" #: src/dialogs/confdialog.cxx:19052 msgid "Change positions of low to high channels" msgstr "Cambia l'ordinamento da alto a basso dei canali" #: src/dialogs/confdialog.cxx:19057 msgid "Play back history when active channel selected" msgstr "Riproduci il buffer audio quando viene selezionato il canale attivo" #: src/dialogs/confdialog.cxx:19058 msgid "Audio stream history decoded on selected signal" msgstr "Il buffer audio viene decodificato per il segnale selezionato" #: src/dialogs/confdialog.cxx:19068 src/dialogs/confdialog.cxx:19102 #: src/dialogs/confdialog.cxx:19104 #, fuzzy msgid "UI/Browser/Colors" msgstr "Colori di sistema" #: src/dialogs/confdialog.cxx:19072 msgid "HiLite 1" msgstr "HiLite 1" #: src/dialogs/confdialog.cxx:19073 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "PSK/RTTY Viewer HiLite Color 1" #: src/dialogs/confdialog.cxx:19078 msgid "HiLite 2" msgstr "HiLite 2" #: src/dialogs/confdialog.cxx:19079 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "PSK/RTTY Viewer HiLite Color 2" #: src/dialogs/confdialog.cxx:19084 #, fuzzy msgid "Even" msgstr "Pari" #: src/dialogs/confdialog.cxx:19085 #, fuzzy msgid "Even lines" msgstr "Linee pari" #: src/dialogs/confdialog.cxx:19090 #, fuzzy msgid "Odd" msgstr "Dispari" #: src/dialogs/confdialog.cxx:19091 msgid "Odd lines" msgstr "Linee dispari" #: src/dialogs/confdialog.cxx:19097 #, fuzzy msgid "Select line" msgstr "Seleziona la linea" #: src/dialogs/confdialog.cxx:19107 src/dialogs/confdialog.cxx:19123 #: src/dialogs/confdialog.cxx:19125 #, fuzzy msgid "UI/Browser/Detection Level" msgstr "UI/Browser/Livello rilevamento" #: src/dialogs/confdialog.cxx:19111 msgid "Backgnd" msgstr "Sfondo" #: src/dialogs/confdialog.cxx:19112 msgid "Background color of signal viewer squelch control" msgstr "Colore di sfondo del controllo squelch del navigatore segnali" #: src/dialogs/confdialog.cxx:19117 msgid "Button" msgstr "Pulsante" #: src/dialogs/confdialog.cxx:19118 msgid "Slider hilite color of signal viewer squelch control" msgstr "Colore evidenziato del cursore nel controllo squelch del navigatore" #: src/dialogs/confdialog.cxx:19128 src/dialogs/confdialog.cxx:19262 #: src/dialogs/confdialog.cxx:19264 #, fuzzy msgid "UI/General" msgstr "Generale" #: src/dialogs/confdialog.cxx:19134 msgid "Show tooltips" msgstr "Mostra suggerimenti" #: src/dialogs/confdialog.cxx:19135 msgid "Enable / disable tooltips" msgstr "Abilita / disabilita suggerimenti" #: src/dialogs/confdialog.cxx:19141 msgid "Show menu icons" msgstr "Mostra le icone del menu" #: src/dialogs/confdialog.cxx:19142 msgid "Enable / disable icons on menus" msgstr "Abilita / disabilita le icone dei menu" #: src/dialogs/confdialog.cxx:19147 msgid "UI scheme" msgstr "Schema" #: src/dialogs/confdialog.cxx:19148 msgid "Change application look and feel" msgstr "Cambia l'aspetto del programma" #: src/dialogs/confdialog.cxx:19166 msgid "Visible modes" msgstr "Modi visibili" #: src/dialogs/confdialog.cxx:19167 msgid "Select modes for menu access" msgstr "Seleziona i modi accessibili dal menú" #: src/dialogs/confdialog.cxx:19170 msgid "UI language" msgstr "Lingua" #: src/dialogs/confdialog.cxx:19171 src/dialogs/confdialog.cxx:19915 msgid "Changes take effect on next program startup" msgstr "Le modifiche avranno effetto al prossimo avvio del programma" #: src/dialogs/confdialog.cxx:19190 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Stampa CW / RTTY / THROB / CONTESTIA in minuscolo" #: src/dialogs/confdialog.cxx:19200 #, fuzzy msgid "Transmit lower case text" msgstr "Trasmetti il tono di avvio basso" #: src/dialogs/confdialog.cxx:19207 msgid "Exit prompts" msgstr "Esci dal prompt" #: src/dialogs/confdialog.cxx:19210 #, fuzzy msgid "Prompt to save Configuration" msgstr "Chiedi di salvare la configurazione" #: src/dialogs/confdialog.cxx:19215 src/dialogs/confdialog.cxx:19377 #, fuzzy msgid "Prompt to save macro file" msgstr "Chiedi di salvare il file macro" #: src/dialogs/confdialog.cxx:19216 src/dialogs/confdialog.cxx:19378 msgid "Write current macro set on program exit" msgstr "Scrivi il set corrente delle macro all'uscita" #: src/dialogs/confdialog.cxx:19221 msgid "Prompt to save log" msgstr "Chiedi di salvare il log" #: src/dialogs/confdialog.cxx:19227 #, fuzzy msgid "Confirm exit" msgstr "Confermi l'uscita" #: src/dialogs/confdialog.cxx:19234 #, fuzzy msgid "Check for updates" msgstr "Verifica aggiornamenti..." #: src/dialogs/confdialog.cxx:19237 msgid "Check for updates when starting program" msgstr "Verifica aggiornamenti all'avvio del programma" #: src/dialogs/confdialog.cxx:19247 #, fuzzy msgid "Show TX timer" msgstr "Mostra il TX timer" #: src/dialogs/confdialog.cxx:19252 msgid "TX deadmen timeout (mins)" msgstr "TX timeout uomo morto (min)" #: src/dialogs/confdialog.cxx:19267 src/dialogs/confdialog.cxx:19405 #: src/dialogs/confdialog.cxx:19407 #, fuzzy msgid "UI/Macro buttons" msgstr "UI/Macro buttons" #: src/dialogs/confdialog.cxx:19273 msgid "Mouse wheel active on macro buttons" msgstr "Rotella del mouse attiva sui pulsanti macro" #: src/dialogs/confdialog.cxx:19274 msgid "enable mouse wheel control of macro bar" msgstr "" "Abilita l'uso della rotella del mouse per il controllo della barra delle " "macro" #: src/dialogs/confdialog.cxx:19281 msgid "Number and position of macro bars" msgstr "Numero e posizione delle barre delle macro" #: src/dialogs/confdialog.cxx:19284 #, fuzzy msgid "Button Height" msgstr "Altrezza Pulsante" #: src/dialogs/confdialog.cxx:19285 #, fuzzy msgid "Height of macro bar" msgstr "Numero e altezza delle barre macro" #: src/dialogs/confdialog.cxx:19295 msgid "One above Rx/Tx" msgstr "Una sopra Rx/Tx" #: src/dialogs/confdialog.cxx:19296 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" "Singola barra macro sotto il pannello di log\n" "altezza variabile" #: src/dialogs/confdialog.cxx:19301 #, fuzzy msgid "One above waterfall" msgstr "Una sopra il waterfall" #: src/dialogs/confdialog.cxx:19306 #, fuzzy msgid "One below waterfall" msgstr "Una sotto il waterfall" #: src/dialogs/confdialog.cxx:19311 #, fuzzy msgid "Two scheme 1" msgstr "Due barre (schema 1)" #: src/dialogs/confdialog.cxx:19316 #, fuzzy msgid "Two scheme 2" msgstr "Due barre (schema 2)" #: src/dialogs/confdialog.cxx:19321 #, fuzzy msgid "Two scheme 3" msgstr "Due barre (schema 3)" #: src/dialogs/confdialog.cxx:19326 #, fuzzy msgid "Two scheme 4" msgstr "Due barre (schema 4)" #: src/dialogs/confdialog.cxx:19331 #, fuzzy msgid "Two scheme 5" msgstr "Due barre (schema 5)" #: src/dialogs/confdialog.cxx:19336 #, fuzzy msgid "Two scheme 6" msgstr "Due barre (schema 6)" #: src/dialogs/confdialog.cxx:19341 #, fuzzy msgid "Two scheme 7" msgstr "Due barre (schema 7)" #: src/dialogs/confdialog.cxx:19346 #, fuzzy msgid "Two scheme 8" msgstr "Due barre (schema 8)" #: src/dialogs/confdialog.cxx:19351 #, fuzzy msgid "Two scheme 9" msgstr "Due barre (schema 9)" #: src/dialogs/confdialog.cxx:19356 #, fuzzy msgid "Two scheme 10" msgstr "Due barre (schema 10)" #: src/dialogs/confdialog.cxx:19365 #, fuzzy msgid "Load last used macro file at start" msgstr "All'avvio carica l'ultimo file delle macro usato" #: src/dialogs/confdialog.cxx:19366 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "ON - usa l'ultimo file delle macro\n" "OFF - usa il file predefinito" #: src/dialogs/confdialog.cxx:19371 #, fuzzy msgid "Display macro filename at start" msgstr "Mostra il nome del file delle macro all'avvio" #: src/dialogs/confdialog.cxx:19387 #, fuzzy msgid "Show macro control codes" msgstr "Mostra l'editor delle macro" #: src/dialogs/confdialog.cxx:19388 msgid "print ^! execution codes in Rx panel" msgstr "stampa ^! codici di esecuzione nel pannello Rx" #: src/dialogs/confdialog.cxx:19397 msgid "4 bar macro set below Tx" msgstr "Set di 4 barre macro sotto al pannello Tx" #: src/dialogs/confdialog.cxx:19398 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" "Posizionare il set di macro a 4 barre sotto il pannello Tx\n" "Default sopra al pannello Rx" #: src/dialogs/confdialog.cxx:19410 src/dialogs/confdialog.cxx:19454 #: src/dialogs/confdialog.cxx:19456 #, fuzzy msgid "UI/Rx Text" msgstr "Testo Rx" #: src/dialogs/confdialog.cxx:19414 msgid "Single-click to capture" msgstr "Click singolo per catturare" #: src/dialogs/confdialog.cxx:19415 src/dialogs/confdialog.cxx:19444 msgid "Enable for single click capure of text in Rx panel" msgstr "Abilita per catturare con click singolo dal testo nel riquadro Rx" #: src/dialogs/confdialog.cxx:19420 #, fuzzy msgid "callsign tooltips in received text" msgstr "Mostra le informazioni sul nominativo nel testo ricevuto" #: src/dialogs/confdialog.cxx:19421 msgid "Popup info after a 2 second hover on a callsign" msgstr "" "Tenendo il mouse per piú di due secondi su un nominativo appare popup con " "informazioni" #: src/dialogs/confdialog.cxx:19426 msgid "Word delimiters" msgstr "Delimitatori di parola" #: src/dialogs/confdialog.cxx:19427 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "L'inserimento dei dati del QSO dal testo ricevuto è delimitato\n" "dai caratteri definiti qui. Tab e a capo sono sempre inclusi." #: src/dialogs/confdialog.cxx:19443 msgid "US units of distance (QRB)" msgstr "" #: src/dialogs/confdialog.cxx:19449 #, fuzzy msgid "Clear log fields - new CALL" msgstr "Cancella i campi del log?" #: src/dialogs/confdialog.cxx:19459 src/dialogs/confdialog.cxx:19494 #: src/dialogs/confdialog.cxx:19496 msgid "UI/Touch" msgstr "UI/Touch" #: src/dialogs/confdialog.cxx:19463 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Nota:\n" "Questi elementi di configurazione sono utili ma non univoci per l'uso di " "fldigi su un\n" "dispositivo touch screen come un tablet." #: src/dialogs/confdialog.cxx:19467 msgid "Arrow Key Control of Frequency Entry" msgstr "Controllo dei tasti freccia per l'immissione della frequenza" #: src/dialogs/confdialog.cxx:19470 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" "Destra/Sinistra = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Destra/Sinistra = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" #: src/dialogs/confdialog.cxx:19474 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" "Sinistra/Destra\n" "Seleziona la cifra meno significativa" #: src/dialogs/confdialog.cxx:19483 msgid "Rx / Tx Panels" msgstr "Pannello Rx / Tx" #: src/dialogs/confdialog.cxx:19486 msgid "Tx above Rx" msgstr "Tx sopra Rx" #: src/dialogs/confdialog.cxx:19487 msgid "Enable to put Tx panel above Rx panel" msgstr "Abilita per posizionare il pannello Tx sopra il pannello Rx" #: src/dialogs/confdialog.cxx:19500 src/dialogs/confdialog.cxx:19580 #: src/dialogs/confdialog.cxx:19582 #, fuzzy msgid "Waterfall/Buttons & Controls" msgstr "Controlli waterfall/Pulsanti" #: src/dialogs/confdialog.cxx:19504 msgid "Enable check box to show each respective operator control" msgstr "Abilita le selezioni per mostrare i rispettivi controlli di operatore" #: src/dialogs/confdialog.cxx:19514 msgid "WF Magnification" msgstr "Ingrandimento WF" #: src/dialogs/confdialog.cxx:19520 msgid "WF carrier" msgstr "Portante WF" #: src/dialogs/confdialog.cxx:19526 msgid "WF Shift Controls" msgstr "Controlli scorrimento WF" #: src/dialogs/confdialog.cxx:19532 msgid "WF ref level" msgstr "Livello di riferimento WF" #: src/dialogs/confdialog.cxx:19538 msgid "WF drop rate" msgstr "Velocita' verticale WF" #: src/dialogs/confdialog.cxx:19544 msgid "WF amp span" msgstr "WF amp span" #: src/dialogs/confdialog.cxx:19550 msgid "WF Store" msgstr "Memorie WF" #: src/dialogs/confdialog.cxx:19556 msgid "WF mode" msgstr "Modo WF" #: src/dialogs/confdialog.cxx:19562 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:19568 msgid "XMT lock" msgstr "Blocca freq trasmissione" #: src/dialogs/confdialog.cxx:19574 msgid "Enable all" msgstr "Abilita tutto" #: src/dialogs/confdialog.cxx:19577 msgid "Disable all" msgstr "Disabilita tutto" #: src/dialogs/confdialog.cxx:19585 src/dialogs/confdialog.cxx:19800 #: src/dialogs/confdialog.cxx:19802 #, fuzzy msgid "Waterfall/Display" msgstr "Waterfall" #: src/dialogs/confdialog.cxx:19589 msgid "Colors and cursors" msgstr "Colori e cursori" #: src/dialogs/confdialog.cxx:19592 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:19607 src/dialogs/confdialog.cxx:19611 #: src/dialogs/confdialog.cxx:19615 src/dialogs/confdialog.cxx:19619 #: src/dialogs/confdialog.cxx:19623 src/dialogs/confdialog.cxx:19627 #: src/dialogs/confdialog.cxx:19631 src/dialogs/confdialog.cxx:19635 #: src/dialogs/confdialog.cxx:19639 src/dialogs/confdialog.cxx:19660 #: src/dialogs/confdialog.cxx:19683 src/dialogs/confdialog.cxx:19706 #: src/dialogs/confdialog.cxx:19723 src/dialogs/confdialog.cxx:19735 #: src/dialogs/confdialog.cxx:19748 msgid "Change color" msgstr "Cambia colore" #: src/dialogs/confdialog.cxx:19642 msgid "Load..." msgstr "Carica..." #: src/dialogs/confdialog.cxx:19643 msgid "Load a new palette" msgstr "Carica una nuova palette" #: src/dialogs/confdialog.cxx:19646 msgid "Save..." msgstr "Salva..." #: src/dialogs/confdialog.cxx:19647 msgid "Save this palette" msgstr "Salva questa palette" #: src/dialogs/confdialog.cxx:19650 #, fuzzy #| msgid "Signal Browser" msgid "Signal BW" msgstr "Navigatore dei segnali" #: src/dialogs/confdialog.cxx:19653 src/dialogs/confdialog.cxx:19676 #: src/dialogs/confdialog.cxx:19699 #, fuzzy msgid "ON" msgstr "CONT" #: src/dialogs/confdialog.cxx:19654 msgid "Show cursor with bandwidth lines" msgstr "Mostra linee che indicano la larghezza di banda del modo sul cursore" #: src/dialogs/confdialog.cxx:19659 src/dialogs/confdialog.cxx:19682 #: src/dialogs/confdialog.cxx:19705 src/dialogs/confdialog.cxx:19722 #: src/dialogs/confdialog.cxx:19734 src/dialogs/confdialog.cxx:19747 #: src/dialogs/font_browser.cxx:177 msgid "Color" msgstr "Colore" #: src/dialogs/confdialog.cxx:19666 src/dialogs/confdialog.cxx:19689 #: src/dialogs/confdialog.cxx:19712 src/dialogs/confdialog.cxx:19754 msgid "Wide" msgstr "Larga" #: src/dialogs/confdialog.cxx:19673 #, fuzzy msgid "Center line" msgstr "Colore linea centrale" #: src/dialogs/confdialog.cxx:19677 msgid "Show cursor with center line" msgstr "Mostra il cursore con linea centrale" #: src/dialogs/confdialog.cxx:19696 #, fuzzy msgid "Signal trks" msgstr "Ricerca segnali" #: src/dialogs/confdialog.cxx:19700 msgid "Show bandwidth tracks on waterfall" msgstr "Mostra indicatori della larghezza di banda sul waterfall" #: src/dialogs/confdialog.cxx:19719 msgid "Notch" msgstr "Notch" #: src/dialogs/confdialog.cxx:19731 #, fuzzy msgid "RsID Zone" msgstr "Ricezione RSID" #: src/dialogs/confdialog.cxx:19743 #, fuzzy #| msgid "Monitor ON" msgid "Monitor" msgstr "Monitor ON" #: src/dialogs/confdialog.cxx:19744 #, fuzzy #| msgid "Rx Audio Monitor" msgid "Audio monitor" msgstr "Rx Audio Monitor" #: src/dialogs/confdialog.cxx:19763 msgid "Frequency scale" msgstr "Scala di frequenza" #: src/dialogs/confdialog.cxx:19766 msgid "Always show audio frequencies" msgstr "Mostra sempre le frequenze audio" #: src/dialogs/confdialog.cxx:19767 msgid "Audio or RF frequencies on waterfall scale" msgstr "Frequenze audio o RF sulla scala del waterfall" #: src/dialogs/confdialog.cxx:19773 msgid "Select waterfall scale font" msgstr "Scegli il carattere della scala del waterfall" #: src/dialogs/confdialog.cxx:19778 msgid "Transmit signal" msgstr "Segnale trasmesso" #: src/dialogs/confdialog.cxx:19781 msgid "Monitor transmitted signal" msgstr "Monitora il segnale trasmesso" #: src/dialogs/confdialog.cxx:19782 msgid "Show transmit signal on waterfall" msgstr "Mostra il segnale trasmesso sul waterfall" #: src/dialogs/confdialog.cxx:19787 #, fuzzy msgid "Signal Level (dB)" msgstr "Livello del segnale" #: src/dialogs/confdialog.cxx:19788 msgid "Set level for good viewing" msgstr "Imposta il livello per una buona visualizzazione" #: src/dialogs/confdialog.cxx:19805 src/dialogs/confdialog.cxx:19941 #: src/dialogs/confdialog.cxx:19943 #, fuzzy msgid "Waterfall/FFT Processing" msgstr "Elaborazione FFT" #: src/dialogs/confdialog.cxx:19812 msgid "Low frequency limit in Hz" msgstr "Limite inferiore di frequenza in Hz" #: src/dialogs/confdialog.cxx:19831 msgid "FFT averaging" msgstr "Media FFT" #: src/dialogs/confdialog.cxx:19832 msgid "Use averaging to decrease waterfall noise" msgstr "Usa la media per diminuire il rumore del waterfall" #: src/dialogs/confdialog.cxx:19837 msgid "FFT prefilter window function" msgstr "Funzione di prefiltro a finestra FFT" #: src/dialogs/confdialog.cxx:19849 msgid "Rectangular" msgstr "Rettangolare" #: src/dialogs/confdialog.cxx:19851 msgid "Triangular" msgstr "Triangolare" #: src/dialogs/confdialog.cxx:19857 msgid "High frequency limit in Hz" msgstr "Limite superiore di frequenza in Hz" #: src/dialogs/confdialog.cxx:19876 msgid "Latency" msgstr "Latenza" #: src/dialogs/confdialog.cxx:19877 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" "Media del segnale nel tempo\n" "0 - meno\n" "4 - più" #: src/dialogs/confdialog.cxx:19899 src/dialogs/confdialog.cxx:19916 msgid "Show me more or less waterfall" msgstr "Mostrami piú o meno waterfall" #: src/dialogs/confdialog.cxx:19902 #, fuzzy msgid "Slow drop rate" msgstr "Velocita' verticale WF" #: src/dialogs/confdialog.cxx:19903 #, fuzzy msgid "Normal drop speed / value" msgstr "Velocità del waterfall" #: src/dialogs/confdialog.cxx:19919 msgid "Waterfall height in pixels" msgstr "Altezza del waterfall in pixel" #: src/dialogs/confdialog.cxx:19920 msgid "CPU usage increases with waterfall height" msgstr "L'utilizzo della CPU aumenta con l'altezza del waterfall" #: src/dialogs/confdialog.cxx:19946 src/dialogs/confdialog.cxx:20000 #: src/dialogs/confdialog.cxx:20002 #, fuzzy msgid "Waterfall/Mouse usage" msgstr "Velocità del waterfall" #: src/dialogs/confdialog.cxx:19952 msgid "Left or right click always replays audio history" msgstr "Click destro o sinistro riascolta la memoria audio" #: src/dialogs/confdialog.cxx:19953 msgid "Replay trackline audio" msgstr "Rianalizza i dati audio degli ultimi 2 minuti" #: src/dialogs/confdialog.cxx:19958 msgid "Dragging on the waterfall scale changes frequency" msgstr "Trascinare sulla scala del waterfall cambia la frequenza" #: src/dialogs/confdialog.cxx:19959 msgid "Enable drag cursor on waterfall scale" msgstr "Abilita il trascinamento del cursore sulla scala del waterfall" #: src/dialogs/confdialog.cxx:19964 msgid "Insert text on single left click" msgstr "Inserisci testo con un singolo click sinistro" #: src/dialogs/confdialog.cxx:19965 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Inserisci testo speciale nel pannello Rx\n" "quando fai click sul waterfall" #: src/dialogs/confdialog.cxx:19971 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "La stringa viene sostituita\n" "con il modem e la frequenza correnti" #: src/dialogs/confdialog.cxx:19983 msgid "Wheel action" msgstr "Azione della rotella del mouse" #: src/dialogs/confdialog.cxx:19984 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Scegli il comportamento della rotella\n" "del mouse all'interno del waterfall" #: src/dialogs/confdialog.cxx:20005 src/dialogs/confdialog.cxx:20042 #: src/dialogs/confdialog.cxx:20044 #, fuzzy msgid "Waterfall/Spectrum" msgstr "Waterfall" #: src/dialogs/confdialog.cxx:20009 msgid "Spectrum Scope / Waterfall interaction" msgstr "Interazione Spettroscopio / Waterfall" #: src/dialogs/confdialog.cxx:20012 msgid "left click transfers frequency to scope center frequency" msgstr "" "il clic sinistro trasferisce la frequenza alla frequenza centrale " "dell'oscilloscopio" #: src/dialogs/confdialog.cxx:20013 msgid "left click on WF recenters spectrum scope" msgstr "fare clic con il tasto sinistro sul WFper ricentrare lo spettroscopio" #: src/dialogs/confdialog.cxx:20018 msgid "use waterfall range/limit values" msgstr "usa valori intervallo/limite nel waterfall" #: src/dialogs/confdialog.cxx:20019 #, fuzzy msgid "values left/below waterfall" msgstr "Valori sotto a sinistra del waterfall" #: src/dialogs/confdialog.cxx:20024 msgid "freq scale = N * modem bandwidth" msgstr "Scala frequenza = N * larghezza di banda modem" #: src/dialogs/confdialog.cxx:20034 #, fuzzy msgid "use" msgstr "usa" #: src/dialogs/confdialog.cxx:20035 msgid "scale spectrum display linked to modem bandwidth" msgstr "" "scala del display dello spettro collegata alla larghezza di banda del modem" #: src/dialogs/confdialog.cxx:20048 src/dialogs/confdialog.cxx:20154 #: src/dialogs/confdialog.cxx:20156 #, fuzzy msgid "Web/Pskmail" msgstr "Pskmail" #: src/dialogs/confdialog.cxx:20052 msgid "Mail Server Attributes" msgstr "Attributi del mail server" #: src/dialogs/confdialog.cxx:20055 msgid "Carrier frequency (Hz)" msgstr "Frequenza portante (Hz)" #: src/dialogs/confdialog.cxx:20056 msgid "Default listen / transmit frequency" msgstr "Frequenza predefinita di ascolto / trasmissione" #: src/dialogs/confdialog.cxx:20075 msgid "Search range (Hz)" msgstr "Area di ricerca (Hz)" #: src/dialogs/confdialog.cxx:20076 msgid "Listen for signals within this range" msgstr "Cerca segnali all'interno di questa area" #: src/dialogs/confdialog.cxx:20115 msgid "AFC range (Hz)" msgstr "Area AFC (Hz)" #: src/dialogs/confdialog.cxx:20116 msgid "Limit AFC movement to this range" msgstr "Limita i movimenti AFC a questa area" #: src/dialogs/confdialog.cxx:20135 msgid "Reset to Carrier" msgstr "Reimposta alla portante" #: src/dialogs/confdialog.cxx:20136 msgid "When no signal present" msgstr "Quando non ci sono segnali" #: src/dialogs/confdialog.cxx:20144 msgid "General" msgstr "Generale" #: src/dialogs/confdialog.cxx:20147 msgid "Report ARQ frames average S/N" msgstr "Riporta il S/N medio dei frame ARQ" #: src/dialogs/confdialog.cxx:20159 src/dialogs/confdialog.cxx:20242 #: src/dialogs/confdialog.cxx:20244 msgid "Web/WX" msgstr "WX" #: src/dialogs/confdialog.cxx:20163 msgid "Access URL" msgstr "Accesso URL" #: src/dialogs/confdialog.cxx:20164 msgid "Enter METAR data internet URL" msgstr "Inserire dati METAR da internet URL" #: src/dialogs/confdialog.cxx:20170 #, fuzzy msgid "Default URL" msgstr "URL Predefinito" #: src/dialogs/confdialog.cxx:20173 msgid "METAR station ID code" msgstr "Codice ID stazione METAR" #: src/dialogs/confdialog.cxx:20174 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" "per esempio LIMJ per\n" "Aeroporto Genova Sestri" #: src/dialogs/confdialog.cxx:20179 msgid "Search on web" msgstr "Cerca sul web" #: src/dialogs/confdialog.cxx:20182 #, fuzzy msgid "Full report" msgstr "Rapporto completo" #: src/dialogs/confdialog.cxx:20183 src/dialogs/confdialog.cxx:20237 #, fuzzy msgid "Insert full METAR report" msgstr "Inserisci rapporto METAR completo" #: src/dialogs/confdialog.cxx:20188 msgid "METAR station location" msgstr "Posizione stazione METAR" #: src/dialogs/confdialog.cxx:20189 msgid "Add geopolitical name of METAR station" msgstr "Aggiungi nome geopolitico della stazione METAR" #: src/dialogs/confdialog.cxx:20194 #, fuzzy msgid "Conditions" msgstr "Condizioni" #: src/dialogs/confdialog.cxx:20195 msgid "current wx conditions" msgstr "condizioni meteo correnti" #: src/dialogs/confdialog.cxx:20200 msgid "Fahrenheit" msgstr "Fahrenheit" #: src/dialogs/confdialog.cxx:20201 msgid "report Fahrenheit" msgstr "riportare Fahrenheit" #: src/dialogs/confdialog.cxx:20206 msgid "Celsius" msgstr "Celsius" #: src/dialogs/confdialog.cxx:20207 #, fuzzy msgid "report Celsius" msgstr "riportare Celsius" #: src/dialogs/confdialog.cxx:20212 msgid "Miles / Hour" msgstr "Miglia / Ora" #: src/dialogs/confdialog.cxx:20213 msgid "report miles per hour" msgstr "riportare miglia per ora" #: src/dialogs/confdialog.cxx:20218 msgid "kilometers / hour" msgstr "kilometri / ora" #: src/dialogs/confdialog.cxx:20219 msgid "report kilometers per hour" msgstr "riportare kilometri all'ora" #: src/dialogs/confdialog.cxx:20224 msgid "Inches Hg." msgstr "Pollici Hg" #: src/dialogs/confdialog.cxx:20225 msgid "report inches mercury" msgstr "riportare pollici di mercurio" #: src/dialogs/confdialog.cxx:20230 msgid "mbars" msgstr "mbars" #: src/dialogs/confdialog.cxx:20231 #, fuzzy msgid "report millibars" msgstr "riportare millibar" #: src/dialogs/confdialog.cxx:20236 msgid "Unprocessed METAR data" msgstr "" #: src/dialogs/confdialog.cxx:20254 msgid "Restore defaults" msgstr "Ripristina predefiniti" #: src/dialogs/confdialog.cxx:20255 msgid "WARNING - this will over write ALL settings" msgstr "ATTENZIONE - questo sovrascriverà TUTTE le impostazioni" #: src/dialogs/font_browser.cxx:77 msgid "Font color" msgstr "Colori dei caratteri" #: src/dialogs/font_browser.cxx:150 msgid "Font:" msgstr "Caratteri:" #: src/dialogs/font_browser.cxx:155 msgid "Size:" msgstr "Dimensione:" #: src/dialogs/font_browser.cxx:165 msgid "Fixed" msgstr "" #: src/dialogs/font_browser.cxx:169 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:184 msgid "" "abcdefghijklmnopqrstuvwxyz\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" "0123456789" msgstr "" #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 #, fuzzy msgid "Data files sources" msgstr "Sorgente file dati" #: src/dialogs/record_browse.cxx:27 #, fuzzy msgid "Data files update" msgstr "Aggiornamento file dati" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Fonti di dati tabulari" #: src/dialogs/record_browse.cxx:43 #, fuzzy msgid "Data source" msgstr "Sorgente dei dati" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Repository dei file dati" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" "Aggiorna i file di dati locali selezionati con il contenuto del repository" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Elimina i file di dati locali se selezionato." #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Evento" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entità DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Mostra le entità DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Non lavorato in precedenza" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Utente LoTW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "utente eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplicati" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignora duplicati" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "in:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Tempo (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Azione" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Limite attivazione (s)" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Tempo minimo tra eventi" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Mostra la finestra di avviso:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Inserisci testo predefinito" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Nascondi la finestra dopo (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Aggiungi al testo ricevuto:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Aggiungi al testo trasmesso:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Mostra l'editor delle macro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Esegui programma:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entità DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Trova il paese:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Premi invio per continuare la ricerca" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Trova il prefisso:" #: src/logbook/lgbook.cxx:615 msgid "Export Setup" msgstr "Configurazione per l'export" #: src/logbook/lgbook.cxx:616 src/logbook/lgbook.cxx:1631 msgid "Select Records to Export" msgstr "Seleziona i record da esportare" #: src/logbook/lgbook.cxx:624 src/logbook/lgbook.cxx:825 #: src/logbook/lgbook.cxx:1639 src/logbook/lgbook.cxx:1721 msgid "Check All" msgstr "Seleziona tutto" #: src/logbook/lgbook.cxx:627 #, fuzzy msgid "Start Date" msgstr "Parti da" #: src/logbook/lgbook.cxx:628 msgid "Start date for export" msgstr "" #: src/logbook/lgbook.cxx:641 #, fuzzy msgid "Stop Date" msgstr "Data QSO" #: src/logbook/lgbook.cxx:642 msgid "Inclusive stop date for export" msgstr "" #: src/logbook/lgbook.cxx:655 #, fuzzy msgid "select by date" msgstr "Seleziona la radio per nome" #: src/logbook/lgbook.cxx:656 #, fuzzy msgid "Enable to select date range" msgstr "Tasto sinistro per cambiare il colore dei duplicati" #: src/logbook/lgbook.cxx:662 msgid "Select Fields to Export" msgstr "Seleziona i campi da esportare" #: src/logbook/lgbook.cxx:673 src/logbook/lgbook.cxx:1670 msgid "Freq" msgstr "Freq" #: src/logbook/lgbook.cxx:684 msgid "QSO Date On" msgstr "Data inizio QSO" #: src/logbook/lgbook.cxx:688 msgid "QSO Date Off" msgstr "Data fine QSO" #: src/logbook/lgbook.cxx:692 msgid "Time ON" msgstr "Ora ON" #: src/logbook/lgbook.cxx:696 src/logbook/lgbook.cxx:1682 msgid "Time OFF" msgstr "Ora OFF" #: src/logbook/lgbook.cxx:699 msgid "TX Power" msgstr "Potenza TX" #: src/logbook/lgbook.cxx:702 src/logbook/lgbook.cxx:1686 msgid "RST sent" msgstr "RST inv." #: src/logbook/lgbook.cxx:706 src/logbook/lgbook.cxx:1690 msgid "RST rcvd" msgstr "RST ric." #: src/logbook/lgbook.cxx:710 src/logbook/lgbook.cxx:1003 msgid "Qth" msgstr "QTH" #: src/logbook/lgbook.cxx:713 msgid "LOC" msgstr "Loc" #: src/logbook/lgbook.cxx:719 src/logbook/lgbook.cxx:1367 msgid "Age" msgstr "Età" #: src/logbook/lgbook.cxx:722 src/logbook/lgbook.cxx:1243 #, fuzzy msgid "Station Call" msgstr "Stazione corrispondente" #: src/logbook/lgbook.cxx:725 src/logbook/lgbook.cxx:1267 #, fuzzy msgid "Station QTH" msgstr "Stazione QTH" #: src/logbook/lgbook.cxx:728 #, fuzzy msgid "Station LOC" msgstr "Stazione LOC" #: src/logbook/lgbook.cxx:740 src/logbook/lgbook.cxx:1224 msgid "Notes" msgstr "Note" #: src/logbook/lgbook.cxx:743 msgid "QSL rcvd date" msgstr "QSL ricevuta il" #: src/logbook/lgbook.cxx:746 msgid "QSL sent date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:749 #, fuzzy msgid "eQSL rcvd date" msgstr "eQSL ricevuta il" #: src/logbook/lgbook.cxx:752 #, fuzzy msgid "eQSL sent date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:755 #, fuzzy msgid "LoTW rcvd date" msgstr "QSL ricevuta il" #: src/logbook/lgbook.cxx:758 #, fuzzy msgid "LoTW sent date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:761 src/logbook/lgbook.cxx:1132 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:764 src/logbook/lgbook.cxx:1694 msgid "Serial # in" msgstr "Seriale ricevuto" #: src/logbook/lgbook.cxx:767 src/logbook/lgbook.cxx:1698 msgid "Serial # out" msgstr "Seriale trasmesso" #: src/logbook/lgbook.cxx:776 src/logbook/lgbook.cxx:1706 msgid "Exchange Out" msgstr "Rapporto dato" #: src/logbook/lgbook.cxx:785 src/logbook/lgbook.cxx:1174 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:788 src/logbook/lgbook.cxx:1210 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:791 src/logbook/lgbook.cxx:1162 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:794 src/logbook/lgbook.cxx:1198 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:797 msgid "FD class" msgstr "Classe FD" #: src/logbook/lgbook.cxx:800 #, fuzzy msgid "FD section" msgstr "Ricezione RSID" #: src/logbook/lgbook.cxx:803 msgid "CW SS SerNo R" msgstr "CW SS SerNo R" #: src/logbook/lgbook.cxx:804 msgid "CW sweepstakes rcvd ser. no." msgstr "CW sweepstakes rcvd ser. no." #: src/logbook/lgbook.cxx:807 msgid "CW SS Prec'" msgstr "CW SS Prec'" #: src/logbook/lgbook.cxx:808 msgid "CW sweepstakes precedence" msgstr "CW sweepstakes precedenza" #: src/logbook/lgbook.cxx:811 #, fuzzy msgid "CW SS Check" msgstr "CW SS Controllo" #: src/logbook/lgbook.cxx:814 #, fuzzy msgid "CW SS Section" msgstr "CW SS Sezione" #: src/logbook/lgbook.cxx:815 src/logbook/lgbook.cxx:819 msgid "CW sweepstakes section" msgstr "CW sweepstakes sezione" #: src/logbook/lgbook.cxx:818 src/logbook/lgbook.cxx:1379 msgid "10-10" msgstr "10-10" #: src/logbook/lgbook.cxx:844 msgid "Logbook" msgstr "Log" #: src/logbook/lgbook.cxx:845 #, fuzzy msgid "Date On" msgstr "Data inizio" #: src/logbook/lgbook.cxx:846 msgid "Date QSO started" msgstr "Data di inizio QSO" #: src/logbook/lgbook.cxx:858 msgid "Time On" msgstr "Ora d'inizio" #: src/logbook/lgbook.cxx:859 msgid "Time QSO started" msgstr "Ora inizio QSO" #: src/logbook/lgbook.cxx:871 msgid "Call sign worked" msgstr "Nominativo lavorato" #: src/logbook/lgbook.cxx:883 msgid "Operator worked" msgstr "Operatore lavorato" #: src/logbook/lgbook.cxx:894 msgid "In" msgstr "In" #: src/logbook/lgbook.cxx:895 msgid "Rst received" msgstr "RST ricevuto" #: src/logbook/lgbook.cxx:906 msgid "Recs" msgstr "Rec." #: src/logbook/lgbook.cxx:907 msgid "# Records in logbook" msgstr "Numero di record nel log" #: src/logbook/lgbook.cxx:918 #, fuzzy msgid "Date Off" msgstr "Data fine" #: src/logbook/lgbook.cxx:919 msgid "Date QSO Ended" msgstr "Data di fine QSO" #: src/logbook/lgbook.cxx:931 msgid "Time Off" msgstr "Ora di fine" #: src/logbook/lgbook.cxx:932 msgid "Time QSO ended" msgstr "Ora di fine QSO" #: src/logbook/lgbook.cxx:943 msgid "Freq." msgstr "Freq." #: src/logbook/lgbook.cxx:944 msgid "Frequency in MHz" msgstr "Frequenza in MHz" #: src/logbook/lgbook.cxx:956 msgid "Mode in use" msgstr "Modo in uso" #: src/logbook/lgbook.cxx:967 #, fuzzy msgid "Pwr" msgstr "Pwr" #: src/logbook/lgbook.cxx:968 msgid "Transmit power used" msgstr "Potenza di trasmissione usata" #: src/logbook/lgbook.cxx:979 msgid "Loc" msgstr "Loc" #: src/logbook/lgbook.cxx:980 msgid "Stations grid square" msgstr "Grid Square della stazione" #: src/logbook/lgbook.cxx:991 msgid "Out" msgstr "Out" #: src/logbook/lgbook.cxx:992 msgid "Rst sent" msgstr "RST inviato" #: src/logbook/lgbook.cxx:1004 msgid "City of station worked" msgstr "Cittá della stazione lavorata" #: src/logbook/lgbook.cxx:1015 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:1016 msgid "US state of station worked" msgstr "Stato USA della stazione lavorato" #: src/logbook/lgbook.cxx:1027 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:1028 msgid "Province of station worked" msgstr "Provincia della stazione lavorata" #: src/logbook/lgbook.cxx:1040 msgid "Country of station worked" msgstr "Country della stazione lavorato" #: src/logbook/lgbook.cxx:1053 #, fuzzy msgid "QSL" msgstr "QSL" #: src/logbook/lgbook.cxx:1054 msgid "QSL-rcvd" msgstr "QSL-ric" #: src/logbook/lgbook.cxx:1055 src/logbook/lgbook.cxx:1068 #: src/logbook/lgbook.cxx:1081 msgid "QSL received on this date" msgstr "QSL ricevuta il" #: src/logbook/lgbook.cxx:1067 #, fuzzy msgid "EQSL-rcvd" msgstr "EQSL-ric" #: src/logbook/lgbook.cxx:1080 #, fuzzy msgid "LOTW-rcvd" msgstr "LOTW-ric" #: src/logbook/lgbook.cxx:1093 msgid "QSL-sent" msgstr "QSL-inv" #: src/logbook/lgbook.cxx:1094 src/logbook/lgbook.cxx:1107 #: src/logbook/lgbook.cxx:1120 msgid "QSL sent on this date" msgstr "QSL inviata il" #: src/logbook/lgbook.cxx:1106 #, fuzzy msgid "EQSL-sent" msgstr "QSL-inv" #: src/logbook/lgbook.cxx:1119 #, fuzzy msgid "LOTW-sent" msgstr "EQSL-inv" #: src/logbook/lgbook.cxx:1133 msgid "QSL route of contacted station" msgstr "Percorso QSL della stazione contattata" #: src/logbook/lgbook.cxx:1163 msgid "Islands on the air" msgstr "Islands on the air" #: src/logbook/lgbook.cxx:1186 #, fuzzy msgid "Cont'" msgstr "Contest" #: src/logbook/lgbook.cxx:1211 msgid "DXCC designator" msgstr "Designatore DXCC" #: src/logbook/lgbook.cxx:1227 src/logbook/lgbook.cxx:1244 #: src/logbook/lgbook.cxx:1256 src/logbook/lgbook.cxx:1268 #: src/logbook/lgbook.cxx:1280 #, fuzzy msgid "Interesting notes" msgstr "Note interessanti (max 80 car.)" #: src/logbook/lgbook.cxx:1241 #, fuzzy msgid "My Station" msgstr "La mia Stazione" #: src/logbook/lgbook.cxx:1279 #, fuzzy msgid "Station Locator" msgstr "Locatore di Stazione" #: src/logbook/lgbook.cxx:1295 #, fuzzy msgid "Ser out" msgstr "Ser inviato" #: src/logbook/lgbook.cxx:1296 src/logbook/lgbook.cxx:1421 #, fuzzy msgid "Contest seral # sent" msgstr "Numero seriale del contest inviato" #: src/logbook/lgbook.cxx:1307 #, fuzzy msgid "Exch Out" msgstr "Rapporto inviato" #: src/logbook/lgbook.cxx:1308 src/logbook/lgbook.cxx:1445 msgid "Contest exchange sent" msgstr "Rapporto contest inviato" #: src/logbook/lgbook.cxx:1319 msgid "Ser in" msgstr "Ser in" #: src/logbook/lgbook.cxx:1320 msgid "Contest serial # received" msgstr "Numero seriale del contest ricevuto" #: src/logbook/lgbook.cxx:1331 #, fuzzy msgid "Exch In" msgstr "Rapporto ricevuto" #: src/logbook/lgbook.cxx:1332 src/logbook/lgbook.cxx:1457 msgid "Contest exchange received" msgstr "Rapporto contest ricevuto" #: src/logbook/lgbook.cxx:1344 #, fuzzy msgid "Field Day class received" msgstr "Classe Field Day ricevuta" #: src/logbook/lgbook.cxx:1355 msgid "ARRL Sect" msgstr "ARRL Sez." #: src/logbook/lgbook.cxx:1356 #, fuzzy msgid "Field Section received" msgstr "Sezione Field Day ricevuta" #: src/logbook/lgbook.cxx:1368 #, fuzzy msgid "Operators age received" msgstr "Età degli operatori ricevuta" #: src/logbook/lgbook.cxx:1380 msgid "Ten Ten number received" msgstr "Dieci Dieci numero ricevuto" #: src/logbook/lgbook.cxx:1392 #, fuzzy msgid "Operating band" msgstr "Banda operativa" #: src/logbook/lgbook.cxx:1404 #, fuzzy msgid "Check value received" msgstr "Controlla valore ricevuto" #: src/logbook/lgbook.cxx:1417 msgid "CW SS" msgstr "CW SS" #: src/logbook/lgbook.cxx:1418 msgid "CW Sweepstakes Contest" msgstr "CW Sweepstakes Contest" #: src/logbook/lgbook.cxx:1420 #, fuzzy msgid "Ser NoR" msgstr "Ser NoR" #: src/logbook/lgbook.cxx:1444 msgid "Precedence" msgstr "Precedenza" #: src/logbook/lgbook.cxx:1470 msgid "JOTA" msgstr "JOTA" #: src/logbook/lgbook.cxx:1471 msgid "Jamboree On The Air" msgstr "Jamboree On The Air" #: src/logbook/lgbook.cxx:1473 msgid "Troop-S" msgstr "Troop-S" #: src/logbook/lgbook.cxx:1474 #, fuzzy msgid "Sent troop number" msgstr "Numero troop inviato" #: src/logbook/lgbook.cxx:1485 msgid "Troop-R" msgstr "Troop-R" #: src/logbook/lgbook.cxx:1486 #, fuzzy msgid "Received troop number" msgstr "Numero troop ricevuto" #: src/logbook/lgbook.cxx:1497 #, fuzzy msgid "Name-S" msgstr "Nome-S" #: src/logbook/lgbook.cxx:1498 msgid "Sent scout name" msgstr "Nome scout inviato" #: src/logbook/lgbook.cxx:1509 #, fuzzy msgid "Name-R" msgstr "Nome-R" #: src/logbook/lgbook.cxx:1510 #, fuzzy msgid "Received scout name" msgstr "Nome scout ricevuto" #: src/logbook/lgbook.cxx:1526 msgid "Call Search" msgstr "Cerca Nominativo" #: src/logbook/lgbook.cxx:1527 msgid "Search for this callsign" msgstr "Cerca questo nominativo" #: src/logbook/lgbook.cxx:1539 msgid "Find previous" msgstr "Trova precedente" #: src/logbook/lgbook.cxx:1547 msgid "Find next" msgstr "Trova successivo" #: src/logbook/lgbook.cxx:1554 #, fuzzy msgid "Retrieve" msgstr "Recupera" #: src/logbook/lgbook.cxx:1555 msgid "Retrieve for active modem use" msgstr "Recupera per l'uso del modem attivo" #: src/logbook/lgbook.cxx:1568 msgid "New record / Save record" msgstr "Nuovo record / Salva record" #: src/logbook/lgbook.cxx:1575 msgid "Update the current record" msgstr "Aggiorna il record corrente" #: src/logbook/lgbook.cxx:1582 msgid "Delete the current record" msgstr "Cancella il record corrente" #: src/logbook/lgbook.cxx:1588 #, fuzzy msgid "File:" msgstr "&File:" #: src/logbook/lgbook.cxx:1611 msgid "Date" msgstr "Data" #: src/logbook/lgbook.cxx:1613 msgid "Time" msgstr "Ora" #: src/logbook/lgbook.cxx:1630 msgid "Cabrillo Setup" msgstr "Impostazione Cabrillo" #: src/logbook/lgbook.cxx:1650 msgid "Select Cabrillo Contest & Fields" msgstr "Scegli il Contest e i campi Cabrillo" #: src/logbook/lgbook.cxx:1653 msgid "Contest:" msgstr "Contest:" #: src/logbook/lgbook.cxx:1678 msgid "QSO Date" msgstr "Data QSO" #, fuzzy #~ msgid "Searches passband" #~ msgstr "Decodifica in tutta la banda passante" #~ msgid "Lighted button enabled colors" #~ msgstr "Colori dei pulsanti illuminati selezionati" #, fuzzy #~ msgid "All Others" #~ msgstr "Altro" #~ msgid "Receive modes" #~ msgstr "Modi ricezione" #, fuzzy #~ msgid "Transceiver FSK" #~ msgstr "Controllo del ricetrasmettitore" #, fuzzy #~ msgid "NBEMS interface" #~ msgstr "Interfaccia per file di dati NBEMS" #~ msgid "Signal level" #~ msgstr "Livello del segnale" #, fuzzy #~ msgid "Filter Settings" #~ msgstr "Filtraggio" #~ msgid "BW" #~ msgstr "BW" #~ msgid "Mid" #~ msgstr "Medio" #, fuzzy #~ msgid "Filter center frequ ency" #~ msgstr "Aggiungi la frequenza corrente" #, fuzzy #~ msgid "Filter low cutoff frequency" #~ msgstr "Aggiusta la frequenza del cursore" #, fuzzy #~ msgid "Filter high cutoff frequency" #~ msgstr "Scorri la porzione visualizzata verso frequenze piú alte" #, fuzzy #~ msgid "track WF cursor" #~ msgstr "Colore tracce sul waterfall" #~ msgid "Vol'" #~ msgstr "Vol'" #, fuzzy #~ msgid "Rx audio volume" #~ msgstr "Audio RX" #, fuzzy #~ msgid "Filtered audio" #~ msgstr "Audio filtrato" #, fuzzy #~ msgid "Enable DSP filtering of rx audio stream" #~ msgstr "Abilita il flusso del testo ricevuto" #, fuzzy #~ msgid "Weather Fax Image RX" #~ msgstr "Immagine Meteo Fax RX" #~ msgid "No file name given" #~ msgstr "NEssun nome file specificato" #, fuzzy #~ msgid "channels != 1" #~ msgstr "Mostra canali" #~ msgid "unknown wave file error" #~ msgstr "Errore file wave sconosciuto" #~ msgid "Rig control" #~ msgstr "Controllo della radio" #~ msgid "Flrig I/O" #~ msgstr "Flrig I/O" #~ msgid "RPC" #~ msgstr "RPC" #~ msgid "Spotter" #~ msgstr "Spotter" #, fuzzy #~ msgid "KISS control" #~ msgstr "Controllo KISS" #~ msgid "Mac Logger" #~ msgstr "Mac Logger" #~ msgid "Log sources" #~ msgstr "Origine dei log" #~ msgid "Change log level" #~ msgstr "Cambia livello di log" #, fuzzy #~ msgid "Waveform Audio Format]\t*.{mp3,wav}\n" #~ msgstr "" #~ "Formato audio]\t*.{mp3,wav}\n" #~ "Formato audio\t*.wav\n" #~ "AU\t*.{au,snd}\n" #, fuzzy #~ msgid "Waveform Audio Format\t*.wav\n" #~ msgstr "" #~ "Formato audio\t*.wav\n" #~ "Formato audio\t*.wav\n" #~ "AU\t*.{au,snd}\n" #~ msgid "Free Lossless Audio Codec\t*.flac" #~ msgstr "Free Lossless Audio Codec\t*.flac" #~ msgid "Embedded Wefax Gui" #~ msgstr "Interfaccia Wefax integrata" #~ msgid "" #~ "Display tx and rx in main fldigi window.\n" #~ "Change requires restart of fldigi" #~ msgstr "" #~ "Mostra tx ed rx nella finestra principale di fldigi.\n" #~ "la modifica richiede il riavvio di fldigi" #~ msgid "Hide Transmission window" #~ msgstr "Nascondi la finestra di Trasmissione" #~ msgid "Hide transmission window by default." #~ msgstr "Nascondi la finestra di trasmissione per impostazione predefinita" #, fuzzy #~ msgid "Center freq (1500 Hz)" #~ msgstr "Centro frequenza (1500 Hz)" #, fuzzy #~ msgid "Save image as monochrome file" #~ msgstr "Salva immagine monocromatiche" #~ msgid "Save the fax image as a gray-level PNG file." #~ msgstr "Salva l'immagine fax come file PNG in sclaa di grigi" #, fuzzy #~ msgid "Misc/IO" #~ msgstr "IO" #, fuzzy #~ msgid "Misc/NBEMS" #~ msgstr "NBEMS" #, fuzzy #~ msgid "Retry Interval (msec)" #~ msgstr "Tempo tra tentativi (ms)" #~ msgid "Msec's between retries" #~ msgstr "Tempo in ms tra i tentativi" #~ msgid "Alerts / Rx Audio" #~ msgstr "Alerts / Rx Audio" #~ msgid "" #~ "That crazy fox jumped over the dog again!\n" #~ "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" #~ "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #~ msgstr "" #~ "Quella volpe pazza saltò di nuovo sul cane!\n" #~ "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" #~ "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #~ msgid "Reading fonts..." #~ msgstr "Sto caricando i caratteri..." #~ msgid "Set Mid point of filter at waterfall cursor" #~ msgstr "Impostare il punto medio del filtro sul cursore del waterfall" #~ msgid "Weight (%)" #~ msgstr "Peso (%)" #~ msgid "Dot to dot-space ratio" #~ msgstr "Rapporto tra punto e punto-spazio" #, fuzzy #~ msgid "Edge decrease" #~ msgstr "Il tempo di salita riduce la larghezza dell'impulso" #~ msgid "Weight decreases with increasing edge timing" #~ msgstr "Il peso diminuisce aumentando il tempo di salita" #, fuzzy #~ msgid "BPF transmit audio" #~ msgstr "Velocitá di trasmissione CW (WPM)" #~ msgid "Msec pre-keydown (+ is earlier in time)" #~ msgstr "Quanti ms prima dell'impulso viene attivata la linea QSK" #~ msgid "Msec post-keydown (+ is earlier in time)" #~ msgstr "Quanti ms dopo l'impulso viene disattivata la linea QSK" #~ msgid "User Interface" #~ msgstr "Interfaccia Utente" #, fuzzy #~ msgid "Operating" #~ msgstr "Operatore" #, fuzzy #~ msgid "Active Modem" #~ msgstr "Modo ricezione" #, fuzzy #~ msgid "CPU speed" #~ msgstr "Velocità AFC" #, fuzzy #~ msgid "PSKmail" #~ msgstr "PSKmail" #, fuzzy #~ msgid "Sweet spot" #~ msgstr "Frequenza preferita" #, fuzzy #~ msgid "Text IO" #~ msgstr "Testo IO" #, fuzzy #~ msgid "IO" #~ msgstr "IO" #, fuzzy #~ msgid "PSM" #~ msgstr "PSM" #, fuzzy #~ msgid "Contest/Logging" #~ msgstr "Logging" #, fuzzy #~ msgid "Station / Operator" #~ msgstr "Stazione / Operatore" #~ msgid "Browser" #~ msgstr "Navigatore" #, fuzzy #~ msgid "Log" #~ msgstr "Log" #, fuzzy #~ msgid "QSO" #~ msgstr "QSO" #, fuzzy #~ msgid "WF Ctrls" #~ msgstr "Controlli WF" #, fuzzy #~ msgid "Clrs/Fnts" #~ msgstr "Colori/Caratteri" #, fuzzy #~ msgid "Rx/Tx" #~ msgstr "Testo Rx/Tx" #, fuzzy #~ msgid "F_keys" #~ msgstr "Tasti funzione" #~ msgid "Tabs" #~ msgstr "Tab" #~ msgid "Buttons" #~ msgstr "Pulsanti" #~ msgid "Display" #~ msgstr "Visualizzazione" #~ msgid "Mouse" #~ msgstr "Mouse" #~ msgid "TX WPM" #~ msgstr "TX WPM" #, fuzzy #~ msgid "Dom" #~ msgstr "DomEX" #, fuzzy #~ msgid "Feld" #~ msgstr "Feldhell" #~ msgid "MT-63" #~ msgstr "MT-63" #, fuzzy #~ msgid "Oliv" #~ msgstr "Olivia" #, fuzzy #~ msgid "Cont" #~ msgstr "Contest" #~ msgid "PSK" #~ msgstr "PSK" #, fuzzy #~ msgid "TTY" #~ msgstr "RTTY" #, fuzzy #~ msgid "Rx" #~ msgstr "RxID" #, fuzzy #~ msgid "Tx" #~ msgstr "TxID" #, fuzzy #~ msgid "Synop" #~ msgstr "Scope" #~ msgid "Thor" #~ msgstr "Thor" #~ msgid "Rig" #~ msgstr "Radio" #~ msgid "RigCAT" #~ msgstr "RigCAT" #~ msgid "Hamlib" #~ msgstr "Hamlib" #~ msgid "Devices" #~ msgstr "Dispositivi" #, fuzzy #~ msgid "Regex Match in Browser" #~ msgstr "Regex Match nel Browser" #, fuzzy #~ msgid "flmsg interface" #~ msgstr "Interfaccia flmsg" #~ msgid "ID" #~ msgstr "ID" #~ msgid "Open squelch for nn sec if RSID detected" #~ msgstr "Apri lo squelch per nn sec se viene rilevato un RSID" #~ msgid "CPU" #~ msgstr "CPU" #~ msgid "Spotting" #~ msgstr "Spotting" #~ msgid "PSK Reporter" #~ msgstr "PSK Reporter" #, fuzzy #~ msgid "Temperature" #~ msgstr "Temperatura" #, fuzzy #~ msgid "eQSL" #~ msgstr "eQSL" #, fuzzy #~ msgid "Use password for tqsl access" #~ msgstr "Usa la password per l'accesso a tqsl" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Controllo della radio tramite \n" #~ "programma esterno che usa \n" #~ "chiamate remote xmlrpc." #~ msgid "Use XML-RPC program" #~ msgstr "Usa un programma XML-RPC" #~ msgid "Experimental" #~ msgstr "Sperimentale" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Inizializza il controllo della radio XML-RPC" #~ msgid "Enter a CALL !" #~ msgstr "Inserisci un NOMINATIVO !" #~ msgid "Clear list" #~ msgstr "Cancella la lista" #~ msgid "Delete from list" #~ msgstr "Togli dalla lista" #~ msgid "Select operating parameters" #~ msgstr "Seleziona i parametri operativi" #, fuzzy #~ msgid "Frq" #~ msgstr "Freq" #, fuzzy #~ msgid "frequency kHz" #~ msgstr "Frequenza in MHz" #~ msgid "On" #~ msgstr "Inizio" #, fuzzy #~ msgid "Press to update QSO start time" #~ msgstr "Premi per aggiornare l'ora di inizio QSO" #~ msgid "Off" #~ msgstr "Fine" #, fuzzy #~ msgid "QSO end time" #~ msgstr "Ora di fine QSO" #, fuzzy #~ msgid "call sign" #~ msgstr "Nominativo" #, fuzzy #~ msgid "QTH City" #~ msgstr "Città" #~ msgid "US State" #~ msgstr "Stato USA" #, fuzzy #~ msgid "Maidenhead Locator" #~ msgstr "Locator come in JN53rw" #~ msgid "Sent serial number (read only)" #~ msgstr "Numero seriale inviato (solo lettura)" #, fuzzy #~ msgid "Received FD class" #~ msgstr "Classe FD ricevuta" #, fuzzy #~ msgid "Received FD section" #~ msgstr "Sezione FD ricevuta" #, fuzzy #~ msgid "Received CQ zone" #~ msgstr "Zona CQ ricevuta" #, fuzzy #~ msgid "Received State/Prov" #~ msgstr "Stato/Provincia Ricevuto" #, fuzzy #~ msgid "Received serno" #~ msgstr "Numero seriale ricevuto" #, fuzzy #~ msgid "SS Check" #~ msgstr "SS Controlla" #, fuzzy #~ msgid "" #~ "Left click - save avatar\n" #~ "Right click - send my avatar" #~ msgstr "" #~ "Tasto sinistro - salva avatar\n" #~ "Tasto destro - invia il mio avatar" #~ msgid "Press to update" #~ msgstr "Premi per aggiornare" #~ msgid "Other call" #~ msgstr "Nominatvo corrispondente" #~ msgid "Received RST" #~ msgstr "RST ricevuto" #~ msgid "Sent RST" #~ msgstr "RST inviato" #~ msgid "Nm" #~ msgstr "Nm" #~ msgid "Other name" #~ msgstr "Nome corrispondente" #, fuzzy #~ msgid "" #~ "Left Click - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Tasto sinistro - esegui\n" #~ "Tasto destro - modifica" #~ msgid "" #~ "Left Click - execute\n" #~ "Shift-Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Tasto sinistro - esegui\n" #~ "Maiusc-Funz - esegui\n" #~ "Tasto destro - modifica" #~ msgid "Shift-key macro set" #~ msgstr "Gruppo di macro accessibile con maiusc" #~ msgid "" #~ "Left click - select\n" #~ "Right click - clear line" #~ msgstr "" #~ "Tasto sinistro - seleziona\n" #~ "Tasto destro - cancella la riga" #~ msgid "seek - regular expression" #~ msgstr "Cerca Regular Expression" #, fuzzy #~ msgid "Select FSQ station" #~ msgstr "Seleziona tutto" #, fuzzy #~ msgid "Stations Heard" #~ msgstr "Stazione sentita due volte" #~ msgid "" #~ "Left Click - execute\n" #~ "Fkey - execute\n" #~ "Right Click - edit" #~ msgstr "" #~ "Tasto sinistro - esegui\n" #~ "Tasto funzione - esegui\n" #~ "Tasto destro - modifica" #~ msgid "Primary macro set" #~ msgstr "Gruppo di macro principale" #~ msgid "Aborted" #~ msgstr "Annullato" #~ msgid "Timed out" #~ msgstr "Tempo scaduto" #~ msgid "Serial number" #~ msgstr "Numero progressivo" #, fuzzy #~ msgid "Contest Exchanges" #~ msgstr "Rapporto contest" #, fuzzy #~ msgid "Send Xchg" #~ msgstr "Inviare rapporto" #, fuzzy #~ msgid "Contest Logging" #~ msgstr "Log Contest" #, fuzzy #~ msgid "Generic" #~ msgstr "Generico" #, fuzzy #~ msgid "Use generic contest fields" #~ msgstr "Usa campi contest generici" #, fuzzy #~ msgid "Use Field Day Contest Fields" #~ msgstr "Usa campi contest Field Day" #, fuzzy #~ msgid "CQWW RTTY" #~ msgstr "CQWWW RTTY" #~ msgid "Fast (2 msec)" #~ msgstr "Veloce (2 ms)" #~ msgid "at:" #~ msgstr "a:" #~ msgid "Test Signal - Do NOT use with transmitter" #~ msgstr "Segnale di prova - NON USARE col trasmettitore" #~ msgid "dB" #~ msgstr "dB" #~ msgid "Noise on" #~ msgstr "Genera rumore" #, fuzzy #~ msgid "freq-offset" #~ msgstr "offset-frequenza" #, fuzzy #~ msgid "ALC level" #~ msgstr "Livello ALC" #, fuzzy #~ msgid "FFT filter" #~ msgstr "Filtro FFT" #~ msgid "\tLDT in iso-8601 format" #~ msgstr "\tLDT in formato iso-8601" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT in formato iso-8601" #~ msgid "\tUTC datetime" #~ msgstr "\tdata e ora UTC" #, fuzzy #~ msgid "User Interface - Browser" #~ msgstr "Interfaccia Utente - Navigatore" #, fuzzy #~ msgid "User Interface - General" #~ msgstr "Interfaccia Utente - Generali" #, fuzzy #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Interfaccia Utente Colori / Caratteri" #, fuzzy #~ msgid "User Interface - Contest" #~ msgstr "Interfaccia Utente - Contest" #, fuzzy #~ msgid "User Interface - Macros" #~ msgstr "Interfaccia Utente - Macro" #, fuzzy #~ msgid "User Interface - Waterfall controls" #~ msgstr "Interfaccia Utente - Controlli waterfall" #~ msgid "Rig Control using xml spec file" #~ msgstr "Controlla la radio mediante un file di specifica xml" #~ msgid "Callsign database" #~ msgstr "Database nominativi" #, fuzzy #~ msgid "Program to Program Communications" #~ msgstr "Comunicazione da Programma a Programma" #, fuzzy #~ msgid "Power Signal Monior" #~ msgstr "Power Signal Monior" #~ msgid "Callsign:" #~ msgstr "Nominativo:" #~ msgid "Name:" #~ msgstr "Nome:" #~ msgid "Transmit width" #~ msgstr "Larghezza di trasmissione" #~ msgid "# of multiple scans / character line" #~ msgstr "# di scansioni multiple / linea di caratteri" #~ msgid "Halve receive width" #~ msgstr "Dimezza la larghezza RX" #~ msgid "Compress Rx in time" #~ msgstr "Comprimi la ricezione nel tempo" #~ msgid "2x Xmt Width (hidden)" #~ msgstr "2x Xmt Width (hidden)" #~ msgid "Revert" #~ msgstr "Inverti" #, fuzzy #~ msgid "Reset rigCAT interface" #~ msgstr "Inizializza l'interfaccia RigCAT" #, fuzzy #~ msgid "Reset hamlib interface" #~ msgstr "Inizializza l'interfaccia hamlib" #, fuzzy #~ msgid "Use GPIO PTT" #~ msgstr "Usa GPIO PTT" #, fuzzy #~ msgid "Select GPIO port" #~ msgstr "Seleziona la porta GPIO" #, fuzzy #~ msgid "QSL-2" #~ msgstr "QSL-2" #~ msgid "Rig control and logging" #~ msgstr "Controllo della radio e log" #~ msgid "Rig control and contest" #~ msgstr "Controllo della radio e contest" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "Non ho potuto controllare la presenza di aggiornamenti:\n" #~ "%s" #~ msgid "Visit URL" #~ msgstr "Visita l'URL" #~ msgid "Copy URL" #~ msgstr "Copia l'URL" #~ msgid "Controls" #~ msgstr "Controlli" #~ msgid "# S" #~ msgstr "# S" #~ msgid "# R" #~ msgstr "# R" #, fuzzy #~ msgid "Empty ADIF logbook file %s" #~ msgstr "File di log ADIF vuoto" #~ msgid "Quick entry" #~ msgstr "Inserimento rapido" #~ msgid "Exchanges" #~ msgstr "Rapporti" #, fuzzy #~ msgid "Transmit all text in lower case" #~ msgstr "Trasetti tutto il testo in minuscolo" #, fuzzy #~ msgid "User Interface - Logging" #~ msgstr "Interfaccia Utente - Log" #, fuzzy #~ msgid "Enter Port # assigned to server" #~ msgstr "Usa un server Port Audio" #, fuzzy #~ msgid "Prompt to save macro file when closing" #~ msgstr "Chiedi per salvare il file macro alla chiusura" #, fuzzy #~ msgid "Mono audio output" #~ msgstr "Dispositivo audio d'uscita mono" #, fuzzy #~ msgid "End of header string:" #~ msgstr "Fine della stringa di intestazione:" #~ msgid "QRZ online via default Internet Browser" #~ msgstr "Accesso online a QRZ tramite il browser predefinito" #~ msgid "HamCall online via default Internet Browser" #~ msgstr "Accesso online a Hamcall tramite browser predefinito" #, fuzzy #~ msgid "HamQTH via default Internet Browser" #~ msgstr "Accesso online a HamQTH tramite browser predefinito" #~ msgid "CONT" #~ msgstr "CONT" #~ msgid "\tvideo text" #~ msgstr "\ttesto video" #~ msgid "Raised cosine = Hanning" #~ msgstr "Raised cosine = Hanning" #~ msgid "No rig specified" #~ msgstr "Nessuna radio specificata" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Inserisci la frequenza o cambia con\n" #~ "Sinistra/Destra/Su/Giù/Pag_su/Pag_giù" #~ msgid "Enter Xcvr Freq" #~ msgstr "Inserisci Frequenza Radio" #~ msgid "Memory Mapped Rig" #~ msgstr "Radio \"Memory Mapped\"" #~ msgid "Enable if you cannot use the middle mouse button" #~ msgstr "Abilita se non puoi usare il tasto centrale del mouse" #, fuzzy #~ msgid "Char set" #~ msgstr "Set caratteri" #, fuzzy #~ msgid "Frq Disp" #~ msgstr "Visualizza Freq" #~ msgid "Label text" #~ msgstr "Testo delle etichette" #~ msgid "FFT latency (scan merging)" #~ msgstr "Latenza FFT (aggregazione scansioni)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "La latenza aumenta la risoluzione in frequenza,\n" #~ "diminuisce la risoluzione temporale. 1 = non aggregare le scansioni" #, fuzzy #~ msgid "Select packet baudrate" #~ msgstr "Seleziona la velocitá in baud della packet" #, fuzzy #~ msgid "Use cross-hair scope" #~ msgstr "Usa oscilloscopio a croce" #, fuzzy #~ msgid "boost Audio input" #~ msgstr "Aumentare l'ingresso Audio" #~ msgid "Select the rig by name" #~ msgstr "Seleziona la radio per nome" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Forza la banda laterale sulla radio. Ha\n" #~ "effetto quando viene cambiato il modo della radio." #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Controllo tramote variabili condivise\n" #~ "a memoria mappata\n" #~ "es.: programma Kachina" #~ msgid "Use Memmap" #~ msgstr "Usa MemMap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Controllo della radio attraverso memoria mappata Kachina" #~ msgid "Initialize Memmap interface" #~ msgstr "Inizializza l'interfaccia MemMap" #~ msgid "Mixer" #~ msgstr "Mixer" #, fuzzy #~ msgid "OSS Mixer" #~ msgstr "Mixer OSS" #~ msgid "Manage mixer" #~ msgstr "Gestisci il mixer" #~ msgid "Add mixer controls to main dialog" #~ msgstr "Aggiungi i controlli del mixer alla finestra principale" #~ msgid "Select Mixer device" #~ msgstr "Seleziona il dispositivo mixer" #~ msgid "Mic In" #~ msgstr "Mic In" #~ msgid "Use microphone input" #~ msgstr "Usa l'ingresso microfono" #~ msgid "Line In" #~ msgstr "Line In" #~ msgid "Use Line-In device" #~ msgstr "Usa l'ingresso Line-In" #~ msgid "PCM" #~ msgstr "PCM" #~ msgid "Set the sound card PCM level" #~ msgstr "Imposta il livello PCM della scheda audio" #, fuzzy #~ msgid "" #~ "Enter full path-filename for external program\n" #~ "Or simple name of program" #~ msgstr "Inserisci il percorso completo a flmsg" #~ msgid "Save image as:" #~ msgstr "Salva immagine come:" #~ msgid "Colors and Fonts" #~ msgstr "Colori e Caratteri" #, fuzzy #~ msgid "Disp" #~ msgstr "Visualizzazione" #~ msgid "64-bit (long) interleave" #~ msgstr "Interleave a 64 bit (lunga)" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Resetta il filtro per ottiizzare la larghezza di banda" #, fuzzy #~ msgid "Filter Quality" #~ msgstr "Qualità del filtro" #, fuzzy #~ msgid "Navtex stations file:" #~ msgstr "File stazioni Navtex:" #~ msgid "Set page width" #~ msgstr "Imposta la larghezza della pagina" #~ msgid "after:" #~ msgstr "dopo:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (hidden)" #, fuzzy #~ msgid "Displays" #~ msgstr "Visualizzazioni" #~ msgid "Tx Power" #~ msgstr "Potenza Tx" #~ msgid "Ser# in" #~ msgstr "Ser.ric." #~ msgid "Save log before exiting?" #~ msgstr "Salvare il log prima di uscire?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Salvare le modifiche alle macro prima di uscire?" #~ msgid "QSO Freq" #~ msgstr "Freq QSO" #~ msgid "Cnty" #~ msgstr "Cnty" #~ msgid "#Out" #~ msgstr "Dato" #~ msgid "#In" #~ msgstr "Ric" #~ msgid "Xchg" #~ msgstr "Rapp" #~ msgid "Not an ADIF file" #~ msgstr "File non in formato ADIF" #~ msgid "View log" #~ msgstr "Vedi log" #~ msgid "A message was logged" #~ msgstr "Un messaggio e` stato loggato" #~ msgid "Text:" #~ msgstr "Testo:" #~ msgid "The right audio channel is disabled. Enable it now?" #~ msgstr "Il canale audio destro è disabilitato. Abilitarlo ora?" #~ msgid "Double-click on RX text enters QSO data" #~ msgstr "Doppio click su testo ricevuto riempie i campi del log" #~ msgid "Cursor color" #~ msgstr "Colore del cursore" #~ msgid "Cursor center line" #~ msgstr "Cursore linea centrale" #~ msgid "Bandwidth tracks" #~ msgstr "Tracce largh. banda" #~ msgid "Tracking range (WPM)" #~ msgstr "Ampiezza di inseguimento (WPM)" #~ msgid "Tx Atten (dB)" #~ msgstr "Atten. Tx (dB)" #~ msgid "Callsign DB" #~ msgstr "Callsign DB" #~ msgid "CDROM" #~ msgstr "CDROM" #~ msgid "Paid online subscription" #~ msgstr "Connessione online a pagamento" #~ msgid "On Date" #~ msgstr "Data inizio" #~ msgid "Off Date" #~ msgstr "Data fine" #~ msgid "Freq Analysis" #~ msgstr "Analisi di Frequenza" #~ msgid "Auto Extract files from rx stream" #~ msgstr "Estrai automaticamente i file dal flusso rx" #~ msgid "" #~ "0\n" #~ "1\n" #~ "2" #~ msgstr "" #~ "0\n" #~ "1\n" #~ "2" #~ msgid "Auto open wrap folder" #~ msgstr "" #~ "Apri automaticamente\n" #~ "la cartella wrap" #~ msgid "Autostart flmsg upon detection of compatible file" #~ msgstr "" #~ "Avvia automaticamente flmsg quando viene rilevato un file compatibile" #~ msgid "Search for reg-exp in browser text(s)" #~ msgstr "Regular expression da usare per la ricerca nel testo del navigatore" fldigi-4.2.05/po/quot.sed0000664000175000017500000000023114532252172012065 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g fldigi-4.2.05/po/LINGUAS0000664000175000017500000000003414611711171011423 00000000000000ca el es fr it pl de nl ru fldigi-4.2.05/po/ca.po0000664000175000017500000112334214611714003011327 00000000000000# Catalan translations for fldigi package # Traducción al Català para el paquete fldigi # # Copyright (C) 2023 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # # Catalan translators: # Xavi Pérez, EA3W # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.02\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2024-04-23 06:14-0500\n" "PO-Revision-Date: 2023-11-10 19:47+0100\n" "Last-Translator: EA3W Xavi \n" "Language-Team: Català Xavi Pérez, EA3W ea3wxavi@gmail.com\n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.1\n" #: src/main.cxx:1052 #, c-format msgid "%s log started on %s" msgstr "%s log iniciat a %s" #: src/main.cxx:1779 msgid "Bad modem id" msgstr "Identificador incorrecte de mòdem" #: src/main.cxx:1786 msgid "Bad frequency" msgstr "Freqüència errònia" #: src/main.cxx:1909 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Llicencia GPLv3+: GNU GPL versió 3 o posterior \n" "Aquest software es d'us lliure: pots modificar-lo i redistribuir-lo. \n" "No hi ha CAP GARANTÍA, excepte la permesa per la llei.\n" #: src/main.cxx:2136 src/main.cxx:2178 src/main.cxx:2202 src/main.cxx:2216 msgid "Could not make directory " msgstr "No s'ha pogut crear el directori " #: src/debug/debug.cxx:88 msgid "Quiet" msgstr "Tranquil" #: src/debug/debug.cxx:88 msgid "Error" msgstr "Error" #: src/debug/debug.cxx:88 msgid "Warning" msgstr "Perill" #: src/debug/debug.cxx:88 msgid "Info" msgstr "Info" #: src/debug/debug.cxx:88 msgid "Verbose" msgstr "Més explícit" #: src/debug/debug.cxx:88 src/dialogs/confdialog.cxx:15244 msgid "Debug" msgstr "Debug" #: src/dialogs/fl_digi.cxx:202 msgid "Log all RX/TX text" msgstr "Guardar tot el text de TX/RX" #: src/dialogs/fl_digi.cxx:204 src/dialogs/fl_digi.cxx:7622 msgid "Op &Mode" msgstr "&Modes d'operació" #: src/dialogs/fl_digi.cxx:205 msgid "Show fewer modes" msgstr "Mostrar menys modes" #: src/dialogs/fl_digi.cxx:206 msgid "Show all modes" msgstr "Mostrar tots els modes" #: src/dialogs/fl_digi.cxx:210 msgid "&View" msgstr "&Vista" #: src/dialogs/fl_digi.cxx:211 msgid "MFSK Image" msgstr "Imatge &MFSK" #: src/dialogs/fl_digi.cxx:212 msgid "THOR Raw Image" msgstr "Imatge en brut de THOR" #: src/dialogs/fl_digi.cxx:213 msgid "IFKP Raw Image" msgstr "Imatge bruta IFKP" #: src/dialogs/fl_digi.cxx:214 msgid "Weather Fax Image TX" msgstr "Imatge de fax del temps TX" #: src/dialogs/fl_digi.cxx:215 src/dialogs/confdialog.cxx:10746 #: src/logbook/lgbook.cxx:1293 msgid "Contest" msgstr "Concurs" #: src/dialogs/fl_digi.cxx:216 msgid "C&ountries" msgstr "&Països" #: src/dialogs/fl_digi.cxx:217 msgid "&UI" msgstr "I&U" #: src/dialogs/fl_digi.cxx:218 msgid "Full" msgstr "Tot" #: src/dialogs/fl_digi.cxx:219 msgid "Partial" msgstr "Parcial" #: src/dialogs/fl_digi.cxx:220 src/waterfall/waterfall.cxx:2595 #: src/dialogs/confdialog.cxx:9908 src/dialogs/confdialog.cxx:9997 #: src/dialogs/confdialog.cxx:19028 msgid "None" msgstr "Cap" #: src/dialogs/fl_digi.cxx:221 msgid "Docked scope" msgstr "Oscil·loscopi emportat" #: src/dialogs/fl_digi.cxx:222 msgid "Minimal controls" msgstr "Controls mínims" #: src/dialogs/fl_digi.cxx:223 msgid "Show channels" msgstr "Mostrar els canals" #: src/dialogs/fl_digi.cxx:225 msgid "Connect to server" msgstr "Connectar amb el servidor" #: src/dialogs/fl_digi.cxx:1050 src/dialogs/fl_digi.cxx:1079 #: src/dialogs/fl_digi.cxx:1089 src/dialogs/fl_digi.cxx:5976 #: src/dialogs/fl_digi.cxx:6069 src/dialogs/fl_digi.cxx:6146 #: src/dialogs/fl_digi.cxx:7650 src/dialogs/fl_digi.cxx:7719 #: src/dialogs/fl_digi.cxx:7796 msgid "Custom..." msgstr "Personalitzar..." #: src/dialogs/fl_digi.cxx:1147 src/dialogs/confdialog.cxx:369 #: src/dialogs/confdialog.cxx:10673 src/dialogs/confdialog.cxx:10739 msgid "Colors-Fonts" msgstr "Colors i Fonts" #: src/dialogs/fl_digi.cxx:1148 src/dialogs/confdialog.cxx:370 #: src/dialogs/confdialog.cxx:11067 msgid "Contests" msgstr "Concurs" #: src/dialogs/fl_digi.cxx:1149 src/dialogs/confdialog.cxx:371 #: src/dialogs/confdialog.cxx:11338 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:1150 src/dialogs/confdialog.cxx:372 #: src/dialogs/confdialog.cxx:11810 src/dialogs/confdialog.cxx:11896 #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14240 msgid "Logging" msgstr "Registre del QSO" #: src/dialogs/fl_digi.cxx:1151 msgid "Modem/CW" msgstr "Mòdem/CW" #: src/dialogs/fl_digi.cxx:1152 msgid "Modem/TTY" msgstr "Mòdem" #: src/dialogs/fl_digi.cxx:1153 src/waterfall/waterfall.cxx:2597 #: src/dialogs/confdialog.cxx:373 msgid "Modem" msgstr "Módem" #: src/dialogs/fl_digi.cxx:1154 src/dialogs/confdialog.cxx:374 #: src/dialogs/confdialog.cxx:17169 msgid "Misc" msgstr "Miscel·lània" #: src/dialogs/fl_digi.cxx:1155 src/dialogs/confdialog.cxx:375 #: src/dialogs/confdialog.cxx:18303 src/dialogs/confdialog.cxx:18366 msgid "Rig Control" msgstr "Control de l'equip" #: src/dialogs/fl_digi.cxx:1156 src/dialogs/confdialog.cxx:376 #: src/dialogs/confdialog.cxx:18974 msgid "Soundcard" msgstr "Targeta de So" #: src/dialogs/fl_digi.cxx:1157 src/dialogs/confdialog.cxx:377 #: src/dialogs/confdialog.cxx:19497 msgid "UI" msgstr "IU" #: src/dialogs/fl_digi.cxx:1158 src/dialogs/fl_digi.cxx:6238 #: src/dialogs/confdialog.cxx:378 src/dialogs/confdialog.cxx:13939 #: src/dialogs/confdialog.cxx:20045 msgid "Waterfall" msgstr "Cascada" # Considero que debemos dejar este texto como "Web" ya que esta pestaña refiere a la consulta de servicios via web (@HK4QWC) #: src/dialogs/fl_digi.cxx:1159 src/dialogs/confdialog.cxx:379 #: src/dialogs/confdialog.cxx:20245 msgid "Web" msgstr "Web" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4547 msgid "Save changed macros?" msgstr "Vols guardar les macros modificades ?" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4134 #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 #: src/logbook/logsupport.cxx:1205 src/misc/configuration.cxx:726 #: src/dialogs/font_browser.cxx:173 src/logbook/lgbook.cxx:837 #: src/logbook/lgbook.cxx:1647 msgid "Cancel" msgstr "Cancel·lar" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:6250 #: src/logbook/logsupport.cxx:330 src/logbook/logsupport.cxx:1204 #: src/dialogs/confdialog.cxx:13194 src/dialogs/confdialog.cxx:15191 #: src/dialogs/confdialog.cxx:20248 msgid "Save" msgstr "Desa" #: src/dialogs/fl_digi.cxx:1622 msgid "Don't save" msgstr "No desar" #: src/dialogs/fl_digi.cxx:1771 msgid "Switch to ARQ I/O" msgstr "Canvia a ARQ I/O" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "No" msgstr "No" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "Yes" msgstr "Sí" #: src/dialogs/fl_digi.cxx:2630 msgid "Playback continuous loop?" msgstr "Vols reproduir un bucle continu?" #: src/dialogs/fl_digi.cxx:2635 msgid "Unsupported audio format" msgstr "Format d'àudio no compatible" #: src/dialogs/fl_digi.cxx:2642 msgid "Spotting disabled" msgstr "Localització desactivada" #: src/dialogs/fl_digi.cxx:2694 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "No s'ha pogut executar un navegador web:\n" "%s\n" "\n" "Obre aquest URL manualment:\n" "%s" #: src/dialogs/fl_digi.cxx:2707 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "No s'ha pogut obrir l'URL:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2790 msgid "Checking for updates..." msgstr "Comprovar si hi ha actualitzacions..." #: src/dialogs/fl_digi.cxx:2794 msgid "Update site not available" msgstr "Lloc d'actualització no disponible" #: src/dialogs/fl_digi.cxx:2806 msgid "You are running the latest version" msgstr "Estàs executant la darrera versió" #: src/dialogs/fl_digi.cxx:2810 msgid "You are probably running an alpha version " msgstr "Probablement estàs executant una versió alfa " #: src/dialogs/fl_digi.cxx:2811 msgid "" "\n" "Posted version: " msgstr "" "\n" "Versió publicada : " #: src/dialogs/fl_digi.cxx:2816 #, c-format msgid "Version %s is available at Source Forge" msgstr "La versió %s està disponible a Source Forge" #: src/dialogs/fl_digi.cxx:2885 msgid "Sunspot creation underway!" msgstr "Creació de taques solars en marxa !" #: src/dialogs/fl_digi.cxx:2892 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "La informació del dispositiu d'àudio només està disponible per al backend " "del PortAudio" #: src/dialogs/fl_digi.cxx:2901 msgid "Capture device" msgstr "Dispositiu de captura" #: src/dialogs/fl_digi.cxx:2902 msgid "Playback device" msgstr "Dispositiu de reproducció" #: src/dialogs/fl_digi.cxx:2906 msgid "Capture and playback devices" msgstr "Dispositius de captura i reproducció" #: src/dialogs/fl_digi.cxx:2952 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: No existeixen, els vols crear ?" #: src/dialogs/fl_digi.cxx:4134 msgid "Clear log fields?" msgstr "Vols esborrar els camps del registre ?" #: src/dialogs/fl_digi.cxx:4134 src/misc/configuration.cxx:726 #: src/logbook/lgbook.cxx:834 src/logbook/lgbook.cxx:1644 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 msgid "Confirm" msgstr "Confirmar" #: src/dialogs/fl_digi.cxx:4539 msgid "Save changed configuration?" msgstr "Vols desar els canvis de la configuració ?" #: src/dialogs/fl_digi.cxx:4555 src/dialogs/fl_digi.cxx:4580 msgid "Save log entry?" msgstr "Vols desar l'entrada del registre ?" #: src/dialogs/fl_digi.cxx:4571 msgid "Confirm Quit" msgstr "Confirma Sortir" #: src/dialogs/fl_digi.cxx:4593 msgid "Confirm quit?" msgstr "Segur que vols sortir ?" #: src/dialogs/fl_digi.cxx:5915 src/dialogs/fl_digi.cxx:7618 msgid "&File" msgstr "&Arxiu" #: src/dialogs/fl_digi.cxx:5917 msgid "Folders" msgstr "Carpetes" #: src/dialogs/fl_digi.cxx:5918 msgid "Fldigi config..." msgstr "Configuració del Fldigi..." #: src/dialogs/fl_digi.cxx:5919 msgid "FLMSG files..." msgstr "Arxius FLMSG..." #: src/dialogs/fl_digi.cxx:5920 msgid "NBEMS files..." msgstr "Arxius NBEMS..." #: src/dialogs/fl_digi.cxx:5921 msgid "WEFAX images..." msgstr "Imatges WEFAX..." #: src/dialogs/fl_digi.cxx:5922 msgid "Data files..." msgstr "Fitxers de dades..." #: src/dialogs/fl_digi.cxx:5925 msgid "Macros" msgstr "Macros" #: src/dialogs/fl_digi.cxx:5926 msgid "Open ..." msgstr "Obrir ..." #: src/dialogs/fl_digi.cxx:5927 msgid "Save ..." msgstr "Desar ..." #: src/dialogs/fl_digi.cxx:5930 msgid "Config Scripts" msgstr "Scripts de configuració" #: src/dialogs/fl_digi.cxx:5931 msgid "Execute" msgstr "Executar" #: src/dialogs/fl_digi.cxx:5932 msgid "Generate" msgstr "Generar" #: src/dialogs/fl_digi.cxx:5935 msgid "Text Capture" msgstr "Captura de text" #: src/dialogs/fl_digi.cxx:5939 msgid "Audio" msgstr "Àudio" #: src/dialogs/fl_digi.cxx:5940 msgid "RX capture" msgstr "Captura de RX" #: src/dialogs/fl_digi.cxx:5941 msgid "TX generate" msgstr "Genera TX" #: src/dialogs/fl_digi.cxx:5942 src/dialogs/confdialog.cxx:18737 msgid "Playback" msgstr "Transmissió" #: src/dialogs/fl_digi.cxx:5945 src/dialogs/fl_digi.cxx:7619 msgid "Exit" msgstr "Sortir" #: src/dialogs/fl_digi.cxx:6203 src/dialogs/fl_digi.cxx:7832 msgid "&Configure" msgstr "Configuració" #: src/dialogs/fl_digi.cxx:6205 src/dialogs/fl_digi.cxx:7833 msgid "Config Dialog" msgstr "Diàleg de configuració" #: src/dialogs/fl_digi.cxx:6206 src/dialogs/fl_digi.cxx:7836 msgid "Save Config" msgstr "Desa la configuració" #: src/dialogs/fl_digi.cxx:6207 src/dialogs/fl_digi.cxx:7835 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notificacions" #: src/dialogs/fl_digi.cxx:6208 src/dialogs/fl_digi.cxx:7834 msgid "Test Signals" msgstr "Senyals de prova" #: src/dialogs/fl_digi.cxx:6213 src/dialogs/fl_digi.cxx:7840 msgid "Rx Audio Dialog" msgstr "Diàleg d'àudio de RX" #: src/dialogs/fl_digi.cxx:6215 msgid "View/Hide Channels" msgstr "Visualitza/Amaga Canals" #: src/dialogs/fl_digi.cxx:6216 msgid "Signal browser" msgstr "Navegador de senyals" #: src/dialogs/fl_digi.cxx:6218 msgid "View/Hide 48 macros" msgstr "Visualitza/Amaga 48 macros" #: src/dialogs/fl_digi.cxx:6220 msgid "DX Cluster" msgstr "DX Clúster" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/fl_digi.cxx:7843 msgid "Floating scope" msgstr "Oscil·loscopi flotant" #: src/dialogs/fl_digi.cxx:6223 src/dialogs/fl_digi.cxx:7842 msgid "Spectrum scope" msgstr "Àmbit de l'espectre" #: src/dialogs/fl_digi.cxx:6232 msgid "Rig/Log Controls" msgstr "Control de l'equip" #: src/dialogs/fl_digi.cxx:6245 msgid "&Logbook" msgstr "&Llibre de Guàrdia" #: src/dialogs/fl_digi.cxx:6246 msgid "View" msgstr "Vista" #: src/dialogs/fl_digi.cxx:6248 msgid "Files" msgstr "&Arxiu" #: src/dialogs/fl_digi.cxx:6249 src/dialogs/confdialog.cxx:17449 msgid "Open..." msgstr "Obrir..." #: src/dialogs/fl_digi.cxx:6251 src/logbook/logsupport.cxx:1213 #: src/logbook/lgbook.cxx:1567 msgid "New" msgstr "Nou" #: src/dialogs/fl_digi.cxx:6254 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6255 msgid "Merge..." msgstr "Combina..." #: src/dialogs/fl_digi.cxx:6256 msgid "Export..." msgstr "Exportar..." #: src/dialogs/fl_digi.cxx:6259 src/logbook/lgbook.cxx:831 msgid "LoTW" msgstr "LoTW" #: src/dialogs/fl_digi.cxx:6261 msgid "Reports" msgstr "Reports" #: src/dialogs/fl_digi.cxx:6262 msgid "Text..." msgstr "Text..." #: src/dialogs/fl_digi.cxx:6263 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6264 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6269 msgid "Field Day Logging" msgstr "Registre del dia de camp" #: src/dialogs/fl_digi.cxx:6274 src/dialogs/fl_digi.cxx:7852 msgid "&Help" msgstr "&Ajuda" #: src/dialogs/fl_digi.cxx:6277 msgid "Create sunspots" msgstr "Crear un sunspot" #: src/dialogs/fl_digi.cxx:6279 msgid "Beginners' Guide" msgstr "Guia per a principiants" #: src/dialogs/fl_digi.cxx:6280 src/dialogs/fl_digi.cxx:7853 msgid "Online documentation..." msgstr "Documentació en línia..." #: src/dialogs/fl_digi.cxx:6281 msgid "Fldigi web site..." msgstr "Lloc web de Fldigi..." #: src/dialogs/fl_digi.cxx:6282 msgid "Reception reports..." msgstr "Informes de recepció..." #: src/dialogs/fl_digi.cxx:6283 msgid "Command line options" msgstr "Opcions de línia d'ordres" #: src/dialogs/fl_digi.cxx:6284 msgid "Audio device info" msgstr "Informació del dispositiu d'àudio" #: src/dialogs/fl_digi.cxx:6285 msgid "Build info" msgstr "Informació de la compilació" #: src/dialogs/fl_digi.cxx:6286 src/dialogs/fl_digi.cxx:7854 msgid "Event log" msgstr "Registre d'esdeveniments" #: src/dialogs/fl_digi.cxx:6287 src/dialogs/fl_digi.cxx:7855 msgid "Check for updates..." msgstr "Comprovar si hi ha actualitzacions..." #: src/dialogs/fl_digi.cxx:6288 src/dialogs/fl_digi.cxx:7856 msgid "&About" msgstr "&Quant a" #: src/dialogs/fl_digi.cxx:6539 msgid "waterfall-only mode" msgstr "mode de només cascada" #: src/dialogs/fl_digi.cxx:6541 msgid "NO CALLSIGN SET" msgstr "NO HAS DEFINIT UN INDICATIU" #: src/dialogs/fl_digi.cxx:6566 msgid "Close List" msgstr "Tanca la llista" #: src/dialogs/fl_digi.cxx:6574 msgid "Open List" msgstr "Obrir la llista" #: src/dialogs/fl_digi.cxx:6615 msgid "Clear list?" msgstr "Vols esborrar la llista ?" #: src/dialogs/fl_digi.cxx:6699 msgid "report" msgstr "informe" #: src/dialogs/fl_digi.cxx:6699 msgid "reports" msgstr "informes" #: src/dialogs/fl_digi.cxx:6704 msgid "Recent activity for grid " msgstr "Activitat recent per al locutor " #: src/dialogs/fl_digi.cxx:7841 src/dialogs/Viewer.cxx:283 msgid "Signal Browser" msgstr "Navegador de senyals" #: src/dialogs/fl_digi.cxx:8143 msgid "Scope" msgstr "Osciloscopi" #: src/dialogs/fl_digi.cxx:8234 msgid "Detected signal level" msgstr "Nivell de senyal detectat" #: src/dialogs/fl_digi.cxx:8246 src/waterfall/waterfall.cxx:2596 msgid "Squelch level" msgstr "Nivell de silenciador (SQL)" #: src/dialogs/fl_digi.cxx:8262 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Clic esquerre : canvi de mode\n" "Clic dret : configura" #: src/dialogs/fl_digi.cxx:8271 msgid "CW transmit WPM" msgstr "WPM en TX de CW" #: src/dialogs/fl_digi.cxx:8280 msgid "Default WPM" msgstr "WPM predeterminat" #: src/dialogs/fl_digi.cxx:8310 msgid "Left click to toggle VuMeter" msgstr "Fes clic esquerre per canviar el VuMeter" #: src/dialogs/fl_digi.cxx:8316 msgid "Left click to toggle Status Bar" msgstr "Fes clic esquerre per canviar la barra d'estat" #: src/dialogs/fl_digi.cxx:8328 msgid "Tx level attenuator (dB)" msgstr "Atenuació de nivell de TX (dB)" #: src/dialogs/fl_digi.cxx:8356 msgid "Automatic Frequency Control" msgstr "Control Automàtic de Freqüència" #: src/dialogs/fl_digi.cxx:8361 msgid "Squelch" msgstr "Silenciador (SQL)" #: src/dialogs/fl_digi.cxx:8366 msgid "Power Signal Monitor" msgstr "Monitor de senyal d'alimentació" #: src/dialogs/fl_digi.cxx:10682 msgid "Delete entry?" msgstr "Vols suprimir l'entrada ?" #: src/dialogs/fl_digi.cxx:10682 src/spot/notify.cxx:222 #: src/spot/notify.cxx:228 msgid "All" msgstr "Tot" #: src/dialogs/Viewer.cxx:287 msgid "Find: " msgstr "Buscar : " #: src/dialogs/Viewer.cxx:308 src/logbook/logsupport.cxx:324 #: src/logbook/logsupport.cxx:1063 src/misc/macroedit.cxx:504 #: src/mfsk/mfsk-pic.cxx:338 src/spot/notify.cxx:535 src/spot/notify.cxx:539 #: src/dialogs/confdialog.cxx:20251 msgid "Close" msgstr "Tancar" #: src/dialogs/Viewer.cxx:316 src/logbook/logsupport.cxx:327 #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:13484 #: src/dialogs/confdialog.cxx:14633 msgid "Clear" msgstr "Netejar" #: src/dialogs/Viewer.cxx:320 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Fes clic esquerre per esborrar el text\n" "Fes clic amb el botó dret per restablir les freqüències" #: src/dialogs/Viewer.cxx:326 msgid "Set Viewer Squelch" msgstr "Estableix el silenciador del visor" #: src/logbook/logsupport.cxx:160 msgid "Export to CSV file" msgstr "Exportar a un arxiu CSV" #: src/logbook/logsupport.cxx:187 msgid "Export to fixed field text file" msgstr "Exportar a un arxiu de text amb camps fixes" #: src/logbook/logsupport.cxx:215 msgid "Export to ADIF file" msgstr "Exportar a arxiu ADIF" #: src/logbook/logsupport.cxx:317 msgid "LoTW Review" msgstr "Revisió LoTW" #: src/logbook/logsupport.cxx:359 msgid "Save changed Logbook?" msgstr "Vols desar el llibre de guàrdia canviat ?" #: src/logbook/logsupport.cxx:380 msgid "Create new logbook file" msgstr "Crea un fitxer de registre de guàrdia nou" #: src/logbook/logsupport.cxx:403 #, c-format msgid "%s exists, overwrite?" msgstr "%s ja existeix, el vols sobreescriure ?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Obrir un arxiu de llibre de guàrdia" #: src/logbook/logsupport.cxx:472 msgid "Save logbook file" msgstr "Desar el arxiu del llibre de guàrdia" #: src/logbook/logsupport.cxx:933 msgid "Database merger in progress" msgstr "Fusió de bases de dades en curs" #: src/logbook/logsupport.cxx:939 msgid "Merge ADIF file" msgstr "Combina el fitxer ADIF" #: src/logbook/logsupport.cxx:977 msgid "No records in lotw download file" msgstr "No hi ha registres al fitxer de descàrrega de LoTW" #: src/logbook/logsupport.cxx:1057 msgid "Unmatched LoTW Records" msgstr "Registres LoTW incomparables" #: src/logbook/logsupport.cxx:1092 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" "No s'ha pogut trobar el fitxer d'informe LoTW.\n" "\n" "Baixa des de la pàgina de LoTW d'ARRL després d'iniciar sessió a :\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Emmagatzema el fitxer d'informe a la carpeta fldigi LOTW,\n" "\n" "i anomena el fitxer com 'lotwreport.adi'" #: src/logbook/logsupport.cxx:1214 src/spot/notify.cxx:206 #: src/spot/notify.cxx:533 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1574 msgid "Update" msgstr "Actualització" #: src/logbook/logsupport.cxx:1816 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Vols suprimir realment el registre de \"%s\" ?" #: src/logbook/logsupport.cxx:2330 msgid "Create cabrillo report" msgstr "Crear un fitxer de cabrillo" #: src/logbook/logsupport.cxx:2570 msgid "LoTW download file" msgstr "Fitxer de descàrrega de LoTW" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Detectar l'aparició de [WRAP:bag] i [WRAP:end]\n" "Desa les etiquetes i tot el text adjunt al fitxer marcat amb data i hora, és " "a dir :\n" " NBEMS.files\\WRAP\\recv\\extract-20110205-201712.wrap" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Detectar l'aparició de [WRAP:bag] i [WRAP:end]\n" "Deseu les etiquetes i tot el text adjunt al fitxer marcat amb data i hora, " "és a dir :\n" " ~/.nbems/WRAP/recv/extraxt-20090127-092515.wrap" #: src/logger/rx_extract.cxx:286 src/logger/rx_extract.cxx:316 msgid "Could not start flmsg" msgstr "No s'ha pogut iniciar flmsg" #: src/logger/rx_extract.cxx:414 src/logger/rx_extract.cxx:418 #: src/dialogs/confdialog.cxx:16379 msgid "Locate flmsg executable" msgstr "Localitza l'executable flmsg" #: src/logger/rx_extract.cxx:414 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:418 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:492 msgid "Locate executable" msgstr "Localitza l'executable" #: src/logger/rx_extract.cxx:492 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:495 msgid "Locate binary" msgstr "Localitza el binari" #: src/logger/rx_extract.cxx:495 msgid "*" msgstr "*" #: src/logger/speak.cxx:40 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Desa tot el text rebut, un caràcter a la vegada al fitxer següent :\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:539 msgid "Rig mode" msgstr "Modo del equip" #: src/misc/configuration.cxx:540 msgid "Always LSB" msgstr "Sempre LSB" #: src/misc/configuration.cxx:541 msgid "Always USB" msgstr "Sempre USB" #: src/misc/configuration.cxx:549 src/dialogs/confdialog.cxx:17915 #: src/dialogs/confdialog.cxx:18183 src/dialogs/confdialog.cxx:18185 msgid "Rig Control/Hamlib" msgstr "Control de l'equip - Hamlib" #: src/misc/configuration.cxx:723 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Vols restablir totes les opcions als seus valors predeterminats ?\n" "\n" "Les opcions de restabliment tindran efecte al proper inici\n" "Els fitxers: fldigi_def.xml i fldigi.prefs s'eliminaran !\n" #: src/misc/configuration.cxx:728 msgid "Confirm RESET" msgstr "Confirmar RESETEIG" #: src/misc/macroedit.cxx:68 msgid "\tmy frequency" msgstr "\tla meva freqüència" #: src/misc/macroedit.cxx:69 msgid "\tmode" msgstr "\tmode" #: src/misc/macroedit.cxx:70 msgid "\tmy call" msgstr "\tel meu indicatiu" #: src/misc/macroedit.cxx:71 msgid "\tmy locator" msgstr "\tel meu locator" #: src/misc/macroedit.cxx:72 msgid "\tmy name" msgstr "\t el meu nom" #: src/misc/macroedit.cxx:73 #, fuzzy #| msgid "\tmy QTH" msgid "\tmy QTH (city)" msgstr "\tel meu QTH" #: src/misc/macroedit.cxx:74 msgid "\tmy RST" msgstr "\tel meu RST" #: src/misc/macroedit.cxx:75 msgid "\tmy FD class" msgstr "\tla meva classe d'indicatiu" #: src/misc/macroedit.cxx:76 msgid "\tmy FD section" msgstr "\tla meva secció ARRL" #: src/misc/macroedit.cxx:77 msgid "\tmy state" msgstr "\tla meva comarca" #: src/misc/macroedit.cxx:78 msgid "\tmy ST" msgstr "\tel meu RST" #: src/misc/macroedit.cxx:79 msgid "\tmy county" msgstr "\t el meu país" #: src/misc/macroedit.cxx:80 msgid "\tmy CNTY" msgstr "\tel meu CNTY" #: src/misc/macroedit.cxx:81 msgid "\tmy antenna" msgstr "\tla meva antena" #: src/misc/macroedit.cxx:82 msgid "\toperating band" msgstr "\tbanda d'operació" #: src/misc/macroedit.cxx:83 #, fuzzy #| msgid "\ttransmit" msgid "\ttransmit power" msgstr "\ttransmetre" #: src/misc/macroedit.cxx:84 msgid "\tFldigi version" msgstr "\tversió de Fldigi" #: src/misc/macroedit.cxx:85 msgid "\tdigital mode (adif)" msgstr "\tmode digital (adif)" #: src/misc/macroedit.cxx:88 msgid "\tother call" msgstr "\tun altre indicatiu" #: src/misc/macroedit.cxx:89 msgid "\tother name" msgstr "\tun altre nom" #: src/misc/macroedit.cxx:90 msgid "\tother QTH" msgstr "\tun altre QTH" #: src/misc/macroedit.cxx:91 msgid "\tother State" msgstr "\tun altre comarca" #: src/misc/macroedit.cxx:92 msgid "\tother Province" msgstr "\tun altre provincia" #: src/misc/macroedit.cxx:93 msgid "\tother locator" msgstr "\tun altre locaor" #: src/misc/macroedit.cxx:94 msgid "\tother RST" msgstr "\tun altre RST" #: src/misc/macroedit.cxx:97 msgid "\tS/N etc." msgstr "\tS/N etc." #: src/misc/macroedit.cxx:98 msgid "\tIMD etc." msgstr "\tIMD etc." #: src/misc/macroedit.cxx:101 msgid "\t# QSO recs" msgstr "\t# QSO guardats" #: src/misc/macroedit.cxx:102 msgid "\tnext QSO rec #" msgstr "\tproper QSO a guardar #" #: src/misc/macroedit.cxx:105 msgid "\tmap on google" msgstr "\tmapa a google" #: src/misc/macroedit.cxx:106 msgid "\tmap by value" msgstr "\tmapa per valor" #: src/misc/macroedit.cxx:109 msgid "\tclear RX pane" msgstr "\tesborra el panell de RX" #: src/misc/macroedit.cxx:110 msgid "\tclear TX pane" msgstr "\tesborra el panell de TX" #: src/misc/macroedit.cxx:111 msgid "\tclear QSO fields" msgstr "\tesborra els camps del QSO" #: src/misc/macroedit.cxx:114 msgid "\ttext to NAME/QTH" msgstr "\ttext a NOM/QTH" #: src/misc/macroedit.cxx:118 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk Encès, Apagat, Commuta" #: src/misc/macroedit.cxx:122 msgid "\tclear log fields" msgstr "\tesborra els camps del log" #: src/misc/macroedit.cxx:123 msgid "\tsave QSO data" msgstr "\tdesar les dades del QSO" #: src/misc/macroedit.cxx:124 msgid "\tsaveQSO data, append msg to notes" msgstr "\tdesa les dades del QSO, afegeix el missatge a les notes" #: src/misc/macroedit.cxx:125 msgid "\tlog at xmt time" msgstr "\tguardar alhora que transmet" #: src/misc/macroedit.cxx:126 msgid "\tsaveQSO data, append msg to notes" msgstr "\tdesa les dades del QSO, afegeix el missatge a les notes" #: src/misc/macroedit.cxx:127 msgid "\tlog eQSL" msgstr "\tregistre eQSL" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL optional msg" msgstr "\tincloure un missatge opcional a eQSL.cc" #: src/misc/macroedit.cxx:131 msgid "\tQSO time (HHMM))" msgstr "\tHora del QSO (HHMM)" #: src/misc/macroedit.cxx:132 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "\tLDT per defecte '%Y-%m-%d %H:%M%z'" #: src/misc/macroedit.cxx:133 msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "\tData i hora local, per defecte '%x %H:%M %Z'" #: src/misc/macroedit.cxx:134 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "\tZDT per defecte '%Y-%m-%d %H:%MZ'" #: src/misc/macroedit.cxx:135 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "\tData UTC, per defecte '%x %H:%MZ'" #: src/misc/macroedit.cxx:136 msgid "\tlocal time, default %H%M" msgstr "\thora local, per defecte %H%M" #: src/misc/macroedit.cxx:137 msgid "\tzulu time default %H%MZ" msgstr "\thora zulu per defecte %H%MZ" #: src/misc/macroedit.cxx:138 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tdata local, per defecte '%Y-%M-%D'" #: src/misc/macroedit.cxx:139 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tdata zulu, per defecte '%Y-%M-%D Z'" #: src/misc/macroedit.cxx:140 msgid "\tget weather data" msgstr "\\obtenir dades del temps" #: src/misc/macroedit.cxx:141 msgid "\tget weather data for station" msgstr "\tobtenir dades del temps de una estació específica" #: src/misc/macroedit.cxx:144 msgid "\tcontest counter" msgstr "\\comptador de concurs" #: src/misc/macroedit.cxx:145 msgid "\tdecrement counter" msgstr "\\comptador de decrement" #: src/misc/macroedit.cxx:146 msgid "\tincrement counter" msgstr "\tcomptador de increment" #: src/misc/macroedit.cxx:147 msgid "\texchange in" msgstr "\tintercanvi rebut" #: src/misc/macroedit.cxx:148 msgid "\texchange out" msgstr "\tintercanvi enviat" #: src/misc/macroedit.cxx:149 msgid "\texchange begin" msgstr "\tcomençar l'intercanvi" #: src/misc/macroedit.cxx:150 msgid "\texchange end" msgstr "\tfinal de l'intercanvi" #: src/misc/macroedit.cxx:151 msgid "\tsave contest out" msgstr "\tdesa el final del concurs" #: src/misc/macroedit.cxx:152 msgid "\tcurrent contest serno" msgstr "\tconcurs actual serno" #: src/misc/macroedit.cxx:153 msgid "\tlast serno sent" msgstr "\tdarrer serno enviat" #: src/misc/macroedit.cxx:154 msgid "\tFD class" msgstr "\tFD classe" #: src/misc/macroedit.cxx:155 msgid "\tFD section" msgstr "\tFD secció" #: src/misc/macroedit.cxx:156 msgid "\tcontest class" msgstr "\tclasse de concurs" #: src/misc/macroedit.cxx:157 msgid "
\tARRL section" msgstr "
\tSecció ARRL" #: src/misc/macroedit.cxx:160 msgid "\treceive" msgstr "\trebre" #: src/misc/macroedit.cxx:161 msgid "\ttransmit" msgstr "\ttransmetre" #: src/misc/macroedit.cxx:162 msgid "\ttoggle T/R" msgstr "\talternar TX/RX" #: src/misc/macroedit.cxx:163 msgid "\tsearch UP for signal" msgstr "\tbusca el senyal DALT" #: src/misc/macroedit.cxx:164 msgid "\tsearch DOWN for signal" msgstr "\tbuscar el senyal BAIX" #: src/misc/macroedit.cxx:165 msgid "\treturn to sweet spot" msgstr "\tretornar a la freqüència inicial a la cascada" #: src/misc/macroedit.cxx:166 msgid "\tmove to freq NNNN Hz" msgstr "\tmoure't a la freqüència NNNN Hz" #: src/misc/macroedit.cxx:167 msgid "\tleft-clk QSY button" msgstr "\tQSY baixar amb el botó esquerre" #: src/misc/macroedit.cxx:168 msgid "\tright-clk QSY button" msgstr "\tQSY pujar amb el botó dret" #: src/misc/macroedit.cxx:169 msgid "\tqsy to kHz, Hz" msgstr "\tQSY a kHz, Hz" #: src/misc/macroedit.cxx:170 msgid "\tincr/decr xcvr freq" msgstr "\tincr/decr xcvr freq" #: src/misc/macroedit.cxx:171 msgid "\tvalid xcvr mode" msgstr "\tmode xcvr vàlid" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr filter width" msgstr "\tamplada del filtre xcvr vàlid" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr low cutoff filter" msgstr "\tfiltre de tall baix xcvr vàlid" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr hi cutoff filter" msgstr "\tfiltre de tall xcvr hi vàlid" #: src/misc/macroedit.cxx:175 msgid "\trig freq has kbd focus" msgstr "\tLa freqüència de l'equip té el focus kbd" #: src/misc/macroedit.cxx:178 msgid "\tinsert QRG into Rx text" msgstr "\tInsertar la QRG en el text de RX" #: src/misc/macroedit.cxx:181 msgid "\tinsert text file" msgstr "\tinsertar arxiu de text" #: src/misc/macroedit.cxx:182 msgid "\tinsert image file" msgstr "\tinsertar imatge de MFSK" #: src/misc/macroedit.cxx:183 msgid "\tsend avatar" msgstr "\tenvia avatar" #: src/misc/macroedit.cxx:186 msgid "\tpause transmit" msgstr "" "\tpausar la transmissió (Passar a RX sense netejar la finestra de TX)" #: src/misc/macroedit.cxx:187 msgid "\tidle signal for NN.nn sec" msgstr "\tsenyal d'inactivitat durant NN.nn seg" #: src/misc/macroedit.cxx:188 msgid "\trepeat every NN sec" msgstr "\trepetir cada NN segons" #: src/misc/macroedit.cxx:189 msgid "\trepeat after waiting NN sec" msgstr "\trepetir després d'esperar NN seg" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tsenyal de sintonització per NN sec" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "\tretard xmt per a NN.n seg" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\trepetir la macro contínuament" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution for" msgstr "\texecució programada per" #: src/misc/macroedit.cxx:194 msgid "\tend execution at" msgstr "\tfinalitzar l'execució a les" #: src/misc/macroedit.cxx:195 msgid "\tuse local date/time" msgstr "\tutilitzar la data/hora local" #: src/misc/macroedit.cxx:198 msgid "\t set xmt attenuator" msgstr "\t posa l'atenuador xmt" #: src/misc/macroedit.cxx:201 msgid "\tCW identifier" msgstr "\tidentificador de CW" #: src/misc/macroedit.cxx:202 msgid "\tsend mode ID; TX start only" msgstr "\tID del mode enviament; Només al inici de TX" #: src/misc/macroedit.cxx:203 msgid "\ttext at start of TX" msgstr "\ttext a l'inici de TX" #: src/misc/macroedit.cxx:204 #, fuzzy #| msgid "\tvideo text in TX stream" msgstr "\tTx RSID on,off,toggle" msgstr "\tTX RSID activat, desactivat, alternant" #: src/misc/macroedit.cxx:206 msgid "\tRx RSID on,off,toggle" msgstr "\tRX RSID activat, desactivat, alternant" #: src/misc/macroedit.cxx:207 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tTransmet |NN| ràfegues RsID successives" #: src/misc/macroedit.cxx:208 msgid "\t[Wait][Len](ms)" msgstr "\t[Wait][Len](ms)" #: src/misc/macroedit.cxx:211 msgid "\tXmt audio wav file" msgstr "\tFitxer WAV d'àudio per transmetre" #: src/misc/macroedit.cxx:214 msgid "" "" msgstr "" "" #: src/misc/macroedit.cxx:215 msgid "\talert using external wav file" msgstr "\talerta mitjançant un fitxer wav extern" #: src/misc/macroedit.cxx:218 msgid "\tCW QSK post-timing" msgstr "\tCW QSK posterior al cronometratge" #: src/misc/macroedit.cxx:219 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK al inici" #: src/misc/macroedit.cxx:220 msgid "\tCW rise time" msgstr "\tTemps de pujada de CW" #: src/misc/macroedit.cxx:221 msgid "\tChar WPM:Text WPM (15.0:5.0)" msgstr "\tChar WPM:Text WPM (15.0:5.0)" #: src/misc/macroedit.cxx:224 msgid "\tsend CAT cmd" msgstr "\tenviar l'ordre CAT" #: src/misc/macroedit.cxx:225 msgid "\tsend CAT cmd" msgstr "\tenviar l'ordre CAT" #: src/misc/macroedit.cxx:228 msgid "\tAFC on,off,toggle" msgstr "\tactivar, apagar, canviar AFC" #: src/misc/macroedit.cxx:229 msgid "\tLOCK on,off,toggle" msgstr "\tactivar, apagar, canviar bloqueig" #: src/misc/macroedit.cxx:230 msgid "\tRev on,off,toggle" msgstr "\tactivar, apagar, canviar Revers" #: src/misc/macroedit.cxx:231 #, fuzzy #| msgid "\tDigitalk On, Off, Toggle" msgid "\tDigital Squelch on, off,toggle" msgstr "\tDigitalk Encès, Apagat, Commuta" #: src/misc/macroedit.cxx:232 msgid "\tDigital Squelch level, 0..100" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tchange macro defs file" msgstr "\tcanviar el fitxer de definició de macros" #: src/misc/macroedit.cxx:236 msgid "\tsave current macro file" msgstr "\tdesa el fitxer de macro actual" #: src/misc/macroedit.cxx:237 msgid "\trun macro from buffered teext" msgstr "\texecutar una macro des del text de la memòria intermèdia" #: src/misc/macroedit.cxx:240 msgid "\tignore comment text" msgstr "\tignora el comentari del text" #: src/misc/macroedit.cxx:241 msgid "<#comments>\t ignore comments" msgstr "<#comments>\t ignorar els comentaris" #: src/misc/macroedit.cxx:244 msgid "\tmodem char/sec test on nn chars" msgstr "\tprova de caràcters/segons del mòdem en nn caràcters" #: src/misc/macroedit.cxx:245 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "" "\tprova de cronometratge del mòdem, 'n' grups aleatoris de 5 " "caràcters" #: src/misc/macroedit.cxx:246 msgid "\tmodem timing test, spec' file" msgstr "\\prova de sincronització del mòdem, fitxer spec'" #: src/misc/macroedit.cxx:247 msgid "\tmodem timing test, string 's'" msgstr "\tprova de sincronització del mòdem, cadena 's'" #: src/misc/macroedit.cxx:250 msgid "\tWAV file; internal string" msgstr "\tfitxer WAV; cadena interna" #: src/misc/macroedit.cxx:251 msgid "\tWAV file; 'n' random 5 char groups" msgstr "\tfitxer WAV; 'n' grups aleatoris de 5 caràcters" #: src/misc/macroedit.cxx:252 msgid "\tWAV file; spec' file" msgstr "\tfitxer WAV; fitxer spec'" #: src/misc/macroedit.cxx:253 msgid "\tWAV file; string 's'" msgstr "\tfitxer WAV; cordes'" #: src/misc/macroedit.cxx:256 msgid "\tAnalysis CSV on,off,toggle" msgstr "\tAnàlisi CSV activat, desactivat, alternatiu" #: src/misc/macroedit.cxx:259 msgid "\tpush current mode to stack" msgstr "\tprem el mode actual per apilar-lo" #: src/misc/macroedit.cxx:260 #, fuzzy #| msgid "\tpush current mode / audio freq to stack" msgstr "\tpop current mode/freq from stack" msgstr "\tpop mode actual/freqüència de la pila" #: src/misc/macroedit.cxx:383 msgid "Text file to insert" msgstr "Fitxer de text per inserir" #: src/misc/macroedit.cxx:393 msgid "Test text file" msgstr "Fitxer de text de prova" #: src/misc/macroedit.cxx:403 msgid "MFSK image file" msgstr "Fitxer d'imatge MFSK" #: src/misc/macroedit.cxx:413 msgid "Change to Macro file" msgstr "Canvia a fitxer macro" #: src/misc/macroedit.cxx:423 src/misc/macroedit.cxx:433 msgid "Select audio file" msgstr "Selecciona el fitxer d'àudio" #: src/misc/macroedit.cxx:445 msgid "Executable file to insert" msgstr "Fitxer executable per inserir" #: src/misc/macroedit.cxx:476 msgid "Macro Text" msgstr "Text macro" #: src/misc/macroedit.cxx:481 msgid "Select Tag" msgstr "Selecciona Etiqueta" #: src/misc/macroedit.cxx:493 msgid "Macro Button Label" msgstr "Etiqueta del botó de macro" #: src/misc/macroedit.cxx:501 msgid "Apply" msgstr "Aplicar" #: src/misc/macroedit.cxx:530 msgid "Macro editor - " msgstr "Editor de macros - " #: src/misc/macros.cxx:5166 msgid "Open macro file" msgstr "Obre el fitxer de macro" #: src/misc/macros.cxx:5167 src/misc/macros.cxx:5210 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Fitxer de definició de macro Fldigi\t*.{mdf}" #: src/misc/macros.cxx:5209 msgid "Save macro file" msgstr "Desa el fitxer macro" #: src/misc/newinstall.cxx:385 msgid "Finish" msgstr "Acabar" #: src/misc/newinstall.cxx:386 msgid "Next" msgstr "Pròxim" #: src/misc/newinstall.cxx:387 msgid "Back" msgstr "Darrera" #: src/misc/newinstall.cxx:505 msgid "The wizard will guide you through the basic fldigi settings:" msgstr "L'assistent us guiarà a través de la configuració bàsica de fldigi :" #: src/misc/newinstall.cxx:506 src/logbook/lgbook.cxx:731 msgid "Operator" msgstr "Operador" #: src/misc/newinstall.cxx:507 msgid "Sound Card Interface" msgstr "Dispositiu de so" #: src/misc/newinstall.cxx:508 msgid "Transceiver control, flrig/rigcat/hamlib" msgstr "Control de l'equip, flrig/rigcat/hamlib" #: src/misc/newinstall.cxx:509 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "" "No dubtis a saltar qualsevol pàgina o sortir de l'assistent en qualsevol " "moment" #: src/misc/newinstall.cxx:510 msgid "All settings shown here can be changed later via the Configure menu" msgstr "" "Totes les opcions que es mostren aquí es poden canviar més tard mitjançant " "el menú Configura" #: src/misc/newinstall.cxx:525 msgid "Fldigi configuration wizard" msgstr "Assistent de configuració de Fldigi" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:302 src/mfsk/mfsk-pic.cxx:305 msgid "Time needed: " msgstr "Temps necessari : " #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Carrega el fitxer d'imatge" #: src/mfsk/mfsk-pic.cxx:312 msgid "Send image" msgstr "Enviar imatge" #: src/mfsk/mfsk-pic.cxx:319 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Carrega o deixa anar un fitxer d'imatge\n" "Tipus compatibles : PNG, JPEG, BMP" #: src/mfsk/mfsk-pic.cxx:323 msgid "Transfer speed, X1-normal" msgstr "Velocitat de transferència, X1-normal" #: src/mfsk/mfsk-pic.cxx:335 msgid "Load" msgstr "Carrega" #: src/waterfall/waterfall.cxx:2031 msgid "Waterfall / FFT / Scope" msgstr "Cascada / FFT / Scope" #: src/waterfall/waterfall.cxx:2040 msgid "Upper signal level (dB)" msgstr "Nivell de senyal superior (dB)" #: src/waterfall/waterfall.cxx:2051 msgid "Signal range (dB)" msgstr "Interval del senyal (dB)" #: src/waterfall/waterfall.cxx:2057 msgid "Change waterfall scale" msgstr "Canvia l'escala de la cascada" #: src/waterfall/waterfall.cxx:2062 msgid "Slew display lower in frequency" msgstr "Reducció de freqüència de la pantalla" #: src/waterfall/waterfall.cxx:2067 msgid "Center display on signal" msgstr "Senyal en pantalla central" #: src/waterfall/waterfall.cxx:2072 msgid "Slew display higher in frequency" msgstr "Moure la cascada cap a freqüències més altes" #: src/waterfall/waterfall.cxx:2077 msgid "Waterfall drop speed" msgstr "Velocitat de caiguda de la cascada" #: src/waterfall/waterfall.cxx:2087 msgid "Adjust cursor frequency" msgstr "Ajustar la freqüència del cursor" #: src/waterfall/waterfall.cxx:2092 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centre a banda de pas\n" "Fes clic amb el botó dret per desfer" #: src/waterfall/waterfall.cxx:2098 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Emmagatzematge de mode i freqüència\n" "Fes clic dret per a la llista" #: src/waterfall/waterfall.cxx:2108 msgid "Lock transmit frequency" msgstr "Bloquejar la freqüència de transmissió" #: src/waterfall/waterfall.cxx:2117 src/dialogs/confdialog.cxx:19508 msgid "Reverse" msgstr "Revés (Invertir)" #: src/waterfall/waterfall.cxx:2124 msgid "Transmit/Receive" msgstr "Transmetre/Rebre" #: src/waterfall/waterfall.cxx:2595 msgid "AFC range or BW" msgstr "Rang AFC o BW (Ample de banda)" #: src/waterfall/waterfall.cxx:2596 msgid "Signal search" msgstr "Busca senyals" #: src/waterfall/waterfall.cxx:2597 msgid "Modem carrier" msgstr "Portador de mòdem" #: src/waterfall/waterfall.cxx:2597 msgid "Scroll" msgstr "Desplaçament" #: src/rigcontrol/rigxml.cxx:1121 msgid "Open rig xml file" msgstr "Obre el fitxer xml de l'equip" #: src/rigcontrol/rigxml.cxx:1121 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fitxer xml de definició del equip per Fldigi\t*.xml" #: src/soundcard/sound.cxx:115 src/soundcard/sound.cxx:117 msgid "Audio file" msgstr "Fitxer d'àudio" #: src/spot/notify.cxx:193 msgid "My callsign de CALL" msgstr "El meu indicatiu" #: src/spot/notify.cxx:194 msgid "Station heard twice" msgstr "L'estació s'ha escoltat dues vegades" #: src/spot/notify.cxx:195 msgid "Custom text search" msgstr "Cerca de text personalitzat" #: src/spot/notify.cxx:196 msgid "RSID reception" msgstr "Recepció RSID" #: src/spot/notify.cxx:197 msgid "RSID EOT" msgstr "RSID EOT" #: src/spot/notify.cxx:205 msgid "Toggle" msgstr "Alternar" #: src/spot/notify.cxx:207 src/spot/notify.cxx:532 msgid "Remove" msgstr "Eliminar" #: src/spot/notify.cxx:218 src/dialogs/confdialog.cxx:14150 #: src/dialogs/confdialog.cxx:14161 src/dialogs/confdialog.cxx:14251 #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14835 #: src/dialogs/confdialog.cxx:18355 src/dialogs/confdialog.cxx:18382 #: src/dialogs/confdialog.cxx:18411 src/dialogs/confdialog.cxx:18440 #: src/dialogs/confdialog.cxx:18469 src/dialogs/confdialog.cxx:18493 #: src/dialogs/confdialog.cxx:19096 msgid "Select" msgstr "Selecciona" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 src/spot/notify.cxx:586 #: src/logbook/lgbook.cxx:782 src/logbook/lgbook.cxx:1187 msgid "Continent" msgstr "Continent" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/logbook/lgbook.cxx:1199 msgid "ITU zone" msgstr "Zona ITU" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1175 msgid "CQ zone" msgstr "Zona CQ" #: src/spot/notify.cxx:224 msgid "Deselect" msgstr "Desselecciona" #: src/spot/notify.cxx:531 msgid "Add" msgstr "Afegeix" #: src/spot/notify.cxx:534 msgid "Test..." msgstr "Prova..." #: src/spot/notify.cxx:537 src/widgets/FTextView.cxx:484 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Seleccionar tot" #: src/spot/notify.cxx:538 src/logbook/lgbook.cxx:621 #: src/logbook/lgbook.cxx:822 src/logbook/lgbook.cxx:1636 #: src/logbook/lgbook.cxx:1718 msgid "Clear All" msgstr "Esborrar tot" #: src/spot/notify.cxx:585 src/widgets/FTextRXTX.cxx:154 #: src/logbook/lgbook.cxx:737 src/logbook/lgbook.cxx:1039 msgid "Country" msgstr "País" #: src/spot/notify.cxx:1144 msgid "The regular expression field must not be empty." msgstr "El camp d'expressió regular no ha d'estar buit." #: src/spot/notify.cxx:1150 msgid "The regular expression must be valid." msgstr "L'expressió regular ha de ser vàlida." #: src/spot/notify.cxx:1157 msgid "Please set your callsign first." msgstr "Si us plau, configura primer el teu indicatiu." #: src/spot/notify.cxx:1294 msgid "Run program" msgstr "Executar el programa" #: src/spot/notify.cxx:1329 msgid "" "Default test string is:\n" " \"" msgstr "" "La cadena de prova predeterminada és :\n" "\"" #: src/spot/notify.cxx:1330 msgid "Enter test string or leave blank for default:" msgstr "Introdueix la cadena de prova o deixa-ho en blanc per defecte :" #: src/spot/notify.cxx:1341 msgid "This event's regular expression is invalid." msgstr "L'expressió regular d'aquest esdeveniment no és vàlida." #: src/spot/notify.cxx:1348 msgid "The test string did not match this event's search pattern." msgstr "" "La cadena de prova no coincideix amb el patró de cerca d'aquest esdeveniment." #: src/spot/notify.cxx:1366 msgid "Available substrings" msgstr "Subcadenes disponibles" #: src/spot/notify.cxx:1453 src/logbook/lgbook.cxx:1617 msgid "Frequency" msgstr "Freqüència" #: src/spot/notify.cxx:1455 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1614 msgid "Callsign" msgstr "Indicatiu" #: src/waterfall/colorbox.cxx:87 msgid "Open palette" msgstr "Obre paleta" #: src/waterfall/colorbox.cxx:87 src/waterfall/colorbox.cxx:125 msgid "Fldigi palette\t*.pal" msgstr "Paleta Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:111 src/waterfall/colorbox.cxx:136 msgid "Palette: " msgstr "Paleta : " #: src/waterfall/colorbox.cxx:125 msgid "Save palette" msgstr "Desar paleta" #: src/widgets/FTextRXTX.cxx:147 msgid "Look up call" msgstr "Buscar indicatiu" #: src/widgets/FTextRXTX.cxx:148 src/dialogs/confdialog.cxx:10138 #: src/logbook/lgbook.cxx:665 src/logbook/lgbook.cxx:870 #: src/logbook/lgbook.cxx:1666 msgid "Call" msgstr "Indic" #: src/widgets/FTextRXTX.cxx:149 src/logbook/lgbook.cxx:669 #: src/logbook/lgbook.cxx:882 src/logbook/lgbook.cxx:1616 msgid "Name" msgstr "Nom" #: src/widgets/FTextRXTX.cxx:150 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:151 src/dialogs/confdialog.cxx:10842 #: src/logbook/lgbook.cxx:716 src/logbook/lgbook.cxx:1710 msgid "State" msgstr "Estat" #: src/widgets/FTextRXTX.cxx:152 src/logbook/lgbook.cxx:779 #: src/logbook/lgbook.cxx:1150 src/logbook/lgbook.cxx:1151 #: src/logbook/lgbook.cxx:1714 msgid "County" msgstr "Comarca" #: src/widgets/FTextRXTX.cxx:153 src/logbook/lgbook.cxx:734 msgid "Province" msgstr "Provincia" #: src/widgets/FTextRXTX.cxx:155 msgid "Locator" msgstr "Locator" #: src/widgets/FTextRXTX.cxx:156 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:157 msgid "RST(s)" msgstr "RST(s)" #: src/widgets/FTextRXTX.cxx:158 src/dialogs/confdialog.cxx:10836 #: src/logbook/lgbook.cxx:773 src/logbook/lgbook.cxx:1702 msgid "Exchange In" msgstr "Intercanvi In" #: src/widgets/FTextRXTX.cxx:159 msgid "Rx Serial #" msgstr "Número de sèrie de RX #" #: src/widgets/FTextRXTX.cxx:160 src/logbook/lgbook.cxx:1343 msgid "Class" msgstr "Classe" #: src/widgets/FTextRXTX.cxx:161 src/logbook/lgbook.cxx:1432 msgid "Section" msgstr "Secció ARRL" #: src/widgets/FTextRXTX.cxx:163 msgid "SS ser #" msgstr "SS ser #" #: src/widgets/FTextRXTX.cxx:164 msgid "SS prec" msgstr "SS prec" #: src/widgets/FTextRXTX.cxx:165 msgid "SS check" msgstr "Comprovació SS" #: src/widgets/FTextRXTX.cxx:166 src/logbook/lgbook.cxx:1433 msgid "SS section" msgstr "Secció SS" #: src/widgets/FTextRXTX.cxx:169 msgid "CQ STATE" msgstr "Estat CQ" #: src/widgets/FTextRXTX.cxx:171 msgid "1010 Nr" msgstr "1010 Nr" #: src/widgets/FTextRXTX.cxx:173 msgid "Kid's Age" msgstr "Edat del nen" #: src/widgets/FTextRXTX.cxx:175 msgid "Round Up Chk" msgstr "Round Up Chk" #: src/widgets/FTextRXTX.cxx:176 msgid "NAQP xchg" msgstr "NAQP xchg" #: src/widgets/FTextRXTX.cxx:177 msgid "JOTA scout" msgstr "JOTA scout" #: src/widgets/FTextRXTX.cxx:178 msgid "JOTA troop" msgstr "tropa JOTA" #: src/widgets/FTextRXTX.cxx:179 msgid "POWER(r)" msgstr "POTÈNCIA(r)" #: src/widgets/FTextRXTX.cxx:181 msgid "QSOp state" msgstr "Estat del QSOp" #: src/widgets/FTextRXTX.cxx:182 msgid "QSOp county" msgstr "Comarca del QSOp" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp serno" msgstr "Serno del QSOp" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp name" msgstr "Nom del QSOp" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp xchg" msgstr "Intercanvi del QSOp" #: src/widgets/FTextRXTX.cxx:186 msgid "QSOp category" msgstr "Categoria del QSOp" #: src/widgets/FTextRXTX.cxx:188 msgid "Insert marker" msgstr "Insereix un marcador" #: src/widgets/FTextRXTX.cxx:196 msgid "All entries" msgstr "Totes les entrades" #: src/widgets/FTextRXTX.cxx:198 msgid "Scroll hints" msgstr "Suggeriments de desplaçament" #: src/widgets/FTextRXTX.cxx:1808 msgid " in " msgstr " en " #: src/widgets/FTextRXTX.cxx:1811 msgid "Last QSO" msgstr "Últim QSO" #: src/widgets/FTextRXTX.cxx:1859 src/dialogs/confdialog.cxx:12043 msgid "Transmit" msgstr "Transmetre" #: src/widgets/FTextRXTX.cxx:1860 src/dialogs/confdialog.cxx:11903 #: src/dialogs/confdialog.cxx:14718 msgid "Receive" msgstr "Rebre" #: src/widgets/FTextRXTX.cxx:1861 msgid "Abort" msgstr "Avortar" #: src/widgets/FTextRXTX.cxx:1862 msgid "Send image..." msgstr "Envia una imatge..." #: src/widgets/FTextRXTX.cxx:1871 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "Especificació Caràcters" #: src/widgets/FTextRXTX.cxx:1879 src/widgets/flinput2.cxx:58 msgid "A" msgstr "A" #: src/widgets/FTextRXTX.cxx:1895 src/widgets/flinput2.cxx:74 msgid "E" msgstr "E" # Texto de la pestaña IO en la ventana de configuración Fldigi (@HK4QWC) #: src/widgets/FTextRXTX.cxx:1905 src/widgets/flinput2.cxx:84 msgid "I" msgstr "I" #: src/widgets/FTextRXTX.cxx:1915 src/widgets/flinput2.cxx:94 msgid "N" msgstr "N" #: src/widgets/FTextRXTX.cxx:1919 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16915 msgid "O" msgstr "O" #: src/widgets/FTextRXTX.cxx:1933 src/widgets/flinput2.cxx:112 msgid "U" msgstr "U" #: src/widgets/FTextRXTX.cxx:1943 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "Y" #: src/widgets/FTextRXTX.cxx:1948 src/widgets/flinput2.cxx:127 #: src/logbook/lgbook.cxx:1148 msgid "Other" msgstr "Altres" #: src/widgets/FTextView.cxx:294 msgid "Insert text" msgstr "Inserta text" #: src/widgets/FTextView.cxx:347 msgid "Save text as" msgstr "Desa el text com a" #: src/widgets/FTextView.cxx:482 src/widgets/FTextView.cxx:648 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Còpia" #: src/widgets/FTextView.cxx:485 msgid "Save as..." msgstr "Guardar com..." #: src/widgets/FTextView.cxx:486 src/widgets/FTextView.cxx:652 msgid "Word wrap" msgstr "L'ajust de línia" #: src/widgets/FTextView.cxx:647 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Tallar" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Enganxa" #: src/widgets/FTextView.cxx:651 msgid "Insert file..." msgstr "Insereix fitxer..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Desfer" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1581 msgid "Delete" msgstr "Suprimeix" #: src/config_script/run_scripts.cxx:950 msgid "Invalid Modem for KISS IO" msgstr "Mòdem no vàlid per a KISS IO" #: src/config_script/run_scripts.cxx:2850 msgid "Script file name (path) null pointer" msgstr "Nom del fitxer d'script (camí) punter nul" #: src/config_script/run_scripts.cxx:2857 msgid "Script file name (path) invalid" msgstr "El nom del fitxer d'script (camí) no és vàlid" #: src/config_script/run_scripts.cxx:2864 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "Error en l'assignació de classes d'anàlisi d'scripts (%s)" #: src/config_script/run_scripts.cxx:2868 #, c-format msgid "Executing script file: %s" msgstr "S'està executant el fitxer d'script : %s" #: src/config_script/run_scripts.cxx:2873 #, c-format msgid "Issues reported in processing script file: %s" msgstr "Problemes reportats en el processament del fitxer d'script : %s" #: src/config_script/run_scripts.cxx:2874 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" "El fitxer d'script conté problemes potencials\n" "Consulta la documentació i/o el fitxer de registre per obtenir més " "informació." #: src/config_script/run_scripts.cxx:2878 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" "Alguns canvis fets per l'script requereixen programa\n" "reinicia abans que s'activin." #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "Fitxers de script" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "*.txt" #: src/config_script/script_parsing.cxx:359 #, c-format msgid "Missing command %s after line %d" msgstr "Falta l'ordre %s després de la línia %d" #: src/config_script/script_parsing.cxx:403 msgid "Command Not Found" msgstr "No s'ha trobat l'ordre" #: src/config_script/script_parsing.cxx:407 msgid "Not a script file/tag not found" msgstr "No s'ha trobat cap fitxer d'script/etiqueta" #: src/config_script/script_parsing.cxx:411 msgid "Invalid parameter" msgstr "El paràmetre no és vàlid" #: src/config_script/script_parsing.cxx:415 msgid "Invalid function parameter (internal non-script error)" msgstr "El paràmetre de funció no és vàlid (error intern no script)" #: src/config_script/script_parsing.cxx:419 msgid "Missing paired quotes (\")" msgstr "Falten cometes emparellades (\"\")" #: src/config_script/script_parsing.cxx:423 msgid "General Error" msgstr "Error General" #: src/config_script/script_parsing.cxx:427 msgid "No Errors" msgstr "Sense errors" #: src/config_script/script_parsing.cxx:431 msgid "Character searched not found" msgstr "No s'ha trobat el caràcter buscat" #: src/config_script/script_parsing.cxx:435 msgid "End of line reached" msgstr "S'ha arribat al final de la línia" #: src/config_script/script_parsing.cxx:439 msgid "File not found" msgstr "Arxiu no trobat" #: src/config_script/script_parsing.cxx:443 msgid "Directory path not found" msgstr "No s'ha trobat la ruta del directori" #: src/config_script/script_parsing.cxx:447 msgid "Unexpected end of parameter (args[]) list found" msgstr "S'ha trobat un final inesperat de la llista de paràmetres (args[])" #: src/config_script/script_parsing.cxx:451 msgid "Unexpected end of parameter check list found" msgstr "" "S'ha trobat un final inesperat de la llista de comprovació de paràmetres" #: src/config_script/script_parsing.cxx:455 msgid "Character count in args[] parameter exceeds expectations" msgstr "El recompte de caràcters del paràmetre args[] supera les expectatives" #: src/config_script/script_parsing.cxx:459 msgid "Memory Allocation Error (internal non-script error)" msgstr "Error d'assignació de memòria (error intern no script)" #: src/config_script/script_parsing.cxx:463 msgid "Passed parameter is not of the expected type." msgstr "El paràmetre passat no és del tipus esperat." #: src/config_script/script_parsing.cxx:467 msgid "Parameter is not valid." msgstr "El paràmetre no és vàlid." #: src/config_script/script_parsing.cxx:471 msgid "Command missing ':'." msgstr "Falta l'ordre ':'." #: src/config_script/script_parsing.cxx:475 msgid "Maximum open subscripts reached." msgstr "S'ha arribat al màxim de subíndexs oberts." #: src/config_script/script_parsing.cxx:479 msgid "Subscript execution fail (internal)." msgstr "Error en l'execució del subíndex (intern)." #: src/config_script/script_parsing.cxx:483 msgid "Script device path not found." msgstr "No s'ha trobat la ruta del dispositiu de l'script." #: src/config_script/script_parsing.cxx:487 msgid "Unexpected end of file reached." msgstr "S'ha arribat al final inesperat del fitxer." #: src/config_script/script_parsing.cxx:491 msgid "File read error" msgstr "Error de lectura del fitxer" #: src/config_script/script_parsing.cxx:495 msgid "Undefined error" msgstr "Error no definit" #: src/config_script/script_parsing.cxx:498 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "Línia: %d Error:%d %s (%s)" #: src/config_script/script_parsing.cxx:966 #: src/config_script/script_parsing.cxx:1093 #: src/config_script/script_parsing.cxx:1806 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "" "Error d'assignació de memòria intermèdia a prop del fitxer: %s Línia %d" #: src/config_script/script_parsing.cxx:1036 #: src/config_script/script_parsing.cxx:1152 #, c-format msgid "Call back for script command %s reported an Error" msgstr "Torna a trucar per a l'ordre d'script %s ha informat d'un error" #: src/config_script/script_parsing.cxx:1042 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "L'ordre %s s'ha ignorat, no s'admet la notació de punts" #: src/config_script/script_parsing.cxx:1156 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "L'ordre %s s'ha ignorat, l'ordre estructurada no és compatible" #: src/config_script/script_parsing.cxx:1239 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "El paràmetre de funció \"char *file_name_path\" no és vàlid (nul)" #: src/config_script/script_parsing.cxx:1247 #, c-format msgid "Unable to open file %s" msgstr "No es pot obrir el fitxer %s" #: src/config_script/script_parsing.cxx:1435 msgid "1" msgstr "11" #: src/config_script/script_parsing.cxx:1439 msgid "0" msgstr "0" #: src/config_script/script_parsing.cxx:1656 #: src/config_script/script_parsing.cxx:1743 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "error d'assignació de cmd_buffer prop de la línia %d" #: src/config_script/script_parsing.cxx:1757 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "Funció de devolució de trucada per sobre d'escriptura per a \"%s\"" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "Punter de nom de fitxer no vàlid (NULL) a la funció %s:%d" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "No es pot crear el fitxer %s (Error No=%d) func %s:%d" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" "%s\n" "# Script de configuració generat per Fldigi\n" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "# Creat: %s\n" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 #: src/dialogs/confdialog.cxx:10080 src/dialogs/confdialog.cxx:11537 #: src/dialogs/confdialog.cxx:11721 msgid "Show" msgstr "Ensenya" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 msgid "Hide" msgstr "Amaga" #: src/dialogs/confdialog.cxx:6816 msgid "no" msgstr "no" #: src/dialogs/confdialog.cxx:6816 msgid "yes" msgstr "sí" #: src/dialogs/confdialog.cxx:9873 msgid "Fldigi configuration" msgstr "Configuració FLdigi" #: src/dialogs/confdialog.cxx:9883 msgid "Configure" msgstr "&Configuració" #: src/dialogs/confdialog.cxx:9893 msgid "Collapse Tree" msgstr "Col·lapse l'arbre" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:10100 #: src/dialogs/confdialog.cxx:10102 #, fuzzy #| msgid "Callook" msgid "Call/Lookup" msgstr "Callook" #: src/dialogs/confdialog.cxx:9905 msgid "Web Browser lookup" msgstr "Busca del navegador web" #: src/dialogs/confdialog.cxx:9909 msgid "Do not use callsign lookup via web browser" msgstr "No utilitzis la cerca d'indicatius mitjançant el navegador web" #: src/dialogs/confdialog.cxx:9915 msgid "QRZ on line" msgstr "QRZ en línia" #: src/dialogs/confdialog.cxx:9916 msgid "Visit QRZ web site" msgstr "Visita el lloc web de QRZ" #: src/dialogs/confdialog.cxx:9921 msgid "HamCall online" msgstr "HamCall en línia" #: src/dialogs/confdialog.cxx:9922 msgid "Visit Hamcall web site" msgstr "Visita el lloc web de Hamcall" #: src/dialogs/confdialog.cxx:9927 msgid "HamQTH online" msgstr "HamQTH en línia" #: src/dialogs/confdialog.cxx:9928 src/dialogs/confdialog.cxx:9934 msgid "Visit hamQTH web site" msgstr "Visita el lloc web de hamQTH" #: src/dialogs/confdialog.cxx:9933 msgid "Callook online" msgstr "Callbook en línia" #: src/dialogs/confdialog.cxx:9939 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:9952 msgid "Hamcall" msgstr "Hamcall" #: src/dialogs/confdialog.cxx:9965 msgid "HamQTH" msgstr "HamQTH" #: src/dialogs/confdialog.cxx:9978 msgid "Callook" msgstr "Callook" #: src/dialogs/confdialog.cxx:9979 msgid "Callook.info web site" msgstr "Lloc web Callook.info" #: src/dialogs/confdialog.cxx:9994 msgid "Data base lookup" msgstr "Cerca de bases de dades" #: src/dialogs/confdialog.cxx:9998 msgid "Do not use callsign database" msgstr "No utilitzis la base de dades d'indicatius" #: src/dialogs/confdialog.cxx:10004 msgid "QRZ cdrom" msgstr "QRZ CD" #: src/dialogs/confdialog.cxx:10005 msgid "Use CD or hard drive CD image" msgstr "Utilitza la imatge del CD o del disc dur" #: src/dialogs/confdialog.cxx:10010 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:10011 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "A QRZ necessites un pagament en línia\n" "per accedir" #: src/dialogs/confdialog.cxx:10016 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:10017 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Necessites un pagament en línia\n" " per accedir a Hamcall" #: src/dialogs/confdialog.cxx:10022 msgid "HamQTH.com" msgstr "HamQTH.com" #: src/dialogs/confdialog.cxx:10023 msgid "Free service courtesy of OK" msgstr "Servei gratuït" #: src/dialogs/confdialog.cxx:10028 msgid "Callook.info" msgstr "Callook.info" #: src/dialogs/confdialog.cxx:10029 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Cerca de Callook.info (servei gratuït només a indicatius dels EUA)" #: src/dialogs/confdialog.cxx:10035 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "ie: /home/dave/CALLBK/ o C:/CALLBK/\n" "Deixa en blanc per buscar a la base de dades" #: src/dialogs/confdialog.cxx:10049 msgid "User name" msgstr "Nom d'usuari" #: src/dialogs/confdialog.cxx:10050 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "Nom d'inici de sessió per a QRZ / Hamcall / HamQTH" #: src/dialogs/confdialog.cxx:10064 src/dialogs/confdialog.cxx:11521 #: src/dialogs/confdialog.cxx:11637 msgid "Password" msgstr "Contrasenya" #: src/dialogs/confdialog.cxx:10065 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "Contrasenya per a QRZ / Hamcall / HamQTH" #: src/dialogs/confdialog.cxx:10081 src/dialogs/confdialog.cxx:11538 #: src/dialogs/confdialog.cxx:11722 msgid "Show password in plain text" msgstr "Mostra la contrasenya en text sense format" #: src/dialogs/confdialog.cxx:10086 msgid "Add address to notes field" msgstr "Afegeix l'adreça al camp de notes" #: src/dialogs/confdialog.cxx:10091 msgid "clear old data" msgstr "esborra dades antigues" #: src/dialogs/confdialog.cxx:10105 #, fuzzy #| msgid "Reload cty.dat" msgid "Call/cty.dat" msgstr "Recarregar el cty.dat" #: src/dialogs/confdialog.cxx:10109 msgid "cty.dat folder" msgstr "arxiu cty.dat" #: src/dialogs/confdialog.cxx:10110 msgid "Enter full path-name for cty.dat folder" msgstr "Entra la ruta completa del arxiu cty.dat" #: src/dialogs/confdialog.cxx:10123 msgid "Browse" msgstr "Buscar" #: src/dialogs/confdialog.cxx:10124 msgid "Locate cty.dat file" msgstr "Buscar l'arxiu cty.dat" #: src/dialogs/confdialog.cxx:10127 src/dialogs/confdialog.cxx:10390 #: src/dialogs/confdialog.cxx:10410 src/dialogs/confdialog.cxx:10427 #: src/dialogs/confdialog.cxx:10457 src/dialogs/confdialog.cxx:10661 #: src/dialogs/confdialog.cxx:10717 src/dialogs/confdialog.cxx:11249 #: src/dialogs/confdialog.cxx:11445 src/dialogs/confdialog.cxx:12067 #: src/dialogs/confdialog.cxx:16947 src/dialogs/confdialog.cxx:17032 #: src/dialogs/confdialog.cxx:17046 src/dialogs/confdialog.cxx:17093 #: src/dialogs/confdialog.cxx:17159 src/dialogs/confdialog.cxx:17348 #: src/dialogs/confdialog.cxx:18931 src/dialogs/confdialog.cxx:20169 msgid "Default" msgstr "Per defecte" #: src/dialogs/confdialog.cxx:10128 msgid "Restore cty.dat default folder" msgstr "Restaura la carpeta predeterminada cty.dat" #: src/dialogs/confdialog.cxx:10131 msgid "Reload" msgstr "Recarregar" #: src/dialogs/confdialog.cxx:10132 msgid "Reload cty.dat" msgstr "Recarregar el cty.dat" #: src/dialogs/confdialog.cxx:10135 src/dialogs/confdialog.cxx:10137 msgid "Call/Cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10141 src/dialogs/confdialog.cxx:10249 #: src/dialogs/confdialog.cxx:10251 #, fuzzy #| msgid "Colors-Fonts/Buttons" msgid "Colors-Fonts/Buttons-Menus" msgstr "Colors de les Fonts i Botons" #: src/dialogs/confdialog.cxx:10145 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:10148 msgid "Rev" msgstr "Invers" #: src/dialogs/confdialog.cxx:10151 msgid "Tune" msgstr "Sintonització" #: src/dialogs/confdialog.cxx:10154 msgid "RxID nar" msgstr "RxID estret" #: src/dialogs/confdialog.cxx:10157 msgid "Lk" msgstr "Lk" #: src/dialogs/confdialog.cxx:10160 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:10163 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:10166 msgid "RxID wide" msgstr "RxID ample" #: src/dialogs/confdialog.cxx:10169 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:10172 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:10175 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:10225 msgid "Lighted Btns" msgstr "" #: src/dialogs/confdialog.cxx:10232 #, fuzzy #| msgid "Check" msgid "Check Btns" msgstr "Revisa" #: src/dialogs/confdialog.cxx:10239 msgid "Round Btns" msgstr "" #: src/dialogs/confdialog.cxx:10246 #, fuzzy #| msgid "Rx font" msgid "Menu font" msgstr "Text de RX" #: src/dialogs/confdialog.cxx:10254 src/dialogs/confdialog.cxx:10328 #: src/dialogs/confdialog.cxx:10330 msgid "Colors-Fonts/FreqDisp - Meters" msgstr "Colors de les Fonts, Displai de Freqüència i Mesuradors" #: src/dialogs/confdialog.cxx:10260 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:10269 src/dialogs/confdialog.cxx:10387 #: src/dialogs/confdialog.cxx:10407 src/dialogs/confdialog.cxx:10424 #: src/dialogs/confdialog.cxx:10449 msgid "Font" msgstr "Tipus lletra" #: src/dialogs/confdialog.cxx:10272 src/dialogs/confdialog.cxx:10286 #: src/dialogs/confdialog.cxx:10300 src/dialogs/confdialog.cxx:10384 #: src/dialogs/confdialog.cxx:10404 msgid "Bg Color" msgstr "Color de fons" #: src/dialogs/confdialog.cxx:10275 msgid "Digit Color" msgstr "Color del dígit" #: src/dialogs/confdialog.cxx:10278 msgid "Sys Colors" msgstr "Colors del sistema" #: src/dialogs/confdialog.cxx:10283 msgid "S-meter" msgstr "Mesurador de senyal" #: src/dialogs/confdialog.cxx:10289 src/dialogs/confdialog.cxx:10303 msgid "Scale Color" msgstr "Escala de colors" #: src/dialogs/confdialog.cxx:10292 src/dialogs/confdialog.cxx:10306 msgid "Meter Color" msgstr "Color mesurador" #: src/dialogs/confdialog.cxx:10297 msgid "PWR-meter" msgstr "Mesurador de potència" #: src/dialogs/confdialog.cxx:10309 msgid "Power scale" msgstr "Escala de potència" #: src/dialogs/confdialog.cxx:10310 src/dialogs/confdialog.cxx:19838 msgid "Select the type of FFT prefilter" msgstr "Selecciona el tipus de prefiltre FFT" #: src/dialogs/confdialog.cxx:10321 msgid "25 W" msgstr "25 W" #: src/dialogs/confdialog.cxx:10333 src/dialogs/confdialog.cxx:10366 #: src/dialogs/confdialog.cxx:10368 msgid "Colors-Fonts/Function keys" msgstr "Colors - tipus de lletra/tecles de funció" #: src/dialogs/confdialog.cxx:10337 msgid "Use colored buttons" msgstr "Utilitza botons de colors" #: src/dialogs/confdialog.cxx:10342 msgid "Group 1" msgstr "Grup 1" #: src/dialogs/confdialog.cxx:10343 msgid "Background color for Function key group 1" msgstr "Color de fons per al grup de tecles de funció 1" #: src/dialogs/confdialog.cxx:10348 msgid "Group 2" msgstr "Grup 2" #: src/dialogs/confdialog.cxx:10349 msgid "Background color for Function key group 2" msgstr "Color de fons per al grup de tecles de funció 2" #: src/dialogs/confdialog.cxx:10354 msgid "Group 3" msgstr "Grup 3" #: src/dialogs/confdialog.cxx:10355 msgid "Background color for Function key group 3" msgstr "Color de fons per al grup de tecles de funció 3" #: src/dialogs/confdialog.cxx:10360 src/dialogs/confdialog.cxx:10555 #: src/dialogs/confdialog.cxx:12036 src/dialogs/confdialog.cxx:14187 #: src/dialogs/confdialog.cxx:18180 src/logbook/lgbook.cxx:828 msgid "Defaults" msgstr "Per defecte" #: src/dialogs/confdialog.cxx:10363 msgid "Font/Color" msgstr "Color de la lletra" #: src/dialogs/confdialog.cxx:10371 src/dialogs/confdialog.cxx:10462 #: src/dialogs/confdialog.cxx:10464 msgid "Colors-Fonts/Logging controls" msgstr "Colors de les Fonts - Controls del llibre de guàrdia" #: src/dialogs/confdialog.cxx:10375 msgid "Logging Panel Controls" msgstr "Controls del panell de registre" #: src/dialogs/confdialog.cxx:10395 msgid "Logbook Dialog" msgstr "Diàleg del llibre de guàrdia" #: src/dialogs/confdialog.cxx:10415 msgid "DX Cluster Dialog" msgstr "Diàleg del DX Clúster" #: src/dialogs/confdialog.cxx:10418 msgid "Report Browser" msgstr "Navegador d'informes" #: src/dialogs/confdialog.cxx:10430 msgid "Even Lines" msgstr "Línies parelles" #: src/dialogs/confdialog.cxx:10435 msgid "Odd Lines" msgstr "Línies imparells" #: src/dialogs/confdialog.cxx:10440 msgid "Stream Text" msgstr "Text Corrent" #: src/dialogs/confdialog.cxx:10446 msgid "Bg color" msgstr "Color Bg" #: src/dialogs/confdialog.cxx:10452 msgid "Alt Color" msgstr "Color Alt" #: src/dialogs/confdialog.cxx:10453 msgid "Color for outgoing telnet text" msgstr "Color per al text Telnet de sortida" #: src/dialogs/confdialog.cxx:10467 src/dialogs/confdialog.cxx:10565 #: src/dialogs/confdialog.cxx:10567 msgid "Colors-Fonts/Rx-Tx" msgstr "Colors de les Fonts - RX-TX" #: src/dialogs/confdialog.cxx:10471 msgid "Rx/Tx Character set" msgstr "Conjunt de caràcters de RX/TX" #: src/dialogs/confdialog.cxx:10472 msgid "Select Rx/Tx Character Set" msgstr "Selecciona el conjunt de caràcters de RX/TX" #: src/dialogs/confdialog.cxx:10492 msgid "Rx bkgnd" msgstr "Fons de RX" #: src/dialogs/confdialog.cxx:10495 msgid "Tx bkgnd" msgstr "Fons de TX" #: src/dialogs/confdialog.cxx:10504 msgid "Rx font" msgstr "Text de RX" #: src/dialogs/confdialog.cxx:10507 msgid "Tx font" msgstr "Text de TX" #: src/dialogs/confdialog.cxx:10516 msgid "Macro Edit Font" msgstr "Font d'edició macro" #: src/dialogs/confdialog.cxx:10519 msgid "Text Highlighting" msgstr "Ressaltat del text" #: src/dialogs/confdialog.cxx:10522 src/dialogs/confdialog.cxx:14169 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:10523 msgid "Sent chars in Rx/Tx pane" msgstr "Caràcters enviats al panell de RX/TX" #: src/dialogs/confdialog.cxx:10528 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:10529 msgid "Control chars in Rx/Tx pane" msgstr "Controla els caràcters al panell de RX/TX" #: src/dialogs/confdialog.cxx:10534 msgid "SKIP" msgstr "SKIP" #: src/dialogs/confdialog.cxx:10535 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "S'han omès caràcters al panell de TX\n" "(TX enc./apag. a CW)" #: src/dialogs/confdialog.cxx:10540 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:10541 msgid "Alternate character color in Rx panelr" msgstr "Color alternatiu del caràcter al panell de RX" #: src/dialogs/confdialog.cxx:10546 msgid "SEL" msgstr "SEL" #: src/dialogs/confdialog.cxx:10547 msgid "Selection background color in Rx Tx panels" msgstr "Color de fons de selecció en panells de RX/TX" #: src/dialogs/confdialog.cxx:10552 src/dialogs/confdialog.cxx:10577 msgid "System" msgstr "Sistema" #: src/dialogs/confdialog.cxx:10560 msgid "display Rx control chars as ascii string" msgstr "mostrar els caràcters de control de RX com a cadena ascii" #: src/dialogs/confdialog.cxx:10570 src/dialogs/confdialog.cxx:10580 #: src/dialogs/confdialog.cxx:10582 msgid "Colors-Fonts/Tabs" msgstr "Colors de les Fonts de lletra - pestanyes" #: src/dialogs/confdialog.cxx:10574 msgid "Tab Color" msgstr "Color pestanya" #: src/dialogs/confdialog.cxx:10585 src/dialogs/confdialog.cxx:10670 #: src/dialogs/confdialog.cxx:10672 msgid "Colors-Fonts/Signal Level" msgstr "Colors del Tipus de lletra - Nivell de senyal" #: src/dialogs/confdialog.cxx:10589 msgid "Signal Level Indicator" msgstr "Indicador de nivell de senyal" #: src/dialogs/confdialog.cxx:10596 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18866 msgid "Low" msgstr "Baix" #: src/dialogs/confdialog.cxx:10604 src/dialogs/confdialog.cxx:18874 msgid "" "Transition\n" "Level (dB)" msgstr "" "Transició\n" "Nivell (dB)" #: src/dialogs/confdialog.cxx:10612 src/dialogs/confdialog.cxx:18882 msgid "Normal" msgstr "Normal" #: src/dialogs/confdialog.cxx:10627 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18897 msgid "High" msgstr "Alt" #: src/dialogs/confdialog.cxx:10642 src/dialogs/confdialog.cxx:18912 msgid "Over" msgstr "Molt alt" #: src/dialogs/confdialog.cxx:10645 src/dialogs/confdialog.cxx:10648 #: src/dialogs/confdialog.cxx:10714 src/dialogs/confdialog.cxx:18915 #: src/dialogs/confdialog.cxx:18918 msgid "label" msgstr "etiqueta" #: src/dialogs/confdialog.cxx:10659 src/dialogs/confdialog.cxx:18929 msgid "Input signal level" msgstr "Nivell del senyal d'entrada" #: src/dialogs/confdialog.cxx:10664 src/dialogs/confdialog.cxx:18934 msgid "Use wsjtx scale" msgstr "Utilitza l'escala WSJT-X" #: src/dialogs/confdialog.cxx:10665 src/dialogs/confdialog.cxx:18935 msgid "" "default scale is audo \"Vu Meter\"\n" "enable to emulate wsjtx scale" msgstr "" "l'escala predeterminada és \"Vu Meter\" d'àudio\n" "habilita per emular l'escala WSJT-X" #: src/dialogs/confdialog.cxx:10676 src/dialogs/confdialog.cxx:10736 #: src/dialogs/confdialog.cxx:10738 #, fuzzy #| msgid "Colors-Fonts/Tabs" msgid "Colors-Fonts/Digiscope" msgstr "Colors de les Fonts de lletra - pestanyes" #: src/dialogs/confdialog.cxx:10680 #, fuzzy #| msgid "Digit Color" msgid "Digital Scope Colors" msgstr "Color del dígit" #: src/dialogs/confdialog.cxx:10687 #, fuzzy #| msgid "Backgnd" msgid "Background" msgstr "Fons" #: src/dialogs/confdialog.cxx:10695 src/dialogs/confdialog.cxx:13791 msgid "Axis" msgstr "Eix" #: src/dialogs/confdialog.cxx:10703 #, fuzzy #| msgid "Color" msgid "Color 1" msgstr "Color" #: src/dialogs/confdialog.cxx:10711 #, fuzzy #| msgid "Color" msgid "Color 2" msgstr "Color" #: src/dialogs/confdialog.cxx:10725 #, fuzzy #| msgid "Color" msgid "Color 3" msgstr "Color" #: src/dialogs/confdialog.cxx:10733 #, fuzzy #| msgid "Color" msgid "Color 4" msgstr "Color" #: src/dialogs/confdialog.cxx:10742 src/dialogs/confdialog.cxx:10946 #: src/dialogs/confdialog.cxx:10948 msgid "Contests/General" msgstr "Concurs - General" #: src/dialogs/confdialog.cxx:10747 msgid "Select Logging as QSO or Contest" msgstr "Selecciona el Registre com a QSO o Concurs" #: src/dialogs/confdialog.cxx:10762 msgid "State QSO Party" msgstr "Estat del QSO Party" #: src/dialogs/confdialog.cxx:10778 msgid "Text capture order" msgstr "Ordre de captura de text" #: src/dialogs/confdialog.cxx:10779 msgid "Context Notes" msgstr "Notes del Concurs" #: src/dialogs/confdialog.cxx:10791 msgid "Duplicate check, CALL plus" msgstr "Xequejar duplicats, Indicatiu i més" #: src/dialogs/confdialog.cxx:10794 msgid "On/Off" msgstr "On/Off" #: src/dialogs/confdialog.cxx:10795 msgid "Check for duplicates" msgstr "Comprova si hi ha duplicats" #: src/dialogs/confdialog.cxx:10800 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:677 src/logbook/lgbook.cxx:1391 msgid "Band" msgstr "Banda" #: src/dialogs/confdialog.cxx:10801 msgid "Bands must match" msgstr "Les bandes han de coincidir" #: src/dialogs/confdialog.cxx:10806 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:680 src/logbook/lgbook.cxx:955 #: src/logbook/lgbook.cxx:1619 src/logbook/lgbook.cxx:1674 msgid "Mode" msgstr "Mode" #: src/dialogs/confdialog.cxx:10807 msgid "Mode must match" msgstr "El mode ha de coincidir" #: src/dialogs/confdialog.cxx:10812 msgid "Time span over" msgstr "S'ha acabat el període de temps" #: src/dialogs/confdialog.cxx:10813 msgid "QSO must not occur within a time period of" msgstr "El QSO no ha de passar dins del període especificat a continuació" #: src/dialogs/confdialog.cxx:10818 msgid "Dup Color" msgstr "Color Duplicat" #: src/dialogs/confdialog.cxx:10819 msgid "Left click to select dup color" msgstr "Fes clic esquerre per seleccionar el color duplicat" #: src/dialogs/confdialog.cxx:10827 msgid "? Dup Color" msgstr "Color Duplicat" #: src/dialogs/confdialog.cxx:10828 msgid "Left click to select possible dup color" msgstr "" "Fes clic amb el botó esquerre per seleccionar un possible color de duplicació" #: src/dialogs/confdialog.cxx:10837 msgid "free form 1 must match" msgstr "la forma lliure 1 ha de coincidir" #: src/dialogs/confdialog.cxx:10843 msgid "State must match" msgstr "L'estat ha de coincidir" #: src/dialogs/confdialog.cxx:10848 msgid "minutes" msgstr "minuts" #: src/dialogs/confdialog.cxx:10849 msgid "Enter time span in minutes" msgstr "Introdueix el període de temps en minuts" #: src/dialogs/confdialog.cxx:10867 msgid "Contest Exchange / Serial #" msgstr "Intercanvi del concurs/núm. de sèrie #" #: src/dialogs/confdialog.cxx:10870 src/dialogs/confdialog.cxx:11704 msgid "Send" msgstr "Enviar" #: src/dialogs/confdialog.cxx:10871 msgid "free form exchange" msgstr "intercanvi predefinit" #: src/dialogs/confdialog.cxx:10885 msgid "RST always 599/59" msgstr "RST sempre 599/59" #: src/dialogs/confdialog.cxx:10886 msgid "Force RST in/out to 599/59" msgstr "Força RST d'entrada/sortida a 599/59" #: src/dialogs/confdialog.cxx:10891 msgid "Send CW cut #'s" msgstr "Enviar números a CW (5NN)" #: src/dialogs/confdialog.cxx:10892 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:10899 msgid "Start Nbr" msgstr "Inici Numeració" #: src/dialogs/confdialog.cxx:10900 msgid "Starting number" msgstr "Número d'inici" #: src/dialogs/confdialog.cxx:10915 msgid "Digits" msgstr "Dígits" #: src/dialogs/confdialog.cxx:10916 msgid "Number of digits in serial number" msgstr "Nombre de dígits del número de sèrie" #: src/dialogs/confdialog.cxx:10932 msgid "Use leading zeros" msgstr "Utilitza zeros a l'esquerre" #: src/dialogs/confdialog.cxx:10933 msgid "Insert leading zeros into Xmtd serial number" msgstr "Insereix zeros a l'inici al número de sèrie Xmtd" #: src/dialogs/confdialog.cxx:10938 src/dialogs/confdialog.cxx:15083 #: src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Reiniciar" #: src/dialogs/confdialog.cxx:10939 msgid "Initialize the QSO logging fields" msgstr "Inicialitza els camps del registre del QSO" #: src/dialogs/confdialog.cxx:10951 src/dialogs/confdialog.cxx:11000 #: src/dialogs/confdialog.cxx:11002 msgid "Contests/Field Day" msgstr "Concurs - Field Day" #: src/dialogs/confdialog.cxx:10955 src/logbook/lgbook.cxx:1255 msgid "Operator Call" msgstr "Nom de l'operador" #: src/dialogs/confdialog.cxx:10956 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" "Indicatiu Field Day\n" "Pot ser el mateix que l'indicatiu de l'operador" #: src/dialogs/confdialog.cxx:10970 msgid "My Section" msgstr "Ssecció (ARRL)" #: src/dialogs/confdialog.cxx:10971 msgid "Field Day Section" msgstr "Secció Field Day" #: src/dialogs/confdialog.cxx:10985 src/dialogs/confdialog.cxx:11012 msgid "My Class" msgstr "Classe" #: src/dialogs/confdialog.cxx:10986 msgid "Field Day Class" msgstr "Classe de Field Day" #: src/dialogs/confdialog.cxx:11005 src/dialogs/confdialog.cxx:11064 #: src/dialogs/confdialog.cxx:11066 msgid "Contests/JOTA School" msgstr "Concurs - JOTA escolar" #: src/dialogs/confdialog.cxx:11009 msgid "School Round Up" msgstr "Roda de l'escola" #: src/dialogs/confdialog.cxx:11013 msgid "School Round Up - allowable I, H, O - see rules" msgstr "Round Up Escolar - permesos I, H, O - veure regles" #: src/dialogs/confdialog.cxx:11029 msgid "Jamboree OTA" msgstr "Jamboree OTA" #: src/dialogs/confdialog.cxx:11032 msgid "My Troop" msgstr "La meva tropa" #: src/dialogs/confdialog.cxx:11033 msgid "My JOTA Troop" msgstr "La meva tropa JOTA" #: src/dialogs/confdialog.cxx:11047 msgid "Scout Op'" msgstr "Operador Scoout" #: src/dialogs/confdialog.cxx:11048 msgid "Scout Operator Name" msgstr "Nom de l'operador Scout" #: src/dialogs/confdialog.cxx:11070 src/dialogs/confdialog.cxx:11109 #: src/dialogs/confdialog.cxx:11111 msgid "IDs/CW" msgstr "IDs - CW" #: src/dialogs/confdialog.cxx:11074 msgid "CW Postamble ID" msgstr "ID de CW al aire" #: src/dialogs/confdialog.cxx:11077 msgid "Transmit callsign" msgstr "Transmet l'indicatiu" #: src/dialogs/confdialog.cxx:11078 msgid "Send Callsign in CW at end of every transmission" msgstr "Envia l'indicatiu en CW al final de cada transmissió" #: src/dialogs/confdialog.cxx:11083 msgid "Speed (WPM):" msgstr "Velocitat per Minut (WPM):" #: src/dialogs/confdialog.cxx:11084 msgid "Send at this WPM" msgstr "Envia a aquesta velocitat per minut WPM" #: src/dialogs/confdialog.cxx:11104 msgid "CW ID modes" msgstr "Modes amb ID de CW" #: src/dialogs/confdialog.cxx:11114 src/dialogs/confdialog.cxx:11254 #: src/dialogs/confdialog.cxx:11256 msgid "IDs/RsID" msgstr "IDs - RsID" #: src/dialogs/confdialog.cxx:11118 msgid "Reed-Solomon ID (Rx)" msgstr "ID de Reed-Solomon (RX)" #: src/dialogs/confdialog.cxx:11121 msgid "Notify only" msgstr "Només notificar" #: src/dialogs/confdialog.cxx:11122 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Marca per ser notificat quan es rebi un RSID\n" "sense canviar el mòdem i la freqüència" #: src/dialogs/confdialog.cxx:11128 msgid "Rx modes" msgstr "Mode RX" #: src/dialogs/confdialog.cxx:11131 msgid "Mark prev freq/mode" msgstr "Marca la freqüència / mode anterior" #: src/dialogs/confdialog.cxx:11132 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Insereix el marcador de text de recepció abans\n" "canviant de freqüència i mòdem" #: src/dialogs/confdialog.cxx:11137 msgid "Allow errors" msgstr "Permet errors" #: src/dialogs/confdialog.cxx:11138 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Baix = zero errors\n" "Mitjà = 1 error\n" "Alt = 2 errors" #: src/dialogs/confdialog.cxx:11149 msgid "Medium" msgstr "Mitjà" #: src/dialogs/confdialog.cxx:11154 msgid "Disable alert dialog" msgstr "Desactiva el diàleg d'alerta" #: src/dialogs/confdialog.cxx:11155 msgid "Do not show RsID alert dialog box" msgstr "No mostris el quadre de diàleg d'alerta RsID" #: src/dialogs/confdialog.cxx:11160 msgid "Disables detector" msgstr "Desactiva el detector" #: src/dialogs/confdialog.cxx:11161 msgid "Disable further detection when RSID is received" msgstr "Desactiva la detecció addicional quan es rebi RSID" #: src/dialogs/confdialog.cxx:11168 msgid "Retain tx freq lock" msgstr "Mantenir el bloqueig de la freqüència de TX" #: src/dialogs/confdialog.cxx:11169 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" "Conserva la freqüència de bloqueig de transmissió (Lk) quan canviïs a la " "freqüència de recepció RsID" #: src/dialogs/confdialog.cxx:11174 msgid "Disable freq change" msgstr "Desactiva el canvi de freqüència" #: src/dialogs/confdialog.cxx:11175 src/dialogs/confdialog.cxx:11181 msgid "Do not automatically change to RX RsID frequency" msgstr "No canviïs automàticament a la freqüència de recepció RsID" #: src/dialogs/confdialog.cxx:11180 msgid "Rx/Tx RsID EOT" msgstr "RX/TX RsID EOT" #: src/dialogs/confdialog.cxx:11186 msgid "Squelch open (sec)" msgstr "Squelch obert (s)" #: src/dialogs/confdialog.cxx:11187 src/dialogs/confdialog.cxx:11208 msgid "Use for triggering amplifier carrier detect" msgstr "S'utilitza per activar la detecció del portador de l'amplificador" #: src/dialogs/confdialog.cxx:11196 msgid "" "The RsID notification message contents and display\n" "characteristics are configured on the \"Notifications\" tab." msgstr "" "Contingut i visualització del missatge de notificació RsID \n" "les característiques es configuren a la pestanya \"Notificacions\"." #: src/dialogs/confdialog.cxx:11204 msgid "Pre-Signal Tone" msgstr "To previ al senyal" #: src/dialogs/confdialog.cxx:11207 msgid "Seconds" msgstr "Segons" #: src/dialogs/confdialog.cxx:11216 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (TX)" #: src/dialogs/confdialog.cxx:11219 msgid "Transmit modes" msgstr "Modes de TX" #: src/dialogs/confdialog.cxx:11222 msgid "End of xmt ID" msgstr "Identificador al final de la TX" #: src/dialogs/confdialog.cxx:11223 msgid "Add RsID signal to end of transmission" msgstr "Afegeix el senyal RsID al final de la transmissió" #: src/dialogs/confdialog.cxx:11230 #, fuzzy #| msgid "My Section" msgid "Min BW Detection" msgstr "Ssecció (ARRL)" #: src/dialogs/confdialog.cxx:11233 msgid "Hertz" msgstr "" #: src/dialogs/confdialog.cxx:11234 #, fuzzy #| msgid "Filter bandwidth" msgid "Minimum bandwidth" msgstr "Ample de banda del filtre" #: src/dialogs/confdialog.cxx:11243 #, fuzzy #| msgid "Password" msgid "Passband" msgstr "Contrasenya" #: src/dialogs/confdialog.cxx:11244 #, fuzzy #| msgid "" #| "ON - search over entire waterfall\n" #| "OFF - limit search to +/- 200 Hz" msgid "" "ON - search over entire waterfall\n" "OFF - limit search to BW selector" msgstr "" "Marcat - cerca tota la cascada\n" "Desmarcat - limita la cerca a +/- 200 Hz" #: src/dialogs/confdialog.cxx:11259 src/dialogs/confdialog.cxx:11335 #: src/dialogs/confdialog.cxx:11337 msgid "IDs/Video" msgstr "IDs - Vídeo" #: src/dialogs/confdialog.cxx:11263 msgid "Video Preamble ID" msgstr "Identificador de preàmbul del vídeo" #: src/dialogs/confdialog.cxx:11266 msgid "Transmit mode ID" msgstr "Transmetre el ID de mode" #: src/dialogs/confdialog.cxx:11267 msgid "Waterfall video ID" msgstr "Vídeo ID a la cascada" #: src/dialogs/confdialog.cxx:11271 msgid "Transmit video text" msgstr "Transmetre el text al vídeo" #: src/dialogs/confdialog.cxx:11272 msgid "Waterfall video text" msgstr "Text de vídeo a la cascada" #: src/dialogs/confdialog.cxx:11277 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:11278 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Limitar uns quants caràcters,\n" "com en CQEM o IOTA, etc." #: src/dialogs/confdialog.cxx:11292 msgid "Use small font" msgstr "Utilitza una font petita" #: src/dialogs/confdialog.cxx:11293 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "Marcat - font petita\n" "Desmarcat - font gran" #: src/dialogs/confdialog.cxx:11299 msgid "Chars/Row:" msgstr "Caràcters/fila:" #: src/dialogs/confdialog.cxx:11300 msgid "Set the number of characters per row" msgstr "Estableix el nombre de caràcters per fila" #: src/dialogs/confdialog.cxx:11320 msgid "500 Hz limit" msgstr "Límit de 500 Hz" #: src/dialogs/confdialog.cxx:11325 msgid "Mode width limit" msgstr "Límit d'amplada del mode" #: src/dialogs/confdialog.cxx:11330 msgid "Video ID modes" msgstr "Modes identificació vídeo" #: src/dialogs/confdialog.cxx:11341 src/dialogs/confdialog.cxx:11398 #: src/dialogs/confdialog.cxx:11400 msgid "Logging/MacLogger" msgstr "Logging - MacLogger" #: src/dialogs/confdialog.cxx:11345 msgid "Connect to MacLogger" msgstr "Connecta amb MacLogger" #: src/dialogs/confdialog.cxx:11350 msgid "Capture Radio Report" msgstr "Capturar informe de ràdio" #: src/dialogs/confdialog.cxx:11356 msgid "Capture Log Report" msgstr "Captura del informe de registre" #: src/dialogs/confdialog.cxx:11361 msgid "Capture Lookup " msgstr "Busca la captura " #: src/dialogs/confdialog.cxx:11366 msgid "Capture Spot Tune" msgstr "Captura Spot Tune" #: src/dialogs/confdialog.cxx:11371 msgid "Capture Spot Report" msgstr "Captura l'informe de Spot" #: src/dialogs/confdialog.cxx:11376 msgid "Enable UDP log file" msgstr "Activa el fitxer de registre UDP" #: src/dialogs/confdialog.cxx:11381 msgid "UDP data stream" msgstr "Flux de dades UDP" #: src/dialogs/confdialog.cxx:11389 msgid "Clear UDP text" msgstr "Clear UDP text" #: src/dialogs/confdialog.cxx:11392 msgid "Tune to Rx Spot" msgstr "Sintonitza l'Spot de RX" #: src/dialogs/confdialog.cxx:11393 msgid "" "ON - use Rx spot freq\n" "OFF - use Tx spot freq" msgstr "" "Marcat - utilitza la freqüència del Spot de RX\n" "Desmarcat - utilitza la freqüència del Spot de TX" #: src/dialogs/confdialog.cxx:11403 src/dialogs/confdialog.cxx:11482 #: src/dialogs/confdialog.cxx:11484 msgid "Logging/N3FJP logs" msgstr "Registres - N3FJP" #: src/dialogs/confdialog.cxx:11407 msgid "TCP/IP Data Stream" msgstr "Flux de dades TCP/IP" #: src/dialogs/confdialog.cxx:11412 msgid "Clear text" msgstr "Esborrar text" #: src/dialogs/confdialog.cxx:11415 msgid "Address" msgstr "Adreça" #: src/dialogs/confdialog.cxx:11416 msgid "N3FJP Server IP Address" msgstr "Adreça IP del servidor N3FJP" #: src/dialogs/confdialog.cxx:11430 src/dialogs/confdialog.cxx:15264 #: src/dialogs/confdialog.cxx:15288 src/dialogs/confdialog.cxx:15528 #: src/dialogs/confdialog.cxx:17016 src/dialogs/confdialog.cxx:17068 #: src/dialogs/confdialog.cxx:17115 src/dialogs/confdialog.cxx:17148 #: src/dialogs/confdialog.cxx:17368 msgid "Port" msgstr "Port" #: src/dialogs/confdialog.cxx:11431 msgid "N3FJP Server IP Port" msgstr "Port IP del servidor N3FJP" #: src/dialogs/confdialog.cxx:11446 src/dialogs/confdialog.cxx:16948 #: src/dialogs/confdialog.cxx:17033 src/dialogs/confdialog.cxx:17047 #: src/dialogs/confdialog.cxx:17094 src/dialogs/confdialog.cxx:17160 #: src/dialogs/confdialog.cxx:17349 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" "Retorna l'adreça IP i el port\n" "número al valor predeterminat." #: src/dialogs/confdialog.cxx:11449 msgid "Enable Data Stream" msgstr "Activa el flux de dades" #: src/dialogs/confdialog.cxx:11454 src/dialogs/confdialog.cxx:12842 #: src/dialogs/confdialog.cxx:13091 src/dialogs/confdialog.cxx:13390 #: src/dialogs/confdialog.cxx:15159 src/dialogs/confdialog.cxx:15543 msgid "Connect" msgstr "Connectar" #: src/dialogs/confdialog.cxx:11459 src/dialogs/confdialog.cxx:16450 msgid "Connected" msgstr "Connectat" #: src/dialogs/confdialog.cxx:11465 msgid "Center DXspot freq at sweet spot" msgstr "Centre de freqüència de DXspot al punt òptim" #: src/dialogs/confdialog.cxx:11466 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "Punts N3FJP DX centrats en el punt òptim del mode" #: src/dialogs/confdialog.cxx:11471 msgid "Report actual modem RF frequency" msgstr "Informa de la freqüència real del mòdem de RF" #: src/dialogs/confdialog.cxx:11472 msgid "Suppressed carrier +/- AF injection frequency" msgstr "Portadora suprimida +/- freqüència d'injecció AF" #: src/dialogs/confdialog.cxx:11477 msgid "PTT via and " msgstr "PTT via i " #: src/dialogs/confdialog.cxx:11487 src/dialogs/confdialog.cxx:11614 #: src/dialogs/confdialog.cxx:11616 msgid "Logging/eQSL" msgstr "Registre - eQSL" #: src/dialogs/confdialog.cxx:11491 msgid "www url" msgstr "www url" #: src/dialogs/confdialog.cxx:11492 src/dialogs/confdialog.cxx:11507 #: src/dialogs/confdialog.cxx:11542 msgid "Your login name" msgstr "El teu nom d'inici de sessió" #: src/dialogs/confdialog.cxx:11506 msgid "User ID" msgstr "Nom d'usuari" #: src/dialogs/confdialog.cxx:11522 msgid "Your login password" msgstr "La teva contrasenya d'inici de sessió" #: src/dialogs/confdialog.cxx:11541 msgid "QTH Nickname" msgstr "Àlies QTH" #: src/dialogs/confdialog.cxx:11556 msgid "Verify" msgstr "Verificar" #: src/dialogs/confdialog.cxx:11557 msgid "Verify database with eQSL download file" msgstr "Verifica la base de dades amb el fitxer de descàrrega de eQSL" #: src/dialogs/confdialog.cxx:11560 msgid "Options" msgstr "Opcions" #: src/dialogs/confdialog.cxx:11563 msgid "send when logged (log button, , )" msgstr "enviar quan estigui registrat (botó de registre,, )" #: src/dialogs/confdialog.cxx:11564 msgid "automatic data upload" msgstr "càrrega automàtica de dades" #: src/dialogs/confdialog.cxx:11569 msgid "Use date/time off for log entry" msgstr "Utilitza la data/hora final per a l'entrada del registre" #: src/dialogs/confdialog.cxx:11570 msgid "default uses date/time on" msgstr "per defecte utilitza data/hora activada" #: src/dialogs/confdialog.cxx:11575 src/dialogs/confdialog.cxx:11690 msgid "Show delivery message" msgstr "Mostra el missatge de lliurament" #: src/dialogs/confdialog.cxx:11576 src/dialogs/confdialog.cxx:11691 msgid "Display timed delivery message if enabled" msgstr "Mostra el missatge de lliurament programat si està activat" #: src/dialogs/confdialog.cxx:11581 msgid "Default message" msgstr "Missatge per defecte" #: src/dialogs/confdialog.cxx:11582 msgid "default text to send with etc" msgstr "text predeterminat per enviar amb , etc" #: src/dialogs/confdialog.cxx:11596 msgid "Text Tags (tags use {} delimiters)" msgstr "Etiquetes de text (les etiquetes utilitzen delimitadors {} )" #: src/dialogs/confdialog.cxx:11599 msgid " {CALL} other ops call sign" msgstr " {CALL} indicatiu d'altres operacions" #: src/dialogs/confdialog.cxx:11602 msgid " {MODE} full mode / submode" msgstr " {MODE} mode complet / submode" #: src/dialogs/confdialog.cxx:11605 msgid "{NAME} other ops name" msgstr "{NAME} nom d'altres operadors" #: src/dialogs/confdialog.cxx:11608 msgid "These tags can also be used in " msgstr "Aquestes etiquetes també es poden utilitzar a " #: src/dialogs/confdialog.cxx:11619 src/dialogs/confdialog.cxx:11751 #: src/dialogs/confdialog.cxx:11753 msgid "Logging/LoTW" msgstr "Registre - LoTW" #: src/dialogs/confdialog.cxx:11623 msgid "tqsl:" msgstr "tqsl:" #: src/dialogs/confdialog.cxx:11624 msgid "Enter full path-filename for tqsl executable" msgstr "Introdueix el nom del fitxer de ruta complet per a l'executable tqsl" #: src/dialogs/confdialog.cxx:11638 msgid "Your tqsl login password" msgstr "La teva contrasenya d'inici de sessió a tqsl" #: src/dialogs/confdialog.cxx:11653 msgid "Password required" msgstr "Contrasenya" #: src/dialogs/confdialog.cxx:11654 msgid "Submit password with each upload" msgstr "Envia la contrasenya amb cada càrrega" #: src/dialogs/confdialog.cxx:11659 msgid "Location" msgstr "Locator" #: src/dialogs/confdialog.cxx:11660 msgid "tqsl station location" msgstr "locator de l'estació tqsl" #: src/dialogs/confdialog.cxx:11674 src/dialogs/confdialog.cxx:16002 #: src/dialogs/confdialog.cxx:16020 src/dialogs/confdialog.cxx:16038 #: src/dialogs/confdialog.cxx:16056 src/dialogs/confdialog.cxx:16074 #: src/dialogs/confdialog.cxx:16092 src/dialogs/confdialog.cxx:16110 msgid "Locate" msgstr "Buscar" #: src/dialogs/confdialog.cxx:11675 msgid "Locate tqsl executable" msgstr "Buscar el fitxer tqsl executable" #: src/dialogs/confdialog.cxx:11678 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "Mode silenciós [-q], no obris el diàleg tqsl" #: src/dialogs/confdialog.cxx:11679 msgid "Operate tqsl in batch mode (no dialog)" msgstr "Tqsl funciona en mode per lots (sense diàleg)" #: src/dialogs/confdialog.cxx:11684 msgid "Send QSO data to LoTW when logged" msgstr "Envia dades de QSO a LoTW quan s'iniciï la sessió" #: src/dialogs/confdialog.cxx:11685 msgid "Submit each QSO as logged" msgstr "Enviea cada QSO tal com s'ha registrat" #: src/dialogs/confdialog.cxx:11696 msgid "Export" msgstr "Exportar" #: src/dialogs/confdialog.cxx:11697 msgid "Export records for LoTW upload" msgstr "Exporta els registres per a la càrrega de LoTW" #: src/dialogs/confdialog.cxx:11700 src/logbook/lgbook.cxx:770 #: src/logbook/lgbook.cxx:1403 src/logbook/lgbook.cxx:1456 msgid "Check" msgstr "Revisa" #: src/dialogs/confdialog.cxx:11701 msgid "Review lotw.adif file before sending with tqsl" msgstr "Revisa el fitxer lotw.adif abans d'enviar-lo a tqsl" #: src/dialogs/confdialog.cxx:11705 msgid "Send lotw.adif via tqsl" msgstr "Envia lotw.adif mitjançant tqsl" #: src/dialogs/confdialog.cxx:11708 msgid "Export logbook records for LoTW upload" msgstr "Exporta els registres del llibre de guàrdia per a la càrrega de LoTW" #: src/dialogs/confdialog.cxx:11711 msgid "Review / edit the exported LoTW upload adif file" msgstr "Revisa/edita el fitxer adif de càrrega de LoTW exportat" #: src/dialogs/confdialog.cxx:11714 msgid "Submit the upload adif file to LoTW" msgstr "Envia el fitxer adif de càrrega a LoTW" #: src/dialogs/confdialog.cxx:11717 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" "Has de tenir tqsl instal·lat i la teva ubicació registrada perquè les " "actualitzacions de LoTW funcionin !" #: src/dialogs/confdialog.cxx:11725 msgid "Use this tqsl station location" msgstr "Utilitza aquesta ubicació de estació a tqsl" #: src/dialogs/confdialog.cxx:11728 msgid "Match" msgstr "Partit" #: src/dialogs/confdialog.cxx:11729 src/dialogs/confdialog.cxx:11736 msgid "Verify database with LoTW download file" msgstr "Verifica la base de dades amb el fitxer de descàrrega LoTW" #: src/dialogs/confdialog.cxx:11732 msgid "Match logbook records with LoTW download file" msgstr "Relaciona els registres del llibre de guàrdia amb el fitxer de LoTW" #: src/dialogs/confdialog.cxx:11735 msgid "View Unmatched" msgstr "Veure únics" #: src/dialogs/confdialog.cxx:11740 msgid "Timeout" msgstr "Límit de temps" #: src/dialogs/confdialog.cxx:11741 msgid "Wait NN seconds for LoTW response" msgstr "Espera NN segons per a la resposta de LoTW" #: src/dialogs/confdialog.cxx:11756 src/dialogs/confdialog.cxx:11807 #: src/dialogs/confdialog.cxx:11809 #, fuzzy #| msgid "Logging/Call Lookup" msgid "Logging/Cloudlog" msgstr "Registre - busca d'indicatius" #: src/dialogs/confdialog.cxx:11760 msgid "This allows for logging of QSOs to a Cloudlog instance." msgstr "" #: src/dialogs/confdialog.cxx:11764 msgid "Enable Cloudlog API logging" msgstr "" #: src/dialogs/confdialog.cxx:11765 msgid "This enables logging of QSOs to Cloudlog via API" msgstr "" #: src/dialogs/confdialog.cxx:11770 msgid "API URL:" msgstr "" #: src/dialogs/confdialog.cxx:11771 msgid "Enter the URL of your Cloudlog API" msgstr "" #: src/dialogs/confdialog.cxx:11784 msgid "API Key:" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "Enter the API key for your Cloudlog instance" msgstr "" #: src/dialogs/confdialog.cxx:11798 #, fuzzy #| msgid "Station QTH:" msgid "Station ID:" msgstr "QTH :" #: src/dialogs/confdialog.cxx:11803 src/dialogs/confdialog.cxx:16485 #: src/dialogs/confdialog.cxx:17555 src/dialogs/confdialog.cxx:17650 #: src/dialogs/confdialog.cxx:18174 src/dialogs/confdialog.cxx:18269 msgid "Initialize" msgstr "Inicialitzar" #: src/dialogs/confdialog.cxx:11804 msgid "Test API Key" msgstr "" #: src/dialogs/confdialog.cxx:11813 src/dialogs/confdialog.cxx:11893 #: src/dialogs/confdialog.cxx:11895 msgid "Logging/QSO logging" msgstr "Registre - QSO registrats" #: src/dialogs/confdialog.cxx:11817 msgid "Prompt to save log on exit" msgstr "Sol·licita per desar el registre en sortir" #: src/dialogs/confdialog.cxx:11818 src/dialogs/confdialog.cxx:11887 #: src/dialogs/confdialog.cxx:19222 msgid "Bug me about saving log entries" msgstr "Desar les entrades del registre" #: src/dialogs/confdialog.cxx:11823 msgid "Clear on save" msgstr "Esborra en desar" #: src/dialogs/confdialog.cxx:11824 msgid "Clear log entries after saving or using macro " msgstr "" "Esborra les entrades de registre després de desar o utilitzar la macro " #: src/dialogs/confdialog.cxx:11829 msgid "Convert callsign to upper case" msgstr "Converteix l'indicatiu en majúscules" #: src/dialogs/confdialog.cxx:11830 msgid "Force callsign field to UPPERCASE" msgstr "Força el camp de l'indicatiu a majúscules" #: src/dialogs/confdialog.cxx:11835 msgid "Auto-fill Country and Azimuth" msgstr "Emplenament automàtic de país i azimut" #: src/dialogs/confdialog.cxx:11836 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Omplir País/Azimut amb la informació de cty.dat" #: src/dialogs/confdialog.cxx:11841 msgid "Sort by Date/Time OFF" msgstr "Ordena per data/hora de final" #: src/dialogs/confdialog.cxx:11842 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "Ordena per data/hora final - afecta tots els informes ADIF/Cabrillo" #: src/dialogs/confdialog.cxx:11847 msgid "Date time ON == OFF" msgstr "Data hora INICI == FINAL" #: src/dialogs/confdialog.cxx:11848 msgid "Force date/time ON == date/time OFF" msgstr "Força data/hora INICI == data/hora FINAL" #: src/dialogs/confdialog.cxx:11853 msgid "Default RST in to 599/59" msgstr "RST predeterminat a 599/59" #: src/dialogs/confdialog.cxx:11854 msgid "Clear log controls sets RST in to 599/59" msgstr "Esborra els controls de registre d'entrada i estableix RST en 599/59" #: src/dialogs/confdialog.cxx:11859 msgid "Default RST out to 599/59" msgstr "El RST predeterminat és 599/59" #: src/dialogs/confdialog.cxx:11860 msgid "Clear log controls sets RST out to 599/59" msgstr "Esborra els controls de registre de sortida i estableix RST a 599/59" #: src/dialogs/confdialog.cxx:11865 msgid "Transmit Power" msgstr "Transmetre la Potència de TX" #: src/dialogs/confdialog.cxx:11866 msgid "Tx power used for logbook entries" msgstr "" "Potència de transmissió utilitzada per a les entrades del llibre de guàrdia" #: src/dialogs/confdialog.cxx:11880 msgid "Display logbook read datum at start" msgstr "Mostra la dada de lectura del llibre de guàrdia a l'inici" #: src/dialogs/confdialog.cxx:11881 src/dialogs/confdialog.cxx:19372 msgid "The filename is written to the RX text area" msgstr "El nom del fitxer s'escriu a l'àrea de text de recepció" #: src/dialogs/confdialog.cxx:11886 msgid "Log power meter " msgstr "Incloure al registre la potència " #: src/dialogs/confdialog.cxx:11899 src/dialogs/confdialog.cxx:12167 #: src/dialogs/confdialog.cxx:12169 msgid "Modem/CW/General" msgstr "Mòdem - CW / General" #: src/dialogs/confdialog.cxx:11906 msgid "SOM decoding" msgstr "Descodificació MAO" #: src/dialogs/confdialog.cxx:11907 msgid "Self Organizing Mapping" msgstr "Cartografia autoorganitzada" #: src/dialogs/confdialog.cxx:11913 msgid "WPM Tracking" msgstr "Seguiment WPM" #: src/dialogs/confdialog.cxx:11914 msgid "Automatic Rx speed tracking" msgstr "Seguiment automàtic de la velocitat de recepció" #: src/dialogs/confdialog.cxx:11920 msgid "Filter bandwidth" msgstr "Ample de banda del filtre" #: src/dialogs/confdialog.cxx:11921 msgid "CW dsp filter bandwidth" msgstr "Ample de banda del filtre DSP de CW" #: src/dialogs/confdialog.cxx:11941 msgid "Matched Filt'" msgstr "Filtre coincident" #: src/dialogs/confdialog.cxx:11942 msgid "Matched Filter bandwidth" msgstr "Ample de banda del filtre coincident" #: src/dialogs/confdialog.cxx:11948 msgid "Rx WPM" msgstr "Velocitat per Minut (WPM) en recepció" #: src/dialogs/confdialog.cxx:11954 msgid "Tracked CW speed in WPM" msgstr "Velocitat del CW rastrejada en WPM" #: src/dialogs/confdialog.cxx:11959 msgid "Lower" msgstr "Inferior" #: src/dialogs/confdialog.cxx:11960 msgid "Detector low threshold" msgstr "Detector llindar baix" #: src/dialogs/confdialog.cxx:11980 msgid "Upper" msgstr "Superior" #: src/dialogs/confdialog.cxx:11981 msgid "Detector high threshold" msgstr "Detector llindar alt" #: src/dialogs/confdialog.cxx:12001 msgid "Range" msgstr "Rang" #: src/dialogs/confdialog.cxx:12002 msgid "Range +/- wpm" msgstr "Rang +/- wpm" #: src/dialogs/confdialog.cxx:12021 msgid "Signal tracking" msgstr "Seguiment del senyal" #: src/dialogs/confdialog.cxx:12024 msgid "Attack" msgstr "Atacar" #: src/dialogs/confdialog.cxx:12030 msgid "Decay" msgstr "Caiguda" #: src/dialogs/confdialog.cxx:12046 msgid "char WPM" msgstr "caràcters WPM" #: src/dialogs/confdialog.cxx:12047 src/dialogs/confdialog.cxx:12112 #: src/dialogs/confdialog.cxx:12139 msgid "My transmit CW WPM" msgstr "La meva transmissió CW en Velocitat per Minut WPM" #: src/dialogs/confdialog.cxx:12068 msgid "The default CW speed" msgstr "La velocitat a CW predeterminada" #: src/dialogs/confdialog.cxx:12087 src/dialogs/confdialog.cxx:19811 msgid "Lower limit" msgstr "Límit inferior" #: src/dialogs/confdialog.cxx:12088 msgid "No slower than this" msgstr "No més lent que això" #: src/dialogs/confdialog.cxx:12099 src/dialogs/confdialog.cxx:19856 msgid "Upper limit" msgstr "Límit superior" #: src/dialogs/confdialog.cxx:12100 msgid "No faster than this" msgstr "No més ràpid que això" #: src/dialogs/confdialog.cxx:12111 msgid "text WPM" msgstr "text WPM" #: src/dialogs/confdialog.cxx:12132 msgid "Use Farnsworth timing" msgstr "Utilitza el temps de Farnsworth" #: src/dialogs/confdialog.cxx:12133 src/dialogs/confdialog.cxx:12160 msgid "text WPM <= char WPM" msgstr "text WPM <= caràcters WPM" #: src/dialogs/confdialog.cxx:12138 #, fuzzy #| msgid "Rng WPM" msgid "Spacing WPM" msgstr "Rang (WPM)" #: src/dialogs/confdialog.cxx:12159 #, fuzzy #| msgid "Use Farnsworth timing" msgid "Use Wordsworth timing" msgstr "Utilitza el temps de Farnsworth" #: src/dialogs/confdialog.cxx:12172 src/dialogs/confdialog.cxx:12370 #: src/dialogs/confdialog.cxx:12372 msgid "Modem/CW/Timing and QSK" msgstr "Mòdem - CW / Temporització i QSK" #: src/dialogs/confdialog.cxx:12176 msgid "Timing" msgstr "Temporització" #: src/dialogs/confdialog.cxx:12179 src/dialogs/confdialog.cxx:13130 msgid "Dash/Dot" msgstr "Guió/punt" #: src/dialogs/confdialog.cxx:12180 src/dialogs/confdialog.cxx:13131 msgid "Dash to dot ratio" msgstr "Relació punt a ratlla" #: src/dialogs/confdialog.cxx:12198 src/dialogs/confdialog.cxx:12321 msgid "Edge timing" msgstr "Temporització de la vora" #: src/dialogs/confdialog.cxx:12199 src/dialogs/confdialog.cxx:12322 msgid "Leading and Trailing edge risetimes (msec)" msgstr "Temps de pujada del front davanter i posterior (mseg)" #: src/dialogs/confdialog.cxx:12217 msgid "Edge shape" msgstr "Forma de vora" #: src/dialogs/confdialog.cxx:12218 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" "Hanning/Blackman: utilitza el temps de vora\n" "BPF: utilitza l'ample de banda BPF" #: src/dialogs/confdialog.cxx:12236 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12239 msgid "QSK on right audio channel" msgstr "QSK al canal dret d'àudio" #: src/dialogs/confdialog.cxx:12240 msgid "Generate square wave signal on right channel" msgstr "Genera senyal d'ona quadrada al canal dret" #: src/dialogs/confdialog.cxx:12245 msgid "QSK frequency" msgstr "Freqüència amb soroll" #: src/dialogs/confdialog.cxx:12246 msgid "Fundamental frequency of QSK square wave signal" msgstr "Freqüència fonamental del senyal d'ona quadrada QSK" #: src/dialogs/confdialog.cxx:12265 msgid "Pre-keydown timing (ms)" msgstr "Temporització prèvia al teclat en (ms)" #: src/dialogs/confdialog.cxx:12266 msgid "Msec pre-keydown" msgstr "Tecla prèvia de msec" #: src/dialogs/confdialog.cxx:12283 msgid "Post-keydown timing (ms)" msgstr "Temps posterior a la tecla (ms)" #: src/dialogs/confdialog.cxx:12284 msgid "Msec post-keydown" msgstr "Mili segons posterior a la tecla" #: src/dialogs/confdialog.cxx:12301 msgid "QSK amplitude" msgstr "Amplitud QSK" #: src/dialogs/confdialog.cxx:12302 msgid "Amplitude of right channel QSK signal" msgstr "Amplitud del senyal QSK del canal dret" #: src/dialogs/confdialog.cxx:12342 msgid "Send Test character" msgstr "Enviar caràcter de prova" #: src/dialogs/confdialog.cxx:12345 msgid "Test char" msgstr "Caràcter prova" #: src/dialogs/confdialog.cxx:12346 msgid "Test character for QSK adjustment" msgstr "Caràcter de prova per a l'ajust de QSK" #: src/dialogs/confdialog.cxx:12362 msgid "Send continuously" msgstr "Enviar contínuament" #: src/dialogs/confdialog.cxx:12363 msgid "Send a continuous stream of test characters" msgstr "Envia un flux continu de caràcters de prova" #: src/dialogs/confdialog.cxx:12375 src/dialogs/confdialog.cxx:12580 #: src/dialogs/confdialog.cxx:12582 msgid "Modem/CW/Prosigns" msgstr "Mòdem - CW / Predefinits" #: src/dialogs/confdialog.cxx:12379 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" "Utilitza'ls per a WinKeyer\n" "i nanoCW" #: src/dialogs/confdialog.cxx:12382 msgid "\" RR" msgstr "\" RR" #: src/dialogs/confdialog.cxx:12383 msgid ".-..-." msgstr ".-..-." #: src/dialogs/confdialog.cxx:12385 msgid "$ SX" msgstr "$ SX" #: src/dialogs/confdialog.cxx:12386 msgid "...-..-" msgstr "...-..-" #: src/dialogs/confdialog.cxx:12388 msgid "' WG" msgstr "' WG" #: src/dialogs/confdialog.cxx:12389 msgid ".----." msgstr ".----." #: src/dialogs/confdialog.cxx:12391 msgid "( KN" msgstr "( KN" #: src/dialogs/confdialog.cxx:12392 msgid "-.--." msgstr "-.--." #: src/dialogs/confdialog.cxx:12394 msgid ") KK" msgstr ") KK" #: src/dialogs/confdialog.cxx:12395 msgid "-.--.-" msgstr "-.--.-" #: src/dialogs/confdialog.cxx:12397 msgid "+ AR" msgstr "+ AR" #: src/dialogs/confdialog.cxx:12398 src/dialogs/confdialog.cxx:12401 msgid ".-.-." msgstr ".-.-." #: src/dialogs/confdialog.cxx:12400 msgid "< AR" msgstr "< AR" #: src/dialogs/confdialog.cxx:12403 msgid "> SK" msgstr "> SK" #: src/dialogs/confdialog.cxx:12404 msgid "...-.-" msgstr "...-.-" #: src/dialogs/confdialog.cxx:12406 msgid "= BT" msgstr "= BT" #: src/dialogs/confdialog.cxx:12407 msgid "-...-" msgstr "-...-" #: src/dialogs/confdialog.cxx:12409 msgid "- DU" msgstr "- DU" #: src/dialogs/confdialog.cxx:12410 msgid "-....-" msgstr "-....-" #: src/dialogs/confdialog.cxx:12412 msgid "@@ AC" msgstr "@@ AC" #: src/dialogs/confdialog.cxx:12413 msgid ".--.-." msgstr ".--.-." #: src/dialogs/confdialog.cxx:12417 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12434 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12451 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12468 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12484 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12501 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12535 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12552 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12569 msgid "Use '(' paren not KN" msgstr "Utilitza '(' parèntesis en comptes de KN" #: src/dialogs/confdialog.cxx:12574 msgid "Display decoded as assigned key" msgstr "Visualització descodificada com a clau assignada" #: src/dialogs/confdialog.cxx:12575 msgid "Display the decoded prosign in the RX text using the short cut key" msgstr "" "Mostra el prosigne descodificat al text de recepció usant la tecla d'accés " "directe" #: src/dialogs/confdialog.cxx:12585 src/dialogs/confdialog.cxx:12683 #: src/dialogs/confdialog.cxx:12685 msgid "Modem/CW/Extended Chars." msgstr "Mòdem - CW / Caràcters estesos." #: src/dialogs/confdialog.cxx:12589 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" "Marca per habilitar la codificació i descodificació de caràcters\n" "Selecciona un caràcter per cada grup" #: src/dialogs/confdialog.cxx:12594 msgid "A aelig" msgstr "Un aelig" #: src/dialogs/confdialog.cxx:12595 src/dialogs/confdialog.cxx:12601 #: src/dialogs/confdialog.cxx:12609 src/dialogs/confdialog.cxx:12617 #: src/dialogs/confdialog.cxx:12623 src/dialogs/confdialog.cxx:12629 #: src/dialogs/confdialog.cxx:12637 src/dialogs/confdialog.cxx:12643 #: src/dialogs/confdialog.cxx:12649 src/dialogs/confdialog.cxx:12655 #: src/dialogs/confdialog.cxx:12663 src/dialogs/confdialog.cxx:12669 #: src/dialogs/confdialog.cxx:12933 msgid "Swap left/right keyer contacts" msgstr "Canvia els contactes del teclat esquerre/dret" #: src/dialogs/confdialog.cxx:12600 msgid " A umlaut" msgstr " Una dièresis" #: src/dialogs/confdialog.cxx:12608 msgid " A ring" msgstr " Un anell" #: src/dialogs/confdialog.cxx:12616 msgid " O acute" msgstr " O agut" #: src/dialogs/confdialog.cxx:12622 msgid " O slash" msgstr " Oh barra" #: src/dialogs/confdialog.cxx:12628 msgid " O umlaut" msgstr " O dièresis" #: src/dialogs/confdialog.cxx:12636 msgid " C cedilla" msgstr " C cedilla" #: src/dialogs/confdialog.cxx:12642 msgid " E grave" msgstr " E tomba" #: src/dialogs/confdialog.cxx:12648 msgid " E acute" msgstr " E agut" #: src/dialogs/confdialog.cxx:12654 msgid " N tilde" msgstr " N til" #: src/dialogs/confdialog.cxx:12662 msgid " U umlaut" msgstr " U dièresis" #: src/dialogs/confdialog.cxx:12668 msgid " U circ" msgstr " U circ" #: src/dialogs/confdialog.cxx:12676 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" "Visita https://ca.wikipedia.org/wiki/Codi_Morse\n" "per obtenir més informació sobre els caràcters Morse." #: src/dialogs/confdialog.cxx:12688 msgid "Punctuation/Noise Processing" msgstr "Puntuació - Processament del soroll" #: src/dialogs/confdialog.cxx:12692 msgid "Check to enable character encode/decode" msgstr "Marca per habilitar la codificació i descodificació de caràcters" #: src/dialogs/confdialog.cxx:12695 msgid " backslash \\ \".-..-.\"" msgstr " barra invertida \\ \".-..-.\"" #: src/dialogs/confdialog.cxx:12696 src/dialogs/confdialog.cxx:12704 #: src/dialogs/confdialog.cxx:12712 src/dialogs/confdialog.cxx:12720 #: src/dialogs/confdialog.cxx:12728 src/dialogs/confdialog.cxx:12736 #: src/dialogs/confdialog.cxx:12744 src/dialogs/confdialog.cxx:12752 #: src/dialogs/confdialog.cxx:12760 src/dialogs/confdialog.cxx:12768 #: src/dialogs/confdialog.cxx:12776 msgid "disable for no printed character" msgstr "desactivar per no imprimir cap caràcter" #: src/dialogs/confdialog.cxx:12703 #, fuzzy #| msgid " single quote ' \".----.\"" msgid " apostrophe ' \".----.\"" msgstr " cita única ' \".----.\"" #: src/dialogs/confdialog.cxx:12711 #, fuzzy #| msgid " colon : \"---...\"" msgid " quote \" \".-..-.\"" msgstr " còlon : \"---...\"" #: src/dialogs/confdialog.cxx:12719 msgid " dollar sign $ \"...-..-\"" msgstr " Signe del dolar $ \"...-..-\"" #: src/dialogs/confdialog.cxx:12727 msgid " open_paren ( \"-.--.\"" msgstr " obrir parèntesis ( \"-.--.\"" #: src/dialogs/confdialog.cxx:12735 msgid " close paren ) \"-.--.-\"" msgstr " tanca parèntesis ) \"-.--.-\"" #: src/dialogs/confdialog.cxx:12743 msgid " colon : \"---...\"" msgstr " còlon : \"---...\"" #: src/dialogs/confdialog.cxx:12751 msgid " semi colon ; \"-.-.-.\"" msgstr " semi còlon ; \"-.-.-.\"" #: src/dialogs/confdialog.cxx:12759 msgid " underscore _ \"..--.-\"" msgstr " subratllat _ \"..--.-\"" #: src/dialogs/confdialog.cxx:12767 msgid " at symbol @@ \".--.-.\"" msgstr " al símbol @@ \".--.-.\"" #: src/dialogs/confdialog.cxx:12775 msgid " exclamation ! \"-.-.--\"" msgstr " exclamació ! \"-.-.--\"" #: src/dialogs/confdialog.cxx:12785 msgid "Unknown character decode (noise)" msgstr "Descodificació de caràcters desconeguts (soroll)" #: src/dialogs/confdialog.cxx:12788 msgid " Do not display unknown MORSE symbol" msgstr " No mostris el símbol MORSE desconegut" #: src/dialogs/confdialog.cxx:12789 src/dialogs/confdialog.cxx:12796 msgid "disable '*'or no printed character" msgstr "desactiva '*'o cap caràcter imprès" #: src/dialogs/confdialog.cxx:12795 msgid " Display '*' character for unknown MORSE symbol" msgstr " Mostra el caràcter '*' per al símbol MORSE desconegut" #: src/dialogs/confdialog.cxx:12802 msgid " Display '_' character for unknown MORSE symbol" msgstr " Mostra el caràcter '_' per al símbol MORSE desconegut" #: src/dialogs/confdialog.cxx:12803 msgid "disable '_' for no printed character" msgstr "desactiva '_' per no imprimir cap caràcter" #: src/dialogs/confdialog.cxx:12809 msgid " Display ' ' character for unknown MORSE symbol" msgstr " Mostra el caràcter ' ' per al símbol MORSE desconegut" #: src/dialogs/confdialog.cxx:12810 msgid "disable ' ' for no printed character" msgstr "desactiva \" \" per no imprimir cap caràcter" #: src/dialogs/confdialog.cxx:12818 src/dialogs/confdialog.cxx:12820 msgid "Modem/CW/Punctuation-Noise" msgstr "Mòdem - CW / Puntuació-Soroll" #: src/dialogs/confdialog.cxx:12823 src/dialogs/confdialog.cxx:13067 #: src/dialogs/confdialog.cxx:13069 msgid "Modem/CW/WinKeyer" msgstr "Mòdem - CW / WinKeyer" #: src/dialogs/confdialog.cxx:12827 src/dialogs/confdialog.cxx:13076 #: src/dialogs/confdialog.cxx:15144 msgid "Ser. Port" msgstr "Port sèrie" #: src/dialogs/confdialog.cxx:12828 src/dialogs/confdialog.cxx:15529 msgid "Xcvr serial port" msgstr "Port sèrie Xcvr" #: src/dialogs/confdialog.cxx:12843 src/dialogs/confdialog.cxx:15544 msgid "Connect / Disconnect from WinKeyer" msgstr "Connecta/Desconnecta de WinKeyer" #: src/dialogs/confdialog.cxx:12847 msgid "Wait" msgstr "Espera" #: src/dialogs/confdialog.cxx:12851 msgid "Bk" msgstr "Bk" #: src/dialogs/confdialog.cxx:12855 msgid "Busy" msgstr "Ocupat" #: src/dialogs/confdialog.cxx:12859 msgid "Bfr" msgstr "Bfr" #: src/dialogs/confdialog.cxx:12863 msgid "Key" msgstr "Clau" #: src/dialogs/confdialog.cxx:12867 msgid "Keyer Mode" msgstr "Mode de teclat" #: src/dialogs/confdialog.cxx:12880 msgid "Hang" msgstr "Penja" #: src/dialogs/confdialog.cxx:12893 src/dialogs/confdialog.cxx:15617 msgid "Sidetone" msgstr "To lateral" #: src/dialogs/confdialog.cxx:12906 msgid "Output PIns" msgstr "Pins de sortida" #: src/dialogs/confdialog.cxx:12919 msgid "Use Pot" msgstr "Utilitza Pot" #: src/dialogs/confdialog.cxx:12920 msgid "Winkeyer pot controls WPM" msgstr "Winkeyer pot controla WPM" #: src/dialogs/confdialog.cxx:12927 msgid "WPM setting" msgstr "Configuració WPM" #: src/dialogs/confdialog.cxx:12929 src/dialogs/confdialog.cxx:12958 msgid "ModeReg" msgstr "ModeReg" #: src/dialogs/confdialog.cxx:12932 msgid "Swap" msgstr "Canviar" #: src/dialogs/confdialog.cxx:12937 msgid "Auto Space" msgstr "Espai automàtic" #: src/dialogs/confdialog.cxx:12938 msgid "Enable paddle auto spacing of characters" msgstr "Activa l'espaiat automàtic dels caràcters en el manipulador de pales" #: src/dialogs/confdialog.cxx:12942 msgid "CT space" msgstr "Espai CT" #: src/dialogs/confdialog.cxx:12943 msgid "Enable contest character spacing" msgstr "Activa l'espai entre caràcters del concurs" #: src/dialogs/confdialog.cxx:12947 msgid "Paddle Dog" msgstr "Manipulador de pales" #: src/dialogs/confdialog.cxx:12951 msgid "Cut 0/9" msgstr "Tallar 0/9" #: src/dialogs/confdialog.cxx:12952 msgid "Use T/N for 0/9" msgstr "Utilitza T/N per a 0/9" #: src/dialogs/confdialog.cxx:12961 msgid "Paddle echo" msgstr "Fes ressò manipulador pales" #: src/dialogs/confdialog.cxx:12962 msgid "Echo paddle chars to Rx Panel" msgstr "Fes ressò de caràcters del manipulador de pales al panell de RX" #: src/dialogs/confdialog.cxx:12966 msgid "Serial echo" msgstr "Fes en sèrie" #: src/dialogs/confdialog.cxx:12971 msgid "Tone Keyer" msgstr "Teclador de to" #: src/dialogs/confdialog.cxx:12972 msgid "Enable Winkeyer tone keying" msgstr "Activa la tecla de to Winkeyer" #: src/dialogs/confdialog.cxx:12976 msgid "Tone ON" msgstr "To encès" #: src/dialogs/confdialog.cxx:12977 msgid "Enable Winkeyer audio tone" msgstr "Activa el to d'àudio Winkeyer" #: src/dialogs/confdialog.cxx:12981 msgid "PTT ON" msgstr "PTT encès" #: src/dialogs/confdialog.cxx:12982 msgid "Enable Winkeyer PTT output" msgstr "Habilita la sortida PTT del Winkeyer" #: src/dialogs/confdialog.cxx:12988 msgid "WPM Settings" msgstr "Configuració WPM" #: src/dialogs/confdialog.cxx:12991 src/dialogs/confdialog.cxx:13211 msgid "Min WPM" msgstr "Min WPM" #: src/dialogs/confdialog.cxx:12992 src/dialogs/confdialog.cxx:13212 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" "Configuració mínima de WPM\n" "per defecte = 10" #: src/dialogs/confdialog.cxx:13000 src/dialogs/confdialog.cxx:13221 msgid "Rng WPM" msgstr "Rang (WPM)" #: src/dialogs/confdialog.cxx:13001 msgid "" "Range WPM setting\n" "default = 25" msgstr "" "Configuració del Rang (WPM)\n" "per defecte = 25" #: src/dialogs/confdialog.cxx:13005 msgid "Farsnworth" msgstr "Farsnworth" #: src/dialogs/confdialog.cxx:13006 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" "Tecla Farnsworth (0 = cap)\n" "per defecte = 0" #: src/dialogs/confdialog.cxx:13010 msgid "Cmd WPM" msgstr "Cmd WPM" #: src/dialogs/confdialog.cxx:13011 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" "Velocitat WPM per a les cadenes d'ordres Winkeyer\n" "per defecte = 18" #: src/dialogs/confdialog.cxx:13017 msgid "Timing/Settings" msgstr "Temporització / Configuració" #: src/dialogs/confdialog.cxx:13020 msgid "Ratio" msgstr "Relació" #: src/dialogs/confdialog.cxx:13021 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" "Relació de codificació\n" "per defecte = 3.0" #: src/dialogs/confdialog.cxx:13025 msgid "Comp" msgstr "Compensació" #: src/dialogs/confdialog.cxx:13026 msgid "" "Compensation in msec\n" "default = 0" msgstr "" "Compensació en ms\n" "per defecte = 0" #: src/dialogs/confdialog.cxx:13030 msgid "1st Ext" msgstr "1r Extra" #: src/dialogs/confdialog.cxx:13031 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" "Durada addicional al primer dit/punt en ms\n" "per defecte = 0" #: src/dialogs/confdialog.cxx:13035 msgid "Sample" msgstr "Mostra" #: src/dialogs/confdialog.cxx:13036 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" "Mostra del manipulador de pales (mira el manual de Winkeyer)\n" "per defecte = 50" #: src/dialogs/confdialog.cxx:13040 msgid "Weight" msgstr "Pes" #: src/dialogs/confdialog.cxx:13041 msgid "" "Keying weight\n" "default = 50" msgstr "" "Pes de la clau\n" "per defecte = 50" #: src/dialogs/confdialog.cxx:13045 msgid "Leadin" msgstr "Fer entrar a" #: src/dialogs/confdialog.cxx:13046 msgid "" "Leadin in msec\n" "default = 0" msgstr "" "Fer entrar a en ms\n" "per defecte = 0" #: src/dialogs/confdialog.cxx:13050 msgid "Tail" msgstr "Cua" #: src/dialogs/confdialog.cxx:13051 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" "Amplia l'últim dit/punt en ms\n" "per defecte = 0" #: src/dialogs/confdialog.cxx:13059 msgid "K3NG Arduino sketch emulation" msgstr "Emulació d'esbós K3NG Arduino" #: src/dialogs/confdialog.cxx:13060 msgid "Activate for Mortty K3NG sketch" msgstr "Activa l'esbós de Mortty K3NG" #: src/dialogs/confdialog.cxx:13072 src/dialogs/confdialog.cxx:13277 #: src/dialogs/confdialog.cxx:13279 msgid "Modem/CW/nanoIO" msgstr "Mòdem - CW / nanoIO" #: src/dialogs/confdialog.cxx:13077 src/dialogs/confdialog.cxx:13376 #: src/dialogs/confdialog.cxx:15145 msgid "nanoIO serial port" msgstr "port sèrie nanoIO" #: src/dialogs/confdialog.cxx:13092 src/dialogs/confdialog.cxx:13391 #: src/dialogs/confdialog.cxx:15160 msgid "Connect / Disconnect from nanoIO" msgstr "Connecta/Desconnecta de nanoIO" #: src/dialogs/confdialog.cxx:13095 msgid "Paddle" msgstr "M. de pales" #: src/dialogs/confdialog.cxx:13096 msgid "CW wpm using paddle keyer" msgstr "Paraules per minut en CW utilitzant el manipulador de pales" #: src/dialogs/confdialog.cxx:13119 src/dialogs/confdialog.cxx:13239 #: src/dialogs/confdialog.cxx:13261 msgid "Comp'" msgstr "Cadenes" #: src/dialogs/confdialog.cxx:13120 msgid "CW wpm keyboard strings" msgstr "Cadenes de teclat en CW en paraules per minut" #: src/dialogs/confdialog.cxx:13149 msgid "Baud" msgstr "Baud" #: src/dialogs/confdialog.cxx:13164 msgid "Keyer" msgstr "Clau" #: src/dialogs/confdialog.cxx:13179 msgid "Incr'" msgstr "Incr'" #: src/dialogs/confdialog.cxx:13195 src/dialogs/confdialog.cxx:15192 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "Escriu l'estat de nanoIO a l'EEPROM d'Arduino" #: src/dialogs/confdialog.cxx:13198 src/dialogs/confdialog.cxx:15195 msgid "Status" msgstr "Estat" #: src/dialogs/confdialog.cxx:13199 src/dialogs/confdialog.cxx:15196 msgid "Query state of nanoIO" msgstr "Consulta l'estat de nanoIO" #: src/dialogs/confdialog.cxx:13204 msgid "Use WPM pot'" msgstr "Utilitza WPM pot'" #: src/dialogs/confdialog.cxx:13205 msgid "WPM pot update to nanoIO required" msgstr "Cal actualitzar el pot WPM al nanoIO" #: src/dialogs/confdialog.cxx:13222 msgid "" "Range WPM setting\n" "default = 20" msgstr "" "Configuració del rang WPM Paraules per minut\n" "per defecte = 20" #: src/dialogs/confdialog.cxx:13233 msgid "PTT off" msgstr "PTT apagat" #: src/dialogs/confdialog.cxx:13234 msgid "Disable PTT" msgstr "Desactiva PTT" #: src/dialogs/confdialog.cxx:13242 msgid "WPM" msgstr "WPM" #: src/dialogs/confdialog.cxx:13252 msgid "Test =>" msgstr "Prova =>" #: src/dialogs/confdialog.cxx:13253 msgid "Send \"paris \" WPM times" msgstr "Envia \"paris\" WPM vàries vegades" #: src/dialogs/confdialog.cxx:13256 msgid "secs' =>" msgstr "segons =>" #: src/dialogs/confdialog.cxx:13257 msgid "Test duration (60 seconds)" msgstr "Durada de la prova (60 segons)" #: src/dialogs/confdialog.cxx:13262 msgid "Compensationin microseconds" msgstr "Compensació en microsegons" #: src/dialogs/confdialog.cxx:13266 msgid "Adjust" msgstr "Adjust" #: src/dialogs/confdialog.cxx:13267 msgid "send compensation to nanoIO" msgstr "enviar una compensació al nanoIO" #: src/dialogs/confdialog.cxx:13272 msgid "CW i/o" msgstr "CW i/o" #: src/dialogs/confdialog.cxx:13273 msgid "Enable CW operation" msgstr "Habilita el funcionament de CW" #: src/dialogs/confdialog.cxx:13282 src/dialogs/confdialog.cxx:13404 #: src/dialogs/confdialog.cxx:13406 msgid "Modem/CW/DTR-RTS keying" msgstr "Tecla de mòdem - CW/DTR-RTS" #: src/dialogs/confdialog.cxx:13288 msgid "" "DTR/RTS keying may be assigned to flrig, share the RigCat serial port,\n" "share the Separate PTT serial port, or be assigned to separate serial port.\n" "\n" "No settings for baud, stops bits, etc are needed." msgstr "" "La clau DTR/RTS es pot assignar a flrig, compartir el port sèrie RigCat,\n" "compartir el port sèrie PTT independent o assignar-lo a un port sèrie " "separat.\n" "\n" "No es necessita cap configuració per a bauds, bits de parada, etc." #: src/dialogs/confdialog.cxx:13297 msgid "Use flrig DTR/RTS keying" msgstr "Utilitza la tecla flrig DTR/RTS" #: src/dialogs/confdialog.cxx:13303 msgid "Disable flrig CW PTT" msgstr "Desactiva el flrig CW PTT" #: src/dialogs/confdialog.cxx:13304 src/dialogs/confdialog.cxx:13451 msgid "" "Required for some transceivers\n" "e.g. TS-480" msgstr "" "Necessari per a alguns transceptors\n" "exemple TS-480" #: src/dialogs/confdialog.cxx:13313 msgid "Share RIGCAT port" msgstr "Comparteix el port RIGCAT" #: src/dialogs/confdialog.cxx:13319 msgid "Share Separate PTT port" msgstr "Comparteix un port PTT independent" #: src/dialogs/confdialog.cxx:13325 msgid "CW Keyline" msgstr "Línia clau CW" #: src/dialogs/confdialog.cxx:13340 msgid "Keying compensation (msec)" msgstr "Compensació de tecles (ms)" #: src/dialogs/confdialog.cxx:13341 msgid "Dot / Space timing increment" msgstr "Increment de temps de punt/espai" #: src/dialogs/confdialog.cxx:13359 msgid "PTT keyline" msgstr "Línia clau PTT" #: src/dialogs/confdialog.cxx:13375 msgid "Use Separate Keying Serial Port" msgstr "Utilitza un port sèrie de claus independent" #: src/dialogs/confdialog.cxx:13395 msgid "Speed test" msgstr "Prova de velocitat" #: src/dialogs/confdialog.cxx:13396 msgid "1 minute 'PARIS '" msgstr "1 minut 'PARIS '" #: src/dialogs/confdialog.cxx:13400 msgid "Result" msgstr "Resultat" #: src/dialogs/confdialog.cxx:13409 msgid "Modem/CW/CAT Keying" msgstr "Clau mòdem - CW / CAT" #: src/dialogs/confdialog.cxx:13413 msgid "" "CW keying using CAT command strings. Available for supported transceivers.\n" "Use with RigCAT or flrig transceiver control. A separate serial port is NOT " "needed.\n" "\n" "Disable CAT PTT if transceiver interprets that as a keydown command (e.g. " "TS480).\n" "Recommend setting transceiver to either semi or full break-in.\n" "\n" "Enter correct CIV address for Icom transceivers." msgstr "" "Teclat CW mitjançant cadenes d'ordres CAT. Disponible per equips de ràdio " "compatibles.\n" "Utilitza-ho amb el control de l'equip amb RigCAT o flrig. NO és necessari un " "port sèrie separat.\n" "\n" "Desactiva el CAT PTT si l'equip ho interpreta com una ordre de teclat (per " "exemple, TS480).\n" "Es recomana configurar l'equip a una entrada semi o completa.\n" "\n" "Introdueix l'adreça CIV correcta per als equips Icom." #: src/dialogs/confdialog.cxx:13424 msgid "Icom" msgstr "Icom" #: src/dialogs/confdialog.cxx:13429 msgid "Hex CIV addr" msgstr "Adreça CIV hexadecimal" #: src/dialogs/confdialog.cxx:13430 msgid "Enter transceiver HEX CIV address" msgstr "Introdueix l'adreça HEX CIV de l'equip" #: src/dialogs/confdialog.cxx:13435 msgid "Elecraft" msgstr "Elecraft" #: src/dialogs/confdialog.cxx:13440 msgid "Kenwood" msgstr "Kenwood" #: src/dialogs/confdialog.cxx:13445 msgid "Yaesu" msgstr "Yaesu" #: src/dialogs/confdialog.cxx:13450 msgid "Disable CAT PTT" msgstr "Desactiva el PTT via CAT" #: src/dialogs/confdialog.cxx:13456 src/dialogs/confdialog.cxx:13458 msgid "Modem/CW/CAT keying" msgstr "Clau mòdem/CW/CAT" #: src/dialogs/confdialog.cxx:13461 msgid "CW CAT & WinKeyer Compensation" msgstr "Compensació CW CAT i WinKeyer" #: src/dialogs/confdialog.cxx:13465 msgid "" "Compute timing compensation for CAT CW and WinKeyer CW. Computation at " "current\n" "WPM . Set WPM to nominal (suggest 20 WPM).\n" "\n" "Compensation will be good over a +/- 10 WPM range. Calibration/Test is 1 " "minute of\n" "'PARIS '." msgstr "" "Calcula la compensació de temps per al CAT en CW i WinKeyer per CW. Càlcul " "al corrent\n" "WPM. Estableix WPM a nominal (suggereix 20 WPM).\n" "\n" "La compensació serà bona en un rang de +/- 10 WPM. La calibració/prova és " "d'1 minut\n" "'PARIS '." #: src/dialogs/confdialog.cxx:13473 msgid "Calibrate" msgstr "Calibrar" #: src/dialogs/confdialog.cxx:13474 src/dialogs/confdialog.cxx:13489 msgid "Send WPM 'PARIS ' words" msgstr "Envia paraules WPM 'PARÍS'" #: src/dialogs/confdialog.cxx:13477 msgid "Compensate (secs)" msgstr "Compensar (segons)" #: src/dialogs/confdialog.cxx:13485 msgid "Clear compensation" msgstr "Compensació clara" #: src/dialogs/confdialog.cxx:13488 src/dialogs/confdialog.cxx:14847 #: src/dialogs/confdialog.cxx:16157 src/dialogs/confdialog.cxx:16161 #: src/dialogs/confdialog.cxx:16165 src/dialogs/confdialog.cxx:16169 #: src/dialogs/confdialog.cxx:16173 src/dialogs/confdialog.cxx:16177 #: src/dialogs/confdialog.cxx:16181 src/dialogs/confdialog.cxx:18399 #: src/dialogs/confdialog.cxx:18428 src/dialogs/confdialog.cxx:18457 #: src/dialogs/confdialog.cxx:18486 src/dialogs/confdialog.cxx:18505 msgid "Test" msgstr "Prova" #: src/dialogs/confdialog.cxx:13492 msgid "secs" msgstr "segons" #: src/dialogs/confdialog.cxx:13498 src/dialogs/confdialog.cxx:13500 msgid "Modem/CW/CAT comp'" msgstr "Mòdem/CW/CAT comp'" #: src/dialogs/confdialog.cxx:13503 src/dialogs/confdialog.cxx:13591 #: src/dialogs/confdialog.cxx:13593 msgid "Modem/DominoEX" msgstr "Mòdem - DominoEX" #: src/dialogs/confdialog.cxx:13507 src/dialogs/confdialog.cxx:15724 msgid "Secondary Text" msgstr "Text secundari" #: src/dialogs/confdialog.cxx:13508 src/dialogs/confdialog.cxx:15725 msgid "Text to send during keyboard idle times" msgstr "Text per enviar durant els temps d'inactivitat del teclat" #: src/dialogs/confdialog.cxx:13522 src/dialogs/confdialog.cxx:15739 msgid "Filtering" msgstr "Filtratge" #: src/dialogs/confdialog.cxx:13523 msgid "Use DSP filter before decoder" msgstr "Utilitza el filtre DSP abans del descodificador" #: src/dialogs/confdialog.cxx:13529 src/dialogs/confdialog.cxx:15746 msgid "Filter bandwidth factor" msgstr "Factor d'amplada de banda del filtre" #: src/dialogs/confdialog.cxx:13530 src/dialogs/confdialog.cxx:15747 msgid "Filter bandwidth relative to signal width" msgstr "Filtre l'amplada de banda en relació amb l'amplada del senyal" #: src/dialogs/confdialog.cxx:13548 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:13549 msgid "Enable MultiPSK-compatible FEC" msgstr "Activa la FEC compatible amb MultiPSK" #: src/dialogs/confdialog.cxx:13554 src/dialogs/confdialog.cxx:15765 msgid "CWI threshold" msgstr "Llindar CWI" #: src/dialogs/confdialog.cxx:13555 src/dialogs/confdialog.cxx:15766 msgid "CWI detection and suppression" msgstr "Detecció i supressió de CWI" #: src/dialogs/confdialog.cxx:13571 src/dialogs/confdialog.cxx:15801 msgid "Paths (hidden)" msgstr "Rutes (Ocults)" #: src/dialogs/confdialog.cxx:13596 src/dialogs/confdialog.cxx:13736 #: src/dialogs/confdialog.cxx:13738 msgid "Modem/Feld Hell" msgstr "Mòdem - Feld Hell" #: src/dialogs/confdialog.cxx:13600 msgid "Hell Transmit Parameters" msgstr "Paràmetres de transmissió de l'infern" #: src/dialogs/confdialog.cxx:13603 msgid "Transmit font" msgstr "Font de transmissió" #: src/dialogs/confdialog.cxx:13604 msgid "Select TX raster font" msgstr "Selecciona el tipus de lletra rastre de TX" #: src/dialogs/confdialog.cxx:13620 msgid "Pulse shape" msgstr "Forma de pols" #: src/dialogs/confdialog.cxx:13621 msgid "Raised cosine pulse shape factor" msgstr "Factor de forma del pols cosinus elevat" #: src/dialogs/confdialog.cxx:13632 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "Lent (4 ms)|Mitjà (2 ms)|Ràpid (1 ms)|Teclament dur" #: src/dialogs/confdialog.cxx:13637 msgid "Transmit periods (.) when idle" msgstr "Transmet períodes (.) quan està inactiu" #: src/dialogs/confdialog.cxx:13638 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Transmet un punt enderrocat quan no hi ha activitat del teclat" #: src/dialogs/confdialog.cxx:13644 msgid "Tx Width Multiplier" msgstr "Multiplicador d'amplada Tx" #: src/dialogs/confdialog.cxx:13645 msgid "Range 1...3" msgstr "Interval 1...3" #: src/dialogs/confdialog.cxx:13659 msgid "Hell Receive Parameters" msgstr "Paràmetres de recepció de l'infern" #: src/dialogs/confdialog.cxx:13662 msgid "Reverse video" msgstr "Vídeo invers" #: src/dialogs/confdialog.cxx:13663 msgid "Display RX in reverse video" msgstr "Mostra RX en el vídeo invers" #: src/dialogs/confdialog.cxx:13668 msgid "Marquee text" msgstr "Text de marquesina" #: src/dialogs/confdialog.cxx:13669 msgid "Display RX as a scrolling marquee" msgstr "Mostra RX com una marquesina de desplaçament" #: src/dialogs/confdialog.cxx:13674 msgid "Rx Width Multiplier" msgstr "Multiplicador d'amplada de RX" #: src/dialogs/confdialog.cxx:13675 msgid "Range 1...4" msgstr "Interval 1...4" #: src/dialogs/confdialog.cxx:13687 msgid "Rx Height in pixels" msgstr "Alçada en píxels en RX" #: src/dialogs/confdialog.cxx:13688 msgid "May require resizing the Rx/Tx panel" msgstr "Pot requerir canviar la mida del panell de RX/TX" #: src/dialogs/confdialog.cxx:13700 msgid "Receive filter bandwidth" msgstr "Ample de banda del filtre de recepció" #: src/dialogs/confdialog.cxx:13701 msgid "Adjust the DSP bandwidth" msgstr "Ajusta l'ample de banda del DSP" #: src/dialogs/confdialog.cxx:13721 msgid "Rx AGC" msgstr "RX AGC" #: src/dialogs/confdialog.cxx:13722 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "1 - Lent, 2 - Mitjà, 3 - Ràpid" #: src/dialogs/confdialog.cxx:13741 src/dialogs/confdialog.cxx:13976 #: src/dialogs/confdialog.cxx:13978 msgid "Modem/FMT" msgstr "Mòdem - FMT" #: src/dialogs/confdialog.cxx:13745 msgid "Audio Stream Procesing" msgstr "Processament de flux d'àudio" #: src/dialogs/confdialog.cxx:13748 src/dialogs/confdialog.cxx:18717 msgid "Sample rate" msgstr "Tasa de mostreig" #: src/dialogs/confdialog.cxx:13749 msgid "FMT sample rate" msgstr "Tasa de mostreig FMT" #: src/dialogs/confdialog.cxx:13764 msgid "Rx Codec PPM" msgstr "Codec PPM de RX" #: src/dialogs/confdialog.cxx:13765 msgid "Audio Codec ppm correction" msgstr "Correcció ppm del còdec d'àudio" #: src/dialogs/confdialog.cxx:13776 msgid "Tracking" msgstr "Seguimient" #: src/dialogs/confdialog.cxx:13779 msgid "Bgnd" msgstr "Bgnd" #: src/dialogs/confdialog.cxx:13780 msgid "Change plot background color" msgstr "Canvia el color de fons de la trama" #: src/dialogs/confdialog.cxx:13783 msgid "Unkn" msgstr "Unkn" #: src/dialogs/confdialog.cxx:13784 msgid "Change plot unknown track color" msgstr "Canvia el color de la pista desconegut de la trama" #: src/dialogs/confdialog.cxx:13787 msgid "Ref" msgstr "Ref" #: src/dialogs/confdialog.cxx:13788 msgid "Change plot reference track color" msgstr "Canvia el color de la pista de referència de la trama" #: src/dialogs/confdialog.cxx:13792 msgid "Change Axis' color" msgstr "Canvia el color de l'eix" #: src/dialogs/confdialog.cxx:13795 msgid "Lgnd" msgstr "Lgnd" #: src/dialogs/confdialog.cxx:13796 msgid "Change legend color" msgstr "Canvia el color de la llegenda" #: src/dialogs/confdialog.cxx:13799 msgid "Line/Axis" msgstr "Línia/Eix" #: src/dialogs/confdialog.cxx:13800 msgid "Enable to always plot data over axis" msgstr "Habilita-ho per traçar dades sempre sobre l'eix" #: src/dialogs/confdialog.cxx:13805 msgid "Thick lines" msgstr "Línies gruixudes" #: src/dialogs/confdialog.cxx:13806 msgid "Enable to plot track lines 3 pixels wide" msgstr "Habilita per traçar línies de pista de 3 píxels d'amplada" #: src/dialogs/confdialog.cxx:13811 msgid "Freq Correction" msgstr "Correcció de la freqüència" #: src/dialogs/confdialog.cxx:13812 msgid "Offset plot lines on vertical scale" msgstr "Desplaçament de línies de trama a escala vertical" #: src/dialogs/confdialog.cxx:13821 src/dialogs/confdialog.cxx:18829 msgid "@|<" msgstr "@|<" #: src/dialogs/confdialog.cxx:13825 src/dialogs/confdialog.cxx:18843 msgid "@>|" msgstr "@>|" #: src/dialogs/confdialog.cxx:13829 msgid "Max Error" msgstr "Error màxim" #: src/dialogs/confdialog.cxx:13830 msgid "Limit freq estimate error to this value" msgstr "Limiteu l'error d'estimació de freqüència a aquest valor" #: src/dialogs/confdialog.cxx:13841 msgid "DFT Estimator" msgstr "Estimador DFT" #: src/dialogs/confdialog.cxx:13844 msgid "Data Filter" msgstr "Filtre de dades" #: src/dialogs/confdialog.cxx:13845 msgid "Moving average - average over NN seconds^0 - no averaging" msgstr "Mitjana mòbil - mitjana durant NN segons 0 - sense mitjana" #: src/dialogs/confdialog.cxx:13854 msgid "DFT rate" msgstr "Taxa DFT" #: src/dialogs/confdialog.cxx:13855 msgid "# DFT computations / second" msgstr "# Càlculs DFT / segon" #: src/dialogs/confdialog.cxx:13872 msgid "FIR Filter" msgstr "Filtre FIR" #: src/dialogs/confdialog.cxx:13875 msgid "Width" msgstr "Amplada" #: src/dialogs/confdialog.cxx:13876 msgid "Band pass filter / unknown / reference" msgstr "Filtre passabanda / desconegut / referència" #: src/dialogs/confdialog.cxx:13886 msgid "bpf Unk'" msgstr "bpf Unk'" #: src/dialogs/confdialog.cxx:13887 msgid "ON - band pass filter unknown signal" msgstr "ON - senyal desconegut del filtre passa banda" #: src/dialogs/confdialog.cxx:13892 msgid "bpf Ref'" msgstr "bpf Ref'" #: src/dialogs/confdialog.cxx:13893 msgid "ON - band pass filter reference signal" msgstr "ON - senyal de referència del filtre passa banda" #: src/dialogs/confdialog.cxx:13900 msgid "CSV Data Recording" msgstr "Enregistrament de dades CSV" #: src/dialogs/confdialog.cxx:13903 msgid "Auto record" msgstr "Enregistrament automàtic" #: src/dialogs/confdialog.cxx:13904 msgid "Automatically start csv data file recording with wav playback" msgstr "" "Inicia automàticament la gravació de fitxers de dades csv amb la reproducció " "wav" #: src/dialogs/confdialog.cxx:13908 msgid "Record data for NN minutes after auto start" msgstr "Enregistra les dades durant NN minuts després de l'inici automàtic" #: src/dialogs/confdialog.cxx:13918 msgid "Wav file recording" msgstr "Enregistrament d'arxius WAV" #: src/dialogs/confdialog.cxx:13921 msgid "Record Audio" msgstr "Gravar àudio" #: src/dialogs/confdialog.cxx:13922 msgid "Wav file recording - START IMMEDIATELY" msgstr "Enregistrament de fitxers WAV - COMENÇA IMMEDIATAMENT" #: src/dialogs/confdialog.cxx:13927 msgid "Sync to data record" msgstr "Sincronització amb el registre de dades" #: src/dialogs/confdialog.cxx:13928 msgid "Wav file recording - SYNCHRONIZE with data recording" msgstr "" "Enregistrament de fitxers WAV - SINCRONITZAR amb l'enregistrament de dades" #: src/dialogs/confdialog.cxx:13933 msgid "File pathname:" msgstr "Camí del fitxer :" #: src/dialogs/confdialog.cxx:13934 msgid "Computer generated file name" msgstr "Nom del fitxer generat per ordinador" #: src/dialogs/confdialog.cxx:13942 msgid "" "Shft-click: select unknown\n" "Ctrl-click: select reference" msgstr "" "Maj+clic: selecciona desconegut\n" "Ctrl+clic: selecciona la referència" #: src/dialogs/confdialog.cxx:13946 msgid "Center on Unknown" msgstr "Centre a Desconegut" #: src/dialogs/confdialog.cxx:13947 msgid "Waterfall Centered on unknown signal" msgstr "Cascada centrada en senyal desconegut" #: src/dialogs/confdialog.cxx:13952 msgid "Center on Reference" msgstr "Centre de referència" #: src/dialogs/confdialog.cxx:13953 msgid "Waterfall centered on reference signal" msgstr "Cascada centrada en senyal de referència" #: src/dialogs/confdialog.cxx:13958 msgid "Center on median" msgstr "Centre a la mitjana" #: src/dialogs/confdialog.cxx:13959 msgid "Waterfall centered 1/2 way between unknown & reference" msgstr "Cascada centrada a 1/2 camí entre desconegut i referència" #: src/dialogs/confdialog.cxx:13968 msgid "Use TAB delimiters" msgstr "Utilitza delimitadors de tabulació" #: src/dialogs/confdialog.cxx:13969 msgid "Use tab delimiters between columns on csv export file." msgstr "" "Utilitza delimitadors de tabulació entre columnes al fitxer d'exportació csv." #: src/dialogs/confdialog.cxx:13981 src/dialogs/confdialog.cxx:14192 #: src/dialogs/confdialog.cxx:14194 msgid "Modem/FSQ" msgstr "Mòdem - FSQ" #: src/dialogs/confdialog.cxx:13985 msgid "Rx Parameters" msgstr "Paràmetres de Recepció" #: src/dialogs/confdialog.cxx:13988 msgid "Min Hits" msgstr "Accessos Mínims" #: src/dialogs/confdialog.cxx:13989 msgid "Minimum # hits in tone detector" msgstr "Mínim # cops al detector de to" #: src/dialogs/confdialog.cxx:14000 msgid "Image LPF" msgstr "Imatge LPF" #: src/dialogs/confdialog.cxx:14001 msgid "Narrow LPF if image noisy" msgstr "LPF estret si la imatge és sorollosa" #: src/dialogs/confdialog.cxx:14007 msgid "MovAvg:" msgstr "MovAvg:" #: src/dialogs/confdialog.cxx:14008 msgid "Filter FFT output" msgstr "Sortida FFT del filtre" #: src/dialogs/confdialog.cxx:14020 msgid "Heard aging" msgstr "Envelliment escoltat" #: src/dialogs/confdialog.cxx:14021 msgid "Remove call after ..." msgstr "Elimina la trucada després de..." #: src/dialogs/confdialog.cxx:14029 src/dialogs/confdialog.cxx:14201 msgid "Tx Parameters" msgstr "Paràmetres de Transmissió" #: src/dialogs/confdialog.cxx:14032 msgid "1.5 baud" msgstr "1,5 bauds" #: src/dialogs/confdialog.cxx:14037 msgid "2 baud" msgstr "2 bauds" #: src/dialogs/confdialog.cxx:14042 msgid "3 baud" msgstr "3 bauds" #: src/dialogs/confdialog.cxx:14047 msgid "4.5 baud" msgstr "4.5 bauds" #: src/dialogs/confdialog.cxx:14052 msgid "6 baud" msgstr "6 bauds" #: src/dialogs/confdialog.cxx:14057 src/dialogs/confdialog.cxx:15873 msgid "Center freq" msgstr "Freq. central" #: src/dialogs/confdialog.cxx:14063 msgid "Sounder" msgstr "Sonda" #: src/dialogs/confdialog.cxx:14064 msgid "Send beacon every ..." msgstr "Envia balisa cada..." #: src/dialogs/confdialog.cxx:14070 msgid "Time out" msgstr "Límit de temps" #: src/dialogs/confdialog.cxx:14071 msgid "Time out xmt attempt in XX seconds" msgstr "Límit de temps xmt intent en XX segons" #: src/dialogs/confdialog.cxx:14081 msgid "QTC:" msgstr "QTC :" #: src/dialogs/confdialog.cxx:14082 msgid "Enter QTC text" msgstr "Introdueix el text QTC" #: src/dialogs/confdialog.cxx:14086 msgid "MYCALL lower case" msgstr "El meu indicatiu en minúscula" #: src/dialogs/confdialog.cxx:14087 src/dialogs/confdialog.cxx:14221 msgid "convert operator callsign to lower case" msgstr "convertir l'indicatiu de l'operador en minúscules" #: src/dialogs/confdialog.cxx:14092 msgid "QTH:" msgstr "QTH :" #: src/dialogs/confdialog.cxx:14093 src/dialogs/confdialog.cxx:17235 msgid "Operators QTH" msgstr "QTH de l'estació" #: src/dialogs/confdialog.cxx:14109 msgid "Message Logging" msgstr "Registre de missatges" #: src/dialogs/confdialog.cxx:14112 msgid "Add date/time" msgstr "Afegeix data/hora" #: src/dialogs/confdialog.cxx:14113 msgid "Add date/time stamp to each # received message" msgstr "Afegeix un segell de data i hora a cada # missatge rebut" #: src/dialogs/confdialog.cxx:14119 msgid "always append to file(s)" msgstr "afegeix sempre als fitxers" #: src/dialogs/confdialog.cxx:14120 msgid "append # directive msgs to named file" msgstr "afegir # missatges de directiva al fitxer amb nom" #: src/dialogs/confdialog.cxx:14126 msgid "Notify time out" msgstr "Notificar el límit de temps" #: src/dialogs/confdialog.cxx:14127 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" "El diàleg de notificació es tanca al cap de XX segons; 0 == el diàleg roman " "obert" #: src/dialogs/confdialog.cxx:14142 src/dialogs/confdialog.cxx:14243 msgid "Audit log" msgstr "Registre auditoria" #: src/dialogs/confdialog.cxx:14145 src/dialogs/confdialog.cxx:14156 #: src/dialogs/confdialog.cxx:14246 src/dialogs/confdialog.cxx:14257 #: src/dialogs/confdialog.cxx:16335 src/dialogs/confdialog.cxx:18394 #: src/dialogs/confdialog.cxx:18423 src/dialogs/confdialog.cxx:18452 #: src/dialogs/confdialog.cxx:18481 src/dialogs/confdialog.cxx:18508 #: src/dialogs/confdialog.cxx:18634 msgid "Enable" msgstr "Activa" #: src/dialogs/confdialog.cxx:14153 src/dialogs/confdialog.cxx:14254 msgid "Heard log" msgstr "Sentit registre" #: src/dialogs/confdialog.cxx:14166 msgid "Text Colors" msgstr "Colors de text" #: src/dialogs/confdialog.cxx:14170 msgid "Transmit text" msgstr "Transmetre text" #: src/dialogs/confdialog.cxx:14175 msgid "DIRECTED" msgstr "DIRIGIDA" #: src/dialogs/confdialog.cxx:14176 msgid "Directed received text" msgstr "Text rebut dirigit" #: src/dialogs/confdialog.cxx:14181 msgid "UNDIRECTED" msgstr "NO DIRIGID" #: src/dialogs/confdialog.cxx:14182 msgid "Undirected received text" msgstr "Text rebut no dirigit" #: src/dialogs/confdialog.cxx:14197 src/dialogs/confdialog.cxx:14279 #: src/dialogs/confdialog.cxx:14281 msgid "Modem/IFKP" msgstr "Mòdem - IFKP" #: src/dialogs/confdialog.cxx:14204 msgid "1/2 speed" msgstr "1/2 velocitat" #: src/dialogs/confdialog.cxx:14209 msgid "1x speed" msgstr "1x velocitat" #: src/dialogs/confdialog.cxx:14210 msgid "default" msgstr "per defecte" #: src/dialogs/confdialog.cxx:14215 msgid "2x speed" msgstr "2x velocitat" #: src/dialogs/confdialog.cxx:14220 msgid "MYCALL always lower case" msgstr "El meu indicatiu sempre en minúscula" #: src/dialogs/confdialog.cxx:14226 msgid "CALLSIGN always lower case" msgstr "Indicatiu sempre en minúscula" #: src/dialogs/confdialog.cxx:14227 msgid "convert other callsign to lower case" msgstr "convertir un altre indicatiu a minúscules" #: src/dialogs/confdialog.cxx:14232 msgid "lock WF at 1500 Hz" msgstr "bloqueig de la cascada a 1500 Hz" #: src/dialogs/confdialog.cxx:14233 msgid "Always transmit at 1500 Hertz center freq." msgstr "Transmet sempre a una freqüència central de 1500 Hertz." #: src/dialogs/confdialog.cxx:14267 #, fuzzy #| msgid "Operator Call" msgid "" "\n" "Operator avatar" msgstr "Nom de l'operador" #: src/dialogs/confdialog.cxx:14284 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14355 msgid "Modem/MT-63" msgstr "Mòdem - MT-63" #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14550 msgid "8-bit extended characters (UTF-8)" msgstr "Caràcters ampliats de 8 bits (UTF-8)" #: src/dialogs/confdialog.cxx:14292 msgid "Enable this for UTF-8 characters" msgstr "Activa-ho per als caràcters UTF-8" #: src/dialogs/confdialog.cxx:14298 msgid "Long receive integration" msgstr "Integració de llarga durada" #: src/dialogs/confdialog.cxx:14299 msgid "Enable for very weak signals" msgstr "Habilita per a senyals molt febles" #: src/dialogs/confdialog.cxx:14309 msgid "Transmit lower start tone" msgstr "Transmet el to inicial més baix" #: src/dialogs/confdialog.cxx:14314 msgid "Transmit upper start tone" msgstr "Transmet el to inicial més alt" #: src/dialogs/confdialog.cxx:14320 msgid "Tone Duration (secs)" msgstr "Durada del to (segons)" #: src/dialogs/confdialog.cxx:14336 msgid "Low tone at 500 Hz" msgstr "To baix a 500 Hz" #: src/dialogs/confdialog.cxx:14341 msgid "Centered at 1500 Hz (SHARES)" msgstr "Centrat a 1500 Hz (ACCIONS)" #: src/dialogs/confdialog.cxx:14346 msgid "Manual tuning" msgstr "Afinació manual" #: src/dialogs/confdialog.cxx:14358 src/dialogs/confdialog.cxx:14454 #: src/dialogs/confdialog.cxx:14456 msgid "Modem/Contestia" msgstr "Mòdem - Contesta" #: src/dialogs/confdialog.cxx:14364 src/dialogs/confdialog.cxx:14465 msgid "Bandwidth" msgstr "Ample de banda" #: src/dialogs/confdialog.cxx:14365 src/dialogs/confdialog.cxx:14466 msgid "Select bandwidth" msgstr "Selecciona l'ample de banda" #: src/dialogs/confdialog.cxx:14381 src/dialogs/confdialog.cxx:14482 msgid "Tones" msgstr "Tons" #: src/dialogs/confdialog.cxx:14382 src/dialogs/confdialog.cxx:14483 msgid "Select number of tones" msgstr "Selecciona el numero de tons" #: src/dialogs/confdialog.cxx:14398 src/dialogs/confdialog.cxx:14499 msgid "Receive synchronizer" msgstr "Sincronitzador de recepció" #: src/dialogs/confdialog.cxx:14401 src/dialogs/confdialog.cxx:14502 msgid "Tune margin (tone frequency spacing)" msgstr "Marge de sintonització (espaiat de freqüència de to)" #: src/dialogs/confdialog.cxx:14402 src/dialogs/confdialog.cxx:14421 #: src/dialogs/confdialog.cxx:14503 src/dialogs/confdialog.cxx:14523 msgid "Change ONLY to experiment" msgstr "Canvia NOMÉS per experimentar" #: src/dialogs/confdialog.cxx:14420 src/dialogs/confdialog.cxx:14522 msgid "Integration period (FEC blocks)" msgstr "Període d'integració (blocs FEC)" #: src/dialogs/confdialog.cxx:14441 msgid "8-bit extended characters" msgstr "Caràcters ampliats de 8 bits" #: src/dialogs/confdialog.cxx:14442 msgid "Enable this for Latin-1 accented characters" msgstr "Activa-ho per als caràcters amb accent llatí-1" #: src/dialogs/confdialog.cxx:14446 src/dialogs/confdialog.cxx:14556 msgid "xmt start/stop tones" msgstr "tons d'inici/parada xmt" # Revisar estilo (@HK4QWC) # @CO7WT De esta forma es más sencillo y al estar en contexto en la interfaz se intuye el significado #: src/dialogs/confdialog.cxx:14447 src/dialogs/confdialog.cxx:14557 msgid "Enable this to send start/stop tones" msgstr "Activa-ho per enviar tons d'inici/parada" #: src/dialogs/confdialog.cxx:14459 src/dialogs/confdialog.cxx:14564 #: src/dialogs/confdialog.cxx:14566 msgid "Modem/Olivia" msgstr "Mòdem - Olivia" #: src/dialogs/confdialog.cxx:14542 msgid "Reset FEC blocks when changing BW or Tones" msgstr "Restableix els blocs FEC quan canviïs BW o Tons" #: src/dialogs/confdialog.cxx:14543 src/dialogs/confdialog.cxx:14551 msgid "Enable this for UTF-8 character transmission" msgstr "Activa-ho per a la transmissió de caràcters UTF-8" #: src/dialogs/confdialog.cxx:14569 src/dialogs/confdialog.cxx:14709 #: src/dialogs/confdialog.cxx:14711 msgid "Modem/Psk" msgstr "Mòdem - PSK" #: src/dialogs/confdialog.cxx:14573 msgid "AFC behavior" msgstr "Comportament de l'AFC" #: src/dialogs/confdialog.cxx:14576 msgid "Acquisition search range (Hz)" msgstr "Interval de cerca d'adquisició (Hz)" #: src/dialogs/confdialog.cxx:14577 msgid "Capture signals within this frequency range" msgstr "Captura senyals dins d'aquest rang de freqüències" #: src/dialogs/confdialog.cxx:14596 src/dialogs/confdialog.cxx:20095 msgid "Acquisition S/N (dB)" msgstr "Adquisició S/N (dB)" #: src/dialogs/confdialog.cxx:14597 src/dialogs/confdialog.cxx:20096 msgid "Capture signals over this threshold" msgstr "Captura senyals per sobre d'aquest nivell" #: src/dialogs/confdialog.cxx:14618 msgid "S/N and IMD behavior" msgstr "Comportament S/N i IMD" #: src/dialogs/confdialog.cxx:14621 msgid "after" msgstr "després" #: src/dialogs/confdialog.cxx:14622 msgid "Behavior of s/n imd" msgstr "Comportament de s/n imd" #: src/dialogs/confdialog.cxx:14633 msgid "Dim" msgstr "Dim" #: src/dialogs/confdialog.cxx:14638 msgid "seconds" msgstr "segons" #: src/dialogs/confdialog.cxx:14639 msgid "Will occur after this time in seconds" msgstr "Es produirà després d'aquest temps en segons" #: src/dialogs/confdialog.cxx:14659 msgid "Multi-Channel Signal Processing" msgstr "Processament del senyal multicanal" #: src/dialogs/confdialog.cxx:14662 msgid "Multi-channel detector" msgstr "Detector multicanal" #: src/dialogs/confdialog.cxx:14667 msgid "Disable on very slow CPUs or if signal browser is not used" msgstr "" "Desactiva amb CPU molt lentes o si no s'utilitza el navegador de senyals" #: src/dialogs/confdialog.cxx:14672 msgid "8 psk" msgstr "8 psk" #: src/dialogs/confdialog.cxx:14675 msgid "Pilot tone" msgstr "To pilot" #: src/dialogs/confdialog.cxx:14676 msgid "Enable encode/decode vestigial pilot tone" msgstr "Activa la codificació/descodificació del to pilot vestigial" #: src/dialogs/confdialog.cxx:14681 msgid "pilot power (dB)" msgstr "potència pilot (dB)" #: src/dialogs/confdialog.cxx:14682 msgid "Pilot tone power relative to signal" msgstr "Potència del to pilot en relació al senyal" #: src/dialogs/confdialog.cxx:14701 msgid "Short Preamble" msgstr "Preàmbul breu" #: src/dialogs/confdialog.cxx:14702 msgid "Enable short preamble for 8PSK transmission" msgstr "Activa el preàmbul breu per a la transmissió 8PSK" #: src/dialogs/confdialog.cxx:14714 src/dialogs/confdialog.cxx:14852 #: src/dialogs/confdialog.cxx:14854 msgid "Modem/TTY/Rx" msgstr "Mòdem - TTY / RX" #: src/dialogs/confdialog.cxx:14721 msgid "AFC speed" msgstr "Velocitat del AFC" #: src/dialogs/confdialog.cxx:14722 msgid "AFC tracking speed" msgstr "Velocitat de seguiment del AFC" #: src/dialogs/confdialog.cxx:14738 msgid "RX - unshift on space" msgstr "RX: desplaçar-se a l'espai" #: src/dialogs/confdialog.cxx:14739 msgid "Revert to unshifted char's on a space" msgstr "Torna als caràcters sense desplaçar en un espai" #: src/dialogs/confdialog.cxx:14744 msgid "Filter Shape Factor" msgstr "Factor de forma del filtre" #: src/dialogs/confdialog.cxx:14745 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "coeficient de temps rcos:\n" "1.0 ... 2.0\n" "W1HKJ recomana 1.275\n" "DO2SMF recomana 1.500" #: src/dialogs/confdialog.cxx:14755 msgid "Decode (CWI suppression)" msgstr "Descodificació (supressió CWI)" #: src/dialogs/confdialog.cxx:14758 msgid "Mark-Space" msgstr "Marca-Espai" #: src/dialogs/confdialog.cxx:14763 msgid "Mark only" msgstr "Només marca" #: src/dialogs/confdialog.cxx:14768 msgid "Space only" msgstr "Només espai" #: src/dialogs/confdialog.cxx:14775 msgid "RTTY Scope Display" msgstr "Visualització d'abast RTTY" #: src/dialogs/confdialog.cxx:14778 msgid "Use cross hair scope" msgstr "Utilitza l'abast de creu" #: src/dialogs/confdialog.cxx:14779 msgid "Default to cross hair digiscope" msgstr "Per defecte el digiscopi creuat" #: src/dialogs/confdialog.cxx:14784 msgid "XY - classic scope" msgstr "XY - àmbit clàssic" #: src/dialogs/confdialog.cxx:14785 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" "Activat: utilitza les sortides del filtre Marca/espai\n" "Desactivat: utilitza pseudosenyals" #: src/dialogs/confdialog.cxx:14792 msgid "Log RTTY frequency" msgstr "Registra la freqüència de RTTY" #: src/dialogs/confdialog.cxx:14795 msgid "Use MARK freq'" msgstr "Utilitza SENYAL freq'" #: src/dialogs/confdialog.cxx:14796 src/dialogs/confdialog.cxx:14816 #: src/dialogs/confdialog.cxx:14824 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" "Activat: registre el QSO mitjançant la freqüència de marca\n" "Desactivat: registre el QSO mitjançant la freqüència central" #: src/dialogs/confdialog.cxx:14803 msgid "track color" msgstr "color del rastre" #: src/dialogs/confdialog.cxx:14804 msgid "Color of Mark Track" msgstr "Color del rastre del senyal" #: src/dialogs/confdialog.cxx:14812 msgid "RTTY Bell" msgstr "Campana RTTY" #: src/dialogs/confdialog.cxx:14815 msgid "Audible BELL" msgstr "CAMPANA audible" #: src/dialogs/confdialog.cxx:14823 msgid "Visible BELL" msgstr "CAMPANA visible" #: src/dialogs/confdialog.cxx:14831 msgid "RTTY Bell audio wav" msgstr "RTTY Bell àudio wav" #: src/dialogs/confdialog.cxx:14838 src/dialogs/confdialog.cxx:18385 #: src/dialogs/confdialog.cxx:18414 src/dialogs/confdialog.cxx:18443 #: src/dialogs/confdialog.cxx:18472 src/dialogs/confdialog.cxx:18496 msgid "Sound:" msgstr "So :" #: src/dialogs/confdialog.cxx:14857 src/dialogs/confdialog.cxx:15028 #: src/dialogs/confdialog.cxx:15030 msgid "Modem/TTY/Tx" msgstr "Mòdem - TTY / TX" #: src/dialogs/confdialog.cxx:14861 msgid "Sound Card FSK" msgstr "Targeta de so FSK" #: src/dialogs/confdialog.cxx:14864 src/dialogs/confdialog.cxx:15099 msgid "Carrier shift" msgstr "Salt de la portadora" #: src/dialogs/confdialog.cxx:14865 msgid "Select carrier shift" msgstr "Seleccionar el salt de la portadora" #: src/dialogs/confdialog.cxx:14880 msgid "Custom shift" msgstr "Torn personalitzat" #: src/dialogs/confdialog.cxx:14881 msgid "Input carrier shift" msgstr "Canvi de portadora d'entrada" #: src/dialogs/confdialog.cxx:14899 src/dialogs/confdialog.cxx:15399 #: src/dialogs/confdialog.cxx:15553 msgid "Baud rate" msgstr "Velocitat transmissió" #: src/dialogs/confdialog.cxx:14900 msgid "Select carrier baudrate" msgstr "Selecciona la velocitat en bauds de la portadora" #: src/dialogs/confdialog.cxx:14916 msgid "Bits per character" msgstr "Bits per caràcter" #: src/dialogs/confdialog.cxx:14917 msgid "Select # bits / char" msgstr "Selecciona # bits/car" #: src/dialogs/confdialog.cxx:14932 msgid "Parity" msgstr "Paritat" #: src/dialogs/confdialog.cxx:14933 msgid "Select parity" msgstr "Selecciona la paritat" #: src/dialogs/confdialog.cxx:14948 src/dialogs/confdialog.cxx:15415 #: src/dialogs/confdialog.cxx:15569 msgid "Stop bits" msgstr "Bits de parada" #: src/dialogs/confdialog.cxx:14949 msgid "Select # stop bits" msgstr "Seleccionar # de bits de parada" #: src/dialogs/confdialog.cxx:14964 msgid "AutoCRLF" msgstr "Auto CRLF" #: src/dialogs/confdialog.cxx:14965 msgid "Add CRLF after page width characters" msgstr "Afegeix CRLF després dels caràcters d'amplada de pàgina" #: src/dialogs/confdialog.cxx:14970 msgid "chars" msgstr "caràcters" #: src/dialogs/confdialog.cxx:14971 msgid "Auto CRLF line length" msgstr "Longitud de línia CRLF automàtica" #: src/dialogs/confdialog.cxx:14989 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:14990 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Utilitza \"cr cr lf\" per a \"cr lf\"" #: src/dialogs/confdialog.cxx:14996 msgid "TX - unshift on space" msgstr "TX: no desplaçar-se a l'espai" #: src/dialogs/confdialog.cxx:14997 msgid "Revert to Unsifted char's on a space" msgstr "Torna a Caràcters sense un espai" #: src/dialogs/confdialog.cxx:15002 msgid "Shaped Tx" msgstr "Donar forma al TX" #: src/dialogs/confdialog.cxx:15003 msgid "Use wave shaping on Tx signal" msgstr "Utilitza la forma d'ona al senyal de transmissió" #: src/dialogs/confdialog.cxx:15009 msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK - canal dret" #: src/dialogs/confdialog.cxx:15010 msgid "Create keyed square wave on right audio channel" msgstr "Crea una ona quadrada amb clau al canal dret d'àudio" #: src/dialogs/confdialog.cxx:15015 msgid "LTRS at start" msgstr "LTRS a l'inici" #: src/dialogs/confdialog.cxx:15016 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "Insereix NN LTRS bytes a l'inici de cada transmissió" #: src/dialogs/confdialog.cxx:15033 src/dialogs/confdialog.cxx:15135 #: src/dialogs/confdialog.cxx:15137 msgid "Modem/TTY/FSK" msgstr "Mòdem - TTY / FSK" #: src/dialogs/confdialog.cxx:15037 msgid "DTR/RTS signal line FSK" msgstr "Línia de senyal DTR/RTS FSK" #: src/dialogs/confdialog.cxx:15040 src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Habilitat" #: src/dialogs/confdialog.cxx:15041 msgid "Enable FSK on serial port" msgstr "Habilita FSK al port sèrie" #: src/dialogs/confdialog.cxx:15047 msgid "Shares RIGIO serial port, or uses" msgstr "Comparteix el port sèrie RIGIO o utilitza" #: src/dialogs/confdialog.cxx:15048 msgid "Share the RIGIO port" msgstr "Comparteix el port RIGIO" #: src/dialogs/confdialog.cxx:15054 msgid "Serial Port" msgstr "Port sèrie" #: src/dialogs/confdialog.cxx:15055 msgid "FSK independent serial port" msgstr "Port sèrie FSK independent" #: src/dialogs/confdialog.cxx:15069 msgid "MARK/SPACE reversed" msgstr "SENYAL/ESPAI invertit" #: src/dialogs/confdialog.cxx:15070 msgid "Reverse Mark/Space" msgstr "Senyal/Espai inversa" #: src/dialogs/confdialog.cxx:15076 src/dialogs/confdialog.cxx:18252 msgid "Use DTR" msgstr "Utilitza DTR" #: src/dialogs/confdialog.cxx:15077 msgid "Enable DTR signal line, default is RTS" msgstr "Activa la línia de senyal DTR, el valor predeterminat és RTS" #: src/dialogs/confdialog.cxx:15084 msgid "" "Restart the FSK interface\n" "Necessary if changes made to configuration" msgstr "" "Reinicia la interfície FSK\n" "Necessari si es fan canvis a la configuració" #: src/dialogs/confdialog.cxx:15088 msgid "Mark" msgstr "Senyal" #: src/dialogs/confdialog.cxx:15089 msgid "Mark frequency in Hertz" msgstr "Senyal a la freqüència en Hertz" #: src/dialogs/confdialog.cxx:15100 msgid "Carrier shift in Hertz" msgstr "Canvi de portadora en Hertz" #: src/dialogs/confdialog.cxx:15115 msgid "1.5 stop bits" msgstr "1,5 bits de parada" #: src/dialogs/confdialog.cxx:15116 msgid "" "Enabled - 1.5 stop bits\n" "Disabled - 2 stop bits" msgstr "" "Habilitat: 1,5 bits de parada\n" "Desactivat: 2 bits de parada" #: src/dialogs/confdialog.cxx:15126 msgid "Use flrig FSK keying" msgstr "Utilitza la clau FSK flrig" #: src/dialogs/confdialog.cxx:15127 msgid "Enable to use flrig FSK keyer" msgstr "Habilita per utilitzar flrig amb clau FSK" #: src/dialogs/confdialog.cxx:15140 src/dialogs/confdialog.cxx:15252 #: src/dialogs/confdialog.cxx:15254 msgid "Modem/TTY/nanoIO" msgstr "Mòdem - TTY / nanoIO" #: src/dialogs/confdialog.cxx:15163 msgid "Serial Baud" msgstr "Baud en sèrie" #: src/dialogs/confdialog.cxx:15178 msgid "USB serial I/O" msgstr "USB sèrie I/O" #: src/dialogs/confdialog.cxx:15199 msgid "MARK polarity" msgstr "Polaritat del senyal" #: src/dialogs/confdialog.cxx:15200 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" "Estableix - senyal ALT lògic\n" "Llegeix de nanoIO" #: src/dialogs/confdialog.cxx:15205 msgid "TTY Baud" msgstr "TTY Bauds" #: src/dialogs/confdialog.cxx:15206 msgid "nanoIO - TTY baud" msgstr "nanoIO - bauds TTY" #: src/dialogs/confdialog.cxx:15222 msgid "Debug Output" msgstr "Sortida de depuració" #: src/dialogs/confdialog.cxx:15232 msgid "Clear Sent" msgstr "Esborra enviat" #: src/dialogs/confdialog.cxx:15235 msgid "Clear Both" msgstr "Esborra tots dos" #: src/dialogs/confdialog.cxx:15238 msgid "Clear Rcvd" msgstr "Esborra RX" #: src/dialogs/confdialog.cxx:15247 msgid "TTY i/o" msgstr "TTY i/o" #: src/dialogs/confdialog.cxx:15248 msgid "Enable TTY operation" msgstr "Activa l'operació TTY" #: src/dialogs/confdialog.cxx:15257 src/dialogs/confdialog.cxx:15485 #: src/dialogs/confdialog.cxx:15487 msgid "Modem/TTY/Navigator" msgstr "Mòdem - TTY / Navigator" #: src/dialogs/confdialog.cxx:15261 msgid "FSK Interface" msgstr "Interfície FSK" #: src/dialogs/confdialog.cxx:15265 msgid "Navigator serial port" msgstr "Port sèrie del Navigator" #: src/dialogs/confdialog.cxx:15279 msgid "FSK" msgstr "FSK" #: src/dialogs/confdialog.cxx:15280 msgid "Connect / Disconnect from Nav FSK port" msgstr "Connectar/desconnectar del port Nav FSK" #: src/dialogs/confdialog.cxx:15285 src/dialogs/confdialog.cxx:15550 msgid "Configuration Interface" msgstr "Configuració de la Interfície" #: src/dialogs/confdialog.cxx:15289 msgid "Navigator configuration port" msgstr "Port de configuració del Navigator" #: src/dialogs/confdialog.cxx:15303 msgid "Channel 1 Attenuator" msgstr "Atenuador del canal 1" #: src/dialogs/confdialog.cxx:15304 msgid "Nav Channel 1 attenuator" msgstr "Atenuador del canal 1 del Nav" #: src/dialogs/confdialog.cxx:15319 msgid "Channel 2 attenuator" msgstr "Atenuador del canal 2" #: src/dialogs/confdialog.cxx:15320 msgid "NavChannel 2 Attenuator" msgstr "Atenuador del canal 2 del Nav" #: src/dialogs/confdialog.cxx:15335 msgid "RF attenuator" msgstr "Atenuador de RF" #: src/dialogs/confdialog.cxx:15336 msgid "NavRF Attenuator" msgstr "Atenuador KPSQL" #: src/dialogs/confdialog.cxx:15351 msgid "WinKey PTT" msgstr "PTT WinKey" #: src/dialogs/confdialog.cxx:15352 src/dialogs/confdialog.cxx:15586 msgid "NavWinkey PTT" msgstr "PTT NavWinKey" #: src/dialogs/confdialog.cxx:15367 msgid "LED brightness" msgstr "Lluminositat LED" #: src/dialogs/confdialog.cxx:15368 msgid "NavLED brightness" msgstr "Brillantor NavLED" #: src/dialogs/confdialog.cxx:15383 msgid "CAT LED state" msgstr "Estat del LED CAT" #: src/dialogs/confdialog.cxx:15384 msgid "NavCAT state LED" msgstr "LED d'estat NavCAT" #: src/dialogs/confdialog.cxx:15400 src/dialogs/confdialog.cxx:15554 msgid "Nav FSK baud rate" msgstr "Velocitat en bauds de Nav FSK" #: src/dialogs/confdialog.cxx:15416 src/dialogs/confdialog.cxx:15570 msgid "Nav FSK Stop bits" msgstr "Bits d'aturada de Nav FSK" #: src/dialogs/confdialog.cxx:15431 src/dialogs/confdialog.cxx:15601 msgid "Mark Polarity" msgstr "Polaritat del senyal" #: src/dialogs/confdialog.cxx:15432 src/dialogs/confdialog.cxx:15602 msgid "Nav FSK MARK Polarity" msgstr "Polaritat del senyal Nav FSK" #: src/dialogs/confdialog.cxx:15447 msgid "Side tone" msgstr "To lateral" #: src/dialogs/confdialog.cxx:15448 src/dialogs/confdialog.cxx:15618 #: src/dialogs/confdialog.cxx:15634 msgid "Nav FSK side tone" msgstr "To lateral del Nav FSK" #: src/dialogs/confdialog.cxx:15463 msgid "FSK PTT" msgstr "PTT del FSK" #: src/dialogs/confdialog.cxx:15464 msgid "Nav FSK PTT - should always be on" msgstr "PTT del Nav FSK - hauria d'estar sempre encès" #: src/dialogs/confdialog.cxx:15479 msgid "Config" msgstr "Configuració" #: src/dialogs/confdialog.cxx:15480 msgid "Connect / Disconnect from Nav Config port" msgstr "Connecta/Desconnecta del port Nav Config" #: src/dialogs/confdialog.cxx:15490 src/dialogs/confdialog.cxx:15516 #: src/dialogs/confdialog.cxx:15518 msgid "Modem/TTY/Synop" msgstr "Mòdem - TTY / Synop" #: src/dialogs/confdialog.cxx:15494 msgid "SYNOP to ADIF" msgstr "SYNOP a ADIF" #: src/dialogs/confdialog.cxx:15495 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "" "Descodifica els missatges SYNOP (Exemple: Deutsche Wetterdienst) al fitxer " "de registre ADIF" #: src/dialogs/confdialog.cxx:15501 msgid "SYNOP to KML" msgstr "SYNOP a KML" #: src/dialogs/confdialog.cxx:15502 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Descodifica els missatges SYNOP (Exemple: Deutsche Wetterdienst) a documents " "KML (Exemple: Google Earth)" #: src/dialogs/confdialog.cxx:15509 msgid "Interleave SYNOP and text" msgstr "Intercalar SYNOP i text" #: src/dialogs/confdialog.cxx:15510 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "Intercalar text amb missatges SYNOP descodificats o substituir-los." #: src/dialogs/confdialog.cxx:15521 src/dialogs/confdialog.cxx:15715 #: src/dialogs/confdialog.cxx:15717 msgid "Modem/TTY/Winkeyer 3" msgstr "Mòdem - TTY / Winkeyer 3" #: src/dialogs/confdialog.cxx:15525 msgid "Serial Interface" msgstr "Interfície sèrie" #: src/dialogs/confdialog.cxx:15585 msgid "FSK port" msgstr "Port FSK" #: src/dialogs/confdialog.cxx:15633 msgid "Auto CRLF" msgstr "CRLF automàtic" #: src/dialogs/confdialog.cxx:15649 msgid "Diddle" msgstr "Diddle" #: src/dialogs/confdialog.cxx:15650 msgid "Diddle On/OFF" msgstr "Diddle Encès/Apagat" #: src/dialogs/confdialog.cxx:15665 msgid "Diddle char" msgstr "Caràcter Diddle" #: src/dialogs/confdialog.cxx:15666 msgid "Diddle character" msgstr "Caràcter Diddle" #: src/dialogs/confdialog.cxx:15681 msgid "USOS" msgstr "USOS" #: src/dialogs/confdialog.cxx:15682 src/dialogs/confdialog.cxx:15698 msgid "Unshift on space" msgstr "No saltar a l'espai" #: src/dialogs/confdialog.cxx:15697 msgid "Echo" msgstr "Ressò" #: src/dialogs/confdialog.cxx:15720 src/dialogs/confdialog.cxx:15833 #: src/dialogs/confdialog.cxx:15835 msgid "Modem/Thor" msgstr "Mòdem - Thor" #: src/dialogs/confdialog.cxx:15740 msgid "Enable DSP prior to decoder" msgstr "Habilita DSP abans del descodificador" #: src/dialogs/confdialog.cxx:15782 msgid "Preamble Detection" msgstr "Detecció de preàmbuls" #: src/dialogs/confdialog.cxx:15783 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" "Detecta el preàmbul de THOR\n" "Neteja la canalització de recepció" #: src/dialogs/confdialog.cxx:15788 msgid "Soft-symbol decoding" msgstr "Descodificació suau de símbols" #: src/dialogs/confdialog.cxx:15789 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" "Utilitza la descodificació de decisions suaus per a la detecció de símbols\n" "Ajuda a la descodificació de bits suaus" #: src/dialogs/confdialog.cxx:15794 msgid "Soft-bit decoding" msgstr "Descodificació suau de bits" #: src/dialogs/confdialog.cxx:15795 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "Utilitza la descodificació viterbi de bits suaus per a una millor correcció " "d'errors de capdavant\n" "Funciona millor amb la descodificació de símbols suaus activada" #: src/dialogs/confdialog.cxx:15821 #, fuzzy #| msgid "Operator Call" msgid "" "\n" "Operator Avatar" msgstr "Nom de l'operador" #: src/dialogs/confdialog.cxx:15838 src/dialogs/confdialog.cxx:15853 #: src/dialogs/confdialog.cxx:15855 msgid "Modem/Navtex" msgstr "Mòdem - Navtex" #: src/dialogs/confdialog.cxx:15842 msgid "Log Navtex messages to Adif file" msgstr "Registre els missatges Navtex al fitxer Adif" #: src/dialogs/confdialog.cxx:15847 msgid "Log Navtex messages to KML" msgstr "Registre els missatges Navtex al KML" #: src/dialogs/confdialog.cxx:15848 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" "Registra missatges a Keyhole Markup Language (Google Earth, Marble, Gaia, " "etc...)" #: src/dialogs/confdialog.cxx:15858 src/dialogs/confdialog.cxx:15979 #: src/dialogs/confdialog.cxx:15981 msgid "Modem/Wefax" msgstr "Mòdem - Wefax" #: src/dialogs/confdialog.cxx:15862 msgid "Frequency shift" msgstr "Salt de freqüència" #: src/dialogs/confdialog.cxx:15863 msgid "" "Frequency shift of WEFAX signal\n" "Nominal 800 Hz" msgstr "" "Canvi de freqüència del senyal WEFAX\n" "800 Hz nominals" #: src/dialogs/confdialog.cxx:15874 msgid "" "Center of WEFAX signal\n" "Nominal 1900 Hz" msgstr "" "Centre del senyal WEFAX\n" "Nominal 1900 Hz" #: src/dialogs/confdialog.cxx:15884 msgid "Max Image Rows" msgstr "Files Màx. a la imatge" #: src/dialogs/confdialog.cxx:15885 msgid "Force save split image" msgstr "Força desar la imatge dividida" #: src/dialogs/confdialog.cxx:15895 msgid "Fax images destination directory" msgstr "Directori de destinació d'imatges de fax" #: src/dialogs/confdialog.cxx:15896 msgid "Store images in this directory" msgstr "Emmagatzema les imatges en aquest directori" #: src/dialogs/confdialog.cxx:15901 msgid "Directory..." msgstr "Directori..." #: src/dialogs/confdialog.cxx:15902 msgid "Select destination directory" msgstr "Selecciona el directori de destinació" #: src/dialogs/confdialog.cxx:15905 msgid "Log Wefax messages to Adif file" msgstr "Registrea els missatges de Wefax al fitxer Adif" #: src/dialogs/confdialog.cxx:15906 msgid "Sent and received faxes are logged to Adif file." msgstr "Els faxos enviats i rebuts es registren al fitxer Adif." #: src/dialogs/confdialog.cxx:15911 src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtre" #: src/dialogs/confdialog.cxx:15917 msgid "Enable Auto-align after" msgstr "Activa després l'alineació automàtica" #: src/dialogs/confdialog.cxx:15927 msgid "Stop Auto-align after" msgstr "Atura després l'alineació automàtica" #: src/dialogs/confdialog.cxx:15937 msgid "Auto-align every" msgstr "Alinea automàticament cada" #: src/dialogs/confdialog.cxx:15947 src/dialogs/confdialog.cxx:15950 #: src/dialogs/confdialog.cxx:15953 msgid "rows" msgstr "files" #: src/dialogs/confdialog.cxx:15956 msgid "Correlation" msgstr "Correlació" #: src/dialogs/confdialog.cxx:15957 msgid "" "Row-to-row correlation\n" "Used to detect presence of WEFAX signal\n" "Lower: more false detections" msgstr "" "Correlació fila a fila\n" "S'utilitza per detectar la presència del senyal WEFAX\n" "Inferior: més deteccions falses" #: src/dialogs/confdialog.cxx:15968 msgid "# Correlation rows" msgstr "# Files de correlació" #: src/dialogs/confdialog.cxx:15969 msgid "Compute correlation factor over this # rows" msgstr "Calcula el factor de correlació en aquestes # files" #: src/dialogs/confdialog.cxx:15984 src/dialogs/confdialog.cxx:16185 #: src/dialogs/confdialog.cxx:16187 msgid "Misc/Autostart" msgstr "Diversos - Arrencada automàtica" #: src/dialogs/confdialog.cxx:15988 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:15989 msgid "Enter full path-filename for flrig" msgstr "Introdueix el nom del fitxer de ruta complet per a flrig" #: src/dialogs/confdialog.cxx:16003 msgid "Locate flrig executable" msgstr "Localitza l'executable flrig" #: src/dialogs/confdialog.cxx:16006 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16007 msgid "Enter full path-filename for flamp" msgstr "Introdueix el nom del fitxer de ruta complet per a flamp" #: src/dialogs/confdialog.cxx:16021 msgid "Locate flamp executable" msgstr "Localitza l'executable de flamp" #: src/dialogs/confdialog.cxx:16024 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16025 msgid "Enter full path-filename for flnet" msgstr "Introdueix el nom del fitxer de ruta complet per a flnet" #: src/dialogs/confdialog.cxx:16039 msgid "Locate flnet executable" msgstr "Localitza l'executable de flnet" #: src/dialogs/confdialog.cxx:16042 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16043 msgid "Enter full path-filename for fllog" msgstr "Introdueix el nom del fitxer de ruta complet per a fllog" #: src/dialogs/confdialog.cxx:16057 msgid "Locate fllog executable" msgstr "Localitza l'executable fllog" #: src/dialogs/confdialog.cxx:16060 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:16061 src/dialogs/confdialog.cxx:16079 #: src/dialogs/confdialog.cxx:16097 msgid "Enter full path-filename for external program" msgstr "Introdueix el nom del fitxer de ruta complet per al programa extern" #: src/dialogs/confdialog.cxx:16075 msgid "Locate program #1 executable" msgstr "Localitza l'executable del programa número #1" #: src/dialogs/confdialog.cxx:16078 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:16093 msgid "Locate program #2 executable" msgstr "Localitza l'executable del programa número #2" #: src/dialogs/confdialog.cxx:16096 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:16111 msgid "Locate program #3 executable" msgstr "Localitza l'executable del programa número #3" #: src/dialogs/confdialog.cxx:16114 msgid "" "Enable\n" "-" msgstr "" "Activar\n" "-" # Revisar estilo (@HK4QWC) # @CO7WT De esta forma es más sencillo y al estar en contexto en la interfaz se intuye el significado #: src/dialogs/confdialog.cxx:16115 src/dialogs/confdialog.cxx:16122 #: src/dialogs/confdialog.cxx:16128 src/dialogs/confdialog.cxx:16134 #: src/dialogs/confdialog.cxx:16140 src/dialogs/confdialog.cxx:16146 #: src/dialogs/confdialog.cxx:16152 msgid "Enable this entry when fldigi first starts" msgstr "Activa aquesta entrada quan s'iniciï fldigi" #: src/dialogs/confdialog.cxx:16158 msgid "Start flrig" msgstr "Iniciar flrig" #: src/dialogs/confdialog.cxx:16162 msgid "Start flamp" msgstr "Iniciar flamp" #: src/dialogs/confdialog.cxx:16166 msgid "Start flnet" msgstr "Iniciar flnet" #: src/dialogs/confdialog.cxx:16170 msgid "Start fllog" msgstr "Iniciar fllog" #: src/dialogs/confdialog.cxx:16174 msgid "Start prog1" msgstr "Iniciar prog 1" #: src/dialogs/confdialog.cxx:16178 msgid "Start prog2" msgstr "Iniciar prog 2" #: src/dialogs/confdialog.cxx:16182 msgid "Start prog3" msgstr "Iniciar prog 3" #: src/dialogs/confdialog.cxx:16190 src/dialogs/confdialog.cxx:16200 #: src/dialogs/confdialog.cxx:16202 msgid "Misc/CPU" msgstr "Diversos - CPU" #: src/dialogs/confdialog.cxx:16194 msgid "Slow CPU (less than 700MHz)" msgstr "CPU lenta (menys de 700 Mhz.)" #: src/dialogs/confdialog.cxx:16195 msgid "Enable if you're computer does not decode properly" msgstr "Activa si l'ordinador no es descodifica correctament" #: src/dialogs/confdialog.cxx:16205 src/dialogs/confdialog.cxx:16215 #: src/dialogs/confdialog.cxx:16217 msgid "Misc/DTMF" msgstr "Diversos - DTMF" #: src/dialogs/confdialog.cxx:16209 msgid "Decode DTMF tones" msgstr "Descodificar tons DTMF" #: src/dialogs/confdialog.cxx:16210 msgid "Decode received DTMF tones" msgstr "Descodificar els tons DTMF rebuts" #: src/dialogs/confdialog.cxx:16220 src/dialogs/confdialog.cxx:16323 #: src/dialogs/confdialog.cxx:16325 msgid "Misc/KML" msgstr "Diversos - KLM" #: src/dialogs/confdialog.cxx:16224 msgid "KML files directory" msgstr "Directori de fitxers KML" #: src/dialogs/confdialog.cxx:16225 msgid "Where generated KML documents are stored." msgstr "On s'emmagatzemen els documents KML generats." #: src/dialogs/confdialog.cxx:16230 msgid "KML root file" msgstr "Arrel del fitxer KML" #: src/dialogs/confdialog.cxx:16234 msgid "Minimum distance for splitting aliases (Meters)" msgstr "Distància mínima per dividir els àlies (metres)" #: src/dialogs/confdialog.cxx:16235 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "Distància mínima per dividir els nodes d'àlies (metres)" #: src/dialogs/confdialog.cxx:16245 msgid "Data retention time, in hours (0 for no limit)" msgstr "Temps de retenció de dades, en hores (0 sense límit)" #: src/dialogs/confdialog.cxx:16246 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" "Les dades del nombre d'hores es conserven per a cada node. Zero significa " "conservar-ho tot." #: src/dialogs/confdialog.cxx:16255 msgid "KML refresh interval (seconds)" msgstr "Interval d'actualització KML (segons)" #: src/dialogs/confdialog.cxx:16256 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Interval de temps d'actualització escrit al fitxer KML (segons)" #: src/dialogs/confdialog.cxx:16272 msgid "KML balloon display style" msgstr "Estil de visualització de globus KML" #: src/dialogs/confdialog.cxx:16273 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "Globus KML en text sense format, o HTML, en taules o matrius simples." #: src/dialogs/confdialog.cxx:16288 msgid "Command run on KML creation" msgstr "L'ordre s'executa en la creació de KML" #: src/dialogs/confdialog.cxx:16289 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "L'ordre s'ha iniciat quan es generen els fitxers KML. Els subprocessos " "s'inicien una vegada i es reinicien si cal." #: src/dialogs/confdialog.cxx:16295 msgid "Test command" msgstr "Comandament de prova" #: src/dialogs/confdialog.cxx:16296 msgid "Execute command on KML files." msgstr "Executa l'ordre als fitxers KML." #: src/dialogs/confdialog.cxx:16299 msgid "Change dir..." msgstr "Canvia directori..." #: src/dialogs/confdialog.cxx:16300 msgid "Choose directory to store KML documents" msgstr "Tria el directori per emmagatzemar els documents KML" #: src/dialogs/confdialog.cxx:16303 msgid "Cleanup KML data now !" msgstr "Neteja les dades KML ara!" #: src/dialogs/confdialog.cxx:16304 msgid "Cleanups KML documents, empties Google Earth display." msgstr "Neteja els documents KML i buida la pantalla de Google Earth." #: src/dialogs/confdialog.cxx:16307 msgid "Cleanup on startup" msgstr "Neteja a l'inici" #: src/dialogs/confdialog.cxx:16308 msgid "Empties KML documents when starting program." msgstr "Buida els documents KML quan s'inicia el programa." #: src/dialogs/confdialog.cxx:16315 msgid "KML server enabled (On / Off)" msgstr "Servidor KML habilitat (activat / desactivat)" #: src/dialogs/confdialog.cxx:16316 msgid "Uncheck if KML is never used" msgstr "Desmarca si mai s'utilitza KML" #: src/dialogs/confdialog.cxx:16328 src/dialogs/confdialog.cxx:16410 #: src/dialogs/confdialog.cxx:16412 msgid "Misc/NBEMS interface" msgstr "Diversos - interfície NBEMS" #: src/dialogs/confdialog.cxx:16332 msgid "NBEMS data file interface" msgstr "interfície de dades NBEMS" #: src/dialogs/confdialog.cxx:16336 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "" "Extreu els fitxers per utilitzar-los amb el programa extern \"wrap / flmsg\"" #: src/dialogs/confdialog.cxx:16341 msgid "Open message folder" msgstr "Obre la carpeta de missatges" #: src/dialogs/confdialog.cxx:16342 msgid "Opens NBEMS file folder upon successful capture" msgstr "Obre la carpeta dels fitxers NBEMS després de la captura correcta" #: src/dialogs/confdialog.cxx:16349 msgid "Reception of flmsg files" msgstr "Recepció de fitxers flmsg" #: src/dialogs/confdialog.cxx:16352 msgid "Open with flmsg" msgstr "Obre amb flmsg" #: src/dialogs/confdialog.cxx:16353 msgid "Open message with flmsg" msgstr "Obre el missatge amb flmsg" #: src/dialogs/confdialog.cxx:16358 msgid "Open in browser" msgstr "Obre al navegador" #: src/dialogs/confdialog.cxx:16359 msgid "Open file with default browser" msgstr "Obre el fitxer amb el navegador predeterminat" #: src/dialogs/confdialog.cxx:16364 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:16365 msgid "Enter full path-filename for flmsg" msgstr "Introdueix el nom del fitxer de ruta complet per a flmsg" #: src/dialogs/confdialog.cxx:16378 msgid "Locate flmsg" msgstr "Localitza flmsg" #: src/dialogs/confdialog.cxx:16382 msgid "Timeout (secs)" msgstr "Límit de temps (seg)" #: src/dialogs/confdialog.cxx:16383 msgid "Extract times out after NN seconds of inactivity." msgstr "El temps d'extracte s'espera després de NN segons d'inactivitat." #: src/dialogs/confdialog.cxx:16396 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" "La selecció de transferència directa té prioritat\n" "sobre tots els altres paràmetres de recepció de flmsg" #: src/dialogs/confdialog.cxx:16400 msgid "Transfer direct to executing flmsg" msgstr "Transferència directa a l'execució de flmsg" #: src/dialogs/confdialog.cxx:16401 msgid "Send data stream directly to executing flmsg" msgstr "Envia el flux de dades directament a l'execució de flmsg" #: src/dialogs/confdialog.cxx:16415 src/dialogs/confdialog.cxx:16493 #: src/dialogs/confdialog.cxx:16495 msgid "Misc/PSK reporter" msgstr "Diversos - PSK Reporter" #: src/dialogs/confdialog.cxx:16419 msgid "Automatically spot callsigns in decoded text" msgstr "" "Localitza automàticament els indicatius de trucada en un text descodificat" #: src/dialogs/confdialog.cxx:16420 msgid "Parse all incoming text" msgstr "Analitza tot el text entrant" #: src/dialogs/confdialog.cxx:16425 msgid "Send reception report when logging a QSO" msgstr "Envia un informe de recepció quan registris un QSO" #: src/dialogs/confdialog.cxx:16426 msgid "Send report only when QSO is logged" msgstr "Envia l'informe només quan el QSO estigui registrat" #: src/dialogs/confdialog.cxx:16431 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "" "Informa de la freqüència del equip (activa només si tens control de " "l'equip !)" #: src/dialogs/confdialog.cxx:16432 msgid "Include the transmit frequency" msgstr "Inclou la freqüència de transmissió" #: src/dialogs/confdialog.cxx:16437 msgid "Disable spotting when signal browser(s) are not visible." msgstr "" "Desactiva la detecció quan els navegadors de senyal no siguin visibles." #: src/dialogs/confdialog.cxx:16438 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Marca per reduir la càrrega de la CPU en els modes PSK i RTTY." #: src/dialogs/confdialog.cxx:16444 msgid "Log on to pskrep when starting fldigi" msgstr "Inicia la sessió a PSKReporter quan iniciïs fldigi" #: src/dialogs/confdialog.cxx:16445 msgid "Automatically start psk reporter socket connection" msgstr "Inicia automàticament la connexió de PSKReporter" #: src/dialogs/confdialog.cxx:16455 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:16456 msgid "To whom the connection is made" msgstr "A qui es fa la connexió" #: src/dialogs/confdialog.cxx:16470 msgid "Port:" msgstr "Port:" #: src/dialogs/confdialog.cxx:16471 msgid "Using UDP port #" msgstr "Utilitzant el port UDP #" #: src/dialogs/confdialog.cxx:16486 msgid "Initialize the socket client" msgstr "Inicialitzar el client del sòcol" #: src/dialogs/confdialog.cxx:16489 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:16498 src/dialogs/confdialog.cxx:16668 #: src/dialogs/confdialog.cxx:16670 msgid "Misc/PSM" msgstr "Diversos - PSM" #: src/dialogs/confdialog.cxx:16505 msgid "Allow TX After Signal Detection (Secs)" msgstr "Permet la TX després de la detecció del senyal (segons)" #: src/dialogs/confdialog.cxx:16506 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "" "Permet la transmissió després de \"N\" segons de la detecció d'un senyal." #: src/dialogs/confdialog.cxx:16516 msgid "Enable Busy Channel" msgstr "Activa el canal ocupat" #: src/dialogs/confdialog.cxx:16517 msgid "Enable to inhibit TX on signal Detections" msgstr "Habilita per inhibir la transmissió en deteccions de senyal" #: src/dialogs/confdialog.cxx:16523 msgid "TX Buffer Flush Timer (Mins, 0=Disable)" msgstr "Temporitzador de buffer de TX (minuts, 0 = desactivat)" #: src/dialogs/confdialog.cxx:16524 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" "Esborra la memòria intermèdia de transmissió després de x període quan el " "canal ocupat roman activat (TX inhibit)" #: src/dialogs/confdialog.cxx:16535 msgid "Modem Bandwidth Margins " msgstr "Marges d'ample de banda del mòdem " #: src/dialogs/confdialog.cxx:16536 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "Supervisa els senyals en l'amplada de banda del mòdem més els marges." #: src/dialogs/confdialog.cxx:16546 msgid "Valid Signal Sample Period (msecs)" msgstr "Període de mostra del senyal vàlid (ms)" #: src/dialogs/confdialog.cxx:16547 msgid "Valid signal sample period in Milliseconds" msgstr "Període de mostra del senyal vàlid en mili segons" #: src/dialogs/confdialog.cxx:16562 msgid "Enable CSMA" msgstr "Activar CSMA" #: src/dialogs/confdialog.cxx:16563 msgid "Carrier Sense Mulitiple Access" msgstr "Accés múltiple de portadora escoltada" #: src/dialogs/confdialog.cxx:16568 msgid "Persistance" msgstr "Persistència" #: src/dialogs/confdialog.cxx:16569 msgid "Used to adjust the aggressiveness of TX" msgstr "S'utilitza per ajustar l'agressivitat de la transmissió" #: src/dialogs/confdialog.cxx:16579 msgid "Slot Time" msgstr "Ranura de temps" #: src/dialogs/confdialog.cxx:16580 msgid "Non transmit window after a transmit period" msgstr "Finestra de no transmissió després d'un període de transmissió" #: src/dialogs/confdialog.cxx:16590 msgid "Transmit Data Delay" msgstr "Retard de transmissió de dades" #: src/dialogs/confdialog.cxx:16591 msgid "Idle transmit before data sent" msgstr "Transmissió inactiva abans de l'enviament de dades" #: src/dialogs/confdialog.cxx:16601 src/dialogs/confdialog.cxx:16605 msgid "MilliSeconds" msgstr "Mili segons" #: src/dialogs/confdialog.cxx:16602 src/dialogs/confdialog.cxx:16610 msgid "Displays the Slot Time in Milliseconds" msgstr "Mostra el temps de l'espai en mili segons" #: src/dialogs/confdialog.cxx:16606 msgid "Displays the Transmit Delay in Milliseconds" msgstr "Mostra el retard de transmissió en mili segons" #: src/dialogs/confdialog.cxx:16609 msgid "Percent (%)" msgstr "Percentatge (%)" #: src/dialogs/confdialog.cxx:16618 msgid "Enable Histogram" msgstr "Activa l'histograma" #: src/dialogs/confdialog.cxx:16619 msgid "Enable Histogram threshold signal monitoring" msgstr "Activa la supervisió del senyal del llindar de l'histograma" #: src/dialogs/confdialog.cxx:16624 msgid "PSM Histogram Threshold" msgstr "Llindar d'histograma PSM" #: src/dialogs/confdialog.cxx:16625 msgid "Sets the theshold level to x value above the noise level" msgstr "" "Estableix el nivell de llindar en un valor x per sobre del nivell de soroll" #: src/dialogs/confdialog.cxx:16640 msgid "PSM Attenuate" msgstr "Atenuació PSM" #: src/dialogs/confdialog.cxx:16641 msgid "Adjust sensitivity by 1/N fractional values." msgstr "Ajusta la sensibilitat amb valors fraccionats 1/N." #: src/dialogs/confdialog.cxx:16657 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "Mostra i activa el botó del monitor de senyal d'alimentació (PSM)" #: src/dialogs/confdialog.cxx:16658 msgid "display PSM button on main dialog" msgstr "mostrar el botó PSM al diàleg principal" #: src/dialogs/confdialog.cxx:16665 msgid "Default Settings" msgstr "Configuració per defecte" #: src/dialogs/confdialog.cxx:16673 src/dialogs/confdialog.cxx:16705 #: src/dialogs/confdialog.cxx:16707 msgid "Misc/Rx text capture" msgstr "Diversos - Captura de text de recepció" #: src/dialogs/confdialog.cxx:16677 msgid "Talker Socket (MS only)" msgstr "Connexió Talker (només MS)" #: src/dialogs/confdialog.cxx:16680 msgid "Talker" msgstr "Talker" #: src/dialogs/confdialog.cxx:16684 msgid "Connect/disconnect to Talker socket server" msgstr "Connectar/desconnectar del servidor Talker" #: src/dialogs/confdialog.cxx:16687 msgid "Auto connect when fldigi opens (server must be up)" msgstr "" "Connexió automàtica quan s'obre fldigi (el servidor ha d'estar activat)" #: src/dialogs/confdialog.cxx:16694 msgid "Capture rx text to external file" msgstr "Captura el text de RX a un fitxer extern" #: src/dialogs/confdialog.cxx:16697 msgid "Enable rx text stream" msgstr "Activa el flux de text de RX" #: src/dialogs/confdialog.cxx:16698 msgid "Send rx text to file: textout.txt" msgstr "Envia el text de RX al fitxer: textout.txt" #: src/dialogs/confdialog.cxx:16710 src/dialogs/confdialog.cxx:16748 #: src/dialogs/confdialog.cxx:16750 msgid "Misc/Save Parameters" msgstr "Diversos - Guarda els paràmetres" #: src/dialogs/confdialog.cxx:16714 msgid "Transmit level control" msgstr "Control de nivell de transmissió" #: src/dialogs/confdialog.cxx:16715 msgid "Save transmit level control by mode" msgstr "Desa el control de nivell de transmissió per mode" #: src/dialogs/confdialog.cxx:16721 msgid "Squelch level/activated control(s)" msgstr "Nivell de silenciador/controls activats" #: src/dialogs/confdialog.cxx:16722 msgid "Save Squelch level and state by mode" msgstr "Desa el nivell i l'estat de Squelch per mode" #: src/dialogs/confdialog.cxx:16728 msgid "Enable specific parameter to Save & Restore on a per mode/band basis." msgstr "" "Habilita un paràmetre específic per desar i restaurar per mode i banda." #: src/dialogs/confdialog.cxx:16734 msgid "AFC control" msgstr "Control AFC" #: src/dialogs/confdialog.cxx:16735 msgid "Save AFC state by mode" msgstr "Desa l'estat del AFC per mode" #: src/dialogs/confdialog.cxx:16741 msgid "Reverse (Rv) control" msgstr "Control invers (Rv)" #: src/dialogs/confdialog.cxx:16742 msgid "Save Reverse state by mode" msgstr "Desa l'estat invers per mode" #: src/dialogs/confdialog.cxx:16753 src/dialogs/confdialog.cxx:16837 #: src/dialogs/confdialog.cxx:16839 msgid "Misc/Sweet Spot" msgstr "Diversos - Punt dolç" #: src/dialogs/confdialog.cxx:16760 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:16761 msgid "Default CW tracking point" msgstr "Punt predeterminat de seguiment de CW" #: src/dialogs/confdialog.cxx:16779 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:16780 msgid "Default RTTY tracking point" msgstr "Punt predeterminat de seguiment de RTTY" #: src/dialogs/confdialog.cxx:16798 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:16799 msgid "Default for all other modems" msgstr "Per defecte per a la resta de mòdems" #: src/dialogs/confdialog.cxx:16817 msgid "Always start new modems at these frequencies" msgstr "Inicia sempre mòdems nous a aquestes freqüències" #: src/dialogs/confdialog.cxx:16818 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "Marcat : comença per defecte\n" "Desmarcat : manté la posició actual del cursor a la cascada" #: src/dialogs/confdialog.cxx:16826 msgid "K3 A1A configuation" msgstr "Configuració Elecraft K3 A1A" #: src/dialogs/confdialog.cxx:16829 msgid "CW is LSB" msgstr "CW es LSB" #: src/dialogs/confdialog.cxx:16830 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Selecciona-ho per a l'Elecraft K3\n" "La resta d'equips no ho necessiten." #: src/dialogs/confdialog.cxx:16842 src/dialogs/confdialog.cxx:17166 #: src/dialogs/confdialog.cxx:17168 msgid "Misc/TCP-IP sessions" msgstr "Diversos - Sessions TCP-IP" #: src/dialogs/confdialog.cxx:16850 msgid "Lock" msgstr "Bloqueig" #: src/dialogs/confdialog.cxx:16851 msgid "Allow/Disallow Changes" msgstr "Permetre/No permetre els canvis" #: src/dialogs/confdialog.cxx:16856 msgid "Enable ARQ" msgstr "Activar ARQ" #: src/dialogs/confdialog.cxx:16857 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "S'utilitza per a programes PSKMail i FLDIGI Suite" #: src/dialogs/confdialog.cxx:16864 msgid "Enable KISS" msgstr "Activar KISS" #: src/dialogs/confdialog.cxx:16865 msgid "Used for BPQ32" msgstr "S'utilitza per a BPQ32" #: src/dialogs/confdialog.cxx:16872 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" "Habilita ARQ per a programes que admeten el protocol TCP i FLDIGI ARQ.\n" "Habilita KISS per a programes que admetin el protocol TCP/UDP i TNC-2 KISS.\n" "Només una interfície (ARQ/KISS) pot estar activa en cada moment.\n" "Els canvis d'adreça/port de KISS/ARQ/XML requereixen un reinici del programa." #: src/dialogs/confdialog.cxx:16879 msgid "KISS" msgstr "KISS" #: src/dialogs/confdialog.cxx:16882 src/dialogs/confdialog.cxx:16999 #: src/dialogs/confdialog.cxx:17051 src/dialogs/confdialog.cxx:17098 #: src/dialogs/confdialog.cxx:17140 src/dialogs/confdialog.cxx:17352 msgid "Addr" msgstr "Addr" #: src/dialogs/confdialog.cxx:16883 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Adreça IP per a la interfície KISS\n" "Format de l'adreça IP: nnn.nnn.nnn.nnn\n" "o nom: és a dir, localhost" #: src/dialogs/confdialog.cxx:16899 msgid "I/O" msgstr "I/O" # Aunque el texto en inglés aparece como "IP Address Port Number" considero que la traducción debe ser "Número del puerto" ya que se refiere a la opción del puerto UDP al que se establece la conexión (@HK4QWC) #: src/dialogs/confdialog.cxx:16900 src/dialogs/confdialog.cxx:17017 #: src/dialogs/confdialog.cxx:17069 src/dialogs/confdialog.cxx:17116 #: src/dialogs/confdialog.cxx:17149 src/dialogs/confdialog.cxx:17369 msgid "IP Address Port Number" msgstr "Número de port de l'adreça IP" #: src/dialogs/confdialog.cxx:16916 msgid "Output port number when same IP address used" msgstr "Número de port de sortida quan s'utilitza la mateixa adreça IP" #: src/dialogs/confdialog.cxx:16931 msgid "DP" msgstr "DP" #: src/dialogs/confdialog.cxx:16932 msgid "Enable when both programs are using the same IP address" msgstr "Activa-ho quan tots dos programes utilitzen la mateixa adreça IP" #: src/dialogs/confdialog.cxx:16938 src/dialogs/confdialog.cxx:17037 #: src/dialogs/confdialog.cxx:17084 msgid "Restart" msgstr "Reinicia" #: src/dialogs/confdialog.cxx:16942 msgid "Start" msgstr "Inici" #: src/dialogs/confdialog.cxx:16943 msgid "Return KISS TCP IO connection to a Listening state" msgstr "Retorna la connexió KISS TCP IO a l'estat d'escolta" #: src/dialogs/confdialog.cxx:16952 msgid "TCP/IP" msgstr "TCP/IP" #: src/dialogs/confdialog.cxx:16953 msgid "Check to enable TCP/IP IO Connection" msgstr "Marca per habilitar la connexió TCP/IP IO" #: src/dialogs/confdialog.cxx:16959 msgid "UDP/IP" msgstr "UDP/IP" #: src/dialogs/confdialog.cxx:16960 msgid "Check to enable UDP/IP IO" msgstr "Marca per habilitar UDP/IP IO" #: src/dialogs/confdialog.cxx:16966 msgid "Listen / Bind" msgstr "Escolta / Enllaçar" #: src/dialogs/confdialog.cxx:16967 msgid "Monitor for TCP connection." msgstr "Supervisar la connexió TCP." #: src/dialogs/confdialog.cxx:16973 msgid "Inhibit 7bit Modem" msgstr "Inhibició del mòdem de 7 bits" #: src/dialogs/confdialog.cxx:16974 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "" "Inhibició de l'avís de canvi de mòdem de 7 bits a la recepció de l'usuari o " "RSID" #: src/dialogs/confdialog.cxx:16980 msgid "Auto Connect / Retry" msgstr "Connexió automàtica/Torna-ho a provar" #: src/dialogs/confdialog.cxx:16981 msgid "Connect to host program on FLDIGI start up" msgstr "Connecta't al programa amfitrió de l'inici de FLDIGI" #: src/dialogs/confdialog.cxx:16987 msgid "AX25 Decode" msgstr "Descodificació AX25" #: src/dialogs/confdialog.cxx:16988 msgid "Decode AX25 Packets into human readable form" msgstr "Descodifica els paquets AX25 en forma llegible" #: src/dialogs/confdialog.cxx:16996 msgid "ARQ" msgstr "ARQ" #: src/dialogs/confdialog.cxx:17000 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Adreça IP per a la interfície ARQ\n" "Format de l'adreça IP: nnn.nnn.nnn.nnn\n" "o nom: és a dir, localhost" #: src/dialogs/confdialog.cxx:17043 msgid "XML" msgstr "XML" #: src/dialogs/confdialog.cxx:17052 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Adreça IP per a la interfície XMLRPC\n" "Format de l'adreça IP: nnn.nnn.nnn.nnn\n" "o nom: és a dir, localhost" #: src/dialogs/confdialog.cxx:17090 msgid "flrig" msgstr "flrig" #: src/dialogs/confdialog.cxx:17099 src/dialogs/confdialog.cxx:17353 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Adreça IP per a la interfície flrig\n" "Format de l'adreça IP: nnn.nnn.nnn.nnn\n" "o nom: és a dir, localhost" #: src/dialogs/confdialog.cxx:17131 src/dialogs/confdialog.cxx:17155 #: src/dialogs/confdialog.cxx:17383 msgid "Reconnect" msgstr "Torna a connectar" #: src/dialogs/confdialog.cxx:17137 msgid "fllog" msgstr "fllog" #: src/dialogs/confdialog.cxx:17141 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "Adreça IP per a la interfície fllog\n" "Format de l'adreça IP: nnn.nnn.nnn.nnn\n" "o nom: és a dir, localhost" #: src/dialogs/confdialog.cxx:17172 src/dialogs/confdialog.cxx:17323 #: src/dialogs/confdialog.cxx:17325 msgid "Operator-Station" msgstr "Operador - Estació" #: src/dialogs/confdialog.cxx:17177 msgid "Station Callsign:" msgstr "Indicatiu de l'estació :" #: src/dialogs/confdialog.cxx:17178 msgid "Station callsign" msgstr "Indicatiu de l'estació" #: src/dialogs/confdialog.cxx:17191 msgid "Operator Callsign:" msgstr "Indicatiu del operador :" #: src/dialogs/confdialog.cxx:17192 msgid "Operator callsign (if different than station callsign)" msgstr "Indicatiu de l'operador (si és diferent del indicatiu de l'estació)" #: src/dialogs/confdialog.cxx:17206 msgid "Operator Name:" msgstr "Nom de l'operador :" #: src/dialogs/confdialog.cxx:17207 msgid "Operators name" msgstr "Nom de l'operador" #: src/dialogs/confdialog.cxx:17220 msgid "Antenna:" msgstr "Antena:" #: src/dialogs/confdialog.cxx:17221 msgid "Short description of antenna" msgstr "Descripció de l'antena" #: src/dialogs/confdialog.cxx:17234 #, fuzzy #| msgid "Station LOC" msgid "Station City:" msgstr "Locator" #: src/dialogs/confdialog.cxx:17249 msgid "Station Locator:" msgstr "Locator :" #: src/dialogs/confdialog.cxx:17250 msgid "Maidenhead locator as in EM64qv" msgstr "Locator Maidenhead com exemple JN01VM" #: src/dialogs/confdialog.cxx:17263 #, fuzzy #| msgid "State / Provinces" msgid "State/Prov./Country" msgstr "Estat USA / Província CA" #: src/dialogs/confdialog.cxx:17264 msgid "US States / Canadian Provinces" msgstr "Estat USA / Província canadenca" #: src/dialogs/confdialog.cxx:17281 msgid "Abbreviation for State/Province" msgstr "Abreviatura d'estat/província" #: src/dialogs/confdialog.cxx:17293 msgid "Counties / Regions" msgstr "Comptat / Regió" #: src/dialogs/confdialog.cxx:17294 msgid "US/Canadian Counties / Regions" msgstr "Comtats/regions dels EUA/ Províncies Canadenques" #: src/dialogs/confdialog.cxx:17311 msgid "Abbreviation for County/Region" msgstr "Abreviatura de comtat/regió" #: src/dialogs/confdialog.cxx:17328 src/dialogs/confdialog.cxx:17426 #: src/dialogs/confdialog.cxx:17428 msgid "Rig Control/flrig" msgstr "Control de l'equip - flrig" #: src/dialogs/confdialog.cxx:17332 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" "\"Desactiva el mòdem de tecles PTT si hi ha diverses instàncies de fldigi " "(client)\n" "estan connectats a un sol flrig (servidor)." #: src/dialogs/confdialog.cxx:17336 msgid "Flrig PTT keys modem" msgstr "Mòdem de tecles PTT Flrig" #: src/dialogs/confdialog.cxx:17337 msgid "\" \"" msgstr "\" \"" #: src/dialogs/confdialog.cxx:17344 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" "paràmetres del servidor flrig xmlrpc\n" "aquests controls es reflecteixen a la pestanya de configuració d'IO" #: src/dialogs/confdialog.cxx:17384 msgid "Press only if you change the address/port" msgstr "Prem només si canvies l'adreça/port" #: src/dialogs/confdialog.cxx:17389 msgid "flrig is the preferred method of tranceiver control" msgstr "flrig és el mètode preferit de control de l'equip de ràdio" #: src/dialogs/confdialog.cxx:17392 msgid "Enable flrig xcvr control with fldigi as client" msgstr "Habilita el control flrig xcvr amb fldigi com a client" #: src/dialogs/confdialog.cxx:17393 src/dialogs/confdialog.cxx:17399 msgid "Disable if flrig not used." msgstr "Desactiva si no utilitzes flrig." #: src/dialogs/confdialog.cxx:17398 msgid "Shutdown flrig with fldigi" msgstr "Tanca el flrig amb fldigi" #: src/dialogs/confdialog.cxx:17404 msgid "Poll Interval (msec)" msgstr "Interval d'enquesta (ms)" #: src/dialogs/confdialog.cxx:17405 msgid "Request updates every 'poll interval' milliseconds" msgstr "Sol·licita actualitzacions cada \"interval d'enquesta\" mili segons" #: src/dialogs/confdialog.cxx:17431 src/dialogs/confdialog.cxx:17634 #: src/dialogs/confdialog.cxx:17636 msgid "Rig Control/CAT (rigcat)" msgstr "Control de l'equip - CAT (rigcat)" #: src/dialogs/confdialog.cxx:17435 msgid "Use RigCAT" msgstr "Utilitza RigCAT" #: src/dialogs/confdialog.cxx:17436 msgid "RigCAT used for rig control" msgstr "RigCAT utilitzat per al control de l'equip de ràdio" #: src/dialogs/confdialog.cxx:17443 msgid "Rig description file:" msgstr "Fitxer de descripció de l'equip :" #: src/dialogs/confdialog.cxx:17444 msgid "Use Open to select descriptor file" msgstr "Utilitza Obre per seleccionar el fitxer descriptor" #: src/dialogs/confdialog.cxx:17450 msgid "Select rig descriptor file" msgstr "Selecciona el fitxer descriptor de l'equip" # Config > Control del radio > Hamlib: # Dispositivo queda apretado, propongo traducir por # P. Serie: # Que quedará mejor y se entiende @ CO7WT # También se usa para el dispositivo de audio OSS… entonces mejor usar "Puerto:" @HK4QWC #: src/dialogs/confdialog.cxx:17454 src/dialogs/confdialog.cxx:17940 #: src/dialogs/confdialog.cxx:18210 src/dialogs/confdialog.cxx:18551 msgid "Device:" msgstr "Dispositiu :" #: src/dialogs/confdialog.cxx:17469 src/dialogs/confdialog.cxx:17955 msgid "Retries" msgstr "Reintents" #: src/dialogs/confdialog.cxx:17470 msgid "# retries before giving up" msgstr "# re-intents abans de donar-se per vençut" #: src/dialogs/confdialog.cxx:17486 msgid "Retry interval (ms)" msgstr "Interval entre re-intents (ms)" #: src/dialogs/confdialog.cxx:17487 msgid "Time between retires in msec" msgstr "Temps entre re-intents en ms" #: src/dialogs/confdialog.cxx:17503 msgid "Write delay (ms)" msgstr "Retard d'escriptura (ms)" #: src/dialogs/confdialog.cxx:17504 msgid "Wait for response to subsequent command" msgstr "Espera la resposta a l'ordre següent" #: src/dialogs/confdialog.cxx:17520 src/dialogs/confdialog.cxx:18023 msgid "Baud rate:" msgstr "Velocitat de transmissió :" #: src/dialogs/confdialog.cxx:17536 src/dialogs/confdialog.cxx:18039 msgid "Stopbits" msgstr "Bits de parada" #: src/dialogs/confdialog.cxx:17556 msgid "Initialize RigCAT interface" msgstr "Inicialitzar la interfície RigCAT" #: src/dialogs/confdialog.cxx:17560 msgid "Commands are echoed" msgstr "Les ordres es fan ressò" #: src/dialogs/confdialog.cxx:17561 msgid "Rig or interface echos serial data" msgstr "L'equip de ràdio o la interfície emet dades en sèrie" #: src/dialogs/confdialog.cxx:17566 msgid "CAT command for PTT" msgstr "Ordre CAT per a PTT" #: src/dialogs/confdialog.cxx:17567 msgid "PTT is a CAT command (not hardware)" msgstr "PTT és una ordre CAT (no maquinari)" #: src/dialogs/confdialog.cxx:17573 msgid "Toggle RTS for PTT" msgstr "Commuta RTS per PTT" #: src/dialogs/confdialog.cxx:17574 msgid "RTS is ptt line" msgstr "RTS és la línia PTT" #: src/dialogs/confdialog.cxx:17579 msgid "Toggle DTR for PTT" msgstr "Commuta DTR per PTT" #: src/dialogs/confdialog.cxx:17580 msgid "DTR is ptt line" msgstr "DTR és la línia PTT" #: src/dialogs/confdialog.cxx:17585 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:17586 src/dialogs/confdialog.cxx:18096 msgid "Initial state of RTS" msgstr "Estat inicial del RTS" #: src/dialogs/confdialog.cxx:17591 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:17592 src/dialogs/confdialog.cxx:18090 msgid "Initial state of DTR" msgstr "Estat inicial del DTR" #: src/dialogs/confdialog.cxx:17597 src/dialogs/confdialog.cxx:18101 msgid "RTS/CTS flow control" msgstr "Control de flux RTS/CTS" #: src/dialogs/confdialog.cxx:17598 msgid "Rig uses RTS/CTS handshake" msgstr "L'equip de ràdio utilitza l'enllaç RTS/CTS" #: src/dialogs/confdialog.cxx:17603 msgid "Restore UART Settings on Close" msgstr "Restaura la configuració UART al Tancar" #: src/dialogs/confdialog.cxx:17604 msgid "Restore the serial (COM) port settings" msgstr "Restaura la configuració del port sèrie (COM)" #: src/dialogs/confdialog.cxx:17609 msgid "VSP Enable" msgstr "Habilita VSP" #: src/dialogs/confdialog.cxx:17610 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Emulador de port sèrie virtual: suprimeix els ADVERTIMENTS" #: src/dialogs/confdialog.cxx:17615 msgid "Init delay (ms)" msgstr "Retard d'inici (ms)" #: src/dialogs/confdialog.cxx:17616 msgid "Wait for response to first CAT command" msgstr "Espera la resposta a la primera ordre CAT" #: src/dialogs/confdialog.cxx:17639 src/dialogs/confdialog.cxx:17910 #: src/dialogs/confdialog.cxx:17912 msgid "Rig Control/GPIO" msgstr "Control de l'equip - GPIO" #: src/dialogs/confdialog.cxx:17643 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "Habilita GPIO PTT (controls específics de Pi)" #: src/dialogs/confdialog.cxx:17644 src/dialogs/confdialog.cxx:17778 #: src/dialogs/confdialog.cxx:17785 src/dialogs/confdialog.cxx:17792 #: src/dialogs/confdialog.cxx:17799 src/dialogs/confdialog.cxx:17806 #: src/dialogs/confdialog.cxx:17813 src/dialogs/confdialog.cxx:17820 #: src/dialogs/confdialog.cxx:17827 src/dialogs/confdialog.cxx:17834 #: src/dialogs/confdialog.cxx:17841 src/dialogs/confdialog.cxx:17848 #: src/dialogs/confdialog.cxx:17855 src/dialogs/confdialog.cxx:17862 #: src/dialogs/confdialog.cxx:17869 src/dialogs/confdialog.cxx:17876 #: src/dialogs/confdialog.cxx:17883 src/dialogs/confdialog.cxx:17890 #: src/dialogs/confdialog.cxx:18263 msgid "Select PTT on state" msgstr "Selecciona PTT a l'estat" #: src/dialogs/confdialog.cxx:17651 src/dialogs/confdialog.cxx:18270 msgid "Initialize the H/W PTT interface" msgstr "Inicialitzar la interfície H/W PTT" #: src/dialogs/confdialog.cxx:17654 src/dialogs/confdialog.cxx:17896 msgid "BCM GPIO pin Value" msgstr "Valor del pin GPIO de BCM" #: src/dialogs/confdialog.cxx:17658 msgid "17 00 11" msgstr "17 00 11" #: src/dialogs/confdialog.cxx:17659 src/dialogs/confdialog.cxx:17666 #: src/dialogs/confdialog.cxx:17673 src/dialogs/confdialog.cxx:17680 #: src/dialogs/confdialog.cxx:17687 src/dialogs/confdialog.cxx:17694 #: src/dialogs/confdialog.cxx:17701 src/dialogs/confdialog.cxx:17708 #: src/dialogs/confdialog.cxx:17715 src/dialogs/confdialog.cxx:17722 #: src/dialogs/confdialog.cxx:17729 src/dialogs/confdialog.cxx:17736 #: src/dialogs/confdialog.cxx:17743 src/dialogs/confdialog.cxx:17750 #: src/dialogs/confdialog.cxx:17757 src/dialogs/confdialog.cxx:17764 #: src/dialogs/confdialog.cxx:17771 msgid "Select pin number" msgstr "Selecciona el número de pin" #: src/dialogs/confdialog.cxx:17665 msgid "18 01 12" msgstr "18 01 12" #: src/dialogs/confdialog.cxx:17672 msgid "27 02 13" msgstr "27 02 13" #: src/dialogs/confdialog.cxx:17679 msgid "22 03 15" msgstr "22 03 15" #: src/dialogs/confdialog.cxx:17686 msgid "23 04 16" msgstr "23 04 16" #: src/dialogs/confdialog.cxx:17693 msgid "24 05 18" msgstr "24 05 18" #: src/dialogs/confdialog.cxx:17700 msgid "25 06 22" msgstr "25 06 22" #: src/dialogs/confdialog.cxx:17707 msgid " 4 07 7" msgstr " 4 07 7" #: src/dialogs/confdialog.cxx:17714 msgid " 5 21 29" msgstr " 5 21 29" #: src/dialogs/confdialog.cxx:17721 msgid " 6 22 31" msgstr " 6 22 31" #: src/dialogs/confdialog.cxx:17728 msgid "13 23 33" msgstr "13 23 33" #: src/dialogs/confdialog.cxx:17735 msgid "19 24 35" msgstr "19 24 35" #: src/dialogs/confdialog.cxx:17742 msgid "26 25 37" msgstr "26 25 37" #: src/dialogs/confdialog.cxx:17749 msgid "12 26 32" msgstr "12 26 32" #: src/dialogs/confdialog.cxx:17756 msgid "16 27 36" msgstr "16 27 36" #: src/dialogs/confdialog.cxx:17763 msgid "20 28 38" msgstr "20 28 38" #: src/dialogs/confdialog.cxx:17770 msgid "21 29 40" msgstr "21 29 40" #: src/dialogs/confdialog.cxx:17777 src/dialogs/confdialog.cxx:17784 #: src/dialogs/confdialog.cxx:17791 src/dialogs/confdialog.cxx:17798 #: src/dialogs/confdialog.cxx:17805 src/dialogs/confdialog.cxx:17812 #: src/dialogs/confdialog.cxx:17819 src/dialogs/confdialog.cxx:17826 #: src/dialogs/confdialog.cxx:17833 src/dialogs/confdialog.cxx:17840 #: src/dialogs/confdialog.cxx:17847 src/dialogs/confdialog.cxx:17854 #: src/dialogs/confdialog.cxx:17861 src/dialogs/confdialog.cxx:17868 #: src/dialogs/confdialog.cxx:17875 src/dialogs/confdialog.cxx:17882 #: src/dialogs/confdialog.cxx:17889 msgid "= 1 (on)" msgstr "= 1 (activat)" #: src/dialogs/confdialog.cxx:17900 msgid "Pulse width (msec)" msgstr "Amplada polsada (ms)" #: src/dialogs/confdialog.cxx:17901 msgid "Set >0 if pulsed PTT used" msgstr "Estableix >0 si s'utilitza PTT polsat" #: src/dialogs/confdialog.cxx:17919 msgid "Use Hamlib" msgstr "Utilitza Hamlib" #: src/dialogs/confdialog.cxx:17920 msgid "Hamlib used for rig control" msgstr "Hamlib utilitzat per al control de l'equip de ràdio" # Config > Control del radio > Hamlib: # No cabe Radio, porque está diseñado para Rig, desborda el marco. Incluso al redibujar la interfaz se pierde la palabra… # Se propone # Rad.: # @CO7WT #: src/dialogs/confdialog.cxx:17926 msgid "Rig:" msgstr "Equip :" #: src/dialogs/confdialog.cxx:17956 msgid "# times to resend command before giving up" msgstr "# vegades per tornar a enviar l'ordre abans de renunciar" #: src/dialogs/confdialog.cxx:17972 msgid "Timeout (msec)" msgstr "Límit de temps (mseg)" #: src/dialogs/confdialog.cxx:17973 msgid "Hamlib read timeout" msgstr "Llegir el límit de temps de Hamlib" #: src/dialogs/confdialog.cxx:17989 msgid "Write delay (msec)" msgstr "Retard d'escriptura (ms)" #: src/dialogs/confdialog.cxx:17990 msgid "Msec's between sequential commands" msgstr "Msec entre ordres seqüencials" #: src/dialogs/confdialog.cxx:18006 msgid "Post write delay (msec)" msgstr "Retard d'escriptura posterior (ms)" #: src/dialogs/confdialog.cxx:18007 msgid "Wait interval (msecs) before reading response" msgstr "Interval d'espera (ms) abans de llegir la resposta" #: src/dialogs/confdialog.cxx:18058 msgid "Polling Interval (msec)" msgstr "Interval de sondeig (ms)" #: src/dialogs/confdialog.cxx:18077 msgid "PTT via Hamlib command" msgstr "PTT mitjançant l'ordre Hamlib" #: src/dialogs/confdialog.cxx:18078 msgid "PTT using hamlib command" msgstr "PTT utilitzant l'ordre hamlib" #: src/dialogs/confdialog.cxx:18083 msgid "Audio on Auxiliary Port" msgstr "Àudio al port auxiliar" #: src/dialogs/confdialog.cxx:18084 msgid "PTT enables auxiliary audio source" msgstr "PTT activa la font d'àudio auxiliar" #: src/dialogs/confdialog.cxx:18089 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:18095 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:18102 msgid "Rig requires RTS/CTS flow control" msgstr "L'equip requereix control de flux RTS/CTS" #: src/dialogs/confdialog.cxx:18108 msgid "XON/XOFF flow control" msgstr "Control de flux XON/XOFF" #: src/dialogs/confdialog.cxx:18109 msgid "Rig requires Xon/Xoff flow control" msgstr "L'equip requereix control de flux Xon/Xoff" #: src/dialogs/confdialog.cxx:18114 msgid "CW is LSB mode" msgstr "CW és en el mode LSB" #: src/dialogs/confdialog.cxx:18115 msgid "Check if xcvr uses LSB for CW" msgstr "Comprova si xcvr utilitza LSB per a CW" #: src/dialogs/confdialog.cxx:18120 msgid "RTTY is USB mode" msgstr "RTTY és el mode USB" #: src/dialogs/confdialog.cxx:18121 msgid "Check if xcvr uses USB for RTTY" msgstr "Comprova si xcvr utilitza USB per a RTTY" #: src/dialogs/confdialog.cxx:18126 msgid "Mode delay (msec)" msgstr "Retard del mode (ms)" #: src/dialogs/confdialog.cxx:18127 msgid "Delay NN msec after executing mode change" msgstr "Retard NN ms després d'executar el canvi de mode" #: src/dialogs/confdialog.cxx:18146 msgid "Sideband:" msgstr "Banda lateral:" #: src/dialogs/confdialog.cxx:18159 msgid "Advanced configuration:" msgstr "Configuració avançada :" #: src/dialogs/confdialog.cxx:18160 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Configuració opcional\n" "en el format: paràmetre=valor..." #: src/dialogs/confdialog.cxx:18175 msgid "Initialize hamlib interface" msgstr "Inicialitzar la interfície hamlib" #: src/dialogs/confdialog.cxx:18188 src/dialogs/confdialog.cxx:18300 #: src/dialogs/confdialog.cxx:18302 msgid "Rig Control/Hardware PTT" msgstr "Control de l'equip - Maquinari del PTT" #: src/dialogs/confdialog.cxx:18194 src/dialogs/confdialog.cxx:18674 msgid "PTT tone on right audio channel " msgstr "To PTT al canal dret d'àudio " #: src/dialogs/confdialog.cxx:18195 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Es pot utilitzar en lloc o a més d'altres tipus de PTT" #: src/dialogs/confdialog.cxx:18202 msgid "h/w ptt device-pin" msgstr "pin del PTT del dispositiu h/w" #: src/dialogs/confdialog.cxx:18205 msgid "Use separate serial port PTT" msgstr "Utilitza un port sèrie PTT independent" #: src/dialogs/confdialog.cxx:18225 msgid "Port is second SCU-17 device" msgstr "El port és el segon dispositiu SCU-17" #: src/dialogs/confdialog.cxx:18226 msgid "Driver requires stop bits to be ZERO!" msgstr "El Driver requereix que els bits de parada siguin ZERO!" #: src/dialogs/confdialog.cxx:18232 msgid "Use parallel port PTT" msgstr "Utilitza el port paral·lel PTT" #: src/dialogs/confdialog.cxx:18237 msgid "Use uHRouter PTT" msgstr "Utilitza uHRouter PTT" #: src/dialogs/confdialog.cxx:18242 msgid "Use RTS" msgstr "Utilitza RTS" #: src/dialogs/confdialog.cxx:18243 msgid "RTS is PTT signal line" msgstr "RTS és la línia de senyal PTT" #: src/dialogs/confdialog.cxx:18247 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:18248 msgid "Initial voltage on RTS" msgstr "Tensió inicial al RTS" #: src/dialogs/confdialog.cxx:18253 msgid "DTR is PTT signal line" msgstr "DTR és la línia de senyal PTT" #: src/dialogs/confdialog.cxx:18257 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:18258 msgid "Initial voltage on DTR" msgstr "Tensió inicial al DTR" #: src/dialogs/confdialog.cxx:18262 msgid "GPIO PTT (Pi specific controls)" msgstr "GPIO PTT (controls específics de Pi)" #: src/dialogs/confdialog.cxx:18275 msgid "PTT delays valid for all CAT/PTT types" msgstr "Retards de PTT vàlids per a tots els tipus CAT/PTT" #: src/dialogs/confdialog.cxx:18278 msgid "Start of transmit PTT delay" msgstr "Inici del retard de transmissió del PTT" #: src/dialogs/confdialog.cxx:18279 msgid "Delay NN msec before starting audio" msgstr "Retard NN ms abans d'iniciar l'àudio" #: src/dialogs/confdialog.cxx:18288 msgid "PTT end of transmit delay" msgstr "Final del retard de transmissió del PTT" #: src/dialogs/confdialog.cxx:18289 msgid "Delay NN msec before releasing PTT" msgstr "Retard NN ms abans de deixar anar el PTT" #: src/dialogs/confdialog.cxx:18306 src/dialogs/confdialog.cxx:18363 msgid "C-Media PTT" msgstr "C-Media PTT" #: src/dialogs/confdialog.cxx:18310 msgid "" "C-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. " "GPIO signal line 3 (pin 13) is used for PTT control.\n" "\n" "Fldigi accesses the GPIO lines as a Human Interface Device (HID). " "Discovered C-Media devices are enumerated in the 'C-Media device' list box.\n" "\n" "On Linux: add a file named cmedia.rules to /etc/udev/rules.d/\n" "The file should contain a single line\n" "\n" "KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"" msgstr "" "Els còdecs d'àudio C-Media utilitzats a la sèrie DRA tenen 8 pins GPIO " "controlables per l'usuari. La línia de senyal GPIO 3 (pin 13) s'utilitza per " "al control del PTT.\n" "Fldigi accedeix a les línies GPIO com a dispositiu d'interfície humana " "(HID). Els dispositius C-Media descoberts s'enumeren al quadre de la llista " "\"Dispositiu C-Media\".\n" "\n" "KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"" #: src/dialogs/confdialog.cxx:18319 msgid "Use C-Media PTT" msgstr "Utilitza C-Media PTT" #: src/dialogs/confdialog.cxx:18324 msgid "C-Media device" msgstr "Dispositiu C-Media" #: src/dialogs/confdialog.cxx:18339 msgid "GPIO line" msgstr "Línia GPIO" #: src/dialogs/confdialog.cxx:18356 msgid "Select device & Initialize the H/W PTT interface" msgstr "Selecciona el dispositiu i inicialitza la interfície H/W PTT" #: src/dialogs/confdialog.cxx:18359 msgid "TEST" msgstr "TEST" #: src/dialogs/confdialog.cxx:18360 msgid "Toggles PTT line 20x; check DRA-30 ptt LED" msgstr "Commuta la línia PTT 20x; comprova el LED del PTT DRA-30" #: src/dialogs/confdialog.cxx:18365 msgid "Rig Control/C-Media PTT" msgstr "Control de l'equip - C-Media PTT" #: src/dialogs/confdialog.cxx:18369 src/dialogs/confdialog.cxx:18534 #: src/dialogs/confdialog.cxx:18536 msgid "Soundcard/Alerts" msgstr "Targeta de so - Alertes" #: src/dialogs/confdialog.cxx:18378 msgid "REGEX detected wav" msgstr "REGEX detectat wav" #: src/dialogs/confdialog.cxx:18407 msgid "MYCALL detected wav" msgstr "El Meu Indicatiu ha detectat wav" #: src/dialogs/confdialog.cxx:18436 msgid "RsID audio alert wav" msgstr "Alerta d'àudio RsID wav" #: src/dialogs/confdialog.cxx:18465 msgid "flmsg received wav" msgstr "flmsg rebut wav" #: src/dialogs/confdialog.cxx:18489 msgid "flmsg timed out wav" msgstr "flmsg s'ha esgotar el temps wav" #: src/dialogs/confdialog.cxx:18515 msgid "Alert volume" msgstr "Alerta de Volum" #: src/dialogs/confdialog.cxx:18539 src/dialogs/confdialog.cxx:18646 #: src/dialogs/confdialog.cxx:18648 msgid "Soundcard/Devices" msgstr "Targeta de so - Dispositius" #: src/dialogs/confdialog.cxx:18545 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:18546 msgid "Use OSS audio server" msgstr "Utilitza el servidor d'àudio OSS" #: src/dialogs/confdialog.cxx:18552 msgid "Select device" msgstr "Selecciona el dispositiu" #: src/dialogs/confdialog.cxx:18560 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:18561 msgid "Use Port Audio server" msgstr "Utilitza el servidor Port Audio" #: src/dialogs/confdialog.cxx:18566 msgid "Capture:" msgstr "Captura :" #: src/dialogs/confdialog.cxx:18567 msgid "Audio input device" msgstr "Dispositiu d'entrada d'àudio" #: src/dialogs/confdialog.cxx:18571 msgid "Playback:" msgstr "Transmissió:" #: src/dialogs/confdialog.cxx:18572 src/dialogs/confdialog.cxx:18629 msgid "Audio output device" msgstr "Dispositiu de sortida d'àudio" #: src/dialogs/confdialog.cxx:18580 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:18581 msgid "Use Pulse Audio server" msgstr "Utilitza el servidor Pulse Audio" #: src/dialogs/confdialog.cxx:18586 msgid "Server string:" msgstr "Cadena del servidor :" #: src/dialogs/confdialog.cxx:18587 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Deixa-ho en blanc o consulteu\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:18605 msgid "File I/O only" msgstr "Només E/S de fitxers" #: src/dialogs/confdialog.cxx:18606 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "CAP DISPOSITIU D'ÀUDIO DISPONIBLE (o prova)" #: src/dialogs/confdialog.cxx:18615 msgid "Device supports full duplex" msgstr "El dispositiu admet dúplex complet" #: src/dialogs/confdialog.cxx:18616 msgid "Capture/Playback supports full duplex operation" msgstr "La recepció i transmissió admet el funcionament dúplex complet" #: src/dialogs/confdialog.cxx:18628 msgid "Audio device shared by Audio Alerts and Rx Monitor" msgstr "Dispositiu d'àudio compartit per Alertes d'àudio i Monitor RX" #: src/dialogs/confdialog.cxx:18635 msgid "First select audio alert playback device" msgstr "Primer selecciona el dispositiu de reproducció d'alerta d'àudio" #: src/dialogs/confdialog.cxx:18641 msgid "Note: must be selected and enabled for Rx Audio monitoring!" msgstr "Nota: s'ha de seleccionar i activar per al monitoratge d'àudio de RX!" #: src/dialogs/confdialog.cxx:18651 src/dialogs/confdialog.cxx:18708 #: src/dialogs/confdialog.cxx:18710 msgid "Soundcard/Right channel" msgstr "Targeta de so - Canal dret" #: src/dialogs/confdialog.cxx:18655 msgid "Transmit Usage" msgstr "Transmissió d'ús" #: src/dialogs/confdialog.cxx:18658 msgid "Modem signal on left and right channels" msgstr "Senyal de mòdem als canals esquerre i dret" #: src/dialogs/confdialog.cxx:18659 msgid "Left and right channels both contain modem audio" msgstr "Els canals esquerre i dret contenen àudio del mòdem" #: src/dialogs/confdialog.cxx:18664 src/dialogs/confdialog.cxx:18700 msgid "Reverse Left/Right channels" msgstr "Invertir els canals esquerre i dret" #: src/dialogs/confdialog.cxx:18665 src/dialogs/confdialog.cxx:18701 msgid "Software reversal of left-right audio channels" msgstr "Inversió de programari dels canals d'àudio esquerre i dret" #: src/dialogs/confdialog.cxx:18670 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Aquests controls es troben en altres pestanyes.\n" "Es reprodueixen aquí per comoditat.\n" "Pots canviar l'estat des de qualsevol ubicació.\n" "..." #: src/dialogs/confdialog.cxx:18675 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "To de 1000 Hz quan el PTT està activat\n" "Es pot utilitzar en lloc o a més d'altres tipus de PTT" #: src/dialogs/confdialog.cxx:18681 msgid "CW QSK signal on right channel" msgstr "Senyal CW QSK al canal dret" #: src/dialogs/confdialog.cxx:18682 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Genera un senyal d'ona quadrada de 1000 Hz al canal dret" #: src/dialogs/confdialog.cxx:18687 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK al canal d'àudio dret" #: src/dialogs/confdialog.cxx:18688 msgid "Create 1000 Hz square wave on right channel" msgstr "Crea una ona quadrada de 1000 Hz al canal dret" #: src/dialogs/confdialog.cxx:18697 msgid "Receive Usage" msgstr "Rebre ús" #: src/dialogs/confdialog.cxx:18713 src/dialogs/confdialog.cxx:18850 #: src/dialogs/confdialog.cxx:18852 msgid "Soundcard/Settings" msgstr "Targeta de so - Configuració" #: src/dialogs/confdialog.cxx:18720 msgid "Capture" msgstr "Recepció" #: src/dialogs/confdialog.cxx:18721 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Força una freqüència de mostreig específica. Selecciona \"Natiu\" si amb " "\"Auto\"\n" "no funciona bé amb el teu dispositiu d'àudio." #: src/dialogs/confdialog.cxx:18753 msgid "Converter" msgstr "Convertidor" #: src/dialogs/confdialog.cxx:18754 msgid "Set the type of resampler used of offset correction" msgstr "" "Estableix el tipus de remostreig utilitzat per a la correcció de desplaçament" #: src/dialogs/confdialog.cxx:18770 msgid "Corrections" msgstr "Correccions" #: src/dialogs/confdialog.cxx:18773 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:18774 msgid "RX sound card correction" msgstr "Correcció de la targeta de so en recepció" #: src/dialogs/confdialog.cxx:18790 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:18791 msgid "TX sound card correction" msgstr "Correcció de la targeta de so en transmissió" #: src/dialogs/confdialog.cxx:18807 msgid "TX offset" msgstr "Desplaçament de TX" #: src/dialogs/confdialog.cxx:18808 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Diferència entre freqüències RX i TX (offset de l'equip de ràdio)" #: src/dialogs/confdialog.cxx:18826 msgid "Frequency Analysis / FMT Rx Correction" msgstr "Anàlisi de freqüència - Correcció FMT de RX" #: src/dialogs/confdialog.cxx:18834 msgid "Frequency Correction" msgstr "Correcció de freqüència" #: src/dialogs/confdialog.cxx:18835 msgid "Used ONLY for frequency analysis mode" msgstr "S'utilitza NOMÉS per al mode d'anàlisi de freqüència" #: src/dialogs/confdialog.cxx:18855 msgid "Signal Level" msgstr "Nivell de senyal" #: src/dialogs/confdialog.cxx:18859 msgid "Signal Levels" msgstr "Nivell de senyals" #: src/dialogs/confdialog.cxx:18940 src/dialogs/confdialog.cxx:18942 msgid "Soundcard/Signal Level" msgstr "Targeta de so - nivell de senyal" #: src/dialogs/confdialog.cxx:18945 src/dialogs/confdialog.cxx:18971 #: src/dialogs/confdialog.cxx:18973 msgid "Soundcard/Wav file recording" msgstr "Enregistrament de fitxers de targeta de so - Wav" #: src/dialogs/confdialog.cxx:18949 msgid "Wav write sample rate" msgstr "Freqüència de mostreig d'escriptura Wav" #: src/dialogs/confdialog.cxx:18950 msgid "Pick baud rate from list" msgstr "Tria la velocitat de transmissió de la llista" #: src/dialogs/confdialog.cxx:18966 msgid "Record both channels" msgstr "Grava els dos canals" #: src/dialogs/confdialog.cxx:18977 src/dialogs/confdialog.cxx:19063 #: src/dialogs/confdialog.cxx:19065 msgid "UI/Browser/Channels" msgstr "Interfície d'usuari - Navegador / Canals" #: src/dialogs/confdialog.cxx:18981 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Canals, el primer canal comença al límit inferior de la cascada" #: src/dialogs/confdialog.cxx:18982 msgid "Change # of psk viewer channels" msgstr "Canvia el número de canals de visualització de psk" #: src/dialogs/confdialog.cxx:18999 msgid "Inactivity timeout" msgstr "Límit de temps d'inactivitat" #: src/dialogs/confdialog.cxx:19000 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Esborra el text del canal després\n" "# segons de inactivitat" #: src/dialogs/confdialog.cxx:19016 msgid "Channel label" msgstr "Etiqueta del canal" #: src/dialogs/confdialog.cxx:19017 msgid "Appearance of label on each channel" msgstr "Aspecte de l'etiqueta a cada canal" #: src/dialogs/confdialog.cxx:19028 msgid "Audio frequency" msgstr "Freqüència d'àudio" #: src/dialogs/confdialog.cxx:19029 msgid "Radio frequency" msgstr "Freqüència de Ràdio" #: src/dialogs/confdialog.cxx:19029 msgid "Channel number" msgstr "Número del canal" #: src/dialogs/confdialog.cxx:19034 src/dialogs/confdialog.cxx:19772 msgid "Font..." msgstr "Font..." #: src/dialogs/confdialog.cxx:19035 msgid "select browser font" msgstr "selecciona el tipus de lletra del navegador" #: src/dialogs/confdialog.cxx:19038 msgid "Fixed Intervals" msgstr "Intervals fixos" #: src/dialogs/confdialog.cxx:19039 msgid "Force channel spacing to even 100 Hz increments" msgstr "Força l'espaiat dels canals fins i tot a increments de 100 Hz" #: src/dialogs/confdialog.cxx:19045 msgid "Continuous scrolling" msgstr "Desplaçament continu" #: src/dialogs/confdialog.cxx:19046 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "Marcat : Estil carpa\n" "Desmarcat : esborra i reinicia" #: src/dialogs/confdialog.cxx:19051 msgid "Lowest freq on bottom of viewer" msgstr "Freqüència més baixa a la part inferior del visor" #: src/dialogs/confdialog.cxx:19052 msgid "Change positions of low to high channels" msgstr "Canvia les posicions dels canals de baix a d'alt" #: src/dialogs/confdialog.cxx:19057 msgid "Play back history when active channel selected" msgstr "Reprodueix l'historial quan selecciona el canal actiu" #: src/dialogs/confdialog.cxx:19058 msgid "Audio stream history decoded on selected signal" msgstr "Historial de transmissió d'àudio descodificat al senyal seleccionat" #: src/dialogs/confdialog.cxx:19068 src/dialogs/confdialog.cxx:19102 #: src/dialogs/confdialog.cxx:19104 msgid "UI/Browser/Colors" msgstr "Interfície d'usuari - Navegador/Colors" #: src/dialogs/confdialog.cxx:19072 msgid "HiLite 1" msgstr "HiLite 1" #: src/dialogs/confdialog.cxx:19073 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "Visor PSK/RTTY HiLite Color 1" #: src/dialogs/confdialog.cxx:19078 msgid "HiLite 2" msgstr "HiLite 2" #: src/dialogs/confdialog.cxx:19079 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "Visor PSK/RTTY HiLite Color 2" #: src/dialogs/confdialog.cxx:19084 msgid "Even" msgstr "Par" #: src/dialogs/confdialog.cxx:19085 msgid "Even lines" msgstr "Línies pars" #: src/dialogs/confdialog.cxx:19090 msgid "Odd" msgstr "Impar" #: src/dialogs/confdialog.cxx:19091 msgid "Odd lines" msgstr "Línies imparell" #: src/dialogs/confdialog.cxx:19097 msgid "Select line" msgstr "Seleccionar línia" #: src/dialogs/confdialog.cxx:19107 src/dialogs/confdialog.cxx:19123 #: src/dialogs/confdialog.cxx:19125 msgid "UI/Browser/Detection Level" msgstr "Interfície d'usuari - Navegador/Nivell de detecció" #: src/dialogs/confdialog.cxx:19111 msgid "Backgnd" msgstr "Fons" #: src/dialogs/confdialog.cxx:19112 msgid "Background color of signal viewer squelch control" msgstr "Color de fons del control del silenciador del visualitzador de senyals" #: src/dialogs/confdialog.cxx:19117 msgid "Button" msgstr "Botó" #: src/dialogs/confdialog.cxx:19118 msgid "Slider hilite color of signal viewer squelch control" msgstr "" "Control lliscant d'il·lita color del control del silenciador del visor de " "senyal" #: src/dialogs/confdialog.cxx:19128 src/dialogs/confdialog.cxx:19262 #: src/dialogs/confdialog.cxx:19264 msgid "UI/General" msgstr "Interfície d'usuari - General" #: src/dialogs/confdialog.cxx:19134 msgid "Show tooltips" msgstr "Mostra informació sobre eines" #: src/dialogs/confdialog.cxx:19135 msgid "Enable / disable tooltips" msgstr "Activar/desactivar la informació sobre les eines" #: src/dialogs/confdialog.cxx:19141 msgid "Show menu icons" msgstr "Mostrar icones del menú" #: src/dialogs/confdialog.cxx:19142 msgid "Enable / disable icons on menus" msgstr "Activar / desactivar les icones del menú" #: src/dialogs/confdialog.cxx:19147 msgid "UI scheme" msgstr "esquema d'IU" #: src/dialogs/confdialog.cxx:19148 msgid "Change application look and feel" msgstr "Canvia l'aspecte de l'aplicació" #: src/dialogs/confdialog.cxx:19166 msgid "Visible modes" msgstr "Modes visibles" #: src/dialogs/confdialog.cxx:19167 msgid "Select modes for menu access" msgstr "Selecciona els modes per accedir al menú" #: src/dialogs/confdialog.cxx:19170 msgid "UI language" msgstr "Idioma de la IU" #: src/dialogs/confdialog.cxx:19171 src/dialogs/confdialog.cxx:19915 msgid "Changes take effect on next program startup" msgstr "Els canvis tindran efecte en el proper inici del programa" #: src/dialogs/confdialog.cxx:19190 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Imprimeix CW / RTTY / THROB / CONTESTIA en minúscula" #: src/dialogs/confdialog.cxx:19200 msgid "Transmit lower case text" msgstr "Transmet text en minúscula" #: src/dialogs/confdialog.cxx:19207 msgid "Exit prompts" msgstr "Sol·licituds de sortida" #: src/dialogs/confdialog.cxx:19210 msgid "Prompt to save Configuration" msgstr "Sol·licitar per desar la configuració" #: src/dialogs/confdialog.cxx:19215 src/dialogs/confdialog.cxx:19377 msgid "Prompt to save macro file" msgstr "Sol·licitar per desar el fitxer de macro" #: src/dialogs/confdialog.cxx:19216 src/dialogs/confdialog.cxx:19378 msgid "Write current macro set on program exit" msgstr "Escriu el conjunt de macros actual a la sortida del programa" #: src/dialogs/confdialog.cxx:19221 msgid "Prompt to save log" msgstr "Sol·licitar per desar el registre" #: src/dialogs/confdialog.cxx:19227 msgid "Confirm exit" msgstr "Confirma la sortida" #: src/dialogs/confdialog.cxx:19234 msgid "Check for updates" msgstr "Buscar actualitzacions" #: src/dialogs/confdialog.cxx:19237 msgid "Check for updates when starting program" msgstr "Cerca actualitzacions en iniciar el programa" #: src/dialogs/confdialog.cxx:19247 msgid "Show TX timer" msgstr "Mostra el temporitzador de transmissió" #: src/dialogs/confdialog.cxx:19252 msgid "TX deadmen timeout (mins)" msgstr "Temps mort de TX (min) Límit de temps" #: src/dialogs/confdialog.cxx:19267 src/dialogs/confdialog.cxx:19405 #: src/dialogs/confdialog.cxx:19407 msgid "UI/Macro buttons" msgstr "Interfície d'usuari - Botons Macro" #: src/dialogs/confdialog.cxx:19273 msgid "Mouse wheel active on macro buttons" msgstr "La roda del ratolí activa als botons de macro" #: src/dialogs/confdialog.cxx:19274 msgid "enable mouse wheel control of macro bar" msgstr "habilita el control de la roda del ratolí de la barra de macros" #: src/dialogs/confdialog.cxx:19281 msgid "Number and position of macro bars" msgstr "Nombre i posició de les barres de macro" #: src/dialogs/confdialog.cxx:19284 msgid "Button Height" msgstr "Alçada del botó" #: src/dialogs/confdialog.cxx:19285 msgid "Height of macro bar" msgstr "Alçada de la barra macro" #: src/dialogs/confdialog.cxx:19295 msgid "One above Rx/Tx" msgstr "Un per sobre de RX/TX" #: src/dialogs/confdialog.cxx:19296 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" "Barra de macro única a sota del tauler de registre\n" "alçada variable" #: src/dialogs/confdialog.cxx:19301 msgid "One above waterfall" msgstr "Un a sobre de la cascada" #: src/dialogs/confdialog.cxx:19306 msgid "One below waterfall" msgstr "Un sota la cascada" #: src/dialogs/confdialog.cxx:19311 msgid "Two scheme 1" msgstr "Dos esquema 1" #: src/dialogs/confdialog.cxx:19316 msgid "Two scheme 2" msgstr "Dos esquema 2" #: src/dialogs/confdialog.cxx:19321 msgid "Two scheme 3" msgstr "Dos esquema 3" #: src/dialogs/confdialog.cxx:19326 msgid "Two scheme 4" msgstr "Dos esquema 4" #: src/dialogs/confdialog.cxx:19331 msgid "Two scheme 5" msgstr "Dos esquema 5" #: src/dialogs/confdialog.cxx:19336 msgid "Two scheme 6" msgstr "Dos esquema 6" #: src/dialogs/confdialog.cxx:19341 msgid "Two scheme 7" msgstr "Dos esquema 7" #: src/dialogs/confdialog.cxx:19346 msgid "Two scheme 8" msgstr "Dos esquema 8" #: src/dialogs/confdialog.cxx:19351 msgid "Two scheme 9" msgstr "Dos esquema 9" #: src/dialogs/confdialog.cxx:19356 msgid "Two scheme 10" msgstr "Dos esquema 10" #: src/dialogs/confdialog.cxx:19365 msgid "Load last used macro file at start" msgstr "Carrega l'últim fitxer de macro utilitzat a l'inici" #: src/dialogs/confdialog.cxx:19366 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "Marcat : utilitza l'últim conjunt de macros\n" "Desmarcat : utilitza el conjunt predeterminat" #: src/dialogs/confdialog.cxx:19371 msgid "Display macro filename at start" msgstr "Mostra el nom del fitxer de la macro a l'inici" #: src/dialogs/confdialog.cxx:19387 msgid "Show macro control codes" msgstr "Mostra els codis de control de macro" #: src/dialogs/confdialog.cxx:19388 msgid "print ^! execution codes in Rx panel" msgstr "imprimir ^! codis d'execució al panell de RX" #: src/dialogs/confdialog.cxx:19397 msgid "4 bar macro set below Tx" msgstr "Macro de 4 barres establert per sota de TX" #: src/dialogs/confdialog.cxx:19398 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" "Col·loca el conjunt de macros de 4 barres a sota del tauler de transmissió\n" "Per defecte a sobre del panell de recepció" #: src/dialogs/confdialog.cxx:19410 src/dialogs/confdialog.cxx:19454 #: src/dialogs/confdialog.cxx:19456 msgid "UI/Rx Text" msgstr "Interfície d'usuari - Text de recepció" #: src/dialogs/confdialog.cxx:19414 msgid "Single-click to capture" msgstr "Fes un sol clic per a capturar" #: src/dialogs/confdialog.cxx:19415 src/dialogs/confdialog.cxx:19444 msgid "Enable for single click capure of text in Rx panel" msgstr "Habilita la captura de text amb un sol clic al tauler de recepció" #: src/dialogs/confdialog.cxx:19420 msgid "callsign tooltips in received text" msgstr "informació sobre eines d'indicatiu al text rebut" #: src/dialogs/confdialog.cxx:19421 msgid "Popup info after a 2 second hover on a callsign" msgstr "" "Informació emergent després de passar el cursor 2 segons en un indicatiu" #: src/dialogs/confdialog.cxx:19426 msgid "Word delimiters" msgstr "Delimitadors de paraules" #: src/dialogs/confdialog.cxx:19427 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "L'entrada de dades del QSO del text de recepció està limitada\n" "pels caràcters que no són de paraula definit aquí. La pestanya i\n" "la nova línia s'inclouen automàticament." #: src/dialogs/confdialog.cxx:19443 msgid "US units of distance (QRB)" msgstr "Unitats de distància dels EUA (QRB)" #: src/dialogs/confdialog.cxx:19449 msgid "Clear log fields - new CALL" msgstr "Esborra els camps de registre: nou INDICATIU" #: src/dialogs/confdialog.cxx:19459 src/dialogs/confdialog.cxx:19494 #: src/dialogs/confdialog.cxx:19496 msgid "UI/Touch" msgstr "Interfície d'usuari - Toc" #: src/dialogs/confdialog.cxx:19463 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Nota:\n" "Aquests elements de configuració són útils per utilitzar fldigi a\n" "un dispositiu de pantalla tàctil com una tauleta." #: src/dialogs/confdialog.cxx:19467 msgid "Arrow Key Control of Frequency Entry" msgstr "Tecla de fletxa Control d'entrada de freqüència" #: src/dialogs/confdialog.cxx:19470 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" "Dreta/Esquerra = 1 x LSD\n" "Amunt/Avall= 10 x LSD\n" "Maj - Dreta/Esquerra = 100 x LSD\n" "Maj - Amunt/Avall = 1000 x LSD" #: src/dialogs/confdialog.cxx:19474 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" "Dreta/Esquerra\n" "Selecciona el dígit menys significatiu" #: src/dialogs/confdialog.cxx:19483 msgid "Rx / Tx Panels" msgstr "Panells RX / TX" #: src/dialogs/confdialog.cxx:19486 msgid "Tx above Rx" msgstr "Intercanvia panells de TX/RX" #: src/dialogs/confdialog.cxx:19487 msgid "Enable to put Tx panel above Rx panel" msgstr "Habilita per posar el panell de TX a sobre del panell de RX" #: src/dialogs/confdialog.cxx:19500 src/dialogs/confdialog.cxx:19580 #: src/dialogs/confdialog.cxx:19582 msgid "Waterfall/Buttons & Controls" msgstr "Cascada - Botons i Controls" # Propuesto por @HK4QWC # Habilite la casilla para mostrar el control de operador correspondiente # Propuesto por @CO7WT # Marcar para activar cada opción #: src/dialogs/confdialog.cxx:19504 msgid "Enable check box to show each respective operator control" msgstr "" "Activa la casella de selecció per mostrar cada control d'operador respectiu" #: src/dialogs/confdialog.cxx:19514 msgid "WF Magnification" msgstr "Ampliació de la cascada" #: src/dialogs/confdialog.cxx:19520 msgid "WF carrier" msgstr "Portadora de la cascada" #: src/dialogs/confdialog.cxx:19526 msgid "WF Shift Controls" msgstr "Controls de canvi de la cascada" #: src/dialogs/confdialog.cxx:19532 msgid "WF ref level" msgstr "Nivell de referència de la cascada" #: src/dialogs/confdialog.cxx:19538 msgid "WF drop rate" msgstr "Taxa de caiguda de la cascada" #: src/dialogs/confdialog.cxx:19544 msgid "WF amp span" msgstr "amplitud d'amplificació de la cascada" #: src/dialogs/confdialog.cxx:19550 msgid "WF Store" msgstr "Amagatzemar de la cascada" #: src/dialogs/confdialog.cxx:19556 msgid "WF mode" msgstr "Mode de la cascada" #: src/dialogs/confdialog.cxx:19562 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:19568 msgid "XMT lock" msgstr "Bloqueig de TX" #: src/dialogs/confdialog.cxx:19574 msgid "Enable all" msgstr "Habilita-ho tot" #: src/dialogs/confdialog.cxx:19577 msgid "Disable all" msgstr "Inhabilita-ho tot" #: src/dialogs/confdialog.cxx:19585 src/dialogs/confdialog.cxx:19800 #: src/dialogs/confdialog.cxx:19802 msgid "Waterfall/Display" msgstr "Cascada - Displai" #: src/dialogs/confdialog.cxx:19589 msgid "Colors and cursors" msgstr "Colors i cursors" #: src/dialogs/confdialog.cxx:19592 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:19607 src/dialogs/confdialog.cxx:19611 #: src/dialogs/confdialog.cxx:19615 src/dialogs/confdialog.cxx:19619 #: src/dialogs/confdialog.cxx:19623 src/dialogs/confdialog.cxx:19627 #: src/dialogs/confdialog.cxx:19631 src/dialogs/confdialog.cxx:19635 #: src/dialogs/confdialog.cxx:19639 src/dialogs/confdialog.cxx:19660 #: src/dialogs/confdialog.cxx:19683 src/dialogs/confdialog.cxx:19706 #: src/dialogs/confdialog.cxx:19723 src/dialogs/confdialog.cxx:19735 #: src/dialogs/confdialog.cxx:19748 msgid "Change color" msgstr "Canviar de color" #: src/dialogs/confdialog.cxx:19642 msgid "Load..." msgstr "Carrega..." #: src/dialogs/confdialog.cxx:19643 msgid "Load a new palette" msgstr "Carrega una paleta nova" #: src/dialogs/confdialog.cxx:19646 msgid "Save..." msgstr "Desa..." #: src/dialogs/confdialog.cxx:19647 msgid "Save this palette" msgstr "Desa aquesta paleta" #: src/dialogs/confdialog.cxx:19650 #, fuzzy #| msgid "Signal Browser" msgid "Signal BW" msgstr "Navegador de senyals" #: src/dialogs/confdialog.cxx:19653 src/dialogs/confdialog.cxx:19676 #: src/dialogs/confdialog.cxx:19699 msgid "ON" msgstr "ACTIVAT" #: src/dialogs/confdialog.cxx:19654 msgid "Show cursor with bandwidth lines" msgstr "Mostra el cursor amb línies d'ample de banda" #: src/dialogs/confdialog.cxx:19659 src/dialogs/confdialog.cxx:19682 #: src/dialogs/confdialog.cxx:19705 src/dialogs/confdialog.cxx:19722 #: src/dialogs/confdialog.cxx:19734 src/dialogs/confdialog.cxx:19747 #: src/dialogs/font_browser.cxx:177 msgid "Color" msgstr "Color" #: src/dialogs/confdialog.cxx:19666 src/dialogs/confdialog.cxx:19689 #: src/dialogs/confdialog.cxx:19712 src/dialogs/confdialog.cxx:19754 msgid "Wide" msgstr "Ample" #: src/dialogs/confdialog.cxx:19673 msgid "Center line" msgstr "Línia central" #: src/dialogs/confdialog.cxx:19677 msgid "Show cursor with center line" msgstr "Mostra el cursor amb la línia central" #: src/dialogs/confdialog.cxx:19696 #, fuzzy #| msgid "Signal tracks" msgid "Signal trks" msgstr "Pistes de senyal" #: src/dialogs/confdialog.cxx:19700 msgid "Show bandwidth tracks on waterfall" msgstr "Mostra les pistes d'ample de banda a la cascada" #: src/dialogs/confdialog.cxx:19719 msgid "Notch" msgstr "Notch" #: src/dialogs/confdialog.cxx:19731 #, fuzzy msgid "RsID Zone" msgstr "Recepción con RSID" #: src/dialogs/confdialog.cxx:19743 msgid "Monitor" msgstr "Monitor" #: src/dialogs/confdialog.cxx:19744 msgid "Audio monitor" msgstr "Monitor d'àudio" #: src/dialogs/confdialog.cxx:19763 msgid "Frequency scale" msgstr "Escala de freqüència" #: src/dialogs/confdialog.cxx:19766 msgid "Always show audio frequencies" msgstr "Mostra sempre les freqüències d'àudio" #: src/dialogs/confdialog.cxx:19767 msgid "Audio or RF frequencies on waterfall scale" msgstr "Freqüències d'àudio o RF a escala de cascada" #: src/dialogs/confdialog.cxx:19773 msgid "Select waterfall scale font" msgstr "Selecciona el tipus de lletra a escala de cascada" #: src/dialogs/confdialog.cxx:19778 msgid "Transmit signal" msgstr "Transmissió del senyal" #: src/dialogs/confdialog.cxx:19781 msgid "Monitor transmitted signal" msgstr "Monitoritzar el senyal transmès" #: src/dialogs/confdialog.cxx:19782 msgid "Show transmit signal on waterfall" msgstr "Mostra el senyal de transmissió a la cascada" #: src/dialogs/confdialog.cxx:19787 msgid "Signal Level (dB)" msgstr "Nivell de senyal (dB)" #: src/dialogs/confdialog.cxx:19788 msgid "Set level for good viewing" msgstr "Estableix el nivell per a una bona visualització" #: src/dialogs/confdialog.cxx:19805 src/dialogs/confdialog.cxx:19941 #: src/dialogs/confdialog.cxx:19943 msgid "Waterfall/FFT Processing" msgstr "Cascada - Processament FFT" #: src/dialogs/confdialog.cxx:19812 msgid "Low frequency limit in Hz" msgstr "Límit de baixa freqüència en Hz" #: src/dialogs/confdialog.cxx:19831 msgid "FFT averaging" msgstr "Mitjana de FFT" #: src/dialogs/confdialog.cxx:19832 msgid "Use averaging to decrease waterfall noise" msgstr "Utilitza la mitjana per reduir el soroll de la cascada" #: src/dialogs/confdialog.cxx:19837 msgid "FFT prefilter window function" msgstr "Funció de la finestra de prefiltre FFT" #: src/dialogs/confdialog.cxx:19849 msgid "Rectangular" msgstr "Rectangular" #: src/dialogs/confdialog.cxx:19851 msgid "Triangular" msgstr "Triangular" #: src/dialogs/confdialog.cxx:19857 msgid "High frequency limit in Hz" msgstr "Límit d'alta freqüència en Hz" #: src/dialogs/confdialog.cxx:19876 msgid "Latency" msgstr "Latència" #: src/dialogs/confdialog.cxx:19877 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" "Mitjana del senyal al llarg del temps\n" "0 - mínim\n" "4 - el més gran" #: src/dialogs/confdialog.cxx:19899 src/dialogs/confdialog.cxx:19916 msgid "Show me more or less waterfall" msgstr "Mostra'm més o menys cascada" #: src/dialogs/confdialog.cxx:19902 msgid "Slow drop rate" msgstr "Velocitat de caiguda lenta" #: src/dialogs/confdialog.cxx:19903 msgid "Normal drop speed / value" msgstr "Velocitat/valor de caiguda normal" #: src/dialogs/confdialog.cxx:19919 msgid "Waterfall height in pixels" msgstr "Alçada de la cascada en píxels" #: src/dialogs/confdialog.cxx:19920 msgid "CPU usage increases with waterfall height" msgstr "L'ús de la CPU augmenta amb l'alçada de la cascada" #: src/dialogs/confdialog.cxx:19946 src/dialogs/confdialog.cxx:20000 #: src/dialogs/confdialog.cxx:20002 msgid "Waterfall/Mouse usage" msgstr "Ús de la cascada - Ratolí" #: src/dialogs/confdialog.cxx:19952 msgid "Left or right click always replays audio history" msgstr "El clic esquerre o dret sempre reprodueix l'historial d'àudio" #: src/dialogs/confdialog.cxx:19953 msgid "Replay trackline audio" msgstr "Reprodueix l'àudio de la pista" #: src/dialogs/confdialog.cxx:19958 msgid "Dragging on the waterfall scale changes frequency" msgstr "Arrossegar l'escala de la cascada canvia la freqüència" #: src/dialogs/confdialog.cxx:19959 msgid "Enable drag cursor on waterfall scale" msgstr "Habilita el cursor d'arrossegar a l'escala de la cascada" #: src/dialogs/confdialog.cxx:19964 msgid "Insert text on single left click" msgstr "Insereix text amb un sol clic esquerre" #: src/dialogs/confdialog.cxx:19965 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Insereix un text especial al tauler de RX\n" "després de fer clic a la cascada" #: src/dialogs/confdialog.cxx:19971 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "La cadena es substitueix per\n" "el mòdem i la freqüència actuals" #: src/dialogs/confdialog.cxx:19983 msgid "Wheel action" msgstr "Acció de la roda del ratolí" #: src/dialogs/confdialog.cxx:19984 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Selecciona com gira la roda del ratolí\n" "es comporta dins de la cascada" #: src/dialogs/confdialog.cxx:20005 src/dialogs/confdialog.cxx:20042 #: src/dialogs/confdialog.cxx:20044 msgid "Waterfall/Spectrum" msgstr "Cascada - Espectre" #: src/dialogs/confdialog.cxx:20009 msgid "Spectrum Scope / Waterfall interaction" msgstr "Interacció de l'abast de l'espectre - Cascada" #: src/dialogs/confdialog.cxx:20012 msgid "left click transfers frequency to scope center frequency" msgstr "" "fer clic esquerre transfereix la freqüència a la freqüència central de " "l'abast" #: src/dialogs/confdialog.cxx:20013 msgid "left click on WF recenters spectrum scope" msgstr "fes clic esquerre a l'abast de l'espectre dels recents a la cascada" #: src/dialogs/confdialog.cxx:20018 msgid "use waterfall range/limit values" msgstr "utilitza valors límit - interval de cascada" #: src/dialogs/confdialog.cxx:20019 msgid "values left/below waterfall" msgstr "valors a l'esquerra o a sota de la cascada" #: src/dialogs/confdialog.cxx:20024 msgid "freq scale = N * modem bandwidth" msgstr "escala de freqüència=N*ample banda mòdem" #: src/dialogs/confdialog.cxx:20034 msgid "use" msgstr "utilitzar" #: src/dialogs/confdialog.cxx:20035 msgid "scale spectrum display linked to modem bandwidth" msgstr "" "visualització d'espectre d'escala vinculada a l'ample de banda del mòdem" #: src/dialogs/confdialog.cxx:20048 src/dialogs/confdialog.cxx:20154 #: src/dialogs/confdialog.cxx:20156 msgid "Web/Pskmail" msgstr "Web - Pskmail" #: src/dialogs/confdialog.cxx:20052 msgid "Mail Server Attributes" msgstr "Atributs del servidor de correu" #: src/dialogs/confdialog.cxx:20055 msgid "Carrier frequency (Hz)" msgstr "Freqüència de la portadora (Hz)" #: src/dialogs/confdialog.cxx:20056 msgid "Default listen / transmit frequency" msgstr "Freqüència d'escolta - transmissió per defecte" #: src/dialogs/confdialog.cxx:20075 msgid "Search range (Hz)" msgstr "Interval de cerca (Hz)" #: src/dialogs/confdialog.cxx:20076 msgid "Listen for signals within this range" msgstr "Escolta els senyals dins d'aquest rang" #: src/dialogs/confdialog.cxx:20115 msgid "AFC range (Hz)" msgstr "Interval AFC (Hz)" #: src/dialogs/confdialog.cxx:20116 msgid "Limit AFC movement to this range" msgstr "Limita el moviment AFC a aquest rang" #: src/dialogs/confdialog.cxx:20135 msgid "Reset to Carrier" msgstr "Restableix la portadora" #: src/dialogs/confdialog.cxx:20136 msgid "When no signal present" msgstr "Quan no hi ha senyal" #: src/dialogs/confdialog.cxx:20144 msgid "General" msgstr "General" #: src/dialogs/confdialog.cxx:20147 msgid "Report ARQ frames average S/N" msgstr "Informe ARQ marcs S/N mitjà" #: src/dialogs/confdialog.cxx:20159 src/dialogs/confdialog.cxx:20242 #: src/dialogs/confdialog.cxx:20244 msgid "Web/WX" msgstr "Web - WX" #: src/dialogs/confdialog.cxx:20163 msgid "Access URL" msgstr "URL d'accés" #: src/dialogs/confdialog.cxx:20164 msgid "Enter METAR data internet URL" msgstr "Introdueix l'URL d'Internet de les dades METAR" #: src/dialogs/confdialog.cxx:20170 msgid "Default URL" msgstr "URL predeterminat" #: src/dialogs/confdialog.cxx:20173 msgid "METAR station ID code" msgstr "Codi d'identificació de l'estació METAR" #: src/dialogs/confdialog.cxx:20174 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" "per exemple KMDQ per\n" "Aeroport executiu de Huntsville-Madison, AL" #: src/dialogs/confdialog.cxx:20179 msgid "Search on web" msgstr "Cerca a la web" #: src/dialogs/confdialog.cxx:20182 msgid "Full report" msgstr "Informe complet" #: src/dialogs/confdialog.cxx:20183 src/dialogs/confdialog.cxx:20237 msgid "Insert full METAR report" msgstr "Insereix l'informe METAR complet" #: src/dialogs/confdialog.cxx:20188 msgid "METAR station location" msgstr "Ubicació de l'estació METAR" #: src/dialogs/confdialog.cxx:20189 msgid "Add geopolitical name of METAR station" msgstr "Afegeix el nom geopolític de l'estació METAR" #: src/dialogs/confdialog.cxx:20194 msgid "Conditions" msgstr "Condicions" #: src/dialogs/confdialog.cxx:20195 msgid "current wx conditions" msgstr "condicions wx actuals" #: src/dialogs/confdialog.cxx:20200 msgid "Fahrenheit" msgstr "Graus Fahrenheit" #: src/dialogs/confdialog.cxx:20201 msgid "report Fahrenheit" msgstr "informe en graus Fahrenheit" #: src/dialogs/confdialog.cxx:20206 msgid "Celsius" msgstr "Graus Celsius" #: src/dialogs/confdialog.cxx:20207 msgid "report Celsius" msgstr "informe en graus Celsius" #: src/dialogs/confdialog.cxx:20212 msgid "Miles / Hour" msgstr "Milles / Hora" #: src/dialogs/confdialog.cxx:20213 msgid "report miles per hour" msgstr "informe en milles per hora" #: src/dialogs/confdialog.cxx:20218 msgid "kilometers / hour" msgstr "quilòmetres / hora" #: src/dialogs/confdialog.cxx:20219 msgid "report kilometers per hour" msgstr "informe en quilòmetres per hora" #: src/dialogs/confdialog.cxx:20224 msgid "Inches Hg." msgstr "Polzades Hg." #: src/dialogs/confdialog.cxx:20225 msgid "report inches mercury" msgstr "informe en polzades de mercuri" #: src/dialogs/confdialog.cxx:20230 msgid "mbars" msgstr "mbars" #: src/dialogs/confdialog.cxx:20231 msgid "report millibars" msgstr "reportar en mil·libars" #: src/dialogs/confdialog.cxx:20236 msgid "Unprocessed METAR data" msgstr "" #: src/dialogs/confdialog.cxx:20254 msgid "Restore defaults" msgstr "Predeterminats" #: src/dialogs/confdialog.cxx:20255 msgid "WARNING - this will over write ALL settings" msgstr "ADVERTIMENT: això sobreescriurà TOTA la configuració" #: src/dialogs/font_browser.cxx:77 msgid "Font color" msgstr "Color de la lletra" #: src/dialogs/font_browser.cxx:150 msgid "Font:" msgstr "Font:" #: src/dialogs/font_browser.cxx:155 msgid "Size:" msgstr "Mida :" #: src/dialogs/font_browser.cxx:165 msgid "Fixed" msgstr "Fixat" #: src/dialogs/font_browser.cxx:169 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:184 msgid "" "abcdefghijklmnopqrstuvwxyz\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" "0123456789" msgstr "" "abcdefghijklmnopqrstuvwxyz\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" "0123456789" # Este es el nombre de la ventana que se abre en el menú Archivo > Carpetas > Archivo de datos… # Lo dejo "Archivo de datos" para que sea consistente con el menú # @HK4QWC #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Fonts dels fitxers de dades" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Actualització de fitxers de dades" # No encuentro un menú específico que use este texto @HK4QWC #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Fonts de dades tabulars" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Font de dades" # No encuentro un menú específico que use este texto @HK4QWC #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Repositori d'arxius de dades" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "" "Actualitza els fitxers de dades locals seleccionats amb el contingut del " "repositori" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Suprimeix els fitxers de dades locals si està seleccionat." #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Esdeveniment" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Entitat DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Mostra les entitats DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Abans no funcionava" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Usuari de LoTW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "usuari de eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplicats" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignora els duplicats" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "a :" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Temps (s):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Acció" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Límit d'activació (s) :" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Temps mínim entre esdeveniments" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Mostra la finestra d'alerta:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Insereix el text predeterminat" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Amaga la finestra després de (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Afegeix al text de RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Afegeix al text de TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Mostra l'editor de macros" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Executar el programa :" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Entitats DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Cerca el país :" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Prem Retorn per continuar la cerca" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Buscar prefix :" #: src/logbook/lgbook.cxx:615 msgid "Export Setup" msgstr "Configuració d'exportació" #: src/logbook/lgbook.cxx:616 src/logbook/lgbook.cxx:1631 msgid "Select Records to Export" msgstr "Selecciona Registres per exportar" #: src/logbook/lgbook.cxx:624 src/logbook/lgbook.cxx:825 #: src/logbook/lgbook.cxx:1639 src/logbook/lgbook.cxx:1721 msgid "Check All" msgstr "Marca-ho tot" #: src/logbook/lgbook.cxx:627 msgid "Start Date" msgstr "Data d'inici" #: src/logbook/lgbook.cxx:628 msgid "Start date for export" msgstr "Data d'inici de l'exportació" #: src/logbook/lgbook.cxx:641 msgid "Stop Date" msgstr "Data Final" #: src/logbook/lgbook.cxx:642 msgid "Inclusive stop date for export" msgstr "Data d'aturada de l'exportació inclosa" #: src/logbook/lgbook.cxx:655 msgid "select by date" msgstr "selecciona per data" #: src/logbook/lgbook.cxx:656 msgid "Enable to select date range" msgstr "Activar per seleccionar rang de dates" #: src/logbook/lgbook.cxx:662 msgid "Select Fields to Export" msgstr "Selecciona els Camps per exportar" #: src/logbook/lgbook.cxx:673 src/logbook/lgbook.cxx:1670 msgid "Freq" msgstr "Freq" #: src/logbook/lgbook.cxx:684 msgid "QSO Date On" msgstr "Data d'inici del QSO" #: src/logbook/lgbook.cxx:688 msgid "QSO Date Off" msgstr "Data de final del QSO" #: src/logbook/lgbook.cxx:692 msgid "Time ON" msgstr "Hora d'inici" #: src/logbook/lgbook.cxx:696 src/logbook/lgbook.cxx:1682 msgid "Time OFF" msgstr "Hora de final" #: src/logbook/lgbook.cxx:699 msgid "TX Power" msgstr "Potència" #: src/logbook/lgbook.cxx:702 src/logbook/lgbook.cxx:1686 msgid "RST sent" msgstr "RST enviat" #: src/logbook/lgbook.cxx:706 src/logbook/lgbook.cxx:1690 msgid "RST rcvd" msgstr "RST rebut" #: src/logbook/lgbook.cxx:710 src/logbook/lgbook.cxx:1003 msgid "Qth" msgstr "QTH" #: src/logbook/lgbook.cxx:713 msgid "LOC" msgstr "LOC" #: src/logbook/lgbook.cxx:719 src/logbook/lgbook.cxx:1367 msgid "Age" msgstr "Edat" #: src/logbook/lgbook.cxx:722 src/logbook/lgbook.cxx:1243 msgid "Station Call" msgstr "Indicatiu" #: src/logbook/lgbook.cxx:725 src/logbook/lgbook.cxx:1267 msgid "Station QTH" msgstr "QTH" #: src/logbook/lgbook.cxx:728 msgid "Station LOC" msgstr "Locator" #: src/logbook/lgbook.cxx:740 src/logbook/lgbook.cxx:1224 msgid "Notes" msgstr "Notes" #: src/logbook/lgbook.cxx:743 msgid "QSL rcvd date" msgstr "Data de recepció de la QSL" #: src/logbook/lgbook.cxx:746 msgid "QSL sent date" msgstr "Data d'enviament de la QSL" #: src/logbook/lgbook.cxx:749 msgid "eQSL rcvd date" msgstr "data de recepció de la eQSL" #: src/logbook/lgbook.cxx:752 msgid "eQSL sent date" msgstr "data d'enviament de la eQSL" #: src/logbook/lgbook.cxx:755 msgid "LoTW rcvd date" msgstr "Data de recepció de LoTW" #: src/logbook/lgbook.cxx:758 msgid "LoTW sent date" msgstr "Data d'enviament de LoTW" #: src/logbook/lgbook.cxx:761 src/logbook/lgbook.cxx:1132 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:764 src/logbook/lgbook.cxx:1694 msgid "Serial # in" msgstr "Número enviat" #: src/logbook/lgbook.cxx:767 src/logbook/lgbook.cxx:1698 msgid "Serial # out" msgstr "Número rebut" #: src/logbook/lgbook.cxx:776 src/logbook/lgbook.cxx:1706 msgid "Exchange Out" msgstr "Intercanvi de sortida" #: src/logbook/lgbook.cxx:785 src/logbook/lgbook.cxx:1174 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:788 src/logbook/lgbook.cxx:1210 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:791 src/logbook/lgbook.cxx:1162 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:794 src/logbook/lgbook.cxx:1198 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:797 msgid "FD class" msgstr "Classe FD" #: src/logbook/lgbook.cxx:800 msgid "FD section" msgstr "Secció FD" #: src/logbook/lgbook.cxx:803 msgid "CW SS SerNo R" msgstr "CW SS SerNo R" #: src/logbook/lgbook.cxx:804 msgid "CW sweepstakes rcvd ser. no." msgstr "Número de sorteigs de CW rebut." #: src/logbook/lgbook.cxx:807 msgid "CW SS Prec'" msgstr "CW SS Prec'" #: src/logbook/lgbook.cxx:808 msgid "CW sweepstakes precedence" msgstr "Precedència del sorteig de CW" #: src/logbook/lgbook.cxx:811 msgid "CW SS Check" msgstr "Comprovació CW SS" #: src/logbook/lgbook.cxx:814 msgid "CW SS Section" msgstr "Secció CW SS" #: src/logbook/lgbook.cxx:815 src/logbook/lgbook.cxx:819 msgid "CW sweepstakes section" msgstr "Secció de sorteigs de CW" #: src/logbook/lgbook.cxx:818 src/logbook/lgbook.cxx:1379 msgid "10-10" msgstr "10-10" #: src/logbook/lgbook.cxx:844 msgid "Logbook" msgstr "Llibre de guàrdia" #: src/logbook/lgbook.cxx:845 msgid "Date On" msgstr "Data d'inici" #: src/logbook/lgbook.cxx:846 msgid "Date QSO started" msgstr "Data d'inici del QSO" #: src/logbook/lgbook.cxx:858 msgid "Time On" msgstr "Hora d'inici" #: src/logbook/lgbook.cxx:859 msgid "Time QSO started" msgstr "Hora d'inici del QSO" #: src/logbook/lgbook.cxx:871 msgid "Call sign worked" msgstr "Indicatiu treballat" #: src/logbook/lgbook.cxx:883 msgid "Operator worked" msgstr "Operador treballat" #: src/logbook/lgbook.cxx:894 msgid "In" msgstr "Rev" #: src/logbook/lgbook.cxx:895 msgid "Rst received" msgstr "RST rebut" #: src/logbook/lgbook.cxx:906 msgid "Recs" msgstr "Recs" #: src/logbook/lgbook.cxx:907 msgid "# Records in logbook" msgstr "Número de entrades al llibre de guàrdia" #: src/logbook/lgbook.cxx:918 msgid "Date Off" msgstr "Data final" #: src/logbook/lgbook.cxx:919 msgid "Date QSO Ended" msgstr "Data de final del QSO" #: src/logbook/lgbook.cxx:931 msgid "Time Off" msgstr "Hora final" #: src/logbook/lgbook.cxx:932 msgid "Time QSO ended" msgstr "Hora de final del QSO" #: src/logbook/lgbook.cxx:943 msgid "Freq." msgstr "Freq." #: src/logbook/lgbook.cxx:944 msgid "Frequency in MHz" msgstr "Freqüència en MHz" #: src/logbook/lgbook.cxx:956 msgid "Mode in use" msgstr "Mode en us" #: src/logbook/lgbook.cxx:967 msgid "Pwr" msgstr "Pot" #: src/logbook/lgbook.cxx:968 msgid "Transmit power used" msgstr "Potència de transmissió utilitzada" #: src/logbook/lgbook.cxx:979 msgid "Loc" msgstr "Loc" #: src/logbook/lgbook.cxx:980 msgid "Stations grid square" msgstr "Locator d'estacions" #: src/logbook/lgbook.cxx:991 msgid "Out" msgstr "Env" #: src/logbook/lgbook.cxx:992 msgid "Rst sent" msgstr "RST enviat" #: src/logbook/lgbook.cxx:1004 msgid "City of station worked" msgstr "Ciutat de l'estació treballada" #: src/logbook/lgbook.cxx:1015 msgid "St" msgstr "Es" #: src/logbook/lgbook.cxx:1016 msgid "US state of station worked" msgstr "Estat USA de l'estació treballada" #: src/logbook/lgbook.cxx:1027 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:1028 msgid "Province of station worked" msgstr "Província de l'estació treballada" #: src/logbook/lgbook.cxx:1040 msgid "Country of station worked" msgstr "País de l'estació treballada" #: src/logbook/lgbook.cxx:1053 msgid "QSL" msgstr "QSL" #: src/logbook/lgbook.cxx:1054 msgid "QSL-rcvd" msgstr "QSL rebuda" #: src/logbook/lgbook.cxx:1055 src/logbook/lgbook.cxx:1068 #: src/logbook/lgbook.cxx:1081 msgid "QSL received on this date" msgstr "QSL rebudes en aquesta data" #: src/logbook/lgbook.cxx:1067 msgid "EQSL-rcvd" msgstr "EQSL rebuda" #: src/logbook/lgbook.cxx:1080 msgid "LOTW-rcvd" msgstr "LoTW rebuda" #: src/logbook/lgbook.cxx:1093 msgid "QSL-sent" msgstr "QSL enviada" #: src/logbook/lgbook.cxx:1094 src/logbook/lgbook.cxx:1107 #: src/logbook/lgbook.cxx:1120 msgid "QSL sent on this date" msgstr "QSL enviades en aquesta data" #: src/logbook/lgbook.cxx:1106 msgid "EQSL-sent" msgstr "EQSL enviada" #: src/logbook/lgbook.cxx:1119 msgid "LOTW-sent" msgstr "LoTW enviada" #: src/logbook/lgbook.cxx:1133 msgid "QSL route of contacted station" msgstr "Ruta QSL de l'estació contactada" #: src/logbook/lgbook.cxx:1163 msgid "Islands on the air" msgstr "Isles en el aire (IOTA)" #: src/logbook/lgbook.cxx:1186 msgid "Cont'" msgstr "Contestia" #: src/logbook/lgbook.cxx:1211 msgid "DXCC designator" msgstr "Identificador DXCC" #: src/logbook/lgbook.cxx:1227 src/logbook/lgbook.cxx:1244 #: src/logbook/lgbook.cxx:1256 src/logbook/lgbook.cxx:1268 #: src/logbook/lgbook.cxx:1280 msgid "Interesting notes" msgstr "Notes interesants (màxim 80 caràcters)" #: src/logbook/lgbook.cxx:1241 msgid "My Station" msgstr "Estació" #: src/logbook/lgbook.cxx:1279 msgid "Station Locator" msgstr "Locator de l'estació" #: src/logbook/lgbook.cxx:1295 msgid "Ser out" msgstr "Número enviat" #: src/logbook/lgbook.cxx:1296 src/logbook/lgbook.cxx:1421 msgid "Contest seral # sent" msgstr "Número de sèrie de concurs enviat" #: src/logbook/lgbook.cxx:1307 msgid "Exch Out" msgstr "Intercanvi TX" #: src/logbook/lgbook.cxx:1308 src/logbook/lgbook.cxx:1445 msgid "Contest exchange sent" msgstr "Número de sèrie de concurs enviat" #: src/logbook/lgbook.cxx:1319 msgid "Ser in" msgstr "Número rebut" #: src/logbook/lgbook.cxx:1320 msgid "Contest serial # received" msgstr "Número de sèrie de concurs rebut" #: src/logbook/lgbook.cxx:1331 msgid "Exch In" msgstr "Intercanvi RX" #: src/logbook/lgbook.cxx:1332 src/logbook/lgbook.cxx:1457 msgid "Contest exchange received" msgstr "Número de sèrie de concurs rebut" #: src/logbook/lgbook.cxx:1344 msgid "Field Day class received" msgstr "Classe de Field Day rebut" #: src/logbook/lgbook.cxx:1355 msgid "ARRL Sect" msgstr "Secció ARRL" #: src/logbook/lgbook.cxx:1356 msgid "Field Section received" msgstr "Secció de Field Day rebut" #: src/logbook/lgbook.cxx:1368 msgid "Operators age received" msgstr "Edat dels operadors rebuts" #: src/logbook/lgbook.cxx:1380 msgid "Ten Ten number received" msgstr "Número Ten Ten rebut" #: src/logbook/lgbook.cxx:1392 msgid "Operating band" msgstr "Banda operativa" #: src/logbook/lgbook.cxx:1404 msgid "Check value received" msgstr "Comprovar valor rebut" #: src/logbook/lgbook.cxx:1417 msgid "CW SS" msgstr "CW SS" #: src/logbook/lgbook.cxx:1418 msgid "CW Sweepstakes Contest" msgstr "Concurs de sorteigs de CW" #: src/logbook/lgbook.cxx:1420 msgid "Ser NoR" msgstr "Nº env" #: src/logbook/lgbook.cxx:1444 msgid "Precedence" msgstr "Precedència" #: src/logbook/lgbook.cxx:1470 msgid "JOTA" msgstr "JOTA" #: src/logbook/lgbook.cxx:1471 msgid "Jamboree On The Air" msgstr "Jamboree On The Air" #: src/logbook/lgbook.cxx:1473 msgid "Troop-S" msgstr "Tropa enviat" #: src/logbook/lgbook.cxx:1474 msgid "Sent troop number" msgstr "Número de tropa enviat" #: src/logbook/lgbook.cxx:1485 msgid "Troop-R" msgstr "Tropa rebut" #: src/logbook/lgbook.cxx:1486 msgid "Received troop number" msgstr "Número de tropa rebut" #: src/logbook/lgbook.cxx:1497 msgid "Name-S" msgstr "Nom" #: src/logbook/lgbook.cxx:1498 msgid "Sent scout name" msgstr "Nom de l'scout enviat" #: src/logbook/lgbook.cxx:1509 msgid "Name-R" msgstr "Nom rebut" #: src/logbook/lgbook.cxx:1510 msgid "Received scout name" msgstr "Nom de l'scout rebut" #: src/logbook/lgbook.cxx:1526 msgid "Call Search" msgstr "Buscar Indicatiu" #: src/logbook/lgbook.cxx:1527 msgid "Search for this callsign" msgstr "Buscar per aquest indicatiu" #: src/logbook/lgbook.cxx:1539 msgid "Find previous" msgstr "Buscar l'anterior" #: src/logbook/lgbook.cxx:1547 msgid "Find next" msgstr "Buscar el següent" #: src/logbook/lgbook.cxx:1554 msgid "Retrieve" msgstr "Recuperar" #: src/logbook/lgbook.cxx:1555 msgid "Retrieve for active modem use" msgstr "Recuperar per utilitzar el mòdem actiu" #: src/logbook/lgbook.cxx:1568 msgid "New record / Save record" msgstr "Registre nou - Actualitzar" #: src/logbook/lgbook.cxx:1575 msgid "Update the current record" msgstr "Actualitzar el registre actual" #: src/logbook/lgbook.cxx:1582 msgid "Delete the current record" msgstr "Eliminar el registre actual" #: src/logbook/lgbook.cxx:1588 msgid "File:" msgstr "Arxiu:" #: src/logbook/lgbook.cxx:1611 msgid "Date" msgstr "Data" #: src/logbook/lgbook.cxx:1613 msgid "Time" msgstr "Hora" #: src/logbook/lgbook.cxx:1630 msgid "Cabrillo Setup" msgstr "Configuració per Cabrillo" #: src/logbook/lgbook.cxx:1650 msgid "Select Cabrillo Contest & Fields" msgstr "Selecciona els camps del concurso per al registre Cabrillo" #: src/logbook/lgbook.cxx:1653 msgid "Contest:" msgstr "Concurs :" #: src/logbook/lgbook.cxx:1678 msgid "QSO Date" msgstr "Data del QSO" #~ msgid "Searches passband" #~ msgstr "Cerca en el pas de banda" #~ msgid "Lighted button enabled colors" #~ msgstr "Colors activats per botons il·luminats" #~ msgid "All Others" #~ msgstr "Tots els Altres" #~ msgid "Receive modes" #~ msgstr "Modos de RX" #, fuzzy #~ msgid "Transceiver FSK" #~ msgstr "Control del transceptor" #, fuzzy #~ msgid "NBEMS interface" #~ msgstr "Interface de datos NBEMS" #~ msgid "Signal level" #~ msgstr "Nivel de señal" #, fuzzy #~ msgid "Filter Settings" #~ msgstr "Filtraje" #, fuzzy #~ msgid "Filter center frequ ency" #~ msgstr "Añadir la frecuencia actual" #, fuzzy #~ msgid "Filter low cutoff frequency" #~ msgstr "Ajustar la frecuencia del cursor" #, fuzzy #~ msgid "Filter high cutoff frequency" #~ msgstr "Correr la cascada hacia frecuencias más altas" #, fuzzy #~ msgid "track WF cursor" #~ msgstr "Color" #, fuzzy #~ msgid "Rx audio volume" #~ msgstr "Audio" #, fuzzy #~ msgid "Filtered audio" #~ msgstr "Ancho de banda del filtro" #, fuzzy #~ msgid "Enable DSP filtering of rx audio stream" #~ msgstr "Activar el registro del texto de recepción." #, fuzzy #~ msgid "Weather Fax Image RX" #~ msgstr "&RX Imagen de Fax meteorológico" #~ msgid "No file name given" #~ msgstr "No se ha proporcionado un nombre de archivo" #~ msgid "channels != 1" #~ msgstr "canales <> 1" #~ msgid "unknown wave file error" #~ msgstr "Error desconocido con el archivo de audio wav" #~ msgid "Rig control" #~ msgstr "Control del radio" #~ msgid "RPC" #~ msgstr "RPC" #~ msgid "Spotter" #~ msgstr "Spotter" #~ msgid "KISS control" #~ msgstr "control KISS" #~ msgid "Log sources" #~ msgstr "Orígenes de logs" #~ msgid "Change log level" #~ msgstr "Cambiar el nivel de log" #, fuzzy #~ msgid "Waveform Audio Format]\t*.{mp3,wav}\n" #~ msgstr "" #~ "Forma de onda del audio\t*.wav\n" #~ "AU\t*.{au.snd}\n" #, fuzzy #~ msgid "Waveform Audio Format\t*.wav\n" #~ msgstr "" #~ "Forma de onda del audio\t*.wav\n" #~ "AU\t*.{au.snd}\n" #~ msgid "Free Lossless Audio Codec\t*.flac" #~ msgstr "Codec de audio libre sin pérdida\t*.flac" #~ msgid "Embedded Wefax Gui" #~ msgstr "Interfaz embebida para WXFAX" #~ msgid "" #~ "Display tx and rx in main fldigi window.\n" #~ "Change requires restart of fldigi" #~ msgstr "" #~ "Mostrar TX y RX en la ventana principal de fldigi.\n" #~ "Este cambio requiere reiniciar fldigi." #~ msgid "Hide Transmission window" #~ msgstr "Ocultar la ventana de TX" #~ msgid "Hide transmission window by default." #~ msgstr "Ocultar la ventana de TX de forma predeterminada" #, fuzzy #~ msgid "Center freq (1500 Hz)" #~ msgstr "Línea central" #~ msgid "Save image as monochrome file" #~ msgstr "Guardar como imagen monocromática" #~ msgid "Save the fax image as a gray-level PNG file." #~ msgstr "Guardar la imagen de fax como PNG en grises" #, fuzzy #~ msgid "Misc/IO" #~ msgstr "Misc." #, fuzzy #~ msgid "Misc/NBEMS" #~ msgstr "NBEMS" #, fuzzy #~ msgid "Retry Interval (msec)" #~ msgstr "Intervalo entre reintento (ms)" #~ msgid "Msec's between retries" #~ msgstr "Milisegundos entre reintentos" # ¿Qué tal si usamos un pangrama en español como este? (@HK4QWC) #~ msgid "" #~ "That crazy fox jumped over the dog again!\n" #~ "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" #~ "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #~ msgstr "" #~ "Jovencillo emponzoñado de whisky: ¡qué figurota exhibe!\n" #~ "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" #~ "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #~ msgid "Reading fonts..." #~ msgstr "leyendo tipografías..." #~ msgid "User Interface" #~ msgstr "Interfaz de usuario" #, fuzzy #~ msgid "Operating" #~ msgstr "Operador" #, fuzzy #~ msgid "Active Modem" #~ msgstr "Modos de RX" #, fuzzy #~ msgid "CPU speed" #~ msgstr "Vel. del AFC" #, fuzzy #~ msgid "PSKmail" #~ msgstr "Pskmail" #, fuzzy #~ msgid "Sweet spot" #~ msgstr "Frecuencia Inicial" #, fuzzy #~ msgid "Text IO" #~ msgstr "E/S de Texto" #~ msgid "WX" #~ msgstr "WX" #~ msgid "KML" #~ msgstr "KML" # Texto de la pestaña IO en la ventana de configuración Fldigi (@HK4QWC) #~ msgid "IO" #~ msgstr "E/S" #, fuzzy #~ msgid "PSM" #~ msgstr "PSK" #, fuzzy #~ msgid "Contest/Logging" #~ msgstr "Contestia" #~ msgid "QRZ/eQSL" #~ msgstr "QRZ/eQSL" #, fuzzy #~ msgid "Station / Operator" #~ msgstr "Estación escuchada dos veces" #~ msgid "Browser" #~ msgstr "Navegador" #~ msgid "Log" #~ msgstr "Log" #, fuzzy #~ msgid "QSO" #~ msgstr "QSY" #~ msgid "WF Ctrls" #~ msgstr "Controles de la cascada" #~ msgid "Clrs/Fnts" #~ msgstr "Colores/Tipos" #~ msgid "Rx/Tx" #~ msgstr "Rx/Tx" #~ msgid "F_keys" #~ msgstr "Teclas de función" #~ msgid "Tabs" #~ msgstr "Pestañas" #~ msgid "Buttons" #~ msgstr "Botones" #~ msgid "SigLvl" #~ msgstr "Nivel de señal" #~ msgid "Display" #~ msgstr "Mostrar" #~ msgid "Mouse" #~ msgstr "Ratón" #~ msgid "TX WPM" #~ msgstr "TX WPM" #~ msgid "Weight (%)" #~ msgstr "Peso (en %)" #~ msgid "Dot to dot-space ratio" #~ msgstr "Relación punto a punto-raya" #, fuzzy #~ msgid "Edge decrease" #~ msgstr "Los bordes de subida y bajada disminuyen el ancho del pulso" #~ msgid "Weight decreases with increasing edge timing" #~ msgstr "" #~ "El peso disminuye con el incremento de los tiempos de borde de los pulsos" #, fuzzy #~ msgid "BPF transmit audio" #~ msgstr "WPM en TX de CW" #~ msgid "Msec pre-keydown (+ is earlier in time)" #~ msgstr "PTT es enviado N milisegundos antes del pulso real" #~ msgid "Msec post-keydown (+ is earlier in time)" #~ msgstr "PTT es soltado N milisegundos después del pulso real" #~ msgid "Dom" #~ msgstr "DomEX" #~ msgid "Feld" #~ msgstr "Feld-Hell" #~ msgid "MT-63" #~ msgstr "MT-63" #, fuzzy #~ msgid "Oliv" #~ msgstr "Olivia" #, fuzzy #~ msgid "Cont" #~ msgstr "Contestia" #~ msgid "PSK" #~ msgstr "PSK" #, fuzzy #~ msgid "TTY" #~ msgstr "RTTY" #~ msgid "Rx" #~ msgstr "Rx" #~ msgid "Tx" #~ msgstr "Tx" #~ msgid "Synop" #~ msgstr "Synop" #~ msgid "Thor" #~ msgstr "Thor" #, fuzzy #~ msgid "Nav" #~ msgstr "Wav" #~ msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" #~ msgstr "Predefinido 800 Hz. Servicio Meteorológico Alemán 850Hz" #~ msgid "Received fax maximum rows number (5000)" #~ msgstr "Número máximo de filas para un fax (5000)" #~ msgid "Maximum row number for a received fax image." #~ msgstr "Número máximo de filas para una imagen de fax recibida" #~ msgid "Rig" #~ msgstr "Radio" #~ msgid "RigCAT" #~ msgstr "RigCAT" #~ msgid "Hamlib" #~ msgstr "Hamlib" #~ msgid "Devices" #~ msgstr "Dispositivos" #~ msgid "Wav" #~ msgstr "Wav" #, fuzzy #~ msgid "Regex Match in Browser" #~ msgstr "Navegador" #, fuzzy #~ msgid "flmsg interface" #~ msgstr "Interfaz de usuario" #~ msgid "ID" #~ msgstr "ID" #~ msgid "Open squelch for nn sec if RSID detected" #~ msgstr "Abrir el silenciador por nn segundos si se detecta RSID" #~ msgid "CPU" #~ msgstr "CPU" #~ msgid "Spotting" #~ msgstr "Spotting" #~ msgid "PSK Reporter" #~ msgstr "PSK Reporter" #~ msgid "Weather query specification" #~ msgstr "Consulta específica de clima" #~ msgid "Temperature" #~ msgstr "Temperatura" #~ msgid "Wind speed/dir" #~ msgstr "Vel/Dir del viento" #~ msgid "Barometric pressure" #~ msgstr "Presión Barométrica" #~ msgid "eQSL" #~ msgstr "Usuario de eQSL" #, fuzzy #~ msgid "Use password for tqsl access" #~ msgstr "Contraseña" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Control del radio por un\n" #~ "programa externo\n" #~ "usando XML-RPC" #~ msgid "Use XML-RPC program" #~ msgstr "Usar un programa XML-RPC" #~ msgid "Experimental" #~ msgstr "Experimental" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Inicializar el control por XML-RPC" #~ msgid "" #~ "Delay in seconds between \tLDT in iso-8601 format" #~ msgstr "\tLDT en formato iso-8601" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT en formato iso-8601" #~ msgid "\tUTC datetime" #~ msgstr "\tfecha y hora UTC" #~ msgid "User Interface - Browser" #~ msgstr "Interfaz de usuario - Navegador" #~ msgid "User Interface - General" #~ msgstr "Interfaz de usuario - General" #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Interfaz de usuario - Colores / Tipos de letra" #~ msgid "User Interface - Contest" #~ msgstr "Interfaz de usuario - Concurso" #~ msgid "User Interface - Macros" #~ msgstr "Interfaz de usuario - Macros" #~ msgid "User Interface - Waterfall controls" #~ msgstr "Interfaz de usuario - Controles de la cascada" #~ msgid "Rig Control using xml spec file" #~ msgstr "Control del radio usando un archivo xml" #~ msgid "Callsign database" #~ msgstr "Base de datos de indicativos" #~ msgid "Program to Program Communications" #~ msgstr "Comunicación entre aplicaciones" #, fuzzy #~ msgid "Power Signal Monior" #~ msgstr "Tono pre-señal" #~ msgid "Callsign:" #~ msgstr "Indicativo:" #~ msgid "Name:" #~ msgstr "Nombre:" #~ msgid "Transmit width" #~ msgstr "Ancho de la transmisión" #~ msgid "# of multiple scans / character line" #~ msgstr "# de múltiples exploraciones / lineas de caracteres" #~ msgid "Halve receive width" #~ msgstr "Ancho de Rx a la mitad" #~ msgid "Compress Rx in time" #~ msgstr "Comprimir Rx en el tiempo" #~ msgid "2x Xmt Width (hidden)" #~ msgstr "2x Tx ancho (oculto)" #~ msgid "Revert" #~ msgstr "Revertir" #~ msgid "Reset rigCAT interface" #~ msgstr "Restablecer la interfaz rigCAT" #~ msgid "Reset hamlib interface" #~ msgstr "Restablecer la interfaz Hamlib" #, fuzzy #~ msgid "Use GPIO PTT" #~ msgstr "Usar PTT Memmap" #, fuzzy #~ msgid "Select GPIO port" #~ msgstr "Seleccione el puerto serie" #, fuzzy #~ msgid "QSL-2" #~ msgstr "QSL-VIA" #~ msgid "Rig control and logging" #~ msgstr "Controles del radio y log" #~ msgid "Rig control and contest" #~ msgstr "Controles del radio y concursos" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "No se pudo comprobar si hay actualizaciones:\n" #~ "%s" #~ msgid "Visit URL" #~ msgstr "Visitar la URL" #~ msgid "Copy URL" #~ msgstr "Copiar la URL" #~ msgid "Controls" #~ msgstr "Controles" #~ msgid "# S" #~ msgstr "# S" #~ msgid "# R" #~ msgstr "# R" #~ msgid "Monitor KISS Pwr Squelch" #~ msgstr "Monitor KPSQL" #~ msgid "Empty ADIF logbook file %s" #~ msgstr "Archivo de libro de guardia vacío (ADIF) %s" #~ msgid "Error reading %s" #~ msgstr "Error leyendo %s" #~ msgid "Quick entry" #~ msgstr "Entrada rápida" #~ msgid "Exchanges" #~ msgstr "Intercambio" #~ msgid "Transmit all text in lower case" #~ msgstr "TX todo en minúsculas" #~ msgid "User Interface - Logging" #~ msgstr "Interfaz de usuario - Registro" #~ msgid "Client/Server Logbook" #~ msgstr "Logs remotos cliente/servidor" #~ msgid "Enter URL address of server" #~ msgstr "Entre la dirección URL del servidor" #~ msgid "Enter Port # assigned to server" #~ msgstr "Número de puerto asignado al servidor" #~ msgid "Prompt to save macro file when closing" #~ msgstr "Confirmar si graba archivo de macros al cerrar" #~ msgid "Wefax" #~ msgstr "Wefax" #~ msgid "Mono audio output" #~ msgstr "Salida de audio monofónico" #~ msgid "Force output audio to single channel" #~ msgstr "Forzar la salida de audio por un solo canal" #~ msgid "End of header string:" #~ msgstr "Fin de la cabecera:" #~ msgid "" #~ "Text defining end of METAR header\n" #~ "Typically 'Connection: close'\n" #~ "Used to search for station name" #~ msgstr "" #~ "Texto que define el fin de cabecera METAR\n" #~ "Usualmente 'Connection: close'\n" #~ "Usado para detectar nombre de estación." #~ msgid "QRZ online via default Internet Browser" #~ msgstr "QRZ online vía navegador web" #~ msgid "HamCall online via default Internet Browser" #~ msgstr "HamCall en línea vía navegador web" #~ msgid "HamQTH via default Internet Browser" #~ msgstr "Sitio HamQTH vía navegador web" #~ msgid "IP Address format: nnn.nnn.nnn.nnn" #~ msgstr "Formato de dirección IP: nnn.nnn.nnn.nnn" #~ msgid "XMLRPC" #~ msgstr "XMLRPC" #~ msgid "IP Address for KISS interface" #~ msgstr "Dirección IP para la interfaz KISS" #~ msgid "Continue After (sec)" #~ msgstr "Cont. después de (seg)" #~ msgid "Dual Port" #~ msgstr "Puerto dual" #~ msgid "CONT" #~ msgstr "CONT" #~ msgid "Dial" #~ msgstr "Sintonizar" #~ msgid "\tvideo text" #~ msgstr "\tvideo texto" #~ msgid "Raised cosine = Hanning" #~ msgstr "Coseno elevado = Hanning" #~ msgid "Really want to quit?" #~ msgstr "Realmente quieres terminar?" #~ msgid "No rig specified" #~ msgstr "No se ha especificado un radio" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Entre frecuencia o cambie con\n" #~ "Izq./Der../Arriba/Abajo/Pág_Arriba/Pág_Abajo" #~ msgid "Enter Xcvr Freq" #~ msgstr "Frec. del TRCV" #~ msgid "Memory Mapped Rig" #~ msgstr "Radio mapeado en memoria" #~ msgid "" #~ "Exit prompts active only when File/Exit menu item selected.\n" #~ "Not active if window decoration close button pressed." #~ msgstr "" #~ "Están activas solo cuando cierras usando el menú Archivo/Salir.\n" #~ "No se activan cuando das click en el botón de cerrar en la ventana." #~ msgid "Enable if you cannot use the middle mouse button" #~ msgstr "Activalo si no puedes usar el botón del centro del ratón" #~ msgid "Char set" #~ msgstr "Juego de Caracteres" #~ msgid "Frq Disp" #~ msgstr "Frecuencia" #~ msgid "Label text" #~ msgstr "Texto" #~ msgid "FFT latency (scan merging)" #~ msgstr "Latencia de FFT (mezcla de escaneo)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "La latencia incrementa la resolución de frecuencia,\n" #~ "disminuir a 1 para no mezclar" #, fuzzy #~ msgid "Pkt" #~ msgstr "Packet" #~ msgid "Packet" #~ msgstr "Packet" #~ msgid "Select packet baudrate" #~ msgstr "Seleccionar velocidad de packet" #~ msgid "RX Low Freq Gain" #~ msgstr "Gan. Rx en frec. bajas" #~ msgid "Processing gain to apply to lower tone (in dB)" #~ msgstr "Ganancia a aplicar a los tonos bajos (en dB)" #~ msgid "RX High Freq Gain" #~ msgstr "Gan. Rx en frec. altas" #~ msgid "Processing gain to apply to higher tone (in dB)" #~ msgstr "Ganancia a aplicar a los tonos altos (en dB)" #~ msgid "TX Low Freq Gain" #~ msgstr "Gan. Tx en frec. bajas" #~ msgid "TX High Freq Gain" #~ msgstr "Gan. Tx en frec. altas" #~ msgid "add RX timestamps" #~ msgstr "añadir marcas de tiempo en RX" #~ msgid "decode Compressed data" #~ msgstr "decodificar datos comprimidos" #~ msgid "Decode received Compressed Position data" #~ msgstr "Decodificar datos comprimidos de posición" #~ msgid "decode Mic-E data" #~ msgstr "decodificar datos Mic-E" #~ msgid "Decode received Mic-E data" #~ msgstr "Decodificar datos recibidos Mic-E" #~ msgid "decode PHG data" #~ msgstr "decodificar datos PHG" #~ msgid "Decode received PHG data" #~ msgstr "Decodificar datos PHG recibidos" #~ msgid "use SI units" #~ msgstr "usar unidades del SIU" #~ msgid "use English units" #~ msgstr "usar unidades Inglesas" #~ msgid "Display decoded data in English units" #~ msgstr "Mostrar datos decodificados en unidades Inglesas (pies, millas)" #~ msgid "Use cross-hair scope" #~ msgstr "Usar osciloscopio de hilos cruzados" #~ msgid "Defaults to syncscope instead of phase (cross-hair) scope" #~ msgstr "" #~ "Por defecto muestra la sincronía en vez de los hilos cruzados en el " #~ "osciloscopio" #~ msgid "boost Audio input" #~ msgstr "Amplificar entrada de audio" #~ msgid "add additional gain to audio input for low-output interfaces" #~ msgstr "Añadir ganancia adicional a la entrada de audio" #~ msgid "Select the rig by name" #~ msgstr "Seleccione el radio por su nombre" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Forzar el lateral del radio. Entra en efecto\n" #~ "cuando el radio cambia de modo." #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Control vía software mapeado\n" #~ "en memoria con variables\n" #~ "compartidas: Kachina" #~ msgid "Use Memmap" #~ msgstr "Usar Memmap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Radio mapeado via memoria (Kachina)" #~ msgid "Initialize Memmap interface" #~ msgstr "Inicializar interface Memmap" #~ msgid "Mixer" #~ msgstr "Mezclador" #~ msgid "OSS Mixer" #~ msgstr "Mezclador OSS" #~ msgid "Manage mixer" #~ msgstr "Manejar el mezclador" #~ msgid "Add mixer controls to main dialog" #~ msgstr "Añadir controles del mezclador a la interface principal" #~ msgid "Select Mixer device" #~ msgstr "Seleccionar dispositivo de mezcla" #~ msgid "Mic In" #~ msgstr "Mic In" #~ msgid "Use microphone input" #~ msgstr "Usar entrada de micrófono" #~ msgid "Line In" #~ msgstr "Line In" #~ msgid "Use Line-In device" #~ msgstr "Usar dispositivo Line-in" #~ msgid "PCM" #~ msgstr "PCM" #~ msgid "Set the sound card PCM level" #~ msgstr "Establecer el volumen PCM de la tarjeta" #~ msgid "Rx fax max rows" #~ msgstr "Rx fax max. cols." #~ msgid "" #~ "Enter full path-filename for external program\n" #~ "Or simple name of program" #~ msgstr "" #~ "Entre camino y nombre hasta el ejecutable\n" #~ "o simplemente el nombre del ejecutable" #~ msgid "Enable to reduce CPU load" #~ msgstr "Activar para reducir carga al CPU" #~ msgid "Number of errors allowed in RsID comparison" #~ msgstr "Cantidad de errores permitidos en identificación de RSID" #~ msgid "Save image as:" #~ msgstr "Guardar imagen como..." #~ msgid "Sensitivity" #~ msgstr "Sensibilidad" #~ msgid "" #~ "2 = normal sensitivity / decreased false detection\n" #~ "5 = high sensitivity / increased false detection" #~ msgstr "" #~ "2 = normal sensibilidad / disminuye la detección de falsos\n" #~ "5 = alta sensibilidad / incrementa la detección de falsos" #~ msgid "Navtex stations file:" #~ msgstr "Fichero de log de Navtex:" #~ msgid "Colors and Fonts" #~ msgstr "Colores y tipografía" #~ msgid "Disp" #~ msgstr "Radio" #~ msgid "64-bit (long) interleave" #~ msgstr "Intervalo largo de 64Bits" #~ msgid "Transmit /Receive" #~ msgstr "Transmitir/Recibir" #~ msgid "Filter Quality" #~ msgstr "Calidad del Filtro" #~ msgid "" #~ "Low -> High\n" #~ "DSP filter length\n" #~ "Low reduces load on CPU\n" #~ "High gives best performance" #~ msgstr "" #~ "Low -> High\n" #~ "Longitud del filtro DSP\n" #~ "Low (Bajo) reduce la carga de CPU\n" #~ "High (alto) obtiene mejor desempeño" #~ msgid "Optimum" #~ msgstr "Optimo" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Ancho de banda del filtro de Rx" #~ msgid "Demodulator" #~ msgstr "Demodulador" #~ msgid "" #~ "Select demodulator type\n" #~ "Kahn power detector\n" #~ "Automatic Threshold Correcting" #~ msgstr "" #~ "Selecciona el tipo de demodulador\n" #~ "Detector de potencia de Kahn\n" #~ "Corrección automática de umbral" #~ msgid "" #~ "Enabled - use Kahn power demodulator\n" #~ "Disabled - use ATC demodulator" #~ msgstr "" #~ "Activado - usar demodulador Kahn\n" #~ "Desactivado - usar demodulador ATC" #~ msgid "Set page width" #~ msgstr "Establecer el ancho de la página" #~ msgid "after:" #~ msgstr "después:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (oculto)" #~ msgid "Use UTF-8" #~ msgstr "Usar UTF-8" #~ msgid "Notifications only" #~ msgstr "Solo notificaciones" #~ msgid "Displays" #~ msgstr "Interfaz" #~ msgid "Tx Power" #~ msgstr "Potencia" #~ msgid "Ser# in" #~ msgstr "Ser rec." #~ msgid "QSO Freq" #~ msgstr "Frec QSO" #~ msgid "Cnty" #~ msgstr "País" #~ msgid "#Out" #~ msgstr "#Env." #~ msgid "#In" #~ msgstr "#Recv." #~ msgid "Xchg" #~ msgstr "Xchg" #~ msgid "File exists. Are you sure you want to overwrite?" #~ msgstr "El fichero existe. Estas seguro que lo quieres sobre escribir?" #, fuzzy #~ msgid "2" #~ msgstr "2" #~ msgid "Cntst'" #~ msgstr "Contestia" #, fuzzy #~ msgid "Matched Filter in use" #~ msgstr "Modo en uso" #~ msgid "MT63" #~ msgstr "MT63" #~ msgid "Display true frequency in the waterfall" #~ msgstr "Mostrar la frecuencia real en la cascada" #~ msgid "" #~ "Enable to show the true transmit frequency on the waterfall when the " #~ "radio is in CW (A1A) mode" #~ msgstr "" #~ "Habilitar para mostrar la frecuencia real de transmisión en la cascada " #~ "cuando el radio está en CW (A1A)" #~ msgid "On Date" #~ msgstr "Fecha inicio" #~ msgid "Off Date" #~ msgstr "Fecha Fin" #~ msgid "Save log before exiting?" #~ msgstr "Salvar libro de contactos antes de salir?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Salvar macros modificadas antes de salir?" #~ msgid "View log" #~ msgstr "Ver log" #~ msgid "A message was logged" #~ msgstr "Un mensaje se añadió al log" #~ msgid "Cursor color" #~ msgstr "Color del cursor" #~ msgid "Cursor center line" #~ msgstr "Linea central del cursor" #~ msgid "Bandwidth tracks" #~ msgstr "Pistas de ancho" #~ msgid "Tracks color" #~ msgstr "Color de las pistas" #~ msgid "Wide tracks" #~ msgstr "Pistas anchas" #~ msgid "Wide center line" #~ msgstr "Linea central ancha" #~ msgid "Wide cursor" #~ msgstr "Cursor ancho" #~ msgid "FH" #~ msgstr "FH" #~ msgid "DomEX" #~ msgstr "DomEX" #~ msgid "eQSL upload when record logged" #~ msgstr "Subir a eQSL cuando se graba el contacto" #~ msgid "Default message sent with eQSL" #~ msgstr "Mensaje por defecto para eQSL" fldigi-4.2.05/po/Makevars0000664000175000017500000000347514532252172012111 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = w1hkj AT w1hkj DOT com # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = fldigi-4.2.05/po/pl.gmo0000664000175000017500000046343114611714004011531 00000000000000E |XYk /̺//,$\ϻ!:Slpju3*Ny$~ν "',.4:?DJQW^elry ;M V dnVt˿ ӿ   +3< C P ] j w   !8:?\!a&&a3HMRn&*=)h5,-)#Mb{%"&/&V}" &.+U* )&+P|"+#% I j  - GTg/y&!!5R!o"#!)Fb"r +)+ 8Wp '%1*\|( / B"P's," ,&#S$w.&2D-X*"   , <FY^ b lx "$&&Kr .&,Jc{  C& 8M d&n ,*%!G#Pt$ D#2h * / P Zdz 2 -,I=v2)%)O)y1 & -7 < FQbvz-    '3 ');envz   % 1 ?Md |d1HXp   1/7 F4S8';Mj y#+/#B Yg~  & &&:L]z !4V(v+ !/7>8v  '6KiW$' LH/'17N5a 0 (')P3z   "AU hu. 4;pe.BGM _+     & 4 AO)W&" *,*> isy!2 G U_t  ;,?Ga+h/  #-1 9GPY\ dnwd |  ) ;.I x ,I[CvV3Lf #8)A"k# $.> ,& S_fj   / =:X8!#<`B)&+0@!q* 1%B hr     ,%.N hst &&0W,h  ;9F %)/2!T2q(+*+:,f $$)((%Qw7.P Eq - "4 "W "z " " , ' -8 f !              > X  ] j  q &~      ' 3= :q 1       " - < L  P ^ f   (  : -IYk} 3)0BVg)     (->S$o$PV^ cn vb!/'#W{ & 0.@o t/  4,.[cks   : & 2<Ph  WXwZY+Y #-0 CNm;  7 NYu !29K, 6 3 ?`<2866o-   !5Igl@ &.2 8C^y    *I10{9' - M .j 0   !'!2! " " :"$H"m"p" u""""""""":"8#@#D# K#Y#m### ####$!$>$[$r${$$$ $$$$%%"%H%P%_%g% ~%%%% %%%M%E& ^& k&u&2y&&&& && ''-'C' Z'e'u'''' ''''( (,( 1(?( W(a( u( ((-( (( (( )$")G)3N)))) ) ) ))))) *34*/h***** **** ++)+>+N+ c++++ ++++++ ,',?,H,\,o,,,,,,, --,-<- K- U-_- o- z- - - - - -- -- -.. &. 1.=.0Y..#.9.//"&/I/i// / / /////*/ 0"070Q0&`00000000!01'191K1\1t11 1111111 12 2<2+P2|222222x2;S33F3 3 33!4!(4JJ4444'4%4(4 5;55,q51555 5 5#566'6;6O6g6p6 y6666666 7 77/7/77&g777 77767 88 .8<8S8/b8888 8,88'8 9 99=9 \9j99&9"99#9 :: %:F:_:{: :: : :2: ::;;.;-6;d;#m;;;; ; ;; ;#;.<G<P<j< z<<<</<==#= )=B3=v=== ===== >)>#;>0_>>>>>>>> ??1?!L? n?z? ???? ? ??? ? ??@ @(@B@ a@o@@@@@ @ @*@ @ @ A AAA$A (A5A:A>ATA(ZAAA AAAAAAAA AABB+B@B EBOBcBvBB BBBvB?C OCpC vC C CCCCCC DD.DCDWDmDDD D DD+D E EE3EHE3LEEEEEEEE E;FTF2\F*FF*FFGGDGGGH&.HUH@\HHHHHH2H8'I`IdIlIII I$I%I0 J.:J iJuJJJJJJJ K"K!7K"YK|KKKK(K^KQL YL[fLL LL L LMMM ,M9M MM [MgMnMMMMMM MMMMM MMNNN N$N -N ;NHN ON[N`NiN NN$NN wOOOOOOO O PP#'PKP SP_P/oPP PP P)PPTQmQ$QQ QQQQRRRaRRRR R RR RS)SBS]S sS~SSSSS S0S7*T bTnTT TTT T<T;U*WUUUUUU V0V!NVpVV+VVVV,W .W 9WGW(_W#W!W0WWX(X:XBXIX QX [X gX tXX X XX(XXXY$)Y3NY8Y YYYY!Z7&Z^ZmZZZ ZZZ1Z"[ '[ 5[V[s[[[[[[[ \!\@\ [\ e\o\x\ \\\ \1\\ ] ],]4<]q]]*] ]]4] 0^4:^o^^^^.^S^D_9Z____ ____``.`K` S` ^`&h`` ` ```` `"`aaa "a -a7a Ma Ya ea qa}a a a aaaaa ab bb/b @bLb]bqbbb b bbb-b cc 3c#Tc$xcc-ccc dd 0d;dBdFdMd`dedtd}dd'ddd d dde e&e;e@eGe_ewe|e e e!e eeee e ff"'fJf]f'qffmfg+$g/Pg%gBg:g<$h/ah h+hh hhhhhh ii 7iEi"Niqiiiiiiiiii* j4j IjTj\jbjzj(j"jjjjkk+k:k LkZkqkkkkkkk ll/lCl0Tl lllll$ll l l m m "m /m #o +Κ,B_5d$%*#@&`"+М0-2#F"j,#&ޝ0*6a~Ş/ݞ *?HMRdjlqu  ؟ݟ  ) 2<Rkq(&$'9agmv0ġء  ? &`)â ٢'  !4<$q$ ã%?DY_yEE 5@Tp.;ԥ  %BU<i #"զ&!(0JH{9ħ)0*4*_*#٨$& >LQez  ũԩ ש) ,@HQd jv_s)ج  #(+ ITev    í ѭ ۭ  Xm  ů    '2 9=G B #B/r y ȱ++$'P8x+ݲ(=[ds5 س)&;!Oq$ȴ  **,U-µ>ٵ*< L3Y7Ŷ ܶ &#EizO*޷ -'YUA1(Ztz&͹ӹ   ,G Y!g1ۺ  - 5C KW"] ػ#2Q:lE4lPѽֽܽ)15g&=d lw ſο ֿ#%,Ro/0  $+E]r '9 akr z ]~R72@s&  ! , : GRU ]gp    & 5BWq :% . <J\bv|<DYJ / <(I,r&%)(-R*( q$  2 DOU\q    %$ZJA#*9(dH8..L8{;' 8D.c$   !#6E2N  % (;+U -% +I^w!01%7W09")+Gs*+ (#D&h 0+ ")8L6mK2 ~ (!"!'9!a$ '.  >_dm| /HN b l"z . L9;,  " 6@Oo s /B .N}$9?/Eu{$$1 ! +8HX is;z!2$Fk a  *6 FPto+/*$Z( ( "6L?k 5' + 3@4H/}  0IAP  #<BDHLS \fuzXXXBXX MX]b  B Oh !( Jk;?2 GU)o9 )5E;]8<A/q; &CHRe%+ 1=(Z       7%U].J'-(U>~:13*^D.\1  +?Rek5(8I Zgx   7Qk-  ! 0: IS bT0"Hk . &7M_x !  +'6 ^k|+ )#M>T   '82`3"   #: NYu# #<T]c'$@QZv       & 0 :H \i y  $)@D&   ! -9BSi ky  9Y-o! 2 @Nk !) - 2 $; (`    <+ h Mn       Q:    , " ) % A5 Jw D    * +< h o       & 3F`z 56'8GWh<y2JPUZ/j1 && 0AU-\"&#<"X {  B  ' A+Lx!~ # * ,8en 30+\ay G! #.1H^t-65&. 6W&u !, E"Psw { -A I S_h}!  3LP b m z   6 O] mz,$=bix&&   $CSkz? : ERg|8 #0::k=1 -& T !!I!!*k!!!,!!M!B"["a"i""*"3""# #&#@# V#d##0#/#$$-$J$^$t$$$$)$'$%%%<%M%R%/m%h% &&j)&& & &&& && & '' ,' 9'D'K'c' k'w'' ' '''''''' '( (( ( )(6(=(Y( `(j(("(2(()))))**(*7*I*1X* ***7* * *++0)+.Z+x+3,06,g,o,,,, ,,,b,B-J-`-u---!---./. K.W. j.x....2.I/ [/i//////D/!D0f0W0000 1"1'?1g1z1 111121 2(272 T2.u2%2422363F3 M3 Y3 d3 n3|3 3333313(4?4Z4v414;455-5L5+c5;55555 66169H6,6 6)667$777W7!j7777&77 88 #8-8C8S8g88788889A9\9r9/{9,9,9: ":@/:!p::::.:e:%d;C;;; ;<< /<<<Q<m<< < <<!< <<=!=&= 7=E=5Z===== == = = = >(> ?> K> W>c>r>w>> > > >>> > >>?-?'4? \? i? t? ?5??"?& @1@+L@x@,@@%@@ A%A5ABDB,`BBBB BBBBCC C 7CDC)TC~CC2CCsCSD/hD.D$DAD7.E=fE;E E7E$F )F 3F @FMF TF `F kF#yFF F!F F FFG G (G$3GXGaGsG6GG G GGG H- H;H ZH{H HHH HH HHHI *I 8I*BI mI{I IIII-I JJ$J,J5J6;JrJ J J J J J J J J J J JJ KK %K1K-KKyK~KKKK K KKK"K LL #L/L 8L)FLpLLLLL7LMA6MxMMM(M:M9N%SNyNNN N.NO"O=ODOSOnOOOO O OO P"P8P)OPyP PP P P)PPQ Q!*QLQfQQQ0QQQ&R6RhKRSR@SIS!iSSS.S-ST("TKT ZTeT }T.T)T T T.T/'U'WU UUUUUU5UV/V#?VcV"V/VVVV WW0WAWTWkWW W W(W W=WX$X@X+XX3XXXX*X@Y+OY{YYYY!YYZ/ZEZWZ,nZ9ZZZ [[([ :[G[L[`[-{[ [ [+[ [[ \ \32\f\\$\\\ \\\]]]#]$']L]bf]8]3^ 6^A^X^w^z^}^1^^%^ ___.)_'X_$____'__`$4`%Y``$`1``aa/"aRaYa_afana!aaaaa7aOaOb6Vb#bb'bbGbGcJc^c1gcPcccd dd3d7d!MdSodddddde3eCeKe;Seeeeeee2e #f-fCf[f afof-tf&ff ffgg Cz_++c+T{M +nZ/?AWf}6"Db2QE&nkS,\*\t]!a\7xtj N6gJ>siAc|TX+^d}=Zj S?)\W[4`r*o?c#?:K0.b1d]XdA|s)m8z PXrN{V$0B u p!&7KRyP,IR-QrH\sq/a%Ovj12w%.q\SI@P45Y. /(`hQS{SAqL DJL;'3Ceq*{ 71#ula_ byq :B3$4+wnc|dke|1P[DF $#?lU_lV V X],Oye DQU { "xCpxFK'/.V(_ /&xmmR?&ZH;~}UC46"* .E9r!0divzb#@N tt>wBl[ HOkgk 5^hRb-+vG?>vKC<F85vN :clzJtcT':rr.Ah>m!%JJ=Y6ZyKT ai]u ffA+' =Is'y_-oYm'D%YaB~|Q=E-n$Wt9#AIM@oMOwI2V2 j@L/&g#8 GU47"s@T{Ym[Zfqj*m5ZnO;he!>,pztP0arF9Xl!?Q^<>xy 1Sv1 c%'F-&fGTP`H\v@&G|<_Z fjJ#}abO9)xXEp[`0vaeJ^4(k?"s;~j}g-,UJ!u5NW|<&{g3534 !(Gnsw8~iL{h;%MkBG!I ]Vc7RE8RF;~Olo{k`wC3pq] YF9F=L4^0Hcy:N"xxw 5< ud$KB=g}6fNf]v;)b=P[8\6,/)`euSB h^Hp37h(`*"CYE&Rb1afW+RD9qUoSp   e3;]  ]8Xe6CnPNm_<Ri}UJ2(oI ud^}_gNn=pE}z-n AwbG$VBdi6^wxI*`)@8~/@M$XogzDAY 1g*22KM(9<FWXE :~>%5)#V- u7C  1QHMi(~:i`yOSZs>G |BQ[8t$Lz*T,r$<9T"-/DhK3D;7 U[G4e=|2%t% Wz>\js,0hHWZk_y0L)#7<M:ouVloKMWpL .(OY",iI5U[Ej'kqL6l.rH.~d)TPm:'20^Q@93 Posted version: {CALL} other ops call sign {MODE} full mode / submode 4 07 7 5 21 29 6 22 31 Display ' ' character for unknown MORSE symbol Display '*' character for unknown MORSE symbol Display '_' character for unknown MORSE symbol Do not display unknown MORSE symbol at symbol @@ ".--.-." backslash \ ".-..-." close paren ) "-.--.-" colon : "---..." dollar sign $ "...-..-" exclamation ! "-.-.--" in open_paren ( "-.--." semi colon ; "-.-.-." underscore _ "..--.-"" "" RR"Disable PTT keys modem if multiple instances of fldigi (client) are connected to a single flrig (server).# Correlation rows# Created: %s # DFT computations / second# Records in logbook# retries before giving up# times to resend command before giving up$ SX%s # Fldigi Generated Config Script %s exists, overwrite?%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&OK&UI&View' WG( KN) KK**.exe*.txt+ AR- DU-.--.-.--.--...--....-.----..--.-..-.-..-..-.... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ......-.-...-..-00 = T; 9 = N11 - Slow, 2 - Medium, 3 - Fast1 minute 'PARIS '1.5 baud1.5 stop bits1/2 speed10-101000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types1010 Nr12 26 3213 23 3314070.15016 27 3617 00 1118 01 1219 24 351st Ext1x speed2 baud20 28 3821 29 4022 03 1523 04 1624 05 1825 06 2225 W26 25 3727 02 132x speed3 baud4 bar macro set below Tx4.5 baud500 Hz limit6 baud8 psk8-bit extended characters8-bit extended characters (UTF-8):< AR<#comments> ignore comments AFC on,off,toggle repeat after waiting NN sec alert using external wav file my antenna Xmt audio wav file send avatar operating band other call contest class clear log fields clear QSO fields clear RX pane clear TX pane contest counter ignore comment text modem timing test, spec' file modem timing test, 'n' random 5 char groups modem timing test, string 's' modem char/sec test on nn chars Analysis CSV on,off,toggle CW identifier decrement counter digital mode (adif) [Wait][Len](ms) log eQSL optional msg log eQSL FD class FD section insert text file valid xcvr filter width send CAT cmd rig freq has kbd focus my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot send mode ID; TX start only idle signal for NN.nn sec LDT default '%Y-%m-%d %H:%M%z' insert image file increment counter S/N etc. IMD etc. ZDT default '%Y-%m-%d %H:%MZ' last serno sent local date, default '%Y-%M-%D' saveQSO data, append msg to notes log at xmt time other locator use local date/time LOCK on,off,toggle saveQSO data, append msg to notes save QSO data local time, default %H%M change macro defs file map by value map on google mode my call my FD class my CNTY my county my locator my name my RST my FD section my ST my state other name Transmit |NN| successive RsID bursts next QSO rec # pause transmit pop current mode/freq from stack CW QSK post-timing other Province CW QSK pre-timing push current mode to stack insert QRG into Rx text # QSO recs QSO time (HHMM)) incr/decr xcvr freq qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously Rev on,off,toggle send CAT cmd valid xcvr hi cutoff filter valid xcvr low cutoff filter valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save current macro file save contest out
ARRL section current contest serno schedule execution for search DOWN for signal search UP for signal other State Digitalk On, Off, Toggle text at start of TX repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle end execution at Fldigi version delay xmt for NN.n sec WAV file; spec' file WAV file; 'n' random 5 char groups WAV file; string 's' WAV file; internal string Char WPM:Text WPM (15.0:5.0) get weather data for station get weather data exchange begin exchange end exchange in exchange out UTC datetime, default '%x %H:%MZ' zulu date, default '%Y-%M-%D Z' zulu time default %H%MZ= 1 (on)= BT> SK? Dup Color@@ ACAADIFAFCAFC behaviorAFC controlAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQARRL SectAX25 DecodeAbbreviation for County/RegionAbbreviation for State/ProvinceAbortAccess URLAcquisition S/N (dB)Acquisition search range (Hz)ActionActivate for Mortty K3NG sketchAddAdd CRLF after page width charactersAdd RsID signal to end of transmissionAdd address to notes fieldAdd date/timeAdd date/time stamp to each # received messageAdd geopolitical name of METAR stationAddrAddressAdjustAdjust cursor frequencyAdjust sensitivity by 1/N fractional values.Adjust the DSP bandwidthAdvanced configuration:AgeAlert volumeAllAll entriesAll settings shown here can be changed later via the Configure menuAllow TX After Signal Detection (Secs)Allow errorsAllow transmits after 'N' seconds of a signal detection.Allow/Disallow ChangesAlt ColorAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAlways transmit at 1500 Hertz center freq.Amplitude of right channel QSK signalAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAttackAudible BELLAudioAudio Codec ppm correctionAudio Stream ProcesingAudio device infoAudio device information is only available for the PortAudio backendAudio device shared by Audio Alerts and Rx MonitorAudio fileAudio frequencyAudio input deviceAudio on Auxiliary PortAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAudit logAuto CRLFAuto CRLF line lengthAuto Connect / RetryAuto SpaceAuto connect when fldigi opens (server must be up)Auto recordAuto-align everyAuto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAutomatically start csv data file recording with wav playbackAutomatically start psk reporter socket connectionAvailable substringsAxisBCM GPIO pin ValueBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBad frequencyBad modem idBandBand pass filter / unknown / referenceBands must matchBandwidthBaudBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBfrBg ColorBg colorBits per characterBkBrowseBuffer allocation Error near File: %s Line %dBug me about saving log entriesBuild infoBusyButtonButton HeightC&ountriesC-Media PTTC-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. GPIO signal line 3 (pin 13) is used for PTT control. Fldigi accesses the GPIO lines as a Human Interface Device (HID). Discovered C-Media devices are enumerated in the 'C-Media device' list box. On Linux: add a file named cmedia.rules to /etc/udev/rules.d/ The file should contain a single line KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"C-Media deviceCALLSIGN always lower caseCAT LED stateCAT command for PTTCPU usage increases with waterfall heightCQ STATECQ zoneCQZCR-CR-LFCSV Data RecordingCSV...CT spaceCTRLCWCW CAT & WinKeyer CompensationCW ID modesCW KeylineCW Postamble IDCW QSK signal on right channelCW SSCW SS CheckCW SS Prec'CW SS SectionCW SS SerNo RCW Sweepstakes ContestCW dsp filter bandwidthCW is LSBCW is LSB modeCW keying using CAT command strings. Available for supported transceivers. Use with RigCAT or flrig transceiver control. A separate serial port is NOT needed. Disable CAT PTT if transceiver interprets that as a keydown command (e.g. TS480). Recommend setting transceiver to either semi or full break-in. Enter correct CIV address for Icom transceivers.CW sweepstakes precedenceCW sweepstakes rcvd ser. no.CW sweepstakes sectionCW transmit WPMCW wpm keyboard stringsCW wpm using paddle keyerCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CalibrateCallCall SearchCall back for script command %s reported an ErrorCall sign workedCallookCallook onlineCallook.infoCallook.info lookup (free service US callsigns only)Callook.info web siteCallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture Log ReportCapture Lookup Capture Radio ReportCapture Spot ReportCapture Spot TuneCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture/Playback supports full duplex operationCapture:Carrier Sense Mulitiple AccessCarrier frequency (Hz)Carrier shiftCarrier shift in HertzCelsiusCenter DXspot freq at sweet spotCenter display on signalCenter freqCenter in passband Right click to undoCenter lineCenter of WEFAX signal Nominal 1900 HzCenter on ReferenceCenter on UnknownCenter on medianCentered at 1500 Hz (SHARES)Change # of psk viewer channelsChange Axis' colorChange ONLY to experimentChange application look and feelChange colorChange dir...Change legend colorChange plot background colorChange plot reference track colorChange plot unknown track colorChange positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel 1 AttenuatorChannel 2 attenuatorChannel labelChannel numberChannels, first channel starts at waterfall lower limitCharacter count in args[] parameter exceeds expectationsCharacter searched not foundChars/Row:CheckCheck AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check if xcvr uses LSB for CWCheck if xcvr uses USB for RTTYCheck this to be notified when an RSID is received without changing modem and frequencyCheck to enable TCP/IP IO ConnectionCheck to enable UDP/IP IOCheck to enable character encode/decodeCheck to enable character encode/decode Select one character from each groupCheck to reduce CPU load in PSK and RTTY modes.Check value receivedChecking for updates...Choose directory to store KML documentsCity of station workedClassCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear BothClear RcvdClear SentClear UDP textClear channel text after # seconds of inactivityClear compensationClear list?Clear log controls sets RST in to 599/59Clear log controls sets RST out to 599/59Clear log entries after saving or using macro Clear log fields - new CALLClear log fields?Clear on saveClear textCloseClose ListCmd WPMCollapse TreeColorColor for outgoing telnet textColor of Mark TrackColors and cursorsColors-FontsColors-Fonts/FreqDisp - MetersColors-Fonts/Function keysColors-Fonts/Logging controlsColors-Fonts/Rx-TxColors-Fonts/Signal LevelColors-Fonts/TabsCommand %s ignored, dot notation not supportedCommand %s ignored, structured command not supportedCommand Not FoundCommand line optionsCommand missing ':'.Command run on KML creationCommand started when KML files are generated. Subprocesses are started once, and restarted if needed.Commands are echoedCompComp'Compensate (secs)Compensation in msec default = 0Compensationin microsecondsCompute correlation factor over this # rowsCompute timing compensation for CAT CW and WinKeyer CW. Computation at current WPM . Set WPM to nominal (suggest 20 WPM). Compensation will be good over a +/- 10 WPM range. Calibration/Test is 1 minute of 'PARIS '.Computer generated file nameConditionsConfigConfig DialogConfig ScriptsConfiguration InterfaceConfigureConfirmConfirm QuitConfirm RESETConfirm exitConfirm quit?ConnectConnect / Disconnect from Nav Config portConnect / Disconnect from Nav FSK portConnect / Disconnect from WinKeyerConnect / Disconnect from nanoIOConnect to MacLoggerConnect to host program on FLDIGI start upConnect to serverConnect/disconnect to Talker socket serverConnectedCont'ContestContest Exchange / Serial #Contest exchange receivedContest exchange sentContest seral # sentContest serial # receivedContest:ContestsContests/Field DayContests/GeneralContests/JOTA SchoolContext NotesContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCorrelationCould not find LoTW report file. Download from ARRL's LoTW page after logging in at: https://lotw.arrl.org/lotwuser/default Store the report file to the fldigi LOTW folder, naming the file 'lotwreport.adi'Could not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCounties / RegionsCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate keyed square wave on right audio channelCreate new logbook fileCreate sunspotsCustom shiftCustom text searchCustom...CutCut 0/9DFT EstimatorDFT rateDIRECTEDDPDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDTR/RTS keying may be assigned to flrig, share the RigCat serial port, share the Separate PTT serial port, or be assigned to separate serial port. No settings for baud, stops bits, etc are needed.DTR/RTS signal line FSKDX ClusterDX Cluster DialogDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioDash/DotData FilterData base lookupData files repositoryData files sourcesData files updateData files...Data retention time, in hours (0 for no limit)Data sourceDatabase merger in progressDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDebug OutputDecayDecode (CWI suppression)Decode AX25 Packets into human readable formDecode DTMF tonesDecode received DTMF tonesDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log fileDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DefaultDefault CW tracking pointDefault RST in to 599/59Default RST out to 599/59Default RTTY tracking pointDefault SettingsDefault URLDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault messageDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec after executing mode changeDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete entry?Delete local data files if selected.Delete the current recordDeselectDetect the THOR preamble Clear the Rx pipelineDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDetector high thresholdDetector low thresholdDevice supports full duplexDevice:DiddleDiddle On/OFFDiddle charDiddle characterDifference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirected received textDirectory path not foundDirectory...Disable CAT PTTDisable PTTDisable alert dialogDisable allDisable flrig CW PTTDisable freq changeDisable further detection when RSID is receivedDisable if flrig not used.Disable on very slow CPUs or if signal browser is not usedDisable spotting when signal browser(s) are not visible.Disables detectorDisplay RX as a scrolling marqueeDisplay RX in reverse videoDisplay decoded as assigned keyDisplay logbook read datum at startDisplay macro filename at startDisplay the decoded prosign in the RX text using the short cut keyDisplay timed delivery message if enabledDisplays the Slot Time in MillisecondsDisplays the Transmit Delay in MillisecondsDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDon't saveDot / Space timing incrementDragging on the waterfall scale changes frequencyDriver requires stop bits to be ZERO!Dup ColorDuplicate check, CALL plusDuplicatesEEQSL-rcvdEQSL-sentEchoEcho paddle chars to Rx PanelEdge shapeEdge timingElecraftEmpties KML documents when starting program.EnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable ARQEnable ARQ for programs that support TCP and FLDIGI ARQ protocol. Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol. Only one interface (ARQ/KISS) can be active at any given time. KISS/ARQ/XML Addr/Port changes require program restart.Enable Auto-align afterEnable Busy ChannelEnable CSMAEnable CW operationEnable DSP prior to decoderEnable DTR signal line, default is RTSEnable Data StreamEnable FSK on serial portEnable GPIO PTT (Pi specific controls)Enable HistogramEnable Histogram threshold signal monitoringEnable KISSEnable MultiPSK-compatible FECEnable TTY operationEnable UDP log fileEnable Winkeyer PTT outputEnable Winkeyer audio toneEnable Winkeyer tone keyingEnable allEnable check box to show each respective operator controlEnable contest character spacingEnable drag cursor on waterfall scaleEnable encode/decode vestigial pilot toneEnable flrig xcvr control with fldigi as clientEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable paddle auto spacing of charactersEnable rx text streamEnable short preamble for 8PSK transmissionEnable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable this to send start/stop tonesEnable to always plot data over axisEnable to inhibit TX on signal DetectionsEnable to plot track lines 3 pixels wideEnable to put Tx panel above Rx panelEnable to select date rangeEnable to use flrig FSK keyerEnable when both programs are using the same IP addressEnabledEnabled - 1.5 stop bits Disabled - 2 stop bitsEnabled - log QSO using Mark frequency Disabled - log QSO using center frequencyEnabled - use Mark/Space filter outputs Disabled - use pseudo signalsEnd of line reachedEnd of xmt IDEnter METAR data internet URLEnter QTC textEnter full path-filename for external programEnter full path-filename for flampEnter full path-filename for fllogEnter full path-filename for flmsgEnter full path-filename for flnetEnter full path-filename for flrigEnter full path-filename for tqsl executableEnter full path-name for cty.dat folderEnter test string or leave blank for default:Enter time span in minutesEnter transceiver HEX CIV addressErrorEvenEven LinesEven linesEventEvent logExch InExch OutExchange InExchange OutExecutable file to insertExecuteExecute command on KML files.Executing script file: %sExitExit promptsExportExport SetupExport logbook records for LoTW uploadExport records for LoTW uploadExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extend last dit/dot in msec default = 0Extra duration to first dit/dot in msec default = 0Extract files for use with external "wrap / flmsg" programExtract times out after NN seconds of inactivity.FD classFD sectionFECFFT averagingFFT prefilter window functionFIR FilterFLMSG files...FMT sample rateFSKFSK InterfaceFSK PTTFSK independent serial portFSK portFahrenheitFarnsworth keying (0 = none) default = 0Fax images destination directoryFeel free to skip any pages or exit the wizard at any timeField Day Callsign May be same as OP callsignField Day ClassField Day LoggingField Day SectionField Day class receivedField Section receivedFile I/O onlyFile not foundFile pathname:File read errorFile:FilesFill in Country / Azimuth using cty.dat informationFilterFilter FFT outputFilter Shape FactorFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFirst select audio alert playback deviceFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFlrig PTT keys modemFlushes the TX buffer after x period when Busy Channel remains on (TX inhibited)FoldersFontFont colorFont...Font/ColorFont:Force RST in/out to 599/59Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFForce save split imageFree service courtesy of OKFreqFreq CorrectionFreq.FrequencyFrequency Analysis / FMT Rx CorrectionFrequency CorrectionFrequency in MHzFrequency scaleFrequency shiftFrequency shift of WEFAX signal Nominal 800 HzFullFull reportFundamental frequency of QSK square wave signalGPIO PTT (Pi specific controls)GPIO lineGeneralGeneral ErrorGenerateGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3HamCall onlineHamQTHHamQTH onlineHamQTH.comHamcallHamcall.netHamlib read timeoutHamlib used for rig controlHangHanning/Blackman - use edge timing BPF - use BPF bandwidthHeard agingHeard logHeight of macro barHell Receive ParametersHell Transmit ParametersHex CIV addrHideHide window after (s):HighHigh frequency limit in HzHost:II/OIDsIDs/CWIDs/RsIDIDs/VideoIFKP Raw ImageIOTAIP Address Port NumberIP Address for ARQ interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for KISS interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for XMLRPC interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for fllog interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for flrig interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostITU zoneITUZIcomIdle transmit before data sentIgnore duplicatesImage LPFInInactivity timeoutInches Hg.Include the transmit frequencyInclusive stop date for exportIncr'InfoInhibit 7 bit modem change notice on user or RSID receptionInhibit 7bit ModemInit delay (ms)Initial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInput signal levelInsert NN LTRS bytes at start of each transmissionInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert full METAR reportInsert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Interesting notesInterleave SYNOP and textInterleave text with decoded SYNOP messages, or replacement.Invalid File Name Pointer (NULL) in function %s:%dInvalid Modem for KISS IOInvalid function parameter 'char *file_name_path' (null)Invalid function parameter (internal non-script error)Invalid parameterIslands on the airIssues reported in processing script file: %sJOTAJOTA scoutJOTA troopJamboree OTAJamboree On The AirK3 A1A configuationK3NG Arduino sketch emulationKISSKML balloon display styleKML balloon in plain text, or HTML, in plain tables or matrices.KML files directoryKML refresh interval (seconds)KML root fileKML server enabled (On / Off)KenwoodKeyKeyerKeyer ModeKeying compensation (msec)Keying ratio default = 3.0Keying weight default = 50Kid's AgeLED brightnessLOCLOTW-rcvdLOTW-sentLTRS at startLast QSOLatencyLeadinLeadin in msec default = 0Leading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click to select possible dup colorLeft click to toggle Status BarLeft click to toggle VuMeterLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Limit AFC movement to this rangeLimit freq estimate error to this valueLimit to a few characters, as in CQEM or IOTA etc.Line/AxisLine: %d Error:%d %s (%s)Listen / BindListen for signals within this rangeLkLoTWLoTW ReviewLoTW download fileLoTW rcvd dateLoTW sent dateLoadLoad a new paletteLoad image fileLoad last used macro file at startLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocate tqsl executableLocationLocatorLockLock transmit frequencyLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLog on to pskrep when starting fldigiLogbookLogbook DialogLoggingLogging Panel ControlsLogging/LoTWLogging/MacLoggerLogging/N3FJP logsLogging/QSO loggingLogging/eQSLLogin name for QRZ / Hamcall / HamQTHLogs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)Long receive integrationLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow frequency limit in HzLow tone at 500 HzLowerLower limitLowest freq on bottom of viewerMARK polarityMARK/SPACE reversedMETAR station ID codeMETAR station locationMFSK ImageMFSK image fileMYCALL always lower caseMYCALL detected wavMacro Button LabelMacro Edit FontMacro TextMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesManual tuningMarkMark PolarityMark frequency in HertzMark onlyMark prev freq/modeMark-SpaceMarquee textMatchMatch logbook records with LoTW download fileMatched Filt'Matched Filter bandwidthMax ErrorMax Image RowsMaximum open subscripts reached.May require resizing the Rx/Tx panelMediumMemory Allocation Error (internal non-script error)Merge ADIF fileMerge...Message LoggingMeter ColorMiles / HourMilliSecondsMin HitsMin WPMMinimal controlsMinimum # hits in tone detectorMinimum WPM setting default = 10Minimum distance for splitting alias nodes (Meters)Minimum distance for splitting aliases (Meters)Minimum time between eventsMiscMisc/AutostartMisc/CPUMisc/DTMFMisc/KMLMisc/NBEMS interfaceMisc/PSK reporterMisc/PSMMisc/Rx text captureMisc/Save ParametersMisc/Sweet SpotMisc/TCP-IP sessionsMissing command %s after line %dMissing paired quotes (")ModeMode delay (msec)Mode in useMode must matchMode width limitModeRegModemModem Bandwidth Margins Modem carrierModem signal on left and right channelsModem/CWModem/CW/CAT KeyingModem/CW/CAT comp'Modem/CW/CAT keyingModem/CW/DTR-RTS keyingModem/CW/Extended Chars.Modem/CW/GeneralModem/CW/ProsignsModem/CW/Punctuation-NoiseModem/CW/Timing and QSKModem/CW/WinKeyerModem/CW/nanoIOModem/ContestiaModem/DominoEXModem/FMTModem/FSQModem/Feld HellModem/IFKPModem/MT-63Modem/NavtexModem/OliviaModem/PskModem/TTYModem/TTY/FSKModem/TTY/NavigatorModem/TTY/RxModem/TTY/SynopModem/TTY/TxModem/TTY/Winkeyer 3Modem/TTY/nanoIOModem/ThorModem/WefaxMonitor for TCP connection.Monitor signals in modem bandwitdh plus margins.Monitor transmitted signalMouse wheel active on macro buttonsMoving average - average over NN seconds^0 - no averagingMsec post-keydownMsec pre-keydownMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy ClassMy JOTA TroopMy SectionMy StationMy TroopMy callsign de CALLMy transmit CW WPMNN3FJP DX spots centered on mode sweet spotN3FJP Server IP AddressN3FJP Server IP PortNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameName-RName-SNarrow LPF if image noisyNav Channel 1 attenuatorNav FSK MARK PolarityNav FSK PTT - should always be onNav FSK Stop bitsNav FSK baud rateNav FSK side toneNavCAT state LEDNavChannel 2 AttenuatorNavLED brightnessNavRF AttenuatorNavWinkey PTTNavigator configuration portNavigator serial portNewNew record / Save recordNextNoNo ErrorsNo faster than thisNo records in lotw download fileNo slower than thisNon transmit window after a transmit periodNoneNormalNormal drop speed / valueNot a script file/tag not foundNot worked beforeNotchNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.Note: must be selected and enabled for Rx Audio monitoring!NotesNotification dialog closes after XX seconds;^j0 == dialog remains openNotificationsNotify onlyNotify time outNumber and position of macro barsNumber of digits in serial numberNumber of hours data is kept for each node. Zero means keeping everything.OOKONON - band pass filter reference signalON - band pass filter unknown signalON - Marquee style OFF - Clear & restartON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use Rx spot freq OFF - use Tx spot freqON - use last set of macros OFF - use default setOSSOddOdd LinesOdd linesOffset plot lines on vertical scaleOn/OffOne above Rx/TxOne above waterfallOne below waterfallOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperate tqsl in batch mode (no dialog)Operating bandOperatorOperator CallOperator Callsign:Operator Name:Operator callsign (if different than station callsign)Operator workedOperator-StationOperators QTHOperators age receivedOperators nameOptional configuration in format: param=val ...OptionsOtherOutOutput PInsOutput port number when same IP address usedOverOver writing call back funcion for "%s"POWER(r)PSK et al.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PSM AttenuatePSM Histogram ThresholdPTT ONPTT delays valid for all CAT/PTT typesPTT enables auxiliary audio sourcePTT end of transmit delayPTT is a CAT command (not hardware)PTT keylinePTT offPTT tone on right audio channel PTT using hamlib commandPTT via and PTT via Hamlib commandPWR-meterPaddlePaddle DogPaddle echoPaddle sampling (see Winkeyer manual) default = 50Palette: Parameter is not valid.ParityParse all incoming textPartialPassed parameter is not of the expected type.PasswordPassword for QRZ / Hamcall / HamQTHPassword requiredPastePaths (hidden)Percent (%)PersistancePick baud rate from listPilot tonePilot tone power relative to signalPlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Poll Interval (msec)Polling Interval (msec)Popup info after a 2 second hover on a callsignPortPort is second SCU-17 devicePort:PortAudioPosition the 4 bar macro set below Tx panel Default above Rx panelPost write delay (msec)Post-keydown timing (ms)Power Signal MonitorPower scalePrPre-Signal TonePre-keydown timing (ms)Preamble DetectionPrecedencePress only if you change the address/portPress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro fileProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPulse shapePulse width (msec)PulseAudioPunctuation/Noise ProcessingPwrQRZQRZ cdromQRZ on lineQRZ.comQSKQSK amplitudeQSK frequencyQSK on right audio channelQSLQSL rcvd dateQSL received on this dateQSL route of contacted stationQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO must not occur within a time period ofQSOp categoryQSOp countyQSOp nameQSOp stateQSYQTC:QTHQTH NicknameQTH:QthQuery state of nanoIOQuietQuiet mode [-q], do not open tqsl dialogRE:REGEX detected wavRF attenuatorRSID receptionRST always 599/59RST rcvdRST sentRST(r)RST(s)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY BellRTTY Bell audio wavRTTY Scope DisplayRTTY is USB modeRX - unshift on spaceRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine pulse shape factorRangeRange +/- wpmRange 1...3Range 1...4Range WPM setting default = 20Range WPM setting default = 25RatioReally delete record for "%s"?ReceiveReceive UsageReceive filter bandwidthReceive synchronizerReceived scout nameReceived troop numberRecent activity for grid Reception of flmsg filesReception reports...ReconnectRecord AudioRecord both channelsRecord data for NN minutes after auto startRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)RefRefresh time interval written in KML file (Seconds)ReloadReload cty.datRemoveRemove call after ...Replay trackline audioReport ARQ frames average S/NReport BrowserReport actual modem RF frequencyReport rig frequency (enable only if you have rig control!)ReportsRequest updates every 'poll interval' millisecondsRequired for some transceivers e.g. TS-480ResetReset FEC blocks when changing BW or TonesReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestartRestart the FSK interface Necessary if changes made to configurationRestore UART Settings on CloseRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsResultRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetain tx freq lockRetriesRetrieveRetrieve for active modem useRetry interval (ms)Return KISS TCP IO connection to a Listening stateReturns IP Address and port number to the default value.RevReverseReverse (Rv) controlReverse Left/Right channelsReverse Mark/SpaceReverse videoRevert to Unsifted char's on a spaceRevert to unshifted char's on a spaceReview / edit the exported LoTW upload adif fileReview lotw.adif file before sending with tqslRig ControlRig Control/C-Media PTTRig Control/CAT (rigcat)Rig Control/GPIORig Control/HamlibRig Control/Hardware PTTRig Control/flrigRig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig/Log ControlsRig:RigCAT used for rig controlRight/Left Select Least Signficant DigitRight/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSDRng WPMRound Up ChkRow-to-row correlation Used to detect presence of WEFAX signal Lower: more false detectionsRsID audio alert wavRst receivedRst sentRun programRun program:Rx / Tx PanelsRx AGCRx Audio DialogRx Codec PPMRx Height in pixelsRx ParametersRx Serial #Rx WPMRx Width MultiplierRx bkgndRx fontRx/Tx Character setRx/Tx RsID EOTRxID narRxID wideS-meterS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2SS checkSS precSS sectionSS ser #SYNOP to ADIFSYNOP to KMLSampleSample rateSaveSave ...Save AFC state by modeSave ConfigSave Reverse state by modeSave Squelch level and state by modeSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save log entry?Save logbook fileSave macro fileSave paletteSave text asSave this paletteSave transmit level control by modeSave...Scale ColorSchool Round UpSchool Round Up - allowable I, H, O - see rulesScopeScout Op'Scout Operator NameScript FilesScript Parsing Class Allocation Fail (%s)Script device path not found.Script file contains potential issues See documentation and/or Log file for details.Script file name (path) invalidScript file name (path) null pointerScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Secondary TextSecondsSectionSee https://en.wikipedia.org/wiki/Morse_code for information regarding extended Morse characters.SelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Logging as QSO or ContestSelect PTT on stateSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect audio fileSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect destination directorySelect deviceSelect device & Initialize the H/W PTT interfaceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect paritySelect pin numberSelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSelection of transfer direct takes precedence over all other flmsg reception settingsSelf Organizing MappingSendSend "paris " WPM timesSend CW cut #'sSend Callsign in CW at end of every transmissionSend QSO data to LoTW when loggedSend Test characterSend WPM 'PARIS ' wordsSend a continuous stream of test charactersSend at this WPMSend beacon every ...Send continuouslySend data stream directly to executing flmsgSend imageSend image...Send lotw.adif via tqslSend reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSent scout nameSent troop numberSer NoRSer inSer outSer. PortSerial # inSerial # outSerial BaudSerial InterfaceSerial PortSerial echoServer string:Set - mark logical HIGH Read from nanoIOSet >0 if pulsed PTT usedSet Viewer SquelchSet level for good viewingSet the number of characters per rowSet the type of resampler used of offset correctionSets the theshold level to x value above the noise levelShaped TxShare RIGCAT portShare Separate PTT portShare the RIGIO portShares RIGIO serial port, or usesShft-click: select unknown Ctrl-click: select referenceShort PreambleShort description of antennaShowShow DXCC entitiesShow TX timerShow alert window:Show all modesShow and enable Power Signal Monitor button (PSM)Show bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow delivery messageShow fewer modesShow macro control codesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallShutdown flrig with fldigiSide toneSideband:SidetoneSignal BrowserSignal LevelSignal Level (dB)Signal Level IndicatorSignal LevelsSignal averaging over time 0 - least 4 - greatestSignal browserSignal range (dB)Signal searchSignal trackingSingle macro bar below logging panel variable heightSingle-click to captureSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlot TimeSlow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard KeyingSlow CPU (less than 700MHz)Slow drop rateSoft-bit decodingSoft-symbol decodingSoftware reversal of left-right audio channelsSome changes made by the script requires program restart before they become active.Sort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSound Card FSKSound Card InterfaceSound:SoundcardSoundcard/AlertsSoundcard/DevicesSoundcard/Right channelSoundcard/SettingsSoundcard/Signal LevelSoundcard/Wav file recordingSounderSpace onlySpec CharSpectrum Scope / Waterfall interactionSpectrum scopeSpeed (WPM):Speed testSpotSpotting disabledSquelchSquelch levelSquelch level/activated control(s)Squelch open (sec)StStartStart DateStart NbrStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState QSO PartyState must matchStation CallStation Callsign:Station LOCStation LocatorStation Locator:Station QTHStation callsignStation heard twiceStations grid squareStatusStop Auto-align afterStop DateStop bitsStopbitsStore images in this directoryStore mode and frequency Right click for listStream TextSubmit each QSO as loggedSubmit password with each uploadSubmit the upload adif file to LoTWSubscript execution fail (internal).Sunspot creation underway!Suppressed carrier +/- AF injection frequencySwapSwap left/right keyer contactsSwitch to ARQ I/OSync to data recordSys ColorsSystemT/RTCP/IPTCP/IP Data StreamTESTTHOR Raw ImageTTY BaudTTY i/oTX - unshift on spaceTX Buffer Flush Timer (Mins, 0=Disable)TX PowerTX deadmen timeout (mins)TX generateTX offsetTX ppmTX sound card correctionTab ColorTabular data sourcesTailTalkerTalker Socket (MS only)Ten Ten number receivedTestTest =>Test SignalsTest charTest character for QSK adjustmentTest commandTest duration (60 seconds)Test text fileTest...Text CaptureText ColorsText HighlightingText Tags (tags use {} delimiters)Text capture orderText file to insertText to send during keyboard idle timesText...The RsID notification message contents and display characteristics are configured on the "Notifications" tab.The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.The wizard will guide you through the basic fldigi settings:These tags can also be used in Thick linesThis event's regular expression is invalid.TimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time outTime out xmt attempt in XX secondsTime span overTimeoutTimeout (msec)Timeout (secs)TimingTiming/SettingsTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTToggles PTT line 20x; check DRA-30 ptt LEDTone Duration (secs)Tone KeyerTone ONTonesTracked CW speed in WPMTrackingTransceiver control, flrig/rigcat/hamlibTransfer direct to executing flmsgTransfer speed, X1-normalTransition Level (dB)TransmitTransmit Data DelayTransmit PowerTransmit UsageTransmit callsignTransmit fontTransmit level controlTransmit lower case textTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit textTransmit upper start toneTransmit video textTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):Troop-RTroop-STuneTune margin (tone frequency spacing)Tune to Rx SpotTwo scheme 1Two scheme 10Two scheme 2Two scheme 3Two scheme 4Two scheme 5Two scheme 6Two scheme 7Two scheme 8Two scheme 9Tx ParametersTx Width MultiplierTx above RxTx bkgndTx fontTx level attenuator (dB)Tx power used for logbook entriesTxIDUUDP data streamUDP/IPUIUI languageUI schemeUI/Browser/ChannelsUI/Browser/ColorsUI/Browser/Detection LevelUI/GeneralUI/Macro buttonsUI/Rx TextUI/TouchUNDIRECTEDUS States / Canadian ProvincesUS state of station workedUS units of distance (QRB)US/Canadian Counties / RegionsUSB serial I/OUSOSUnable to create file %s (Error No=%d) func %s:%dUnable to open file %sUncheck if KML is never usedUndefined errorUndirected received textUndoUnexpected end of file reached.Unexpected end of parameter (args[]) list foundUnexpected end of parameter check list foundUnknown character decode (noise)Unmatched LoTW RecordsUnshift on spaceUnsupported audio formatUpdateUpdate selected local data files with repository contentUpdate site not availableUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse C-Media PTTUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse PotUse Pulse Audio serverUse RTSUse RigCATUse Separate Keying Serial PortUse T/N for 0/9Use TAB delimitersUse WPM pot'Use averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse flrig FSK keyingUse for triggering amplifier carrier detectUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse soft-decision decoding for symbol detection Assists soft-bit decodingUse tab delimiters between columns on csv export file.Use these for WinKeyer and nanoCWUse this tqsl station locationUse uHRouter PTTUse wave shaping on Tx signalUsed For PSKMail and FLDIGI Suite of ProgramsUsed ONLY for frequency analysis modeUsed for BPQ32Used to adjust the aggressiveness of TXUser IDUser nameUsing UDP port #VSP EnableValid Signal Sample Period (msecs)Valid signal sample period in MillisecondsVerboseVerifyVerify database with LoTW download fileVerify database with eQSL download fileVersion %s is available at Source ForgeVideo ID modesVideo Preamble IDViewView UnmatchedView/Hide 48 macrosView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible BELLVisible modesVisit Hamcall web siteVisit QRZ web siteVisit hamQTH web siteWARNING - this will over write ALL settingsWEFAX images...WF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWPMWPM SettingsWPM TrackingWPM pot update to nanoIO requiredWPM settingWPM speed for Winkeyer Command strings default = 18WaitWait NN seconds for LoTW responseWait for response to first CAT commandWait for response to subsequent commandWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall Centered on unknown signalWaterfall centered 1/2 way between unknown & referenceWaterfall centered on reference signalWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWaterfall/Buttons & ControlsWaterfall/DisplayWaterfall/FFT ProcessingWaterfall/Mouse usageWaterfall/SpectrumWav file recordingWav file recording - START IMMEDIATELYWav file recording - SYNCHRONIZE with data recordingWav write sample rateWeather Fax Image TXWebWeb Browser lookupWeb/PskmailWeb/WXWeightWheel actionWhen no signal presentWhere generated KML documents are stored.WideWidthWill occur after this time in secondsWinKey PTTWinkeyer pot controls WPMWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)Write delay (msec)Write state of nanoIO to Arduino EEPROMXMITXMLXMT lockXON/XOFF flow controlXY - classic scopeXcvr serial portYYaesuYesYou are probably running an alpha version You are running the latest versionYou must have tqsl installed and it's location recorded for LoTW updates to work!You need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordYour tqsl login passwordaaafteralways append to file(s)append # directive msgs to named fileautomatic data uploadcallsign tooltips in received textchar WPMcharsclear old datacmd_buffer allocation error near line %dconvert operator callsign to lower caseconvert other callsign to lower casecty.dat foldercurrent wx conditionsdefaultdefault text to send with etcdefault uses date/time ondisable ' ' for no printed characterdisable '*'or no printed characterdisable '_' for no printed characterdisable for no printed characterdisplay PSM button on main dialogdisplay Rx control chars as ascii stringeQSL rcvd dateeQSL sent dateeQSL userenable mouse wheel control of macro barflamp:fllogfllog:flmsg *flmsg received wavflmsg timed out wavflmsg.exe *.exeflmsg:flnet:flrigflrig is the preferred method of tranceiver controlflrig xmlrpc server parameters these controls are mirrored on the IO configuration tabflrig:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form 1 must matchfree form exchangefreq scale = N * modem bandwidthh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourlabelleft click on WF recenters spectrum scopeleft click transfers frequency to scope center frequencylock WF at 1500 HzmbarsminutesnanoIO - TTY baudnanoIO serial portnopilot power (dB)print ^! execution codes in Rx panelrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportsrowsscale spectrum display linked to modem bandwidthsecondssecssecs' =>select browser fontselect by datesend compensation to nanoIOsend when logged (log button, , )text WPMtext WPM <= char WPMtqsl station locationtqsl:track coloruseuse waterfall range/limit valuesvalues left/below waterfallwaterfall-only modewww urlxmt start/stop tonesyes{NAME} other ops nameProject-Id-Version: fldigi 3.23.14 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2022-08-29 18:08+0200 Last-Translator: Roman Bagiński Language-Team: Polish (Roman Bagiński) Language: pl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: iso-8859-1 X-Generator: Poedit 2.2 Dolaczona wersja: {CALL} inna Stacja{MODE} emisja/ podtryb pracy 4 07 75 21 296 22 31Wyświetl znak ' ' dla nieznanego symbolu MORSE'aWyświetl znak '*' dla nieznanego symbolu Morse'aWyswietl '_' znak dla nieznanego znaku MORSENie wyświetlaj nieznanego symbolu Morse'aprzy symbolu @@ ".--.-."ukośnik wsteczny \ ".-..-."zamknij paren ".-..-."dwukropek : "---..."znak dolara $ "...-.. -"wykrzyknik ! „-.-.--” w otwórz_paren ( "-.--."średnik ; „-.-.-”.podkreślenie _ "..--.-"" "" RR"Wylacz klucz PTT modemu, jesli uruchomiono fldigi (klient) i podłączono do jednego flrig (serwer).# Rzędy korelacji# Utworzono: %s # Obliczenia DFT / Drugi# Zapisy w dzienniku# prób przed rezygnacja# razy, aby ponownie wysłac komendę$ SX%s # Fldigi Wygenerowany Konfig skrypt %s: istnieje, zastapic ?%s log rozpoczęto %s%s: Nie istnieje, utworzyć ?O progrKonfigurujPlikPomocDziennik&OK&UIWidok' WG( KN) KK**.exe*.txt+ AR- DU-.--.-.--.--...--....-.----..--.-..-.-..-..-.... Te ustawienia są na innych kartach. Są replikowane tutaj dla wygody. Mozesz zmienic stan z kazdej lokalizacji. ......-.-...-..-00 = T; 9 = N11 - Wolny, 2 - Średni, 3 - SzybkiWynik 'PARIS '1.5 baud1,5 Bity stopu1/2 predkosci10-101000 Hz ton, kiedy PTT wlaczony Moze być uzywana zamiast lub w uzupełnieniu do innych typów PTT1010 Nr12 26 3213 23 3314070.15016 27 3617 00 1118 01 1219 24 351st Ext1x prędkosc2 baud20 28 3821 29 4022 03 1523 04 1624 05 1825 06 2225 W26 25 3727 02 132x prędkosc3 baudUstaw 4 makra poniżej Tx4.5 baudLimit 500 Hz6 baud8 psk8-bitowe znaki rozszerzone8-bitowe znaki rozszerzone (UTF-8):< AR<#komentarze> ignoruj komentarze AFC wl,wyl,przelacz powtorz po oczekiwaniu NN sek alarm za pomocą zewnetrznego pliku wav moja antena< AUDIO:> XMT audio plik WAV wyslij avatar pasmo pracy inna stacja klasa zawodów czysc pola logu czysc pola logu resetuj panel RX resetuj panel TX licznik zawodów ignoruj tekst komentarza test czasowy modemu plik spec test modemu, 'n' losowe 5 grup znaków test czasowy modemu, ciag 's' modem/ test znaków na sek Analiza CSV wl,wyl,przelacz identyfikator CW Licznik dekrementacji emisja cyfrowa (adif) [Czekaj][Len](ms) log opcionalny eQSL.cc log eQSL klasa FD sekcja FD wstaw plik tekstowy wazna szerokosc filtru xcvr wyślij CAT cmd rig czestotl ma nastawe kbd moja czestotliwosc tekst do IMIE/QTH przenies do czest NNNN Hz powrót do preferowanego polozenia Nadaj ID trybu z rozpoczęciem TX bezczynny sygnał dla NN.nn sek LDT domyślnie '%Y-%m-%d %H:%M%z' wstaw plik obrazu zwiększamy licznik S/N itp. IMD itp. ZDT domyślnie '%Y-%m-%d %H:%MZ'\ostatnie wysłane serno lokalna data '%Y-%M-%D' tzapiszQSO danych, dołącz msg do notatek loguj czas nadawania inny lokator lokalny czas/data LOCK wl, wyl, przelacz zapiszQSO danych, dołącz msg do notatek zapisz dane QSO czas lokalny %H%M zmien plik definicji makro mapa według wartosci mapa google emisja moja stacja moja Klasa FD moje CNTY moje hrabstwo mój lokator moje imie moje RST moja sekcja FD moje ST mój stan inne imie Wyślij |NN| kolejne pakiety RsID następne QSO odb # wstrzymaj nadawanie pop biezacy tryb / freq ze stosu CW QSK post-czas inna prowincja CW QSK pre-czas kliknij biezacy tryb w stos wstaw do tekstu Rx QRG # QSO odebr czas QSO (HHMM) incr/decr xcvr freq qsy do kHz, Hz Prawo klikiem przycisk QSY Lewym klikiem przycisk QSY inne QTH powtarzaj makro stale Rev wł, wył, przełacz wyślij CAT cmd wazne xcvr odciecia filtru wazne xcvr niskie odciecie filtru obowiazuje tryb xcvr Czas narastania CW inny RST odbiór Rx RSID wl, wyl, przelacz Zapisz plik makro zapisz zawody
ARRL sekcja aktualne zawody serno wykonanie harmonogramu dla wyszukiwanie w DÓL sygnalu wyszukiwanie w GÓRE sygnalu\inne państwo Digitalk Wl, Wyl, Przelacz tekst na początku TX cyklicznie co NN sek Sygnał strojenia dla NN sek przelacz Tx/Rx nadawanie ustawi tłumik xmt Tx RSID wl, wyl, przelacz wykonanie koncowe na wersja Fldigi opoznij nadawanie NN sek WAV plik; pliku spec ' Plik WAV; 'n' losowe 5 grup wiersz Plik WAV; wiersz 's' Pik WAV; wewnętrzny wiersz Znak WPM: Tekst WPM (15.0:5.0) uzyskaj dane pogodowe dla stacji uzyskaj dane o pogodzie rozpocznij wymiane koniec wymiany nr. kontrolny Rx nr. kontrolny Tx UTC data czas domyślnie'%x %H:%MZ' Data zulu '%Y-%M-%D Z' czas zulu %H%MZ= 1 (wl)= BT> SKKolor duplikatu ?@@ ACAADIFAFCZachowanie AFCKontrola AFCZakres AFC (Hz)Zakres AFC lub BWPrędkosc AFCPredkosc sledzenia AFCALTRARQARRL SekcjaDekoduj AX25Skrót powiatu/regionuSkrót Stanu/ ProwincjiPrzerwijAdres URLPozyskiwanie S/N (dB)Zakres wyszukiwania (Hz)AkcjaAktywuj dla Mortty K3NG szkicDodajDodaj CRLF po stronie szerokosci znakówDodaj sygnał RsID na koncu transmisjiDodaj adres do pola notatekDodaj datę / czasDodaj do kazdej wiadomosci data/czasDodaj geopolityczna nazwę stacji METARAdresAdresDostosujUstaw kursor częstotliwosciRegulacja czułosci przez wartosci ulamkowe 1/N.Regulacja pasma DSPZaawansowana konfiguracja:WiekGlośnosc alarmuWszystkoWszystkie pozUstawienia te mozna pozniej zmienic za pomoca menu KonfiguracjaZezwalaj na TX po wykryciu sygnalu (s)Zezwalaj na bledyNadaj po "N" sekund od wykrycia sygnału.Zezwól/Blokuj ZmianyAlt KolorAlternatywne kolory znaków w panelu RxZawsze LSBZawsze USBPokaz częstotliwosc audioZawsze uruchom nowe modemy na tych czestotliwosciachZawsze nadawaj na czestotl. 1500 Hz.Amplituda prawego kanalu sygnalu QSKAntena:Wyglad etykiety na kazdym kanaleDolacz do tekstu RX:Dołącz do tekstu TX:ZastosujWprowadzanie częstotliwosci strzalkaAtakDzwiękowa SygnaturaAudioKorekcja kodeka audio ppmProces strumienia audioInformacje o urz. audioUrządzenie Audio jest dostepne tylko jako dodatkowa usluga PortAudioUrządzenie audio udostępniane przez alerty dźwiękowe i monitor RxPlik audioCzestotliwosc audioUrządzenie wejsciowe audioAudio na Port pomocniczyCzęstotliwosc Audio lub RF na skali wodospaduUrządzenie wyjsciowe audioHistoria strumienia audio zdekodowanego na wybranym sygnaleLog audytuAuto CRLFAutom. długość linii CRLFAuto polacz/ wznowPrzestrzeń automatAktywuj podczas startu fldigi (serwer musi byc uruchomiony )Auto zapisAutomatyczne wyrównywanie każdegoAutomatycznie wstaw Kraj i AzymutAutoCRLFAutomatyczna regulacja częstotliwosciAutomatyczna prędkosc sciezki RxAutomatyczne spoty stacji w zdekodowanym tekscieAutomatyczne uruchamianie nagrywania pliku danych csv z odtwarzaniem wavAutomatycznie uruchom połączenie z portem psk reporteraDostepne podrzedneOsBCM GPIO pin wartoscKoniecTloKolor tla dla klawiszy funkcyjnych grupy 1Kolor tla dla klawiszy funkcyjnych grupy 2Kolor tla dla klawiszy funkcyjnych grupy 3Kolor tla podglądu blokady szumówZla częstotliwoscZły id modemuPasmoFiltr pasma / nieznany / odniesieniePasma muszą byc zgodnePrzepustowoscBaudSzybkosc transmisjiSzybkosc transmisji:Przewodnik dla początkującychZachowanie s/n imdBfrKolor tlaKolor tlaBitów na znakBkPrzeglądajBlad alokacji bufora w pliku %s Wiersz %dInfo o bledach wpisu dziennikaInformacje o wersjiZajętyPrzyciskWysokosc przyciskuKrajeC-Media PTTKodeki audio C-Media używane w serii DRA mają 8 pinow GPIO sterowanych przez użytkownika. Linia sygnału GPIO 3 (pin 13) jest używana do Fldigi uzyskuje dostęp do linii GPIO jako urządzenie interfejsu człowieka (HID). Odnalezione urządzenia C-Media są wyliczone w polu listy "Urządzenie C-Media" W systemie Linux: dodaj plik o nazwie cmedia.rules do /etc/udev/rules.d/ Plik powinien zawierać jeden wiersz KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"Urządzenie C-MediaZNAK zawsze male literyStatus CAT LEDKomenda CAT dla PTTUzycie CPU wzrasta z wysokoscia wodospaduCQ STANStrefa CQCQZCR-CR-LFNagrywanie danych CSVCSV...Przestrzeń CTCTRLCWKompensacja CW CAT i WinKeyerTryb CW IDLinnia klucza CWCW ustawienia IDCW QSK sygnał na prawym kanaleCW SSSprawdz CW SSCW SS Prec'Sekcja CW SSCW SS SerNo RZawody CWPrzepustowosc filtru dsp przy CWCW jako LSBCW jako LSBCW przy użyciu ciągów poleceń CAT. Dostępne dla obsługiwanych transceiverow Używaj z kontrolą nadajnika RigCAT lub flrig. Oddzielny port szeregowy NIE jest potrzebny. Wyłącz CAT PTT, jeśli urządzenie nadawczo-odbiorcze interpretuje to jako polecenie keydown (np.TS480) Zaleca ustawienie transceiver na pół lub pełne włamaniePierwszeństwo CWCW odebrano ser. nr.Sekcja CWCW nadawane WPMCiągi klawiszy CW wpmCW WPM za pomocą łopatki KEYERWykrywanie i tłumienie CWIPróg CWIUstaw CabrilloCabrillo...KalibracjaStacjaSzukaj StacjiWywołanie zwrotne dla polecenia skryptu %s zgłosiło błądStacja zaliczonaCallookCallook w InternecieCallook.infoCallook.info wyszukiwanie ( bezplatna usluga tylko dla stacji US )Strona internetowa Callook.infoZnak stacjiMoga byc stosowane zamiast lub w uzupełnieniu na inne rodzaje PTTAnulujPrzechwytPrzechwyc dziennikWyszukaj Przechwyc raportPrzechwyc raport spotaPrzechwyc dodatkowe spotyUrzadzenia do przechwytywania i odtwarzaniaPrzechwyc urządzeniePrzechwytuj tekst rx do zewnętrznego plikuPrzechwytywanie sygnalu ponad ten prógPrzechwytywanie sygnalów w tym zakresie częstotliwosciUrzadzenie obsługuje tryb pelnego dupleksuPrzechwytywania:Carrier Sense mulitiple DostępCzęstotliwosc nosna (Hz)Przesunięcie nosnejZmiana przesuniecia w hercachCelsjuszCentruj DXspotCentruj wyswietlacz na sygnaleCentruj czestotCentruj w pasmie przenoszenia Kliknij ppm, aby cofnacCentruj linieŚrodek sygnału WEFAX Nominalnie 1900 HzCentruj w odniesieniuCentrum na nieznanymCentruj na medianieWyśrodkowane na 1500 Hz (SHARES)Zmiana # podglądu kanalów PSKZmiana koloru osiZmiana ta tylko do eksperymentowaniaZmien wygląd aplikacjiZmień kolorZmien kat...Zmiana koloru legendy Zmien kolor tła wydrukuZmień kolor ścieżki odniesienia wykresuZmień kolor nieznanej ścieżki na wykresieZmiana pozycji z niskiego do wysokiego kanalu Zmien plik makroZmiana skali wodospaduZmiany są uwzględniane przy następnym uruchomieniu programuTłumik kanału 1Tłumik kanału 2Etykieta kanaluNumer kanaluKanały, pierwszy kanal w dolnej granicy wodospaduLiczba znaków w args[] parametr przekracza oczekiwaniaZnaków nie znalezionoZnak/Wiersz:SprawdzZaznacz wszystkoSzukaj duplikatyAktualizujSprawdz w czasie uruchamiania programuSprawdz dostępnosc aktualizacji...Stosuj LSB na CWStosuj USB dla RTTYSprawdz to, aby odbierac powiadomienia RSID bez zmiany modemu i częstotliwosciOdhacz, aby wlaczyc połączenie TCP/IP IOOdhacz, aby wlaczyc UDP/IP IOSprawdz, aby wlaczyc kod / dekodowanie znakowZaznacz aby włączyć kodowanie / dekodowanie znaków Wybierz jeden znak z każdej grupySprawdz, by zmniejszyc obciązenie procesora w trybie PSK i RTTY.Sprawdz otrzymaną wartośćSprawdzaj aktualizacje...Wybierz katalog do przechowywania dokumentów KMLStacja zaliczona z MiastaKlasaOczysc dane KML teraz!Wyczysc przy starcieWyświetl dokumenty KML, Google Earth.CzyscCzysc wszystkoWyczysc BothCzysc RcvdWyczysc WyslaneCzysc tekst UDPSkasuj tekst kanalu po # sekund bezczynnosciZeruj kompensacjeZeruj liste ?Wyczysc log i ustaw RST na 599/59Wyczysc log i ustaw RST 599/59Zeruj wpisy po zapisie lub za pomocą makra Zeruj pola dziennikaWyczyscic pola dziennika?Wyczysc przy zapisieWyczysc tekstZamknijZamknij listeCmd WPMZwin drzewoKolorKolor wychodzącego tekstu telnetuKolor znacznika sciezkiKolor i kursorKolory-CzcionkiKolory-Czcionki/Miernik CzestotlKolor-czcionki/klucze funkcyjneKolory-czcionki/Kontrolki logowaniaKolory-Czcionki/Rx-TxKolory-czcionki/poziom sygnaluKolory-czcionki/tabulatoryPolecenie %s ignorowane, notacja dot nie jest obsługiwanaPolecenie %s ignorowane, polecenie strukturalne nie jest obsługiwaneNie znaleziono poleceniaOpcje wiersza poleceńBrakuje polecenia ':'.Komenda tworzenia pliku KMLKomenda startuje, gdy generowane są pliki KML. Podprocesy są uruchamiane raz, a w razie potrzeby ponownie.Polecenia są echemKompComp'Kompensacja (sek.)Kompensacja w milisekundach domyślna = 0Kompensacja w milisekundachOblicz współczynnik korelacji dla tego # rzęduOblicz kompensację czasu dla CAT CW i WinKeyer CW. Obliczenia na prąd WPM . Ustaw WPM na nominalny (sugeruj 20 WPM). Kompensacja będzie dobra w zakresie +/- 10 WPM. Kalibracja/Test trwa 1 minutę „PARYŻ”.Nazwa pliku wygenerowanego komputerowoWarunkiKonfigurujOkno konfiguracjiSkrypty konfiguracyjneKonfiguracja interfejsuKonfiguracjaZastosujZamknijWykonaj RESETZastosuj / zamknijZamknac?PodlaczPolacz / rozłacz z Port Nav ConfigPołącz / rozłącz z portem Nav FSKPolacz / rozłacz z WinKeyerPolacz / rozłacz z nanoIOPolacz z MacLoggerPodłącz do hosta programu przy starcie FLDIGIPolacz z serweremPodlaczanie/odlaczanie do serwera gniazda talkerPolaczonyKontynentZawodyNumer w zawodach/serial #Zawody nr. kontrolny RxZawody nr. kontrolnyZawody numer # wyslZawody numer # odebranyZawody:ZawodyZawody/dzien w terenieZawody/OgólneZawody/Szkoła JOTANotatki kontekstoweKontynentCiągle przewijanieZnaki sterowania w panelu Rx/TxKonwertuj znak stacji na wielkie literyKonwerterKopiujKorektaKorelacjaNie można znaleźć pliku raportu LoTW. . Pobierz ze strony LoTW ARRL po zalogowaniu się na: https://lotw.arrl.org/lotwuser/default Zapisz plik raportu w folderze fldigi LOTW. nazywanie pliku "lotwreport.adi"Nie udało się zrobic katalogu Nie mozna otworzyc url: %s Nie można uruchomic przeglądarki internetowej: %s Otwórz ten adres recznie: %sNie mozna uruchomic flmsgPowiaty / regionyKrajStacja zaliczona z KrajuHrabstwoUtwórz 1000 Hz audio prostokątne w prawym kanaleUtwórz raport CabrilloPrzebieg prostokątny na prawym kanaleUtworz nowy plik dziennikaUtwórz sunspotaWybrane przesuniecieWyszukiwanie niestandardoweWybrane...WytnijWytnij 0/9Estymator DFTWskaznik DFTSKIEROWANYDPDTR +12DTR +12 vDTR = +VDTR -sygnał linii PTTDTR jest linia PTTKluczowanie DTR/RTS można przypisać do flrig, współdzielić port szeregowy RigCat, współdzielić oddzielny port szeregowy PTT lub być przypisany do oddzielnego portu szeregowego. Nie są potrzebne żadne ustawienia dla bodów, bitów stopu itp.Linia sygnałowa DTR/RTS FSKDX KlasterOkno dialogowe klastra DXDXCCIdentyfikator DXCCPodmioty DXCCPodmiot DXCCStosunek kreski do kropkiKreska /kropkaFiltr danychWyszukaj baze danychDane repozytorium plikówZródlo plików danychAktualizacja plików danychPliki danych.Czas retencji danych, w godzinach (0 oznacza brak limitu )Zródlo danychTrwa łączenie baz danychDataData ZakData RozData zak. QSOData roz. QSOData czas WL/ WYLDebugWyjscie debugowaniaZanikDekoduj (tłumienie CWI)Dekodowania pakietów AX25 w postaci czytelnej dla czlowiekaDekoduj sygnały DTMFDekoduj odebr. sygnały DTMFDekoduje komunikaty SYNOP (Ex: German Weather Service) do pliku ADIFDekoduje komunikaty SYNOP (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DomyslneDomyslnie sledzenie punktu CWDomyslny RST Rx 599/59Domyslny RST Tx 599/59Domyslnie sledzenie punktu RTTYUstawienia domyslneDomyslne URLDomyslny WPMDomyslnie dla wszystkich innych modemówDomyslnie słuchaj /częstotliwosc nadawaniaKomunikat domyslnyCiąg testu domyslnie jest: "Domyslnie do przekroczenia oscyloskopuDomyslneOpóznienie NN msek po zmianie emisjiOpóznienie NN msek przed zwolnieniem PTTOpóznienie NN msek przed rozpoczęciem audioKasujKasowac pozycje?Usuń lokalne pliki danych, jesli wybrano.Kasuj aktualny rekordOdznaczWykrywa preambułe THOR Wyczysc potok RxWykryj występowanie[WRAP:beg] i [WRAP:end] Zapisz tagi i wszystko zalaczonego tekstu do daty czasu stemplowania pliku, ie: NBEMS.pliki\WRAP\odebr\wypakuj-20090127-092515.wrapWykryj występowanie [WRAP:beg] i [WRAP:end] Zapisz tagi i wszystko załączonego tekstu do daty czasu stemplowania pliku, ie: ~/.nbems/WRAP/odebr/wypakuj-20090127-092515.wrapWykryty poziom sygnaluWysoki próg detektoraNiski próg detektoraUrzadzenie obsługuje pełny dupleksPort:LopatkiLopatki wl/wylLopatki charLopatki znakRóznica między czest. Rx & Tx (rig przesuniecie)Kolor cyfrCyfryTlumikDekoduj odebr. tekstNie znaleziono sciezki kataloguKatalog...Wylacz CAT PTTWylacz PTTWylacz okno powiadomieniaDeaktywujWylacz flrig CW PTTWyłacz zmiane częstotliwosciWylacz wykrywanie RSIDWylacz, jesli flrig nie jest uzywany.Wyłącz na bardzo wolnych procesorach lub jeśli przeglądarka sygnału nie jest używanaWylacz na wolnym CPU gdy sygnał przeglądarki nie jest używany.Wylacz detektorWyswietl RX jako przewijana markizeWyswietl RX w odwrotnym wideoWyświetl dekodowane jako przypisany kluczWyświetl dziennik, czytaj go na starciePokaz nazwe makra przy starcieWyświetl zdekodowany prosign w tekście RX za pomocą krótkiego kluczaWyświetl komunika o dostarczeniu, jeśli jest wlączoneWyswietl czas w milisekundachWyswietl opóznienie nadawania w milisekundachNie zmienia sie automatycznie na częstotliwosci RX RsIDNie pokazuj okna ostrzezen RsIDNie uzywaj bazy danychNie uzywaj przeglądarki internetowej do wyszukiwania znakuDokuj oscyloskopNie zapisujPrzyrost czasu kropki / spacjiPrzeciągnij wodospad na skali częstotliwosciSterownik wymaga bity stopu do zera!Kolor duplikatuSprawdzaj duplikatyDuplikatyEOdbr eQSLEQSL-wysłEchoEcho wiosła znaków do panelu RXKształt krawędziCzas krawędziElecraftUsuwa dokumenty KML podczas uruchamiania programu.WlaczWlacz -Aktywuj / deaktywuj ikony w menuAktywuj / deaktywuj podpowiedziWlacz ARQWłacz ARQ dla programów obsługujących protokól TCP i fldigi ARQ Włacz KISS dla programów, które wspiera UDP i TNC -2 KISS protokol Tylko jeden interfejs (ARQ /KISS) może byc aktywny w danym czasie. Zmiana adresu IP i numeru portu wymaga restartu fldigi.Włącz automatyczne wyrównywanie poWłącz kanał zajetyWlacz CSMAWlacz Operacje CW.Wlacz DSP przed dekoderemWłącz linię sygnału DTR, domyślnie RTSAktywuj transmisje danychWłącz FSK na porcie szeregowymWlacz GPIO PTT (kontrolki specyficzne dla Pi)Wlacz HistogramWlacz Histogram monitorowania sygnaluWlacz KISSAktywuj MultiPSK zgodny z FECWłącz obsługe TTYWlacz plik dziennika UDPWlacz wyjscie PTT WinkeyeraWlacz dźwięk WinkeyeraWlacz kluczowanie tonem WinkeyeraAktywujWlacz pole wyboru, by pokazac mozliwe sterowanieWlacz odstepy między znakamiAktywuj przeciagniecie kursora na skale wodospaduWlacz kodowanie/dekodowanie szczatkowego sygnalu pilotaWłącz sterowanie Tx flrig z fldigi jako klientAktywuj jedno klikniecie - zaznaczenie tekstu w panelu RxWlacz dla bardzo slabych sygnalówUstaw gdy komputer nie dekoduje poprawnieAktywuj automatyczne odstepy miedzy znakamiAktywuj transmisje tekstu rxAktywuj transmisje znaków 8PSKWłącz przy pierwszym uruchomieniu FldigiUstaw to dla znaków diakrytycznych Latin-1Aktywuj transmisje znaków UTF-8Aktywuj to do znaków UTF-8Włącz aby wysłać ton start/stopWlacz aby zawsze kreślic dane na osiWstrzymaj TX na wykrytym sygnaleWlacz druk linii scieżki o szerokosci 3 pikseliWlacz aby umiescic panel Tx wyzej panelu RxWlacz aby wybrac zakres datWłącz używanie klucza FSK FLrigAktywuj, gdy oba programy uzywają tego samego adresu IPAktywneWłączone - 1,5 bitu stopu Wyłączone - 2 bity stopuAktywuj - zapis QSO uzywajac znacznika czestotliwosci Deaktywuj - zapis QSO uzywajac znacznika czestotliwosciAktywuj - uzyj Znak/Spacja filtr wyjsciowy Deaktywuj- uzyj pseudo sygnalówKoniec liniiKoniec ID xmtWprowadz adres URL internet danych METARWstaw QTC tekstWpisz pełna sciezke, pliku flmsgWpisz pełna sciezke, pliku flmsgWpisz pełna sciezke, pliku flmsgWpisz pełna sciezke, nazwe pliku flmsgWpisz pełna sciezke, pliku flmsgWpisz pełna sciezke, do pliku flirgWpisz pełna sciezke, pliku tqslWpisz pełną sciezkę, folderu cty.datWpisz ciąg testu lub zostaw puste - domyslne:Wpisz zakres czasu w minutachWpisz adres HEX CIV transceiveraBladParzysteLinie parzysteParzyste linieWydarzenieRejestr zdarzenNr. kontrolny odbrNr. kontrolny wyslanyNr. kontrolny odbrNr. kontrolny wyslanyWstaw plik exeWykonajWykonaj polecenie na pliku KML.Wykonaj skrypt pliku: %sWyjdzZamknij podpowiedziEksportujUstaw EksportEksportuj zapisy dziennika do LoTWEksportuj zapisy do LoTWEksport do pliku ADIFEksport do pliku CSVEksport do pliku tekstowegoEksportuj...Rozszerz ostatnią dit/dot w ms domyślnie = 0Dodatkowy czas trwania do pierwszego dit / dot w milisekundach domyślna = 0Wypakuj pliki do uzycia zewnętrznym programem (wrap/flmsg)Skasuj tekst kanalu po sekund bezczynności.Klasa FDSekcja FDFECUsrednij FFTFFT okno funkcji filtru wstępnegoFiltr FIRPliki FLMSG...Częstotliwosc próbkowania FMTFSKInterfejs FSKFSK PTTNiezależny port szeregowy FSKFSK portFahrenheitKluczowanie Farnsworth (0 = nic) domyślnie = 0Katalog docelowy obrazów FaxuNie pomijaj zadnych stron lub zamknij kreatora w dowolnym momencieZnak Field Day Może być taki sam jak znak OPField Day KlasaDziennik Polny DzieńSekcja Field DayOdebrana klasa polny dzieńSekcja Field Day odebranaTylko plik I/OPliku nie znalezionoNazwa scieżki pliku:Błąd odczytu plikuPlik:PlikiWypełnij Kraj / Azymut za pomocą info cty.datFiltrFiltr wyjściowy FFTWspólczynnik przepustowości filtruPrzepustowosc filtruWspólczynnik przepustowosci filtruFiltr przepustowosci wzgledem szerokosci sygnałuFiltracjaZnajdz kraj:Szukaj nastepnySzukaj prefiks:Szukaj poprzedniSzukaj : KoniecNajpierw wybierz urządzenie odtwarzające alert dzwiękowyW odstępach czasuKonfiguracja Fldigi...Konfiguracja FldigiKreator konfiguracji FldigiPlik definicji makro Fldigi *.mdfPaleta Fldigi *.palFldigi plik definicji rig xml *.xmlFldigi na stronie web...OscyloskopKlucz modemu PTT w FlrigOprózniaj bufor TX po okresie zajetosci kanału gdy zajęty kanał pozostaje wl (TX zablokowany)FolderyCzcionkaKolor czcionkiCzcionka...Kolor /czcionkiCzcionka:Ustaw RST odebr/wysl na 599/59Wymuszenie okreslonej częstotliwosci próbkowania Wybierz"Native" jeślii "Auto" nie działa z urządzeniami audio.Wymuszaj wielkie litery w polu znak stacjiOdstep kanalów do 100 HzUstaw data/czas startu == data/czas zakonczeniaWymuś zapisanie podzielonego obrazuDarmowe dzięki uprzejmości obsługi OKCzęstKorekta częstotliwosciCzestotl.CzęstotliwoscAnaliza czestotliwosci / Korekcja FMT RXKorekcja częstotliwosciCzestotliwosc w MHzSkala częstotliwosciPrzesunięcie częstotliwosci Przesunięcie częstotliwosci sygnału WEFAX Nominalnie 800 HzWszystkoPełny raportPodstawowa częstotliwosc sygnału prostokątnego QSKGPIO PTT (kontrolki specyficzne dla Pi)Linie GPIOOgólneBlad OgólnyGenerujUtwórz 1000 Hz sygnal prostokątny na prawym kanaleWygeneruj sygnał prostokątny na prawym kanaleGrupa 1Grupa 2Grupa 3HamCall w InternecieHamQTHHamQTH w InternecieHamQTH.comHamcallHamcall.netLimit czasu odczytu hamlibaHamlib do sterowania rigCzekajHanning/Blackman - Uzyj krawedzi czasu BPF - uzyj przepustowościStacje słyszaneLog nasłuchuWysokosc paska makroParametry Rx HellParametry TX HellHex CIV adresUkryjUkryj okno po (s):WysokiGórna granica częstotliwosci w HzHost:II/OIDsIDs/CWIDs/RsIDIDs/VideoIFKP Raw ObrazIOTAAdres IP Numeru portuIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostIP Adres dla flrig interface IP Adres format: nnn.nnn.nnn.nnn lub nazwa: czyli localhostStrefa ITUITUZIcomCzas przed wysłaniem danychIgnoruj duplikatyObraz LPFOdbrLimit czasu nieaktywnosciCale Hg.Obejmuje czestotliwosc nadawaniaUstaw datę koncowa eksportuIncr'InfoWstrzymaj 7-bitowy modem na komende użytkownika lub recepcje RSIDWstrzymaj 7-bitowy ModemOpóznienia zapisu (ms)Początkowy stan DTRPoczątkowy stan RTSWstępne napięcie na DTRWstępne napięcie na RTSInicjalizujInicjalizuj interfejs RigCATInicjalizacja interfejsu hamlibInicjalizacja H/W interfejsu PTTInicjalizacja pól logowania QSOInicjacja gniazda klientaPrzesuniecie nosnejPoziom sygnału wejściowegoWstawianie bajtów NRS LTRS na początku każdej transmisjiWstaw znacznik tekstu RX przed zmianą częstotliwosci i modemuWstaw tekst domyslnyWstaw plik...Wstaw pełny raport METARWstaw zero w nadawanym numerze kontrolnymWstaw znacznikWstaw specjalny tekst w panelu Rx po kliknieciu wodospaduWstaw tekstWstaw tekst pojedynczym lewym kliknieciemOkres integracji (bloki FEC)Ciekawe notatkiPrzeplot SYNOP i tekstuPrzeplataj tekst dekodowanej wiadomosci SYNOP, lub wymiany.Nieprawidłowy indeks nazwy pliku (NULL) w funkcji %s:%dNieprawidłowy Modem do KISS IONieprawidlowy parametr funkcji 'char *file_name_path' (null)Nieprawidlowy parametr funkcji (wewnetrzny bład inny niz skrypt)Nieprawidłowy parametrWyspaProblemy zgłoszone podczas przetwarzania pliku skryptu: %sJOTAJOTA harcerskaSekcja JOTAZlot skautów OTAZlot na powietrzuKonfiguruj Elecraft K3K3NG emulacja szkicu ArduinoKISSStyl balonu wyswietlania KMLKML balon w postaci zwykłego tekstu lub HTML, w prostych tabelach lub macierzach.Katalog plików KMLKML częst. odswiezania ( sek )Główny plik KMLWlaczony serwer KML (On / Off)KenwoodKluczKeyerTryb kluczaKompensacja kluczowania (ms)Wspolczynnik kluczowania domyslnie = 3.0Waga kluczowania domyslnie = 50Wiek dzieckaJasność LEDLOKLoTW-odebrLoTW-wysłLTRS na starcieOstatnie QSOOpóznienieWprowadzLeadin w ms domyślnie = 0Początkowe i koncowe czasy narastania krawędzi (msek)Pozostaw to pole puste lub odnosi sie do http://www.pulseaudio.org/wiki/ServerStringsLewy i prawy kanał oba zawieraja audio modemuKliknij lpm by wyczyscic tekst Kliknij ppm, aby zresetowac częstotliwosciKliknij lpm, aby wybrac kolor duplikatuKliknij lewym aby wybrac kolor duplikatuKliknij lewym przyciskiem myszy, aby przełączyć pasek stanuKliknij lewym przyciskiem myszy, aby przełączyć VumeterKliknij lpm: zmiana trybu Kliknij ppm: konfigurujKliknij lewym lub prawym by uzyskac historie audioLicencja GPLv3: GNU GPL wersja 3 lub nowsza To jest wolne oprogramowanie: możesz dowolnie modyfikować i rozpowszechniać it. Nie ma ZADNEJ GWARANCJI, w zakresie dozwolonym przez prawo. Ogranicz AFC do zakresuOgranicz blad oszacowania Freq do tej wartosciOgranicz do kilku znakow jak w CQEM lub IOTA itp.Linia/ośLinia: %d Blad:%d %s (%s)Słuchaj/PowiazSluchaj sygnalów w tym zakresieLkLoTWWeryfikacja LoTWPobierz plik z LoTWData odebr. z LoTWData wysl. na LoTWLadujZaładuj nową paletęZaladuj plik obrazuZaładuj ostatnio uzywane makroZaładuj lub upusc plik obrazu pliki (PNG, JPEG, BMP)Laduj...LokSzukajSzukaj plik binarnySzukaj plik cty.datSzukaj plik exeSzukaj flamp exeSzukaj fllog exeSzukaj flmsgSzukaj flmsg exeSzukaj flnet exeSzukaj flrig exeSzukaj program #1 exeSzukaj program #2 exeSzukaj program #3 exeZlokalizuj plik wykonywalny tqslLokalizacjaLokatorWlaczBlokuj częstotliwosc nadawaniaZapisz info do pliku ADIFZapisz info NAVTEX do KMLLog częstotliwosci RTTYZapisz info Wefax do pliku AdifLog tekstowy wszystkich RX/TXZaloguj się do pskrep po uruchomieniu fldigiDziennikDziennikLogowaniePanel kontrolny LoguLogowanie/LOTWMacLoggerDziennik N3FJPZapis QSOLogowanie/eQSLLogin dla QRZ / Hamcall / HamQTHLog komunikatów do Języka Znaczników Keyhole (Google Earth, Marble, Gaia, itp...)Dlugi odbiór integracjiPoszukaj stacjiUzytkownik LotWNiskiLow = zero bledow Medium = 1 blad High = 2 bledyDolna granica częstotliwosci w HzNiski ton przy 500 HzNizszyDolna granicaNajnizsza częstotliwosc na dole przeglądarkiPolaryzacja znakuZNAK/SPACJA odwróconaKod ID stacji METARMETAR stacja lokalizacjaObraz MFSKPlik obrazu MFSKNadaj malymi literamiMYCALL wykryj wavEtykieta przycisku makroEdytor czcionki makrTekst makroEdytor makro - MakraLokator na przykład JO93xqAtrybuty Mail ServerStrojenie ręczneZnakZnak polaryzacjiOznacz częstotliwość w hercachTylko znakOznacz ostatnia częstotliwosc i emisjeZnak -SpacjaZaznaczony tekstDopasujDopasuj zapisy w dzienniku z plikiem z LoTWDopasowane FiltryDopasuj filtr pasmaMaksymalny BladMaks. liczba wierszy obrazuMaksymalny stan dolnego indeksu.Moze wymagac zmiany rozmiaru panelu Rx/TxSredniBłąd alokacji pamięci (wewnętrzny błąd inny niż skrypt)Scal plik ADIFScal...Rejestrowanie komunikatowKolor miernikaMil / GodzinaMiliSekundMin. Liczba trafieńMin WPMMinimalne kontroleMinimum # sygnalu detektoraMinimalne ustawienie WPM domyslnie = 10Minimalny dystans dla węzłów aliasów ( Metry )Minimalny dystans dla aliasów podzialu (w metrach)Minimalny czas między zdarzeniamiRózneRózne/AutostartRozne/CPURózne/DTMFRózne/KMLInterfejs Rózne/NBEMSRózne/PSK reporterRózne/PSMRózne/Przechwytuj tekst RxRóżne/zapisz parametryRózne/Ustalony SpotRozne sesje TCP-IPBrakujące polecenie %s po linii %dBrakujace oferty sparowane (")EmisjaTryb opóznienia (msek)Tryb pracyEmisje muszą byc zgodneLimit szerokosci emisjiTryb RegModemMargines przepustowosci modemu ModemSygnał modemu na lewym i prawym kanaleModem/CWKluczowanie modemow/CW/CATModem/CW/CAT komp”Kluczowanie modemem/CW/CATKluczowanie modemem/CW/DTR-RTSModem/CW/znaki rozszerzone.Modem/CW/OgólneProsignsModem/CW/Interpunkcja-HalasModem/CW/Czas trwania QSKModem/CW/WinKeyerModem/CW/nanoIOModem/ContestiaModem/DominoEXModem/FMTModem/FSQModem/Feld HellModem/IFKPModem/MT-63Modem/NavtexModem/OliviaModem/PskModem/TTYModem/TTY/FSKModem/TTY/NavigatorModem/TTY/RxModem/TTY/SynopModem/TTY/TxModem/TTY/Winkeyer 3Modem/TTY/nanoIOModem/ThorModem/WefaxMonitor polaczenia TCP.Monitor sygnalu, zakres i marginesy.Monitoruj nadawany sygnalAktywne kółko myszy na przyciskach makrSrednia ruchoma - srednia ponad NN sekundy^0 - Brak uśrednianiaPo puszczeniu mscCzas po puszczeniuMilisekund między kolejnymi komendamiWielokanalowa obróbka sygnaluWielokanałowy detektorMoja klasaMy JOTA TroopMoja sekcjaMoja stacjaMy TroopMój znak STACJIMoje nadawanie CW WPMNN3FJP DX spotN3FJP Adres IPPort serwera N3FJPPlik danych interfejsu NBEMSPliki NBEMS...BRAK URZĄDZEN AUDIO (lub testu)NIE USTAWIONO ZNAKU STACJIImieNazwa-RNazwa-SWąskie LPF, gdy obraz zakloconyTłumik kanału nawigacyjnego 1Nav FSK MARK PolarityNav FSK PTT - powinien zawsze być włączonyBity stopu nawigatora FSKSzybkość transmisji FSK NavTon boczny FSK nawigatoraDioda stanu NavCATTłumik kanalu nawigacyjnego 2Jasność NavLEDTłumik NavRFNavWinkey PTTNawigator konfiguracja portuPort szeregowy nawigatoraNowyNowy rekord / Zapisz rekordNastepnyNieBrak blędowNie szybciej nizBrak zapisów na lotw do pobraniaNie wolniej nizWidok okna nadawania po okresie nadawaniaBrakNormalnyPrędkosc spadku wodospadu / wartoscNie znaleziono pliku skryptu / znacznikaNie zaliczonyNotchUwaga: Pozycje te są przydatne do konfiguracji, ale nie wyjątkowe do uzycia fldigi na urządzeniach z ekranem dotykowym, takich jak tablet.Uwaga: należy wybrać i właczyc do monitorowania audio RX!UwagiOkno powiadomień zamyka się po XX sekundach;^j0 == dialog pozostaje otwartyPowiadomieniaTylko informujPoinformuj o przekroczeniu czasuLiczba i pozycja pasków makroLiczba cyfr w numerze kontrolnymLiczba godzin przechowywania danych dla węzła. Zero oznacza, utrzymuj wszystko.OOKWŁON -Sygnał odniesienia do filtrowania pasmaON - Filtr pasa nieznanego sygnaluWl - Styl marquee Wyl - Wyczysc & restartWL - mala czcionka WYL -duza czcionkaWL - rozpoczyna domyslnie WYL - zachowaj aktualna pozycje kursoraWL - użyj częstotliwości spota Rx WYL - użyj częstotliwości spota TxWL - wykorzystaj ostatni zestaw makr WYL - uzywaj zestawu domyslnegoOSSNie parzysteLinie nieparzysteNieparzyste linieLinie dzialek offsetowych na skali pionowejWl/WylPowyzej okna Rx/TxPowyzej wodospaduPonizej wodospaduDokumentacja online...EmisjaOtwórz...Otwórz listeOtwórz plik w domyslnej przeglądarceOtwórz w przeglądarceOtwórz plik dziennikaOtwórz plik makroOtwórz folder wiadomosciOtwórz wiadomosc z flmsgOtwórz paletęOtwórz plik rig xmlOtwórz w flmsgOtwórz...Otwórz folder pliku NBEMS po pomyslnym przechwyceniuOperacja tqsl w trybie wsadowym (bez okna dialogowego)Pasmo operacyjneDane OperatoraOperator stacjiOperator stacji:Imię operatora:Znak operatora (jeśli jest inny niz znak wywolawczy stacji)Operator zaliczonyOperator StacjiQTH operatorówWiek operatorów otrzymanyImiona operatorówOpcjonalna konfiguracja w formacie: param = val...OpcjeInneWyslDane wyjścioweWyjscie numeru portu, gdy jest ten sam adres IPWyzszyNad zapisem funkcji wywołania zwrotnego dla "%s"MOCPSK et al.PSK/RTTY Przeglądarka HiLite Kolor 1PSK/RTTY Przeglądarka HiLite Kolor 2PSM złagodzenieHistogram Progu PSMPTT ONOpóznienia NIM dla wszystkich typów CAT/PTTZródlo dźwięku PTTKoniec nadawania - opóznienie PTTPTT jest poleceniem CAT (nie sprzetu)Linia klucza PTTPTT wylTon PTT na prawym kanale audio Pakiet komend PTT hamlibPTT przez i PTT poprzez komendy pakietu hamlibPWR- pomiarPaletkiPaletki DogEcho paddlePróbkowanie łopatkowe (patrz instrukcja Winkeyer) domyślnie =50Paleta : Parametr nie prawidłowy.ParzystoscAnalizuj wszystkie przychodzące tekstyCzęsciowyPodany parametr nie jest oczekiwanego typu.HasloHaslo dla QRZ / Hamcall / HamQTHWymagane hasloWklejSciezki (ukryte)Procent (%)TrwaloscWybierz szybkosc transmisji z listySygnal pilotaMoc sygnału pilota w stosunku do sygnałuOdtwórz historie, gdy wybrano aktywny kanalOdtwórzPowtarzac odtwarzanie?Urządzenie odtwarzajaceOdtwarzanie nagranego dźwięku:Proszę ustawić swój znak w pierwszej kolejnosci.Interwał sondowania (msek)Interwał ponawiania (msek)Informacje Popup po 2 sek po najechaniu na znakPortPort jest drugim SCU-17Port:PortAudioUstaw zestaw makr 4 barów pod panelem Tx Domyślnie powyżej panelu RxNapisz post z opóznieniem (msek)Czas po naciśnięciu (ms)Monitor mocy sygnaluSkala mocyPrPre-sygnał dzwiękowyPre-keydown czas (ms)Wykrywanie preambułyPierwszeństwoNacisnij tylko wtedy, gdy zmienisz adres/portNacisnij przycisk return, aby kontynuowac wyszukiwanieDrukuj CW / RTTY / THROB / CONTESTIA malymi literamiProg 1:Prog 2:Prog 3:Monituj o zapisanie konfiguracjiMonituj o zapisanie dziennikaMonituj o zapis dziennika przy wyjsciuMonituj o zapisanie pliku makraProwincjaStacja zaliczona z ProwincjiPseudo-FSK prawy kanalPseudo-FSK na prawym kanale audioKsztalt impulsuSzerokosc impulsu (msek)PulseAudioPrzetwarzanie interpunkcji/szumówWatQRZQRZ cdromQRZ w internecieQRZ.comQSKAmplituda QSKQSK częstotliwoscQSK na prawym kanale audioQSLData odebr. QSLQSL odebr. w dniuQSL droga laczenia stacjiData wysl. QSLQSL wysylana w dniuQSL-VIAQSL-odebrQSL-wyslanaData QSOData zakonczenia QSOData QSOQSO nie mozna powtorzyc w okresieQSOp KategoriaQSOp hrabstwoQSOp nazwaStan QSOQSYQTC:QTHPseudonimQTH:QthZapytanie o stan nanoIOCichyTryb cichy [-q], nie otwieraj okna dialogowego tqslRE:REGEX wykryte wavTłumik RFOdbiór RSIDRST 599/59RST odebrRST wyslRST(r)RST(s)RTS +12RTS +12 vRTS = +VRTS - sygnal linii PTTRTS jest linia PTTSterowania przepływem RTS/CTSRTTYRTTY SygnaturaRTTY dzwonek audio wavZakres wyswietlania RTTYRTTY jako USBPrzesuniecie RxPrzechwyt RXRX ppmKorekcja karty dzwięk RXRX tekst QSO wprowadzanie danych jest ograniczone przez znaki nie-słowa zdefiniowane tutaj. Tabulator i nowa linia są automatycznie dolaczane.Czestotliwosc RFPodniesiony cosinus ksztaltu impulsuZakresZakres +/- wpmZakres 1 ... 3Zakres 1 ... 4Zakres ustawienie WPM domyslnie = 25Ustawienie zakresu WPM domyslnie = 25WspolczynnikCzy na pewno usunac rekord "%s"?OdbiórUzyj OdbrSzerokosc filtru pasma odbioruSynchronizuj RxOtrzymano nazwę scoutaOdebrany numerOstatnia aktywność do siatkiOdbiór pliku flmsgRaporty z recepcji ...Podłącz ponownieNagrywanie AudioNagraj oba kanalyRejestrowanie danych dla minut NN po automatycznym uruchomieniuLiczba QSOProstokątnyReed-Solomon ID (Rx)Reed-Solomon ID (Tx)RefOdswiez przedzial czasu zapisu w pliku KML (w sekundach)PrzeladujPrzeladuj cty.datKasujUsuwanie rozmowy po...Odtwarzanie sciezki dzwiekowejRaport ramek ARQPrzeglądarka raportowZgłaszanie faktycznej częstotliwosci modemu RFSprawdzaj czestotliwosc poprzez rig ( tylko gdy masz Rig!)RaportyŻądaj aktualizacji co „interwał sondowania” milisekundWymagane dla niektórych transceiverow np. TS-480ResetujZresetuj bloki FEC przy zmianie BW lub tonówResetuj wszystkie opcje do ich wartosci domyslnych? Zresetowane opcje zostaną uwzględnione przy następnym uruchomieniu Pliki: fldigi_def.xml i fldigi.prefs zostana usunięte Przywróc CarrierRestartZrestartuj interfejs FSK Niezbędne, jeśli dokonano zmian w konfiguracjiPrzywróc ustawienia UART przy zamknięciuDomyslny folder cty.datPrzywróc domyslnePrzywróc ustawienia portu szeregowego (COM)WynikZachowaj częstotliwosc blokady TX (Lk ) przy zmianie częstotliwosci RX RsIDZapisz blokade czest. TXPróbOdbierzPobierz dla aktywnego modemuInterwał ponawiania (ms)Powrotne polaczenie KISS TCP IO w nasluchuUstawia adres IP i port numer na wartosc domyslną.OdebrOdwrócSterowanie wsteczne (Rv)Odwróc lewy/prawy kanalOdwróć znak/spacjęNegatyw VideoPrzywróc przesuniecie znakówPrzywróc przesuniecie znakówPrzejrzyj / edytuj wyeksportowany plik adif LoTWPrzejrzyj plik lotw.adif przed wyslaniem z tqslSterowanie RigSterowanie Rig/C-Media PTTSterowanie Rig /CAT (rigcat)Sterowanie Rig/GPIOSterowanie RIG/HamlibSterowanie Rig/Sprzetowe PTTSterowanie Rig/flrigPlik opisu RigTryb RigRig lub interfejs Echos portu szeregowegoRig wymaga ustawienia przeplywu RTS/CTSRig wymaga Xon/ XoffRig korzysta z RTS/CTSKontrola Rig/LogRig:RigCAT uzyty do sterowaniaPrawo / Lewo Wybierz najmniejszy cyfrowy rasterPrawo/Lewo = 1 x LSD Góra/Dól= 10 x LSD Shift - Prawy/Lewy = 100 x LSD Shift - Góra/Dól = 1000 x LSDZakres WPMZaokraglic w górę ChkKorelacja wiersz-wiersz Służy do wykrywania obecności sygnalu WEFAX Niższe: więcej fałszywych wykrycAlarm dzwiekowy RsID wavRST odebrRST wyslaneUruchom programUruchom program:Rx / Tx PanelRx AGCOkno Audio RxKodek Rx PPMWysokosc Rx w pikselachParametry RxRx Numer #Rx WPMRx Mnożnik szerokościTło RxCzcionka RxZestaw znaków Rx/TxRx/Tx RsID EOTRxID waskiRxID szerokiS-metrZachowanie S/N i IMDWYBOPUSCDekodowanie SOMSQL-1SQL-2SS SprawdzSS precSS SekcjaSS ser #SYNOP do ADIFSYNOP do KMLProbkaCzęstotliwosc próbkowaniaZapiszZapisz...Zapisz stan AFC według trybuZapisz konfiguracjeZapisz stan odwrotny według trybuZapisz poziom i stan blokady szumów według trybuZapisz odebrany tekst, do następującego pliku: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Zapisz jako...Zapisac zmieniony Logbook?Zapisac zmiany konfiguracji?Zapisac zmienione makro?Zapisz wpis w dzienniku?Zapisz plik dziennikaZapisz plik makroZapisz paletęZapisz tekst jakoZapisz paletęZapisz kontrolę poziomu transmisji według trybuZapisz...Skala kolorówRunda Szkoła UpSzkoła Round Up - dopuszczalne I, H, O - zobacz zasadyOscyloskopHarcerz Op'Nazwa operatora SkautaPliki skryptowBlad alokacji klasy skryptu podczas analizy (%s)Nie znaleziono skryptu ścieżki urządzenia .Plik skryptu zawiera potencjalne problemy Szczególowe informacje można znalezc w dokumentacji i / lub pliku dziennika.Nazwa pliku skryptu (ścieżka) jest nieprawidłowaNazwa pliku skryptu (ścieżka) zerowy wskaźnikPrzewinPrzewijaj podpowiedziSzukaj tego znakuSzukaj w internecieZakres wyszukiwania ( Hz)Drugi tekstSekundSekcjaZobacz https://en.wikipedia.org/wiki/Morse_code informacji na temat rozszerzonych znaków Morse'a.WybierzWybierz # bity / znakWybierz # bity stopuWybierz wszystkoWybierz Cabrillo Zawody & PolaWybierz pole do EksportuWybierz zapis jako QSO lub zawodyWybierz PTT na stanieWybierz Rekordy do eksportuWybierz zestaw znaków Rx/TxWybierz czcionkę rastra TXWybierz TagWybierz plik audioWybierz pasmoWybierz szybkosc transmisjiWybierz przesunięcie nosnejWybierz katalog docelowyWybierz urządzenieWybierz urzadzenie & Inicjalzuje interfejs H/W PTTWybierz sposób wykorzystania rolki myszki zachowanie wewnątrz wodospaduWybierz linieWybierz tryb dostępu do menuWybierz liczbe tonówWybierz parzystoscWybierz numer PINWybierz plik deskryptora rigWybierz filtr wstępny typu FFTWybierz te opcje, dla Elecraft K3 Pozostale radia tego nie wymagaja.Wybierz czcionkę skali wodospaduKolor tla w panelach Tx/ RxTransfer bezposredni ma pierszenstwo przed wszystkimi innymi ustawieniami odbioru flmsgOrganizuj MapowanieWyslijNadawaj jako czas WPMNadaj krotkie CWNadaj znak CW na koncu transmisjiWysylaj dane QSO do LoTW po zalogowaniuNadaj znak testowyWyslij WPM 'PARIS ' słowaNadaj strumien znaków testowychNadawaj jako WPMNadaj sygnal co...Wysyłaj staleWysylanie strumienia danych bezpośrednio do flmsgNadaj obrazNadaj obraz...Wyślij lotw.adif przez tqslWyslij raport podczas zapisu QSOWyslij raport tylko wtedy, gdy zalogowano QSOWyslij tekst rx do pliku: textout.txtWysłane i odebrane faksy są zapisane w pliku Adif.Wysylane znaki w panelu Rx/TxWysłano nazwę harcerzaLiczba wysłanaNr NoRNr odebranyNr wyslanyPort serwNumer # odebrNumer # nadanyNumer BaudInterfejs szeregowyPort szeregowyPort szeregowy echoCiąg znaków serwera:Zestaw - znacznik logiczny wysoki odczyt z nanoIOSet >0 jeśli zastosowano pulsacyjny PTTUstaw poziom blokady szumuUstaw poziom dobrego widokuUstaw liczbę znaków w wierszuUstaw typ Resampler użyty do korekcji odsunieciaUstaw poziom na wartość x theshold powyzej poziomu halasuUksztaltowany TxUdostępnij port RIGCATUdostępnij oddzielny port PTTUdostępnij port RIGIOUdostępnia port szeregowy RIGIO lub używaShft-click: wybierz nieznany Ctrl-click: wybierz odwołanieKr. sekwencja wstępnaKrótki opis antenyPokazPokaz podmioty DXCCPokaz czas TXPokaz okno alarmu:Pokaz wszystkie emisjePokaz i włącz przycisk zasilania monitora sygnalu (PSM)Pokazuj przepustowosc sciezki na wodospadziePokaz kanałyPokazuj kursor z liniami szerokosci pasmaPokaz kursor z linia srodkowaPokaz komunikat o dostarczeniuPokaz mniej emisjiPokaz makro z kodami sterowaniaPokaz edytor makroPokaz mniej lub więcej wodospaduPokaz ikony menuPokaz hasło jako tekstPokaz podpowiedziPokaz sygnał nadawania na wodospadzieWylaczenie flrig z fldigiTon bocznyWstęga boczna:WybieranyPrzegladarka sygnalowPoziomy sygnaluPoziom sygnalu (dB)Wskaźnik poziomu sygnału.Poziomy sygnaluSygnał z czasem usredniania 0 - najmniej 4 - najwiecejPrzeglądarka sygnałówZakres sygnalu (dB)Szukaj sygnaluSledzenie sygnałuPojedyncze makro panelu logowania poniżej paska zmienna wysokoscKliknij, aby uchwycicRozmiar:Pominięte znaki w panelu Tx (Tx wl./wyl. w CW)Wyswietl narastanie wyzszych częstotliwosciWyswietl narastanie nizszych częstotliwosciKolor suwaka blokady szumówSlot czasowyWolne (4 ms) | Sred (2 ms) | Szybkie (1 ms) | Trudne kluczowaniePowolny CPU ( mniej niż 700MHz )Powolny spadekDekodowanie Soft-bitoweDekodowanie symbolówOdwrócenie programowe lewy-prawy kanal audioNiektóre zmiany dokonane przez skrypt wymagają programu uruchom ponownie zanim staną się aktywne.Sortuj według Daty/czasu zakonczeniaSortuj według daty i czasu zak. - wszystkie raporty ADIF/ CabrilloKarta dzwiekowa FSKInterfejs karty dzwiękowejDźwięk:Karta dzwiekowaKarta dzwiękowa/AlarmModuł audioDzwięk/Prawy kanałKarta dzwiękowa/ustawieniaModuł audio/Poziom sygnaluKarta dzwiekowa/Zapis plkówSygnalizatorTylko SpacjaZnaki specjalneZakres widma/interakcje wodospaduZakres widmaPrędkosc (WPM):Test prędkościSpotSpot wyłączonyBlokada szumuPoziom blokady szumuPoziom blokady szumów/aktywowane elementy sterująceOtwarcie Squelch (sek)StStartData rozpoczęciaStart NbrData rozpoczecia eksportuStart flampStart fllogStart flnetStart flrigRozpoczęcie nadawania - opóznienie PTTStart prog1Start prog2Start prog3Numer startowyStanPaństwo QSO PartyPanstwo musi się zgadzacZnak StacjiZnak stacji:Lok StacjiLokator StacjiLokator Stacji:QTH StacjiZnak stacjiStacje słyszalem dwukrotnieSiatka kwadratówStatusZatrzymaj automatyczne wyrównywanie poData koncowaBity stopuBity stopuPrzechowuj obrazy w tym kataloguTryb magazynu i częstotliwosci Kliknij ppm na liscieStrumień tekstuPrzeslij kazde QSO jako zalogowanePrzeslij hasło przy kazdym przeslaniuPrzeslij plik adif do LoTWWykonanie nie powiodło się (wewnętrzne).Tworzenie Sunspota w toku!Tlumiony nosnik +/-Częstotliwosc wtrysku AFZamianaZamien lewe / prawe kontakty klawiszaPrzełącz do ARQ I/OSynchronizacja z rekordem danychKolor systemowySystemT/RTCP/IPTransmisja danych TCP/IPTESTTHOR obraz RawTTY BaudTTY i/oPrzesuniecie TxOpróznij bufor TX (Minut, 0=Wylacz)Moc TxTX czas gotowości (min)Generuj TXTX offsetTX ppmKorekcja karty dzwięk TXKolor kartZródla danych tabelarycznychOgonGłosGniazdo głosowe (tylko MS)Dziesięc z Dziesięciu otrzymanych numerówTestTest =>Sygnal testowyTestowe znakiZnaki testowe do regulacji QSKTestuj polecenieCzas trwania tonu (60 sek)Test pliku tekstowegoTest...Przechwytywanie tekstuKolor tekstuPodswietl tekstTekst Tagów (tagi uzyj {} ograniczniki )Przechwyc tekstWstaw plik tekstowyTekst do wyslania, podczas bezczynnosci klawiaturyTekst...Treść i wyświetlanie wiadomości powiadomienia RsID parametry są konfigurowane w zakładce „Powiadomienia”.Domyslna szybkosc CWNazwy pliku są zapisywane w obszarze tekstu RXPole wyrazenia regularnego nie moze byc puste.Wyrazenie regularne musi byc ważne.Opis zostanie zastąpiony obecnym modem i częstotliwosciaTest nie pasuje do tego wydarzenia wzorca wyszukiwania.Kreator przeprowadzi Cię przez podstawowe ustawienia fldigi:Znaczniki te mogą byc wykorzystywane w Grube linieTe zdarzenie jest wyrazeniem regularnym nieprawidlowym.CzasCzas (y):Czas zakonczCzas rozpoczKoniecCzas StartuKoniec QSOCzas roz. QSOCzas między wycofaniem się w msekWymagany czas : Limit czasuLimit czasu xmt proba w XX sekundCzas ponadLimit czasuLimit czasu ( msek )Limit czasu ( sek )KoordynacjaUstaw czasZ kim polaczenie zostanie nawiązanePrzelaczUstaw DTR dla PTTUstaw RTS dla PTTPrzelacza linię PTT 20x; sprawdz DIODA LED DRA-30 pttCzas trwania tonu (sek)Ton KeyerWlacz TonDzwiękiSzybkosc CW w WPMSledzenieSterowanie transceiverem, flrig/rigcat/hamlibBezposredni transfer do flmsgSzybkosc transferu, X1 -normalnaPrzejscie Poziom (dB)NadawanieOpoznienie transmisjiMoc TXNadawanieNadaj znak stacjiCzcionka TxKontrola poziomu transmisjiNadaj malymi literamiNadaj nizszy ton startuNadaj tryb IDEmisje TXNadawanie kropek (.) w czasie bezczynnosciMoc nadawaniaSygnal nadawaniaNadaj tekstNadaj wyzszy ton startuNadaj tekst videoNadawanie/OdbiórNadaje Diddle kropkę gdy nie aktywny klawiszTrójkątnyLimit wyzwalania (s):Troop-RHufiec-SStrojMargines Strojenia (rozstaw częstotliwosci sygnalów)Dostrój do Rx SpotSchemat 1Schemat 10Schemat 2Schemat 3Schemat 4Schemat 5Schemat 6Schemat 7Schemat 8Schemat 9Parametry TXMnoznik szerokości TxTx powyzej RxTło TxCzcionka TxPoziom tłumienia Tx (dB)Moc nadajnika wykorzystywana do zapisu w loguTxIDUTransmisja danych UDPUDP/IPIUUI językUI schematPrzeglądarka/kanałyUI/Przeglądarka/KolorUI/Przeglądarka/poziom wykrywaniaUI/OgólneUI/Przyciski makroUI/tekst RXUI/TouchBEZKIERUNKOWYStany Zjednoczone / Prowincje kanadyjskieStacja zaliczona ze stanu USAJednostka odległosci (QRB) USAHrabstwa / regiony USA/KanadyUSB serial I/OUSOSNie można utworzyć pliku %s (błąd No=%d) func %s:%dNie można otworzyć pliku %sUsuń zaznaczenie pola wyboru, jeśli KML nigdy nie jest używanyNiezdefiniowany bładNieukierunkowany odebrany tekstCofnijOsiągnięto nieoczekiwany koniec pliku.Nieoczekiwany koniec parametru (args[]) lista znalezionychNieoczekiwany koniec listy wyboru parametrow znalezionychNieznany dekodowanie znaków (hałas)Niedopasowane rekordy LoTWUnshift na przestrzeniNieobsługiwany format audio.AktualizujAktualizuj wybrane pliki danych z repozytoriumAktualizacja nie jest dostepnaAktualizuj aktualny rekordWyzszyGórna granicaGórny poziom sygnalu (dB)Ustaw "cr cr lf" dla "cr lf"Uzyj '(' zawias nie KNUzyj C-Media PTTUżyj CD lub obrazu dysku CDUzyj filtru DSP przed dekoderemUstaw DTRZastosuj termin FarnsworthUzyj HamlibUstaw ZNACZNIK czest'Uzyj serwera audio OSSUzyj Otwórz, aby wybrac plik deskryptoraUzyj portu Audio ServerUżyj PotUzyj Pulse Audio ServerUstaw RTSUzyj RigCATUzyj oddzielnego portu szeregowego kluczaUzyj T/N dla 0/9Użyj ogranicznikow TABUżyj WPM PotUsrednij, zmniejsz szum wodospaduStosuj kolorowe przyciskiUstaw przekroczenie zakresuUzyj daty/czas do wpisu w loguUżyj klucza FSK FLrigSluzy do wyzwalania nosnika wzmacniacza detekcjiUzyj zerUzyj portu równoleglego PTTUzyj oddzielnego portu szeregowego PTTUzyj małej czcionkiUzyj soft- bit Viterbi dekodowania dla lepszej korekcji bledów Najlepiej aktywuj z dekodowaniem symboliUżyj soft-decision dekodowanie do wykrywania symboli Wspomaga dekodowanie soft-bitUżyj ogranicznikow kart między kolumnami w pliku eksportu csv.Uzyj ich dla WinKeyera i nanoCWUżyj tej lokalizacji stacji tqslUstaw uHRouter PTTUzyj wave na sygnał TxUzywany pakiet programów dla PSKMail i fldigiUzywane tylko do trybu analizy czestotliwosciUzyte do BPQ32Stosowane, aby skorygowac agresywnosc TXID UzytkownikaUzytkownikKorzystaj z portu UDP #Aktywuj VSPPrawidłowy okres próbkowania sygnału (msek)Okres probkowania sygnalu w milisekundachRozwlekłyZweryfikujZweryfikuj baze danych za pomocą pliku z LoTWZweryfikuj bazę danych za pomocą pliku z eQSLWersja% s jest dostępna w Source ForgeTryb Video IDPreambuła wideo IDPokazWyświetl NiedopasowanePokaz/ukryj 48 makrPokaz/ukryj kanalyWirtualny Emulator Portu Szeregowego - brak ostrzezenWidoczna SygnaturaWidoczne emisjeZobacz stronę internetową HamcallZobacz stronę internetową QRZZobacz stronę internetową hamQTHUWAGA - to zresetuje Twoje wszystkie ustawieniaObrazy Wefax ...Powieksz wodospadUstaw przesuniecieZapis wodospaduAmplituda wodospaduNosnik wodospaduSzybkosc wodospaduWybór trybu wodospaduPoziom referencji wodospaduWPMUstaw WPMSledzenie WPMWymagana aktualizacja puli WPM do nanoIOUstaw WPMSzybkość WPM dla ciągów poleceń Winkeyer Domyślnie = 18CzekajPoczekaj NN sekund na odpowiedz LoTWCzekaj na odpowiedz CATCzekaj na odpowiedz do nastepnego poleceniaCzekaj interwał ( msek ) przed odczytem odpowiedziUwagaWodospadWodospad / FFT / OscyloskopWodospad wysrodkowany na nieznanym sygnaleWodospad wysrodkowany 1/2 drogi między nieznanym i odniesieniemWodospad wysrodkowany na sygnal odniesieniaPredkosc spadku wodospaduWysokosc wodospadu w pikselachWodospad Video IDTekst wideo wodospaduSterowanie wodospadem/przyciskamiWodospad/wyświetlaczWodospad/FFT przetwarzanieWodospad/Uzycie myszyWodospad/spektrumNagrywanie plików WavNagrywanie plików Wav - ZACZNIJ NATYCHMIASTNagrywanie plików Wav - SYNCHRONIZE z nagrywaniem danychPróbkowanie zapisu WavObraz nadanego faksu pogodyInternetWyszukaj w internecieSieć Web/PskmailSieci Web/WXWagaAkcja kólka myszkiGdy nie występuje sygnałWygenerowane dokumenty KML są przechowywane.RozciągnijSzerokoscNastąpi po upływie tego czasu w sekundachWinKey PTTWinkeyer kontrola WPMSłowa ogranicznikiZawijanie wierszyZapisz aktualny zestaw makr przy wyjsciu z programuOpóznienia zapisu (ms)Opóznienia zapisu (msek)Zapisz stan nanoIO do Arduino EEPROMXMITXMLBlokuj TxUstawienie transmisje Xon/XoffXY - klasyczny zakresXcvr Port szeregowyYYaesuTakPrawdopodobnie używasz wersji alfa Uzywasz najnowszej wersjiMusisz miec zainstalowany program tqsl i zapisana jego lokalizacje aby dzialaly aktualizacje LoTW!Wymagany płatny abonament na dostęp do Hamcall on-lineWymagany platny abonament na dostęp do QRZ on-lineTwoj loginTwoje hasło logowaniaTwoje hasło do logowania tqslaapozawsze dołącz plik(i)dolacz # dyrektywe msgs do pliku o podanej nazwieautomatyczne wysylanie danychznak podpowiedzi w otrzymanym tekscieznak WPMznakiczysc wszystkobłąd alokacji cmd_buffer w pobliżu linii %dkonwertuj znak stacji na wielkie literykonwertuj znak stacji na male literyfolder cty.datobecne warunki wxdomyslnedomyslny tekst, aby wysłac z itpdomyslnie stosuj data/czas wlUstaw ' 'bez drukowanego znakuUstaw '*' lub brak drukowanego znakuUstaw '_' dla braku drukowanego znakuwylacz bez drukowanego znakuprzycisk Display PSM na glówne oknowyswietl znaki ustawien Rx jako ciag znakow ASCIIdata odebr. QSLdata wysl. QSLuzytkownik eQSLwlacz sterowanie kółkiem myszy na pasku makroflamp:fllogfllog:flmsg *odebr. dzwięk wavflmsg przekroczyl limit czasu wavflmsg.exe *.exeflmsg:flnet:flrigflrig jest to preferowana metoda sterowania tranceiveraflrig xmlrpc parametry serwera formanty te są dublowane na karcie konfiguracjiflrig:na przykład KMDQ dla Huntsville-Madison Lotnisko, ALdarmowy formularz 1 musi byc zgodnyswobodna forma wymianyskala freq = N * przepustowość modemusterowanie PTTie: /home/co7wt/CALLBK lub C:/CALLBK Pozostaw puste, aby szukac w baziew:kilometry / godzinaetykietaKliknij lpm myszy na WF wysrodkowany zakres widmalewe kliknięcie przenosi częstotliwość na częstotliwość srodkową zakresublokuj WF na 1500 HzmbaryminutnanoIO - TTY baudnanoIO Port szeregowyniezasilanie pilota (dB)print ^! wykonaj kody w panelu Rxwspółczynnik czasu rcos: 1.0 ... 2.0 W1HKJ najlepsze 1.275 DO2SMF najlepsze 1.500raportraport Celsjuszraport Fahrenheitraport slupa rtecireport kilometrów na godzineraport mil na godzineraport milibaryraportywierszewyswietlanie skali widma polaczone z przepustowoscia modemusekundseksek' =>wybierz czcionke przegladarkiwybierz według datywyslij kompensacje nanoIOwyslij po zalogowaniu (log przycisk, , )tekst WPMtekst WPM <= znak WPMlokalizacja stacji tqsltqsl:kolor sciezkiuzyjużyj zakresu wodospadu/wartości granicznychwartości po lewej / ponizej wodospaduwodospad- tylko emisjeadres wwwton nadawania start/stoptak{NAME} inna nazwafldigi-4.2.05/po/Rules-quot0000664000175000017500000000453314611711171012411 00000000000000# Special Makefile rules for English message catalogs with quotation marks. # # Copyright (C) 2001-2017 Free Software Foundation, Inc. # This file, Rules-quot, and its auxiliary files (listed under # DISTFILES.common.extra1) are free software; the Free Software Foundation # gives unlimited permission to use, copy, distribute, and modify them. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) $(MSGINIT_OPTIONS) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null \ | $(SED) -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | \ { case `$(MSGFILTER) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-8] | 0.1[0-8].*) \ $(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed \ ;; \ *) \ $(MSGFILTER) `echo $$lang | sed -e 's/.*@//'` \ ;; \ esac } 2>/dev/null > $$tmpdir/$$lang.new.po \ ; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header fldigi-4.2.05/po/remove-potcdate.sin0000664000175000017500000000132014611711171014206 00000000000000# Sed script that removes the POT-Creation-Date line in the header entry # from a POT file. # # Copyright (C) 2002 Free Software Foundation, Inc. # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright # notice and this notice are preserved. This file is offered as-is, # without any warranty. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } fldigi-4.2.05/po/en@boldquot.header0000664000175000017500000000247214611711171014034 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # https://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # fldigi-4.2.05/po/ru.gmo0000664000175000017500000035446314611714004011550 00000000000000,,awDwJww www wVx ^x kx xx x x x xxx x x x x x yy y &y3yS+j 78$ AK`'r͏W$Ej/'̐ (5;q w0 (͑)3 T f t ɒ.ܒ4 @Rge|     ,:B*WҔ )E dn s; %+,X/o Ė ז  '27 G Uaj{ .ė  $5IO,hC˜V]e~ ޙ)"-#Pt {$Țњ, KW^b { /8ASo&+0!5*R } 1 ǝѝ  , :AJj  ̟&ߟ, DP o9z%)ڠ/24g2*͡+,$ Q$r%7/->"l"""գ",'H-p Ĥ Ϥڤ  .6Tn s ǥڥ :1?q z  Ħ Ϧ:-+Yi{3) F P ^ h uǨ$$BUdPyʩҩ ש b!y/#˪ +; @L Tb4k,ͫիݫ  !9R[diĬW۬X3ZYYAȮڮݮ 9>Ncx ͯ ! ,@Tc,| ð2C8]6ͱ߱- 49Ml I09.h.0 ش$ (;@S"c:ɵ е޵ 4AYqö =Xk ŷ ҷܷ2- 3?_u Ӹ % < F Q-^ $ƹ3&6? O [ hu Ⱥ &, E'S{0Ȼ#"*J al¼Ѽ" %/C+Wɽx۽T Z h!t!J; 1Gy } п #3EUi /& &96H /, ?M&e"# ' > HRjq-  #.=lu / &> S_)r#0 &9Tnw!   ' +9S r  (.@IRY akt   8 F R^}  3IP_f| ;&@3;Dbv~ 0.!'"Il(^ AN W cp  ! ' 5 BNS \ hs  ,9TW )19@ S ^ ) >7L   < ]*y0!+ 8I_,q (#!0>o $38Q  1": ]k ! ?IXg y* 4.JYk.S ! +8J R`s y    1> P\l } - (#I$m   $+ DNc h!r '+//[%:/+H MW`hqy  /DJb"k 6GVu     , 9 F S ` nz 13Jgw|/,89Sm s &";^t )$AnP-, 4> O*Z''' #70J {+ ! ,9 A&N'u-  %;? R)_ '""QE51#<?E^"t'$&!@(b '3V1=G(,>QW_$pG6L]em+ 615 g t "9#\!. -:MTV\b 8Xm  ' 4 > K X er   29<?+|e5:&?f4k+$$($?Od8T*B4mQ88JU@[0{O\ZCDH>I1WHI$'87p 3+17]**#\l2h$"!Gi&=STBL&# S/B4=9?>?~B)/+1[R'0 U9   > M 2; An ? U XF K ? (+ T ] _ d h w         25 h y A = y 7 8]6c0eLbl8EN_;p_? L-j$$F <1Ghy)7:Lr+VB(V;;<I4^~% 44J4=2#R.vP Mq 00cN0&# JTk8 -E@r  "CB#98Ge%w$+`1!?;0 J Cf . 4 i!x!!<!X!">"a"y"6"_"*.#$Y#%~##HE$1$$'Q%Gy%#%%/%$&L@&&&&s&J':i'b'f(#n(7(((()8)"S)v)k)m)"i******+++!+!,!;,"],,%,*,*,-&-7-S-o----)-=-4/.d.w..1.$.U.,L/ y/0/ /D/"0U*0&0+00 001 11.!1P1 m1x1}1111 1&1,2.F2 u2S222233/3I3]35l3Q3&374RS4T44&5&65]5u5 5I5:5"6G56L}6@6 77Q77*7 707.7,8 L85V88 88+8 8<8$94>9as9A9Y:#q:,:G:C ;TN;C;Y;DA<C< <<G<7= K= l=w=y==@===%>"4>W>l>[@z@4@(@r@'aAXAAABj*BZB~B>oC_C@DaOD'DADhEQE5EW F;dFqFG*#G4NGGRG:G:-HChH:H:HZ"I7}IjI+ J LJ YJfJ~JJJJJ J! K5+KaK3tK)K K"KL#LD3L$xL#L0LLaMCfMM M6MM<NKNZNAmNvNn&OOO$OO$O "P,PF5P |PPIPvPjQQQQQ Q QQR,R&LR=sRR+RR SS*S S SS SS S' T2T@T9)U2cUUUUUU V V'V6VNVN]V_V WW*W 9WREW*W(W(WXX'X*8XcX2rXXXXXXXX|X}iYY~gZ~Ze[n[Ls[#[[[!\0'\*X\\$\'\'\0]02]c]:v]:]<]-)^&W^3~^^1^=^<_Z_@v_#_*_I`*P`O{`k`!7aYa:vaaaa?a16bhblbbbbybW>cec7cM4diddKe&fO/fffff!f2fQ%gwghh h,h*Dhohhhhhh!h!i!%i3Gi{ii4i4i*i1(j3Zj,j jj,j! k.k LkGYk0kkk3k )l-Jlxll&l/l#lm$5m Zm<gm2mm mmRn)qnLn\n Eo`Ro$oo)op'p9p'Rp?zp p/p6p .q"9q#\q,q3qqEq-rFIr*rbr8s8WsUs@s-'tUtktttttt"tt>u Eu9Puuuuuu;u.v 5v4@v0uv vvww!w4w>+xjxxyyMyUyyyz5zEz(az(zzz zzC{"L{o{({,{9{|9|&Y||L|8|}#&}#J}n}j}}~%~RE~ ~ ~~L~1%JRpVN\i4ƀ.$* OY/j?h erQ˂</Ll2؃3 ?-_&W  /20b/E߅=%=c   @ņC&4j)$܇)+0Gx| "+݈ !/?o   ȉԉ؉݉ EAPh .-6;Tn1ċNދ-F^(v'.֌-3Q&b N"<-K3y7F`,   cz%=& #?0pJQӒ5%[@rA-#<RA_}%&ѕ #8N"U x <͖Ֆ  ,)9c v&,7 Jk(!$֘!0DB\;'c'v&Ś$ޚ'+ :G"Vy4-ě(10M3~Ȝ=("%Kcq՝9")L0j*o*P3{ŸUݟA3Xu"Π.) iJ',ܡ( O2b7W(u#ڣ'A&#hLJ٤c$p %.-\$m 6 W 3c',ݧE ,PB})G#2LVީ$# =NK>>٪R=k26ܫ<TP)b!έ&% LW&mǮJخ#4EVt(}- ԯ+!? ]~ϰ]RP>=4 /U'ɲܲ! BXl1sγ׳A(7`h%1V G+UR1ԵSwZVҶ_) Ϸ! 0%Vn(~ $ȸ''.2V1Ĺ$ݹ8;.L!{+ɺ#ں&7%&]P+%#E9i ڼ!  > _   ½  %; J T-bϾ!B NP!3# @$Megj,3,,2J3}@ %$4D)y-.+ ,8cX#, >(8g6L%O-%}H$5LFL2"6+=$i(2['uP%3HWfDJOI0169pte 3gM"%,'TV;[X Ty #2 5/@8p=AAT $9 8F2 rp*m! %'3[ d!qJt S^$}6)! > KXt:* P2qG6Prq < aUuE TI:05H3qA@Ejpn2g6z$-''xZ*=R:Ak;^|1D{4<bEJM8c"[Sm2`T#rgD)`Jv\LLm)=hXXDxIbdJo--?,0x{QKIR:}<GDC;RBu)r%44Bi$,Y8W5i t`]6e^%+T @9\}jW.+`q7<trfjeP[Buh!nKd=fe8Y*,N4cC9 K-83g %"s J!AcQ_,l"&_OQ:I  k+#U|/ZL}pcL~Aaa{mho$"[Bp$Q*e$1k/52#!6p%K]N~nVebxm8 V72tn/y jhTId3 9mq>Zfu\{F}]:;~*#=jGYG'\W+Y0lZPGySwC\A`!bkxH>?Q?!IWw#ts ZKn;FO o8V3=v /1FzXs><M\ l% HCa10"Y~Uj~U*@%>Xz7v?DciV{B'd2"w(^9Llu_ NCFYo @]5rs:}^OyV>FRC,~vP]_&(dSHEEa@th||,(VR43g 9; g 3;?TTn 70 < tFb1o!EwyA>Jf&S/e[l6{^&ON)i9.4([wk+7l 6@OZ5 fp=mz yX(khsNNiv$ .M D piL&H.#_zHsPS)c_.Gv ||*x/1.dRO+bM(gU?SU f'WXo-K[Wy` 7'z-aqMw&}Q^)]MJBur50 {CALL} other ops call sign {MODE} full mode / submode 4 07 7 5 21 29 6 22 31 in " ""Disable PTT keys modem if multiple instances of fldigi (client) are connected to a single flrig (server).# Records in logbook# retries before giving up%s exists, overwrite?%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&UI&View**.exe*.txt... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...00 = T; 9 = N11 - Slow, 2 - Medium, 3 - Fast1/2 speed1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types12 26 3213 23 3314070.15016 27 3617 00 1118 01 1219 24 351x speed2 baud20 28 3821 29 4022 03 1523 04 1624 05 1825 06 2225 W26 25 3727 02 132x speed3 baud4.5 baud500 Hz limit6 baud8 psk8-bit extended characters8-bit extended characters (UTF-8): AFC on,off,toggle my antenna operating band other call clear log fields clear RX pane clear TX pane contest counter CW identifier decrement counter digital mode (adif) log eQSL optional msg log eQSL insert text file valid xcvr filter width my frequency move to freq NNNN Hz return to sweet spot send mode ID; TX start only idle signal for NN.nn sec LDT default '%Y-%m-%d %H:%M%z' insert image file increment counter S/N etc. IMD etc. ZDT default '%Y-%m-%d %H:%MZ' last serno sent local date, default '%Y-%M-%D' saveQSO data, append msg to notes other locator LOCK on,off,toggle saveQSO data, append msg to notes save QSO data local time, default %H%M map by value map on google mode my call my FD class my locator my name my RST my FD section other name next QSO rec # pause transmit insert QRG into Rx text # QSO recs QSO time (HHMM)) incr/decr xcvr freq qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously valid xcvr hi cutoff filter valid xcvr low cutoff filter valid xcvr mode other RST receive Rx RSID on,off,toggle save current macro file save contest out current contest serno search DOWN for signal search UP for signal Digitalk On, Off, Toggle text at start of TX repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle Fldigi version delay xmt for NN.n sec get weather data for station get weather data exchange begin exchange end exchange in exchange out UTC datetime, default '%x %H:%MZ' zulu date, default '%Y-%M-%D Z' zulu time default %H%MZ= 1 (on)AADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedALTRARQAX25 DecodeAbortAccess URLAcquisition S/N (dB)Acquisition search range (Hz)ActionAddAdd RsID signal to end of transmissionAdd address to notes fieldAdd date/time stamp to each # received messageAdd geopolitical name of METAR stationAddrAddressAdjust cursor frequencyAdjust sensitivity by 1/N fractional values.Adjust the DSP bandwidthAdvanced configuration:AllAll entriesAll settings shown here can be changed later via the Configure menuAllow errorsAllow transmits after 'N' seconds of a signal detection.Allow/Disallow ChangesAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAlways transmit at 1500 Hertz center freq.Antenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio on Auxiliary PortAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAudit logAuto Connect / RetryAuto connect when fldigi opens (server must be up)Auto-fill Country and AzimuthAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAvailable substringsBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBad frequencyBandBands must matchBandwidthBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBg colorBits per characterBuffer allocation Error near File: %s Line %dBug me about saving log entriesBuild infoButton HeightC&ountriesCALLSIGN always lower caseCAT command for PTTCPU usage increases with waterfall heightCQ STATECQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW QSK signal on right channelCW dsp filter bandwidthCW is LSBCW is LSB modeCW transmit WPMCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall SearchCall sign workedCallook.info lookup (free service US callsigns only)CallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture Radio ReportCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier Sense Mulitiple AccessCarrier frequency (Hz)Carrier shiftCelsiusCenter display on signalCenter freqCenter in passband Right click to undoCenter lineChange ONLY to experimentChange application look and feelChange colorChange dir...Change positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitCharacter count in args[] parameter exceeds expectationsCharacter searched not foundCheck AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check if xcvr uses LSB for CWCheck if xcvr uses USB for RTTYCheck this to be notified when an RSID is received without changing modem and frequencyCheck to enable TCP/IP IO ConnectionCheck to enable UDP/IP IOCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCity of station workedClassCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear UDP textClear channel text after # seconds of inactivityClear list?Clear log controls sets RST in to 599/59Clear log controls sets RST out to 599/59Clear log entries after saving or using macro Clear log fields?Clear on saveClear textCloseClose ListColorColor for outgoing telnet textColor of Mark TrackColors and cursorsCommand %s ignored, dot notation not supportedCommand %s ignored, structured command not supportedCommand Not FoundCommand line optionsCommand missing ':'.Command started when KML files are generated. Subprocesses are started once, and restarted if needed.ConditionsConfig ScriptsConfirmConfirm QuitConfirm RESETConfirm exitConfirm quit?ConnectConnect to MacLoggerConnect to host program on FLDIGI start upConnect to serverCont'ContestContest exchange receivedContest exchange sentContest seral # sentContest serial # receivedContest:ContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate keyed square wave on right audio channelCreate new logbook fileCustom shiftCustom text searchCustom...CutDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDX ClusterDXCCDXCC designatorDXCC entitiesDXCC entityDash/DotData base lookupData files repositoryData files sourcesData files updateData files...Data retention time, in hours (0 for no limit)Data sourceDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecode (CWI suppression)Decode AX25 Packets into human readable formDecode DTMF tonesDecode received DTMF tonesDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log fileDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DefaultDefault RST in to 599/59Default RST out to 599/59Default SettingsDefault URLDefault WPMDefault for all other modemsDefault test string is: "DefaultsDelay NN msec after executing mode changeDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete entry?Delete local data files if selected.Delete the current recordDeselectDetected signal levelDetector high thresholdDetector low thresholdDevice:Difference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirectory path not foundDirectory...Disable alert dialogDisable allDisable freq changeDisable further detection when RSID is receivedDisable if flrig not used.Disable spotting when signal browser(s) are not visible.Disables detectorDisplay RX in reverse videoDisplay macro filename at startDisplays the Slot Time in MillisecondsDisplays the Transmit Delay in MillisecondsDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDon't saveDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEEQSL-rcvdEQSL-sentEmpties KML documents when starting program.EnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable ARQEnable ARQ for programs that support TCP and FLDIGI ARQ protocol. Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol. Only one interface (ARQ/KISS) can be active at any given time. KISS/ARQ/XML Addr/Port changes require program restart.Enable Busy ChannelEnable CSMAEnable DSP prior to decoderEnable Data StreamEnable GPIO PTT (Pi specific controls)Enable HistogramEnable Histogram threshold signal monitoringEnable KISSEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable encode/decode vestigial pilot toneEnable flrig xcvr control with fldigi as clientEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable rx text streamEnable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable this to send start/stop tonesEnable to put Tx panel above Rx panelEnable when both programs are using the same IP addressEnabledEnd of line reachedEnter METAR data internet URLEnter QTC textEnter full path-filename for external programEnter full path-filename for flampEnter full path-filename for fllogEnter full path-filename for flmsgEnter full path-filename for flnetEnter full path-filename for flrigEnter full path-filename for tqsl executableEnter full path-name for cty.dat folderEnter test string or leave blank for default:Enter time span in minutesErrorEvenEven LinesEven linesEventEvent logExch InExch OutExchange InExchange OutExecutable file to insertExecuteExecute command on KML files.Executing script file: %sExitExit promptsExportExport SetupExport records for LoTW uploadExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programExtract times out after NN seconds of inactivity.FD classFD sectionFECFFT averagingFFT prefilter window functionFLMSG files...FahrenheitFax images destination directoryFeel free to skip any pages or exit the wizard at any timeField Day Callsign May be same as OP callsignField Day ClassField Day LoggingField Day SectionFile not foundFile read errorFile:FilesFill in Country / Azimuth using cty.dat informationFilterFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFlrig PTT keys modemFlushes the TX buffer after x period when Busy Channel remains on (TX inhibited)FoldersFontFont colorFont...Font/ColorFont:Force RST in/out to 599/59Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree service courtesy of OKFreqFrequencyFrequency in MHzFrequency scaleFullFull reportGeneralGeneral ErrorGenerateGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Hamcall.netHamlib used for rig controlHeight of macro barHell Receive ParametersHell Transmit ParametersHiLite 1HiLite 2HideHide window after (s):HighHigh frequency limit in HzHost:II/OIDsIFKP Raw ImageIOTAIP Address Port NumberIP Address for ARQ interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for KISS interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for XMLRPC interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for fllog interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostIP Address for flrig interface IP Address format: nnn.nnn.nnn.nnn or name: i.e. localhostITU zoneITUZIdle transmit before data sentIgnore duplicatesInInactivity timeoutInches Hg.Include the transmit frequencyInclusive stop date for exportInfoInit delay (ms)Initial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInput carrier shiftInsert default textInsert file...Insert full METAR reportInsert leading zeros into Xmtd serial numberInsert markerInsert textInsert text on single left clickInteresting notesInterleave SYNOP and textInvalid File Name Pointer (NULL) in function %s:%dInvalid Modem for KISS IOInvalid function parameter 'char *file_name_path' (null)Invalid function parameter (internal non-script error)Invalid parameterIslands on the airIssues reported in processing script file: %sK3 A1A configuationKISSKML files directoryKML refresh interval (seconds)KML server enabled (On / Off)LOCLOTW-rcvdLOTW-sentLast QSOLatencyLeave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Limit AFC movement to this rangeLine: %d Error:%d %s (%s)Listen for signals within this rangeLoTWLoTW ReviewLoTW download fileLoadLoad a new paletteLoad image fileLoad last used macro file at startLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocate tqsl executableLocatorLockLock transmit frequencyLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLogbookLoggingLogging Panel ControlsLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow frequency limit in HzLowerLower limitLowest freq on bottom of viewerMETAR station ID codeMETAR station locationMFSK ImageMFSK image fileMYCALL always lower caseMacro Button LabelMacro Edit FontMacro TextMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesMark onlyMark-SpaceMarquee textMatch logbook records with LoTW download fileMatched Filter bandwidthMaximum open subscripts reached.May require resizing the Rx/Tx panelMediumMemory Allocation Error (internal non-script error)Merge ADIF fileMerge...Message LoggingMeter ColorMiles / HourMilliSecondsMinimal controlsMinimum time between eventsMiscMissing command %s after line %dMissing paired quotes (")ModeMode delay (msec)Mode in useMode must matchMode width limitModemModem Bandwidth Margins Modem carrierModem signal on left and right channelsMonitor for TCP connection.Monitor signals in modem bandwitdh plus margins.Monitor transmitted signalMouse wheel active on macro buttonsMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy StationMy callsign de CALLMy transmit CW WPMNN3FJP Server IP AddressN3FJP Server IP PortNBEMS files...NO CALLSIGN SETNameNarrow LPF if image noisyNewNew record / Save recordNextNoNo ErrorsNo faster than thisNo slower than thisNon transmit window after a transmit periodNoneNormalNormal drop speed / valueNot a script file/tag not foundNot worked beforeNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.NotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberNumber of hours data is kept for each node. Zero means keeping everything.OOKONON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOddOdd LinesOdd linesOn/OffOne above Rx/TxOne above waterfallOne below waterfallOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperate tqsl in batch mode (no dialog)OperatorOperator CallOperator Callsign:Operator Name:Operator callsign (if different than station callsign)Operator workedOperators QTHOperators nameOptional configuration in format: param=val ...OptionsOtherOutOutput port number when same IP address usedOverPSK/RTTY Viewer HiLite Color 1PSM AttenuatePSM Histogram ThresholdPTT delays valid for all CAT/PTT typesPTT enables auxiliary audio sourcePTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT using hamlib commandPTT via Hamlib commandPWR-meterPalette: Parameter is not valid.ParityParse all incoming textPartialPassed parameter is not of the expected type.PasswordPastePaths (hidden)Percent (%)PersistancePick baud rate from listPilot tonePilot tone power relative to signalPlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Polling Interval (msec)Popup info after a 2 second hover on a callsignPortPort:PortAudioPost write delay (msec)Power Signal MonitorPower scalePreamble DetectionPress only if you change the address/portPress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro fileProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPulse shapePulse width (msec)PwrQRZQRZ cdromQRZ.comQSKQSK on right audio channelQSLQSL rcvd dateQSL received on this dateQSL route of contacted stationQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSYQTC:QTHQTH NicknameQthQuietQuiet mode [-q], do not open tqsl dialogRSID receptionRST always 599/59RST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY is USB modeRX - unshift on spaceRX captureRX ppmRX sound card correctionRadio frequencyRaised cosine pulse shape factorRange +/- wpmRange 1...3Range 1...4Really delete record for "%s"?ReceiveReceive UsageReceive filter bandwidthReceive synchronizerReception of flmsg filesReception reports...Record both channelsRecsRectangularRefresh time interval written in KML file (Seconds)ReloadReload cty.datRemoveRemove call after ...Replay trackline audioReport ARQ frames average S/NReport actual modem RF frequencyReport rig frequency (enable only if you have rig control!)ReportsResetReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! RestartRestore defaultsRestore the serial (COM) port settingsRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetriesRetrieveRetrieve for active modem useRetry interval (ms)ReverseReverse Left/Right channelsReverse videoReview / edit the exported LoTW upload adif fileReview lotw.adif file before sending with tqslRig description file:Rig modeRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig/Log ControlsRig:RigCAT used for rig controlRight/Left Select Least Signficant DigitRight/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSDRst receivedRst sentRun programRun program:Rx / Tx PanelsRx AGCRx Height in pixelsRx ParametersRx WPMRx Width MultiplierRx bkgndRx fontRx/Tx Character setS-meterS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2SYNOP to ADIFSYNOP to KMLSample rateSaveSave ...Save ConfigSave as...Save changed Logbook?Save changed configuration?Save changed macros?Save log entry?Save logbook fileSave macro fileSave paletteSave text asSave this paletteSave...Scale ColorScript FilesScript device path not found.Script file contains potential issues See documentation and/or Log file for details.Script file name (path) invalidScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Secondary TextSecondsSectionSelectSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect PTT on stateSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect paritySelect pin numberSelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSendSend CW cut #'sSend Callsign in CW at end of every transmissionSend QSO data to LoTW when loggedSend a continuous stream of test charactersSend at this WPMSend beacon every ...Send continuouslySend data stream directly to executing flmsgSend imageSend image...Send lotw.adif via tqslSend reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSer inSer outSerial # inSerial # outSet >0 if pulsed PTT usedSet Viewer SquelchSet level for good viewingSet the number of characters per rowSet the type of resampler used of offset correctionSets the theshold level to x value above the noise levelShaped TxShort PreambleShort description of antennaShowShow DXCC entitiesShow TX timerShow alert window:Show all modesShow and enable Power Signal Monitor button (PSM)Show bandwidth tracks on waterfallShow channelsShow cursor with center lineShow fewer modesShow macro control codesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:Signal BrowserSignal browserSignal range (dB)Signal searchSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow CPU (less than 700MHz)Slow drop rateSoft-bit decodingSoft-symbol decodingSoftware reversal of left-right audio channelsSome changes made by the script requires program restart before they become active.Sort by Date/Time OFFSounderSpec CharSpeed (WPM):Spotting disabledSquelchSquelch levelSquelch open (sec)StartStart DateStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState must matchStation CallStation Callsign:Station LOCStation LocatorStation Locator:Station QTHStation callsignStation heard twiceStations grid squareStop DateStop bitsStopbitsStore mode and frequency Right click for listSubmit each QSO as loggedSubmit password with each uploadSubmit the upload adif file to LoTWSubscript execution fail (internal).Sunspot creation underway!Switch to ARQ I/OSys ColorsSystemT/RTCP/IPTCP/IP Data StreamTX - unshift on spaceTX PowerTX generateTX offsetTX ppmTX sound card correctionTab ColorTabular data sourcesTestTest charTest character for QSK adjustmentTest text fileTest...Text CaptureText ColorsText HighlightingText file to insertText to send during keyboard idle timesText...The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The test string did not match this event's search pattern.These tags can also be used in This event's regular expression is invalid.TimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time outTime span overTimingTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTracked CW speed in WPMTrackingTransfer direct to executing flmsgTransfer speed, X1-normalTransmitTransmit Data DelayTransmit PowerTransmit UsageTransmit callsignTransmit fontTransmit lower case textTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit textTransmit upper start toneTransmit/ReceiveTriangularTwo scheme 1Two scheme 10Two scheme 2Two scheme 3Two scheme 4Two scheme 5Two scheme 6Two scheme 7Two scheme 8Two scheme 9Tx ParametersTx above RxTx bkgndTx fontTx level attenuator (dB)TxIDUUDP/IPUIUI languageUI schemeUS state of station workedUS units of distance (QRB)Unable to create file %s (Error No=%d) func %s:%dUnable to open file %sUncheck if KML is never usedUndefined errorUndoUnexpected end of file reached.Unexpected end of parameter (args[]) list foundUnexpected end of parameter check list foundUpdateUpdate selected local data files with repository contentUpdate site not availableUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse averaging to decrease waterfall noiseUse colored buttonsUse date/time off for log entryUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse this tqsl station locationUse uHRouter PTTUsed For PSKMail and FLDIGI Suite of ProgramsUsed for BPQ32User IDUser nameUsing UDP port #VSP EnableValid signal sample period in MillisecondsVerboseVerifyVerify database with LoTW download fileVerify database with eQSL download fileVersion %s is available at Source ForgeVideo Preamble IDViewView/Hide 48 macrosView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit hamQTH web siteWARNING - this will over write ALL settingsWF MagnificationWF Shift ControlsWF StoreWF carrierWF drop rateWF modeWF ref levelWait for response to first CAT commandWait for response to subsequent commandWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall drop speedWaterfall height in pixelsWav write sample rateWebWeb Browser lookupWheel actionWhere generated KML documents are stored.WideWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)Write delay (msec)XMITXMLXMT lockXON/XOFF flow controlYYesYou are running the latest versionYou must have tqsl installed and it's location recorded for LoTW updates to work!You need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordYour tqsl login passwordaaafteralways append to file(s)automatic data uploadcallsign tooltips in received textcharsclear old dataconvert operator callsign to lower caseconvert other callsign to lower casecty.dat foldercurrent wx conditionsdefaultdefault uses date/time ondisplay PSM button on main dialogdisplay Rx control chars as ascii stringeQSL userenable mouse wheel control of macro barflamp:fllogfllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrigflrig is the preferred method of tranceiver controlflrig xmlrpc server parameters these controls are mirrored on the IO configuration tabflrig:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form exchangeie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourlock WF at 1500 Hzmbarsminutespilot power (dB)print ^! execution codes in Rx panelrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportssecondsselect browser fontselect by datesend when logged (log button, , )tqsl:track colorwaterfall-only mode{NAME} other ops nameProject-Id-Version: fldigi 3.23.21.6 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2017-03-14 14:10+0500 Last-Translator: RX9CDR Language-Team: RX9CDR Russia, tnx for help UV7QAE Ukraina Language: ru MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.8.12 Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); X-Poedit-SourceCharset: UTF-8 {CALL} позывной корреспондента {MODE} полный режим/подрежим 4 07 7 5 21 29 6 22 31 in " ""Отключить РТТ, если несколько экземпляров fldigi (клиент) подключены к единому flrig (сервер).# Записать в журнал# повторных попыток%s exists, overwrite?%sлог стартует на %s%s: Не существует, создать?&О программеКонфигурацияФайлПомощьЖурналИнтерфейсВид**.exe*.txt... Эти средства управления находятся на других вкладках. Они копируются здесь для удобства. ...00 = T; 9 = N11 - Медленно, 2 - Средне, 3 - Быстро1/2 скоростиТон 1000 Гц при включенном РТТ Может быть использован вместо или в дополнение к другим видам РТТ12 26 3213 23 3314070.15016 27 3617 00 1118 01 1219 24 351x скорость2 baud20 28 3821 29 4022 03 1523 04 1624 05 1825 06 2225 W26 25 3727 02 132x скрость3 baud4.5 baud500 Гц предел6 baud8 psk8-разрядное расширенние символов8-разрядные символы (UTF-8): Авто подстройка частоты, вкл, выкл, переключить моя антенна рабочий диапазон позывной корреспондента очистить поля лога очистить RX окно очистить TX окно контрольный номер CW идентификатор уменьшить контрольный номер на единицу цифровая модуляция (для adif) сохранить QSO в eQSL и добавить примечания сохранить в логе eQSL вставить текстовый файл Включить нужный фильтр в трансивере моя частота перейти на частоту NNNN Hz вернуться на свою частоту Передать идентификатор при старте передачи задердать передачу на NN.nn sec Локальная дата и время в формате '%Y-%m-%d %H:%M%z' Вставить изображение увеличить контрольный номер на единицу любая важная для вас информация. например соотношение сигнала к шуму любая важная для вас информация. IMD и так далее Зулусская дата и время в формате '%Y-%m-%d %H:%MZ' предыдущий серийный номер связи локальная дата в формате '%Y-%M-%D' сохранить QSO и добавить примечания локатор корреспондента Фикс. частоту ТХ вкл, выкл, переключить Сохранить QSO и добавить примечания записать QSO в лог локальное время %H%M координаты на карте карта в google модуляция мой позывной мой класс полевого дня мой локатор моё имя мой передаваемый RST моя секция полевого дня имя корреспондента следующий номер QSO пауза передачи Вставить расстояние между станциями в текст # номер QSO время QSO в формате (HHMM)) Увеличить/уменьшить рабочую частоту трансивера qsy на kHz, Hz правый клик QSY левый клик QSY QTH корреспондента повторить макрос непрерывно Вкл. Действующий ВЧ фильтр трансивера Вкл. Действующий фильтр НЧ трансивера Включить нужный режим трансивера RST корреспондента перейти на прием Принимать RSID вкл, выкл, переключить Сохранить текущий файл макросов сохранить рапорт в лог текущий серийный номер связи поиск сигнала ниже по частоте поиск сигнала выше по частоте Digitalk вкл, выкл, переключить Текст для передачи повторить после NN sec сигнал настройкиr NN sec переключиться между приемом и передачей встать на передачу Вкл ТХ аттенюатор Передавать RSID вкл, выкл, переключить версия Fldigi задержать передачу на NN.n sec получить данные о погоде для станции получить данные о погоде начало контест рапорта для лога конец контест рапорта для лога принимаемый контест рапорт (не номер связи) передаваемый контест рапорт (не номер связи) UTC дата и время по умолчанию '%x %H:%MZ' дата в зулусском формате '%Y-%M-%D Z' зулусское время %H%MZ= 1 (on)AADIFAFCAFC режимДиапазон АПЧ (Гц)Спектр АЧХ или Ч/БAFC скоростьALTRARQAX25 ДекодироватьПрерватьДоступ URLСоотношение S/N (dB)Диапазон автоподстройки (Hz)ДействиеДобавитьДобавить сигнал RSID к концу передачиДобавить адрес в поле примечанийДобавить отметку даты/времени для каждого # полученного сообщенияДобавить название станции METAR AddrАдресОтрегулируйте частоту курсорадробные значения 1 / N регулировки чувствительностиРегулировать ширину полосы DSPРасширенная конфигурация:ВсеВсе записиВсе настройки могут быть изменены через меню настройкиРазрешить ошибкиРазрешить ТХ после N секунд после обнаружения сигналаРазрешить/Запретить измененияАльтернативный цвет символов в Rx окнеВсегда LSBВсегда USBВсегда показывать аудио частотуВсегда включать новые режимы на этих аудио частотахВсегда передавать в центре 1500 ГерцАнтенна станцииВид меток каждого каналаДобавить к тексту RX:Добавить к тексту TX:ПрименитьКнопки со стрелками - Контроль частотыАудиоИнфо о звуковом устройствеИнформация об аудио устройстве доступна только для PortAudioАудио файлАудио частотаУстройство аудиовходаАудио на вспомогательный портАудио или радио частоты по шкале водопадаУстройство аудиовыходаДекодировать аудио историю выбранного сигналаАудит логаАвто соединить/повторАвто соединение, при отрытии fldigiАвтозаполнение Страны и АзимутаАвтоматический контроль частотыАвтоматическое отслеживание скорости RxАвтоматический спотинг при декодировании позывныхДоступные подстрокиНазадФонЦвет фона для кнопок группы 1Цвет фона для кнопок группы 2Цвет фона для кнопок группы 3Цвет фона шумоподавителя сигналаПлохая частотаДиапазонДиапазоны должны совпадатьПолоса пропусканияСкорость передачи данныхСкорость портаРуководствоBehavior of s/n imdФонЦвет фонаБиты на символОшибка выделения буфера под файл: %s строка %dСообщить мне о сохранении записей журналаИнфо о сборкеВысота кнопокСтраныПозывной всегда строчнымиCAT команды для PTTЗагрузка процессора увеличивается с высотой водопадаCQ STATECQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID режимыCW QSK сигнал на правый каналПолосовой dsp фильтр CWCW в LSBCW в LSB режимеСкорость CWCWI детектирование и подавлениеCWI порогУстановки CabrilloCabrillo...CallИскать позывнойПозывной корреспондентаCallook.info lookup (бесплатный сервис для США)ПозывнойМожет использоваться вместо или в дополнение к другим типам PTTВыйтиЗахватПерехват рапортаЗахват и воспроизводящие устройстваУстройство захватаЗахват RX текста во внешний файлЗахват сигнала по этому порогуЗахват сигнала в этом диапазоне частотПередача:Многократный доступНесущая частота (Гц)Сдвиг несущейЦельсияСигнал в центре дисплеяЦентр частотаВ центре полосы пропускания Правым кликом вернутьсяЦентральная линияИзменять ТОЛЬКО для экспериментовИзменить внешний вид приложенияИзменить цветИзменить папкуПозиции от нижнего до высшего каналаИзменение файла макросовИзменение масштаба водопадаИзменения вступят в силу при следующем запуске программыМетка каналаНомер каналаколичество декодируемых каналовКол-во символов [] Параметр превосходит ожиданияСимволы не найденыОтметить всёПроверить дублиПроверить наличие обновленийПроверить наличие обновлений при запуске программыПроверить обновление...Нажать если LSB для CWНажать если USB для RTTYУстановите галку, чтобы получать уведомления, когда приняли RSID не меняя модем и частотыГалка, чтобы включить TCP / IP IO соединениеГалка что бы включить UDP/IP IOПроверьте, чтобы уменьшить нагрузку на центральный процессор в режимах PSK и RTTY.Проверить обновлениеВыбрать папку, и сохранить документы KMLСработанные городаClassОчистить данные KML сейчас!Очистка при запускеОчичтить KML док. Выгрузить Google Earth дисплей.ОчиститьОчистить всёОчистить текст UDPОчистить строки от текста после # секунд отсутствия активностиОчистить список?Очистить лог и установить RST 599/59Очистить элементы управления лога установить TX RST 599/59Очистить поля журнала после сохранения или макросом Очистить поля лога?Очищать поля после сохраненияОчистить текстЗакрытьЗакрыть СписокЦветЦвет текста для исходящего telnetЦвет маркера трекаЦвет и курсорКоманда %s игнорируется, точечная запись не поддерживаетсяКоманда %s игнорируется, структура команд не поддерживаетсяКоманда не найденаПарам командной строкиКоманда отсутствует ':'.Команды стартуют при генерации kml файлов. Подпроцессы запустить один раз, и перезапустить в случае необходимости.УсловияКонфиг скриптовПодтвердитьПодтвердить выходПодтвердить сбросПодтвердить выходПодтвердить выход?Соединитьсяподключиться к MacLoggerConnect to host program on FLDIGI start upСоединиться с серверомКонтинентКонтестыПринятый номерПринятый номерПереданный номерПринятый номерContest:КонтинентНепрерывная прокруткаСимволы управления в области Rx / TxПозывной заглавными буквамиКонвертерКопироватьКоррекцияНе удалось создать каталогНе открывается url: %s Браузер не запустился: %s откройте URL вручную: %sНе удается запустить flmsgСтранаСтрана работающей станцииОкругСоздать 1000 Гц меандр на правом каналеСоздать cabrillo отчетСоздать ключевой меандр на правом аудиоканалеСоздать новый журналПользовательский сдвигПоиск текстаCustom...ВырезатьDTR +12DTR +12 vDTR = +VDTR это PTT сигнальная линияDTR это РТТ линияDX ClusterDXCCОбозначение DXCCDXCC клубыDXCC объектыТире/точекПоиск базы данныхХранилище баз данныхИсточники файлов данныхОбновление файлов данныхData files...Сохранение времени в часах (0 без ограничения)Источник данныхДатаDate OffDate OnДата окончания QSOДата начала QSODate time ON == OFFОтладкаДекодировать (CWI подавляется)Декодировать пакеты АХ25 в читабельной формеДекодировать DTMF тоныДекодировать принятые DTMF тоныДекодировать SYNOP (Ex: Deutsche Wetterdienst) в ADIF лог файлДекодировать SYNOP (Ex: Deutsche Wetterdienst) в KML (Ex: Google Earth)По умолчанПо умолчанию RX RST 599/59По умолчанию TX RST 599/59По умолчаниюURL по умолчаниюDefault WPMПо умолчанию для всех остальных модемовПо умолчанию тестовая строка: "УмолчаниеЗадержка NN мсек после изменения режимаЗадержка NN мсек перед тем как отпустить PTTЗадержка (мсек) перед началом аудиоУдалитьУдалить запись?Удалить локальные файлы данных, если выбран.Удалить текущую записьСнятьОпределен уровень сигналаДетектор верхнего порогоДетектор нижнего порогаПорт:Разница между Rx и Tx частотамиЦвет цифрЦифрыDimПуть каталога не найденПапка...Отключить диалог предупрежденияВыключить всёОтключить изменение частотыОтключение дальнейшего обнаружения при получении RSIDОтключить, если flrig не используется.Откл спотинг, когда сигнал(ы) в браузере не видны.Выключить детекторДисплей RX в реверс видеоПоказать имя файла макросов при стартеОтображение времени в миллисекундахОтображать задержку передачи в миллисекундахНе менять автоматически частоту RX RSIDНе показывать диалоговое окно RSID предупрежденияНе использовать базы данных позывныхНе искать позывной через веб-браузерDocked scopeНе сохранятьПеретаскивать мышкой частоту водопадаЦвет дубляПроверка на дублиДубльEEQSL полученоEQSL ОтправленоВыгрузить KML документы при запуске.ВключитьВключить -Вкл/выкл меню иконокВкл/выкл подсказкиВключить ARQВключить ARQ для программ, поддерживающих TCP и FLDIGI протокол ARQ . Включить KISS для программ, поддерживающих TCP/UDP и TNC-2 KISS протоколы. Может быть активным в любой момент времени только один интерфейс передачи данных. Изменения в настройках KISS/ARQ/XML требуют перезапуска программы.Вкл канал ЗанятоВключить CSMAВключение DSP перед декодеромВключить поток данныхВкл GPIO PTT Интерфейс ввода/вывода общего назначения (для Raspberry Pi)Включить гистограммуВключить мониторинг сигнала порога ГистограммаВключить KISSВключить MultipskВключить всёПоставить галку, чтобы включить соответствующий контрольВключить перетаскивание курсором шкалы водопадаВключить кодирование/декодирование подавленния пилот-тонов сигналаВключить flrig xcvr в качестве клиентаВключить для захвата текста в панели Rx одним кликомВключить для очень слабых сигналовВключить, если ваш компьютер не правильно декодируетВкл текстовый поток rxВключите это при первом запуске fldigiВключите эту опцию для латинских 1-подчеркнутых символовВключить эту опцию для передачи UTF-8 символовВключите это для UTF-8 символовВключите эту опцию для отправки старт/стоп тонаПоставить Tx панель выше панели RxВключить, когда обе программы используют один и тот же IP-адресВключеноДостигнут конец строкиВвести МЕТАР данные, URL-адресВвести QTC текстВвести полный путь для файла других программВвести полный путь для файла flampВвести полный путь для файла fllogВведите полный путь-имя файла для flmsgВвести полный путь для файла flnetВвести полный путь для файла flrigВвести имя файла и путь для исполняемого файла tqslВведите полный путь папки cty.datВведите тестовую строку или оставьте пустым по умолчанию:Введите время в минутахОшибкаЧетныйЧетные линииЧетные линииСобытиеЖурнал событийПринятый номерПереданный номерExchange InПереданный рапортИсполняемый файл для вставкиВыполнитьВыполнить команду KML файлов.Выполнение сценария:% sВыходЗапросы при выходеЭкспортУстановки экспортаЭкспортировать отчеты для закачки LoTWЭкспортировать в ADIFЭкспортировать в CSVЭкспортировать в fixed field textЭкспорт...Извлечь файл для работы с внешней программой "wrap / flmsg"Извлечь через NN секунд неактивности.FD classFD sectionFEC (прямое исправление ошибок)FFT усреднениеОкно функций предварительного FFTFLMSG files...ФаренгейтПапка назначения изображений факсаМожно пропустить все страницы или выйти из мастера в любое времяПозывной в полевом дне может быть личным позывным оператораField Day ClassПолевой деньРаздел полевого дняФайл не найденОшибка чтения файлаФайл:ФайлЗаполнить Страна/азимут с помощью cty.datФильтрПолосовой фильтрКоэффициент полосы пропускания фильтраШирина полосы пропускания фильтра по отношению к ширине сигналаФильтрацияНайти странуНайти далееНайти префиксНайти предыдущееНайти:КонецФикс. интервалыFldigi config...Конфигурация FldigiМастер настройки FldigiFldigi файл определения макроса *.{mdf}Fldigi палитра *.palУстановочный XML-файл *.xmlСайт FldigiFloating scopeРТТ от FlrigСбрасывает буфер TX после периода x, когда канал Занято остается включеннымПапкиШрифтЦвет шрифтаШрифтШрифт/цветШрифт:Установить RST in/out 599/59Скорость дискретизации выберите "Native", если "Auto" не очень хорошо работает на вашем аудио устройстве.Позывной преобразовать ЗАГЛАВНЫМИРасстояние между каналами 100 ГцУстановить date/time ON == date/time OFFFree service courtesy of OKЧастотаЧастотаЧастота в MHzШкала частотыПолныйПолный рапортГлавнаяОбщая ошибкаСоздатьСформировать 1000 Гц меандр на правом каналеСформировать прямоугольный сигнал на правом каналеГруппа 1Группа 2Группа 3Hamcall.netHamlib используется для управления трансиверомВысота полосы макросовHell Параметры передачиHell Параметры передачиHiLite 1HiLite 2СпрятатьСкрыть окно после (сек):ВысокийВерхний предел частоты в ГцХостинг:II/OIDsIFKP Raw ImageIOTAIP номер портаIP адрес для ARQ интерфейса IP адрес в формате: nnn.nnn.nnn.nnn или имя: i.e. localhostIP адрес для KISS интерфейса IP адрес в формате: nnn.nnn.nnn.nnn или имя: i.e. localhostIP адрес для XMLRPC интерфейса IP адрес в формате: nnn.nnn.nnn.nnn или имя: i.e. localhostIP адрес для fllog интерфейса IP адрес в формате: nnn.nnn.nnn.nnn или имя: i.e. localhostIP адрес для flrig интерфейса IP адрес в формате: nnn.nnn.nnn.nnn или имя: i.e. localhostITU zoneITUZЗадержка передачи данных перед отправкойИгнорировать дублиInПассивное времяДюймы ртут столба.Включить частоту передачиСтоп-дата включительноИнфоЗадержка начала (мс)Исходное состояние DTRИсходное состояние RTSНачальное напряжение на DTRНачальное напряжение на RTSАктивацияИнициализировать RigCAT интерфейсИнициализировать hamlib интерфейсИнициализировать H/W PTT интерфейс Инициализировать поля QSOВвести сдвиг несущейВставить текст по умолчаниюВставить файлВставить полныйl METAR рапортВставить нули в Xmtd серийный номерВставить маркерВставить текстВставлять текст одним левым кликомИнтересные заметкиЧередование SYNOP и текстНедопустимое имя файла (NULL) в функции %s:%dНеверный режим для KISS IOНеверный параметр функцииr 'char *file_name_path' (null)Недопустимый параметр функции (внутренняя ошибка скрипта)Неверный параметрОстрова в эфиреПроблемы в обработке сценария:%sK3 A1A конфигурацияKISSКаталог файлов KMLИнтервал обновления KML (в секундах)Сервер KML включен (вкл/выкл)LOCLOTW полученоОтправлено LOTWПоследнее QSOЗадержкаОставьте это поле пустым или обратитесь к http://www.pulseaudio.org/wiki/ServerStringsЛевый и правый каналы оба содержат аудио сигналлевый клик очистить текст правый клик сбросить частотуЛевой клик, чтобы выбрать цветLeft click: изменить режим Right click: конфигурацияЛевый или правый клик всегда воспроизводит аудио историюLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Ограничить движение АПЧ в этом диапазонеЛиния: %d Ошибка:%d %s (%s)Слушать сигналы в пределах этого диапазонаLoTWКомментарий LoTWУдалить LoTW файлЗагрузитьЗагрузить палитруЗагрузите файл изображенияЗагрузить последний используемый макрофайлЗагрузите или пропустите файл изображения Поддерживаемые форматы: PNG, JPEG, BMPЗагрузитьПутьLocate binaryМесто cty.dat fileНайти исполняемый файлПуть к flampПуть к fllogПуть к flmsgLocate flmsg executableПуть к flnetПуть к flrigПуть к программе #1Путь к программе #2Путь к программе #3Место tqsl исполняемого файлаЛокаторБлокБлокировка частоты передачиРегистрировать Navtex в Adif файлРегистрировать Navtex в KMLРегистрировать частоту RTTYРегистрировать Wefax в Adif файлЗагрузить все RX/TX текстыЖурналРегистроцияПанель управления логомСмотреть позывнойLotW пользовательНизкийLow = без ошибок Medium = 1 ошибка High = 2 ошибкиНижний предел частоты в ГцНижеНижний пределНижняя частота внизу спискаID коды METAR станцийрасположение METAR станцииMFSK ИзображениеMFSK image fileMYCALL всегда строчнымиНадпись на кнопке макросаШрифт ред. макросовМакро текстРедактор макросов - МакросЛокатор в формате EM64qv (6 символов)Атрибуты почтового сервераТолько маркерМаркерПунктирный текстВыбрать записи журнала для файла загрузки LoTWНастроенный полосовойМакс кол-во открытых индексов достигнуто.Может потребоваться изменение размера панели Rx / TxСреднеРаспределение памяти Error (внутренняя ошибка скрипта)Объединить ADIF файлыСлияние...Регистрация сообщенийИзмрительМиль / часмиллисекундыМинимальный контрольМинимальное время между событиямиРазноеНет команды%s после линии%dОтсутствует парные кавычки (")РежимРежим задержки (msec)Используемый режимРежимы должны совпадатьРежим ограничения по ширинеModemотступы от полосы пропускания модема Модем носителяСигнал модема на левый и правый каналыМонитор подключения TCP.Мониторить сигналы в полосе пропускания плюс отступыМонитор передаваемого сигналаУправлять макрокнопками мышьюМилисекунд между последовательными командамиМногоканальная обработка сигналовМногоканальный детекторМоя станцияMy callsign de CALLМоя скорость CW WPMNN3FJP Server IP AddressN3FJP Server IP PortNBEMS files...НЕ НАБРАН ПОЗЫВНОЙИмяУзкий ФНЧ если изображение шумноеНовыйНовая запись / Сохранить записьСледующийНетНет ошибокНе быстрее чемНе медленнее чемОкно запрета повторной передачиНетНормаНормальная скорость паденияНет сценария/тег не найденНе работал раньшеПримечание: Эти пункты конфигурации полезны для использования fldigi на устройствах с сенсорным экраном, например планшетахПримечаниеУведомленияТолько уведомлятьКол-во и расположение кнопокКоличество цифр в серийном номереКоличество часов данных хранится на каждом узле. Ноль означает, что хранится все.OOKONON - старт по умолчанию OFF - keep current wf cursor positionON - Использовать последний набор макросов OFF - Использовать установки по умолчаниюНечетныйНечетные линииНечетные линиивкл/выкл1 строка над Rx/Tx1 строка над водопадом1 строка под водопадомОнлайн помощьМодуляцияОткр...Открыть списокОткрыть файл в браузере по умолчаниюОткрыть в браузереОткрыть журналОткрыть файл макросовОткрыть папку сообщенийОткрыть сообщение с помощью flmsgОткрыть палитруОткрыть файл rig xmlОткрыть с помощью flmsgОткрытьПосле успешного захвата открыть папку NBEMSУправлять tqsl в пакетном режимеОператорПозывной оператораПозывной оператораИмя оператораПозывной оператора (если отличается от позывного станции)КорреспондентQTH оператораИмена операторовОпциональная конфигурация в формате: param=val ...ОпцииПрочееOutИсходящий порт, когда IP адрес использованПерегрузPSK/RTTY Viewer HiLite Color 1PSM АттенюаторПорог Гистограммы PSMPTT задержки действительны для всех типов CAT/PTTPTT включается дополнительным источником звукаЗадержка PTT после окончания передачи (мсек)PTT является командой CAT (не аппаратное обеспечение)PTT тон на правом аудио каналеPTT использует hamlib командыPTT через Hamlib командыPWR-meterПалитра: Параметр не действителен.ПаритетАнализировать весь входящий текстЧастичныйПередаваемый параметр не соответствует ожидаемому типу.ПарольВставитьПути (скрытые)Процент (%)НастойчивостьВыберите скорость передачи данных из спискаПилот тонСоотношение пилот тона к сигналуВоспроизводить историю при выборе каналаВоспроизведениеВоспроизводить непрерывно?Устройство воспроизведенияВоспроизведение:Установите Ваш позывной.Интервал повтора (msec)Информация после 2 секунды курсора на позываномПортПорт:АудиопортЗадержка после записи (msec)Контроль мощности сигналаШкала мощностиДетектировать вступлениеНажмите если надо изменить адрес/портВернуться для продолжения поискаПечать CW / RTTY / THROB / CONTESTIA строчнымиПрог 1:Прог 2:Прог 3:Сохранить измененную конфигурациюСохранить журналЗапрос на сохранение лога при выходеЗаписать измененные макросыПровинцияСработанные провинцииPseudo-FSK - правый каналPseudo-FSK на правом каналеФорма импульсаДлительность импульса (мс)PwrQRZQRZ cdromQRZ.comQSKQSK на правом каналеQSLДата получения QSLПолученные QSL в эту датуАдрес QSL бюроДата отправки QSLОтправленные QSL в эту датуQSL через..QSL-полученоQSL-отправленоQSO ДатаQSO Date OffQSO Date OnQSYQTC:QTHQTH NicknameQthТихоТихий режим [-q], не открывать tqsl диалогRSID receptionRST всегда 599/59RST полученныйRST переданныйRST(r)RTS +12RTS +12 vRTS = +VRTS это PTT сигнальная линияRTS это РТТ линияУправление потоком RTS / CTSRTTYRTTY в USB режимеRX - расстройкаRx захват текстаRX ppmRX коррекция звуковой картыРадио частотаПриподнятый косинус фактор формы импульсаДиапазон +/- wpmДиапазон 1 ...3Диапазон 1 ...4Удалить запись для "%s"?ПринятьИспользование приемаШирина приемного фильтраПринимать синхронизаторПрием flmsg файловpskreporter.infoЗапись обоих каналовЗаписиПрямоугольностьОбновить время записи в KML-файл (в секундах)ПерезагрузПерезагрузить cty.datУдалитьУдалить позывной после...Воспроизведение аудиотрекаВ рапорт ARQ среднее значение S/NВ рапорт фактическая частота передачиЧастота в рапорт (только при настроенном RIG контроле)pskreporterСбросСбросить все параметры на значения по умолчанию? Параметры вступят в силу при следующем запуске Файлы: fldigi _def.xml и fldigi.prefs будут удалены! СбросПо умолчаниюВосстановление настройки последовательного (COM) портаСохранить частоту блокировки TX (LK) при переключении RSID на частоте RXПовторыИзвлечьИзвлечь для использования модемаИнтервал повтора (мс)РеверсРеверсировать правый/левый каналыРеверс видеоРедактировать экспортируемый LoTW adif файлПроверить lotw.adif файл прежде, чем послать с tqslФайл управления трансивером:Rig установкиRig требует управления потоками RTS/CTSRig требует управления потоками Xon/XoffRig использует связку RTS/CTSRig/Log КонтрольRig:RigCAT использовать для управления трансиверомВправо/Влево Выбрать наименьшее используемое числоПраво/лево = 1 x LSD Вверх/вниз= 10 x LSD Shift - Право/лево = 100 x LSD Shift - Верх/низ = 1000 x LSDПринятый RSTПереданный RSTВыполнить программуЗапустить программу:Rx / Tx ПанелиRx AGCRx Высота в пикселяхRx ПараметрыRx WPMМножитель ширины RxRx фонRx шрифтНабор символов (Для Кириллицы 1251)S-meterS/N and IMD behaviorSELSKIPSOM декодированиеSQL-1SQL-2SYNOP в ADIFSYNOP в KMLЧастота дискретизацииСохранитьСохр...Сохранить конфигСохранить как..Сохранить изменения?Сохранить конфигурацию?Сохранить измененные макросы?Сохранить журнал?Сохранить журналЗаписать файл макросаСохранить палитруСохранить текст какСохранить палитруСохранитьЦвет шкалыФайл скриптаПуть к устройству скрипта не найден.Файл сценария содержит потенциальные проблемы Обратитесь к документацииИмя файла (путь) недействительноПрокруткаВыпадающие подсказкиИскать этот позывнойПоиск по сетиДиапазон поиска (Гц)Дополнительный текстсекундыРазделВыбратьВыбрать # стоп битыВыбрать всёВыберите Контест и поля CabrilloВыбор полей для экспортаВыберите состояние PTTВыбрать запись для экпортаВыбрать Rx/Tx набор символовВыберите растровый шрифт ТХВыбрать тэгВыбрать фильтрВыбрать скорость передачи данныхВыбрать сдвиг несущейВыберите устройствоОпределите как колесо мыши ведет себя внутри водопадаВыбрать линиюВыбор режима для доступа к менюВыбрать номер тонаВыбрать паритетВыберите номера контактовВыберите файлВыберите тип FFT фильтраВыберите для Elecraft К3 Другие радиостанции в этом не нуждаются.Выбрать шрифт водопадаВыбор цвета фона Rx Tx панелейОтправитьCW короткие 0 и 9Отправить Позывной в CW в конце каждой передачиОтправить зарегистрированые QSO в LoTWОтправлять непрерывный поток тестовых символовОтправить в этом WPMОтправлять маяк каждый ...Отправлять непрерывноОтправить поток данных непосредственно на выполнение flmsgПередать изображениеОтправить изображение...Послать lotw.adif через tqslОтправить отчет о приеме при регистрации QSOОтправить отчет только тогда, когда QSO регистрируетсяПередать rx текст в файл: textout.txtОтправленные и полученные факсы записатья в ADIF.Символы в области Rx / TxПринятый номерПереданный номерПринятый сер. номерПереданный сер. номерSet>0, если используется импульсный PTTУстановки шумодаваУстановить уровень для лучшего просмотраУстановите количество символов в строкеУстановите тип дискретизатора для коррекции смещенияУстанавить пороговый уровень для значения х выше уровня шумаФормы TxКороткое вступлениеКраткое описание антенныПоказатьПоказать объекты DXCCПоказать таймер TXПоказать окно предупрежденияПоказать все модыПоказать и включить кнопку питания монитора (PSM)Показать полосу на водопадеПоказать каналыКурсор в центре линииПоказать меньше режимовПоказывать коды управления макросамиПоказать макро редакторПоказать больше или меньше водопадаПоказать иконки в менюПоказать пароль в виде простого текстаПоказать подсказкиПоказать передаваемый сигнал на водопадеБоковая полоса:Браузер сигналаБраузер сигналовДиапазон сигнала (dB)Поиск сигналаРазмер:Пропущенные символы в панели Tx (Tx on/off для CW)Повернуть дисплей выше по частотеПовернуть дисплей ниже по частотеРегулятор цвета фона шумоподавителя сигналаМедленный процессор (менее 700 МГц)Медленная скорость паденияДекодировать програмные битыДекодировать програмные символыПрограммно реверсировать правый/левый каналыИзменения, сделанные с помощью сценария требуют программу Изменения будут активны после перезагрузкиСортировать по Date/Time OFFЗвуковойСпец. символыСкорость (WPM):Споттинг отключенПодавлениеУровень шумодаваОткрыть шумодав (сек)СтартДата началаДата начала экспортаСтарт flampСтарт fllogСтарт flnetСтарт flrigЗадержка PTT перед началом передачи (мсек)Старт prog1Старт prog2Старт prog3Стартовый номерШтатШтат должен совпадатьПозывной корреспондентаПозывной станции:Локатор корреспондентаЛокатор станцииЛокатор станцииQTH корреспондентаПозывнойStation heard twiceСетка станцийСтоп ДатаСтоп битыСтопбитыЗапомнить моду и частоту Правый клик для просмотраПредставить каждое QSO, как зарегистрированоеУкажите пароль для каждой закачкиПредставить закачку adif файла в LoTWСубскрипт выполнен неудачноСоздание солнечных пятен!Переключиться на ARQ I/OСистемный цветСистемныйT/RTCP/IPTCP/IP Поток данныхTX - расстройкаВыходная мощностьTX генерацияTX смещениеTX ppmTX коррекция звуковой картыЦветИсточники данныхТестТестовый символТестовые символы для регулировки QSKТест текстового файлаTest...Захват текстаЦвет текстаТекст ПодсвечиванияТекстовый файл для вставкиТекст для отправки во время простоя клавиатурыТекст...Скорость CW по умолчаниюИмя файла записывается в текстовой области RXПоле не должно быть пустым.Регулярное выражение должно быть допустимым.Тестовая строка не соответствует этому событию в шаблоне поиска.Эти теги могут также использоваться в Выражение этого события является недействительным.ВремяВремя (сек)Time OFFTime ONВремя концаВремя началаВремя окончания QSOВремя начала QSOВремя между повторами в мсНужное времяТайм-аутВремя контроля дублейСинхронизироватьК кому подключаемсяПереключениеПереключение DTR для PTTПереключение RTS для PTTПродолжительность тона (secs)ТоныОтслеживать скорость CW в WPMОтслеживаниеПеревод прямо на flmsgСкорость передачи, X1-нормальноПередатьЗадержка передачи данныхВыходная мощностьИспользование передачиПозывнойПередаваемый шрифтПередавать строчные Передать нижний начальный тонПередаваемый режим IDРежимы передачиПереодическая передача (.) в режиме ожиданияИспользовать усилительПередаваемый сигналПередаваемый текстПередать верхний начальный тонПередача/ПриемТреугольностьДве строки схема 1Две строки схема 10Две строки схема 2Две строки схема 3Две строки схема 4Две строки схема 5Две строки схема 6Две строки схема 7Две строки схема 8Две строки схема 9Tx ПараметрыTx выше RxTx фонTx шрифтУровень аттенюатора Tx (dB)TxIDUUDP/IPИнтерфейсЯзык интерфейсаВид интерфейсаСработанные штатыАмериканские единицы расстояния (QRB)Не удается создать файл %s (Ошибка No=%d) func %s:%dне открылся файл %sОткл если KML не используетсяНеизвестная ошибкаНазадНеожиданный конец файла достигнут.Конец параметра (аргумент []) список найденНеожиданный конец параметра контрольного списка найденОбновитьОбновить выбранные локальные файлы данных из репозиторияСайт обновлений не доступенОбновить текущую записьВышеВерхний пределВерхний уровень сигналаИспользовать "cr cr lf" для "cr lf"Использовать CD жесткий диксИспользовать DSP фильтр до декодераВкл. DTRСинхронизация FarnsworthИспользовать HamlibИспользовать маркер частотыИспользовать OSS audio serverОткрыть для выбора файлаИспользовать порт Audio serverИспользовать Pulse Audio serverВкл. RTSИспользовать RigCATИспользовать усреднения для уменьшения шума водопадаВкл. цветные кнопкиЗаписывать в лог date/time offНачать с нулейИспользовать параллельный порт PTTИспользовать отдельный порт PTTИспользовать маленький шрифтИспользовать алгоритм Витерби для лучшей коррекции ошибок Лучше всего работает с декодированием поддерживаемых символов.Использовать это расположение tqsl станцииИспользовать uHRouter PTTИспользовать для PSKmail и набора программ FLDIGIИспользовать для BPQ32User IDИмяВкл UDP портVSP ВключитьПериод выборки сигнала в миллисекундахПодробноСравнитьСравнить базу данных с файлом загрузки LoTWСравнить базу данных с файлом загрузки eQSLВерсия %s доступна на Source ForgeВидео вступление IDВидПоказ/Скрыть 48 макросовПоказ/Скрыть КаналыВиртуальный Эмулятор Последовательного порта - отключает ПРЕДУПРЕЖДЕНИЯВидимые режимыПосетить веб-сайт HamcallПосетить QRZ.comПосетить веб-сайт hamQTHВНИМАНИЕ - будут перезаписаны все настройкиУвеличение водопадаУправление переключателямиИсторияНесущаяСкорость паденияМодуляцияУровень передачиДождитесь ответа на первую команду CATДождитесь ответа на последующие командыИнтервал ожидания (мс) перед чтением ответаВниманиеВодопадВодопад / FFT / ScopeСкорость падения водопадаВысота водопада в пикселяхЧастота дискретизации записиWebПоиск в WebДействие колесаГде сохраняются документы, сформированные в формате KML.ШиреРазделители словПеренос словаЗаписать текущий набор макросов при выходе из программыЗадержка записи (ms)Задержка начала (msec)XMITXMLФиксация частотыуправление потоком XON/XOFFYДаВы используете последнюю версиюУ вас должен быть установлена и настроена программа tqsl (http://www.arrl.org/tqsl-download)Вам нужно оплатить услуги доступа к сервису HamcallВам нужно оплатить услуги доступа к сервису QRZВведите ваш логинВаш логин парольВаш пароль/логин tqslaaпослеВсегда добавлять в файл(ы)Автоматическая закачка данныхВ принятом тексте инфо о позывномсимволыочищать данныеКонвертировать позывной в строчныеКонвертировать позывные в строчныйПапка с даннымитекущие условия WXУмолчаниеПо умолчанию date/time onОтображать PSM в главном диалогеПоказывать в Rx окне ASCII символыeQSL пользовательУправления макросами мышьюflamp:fllogfllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrigflrig является предпочтительным методом управления трансиверомПараметры flrig xmlrpc сервера Эти параметры отобразятся во вкладке конфигурацииflrig:Например 1) UUEE 2) 161500Z 3) 07008MPS 4) 9999 5) DRSN 6) SKC 7) M17/M23 8) Q1028 9) NOSIG 10) RMK 11)Свободная форма обменаie: /home/dave/CALLBK/ or C:/CALLBK/ Не заполняйте, чтобы искать базу данныхв:км / часФикс. водопад на 1500 ГцмбарминутыСила пилот-тона (dB)Показывать ^! исполняемые коды в Rx панелиrcos timing coefficient: 1.0 ... 2.0 W1HKJ советует 1.275 Ставьте 1.5 и морочте голову.отчетотчет по Цельсиюотчет по Фаренгейтудюймов отчет о ртутном столбеОтчет километров в часотчет миль в часотчет миллибар отчетысекундшрифт браузеравыбрать по датеОтправить в лог (макросы , )tqsl:Частота трекаТолько водопад{NAME} имя корреспондентаfldigi-4.2.05/po/boldquot.sed0000664000175000017500000000033114532252172012727 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g fldigi-4.2.05/po/en@quot.header0000664000175000017500000000226414611711171013172 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # https://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # fldigi-4.2.05/po/es.gmo0000664000175000017500000026045414611714004011525 00000000000000&yg[g`gug*gggg gghhhhhh!h'h hVh ii i*i!Difihi!miiiiiiiii j!j)8j5bj,j-j)jk2k%Kk"qkkk&kkll".lQlol&tllllll+l m#m"7m+Zmm m mm mmn"n3nBn/Tnnn!nnn"o2oFo#ao!oooo"o p+4p`ppp p'pppqq=q([qq qq q"q'r0r5r Jr,kr#r$r&rss4sHsZsnsss wsss ssss sssstt$t&>tet&tttttCt 8uEu&\u u uu,uu#uv$v7v$=vbvhvDzv vvv*vw/,w\w2rwwwww,x1xFxKx)Sx)}x)x1x y yy#y 4y >y HySydyxyyyy yy y yy)y$z,z0z9z@zEz HzTzdzz zzz zz zz { {4{S{8\{{{{{ {#{+|A|J| a|o|w|&| ||| | } +}(9}b}w}+} }}7} ~ ~$~9~'K~s~W~/~'(Pg~5 0 3H Zh nye׀= Q\ d q  *ׁ݁/ 8BWs  ǂ;߂19S+Z/̓ ݃  &=MR b p|Ȅ ڄ. #(19HYms,˅CV* ˆ# 8X"a#$ԇ.&Έs,   &2/F8v0݊!0*M x 1 ‹̋ , 6=Ff   njӌ 9%72]2*+!,M z%7PER -"ԏ"""="`'-ِ    &3Mk p } ё:ۑ1H LZx : 307K\)t ͓ۓ $;`$uĔ ɔԔ ܔb!P/r#ƕ  )41,f Ӗ5;?CH_hmӗؗ) @Kg !Ƙ91ET,m 6 ߙ  ,><X@ۚ0 O]aj*rI09R.q0ќ 2$"5:E Ǟߞ 4Li ȟ7JRaiMΠ 25O Ua ѡܡ *4 HSls 3/6; @L\m s'#ģ" +BVi&ɤΤҤ 'ASxYҥ إ !!J6( ;Ӧ1AE ISZj~ Ƨ+ CPbr/z èѨ/,"O T_~&ĩ#ީ # : DNUmv|.Ӫܪ /0`e ku ū#ث0-5=Ebuά! "& *4<@ [i ƭέ׭ *-1 5BGKQUdmv} Ԯٮ  v- կ #8Q fp u3߰;1mu*{<Ml&}@83lpx $%dz" !/"Qt(^ٴ 8E N Zgv}õ ȵյ۵  " Ͷض /A Q ^k}  ķӷ + 6Wo ĸո 7 HTq  <ҹ*+V0n+˺ܺ (#0!T0vǻ ϻ ۻ $%3J ~м"߼  1N_q !ʽ 17F X4f* 4%Zv.ۿ9 + 6CHZ bp    -3DX m w-   % >H]d| !  "''OW+l/%B:1/l+  6DSbi # 5C]n}0 0;N$S x !1SX [ gq8 0Ec " &)1[o+n$I- :I Q[ lw0 !7HZ c o z &'- !+CXs )%A Q'["51(Zj~"# )'3[biq=GY]ouG}4EMUi+x s%N t*"7 5 MXhqx *Q7 &0(<AFaf#QOQL49#]x%2 !33+g*7$1)[zm%;<VG5)-W r~+!F3z') $> c1A' 731k'" 7)@*j236#8.\?7*/3G9{//?Uq (5RW [go&; !.> m!U$56N (7'.F^+f)J[o4/%I9 !-U St{444B c"w0/7g0 $#=#a    I" l=w&,*15\2+.#Z'~ 5?2rF $77$oa2%)%O u7 @REf" **Iat /CV2o $( # -8*M%x  GB\b ;4(7Wgn v   3Ee,z  !'*Fq PVQ"Z$}3" &#-J x%%' I'q:3L6T  :A+m4$(< S5^ ' 2& .+8 d  & &  ".C>r!5, 6'P/x/0E OiXQ :- +h + . + + *G Hr         , *J u { !   /   > @[   $    Q k o  # #78[ "%11W)   *t7'99!Hjo u4-,4< D&Pw$!&9=S+o #B&a'Z?]q<L-(<%e%@ )#MR?j  )>-N6A5x@*8&:adk< )D ` mw    &%+L"x' +;DZ4$9B3S# " &) *P  {         !7!1S!!!! !!!!!*! !"/B"(r"&""""#!#R3##### ####$ $$/$H$~O$$$$+$*#%EN%%%%@%2%R&\g&&&&&&& ''<'C' L',Z''$'''' ((3(C(+L(x((((:((()5)<) B);M);):)***/*Z*u**** *****5+ ;+!F+h++++]+,%, -,7,W,j,m,},,*,b,C-K-S-$[--"-- -#-.&.D. T._.c.g.n.v. z...... / / !/ -/ 7/D/HT/// ////// //// / 0 0050N0&S0z0 00,00 g1*u1 1/1112292 S2^2 c2o221222292)(3KR33 3/334-44559D5~5 5=55I5I6N6-W6 6.6.6"670#7*T7+7%77%7.7h,8 8888 8888+8#959R9V9[9p9v9 |9 999 999:):+::7;'<;d;;;; ;; ;;;<<+<C<T< ]<h<<<;< <" =#.= R=s==.=$==D>X>0k>>>->'>6#?4Z?7?{?/C@(s@@@ @@1@7A'LA&tA(AAAA A A1A5-B,cB9BBBBCC8C2PCC2C'CCDD;DUDrD+DDD4D EE3E@GEEE<E.E.FHHFFF"F#F@ GJGohG GGGGH#H;HRHUH \H!iH H H H H+HHH II.I5IRIpI I II4I%IJJ!J%JBJ KJ VJaJ,hJJJJJJJ&JKK 5K?KPK*`KKSKKL1#L4UL'LALAL06M2gMM M M MM MMMMN.N >NLN[NxNNNNN$N N%N O *O6OLO^O}O O)OOOOP9PELP PPP,PPPQQ%Q5QEQUQeQuQQQQQ QQQQ R*!RLR UR4`RRRR RR S/!S*QS|SS SSS3ST T9T AT3LTTT.T7TU"4UWUuUUp/VV6V4V!W2WDWVW jWwWWWWW.WWX'XBX]XtXXXXXX!Y8*Y;cY2Y YYY!Z%Z:ZQZkZZZ,ZZ/Z [%&[ L[Z[:k[[[ [[[[*[>(\:g\\\\\&\'\!])]9]9X]&]]>]^^^^.^5^<^DC^&^^^T^4_8_ K_U_T]____ _ `5`Q`g`p`!y``C``` aEP`Xl=?*W{hw)0.2v[5H\eQ0!$R ,K[RnkK=OET[4Y ,.DxpxncZ<b2B &+-/t^\x^~c7>C=vR ?O +W"F2 NM5,y-:c?dY3"eY_I''L A6wqF j@2m5$!}ws #E:\AIUx ;J4K;>YLPK.m&MOuHCs\4:v#L/T~   8r9o|j@.kGCSX<zoNp 9aZ(m5S_zj8vW#NmeM ^D6a7}bL*\]rq3-n;?%a "tgg>UAV#dxrG uwNgyjf$VJV|o]p{fh6Sy!_ HtIis!^ {dc0o%G*wmb%ID`s0i;6ffTkr8Bt9&D24qa|Z)UJg> Llpq|A[TVhh 1iT<BoW:*A{nZ-*3s3}"(E%aRCE&r^Q'Q/`@ BB}H0ef$RJ@`GOz"8 V`O}~cl[gKCznd,t lJ-)&=  ?3vM11HNb~uG(Pizj:%ZQ(dS 7YF)>]9SU)y1/@PD9_($l]/Fb ik{uMh|77+' W.~I+_6kPF!yXp,'8;+ue1U5Q#=<<X 4q]X {CALL} other ops call sign {MODE} full mode / submode in # Records in logbook# retries before giving up# times to resend command before giving up%s log started on %s%s: Do not exist, create?&About&Configure&File&Help&Logbook&OK&UI&View**.exe... These controls are on other tabs. They are replicated here for convenience. You may change the state from either location. ...0 = T; 9 = N1000 Hz tone when PTT enabled Can be used in lieu of or in addition to other PTT types14070.15025 W500 Hz limit8-bit extended characters8-bit extended characters (UTF-8): AFC on,off,toggle my antenna operating band other call clear log fields clear RX pane clear TX pane contest counter modem timing test, spec' file modem timing test, 'n' random 5 char groups modem timing test, string 's' modem char/sec test on nn chars Analysis CSV on,off,toggle CW identifier decrement counter [Wait][Len](ms) log eQSL optional msg log eQSL insert text file valid xcvr filter width rig freq has kbd focus my frequency text to NAME/QTH move to freq NNNN Hz return to sweet spot idle signal for NN.nn sec increment counter S/N etc. IMD etc. saveQSO data, append msg to notes log at xmt time other locator LOCK on,off,toggle saveQSO data, append msg to notes save QSO data change macro defs file map by value map on google mode my call my locator my name my RST other name Transmit |NN| successive RsID bursts next QSO rec # pause transmit CW QSK post-timing CW QSK pre-timing insert QRG into Rx text # QSO recs QSO time (HHMM)) incr/decr xcvr freq qsy to kHz, Hz right-clk QSY button left-clk QSY button other QTH repeat macro continuously Rev on,off,toggle send CAT cmd valid xcvr mode CW rise time other RST receive Rx RSID on,off,toggle save current macro file save contest out search DOWN for signal search UP for signal Digitalk On, Off, Toggle repeat every NN sec tune signal for NN sec toggle T/R transmit set xmt attenuator Tx RSID on,off,toggle Fldigi version WAV file; spec' file WAV file; 'n' random 5 char groups WAV file; string 's' WAV file; internal string get weather data for station get weather data exchange begin exchange end exchange in exchange outADIFAFCAFC behaviorAFC range (Hz)AFC range or BWAFC speedAFC tracking speedALTRARQAX25 DecodeAbortAcquisition S/N (dB)Acquisition search range (Hz)ActionAddAdd CRLF after page width charactersAdd RsID signal to end of transmissionAdd address to notes fieldAdd geopolitical name of METAR stationAdjust cursor frequencyAdjust the DSP bandwidthAdvanced configuration:AllAll settings shown here can be changed later via the Configure menuAllow errorsAllow/Disallow ChangesAlternate character color in Rx panelrAlways LSBAlways USBAlways show audio frequenciesAlways start new modems at these frequenciesAntenna:Appearance of label on each channelAppend to RX text:Append to TX text:ApplyArrow Key Control of Frequency EntryAudioAudio device infoAudio device information is only available for the PortAudio backendAudio fileAudio frequencyAudio input deviceAudio or RF frequencies on waterfall scaleAudio output deviceAudio stream history decoded on selected signalAuto CRLF line lengthAuto connect when fldigi opens (server must be up)Auto-fill Country and AzimuthAutoCRLFAutomatic Frequency ControlAutomatic Rx speed trackingAutomatically spot callsigns in decoded textAvailable substringsBackBackgndBackground color for Function key group 1Background color for Function key group 2Background color for Function key group 3Background color of signal viewer squelch controlBad frequencyBad modem idBandBands must matchBandwidthBaud rateBaud rate:Beginners' GuideBehavior of s/n imdBg ColorBits per characterBrowseBug me about saving log entriesBuild infoButtonButton HeightC&ountriesCAT command for PTTCPU usage increases with waterfall heightCQ zoneCQZCR-CR-LFCSV...CTRLCWCW ID modesCW Postamble IDCW QSK signal on right channelCW dsp filter bandwidthCW is LSBCW transmit WPMCWI detection and suppressionCWI thresholdCabrillo SetupCabrillo...CallCall SearchCall sign workedCallook.info lookup (free service US callsigns only)CallsignCan be used in lieu of or in addition to other PTT typesCancelCaptureCapture and playback devicesCapture deviceCapture rx text to external fileCapture signals over this thresholdCapture signals within this frequency rangeCapture:Carrier frequency (Hz)Carrier shiftCelsiusCenter display on signalCenter in passband Right click to undoCenter lineChange # of psk viewer channelsChange ONLY to experimentChange application look and feelChange colorChange dir...Change positions of low to high channelsChange to Macro fileChange waterfall scaleChanges take effect on next program startupChannel labelChannel numberChannels, first channel starts at waterfall lower limitChars/Row:Check AllCheck for duplicatesCheck for updatesCheck for updates when starting programCheck for updates...Check this to be notified when an RSID is received without changing modem and frequencyCheck to reduce CPU load in PSK and RTTY modes.Checking for updates...Choose directory to store KML documentsCity of station workedCleanup KML data now !Cleanup on startupCleanups KML documents, empties Google Earth display.ClearClear AllClear channel text after # seconds of inactivityClear list?Clear log entries after saving or using macro Clear log fields?Clear on saveCloseClose ListColorColor of Mark TrackColors and cursorsCommand line optionsCommand run on KML creationCommand started when KML files are generated. Subprocesses are started once, and restarted if needed.Commands are echoedConditionsConfirmConfirm QuitConfirm RESETConfirm exitConfirm quit?Connect to serverConnect/disconnect to Talker socket serverCont'ContestContest exchange receivedContest exchange sentContest serial # receivedContest:ContinentContinuous scrollingControl chars in Rx/Tx paneConvert callsign to upper caseConverterCopyCorrectionsCould not make directory Could not open url: %s Could not run a web browser: %s Open this URL manually: %sCould not start flmsgCountryCountry of station workedCountyCreate 1000 Hz square wave on right channelCreate cabrillo reportCreate keyed square wave on right audio channelCreate sunspotsCustom shiftCustom text searchCustom...CutDTR +12DTR +12 vDTR = +VDTR is PTT signal lineDTR is ptt lineDXCCDXCC designatorDXCC entitiesDXCC entityDash to dot ratioData base lookupData files repositoryData files sourcesData files updateData files...Data retention time, in hours (0 for no limit)Data sourceDateDate OffDate OnDate QSO EndedDate QSO startedDate time ON == OFFDebugDecode (CWI suppression)Decode AX25 Packets into human readable formDecode DTMF tonesDecode received DTMF tonesDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log fileDecodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: Google Earth)DefaultDefault CW tracking pointDefault RTTY tracking pointDefault WPMDefault for all other modemsDefault listen / transmit frequencyDefault messageDefault test string is: "Default to cross hair digiscopeDefaultsDelay NN msec before releasing PTTDelay NN msec before starting audioDeleteDelete local data files if selected.Delete the current recordDeselectDetect the THOR preamble Clear the Rx pipelineDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: NBEMS.files\WRAP\recv\extract-20090127-092515.wrapDetect the occurance of [WRAP:beg] and [WRAP:end] Save tags and all enclosed text to date-time stamped file, ie: ~/.nbems/WRAP/recv/extract-20090127-092515.wrapDetected signal levelDetector high thresholdDetector low thresholdDevice:Difference between Rx & Tx freq (rig offset)Digit ColorDigitsDimDirectory...Disable alert dialogDisable allDisable freq changeDisable further detection when RSID is receivedDisable spotting when signal browser(s) are not visible.Disables detectorDisplay RX in reverse videoDo not automatically change to RX RsID frequencyDo not show RsID alert dialog boxDo not use callsign databaseDo not use callsign lookup via web browserDocked scopeDon't saveDragging on the waterfall scale changes frequencyDup ColorDuplicate check, CALL plusDuplicatesEdge shapeEdge timingEmpties KML documents when starting program.EnableEnable -Enable / disable icons on menusEnable / disable tooltipsEnable ARQEnable Busy ChannelEnable CSMAEnable DSP prior to decoderEnable KISSEnable MultiPSK-compatible FECEnable allEnable check box to show each respective operator controlEnable drag cursor on waterfall scaleEnable for single click capure of text in Rx panelEnable for very weak signalsEnable if you're computer does not decode properlyEnable rx text streamEnable this entry when fldigi first startsEnable this for Latin-1 accented charactersEnable this for UTF-8 character transmissionEnable this for UTF-8 charactersEnable to put Tx panel above Rx panelEnable when both programs are using the same IP addressEnabledEnabled - log QSO using Mark frequency Disabled - log QSO using center frequencyEnabled - use Mark/Space filter outputs Disabled - use pseudo signalsEnd of xmt IDEnter full path-filename for external programEnter full path-filename for flampEnter full path-filename for fllogEnter full path-filename for flmsgEnter full path-filename for flnetEnter full path-filename for flrigEnter full path-name for cty.dat folderEnter test string or leave blank for default:Enter time span in minutesErrorEvenEven linesEventEvent logExchange InExchange OutExecutable file to insertExecute command on KML files.ExitExit promptsExport SetupExport to ADIF fileExport to CSV fileExport to fixed field text fileExport...Extract files for use with external "wrap / flmsg" programExtract times out after NN seconds of inactivity.FECFFT averagingFFT prefilter window functionFLMSG files...FahrenheitFax images destination directoryFeel free to skip any pages or exit the wizard at any timeFile I/O onlyFill in Country / Azimuth using cty.dat informationFilterFilter Shape FactorFilter bandwidthFilter bandwidth factorFilter bandwidth relative to signal widthFilteringFind country:Find nextFind prefix:Find previousFind: FinishFixed IntervalsFldigi config...Fldigi configurationFldigi configuration wizardFldigi macro definition file *.{mdf}Fldigi palette *.palFldigi rig xml definition file *.xmlFldigi web site...Floating scopeFoldersFontFont colorFont...Font/ColorFont:Force a specific sample rate. Select "Native" if "Auto" does not work well with your audio device.Force callsign field to UPPERCASEForce channel spacing to even 100 Hz incrementsForce date/time ON == date/time OFFFree service courtesy of OKFreqFreq.FrequencyFrequency in MHzFrequency scaleFullFull reportGeneralGenerate 1000 Hz square wave signal on right channelGenerate square wave signal on right channelGroup 1Group 2Group 3Hamcall.netHamlib used for rig controlHeight of macro barHiLite 1HiLite 2HideHide window after (s):HighHigh frequency limit in HzHost:I/OIDsIOTAIP Address Port NumberITU zoneITUZIgnore duplicatesInInactivity timeoutInclude the transmit frequencyInclusive stop date for exportInfoInit delay (ms)Initial state of DTRInitial state of RTSInitial voltage on DTRInitial voltage on RTSInitializeInitialize RigCAT interfaceInitialize hamlib interfaceInitialize the H/W PTT interfaceInitialize the QSO logging fieldsInitialize the socket clientInput carrier shiftInsert RX text marker before changing frequency and modemInsert default textInsert file...Insert full METAR reportInsert leading zeros into Xmtd serial numberInsert markerInsert special text in Rx panel when waterfall clickedInsert textInsert text on single left clickIntegration period (FEC blocks)Interesting notesInterleave SYNOP and textInterleave text with decoded SYNOP messages, or replacement.Islands on the airK3 A1A configuationKISSKML balloon display styleKML balloon in plain text, or HTML, in plain tables or matrices.KML files directoryKML refresh interval (seconds)KML root fileLOCLast QSOLatencyLeading and Trailing edge risetimes (msec)Leave this blank or refer to http://www.pulseaudio.org/wiki/ServerStringsLeft and right channels both contain modem audioLeft click to clear text Right click to reset frequenciesLeft click to select dup colorLeft click: change mode Right click: configureLeft or right click always replays audio historyLicense GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Limit AFC movement to this rangeLimit to a few characters, as in CQEM or IOTA etc.Listen for signals within this rangeLkLoadLoad a new paletteLoad image fileLoad or drop an image file Supported types: PNG, JPEG, BMPLoad...LocLocateLocate binaryLocate cty.dat fileLocate executableLocate flamp executableLocate fllog executableLocate flmsgLocate flmsg executableLocate flnet executableLocate flrig executableLocate program #1 executableLocate program #2 executableLocate program #3 executableLocatorLockLock transmit frequencyLog Navtex messages to Adif fileLog Navtex messages to KMLLog RTTY frequencyLog Wefax messages to Adif fileLog all RX/TX textLogbookLogbook DialogLoggingLogging Panel ControlsLogs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)Long receive integrationLook up callLotW userLowLow = zero errors Medium = 1 error High = 2 errorsLow frequency limit in HzLowerLower limitLowest freq on bottom of viewerMETAR station ID codeMETAR station locationMFSK image fileMacro Button LabelMacro TextMacro editor - MacrosMaidenhead locator as in EM64qvMail Server AttributesMark onlyMark prev freq/modeMark-SpaceMatched Filter bandwidthMediumMerge ADIF fileMerge...Meter ColorMiles / HourMinimal controlsMinimum distance for splitting alias nodes (Meters)Minimum distance for splitting aliases (Meters)Minimum time between eventsMiscModeMode in useMode must matchMode width limitModemModem carrierModem signal on left and right channelsMonitor transmitted signalMouse wheel active on macro buttonsMsec's between sequential commandsMulti-Channel Signal ProcessingMulti-channel detectorMy callsign de CALLMy transmit CW WPMNBEMS data file interfaceNBEMS files...NO AUDIO DEVICE AVAILABLE (or testing)NO CALLSIGN SETNameNewNew record / Save recordNextNoNo faster than thisNo slower than thisNoneNormalNormal drop speed / valueNot worked beforeNotchNote: These configuration items are useful for but not unique to using fldigi on a touch screen device such as a tablet.NotesNotificationsNotify onlyNumber and position of macro barsNumber of digits in serial numberNumber of hours data is kept for each node. Zero means keeping everything.OOKONON - Marquee style OFF - Clear & restartON - small font OFF - large fontON - start at default OFF - keep current wf cursor positionON - use last set of macros OFF - use default setOSSOddOdd linesOn/OffOne above Rx/TxOne above waterfallOne below waterfallOnline documentation...Op &ModeOpen ...Open ListOpen file with default browserOpen in browserOpen logbook fileOpen macro fileOpen message folderOpen message with flmsgOpen paletteOpen rig xml fileOpen with flmsgOpen...Opens NBEMS file folder upon successful captureOperatorOperator workedOperators QTHOperators nameOptional configuration in format: param=val ...OptionsOtherOutOutput port number when same IP address usedOverPSK et al.PSK/RTTY Viewer HiLite Color 1PSK/RTTY Viewer HiLite Color 2PTT delays valid for all CAT/PTT typesPTT end of transmit delayPTT is a CAT command (not hardware)PTT tone on right audio channel PTT via Hamlib commandPWR-meterPalette: ParityParse all incoming textPasswordPastePaths (hidden)Pick baud rate from listPlay back history when active channel selectedPlaybackPlayback continuous loop?Playback devicePlayback:Please set your callsign first.Popup info after a 2 second hover on a callsignPortPort:PortAudioPost-keydown timing (ms)Power scalePrPre-Signal TonePre-keydown timing (ms)Preamble DetectionPress return to continue the searchPrint CW / RTTY / THROB / CONTESTIA in lowercaseProg 1:Prog 2:Prog 3:Prompt to save ConfigurationPrompt to save logPrompt to save log on exitPrompt to save macro fileProvinceProvince of station workedPseudo-FSK - right channelPseudo-FSK on right audio channelPulse shapePulseAudioPwrQRZQRZ cdromQRZ.comQSKQSK on right audio channelQSL rcvd dateQSL received on this dateQSL route of contacted stationQSL sent dateQSL sent on this dateQSL-VIAQSL-rcvdQSL-sentQSO DateQSO Date OffQSO Date OnQSO must not occur within a time period ofQSYQTHQTH NicknameQTH:QthQuietRE:RSID receptionRST rcvdRST sentRST(r)RTS +12RTS +12 vRTS = +VRTS is PTT signal lineRTS is ptt lineRTS/CTS flow controlRTTYRTTY Scope DisplayRX - unshift on spaceRX captureRX ppmRX sound card correctionRX text QSO data entry is bounded by the non-word characters defined here. Tab and newline are automatically included.Radio frequencyRaised cosine pulse shape factorRange +/- wpmReally delete record for "%s"?ReceiveReceive filter bandwidthReceive synchronizerReception of flmsg filesReception reports...ReconnectRecsRectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Refresh time interval written in KML file (Seconds)ReloadReload cty.datRemoveReplay trackline audioReport ARQ frames average S/NReport rig frequency (enable only if you have rig control!)ReportsResetReset FEC blocks when changing BW or TonesReset all options to their default values? Reset options will take effect at the next start Files: fldigi_def.xml and fldigi.prefs will be deleted! Reset to CarrierRestore cty.dat default folderRestore defaultsRestore the serial (COM) port settingsRetain TX lock frequency (Lk) when changing to RX RsID frequencyRetain tx freq lockRetriesRetrieve for active modem useRetry interval (ms)Returns IP Address and port number to the default value.RevReverseReverse Left/Right channelsReverse videoRevert to Unsifted char's on a spaceRevert to unshifted char's on a spaceRig description file:Rig modeRig or interface echos serial dataRig requires RTS/CTS flow controlRig requires Xon/Xoff flow controlRig uses RTS/CTS handshakeRig:RigCAT used for rig controlRight/Left Select Least Signficant DigitRight/Left = 1 x LSD Up/Dn= 10 x LSD Shift - Right/Left = 100 x LSD Shift - Up/Dn = 1000 x LSDRst receivedRst sentRun programRun program:Rx / Tx PanelsRx WPMRx bkgndRx fontRx/Tx Character setS-meterS/N and IMD behaviorSELSKIPSOM decodingSQL-1SQL-2SYNOP to ADIFSYNOP to KMLSample rateSaveSave ...Save ConfigSave all received text, one character at a time to the following file: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Save as...Save changed Logbook?Save changed configuration?Save changed macros?Save log entry?Save logbook fileSave macro fileSave paletteSave text asSave this paletteSave...Scale ColorScopeScrollScroll hintsSearch for this callsignSearch on webSearch range (Hz)Secondary TextSecondsSelectSelect # bits / charSelect # stop bitsSelect AllSelect Cabrillo Contest & FieldsSelect Fields to ExportSelect Records to ExportSelect Rx/Tx Character SetSelect TX raster fontSelect TagSelect bandwidthSelect carrier baudrateSelect carrier shiftSelect deviceSelect how the mouse wheel behaves inside the waterfallSelect lineSelect modes for menu accessSelect number of tonesSelect paritySelect rig descriptor fileSelect the type of FFT prefilterSelect this for Elecraft K3 Other radios should not need it.Select waterfall scale fontSelection background color in Rx Tx panelsSelf Organizing MappingSend Callsign in CW at end of every transmissionSend a continuous stream of test charactersSend at this WPMSend continuouslySend imageSend image...Send reception report when logging a QSOSend report only when QSO is loggedSend rx text to file: textout.txtSent and received faxes are logged to Adif file.Sent chars in Rx/Tx paneSer inSer outSerial # inSerial # outServer string:Set Viewer SquelchSet level for good viewingSet the number of characters per rowSet the type of resampler used of offset correctionShaped TxShort description of antennaShowShow DXCC entitiesShow alert window:Show all modesShow bandwidth tracks on waterfallShow channelsShow cursor with bandwidth linesShow cursor with center lineShow fewer modesShow macro editorShow me more or less waterfallShow menu iconsShow password in plain textShow tooltipsShow transmit signal on waterfallSideband:Signal BrowserSignal averaging over time 0 - least 4 - greatestSignal browserSignal range (dB)Signal searchSingle macro bar below logging panel variable heightSingle-click to captureSize:Skipped chars in Tx pane (Tx on/off in CW)Slew display higher in frequencySlew display lower in frequencySlider hilite color of signal viewer squelch controlSlow CPU (less than 700MHz)Slow drop rateSoft-bit decodingSoft-symbol decodingSoftware reversal of left-right audio channelsSort by Date/Time OFFSort by date/time OFF - effects all ADIF/Cabrillo reportsSpace onlySpeed (WPM):SpotSpotting disabledSquelchSquelch levelSquelch open (sec)StStartStart DateStart date for exportStart flampStart fllogStart flnetStart flrigStart of transmit PTT delayStart prog1Start prog2Start prog3Starting numberStateState must matchStation heard twiceStations grid squareStop DateStop bitsStopbitsStore mode and frequency Right click for listSunspot creation underway!Sys ColorsSystemT/RTX - unshift on spaceTX PowerTX generateTX offsetTX ppmTX sound card correctionTab ColorTabular data sourcesTalkerTalker Socket (MS only)TestTest charTest character for QSK adjustmentTest commandTest text fileTest...Text CaptureText HighlightingText Tags (tags use {} delimiters)Text file to insertText to send during keyboard idle timesText...The default CW speedThe filename is written to the RX text areaThe regular expression field must not be empty.The regular expression must be valid.The string is replaced with the current modem and frequencyThe test string did not match this event's search pattern.These tags can also be used in This event's regular expression is invalid.TimeTime (s):Time OFFTime ONTime OffTime OnTime QSO endedTime QSO startedTime between retires in msecTime needed: Time span overTimeout (secs)TimingTo whom the connection is madeToggleToggle DTR for PTTToggle RTS for PTTTone Duration (secs)TonesTracked CW speed in WPMTrackingTransfer speed, X1-normalTransmitTransmit PowerTransmit callsignTransmit fontTransmit lower start toneTransmit mode IDTransmit modesTransmit periods (.) when idleTransmit power usedTransmit signalTransmit upper start toneTransmit video textTransmit/ReceiveTransmits a diddle dot when no keyboard activityTriangularTrigger limit (s):TuneTune margin (tone frequency spacing)Two scheme 1Two scheme 10Two scheme 2Two scheme 3Two scheme 4Two scheme 5Two scheme 6Two scheme 7Two scheme 8Two scheme 9Tx above RxTx bkgndTx fontTx level attenuator (dB)Tx power used for logbook entriesTxIDUIUI languageUI schemeUS state of station workedUndoUpdateUpdate selected local data files with repository contentUpdate the current recordUpperUpper limitUpper signal level (dB)Use "cr cr lf" for "cr lf"Use '(' paren not KNUse CD or hard drive CD imageUse DSP filter before decoderUse DTRUse Farnsworth timingUse HamlibUse MARK freq'Use OSS audio serverUse Open to select descriptor fileUse Port Audio serverUse Pulse Audio serverUse RTSUse RigCATUse averaging to decrease waterfall noiseUse colored buttonsUse cross hair scopeUse date/time off for log entryUse for triggering amplifier carrier detectUse leading zerosUse parallel port PTTUse separate serial port PTTUse small fontUse soft-bit viterbi decoding for better Forward Error Correction Works best with soft-symbol decoding enabledUse soft-decision decoding for symbol detection Assists soft-bit decodingUse uHRouter PTTUse wave shaping on Tx signalUsed For PSKMail and FLDIGI Suite of ProgramsUsed for BPQ32User IDUser nameUsing UDP port #VSP EnableVerboseVideo ID modesVideo Preamble IDViewView/Hide ChannelsVirtual Serial Port Emulator - suppress WARNINGSVisible modesVisit Hamcall web siteVisit QRZ web siteVisit hamQTH web siteWF MagnificationWF Shift ControlsWF StoreWF amp spanWF carrierWF drop rateWF modeWF ref levelWait for response to first CAT commandWait for response to subsequent commandWait interval (msecs) before reading responseWarningWaterfallWaterfall / FFT / ScopeWaterfall drop speedWaterfall height in pixelsWaterfall video IDWaterfall video textWav write sample rateWebWeb Browser lookupWheel actionWhen no signal presentWhere generated KML documents are stored.WideWill occur after this time in secondsWord delimitersWord wrapWrite current macro set on program exitWrite delay (ms)XMITXMT lockXON/XOFF flow controlXY - classic scopeYesYou are running the latest versionYou need a paid Hamcall online subscription to accessYou need a paid QRZ online subscription to accessYour login nameYour login passwordaaafterautomatic data uploadcallsign tooltips in received textcharscty.dat foldercurrent wx conditionsdefault text to send with etcdefault uses date/time oneQSL userenable mouse wheel control of macro barflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:for example KMDQ for Huntsville-Madison Executive Airport, ALfree form 1 must matchfree form exchangeh/w ptt device-pinie: /home/dave/CALLBK/ or C:/CALLBK/ Leave blank to search for databasein:kilometers / hourmbarsminutesrcos timing coefficient: 1.0 ... 2.0 W1HKJ best 1.275 DO2SMF best 1.500reportreport Celsiusreport Fahrenheitreport inches mercuryreport kilometers per hourreport miles per hourreport millibarsreportssecondsselect browser fontselect by datesend when logged (log button, , )track colorwaterfall-only mode{NAME} other ops nameProject-Id-Version: fldigi 3.22.02 Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com PO-Revision-Date: 2014-11-18 22:43-0500 Last-Translator: Pavel Milanes Costa Language-Team: Spanish (Pavel Milanes Costa) Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.5.4 {CALL} indicativo del otro operador {MODE} modo completo / submodo en Número de entradas en el libro de guardia# de reintentos antes de rendirnos# de veces para reenvío de comandos antes de rendirnos%s log iniciado a %s%s: No existe, ¿crear?&Acerca de&Configuración&ArchivoA&yuda&Libro de guardia&OKI&U&Vista**.exe... Estos controles están en otras pestañas. Solo se duplican aquí por conveniencia. Puedes cambiar su estado en cualquier lugar. ...0 = T; 9 = NTono de audio de 1Khz cuando hay PTT activo Para ser usado en otras formas de PTT14070.15025 WLímite de 500 HzCaracteres extendidos de 8bitsCaracteres extendidos de 8bits (UTF-8): AFC encendido, apagado, alternado mi antena banda de operación indicativo del otro limpiar los campos del log limpiar el panel de RX limpiar el panel de TX contador de concurso archivo de especificación de la prueba de sincronización del módem prueba sincronización de módem , 'n' grupos de 5 caracteres al azar prueba de sincronización de módem, cadena de caracteres 's' prueba módem car/sec en nn caracteres Análisis CSV encendido,apagado, alternado identificador de CW decrementar el contador [Wait][Len](ms) logear un mensaje opcional en eQSL.cc Salvar directo en eQSL.cc insertar archivo de texto ancho del filtro válido para el trx frec radio tiene el teclado en foco mi frecuencia texto a NOMBRE/QTH moverte a la frecuencia NNNN retornar a la frecuencia inicial en la cascada esperar NN.nn segundos por la señal incrementar el contador S/N etc. IMD etc. Guardar los datos del QSO, añadiendo msg a las notas del log, cuando se muestra en el buffer de TX guardar al tiempo que transmite localizador del otro bloqueo (LOCK) encendido, apagado, alternado guardar los datos del QSO, añadiendo msg a las notas del log guardar datos del QSO cambiar el archivo de definición de macros mapearlo por su valor mapearlo en google modo mi indicativo mi localizador mi nombre mi RST nombre del otro Transmitir |NN| ráfagas de RsID próximo QSO a guardar # pausar la transmisión (Pasar a RX sin limpiar el panel de TX) CW QSK al final CW QSK al inicio Insertar QRG en el panel de RX # QSO guardados Hora del QSO (HHMM) incr/decr frece xcvr qsy a kHz, Hz clic-derecho QSY a la frecuencia anterior clic-izquierdo QSY a la frecuencia preferida de este modo QTH del otro repetir la macro continuamente Reverso activado, desactivado, alternado enviar comando CAT modo válido para el trx tiempo de subida de CW RST del otro recibir Rx RSID encendido, apagado, alternado guardar el archivo de macro actual guardar intercambio de concurso buscar ABAJO en la cascada por una señal buscar ARRIBA en la cascada por una señal Digitalk Encendido, apagado, alternado repetir cada NN segundos sintonizar la señal por NN segundos alternar Tx/Rx transmitir poner el atenuador de TX del equipo a este valor Tx RSID encendido, apagado, alternado version de Fldigi archivo WAV; archivo de especificación archivo WAV; 'n' grupos de 5 caracteres al azar archivo WAV; cadena de texto 's' archivo WAV; cadena de texto interna obtener datos de clima para una estación específica obtener datos de clima comienzo del intercambio fin del intercambio intercambio entrante intercambio enviadoADIFAFCComportamiento AFCRango AFC (Hz)Rango AFC o Ancho de bandaVel. del AFCVelocidad de rastreo del AFCALTRARQDecod. AX25AbortarS/N (dB) de adquisiciónRango de búsqueda y adquisición (Hz)AcciónAñadirAñadir CRLF después del ancho de caracteres de la páginaEnviar RsID al finalizar cada TxAgregar dirección al campo notasPoner nombre geopolítico a la estación METARAjustar la frecuencia del cursorAjustar el ancho de banda del DSPConfiguración avanzada:TodoTodos los ajustes mostrados aquí pueden ser modificados luego en el menú ConfigurarPermitir erroresPermitir/Impedir cambiosColor alternativo de los caracteres en el panel de RxrSiempre LSBSiempre USBSiempre mostrar las frecuencias de audioSiempre iniciar los módems nuevos en estas frecuenciasAntena:Apariencia de la etiqueta de cada canalAñadir al texto de RX:Añadir al texto de TX:AplicarEntrada de frecuencia controlada por flechaAudioInformación de los dispositivos de audioLa información del dispositivo de audio está solo disponible cuando se usa PortAudio como método de comunicación con el dispositivoArchivo de audioFrecuencia de audioDispositivo de entrada de audioFrecuencias de audio o RF en la escala de la cascadaDispositivo de salida de audioHistorial de audio descodificado al seleccionarAjuste automático de línea con CRLFAuto conectar cuando fldigi se ejecute (el servidor debe estar encendido)Autocompletar el país y azimutAuto CRLFControl Automático de FrecuenciaSeguimiento automático de la velocidad de RxHacer "spot" automáticamente con los indicativos descodificados en el texto recibidoSub cadenas de texto disponiblesAtrásFondoColor de fondo para el grupo de teclas de función 1Color de fondo para el grupo de teclas de función 2Color de fondo para el grupo de teclas de función 3Color de fondo de control deslizante del silenciador del navegadorFrecuencia erróneaIdentificador incorrecto de módemBandaConcordar en bandasAncho de bandaTasa de baudiosTasa de baudios:Guía del principianteComportamiento del S/N y IMDFondoBits por caracterBuscarPregunta acerca de grabar los registros del logInformación de compilaciónBotónAltura del botón&PaísesComandos CAT para el PTTEl uso del CPU aumenta con el alto de la cascadaZona CQCQZCR-CR-LFCSV...CTRLCWModos con CW IDPost-ámbulo de ID de CWCW QSK en el canal derecho de audioAncho de banda del filtro DSP de CWCW es LSBWPM en TX de CWDetección y supresión de CWIUmbral de CWIConfiguraciones para CabrilloCabrillo...Ind.Buscar IndicativoIndicativo trabajadoBúsqueda en Callbook.info (servicio gratuito solo indicativos de EE.UU.)IndicativoPuede ser usado en vez de o en adición de otros tipos de PTTCancelarCapturaDispositivo de captura y reproducciónDispositivo de capturaCapturar el texto de Rx a un archivo externoCapturar señales por encima de este nivelCapturar señales dentro de este rango de frecuenciasCaptura:Frecuencia portadora (Hz)Salto de la portadoraGrados CelciusCentrar la señalCentrar en el pasabanda Clic derecho para deshacerLínea centralCambiar el número de canales del navegadorCambiar SOLAMENTE para experimentarCambiar la apariencia de la aplicaciónCambiar colorCambiar carpetaCambiar la posición de los canales de abajo a arribaCambiar a archivo de macroCambiar escala de la cascadaLos cambios serán efectivos en el próximo inicio del programaEtiqueta del canalNúmero del canalCanales, el primer canal comienza en el límite inferior de la cascadaCarac/Fila:Marcar todoComprobar si hay duplicadosComprobar si existen actualizacionesComprobar si hay actualizaciones al iniciar el programaComprobar si existen actualizacionesMarque aquí para ser notificado cuando un RSID es recibido sin cambiar el módem y la frecuenciaMarcar para reducir la carga al CPU en PSK y RTTY.Comprobando si hay actualizaciones...Seleccione directorio de archivos KMLCiudad de la estación trabajada¡Limpiar datos KML ahora!Limpiar al iniciarLiampiar datos KML, limpia la pantalla de Google HearthLimpiarLimpiar todoLimpiar el texto del canal después de N segundos de inactividad¿Limpiar la lista?Limpiar la entradas del log después de guardar o usar la macro ¿Limpiar los campos del registro?Limpiar al grabarCerrarCerrar listaColorColor de cursor en la MarcaColores y cursoresOpciones de línea de comandosComando a ejecutar al crear un archivo KMLComando que se ejecuta cuando se genera un archivo KML. Subprocesos se reinician si es requerido.Los comandos tienen ecoCondicionesConfirmarConfirmar SalirConfirmar RESTABLECIMIENTOConfirmar la salida¿Confirmar salir?Conectar con el servidorConectar/desconectar el socket del servidor TalkerContestiaConcursoRecibido el intercambio en concursosIntercambio enviado en Concurso# Recibido como intercambio en concursosConcurso:ContinenteMovimiento contínuoCaracteres de control en el panel de Rx/TxConvertir el indicativo a mayúsculasConvertidorCopiarCorreccionesNo se pudo crear el directorioNo se pudo abrir la URL: %s No se pudo ejecutar un navegador web: %s Abra esta URL manualmente: %sNo se puede iniciar flmsgPaísPaís de la estación trabajadaProvinciaCrear una onda cuadrada en el canal derecho de audio (1Khz)Crear un reporte CabrilloCrear una onda cuadrada en el canal derecho de audioCrear un sunspotSalto ajustadoBusqueda de texto personalizadaPersonalizar...CortarDTR +12DTR +12 vDTR = +VDTR es PTTDTR es la línea de PTTDXCCIdentificador DXCCEntidades DXCCEntidad DXCCRelación punto a rayaBúsqueda en base de datosUbicación de la fuente de datosArchivos de datosActualización de datos localesArchivos de datos...Horas de retención de datos (0 sin límite)Fuente datosFechaFecha de finFecha de inicioFecha de fin del QSOFecha de inicio del QSOFecha y hora de inicio = finDebugDetección y supresión de CWIDescodifica paquetes AX25 en forma legibleDecodificar tonos DTMFDecodificar tonos DTMF recibidosDecodificar mensajes SYNOP al log ADIF (ejemplo Servicio Meteorológico Alemán)Decodificar mensajes SYNOP al documentos KML (ejemplo Servicio Meteorológico Alemán)OmisiónPunto predefinido de rastreo de CWPunto predefinido de rastreo de RTTYWPM predeterminadoPunto predefinido de rastreo para los otros módemsFrecuencia de RX/TX predeterminadaMensaje predeterminadoLa cadena de prueba por omisión es: "Osciloscopio de hilos cruzados predeterminadoReiniciarRetrasar NN ms antes de soltar el PTTRetrasar la salida del audio en NN msBorrarEliminar datos locales si se seleccionaEliminar el registro actualDeseleccionarDetectar el preámbulo de THOR Limpiando el buffer de recepción de datoDetectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para guardar el texto contenido entre ellas a un archivo con la fecha al estilo: NBEMS.files\WRAP\recv\extract-20110205-201712.wrapDetectar la ocurrencia de las etiquetas [WRAP:beg] y [WRAP:end] para guardar el texto contenido entre ellas a un archivo con la fecha al estilo: ~/.nbems/WRAP/recv/extraxt-20110205-201712.wrapNivel de señal detectadoUmbral alto del detectorUmbral bajo del detectorPuerto:Diferencias entre frecuencias de Rx y Tx (en el radio)DígitosDígitosAtenuarDirectorio...Desactivar alertaDesactivarDesactivar cambio de frecuenciaDesactivar la detección futura cuando un RSID es recibidoActivar spotting solo cuando el navegador de señal está visibleDeshabilitar detectorMostrar Rx en video inversoNo cambiar automáticamente a la frecuencia del RsIDNo mostrar alerta de RsIDNo usar base de datos de indicativosNo busque indicativos vía navegador webOsciloscopio empotradoNo guardarAgarrar y arrastar en la cascada cambia la frecuenciaColor Dup.Chequear duplicados, Indicativo más...DuplicadosForma del bordeTiempos de bordeLimpiar los documentos KML al inicio del programa.ActivarActivar -Activar / desactivar los iconos en el menúActivar / desactivar sugerenciasActivar ARQActivar det. canal ocupadoActivar CSMAActivar el DSP antes del decodificadorActivar KISSActivar el FEC compatible con MultiPSKActivar todosMarcar para activar cada opciónActivar el arrastrado del cursor en la cascadaHabilitar para capturar el texto del panel Rx con un solo clicActivar para señales muy debilesActivar si tu computadora no decodifica correctamenteActivar el registro del texto de recepción.Activar al iniciar fldigiActivar esto para caracteres acentuadosActivar esto para caracteres acentuados (UTF-8)Activar esto para caracteres acentuados (UTF-8)Activar para poner el panel Tx sobre el panel RxHabilitar cuando ambos programas están usando la misma dirección IPActivadoActivado - Guarda QSO usando la frecuencia de la Marca Desactivado - Guarda QSO usando frecuencia centralActivado - usar filtros de salida Marca/Espacio Desactivado - usar seudo-señales ID al finalizar cada TxEntre la ruta completa del ejecutable del programa externoEntre la ruta completa del ejecutable flmsgEntre la ruta completa del ejecutable fllogEntre la ruta completa del ejecutable de flmsgEntre la ruta completa del ejecutable flnetEntre la ruta completa del ejecutable flrigEntre la ruta completa del archivo cty.datEntre la cadena de prueba, o déjela en blanco para usar la predefinida:Entre rango de tiempo en minutosErrorParLineas paresEventoRegistro de eventosIntercambio RXIntercambio TXArchivo ejecutable a insertarEjecutar un comando sobre los archivos KMLSalirAvisos de salidaConfiguración de la exportaciónExportar a archivo ADIFExportar a un archivo CSVExportar a un archivo de texto con campos fijosExportar...Extraer archivos para usar con programas externos (wrap/flmsg)Limpiar el texto del canal después de N segundos de inactividadFECPromedio de FFTFunción de ventana de prefiltro FFTArchivos FLMSG...Grados FahrenheitDestino de las imágenes de faxPuedes saltar o salir de cualquiera de estas configuraciones en cualquier momentoSolo E/S desde archivoAutocompletar la información del país y del azimut usando el archivo cty.dat (Lo tienes instalado, ¿cierto?)FiltroFactor de ancho de banda del filtroAncho de banda del filtroFactor de ancho de banda del filtroAncho de banda del filtro relativo al ancho de la señalFiltrajeBuscar país:Buscar el siguienteBuscar prefijo:Buscar el anteriorBuscar:TerminarIntervalos FijadosConfiguración de Fldigi...ConfiguraciónAsistente de configuración de fldigiArchivo de definición de macro para Fldigi *.mdfPaleta Fldigi *.palarchivo de definición de radio xml *.xmlSitio web de Fldigi...Osciloscopio flotanteCarpetasTiposColor de letraTipografíaTipografíaTipografía:Forzar una taza de muestreo específica. Seleccionar "Nativo" si "Auto" no trabaja bien con tu dispositivo de audio.Forzar el campo indicativo a MAYUSCULASForzar el espaciado de los canales a incrementos de 100HzForzar fecha/hora de inicio = fecha/hora de final del QSOServicio gratuito cortesía de OKFrecFrec.FrecuenciaFrecuencia en MHzEscala de frecuenciaCompletoReporte CompletoGeneralGenerar una onda cuadrada en el canal derecho (1Khz)Generar una onda cuadrada en el canal derechoGrupo 1Grupo 2Grupo 3Hamcall.netUtilice Hamlib para controlar el radioAltura de la barra de macroHiLite 1HiLite 2EsconderEsconder después de (s):AltoLímite superior de frecuencia en HzHost:E/SIDsIOTANúmero del puertoZona ITUITUZIgnorar duplicadosRecTiempo de inactividadIncluir la frecuencia de TxFecha de fin de la exportación (inclusiva)InfoRetardo inicialización (ms)Estado inicial de DTREstado inicial de RTSVoltaje inicial en DTRVoltaje inicial en RTSInicializarInicializar la interfaz RigCATInicializar la interfaz HamlibInicializar la interfaz de HW para PTTInicializar la cuenta del número serieInicializar el socket clienteSalto de la portadoraInsertar el marcador de texto en el panel de Rx antes de cambiar la frecuencia y el módemInsertar texto predeterminadoInsertar archivo...Insertar reporte METAR completoInsertar ceros a la izquierda en el número de serie enviadoInsertar marcadorInsertar un texto especial en el panel de Rx cuando se da clic en la cascadaInsertar textoInsertar texto en un solo clic izquierdoPeriodo de integración (bloques FEC)Notas interesantes (80 caract. máx.)Intercalar SYNOP y textoIntercalar texto con mensajes SYNOP descodificados, o reemplazosIslas en el aire (IOTA)Configuración de A1A para el Elecraft K3KISSEstilo del globo de KMLKML globo en texto plano, o HTML, en tablas simples o matrices.Directorio de archivos KMLIntervalo de refresco KML (seg)Raíz del archivo KMLLOCÚltimo QSOLatenciaTiempos de subida y bajada del pulso (ms)Deje esto en blanco en Ubuntu con una sola tarjeta de red referirse a http://www.pulseaudio.org/wiki/ServerStrings para más detallesAmbos canales de audio contienen informaciónClic izquierdo para limpiar el texto Clic derecho para restablecer frecuenciasClic izquierdo para seleccionar el color de duplicadosClic izquierdo: cambiar modo Clic derecho: configurarClic derecho o izquierdo siempre reproduce la historia del audioLicencia GPLv3+: GNU GPL versión 3 o posterior Este software es de uso libre: usted es libre de modificarlo y redistribuirlo. No hay NINGUNA GARANTÍA, excepto la permitida por la ley. Limitar el movimiento del AFC a este rangoLimitar a unos pocos caracteres Como en CQEM o IOTA etc.Escuchar señales dentro de este rangoLkCargarCargar una nueva paletaCargar archivo de imagenCargar o descargar una imagen desde archivo (PNG, JPEG, BMP)Cargar...LocBuscarBuscar binarioBuscar el archivo cty.datBuscar ejecutableBuscar el ejecutable flampBuscar el ejecutable fllogBuscar flmsgBuscar...Buscar el ejecutable flnetBuscar el ejecutable flrigBuscar el ejecutable programa #1Buscar el ejecutable programa #2Buscar el ejecutable programa #3CuadrículaBloquearBloquear la frecuencia de transmisiónRegistrar mensajes de Navtex a archivo ADIFRegistrar mensajes de Navtex a KMLRegistrar frecuencia RTTYRegistrar mensajes Wefax a archivo ADIFGuardar todo el texto de TX/RXLibro de guardiaDiálogo del libro de guardiaRegistro de QSOPaneles de control de registroGuardar mensajes a archivos KML (Google Earth, Marble, Gaia, etc...)Larga integración en RxBuscar indicativoUsuario de LotWBajoLow = cero errores Medium = 1 error High = 2 erroresLímite inferior de frecuencia en HzInferiorlímite inferiorFrecuencia más baja en la parte inferior del visorCódigo de la estación METARLocalización de la estación METARArchivo de imagen MFSKEtiqueta del botón de macroTexto del macroEditor de macros - MacrosCuadrícula Maindenhead como en FL11ajAtributos del servidor de correo (PSKMAIL)Marca solaMarcar frec./modo previoMarca-EspacioAncho de banda del filtroMedioMezclar archivo ADIFMezclar ADIF...MedidorMillas / HoraControles mínimosDistancia mínima para nodos alias segmentados (metros)Distancia mínima para alias segmentados (metros)Tiempo mínimo entre eventosMisc.ModoModo en usoConcordar en modoLímite del ModoMódemPortadora del modoAudio del módem en ambos canales de audioMonitorear la señal transmitidaRueda del ratón activa en los botones de macroMilisegundos entre comandos secuencialesProcesamiento de la señal multi-canalDetector multicanalMi indicativo de INDICATIVOMi velocidad CW (WPM)Interface de datos NBEMSArchivos NBEMS...Seleccionar cuando no haya dispositivo de audio disponible o para realizar pruebasNO SE HA DEFINIDO UN INDICATIVONombreNuevoRegistro nuevo / ActualizarSiguienteNoNo más rápido queNo más lento queNingunoNormalTasa de caída normal / valorNo trabajado previamenteMuescaNota: Estos elementos de configuración son útiles para usar fldigi en un dispositivo con pantalla táctil, como una tableta.NotasNotificacionesNotificar solamenteCantidad y posición de las barras de macroNúmero de dígitos en el número de serieHoras de conservación para cada nodo, Cero significa conservar todo.SOKActivoActivado - Estilo marquesina Desactivado - Limpiar y re-comenzarOn - Tipografía pequeña OFF - Tipografía grandeON - Iniciar en la predeterminada OFF - Mantener la posición actual en la cascadaActivado - Usar el último conjunto de macros Desactivado - Usar el conjunto pre-establecidoOSSImparLíneas imparesOn/OffUna sobre Rx/TxUna sobre la cascadaUna bajo la cascadaDocumentación en internet...&ModosAbrir...Lista abiertaAbrir archivo en el navegador predeterminadoAbrir en el navegadorAbrir un archivo de libro de guardiaAbrir archivo de macroAbrir carpeta de mensajesAbrir mensaje con flmsgAbrir paletaAbrir archivo xml de radioAbrir con flmsgAbrir...Abrir la carpeta de NBEMS cuando capture okOperadorOperador trabajadoQTH del operadorNombre del operadorConfiguración opcional en el formato: parámetro=valor...OpcionesOtroEnvPuerto de salida cuando se usa la misma dirección IPMuchoPSK et al.Color 1 para el resaltado de HiLite en el visor de PSK/RTTYColor 2 para el resaltado de HiLite en el visor de PSK/RTTYRetrasos de PTT válidos para todos los tipos de PTT y CATRetraso de fin de PTTEl PTT es un comando CATTono para PTT en el canal derecho de audioPTT como comando de HamlibMedidor de potenciaPaleta:ParidadProcesar todo el texto entranteContraseñaPegarRutas (Oculto)Seleccionar la tasa de baudios de la listaReproducir el historial cuando se selecciona un canalReproducir¿Reproducir en un lazo continuo?Dispositivo de reproducciónReproducción:Por favor especifica tu indicativo primero.Mostrar información de un indicativo después de estar dos segundos con el ratón sobre estePuertoPuerto:PortAudioTiempos posteriores al PTT (ms)Escala de potenciaPrTono pre-señalTiempos anteriores al PTT (ms)Detección de preámbuloPresione enter para continuar la búsquedaImprimir CW / RTTY / THROB / CONTESTIA en minúsculas (Estos modos solo reconocen las mayúsculas)Prog 1:Prog 2:Prog 3:Confirmar para grabar configuraciónConfirmar para grabar logConfirmar si graba el log al salirConfirmar para grabar macroProvinciaProvincia de la estación trabajadaAFSK en canal derechoSeudo-FSK en el canal derecho de audioForma del pulsoPulseAudioPotQRZQRZ CDQRZ.comQSKQSK en el canal derecho de audioFecha de RX QSLQSL recibidas en esta fechaQSL route de la estaciónFecha de TX QSLQSL enviadas en esta fechaQSL-VIAQSL-recibidaQSL-enviadaFecha QSOFecha de finFecha de inicioEl QSO no debe ocurrir dentro del período especificado a continuación.QSYQTHApodo del QTHQTH:QthCalmadoRE:Recepción con RSIDRST recib.RST env.RST(r)RTS +12RTS +12 vRTS = +VRTS es PTTRTS es la línea de PTTControl de flujo RTS/CTSRTTYConfiguración de Osciloscopio en RTTYNo saltar en el espacio RXCapturar RXRX ppmCorrección de RX en el dispositivo de audioLas entradas de texto de Rx están delimitadas por los caracteres definidos aquí, el tabulador, el espacio y la nueva línea están ya incluidosFrecuencia RFFactor de forma pulsada al coseno elevado Rango +/- wpm¿Está seguro de borrar el registro para "%s"?RecibirAncho de banda del filtro de RxSincronizador de RxRecepción de archivo en flmsgReportes de recepción...ReconectarEnt.RectangularReed-Solomon ID (Rx)Reed-Solomon ID (Tx)Intervalo de refresco de escritura para KML (seg)RecargarRecargar cty.datEliminarReproducir el audio del buffer ante un clic en la cascadaReportar el promedio de S/N de tramas ARQReportar la frecuencia del radio (activar solo si tienes control del radio)ReportesReiniciarReiniciar FEC al cambiar ancho de banda o tonos¿Restablecer todas las opciones a su valores predefinidos? Los efectos de esta acción no se observarán hasta el próximo inicio del programa Se eliminaran los siguientes archivos: fldigi_def.xml and fldigi.prefs Ajustar a la portadoraRestablecer carpeta de cty.dat predeterminadaPredeterminadosRestablecer la configuración del puerto serial (COM)Mantener Tx en la frecuencia al cambiar a RX para RsID.Mantenerse en frecuenciaReintentosSintonizar el módem actual a estos datos (Frecuencia y Modo)Intervalo entre reintento (ms)Establece la dirección IP y el número del puerto al valor por omisión.Inv.InvertirInvertir canales de audio derecho e izquierdoVideo inversoRevertir el salto en espacio de los caracteresRevertir el salto en espacio de los caracteresArchivo de descripción del radio:Modo del RadioEl radio o la interfaz repite los datos enviadosEl radio requiere control de flujo RTS/CTSEl radio requiere control de flujo Xon/XoffEl radio usa RTS/CTS para comunicarseRad.:Usar RigCAT para el control del radioDer/Izq Seleccione Dígito Menos SignificativoDer/Izq = 1 x DMS Arriba/Abajo= 10 x DMS Mayús - Der/Izq = 100 x DMS Mayús - Arriba/Abajo = 1000 x LSDRST recibidoRST env.Ejecutar programaEjecutar programa:Panel Rx / TxRX WPMRx fondoTexto RxSeleccionar el conjunto de caracteres Rx/TxMedidor de señalComportamiento del S/N y IMDSELSKIPDescodificación MAOSQL-1SQL-2SYNOP a ADIFSYNOP a KMLTasa de muestreoGuardarGuardar...Guardar configuraciónGuardar todo el texto recibido, un carácter cada vez al siguiente archivo: fldigi.files\talk\textout.txt (Windows) ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)Guardar como...¿Guardar el libro de guardia modificado?¿Guardar los cambios en la configuración?¿Guardar macros modificadas?¿Guardar los datos del contacto actual en el registro?Guardar el archivo del libro de guardiaGuardar el archivo de macrosGuardar paletaGuardar texto comoGuardar esta paletaGuardar...EscalaOsciloscopioDesplazamientoSugerencias de desplazamientoBuscar este indicativoBuscar en la webRango de búsqueda (Hz)Texto secundarioSegundosSeleccionaSelecciona el # bits / caracterSeleccionar # de bits de paradaTodosSelecciona los campos de concurso para el registro CabrilloSeleccione los campos a exportarSeleccione las entradas a exportarSeleccionar la tipografía de Rx/TxSeleccionar la tipografía de TxSelecciona la etiquetaSelecciona el ancho de bandaSeleccionar la tasa de baudios de la portadoraSeleccionar el salto de la portadoraSeleccionar dispositivoSelecciona como la rueda del ratón se comporta dentro de la cascadaSeleccionar líneaSeleccionar los modos para acceso desde el menúSeleccionar número de tonosSeleccionar paridadSeleccionar archivo de descripción del radioSeleccionar el tipo de prefiltro de FFTSolo para el Elecraft K3 Otros radios no lo necesitan.Selecciona la escala de la tipografía de la cascadaFondo de color de la selección en los paneles de Rx/TxMapas Auto Organizados (Self Organizing Mapping) Es un algoritmo de inteligencia artificial que mejora la descodificación.Enviar tu indicativo en CW al finalizar cada TxEnviar flujo de los caracteres de pruebaEnviar a este WPMEnviar continuamenteEnviar imagenEnviar imagen...Enviar reporte cuando se llenan los datos del QSOEnviar reporte solo cuando se guardan los datos del QSOEnviar texto rx al archivo: textout.txtRegistrar los fax enviados y recibidosCaracteres enviados en el panel de Rx/TxSer recSer envSerie recibidaSerie enviadaServidor:Establecer el nivel de silenciado (SQL) del visorEstablecer el nivel para una visualización aceptableEstablecer el número de caracteres por filaEstablecer el tipo de re-muestreo usado para correccionesDar forma al TxDescripción corta de la antenaMostrarMostrar las entidades DXCCMostrar ventana de alerta:Mostrar todos los modosMostrar las pistas de ancho de banda en la cascadaMostrar canalesMostar el cursos con las líneas de ancho de bandaMostrar el cursor con la línea centralMostrar menos modosMostrar el editor de macrosMostrar más o menos cascadaMostrar íconos del menúMostrar clave en texto planoMostrar sugerenciasMostrar la señal transmitida en la cascadaBanda lateral:Navegador de señalSeñal promedio en el tiempo 0 - mínima 4 - máximaNavegador de señalRango de señal (dB)Búsqueda de señalUna barra de macros debajo del panel de registro altura variableClic sencillo para capturarTamaño:Caracteres ignorados en el panel de TX (Tx enc./apag. en CW)Correr la cascada hacia frecuencias más altasCorrer la cascada hacia frecuencias más bajasColor resaltado del deslizante del control del silenciador del navegadorCPU lenta (Menos de 700Mhz)Tasa de caída lentaUsar decodificación suave de bitsDescodificación suave de símbolosInvertir por software los canales de audio (derecho e izquierdo)Ordenar por fecha/hora de finOrdenar por fecha y hora de terminación del QSO Afecta a todos los libros de guardia con formato Cabrillo/ADIFEspacio soloVelocidad (WPM):SpotSpotting deshabilitadoSilenciado (SQL)Nivel de silencio (SQL)Silenciado abierto (s)EsInicioFecha inicioFecha de inicio para exportaciónIniciar flampIniciar fllogIniciar flnetIniciar flrigRetraso de PTT en el inicio de transmisiónIniciar prog 1Iniciar prog 2Iniciar prog 3Número de inicioEstadoConcordar en estado (EE.UU.)Estación escuchada dos vecesCuadrícula de la estaciónFecha de finBits de pardaBits de paradaAlmacenar modo y frecuencia Clic derecho para listar¡Creación de un sunspot en proceso!SistemaSistemaT/RTX - no saltar en el espacioPotenciaGenerar TXDif. en TxTX ppmCorrección de TX en el dispositivo de audioColorFuente de datosTalkerTalker Socket (Solo MS)ProbarLetra de pruebaProbar el carácter para ajuste de QSKComando de pruebaArchivo de texto de pruebaProbar...Captura de TextoTexto ResaltadoEtiquetas de texto (use el delimitador {})Archivo de texto a insertarTexto a enviar durante los períodos de no actividad del teclado (canal secundario)Texto...La velocidad predefinida en CWEl nombre de archivo es escrito en el panel de RxEl campo de expresión regular no debe estar vacío.La expresión regular debe ser válida.La cadena es remplazada con el modo actual y la frecuenciaLa cadena de prueba no concuerda con el patrón para este evento.Etiquetas para usar en el macro La expresión regular de este evento es inválida.HoraTiempo (s):Hora fin.Hora com.Hora finHora inicioHora de fin del QSOHora de inicio del QSOTiempo entre reintentos (ms)Tiempo necesario:Rango de tiempoTimeout (seg)TemporizaciónA quien se hace la conexiónAlternarActivar DTR para PTTActivar RTS para PTTDuración del tono (s)TonosVelocidad de seguimiento en CW (WPM)SeguimientoVelocidad de transferencia, X1-normalTransmitirPotencia TXTransmitir indicativoTipografía de TxTransmitir tono de inicio bajoTransmitir el ID del modoModos de TXTransmitir puntos (...) cuando holgazaneePotencia de transmisión usadaSeñal transmitidaTransmitir tono de inicio altoTransmitir el vídeo textoTransmitir/RecibirTransmitir puntos continuos (.......) cuando no halla que transmitirTriangularTiempo límite (s):Sint.Margen de sintonía (espaciado de los tonos)Dos (Esquema 1)Dos (Esquema 10)Dos (Esquema 2)Dos (Esquema 3)Dos (Esquema 4)Dos (Esquema 5)Dos (Esquema 6)Dos (Esquema 1)Dos (Esquema 8)Dos (Esquema 9)Intercambia paneles Tx/RxTx fondoTexto Txatenuación de nivel de TX (dB)Potencia de TX a poner en el logTxIDIUIdioma de la IUEsquema de la InterfazEstado de EE.UU. de la estación trabajadaDeshacerActualizarActualizar los datos locales con el contenido onlineActualizar el registro actualSuperiorLímite superiorNivel superior de la señal (dB)Usar "cr cr lf" para "cr lf"Usar '(' en vez de KNUsar el CD o una imagen del CD en el disco duroUsar el filtro DSP antes del decodificadorUse DTRUsar tiempos FarnsworthUsar HamlibUsar frec. MARCAUsar servidor de audio OSSUse Abrir para seleccionar un descriptor de archivoUsar servidor PortAudioUsar servidor PulseAudioUse RTSUse RigCATUsar promedio para disminuir el ruido en la cascadaUsa botones coloreadosUsar osc. de hilos cruzadosGuardar la fecha/hora de fin del QSO en el logUsado para disparar amplificadores que detectan carrierUsar ceros a la izquierdaUtilice un PTT por puerto paraleloPTT por puerto serie separadoUsar tipografía pequeñaUsar descodificación blanda de bit viterbi para mejorar la corrección FEC. Funciona mejor si está activada la opción "Descodificación blanda de símbolos"Usar descodificación blanda de símbolos para la detección también asiste en la descodificación de cada bit.Utilice PTT uHRouterUsar técnica de formación de onda en la señal de TxUsado para PSKMail y el conjunto de programas FLDIGIUsado para BPQ32Nombre de usuarioNombre de usuarioUsando puerto UDP #VSP ActivadoMás explícitoModos de Video IDPreámbulo de Video IDVistaVer/Ocultar CanalesEmulador serie virtual - Suprimir ADVERTENCIASModos visiblesVisita el sitio web de HamCallVisita el sitio web de QRZVisita el sitio web hamQTHAmpliado de la cascadaControles superiores de cascadaAlmacenar frecuenciaAmplitud de la cascadaPortadora de la cascadaVel. de caída de la cascadaModo de la cascadaNivel de referencia de la cascadaTiempo de espera para la respuesta al primer comando CATTiempo de espera para la respuesta del comando subsiguienteIntervalo de espera (ms) antes de leer la espuestaAdvertenciaCascadaCascada / FFT / OsciloscopioVelocidad de caída de la cascadaAltura de la cascadaVideo ID en la cascadaVideo texto en la cascadaTasa de muestreo de wavWebBúsqueda con navegador webAcción de la rueda del ratón en la cascadaCuando no halla señal presenteDonde se almacenan los documentos KML generadosAnchoOcurrirá después de este tiempo (s)DelimitadoresAjuste de líneaGraba el conjunto de macros actuales al cerrar el programaRet. escritura (ms)XMITBloqueo en TxControl de flujo Xon/XoffXY - Osc. clásicoSiEstá utilizando la versión más recienteSe requiere de una subscripción pagada para acceder a HamcallSe requiere de una subscripción pagada para acceder a QRZSu nombre de usuarioSu contraseñaaadespuésEnvío automático de datos a internetMostrar información de los indicativoscaract.archivo cty.datCondiciones actuales del climatexto predeterminado para enviar con una entrada de Predeterminado usa fecha/hora activadoUsuario de eQSLActivar la rueda del ratón como control de la barra de macrosflamp:fllog:flmsg *flmsg.exe *.exeflmsg:flnet:flrig:Por ejemplo KMDQ para el Huntsville-Madison Executive Airport, de ALConcordar en el número de intercambioIntercambio predefinidoPin del dispositivo PTTejemplo: /home/co7wt/CALLBK o C:/CALLBK Dejar en blanco para buscar la base de datosen:kilómetros / horamilibaresminutosCoeficiente tiempo de rcos: 1.0 ... 2.0 W1HKJ recomienda 1.275 DO2SMF recomienda 1.5reportereportar en grados Celsiusreportar en grados Fahrenheitreportar en pulgadas de mercurioreportar en kilómetros por horareportar en millas por horaReportar en milibaresreportessegundosSelecciona la letra del navegadorSelecc. por fechaEnviar QSO al guardar un contacto (botón de guardar, , )ColorModo de solo cascada{NAME} nombre del otro operadorfldigi-4.2.05/po/pl.po0000664000175000017500000107607114611714003011365 00000000000000# Copyright (C) 2008 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.23.14\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2024-04-23 06:14-0500\n" "PO-Revision-Date: 2022-08-29 18:08+0200\n" "Last-Translator: Roman Bagiński \n" "Language-Team: Polish (Roman Bagiński) \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: iso-8859-1\n" "X-Generator: Poedit 2.2\n" #: src/main.cxx:1052 #, c-format msgid "%s log started on %s" msgstr "%s log rozpoczęto %s" #: src/main.cxx:1779 msgid "Bad modem id" msgstr "Zły id modemu" #: src/main.cxx:1786 msgid "Bad frequency" msgstr "Zla częstotliwosc" #: src/main.cxx:1909 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "Licencja GPLv3: GNU GPL wersja 3 lub nowsza\n" "To jest wolne oprogramowanie: możesz dowolnie modyfikować i rozpowszechniać " "it.\n" "Nie ma ZADNEJ GWARANCJI, w zakresie dozwolonym przez prawo.\n" #: src/main.cxx:2136 src/main.cxx:2178 src/main.cxx:2202 src/main.cxx:2216 msgid "Could not make directory " msgstr "Nie udało się zrobic katalogu " #: src/debug/debug.cxx:88 msgid "Quiet" msgstr "Cichy" #: src/debug/debug.cxx:88 msgid "Error" msgstr "Blad" #: src/debug/debug.cxx:88 msgid "Warning" msgstr "Uwaga" #: src/debug/debug.cxx:88 msgid "Info" msgstr "Info" #: src/debug/debug.cxx:88 msgid "Verbose" msgstr "Rozwlekły" #: src/debug/debug.cxx:88 src/dialogs/confdialog.cxx:15244 msgid "Debug" msgstr "Debug" #: src/dialogs/fl_digi.cxx:202 msgid "Log all RX/TX text" msgstr "Log tekstowy wszystkich RX/TX" #: src/dialogs/fl_digi.cxx:204 src/dialogs/fl_digi.cxx:7622 msgid "Op &Mode" msgstr "Emisja" #: src/dialogs/fl_digi.cxx:205 msgid "Show fewer modes" msgstr "Pokaz mniej emisji" #: src/dialogs/fl_digi.cxx:206 msgid "Show all modes" msgstr "Pokaz wszystkie emisje" #: src/dialogs/fl_digi.cxx:210 msgid "&View" msgstr "Widok" #: src/dialogs/fl_digi.cxx:211 msgid "MFSK Image" msgstr "Obraz MFSK" #: src/dialogs/fl_digi.cxx:212 msgid "THOR Raw Image" msgstr "THOR obraz Raw" #: src/dialogs/fl_digi.cxx:213 msgid "IFKP Raw Image" msgstr "IFKP Raw Obraz" #: src/dialogs/fl_digi.cxx:214 msgid "Weather Fax Image TX" msgstr "Obraz nadanego faksu pogody" #: src/dialogs/fl_digi.cxx:215 src/dialogs/confdialog.cxx:10746 #: src/logbook/lgbook.cxx:1293 msgid "Contest" msgstr "Zawody" #: src/dialogs/fl_digi.cxx:216 msgid "C&ountries" msgstr "Kraje" #: src/dialogs/fl_digi.cxx:217 msgid "&UI" msgstr "&UI" #: src/dialogs/fl_digi.cxx:218 msgid "Full" msgstr "Wszystko" #: src/dialogs/fl_digi.cxx:219 msgid "Partial" msgstr "Częsciowy" #: src/dialogs/fl_digi.cxx:220 src/waterfall/waterfall.cxx:2595 #: src/dialogs/confdialog.cxx:9908 src/dialogs/confdialog.cxx:9997 #: src/dialogs/confdialog.cxx:19028 msgid "None" msgstr "Brak" #: src/dialogs/fl_digi.cxx:221 msgid "Docked scope" msgstr "Dokuj oscyloskop" #: src/dialogs/fl_digi.cxx:222 msgid "Minimal controls" msgstr "Minimalne kontrole" #: src/dialogs/fl_digi.cxx:223 msgid "Show channels" msgstr "Pokaz kanały" #: src/dialogs/fl_digi.cxx:225 msgid "Connect to server" msgstr "Polacz z serwerem" #: src/dialogs/fl_digi.cxx:1050 src/dialogs/fl_digi.cxx:1079 #: src/dialogs/fl_digi.cxx:1089 src/dialogs/fl_digi.cxx:5976 #: src/dialogs/fl_digi.cxx:6069 src/dialogs/fl_digi.cxx:6146 #: src/dialogs/fl_digi.cxx:7650 src/dialogs/fl_digi.cxx:7719 #: src/dialogs/fl_digi.cxx:7796 msgid "Custom..." msgstr "Wybrane..." #: src/dialogs/fl_digi.cxx:1147 src/dialogs/confdialog.cxx:369 #: src/dialogs/confdialog.cxx:10673 src/dialogs/confdialog.cxx:10739 msgid "Colors-Fonts" msgstr "Kolory-Czcionki" #: src/dialogs/fl_digi.cxx:1148 src/dialogs/confdialog.cxx:370 #: src/dialogs/confdialog.cxx:11067 msgid "Contests" msgstr "Zawody" #: src/dialogs/fl_digi.cxx:1149 src/dialogs/confdialog.cxx:371 #: src/dialogs/confdialog.cxx:11338 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:1150 src/dialogs/confdialog.cxx:372 #: src/dialogs/confdialog.cxx:11810 src/dialogs/confdialog.cxx:11896 #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14240 msgid "Logging" msgstr "Logowanie" #: src/dialogs/fl_digi.cxx:1151 msgid "Modem/CW" msgstr "Modem/CW" #: src/dialogs/fl_digi.cxx:1152 msgid "Modem/TTY" msgstr "Modem/TTY" #: src/dialogs/fl_digi.cxx:1153 src/waterfall/waterfall.cxx:2597 #: src/dialogs/confdialog.cxx:373 msgid "Modem" msgstr "Modem" #: src/dialogs/fl_digi.cxx:1154 src/dialogs/confdialog.cxx:374 #: src/dialogs/confdialog.cxx:17169 msgid "Misc" msgstr "Rózne" #: src/dialogs/fl_digi.cxx:1155 src/dialogs/confdialog.cxx:375 #: src/dialogs/confdialog.cxx:18303 src/dialogs/confdialog.cxx:18366 msgid "Rig Control" msgstr "Sterowanie Rig" #: src/dialogs/fl_digi.cxx:1156 src/dialogs/confdialog.cxx:376 #: src/dialogs/confdialog.cxx:18974 msgid "Soundcard" msgstr "Karta dzwiekowa" #: src/dialogs/fl_digi.cxx:1157 src/dialogs/confdialog.cxx:377 #: src/dialogs/confdialog.cxx:19497 msgid "UI" msgstr "IU" #: src/dialogs/fl_digi.cxx:1158 src/dialogs/fl_digi.cxx:6238 #: src/dialogs/confdialog.cxx:378 src/dialogs/confdialog.cxx:13939 #: src/dialogs/confdialog.cxx:20045 msgid "Waterfall" msgstr "Wodospad" #: src/dialogs/fl_digi.cxx:1159 src/dialogs/confdialog.cxx:379 #: src/dialogs/confdialog.cxx:20245 msgid "Web" msgstr "Internet" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4547 msgid "Save changed macros?" msgstr "Zapisac zmienione makro?" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4134 #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 #: src/logbook/logsupport.cxx:1205 src/misc/configuration.cxx:726 #: src/dialogs/font_browser.cxx:173 src/logbook/lgbook.cxx:837 #: src/logbook/lgbook.cxx:1647 msgid "Cancel" msgstr "Anuluj" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:6250 #: src/logbook/logsupport.cxx:330 src/logbook/logsupport.cxx:1204 #: src/dialogs/confdialog.cxx:13194 src/dialogs/confdialog.cxx:15191 #: src/dialogs/confdialog.cxx:20248 msgid "Save" msgstr "Zapisz" #: src/dialogs/fl_digi.cxx:1622 msgid "Don't save" msgstr "Nie zapisuj" #: src/dialogs/fl_digi.cxx:1771 msgid "Switch to ARQ I/O" msgstr "Przełącz do ARQ I/O" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "No" msgstr "Nie" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "Yes" msgstr "Tak" #: src/dialogs/fl_digi.cxx:2630 msgid "Playback continuous loop?" msgstr "Powtarzac odtwarzanie?" #: src/dialogs/fl_digi.cxx:2635 msgid "Unsupported audio format" msgstr "Nieobsługiwany format audio." #: src/dialogs/fl_digi.cxx:2642 msgid "Spotting disabled" msgstr "Spot wyłączony" #: src/dialogs/fl_digi.cxx:2694 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Nie można uruchomic przeglądarki internetowej:\n" "%s\n" "\n" "Otwórz ten adres recznie:\n" "%s" #: src/dialogs/fl_digi.cxx:2707 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Nie mozna otworzyc url:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2790 msgid "Checking for updates..." msgstr "Sprawdzaj aktualizacje..." #: src/dialogs/fl_digi.cxx:2794 msgid "Update site not available" msgstr "Aktualizacja nie jest dostepna" #: src/dialogs/fl_digi.cxx:2806 msgid "You are running the latest version" msgstr "Uzywasz najnowszej wersji" #: src/dialogs/fl_digi.cxx:2810 msgid "You are probably running an alpha version " msgstr "Prawdopodobnie używasz wersji alfa " #: src/dialogs/fl_digi.cxx:2811 msgid "" "\n" "Posted version: " msgstr "" "\n" "Dolaczona wersja: " #: src/dialogs/fl_digi.cxx:2816 #, c-format msgid "Version %s is available at Source Forge" msgstr "Wersja% s jest dostępna w Source Forge" #: src/dialogs/fl_digi.cxx:2885 msgid "Sunspot creation underway!" msgstr "Tworzenie Sunspota w toku!" #: src/dialogs/fl_digi.cxx:2892 msgid "Audio device information is only available for the PortAudio backend" msgstr "Urządzenie Audio jest dostepne tylko jako dodatkowa usluga PortAudio" #: src/dialogs/fl_digi.cxx:2901 msgid "Capture device" msgstr "Przechwyc urządzenie" #: src/dialogs/fl_digi.cxx:2902 msgid "Playback device" msgstr "Urządzenie odtwarzajace" #: src/dialogs/fl_digi.cxx:2906 msgid "Capture and playback devices" msgstr "Urzadzenia do przechwytywania i odtwarzania" #: src/dialogs/fl_digi.cxx:2952 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: Nie istnieje, utworzyć ?" #: src/dialogs/fl_digi.cxx:4134 msgid "Clear log fields?" msgstr "Wyczyscic pola dziennika?" #: src/dialogs/fl_digi.cxx:4134 src/misc/configuration.cxx:726 #: src/logbook/lgbook.cxx:834 src/logbook/lgbook.cxx:1644 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 msgid "Confirm" msgstr "Zastosuj" #: src/dialogs/fl_digi.cxx:4539 msgid "Save changed configuration?" msgstr "Zapisac zmiany konfiguracji?" #: src/dialogs/fl_digi.cxx:4555 src/dialogs/fl_digi.cxx:4580 msgid "Save log entry?" msgstr "Zapisz wpis w dzienniku?" #: src/dialogs/fl_digi.cxx:4571 msgid "Confirm Quit" msgstr "Zamknij" #: src/dialogs/fl_digi.cxx:4593 msgid "Confirm quit?" msgstr "Zamknac?" #: src/dialogs/fl_digi.cxx:5915 src/dialogs/fl_digi.cxx:7618 msgid "&File" msgstr "Plik" #: src/dialogs/fl_digi.cxx:5917 msgid "Folders" msgstr "Foldery" #: src/dialogs/fl_digi.cxx:5918 msgid "Fldigi config..." msgstr "Konfiguracja Fldigi..." #: src/dialogs/fl_digi.cxx:5919 msgid "FLMSG files..." msgstr "Pliki FLMSG..." #: src/dialogs/fl_digi.cxx:5920 msgid "NBEMS files..." msgstr "Pliki NBEMS..." #: src/dialogs/fl_digi.cxx:5921 msgid "WEFAX images..." msgstr "Obrazy Wefax ..." #: src/dialogs/fl_digi.cxx:5922 msgid "Data files..." msgstr "Pliki danych." #: src/dialogs/fl_digi.cxx:5925 msgid "Macros" msgstr "Makra" #: src/dialogs/fl_digi.cxx:5926 msgid "Open ..." msgstr "Otwórz..." #: src/dialogs/fl_digi.cxx:5927 msgid "Save ..." msgstr "Zapisz..." #: src/dialogs/fl_digi.cxx:5930 msgid "Config Scripts" msgstr "Skrypty konfiguracyjne" #: src/dialogs/fl_digi.cxx:5931 msgid "Execute" msgstr "Wykonaj" #: src/dialogs/fl_digi.cxx:5932 msgid "Generate" msgstr "Generuj" #: src/dialogs/fl_digi.cxx:5935 msgid "Text Capture" msgstr "Przechwytywanie tekstu" #: src/dialogs/fl_digi.cxx:5939 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5940 msgid "RX capture" msgstr "Przechwyt RX" #: src/dialogs/fl_digi.cxx:5941 msgid "TX generate" msgstr "Generuj TX" #: src/dialogs/fl_digi.cxx:5942 src/dialogs/confdialog.cxx:18737 msgid "Playback" msgstr "Odtwórz" #: src/dialogs/fl_digi.cxx:5945 src/dialogs/fl_digi.cxx:7619 msgid "Exit" msgstr "Wyjdz" #: src/dialogs/fl_digi.cxx:6203 src/dialogs/fl_digi.cxx:7832 msgid "&Configure" msgstr "Konfiguruj" #: src/dialogs/fl_digi.cxx:6205 src/dialogs/fl_digi.cxx:7833 msgid "Config Dialog" msgstr "Okno konfiguracji" #: src/dialogs/fl_digi.cxx:6206 src/dialogs/fl_digi.cxx:7836 msgid "Save Config" msgstr "Zapisz konfiguracje" #: src/dialogs/fl_digi.cxx:6207 src/dialogs/fl_digi.cxx:7835 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Powiadomienia" #: src/dialogs/fl_digi.cxx:6208 src/dialogs/fl_digi.cxx:7834 msgid "Test Signals" msgstr "Sygnal testowy" #: src/dialogs/fl_digi.cxx:6213 src/dialogs/fl_digi.cxx:7840 msgid "Rx Audio Dialog" msgstr "Okno Audio Rx" #: src/dialogs/fl_digi.cxx:6215 msgid "View/Hide Channels" msgstr "Pokaz/ukryj kanaly" #: src/dialogs/fl_digi.cxx:6216 msgid "Signal browser" msgstr "Przeglądarka sygnałów" #: src/dialogs/fl_digi.cxx:6218 msgid "View/Hide 48 macros" msgstr "Pokaz/ukryj 48 makr" #: src/dialogs/fl_digi.cxx:6220 msgid "DX Cluster" msgstr "DX Klaster" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/fl_digi.cxx:7843 msgid "Floating scope" msgstr "Oscyloskop" #: src/dialogs/fl_digi.cxx:6223 src/dialogs/fl_digi.cxx:7842 msgid "Spectrum scope" msgstr "Zakres widma" #: src/dialogs/fl_digi.cxx:6232 msgid "Rig/Log Controls" msgstr "Kontrola Rig/Log" #: src/dialogs/fl_digi.cxx:6245 msgid "&Logbook" msgstr "Dziennik" #: src/dialogs/fl_digi.cxx:6246 msgid "View" msgstr "Pokaz" #: src/dialogs/fl_digi.cxx:6248 msgid "Files" msgstr "Pliki" #: src/dialogs/fl_digi.cxx:6249 src/dialogs/confdialog.cxx:17449 msgid "Open..." msgstr "Otwórz..." #: src/dialogs/fl_digi.cxx:6251 src/logbook/logsupport.cxx:1213 #: src/logbook/lgbook.cxx:1567 msgid "New" msgstr "Nowy" #: src/dialogs/fl_digi.cxx:6254 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6255 msgid "Merge..." msgstr "Scal..." #: src/dialogs/fl_digi.cxx:6256 msgid "Export..." msgstr "Eksportuj..." #: src/dialogs/fl_digi.cxx:6259 src/logbook/lgbook.cxx:831 msgid "LoTW" msgstr "LoTW" #: src/dialogs/fl_digi.cxx:6261 msgid "Reports" msgstr "Raporty" #: src/dialogs/fl_digi.cxx:6262 msgid "Text..." msgstr "Tekst..." #: src/dialogs/fl_digi.cxx:6263 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6264 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6269 msgid "Field Day Logging" msgstr "Dziennik Polny Dzień" #: src/dialogs/fl_digi.cxx:6274 src/dialogs/fl_digi.cxx:7852 msgid "&Help" msgstr "Pomoc" #: src/dialogs/fl_digi.cxx:6277 msgid "Create sunspots" msgstr "Utwórz sunspota" #: src/dialogs/fl_digi.cxx:6279 msgid "Beginners' Guide" msgstr "Przewodnik dla początkujących" #: src/dialogs/fl_digi.cxx:6280 src/dialogs/fl_digi.cxx:7853 msgid "Online documentation..." msgstr "Dokumentacja online..." #: src/dialogs/fl_digi.cxx:6281 msgid "Fldigi web site..." msgstr "Fldigi na stronie web..." #: src/dialogs/fl_digi.cxx:6282 msgid "Reception reports..." msgstr "Raporty z recepcji ..." #: src/dialogs/fl_digi.cxx:6283 msgid "Command line options" msgstr "Opcje wiersza poleceń" #: src/dialogs/fl_digi.cxx:6284 msgid "Audio device info" msgstr "Informacje o urz. audio" #: src/dialogs/fl_digi.cxx:6285 msgid "Build info" msgstr "Informacje o wersji" #: src/dialogs/fl_digi.cxx:6286 src/dialogs/fl_digi.cxx:7854 msgid "Event log" msgstr "Rejestr zdarzen" #: src/dialogs/fl_digi.cxx:6287 src/dialogs/fl_digi.cxx:7855 msgid "Check for updates..." msgstr "Sprawdz dostępnosc aktualizacji..." #: src/dialogs/fl_digi.cxx:6288 src/dialogs/fl_digi.cxx:7856 msgid "&About" msgstr "O progr" #: src/dialogs/fl_digi.cxx:6539 msgid "waterfall-only mode" msgstr "wodospad- tylko emisje" #: src/dialogs/fl_digi.cxx:6541 msgid "NO CALLSIGN SET" msgstr "NIE USTAWIONO ZNAKU STACJI" #: src/dialogs/fl_digi.cxx:6566 msgid "Close List" msgstr "Zamknij liste" #: src/dialogs/fl_digi.cxx:6574 msgid "Open List" msgstr "Otwórz liste" #: src/dialogs/fl_digi.cxx:6615 msgid "Clear list?" msgstr "Zeruj liste ?" #: src/dialogs/fl_digi.cxx:6699 msgid "report" msgstr "raport" #: src/dialogs/fl_digi.cxx:6699 msgid "reports" msgstr "raporty" #: src/dialogs/fl_digi.cxx:6704 msgid "Recent activity for grid " msgstr "Ostatnia aktywność do siatki" #: src/dialogs/fl_digi.cxx:7841 src/dialogs/Viewer.cxx:283 msgid "Signal Browser" msgstr "Przegladarka sygnalow" #: src/dialogs/fl_digi.cxx:8143 msgid "Scope" msgstr "Oscyloskop" #: src/dialogs/fl_digi.cxx:8234 msgid "Detected signal level" msgstr "Wykryty poziom sygnalu" #: src/dialogs/fl_digi.cxx:8246 src/waterfall/waterfall.cxx:2596 msgid "Squelch level" msgstr "Poziom blokady szumu" #: src/dialogs/fl_digi.cxx:8262 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Kliknij lpm: zmiana trybu\n" "Kliknij ppm: konfiguruj" #: src/dialogs/fl_digi.cxx:8271 msgid "CW transmit WPM" msgstr "CW nadawane WPM" #: src/dialogs/fl_digi.cxx:8280 msgid "Default WPM" msgstr "Domyslny WPM" #: src/dialogs/fl_digi.cxx:8310 msgid "Left click to toggle VuMeter" msgstr "Kliknij lewym przyciskiem myszy, aby przełączyć Vumeter" #: src/dialogs/fl_digi.cxx:8316 msgid "Left click to toggle Status Bar" msgstr "Kliknij lewym przyciskiem myszy, aby przełączyć pasek stanu" #: src/dialogs/fl_digi.cxx:8328 msgid "Tx level attenuator (dB)" msgstr "Poziom tłumienia Tx (dB)" #: src/dialogs/fl_digi.cxx:8356 msgid "Automatic Frequency Control" msgstr "Automatyczna regulacja częstotliwosci" #: src/dialogs/fl_digi.cxx:8361 msgid "Squelch" msgstr "Blokada szumu" #: src/dialogs/fl_digi.cxx:8366 msgid "Power Signal Monitor" msgstr "Monitor mocy sygnalu" #: src/dialogs/fl_digi.cxx:10682 msgid "Delete entry?" msgstr "Kasowac pozycje?" #: src/dialogs/fl_digi.cxx:10682 src/spot/notify.cxx:222 #: src/spot/notify.cxx:228 msgid "All" msgstr "Wszystko" #: src/dialogs/Viewer.cxx:287 msgid "Find: " msgstr "Szukaj : " #: src/dialogs/Viewer.cxx:308 src/logbook/logsupport.cxx:324 #: src/logbook/logsupport.cxx:1063 src/misc/macroedit.cxx:504 #: src/mfsk/mfsk-pic.cxx:338 src/spot/notify.cxx:535 src/spot/notify.cxx:539 #: src/dialogs/confdialog.cxx:20251 msgid "Close" msgstr "Zamknij" #: src/dialogs/Viewer.cxx:316 src/logbook/logsupport.cxx:327 #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:13484 #: src/dialogs/confdialog.cxx:14633 msgid "Clear" msgstr "Czysc" #: src/dialogs/Viewer.cxx:320 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Kliknij lpm by wyczyscic tekst\n" "Kliknij ppm, aby zresetowac częstotliwosci" #: src/dialogs/Viewer.cxx:326 msgid "Set Viewer Squelch" msgstr "Ustaw poziom blokady szumu" #: src/logbook/logsupport.cxx:160 msgid "Export to CSV file" msgstr "Eksport do pliku CSV" #: src/logbook/logsupport.cxx:187 msgid "Export to fixed field text file" msgstr "Eksport do pliku tekstowego" #: src/logbook/logsupport.cxx:215 msgid "Export to ADIF file" msgstr "Eksport do pliku ADIF" #: src/logbook/logsupport.cxx:317 msgid "LoTW Review" msgstr "Weryfikacja LoTW" #: src/logbook/logsupport.cxx:359 msgid "Save changed Logbook?" msgstr "Zapisac zmieniony Logbook?" #: src/logbook/logsupport.cxx:380 msgid "Create new logbook file" msgstr "Utworz nowy plik dziennika" #: src/logbook/logsupport.cxx:403 #, c-format msgid "%s exists, overwrite?" msgstr "%s: istnieje, zastapic ?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Otwórz plik dziennika" #: src/logbook/logsupport.cxx:472 msgid "Save logbook file" msgstr "Zapisz plik dziennika" #: src/logbook/logsupport.cxx:933 msgid "Database merger in progress" msgstr "Trwa łączenie baz danych" #: src/logbook/logsupport.cxx:939 msgid "Merge ADIF file" msgstr "Scal plik ADIF" #: src/logbook/logsupport.cxx:977 msgid "No records in lotw download file" msgstr "Brak zapisów na lotw do pobrania" #: src/logbook/logsupport.cxx:1057 msgid "Unmatched LoTW Records" msgstr "Niedopasowane rekordy LoTW" #: src/logbook/logsupport.cxx:1092 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" "Nie można znaleźć pliku raportu LoTW. .\n" "\n" "Pobierz ze strony LoTW ARRL po zalogowaniu się na: \n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Zapisz plik raportu w folderze fldigi LOTW. \n" "\n" "nazywanie pliku \"lotwreport.adi\"" #: src/logbook/logsupport.cxx:1214 src/spot/notify.cxx:206 #: src/spot/notify.cxx:533 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1574 msgid "Update" msgstr "Aktualizuj" #: src/logbook/logsupport.cxx:1816 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Czy na pewno usunac rekord \"%s\"?" #: src/logbook/logsupport.cxx:2330 msgid "Create cabrillo report" msgstr "Utwórz raport Cabrillo" #: src/logbook/logsupport.cxx:2570 msgid "LoTW download file" msgstr "Pobierz plik z LoTW" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Wykryj występowanie[WRAP:beg] i [WRAP:end]\n" "Zapisz tagi i wszystko zalaczonego tekstu do daty czasu stemplowania pliku, " "ie:\n" " NBEMS.pliki\\WRAP\\odebr\\wypakuj-20090127-092515.wrap" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Wykryj występowanie [WRAP:beg] i [WRAP:end]\n" "Zapisz tagi i wszystko załączonego tekstu do daty czasu stemplowania pliku, " "ie:\n" " ~/.nbems/WRAP/odebr/wypakuj-20090127-092515.wrap" #: src/logger/rx_extract.cxx:286 src/logger/rx_extract.cxx:316 msgid "Could not start flmsg" msgstr "Nie mozna uruchomic flmsg" #: src/logger/rx_extract.cxx:414 src/logger/rx_extract.cxx:418 #: src/dialogs/confdialog.cxx:16379 msgid "Locate flmsg executable" msgstr "Szukaj flmsg exe" #: src/logger/rx_extract.cxx:414 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:418 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:492 msgid "Locate executable" msgstr "Szukaj plik exe" #: src/logger/rx_extract.cxx:492 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:495 msgid "Locate binary" msgstr "Szukaj plik binarny" #: src/logger/rx_extract.cxx:495 msgid "*" msgstr "*" #: src/logger/speak.cxx:40 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Zapisz odebrany tekst, do następującego pliku:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:539 msgid "Rig mode" msgstr "Tryb Rig" #: src/misc/configuration.cxx:540 msgid "Always LSB" msgstr "Zawsze LSB" #: src/misc/configuration.cxx:541 msgid "Always USB" msgstr "Zawsze USB" #: src/misc/configuration.cxx:549 src/dialogs/confdialog.cxx:17915 #: src/dialogs/confdialog.cxx:18183 src/dialogs/confdialog.cxx:18185 msgid "Rig Control/Hamlib" msgstr "Sterowanie RIG/Hamlib" #: src/misc/configuration.cxx:723 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Resetuj wszystkie opcje do ich wartosci domyslnych?\n" "\n" "Zresetowane opcje zostaną uwzględnione przy następnym uruchomieniu\n" "Pliki: fldigi_def.xml i fldigi.prefs zostana usunięte\n" #: src/misc/configuration.cxx:728 msgid "Confirm RESET" msgstr "Wykonaj RESET" #: src/misc/macroedit.cxx:68 msgid "\tmy frequency" msgstr "\tmoja czestotliwosc" #: src/misc/macroedit.cxx:69 msgid "\tmode" msgstr "\temisja" #: src/misc/macroedit.cxx:70 msgid "\tmy call" msgstr "\tmoja stacja" #: src/misc/macroedit.cxx:71 msgid "\tmy locator" msgstr "\tmój lokator" #: src/misc/macroedit.cxx:72 msgid "\tmy name" msgstr "\tmoje imie" #: src/misc/macroedit.cxx:73 #, fuzzy #| msgid "\tmy QTH" msgid "\tmy QTH (city)" msgstr "\tmoje QTH" #: src/misc/macroedit.cxx:74 msgid "\tmy RST" msgstr "\tmoje RST" #: src/misc/macroedit.cxx:75 msgid "\tmy FD class" msgstr "\tmoja Klasa FD" #: src/misc/macroedit.cxx:76 msgid "\tmy FD section" msgstr "\tmoja sekcja FD" #: src/misc/macroedit.cxx:77 msgid "\tmy state" msgstr "\tmój stan" #: src/misc/macroedit.cxx:78 msgid "\tmy ST" msgstr "\tmoje ST" #: src/misc/macroedit.cxx:79 msgid "\tmy county" msgstr "\tmoje hrabstwo" #: src/misc/macroedit.cxx:80 msgid "\tmy CNTY" msgstr "\tmoje CNTY" #: src/misc/macroedit.cxx:81 msgid "\tmy antenna" msgstr "\tmoja antena" #: src/misc/macroedit.cxx:82 msgid "\toperating band" msgstr "\tpasmo pracy" #: src/misc/macroedit.cxx:83 #, fuzzy #| msgid "\ttransmit" msgid "\ttransmit power" msgstr "\tnadawanie" #: src/misc/macroedit.cxx:84 msgid "\tFldigi version" msgstr "\twersja Fldigi" #: src/misc/macroedit.cxx:85 msgid "\tdigital mode (adif)" msgstr "\temisja cyfrowa (adif)" #: src/misc/macroedit.cxx:88 msgid "\tother call" msgstr "\tinna stacja" #: src/misc/macroedit.cxx:89 msgid "\tother name" msgstr "\tinne imie" #: src/misc/macroedit.cxx:90 msgid "\tother QTH" msgstr "\tinne QTH" #: src/misc/macroedit.cxx:91 msgid "\tother State" msgstr "\\inne państwo" #: src/misc/macroedit.cxx:92 msgid "\tother Province" msgstr "\tinna prowincja" #: src/misc/macroedit.cxx:93 msgid "\tother locator" msgstr "\tinny lokator" #: src/misc/macroedit.cxx:94 msgid "\tother RST" msgstr "\tinny RST" #: src/misc/macroedit.cxx:97 msgid "\tS/N etc." msgstr "\tS/N itp." #: src/misc/macroedit.cxx:98 msgid "\tIMD etc." msgstr "\tIMD itp." #: src/misc/macroedit.cxx:101 msgid "\t# QSO recs" msgstr "\t# QSO odebr" #: src/misc/macroedit.cxx:102 msgid "\tnext QSO rec #" msgstr "\tnastępne QSO odb #" #: src/misc/macroedit.cxx:105 msgid "\tmap on google" msgstr "\tmapa google" #: src/misc/macroedit.cxx:106 msgid "\tmap by value" msgstr "\tmapa według wartosci" #: src/misc/macroedit.cxx:109 msgid "\tclear RX pane" msgstr "\tresetuj panel RX" #: src/misc/macroedit.cxx:110 msgid "\tclear TX pane" msgstr "\tresetuj panel TX" #: src/misc/macroedit.cxx:111 msgid "\tclear QSO fields" msgstr "\tczysc pola logu" #: src/misc/macroedit.cxx:114 msgid "\ttext to NAME/QTH" msgstr "\ttekst do IMIE/QTH" #: src/misc/macroedit.cxx:118 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk Wl, Wyl, Przelacz" #: src/misc/macroedit.cxx:122 msgid "\tclear log fields" msgstr "\tczysc pola logu" #: src/misc/macroedit.cxx:123 msgid "\tsave QSO data" msgstr "\tzapisz dane QSO" #: src/misc/macroedit.cxx:124 msgid "\tsaveQSO data, append msg to notes" msgstr "\tzapiszQSO danych, dołącz msg do notatek" #: src/misc/macroedit.cxx:125 msgid "\tlog at xmt time" msgstr "\tloguj czas nadawania" #: src/misc/macroedit.cxx:126 msgid "\tsaveQSO data, append msg to notes" msgstr "\ttzapiszQSO danych, dołącz msg do notatek" #: src/misc/macroedit.cxx:127 msgid "\tlog eQSL" msgstr "\tlog eQSL" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL optional msg" msgstr "\tlog opcionalny eQSL.cc" #: src/misc/macroedit.cxx:131 msgid "\tQSO time (HHMM))" msgstr "\tczas QSO (HHMM)" #: src/misc/macroedit.cxx:132 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "\tLDT domyślnie '%Y-%m-%d %H:%M%z'" #: src/misc/macroedit.cxx:133 #, fuzzy #| msgid "\tLocal datetime, default '%x %H:%M %Z'" msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "\tLokalna data-godzina domyślnie'%x %H:%M %Z'" #: src/misc/macroedit.cxx:134 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "\tZDT domyślnie '%Y-%m-%d %H:%MZ'" #: src/misc/macroedit.cxx:135 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "\tUTC data czas domyślnie'%x %H:%MZ'" #: src/misc/macroedit.cxx:136 msgid "\tlocal time, default %H%M" msgstr "\tczas lokalny %H%M" #: src/misc/macroedit.cxx:137 msgid "\tzulu time default %H%MZ" msgstr "\tczas zulu %H%MZ" #: src/misc/macroedit.cxx:138 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tlokalna data '%Y-%M-%D'" #: src/misc/macroedit.cxx:139 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tData zulu '%Y-%M-%D Z'" #: src/misc/macroedit.cxx:140 msgid "\tget weather data" msgstr "\tuzyskaj dane o pogodzie" #: src/misc/macroedit.cxx:141 msgid "\tget weather data for station" msgstr "\tuzyskaj dane pogodowe dla stacji" #: src/misc/macroedit.cxx:144 msgid "\tcontest counter" msgstr "\tlicznik zawodów" #: src/misc/macroedit.cxx:145 msgid "\tdecrement counter" msgstr "\tLicznik dekrementacji" #: src/misc/macroedit.cxx:146 msgid "\tincrement counter" msgstr "\tzwiększamy licznik" #: src/misc/macroedit.cxx:147 msgid "\texchange in" msgstr "\tnr. kontrolny Rx" #: src/misc/macroedit.cxx:148 msgid "\texchange out" msgstr "\tnr. kontrolny Tx" #: src/misc/macroedit.cxx:149 msgid "\texchange begin" msgstr "\trozpocznij wymiane" #: src/misc/macroedit.cxx:150 msgid "\texchange end" msgstr "\tkoniec wymiany" #: src/misc/macroedit.cxx:151 msgid "\tsave contest out" msgstr "\tzapisz zawody" #: src/misc/macroedit.cxx:152 msgid "\tcurrent contest serno" msgstr "\taktualne zawody serno" #: src/misc/macroedit.cxx:153 msgid "\tlast serno sent" msgstr "\\ostatnie wysłane serno" #: src/misc/macroedit.cxx:154 msgid "\tFD class" msgstr "\tklasa FD" #: src/misc/macroedit.cxx:155 msgid "\tFD section" msgstr "\tsekcja FD" #: src/misc/macroedit.cxx:156 msgid "\tcontest class" msgstr "\tklasa zawodów" #: src/misc/macroedit.cxx:157 msgid "
\tARRL section" msgstr "
\tARRL sekcja" #: src/misc/macroedit.cxx:160 msgid "\treceive" msgstr "\todbiór" #: src/misc/macroedit.cxx:161 msgid "\ttransmit" msgstr "\tnadawanie" #: src/misc/macroedit.cxx:162 msgid "\ttoggle T/R" msgstr "\tprzelacz Tx/Rx" #: src/misc/macroedit.cxx:163 msgid "\tsearch UP for signal" msgstr "\twyszukiwanie w GÓRE sygnalu" #: src/misc/macroedit.cxx:164 msgid "\tsearch DOWN for signal" msgstr "\twyszukiwanie w DÓL sygnalu" #: src/misc/macroedit.cxx:165 msgid "\treturn to sweet spot" msgstr "\tpowrót do preferowanego polozenia" #: src/misc/macroedit.cxx:166 msgid "\tmove to freq NNNN Hz" msgstr "\tprzenies do czest NNNN Hz" #: src/misc/macroedit.cxx:167 msgid "\tleft-clk QSY button" msgstr "\tLewym klikiem przycisk QSY" #: src/misc/macroedit.cxx:168 msgid "\tright-clk QSY button" msgstr "\tPrawo klikiem przycisk QSY" #: src/misc/macroedit.cxx:169 msgid "\tqsy to kHz, Hz" msgstr "\tqsy do kHz, Hz" #: src/misc/macroedit.cxx:170 msgid "\tincr/decr xcvr freq" msgstr "\tincr/decr xcvr freq" #: src/misc/macroedit.cxx:171 msgid "\tvalid xcvr mode" msgstr "\tobowiazuje tryb xcvr" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr filter width" msgstr "\twazna szerokosc filtru xcvr" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr low cutoff filter" msgstr "\twazne xcvr niskie odciecie filtru" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr hi cutoff filter" msgstr "\twazne xcvr odciecia filtru" #: src/misc/macroedit.cxx:175 msgid "\trig freq has kbd focus" msgstr "\trig czestotl ma nastawe kbd" #: src/misc/macroedit.cxx:178 msgid "\tinsert QRG into Rx text" msgstr "\twstaw do tekstu Rx QRG" #: src/misc/macroedit.cxx:181 msgid "\tinsert text file" msgstr "\twstaw plik tekstowy" #: src/misc/macroedit.cxx:182 msgid "\tinsert image file" msgstr "\twstaw plik obrazu" #: src/misc/macroedit.cxx:183 msgid "\tsend avatar" msgstr "\twyslij avatar" #: src/misc/macroedit.cxx:186 msgid "\tpause transmit" msgstr "\twstrzymaj nadawanie" #: src/misc/macroedit.cxx:187 msgid "\tidle signal for NN.nn sec" msgstr "\tbezczynny sygnał dla NN.nn sek" #: src/misc/macroedit.cxx:188 msgid "\trepeat every NN sec" msgstr "\tcyklicznie co NN sek" #: src/misc/macroedit.cxx:189 msgid "\trepeat after waiting NN sec" msgstr "\tpowtorz po oczekiwaniu NN sek" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\tSygnał strojenia dla NN sek" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "\topoznij nadawanie NN sek" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\tpowtarzaj makro stale" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution for" msgstr "\twykonanie harmonogramu dla" #: src/misc/macroedit.cxx:194 msgid "\tend execution at" msgstr "\twykonanie koncowe na" #: src/misc/macroedit.cxx:195 msgid "\tuse local date/time" msgstr "\tlokalny czas/data" #: src/misc/macroedit.cxx:198 msgid "\t set xmt attenuator" msgstr "\t ustawi tłumik xmt" #: src/misc/macroedit.cxx:201 msgid "\tCW identifier" msgstr "\tidentyfikator CW" #: src/misc/macroedit.cxx:202 msgid "\tsend mode ID; TX start only" msgstr "\tNadaj ID trybu z rozpoczęciem TX" #: src/misc/macroedit.cxx:203 msgid "\ttext at start of TX" msgstr "\ttekst na początku TX" #: src/misc/macroedit.cxx:204 #, fuzzy #| msgid "\tvideo text in TX stream" msgstr "\tTx RSID on,off,toggle" msgstr "\tTx RSID wl, wyl, przelacz" #: src/misc/macroedit.cxx:206 msgid "\tRx RSID on,off,toggle" msgstr "\tRx RSID wl, wyl, przelacz" #: src/misc/macroedit.cxx:207 msgid "\tTransmit |NN| successive RsID bursts" msgstr "\tWyślij |NN| kolejne pakiety RsID" #: src/misc/macroedit.cxx:208 msgid "\t[Wait][Len](ms)" msgstr "\t[Czekaj][Len](ms)" #: src/misc/macroedit.cxx:211 msgid "\tXmt audio wav file" msgstr "< AUDIO:>\t XMT audio plik WAV" #: src/misc/macroedit.cxx:214 msgid "" "" msgstr "" "" #: src/misc/macroedit.cxx:215 msgid "\talert using external wav file" msgstr "\talarm za pomocą zewnetrznego pliku wav" #: src/misc/macroedit.cxx:218 msgid "\tCW QSK post-timing" msgstr "\tCW QSK post-czas" #: src/misc/macroedit.cxx:219 msgid "\tCW QSK pre-timing" msgstr "\tCW QSK pre-czas" #: src/misc/macroedit.cxx:220 msgid "\tCW rise time" msgstr "\tCzas narastania CW" #: src/misc/macroedit.cxx:221 msgid "\tChar WPM:Text WPM (15.0:5.0)" msgstr "\tZnak WPM: Tekst WPM (15.0:5.0)" #: src/misc/macroedit.cxx:224 msgid "\tsend CAT cmd" msgstr "\twyślij CAT cmd" #: src/misc/macroedit.cxx:225 msgid "\tsend CAT cmd" msgstr "\twyślij CAT cmd" #: src/misc/macroedit.cxx:228 msgid "\tAFC on,off,toggle" msgstr "\tAFC wl,wyl,przelacz" #: src/misc/macroedit.cxx:229 msgid "\tLOCK on,off,toggle" msgstr "\tLOCK wl, wyl, przelacz" #: src/misc/macroedit.cxx:230 msgid "\tRev on,off,toggle" msgstr "\tRev wł, wył, przełacz" #: src/misc/macroedit.cxx:231 #, fuzzy #| msgid "\tDigitalk On, Off, Toggle" msgid "\tDigital Squelch on, off,toggle" msgstr "\tDigitalk Wl, Wyl, Przelacz" #: src/misc/macroedit.cxx:232 msgid "\tDigital Squelch level, 0..100" msgstr "" #: src/misc/macroedit.cxx:235 msgid "\tchange macro defs file" msgstr "\tzmien plik definicji makro" #: src/misc/macroedit.cxx:236 msgid "\tsave current macro file" msgstr "\tZapisz plik makro" #: src/misc/macroedit.cxx:237 msgid "\trun macro from buffered teext" msgstr "" #: src/misc/macroedit.cxx:240 msgid "\tignore comment text" msgstr "\tignoruj tekst komentarza" #: src/misc/macroedit.cxx:241 msgid "<#comments>\t ignore comments" msgstr "<#komentarze>\t ignoruj komentarze" #: src/misc/macroedit.cxx:244 msgid "\tmodem char/sec test on nn chars" msgstr "\tmodem/ test znaków na sek" #: src/misc/macroedit.cxx:245 msgid "\tmodem timing test, 'n' random 5 char groups" msgstr "\ttest modemu, 'n' losowe 5 grup znaków" #: src/misc/macroedit.cxx:246 msgid "\tmodem timing test, spec' file" msgstr "\ttest czasowy modemu plik spec" #: src/misc/macroedit.cxx:247 msgid "\tmodem timing test, string 's'" msgstr "\ttest czasowy modemu, ciag 's'" #: src/misc/macroedit.cxx:250 msgid "\tWAV file; internal string" msgstr "\tPik WAV; wewnętrzny wiersz" #: src/misc/macroedit.cxx:251 msgid "\tWAV file; 'n' random 5 char groups" msgstr "\tPlik WAV; 'n' losowe 5 grup wiersz" #: src/misc/macroedit.cxx:252 msgid "\tWAV file; spec' file" msgstr "\tWAV plik; pliku spec '" #: src/misc/macroedit.cxx:253 msgid "\tWAV file; string 's'" msgstr "\tPlik WAV; wiersz 's'" #: src/misc/macroedit.cxx:256 msgid "\tAnalysis CSV on,off,toggle" msgstr "\tAnaliza CSV wl,wyl,przelacz" #: src/misc/macroedit.cxx:259 msgid "\tpush current mode to stack" msgstr "\tkliknij biezacy tryb w stos" #: src/misc/macroedit.cxx:260 #, fuzzy #| msgid "\tpush current mode / audio freq to stack" msgstr "\tpop current mode/freq from stack" msgstr "\tpop biezacy tryb / freq ze stosu" #: src/misc/macroedit.cxx:383 msgid "Text file to insert" msgstr "Wstaw plik tekstowy" #: src/misc/macroedit.cxx:393 msgid "Test text file" msgstr "Test pliku tekstowego" #: src/misc/macroedit.cxx:403 msgid "MFSK image file" msgstr "Plik obrazu MFSK" #: src/misc/macroedit.cxx:413 msgid "Change to Macro file" msgstr " Zmien plik makro" #: src/misc/macroedit.cxx:423 src/misc/macroedit.cxx:433 msgid "Select audio file" msgstr "Wybierz plik audio" #: src/misc/macroedit.cxx:445 msgid "Executable file to insert" msgstr "Wstaw plik exe" #: src/misc/macroedit.cxx:476 msgid "Macro Text" msgstr "Tekst makro" #: src/misc/macroedit.cxx:481 msgid "Select Tag" msgstr "Wybierz Tag" #: src/misc/macroedit.cxx:493 msgid "Macro Button Label" msgstr "Etykieta przycisku makro" #: src/misc/macroedit.cxx:501 msgid "Apply" msgstr "Zastosuj" #: src/misc/macroedit.cxx:530 msgid "Macro editor - " msgstr "Edytor makro - " #: src/misc/macros.cxx:5166 msgid "Open macro file" msgstr "Otwórz plik makro" #: src/misc/macros.cxx:5167 src/misc/macros.cxx:5210 msgid "Fldigi macro definition file\t*.{mdf}" msgstr "Plik definicji makro Fldigi\t*.mdf" #: src/misc/macros.cxx:5209 msgid "Save macro file" msgstr "Zapisz plik makro" #: src/misc/newinstall.cxx:385 msgid "Finish" msgstr "Koniec" #: src/misc/newinstall.cxx:386 msgid "Next" msgstr "Nastepny" #: src/misc/newinstall.cxx:387 msgid "Back" msgstr "Koniec" #: src/misc/newinstall.cxx:505 msgid "The wizard will guide you through the basic fldigi settings:" msgstr "Kreator przeprowadzi Cię przez podstawowe ustawienia fldigi:" #: src/misc/newinstall.cxx:506 src/logbook/lgbook.cxx:731 msgid "Operator" msgstr "Dane Operatora" #: src/misc/newinstall.cxx:507 msgid "Sound Card Interface" msgstr "Interfejs karty dzwiękowej" #: src/misc/newinstall.cxx:508 msgid "Transceiver control, flrig/rigcat/hamlib" msgstr "Sterowanie transceiverem, flrig/rigcat/hamlib" #: src/misc/newinstall.cxx:509 msgid "Feel free to skip any pages or exit the wizard at any time" msgstr "Nie pomijaj zadnych stron lub zamknij kreatora w dowolnym momencie" #: src/misc/newinstall.cxx:510 msgid "All settings shown here can be changed later via the Configure menu" msgstr "Ustawienia te mozna pozniej zmienic za pomoca menu Konfiguracja" #: src/misc/newinstall.cxx:525 msgid "Fldigi configuration wizard" msgstr "Kreator konfiguracji Fldigi" #: src/mfsk/mfsk-pic.cxx:142 src/mfsk/mfsk-pic.cxx:146 #: src/mfsk/mfsk-pic.cxx:302 src/mfsk/mfsk-pic.cxx:305 msgid "Time needed: " msgstr "Wymagany czas : " #: src/mfsk/mfsk-pic.cxx:175 msgid "Load image file" msgstr "Zaladuj plik obrazu" #: src/mfsk/mfsk-pic.cxx:312 msgid "Send image" msgstr "Nadaj obraz" #: src/mfsk/mfsk-pic.cxx:319 msgid "" "Load or drop an image file\n" "Supported types: PNG, JPEG, BMP" msgstr "" "Załaduj lub upusc plik obrazu\n" "pliki (PNG, JPEG, BMP)" #: src/mfsk/mfsk-pic.cxx:323 msgid "Transfer speed, X1-normal" msgstr "Szybkosc transferu, X1 -normalna" #: src/mfsk/mfsk-pic.cxx:335 msgid "Load" msgstr "Laduj" #: src/waterfall/waterfall.cxx:2031 msgid "Waterfall / FFT / Scope" msgstr "Wodospad / FFT / Oscyloskop" #: src/waterfall/waterfall.cxx:2040 msgid "Upper signal level (dB)" msgstr "Górny poziom sygnalu (dB)" #: src/waterfall/waterfall.cxx:2051 msgid "Signal range (dB)" msgstr "Zakres sygnalu (dB)" #: src/waterfall/waterfall.cxx:2057 msgid "Change waterfall scale" msgstr "Zmiana skali wodospadu" #: src/waterfall/waterfall.cxx:2062 msgid "Slew display lower in frequency" msgstr "Wyswietl narastanie nizszych częstotliwosci" #: src/waterfall/waterfall.cxx:2067 msgid "Center display on signal" msgstr "Centruj wyswietlacz na sygnale" #: src/waterfall/waterfall.cxx:2072 msgid "Slew display higher in frequency" msgstr "Wyswietl narastanie wyzszych częstotliwosci" #: src/waterfall/waterfall.cxx:2077 msgid "Waterfall drop speed" msgstr "Predkosc spadku wodospadu" #: src/waterfall/waterfall.cxx:2087 msgid "Adjust cursor frequency" msgstr "Ustaw kursor częstotliwosci" #: src/waterfall/waterfall.cxx:2092 msgid "" "Center in passband\n" "Right click to undo" msgstr "" "Centruj w pasmie przenoszenia\n" "Kliknij ppm, aby cofnac" #: src/waterfall/waterfall.cxx:2098 msgid "" "Store mode and frequency\n" "Right click for list" msgstr "" "Tryb magazynu i częstotliwosci\n" "Kliknij ppm na liscie" #: src/waterfall/waterfall.cxx:2108 msgid "Lock transmit frequency" msgstr "Blokuj częstotliwosc nadawania" #: src/waterfall/waterfall.cxx:2117 src/dialogs/confdialog.cxx:19508 msgid "Reverse" msgstr "Odwróc" #: src/waterfall/waterfall.cxx:2124 msgid "Transmit/Receive" msgstr "Nadawanie/Odbiór" #: src/waterfall/waterfall.cxx:2595 msgid "AFC range or BW" msgstr "Zakres AFC lub BW" #: src/waterfall/waterfall.cxx:2596 msgid "Signal search" msgstr "Szukaj sygnalu" #: src/waterfall/waterfall.cxx:2597 msgid "Modem carrier" msgstr "Modem" #: src/waterfall/waterfall.cxx:2597 msgid "Scroll" msgstr "Przewin" #: src/rigcontrol/rigxml.cxx:1121 msgid "Open rig xml file" msgstr "Otwórz plik rig xml" #: src/rigcontrol/rigxml.cxx:1121 msgid "Fldigi rig xml definition file\t*.xml" msgstr "Fldigi plik definicji rig xml \t*.xml" #: src/soundcard/sound.cxx:115 src/soundcard/sound.cxx:117 msgid "Audio file" msgstr "Plik audio" #: src/spot/notify.cxx:193 msgid "My callsign de CALL" msgstr "Mój znak STACJI" #: src/spot/notify.cxx:194 msgid "Station heard twice" msgstr "Stacje słyszalem dwukrotnie" #: src/spot/notify.cxx:195 msgid "Custom text search" msgstr "Wyszukiwanie niestandardowe" #: src/spot/notify.cxx:196 msgid "RSID reception" msgstr "Odbiór RSID" #: src/spot/notify.cxx:197 msgid "RSID EOT" msgstr "" #: src/spot/notify.cxx:205 msgid "Toggle" msgstr "Przelacz" #: src/spot/notify.cxx:207 src/spot/notify.cxx:532 msgid "Remove" msgstr "Kasuj" #: src/spot/notify.cxx:218 src/dialogs/confdialog.cxx:14150 #: src/dialogs/confdialog.cxx:14161 src/dialogs/confdialog.cxx:14251 #: src/dialogs/confdialog.cxx:14262 src/dialogs/confdialog.cxx:14835 #: src/dialogs/confdialog.cxx:18355 src/dialogs/confdialog.cxx:18382 #: src/dialogs/confdialog.cxx:18411 src/dialogs/confdialog.cxx:18440 #: src/dialogs/confdialog.cxx:18469 src/dialogs/confdialog.cxx:18493 #: src/dialogs/confdialog.cxx:19096 msgid "Select" msgstr "Wybierz" #: src/spot/notify.cxx:219 src/spot/notify.cxx:225 src/spot/notify.cxx:586 #: src/logbook/lgbook.cxx:782 src/logbook/lgbook.cxx:1187 msgid "Continent" msgstr "Kontynent" #: src/spot/notify.cxx:220 src/spot/notify.cxx:226 src/logbook/lgbook.cxx:1199 msgid "ITU zone" msgstr "Strefa ITU" #: src/spot/notify.cxx:221 src/spot/notify.cxx:227 #: src/widgets/FTextRXTX.cxx:168 src/logbook/lgbook.cxx:1175 msgid "CQ zone" msgstr "Strefa CQ" #: src/spot/notify.cxx:224 msgid "Deselect" msgstr "Odznacz" #: src/spot/notify.cxx:531 msgid "Add" msgstr "Dodaj" #: src/spot/notify.cxx:534 msgid "Test..." msgstr "Test..." #: src/spot/notify.cxx:537 src/widgets/FTextView.cxx:484 #: src/widgets/flinput2.cxx:49 msgid "Select All" msgstr "Wybierz wszystko" #: src/spot/notify.cxx:538 src/logbook/lgbook.cxx:621 #: src/logbook/lgbook.cxx:822 src/logbook/lgbook.cxx:1636 #: src/logbook/lgbook.cxx:1718 msgid "Clear All" msgstr "Czysc wszystko" #: src/spot/notify.cxx:585 src/widgets/FTextRXTX.cxx:154 #: src/logbook/lgbook.cxx:737 src/logbook/lgbook.cxx:1039 msgid "Country" msgstr "Kraj" #: src/spot/notify.cxx:1144 msgid "The regular expression field must not be empty." msgstr "Pole wyrazenia regularnego nie moze byc puste." #: src/spot/notify.cxx:1150 msgid "The regular expression must be valid." msgstr "Wyrazenie regularne musi byc ważne." #: src/spot/notify.cxx:1157 msgid "Please set your callsign first." msgstr "Proszę ustawić swój znak w pierwszej kolejnosci." #: src/spot/notify.cxx:1294 msgid "Run program" msgstr "Uruchom program" #: src/spot/notify.cxx:1329 msgid "" "Default test string is:\n" " \"" msgstr "" "Ciąg testu domyslnie jest:\n" " \"" #: src/spot/notify.cxx:1330 msgid "Enter test string or leave blank for default:" msgstr "Wpisz ciąg testu lub zostaw puste - domyslne:" #: src/spot/notify.cxx:1341 msgid "This event's regular expression is invalid." msgstr "Te zdarzenie jest wyrazeniem regularnym nieprawidlowym." #: src/spot/notify.cxx:1348 msgid "The test string did not match this event's search pattern." msgstr "Test nie pasuje do tego wydarzenia wzorca wyszukiwania." #: src/spot/notify.cxx:1366 msgid "Available substrings" msgstr "Dostepne podrzedne" #: src/spot/notify.cxx:1453 src/logbook/lgbook.cxx:1617 msgid "Frequency" msgstr "Częstotliwosc" #: src/spot/notify.cxx:1455 src/dialogs/notifydialog.cxx:131 #: src/logbook/lgbook.cxx:1614 msgid "Callsign" msgstr "Znak stacji" #: src/waterfall/colorbox.cxx:87 msgid "Open palette" msgstr "Otwórz paletę" #: src/waterfall/colorbox.cxx:87 src/waterfall/colorbox.cxx:125 msgid "Fldigi palette\t*.pal" msgstr "Paleta Fldigi\t*.pal" #: src/waterfall/colorbox.cxx:111 src/waterfall/colorbox.cxx:136 msgid "Palette: " msgstr "Paleta : " #: src/waterfall/colorbox.cxx:125 msgid "Save palette" msgstr "Zapisz paletę" #: src/widgets/FTextRXTX.cxx:147 msgid "Look up call" msgstr "Poszukaj stacji" #: src/widgets/FTextRXTX.cxx:148 src/dialogs/confdialog.cxx:10138 #: src/logbook/lgbook.cxx:665 src/logbook/lgbook.cxx:870 #: src/logbook/lgbook.cxx:1666 msgid "Call" msgstr "Stacja" #: src/widgets/FTextRXTX.cxx:149 src/logbook/lgbook.cxx:669 #: src/logbook/lgbook.cxx:882 src/logbook/lgbook.cxx:1616 msgid "Name" msgstr "Imie" #: src/widgets/FTextRXTX.cxx:150 msgid "QTH" msgstr "QTH" #: src/widgets/FTextRXTX.cxx:151 src/dialogs/confdialog.cxx:10842 #: src/logbook/lgbook.cxx:716 src/logbook/lgbook.cxx:1710 msgid "State" msgstr "Stan" #: src/widgets/FTextRXTX.cxx:152 src/logbook/lgbook.cxx:779 #: src/logbook/lgbook.cxx:1150 src/logbook/lgbook.cxx:1151 #: src/logbook/lgbook.cxx:1714 msgid "County" msgstr "Hrabstwo" #: src/widgets/FTextRXTX.cxx:153 src/logbook/lgbook.cxx:734 msgid "Province" msgstr "Prowincja" #: src/widgets/FTextRXTX.cxx:155 msgid "Locator" msgstr "Lokator" #: src/widgets/FTextRXTX.cxx:156 msgid "RST(r)" msgstr "RST(r)" #: src/widgets/FTextRXTX.cxx:157 msgid "RST(s)" msgstr "RST(s)" #: src/widgets/FTextRXTX.cxx:158 src/dialogs/confdialog.cxx:10836 #: src/logbook/lgbook.cxx:773 src/logbook/lgbook.cxx:1702 msgid "Exchange In" msgstr "Nr. kontrolny odbr" #: src/widgets/FTextRXTX.cxx:159 msgid "Rx Serial #" msgstr "Rx Numer #" #: src/widgets/FTextRXTX.cxx:160 src/logbook/lgbook.cxx:1343 msgid "Class" msgstr "Klasa" #: src/widgets/FTextRXTX.cxx:161 src/logbook/lgbook.cxx:1432 msgid "Section" msgstr "Sekcja" #: src/widgets/FTextRXTX.cxx:163 msgid "SS ser #" msgstr "SS ser #" #: src/widgets/FTextRXTX.cxx:164 msgid "SS prec" msgstr "SS prec" #: src/widgets/FTextRXTX.cxx:165 msgid "SS check" msgstr "SS Sprawdz" #: src/widgets/FTextRXTX.cxx:166 src/logbook/lgbook.cxx:1433 msgid "SS section" msgstr "SS Sekcja" #: src/widgets/FTextRXTX.cxx:169 msgid "CQ STATE" msgstr "CQ STAN" #: src/widgets/FTextRXTX.cxx:171 msgid "1010 Nr" msgstr "1010 Nr" #: src/widgets/FTextRXTX.cxx:173 msgid "Kid's Age" msgstr "Wiek dziecka" #: src/widgets/FTextRXTX.cxx:175 msgid "Round Up Chk" msgstr "Zaokraglic w górę Chk" #: src/widgets/FTextRXTX.cxx:176 msgid "NAQP xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:177 msgid "JOTA scout" msgstr "JOTA harcerska" #: src/widgets/FTextRXTX.cxx:178 msgid "JOTA troop" msgstr "Sekcja JOTA" #: src/widgets/FTextRXTX.cxx:179 msgid "POWER(r)" msgstr "MOC" #: src/widgets/FTextRXTX.cxx:181 msgid "QSOp state" msgstr "Stan QSO" #: src/widgets/FTextRXTX.cxx:182 msgid "QSOp county" msgstr "QSOp hrabstwo" #: src/widgets/FTextRXTX.cxx:183 msgid "QSOp serno" msgstr "" #: src/widgets/FTextRXTX.cxx:184 msgid "QSOp name" msgstr "QSOp nazwa" #: src/widgets/FTextRXTX.cxx:185 msgid "QSOp xchg" msgstr "" #: src/widgets/FTextRXTX.cxx:186 msgid "QSOp category" msgstr "QSOp Kategoria" #: src/widgets/FTextRXTX.cxx:188 msgid "Insert marker" msgstr "Wstaw znacznik" #: src/widgets/FTextRXTX.cxx:196 msgid "All entries" msgstr "Wszystkie poz" #: src/widgets/FTextRXTX.cxx:198 msgid "Scroll hints" msgstr "Przewijaj podpowiedzi" #: src/widgets/FTextRXTX.cxx:1808 msgid " in " msgstr " w " #: src/widgets/FTextRXTX.cxx:1811 msgid "Last QSO" msgstr "Ostatnie QSO" #: src/widgets/FTextRXTX.cxx:1859 src/dialogs/confdialog.cxx:12043 msgid "Transmit" msgstr "Nadawanie" #: src/widgets/FTextRXTX.cxx:1860 src/dialogs/confdialog.cxx:11903 #: src/dialogs/confdialog.cxx:14718 msgid "Receive" msgstr "Odbiór" #: src/widgets/FTextRXTX.cxx:1861 msgid "Abort" msgstr "Przerwij" #: src/widgets/FTextRXTX.cxx:1862 msgid "Send image..." msgstr "Nadaj obraz..." #: src/widgets/FTextRXTX.cxx:1871 src/widgets/flinput2.cxx:50 msgid "Spec Char" msgstr "Znaki specjalne" #: src/widgets/FTextRXTX.cxx:1879 src/widgets/flinput2.cxx:58 msgid "A" msgstr "A" #: src/widgets/FTextRXTX.cxx:1895 src/widgets/flinput2.cxx:74 msgid "E" msgstr "E" #: src/widgets/FTextRXTX.cxx:1905 src/widgets/flinput2.cxx:84 msgid "I" msgstr "I" #: src/widgets/FTextRXTX.cxx:1915 src/widgets/flinput2.cxx:94 msgid "N" msgstr "N" #: src/widgets/FTextRXTX.cxx:1919 src/widgets/flinput2.cxx:98 #: src/dialogs/confdialog.cxx:16915 msgid "O" msgstr "O" #: src/widgets/FTextRXTX.cxx:1933 src/widgets/flinput2.cxx:112 msgid "U" msgstr "U" #: src/widgets/FTextRXTX.cxx:1943 src/widgets/flinput2.cxx:122 msgid "Y" msgstr "Y" #: src/widgets/FTextRXTX.cxx:1948 src/widgets/flinput2.cxx:127 #: src/logbook/lgbook.cxx:1148 msgid "Other" msgstr "Inne" #: src/widgets/FTextView.cxx:294 msgid "Insert text" msgstr "Wstaw tekst" #: src/widgets/FTextView.cxx:347 msgid "Save text as" msgstr "Zapisz tekst jako" #: src/widgets/FTextView.cxx:482 src/widgets/FTextView.cxx:648 #: src/widgets/flinput2.cxx:45 msgid "Copy" msgstr "Kopiuj" #: src/widgets/FTextView.cxx:485 msgid "Save as..." msgstr "Zapisz jako..." #: src/widgets/FTextView.cxx:486 src/widgets/FTextView.cxx:652 msgid "Word wrap" msgstr "Zawijanie wierszy" #: src/widgets/FTextView.cxx:647 src/widgets/flinput2.cxx:44 msgid "Cut" msgstr "Wytnij" #: src/widgets/FTextView.cxx:649 src/widgets/flinput2.cxx:46 msgid "Paste" msgstr "Wklej" #: src/widgets/FTextView.cxx:651 msgid "Insert file..." msgstr "Wstaw plik..." #: src/widgets/flinput2.cxx:43 msgid "Undo" msgstr "Cofnij" #: src/widgets/flinput2.cxx:47 src/logbook/lgbook.cxx:1581 msgid "Delete" msgstr "Kasuj" #: src/config_script/run_scripts.cxx:950 msgid "Invalid Modem for KISS IO" msgstr "Nieprawidłowy Modem do KISS IO" #: src/config_script/run_scripts.cxx:2850 msgid "Script file name (path) null pointer" msgstr "Nazwa pliku skryptu (ścieżka) zerowy wskaźnik" #: src/config_script/run_scripts.cxx:2857 msgid "Script file name (path) invalid" msgstr "Nazwa pliku skryptu (ścieżka) jest nieprawidłowa" #: src/config_script/run_scripts.cxx:2864 #, c-format msgid "Script Parsing Class Allocation Fail (%s)" msgstr "Blad alokacji klasy skryptu podczas analizy (%s)" #: src/config_script/run_scripts.cxx:2868 #, c-format msgid "Executing script file: %s" msgstr "Wykonaj skrypt pliku: %s" #: src/config_script/run_scripts.cxx:2873 #, c-format msgid "Issues reported in processing script file: %s" msgstr "Problemy zgłoszone podczas przetwarzania pliku skryptu: %s" #: src/config_script/run_scripts.cxx:2874 msgid "" "Script file contains potential issues\n" "See documentation and/or Log file for details." msgstr "" "Plik skryptu zawiera potencjalne problemy\n" "Szczególowe informacje można znalezc w dokumentacji i / lub pliku dziennika." #: src/config_script/run_scripts.cxx:2878 msgid "" "Some changes made by the script requires program\n" "restart before they become active." msgstr "" "Niektóre zmiany dokonane przez skrypt wymagają programu\n" "uruchom ponownie zanim staną się aktywne." #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "Script Files" msgstr "Pliki skryptow" #: src/config_script/run_scripts.cxx:2914 #: src/config_script/create_default_script.cxx:235 msgid "*.txt" msgstr "*.txt" #: src/config_script/script_parsing.cxx:359 #, c-format msgid "Missing command %s after line %d" msgstr "Brakujące polecenie %s po linii %d" #: src/config_script/script_parsing.cxx:403 msgid "Command Not Found" msgstr "Nie znaleziono polecenia" #: src/config_script/script_parsing.cxx:407 msgid "Not a script file/tag not found" msgstr "Nie znaleziono pliku skryptu / znacznika" #: src/config_script/script_parsing.cxx:411 msgid "Invalid parameter" msgstr "Nieprawidłowy parametr" #: src/config_script/script_parsing.cxx:415 msgid "Invalid function parameter (internal non-script error)" msgstr "Nieprawidlowy parametr funkcji (wewnetrzny bład inny niz skrypt)" #: src/config_script/script_parsing.cxx:419 msgid "Missing paired quotes (\")" msgstr "Brakujace oferty sparowane (\")" #: src/config_script/script_parsing.cxx:423 msgid "General Error" msgstr "Blad Ogólny" #: src/config_script/script_parsing.cxx:427 msgid "No Errors" msgstr "Brak blędow" #: src/config_script/script_parsing.cxx:431 msgid "Character searched not found" msgstr "Znaków nie znaleziono" #: src/config_script/script_parsing.cxx:435 msgid "End of line reached" msgstr "Koniec linii" #: src/config_script/script_parsing.cxx:439 msgid "File not found" msgstr "Pliku nie znaleziono" #: src/config_script/script_parsing.cxx:443 msgid "Directory path not found" msgstr "Nie znaleziono sciezki katalogu" #: src/config_script/script_parsing.cxx:447 msgid "Unexpected end of parameter (args[]) list found" msgstr "Nieoczekiwany koniec parametru (args[]) lista znalezionych" #: src/config_script/script_parsing.cxx:451 msgid "Unexpected end of parameter check list found" msgstr "Nieoczekiwany koniec listy wyboru parametrow znalezionych" #: src/config_script/script_parsing.cxx:455 msgid "Character count in args[] parameter exceeds expectations" msgstr "Liczba znaków w args[] parametr przekracza oczekiwania" #: src/config_script/script_parsing.cxx:459 msgid "Memory Allocation Error (internal non-script error)" msgstr "Błąd alokacji pamięci (wewnętrzny błąd inny niż skrypt)" #: src/config_script/script_parsing.cxx:463 msgid "Passed parameter is not of the expected type." msgstr "Podany parametr nie jest oczekiwanego typu." #: src/config_script/script_parsing.cxx:467 msgid "Parameter is not valid." msgstr "Parametr nie prawidłowy." #: src/config_script/script_parsing.cxx:471 msgid "Command missing ':'." msgstr "Brakuje polecenia ':'." #: src/config_script/script_parsing.cxx:475 msgid "Maximum open subscripts reached." msgstr "Maksymalny stan dolnego indeksu." #: src/config_script/script_parsing.cxx:479 msgid "Subscript execution fail (internal)." msgstr "Wykonanie nie powiodło się (wewnętrzne)." #: src/config_script/script_parsing.cxx:483 msgid "Script device path not found." msgstr "Nie znaleziono skryptu ścieżki urządzenia ." #: src/config_script/script_parsing.cxx:487 msgid "Unexpected end of file reached." msgstr "Osiągnięto nieoczekiwany koniec pliku." #: src/config_script/script_parsing.cxx:491 msgid "File read error" msgstr "Błąd odczytu pliku" #: src/config_script/script_parsing.cxx:495 msgid "Undefined error" msgstr "Niezdefiniowany bład" #: src/config_script/script_parsing.cxx:498 #, c-format msgid "Line: %d Error:%d %s (%s)" msgstr "Linia: %d Blad:%d %s (%s)" #: src/config_script/script_parsing.cxx:966 #: src/config_script/script_parsing.cxx:1093 #: src/config_script/script_parsing.cxx:1806 #, c-format msgid "Buffer allocation Error near File: %s Line %d" msgstr "Blad alokacji bufora w pliku %s Wiersz %d" #: src/config_script/script_parsing.cxx:1036 #: src/config_script/script_parsing.cxx:1152 #, c-format msgid "Call back for script command %s reported an Error" msgstr "Wywołanie zwrotne dla polecenia skryptu %s zgłosiło błąd" #: src/config_script/script_parsing.cxx:1042 #, c-format msgid "Command %s ignored, dot notation not supported" msgstr "Polecenie %s ignorowane, notacja dot nie jest obsługiwana" #: src/config_script/script_parsing.cxx:1156 #, c-format msgid "Command %s ignored, structured command not supported" msgstr "Polecenie %s ignorowane, polecenie strukturalne nie jest obsługiwane" #: src/config_script/script_parsing.cxx:1239 msgid "Invalid function parameter 'char *file_name_path' (null)" msgstr "Nieprawidlowy parametr funkcji 'char *file_name_path' (null)" #: src/config_script/script_parsing.cxx:1247 #, c-format msgid "Unable to open file %s" msgstr "Nie można otworzyć pliku %s" #: src/config_script/script_parsing.cxx:1435 msgid "1" msgstr "1" #: src/config_script/script_parsing.cxx:1439 msgid "0" msgstr "0" #: src/config_script/script_parsing.cxx:1656 #: src/config_script/script_parsing.cxx:1743 #, c-format msgid "cmd_buffer allocation error near line %d" msgstr "błąd alokacji cmd_buffer w pobliżu linii %d" #: src/config_script/script_parsing.cxx:1757 #, c-format msgid "Over writing call back funcion for \"%s\"" msgstr "Nad zapisem funkcji wywołania zwrotnego dla \"%s\"" #: src/config_script/create_default_script.cxx:263 #, c-format msgid "Invalid File Name Pointer (NULL) in function %s:%d" msgstr "Nieprawidłowy indeks nazwy pliku (NULL) w funkcji %s:%d" #: src/config_script/create_default_script.cxx:270 #, c-format msgid "Unable to create file %s (Error No=%d) func %s:%d" msgstr "Nie można utworzyć pliku %s (błąd No=%d) func %s:%d" #: src/config_script/create_default_script.cxx:278 #, c-format msgid "" "%s\n" "# Fldigi Generated Config Script\n" msgstr "" "%s\n" "# Fldigi Wygenerowany Konfig skrypt\n" #: src/config_script/create_default_script.cxx:280 #, c-format msgid "# Created: %s\n" msgstr "# Utworzono: %s\n" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 #: src/dialogs/confdialog.cxx:10080 src/dialogs/confdialog.cxx:11537 #: src/dialogs/confdialog.cxx:11721 msgid "Show" msgstr "Pokaz" #: src/dialogs/confdialog.cxx:2522 src/dialogs/confdialog.cxx:2649 msgid "Hide" msgstr "Ukryj" #: src/dialogs/confdialog.cxx:6816 msgid "no" msgstr "nie" #: src/dialogs/confdialog.cxx:6816 msgid "yes" msgstr "tak" #: src/dialogs/confdialog.cxx:9873 msgid "Fldigi configuration" msgstr "Konfiguracja Fldigi" #: src/dialogs/confdialog.cxx:9883 msgid "Configure" msgstr "Konfiguracja" #: src/dialogs/confdialog.cxx:9893 msgid "Collapse Tree" msgstr "Zwin drzewo" #: src/dialogs/confdialog.cxx:9901 src/dialogs/confdialog.cxx:10100 #: src/dialogs/confdialog.cxx:10102 #, fuzzy #| msgid "Callook" msgid "Call/Lookup" msgstr "Callook" #: src/dialogs/confdialog.cxx:9905 msgid "Web Browser lookup" msgstr "Wyszukaj w internecie" #: src/dialogs/confdialog.cxx:9909 msgid "Do not use callsign lookup via web browser" msgstr "Nie uzywaj przeglądarki internetowej do wyszukiwania znaku" #: src/dialogs/confdialog.cxx:9915 msgid "QRZ on line" msgstr "QRZ w internecie" #: src/dialogs/confdialog.cxx:9916 msgid "Visit QRZ web site" msgstr "Zobacz stronę internetową QRZ" #: src/dialogs/confdialog.cxx:9921 msgid "HamCall online" msgstr "HamCall w Internecie" #: src/dialogs/confdialog.cxx:9922 msgid "Visit Hamcall web site" msgstr "Zobacz stronę internetową Hamcall" #: src/dialogs/confdialog.cxx:9927 msgid "HamQTH online" msgstr "HamQTH w Internecie" #: src/dialogs/confdialog.cxx:9928 src/dialogs/confdialog.cxx:9934 msgid "Visit hamQTH web site" msgstr "Zobacz stronę internetową hamQTH" #: src/dialogs/confdialog.cxx:9933 msgid "Callook online" msgstr "Callook w Internecie" #: src/dialogs/confdialog.cxx:9939 msgid "QRZ" msgstr "QRZ" #: src/dialogs/confdialog.cxx:9952 msgid "Hamcall" msgstr "Hamcall" #: src/dialogs/confdialog.cxx:9965 msgid "HamQTH" msgstr "HamQTH" #: src/dialogs/confdialog.cxx:9978 msgid "Callook" msgstr "Callook" #: src/dialogs/confdialog.cxx:9979 msgid "Callook.info web site" msgstr "Strona internetowa Callook.info" #: src/dialogs/confdialog.cxx:9994 msgid "Data base lookup" msgstr "Wyszukaj baze danych" #: src/dialogs/confdialog.cxx:9998 msgid "Do not use callsign database" msgstr "Nie uzywaj bazy danych" #: src/dialogs/confdialog.cxx:10004 msgid "QRZ cdrom" msgstr "QRZ cdrom" #: src/dialogs/confdialog.cxx:10005 msgid "Use CD or hard drive CD image" msgstr "Użyj CD lub obrazu dysku CD" #: src/dialogs/confdialog.cxx:10010 msgid "QRZ.com" msgstr "QRZ.com" #: src/dialogs/confdialog.cxx:10011 msgid "" "You need a paid QRZ online\n" "subscription to access" msgstr "" "Wymagany platny abonament\n" "na dostęp do QRZ on-line" #: src/dialogs/confdialog.cxx:10016 msgid "Hamcall.net" msgstr "Hamcall.net" #: src/dialogs/confdialog.cxx:10017 msgid "" "You need a paid Hamcall online\n" "subscription to access" msgstr "" "Wymagany płatny abonament\n" "na dostęp do Hamcall on-line" #: src/dialogs/confdialog.cxx:10022 msgid "HamQTH.com" msgstr "HamQTH.com" #: src/dialogs/confdialog.cxx:10023 msgid "Free service courtesy of OK" msgstr "Darmowe dzięki uprzejmości obsługi OK" #: src/dialogs/confdialog.cxx:10028 msgid "Callook.info" msgstr "Callook.info" #: src/dialogs/confdialog.cxx:10029 msgid "Callook.info lookup (free service US callsigns only)" msgstr "Callook.info wyszukiwanie ( bezplatna usluga tylko dla stacji US )" #: src/dialogs/confdialog.cxx:10035 msgid "" "ie: /home/dave/CALLBK/ or C:/CALLBK/\n" "Leave blank to search for database" msgstr "" "ie: /home/co7wt/CALLBK lub C:/CALLBK\n" "Pozostaw puste, aby szukac w bazie" #: src/dialogs/confdialog.cxx:10049 msgid "User name" msgstr "Uzytkownik" #: src/dialogs/confdialog.cxx:10050 msgid "Login name for QRZ / Hamcall / HamQTH" msgstr "Login dla QRZ / Hamcall / HamQTH" #: src/dialogs/confdialog.cxx:10064 src/dialogs/confdialog.cxx:11521 #: src/dialogs/confdialog.cxx:11637 msgid "Password" msgstr "Haslo" #: src/dialogs/confdialog.cxx:10065 msgid "Password for QRZ / Hamcall / HamQTH" msgstr "Haslo dla QRZ / Hamcall / HamQTH" #: src/dialogs/confdialog.cxx:10081 src/dialogs/confdialog.cxx:11538 #: src/dialogs/confdialog.cxx:11722 msgid "Show password in plain text" msgstr "Pokaz hasło jako tekst" #: src/dialogs/confdialog.cxx:10086 msgid "Add address to notes field" msgstr "Dodaj adres do pola notatek" #: src/dialogs/confdialog.cxx:10091 msgid "clear old data" msgstr "czysc wszystko" #: src/dialogs/confdialog.cxx:10105 #, fuzzy #| msgid "Reload cty.dat" msgid "Call/cty.dat" msgstr "Przeladuj cty.dat" #: src/dialogs/confdialog.cxx:10109 msgid "cty.dat folder" msgstr "folder cty.dat" #: src/dialogs/confdialog.cxx:10110 msgid "Enter full path-name for cty.dat folder" msgstr "Wpisz pełną sciezkę, folderu cty.dat" #: src/dialogs/confdialog.cxx:10123 msgid "Browse" msgstr "Przeglądaj" #: src/dialogs/confdialog.cxx:10124 msgid "Locate cty.dat file" msgstr "Szukaj plik cty.dat" #: src/dialogs/confdialog.cxx:10127 src/dialogs/confdialog.cxx:10390 #: src/dialogs/confdialog.cxx:10410 src/dialogs/confdialog.cxx:10427 #: src/dialogs/confdialog.cxx:10457 src/dialogs/confdialog.cxx:10661 #: src/dialogs/confdialog.cxx:10717 src/dialogs/confdialog.cxx:11249 #: src/dialogs/confdialog.cxx:11445 src/dialogs/confdialog.cxx:12067 #: src/dialogs/confdialog.cxx:16947 src/dialogs/confdialog.cxx:17032 #: src/dialogs/confdialog.cxx:17046 src/dialogs/confdialog.cxx:17093 #: src/dialogs/confdialog.cxx:17159 src/dialogs/confdialog.cxx:17348 #: src/dialogs/confdialog.cxx:18931 src/dialogs/confdialog.cxx:20169 msgid "Default" msgstr "Domyslne" #: src/dialogs/confdialog.cxx:10128 msgid "Restore cty.dat default folder" msgstr "Domyslny folder cty.dat" #: src/dialogs/confdialog.cxx:10131 msgid "Reload" msgstr "Przeladuj" #: src/dialogs/confdialog.cxx:10132 msgid "Reload cty.dat" msgstr "Przeladuj cty.dat" #: src/dialogs/confdialog.cxx:10135 src/dialogs/confdialog.cxx:10137 msgid "Call/Cty.dat" msgstr "" #: src/dialogs/confdialog.cxx:10141 src/dialogs/confdialog.cxx:10249 #: src/dialogs/confdialog.cxx:10251 #, fuzzy #| msgid "Colors-Fonts/Buttons" msgid "Colors-Fonts/Buttons-Menus" msgstr "Kolory-Czcionki/Przyciski" #: src/dialogs/confdialog.cxx:10145 msgid "Spot" msgstr "Spot" #: src/dialogs/confdialog.cxx:10148 msgid "Rev" msgstr "Odebr" #: src/dialogs/confdialog.cxx:10151 msgid "Tune" msgstr "Stroj" #: src/dialogs/confdialog.cxx:10154 msgid "RxID nar" msgstr "RxID waski" #: src/dialogs/confdialog.cxx:10157 msgid "Lk" msgstr "Lk" #: src/dialogs/confdialog.cxx:10160 msgid "SQL-1" msgstr "SQL-1" #: src/dialogs/confdialog.cxx:10163 msgid "T/R" msgstr "T/R" #: src/dialogs/confdialog.cxx:10166 msgid "RxID wide" msgstr "RxID szeroki" #: src/dialogs/confdialog.cxx:10169 msgid "AFC" msgstr "AFC" #: src/dialogs/confdialog.cxx:10172 msgid "SQL-2" msgstr "SQL-2" #: src/dialogs/confdialog.cxx:10175 msgid "TxID" msgstr "TxID" #: src/dialogs/confdialog.cxx:10225 msgid "Lighted Btns" msgstr "" #: src/dialogs/confdialog.cxx:10232 #, fuzzy #| msgid "Check" msgid "Check Btns" msgstr "Sprawdz" #: src/dialogs/confdialog.cxx:10239 msgid "Round Btns" msgstr "" #: src/dialogs/confdialog.cxx:10246 #, fuzzy #| msgid "Rx font" msgid "Menu font" msgstr "Czcionka Rx" #: src/dialogs/confdialog.cxx:10254 src/dialogs/confdialog.cxx:10328 #: src/dialogs/confdialog.cxx:10330 msgid "Colors-Fonts/FreqDisp - Meters" msgstr "Kolory-Czcionki/Miernik Czestotl" #: src/dialogs/confdialog.cxx:10260 msgid "14070.150" msgstr "14070.150" #: src/dialogs/confdialog.cxx:10269 src/dialogs/confdialog.cxx:10387 #: src/dialogs/confdialog.cxx:10407 src/dialogs/confdialog.cxx:10424 #: src/dialogs/confdialog.cxx:10449 msgid "Font" msgstr "Czcionka" #: src/dialogs/confdialog.cxx:10272 src/dialogs/confdialog.cxx:10286 #: src/dialogs/confdialog.cxx:10300 src/dialogs/confdialog.cxx:10384 #: src/dialogs/confdialog.cxx:10404 msgid "Bg Color" msgstr "Kolor tla" #: src/dialogs/confdialog.cxx:10275 msgid "Digit Color" msgstr "Kolor cyfr" #: src/dialogs/confdialog.cxx:10278 msgid "Sys Colors" msgstr "Kolor systemowy" #: src/dialogs/confdialog.cxx:10283 msgid "S-meter" msgstr "S-metr" #: src/dialogs/confdialog.cxx:10289 src/dialogs/confdialog.cxx:10303 msgid "Scale Color" msgstr "Skala kolorów" #: src/dialogs/confdialog.cxx:10292 src/dialogs/confdialog.cxx:10306 msgid "Meter Color" msgstr "Kolor miernika" #: src/dialogs/confdialog.cxx:10297 msgid "PWR-meter" msgstr "PWR- pomiar" #: src/dialogs/confdialog.cxx:10309 msgid "Power scale" msgstr "Skala mocy" #: src/dialogs/confdialog.cxx:10310 src/dialogs/confdialog.cxx:19838 msgid "Select the type of FFT prefilter" msgstr "Wybierz filtr wstępny typu FFT" #: src/dialogs/confdialog.cxx:10321 msgid "25 W" msgstr "25 W" #: src/dialogs/confdialog.cxx:10333 src/dialogs/confdialog.cxx:10366 #: src/dialogs/confdialog.cxx:10368 msgid "Colors-Fonts/Function keys" msgstr "Kolor-czcionki/klucze funkcyjne" #: src/dialogs/confdialog.cxx:10337 msgid "Use colored buttons" msgstr "Stosuj kolorowe przyciski" #: src/dialogs/confdialog.cxx:10342 msgid "Group 1" msgstr "Grupa 1" #: src/dialogs/confdialog.cxx:10343 msgid "Background color for Function key group 1" msgstr "Kolor tla dla klawiszy funkcyjnych grupy 1" #: src/dialogs/confdialog.cxx:10348 msgid "Group 2" msgstr "Grupa 2" #: src/dialogs/confdialog.cxx:10349 msgid "Background color for Function key group 2" msgstr "Kolor tla dla klawiszy funkcyjnych grupy 2" #: src/dialogs/confdialog.cxx:10354 msgid "Group 3" msgstr "Grupa 3" #: src/dialogs/confdialog.cxx:10355 msgid "Background color for Function key group 3" msgstr "Kolor tla dla klawiszy funkcyjnych grupy 3" #: src/dialogs/confdialog.cxx:10360 src/dialogs/confdialog.cxx:10555 #: src/dialogs/confdialog.cxx:12036 src/dialogs/confdialog.cxx:14187 #: src/dialogs/confdialog.cxx:18180 src/logbook/lgbook.cxx:828 msgid "Defaults" msgstr "Domyslne" #: src/dialogs/confdialog.cxx:10363 msgid "Font/Color" msgstr "Kolor /czcionki" #: src/dialogs/confdialog.cxx:10371 src/dialogs/confdialog.cxx:10462 #: src/dialogs/confdialog.cxx:10464 msgid "Colors-Fonts/Logging controls" msgstr "Kolory-czcionki/Kontrolki logowania" #: src/dialogs/confdialog.cxx:10375 msgid "Logging Panel Controls" msgstr "Panel kontrolny Logu" #: src/dialogs/confdialog.cxx:10395 msgid "Logbook Dialog" msgstr "Dziennik" #: src/dialogs/confdialog.cxx:10415 msgid "DX Cluster Dialog" msgstr "Okno dialogowe klastra DX" #: src/dialogs/confdialog.cxx:10418 msgid "Report Browser" msgstr "Przeglądarka raportow" #: src/dialogs/confdialog.cxx:10430 msgid "Even Lines" msgstr "Linie parzyste" #: src/dialogs/confdialog.cxx:10435 msgid "Odd Lines" msgstr "Linie nieparzyste" #: src/dialogs/confdialog.cxx:10440 msgid "Stream Text" msgstr "Strumień tekstu" #: src/dialogs/confdialog.cxx:10446 msgid "Bg color" msgstr "Kolor tla" #: src/dialogs/confdialog.cxx:10452 msgid "Alt Color" msgstr "Alt Kolor" #: src/dialogs/confdialog.cxx:10453 msgid "Color for outgoing telnet text" msgstr "Kolor wychodzącego tekstu telnetu" #: src/dialogs/confdialog.cxx:10467 src/dialogs/confdialog.cxx:10565 #: src/dialogs/confdialog.cxx:10567 msgid "Colors-Fonts/Rx-Tx" msgstr "Kolory-Czcionki/Rx-Tx" #: src/dialogs/confdialog.cxx:10471 msgid "Rx/Tx Character set" msgstr "Zestaw znaków Rx/Tx" #: src/dialogs/confdialog.cxx:10472 msgid "Select Rx/Tx Character Set" msgstr "Wybierz zestaw znaków Rx/Tx" #: src/dialogs/confdialog.cxx:10492 msgid "Rx bkgnd" msgstr "Tło Rx" #: src/dialogs/confdialog.cxx:10495 msgid "Tx bkgnd" msgstr "Tło Tx" #: src/dialogs/confdialog.cxx:10504 msgid "Rx font" msgstr "Czcionka Rx" #: src/dialogs/confdialog.cxx:10507 msgid "Tx font" msgstr "Czcionka Tx" #: src/dialogs/confdialog.cxx:10516 msgid "Macro Edit Font" msgstr "Edytor czcionki makr" #: src/dialogs/confdialog.cxx:10519 msgid "Text Highlighting" msgstr "Podswietl tekst" #: src/dialogs/confdialog.cxx:10522 src/dialogs/confdialog.cxx:14169 msgid "XMIT" msgstr "XMIT" #: src/dialogs/confdialog.cxx:10523 msgid "Sent chars in Rx/Tx pane" msgstr "Wysylane znaki w panelu Rx/Tx" #: src/dialogs/confdialog.cxx:10528 msgid "CTRL" msgstr "CTRL" #: src/dialogs/confdialog.cxx:10529 msgid "Control chars in Rx/Tx pane" msgstr "Znaki sterowania w panelu Rx/Tx" #: src/dialogs/confdialog.cxx:10534 msgid "SKIP" msgstr "OPUSC" #: src/dialogs/confdialog.cxx:10535 msgid "" "Skipped chars in Tx pane\n" "(Tx on/off in CW)" msgstr "" "Pominięte znaki w panelu Tx\n" "(Tx wl./wyl. w CW)" #: src/dialogs/confdialog.cxx:10540 msgid "ALTR" msgstr "ALTR" #: src/dialogs/confdialog.cxx:10541 msgid "Alternate character color in Rx panelr" msgstr "Alternatywne kolory znaków w panelu Rx" #: src/dialogs/confdialog.cxx:10546 msgid "SEL" msgstr "WYB" #: src/dialogs/confdialog.cxx:10547 msgid "Selection background color in Rx Tx panels" msgstr "Kolor tla w panelach Tx/ Rx" #: src/dialogs/confdialog.cxx:10552 src/dialogs/confdialog.cxx:10577 msgid "System" msgstr "System" #: src/dialogs/confdialog.cxx:10560 msgid "display Rx control chars as ascii string" msgstr "wyswietl znaki ustawien Rx jako ciag znakow ASCII" #: src/dialogs/confdialog.cxx:10570 src/dialogs/confdialog.cxx:10580 #: src/dialogs/confdialog.cxx:10582 msgid "Colors-Fonts/Tabs" msgstr "Kolory-czcionki/tabulatory" #: src/dialogs/confdialog.cxx:10574 msgid "Tab Color" msgstr "Kolor kart" #: src/dialogs/confdialog.cxx:10585 src/dialogs/confdialog.cxx:10670 #: src/dialogs/confdialog.cxx:10672 msgid "Colors-Fonts/Signal Level" msgstr "Kolory-czcionki/poziom sygnalu" #: src/dialogs/confdialog.cxx:10589 msgid "Signal Level Indicator" msgstr "Wskaźnik poziomu sygnału." #: src/dialogs/confdialog.cxx:10596 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18866 msgid "Low" msgstr "Niski" #: src/dialogs/confdialog.cxx:10604 src/dialogs/confdialog.cxx:18874 msgid "" "Transition\n" "Level (dB)" msgstr "" "Przejscie\n" "Poziom (dB)" #: src/dialogs/confdialog.cxx:10612 src/dialogs/confdialog.cxx:18882 msgid "Normal" msgstr "Normalny" #: src/dialogs/confdialog.cxx:10627 src/dialogs/confdialog.cxx:11149 #: src/dialogs/confdialog.cxx:18897 msgid "High" msgstr "Wysoki" #: src/dialogs/confdialog.cxx:10642 src/dialogs/confdialog.cxx:18912 msgid "Over" msgstr "Wyzszy" #: src/dialogs/confdialog.cxx:10645 src/dialogs/confdialog.cxx:10648 #: src/dialogs/confdialog.cxx:10714 src/dialogs/confdialog.cxx:18915 #: src/dialogs/confdialog.cxx:18918 msgid "label" msgstr "etykieta" #: src/dialogs/confdialog.cxx:10659 src/dialogs/confdialog.cxx:18929 msgid "Input signal level" msgstr "Poziom sygnału wejściowego" #: src/dialogs/confdialog.cxx:10664 src/dialogs/confdialog.cxx:18934 msgid "Use wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10665 src/dialogs/confdialog.cxx:18935 msgid "" "default scale is audo \"Vu Meter\"\n" "enable to emulate wsjtx scale" msgstr "" #: src/dialogs/confdialog.cxx:10676 src/dialogs/confdialog.cxx:10736 #: src/dialogs/confdialog.cxx:10738 #, fuzzy #| msgid "Colors-Fonts/Tabs" msgid "Colors-Fonts/Digiscope" msgstr "Kolory-czcionki/tabulatory" #: src/dialogs/confdialog.cxx:10680 #, fuzzy #| msgid "Digit Color" msgid "Digital Scope Colors" msgstr "Kolor cyfr" #: src/dialogs/confdialog.cxx:10687 #, fuzzy #| msgid "Backgnd" msgid "Background" msgstr "Tlo" #: src/dialogs/confdialog.cxx:10695 src/dialogs/confdialog.cxx:13791 msgid "Axis" msgstr "Os" #: src/dialogs/confdialog.cxx:10703 #, fuzzy #| msgid "Color" msgid "Color 1" msgstr "Kolor" #: src/dialogs/confdialog.cxx:10711 #, fuzzy #| msgid "Color" msgid "Color 2" msgstr "Kolor" #: src/dialogs/confdialog.cxx:10725 #, fuzzy #| msgid "Color" msgid "Color 3" msgstr "Kolor" #: src/dialogs/confdialog.cxx:10733 #, fuzzy #| msgid "Color" msgid "Color 4" msgstr "Kolor" #: src/dialogs/confdialog.cxx:10742 src/dialogs/confdialog.cxx:10946 #: src/dialogs/confdialog.cxx:10948 msgid "Contests/General" msgstr "Zawody/Ogólne" #: src/dialogs/confdialog.cxx:10747 msgid "Select Logging as QSO or Contest" msgstr "Wybierz zapis jako QSO lub zawody" #: src/dialogs/confdialog.cxx:10762 msgid "State QSO Party" msgstr "Państwo QSO Party" #: src/dialogs/confdialog.cxx:10778 msgid "Text capture order" msgstr "Przechwyc tekst" #: src/dialogs/confdialog.cxx:10779 msgid "Context Notes" msgstr "Notatki kontekstowe" #: src/dialogs/confdialog.cxx:10791 msgid "Duplicate check, CALL plus" msgstr "Sprawdzaj duplikaty" #: src/dialogs/confdialog.cxx:10794 msgid "On/Off" msgstr "Wl/Wyl" #: src/dialogs/confdialog.cxx:10795 msgid "Check for duplicates" msgstr "Szukaj duplikaty" #: src/dialogs/confdialog.cxx:10800 src/dialogs/notifydialog.cxx:188 #: src/logbook/lgbook.cxx:677 src/logbook/lgbook.cxx:1391 msgid "Band" msgstr "Pasmo" #: src/dialogs/confdialog.cxx:10801 msgid "Bands must match" msgstr "Pasma muszą byc zgodne" #: src/dialogs/confdialog.cxx:10806 src/dialogs/notifydialog.cxx:191 #: src/logbook/lgbook.cxx:680 src/logbook/lgbook.cxx:955 #: src/logbook/lgbook.cxx:1619 src/logbook/lgbook.cxx:1674 msgid "Mode" msgstr "Emisja" #: src/dialogs/confdialog.cxx:10807 msgid "Mode must match" msgstr "Emisje muszą byc zgodne" #: src/dialogs/confdialog.cxx:10812 msgid "Time span over" msgstr "Czas ponad" #: src/dialogs/confdialog.cxx:10813 msgid "QSO must not occur within a time period of" msgstr "QSO nie mozna powtorzyc w okresie" #: src/dialogs/confdialog.cxx:10818 msgid "Dup Color" msgstr "Kolor duplikatu" #: src/dialogs/confdialog.cxx:10819 msgid "Left click to select dup color" msgstr "Kliknij lpm, aby wybrac kolor duplikatu" #: src/dialogs/confdialog.cxx:10827 msgid "? Dup Color" msgstr "Kolor duplikatu ?" #: src/dialogs/confdialog.cxx:10828 msgid "Left click to select possible dup color" msgstr "Kliknij lewym aby wybrac kolor duplikatu" #: src/dialogs/confdialog.cxx:10837 msgid "free form 1 must match" msgstr "darmowy formularz 1 musi byc zgodny" #: src/dialogs/confdialog.cxx:10843 msgid "State must match" msgstr "Panstwo musi się zgadzac" #: src/dialogs/confdialog.cxx:10848 msgid "minutes" msgstr "minut" #: src/dialogs/confdialog.cxx:10849 msgid "Enter time span in minutes" msgstr "Wpisz zakres czasu w minutach" #: src/dialogs/confdialog.cxx:10867 msgid "Contest Exchange / Serial #" msgstr "Numer w zawodach/serial #" #: src/dialogs/confdialog.cxx:10870 src/dialogs/confdialog.cxx:11704 msgid "Send" msgstr "Wyslij" #: src/dialogs/confdialog.cxx:10871 msgid "free form exchange" msgstr "swobodna forma wymiany" #: src/dialogs/confdialog.cxx:10885 msgid "RST always 599/59" msgstr "RST 599/59" #: src/dialogs/confdialog.cxx:10886 msgid "Force RST in/out to 599/59" msgstr "Ustaw RST odebr/wysl na 599/59" #: src/dialogs/confdialog.cxx:10891 msgid "Send CW cut #'s" msgstr "Nadaj krotkie CW" #: src/dialogs/confdialog.cxx:10892 msgid "0 = T; 9 = N" msgstr "0 = T; 9 = N" #: src/dialogs/confdialog.cxx:10899 msgid "Start Nbr" msgstr "Start Nbr" #: src/dialogs/confdialog.cxx:10900 msgid "Starting number" msgstr "Numer startowy" #: src/dialogs/confdialog.cxx:10915 msgid "Digits" msgstr "Cyfry" #: src/dialogs/confdialog.cxx:10916 msgid "Number of digits in serial number" msgstr "Liczba cyfr w numerze kontrolnym" #: src/dialogs/confdialog.cxx:10932 msgid "Use leading zeros" msgstr "Uzyj zer" #: src/dialogs/confdialog.cxx:10933 msgid "Insert leading zeros into Xmtd serial number" msgstr "Wstaw zero w nadawanym numerze kontrolnym" #: src/dialogs/confdialog.cxx:10938 src/dialogs/confdialog.cxx:15083 #: src/dialogs/record_browse.cxx:51 msgid "Reset" msgstr "Resetuj" #: src/dialogs/confdialog.cxx:10939 msgid "Initialize the QSO logging fields" msgstr "Inicjalizacja pól logowania QSO" #: src/dialogs/confdialog.cxx:10951 src/dialogs/confdialog.cxx:11000 #: src/dialogs/confdialog.cxx:11002 msgid "Contests/Field Day" msgstr "Zawody/dzien w terenie" #: src/dialogs/confdialog.cxx:10955 src/logbook/lgbook.cxx:1255 msgid "Operator Call" msgstr "Operator stacji" #: src/dialogs/confdialog.cxx:10956 msgid "" "Field Day Callsign\n" "May be same as OP callsign" msgstr "" "Znak Field Day\n" "Może być taki sam jak znak OP" #: src/dialogs/confdialog.cxx:10970 msgid "My Section" msgstr "Moja sekcja" #: src/dialogs/confdialog.cxx:10971 msgid "Field Day Section" msgstr "Sekcja Field Day" #: src/dialogs/confdialog.cxx:10985 src/dialogs/confdialog.cxx:11012 msgid "My Class" msgstr "Moja klasa" #: src/dialogs/confdialog.cxx:10986 msgid "Field Day Class" msgstr "Field Day Klasa" #: src/dialogs/confdialog.cxx:11005 src/dialogs/confdialog.cxx:11064 #: src/dialogs/confdialog.cxx:11066 msgid "Contests/JOTA School" msgstr "Zawody/Szkoła JOTA" #: src/dialogs/confdialog.cxx:11009 msgid "School Round Up" msgstr "Runda Szkoła Up" #: src/dialogs/confdialog.cxx:11013 msgid "School Round Up - allowable I, H, O - see rules" msgstr "Szkoła Round Up - dopuszczalne I, H, O - zobacz zasady" #: src/dialogs/confdialog.cxx:11029 msgid "Jamboree OTA" msgstr "Zlot skautów OTA" #: src/dialogs/confdialog.cxx:11032 msgid "My Troop" msgstr "My Troop" #: src/dialogs/confdialog.cxx:11033 msgid "My JOTA Troop" msgstr "My JOTA Troop" #: src/dialogs/confdialog.cxx:11047 msgid "Scout Op'" msgstr "Harcerz Op'" #: src/dialogs/confdialog.cxx:11048 msgid "Scout Operator Name" msgstr "Nazwa operatora Skauta" #: src/dialogs/confdialog.cxx:11070 src/dialogs/confdialog.cxx:11109 #: src/dialogs/confdialog.cxx:11111 msgid "IDs/CW" msgstr "IDs/CW" #: src/dialogs/confdialog.cxx:11074 msgid "CW Postamble ID" msgstr "CW ustawienia ID" #: src/dialogs/confdialog.cxx:11077 msgid "Transmit callsign" msgstr "Nadaj znak stacji" #: src/dialogs/confdialog.cxx:11078 msgid "Send Callsign in CW at end of every transmission" msgstr "Nadaj znak CW na koncu transmisji" #: src/dialogs/confdialog.cxx:11083 msgid "Speed (WPM):" msgstr "Prędkosc (WPM):" #: src/dialogs/confdialog.cxx:11084 msgid "Send at this WPM" msgstr "Nadawaj jako WPM" #: src/dialogs/confdialog.cxx:11104 msgid "CW ID modes" msgstr "Tryb CW ID" #: src/dialogs/confdialog.cxx:11114 src/dialogs/confdialog.cxx:11254 #: src/dialogs/confdialog.cxx:11256 msgid "IDs/RsID" msgstr "IDs/RsID" #: src/dialogs/confdialog.cxx:11118 msgid "Reed-Solomon ID (Rx)" msgstr "Reed-Solomon ID (Rx)" #: src/dialogs/confdialog.cxx:11121 msgid "Notify only" msgstr "Tylko informuj" #: src/dialogs/confdialog.cxx:11122 msgid "" "Check this to be notified when an RSID is received\n" "without changing modem and frequency" msgstr "" "Sprawdz to, aby odbierac powiadomienia RSID\n" "bez zmiany modemu i częstotliwosci" #: src/dialogs/confdialog.cxx:11128 #, fuzzy msgid "Rx modes" msgstr "Tryb Rig" #: src/dialogs/confdialog.cxx:11131 msgid "Mark prev freq/mode" msgstr "Oznacz ostatnia częstotliwosc i emisje" #: src/dialogs/confdialog.cxx:11132 msgid "" "Insert RX text marker before\n" "changing frequency and modem" msgstr "" "Wstaw znacznik tekstu RX przed\n" "zmianą częstotliwosci i modemu" #: src/dialogs/confdialog.cxx:11137 msgid "Allow errors" msgstr "Zezwalaj na bledy" #: src/dialogs/confdialog.cxx:11138 msgid "" "Low = zero errors\n" "Medium = 1 error\n" "High = 2 errors" msgstr "" "Low = zero bledow\n" "Medium = 1 blad\n" "High = 2 bledy" #: src/dialogs/confdialog.cxx:11149 msgid "Medium" msgstr "Sredni" #: src/dialogs/confdialog.cxx:11154 msgid "Disable alert dialog" msgstr "Wylacz okno powiadomienia" #: src/dialogs/confdialog.cxx:11155 msgid "Do not show RsID alert dialog box" msgstr "Nie pokazuj okna ostrzezen RsID" #: src/dialogs/confdialog.cxx:11160 msgid "Disables detector" msgstr "Wylacz detektor" #: src/dialogs/confdialog.cxx:11161 msgid "Disable further detection when RSID is received" msgstr "Wylacz wykrywanie RSID" #: src/dialogs/confdialog.cxx:11168 msgid "Retain tx freq lock" msgstr "Zapisz blokade czest. TX" #: src/dialogs/confdialog.cxx:11169 msgid "Retain TX lock frequency (Lk) when changing to RX RsID frequency" msgstr "" "Zachowaj częstotliwosc blokady TX (Lk ) przy zmianie częstotliwosci RX RsID" #: src/dialogs/confdialog.cxx:11174 msgid "Disable freq change" msgstr "Wyłacz zmiane częstotliwosci" #: src/dialogs/confdialog.cxx:11175 src/dialogs/confdialog.cxx:11181 msgid "Do not automatically change to RX RsID frequency" msgstr "Nie zmienia sie automatycznie na częstotliwosci RX RsID" #: src/dialogs/confdialog.cxx:11180 msgid "Rx/Tx RsID EOT" msgstr "Rx/Tx RsID EOT" #: src/dialogs/confdialog.cxx:11186 msgid "Squelch open (sec)" msgstr "Otwarcie Squelch (sek)" #: src/dialogs/confdialog.cxx:11187 src/dialogs/confdialog.cxx:11208 msgid "Use for triggering amplifier carrier detect" msgstr "Sluzy do wyzwalania nosnika wzmacniacza detekcji" #: src/dialogs/confdialog.cxx:11196 msgid "" "The RsID notification message contents and display\n" "characteristics are configured on the \"Notifications\" tab." msgstr "" "Treść i wyświetlanie wiadomości powiadomienia RsID\n" "parametry są konfigurowane w zakładce „Powiadomienia”." #: src/dialogs/confdialog.cxx:11204 msgid "Pre-Signal Tone" msgstr "Pre-sygnał dzwiękowy" #: src/dialogs/confdialog.cxx:11207 msgid "Seconds" msgstr "Sekund" #: src/dialogs/confdialog.cxx:11216 msgid "Reed-Solomon ID (Tx)" msgstr "Reed-Solomon ID (Tx)" #: src/dialogs/confdialog.cxx:11219 msgid "Transmit modes" msgstr "Emisje TX" #: src/dialogs/confdialog.cxx:11222 msgid "End of xmt ID" msgstr "Koniec ID xmt" #: src/dialogs/confdialog.cxx:11223 msgid "Add RsID signal to end of transmission" msgstr "Dodaj sygnał RsID na koncu transmisji" #: src/dialogs/confdialog.cxx:11230 #, fuzzy #| msgid "My Section" msgid "Min BW Detection" msgstr "Moja sekcja" #: src/dialogs/confdialog.cxx:11233 msgid "Hertz" msgstr "" #: src/dialogs/confdialog.cxx:11234 #, fuzzy #| msgid "Filter bandwidth" msgid "Minimum bandwidth" msgstr "Przepustowosc filtru" #: src/dialogs/confdialog.cxx:11243 #, fuzzy #| msgid "Password" msgid "Passband" msgstr "Haslo" #: src/dialogs/confdialog.cxx:11244 #, fuzzy #| msgid "" #| "ON - search over entire waterfall\n" #| "OFF - limit search to +/- 200 Hz" msgid "" "ON - search over entire waterfall\n" "OFF - limit search to BW selector" msgstr "" "WL - przeszukaj cały wodospad\n" "WYL- Ogranicz wyszukiwanie do+/- 200 Hz" #: src/dialogs/confdialog.cxx:11259 src/dialogs/confdialog.cxx:11335 #: src/dialogs/confdialog.cxx:11337 msgid "IDs/Video" msgstr "IDs/Video" #: src/dialogs/confdialog.cxx:11263 msgid "Video Preamble ID" msgstr "Preambuła wideo ID" #: src/dialogs/confdialog.cxx:11266 msgid "Transmit mode ID" msgstr "Nadaj tryb ID" #: src/dialogs/confdialog.cxx:11267 msgid "Waterfall video ID" msgstr "Wodospad Video ID" #: src/dialogs/confdialog.cxx:11271 msgid "Transmit video text" msgstr "Nadaj tekst video" #: src/dialogs/confdialog.cxx:11272 msgid "Waterfall video text" msgstr "Tekst wideo wodospadu" #: src/dialogs/confdialog.cxx:11277 msgid ":" msgstr ":" #: src/dialogs/confdialog.cxx:11278 msgid "" "Limit to a few characters,\n" "as in CQEM or IOTA etc." msgstr "" "Ogranicz do kilku znakow\n" "jak w CQEM lub IOTA itp." #: src/dialogs/confdialog.cxx:11292 msgid "Use small font" msgstr "Uzyj małej czcionki" #: src/dialogs/confdialog.cxx:11293 msgid "" "ON - small font\n" "OFF - large font" msgstr "" "WL - mala czcionka\n" "WYL -duza czcionka" #: src/dialogs/confdialog.cxx:11299 msgid "Chars/Row:" msgstr "Znak/Wiersz:" #: src/dialogs/confdialog.cxx:11300 msgid "Set the number of characters per row" msgstr "Ustaw liczbę znaków w wierszu" #: src/dialogs/confdialog.cxx:11320 msgid "500 Hz limit" msgstr "Limit 500 Hz" #: src/dialogs/confdialog.cxx:11325 msgid "Mode width limit" msgstr "Limit szerokosci emisji" #: src/dialogs/confdialog.cxx:11330 msgid "Video ID modes" msgstr "Tryb Video ID" #: src/dialogs/confdialog.cxx:11341 src/dialogs/confdialog.cxx:11398 #: src/dialogs/confdialog.cxx:11400 msgid "Logging/MacLogger" msgstr "MacLogger" #: src/dialogs/confdialog.cxx:11345 msgid "Connect to MacLogger" msgstr "Polacz z MacLogger" #: src/dialogs/confdialog.cxx:11350 msgid "Capture Radio Report" msgstr "Przechwyc raport" #: src/dialogs/confdialog.cxx:11356 msgid "Capture Log Report" msgstr "Przechwyc dziennik" #: src/dialogs/confdialog.cxx:11361 msgid "Capture Lookup " msgstr "Wyszukaj " #: src/dialogs/confdialog.cxx:11366 msgid "Capture Spot Tune" msgstr "Przechwyc dodatkowe spoty" #: src/dialogs/confdialog.cxx:11371 msgid "Capture Spot Report" msgstr "Przechwyc raport spota" #: src/dialogs/confdialog.cxx:11376 msgid "Enable UDP log file" msgstr "Wlacz plik dziennika UDP" #: src/dialogs/confdialog.cxx:11381 msgid "UDP data stream" msgstr "Transmisja danych UDP" #: src/dialogs/confdialog.cxx:11389 msgid "Clear UDP text" msgstr "Czysc tekst UDP" #: src/dialogs/confdialog.cxx:11392 msgid "Tune to Rx Spot" msgstr "Dostrój do Rx Spot" #: src/dialogs/confdialog.cxx:11393 msgid "" "ON - use Rx spot freq\n" "OFF - use Tx spot freq" msgstr "" "WL - użyj częstotliwości spota Rx\n" "WYL - użyj częstotliwości spota Tx" #: src/dialogs/confdialog.cxx:11403 src/dialogs/confdialog.cxx:11482 #: src/dialogs/confdialog.cxx:11484 msgid "Logging/N3FJP logs" msgstr "Dziennik N3FJP" #: src/dialogs/confdialog.cxx:11407 msgid "TCP/IP Data Stream" msgstr "Transmisja danych TCP/IP" #: src/dialogs/confdialog.cxx:11412 msgid "Clear text" msgstr "Wyczysc tekst" #: src/dialogs/confdialog.cxx:11415 msgid "Address" msgstr "Adres" #: src/dialogs/confdialog.cxx:11416 msgid "N3FJP Server IP Address" msgstr "N3FJP Adres IP" #: src/dialogs/confdialog.cxx:11430 src/dialogs/confdialog.cxx:15264 #: src/dialogs/confdialog.cxx:15288 src/dialogs/confdialog.cxx:15528 #: src/dialogs/confdialog.cxx:17016 src/dialogs/confdialog.cxx:17068 #: src/dialogs/confdialog.cxx:17115 src/dialogs/confdialog.cxx:17148 #: src/dialogs/confdialog.cxx:17368 msgid "Port" msgstr "Port" #: src/dialogs/confdialog.cxx:11431 msgid "N3FJP Server IP Port" msgstr "Port serwera N3FJP" #: src/dialogs/confdialog.cxx:11446 src/dialogs/confdialog.cxx:16948 #: src/dialogs/confdialog.cxx:17033 src/dialogs/confdialog.cxx:17047 #: src/dialogs/confdialog.cxx:17094 src/dialogs/confdialog.cxx:17160 #: src/dialogs/confdialog.cxx:17349 msgid "" "Returns IP Address and port\n" "number to the default value." msgstr "" "Ustawia adres IP i port\n" "numer na wartosc domyslną." #: src/dialogs/confdialog.cxx:11449 msgid "Enable Data Stream" msgstr "Aktywuj transmisje danych" #: src/dialogs/confdialog.cxx:11454 src/dialogs/confdialog.cxx:12842 #: src/dialogs/confdialog.cxx:13091 src/dialogs/confdialog.cxx:13390 #: src/dialogs/confdialog.cxx:15159 src/dialogs/confdialog.cxx:15543 msgid "Connect" msgstr "Podlacz" #: src/dialogs/confdialog.cxx:11459 src/dialogs/confdialog.cxx:16450 msgid "Connected" msgstr "Polaczony" #: src/dialogs/confdialog.cxx:11465 msgid "Center DXspot freq at sweet spot" msgstr "Centruj DXspot" #: src/dialogs/confdialog.cxx:11466 msgid "N3FJP DX spots centered on mode sweet spot" msgstr "N3FJP DX spot" #: src/dialogs/confdialog.cxx:11471 msgid "Report actual modem RF frequency" msgstr "Zgłaszanie faktycznej częstotliwosci modemu RF" #: src/dialogs/confdialog.cxx:11472 msgid "Suppressed carrier +/- AF injection frequency" msgstr "Tlumiony nosnik +/-Częstotliwosc wtrysku AF" #: src/dialogs/confdialog.cxx:11477 msgid "PTT via and " msgstr "PTT przez i " #: src/dialogs/confdialog.cxx:11487 src/dialogs/confdialog.cxx:11614 #: src/dialogs/confdialog.cxx:11616 msgid "Logging/eQSL" msgstr "Logowanie/eQSL" #: src/dialogs/confdialog.cxx:11491 msgid "www url" msgstr "adres www" #: src/dialogs/confdialog.cxx:11492 src/dialogs/confdialog.cxx:11507 #: src/dialogs/confdialog.cxx:11542 msgid "Your login name" msgstr "Twoj login" #: src/dialogs/confdialog.cxx:11506 msgid "User ID" msgstr "ID Uzytkownika" #: src/dialogs/confdialog.cxx:11522 msgid "Your login password" msgstr "Twoje hasło logowania" #: src/dialogs/confdialog.cxx:11541 msgid "QTH Nickname" msgstr "Pseudonim" #: src/dialogs/confdialog.cxx:11556 msgid "Verify" msgstr "Zweryfikuj" #: src/dialogs/confdialog.cxx:11557 msgid "Verify database with eQSL download file" msgstr "Zweryfikuj bazę danych za pomocą pliku z eQSL" #: src/dialogs/confdialog.cxx:11560 msgid "Options" msgstr "Opcje" #: src/dialogs/confdialog.cxx:11563 msgid "send when logged (log button, , )" msgstr "wyslij po zalogowaniu (log przycisk, , )" #: src/dialogs/confdialog.cxx:11564 msgid "automatic data upload" msgstr "automatyczne wysylanie danych" #: src/dialogs/confdialog.cxx:11569 msgid "Use date/time off for log entry" msgstr "Uzyj daty/czas do wpisu w logu" #: src/dialogs/confdialog.cxx:11570 msgid "default uses date/time on" msgstr "domyslnie stosuj data/czas wl" #: src/dialogs/confdialog.cxx:11575 src/dialogs/confdialog.cxx:11690 msgid "Show delivery message" msgstr "Pokaz komunikat o dostarczeniu" #: src/dialogs/confdialog.cxx:11576 src/dialogs/confdialog.cxx:11691 msgid "Display timed delivery message if enabled" msgstr "Wyświetl komunika o dostarczeniu, jeśli jest wlączone" #: src/dialogs/confdialog.cxx:11581 msgid "Default message" msgstr "Komunikat domyslny" #: src/dialogs/confdialog.cxx:11582 msgid "default text to send with etc" msgstr "domyslny tekst, aby wysłac z itp" #: src/dialogs/confdialog.cxx:11596 msgid "Text Tags (tags use {} delimiters)" msgstr "Tekst Tagów (tagi uzyj {} ograniczniki )" #: src/dialogs/confdialog.cxx:11599 msgid " {CALL} other ops call sign" msgstr "{CALL} inna Stacja" #: src/dialogs/confdialog.cxx:11602 msgid " {MODE} full mode / submode" msgstr "{MODE} emisja/ podtryb pracy" #: src/dialogs/confdialog.cxx:11605 msgid "{NAME} other ops name" msgstr "{NAME} inna nazwa" #: src/dialogs/confdialog.cxx:11608 msgid "These tags can also be used in " msgstr "Znaczniki te mogą byc wykorzystywane w " #: src/dialogs/confdialog.cxx:11619 src/dialogs/confdialog.cxx:11751 #: src/dialogs/confdialog.cxx:11753 msgid "Logging/LoTW" msgstr "Logowanie/LOTW" #: src/dialogs/confdialog.cxx:11623 msgid "tqsl:" msgstr "tqsl:" #: src/dialogs/confdialog.cxx:11624 msgid "Enter full path-filename for tqsl executable" msgstr "Wpisz pełna sciezke, pliku tqsl" #: src/dialogs/confdialog.cxx:11638 msgid "Your tqsl login password" msgstr "Twoje hasło do logowania tqsl" #: src/dialogs/confdialog.cxx:11653 msgid "Password required" msgstr "Wymagane haslo" #: src/dialogs/confdialog.cxx:11654 msgid "Submit password with each upload" msgstr "Przeslij hasło przy kazdym przeslaniu" #: src/dialogs/confdialog.cxx:11659 msgid "Location" msgstr "Lokalizacja" #: src/dialogs/confdialog.cxx:11660 msgid "tqsl station location" msgstr "lokalizacja stacji tqsl" #: src/dialogs/confdialog.cxx:11674 src/dialogs/confdialog.cxx:16002 #: src/dialogs/confdialog.cxx:16020 src/dialogs/confdialog.cxx:16038 #: src/dialogs/confdialog.cxx:16056 src/dialogs/confdialog.cxx:16074 #: src/dialogs/confdialog.cxx:16092 src/dialogs/confdialog.cxx:16110 msgid "Locate" msgstr "Szukaj" #: src/dialogs/confdialog.cxx:11675 msgid "Locate tqsl executable" msgstr "Zlokalizuj plik wykonywalny tqsl" #: src/dialogs/confdialog.cxx:11678 msgid "Quiet mode [-q], do not open tqsl dialog" msgstr "Tryb cichy [-q], nie otwieraj okna dialogowego tqsl" #: src/dialogs/confdialog.cxx:11679 msgid "Operate tqsl in batch mode (no dialog)" msgstr "Operacja tqsl w trybie wsadowym (bez okna dialogowego)" #: src/dialogs/confdialog.cxx:11684 msgid "Send QSO data to LoTW when logged" msgstr "Wysylaj dane QSO do LoTW po zalogowaniu" #: src/dialogs/confdialog.cxx:11685 msgid "Submit each QSO as logged" msgstr "Przeslij kazde QSO jako zalogowane" #: src/dialogs/confdialog.cxx:11696 msgid "Export" msgstr "Eksportuj" #: src/dialogs/confdialog.cxx:11697 msgid "Export records for LoTW upload" msgstr "Eksportuj zapisy do LoTW" #: src/dialogs/confdialog.cxx:11700 src/logbook/lgbook.cxx:770 #: src/logbook/lgbook.cxx:1403 src/logbook/lgbook.cxx:1456 msgid "Check" msgstr "Sprawdz" #: src/dialogs/confdialog.cxx:11701 msgid "Review lotw.adif file before sending with tqsl" msgstr "Przejrzyj plik lotw.adif przed wyslaniem z tqsl" #: src/dialogs/confdialog.cxx:11705 msgid "Send lotw.adif via tqsl" msgstr "Wyślij lotw.adif przez tqsl" #: src/dialogs/confdialog.cxx:11708 msgid "Export logbook records for LoTW upload" msgstr "Eksportuj zapisy dziennika do LoTW" #: src/dialogs/confdialog.cxx:11711 msgid "Review / edit the exported LoTW upload adif file" msgstr "Przejrzyj / edytuj wyeksportowany plik adif LoTW" #: src/dialogs/confdialog.cxx:11714 msgid "Submit the upload adif file to LoTW" msgstr "Przeslij plik adif do LoTW" #: src/dialogs/confdialog.cxx:11717 msgid "" "You must have tqsl installed and it's location recorded for LoTW updates to " "work!" msgstr "" "Musisz miec zainstalowany program tqsl i zapisana jego lokalizacje aby " "dzialaly aktualizacje LoTW!" #: src/dialogs/confdialog.cxx:11725 msgid "Use this tqsl station location" msgstr "Użyj tej lokalizacji stacji tqsl" #: src/dialogs/confdialog.cxx:11728 msgid "Match" msgstr "Dopasuj" #: src/dialogs/confdialog.cxx:11729 src/dialogs/confdialog.cxx:11736 msgid "Verify database with LoTW download file" msgstr "Zweryfikuj baze danych za pomocą pliku z LoTW" #: src/dialogs/confdialog.cxx:11732 msgid "Match logbook records with LoTW download file" msgstr "Dopasuj zapisy w dzienniku z plikiem z LoTW" #: src/dialogs/confdialog.cxx:11735 msgid "View Unmatched" msgstr "Wyświetl Niedopasowane" #: src/dialogs/confdialog.cxx:11740 msgid "Timeout" msgstr "Limit czasu" #: src/dialogs/confdialog.cxx:11741 msgid "Wait NN seconds for LoTW response" msgstr "Poczekaj NN sekund na odpowiedz LoTW" #: src/dialogs/confdialog.cxx:11756 src/dialogs/confdialog.cxx:11807 #: src/dialogs/confdialog.cxx:11809 #, fuzzy #| msgid "Logging/Call Lookup" msgid "Logging/Cloudlog" msgstr "Logowanie/Wyszukaj Stacje" #: src/dialogs/confdialog.cxx:11760 msgid "This allows for logging of QSOs to a Cloudlog instance." msgstr "" #: src/dialogs/confdialog.cxx:11764 msgid "Enable Cloudlog API logging" msgstr "" #: src/dialogs/confdialog.cxx:11765 msgid "This enables logging of QSOs to Cloudlog via API" msgstr "" #: src/dialogs/confdialog.cxx:11770 msgid "API URL:" msgstr "" #: src/dialogs/confdialog.cxx:11771 msgid "Enter the URL of your Cloudlog API" msgstr "" #: src/dialogs/confdialog.cxx:11784 msgid "API Key:" msgstr "" #: src/dialogs/confdialog.cxx:11785 msgid "Enter the API key for your Cloudlog instance" msgstr "" #: src/dialogs/confdialog.cxx:11798 #, fuzzy #| msgid "Station QTH:" msgid "Station ID:" msgstr "QTH Stacji:" #: src/dialogs/confdialog.cxx:11803 src/dialogs/confdialog.cxx:16485 #: src/dialogs/confdialog.cxx:17555 src/dialogs/confdialog.cxx:17650 #: src/dialogs/confdialog.cxx:18174 src/dialogs/confdialog.cxx:18269 msgid "Initialize" msgstr "Inicjalizuj" #: src/dialogs/confdialog.cxx:11804 msgid "Test API Key" msgstr "" #: src/dialogs/confdialog.cxx:11813 src/dialogs/confdialog.cxx:11893 #: src/dialogs/confdialog.cxx:11895 msgid "Logging/QSO logging" msgstr "Zapis QSO" #: src/dialogs/confdialog.cxx:11817 msgid "Prompt to save log on exit" msgstr "Monituj o zapis dziennika przy wyjsciu" #: src/dialogs/confdialog.cxx:11818 src/dialogs/confdialog.cxx:11887 #: src/dialogs/confdialog.cxx:19222 msgid "Bug me about saving log entries" msgstr "Info o bledach wpisu dziennika" #: src/dialogs/confdialog.cxx:11823 msgid "Clear on save" msgstr "Wyczysc przy zapisie" #: src/dialogs/confdialog.cxx:11824 msgid "Clear log entries after saving or using macro " msgstr "Zeruj wpisy po zapisie lub za pomocą makra " #: src/dialogs/confdialog.cxx:11829 msgid "Convert callsign to upper case" msgstr "Konwertuj znak stacji na wielkie litery" #: src/dialogs/confdialog.cxx:11830 msgid "Force callsign field to UPPERCASE" msgstr "Wymuszaj wielkie litery w polu znak stacji" #: src/dialogs/confdialog.cxx:11835 msgid "Auto-fill Country and Azimuth" msgstr "Automatycznie wstaw Kraj i Azymut" #: src/dialogs/confdialog.cxx:11836 msgid "Fill in Country / Azimuth using cty.dat information" msgstr "Wypełnij Kraj / Azymut za pomocą info cty.dat" #: src/dialogs/confdialog.cxx:11841 msgid "Sort by Date/Time OFF" msgstr "Sortuj według Daty/czasu zakonczenia" #: src/dialogs/confdialog.cxx:11842 msgid "Sort by date/time OFF - effects all ADIF/Cabrillo reports" msgstr "Sortuj według daty i czasu zak. - wszystkie raporty ADIF/ Cabrillo" #: src/dialogs/confdialog.cxx:11847 msgid "Date time ON == OFF" msgstr "Data czas WL/ WYL" #: src/dialogs/confdialog.cxx:11848 msgid "Force date/time ON == date/time OFF" msgstr "Ustaw data/czas startu == data/czas zakonczenia" #: src/dialogs/confdialog.cxx:11853 msgid "Default RST in to 599/59" msgstr "Domyslny RST Rx 599/59" #: src/dialogs/confdialog.cxx:11854 msgid "Clear log controls sets RST in to 599/59" msgstr "Wyczysc log i ustaw RST na 599/59" #: src/dialogs/confdialog.cxx:11859 msgid "Default RST out to 599/59" msgstr "Domyslny RST Tx 599/59" #: src/dialogs/confdialog.cxx:11860 msgid "Clear log controls sets RST out to 599/59" msgstr "Wyczysc log i ustaw RST 599/59" #: src/dialogs/confdialog.cxx:11865 msgid "Transmit Power" msgstr "Moc TX" #: src/dialogs/confdialog.cxx:11866 msgid "Tx power used for logbook entries" msgstr "Moc nadajnika wykorzystywana do zapisu w logu" #: src/dialogs/confdialog.cxx:11880 msgid "Display logbook read datum at start" msgstr "Wyświetl dziennik, czytaj go na starcie" #: src/dialogs/confdialog.cxx:11881 src/dialogs/confdialog.cxx:19372 msgid "The filename is written to the RX text area" msgstr "Nazwy pliku są zapisywane w obszarze tekstu RX" #: src/dialogs/confdialog.cxx:11886 #, fuzzy #| msgid "Log server" msgid "Log power meter " msgstr "Log serwer" #: src/dialogs/confdialog.cxx:11899 src/dialogs/confdialog.cxx:12167 #: src/dialogs/confdialog.cxx:12169 msgid "Modem/CW/General" msgstr "Modem/CW/Ogólne" #: src/dialogs/confdialog.cxx:11906 msgid "SOM decoding" msgstr "Dekodowanie SOM" #: src/dialogs/confdialog.cxx:11907 msgid "Self Organizing Mapping" msgstr "Organizuj Mapowanie" #: src/dialogs/confdialog.cxx:11913 msgid "WPM Tracking" msgstr "Sledzenie WPM" #: src/dialogs/confdialog.cxx:11914 msgid "Automatic Rx speed tracking" msgstr "Automatyczna prędkosc sciezki Rx" #: src/dialogs/confdialog.cxx:11920 msgid "Filter bandwidth" msgstr "Przepustowosc filtru" #: src/dialogs/confdialog.cxx:11921 msgid "CW dsp filter bandwidth" msgstr "Przepustowosc filtru dsp przy CW" #: src/dialogs/confdialog.cxx:11941 msgid "Matched Filt'" msgstr "Dopasowane Filtry" #: src/dialogs/confdialog.cxx:11942 msgid "Matched Filter bandwidth" msgstr "Dopasuj filtr pasma" #: src/dialogs/confdialog.cxx:11948 msgid "Rx WPM" msgstr "Rx WPM" #: src/dialogs/confdialog.cxx:11954 msgid "Tracked CW speed in WPM" msgstr "Szybkosc CW w WPM" #: src/dialogs/confdialog.cxx:11959 msgid "Lower" msgstr "Nizszy" #: src/dialogs/confdialog.cxx:11960 msgid "Detector low threshold" msgstr "Niski próg detektora" #: src/dialogs/confdialog.cxx:11980 msgid "Upper" msgstr "Wyzszy" #: src/dialogs/confdialog.cxx:11981 msgid "Detector high threshold" msgstr "Wysoki próg detektora" #: src/dialogs/confdialog.cxx:12001 msgid "Range" msgstr "Zakres" #: src/dialogs/confdialog.cxx:12002 msgid "Range +/- wpm" msgstr "Zakres +/- wpm" #: src/dialogs/confdialog.cxx:12021 msgid "Signal tracking" msgstr "Sledzenie sygnału" #: src/dialogs/confdialog.cxx:12024 msgid "Attack" msgstr "Atak" #: src/dialogs/confdialog.cxx:12030 msgid "Decay" msgstr "Zanik" #: src/dialogs/confdialog.cxx:12046 msgid "char WPM" msgstr "znak WPM" #: src/dialogs/confdialog.cxx:12047 src/dialogs/confdialog.cxx:12112 #: src/dialogs/confdialog.cxx:12139 msgid "My transmit CW WPM" msgstr "Moje nadawanie CW WPM" #: src/dialogs/confdialog.cxx:12068 msgid "The default CW speed" msgstr "Domyslna szybkosc CW" #: src/dialogs/confdialog.cxx:12087 src/dialogs/confdialog.cxx:19811 msgid "Lower limit" msgstr "Dolna granica" #: src/dialogs/confdialog.cxx:12088 msgid "No slower than this" msgstr "Nie wolniej niz" #: src/dialogs/confdialog.cxx:12099 src/dialogs/confdialog.cxx:19856 msgid "Upper limit" msgstr "Górna granica" #: src/dialogs/confdialog.cxx:12100 msgid "No faster than this" msgstr "Nie szybciej niz" #: src/dialogs/confdialog.cxx:12111 msgid "text WPM" msgstr "tekst WPM" #: src/dialogs/confdialog.cxx:12132 msgid "Use Farnsworth timing" msgstr "Zastosuj termin Farnsworth" #: src/dialogs/confdialog.cxx:12133 src/dialogs/confdialog.cxx:12160 msgid "text WPM <= char WPM" msgstr "tekst WPM <= znak WPM" #: src/dialogs/confdialog.cxx:12138 #, fuzzy #| msgid "Rng WPM" msgid "Spacing WPM" msgstr "Zakres WPM" #: src/dialogs/confdialog.cxx:12159 #, fuzzy #| msgid "Use Farnsworth timing" msgid "Use Wordsworth timing" msgstr "Zastosuj termin Farnsworth" #: src/dialogs/confdialog.cxx:12172 src/dialogs/confdialog.cxx:12370 #: src/dialogs/confdialog.cxx:12372 msgid "Modem/CW/Timing and QSK" msgstr "Modem/CW/Czas trwania QSK" #: src/dialogs/confdialog.cxx:12176 msgid "Timing" msgstr "Koordynacja" #: src/dialogs/confdialog.cxx:12179 src/dialogs/confdialog.cxx:13130 msgid "Dash/Dot" msgstr "Kreska /kropka" #: src/dialogs/confdialog.cxx:12180 src/dialogs/confdialog.cxx:13131 msgid "Dash to dot ratio" msgstr "Stosunek kreski do kropki" #: src/dialogs/confdialog.cxx:12198 src/dialogs/confdialog.cxx:12321 msgid "Edge timing" msgstr "Czas krawędzi" #: src/dialogs/confdialog.cxx:12199 src/dialogs/confdialog.cxx:12322 msgid "Leading and Trailing edge risetimes (msec)" msgstr "Początkowe i koncowe czasy narastania krawędzi (msek)" #: src/dialogs/confdialog.cxx:12217 msgid "Edge shape" msgstr "Kształt krawędzi" #: src/dialogs/confdialog.cxx:12218 msgid "" "Hanning/Blackman - use edge timing\n" "BPF - use BPF bandwidth" msgstr "" "Hanning/Blackman - Uzyj krawedzi czasu\n" "BPF - uzyj przepustowości" #: src/dialogs/confdialog.cxx:12236 msgid "QSK" msgstr "QSK" #: src/dialogs/confdialog.cxx:12239 msgid "QSK on right audio channel" msgstr "QSK na prawym kanale audio" #: src/dialogs/confdialog.cxx:12240 msgid "Generate square wave signal on right channel" msgstr "Wygeneruj sygnał prostokątny na prawym kanale" #: src/dialogs/confdialog.cxx:12245 msgid "QSK frequency" msgstr "QSK częstotliwosc" #: src/dialogs/confdialog.cxx:12246 msgid "Fundamental frequency of QSK square wave signal" msgstr "Podstawowa częstotliwosc sygnału prostokątnego QSK" #: src/dialogs/confdialog.cxx:12265 msgid "Pre-keydown timing (ms)" msgstr "Pre-keydown czas (ms)" #: src/dialogs/confdialog.cxx:12266 msgid "Msec pre-keydown" msgstr "Czas po puszczeniu" #: src/dialogs/confdialog.cxx:12283 msgid "Post-keydown timing (ms)" msgstr "Czas po naciśnięciu (ms)" #: src/dialogs/confdialog.cxx:12284 msgid "Msec post-keydown" msgstr "Po puszczeniu msc" #: src/dialogs/confdialog.cxx:12301 msgid "QSK amplitude" msgstr "Amplituda QSK" #: src/dialogs/confdialog.cxx:12302 msgid "Amplitude of right channel QSK signal" msgstr "Amplituda prawego kanalu sygnalu QSK" #: src/dialogs/confdialog.cxx:12342 msgid "Send Test character" msgstr "Nadaj znak testowy" #: src/dialogs/confdialog.cxx:12345 msgid "Test char" msgstr "Testowe znaki" #: src/dialogs/confdialog.cxx:12346 msgid "Test character for QSK adjustment" msgstr "Znaki testowe do regulacji QSK" #: src/dialogs/confdialog.cxx:12362 msgid "Send continuously" msgstr "Wysyłaj stale" #: src/dialogs/confdialog.cxx:12363 msgid "Send a continuous stream of test characters" msgstr "Nadaj strumien znaków testowych" #: src/dialogs/confdialog.cxx:12375 src/dialogs/confdialog.cxx:12580 #: src/dialogs/confdialog.cxx:12582 msgid "Modem/CW/Prosigns" msgstr "Prosigns" #: src/dialogs/confdialog.cxx:12379 msgid "" "Use these for WinKeyer\n" "and nanoCW" msgstr "" "Uzyj ich dla WinKeyera\n" "i nanoCW" #: src/dialogs/confdialog.cxx:12382 msgid "\" RR" msgstr "\" RR" #: src/dialogs/confdialog.cxx:12383 msgid ".-..-." msgstr ".-..-." #: src/dialogs/confdialog.cxx:12385 msgid "$ SX" msgstr "$ SX" #: src/dialogs/confdialog.cxx:12386 msgid "...-..-" msgstr "...-..-" #: src/dialogs/confdialog.cxx:12388 msgid "' WG" msgstr "' WG" #: src/dialogs/confdialog.cxx:12389 msgid ".----." msgstr ".----." #: src/dialogs/confdialog.cxx:12391 msgid "( KN" msgstr "( KN" #: src/dialogs/confdialog.cxx:12392 msgid "-.--." msgstr "-.--." #: src/dialogs/confdialog.cxx:12394 msgid ") KK" msgstr ") KK" #: src/dialogs/confdialog.cxx:12395 msgid "-.--.-" msgstr "-.--.-" #: src/dialogs/confdialog.cxx:12397 msgid "+ AR" msgstr "+ AR" #: src/dialogs/confdialog.cxx:12398 src/dialogs/confdialog.cxx:12401 msgid ".-.-." msgstr ".-.-." #: src/dialogs/confdialog.cxx:12400 msgid "< AR" msgstr "< AR" #: src/dialogs/confdialog.cxx:12403 msgid "> SK" msgstr "> SK" #: src/dialogs/confdialog.cxx:12404 msgid "...-.-" msgstr "...-.-" #: src/dialogs/confdialog.cxx:12406 msgid "= BT" msgstr "= BT" #: src/dialogs/confdialog.cxx:12407 msgid "-...-" msgstr "-...-" #: src/dialogs/confdialog.cxx:12409 msgid "- DU" msgstr "- DU" #: src/dialogs/confdialog.cxx:12410 msgid "-....-" msgstr "-....-" #: src/dialogs/confdialog.cxx:12412 msgid "@@ AC" msgstr "@@ AC" #: src/dialogs/confdialog.cxx:12413 msgid ".--.-." msgstr ".--.-." #: src/dialogs/confdialog.cxx:12417 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12434 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12451 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12468 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12484 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12501 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12518 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12535 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12552 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:12569 msgid "Use '(' paren not KN" msgstr "Uzyj '(' zawias nie KN" #: src/dialogs/confdialog.cxx:12574 msgid "Display decoded as assigned key" msgstr "Wyświetl dekodowane jako przypisany klucz" #: src/dialogs/confdialog.cxx:12575 msgid "Display the decoded prosign in the RX text using the short cut key" msgstr "Wyświetl zdekodowany prosign w tekście RX za pomocą krótkiego klucza" #: src/dialogs/confdialog.cxx:12585 src/dialogs/confdialog.cxx:12683 #: src/dialogs/confdialog.cxx:12685 msgid "Modem/CW/Extended Chars." msgstr "Modem/CW/znaki rozszerzone." #: src/dialogs/confdialog.cxx:12589 msgid "" "Check to enable character encode/decode\n" "Select one character from each group" msgstr "" "Zaznacz aby włączyć kodowanie / dekodowanie znaków\n" "Wybierz jeden znak z każdej grupy" #: src/dialogs/confdialog.cxx:12594 msgid "A aelig" msgstr "" #: src/dialogs/confdialog.cxx:12595 src/dialogs/confdialog.cxx:12601 #: src/dialogs/confdialog.cxx:12609 src/dialogs/confdialog.cxx:12617 #: src/dialogs/confdialog.cxx:12623 src/dialogs/confdialog.cxx:12629 #: src/dialogs/confdialog.cxx:12637 src/dialogs/confdialog.cxx:12643 #: src/dialogs/confdialog.cxx:12649 src/dialogs/confdialog.cxx:12655 #: src/dialogs/confdialog.cxx:12663 src/dialogs/confdialog.cxx:12669 #: src/dialogs/confdialog.cxx:12933 msgid "Swap left/right keyer contacts" msgstr "Zamien lewe / prawe kontakty klawisza" #: src/dialogs/confdialog.cxx:12600 msgid " A umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12608 msgid " A ring" msgstr "" #: src/dialogs/confdialog.cxx:12616 msgid " O acute" msgstr "" #: src/dialogs/confdialog.cxx:12622 msgid " O slash" msgstr "" #: src/dialogs/confdialog.cxx:12628 msgid " O umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12636 msgid " C cedilla" msgstr "" #: src/dialogs/confdialog.cxx:12642 msgid " E grave" msgstr "" #: src/dialogs/confdialog.cxx:12648 msgid " E acute" msgstr "" #: src/dialogs/confdialog.cxx:12654 msgid " N tilde" msgstr "" #: src/dialogs/confdialog.cxx:12662 msgid " U umlaut" msgstr "" #: src/dialogs/confdialog.cxx:12668 msgid " U circ" msgstr "" #: src/dialogs/confdialog.cxx:12676 msgid "" "See https://en.wikipedia.org/wiki/Morse_code\n" "for information regarding extended Morse characters." msgstr "" "Zobacz https://en.wikipedia.org/wiki/Morse_code\n" "informacji na temat rozszerzonych znaków Morse'a." #: src/dialogs/confdialog.cxx:12688 msgid "Punctuation/Noise Processing" msgstr "Przetwarzanie interpunkcji/szumów" #: src/dialogs/confdialog.cxx:12692 msgid "Check to enable character encode/decode" msgstr "Sprawdz, aby wlaczyc kod / dekodowanie znakow" #: src/dialogs/confdialog.cxx:12695 msgid " backslash \\ \".-..-.\"" msgstr "ukośnik wsteczny \\ \".-..-.\"" #: src/dialogs/confdialog.cxx:12696 src/dialogs/confdialog.cxx:12704 #: src/dialogs/confdialog.cxx:12712 src/dialogs/confdialog.cxx:12720 #: src/dialogs/confdialog.cxx:12728 src/dialogs/confdialog.cxx:12736 #: src/dialogs/confdialog.cxx:12744 src/dialogs/confdialog.cxx:12752 #: src/dialogs/confdialog.cxx:12760 src/dialogs/confdialog.cxx:12768 #: src/dialogs/confdialog.cxx:12776 msgid "disable for no printed character" msgstr "wylacz bez drukowanego znaku" #: src/dialogs/confdialog.cxx:12703 #, fuzzy #| msgid " single quote ' \".----.\"" msgid " apostrophe ' \".----.\"" msgstr "pojedynczy cudzysłów ' \".----.\"" #: src/dialogs/confdialog.cxx:12711 #, fuzzy #| msgid " colon : \"---...\"" msgid " quote \" \".-..-.\"" msgstr "dwukropek : \"---...\"" #: src/dialogs/confdialog.cxx:12719 msgid " dollar sign $ \"...-..-\"" msgstr "znak dolara $ \"...-.. -\"" #: src/dialogs/confdialog.cxx:12727 msgid " open_paren ( \"-.--.\"" msgstr "otwórz_paren ( \"-.--.\"" #: src/dialogs/confdialog.cxx:12735 msgid " close paren ) \"-.--.-\"" msgstr "zamknij paren \".-..-.\"" #: src/dialogs/confdialog.cxx:12743 msgid " colon : \"---...\"" msgstr "dwukropek : \"---...\"" #: src/dialogs/confdialog.cxx:12751 msgid " semi colon ; \"-.-.-.\"" msgstr "średnik ; „-.-.-”." #: src/dialogs/confdialog.cxx:12759 msgid " underscore _ \"..--.-\"" msgstr "podkreślenie _ \"..--.-\"" #: src/dialogs/confdialog.cxx:12767 msgid " at symbol @@ \".--.-.\"" msgstr "przy symbolu @@ \".--.-.\"" #: src/dialogs/confdialog.cxx:12775 msgid " exclamation ! \"-.-.--\"" msgstr "wykrzyknik ! „-.-.--”" #: src/dialogs/confdialog.cxx:12785 msgid "Unknown character decode (noise)" msgstr "Nieznany dekodowanie znaków (hałas)" #: src/dialogs/confdialog.cxx:12788 msgid " Do not display unknown MORSE symbol" msgstr "Nie wyświetlaj nieznanego symbolu Morse'a" #: src/dialogs/confdialog.cxx:12789 src/dialogs/confdialog.cxx:12796 msgid "disable '*'or no printed character" msgstr "Ustaw '*' lub brak drukowanego znaku" #: src/dialogs/confdialog.cxx:12795 msgid " Display '*' character for unknown MORSE symbol" msgstr "Wyświetl znak '*' dla nieznanego symbolu Morse'a" #: src/dialogs/confdialog.cxx:12802 msgid " Display '_' character for unknown MORSE symbol" msgstr "Wyswietl '_' znak dla nieznanego znaku MORSE" #: src/dialogs/confdialog.cxx:12803 msgid "disable '_' for no printed character" msgstr "Ustaw '_' dla braku drukowanego znaku" #: src/dialogs/confdialog.cxx:12809 msgid " Display ' ' character for unknown MORSE symbol" msgstr "Wyświetl znak ' ' dla nieznanego symbolu MORSE'a" #: src/dialogs/confdialog.cxx:12810 msgid "disable ' ' for no printed character" msgstr "Ustaw ' 'bez drukowanego znaku" #: src/dialogs/confdialog.cxx:12818 src/dialogs/confdialog.cxx:12820 msgid "Modem/CW/Punctuation-Noise" msgstr "Modem/CW/Interpunkcja-Halas" #: src/dialogs/confdialog.cxx:12823 src/dialogs/confdialog.cxx:13067 #: src/dialogs/confdialog.cxx:13069 msgid "Modem/CW/WinKeyer" msgstr "Modem/CW/WinKeyer" #: src/dialogs/confdialog.cxx:12827 src/dialogs/confdialog.cxx:13076 #: src/dialogs/confdialog.cxx:15144 msgid "Ser. Port" msgstr "Port serw" #: src/dialogs/confdialog.cxx:12828 src/dialogs/confdialog.cxx:15529 msgid "Xcvr serial port" msgstr "Xcvr Port szeregowy" #: src/dialogs/confdialog.cxx:12843 src/dialogs/confdialog.cxx:15544 msgid "Connect / Disconnect from WinKeyer" msgstr "Polacz / rozłacz z WinKeyer" #: src/dialogs/confdialog.cxx:12847 msgid "Wait" msgstr "Czekaj" #: src/dialogs/confdialog.cxx:12851 msgid "Bk" msgstr "Bk" #: src/dialogs/confdialog.cxx:12855 msgid "Busy" msgstr "Zajęty" #: src/dialogs/confdialog.cxx:12859 msgid "Bfr" msgstr "Bfr" #: src/dialogs/confdialog.cxx:12863 msgid "Key" msgstr "Klucz" #: src/dialogs/confdialog.cxx:12867 msgid "Keyer Mode" msgstr "Tryb klucza" #: src/dialogs/confdialog.cxx:12880 msgid "Hang" msgstr "Czekaj" #: src/dialogs/confdialog.cxx:12893 src/dialogs/confdialog.cxx:15617 msgid "Sidetone" msgstr "Wybierany" #: src/dialogs/confdialog.cxx:12906 msgid "Output PIns" msgstr "Dane wyjściowe" #: src/dialogs/confdialog.cxx:12919 msgid "Use Pot" msgstr "Użyj Pot" #: src/dialogs/confdialog.cxx:12920 msgid "Winkeyer pot controls WPM" msgstr "Winkeyer kontrola WPM" #: src/dialogs/confdialog.cxx:12927 msgid "WPM setting" msgstr "Ustaw WPM" #: src/dialogs/confdialog.cxx:12929 src/dialogs/confdialog.cxx:12958 msgid "ModeReg" msgstr "Tryb Reg" #: src/dialogs/confdialog.cxx:12932 msgid "Swap" msgstr "Zamiana" #: src/dialogs/confdialog.cxx:12937 msgid "Auto Space" msgstr "Przestrzeń automat" #: src/dialogs/confdialog.cxx:12938 msgid "Enable paddle auto spacing of characters" msgstr "Aktywuj automatyczne odstepy miedzy znakami" #: src/dialogs/confdialog.cxx:12942 msgid "CT space" msgstr "Przestrzeń CT" #: src/dialogs/confdialog.cxx:12943 msgid "Enable contest character spacing" msgstr "Wlacz odstepy między znakami" #: src/dialogs/confdialog.cxx:12947 msgid "Paddle Dog" msgstr "Paletki Dog" #: src/dialogs/confdialog.cxx:12951 msgid "Cut 0/9" msgstr "Wytnij 0/9" #: src/dialogs/confdialog.cxx:12952 msgid "Use T/N for 0/9" msgstr "Uzyj T/N dla 0/9" #: src/dialogs/confdialog.cxx:12961 msgid "Paddle echo" msgstr "Echo paddle" #: src/dialogs/confdialog.cxx:12962 msgid "Echo paddle chars to Rx Panel" msgstr "Echo wiosła znaków do panelu RX" #: src/dialogs/confdialog.cxx:12966 msgid "Serial echo" msgstr "Port szeregowy echo" #: src/dialogs/confdialog.cxx:12971 msgid "Tone Keyer" msgstr "Ton Keyer" #: src/dialogs/confdialog.cxx:12972 msgid "Enable Winkeyer tone keying" msgstr "Wlacz kluczowanie tonem Winkeyera" #: src/dialogs/confdialog.cxx:12976 msgid "Tone ON" msgstr "Wlacz Ton" #: src/dialogs/confdialog.cxx:12977 msgid "Enable Winkeyer audio tone" msgstr "Wlacz dźwięk Winkeyera" #: src/dialogs/confdialog.cxx:12981 msgid "PTT ON" msgstr "PTT ON" #: src/dialogs/confdialog.cxx:12982 msgid "Enable Winkeyer PTT output" msgstr "Wlacz wyjscie PTT Winkeyera" #: src/dialogs/confdialog.cxx:12988 msgid "WPM Settings" msgstr "Ustaw WPM" #: src/dialogs/confdialog.cxx:12991 src/dialogs/confdialog.cxx:13211 msgid "Min WPM" msgstr "Min WPM" #: src/dialogs/confdialog.cxx:12992 src/dialogs/confdialog.cxx:13212 msgid "" "Minimum WPM setting\n" "default = 10" msgstr "" "Minimalne ustawienie WPM\n" "domyslnie = 10" #: src/dialogs/confdialog.cxx:13000 src/dialogs/confdialog.cxx:13221 msgid "Rng WPM" msgstr "Zakres WPM" #: src/dialogs/confdialog.cxx:13001 msgid "" "Range WPM setting\n" "default = 25" msgstr "" "Ustawienie zakresu WPM \n" "domyslnie = 25" #: src/dialogs/confdialog.cxx:13005 msgid "Farsnworth" msgstr "" #: src/dialogs/confdialog.cxx:13006 msgid "" "Farnsworth keying (0 = none)\n" "default = 0" msgstr "" "Kluczowanie Farnsworth (0 = nic)\n" "domyślnie = 0" #: src/dialogs/confdialog.cxx:13010 msgid "Cmd WPM" msgstr "Cmd WPM" #: src/dialogs/confdialog.cxx:13011 msgid "" "WPM speed for Winkeyer Command strings\n" "default = 18" msgstr "" "Szybkość WPM dla ciągów poleceń Winkeyer\n" "Domyślnie = 18" #: src/dialogs/confdialog.cxx:13017 msgid "Timing/Settings" msgstr "Ustaw czas" #: src/dialogs/confdialog.cxx:13020 msgid "Ratio" msgstr "Wspolczynnik" #: src/dialogs/confdialog.cxx:13021 msgid "" "Keying ratio\n" "default = 3.0" msgstr "" "Wspolczynnik kluczowania\n" "domyslnie = 3.0" #: src/dialogs/confdialog.cxx:13025 msgid "Comp" msgstr "Komp" #: src/dialogs/confdialog.cxx:13026 msgid "" "Compensation in msec\n" "default = 0" msgstr "" "Kompensacja w milisekundach\n" "domyślna = 0" #: src/dialogs/confdialog.cxx:13030 msgid "1st Ext" msgstr "1st Ext" #: src/dialogs/confdialog.cxx:13031 msgid "" "Extra duration to first dit/dot in msec\n" "default = 0" msgstr "" "Dodatkowy czas trwania do pierwszego dit / dot w milisekundach\n" "domyślna = 0" #: src/dialogs/confdialog.cxx:13035 msgid "Sample" msgstr "Probka" #: src/dialogs/confdialog.cxx:13036 msgid "" "Paddle sampling (see Winkeyer manual)\n" "default = 50" msgstr "" "Próbkowanie łopatkowe (patrz instrukcja Winkeyer)\n" "domyślnie =50" #: src/dialogs/confdialog.cxx:13040 msgid "Weight" msgstr "Waga" #: src/dialogs/confdialog.cxx:13041 msgid "" "Keying weight\n" "default = 50" msgstr "" "Waga kluczowania\n" "domyslnie = 50" #: src/dialogs/confdialog.cxx:13045 msgid "Leadin" msgstr "Wprowadz" #: src/dialogs/confdialog.cxx:13046 msgid "" "Leadin in msec\n" "default = 0" msgstr "" "Leadin w ms\n" "domyślnie = 0" #: src/dialogs/confdialog.cxx:13050 msgid "Tail" msgstr "Ogon" #: src/dialogs/confdialog.cxx:13051 msgid "" "Extend last dit/dot in msec\n" "default = 0" msgstr "" "Rozszerz ostatnią dit/dot w ms\n" "domyślnie = 0" #: src/dialogs/confdialog.cxx:13059 msgid "K3NG Arduino sketch emulation" msgstr "K3NG emulacja szkicu Arduino" #: src/dialogs/confdialog.cxx:13060 msgid "Activate for Mortty K3NG sketch" msgstr "Aktywuj dla Mortty K3NG szkic" #: src/dialogs/confdialog.cxx:13072 src/dialogs/confdialog.cxx:13277 #: src/dialogs/confdialog.cxx:13279 msgid "Modem/CW/nanoIO" msgstr "Modem/CW/nanoIO" #: src/dialogs/confdialog.cxx:13077 src/dialogs/confdialog.cxx:13376 #: src/dialogs/confdialog.cxx:15145 msgid "nanoIO serial port" msgstr "nanoIO Port szeregowy" #: src/dialogs/confdialog.cxx:13092 src/dialogs/confdialog.cxx:13391 #: src/dialogs/confdialog.cxx:15160 msgid "Connect / Disconnect from nanoIO" msgstr "Polacz / rozłacz z nanoIO" #: src/dialogs/confdialog.cxx:13095 msgid "Paddle" msgstr "Paletki" #: src/dialogs/confdialog.cxx:13096 msgid "CW wpm using paddle keyer" msgstr "CW WPM za pomocą łopatki KEYER" #: src/dialogs/confdialog.cxx:13119 src/dialogs/confdialog.cxx:13239 #: src/dialogs/confdialog.cxx:13261 msgid "Comp'" msgstr "Comp'" #: src/dialogs/confdialog.cxx:13120 msgid "CW wpm keyboard strings" msgstr "Ciągi klawiszy CW wpm" #: src/dialogs/confdialog.cxx:13149 msgid "Baud" msgstr "Baud" #: src/dialogs/confdialog.cxx:13164 msgid "Keyer" msgstr "Keyer" #: src/dialogs/confdialog.cxx:13179 msgid "Incr'" msgstr "Incr'" #: src/dialogs/confdialog.cxx:13195 src/dialogs/confdialog.cxx:15192 msgid "Write state of nanoIO to Arduino EEPROM" msgstr "Zapisz stan nanoIO do Arduino EEPROM" #: src/dialogs/confdialog.cxx:13198 src/dialogs/confdialog.cxx:15195 msgid "Status" msgstr "Status" #: src/dialogs/confdialog.cxx:13199 src/dialogs/confdialog.cxx:15196 msgid "Query state of nanoIO" msgstr "Zapytanie o stan nanoIO" #: src/dialogs/confdialog.cxx:13204 msgid "Use WPM pot'" msgstr "Użyj WPM Pot" #: src/dialogs/confdialog.cxx:13205 msgid "WPM pot update to nanoIO required" msgstr "Wymagana aktualizacja puli WPM do nanoIO" #: src/dialogs/confdialog.cxx:13222 msgid "" "Range WPM setting\n" "default = 20" msgstr "" "Zakres ustawienie WPM \n" "domyslnie = 25" #: src/dialogs/confdialog.cxx:13233 msgid "PTT off" msgstr "PTT wyl" #: src/dialogs/confdialog.cxx:13234 msgid "Disable PTT" msgstr "Wylacz PTT" #: src/dialogs/confdialog.cxx:13242 msgid "WPM" msgstr "WPM" #: src/dialogs/confdialog.cxx:13252 msgid "Test =>" msgstr "Test =>" #: src/dialogs/confdialog.cxx:13253 msgid "Send \"paris \" WPM times" msgstr "Nadawaj jako czas WPM" #: src/dialogs/confdialog.cxx:13256 msgid "secs' =>" msgstr "sek' =>" #: src/dialogs/confdialog.cxx:13257 msgid "Test duration (60 seconds)" msgstr "Czas trwania tonu (60 sek)" #: src/dialogs/confdialog.cxx:13262 msgid "Compensationin microseconds" msgstr "Kompensacja w milisekundach" #: src/dialogs/confdialog.cxx:13266 msgid "Adjust" msgstr "Dostosuj" #: src/dialogs/confdialog.cxx:13267 msgid "send compensation to nanoIO" msgstr "wyslij kompensacje nanoIO" #: src/dialogs/confdialog.cxx:13272 msgid "CW i/o" msgstr "" #: src/dialogs/confdialog.cxx:13273 msgid "Enable CW operation" msgstr "Wlacz Operacje CW." #: src/dialogs/confdialog.cxx:13282 src/dialogs/confdialog.cxx:13404 #: src/dialogs/confdialog.cxx:13406 msgid "Modem/CW/DTR-RTS keying" msgstr "Kluczowanie modemem/CW/DTR-RTS" #: src/dialogs/confdialog.cxx:13288 msgid "" "DTR/RTS keying may be assigned to flrig, share the RigCat serial port,\n" "share the Separate PTT serial port, or be assigned to separate serial port.\n" "\n" "No settings for baud, stops bits, etc are needed." msgstr "" "Kluczowanie DTR/RTS można przypisać do flrig, współdzielić port szeregowy " "RigCat,\n" "współdzielić oddzielny port szeregowy PTT lub być przypisany do oddzielnego " "portu szeregowego.\n" "\n" "Nie są potrzebne żadne ustawienia dla bodów, bitów stopu itp." #: src/dialogs/confdialog.cxx:13297 #, fuzzy #| msgid "Use flrig DTR/CTS keying" msgid "Use flrig DTR/RTS keying" msgstr "Użyj klawisza flrig DTR / CTS" #: src/dialogs/confdialog.cxx:13303 msgid "Disable flrig CW PTT" msgstr "Wylacz flrig CW PTT" #: src/dialogs/confdialog.cxx:13304 src/dialogs/confdialog.cxx:13451 msgid "" "Required for some transceivers\n" "e.g. TS-480" msgstr "" "Wymagane dla niektórych transceiverow\n" "np. TS-480" #: src/dialogs/confdialog.cxx:13313 msgid "Share RIGCAT port" msgstr "Udostępnij port RIGCAT" #: src/dialogs/confdialog.cxx:13319 msgid "Share Separate PTT port" msgstr "Udostępnij oddzielny port PTT" #: src/dialogs/confdialog.cxx:13325 msgid "CW Keyline" msgstr "Linnia klucza CW" #: src/dialogs/confdialog.cxx:13340 msgid "Keying compensation (msec)" msgstr "Kompensacja kluczowania (ms)" #: src/dialogs/confdialog.cxx:13341 msgid "Dot / Space timing increment" msgstr "Przyrost czasu kropki / spacji" #: src/dialogs/confdialog.cxx:13359 msgid "PTT keyline" msgstr "Linia klucza PTT" #: src/dialogs/confdialog.cxx:13375 msgid "Use Separate Keying Serial Port" msgstr "Uzyj oddzielnego portu szeregowego klucza" #: src/dialogs/confdialog.cxx:13395 msgid "Speed test" msgstr "Test prędkości" #: src/dialogs/confdialog.cxx:13396 msgid "1 minute 'PARIS '" msgstr "Wynik 'PARIS '" #: src/dialogs/confdialog.cxx:13400 msgid "Result" msgstr "Wynik" #: src/dialogs/confdialog.cxx:13409 msgid "Modem/CW/CAT Keying" msgstr "Kluczowanie modemow/CW/CAT" #: src/dialogs/confdialog.cxx:13413 msgid "" "CW keying using CAT command strings. Available for supported transceivers.\n" "Use with RigCAT or flrig transceiver control. A separate serial port is NOT " "needed.\n" "\n" "Disable CAT PTT if transceiver interprets that as a keydown command (e.g. " "TS480).\n" "Recommend setting transceiver to either semi or full break-in.\n" "\n" "Enter correct CIV address for Icom transceivers." msgstr "" "CW przy użyciu ciągów poleceń CAT. Dostępne dla obsługiwanych " "transceiverow\n" "Używaj z kontrolą nadajnika RigCAT lub flrig. Oddzielny port szeregowy NIE " "jest potrzebny.\n" "\n" "Wyłącz CAT PTT, jeśli urządzenie nadawczo-odbiorcze interpretuje to jako " "polecenie keydown (np.TS480)\n" "\n" "Zaleca ustawienie transceiver na pół lub pełne włamanie" #: src/dialogs/confdialog.cxx:13424 msgid "Icom" msgstr "Icom" #: src/dialogs/confdialog.cxx:13429 msgid "Hex CIV addr" msgstr "Hex CIV adres" #: src/dialogs/confdialog.cxx:13430 msgid "Enter transceiver HEX CIV address" msgstr "Wpisz adres HEX CIV transceivera" #: src/dialogs/confdialog.cxx:13435 msgid "Elecraft" msgstr "Elecraft" #: src/dialogs/confdialog.cxx:13440 msgid "Kenwood" msgstr "Kenwood" #: src/dialogs/confdialog.cxx:13445 msgid "Yaesu" msgstr "Yaesu" #: src/dialogs/confdialog.cxx:13450 msgid "Disable CAT PTT" msgstr "Wylacz CAT PTT" #: src/dialogs/confdialog.cxx:13456 src/dialogs/confdialog.cxx:13458 msgid "Modem/CW/CAT keying" msgstr "Kluczowanie modemem/CW/CAT" #: src/dialogs/confdialog.cxx:13461 msgid "CW CAT & WinKeyer Compensation" msgstr "Kompensacja CW CAT i WinKeyer" #: src/dialogs/confdialog.cxx:13465 msgid "" "Compute timing compensation for CAT CW and WinKeyer CW. Computation at " "current\n" "WPM . Set WPM to nominal (suggest 20 WPM).\n" "\n" "Compensation will be good over a +/- 10 WPM range. Calibration/Test is 1 " "minute of\n" "'PARIS '." msgstr "" "Oblicz kompensację czasu dla CAT CW i WinKeyer CW. Obliczenia na prąd\n" "WPM . Ustaw WPM na nominalny (sugeruj 20 WPM).\n" "\n" "Kompensacja będzie dobra w zakresie +/- 10 WPM. Kalibracja/Test trwa 1 " "minutę\n" "„PARYŻ”." #: src/dialogs/confdialog.cxx:13473 msgid "Calibrate" msgstr "Kalibracja" #: src/dialogs/confdialog.cxx:13474 src/dialogs/confdialog.cxx:13489 msgid "Send WPM 'PARIS ' words" msgstr "Wyslij WPM 'PARIS ' słowa" #: src/dialogs/confdialog.cxx:13477 msgid "Compensate (secs)" msgstr "Kompensacja (sek.)" #: src/dialogs/confdialog.cxx:13485 msgid "Clear compensation" msgstr "Zeruj kompensacje" #: src/dialogs/confdialog.cxx:13488 src/dialogs/confdialog.cxx:14847 #: src/dialogs/confdialog.cxx:16157 src/dialogs/confdialog.cxx:16161 #: src/dialogs/confdialog.cxx:16165 src/dialogs/confdialog.cxx:16169 #: src/dialogs/confdialog.cxx:16173 src/dialogs/confdialog.cxx:16177 #: src/dialogs/confdialog.cxx:16181 src/dialogs/confdialog.cxx:18399 #: src/dialogs/confdialog.cxx:18428 src/dialogs/confdialog.cxx:18457 #: src/dialogs/confdialog.cxx:18486 src/dialogs/confdialog.cxx:18505 msgid "Test" msgstr "Test" #: src/dialogs/confdialog.cxx:13492 msgid "secs" msgstr "sek" #: src/dialogs/confdialog.cxx:13498 src/dialogs/confdialog.cxx:13500 msgid "Modem/CW/CAT comp'" msgstr "Modem/CW/CAT komp”" #: src/dialogs/confdialog.cxx:13503 src/dialogs/confdialog.cxx:13591 #: src/dialogs/confdialog.cxx:13593 msgid "Modem/DominoEX" msgstr "Modem/DominoEX" #: src/dialogs/confdialog.cxx:13507 src/dialogs/confdialog.cxx:15724 msgid "Secondary Text" msgstr "Drugi tekst" #: src/dialogs/confdialog.cxx:13508 src/dialogs/confdialog.cxx:15725 msgid "Text to send during keyboard idle times" msgstr "Tekst do wyslania, podczas bezczynnosci klawiatury" #: src/dialogs/confdialog.cxx:13522 src/dialogs/confdialog.cxx:15739 msgid "Filtering" msgstr "Filtracja" #: src/dialogs/confdialog.cxx:13523 msgid "Use DSP filter before decoder" msgstr "Uzyj filtru DSP przed dekoderem" #: src/dialogs/confdialog.cxx:13529 src/dialogs/confdialog.cxx:15746 msgid "Filter bandwidth factor" msgstr "Wspólczynnik przepustowosci filtru" #: src/dialogs/confdialog.cxx:13530 src/dialogs/confdialog.cxx:15747 msgid "Filter bandwidth relative to signal width" msgstr "Filtr przepustowosci wzgledem szerokosci sygnału" #: src/dialogs/confdialog.cxx:13548 msgid "FEC" msgstr "FEC" #: src/dialogs/confdialog.cxx:13549 msgid "Enable MultiPSK-compatible FEC" msgstr "Aktywuj MultiPSK zgodny z FEC" #: src/dialogs/confdialog.cxx:13554 src/dialogs/confdialog.cxx:15765 msgid "CWI threshold" msgstr "Próg CWI" #: src/dialogs/confdialog.cxx:13555 src/dialogs/confdialog.cxx:15766 msgid "CWI detection and suppression" msgstr "Wykrywanie i tłumienie CWI" #: src/dialogs/confdialog.cxx:13571 src/dialogs/confdialog.cxx:15801 msgid "Paths (hidden)" msgstr "Sciezki (ukryte)" #: src/dialogs/confdialog.cxx:13596 src/dialogs/confdialog.cxx:13736 #: src/dialogs/confdialog.cxx:13738 msgid "Modem/Feld Hell" msgstr "Modem/Feld Hell" #: src/dialogs/confdialog.cxx:13600 msgid "Hell Transmit Parameters" msgstr "Parametry TX Hell" #: src/dialogs/confdialog.cxx:13603 msgid "Transmit font" msgstr "Czcionka Tx" #: src/dialogs/confdialog.cxx:13604 msgid "Select TX raster font" msgstr "Wybierz czcionkę rastra TX" #: src/dialogs/confdialog.cxx:13620 msgid "Pulse shape" msgstr "Ksztalt impulsu" #: src/dialogs/confdialog.cxx:13621 msgid "Raised cosine pulse shape factor" msgstr "Podniesiony cosinus ksztaltu impulsu" #: src/dialogs/confdialog.cxx:13632 msgid "Slow (4 msec)|Med (2 msec)|Fast (1 msec)|Hard Keying" msgstr "Wolne (4 ms) | Sred (2 ms) | Szybkie (1 ms) | Trudne kluczowanie" #: src/dialogs/confdialog.cxx:13637 msgid "Transmit periods (.) when idle" msgstr "Nadawanie kropek (.) w czasie bezczynnosci" #: src/dialogs/confdialog.cxx:13638 msgid "Transmits a diddle dot when no keyboard activity" msgstr "Nadaje Diddle kropkę gdy nie aktywny klawisz" #: src/dialogs/confdialog.cxx:13644 msgid "Tx Width Multiplier" msgstr "Mnoznik szerokości Tx" #: src/dialogs/confdialog.cxx:13645 msgid "Range 1...3" msgstr "Zakres 1 ... 3" #: src/dialogs/confdialog.cxx:13659 msgid "Hell Receive Parameters" msgstr "Parametry Rx Hell" #: src/dialogs/confdialog.cxx:13662 msgid "Reverse video" msgstr "Negatyw Video" #: src/dialogs/confdialog.cxx:13663 msgid "Display RX in reverse video" msgstr "Wyswietl RX w odwrotnym wideo" #: src/dialogs/confdialog.cxx:13668 msgid "Marquee text" msgstr "Zaznaczony tekst" #: src/dialogs/confdialog.cxx:13669 msgid "Display RX as a scrolling marquee" msgstr "Wyswietl RX jako przewijana markize" #: src/dialogs/confdialog.cxx:13674 msgid "Rx Width Multiplier" msgstr "Rx Mnożnik szerokości" #: src/dialogs/confdialog.cxx:13675 msgid "Range 1...4" msgstr "Zakres 1 ... 4" #: src/dialogs/confdialog.cxx:13687 msgid "Rx Height in pixels" msgstr "Wysokosc Rx w pikselach" #: src/dialogs/confdialog.cxx:13688 msgid "May require resizing the Rx/Tx panel" msgstr "Moze wymagac zmiany rozmiaru panelu Rx/Tx" #: src/dialogs/confdialog.cxx:13700 msgid "Receive filter bandwidth" msgstr "Szerokosc filtru pasma odbioru" #: src/dialogs/confdialog.cxx:13701 msgid "Adjust the DSP bandwidth" msgstr "Regulacja pasma DSP" #: src/dialogs/confdialog.cxx:13721 msgid "Rx AGC" msgstr "Rx AGC" #: src/dialogs/confdialog.cxx:13722 msgid "1 - Slow, 2 - Medium, 3 - Fast" msgstr "1 - Wolny, 2 - Średni, 3 - Szybki" #: src/dialogs/confdialog.cxx:13741 src/dialogs/confdialog.cxx:13976 #: src/dialogs/confdialog.cxx:13978 msgid "Modem/FMT" msgstr "Modem/FMT" #: src/dialogs/confdialog.cxx:13745 msgid "Audio Stream Procesing" msgstr "Proces strumienia audio" #: src/dialogs/confdialog.cxx:13748 src/dialogs/confdialog.cxx:18717 msgid "Sample rate" msgstr "Częstotliwosc próbkowania" #: src/dialogs/confdialog.cxx:13749 msgid "FMT sample rate" msgstr "Częstotliwosc próbkowania FMT" #: src/dialogs/confdialog.cxx:13764 msgid "Rx Codec PPM" msgstr "Kodek Rx PPM" #: src/dialogs/confdialog.cxx:13765 msgid "Audio Codec ppm correction" msgstr "Korekcja kodeka audio ppm" #: src/dialogs/confdialog.cxx:13776 msgid "Tracking" msgstr "Sledzenie" #: src/dialogs/confdialog.cxx:13779 msgid "Bgnd" msgstr "" #: src/dialogs/confdialog.cxx:13780 msgid "Change plot background color" msgstr " Zmien kolor tła wydruku" #: src/dialogs/confdialog.cxx:13783 msgid "Unkn" msgstr "" #: src/dialogs/confdialog.cxx:13784 msgid "Change plot unknown track color" msgstr "Zmień kolor nieznanej ścieżki na wykresie" #: src/dialogs/confdialog.cxx:13787 msgid "Ref" msgstr "Ref" #: src/dialogs/confdialog.cxx:13788 msgid "Change plot reference track color" msgstr "Zmień kolor ścieżki odniesienia wykresu" #: src/dialogs/confdialog.cxx:13792 msgid "Change Axis' color" msgstr "Zmiana koloru osi" #: src/dialogs/confdialog.cxx:13795 msgid "Lgnd" msgstr "" #: src/dialogs/confdialog.cxx:13796 msgid "Change legend color" msgstr "Zmiana koloru legendy" #: src/dialogs/confdialog.cxx:13799 msgid "Line/Axis" msgstr "Linia/oś" #: src/dialogs/confdialog.cxx:13800 msgid "Enable to always plot data over axis" msgstr "Wlacz aby zawsze kreślic dane na osi" #: src/dialogs/confdialog.cxx:13805 msgid "Thick lines" msgstr "Grube linie" #: src/dialogs/confdialog.cxx:13806 msgid "Enable to plot track lines 3 pixels wide" msgstr "Wlacz druk linii scieżki o szerokosci 3 pikseli" #: src/dialogs/confdialog.cxx:13811 msgid "Freq Correction" msgstr "Korekta częstotliwosci" #: src/dialogs/confdialog.cxx:13812 msgid "Offset plot lines on vertical scale" msgstr "Linie dzialek offsetowych na skali pionowej" #: src/dialogs/confdialog.cxx:13821 src/dialogs/confdialog.cxx:18829 msgid "@|<" msgstr "" #: src/dialogs/confdialog.cxx:13825 src/dialogs/confdialog.cxx:18843 msgid "@>|" msgstr "" #: src/dialogs/confdialog.cxx:13829 msgid "Max Error" msgstr "Maksymalny Blad" #: src/dialogs/confdialog.cxx:13830 msgid "Limit freq estimate error to this value" msgstr "Ogranicz blad oszacowania Freq do tej wartosci" #: src/dialogs/confdialog.cxx:13841 msgid "DFT Estimator" msgstr "Estymator DFT" #: src/dialogs/confdialog.cxx:13844 msgid "Data Filter" msgstr "Filtr danych" #: src/dialogs/confdialog.cxx:13845 msgid "Moving average - average over NN seconds^0 - no averaging" msgstr "Srednia ruchoma - srednia ponad NN sekundy^0 - Brak uśredniania" #: src/dialogs/confdialog.cxx:13854 msgid "DFT rate" msgstr "Wskaznik DFT" #: src/dialogs/confdialog.cxx:13855 msgid "# DFT computations / second" msgstr "# Obliczenia DFT / Drugi" #: src/dialogs/confdialog.cxx:13872 msgid "FIR Filter" msgstr "Filtr FIR" #: src/dialogs/confdialog.cxx:13875 msgid "Width" msgstr "Szerokosc" #: src/dialogs/confdialog.cxx:13876 msgid "Band pass filter / unknown / reference" msgstr "Filtr pasma / nieznany / odniesienie" #: src/dialogs/confdialog.cxx:13886 msgid "bpf Unk'" msgstr "" #: src/dialogs/confdialog.cxx:13887 msgid "ON - band pass filter unknown signal" msgstr "ON - Filtr pasa nieznanego sygnalu" #: src/dialogs/confdialog.cxx:13892 msgid "bpf Ref'" msgstr "" #: src/dialogs/confdialog.cxx:13893 msgid "ON - band pass filter reference signal" msgstr "ON -Sygnał odniesienia do filtrowania pasma" #: src/dialogs/confdialog.cxx:13900 msgid "CSV Data Recording" msgstr "Nagrywanie danych CSV" #: src/dialogs/confdialog.cxx:13903 msgid "Auto record" msgstr "Auto zapis" #: src/dialogs/confdialog.cxx:13904 msgid "Automatically start csv data file recording with wav playback" msgstr "" "Automatyczne uruchamianie nagrywania pliku danych csv z odtwarzaniem wav" #: src/dialogs/confdialog.cxx:13908 msgid "Record data for NN minutes after auto start" msgstr "Rejestrowanie danych dla minut NN po automatycznym uruchomieniu" #: src/dialogs/confdialog.cxx:13918 msgid "Wav file recording" msgstr "Nagrywanie plików Wav" #: src/dialogs/confdialog.cxx:13921 msgid "Record Audio" msgstr "Nagrywanie Audio" #: src/dialogs/confdialog.cxx:13922 msgid "Wav file recording - START IMMEDIATELY" msgstr "Nagrywanie plików Wav - ZACZNIJ NATYCHMIAST" #: src/dialogs/confdialog.cxx:13927 msgid "Sync to data record" msgstr "Synchronizacja z rekordem danych" #: src/dialogs/confdialog.cxx:13928 msgid "Wav file recording - SYNCHRONIZE with data recording" msgstr "Nagrywanie plików Wav - SYNCHRONIZE z nagrywaniem danych" #: src/dialogs/confdialog.cxx:13933 msgid "File pathname:" msgstr "Nazwa scieżki pliku:" #: src/dialogs/confdialog.cxx:13934 msgid "Computer generated file name" msgstr "Nazwa pliku wygenerowanego komputerowo" #: src/dialogs/confdialog.cxx:13942 msgid "" "Shft-click: select unknown\n" "Ctrl-click: select reference" msgstr "" "Shft-click: wybierz nieznany\n" "Ctrl-click: wybierz odwołanie" #: src/dialogs/confdialog.cxx:13946 msgid "Center on Unknown" msgstr "Centrum na nieznanym" #: src/dialogs/confdialog.cxx:13947 msgid "Waterfall Centered on unknown signal" msgstr "Wodospad wysrodkowany na nieznanym sygnale" #: src/dialogs/confdialog.cxx:13952 msgid "Center on Reference" msgstr "Centruj w odniesieniu" #: src/dialogs/confdialog.cxx:13953 msgid "Waterfall centered on reference signal" msgstr "Wodospad wysrodkowany na sygnal odniesienia" #: src/dialogs/confdialog.cxx:13958 msgid "Center on median" msgstr "Centruj na medianie" #: src/dialogs/confdialog.cxx:13959 msgid "Waterfall centered 1/2 way between unknown & reference" msgstr "Wodospad wysrodkowany 1/2 drogi między nieznanym i odniesieniem" #: src/dialogs/confdialog.cxx:13968 msgid "Use TAB delimiters" msgstr "Użyj ogranicznikow TAB" #: src/dialogs/confdialog.cxx:13969 msgid "Use tab delimiters between columns on csv export file." msgstr "Użyj ogranicznikow kart między kolumnami w pliku eksportu csv." #: src/dialogs/confdialog.cxx:13981 src/dialogs/confdialog.cxx:14192 #: src/dialogs/confdialog.cxx:14194 msgid "Modem/FSQ" msgstr "Modem/FSQ" #: src/dialogs/confdialog.cxx:13985 msgid "Rx Parameters" msgstr "Parametry Rx" #: src/dialogs/confdialog.cxx:13988 msgid "Min Hits" msgstr "Min. Liczba trafień" #: src/dialogs/confdialog.cxx:13989 msgid "Minimum # hits in tone detector" msgstr "Minimum # sygnalu detektora" #: src/dialogs/confdialog.cxx:14000 msgid "Image LPF" msgstr "Obraz LPF" #: src/dialogs/confdialog.cxx:14001 msgid "Narrow LPF if image noisy" msgstr "Wąskie LPF, gdy obraz zaklocony" #: src/dialogs/confdialog.cxx:14007 msgid "MovAvg:" msgstr "" #: src/dialogs/confdialog.cxx:14008 msgid "Filter FFT output" msgstr "Filtr wyjściowy FFT" #: src/dialogs/confdialog.cxx:14020 msgid "Heard aging" msgstr "Stacje słyszane" #: src/dialogs/confdialog.cxx:14021 msgid "Remove call after ..." msgstr "Usuwanie rozmowy po..." #: src/dialogs/confdialog.cxx:14029 src/dialogs/confdialog.cxx:14201 msgid "Tx Parameters" msgstr "Parametry TX" #: src/dialogs/confdialog.cxx:14032 msgid "1.5 baud" msgstr "1.5 baud" #: src/dialogs/confdialog.cxx:14037 msgid "2 baud" msgstr "2 baud" #: src/dialogs/confdialog.cxx:14042 msgid "3 baud" msgstr "3 baud" #: src/dialogs/confdialog.cxx:14047 msgid "4.5 baud" msgstr "4.5 baud" #: src/dialogs/confdialog.cxx:14052 msgid "6 baud" msgstr "6 baud" #: src/dialogs/confdialog.cxx:14057 src/dialogs/confdialog.cxx:15873 msgid "Center freq" msgstr "Centruj czestot" #: src/dialogs/confdialog.cxx:14063 msgid "Sounder" msgstr "Sygnalizator" #: src/dialogs/confdialog.cxx:14064 msgid "Send beacon every ..." msgstr "Nadaj sygnal co..." #: src/dialogs/confdialog.cxx:14070 msgid "Time out" msgstr "Limit czasu" #: src/dialogs/confdialog.cxx:14071 msgid "Time out xmt attempt in XX seconds" msgstr "Limit czasu xmt proba w XX sekund" #: src/dialogs/confdialog.cxx:14081 msgid "QTC:" msgstr "QTC:" #: src/dialogs/confdialog.cxx:14082 msgid "Enter QTC text" msgstr "Wstaw QTC tekst" #: src/dialogs/confdialog.cxx:14086 #, fuzzy #| msgid "MYCALL always lower case" msgid "MYCALL lower case" msgstr "Nadaj malymi literami" #: src/dialogs/confdialog.cxx:14087 src/dialogs/confdialog.cxx:14221 msgid "convert operator callsign to lower case" msgstr "konwertuj znak stacji na wielkie litery" #: src/dialogs/confdialog.cxx:14092 msgid "QTH:" msgstr "QTH:" #: src/dialogs/confdialog.cxx:14093 src/dialogs/confdialog.cxx:17235 msgid "Operators QTH" msgstr "QTH operatorów" #: src/dialogs/confdialog.cxx:14109 msgid "Message Logging" msgstr "Rejestrowanie komunikatow" #: src/dialogs/confdialog.cxx:14112 msgid "Add date/time" msgstr "Dodaj datę / czas" #: src/dialogs/confdialog.cxx:14113 msgid "Add date/time stamp to each # received message" msgstr "Dodaj do kazdej wiadomosci data/czas" #: src/dialogs/confdialog.cxx:14119 msgid "always append to file(s)" msgstr "zawsze dołącz plik(i)" #: src/dialogs/confdialog.cxx:14120 msgid "append # directive msgs to named file" msgstr "dolacz # dyrektywe msgs do pliku o podanej nazwie" #: src/dialogs/confdialog.cxx:14126 msgid "Notify time out" msgstr "Poinformuj o przekroczeniu czasu" #: src/dialogs/confdialog.cxx:14127 msgid "Notification dialog closes after XX seconds;^j0 == dialog remains open" msgstr "" "Okno powiadomień zamyka się po XX sekundach;^j0 == dialog pozostaje otwarty" #: src/dialogs/confdialog.cxx:14142 src/dialogs/confdialog.cxx:14243 msgid "Audit log" msgstr "Log audytu" #: src/dialogs/confdialog.cxx:14145 src/dialogs/confdialog.cxx:14156 #: src/dialogs/confdialog.cxx:14246 src/dialogs/confdialog.cxx:14257 #: src/dialogs/confdialog.cxx:16335 src/dialogs/confdialog.cxx:18394 #: src/dialogs/confdialog.cxx:18423 src/dialogs/confdialog.cxx:18452 #: src/dialogs/confdialog.cxx:18481 src/dialogs/confdialog.cxx:18508 #: src/dialogs/confdialog.cxx:18634 msgid "Enable" msgstr "Wlacz" #: src/dialogs/confdialog.cxx:14153 src/dialogs/confdialog.cxx:14254 msgid "Heard log" msgstr "Log nasłuchu" #: src/dialogs/confdialog.cxx:14166 msgid "Text Colors" msgstr "Kolor tekstu" #: src/dialogs/confdialog.cxx:14170 msgid "Transmit text" msgstr "Nadaj tekst" #: src/dialogs/confdialog.cxx:14175 msgid "DIRECTED" msgstr "SKIEROWANY" #: src/dialogs/confdialog.cxx:14176 msgid "Directed received text" msgstr "Dekoduj odebr. tekst" #: src/dialogs/confdialog.cxx:14181 msgid "UNDIRECTED" msgstr "BEZKIERUNKOWY" #: src/dialogs/confdialog.cxx:14182 msgid "Undirected received text" msgstr "Nieukierunkowany odebrany tekst" #: src/dialogs/confdialog.cxx:14197 src/dialogs/confdialog.cxx:14279 #: src/dialogs/confdialog.cxx:14281 msgid "Modem/IFKP" msgstr "Modem/IFKP" #: src/dialogs/confdialog.cxx:14204 msgid "1/2 speed" msgstr "1/2 predkosci" #: src/dialogs/confdialog.cxx:14209 msgid "1x speed" msgstr "1x prędkosc" #: src/dialogs/confdialog.cxx:14210 msgid "default" msgstr "domyslne" #: src/dialogs/confdialog.cxx:14215 msgid "2x speed" msgstr "2x prędkosc" #: src/dialogs/confdialog.cxx:14220 msgid "MYCALL always lower case" msgstr "Nadaj malymi literami" #: src/dialogs/confdialog.cxx:14226 msgid "CALLSIGN always lower case" msgstr "ZNAK zawsze male litery" #: src/dialogs/confdialog.cxx:14227 msgid "convert other callsign to lower case" msgstr "konwertuj znak stacji na male litery" #: src/dialogs/confdialog.cxx:14232 msgid "lock WF at 1500 Hz" msgstr "blokuj WF na 1500 Hz" #: src/dialogs/confdialog.cxx:14233 msgid "Always transmit at 1500 Hertz center freq." msgstr "Zawsze nadawaj na czestotl. 1500 Hz." #: src/dialogs/confdialog.cxx:14267 #, fuzzy #| msgid "Operator Call" msgid "" "\n" "Operator avatar" msgstr "Operator stacji" #: src/dialogs/confdialog.cxx:14284 src/dialogs/confdialog.cxx:14353 #: src/dialogs/confdialog.cxx:14355 msgid "Modem/MT-63" msgstr "Modem/MT-63" #: src/dialogs/confdialog.cxx:14291 src/dialogs/confdialog.cxx:14550 msgid "8-bit extended characters (UTF-8)" msgstr "8-bitowe znaki rozszerzone (UTF-8)" #: src/dialogs/confdialog.cxx:14292 msgid "Enable this for UTF-8 characters" msgstr "Aktywuj to do znaków UTF-8" #: src/dialogs/confdialog.cxx:14298 msgid "Long receive integration" msgstr "Dlugi odbiór integracji" #: src/dialogs/confdialog.cxx:14299 msgid "Enable for very weak signals" msgstr "Wlacz dla bardzo slabych sygnalów" #: src/dialogs/confdialog.cxx:14309 msgid "Transmit lower start tone" msgstr "Nadaj nizszy ton startu" #: src/dialogs/confdialog.cxx:14314 msgid "Transmit upper start tone" msgstr "Nadaj wyzszy ton startu" #: src/dialogs/confdialog.cxx:14320 msgid "Tone Duration (secs)" msgstr "Czas trwania tonu (sek)" #: src/dialogs/confdialog.cxx:14336 msgid "Low tone at 500 Hz" msgstr "Niski ton przy 500 Hz" #: src/dialogs/confdialog.cxx:14341 msgid "Centered at 1500 Hz (SHARES)" msgstr "Wyśrodkowane na 1500 Hz (SHARES)" #: src/dialogs/confdialog.cxx:14346 msgid "Manual tuning" msgstr "Strojenie ręczne" #: src/dialogs/confdialog.cxx:14358 src/dialogs/confdialog.cxx:14454 #: src/dialogs/confdialog.cxx:14456 msgid "Modem/Contestia" msgstr "Modem/Contestia" #: src/dialogs/confdialog.cxx:14364 src/dialogs/confdialog.cxx:14465 msgid "Bandwidth" msgstr "Przepustowosc" #: src/dialogs/confdialog.cxx:14365 src/dialogs/confdialog.cxx:14466 msgid "Select bandwidth" msgstr "Wybierz pasmo" #: src/dialogs/confdialog.cxx:14381 src/dialogs/confdialog.cxx:14482 msgid "Tones" msgstr "Dzwięki" #: src/dialogs/confdialog.cxx:14382 src/dialogs/confdialog.cxx:14483 msgid "Select number of tones" msgstr "Wybierz liczbe tonów" #: src/dialogs/confdialog.cxx:14398 src/dialogs/confdialog.cxx:14499 msgid "Receive synchronizer" msgstr "Synchronizuj Rx" #: src/dialogs/confdialog.cxx:14401 src/dialogs/confdialog.cxx:14502 msgid "Tune margin (tone frequency spacing)" msgstr "Margines Strojenia (rozstaw częstotliwosci sygnalów)" #: src/dialogs/confdialog.cxx:14402 src/dialogs/confdialog.cxx:14421 #: src/dialogs/confdialog.cxx:14503 src/dialogs/confdialog.cxx:14523 msgid "Change ONLY to experiment" msgstr "Zmiana ta tylko do eksperymentowania" #: src/dialogs/confdialog.cxx:14420 src/dialogs/confdialog.cxx:14522 msgid "Integration period (FEC blocks)" msgstr "Okres integracji (bloki FEC)" #: src/dialogs/confdialog.cxx:14441 msgid "8-bit extended characters" msgstr "8-bitowe znaki rozszerzone" #: src/dialogs/confdialog.cxx:14442 msgid "Enable this for Latin-1 accented characters" msgstr "Ustaw to dla znaków diakrytycznych Latin-1" #: src/dialogs/confdialog.cxx:14446 src/dialogs/confdialog.cxx:14556 msgid "xmt start/stop tones" msgstr "ton nadawania start/stop" #: src/dialogs/confdialog.cxx:14447 src/dialogs/confdialog.cxx:14557 msgid "Enable this to send start/stop tones" msgstr "Włącz aby wysłać ton start/stop" #: src/dialogs/confdialog.cxx:14459 src/dialogs/confdialog.cxx:14564 #: src/dialogs/confdialog.cxx:14566 msgid "Modem/Olivia" msgstr "Modem/Olivia" #: src/dialogs/confdialog.cxx:14542 msgid "Reset FEC blocks when changing BW or Tones" msgstr "Zresetuj bloki FEC przy zmianie BW lub tonów" #: src/dialogs/confdialog.cxx:14543 src/dialogs/confdialog.cxx:14551 msgid "Enable this for UTF-8 character transmission" msgstr "Aktywuj transmisje znaków UTF-8" #: src/dialogs/confdialog.cxx:14569 src/dialogs/confdialog.cxx:14709 #: src/dialogs/confdialog.cxx:14711 msgid "Modem/Psk" msgstr "Modem/Psk" #: src/dialogs/confdialog.cxx:14573 msgid "AFC behavior" msgstr "Zachowanie AFC" #: src/dialogs/confdialog.cxx:14576 msgid "Acquisition search range (Hz)" msgstr "Zakres wyszukiwania (Hz)" #: src/dialogs/confdialog.cxx:14577 msgid "Capture signals within this frequency range" msgstr "Przechwytywanie sygnalów w tym zakresie częstotliwosci" #: src/dialogs/confdialog.cxx:14596 src/dialogs/confdialog.cxx:20095 msgid "Acquisition S/N (dB)" msgstr "Pozyskiwanie S/N (dB)" #: src/dialogs/confdialog.cxx:14597 src/dialogs/confdialog.cxx:20096 msgid "Capture signals over this threshold" msgstr "Przechwytywanie sygnalu ponad ten próg" #: src/dialogs/confdialog.cxx:14618 msgid "S/N and IMD behavior" msgstr "Zachowanie S/N i IMD" #: src/dialogs/confdialog.cxx:14621 msgid "after" msgstr "po" #: src/dialogs/confdialog.cxx:14622 msgid "Behavior of s/n imd" msgstr "Zachowanie s/n imd" #: src/dialogs/confdialog.cxx:14633 msgid "Dim" msgstr "Tlumik" #: src/dialogs/confdialog.cxx:14638 msgid "seconds" msgstr "sekund" #: src/dialogs/confdialog.cxx:14639 msgid "Will occur after this time in seconds" msgstr "Nastąpi po upływie tego czasu w sekundach" #: src/dialogs/confdialog.cxx:14659 msgid "Multi-Channel Signal Processing" msgstr "Wielokanalowa obróbka sygnalu" #: src/dialogs/confdialog.cxx:14662 msgid "Multi-channel detector" msgstr "Wielokanałowy detektor" #: src/dialogs/confdialog.cxx:14667 msgid "Disable on very slow CPUs or if signal browser is not used" msgstr "" "Wyłącz na bardzo wolnych procesorach lub jeśli przeglądarka sygnału nie jest " "używana" #: src/dialogs/confdialog.cxx:14672 msgid "8 psk" msgstr "8 psk" #: src/dialogs/confdialog.cxx:14675 msgid "Pilot tone" msgstr "Sygnal pilota" #: src/dialogs/confdialog.cxx:14676 msgid "Enable encode/decode vestigial pilot tone" msgstr "Wlacz kodowanie/dekodowanie szczatkowego sygnalu pilota" #: src/dialogs/confdialog.cxx:14681 msgid "pilot power (dB)" msgstr "zasilanie pilota (dB)" #: src/dialogs/confdialog.cxx:14682 msgid "Pilot tone power relative to signal" msgstr "Moc sygnału pilota w stosunku do sygnału" #: src/dialogs/confdialog.cxx:14701 msgid "Short Preamble" msgstr "Kr. sekwencja wstępna" #: src/dialogs/confdialog.cxx:14702 msgid "Enable short preamble for 8PSK transmission" msgstr "Aktywuj transmisje znaków 8PSK" #: src/dialogs/confdialog.cxx:14714 src/dialogs/confdialog.cxx:14852 #: src/dialogs/confdialog.cxx:14854 msgid "Modem/TTY/Rx" msgstr "Modem/TTY/Rx" #: src/dialogs/confdialog.cxx:14721 msgid "AFC speed" msgstr "Prędkosc AFC" #: src/dialogs/confdialog.cxx:14722 msgid "AFC tracking speed" msgstr "Predkosc sledzenia AFC" #: src/dialogs/confdialog.cxx:14738 msgid "RX - unshift on space" msgstr "Przesuniecie Rx" #: src/dialogs/confdialog.cxx:14739 msgid "Revert to unshifted char's on a space" msgstr "Przywróc przesuniecie znaków" #: src/dialogs/confdialog.cxx:14744 msgid "Filter Shape Factor" msgstr "Wspólczynnik przepustowości filtru" #: src/dialogs/confdialog.cxx:14745 msgid "" "rcos timing coefficient:\n" "1.0 ... 2.0\n" "W1HKJ best 1.275\n" "DO2SMF best 1.500" msgstr "" "współczynnik czasu rcos:\n" "1.0 ... 2.0\n" "W1HKJ najlepsze 1.275\n" "DO2SMF najlepsze 1.500" #: src/dialogs/confdialog.cxx:14755 msgid "Decode (CWI suppression)" msgstr "Dekoduj (tłumienie CWI)" #: src/dialogs/confdialog.cxx:14758 msgid "Mark-Space" msgstr "Znak -Spacja" #: src/dialogs/confdialog.cxx:14763 msgid "Mark only" msgstr "Tylko znak" #: src/dialogs/confdialog.cxx:14768 msgid "Space only" msgstr "Tylko Spacja" #: src/dialogs/confdialog.cxx:14775 msgid "RTTY Scope Display" msgstr "Zakres wyswietlania RTTY" #: src/dialogs/confdialog.cxx:14778 msgid "Use cross hair scope" msgstr "Ustaw przekroczenie zakresu" #: src/dialogs/confdialog.cxx:14779 msgid "Default to cross hair digiscope" msgstr "Domyslnie do przekroczenia oscyloskopu" #: src/dialogs/confdialog.cxx:14784 msgid "XY - classic scope" msgstr "XY - klasyczny zakres" #: src/dialogs/confdialog.cxx:14785 msgid "" "Enabled - use Mark/Space filter outputs\n" "Disabled - use pseudo signals" msgstr "" "Aktywuj - uzyj Znak/Spacja filtr wyjsciowy\n" "Deaktywuj- uzyj pseudo sygnalów" #: src/dialogs/confdialog.cxx:14792 msgid "Log RTTY frequency" msgstr "Log częstotliwosci RTTY" #: src/dialogs/confdialog.cxx:14795 msgid "Use MARK freq'" msgstr "Ustaw ZNACZNIK czest'" #: src/dialogs/confdialog.cxx:14796 src/dialogs/confdialog.cxx:14816 #: src/dialogs/confdialog.cxx:14824 msgid "" "Enabled - log QSO using Mark frequency\n" "Disabled - log QSO using center frequency" msgstr "" "Aktywuj - zapis QSO uzywajac znacznika czestotliwosci\n" "Deaktywuj - zapis QSO uzywajac znacznika czestotliwosci" #: src/dialogs/confdialog.cxx:14803 msgid "track color" msgstr "kolor sciezki" #: src/dialogs/confdialog.cxx:14804 msgid "Color of Mark Track" msgstr "Kolor znacznika sciezki" #: src/dialogs/confdialog.cxx:14812 msgid "RTTY Bell" msgstr "RTTY Sygnatura" #: src/dialogs/confdialog.cxx:14815 msgid "Audible BELL" msgstr "Dzwiękowa Sygnatura" #: src/dialogs/confdialog.cxx:14823 msgid "Visible BELL" msgstr "Widoczna Sygnatura" #: src/dialogs/confdialog.cxx:14831 msgid "RTTY Bell audio wav" msgstr "RTTY dzwonek audio wav" #: src/dialogs/confdialog.cxx:14838 src/dialogs/confdialog.cxx:18385 #: src/dialogs/confdialog.cxx:18414 src/dialogs/confdialog.cxx:18443 #: src/dialogs/confdialog.cxx:18472 src/dialogs/confdialog.cxx:18496 msgid "Sound:" msgstr "Dźwięk:" #: src/dialogs/confdialog.cxx:14857 src/dialogs/confdialog.cxx:15028 #: src/dialogs/confdialog.cxx:15030 msgid "Modem/TTY/Tx" msgstr "Modem/TTY/Tx" #: src/dialogs/confdialog.cxx:14861 msgid "Sound Card FSK" msgstr "Karta dzwiekowa FSK" #: src/dialogs/confdialog.cxx:14864 src/dialogs/confdialog.cxx:15099 msgid "Carrier shift" msgstr "Przesunięcie nosnej" #: src/dialogs/confdialog.cxx:14865 msgid "Select carrier shift" msgstr "Wybierz przesunięcie nosnej" #: src/dialogs/confdialog.cxx:14880 msgid "Custom shift" msgstr "Wybrane przesuniecie" #: src/dialogs/confdialog.cxx:14881 msgid "Input carrier shift" msgstr "Przesuniecie nosnej" #: src/dialogs/confdialog.cxx:14899 src/dialogs/confdialog.cxx:15399 #: src/dialogs/confdialog.cxx:15553 msgid "Baud rate" msgstr "Szybkosc transmisji" #: src/dialogs/confdialog.cxx:14900 msgid "Select carrier baudrate" msgstr "Wybierz szybkosc transmisji" #: src/dialogs/confdialog.cxx:14916 msgid "Bits per character" msgstr "Bitów na znak" #: src/dialogs/confdialog.cxx:14917 msgid "Select # bits / char" msgstr "Wybierz # bity / znak" #: src/dialogs/confdialog.cxx:14932 msgid "Parity" msgstr "Parzystosc" #: src/dialogs/confdialog.cxx:14933 msgid "Select parity" msgstr "Wybierz parzystosc" #: src/dialogs/confdialog.cxx:14948 src/dialogs/confdialog.cxx:15415 #: src/dialogs/confdialog.cxx:15569 msgid "Stop bits" msgstr "Bity stopu" #: src/dialogs/confdialog.cxx:14949 msgid "Select # stop bits" msgstr "Wybierz # bity stopu" #: src/dialogs/confdialog.cxx:14964 msgid "AutoCRLF" msgstr "AutoCRLF" #: src/dialogs/confdialog.cxx:14965 msgid "Add CRLF after page width characters" msgstr "Dodaj CRLF po stronie szerokosci znaków" #: src/dialogs/confdialog.cxx:14970 msgid "chars" msgstr "znaki" #: src/dialogs/confdialog.cxx:14971 msgid "Auto CRLF line length" msgstr "Autom. długość linii CRLF" #: src/dialogs/confdialog.cxx:14989 msgid "CR-CR-LF" msgstr "CR-CR-LF" #: src/dialogs/confdialog.cxx:14990 msgid "Use \"cr cr lf\" for \"cr lf\"" msgstr "Ustaw \"cr cr lf\" dla \"cr lf\"" #: src/dialogs/confdialog.cxx:14996 msgid "TX - unshift on space" msgstr "Przesuniecie Tx" #: src/dialogs/confdialog.cxx:14997 msgid "Revert to Unsifted char's on a space" msgstr "Przywróc przesuniecie znaków" #: src/dialogs/confdialog.cxx:15002 msgid "Shaped Tx" msgstr "Uksztaltowany Tx" #: src/dialogs/confdialog.cxx:15003 msgid "Use wave shaping on Tx signal" msgstr "Uzyj wave na sygnał Tx" #: src/dialogs/confdialog.cxx:15009 msgid "Pseudo-FSK - right channel" msgstr "Pseudo-FSK prawy kanal" #: src/dialogs/confdialog.cxx:15010 msgid "Create keyed square wave on right audio channel" msgstr "Przebieg prostokątny na prawym kanale" #: src/dialogs/confdialog.cxx:15015 msgid "LTRS at start" msgstr "LTRS na starcie" #: src/dialogs/confdialog.cxx:15016 msgid "Insert NN LTRS bytes at start of each transmission" msgstr "Wstawianie bajtów NRS LTRS na początku każdej transmisji" #: src/dialogs/confdialog.cxx:15033 src/dialogs/confdialog.cxx:15135 #: src/dialogs/confdialog.cxx:15137 msgid "Modem/TTY/FSK" msgstr "Modem/TTY/FSK" #: src/dialogs/confdialog.cxx:15037 msgid "DTR/RTS signal line FSK" msgstr "Linia sygnałowa DTR/RTS FSK" #: src/dialogs/confdialog.cxx:15040 src/dialogs/notifydialog.cxx:112 msgid "Enabled" msgstr "Aktywne" #: src/dialogs/confdialog.cxx:15041 msgid "Enable FSK on serial port" msgstr "Włącz FSK na porcie szeregowym" #: src/dialogs/confdialog.cxx:15047 msgid "Shares RIGIO serial port, or uses" msgstr "Udostępnia port szeregowy RIGIO lub używa" #: src/dialogs/confdialog.cxx:15048 msgid "Share the RIGIO port" msgstr "Udostępnij port RIGIO" #: src/dialogs/confdialog.cxx:15054 msgid "Serial Port" msgstr "Port szeregowy" #: src/dialogs/confdialog.cxx:15055 msgid "FSK independent serial port" msgstr "Niezależny port szeregowy FSK" #: src/dialogs/confdialog.cxx:15069 msgid "MARK/SPACE reversed" msgstr "ZNAK/SPACJA odwrócona" #: src/dialogs/confdialog.cxx:15070 msgid "Reverse Mark/Space" msgstr "Odwróć znak/spację" #: src/dialogs/confdialog.cxx:15076 src/dialogs/confdialog.cxx:18252 msgid "Use DTR" msgstr "Ustaw DTR" #: src/dialogs/confdialog.cxx:15077 msgid "Enable DTR signal line, default is RTS" msgstr "Włącz linię sygnału DTR, domyślnie RTS" #: src/dialogs/confdialog.cxx:15084 msgid "" "Restart the FSK interface\n" "Necessary if changes made to configuration" msgstr "" "Zrestartuj interfejs FSK\n" "Niezbędne, jeśli dokonano zmian w konfiguracji" #: src/dialogs/confdialog.cxx:15088 msgid "Mark" msgstr "Znak" #: src/dialogs/confdialog.cxx:15089 msgid "Mark frequency in Hertz" msgstr "Oznacz częstotliwość w hercach" #: src/dialogs/confdialog.cxx:15100 msgid "Carrier shift in Hertz" msgstr "Zmiana przesuniecia w hercach" #: src/dialogs/confdialog.cxx:15115 msgid "1.5 stop bits" msgstr "1,5 Bity stopu" #: src/dialogs/confdialog.cxx:15116 msgid "" "Enabled - 1.5 stop bits\n" "Disabled - 2 stop bits" msgstr "" "Włączone - 1,5 bitu stopu\n" "Wyłączone - 2 bity stopu" #: src/dialogs/confdialog.cxx:15126 msgid "Use flrig FSK keying" msgstr "Użyj klucza FSK FLrig" #: src/dialogs/confdialog.cxx:15127 msgid "Enable to use flrig FSK keyer" msgstr "Włącz używanie klucza FSK FLrig" #: src/dialogs/confdialog.cxx:15140 src/dialogs/confdialog.cxx:15252 #: src/dialogs/confdialog.cxx:15254 msgid "Modem/TTY/nanoIO" msgstr "Modem/TTY/nanoIO" #: src/dialogs/confdialog.cxx:15163 msgid "Serial Baud" msgstr "Numer Baud" #: src/dialogs/confdialog.cxx:15178 msgid "USB serial I/O" msgstr "USB serial I/O" #: src/dialogs/confdialog.cxx:15199 msgid "MARK polarity" msgstr "Polaryzacja znaku" #: src/dialogs/confdialog.cxx:15200 msgid "" "Set - mark logical HIGH\n" "Read from nanoIO" msgstr "" "Zestaw - znacznik logiczny wysoki\n" "odczyt z nanoIO" #: src/dialogs/confdialog.cxx:15205 msgid "TTY Baud" msgstr "TTY Baud" #: src/dialogs/confdialog.cxx:15206 msgid "nanoIO - TTY baud" msgstr "nanoIO - TTY baud" #: src/dialogs/confdialog.cxx:15222 msgid "Debug Output" msgstr "Wyjscie debugowania" #: src/dialogs/confdialog.cxx:15232 msgid "Clear Sent" msgstr "Wyczysc Wyslane" #: src/dialogs/confdialog.cxx:15235 msgid "Clear Both" msgstr "Wyczysc Both" #: src/dialogs/confdialog.cxx:15238 msgid "Clear Rcvd" msgstr "Czysc Rcvd" #: src/dialogs/confdialog.cxx:15247 msgid "TTY i/o" msgstr "TTY i/o" #: src/dialogs/confdialog.cxx:15248 msgid "Enable TTY operation" msgstr "Włącz obsługe TTY" #: src/dialogs/confdialog.cxx:15257 src/dialogs/confdialog.cxx:15485 #: src/dialogs/confdialog.cxx:15487 msgid "Modem/TTY/Navigator" msgstr "Modem/TTY/Navigator" #: src/dialogs/confdialog.cxx:15261 msgid "FSK Interface" msgstr "Interfejs FSK" #: src/dialogs/confdialog.cxx:15265 msgid "Navigator serial port" msgstr "Port szeregowy nawigatora" #: src/dialogs/confdialog.cxx:15279 msgid "FSK" msgstr "FSK" #: src/dialogs/confdialog.cxx:15280 msgid "Connect / Disconnect from Nav FSK port" msgstr "Połącz / rozłącz z portem Nav FSK" #: src/dialogs/confdialog.cxx:15285 src/dialogs/confdialog.cxx:15550 msgid "Configuration Interface" msgstr "Konfiguracja interfejsu" #: src/dialogs/confdialog.cxx:15289 msgid "Navigator configuration port" msgstr "Nawigator konfiguracja portu" #: src/dialogs/confdialog.cxx:15303 msgid "Channel 1 Attenuator" msgstr "Tłumik kanału 1" #: src/dialogs/confdialog.cxx:15304 msgid "Nav Channel 1 attenuator" msgstr "Tłumik kanału nawigacyjnego 1" #: src/dialogs/confdialog.cxx:15319 msgid "Channel 2 attenuator" msgstr "Tłumik kanału 2" #: src/dialogs/confdialog.cxx:15320 msgid "NavChannel 2 Attenuator" msgstr "Tłumik kanalu nawigacyjnego 2" #: src/dialogs/confdialog.cxx:15335 msgid "RF attenuator" msgstr "Tłumik RF" #: src/dialogs/confdialog.cxx:15336 msgid "NavRF Attenuator" msgstr "Tłumik NavRF" #: src/dialogs/confdialog.cxx:15351 msgid "WinKey PTT" msgstr "WinKey PTT" #: src/dialogs/confdialog.cxx:15352 src/dialogs/confdialog.cxx:15586 msgid "NavWinkey PTT" msgstr "NavWinkey PTT" #: src/dialogs/confdialog.cxx:15367 msgid "LED brightness" msgstr "Jasność LED" #: src/dialogs/confdialog.cxx:15368 msgid "NavLED brightness" msgstr "Jasność NavLED" #: src/dialogs/confdialog.cxx:15383 msgid "CAT LED state" msgstr "Status CAT LED" #: src/dialogs/confdialog.cxx:15384 msgid "NavCAT state LED" msgstr "Dioda stanu NavCAT" #: src/dialogs/confdialog.cxx:15400 src/dialogs/confdialog.cxx:15554 msgid "Nav FSK baud rate" msgstr "Szybkość transmisji FSK Nav" #: src/dialogs/confdialog.cxx:15416 src/dialogs/confdialog.cxx:15570 msgid "Nav FSK Stop bits" msgstr "Bity stopu nawigatora FSK" #: src/dialogs/confdialog.cxx:15431 src/dialogs/confdialog.cxx:15601 msgid "Mark Polarity" msgstr "Znak polaryzacji" #: src/dialogs/confdialog.cxx:15432 src/dialogs/confdialog.cxx:15602 msgid "Nav FSK MARK Polarity" msgstr "Nav FSK MARK Polarity" #: src/dialogs/confdialog.cxx:15447 msgid "Side tone" msgstr "Ton boczny" #: src/dialogs/confdialog.cxx:15448 src/dialogs/confdialog.cxx:15618 #: src/dialogs/confdialog.cxx:15634 msgid "Nav FSK side tone" msgstr "Ton boczny FSK nawigatora" #: src/dialogs/confdialog.cxx:15463 msgid "FSK PTT" msgstr "FSK PTT" #: src/dialogs/confdialog.cxx:15464 msgid "Nav FSK PTT - should always be on" msgstr "Nav FSK PTT - powinien zawsze być włączony" #: src/dialogs/confdialog.cxx:15479 msgid "Config" msgstr "Konfiguruj" #: src/dialogs/confdialog.cxx:15480 msgid "Connect / Disconnect from Nav Config port" msgstr "Polacz / rozłacz z Port Nav Config" #: src/dialogs/confdialog.cxx:15490 src/dialogs/confdialog.cxx:15516 #: src/dialogs/confdialog.cxx:15518 msgid "Modem/TTY/Synop" msgstr "Modem/TTY/Synop" #: src/dialogs/confdialog.cxx:15494 msgid "SYNOP to ADIF" msgstr "SYNOP do ADIF" #: src/dialogs/confdialog.cxx:15495 msgid "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to ADIF log file" msgstr "Dekoduje komunikaty SYNOP (Ex: German Weather Service) do pliku ADIF" #: src/dialogs/confdialog.cxx:15501 msgid "SYNOP to KML" msgstr "SYNOP do KML" #: src/dialogs/confdialog.cxx:15502 msgid "" "Decodes SYNOP messages (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" msgstr "" "Dekoduje komunikaty SYNOP (Ex: Deutsche Wetterdienst) to KML documents (Ex: " "Google Earth)" #: src/dialogs/confdialog.cxx:15509 msgid "Interleave SYNOP and text" msgstr "Przeplot SYNOP i tekstu" #: src/dialogs/confdialog.cxx:15510 msgid "Interleave text with decoded SYNOP messages, or replacement." msgstr "Przeplataj tekst dekodowanej wiadomosci SYNOP, lub wymiany." #: src/dialogs/confdialog.cxx:15521 src/dialogs/confdialog.cxx:15715 #: src/dialogs/confdialog.cxx:15717 msgid "Modem/TTY/Winkeyer 3" msgstr "Modem/TTY/Winkeyer 3" #: src/dialogs/confdialog.cxx:15525 msgid "Serial Interface" msgstr "Interfejs szeregowy" #: src/dialogs/confdialog.cxx:15585 msgid "FSK port" msgstr "FSK port" #: src/dialogs/confdialog.cxx:15633 msgid "Auto CRLF" msgstr "Auto CRLF" #: src/dialogs/confdialog.cxx:15649 msgid "Diddle" msgstr "Lopatki" #: src/dialogs/confdialog.cxx:15650 msgid "Diddle On/OFF" msgstr "Lopatki wl/wyl" #: src/dialogs/confdialog.cxx:15665 msgid "Diddle char" msgstr "Lopatki char" #: src/dialogs/confdialog.cxx:15666 msgid "Diddle character" msgstr "Lopatki znak" #: src/dialogs/confdialog.cxx:15681 msgid "USOS" msgstr "USOS" #: src/dialogs/confdialog.cxx:15682 src/dialogs/confdialog.cxx:15698 msgid "Unshift on space" msgstr "Unshift na przestrzeni" #: src/dialogs/confdialog.cxx:15697 msgid "Echo" msgstr "Echo" #: src/dialogs/confdialog.cxx:15720 src/dialogs/confdialog.cxx:15833 #: src/dialogs/confdialog.cxx:15835 msgid "Modem/Thor" msgstr "Modem/Thor" #: src/dialogs/confdialog.cxx:15740 msgid "Enable DSP prior to decoder" msgstr "Wlacz DSP przed dekoderem" #: src/dialogs/confdialog.cxx:15782 msgid "Preamble Detection" msgstr "Wykrywanie preambuły" #: src/dialogs/confdialog.cxx:15783 msgid "" "Detect the THOR preamble\n" "Clear the Rx pipeline" msgstr "" "Wykrywa preambułe THOR\n" "Wyczysc potok Rx" #: src/dialogs/confdialog.cxx:15788 msgid "Soft-symbol decoding" msgstr "Dekodowanie symbolów" #: src/dialogs/confdialog.cxx:15789 msgid "" "Use soft-decision decoding for symbol detection\n" "Assists soft-bit decoding" msgstr "" "Użyj soft-decision dekodowanie do wykrywania symboli\n" "Wspomaga dekodowanie soft-bit" #: src/dialogs/confdialog.cxx:15794 msgid "Soft-bit decoding" msgstr "Dekodowanie Soft-bitowe" #: src/dialogs/confdialog.cxx:15795 msgid "" "Use soft-bit viterbi decoding for better Forward Error Correction\n" "Works best with soft-symbol decoding enabled" msgstr "" "Uzyj soft- bit Viterbi dekodowania dla lepszej korekcji bledów\n" "Najlepiej aktywuj z dekodowaniem symboli" #: src/dialogs/confdialog.cxx:15821 #, fuzzy #| msgid "Operator Call" msgid "" "\n" "Operator Avatar" msgstr "Operator stacji" #: src/dialogs/confdialog.cxx:15838 src/dialogs/confdialog.cxx:15853 #: src/dialogs/confdialog.cxx:15855 msgid "Modem/Navtex" msgstr "Modem/Navtex" #: src/dialogs/confdialog.cxx:15842 msgid "Log Navtex messages to Adif file" msgstr "Zapisz info do pliku ADIF" #: src/dialogs/confdialog.cxx:15847 msgid "Log Navtex messages to KML" msgstr "Zapisz info NAVTEX do KML" #: src/dialogs/confdialog.cxx:15848 msgid "" "Logs messages to Keyhole Markup Language (Google Earth, Marble, Gaia, etc...)" msgstr "" "Log komunikatów do Języka Znaczników Keyhole (Google Earth, Marble, Gaia, " "itp...)" #: src/dialogs/confdialog.cxx:15858 src/dialogs/confdialog.cxx:15979 #: src/dialogs/confdialog.cxx:15981 msgid "Modem/Wefax" msgstr "Modem/Wefax" #: src/dialogs/confdialog.cxx:15862 msgid "Frequency shift" msgstr "Przesunięcie częstotliwosci " #: src/dialogs/confdialog.cxx:15863 msgid "" "Frequency shift of WEFAX signal\n" "Nominal 800 Hz" msgstr "" "Przesunięcie częstotliwosci sygnału WEFAX\n" "Nominalnie 800 Hz" #: src/dialogs/confdialog.cxx:15874 msgid "" "Center of WEFAX signal\n" "Nominal 1900 Hz" msgstr "" "Środek sygnału WEFAX\n" "Nominalnie 1900 Hz" #: src/dialogs/confdialog.cxx:15884 msgid "Max Image Rows" msgstr "Maks. liczba wierszy obrazu" #: src/dialogs/confdialog.cxx:15885 msgid "Force save split image" msgstr "Wymuś zapisanie podzielonego obrazu" #: src/dialogs/confdialog.cxx:15895 msgid "Fax images destination directory" msgstr "Katalog docelowy obrazów Faxu" #: src/dialogs/confdialog.cxx:15896 msgid "Store images in this directory" msgstr "Przechowuj obrazy w tym katalogu" #: src/dialogs/confdialog.cxx:15901 msgid "Directory..." msgstr "Katalog..." #: src/dialogs/confdialog.cxx:15902 msgid "Select destination directory" msgstr "Wybierz katalog docelowy" #: src/dialogs/confdialog.cxx:15905 msgid "Log Wefax messages to Adif file" msgstr "Zapisz info Wefax do pliku Adif" #: src/dialogs/confdialog.cxx:15906 msgid "Sent and received faxes are logged to Adif file." msgstr "Wysłane i odebrane faksy są zapisane w pliku Adif." #: src/dialogs/confdialog.cxx:15911 src/dialogs/notifydialog.cxx:128 msgid "Filter" msgstr "Filtr" #: src/dialogs/confdialog.cxx:15917 msgid "Enable Auto-align after" msgstr "Włącz automatyczne wyrównywanie po" #: src/dialogs/confdialog.cxx:15927 msgid "Stop Auto-align after" msgstr "Zatrzymaj automatyczne wyrównywanie po" #: src/dialogs/confdialog.cxx:15937 msgid "Auto-align every" msgstr "Automatyczne wyrównywanie każdego" #: src/dialogs/confdialog.cxx:15947 src/dialogs/confdialog.cxx:15950 #: src/dialogs/confdialog.cxx:15953 msgid "rows" msgstr "wiersze" #: src/dialogs/confdialog.cxx:15956 msgid "Correlation" msgstr "Korelacja" #: src/dialogs/confdialog.cxx:15957 msgid "" "Row-to-row correlation\n" "Used to detect presence of WEFAX signal\n" "Lower: more false detections" msgstr "" "Korelacja wiersz-wiersz\n" "Służy do wykrywania obecności sygnalu WEFAX\n" "Niższe: więcej fałszywych wykryc" #: src/dialogs/confdialog.cxx:15968 msgid "# Correlation rows" msgstr "# Rzędy korelacji" #: src/dialogs/confdialog.cxx:15969 msgid "Compute correlation factor over this # rows" msgstr "Oblicz współczynnik korelacji dla tego # rzędu" #: src/dialogs/confdialog.cxx:15984 src/dialogs/confdialog.cxx:16185 #: src/dialogs/confdialog.cxx:16187 msgid "Misc/Autostart" msgstr "Rózne/Autostart" #: src/dialogs/confdialog.cxx:15988 msgid "flrig:" msgstr "flrig:" #: src/dialogs/confdialog.cxx:15989 msgid "Enter full path-filename for flrig" msgstr "Wpisz pełna sciezke, do pliku flirg" #: src/dialogs/confdialog.cxx:16003 msgid "Locate flrig executable" msgstr "Szukaj flrig exe" #: src/dialogs/confdialog.cxx:16006 msgid "flamp:" msgstr "flamp:" #: src/dialogs/confdialog.cxx:16007 msgid "Enter full path-filename for flamp" msgstr "Wpisz pełna sciezke, pliku flmsg" #: src/dialogs/confdialog.cxx:16021 msgid "Locate flamp executable" msgstr "Szukaj flamp exe" #: src/dialogs/confdialog.cxx:16024 msgid "flnet:" msgstr "flnet:" #: src/dialogs/confdialog.cxx:16025 msgid "Enter full path-filename for flnet" msgstr "Wpisz pełna sciezke, pliku flmsg" #: src/dialogs/confdialog.cxx:16039 msgid "Locate flnet executable" msgstr "Szukaj flnet exe" #: src/dialogs/confdialog.cxx:16042 msgid "fllog:" msgstr "fllog:" #: src/dialogs/confdialog.cxx:16043 msgid "Enter full path-filename for fllog" msgstr "Wpisz pełna sciezke, pliku flmsg" #: src/dialogs/confdialog.cxx:16057 msgid "Locate fllog executable" msgstr "Szukaj fllog exe" #: src/dialogs/confdialog.cxx:16060 msgid "Prog 1:" msgstr "Prog 1:" #: src/dialogs/confdialog.cxx:16061 src/dialogs/confdialog.cxx:16079 #: src/dialogs/confdialog.cxx:16097 msgid "Enter full path-filename for external program" msgstr "Wpisz pełna sciezke, pliku flmsg" #: src/dialogs/confdialog.cxx:16075 msgid "Locate program #1 executable" msgstr "Szukaj program #1 exe" #: src/dialogs/confdialog.cxx:16078 msgid "Prog 2:" msgstr "Prog 2:" #: src/dialogs/confdialog.cxx:16093 msgid "Locate program #2 executable" msgstr "Szukaj program #2 exe" #: src/dialogs/confdialog.cxx:16096 msgid "Prog 3:" msgstr "Prog 3:" #: src/dialogs/confdialog.cxx:16111 msgid "Locate program #3 executable" msgstr "Szukaj program #3 exe" #: src/dialogs/confdialog.cxx:16114 msgid "" "Enable\n" "-" msgstr "" "Wlacz\n" "-" #: src/dialogs/confdialog.cxx:16115 src/dialogs/confdialog.cxx:16122 #: src/dialogs/confdialog.cxx:16128 src/dialogs/confdialog.cxx:16134 #: src/dialogs/confdialog.cxx:16140 src/dialogs/confdialog.cxx:16146 #: src/dialogs/confdialog.cxx:16152 msgid "Enable this entry when fldigi first starts" msgstr "Włącz przy pierwszym uruchomieniu Fldigi" #: src/dialogs/confdialog.cxx:16158 msgid "Start flrig" msgstr "Start flrig" #: src/dialogs/confdialog.cxx:16162 msgid "Start flamp" msgstr "Start flamp" #: src/dialogs/confdialog.cxx:16166 msgid "Start flnet" msgstr "Start flnet" #: src/dialogs/confdialog.cxx:16170 msgid "Start fllog" msgstr "Start fllog" #: src/dialogs/confdialog.cxx:16174 msgid "Start prog1" msgstr "Start prog1" #: src/dialogs/confdialog.cxx:16178 msgid "Start prog2" msgstr "Start prog2" #: src/dialogs/confdialog.cxx:16182 msgid "Start prog3" msgstr "Start prog3" #: src/dialogs/confdialog.cxx:16190 src/dialogs/confdialog.cxx:16200 #: src/dialogs/confdialog.cxx:16202 msgid "Misc/CPU" msgstr "Rozne/CPU" #: src/dialogs/confdialog.cxx:16194 msgid "Slow CPU (less than 700MHz)" msgstr "Powolny CPU ( mniej niż 700MHz )" #: src/dialogs/confdialog.cxx:16195 msgid "Enable if you're computer does not decode properly" msgstr "Ustaw gdy komputer nie dekoduje poprawnie" #: src/dialogs/confdialog.cxx:16205 src/dialogs/confdialog.cxx:16215 #: src/dialogs/confdialog.cxx:16217 msgid "Misc/DTMF" msgstr "Rózne/DTMF" #: src/dialogs/confdialog.cxx:16209 msgid "Decode DTMF tones" msgstr "Dekoduj sygnały DTMF" #: src/dialogs/confdialog.cxx:16210 msgid "Decode received DTMF tones" msgstr "Dekoduj odebr. sygnały DTMF" #: src/dialogs/confdialog.cxx:16220 src/dialogs/confdialog.cxx:16323 #: src/dialogs/confdialog.cxx:16325 msgid "Misc/KML" msgstr "Rózne/KML" #: src/dialogs/confdialog.cxx:16224 msgid "KML files directory" msgstr "Katalog plików KML" #: src/dialogs/confdialog.cxx:16225 msgid "Where generated KML documents are stored." msgstr "Wygenerowane dokumenty KML są przechowywane." #: src/dialogs/confdialog.cxx:16230 msgid "KML root file" msgstr "Główny plik KML" #: src/dialogs/confdialog.cxx:16234 msgid "Minimum distance for splitting aliases (Meters)" msgstr "Minimalny dystans dla aliasów podzialu (w metrach)" #: src/dialogs/confdialog.cxx:16235 msgid "Minimum distance for splitting alias nodes (Meters)" msgstr "Minimalny dystans dla węzłów aliasów ( Metry )" #: src/dialogs/confdialog.cxx:16245 msgid "Data retention time, in hours (0 for no limit)" msgstr "Czas retencji danych, w godzinach (0 oznacza brak limitu )" #: src/dialogs/confdialog.cxx:16246 msgid "" "Number of hours data is kept for each node. Zero means keeping everything." msgstr "" "Liczba godzin przechowywania danych dla węzła. Zero oznacza, utrzymuj " "wszystko." #: src/dialogs/confdialog.cxx:16255 msgid "KML refresh interval (seconds)" msgstr "KML częst. odswiezania ( sek )" #: src/dialogs/confdialog.cxx:16256 msgid "Refresh time interval written in KML file (Seconds)" msgstr "Odswiez przedzial czasu zapisu w pliku KML (w sekundach)" #: src/dialogs/confdialog.cxx:16272 msgid "KML balloon display style" msgstr "Styl balonu wyswietlania KML" #: src/dialogs/confdialog.cxx:16273 msgid "KML balloon in plain text, or HTML, in plain tables or matrices." msgstr "" "KML balon w postaci zwykłego tekstu lub HTML, w prostych tabelach lub " "macierzach." #: src/dialogs/confdialog.cxx:16288 msgid "Command run on KML creation" msgstr "Komenda tworzenia pliku KML" #: src/dialogs/confdialog.cxx:16289 msgid "" "Command started when KML files are generated. Subprocesses are started once, " "and restarted if needed." msgstr "" "Komenda startuje, gdy generowane są pliki KML. Podprocesy są uruchamiane " "raz, a w razie potrzeby ponownie." #: src/dialogs/confdialog.cxx:16295 msgid "Test command" msgstr "Testuj polecenie" #: src/dialogs/confdialog.cxx:16296 msgid "Execute command on KML files." msgstr "Wykonaj polecenie na pliku KML." #: src/dialogs/confdialog.cxx:16299 msgid "Change dir..." msgstr "Zmien kat..." #: src/dialogs/confdialog.cxx:16300 msgid "Choose directory to store KML documents" msgstr "Wybierz katalog do przechowywania dokumentów KML" #: src/dialogs/confdialog.cxx:16303 msgid "Cleanup KML data now !" msgstr "Oczysc dane KML teraz!" #: src/dialogs/confdialog.cxx:16304 msgid "Cleanups KML documents, empties Google Earth display." msgstr "Wyświetl dokumenty KML, Google Earth." #: src/dialogs/confdialog.cxx:16307 msgid "Cleanup on startup" msgstr "Wyczysc przy starcie" #: src/dialogs/confdialog.cxx:16308 msgid "Empties KML documents when starting program." msgstr "Usuwa dokumenty KML podczas uruchamiania programu." #: src/dialogs/confdialog.cxx:16315 msgid "KML server enabled (On / Off)" msgstr "Wlaczony serwer KML (On / Off)" #: src/dialogs/confdialog.cxx:16316 msgid "Uncheck if KML is never used" msgstr "Usuń zaznaczenie pola wyboru, jeśli KML nigdy nie jest używany" #: src/dialogs/confdialog.cxx:16328 src/dialogs/confdialog.cxx:16410 #: src/dialogs/confdialog.cxx:16412 msgid "Misc/NBEMS interface" msgstr "Interfejs Rózne/NBEMS" #: src/dialogs/confdialog.cxx:16332 msgid "NBEMS data file interface" msgstr "Plik danych interfejsu NBEMS" #: src/dialogs/confdialog.cxx:16336 msgid "Extract files for use with external \"wrap / flmsg\" program" msgstr "Wypakuj pliki do uzycia zewnętrznym programem (wrap/flmsg)" #: src/dialogs/confdialog.cxx:16341 msgid "Open message folder" msgstr "Otwórz folder wiadomosci" #: src/dialogs/confdialog.cxx:16342 msgid "Opens NBEMS file folder upon successful capture" msgstr "Otwórz folder pliku NBEMS po pomyslnym przechwyceniu" #: src/dialogs/confdialog.cxx:16349 msgid "Reception of flmsg files" msgstr "Odbiór pliku flmsg" #: src/dialogs/confdialog.cxx:16352 msgid "Open with flmsg" msgstr "Otwórz w flmsg" #: src/dialogs/confdialog.cxx:16353 msgid "Open message with flmsg" msgstr "Otwórz wiadomosc z flmsg" #: src/dialogs/confdialog.cxx:16358 msgid "Open in browser" msgstr "Otwórz w przeglądarce" #: src/dialogs/confdialog.cxx:16359 msgid "Open file with default browser" msgstr "Otwórz plik w domyslnej przeglądarce" #: src/dialogs/confdialog.cxx:16364 msgid "flmsg:" msgstr "flmsg:" #: src/dialogs/confdialog.cxx:16365 msgid "Enter full path-filename for flmsg" msgstr "Wpisz pełna sciezke, nazwe pliku flmsg" #: src/dialogs/confdialog.cxx:16378 msgid "Locate flmsg" msgstr "Szukaj flmsg" #: src/dialogs/confdialog.cxx:16382 msgid "Timeout (secs)" msgstr "Limit czasu ( sek )" #: src/dialogs/confdialog.cxx:16383 msgid "Extract times out after NN seconds of inactivity." msgstr "" "Skasuj tekst kanalu po\n" "sekund bezczynności." #: src/dialogs/confdialog.cxx:16396 msgid "" "Selection of transfer direct takes precedence\n" "over all other flmsg reception settings" msgstr "" "Transfer bezposredni ma pierszenstwo\n" "przed wszystkimi innymi ustawieniami odbioru flmsg" #: src/dialogs/confdialog.cxx:16400 msgid "Transfer direct to executing flmsg" msgstr "Bezposredni transfer do flmsg" #: src/dialogs/confdialog.cxx:16401 msgid "Send data stream directly to executing flmsg" msgstr "Wysylanie strumienia danych bezpośrednio do flmsg" #: src/dialogs/confdialog.cxx:16415 src/dialogs/confdialog.cxx:16493 #: src/dialogs/confdialog.cxx:16495 msgid "Misc/PSK reporter" msgstr "Rózne/PSK reporter" #: src/dialogs/confdialog.cxx:16419 msgid "Automatically spot callsigns in decoded text" msgstr "Automatyczne spoty stacji w zdekodowanym tekscie" #: src/dialogs/confdialog.cxx:16420 msgid "Parse all incoming text" msgstr "Analizuj wszystkie przychodzące teksty" #: src/dialogs/confdialog.cxx:16425 msgid "Send reception report when logging a QSO" msgstr "Wyslij raport podczas zapisu QSO" #: src/dialogs/confdialog.cxx:16426 msgid "Send report only when QSO is logged" msgstr "Wyslij raport tylko wtedy, gdy zalogowano QSO" #: src/dialogs/confdialog.cxx:16431 msgid "Report rig frequency (enable only if you have rig control!)" msgstr "Sprawdzaj czestotliwosc poprzez rig ( tylko gdy masz Rig!)" #: src/dialogs/confdialog.cxx:16432 msgid "Include the transmit frequency" msgstr "Obejmuje czestotliwosc nadawania" #: src/dialogs/confdialog.cxx:16437 msgid "Disable spotting when signal browser(s) are not visible." msgstr "Wylacz na wolnym CPU gdy sygnał przeglądarki nie jest używany." #: src/dialogs/confdialog.cxx:16438 msgid "Check to reduce CPU load in PSK and RTTY modes." msgstr "Sprawdz, by zmniejszyc obciązenie procesora w trybie PSK i RTTY." #: src/dialogs/confdialog.cxx:16444 msgid "Log on to pskrep when starting fldigi" msgstr "Zaloguj się do pskrep po uruchomieniu fldigi" #: src/dialogs/confdialog.cxx:16445 msgid "Automatically start psk reporter socket connection" msgstr "Automatycznie uruchom połączenie z portem psk reportera" #: src/dialogs/confdialog.cxx:16455 msgid "Host:" msgstr "Host:" #: src/dialogs/confdialog.cxx:16456 msgid "To whom the connection is made" msgstr "Z kim polaczenie zostanie nawiązane" #: src/dialogs/confdialog.cxx:16470 msgid "Port:" msgstr "Port:" #: src/dialogs/confdialog.cxx:16471 msgid "Using UDP port #" msgstr "Korzystaj z portu UDP #" #: src/dialogs/confdialog.cxx:16486 msgid "Initialize the socket client" msgstr "Inicjacja gniazda klienta" #: src/dialogs/confdialog.cxx:16489 msgid "" msgstr "" #: src/dialogs/confdialog.cxx:16498 src/dialogs/confdialog.cxx:16668 #: src/dialogs/confdialog.cxx:16670 msgid "Misc/PSM" msgstr "Rózne/PSM" #: src/dialogs/confdialog.cxx:16505 msgid "Allow TX After Signal Detection (Secs)" msgstr "Zezwalaj na TX po wykryciu sygnalu (s)" #: src/dialogs/confdialog.cxx:16506 msgid "Allow transmits after 'N' seconds of a signal detection." msgstr "Nadaj po \"N\" sekund od wykrycia sygnału." #: src/dialogs/confdialog.cxx:16516 msgid "Enable Busy Channel" msgstr "Włącz kanał zajety" #: src/dialogs/confdialog.cxx:16517 msgid "Enable to inhibit TX on signal Detections" msgstr "Wstrzymaj TX na wykrytym sygnale" #: src/dialogs/confdialog.cxx:16523 msgid "TX Buffer Flush Timer (Mins, 0=Disable)" msgstr "Opróznij bufor TX (Minut, 0=Wylacz)" #: src/dialogs/confdialog.cxx:16524 msgid "" "Flushes the TX buffer after x period when Busy Channel remains on (TX " "inhibited)" msgstr "" "Oprózniaj bufor TX po okresie zajetosci kanału gdy zajęty kanał pozostaje wl " "(TX zablokowany)" #: src/dialogs/confdialog.cxx:16535 msgid "Modem Bandwidth Margins " msgstr "Margines przepustowosci modemu " #: src/dialogs/confdialog.cxx:16536 msgid "Monitor signals in modem bandwitdh plus margins." msgstr "Monitor sygnalu, zakres i marginesy." #: src/dialogs/confdialog.cxx:16546 msgid "Valid Signal Sample Period (msecs)" msgstr "Prawidłowy okres próbkowania sygnału (msek)" #: src/dialogs/confdialog.cxx:16547 msgid "Valid signal sample period in Milliseconds" msgstr "Okres probkowania sygnalu w milisekundach" #: src/dialogs/confdialog.cxx:16562 msgid "Enable CSMA" msgstr "Wlacz CSMA" #: src/dialogs/confdialog.cxx:16563 msgid "Carrier Sense Mulitiple Access" msgstr "Carrier Sense mulitiple Dostęp" #: src/dialogs/confdialog.cxx:16568 msgid "Persistance" msgstr "Trwalosc" #: src/dialogs/confdialog.cxx:16569 msgid "Used to adjust the aggressiveness of TX" msgstr "Stosowane, aby skorygowac agresywnosc TX" #: src/dialogs/confdialog.cxx:16579 msgid "Slot Time" msgstr "Slot czasowy" #: src/dialogs/confdialog.cxx:16580 msgid "Non transmit window after a transmit period" msgstr "Widok okna nadawania po okresie nadawania" #: src/dialogs/confdialog.cxx:16590 msgid "Transmit Data Delay" msgstr "Opoznienie transmisji" #: src/dialogs/confdialog.cxx:16591 msgid "Idle transmit before data sent" msgstr "Czas przed wysłaniem danych" #: src/dialogs/confdialog.cxx:16601 src/dialogs/confdialog.cxx:16605 msgid "MilliSeconds" msgstr "MiliSekund" #: src/dialogs/confdialog.cxx:16602 src/dialogs/confdialog.cxx:16610 msgid "Displays the Slot Time in Milliseconds" msgstr "Wyswietl czas w milisekundach" #: src/dialogs/confdialog.cxx:16606 msgid "Displays the Transmit Delay in Milliseconds" msgstr "Wyswietl opóznienie nadawania w milisekundach" #: src/dialogs/confdialog.cxx:16609 msgid "Percent (%)" msgstr "Procent (%)" #: src/dialogs/confdialog.cxx:16618 msgid "Enable Histogram" msgstr "Wlacz Histogram" #: src/dialogs/confdialog.cxx:16619 msgid "Enable Histogram threshold signal monitoring" msgstr "Wlacz Histogram monitorowania sygnalu" #: src/dialogs/confdialog.cxx:16624 msgid "PSM Histogram Threshold" msgstr "Histogram Progu PSM" #: src/dialogs/confdialog.cxx:16625 msgid "Sets the theshold level to x value above the noise level" msgstr "Ustaw poziom na wartość x theshold powyzej poziomu halasu" #: src/dialogs/confdialog.cxx:16640 msgid "PSM Attenuate" msgstr "PSM złagodzenie" #: src/dialogs/confdialog.cxx:16641 msgid "Adjust sensitivity by 1/N fractional values." msgstr "Regulacja czułosci przez wartosci ulamkowe 1/N." #: src/dialogs/confdialog.cxx:16657 msgid "Show and enable Power Signal Monitor button (PSM)" msgstr "Pokaz i włącz przycisk zasilania monitora sygnalu (PSM)" #: src/dialogs/confdialog.cxx:16658 msgid "display PSM button on main dialog" msgstr "przycisk Display PSM na glówne okno" #: src/dialogs/confdialog.cxx:16665 msgid "Default Settings" msgstr "Ustawienia domyslne" #: src/dialogs/confdialog.cxx:16673 src/dialogs/confdialog.cxx:16705 #: src/dialogs/confdialog.cxx:16707 msgid "Misc/Rx text capture" msgstr "Rózne/Przechwytuj tekst Rx" #: src/dialogs/confdialog.cxx:16677 msgid "Talker Socket (MS only)" msgstr "Gniazdo głosowe (tylko MS)" #: src/dialogs/confdialog.cxx:16680 msgid "Talker" msgstr "Głos" #: src/dialogs/confdialog.cxx:16684 msgid "Connect/disconnect to Talker socket server" msgstr "Podlaczanie/odlaczanie do serwera gniazda talker" #: src/dialogs/confdialog.cxx:16687 msgid "Auto connect when fldigi opens (server must be up)" msgstr "Aktywuj podczas startu fldigi (serwer musi byc uruchomiony )" #: src/dialogs/confdialog.cxx:16694 msgid "Capture rx text to external file" msgstr "Przechwytuj tekst rx do zewnętrznego pliku" #: src/dialogs/confdialog.cxx:16697 msgid "Enable rx text stream" msgstr "Aktywuj transmisje tekstu rx" #: src/dialogs/confdialog.cxx:16698 msgid "Send rx text to file: textout.txt" msgstr "Wyslij tekst rx do pliku: textout.txt" #: src/dialogs/confdialog.cxx:16710 src/dialogs/confdialog.cxx:16748 #: src/dialogs/confdialog.cxx:16750 msgid "Misc/Save Parameters" msgstr "Różne/zapisz parametry" #: src/dialogs/confdialog.cxx:16714 msgid "Transmit level control" msgstr "Kontrola poziomu transmisji" #: src/dialogs/confdialog.cxx:16715 msgid "Save transmit level control by mode" msgstr "Zapisz kontrolę poziomu transmisji według trybu" #: src/dialogs/confdialog.cxx:16721 msgid "Squelch level/activated control(s)" msgstr "Poziom blokady szumów/aktywowane elementy sterujące" #: src/dialogs/confdialog.cxx:16722 msgid "Save Squelch level and state by mode" msgstr "Zapisz poziom i stan blokady szumów według trybu" #: src/dialogs/confdialog.cxx:16728 #, fuzzy #| msgid "Enable specific parameter to Save & Restore on a per mode basis." msgid "Enable specific parameter to Save & Restore on a per mode/band basis." msgstr "" "Włącz określony parametr do zapisywania i przywracania dla poszczególnych " "trybów." #: src/dialogs/confdialog.cxx:16734 msgid "AFC control" msgstr "Kontrola AFC" #: src/dialogs/confdialog.cxx:16735 msgid "Save AFC state by mode" msgstr "Zapisz stan AFC według trybu" #: src/dialogs/confdialog.cxx:16741 msgid "Reverse (Rv) control" msgstr "Sterowanie wsteczne (Rv)" #: src/dialogs/confdialog.cxx:16742 msgid "Save Reverse state by mode" msgstr "Zapisz stan odwrotny według trybu" #: src/dialogs/confdialog.cxx:16753 src/dialogs/confdialog.cxx:16837 #: src/dialogs/confdialog.cxx:16839 msgid "Misc/Sweet Spot" msgstr "Rózne/Ustalony Spot" #: src/dialogs/confdialog.cxx:16760 msgid "CW" msgstr "CW" #: src/dialogs/confdialog.cxx:16761 msgid "Default CW tracking point" msgstr "Domyslnie sledzenie punktu CW" #: src/dialogs/confdialog.cxx:16779 msgid "RTTY" msgstr "RTTY" #: src/dialogs/confdialog.cxx:16780 msgid "Default RTTY tracking point" msgstr "Domyslnie sledzenie punktu RTTY" #: src/dialogs/confdialog.cxx:16798 msgid "PSK et al." msgstr "PSK et al." #: src/dialogs/confdialog.cxx:16799 msgid "Default for all other modems" msgstr "Domyslnie dla wszystkich innych modemów" #: src/dialogs/confdialog.cxx:16817 msgid "Always start new modems at these frequencies" msgstr "Zawsze uruchom nowe modemy na tych czestotliwosciach" #: src/dialogs/confdialog.cxx:16818 msgid "" "ON - start at default\n" "OFF - keep current wf cursor position" msgstr "" "WL - rozpoczyna domyslnie\n" "WYL - zachowaj aktualna pozycje kursora" #: src/dialogs/confdialog.cxx:16826 msgid "K3 A1A configuation" msgstr "Konfiguruj Elecraft K3" #: src/dialogs/confdialog.cxx:16829 msgid "CW is LSB" msgstr "CW jako LSB" #: src/dialogs/confdialog.cxx:16830 msgid "" "Select this for Elecraft K3\n" "Other radios should not need it." msgstr "" "Wybierz te opcje, dla Elecraft K3\n" "Pozostale radia tego nie wymagaja." #: src/dialogs/confdialog.cxx:16842 src/dialogs/confdialog.cxx:17166 #: src/dialogs/confdialog.cxx:17168 msgid "Misc/TCP-IP sessions" msgstr "Rozne sesje TCP-IP" #: src/dialogs/confdialog.cxx:16850 msgid "Lock" msgstr "Wlacz" #: src/dialogs/confdialog.cxx:16851 msgid "Allow/Disallow Changes" msgstr "Zezwól/Blokuj Zmiany" #: src/dialogs/confdialog.cxx:16856 msgid "Enable ARQ" msgstr "Wlacz ARQ" #: src/dialogs/confdialog.cxx:16857 msgid "Used For PSKMail and FLDIGI Suite of Programs" msgstr "Uzywany pakiet programów dla PSKMail i fldigi" #: src/dialogs/confdialog.cxx:16864 msgid "Enable KISS" msgstr "Wlacz KISS" #: src/dialogs/confdialog.cxx:16865 msgid "Used for BPQ32" msgstr "Uzyte do BPQ32" #: src/dialogs/confdialog.cxx:16872 msgid "" "Enable ARQ for programs that support TCP and FLDIGI ARQ protocol.\n" "Enable KISS for programs that supports TCP/UDP and TNC-2 KISS protocol.\n" "Only one interface (ARQ/KISS) can be active at any given time.\n" "KISS/ARQ/XML Addr/Port changes require program restart." msgstr "" "Włacz ARQ dla programów obsługujących protokól TCP i fldigi ARQ\n" "Włacz KISS dla programów, które wspiera UDP i TNC -2 KISS protokol\n" "Tylko jeden interfejs (ARQ /KISS) może byc aktywny w danym czasie.\n" "Zmiana adresu IP i numeru portu wymaga restartu fldigi." #: src/dialogs/confdialog.cxx:16879 msgid "KISS" msgstr "KISS" #: src/dialogs/confdialog.cxx:16882 src/dialogs/confdialog.cxx:16999 #: src/dialogs/confdialog.cxx:17051 src/dialogs/confdialog.cxx:17098 #: src/dialogs/confdialog.cxx:17140 src/dialogs/confdialog.cxx:17352 msgid "Addr" msgstr "Adres" #: src/dialogs/confdialog.cxx:16883 msgid "" "IP Address for KISS interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:16899 msgid "I/O" msgstr "I/O" #: src/dialogs/confdialog.cxx:16900 src/dialogs/confdialog.cxx:17017 #: src/dialogs/confdialog.cxx:17069 src/dialogs/confdialog.cxx:17116 #: src/dialogs/confdialog.cxx:17149 src/dialogs/confdialog.cxx:17369 msgid "IP Address Port Number" msgstr "Adres IP Numeru portu" #: src/dialogs/confdialog.cxx:16916 msgid "Output port number when same IP address used" msgstr "Wyjscie numeru portu, gdy jest ten sam adres IP" #: src/dialogs/confdialog.cxx:16931 msgid "DP" msgstr "DP" #: src/dialogs/confdialog.cxx:16932 msgid "Enable when both programs are using the same IP address" msgstr "Aktywuj, gdy oba programy uzywają tego samego adresu IP" #: src/dialogs/confdialog.cxx:16938 src/dialogs/confdialog.cxx:17037 #: src/dialogs/confdialog.cxx:17084 msgid "Restart" msgstr "Restart" #: src/dialogs/confdialog.cxx:16942 msgid "Start" msgstr "Start" #: src/dialogs/confdialog.cxx:16943 msgid "Return KISS TCP IO connection to a Listening state" msgstr "Powrotne polaczenie KISS TCP IO w nasluchu" #: src/dialogs/confdialog.cxx:16952 msgid "TCP/IP" msgstr "TCP/IP" #: src/dialogs/confdialog.cxx:16953 msgid "Check to enable TCP/IP IO Connection" msgstr "Odhacz, aby wlaczyc połączenie TCP/IP IO" #: src/dialogs/confdialog.cxx:16959 msgid "UDP/IP" msgstr "UDP/IP" #: src/dialogs/confdialog.cxx:16960 msgid "Check to enable UDP/IP IO" msgstr "Odhacz, aby wlaczyc UDP/IP IO" #: src/dialogs/confdialog.cxx:16966 msgid "Listen / Bind" msgstr "Słuchaj/Powiaz" #: src/dialogs/confdialog.cxx:16967 msgid "Monitor for TCP connection." msgstr "Monitor polaczenia TCP." #: src/dialogs/confdialog.cxx:16973 msgid "Inhibit 7bit Modem" msgstr "Wstrzymaj 7-bitowy Modem" #: src/dialogs/confdialog.cxx:16974 msgid "Inhibit 7 bit modem change notice on user or RSID reception" msgstr "Wstrzymaj 7-bitowy modem na komende użytkownika lub recepcje RSID" #: src/dialogs/confdialog.cxx:16980 msgid "Auto Connect / Retry" msgstr "Auto polacz/ wznow" #: src/dialogs/confdialog.cxx:16981 msgid "Connect to host program on FLDIGI start up" msgstr "Podłącz do hosta programu przy starcie FLDIGI" #: src/dialogs/confdialog.cxx:16987 msgid "AX25 Decode" msgstr "Dekoduj AX25" #: src/dialogs/confdialog.cxx:16988 msgid "Decode AX25 Packets into human readable form" msgstr "Dekodowania pakietów AX25 w postaci czytelnej dla czlowieka" #: src/dialogs/confdialog.cxx:16996 msgid "ARQ" msgstr "ARQ" #: src/dialogs/confdialog.cxx:17000 msgid "" "IP Address for ARQ interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:17043 msgid "XML" msgstr "XML" #: src/dialogs/confdialog.cxx:17052 msgid "" "IP Address for XMLRPC interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:17090 msgid "flrig" msgstr "flrig" #: src/dialogs/confdialog.cxx:17099 src/dialogs/confdialog.cxx:17353 msgid "" "IP Address for flrig interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:17131 src/dialogs/confdialog.cxx:17155 #: src/dialogs/confdialog.cxx:17383 msgid "Reconnect" msgstr "Podłącz ponownie" #: src/dialogs/confdialog.cxx:17137 msgid "fllog" msgstr "fllog" #: src/dialogs/confdialog.cxx:17141 msgid "" "IP Address for fllog interface\n" "IP Address format: nnn.nnn.nnn.nnn\n" "or name: i.e. localhost" msgstr "" "IP Adres dla flrig interface\n" "IP Adres format: nnn.nnn.nnn.nnn\n" "lub nazwa: czyli localhost" #: src/dialogs/confdialog.cxx:17172 src/dialogs/confdialog.cxx:17323 #: src/dialogs/confdialog.cxx:17325 msgid "Operator-Station" msgstr "Operator Stacji" #: src/dialogs/confdialog.cxx:17177 msgid "Station Callsign:" msgstr "Znak stacji:" #: src/dialogs/confdialog.cxx:17178 msgid "Station callsign" msgstr "Znak stacji" #: src/dialogs/confdialog.cxx:17191 msgid "Operator Callsign:" msgstr "Operator stacji:" #: src/dialogs/confdialog.cxx:17192 msgid "Operator callsign (if different than station callsign)" msgstr "Znak operatora (jeśli jest inny niz znak wywolawczy stacji)" #: src/dialogs/confdialog.cxx:17206 msgid "Operator Name:" msgstr "Imię operatora:" #: src/dialogs/confdialog.cxx:17207 msgid "Operators name" msgstr "Imiona operatorów" #: src/dialogs/confdialog.cxx:17220 msgid "Antenna:" msgstr "Antena:" #: src/dialogs/confdialog.cxx:17221 msgid "Short description of antenna" msgstr "Krótki opis anteny" #: src/dialogs/confdialog.cxx:17234 #, fuzzy #| msgid "Station LOC" msgid "Station City:" msgstr "Lok Stacji" #: src/dialogs/confdialog.cxx:17249 msgid "Station Locator:" msgstr "Lokator Stacji:" #: src/dialogs/confdialog.cxx:17250 msgid "Maidenhead locator as in EM64qv" msgstr "Lokator na przykład JO93xq" #: src/dialogs/confdialog.cxx:17263 #, fuzzy #| msgid "State / Provinces" msgid "State/Prov./Country" msgstr "Stan / Prowincje" #: src/dialogs/confdialog.cxx:17264 msgid "US States / Canadian Provinces" msgstr "Stany Zjednoczone / Prowincje kanadyjskie" #: src/dialogs/confdialog.cxx:17281 msgid "Abbreviation for State/Province" msgstr "Skrót Stanu/ Prowincji" #: src/dialogs/confdialog.cxx:17293 msgid "Counties / Regions" msgstr "Powiaty / regiony" #: src/dialogs/confdialog.cxx:17294 msgid "US/Canadian Counties / Regions" msgstr "Hrabstwa / regiony USA/Kanady" #: src/dialogs/confdialog.cxx:17311 msgid "Abbreviation for County/Region" msgstr "Skrót powiatu/regionu" #: src/dialogs/confdialog.cxx:17328 src/dialogs/confdialog.cxx:17426 #: src/dialogs/confdialog.cxx:17428 msgid "Rig Control/flrig" msgstr "Sterowanie Rig/flrig" #: src/dialogs/confdialog.cxx:17332 msgid "" "\"Disable PTT keys modem if multiple instances of fldigi (client)\n" "are connected to a single flrig (server)." msgstr "" "\"Wylacz klucz PTT modemu, jesli uruchomiono fldigi (klient)\n" "i podłączono do jednego flrig (serwer)." #: src/dialogs/confdialog.cxx:17336 msgid "Flrig PTT keys modem" msgstr "Klucz modemu PTT w Flrig" #: src/dialogs/confdialog.cxx:17337 msgid "\" \"" msgstr "\" \"" #: src/dialogs/confdialog.cxx:17344 msgid "" "flrig xmlrpc server parameters\n" "these controls are mirrored on the IO configuration tab" msgstr "" "flrig xmlrpc parametry serwera\n" "formanty te są dublowane na karcie konfiguracji" #: src/dialogs/confdialog.cxx:17384 msgid "Press only if you change the address/port" msgstr "Nacisnij tylko wtedy, gdy zmienisz adres/port" #: src/dialogs/confdialog.cxx:17389 msgid "flrig is the preferred method of tranceiver control" msgstr "flrig jest to preferowana metoda sterowania tranceivera" #: src/dialogs/confdialog.cxx:17392 msgid "Enable flrig xcvr control with fldigi as client" msgstr "Włącz sterowanie Tx flrig z fldigi jako klient" #: src/dialogs/confdialog.cxx:17393 src/dialogs/confdialog.cxx:17399 msgid "Disable if flrig not used." msgstr "Wylacz, jesli flrig nie jest uzywany." #: src/dialogs/confdialog.cxx:17398 msgid "Shutdown flrig with fldigi" msgstr "Wylaczenie flrig z fldigi" #: src/dialogs/confdialog.cxx:17404 msgid "Poll Interval (msec)" msgstr "Interwał sondowania (msek)" #: src/dialogs/confdialog.cxx:17405 msgid "Request updates every 'poll interval' milliseconds" msgstr "Żądaj aktualizacji co „interwał sondowania” milisekund" #: src/dialogs/confdialog.cxx:17431 src/dialogs/confdialog.cxx:17634 #: src/dialogs/confdialog.cxx:17636 msgid "Rig Control/CAT (rigcat)" msgstr "Sterowanie Rig /CAT (rigcat)" #: src/dialogs/confdialog.cxx:17435 msgid "Use RigCAT" msgstr "Uzyj RigCAT" #: src/dialogs/confdialog.cxx:17436 msgid "RigCAT used for rig control" msgstr "RigCAT uzyty do sterowania" #: src/dialogs/confdialog.cxx:17443 msgid "Rig description file:" msgstr "Plik opisu Rig" #: src/dialogs/confdialog.cxx:17444 msgid "Use Open to select descriptor file" msgstr "Uzyj Otwórz, aby wybrac plik deskryptora" #: src/dialogs/confdialog.cxx:17450 msgid "Select rig descriptor file" msgstr "Wybierz plik deskryptora rig" #: src/dialogs/confdialog.cxx:17454 src/dialogs/confdialog.cxx:17940 #: src/dialogs/confdialog.cxx:18210 src/dialogs/confdialog.cxx:18551 msgid "Device:" msgstr "Port:" #: src/dialogs/confdialog.cxx:17469 src/dialogs/confdialog.cxx:17955 msgid "Retries" msgstr "Prób" #: src/dialogs/confdialog.cxx:17470 msgid "# retries before giving up" msgstr "# prób przed rezygnacja" #: src/dialogs/confdialog.cxx:17486 msgid "Retry interval (ms)" msgstr "Interwał ponawiania (ms)" #: src/dialogs/confdialog.cxx:17487 msgid "Time between retires in msec" msgstr "Czas między wycofaniem się w msek" #: src/dialogs/confdialog.cxx:17503 msgid "Write delay (ms)" msgstr "Opóznienia zapisu (ms)" #: src/dialogs/confdialog.cxx:17504 msgid "Wait for response to subsequent command" msgstr "Czekaj na odpowiedz do nastepnego polecenia" #: src/dialogs/confdialog.cxx:17520 src/dialogs/confdialog.cxx:18023 msgid "Baud rate:" msgstr "Szybkosc transmisji:" #: src/dialogs/confdialog.cxx:17536 src/dialogs/confdialog.cxx:18039 msgid "Stopbits" msgstr "Bity stopu" #: src/dialogs/confdialog.cxx:17556 msgid "Initialize RigCAT interface" msgstr "Inicjalizuj interfejs RigCAT" #: src/dialogs/confdialog.cxx:17560 msgid "Commands are echoed" msgstr "Polecenia są echem" #: src/dialogs/confdialog.cxx:17561 msgid "Rig or interface echos serial data" msgstr "Rig lub interfejs Echos portu szeregowego" #: src/dialogs/confdialog.cxx:17566 msgid "CAT command for PTT" msgstr "Komenda CAT dla PTT" #: src/dialogs/confdialog.cxx:17567 msgid "PTT is a CAT command (not hardware)" msgstr "PTT jest poleceniem CAT (nie sprzetu)" #: src/dialogs/confdialog.cxx:17573 msgid "Toggle RTS for PTT" msgstr "Ustaw RTS dla PTT" #: src/dialogs/confdialog.cxx:17574 msgid "RTS is ptt line" msgstr "RTS jest linia PTT" #: src/dialogs/confdialog.cxx:17579 msgid "Toggle DTR for PTT" msgstr "Ustaw DTR dla PTT" #: src/dialogs/confdialog.cxx:17580 msgid "DTR is ptt line" msgstr "DTR jest linia PTT" #: src/dialogs/confdialog.cxx:17585 msgid "RTS +12 v" msgstr "RTS +12 v" #: src/dialogs/confdialog.cxx:17586 src/dialogs/confdialog.cxx:18096 msgid "Initial state of RTS" msgstr "Początkowy stan RTS" #: src/dialogs/confdialog.cxx:17591 msgid "DTR +12 v" msgstr "DTR +12 v" #: src/dialogs/confdialog.cxx:17592 src/dialogs/confdialog.cxx:18090 msgid "Initial state of DTR" msgstr "Początkowy stan DTR" #: src/dialogs/confdialog.cxx:17597 src/dialogs/confdialog.cxx:18101 msgid "RTS/CTS flow control" msgstr "Sterowania przepływem RTS/CTS" #: src/dialogs/confdialog.cxx:17598 msgid "Rig uses RTS/CTS handshake" msgstr "Rig korzysta z RTS/CTS" #: src/dialogs/confdialog.cxx:17603 msgid "Restore UART Settings on Close" msgstr "Przywróc ustawienia UART przy zamknięciu" #: src/dialogs/confdialog.cxx:17604 msgid "Restore the serial (COM) port settings" msgstr "Przywróc ustawienia portu szeregowego (COM)" #: src/dialogs/confdialog.cxx:17609 msgid "VSP Enable" msgstr "Aktywuj VSP" #: src/dialogs/confdialog.cxx:17610 msgid "Virtual Serial Port Emulator - suppress WARNINGS" msgstr "Wirtualny Emulator Portu Szeregowego - brak ostrzezen" #: src/dialogs/confdialog.cxx:17615 msgid "Init delay (ms)" msgstr "Opóznienia zapisu (ms)" #: src/dialogs/confdialog.cxx:17616 msgid "Wait for response to first CAT command" msgstr "Czekaj na odpowiedz CAT" #: src/dialogs/confdialog.cxx:17639 src/dialogs/confdialog.cxx:17910 #: src/dialogs/confdialog.cxx:17912 msgid "Rig Control/GPIO" msgstr "Sterowanie Rig/GPIO" #: src/dialogs/confdialog.cxx:17643 msgid "Enable GPIO PTT (Pi specific controls)" msgstr "Wlacz GPIO PTT (kontrolki specyficzne dla Pi)" #: src/dialogs/confdialog.cxx:17644 src/dialogs/confdialog.cxx:17778 #: src/dialogs/confdialog.cxx:17785 src/dialogs/confdialog.cxx:17792 #: src/dialogs/confdialog.cxx:17799 src/dialogs/confdialog.cxx:17806 #: src/dialogs/confdialog.cxx:17813 src/dialogs/confdialog.cxx:17820 #: src/dialogs/confdialog.cxx:17827 src/dialogs/confdialog.cxx:17834 #: src/dialogs/confdialog.cxx:17841 src/dialogs/confdialog.cxx:17848 #: src/dialogs/confdialog.cxx:17855 src/dialogs/confdialog.cxx:17862 #: src/dialogs/confdialog.cxx:17869 src/dialogs/confdialog.cxx:17876 #: src/dialogs/confdialog.cxx:17883 src/dialogs/confdialog.cxx:17890 #: src/dialogs/confdialog.cxx:18263 msgid "Select PTT on state" msgstr "Wybierz PTT na stanie" #: src/dialogs/confdialog.cxx:17651 src/dialogs/confdialog.cxx:18270 msgid "Initialize the H/W PTT interface" msgstr "Inicjalizacja H/W interfejsu PTT" #: src/dialogs/confdialog.cxx:17654 src/dialogs/confdialog.cxx:17896 msgid "BCM GPIO pin Value" msgstr "BCM GPIO pin wartosc" #: src/dialogs/confdialog.cxx:17658 msgid "17 00 11" msgstr "17 00 11" #: src/dialogs/confdialog.cxx:17659 src/dialogs/confdialog.cxx:17666 #: src/dialogs/confdialog.cxx:17673 src/dialogs/confdialog.cxx:17680 #: src/dialogs/confdialog.cxx:17687 src/dialogs/confdialog.cxx:17694 #: src/dialogs/confdialog.cxx:17701 src/dialogs/confdialog.cxx:17708 #: src/dialogs/confdialog.cxx:17715 src/dialogs/confdialog.cxx:17722 #: src/dialogs/confdialog.cxx:17729 src/dialogs/confdialog.cxx:17736 #: src/dialogs/confdialog.cxx:17743 src/dialogs/confdialog.cxx:17750 #: src/dialogs/confdialog.cxx:17757 src/dialogs/confdialog.cxx:17764 #: src/dialogs/confdialog.cxx:17771 msgid "Select pin number" msgstr "Wybierz numer PIN" #: src/dialogs/confdialog.cxx:17665 msgid "18 01 12" msgstr "18 01 12" #: src/dialogs/confdialog.cxx:17672 msgid "27 02 13" msgstr "27 02 13" #: src/dialogs/confdialog.cxx:17679 msgid "22 03 15" msgstr "22 03 15" #: src/dialogs/confdialog.cxx:17686 msgid "23 04 16" msgstr "23 04 16" #: src/dialogs/confdialog.cxx:17693 msgid "24 05 18" msgstr "24 05 18" #: src/dialogs/confdialog.cxx:17700 msgid "25 06 22" msgstr "25 06 22" #: src/dialogs/confdialog.cxx:17707 msgid " 4 07 7" msgstr " 4 07 7" #: src/dialogs/confdialog.cxx:17714 msgid " 5 21 29" msgstr "5 21 29" #: src/dialogs/confdialog.cxx:17721 msgid " 6 22 31" msgstr "6 22 31" #: src/dialogs/confdialog.cxx:17728 msgid "13 23 33" msgstr "13 23 33" #: src/dialogs/confdialog.cxx:17735 msgid "19 24 35" msgstr "19 24 35" #: src/dialogs/confdialog.cxx:17742 msgid "26 25 37" msgstr "26 25 37" #: src/dialogs/confdialog.cxx:17749 msgid "12 26 32" msgstr "12 26 32" #: src/dialogs/confdialog.cxx:17756 msgid "16 27 36" msgstr "16 27 36" #: src/dialogs/confdialog.cxx:17763 msgid "20 28 38" msgstr "20 28 38" #: src/dialogs/confdialog.cxx:17770 msgid "21 29 40" msgstr "21 29 40" #: src/dialogs/confdialog.cxx:17777 src/dialogs/confdialog.cxx:17784 #: src/dialogs/confdialog.cxx:17791 src/dialogs/confdialog.cxx:17798 #: src/dialogs/confdialog.cxx:17805 src/dialogs/confdialog.cxx:17812 #: src/dialogs/confdialog.cxx:17819 src/dialogs/confdialog.cxx:17826 #: src/dialogs/confdialog.cxx:17833 src/dialogs/confdialog.cxx:17840 #: src/dialogs/confdialog.cxx:17847 src/dialogs/confdialog.cxx:17854 #: src/dialogs/confdialog.cxx:17861 src/dialogs/confdialog.cxx:17868 #: src/dialogs/confdialog.cxx:17875 src/dialogs/confdialog.cxx:17882 #: src/dialogs/confdialog.cxx:17889 msgid "= 1 (on)" msgstr "= 1 (wl)" #: src/dialogs/confdialog.cxx:17900 msgid "Pulse width (msec)" msgstr "Szerokosc impulsu (msek)" #: src/dialogs/confdialog.cxx:17901 msgid "Set >0 if pulsed PTT used" msgstr "Set >0 jeśli zastosowano pulsacyjny PTT" #: src/dialogs/confdialog.cxx:17919 msgid "Use Hamlib" msgstr "Uzyj Hamlib" #: src/dialogs/confdialog.cxx:17920 msgid "Hamlib used for rig control" msgstr "Hamlib do sterowania rig" #: src/dialogs/confdialog.cxx:17926 msgid "Rig:" msgstr "Rig:" #: src/dialogs/confdialog.cxx:17956 msgid "# times to resend command before giving up" msgstr "# razy, aby ponownie wysłac komendę" #: src/dialogs/confdialog.cxx:17972 msgid "Timeout (msec)" msgstr "Limit czasu ( msek )" #: src/dialogs/confdialog.cxx:17973 msgid "Hamlib read timeout" msgstr "Limit czasu odczytu hamliba" #: src/dialogs/confdialog.cxx:17989 msgid "Write delay (msec)" msgstr "Opóznienia zapisu (msek)" #: src/dialogs/confdialog.cxx:17990 msgid "Msec's between sequential commands" msgstr "Milisekund między kolejnymi komendami" #: src/dialogs/confdialog.cxx:18006 msgid "Post write delay (msec)" msgstr "Napisz post z opóznieniem (msek)" #: src/dialogs/confdialog.cxx:18007 msgid "Wait interval (msecs) before reading response" msgstr "Czekaj interwał ( msek ) przed odczytem odpowiedzi" #: src/dialogs/confdialog.cxx:18058 msgid "Polling Interval (msec)" msgstr "Interwał ponawiania (msek)" #: src/dialogs/confdialog.cxx:18077 msgid "PTT via Hamlib command" msgstr "PTT poprzez komendy pakietu hamlib" #: src/dialogs/confdialog.cxx:18078 msgid "PTT using hamlib command" msgstr "Pakiet komend PTT hamlib" #: src/dialogs/confdialog.cxx:18083 msgid "Audio on Auxiliary Port" msgstr "Audio na Port pomocniczy" #: src/dialogs/confdialog.cxx:18084 msgid "PTT enables auxiliary audio source" msgstr "Zródlo dźwięku PTT" #: src/dialogs/confdialog.cxx:18089 msgid "DTR +12" msgstr "DTR +12" #: src/dialogs/confdialog.cxx:18095 msgid "RTS +12" msgstr "RTS +12" #: src/dialogs/confdialog.cxx:18102 msgid "Rig requires RTS/CTS flow control" msgstr "Rig wymaga ustawienia przeplywu RTS/CTS" #: src/dialogs/confdialog.cxx:18108 msgid "XON/XOFF flow control" msgstr "Ustawienie transmisje Xon/Xoff" #: src/dialogs/confdialog.cxx:18109 msgid "Rig requires Xon/Xoff flow control" msgstr "Rig wymaga Xon/ Xoff" #: src/dialogs/confdialog.cxx:18114 msgid "CW is LSB mode" msgstr "CW jako LSB" #: src/dialogs/confdialog.cxx:18115 msgid "Check if xcvr uses LSB for CW" msgstr "Stosuj LSB na CW" #: src/dialogs/confdialog.cxx:18120 msgid "RTTY is USB mode" msgstr "RTTY jako USB" #: src/dialogs/confdialog.cxx:18121 msgid "Check if xcvr uses USB for RTTY" msgstr "Stosuj USB dla RTTY" #: src/dialogs/confdialog.cxx:18126 msgid "Mode delay (msec)" msgstr "Tryb opóznienia (msek)" #: src/dialogs/confdialog.cxx:18127 msgid "Delay NN msec after executing mode change" msgstr "Opóznienie NN msek po zmianie emisji" #: src/dialogs/confdialog.cxx:18146 msgid "Sideband:" msgstr "Wstęga boczna:" #: src/dialogs/confdialog.cxx:18159 msgid "Advanced configuration:" msgstr "Zaawansowana konfiguracja:" #: src/dialogs/confdialog.cxx:18160 msgid "" "Optional configuration\n" "in format: param=val ..." msgstr "" "Opcjonalna konfiguracja\n" "w formacie: param = val..." #: src/dialogs/confdialog.cxx:18175 msgid "Initialize hamlib interface" msgstr "Inicjalizacja interfejsu hamlib" #: src/dialogs/confdialog.cxx:18188 src/dialogs/confdialog.cxx:18300 #: src/dialogs/confdialog.cxx:18302 msgid "Rig Control/Hardware PTT" msgstr "Sterowanie Rig/Sprzetowe PTT" #: src/dialogs/confdialog.cxx:18194 src/dialogs/confdialog.cxx:18674 msgid "PTT tone on right audio channel " msgstr "Ton PTT na prawym kanale audio " #: src/dialogs/confdialog.cxx:18195 msgid "Can be used in lieu of or in addition to other PTT types" msgstr "Moga byc stosowane zamiast lub w uzupełnieniu na inne rodzaje PTT" #: src/dialogs/confdialog.cxx:18202 msgid "h/w ptt device-pin" msgstr "sterowanie PTT" #: src/dialogs/confdialog.cxx:18205 msgid "Use separate serial port PTT" msgstr "Uzyj oddzielnego portu szeregowego PTT" #: src/dialogs/confdialog.cxx:18225 msgid "Port is second SCU-17 device" msgstr "Port jest drugim SCU-17" #: src/dialogs/confdialog.cxx:18226 msgid "Driver requires stop bits to be ZERO!" msgstr "Sterownik wymaga bity stopu do zera!" #: src/dialogs/confdialog.cxx:18232 msgid "Use parallel port PTT" msgstr "Uzyj portu równoleglego PTT" #: src/dialogs/confdialog.cxx:18237 msgid "Use uHRouter PTT" msgstr "Ustaw uHRouter PTT" #: src/dialogs/confdialog.cxx:18242 msgid "Use RTS" msgstr "Ustaw RTS" #: src/dialogs/confdialog.cxx:18243 msgid "RTS is PTT signal line" msgstr "RTS - sygnal linii PTT" #: src/dialogs/confdialog.cxx:18247 msgid "RTS = +V" msgstr "RTS = +V" #: src/dialogs/confdialog.cxx:18248 msgid "Initial voltage on RTS" msgstr "Wstępne napięcie na RTS" #: src/dialogs/confdialog.cxx:18253 msgid "DTR is PTT signal line" msgstr "DTR -sygnał linii PTT" #: src/dialogs/confdialog.cxx:18257 msgid "DTR = +V" msgstr "DTR = +V" #: src/dialogs/confdialog.cxx:18258 msgid "Initial voltage on DTR" msgstr "Wstępne napięcie na DTR" #: src/dialogs/confdialog.cxx:18262 msgid "GPIO PTT (Pi specific controls)" msgstr "GPIO PTT (kontrolki specyficzne dla Pi)" #: src/dialogs/confdialog.cxx:18275 msgid "PTT delays valid for all CAT/PTT types" msgstr "Opóznienia NIM dla wszystkich typów CAT/PTT" #: src/dialogs/confdialog.cxx:18278 msgid "Start of transmit PTT delay" msgstr "Rozpoczęcie nadawania - opóznienie PTT" #: src/dialogs/confdialog.cxx:18279 msgid "Delay NN msec before starting audio" msgstr "Opóznienie NN msek przed rozpoczęciem audio" #: src/dialogs/confdialog.cxx:18288 msgid "PTT end of transmit delay" msgstr "Koniec nadawania - opóznienie PTT" #: src/dialogs/confdialog.cxx:18289 msgid "Delay NN msec before releasing PTT" msgstr "Opóznienie NN msek przed zwolnieniem PTT" #: src/dialogs/confdialog.cxx:18306 src/dialogs/confdialog.cxx:18363 msgid "C-Media PTT" msgstr "C-Media PTT" #: src/dialogs/confdialog.cxx:18310 msgid "" "C-Media audio codecs used in DRA Series have 8 user controllable GPIO pins. " "GPIO signal line 3 (pin 13) is used for PTT control.\n" "\n" "Fldigi accesses the GPIO lines as a Human Interface Device (HID). " "Discovered C-Media devices are enumerated in the 'C-Media device' list box.\n" "\n" "On Linux: add a file named cmedia.rules to /etc/udev/rules.d/\n" "The file should contain a single line\n" "\n" "KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"" msgstr "" "Kodeki audio C-Media używane w serii DRA mają 8 pinow GPIO sterowanych przez " "użytkownika. Linia sygnału GPIO 3 (pin 13) jest używana do\n" "\n" "Fldigi uzyskuje dostęp do linii GPIO jako urządzenie interfejsu człowieka " "(HID). Odnalezione urządzenia C-Media są wyliczone w polu listy " "\"Urządzenie C-Media\"\n" "\n" "W systemie Linux: dodaj plik o nazwie cmedia.rules do /etc/udev/rules.d/\n" "Plik powinien zawierać jeden wiersz\n" "\n" "KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", MODE=\"0664\", GROUP=\"plugdev\"" #: src/dialogs/confdialog.cxx:18319 msgid "Use C-Media PTT" msgstr "Uzyj C-Media PTT" #: src/dialogs/confdialog.cxx:18324 msgid "C-Media device" msgstr "Urządzenie C-Media" #: src/dialogs/confdialog.cxx:18339 msgid "GPIO line" msgstr "Linie GPIO" #: src/dialogs/confdialog.cxx:18356 msgid "Select device & Initialize the H/W PTT interface" msgstr "Wybierz urzadzenie & Inicjalzuje interfejs H/W PTT" #: src/dialogs/confdialog.cxx:18359 msgid "TEST" msgstr "TEST" #: src/dialogs/confdialog.cxx:18360 msgid "Toggles PTT line 20x; check DRA-30 ptt LED" msgstr "Przelacza linię PTT 20x; sprawdz DIODA LED DRA-30 ptt" #: src/dialogs/confdialog.cxx:18365 msgid "Rig Control/C-Media PTT" msgstr "Sterowanie Rig/C-Media PTT" #: src/dialogs/confdialog.cxx:18369 src/dialogs/confdialog.cxx:18534 #: src/dialogs/confdialog.cxx:18536 msgid "Soundcard/Alerts" msgstr "Karta dzwiękowa/Alarm" #: src/dialogs/confdialog.cxx:18378 msgid "REGEX detected wav" msgstr "REGEX wykryte wav" #: src/dialogs/confdialog.cxx:18407 msgid "MYCALL detected wav" msgstr "MYCALL wykryj wav" #: src/dialogs/confdialog.cxx:18436 msgid "RsID audio alert wav" msgstr "Alarm dzwiekowy RsID wav" #: src/dialogs/confdialog.cxx:18465 msgid "flmsg received wav" msgstr "odebr. dzwięk wav" #: src/dialogs/confdialog.cxx:18489 msgid "flmsg timed out wav" msgstr "flmsg przekroczyl limit czasu wav" #: src/dialogs/confdialog.cxx:18515 msgid "Alert volume" msgstr "Glośnosc alarmu" #: src/dialogs/confdialog.cxx:18539 src/dialogs/confdialog.cxx:18646 #: src/dialogs/confdialog.cxx:18648 msgid "Soundcard/Devices" msgstr "Moduł audio" #: src/dialogs/confdialog.cxx:18545 msgid "OSS" msgstr "OSS" #: src/dialogs/confdialog.cxx:18546 msgid "Use OSS audio server" msgstr "Uzyj serwera audio OSS" #: src/dialogs/confdialog.cxx:18552 msgid "Select device" msgstr "Wybierz urządzenie" #: src/dialogs/confdialog.cxx:18560 msgid "PortAudio" msgstr "PortAudio" #: src/dialogs/confdialog.cxx:18561 msgid "Use Port Audio server" msgstr "Uzyj portu Audio Server" #: src/dialogs/confdialog.cxx:18566 msgid "Capture:" msgstr "Przechwytywania:" #: src/dialogs/confdialog.cxx:18567 msgid "Audio input device" msgstr "Urządzenie wejsciowe audio" #: src/dialogs/confdialog.cxx:18571 msgid "Playback:" msgstr "Odtwarzanie nagranego dźwięku:" #: src/dialogs/confdialog.cxx:18572 src/dialogs/confdialog.cxx:18629 msgid "Audio output device" msgstr "Urządzenie wyjsciowe audio" #: src/dialogs/confdialog.cxx:18580 msgid "PulseAudio" msgstr "PulseAudio" #: src/dialogs/confdialog.cxx:18581 msgid "Use Pulse Audio server" msgstr "Uzyj Pulse Audio Server" #: src/dialogs/confdialog.cxx:18586 msgid "Server string:" msgstr "Ciąg znaków serwera:" #: src/dialogs/confdialog.cxx:18587 msgid "" "Leave this blank or refer to\n" "http://www.pulseaudio.org/wiki/ServerStrings" msgstr "" "Pozostaw to pole puste lub odnosi sie do\n" "http://www.pulseaudio.org/wiki/ServerStrings" #: src/dialogs/confdialog.cxx:18605 msgid "File I/O only" msgstr "Tylko plik I/O" #: src/dialogs/confdialog.cxx:18606 msgid "NO AUDIO DEVICE AVAILABLE (or testing)" msgstr "BRAK URZĄDZEN AUDIO (lub testu)" #: src/dialogs/confdialog.cxx:18615 msgid "Device supports full duplex" msgstr "Urzadzenie obsługuje pełny dupleks" #: src/dialogs/confdialog.cxx:18616 msgid "Capture/Playback supports full duplex operation" msgstr "Urzadzenie obsługuje tryb pelnego dupleksu" #: src/dialogs/confdialog.cxx:18628 msgid "Audio device shared by Audio Alerts and Rx Monitor" msgstr "Urządzenie audio udostępniane przez alerty dźwiękowe i monitor Rx" #: src/dialogs/confdialog.cxx:18635 msgid "First select audio alert playback device" msgstr "Najpierw wybierz urządzenie odtwarzające alert dzwiękowy" #: src/dialogs/confdialog.cxx:18641 msgid "Note: must be selected and enabled for Rx Audio monitoring!" msgstr "Uwaga: należy wybrać i właczyc do monitorowania audio RX!" #: src/dialogs/confdialog.cxx:18651 src/dialogs/confdialog.cxx:18708 #: src/dialogs/confdialog.cxx:18710 msgid "Soundcard/Right channel" msgstr "Dzwięk/Prawy kanał" #: src/dialogs/confdialog.cxx:18655 msgid "Transmit Usage" msgstr "Nadawanie" #: src/dialogs/confdialog.cxx:18658 msgid "Modem signal on left and right channels" msgstr "Sygnał modemu na lewym i prawym kanale" #: src/dialogs/confdialog.cxx:18659 msgid "Left and right channels both contain modem audio" msgstr "Lewy i prawy kanał oba zawieraja audio modemu" #: src/dialogs/confdialog.cxx:18664 src/dialogs/confdialog.cxx:18700 msgid "Reverse Left/Right channels" msgstr "Odwróc lewy/prawy kanal" #: src/dialogs/confdialog.cxx:18665 src/dialogs/confdialog.cxx:18701 msgid "Software reversal of left-right audio channels" msgstr "Odwrócenie programowe lewy-prawy kanal audio" #: src/dialogs/confdialog.cxx:18670 msgid "" "...\n" "These controls are on other tabs.\n" "They are replicated here for convenience.\n" "You may change the state from either location.\n" "..." msgstr "" "...\n" "Te ustawienia są na innych kartach.\n" "Są replikowane tutaj dla wygody.\n" "Mozesz zmienic stan z kazdej lokalizacji.\n" "..." #: src/dialogs/confdialog.cxx:18675 msgid "" "1000 Hz tone when PTT enabled\n" "Can be used in lieu of or in addition to other PTT types" msgstr "" "1000 Hz ton, kiedy PTT wlaczony\n" "Moze być uzywana zamiast lub w uzupełnieniu do innych typów PTT" #: src/dialogs/confdialog.cxx:18681 msgid "CW QSK signal on right channel" msgstr "CW QSK sygnał na prawym kanale" #: src/dialogs/confdialog.cxx:18682 msgid "Generate 1000 Hz square wave signal on right channel" msgstr "Utwórz 1000 Hz sygnal prostokątny na prawym kanale" #: src/dialogs/confdialog.cxx:18687 msgid "Pseudo-FSK on right audio channel" msgstr "Pseudo-FSK na prawym kanale audio" #: src/dialogs/confdialog.cxx:18688 msgid "Create 1000 Hz square wave on right channel" msgstr "Utwórz 1000 Hz audio prostokątne w prawym kanale" #: src/dialogs/confdialog.cxx:18697 msgid "Receive Usage" msgstr "Uzyj Odbr" #: src/dialogs/confdialog.cxx:18713 src/dialogs/confdialog.cxx:18850 #: src/dialogs/confdialog.cxx:18852 msgid "Soundcard/Settings" msgstr "Karta dzwiękowa/ustawienia" #: src/dialogs/confdialog.cxx:18720 msgid "Capture" msgstr "Przechwyt" #: src/dialogs/confdialog.cxx:18721 msgid "" "Force a specific sample rate. Select \"Native\" if \"Auto\"\n" "does not work well with your audio device." msgstr "" "Wymuszenie okreslonej częstotliwosci próbkowania Wybierz\"Native\" jeślii " "\"Auto\"\n" "nie działa z urządzeniami audio." #: src/dialogs/confdialog.cxx:18753 msgid "Converter" msgstr "Konwerter" #: src/dialogs/confdialog.cxx:18754 msgid "Set the type of resampler used of offset correction" msgstr "Ustaw typ Resampler użyty do korekcji odsuniecia" #: src/dialogs/confdialog.cxx:18770 msgid "Corrections" msgstr "Korekta" #: src/dialogs/confdialog.cxx:18773 msgid "RX ppm" msgstr "RX ppm" #: src/dialogs/confdialog.cxx:18774 msgid "RX sound card correction" msgstr "Korekcja karty dzwięk RX" #: src/dialogs/confdialog.cxx:18790 msgid "TX ppm" msgstr "TX ppm" #: src/dialogs/confdialog.cxx:18791 msgid "TX sound card correction" msgstr "Korekcja karty dzwięk TX" #: src/dialogs/confdialog.cxx:18807 msgid "TX offset" msgstr "TX offset" #: src/dialogs/confdialog.cxx:18808 msgid "Difference between Rx & Tx freq (rig offset)" msgstr "Róznica między czest. Rx & Tx (rig przesuniecie)" #: src/dialogs/confdialog.cxx:18826 msgid "Frequency Analysis / FMT Rx Correction" msgstr "Analiza czestotliwosci / Korekcja FMT RX" #: src/dialogs/confdialog.cxx:18834 msgid "Frequency Correction" msgstr "Korekcja częstotliwosci" #: src/dialogs/confdialog.cxx:18835 msgid "Used ONLY for frequency analysis mode" msgstr "Uzywane tylko do trybu analizy czestotliwosci" #: src/dialogs/confdialog.cxx:18855 msgid "Signal Level" msgstr "Poziomy sygnalu" #: src/dialogs/confdialog.cxx:18859 msgid "Signal Levels" msgstr "Poziomy sygnalu" #: src/dialogs/confdialog.cxx:18940 src/dialogs/confdialog.cxx:18942 msgid "Soundcard/Signal Level" msgstr "Moduł audio/Poziom sygnalu" #: src/dialogs/confdialog.cxx:18945 src/dialogs/confdialog.cxx:18971 #: src/dialogs/confdialog.cxx:18973 msgid "Soundcard/Wav file recording" msgstr "Karta dzwiekowa/Zapis plków" #: src/dialogs/confdialog.cxx:18949 msgid "Wav write sample rate" msgstr "Próbkowanie zapisu Wav" #: src/dialogs/confdialog.cxx:18950 msgid "Pick baud rate from list" msgstr "Wybierz szybkosc transmisji z listy" #: src/dialogs/confdialog.cxx:18966 msgid "Record both channels" msgstr "Nagraj oba kanaly" #: src/dialogs/confdialog.cxx:18977 src/dialogs/confdialog.cxx:19063 #: src/dialogs/confdialog.cxx:19065 msgid "UI/Browser/Channels" msgstr "Przeglądarka/kanały" #: src/dialogs/confdialog.cxx:18981 msgid "Channels, first channel starts at waterfall lower limit" msgstr "Kanały, pierwszy kanal w dolnej granicy wodospadu" #: src/dialogs/confdialog.cxx:18982 msgid "Change # of psk viewer channels" msgstr "Zmiana # podglądu kanalów PSK" #: src/dialogs/confdialog.cxx:18999 msgid "Inactivity timeout" msgstr "Limit czasu nieaktywnosci" #: src/dialogs/confdialog.cxx:19000 msgid "" "Clear channel text after\n" "# seconds of inactivity" msgstr "" "Skasuj tekst kanalu po\n" "# sekund bezczynnosci" #: src/dialogs/confdialog.cxx:19016 msgid "Channel label" msgstr "Etykieta kanalu" #: src/dialogs/confdialog.cxx:19017 msgid "Appearance of label on each channel" msgstr "Wyglad etykiety na kazdym kanale" #: src/dialogs/confdialog.cxx:19028 msgid "Audio frequency" msgstr "Czestotliwosc audio" #: src/dialogs/confdialog.cxx:19029 msgid "Radio frequency" msgstr "Czestotliwosc RF" #: src/dialogs/confdialog.cxx:19029 msgid "Channel number" msgstr "Numer kanalu" #: src/dialogs/confdialog.cxx:19034 src/dialogs/confdialog.cxx:19772 msgid "Font..." msgstr "Czcionka..." #: src/dialogs/confdialog.cxx:19035 msgid "select browser font" msgstr "wybierz czcionke przegladarki" #: src/dialogs/confdialog.cxx:19038 msgid "Fixed Intervals" msgstr "W odstępach czasu" #: src/dialogs/confdialog.cxx:19039 msgid "Force channel spacing to even 100 Hz increments" msgstr "Odstep kanalów do 100 Hz" #: src/dialogs/confdialog.cxx:19045 msgid "Continuous scrolling" msgstr "Ciągle przewijanie" #: src/dialogs/confdialog.cxx:19046 msgid "" "ON - Marquee style\n" "OFF - Clear & restart" msgstr "" "Wl - Styl marquee\n" "Wyl - Wyczysc & restart" #: src/dialogs/confdialog.cxx:19051 msgid "Lowest freq on bottom of viewer" msgstr "Najnizsza częstotliwosc na dole przeglądarki" #: src/dialogs/confdialog.cxx:19052 msgid "Change positions of low to high channels" msgstr "Zmiana pozycji z niskiego do wysokiego kanalu" #: src/dialogs/confdialog.cxx:19057 msgid "Play back history when active channel selected" msgstr "Odtwórz historie, gdy wybrano aktywny kanal" #: src/dialogs/confdialog.cxx:19058 msgid "Audio stream history decoded on selected signal" msgstr "Historia strumienia audio zdekodowanego na wybranym sygnale" #: src/dialogs/confdialog.cxx:19068 src/dialogs/confdialog.cxx:19102 #: src/dialogs/confdialog.cxx:19104 msgid "UI/Browser/Colors" msgstr "UI/Przeglądarka/Kolor" #: src/dialogs/confdialog.cxx:19072 msgid "HiLite 1" msgstr "" #: src/dialogs/confdialog.cxx:19073 msgid "PSK/RTTY Viewer HiLite Color 1" msgstr "PSK/RTTY Przeglądarka HiLite Kolor 1" #: src/dialogs/confdialog.cxx:19078 msgid "HiLite 2" msgstr "" #: src/dialogs/confdialog.cxx:19079 msgid "PSK/RTTY Viewer HiLite Color 2" msgstr "PSK/RTTY Przeglądarka HiLite Kolor 2" #: src/dialogs/confdialog.cxx:19084 msgid "Even" msgstr "Parzyste" #: src/dialogs/confdialog.cxx:19085 msgid "Even lines" msgstr "Parzyste linie" #: src/dialogs/confdialog.cxx:19090 msgid "Odd" msgstr "Nie parzyste" #: src/dialogs/confdialog.cxx:19091 msgid "Odd lines" msgstr "Nieparzyste linie" #: src/dialogs/confdialog.cxx:19097 msgid "Select line" msgstr "Wybierz linie" #: src/dialogs/confdialog.cxx:19107 src/dialogs/confdialog.cxx:19123 #: src/dialogs/confdialog.cxx:19125 msgid "UI/Browser/Detection Level" msgstr "UI/Przeglądarka/poziom wykrywania" #: src/dialogs/confdialog.cxx:19111 msgid "Backgnd" msgstr "Tlo" #: src/dialogs/confdialog.cxx:19112 msgid "Background color of signal viewer squelch control" msgstr "Kolor tla podglądu blokady szumów" #: src/dialogs/confdialog.cxx:19117 msgid "Button" msgstr "Przycisk" #: src/dialogs/confdialog.cxx:19118 msgid "Slider hilite color of signal viewer squelch control" msgstr "Kolor suwaka blokady szumów" #: src/dialogs/confdialog.cxx:19128 src/dialogs/confdialog.cxx:19262 #: src/dialogs/confdialog.cxx:19264 msgid "UI/General" msgstr "UI/Ogólne" #: src/dialogs/confdialog.cxx:19134 msgid "Show tooltips" msgstr "Pokaz podpowiedzi" #: src/dialogs/confdialog.cxx:19135 msgid "Enable / disable tooltips" msgstr "Aktywuj / deaktywuj podpowiedzi" #: src/dialogs/confdialog.cxx:19141 msgid "Show menu icons" msgstr "Pokaz ikony menu" #: src/dialogs/confdialog.cxx:19142 msgid "Enable / disable icons on menus" msgstr "Aktywuj / deaktywuj ikony w menu" #: src/dialogs/confdialog.cxx:19147 msgid "UI scheme" msgstr "UI schemat" #: src/dialogs/confdialog.cxx:19148 msgid "Change application look and feel" msgstr "Zmien wygląd aplikacji" #: src/dialogs/confdialog.cxx:19166 msgid "Visible modes" msgstr "Widoczne emisje" #: src/dialogs/confdialog.cxx:19167 msgid "Select modes for menu access" msgstr "Wybierz tryb dostępu do menu" #: src/dialogs/confdialog.cxx:19170 msgid "UI language" msgstr "UI język" #: src/dialogs/confdialog.cxx:19171 src/dialogs/confdialog.cxx:19915 msgid "Changes take effect on next program startup" msgstr "Zmiany są uwzględniane przy następnym uruchomieniu programu" #: src/dialogs/confdialog.cxx:19190 msgid "Print CW / RTTY / THROB / CONTESTIA in lowercase" msgstr "Drukuj CW / RTTY / THROB / CONTESTIA malymi literami" #: src/dialogs/confdialog.cxx:19200 msgid "Transmit lower case text" msgstr "Nadaj malymi literami" #: src/dialogs/confdialog.cxx:19207 msgid "Exit prompts" msgstr "Zamknij podpowiedzi" #: src/dialogs/confdialog.cxx:19210 msgid "Prompt to save Configuration" msgstr "Monituj o zapisanie konfiguracji" #: src/dialogs/confdialog.cxx:19215 src/dialogs/confdialog.cxx:19377 msgid "Prompt to save macro file" msgstr "Monituj o zapisanie pliku makra" #: src/dialogs/confdialog.cxx:19216 src/dialogs/confdialog.cxx:19378 msgid "Write current macro set on program exit" msgstr "Zapisz aktualny zestaw makr przy wyjsciu z programu" #: src/dialogs/confdialog.cxx:19221 msgid "Prompt to save log" msgstr "Monituj o zapisanie dziennika" #: src/dialogs/confdialog.cxx:19227 msgid "Confirm exit" msgstr "Zastosuj / zamknij" #: src/dialogs/confdialog.cxx:19234 msgid "Check for updates" msgstr "Aktualizuj" #: src/dialogs/confdialog.cxx:19237 msgid "Check for updates when starting program" msgstr "Sprawdz w czasie uruchamiania programu" #: src/dialogs/confdialog.cxx:19247 msgid "Show TX timer" msgstr "Pokaz czas TX" #: src/dialogs/confdialog.cxx:19252 msgid "TX deadmen timeout (mins)" msgstr "TX czas gotowości (min)" #: src/dialogs/confdialog.cxx:19267 src/dialogs/confdialog.cxx:19405 #: src/dialogs/confdialog.cxx:19407 msgid "UI/Macro buttons" msgstr "UI/Przyciski makro" #: src/dialogs/confdialog.cxx:19273 msgid "Mouse wheel active on macro buttons" msgstr "Aktywne kółko myszy na przyciskach makr" #: src/dialogs/confdialog.cxx:19274 msgid "enable mouse wheel control of macro bar" msgstr "wlacz sterowanie kółkiem myszy na pasku makro" #: src/dialogs/confdialog.cxx:19281 msgid "Number and position of macro bars" msgstr "Liczba i pozycja pasków makro" #: src/dialogs/confdialog.cxx:19284 msgid "Button Height" msgstr "Wysokosc przycisku" #: src/dialogs/confdialog.cxx:19285 msgid "Height of macro bar" msgstr "Wysokosc paska makro" #: src/dialogs/confdialog.cxx:19295 msgid "One above Rx/Tx" msgstr "Powyzej okna Rx/Tx" #: src/dialogs/confdialog.cxx:19296 msgid "" "Single macro bar below logging panel\n" "variable height" msgstr "" "Pojedyncze makro panelu logowania poniżej paska\n" "zmienna wysokosc" #: src/dialogs/confdialog.cxx:19301 msgid "One above waterfall" msgstr "Powyzej wodospadu" #: src/dialogs/confdialog.cxx:19306 msgid "One below waterfall" msgstr "Ponizej wodospadu" #: src/dialogs/confdialog.cxx:19311 msgid "Two scheme 1" msgstr "Schemat 1" #: src/dialogs/confdialog.cxx:19316 msgid "Two scheme 2" msgstr "Schemat 2" #: src/dialogs/confdialog.cxx:19321 msgid "Two scheme 3" msgstr "Schemat 3" #: src/dialogs/confdialog.cxx:19326 msgid "Two scheme 4" msgstr "Schemat 4" #: src/dialogs/confdialog.cxx:19331 msgid "Two scheme 5" msgstr "Schemat 5" #: src/dialogs/confdialog.cxx:19336 msgid "Two scheme 6" msgstr "Schemat 6" #: src/dialogs/confdialog.cxx:19341 msgid "Two scheme 7" msgstr "Schemat 7" #: src/dialogs/confdialog.cxx:19346 msgid "Two scheme 8" msgstr "Schemat 8" #: src/dialogs/confdialog.cxx:19351 msgid "Two scheme 9" msgstr "Schemat 9" #: src/dialogs/confdialog.cxx:19356 msgid "Two scheme 10" msgstr "Schemat 10" #: src/dialogs/confdialog.cxx:19365 msgid "Load last used macro file at start" msgstr "Załaduj ostatnio uzywane makro" #: src/dialogs/confdialog.cxx:19366 msgid "" "ON - use last set of macros\n" "OFF - use default set" msgstr "" "WL - wykorzystaj ostatni zestaw makr\n" "WYL - uzywaj zestawu domyslnego" #: src/dialogs/confdialog.cxx:19371 msgid "Display macro filename at start" msgstr "Pokaz nazwe makra przy starcie" #: src/dialogs/confdialog.cxx:19387 msgid "Show macro control codes" msgstr "Pokaz makro z kodami sterowania" #: src/dialogs/confdialog.cxx:19388 msgid "print ^! execution codes in Rx panel" msgstr "print ^! wykonaj kody w panelu Rx" #: src/dialogs/confdialog.cxx:19397 msgid "4 bar macro set below Tx" msgstr "Ustaw 4 makra poniżej Tx" #: src/dialogs/confdialog.cxx:19398 msgid "" "Position the 4 bar macro set below Tx panel\n" "Default above Rx panel" msgstr "" "Ustaw zestaw makr 4 barów pod panelem Tx\n" "Domyślnie powyżej panelu Rx" #: src/dialogs/confdialog.cxx:19410 src/dialogs/confdialog.cxx:19454 #: src/dialogs/confdialog.cxx:19456 msgid "UI/Rx Text" msgstr "UI/tekst RX" #: src/dialogs/confdialog.cxx:19414 msgid "Single-click to capture" msgstr "Kliknij, aby uchwycic" #: src/dialogs/confdialog.cxx:19415 src/dialogs/confdialog.cxx:19444 msgid "Enable for single click capure of text in Rx panel" msgstr "Aktywuj jedno klikniecie - zaznaczenie tekstu w panelu Rx" #: src/dialogs/confdialog.cxx:19420 msgid "callsign tooltips in received text" msgstr "znak podpowiedzi w otrzymanym tekscie" #: src/dialogs/confdialog.cxx:19421 msgid "Popup info after a 2 second hover on a callsign" msgstr "Informacje Popup po 2 sek po najechaniu na znak" #: src/dialogs/confdialog.cxx:19426 msgid "Word delimiters" msgstr "Słowa ograniczniki" #: src/dialogs/confdialog.cxx:19427 msgid "" "RX text QSO data entry is bounded by the non-word characters\n" "defined here. Tab and newline are automatically included." msgstr "" "RX tekst QSO wprowadzanie danych jest ograniczone przez znaki nie-słowa\n" "zdefiniowane tutaj. Tabulator i nowa linia są automatycznie dolaczane." #: src/dialogs/confdialog.cxx:19443 msgid "US units of distance (QRB)" msgstr "Jednostka odległosci (QRB) USA" #: src/dialogs/confdialog.cxx:19449 msgid "Clear log fields - new CALL" msgstr "Zeruj pola dziennika" #: src/dialogs/confdialog.cxx:19459 src/dialogs/confdialog.cxx:19494 #: src/dialogs/confdialog.cxx:19496 msgid "UI/Touch" msgstr "UI/Touch" #: src/dialogs/confdialog.cxx:19463 msgid "" "Note:\n" "These configuration items are useful for but not unique to using fldigi on " "a\n" "touch screen device such as a tablet." msgstr "" "Uwaga:\n" "Pozycje te są przydatne do konfiguracji, ale nie wyjątkowe do uzycia fldigi " "na\n" "urządzeniach z ekranem dotykowym, takich jak tablet." #: src/dialogs/confdialog.cxx:19467 msgid "Arrow Key Control of Frequency Entry" msgstr "Wprowadzanie częstotliwosci strzalka" #: src/dialogs/confdialog.cxx:19470 msgid "" "Right/Left = 1 x LSD\n" "Up/Dn= 10 x LSD\n" "Shift - Right/Left = 100 x LSD\n" "Shift - Up/Dn = 1000 x LSD" msgstr "" "Prawo/Lewo = 1 x LSD\n" "Góra/Dól= 10 x LSD\n" "Shift - Prawy/Lewy = 100 x LSD\n" "Shift - Góra/Dól = 1000 x LSD" #: src/dialogs/confdialog.cxx:19474 msgid "" "Right/Left\n" "Select Least Signficant Digit" msgstr "" "Prawo / Lewo\n" "Wybierz najmniejszy cyfrowy raster" #: src/dialogs/confdialog.cxx:19483 msgid "Rx / Tx Panels" msgstr "Rx / Tx Panel" #: src/dialogs/confdialog.cxx:19486 msgid "Tx above Rx" msgstr "Tx powyzej Rx" #: src/dialogs/confdialog.cxx:19487 msgid "Enable to put Tx panel above Rx panel" msgstr "Wlacz aby umiescic panel Tx wyzej panelu Rx" #: src/dialogs/confdialog.cxx:19500 src/dialogs/confdialog.cxx:19580 #: src/dialogs/confdialog.cxx:19582 msgid "Waterfall/Buttons & Controls" msgstr "Sterowanie wodospadem/przyciskami" #: src/dialogs/confdialog.cxx:19504 msgid "Enable check box to show each respective operator control" msgstr "Wlacz pole wyboru, by pokazac mozliwe sterowanie" #: src/dialogs/confdialog.cxx:19514 msgid "WF Magnification" msgstr "Powieksz wodospad" #: src/dialogs/confdialog.cxx:19520 msgid "WF carrier" msgstr "Nosnik wodospadu" #: src/dialogs/confdialog.cxx:19526 msgid "WF Shift Controls" msgstr "Ustaw przesuniecie" #: src/dialogs/confdialog.cxx:19532 msgid "WF ref level" msgstr "Poziom referencji wodospadu" #: src/dialogs/confdialog.cxx:19538 msgid "WF drop rate" msgstr "Szybkosc wodospadu" #: src/dialogs/confdialog.cxx:19544 msgid "WF amp span" msgstr "Amplituda wodospadu" #: src/dialogs/confdialog.cxx:19550 msgid "WF Store" msgstr "Zapis wodospadu" #: src/dialogs/confdialog.cxx:19556 msgid "WF mode" msgstr "Wybór trybu wodospadu" #: src/dialogs/confdialog.cxx:19562 msgid "QSY" msgstr "QSY" #: src/dialogs/confdialog.cxx:19568 msgid "XMT lock" msgstr "Blokuj Tx" #: src/dialogs/confdialog.cxx:19574 msgid "Enable all" msgstr "Aktywuj" #: src/dialogs/confdialog.cxx:19577 msgid "Disable all" msgstr "Deaktywuj" #: src/dialogs/confdialog.cxx:19585 src/dialogs/confdialog.cxx:19800 #: src/dialogs/confdialog.cxx:19802 msgid "Waterfall/Display" msgstr "Wodospad/wyświetlacz" #: src/dialogs/confdialog.cxx:19589 msgid "Colors and cursors" msgstr "Kolor i kursor" #: src/dialogs/confdialog.cxx:19592 msgid "aa" msgstr "aa" #: src/dialogs/confdialog.cxx:19607 src/dialogs/confdialog.cxx:19611 #: src/dialogs/confdialog.cxx:19615 src/dialogs/confdialog.cxx:19619 #: src/dialogs/confdialog.cxx:19623 src/dialogs/confdialog.cxx:19627 #: src/dialogs/confdialog.cxx:19631 src/dialogs/confdialog.cxx:19635 #: src/dialogs/confdialog.cxx:19639 src/dialogs/confdialog.cxx:19660 #: src/dialogs/confdialog.cxx:19683 src/dialogs/confdialog.cxx:19706 #: src/dialogs/confdialog.cxx:19723 src/dialogs/confdialog.cxx:19735 #: src/dialogs/confdialog.cxx:19748 msgid "Change color" msgstr "Zmień kolor" #: src/dialogs/confdialog.cxx:19642 msgid "Load..." msgstr "Laduj..." #: src/dialogs/confdialog.cxx:19643 msgid "Load a new palette" msgstr "Załaduj nową paletę" #: src/dialogs/confdialog.cxx:19646 msgid "Save..." msgstr "Zapisz..." #: src/dialogs/confdialog.cxx:19647 msgid "Save this palette" msgstr "Zapisz paletę" #: src/dialogs/confdialog.cxx:19650 #, fuzzy #| msgid "Signal Browser" msgid "Signal BW" msgstr "Przegladarka sygnalow" #: src/dialogs/confdialog.cxx:19653 src/dialogs/confdialog.cxx:19676 #: src/dialogs/confdialog.cxx:19699 msgid "ON" msgstr "WŁ" #: src/dialogs/confdialog.cxx:19654 msgid "Show cursor with bandwidth lines" msgstr "Pokazuj kursor z liniami szerokosci pasma" #: src/dialogs/confdialog.cxx:19659 src/dialogs/confdialog.cxx:19682 #: src/dialogs/confdialog.cxx:19705 src/dialogs/confdialog.cxx:19722 #: src/dialogs/confdialog.cxx:19734 src/dialogs/confdialog.cxx:19747 #: src/dialogs/font_browser.cxx:177 msgid "Color" msgstr "Kolor" #: src/dialogs/confdialog.cxx:19666 src/dialogs/confdialog.cxx:19689 #: src/dialogs/confdialog.cxx:19712 src/dialogs/confdialog.cxx:19754 msgid "Wide" msgstr "Rozciągnij" #: src/dialogs/confdialog.cxx:19673 msgid "Center line" msgstr "Centruj linie" #: src/dialogs/confdialog.cxx:19677 msgid "Show cursor with center line" msgstr "Pokaz kursor z linia srodkowa" #: src/dialogs/confdialog.cxx:19696 #, fuzzy #| msgid "Signal tracks" msgid "Signal trks" msgstr "Sciezki sygnałów" #: src/dialogs/confdialog.cxx:19700 msgid "Show bandwidth tracks on waterfall" msgstr "Pokazuj przepustowosc sciezki na wodospadzie" #: src/dialogs/confdialog.cxx:19719 msgid "Notch" msgstr "Notch" #: src/dialogs/confdialog.cxx:19731 #, fuzzy #| msgid "RsID detection" msgid "RsID Zone" msgstr "Wykryty RSID" #: src/dialogs/confdialog.cxx:19743 #, fuzzy #| msgid "Monitor ON" msgid "Monitor" msgstr "Monitor wł" #: src/dialogs/confdialog.cxx:19744 #, fuzzy #| msgid "Rx Audio Monitor" msgid "Audio monitor" msgstr "Monitor audio RX" #: src/dialogs/confdialog.cxx:19763 msgid "Frequency scale" msgstr "Skala częstotliwosci" #: src/dialogs/confdialog.cxx:19766 msgid "Always show audio frequencies" msgstr "Pokaz częstotliwosc audio" #: src/dialogs/confdialog.cxx:19767 msgid "Audio or RF frequencies on waterfall scale" msgstr "Częstotliwosc Audio lub RF na skali wodospadu" #: src/dialogs/confdialog.cxx:19773 msgid "Select waterfall scale font" msgstr "Wybierz czcionkę skali wodospadu" #: src/dialogs/confdialog.cxx:19778 msgid "Transmit signal" msgstr "Sygnal nadawania" #: src/dialogs/confdialog.cxx:19781 msgid "Monitor transmitted signal" msgstr "Monitoruj nadawany sygnal" #: src/dialogs/confdialog.cxx:19782 msgid "Show transmit signal on waterfall" msgstr "Pokaz sygnał nadawania na wodospadzie" #: src/dialogs/confdialog.cxx:19787 msgid "Signal Level (dB)" msgstr "Poziom sygnalu (dB)" #: src/dialogs/confdialog.cxx:19788 msgid "Set level for good viewing" msgstr "Ustaw poziom dobrego widoku" #: src/dialogs/confdialog.cxx:19805 src/dialogs/confdialog.cxx:19941 #: src/dialogs/confdialog.cxx:19943 msgid "Waterfall/FFT Processing" msgstr "Wodospad/FFT przetwarzanie" #: src/dialogs/confdialog.cxx:19812 msgid "Low frequency limit in Hz" msgstr "Dolna granica częstotliwosci w Hz" #: src/dialogs/confdialog.cxx:19831 msgid "FFT averaging" msgstr "Usrednij FFT" #: src/dialogs/confdialog.cxx:19832 msgid "Use averaging to decrease waterfall noise" msgstr "Usrednij, zmniejsz szum wodospadu" #: src/dialogs/confdialog.cxx:19837 msgid "FFT prefilter window function" msgstr "FFT okno funkcji filtru wstępnego" #: src/dialogs/confdialog.cxx:19849 msgid "Rectangular" msgstr "Prostokątny" #: src/dialogs/confdialog.cxx:19851 msgid "Triangular" msgstr "Trójkątny" #: src/dialogs/confdialog.cxx:19857 msgid "High frequency limit in Hz" msgstr "Górna granica częstotliwosci w Hz" #: src/dialogs/confdialog.cxx:19876 msgid "Latency" msgstr "Opóznienie" #: src/dialogs/confdialog.cxx:19877 msgid "" "Signal averaging over time\n" "0 - least\n" "4 - greatest" msgstr "" "Sygnał z czasem usredniania\n" "0 - najmniej\n" "4 - najwiecej" #: src/dialogs/confdialog.cxx:19899 src/dialogs/confdialog.cxx:19916 msgid "Show me more or less waterfall" msgstr "Pokaz mniej lub więcej wodospadu" #: src/dialogs/confdialog.cxx:19902 msgid "Slow drop rate" msgstr "Powolny spadek" #: src/dialogs/confdialog.cxx:19903 msgid "Normal drop speed / value" msgstr "Prędkosc spadku wodospadu / wartosc" #: src/dialogs/confdialog.cxx:19919 msgid "Waterfall height in pixels" msgstr "Wysokosc wodospadu w pikselach" #: src/dialogs/confdialog.cxx:19920 msgid "CPU usage increases with waterfall height" msgstr "Uzycie CPU wzrasta z wysokoscia wodospadu" #: src/dialogs/confdialog.cxx:19946 src/dialogs/confdialog.cxx:20000 #: src/dialogs/confdialog.cxx:20002 msgid "Waterfall/Mouse usage" msgstr "Wodospad/Uzycie myszy" #: src/dialogs/confdialog.cxx:19952 msgid "Left or right click always replays audio history" msgstr "Kliknij lewym lub prawym by uzyskac historie audio" #: src/dialogs/confdialog.cxx:19953 msgid "Replay trackline audio" msgstr "Odtwarzanie sciezki dzwiekowej" #: src/dialogs/confdialog.cxx:19958 msgid "Dragging on the waterfall scale changes frequency" msgstr "Przeciągnij wodospad na skali częstotliwosci" #: src/dialogs/confdialog.cxx:19959 msgid "Enable drag cursor on waterfall scale" msgstr "Aktywuj przeciagniecie kursora na skale wodospadu" #: src/dialogs/confdialog.cxx:19964 msgid "Insert text on single left click" msgstr "Wstaw tekst pojedynczym lewym kliknieciem" #: src/dialogs/confdialog.cxx:19965 msgid "" "Insert special text in Rx panel\n" "when waterfall clicked" msgstr "" "Wstaw specjalny tekst w panelu Rx\n" "po kliknieciu wodospadu" #: src/dialogs/confdialog.cxx:19971 msgid "" "The string is replaced with\n" "the current modem and frequency" msgstr "" "Opis zostanie zastąpiony\n" "obecnym modem i częstotliwoscia" #: src/dialogs/confdialog.cxx:19983 msgid "Wheel action" msgstr "Akcja kólka myszki" #: src/dialogs/confdialog.cxx:19984 msgid "" "Select how the mouse wheel\n" "behaves inside the waterfall" msgstr "" "Wybierz sposób wykorzystania rolki myszki\n" "zachowanie wewnątrz wodospadu" #: src/dialogs/confdialog.cxx:20005 src/dialogs/confdialog.cxx:20042 #: src/dialogs/confdialog.cxx:20044 msgid "Waterfall/Spectrum" msgstr "Wodospad/spektrum" #: src/dialogs/confdialog.cxx:20009 msgid "Spectrum Scope / Waterfall interaction" msgstr "Zakres widma/interakcje wodospadu" #: src/dialogs/confdialog.cxx:20012 msgid "left click transfers frequency to scope center frequency" msgstr "" "lewe kliknięcie przenosi częstotliwość na częstotliwość srodkową zakresu" #: src/dialogs/confdialog.cxx:20013 msgid "left click on WF recenters spectrum scope" msgstr "Kliknij lpm myszy na WF wysrodkowany zakres widma" #: src/dialogs/confdialog.cxx:20018 msgid "use waterfall range/limit values" msgstr "użyj zakresu wodospadu/wartości granicznych" #: src/dialogs/confdialog.cxx:20019 msgid "values left/below waterfall" msgstr "wartości po lewej / ponizej wodospadu" #: src/dialogs/confdialog.cxx:20024 msgid "freq scale = N * modem bandwidth" msgstr "skala freq = N * przepustowość modemu" #: src/dialogs/confdialog.cxx:20034 msgid "use" msgstr "uzyj" #: src/dialogs/confdialog.cxx:20035 msgid "scale spectrum display linked to modem bandwidth" msgstr "wyswietlanie skali widma polaczone z przepustowoscia modemu" #: src/dialogs/confdialog.cxx:20048 src/dialogs/confdialog.cxx:20154 #: src/dialogs/confdialog.cxx:20156 msgid "Web/Pskmail" msgstr "Sieć Web/Pskmail" #: src/dialogs/confdialog.cxx:20052 msgid "Mail Server Attributes" msgstr "Atrybuty Mail Server" #: src/dialogs/confdialog.cxx:20055 msgid "Carrier frequency (Hz)" msgstr "Częstotliwosc nosna (Hz)" #: src/dialogs/confdialog.cxx:20056 msgid "Default listen / transmit frequency" msgstr "Domyslnie słuchaj /częstotliwosc nadawania" #: src/dialogs/confdialog.cxx:20075 msgid "Search range (Hz)" msgstr "Zakres wyszukiwania ( Hz)" #: src/dialogs/confdialog.cxx:20076 msgid "Listen for signals within this range" msgstr "Sluchaj sygnalów w tym zakresie" #: src/dialogs/confdialog.cxx:20115 msgid "AFC range (Hz)" msgstr "Zakres AFC (Hz)" #: src/dialogs/confdialog.cxx:20116 msgid "Limit AFC movement to this range" msgstr "Ogranicz AFC do zakresu" #: src/dialogs/confdialog.cxx:20135 msgid "Reset to Carrier" msgstr "Przywróc Carrier" #: src/dialogs/confdialog.cxx:20136 msgid "When no signal present" msgstr "Gdy nie występuje sygnał" #: src/dialogs/confdialog.cxx:20144 msgid "General" msgstr "Ogólne" #: src/dialogs/confdialog.cxx:20147 msgid "Report ARQ frames average S/N" msgstr "Raport ramek ARQ" #: src/dialogs/confdialog.cxx:20159 src/dialogs/confdialog.cxx:20242 #: src/dialogs/confdialog.cxx:20244 msgid "Web/WX" msgstr "Sieci Web/WX" #: src/dialogs/confdialog.cxx:20163 msgid "Access URL" msgstr "Adres URL" #: src/dialogs/confdialog.cxx:20164 msgid "Enter METAR data internet URL" msgstr "Wprowadz adres URL internet danych METAR" #: src/dialogs/confdialog.cxx:20170 msgid "Default URL" msgstr "Domyslne URL" #: src/dialogs/confdialog.cxx:20173 msgid "METAR station ID code" msgstr "Kod ID stacji METAR" #: src/dialogs/confdialog.cxx:20174 msgid "" "for example KMDQ for\n" "Huntsville-Madison Executive Airport, AL" msgstr "" "na przykład KMDQ dla \n" "Huntsville-Madison Lotnisko, AL" #: src/dialogs/confdialog.cxx:20179 msgid "Search on web" msgstr "Szukaj w internecie" #: src/dialogs/confdialog.cxx:20182 msgid "Full report" msgstr "Pełny raport" #: src/dialogs/confdialog.cxx:20183 src/dialogs/confdialog.cxx:20237 msgid "Insert full METAR report" msgstr "Wstaw pełny raport METAR" #: src/dialogs/confdialog.cxx:20188 msgid "METAR station location" msgstr "METAR stacja lokalizacja" #: src/dialogs/confdialog.cxx:20189 msgid "Add geopolitical name of METAR station" msgstr "Dodaj geopolityczna nazwę stacji METAR" #: src/dialogs/confdialog.cxx:20194 msgid "Conditions" msgstr "Warunki" #: src/dialogs/confdialog.cxx:20195 msgid "current wx conditions" msgstr "obecne warunki wx" #: src/dialogs/confdialog.cxx:20200 msgid "Fahrenheit" msgstr "Fahrenheit" #: src/dialogs/confdialog.cxx:20201 msgid "report Fahrenheit" msgstr "raport Fahrenheit" #: src/dialogs/confdialog.cxx:20206 msgid "Celsius" msgstr "Celsjusz" #: src/dialogs/confdialog.cxx:20207 msgid "report Celsius" msgstr "raport Celsjusz" #: src/dialogs/confdialog.cxx:20212 msgid "Miles / Hour" msgstr "Mil / Godzina" #: src/dialogs/confdialog.cxx:20213 msgid "report miles per hour" msgstr "raport mil na godzine" #: src/dialogs/confdialog.cxx:20218 msgid "kilometers / hour" msgstr "kilometry / godzina" #: src/dialogs/confdialog.cxx:20219 msgid "report kilometers per hour" msgstr "report kilometrów na godzine" #: src/dialogs/confdialog.cxx:20224 msgid "Inches Hg." msgstr "Cale Hg." #: src/dialogs/confdialog.cxx:20225 msgid "report inches mercury" msgstr "raport slupa rteci" #: src/dialogs/confdialog.cxx:20230 msgid "mbars" msgstr "mbary" #: src/dialogs/confdialog.cxx:20231 msgid "report millibars" msgstr "raport milibary" #: src/dialogs/confdialog.cxx:20236 msgid "Unprocessed METAR data" msgstr "" #: src/dialogs/confdialog.cxx:20254 msgid "Restore defaults" msgstr "Przywróc domyslne" #: src/dialogs/confdialog.cxx:20255 msgid "WARNING - this will over write ALL settings" msgstr "UWAGA - to zresetuje Twoje wszystkie ustawienia" #: src/dialogs/font_browser.cxx:77 msgid "Font color" msgstr "Kolor czcionki" #: src/dialogs/font_browser.cxx:150 msgid "Font:" msgstr "Czcionka:" #: src/dialogs/font_browser.cxx:155 msgid "Size:" msgstr "Rozmiar:" #: src/dialogs/font_browser.cxx:165 msgid "Fixed" msgstr "" #: src/dialogs/font_browser.cxx:169 msgid "&OK" msgstr "&OK" #: src/dialogs/font_browser.cxx:184 msgid "" "abcdefghijklmnopqrstuvwxyz\n" "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" "0123456789" msgstr "" #: src/dialogs/record_browse.cxx:25 src/dialogs/record_browse.cxx:30 msgid "Data files sources" msgstr "Zródlo plików danych" #: src/dialogs/record_browse.cxx:27 msgid "Data files update" msgstr "Aktualizacja plików danych" #: src/dialogs/record_browse.cxx:29 msgid "Tabular data sources" msgstr "Zródla danych tabelarycznych" #: src/dialogs/record_browse.cxx:43 msgid "Data source" msgstr "Zródlo danych" #: src/dialogs/record_browse.cxx:44 msgid "Data files repository" msgstr "Dane repozytorium plików" #: src/dialogs/record_browse.cxx:48 msgid "Update selected local data files with repository content" msgstr "Aktualizuj wybrane pliki danych z repozytorium" #: src/dialogs/record_browse.cxx:52 msgid "Delete local data files if selected." msgstr "Usuń lokalne pliki danych, jesli wybrano." #: src/dialogs/notifydialog.cxx:106 msgid "Event" msgstr "Wydarzenie" #: src/dialogs/notifydialog.cxx:114 msgid "RE:" msgstr "RE:" #: src/dialogs/notifydialog.cxx:146 msgid "DXCC entity" msgstr "Podmiot DXCC" #: src/dialogs/notifydialog.cxx:151 msgid "Show DXCC entities" msgstr "Pokaz podmioty DXCC" #: src/dialogs/notifydialog.cxx:153 msgid "Not worked before" msgstr "Nie zaliczony" #: src/dialogs/notifydialog.cxx:156 msgid "LotW user" msgstr "Uzytkownik LotW" #: src/dialogs/notifydialog.cxx:159 msgid "eQSL user" msgstr "uzytkownik eQSL" #: src/dialogs/notifydialog.cxx:164 msgid "Duplicates" msgstr "Duplikaty" #: src/dialogs/notifydialog.cxx:167 msgid "Ignore duplicates" msgstr "Ignoruj duplikaty" #: src/dialogs/notifydialog.cxx:170 msgid "in:" msgstr "w:" #: src/dialogs/notifydialog.cxx:173 msgid "Time (s):" msgstr "Czas (y):" #: src/dialogs/notifydialog.cxx:196 msgid "Action" msgstr "Akcja" #: src/dialogs/notifydialog.cxx:199 msgid "Trigger limit (s):" msgstr "Limit wyzwalania (s):" #: src/dialogs/notifydialog.cxx:200 msgid "Minimum time between events" msgstr "Minimalny czas między zdarzeniami" #: src/dialogs/notifydialog.cxx:214 msgid "Show alert window:" msgstr "Pokaz okno alarmu:" #: src/dialogs/notifydialog.cxx:228 src/dialogs/notifydialog.cxx:259 msgid "Insert default text" msgstr "Wstaw tekst domyslny" #: src/dialogs/notifydialog.cxx:230 msgid "Hide window after (s):" msgstr "Ukryj okno po (s):" #: src/dialogs/notifydialog.cxx:245 msgid "Append to RX text:" msgstr "Dolacz do tekstu RX:" #: src/dialogs/notifydialog.cxx:261 msgid "Append to TX text:" msgstr "Dołącz do tekstu TX:" #: src/dialogs/notifydialog.cxx:275 msgid "Show macro editor" msgstr "Pokaz edytor makro" #: src/dialogs/notifydialog.cxx:277 msgid "Run program:" msgstr "Uruchom program:" #: src/dialogs/notifydialog.cxx:340 msgid "DXCC entities" msgstr "Podmioty DXCC" #: src/dialogs/notifydialog.cxx:354 msgid "Find country:" msgstr "Znajdz kraj:" #: src/dialogs/notifydialog.cxx:355 msgid "Press return to continue the search" msgstr "Nacisnij przycisk return, aby kontynuowac wyszukiwanie" #: src/dialogs/notifydialog.cxx:367 msgid "Find prefix:" msgstr "Szukaj prefiks:" #: src/logbook/lgbook.cxx:615 msgid "Export Setup" msgstr "Ustaw Eksport" #: src/logbook/lgbook.cxx:616 src/logbook/lgbook.cxx:1631 msgid "Select Records to Export" msgstr "Wybierz Rekordy do eksportu" #: src/logbook/lgbook.cxx:624 src/logbook/lgbook.cxx:825 #: src/logbook/lgbook.cxx:1639 src/logbook/lgbook.cxx:1721 msgid "Check All" msgstr "Zaznacz wszystko" #: src/logbook/lgbook.cxx:627 msgid "Start Date" msgstr "Data rozpoczęcia" #: src/logbook/lgbook.cxx:628 msgid "Start date for export" msgstr "Data rozpoczecia eksportu" #: src/logbook/lgbook.cxx:641 msgid "Stop Date" msgstr "Data koncowa" #: src/logbook/lgbook.cxx:642 msgid "Inclusive stop date for export" msgstr "Ustaw datę koncowa eksportu" #: src/logbook/lgbook.cxx:655 msgid "select by date" msgstr "wybierz według daty" #: src/logbook/lgbook.cxx:656 msgid "Enable to select date range" msgstr "Wlacz aby wybrac zakres dat" #: src/logbook/lgbook.cxx:662 msgid "Select Fields to Export" msgstr "Wybierz pole do Eksportu" #: src/logbook/lgbook.cxx:673 src/logbook/lgbook.cxx:1670 msgid "Freq" msgstr "Częst" #: src/logbook/lgbook.cxx:684 msgid "QSO Date On" msgstr "Data QSO" #: src/logbook/lgbook.cxx:688 msgid "QSO Date Off" msgstr "Data zakonczenia QSO" #: src/logbook/lgbook.cxx:692 msgid "Time ON" msgstr "Czas rozpocz" #: src/logbook/lgbook.cxx:696 src/logbook/lgbook.cxx:1682 msgid "Time OFF" msgstr "Czas zakoncz" #: src/logbook/lgbook.cxx:699 msgid "TX Power" msgstr "Moc Tx" #: src/logbook/lgbook.cxx:702 src/logbook/lgbook.cxx:1686 msgid "RST sent" msgstr "RST wysl" #: src/logbook/lgbook.cxx:706 src/logbook/lgbook.cxx:1690 msgid "RST rcvd" msgstr "RST odebr" #: src/logbook/lgbook.cxx:710 src/logbook/lgbook.cxx:1003 msgid "Qth" msgstr "Qth" #: src/logbook/lgbook.cxx:713 msgid "LOC" msgstr "LOK" #: src/logbook/lgbook.cxx:719 src/logbook/lgbook.cxx:1367 msgid "Age" msgstr "Wiek" #: src/logbook/lgbook.cxx:722 src/logbook/lgbook.cxx:1243 msgid "Station Call" msgstr "Znak Stacji" #: src/logbook/lgbook.cxx:725 src/logbook/lgbook.cxx:1267 msgid "Station QTH" msgstr "QTH Stacji" #: src/logbook/lgbook.cxx:728 msgid "Station LOC" msgstr "Lok Stacji" #: src/logbook/lgbook.cxx:740 src/logbook/lgbook.cxx:1224 msgid "Notes" msgstr "Uwagi" #: src/logbook/lgbook.cxx:743 msgid "QSL rcvd date" msgstr "Data odebr. QSL" #: src/logbook/lgbook.cxx:746 msgid "QSL sent date" msgstr "Data wysl. QSL" #: src/logbook/lgbook.cxx:749 msgid "eQSL rcvd date" msgstr "data odebr. QSL" #: src/logbook/lgbook.cxx:752 msgid "eQSL sent date" msgstr "data wysl. QSL" #: src/logbook/lgbook.cxx:755 msgid "LoTW rcvd date" msgstr "Data odebr. z LoTW" #: src/logbook/lgbook.cxx:758 msgid "LoTW sent date" msgstr "Data wysl. na LoTW" #: src/logbook/lgbook.cxx:761 src/logbook/lgbook.cxx:1132 msgid "QSL-VIA" msgstr "QSL-VIA" #: src/logbook/lgbook.cxx:764 src/logbook/lgbook.cxx:1694 msgid "Serial # in" msgstr "Numer # odebr" #: src/logbook/lgbook.cxx:767 src/logbook/lgbook.cxx:1698 msgid "Serial # out" msgstr "Numer # nadany" #: src/logbook/lgbook.cxx:776 src/logbook/lgbook.cxx:1706 msgid "Exchange Out" msgstr "Nr. kontrolny wyslany" #: src/logbook/lgbook.cxx:785 src/logbook/lgbook.cxx:1174 msgid "CQZ" msgstr "CQZ" #: src/logbook/lgbook.cxx:788 src/logbook/lgbook.cxx:1210 msgid "DXCC" msgstr "DXCC" #: src/logbook/lgbook.cxx:791 src/logbook/lgbook.cxx:1162 msgid "IOTA" msgstr "IOTA" #: src/logbook/lgbook.cxx:794 src/logbook/lgbook.cxx:1198 msgid "ITUZ" msgstr "ITUZ" #: src/logbook/lgbook.cxx:797 msgid "FD class" msgstr "Klasa FD" #: src/logbook/lgbook.cxx:800 msgid "FD section" msgstr "Sekcja FD" #: src/logbook/lgbook.cxx:803 msgid "CW SS SerNo R" msgstr "CW SS SerNo R" #: src/logbook/lgbook.cxx:804 msgid "CW sweepstakes rcvd ser. no." msgstr "CW odebrano ser. nr." #: src/logbook/lgbook.cxx:807 msgid "CW SS Prec'" msgstr "CW SS Prec'" #: src/logbook/lgbook.cxx:808 msgid "CW sweepstakes precedence" msgstr "Pierwszeństwo CW" #: src/logbook/lgbook.cxx:811 msgid "CW SS Check" msgstr "Sprawdz CW SS" #: src/logbook/lgbook.cxx:814 msgid "CW SS Section" msgstr "Sekcja CW SS" #: src/logbook/lgbook.cxx:815 src/logbook/lgbook.cxx:819 msgid "CW sweepstakes section" msgstr "Sekcja CW" #: src/logbook/lgbook.cxx:818 src/logbook/lgbook.cxx:1379 msgid "10-10" msgstr "10-10" #: src/logbook/lgbook.cxx:844 msgid "Logbook" msgstr "Dziennik" #: src/logbook/lgbook.cxx:845 msgid "Date On" msgstr "Data Roz" #: src/logbook/lgbook.cxx:846 msgid "Date QSO started" msgstr "Data roz. QSO" #: src/logbook/lgbook.cxx:858 msgid "Time On" msgstr "Czas Startu" #: src/logbook/lgbook.cxx:859 msgid "Time QSO started" msgstr "Czas roz. QSO" #: src/logbook/lgbook.cxx:871 msgid "Call sign worked" msgstr "Stacja zaliczona" #: src/logbook/lgbook.cxx:883 msgid "Operator worked" msgstr "Operator zaliczony" #: src/logbook/lgbook.cxx:894 msgid "In" msgstr "Odbr" #: src/logbook/lgbook.cxx:895 msgid "Rst received" msgstr "RST odebr" #: src/logbook/lgbook.cxx:906 msgid "Recs" msgstr "Liczba QSO" #: src/logbook/lgbook.cxx:907 msgid "# Records in logbook" msgstr "# Zapisy w dzienniku" #: src/logbook/lgbook.cxx:918 msgid "Date Off" msgstr "Data Zak" #: src/logbook/lgbook.cxx:919 msgid "Date QSO Ended" msgstr "Data zak. QSO" #: src/logbook/lgbook.cxx:931 msgid "Time Off" msgstr "Koniec" #: src/logbook/lgbook.cxx:932 msgid "Time QSO ended" msgstr "Koniec QSO" #: src/logbook/lgbook.cxx:943 msgid "Freq." msgstr "Czestotl." #: src/logbook/lgbook.cxx:944 msgid "Frequency in MHz" msgstr "Czestotliwosc w MHz" #: src/logbook/lgbook.cxx:956 msgid "Mode in use" msgstr "Tryb pracy" #: src/logbook/lgbook.cxx:967 msgid "Pwr" msgstr "Wat" #: src/logbook/lgbook.cxx:968 msgid "Transmit power used" msgstr "Moc nadawania" #: src/logbook/lgbook.cxx:979 msgid "Loc" msgstr "Lok" #: src/logbook/lgbook.cxx:980 msgid "Stations grid square" msgstr "Siatka kwadratów" #: src/logbook/lgbook.cxx:991 msgid "Out" msgstr "Wysl" #: src/logbook/lgbook.cxx:992 msgid "Rst sent" msgstr "RST wyslane" #: src/logbook/lgbook.cxx:1004 msgid "City of station worked" msgstr "Stacja zaliczona z Miasta" #: src/logbook/lgbook.cxx:1015 msgid "St" msgstr "St" #: src/logbook/lgbook.cxx:1016 msgid "US state of station worked" msgstr "Stacja zaliczona ze stanu USA" #: src/logbook/lgbook.cxx:1027 msgid "Pr" msgstr "Pr" #: src/logbook/lgbook.cxx:1028 msgid "Province of station worked" msgstr "Stacja zaliczona z Prowincji" #: src/logbook/lgbook.cxx:1040 msgid "Country of station worked" msgstr "Stacja zaliczona z Kraju" #: src/logbook/lgbook.cxx:1053 msgid "QSL" msgstr "QSL" #: src/logbook/lgbook.cxx:1054 msgid "QSL-rcvd" msgstr "QSL-odebr" #: src/logbook/lgbook.cxx:1055 src/logbook/lgbook.cxx:1068 #: src/logbook/lgbook.cxx:1081 msgid "QSL received on this date" msgstr "QSL odebr. w dniu" #: src/logbook/lgbook.cxx:1067 msgid "EQSL-rcvd" msgstr "Odbr eQSL" #: src/logbook/lgbook.cxx:1080 msgid "LOTW-rcvd" msgstr "LoTW-odebr" #: src/logbook/lgbook.cxx:1093 msgid "QSL-sent" msgstr "QSL-wyslana" #: src/logbook/lgbook.cxx:1094 src/logbook/lgbook.cxx:1107 #: src/logbook/lgbook.cxx:1120 msgid "QSL sent on this date" msgstr "QSL wysylana w dniu" #: src/logbook/lgbook.cxx:1106 msgid "EQSL-sent" msgstr "EQSL-wysł" #: src/logbook/lgbook.cxx:1119 msgid "LOTW-sent" msgstr "LoTW-wysł" #: src/logbook/lgbook.cxx:1133 msgid "QSL route of contacted station" msgstr "QSL droga laczenia stacji" #: src/logbook/lgbook.cxx:1163 msgid "Islands on the air" msgstr "Wyspa" #: src/logbook/lgbook.cxx:1186 msgid "Cont'" msgstr "Kontynent" #: src/logbook/lgbook.cxx:1211 msgid "DXCC designator" msgstr "Identyfikator DXCC" #: src/logbook/lgbook.cxx:1227 src/logbook/lgbook.cxx:1244 #: src/logbook/lgbook.cxx:1256 src/logbook/lgbook.cxx:1268 #: src/logbook/lgbook.cxx:1280 msgid "Interesting notes" msgstr "Ciekawe notatki" #: src/logbook/lgbook.cxx:1241 msgid "My Station" msgstr "Moja stacja" #: src/logbook/lgbook.cxx:1279 msgid "Station Locator" msgstr "Lokator Stacji" #: src/logbook/lgbook.cxx:1295 msgid "Ser out" msgstr "Nr wyslany" #: src/logbook/lgbook.cxx:1296 src/logbook/lgbook.cxx:1421 msgid "Contest seral # sent" msgstr "Zawody numer # wysl" #: src/logbook/lgbook.cxx:1307 msgid "Exch Out" msgstr "Nr. kontrolny wyslany" #: src/logbook/lgbook.cxx:1308 src/logbook/lgbook.cxx:1445 msgid "Contest exchange sent" msgstr "Zawody nr. kontrolny" #: src/logbook/lgbook.cxx:1319 msgid "Ser in" msgstr "Nr odebrany" #: src/logbook/lgbook.cxx:1320 msgid "Contest serial # received" msgstr "Zawody numer # odebrany" #: src/logbook/lgbook.cxx:1331 msgid "Exch In" msgstr "Nr. kontrolny odbr" #: src/logbook/lgbook.cxx:1332 src/logbook/lgbook.cxx:1457 msgid "Contest exchange received" msgstr "Zawody nr. kontrolny Rx" #: src/logbook/lgbook.cxx:1344 msgid "Field Day class received" msgstr "Odebrana klasa polny dzień" #: src/logbook/lgbook.cxx:1355 msgid "ARRL Sect" msgstr "ARRL Sekcja" #: src/logbook/lgbook.cxx:1356 msgid "Field Section received" msgstr "Sekcja Field Day odebrana" #: src/logbook/lgbook.cxx:1368 msgid "Operators age received" msgstr "Wiek operatorów otrzymany" #: src/logbook/lgbook.cxx:1380 msgid "Ten Ten number received" msgstr "Dziesięc z Dziesięciu otrzymanych numerów" #: src/logbook/lgbook.cxx:1392 msgid "Operating band" msgstr "Pasmo operacyjne" #: src/logbook/lgbook.cxx:1404 msgid "Check value received" msgstr "Sprawdz otrzymaną wartość" #: src/logbook/lgbook.cxx:1417 msgid "CW SS" msgstr "CW SS" #: src/logbook/lgbook.cxx:1418 msgid "CW Sweepstakes Contest" msgstr "Zawody CW" #: src/logbook/lgbook.cxx:1420 msgid "Ser NoR" msgstr "Nr NoR" #: src/logbook/lgbook.cxx:1444 msgid "Precedence" msgstr "Pierwszeństwo" #: src/logbook/lgbook.cxx:1470 msgid "JOTA" msgstr "JOTA" #: src/logbook/lgbook.cxx:1471 msgid "Jamboree On The Air" msgstr "Zlot na powietrzu" #: src/logbook/lgbook.cxx:1473 msgid "Troop-S" msgstr "Hufiec-S" #: src/logbook/lgbook.cxx:1474 msgid "Sent troop number" msgstr "Liczba wysłana" #: src/logbook/lgbook.cxx:1485 msgid "Troop-R" msgstr "Troop-R" #: src/logbook/lgbook.cxx:1486 msgid "Received troop number" msgstr "Odebrany numer" #: src/logbook/lgbook.cxx:1497 msgid "Name-S" msgstr "Nazwa-S" #: src/logbook/lgbook.cxx:1498 msgid "Sent scout name" msgstr "Wysłano nazwę harcerza" #: src/logbook/lgbook.cxx:1509 msgid "Name-R" msgstr "Nazwa-R" #: src/logbook/lgbook.cxx:1510 msgid "Received scout name" msgstr "Otrzymano nazwę scouta" #: src/logbook/lgbook.cxx:1526 msgid "Call Search" msgstr "Szukaj Stacji" #: src/logbook/lgbook.cxx:1527 msgid "Search for this callsign" msgstr "Szukaj tego znaku" #: src/logbook/lgbook.cxx:1539 msgid "Find previous" msgstr "Szukaj poprzedni" #: src/logbook/lgbook.cxx:1547 msgid "Find next" msgstr "Szukaj nastepny" #: src/logbook/lgbook.cxx:1554 msgid "Retrieve" msgstr "Odbierz" #: src/logbook/lgbook.cxx:1555 msgid "Retrieve for active modem use" msgstr "Pobierz dla aktywnego modemu" #: src/logbook/lgbook.cxx:1568 msgid "New record / Save record" msgstr "Nowy rekord / Zapisz rekord" #: src/logbook/lgbook.cxx:1575 msgid "Update the current record" msgstr "Aktualizuj aktualny rekord" #: src/logbook/lgbook.cxx:1582 msgid "Delete the current record" msgstr "Kasuj aktualny rekord" #: src/logbook/lgbook.cxx:1588 msgid "File:" msgstr "Plik:" #: src/logbook/lgbook.cxx:1611 msgid "Date" msgstr "Data" #: src/logbook/lgbook.cxx:1613 msgid "Time" msgstr "Czas" #: src/logbook/lgbook.cxx:1630 msgid "Cabrillo Setup" msgstr "Ustaw Cabrillo" #: src/logbook/lgbook.cxx:1650 msgid "Select Cabrillo Contest & Fields" msgstr "Wybierz Cabrillo Zawody & Pola" #: src/logbook/lgbook.cxx:1653 msgid "Contest:" msgstr "Zawody:" #: src/logbook/lgbook.cxx:1678 msgid "QSO Date" msgstr "Data QSO" #~ msgid "Searches passband" #~ msgstr "Pasmo przepustowe wyszukiwania" #~ msgid "Lighted button enabled colors" #~ msgstr "Aktywne przyciski podswietlane kolorem" #~ msgid "All Others" #~ msgstr "Wszystkie inne" #~ msgid "Receive modes" #~ msgstr "Emisje RX" #~ msgid "Comp (msec)" #~ msgstr "Comp (msek)" #~ msgid "Transceiver FSK" #~ msgstr "Transceiver FSK" #~ msgid "TCP-IP sessions" #~ msgstr "Sesje TCP-IP" #~ msgid "NBEMS interface" #~ msgstr "Interfejs NBEMS" #~ msgid "Signal level" #~ msgstr "Poziom sygnalu" #, fuzzy #~ msgid "Rx audio stream ON" #~ msgstr "Okno Audio Rx" #~ msgid "Filter Settings" #~ msgstr "Ustawienia filtra" #~ msgid "BW" #~ msgstr "BW" #~ msgid "Mid" #~ msgstr "Mid" #, fuzzy #~ msgid "Filter center frequ ency" #~ msgstr "Dodaj aktualna częstotliwosc" #, fuzzy #~ msgid "Filter low cutoff frequency" #~ msgstr "Ustaw kursor częstotliwosci" #, fuzzy #~ msgid "Filter high cutoff frequency" #~ msgstr "Wyswietl narastanie wyzszych częstotliwosci" #~ msgid "track WF cursor" #~ msgstr "kolor sciezki" #~ msgid "Vol'" #~ msgstr "Vol'" #, fuzzy #~ msgid "Rx audio volume" #~ msgstr "Okno Audio Rx" #~ msgid "Filtered audio" #~ msgstr "Filtruj dzwięk" #, fuzzy #~ msgid "Enable DSP filtering of rx audio stream" #~ msgstr "Aktywuj transmisje tekstu rx" #~ msgid "Weather Fax Image RX" #~ msgstr "Obraz odebranego faksu pogody" #~ msgid "No file name given" #~ msgstr "Nie podano nazwy pliku" #~ msgid "channels != 1" #~ msgstr "kanaly != 1" #~ msgid "unknown wave file error" #~ msgstr "nieznany bład pliku wave" #~ msgid "Rig control" #~ msgstr "Ustaw RIG" #~ msgid "Flrig I/O" #~ msgstr "Flrig I/O" #~ msgid "RPC" #~ msgstr "RPC" #~ msgid "Spotter" #~ msgstr "Wtyczka" #~ msgid "KISS control" #~ msgstr "Ustaw KISS" #~ msgid "Mac Logger" #~ msgstr "MacLogger" #~ msgid "Log sources" #~ msgstr "Log podstawowy" #~ msgid "Change log level" #~ msgstr "Zmiana poziomu Logu" #~ msgid "Waveform Audio Format]\t*.{mp3,wav}\n" #~ msgstr "Audio w formacie ]\t*.{mp3,wav}\n" #~ msgid "Waveform Audio Format\t*.wav\n" #~ msgstr "Waveform Audio Format\t*.wav\n" #~ msgid "Free Lossless Audio Codec\t*.flac" #~ msgstr "Darmowy bezstratny Audio Kodek\t*.flac" #~ msgid "Embedded Wefax Gui" #~ msgstr "Wbudowany Wefax Gui" #~ msgid "" #~ "Display tx and rx in main fldigi window.\n" #~ "Change requires restart of fldigi" #~ msgstr "" #~ "Ustaw TX i RX w oknie glównym fldigi.\n" #~ "Zmiana wymaga restartu fldigi" #~ msgid "Hide Transmission window" #~ msgstr "Ukryj okno nadawania" #~ msgid "Hide transmission window by default." #~ msgstr "Ukryj okno nadawania domyślnie." #~ msgid "Center freq (1500 Hz)" #~ msgstr "Centruj czestot.(1500 Hz)" #~ msgid "Save image as monochrome file" #~ msgstr "Zapisz obraz jako plik monochromatyczny" #~ msgid "Save the fax image as a gray-level PNG file." #~ msgstr "Zapisz obraz faksu jako szary plik PNG." #~ msgid "Misc/IO" #~ msgstr "Rózne/IO" #~ msgid "Misc/NBEMS" #~ msgstr "Rózne/NBEMS" #~ msgid "Retry Interval (msec)" #~ msgstr "Interwał ponawiania (msek)" #~ msgid "Msec's between retries" #~ msgstr "Milisekund między próbami" #~ msgid "Alerts / Rx Audio" #~ msgstr "Alarm/audio RX" #~ msgid "" #~ "That crazy fox jumped over the dog again!\n" #~ "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" #~ "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #~ msgstr "" #~ "To szalone lis przeskoczył nad psem ponownie!\n" #~ "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789\n" #~ "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~" #~ msgid "Reading fonts..." #~ msgstr "Odczyt czcionek...." #~ msgid "Set Mid point of filter at waterfall cursor" #~ msgstr "Ustaw środkowy punkt filtra na kursorze wodospadu" #~ msgid "Weight (%)" #~ msgstr "Waga (%)" #~ msgid "Dot to dot-space ratio" #~ msgstr "Stosunek kropki do kropki" #~ msgid "Edge decrease" #~ msgstr "Zmniejsz szerokość krawedzi" #~ msgid "Weight decreases with increasing edge timing" #~ msgstr "Waga maleje wraz wzrostem czasu krawędzi" #~ msgid "BPF transmit audio" #~ msgstr "BPF transmisja audio" #~ msgid "Enable LO/HI bfp of transmit audio" #~ msgstr "Włącz LO/HI bfp z transmisja dzwieku" #~ msgid "BPF bw" #~ msgstr "BPF bw" #~ msgid "Low filter cutoff" #~ msgstr "Niski filtr odciecia" #~ msgid "Msec pre-keydown (+ is earlier in time)" #~ msgstr "Msek pre-keydown ( jest wczesniej w czasie)" #~ msgid "Msec post-keydown (+ is earlier in time)" #~ msgstr "Msek po keydown ( + wczesniej w czasie)" #~ msgid "User Interface" #~ msgstr "Interfejs uzytkownika" #~ msgid "Operating" #~ msgstr "Operator" #~ msgid "Active Modem" #~ msgstr "Aktywny modem" #~ msgid "Winkeyer" #~ msgstr "Winkeyer" #~ msgid "Miscellaneous" #~ msgstr "Różne" #~ msgid "CPU speed" #~ msgstr "Prędkosc CPU" #~ msgid "PSKmail" #~ msgstr "PSKmail" #~ msgid "Sweet spot" #~ msgstr "Ustalone miejsce" #~ msgid "Text IO" #~ msgstr "Tekst IO" #~ msgid "WX" #~ msgstr "WX" #~ msgid "KML" #~ msgstr "KML" #~ msgid "IO" #~ msgstr "IO" #~ msgid "PSM" #~ msgstr "PSM" #~ msgid "Contest/Logging" #~ msgstr "Zawody/Log" #~ msgid "QRZ/eQSL" #~ msgstr "QRZ/eQSL" #~ msgid "AU\t*.{au,snd}\n" #~ msgstr "AU\t*.{au,snd}\n" #~ msgid "Station / Operator" #~ msgstr "Stacja / operator" #~ msgid "Browser" #~ msgstr "Przeglądarka" #~ msgid "Log" #~ msgstr "Dziennik" #~ msgid "QSO" #~ msgstr "QSO" #~ msgid "WF Ctrls" #~ msgstr "Wodospad" #~ msgid "Clrs/Fnts" #~ msgstr "Kolor/Czcionka" #~ msgid "Rx/Tx" #~ msgstr "Rx/Tx" #~ msgid "F_keys" #~ msgstr "F_klucz" #~ msgid "Tabs" #~ msgstr "Karty" #~ msgid "Buttons" #~ msgstr "Przyciski" #~ msgid "SigLvl" #~ msgstr "Syg/kol" #~ msgid "Display" #~ msgstr "Wyswietl" #~ msgid "Mouse" #~ msgstr "Mysz" #~ msgid "Spectrum" #~ msgstr "Widmo" #~ msgid "TX WPM" #~ msgstr "TX WPM" #~ msgid "Paddle WPM" #~ msgstr "Łopatki WPM" #~ msgid "Do not send CAT PTT signal" #~ msgstr "Nie wysyłaj sygnału CAT PTT" #~ msgid "Dom" #~ msgstr "Tlumienie" #~ msgid "Feld" #~ msgstr "Panel" #~ msgid "IFKP" #~ msgstr "IFKP" #~ msgid "MT-63" #~ msgstr "MT-63" #~ msgid "Oliv" #~ msgstr "Oliv" #~ msgid "Cont" #~ msgstr "Kont" #~ msgid "PSK" #~ msgstr "PSK" #~ msgid "TTY" #~ msgstr "TTY" #~ msgid "Rx" #~ msgstr "Rx" #~ msgid "Tx" #~ msgstr "Tx" #~ msgid "Synop" #~ msgstr "Synop" #~ msgid "Thor" #~ msgstr "Thor" #~ msgid "Nav" #~ msgstr "Nav" #~ msgid "WFx" #~ msgstr "WFx" #~ msgid "Default 800 Hz. Deutsche Wetterdienst 850Hz" #~ msgstr "Domyślnie 800 Hz. Niemcy 850Hz" #~ msgid "Received fax maximum rows number (5000)" #~ msgstr "Odebrano maksymalną liczbę wierszy fax (5000)" #~ msgid "Maximum row number for a received fax image." #~ msgstr "Maksymalna liczba wierszy dla uzyskanego obrazu faksu" #~ msgid "Rig" #~ msgstr "Rig" #~ msgid "RigCAT" #~ msgstr "RigCAT" #~ msgid "Hamlib" #~ msgstr "Hamlib" #~ msgid "GPIO" #~ msgstr "GPIO" #~ msgid "Devices" #~ msgstr "Urządzenia" #~ msgid "Wav" #~ msgstr "Wav" #~ msgid "Alerts" #~ msgstr "Alerty" #~ msgid "Regex Match in Browser" #~ msgstr "Dopasowanie Regex w przeglądarce" #~ msgid "MYCALL Match in Browser" #~ msgstr "MYCALL Dopasuj w przeglądarce" #~ msgid "flmsg interface" #~ msgstr "Interfejs flmsg" #~ msgid "ID" #~ msgstr "ID" #~ msgid "Open squelch for nn sec if RSID detected" #~ msgstr "Otworz squelch dla nn sek jeśli RSID jest wykrywane" #~ msgid "CPU" #~ msgstr "CPU" #~ msgid "Spotting" #~ msgstr "Spotting" #~ msgid "PSK Reporter" #~ msgstr "PSK Reporter" #~ msgid "Weather query specification" #~ msgstr "Specyfikacja zapytania o pogode" #~ msgid "Temperature" #~ msgstr "Temperatura" #~ msgid "Wind speed/dir" #~ msgstr "Prędkosc wiatru" #~ msgid "Barometric pressure" #~ msgstr "Cisnienie barometryczne" #~ msgid "eQSL" #~ msgstr "eQSL" #~ msgid "Use password for tqsl access" #~ msgstr "Użyj hasła do dostępu do tqsl" #~ msgid "Must be enabled" #~ msgstr "Musi być wlaczony" #~ msgid "XML-RPC" #~ msgstr "XML-RPC" #~ msgid "" #~ "Rig control via external\n" #~ "program using xmlrpc\n" #~ "remote calls." #~ msgstr "" #~ "Ustawienia Rig przez zewnętrzny\n" #~ "program za pomocą xmlrpc\n" #~ "zdalnej stacji" #~ msgid "Use XML-RPC program" #~ msgstr "Użyj programu XML-RPC" #~ msgid "Experimental" #~ msgstr "Próbny" #~ msgid "Initialize XML-RPC rig control" #~ msgstr "Inicjalizuj sterowanie rig XML-RPC " #~ msgid "" #~ "Delay in seconds between \tLDT in iso-8601 format" #~ msgstr "\tLDT format iso-8601" #~ msgid "\tZDT in iso-8601 format" #~ msgstr "\tZDT format iso-8601" #~ msgid "\tUTC datetime" #~ msgstr "\tczas data UTC" #~ msgid "ALC emulation on" #~ msgstr "Emulacja ALC" #~ msgid "User Interface - Browser" #~ msgstr "Interfejs uzytkownika - Przeglądarka" #~ msgid "User Interface - General" #~ msgstr "Interfejs uzytkownika- Ogólne" #~ msgid "User Interface - Colors / Fonts" #~ msgstr "Interfejs uzytkownika - Kolor / Czcionka" #~ msgid "User Interface - Contest" #~ msgstr "Interfejs uzytkownika -Zawody" #~ msgid "User Interface - Macros" #~ msgstr "Interfejs uzytkownika - Makra" #~ msgid "User Interface - Waterfall controls" #~ msgstr "Interfejs uzytkownika - Ustawienia Wodospadu" #~ msgid "Rig Control using xml spec file" #~ msgstr "Sterowanie Rig - plik xml" #~ msgid "Callsign database" #~ msgstr "Baza danych Stacji" #~ msgid "Program to Program Communications" #~ msgstr "Program do Programu Komunikacji" #~ msgid "Power Signal Monior" #~ msgstr "Monitor mocy sygnalu" #~ msgid "Field Day Viewer" #~ msgstr "Zobacz Field Day" #~ msgid "Callsign:" #~ msgstr "Znak stacji:" #~ msgid "Name:" #~ msgstr "Imię:" #~ msgid "Transmit width" #~ msgstr "Szerokosc transmisji" #~ msgid "# of multiple scans / character line" #~ msgstr "# wiele skanów / linia znaków" #~ msgid "Halve receive width" #~ msgstr "Zmniejsz o połowę szerokość odbioru" #~ msgid "Compress Rx in time" #~ msgstr "Kompresja Rx w czasie" #~ msgid "2x Xmt Width (hidden)" #~ msgstr "2x Xmt Szeroki (ukryty)" #~ msgid "Revert" #~ msgstr "Odwróc" #~ msgid "Reset rigCAT interface" #~ msgstr "Resetuj interfejs RigCAT" #~ msgid "Reset hamlib interface" #~ msgstr "Resetuj interfejs hamlib " #~ msgid "Use GPIO PTT" #~ msgstr "Uzyj GPIO PTT" #~ msgid "Select GPIO port" #~ msgstr "Wybierz port GPIO" #~ msgid "QSL-2" #~ msgstr "QSL-2" #~ msgid "Rig control and logging" #~ msgstr "Ustaw Rig i dziennik" #~ msgid "Rig control and contest" #~ msgstr "Ustaw Rig i zawody" #~ msgid "Visit URL" #~ msgstr "zobacz URL" #~ msgid "Copy URL" #~ msgstr "Kopiuj URL" #~ msgid "Controls" #~ msgstr "Ustawienia" #~ msgid "" #~ "Could not check for updates:\n" #~ "%s" #~ msgstr "" #~ "Nie mozna sprawdzic dostepnosci aktualizacji:\n" #~ "%s" #~ msgid "# S" #~ msgstr "# S" #~ msgid "# R" #~ msgstr "# R" #~ msgid "Ex" #~ msgstr "Ex" #~ msgid "Monitor KISS Pwr Squelch" #~ msgstr "Monitor KISS Pwr Squelch" #~ msgid "Empty ADIF logbook file %s" #~ msgstr "Pusty plik ADIF dziennika %s" #~ msgid "Error reading %s" #~ msgstr "Błąd odczytu %s" #~ msgid "Quick entry" #~ msgstr "Szybki wpis" #~ msgid "Exchanges" #~ msgstr "Wymiana" #~ msgid "Transmit all text in lower case" #~ msgstr "Nadaj tekst malymi literami" #~ msgid "User Interface - Logging" #~ msgstr "Interfejs uzytkownika- Dziennik" #~ msgid "Client/Server Logbook" #~ msgstr "Klient/Serwer Logbook" #~ msgid "Enter URL address of server" #~ msgstr "Wpisz adres URL serwera" #~ msgid "Enter Port # assigned to server" #~ msgstr "Wpisz Port # przypisany do serwera" #~ msgid "Prompt to save macro file when closing" #~ msgstr "Monituj o zapisanie pliku przy zamykaniu makro" #~ msgid "Wefax" #~ msgstr "Wefax" #, fuzzy #~ msgid "PTT is a hamlib command" #~ msgstr "PTT za pomocą komend pakietu hamlib" #~ msgid "Mono audio output" #~ msgstr "Wyjscie audio mono" #~ msgid "Force output audio to single channel" #~ msgstr "Wyjscie audio siła do jednego kanału" #~ msgid "End of header string:" #~ msgstr "Koniec ciągu znakow" #~ msgid "" #~ "Text defining end of METAR header\n" #~ "Typically 'Connection: close'\n" #~ "Used to search for station name" #~ msgstr "" #~ "Tekst definiowania koniec naglówka METAR\n" #~ "Zazwyczaj 'Polaczenie zamkniete'\n" #~ "Uzywane do wyszukiwania nazwy stacji" #~ msgid "QRZ online via default Internet Browser" #~ msgstr "QRZ online poprzez przeglądarkę internetową" #~ msgid "HamCall online via default Internet Browser" #~ msgstr "HamCall poprzez przeglądarkę internetową" #~ msgid "HamQTH via default Internet Browser" #~ msgstr "HamQTH przez przeglądarke internetowa" #~ msgid "IP Address format: nnn.nnn.nnn.nnn" #~ msgstr "Adres IP format: nnn.nnn.nnn.nnn" #~ msgid "XMLRPC" #~ msgstr "XMLRPC" #~ msgid "IP Address for KISS interface" #~ msgstr "Adres IP dla interfejsu KISS" #, fuzzy #~ msgid "Continue After (sec)" #~ msgstr "Kontynuuj po (sek)" #~ msgid "Dual Port" #~ msgstr "Podwójny port" #~ msgid "CONT" #~ msgstr "Kontynent" #~ msgid "Dial" #~ msgstr "Dial" #~ msgid "Continue" #~ msgstr "Kontynuuj" #~ msgid "\tvideo text" #~ msgstr "\tvideo tekst" #~ msgid "Raised cosine = Hanning" #~ msgstr "Podniesiony cosinus = Hanning" #~ msgid "No rig specified" #~ msgstr "Nie wybrano rig" #~ msgid "" #~ "Enter frequency or change with\n" #~ "Left/Right/Up/Down/Pg_Up/Pg_Down" #~ msgstr "" #~ "Wprowadz częstotliwosc lub zmien z\n" #~ "listy." #~ msgid "Enter Xcvr Freq" #~ msgstr "Wpisz xcvr Czest." #~ msgid "Enable if you cannot use the middle mouse button" #~ msgstr "Wlacz gdy nie mozesz uzyc srodkowego przycisku myszy" #, fuzzy #~ msgid "Frq Disp" #~ msgstr "Ekran częstotl" #~ msgid "Label text" #~ msgstr "tekst etykiety" #~ msgid "Mixer" #~ msgstr "Mikser" #~ msgid "OSS Mixer" #~ msgstr "OSS Mikser" #~ msgid "Manage mixer" #~ msgstr "Zarządzaj mikserem" #~ msgid "Add mixer controls to main dialog" #~ msgstr "Dodaj sterowniki miksera do okna dialogowego" #~ msgid "Select Mixer device" #~ msgstr "Wybierz urządzenie Miksera" #~ msgid "Mic In" #~ msgstr "Wej Mik" #~ msgid "Use microphone input" #~ msgstr "Uzyj wejścia mikrofonowego" #~ msgid "Line In" #~ msgstr "Line In" #~ msgid "Use Line-In device" #~ msgstr "Uzyj urządzenia Line-In" #~ msgid "PCM" #~ msgstr "PCM" #~ msgid "Set the sound card PCM level" #~ msgstr "Ustaw poziom karty dzwiękowej PCM" #~ msgid "" #~ "Enter full path-filename for external program\n" #~ "Or simple name of program" #~ msgstr "" #~ "Wpisz pełna sciezke, nazwe pliku\n" #~ "lub nazwe programu" #~ msgid "" #~ "Exit prompts active only when File/Exit menu item selected.\n" #~ "Not active if window decoration close button pressed." #~ msgstr "" #~ "Wyjscie wyswietlane tylko wtedy, gdy aktywny Plik/Wyjscie z menu " #~ "wybrano.\n" #~ "Nie jest aktywne jesli dekoracja przycisku okna wcisnieta." #, fuzzy #~ msgid "Char set" #~ msgstr "Wyczysc listę" #~ msgid "Select the rig by name" #~ msgstr "Wybierz rig wg nazwy" #~ msgid "" #~ "Force the rig sideband. Takes\n" #~ "effect when rig mode changes." #~ msgstr "" #~ "Wymuszenie rig wstęgi bocznej. Trwa\n" #~ "efekt, gdy rig zmieni tryb .." #~ msgid "FFT latency (scan merging)" #~ msgstr "FFT opóznienie (skanowanie polaczenia)" #~ msgid "" #~ "Latency increases frequency resolution,\n" #~ "decreases time resolution. 1 = no scan merging" #~ msgstr "" #~ "Opóznienie zwiększa rozdzielczosc częstotliwosci\n" #~ "zmniejsza rozdzielczosc czasową. 1 = bez skanowania polaczenia" #~ msgid "Save image as:" #~ msgstr "Zapisz obraz jako:" #~ msgid "Colors and Fonts" #~ msgstr "Kolory i czcionki" #, fuzzy #~ msgid "Disp" #~ msgstr "Wyswietl" #~ msgid "64-bit (long) interleave" #~ msgstr "64-bitowy (długi) Przeplot" #, fuzzy #~ msgid "Reset Filter to Optimum bandwidth" #~ msgstr "Filtr odbiorczy szerokosci pasma" #, fuzzy #~ msgid "Filter Quality" #~ msgstr "Przepustowosc filtru" #~ msgid "Navtex stations file:" #~ msgstr "Plik stacji Navtex" #~ msgid "Memory Mapped Rig" #~ msgstr "Pamiec zamapowana Rig" #~ msgid "Set page width" #~ msgstr "Ustaw szerokosc strony" #~ msgid "after:" #~ msgstr "po:" #~ msgid "RX" #~ msgstr "RX" #~ msgid "TX" #~ msgstr "TX" #~ msgid "X-agc (hidden)" #~ msgstr "X-agc (ukryj)" #~ msgid "MemMap" #~ msgstr "MemMap" #~ msgid "" #~ "Control via Memory Mapped\n" #~ "shared variables\n" #~ "i.e.: Kachina program" #~ msgstr "" #~ "Sterowanie poprzez zmapowane\n" #~ "wspólne zmienne\n" #~ "czyli: program Kachina" #~ msgid "Use Memmap" #~ msgstr "Uzyj Memmap" #~ msgid "Rig control via memory mapped Kachina" #~ msgstr "Kontrola Rig przez Zmapowane Kachina" #~ msgid "Initialize Memmap interface" #~ msgstr "Inicjalizuj interfejs Memmap" #, fuzzy #~ msgid "Displays" #~ msgstr "Wyswietl" #~ msgid "Tx Power" #~ msgstr "Moc Tx" #~ msgid "Ser# in" #~ msgstr "Nr# odebrany" #~ msgid "QSO Freq" #~ msgstr "Czest. QSO" #~ msgid "Cnty" #~ msgstr "Kraj" #~ msgid "#Out" #~ msgstr "RSTw" #~ msgid "#In" #~ msgstr "RSTo" #~ msgid "Xchg" #~ msgstr "Xchg" #~ msgid "File exists. Are you sure you want to overwrite?" #~ msgstr "Plik istnieje. Czy na pewno chcesz go zastąpic?" #~ msgid "Tracking range (WPM)" #~ msgstr "Sledzenie zakresu (WPM)" #~ msgid "DomEX" #~ msgstr "DomEX" #~ msgid "On Date" #~ msgstr "Data rozpoczęcia" #~ msgid "Off Date" #~ msgstr "Data zakonczenia" #~ msgid "Save log before exiting?" #~ msgstr "Zapisz log przed wyjściem z programu?" #~ msgid "Save changed macros before exiting?" #~ msgstr "Zapisac zmienione makra przed wyjsciem?" #~ msgid "View log" #~ msgstr "Zobacz log" #~ msgid "A message was logged" #~ msgstr "Wiadomość została zalogowana" #~ msgid "The right audio channel is disabled. Enable it now?" #~ msgstr "Prawy kanał audio jest wylaczony. Właczyc teraz?" #~ msgid "Gen'" #~ msgstr "Ogolne" #~ msgid "Double-click on RX text enters QSO data" #~ msgstr "Kliknij dwukrotnie na tekst RX wchodzi QSO danych" #~ msgid "Cursor color" #~ msgstr "Kolor kursora" #~ msgid "Cursor center line" #~ msgstr "Kursor linia środkowa" #~ msgid "Bandwidth tracks" #~ msgstr "Pasmo ścieżki" #~ msgid "Tracks color" #~ msgstr "kolor ścieżki" #~ msgid "Wide tracks" #~ msgstr "Szerokie ścieżki" #~ msgid "Wide center line" #~ msgstr "Szeroka linia środkowa" #~ msgid "Wide cursor" #~ msgstr "szeroki kursor" #~ msgid "Tx Atten (dB)" #~ msgstr "Aten. Tx (dB)" #~ msgid "QRZ/etal" #~ msgstr "QRZ/etal" #~ msgid "CDROM" #~ msgstr "CDROM" #~ msgid "Subscriber data" #~ msgstr "Informacje o użytkowniku" #~ msgid "eQSL upload when record logged" #~ msgstr "eQSL przesłać gdy zapis zalogowany" #~ msgid "Default message sent with eQSL" #~ msgstr "Domyślna wiadomość wysłana z eQSL" #~ msgid "FH" #~ msgstr "Feld Hell" #~ msgid "Packet" #~ msgstr "Pakiet" #~ msgid "Select packet baudrate" #~ msgstr "Wybierz szybkośc pakietów" #~ msgid "RX Low Freq Gain" #~ msgstr "RX niski zysk Częst" #~ msgid "Processing gain to apply to lower tone (in dB)" #~ msgstr "Przetwarzanie wzmocnienia stosuje się do niższego tonu (w dB)" #~ msgid "RX High Freq Gain" #~ msgstr "RX Wysoki Zysk Częst" #~ msgid "Processing gain to apply to higher tone (in dB)" #~ msgstr "Zysk przetwarzania stosuje się do wyższego tonu (w dB)" #~ msgid "TX Low Freq Gain" #~ msgstr "Zmniejsz zysk częst.Tx" #~ msgid "TX High Freq Gain" #~ msgstr "Zysk częst. Tx" #~ msgid "add RX timestamps" #~ msgstr "dodaj znaczniki czasu RX" #~ msgid "decode Compressed data" #~ msgstr "dekodowanie danych skompresowanych" #~ msgid "Decode received Compressed Position data" #~ msgstr "Dekodowanie oodebranych skompresowanych danych pozycjonowania" #~ msgid "decode Mic-E data" #~ msgstr "dekodowania danych Mic-E" #~ msgid "Decode received Mic-E data" #~ msgstr "Dekodowanie odebranych danych Mic-E" #~ msgid "decode PHG data" #~ msgstr "dekodowania danych PHG" #~ msgid "Decode received PHG data" #~ msgstr "Dekodowania odebranych danych PHG" #~ msgid "use SI units" #~ msgstr "używaj jednostek SI" #~ msgid "use English units" #~ msgstr "używaj angielskich jednostek" #~ msgid "Display decoded data in English units" #~ msgstr "Wyświetl zdekodowane dane w jednostkach angielskich" #~ msgid "Use cross-hair scope" #~ msgstr "Użyj oscyloskopu cross-hair" #~ msgid "Defaults to syncscope instead of phase (cross-hair) scope" #~ msgstr "Domyślnie syncscope zamiast zakres fazy (cross -hair )" #~ msgid "add additional gain to audio input for low-output interfaces" #~ msgstr "" #~ "dodaj dodatkowe wzmocnienie wejścia audio dla niskich wyjściowych " #~ "interfejsów" #~ msgid "Display true frequency in the waterfall" #~ msgstr "Wyświetl prawdziwą częstotliwość w wodospadzie" #~ msgid "" #~ "Enable to show the true transmit frequency on the waterfall when the " #~ "radio is in CW (A1A) mode" #~ msgstr "" #~ "Włącz, aby pokazać prawdziwy częstotliwość nadawania na wodospadzie gdy " #~ "radio jest w CW ( A1A ) trybie)" #~ msgid "Corrupt ADIF file" #~ msgstr "Uszkodzony plik ADIF" #~ msgid "Callsign DB" #~ msgstr "Stacja DB" #~ msgid "Paid online subscription" #~ msgstr "Płatny abonament internetowy" #~ msgid "Text:" #~ msgstr "Tekst:" #~ msgid "\tTx digits string" #~ msgstr "\tTx cyfrowy ciąg DTMF" #~ msgid "Freq Analysis" #~ msgstr "Analiza częstotliwości" #~ msgid "flmsg specific" #~ msgstr "flmsg specyficzny" #~ msgid "Autostart flmsg upon detection of compatible file" #~ msgstr "Autostart flmsg po wykryciu zgodnego pliku" #~ msgid "Autostart flmsg / browser upon detection of compatible file" #~ msgstr "Autostart flmsg / browser po wykryciu zgodnego pliku" #~ msgid "Auto Extract files from rx stream" #~ msgstr "Wyodrębnia pliki auto z strumienia Rx" #~ msgid "" #~ "0\n" #~ "1\n" #~ "2" #~ msgstr "" #~ "0\n" #~ "1\n" #~ "2" #~ msgid "Auto open wrap folder" #~ msgstr "Auto Otwórz folder Wrap" #~ msgid "Search for reg-exp in browser text(s)" #~ msgstr "Szukaj reg - exp w tekście przeglądarki (S)" #, fuzzy #~ msgid "Width (% of panel)" #~ msgstr "Szerokość ( % z panelu)" #, fuzzy #~ msgid "Adjust viewer width as % of panel width" #~ msgstr "Dopasuj szerokość przeglądarki jako procent szerokości panelu" #, fuzzy #~ msgid "1 bar" #~ msgstr "1 Bar" #, fuzzy #~ msgid "2-A" #~ msgstr "2-A" #, fuzzy #~ msgid "2-B" #~ msgstr "2-B" #, fuzzy #~ msgid "2-C" #~ msgstr "2-C" fldigi-4.2.05/po/nl.po0000664000175000017500000105440514611714004011361 00000000000000# Dutch translations for fldigi package # Copyright (C) 2014 Dave Freese, Stelios Bounanos, Leigh Klotz, and others # This file is distributed under the same license as the fldigi package. # Peter van der Post , 2014. # msgid "" msgstr "" "Project-Id-Version: fldigi 3.22.01\n" "Report-Msgid-Bugs-To: w1hkj AT w1hkj DOT com\n" "POT-Creation-Date: 2024-04-23 06:14-0500\n" "PO-Revision-Date: 2020-01-10 14:27+0100\n" "Last-Translator: Peter van der Post\n" "Language-Team: Dutch\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.2.4\n" #: src/main.cxx:1052 #, c-format msgid "%s log started on %s" msgstr "%s log gestart op %s" #: src/main.cxx:1779 msgid "Bad modem id" msgstr "Ongeldig modem ID" #: src/main.cxx:1786 msgid "Bad frequency" msgstr "Ongeldige frequentie" #: src/main.cxx:1909 msgid "" "License GPLv3+: GNU GPL version 3 or later \n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "License GPLv3+: GNU GPL versie 3 of nieuwer \n" "Dit is gratis software. Het staat je vrij om het te wijzigen en te " "verspreiden.\n" "Er is GEEN GARANTIE op deze software.\n" #: src/main.cxx:2136 src/main.cxx:2178 src/main.cxx:2202 src/main.cxx:2216 msgid "Could not make directory " msgstr "Kon map niet aanmaken " #: src/debug/debug.cxx:88 msgid "Quiet" msgstr "Quiet" #: src/debug/debug.cxx:88 msgid "Error" msgstr "Error" #: src/debug/debug.cxx:88 msgid "Warning" msgstr "Warning" #: src/debug/debug.cxx:88 msgid "Info" msgstr "Info" #: src/debug/debug.cxx:88 msgid "Verbose" msgstr "Verbose" #: src/debug/debug.cxx:88 src/dialogs/confdialog.cxx:15244 msgid "Debug" msgstr "Debug" #: src/dialogs/fl_digi.cxx:202 msgid "Log all RX/TX text" msgstr "Log alle RX/TX tekst" #: src/dialogs/fl_digi.cxx:204 src/dialogs/fl_digi.cxx:7622 msgid "Op &Mode" msgstr "&Mode" #: src/dialogs/fl_digi.cxx:205 msgid "Show fewer modes" msgstr "Toon minder modes" #: src/dialogs/fl_digi.cxx:206 msgid "Show all modes" msgstr "Toon alle modes" #: src/dialogs/fl_digi.cxx:210 msgid "&View" msgstr "B&eeld" #: src/dialogs/fl_digi.cxx:211 msgid "MFSK Image" msgstr "&MFSK Beeld" #: src/dialogs/fl_digi.cxx:212 msgid "THOR Raw Image" msgstr "THOR Onbewerkt Beeld" #: src/dialogs/fl_digi.cxx:213 msgid "IFKP Raw Image" msgstr "&MFSK Beeld" #: src/dialogs/fl_digi.cxx:214 msgid "Weather Fax Image TX" msgstr "&Weerfax-afbeelding TX" #: src/dialogs/fl_digi.cxx:215 src/dialogs/confdialog.cxx:10746 #: src/logbook/lgbook.cxx:1293 msgid "Contest" msgstr "Contest" #: src/dialogs/fl_digi.cxx:216 msgid "C&ountries" msgstr "&Landen" #: src/dialogs/fl_digi.cxx:217 msgid "&UI" msgstr "&Interface" #: src/dialogs/fl_digi.cxx:218 msgid "Full" msgstr "Alles" #: src/dialogs/fl_digi.cxx:219 msgid "Partial" msgstr "Gedeeltelijk" #: src/dialogs/fl_digi.cxx:220 src/waterfall/waterfall.cxx:2595 #: src/dialogs/confdialog.cxx:9908 src/dialogs/confdialog.cxx:9997 #: src/dialogs/confdialog.cxx:19028 msgid "None" msgstr "Geen" #: src/dialogs/fl_digi.cxx:221 msgid "Docked scope" msgstr "Vaste scope" #: src/dialogs/fl_digi.cxx:222 msgid "Minimal controls" msgstr "Minimaal aantal knoppen" #: src/dialogs/fl_digi.cxx:223 msgid "Show channels" msgstr "Toon kanalen" #: src/dialogs/fl_digi.cxx:225 msgid "Connect to server" msgstr "Verbind met server" #: src/dialogs/fl_digi.cxx:1050 src/dialogs/fl_digi.cxx:1079 #: src/dialogs/fl_digi.cxx:1089 src/dialogs/fl_digi.cxx:5976 #: src/dialogs/fl_digi.cxx:6069 src/dialogs/fl_digi.cxx:6146 #: src/dialogs/fl_digi.cxx:7650 src/dialogs/fl_digi.cxx:7719 #: src/dialogs/fl_digi.cxx:7796 msgid "Custom..." msgstr "Aangepast..." #: src/dialogs/fl_digi.cxx:1147 src/dialogs/confdialog.cxx:369 #: src/dialogs/confdialog.cxx:10673 src/dialogs/confdialog.cxx:10739 msgid "Colors-Fonts" msgstr "Kleuren-Lettertypes" #: src/dialogs/fl_digi.cxx:1148 src/dialogs/confdialog.cxx:370 #: src/dialogs/confdialog.cxx:11067 msgid "Contests" msgstr "Contesten" #: src/dialogs/fl_digi.cxx:1149 src/dialogs/confdialog.cxx:371 #: src/dialogs/confdialog.cxx:11338 msgid "IDs" msgstr "IDs" #: src/dialogs/fl_digi.cxx:1150 src/dialogs/confdialog.cxx:372 #: src/dialogs/confdialog.cxx:11810 src/dialogs/confdialog.cxx:11896 #: src/dialogs/confdialog.cxx:14139 src/dialogs/confdialog.cxx:14240 msgid "Logging" msgstr "Loggen" #: src/dialogs/fl_digi.cxx:1151 msgid "Modem/CW" msgstr "Modem/CW" #: src/dialogs/fl_digi.cxx:1152 msgid "Modem/TTY" msgstr "Modem/TTY" #: src/dialogs/fl_digi.cxx:1153 src/waterfall/waterfall.cxx:2597 #: src/dialogs/confdialog.cxx:373 msgid "Modem" msgstr "Modem" #: src/dialogs/fl_digi.cxx:1154 src/dialogs/confdialog.cxx:374 #: src/dialogs/confdialog.cxx:17169 msgid "Misc" msgstr "Diversen" #: src/dialogs/fl_digi.cxx:1155 src/dialogs/confdialog.cxx:375 #: src/dialogs/confdialog.cxx:18303 src/dialogs/confdialog.cxx:18366 msgid "Rig Control" msgstr "TRX Besturing" #: src/dialogs/fl_digi.cxx:1156 src/dialogs/confdialog.cxx:376 #: src/dialogs/confdialog.cxx:18974 msgid "Soundcard" msgstr "Geluidskaart" #: src/dialogs/fl_digi.cxx:1157 src/dialogs/confdialog.cxx:377 #: src/dialogs/confdialog.cxx:19497 msgid "UI" msgstr "Gebruikersinterface" #: src/dialogs/fl_digi.cxx:1158 src/dialogs/fl_digi.cxx:6238 #: src/dialogs/confdialog.cxx:378 src/dialogs/confdialog.cxx:13939 #: src/dialogs/confdialog.cxx:20045 msgid "Waterfall" msgstr "Waterval" #: src/dialogs/fl_digi.cxx:1159 src/dialogs/confdialog.cxx:379 #: src/dialogs/confdialog.cxx:20245 msgid "Web" msgstr "Web" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4547 msgid "Save changed macros?" msgstr "Gewijzigde macro's opslaan?" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:4134 #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 #: src/logbook/logsupport.cxx:1205 src/misc/configuration.cxx:726 #: src/dialogs/font_browser.cxx:173 src/logbook/lgbook.cxx:837 #: src/logbook/lgbook.cxx:1647 msgid "Cancel" msgstr "Annuleren" #: src/dialogs/fl_digi.cxx:1622 src/dialogs/fl_digi.cxx:6250 #: src/logbook/logsupport.cxx:330 src/logbook/logsupport.cxx:1204 #: src/dialogs/confdialog.cxx:13194 src/dialogs/confdialog.cxx:15191 #: src/dialogs/confdialog.cxx:20248 msgid "Save" msgstr "Bewaren" #: src/dialogs/fl_digi.cxx:1622 msgid "Don't save" msgstr "Niet niet bewaren" #: src/dialogs/fl_digi.cxx:1771 msgid "Switch to ARQ I/O" msgstr "Schakel naar ARQ I/O" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "No" msgstr "Nee" #: src/dialogs/fl_digi.cxx:1771 src/dialogs/fl_digi.cxx:2630 #: src/dialogs/fl_digi.cxx:2952 src/dialogs/fl_digi.cxx:4539 #: src/dialogs/fl_digi.cxx:4547 src/dialogs/fl_digi.cxx:4555 #: src/dialogs/fl_digi.cxx:4571 src/dialogs/fl_digi.cxx:4580 #: src/dialogs/fl_digi.cxx:4593 src/dialogs/fl_digi.cxx:10682 #: src/logbook/logsupport.cxx:359 src/logbook/logsupport.cxx:404 #: src/logbook/logsupport.cxx:1817 src/misc/configuration.cxx:728 msgid "Yes" msgstr "Ja" #: src/dialogs/fl_digi.cxx:2630 msgid "Playback continuous loop?" msgstr "Continu afspelen in een lus?" #: src/dialogs/fl_digi.cxx:2635 #, fuzzy msgid "Unsupported audio format" msgstr "Formaat niet ondersteund" #: src/dialogs/fl_digi.cxx:2642 msgid "Spotting disabled" msgstr "Spotting uitgeschakeld" #: src/dialogs/fl_digi.cxx:2694 #, c-format msgid "" "Could not run a web browser:\n" "%s\n" "\n" "Open this URL manually:\n" "%s" msgstr "" "Kan geen webbrowser starten:\n" "%s\n" "\n" "Open dit URL handmatig:\n" "%s" #: src/dialogs/fl_digi.cxx:2707 #, c-format msgid "" "Could not open url:\n" "%s\n" msgstr "" "Kon URL niet openen:\n" "%s\n" #: src/dialogs/fl_digi.cxx:2790 msgid "Checking for updates..." msgstr "Controleren op updates..." #: src/dialogs/fl_digi.cxx:2794 msgid "Update site not available" msgstr "Update site niet beschikbaar" #: src/dialogs/fl_digi.cxx:2806 msgid "You are running the latest version" msgstr "U gebruikt de nieuwste versie" #: src/dialogs/fl_digi.cxx:2810 msgid "You are probably running an alpha version " msgstr "U gebruikt waarschijnlijk een alpha-versie " #: src/dialogs/fl_digi.cxx:2811 msgid "" "\n" "Posted version: " msgstr "" "\n" "Meest recente versie: " #: src/dialogs/fl_digi.cxx:2816 #, c-format msgid "Version %s is available at Source Forge" msgstr "Versie %s is beschikbaar bij Source Forge" #: src/dialogs/fl_digi.cxx:2885 msgid "Sunspot creation underway!" msgstr "Sunspot creation underway!" #: src/dialogs/fl_digi.cxx:2892 msgid "Audio device information is only available for the PortAudio backend" msgstr "" "Informatie over de geluidskaart is alleen beschikbaar voor de PortAudio " "component" #: src/dialogs/fl_digi.cxx:2901 msgid "Capture device" msgstr "Opname-apparaat" #: src/dialogs/fl_digi.cxx:2902 msgid "Playback device" msgstr "Afspeelapparaat" #: src/dialogs/fl_digi.cxx:2906 msgid "Capture and playback devices" msgstr "Opname- en afspeelapparaten" #: src/dialogs/fl_digi.cxx:2952 #, c-format msgid "%s: Do not exist, create?" msgstr "%s: Bestaan niet, maken?" #: src/dialogs/fl_digi.cxx:4134 msgid "Clear log fields?" msgstr "Logvelden leeg maken?" #: src/dialogs/fl_digi.cxx:4134 src/misc/configuration.cxx:726 #: src/logbook/lgbook.cxx:834 src/logbook/lgbook.cxx:1644 msgid "OK" msgstr "OK" #: src/dialogs/fl_digi.cxx:4193 src/dialogs/fl_digi.cxx:6615 msgid "Confirm" msgstr "Bevestig" #: src/dialogs/fl_digi.cxx:4539 msgid "Save changed configuration?" msgstr "Configuratiewijzigingen opslaan?" #: src/dialogs/fl_digi.cxx:4555 src/dialogs/fl_digi.cxx:4580 msgid "Save log entry?" msgstr "Log-invoer opslaan?" #: src/dialogs/fl_digi.cxx:4571 msgid "Confirm Quit" msgstr "Applicatie afsluiten" #: src/dialogs/fl_digi.cxx:4593 msgid "Confirm quit?" msgstr "Afsluiten bevestigen?" #: src/dialogs/fl_digi.cxx:5915 src/dialogs/fl_digi.cxx:7618 msgid "&File" msgstr "&Bestand" #: src/dialogs/fl_digi.cxx:5917 msgid "Folders" msgstr "Mappen" #: src/dialogs/fl_digi.cxx:5918 msgid "Fldigi config..." msgstr "Fldigi instellingen..." #: src/dialogs/fl_digi.cxx:5919 msgid "FLMSG files..." msgstr "FLMSG bestanden..." #: src/dialogs/fl_digi.cxx:5920 msgid "NBEMS files..." msgstr "NBEMS bestanden..." #: src/dialogs/fl_digi.cxx:5921 #, fuzzy msgid "WEFAX images..." msgstr "Afbeelding versturen..." #: src/dialogs/fl_digi.cxx:5922 msgid "Data files..." msgstr "Databestanden..." #: src/dialogs/fl_digi.cxx:5925 msgid "Macros" msgstr "Macro's" #: src/dialogs/fl_digi.cxx:5926 msgid "Open ..." msgstr "Open ..." #: src/dialogs/fl_digi.cxx:5927 #, fuzzy msgid "Save ..." msgstr "Opslaan ..." #: src/dialogs/fl_digi.cxx:5930 msgid "Config Scripts" msgstr "Configuratie Scripts" #: src/dialogs/fl_digi.cxx:5931 msgid "Execute" msgstr "Uitvoeren" #: src/dialogs/fl_digi.cxx:5932 msgid "Generate" msgstr "Genereer" #: src/dialogs/fl_digi.cxx:5935 msgid "Text Capture" msgstr "Tekst opslaan" #: src/dialogs/fl_digi.cxx:5939 msgid "Audio" msgstr "Audio" #: src/dialogs/fl_digi.cxx:5940 msgid "RX capture" msgstr "RX opslaan" #: src/dialogs/fl_digi.cxx:5941 msgid "TX generate" msgstr "TX genereren" #: src/dialogs/fl_digi.cxx:5942 src/dialogs/confdialog.cxx:18737 msgid "Playback" msgstr "Afspelen" #: src/dialogs/fl_digi.cxx:5945 src/dialogs/fl_digi.cxx:7619 msgid "Exit" msgstr "Afsluiten" #: src/dialogs/fl_digi.cxx:6203 src/dialogs/fl_digi.cxx:7832 msgid "&Configure" msgstr "&Instellingen" #: src/dialogs/fl_digi.cxx:6205 src/dialogs/fl_digi.cxx:7833 msgid "Config Dialog" msgstr "Configuratiescherm" #: src/dialogs/fl_digi.cxx:6206 src/dialogs/fl_digi.cxx:7836 msgid "Save Config" msgstr "Instellingen opslaan" #: src/dialogs/fl_digi.cxx:6207 src/dialogs/fl_digi.cxx:7835 #: src/dialogs/notifydialog.cxx:104 msgid "Notifications" msgstr "Notificaties" #: src/dialogs/fl_digi.cxx:6208 src/dialogs/fl_digi.cxx:7834 msgid "Test Signals" msgstr "Testsignalen" #: src/dialogs/fl_digi.cxx:6213 src/dialogs/fl_digi.cxx:7840 msgid "Rx Audio Dialog" msgstr "Rx Audio Scherm" #: src/dialogs/fl_digi.cxx:6215 msgid "View/Hide Channels" msgstr "Kanalen tonen/verbergen" #: src/dialogs/fl_digi.cxx:6216 msgid "Signal browser" msgstr "Signaalverkenner" #: src/dialogs/fl_digi.cxx:6218 msgid "View/Hide 48 macros" msgstr "Tonen/verbergen 48 macro’s" #: src/dialogs/fl_digi.cxx:6220 msgid "DX Cluster" msgstr "DX Cluster" #: src/dialogs/fl_digi.cxx:6222 src/dialogs/fl_digi.cxx:7843 msgid "Floating scope" msgstr "Oscilloscoop" #: src/dialogs/fl_digi.cxx:6223 src/dialogs/fl_digi.cxx:7842 msgid "Spectrum scope" msgstr "Spectrum" #: src/dialogs/fl_digi.cxx:6232 msgid "Rig/Log Controls" msgstr "TRX/Log Besturing" #: src/dialogs/fl_digi.cxx:6245 msgid "&Logbook" msgstr "&Logboek" #: src/dialogs/fl_digi.cxx:6246 msgid "View" msgstr "Toon" #: src/dialogs/fl_digi.cxx:6248 msgid "Files" msgstr "&Bestand" #: src/dialogs/fl_digi.cxx:6249 src/dialogs/confdialog.cxx:17449 msgid "Open..." msgstr "Openen..." #: src/dialogs/fl_digi.cxx:6251 src/logbook/logsupport.cxx:1213 #: src/logbook/lgbook.cxx:1567 msgid "New" msgstr "Nieuw" #: src/dialogs/fl_digi.cxx:6254 msgid "ADIF" msgstr "ADIF" #: src/dialogs/fl_digi.cxx:6255 msgid "Merge..." msgstr "Samenvoegen..." #: src/dialogs/fl_digi.cxx:6256 msgid "Export..." msgstr "Exporteren..." #: src/dialogs/fl_digi.cxx:6259 src/logbook/lgbook.cxx:831 msgid "LoTW" msgstr "LoTW" #: src/dialogs/fl_digi.cxx:6261 msgid "Reports" msgstr "Rapporten" #: src/dialogs/fl_digi.cxx:6262 msgid "Text..." msgstr "Tekst..." #: src/dialogs/fl_digi.cxx:6263 msgid "CSV..." msgstr "CSV..." #: src/dialogs/fl_digi.cxx:6264 msgid "Cabrillo..." msgstr "Cabrillo..." #: src/dialogs/fl_digi.cxx:6269 msgid "Field Day Logging" msgstr "Velddag logging" #: src/dialogs/fl_digi.cxx:6274 src/dialogs/fl_digi.cxx:7852 msgid "&Help" msgstr "&Help" #: src/dialogs/fl_digi.cxx:6277 msgid "Create sunspots" msgstr "Create sunspots" #: src/dialogs/fl_digi.cxx:6279 msgid "Beginners' Guide" msgstr "Beginnersgids (Engels)" #: src/dialogs/fl_digi.cxx:6280 src/dialogs/fl_digi.cxx:7853 msgid "Online documentation..." msgstr "Online documentatie... (Engels)" #: src/dialogs/fl_digi.cxx:6281 msgid "Fldigi web site..." msgstr "Fldigi web site..." #: src/dialogs/fl_digi.cxx:6282 msgid "Reception reports..." msgstr "Ontvangstrapporten..." #: src/dialogs/fl_digi.cxx:6283 msgid "Command line options" msgstr "Command line opties" #: src/dialogs/fl_digi.cxx:6284 msgid "Audio device info" msgstr "Informatie geluidskaart" #: src/dialogs/fl_digi.cxx:6285 msgid "Build info" msgstr "Build info (Engels)" #: src/dialogs/fl_digi.cxx:6286 src/dialogs/fl_digi.cxx:7854 msgid "Event log" msgstr "Logboek" #: src/dialogs/fl_digi.cxx:6287 src/dialogs/fl_digi.cxx:7855 msgid "Check for updates..." msgstr "Controleer op updates..." #: src/dialogs/fl_digi.cxx:6288 src/dialogs/fl_digi.cxx:7856 msgid "&About" msgstr "&Over" #: src/dialogs/fl_digi.cxx:6539 msgid "waterfall-only mode" msgstr "alleen-waterval modus" #: src/dialogs/fl_digi.cxx:6541 msgid "NO CALLSIGN SET" msgstr "GEEN ROEPNAAM INGESTELD" #: src/dialogs/fl_digi.cxx:6566 msgid "Close List" msgstr "Sluit lijst" #: src/dialogs/fl_digi.cxx:6574 msgid "Open List" msgstr "Open lijst" #: src/dialogs/fl_digi.cxx:6615 msgid "Clear list?" msgstr "Lijst wissen?" #: src/dialogs/fl_digi.cxx:6699 msgid "report" msgstr "rapport" #: src/dialogs/fl_digi.cxx:6699 msgid "reports" msgstr "rapporten" #: src/dialogs/fl_digi.cxx:6704 #, fuzzy msgid "Recent activity for grid " msgstr "Recente activiteit voor grid" #: src/dialogs/fl_digi.cxx:7841 src/dialogs/Viewer.cxx:283 msgid "Signal Browser" msgstr "Signaalverkenner" #: src/dialogs/fl_digi.cxx:8143 msgid "Scope" msgstr "Oscilloscoop" #: src/dialogs/fl_digi.cxx:8234 msgid "Detected signal level" msgstr "Gedetecteerd signaalniveau" #: src/dialogs/fl_digi.cxx:8246 src/waterfall/waterfall.cxx:2596 msgid "Squelch level" msgstr "Squelch-niveau" #: src/dialogs/fl_digi.cxx:8262 msgid "" "Left click: change mode\n" "Right click: configure" msgstr "" "Klik links: wijzig mode\n" "Klik rechts: instellen" #: src/dialogs/fl_digi.cxx:8271 msgid "CW transmit WPM" msgstr "CW zenden WPM" #: src/dialogs/fl_digi.cxx:8280 msgid "Default WPM" msgstr "Standaard WPM" #: src/dialogs/fl_digi.cxx:8310 #, fuzzy msgid "Left click to toggle VuMeter" msgstr "Klik links om de kleur voor duplicaten te kiezen" #: src/dialogs/fl_digi.cxx:8316 #, fuzzy msgid "Left click to toggle Status Bar" msgstr "Klik links om de kleur voor duplicaten te kiezen" #: src/dialogs/fl_digi.cxx:8328 msgid "Tx level attenuator (dB)" msgstr "Tx niveau verzwakker (dB)" #: src/dialogs/fl_digi.cxx:8356 msgid "Automatic Frequency Control" msgstr "Automatic Frequency Control" #: src/dialogs/fl_digi.cxx:8361 msgid "Squelch" msgstr "Squelch" #: src/dialogs/fl_digi.cxx:8366 msgid "Power Signal Monitor" msgstr "Power Signal Monitor" #: src/dialogs/fl_digi.cxx:10682 msgid "Delete entry?" msgstr "Invoer verwijderen?" #: src/dialogs/fl_digi.cxx:10682 src/spot/notify.cxx:222 #: src/spot/notify.cxx:228 msgid "All" msgstr "Alles" #: src/dialogs/Viewer.cxx:287 msgid "Find: " msgstr "Zoek: " #: src/dialogs/Viewer.cxx:308 src/logbook/logsupport.cxx:324 #: src/logbook/logsupport.cxx:1063 src/misc/macroedit.cxx:504 #: src/mfsk/mfsk-pic.cxx:338 src/spot/notify.cxx:535 src/spot/notify.cxx:539 #: src/dialogs/confdialog.cxx:20251 msgid "Close" msgstr "Sluiten" #: src/dialogs/Viewer.cxx:316 src/logbook/logsupport.cxx:327 #: src/widgets/FTextView.cxx:483 src/widgets/FTextView.cxx:650 #: src/widgets/flinput2.cxx:48 src/dialogs/confdialog.cxx:13484 #: src/dialogs/confdialog.cxx:14633 msgid "Clear" msgstr "Wis" #: src/dialogs/Viewer.cxx:320 msgid "" "Left click to clear text\n" "Right click to reset frequencies" msgstr "" "Klik links om tekst te wissen\n" "Klik rechts voor begininstelling frequenties" #: src/dialogs/Viewer.cxx:326 msgid "Set Viewer Squelch" msgstr "Stel squelch in voor Viewer" #: src/logbook/logsupport.cxx:160 msgid "Export to CSV file" msgstr "Exporteer naar CSV bestand" #: src/logbook/logsupport.cxx:187 msgid "Export to fixed field text file" msgstr "Exporteer naar tekstbestand met vaste veldgrootte" #: src/logbook/logsupport.cxx:215 msgid "Export to ADIF file" msgstr "Exporteer naar ADIF bestand" #: src/logbook/logsupport.cxx:317 msgid "LoTW Review" msgstr "LoTW Review" #: src/logbook/logsupport.cxx:359 msgid "Save changed Logbook?" msgstr "Gewijzigd logboek opslaan?" #: src/logbook/logsupport.cxx:380 msgid "Create new logbook file" msgstr "Nieuw logboek aanmaken" #: src/logbook/logsupport.cxx:403 #, c-format msgid "%s exists, overwrite?" msgstr "%s bestaat al, overschrijven?" #: src/logbook/logsupport.cxx:439 msgid "Open logbook file" msgstr "Open logboekbestand" #: src/logbook/logsupport.cxx:472 msgid "Save logbook file" msgstr "Logboekbestand opslaan" #: src/logbook/logsupport.cxx:933 msgid "Database merger in progress" msgstr "Database wordt bijgewerkt" #: src/logbook/logsupport.cxx:939 msgid "Merge ADIF file" msgstr "ADIF bestand samenvoegen" #: src/logbook/logsupport.cxx:977 msgid "No records in lotw download file" msgstr "Geen records gevonden in LoTW bestand" #: src/logbook/logsupport.cxx:1057 msgid "Unmatched LoTW Records" msgstr "Niet overeenkomende LoTW records" #: src/logbook/logsupport.cxx:1092 msgid "" "Could not find LoTW report file.\n" "\n" "Download from ARRL's LoTW page after logging in at:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Store the report file to the fldigi LOTW folder,\n" "\n" "naming the file 'lotwreport.adi'" msgstr "" "Kan LoTW rapportbestand niet vinden.\n" "\n" "Download vanaf de ARRL LoTW pagina na inloggen via:\n" "\n" "https://lotw.arrl.org/lotwuser/default\n" "\n" "Sla het rapportbestand op in de fldigi LOTW map,\n" "\n" "en wijzig de naam in ‘lotwreport.adi’." #: src/logbook/logsupport.cxx:1214 src/spot/notify.cxx:206 #: src/spot/notify.cxx:533 src/dialogs/record_browse.cxx:47 #: src/logbook/lgbook.cxx:1574 msgid "Update" msgstr "Bijwerken" #: src/logbook/logsupport.cxx:1816 #, c-format msgid "Really delete record for \"%s\"?" msgstr "Registratie voor \"%s\" echt verwijderen?" #: src/logbook/logsupport.cxx:2330 msgid "Create cabrillo report" msgstr "Cabrillo rapport maken" #: src/logbook/logsupport.cxx:2570 msgid "LoTW download file" msgstr "LoTW download bestand" #: src/logger/rx_extract.cxx:55 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" msgstr "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " NBEMS.files\\WRAP\\recv\\extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:60 msgid "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" msgstr "" "Detect the occurance of [WRAP:beg] and [WRAP:end]\n" "Save tags and all enclosed text to date-time stamped file, ie:\n" " ~/.nbems/WRAP/recv/extract-20090127-092515.wrap" #: src/logger/rx_extract.cxx:286 src/logger/rx_extract.cxx:316 msgid "Could not start flmsg" msgstr "Kon flmsg niet starten" #: src/logger/rx_extract.cxx:414 src/logger/rx_extract.cxx:418 #: src/dialogs/confdialog.cxx:16379 msgid "Locate flmsg executable" msgstr "Bepaal locatie flmsg executable" #: src/logger/rx_extract.cxx:414 msgid "flmsg.exe\t*.exe" msgstr "flmsg.exe\t*.exe" #: src/logger/rx_extract.cxx:418 msgid "flmsg\t*" msgstr "flmsg\t*" #: src/logger/rx_extract.cxx:492 msgid "Locate executable" msgstr "Bepaal locatie Flmsg executable" #: src/logger/rx_extract.cxx:492 msgid "*.exe" msgstr "*.exe" #: src/logger/rx_extract.cxx:495 msgid "Locate binary" msgstr "Locatie 'Flmsg'" #: src/logger/rx_extract.cxx:495 msgid "*" msgstr "*" #: src/logger/speak.cxx:40 msgid "" "Save all received text, one character at a time to the following file:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" msgstr "" "Alle ontvangen tekst opslaan, één karakter tegelijk, naar het bestand:\n" "\n" " fldigi.files\\talk\\textout.txt (Windows)\n" " ~/.fldigi/talk/textout.txt (Linux, OS X, Free BSD)" #: src/misc/configuration.cxx:539 msgid "Rig mode" msgstr "TRX mode" #: src/misc/configuration.cxx:540 msgid "Always LSB" msgstr "Altijd LSB" #: src/misc/configuration.cxx:541 msgid "Always USB" msgstr "Altijd USB" #: src/misc/configuration.cxx:549 src/dialogs/confdialog.cxx:17915 #: src/dialogs/confdialog.cxx:18183 src/dialogs/confdialog.cxx:18185 msgid "Rig Control/Hamlib" msgstr "TRX besturing/Hamlib" #: src/misc/configuration.cxx:723 msgid "" "Reset all options to their default values?\n" "\n" "Reset options will take effect at the next start\n" "Files: fldigi_def.xml and fldigi.prefs will be deleted!\n" msgstr "" "Alle instellingen terugzetten naar de beginwaarden?\n" "\n" "Dit krijgt effect bij de volgende programmastart.\n" "Bestanden fldigi_def.xml en fldigi.prefs zullen worden verwijderd.\n" #: src/misc/configuration.cxx:728 msgid "Confirm RESET" msgstr "Bevestig RESET" #: src/misc/macroedit.cxx:68 msgid "\tmy frequency" msgstr "\tmijn frequentie" #: src/misc/macroedit.cxx:69 msgid "\tmode" msgstr "\tmode" #: src/misc/macroedit.cxx:70 msgid "\tmy call" msgstr "\tmijn roepnaam" #: src/misc/macroedit.cxx:71 msgid "\tmy locator" msgstr "\tmijn locator" #: src/misc/macroedit.cxx:72 msgid "\tmy name" msgstr "\tmijn naam" #: src/misc/macroedit.cxx:73 #, fuzzy #| msgid "\tmy QTH" msgid "\tmy QTH (city)" msgstr "\tmijn QTH" #: src/misc/macroedit.cxx:74 msgid "\tmy RST" msgstr "\tmijn RST" #: src/misc/macroedit.cxx:75 msgid "\tmy FD class" msgstr "\tmijn velddag klasse" #: src/misc/macroedit.cxx:76 msgid "\tmy FD section" msgstr "\tmijn velddag sectie" #: src/misc/macroedit.cxx:77 msgid "\tmy state" msgstr "\tmijn staat" #: src/misc/macroedit.cxx:78 msgid "\tmy ST" msgstr "\tmijn straat" #: src/misc/macroedit.cxx:79 msgid "\tmy county" msgstr "\tmijn county" #: src/misc/macroedit.cxx:80 msgid "\tmy CNTY" msgstr "\tmijn QTH" #: src/misc/macroedit.cxx:81 msgid "\tmy antenna" msgstr "\tmijn antenne" #: src/misc/macroedit.cxx:82 msgid "\toperating band" msgstr "\texchange end" #: src/misc/macroedit.cxx:83 #, fuzzy #| msgid "\ttransmit" msgid "\ttransmit power" msgstr "\tzenden" #: src/misc/macroedit.cxx:84 msgid "\tFldigi version" msgstr "\tFldigi versie" #: src/misc/macroedit.cxx:85 msgid "\tdigital mode (adif)" msgstr "\tdigitale mode (ADIF)" #: src/misc/macroedit.cxx:88 msgid "\tother call" msgstr "\troepnaam tegenstation" #: src/misc/macroedit.cxx:89 msgid "\tother name" msgstr "\tnaam tegenstation" #: src/misc/macroedit.cxx:90 msgid "\tother QTH" msgstr "\tQTH tegenstation" #: src/misc/macroedit.cxx:91 msgid "\tother State" msgstr "\tstaat tegenstation" #: src/misc/macroedit.cxx:92 msgid "\tother Province" msgstr "\tprovincie tegenstation" #: src/misc/macroedit.cxx:93 msgid "\tother locator" msgstr "\tlocator tegenstation" #: src/misc/macroedit.cxx:94 msgid "\tother RST" msgstr "\tRST tegenstation" #: src/misc/macroedit.cxx:97 msgid "\tS/N etc." msgstr "\tS/N etc." #: src/misc/macroedit.cxx:98 msgid "\tIMD etc." msgstr "\tIMD etc." #: src/misc/macroedit.cxx:101 msgid "\t# QSO recs" msgstr "\t# QSO recs" #: src/misc/macroedit.cxx:102 msgid "\tnext QSO rec #" msgstr "\tVolgend QSO rec #" #: src/misc/macroedit.cxx:105 msgid "\tmap on google" msgstr "\ttoon kaart op Google" #: src/misc/macroedit.cxx:106 msgid "\tmap by value" msgstr "\ttoon kaart op basis van coördinaten" #: src/misc/macroedit.cxx:109 msgid "\tclear RX pane" msgstr "\twis RX scherm" #: src/misc/macroedit.cxx:110 msgid "\tclear TX pane" msgstr "\twis TX scherm" #: src/misc/macroedit.cxx:111 #, fuzzy msgid "\tclear QSO fields" msgstr "\twis logvelden" #: src/misc/macroedit.cxx:114 msgid "\ttext to NAME/QTH" msgstr "\ttekst naar NAME/QTH" #: src/misc/macroedit.cxx:118 msgid "\tDigitalk On, Off, Toggle" msgstr "\tDigitalk aan (on), uit (off), wissel (toggle)" #: src/misc/macroedit.cxx:122 msgid "\tclear log fields" msgstr "\twis logvelden" #: src/misc/macroedit.cxx:123 msgid "\tsave QSO data" msgstr "\tbewaar QSO gegevens" #: src/misc/macroedit.cxx:124 msgid "\tsaveQSO data, append msg to notes" msgstr "\tBewaar QSO gegevens, voeg bericht toe aan notities" #: src/misc/macroedit.cxx:125 msgid "\tlog at xmt time" msgstr "\tlog tijdens zenden" #: src/misc/macroedit.cxx:126 msgid "\tsaveQSO data, append msg to notes" msgstr "\tBewaar QSO gegevens, voeg bericht toe aan notities" #: src/misc/macroedit.cxx:127 msgid "\tlog eQSL" msgstr "\tlog eQSL" #: src/misc/macroedit.cxx:128 msgid "\tlog eQSL optional msg" msgstr "\tlog eQSL optioneel bericht" #: src/misc/macroedit.cxx:131 msgid "\tQSO time (HHMM))" msgstr "\tQSO tijd (UUMM))" #: src/misc/macroedit.cxx:132 msgid "\tLDT default '%Y-%m-%d %H:%M%z'" msgstr "\tLDT default ‘%Y-%m-%d %H:%M%z’" #: src/misc/macroedit.cxx:133 #, fuzzy #| msgid "\tLocal datetime, default '%x %H:%M %Z'" msgid "\tLocal datetime, default '%x %H:%M %Z'" msgstr "\tLokale tijd, default ‘%x %H:%M %Z’" #: src/misc/macroedit.cxx:134 msgid "\tZDT default '%Y-%m-%d %H:%MZ'" msgstr "\tZDT default ‘%Y-%m-%d %H:%MZ’" #: src/misc/macroedit.cxx:135 msgid "\tUTC datetime, default '%x %H:%MZ'" msgstr "\tUTC tijd, default ‘%x %H:%MZ’" #: src/misc/macroedit.cxx:136 msgid "\tlocal time, default %H%M" msgstr "\tlokale tijd, default %H%M" #: src/misc/macroedit.cxx:137 msgid "\tzulu time default %H%MZ" msgstr "\tzulu tijd default %H%MZ" #: src/misc/macroedit.cxx:138 msgid "\tlocal date, default '%Y-%M-%D'" msgstr "\tlokale datum, default ‘%Y-%M-%D’" #: src/misc/macroedit.cxx:139 msgid "\tzulu date, default '%Y-%M-%D Z'" msgstr "\tzulu datum, default ‘%Y-%M-%D Z’" #: src/misc/macroedit.cxx:140 msgid "\tget weather data" msgstr "\tweer-informatie ophalen" #: src/misc/macroedit.cxx:141 msgid "\tget weather data for station" msgstr "\tweer-informatie ophalen van specifiek METAR station" #: src/misc/macroedit.cxx:144 msgid "\tcontest counter" msgstr "\tcontest-teller" #: src/misc/macroedit.cxx:145 msgid "\tdecrement counter" msgstr "\tcontest-teller verlagen" #: src/misc/macroedit.cxx:146 msgid "\tincrement counter" msgstr "\tcontest-teller ophogen" #: src/misc/macroedit.cxx:147 msgid "\texchange in" msgstr "\texchange in" #: src/misc/macroedit.cxx:148 msgid "\texchange out" msgstr "\texchange out" #: src/misc/macroedit.cxx:149 msgid "\texchange begin" msgstr "\texchange begin" #: src/misc/macroedit.cxx:150 msgid "\texchange end" msgstr "\texchange end" #: src/misc/macroedit.cxx:151 msgid "\tsave contest out" msgstr "\tbewaar contest uit" #: src/misc/macroedit.cxx:152 msgid "\tcurrent contest serno" msgstr "\thuidige contest volgnummer" #: src/misc/macroedit.cxx:153 msgid "\tlast serno sent" msgstr "\tlaatst verstuurde volgnummer" #: src/misc/macroedit.cxx:154 msgid "\tFD class" msgstr "\tFD klasse" #: src/misc/macroedit.cxx:155 msgid "\tFD section" msgstr "\tFD sectie" #: src/misc/macroedit.cxx:156 msgid "\tcontest class" msgstr "\tcontest klasse" #: src/misc/macroedit.cxx:157 msgid "
\tARRL section" msgstr "
\tARRL sectie" #: src/misc/macroedit.cxx:160 msgid "\treceive" msgstr "\tontvangen" #: src/misc/macroedit.cxx:161 msgid "\ttransmit" msgstr "\tzenden" #: src/misc/macroedit.cxx:162 msgid "\ttoggle T/R" msgstr "\twissel zenden/ontvangen" #: src/misc/macroedit.cxx:163 msgid "\tsearch UP for signal" msgstr "\tzoek VERDER naar signaal" #: src/misc/macroedit.cxx:164 msgid "\tsearch DOWN for signal" msgstr "\tzoek TERUG naar signaal" #: src/misc/macroedit.cxx:165 msgid "\treturn to sweet spot" msgstr "\tkeer terug naar 'sweet spot' (meest gunstige frequentie)" #: src/misc/macroedit.cxx:166 msgid "\tmove to freq NNNN Hz" msgstr "\tga naar frequentie NNNN Hz" #: src/misc/macroedit.cxx:167 msgid "\tleft-clk QSY button" msgstr "\tklik links op QSY knop" #: src/misc/macroedit.cxx:168 msgid "\tright-clk QSY button" msgstr "\tklik rechts op QSY knop" #: src/misc/macroedit.cxx:169 msgid "\tqsy to kHz, Hz" msgstr "\tQSY naar kHz, Hz" #: src/misc/macroedit.cxx:170 msgid "\tincr/decr xcvr freq" msgstr "\tomhoog/omlaag TRX frequentie" #: src/misc/macroedit.cxx:171 msgid "\tvalid xcvr mode" msgstr "\tschakel TRX naar mode" #: src/misc/macroedit.cxx:172 msgid "\tvalid xcvr filter width" msgstr "\tstel TRX filter in" #: src/misc/macroedit.cxx:173 msgid "\tvalid xcvr low cutoff filter" msgstr "\tvalid xcvr low cutoff filter" #: src/misc/macroedit.cxx:174 msgid "\tvalid xcvr hi cutoff filter" msgstr "\tvalid xcvr hi cutoff filter" #: src/misc/macroedit.cxx:175 msgid "\trig freq has kbd focus" msgstr "\tTRX frequentie heeft toetsenbordfocus" #: src/misc/macroedit.cxx:178 msgid "\tinsert QRG into Rx text" msgstr "\tQRG invoegen in RX tekst" #: src/misc/macroedit.cxx:181 msgid "\tinsert text file" msgstr "\ttekstbestand invoegen" #: src/misc/macroedit.cxx:182 msgid "\tinsert image file" msgstr "\tafbeelding invoegen" #: src/misc/macroedit.cxx:183 msgid "\tsend avatar" msgstr "\tverstuur avatar" #: src/misc/macroedit.cxx:186 msgid "\tpause transmit" msgstr "\tpauzeer uitzending" #: src/misc/macroedit.cxx:187 msgid "\tidle signal for NN.nn sec" msgstr "\t'idle' signaal gedurende NN,nn seconden" #: src/misc/macroedit.cxx:188 msgid "\trepeat every NN sec" msgstr "\therhaal elke NN seconden" #: src/misc/macroedit.cxx:189 #, fuzzy msgid "\trepeat after waiting NN sec" msgstr "\therhaal elke NN seconden" #: src/misc/macroedit.cxx:190 msgid "\ttune signal for NN sec" msgstr "\t'tune' signaal gedurende NN seconden" #: src/misc/macroedit.cxx:191 msgid "\tdelay xmt for NN.n sec" msgstr "\twacht met verzenden voor NN.n seconden" #: src/misc/macroedit.cxx:192 msgid "\trepeat macro continuously" msgstr "\therhaal macro doorlopend" #: src/misc/macroedit.cxx:193 msgid "\tschedule execution for" msgstr "\tvoer uit op" #: src/misc/macroedit.cxx:194 msgid "\tend execution at" msgstr "\tbeëindig op" #: src/misc/macroedit.cxx:195 #, fuzzy msgid "\tuse local date/time" msgstr "\tlokale datum en tijd" #: src/misc/macroedit.cxx:198 msgid "\t set xmt attenuator" msgstr "\tTX verzwakker instellen" #: src/misc/macroedit.cxx:201 msgid "\tCW identifier" msgstr "\tzend CW id" #: src/misc/macroedit.cxx:202 msgid "\tsend mode ID; TX start only" msgstr "\tverstuur mode ID; alleen begin uitzending" #: src/misc/macroedit.cxx:203 msgid "\ttext at start of TX" msgstr "\ttekst bij begin uitzending" #: src/misc/macroedit.cxx:204 #, fuzzy #| msgid "\tvideo text in TX stream" msgstr "